diff --git a/Binary/win32/Data/font_ansi.bin b/Binary/win32/Data/font_ansi.bin new file mode 100644 index 0000000000..33b20041cc Binary files /dev/null and b/Binary/win32/Data/font_ansi.bin differ diff --git a/Binary/win32/Data/font_sjis.bin b/Binary/win32/Data/font_sjis.bin new file mode 100644 index 0000000000..c8d25fdcd0 Binary files /dev/null and b/Binary/win32/Data/font_sjis.bin differ diff --git a/Binary/win32/Patches/GMSE01.ini b/Binary/win32/Patches/GMSE01.ini new file mode 100644 index 0000000000..4cece7a9c8 --- /dev/null +++ b/Binary/win32/Patches/GMSE01.ini @@ -0,0 +1,155 @@ +[OnFrame] + +[ActionReplay] +All Shines +00E60AE1 18000000 +045708E8 FFFFFFFF +045708EC FFFFFFFF +045708F0 FFFFFFFF + +Open all levels and nozzles +00E60AE0 18000000 +04570958 FFFFFFFF +0457095C FFFFFFFF + +8 red coins(press L & B) +00E61642 18000000 +0A3FBBF4 00000240 +025709DE 00000008 + +Infinite hover time +00E61520 18000000 +042640BC 60000000 + +Infinite water +00E6151F 18000000 +04263F58 38002710 +042635B0 60000000 + +Infinite health +00E60ADF 18000000 +424057F4 00040009 + ++99 lives +00E60ADE 18000000 +00570967 00000063 + ++Test Level +00B86425 08000000 +043E9710 00000C01 + ++Low Gravity +00B809F5 08000000 +4240E12C 05003E00 + +Jesus Mode A.K.A. Walk on Water D-Pad Up/Down = On/Off +00B813BC 08000000 +04002F00 3C608041 +04002F04 8063E12C +04002F08 80C3FFCC +04002F0C 2C060000 +04002F10 4D820020 +04002F14 C2660008 +04002F18 EE852824 +04002F1C EE93A02A +04002F20 FC019840 +04002F24 4C800020 +04002F28 FC20A090 +04002F2C 38C00008 +04002F30 90C30248 +04002F34 4E800020 +0A404454 00000008 +04189854 4BE796AC +0A404454 00000004 +04189854 4E800020 + ++Do Not Have To Move Before Triple Jump +00B819B3 08000000 +4240E10C 06B00000 + +Spin Jump Gravity - Really Slow Fall +00B86E48 08000000 +4240E10C 058E3D00 + +Spin Jump Gravity - Almost No Fall +00B8369D 08000000 +4240E10C 058E0000 + +Spin Jump Gravity - Fall Really Fast +00B86350 08000000 +4240E10C 058E4200 + +Spin Jump Gravity - Normal Speed +00B80454 08000000 +4240E10C 058E3EB3 + ++Insane heat waves Crazy colors everywhere! +00B80485 08000000 +043AA070 41200000 + +Double vision heat wave (narrow) +00B856EB 08000000 +043AA070 3F600000 + +Double vision heat wave (wide) +00B85C4A 08000000 +043AA070 3F400000 + +Use only one of following two. Vanish point visual distortion +00B842EC 08000000 +043AB304 3E000000 + +Hard to select file, activators will work if you add them.. Camera is far out +00B82579 08000000 +043AB304 3F000000 + +X textures +00B80A69 08000000 +043DB210 41200000 + + +Y textures +00B80605 08000000 +043DB224 41200000 + + +Z textures +00B86358 08000000 +043DB238 41200000 + + +Strangely distorted people +00B82C96 08000000 +0440CC24 3F900000 + +Mute game +00B87829 08000000 +04417248 00000000 + +Magnify camera +00B87EB7 08000000 +04417690 3F900000 + +Warped camera view +00B851AB 08000000 +044176A8 3E000000 + +Poorly Shaded Mario +00B87DA5 08000000 +044176FC 00000000 + +Nozzle Modifier Press the buttons below to switch to another nozzle. You must have your nozzle set to squirt for it to work. You will never use another nozzle box again!! Just kidding.B+D-Pad Up:Rocket NozzleB+D-Pad Left:Turbo NozzleB+D-Pad Right:Hover NozzleB+D-Pad Down:Jump Nozzle + +00B83682 08000000 +0A404454 00000208 +04269F50 3BE00001 +0A404454 00000204 +04269F50 3BE00002 +0A404454 00000201 +04269F50 3BE00005 +0A404454 00000202 +04269F50 3BE00004 + +Always Green Yoshi +00B80C27 08000000 +405F3A90 04AE4C00 diff --git a/Binary/win32/Patches/GZLE01.ini b/Binary/win32/Patches/GZLE01.ini new file mode 100644 index 0000000000..045345c891 --- /dev/null +++ b/Binary/win32/Patches/GZLE01.ini @@ -0,0 +1,420 @@ +[OnFrame] +0x802904b4=dword:0x4E800020 #Fix item hang + +# WARNING - cheats may screw up your save games +# 0x803C4C09=byte:0x50 #Max health +# 0x803C4C0B=byte:0x50 #Current health + +# Hidden dungeon +# 0x803C9D44=dword:0x000000FF +# 0x803C9D48=dword:0x485F7465 +# 0x803C9D4C=dword:0x73740000 + +# Snow test room +# 0x803C9D44=dword:0x000000FF +# 0x803C9D48=dword:0x49546573 +# 0x803C9D4C=dword:0x74363200 + +#only supports decrypted AR codes + +[ActionReplay] +# Use GCNCrypt to decrypt large chunks of codes found online, and paste here. +# Add a + to the name to activate. +# Codes by GCNHacker87 (yes we forgot to ask permission) ++Master Code (useless) +01E0197D 88000000 +C4323EA8 0000FF00 + +Shadow Link +01E05E82 08000000 +041926B8 60000000 +423BCDA0 00BCFFFF +423BCDA0 00BDFF87 +403BCDA0 00017E3F + +Stuff at the top right of the screen is not visible +01E00EFA 08000000 +903ED848 00000000 +023F633C 00028000 +003F710A 00000080 +003F713A 00000080 +003F715E 00000080 +403BB494 00106A80 +403BB498 002F5080 +00000000 40000000 + +Super Hookshot +01E03C97 08000000 +043F9DFC 48420B00 +040F1E68 28030001 +043F9E00 43008700 +0A3ED84A 00000140 +040F2898 3C000000 +123ED84A 00000140 +040F2898 8001004C + ++Teleport to Fire Mountain up R Y +01E05660 08000000 +4A3ED84A 00000828 +043E440C 482F85A1 +043E4414 C7EA36FD + +Hold A to swim fast +01E0712B 08000000 +0A3ED84A 00000100 +0435D548 44610000 +123ED84A 00000100 +0435D548 41900000 + ++Run/Swim/Crawl fast Hold A +01E06820 08000000 +4A3ED84A 00000100 +0435CEEC 42480000 +0435D548 44610000 +523ED84A 00000100 +0435CEEC 41880000 +0435D548 41900000 +0A3ED84A 00000120 +0435DB94 42800000 +123ED84A 00000120 +0435DB94 40400000 + +(m) +01E0197D 88000000 +C4323EA8 0000FF00 + +Max Health +01E0197E 08000000 +003C4C09 00000050 + +Infinite Health +01E0197F 08000000 +003C4C0B 00000050 + +Full Nintendo Gallery +01E01A3B 08000000 +003C5260 00000001 +023C52AC 0003FFFF +023C52B8 0005FFFF +003C52C8 000000FF +023C52DC 0000FFFF + +Small energy sword +01E058C4 08000000 +0435DF6C 004A004A + +Full energy Sword +01E03B23 08000000 +0435DF6C 004C004C + +HookShot Head/beam sword +01E064B0 08000000 +0435DF6C 004C001E + +Normal/no glow +01E042B7 08000000 +0435DF6C 00460046 + +Jesus Mode aka WalkOnWater +01E071C7 08000000 +04004010 2C070003 +04004014 C01EFFA0 +04004018 4182000C +0400401C C01F008C +04004020 4809EF60 +04004024 FC16A840 +04004028 C2DEFFA4 +0400402C 4182FFF0 +04004030 4809EF54 +04004048 281E5787 +0400404C 4081001C +04004050 FC010040 +04004054 4080000C +04004058 D2BEFFA0 +0400405C 4800000C +04004060 C2DEFF9C +04004064 D03EFFA0 +04004068 EC210028 +0400406C 48138FB8 +043C5E44 04071987 +040A2F7C 4BF61094 +0413D020 4BEC7028 + +Use anything indoors +01E01C68 08000000 +0020485F 0000007E + +Sink or Swim A+D-pad down sink B+D-pad down swim +01E00949 08000000 +0A3ED84A 00000104 +0435D560 50000000 +0A3ED84A 00000204 +0435D560 42B40000 + +Jump to a ledge at any height +01E05CFA 08000000 +0435D734 469C4000 + +Very Fast on Ladders (May have to barly tap forward on joystick inorder to get on vein walls) +01E01534 08000000 +00000000 8435DB18 +41200000 00040002 +0435DB38 7F7FFFFF + +Extra deku leaf controls (Y makes you rise, Z keeps you at your current height, X wind pulls you instead of push, to stop it from rising you must close and reopen the leaf quickly) +01E04637 08000000 +0A3ED84A 00000800 +0435DC90 40700000 +0A3ED84A 00000010 +0435DC90 00000000 +0A3ED84A 00000400 +0435DCA4 C1200000 +4A3ED84A 00000000 +0435DC90 C0000000 +0435DCA4 41166666 + +Roll further +01E05AB9 08000000 +0435D3D0 40000000 + +Instead of rolling, you glide +01E05AAE 08000000 +0435D3CC 45500000 + +#DON'T USE ANY OF THE FOLLOWING CODES UNTIL AFTER MEETING THE DRAGON BOAT +Max Magic +01E01983 08000000 +003C4C1B 00000020 + +Infinite Magic +01E01984 08000000 +003C4C1C 00000020 + +Can Carry 1000 Rupees +01E01985 08000000 +003C4C1A 00000001 + +Can Carry 5000 Rupees +01E01986 08000000 +003C4C1A 00000002 + +Always Have 1000 Rupees +01E01987 08000000 +023C4C0C 000003E8 + +Always Have 5000 Rupees +01E01988 08000000 +023C4C0C 00001388 + +Link Can Swim Forever +01E01989 08000000 +023CA76E 00000384 + +Have All Songs +01E0198A 08000000 +003C4CC5 0000003F + +Have Hero's Sword +01E0198B 08000000 +003C4C16 00000038 +003C4CBC 00000001 + +Have Mirror Shield +01E0198C 08000000 +003C4C17 0000003C +003C4CBD 00000003 + +Have Telescope +01E0198D 08000000 +003C4C44 00000020 + +Have Sail +01E0198E 08000000 +003C4C45 00000078 + +Have Wind Waker +01E0198F 08000000 +003C4C46 00000022 + +Have Grappling Hook +01E01990 08000000 +003C4C47 00000025 + +Have Boomerang +01E01991 08000000 +003C4C49 0000002D + +Have Deku Leaf +01E01992 08000000 +003C4C4A 00000034 + +Have Tingle Tuner +01E01993 08000000 +003C4C4B 00000021 + +Have DX Camera +01E01994 08000000 +003C4C4C 00000026 + +Have Iron Boots +01E01995 08000000 +003C4C4D 00000029 + +Have Magic Shielding +01E01996 08000000 +003C4C4E 0000002A + +Have Bow And All Arrows +01E01997 08000000 +003C4C50 00000036 + +Have Bombs +01E01998 08000000 +003C4C51 00000031 + +Have Hookshot +01E01999 08000000 +003C4C57 0000002F + +Have Megaton Hammer +01E0199A 08000000 +003C4C58 00000033 + +Have Bottle 1 +01E0199B 08000000 +003C4C52 00000050 + +Have Bottle 2 +01E0199C 08000000 +003C4C53 00000050 + +Have Bottle 2 With Fairy +01E01ACC 08000000 +003C4C53 00000057 + +Have Bottle 3 +01E0199D 08000000 +003C4C54 00000050 + +Have Bottle 3 With Blue Potion +01E01ACD 08000000 +003C4C54 00000053 + +Have Bottle 4 +01E0199E 08000000 +003C4C55 00000050 + +Have Spoils Bag +01E0199F 08000000 +003C4C48 00000024 + +Have Bait Bag +01E019A0 08000000 +003C4C4F 0000002C + +Have Delivery Bag +01E019A1 08000000 +003C4C56 00000030 + +Infinite Berry Feed +01E019A2 08000000 +003C4C86 00000082 +003C4CAC 00000009 + +Infinite Pear Feed +01E019A3 08000000 +003C4C87 00000083 +003C4CAD 00000009 + +Max Red Chu Jelly +01E019A4 08000000 +003C4C7E 00000049 +003C4CA4 00000063 + +Max Green Chu Jelly +01E019A5 08000000 +003C4C83 0000004A +003C4CA5 00000063 + +Max Blue Chu Jelly +01E019A6 08000000 +003C4C85 0000004B +003C4CA6 00000063 + +Max Joy Pendants +01E019A7 08000000 +003C4C7F 0000001F +003C4CA7 00000063 + +Max Skull Necklaces +01E019A8 08000000 +003C4C80 00000045 +003C4CA8 00000063 + +Max Knight's Crest +01E019A9 08000000 +003C4C81 00000048 +003C4CA9 00000063 + +Max Boko Baba Seeds +01E019AA 08000000 +003C4C82 00000046 +003C4CAA 00000063 + +Max Golden Feathers +01E019AB 08000000 +003C4C84 00000047 +003C4CAB 00000063 + +Can Carry 99 Arrows +01E019AC 08000000 +003C4C77 00000063 + +Can Carry 99 Bombs +01E019AD 08000000 +003C4C78 00000063 + +Infinite Arrows +01E019AE 08000000 +003C4C71 00000063 + +Infinite Bombs +01E019AF 08000000 +003C4C72 00000063 + +Have Fully Detailed Map +01E019B0 08000000 +023C4D0C 00170303 +003C4D3C 00000003 + +Have All Quest Maps +01E019B1 08000000 +023C4CDC 0003FFFF + +All Triforce Maps Translated +01E019B2 08000000 +003C4D4D 000000FF + +Fully Charged Master Sword DON'T USE THIS CODE UNTIL YOU HAVE THE MASTER SWORD +01E01A3E 08000000 +003C4C16 0000003E +003C4CBC 0000000F + +Have All Element Stones DON'T USE THIS CODE UNTIL DRAGON ROOST ISLAND +01E019B5 08000000 +003C4CC7 00000007 +003C524A 00000040 + +Have Complete Triforce USE THIS CODE AFTER BEATING THE TOWER OF THE GODS +01E019B8 08000000 +003C4CC6 000000FF + ++Press R to Jump +01E019BB 08000000 +0A3ED84A 00000020 +863E4410 00000001 + +Press R to Mega Jump +01E019BC 08000000 +0A3ED84A 00000020 +863E4410 00000003 \ No newline at end of file diff --git a/Binary/win32/WII/setting-eur.txt b/Binary/win32/WII/setting-eur.txt new file mode 100644 index 0000000000..693d7411eb Binary files /dev/null and b/Binary/win32/WII/setting-eur.txt differ diff --git a/Binary/win32/WII/setting-jpn.txt b/Binary/win32/WII/setting-jpn.txt new file mode 100644 index 0000000000..db15646b46 Binary files /dev/null and b/Binary/win32/WII/setting-jpn.txt differ diff --git a/Binary/win32/WII/setting-usa.txt b/Binary/win32/WII/setting-usa.txt new file mode 100644 index 0000000000..38ca5d91db Binary files /dev/null and b/Binary/win32/WII/setting-usa.txt differ diff --git a/Binary/win32/cg.dll b/Binary/win32/cg.dll new file mode 100644 index 0000000000..df703e24eb Binary files /dev/null and b/Binary/win32/cg.dll differ diff --git a/Binary/win32/cgGL.dll b/Binary/win32/cgGL.dll new file mode 100644 index 0000000000..89a9efe249 Binary files /dev/null and b/Binary/win32/cgGL.dll differ diff --git a/Binary/x64/Data/font_ansi.bin b/Binary/x64/Data/font_ansi.bin new file mode 100644 index 0000000000..33b20041cc Binary files /dev/null and b/Binary/x64/Data/font_ansi.bin differ diff --git a/Binary/x64/Data/font_sjis.bin b/Binary/x64/Data/font_sjis.bin new file mode 100644 index 0000000000..c8d25fdcd0 Binary files /dev/null and b/Binary/x64/Data/font_sjis.bin differ diff --git a/Binary/x64/Patches/GMSE01.ini b/Binary/x64/Patches/GMSE01.ini new file mode 100644 index 0000000000..1cd4bcf77d --- /dev/null +++ b/Binary/x64/Patches/GMSE01.ini @@ -0,0 +1,156 @@ +[OnFrame] + +[ActionReplay] +All Shines +00E60AE1 18000000 +045708E8 FFFFFFFF +045708EC FFFFFFFF +045708F0 FFFFFFFF + +Open all levels and nozzles +00E60AE0 18000000 +04570958 FFFFFFFF +0457095C FFFFFFFF + +8 red coins(press L & B) +00E61642 18000000 +0A3FBBF4 00000240 +025709DE 00000008 + +Infinite hover time +00E61520 18000000 +042640BC 60000000 + +Infinite water +00E6151F 18000000 +04263F58 38002710 +042635B0 60000000 + +Infinite health +00E60ADF 18000000 +424057F4 00040009 + ++99 lives +00E60ADE 18000000 +00570967 00000063 + ++Test Level +00B86425 08000000 +043E9710 00000C01 + ++Low Gravity +00B809F5 08000000 +4240E12C 05003E00 + +Jesus Mode A.K.A. Walk on Water D-Pad Up/Down = On/Off +00B813BC 08000000 +04002F00 3C608041 +04002F04 8063E12C +04002F08 80C3FFCC +04002F0C 2C060000 +04002F10 4D820020 +04002F14 C2660008 +04002F18 EE852824 +04002F1C EE93A02A +04002F20 FC019840 +04002F24 4C800020 +04002F28 FC20A090 +04002F2C 38C00008 +04002F30 90C30248 +04002F34 4E800020 +0A404454 00000008 +04189854 4BE796AC +0A404454 00000004 +04189854 4E800020 + ++Do Not Have To Move Before Triple Jump +00B819B3 08000000 +4240E10C 06B00000 + +Spin Jump Gravity - Really Slow Fall +00B86E48 08000000 +4240E10C 058E3D00 + +Spin Jump Gravity - Almost No Fall +00B8369D 08000000 +4240E10C 058E0000 + +Spin Jump Gravity - Fall Really Fast +00B86350 08000000 +4240E10C 058E4200 + +Spin Jump Gravity - Normal Speed +00B80454 08000000 +4240E10C 058E3EB3 + ++Insane heat waves Crazy colors everywhere! +00B80485 08000000 +043AA070 41200000 + +Double vision heat wave (narrow) +00B856EB 08000000 +043AA070 3F600000 + +Double vision heat wave (wide) +00B85C4A 08000000 +043AA070 3F400000 + +Use only one of following two. Vanish point visual distortion +00B842EC 08000000 +043AB304 3E000000 + +Hard to select file, activators will work if you add them.. Camera is far out +00B82579 08000000 +043AB304 3F000000 + +X textures +00B80A69 08000000 +043DB210 41200000 + + +Y textures +00B80605 08000000 +043DB224 41200000 + + +Z textures +00B86358 08000000 +043DB238 41200000 + + +Strangely distorted people +00B82C96 08000000 +0440CC24 3F900000 + +Mute game +00B87829 08000000 +04417248 00000000 + +Magnify camera +00B87EB7 08000000 +04417690 3F900000 + +Warped camera view +00B851AB 08000000 +044176A8 3E000000 + +Poorly Shaded Mario +00B87DA5 08000000 +044176FC 00000000 + + +Nozzle Modifier Press the buttons below to switch to another nozzle. You must have your nozzle set to squirt for it to work. You will never use another nozzle box again!! Just kidding.B+D-Pad Up:Rocket NozzleB+D-Pad Left:Turbo NozzleB+D-Pad Right:Hover NozzleB+D-Pad Down:Jump Nozzle + +00B83682 08000000 +0A404454 00000208 +04269F50 3BE00001 +0A404454 00000204 +04269F50 3BE00002 +0A404454 00000201 +04269F50 3BE00005 +0A404454 00000202 +04269F50 3BE00004 + +Always Green Yoshi +00B80C27 08000000 +405F3A90 04AE4C00 diff --git a/Binary/x64/Patches/GZLE01.ini b/Binary/x64/Patches/GZLE01.ini new file mode 100644 index 0000000000..045345c891 --- /dev/null +++ b/Binary/x64/Patches/GZLE01.ini @@ -0,0 +1,420 @@ +[OnFrame] +0x802904b4=dword:0x4E800020 #Fix item hang + +# WARNING - cheats may screw up your save games +# 0x803C4C09=byte:0x50 #Max health +# 0x803C4C0B=byte:0x50 #Current health + +# Hidden dungeon +# 0x803C9D44=dword:0x000000FF +# 0x803C9D48=dword:0x485F7465 +# 0x803C9D4C=dword:0x73740000 + +# Snow test room +# 0x803C9D44=dword:0x000000FF +# 0x803C9D48=dword:0x49546573 +# 0x803C9D4C=dword:0x74363200 + +#only supports decrypted AR codes + +[ActionReplay] +# Use GCNCrypt to decrypt large chunks of codes found online, and paste here. +# Add a + to the name to activate. +# Codes by GCNHacker87 (yes we forgot to ask permission) ++Master Code (useless) +01E0197D 88000000 +C4323EA8 0000FF00 + +Shadow Link +01E05E82 08000000 +041926B8 60000000 +423BCDA0 00BCFFFF +423BCDA0 00BDFF87 +403BCDA0 00017E3F + +Stuff at the top right of the screen is not visible +01E00EFA 08000000 +903ED848 00000000 +023F633C 00028000 +003F710A 00000080 +003F713A 00000080 +003F715E 00000080 +403BB494 00106A80 +403BB498 002F5080 +00000000 40000000 + +Super Hookshot +01E03C97 08000000 +043F9DFC 48420B00 +040F1E68 28030001 +043F9E00 43008700 +0A3ED84A 00000140 +040F2898 3C000000 +123ED84A 00000140 +040F2898 8001004C + ++Teleport to Fire Mountain up R Y +01E05660 08000000 +4A3ED84A 00000828 +043E440C 482F85A1 +043E4414 C7EA36FD + +Hold A to swim fast +01E0712B 08000000 +0A3ED84A 00000100 +0435D548 44610000 +123ED84A 00000100 +0435D548 41900000 + ++Run/Swim/Crawl fast Hold A +01E06820 08000000 +4A3ED84A 00000100 +0435CEEC 42480000 +0435D548 44610000 +523ED84A 00000100 +0435CEEC 41880000 +0435D548 41900000 +0A3ED84A 00000120 +0435DB94 42800000 +123ED84A 00000120 +0435DB94 40400000 + +(m) +01E0197D 88000000 +C4323EA8 0000FF00 + +Max Health +01E0197E 08000000 +003C4C09 00000050 + +Infinite Health +01E0197F 08000000 +003C4C0B 00000050 + +Full Nintendo Gallery +01E01A3B 08000000 +003C5260 00000001 +023C52AC 0003FFFF +023C52B8 0005FFFF +003C52C8 000000FF +023C52DC 0000FFFF + +Small energy sword +01E058C4 08000000 +0435DF6C 004A004A + +Full energy Sword +01E03B23 08000000 +0435DF6C 004C004C + +HookShot Head/beam sword +01E064B0 08000000 +0435DF6C 004C001E + +Normal/no glow +01E042B7 08000000 +0435DF6C 00460046 + +Jesus Mode aka WalkOnWater +01E071C7 08000000 +04004010 2C070003 +04004014 C01EFFA0 +04004018 4182000C +0400401C C01F008C +04004020 4809EF60 +04004024 FC16A840 +04004028 C2DEFFA4 +0400402C 4182FFF0 +04004030 4809EF54 +04004048 281E5787 +0400404C 4081001C +04004050 FC010040 +04004054 4080000C +04004058 D2BEFFA0 +0400405C 4800000C +04004060 C2DEFF9C +04004064 D03EFFA0 +04004068 EC210028 +0400406C 48138FB8 +043C5E44 04071987 +040A2F7C 4BF61094 +0413D020 4BEC7028 + +Use anything indoors +01E01C68 08000000 +0020485F 0000007E + +Sink or Swim A+D-pad down sink B+D-pad down swim +01E00949 08000000 +0A3ED84A 00000104 +0435D560 50000000 +0A3ED84A 00000204 +0435D560 42B40000 + +Jump to a ledge at any height +01E05CFA 08000000 +0435D734 469C4000 + +Very Fast on Ladders (May have to barly tap forward on joystick inorder to get on vein walls) +01E01534 08000000 +00000000 8435DB18 +41200000 00040002 +0435DB38 7F7FFFFF + +Extra deku leaf controls (Y makes you rise, Z keeps you at your current height, X wind pulls you instead of push, to stop it from rising you must close and reopen the leaf quickly) +01E04637 08000000 +0A3ED84A 00000800 +0435DC90 40700000 +0A3ED84A 00000010 +0435DC90 00000000 +0A3ED84A 00000400 +0435DCA4 C1200000 +4A3ED84A 00000000 +0435DC90 C0000000 +0435DCA4 41166666 + +Roll further +01E05AB9 08000000 +0435D3D0 40000000 + +Instead of rolling, you glide +01E05AAE 08000000 +0435D3CC 45500000 + +#DON'T USE ANY OF THE FOLLOWING CODES UNTIL AFTER MEETING THE DRAGON BOAT +Max Magic +01E01983 08000000 +003C4C1B 00000020 + +Infinite Magic +01E01984 08000000 +003C4C1C 00000020 + +Can Carry 1000 Rupees +01E01985 08000000 +003C4C1A 00000001 + +Can Carry 5000 Rupees +01E01986 08000000 +003C4C1A 00000002 + +Always Have 1000 Rupees +01E01987 08000000 +023C4C0C 000003E8 + +Always Have 5000 Rupees +01E01988 08000000 +023C4C0C 00001388 + +Link Can Swim Forever +01E01989 08000000 +023CA76E 00000384 + +Have All Songs +01E0198A 08000000 +003C4CC5 0000003F + +Have Hero's Sword +01E0198B 08000000 +003C4C16 00000038 +003C4CBC 00000001 + +Have Mirror Shield +01E0198C 08000000 +003C4C17 0000003C +003C4CBD 00000003 + +Have Telescope +01E0198D 08000000 +003C4C44 00000020 + +Have Sail +01E0198E 08000000 +003C4C45 00000078 + +Have Wind Waker +01E0198F 08000000 +003C4C46 00000022 + +Have Grappling Hook +01E01990 08000000 +003C4C47 00000025 + +Have Boomerang +01E01991 08000000 +003C4C49 0000002D + +Have Deku Leaf +01E01992 08000000 +003C4C4A 00000034 + +Have Tingle Tuner +01E01993 08000000 +003C4C4B 00000021 + +Have DX Camera +01E01994 08000000 +003C4C4C 00000026 + +Have Iron Boots +01E01995 08000000 +003C4C4D 00000029 + +Have Magic Shielding +01E01996 08000000 +003C4C4E 0000002A + +Have Bow And All Arrows +01E01997 08000000 +003C4C50 00000036 + +Have Bombs +01E01998 08000000 +003C4C51 00000031 + +Have Hookshot +01E01999 08000000 +003C4C57 0000002F + +Have Megaton Hammer +01E0199A 08000000 +003C4C58 00000033 + +Have Bottle 1 +01E0199B 08000000 +003C4C52 00000050 + +Have Bottle 2 +01E0199C 08000000 +003C4C53 00000050 + +Have Bottle 2 With Fairy +01E01ACC 08000000 +003C4C53 00000057 + +Have Bottle 3 +01E0199D 08000000 +003C4C54 00000050 + +Have Bottle 3 With Blue Potion +01E01ACD 08000000 +003C4C54 00000053 + +Have Bottle 4 +01E0199E 08000000 +003C4C55 00000050 + +Have Spoils Bag +01E0199F 08000000 +003C4C48 00000024 + +Have Bait Bag +01E019A0 08000000 +003C4C4F 0000002C + +Have Delivery Bag +01E019A1 08000000 +003C4C56 00000030 + +Infinite Berry Feed +01E019A2 08000000 +003C4C86 00000082 +003C4CAC 00000009 + +Infinite Pear Feed +01E019A3 08000000 +003C4C87 00000083 +003C4CAD 00000009 + +Max Red Chu Jelly +01E019A4 08000000 +003C4C7E 00000049 +003C4CA4 00000063 + +Max Green Chu Jelly +01E019A5 08000000 +003C4C83 0000004A +003C4CA5 00000063 + +Max Blue Chu Jelly +01E019A6 08000000 +003C4C85 0000004B +003C4CA6 00000063 + +Max Joy Pendants +01E019A7 08000000 +003C4C7F 0000001F +003C4CA7 00000063 + +Max Skull Necklaces +01E019A8 08000000 +003C4C80 00000045 +003C4CA8 00000063 + +Max Knight's Crest +01E019A9 08000000 +003C4C81 00000048 +003C4CA9 00000063 + +Max Boko Baba Seeds +01E019AA 08000000 +003C4C82 00000046 +003C4CAA 00000063 + +Max Golden Feathers +01E019AB 08000000 +003C4C84 00000047 +003C4CAB 00000063 + +Can Carry 99 Arrows +01E019AC 08000000 +003C4C77 00000063 + +Can Carry 99 Bombs +01E019AD 08000000 +003C4C78 00000063 + +Infinite Arrows +01E019AE 08000000 +003C4C71 00000063 + +Infinite Bombs +01E019AF 08000000 +003C4C72 00000063 + +Have Fully Detailed Map +01E019B0 08000000 +023C4D0C 00170303 +003C4D3C 00000003 + +Have All Quest Maps +01E019B1 08000000 +023C4CDC 0003FFFF + +All Triforce Maps Translated +01E019B2 08000000 +003C4D4D 000000FF + +Fully Charged Master Sword DON'T USE THIS CODE UNTIL YOU HAVE THE MASTER SWORD +01E01A3E 08000000 +003C4C16 0000003E +003C4CBC 0000000F + +Have All Element Stones DON'T USE THIS CODE UNTIL DRAGON ROOST ISLAND +01E019B5 08000000 +003C4CC7 00000007 +003C524A 00000040 + +Have Complete Triforce USE THIS CODE AFTER BEATING THE TOWER OF THE GODS +01E019B8 08000000 +003C4CC6 000000FF + ++Press R to Jump +01E019BB 08000000 +0A3ED84A 00000020 +863E4410 00000001 + +Press R to Mega Jump +01E019BC 08000000 +0A3ED84A 00000020 +863E4410 00000003 \ No newline at end of file diff --git a/Binary/x64/WII/setting-eur.txt b/Binary/x64/WII/setting-eur.txt new file mode 100644 index 0000000000..693d7411eb Binary files /dev/null and b/Binary/x64/WII/setting-eur.txt differ diff --git a/Binary/x64/WII/setting-jpn.txt b/Binary/x64/WII/setting-jpn.txt new file mode 100644 index 0000000000..db15646b46 Binary files /dev/null and b/Binary/x64/WII/setting-jpn.txt differ diff --git a/Binary/x64/WII/setting-usa.txt b/Binary/x64/WII/setting-usa.txt new file mode 100644 index 0000000000..38ca5d91db Binary files /dev/null and b/Binary/x64/WII/setting-usa.txt differ diff --git a/Binary/x64/cg.dll b/Binary/x64/cg.dll new file mode 100644 index 0000000000..b7093a468a Binary files /dev/null and b/Binary/x64/cg.dll differ diff --git a/Binary/x64/cgGL.dll b/Binary/x64/cgGL.dll new file mode 100644 index 0000000000..8889677d9c Binary files /dev/null and b/Binary/x64/cgGL.dll differ diff --git a/Externals/Bochs_disasm/Bochs_disasm.vcproj b/Externals/Bochs_disasm/Bochs_disasm.vcproj new file mode 100644 index 0000000000..e37e9e6aaf --- /dev/null +++ b/Externals/Bochs_disasm/Bochs_disasm.vcproj @@ -0,0 +1,509 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Externals/Bochs_disasm/PowerPCDisasm.cpp b/Externals/Bochs_disasm/PowerPCDisasm.cpp new file mode 100644 index 0000000000..f1b215774c --- /dev/null +++ b/Externals/Bochs_disasm/PowerPCDisasm.cpp @@ -0,0 +1,2247 @@ +/* $VER: ppc_disasm.c V1.1 (19.02.2000) +* +* Disassembler module for the PowerPC microprocessor family +* Copyright (c) 1998-2000 Frank Wille +* +* ppc_disasm.c is freeware and may be freely redistributed as long as +* no modifications are made and nothing is charged for it. +* Non-commercial usage is allowed without any restrictions. +* EVERY PRODUCT OR PROGRAM DERIVED DIRECTLY FROM MY SOURCE MAY NOT BE +* SOLD COMMERCIALLY WITHOUT PERMISSION FROM THE AUTHOR. +* +* +* v1.2 (31.07.2003) org +* modified for IBM PowerPC Gekko. +* v1.1 (19.02.2000) phx +* fabs wasn't recognized. +* v1.0 (30.01.2000) phx +* stfsx, stfdx, lfsx, lfdx, stfsux, stfdux, lfsux, lfdux, etc. +* printed "rd,ra,rb" as operands instead "fd,ra,rb". +* v0.4 (01.06.1999) phx +* 'stwm' shoud have been 'stmw'. +* v0.3 (17.11.1998) phx +* The OE-types (e.g. addo, subfeo, etc.) didn't work for all +* instructions. +* AA-form branches have an absolute destination. +* addze and subfze must not have a third operand. +* sc was not recognized. +* v0.2 (29.05.1998) phx +* Sign error. SUBI got negative immediate values. +* v0.1 (23.05.1998) phx +* First version, which implements all PowerPC instructions. +* v0.0 (09.05.1998) phx +* File created. +*/ +#include +#include +#include +#include + +#include "PowerPCDisasm.h" + +namespace PPCDisasm +{ + + /* version/revision */ +#define PPCDISASM_VER 1 +#define PPCDISASM_REV 1 + + + /* typedefs */ + typedef unsigned long ppc_word; + +#undef BIGENDIAN +#undef LITTTLEENDIAN + /* endianess */ +#define LITTLEENDIAN 0 + + + /* general defines */ +#define PPCIDXMASK 0xfc000000 +#define PPCIDX2MASK 0x000007fe +#define PPCDMASK 0x03e00000 +#define PPCAMASK 0x001f0000 +#define PPCBMASK 0x0000f800 +#define PPCCMASK 0x000007c0 +#define PPCMMASK 0x0000003e +#define PPCCRDMASK 0x03800000 +#define PPCCRAMASK 0x001c0000 +#define PPCLMASK 0x00600000 +#define PPCOE 0x00000400 + +#define PPCIDXSH 26 +#define PPCDSH 21 +#define PPCASH 16 +#define PPCBSH 11 +#define PPCCSH 6 +#define PPCMSH 1 +#define PPCCRDSH 23 +#define PPCCRASH 18 +#define PPCLSH 21 +#define PPCIDX2SH 1 + +#define PPCGETIDX(x) (((x)&PPCIDXMASK)>>PPCIDXSH) +#define PPCGETD(x) (((x)&PPCDMASK)>>PPCDSH) +#define PPCGETA(x) (((x)&PPCAMASK)>>PPCASH) +#define PPCGETB(x) (((x)&PPCBMASK)>>PPCBSH) +#define PPCGETC(x) (((x)&PPCCMASK)>>PPCCSH) +#define PPCGETM(x) (((x)&PPCMMASK)>>PPCMSH) +#define PPCGETCRD(x) (((x)&PPCCRDMASK)>>PPCCRDSH) +#define PPCGETCRA(x) (((x)&PPCCRAMASK)>>PPCCRASH) +#define PPCGETL(x) (((x)&PPCLMASK)>>PPCLSH) +#define PPCGETIDX2(x) (((x)&PPCIDX2MASK)>>PPCIDX2SH) + + + /* Disassembler structure, the interface to the application */ + + struct DisasmPara_PPC { + ppc_word *instr; /* pointer to instruction to disassemble */ + ppc_word *iaddr; /* instr.addr., usually the same as instr */ + char *opcode; /* buffer for opcode, min. 10 chars. */ + char *operands; /* operand buffer, min. 24 chars. */ + /* changed by disassembler: */ + unsigned char type; /* type of instruction, see below */ + unsigned char flags; /* additional flags */ + unsigned short sreg; /* register in load/store instructions */ + ppc_word displacement; /* branch- or load/store displacement */ + }; + +#define PPCINSTR_OTHER 0 /* no additional info for other instr. */ +#define PPCINSTR_BRANCH 1 /* branch dest. = PC+displacement */ +#define PPCINSTR_LDST 2 /* load/store instruction: displ(sreg) */ +#define PPCINSTR_IMM 3 /* 16-bit immediate val. in displacement */ + +#define PPCF_ILLEGAL (1<<0) /* illegal PowerPC instruction */ +#define PPCF_UNSIGNED (1<<1) /* unsigned immediate instruction */ +#define PPCF_SUPER (1<<2) /* supervisor level instruction */ +#define PPCF_64 (1<<3) /* 64-bit only instruction */ + + + /* ppc_disasm.o prototypes */ +#ifndef PPC_DISASM_C + extern ppc_word *PPC_Disassemble(struct DisasmPara_PPC *); +#endif + + + static const char *trap_condition[32] = { + NULL,"lgt","llt",NULL,"eq","lge","lle",NULL, + "gt",NULL,NULL,NULL,"ge",NULL,NULL,NULL, + "lt",NULL,NULL,NULL,"le",NULL,NULL,NULL, + "ne",NULL,NULL,NULL,NULL,NULL,NULL,NULL + }; + + static const char *cmpname[4] = { + "cmpw","cmpd","cmplw","cmpld" + }; + + static const char *b_ext[4] = { + "","l","a","la" + }; + + static const char *b_condition[8] = { + "ge","le","ne","ns","lt","gt","eq","so" + }; + + static const char *b_decr[16] = { + "nzf","zf",NULL,NULL,"nzt","zt",NULL,NULL, + "nz","z",NULL,NULL,"nz","z",NULL,NULL + }; + + static const char *regsel[2] = { + "","r" + }; + + static const char *oesel[2] = { + "","o" + }; + + static const char *rcsel[2] = { + "","." + }; + + static const char *ldstnames[] = { + "lwz","lwzu","lbz","lbzu","stw","stwu","stb","stbu","lhz","lhzu", + "lha","lhau","sth","sthu","lmw","stmw","lfs","lfsu","lfd","lfdu", + "stfs","stfsu","stfd","stfdu" + }; + + static const char *regnames[] = { + "r0", "sp", "rtoc", "r3", "r4", "r5", "r6", "r7", + "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", + "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23", + "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31" + }; + + static const char *spr_name(int i) + { + static char def[8]; + + switch(i) + { + case 1: return "XER"; + case 8: return "LR"; + case 9: return "CTR"; + case 18: return "DSIR"; + case 19: return "DAR"; + case 22: return "DEC"; + case 25: return "SDR1"; + case 26: return "SRR0"; + case 27: return "SRR1"; + case 272: return "SPRG0"; + case 273: return "SPRG1"; + case 274: return "SPRG2"; + case 275: return "SPRG3"; + case 282: return "EAR"; + case 287: return "PVR"; + case 528: return "IBAT0U"; + case 529: return "IBAT0L"; + case 530: return "IBAT1U"; + case 531: return "IBAT1L"; + case 532: return "IBAT2U"; + case 533: return "IBAT2L"; + case 534: return "IBAT3U"; + case 535: return "IBAT3L"; + case 536: return "DBAT0U"; + case 537: return "DBAT0L"; + case 538: return "DBAT1U"; + case 539: return "DBAT1L"; + case 540: return "DBAT2U"; + case 541: return "DBAT2L"; + case 542: return "DBAT3U"; + case 543: return "DBAT3L"; + case 912: return "GQR0"; + case 913: return "GQR1"; + case 914: return "GQR2"; + case 915: return "GQR3"; + case 916: return "GQR4"; + case 917: return "GQR5"; + case 918: return "GQR6"; + case 919: return "GQR7"; + case 920: return "HID2"; + case 921: return "WPAR"; + case 922: return "DMA_U"; + case 923: return "DMA_L"; + case 936: return "UMMCR0"; + case 937: return "UPMC1"; + case 938: return "UPMC2"; + case 939: return "USIA"; + case 940: return "UMMCR1"; + case 941: return "UPMC3"; + case 942: return "UPMC4"; + case 943: return "USDA"; + case 952: return "MMCR0"; + case 953: return "PMC1"; + case 954: return "PMC2"; + case 955: return "SIA"; + case 956: return "MMCR1"; + case 957: return "PMC3"; + case 958: return "PMC4"; + case 959: return "SDA"; + case 1008: return "HID0"; + case 1009: return "HID1"; + case 1010: return "IABR"; + case 1013: return "DABR"; + case 1017: return "L2CR"; + case 1019: return "ICTC"; + case 1020: return "THRM1"; + case 1021: return "THRM2"; + case 1022: return "THRM3"; + } + + sprintf(def, "%i", i); + return def; + } + + static void ierror(const char *errtxt,...) + /* display internal error and quit program */ + { + va_list vl; + + fprintf(stderr,"\nINTERNAL ERROR (PPC disassembler): "); + va_start(vl,errtxt); + vfprintf(stderr,errtxt,vl); + va_end(vl); + fprintf(stderr,".\nAborting.\n"); + exit(1); + } + + + static ppc_word swapda(ppc_word w) + { + return ((w&0xfc00ffff)|((w&PPCAMASK)<<5)|((w&PPCDMASK)>>5)); + } + + + static ppc_word swapab(ppc_word w) + { + return ((w&0xffe007ff)|((w&PPCBMASK)<<5)|((w&PPCAMASK)>>5)); + } + + + static void ill(struct DisasmPara_PPC *dp,ppc_word in) + { + // strcpy(dp->opcode,".word"); + // sprintf(dp->operands,"0x%08lx",(unsigned long)in); + + strcpy(dp->opcode,""); + sprintf(dp->operands,""); + + dp->flags |= PPCF_ILLEGAL; + } + + + static void imm(struct DisasmPara_PPC *dp,ppc_word in,int uimm,int type,int hex) + /* Generate immediate instruction operand. */ + /* type 0: D-mode, D,A,imm */ + /* type 1: S-mode, A,S,imm */ + /* type 2: S/D register is ignored (trap,cmpi) */ + /* type 3: A register is ignored (li) */ + { + int i = (int)(in & 0xffff); + + dp->type = PPCINSTR_IMM; + if (!uimm) { + if (i > 0x7fff) + i -= 0x10000; + } + else + dp->flags |= PPCF_UNSIGNED; + dp->displacement = i; + + switch (type) { + case 0: + sprintf(dp->operands,"%s, %s, %d",regnames[(int)PPCGETD(in)],regnames[(int)PPCGETA(in)],i); + break; + case 1: + if(hex) + sprintf(dp->operands,"%s, %s, 0x%.4X",regnames[(int)PPCGETA(in)],regnames[(int)PPCGETD(in)],i); + else + sprintf(dp->operands,"%s, %s, %d",regnames[(int)PPCGETA(in)],regnames[(int)PPCGETD(in)],i); + break; + case 2: + sprintf(dp->operands,"%s, %d",regnames[(int)PPCGETA(in)],i); + break; + case 3: + if(hex) + sprintf(dp->operands,"%s, 0x%.4X",regnames[(int)PPCGETD(in)],i); + else + sprintf(dp->operands,"%s, %d",regnames[(int)PPCGETD(in)],i); + break; + default: + ierror("imm(): Wrong type"); + break; + } + } + + + static void ra_rb(char *s,ppc_word in) + { + sprintf(s,"%s, %s",regnames[(int)PPCGETA(in)],regnames[(int)PPCGETB(in)]); + } + + + static char *rd_ra_rb(char *s,ppc_word in,int mask) + { + static const char *fmt = "%s, "; + + if (mask) { + if (mask & 4) + s += sprintf(s,fmt,regnames[(int)PPCGETD(in)]); + if (mask & 2) + s += sprintf(s,fmt,regnames[(int)PPCGETA(in)]); + if (mask & 1) + s += sprintf(s,fmt,regnames[(int)PPCGETB(in)]); + *--s = '\0'; + *--s = '\0'; + } + else + *s = '\0'; + return (s); + } + + + static char *fd_ra_rb(char *s,ppc_word in,int mask) + { + static const char *ffmt = "f%d,"; + static const char *rfmt = "%s,"; + + if (mask) { + if (mask & 4) + s += sprintf(s,ffmt,(int)PPCGETD(in)); + if (mask & 2) + s += sprintf(s,rfmt,regnames[(int)PPCGETA(in)]); + if (mask & 1) + s += sprintf(s,rfmt,regnames[(int)PPCGETB(in)]); + *--s = '\0'; + } + else + *s = '\0'; + return (s); + } + + + static void trapi(struct DisasmPara_PPC *dp,ppc_word in,unsigned char dmode) + { + const char *cnd; + + if (cnd = trap_condition[PPCGETD(in)]) { + dp->flags |= dmode; + sprintf(dp->opcode,"t%c%s",dmode?'d':'w',cnd); + imm(dp,in,0,2,0); + } + else + ill(dp,in); + } + + + static void cmpi(struct DisasmPara_PPC *dp,ppc_word in,int uimm) + { + char *oper = dp->operands; + int i = (int)PPCGETL(in); + + if (i < 2) { + if (i) + dp->flags |= PPCF_64; + sprintf(dp->opcode,"%si",cmpname[uimm*2+i]); + if (i = (int)PPCGETCRD(in)) { + sprintf(oper,"cr%c,",'0'+i); + dp->operands += 4; + } + imm(dp,in,uimm,2,0); + dp->operands = oper; + } + else + ill(dp,in); + } + + + static void addi(struct DisasmPara_PPC *dp,ppc_word in,const char *ext) + { + if ((in&0x08000000) && !PPCGETA(in)) { + sprintf(dp->opcode,"l%s",ext); /* li, lis */ + if(!strcmp(ext, "i")) + imm(dp,in,0,3,0); + else + imm(dp,in,1,3,1); + } + else { + sprintf(dp->opcode,"%s%s",(in&0x8000)?"sub":"add",ext); + if (in & 0x8000) + in = (in^0xffff) + 1; + imm(dp,in,1,0,0); + } + } + + + static int branch(struct DisasmPara_PPC *dp,ppc_word in, const char *bname,int aform,int bdisp) + /* build a branch instr. and return number of chars written to operand */ + { + int bo = (int)PPCGETD(in); + int bi = (int)PPCGETA(in); + char y = (char)(bo & 1); + int opercnt = 0; + const char *ext = b_ext[aform*2+(int)(in&1)]; + + if (bdisp < 0) + y ^= 1; + y = y ? '+':'-'; + + if (bo & 4) { + /* standard case - no decrement */ + if (bo & 16) { + /* branch always */ + if (PPCGETIDX(in) != 16) { + sprintf(dp->opcode,"b%s%s",bname,ext); + } + else { + sprintf(dp->opcode,"bc%s",ext); + opercnt = sprintf(dp->operands,"%d, %d",bo,bi); + } + } + else { + /* branch conditional */ + sprintf(dp->opcode,"b%s%s%s%c",b_condition[((bo&8)>>1)+(bi&3)], + bname,ext,y); + if (bi >= 4) + opercnt = sprintf(dp->operands,"cr%d",bi>>2); + } + } + + else { + /* CTR is decremented and checked */ + sprintf(dp->opcode,"bd%s%s%s%c",b_decr[bo>>1],bname,ext,y); + if (!(bo & 16)) + opercnt = sprintf(dp->operands,"%d",bi); + } + + return (opercnt); + } + + + static void bc(struct DisasmPara_PPC *dp,ppc_word in) + { + unsigned long d = (int)(in & 0xfffc); + int offs; + char *oper = dp->operands; + + if(d & 0x8000) d |= 0xffff0000; + + if (offs = branch(dp,in,"",(in&2)?1:0,d)) { + oper += offs; + *oper++ = ','; + } + if (in & 2) /* AA ? */ + sprintf(dp->operands,"0x%.8X",(unsigned long)d); + else + sprintf(oper,"0x%.8X",(unsigned long)(*dp->iaddr) + d); + dp->type = PPCINSTR_BRANCH; + dp->displacement = (ppc_word)d; + } + + + static void bli(struct DisasmPara_PPC *dp,ppc_word in) + { + unsigned long d = (unsigned long)(in & 0x3fffffc); + + if(d & 0x02000000) d |= 0xfc000000; + + sprintf(dp->opcode,"b%s",b_ext[in&3]); + if (in & 2) /* AA ? */ + sprintf(dp->operands,"0x%.8X",(unsigned long)d); + else + sprintf(dp->operands,"0x%.8X",(unsigned long)(*dp->iaddr) + d); + dp->type = PPCINSTR_BRANCH; + dp->displacement = (ppc_word)d; + } + + + static void mcrf(struct DisasmPara_PPC *dp,ppc_word in,char c) + { + if (!(in & 0x0063f801)) { + sprintf(dp->opcode,"mcrf%c",c); + sprintf(dp->operands,"cr%d, cr%d",(int)PPCGETCRD(in),(int)PPCGETCRA(in)); + } + else + ill(dp,in); + } + + + static void crop(struct DisasmPara_PPC *dp,ppc_word in,const char *n1,const char *n2) + { + int crd = (int)PPCGETD(in); + int cra = (int)PPCGETA(in); + int crb = (int)PPCGETB(in); + + if (!(in & 1)) { + sprintf(dp->opcode,"cr%s",(cra==crb && n2)?n2:n1); + if (cra == crb && n2) + sprintf(dp->operands,"%d, %d",crd,cra); + else + sprintf(dp->operands,"%d, %d, %d",crd,cra,crb); + } + else + ill(dp,in); + } + + + static void nooper(struct DisasmPara_PPC *dp,ppc_word in,const char *name, + unsigned char dmode) + { + if (in & (PPCDMASK|PPCAMASK|PPCBMASK|1)) { + ill(dp,in); + } + else { + dp->flags |= dmode; + strcpy(dp->opcode,name); + } + } + + + static unsigned int Helper_Mask(int mb, int me) + { + //first make 001111111111111 part + unsigned int begin = 0xFFFFFFFF >> mb; + //then make 000000000001111 part, which is used to flip the bits of the first one + unsigned int end = me < 31 ? (0xFFFFFFFF >> (me + 1)) : 0; + //do the bitflip + unsigned int mask = begin ^ end; + //and invert if backwards + if (me < mb) + return ~mask; + else + return mask; + } + + + static void rlw(struct DisasmPara_PPC *dp,ppc_word in,const char *name,int i) + { + int s = (int)PPCGETD(in); + int a = (int)PPCGETA(in); + int bsh = (int)PPCGETB(in); + int mb = (int)PPCGETC(in); + int me = (int)PPCGETM(in); + + + + sprintf(dp->opcode,"rlw%s%c",name,in&1?'.':'\0'); + sprintf(dp->operands,"%s, %s, %s%d, %d, %d (%08x)",regnames[a],regnames[s],regsel[i],bsh,mb,me,Helper_Mask(mb, me)); + } + + + static void ori(struct DisasmPara_PPC *dp,ppc_word in,const char *name) + { + strcpy(dp->opcode,name); + imm(dp,in,1,1,1); + } + + + static void rld(struct DisasmPara_PPC *dp,ppc_word in,const char *name,int i) + { + int s = (int)PPCGETD(in); + int a = (int)PPCGETA(in); + int bsh = i ? (int)PPCGETB(in) : (int)(((in&2)<<4)+PPCGETB(in)); + int m = (int)(in&0x7e0)>>5; + + dp->flags |= PPCF_64; + sprintf(dp->opcode,"rld%s%c",name,in&1?'.':'\0'); + sprintf(dp->operands,"%s, %s, %s%d, %d",regnames[a],regnames[s],regsel[i],bsh,m); + } + + + static void cmp(struct DisasmPara_PPC *dp,ppc_word in) + { + char *oper = dp->operands; + int i = (int)PPCGETL(in); + + if (i < 2) { + if (i) + dp->flags |= PPCF_64; + strcpy(dp->opcode,cmpname[((in&PPCIDX2MASK)?2:0)+i]); + if (i = (int)PPCGETCRD(in)) + oper += sprintf(oper,"cr%c,",'0'+i); + ra_rb(oper,in); + } + else + ill(dp,in); + } + + + static void trap(struct DisasmPara_PPC *dp,ppc_word in,unsigned char dmode) + { + const char *cnd; + int to = (int)PPCGETD(in); + + if (cnd = trap_condition[to]) { + dp->flags |= dmode; + sprintf(dp->opcode,"t%c%s",dmode?'d':'w',cnd); + ra_rb(dp->operands,in); + } + else { + if (to == 31) { + if (dmode) { + dp->flags |= dmode; + strcpy(dp->opcode,"td"); + strcpy(dp->operands,"31,0,0"); + } + else + strcpy(dp->opcode,"trap"); + } + else + ill(dp,in); + } + } + + + static void dab(struct DisasmPara_PPC *dp,ppc_word in,const char *name,int mask, + int smode,int chkoe,int chkrc,unsigned char dmode) + /* standard instruction: xxxx rD,rA,rB */ + { + if (chkrc>=0 && ((in&1)!=(unsigned)chkrc)) { + ill(dp,in); + } + else { + dp->flags |= dmode; + if (smode) + in = swapda(in); /* rA,rS,rB */ + sprintf(dp->opcode,"%s%s%s",name, + oesel[chkoe&&(in&PPCOE)],rcsel[(chkrc<0)&&(in&1)]); + rd_ra_rb(dp->operands,in,mask); + } + } + + + static void rrn(struct DisasmPara_PPC *dp,ppc_word in,const char *name, + int smode,int chkoe,int chkrc,unsigned char dmode) + /* Last operand is no register: xxxx rD,rA,NB */ + { + char *s; + + if (chkrc>=0 && ((in&1)!=(unsigned)chkrc)) { + ill(dp,in); + } + else { + dp->flags |= dmode; + if (smode) + in = swapda(in); /* rA,rS,NB */ + sprintf(dp->opcode,"%s%s%s",name, + oesel[chkoe&&(in&PPCOE)],rcsel[(chkrc<0)&&(in&1)]); + s = rd_ra_rb(dp->operands,in,6); + sprintf(s,",%d",(int)PPCGETB(in)); + } + } + + + static void mtcr(struct DisasmPara_PPC *dp,ppc_word in) + { + int s = (int)PPCGETD(in); + int crm = (int)(in&0x000ff000)>>12; + char *oper = dp->operands; + + if (in & 0x00100801) { + ill(dp,in); + } + else { + sprintf(dp->opcode,"mtcr%c",crm==0xff?'\0':'f'); + if (crm != 0xff) + oper += sprintf(oper,"0x%02x,",crm); + sprintf(oper,"%s",regnames[s]); + } + } + + + static void msr(struct DisasmPara_PPC *dp,ppc_word in,int smode) + { + int s = (int)PPCGETD(in); + int sr = (int)(in&0x000f0000)>>16; + + if (in & 0x0010f801) { + ill(dp,in); + } + else { + dp->flags |= PPCF_SUPER; + sprintf(dp->opcode,"m%csr",smode?'t':'f'); + if (smode) + sprintf(dp->operands,"%d, %s",sr,regnames[s]); + else + sprintf(dp->operands,"%s, %d",regnames[s],sr); + } + } + + + static void mspr(struct DisasmPara_PPC *dp,ppc_word in,int smode) + { + int d = (int)PPCGETD(in); + int spr = (int)((PPCGETB(in)<<5)+PPCGETA(in)); + int fmt = 0; + const char *x; + + if (in & 1) { + ill(dp,in); + } + + else { + if (spr!=1 && spr!=8 && spr!=9) + dp->flags |= PPCF_SUPER; + switch (spr) { + case 1: + x = "xer"; + break; + case 8: + x = "lr"; + break; + case 9: + x = "ctr"; + break; + default: + x = "spr"; + fmt = 1; + break; + } + + sprintf(dp->opcode,"m%c%s",smode?'t':'f',x); + if (fmt) { + if (smode) + sprintf(dp->operands,"%s, %s",spr_name(spr),regnames[d]); + else + sprintf(dp->operands,"%s, %s",regnames[d],spr_name(spr)); + } + else + sprintf(dp->operands,"%s",regnames[d]); + } + } + + + static void mtb(struct DisasmPara_PPC *dp,ppc_word in) + { + int d = (int)PPCGETD(in); + int tbr = (int)((PPCGETB(in)<<5)+PPCGETA(in)); + char *s = dp->operands; + char x; + + if (in & 1) { + ill(dp,in); + } + + else { + s += sprintf(s,"%s",regnames[d]); + switch (tbr) { + case 268: + x = 'l'; + break; + case 269: + x = 'u'; + break; + default: + x = '\0'; + dp->flags |= PPCF_SUPER; + sprintf(s,",%d",tbr); + break; + } + sprintf(dp->opcode,"mftb%c",x); + } + } + + + static void sradi(struct DisasmPara_PPC *dp,ppc_word in) + { + int s = (int)PPCGETD(in); + int a = (int)PPCGETA(in); + int bsh = (int)(((in&2)<<4)+PPCGETB(in)); + + dp->flags |= PPCF_64; + sprintf(dp->opcode,"sradi%c",in&1?'.':'\0'); + sprintf(dp->operands,"%s, %s, %d",regnames[a],regnames[s],bsh); + } + + static const char *ldst_offs(unsigned long val) + { + static char buf[8]; + + if(val == 0) + { + return "0"; + } + else + { + if(val & 0x8000) + { + sprintf(buf, "-0x%.4X", ((~val) & 0xffff) + 1); + } + else + { + sprintf(buf, "0x%.4X", val); + } + + return buf; + } + } + + static void ldst(struct DisasmPara_PPC *dp,ppc_word in,const char *name, + char reg,unsigned char dmode) + { + int s = (int)PPCGETD(in); + int a = (int)PPCGETA(in); + int d = (ppc_word)(in & 0xffff); + + dp->type = PPCINSTR_LDST; + dp->flags |= dmode; + dp->sreg = (short)a; + // if (d >= 0x8000) + // d -= 0x10000; + dp->displacement = (ppc_word)d; + strcpy(dp->opcode,name); + if(reg == 'r') + { + sprintf(dp->operands,"%s, %s (%s)", regnames[s], ldst_offs(d), regnames[a]); + } + else + { + sprintf(dp->operands,"%c%d, %s (%s)",reg,s, ldst_offs(d), regnames[a]); + } + } + + + static void fdabc(struct DisasmPara_PPC *dp,ppc_word in, const char *name, + int mask,unsigned char dmode) + /* standard floating point instruction: xxxx fD,fA,fB,fC */ + { + static const char *fmt = "f%d,"; + char *s = dp->operands; + int err = 0; + + dp->flags |= dmode; + sprintf(dp->opcode,"f%s%s",name,rcsel[in&1]); + s += sprintf(s,fmt,(int)PPCGETD(in)); + if (mask & 4) + s += sprintf(s,fmt,(int)PPCGETA(in)); + else + err |= (int)PPCGETA(in); + if (mask & 2) + s += sprintf(s,fmt,(int)PPCGETB(in)); + else if (PPCGETB(in)) + err |= (int)PPCGETB(in); + if (mask & 1) + s += sprintf(s,fmt,(int)PPCGETC(in)); + else if (!(mask&8)) + err |= (int)PPCGETC(in); + *(s-1) = '\0'; + if (err) + ill(dp,in); + } + + + static void fdab(struct DisasmPara_PPC *dp,ppc_word in,const char *name,int mask) + /* indexed float instruction: xxxx fD,rA,rB */ + { + strcpy(dp->opcode,name); + fd_ra_rb(dp->operands,in,mask); + } + + + static void fcmp(struct DisasmPara_PPC *dp,ppc_word in,char c) + { + if (in & 0x00600001) { + ill(dp,in); + } + else { + sprintf(dp->opcode,"fcmp%c",c); + sprintf(dp->operands,"cr%d,f%d,f%d",(int)PPCGETCRD(in), + (int)PPCGETA(in),(int)PPCGETB(in)); + } + } + + + static void mtfsb(struct DisasmPara_PPC *dp,ppc_word in,int n) + { + if (in & (PPCAMASK|PPCBMASK)) { + ill(dp,in); + } + else { + sprintf(dp->opcode,"mtfsb%d%s",n,rcsel[in&1]); + sprintf(dp->operands,"%d",(int)PPCGETD(in)); + } + } + + + ////////////////////////////////////////////////////////////////////////////////// + //PAIRED + ////////////////////////////////////////////////////////////////////////////////// + + /* + sprintf(buf, "psq_lx", FD); + sprintf(buf, "psq_stx", FD); + sprintf(buf, "psq_lux", FD); + sprintf(buf, "psq_stux", FD); + */ +#define RA ((inst >> 16) & 0x1f) +#define RB ((inst >> 11) & 0x1f) +#define RC ((inst >> 6) & 0x1f) +#define RD ((inst >> 21) & 0x1f) +#define RS ((inst >> 21) & 0x1f) +#define FA ((inst >> 16) & 0x1f) +#define FB ((inst >> 11) & 0x1f) +#define FC ((inst >> 6) & 0x1f) +#define FD ((inst >> 21) & 0x1f) +#define FS ((inst >> 21) & 0x1f) +#define IMM (inst & 0xffff) +#define UIMM (inst & 0xffff) +#define OFS (inst & 0xffff) +#define OPCD ((inst >> 26) & 0x3f) +#define XO_10 ((inst >> 1) & 0x3ff) +#define XO_9 ((inst >> 1) & 0x1ff) +#define XO_5 ((inst >> 1) & 0x1f) +#define Rc (inst & 1) +#define SH ((inst >> 11) & 0x1f) +#define MB ((inst >> 6) & 0x1f) +#define ME ((inst >> 1) & 0x1f) +#define OE ((inst >> 10) & 1) +#define TO ((inst >> 21) & 0x1f) +#define CRFD ((inst >> 23) & 0x7) +#define CRFS ((inst >> 18) & 0x7) +#define CRBD ((inst >> 21) & 0x1f) +#define CRBA ((inst >> 16) & 0x1f) +#define CRBB ((inst >> 11) & 0x1f) +#define L ((inst >> 21) & 1) +#define NB ((inst >> 11) & 0x1f) +#define AA ((inst >> 1) & 1) +#define LK (inst & 1) +#define LI ((inst >> 2) & 0xffffff) +#define BO ((inst >> 21) & 0x1f) +#define BI ((inst >> 16) & 0x1f) +#define BD ((inst >> 2) & 0x3fff) + +#define MTFSFI_IMM ((inst >> 12) & 0xf) +#define FM ((inst >> 17) & 0xff) +#define SR ((inst >> 16) & 0xf) +#define SPR ((inst >> 11) & 0x3ff) +#define TBR ((inst >> 11) & 0x3ff) +#define CRM ((inst >> 12) & 0xff) + inline int SEX12(unsigned int x) + { + return x & 0x800 ? (x|0xFFFFF000) : x; + } + + static void ps(struct DisasmPara_PPC *dp,ppc_word inst) + { + ppc_word pc = *dp->iaddr; + char *op = dp->opcode; + char *pr = dp->operands; + switch((inst>>1)&0x1F) + { + case 6: + strcpy(op, "ps_lux"); + sprintf(pr, "p%u, (r%u + r%u)", FD, RA, RB); + return; + + case 18: + strcpy(op, "ps_div"); + sprintf(pr, "p%u, p%u/p%u", FD, FA, FB); + return; + case 20: + strcpy(op, "ps_sub"); + sprintf(pr, "p%u, p%u-p%u", FD, FA, FB); + return; + case 21: + strcpy(op, "ps_add"); + sprintf(pr, "p%u, p%u+p%u", FD, FA, FB); + return; + case 23: + strcpy(op, "ps_sel"); + sprintf(pr, "p%u>=0?p%u:p%u", FD, FA, FC, FB); + return; + case 24: + strcpy(op, "ps_res"); + sprintf(pr, "p%u, (1/p%u)", FD, FB); + return; + + case 25: + strcpy(op, "ps_mul"); + sprintf(pr, "p%u, p%u*p%u", FD, FA, FC); + return; + + case 26: //rsqrte + strcpy(op, "ps_rsqrte"); + sprintf(pr, "p%u, p%u", FD, FB); + return; + case 28: //msub + strcpy(op, "ps_msub"); + sprintf(pr, "p%u, p%u*p%u-p%u", FD, FA, FC, FB); + return; + case 29: //madd + strcpy(op, "ps_madd"); + sprintf(pr, "p%u, p%u*p%u+p%u", FD, FA, FC, FB); + return; + case 30: //nmsub + strcpy(op, "ps_nmsub"); + sprintf(pr, "p%u, -(p%u*p%u-p%u)", FD, FA, FC, FB); + return; + case 31: //nmadd + strcpy(op, "ps_nmadd"); + sprintf(pr, "p%u, -(p%u*p%u+p%u)", FD, FA, FC, FB); + return; + case 10: + strcpy(op, "ps_sum0"); + sprintf(pr, "p%u, 0=p%u+p%u, 1=p%u", FD, FA, FB, FC); + return; + case 11: + strcpy(op, "ps_sum1"); + sprintf(pr, "p%u, 0=p%u, 1=p%u+p%u", FD, FC, FA, FB); + return; + case 12: + strcpy(op, "ps_muls0"); + sprintf(pr, "p%u, p%u*p%u[0]", FD, FA, FC); + return; + case 13: + strcpy(op, "ps_muls1"); + sprintf(pr, "p%u, p%u*p%u[1]", FD, FA, FC); + return; + case 14: + strcpy(op, "ps_madds0"); + sprintf(pr, "p%u, p%u*p%u[0]+p%u", FD, FA, FC, FB); + return; + case 15: + strcpy(op, "ps_madds1"); + sprintf(pr, "p%u, p%u*p%u[1]+p%u", FD, FA, FC, FB); + return; + } + + switch((inst>>1)&0x3FF) + { + //10-bit suckers (?) + case 40: //nmadd + strcpy(op, "ps_neg"); + sprintf(pr, "p%u, -p%u", FD, FB); + return; + case 72: //nmadd + strcpy(op, "ps_mr"); + sprintf(pr, "p%u, p%u", FD, FB); + return; + case 136: + strcpy(op, "ps_nabs"); + sprintf(pr, "p%u, -|p%u|", FD, FB); + return; + case 264: + strcpy(op, "ps_abs"); + sprintf(pr, "p%u, |p%u|", FD, FB); + return; + case 0: + strcpy(op, "ps_cmpu0"); + sprintf(pr, "ps_cmpu0", FD); + return; + case 32: + strcpy(op,"ps_cmpq0"); + sprintf(pr, "ps_cmpo0", FD); + return; + case 64: + strcpy(op,"ps_cmpu1"); + sprintf(pr, "ps_cmpu1", FD); + return; + case 96: + strcpy(op,"ps_cmpo1"); + sprintf(pr, "ps_cmpo1", FD); + return; + case 528: + strcpy(op,"ps_merge00"); + sprintf(pr, "p%u, p%u[0],p%u[0]", FD, FA, FB); + return; + case 560: + strcpy(op,"ps_merge01"); + sprintf(pr, "p%u, p%u[0],p%u[1]", FD, FA, FB); + return; + case 592: + strcpy(op,"ps_merge10"); + sprintf(pr, "p%u, p%u[1],p%u[0]", FD, FA, FB); + return; + case 624: + strcpy(op,"ps_merge11"); + sprintf(pr, "p%u, p%u[1],p%u[1]", FD, FA, FB); + return; + case 1014: + strcpy(op,"dcbz_l"); + sprintf(pr, ""); + return; + } + + // default: + sprintf(op, "ps_%i",((inst>>1)&0x1f)); + strcpy(pr,"---"); + return; + } + + static void ps_mem(struct DisasmPara_PPC *dp,ppc_word inst) + { + ppc_word pc = *dp->iaddr; + char *op = dp->opcode; + char *pr = dp->operands; + switch(PPCGETIDX(inst)) + { + case 56: + strcpy(op,"psq_l"); + sprintf(pr, "p%u, %i(r%u)", RS, SEX12(inst&0xFFF), RA); + break; + case 57: + strcpy(op,"psq_lu"); + sprintf(pr, "", FD); + break; + case 60: + strcpy(op,"psq_st"); + sprintf(pr, "%i(r%u), p%u", SEX12(inst&0xFFF), RA, RS); + break; + case 61: + strcpy(op,"psq_stu"); + sprintf(pr, "r%u, p%u ?", RA, RS); + break; + } + } + + + ppc_word *PPC_Disassemble(struct DisasmPara_PPC *dp) + /* Disassemble PPC instruction and return a pointer to the next */ + /* instruction, or NULL if an error occured. */ + { + ppc_word in = *(dp->instr); + + if (dp->opcode==NULL || dp->operands==NULL) + return (NULL); /* no buffers */ + +#if LITTLEENDIAN + in = (in & 0xff)<<24 | (in & 0xff00)<<8 | (in & 0xff0000)>>8 | + (in & 0xff000000)>>24; +#endif + dp->type = PPCINSTR_OTHER; + dp->flags = 0; + *(dp->operands) = 0; + + switch (PPCGETIDX(in)) + { + case 1: + sprintf(dp->opcode,"HLE"); + //HLE call + break; + case 2: + trapi(dp,in,PPCF_64); /* tdi */ + break; + + case 3: + trapi(dp,in,0); /* twi */ + break; + case 4: + ps(dp,in); + break; + case 56: + case 57: + case 60: + case 61: + ps_mem(dp,in); + break; + + + case 7: + strcpy(dp->opcode,"mulli"); + imm(dp,in,0,0,0); + break; + + case 8: + strcpy(dp->opcode,"subfic"); + imm(dp,in,0,0,0); + break; + + case 10: + cmpi(dp,in,1); /* cmpli */ + break; + + case 11: + cmpi(dp,in,0); /* cmpi */ + break; + + case 12: + addi(dp,in,"ic"); /* addic */ + break; + + case 13: + addi(dp,in,"ic."); /* addic. */ + break; + + case 14: + addi(dp,in,"i"); /* addi */ + break; + + case 15: + addi(dp,in,"is"); /* addis */ + break; + + case 16: + bc(dp,in); + break; + + case 17: + if ((in & ~PPCIDXMASK) == 2) + strcpy(dp->opcode,"sc"); + else + ill(dp,in); + break; + + case 18: + bli(dp,in); + break; + + case 19: + switch (PPCGETIDX2(in)) { + case 0: + mcrf(dp,in,'\0'); /* mcrf */ + break; + + case 16: + branch(dp,in,"lr",0,0); /* bclr */ + break; + + case 33: + crop(dp,in,"nor","not"); /* crnor */ + break; + + case 50: + nooper(dp,in,"rfi",PPCF_SUPER); + break; + + case 129: + crop(dp,in,"andc",NULL); /* crandc */ + break; + + case 150: + nooper(dp,in,"isync",0); + break; + + case 193: + crop(dp,in,"xor","clr"); /* crxor */ + break; + + case 225: + crop(dp,in,"nand",NULL); /* crnand */ + break; + + case 257: + crop(dp,in,"and",NULL); /* crand */ + break; + + case 289: + crop(dp,in,"eqv","set"); /* creqv */ + break; + + case 417: + crop(dp,in,"orc",NULL); /* crorc */ + break; + + case 449: + crop(dp,in,"or","move"); /* cror */ + break; + + case 528: + branch(dp,in,"ctr",0,0); /* bcctr */ + break; + + default: + ill(dp,in); + break; + } + break; + + case 20: + rlw(dp,in,"imi",0); /* rlwimi */ + break; + + case 21: + rlw(dp,in,"inm",0); /* rlwinm */ + break; + + case 23: + rlw(dp,in,"nm",1); /* rlwnm */ + break; + + case 24: + if (in & ~PPCIDXMASK) + ori(dp,in,"ori"); + else + strcpy(dp->opcode,"nop"); + break; + + case 25: + ori(dp,in,"oris"); + break; + + case 26: + ori(dp,in,"xori"); + break; + + case 27: + ori(dp,in,"xoris"); + break; + + case 28: + ori(dp,in,"andi."); + break; + + case 29: + ori(dp,in,"andis."); + break; + + case 30: + switch (in & 0x1c) { + case 0: + rld(dp,in,"icl",0); /* rldicl */ + break; + case 1: + rld(dp,in,"icr",0); /* rldicr */ + break; + case 2: + rld(dp,in,"ic",0); /* rldic */ + break; + case 3: + rld(dp,in,"imi",0); /* rldimi */ + break; + case 4: + rld(dp,in,in&2?"cl":"cr",1); /* rldcl, rldcr */ + break; + default: + ill(dp,in); + break; + } + break; + + case 31: + switch (PPCGETIDX2(in)) { + case 0: + case 32: + if (in & 1) + ill(dp,in); + else + cmp(dp,in); /* cmp, cmpl */ + break; + + case 4: + if (in & 1) + ill(dp,in); + else + trap(dp,in,0); /* tw */ + break; + + case 8: + case (PPCOE>>1)+8: + dab(dp,swapab(in),"subc",7,0,1,-1,0); + break; + + case 9: + dab(dp,in,"mulhdu",7,0,0,-1,PPCF_64); + break; + + case 10: + case (PPCOE>>1)+10: + dab(dp,in,"addc",7,0,1,-1,0); + break; + + case 11: + dab(dp,in,"mulhwu",7,0,0,-1,0); + break; + + case 19: + if (in & (PPCAMASK|PPCBMASK)) + ill(dp,in); + else + dab(dp,in,"mfcr",4,0,0,0,0); + break; + + case 20: + dab(dp,in,"lwarx",7,0,0,0,0); + break; + + case 21: + dab(dp,in,"ldx",7,0,0,0,PPCF_64); + break; + + case 23: + dab(dp,in,"lwzx",7,0,0,0,0); + break; + + case 24: + dab(dp,in,"slw",7,1,0,-1,0); + break; + + case 26: + if (in & PPCBMASK) + ill(dp,in); + else + dab(dp,in,"cntlzw",6,1,0,-1,0); + break; + + case 27: + dab(dp,in,"sld",7,1,0,-1,PPCF_64); + break; + + case 28: + dab(dp,in,"and",7,1,0,-1,0); + break; + + case 40: + case (PPCOE>>1)+40: + dab(dp,swapab(in),"sub",7,0,1,-1,0); + break; + + case 53: + dab(dp,in,"ldux",7,0,0,0,PPCF_64); + break; + + case 54: + if (in & PPCDMASK) + ill(dp,in); + else + dab(dp,in,"dcbst",3,0,0,0,0); + break; + + case 55: + dab(dp,in,"lwzux",7,0,0,0,0); + break; + + case 58: + if (in & PPCBMASK) + ill(dp,in); + else + dab(dp,in,"cntlzd",6,1,0,-1,PPCF_64); + break; + + case 60: + dab(dp,in,"andc",7,1,0,-1,0); + break; + + case 68: + trap(dp,in,PPCF_64); /* td */ + break; + + case 73: + dab(dp,in,"mulhd",7,0,0,-1,PPCF_64); + break; + + case 75: + dab(dp,in,"mulhw",7,0,0,-1,0); + break; + + case 83: + if (in & (PPCAMASK|PPCBMASK)) + ill(dp,in); + else + dab(dp,in,"mfmsr",4,0,0,0,PPCF_SUPER); + break; + + case 84: + dab(dp,in,"ldarx",7,0,0,0,PPCF_64); + break; + + case 86: + if (in & PPCDMASK) + ill(dp,in); + else + dab(dp,in,"dcbf",3,0,0,0,0); + break; + + case 87: + dab(dp,in,"lbzx",7,0,0,0,0); + break; + + case 104: + case (PPCOE>>1)+104: + if (in & PPCBMASK) + ill(dp,in); + else + dab(dp,in,"neg",6,0,1,-1,0); + break; + + case 119: + dab(dp,in,"lbzux",7,0,0,0,0); + break; + + case 124: + if (PPCGETD(in) == PPCGETB(in)) + dab(dp,in,"not",6,1,0,-1,0); + else + dab(dp,in,"nor",7,1,0,-1,0); + break; + + case 136: + case (PPCOE>>1)+136: + dab(dp,in,"subfe",7,0,1,-1,0); + break; + + case 138: + case (PPCOE>>1)+138: + dab(dp,in,"adde",7,0,1,-1,0); + break; + + case 144: + mtcr(dp,in); + break; + + case 146: + if (in & (PPCAMASK|PPCBMASK)) + ill(dp,in); + else + dab(dp,in,"mtmsr",4,0,0,0,PPCF_SUPER); + break; + + case 149: + dab(dp,in,"stdx",7,0,0,0,PPCF_64); + break; + + case 150: + dab(dp,in,"stwcx.",7,0,0,1,0); + break; + + case 151: + dab(dp,in,"stwx",7,0,0,0,0); + break; + + case 181: + dab(dp,in,"stdux",7,0,0,0,PPCF_64); + break; + + case 183: + dab(dp,in,"stwux",7,0,0,0,0); + break; + + case 200: + case (PPCOE>>1)+200: + if (in & PPCBMASK) + ill(dp,in); + else + dab(dp,in,"subfze",6,0,1,-1,0); + break; + + case 202: + case (PPCOE>>1)+202: + if (in & PPCBMASK) + ill(dp,in); + else + dab(dp,in,"addze",6,0,1,-1,0); + break; + + case 210: + msr(dp,in,1); /* mfsr */ + break; + + case 214: + dab(dp,in,"stdcx.",7,0,0,1,PPCF_64); + break; + + case 215: + dab(dp,in,"stbx",7,0,0,0,0); + break; + + case 232: + case (PPCOE>>1)+232: + if (in & PPCBMASK) + ill(dp,in); + else + dab(dp,in,"subfme",6,0,1,-1,0); + break; + + case 233: + case (PPCOE>>1)+233: + dab(dp,in,"mulld",7,0,1,-1,PPCF_64); + break; + + case 234: + case (PPCOE>>1)+234: + if (in & PPCBMASK) + ill(dp,in); + else + dab(dp,in,"addme",6,0,1,-1,0); + break; + + case 235: + case (PPCOE>>1)+235: + dab(dp,in,"mullw",7,0,1,-1,0); + break; + + case 242: + if (in & PPCAMASK) + ill(dp,in); + else + dab(dp,in,"mtsrin",5,0,0,0,PPCF_SUPER); + break; + + case 246: + if (in & PPCDMASK) + ill(dp,in); + else + dab(dp,in,"dcbtst",3,0,0,0,0); + break; + + case 247: + dab(dp,in,"stbux",7,0,0,0,0); + break; + + case 266: + case (PPCOE>>1)+266: + dab(dp,in,"add",7,0,1,-1,0); + break; + + case 278: + if (in & PPCDMASK) + ill(dp,in); + else + dab(dp,in,"dcbt",3,0,0,0,0); + break; + + case 279: + dab(dp,in,"lhzx",7,0,0,0,0); + break; + + case 284: + dab(dp,in,"eqv",7,1,0,-1,0); + break; + + case 306: + if (in & (PPCDMASK|PPCAMASK)) + ill(dp,in); + else + dab(dp,in,"tlbie",1,0,0,0,PPCF_SUPER); + break; + + case 310: + dab(dp,in,"eciwx",7,0,0,0,0); + break; + + case 311: + dab(dp,in,"lhzux",7,0,0,0,0); + break; + + case 316: + dab(dp,in,"xor",7,1,0,-1,0); + break; + + case 339: + mspr(dp,in,0); /* mfspr */ + break; + + case 341: + dab(dp,in,"lwax",7,0,0,0,PPCF_64); + break; + + case 343: + dab(dp,in,"lhax",7,0,0,0,0); + break; + + case 370: + nooper(dp,in,"tlbia",PPCF_SUPER); + break; + + case 371: + mtb(dp,in); /* mftb */ + break; + + case 373: + dab(dp,in,"lwaux",7,0,0,0,PPCF_64); + break; + + case 375: + dab(dp,in,"lhaux",7,0,0,0,0); + break; + + case 407: + dab(dp,in,"sthx",7,0,0,0,0); + break; + + case 412: + dab(dp,in,"orc",7,1,0,-1,0); + break; + + case 413: + sradi(dp,in); /* sradi */ + break; + + case 434: + if (in & (PPCDMASK|PPCAMASK)) + ill(dp,in); + else + dab(dp,in,"slbie",1,0,0,0,PPCF_SUPER|PPCF_64); + break; + + case 438: + dab(dp,in,"ecowx",7,0,0,0,0); + break; + + case 439: + dab(dp,in,"sthux",7,0,0,0,0); + break; + + case 444: + if (PPCGETD(in) == PPCGETB(in)) + dab(dp,in,"mr",6,1,0,-1,0); + else + dab(dp,in,"or",7,1,0,-1,0); + break; + + case 457: + case (PPCOE>>1)+457: + dab(dp,in,"divdu",7,0,1,-1,PPCF_64); + break; + + case 459: + case (PPCOE>>1)+459: + dab(dp,in,"divwu",7,0,1,-1,0); + break; + + case 467: + mspr(dp,in,1); /* mtspr */ + break; + + case 470: + if (in & PPCDMASK) + ill(dp,in); + else + dab(dp,in,"dcbi",3,0,0,0,0); + break; + + case 476: + dab(dp,in,"nand",7,1,0,-1,0); + break; + + case 489: + case (PPCOE>>1)+489: + dab(dp,in,"divd",7,0,1,-1,PPCF_64); + break; + + case 491: + case (PPCOE>>1)+491: + dab(dp,in,"divw",7,0,1,-1,0); + break; + + case 498: + nooper(dp,in,"slbia",PPCF_SUPER|PPCF_64); + break; + + case 512: + if (in & 0x007ff801) + ill(dp,in); + else { + strcpy(dp->opcode,"mcrxr"); + sprintf(dp->operands,"cr%d",(int)PPCGETCRD(in)); + } + break; + + case 533: + dab(dp,in,"lswx",7,0,0,0,0); + break; + + case 534: + dab(dp,in,"lwbrx",7,0,0,0,0); + break; + + case 535: + fdab(dp,in,"lfsx",7); + break; + + case 536: + dab(dp,in,"srw",7,1,0,-1,0); + break; + + case 539: + dab(dp,in,"srd",7,1,0,-1,PPCF_64); + break; + + case 566: + nooper(dp,in,"tlbsync",PPCF_SUPER); + break; + + case 567: + fdab(dp,in,"lfsux",7); + break; + + case 595: + msr(dp,in,0); /* mfsr */ + break; + + case 597: + rrn(dp,in,"lswi",0,0,0,0); + break; + + case 598: + nooper(dp,in,"sync",PPCF_SUPER); + break; + + case 599: + fdab(dp,in,"lfdx",7); + break; + + case 631: + fdab(dp,in,"lfdux",7); + break; + + case 659: + if (in & PPCAMASK) + ill(dp,in); + else + dab(dp,in,"mfsrin",5,0,0,0,PPCF_SUPER); + break; + + case 661: + dab(dp,in,"stswx",7,0,0,0,0); + break; + + case 662: + dab(dp,in,"stwbrx",7,0,0,0,0); + break; + + case 663: + fdab(dp,in,"stfsx",7); + break; + + case 695: + fdab(dp,in,"stfsux",7); + break; + + case 725: + rrn(dp,in,"stswi",0,0,0,0); + break; + + case 727: + fdab(dp,in,"stfdx",7); + break; + + case 759: + fdab(dp,in,"stfdux",7); + break; + + case 790: + dab(dp,in,"lhbrx",7,0,0,0,0); + break; + + case 792: + dab(dp,in,"sraw",7,1,0,-1,0); + break; + + case 794: + dab(dp,in,"srad",7,1,0,-1,PPCF_64); + break; + + case 824: + rrn(dp,in,"srawi",1,0,-1,0); + break; + + case 854: + nooper(dp,in,"eieio",PPCF_SUPER); + break; + + case 918: + dab(dp,in,"sthbrx",7,0,0,0,0); + break; + + case 922: + if (in & PPCBMASK) + ill(dp,in); + else + dab(dp,in,"extsh",6,1,0,-1,0); + break; + + case 954: + if (in & PPCBMASK) + ill(dp,in); + else + dab(dp,in,"extsb",6,1,0,-1,0); + break; + + case 982: + if (in & PPCDMASK) + ill(dp,in); + else + dab(dp,in,"icbi",3,0,0,0,0); + break; + + case 983: + fdab(dp,in,"stfiwx",7); + break; + + case 986: + if (in & PPCBMASK) + ill(dp,in); + else + dab(dp,in,"extsw",6,1,0,-1,PPCF_64); + break; + + case 1014: + if (in & PPCDMASK) + ill(dp,in); + else + dab(dp,in,"dcbz",3,0,0,0,0); + break; + + default: + ill(dp,in); + break; + } + break; + + case 32: + case 33: + case 34: + case 35: + case 36: + case 37: + case 38: + case 39: + case 40: + case 41: + case 42: + case 43: + case 44: + case 45: + case 46: + case 47: + ldst(dp,in,ldstnames[PPCGETIDX(in)-32],'r',0); + break; + + case 48: + case 49: + case 50: + case 51: + case 52: + case 53: + case 54: + case 55: + ldst(dp,in,ldstnames[PPCGETIDX(in)-32],'f',0); + break; + + case 58: + switch (in & 3) { + case 0: + ldst(dp,in&~3,"ld",'r',PPCF_64); + break; + case 1: + ldst(dp,in&~3,"ldu",'r',PPCF_64); + break; + case 2: + ldst(dp,in&~3,"lwa",'r',PPCF_64); + break; + default: + ill(dp,in); + break; + } + break; + + case 59: + switch (in & 0x3e) { + case 36: + fdabc(dp,in,"divs",6,0); + break; + + case 40: + fdabc(dp,in,"subs",6,0); + break; + + case 42: + fdabc(dp,in,"adds",6,0); + break; + + case 44: + fdabc(dp,in,"sqrts",2,0); + break; + + case 48: + fdabc(dp,in,"res",2,0); + break; + + case 50: + fdabc(dp,in,"muls",5,0); + break; + + case 56: + fdabc(dp,in,"msubs",7,0); + break; + + case 58: + fdabc(dp,in,"madds",7,0); + break; + + case 60: + fdabc(dp,in,"nmsubs",7,0); + break; + + case 62: + fdabc(dp,in,"nmadds",7,0); + break; + + default: + ill(dp,in); + break; + } + break; + + case 62: + switch (in & 3) { + case 0: + ldst(dp,in&~3,"std",'r',PPCF_64); + break; + case 1: + ldst(dp,in&~3,"stdu",'r',PPCF_64); + break; + default: + ill(dp,in); + break; + } + break; + + case 63: + if (in & 32) { + switch (in & 0x1e) { + case 4: + fdabc(dp,in,"div",6,0); + break; + + case 8: + fdabc(dp,in,"sub",6,0); + break; + + case 10: + fdabc(dp,in,"add",6,0); + break; + + case 12: + fdabc(dp,in,"sqrt",2,0); + break; + + case 14: + fdabc(dp,in,"sel",7,0); + break; + + case 18: + fdabc(dp,in,"mul",5,0); + break; + + case 20: + fdabc(dp,in,"sqrte",2,0); + break; + + case 24: + fdabc(dp,in,"msub",7,0); + break; + + case 26: + fdabc(dp,in,"madd",7,0); + break; + + case 28: + fdabc(dp,in,"nmsub",7,0); + break; + + case 30: + fdabc(dp,in,"nmadd",7,0); + break; + + default: + ill(dp,in); + break; + } + } + + else { + switch (PPCGETIDX2(in)) { + case 0: + fcmp(dp,in,'u'); + break; + + case 12: + fdabc(dp,in,"rsp",10,0); + break; + + case 14: + fdabc(dp,in,"ctiw",10,0); + break; + + case 15: + fdabc(dp,in,"ctiwz",10,0); + break; + + case 32: + fcmp(dp,in,'o'); + break; + + case 38: + mtfsb(dp,in,1); + break; + + case 40: + fdabc(dp,in,"neg",10,0); + break; + + case 64: + mcrf(dp,in,'s'); /* mcrfs */ + break; + + case 70: + mtfsb(dp,in,0); + break; + + case 72: + fdabc(dp,in,"mr",10,0); + break; + + case 134: + if (!(in & 0x006f0800)) { + sprintf(dp->opcode,"mtfsfi%s",rcsel[in&1]); + sprintf(dp->operands,"cr%d,%d",(int)PPCGETCRD(in), + (int)(in & 0xf000)>>12); + } + else + ill(dp,in); + break; + + case 136: + fdabc(dp,in,"nabs",10,0); + break; + + case 264: + fdabc(dp,in,"abs",10,0); + break; + + case 583: + if (in & (PPCAMASK|PPCBMASK)) + ill(dp,in); + else + dab(dp,in,"mffs",4,0,0,-1,0); + break; + + case 711: + if (!(in & 0x02010000)) { + sprintf(dp->opcode,"mtfsf%s",rcsel[in&1]); + sprintf(dp->operands,"0x%x,%d", + (unsigned)(in & 0x01fe)>>17,(int)PPCGETB(in)); + } + else + ill(dp,in); + break; + + case 814: + fdabc(dp,in,"fctid",10,PPCF_64); + break; + + case 815: + fdabc(dp,in,"fctidz",10,PPCF_64); + break; + + case 846: + fdabc(dp,in,"fcfid",10,PPCF_64); + break; + + default: + ill(dp,in); + break; + } + } + break; + + default: + ill(dp,in); + break; + } + return (dp->instr + 1); + } +} + +// --------------------------------------------------------------------------- + +// simplified interface + +const char *DisassembleGekko(unsigned int opcode, unsigned int curInstAddr) +{ + char opcodeStr[32], operandStr[32]; + PPCDisasm::DisasmPara_PPC dp; + static char buf[128]; + static unsigned int opc, adr; + + opc = opcode; + adr = curInstAddr; + + dp.opcode = opcodeStr; + dp.operands = operandStr; + dp.instr = (PPCDisasm::ppc_word *)&opc; + dp.iaddr = (PPCDisasm::ppc_word *)&adr; + + PPCDisasm::PPC_Disassemble(&dp); + + //sprintf(buf, "%-10s %s", opcodeStr, operandStr); + sprintf(buf, "%s\t%s", opcodeStr, operandStr); + return buf; +} + + +static const char *gprnames[] = +{ + "r00", "r01", "r02", "r03", "r04", "r05", "r06", "r07", + "r08", "r09", "r10", "r11", "r12", "r13", "r14", "r15", + "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23", + "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31" +}; + +const char *GetGRPName(unsigned int index) +{ + if (index < 32) + return gprnames[index]; + return 0; +} \ No newline at end of file diff --git a/Externals/Bochs_disasm/PowerPCDisasm.h b/Externals/Bochs_disasm/PowerPCDisasm.h new file mode 100644 index 0000000000..b6e71039e1 --- /dev/null +++ b/Externals/Bochs_disasm/PowerPCDisasm.h @@ -0,0 +1,28 @@ +/* $VER: ppc_disasm V0.1 (23.05.1998) + * + * Disassembler module for the PowerPC microprocessor family + * Copyright (c) 1998-2000 Frank Wille + * + * ppc_disasm.c is freeware and may be freely redistributed as long as + * no modifications are made and nothing is charged for it. + * Non-commercial usage is allowed without any restrictions. + * EVERY PRODUCT OR PROGRAM DERIVED DIRECTLY FROM MY SOURCE MAY NOT BE + * SOLD COMMERCIALLY WITHOUT PERMISSION FROM THE AUTHOR. + * + * + * v0.1 (23.05.1998) phx + * First version, which implements all PowerPC instructions. + * v0.0 (09.05.1998) phx + * File created. + */ + + +// Yeah, this does not really belong in bochs_disasm, but hey, it's a disasm and it needed a common location... + +#ifndef _POWERPC_DISASM +#define _POWERPC_DISASM + +const char *DisassembleGekko(unsigned int opcode, unsigned int curInstAddr); +const char *GetGRPName(unsigned int index); + +#endif diff --git a/Externals/Bochs_disasm/SConscript b/Externals/Bochs_disasm/SConscript new file mode 100644 index 0000000000..9890bb8d50 --- /dev/null +++ b/Externals/Bochs_disasm/SConscript @@ -0,0 +1,11 @@ +Import('env') + +files = ["dis_decode.cpp", + "dis_groups.cpp", + "resolve.cpp", + "syntax.cpp", + "PowerPCDisasm.cpp", + ] + +env_bochs = env.Copy(CXXFLAGS = " -fPIC ") +env_bochs.StaticLibrary("bdisasm", files) diff --git a/Externals/Bochs_disasm/config.h b/Externals/Bochs_disasm/config.h new file mode 100644 index 0000000000..1f6f3743c4 --- /dev/null +++ b/Externals/Bochs_disasm/config.h @@ -0,0 +1,41 @@ +#ifndef _BOCHS_CONFIG_H +#define _BOCHS_CONFIG_H + +#ifdef _WIN32 +typedef signed __int8 Bit8s; +typedef signed __int16 Bit16s; +typedef signed __int32 Bit32s; +typedef signed __int64 Bit64s; + +typedef unsigned __int8 Bit8u; +typedef unsigned __int16 Bit16u; +typedef unsigned __int32 Bit32u; +typedef unsigned __int64 Bit64u; + +typedef bool bx_bool; +typedef Bit64u bx_address; + +#define BX_CPP_INLINE inline + +#else + +#include + +typedef int8_t Bit8s; +typedef int16_t Bit16s; +typedef int32_t Bit32s; +typedef int64_t Bit64s; + +typedef uint8_t Bit8u; +typedef uint16_t Bit16u; +typedef uint32_t Bit32u; +typedef uint64_t Bit64u; + +typedef bool bx_bool; +typedef Bit64u bx_address; + +#define BX_CPP_INLINE inline + +#endif + +#endif diff --git a/Externals/Bochs_disasm/dis_decode.cpp b/Externals/Bochs_disasm/dis_decode.cpp new file mode 100644 index 0000000000..3734578658 --- /dev/null +++ b/Externals/Bochs_disasm/dis_decode.cpp @@ -0,0 +1,328 @@ +///////////////////////////////////////////////////////////////////////// +// $Id: dis_decode.cc,v 1.32 2006/05/12 17:04:19 sshwarts Exp $ +///////////////////////////////////////////////////////////////////////// + +#include +#include +#include + +#include "disasm.h" +#include "dis_tables.h" + +#define OPCODE(entry) ((BxDisasmOpcodeInfo_t*) entry->OpcodeInfo) +#define OPCODE_TABLE(entry) ((BxDisasmOpcodeTable_t*) entry->OpcodeInfo) + +#ifndef NULL +#define NULL 0 +#endif + + +static const unsigned char instruction_has_modrm[512] = { + /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ + /* ------------------------------- */ + /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, + /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, + /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, + /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, + /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, + /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + /* A0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + /* B0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + /* C0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, + /* D0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, + /* E0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + /* F0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1, + /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ + /* ------------------------------- */ + 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0F 00 */ + 1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1, /* 0F 10 */ + 1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,1, /* 0F 20 */ + 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 0F 30 */ + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 0F 40 */ + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 0F 50 */ + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 0F 60 */ + 1,1,1,1,1,1,1,0,0,0,0,0,1,1,1,1, /* 0F 70 */ + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0F 80 */ + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 0F 90 */ + 0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,1, /* 0F A0 */ + 1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1, /* 0F B0 */ + 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* 0F C0 */ + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 0F D0 */ + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 0F E0 */ + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0 /* 0F F0 */ + /* ------------------------------- */ + /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ +}; + +unsigned disassembler::disasm(bx_bool is_32, bx_bool is_64, bx_address base, bx_address ip, const Bit8u *instr, char *disbuf) +{ + x86_insn insn = decode(is_32, is_64, base, ip, instr, disbuf); + return insn.ilen; +} + +x86_insn disassembler::decode(bx_bool is_32, bx_bool is_64, bx_address base, bx_address ip, const Bit8u *instr, char *disbuf) +{ + x86_insn insn(is_32, is_64); + const Bit8u *instruction_begin = instruction = instr; + resolve_modrm = NULL; + unsigned b3 = 0; + + db_eip = ip; + db_base = base; // cs linear base (base for PM & cs<<4 for RM & VM) + + disbufptr = disbuf; // start sprintf()'ing into beginning of buffer + +#define SSE_PREFIX_NONE 0 +#define SSE_PREFIX_66 1 +#define SSE_PREFIX_F2 2 +#define SSE_PREFIX_F3 3 /* only one SSE prefix could be used */ + unsigned sse_prefix = SSE_PREFIX_NONE; + + for(;;) + { + insn.b1 = fetch_byte(); + insn.prefixes++; + + switch(insn.b1) { + case 0x40: // rex + case 0x41: + case 0x42: + case 0x43: + case 0x44: + case 0x45: + case 0x46: + case 0x47: + case 0x48: + case 0x49: + case 0x4A: + case 0x4B: + case 0x4C: + case 0x4D: + case 0x4E: + case 0x4F: + if (! is_64) break; + insn.extend8b = 1; + if (insn.b1 & 0x8) { + insn.os_64 = 1; + insn.os_32 = 1; + } + if (insn.b1 & 0x4) insn.rex_r = 8; + if (insn.b1 & 0x2) insn.rex_x = 8; + if (insn.b1 & 0x1) insn.rex_b = 8; + continue; + + case 0x26: // ES: + if (! is_64) insn.seg_override = ES_REG; + continue; + + case 0x2e: // CS: + if (! is_64) insn.seg_override = CS_REG; + continue; + + case 0x36: // SS: + if (! is_64) insn.seg_override = SS_REG; + continue; + + case 0x3e: // DS: + if (! is_64) insn.seg_override = DS_REG; + continue; + + case 0x64: // FS: + insn.seg_override = FS_REG; + continue; + + case 0x65: // GS: + insn.seg_override = GS_REG; + continue; + + case 0x66: // operand size override + if (!insn.os_64) insn.os_32 = !is_32; + if (!sse_prefix) sse_prefix = SSE_PREFIX_66; + continue; + + case 0x67: // address size override + if (!is_64) insn.as_32 = !is_32; + insn.as_64 = 0; + continue; + + case 0xf0: // lock + continue; + + case 0xf2: // repne + if (!sse_prefix) sse_prefix = SSE_PREFIX_F2; + continue; + + case 0xf3: // rep + if (!sse_prefix) sse_prefix = SSE_PREFIX_F3; + continue; + + // no more prefixes + default: + break; + } + + insn.prefixes--; + break; + } + + if (insn.b1 == 0x0f) + { + insn.b1 = 0x100 | fetch_byte(); + } + + const BxDisasmOpcodeTable_t *opcode_table, *entry; + + if (is_64) { + if (insn.os_64) + opcode_table = BxDisasmOpcodes64q; + else if (insn.os_32) + opcode_table = BxDisasmOpcodes64d; + else + opcode_table = BxDisasmOpcodes64w; + } else { + if (insn.os_32) + opcode_table = BxDisasmOpcodes32; + else + opcode_table = BxDisasmOpcodes16; + } + + entry = opcode_table + insn.b1; + + // will require 3rd byte for 3-byte opcode + if (entry->Attr & _GRP3BTAB) b3 = fetch_byte(); + + if (instruction_has_modrm[insn.b1]) + { + decode_modrm(&insn); + } + + int attr = entry->Attr; + while(attr) + { + switch(attr) { + case _GROUPN: + entry = &(OPCODE_TABLE(entry)[insn.nnn]); + break; + + case _GRPSSE: + if(sse_prefix) insn.prefixes--; + /* For SSE opcodes, look into another 4 entries table + with the opcode prefixes (NONE, 0x66, 0xF2, 0xF3) */ + entry = &(OPCODE_TABLE(entry)[sse_prefix]); + break; + + case _SPLIT11B: + entry = &(OPCODE_TABLE(entry)[insn.mod != 3]); /* REG/MEM */ + break; + + case _GRPRM: + entry = &(OPCODE_TABLE(entry)[insn.rm]); + break; + + case _GRPFP: + if(insn.mod != 3) + { + entry = &(OPCODE_TABLE(entry)[insn.nnn]); + } else { + int index = (insn.b1-0xD8)*64 + (insn.modrm & 0x3f); + entry = &(BxDisasmOpcodeInfoFP[index]); + } + break; + + case _GRP3DNOW: + entry = &(BxDisasm3DNowGroup[peek_byte()]); + break; + + case _GRP3BTAB: + entry = &(OPCODE_TABLE(entry)[b3 >> 4]); + break; + + case _GRP3BOP: + entry = &(OPCODE_TABLE(entry)[b3 & 15]); + break; + + default: + printf("Internal disassembler error - unknown attribute !\n"); + return x86_insn(is_32, is_64); + } + + /* get additional attributes from group table */ + attr = entry->Attr; + } + +#define BRANCH_NOT_TAKEN 0x2E +#define BRANCH_TAKEN 0x3E + + unsigned branch_hint = 0; + + // print prefixes + for(unsigned i=0;iIntelOpcode); + } + + // branch hint for jcc instructions + if ((insn.b1 >= 0x070 && insn.b1 <= 0x07F) || + (insn.b1 >= 0x180 && insn.b1 <= 0x18F)) + { + if (prefix_byte == BRANCH_NOT_TAKEN || prefix_byte == BRANCH_TAKEN) + branch_hint = prefix_byte; + } + } + + const BxDisasmOpcodeInfo_t *opcode = OPCODE(entry); + + // patch jecx opcode + if (insn.b1 == 0xE3 && insn.as_32 && !insn.as_64) + opcode = &Ia_jecxz_Jb; + + // fix nop opcode + if (insn.b1 == 0x90 && !insn.rex_b) { + opcode = &Ia_nop; + } + + // print instruction disassembly + if (intel_mode) + print_disassembly_intel(&insn, opcode); + else + print_disassembly_att (&insn, opcode); + + if (branch_hint == BRANCH_NOT_TAKEN) + { + dis_sprintf(", not taken"); + } + else if (branch_hint == BRANCH_TAKEN) + { + dis_sprintf(", taken"); + } + + insn.ilen = (unsigned)(instruction - instruction_begin); + + return insn; +} + +void disassembler::dis_sprintf(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + vsprintf(disbufptr, fmt, ap); + va_end(ap); + + disbufptr += strlen(disbufptr); +} + +void disassembler::dis_putc(char symbol) +{ + *disbufptr++ = symbol; + *disbufptr = 0; +} diff --git a/Externals/Bochs_disasm/dis_groups.cpp b/Externals/Bochs_disasm/dis_groups.cpp new file mode 100644 index 0000000000..75c9934aef --- /dev/null +++ b/Externals/Bochs_disasm/dis_groups.cpp @@ -0,0 +1,607 @@ +///////////////////////////////////////////////////////////////////////// +// $Id: dis_groups.cc,v 1.33 2006/08/13 09:40:07 sshwarts Exp $ +///////////////////////////////////////////////////////////////////////// + +#include +#include +#include "disasm.h" + +/* +#if BX_DEBUGGER +#include "../bx_debug/debug.h" +#endif +*/ + +void disassembler::Apw(const x86_insn *insn) +{ + Bit16u imm16 = fetch_word(); + Bit16u cs_selector = fetch_word(); + dis_sprintf("%04x:%04x", (unsigned) cs_selector, (unsigned) imm16); +} + +void disassembler::Apd(const x86_insn *insn) +{ + Bit32u imm32 = fetch_dword(); + Bit16u cs_selector = fetch_word(); + dis_sprintf("%04x:%08x", (unsigned) cs_selector, (unsigned) imm32); +} + +// 8-bit general purpose registers +void disassembler::AL(const x86_insn *insn) { dis_sprintf("%s", general_8bit_regname[rAX_REG]); } +void disassembler::CL(const x86_insn *insn) { dis_sprintf("%s", general_8bit_regname[rCX_REG]); } + +// 16-bit general purpose registers +void disassembler::AX(const x86_insn *insn) { + dis_sprintf("%s", general_16bit_regname[rAX_REG]); +} + +void disassembler::DX(const x86_insn *insn) { + dis_sprintf("%s", general_16bit_regname[rDX_REG]); +} + +// 32-bit general purpose registers +void disassembler::EAX(const x86_insn *insn) +{ + dis_sprintf("%s", general_32bit_regname[rAX_REG]); +} + +// 64-bit general purpose registers +void disassembler::RAX(const x86_insn *insn) +{ + dis_sprintf("%s", general_64bit_regname[rAX_REG]); +} + +// segment registers +void disassembler::CS(const x86_insn *insn) { dis_sprintf("%s", segment_name[CS_REG]); } +void disassembler::DS(const x86_insn *insn) { dis_sprintf("%s", segment_name[DS_REG]); } +void disassembler::ES(const x86_insn *insn) { dis_sprintf("%s", segment_name[ES_REG]); } +void disassembler::SS(const x86_insn *insn) { dis_sprintf("%s", segment_name[SS_REG]); } +void disassembler::FS(const x86_insn *insn) { dis_sprintf("%s", segment_name[FS_REG]); } +void disassembler::GS(const x86_insn *insn) { dis_sprintf("%s", segment_name[GS_REG]); } + +void disassembler::Sw(const x86_insn *insn) { dis_sprintf("%s", segment_name[insn->nnn]); } + +// test registers +void disassembler::Td(const x86_insn *insn) +{ + if (intel_mode) + dis_sprintf ("tr%d", insn->nnn); + else + dis_sprintf("%%tr%d", insn->nnn); +} + +// control register +void disassembler::Cd(const x86_insn *insn) +{ + if (intel_mode) + dis_sprintf ("cr%d", insn->nnn); + else + dis_sprintf("%%cr%d", insn->nnn); +} + +void disassembler::Cq(const x86_insn *insn) { Cd(insn); } + +// debug register +void disassembler::Dd(const x86_insn *insn) +{ + if (intel_mode) + dis_sprintf ("db%d", insn->nnn); + else + dis_sprintf("%%db%d", insn->nnn); +} + +void disassembler::Dq(const x86_insn *insn) { Dd(insn); } + +// 8-bit general purpose register +void disassembler::R8(const x86_insn *insn) +{ + unsigned reg = (insn->b1 & 7) | insn->rex_b; + + if (reg < 4 || insn->extend8b) + dis_sprintf("%s", general_8bit_regname_rex[reg]); + else + dis_sprintf("%s", general_8bit_regname[reg]); +} + +// 16-bit general purpose register +void disassembler::RX(const x86_insn *insn) +{ + dis_sprintf("%s", general_16bit_regname[(insn->b1 & 7) | insn->rex_b]); +} + +// 32-bit general purpose register +void disassembler::ERX(const x86_insn *insn) +{ + dis_sprintf("%s", general_32bit_regname[(insn->b1 & 7) | insn->rex_b]); +} + +// 64-bit general purpose register +void disassembler::RRX(const x86_insn *insn) +{ + dis_sprintf("%s", general_64bit_regname[(insn->b1 & 7) | insn->rex_b]); +} + +// general purpose register or memory operand +void disassembler::Eb(const x86_insn *insn) +{ + if (insn->mod == 3) { + if (insn->rm < 4 || insn->extend8b) + dis_sprintf("%s", general_8bit_regname_rex[insn->rm]); + else + dis_sprintf("%s", general_8bit_regname[insn->rm]); + } + else + (this->*resolve_modrm)(insn, B_SIZE); +} + +void disassembler::Ew(const x86_insn *insn) +{ + if (insn->mod == 3) + dis_sprintf("%s", general_16bit_regname[insn->rm]); + else + (this->*resolve_modrm)(insn, W_SIZE); +} + +void disassembler::Ed(const x86_insn *insn) +{ + if (insn->mod == 3) + dis_sprintf("%s", general_32bit_regname[insn->rm]); + else + (this->*resolve_modrm)(insn, D_SIZE); +} + +void disassembler::Eq(const x86_insn *insn) +{ + if (insn->mod == 3) + dis_sprintf("%s", general_64bit_regname[insn->rm]); + else + (this->*resolve_modrm)(insn, Q_SIZE); +} + +// general purpose register +void disassembler::Gb(const x86_insn *insn) +{ + if (insn->nnn < 4 || insn->extend8b) + dis_sprintf("%s", general_8bit_regname_rex[insn->nnn]); + else + dis_sprintf("%s", general_8bit_regname[insn->nnn]); +} + +void disassembler::Gw(const x86_insn *insn) +{ + dis_sprintf("%s", general_16bit_regname[insn->nnn]); +} + +void disassembler::Gd(const x86_insn *insn) +{ + dis_sprintf("%s", general_32bit_regname[insn->nnn]); +} + +void disassembler::Gq(const x86_insn *insn) +{ + dis_sprintf("%s", general_64bit_regname[insn->nnn]); +} + +// immediate +void disassembler::I1(const x86_insn *insn) +{ + if (! intel_mode) dis_putc('$'); + dis_putc ('1'); +} + +void disassembler::Ib(const x86_insn *insn) +{ + if (! intel_mode) dis_putc('$'); + dis_sprintf("0x%02x", (unsigned) fetch_byte()); +} + +void disassembler::Iw(const x86_insn *insn) +{ + if (! intel_mode) dis_putc('$'); + dis_sprintf("0x%04x", (unsigned) fetch_word()); +} + +void disassembler::IwIb(const x86_insn *insn) +{ + Bit16u iw = fetch_word(); + Bit8u ib = fetch_byte(); + + if (intel_mode) { + dis_sprintf("0x%04x, 0x%02x", iw, ib); + } + else { + dis_sprintf("$0x%02x, $0x%04x", ib, iw); + } +} + +void disassembler::Id(const x86_insn *insn) +{ + if (! intel_mode) dis_putc('$'); + dis_sprintf("0x%08x", (unsigned) fetch_dword()); +} + +void disassembler::Iq(const x86_insn *insn) +{ + Bit64u value = fetch_qword(); + + if (! intel_mode) dis_putc('$'); + dis_sprintf("0x%08x%08x", + (unsigned)(value>>32), (unsigned)(value & 0xffffffff)); +} + +// sign extended immediate +void disassembler::sIbw(const x86_insn *insn) +{ + if (! intel_mode) dis_putc('$'); + Bit16u imm16 = (Bit8s) fetch_byte(); + dis_sprintf("0x%04x", (unsigned) imm16); +} + +// sign extended immediate +void disassembler::sIbd(const x86_insn *insn) +{ + if (! intel_mode) dis_putc('$'); + Bit32u imm32 = (Bit8s) fetch_byte(); + dis_sprintf ("0x%08x", (unsigned) imm32); +} + +// sign extended immediate +void disassembler::sIbq(const x86_insn *insn) +{ + if (! intel_mode) dis_putc('$'); + Bit64u imm64 = (Bit8s) fetch_byte(); + dis_sprintf ("0x%08x%08x", + (unsigned)(imm64>>32), (unsigned)(imm64 & 0xffffffff)); +} + +// sign extended immediate +void disassembler::sIdq(const x86_insn *insn) +{ + if (! intel_mode) dis_putc('$'); + Bit64u imm64 = (Bit32s) fetch_dword(); + dis_sprintf ("0x%08x%08x", + (unsigned)(imm64>>32), (unsigned)(imm64 & 0xffffffff)); +} + +// floating point +void disassembler::ST0(const x86_insn *insn) +{ + if (intel_mode) + dis_sprintf ("st(0)"); + else + dis_sprintf("%%st(0)"); +} + +void disassembler::STi(const x86_insn *insn) +{ + if (intel_mode) + dis_sprintf ("st(%d)", insn->rm); + else + dis_sprintf("%%st(%d)", insn->rm); +} + +// 16-bit general purpose register +void disassembler::Rw(const x86_insn *insn) +{ + dis_sprintf("%s", general_16bit_regname[insn->rm]); +} + +// 32-bit general purpose register +void disassembler::Rd(const x86_insn *insn) +{ + dis_sprintf("%s", general_32bit_regname[insn->rm]); +} + +// 64-bit general purpose register +void disassembler::Rq(const x86_insn *insn) +{ + dis_sprintf("%s", general_64bit_regname[insn->rm]); +} + +// mmx register +void disassembler::Pq(const x86_insn *insn) +{ + if (intel_mode) + dis_sprintf ("mm%d", insn->nnn); + else + dis_sprintf("%%mm%d", insn->nnn); +} + +void disassembler::Nq(const x86_insn *insn) +{ + if (intel_mode) + dis_sprintf ("mm%d", insn->rm); + else + dis_sprintf("%%mm%d", insn->rm); +} + +void disassembler::Qd(const x86_insn *insn) +{ + if (insn->mod == 3) + { + if (intel_mode) + dis_sprintf ("mm%d", insn->rm); + else + dis_sprintf("%%mm%d", insn->rm); + } + else + (this->*resolve_modrm)(insn, D_SIZE); +} + +void disassembler::Qq(const x86_insn *insn) +{ + if (insn->mod == 3) + { + if (intel_mode) + dis_sprintf ("mm%d", insn->rm); + else + dis_sprintf("%%mm%d", insn->rm); + } + else + (this->*resolve_modrm)(insn, Q_SIZE); +} + +// xmm register +void disassembler::Udq(const x86_insn *insn) +{ + if (intel_mode) + dis_sprintf ("xmm%d", insn->rm); + else + dis_sprintf("%%xmm%d", insn->rm); +} + +void disassembler::Vq(const x86_insn *insn) +{ + if (intel_mode) + dis_sprintf ("xmm%d", insn->nnn); + else + dis_sprintf("%%xmm%d", insn->nnn); +} + +void disassembler::Vdq(const x86_insn *insn) { Vq(insn); } +void disassembler::Vss(const x86_insn *insn) { Vq(insn); } +void disassembler::Vsd(const x86_insn *insn) { Vq(insn); } +void disassembler::Vps(const x86_insn *insn) { Vq(insn); } +void disassembler::Vpd(const x86_insn *insn) { Vq(insn); } + +void disassembler::Wq(const x86_insn *insn) +{ + if (insn->mod == 3) + { + if (intel_mode) + dis_sprintf ("xmm%d", insn->rm); + else + dis_sprintf("%%xmm%d", insn->rm); + } + else + (this->*resolve_modrm)(insn, Q_SIZE); +} + +void disassembler::Wdq(const x86_insn *insn) +{ + if (insn->mod == 3) + { + if (intel_mode) + dis_sprintf ("xmm%d", insn->rm); + else + dis_sprintf("%%xmm%d", insn->rm); + } + else + (this->*resolve_modrm)(insn, O_SIZE); +} + +void disassembler::Wsd(const x86_insn *insn) { Wq(insn); } + +void disassembler::Wss(const x86_insn *insn) +{ + if (insn->mod == 3) + { + if (intel_mode) + dis_sprintf ("xmm%d", insn->rm); + else + dis_sprintf("%%xmm%d", insn->rm); + } + else + (this->*resolve_modrm)(insn, D_SIZE); +} + +void disassembler::Wpd(const x86_insn *insn) { Wdq(insn); } +void disassembler::Wps(const x86_insn *insn) { Wdq(insn); } + +// direct memory access +void disassembler::OP_O(const x86_insn *insn, unsigned size) +{ + const char *seg; + + if (insn->is_seg_override()) + seg = segment_name[insn->seg_override]; + else + seg = segment_name[DS_REG]; + + print_datasize(size); + + if (insn->as_64) { + Bit64u imm64 = fetch_qword(); + dis_sprintf("%s:0x%08x%08x", seg, + (unsigned)(imm64>>32), (unsigned)(imm64 & 0xffffffff)); + } + else if (insn->as_32) { + Bit32u imm32 = fetch_dword(); + dis_sprintf("%s:0x%x", seg, (unsigned) imm32); + } + else { + Bit16u imm16 = fetch_word(); + dis_sprintf("%s:0x%x", seg, (unsigned) imm16); + } +} + +void disassembler::Ob(const x86_insn *insn) { OP_O(insn, B_SIZE); } +void disassembler::Ow(const x86_insn *insn) { OP_O(insn, W_SIZE); } +void disassembler::Od(const x86_insn *insn) { OP_O(insn, D_SIZE); } +void disassembler::Oq(const x86_insn *insn) { OP_O(insn, Q_SIZE); } + +// memory operand +void disassembler::OP_M(const x86_insn *insn, unsigned size) +{ + if(insn->mod == 3) + dis_sprintf("(bad)"); + else + (this->*resolve_modrm)(insn, size); +} + +void disassembler::Ma(const x86_insn *insn) { OP_M(insn, X_SIZE); } +void disassembler::Mp(const x86_insn *insn) { OP_M(insn, X_SIZE); } +void disassembler::Ms(const x86_insn *insn) { OP_M(insn, X_SIZE); } +void disassembler::Mx(const x86_insn *insn) { OP_M(insn, X_SIZE); } + +void disassembler::Mb(const x86_insn *insn) { OP_M(insn, B_SIZE); } +void disassembler::Mw(const x86_insn *insn) { OP_M(insn, W_SIZE); } +void disassembler::Md(const x86_insn *insn) { OP_M(insn, D_SIZE); } +void disassembler::Mq(const x86_insn *insn) { OP_M(insn, Q_SIZE); } +void disassembler::Mt(const x86_insn *insn) { OP_M(insn, T_SIZE); } + +void disassembler::Mdq(const x86_insn *insn) { OP_M(insn, O_SIZE); } +void disassembler::Mps(const x86_insn *insn) { OP_M(insn, O_SIZE); } +void disassembler::Mpd(const x86_insn *insn) { OP_M(insn, O_SIZE); } + +// string instructions +void disassembler::OP_X(const x86_insn *insn, unsigned size) +{ + const char *rsi, *seg; + + if (insn->as_64) { + rsi = general_64bit_regname[rSI_REG]; + } + else { + if (insn->as_32) + rsi = general_32bit_regname[rSI_REG]; + else + rsi = general_16bit_regname[rSI_REG]; + } + + if (insn->is_seg_override()) + seg = segment_name[insn->seg_override]; + else + seg = segment_name[DS_REG]; + + print_datasize(size); + + if (intel_mode) + dis_sprintf("%s:[%s]", seg, rsi); + else + dis_sprintf("%s:(%s)", seg, rsi); +} + +void disassembler::Xb(const x86_insn *insn) { OP_X(insn, B_SIZE); } +void disassembler::Xw(const x86_insn *insn) { OP_X(insn, W_SIZE); } +void disassembler::Xd(const x86_insn *insn) { OP_X(insn, D_SIZE); } +void disassembler::Xq(const x86_insn *insn) { OP_X(insn, Q_SIZE); } + +void disassembler::OP_Y(const x86_insn *insn, unsigned size) +{ + const char *rdi; + + if (insn->as_64) { + rdi = general_64bit_regname[rDI_REG]; + } + else { + if (insn->as_32) + rdi = general_32bit_regname[rDI_REG]; + else + rdi = general_16bit_regname[rDI_REG]; + } + + print_datasize(size); + + if (intel_mode) + dis_sprintf("%s:[%s]", segment_name[ES_REG], rdi); + else + dis_sprintf("%s:(%s)", segment_name[ES_REG], rdi); +} + +void disassembler::Yb(const x86_insn *insn) { OP_Y(insn, B_SIZE); } +void disassembler::Yw(const x86_insn *insn) { OP_Y(insn, W_SIZE); } +void disassembler::Yd(const x86_insn *insn) { OP_Y(insn, D_SIZE); } +void disassembler::Yq(const x86_insn *insn) { OP_Y(insn, Q_SIZE); } + +#define BX_JUMP_TARGET_NOT_REQ ((bx_address)(-1)) + +// jump offset +void disassembler::Jb(const x86_insn *insn) +{ + Bit8s imm8 = (Bit8s) fetch_byte(); + + if (insn->is_64) { + Bit64u imm64 = (Bit64s) imm8; + dis_sprintf(".+0x%08x%08x", + (unsigned)(imm64>>32), (unsigned)(imm64 & 0xffffffff)); + + if (db_base != BX_JUMP_TARGET_NOT_REQ) { + Bit64u target = db_eip + (Bit64s) imm64; target += db_base; + dis_sprintf(" (0x%08x%08x)", + (unsigned)(target>>32), (unsigned)(target & 0xffffffff)); + } + + return; + } + + if (insn->os_32) { + Bit32u imm32 = (Bit32s) imm8; + dis_sprintf(".+0x%08x", (unsigned) imm32); + + if (db_base != BX_JUMP_TARGET_NOT_REQ) { + Bit32u target = db_eip + (Bit32s) imm32; target += db_base; + dis_sprintf(" (0x%08x)", target); + } + } + else { + Bit16u imm16 = (Bit16s) imm8; + dis_sprintf(".+0x%04x", (unsigned) imm16); + + if (db_base != BX_JUMP_TARGET_NOT_REQ) { + Bit16u target = (db_eip + (Bit16s) imm16) & 0xffff; + dis_sprintf(" (0x%08x)", target + db_base); + } + } +} + +void disassembler::Jw(const x86_insn *insn) +{ + // Jw supported in 16-bit mode only + assert(! insn->is_64); + assert(! insn->is_32); + + Bit16u imm16 = (Bit16s) fetch_word(); + dis_sprintf(".+0x%04x", (unsigned) imm16); + + if (db_base != BX_JUMP_TARGET_NOT_REQ) { + Bit16u target = (db_eip + (Bit16s) imm16) & 0xffff; + dis_sprintf(" (0x%08x)", target + db_base); + } +} + +void disassembler::Jd(const x86_insn *insn) +{ + Bit32s imm32 = (Bit32s) fetch_dword(); + + if (insn->is_64) { + Bit64u imm64 = (Bit64s) imm32; + dis_sprintf(".+0x%08x%08x", + (unsigned)(imm64>>32), (unsigned)(imm64 & 0xffffffff)); + + if (db_base != BX_JUMP_TARGET_NOT_REQ) { + Bit64u target = db_eip + (Bit64s) imm64; target += db_base; + dis_sprintf(" (0x%08x%08x)", + (unsigned)(target>>32), (unsigned)(target & 0xffffffff)); + } + + return; + } + + dis_sprintf(".+0x%08x", (unsigned) imm32); + + if (db_base != BX_JUMP_TARGET_NOT_REQ) { + Bit32u target = db_eip + (Bit32s) imm32; target += db_base; + dis_sprintf(" (0x%08x)", target); + } +} diff --git a/Externals/Bochs_disasm/dis_tables.h b/Externals/Bochs_disasm/dis_tables.h new file mode 100644 index 0000000000..f7291e0541 --- /dev/null +++ b/Externals/Bochs_disasm/dis_tables.h @@ -0,0 +1,152 @@ +///////////////////////////////////////////////////////////////////////// +// $Id: dis_tables.h,v 1.29 2006/04/27 15:11:45 sshwarts Exp $ +///////////////////////////////////////////////////////////////////////// + +#ifndef _BX_DISASM_TABLES_ +#define _BX_DISASM_TABLES_ + +// opcode table attributes +#define _GROUPN 1 +#define _SPLIT11B 2 +#define _GRPFP 3 +#define _GRP3DNOW 4 +#define _GRPSSE 5 +#define _GRPRM 6 +#define _GRP3BOP 7 +#define _GRP3BTAB 8 + +/* ************************************************************************ */ +#define GRPSSE(n) _GRPSSE, BxDisasmGroupSSE_##n +#define GRPN(n) _GROUPN, BxDisasmGroup##n +#define GRPRM(n) _GRPRM, BxDisasmGroupRm##n +#define GRPMOD(n) _SPLIT11B, BxDisasmGroupMod##n +#define GRPFP(n) _GRPFP, BxDisasmFPGroup##n +#define GRP3DNOW _GRP3DNOW, BxDisasm3DNowGroup +#define GR3BOP(n) _GRP3BOP, BxDisasm3ByteOp##n +#define GR3BTAB(n) _GRP3BTAB, BxDisasm3ByteTable##n +/* ************************************************************************ */ + +#define Apw &disassembler::Apw +#define Apd &disassembler::Apd + +#define AL &disassembler::AL +#define CL &disassembler::CL +#define AX &disassembler::AX +#define DX &disassembler::DX + +#define EAX &disassembler::EAX +#define RAX &disassembler::RAX + +#define CS &disassembler::CS +#define DS &disassembler::DS +#define ES &disassembler::ES +#define SS &disassembler::SS +#define FS &disassembler::FS +#define GS &disassembler::GS + +#define Sw &disassembler::Sw + +#define Td &disassembler::Td + +#define Cd &disassembler::Cd +#define Cq &disassembler::Cq + +#define Dd &disassembler::Dd +#define Dq &disassembler::Dq + +#define R8 &disassembler::R8 +#define RX &disassembler::RX +#define ERX &disassembler::ERX +#define RRX &disassembler::RRX + +#define Eb &disassembler::Eb +#define Ew &disassembler::Ew +#define Ed &disassembler::Ed +#define Eq &disassembler::Eq + +#define Gb &disassembler::Gb +#define Gw &disassembler::Gw +#define Gd &disassembler::Gd +#define Gq &disassembler::Gq + +#define I1 &disassembler::I1 +#define Ib &disassembler::Ib +#define Iw &disassembler::Iw +#define Id &disassembler::Id +#define Iq &disassembler::Iq + +#define IwIb &disassembler::IwIb + +#define sIbw &disassembler::sIbw +#define sIbd &disassembler::sIbd +#define sIbq &disassembler::sIbq +#define sIdq &disassembler::sIdq + +#define ST0 &disassembler::ST0 +#define STi &disassembler::STi + +#define Rw &disassembler::Rw +#define Rd &disassembler::Rd +#define Rq &disassembler::Rq + +#define Pq &disassembler::Pq +#define Qd &disassembler::Qd +#define Qq &disassembler::Qq +#define Nq &disassembler::Nq + +#define Vq &disassembler::Vq +#define Vdq &disassembler::Vdq +#define Vss &disassembler::Vss +#define Vsd &disassembler::Vsd +#define Vps &disassembler::Vps +#define Vpd &disassembler::Vpd +#define Udq &disassembler::Udq + +#define Wq &disassembler::Wq +#define Wdq &disassembler::Wdq +#define Wss &disassembler::Wss +#define Wsd &disassembler::Wsd +#define Wps &disassembler::Wps +#define Wpd &disassembler::Wpd + +#define Ob &disassembler::Ob +#define Ow &disassembler::Ow +#define Od &disassembler::Od +#define Oq &disassembler::Oq + +#define Ma &disassembler::Ma +#define Mp &disassembler::Mp +#define Ms &disassembler::Ms +#define Mx &disassembler::Mx +#define Mb &disassembler::Mb +#define Mw &disassembler::Mw +#define Md &disassembler::Md +#define Mq &disassembler::Mq +#define Mt &disassembler::Mt +#define Mdq &disassembler::Mdq +#define Mps &disassembler::Mps +#define Mpd &disassembler::Mpd + +#define Xb &disassembler::Xb +#define Xw &disassembler::Xw +#define Xd &disassembler::Xd +#define Xq &disassembler::Xq + +#define Yb &disassembler::Yb +#define Yw &disassembler::Yw +#define Yd &disassembler::Yd +#define Yq &disassembler::Yq + +#define Jb &disassembler::Jb +#define Jw &disassembler::Jw +#define Jd &disassembler::Jd + +#define XX 0 + +const struct BxDisasmOpcodeInfo_t +#include "opcodes.inl" +#include "dis_tables.inl" + +#undef XX + +#endif diff --git a/Externals/Bochs_disasm/dis_tables.inl b/Externals/Bochs_disasm/dis_tables.inl new file mode 100644 index 0000000000..26e9fefe6a --- /dev/null +++ b/Externals/Bochs_disasm/dis_tables.inl @@ -0,0 +1,5081 @@ +/* ************************************************************************ */ +/* SSE opcodes */ + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f10[4] = { + /* -- */ { 0, &Ia_movups_Vps_Wps }, + /* 66 */ { 0, &Ia_movupd_Vpd_Wpd }, + /* F2 */ { 0, &Ia_movsd_Vsd_Wsd }, + /* F3 */ { 0, &Ia_movss_Vss_Wss } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f11[4] = { + /* -- */ { 0, &Ia_movups_Wps_Vps }, + /* 66 */ { 0, &Ia_movupd_Wpd_Vpd }, + /* F2 */ { 0, &Ia_movsd_Wsd_Vsd }, + /* F3 */ { 0, &Ia_movss_Wss_Vss } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupModMOVHLPS[2] = { + /* R */ { 0, &Ia_movhlps_Vps_Uq }, + /* M */ { 0, &Ia_movlps_Vps_Mq } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupModMOVHLPD[2] = { + /* R */ { 0, &Ia_movhlpd_Vpd_Uq }, + /* M */ { 0, &Ia_movlpd_Vpd_Mq } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f12[4] = { + /* -- */ { GRPMOD(MOVHLPS) }, + /* 66 */ { GRPMOD(MOVHLPD) }, + /* F2 */ { 0, &Ia_movddup_Vdq_Wq }, + /* F3 */ { 0, &Ia_movsldup_Vdq_Wdq } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f13[4] = { + /* -- */ { 0, &Ia_movlps_Mq_Vps }, + /* 66 */ { 0, &Ia_movlpd_Mq_Vpd }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f14[4] = { + /* -- */ { 0, &Ia_unpcklps_Vps_Wq }, + /* 66 */ { 0, &Ia_unpcklpd_Vpd_Wq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f15[4] = { + /* -- */ { 0, &Ia_unpckhps_Vps_Wdq }, + /* 66 */ { 0, &Ia_unpckhpd_Vpd_Wdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupModMOVLHPS[2] = { + /* R */ { 0, &Ia_movlhps_Vps_Uq }, + /* M */ { 0, &Ia_movhps_Vps_Mq } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupModMOVLHPD[2] = { + /* R */ { 0, &Ia_movlhpd_Vpd_Uq }, + /* M */ { 0, &Ia_movhpd_Vpd_Mq } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f16[4] = { + /* -- */ { GRPMOD(MOVLHPS) }, + /* 66 */ { GRPMOD(MOVLHPD) }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_movshdup_Vdq_Wdq }, +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f17[4] = { + /* -- */ { 0, &Ia_movhps_Mq_Vps }, + /* 66 */ { 0, &Ia_movhpd_Mq_Vpd }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f28[4] = { + /* -- */ { 0, &Ia_movaps_Vps_Wps }, + /* 66 */ { 0, &Ia_movapd_Vpd_Wpd }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f29[4] = { + /* -- */ { 0, &Ia_movaps_Wps_Vps }, + /* 66 */ { 0, &Ia_movapd_Wpd_Vpd }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f2a[4] = { + /* -- */ { 0, &Ia_cvtpi2ps_Vps_Qq }, + /* 66 */ { 0, &Ia_cvtpi2pd_Vpd_Qq }, + /* F2 */ { 0, &Ia_cvtsi2sd_Vsd_Ed }, + /* F3 */ { 0, &Ia_cvtsi2ss_Vss_Ed } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_640f2a[4] = { + /* -- */ { 0, &Ia_cvtpi2ps_Vps_Qq }, + /* 66 */ { 0, &Ia_cvtpi2pd_Vpd_Qq }, + /* F2 */ { 0, &Ia_cvtsi2sd_Vsd_Eq }, + /* F3 */ { 0, &Ia_cvtsi2ss_Vss_Eq } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f2b[4] = { + /* -- */ { 0, &Ia_movntps_Mps_Vps }, + /* 66 */ { 0, &Ia_movntpd_Mpd_Vpd }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f2c[4] = { + /* -- */ { 0, &Ia_cvttps2pi_Pq_Wps }, + /* 66 */ { 0, &Ia_cvttpd2pi_Pq_Wpd }, + /* F2 */ { 0, &Ia_cvttsd2si_Gd_Wsd }, + /* F3 */ { 0, &Ia_cvttss2si_Gd_Wss } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f2cQ[4] = { + /* -- */ { 0, &Ia_cvttps2pi_Pq_Wps }, + /* 66 */ { 0, &Ia_cvttpd2pi_Pq_Wpd }, + /* F2 */ { 0, &Ia_cvttsd2si_Gq_Wsd }, + /* F3 */ { 0, &Ia_cvttss2si_Gq_Wss } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f2d[4] = { + /* -- */ { 0, &Ia_cvtps2pi_Pq_Wps }, + /* 66 */ { 0, &Ia_cvtpd2pi_Pq_Wpd }, + /* F2 */ { 0, &Ia_cvtsd2si_Gd_Wsd }, + /* F3 */ { 0, &Ia_cvtss2si_Gd_Wss } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f2dQ[4] = { + /* -- */ { 0, &Ia_cvtps2pi_Pq_Wps }, + /* 66 */ { 0, &Ia_cvtpd2pi_Pq_Wpd }, + /* F2 */ { 0, &Ia_cvtsd2si_Gq_Wsd }, + /* F3 */ { 0, &Ia_cvtss2si_Gq_Wss } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f2e[4] = { + /* -- */ { 0, &Ia_ucomiss_Vss_Wss }, + /* 66 */ { 0, &Ia_ucomisd_Vsd_Wss }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f2f[4] = { + /* -- */ { 0, &Ia_comiss_Vss_Wss }, + /* 66 */ { 0, &Ia_comisd_Vsd_Wsd }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f3800[4] = { + /* -- */ { 0, &Ia_pshufb_Pq_Qq }, // SSE4 + /* 66 */ { 0, &Ia_pshufb_Vdq_Wdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f3801[4] = { + /* -- */ { 0, &Ia_phaddw_Pq_Qq }, // SSE4 + /* 66 */ { 0, &Ia_phaddw_Vdq_Wdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f3802[4] = { + /* -- */ { 0, &Ia_phaddd_Pq_Qq }, // SSE4 + /* 66 */ { 0, &Ia_phaddd_Vdq_Wdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f3803[4] = { + /* -- */ { 0, &Ia_phaddsw_Pq_Qq }, // SSE4 + /* 66 */ { 0, &Ia_phaddsw_Vdq_Wdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f3804[4] = { + /* -- */ { 0, &Ia_pmaddubsw_Pq_Qq }, // SSE4 + /* 66 */ { 0, &Ia_pmaddubsw_Vdq_Wdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f3805[4] = { + /* -- */ { 0, &Ia_phsubw_Pq_Qq }, // SSE4 + /* 66 */ { 0, &Ia_phsubw_Vdq_Wdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f3806[4] = { + /* -- */ { 0, &Ia_phsubd_Pq_Qq }, // SSE4 + /* 66 */ { 0, &Ia_phsubd_Vdq_Wdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f3807[4] = { + /* -- */ { 0, &Ia_phsubsw_Pq_Qq }, // SSE4 + /* 66 */ { 0, &Ia_phsubsw_Vdq_Wdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f3808[4] = { + /* -- */ { 0, &Ia_psignb_Pq_Qq }, // SSE4 + /* 66 */ { 0, &Ia_psignb_Vdq_Wdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f3809[4] = { + /* -- */ { 0, &Ia_psignw_Pq_Qq }, // SSE4 + /* 66 */ { 0, &Ia_psignw_Vdq_Wdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f380a[4] = { + /* -- */ { 0, &Ia_psignd_Pq_Qq }, // SSE4 + /* 66 */ { 0, &Ia_psignd_Vdq_Wdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f380b[4] = { + /* -- */ { 0, &Ia_pmulhrsw_Pq_Qq }, // SSE4 + /* 66 */ { 0, &Ia_pmulhrsw_Vdq_Wdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f381c[4] = { + /* -- */ { 0, &Ia_pabsb_Pq_Qq }, // SSE4 + /* 66 */ { 0, &Ia_pabsb_Vdq_Wdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f381d[4] = { + /* -- */ { 0, &Ia_pabsw_Pq_Qq }, // SSE4 + /* 66 */ { 0, &Ia_pabsw_Vdq_Wdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f381e[4] = { + /* -- */ { 0, &Ia_pabsd_Pq_Qq }, // SSE4 + /* 66 */ { 0, &Ia_pabsd_Vdq_Wdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f3a0f[4] = { + /* -- */ { 0, &Ia_palignr_Pq_Qq_Ib }, // SSE4 + /* 66 */ { 0, &Ia_palignr_Vdq_Wdq_Ib }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f50[4] = { + /* -- */ { 0, &Ia_movmskps_Gd_Vps }, + /* 66 */ { 0, &Ia_movmskpd_Gd_Vpd }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f51[4] = { + /* -- */ { 0, &Ia_sqrtps_Vps_Wps }, + /* 66 */ { 0, &Ia_sqrtpd_Vpd_Wpd }, + /* F2 */ { 0, &Ia_sqrtsd_Vsd_Wsd }, + /* F3 */ { 0, &Ia_sqrtss_Vss_Wss } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f52[4] = { + /* -- */ { 0, &Ia_rsqrtps_Vps_Wps }, + /* 66 */ { 0, &Ia_Invalid }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_rsqrtss_Vss_Wss } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f53[4] = { + /* -- */ { 0, &Ia_rcpps_Vps_Wps }, + /* 66 */ { 0, &Ia_Invalid }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_rcpss_Vss_Wss } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f54[4] = { + /* -- */ { 0, &Ia_andps_Vps_Wps }, + /* 66 */ { 0, &Ia_andpd_Vpd_Wpd }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f55[4] = { + /* -- */ { 0, &Ia_andnps_Vps_Wps }, + /* 66 */ { 0, &Ia_andnpd_Vpd_Wpd }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f56[4] = { + /* -- */ { 0, &Ia_orps_Vps_Wps }, + /* 66 */ { 0, &Ia_orpd_Vpd_Wpd }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f57[4] = { + /* -- */ { 0, &Ia_xorps_Vps_Wps }, + /* 66 */ { 0, &Ia_xorpd_Vpd_Wpd }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f58[4] = { + /* -- */ { 0, &Ia_addps_Vps_Wps }, + /* 66 */ { 0, &Ia_addpd_Vpd_Wpd }, + /* F2 */ { 0, &Ia_addsd_Vsd_Wsd }, + /* F3 */ { 0, &Ia_addss_Vss_Wss } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f59[4] = { + /* -- */ { 0, &Ia_mulps_Vps_Wps }, + /* 66 */ { 0, &Ia_mulpd_Vpd_Wpd }, + /* F2 */ { 0, &Ia_mulsd_Vsd_Wsd }, + /* F3 */ { 0, &Ia_mulss_Vss_Wss } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f5a[4] = { + /* -- */ { 0, &Ia_cvtps2pd_Vpd_Wps }, + /* 66 */ { 0, &Ia_cvtpd2ps_Vps_Wpd }, + /* F2 */ { 0, &Ia_cvtsd2ss_Vss_Wsd }, + /* F3 */ { 0, &Ia_cvtss2sd_Vsd_Wss } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f5b[4] = { + /* -- */ { 0, &Ia_cvtdq2ps_Vps_Wdq }, + /* 66 */ { 0, &Ia_cvtps2dq_Vdq_Wps }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_cvttps2dq_Vdq_Wps } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f5c[4] = { + /* -- */ { 0, &Ia_subps_Vps_Wps }, + /* 66 */ { 0, &Ia_subpd_Vpd_Wpd }, + /* F2 */ { 0, &Ia_subsd_Vsd_Wsd }, + /* F3 */ { 0, &Ia_subss_Vss_Wss } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f5d[4] = { + /* -- */ { 0, &Ia_minps_Vps_Wps }, + /* 66 */ { 0, &Ia_minpd_Vpd_Wpd }, + /* F2 */ { 0, &Ia_minsd_Vsd_Wsd }, + /* F3 */ { 0, &Ia_minss_Vss_Wss } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f5e[4] = { + /* -- */ { 0, &Ia_divps_Vps_Wps }, + /* 66 */ { 0, &Ia_divpd_Vpd_Wpd }, + /* F2 */ { 0, &Ia_divsd_Vsd_Wsd }, + /* F3 */ { 0, &Ia_divss_Vss_Wss } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f5f[4] = { + /* -- */ { 0, &Ia_maxps_Vps_Wps }, + /* 66 */ { 0, &Ia_maxpd_Vpd_Wpd }, + /* F2 */ { 0, &Ia_maxsd_Vsd_Wsd }, + /* F3 */ { 0, &Ia_maxss_Vss_Wss } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f60[4] = { + /* -- */ { 0, &Ia_punpcklbw_Pq_Qd }, + /* 66 */ { 0, &Ia_punpcklbw_Vdq_Wq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f61[4] = { + /* -- */ { 0, &Ia_punpcklwd_Pq_Qd }, + /* 66 */ { 0, &Ia_punpcklwd_Vdq_Wq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f62[4] = { + /* -- */ { 0, &Ia_punpckldq_Pq_Qd }, + /* 66 */ { 0, &Ia_punpckldq_Vdq_Wq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f63[4] = { + /* -- */ { 0, &Ia_packsswb_Pq_Qq }, + /* 66 */ { 0, &Ia_packsswb_Vdq_Wq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f64[4] = { + /* -- */ { 0, &Ia_pcmpgtb_Pq_Qq }, + /* 66 */ { 0, &Ia_pcmpgtb_Vdq_Wq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f65[4] = { + /* -- */ { 0, &Ia_pcmpgtw_Pq_Qq }, + /* 66 */ { 0, &Ia_pcmpgtw_Vdq_Wq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f66[4] = { + /* -- */ { 0, &Ia_pcmpgtd_Pq_Qq }, + /* 66 */ { 0, &Ia_pcmpgtd_Vdq_Wdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f67[4] = { + /* -- */ { 0, &Ia_packuswb_Pq_Qq }, + /* 66 */ { 0, &Ia_packuswb_Vdq_Wdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f68[4] = { + /* -- */ { 0, &Ia_punpckhbw_Pq_Qq }, + /* 66 */ { 0, &Ia_punpckhbw_Vdq_Wq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f69[4] = { + /* -- */ { 0, &Ia_punpckhwd_Pq_Qq }, + /* 66 */ { 0, &Ia_punpckhwd_Vdq_Wq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f6a[4] = { + /* -- */ { 0, &Ia_punpckhdq_Pq_Qq }, + /* 66 */ { 0, &Ia_punpckhdq_Vdq_Wq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f6b[4] = { + /* -- */ { 0, &Ia_packssdw_Pq_Qq }, + /* 66 */ { 0, &Ia_packssdw_Vdq_Wdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f6c[4] = { + /* -- */ { 0, &Ia_Invalid }, + /* 66 */ { 0, &Ia_punpcklqdq_Vdq_Wq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f6d[4] = { + /* -- */ { 0, &Ia_Invalid }, + /* 66 */ { 0, &Ia_punpckhqdq_Vdq_Wq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f6e[4] = { + /* -- */ { 0, &Ia_movd_Pq_Ed }, + /* 66 */ { 0, &Ia_movd_Vdq_Ed }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f6eQ[4] = { + /* -- */ { 0, &Ia_movq_Pq_Eq }, + /* 66 */ { 0, &Ia_movq_Vdq_Eq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f6f[4] = { + /* -- */ { 0, &Ia_movq_Pq_Qq }, + /* 66 */ { 0, &Ia_movdqa_Vdq_Wdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_movdqu_Vdq_Wdq }, +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f70[4] = { + /* -- */ { 0, &Ia_pshufw_Pq_Qq_Ib }, + /* 66 */ { 0, &Ia_pshufd_Vdq_Wdq_Ib }, + /* F2 */ { 0, &Ia_pshufhw_Vq_Wq_Ib }, + /* F3 */ { 0, &Ia_pshuflw_Vq_Wq_Ib } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f74[4] = { + /* -- */ { 0, &Ia_pcmpeqb_Pq_Qq }, + /* 66 */ { 0, &Ia_pcmpeqb_Vdq_Wdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f75[4] = { + /* -- */ { 0, &Ia_pcmpeqw_Pq_Qq }, + /* 66 */ { 0, &Ia_pcmpeqw_Vdq_Wdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f76[4] = { + /* -- */ { 0, &Ia_pcmpeqd_Pq_Qq }, + /* 66 */ { 0, &Ia_pcmpeqd_Vdq_Wdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f7c[4] = { + /* -- */ { 0, &Ia_Invalid }, + /* 66 */ { 0, &Ia_haddpd_Vpd_Wpd }, + /* F2 */ { 0, &Ia_haddps_Vps_Wps }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f7d[4] = { + /* -- */ { 0, &Ia_Invalid }, + /* 66 */ { 0, &Ia_hsubpd_Vpd_Wpd }, + /* F2 */ { 0, &Ia_hsubps_Vps_Wps }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f7e[4] = { + /* -- */ { 0, &Ia_movd_Ed_Pq }, + /* 66 */ { 0, &Ia_movd_Ed_Vd }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_movq_Vq_Wq }, +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f7eQ[4] = { + /* -- */ { 0, &Ia_movq_Eq_Pq }, + /* 66 */ { 0, &Ia_movq_Eq_Vq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_movq_Vq_Wq }, +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0f7f[4] = { + /* -- */ { 0, &Ia_movq_Qq_Pq }, + /* 66 */ { 0, &Ia_movdqa_Wdq_Vdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_movdqu_Wdq_Vdq }, +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0fc2[4] = { + /* -- */ { 0, &Ia_cmpps_Vps_Wps_Ib }, + /* 66 */ { 0, &Ia_cmppd_Vpd_Wpd_Ib }, + /* F2 */ { 0, &Ia_cmpsd_Vsd_Wsd_Ib }, + /* F3 */ { 0, &Ia_cmpss_Vss_Wss_Ib } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0fc3[4] = { + /* -- */ { 0, &Ia_movnti_Md_Gd }, + /* 66 */ { 0, &Ia_Invalid }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_640fc3[4] = { + /* -- */ { 0, &Ia_movntiq_Mq_Gq }, + /* 66 */ { 0, &Ia_Invalid }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0fc4[4] = { + /* -- */ { 0, &Ia_pinsrw_Pq_Ed_Ib }, + /* 66 */ { 0, &Ia_pinsrw_Vdq_Ed_Ib }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0fc5[4] = { + /* -- */ { 0, &Ia_pextrw_Gd_Nq_Ib }, + /* 66 */ { 0, &Ia_pextrw_Gd_Udq_Ib }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0fc6[4] = { + /* -- */ { 0, &Ia_shufps_Vps_Wps_Ib }, + /* 66 */ { 0, &Ia_shufpd_Vpd_Wpd_Ib }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0fd0[4] = { + /* -- */ { 0, &Ia_Invalid }, + /* 66 */ { 0, &Ia_addsubpd_Vpd_Wpd }, + /* F2 */ { 0, &Ia_addsubps_Vps_Wps }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0fd1[4] = { + /* -- */ { 0, &Ia_psrlw_Pq_Qq }, + /* 66 */ { 0, &Ia_psrlw_Vdq_Wdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0fd2[4] = { + /* -- */ { 0, &Ia_psrld_Pq_Qq }, + /* 66 */ { 0, &Ia_psrld_Vdq_Wdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0fd3[4] = { + /* -- */ { 0, &Ia_psrlq_Pq_Qq }, + /* 66 */ { 0, &Ia_psrlq_Vdq_Wdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0fd4[4] = { + /* -- */ { 0, &Ia_paddq_Pq_Qq }, + /* 66 */ { 0, &Ia_paddq_Vdq_Wdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0fd5[4] = { + /* -- */ { 0, &Ia_pmullw_Pq_Qq }, + /* 66 */ { 0, &Ia_pmullw_Vdq_Wdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0fd6[4] = { + /* -- */ { 0, &Ia_Invalid }, + /* 66 */ { 0, &Ia_movq_Wq_Vq }, + /* F2 */ { 0, &Ia_movdq2q_Pq_Vq }, + /* F3 */ { 0, &Ia_movq2dq_Vdq_Qq }, +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0fd7[4] = { + /* -- */ { 0, &Ia_pmovmskb_Gd_Nq }, + /* 66 */ { 0, &Ia_pmovmskb_Gd_Udq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0fd8[4] = { + /* -- */ { 0, &Ia_psubusb_Pq_Qq }, + /* 66 */ { 0, &Ia_psubusb_Vdq_Wdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0fd9[4] = { + /* -- */ { 0, &Ia_psubusw_Pq_Qq }, + /* 66 */ { 0, &Ia_psubusw_Vdq_Wdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0fda[4] = { + /* -- */ { 0, &Ia_pminub_Pq_Qq }, + /* 66 */ { 0, &Ia_pminub_Vdq_Wdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0fdb[4] = { + /* -- */ { 0, &Ia_pand_Pq_Qq }, + /* 66 */ { 0, &Ia_pand_Vdq_Wdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0fdc[4] = { + /* -- */ { 0, &Ia_paddusb_Pq_Qq }, + /* 66 */ { 0, &Ia_paddusb_Vdq_Wdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0fdd[4] = { + /* -- */ { 0, &Ia_paddusw_Pq_Qq }, + /* 66 */ { 0, &Ia_paddusw_Vdq_Wdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0fde[4] = { + /* -- */ { 0, &Ia_pmaxub_Pq_Qq }, + /* 66 */ { 0, &Ia_pmaxub_Vdq_Wdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0fdf[4] = { + /* -- */ { 0, &Ia_pandn_Pq_Qq }, + /* 66 */ { 0, &Ia_pandn_Vdq_Wdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0fe0[4] = { + /* -- */ { 0, &Ia_pavgb_Pq_Qq }, + /* 66 */ { 0, &Ia_pavgb_Vdq_Wdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0fe1[4] = { + /* -- */ { 0, &Ia_psraw_Pq_Qq }, + /* 66 */ { 0, &Ia_psraw_Vdq_Wdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0fe2[4] = { + /* -- */ { 0, &Ia_psrad_Pq_Qq }, + /* 66 */ { 0, &Ia_psrad_Vdq_Wdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0fe3[4] = { + /* -- */ { 0, &Ia_pavgw_Pq_Qq }, + /* 66 */ { 0, &Ia_pavgw_Vdq_Wdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0fe4[4] = { + /* -- */ { 0, &Ia_pmulhuw_Pq_Qq }, + /* 66 */ { 0, &Ia_pmulhuw_Vdq_Wdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0fe5[4] = { + /* -- */ { 0, &Ia_pmulhw_Pq_Qq }, + /* 66 */ { 0, &Ia_pmulhw_Vdq_Wdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0fe6[4] = { + /* -- */ { 0, &Ia_Invalid }, + /* 66 */ { 0, &Ia_cvttpd2dq_Vq_Wpd }, + /* F2 */ { 0, &Ia_cvtpd2dq_Vq_Wpd }, + /* F3 */ { 0, &Ia_cvtdq2pd_Vpd_Wq } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0fe7[4] = { + /* -- */ { 0, &Ia_movntq_Mq_Pq }, + /* 66 */ { 0, &Ia_movntdq_Mdq_Vdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0fe8[4] = { + /* -- */ { 0, &Ia_psubsb_Pq_Qq }, + /* 66 */ { 0, &Ia_psubsb_Vdq_Wdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0fe9[4] = { + /* -- */ { 0, &Ia_psubsw_Pq_Qq }, + /* 66 */ { 0, &Ia_psubsw_Vdq_Wdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0fea[4] = { + /* -- */ { 0, &Ia_pminsw_Pq_Qq }, + /* 66 */ { 0, &Ia_pminsw_Vdq_Wdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0feb[4] = { + /* -- */ { 0, &Ia_por_Pq_Qq }, + /* 66 */ { 0, &Ia_por_Vdq_Wdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0fec[4] = { + /* -- */ { 0, &Ia_paddsb_Pq_Qq }, + /* 66 */ { 0, &Ia_paddsb_Vdq_Wdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0fed[4] = { + /* -- */ { 0, &Ia_paddsw_Pq_Qq }, + /* 66 */ { 0, &Ia_paddsw_Vdq_Wdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0fee[4] = { + /* -- */ { 0, &Ia_pmaxuw_Pq_Qq }, + /* 66 */ { 0, &Ia_pmaxuw_Vdq_Wdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0fef[4] = { + /* -- */ { 0, &Ia_pxor_Pq_Qq }, + /* 66 */ { 0, &Ia_pxor_Vdq_Wdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0ff0[4] = { + /* -- */ { 0, &Ia_Invalid }, + /* 66 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_lddqu_Vdq_Mdq }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0ff1[4] = { + /* -- */ { 0, &Ia_psllw_Pq_Qq }, + /* 66 */ { 0, &Ia_psllw_Vdq_Wdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0ff2[4] = { + /* -- */ { 0, &Ia_pslld_Pq_Qq }, + /* 66 */ { 0, &Ia_pslld_Vdq_Wdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0ff3[4] = { + /* -- */ { 0, &Ia_psllq_Pq_Qq }, + /* 66 */ { 0, &Ia_psllq_Vdq_Wdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0ff4[4] = { + /* -- */ { 0, &Ia_pmuludq_Pq_Qq }, + /* 66 */ { 0, &Ia_pmuludq_Vdq_Wdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0ff5[4] = { + /* -- */ { 0, &Ia_pmaddwd_Pq_Qq }, + /* 66 */ { 0, &Ia_pmaddwd_Vdq_Wdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0ff6[4] = { + /* -- */ { 0, &Ia_psadbw_Pq_Qq }, + /* 66 */ { 0, &Ia_psadbw_Vdq_Wdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0ff7[4] = { + /* -- */ { 0, &Ia_maskmovq_Pq_Nq }, + /* 66 */ { 0, &Ia_maskmovdqu_Vdq_Udq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0ff8[4] = { + /* -- */ { 0, &Ia_psubb_Pq_Qq }, + /* 66 */ { 0, &Ia_psubb_Vdq_Wdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0ff9[4] = { + /* -- */ { 0, &Ia_psubw_Pq_Qq }, + /* 66 */ { 0, &Ia_psubw_Vdq_Wdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0ffa[4] = { + /* -- */ { 0, &Ia_psubd_Pq_Qq }, + /* 66 */ { 0, &Ia_psubd_Vdq_Wdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0ffb[4] = { + /* -- */ { 0, &Ia_psubq_Pq_Qq }, + /* 66 */ { 0, &Ia_psubq_Vdq_Wdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0ffc[4] = { + /* -- */ { 0, &Ia_paddb_Pq_Qq }, + /* 66 */ { 0, &Ia_paddb_Vdq_Wdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0ffd[4] = { + /* -- */ { 0, &Ia_paddw_Pq_Qq }, + /* 66 */ { 0, &Ia_paddw_Vdq_Wdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_0ffe[4] = { + /* -- */ { 0, &Ia_paddd_Pq_Qq }, + /* 66 */ { 0, &Ia_paddd_Vdq_Wdq }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_G1202[4] = { + /* -- */ { 0, &Ia_psrlw_Nq_Ib }, + /* 66 */ { 0, &Ia_psrlw_Udq_Ib }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_G1204[4] = { + /* -- */ { 0, &Ia_psraw_Nq_Ib }, + /* 66 */ { 0, &Ia_psraw_Udq_Ib }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_G1206[4] = { + /* -- */ { 0, &Ia_psllw_Nq_Ib }, + /* 66 */ { 0, &Ia_psllw_Udq_Ib }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_G1302[4] = { + /* -- */ { 0, &Ia_psrld_Nq_Ib }, + /* 66 */ { 0, &Ia_psrld_Udq_Ib }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_G1304[4] = { + /* -- */ { 0, &Ia_psrad_Nq_Ib }, + /* 66 */ { 0, &Ia_psrad_Udq_Ib }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_G1306[4] = { + /* -- */ { 0, &Ia_pslld_Nq_Ib }, + /* 66 */ { 0, &Ia_pslld_Udq_Ib }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_G1402[4] = { + /* -- */ { 0, &Ia_psrlq_Nq_Ib }, + /* 66 */ { 0, &Ia_psrlq_Udq_Ib }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_G1403[4] = { + /* -- */ { 0, &Ia_Invalid }, + /* 66 */ { 0, &Ia_psrldq_Udq_Ib }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_G1406[4] = { + /* -- */ { 0, &Ia_psllq_Nq_Ib }, + /* 66 */ { 0, &Ia_psllq_Udq_Ib }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupSSE_G1407[4] = { + /* -- */ { 0, &Ia_Invalid }, + /* 66 */ { 0, &Ia_pslldq_Udq_Ib }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid } +}; + + +/* ************************************************************************ */ +/* Opcode GroupN */ + +static BxDisasmOpcodeTable_t BxDisasmGroupG1EbIb[8] = { + /* 0 */ { 0, &Ia_addb_Eb_Ib }, + /* 1 */ { 0, &Ia_orb_Eb_Ib }, + /* 2 */ { 0, &Ia_adcb_Eb_Ib }, + /* 3 */ { 0, &Ia_sbbb_Eb_Ib }, + /* 4 */ { 0, &Ia_andb_Eb_Ib }, + /* 5 */ { 0, &Ia_subb_Eb_Ib }, + /* 6 */ { 0, &Ia_xorb_Eb_Ib }, + /* 7 */ { 0, &Ia_cmpb_Eb_Ib } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupG1EwIw[8] = { + /* 0 */ { 0, &Ia_addw_Ew_Iw }, + /* 1 */ { 0, &Ia_orw_Ew_Iw }, + /* 2 */ { 0, &Ia_adcw_Ew_Iw }, + /* 3 */ { 0, &Ia_sbbw_Ew_Iw }, + /* 4 */ { 0, &Ia_andw_Ew_Iw }, + /* 5 */ { 0, &Ia_subw_Ew_Iw }, + /* 6 */ { 0, &Ia_xorw_Ew_Iw }, + /* 7 */ { 0, &Ia_cmpw_Ew_Iw } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupG1EdId[8] = { + /* 0 */ { 0, &Ia_addl_Ed_Id }, + /* 1 */ { 0, &Ia_orl_Ed_Id }, + /* 2 */ { 0, &Ia_adcl_Ed_Id }, + /* 3 */ { 0, &Ia_sbbl_Ed_Id }, + /* 4 */ { 0, &Ia_andl_Ed_Id }, + /* 5 */ { 0, &Ia_subl_Ed_Id }, + /* 6 */ { 0, &Ia_xorl_Ed_Id }, + /* 7 */ { 0, &Ia_cmpl_Ed_Id } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupG1EqId[8] = { + /* 0 */ { 0, &Ia_addq_Eq_sId }, + /* 1 */ { 0, &Ia_orq_Eq_sId }, + /* 2 */ { 0, &Ia_adcq_Eq_sId }, + /* 3 */ { 0, &Ia_sbbq_Eq_sId }, + /* 4 */ { 0, &Ia_andq_Eq_sId }, + /* 5 */ { 0, &Ia_subq_Eq_sId }, + /* 6 */ { 0, &Ia_xorq_Eq_sId }, + /* 7 */ { 0, &Ia_cmpq_Eq_sId } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupG1EwIb[8] = { + /* 0 */ { 0, &Ia_addw_Ew_sIb }, // sign-extend byte + /* 1 */ { 0, &Ia_orw_Ew_sIb }, + /* 2 */ { 0, &Ia_adcw_Ew_sIb }, + /* 3 */ { 0, &Ia_sbbw_Ew_sIb }, + /* 4 */ { 0, &Ia_andw_Ew_sIb }, + /* 5 */ { 0, &Ia_subw_Ew_sIb }, + /* 6 */ { 0, &Ia_xorw_Ew_sIb }, + /* 7 */ { 0, &Ia_cmpw_Ew_sIb } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupG1EdIb[8] = { + /* 0 */ { 0, &Ia_addl_Ed_sIb }, // sign-extend byte + /* 1 */ { 0, &Ia_orl_Ed_sIb }, + /* 2 */ { 0, &Ia_adcl_Ed_sIb }, + /* 3 */ { 0, &Ia_sbbl_Ed_sIb }, + /* 4 */ { 0, &Ia_andl_Ed_sIb }, + /* 5 */ { 0, &Ia_subl_Ed_sIb }, + /* 6 */ { 0, &Ia_xorl_Ed_sIb }, + /* 7 */ { 0, &Ia_cmpl_Ed_sIb } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupG1EqIb[8] = { + /* 0 */ { 0, &Ia_addq_Eq_sIb }, // sign-extend byte + /* 1 */ { 0, &Ia_orq_Eq_sIb }, + /* 2 */ { 0, &Ia_adcq_Eq_sIb }, + /* 3 */ { 0, &Ia_sbbq_Eq_sIb }, + /* 4 */ { 0, &Ia_andq_Eq_sIb }, + /* 5 */ { 0, &Ia_subq_Eq_sIb }, + /* 6 */ { 0, &Ia_xorq_Eq_sIb }, + /* 7 */ { 0, &Ia_cmpq_Eq_sIb } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupG2Eb[8] = { + /* 0 */ { 0, &Ia_rolb_Eb_Ib }, + /* 1 */ { 0, &Ia_rorb_Eb_Ib }, + /* 2 */ { 0, &Ia_rclb_Eb_Ib }, + /* 3 */ { 0, &Ia_rcrb_Eb_Ib }, + /* 4 */ { 0, &Ia_shlb_Eb_Ib }, + /* 5 */ { 0, &Ia_shrb_Eb_Ib }, + /* 6 */ { 0, &Ia_shlb_Eb_Ib }, + /* 7 */ { 0, &Ia_sarb_Eb_Ib } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupG2EbI1[8] = { + /* 0 */ { 0, &Ia_rolb_Eb_I1 }, + /* 1 */ { 0, &Ia_rorb_Eb_I1 }, + /* 2 */ { 0, &Ia_rclb_Eb_I1 }, + /* 3 */ { 0, &Ia_rcrb_Eb_I1 }, + /* 4 */ { 0, &Ia_shlb_Eb_I1 }, + /* 5 */ { 0, &Ia_shrb_Eb_I1 }, + /* 6 */ { 0, &Ia_shlb_Eb_I1 }, + /* 7 */ { 0, &Ia_sarb_Eb_I1 } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupG2EbCL[8] = { + /* 0 */ { 0, &Ia_rolb_Eb_CL }, + /* 1 */ { 0, &Ia_rorb_Eb_CL }, + /* 2 */ { 0, &Ia_rclb_Eb_CL }, + /* 3 */ { 0, &Ia_rcrb_Eb_CL }, + /* 4 */ { 0, &Ia_shlb_Eb_CL }, + /* 5 */ { 0, &Ia_shrb_Eb_CL }, + /* 6 */ { 0, &Ia_shlb_Eb_CL }, + /* 7 */ { 0, &Ia_sarb_Eb_CL } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupG2Ew[8] = { + /* 0 */ { 0, &Ia_rolw_Ew_Ib }, + /* 1 */ { 0, &Ia_rorw_Ew_Ib }, + /* 2 */ { 0, &Ia_rclw_Ew_Ib }, + /* 3 */ { 0, &Ia_rcrw_Ew_Ib }, + /* 4 */ { 0, &Ia_shlw_Ew_Ib }, + /* 5 */ { 0, &Ia_shrw_Ew_Ib }, + /* 6 */ { 0, &Ia_shlw_Ew_Ib }, + /* 7 */ { 0, &Ia_sarw_Ew_Ib } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupG2Ed[8] = { + /* 0 */ { 0, &Ia_roll_Ed_Ib }, + /* 1 */ { 0, &Ia_rorl_Ed_Ib }, + /* 2 */ { 0, &Ia_rcll_Ed_Ib }, + /* 3 */ { 0, &Ia_rcrl_Ed_Ib }, + /* 4 */ { 0, &Ia_shll_Ed_Ib }, + /* 5 */ { 0, &Ia_shrl_Ed_Ib }, + /* 6 */ { 0, &Ia_shll_Ed_Ib }, + /* 7 */ { 0, &Ia_sarl_Ed_Ib } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupG2Eq[8] = { + /* 0 */ { 0, &Ia_rolq_Eq_Ib }, + /* 1 */ { 0, &Ia_rorq_Eq_Ib }, + /* 2 */ { 0, &Ia_rclq_Eq_Ib }, + /* 3 */ { 0, &Ia_rcrq_Eq_Ib }, + /* 4 */ { 0, &Ia_shlq_Eq_Ib }, + /* 5 */ { 0, &Ia_shrq_Eq_Ib }, + /* 6 */ { 0, &Ia_shlq_Eq_Ib }, + /* 7 */ { 0, &Ia_sarq_Eq_Ib } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupG2EwI1[8] = { + /* 0 */ { 0, &Ia_rolw_Ew_I1 }, + /* 1 */ { 0, &Ia_rorw_Ew_I1 }, + /* 2 */ { 0, &Ia_rclw_Ew_I1 }, + /* 3 */ { 0, &Ia_rcrw_Ew_I1 }, + /* 4 */ { 0, &Ia_shlw_Ew_I1 }, + /* 5 */ { 0, &Ia_shrw_Ew_I1 }, + /* 6 */ { 0, &Ia_shlw_Ew_I1 }, + /* 7 */ { 0, &Ia_sarw_Ew_I1 } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupG2EdI1[8] = { + /* 0 */ { 0, &Ia_roll_Ed_I1 }, + /* 1 */ { 0, &Ia_rorl_Ed_I1 }, + /* 2 */ { 0, &Ia_rcll_Ed_I1 }, + /* 3 */ { 0, &Ia_rcrl_Ed_I1 }, + /* 4 */ { 0, &Ia_shll_Ed_I1 }, + /* 5 */ { 0, &Ia_shrl_Ed_I1 }, + /* 6 */ { 0, &Ia_shll_Ed_I1 }, + /* 7 */ { 0, &Ia_sarl_Ed_I1 } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupG2EqI1[8] = { + /* 0 */ { 0, &Ia_rolq_Eq_I1 }, + /* 1 */ { 0, &Ia_rorq_Eq_I1 }, + /* 2 */ { 0, &Ia_rclq_Eq_I1 }, + /* 3 */ { 0, &Ia_rcrq_Eq_I1 }, + /* 4 */ { 0, &Ia_shlq_Eq_I1 }, + /* 5 */ { 0, &Ia_shrq_Eq_I1 }, + /* 6 */ { 0, &Ia_shlq_Eq_I1 }, + /* 7 */ { 0, &Ia_sarq_Eq_I1 } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupG2EwCL[8] = { + /* 0 */ { 0, &Ia_rolw_Ew_CL }, + /* 1 */ { 0, &Ia_rorw_Ew_CL }, + /* 2 */ { 0, &Ia_rclw_Ew_CL }, + /* 3 */ { 0, &Ia_rcrw_Ew_CL }, + /* 4 */ { 0, &Ia_shlw_Ew_CL }, + /* 5 */ { 0, &Ia_shrw_Ew_CL }, + /* 6 */ { 0, &Ia_shlw_Ew_CL }, + /* 7 */ { 0, &Ia_sarw_Ew_CL } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupG2EdCL[8] = { + /* 0 */ { 0, &Ia_roll_Ed_CL }, + /* 1 */ { 0, &Ia_rorl_Ed_CL }, + /* 2 */ { 0, &Ia_rcll_Ed_CL }, + /* 3 */ { 0, &Ia_rcrl_Ed_CL }, + /* 4 */ { 0, &Ia_shll_Ed_CL }, + /* 5 */ { 0, &Ia_shrl_Ed_CL }, + /* 6 */ { 0, &Ia_shll_Ed_CL }, + /* 7 */ { 0, &Ia_sarl_Ed_CL } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupG2EqCL[8] = { + /* 0 */ { 0, &Ia_rolq_Eq_CL }, + /* 1 */ { 0, &Ia_rorq_Eq_CL }, + /* 2 */ { 0, &Ia_rclq_Eq_CL }, + /* 3 */ { 0, &Ia_rcrq_Eq_CL }, + /* 4 */ { 0, &Ia_shlq_Eq_CL }, + /* 5 */ { 0, &Ia_shrq_Eq_CL }, + /* 6 */ { 0, &Ia_shlq_Eq_CL }, + /* 7 */ { 0, &Ia_sarq_Eq_CL } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupG3Eb[8] = { + /* 0 */ { 0, &Ia_testb_Eb_Ib }, + /* 1 */ { 0, &Ia_testb_Eb_Ib }, + /* 2 */ { 0, &Ia_notb_Eb }, + /* 3 */ { 0, &Ia_negb_Eb }, + /* 4 */ { 0, &Ia_mulb_AL_Eb }, + /* 5 */ { 0, &Ia_imulb_AL_Eb }, + /* 6 */ { 0, &Ia_divb_AL_Eb }, + /* 7 */ { 0, &Ia_idivb_AL_Eb } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupG3Ew[8] = { + /* 0 */ { 0, &Ia_testw_Ew_Iw }, + /* 1 */ { 0, &Ia_testw_Ew_Iw }, + /* 2 */ { 0, &Ia_notw_Ew }, + /* 3 */ { 0, &Ia_negw_Ew }, + /* 4 */ { 0, &Ia_mulw_AX_Ew }, + /* 5 */ { 0, &Ia_imulw_AX_Ew }, + /* 6 */ { 0, &Ia_divw_AX_Ew }, + /* 7 */ { 0, &Ia_idivw_AX_Ew } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupG3Ed[8] = { + /* 0 */ { 0, &Ia_testl_Ed_Id }, + /* 1 */ { 0, &Ia_testl_Ed_Id }, + /* 2 */ { 0, &Ia_notl_Ed }, + /* 3 */ { 0, &Ia_negl_Ed }, + /* 4 */ { 0, &Ia_mull_EAX_Ed }, + /* 5 */ { 0, &Ia_imull_EAX_Ed }, + /* 6 */ { 0, &Ia_divl_EAX_Ed }, + /* 7 */ { 0, &Ia_idivl_EAX_Ed } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupG3Eq[8] = { + /* 0 */ { 0, &Ia_testq_Eq_sId }, + /* 1 */ { 0, &Ia_testq_Eq_sId }, + /* 2 */ { 0, &Ia_notq_Eq }, + /* 3 */ { 0, &Ia_negq_Eq }, + /* 4 */ { 0, &Ia_mulq_RAX_Eq }, + /* 5 */ { 0, &Ia_imulq_RAX_Eq }, + /* 6 */ { 0, &Ia_divq_RAX_Eq }, + /* 7 */ { 0, &Ia_idivq_RAX_Eq } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupG4[8] = { + /* 0 */ { 0, &Ia_incb_Eb }, + /* 1 */ { 0, &Ia_decb_Eb }, + /* 2 */ { 0, &Ia_Invalid }, + /* 3 */ { 0, &Ia_Invalid }, + /* 4 */ { 0, &Ia_Invalid }, + /* 5 */ { 0, &Ia_Invalid }, + /* 6 */ { 0, &Ia_Invalid }, + /* 7 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupG5w[8] = { + /* 0 */ { 0, &Ia_incw_Ew }, + /* 1 */ { 0, &Ia_decw_Ew }, + /* 2 */ { 0, &Ia_call_Ew }, + /* 3 */ { 0, &Ia_lcall_Mp }, + /* 4 */ { 0, &Ia_jmp_Ew }, + /* 5 */ { 0, &Ia_ljmp_Mp }, + /* 6 */ { 0, &Ia_pushw_Ew }, + /* 7 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupG5d[8] = { + /* 0 */ { 0, &Ia_incl_Ed }, + /* 1 */ { 0, &Ia_decl_Ed }, + /* 2 */ { 0, &Ia_call_Ed }, + /* 3 */ { 0, &Ia_lcall_Mp }, + /* 4 */ { 0, &Ia_jmp_Ed }, + /* 5 */ { 0, &Ia_ljmp_Mp }, + /* 6 */ { 0, &Ia_pushl_Ed }, + /* 7 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroup64G5d[8] = { + /* 0 */ { 0, &Ia_incl_Ed }, + /* 1 */ { 0, &Ia_decl_Ed }, + /* 2 */ { 0, &Ia_call_Eq }, + /* 3 */ { 0, &Ia_lcall_Mp }, + /* 4 */ { 0, &Ia_jmp_Eq }, + /* 5 */ { 0, &Ia_ljmp_Mp }, + /* 6 */ { 0, &Ia_pushq_Eq }, + /* 7 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroup64G5q[8] = { + /* 0 */ { 0, &Ia_incq_Eq }, + /* 1 */ { 0, &Ia_decq_Eq }, + /* 2 */ { 0, &Ia_call_Eq }, + /* 3 */ { 0, &Ia_lcall_Mp }, + /* 4 */ { 0, &Ia_jmp_Eq }, + /* 5 */ { 0, &Ia_ljmp_Mp }, + /* 6 */ { 0, &Ia_pushq_Eq }, + /* 7 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupG6[8] = { + /* 0 */ { 0, &Ia_sldt }, + /* 1 */ { 0, &Ia_str }, + /* 2 */ { 0, &Ia_lldt }, + /* 3 */ { 0, &Ia_ltr }, + /* 4 */ { 0, &Ia_verr }, + /* 5 */ { 0, &Ia_verw }, + /* 6 */ { 0, &Ia_Invalid }, + /* 7 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupRmINVLPG[8] = { + /* 0 */ { 0, &Ia_swapgs }, + /* 1 */ { 0, &Ia_rdtscp }, + /* 2 */ { 0, &Ia_Invalid }, + /* 3 */ { 0, &Ia_Invalid }, + /* 4 */ { 0, &Ia_Invalid }, + /* 5 */ { 0, &Ia_Invalid }, + /* 6 */ { 0, &Ia_Invalid }, + /* 7 */ { 0, &Ia_Invalid }, +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupModINVLPG[2] = { + /* R */ { GRPRM(INVLPG) }, + /* M */ { 0, &Ia_invlpg } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupRmSIDT[8] = { + /* 0 */ { 0, &Ia_monitor }, + /* 1 */ { 0, &Ia_mwait }, + /* 2 */ { 0, &Ia_Invalid }, + /* 3 */ { 0, &Ia_Invalid }, + /* 4 */ { 0, &Ia_Invalid }, + /* 5 */ { 0, &Ia_Invalid }, + /* 6 */ { 0, &Ia_Invalid }, + /* 7 */ { 0, &Ia_Invalid }, +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupModSIDT[2] = { + /* R */ { GRPRM(SIDT) }, + /* M */ { 0, &Ia_sidt } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupG7[8] = { + /* 0 */ { 0, &Ia_sgdt }, + /* 1 */ { GRPMOD(SIDT) }, + /* 2 */ { 0, &Ia_lgdt }, + /* 3 */ { 0, &Ia_lidt }, + /* 4 */ { 0, &Ia_smsw_Ew }, + /* 5 */ { 0, &Ia_Invalid }, + /* 6 */ { 0, &Ia_lmsw_Ew }, + /* 7 */ { GRPMOD(INVLPG) }, +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupG8EwIb[8] = { + /* 0 */ { 0, &Ia_Invalid }, + /* 1 */ { 0, &Ia_Invalid }, + /* 2 */ { 0, &Ia_Invalid }, + /* 3 */ { 0, &Ia_Invalid }, + /* 4 */ { 0, &Ia_btw_Ew_Ib }, + /* 5 */ { 0, &Ia_btsw_Ew_Ib }, + /* 6 */ { 0, &Ia_btrw_Ew_Ib }, + /* 7 */ { 0, &Ia_btcw_Ew_Ib } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupG8EdIb[8] = { + /* 0 */ { 0, &Ia_Invalid }, + /* 1 */ { 0, &Ia_Invalid }, + /* 2 */ { 0, &Ia_Invalid }, + /* 3 */ { 0, &Ia_Invalid }, + /* 4 */ { 0, &Ia_btl_Ed_Ib }, + /* 5 */ { 0, &Ia_btsl_Ed_Ib }, + /* 6 */ { 0, &Ia_btrl_Ed_Ib }, + /* 7 */ { 0, &Ia_btcl_Ed_Ib } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupG8EqIb[8] = { + /* 0 */ { 0, &Ia_Invalid }, + /* 1 */ { 0, &Ia_Invalid }, + /* 2 */ { 0, &Ia_Invalid }, + /* 3 */ { 0, &Ia_Invalid }, + /* 4 */ { 0, &Ia_btq_Eq_Ib }, + /* 5 */ { 0, &Ia_btsq_Eq_Ib }, + /* 6 */ { 0, &Ia_btrq_Eq_Ib }, + /* 7 */ { 0, &Ia_btcq_Eq_Ib } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupG9[8] = { + /* 0 */ { 0, &Ia_Invalid }, + /* 1 */ { 0, &Ia_cmpxchg8b }, + /* 2 */ { 0, &Ia_Invalid }, + /* 3 */ { 0, &Ia_Invalid }, + /* 4 */ { 0, &Ia_Invalid }, + /* 5 */ { 0, &Ia_Invalid }, + /* 6 */ { 0, &Ia_Invalid }, + /* 7 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupG9q[8] = { + /* 0 */ { 0, &Ia_Invalid }, + /* 1 */ { 0, &Ia_cmpxchg16b }, + /* 2 */ { 0, &Ia_Invalid }, + /* 3 */ { 0, &Ia_Invalid }, + /* 4 */ { 0, &Ia_Invalid }, + /* 5 */ { 0, &Ia_Invalid }, + /* 6 */ { 0, &Ia_Invalid }, + /* 7 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupG12[8] = { + /* 0 */ { 0, &Ia_Invalid }, + /* 1 */ { 0, &Ia_Invalid }, + /* 2 */ { GRPSSE(G1202) }, + /* 3 */ { 0, &Ia_Invalid }, + /* 4 */ { GRPSSE(G1204) }, + /* 5 */ { 0, &Ia_Invalid }, + /* 6 */ { GRPSSE(G1206) }, + /* 7 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupG13[8] = { + /* 0 */ { 0, &Ia_Invalid }, + /* 1 */ { 0, &Ia_Invalid }, + /* 2 */ { GRPSSE(G1302) }, + /* 3 */ { 0, &Ia_Invalid }, + /* 4 */ { GRPSSE(G1304) }, + /* 5 */ { 0, &Ia_Invalid }, + /* 6 */ { GRPSSE(G1306) }, + /* 7 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupG14[8] = { + /* 0 */ { 0, &Ia_Invalid }, + /* 1 */ { 0, &Ia_Invalid }, + /* 2 */ { GRPSSE(G1402) }, + /* 3 */ { GRPSSE(G1403) }, + /* 4 */ { 0, &Ia_Invalid }, + /* 5 */ { 0, &Ia_Invalid }, + /* 6 */ { GRPSSE(G1406) }, + /* 7 */ { GRPSSE(G1407) } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupModCFLUSH[2] = { + /* R */ { 0, &Ia_sfence }, + /* M */ { 0, &Ia_cflush } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupG15[8] = { + /* 0 */ { 0, &Ia_fxsave }, + /* 1 */ { 0, &Ia_fxrstor }, + /* 2 */ { 0, &Ia_ldmxcsr }, + /* 3 */ { 0, &Ia_stmxcsr }, + /* 4 */ { 0, &Ia_Invalid }, + /* 5 */ { 0, &Ia_lfence }, + /* 6 */ { 0, &Ia_mfence }, + /* 7 */ { GRPMOD(CFLUSH) } /* SFENCE/CFLUSH */ +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupG16[8] = +{ + /* 0 */ { 0, &Ia_prefetchnta }, + /* 1 */ { 0, &Ia_prefetcht0 }, + /* 2 */ { 0, &Ia_prefetcht1 }, + /* 3 */ { 0, &Ia_prefetcht2 }, + /* 4 */ { 0, &Ia_Invalid }, + /* 5 */ { 0, &Ia_Invalid }, + /* 6 */ { 0, &Ia_Invalid }, + /* 7 */ { 0, &Ia_Invalid } +}; + +/* ************************************************************************ */ +/* 3DNow! opcodes */ + +static BxDisasmOpcodeTable_t BxDisasm3DNowGroup[256] = { + // 256 entries for 3DNow opcodes_by suffix + /* 00 */ { 0, &Ia_Invalid }, + /* 01 */ { 0, &Ia_Invalid }, + /* 02 */ { 0, &Ia_Invalid }, + /* 03 */ { 0, &Ia_Invalid }, + /* 04 */ { 0, &Ia_Invalid }, + /* 05 */ { 0, &Ia_Invalid }, + /* 06 */ { 0, &Ia_Invalid }, + /* 07 */ { 0, &Ia_Invalid }, + /* 08 */ { 0, &Ia_Invalid }, + /* 09 */ { 0, &Ia_Invalid }, + /* 0A */ { 0, &Ia_Invalid }, + /* 0B */ { 0, &Ia_Invalid }, + /* 0C */ { 0, &Ia_pi2fw_Pq_Qq }, + /* 0D */ { 0, &Ia_pi2fd_Pq_Qq }, + /* 0E */ { 0, &Ia_Invalid }, + /* 0F */ { 0, &Ia_Invalid }, + /* 10 */ { 0, &Ia_Invalid }, + /* 11 */ { 0, &Ia_Invalid }, + /* 12 */ { 0, &Ia_Invalid }, + /* 13 */ { 0, &Ia_Invalid }, + /* 14 */ { 0, &Ia_Invalid }, + /* 15 */ { 0, &Ia_Invalid }, + /* 16 */ { 0, &Ia_Invalid }, + /* 17 */ { 0, &Ia_Invalid }, + /* 18 */ { 0, &Ia_Invalid }, + /* 19 */ { 0, &Ia_Invalid }, + /* 1A */ { 0, &Ia_Invalid }, + /* 1B */ { 0, &Ia_Invalid }, + /* 1C */ { 0, &Ia_pf2iw_Pq_Qq }, + /* 1D */ { 0, &Ia_pf2id_Pq_Qq }, + /* 1E */ { 0, &Ia_Invalid }, + /* 1F */ { 0, &Ia_Invalid }, + /* 20 */ { 0, &Ia_Invalid }, + /* 21 */ { 0, &Ia_Invalid }, + /* 22 */ { 0, &Ia_Invalid }, + /* 23 */ { 0, &Ia_Invalid }, + /* 24 */ { 0, &Ia_Invalid }, + /* 25 */ { 0, &Ia_Invalid }, + /* 26 */ { 0, &Ia_Invalid }, + /* 27 */ { 0, &Ia_Invalid }, + /* 28 */ { 0, &Ia_Invalid }, + /* 29 */ { 0, &Ia_Invalid }, + /* 2A */ { 0, &Ia_Invalid }, + /* 2B */ { 0, &Ia_Invalid }, + /* 2C */ { 0, &Ia_Invalid }, + /* 2D */ { 0, &Ia_Invalid }, + /* 2E */ { 0, &Ia_Invalid }, + /* 2F */ { 0, &Ia_Invalid }, + /* 30 */ { 0, &Ia_Invalid }, + /* 31 */ { 0, &Ia_Invalid }, + /* 32 */ { 0, &Ia_Invalid }, + /* 33 */ { 0, &Ia_Invalid }, + /* 34 */ { 0, &Ia_Invalid }, + /* 35 */ { 0, &Ia_Invalid }, + /* 36 */ { 0, &Ia_Invalid }, + /* 37 */ { 0, &Ia_Invalid }, + /* 38 */ { 0, &Ia_Invalid }, + /* 39 */ { 0, &Ia_Invalid }, + /* 3A */ { 0, &Ia_Invalid }, + /* 3B */ { 0, &Ia_Invalid }, + /* 3C */ { 0, &Ia_Invalid }, + /* 3D */ { 0, &Ia_Invalid }, + /* 3E */ { 0, &Ia_Invalid }, + /* 3F */ { 0, &Ia_Invalid }, + /* 40 */ { 0, &Ia_Invalid }, + /* 41 */ { 0, &Ia_Invalid }, + /* 42 */ { 0, &Ia_Invalid }, + /* 43 */ { 0, &Ia_Invalid }, + /* 44 */ { 0, &Ia_Invalid }, + /* 45 */ { 0, &Ia_Invalid }, + /* 46 */ { 0, &Ia_Invalid }, + /* 47 */ { 0, &Ia_Invalid }, + /* 48 */ { 0, &Ia_Invalid }, + /* 49 */ { 0, &Ia_Invalid }, + /* 4A */ { 0, &Ia_Invalid }, + /* 4B */ { 0, &Ia_Invalid }, + /* 4C */ { 0, &Ia_Invalid }, + /* 4D */ { 0, &Ia_Invalid }, + /* 4E */ { 0, &Ia_Invalid }, + /* 4F */ { 0, &Ia_Invalid }, + /* 50 */ { 0, &Ia_Invalid }, + /* 51 */ { 0, &Ia_Invalid }, + /* 52 */ { 0, &Ia_Invalid }, + /* 53 */ { 0, &Ia_Invalid }, + /* 54 */ { 0, &Ia_Invalid }, + /* 55 */ { 0, &Ia_Invalid }, + /* 56 */ { 0, &Ia_Invalid }, + /* 57 */ { 0, &Ia_Invalid }, + /* 58 */ { 0, &Ia_Invalid }, + /* 59 */ { 0, &Ia_Invalid }, + /* 5A */ { 0, &Ia_Invalid }, + /* 5B */ { 0, &Ia_Invalid }, + /* 5C */ { 0, &Ia_Invalid }, + /* 5D */ { 0, &Ia_Invalid }, + /* 5E */ { 0, &Ia_Invalid }, + /* 5F */ { 0, &Ia_Invalid }, + /* 60 */ { 0, &Ia_Invalid }, + /* 61 */ { 0, &Ia_Invalid }, + /* 62 */ { 0, &Ia_Invalid }, + /* 63 */ { 0, &Ia_Invalid }, + /* 64 */ { 0, &Ia_Invalid }, + /* 65 */ { 0, &Ia_Invalid }, + /* 66 */ { 0, &Ia_Invalid }, + /* 67 */ { 0, &Ia_Invalid }, + /* 68 */ { 0, &Ia_Invalid }, + /* 69 */ { 0, &Ia_Invalid }, + /* 6A */ { 0, &Ia_Invalid }, + /* 6B */ { 0, &Ia_Invalid }, + /* 6C */ { 0, &Ia_Invalid }, + /* 6D */ { 0, &Ia_Invalid }, + /* 6E */ { 0, &Ia_Invalid }, + /* 6F */ { 0, &Ia_Invalid }, + /* 70 */ { 0, &Ia_Invalid }, + /* 71 */ { 0, &Ia_Invalid }, + /* 72 */ { 0, &Ia_Invalid }, + /* 73 */ { 0, &Ia_Invalid }, + /* 74 */ { 0, &Ia_Invalid }, + /* 75 */ { 0, &Ia_Invalid }, + /* 76 */ { 0, &Ia_Invalid }, + /* 77 */ { 0, &Ia_Invalid }, + /* 78 */ { 0, &Ia_Invalid }, + /* 79 */ { 0, &Ia_Invalid }, + /* 7A */ { 0, &Ia_Invalid }, + /* 7B */ { 0, &Ia_Invalid }, + /* 7C */ { 0, &Ia_Invalid }, + /* 7D */ { 0, &Ia_Invalid }, + /* 7E */ { 0, &Ia_Invalid }, + /* 7F */ { 0, &Ia_Invalid }, + /* 80 */ { 0, &Ia_Invalid }, + /* 81 */ { 0, &Ia_Invalid }, + /* 82 */ { 0, &Ia_Invalid }, + /* 83 */ { 0, &Ia_Invalid }, + /* 84 */ { 0, &Ia_Invalid }, + /* 85 */ { 0, &Ia_Invalid }, + /* 86 */ { 0, &Ia_Invalid }, + /* 87 */ { 0, &Ia_Invalid }, + /* 88 */ { 0, &Ia_Invalid }, + /* 89 */ { 0, &Ia_Invalid }, + /* 8A */ { 0, &Ia_pfnacc_Pq_Qq }, + /* 8B */ { 0, &Ia_Invalid }, + /* 8C */ { 0, &Ia_Invalid }, + /* 8D */ { 0, &Ia_Invalid }, + /* 8E */ { 0, &Ia_pfpnacc_Pq_Qq }, + /* 8F */ { 0, &Ia_Invalid }, + /* 90 */ { 0, &Ia_pfcmpge_Pq_Qq }, + /* 91 */ { 0, &Ia_Invalid }, + /* 92 */ { 0, &Ia_Invalid }, + /* 93 */ { 0, &Ia_Invalid }, + /* 94 */ { 0, &Ia_pfmin_Pq_Qq }, + /* 95 */ { 0, &Ia_Invalid }, + /* 96 */ { 0, &Ia_pfrcp_Pq_Qq }, + /* 97 */ { 0, &Ia_pfrsqrt_Pq_Qq }, + /* 98 */ { 0, &Ia_Invalid }, + /* 99 */ { 0, &Ia_Invalid }, + /* 9A */ { 0, &Ia_pfsub_Pq_Qq }, + /* 9B */ { 0, &Ia_Invalid }, + /* 9C */ { 0, &Ia_Invalid }, + /* 9D */ { 0, &Ia_Invalid }, + /* 9E */ { 0, &Ia_pfadd_Pq_Qq }, + /* 9F */ { 0, &Ia_Invalid }, + /* A0 */ { 0, &Ia_pfcmpgt_Pq_Qq }, + /* A1 */ { 0, &Ia_Invalid }, + /* A2 */ { 0, &Ia_Invalid }, + /* A3 */ { 0, &Ia_Invalid }, + /* A4 */ { 0, &Ia_pfmax_Pq_Qq }, + /* A5 */ { 0, &Ia_Invalid }, + /* A6 */ { 0, &Ia_pfrcpit1_Pq_Qq }, + /* A7 */ { 0, &Ia_pfrsqit1_Pq_Qq }, + /* A8 */ { 0, &Ia_Invalid }, + /* A9 */ { 0, &Ia_Invalid }, + /* AA */ { 0, &Ia_pfsubr_Pq_Qq }, + /* AB */ { 0, &Ia_Invalid }, + /* AC */ { 0, &Ia_Invalid }, + /* AD */ { 0, &Ia_Invalid }, + /* AE */ { 0, &Ia_pfacc_Pq_Qq }, + /* AF */ { 0, &Ia_Invalid }, + /* B0 */ { 0, &Ia_pfcmpeq_Pq_Qq }, + /* B1 */ { 0, &Ia_Invalid }, + /* B2 */ { 0, &Ia_Invalid }, + /* B3 */ { 0, &Ia_Invalid }, + /* B4 */ { 0, &Ia_pfmul_Pq_Qq }, + /* B5 */ { 0, &Ia_Invalid }, + /* B6 */ { 0, &Ia_pfrcpit2_Pq_Qq }, + /* B7 */ { 0, &Ia_pmulhrw_Pq_Qq }, + /* B8 */ { 0, &Ia_Invalid }, + /* B9 */ { 0, &Ia_Invalid }, + /* BA */ { 0, &Ia_Invalid }, + /* BB */ { 0, &Ia_pswapd_Pq_Qq }, + /* BC */ { 0, &Ia_Invalid }, + /* BD */ { 0, &Ia_Invalid }, + /* BE */ { 0, &Ia_Invalid }, + /* BF */ { 0, &Ia_pavgb_Pq_Qq }, + /* C0 */ { 0, &Ia_Invalid }, + /* C1 */ { 0, &Ia_Invalid }, + /* C2 */ { 0, &Ia_Invalid }, + /* C3 */ { 0, &Ia_Invalid }, + /* C4 */ { 0, &Ia_Invalid }, + /* C5 */ { 0, &Ia_Invalid }, + /* C6 */ { 0, &Ia_Invalid }, + /* C7 */ { 0, &Ia_Invalid }, + /* C8 */ { 0, &Ia_Invalid }, + /* C9 */ { 0, &Ia_Invalid }, + /* CA */ { 0, &Ia_Invalid }, + /* CB */ { 0, &Ia_Invalid }, + /* CC */ { 0, &Ia_Invalid }, + /* CD */ { 0, &Ia_Invalid }, + /* CE */ { 0, &Ia_Invalid }, + /* CF */ { 0, &Ia_Invalid }, + /* D0 */ { 0, &Ia_Invalid }, + /* D1 */ { 0, &Ia_Invalid }, + /* D2 */ { 0, &Ia_Invalid }, + /* D3 */ { 0, &Ia_Invalid }, + /* D4 */ { 0, &Ia_Invalid }, + /* D5 */ { 0, &Ia_Invalid }, + /* D6 */ { 0, &Ia_Invalid }, + /* D7 */ { 0, &Ia_Invalid }, + /* D8 */ { 0, &Ia_Invalid }, + /* D9 */ { 0, &Ia_Invalid }, + /* DA */ { 0, &Ia_Invalid }, + /* DB */ { 0, &Ia_Invalid }, + /* DC */ { 0, &Ia_Invalid }, + /* DD */ { 0, &Ia_Invalid }, + /* DE */ { 0, &Ia_Invalid }, + /* DF */ { 0, &Ia_Invalid }, + /* E0 */ { 0, &Ia_Invalid }, + /* E1 */ { 0, &Ia_Invalid }, + /* E2 */ { 0, &Ia_Invalid }, + /* E3 */ { 0, &Ia_Invalid }, + /* E4 */ { 0, &Ia_Invalid }, + /* E5 */ { 0, &Ia_Invalid }, + /* E6 */ { 0, &Ia_Invalid }, + /* E7 */ { 0, &Ia_Invalid }, + /* E8 */ { 0, &Ia_Invalid }, + /* E9 */ { 0, &Ia_Invalid }, + /* EA */ { 0, &Ia_Invalid }, + /* EB */ { 0, &Ia_Invalid }, + /* EC */ { 0, &Ia_Invalid }, + /* ED */ { 0, &Ia_Invalid }, + /* EE */ { 0, &Ia_Invalid }, + /* EF */ { 0, &Ia_Invalid }, + /* F0 */ { 0, &Ia_Invalid }, + /* F1 */ { 0, &Ia_Invalid }, + /* F2 */ { 0, &Ia_Invalid }, + /* F3 */ { 0, &Ia_Invalid }, + /* F4 */ { 0, &Ia_Invalid }, + /* F5 */ { 0, &Ia_Invalid }, + /* F6 */ { 0, &Ia_Invalid }, + /* F7 */ { 0, &Ia_Invalid }, + /* F8 */ { 0, &Ia_Invalid }, + /* F9 */ { 0, &Ia_Invalid }, + /* FA */ { 0, &Ia_Invalid }, + /* FB */ { 0, &Ia_Invalid }, + /* FC */ { 0, &Ia_Invalid }, + /* FD */ { 0, &Ia_Invalid }, + /* FE */ { 0, &Ia_Invalid }, + /* FF */ { 0, &Ia_Invalid } +}; + +/* ************************************************************************ */ +/* FPU Opcodes */ + +// floating point instructions when mod!=11b. +// the following tables will be accessed like groups using the nnn (reg) field of +// the modrm byte. (the first byte is D8-DF) + + // D8 (modrm is outside 00h - BFh) (mod != 11) +static BxDisasmOpcodeTable_t BxDisasmFPGroupD8[8] = { + /* 0 */ { 0, &Ia_fadds_Md }, + /* 1 */ { 0, &Ia_fmuls_Md }, + /* 2 */ { 0, &Ia_fcoms_Md }, + /* 3 */ { 0, &Ia_fcomps_Md }, + /* 4 */ { 0, &Ia_fsubs_Md }, + /* 5 */ { 0, &Ia_fsubrs_Md }, + /* 6 */ { 0, &Ia_fdivs_Md }, + /* 7 */ { 0, &Ia_fdivrs_Md } +}; + + // D9 (modrm is outside 00h - BFh) (mod != 11) +static BxDisasmOpcodeTable_t BxDisasmFPGroupD9[8] = { + /* 0 */ { 0, &Ia_flds_Md }, + /* 1 */ { 0, &Ia_Invalid }, + /* 2 */ { 0, &Ia_fsts_Md }, + /* 3 */ { 0, &Ia_fstps_Md }, + /* 4 */ { 0, &Ia_fldenv }, + /* 5 */ { 0, &Ia_fldcw }, + /* 6 */ { 0, &Ia_fnstenv }, + /* 7 */ { 0, &Ia_fnstcw } +}; + + // DA (modrm is outside 00h - BFh) (mod != 11) +static BxDisasmOpcodeTable_t BxDisasmFPGroupDA[8] = { + /* 0 */ { 0, &Ia_fiaddl_Md }, + /* 1 */ { 0, &Ia_fimull_Md }, + /* 2 */ { 0, &Ia_ficoml_Md }, + /* 3 */ { 0, &Ia_ficompl_Md }, + /* 4 */ { 0, &Ia_fisubl_Md }, + /* 5 */ { 0, &Ia_fisubrl_Md }, + /* 6 */ { 0, &Ia_fidivl_Md }, + /* 7 */ { 0, &Ia_fidivrl_Md } +}; + + // DB (modrm is outside 00h - BFh) (mod != 11) +static BxDisasmOpcodeTable_t BxDisasmFPGroupDB[8] = { + /* 0 */ { 0, &Ia_fildl_Md }, + /* 1 */ { 0, &Ia_fisttpl_Md }, + /* 2 */ { 0, &Ia_fistl_Md }, + /* 3 */ { 0, &Ia_fistpl_Md }, + /* 4 */ { 0, &Ia_Invalid }, + /* 5 */ { 0, &Ia_fldt_Mt }, + /* 6 */ { 0, &Ia_Invalid }, + /* 7 */ { 0, &Ia_fstpt_Mt } +}; + + // DC (modrm is outside 00h - BFh) (mod != 11) +static BxDisasmOpcodeTable_t BxDisasmFPGroupDC[8] = { + /* 0 */ { 0, &Ia_faddl_Mq }, + /* 1 */ { 0, &Ia_fmull_Mq }, + /* 2 */ { 0, &Ia_fcoml_Mq }, + /* 3 */ { 0, &Ia_fcompl_Mq }, + /* 4 */ { 0, &Ia_fsubl_Mq }, + /* 5 */ { 0, &Ia_fsubrl_Mq }, + /* 6 */ { 0, &Ia_fdivl_Mq }, + /* 7 */ { 0, &Ia_fdivrl_Mq } +}; + + // DD (modrm is outside 00h - BFh) (mod != 11) +static BxDisasmOpcodeTable_t BxDisasmFPGroupDD[8] = { + /* 0 */ { 0, &Ia_fldl_Mq }, + /* 1 */ { 0, &Ia_fisttpq_Mq }, + /* 2 */ { 0, &Ia_fstl_Mq }, + /* 3 */ { 0, &Ia_fstpl_Mq }, + /* 4 */ { 0, &Ia_frstor }, + /* 5 */ { 0, &Ia_Invalid }, + /* 6 */ { 0, &Ia_fnsave }, + /* 7 */ { 0, &Ia_fnstsw } +}; + + // DE (modrm is outside 00h - BFh) (mod != 11) +static BxDisasmOpcodeTable_t BxDisasmFPGroupDE[8] = { + /* 0 */ { 0, &Ia_fiadds_Mw }, + /* 1 */ { 0, &Ia_fimuls_Mw }, + /* 2 */ { 0, &Ia_ficoms_Mw }, + /* 3 */ { 0, &Ia_ficomps_Mw }, + /* 4 */ { 0, &Ia_fisubs_Mw }, + /* 5 */ { 0, &Ia_fisubrs_Mw }, + /* 6 */ { 0, &Ia_fidivs_Mw }, + /* 7 */ { 0, &Ia_fidivrs_Mw } +}; + + // DF (modrm is outside 00h - BFh) (mod != 11) +static BxDisasmOpcodeTable_t BxDisasmFPGroupDF[8] = { + /* 0 */ { 0, &Ia_filds_Mw }, + /* 1 */ { 0, &Ia_fisttps_Mw }, + /* 2 */ { 0, &Ia_fists_Mw }, + /* 3 */ { 0, &Ia_fistps_Mw }, + /* 4 */ { 0, &Ia_fbldt_Mt }, + /* 5 */ { 0, &Ia_fildq_Mq }, + /* 6 */ { 0, &Ia_fbstpt_Mt }, + /* 7 */ { 0, &Ia_fistpq_Mq } +}; + +// 512 entries for second byte of floating point instructions. (when mod==11b) +static BxDisasmOpcodeTable_t BxDisasmOpcodeInfoFP[512] = { + // D8 (modrm is outside 00h - BFh) (mod == 11) + /* D8 C0 */ { 0, &Ia_fadd_ST0_STi }, + /* D8 C1 */ { 0, &Ia_fadd_ST0_STi }, + /* D8 C2 */ { 0, &Ia_fadd_ST0_STi }, + /* D8 C3 */ { 0, &Ia_fadd_ST0_STi }, + /* D8 C4 */ { 0, &Ia_fadd_ST0_STi }, + /* D8 C5 */ { 0, &Ia_fadd_ST0_STi }, + /* D8 C6 */ { 0, &Ia_fadd_ST0_STi }, + /* D8 C7 */ { 0, &Ia_fadd_ST0_STi }, + /* D8 C8 */ { 0, &Ia_fmul_ST0_STi }, + /* D8 C9 */ { 0, &Ia_fmul_ST0_STi }, + /* D8 CA */ { 0, &Ia_fmul_ST0_STi }, + /* D8 CB */ { 0, &Ia_fmul_ST0_STi }, + /* D8 CC */ { 0, &Ia_fmul_ST0_STi }, + /* D8 CD */ { 0, &Ia_fmul_ST0_STi }, + /* D8 CE */ { 0, &Ia_fmul_ST0_STi }, + /* D8 CF */ { 0, &Ia_fmul_ST0_STi }, + /* D8 D0 */ { 0, &Ia_fcom_STi }, + /* D8 D1 */ { 0, &Ia_fcom_STi }, + /* D8 D2 */ { 0, &Ia_fcom_STi }, + /* D8 D3 */ { 0, &Ia_fcom_STi }, + /* D8 D4 */ { 0, &Ia_fcom_STi }, + /* D8 D5 */ { 0, &Ia_fcom_STi }, + /* D8 D6 */ { 0, &Ia_fcom_STi }, + /* D8 D7 */ { 0, &Ia_fcom_STi }, + /* D8 D8 */ { 0, &Ia_fcomp_STi }, + /* D8 D9 */ { 0, &Ia_fcomp_STi }, + /* D8 DA */ { 0, &Ia_fcomp_STi }, + /* D8 DB */ { 0, &Ia_fcomp_STi }, + /* D8 DC */ { 0, &Ia_fcomp_STi }, + /* D8 DD */ { 0, &Ia_fcomp_STi }, + /* D8 DE */ { 0, &Ia_fcomp_STi }, + /* D8 DF */ { 0, &Ia_fcomp_STi }, + /* D8 E0 */ { 0, &Ia_fsub_ST0_STi }, + /* D8 E1 */ { 0, &Ia_fsub_ST0_STi }, + /* D8 E2 */ { 0, &Ia_fsub_ST0_STi }, + /* D8 E3 */ { 0, &Ia_fsub_ST0_STi }, + /* D8 E4 */ { 0, &Ia_fsub_ST0_STi }, + /* D8 E5 */ { 0, &Ia_fsub_ST0_STi }, + /* D8 E6 */ { 0, &Ia_fsub_ST0_STi }, + /* D8 E7 */ { 0, &Ia_fsub_ST0_STi }, + /* D8 E8 */ { 0, &Ia_fsubr_ST0_STi }, + /* D8 E9 */ { 0, &Ia_fsubr_ST0_STi }, + /* D8 EA */ { 0, &Ia_fsubr_ST0_STi }, + /* D8 EB */ { 0, &Ia_fsubr_ST0_STi }, + /* D8 EC */ { 0, &Ia_fsubr_ST0_STi }, + /* D8 ED */ { 0, &Ia_fsubr_ST0_STi }, + /* D8 EE */ { 0, &Ia_fsubr_ST0_STi }, + /* D8 EF */ { 0, &Ia_fsubr_ST0_STi }, + /* D8 F0 */ { 0, &Ia_fdiv_ST0_STi }, + /* D8 F1 */ { 0, &Ia_fdiv_ST0_STi }, + /* D8 F2 */ { 0, &Ia_fdiv_ST0_STi }, + /* D8 F3 */ { 0, &Ia_fdiv_ST0_STi }, + /* D8 F4 */ { 0, &Ia_fdiv_ST0_STi }, + /* D8 F5 */ { 0, &Ia_fdiv_ST0_STi }, + /* D8 F6 */ { 0, &Ia_fdiv_ST0_STi }, + /* D8 F7 */ { 0, &Ia_fdiv_ST0_STi }, + /* D8 F8 */ { 0, &Ia_fdivr_ST0_STi }, + /* D8 F9 */ { 0, &Ia_fdivr_ST0_STi }, + /* D8 FA */ { 0, &Ia_fdivr_ST0_STi }, + /* D8 FB */ { 0, &Ia_fdivr_ST0_STi }, + /* D8 FC */ { 0, &Ia_fdivr_ST0_STi }, + /* D8 FD */ { 0, &Ia_fdivr_ST0_STi }, + /* D8 FE */ { 0, &Ia_fdivr_ST0_STi }, + /* D8 FF */ { 0, &Ia_fdivr_ST0_STi }, + + // D9 (modrm is outside 00h - BFh) (mod == 11) + /* D9 C0 */ { 0, &Ia_fld_STi }, + /* D9 C1 */ { 0, &Ia_fld_STi }, + /* D9 C2 */ { 0, &Ia_fld_STi }, + /* D9 C3 */ { 0, &Ia_fld_STi }, + /* D9 C4 */ { 0, &Ia_fld_STi }, + /* D9 C5 */ { 0, &Ia_fld_STi }, + /* D9 C6 */ { 0, &Ia_fld_STi }, + /* D9 C7 */ { 0, &Ia_fld_STi }, + /* D9 C8 */ { 0, &Ia_fxch }, + /* D9 C9 */ { 0, &Ia_fxch }, + /* D9 CA */ { 0, &Ia_fxch }, + /* D9 CB */ { 0, &Ia_fxch }, + /* D9 CC */ { 0, &Ia_fxch }, + /* D9 CD */ { 0, &Ia_fxch }, + /* D9 CE */ { 0, &Ia_fxch }, + /* D9 CF */ { 0, &Ia_fxch }, + /* D9 D0 */ { 0, &Ia_fnop }, + /* D9 D1 */ { 0, &Ia_Invalid }, + /* D9 D2 */ { 0, &Ia_Invalid }, + /* D9 D3 */ { 0, &Ia_Invalid }, + /* D9 D4 */ { 0, &Ia_Invalid }, + /* D9 D5 */ { 0, &Ia_Invalid }, + /* D9 D6 */ { 0, &Ia_Invalid }, + /* D9 D7 */ { 0, &Ia_Invalid }, + /* D9 D8 */ { 0, &Ia_Invalid }, + /* D9 D9 */ { 0, &Ia_Invalid }, + /* D9 DA */ { 0, &Ia_Invalid }, + /* D9 DB */ { 0, &Ia_Invalid }, + /* D9 DC */ { 0, &Ia_Invalid }, + /* D9 DD */ { 0, &Ia_Invalid }, + /* D9 DE */ { 0, &Ia_Invalid }, + /* D9 DF */ { 0, &Ia_Invalid }, + /* D9 E0 */ { 0, &Ia_fchs }, + /* D9 E1 */ { 0, &Ia_fabs }, + /* D9 E2 */ { 0, &Ia_Invalid }, + /* D9 E3 */ { 0, &Ia_Invalid }, + /* D9 E4 */ { 0, &Ia_ftst }, + /* D9 E5 */ { 0, &Ia_fxam }, + /* D9 E6 */ { 0, &Ia_Invalid }, + /* D9 E7 */ { 0, &Ia_Invalid }, + /* D9 E8 */ { 0, &Ia_fld1 }, + /* D9 E9 */ { 0, &Ia_fldl2t }, + /* D9 EA */ { 0, &Ia_fldl2e }, + /* D9 EB */ { 0, &Ia_fldpi }, + /* D9 EC */ { 0, &Ia_fldlg2 }, + /* D9 ED */ { 0, &Ia_fldln2 }, + /* D9 EE */ { 0, &Ia_fldz }, + /* D9 EF */ { 0, &Ia_Invalid }, + /* D9 F0 */ { 0, &Ia_f2xm1 }, + /* D9 F1 */ { 0, &Ia_fyl2x }, + /* D9 F2 */ { 0, &Ia_fptan }, + /* D9 F3 */ { 0, &Ia_fpatan }, + /* D9 F4 */ { 0, &Ia_fxtract }, + /* D9 F5 */ { 0, &Ia_fprem1 }, + /* D9 F6 */ { 0, &Ia_fdecstp }, + /* D9 F7 */ { 0, &Ia_fincstp }, + /* D9 F8 */ { 0, &Ia_fprem }, + /* D9 F9 */ { 0, &Ia_fyl2xp1 }, + /* D9 FA */ { 0, &Ia_fsqrt }, + /* D9 FB */ { 0, &Ia_fsincos }, + /* D9 FC */ { 0, &Ia_frndint }, + /* D9 FD */ { 0, &Ia_fscale }, + /* D9 FE */ { 0, &Ia_fsin }, + /* D9 FF */ { 0, &Ia_fcos }, + + // DA (modrm is outside 00h - BFh) (mod == 11) + /* DA C0 */ { 0, &Ia_fcmovb_ST0_STi }, + /* DA C1 */ { 0, &Ia_fcmovb_ST0_STi }, + /* DA C2 */ { 0, &Ia_fcmovb_ST0_STi }, + /* DA C3 */ { 0, &Ia_fcmovb_ST0_STi }, + /* DA C4 */ { 0, &Ia_fcmovb_ST0_STi }, + /* DA C5 */ { 0, &Ia_fcmovb_ST0_STi }, + /* DA C6 */ { 0, &Ia_fcmovb_ST0_STi }, + /* DA C7 */ { 0, &Ia_fcmovb_ST0_STi }, + /* DA C8 */ { 0, &Ia_fcmove_ST0_STi }, + /* DA C9 */ { 0, &Ia_fcmove_ST0_STi }, + /* DA CA */ { 0, &Ia_fcmove_ST0_STi }, + /* DA CB */ { 0, &Ia_fcmove_ST0_STi }, + /* DA CC */ { 0, &Ia_fcmove_ST0_STi }, + /* DA CD */ { 0, &Ia_fcmove_ST0_STi }, + /* DA CE */ { 0, &Ia_fcmove_ST0_STi }, + /* DA CF */ { 0, &Ia_fcmove_ST0_STi }, + /* DA D0 */ { 0, &Ia_fcmovbe_ST0_STi }, + /* DA D1 */ { 0, &Ia_fcmovbe_ST0_STi }, + /* DA D2 */ { 0, &Ia_fcmovbe_ST0_STi }, + /* DA D3 */ { 0, &Ia_fcmovbe_ST0_STi }, + /* DA D4 */ { 0, &Ia_fcmovbe_ST0_STi }, + /* DA D5 */ { 0, &Ia_fcmovbe_ST0_STi }, + /* DA D6 */ { 0, &Ia_fcmovbe_ST0_STi }, + /* DA D7 */ { 0, &Ia_fcmovbe_ST0_STi }, + /* DA D8 */ { 0, &Ia_fcmovu_ST0_STi }, + /* DA D9 */ { 0, &Ia_fcmovu_ST0_STi }, + /* DA DA */ { 0, &Ia_fcmovu_ST0_STi }, + /* DA DB */ { 0, &Ia_fcmovu_ST0_STi }, + /* DA DC */ { 0, &Ia_fcmovu_ST0_STi }, + /* DA DD */ { 0, &Ia_fcmovu_ST0_STi }, + /* DA DE */ { 0, &Ia_fcmovu_ST0_STi }, + /* DA DF */ { 0, &Ia_fcmovu_ST0_STi }, + /* DA E0 */ { 0, &Ia_Invalid }, + /* DA E1 */ { 0, &Ia_Invalid }, + /* DA E2 */ { 0, &Ia_Invalid }, + /* DA E3 */ { 0, &Ia_Invalid }, + /* DA E4 */ { 0, &Ia_Invalid }, + /* DA E5 */ { 0, &Ia_Invalid }, + /* DA E6 */ { 0, &Ia_Invalid }, + /* DA E7 */ { 0, &Ia_Invalid }, + /* DA E8 */ { 0, &Ia_Invalid }, + /* DA E9 */ { 0, &Ia_fucompp }, + /* DA EA */ { 0, &Ia_Invalid }, + /* DA EB */ { 0, &Ia_Invalid }, + /* DA EC */ { 0, &Ia_Invalid }, + /* DA ED */ { 0, &Ia_Invalid }, + /* DA EE */ { 0, &Ia_Invalid }, + /* DA EF */ { 0, &Ia_Invalid }, + /* DA F0 */ { 0, &Ia_Invalid }, + /* DA F1 */ { 0, &Ia_Invalid }, + /* DA F2 */ { 0, &Ia_Invalid }, + /* DA F3 */ { 0, &Ia_Invalid }, + /* DA F4 */ { 0, &Ia_Invalid }, + /* DA F5 */ { 0, &Ia_Invalid }, + /* DA F6 */ { 0, &Ia_Invalid }, + /* DA F7 */ { 0, &Ia_Invalid }, + /* DA F8 */ { 0, &Ia_Invalid }, + /* DA F9 */ { 0, &Ia_Invalid }, + /* DA FA */ { 0, &Ia_Invalid }, + /* DA FB */ { 0, &Ia_Invalid }, + /* DA FC */ { 0, &Ia_Invalid }, + /* DA FD */ { 0, &Ia_Invalid }, + /* DA FE */ { 0, &Ia_Invalid }, + /* DA FF */ { 0, &Ia_Invalid }, + + // DB (modrm is outside 00h - BFh) (mod == 11) + /* DB C0 */ { 0, &Ia_fcmovnb_ST0_STi }, + /* DB C1 */ { 0, &Ia_fcmovnb_ST0_STi }, + /* DB C2 */ { 0, &Ia_fcmovnb_ST0_STi }, + /* DB C3 */ { 0, &Ia_fcmovnb_ST0_STi }, + /* DB C4 */ { 0, &Ia_fcmovnb_ST0_STi }, + /* DB C5 */ { 0, &Ia_fcmovnb_ST0_STi }, + /* DB C6 */ { 0, &Ia_fcmovnb_ST0_STi }, + /* DB C7 */ { 0, &Ia_fcmovnb_ST0_STi }, + /* DB C8 */ { 0, &Ia_fcmovne_ST0_STi }, + /* DB C9 */ { 0, &Ia_fcmovne_ST0_STi }, + /* DB CA */ { 0, &Ia_fcmovne_ST0_STi }, + /* DB CB */ { 0, &Ia_fcmovne_ST0_STi }, + /* DB CC */ { 0, &Ia_fcmovne_ST0_STi }, + /* DB CD */ { 0, &Ia_fcmovne_ST0_STi }, + /* DB CE */ { 0, &Ia_fcmovne_ST0_STi }, + /* DB CF */ { 0, &Ia_fcmovne_ST0_STi }, + /* DB D0 */ { 0, &Ia_fcmovnbe_ST0_STi }, + /* DB D1 */ { 0, &Ia_fcmovnbe_ST0_STi }, + /* DB D2 */ { 0, &Ia_fcmovnbe_ST0_STi }, + /* DB D3 */ { 0, &Ia_fcmovnbe_ST0_STi }, + /* DB D4 */ { 0, &Ia_fcmovnbe_ST0_STi }, + /* DB D5 */ { 0, &Ia_fcmovnbe_ST0_STi }, + /* DB D6 */ { 0, &Ia_fcmovnbe_ST0_STi }, + /* DB D7 */ { 0, &Ia_fcmovnbe_ST0_STi }, + /* DB D8 */ { 0, &Ia_fcmovnu_ST0_STi }, + /* DB D9 */ { 0, &Ia_fcmovnu_ST0_STi }, + /* DB DA */ { 0, &Ia_fcmovnu_ST0_STi }, + /* DB DB */ { 0, &Ia_fcmovnu_ST0_STi }, + /* DB DC */ { 0, &Ia_fcmovnu_ST0_STi }, + /* DB DD */ { 0, &Ia_fcmovnu_ST0_STi }, + /* DB DE */ { 0, &Ia_fcmovnu_ST0_STi }, + /* DB DF */ { 0, &Ia_fcmovnu_ST0_STi }, + /* DB E0 */ { 0, &Ia_feni }, + /* DB E1 */ { 0, &Ia_fdisi }, + /* DB E2 */ { 0, &Ia_fnclex }, + /* DB E3 */ { 0, &Ia_fninit }, + /* DB E4 */ { 0, &Ia_fsetpm }, + /* DB E5 */ { 0, &Ia_Invalid }, + /* DB E6 */ { 0, &Ia_Invalid }, + /* DB E7 */ { 0, &Ia_Invalid }, + /* DB E8 */ { 0, &Ia_fucomi_ST0_STi }, + /* DB E9 */ { 0, &Ia_fucomi_ST0_STi }, + /* DB EA */ { 0, &Ia_fucomi_ST0_STi }, + /* DB EB */ { 0, &Ia_fucomi_ST0_STi }, + /* DB EC */ { 0, &Ia_fucomi_ST0_STi }, + /* DB ED */ { 0, &Ia_fucomi_ST0_STi }, + /* DB EE */ { 0, &Ia_fucomi_ST0_STi }, + /* DB EF */ { 0, &Ia_fucomi_ST0_STi }, + /* DB F0 */ { 0, &Ia_fcomi_ST0_STi }, + /* DB F1 */ { 0, &Ia_fcomi_ST0_STi }, + /* DB F2 */ { 0, &Ia_fcomi_ST0_STi }, + /* DB F3 */ { 0, &Ia_fcomi_ST0_STi }, + /* DB F4 */ { 0, &Ia_fcomi_ST0_STi }, + /* DB F5 */ { 0, &Ia_fcomi_ST0_STi }, + /* DB F6 */ { 0, &Ia_fcomi_ST0_STi }, + /* DB F7 */ { 0, &Ia_fcomi_ST0_STi }, + /* DB F8 */ { 0, &Ia_Invalid }, + /* DB F9 */ { 0, &Ia_Invalid }, + /* DB FA */ { 0, &Ia_Invalid }, + /* DB FB */ { 0, &Ia_Invalid }, + /* DB FC */ { 0, &Ia_Invalid }, + /* DB FD */ { 0, &Ia_Invalid }, + /* DB FE */ { 0, &Ia_Invalid }, + /* DB FF */ { 0, &Ia_Invalid }, + + // DC (modrm is outside 00h - BFh) (mod == 11) + /* DC C0 */ { 0, &Ia_fadd_STi_ST0 }, + /* DC C1 */ { 0, &Ia_fadd_STi_ST0 }, + /* DC C2 */ { 0, &Ia_fadd_STi_ST0 }, + /* DC C3 */ { 0, &Ia_fadd_STi_ST0 }, + /* DC C4 */ { 0, &Ia_fadd_STi_ST0 }, + /* DC C5 */ { 0, &Ia_fadd_STi_ST0 }, + /* DC C6 */ { 0, &Ia_fadd_STi_ST0 }, + /* DC C7 */ { 0, &Ia_fadd_STi_ST0 }, + /* DC C8 */ { 0, &Ia_fmul_STi_ST0 }, + /* DC C9 */ { 0, &Ia_fmul_STi_ST0 }, + /* DC CA */ { 0, &Ia_fmul_STi_ST0 }, + /* DC CB */ { 0, &Ia_fmul_STi_ST0 }, + /* DC CC */ { 0, &Ia_fmul_STi_ST0 }, + /* DC CD */ { 0, &Ia_fmul_STi_ST0 }, + /* DC CE */ { 0, &Ia_fmul_STi_ST0 }, + /* DC CF */ { 0, &Ia_fmul_STi_ST0 }, + /* DC D0 */ { 0, &Ia_Invalid }, + /* DC D1 */ { 0, &Ia_Invalid }, + /* DC D2 */ { 0, &Ia_Invalid }, + /* DC D3 */ { 0, &Ia_Invalid }, + /* DC D4 */ { 0, &Ia_Invalid }, + /* DC D5 */ { 0, &Ia_Invalid }, + /* DC D6 */ { 0, &Ia_Invalid }, + /* DC D7 */ { 0, &Ia_Invalid }, + /* DC D8 */ { 0, &Ia_Invalid }, + /* DC D9 */ { 0, &Ia_Invalid }, + /* DC DA */ { 0, &Ia_Invalid }, + /* DC DB */ { 0, &Ia_Invalid }, + /* DC DC */ { 0, &Ia_Invalid }, + /* DC DD */ { 0, &Ia_Invalid }, + /* DC DE */ { 0, &Ia_Invalid }, + /* DC DF */ { 0, &Ia_Invalid }, + /* DC E0 */ { 0, &Ia_fsubr_STi_ST0 }, + /* DC E1 */ { 0, &Ia_fsubr_STi_ST0 }, + /* DC E2 */ { 0, &Ia_fsubr_STi_ST0 }, + /* DC E3 */ { 0, &Ia_fsubr_STi_ST0 }, + /* DC E4 */ { 0, &Ia_fsubr_STi_ST0 }, + /* DC E5 */ { 0, &Ia_fsubr_STi_ST0 }, + /* DC E6 */ { 0, &Ia_fsubr_STi_ST0 }, + /* DC E7 */ { 0, &Ia_fsubr_STi_ST0 }, + /* DC E8 */ { 0, &Ia_fsub_STi_ST0 }, + /* DC E9 */ { 0, &Ia_fsub_STi_ST0 }, + /* DC EA */ { 0, &Ia_fsub_STi_ST0 }, + /* DC EB */ { 0, &Ia_fsub_STi_ST0 }, + /* DC EC */ { 0, &Ia_fsub_STi_ST0 }, + /* DC ED */ { 0, &Ia_fsub_STi_ST0 }, + /* DC EE */ { 0, &Ia_fsub_STi_ST0 }, + /* DC EF */ { 0, &Ia_fsub_STi_ST0 }, + /* DC F0 */ { 0, &Ia_fdivr_STi_ST0 }, + /* DC F1 */ { 0, &Ia_fdivr_STi_ST0 }, + /* DC F2 */ { 0, &Ia_fdivr_STi_ST0 }, + /* DC F3 */ { 0, &Ia_fdivr_STi_ST0 }, + /* DC F4 */ { 0, &Ia_fdivr_STi_ST0 }, + /* DC F5 */ { 0, &Ia_fdivr_STi_ST0 }, + /* DC F6 */ { 0, &Ia_fdivr_STi_ST0 }, + /* DC F7 */ { 0, &Ia_fdivr_STi_ST0 }, + /* DC F8 */ { 0, &Ia_fdiv_STi_ST0 }, + /* DC F9 */ { 0, &Ia_fdiv_STi_ST0 }, + /* DC FA */ { 0, &Ia_fdiv_STi_ST0 }, + /* DC FB */ { 0, &Ia_fdiv_STi_ST0 }, + /* DC FC */ { 0, &Ia_fdiv_STi_ST0 }, + /* DC FD */ { 0, &Ia_fdiv_STi_ST0 }, + /* DC FE */ { 0, &Ia_fdiv_STi_ST0 }, + /* DC FF */ { 0, &Ia_fdiv_STi_ST0 }, + + // DD (modrm is outside 00h - BFh) (mod == 11) + /* DD C0 */ { 0, &Ia_ffree_STi }, + /* DD C1 */ { 0, &Ia_ffree_STi }, + /* DD C2 */ { 0, &Ia_ffree_STi }, + /* DD C3 */ { 0, &Ia_ffree_STi }, + /* DD C4 */ { 0, &Ia_ffree_STi }, + /* DD C5 */ { 0, &Ia_ffree_STi }, + /* DD C6 */ { 0, &Ia_ffree_STi }, + /* DD C7 */ { 0, &Ia_ffree_STi }, + /* DD C8 */ { 0, &Ia_Invalid }, + /* DD C9 */ { 0, &Ia_Invalid }, + /* DD CA */ { 0, &Ia_Invalid }, + /* DD CB */ { 0, &Ia_Invalid }, + /* DD CC */ { 0, &Ia_Invalid }, + /* DD CD */ { 0, &Ia_Invalid }, + /* DD CE */ { 0, &Ia_Invalid }, + /* DD CF */ { 0, &Ia_Invalid }, + /* DD D0 */ { 0, &Ia_fst_STi }, + /* DD D1 */ { 0, &Ia_fst_STi }, + /* DD D2 */ { 0, &Ia_fst_STi }, + /* DD D3 */ { 0, &Ia_fst_STi }, + /* DD D4 */ { 0, &Ia_fst_STi }, + /* DD D5 */ { 0, &Ia_fst_STi }, + /* DD D6 */ { 0, &Ia_fst_STi }, + /* DD D7 */ { 0, &Ia_fst_STi }, + /* DD D8 */ { 0, &Ia_fstp_STi }, + /* DD D9 */ { 0, &Ia_fstp_STi }, + /* DD DA */ { 0, &Ia_fstp_STi }, + /* DD DB */ { 0, &Ia_fstp_STi }, + /* DD DC */ { 0, &Ia_fstp_STi }, + /* DD DD */ { 0, &Ia_fstp_STi }, + /* DD DE */ { 0, &Ia_fstp_STi }, + /* DD DF */ { 0, &Ia_fstp_STi }, + /* DD E0 */ { 0, &Ia_fucom_STi }, + /* DD E1 */ { 0, &Ia_fucom_STi }, + /* DD E2 */ { 0, &Ia_fucom_STi }, + /* DD E3 */ { 0, &Ia_fucom_STi }, + /* DD E4 */ { 0, &Ia_fucom_STi }, + /* DD E5 */ { 0, &Ia_fucom_STi }, + /* DD E6 */ { 0, &Ia_fucom_STi }, + /* DD E7 */ { 0, &Ia_fucom_STi }, + /* DD E8 */ { 0, &Ia_fucomp_STi }, + /* DD E9 */ { 0, &Ia_fucomp_STi }, + /* DD EA */ { 0, &Ia_fucomp_STi }, + /* DD EB */ { 0, &Ia_fucomp_STi }, + /* DD EC */ { 0, &Ia_fucomp_STi }, + /* DD ED */ { 0, &Ia_fucomp_STi }, + /* DD EE */ { 0, &Ia_fucomp_STi }, + /* DD EF */ { 0, &Ia_fucomp_STi }, + /* DD F0 */ { 0, &Ia_Invalid }, + /* DD F1 */ { 0, &Ia_Invalid }, + /* DD F2 */ { 0, &Ia_Invalid }, + /* DD F3 */ { 0, &Ia_Invalid }, + /* DD F4 */ { 0, &Ia_Invalid }, + /* DD F5 */ { 0, &Ia_Invalid }, + /* DD F6 */ { 0, &Ia_Invalid }, + /* DD F7 */ { 0, &Ia_Invalid }, + /* DD F8 */ { 0, &Ia_Invalid }, + /* DD F9 */ { 0, &Ia_Invalid }, + /* DD FA */ { 0, &Ia_Invalid }, + /* DD FB */ { 0, &Ia_Invalid }, + /* DD FC */ { 0, &Ia_Invalid }, + /* DD FD */ { 0, &Ia_Invalid }, + /* DD FE */ { 0, &Ia_Invalid }, + /* DD FF */ { 0, &Ia_Invalid }, + + // DE (modrm is outside 00h - BFh) (mod == 11) + /* DE C0 */ { 0, &Ia_faddp_STi_ST0 }, + /* DE C1 */ { 0, &Ia_faddp_STi_ST0 }, + /* DE C2 */ { 0, &Ia_faddp_STi_ST0 }, + /* DE C3 */ { 0, &Ia_faddp_STi_ST0 }, + /* DE C4 */ { 0, &Ia_faddp_STi_ST0 }, + /* DE C5 */ { 0, &Ia_faddp_STi_ST0 }, + /* DE C6 */ { 0, &Ia_faddp_STi_ST0 }, + /* DE C7 */ { 0, &Ia_faddp_STi_ST0 }, + /* DE C8 */ { 0, &Ia_fmulp_STi_ST0 }, + /* DE C9 */ { 0, &Ia_fmulp_STi_ST0 }, + /* DE CA */ { 0, &Ia_fmulp_STi_ST0 }, + /* DE CB */ { 0, &Ia_fmulp_STi_ST0 }, + /* DE CC */ { 0, &Ia_fmulp_STi_ST0 }, + /* DE CD */ { 0, &Ia_fmulp_STi_ST0 }, + /* DE CE */ { 0, &Ia_fmulp_STi_ST0 }, + /* DE CF */ { 0, &Ia_fmulp_STi_ST0 }, + /* DE D0 */ { 0, &Ia_Invalid }, + /* DE D1 */ { 0, &Ia_Invalid }, + /* DE D2 */ { 0, &Ia_Invalid }, + /* DE D3 */ { 0, &Ia_Invalid }, + /* DE D4 */ { 0, &Ia_Invalid }, + /* DE D5 */ { 0, &Ia_Invalid }, + /* DE D6 */ { 0, &Ia_Invalid }, + /* DE D7 */ { 0, &Ia_Invalid }, + /* DE D8 */ { 0, &Ia_Invalid }, + /* DE D9 */ { 0, &Ia_fcompp }, + /* DE DA */ { 0, &Ia_Invalid }, + /* DE DB */ { 0, &Ia_Invalid }, + /* DE DC */ { 0, &Ia_Invalid }, + /* DE DD */ { 0, &Ia_Invalid }, + /* DE DE */ { 0, &Ia_Invalid }, + /* DE DF */ { 0, &Ia_Invalid }, + /* DE E0 */ { 0, &Ia_fsubrp_STi_ST0 }, + /* DE E1 */ { 0, &Ia_fsubrp_STi_ST0 }, + /* DE E2 */ { 0, &Ia_fsubrp_STi_ST0 }, + /* DE E3 */ { 0, &Ia_fsubrp_STi_ST0 }, + /* DE E4 */ { 0, &Ia_fsubrp_STi_ST0 }, + /* DE E5 */ { 0, &Ia_fsubrp_STi_ST0 }, + /* DE E6 */ { 0, &Ia_fsubrp_STi_ST0 }, + /* DE E7 */ { 0, &Ia_fsubrp_STi_ST0 }, + /* DE E8 */ { 0, &Ia_fsubp_STi_ST0 }, + /* DE E9 */ { 0, &Ia_fsubp_STi_ST0 }, + /* DE EA */ { 0, &Ia_fsubp_STi_ST0 }, + /* DE EB */ { 0, &Ia_fsubp_STi_ST0 }, + /* DE EC */ { 0, &Ia_fsubp_STi_ST0 }, + /* DE ED */ { 0, &Ia_fsubp_STi_ST0 }, + /* DE EE */ { 0, &Ia_fsubp_STi_ST0 }, + /* DE EF */ { 0, &Ia_fsubp_STi_ST0 }, + /* DE F0 */ { 0, &Ia_fdivrp_STi_ST0 }, + /* DE F1 */ { 0, &Ia_fdivrp_STi_ST0 }, + /* DE F2 */ { 0, &Ia_fdivrp_STi_ST0 }, + /* DE F3 */ { 0, &Ia_fdivrp_STi_ST0 }, + /* DE F4 */ { 0, &Ia_fdivrp_STi_ST0 }, + /* DE F5 */ { 0, &Ia_fdivrp_STi_ST0 }, + /* DE F6 */ { 0, &Ia_fdivrp_STi_ST0 }, + /* DE F7 */ { 0, &Ia_fdivrp_STi_ST0 }, + /* DE F8 */ { 0, &Ia_fdivp_STi_ST0 }, + /* DE F9 */ { 0, &Ia_fdivp_STi_ST0 }, + /* DE FA */ { 0, &Ia_fdivp_STi_ST0 }, + /* DE FB */ { 0, &Ia_fdivp_STi_ST0 }, + /* DE FC */ { 0, &Ia_fdivp_STi_ST0 }, + /* DE FD */ { 0, &Ia_fdivp_STi_ST0 }, + /* DE FE */ { 0, &Ia_fdivp_STi_ST0 }, + /* DE FF */ { 0, &Ia_fdivp_STi_ST0 }, + + // DF (modrm is outside 00h - BFh) (mod == 11) + /* DF C0 */ { 0, &Ia_ffreep_STi }, // 287 compatibility opcode + /* DF C1 */ { 0, &Ia_ffreep_STi }, + /* DF C2 */ { 0, &Ia_ffreep_STi }, + /* DF C3 */ { 0, &Ia_ffreep_STi }, + /* DF C4 */ { 0, &Ia_ffreep_STi }, + /* DF C5 */ { 0, &Ia_ffreep_STi }, + /* DF C6 */ { 0, &Ia_ffreep_STi }, + /* DF C7 */ { 0, &Ia_ffreep_STi }, + /* DF C8 */ { 0, &Ia_Invalid }, + /* DF C9 */ { 0, &Ia_Invalid }, + /* DF CA */ { 0, &Ia_Invalid }, + /* DF CB */ { 0, &Ia_Invalid }, + /* DF CC */ { 0, &Ia_Invalid }, + /* DF CD */ { 0, &Ia_Invalid }, + /* DF CE */ { 0, &Ia_Invalid }, + /* DF CF */ { 0, &Ia_Invalid }, + /* DF D0 */ { 0, &Ia_Invalid }, + /* DF D1 */ { 0, &Ia_Invalid }, + /* DF D2 */ { 0, &Ia_Invalid }, + /* DF D3 */ { 0, &Ia_Invalid }, + /* DF D4 */ { 0, &Ia_Invalid }, + /* DF D5 */ { 0, &Ia_Invalid }, + /* DF D6 */ { 0, &Ia_Invalid }, + /* DF D7 */ { 0, &Ia_Invalid }, + /* DF D8 */ { 0, &Ia_Invalid }, + /* DF D9 */ { 0, &Ia_Invalid }, + /* DF DA */ { 0, &Ia_Invalid }, + /* DF DB */ { 0, &Ia_Invalid }, + /* DF DC */ { 0, &Ia_Invalid }, + /* DF DD */ { 0, &Ia_Invalid }, + /* DF DE */ { 0, &Ia_Invalid }, + /* DF DF */ { 0, &Ia_Invalid }, + /* DF E0 */ { 0, &Ia_fnstsw_AX }, + /* DF E1 */ { 0, &Ia_Invalid }, + /* DF E2 */ { 0, &Ia_Invalid }, + /* DF E3 */ { 0, &Ia_Invalid }, + /* DF E4 */ { 0, &Ia_Invalid }, + /* DF E5 */ { 0, &Ia_Invalid }, + /* DF E6 */ { 0, &Ia_Invalid }, + /* DF E7 */ { 0, &Ia_Invalid }, + /* DF E8 */ { 0, &Ia_fucomip_ST0_STi }, + /* DF E9 */ { 0, &Ia_fucomip_ST0_STi }, + /* DF EA */ { 0, &Ia_fucomip_ST0_STi }, + /* DF EB */ { 0, &Ia_fucomip_ST0_STi }, + /* DF EC */ { 0, &Ia_fucomip_ST0_STi }, + /* DF ED */ { 0, &Ia_fucomip_ST0_STi }, + /* DF EE */ { 0, &Ia_fucomip_ST0_STi }, + /* DF EF */ { 0, &Ia_fucomip_ST0_STi }, + /* DF F0 */ { 0, &Ia_fcomip_ST0_STi }, + /* DF F1 */ { 0, &Ia_fcomip_ST0_STi }, + /* DF F2 */ { 0, &Ia_fcomip_ST0_STi }, + /* DF F3 */ { 0, &Ia_fcomip_ST0_STi }, + /* DF F4 */ { 0, &Ia_fcomip_ST0_STi }, + /* DF F5 */ { 0, &Ia_fcomip_ST0_STi }, + /* DF F6 */ { 0, &Ia_fcomip_ST0_STi }, + /* DF F7 */ { 0, &Ia_fcomip_ST0_STi }, + /* DF F8 */ { 0, &Ia_Invalid }, + /* DF F9 */ { 0, &Ia_Invalid }, + /* DF FA */ { 0, &Ia_Invalid }, + /* DF FB */ { 0, &Ia_Invalid }, + /* DF FC */ { 0, &Ia_Invalid }, + /* DF FD */ { 0, &Ia_Invalid }, + /* DF FE */ { 0, &Ia_Invalid }, + /* DF FF */ { 0, &Ia_Invalid }, +}; + +/* ************************************************************************ */ +/* 3-byte opcode table (Table A-4, 0F 38) */ + +static BxDisasmOpcodeTable_t BxDisasm3ByteOp0f380x[16] = { + /* 00 */ { GRPSSE(0f3800) }, + /* 01 */ { GRPSSE(0f3801) }, + /* 02 */ { GRPSSE(0f3802) }, + /* 03 */ { GRPSSE(0f3803) }, + /* 04 */ { GRPSSE(0f3804) }, + /* 05 */ { GRPSSE(0f3805) }, + /* 06 */ { GRPSSE(0f3806) }, + /* 07 */ { GRPSSE(0f3807) }, + /* 08 */ { GRPSSE(0f3808) }, + /* 09 */ { GRPSSE(0f3809) }, + /* 0A */ { GRPSSE(0f380a) }, + /* 0B */ { GRPSSE(0f380b) }, + /* 0C */ { 0, &Ia_Invalid }, + /* 0D */ { 0, &Ia_Invalid }, + /* 0E */ { 0, &Ia_Invalid }, + /* 0F */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasm3ByteOp0f381x[16] = { + /* 00 */ { 0, &Ia_Invalid }, + /* 01 */ { 0, &Ia_Invalid }, + /* 02 */ { 0, &Ia_Invalid }, + /* 03 */ { 0, &Ia_Invalid }, + /* 04 */ { 0, &Ia_Invalid }, + /* 05 */ { 0, &Ia_Invalid }, + /* 06 */ { 0, &Ia_Invalid }, + /* 07 */ { 0, &Ia_Invalid }, + /* 08 */ { 0, &Ia_Invalid }, + /* 09 */ { 0, &Ia_Invalid }, + /* 0A */ { 0, &Ia_Invalid }, + /* 0B */ { 0, &Ia_Invalid }, + /* 0C */ { GRPSSE(0f381c) }, + /* 0D */ { GRPSSE(0f381d) }, + /* 0E */ { GRPSSE(0f381e) }, + /* 0F */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasm3ByteTableA4[16] = { + /* 00 */ { GR3BOP(0f380x) }, + /* 01 */ { GR3BOP(0f381x) }, + /* 02 */ { 0, &Ia_Invalid }, + /* 03 */ { 0, &Ia_Invalid }, + /* 04 */ { 0, &Ia_Invalid }, + /* 05 */ { 0, &Ia_Invalid }, + /* 06 */ { 0, &Ia_Invalid }, + /* 07 */ { 0, &Ia_Invalid }, + /* 08 */ { 0, &Ia_Invalid }, + /* 09 */ { 0, &Ia_Invalid }, + /* 0A */ { 0, &Ia_Invalid }, + /* 0B */ { 0, &Ia_Invalid }, + /* 0C */ { 0, &Ia_Invalid }, + /* 0D */ { 0, &Ia_Invalid }, + /* 0E */ { 0, &Ia_Invalid }, + /* 0F */ { 0, &Ia_Invalid } +}; + +/* ************************************************************************ */ +/* 3-byte opcode table (Table A-5, 0F 3A) */ + +static BxDisasmOpcodeTable_t BxDisasm3ByteOp0f3a0x[16] = { + /* 00 */ { 0, &Ia_Invalid }, + /* 01 */ { 0, &Ia_Invalid }, + /* 02 */ { 0, &Ia_Invalid }, + /* 03 */ { 0, &Ia_Invalid }, + /* 04 */ { 0, &Ia_Invalid }, + /* 05 */ { 0, &Ia_Invalid }, + /* 06 */ { 0, &Ia_Invalid }, + /* 07 */ { 0, &Ia_Invalid }, + /* 08 */ { 0, &Ia_Invalid }, + /* 09 */ { 0, &Ia_Invalid }, + /* 0A */ { 0, &Ia_Invalid }, + /* 0B */ { 0, &Ia_Invalid }, + /* 0C */ { 0, &Ia_Invalid }, + /* 0D */ { 0, &Ia_Invalid }, + /* 0E */ { 0, &Ia_Invalid }, + /* 0F */ { GRPSSE(0f3a0f) } +}; + +static BxDisasmOpcodeTable_t BxDisasm3ByteTableA5[16] = { + /* 00 */ { GR3BOP(0f3a0x) }, + /* 01 */ { 0, &Ia_Invalid }, + /* 02 */ { 0, &Ia_Invalid }, + /* 03 */ { 0, &Ia_Invalid }, + /* 04 */ { 0, &Ia_Invalid }, + /* 05 */ { 0, &Ia_Invalid }, + /* 06 */ { 0, &Ia_Invalid }, + /* 07 */ { 0, &Ia_Invalid }, + /* 08 */ { 0, &Ia_Invalid }, + /* 09 */ { 0, &Ia_Invalid }, + /* 0A */ { 0, &Ia_Invalid }, + /* 0B */ { 0, &Ia_Invalid }, + /* 0C */ { 0, &Ia_Invalid }, + /* 0D */ { 0, &Ia_Invalid }, + /* 0E */ { 0, &Ia_Invalid }, + /* 0F */ { 0, &Ia_Invalid } +}; + +/* ************************************************************************ */ +/* 16-bit operand size */ + +static BxDisasmOpcodeTable_t BxDisasmOpcodes16[256*2] = { + // 256 entries for single byte opcodes + /* 00 */ { 0, &Ia_addb_Eb_Gb }, + /* 01 */ { 0, &Ia_addw_Ew_Gw }, + /* 02 */ { 0, &Ia_addb_Gb_Eb }, + /* 03 */ { 0, &Ia_addw_Gw_Ew }, + /* 04 */ { 0, &Ia_addb_AL_Ib }, + /* 05 */ { 0, &Ia_addw_AX_Iw }, + /* 06 */ { 0, &Ia_pushw_ES }, + /* 07 */ { 0, &Ia_popw_ES }, + /* 08 */ { 0, &Ia_orb_Eb_Gb }, + /* 09 */ { 0, &Ia_orw_Ew_Gw }, + /* 0A */ { 0, &Ia_orb_Gb_Eb }, + /* 0B */ { 0, &Ia_orw_Gw_Ew }, + /* 0C */ { 0, &Ia_orb_AL_Ib }, + /* 0D */ { 0, &Ia_orw_AX_Iw }, + /* 0E */ { 0, &Ia_pushw_CS }, + /* 0F */ { 0, &Ia_error }, // 2 byte escape + /* 10 */ { 0, &Ia_adcb_Eb_Gb }, + /* 11 */ { 0, &Ia_adcw_Ew_Gw }, + /* 12 */ { 0, &Ia_adcb_Gb_Eb }, + /* 13 */ { 0, &Ia_adcw_Gw_Ew }, + /* 14 */ { 0, &Ia_adcb_AL_Ib }, + /* 15 */ { 0, &Ia_adcw_AX_Iw }, + /* 16 */ { 0, &Ia_pushw_SS }, + /* 17 */ { 0, &Ia_popw_SS }, + /* 18 */ { 0, &Ia_sbbb_Eb_Gb }, + /* 19 */ { 0, &Ia_sbbw_Ew_Gw }, + /* 1A */ { 0, &Ia_sbbb_Gb_Eb }, + /* 1B */ { 0, &Ia_sbbw_Gw_Ew }, + /* 1C */ { 0, &Ia_sbbb_AL_Ib }, + /* 1D */ { 0, &Ia_sbbw_AX_Iw }, + /* 1E */ { 0, &Ia_pushw_DS }, + /* 1F */ { 0, &Ia_popw_DS }, + /* 20 */ { 0, &Ia_andb_Eb_Gb }, + /* 21 */ { 0, &Ia_andw_Ew_Gw }, + /* 22 */ { 0, &Ia_andb_Gb_Eb }, + /* 23 */ { 0, &Ia_andw_Gw_Ew }, + /* 24 */ { 0, &Ia_andb_AL_Ib }, + /* 25 */ { 0, &Ia_andw_AX_Iw }, + /* 26 */ { 0, &Ia_prefix_es }, // ES: + /* 27 */ { 0, &Ia_daa }, + /* 28 */ { 0, &Ia_subb_Eb_Gb }, + /* 29 */ { 0, &Ia_subw_Ew_Gw }, + /* 2A */ { 0, &Ia_subb_Gb_Eb }, + /* 2B */ { 0, &Ia_subw_Gw_Ew }, + /* 2C */ { 0, &Ia_subb_AL_Ib }, + /* 2D */ { 0, &Ia_subw_AX_Iw }, + /* 2E */ { 0, &Ia_prefix_cs }, // CS: + /* 2F */ { 0, &Ia_das }, + /* 30 */ { 0, &Ia_xorb_Eb_Gb }, + /* 31 */ { 0, &Ia_xorw_Ew_Gw }, + /* 32 */ { 0, &Ia_xorb_Gb_Eb }, + /* 33 */ { 0, &Ia_xorw_Gw_Ew }, + /* 34 */ { 0, &Ia_xorb_AL_Ib }, + /* 35 */ { 0, &Ia_xorw_AX_Iw }, + /* 36 */ { 0, &Ia_prefix_ss }, // SS: + /* 37 */ { 0, &Ia_aaa }, + /* 38 */ { 0, &Ia_cmpb_Eb_Gb }, + /* 39 */ { 0, &Ia_cmpw_Ew_Gw }, + /* 3A */ { 0, &Ia_cmpb_Gb_Eb }, + /* 3B */ { 0, &Ia_cmpw_Gw_Ew }, + /* 3C */ { 0, &Ia_cmpb_AL_Ib }, + /* 3D */ { 0, &Ia_cmpw_AX_Iw }, + /* 3E */ { 0, &Ia_prefix_ds }, // DS: + /* 3F */ { 0, &Ia_aas }, + /* 40 */ { 0, &Ia_incw_RX }, + /* 41 */ { 0, &Ia_incw_RX }, + /* 42 */ { 0, &Ia_incw_RX }, + /* 43 */ { 0, &Ia_incw_RX }, + /* 44 */ { 0, &Ia_incw_RX }, + /* 45 */ { 0, &Ia_incw_RX }, + /* 46 */ { 0, &Ia_incw_RX }, + /* 47 */ { 0, &Ia_incw_RX }, + /* 48 */ { 0, &Ia_decw_RX }, + /* 49 */ { 0, &Ia_decw_RX }, + /* 4A */ { 0, &Ia_decw_RX }, + /* 4B */ { 0, &Ia_decw_RX }, + /* 4C */ { 0, &Ia_decw_RX }, + /* 4D */ { 0, &Ia_decw_RX }, + /* 4E */ { 0, &Ia_decw_RX }, + /* 4F */ { 0, &Ia_decw_RX }, + /* 50 */ { 0, &Ia_pushw_RX }, + /* 51 */ { 0, &Ia_pushw_RX }, + /* 52 */ { 0, &Ia_pushw_RX }, + /* 53 */ { 0, &Ia_pushw_RX }, + /* 54 */ { 0, &Ia_pushw_RX }, + /* 55 */ { 0, &Ia_pushw_RX }, + /* 56 */ { 0, &Ia_pushw_RX }, + /* 57 */ { 0, &Ia_pushw_RX }, + /* 58 */ { 0, &Ia_popw_RX }, + /* 59 */ { 0, &Ia_popw_RX }, + /* 5A */ { 0, &Ia_popw_RX }, + /* 5B */ { 0, &Ia_popw_RX }, + /* 5C */ { 0, &Ia_popw_RX }, + /* 5D */ { 0, &Ia_popw_RX }, + /* 5E */ { 0, &Ia_popw_RX }, + /* 5F */ { 0, &Ia_popw_RX }, + /* 60 */ { 0, &Ia_pushaw }, + /* 61 */ { 0, &Ia_popaw }, + /* 62 */ { 0, &Ia_boundw_Gw_Ma }, + /* 63 */ { 0, &Ia_arpl_Ew_Rw }, + /* 64 */ { 0, &Ia_prefix_fs }, // FS: + /* 65 */ { 0, &Ia_prefix_gs }, // GS: + /* 66 */ { 0, &Ia_prefix_osize }, // OSIZE: + /* 67 */ { 0, &Ia_prefix_asize }, // ASIZE: + /* 68 */ { 0, &Ia_pushw_Iw }, + /* 69 */ { 0, &Ia_imulw_Gw_Ew_Iw }, + /* 6A */ { 0, &Ia_pushw_sIb }, + /* 6B */ { 0, &Ia_imulw_Gw_Ew_sIb }, + /* 6C */ { 0, &Ia_insb_Yb_DX }, + /* 6D */ { 0, &Ia_insw_Yw_DX }, + /* 6E */ { 0, &Ia_outsb_DX_Xb }, + /* 6F */ { 0, &Ia_outsw_DX_Xw }, + /* 70 */ { 0, &Ia_jo_Jb }, + /* 71 */ { 0, &Ia_jno_Jb }, + /* 72 */ { 0, &Ia_jb_Jb }, + /* 73 */ { 0, &Ia_jnb_Jb }, + /* 74 */ { 0, &Ia_jz_Jb }, + /* 75 */ { 0, &Ia_jnz_Jb }, + /* 76 */ { 0, &Ia_jbe_Jb }, + /* 77 */ { 0, &Ia_jnbe_Jb }, + /* 78 */ { 0, &Ia_js_Jb }, + /* 79 */ { 0, &Ia_jns_Jb }, + /* 7A */ { 0, &Ia_jp_Jb }, + /* 7B */ { 0, &Ia_jnp_Jb }, + /* 7C */ { 0, &Ia_jl_Jb }, + /* 7D */ { 0, &Ia_jnl_Jb }, + /* 7E */ { 0, &Ia_jle_Jb }, + /* 7F */ { 0, &Ia_jnle_Jb }, + /* 80 */ { GRPN(G1EbIb) }, + /* 81 */ { GRPN(G1EwIw) }, + /* 82 */ { GRPN(G1EbIb) }, + /* 83 */ { GRPN(G1EwIb) }, + /* 84 */ { 0, &Ia_testb_Eb_Gb }, + /* 85 */ { 0, &Ia_testw_Ew_Gw }, + /* 86 */ { 0, &Ia_xchgb_Eb_Gb }, + /* 87 */ { 0, &Ia_xchgw_Ew_Gw }, + /* 88 */ { 0, &Ia_movb_Eb_Gb }, + /* 89 */ { 0, &Ia_movw_Ew_Gw }, + /* 8A */ { 0, &Ia_movb_Gb_Eb }, + /* 8B */ { 0, &Ia_movw_Gw_Ew }, + /* 8C */ { 0, &Ia_movw_Ew_Sw }, + /* 8D */ { 0, &Ia_leaw_Gw_Mw }, + /* 8E */ { 0, &Ia_movw_Sw_Ew }, + /* 8F */ { 0, &Ia_popw_Ew }, + /* 90 */ { 0, &Ia_nop }, + /* 91 */ { 0, &Ia_xchgw_RX_AX }, + /* 92 */ { 0, &Ia_xchgw_RX_AX }, + /* 93 */ { 0, &Ia_xchgw_RX_AX }, + /* 94 */ { 0, &Ia_xchgw_RX_AX }, + /* 95 */ { 0, &Ia_xchgw_RX_AX }, + /* 96 */ { 0, &Ia_xchgw_RX_AX }, + /* 97 */ { 0, &Ia_xchgw_RX_AX }, + /* 98 */ { 0, &Ia_cbw }, + /* 99 */ { 0, &Ia_cwd }, + /* 9A */ { 0, &Ia_lcall_Apw }, + /* 9B */ { 0, &Ia_fwait }, + /* 9C */ { 0, &Ia_pushfw }, + /* 9D */ { 0, &Ia_popfw }, + /* 9E */ { 0, &Ia_sahf }, + /* 9F */ { 0, &Ia_lahf }, + /* A0 */ { 0, &Ia_movb_AL_Ob }, + /* A1 */ { 0, &Ia_movw_AX_Ow }, + /* A0 */ { 0, &Ia_movb_Ob_AL }, + /* A1 */ { 0, &Ia_movw_Ow_AX }, + /* A4 */ { 0, &Ia_movsb_Yb_Xb }, + /* A5 */ { 0, &Ia_movsw_Yw_Xw }, + /* A6 */ { 0, &Ia_cmpsb_Yb_Xb }, + /* A7 */ { 0, &Ia_cmpsw_Yw_Xw }, + /* A8 */ { 0, &Ia_testb_AL_Ib }, + /* A9 */ { 0, &Ia_testw_AX_Iw }, + /* AA */ { 0, &Ia_stosb_Yb_AL }, + /* AB */ { 0, &Ia_stosw_Yw_AX }, + /* AC */ { 0, &Ia_lodsb_AL_Xb }, + /* AD */ { 0, &Ia_lodsw_AX_Xw }, + /* AE */ { 0, &Ia_scasb_Yb_AL }, + /* AF */ { 0, &Ia_scasw_Yw_AX }, + /* B0 */ { 0, &Ia_movb_R8_Ib }, + /* B1 */ { 0, &Ia_movb_R8_Ib }, + /* B2 */ { 0, &Ia_movb_R8_Ib }, + /* B3 */ { 0, &Ia_movb_R8_Ib }, + /* B4 */ { 0, &Ia_movb_R8_Ib }, + /* B5 */ { 0, &Ia_movb_R8_Ib }, + /* B6 */ { 0, &Ia_movb_R8_Ib }, + /* B7 */ { 0, &Ia_movb_R8_Ib }, + /* B8 */ { 0, &Ia_movw_RX_Iw }, + /* B9 */ { 0, &Ia_movw_RX_Iw }, + /* BA */ { 0, &Ia_movw_RX_Iw }, + /* BB */ { 0, &Ia_movw_RX_Iw }, + /* BC */ { 0, &Ia_movw_RX_Iw }, + /* BD */ { 0, &Ia_movw_RX_Iw }, + /* BE */ { 0, &Ia_movw_RX_Iw }, + /* BF */ { 0, &Ia_movw_RX_Iw }, + /* C0 */ { GRPN(G2Eb) }, + /* C1 */ { GRPN(G2Ew) }, + /* C2 */ { 0, &Ia_ret_Iw }, + /* C3 */ { 0, &Ia_ret }, + /* C4 */ { 0, &Ia_lesw_Gw_Mp }, + /* C5 */ { 0, &Ia_ldsw_Gw_Mp }, + /* C6 */ { 0, &Ia_movb_Eb_Ib }, + /* C7 */ { 0, &Ia_movw_Ew_Iw }, + /* C8 */ { 0, &Ia_enter }, + /* C9 */ { 0, &Ia_leave }, + /* CA */ { 0, &Ia_lret_Iw }, + /* CB */ { 0, &Ia_lret }, + /* CC */ { 0, &Ia_int3 }, + /* CD */ { 0, &Ia_int_Ib }, + /* CE */ { 0, &Ia_into }, + /* CF */ { 0, &Ia_iretw }, + /* D0 */ { GRPN(G2EbI1) }, + /* D1 */ { GRPN(G2EwI1) }, + /* D2 */ { GRPN(G2EbCL) }, + /* D3 */ { GRPN(G2EwCL) }, + /* D4 */ { 0, &Ia_aam }, + /* D5 */ { 0, &Ia_aad }, + /* D6 */ { 0, &Ia_salc }, + /* D7 */ { 0, &Ia_xlat }, + /* D8 */ { GRPFP(D8) }, + /* D9 */ { GRPFP(D9) }, + /* DA */ { GRPFP(DA) }, + /* DB */ { GRPFP(DB) }, + /* DC */ { GRPFP(DC) }, + /* DD */ { GRPFP(DD) }, + /* DE */ { GRPFP(DE) }, + /* DF */ { GRPFP(DF) }, + /* E0 */ { 0, &Ia_loopne_Jb }, + /* E1 */ { 0, &Ia_loope_Jb }, + /* E2 */ { 0, &Ia_loop_Jb }, + /* E3 */ { 0, &Ia_jcxz_Jb }, + /* E4 */ { 0, &Ia_inb_AL_Ib }, + /* E5 */ { 0, &Ia_inw_AX_Ib }, + /* E6 */ { 0, &Ia_outb_Ib_AL }, + /* E7 */ { 0, &Ia_outw_Ib_AX }, + /* E8 */ { 0, &Ia_call_Jw }, + /* E9 */ { 0, &Ia_jmp_Jw }, + /* EA */ { 0, &Ia_ljmp_Apw }, + /* EB */ { 0, &Ia_jmp_Jb }, + /* EC */ { 0, &Ia_inb_AL_DX }, + /* ED */ { 0, &Ia_inw_AX_DX }, + /* EE */ { 0, &Ia_outb_DX_AL }, + /* EF */ { 0, &Ia_outw_DX_AX }, + /* F0 */ { 0, &Ia_prefix_lock }, // LOCK: + /* F1 */ { 0, &Ia_int1 }, + /* F2 */ { 0, &Ia_prefix_repne }, // REPNE: + /* F3 */ { 0, &Ia_prefix_rep }, // REP: + /* F4 */ { 0, &Ia_hlt }, + /* F5 */ { 0, &Ia_cmc }, + /* F6 */ { GRPN(G3Eb) }, + /* F7 */ { GRPN(G3Ew) }, + /* F8 */ { 0, &Ia_clc }, + /* F9 */ { 0, &Ia_stc }, + /* FA */ { 0, &Ia_cli }, + /* FB */ { 0, &Ia_sti }, + /* FC */ { 0, &Ia_cld }, + /* FD */ { 0, &Ia_std }, + /* FE */ { GRPN(G4) }, + /* FF */ { GRPN(G5w) }, + + // 256 entries for two byte opcodes + /* 0F 00 */ { GRPN(G6) }, + /* 0F 01 */ { GRPN(G7) }, + /* 0F 02 */ { 0, &Ia_larw_Gw_Ew }, + /* 0F 03 */ { 0, &Ia_lslw_Gw_Ew }, + /* 0F 04 */ { 0, &Ia_Invalid }, + /* 0F 05 */ { 0, &Ia_syscall }, + /* 0F 06 */ { 0, &Ia_clts }, + /* 0F 07 */ { 0, &Ia_sysret }, + /* 0F 08 */ { 0, &Ia_invd }, + /* 0F 09 */ { 0, &Ia_wbinvd }, + /* 0F 0A */ { 0, &Ia_Invalid }, + /* 0F 0B */ { 0, &Ia_ud2a }, + /* 0F 0C */ { 0, &Ia_Invalid }, + /* 0F 0D */ { 0, &Ia_prefetch }, // 3DNow! + /* 0F 0E */ { 0, &Ia_femms }, // 3DNow! + /* 0F 0F */ { GRP3DNOW }, + /* 0F 10 */ { GRPSSE(0f10) }, + /* 0F 11 */ { GRPSSE(0f11) }, + /* 0F 12 */ { GRPSSE(0f12) }, + /* 0F 13 */ { GRPSSE(0f13) }, + /* 0F 14 */ { GRPSSE(0f14) }, + /* 0F 15 */ { GRPSSE(0f15) }, + /* 0F 16 */ { GRPSSE(0f16) }, + /* 0F 17 */ { GRPSSE(0f17) }, + /* 0F 18 */ { GRPN(G16) }, + /* 0F 19 */ { 0, &Ia_Invalid }, + /* 0F 1A */ { 0, &Ia_Invalid }, + /* 0F 1B */ { 0, &Ia_Invalid }, + /* 0F 1C */ { 0, &Ia_Invalid }, + /* 0F 1D */ { 0, &Ia_Invalid }, + /* 0F 1E */ { 0, &Ia_Invalid }, + /* 0F 1F */ { 0, &Ia_multibyte_nop }, + /* 0F 20 */ { 0, &Ia_movl_Rd_Cd }, + /* 0F 21 */ { 0, &Ia_movl_Rd_Dd }, + /* 0F 22 */ { 0, &Ia_movl_Cd_Rd }, + /* 0F 23 */ { 0, &Ia_movl_Dd_Rd }, + /* 0F 24 */ { 0, &Ia_movl_Rd_Td }, + /* 0F 25 */ { 0, &Ia_Invalid }, + /* 0F 26 */ { 0, &Ia_movl_Td_Rd }, + /* 0F 27 */ { 0, &Ia_Invalid }, + /* 0F 28 */ { GRPSSE(0f28) }, + /* 0F 29 */ { GRPSSE(0f29) }, + /* 0F 2A */ { GRPSSE(0f2a) }, + /* 0F 2B */ { GRPSSE(0f2b) }, + /* 0F 2C */ { GRPSSE(0f2c) }, + /* 0F 2D */ { GRPSSE(0f2d) }, + /* 0F 2E */ { GRPSSE(0f2e) }, + /* 0F 2F */ { GRPSSE(0f2f) }, + /* 0F 30 */ { 0, &Ia_wrmsr }, + /* 0F 31 */ { 0, &Ia_rdtsc }, + /* 0F 32 */ { 0, &Ia_rdmsr }, + /* 0F 33 */ { 0, &Ia_rdpmc }, + /* 0F 34 */ { 0, &Ia_sysenter }, + /* 0F 35 */ { 0, &Ia_sysexit }, + /* 0F 36 */ { 0, &Ia_Invalid }, + /* 0F 37 */ { 0, &Ia_Invalid }, + /* 0F 38 */ { GR3BTAB(A4) }, + /* 0F 39 */ { 0, &Ia_Invalid }, + /* 0F 3A */ { GR3BTAB(A5) }, + /* 0F 3B */ { 0, &Ia_Invalid }, + /* 0F 3C */ { 0, &Ia_Invalid }, + /* 0F 3D */ { 0, &Ia_Invalid }, + /* 0F 3E */ { 0, &Ia_Invalid }, + /* 0F 3F */ { 0, &Ia_Invalid }, + /* 0F 40 */ { 0, &Ia_cmovow_Gw_Ew }, + /* 0F 41 */ { 0, &Ia_cmovnow_Gw_Ew }, + /* 0F 42 */ { 0, &Ia_cmovcw_Gw_Ew }, + /* 0F 43 */ { 0, &Ia_cmovncw_Gw_Ew }, + /* 0F 44 */ { 0, &Ia_cmovzw_Gw_Ew }, + /* 0F 45 */ { 0, &Ia_cmovnzw_Gw_Ew }, + /* 0F 46 */ { 0, &Ia_cmovnaw_Gw_Ew }, + /* 0F 47 */ { 0, &Ia_cmovaw_Gw_Ew }, + /* 0F 48 */ { 0, &Ia_cmovsw_Gw_Ew }, + /* 0F 49 */ { 0, &Ia_cmovnsw_Gw_Ew }, + /* 0F 4A */ { 0, &Ia_cmovpw_Gw_Ew }, + /* 0F 4B */ { 0, &Ia_cmovnpw_Gw_Ew }, + /* 0F 4C */ { 0, &Ia_cmovlw_Gw_Ew }, + /* 0F 4D */ { 0, &Ia_cmovnlw_Gw_Ew }, + /* 0F 4E */ { 0, &Ia_cmovngw_Gw_Ew }, + /* 0F 4F */ { 0, &Ia_cmovgw_Gw_Ew }, + /* 0F 50 */ { GRPSSE(0f50) }, + /* 0F 51 */ { GRPSSE(0f51) }, + /* 0F 52 */ { GRPSSE(0f52) }, + /* 0F 53 */ { GRPSSE(0f53) }, + /* 0F 54 */ { GRPSSE(0f54) }, + /* 0F 55 */ { GRPSSE(0f55) }, + /* 0F 56 */ { GRPSSE(0f56) }, + /* 0F 57 */ { GRPSSE(0f57) }, + /* 0F 58 */ { GRPSSE(0f58) }, + /* 0F 59 */ { GRPSSE(0f59) }, + /* 0F 5A */ { GRPSSE(0f5a) }, + /* 0F 5B */ { GRPSSE(0f5b) }, + /* 0F 5C */ { GRPSSE(0f5c) }, + /* 0F 5D */ { GRPSSE(0f5d) }, + /* 0F 5E */ { GRPSSE(0f5e) }, + /* 0F 5F */ { GRPSSE(0f5f) }, + /* 0F 60 */ { GRPSSE(0f60) }, + /* 0F 61 */ { GRPSSE(0f61) }, + /* 0F 62 */ { GRPSSE(0f62) }, + /* 0F 63 */ { GRPSSE(0f63) }, + /* 0F 64 */ { GRPSSE(0f64) }, + /* 0F 65 */ { GRPSSE(0f65) }, + /* 0F 66 */ { GRPSSE(0f66) }, + /* 0F 67 */ { GRPSSE(0f67) }, + /* 0F 68 */ { GRPSSE(0f68) }, + /* 0F 69 */ { GRPSSE(0f69) }, + /* 0F 6A */ { GRPSSE(0f6a) }, + /* 0F 6B */ { GRPSSE(0f6b) }, + /* 0F 6C */ { GRPSSE(0f6c) }, + /* 0F 6D */ { GRPSSE(0f6d) }, + /* 0F 6E */ { GRPSSE(0f6e) }, + /* 0F 6F */ { GRPSSE(0f6f) }, + /* 0F 70 */ { GRPSSE(0f70) }, + /* 0F 71 */ { GRPN(G12) }, + /* 0F 72 */ { GRPN(G13) }, + /* 0F 73 */ { GRPN(G14) }, + /* 0F 74 */ { GRPSSE(0f74) }, + /* 0F 75 */ { GRPSSE(0f75) }, + /* 0F 76 */ { GRPSSE(0f76) }, + /* 0F 77 */ { 0, &Ia_emms }, + /* 0F 78 */ { 0, &Ia_Invalid }, + /* 0F 79 */ { 0, &Ia_Invalid }, + /* 0F 7A */ { 0, &Ia_Invalid }, + /* 0F 7B */ { 0, &Ia_Invalid }, + /* 0F 7C */ { GRPSSE(0f7c) }, + /* 0F 7D */ { GRPSSE(0f7d) }, + /* 0F 7E */ { GRPSSE(0f7e) }, + /* 0F 7F */ { GRPSSE(0f7f) }, + /* 0F 80 */ { 0, &Ia_jo_Jw }, + /* 0F 81 */ { 0, &Ia_jno_Jw }, + /* 0F 82 */ { 0, &Ia_jb_Jw }, + /* 0F 83 */ { 0, &Ia_jnb_Jw }, + /* 0F 84 */ { 0, &Ia_jz_Jw }, + /* 0F 85 */ { 0, &Ia_jnz_Jw }, + /* 0F 86 */ { 0, &Ia_jbe_Jw }, + /* 0F 87 */ { 0, &Ia_jnbe_Jw }, + /* 0F 88 */ { 0, &Ia_js_Jw }, + /* 0F 89 */ { 0, &Ia_jns_Jw }, + /* 0F 8A */ { 0, &Ia_jp_Jw }, + /* 0F 8B */ { 0, &Ia_jnp_Jw }, + /* 0F 8C */ { 0, &Ia_jl_Jw }, + /* 0F 8D */ { 0, &Ia_jnl_Jw }, + /* 0F 8E */ { 0, &Ia_jle_Jw }, + /* 0F 8F */ { 0, &Ia_jnle_Jw }, + /* 0F 90 */ { 0, &Ia_seto_Eb }, + /* 0F 91 */ { 0, &Ia_setno_Eb }, + /* 0F 92 */ { 0, &Ia_setb_Eb }, + /* 0F 93 */ { 0, &Ia_setnb_Eb }, + /* 0F 94 */ { 0, &Ia_setz_Eb }, + /* 0F 95 */ { 0, &Ia_setnz_Eb }, + /* 0F 96 */ { 0, &Ia_setbe_Eb }, + /* 0F 97 */ { 0, &Ia_setnbe_Eb }, + /* 0F 98 */ { 0, &Ia_sets_Eb }, + /* 0F 99 */ { 0, &Ia_setns_Eb }, + /* 0F 9A */ { 0, &Ia_setp_Eb }, + /* 0F 9B */ { 0, &Ia_setnp_Eb }, + /* 0F 9C */ { 0, &Ia_setl_Eb }, + /* 0F 9D */ { 0, &Ia_setnl_Eb }, + /* 0F 9E */ { 0, &Ia_setle_Eb }, + /* 0F 9F */ { 0, &Ia_setnle_Eb }, + /* 0F A0 */ { 0, &Ia_pushw_FS }, + /* 0F A1 */ { 0, &Ia_popw_FS }, + /* 0F A2 */ { 0, &Ia_cpuid }, + /* 0F A3 */ { 0, &Ia_btw_Ew_Gw }, + /* 0F A4 */ { 0, &Ia_shldw_Ew_Gw_Ib }, + /* 0F A5 */ { 0, &Ia_shldw_Ew_Gw_CL }, + /* 0F A6 */ { 0, &Ia_Invalid }, + /* 0F A7 */ { 0, &Ia_Invalid }, + /* 0F A8 */ { 0, &Ia_pushw_GS }, + /* 0F A9 */ { 0, &Ia_popw_GS }, + /* 0F AA */ { 0, &Ia_rsm }, + /* 0F AB */ { 0, &Ia_btsw_Ew_Gw }, + /* 0F AC */ { 0, &Ia_shrdw_Ew_Gw_Ib }, + /* 0F AD */ { 0, &Ia_shrdw_Ew_Gw_CL }, + /* 0F AE */ { GRPN(G15) }, + /* 0F AF */ { 0, &Ia_imulw_Gw_Ew }, + /* 0F B0 */ { 0, &Ia_cmpxchgb_Eb_Gb }, + /* 0F B1 */ { 0, &Ia_cmpxchgw_Ew_Gw }, + /* 0F B2 */ { 0, &Ia_lssw_Gw_Mp }, + /* 0F B3 */ { 0, &Ia_btrw_Ew_Gw }, + /* 0F B4 */ { 0, &Ia_lfsw_Gw_Mp }, + /* 0F B5 */ { 0, &Ia_lgsw_Gw_Mp }, + /* 0F B6 */ { 0, &Ia_movzbw_Gw_Eb }, + /* 0F B7 */ { 0, &Ia_movw_Gw_Ew }, + /* 0F B8 */ { 0, &Ia_Invalid }, + /* 0F B9 */ { 0, &Ia_ud2b }, + /* 0F BA */ { GRPN(G8EwIb) }, + /* 0F BB */ { 0, &Ia_btcw_Ew_Gw }, + /* 0F BC */ { 0, &Ia_bsfw_Gw_Ew }, + /* 0F BD */ { 0, &Ia_bsrw_Gw_Ew }, + /* 0F BE */ { 0, &Ia_movsbw_Gw_Eb }, + /* 0F BF */ { 0, &Ia_movw_Gw_Ew }, + /* 0F C0 */ { 0, &Ia_xaddb_Eb_Gb }, + /* 0F C0 */ { 0, &Ia_xaddw_Ew_Gw }, + /* 0F C2 */ { GRPSSE(0fc2) }, + /* 0F C3 */ { GRPSSE(0fc3) }, + /* 0F C4 */ { GRPSSE(0fc4) }, + /* 0F C5 */ { GRPSSE(0fc5) }, + /* 0F C6 */ { GRPSSE(0fc6) }, + /* 0F C7 */ { GRPN(G9) }, + /* 0F C8 */ { 0, &Ia_bswapl_ERX }, + /* 0F C9 */ { 0, &Ia_bswapl_ERX }, + /* 0F CA */ { 0, &Ia_bswapl_ERX }, + /* 0F CB */ { 0, &Ia_bswapl_ERX }, + /* 0F CC */ { 0, &Ia_bswapl_ERX }, + /* 0F CD */ { 0, &Ia_bswapl_ERX }, + /* 0F CE */ { 0, &Ia_bswapl_ERX }, + /* 0F CF */ { 0, &Ia_bswapl_ERX }, + /* 0F D0 */ { GRPSSE(0fd0) }, + /* 0F D1 */ { GRPSSE(0fd1) }, + /* 0F D2 */ { GRPSSE(0fd2) }, + /* 0F D3 */ { GRPSSE(0fd3) }, + /* 0F D4 */ { GRPSSE(0fd4) }, + /* 0F D5 */ { GRPSSE(0fd5) }, + /* 0F D6 */ { GRPSSE(0fd6) }, + /* 0F D7 */ { GRPSSE(0fd7) }, + /* 0F D8 */ { GRPSSE(0fd8) }, + /* 0F D9 */ { GRPSSE(0fd9) }, + /* 0F DA */ { GRPSSE(0fda) }, + /* 0F DB */ { GRPSSE(0fdb) }, + /* 0F DC */ { GRPSSE(0fdc) }, + /* 0F DD */ { GRPSSE(0fdd) }, + /* 0F DE */ { GRPSSE(0fde) }, + /* 0F DF */ { GRPSSE(0fdf) }, + /* 0F E0 */ { GRPSSE(0fe0) }, + /* 0F E1 */ { GRPSSE(0fe1) }, + /* 0F E2 */ { GRPSSE(0fe2) }, + /* 0F E3 */ { GRPSSE(0fe3) }, + /* 0F E4 */ { GRPSSE(0fe4) }, + /* 0F E5 */ { GRPSSE(0fe5) }, + /* 0F E6 */ { GRPSSE(0fe6) }, + /* 0F E7 */ { GRPSSE(0fe7) }, + /* 0F E8 */ { GRPSSE(0fe8) }, + /* 0F E9 */ { GRPSSE(0fe9) }, + /* 0F EA */ { GRPSSE(0fea) }, + /* 0F EB */ { GRPSSE(0feb) }, + /* 0F EC */ { GRPSSE(0fec) }, + /* 0F ED */ { GRPSSE(0fed) }, + /* 0F EE */ { GRPSSE(0fee) }, + /* 0F EF */ { GRPSSE(0fef) }, + /* 0F F0 */ { GRPSSE(0ff0) }, + /* 0F F1 */ { GRPSSE(0ff1) }, + /* 0F F2 */ { GRPSSE(0ff2) }, + /* 0F F3 */ { GRPSSE(0ff3) }, + /* 0F F4 */ { GRPSSE(0ff4) }, + /* 0F F5 */ { GRPSSE(0ff5) }, + /* 0F F6 */ { GRPSSE(0ff6) }, + /* 0F F7 */ { GRPSSE(0ff7) }, + /* 0F F8 */ { GRPSSE(0ff8) }, + /* 0F F9 */ { GRPSSE(0ff9) }, + /* 0F FA */ { GRPSSE(0ffa) }, + /* 0F FB */ { GRPSSE(0ffb) }, + /* 0F FC */ { GRPSSE(0ffc) }, + /* 0F FD */ { GRPSSE(0ffd) }, + /* 0F FE */ { GRPSSE(0ffe) }, + /* 0F FF */ { 0, &Ia_Invalid } +}; + +/* ************************************************************************ */ +/* 32-bit operand size */ + +static BxDisasmOpcodeTable_t BxDisasmOpcodes32[256*2] = { + // 256 entries for single byte opcodes + /* 00 */ { 0, &Ia_addb_Eb_Gb }, + /* 01 */ { 0, &Ia_addl_Ed_Gd }, + /* 02 */ { 0, &Ia_addb_Gb_Eb }, + /* 03 */ { 0, &Ia_addl_Gd_Ed }, + /* 04 */ { 0, &Ia_addb_AL_Ib, }, + /* 05 */ { 0, &Ia_addl_EAX_Id, }, + /* 06 */ { 0, &Ia_pushl_ES }, + /* 07 */ { 0, &Ia_popl_ES }, + /* 08 */ { 0, &Ia_orb_Eb_Gb }, + /* 09 */ { 0, &Ia_orl_Ed_Gd }, + /* 0A */ { 0, &Ia_orb_Gb_Eb }, + /* 0B */ { 0, &Ia_orl_Gd_Ed }, + /* 0C */ { 0, &Ia_orb_AL_Ib }, + /* 0D */ { 0, &Ia_orl_EAX_Id }, + /* 0E */ { 0, &Ia_pushl_CS }, + /* 0F */ { 0, &Ia_error }, // 2 byte escape + /* 10 */ { 0, &Ia_adcb_Eb_Gb }, + /* 11 */ { 0, &Ia_adcl_Ed_Gd }, + /* 12 */ { 0, &Ia_adcb_Gb_Eb }, + /* 13 */ { 0, &Ia_adcl_Gd_Ed }, + /* 14 */ { 0, &Ia_adcb_AL_Ib }, + /* 15 */ { 0, &Ia_adcl_EAX_Id }, + /* 16 */ { 0, &Ia_pushl_SS }, + /* 17 */ { 0, &Ia_popl_SS }, + /* 18 */ { 0, &Ia_sbbb_Eb_Gb }, + /* 19 */ { 0, &Ia_sbbl_Ed_Gd }, + /* 1A */ { 0, &Ia_sbbb_Gb_Eb }, + /* 1B */ { 0, &Ia_sbbl_Gd_Ed }, + /* 1C */ { 0, &Ia_sbbb_AL_Ib }, + /* 1D */ { 0, &Ia_sbbl_EAX_Id }, + /* 1E */ { 0, &Ia_pushl_DS }, + /* 1F */ { 0, &Ia_popl_DS }, + /* 20 */ { 0, &Ia_andb_Eb_Gb }, + /* 21 */ { 0, &Ia_andl_Ed_Gd }, + /* 22 */ { 0, &Ia_andb_Gb_Eb }, + /* 23 */ { 0, &Ia_andl_Gd_Ed }, + /* 24 */ { 0, &Ia_andb_AL_Ib }, + /* 25 */ { 0, &Ia_andl_EAX_Id }, + /* 26 */ { 0, &Ia_prefix_es }, // ES: + /* 27 */ { 0, &Ia_daa }, + /* 28 */ { 0, &Ia_subb_Eb_Gb }, + /* 29 */ { 0, &Ia_subl_Ed_Gd }, + /* 2A */ { 0, &Ia_subb_Gb_Eb }, + /* 2B */ { 0, &Ia_subl_Gd_Ed }, + /* 2C */ { 0, &Ia_subb_AL_Ib }, + /* 2D */ { 0, &Ia_subl_EAX_Id }, + /* 2E */ { 0, &Ia_prefix_cs }, // CS: + /* 2F */ { 0, &Ia_das }, + /* 30 */ { 0, &Ia_xorb_Eb_Gb }, + /* 31 */ { 0, &Ia_xorl_Ed_Gd }, + /* 32 */ { 0, &Ia_xorb_Gb_Eb }, + /* 33 */ { 0, &Ia_xorl_Gd_Ed }, + /* 34 */ { 0, &Ia_xorb_AL_Ib }, + /* 35 */ { 0, &Ia_xorl_EAX_Id }, + /* 36 */ { 0, &Ia_prefix_ss }, // SS: + /* 37 */ { 0, &Ia_aaa }, + /* 38 */ { 0, &Ia_cmpb_Eb_Gb }, + /* 39 */ { 0, &Ia_cmpl_Ed_Gd }, + /* 3A */ { 0, &Ia_cmpb_Gb_Eb }, + /* 3B */ { 0, &Ia_cmpl_Gd_Ed }, + /* 3C */ { 0, &Ia_cmpb_AL_Ib }, + /* 3D */ { 0, &Ia_cmpl_EAX_Id }, + /* 3E */ { 0, &Ia_prefix_ds }, // DS: + /* 3F */ { 0, &Ia_aas }, + /* 40 */ { 0, &Ia_incl_ERX }, + /* 41 */ { 0, &Ia_incl_ERX }, + /* 42 */ { 0, &Ia_incl_ERX }, + /* 43 */ { 0, &Ia_incl_ERX }, + /* 44 */ { 0, &Ia_incl_ERX }, + /* 45 */ { 0, &Ia_incl_ERX }, + /* 46 */ { 0, &Ia_incl_ERX }, + /* 47 */ { 0, &Ia_incl_ERX }, + /* 48 */ { 0, &Ia_decl_ERX }, + /* 49 */ { 0, &Ia_decl_ERX }, + /* 4A */ { 0, &Ia_decl_ERX }, + /* 4B */ { 0, &Ia_decl_ERX }, + /* 4C */ { 0, &Ia_decl_ERX }, + /* 4D */ { 0, &Ia_decl_ERX }, + /* 4E */ { 0, &Ia_decl_ERX }, + /* 4F */ { 0, &Ia_decl_ERX }, + /* 50 */ { 0, &Ia_pushl_ERX }, + /* 51 */ { 0, &Ia_pushl_ERX }, + /* 52 */ { 0, &Ia_pushl_ERX }, + /* 53 */ { 0, &Ia_pushl_ERX }, + /* 54 */ { 0, &Ia_pushl_ERX }, + /* 55 */ { 0, &Ia_pushl_ERX }, + /* 56 */ { 0, &Ia_pushl_ERX }, + /* 57 */ { 0, &Ia_pushl_ERX }, + /* 58 */ { 0, &Ia_popl_ERX }, + /* 59 */ { 0, &Ia_popl_ERX }, + /* 5A */ { 0, &Ia_popl_ERX }, + /* 5B */ { 0, &Ia_popl_ERX }, + /* 5C */ { 0, &Ia_popl_ERX }, + /* 5D */ { 0, &Ia_popl_ERX }, + /* 5E */ { 0, &Ia_popl_ERX }, + /* 5F */ { 0, &Ia_popl_ERX }, + /* 60 */ { 0, &Ia_pushal }, + /* 61 */ { 0, &Ia_popal }, + /* 62 */ { 0, &Ia_boundl_Gd_Ma }, + /* 63 */ { 0, &Ia_arpl_Ew_Rw }, + /* 64 */ { 0, &Ia_prefix_fs }, // FS: + /* 65 */ { 0, &Ia_prefix_gs }, // GS: + /* 66 */ { 0, &Ia_prefix_osize }, // OSIZE: + /* 67 */ { 0, &Ia_prefix_asize }, // ASIZE: + /* 68 */ { 0, &Ia_pushl_Id }, + /* 69 */ { 0, &Ia_imull_Gd_Ed_Id }, + /* 6A */ { 0, &Ia_pushl_sIb }, + /* 6B */ { 0, &Ia_imull_Gd_Ed_sIb }, + /* 6C */ { 0, &Ia_insb_Yb_DX }, + /* 6D */ { 0, &Ia_insl_Yd_DX }, + /* 6E */ { 0, &Ia_outsb_DX_Xb }, + /* 6F */ { 0, &Ia_outsl_DX_Xd }, + /* 70 */ { 0, &Ia_jo_Jb }, + /* 71 */ { 0, &Ia_jno_Jb }, + /* 72 */ { 0, &Ia_jb_Jb }, + /* 73 */ { 0, &Ia_jnb_Jb }, + /* 74 */ { 0, &Ia_jz_Jb }, + /* 75 */ { 0, &Ia_jnz_Jb }, + /* 76 */ { 0, &Ia_jbe_Jb }, + /* 77 */ { 0, &Ia_jnbe_Jb }, + /* 78 */ { 0, &Ia_js_Jb }, + /* 79 */ { 0, &Ia_jns_Jb }, + /* 7A */ { 0, &Ia_jp_Jb }, + /* 7B */ { 0, &Ia_jnp_Jb }, + /* 7C */ { 0, &Ia_jl_Jb }, + /* 7D */ { 0, &Ia_jnl_Jb }, + /* 7E */ { 0, &Ia_jle_Jb }, + /* 7F */ { 0, &Ia_jnle_Jb }, + /* 80 */ { GRPN(G1EbIb) }, + /* 81 */ { GRPN(G1EdId) }, + /* 82 */ { GRPN(G1EbIb) }, + /* 83 */ { GRPN(G1EdIb) }, + /* 84 */ { 0, &Ia_testb_Eb_Gb }, + /* 85 */ { 0, &Ia_testl_Ed_Gd }, + /* 86 */ { 0, &Ia_xchgb_Eb_Gb }, + /* 87 */ { 0, &Ia_xchgl_Ed_Gd }, + /* 88 */ { 0, &Ia_movb_Eb_Gb }, + /* 89 */ { 0, &Ia_movl_Ed_Gd }, + /* 8A */ { 0, &Ia_movb_Gb_Eb }, + /* 8B */ { 0, &Ia_movl_Gd_Ed }, + /* 8C */ { 0, &Ia_movw_Ew_Sw }, + /* 8D */ { 0, &Ia_leal_Gd_Md }, + /* 8E */ { 0, &Ia_movw_Sw_Ew }, + /* 8F */ { 0, &Ia_popl_Ed }, + /* 90 */ { 0, &Ia_nop }, + /* 91 */ { 0, &Ia_xchgl_ERX_EAX }, + /* 92 */ { 0, &Ia_xchgl_ERX_EAX }, + /* 93 */ { 0, &Ia_xchgl_ERX_EAX }, + /* 94 */ { 0, &Ia_xchgl_ERX_EAX }, + /* 95 */ { 0, &Ia_xchgl_ERX_EAX }, + /* 96 */ { 0, &Ia_xchgl_ERX_EAX }, + /* 97 */ { 0, &Ia_xchgl_ERX_EAX }, + /* 98 */ { 0, &Ia_cwde }, + /* 99 */ { 0, &Ia_cdq }, + /* 9A */ { 0, &Ia_lcall_Apd }, + /* 9B */ { 0, &Ia_fwait }, + /* 9C */ { 0, &Ia_pushfl }, + /* 9D */ { 0, &Ia_popfl }, + /* 9E */ { 0, &Ia_sahf }, + /* 9F */ { 0, &Ia_lahf }, + /* A0 */ { 0, &Ia_movb_AL_Ob }, + /* A1 */ { 0, &Ia_movl_EAX_Od }, + /* A0 */ { 0, &Ia_movb_Ob_AL }, + /* A1 */ { 0, &Ia_movl_Od_EAX }, + /* A4 */ { 0, &Ia_movsb_Yb_Xb }, + /* A5 */ { 0, &Ia_movsl_Yd_Xd }, + /* A6 */ { 0, &Ia_cmpsb_Yb_Xb }, + /* A7 */ { 0, &Ia_cmpsl_Yd_Xd }, + /* A8 */ { 0, &Ia_testb_AL_Ib }, + /* A9 */ { 0, &Ia_testl_EAX_Id }, + /* AA */ { 0, &Ia_stosb_Yb_AL }, + /* AB */ { 0, &Ia_stosl_Yd_EAX }, + /* AC */ { 0, &Ia_lodsb_AL_Xb }, + /* AD */ { 0, &Ia_lodsl_EAX_Xd }, + /* AE */ { 0, &Ia_scasb_Yb_AL }, + /* AF */ { 0, &Ia_scasl_Yd_EAX }, + /* B0 */ { 0, &Ia_movb_R8_Ib }, + /* B1 */ { 0, &Ia_movb_R8_Ib }, + /* B2 */ { 0, &Ia_movb_R8_Ib }, + /* B3 */ { 0, &Ia_movb_R8_Ib }, + /* B4 */ { 0, &Ia_movb_R8_Ib }, + /* B5 */ { 0, &Ia_movb_R8_Ib }, + /* B6 */ { 0, &Ia_movb_R8_Ib }, + /* B7 */ { 0, &Ia_movb_R8_Ib }, + /* B8 */ { 0, &Ia_movl_ERX_Id }, + /* B9 */ { 0, &Ia_movl_ERX_Id }, + /* BA */ { 0, &Ia_movl_ERX_Id }, + /* BB */ { 0, &Ia_movl_ERX_Id }, + /* BC */ { 0, &Ia_movl_ERX_Id }, + /* BD */ { 0, &Ia_movl_ERX_Id }, + /* BE */ { 0, &Ia_movl_ERX_Id }, + /* BF */ { 0, &Ia_movl_ERX_Id }, + /* C0 */ { GRPN(G2Eb) }, + /* C1 */ { GRPN(G2Ed) }, + /* C2 */ { 0, &Ia_ret_Iw }, + /* C3 */ { 0, &Ia_ret }, + /* C4 */ { 0, &Ia_lesl_Gd_Mp }, + /* C5 */ { 0, &Ia_ldsl_Gd_Mp }, + /* C6 */ { 0, &Ia_movb_Eb_Ib }, + /* C7 */ { 0, &Ia_movl_Ed_Id }, + /* C8 */ { 0, &Ia_enter }, + /* C9 */ { 0, &Ia_leave }, + /* CA */ { 0, &Ia_lret_Iw }, + /* CB */ { 0, &Ia_lret }, + /* CC */ { 0, &Ia_int3 }, + /* CD */ { 0, &Ia_int_Ib }, + /* CE */ { 0, &Ia_into }, + /* CF */ { 0, &Ia_iretl }, + /* D0 */ { GRPN(G2EbI1) }, + /* D1 */ { GRPN(G2EdI1) }, + /* D2 */ { GRPN(G2EbCL) }, + /* D3 */ { GRPN(G2EdCL) }, + /* D4 */ { 0, &Ia_aam }, + /* D5 */ { 0, &Ia_aad }, + /* D6 */ { 0, &Ia_salc }, + /* D7 */ { 0, &Ia_xlat }, + /* D8 */ { GRPFP(D8) }, + /* D9 */ { GRPFP(D9) }, + /* DA */ { GRPFP(DA) }, + /* DB */ { GRPFP(DB) }, + /* DC */ { GRPFP(DC) }, + /* DD */ { GRPFP(DD) }, + /* DE */ { GRPFP(DE) }, + /* DF */ { GRPFP(DF) }, + /* E0 */ { 0, &Ia_loopne_Jb }, + /* E1 */ { 0, &Ia_loope_Jb }, + /* E2 */ { 0, &Ia_loop_Jb }, + /* E3 */ { 0, &Ia_jcxz_Jb }, + /* E4 */ { 0, &Ia_inb_AL_Ib }, + /* E5 */ { 0, &Ia_inl_EAX_Ib }, + /* E6 */ { 0, &Ia_outb_Ib_AL }, + /* E7 */ { 0, &Ia_outl_Ib_EAX }, + /* E8 */ { 0, &Ia_call_Jd }, + /* E9 */ { 0, &Ia_jmp_Jd }, + /* EA */ { 0, &Ia_ljmp_Apd }, + /* EB */ { 0, &Ia_jmp_Jb }, + /* EC */ { 0, &Ia_inb_AL_DX }, + /* ED */ { 0, &Ia_inl_EAX_DX }, + /* EE */ { 0, &Ia_outb_DX_AL }, + /* EF */ { 0, &Ia_outl_DX_EAX }, + /* F0 */ { 0, &Ia_prefix_lock }, // LOCK: + /* F1 */ { 0, &Ia_int1 }, + /* F2 */ { 0, &Ia_prefix_repne }, // REPNE: + /* F3 */ { 0, &Ia_prefix_rep }, // REP: + /* F4 */ { 0, &Ia_hlt }, + /* F5 */ { 0, &Ia_cmc }, + /* F6 */ { GRPN(G3Eb) }, + /* F7 */ { GRPN(G3Ed) }, + /* F8 */ { 0, &Ia_clc }, + /* F9 */ { 0, &Ia_stc }, + /* FA */ { 0, &Ia_cli }, + /* FB */ { 0, &Ia_sti }, + /* FC */ { 0, &Ia_cld }, + /* FD */ { 0, &Ia_std }, + /* FE */ { GRPN(G4) }, + /* FF */ { GRPN(G5d) }, + + // 256 entries for two byte opcodes + /* 0F 00 */ { GRPN(G6) }, + /* 0F 01 */ { GRPN(G7) }, + /* 0F 02 */ { 0, &Ia_larl_Gd_Ew }, + /* 0F 03 */ { 0, &Ia_lsll_Gd_Ew }, + /* 0F 04 */ { 0, &Ia_Invalid }, + /* 0F 05 */ { 0, &Ia_syscall }, + /* 0F 06 */ { 0, &Ia_clts }, + /* 0F 07 */ { 0, &Ia_sysret }, + /* 0F 08 */ { 0, &Ia_invd }, + /* 0F 09 */ { 0, &Ia_wbinvd }, + /* 0F 0A */ { 0, &Ia_Invalid }, + /* 0F 0B */ { 0, &Ia_ud2a }, + /* 0F 0C */ { 0, &Ia_Invalid }, + /* 0F 0D */ { 0, &Ia_prefetch }, // 3DNow! + /* 0F 0E */ { 0, &Ia_femms }, // 3DNow! + /* 0F 0F */ { GRP3DNOW }, + /* 0F 10 */ { GRPSSE(0f10) }, + /* 0F 11 */ { GRPSSE(0f11) }, + /* 0F 12 */ { GRPSSE(0f12) }, + /* 0F 13 */ { GRPSSE(0f13) }, + /* 0F 14 */ { GRPSSE(0f14) }, + /* 0F 15 */ { GRPSSE(0f15) }, + /* 0F 16 */ { GRPSSE(0f16) }, + /* 0F 17 */ { GRPSSE(0f17) }, + /* 0F 18 */ { GRPN(G16) }, + /* 0F 19 */ { 0, &Ia_Invalid }, + /* 0F 1A */ { 0, &Ia_Invalid }, + /* 0F 1B */ { 0, &Ia_Invalid }, + /* 0F 1C */ { 0, &Ia_Invalid }, + /* 0F 1D */ { 0, &Ia_Invalid }, + /* 0F 1E */ { 0, &Ia_Invalid }, + /* 0F 1F */ { 0, &Ia_multibyte_nop }, + /* 0F 20 */ { 0, &Ia_movl_Rd_Cd }, + /* 0F 21 */ { 0, &Ia_movl_Rd_Dd }, + /* 0F 22 */ { 0, &Ia_movl_Cd_Rd }, + /* 0F 23 */ { 0, &Ia_movl_Dd_Rd }, + /* 0F 24 */ { 0, &Ia_movl_Rd_Td }, + /* 0F 25 */ { 0, &Ia_Invalid }, + /* 0F 26 */ { 0, &Ia_movl_Td_Rd }, + /* 0F 27 */ { 0, &Ia_Invalid }, + /* 0F 28 */ { GRPSSE(0f28) }, + /* 0F 29 */ { GRPSSE(0f29) }, + /* 0F 2A */ { GRPSSE(0f2a) }, + /* 0F 2B */ { GRPSSE(0f2b) }, + /* 0F 2C */ { GRPSSE(0f2c) }, + /* 0F 2D */ { GRPSSE(0f2d) }, + /* 0F 2E */ { GRPSSE(0f2e) }, + /* 0F 2F */ { GRPSSE(0f2f) }, + /* 0F 30 */ { 0, &Ia_wrmsr }, + /* 0F 31 */ { 0, &Ia_rdtsc }, + /* 0F 32 */ { 0, &Ia_rdmsr }, + /* 0F 33 */ { 0, &Ia_rdpmc }, + /* 0F 34 */ { 0, &Ia_sysenter }, + /* 0F 35 */ { 0, &Ia_sysexit }, + /* 0F 36 */ { 0, &Ia_Invalid }, + /* 0F 37 */ { 0, &Ia_Invalid }, + /* 0F 38 */ { GR3BTAB(A4) }, + /* 0F 39 */ { 0, &Ia_Invalid }, + /* 0F 3A */ { GR3BTAB(A5) }, + /* 0F 3B */ { 0, &Ia_Invalid }, + /* 0F 3C */ { 0, &Ia_Invalid }, + /* 0F 3D */ { 0, &Ia_Invalid }, + /* 0F 3E */ { 0, &Ia_Invalid }, + /* 0F 3F */ { 0, &Ia_Invalid }, + /* 0F 40 */ { 0, &Ia_cmovol_Gd_Ed }, + /* 0F 41 */ { 0, &Ia_cmovnol_Gd_Ed }, + /* 0F 42 */ { 0, &Ia_cmovcl_Gd_Ed }, + /* 0F 43 */ { 0, &Ia_cmovncl_Gd_Ed }, + /* 0F 44 */ { 0, &Ia_cmovzl_Gd_Ed }, + /* 0F 45 */ { 0, &Ia_cmovnzl_Gd_Ed }, + /* 0F 46 */ { 0, &Ia_cmovnal_Gd_Ed }, + /* 0F 47 */ { 0, &Ia_cmoval_Gd_Ed }, + /* 0F 48 */ { 0, &Ia_cmovsl_Gd_Ed }, + /* 0F 49 */ { 0, &Ia_cmovnsl_Gd_Ed }, + /* 0F 4A */ { 0, &Ia_cmovpl_Gd_Ed }, + /* 0F 4B */ { 0, &Ia_cmovnpl_Gd_Ed }, + /* 0F 4C */ { 0, &Ia_cmovll_Gd_Ed }, + /* 0F 4D */ { 0, &Ia_cmovnll_Gd_Ed }, + /* 0F 4E */ { 0, &Ia_cmovngl_Gd_Ed }, + /* 0F 4F */ { 0, &Ia_cmovgl_Gd_Ed }, + /* 0F 50 */ { GRPSSE(0f50) }, + /* 0F 51 */ { GRPSSE(0f51) }, + /* 0F 52 */ { GRPSSE(0f52) }, + /* 0F 53 */ { GRPSSE(0f53) }, + /* 0F 54 */ { GRPSSE(0f54) }, + /* 0F 55 */ { GRPSSE(0f55) }, + /* 0F 56 */ { GRPSSE(0f56) }, + /* 0F 57 */ { GRPSSE(0f57) }, + /* 0F 58 */ { GRPSSE(0f58) }, + /* 0F 59 */ { GRPSSE(0f59) }, + /* 0F 5A */ { GRPSSE(0f5a) }, + /* 0F 5B */ { GRPSSE(0f5b) }, + /* 0F 5C */ { GRPSSE(0f5c) }, + /* 0F 5D */ { GRPSSE(0f5d) }, + /* 0F 5E */ { GRPSSE(0f5e) }, + /* 0F 5F */ { GRPSSE(0f5f) }, + /* 0F 60 */ { GRPSSE(0f60) }, + /* 0F 61 */ { GRPSSE(0f61) }, + /* 0F 62 */ { GRPSSE(0f62) }, + /* 0F 63 */ { GRPSSE(0f63) }, + /* 0F 64 */ { GRPSSE(0f64) }, + /* 0F 65 */ { GRPSSE(0f65) }, + /* 0F 66 */ { GRPSSE(0f66) }, + /* 0F 67 */ { GRPSSE(0f67) }, + /* 0F 68 */ { GRPSSE(0f68) }, + /* 0F 69 */ { GRPSSE(0f69) }, + /* 0F 6A */ { GRPSSE(0f6a) }, + /* 0F 6B */ { GRPSSE(0f6b) }, + /* 0F 6C */ { GRPSSE(0f6c) }, + /* 0F 6D */ { GRPSSE(0f6d) }, + /* 0F 6E */ { GRPSSE(0f6e) }, + /* 0F 6F */ { GRPSSE(0f6f) }, + /* 0F 70 */ { GRPSSE(0f70) }, + /* 0F 71 */ { GRPN(G12) }, + /* 0F 72 */ { GRPN(G13) }, + /* 0F 73 */ { GRPN(G14) }, + /* 0F 74 */ { GRPSSE(0f74) }, + /* 0F 75 */ { GRPSSE(0f75) }, + /* 0F 76 */ { GRPSSE(0f76) }, + /* 0F 77 */ { 0, &Ia_emms }, + /* 0F 78 */ { 0, &Ia_Invalid }, + /* 0F 79 */ { 0, &Ia_Invalid }, + /* 0F 7A */ { 0, &Ia_Invalid }, + /* 0F 7B */ { 0, &Ia_Invalid }, + /* 0F 7C */ { GRPSSE(0f7c) }, + /* 0F 7D */ { GRPSSE(0f7d) }, + /* 0F 7E */ { GRPSSE(0f7e) }, + /* 0F 7F */ { GRPSSE(0f7f) }, + /* 0F 80 */ { 0, &Ia_jo_Jd }, + /* 0F 81 */ { 0, &Ia_jno_Jd }, + /* 0F 82 */ { 0, &Ia_jb_Jd }, + /* 0F 83 */ { 0, &Ia_jnb_Jd }, + /* 0F 84 */ { 0, &Ia_jz_Jd }, + /* 0F 85 */ { 0, &Ia_jnz_Jd }, + /* 0F 86 */ { 0, &Ia_jbe_Jd }, + /* 0F 87 */ { 0, &Ia_jnbe_Jd }, + /* 0F 88 */ { 0, &Ia_js_Jd }, + /* 0F 89 */ { 0, &Ia_jns_Jd }, + /* 0F 8A */ { 0, &Ia_jp_Jd }, + /* 0F 8B */ { 0, &Ia_jnp_Jd }, + /* 0F 8C */ { 0, &Ia_jl_Jd }, + /* 0F 8D */ { 0, &Ia_jnl_Jd }, + /* 0F 8E */ { 0, &Ia_jle_Jd }, + /* 0F 8F */ { 0, &Ia_jnle_Jd }, + /* 0F 90 */ { 0, &Ia_seto_Eb }, + /* 0F 91 */ { 0, &Ia_setno_Eb }, + /* 0F 92 */ { 0, &Ia_setb_Eb }, + /* 0F 93 */ { 0, &Ia_setnb_Eb }, + /* 0F 94 */ { 0, &Ia_setz_Eb }, + /* 0F 95 */ { 0, &Ia_setnz_Eb }, + /* 0F 96 */ { 0, &Ia_setbe_Eb }, + /* 0F 97 */ { 0, &Ia_setnbe_Eb }, + /* 0F 98 */ { 0, &Ia_sets_Eb }, + /* 0F 99 */ { 0, &Ia_setns_Eb }, + /* 0F 9A */ { 0, &Ia_setp_Eb }, + /* 0F 9B */ { 0, &Ia_setnp_Eb }, + /* 0F 9C */ { 0, &Ia_setl_Eb }, + /* 0F 9D */ { 0, &Ia_setnl_Eb }, + /* 0F 9E */ { 0, &Ia_setle_Eb }, + /* 0F 9F */ { 0, &Ia_setnle_Eb }, + /* 0F A0 */ { 0, &Ia_pushl_FS }, + /* 0F A1 */ { 0, &Ia_popl_FS }, + /* 0F A2 */ { 0, &Ia_cpuid }, + /* 0F A3 */ { 0, &Ia_btl_Ed_Gd }, + /* 0F A4 */ { 0, &Ia_shldl_Ed_Gd_Ib }, + /* 0F A5 */ { 0, &Ia_shldl_Ed_Gd_CL }, + /* 0F A6 */ { 0, &Ia_Invalid }, + /* 0F A7 */ { 0, &Ia_Invalid }, + /* 0F A8 */ { 0, &Ia_pushl_GS }, + /* 0F A9 */ { 0, &Ia_popl_GS }, + /* 0F AA */ { 0, &Ia_rsm }, + /* 0F AB */ { 0, &Ia_btsl_Ed_Gd }, + /* 0F AC */ { 0, &Ia_shrdl_Ed_Gd_Ib }, + /* 0F AD */ { 0, &Ia_shrdl_Ed_Gd_CL }, + /* 0F AE */ { GRPN(G15) }, + /* 0F AF */ { 0, &Ia_imull_Gd_Ed }, + /* 0F B0 */ { 0, &Ia_cmpxchgb_Eb_Gb }, + /* 0F B1 */ { 0, &Ia_cmpxchgl_Ed_Gd }, + /* 0F B2 */ { 0, &Ia_lssl_Gd_Mp }, + /* 0F B3 */ { 0, &Ia_btrl_Ed_Gd }, + /* 0F B4 */ { 0, &Ia_lfsl_Gd_Mp }, + /* 0F B5 */ { 0, &Ia_lgsl_Gd_Mp }, + /* 0F B6 */ { 0, &Ia_movzbl_Gd_Eb }, + /* 0F B7 */ { 0, &Ia_movzwl_Gd_Ew }, + /* 0F B8 */ { 0, &Ia_Invalid }, + /* 0F B9 */ { 0, &Ia_ud2b }, + /* 0F BA */ { GRPN(G8EdIb) }, + /* 0F BB */ { 0, &Ia_btcl_Ed_Gd }, + /* 0F BC */ { 0, &Ia_bsfl_Gd_Ed }, + /* 0F BD */ { 0, &Ia_bsrl_Gd_Ed }, + /* 0F BE */ { 0, &Ia_movsbl_Gd_Eb }, + /* 0F BF */ { 0, &Ia_movswl_Gd_Ew }, + /* 0F C0 */ { 0, &Ia_xaddb_Eb_Gb }, + /* 0F C0 */ { 0, &Ia_xaddl_Ed_Gd }, + /* 0F C2 */ { GRPSSE(0fc2) }, + /* 0F C3 */ { GRPSSE(0fc3) }, + /* 0F C4 */ { GRPSSE(0fc4) }, + /* 0F C5 */ { GRPSSE(0fc5) }, + /* 0F C6 */ { GRPSSE(0fc6) }, + /* 0F C7 */ { GRPN(G9) }, + /* 0F C8 */ { 0, &Ia_bswapl_ERX }, + /* 0F C9 */ { 0, &Ia_bswapl_ERX }, + /* 0F CA */ { 0, &Ia_bswapl_ERX }, + /* 0F CB */ { 0, &Ia_bswapl_ERX }, + /* 0F CC */ { 0, &Ia_bswapl_ERX }, + /* 0F CD */ { 0, &Ia_bswapl_ERX }, + /* 0F CE */ { 0, &Ia_bswapl_ERX }, + /* 0F CF */ { 0, &Ia_bswapl_ERX }, + /* 0F D0 */ { GRPSSE(0fd0) }, + /* 0F D1 */ { GRPSSE(0fd1) }, + /* 0F D2 */ { GRPSSE(0fd2) }, + /* 0F D3 */ { GRPSSE(0fd3) }, + /* 0F D4 */ { GRPSSE(0fd4) }, + /* 0F D5 */ { GRPSSE(0fd5) }, + /* 0F D6 */ { GRPSSE(0fd6) }, + /* 0F D7 */ { GRPSSE(0fd7) }, + /* 0F D8 */ { GRPSSE(0fd8) }, + /* 0F D9 */ { GRPSSE(0fd9) }, + /* 0F DA */ { GRPSSE(0fda) }, + /* 0F DB */ { GRPSSE(0fdb) }, + /* 0F DC */ { GRPSSE(0fdc) }, + /* 0F DD */ { GRPSSE(0fdd) }, + /* 0F DE */ { GRPSSE(0fde) }, + /* 0F DF */ { GRPSSE(0fdf) }, + /* 0F E0 */ { GRPSSE(0fe0) }, + /* 0F E1 */ { GRPSSE(0fe1) }, + /* 0F E2 */ { GRPSSE(0fe2) }, + /* 0F E3 */ { GRPSSE(0fe3) }, + /* 0F E4 */ { GRPSSE(0fe4) }, + /* 0F E5 */ { GRPSSE(0fe5) }, + /* 0F E6 */ { GRPSSE(0fe6) }, + /* 0F E7 */ { GRPSSE(0fe7) }, + /* 0F E8 */ { GRPSSE(0fe8) }, + /* 0F E9 */ { GRPSSE(0fe9) }, + /* 0F EA */ { GRPSSE(0fea) }, + /* 0F EB */ { GRPSSE(0feb) }, + /* 0F EC */ { GRPSSE(0fec) }, + /* 0F ED */ { GRPSSE(0fed) }, + /* 0F EE */ { GRPSSE(0fee) }, + /* 0F EF */ { GRPSSE(0fef) }, + /* 0F F0 */ { GRPSSE(0ff0) }, + /* 0F F1 */ { GRPSSE(0ff1) }, + /* 0F F2 */ { GRPSSE(0ff2) }, + /* 0F F3 */ { GRPSSE(0ff3) }, + /* 0F F4 */ { GRPSSE(0ff4) }, + /* 0F F5 */ { GRPSSE(0ff5) }, + /* 0F F6 */ { GRPSSE(0ff6) }, + /* 0F F7 */ { GRPSSE(0ff7) }, + /* 0F F8 */ { GRPSSE(0ff8) }, + /* 0F F9 */ { GRPSSE(0ff9) }, + /* 0F FA */ { GRPSSE(0ffa) }, + /* 0F FB */ { GRPSSE(0ffb) }, + /* 0F FC */ { GRPSSE(0ffc) }, + /* 0F FD */ { GRPSSE(0ffd) }, + /* 0F FE */ { GRPSSE(0ffe) }, + /* 0F FF */ { 0, &Ia_Invalid } +}; + +/* ************************************************************************ */ +/* Long mode */ + +static BxDisasmOpcodeTable_t BxDisasmOpcodes64w[256*2] = { + // 256 entries for single byte opcodes + /* 00 */ { 0, &Ia_addb_Eb_Gb }, + /* 01 */ { 0, &Ia_addw_Ew_Gw }, + /* 02 */ { 0, &Ia_addb_Gb_Eb }, + /* 03 */ { 0, &Ia_addw_Gw_Ew }, + /* 04 */ { 0, &Ia_addb_AL_Ib }, + /* 05 */ { 0, &Ia_addw_AX_Iw }, + /* 06 */ { 0, &Ia_Invalid }, + /* 07 */ { 0, &Ia_Invalid }, + /* 08 */ { 0, &Ia_orb_Eb_Gb }, + /* 09 */ { 0, &Ia_orw_Ew_Gw }, + /* 0A */ { 0, &Ia_orb_Gb_Eb }, + /* 0B */ { 0, &Ia_orw_Gw_Ew }, + /* 0C */ { 0, &Ia_orb_AL_Ib }, + /* 0D */ { 0, &Ia_orw_AX_Iw }, + /* 0E */ { 0, &Ia_Invalid }, + /* 0F */ { 0, &Ia_error }, // 2 byte escape + /* 10 */ { 0, &Ia_adcb_Eb_Gb }, + /* 11 */ { 0, &Ia_adcw_Ew_Gw }, + /* 12 */ { 0, &Ia_adcb_Gb_Eb }, + /* 13 */ { 0, &Ia_adcw_Gw_Ew }, + /* 14 */ { 0, &Ia_adcb_AL_Ib }, + /* 15 */ { 0, &Ia_adcw_AX_Iw }, + /* 16 */ { 0, &Ia_Invalid }, + /* 17 */ { 0, &Ia_Invalid }, + /* 18 */ { 0, &Ia_sbbb_Eb_Gb }, + /* 19 */ { 0, &Ia_sbbw_Ew_Gw }, + /* 1A */ { 0, &Ia_sbbb_Gb_Eb }, + /* 1B */ { 0, &Ia_sbbw_Gw_Ew }, + /* 1C */ { 0, &Ia_sbbb_AL_Ib }, + /* 1D */ { 0, &Ia_sbbw_AX_Iw }, + /* 1E */ { 0, &Ia_Invalid }, + /* 1F */ { 0, &Ia_Invalid }, + /* 20 */ { 0, &Ia_andb_Eb_Gb }, + /* 21 */ { 0, &Ia_andw_Ew_Gw }, + /* 22 */ { 0, &Ia_andb_Gb_Eb }, + /* 23 */ { 0, &Ia_andw_Gw_Ew }, + /* 24 */ { 0, &Ia_andb_AL_Ib }, + /* 25 */ { 0, &Ia_andw_AX_Iw }, + /* 26 */ { 0, &Ia_prefix_es }, // ES: + /* 27 */ { 0, &Ia_Invalid }, + /* 28 */ { 0, &Ia_subb_Eb_Gb }, + /* 29 */ { 0, &Ia_subw_Ew_Gw }, + /* 2A */ { 0, &Ia_subb_Gb_Eb }, + /* 2B */ { 0, &Ia_subw_Gw_Ew }, + /* 2C */ { 0, &Ia_subb_AL_Ib }, + /* 2D */ { 0, &Ia_subw_AX_Iw }, + /* 2E */ { 0, &Ia_prefix_cs }, // CS: + /* 2F */ { 0, &Ia_Invalid }, + /* 30 */ { 0, &Ia_xorb_Eb_Gb }, + /* 31 */ { 0, &Ia_xorw_Ew_Gw }, + /* 32 */ { 0, &Ia_xorb_Gb_Eb }, + /* 33 */ { 0, &Ia_xorw_Gw_Ew }, + /* 34 */ { 0, &Ia_xorb_AL_Ib }, + /* 35 */ { 0, &Ia_xorw_AX_Iw }, + /* 36 */ { 0, &Ia_prefix_ss }, // SS: + /* 37 */ { 0, &Ia_Invalid }, + /* 38 */ { 0, &Ia_cmpb_Eb_Gb }, + /* 39 */ { 0, &Ia_cmpw_Ew_Gw }, + /* 3A */ { 0, &Ia_cmpb_Gb_Eb }, + /* 3B */ { 0, &Ia_cmpw_Gw_Ew }, + /* 3C */ { 0, &Ia_cmpb_AL_Ib }, + /* 3D */ { 0, &Ia_cmpw_AX_Iw }, + /* 3E */ { 0, &Ia_prefix_ds }, // DS: + /* 3F */ { 0, &Ia_Invalid }, + /* 40 */ { 0, &Ia_prefix_rex }, // REX: + /* 41 */ { 0, &Ia_prefix_rex }, // REX: + /* 42 */ { 0, &Ia_prefix_rex }, // REX: + /* 43 */ { 0, &Ia_prefix_rex }, // REX: + /* 44 */ { 0, &Ia_prefix_rex }, // REX: + /* 45 */ { 0, &Ia_prefix_rex }, // REX: + /* 46 */ { 0, &Ia_prefix_rex }, // REX: + /* 47 */ { 0, &Ia_prefix_rex }, // REX: + /* 48 */ { 0, &Ia_prefix_rex }, // REX: + /* 49 */ { 0, &Ia_prefix_rex }, // REX: + /* 4A */ { 0, &Ia_prefix_rex }, // REX: + /* 4B */ { 0, &Ia_prefix_rex }, // REX: + /* 4C */ { 0, &Ia_prefix_rex }, // REX: + /* 4D */ { 0, &Ia_prefix_rex }, // REX: + /* 4E */ { 0, &Ia_prefix_rex }, // REX: + /* 4F */ { 0, &Ia_prefix_rex }, // REX: + /* 50 */ { 0, &Ia_pushw_RX }, + /* 51 */ { 0, &Ia_pushw_RX }, + /* 52 */ { 0, &Ia_pushw_RX }, + /* 53 */ { 0, &Ia_pushw_RX }, + /* 54 */ { 0, &Ia_pushw_RX }, + /* 55 */ { 0, &Ia_pushw_RX }, + /* 56 */ { 0, &Ia_pushw_RX }, + /* 57 */ { 0, &Ia_pushw_RX }, + /* 58 */ { 0, &Ia_popw_RX }, + /* 59 */ { 0, &Ia_popw_RX }, + /* 5A */ { 0, &Ia_popw_RX }, + /* 5B */ { 0, &Ia_popw_RX }, + /* 5C */ { 0, &Ia_popw_RX }, + /* 5D */ { 0, &Ia_popw_RX }, + /* 5E */ { 0, &Ia_popw_RX }, + /* 5F */ { 0, &Ia_popw_RX }, + /* 60 */ { 0, &Ia_Invalid }, + /* 61 */ { 0, &Ia_Invalid }, + /* 62 */ { 0, &Ia_Invalid }, + /* 63 */ { 0, &Ia_movw_Gw_Ew }, + /* 64 */ { 0, &Ia_prefix_fs }, // FS: + /* 65 */ { 0, &Ia_prefix_gs }, // GS: + /* 66 */ { 0, &Ia_prefix_osize }, // OSIZE: + /* 67 */ { 0, &Ia_prefix_asize }, // ASIZE: + /* 68 */ { 0, &Ia_pushw_Iw }, + /* 69 */ { 0, &Ia_imulw_Gw_Ew_Iw }, + /* 6A */ { 0, &Ia_pushw_sIb }, + /* 6B */ { 0, &Ia_imulw_Gw_Ew_sIb }, + /* 6C */ { 0, &Ia_insb_Yb_DX }, + /* 6D */ { 0, &Ia_insw_Yw_DX }, + /* 6E */ { 0, &Ia_outsb_DX_Xb }, + /* 6F */ { 0, &Ia_outsw_DX_Xw }, + /* 70 */ { 0, &Ia_jo_Jb }, + /* 71 */ { 0, &Ia_jno_Jb }, + /* 72 */ { 0, &Ia_jb_Jb }, + /* 73 */ { 0, &Ia_jnb_Jb }, + /* 74 */ { 0, &Ia_jz_Jb }, + /* 75 */ { 0, &Ia_jnz_Jb }, + /* 76 */ { 0, &Ia_jbe_Jb }, + /* 77 */ { 0, &Ia_jnbe_Jb }, + /* 78 */ { 0, &Ia_js_Jb }, + /* 79 */ { 0, &Ia_jns_Jb }, + /* 7A */ { 0, &Ia_jp_Jb }, + /* 7B */ { 0, &Ia_jnp_Jb }, + /* 7C */ { 0, &Ia_jl_Jb }, + /* 7D */ { 0, &Ia_jnl_Jb }, + /* 7E */ { 0, &Ia_jle_Jb }, + /* 7F */ { 0, &Ia_jnle_Jb }, + /* 80 */ { GRPN(G1EbIb) }, + /* 81 */ { GRPN(G1EwIw) }, + /* 82 */ { 9, &Ia_Invalid }, + /* 83 */ { GRPN(G1EwIb) }, + /* 84 */ { 0, &Ia_testb_Eb_Gb }, + /* 85 */ { 0, &Ia_testw_Ew_Gw }, + /* 86 */ { 0, &Ia_xchgb_Eb_Gb }, + /* 87 */ { 0, &Ia_xchgw_Ew_Gw }, + /* 88 */ { 0, &Ia_movb_Eb_Gb }, + /* 89 */ { 0, &Ia_movw_Ew_Gw }, + /* 8A */ { 0, &Ia_movb_Gb_Eb }, + /* 8B */ { 0, &Ia_movw_Gw_Ew }, + /* 8C */ { 0, &Ia_movw_Ew_Sw }, + /* 8D */ { 0, &Ia_leaw_Gw_Mw }, + /* 8E */ { 0, &Ia_movw_Sw_Ew }, + /* 8F */ { 0, &Ia_popw_Ew }, + /* 90 */ { 0, &Ia_xchgw_RX_AX }, // handle XCHG R8w, AX + /* 91 */ { 0, &Ia_xchgw_RX_AX }, + /* 92 */ { 0, &Ia_xchgw_RX_AX }, + /* 93 */ { 0, &Ia_xchgw_RX_AX }, + /* 94 */ { 0, &Ia_xchgw_RX_AX }, + /* 95 */ { 0, &Ia_xchgw_RX_AX }, + /* 96 */ { 0, &Ia_xchgw_RX_AX }, + /* 97 */ { 0, &Ia_xchgw_RX_AX }, + /* 98 */ { 0, &Ia_cbw }, + /* 99 */ { 0, &Ia_cwd }, + /* 9A */ { 0, &Ia_Invalid }, + /* 9B */ { 0, &Ia_fwait }, + /* 9C */ { 0, &Ia_pushfw }, + /* 9D */ { 0, &Ia_popfw }, + /* 9E */ { 0, &Ia_sahf }, + /* 9F */ { 0, &Ia_lahf }, + /* A0 */ { 0, &Ia_movb_AL_Ob }, + /* A1 */ { 0, &Ia_movw_AX_Ow }, + /* A0 */ { 0, &Ia_movb_Ob_AL }, + /* A1 */ { 0, &Ia_movw_Ow_AX }, + /* A4 */ { 0, &Ia_movsb_Yb_Xb }, + /* A5 */ { 0, &Ia_movsw_Yw_Xw }, + /* A6 */ { 0, &Ia_cmpsb_Yb_Xb }, + /* A7 */ { 0, &Ia_cmpsw_Yw_Xw }, + /* A8 */ { 0, &Ia_testb_AL_Ib }, + /* A9 */ { 0, &Ia_testw_AX_Iw }, + /* AA */ { 0, &Ia_stosb_Yb_AL }, + /* AB */ { 0, &Ia_stosw_Yw_AX }, + /* AC */ { 0, &Ia_lodsb_AL_Xb }, + /* AD */ { 0, &Ia_lodsw_AX_Xw }, + /* AE */ { 0, &Ia_scasb_Yb_AL }, + /* AF */ { 0, &Ia_scasw_Yw_AX }, + /* B0 */ { 0, &Ia_movb_R8_Ib }, + /* B1 */ { 0, &Ia_movb_R8_Ib }, + /* B2 */ { 0, &Ia_movb_R8_Ib }, + /* B3 */ { 0, &Ia_movb_R8_Ib }, + /* B4 */ { 0, &Ia_movb_R8_Ib }, + /* B5 */ { 0, &Ia_movb_R8_Ib }, + /* B6 */ { 0, &Ia_movb_R8_Ib }, + /* B7 */ { 0, &Ia_movb_R8_Ib }, + /* B8 */ { 0, &Ia_movw_RX_Iw }, + /* B9 */ { 0, &Ia_movw_RX_Iw }, + /* BA */ { 0, &Ia_movw_RX_Iw }, + /* BB */ { 0, &Ia_movw_RX_Iw }, + /* BC */ { 0, &Ia_movw_RX_Iw }, + /* BD */ { 0, &Ia_movw_RX_Iw }, + /* BE */ { 0, &Ia_movw_RX_Iw }, + /* BF */ { 0, &Ia_movw_RX_Iw }, + /* C0 */ { GRPN(G2Eb) }, + /* C1 */ { GRPN(G2Ew) }, + /* C2 */ { 0, &Ia_ret_Iw }, + /* C3 */ { 0, &Ia_ret }, + /* C4 */ { 0, &Ia_Invalid }, + /* C5 */ { 0, &Ia_Invalid }, + /* C6 */ { 0, &Ia_movb_Eb_Ib }, + /* C7 */ { 0, &Ia_movw_Ew_Iw }, + /* C8 */ { 0, &Ia_enter }, + /* C9 */ { 0, &Ia_leave }, + /* CA */ { 0, &Ia_lret_Iw }, + /* CB */ { 0, &Ia_lret }, + /* CC */ { 0, &Ia_int3 }, + /* CD */ { 0, &Ia_int_Ib }, + /* CE */ { 0, &Ia_Invalid }, + /* CF */ { 0, &Ia_iretw }, + /* D0 */ { GRPN(G2EbI1) }, + /* D1 */ { GRPN(G2EwI1) }, + /* D2 */ { GRPN(G2EbCL) }, + /* D3 */ { GRPN(G2EwCL) }, + /* D4 */ { 0, &Ia_Invalid }, + /* D5 */ { 0, &Ia_Invalid }, + /* D6 */ { 0, &Ia_Invalid }, + /* D7 */ { 0, &Ia_xlat }, + /* D8 */ { GRPFP(D8) }, + /* D9 */ { GRPFP(D9) }, + /* DA */ { GRPFP(DA) }, + /* DB */ { GRPFP(DB) }, + /* DC */ { GRPFP(DC) }, + /* DD */ { GRPFP(DD) }, + /* DE */ { GRPFP(DE) }, + /* DF */ { GRPFP(DF) }, + /* E0 */ { 0, &Ia_loopne_Jb }, + /* E1 */ { 0, &Ia_loope_Jb }, + /* E2 */ { 0, &Ia_loop_Jb }, + /* E3 */ { 0, &Ia_jrcxz_Jb }, + /* E4 */ { 0, &Ia_inb_AL_Ib }, + /* E5 */ { 0, &Ia_inw_AX_Ib }, + /* E6 */ { 0, &Ia_outb_Ib_AL }, + /* E7 */ { 0, &Ia_outw_Ib_AX }, + /* E8 */ { 0, &Ia_call_Jd }, + /* E9 */ { 0, &Ia_jmp_Jd }, + /* EA */ { 0, &Ia_Invalid }, + /* EB */ { 0, &Ia_jmp_Jb }, + /* EC */ { 0, &Ia_inb_AL_DX }, + /* ED */ { 0, &Ia_inw_AX_DX }, + /* EE */ { 0, &Ia_outb_DX_AL }, + /* EF */ { 0, &Ia_outw_DX_AX }, + /* F0 */ { 0, &Ia_prefix_lock }, // LOCK: + /* F1 */ { 0, &Ia_int1 }, + /* F2 */ { 0, &Ia_prefix_repne }, // REPNE: + /* F3 */ { 0, &Ia_prefix_rep }, // REP: + /* F4 */ { 0, &Ia_hlt }, + /* F5 */ { 0, &Ia_cmc }, + /* F6 */ { GRPN(G3Eb) }, + /* F7 */ { GRPN(G3Ew) }, + /* F8 */ { 0, &Ia_clc }, + /* F9 */ { 0, &Ia_stc }, + /* FA */ { 0, &Ia_cli }, + /* FB */ { 0, &Ia_sti }, + /* FC */ { 0, &Ia_cld }, + /* FD */ { 0, &Ia_std }, + /* FE */ { GRPN(G4) }, + /* FF */ { GRPN(G5w) }, + + // 256 entries for two byte opcodes + /* 0F 00 */ { GRPN(G6) }, + /* 0F 01 */ { GRPN(G7) }, + /* 0F 02 */ { 0, &Ia_larw_Gw_Ew }, + /* 0F 03 */ { 0, &Ia_lslw_Gw_Ew }, + /* 0F 04 */ { 0, &Ia_Invalid }, + /* 0F 05 */ { 0, &Ia_syscall }, + /* 0F 06 */ { 0, &Ia_clts }, + /* 0F 07 */ { 0, &Ia_sysret }, + /* 0F 08 */ { 0, &Ia_invd }, + /* 0F 09 */ { 0, &Ia_wbinvd }, + /* 0F 0A */ { 0, &Ia_Invalid }, + /* 0F 0B */ { 0, &Ia_ud2a }, + /* 0F 0C */ { 0, &Ia_Invalid }, + /* 0F 0D */ { 0, &Ia_prefetch }, // 3DNow! + /* 0F 0E */ { 0, &Ia_femms }, // 3DNow! + /* 0F 0F */ { GRP3DNOW }, + /* 0F 10 */ { GRPSSE(0f10) }, + /* 0F 11 */ { GRPSSE(0f11) }, + /* 0F 12 */ { GRPSSE(0f12) }, + /* 0F 13 */ { GRPSSE(0f13) }, + /* 0F 14 */ { GRPSSE(0f14) }, + /* 0F 15 */ { GRPSSE(0f15) }, + /* 0F 16 */ { GRPSSE(0f16) }, + /* 0F 17 */ { GRPSSE(0f17) }, + /* 0F 18 */ { GRPN(G16) }, + /* 0F 19 */ { 0, &Ia_Invalid }, + /* 0F 1A */ { 0, &Ia_Invalid }, + /* 0F 1B */ { 0, &Ia_Invalid }, + /* 0F 1C */ { 0, &Ia_Invalid }, + /* 0F 1D */ { 0, &Ia_Invalid }, + /* 0F 1E */ { 0, &Ia_Invalid }, + /* 0F 1F */ { 0, &Ia_multibyte_nop }, + /* 0F 20 */ { 0, &Ia_movq_Rq_Cq }, + /* 0F 21 */ { 0, &Ia_movq_Rq_Dq }, + /* 0F 22 */ { 0, &Ia_movq_Cq_Rq }, + /* 0F 23 */ { 0, &Ia_movq_Dq_Rq }, + /* 0F 24 */ { 0, &Ia_Invalid }, + /* 0F 25 */ { 0, &Ia_Invalid }, + /* 0F 26 */ { 0, &Ia_Invalid }, + /* 0F 27 */ { 0, &Ia_Invalid }, + /* 0F 28 */ { GRPSSE(0f28) }, + /* 0F 29 */ { GRPSSE(0f29) }, + /* 0F 2A */ { GRPSSE(0f2a) }, + /* 0F 2B */ { GRPSSE(0f2b) }, + /* 0F 2C */ { GRPSSE(0f2c) }, + /* 0F 2D */ { GRPSSE(0f2d) }, + /* 0F 2E */ { GRPSSE(0f2e) }, + /* 0F 2F */ { GRPSSE(0f2f) }, + /* 0F 30 */ { 0, &Ia_wrmsr }, + /* 0F 31 */ { 0, &Ia_rdtsc }, + /* 0F 32 */ { 0, &Ia_rdmsr }, + /* 0F 33 */ { 0, &Ia_rdpmc }, + /* 0F 34 */ { 0, &Ia_sysenter }, + /* 0F 35 */ { 0, &Ia_sysexit }, + /* 0F 36 */ { 0, &Ia_Invalid }, + /* 0F 37 */ { 0, &Ia_Invalid }, + /* 0F 38 */ { GR3BTAB(A4) }, + /* 0F 39 */ { 0, &Ia_Invalid }, + /* 0F 3A */ { GR3BTAB(A5) }, + /* 0F 3B */ { 0, &Ia_Invalid }, + /* 0F 3C */ { 0, &Ia_Invalid }, + /* 0F 3D */ { 0, &Ia_Invalid }, + /* 0F 3E */ { 0, &Ia_Invalid }, + /* 0F 3F */ { 0, &Ia_Invalid }, + /* 0F 40 */ { 0, &Ia_cmovow_Gw_Ew }, + /* 0F 41 */ { 0, &Ia_cmovnow_Gw_Ew }, + /* 0F 42 */ { 0, &Ia_cmovcw_Gw_Ew }, + /* 0F 43 */ { 0, &Ia_cmovncw_Gw_Ew }, + /* 0F 44 */ { 0, &Ia_cmovzw_Gw_Ew }, + /* 0F 45 */ { 0, &Ia_cmovnzw_Gw_Ew }, + /* 0F 46 */ { 0, &Ia_cmovnaw_Gw_Ew }, + /* 0F 47 */ { 0, &Ia_cmovaw_Gw_Ew }, + /* 0F 48 */ { 0, &Ia_cmovsw_Gw_Ew }, + /* 0F 49 */ { 0, &Ia_cmovnsw_Gw_Ew }, + /* 0F 4A */ { 0, &Ia_cmovpw_Gw_Ew }, + /* 0F 4B */ { 0, &Ia_cmovnpw_Gw_Ew }, + /* 0F 4C */ { 0, &Ia_cmovlw_Gw_Ew }, + /* 0F 4D */ { 0, &Ia_cmovnlw_Gw_Ew }, + /* 0F 4E */ { 0, &Ia_cmovngw_Gw_Ew }, + /* 0F 4F */ { 0, &Ia_cmovgw_Gw_Ew }, + /* 0F 50 */ { GRPSSE(0f50) }, + /* 0F 51 */ { GRPSSE(0f51) }, + /* 0F 52 */ { GRPSSE(0f52) }, + /* 0F 53 */ { GRPSSE(0f53) }, + /* 0F 54 */ { GRPSSE(0f54) }, + /* 0F 55 */ { GRPSSE(0f55) }, + /* 0F 56 */ { GRPSSE(0f56) }, + /* 0F 57 */ { GRPSSE(0f57) }, + /* 0F 58 */ { GRPSSE(0f58) }, + /* 0F 59 */ { GRPSSE(0f59) }, + /* 0F 5A */ { GRPSSE(0f5a) }, + /* 0F 5B */ { GRPSSE(0f5b) }, + /* 0F 5C */ { GRPSSE(0f5c) }, + /* 0F 5D */ { GRPSSE(0f5d) }, + /* 0F 5E */ { GRPSSE(0f5e) }, + /* 0F 5F */ { GRPSSE(0f5f) }, + /* 0F 60 */ { GRPSSE(0f60) }, + /* 0F 61 */ { GRPSSE(0f61) }, + /* 0F 62 */ { GRPSSE(0f62) }, + /* 0F 63 */ { GRPSSE(0f63) }, + /* 0F 64 */ { GRPSSE(0f64) }, + /* 0F 65 */ { GRPSSE(0f65) }, + /* 0F 66 */ { GRPSSE(0f66) }, + /* 0F 67 */ { GRPSSE(0f67) }, + /* 0F 68 */ { GRPSSE(0f68) }, + /* 0F 69 */ { GRPSSE(0f69) }, + /* 0F 6A */ { GRPSSE(0f6a) }, + /* 0F 6B */ { GRPSSE(0f6b) }, + /* 0F 6C */ { GRPSSE(0f6c) }, + /* 0F 6D */ { GRPSSE(0f6d) }, + /* 0F 6E */ { GRPSSE(0f6e) }, + /* 0F 6F */ { GRPSSE(0f6f) }, + /* 0F 70 */ { GRPSSE(0f70) }, + /* 0F 71 */ { GRPN(G12) }, + /* 0F 72 */ { GRPN(G13) }, + /* 0F 73 */ { GRPN(G14) }, + /* 0F 74 */ { GRPSSE(0f74) }, + /* 0F 75 */ { GRPSSE(0f75) }, + /* 0F 76 */ { GRPSSE(0f76) }, + /* 0F 77 */ { 0, &Ia_emms }, + /* 0F 78 */ { 0, &Ia_Invalid }, + /* 0F 79 */ { 0, &Ia_Invalid }, + /* 0F 7A */ { 0, &Ia_Invalid }, + /* 0F 7B */ { 0, &Ia_Invalid }, + /* 0F 7C */ { GRPSSE(0f7c) }, + /* 0F 7D */ { GRPSSE(0f7d) }, + /* 0F 7E */ { GRPSSE(0f7e) }, + /* 0F 7F */ { GRPSSE(0f7f) }, + /* 0F 80 */ { 0, &Ia_jo_Jd }, + /* 0F 81 */ { 0, &Ia_jno_Jd }, + /* 0F 82 */ { 0, &Ia_jb_Jd }, + /* 0F 83 */ { 0, &Ia_jnb_Jd }, + /* 0F 84 */ { 0, &Ia_jz_Jd }, + /* 0F 85 */ { 0, &Ia_jnz_Jd }, + /* 0F 86 */ { 0, &Ia_jbe_Jd }, + /* 0F 87 */ { 0, &Ia_jnbe_Jd }, + /* 0F 88 */ { 0, &Ia_js_Jd }, + /* 0F 89 */ { 0, &Ia_jns_Jd }, + /* 0F 8A */ { 0, &Ia_jp_Jd }, + /* 0F 8B */ { 0, &Ia_jnp_Jd }, + /* 0F 8C */ { 0, &Ia_jl_Jd }, + /* 0F 8D */ { 0, &Ia_jnl_Jd }, + /* 0F 8E */ { 0, &Ia_jle_Jd }, + /* 0F 8F */ { 0, &Ia_jnle_Jd }, + /* 0F 90 */ { 0, &Ia_seto_Eb }, + /* 0F 91 */ { 0, &Ia_setno_Eb }, + /* 0F 92 */ { 0, &Ia_setb_Eb }, + /* 0F 93 */ { 0, &Ia_setnb_Eb }, + /* 0F 94 */ { 0, &Ia_setz_Eb }, + /* 0F 95 */ { 0, &Ia_setnz_Eb }, + /* 0F 96 */ { 0, &Ia_setbe_Eb }, + /* 0F 97 */ { 0, &Ia_setnbe_Eb }, + /* 0F 98 */ { 0, &Ia_sets_Eb }, + /* 0F 99 */ { 0, &Ia_setns_Eb }, + /* 0F 9A */ { 0, &Ia_setp_Eb }, + /* 0F 9B */ { 0, &Ia_setnp_Eb }, + /* 0F 9C */ { 0, &Ia_setl_Eb }, + /* 0F 9D */ { 0, &Ia_setnl_Eb }, + /* 0F 9E */ { 0, &Ia_setle_Eb }, + /* 0F 9F */ { 0, &Ia_setnle_Eb }, + /* 0F A0 */ { 0, &Ia_pushw_FS }, + /* 0F A1 */ { 0, &Ia_popw_FS }, + /* 0F A2 */ { 0, &Ia_cpuid }, + /* 0F A3 */ { 0, &Ia_btw_Ew_Gw }, + /* 0F A4 */ { 0, &Ia_shldw_Ew_Gw_Ib }, + /* 0F A5 */ { 0, &Ia_shldw_Ew_Gw_CL }, + /* 0F A6 */ { 0, &Ia_Invalid }, + /* 0F A7 */ { 0, &Ia_Invalid }, + /* 0F A8 */ { 0, &Ia_pushw_GS }, + /* 0F A9 */ { 0, &Ia_popw_GS }, + /* 0F AA */ { 0, &Ia_rsm }, + /* 0F AB */ { 0, &Ia_btsw_Ew_Gw }, + /* 0F AC */ { 0, &Ia_shrdw_Ew_Gw_Ib }, + /* 0F AD */ { 0, &Ia_shrdw_Ew_Gw_CL }, + /* 0F AE */ { GRPN(G15) }, + /* 0F AF */ { 0, &Ia_imulw_Gw_Ew }, + /* 0F B0 */ { 0, &Ia_cmpxchgb_Eb_Gb }, + /* 0F B1 */ { 0, &Ia_cmpxchgw_Ew_Gw }, + /* 0F B2 */ { 0, &Ia_lssw_Gw_Mp }, + /* 0F B3 */ { 0, &Ia_btrw_Ew_Gw }, + /* 0F B4 */ { 0, &Ia_lfsw_Gw_Mp }, + /* 0F B5 */ { 0, &Ia_lgsw_Gw_Mp }, + /* 0F B6 */ { 0, &Ia_movzbw_Gw_Eb }, + /* 0F B7 */ { 0, &Ia_movw_Gw_Ew }, + /* 0F B8 */ { 0, &Ia_Invalid }, + /* 0F B9 */ { 0, &Ia_ud2b }, + /* 0F BA */ { GRPN(G8EwIb) }, + /* 0F BB */ { 0, &Ia_btcw_Ew_Gw }, + /* 0F BC */ { 0, &Ia_bsfw_Gw_Ew }, + /* 0F BD */ { 0, &Ia_bsrw_Gw_Ew }, + /* 0F BE */ { 0, &Ia_movsbw_Gw_Eb }, + /* 0F BF */ { 0, &Ia_movw_Gw_Ew }, + /* 0F C0 */ { 0, &Ia_xaddb_Eb_Gb }, + /* 0F C0 */ { 0, &Ia_xaddw_Ew_Gw }, + /* 0F C2 */ { GRPSSE(0fc2) }, + /* 0F C3 */ { GRPSSE(0fc3) }, + /* 0F C4 */ { GRPSSE(0fc4) }, + /* 0F C5 */ { GRPSSE(0fc5) }, + /* 0F C6 */ { GRPSSE(0fc6) }, + /* 0F C7 */ { GRPN(G9) }, + /* 0F C8 */ { 0, &Ia_bswapl_ERX }, + /* 0F C9 */ { 0, &Ia_bswapl_ERX }, + /* 0F CA */ { 0, &Ia_bswapl_ERX }, + /* 0F CB */ { 0, &Ia_bswapl_ERX }, + /* 0F CC */ { 0, &Ia_bswapl_ERX }, + /* 0F CD */ { 0, &Ia_bswapl_ERX }, + /* 0F CE */ { 0, &Ia_bswapl_ERX }, + /* 0F CF */ { 0, &Ia_bswapl_ERX }, + /* 0F D0 */ { GRPSSE(0fd0) }, + /* 0F D1 */ { GRPSSE(0fd1) }, + /* 0F D2 */ { GRPSSE(0fd2) }, + /* 0F D3 */ { GRPSSE(0fd3) }, + /* 0F D4 */ { GRPSSE(0fd4) }, + /* 0F D5 */ { GRPSSE(0fd5) }, + /* 0F D6 */ { GRPSSE(0fd6) }, + /* 0F D7 */ { GRPSSE(0fd7) }, + /* 0F D8 */ { GRPSSE(0fd8) }, + /* 0F D9 */ { GRPSSE(0fd9) }, + /* 0F DA */ { GRPSSE(0fda) }, + /* 0F DB */ { GRPSSE(0fdb) }, + /* 0F DC */ { GRPSSE(0fdc) }, + /* 0F DD */ { GRPSSE(0fdd) }, + /* 0F DE */ { GRPSSE(0fde) }, + /* 0F DF */ { GRPSSE(0fdf) }, + /* 0F E0 */ { GRPSSE(0fe0) }, + /* 0F E1 */ { GRPSSE(0fe1) }, + /* 0F E2 */ { GRPSSE(0fe2) }, + /* 0F E3 */ { GRPSSE(0fe3) }, + /* 0F E4 */ { GRPSSE(0fe4) }, + /* 0F E5 */ { GRPSSE(0fe5) }, + /* 0F E6 */ { GRPSSE(0fe6) }, + /* 0F E7 */ { GRPSSE(0fe7) }, + /* 0F E8 */ { GRPSSE(0fe8) }, + /* 0F E9 */ { GRPSSE(0fe9) }, + /* 0F EA */ { GRPSSE(0fea) }, + /* 0F EB */ { GRPSSE(0feb) }, + /* 0F EC */ { GRPSSE(0fec) }, + /* 0F ED */ { GRPSSE(0fed) }, + /* 0F EE */ { GRPSSE(0fee) }, + /* 0F EF */ { GRPSSE(0fef) }, + /* 0F F0 */ { GRPSSE(0ff0) }, + /* 0F F1 */ { GRPSSE(0ff1) }, + /* 0F F2 */ { GRPSSE(0ff2) }, + /* 0F F3 */ { GRPSSE(0ff3) }, + /* 0F F4 */ { GRPSSE(0ff4) }, + /* 0F F5 */ { GRPSSE(0ff5) }, + /* 0F F6 */ { GRPSSE(0ff6) }, + /* 0F F7 */ { GRPSSE(0ff7) }, + /* 0F F8 */ { GRPSSE(0ff8) }, + /* 0F F9 */ { GRPSSE(0ff9) }, + /* 0F FA */ { GRPSSE(0ffa) }, + /* 0F FB */ { GRPSSE(0ffb) }, + /* 0F FC */ { GRPSSE(0ffc) }, + /* 0F FD */ { GRPSSE(0ffd) }, + /* 0F FE */ { GRPSSE(0ffe) }, + /* 0F FF */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmOpcodes64d[256*2] = { + // 256 entries for single byte opcodes + /* 00 */ { 0, &Ia_addb_Eb_Gb }, + /* 01 */ { 0, &Ia_addl_Ed_Gd }, + /* 02 */ { 0, &Ia_addb_Gb_Eb }, + /* 03 */ { 0, &Ia_addl_Gd_Ed }, + /* 04 */ { 0, &Ia_addb_AL_Ib, }, + /* 05 */ { 0, &Ia_addl_EAX_Id, }, + /* 06 */ { 0, &Ia_Invalid }, + /* 07 */ { 0, &Ia_Invalid }, + /* 08 */ { 0, &Ia_orb_Eb_Gb }, + /* 09 */ { 0, &Ia_orl_Ed_Gd }, + /* 0A */ { 0, &Ia_orb_Gb_Eb }, + /* 0B */ { 0, &Ia_orl_Gd_Ed }, + /* 0C */ { 0, &Ia_orb_AL_Ib }, + /* 0D */ { 0, &Ia_orl_EAX_Id }, + /* 0E */ { 0, &Ia_Invalid }, + /* 0F */ { 0, &Ia_error }, // 2 byte escape + /* 10 */ { 0, &Ia_adcb_Eb_Gb }, + /* 11 */ { 0, &Ia_adcl_Ed_Gd }, + /* 12 */ { 0, &Ia_adcb_Gb_Eb }, + /* 13 */ { 0, &Ia_adcl_Gd_Ed }, + /* 14 */ { 0, &Ia_adcb_AL_Ib }, + /* 15 */ { 0, &Ia_adcl_EAX_Id }, + /* 16 */ { 0, &Ia_Invalid }, + /* 17 */ { 0, &Ia_Invalid }, + /* 18 */ { 0, &Ia_sbbb_Eb_Gb }, + /* 19 */ { 0, &Ia_sbbl_Ed_Gd }, + /* 1A */ { 0, &Ia_sbbb_Gb_Eb }, + /* 1B */ { 0, &Ia_sbbl_Gd_Ed }, + /* 1C */ { 0, &Ia_sbbb_AL_Ib }, + /* 1D */ { 0, &Ia_sbbl_EAX_Id }, + /* 1E */ { 0, &Ia_Invalid }, + /* 1F */ { 0, &Ia_Invalid }, + /* 20 */ { 0, &Ia_andb_Eb_Gb }, + /* 21 */ { 0, &Ia_andl_Ed_Gd }, + /* 22 */ { 0, &Ia_andb_Gb_Eb }, + /* 23 */ { 0, &Ia_andl_Gd_Ed }, + /* 24 */ { 0, &Ia_andb_AL_Ib }, + /* 25 */ { 0, &Ia_andl_EAX_Id }, + /* 26 */ { 0, &Ia_prefix_es }, // ES: + /* 27 */ { 0, &Ia_Invalid }, + /* 28 */ { 0, &Ia_subb_Eb_Gb }, + /* 29 */ { 0, &Ia_subl_Ed_Gd }, + /* 2A */ { 0, &Ia_subb_Gb_Eb }, + /* 2B */ { 0, &Ia_subl_Gd_Ed }, + /* 2C */ { 0, &Ia_subb_AL_Ib }, + /* 2D */ { 0, &Ia_subl_EAX_Id }, + /* 2E */ { 0, &Ia_prefix_cs }, // CS: + /* 2F */ { 0, &Ia_Invalid }, + /* 30 */ { 0, &Ia_xorb_Eb_Gb }, + /* 31 */ { 0, &Ia_xorl_Ed_Gd }, + /* 32 */ { 0, &Ia_xorb_Gb_Eb }, + /* 33 */ { 0, &Ia_xorl_Gd_Ed }, + /* 34 */ { 0, &Ia_xorb_AL_Ib }, + /* 35 */ { 0, &Ia_xorl_EAX_Id }, + /* 36 */ { 0, &Ia_prefix_ss }, // SS: + /* 37 */ { 0, &Ia_Invalid }, + /* 38 */ { 0, &Ia_cmpb_Eb_Gb }, + /* 39 */ { 0, &Ia_cmpl_Ed_Gd }, + /* 3A */ { 0, &Ia_cmpb_Gb_Eb }, + /* 3B */ { 0, &Ia_cmpl_Gd_Ed }, + /* 3C */ { 0, &Ia_cmpb_AL_Ib }, + /* 3D */ { 0, &Ia_cmpl_EAX_Id }, + /* 3E */ { 0, &Ia_prefix_ds }, // DS: + /* 3F */ { 0, &Ia_Invalid }, + /* 40 */ { 0, &Ia_prefix_rex }, // REX: + /* 41 */ { 0, &Ia_prefix_rex }, // REX: + /* 42 */ { 0, &Ia_prefix_rex }, // REX: + /* 43 */ { 0, &Ia_prefix_rex }, // REX: + /* 44 */ { 0, &Ia_prefix_rex }, // REX: + /* 45 */ { 0, &Ia_prefix_rex }, // REX: + /* 46 */ { 0, &Ia_prefix_rex }, // REX: + /* 47 */ { 0, &Ia_prefix_rex }, // REX: + /* 48 */ { 0, &Ia_prefix_rex }, // REX: + /* 49 */ { 0, &Ia_prefix_rex }, // REX: + /* 4A */ { 0, &Ia_prefix_rex }, // REX: + /* 4B */ { 0, &Ia_prefix_rex }, // REX: + /* 4C */ { 0, &Ia_prefix_rex }, // REX: + /* 4D */ { 0, &Ia_prefix_rex }, // REX: + /* 4E */ { 0, &Ia_prefix_rex }, // REX: + /* 4F */ { 0, &Ia_prefix_rex }, // REX: + /* 50 */ { 0, &Ia_pushq_RRX }, + /* 51 */ { 0, &Ia_pushq_RRX }, + /* 52 */ { 0, &Ia_pushq_RRX }, + /* 53 */ { 0, &Ia_pushq_RRX }, + /* 54 */ { 0, &Ia_pushq_RRX }, + /* 55 */ { 0, &Ia_pushq_RRX }, + /* 56 */ { 0, &Ia_pushq_RRX }, + /* 57 */ { 0, &Ia_pushq_RRX }, + /* 58 */ { 0, &Ia_popq_RRX }, + /* 59 */ { 0, &Ia_popq_RRX }, + /* 5A */ { 0, &Ia_popq_RRX }, + /* 5B */ { 0, &Ia_popq_RRX }, + /* 5C */ { 0, &Ia_popq_RRX }, + /* 5D */ { 0, &Ia_popq_RRX }, + /* 5E */ { 0, &Ia_popq_RRX }, + /* 5F */ { 0, &Ia_popq_RRX }, + /* 60 */ { 0, &Ia_Invalid }, + /* 61 */ { 0, &Ia_Invalid }, + /* 62 */ { 0, &Ia_Invalid }, + /* 63 */ { 0, &Ia_movl_Gd_Ed }, + /* 64 */ { 0, &Ia_prefix_fs }, // FS: + /* 65 */ { 0, &Ia_prefix_gs }, // GS: + /* 66 */ { 0, &Ia_prefix_osize }, // OSIZE: + /* 67 */ { 0, &Ia_prefix_asize }, // ASIZE: + /* 68 */ { 0, &Ia_pushq_sId }, + /* 69 */ { 0, &Ia_imull_Gd_Ed_Id }, + /* 6A */ { 0, &Ia_pushq_sIb }, + /* 6B */ { 0, &Ia_imull_Gd_Ed_sIb }, + /* 6C */ { 0, &Ia_insb_Yb_DX }, + /* 6D */ { 0, &Ia_insl_Yd_DX }, + /* 6E */ { 0, &Ia_outsb_DX_Xb }, + /* 6F */ { 0, &Ia_outsl_DX_Xd }, + /* 70 */ { 0, &Ia_jo_Jb }, + /* 71 */ { 0, &Ia_jno_Jb }, + /* 72 */ { 0, &Ia_jb_Jb }, + /* 73 */ { 0, &Ia_jnb_Jb }, + /* 74 */ { 0, &Ia_jz_Jb }, + /* 75 */ { 0, &Ia_jnz_Jb }, + /* 76 */ { 0, &Ia_jbe_Jb }, + /* 77 */ { 0, &Ia_jnbe_Jb }, + /* 78 */ { 0, &Ia_js_Jb }, + /* 79 */ { 0, &Ia_jns_Jb }, + /* 7A */ { 0, &Ia_jp_Jb }, + /* 7B */ { 0, &Ia_jnp_Jb }, + /* 7C */ { 0, &Ia_jl_Jb }, + /* 7D */ { 0, &Ia_jnl_Jb }, + /* 7E */ { 0, &Ia_jle_Jb }, + /* 7F */ { 0, &Ia_jnle_Jb }, + /* 80 */ { GRPN(G1EbIb) }, + /* 81 */ { GRPN(G1EdId) }, + /* 82 */ { 0, &Ia_Invalid }, + /* 83 */ { GRPN(G1EdIb) }, + /* 84 */ { 0, &Ia_testb_Eb_Gb }, + /* 85 */ { 0, &Ia_testl_Ed_Gd }, + /* 86 */ { 0, &Ia_xchgb_Eb_Gb }, + /* 87 */ { 0, &Ia_xchgl_Ed_Gd }, + /* 88 */ { 0, &Ia_movb_Eb_Gb }, + /* 89 */ { 0, &Ia_movl_Ed_Gd }, + /* 8A */ { 0, &Ia_movb_Gb_Eb }, + /* 8B */ { 0, &Ia_movl_Gd_Ed }, + /* 8C */ { 0, &Ia_movw_Ew_Sw }, + /* 8D */ { 0, &Ia_leal_Gd_Md }, + /* 8E */ { 0, &Ia_movw_Sw_Ew }, + /* 8F */ { 0, &Ia_popq_Eq }, + /* 90 */ { 0, &Ia_xchgl_ERX_EAX }, // handle XCHG R8d, EAX + /* 91 */ { 0, &Ia_xchgl_ERX_EAX }, + /* 92 */ { 0, &Ia_xchgl_ERX_EAX }, + /* 93 */ { 0, &Ia_xchgl_ERX_EAX }, + /* 94 */ { 0, &Ia_xchgl_ERX_EAX }, + /* 95 */ { 0, &Ia_xchgl_ERX_EAX }, + /* 96 */ { 0, &Ia_xchgl_ERX_EAX }, + /* 97 */ { 0, &Ia_xchgl_ERX_EAX }, + /* 98 */ { 0, &Ia_cwde }, + /* 99 */ { 0, &Ia_cdq }, + /* 9A */ { 0, &Ia_Invalid }, + /* 9B */ { 0, &Ia_fwait }, + /* 9C */ { 0, &Ia_pushfq }, + /* 9D */ { 0, &Ia_popfq }, + /* 9E */ { 0, &Ia_sahf }, + /* 9F */ { 0, &Ia_lahf }, + /* A0 */ { 0, &Ia_movb_AL_Ob }, + /* A1 */ { 0, &Ia_movl_EAX_Od }, + /* A0 */ { 0, &Ia_movb_Ob_AL }, + /* A1 */ { 0, &Ia_movl_Od_EAX }, + /* A4 */ { 0, &Ia_movsb_Yb_Xb }, + /* A5 */ { 0, &Ia_movsl_Yd_Xd }, + /* A6 */ { 0, &Ia_cmpsb_Yb_Xb }, + /* A7 */ { 0, &Ia_cmpsl_Yd_Xd }, + /* A8 */ { 0, &Ia_testb_AL_Ib }, + /* A9 */ { 0, &Ia_testl_EAX_Id }, + /* AA */ { 0, &Ia_stosb_Yb_AL }, + /* AB */ { 0, &Ia_stosl_Yd_EAX }, + /* AC */ { 0, &Ia_lodsb_AL_Xb }, + /* AD */ { 0, &Ia_lodsl_EAX_Xd }, + /* AE */ { 0, &Ia_scasb_Yb_AL }, + /* AF */ { 0, &Ia_scasl_Yd_EAX }, + /* B0 */ { 0, &Ia_movb_R8_Ib }, + /* B1 */ { 0, &Ia_movb_R8_Ib }, + /* B2 */ { 0, &Ia_movb_R8_Ib }, + /* B3 */ { 0, &Ia_movb_R8_Ib }, + /* B4 */ { 0, &Ia_movb_R8_Ib }, + /* B5 */ { 0, &Ia_movb_R8_Ib }, + /* B6 */ { 0, &Ia_movb_R8_Ib }, + /* B7 */ { 0, &Ia_movb_R8_Ib }, + /* B8 */ { 0, &Ia_movl_ERX_Id }, + /* B9 */ { 0, &Ia_movl_ERX_Id }, + /* BA */ { 0, &Ia_movl_ERX_Id }, + /* BB */ { 0, &Ia_movl_ERX_Id }, + /* BC */ { 0, &Ia_movl_ERX_Id }, + /* BD */ { 0, &Ia_movl_ERX_Id }, + /* BE */ { 0, &Ia_movl_ERX_Id }, + /* BF */ { 0, &Ia_movl_ERX_Id }, + /* C0 */ { GRPN(G2Eb) }, + /* C1 */ { GRPN(G2Ed) }, + /* C2 */ { 0, &Ia_ret_Iw }, + /* C3 */ { 0, &Ia_ret }, + /* C4 */ { 0, &Ia_Invalid }, + /* C5 */ { 0, &Ia_Invalid }, + /* C6 */ { 0, &Ia_movb_Eb_Ib }, + /* C7 */ { 0, &Ia_movl_Ed_Id }, + /* C8 */ { 0, &Ia_enter }, + /* C9 */ { 0, &Ia_leave }, + /* CA */ { 0, &Ia_lret_Iw }, + /* CB */ { 0, &Ia_lret }, + /* CC */ { 0, &Ia_int3 }, + /* CD */ { 0, &Ia_int_Ib }, + /* CE */ { 0, &Ia_Invalid }, + /* CF */ { 0, &Ia_iretl }, + /* D0 */ { GRPN(G2EbI1) }, + /* D1 */ { GRPN(G2EdI1) }, + /* D2 */ { GRPN(G2EbCL) }, + /* D3 */ { GRPN(G2EdCL) }, + /* D4 */ { 0, &Ia_Invalid }, + /* D5 */ { 0, &Ia_Invalid }, + /* D6 */ { 0, &Ia_Invalid }, + /* D7 */ { 0, &Ia_xlat }, + /* D8 */ { GRPFP(D8) }, + /* D9 */ { GRPFP(D9) }, + /* DA */ { GRPFP(DA) }, + /* DB */ { GRPFP(DB) }, + /* DC */ { GRPFP(DC) }, + /* DD */ { GRPFP(DD) }, + /* DE */ { GRPFP(DE) }, + /* DF */ { GRPFP(DF) }, + /* E0 */ { 0, &Ia_loopne_Jb }, + /* E1 */ { 0, &Ia_loope_Jb }, + /* E2 */ { 0, &Ia_loop_Jb }, + /* E3 */ { 0, &Ia_jrcxz_Jb }, + /* E4 */ { 0, &Ia_inb_AL_Ib }, + /* E5 */ { 0, &Ia_inl_EAX_Ib }, + /* E6 */ { 0, &Ia_outb_Ib_AL }, + /* E7 */ { 0, &Ia_outl_Ib_EAX }, + /* E8 */ { 0, &Ia_call_Jd }, + /* E9 */ { 0, &Ia_jmp_Jd }, + /* EA */ { 0, &Ia_Invalid }, + /* EB */ { 0, &Ia_jmp_Jb }, + /* EC */ { 0, &Ia_inb_AL_DX }, + /* ED */ { 0, &Ia_inl_EAX_DX }, + /* EE */ { 0, &Ia_outb_DX_AL }, + /* EF */ { 0, &Ia_outl_DX_EAX }, + /* F0 */ { 0, &Ia_prefix_lock }, // LOCK: + /* F1 */ { 0, &Ia_int1 }, + /* F2 */ { 0, &Ia_prefix_repne }, // REPNE: + /* F3 */ { 0, &Ia_prefix_rep }, // REP: + /* F4 */ { 0, &Ia_hlt }, + /* F5 */ { 0, &Ia_cmc }, + /* F6 */ { GRPN(G3Eb) }, + /* F7 */ { GRPN(G3Ed) }, + /* F8 */ { 0, &Ia_clc }, + /* F9 */ { 0, &Ia_stc }, + /* FA */ { 0, &Ia_cli }, + /* FB */ { 0, &Ia_sti }, + /* FC */ { 0, &Ia_cld }, + /* FD */ { 0, &Ia_std }, + /* FE */ { GRPN(G4) }, + /* FF */ { GRPN(64G5d) }, + + // 256 entries for two byte opcodes + /* 0F 00 */ { GRPN(G6) }, + /* 0F 01 */ { GRPN(G7) }, + /* 0F 02 */ { 0, &Ia_larl_Gd_Ew }, + /* 0F 03 */ { 0, &Ia_lsll_Gd_Ew }, + /* 0F 04 */ { 0, &Ia_Invalid }, + /* 0F 05 */ { 0, &Ia_syscall }, + /* 0F 06 */ { 0, &Ia_clts }, + /* 0F 07 */ { 0, &Ia_sysret }, + /* 0F 08 */ { 0, &Ia_invd }, + /* 0F 09 */ { 0, &Ia_wbinvd }, + /* 0F 0A */ { 0, &Ia_Invalid }, + /* 0F 0B */ { 0, &Ia_ud2a }, + /* 0F 0C */ { 0, &Ia_Invalid }, + /* 0F 0D */ { 0, &Ia_prefetch }, // 3DNow! + /* 0F 0E */ { 0, &Ia_femms }, // 3DNow! + /* 0F 0F */ { GRP3DNOW }, + /* 0F 10 */ { GRPSSE(0f10) }, + /* 0F 11 */ { GRPSSE(0f11) }, + /* 0F 12 */ { GRPSSE(0f12) }, + /* 0F 13 */ { GRPSSE(0f13) }, + /* 0F 14 */ { GRPSSE(0f14) }, + /* 0F 15 */ { GRPSSE(0f15) }, + /* 0F 16 */ { GRPSSE(0f16) }, + /* 0F 17 */ { GRPSSE(0f17) }, + /* 0F 18 */ { GRPN(G16) }, + /* 0F 19 */ { 0, &Ia_Invalid }, + /* 0F 1A */ { 0, &Ia_Invalid }, + /* 0F 1B */ { 0, &Ia_Invalid }, + /* 0F 1C */ { 0, &Ia_Invalid }, + /* 0F 1D */ { 0, &Ia_Invalid }, + /* 0F 1E */ { 0, &Ia_Invalid }, + /* 0F 1F */ { 0, &Ia_multibyte_nop }, + /* 0F 20 */ { 0, &Ia_movq_Rq_Cq }, + /* 0F 21 */ { 0, &Ia_movq_Rq_Dq }, + /* 0F 22 */ { 0, &Ia_movq_Cq_Rq }, + /* 0F 23 */ { 0, &Ia_movq_Dq_Rq }, + /* 0F 24 */ { 0, &Ia_Invalid }, + /* 0F 25 */ { 0, &Ia_Invalid }, + /* 0F 26 */ { 0, &Ia_Invalid }, + /* 0F 27 */ { 0, &Ia_Invalid }, + /* 0F 28 */ { GRPSSE(0f28) }, + /* 0F 29 */ { GRPSSE(0f29) }, + /* 0F 2A */ { GRPSSE(0f2a) }, + /* 0F 2B */ { GRPSSE(0f2b) }, + /* 0F 2C */ { GRPSSE(0f2c) }, + /* 0F 2D */ { GRPSSE(0f2d) }, + /* 0F 2E */ { GRPSSE(0f2e) }, + /* 0F 2F */ { GRPSSE(0f2f) }, + /* 0F 30 */ { 0, &Ia_wrmsr }, + /* 0F 31 */ { 0, &Ia_rdtsc }, + /* 0F 32 */ { 0, &Ia_rdmsr }, + /* 0F 33 */ { 0, &Ia_rdpmc }, + /* 0F 34 */ { 0, &Ia_sysenter }, + /* 0F 35 */ { 0, &Ia_sysexit }, + /* 0F 36 */ { 0, &Ia_Invalid }, + /* 0F 37 */ { 0, &Ia_Invalid }, + /* 0F 38 */ { GR3BTAB(A4) }, + /* 0F 39 */ { 0, &Ia_Invalid }, + /* 0F 3A */ { GR3BTAB(A5) }, + /* 0F 3B */ { 0, &Ia_Invalid }, + /* 0F 3C */ { 0, &Ia_Invalid }, + /* 0F 3D */ { 0, &Ia_Invalid }, + /* 0F 3E */ { 0, &Ia_Invalid }, + /* 0F 3F */ { 0, &Ia_Invalid }, + /* 0F 40 */ { 0, &Ia_cmovol_Gd_Ed }, + /* 0F 41 */ { 0, &Ia_cmovnol_Gd_Ed }, + /* 0F 42 */ { 0, &Ia_cmovcl_Gd_Ed }, + /* 0F 43 */ { 0, &Ia_cmovncl_Gd_Ed }, + /* 0F 44 */ { 0, &Ia_cmovzl_Gd_Ed }, + /* 0F 45 */ { 0, &Ia_cmovnzl_Gd_Ed }, + /* 0F 46 */ { 0, &Ia_cmovnal_Gd_Ed }, + /* 0F 47 */ { 0, &Ia_cmoval_Gd_Ed }, + /* 0F 48 */ { 0, &Ia_cmovsl_Gd_Ed }, + /* 0F 49 */ { 0, &Ia_cmovnsl_Gd_Ed }, + /* 0F 4A */ { 0, &Ia_cmovpl_Gd_Ed }, + /* 0F 4B */ { 0, &Ia_cmovnpl_Gd_Ed }, + /* 0F 4C */ { 0, &Ia_cmovll_Gd_Ed }, + /* 0F 4D */ { 0, &Ia_cmovnll_Gd_Ed }, + /* 0F 4E */ { 0, &Ia_cmovngl_Gd_Ed }, + /* 0F 4F */ { 0, &Ia_cmovgl_Gd_Ed }, + /* 0F 50 */ { GRPSSE(0f50) }, + /* 0F 51 */ { GRPSSE(0f51) }, + /* 0F 52 */ { GRPSSE(0f52) }, + /* 0F 53 */ { GRPSSE(0f53) }, + /* 0F 54 */ { GRPSSE(0f54) }, + /* 0F 55 */ { GRPSSE(0f55) }, + /* 0F 56 */ { GRPSSE(0f56) }, + /* 0F 57 */ { GRPSSE(0f57) }, + /* 0F 58 */ { GRPSSE(0f58) }, + /* 0F 59 */ { GRPSSE(0f59) }, + /* 0F 5A */ { GRPSSE(0f5a) }, + /* 0F 5B */ { GRPSSE(0f5b) }, + /* 0F 5C */ { GRPSSE(0f5c) }, + /* 0F 5D */ { GRPSSE(0f5d) }, + /* 0F 5E */ { GRPSSE(0f5e) }, + /* 0F 5F */ { GRPSSE(0f5f) }, + /* 0F 60 */ { GRPSSE(0f60) }, + /* 0F 61 */ { GRPSSE(0f61) }, + /* 0F 62 */ { GRPSSE(0f62) }, + /* 0F 63 */ { GRPSSE(0f63) }, + /* 0F 64 */ { GRPSSE(0f64) }, + /* 0F 65 */ { GRPSSE(0f65) }, + /* 0F 66 */ { GRPSSE(0f66) }, + /* 0F 67 */ { GRPSSE(0f67) }, + /* 0F 68 */ { GRPSSE(0f68) }, + /* 0F 69 */ { GRPSSE(0f69) }, + /* 0F 6A */ { GRPSSE(0f6a) }, + /* 0F 6B */ { GRPSSE(0f6b) }, + /* 0F 6C */ { GRPSSE(0f6c) }, + /* 0F 6D */ { GRPSSE(0f6d) }, + /* 0F 6E */ { GRPSSE(0f6e) }, + /* 0F 6F */ { GRPSSE(0f6f) }, + /* 0F 70 */ { GRPSSE(0f70) }, + /* 0F 71 */ { GRPN(G12) }, + /* 0F 72 */ { GRPN(G13) }, + /* 0F 73 */ { GRPN(G14) }, + /* 0F 74 */ { GRPSSE(0f74) }, + /* 0F 75 */ { GRPSSE(0f75) }, + /* 0F 76 */ { GRPSSE(0f76) }, + /* 0F 77 */ { 0, &Ia_emms }, + /* 0F 78 */ { 0, &Ia_Invalid }, + /* 0F 79 */ { 0, &Ia_Invalid }, + /* 0F 7A */ { 0, &Ia_Invalid }, + /* 0F 7B */ { 0, &Ia_Invalid }, + /* 0F 7C */ { GRPSSE(0f7c) }, + /* 0F 7D */ { GRPSSE(0f7d) }, + /* 0F 7E */ { GRPSSE(0f7e) }, + /* 0F 7F */ { GRPSSE(0f7f) }, + /* 0F 80 */ { 0, &Ia_jo_Jd }, + /* 0F 81 */ { 0, &Ia_jno_Jd }, + /* 0F 82 */ { 0, &Ia_jb_Jd }, + /* 0F 83 */ { 0, &Ia_jnb_Jd }, + /* 0F 84 */ { 0, &Ia_jz_Jd }, + /* 0F 85 */ { 0, &Ia_jnz_Jd }, + /* 0F 86 */ { 0, &Ia_jbe_Jd }, + /* 0F 87 */ { 0, &Ia_jnbe_Jd }, + /* 0F 88 */ { 0, &Ia_js_Jd }, + /* 0F 89 */ { 0, &Ia_jns_Jd }, + /* 0F 8A */ { 0, &Ia_jp_Jd }, + /* 0F 8B */ { 0, &Ia_jnp_Jd }, + /* 0F 8C */ { 0, &Ia_jl_Jd }, + /* 0F 8D */ { 0, &Ia_jnl_Jd }, + /* 0F 8E */ { 0, &Ia_jle_Jd }, + /* 0F 8F */ { 0, &Ia_jnle_Jd }, + /* 0F 90 */ { 0, &Ia_seto_Eb }, + /* 0F 91 */ { 0, &Ia_setno_Eb }, + /* 0F 92 */ { 0, &Ia_setb_Eb }, + /* 0F 93 */ { 0, &Ia_setnb_Eb }, + /* 0F 94 */ { 0, &Ia_setz_Eb }, + /* 0F 95 */ { 0, &Ia_setnz_Eb }, + /* 0F 96 */ { 0, &Ia_setbe_Eb }, + /* 0F 97 */ { 0, &Ia_setnbe_Eb }, + /* 0F 98 */ { 0, &Ia_sets_Eb }, + /* 0F 99 */ { 0, &Ia_setns_Eb }, + /* 0F 9A */ { 0, &Ia_setp_Eb }, + /* 0F 9B */ { 0, &Ia_setnp_Eb }, + /* 0F 9C */ { 0, &Ia_setl_Eb }, + /* 0F 9D */ { 0, &Ia_setnl_Eb }, + /* 0F 9E */ { 0, &Ia_setle_Eb }, + /* 0F 9F */ { 0, &Ia_setnle_Eb }, + /* 0F A0 */ { 0, &Ia_pushq_FS }, + /* 0F A1 */ { 0, &Ia_popq_FS }, + /* 0F A2 */ { 0, &Ia_cpuid }, + /* 0F A3 */ { 0, &Ia_btl_Ed_Gd }, + /* 0F A4 */ { 0, &Ia_shldl_Ed_Gd_Ib }, + /* 0F A5 */ { 0, &Ia_shldl_Ed_Gd_CL }, + /* 0F A6 */ { 0, &Ia_Invalid }, + /* 0F A7 */ { 0, &Ia_Invalid }, + /* 0F A8 */ { 0, &Ia_pushq_GS }, + /* 0F A9 */ { 0, &Ia_popq_GS }, + /* 0F AA */ { 0, &Ia_rsm }, + /* 0F AB */ { 0, &Ia_btsl_Ed_Gd }, + /* 0F AC */ { 0, &Ia_shrdl_Ed_Gd_Ib }, + /* 0F AD */ { 0, &Ia_shrdl_Ed_Gd_CL }, + /* 0F AE */ { GRPN(G15) }, + /* 0F AF */ { 0, &Ia_imull_Gd_Ed }, + /* 0F B0 */ { 0, &Ia_cmpxchgb_Eb_Gb }, + /* 0F B1 */ { 0, &Ia_cmpxchgl_Ed_Gd }, + /* 0F B2 */ { 0, &Ia_lssl_Gd_Mp }, + /* 0F B3 */ { 0, &Ia_btrl_Ed_Gd }, + /* 0F B4 */ { 0, &Ia_lfsl_Gd_Mp }, + /* 0F B5 */ { 0, &Ia_lgsl_Gd_Mp }, + /* 0F B6 */ { 0, &Ia_movzbl_Gd_Eb }, + /* 0F B7 */ { 0, &Ia_movzwl_Gd_Ew }, + /* 0F B8 */ { 0, &Ia_Invalid }, + /* 0F B9 */ { 0, &Ia_ud2b }, + /* 0F BA */ { GRPN(G8EdIb) }, + /* 0F BB */ { 0, &Ia_btcl_Ed_Gd }, + /* 0F BC */ { 0, &Ia_bsfl_Gd_Ed }, + /* 0F BD */ { 0, &Ia_bsrl_Gd_Ed }, + /* 0F BE */ { 0, &Ia_movsbl_Gd_Eb }, + /* 0F BF */ { 0, &Ia_movswl_Gd_Ew }, + /* 0F C0 */ { 0, &Ia_xaddb_Eb_Gb }, + /* 0F C0 */ { 0, &Ia_xaddl_Ed_Gd }, + /* 0F C2 */ { GRPSSE(0fc2) }, + /* 0F C3 */ { GRPSSE(0fc3) }, + /* 0F C4 */ { GRPSSE(0fc4) }, + /* 0F C5 */ { GRPSSE(0fc5) }, + /* 0F C6 */ { GRPSSE(0fc6) }, + /* 0F C7 */ { GRPN(G9) }, + /* 0F C8 */ { 0, &Ia_bswapl_ERX }, + /* 0F C9 */ { 0, &Ia_bswapl_ERX }, + /* 0F CA */ { 0, &Ia_bswapl_ERX }, + /* 0F CB */ { 0, &Ia_bswapl_ERX }, + /* 0F CC */ { 0, &Ia_bswapl_ERX }, + /* 0F CD */ { 0, &Ia_bswapl_ERX }, + /* 0F CE */ { 0, &Ia_bswapl_ERX }, + /* 0F CF */ { 0, &Ia_bswapl_ERX }, + /* 0F D0 */ { GRPSSE(0fd0) }, + /* 0F D1 */ { GRPSSE(0fd1) }, + /* 0F D2 */ { GRPSSE(0fd2) }, + /* 0F D3 */ { GRPSSE(0fd3) }, + /* 0F D4 */ { GRPSSE(0fd4) }, + /* 0F D5 */ { GRPSSE(0fd5) }, + /* 0F D6 */ { GRPSSE(0fd6) }, + /* 0F D7 */ { GRPSSE(0fd7) }, + /* 0F D8 */ { GRPSSE(0fd8) }, + /* 0F D9 */ { GRPSSE(0fd9) }, + /* 0F DA */ { GRPSSE(0fda) }, + /* 0F DB */ { GRPSSE(0fdb) }, + /* 0F DC */ { GRPSSE(0fdc) }, + /* 0F DD */ { GRPSSE(0fdd) }, + /* 0F DE */ { GRPSSE(0fde) }, + /* 0F DF */ { GRPSSE(0fdf) }, + /* 0F E0 */ { GRPSSE(0fe0) }, + /* 0F E1 */ { GRPSSE(0fe1) }, + /* 0F E2 */ { GRPSSE(0fe2) }, + /* 0F E3 */ { GRPSSE(0fe3) }, + /* 0F E4 */ { GRPSSE(0fe4) }, + /* 0F E5 */ { GRPSSE(0fe5) }, + /* 0F E6 */ { GRPSSE(0fe6) }, + /* 0F E7 */ { GRPSSE(0fe7) }, + /* 0F E8 */ { GRPSSE(0fe8) }, + /* 0F E9 */ { GRPSSE(0fe9) }, + /* 0F EA */ { GRPSSE(0fea) }, + /* 0F EB */ { GRPSSE(0feb) }, + /* 0F EC */ { GRPSSE(0fec) }, + /* 0F ED */ { GRPSSE(0fed) }, + /* 0F EE */ { GRPSSE(0fee) }, + /* 0F EF */ { GRPSSE(0fef) }, + /* 0F F0 */ { GRPSSE(0ff0) }, + /* 0F F1 */ { GRPSSE(0ff1) }, + /* 0F F2 */ { GRPSSE(0ff2) }, + /* 0F F3 */ { GRPSSE(0ff3) }, + /* 0F F4 */ { GRPSSE(0ff4) }, + /* 0F F5 */ { GRPSSE(0ff5) }, + /* 0F F6 */ { GRPSSE(0ff6) }, + /* 0F F7 */ { GRPSSE(0ff7) }, + /* 0F F8 */ { GRPSSE(0ff8) }, + /* 0F F9 */ { GRPSSE(0ff9) }, + /* 0F FA */ { GRPSSE(0ffa) }, + /* 0F FB */ { GRPSSE(0ffb) }, + /* 0F FC */ { GRPSSE(0ffc) }, + /* 0F FD */ { GRPSSE(0ffd) }, + /* 0F FE */ { GRPSSE(0ffe) }, + /* 0F FF */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmOpcodes64q[256*2] = { + // 256 entries for single byte opcodes + /* 00 */ { 0, &Ia_addb_Eb_Gb }, + /* 01 */ { 0, &Ia_addq_Eq_Gq }, + /* 02 */ { 0, &Ia_addb_Gb_Eb }, + /* 03 */ { 0, &Ia_addq_Gq_Eq }, + /* 04 */ { 0, &Ia_addb_AL_Ib, }, + /* 05 */ { 0, &Ia_addq_RAX_sId }, + /* 06 */ { 0, &Ia_Invalid }, + /* 07 */ { 0, &Ia_Invalid }, + /* 08 */ { 0, &Ia_orb_Eb_Gb }, + /* 09 */ { 0, &Ia_orq_Eq_Gq }, + /* 0A */ { 0, &Ia_orb_Gb_Eb }, + /* 0B */ { 0, &Ia_orq_Gq_Eq }, + /* 0C */ { 0, &Ia_orb_AL_Ib }, + /* 0D */ { 0, &Ia_orq_RAX_sId }, + /* 0E */ { 0, &Ia_Invalid }, + /* 0F */ { 0, &Ia_error }, // 2 byte escape + /* 10 */ { 0, &Ia_adcb_Eb_Gb }, + /* 11 */ { 0, &Ia_adcq_Eq_Gq }, + /* 12 */ { 0, &Ia_adcb_Gb_Eb }, + /* 13 */ { 0, &Ia_adcq_Gq_Eq }, + /* 14 */ { 0, &Ia_adcb_AL_Ib }, + /* 15 */ { 0, &Ia_adcq_RAX_sId }, + /* 16 */ { 0, &Ia_Invalid }, + /* 17 */ { 0, &Ia_Invalid }, + /* 18 */ { 0, &Ia_sbbb_Eb_Gb }, + /* 19 */ { 0, &Ia_sbbq_Eq_Gq }, + /* 1A */ { 0, &Ia_sbbb_Gb_Eb }, + /* 1B */ { 0, &Ia_sbbq_Gq_Eq }, + /* 1C */ { 0, &Ia_sbbb_AL_Ib }, + /* 1D */ { 0, &Ia_sbbq_RAX_sId }, + /* 1E */ { 0, &Ia_Invalid }, + /* 1F */ { 0, &Ia_Invalid }, + /* 20 */ { 0, &Ia_andb_Eb_Gb }, + /* 21 */ { 0, &Ia_andq_Eq_Gq }, + /* 22 */ { 0, &Ia_andb_Gb_Eb }, + /* 23 */ { 0, &Ia_andq_Gq_Eq }, + /* 24 */ { 0, &Ia_andb_AL_Ib }, + /* 25 */ { 0, &Ia_andq_RAX_sId }, + /* 26 */ { 0, &Ia_prefix_es }, // ES: + /* 27 */ { 0, &Ia_Invalid }, + /* 28 */ { 0, &Ia_subb_Eb_Gb }, + /* 29 */ { 0, &Ia_subq_Eq_Gq }, + /* 2A */ { 0, &Ia_subb_Gb_Eb }, + /* 2B */ { 0, &Ia_subq_Gq_Eq }, + /* 2C */ { 0, &Ia_subb_AL_Ib }, + /* 2D */ { 0, &Ia_subq_RAX_sId }, + /* 2E */ { 0, &Ia_prefix_cs }, // CS: + /* 2F */ { 0, &Ia_Invalid }, + /* 30 */ { 0, &Ia_xorb_Eb_Gb }, + /* 31 */ { 0, &Ia_xorq_Eq_Gq }, + /* 32 */ { 0, &Ia_xorb_Gb_Eb }, + /* 33 */ { 0, &Ia_xorq_Gq_Eq }, + /* 34 */ { 0, &Ia_xorb_AL_Ib }, + /* 35 */ { 0, &Ia_xorq_RAX_sId }, + /* 36 */ { 0, &Ia_prefix_ss }, // SS: + /* 37 */ { 0, &Ia_Invalid }, + /* 38 */ { 0, &Ia_cmpb_Eb_Gb }, + /* 39 */ { 0, &Ia_cmpq_Eq_Gq }, + /* 3A */ { 0, &Ia_cmpb_Gb_Eb }, + /* 3B */ { 0, &Ia_cmpq_Gq_Eq }, + /* 3C */ { 0, &Ia_cmpb_AL_Ib }, + /* 3D */ { 0, &Ia_cmpq_RAX_sId }, + /* 3E */ { 0, &Ia_prefix_ds }, // DS: + /* 3F */ { 0, &Ia_Invalid }, + /* 40 */ { 0, &Ia_prefix_rex }, // REX: + /* 41 */ { 0, &Ia_prefix_rex }, // REX: + /* 42 */ { 0, &Ia_prefix_rex }, // REX: + /* 43 */ { 0, &Ia_prefix_rex }, // REX: + /* 44 */ { 0, &Ia_prefix_rex }, // REX: + /* 45 */ { 0, &Ia_prefix_rex }, // REX: + /* 46 */ { 0, &Ia_prefix_rex }, // REX: + /* 47 */ { 0, &Ia_prefix_rex }, // REX: + /* 48 */ { 0, &Ia_prefix_rex }, // REX: + /* 49 */ { 0, &Ia_prefix_rex }, // REX: + /* 4A */ { 0, &Ia_prefix_rex }, // REX: + /* 4B */ { 0, &Ia_prefix_rex }, // REX: + /* 4C */ { 0, &Ia_prefix_rex }, // REX: + /* 4D */ { 0, &Ia_prefix_rex }, // REX: + /* 4E */ { 0, &Ia_prefix_rex }, // REX: + /* 4F */ { 0, &Ia_prefix_rex }, // REX: + /* 50 */ { 0, &Ia_pushq_RRX }, + /* 51 */ { 0, &Ia_pushq_RRX }, + /* 52 */ { 0, &Ia_pushq_RRX }, + /* 53 */ { 0, &Ia_pushq_RRX }, + /* 54 */ { 0, &Ia_pushq_RRX }, + /* 55 */ { 0, &Ia_pushq_RRX }, + /* 56 */ { 0, &Ia_pushq_RRX }, + /* 57 */ { 0, &Ia_pushq_RRX }, + /* 58 */ { 0, &Ia_popq_RRX }, + /* 59 */ { 0, &Ia_popq_RRX }, + /* 5A */ { 0, &Ia_popq_RRX }, + /* 5B */ { 0, &Ia_popq_RRX }, + /* 5C */ { 0, &Ia_popq_RRX }, + /* 5D */ { 0, &Ia_popq_RRX }, + /* 5E */ { 0, &Ia_popq_RRX }, + /* 5F */ { 0, &Ia_popq_RRX }, + /* 60 */ { 0, &Ia_Invalid }, + /* 61 */ { 0, &Ia_Invalid }, + /* 62 */ { 0, &Ia_Invalid }, + /* 63 */ { 0, &Ia_movslq_Gq_Ed }, + /* 64 */ { 0, &Ia_prefix_fs }, // FS: + /* 65 */ { 0, &Ia_prefix_gs }, // GS: + /* 66 */ { 0, &Ia_prefix_osize }, // OSIZE: + /* 67 */ { 0, &Ia_prefix_asize }, // ASIZE: + /* 68 */ { 0, &Ia_pushq_sId }, + /* 69 */ { 0, &Ia_imulq_Gq_Eq_sId }, + /* 6A */ { 0, &Ia_pushq_sIb }, + /* 6B */ { 0, &Ia_imulq_Gq_Eq_sIb }, + /* 6C */ { 0, &Ia_insb_Yb_DX }, + /* 6D */ { 0, &Ia_insl_Yd_DX }, + /* 6E */ { 0, &Ia_outsb_DX_Xb }, + /* 6F */ { 0, &Ia_outsl_DX_Xd }, + /* 70 */ { 0, &Ia_jo_Jb }, + /* 71 */ { 0, &Ia_jno_Jb }, + /* 72 */ { 0, &Ia_jb_Jb }, + /* 73 */ { 0, &Ia_jnb_Jb }, + /* 74 */ { 0, &Ia_jz_Jb }, + /* 75 */ { 0, &Ia_jnz_Jb }, + /* 76 */ { 0, &Ia_jbe_Jb }, + /* 77 */ { 0, &Ia_jnbe_Jb }, + /* 78 */ { 0, &Ia_js_Jb }, + /* 79 */ { 0, &Ia_jns_Jb }, + /* 7A */ { 0, &Ia_jp_Jb }, + /* 7B */ { 0, &Ia_jnp_Jb }, + /* 7C */ { 0, &Ia_jl_Jb }, + /* 7D */ { 0, &Ia_jnl_Jb }, + /* 7E */ { 0, &Ia_jle_Jb }, + /* 7F */ { 0, &Ia_jnle_Jb }, + /* 80 */ { GRPN(G1EbIb) }, + /* 81 */ { GRPN(G1EqId) }, + /* 82 */ { 0, &Ia_Invalid }, + /* 83 */ { GRPN(G1EqIb) }, + /* 84 */ { 0, &Ia_testb_Eb_Gb }, + /* 85 */ { 0, &Ia_testq_Eq_Gq }, + /* 86 */ { 0, &Ia_xchgb_Eb_Gb }, + /* 87 */ { 0, &Ia_xchgq_Eq_Gq }, + /* 88 */ { 0, &Ia_movb_Eb_Gb }, + /* 89 */ { 0, &Ia_movq_Eq_Gq }, + /* 8A */ { 0, &Ia_movb_Gb_Eb }, + /* 8B */ { 0, &Ia_movq_Gq_Eq }, + /* 8C */ { 0, &Ia_movw_Ew_Sw }, + /* 8D */ { 0, &Ia_leaq_Gq_Mq }, + /* 8E */ { 0, &Ia_movw_Sw_Ew }, + /* 8F */ { 0, &Ia_popq_Eq }, + /* 90 */ { 0, &Ia_xchgq_RRX_RAX }, // handle XCHG R8, RAX + /* 91 */ { 0, &Ia_xchgq_RRX_RAX }, + /* 92 */ { 0, &Ia_xchgq_RRX_RAX }, + /* 93 */ { 0, &Ia_xchgq_RRX_RAX }, + /* 94 */ { 0, &Ia_xchgq_RRX_RAX }, + /* 95 */ { 0, &Ia_xchgq_RRX_RAX }, + /* 96 */ { 0, &Ia_xchgq_RRX_RAX }, + /* 97 */ { 0, &Ia_xchgq_RRX_RAX }, + /* 98 */ { 0, &Ia_cdqe }, + /* 99 */ { 0, &Ia_cqo }, + /* 9A */ { 0, &Ia_Invalid }, + /* 9B */ { 0, &Ia_fwait }, + /* 9C */ { 0, &Ia_pushfq }, + /* 9D */ { 0, &Ia_popfq }, + /* 9E */ { 0, &Ia_sahf }, + /* 9F */ { 0, &Ia_lahf }, + /* A0 */ { 0, &Ia_movb_AL_Ob }, + /* A1 */ { 0, &Ia_movq_RAX_Oq }, + /* A0 */ { 0, &Ia_movb_Ob_AL }, + /* A1 */ { 0, &Ia_movq_Oq_RAX }, + /* A4 */ { 0, &Ia_movsb_Yb_Xb }, + /* A5 */ { 0, &Ia_movsq_Yq_Xq }, + /* A6 */ { 0, &Ia_cmpsb_Yb_Xb }, + /* A7 */ { 0, &Ia_cmpsq_Yq_Xq }, + /* A8 */ { 0, &Ia_testb_AL_Ib }, + /* A9 */ { 0, &Ia_testq_RAX_sId }, + /* AA */ { 0, &Ia_stosb_Yb_AL }, + /* AB */ { 0, &Ia_stosq_Yq_RAX }, + /* AC */ { 0, &Ia_lodsb_AL_Xb }, + /* AD */ { 0, &Ia_lodsq_RAX_Xq }, + /* AE */ { 0, &Ia_scasb_Yb_AL }, + /* AF */ { 0, &Ia_scasq_Yq_RAX }, + /* B0 */ { 0, &Ia_movb_R8_Ib }, + /* B1 */ { 0, &Ia_movb_R8_Ib }, + /* B2 */ { 0, &Ia_movb_R8_Ib }, + /* B3 */ { 0, &Ia_movb_R8_Ib }, + /* B4 */ { 0, &Ia_movb_R8_Ib }, + /* B5 */ { 0, &Ia_movb_R8_Ib }, + /* B6 */ { 0, &Ia_movb_R8_Ib }, + /* B7 */ { 0, &Ia_movb_R8_Ib }, + /* B8 */ { 0, &Ia_movq_RRX_Iq }, + /* B9 */ { 0, &Ia_movq_RRX_Iq }, + /* BA */ { 0, &Ia_movq_RRX_Iq }, + /* BB */ { 0, &Ia_movq_RRX_Iq }, + /* BC */ { 0, &Ia_movq_RRX_Iq }, + /* BD */ { 0, &Ia_movq_RRX_Iq }, + /* BE */ { 0, &Ia_movq_RRX_Iq }, + /* BF */ { 0, &Ia_movq_RRX_Iq }, + /* C0 */ { GRPN(G2Eb) }, + /* C1 */ { GRPN(G2Eq) }, + /* C2 */ { 0, &Ia_ret_Iw }, + /* C3 */ { 0, &Ia_ret }, + /* C4 */ { 0, &Ia_Invalid }, + /* C5 */ { 0, &Ia_Invalid }, + /* C6 */ { 0, &Ia_movb_Eb_Ib }, + /* C7 */ { 0, &Ia_movq_Eq_sId }, + /* C8 */ { 0, &Ia_enter }, + /* C9 */ { 0, &Ia_leave }, + /* CA */ { 0, &Ia_lret_Iw }, + /* CB */ { 0, &Ia_lret }, + /* CC */ { 0, &Ia_int3 }, + /* CD */ { 0, &Ia_int_Ib }, + /* CE */ { 0, &Ia_Invalid }, + /* CF */ { 0, &Ia_iretq }, + /* D0 */ { GRPN(G2EbI1) }, + /* D1 */ { GRPN(G2EqI1) }, + /* D2 */ { GRPN(G2EbCL) }, + /* D3 */ { GRPN(G2EqCL) }, + /* D4 */ { 0, &Ia_Invalid }, + /* D5 */ { 0, &Ia_Invalid }, + /* D6 */ { 0, &Ia_Invalid }, + /* D7 */ { 0, &Ia_xlat }, + /* D8 */ { GRPFP(D8) }, + /* D9 */ { GRPFP(D9) }, + /* DA */ { GRPFP(DA) }, + /* DB */ { GRPFP(DB) }, + /* DC */ { GRPFP(DC) }, + /* DD */ { GRPFP(DD) }, + /* DE */ { GRPFP(DE) }, + /* DF */ { GRPFP(DF) }, + /* E0 */ { 0, &Ia_loopne_Jb }, + /* E1 */ { 0, &Ia_loope_Jb }, + /* E2 */ { 0, &Ia_loop_Jb }, + /* E3 */ { 0, &Ia_jrcxz_Jb }, + /* E4 */ { 0, &Ia_inb_AL_Ib }, + /* E5 */ { 0, &Ia_inl_EAX_Ib }, + /* E6 */ { 0, &Ia_outb_Ib_AL }, + /* E7 */ { 0, &Ia_outl_Ib_EAX }, + /* E8 */ { 0, &Ia_call_Jd }, + /* E9 */ { 0, &Ia_jmp_Jd }, + /* EA */ { 0, &Ia_Invalid }, + /* EB */ { 0, &Ia_jmp_Jb }, + /* EC */ { 0, &Ia_inb_AL_DX }, + /* ED */ { 0, &Ia_inl_EAX_DX }, + /* EE */ { 0, &Ia_outb_DX_AL }, + /* EF */ { 0, &Ia_outl_DX_EAX }, + /* F0 */ { 0, &Ia_prefix_lock }, // LOCK: + /* F1 */ { 0, &Ia_int1 }, + /* F2 */ { 0, &Ia_prefix_repne }, // REPNE: + /* F3 */ { 0, &Ia_prefix_rep }, // REP: + /* F4 */ { 0, &Ia_hlt }, + /* F5 */ { 0, &Ia_cmc }, + /* F6 */ { GRPN(G3Eb) }, + /* F7 */ { GRPN(G3Eq) }, + /* F8 */ { 0, &Ia_clc }, + /* F9 */ { 0, &Ia_stc }, + /* FA */ { 0, &Ia_cli }, + /* FB */ { 0, &Ia_sti }, + /* FC */ { 0, &Ia_cld }, + /* FD */ { 0, &Ia_std }, + /* FE */ { GRPN(G4) }, + /* FF */ { GRPN(64G5q) }, + + // 256 entries for two byte opcodes + /* 0F 00 */ { GRPN(G6) }, + /* 0F 01 */ { GRPN(G7) }, + /* 0F 02 */ { 0, &Ia_larq_Gq_Ew }, + /* 0F 03 */ { 0, &Ia_lslq_Gq_Ew }, + /* 0F 04 */ { 0, &Ia_Invalid }, + /* 0F 05 */ { 0, &Ia_syscall }, + /* 0F 06 */ { 0, &Ia_clts }, + /* 0F 07 */ { 0, &Ia_sysret }, + /* 0F 08 */ { 0, &Ia_invd }, + /* 0F 09 */ { 0, &Ia_wbinvd }, + /* 0F 0A */ { 0, &Ia_Invalid }, + /* 0F 0B */ { 0, &Ia_ud2a }, + /* 0F 0C */ { 0, &Ia_Invalid }, + /* 0F 0D */ { 0, &Ia_prefetch }, // 3DNow! + /* 0F 0E */ { 0, &Ia_femms }, // 3DNow! + /* 0F 0F */ { GRP3DNOW }, + /* 0F 10 */ { GRPSSE(0f10) }, + /* 0F 11 */ { GRPSSE(0f11) }, + /* 0F 12 */ { GRPSSE(0f12) }, + /* 0F 13 */ { GRPSSE(0f13) }, + /* 0F 14 */ { GRPSSE(0f14) }, + /* 0F 15 */ { GRPSSE(0f15) }, + /* 0F 16 */ { GRPSSE(0f16) }, + /* 0F 17 */ { GRPSSE(0f17) }, + /* 0F 18 */ { GRPN(G16) }, + /* 0F 19 */ { 0, &Ia_Invalid }, + /* 0F 1A */ { 0, &Ia_Invalid }, + /* 0F 1B */ { 0, &Ia_Invalid }, + /* 0F 1C */ { 0, &Ia_Invalid }, + /* 0F 1D */ { 0, &Ia_Invalid }, + /* 0F 1E */ { 0, &Ia_Invalid }, + /* 0F 1F */ { 0, &Ia_multibyte_nop }, + /* 0F 20 */ { 0, &Ia_movq_Rq_Cq }, + /* 0F 21 */ { 0, &Ia_movq_Rq_Dq }, + /* 0F 22 */ { 0, &Ia_movq_Cq_Rq }, + /* 0F 23 */ { 0, &Ia_movq_Dq_Rq }, + /* 0F 24 */ { 0, &Ia_Invalid }, + /* 0F 25 */ { 0, &Ia_Invalid }, + /* 0F 26 */ { 0, &Ia_Invalid }, + /* 0F 27 */ { 0, &Ia_Invalid }, + /* 0F 28 */ { GRPSSE(0f28) }, + /* 0F 29 */ { GRPSSE(0f29) }, + /* 0F 2A */ { GRPSSE(640f2a) }, + /* 0F 2B */ { GRPSSE(0f2b) }, + /* 0F 2C */ { GRPSSE(0f2cQ) }, + /* 0F 2D */ { GRPSSE(0f2dQ) }, + /* 0F 2E */ { GRPSSE(0f2e) }, + /* 0F 2F */ { GRPSSE(0f2f) }, + /* 0F 30 */ { 0, &Ia_wrmsr }, + /* 0F 31 */ { 0, &Ia_rdtsc }, + /* 0F 32 */ { 0, &Ia_rdmsr }, + /* 0F 33 */ { 0, &Ia_rdpmc }, + /* 0F 34 */ { 0, &Ia_sysenter }, + /* 0F 35 */ { 0, &Ia_sysexit }, + /* 0F 36 */ { 0, &Ia_Invalid }, + /* 0F 37 */ { 0, &Ia_Invalid }, + /* 0F 38 */ { GR3BTAB(A4) }, + /* 0F 39 */ { 0, &Ia_Invalid }, + /* 0F 3A */ { GR3BTAB(A5) }, + /* 0F 3B */ { 0, &Ia_Invalid }, + /* 0F 3C */ { 0, &Ia_Invalid }, + /* 0F 3D */ { 0, &Ia_Invalid }, + /* 0F 3E */ { 0, &Ia_Invalid }, + /* 0F 3F */ { 0, &Ia_Invalid }, + /* 0F 40 */ { 0, &Ia_cmovoq_Gq_Eq }, + /* 0F 41 */ { 0, &Ia_cmovnoq_Gq_Eq }, + /* 0F 42 */ { 0, &Ia_cmovcq_Gq_Eq }, + /* 0F 43 */ { 0, &Ia_cmovncq_Gq_Eq }, + /* 0F 44 */ { 0, &Ia_cmovzq_Gq_Eq }, + /* 0F 45 */ { 0, &Ia_cmovnzq_Gq_Eq }, + /* 0F 46 */ { 0, &Ia_cmovnaq_Gq_Eq }, + /* 0F 47 */ { 0, &Ia_cmovaq_Gq_Eq }, + /* 0F 48 */ { 0, &Ia_cmovsq_Gq_Eq }, + /* 0F 49 */ { 0, &Ia_cmovnsq_Gq_Eq }, + /* 0F 4A */ { 0, &Ia_cmovpq_Gq_Eq }, + /* 0F 4B */ { 0, &Ia_cmovnpq_Gq_Eq }, + /* 0F 4C */ { 0, &Ia_cmovlq_Gq_Eq }, + /* 0F 4D */ { 0, &Ia_cmovnlq_Gq_Eq }, + /* 0F 4E */ { 0, &Ia_cmovngq_Gq_Eq }, + /* 0F 4F */ { 0, &Ia_cmovgq_Gq_Eq }, + /* 0F 50 */ { GRPSSE(0f50) }, + /* 0F 51 */ { GRPSSE(0f51) }, + /* 0F 52 */ { GRPSSE(0f52) }, + /* 0F 53 */ { GRPSSE(0f53) }, + /* 0F 54 */ { GRPSSE(0f54) }, + /* 0F 55 */ { GRPSSE(0f55) }, + /* 0F 56 */ { GRPSSE(0f56) }, + /* 0F 57 */ { GRPSSE(0f57) }, + /* 0F 58 */ { GRPSSE(0f58) }, + /* 0F 59 */ { GRPSSE(0f59) }, + /* 0F 5A */ { GRPSSE(0f5a) }, + /* 0F 5B */ { GRPSSE(0f5b) }, + /* 0F 5C */ { GRPSSE(0f5c) }, + /* 0F 5D */ { GRPSSE(0f5d) }, + /* 0F 5E */ { GRPSSE(0f5e) }, + /* 0F 5F */ { GRPSSE(0f5f) }, + /* 0F 60 */ { GRPSSE(0f60) }, + /* 0F 61 */ { GRPSSE(0f61) }, + /* 0F 62 */ { GRPSSE(0f62) }, + /* 0F 63 */ { GRPSSE(0f63) }, + /* 0F 64 */ { GRPSSE(0f64) }, + /* 0F 65 */ { GRPSSE(0f65) }, + /* 0F 66 */ { GRPSSE(0f66) }, + /* 0F 67 */ { GRPSSE(0f67) }, + /* 0F 68 */ { GRPSSE(0f68) }, + /* 0F 69 */ { GRPSSE(0f69) }, + /* 0F 6A */ { GRPSSE(0f6a) }, + /* 0F 6B */ { GRPSSE(0f6b) }, + /* 0F 6C */ { GRPSSE(0f6c) }, + /* 0F 6D */ { GRPSSE(0f6d) }, + /* 0F 6E */ { GRPSSE(0f6eQ) }, + /* 0F 6F */ { GRPSSE(0f6f) }, + /* 0F 70 */ { GRPSSE(0f70) }, + /* 0F 71 */ { GRPN(G12) }, + /* 0F 72 */ { GRPN(G13) }, + /* 0F 73 */ { GRPN(G14) }, + /* 0F 74 */ { GRPSSE(0f74) }, + /* 0F 75 */ { GRPSSE(0f75) }, + /* 0F 76 */ { GRPSSE(0f76) }, + /* 0F 77 */ { 0, &Ia_emms }, + /* 0F 78 */ { 0, &Ia_Invalid }, + /* 0F 79 */ { 0, &Ia_Invalid }, + /* 0F 7A */ { 0, &Ia_Invalid }, + /* 0F 7B */ { 0, &Ia_Invalid }, + /* 0F 7C */ { GRPSSE(0f7c) }, + /* 0F 7D */ { GRPSSE(0f7d) }, + /* 0F 7E */ { GRPSSE(0f7eQ) }, + /* 0F 7F */ { GRPSSE(0f7f) }, + /* 0F 80 */ { 0, &Ia_jo_Jd }, + /* 0F 81 */ { 0, &Ia_jno_Jd }, + /* 0F 82 */ { 0, &Ia_jb_Jd }, + /* 0F 83 */ { 0, &Ia_jnb_Jd }, + /* 0F 84 */ { 0, &Ia_jz_Jd }, + /* 0F 85 */ { 0, &Ia_jnz_Jd }, + /* 0F 86 */ { 0, &Ia_jbe_Jd }, + /* 0F 87 */ { 0, &Ia_jnbe_Jd }, + /* 0F 88 */ { 0, &Ia_js_Jd }, + /* 0F 89 */ { 0, &Ia_jns_Jd }, + /* 0F 8A */ { 0, &Ia_jp_Jd }, + /* 0F 8B */ { 0, &Ia_jnp_Jd }, + /* 0F 8C */ { 0, &Ia_jl_Jd }, + /* 0F 8D */ { 0, &Ia_jnl_Jd }, + /* 0F 8E */ { 0, &Ia_jle_Jd }, + /* 0F 8F */ { 0, &Ia_jnle_Jd }, + /* 0F 90 */ { 0, &Ia_seto_Eb }, + /* 0F 91 */ { 0, &Ia_setno_Eb }, + /* 0F 92 */ { 0, &Ia_setb_Eb }, + /* 0F 93 */ { 0, &Ia_setnb_Eb }, + /* 0F 94 */ { 0, &Ia_setz_Eb }, + /* 0F 95 */ { 0, &Ia_setnz_Eb }, + /* 0F 96 */ { 0, &Ia_setbe_Eb }, + /* 0F 97 */ { 0, &Ia_setnbe_Eb }, + /* 0F 98 */ { 0, &Ia_sets_Eb }, + /* 0F 99 */ { 0, &Ia_setns_Eb }, + /* 0F 9A */ { 0, &Ia_setp_Eb }, + /* 0F 9B */ { 0, &Ia_setnp_Eb }, + /* 0F 9C */ { 0, &Ia_setl_Eb }, + /* 0F 9D */ { 0, &Ia_setnl_Eb }, + /* 0F 9E */ { 0, &Ia_setle_Eb }, + /* 0F 9F */ { 0, &Ia_setnle_Eb }, + /* 0F A0 */ { 0, &Ia_pushq_FS }, + /* 0F A1 */ { 0, &Ia_popq_FS }, + /* 0F A2 */ { 0, &Ia_cpuid }, + /* 0F A3 */ { 0, &Ia_btq_Eq_Gq }, + /* 0F A4 */ { 0, &Ia_shldq_Eq_Gq_Ib }, + /* 0F A5 */ { 0, &Ia_shldq_Eq_Gq_CL }, + /* 0F A6 */ { 0, &Ia_Invalid }, + /* 0F A7 */ { 0, &Ia_Invalid }, + /* 0F A8 */ { 0, &Ia_pushq_GS }, + /* 0F A9 */ { 0, &Ia_popq_GS }, + /* 0F AA */ { 0, &Ia_rsm }, + /* 0F AB */ { 0, &Ia_btsq_Eq_Gq }, + /* 0F AC */ { 0, &Ia_shrdq_Eq_Gq_Ib }, + /* 0F AD */ { 0, &Ia_shrdq_Eq_Gq_CL }, + /* 0F AE */ { GRPN(G15) }, + /* 0F AF */ { 0, &Ia_imulq_Gq_Eq }, + /* 0F B0 */ { 0, &Ia_cmpxchgb_Eb_Gb }, + /* 0F B1 */ { 0, &Ia_cmpxchgq_Eq_Gq }, + /* 0F B2 */ { 0, &Ia_lssq_Gq_Mp }, + /* 0F B3 */ { 0, &Ia_btrq_Eq_Gq }, + /* 0F B4 */ { 0, &Ia_lfsq_Gq_Mp }, + /* 0F B5 */ { 0, &Ia_lgsq_Gq_Mp }, + /* 0F B6 */ { 0, &Ia_movzbq_Gq_Eb }, + /* 0F B7 */ { 0, &Ia_movzwq_Gq_Ew }, + /* 0F B8 */ { 0, &Ia_Invalid }, + /* 0F B9 */ { 0, &Ia_ud2b }, + /* 0F BA */ { GRPN(G8EqIb) }, + /* 0F BB */ { 0, &Ia_btcq_Eq_Gq }, + /* 0F BC */ { 0, &Ia_bsfq_Gq_Eq }, + /* 0F BD */ { 0, &Ia_bsrq_Gq_Eq }, + /* 0F BE */ { 0, &Ia_movsbq_Gq_Eb }, + /* 0F BF */ { 0, &Ia_movswq_Gq_Ew }, + /* 0F C0 */ { 0, &Ia_xaddb_Eb_Gb }, + /* 0F C0 */ { 0, &Ia_xaddq_Eq_Gq }, + /* 0F C2 */ { GRPSSE(0fc2) }, + /* 0F C3 */ { GRPSSE(640fc3) }, + /* 0F C4 */ { GRPSSE(0fc4) }, + /* 0F C5 */ { GRPSSE(0fc5) }, + /* 0F C6 */ { GRPSSE(0fc6) }, + /* 0F C7 */ { GRPN(G9q) }, + /* 0F C8 */ { 0, &Ia_bswapq_RRX }, + /* 0F C9 */ { 0, &Ia_bswapq_RRX }, + /* 0F CA */ { 0, &Ia_bswapq_RRX }, + /* 0F CB */ { 0, &Ia_bswapq_RRX }, + /* 0F CC */ { 0, &Ia_bswapq_RRX }, + /* 0F CD */ { 0, &Ia_bswapq_RRX }, + /* 0F CE */ { 0, &Ia_bswapq_RRX }, + /* 0F CF */ { 0, &Ia_bswapq_RRX }, + /* 0F D0 */ { GRPSSE(0fd0) }, + /* 0F D1 */ { GRPSSE(0fd1) }, + /* 0F D2 */ { GRPSSE(0fd2) }, + /* 0F D3 */ { GRPSSE(0fd3) }, + /* 0F D4 */ { GRPSSE(0fd4) }, + /* 0F D5 */ { GRPSSE(0fd5) }, + /* 0F D6 */ { GRPSSE(0fd6) }, + /* 0F D7 */ { GRPSSE(0fd7) }, + /* 0F D8 */ { GRPSSE(0fd8) }, + /* 0F D9 */ { GRPSSE(0fd9) }, + /* 0F DA */ { GRPSSE(0fda) }, + /* 0F DB */ { GRPSSE(0fdb) }, + /* 0F DC */ { GRPSSE(0fdc) }, + /* 0F DD */ { GRPSSE(0fdd) }, + /* 0F DE */ { GRPSSE(0fde) }, + /* 0F DF */ { GRPSSE(0fdf) }, + /* 0F E0 */ { GRPSSE(0fe0) }, + /* 0F E1 */ { GRPSSE(0fe1) }, + /* 0F E2 */ { GRPSSE(0fe2) }, + /* 0F E3 */ { GRPSSE(0fe3) }, + /* 0F E4 */ { GRPSSE(0fe4) }, + /* 0F E5 */ { GRPSSE(0fe5) }, + /* 0F E6 */ { GRPSSE(0fe6) }, + /* 0F E7 */ { GRPSSE(0fe7) }, + /* 0F E8 */ { GRPSSE(0fe8) }, + /* 0F E9 */ { GRPSSE(0fe9) }, + /* 0F EA */ { GRPSSE(0fea) }, + /* 0F EB */ { GRPSSE(0feb) }, + /* 0F EC */ { GRPSSE(0fec) }, + /* 0F ED */ { GRPSSE(0fed) }, + /* 0F EE */ { GRPSSE(0fee) }, + /* 0F EF */ { GRPSSE(0fef) }, + /* 0F F0 */ { GRPSSE(0ff0) }, + /* 0F F1 */ { GRPSSE(0ff1) }, + /* 0F F2 */ { GRPSSE(0ff2) }, + /* 0F F3 */ { GRPSSE(0ff3) }, + /* 0F F4 */ { GRPSSE(0ff4) }, + /* 0F F5 */ { GRPSSE(0ff5) }, + /* 0F F6 */ { GRPSSE(0ff6) }, + /* 0F F7 */ { GRPSSE(0ff7) }, + /* 0F F8 */ { GRPSSE(0ff8) }, + /* 0F F9 */ { GRPSSE(0ff9) }, + /* 0F FA */ { GRPSSE(0ffa) }, + /* 0F FB */ { GRPSSE(0ffb) }, + /* 0F FC */ { GRPSSE(0ffc) }, + /* 0F FD */ { GRPSSE(0ffd) }, + /* 0F FE */ { GRPSSE(0ffe) }, + /* 0F FF */ { 0, &Ia_Invalid } +}; diff --git a/Externals/Bochs_disasm/disasm.h b/Externals/Bochs_disasm/disasm.h new file mode 100644 index 0000000000..0bf21e8cfb --- /dev/null +++ b/Externals/Bochs_disasm/disasm.h @@ -0,0 +1,508 @@ +#ifndef _BX_DISASM_H_ +#define _BX_DISASM_H_ + +#include "config.h" + +#define BX_DECODE_MODRM(modrm_byte, mod, opcode, rm) { \ + mod = (modrm_byte >> 6) & 0x03; \ + opcode = (modrm_byte >> 3) & 0x07; \ + rm = modrm_byte & 0x07; \ +} + +#define BX_DECODE_SIB(sib_byte, scale, index, base) { \ + scale = sib_byte >> 6; \ + index = (sib_byte >> 3) & 0x07; \ + base = sib_byte & 0x07; \ +} + +// will be used in future +#define IA_286 0x00000001 /* 286+ instruction */ +#define IA_386 0x00000002 /* 386+ instruction */ +#define IA_486 0x00000004 /* 486+ instruction */ +#define IA_PENTIUM 0x00000008 /* Pentium+ instruction */ +#define IA_P6 0x00000010 /* P6 new instruction */ +#define IA_SYSTEM 0x00000020 /* system instruction (require CPL=0) */ +#define IA_LEGACY 0x00000040 /* legacy instruction */ +#define IA_X87 0x00000080 /* FPU (X87) instruction */ +#define IA_MMX 0x00000100 /* MMX instruction */ +#define IA_3DNOW 0x00000200 /* 3DNow! instruction */ +#define IA_PREFETCH 0x00000400 /* Prefetch instruction */ +#define IA_SSE 0x00000800 /* SSE instruction */ +#define IA_SSE2 0x00001000 /* SSE2 instruction */ +#define IA_SSE3 0x00002000 /* SSE3 instruction */ +#define IA_SSE4 0x00004000 /* SSE4 instruction */ +#define IA_X86_64 0x00008000 /* x86-64 instruction */ + +/* general purpose bit register */ +enum { + rAX_REG, + rCX_REG, + rDX_REG, + rBX_REG, + rSP_REG, + rBP_REG, + rSI_REG, + rDI_REG +}; + +/* segment register */ +enum { + ES_REG, + CS_REG, + SS_REG, + DS_REG, + FS_REG, + GS_REG, + INVALID_SEG1, + INVALID_SEG2 +}; + +class disassembler; +struct x86_insn; + +typedef void (disassembler::*BxDisasmPtr_t)(const x86_insn *insn); +typedef void (disassembler::*BxDisasmResolveModrmPtr_t)(const x86_insn *insn, unsigned attr); + +struct BxDisasmOpcodeInfo_t +{ + const char *IntelOpcode; + const char *AttOpcode; + BxDisasmPtr_t Operand1; + BxDisasmPtr_t Operand2; + BxDisasmPtr_t Operand3; +}; + +struct BxDisasmOpcodeTable_t +{ + Bit32u Attr; + const void *OpcodeInfo; +}; + +// segment override not used +#define NO_SEG_OVERRIDE 0xFF + +// datasize attributes +#define X_SIZE 0x0000 +#define B_SIZE 0x0100 +#define W_SIZE 0x0200 +#define D_SIZE 0x0300 +#define Q_SIZE 0x0400 +#define Z_SIZE 0x0500 +#define V_SIZE 0x0600 +#define O_SIZE 0x0700 +#define T_SIZE 0x0800 +#define P_SIZE 0x0900 + +// branch hint attribute +#define BRANCH_HINT 0x1000 + +struct x86_insn +{ +public: + x86_insn(bx_bool is32, bx_bool is64); + + bx_bool is_seg_override() const { + return (seg_override != NO_SEG_OVERRIDE); + } + +public: + bx_bool is_32, is_64; + bx_bool as_32, as_64; + bx_bool os_32, os_64; + + Bit8u extend8b; + Bit8u rex_r, rex_x, rex_b; + Bit8u seg_override; + unsigned b1, prefixes; + unsigned ilen; + + Bit8u modrm, mod, nnn, rm; + Bit8u sib, scale, index, base; + union { + Bit16u displ16; + Bit32u displ32; + } displacement; +}; + +BX_CPP_INLINE x86_insn::x86_insn(bx_bool is32, bx_bool is64) +{ + is_32 = is32; + is_64 = is64; + + if (is_64) { + os_64 = 0; + as_64 = 1; + os_32 = 1; + as_32 = 1; + } + else { + os_64 = 0; + as_64 = 0; + os_32 = is_32; + as_32 = is_32; + } + + extend8b = 0; + rex_r = rex_b = rex_x = 0; + seg_override = NO_SEG_OVERRIDE; + prefixes = 0; + ilen = 0; + b1 = 0; + + modrm = mod = nnn = rm = 0; + sib = scale = index = base = 0; + displacement.displ32 = 0; +} + +class disassembler { +public: + disassembler() { set_syntax_intel(); } + + unsigned disasm(bx_bool is_32, bx_bool is_64, bx_address base, bx_address ip, const Bit8u *instr, char *disbuf); + + unsigned disasm16(bx_address base, bx_address ip, const Bit8u *instr, char *disbuf) + { return disasm(0, 0, base, ip, instr, disbuf); } + + unsigned disasm32(bx_address base, bx_address ip, const Bit8u *instr, char *disbuf) + { return disasm(1, 0, base, ip, instr, disbuf); } + + unsigned disasm64(bx_address base, bx_address ip, const Bit8u *instr, char *disbuf) + { return disasm(1, 1, base, ip, instr, disbuf); } + + x86_insn decode(bx_bool is_32, bx_bool is_64, bx_address base, bx_address ip, const Bit8u *instr, char *disbuf); + + x86_insn decode16(bx_address base, bx_address ip, const Bit8u *instr, char *disbuf) + { return decode(0, 0, base, ip, instr, disbuf); } + + x86_insn decode32(bx_address base, bx_address ip, const Bit8u *instr, char *disbuf) + { return decode(1, 0, base, ip, instr, disbuf); } + + x86_insn decode64(bx_address base, bx_address ip, const Bit8u *instr, char *disbuf) + { return decode(1, 1, base, ip, instr, disbuf); } + + void set_syntax_intel(); + void set_syntax_att (); + + void toggle_syntax_mode(); + +private: + bx_bool intel_mode; + + const char **general_16bit_regname; + const char **general_8bit_regname; + const char **general_32bit_regname; + const char **general_8bit_regname_rex; + const char **general_64bit_regname; + + const char **segment_name; + const char **index16; + + const char *sreg_mod01or10_rm32[8]; + const char *sreg_mod00_base32[8]; + const char *sreg_mod01or10_base32[8]; + const char *sreg_mod00_rm16[8]; + const char *sreg_mod01or10_rm16[8]; + +private: + + bx_address db_eip, db_base; + + const Bit8u *instruction; // for fetching of next byte of instruction + + char *disbufptr; + + BxDisasmResolveModrmPtr_t resolve_modrm; + + BX_CPP_INLINE Bit8u fetch_byte() { + db_eip++; + return(*instruction++); + }; + + BX_CPP_INLINE Bit8u peek_byte() { + return(*instruction); + }; + + BX_CPP_INLINE Bit16u fetch_word() { + Bit8u b0 = * (Bit8u *) instruction++; + Bit8u b1 = * (Bit8u *) instruction++; + Bit16u ret16 = (b1<<8) | b0; + db_eip += 2; + return(ret16); + }; + + BX_CPP_INLINE Bit32u fetch_dword() { + Bit8u b0 = * (Bit8u *) instruction++; + Bit8u b1 = * (Bit8u *) instruction++; + Bit8u b2 = * (Bit8u *) instruction++; + Bit8u b3 = * (Bit8u *) instruction++; + Bit32u ret32 = (b3<<24) | (b2<<16) | (b1<<8) | b0; + db_eip += 4; + return(ret32); + }; + + BX_CPP_INLINE Bit64u fetch_qword() { + Bit64u d0 = fetch_dword(); + Bit64u d1 = fetch_dword(); + Bit64u ret64 = (d1<<32) | d0; + return(ret64); + }; + + void dis_putc(char symbol); + void dis_sprintf(const char *fmt, ...); + void decode_modrm(x86_insn *insn); + + void resolve16_mod0 (const x86_insn *insn, unsigned mode); + void resolve16_mod1or2(const x86_insn *insn, unsigned mode); + + void resolve32_mod0 (const x86_insn *insn, unsigned mode); + void resolve32_mod1or2(const x86_insn *insn, unsigned mode); + + void resolve32_mod0_rm4 (const x86_insn *insn, unsigned mode); + void resolve32_mod1or2_rm4(const x86_insn *insn, unsigned mode); + + void resolve64_mod0 (const x86_insn *insn, unsigned mode); + void resolve64_mod1or2(const x86_insn *insn, unsigned mode); + + void resolve64_mod0_rm4 (const x86_insn *insn, unsigned mode); + void resolve64_mod1or2_rm4(const x86_insn *insn, unsigned mode); + + void initialize_modrm_segregs(); + + void print_datasize (unsigned mode); + + void print_memory_access16(int datasize, + const char *seg, const char *index, Bit16u disp); + void print_memory_access (int datasize, + const char *seg, const char *base, const char *index, int scale, Bit32u disp); + + void print_disassembly_intel(const x86_insn *insn, const BxDisasmOpcodeInfo_t *entry); + void print_disassembly_att (const x86_insn *insn, const BxDisasmOpcodeInfo_t *entry); + +public: + +/* + * Codes for Addressing Method: + * --------------------------- + * A - Direct address. The instruction has no ModR/M byte; the address + * of the operand is encoded in the instruction; and no base register, + * index register, or scaling factor can be applied. + * C - The reg field of the ModR/M byte selects a control register. + * D - The reg field of the ModR/M byte selects a debug register. + * E - A ModR/M byte follows the opcode and specifies the operand. The + * operand is either a general-purpose register or a memory address. + * If it is a memory address, the address is computed from a segment + * register and any of the following values: a base register, an + * index register, a scaling factor, a displacement. + * F - Flags Register. + * G - The reg field of the ModR/M byte selects a general register. + * I - Immediate data. The operand value is encoded in subsequent bytes of + * the instruction. + * J - The instruction contains a relative offset to be added to the + * instruction pointer register. + * M - The ModR/M byte may refer only to memory. + * N - The R/M field of the ModR/M byte selects a packed-quadword MMX + technology register. + * O - The instruction has no ModR/M byte; the offset of the operand is + * coded as a word or double word (depending on address size attribute) + * in the instruction. No base register, index register, or scaling + * factor can be applied. + * P - The reg field of the ModR/M byte selects a packed quadword MMX + * technology register. + * Q - A ModR/M byte follows the opcode and specifies the operand. The + * operand is either an MMX technology register or a memory address. + * If it is a memory address, the address is computed from a segment + * register and any of the following values: a base register, an + * index register, a scaling factor, and a displacement. + * R - The mod field of the ModR/M byte may refer only to a general register. + * S - The reg field of the ModR/M byte selects a segment register. + * U - The R/M field of the ModR/M byte selects a 128-bit XMM register. + * T - The reg field of the ModR/M byte selects a test register. + * V - The reg field of the ModR/M byte selects a 128-bit XMM register. + * W - A ModR/M byte follows the opcode and specifies the operand. The + * operand is either a 128-bit XMM register or a memory address. If + * it is a memory address, the address is computed from a segment + * register and any of the following values: a base register, an + * index register, a scaling factor, and a displacement. + * X - Memory addressed by the DS:rSI register pair. + * Y - Memory addressed by the ES:rDI register pair. + */ + +/* + * Codes for Operand Type: + * ---------------------- + * a - Two one-word operands in memory or two double-word operands in + * memory, depending on operand-size attribute (used only by the BOUND + * instruction). + * b - Byte, regardless of operand-size attribute. + * d - Doubleword, regardless of operand-size attribute. + * dq - Double-quadword, regardless of operand-size attribute. + * p - 32-bit or 48-bit pointer, depending on operand-size attribute. + * pd - 128-bit packed double-precision floating-point data. + * pi - Quadword MMX technology register (packed integer) + * ps - 128-bit packed single-precision floating-point data. + * q - Quadword, regardless of operand-size attribute. + * s - 6-byte or 10-byte pseudo-descriptor. + * si - Doubleword integer register (scalar integer) + * ss - Scalar element of a 128-bit packed single-precision floating data. + * sd - Scalar element of a 128-bit packed double-precision floating data. + * v - Word, doubleword or quadword, depending on operand-size attribute. + * w - Word, regardless of operand-size attr. + */ + + // far call/jmp + void Apw(const x86_insn *insn); + void Apd(const x86_insn *insn); + + // 8-bit general purpose registers + void AL(const x86_insn *insn); + void CL(const x86_insn *insn); + + // 16-bit general purpose registers + void AX(const x86_insn *insn); + void DX(const x86_insn *insn); + + // 32-bit general purpose registers + void EAX(const x86_insn *insn); + + // 64-bit general purpose registers + void RAX(const x86_insn *insn); + + // segment registers + void CS(const x86_insn *insn); + void DS(const x86_insn *insn); + void ES(const x86_insn *insn); + void SS(const x86_insn *insn); + void FS(const x86_insn *insn); + void GS(const x86_insn *insn); + + // segment registers + void Sw(const x86_insn *insn); + + // test registers + void Td(const x86_insn *insn); + + // control register + void Cd(const x86_insn *insn); + void Cq(const x86_insn *insn); + + // debug register + void Dd(const x86_insn *insn); + void Dq(const x86_insn *insn); + + // 8-bit general purpose register + void R8(const x86_insn *insn); + + // 16-bit general purpose register + void RX(const x86_insn *insn); + + // 32-bit general purpose register + void ERX(const x86_insn *insn); + + // 64-bit general purpose register + void RRX(const x86_insn *insn); + + // general purpose register or memory operand + void Eb(const x86_insn *insn); + void Ew(const x86_insn *insn); + void Ed(const x86_insn *insn); + void Eq(const x86_insn *insn); + + // general purpose register + void Gb(const x86_insn *insn); + void Gw(const x86_insn *insn); + void Gd(const x86_insn *insn); + void Gq(const x86_insn *insn); + + // immediate + void I1(const x86_insn *insn); + void Ib(const x86_insn *insn); + void Iw(const x86_insn *insn); + void Id(const x86_insn *insn); + void Iq(const x86_insn *insn); + + // two immediates Iw/Ib + void IwIb(const x86_insn *insn); + + // sign extended immediate + void sIbw(const x86_insn *insn); + void sIbd(const x86_insn *insn); + void sIbq(const x86_insn *insn); + void sIdq(const x86_insn *insn); + + // floating point + void ST0(const x86_insn *insn); + void STi(const x86_insn *insn); + + // general purpose register + void Rw(const x86_insn *insn); + void Rd(const x86_insn *insn); + void Rq(const x86_insn *insn); + + // mmx register + void Pq(const x86_insn *insn); + + // mmx register or memory operand + void Qd(const x86_insn *insn); + void Qq(const x86_insn *insn); + void Vq(const x86_insn *insn); + void Nq(const x86_insn *insn); + + // xmm register + void Udq(const x86_insn *insn); + void Vdq(const x86_insn *insn); + void Vss(const x86_insn *insn); + void Vsd(const x86_insn *insn); + void Vps(const x86_insn *insn); + void Vpd(const x86_insn *insn); + + // xmm register or memory operand + void Wq(const x86_insn *insn); + void Wdq(const x86_insn *insn); + void Wss(const x86_insn *insn); + void Wsd(const x86_insn *insn); + void Wps(const x86_insn *insn); + void Wpd(const x86_insn *insn); + + // direct memory access + void OP_O(const x86_insn *insn, unsigned size); + void Ob(const x86_insn *insn); + void Ow(const x86_insn *insn); + void Od(const x86_insn *insn); + void Oq(const x86_insn *insn); + + // memory operand + void OP_M(const x86_insn *insn, unsigned size); + void Ma(const x86_insn *insn); + void Mp(const x86_insn *insn); + void Ms(const x86_insn *insn); + void Mx(const x86_insn *insn); + void Mb(const x86_insn *insn); + void Mw(const x86_insn *insn); + void Md(const x86_insn *insn); + void Mq(const x86_insn *insn); + void Mt(const x86_insn *insn); + void Mdq(const x86_insn *insn); + void Mps(const x86_insn *insn); + void Mpd(const x86_insn *insn); + + // string instructions + void OP_X(const x86_insn *insn, unsigned size); + void Xb(const x86_insn *insn); + void Xw(const x86_insn *insn); + void Xd(const x86_insn *insn); + void Xq(const x86_insn *insn); + + // string instructions + void OP_Y(const x86_insn *insn, unsigned size); + void Yb(const x86_insn *insn); + void Yw(const x86_insn *insn); + void Yd(const x86_insn *insn); + void Yq(const x86_insn *insn); + + // jump offset + void Jb(const x86_insn *insn); + void Jw(const x86_insn *insn); + void Jd(const x86_insn *insn); +}; + +#endif diff --git a/Externals/Bochs_disasm/opcodes.inl b/Externals/Bochs_disasm/opcodes.inl new file mode 100644 index 0000000000..a06968361f --- /dev/null +++ b/Externals/Bochs_disasm/opcodes.inl @@ -0,0 +1,1230 @@ +Ia_aaa = { "aaa", "aaa", XX, XX, XX }, +Ia_aad = { "aad", "aad", Ib, XX, XX }, +Ia_aam = { "aam", "aam", Ib, XX, XX }, +Ia_aas = { "aas", "aas", XX, XX, XX }, +Ia_adcb_AL_Ib = { "adc", "adcb", AL, Ib, XX }, +Ia_adcb_Eb_Gb = { "adc", "adcb", Eb, Gb, XX }, +Ia_adcb_Eb_Ib = { "adc", "adcb", Eb, Ib, XX }, +Ia_adcb_Gb_Eb = { "adc", "adcb", Gb, Eb, XX }, +Ia_adcl_EAX_Id = { "adc", "adcl", EAX, Id, XX }, +Ia_adcl_Ed_Gd = { "adc", "adcl", Ed, Gd, XX }, +Ia_adcl_Ed_Id = { "adc", "adcl", Ed, Id, XX }, +Ia_adcl_Ed_sIb = { "adc", "adcl", Ed, sIbd, XX }, +Ia_adcl_Gd_Ed = { "adc", "adcl", Gd, Ed, XX }, +Ia_adcq_Eq_Gq = { "adc", "adcq", Eq, Gq, XX }, +Ia_adcq_Eq_sIb = { "adc", "adcq", Eq, sIbq, XX }, +Ia_adcq_Eq_sId = { "adc", "adcq", Eq, Iq, XX }, +Ia_adcq_Gq_Eq = { "adc", "adcq", Gq, Eq, XX }, +Ia_adcq_RAX_sId = { "adc", "adcq", RAX, sIdq, XX }, +Ia_adcw_AX_Iw = { "adc", "adcw", AX, Iw, XX }, +Ia_adcw_Ew_Gw = { "adc", "adcw", Ew, Gw, XX }, +Ia_adcw_Ew_Iw = { "adc", "adcw", Ew, Iw, XX }, +Ia_adcw_Ew_sIb = { "adc", "adcw", Ew, sIbw, XX }, +Ia_adcw_Gw_Ew = { "adc", "adcw", Gw, Ew, XX }, +Ia_addb_AL_Ib = { "add", "addb", AL, Ib, XX }, +Ia_addb_Eb_Gb = { "add", "addb", Eb, Gb, XX }, +Ia_addb_Eb_Ib = { "add", "addb", Eb, Ib, XX }, +Ia_addb_Gb_Eb = { "add", "addb", Gb, Eb, XX }, +Ia_addl_EAX_Id = { "add", "addl", EAX, Id, XX }, +Ia_addl_Ed_Gd = { "add", "addl", Ed, Gd, XX }, +Ia_addl_Ed_Id = { "add", "addl", Ed, Id, XX }, +Ia_addl_Ed_sIb = { "add", "addl", Ed, sIbd, XX }, +Ia_addl_Gd_Ed = { "add", "addl", Gd, Ed, XX }, +Ia_addpd_Vpd_Wpd = { "addpd", "addpd", Vpd, Wpd, XX }, +Ia_addps_Vps_Wps = { "addps", "addps", Vps, Wps, XX }, +Ia_addq_Eq_Gq = { "add", "addq", Eq, Gq, XX }, +Ia_addq_Eq_sIb = { "add", "addq", Eq, sIbq, XX }, +Ia_addq_Eq_sId = { "add", "addq", Eq, sIdq, XX }, +Ia_addq_Gq_Eq = { "add", "addq", Gq, Eq, XX }, +Ia_addq_RAX_sId = { "add", "addq", RAX, sIdq, XX }, +Ia_addsd_Vsd_Wsd = { "addsd", "addsd", Vsd, Wsd, XX }, +Ia_addss_Vss_Wss = { "addss", "addss", Vss, Wss, XX }, +Ia_addsubpd_Vpd_Wpd = { "addsubpd", "addsubpd", Vpd, Wpd, XX }, +Ia_addsubps_Vps_Wps = { "addsubps", "addsubps", Vps, Wps, XX }, +Ia_addw_AX_Iw = { "add", "addw", AX, Iw, XX }, +Ia_addw_Ew_Gw = { "add", "addw", Ew, Gw, XX }, +Ia_addw_Ew_Iw = { "add", "addw", Ew, Iw, XX }, +Ia_addw_Ew_sIb = { "add", "addw", Ew, sIbw, XX }, +Ia_addw_Gw_Ew = { "add", "addw", Gw, Ew, XX }, +Ia_andb_AL_Ib = { "and", "andb", AL, Ib, XX }, +Ia_andb_Eb_Gb = { "and", "andb", Eb, Gb, XX }, +Ia_andb_Eb_Ib = { "and", "andb", Eb, Ib, XX }, +Ia_andb_Gb_Eb = { "and", "andb", Gb, Eb, XX }, +Ia_andl_EAX_Id = { "and", "andl", EAX, Id, XX }, +Ia_andl_Ed_Gd = { "and", "andl", Ed, Gd, XX }, +Ia_andl_Ed_Id = { "and", "andl", Ed, Id, XX }, +Ia_andl_Ed_sIb = { "and", "andl", Ed, sIbd, XX }, +Ia_andl_Gd_Ed = { "and", "andl", Gd, Ed, XX }, +Ia_andnpd_Vpd_Wpd = { "andnpd", "andnpd", Vpd, Wpd, XX }, +Ia_andnps_Vps_Wps = { "andnps", "andnps", Vps, Wps, XX }, +Ia_andpd_Vpd_Wpd = { "andpd", "andpd", Vpd, Wpd, XX }, +Ia_andps_Vps_Wps = { "andps", "andps", Vps, Wps, XX }, +Ia_andq_Eq_Gq = { "and", "andq", Eq, Gq, XX }, +Ia_andq_Eq_sIb = { "and", "andq", Eq, sIbq, XX }, +Ia_andq_Eq_sId = { "and", "andq", Eq, sIdq, XX }, +Ia_andq_Gq_Eq = { "and", "andq", Gq, Eq, XX }, +Ia_andq_RAX_sId = { "and", "andq", RAX, sIdq, XX }, +Ia_andw_AX_Iw = { "and", "andw", AX, Iw, XX }, +Ia_andw_Ew_Gw = { "and", "andw", Ew, Gw, XX }, +Ia_andw_Ew_Iw = { "and", "andw", Ew, Iw, XX }, +Ia_andw_Ew_sIb = { "and", "andw", Ew, sIbw, XX }, +Ia_andw_Gw_Ew = { "and", "andw", Gw, Ew, XX }, +Ia_arpl_Ew_Rw = { "arpl", "arpl", Ew, Rw, XX }, +Ia_boundl_Gd_Ma = { "bound", "boundl", Gd, Ma, XX }, +Ia_boundw_Gw_Ma = { "bound", "boundw", Gw, Ma, XX }, +Ia_bsfl_Gd_Ed = { "bsf", "bsfl", Gd, Ed, XX }, +Ia_bsfq_Gq_Eq = { "bsf", "bsfq", Gq, Eq, XX }, +Ia_bsfw_Gw_Ew = { "bsf", "bsfw", Gw, Ew, XX }, +Ia_bsrl_Gd_Ed = { "bsr", "bsrl", Gd, Ed, XX }, +Ia_bsrq_Gq_Eq = { "bsr", "bsrq", Gq, Eq, XX }, +Ia_bsrw_Gw_Ew = { "bsr", "bsrw", Gw, Ew, XX }, +Ia_bswapl_ERX = { "bswap", "bswapl", ERX, XX, XX }, +Ia_bswapq_RRX = { "bswap", "bswapq", RRX, XX, XX }, +Ia_btcl_Ed_Gd = { "btc", "btcl", Ed, Gd, XX }, +Ia_btcl_Ed_Ib = { "btc", "btcl", Ed, Ib, XX }, +Ia_btcq_Eq_Gq = { "btc", "btcq", Eq, Gq, XX }, +Ia_btcq_Eq_Ib = { "btc", "btcq", Eq, Ib, XX }, +Ia_btcw_Ew_Gw = { "btc", "btcw", Ew, Gw, XX }, +Ia_btcw_Ew_Ib = { "btc", "btcw", Ew, Ib, XX }, +Ia_btl_Ed_Gd = { "bt", "btl", Ed, Gd, XX }, +Ia_btl_Ed_Ib = { "bt", "btl", Ed, Ib, XX }, +Ia_btq_Eq_Gq = { "bt", "btq", Eq, Gq, XX }, +Ia_btq_Eq_Ib = { "bt", "btq", Eq, Ib, XX }, +Ia_btrl_Ed_Gd = { "btr", "btrl", Ed, Gd, XX }, +Ia_btrl_Ed_Ib = { "btr", "btrl", Ed, Ib, XX }, +Ia_btrq_Eq_Gq = { "btr", "btrq", Eq, Gq, XX }, +Ia_btrq_Eq_Ib = { "btr", "btrq", Eq, Ib, XX }, +Ia_btrw_Ew_Gw = { "btr", "btrw", Ew, Gw, XX }, +Ia_btrw_Ew_Ib = { "btr", "btrw", Ew, Ib, XX }, +Ia_btsl_Ed_Gd = { "bts", "btsl", Ed, Gd, XX }, +Ia_btsl_Ed_Ib = { "bts", "btsl", Ed, Ib, XX }, +Ia_btsq_Eq_Gq = { "bts", "btsq", Eq, Gq, XX }, +Ia_btsq_Eq_Ib = { "bts", "btsq", Eq, Ib, XX }, +Ia_btsw_Ew_Gw = { "bts", "btsw", Ew, Gw, XX }, +Ia_btsw_Ew_Ib = { "bts", "btsw", Ew, Ib, XX }, +Ia_btw_Ew_Gw = { "bt", "btw", Ew, Gw, XX }, +Ia_btw_Ew_Ib = { "bt", "btw", Ew, Ib, XX }, +Ia_call_Ed = { "call", "call", Ed, XX, XX }, +Ia_call_Eq = { "call", "call", Eq, XX, XX }, +Ia_call_Ew = { "call", "call", Ew, XX, XX }, +Ia_call_Jd = { "call", "call", Jd, XX, XX }, +Ia_call_Jw = { "call", "call", Jw, XX, XX }, +Ia_cbw = { "cbw", "cbtw", XX, XX, XX }, +Ia_cdq = { "cdq", "cltd", XX, XX, XX }, +Ia_cdqe = { "cdqe", "cltq", XX, XX, XX }, +Ia_cflush = { "cflush", "cflush", Mb, XX, XX }, +Ia_clc = { "clc", "clc", XX, XX, XX }, +Ia_cld = { "cld", "cld", XX, XX, XX }, +Ia_cli = { "cli", "cli", XX, XX, XX }, +Ia_clts = { "clts", "clts", XX, XX, XX }, +Ia_cmc = { "cmc", "cmc", XX, XX, XX }, +Ia_cmoval_Gd_Ed = { "cmova", "cmoval", Gd, Ed, XX }, +Ia_cmovaq_Gq_Eq = { "cmova", "cmovaq", Gq, Eq, XX }, +Ia_cmovaw_Gw_Ew = { "cmova", "cmovaw", Gw, Ew, XX }, +Ia_cmovcl_Gd_Ed = { "cmovc", "cmovcl", Gd, Ed, XX }, +Ia_cmovcq_Gq_Eq = { "cmovc", "cmovcq", Gq, Eq, XX }, +Ia_cmovcw_Gw_Ew = { "cmovc", "cmovcw", Gw, Ew, XX }, +Ia_cmovgl_Gd_Ed = { "cmovg", "cmovgl", Gd, Ed, XX }, +Ia_cmovgq_Gq_Eq = { "cmovg", "cmovgq", Gq, Eq, XX }, +Ia_cmovgw_Gw_Ew = { "cmovg", "cmovgw", Gw, Ew, XX }, +Ia_cmovll_Gd_Ed = { "cmovl", "cmovll", Gd, Ed, XX }, +Ia_cmovlq_Gq_Eq = { "cmovl", "cmovlq", Gq, Eq, XX }, +Ia_cmovlw_Gw_Ew = { "cmovl", "cmovlw", Gw, Ew, XX }, +Ia_cmovnal_Gd_Ed = { "cmovna", "cmovnal", Gd, Ed, XX }, +Ia_cmovnaq_Gq_Eq = { "cmovna", "cmovnaq", Gq, Eq, XX }, +Ia_cmovnaw_Gw_Ew = { "cmovna", "cmovnaw", Gw, Ew, XX }, +Ia_cmovncl_Gd_Ed = { "cmovnc", "cmovncl", Gd, Ed, XX }, +Ia_cmovncq_Gq_Eq = { "cmovnc", "cmovncq", Gq, Eq, XX }, +Ia_cmovncw_Gw_Ew = { "cmovnc", "cmovncw", Gw, Ew, XX }, +Ia_cmovngl_Gd_Ed = { "cmovng", "cmovngl", Gd, Ed, XX }, +Ia_cmovngq_Gq_Eq = { "cmovng", "cmovngq", Gq, Eq, XX }, +Ia_cmovngw_Gw_Ew = { "cmovng", "cmovngw", Gw, Ew, XX }, +Ia_cmovnll_Gd_Ed = { "cmovnl", "cmovnll", Gd, Ed, XX }, +Ia_cmovnlq_Gq_Eq = { "cmovnl", "cmovnlq", Gq, Eq, XX }, +Ia_cmovnlw_Gw_Ew = { "cmovnl", "cmovnlw", Gw, Ew, XX }, +Ia_cmovnol_Gd_Ed = { "cmovno", "cmovnol", Gd, Ed, XX }, +Ia_cmovnoq_Gq_Eq = { "cmovno", "cmovnoq", Gq, Eq, XX }, +Ia_cmovnow_Gw_Ew = { "cmovno", "cmovnow", Gw, Ew, XX }, +Ia_cmovnpl_Gd_Ed = { "cmovnp", "cmovnpl", Gd, Ed, XX }, +Ia_cmovnpq_Gq_Eq = { "cmovnp", "cmovnpq", Gq, Eq, XX }, +Ia_cmovnpw_Gw_Ew = { "cmovnp", "cmovnpw", Gw, Ew, XX }, +Ia_cmovnsl_Gd_Ed = { "cmovns", "cmovnsl", Gd, Ed, XX }, +Ia_cmovnsq_Gq_Eq = { "cmovns", "cmovnsq", Gq, Eq, XX }, +Ia_cmovnsw_Gw_Ew = { "cmovns", "cmovnsw", Gw, Ew, XX }, +Ia_cmovnzl_Gd_Ed = { "cmovnz", "cmovnzl", Gd, Ed, XX }, +Ia_cmovnzq_Gq_Eq = { "cmovnz", "cmovnzq", Gq, Eq, XX }, +Ia_cmovnzw_Gw_Ew = { "cmovnz", "cmovnzw", Gw, Ew, XX }, +Ia_cmovol_Gd_Ed = { "cmovo", "cmovol", Gd, Ed, XX }, +Ia_cmovoq_Gq_Eq = { "cmovo", "cmovoq", Gq, Eq, XX }, +Ia_cmovow_Gw_Ew = { "cmovo", "cmovow", Gw, Ew, XX }, +Ia_cmovpl_Gd_Ed = { "cmovp", "cmovpl", Gd, Ed, XX }, +Ia_cmovpq_Gq_Eq = { "cmovp", "cmovpq", Gq, Eq, XX }, +Ia_cmovpw_Gw_Ew = { "cmovp", "cmovpw", Gw, Ew, XX }, +Ia_cmovsl_Gd_Ed = { "cmovs", "cmovsl", Gd, Ed, XX }, +Ia_cmovsq_Gq_Eq = { "cmovs", "cmovsq", Gq, Eq, XX }, +Ia_cmovsw_Gw_Ew = { "cmovs", "cmovsw", Gw, Ew, XX }, +Ia_cmovzl_Gd_Ed = { "cmovz", "cmovzl", Gd, Ed, XX }, +Ia_cmovzq_Gq_Eq = { "cmovz", "cmovzq", Gq, Eq, XX }, +Ia_cmovzw_Gw_Ew = { "cmovz", "cmovzw", Gw, Ew, XX }, +Ia_cmpb_AL_Ib = { "cmp", "cmpb", AL, Ib, XX }, +Ia_cmpb_Eb_Gb = { "cmp", "cmpb", Eb, Gb, XX }, +Ia_cmpb_Eb_Ib = { "cmp", "cmpb", Eb, Ib, XX }, +Ia_cmpb_Gb_Eb = { "cmp", "cmpb", Gb, Eb, XX }, +Ia_cmpl_EAX_Id = { "cmp", "cmpl", EAX, Id, XX }, +Ia_cmpl_Ed_Gd = { "cmp", "cmpl", Ed, Gd, XX }, +Ia_cmpl_Ed_Id = { "cmp", "cmpl", Ed, Id, XX }, +Ia_cmpl_Ed_sIb = { "cmp", "cmpl", Ed, sIbd, XX }, +Ia_cmpl_Gd_Ed = { "cmp", "cmpl", Gd, Ed, XX }, +Ia_cmppd_Vpd_Wpd_Ib = { "cmppd", "cmppd", Vpd, Wpd, Ib }, +Ia_cmpps_Vps_Wps_Ib = { "cmpps", "cmpps", Vps, Wps, Ib }, +Ia_cmpq_Eq_Gq = { "cmp", "cmpq", Eq, Gq, XX }, +Ia_cmpq_Eq_sIb = { "cmp", "cmpq", Eq, sIbq, XX }, +Ia_cmpq_Eq_sId = { "cmp", "cmpq", Eq, sIdq, XX }, +Ia_cmpq_Gq_Eq = { "cmp", "cmpq", Gq, Eq, XX }, +Ia_cmpq_RAX_sId = { "cmp", "cmpq", RAX, sIdq, XX }, +Ia_cmpsb_Yb_Xb = { "cmpsb", "cmpsb", Yb, Xb, XX }, +Ia_cmpsd_Vsd_Wsd_Ib = { "cmpsd", "cmpsd", Vsd, Wsd, Ib }, +Ia_cmpsl_Yd_Xd = { "cmpsd", "cmpsl", Yd, Xd, XX }, +Ia_cmpsq_Yq_Xq = { "cmpsq", "cmpsq", Yq, Xq, XX }, +Ia_cmpss_Vss_Wss_Ib = { "cmpss", "cmpss", Vss, Wss, Ib }, +Ia_cmpsw_Yw_Xw = { "cmpsw", "cmpsw", Yw, Xw, XX }, +Ia_cmpw_AX_Iw = { "cmp", "cmpw", AX, Iw, XX }, +Ia_cmpw_Ew_Gw = { "cmp", "cmpw", Ew, Gw, XX }, +Ia_cmpw_Ew_Iw = { "cmp", "cmpw", Ew, Iw, XX }, +Ia_cmpw_Ew_sIb = { "cmp", "cmpw", Ew, sIbw, XX }, +Ia_cmpw_Gw_Ew = { "cmp", "cmpw", Gw, Ew, XX }, +Ia_cmpxchg16b = { "cmpxchg16b", "cmpxchg16b", Mdq, XX, XX }, +Ia_cmpxchg8b = { "cmpxchg8b", "cmpxchg8b", Mq, XX, XX }, +Ia_cmpxchgb_Eb_Gb = { "cmpxchg", "cmpxchgb", Eb, Gb, XX }, +Ia_cmpxchgl_Ed_Gd = { "cmpxchg", "cmpxchgl", Ed, Gd, XX }, +Ia_cmpxchgq_Eq_Gq = { "cmpxchg", "cmpxchgq", Eq, Gq, XX }, +Ia_cmpxchgw_Ew_Gw = { "cmpxchg", "cmpxchgw", Ew, Gw, XX }, +Ia_comisd_Vsd_Wsd = { "comisd", "comisd", Vsd, Wsd, XX }, +Ia_comiss_Vss_Wss = { "comiss", "comiss", Vss, Wss, XX }, +Ia_cpuid = { "cpuid", "cpuid", XX, XX, XX }, +Ia_cqo = { "cqo", "cqto", XX, XX, XX }, +Ia_cvtdq2pd_Vpd_Wq = { "cvtdq2pd", "cvtdq2pd", Vpd, Wq, XX }, +Ia_cvtdq2ps_Vps_Wdq = { "cvtdq2ps", "cvtdq2ps", Vps, Wdq, XX }, +Ia_cvtpd2dq_Vq_Wpd = { "cvtpd2dq", "cvtpd2dq", Vq, Wpd, XX }, +Ia_cvtpd2pi_Pq_Wpd = { "cvtpd2pi", "cvtpd2pi", Pq, Wpd, XX }, +Ia_cvtpd2ps_Vps_Wpd = { "cvtpd2ps", "cvtpd2ps", Vps, Wpd, XX }, +Ia_cvtpi2pd_Vpd_Qq = { "cvtpi2pd", "cvtpi2pd", Vpd, Qq, XX }, +Ia_cvtpi2ps_Vps_Qq = { "cvtpi2ps", "cvtpi2ps", Vps, Qq, XX }, +Ia_cvtps2dq_Vdq_Wps = { "cvtps2dq", "cvtps2dq", Vdq, Wps, XX }, +Ia_cvtps2pd_Vpd_Wps = { "cvtps2pd", "cvtps2pd", Vpd, Wps, XX }, +Ia_cvtps2pi_Pq_Wps = { "cvtps2pi", "cvtps2pi", Pq, Wps, XX }, +Ia_cvtsd2si_Gd_Wsd = { "cvtsd2si", "cvtsd2si", Gd, Wsd, XX }, +Ia_cvtsd2si_Gq_Wsd = { "cvtsd2si", "cvtsd2si", Gq, Wsd, XX }, +Ia_cvtsd2ss_Vss_Wsd = { "cvtsd2ss", "cvtsd2ss", Vss, Wsd, XX }, +Ia_cvtsi2sd_Vsd_Ed = { "cvtsi2sd", "cvtsi2sd", Vsd, Ed, XX }, +Ia_cvtsi2sd_Vsd_Eq = { "cvtsi2sd", "cvtsi2sd", Vsd, Eq, XX }, +Ia_cvtsi2ss_Vss_Ed = { "cvtsi2ss", "cvtsi2ss", Vss, Ed, XX }, +Ia_cvtsi2ss_Vss_Eq = { "cvtsi2ss", "cvtsi2ss", Vss, Eq, XX }, +Ia_cvtss2sd_Vsd_Wss = { "cvtss2sd", "cvtss2sd", Vsd, Wss, XX }, +Ia_cvtss2si_Gd_Wss = { "cvtss2si", "cvtss2si", Gd, Wss, XX }, +Ia_cvtss2si_Gq_Wss = { "cvtss2si", "cvtss2si", Gq, Wss, XX }, +Ia_cvttpd2dq_Vq_Wpd = { "cvttpd2dq", "cvttpd2dq", Vq, Wpd, XX }, +Ia_cvttpd2pi_Pq_Wpd = { "cvttpd2pi", "cvttpd2pi", Pq, Wpd, XX }, +Ia_cvttps2dq_Vdq_Wps = { "cvttps2dq", "cvttps2dq", Vdq, Wps, XX }, +Ia_cvttps2pi_Pq_Wps = { "cvttps2pi", "cvttps2pi", Pq, Wps, XX }, +Ia_cvttsd2si_Gd_Wsd = { "cvttsd2si", "cvttsd2si", Gd, Wsd, XX }, +Ia_cvttsd2si_Gq_Wsd = { "cvttsd2si", "cvttsd2si", Gq, Wsd, XX }, +Ia_cvttss2si_Gd_Wss = { "cvttss2si", "cvttss2si", Gd, Wss, XX }, +Ia_cvttss2si_Gq_Wss = { "cvttss2si", "cvttss2si", Gq, Wss, XX }, +Ia_cwd = { "cwd", "cwtd", XX, XX, XX }, +Ia_cwde = { "cwde", "cwtl", XX, XX, XX }, +Ia_daa = { "daa", "daa", XX, XX, XX }, +Ia_das = { "das", "das", XX, XX, XX }, +Ia_decb_Eb = { "dec", "decb", Eb, XX, XX }, +Ia_decl_Ed = { "dec", "decl", Ed, XX, XX }, +Ia_decl_ERX = { "dec", "decl", ERX, XX, XX }, +Ia_decq_Eq = { "dec", "decq", Eq, XX, XX }, +Ia_decw_Ew = { "dec", "decw", Ew, XX, XX }, +Ia_decw_RX = { "dec", "decw", RX, XX, XX }, +Ia_divb_AL_Eb = { "div", "divb", AL, Eb, XX }, +Ia_divl_EAX_Ed = { "div", "divl", EAX, Ed, XX }, +Ia_divpd_Vpd_Wpd = { "divpd", "divpd", Vpd, Wpd, XX }, +Ia_divps_Vps_Wps = { "divps", "divps", Vps, Wps, XX }, +Ia_divq_RAX_Eq = { "div", "divq", RAX, Eq, XX }, +Ia_divsd_Vsd_Wsd = { "divsd", "divsd", Vsd, Wsd, XX }, +Ia_divss_Vss_Wss = { "divss", "divss", Vss, Wss, XX }, +Ia_divw_AX_Ew = { "div", "divw", AX, Ew, XX }, +Ia_emms = { "emms", "emms", XX, XX, XX }, +Ia_enter = { "enter", "enter", IwIb, XX, XX }, +Ia_error = { "(error)", "(error)", XX, XX, XX }, +Ia_f2xm1 = { "f2xm1", "f2xm1", XX, XX, XX }, +Ia_fabs = { "fabs", "fabs", XX, XX, XX }, +Ia_fadd_ST0_STi = { "fadd", "fadd", ST0, STi, XX }, +Ia_fadd_STi_ST0 = { "fadd", "fadd", STi, ST0, XX }, +Ia_faddl_Mq = { "fadd", "faddl", Mq, XX, XX }, +Ia_faddp_STi_ST0 = { "faddp", "faddp", STi, ST0, XX }, +Ia_fadds_Md = { "fadd", "fadds", Md, XX, XX }, +Ia_fbldt_Mt = { "fbld", "fbldt", Mt, XX, XX }, +Ia_fbstpt_Mt = { "fbstp", "fbstpt", Mt, XX, XX }, +Ia_fchs = { "fchs", "fchs", XX, XX, XX }, +Ia_fcmovb_ST0_STi = { "fcmovb", "fcmovb", ST0, STi, XX }, +Ia_fcmovbe_ST0_STi = { "fcmovbe", "fcmovbe", ST0, STi, XX }, +Ia_fcmove_ST0_STi = { "fcmove", "fcmove", ST0, STi, XX }, +Ia_fcmovnb_ST0_STi = { "fcmovnb", "fcmovnb", ST0, STi, XX }, +Ia_fcmovnbe_ST0_STi = { "fcmovnbe", "fcmovnbe", ST0, STi, XX }, +Ia_fcmovne_ST0_STi = { "fcmovne", "fcmovne", ST0, STi, XX }, +Ia_fcmovnu_ST0_STi = { "fcmovnu", "fcmovnu", ST0, STi, XX }, +Ia_fcmovu_ST0_STi = { "fcmovu", "fcmovu", ST0, STi, XX }, +Ia_fcom_STi = { "fcom", "fcom", STi, XX, XX }, +Ia_fcomi_ST0_STi = { "fcomi", "fcomi", ST0, STi, XX }, +Ia_fcomip_ST0_STi = { "fcomip", "fcomip", ST0, STi, XX }, +Ia_fcoml_Mq = { "fcom", "fcoml", Mq, XX, XX }, +Ia_fcomp_STi = { "fcomp", "fcomp", STi, XX, XX }, +Ia_fcompl_Mq = { "fcomp", "fcompl", Mq, XX, XX }, +Ia_fcompp = { "fcompp", "fcompp", XX, XX, XX }, +Ia_fcomps_Md = { "fcomp", "fcomps", Md, XX, XX }, +Ia_fcoms_Md = { "fcom", "fcoms", Md, XX, XX }, +Ia_fcos = { "fcos", "fcos", XX, XX, XX }, +Ia_fdecstp = { "fdecstp", "fdecstp", XX, XX, XX }, +Ia_fdisi = { "fdisi (287 legacy)", "fdisi (287 legacy)", XX, XX, XX }, +Ia_fdiv_ST0_STi = { "fdiv", "fdiv", ST0, STi, XX }, +Ia_fdiv_STi_ST0 = { "fdiv", "fdiv", STi, ST0, XX }, +Ia_fdivl_Mq = { "fdiv", "fdivl", Mq, XX, XX }, +Ia_fdivp_STi_ST0 = { "fdivp", "fdivp", STi, ST0, XX }, +Ia_fdivr_ST0_STi = { "fdivr", "fdivr", ST0, STi, XX }, +Ia_fdivr_STi_ST0 = { "fdivr", "fdivr", STi, ST0, XX }, +Ia_fdivrl_Mq = { "fdivr", "fdivrl", Mq, XX, XX }, +Ia_fdivrp_STi_ST0 = { "fdivrp", "fdivrp", STi, ST0, XX }, +Ia_fdivrs_Md = { "fdivr", "fdivrs", Md, XX, XX }, +Ia_fdivs_Md = { "fdiv", "fdivs", Md, XX, XX }, +Ia_femms = { "femms", "femms", XX, XX, XX }, +Ia_feni = { "feni (287 legacy)", "feni(287 legacy)", XX, XX, XX }, +Ia_ffree_STi = { "ffree", "ffree", STi, XX, XX }, +Ia_ffreep_STi = { "ffreep", "ffreep", STi, XX, XX }, +Ia_fiaddl_Md = { "fiadd", "fiaddl", Md, XX, XX }, +Ia_fiadds_Mw = { "fiadd", "fiadds", Mw, XX, XX }, +Ia_ficoml_Md = { "ficom", "ficoml", Md, XX, XX }, +Ia_ficompl_Md = { "ficomp", "ficompl", Md, XX, XX }, +Ia_ficomps_Mw = { "ficomp", "ficomps", Mw, XX, XX }, +Ia_ficoms_Mw = { "ficom", "ficoms", Mw, XX, XX }, +Ia_fidivl_Md = { "fidiv", "fidivl", Md, XX, XX }, +Ia_fidivrl_Md = { "fidivr", "fidivrl", Md, XX, XX }, +Ia_fidivrs_Mw = { "fidivr", "fidivrs", Mw, XX, XX }, +Ia_fidivs_Mw = { "fidiv", "fidivs", Mw, XX, XX }, +Ia_fildl_Md = { "fild", "fildl", Md, XX, XX }, +Ia_fildq_Mq = { "fild", "fildq", Mq, XX, XX }, +Ia_filds_Mw = { "fild", "filds", Mw, XX, XX }, +Ia_fimull_Md = { "fimul", "fimull", Md, XX, XX }, +Ia_fimuls_Mw = { "fimul", "fimuls", Mw, XX, XX }, +Ia_fincstp = { "fincstp", "fincstp", XX, XX, XX }, +Ia_fistl_Md = { "fist", "fistl", Md, XX, XX }, +Ia_fistpl_Md = { "fistp", "fistpl", Md, XX, XX }, +Ia_fistpq_Mq = { "fistp", "fistpq", Mq, XX, XX }, +Ia_fistps_Mw = { "fistp", "fistps", Mw, XX, XX }, +Ia_fists_Mw = { "fist", "fists", Mw, XX, XX }, +Ia_fisttpl_Md = { "fisttp", "fisttpl", Md, XX, XX }, +Ia_fisttpq_Mq = { "fisttp", "fisttpq", Mq, XX, XX }, +Ia_fisttps_Mw = { "fisttp", "fisttps", Mw, XX, XX }, +Ia_fisubl_Md = { "fisub", "fisubl", Md, XX, XX }, +Ia_fisubrl_Md = { "fisubr", "fisubrl", Md, XX, XX }, +Ia_fisubrs_Mw = { "fisubr", "fisubrs", Mw, XX, XX }, +Ia_fisubs_Mw = { "fisub", "fisubs", Mw, XX, XX }, +Ia_fld_STi = { "fld", "fld", STi, XX, XX }, +Ia_fld1 = { "fld1", "fld1", XX, XX, XX }, +Ia_fldcw = { "fldcw", "fldcw", Ew, XX, XX }, +Ia_fldenv = { "fldenv", "fldenv", Mx, XX, XX }, +Ia_fldl_Mq = { "fld", "fldl", Mq, XX, XX }, +Ia_fldl2e = { "fldl2e", "fldl2e", XX, XX, XX }, +Ia_fldl2t = { "fldl2t", "fldl2t", XX, XX, XX }, +Ia_fldlg2 = { "fldlg2", "fldlg2", XX, XX, XX }, +Ia_fldln2 = { "fldln2", "fldln2", XX, XX, XX }, +Ia_fldpi = { "fldpi", "fldpi", XX, XX, XX }, +Ia_flds_Md = { "fld", "flds", Md, XX, XX }, +Ia_fldt_Mt = { "fld", "fldt", Mt, XX, XX }, +Ia_fldz = { "fldz", "fldz", XX, XX, XX }, +Ia_fmul_ST0_STi = { "fmul", "fmul", ST0, STi, XX }, +Ia_fmul_STi_ST0 = { "fmul", "fmul", STi, ST0, XX }, +Ia_fmull_Mq = { "fmul", "fmull", Mq, XX, XX }, +Ia_fmulp_STi_ST0 = { "fmulp", "fmulp", STi, ST0, XX }, +Ia_fmuls_Md = { "fmul", "fmuls", Md, XX, XX }, +Ia_fnclex = { "fnclex", "fnclex", XX, XX, XX }, +Ia_fninit = { "fninit", "fninit", XX, XX, XX }, +Ia_fnop = { "fnop", "fnop", XX, XX, XX }, +Ia_fnsave = { "fnsave", "fnsave", Mx, XX, XX }, +Ia_fnstcw = { "fnstcw", "fnstcw", Mw, XX, XX }, +Ia_fnstenv = { "fnstenv", "fnstenv", Mx, XX, XX }, +Ia_fnstsw = { "fnstsw", "fnstsw", Mw, XX, XX }, +Ia_fnstsw_AX = { "fnstsw", "fnstsw", AX, XX, XX }, +Ia_fpatan = { "fpatan", "fpatan", XX, XX, XX }, +Ia_fprem = { "fprem", "fprem", XX, XX, XX }, +Ia_fprem1 = { "fprem1", "fprem1", XX, XX, XX }, +Ia_fptan = { "fptan", "fptan", XX, XX, XX }, +Ia_frndint = { "frndint", "frndint", XX, XX, XX }, +Ia_frstor = { "frstor", "frstor", Mx, XX, XX }, +Ia_fscale = { "fscale", "fscale", XX, XX, XX }, +Ia_fsetpm = { "fsetpm (287 legacy)", "fsetpm (287 legacy)", XX, XX, XX }, +Ia_fsin = { "fsin", "fsin", XX, XX, XX }, +Ia_fsincos = { "fsincos", "fsincos", XX, XX, XX }, +Ia_fsqrt = { "fsqrt", "fsqrt", XX, XX, XX }, +Ia_fst_STi = { "fst", "fst", STi, XX, XX }, +Ia_fstl_Mq = { "fst", "fstl", Mq, XX, XX }, +Ia_fstp_STi = { "fstp", "fstp", STi, XX, XX }, +Ia_fstpl_Mq = { "fstp", "fstpl", Mq, XX, XX }, +Ia_fstps_Md = { "fstp", "fstps", Md, XX, XX }, +Ia_fstpt_Mt = { "fstp", "fstpt", Mt, XX, XX }, +Ia_fsts_Md = { "fst", "fsts", Md, XX, XX }, +Ia_fsub_ST0_STi = { "fsub", "fsub", ST0, STi, XX }, +Ia_fsub_STi_ST0 = { "fsub", "fsub", STi, ST0, XX }, +Ia_fsubl_Mq = { "fsub", "fsubl", Mq, XX, XX }, +Ia_fsubp_STi_ST0 = { "fsubp", "fsubp", STi, ST0, XX }, +Ia_fsubr_ST0_STi = { "fsubr", "fsubr", ST0, STi, XX }, +Ia_fsubr_STi_ST0 = { "fsubr", "fsubr", STi, ST0, XX }, +Ia_fsubrl_Mq = { "fsubr", "fsubrl", Mq, XX, XX }, +Ia_fsubrp_STi_ST0 = { "fsubrp", "fsubrp", STi, ST0, XX }, +Ia_fsubrs_Md = { "fsubr", "fsubrs", Md, XX, XX }, +Ia_fsubs_Md = { "fsub", "fsubs", Md, XX, XX }, +Ia_ftst = { "ftst", "ftst", XX, XX, XX }, +Ia_fucom_STi = { "fucom", "fucom", STi, XX, XX }, +Ia_fucomi_ST0_STi = { "fucomi", "fucomi", ST0, STi, XX }, +Ia_fucomip_ST0_STi = { "fucomip", "fucomip", ST0, STi, XX }, +Ia_fucomp_STi = { "fucomp", "fucomp", STi, XX, XX }, +Ia_fucompp = { "fucompp", "fucompp", XX, XX, XX }, +Ia_fwait = { "fwait", "fwait", XX, XX, XX }, +Ia_fxam = { "fxam", "fxam", XX, XX, XX }, +Ia_fxch = { "fxch", "fxch", STi, XX, XX }, +Ia_fxrstor = { "fxrstor", "fxrstor", Mx, XX, XX }, +Ia_fxsave = { "fxsave", "fxsave", Mx, XX, XX }, +Ia_fxtract = { "fxtract", "fxtract", XX, XX, XX }, +Ia_fyl2x = { "fyl2x", "fyl2x", XX, XX, XX }, +Ia_fyl2xp1 = { "fyl2xp1", "fyl2xp1", XX, XX, XX }, +Ia_haddpd_Vpd_Wpd = { "haddpd", "haddpd", Vpd, Wpd, XX }, +Ia_haddps_Vps_Wps = { "haddps", "haddps", Vps, Wps, XX }, +Ia_hlt = { "hlt", "hlt", XX, XX, XX }, +Ia_hsubpd_Vpd_Wpd = { "hsubpd", "hsubpd", Vpd, Wpd, XX }, +Ia_hsubps_Vps_Wps = { "hsubps", "hsubps", Vps, Wps, XX }, +Ia_idivb_AL_Eb = { "idiv", "idivb", AL, Eb, XX }, +Ia_idivl_EAX_Ed = { "idiv", "idivl", EAX, Ed, XX }, +Ia_idivq_RAX_Eq = { "idiv", "idivq", RAX, Eq, XX }, +Ia_idivw_AX_Ew = { "idiv", "idivw", AX, Ew, XX }, +Ia_imulb_AL_Eb = { "imul", "imulb", AL, Eb, XX }, +Ia_imull_EAX_Ed = { "imul", "imull", EAX, Ed, XX }, +Ia_imull_Gd_Ed = { "imul", "imull", Gd, Ed, XX }, +Ia_imull_Gd_Ed_Id = { "imul", "imull", Gd, Ed, Id }, +Ia_imull_Gd_Ed_sIb = { "imul", "imull", Gd, Ed, sIbd }, +Ia_imulq_Gq_Eq = { "imul", "imulq", Gq, Eq, XX }, +Ia_imulq_Gq_Eq_sIb = { "imul", "imulq", Gq, Eq, sIbq }, +Ia_imulq_Gq_Eq_sId = { "imul", "imulq", Gq, Eq, sIdq }, +Ia_imulq_RAX_Eq = { "imul", "imulq", RAX, Eq, XX }, +Ia_imulw_AX_Ew = { "imul", "imulw", AX, Ew, XX }, +Ia_imulw_Gw_Ew = { "imul", "imulw", Gw, Ew, XX }, +Ia_imulw_Gw_Ew_Iw = { "imul", "imulw", Gw, Ew, Iw }, +Ia_imulw_Gw_Ew_sIb = { "imul", "imulw", Gw, Ew, sIbw }, +Ia_inb_AL_DX = { "in", "inb", AL, DX, XX }, +Ia_inb_AL_Ib = { "in", "inb", AL, Ib, XX }, +Ia_incb_Eb = { "inc", "incb", Eb, XX, XX }, +Ia_incl_Ed = { "inc", "incl", Ed, XX, XX }, +Ia_incl_ERX = { "inc", "incl", ERX, XX, XX }, +Ia_incq_Eq = { "inc", "incq", Eq, XX, XX }, +Ia_incw_Ew = { "inc", "incw", Ew, XX, XX }, +Ia_incw_RX = { "inc", "incw", RX, XX, XX }, +Ia_inl_EAX_DX = { "in", "inl", EAX, DX, XX }, +Ia_inl_EAX_Ib = { "in", "inl", EAX, Ib, XX }, +Ia_insb_Yb_DX = { "insb", "insb", Yb, DX, XX }, +Ia_insl_Yd_DX = { "insd", "insl", Yd, DX, XX }, +Ia_insw_Yw_DX = { "insw", "insw", Yw, DX, XX }, +Ia_int_Ib = { "int", "int", Ib, XX, XX }, +Ia_int1 = { "int1", "int1", XX, XX, XX }, +Ia_int3 = { "int3", "int3", XX, XX, XX }, +Ia_into = { "into", "into", XX, XX, XX }, +Ia_Invalid = { "(invalid)", "(invalid)", XX, XX, XX }, +Ia_invd = { "invd", "invd", XX, XX, XX }, +Ia_invlpg = { "invlpg", "invlpg", Mx, XX, XX }, +Ia_inw_AX_DX = { "in", "inw", AX, DX, XX }, +Ia_inw_AX_Ib = { "in", "inw", AX, Ib, XX }, +Ia_iretl = { "iretd", "iretd", XX, XX, XX }, +Ia_iretq = { "iretq", "iretq", XX, XX, XX }, +Ia_iretw = { "iret", "iretw", XX, XX, XX }, +Ia_jb_Jb = { "jb", "jb", Jb, XX, XX }, +Ia_jb_Jd = { "jb", "jb", Jd, XX, XX }, +Ia_jb_Jw = { "jb", "jb", Jw, XX, XX }, +Ia_jbe_Jb = { "jbe", "jbe", Jb, XX, XX }, +Ia_jbe_Jd = { "jbe", "jbe", Jd, XX, XX }, +Ia_jbe_Jw = { "jbe", "jbe", Jw, XX, XX }, +Ia_jcxz_Jb = { "jcxz", "jcxz", Jb, XX, XX }, +Ia_jecxz_Jb = { "jecxz", "jecxz", Jb, XX, XX }, +Ia_jl_Jb = { "jl", "jl", Jb, XX, XX }, +Ia_jl_Jd = { "jl", "jl", Jd, XX, XX }, +Ia_jl_Jw = { "jl", "jl", Jw, XX, XX }, +Ia_jle_Jb = { "jle", "jle", Jb, XX, XX }, +Ia_jle_Jd = { "jle", "jle", Jd, XX, XX }, +Ia_jle_Jw = { "jle", "jle", Jw, XX, XX }, +Ia_jmp_Ed = { "jmp", "jmp", Ed, XX, XX }, +Ia_jmp_Eq = { "jmp", "jmp", Eq, XX, XX }, +Ia_jmp_Ew = { "jmp", "jmp", Ew, XX, XX }, +Ia_jmp_Jb = { "jmp", "jmp", Jb, XX, XX }, +Ia_jmp_Jd = { "jmp", "jmp", Jd, XX, XX }, +Ia_jmp_Jw = { "jmp", "jmp", Jw, XX, XX }, +Ia_jnb_Jb = { "jnb", "jnb", Jb, XX, XX }, +Ia_jnb_Jd = { "jnb", "jnb", Jd, XX, XX }, +Ia_jnb_Jw = { "jnb", "jnb", Jw, XX, XX }, +Ia_jnbe_Jb = { "jnbe", "jnbe", Jb, XX, XX }, +Ia_jnbe_Jd = { "jnbe", "jnbe", Jd, XX, XX }, +Ia_jnbe_Jw = { "jnbe", "jnbe", Jw, XX, XX }, +Ia_jnl_Jb = { "jnl", "jnl", Jb, XX, XX }, +Ia_jnl_Jd = { "jnl", "jnl", Jd, XX, XX }, +Ia_jnl_Jw = { "jnl", "jnl", Jw, XX, XX }, +Ia_jnle_Jb = { "jnle", "jnle", Jb, XX, XX }, +Ia_jnle_Jd = { "jnle", "jnle", Jd, XX, XX }, +Ia_jnle_Jw = { "jnle", "jnle", Jw, XX, XX }, +Ia_jno_Jb = { "jno", "jno", Jb, XX, XX }, +Ia_jno_Jd = { "jno", "jno", Jd, XX, XX }, +Ia_jno_Jw = { "jno", "jno", Jw, XX, XX }, +Ia_jnp_Jb = { "jnp", "jnp", Jb, XX, XX }, +Ia_jnp_Jd = { "jnp", "jnp", Jd, XX, XX }, +Ia_jnp_Jw = { "jnp", "jnp", Jw, XX, XX }, +Ia_jns_Jb = { "jns", "jns", Jb, XX, XX }, +Ia_jns_Jd = { "jns", "jns", Jd, XX, XX }, +Ia_jns_Jw = { "jns", "jns", Jw, XX, XX }, +Ia_jnz_Jb = { "jnz", "jnz", Jb, XX, XX }, +Ia_jnz_Jd = { "jnz", "jnz", Jd, XX, XX }, +Ia_jnz_Jw = { "jnz", "jnz", Jw, XX, XX }, +Ia_jo_Jb = { "jo", "jo", Jb, XX, XX }, +Ia_jo_Jd = { "jo", "jo", Jd, XX, XX }, +Ia_jo_Jw = { "jo", "jo", Jw, XX, XX }, +Ia_jp_Jb = { "jp", "jp", Jb, XX, XX }, +Ia_jp_Jd = { "jp", "jp", Jd, XX, XX }, +Ia_jp_Jw = { "jp", "jp", Jw, XX, XX }, +Ia_jrcxz_Jb = { "jrcxz", "jrcxz", Jb, XX, XX }, +Ia_js_Jb = { "js", "js", Jb, XX, XX }, +Ia_js_Jd = { "js", "js", Jd, XX, XX }, +Ia_js_Jw = { "js", "js", Jw, XX, XX }, +Ia_jz_Jb = { "jz", "jz", Jb, XX, XX }, +Ia_jz_Jd = { "jz", "jz", Jd, XX, XX }, +Ia_jz_Jw = { "jz", "jz", Jw, XX, XX }, +Ia_lahf = { "lahf", "lahf", XX, XX, XX }, +Ia_larl_Gd_Ew = { "lar", "larl", Gd, Ew, XX }, +Ia_larq_Gq_Ew = { "lar", "larq", Gq, Ew, XX }, +Ia_larw_Gw_Ew = { "lar", "larw", Gw, Ew, XX }, +Ia_lcall_Apd = { "call far", "lcall", Apd, XX, XX }, +Ia_lcall_Apw = { "call far", "lcall", Apw, XX, XX }, +Ia_lcall_Mp = { "call far", "lcall", Mp, XX, XX }, +Ia_lddqu_Vdq_Mdq = { "lddqu", "lddqu", Vdq, Mdq, XX }, +Ia_ldmxcsr = { "ldmxcsr", "ldmxcsr", Md, XX, XX }, +Ia_ldsl_Gd_Mp = { "lds", "ldsl", Gd, Mp, XX }, +Ia_ldsw_Gw_Mp = { "lds", "ldsw", Gw, Mp, XX }, +Ia_leal_Gd_Md = { "lea", "leal", Gd, Md, XX }, +Ia_leaq_Gq_Mq = { "lea", "leaq", Gq, Mq, XX }, +Ia_leave = { "leave", "leave", XX, XX, XX }, +Ia_leaw_Gw_Mw = { "lea", "leaw", Gw, Mw, XX }, +Ia_lesl_Gd_Mp = { "les", "lesl", Gd, Mp, XX }, +Ia_lesw_Gw_Mp = { "les", "lesw", Gw, Mp, XX }, +Ia_lfence = { "lfence", "lfence", XX, XX, XX }, +Ia_lfsl_Gd_Mp = { "lfs", "lfsl", Gd, Mp, XX }, +Ia_lfsq_Gq_Mp = { "lfs", "lfsq", Gq, Mp, XX }, +Ia_lfsw_Gw_Mp = { "lfs", "lfsw", Gw, Mp, XX }, +Ia_lgdt = { "lgdt", "lgdt", Ms, XX, XX }, +Ia_lgsl_Gd_Mp = { "lgs", "lgsl", Gd, Mp, XX }, +Ia_lgsq_Gq_Mp = { "lgs", "lgsq", Gq, Mp, XX }, +Ia_lgsw_Gw_Mp = { "lgs", "lgsw", Gw, Mp, XX }, +Ia_lidt = { "lidt", "lidt", Ms, XX, XX }, +Ia_ljmp_Apd = { "jmp far", "ljmp", Apd, XX, XX }, +Ia_ljmp_Apw = { "jmp far", "ljmp", Apw, XX, XX }, +Ia_ljmp_Mp = { "jmp far", "ljmp", Mp, XX, XX }, +Ia_lldt = { "lldt", "lldt", Ew, XX, XX }, +Ia_lmsw_Ew = { "lmsw", "lmsw", Ew, XX, XX }, +Ia_lodsb_AL_Xb = { "lodsb", "lodsb", AL, Xb, XX }, +Ia_lodsl_EAX_Xd = { "lodsd", "lodsl", EAX, Xd, XX }, +Ia_lodsq_RAX_Xq = { "lodsq", "lodsq", RAX, Xq, XX }, +Ia_lodsw_AX_Xw = { "lodsw", "lodsw", AX, Xw, XX }, +Ia_loop_Jb = { "loop", "loop", Jb, XX, XX }, +Ia_loope_Jb = { "loope", "loope", Jb, XX, XX }, +Ia_loopne_Jb = { "loopne", "loopne", Jb, XX, XX }, +Ia_lret = { "retf", "lret", XX, XX, XX }, +Ia_lret_Iw = { "retf", "lret", Iw, XX, XX }, +Ia_lsll_Gd_Ew = { "lsl", "lsll", Gd, Ew, XX }, +Ia_lslq_Gq_Ew = { "lsl", "lslq", Gq, Ew, XX }, +Ia_lslw_Gw_Ew = { "lsl", "lslw", Gw, Ew, XX }, +Ia_lssl_Gd_Mp = { "lss", "lssl", Gd, Mp, XX }, +Ia_lssq_Gq_Mp = { "lss", "lssq", Gq, Mp, XX }, +Ia_lssw_Gw_Mp = { "lss", "lssw", Gw, Mp, XX }, +Ia_ltr = { "ltr", "ltr", Ew, XX, XX }, +Ia_maskmovdqu_Vdq_Udq = { "maskmovdqu", "maskmovdqu", Vdq, Udq, XX }, +Ia_maskmovq_Pq_Nq = { "maskmovq", "maskmovq", Pq, Nq, XX }, +Ia_maxpd_Vpd_Wpd = { "maxpd", "maxpd", Vpd, Wpd, XX }, +Ia_maxps_Vps_Wps = { "maxps", "maxps", Vps, Wps, XX }, +Ia_maxsd_Vsd_Wsd = { "maxsd", "maxsd", Vsd, Wsd, XX }, +Ia_maxss_Vss_Wss = { "maxss", "maxss", Vss, Wss, XX }, +Ia_mfence = { "mfence", "mfence", XX, XX, XX }, +Ia_minpd_Vpd_Wpd = { "minpd", "minpd", Vpd, Wpd, XX }, +Ia_minps_Vps_Wps = { "minps", "minps", Vps, Wps, XX }, +Ia_minsd_Vsd_Wsd = { "minsd", "minsd", Vsd, Wsd, XX }, +Ia_minss_Vss_Wss = { "minss", "minss", Vss, Wss, XX }, +Ia_monitor = { "monitor", "monitor", XX, XX, XX }, +Ia_movapd_Vpd_Wpd = { "movapd", "movapd", Vpd, Wpd, XX }, +Ia_movapd_Wpd_Vpd = { "movapd", "movapd", Wpd, Vpd, XX }, +Ia_movaps_Vps_Wps = { "movaps", "movaps", Vps, Wps, XX }, +Ia_movaps_Wps_Vps = { "movaps", "movaps", Wps, Vps, XX }, +Ia_movb_AL_Ob = { "mov", "movb", AL, Ob, XX }, +Ia_movb_Eb_Gb = { "mov", "movb", Eb, Gb, XX }, +Ia_movb_Eb_Ib = { "mov", "movb", Eb, Ib, XX }, +Ia_movb_Gb_Eb = { "mov", "movb", Gb, Eb, XX }, +Ia_movb_Ob_AL = { "mov", "movb", Ob, AL, XX }, +Ia_movb_R8_Ib = { "mov", "movb", R8, Ib, XX }, +Ia_movd_Ed_Pq = { "movd", "movd", Ed, Pq, XX }, +Ia_movd_Ed_Vd = { "movd", "movd", Ed, Vdq, XX }, +Ia_movd_Pq_Ed = { "movd", "movd", Pq, Ed, XX }, +Ia_movd_Vdq_Ed = { "movd", "movd", Vdq, Ed, XX }, +Ia_movddup_Vdq_Wq = { "movddup", "movddup", Vdq, Wq, XX }, +Ia_movdq2q_Pq_Vq = { "movdq2q", "movdq2q", Pq, Vq, XX }, +Ia_movdqa_Vdq_Wdq = { "movdqa", "movdqa", Vdq, Wdq, XX }, +Ia_movdqa_Wdq_Vdq = { "movdqa", "movdqa", Wdq, Vdq, XX }, +Ia_movdqu_Vdq_Wdq = { "movdqu", "movdqu", Vdq, Wdq, XX }, +Ia_movdqu_Wdq_Vdq = { "movdqu", "movdqu", Wdq, Vdq, XX }, +Ia_movhlpd_Vpd_Uq = { "movhlpd", "movhlpd", Vpd, Udq, XX }, +Ia_movhlps_Vps_Uq = { "movhlps", "movhlps", Vps, Udq, XX }, +Ia_movhpd_Mq_Vpd = { "movhpd", "movhpd", Mq, Vpd, XX }, +Ia_movhpd_Vpd_Mq = { "movhpd", "movhpd", Vpd, Mq, XX }, +Ia_movhps_Mq_Vps = { "movhps", "movhps", Mq, Vps, XX }, +Ia_movhps_Vps_Mq = { "movhps", "movhps", Vps, Mq, XX }, +Ia_movl_Cd_Rd = { "mov", "movl", Cd, Rd, XX }, +Ia_movl_Dd_Rd = { "mov", "movl", Dd, Rd, XX }, +Ia_movl_EAX_Od = { "mov", "movl", EAX, Od, XX }, +Ia_movl_Ed_Gd = { "mov", "movl", Ed, Gd, XX }, +Ia_movl_Ed_Id = { "mov", "movl", Ed, Id, XX }, +Ia_movl_ERX_Id = { "mov", "movl", ERX, Id, XX }, +Ia_movl_Gd_Ed = { "mov", "movl", Gd, Ed, XX }, +Ia_movl_Od_EAX = { "mov", "movl", Od, EAX, XX }, +Ia_movl_Rd_Cd = { "mov", "movl", Rd, Cd, XX }, +Ia_movl_Rd_Dd = { "mov", "movl", Rd, Dd, XX }, +Ia_movl_Rd_Td = { "mov", "movl", Rd, Td, XX }, +Ia_movl_Td_Rd = { "mov", "movl", Td, Rd, XX }, +Ia_movlhpd_Vpd_Uq = { "movlhpd", "movlhpd", Vpd, Udq, XX }, +Ia_movlhps_Vps_Uq = { "movlhps", "movlhps", Vps, Udq, XX }, +Ia_movlpd_Mq_Vpd = { "movlpd", "movlpd", Mq, Vpd, XX }, +Ia_movlpd_Vpd_Mq = { "movlpd", "movlpd", Vpd, Mq, XX }, +Ia_movlps_Mq_Vps = { "movlps", "movlps", Mq, Vps, XX }, +Ia_movlps_Vps_Mq = { "movlps", "movlps", Vps, Mq, XX }, +Ia_movmskpd_Gd_Vpd = { "movmskpd", "movmskpd", Gd, Vpd, XX }, +Ia_movmskps_Gd_Vps = { "movmskps", "movmskps", Gd, Vps, XX }, +Ia_movntdq_Mdq_Vdq = { "movntdq", "movntdq", Mdq, Vdq, XX }, +Ia_movnti_Md_Gd = { "movnti", "movnti", Md, Gd, XX }, +Ia_movntiq_Mq_Gq = { "movntiq", "movntiq", Mq, Gq, XX }, +Ia_movntpd_Mpd_Vpd = { "movntpd", "movntpd", Mpd, Vpd, XX }, +Ia_movntps_Mps_Vps = { "movntps", "movntps", Mps, Vps, XX }, +Ia_movntq_Mq_Pq = { "movntq", "movntq", Mq, Pq, XX }, +Ia_movq_Cq_Rq = { "mov", "movq", Cq, Rq, XX }, +Ia_movq_Dq_Rq = { "mov", "movq", Dq, Rq, XX }, +Ia_movq_Eq_Gq = { "mov", "movq", Eq, Gq, XX }, +Ia_movq_Eq_Pq = { "movq", "movq", Eq, Pq, XX }, +Ia_movq_Eq_sId = { "mov", "movq", Eq, sIdq, XX }, +Ia_movq_Eq_Vq = { "movq", "movq", Eq, Vq, XX }, +Ia_movq_Gq_Eq = { "mov", "movq", Gq, Eq, XX }, +Ia_movq_Oq_RAX = { "mov", "movq", Oq, RAX, XX }, +Ia_movq_Pq_Eq = { "movq", "movq", Pq, Eq, XX }, +Ia_movq_Pq_Qq = { "movq", "movq", Pq, Qq, XX }, +Ia_movq_Qq_Pq = { "movq", "movq", Qq, Pq, XX }, +Ia_movq_RAX_Oq = { "mov", "movq", RAX, Oq, XX }, +Ia_movq_Rq_Cq = { "mov", "movq", Rq, Cq, XX }, +Ia_movq_Rq_Dq = { "mov", "movq", Rq, Dq, XX }, +Ia_movq_RRX_Iq = { "mov", "movq", RRX, Iq, XX }, +Ia_movq_Vdq_Eq = { "movq", "movq", Vdq, Eq, XX }, +Ia_movq_Vq_Wq = { "movq", "movq", Vq, Wq, XX }, +Ia_movq_Wq_Vq = { "movq", "movq", Wq, Vq, XX }, +Ia_movq2dq_Vdq_Qq = { "movq2dq", "movq2dq", Vdq, Qq, XX }, +Ia_movsb_Yb_Xb = { "movsb", "movsb", Yb, Xb, XX }, +Ia_movsbl_Gd_Eb = { "movsx", "movsbl", Gd, Eb, XX }, +Ia_movsbq_Gq_Eb = { "movsx", "movsbq", Gq, Eb, XX }, +Ia_movsbw_Gw_Eb = { "movsx", "movsbw", Gw, Eb, XX }, +Ia_movsd_Vsd_Wsd = { "movsd", "movsd", Vsd, Wsd, XX }, +Ia_movsd_Wsd_Vsd = { "movsd", "movsd", Wsd, Vsd, XX }, +Ia_movshdup_Vdq_Wdq = { "movshdup", "movshdup", Vdq, Wdq, XX }, +Ia_movsl_Yd_Xd = { "movsd", "movsl", Yd, Xd, XX }, +Ia_movsldup_Vdq_Wdq = { "movsldup", "movsldup", Vdq, Wdq, XX }, +Ia_movslq_Gq_Ed = { "movsxd", "movslq", Gq, Ed, XX }, +Ia_movsq_Yq_Xq = { "movsq", "movsq", Yq, Xq, XX }, +Ia_movss_Vss_Wss = { "movss", "movss", Vss, Wss, XX }, +Ia_movss_Wss_Vss = { "movss", "movss", Wss, Vss, XX }, +Ia_movsw_Yw_Xw = { "movsw", "movsw", Yw, Xw, XX }, +Ia_movswl_Gd_Ew = { "movsx", "movswl", Gd, Ew, XX }, +Ia_movswq_Gq_Ew = { "movsx", "movswq", Gq, Ew, XX }, +Ia_movupd_Vpd_Wpd = { "movupd", "movupd", Vpd, Wpd, XX }, +Ia_movupd_Wpd_Vpd = { "movupd", "movupd", Wpd, Vpd, XX }, +Ia_movups_Vps_Wps = { "movups", "movups", Vps, Wps, XX }, +Ia_movups_Wps_Vps = { "movups", "movups", Wps, Vps, XX }, +Ia_movw_AX_Ow = { "mov", "movw", AX, Ow, XX }, +Ia_movw_Ew_Gw = { "mov", "movw", Ew, Gw, XX }, +Ia_movw_Ew_Iw = { "mov", "movw", Ew, Iw, XX }, +Ia_movw_Ew_Sw = { "mov", "movw", Ew, Sw, XX }, +Ia_movw_Gw_Ew = { "mov", "movw", Gw, Ew, XX }, +Ia_movw_Ow_AX = { "mov", "movw", Ow, AX, XX }, +Ia_movw_RX_Iw = { "mov", "movw", RX, Iw, XX }, +Ia_movw_Sw_Ew = { "mov", "movw", Sw, Ew, XX }, +Ia_movzbl_Gd_Eb = { "movzx", "movzbl", Gd, Eb, XX }, +Ia_movzbq_Gq_Eb = { "movzx", "movzbq", Gq, Eb, XX }, +Ia_movzbw_Gw_Eb = { "movzx", "movzbw", Gw, Eb, XX }, +Ia_movzwl_Gd_Ew = { "movzx", "movzwl", Gd, Ew, XX }, +Ia_movzwq_Gq_Ew = { "movzx", "movzwq", Gq, Ew, XX }, +Ia_mulb_AL_Eb = { "mul", "mulb", AL, Eb, XX }, +Ia_mull_EAX_Ed = { "mul", "mull", EAX, Ed, XX }, +Ia_mulpd_Vpd_Wpd = { "mulpd", "mulpd", Vpd, Wpd, XX }, +Ia_mulps_Vps_Wps = { "mulps", "mulps", Vps, Wps, XX }, +Ia_mulq_RAX_Eq = { "mul", "mulq", RAX, Eq, XX }, +Ia_mulsd_Vsd_Wsd = { "mulsd", "mulsd", Vsd, Wsd, XX }, +Ia_mulss_Vss_Wss = { "mulss", "mulss", Vss, Wss, XX }, +Ia_multibyte_nop = { "multibyte nop", "multibyte nop", XX, XX, XX }, +Ia_mulw_AX_Ew = { "mul", "mulw", AX, Ew, XX }, +Ia_mwait = { "mwait", "mwait", XX, XX, XX }, +Ia_negb_Eb = { "neg", "negb", Eb, XX, XX }, +Ia_negl_Ed = { "neg", "negl", Ed, XX, XX }, +Ia_negq_Eq = { "neg", "negq", Eq, XX, XX }, +Ia_negw_Ew = { "neg", "negw", Ew, XX, XX }, +Ia_nop = { "nop", "nop", XX, XX, XX }, +Ia_notb_Eb = { "not", "notb", Eb, XX, XX }, +Ia_notl_Ed = { "not", "notl", Ed, XX, XX }, +Ia_notq_Eq = { "not", "notq", Eq, XX, XX }, +Ia_notw_Ew = { "not", "notw", Ew, XX, XX }, +Ia_orb_AL_Ib = { "or", "orb", AL, Ib, XX }, +Ia_orb_Eb_Gb = { "or", "orb", Eb, Gb, XX }, +Ia_orb_Eb_Ib = { "or", "orb", Eb, Ib, XX }, +Ia_orb_Gb_Eb = { "or", "orb", Gb, Eb, XX }, +Ia_orl_EAX_Id = { "or", "orl", EAX, Id, XX }, +Ia_orl_Ed_Gd = { "or", "orl", Ed, Gd, XX }, +Ia_orl_Ed_Id = { "or", "orl", Ed, Id, XX }, +Ia_orl_Ed_sIb = { "or", "orl", Ed, sIbd, XX }, +Ia_orl_Gd_Ed = { "or", "orl", Gd, Ed, XX }, +Ia_orpd_Vpd_Wpd = { "orpd", "orpd", Vpd, Wpd, XX }, +Ia_orps_Vps_Wps = { "orps", "orps", Vps, Wps, XX }, +Ia_orq_Eq_Gq = { "or", "orq", Eq, Gq, XX }, +Ia_orq_Eq_sIb = { "or", "orq", Eq, sIbq, XX }, +Ia_orq_Eq_sId = { "or", "orq", Eq, sIdq, XX }, +Ia_orq_Gq_Eq = { "or", "orq", Gq, Eq, XX }, +Ia_orq_RAX_sId = { "or", "orq", RAX, sIdq, XX }, +Ia_orw_AX_Iw = { "or", "orw", AX, Iw, XX }, +Ia_orw_Ew_Gw = { "or", "orw", Ew, Gw, XX }, +Ia_orw_Ew_Iw = { "or", "orw", Ew, Iw, XX }, +Ia_orw_Ew_sIb = { "or", "orw", Ew, sIbw, XX }, +Ia_orw_Gw_Ew = { "or", "orw", Gw, Ew, XX }, +Ia_outb_DX_AL = { "out", "outb", DX, AL, XX }, +Ia_outb_Ib_AL = { "out", "outb", Ib, AL, XX }, +Ia_outl_DX_EAX = { "out", "outl", DX, EAX, XX }, +Ia_outl_Ib_EAX = { "out", "outl", Ib, EAX, XX }, +Ia_outsb_DX_Xb = { "outsb", "outsb", DX, Xb, XX }, +Ia_outsl_DX_Xd = { "outsd", "outsl", DX, Xd, XX }, +Ia_outsw_DX_Xw = { "outsw", "outsw", DX, Xw, XX }, +Ia_outw_DX_AX = { "out", "outw", DX, AX, XX }, +Ia_outw_Ib_AX = { "out", "outw", Ib, AX, XX }, +Ia_pabsb_Pq_Qq = { "pabsb", "pabsb", Pq, Qq, XX }, +Ia_pabsb_Vdq_Wdq = { "pabsb", "pabsb", Vdq, Wdq, XX }, +Ia_pabsd_Pq_Qq = { "pabsd", "pabsd", Pq, Qq, XX }, +Ia_pabsd_Vdq_Wdq = { "pabsd", "pabsd", Vdq, Wdq, XX }, +Ia_pabsw_Pq_Qq = { "pabsw", "pabsw", Pq, Qq, XX }, +Ia_pabsw_Vdq_Wdq = { "pabsw", "pabsw", Vdq, Wdq, XX }, +Ia_packssdw_Pq_Qq = { "packssdw", "packssdw", Pq, Qq, XX }, +Ia_packssdw_Vdq_Wdq = { "packssdw", "packssdw", Vdq, Wdq, XX }, +Ia_packsswb_Pq_Qq = { "packsswb", "packsswb", Pq, Qq, XX }, +Ia_packsswb_Vdq_Wq = { "packsswb", "packsswb", Vdq, Wq, XX }, +Ia_packuswb_Pq_Qq = { "packuswb", "packuswb", Pq, Qq, XX }, +Ia_packuswb_Vdq_Wdq = { "packuswb", "packuswb", Vdq, Wdq, XX }, +Ia_paddb_Pq_Qq = { "paddb", "paddb", Pq, Qq, XX }, +Ia_paddb_Vdq_Wdq = { "paddb", "paddb", Vdq, Wdq, XX }, +Ia_paddd_Pq_Qq = { "paddd", "paddd", Pq, Qq, XX }, +Ia_paddd_Vdq_Wdq = { "paddd", "paddd", Vdq, Wdq, XX }, +Ia_paddq_Pq_Qq = { "paddq", "paddq", Pq, Qq, XX }, +Ia_paddq_Vdq_Wdq = { "paddq", "paddq", Vdq, Wdq, XX }, +Ia_paddsb_Pq_Qq = { "paddsb", "paddsb", Pq, Qq, XX }, +Ia_paddsb_Vdq_Wdq = { "paddsb", "paddsb", Vdq, Wdq, XX }, +Ia_paddsw_Pq_Qq = { "paddsw", "paddsw", Pq, Qq, XX }, +Ia_paddsw_Vdq_Wdq = { "paddsw", "paddsw", Vdq, Wdq, XX }, +Ia_paddusb_Pq_Qq = { "paddusb", "paddusb", Pq, Qq, XX }, +Ia_paddusb_Vdq_Wdq = { "paddusb", "paddusb", Vdq, Wdq, XX }, +Ia_paddusw_Pq_Qq = { "paddusw", "paddusw", Pq, Qq, XX }, +Ia_paddusw_Vdq_Wdq = { "paddusw", "paddusw", Vdq, Wdq, XX }, +Ia_paddw_Pq_Qq = { "paddw", "paddw", Pq, Qq, XX }, +Ia_paddw_Vdq_Wdq = { "paddw", "paddw", Vdq, Wdq, XX }, +Ia_palignr_Pq_Qq_Ib = { "palignr", "palignr", Pq, Qq, Ib }, +Ia_palignr_Vdq_Wdq_Ib = { "palignr", "palignr", Vdq, Wdq, Ib }, +Ia_pand_Pq_Qq = { "pand", "pand", Pq, Qq, XX }, +Ia_pand_Vdq_Wdq = { "pand", "pand", Vdq, Wdq, XX }, +Ia_pandn_Pq_Qq = { "pandn", "pandn", Pq, Qq, XX }, +Ia_pandn_Vdq_Wdq = { "pandn", "pandn", Vdq, Wdq, XX }, +Ia_pause = { "pause", "pause", XX, XX, XX }, +Ia_pavgb_Pq_Qq = { "pavgb", "pavgb", Pq, Qq, XX }, +Ia_pavgb_Vdq_Wdq = { "pavgb", "pavgb", Vdq, Wdq, XX }, +Ia_pavgw_Pq_Qq = { "pavgw", "pavgw", Pq, Qq, XX }, +Ia_pavgw_Vdq_Wdq = { "pavgw", "pavgw", Vdq, Wdq, XX }, +Ia_pcmpeqb_Pq_Qq = { "pcmpeqb", "pcmpeqb", Pq, Qq, XX }, +Ia_pcmpeqb_Vdq_Wdq = { "pcmpeqb", "pcmpeqb", Vdq, Wdq, XX }, +Ia_pcmpeqd_Pq_Qq = { "pcmpeqd", "pcmpeqd", Pq, Qq, XX }, +Ia_pcmpeqd_Vdq_Wdq = { "pcmpeqd", "pcmpeqd", Vdq, Wdq, XX }, +Ia_pcmpeqw_Pq_Qq = { "pcmpeqw", "pcmpeqw", Pq, Qq, XX }, +Ia_pcmpeqw_Vdq_Wdq = { "pcmpeqw", "pcmpeqw", Vdq, Wdq, XX }, +Ia_pcmpgtb_Pq_Qq = { "pcmpgtb", "pcmpgtb", Pq, Qq, XX }, +Ia_pcmpgtb_Vdq_Wq = { "pcmpgtb", "pcmpgtb", Vdq, Wq, XX }, +Ia_pcmpgtd_Pq_Qq = { "pcmpgtd", "pcmpgtd", Pq, Qq, XX }, +Ia_pcmpgtd_Vdq_Wdq = { "pcmpgtd", "pcmpgtd", Vdq, Wdq, XX }, +Ia_pcmpgtw_Pq_Qq = { "pcmpgtw", "pcmpgtw", Pq, Qq, XX }, +Ia_pcmpgtw_Vdq_Wq = { "pcmpgtw", "pcmpgtw", Vdq, Wq, XX }, +Ia_pextrw_Gd_Nq_Ib = { "pextrw", "pextrw", Gd, Nq, Ib }, +Ia_pextrw_Gd_Udq_Ib = { "pextrw", "pextrw", Gd, Udq, Ib }, +Ia_pf2id_Pq_Qq = { "pf2id", "pf2id", Pq, Qq, XX }, +Ia_pf2iw_Pq_Qq = { "pf2iw", "pf2iw", Pq, Qq, XX }, +Ia_pfacc_Pq_Qq = { "pfacc", "pfacc", Pq, Qq, XX }, +Ia_pfadd_Pq_Qq = { "pfadd", "pfadd", Pq, Qq, XX }, +Ia_pfcmpeq_Pq_Qq = { "pfcmpeq", "pfcmpeq", Pq, Qq, XX }, +Ia_pfcmpge_Pq_Qq = { "pfcmpge", "pfcmpge", Pq, Qq, XX }, +Ia_pfcmpgt_Pq_Qq = { "pfcmpgt", "pfcmpgt", Pq, Qq, XX }, +Ia_pfmax_Pq_Qq = { "pfmax", "pfmax", Pq, Qq, XX }, +Ia_pfmin_Pq_Qq = { "pfmin", "pfmin", Pq, Qq, XX }, +Ia_pfmul_Pq_Qq = { "pfmul", "pfmul", Pq, Qq, XX }, +Ia_pfnacc_Pq_Qq = { "pfnacc", "pfnacc", Pq, Qq, XX }, +Ia_pfpnacc_Pq_Qq = { "pfpnacc", "pfpnacc", Pq, Qq, XX }, +Ia_pfrcp_Pq_Qq = { "pfrcp", "pfrcp", Pq, Qq, XX }, +Ia_pfrcpit1_Pq_Qq = { "pfrcpit1", "pfrcpit1", Pq, Qq, XX }, +Ia_pfrcpit2_Pq_Qq = { "pfrcpit2", "pfrcpit2", Pq, Qq, XX }, +Ia_pfrsqit1_Pq_Qq = { "pfrsqit1", "pfrsqit1", Pq, Qq, XX }, +Ia_pfrsqrt_Pq_Qq = { "pfrsqrt", "pfrsqrt", Pq, Qq, XX }, +Ia_pfsub_Pq_Qq = { "pfsub", "pfsub", Pq, Qq, XX }, +Ia_pfsubr_Pq_Qq = { "pfsubr", "pfsubr", Pq, Qq, XX }, +Ia_phaddd_Pq_Qq = { "phaddd", "phaddd", Pq, Qq, XX }, +Ia_phaddd_Vdq_Wdq = { "phaddd", "phaddd", Vdq, Wdq, XX }, +Ia_phaddsw_Pq_Qq = { "phaddsw", "phaddsw", Pq, Qq, XX }, +Ia_phaddsw_Vdq_Wdq = { "phaddsw", "phaddsw", Vdq, Wdq, XX }, +Ia_phaddw_Pq_Qq = { "phaddw", "phaddw", Pq, Qq, XX }, +Ia_phaddw_Vdq_Wdq = { "phaddw", "phaddw", Vdq, Wdq, XX }, +Ia_phsubd_Pq_Qq = { "phsubd", "phsubd", Pq, Qq, XX }, +Ia_phsubd_Vdq_Wdq = { "phsubd", "phsubd", Vdq, Wdq, XX }, +Ia_phsubsw_Pq_Qq = { "phsubsw", "phsubsw", Pq, Qq, XX }, +Ia_phsubsw_Vdq_Wdq = { "phsubsw", "phsubsw", Vdq, Wdq, XX }, +Ia_phsubw_Pq_Qq = { "phsubw", "phsubw", Pq, Qq, XX }, +Ia_phsubw_Vdq_Wdq = { "phsubw", "phsubw", Vdq, Wdq, XX }, +Ia_pi2fd_Pq_Qq = { "pi2fd", "pi2fd", Pq, Qq, XX }, +Ia_pi2fw_Pq_Qq = { "pi2fw", "pi2fw", Pq, Qq, XX }, +Ia_pinsrw_Pq_Ed_Ib = { "pinsrw", "pinsrw", Pq, Ed, Ib }, +Ia_pinsrw_Vdq_Ed_Ib = { "pinsrw", "pinsrw", Vdq, Ed, Ib }, +Ia_pmaddubsw_Pq_Qq = { "pmaddubsw", "pmaddubsw", Pq, Qq, XX }, +Ia_pmaddubsw_Vdq_Wdq = { "pmaddubsw", "pmaddubsw", Vdq, Wdq, XX }, +Ia_pmaddwd_Pq_Qq = { "pmaddwd", "pmaddwd", Pq, Qq, XX }, +Ia_pmaddwd_Vdq_Wdq = { "pmaddwd", "pmaddwd", Vdq, Wdq, XX }, +Ia_pmaxub_Pq_Qq = { "pmaxub", "pmaxub", Pq, Qq, XX }, +Ia_pmaxub_Vdq_Wdq = { "pmaxub", "pmaxub", Vdq, Wdq, XX }, +Ia_pmaxuw_Pq_Qq = { "pmaxuw", "pmaxuw", Pq, Qq, XX }, +Ia_pmaxuw_Vdq_Wdq = { "pmaxuw", "pmaxuw", Vdq, Wdq, XX }, +Ia_pminsw_Pq_Qq = { "pminsw", "pminsw", Pq, Qq, XX }, +Ia_pminsw_Vdq_Wdq = { "pminsw", "pminsw", Vdq, Wdq, XX }, +Ia_pminub_Pq_Qq = { "pminub", "pminub", Pq, Qq, XX }, +Ia_pminub_Vdq_Wdq = { "pminub", "pminub", Vdq, Wdq, XX }, +Ia_pmovmskb_Gd_Nq = { "pmovmskb", "pmovmskb", Gd, Nq, XX }, +Ia_pmovmskb_Gd_Udq = { "pmovmskb", "pmovmskb", Gd, Udq, XX }, +Ia_pmulhrsw_Pq_Qq = { "pmulhrsw", "pmulhrsw", Pq, Qq, XX }, +Ia_pmulhrsw_Vdq_Wdq = { "pmulhrsw", "pmulhrsw", Vdq, Wdq, XX }, +Ia_pmulhrw_Pq_Qq = { "pmulhrw", "pmulhrw", Pq, Qq, XX }, +Ia_pmulhuw_Pq_Qq = { "pmulhuw", "pmulhuw", Pq, Qq, XX }, +Ia_pmulhuw_Vdq_Wdq = { "pmulhuw", "pmulhuw", Vdq, Wdq, XX }, +Ia_pmulhw_Pq_Qq = { "pmulhw", "pmulhw", Pq, Qq, XX }, +Ia_pmulhw_Vdq_Wdq = { "pmulhw", "pmulhw", Vdq, Wdq, XX }, +Ia_pmullw_Pq_Qq = { "pmullw", "pmullw", Pq, Qq, XX }, +Ia_pmullw_Vdq_Wdq = { "pmullw", "pmullw", Vdq, Wdq, XX }, +Ia_pmuludq_Pq_Qq = { "pmuludq", "pmuludq", Pq, Qq, XX }, +Ia_pmuludq_Vdq_Wdq = { "pmuludq", "pmuludq", Vdq, Wdq, XX }, +Ia_popal = { "popad", "popal", XX, XX, XX }, +Ia_popaw = { "popa", "popa", XX, XX, XX }, +Ia_popfl = { "popfd", "popfl", XX, XX, XX }, +Ia_popfq = { "popfq", "popfq", XX, XX, XX }, +Ia_popfw = { "popf", "popf", XX, XX, XX }, +Ia_popl_DS = { "pop", "popl", DS, XX, XX }, +Ia_popl_Ed = { "pop", "popl", Ed, XX, XX }, +Ia_popl_ERX = { "pop", "popl", ERX, XX, XX }, +Ia_popl_ES = { "pop", "popl", ES, XX, XX }, +Ia_popl_FS = { "pop", "popl", FS, XX, XX }, +Ia_popl_GS = { "pop", "popl", GS, XX, XX }, +Ia_popl_SS = { "pop", "popl", SS, XX, XX }, +Ia_popq_Eq = { "pop", "popq", Eq, XX, XX }, +Ia_popq_FS = { "pop", "popq", FS, XX, XX }, +Ia_popq_GS = { "pop", "popq", GS, XX, XX }, +Ia_popq_RRX = { "pop", "popq", RRX, XX, XX }, +Ia_popw_DS = { "pop", "popw", DS, XX, XX }, +Ia_popw_ES = { "pop", "popw", ES, XX, XX }, +Ia_popw_Ew = { "pop", "popw", Ew, XX, XX }, +Ia_popw_FS = { "pop", "popw", FS, XX, XX }, +Ia_popw_GS = { "pop", "popw", GS, XX, XX }, +Ia_popw_RX = { "pop", "popw", RX, XX, XX }, +Ia_popw_SS = { "pop", "popw", SS, XX, XX }, +Ia_por_Pq_Qq = { "por", "por", Pq, Qq, XX }, +Ia_por_Vdq_Wdq = { "por", "por", Vdq, Wdq, XX }, +Ia_prefetch = { "prefetch (3dnow!)", "prefetch (3dnow!)", Mb, XX, XX }, +Ia_prefetchnta = { "prefetchnta", "prefetchnta", Mb, XX, XX }, +Ia_prefetcht0 = { "prefetcht0", "prefetcht0", Mb, XX, XX }, +Ia_prefetcht1 = { "prefetcht1", "prefetcht1", Mb, XX, XX }, +Ia_prefetcht2 = { "prefetcht2", "prefetcht2", Mb, XX, XX }, +Ia_prefix_asize = { "asize", "asize", XX, XX, XX }, +Ia_prefix_cs = { "cs", "cs", XX, XX, XX }, +Ia_prefix_ds = { "ds", "ds", XX, XX, XX }, +Ia_prefix_es = { "es", "es", XX, XX, XX }, +Ia_prefix_fs = { "fs", "fs", XX, XX, XX }, +Ia_prefix_gs = { "gs", "gs", XX, XX, XX }, +Ia_prefix_lock = { "lock", "lock", XX, XX, XX }, +Ia_prefix_osize = { "osize", "osize", XX, XX, XX }, +Ia_prefix_rep = { "rep", "rep", XX, XX, XX }, +Ia_prefix_repne = { "repne", "repne", XX, XX, XX }, +Ia_prefix_rex = { "rex", "rex", XX, XX, XX }, +Ia_prefix_ss = { "ss", "ss", XX, XX, XX }, +Ia_psadbw_Pq_Qq = { "psadbw", "psadbw", Pq, Qq, XX }, +Ia_psadbw_Vdq_Wdq = { "psadbw", "psadbw", Vdq, Wdq, XX }, +Ia_pshufb_Pq_Qq = { "pshufb", "pshufb", Pq, Qq, XX }, +Ia_pshufb_Vdq_Wdq = { "pshufb", "pshufb", Vdq, Wdq, XX }, +Ia_pshufd_Vdq_Wdq_Ib = { "pshufd", "pshufd", Vdq, Wdq, Ib }, +Ia_pshufhw_Vq_Wq_Ib = { "pshufhw", "pshufhw", Vq, Wq, Ib }, +Ia_pshuflw_Vq_Wq_Ib = { "pshuflw", "pshuflw", Vq, Wq, Ib }, +Ia_pshufw_Pq_Qq_Ib = { "pshufw", "pshufw", Pq, Qq, Ib }, +Ia_psignb_Pq_Qq = { "psignb", "psignb", Pq, Qq, XX }, +Ia_psignb_Vdq_Wdq = { "psignb", "psignb", Vdq, Wdq, XX }, +Ia_psignd_Pq_Qq = { "psignd", "psignd", Pq, Qq, XX }, +Ia_psignd_Vdq_Wdq = { "psignd", "psignd", Vdq, Wdq, XX }, +Ia_psignw_Pq_Qq = { "psignw", "psignw", Pq, Qq, XX }, +Ia_psignw_Vdq_Wdq = { "psignw", "psignw", Vdq, Wdq, XX }, +Ia_pslld_Nq_Ib = { "pslld", "pslld", Nq, Ib, XX }, +Ia_pslld_Pq_Qq = { "pslld", "pslld", Pq, Qq, XX }, +Ia_pslld_Udq_Ib = { "pslld", "pslld", Udq, Ib, XX }, +Ia_pslld_Vdq_Wdq = { "pslld", "pslld", Vdq, Wdq, XX }, +Ia_pslldq_Udq_Ib = { "pslldq", "pslldq", Udq, Ib, XX }, +Ia_psllq_Nq_Ib = { "psllq", "psllq", Nq, Ib, XX }, +Ia_psllq_Pq_Qq = { "psllq", "psllq", Pq, Qq, XX }, +Ia_psllq_Udq_Ib = { "psllq", "psllq", Udq, Ib, XX }, +Ia_psllq_Vdq_Wdq = { "psllq", "psllq", Vdq, Wdq, XX }, +Ia_psllw_Nq_Ib = { "psllw", "psllw", Nq, Ib, XX }, +Ia_psllw_Pq_Qq = { "psllw", "psllw", Pq, Qq, XX }, +Ia_psllw_Udq_Ib = { "psllw", "psllw", Udq, Ib, XX }, +Ia_psllw_Vdq_Wdq = { "psllw", "psllw", Vdq, Wdq, XX }, +Ia_psrad_Nq_Ib = { "psrad", "psrad", Nq, Ib, XX }, +Ia_psrad_Pq_Qq = { "psrad", "psrad", Pq, Qq, XX }, +Ia_psrad_Udq_Ib = { "psrad", "psrad", Udq, Ib, XX }, +Ia_psrad_Vdq_Wdq = { "psrad", "psrad", Vdq, Wdq, XX }, +Ia_psraw_Nq_Ib = { "psraw", "psraw", Nq, Ib, XX }, +Ia_psraw_Pq_Qq = { "psraw", "psraw", Pq, Qq, XX }, +Ia_psraw_Udq_Ib = { "psraw", "psraw", Udq, Ib, XX }, +Ia_psraw_Vdq_Wdq = { "psraw", "psraw", Vdq, Wdq, XX }, +Ia_psrld_Nq_Ib = { "psrld", "psrld", Nq, Ib, XX }, +Ia_psrld_Pq_Qq = { "psrld", "psrld", Pq, Qq, XX }, +Ia_psrld_Udq_Ib = { "psrld", "psrld", Udq, Ib, XX }, +Ia_psrld_Vdq_Wdq = { "psrld", "psrld", Vdq, Wdq, XX }, +Ia_psrldq_Udq_Ib = { "psrldq", "psrldq", Udq, Ib, XX }, +Ia_psrlq_Nq_Ib = { "psrlq", "psrlq", Nq, Ib, XX }, +Ia_psrlq_Pq_Qq = { "psrlq", "psrlq", Pq, Qq, XX }, +Ia_psrlq_Udq_Ib = { "psrlq", "psrlq", Udq, Ib, XX }, +Ia_psrlq_Vdq_Wdq = { "psrlq", "psrlq", Vdq, Wdq, XX }, +Ia_psrlw_Nq_Ib = { "psrlw", "psrlw", Nq, Ib, XX }, +Ia_psrlw_Pq_Qq = { "psrlw", "psrlw", Pq, Qq, XX }, +Ia_psrlw_Udq_Ib = { "psrlw", "psrlw", Udq, Ib, XX }, +Ia_psrlw_Vdq_Wdq = { "psrlw", "psrlw", Vdq, Wdq, XX }, +Ia_psubb_Pq_Qq = { "psubb", "psubb", Pq, Qq, XX }, +Ia_psubb_Vdq_Wdq = { "psubb", "psubb", Vdq, Wdq, XX }, +Ia_psubd_Pq_Qq = { "psubd", "psubd", Pq, Qq, XX }, +Ia_psubd_Vdq_Wdq = { "psubd", "psubd", Vdq, Wdq, XX }, +Ia_psubq_Pq_Qq = { "psubq", "psubq", Pq, Qq, XX }, +Ia_psubq_Vdq_Wdq = { "psubq", "psubq", Vdq, Wdq, XX }, +Ia_psubsb_Pq_Qq = { "psubsb", "psubsb", Pq, Qq, XX }, +Ia_psubsb_Vdq_Wdq = { "psubsb", "psubsb", Vdq, Wdq, XX }, +Ia_psubsw_Pq_Qq = { "psubsw", "psubsw", Pq, Qq, XX }, +Ia_psubsw_Vdq_Wdq = { "psubsw", "psubsw", Vdq, Wdq, XX }, +Ia_psubusb_Pq_Qq = { "psubusb", "psubusb", Pq, Qq, XX }, +Ia_psubusb_Vdq_Wdq = { "psubusb", "psubusb", Vdq, Wdq, XX }, +Ia_psubusw_Pq_Qq = { "psubusw", "psubusw", Pq, Qq, XX }, +Ia_psubusw_Vdq_Wdq = { "psubusw", "psubusw", Vdq, Wdq, XX }, +Ia_psubw_Pq_Qq = { "psubw", "psubw", Pq, Qq, XX }, +Ia_psubw_Vdq_Wdq = { "psubw", "psubw", Vdq, Wdq, XX }, +Ia_pswapd_Pq_Qq = { "pswapd", "pswapd", Pq, Qq, XX }, +Ia_punpckhbw_Pq_Qq = { "punpckhbw", "punpckhbw", Pq, Qq, XX }, +Ia_punpckhbw_Vdq_Wq = { "punpckhbw", "punpckhbw", Vdq, Wq, XX }, +Ia_punpckhdq_Pq_Qq = { "punpckhdq", "punpckhdq", Pq, Qq, XX }, +Ia_punpckhdq_Vdq_Wq = { "punpckhdq", "punpckhdq", Vdq, Wq, XX }, +Ia_punpckhqdq_Vdq_Wq = { "punpckhqdq", "punpckhqdq", Vdq, Wq, XX }, +Ia_punpckhwd_Pq_Qq = { "punpckhwd", "punpckhwd", Pq, Qq, XX }, +Ia_punpckhwd_Vdq_Wq = { "punpckhwd", "punpckhwd", Vdq, Wq, XX }, +Ia_punpcklbw_Pq_Qd = { "punpcklbw", "punpcklbw", Pq, Qd, XX }, +Ia_punpcklbw_Vdq_Wq = { "punpcklbw", "punpcklbw", Vdq, Wq, XX }, +Ia_punpckldq_Pq_Qd = { "punpckldq", "punpckldq", Pq, Qd, XX }, +Ia_punpckldq_Vdq_Wq = { "punpckldq", "punpckldq", Vdq, Wq, XX }, +Ia_punpcklqdq_Vdq_Wq = { "punpcklqdq", "punpcklqdq", Vdq, Wq, XX }, +Ia_punpcklwd_Pq_Qd = { "punpcklwd", "punpcklwd", Pq, Qd, XX }, +Ia_punpcklwd_Vdq_Wq = { "punpcklwd", "punpcklwd", Vdq, Wq, XX }, +Ia_pushal = { "pushad", "pushal", XX, XX, XX }, +Ia_pushaw = { "pusha", "pusha", XX, XX, XX }, +Ia_pushfl = { "pushfd", "pushfl", XX, XX, XX }, +Ia_pushfq = { "pushfq", "pushfq", XX, XX, XX }, +Ia_pushfw = { "pushf", "pushf", XX, XX, XX }, +Ia_pushl_CS = { "push", "pushl", CS, XX, XX }, +Ia_pushl_DS = { "push", "pushl", DS, XX, XX }, +Ia_pushl_Ed = { "push", "pushl", Ed, XX, XX }, +Ia_pushl_ERX = { "push", "pushl", ERX, XX, XX }, +Ia_pushl_ES = { "push", "pushl", ES, XX, XX }, +Ia_pushl_FS = { "push", "pushl", FS, XX, XX }, +Ia_pushl_GS = { "push", "pushl", GS, XX, XX }, +Ia_pushl_Id = { "push", "pushl", Id, XX, XX }, +Ia_pushl_sIb = { "push", "pushl", sIbd, XX, XX }, +Ia_pushl_SS = { "push", "pushl", SS, XX, XX }, +Ia_pushq_Eq = { "push", "pushq", Eq, XX, XX }, +Ia_pushq_FS = { "push", "pushq", FS, XX, XX }, +Ia_pushq_GS = { "push", "pushq", GS, XX, XX }, +Ia_pushq_RRX = { "push", "pushq", RRX, XX, XX }, +Ia_pushq_sIb = { "push", "pushq", sIbq, XX, XX }, +Ia_pushq_sId = { "push", "pushq", sIdq, XX, XX }, +Ia_pushw_CS = { "push", "pushw", CS, XX, XX }, +Ia_pushw_DS = { "push", "pushw", DS, XX, XX }, +Ia_pushw_ES = { "push", "pushw", ES, XX, XX }, +Ia_pushw_Ew = { "push", "pushw", Ew, XX, XX }, +Ia_pushw_FS = { "push", "pushw", FS, XX, XX }, +Ia_pushw_GS = { "push", "pushw", GS, XX, XX }, +Ia_pushw_Iw = { "push", "pushw", Iw, XX, XX }, +Ia_pushw_RX = { "push", "pushw", RX, XX, XX }, +Ia_pushw_sIb = { "push", "pushw", sIbw, XX, XX }, +Ia_pushw_SS = { "push", "pushw", SS, XX, XX }, +Ia_pxor_Pq_Qq = { "pxor", "pxor", Pq, Qq, XX }, +Ia_pxor_Vdq_Wdq = { "pxor", "pxor", Vdq, Wdq, XX }, +Ia_rclb_Eb_CL = { "rcl", "rclb", Eb, CL, XX }, +Ia_rclb_Eb_I1 = { "rcl", "rclb", Eb, I1, XX }, +Ia_rclb_Eb_Ib = { "rcl", "rclb", Eb, Ib, XX }, +Ia_rcll_Ed_CL = { "rcl", "rcll", Ed, CL, XX }, +Ia_rcll_Ed_I1 = { "rcl", "rcll", Ed, I1, XX }, +Ia_rcll_Ed_Ib = { "rcl", "rcll", Ed, Ib, XX }, +Ia_rclq_Eq_CL = { "rcl", "rclq", Eq, CL, XX }, +Ia_rclq_Eq_I1 = { "rcl", "rclq", Eq, I1, XX }, +Ia_rclq_Eq_Ib = { "rcl", "rclq", Eq, Ib, XX }, +Ia_rclw_Ew_CL = { "rcl", "rclw", Ew, CL, XX }, +Ia_rclw_Ew_I1 = { "rcl", "rclw", Ew, I1, XX }, +Ia_rclw_Ew_Ib = { "rcl", "rclw", Ew, Ib, XX }, +Ia_rcpps_Vps_Wps = { "rcpps", "rcpps", Vps, Wps, XX }, +Ia_rcpss_Vss_Wss = { "rcpss", "rcpss", Vss, Wss, XX }, +Ia_rcrb_Eb_CL = { "rcr", "rcrb", Eb, CL, XX }, +Ia_rcrb_Eb_I1 = { "rcr", "rcrb", Eb, I1, XX }, +Ia_rcrb_Eb_Ib = { "rcr", "rcrb", Eb, Ib, XX }, +Ia_rcrl_Ed_CL = { "rcr", "rcrl", Ed, CL, XX }, +Ia_rcrl_Ed_I1 = { "rcr", "rcrl", Ed, I1, XX }, +Ia_rcrl_Ed_Ib = { "rcr", "rcrl", Ed, Ib, XX }, +Ia_rcrq_Eq_CL = { "rcr", "rcrq", Eq, CL, XX }, +Ia_rcrq_Eq_I1 = { "rcr", "rcrq", Eq, I1, XX }, +Ia_rcrq_Eq_Ib = { "rcr", "rcrq", Eq, Ib, XX }, +Ia_rcrw_Ew_CL = { "rcr", "rcrw", Ew, CL, XX }, +Ia_rcrw_Ew_I1 = { "rcr", "rcrw", Ew, I1, XX }, +Ia_rcrw_Ew_Ib = { "rcr", "rcrw", Ew, Ib, XX }, +Ia_rdmsr = { "rdmsr", "rdmsr", XX, XX, XX }, +Ia_rdpmc = { "rdpmc", "rdpmc", XX, XX, XX }, +Ia_rdtsc = { "rdtsc", "rdtsc", XX, XX, XX }, +Ia_rdtscp = { "rdtscp", "rdtscp", XX, XX, XX }, +Ia_ret = { "ret", "ret", XX, XX, XX }, +Ia_ret_Iw = { "ret", "ret", Iw, XX, XX }, +Ia_rolb_Eb_CL = { "rol", "rolb", Eb, CL, XX }, +Ia_rolb_Eb_I1 = { "rol", "rolb", Eb, I1, XX }, +Ia_rolb_Eb_Ib = { "rol", "rolb", Eb, Ib, XX }, +Ia_roll_Ed_CL = { "rol", "roll", Ed, CL, XX }, +Ia_roll_Ed_I1 = { "rol", "roll", Ed, I1, XX }, +Ia_roll_Ed_Ib = { "rol", "roll", Ed, Ib, XX }, +Ia_rolq_Eq_CL = { "rol", "rolq", Eq, CL, XX }, +Ia_rolq_Eq_I1 = { "rol", "rolq", Eq, I1, XX }, +Ia_rolq_Eq_Ib = { "rol", "rolq", Eq, Ib, XX }, +Ia_rolw_Ew_CL = { "rol", "rolw", Ew, CL, XX }, +Ia_rolw_Ew_I1 = { "rol", "rolw", Ew, I1, XX }, +Ia_rolw_Ew_Ib = { "rol", "rolw", Ew, Ib, XX }, +Ia_rorb_Eb_CL = { "ror", "rorb", Eb, CL, XX }, +Ia_rorb_Eb_I1 = { "ror", "rorb", Eb, I1, XX }, +Ia_rorb_Eb_Ib = { "ror", "rorb", Eb, Ib, XX }, +Ia_rorl_Ed_CL = { "ror", "rorl", Ed, CL, XX }, +Ia_rorl_Ed_I1 = { "ror", "rorl", Ed, I1, XX }, +Ia_rorl_Ed_Ib = { "ror", "rorl", Ed, Ib, XX }, +Ia_rorq_Eq_CL = { "ror", "rorq", Eq, CL, XX }, +Ia_rorq_Eq_I1 = { "ror", "rorq", Eq, I1, XX }, +Ia_rorq_Eq_Ib = { "ror", "rorq", Eq, Ib, XX }, +Ia_rorw_Ew_CL = { "ror", "rorw", Ew, CL, XX }, +Ia_rorw_Ew_I1 = { "ror", "rorw", Ew, I1, XX }, +Ia_rorw_Ew_Ib = { "ror", "rorw", Ew, Ib, XX }, +Ia_rsm = { "rsm", "rsm", XX, XX, XX }, +Ia_rsqrtps_Vps_Wps = { "rsqrtps", "rsqrtps", Vps, Wps, XX }, +Ia_rsqrtss_Vss_Wss = { "rsqrtss", "rsqrtss", Vss, Wss, XX }, +Ia_sahf = { "sahf", "sahf", XX, XX, XX }, +Ia_salc = { "salc", "salc", XX, XX, XX }, +Ia_sarb_Eb_CL = { "sar", "sarb", Eb, CL, XX }, +Ia_sarb_Eb_I1 = { "sar", "sarb", Eb, I1, XX }, +Ia_sarb_Eb_Ib = { "sar", "sarb", Eb, Ib, XX }, +Ia_sarl_Ed_CL = { "sar", "sarl", Ed, CL, XX }, +Ia_sarl_Ed_I1 = { "sar", "sarl", Ed, I1, XX }, +Ia_sarl_Ed_Ib = { "sar", "sarl", Ed, Ib, XX }, +Ia_sarq_Eq_CL = { "sar", "sarq", Eq, CL, XX }, +Ia_sarq_Eq_I1 = { "sar", "sarq", Eq, I1, XX }, +Ia_sarq_Eq_Ib = { "sar", "sarq", Eq, Ib, XX }, +Ia_sarw_Ew_CL = { "sar", "sarw", Ew, CL, XX }, +Ia_sarw_Ew_I1 = { "sar", "sarw", Ew, I1, XX }, +Ia_sarw_Ew_Ib = { "sar", "sarw", Ew, Ib, XX }, +Ia_sbbb_AL_Ib = { "sbb", "sbbb", AL, Ib, XX }, +Ia_sbbb_Eb_Gb = { "sbb", "sbbb", Eb, Gb, XX }, +Ia_sbbb_Eb_Ib = { "sbb", "sbbb", Eb, Ib, XX }, +Ia_sbbb_Gb_Eb = { "sbb", "sbbb", Gb, Eb, XX }, +Ia_sbbl_EAX_Id = { "sbb", "sbbl", EAX, Id, XX }, +Ia_sbbl_Ed_Gd = { "sbb", "sbbl", Ed, Gd, XX }, +Ia_sbbl_Ed_Id = { "sbb", "sbbl", Ed, Id, XX }, +Ia_sbbl_Ed_sIb = { "sbb", "sbbl", Ed, sIbd, XX }, +Ia_sbbl_Gd_Ed = { "sbb", "sbbl", Gd, Ed, XX }, +Ia_sbbq_Eq_Gq = { "sbb", "sbbq", Eq, Gq, XX }, +Ia_sbbq_Eq_sIb = { "sbb", "sbbq", Eq, sIbq, XX }, +Ia_sbbq_Eq_sId = { "sbb", "sbbq", Eq, sIdq, XX }, +Ia_sbbq_Gq_Eq = { "sbb", "sbbq", Gq, Eq, XX }, +Ia_sbbq_RAX_sId = { "sbb", "sbbq", RAX, sIdq, XX }, +Ia_sbbw_AX_Iw = { "sbb", "sbbw", AX, Iw, XX }, +Ia_sbbw_Ew_Gw = { "sbb", "sbbw", Ew, Gw, XX }, +Ia_sbbw_Ew_Iw = { "sbb", "sbbw", Ew, Iw, XX }, +Ia_sbbw_Ew_sIb = { "sbb", "sbbw", Ew, sIbw, XX }, +Ia_sbbw_Gw_Ew = { "sbb", "sbbw", Gw, Ew, XX }, +Ia_scasb_Yb_AL = { "scasb", "scasb", Yb, AL, XX }, +Ia_scasl_Yd_EAX = { "scasd", "scasl", Yd, EAX, XX }, +Ia_scasq_Yq_RAX = { "scasq", "scasq", Yq, RAX, XX }, +Ia_scasw_Yw_AX = { "scasw", "scasw", Yw, AX, XX }, +Ia_setb_Eb = { "setb", "setb", Eb, XX, XX }, +Ia_setbe_Eb = { "setbe", "setbe", Eb, XX, XX }, +Ia_setl_Eb = { "setl", "setl", Eb, XX, XX }, +Ia_setle_Eb = { "setle", "setle", Eb, XX, XX }, +Ia_setnb_Eb = { "setnb", "setnb", Eb, XX, XX }, +Ia_setnbe_Eb = { "setnbe", "setnbe", Eb, XX, XX }, +Ia_setnl_Eb = { "setnl", "setnl", Eb, XX, XX }, +Ia_setnle_Eb = { "setnle", "setnle", Eb, XX, XX }, +Ia_setno_Eb = { "setno", "setno", Eb, XX, XX }, +Ia_setnp_Eb = { "setnp", "setnp", Eb, XX, XX }, +Ia_setns_Eb = { "setns", "setns", Eb, XX, XX }, +Ia_setnz_Eb = { "setnz", "setnz", Eb, XX, XX }, +Ia_seto_Eb = { "seto", "seto", Eb, XX, XX }, +Ia_setp_Eb = { "setp", "setp", Eb, XX, XX }, +Ia_sets_Eb = { "sets", "sets", Eb, XX, XX }, +Ia_setz_Eb = { "setz", "setz", Eb, XX, XX }, +Ia_sfence = { "sfence", "sfence", XX, XX, XX }, +Ia_sgdt = { "sgdt", "sgdt", Ms, XX, XX }, +Ia_shlb_Eb_CL = { "shl", "shlb", Eb, CL, XX }, +Ia_shlb_Eb_I1 = { "shl", "shlb", Eb, I1, XX }, +Ia_shlb_Eb_Ib = { "shl", "shlb", Eb, Ib, XX }, +Ia_shldl_Ed_Gd_CL = { "shld", "shldl", Ed, Gd, CL }, +Ia_shldl_Ed_Gd_Ib = { "shld", "shldl", Ed, Gd, Ib }, +Ia_shldq_Eq_Gq_CL = { "shld", "shldq", Eq, Gq, CL }, +Ia_shldq_Eq_Gq_Ib = { "shld", "shldq", Eq, Gq, Ib }, +Ia_shldw_Ew_Gw_CL = { "shld", "shldw", Ew, Gw, CL }, +Ia_shldw_Ew_Gw_Ib = { "shld", "shldw", Ew, Gw, Ib }, +Ia_shll_Ed_CL = { "shl", "shll", Ed, CL, XX }, +Ia_shll_Ed_I1 = { "shl", "shll", Ed, I1, XX }, +Ia_shll_Ed_Ib = { "shl", "shll", Ed, Ib, XX }, +Ia_shlq_Eq_CL = { "shl", "shlq", Eq, CL, XX }, +Ia_shlq_Eq_I1 = { "shl", "shlq", Eq, I1, XX }, +Ia_shlq_Eq_Ib = { "shl", "shlq", Eq, Ib, XX }, +Ia_shlw_Ew_CL = { "shl", "shlw", Ew, CL, XX }, +Ia_shlw_Ew_I1 = { "shl", "shlw", Ew, I1, XX }, +Ia_shlw_Ew_Ib = { "shl", "shlw", Ew, Ib, XX }, +Ia_shrb_Eb_CL = { "shr", "shrb", Eb, CL, XX }, +Ia_shrb_Eb_I1 = { "shr", "shrb", Eb, I1, XX }, +Ia_shrb_Eb_Ib = { "shr", "shrb", Eb, Ib, XX }, +Ia_shrdl_Ed_Gd_CL = { "shrd", "shrdl", Ed, Gd, CL }, +Ia_shrdl_Ed_Gd_Ib = { "shrd", "shrdl", Ed, Gd, Ib }, +Ia_shrdq_Eq_Gq_CL = { "shrd", "shrdq", Eq, Gq, CL }, +Ia_shrdq_Eq_Gq_Ib = { "shrd", "shrdq", Eq, Gq, Ib }, +Ia_shrdw_Ew_Gw_CL = { "shrd", "shrdw", Ew, Gw, CL }, +Ia_shrdw_Ew_Gw_Ib = { "shrd", "shrdw", Ew, Gw, Ib }, +Ia_shrl_Ed_CL = { "shr", "shrl", Ed, CL, XX }, +Ia_shrl_Ed_I1 = { "shr", "shrl", Ed, I1, XX }, +Ia_shrl_Ed_Ib = { "shr", "shrl", Ed, Ib, XX }, +Ia_shrq_Eq_CL = { "shr", "shrq", Eq, CL, XX }, +Ia_shrq_Eq_I1 = { "shr", "shrq", Eq, I1, XX }, +Ia_shrq_Eq_Ib = { "shr", "shrq", Eq, Ib, XX }, +Ia_shrw_Ew_CL = { "shr", "shrw", Ew, CL, XX }, +Ia_shrw_Ew_I1 = { "shr", "shrw", Ew, I1, XX }, +Ia_shrw_Ew_Ib = { "shr", "shrw", Ew, Ib, XX }, +Ia_shufpd_Vpd_Wpd_Ib = { "shufpd", "shufpd", Vpd, Wpd, Ib }, +Ia_shufps_Vps_Wps_Ib = { "shufps", "shufps", Vps, Wps, Ib }, +Ia_sidt = { "sidt", "sidt", Ms, XX, XX }, +Ia_sldt = { "sldt", "sldt", Ew, XX, XX }, +Ia_smsw_Ew = { "smsw", "smsw", Ew, XX, XX }, +Ia_sqrtpd_Vpd_Wpd = { "sqrtpd", "sqrtpd", Vpd, Wpd, XX }, +Ia_sqrtps_Vps_Wps = { "sqrtps", "sqrtps", Vps, Wps, XX }, +Ia_sqrtsd_Vsd_Wsd = { "sqrtsd", "sqrtsd", Vsd, Wsd, XX }, +Ia_sqrtss_Vss_Wss = { "sqrtss", "sqrtss", Vss, Wss, XX }, +Ia_stc = { "stc", "stc", XX, XX, XX }, +Ia_std = { "std", "std", XX, XX, XX }, +Ia_sti = { "sti", "sti", XX, XX, XX }, +Ia_stmxcsr = { "stmxcsr", "stmxcsr", Md, XX, XX }, +Ia_stosb_Yb_AL = { "stosb", "stosb", Yb, AL, XX }, +Ia_stosl_Yd_EAX = { "stosd", "stosl", Yd, EAX, XX }, +Ia_stosq_Yq_RAX = { "stosq", "stosq", Yq, RAX, XX }, +Ia_stosw_Yw_AX = { "stosw", "stosw", Yw, AX, XX }, +Ia_str = { "str", "str", Ew, XX, XX }, +Ia_subb_AL_Ib = { "sub", "subb", AL, Ib, XX }, +Ia_subb_Eb_Gb = { "sub", "subb", Eb, Gb, XX }, +Ia_subb_Eb_Ib = { "sub", "subb", Eb, Ib, XX }, +Ia_subb_Gb_Eb = { "sub", "subb", Gb, Eb, XX }, +Ia_subl_EAX_Id = { "sub", "subl", EAX, Id, XX }, +Ia_subl_Ed_Gd = { "sub", "subl", Ed, Gd, XX }, +Ia_subl_Ed_Id = { "sub", "subl", Ed, Id, XX }, +Ia_subl_Ed_sIb = { "sub", "subl", Ed, sIbd, XX }, +Ia_subl_Gd_Ed = { "sub", "subl", Gd, Ed, XX }, +Ia_subpd_Vpd_Wpd = { "subpd", "subpd", Vpd, Wpd, XX }, +Ia_subps_Vps_Wps = { "subps", "subps", Vps, Wps, XX }, +Ia_subq_Eq_Gq = { "sub", "subq", Eq, Gq, XX }, +Ia_subq_Eq_sIb = { "sub", "subq", Eq, sIbq, XX }, +Ia_subq_Eq_sId = { "sub", "subq", Eq, sIdq, XX }, +Ia_subq_Gq_Eq = { "sub", "subq", Gq, Eq, XX }, +Ia_subq_RAX_sId = { "sub", "subq", RAX, sIdq, XX }, +Ia_subsd_Vsd_Wsd = { "subsd", "subsd", Vsd, Wsd, XX }, +Ia_subss_Vss_Wss = { "subss", "subss", Vss, Wss, XX }, +Ia_subw_AX_Iw = { "sub", "subw", AX, Iw, XX }, +Ia_subw_Ew_Gw = { "sub", "subw", Ew, Gw, XX }, +Ia_subw_Ew_Iw = { "sub", "subw", Ew, Iw, XX }, +Ia_subw_Ew_sIb = { "sub", "subw", Ew, sIbw, XX }, +Ia_subw_Gw_Ew = { "sub", "subw", Gw, Ew, XX }, +Ia_swapgs = { "swapgs", "swapgs", XX, XX, XX }, +Ia_syscall = { "syscall", "syscall", XX, XX, XX }, +Ia_sysenter = { "sysenter", "sysenter", XX, XX, XX }, +Ia_sysexit = { "sysexit", "sysexit", XX, XX, XX }, +Ia_sysret = { "sysret", "sysret", XX, XX, XX }, +Ia_testb_AL_Ib = { "test", "testb", AL, Ib, XX }, +Ia_testb_Eb_Gb = { "test", "testb", Eb, Gb, XX }, +Ia_testb_Eb_Ib = { "test", "testb", Eb, Ib, XX }, +Ia_testl_EAX_Id = { "test", "testl", EAX, Id, XX }, +Ia_testl_Ed_Gd = { "test", "testl", Ed, Gd, XX }, +Ia_testl_Ed_Id = { "test", "testl", Ed, Id, XX }, +Ia_testq_Eq_Gq = { "test", "testq", Eq, Gq, XX }, +Ia_testq_Eq_sId = { "test", "testq", Eq, sIdq, XX }, +Ia_testq_RAX_sId = { "test", "testq", RAX, sIdq, XX }, +Ia_testw_AX_Iw = { "test", "testw", AX, Iw, XX }, +Ia_testw_Ew_Gw = { "test", "testw", Ew, Gw, XX }, +Ia_testw_Ew_Iw = { "test", "testw", Ew, Iw, XX }, +Ia_ucomisd_Vsd_Wss = { "ucomisd", "ucomisd", Vsd, Wsd, XX }, +Ia_ucomiss_Vss_Wss = { "ucomiss", "ucomiss", Vss, Wss, XX }, +Ia_ud2a = { "ud2a", "ud2a", XX, XX, XX }, +Ia_ud2b = { "ud2b", "ud2b", XX, XX, XX }, +Ia_unpckhpd_Vpd_Wdq = { "unpckhpd", "unpckhpd", Vpd, Wdq, XX }, +Ia_unpckhps_Vps_Wdq = { "unpckhps", "unpckhps", Vps, Wdq, XX }, +Ia_unpcklpd_Vpd_Wq = { "unpcklpd", "unpcklpd", Vpd, Wq, XX }, +Ia_unpcklps_Vps_Wq = { "unpcklps", "unpcklps", Vps, Wq, XX }, +Ia_verr = { "verr", "verr", Ew, XX, XX }, +Ia_verw = { "verw", "verw", Ew, XX, XX }, +Ia_wbinvd = { "wbinvd", "wbinvd", XX, XX, XX }, +Ia_wrmsr = { "wrmsr", "wrmsr", XX, XX, XX }, +Ia_xaddb_Eb_Gb = { "xadd", "xaddb", Eb, Gb, XX }, +Ia_xaddl_Ed_Gd = { "xadd", "xaddl", Ed, Gd, XX }, +Ia_xaddq_Eq_Gq = { "xadd", "xaddq", Eq, Gq, XX }, +Ia_xaddw_Ew_Gw = { "xadd", "xaddw", Ew, Gw, XX }, +Ia_xchgb_Eb_Gb = { "xchg", "xchgb", Eb, Gb, XX }, +Ia_xchgl_Ed_Gd = { "xchg", "xchgl", Ed, Gd, XX }, +Ia_xchgl_ERX_EAX = { "xchg", "xchgl", ERX, EAX, XX }, +Ia_xchgq_Eq_Gq = { "xchg", "xchgq", Eq, Gq, XX }, +Ia_xchgq_RRX_RAX = { "xchg", "xchgq", RRX, RAX, XX }, +Ia_xchgw_Ew_Gw = { "xchg", "xchgw", Ew, Gw, XX }, +Ia_xchgw_RX_AX = { "xchg", "xchgw", RX, AX, XX }, +Ia_xlat = { "xlat", "xlat", XX, XX, XX }, +Ia_xorb_AL_Ib = { "xor", "xorb", AL, Ib, XX }, +Ia_xorb_Eb_Gb = { "xor", "xorb", Eb, Gb, XX }, +Ia_xorb_Eb_Ib = { "xor", "xorb", Eb, Ib, XX }, +Ia_xorb_Gb_Eb = { "xor", "xorb", Gb, Eb, XX }, +Ia_xorl_EAX_Id = { "xor", "xorl", EAX, Id, XX }, +Ia_xorl_Ed_Gd = { "xor", "xorl", Ed, Gd, XX }, +Ia_xorl_Ed_Id = { "xor", "xorl", Ed, Id, XX }, +Ia_xorl_Ed_sIb = { "xor", "xorl", Ed, sIbd, XX }, +Ia_xorl_Gd_Ed = { "xor", "xorl", Gd, Ed, XX }, +Ia_xorpd_Vpd_Wpd = { "xorpd", "xorpd", Vpd, Wpd, XX }, +Ia_xorps_Vps_Wps = { "xorps", "xorps", Vps, Wps, XX }, +Ia_xorq_Eq_Gq = { "xor", "xorq", Eq, Gq, XX }, +Ia_xorq_Eq_sIb = { "xor", "xorq", Eq, sIbq, XX }, +Ia_xorq_Eq_sId = { "xor", "xorq", Eq, sIdq, XX }, +Ia_xorq_Gq_Eq = { "xor", "xorq", Gq, Eq, XX }, +Ia_xorq_RAX_sId = { "xor", "xorq", RAX, sIdq, XX }, +Ia_xorw_AX_Iw = { "xor", "xorw", AX, Iw, XX }, +Ia_xorw_Ew_Gw = { "xor", "xorw", Ew, Gw, XX }, +Ia_xorw_Ew_Iw = { "xor", "xorw", Ew, Iw, XX }, +Ia_xorw_Ew_sIb = { "xor", "xorw", Ew, sIbw, XX }, +Ia_xorw_Gw_Ew = { "xor", "xorw", Gw, Ew, XX }; diff --git a/Externals/Bochs_disasm/resolve.cpp b/Externals/Bochs_disasm/resolve.cpp new file mode 100644 index 0000000000..3bf2d344dc --- /dev/null +++ b/Externals/Bochs_disasm/resolve.cpp @@ -0,0 +1,460 @@ +///////////////////////////////////////////////////////////////////////// +// $Id: resolve.cc,v 1.13 2006/08/11 17:22:43 sshwarts Exp $ +///////////////////////////////////////////////////////////////////////// +#include +#include +#include "disasm.h" + +void disassembler::decode_modrm(x86_insn *insn) +{ + insn->modrm = fetch_byte(); + BX_DECODE_MODRM(insn->modrm, insn->mod, insn->nnn, insn->rm); + // MOVs with CRx and DRx always use register ops and ignore the mod field. + if ((insn->b1 & ~3) == 0x120) insn->mod = 3; + insn->nnn |= insn->rex_r; + + if (insn->mod == 3) { + /* mod, reg, reg */ + insn->rm |= insn->rex_b; + return; + } + + if (insn->as_64) + { + if (insn->rm != 4) { /* rm != 100b, no s-i-b byte */ + insn->rm |= insn->rex_b; + // one byte modrm + switch (insn->mod) { + case 0: + resolve_modrm = &disassembler::resolve64_mod0; + if ((insn->rm & 7) == 5) /* no reg, 32-bit displacement */ + insn->displacement.displ32 = fetch_dword(); + break; + case 1: + /* reg, 8-bit displacement, sign extend */ + resolve_modrm = &disassembler::resolve64_mod1or2; + insn->displacement.displ32 = (Bit8s) fetch_byte(); + break; + case 2: + /* reg, 32-bit displacement */ + resolve_modrm = &disassembler::resolve64_mod1or2; + insn->displacement.displ32 = fetch_dword(); + break; + } /* switch (mod) */ + } /* if (rm != 4) */ + else { /* rm == 4, s-i-b byte follows */ + insn->sib = fetch_byte(); + BX_DECODE_SIB(insn->sib, insn->scale, insn->index, insn->base); + insn->base |= insn->rex_b; + insn->index |= insn->rex_x; + + switch (insn->mod) { + case 0: + resolve_modrm = &disassembler::resolve64_mod0_rm4; + if ((insn->base & 7) == 5) + insn->displacement.displ32 = fetch_dword(); + break; + case 1: + resolve_modrm = &disassembler::resolve64_mod1or2_rm4; + insn->displacement.displ32 = (Bit8s) fetch_byte(); + break; + case 2: + resolve_modrm = &disassembler::resolve64_mod1or2_rm4; + insn->displacement.displ32 = fetch_dword(); + break; + } + } /* s-i-b byte follows */ + } + else + { + if (insn->as_32) + { + if (insn->rm != 4) { /* rm != 100b, no s-i-b byte */ + insn->rm |= insn->rex_b; + // one byte modrm + switch (insn->mod) { + case 0: + resolve_modrm = &disassembler::resolve32_mod0; + if ((insn->rm & 7) == 5) /* no reg, 32-bit displacement */ + insn->displacement.displ32 = fetch_dword(); + break; + case 1: + /* reg, 8-bit displacement, sign extend */ + resolve_modrm = &disassembler::resolve32_mod1or2; + insn->displacement.displ32 = (Bit8s) fetch_byte(); + break; + case 2: + /* reg, 32-bit displacement */ + resolve_modrm = &disassembler::resolve32_mod1or2; + insn->displacement.displ32 = fetch_dword(); + break; + } /* switch (mod) */ + } /* if (rm != 4) */ + else { /* rm == 4, s-i-b byte follows */ + insn->sib = fetch_byte(); + BX_DECODE_SIB(insn->sib, insn->scale, insn->index, insn->base); + insn->base |= insn->rex_b; + insn->index |= insn->rex_x; + + switch (insn->mod) { + case 0: + resolve_modrm = &disassembler::resolve32_mod0_rm4; + if ((insn->base & 7) == 5) + insn->displacement.displ32 = fetch_dword(); + break; + case 1: + resolve_modrm = &disassembler::resolve32_mod1or2_rm4; + insn->displacement.displ32 = (Bit8s) fetch_byte(); + break; + case 2: + resolve_modrm = &disassembler::resolve32_mod1or2_rm4; + insn->displacement.displ32 = fetch_dword(); + break; + } + } /* s-i-b byte follows */ + } + else { + assert(insn->rex_b == 0); + assert(insn->rex_x == 0); + assert(insn->rex_r == 0); + /* 16 bit addressing modes. */ + switch (insn->mod) { + case 0: + resolve_modrm = &disassembler::resolve16_mod0; + if(insn->rm == 6) + insn->displacement.displ16 = fetch_word(); + break; + case 1: + /* reg, 8-bit displacement, sign extend */ + resolve_modrm = &disassembler::resolve16_mod1or2; + insn->displacement.displ16 = (Bit8s) fetch_byte(); + break; + case 2: + resolve_modrm = &disassembler::resolve16_mod1or2; + insn->displacement.displ16 = fetch_word(); + break; + } /* switch (mod) ... */ + } + } +} + +void disassembler::resolve16_mod0(const x86_insn *insn, unsigned mode) +{ + const char *seg; + + if (insn->is_seg_override()) + seg = segment_name[insn->seg_override]; + else + seg = sreg_mod00_rm16[insn->rm]; + + if(insn->rm == 6) + print_memory_access16(mode, seg, NULL, insn->displacement.displ16); + else + print_memory_access16(mode, seg, index16[insn->rm], 0); +} + +void disassembler::resolve16_mod1or2(const x86_insn *insn, unsigned mode) +{ + const char *seg; + + if (insn->is_seg_override()) + seg = segment_name[insn->seg_override]; + else + seg = sreg_mod01or10_rm16[insn->rm]; + + print_memory_access16(mode, seg, index16[insn->rm], insn->displacement.displ16); +} + +void disassembler::resolve32_mod0(const x86_insn *insn, unsigned mode) +{ + const char *seg; + + if (insn->is_seg_override()) + seg = segment_name[insn->seg_override]; + else + seg = segment_name[DS_REG]; + + if ((insn->rm & 7) == 5) /* no reg, 32-bit displacement */ + print_memory_access(mode, seg, NULL, NULL, 0, insn->displacement.displ32); + else + print_memory_access(mode, seg, general_32bit_regname[insn->rm], NULL, 0, 0); +} + +void disassembler::resolve32_mod1or2(const x86_insn *insn, unsigned mode) +{ + const char *seg; + + if (insn->is_seg_override()) + seg = segment_name[insn->seg_override]; + else + seg = sreg_mod01or10_rm32[insn->rm]; + + print_memory_access(mode, seg, + general_32bit_regname[insn->rm], NULL, 0, insn->displacement.displ32); +} + +void disassembler::resolve32_mod0_rm4(const x86_insn *insn, unsigned mode) +{ + const char *seg, *base = NULL, *index = NULL; + Bit32u disp32 = 0; + + if (insn->is_seg_override()) + seg = segment_name[insn->seg_override]; + else + seg = sreg_mod00_base32[insn->base]; + + if ((insn->base & 7) != 5) + base = general_32bit_regname[insn->base]; + else + disp32 = insn->displacement.displ32; + + if (insn->index != 4) + index = general_32bit_regname[insn->index]; + + print_memory_access(mode, seg, base, index, insn->scale, disp32); +} + +void disassembler::resolve32_mod1or2_rm4(const x86_insn *insn, unsigned mode) +{ + const char *seg, *index = NULL; + + if (insn->is_seg_override()) + seg = segment_name[insn->seg_override]; + else + seg = sreg_mod01or10_base32[insn->base]; + + if (insn->index != 4) + index = general_32bit_regname[insn->index]; + + print_memory_access(mode, seg, + general_32bit_regname[insn->base], index, insn->scale, insn->displacement.displ32); +} + +void disassembler::resolve64_mod0(const x86_insn *insn, unsigned mode) +{ + const char *seg, *rip_regname; + + if (insn->is_seg_override()) + seg = segment_name[insn->seg_override]; + else + seg = segment_name[DS_REG]; + + if (intel_mode) rip_regname = "rip"; + else rip_regname = "%rip"; + + if ((insn->rm & 7) == 5) /* no reg, 32-bit displacement */ + print_memory_access(mode, seg, rip_regname, NULL, 0, insn->displacement.displ32); + else + print_memory_access(mode, seg, general_64bit_regname[insn->rm], NULL, 0, 0); +} + +void disassembler::resolve64_mod1or2(const x86_insn *insn, unsigned mode) +{ + const char *seg; + + if (insn->is_seg_override()) + seg = segment_name[insn->seg_override]; + else + seg = sreg_mod01or10_rm32[insn->rm]; + + print_memory_access(mode, seg, + general_64bit_regname[insn->rm], NULL, 0, insn->displacement.displ32); +} + +void disassembler::resolve64_mod0_rm4(const x86_insn *insn, unsigned mode) +{ + const char *seg, *base = NULL, *index = NULL; + Bit32u disp32 = 0; + + if (insn->is_seg_override()) + seg = segment_name[insn->seg_override]; + else + seg = sreg_mod00_base32[insn->base]; + + if ((insn->base & 7) != 5) + base = general_64bit_regname[insn->base]; + else + disp32 = insn->displacement.displ32; + + if (insn->index != 4) + index = general_64bit_regname[insn->index]; + + print_memory_access(mode, seg, base, index, insn->scale, disp32); +} + +void disassembler::resolve64_mod1or2_rm4(const x86_insn *insn, unsigned mode) +{ + const char *seg, *index = NULL; + + if (insn->is_seg_override()) + seg = segment_name[insn->seg_override]; + else + seg = sreg_mod01or10_base32[insn->base]; + + if (insn->index != 4) + index = general_64bit_regname[insn->index]; + + print_memory_access(mode, seg, + general_64bit_regname[insn->base], index, insn->scale, insn->displacement.displ32); +} + +void disassembler::print_datasize(unsigned size) +{ + if (!intel_mode) return; + + switch(size) + { + case B_SIZE: + dis_sprintf("byte ptr "); + break; + case W_SIZE: + dis_sprintf("word ptr "); + break; + case D_SIZE: + dis_sprintf("dword ptr "); + break; + case Q_SIZE: + dis_sprintf("qword ptr "); + break; + case O_SIZE: + dis_sprintf("dqword ptr "); + break; + case T_SIZE: + dis_sprintf("tbyte ptr "); + break; + case P_SIZE: + break; + case X_SIZE: + break; + }; +} + +void disassembler::print_memory_access16(int datasize, + const char *seg, const char *index, Bit16u disp) +{ + print_datasize(datasize); + + if (intel_mode) + { + if (index == NULL) + { + dis_sprintf("%s:0x%x", seg, (unsigned) disp); + } + else + { + if (disp != 0) + dis_sprintf("%s:[%s+0x%x]", seg, index, (unsigned) disp); + else + dis_sprintf("%s:[%s]", seg, index); + } + } + else + { + if (index == NULL) + { + dis_sprintf("%s:0x%x", seg, (unsigned) disp); + } + else + { + if (disp != 0) + dis_sprintf("%s:0x%x(%s,1)", seg, (unsigned) disp, index); + else + dis_sprintf("%s:(%s,1)", seg, index); + } + } +} + +void disassembler::print_memory_access(int datasize, + const char *seg, const char *base, const char *index, int scale, Bit32u disp) +{ + print_datasize(datasize); + + if (intel_mode) + { + if (base == NULL) + { + if (index == NULL) + { + dis_sprintf("%s:0x%x", seg, (unsigned) disp); + } + else + { + if (scale != 0) + { + if (disp != 0) + dis_sprintf("%s:[%s*%d+0x%x]", seg, index, 1< +#include +#include + + + +// TODO: reference additional headers your program requires here diff --git a/Externals/Bochs_disasm/syntax.cpp b/Externals/Bochs_disasm/syntax.cpp new file mode 100644 index 0000000000..a53eb3991e --- /dev/null +++ b/Externals/Bochs_disasm/syntax.cpp @@ -0,0 +1,254 @@ +///////////////////////////////////////////////////////////////////////// +// $Id: syntax.cc,v 1.10 2006/04/27 15:11:45 sshwarts Exp $ +///////////////////////////////////////////////////////////////////////// +#include +#include "disasm.h" + +////////////////// +// Intel STYLE +////////////////// + +#define BX_DISASM_SUPPORT_X86_64 + +#ifdef BX_DISASM_SUPPORT_X86_64 + +static const char *intel_general_16bit_regname[16] = { + "ax", "cx", "dx", "bx", "sp", "bp", "si", "di", + "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w" +}; + +static const char *intel_general_32bit_regname[16] = { + "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi", + "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d" +}; + +static const char *intel_general_64bit_regname[16] = { + "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi", + "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15" +}; + +static const char *intel_general_8bit_regname_rex[16] = { + "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil", + "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b" +}; + +#else + +static const char *intel_general_16bit_regname[8] = { + "ax", "cx", "dx", "bx", "sp", "bp", "si", "di" +}; + +static const char *intel_general_32bit_regname[8] = { + "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi" +}; + +#endif + +static const char *intel_general_8bit_regname[8] = { + "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh" +}; + +static const char *intel_segment_name[8] = { + "es", "cs", "ss", "ds", "fs", "gs", "??", "??" +}; + +static const char *intel_index16[8] = { + "bx+si", + "bx+di", + "bp+si", + "bp+di", + "si", + "di", + "bp", + "bx" +}; + + +////////////////// +// AT&T STYLE +////////////////// + +#ifdef BX_DISASM_SUPPORT_X86_64 + +static const char *att_general_16bit_regname[16] = { + "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di", + "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w" +}; + +static const char *att_general_32bit_regname[16] = { + "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi", + "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d" +}; + +static const char *att_general_64bit_regname[16] = { + "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi", + "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15" +}; + +static const char *att_general_8bit_regname_rex[16] = { + "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil", + "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b" +}; + +#else + +static const char *att_general_16bit_regname[8] = { + "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di" +}; + +static const char *att_general_32bit_regname[8] = { + "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi" +}; + +#endif + +static const char *att_general_8bit_regname[8] = { + "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh" +}; + +static const char *att_segment_name[8] = { + "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%??", "%??" +}; + +static const char *att_index16[8] = { + "%bx, %si", + "%bx, %di", + "%bp, %si", + "%bp, %di", + "%si", + "%di", + "%bp", + "%bx" +}; + +#define NULL_SEGMENT_REGISTER 7 + +void disassembler::initialize_modrm_segregs() +{ + sreg_mod00_rm16[0] = segment_name[DS_REG]; + sreg_mod00_rm16[1] = segment_name[DS_REG]; + sreg_mod00_rm16[2] = segment_name[SS_REG]; + sreg_mod00_rm16[3] = segment_name[SS_REG]; + sreg_mod00_rm16[4] = segment_name[DS_REG]; + sreg_mod00_rm16[5] = segment_name[DS_REG]; + sreg_mod00_rm16[6] = segment_name[DS_REG]; + sreg_mod00_rm16[7] = segment_name[DS_REG]; + + sreg_mod01or10_rm16[0] = segment_name[DS_REG]; + sreg_mod01or10_rm16[1] = segment_name[DS_REG]; + sreg_mod01or10_rm16[2] = segment_name[SS_REG]; + sreg_mod01or10_rm16[3] = segment_name[SS_REG]; + sreg_mod01or10_rm16[4] = segment_name[DS_REG]; + sreg_mod01or10_rm16[5] = segment_name[DS_REG]; + sreg_mod01or10_rm16[6] = segment_name[SS_REG]; + sreg_mod01or10_rm16[7] = segment_name[DS_REG]; + + sreg_mod01or10_rm32[0] = segment_name[DS_REG]; + sreg_mod01or10_rm32[1] = segment_name[DS_REG]; + sreg_mod01or10_rm32[2] = segment_name[DS_REG]; + sreg_mod01or10_rm32[3] = segment_name[DS_REG]; + sreg_mod01or10_rm32[4] = segment_name[NULL_SEGMENT_REGISTER]; + sreg_mod01or10_rm32[5] = segment_name[SS_REG]; + sreg_mod01or10_rm32[6] = segment_name[DS_REG]; + sreg_mod01or10_rm32[7] = segment_name[DS_REG]; + + sreg_mod00_base32[0] = segment_name[DS_REG]; + sreg_mod00_base32[1] = segment_name[DS_REG]; + sreg_mod00_base32[2] = segment_name[DS_REG]; + sreg_mod00_base32[3] = segment_name[DS_REG]; + sreg_mod00_base32[4] = segment_name[SS_REG]; + sreg_mod00_base32[5] = segment_name[DS_REG]; + sreg_mod00_base32[6] = segment_name[DS_REG]; + sreg_mod00_base32[7] = segment_name[DS_REG]; + + sreg_mod01or10_base32[0] = segment_name[DS_REG]; + sreg_mod01or10_base32[1] = segment_name[DS_REG]; + sreg_mod01or10_base32[2] = segment_name[DS_REG]; + sreg_mod01or10_base32[3] = segment_name[DS_REG]; + sreg_mod01or10_base32[4] = segment_name[SS_REG]; + sreg_mod01or10_base32[5] = segment_name[SS_REG]; + sreg_mod01or10_base32[6] = segment_name[DS_REG]; + sreg_mod01or10_base32[7] = segment_name[DS_REG]; +} + +////////////////// +// Intel STYLE +////////////////// + +void disassembler::set_syntax_intel() +{ + intel_mode = 1; + + general_16bit_regname = intel_general_16bit_regname; + general_8bit_regname = intel_general_8bit_regname; + general_32bit_regname = intel_general_32bit_regname; + general_8bit_regname_rex = intel_general_8bit_regname_rex; + general_64bit_regname = intel_general_64bit_regname; + + segment_name = intel_segment_name; + index16 = intel_index16; + + initialize_modrm_segregs(); +} + +void disassembler::print_disassembly_intel(const x86_insn *insn, const BxDisasmOpcodeInfo_t *entry) +{ + // print opcode + dis_sprintf("%s ", entry->IntelOpcode); + + if (entry->Operand1) { + (this->*entry->Operand1)(insn); + } + if (entry->Operand2) { + dis_sprintf(", "); + (this->*entry->Operand2)(insn); + } + if (entry->Operand3) { + dis_sprintf(", "); + (this->*entry->Operand3)(insn); + } +} + +////////////////// +// AT&T STYLE +////////////////// + +void disassembler::set_syntax_att() +{ + intel_mode = 0; + + general_16bit_regname = att_general_16bit_regname; + general_8bit_regname = att_general_8bit_regname; + general_32bit_regname = att_general_32bit_regname; + general_8bit_regname_rex = att_general_8bit_regname_rex; + general_64bit_regname = att_general_64bit_regname; + + segment_name = att_segment_name; + index16 = att_index16; + + initialize_modrm_segregs(); +} + +void disassembler::toggle_syntax_mode() +{ + if (intel_mode) set_syntax_att(); + else set_syntax_intel(); +} + +void disassembler::print_disassembly_att(const x86_insn *insn, const BxDisasmOpcodeInfo_t *entry) +{ + // print opcode + dis_sprintf("%s ", entry->AttOpcode); + + if (entry->Operand3) { + (this->*entry->Operand3)(insn); + dis_sprintf(", "); + } + if (entry->Operand2) { + (this->*entry->Operand2)(insn); + dis_sprintf(", "); + } + if (entry->Operand1) { + (this->*entry->Operand1)(insn); + } +} diff --git a/Externals/Cg/cg.h b/Externals/Cg/cg.h new file mode 100644 index 0000000000..0f2047338f --- /dev/null +++ b/Externals/Cg/cg.h @@ -0,0 +1,705 @@ +/* + * + * Copyright (c) 2002-2007, NVIDIA Corporation. + * + * + * + * NVIDIA Corporation("NVIDIA") supplies this software to you in consideration + * of your agreement to the following terms, and your use, installation, + * modification or redistribution of this NVIDIA software constitutes + * acceptance of these terms. If you do not agree with these terms, please do + * not use, install, modify or redistribute this NVIDIA software. + * + * + * + * In consideration of your agreement to abide by the following terms, and + * subject to these terms, NVIDIA grants you a personal, non-exclusive license, + * under NVIDIA's copyrights in this original NVIDIA software (the "NVIDIA + * Software"), to use, reproduce, modify and redistribute the NVIDIA + * Software, with or without modifications, in source and/or binary forms; + * provided that if you redistribute the NVIDIA Software, you must retain the + * copyright notice of NVIDIA, this notice and the following text and + * disclaimers in all such redistributions of the NVIDIA Software. Neither the + * name, trademarks, service marks nor logos of NVIDIA Corporation may be used + * to endorse or promote products derived from the NVIDIA Software without + * specific prior written permission from NVIDIA. Except as expressly stated + * in this notice, no other rights or licenses express or implied, are granted + * by NVIDIA herein, including but not limited to any patent rights that may be + * infringed by your derivative works or by other works in which the NVIDIA + * Software may be incorporated. No hardware is licensed hereunder. + * + * + * + * THE NVIDIA SOFTWARE IS BEING PROVIDED ON AN "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING + * WITHOUT LIMITATION, WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR ITS USE AND OPERATION + * EITHER ALONE OR IN COMBINATION WITH OTHER PRODUCTS. + * + * + * + * IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL, + * EXEMPLARY, CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, LOST + * PROFITS; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) OR ARISING IN ANY WAY OUT OF THE USE, + * REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE NVIDIA SOFTWARE, + * HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING + * NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF NVIDIA HAS BEEN ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + + +#ifndef _cg_h +#define _cg_h + +/*************************************************************************/ +/*** CG Run-Time Library API ***/ +/*************************************************************************/ + +#define CG_VERSION_NUM 2000 + +#ifdef _WIN32 +# ifndef APIENTRY /* From Win32's */ +# define CG_APIENTRY_DEFINED +# if (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED) || defined(__BORLANDC__) || defined(__LCC__) +# define APIENTRY __stdcall +# else +# define APIENTRY +# endif +# endif +# ifndef WINGDIAPI /* From Win32's and */ +# define CG_WINGDIAPI_DEFINED +# define WINGDIAPI __declspec(dllimport) +# endif +#endif /* _WIN32 */ + +/* Set up for either Win32 import/export/lib. */ +#ifndef CG_API +# ifdef _WIN32 +# ifdef CG_EXPORTS +# define CG_API __declspec(dllexport) +# elif defined (CG_LIB) +# define CG_API +# else +# define CG_API __declspec(dllimport) +# endif +# else +# define CG_API +# endif +#endif + +#ifndef CGENTRY +# ifdef _WIN32 +# define CGENTRY __cdecl +# else +# define CGENTRY +# endif +#endif + +/*************************************************************************/ +/*** Data types and enumerants ***/ +/*************************************************************************/ + +typedef int CGbool; + +#define CG_FALSE ((CGbool)0) +#define CG_TRUE ((CGbool)1) + +typedef struct _CGcontext *CGcontext; +typedef struct _CGprogram *CGprogram; +typedef struct _CGparameter *CGparameter; +typedef struct _CGobj *CGobj; +typedef struct _CGbuffer *CGbuffer; +typedef struct _CGeffect *CGeffect; +typedef struct _CGtechnique *CGtechnique; +typedef struct _CGpass *CGpass; +typedef struct _CGstate *CGstate; +typedef struct _CGstateassignment *CGstateassignment; +typedef struct _CGannotation *CGannotation; +typedef void *CGhandle; + + +//!!! PREPROCESS BEGIN + +typedef enum + { + CG_UNKNOWN_TYPE, + CG_STRUCT, + CG_ARRAY, + CG_TYPELESS_STRUCT, + + CG_TYPE_START_ENUM = 1024, +# define CG_DATATYPE_MACRO(name, compiler_name, enum_name, base_name, ncols, nrows, pc) \ + enum_name , + +#include + +# undef CG_DATATYPE_MACRO + + + + } CGtype; + +typedef enum + { +# define CG_BINDLOCATION_MACRO(name,enum_name,compiler_name,\ + enum_int,addressable,param_type) \ + enum_name = enum_int, + +#include + + CG_UNDEFINED = 3256, + + } CGresource; + +typedef enum + { + CG_PROFILE_START = 6144, + CG_PROFILE_UNKNOWN, + +# define CG_PROFILE_MACRO(name, compiler_id, compiler_id_caps, compiler_opt,int_id,vertex_profile) \ + CG_PROFILE_##compiler_id_caps = int_id, + +#include + + CG_PROFILE_MAX = 7100, + } CGprofile; + +typedef enum + { +# define CG_ERROR_MACRO(code, enum_name, message) \ + enum_name = code, +# include + } CGerror; + +typedef enum + { +# define CG_ENUM_MACRO(enum_name, enum_val) \ + enum_name = enum_val, +# include + } CGenum; + +//!!! PREPROCESS END + +typedef enum + { + CG_PARAMETERCLASS_UNKNOWN = 0, + CG_PARAMETERCLASS_SCALAR, + CG_PARAMETERCLASS_VECTOR, + CG_PARAMETERCLASS_MATRIX, + CG_PARAMETERCLASS_STRUCT, + CG_PARAMETERCLASS_ARRAY, + CG_PARAMETERCLASS_SAMPLER, + CG_PARAMETERCLASS_OBJECT + } CGparameterclass; + +typedef enum +{ + CG_UNKNOWN_DOMAIN = 0, + CG_FIRST_DOMAIN = 1, + CG_VERTEX_DOMAIN = 1, + CG_FRAGMENT_DOMAIN, + CG_GEOMETRY_DOMAIN, + CG_NUMBER_OF_DOMAINS +} CGdomain; + +typedef enum +{ + CG_MAP_READ = 0, + CG_MAP_WRITE, + CG_MAP_READ_WRITE, + CG_MAP_WRITE_DISCARD, + CG_MAP_WRITE_NO_OVERWRITE +} CGbufferaccess; + +typedef enum +{ + CG_BUFFER_USAGE_STREAM_DRAW = 0, + CG_BUFFER_USAGE_STREAM_READ, + CG_BUFFER_USAGE_STREAM_COPY, + CG_BUFFER_USAGE_STATIC_DRAW, + CG_BUFFER_USAGE_STATIC_READ, + CG_BUFFER_USAGE_STATIC_COPY, + CG_BUFFER_USAGE_DYNAMIC_DRAW, + CG_BUFFER_USAGE_DYNAMIC_READ, + CG_BUFFER_USAGE_DYNAMIC_COPY +} CGbufferusage; + +#ifdef __cplusplus +extern "C" { +#endif + +typedef CGbool (CGENTRY * CGstatecallback)(CGstateassignment); +typedef void (CGENTRY * CGerrorCallbackFunc)(void); +typedef void (CGENTRY * CGerrorHandlerFunc)(CGcontext ctx, CGerror err, void *data); + +/*************************************************************************/ +/*** Functions ***/ +/*************************************************************************/ + +#ifndef CG_EXPLICIT + +/*** Library policy functions ***/ + +CG_API CGenum CGENTRY cgSetLockingPolicy(CGenum lockingPolicy); +CG_API CGenum CGENTRY cgGetLockingPolicy(void); +CG_API CGenum CGENTRY cgSetSemanticCasePolicy(CGenum casePolicy); +CG_API CGenum CGENTRY cgGetSemanticCasePolicy(void); + +/*** Context functions ***/ + +CG_API CGcontext CGENTRY cgCreateContext(void); +CG_API void CGENTRY cgDestroyContext(CGcontext ctx); +CG_API CGbool CGENTRY cgIsContext(CGcontext ctx); +CG_API const char * CGENTRY cgGetLastListing(CGcontext ctx); +CG_API void CGENTRY cgSetLastListing(CGhandle handle, const char *listing); +CG_API void CGENTRY cgSetAutoCompile(CGcontext ctx, CGenum flag); +CG_API CGenum CGENTRY cgGetAutoCompile(CGcontext ctx); +CG_API void CGENTRY cgSetParameterSettingMode(CGcontext ctx, CGenum parameterSettingMode); +CG_API CGenum CGENTRY cgGetParameterSettingMode(CGcontext ctx); + +/*** Program functions ***/ + +CG_API CGprogram CGENTRY cgCreateProgram(CGcontext ctx, + CGenum program_type, + const char *program, + CGprofile profile, + const char *entry, + const char **args); +CG_API CGprogram CGENTRY cgCreateProgramFromFile(CGcontext ctx, + CGenum program_type, + const char *program_file, + CGprofile profile, + const char *entry, + const char **args); +CG_API CGprogram CGENTRY cgCopyProgram(CGprogram program); +CG_API void CGENTRY cgDestroyProgram(CGprogram program); + +CG_API CGprogram CGENTRY cgGetFirstProgram(CGcontext ctx); +CG_API CGprogram CGENTRY cgGetNextProgram(CGprogram current); +CG_API CGcontext CGENTRY cgGetProgramContext(CGprogram prog); +CG_API CGbool CGENTRY cgIsProgram(CGprogram program); + +CG_API void CGENTRY cgCompileProgram(CGprogram program); +CG_API CGbool CGENTRY cgIsProgramCompiled(CGprogram program); +CG_API const char * CGENTRY cgGetProgramString(CGprogram prog, CGenum pname); +CG_API CGprofile CGENTRY cgGetProgramProfile(CGprogram prog); +CG_API char const * const * CGENTRY cgGetProgramOptions(CGprogram prog); +CG_API void CGENTRY cgSetProgramProfile(CGprogram prog, CGprofile profile); +CG_API CGenum CGENTRY cgGetProgramInput(CGprogram program); +CG_API CGenum CGENTRY cgGetProgramOutput(CGprogram program); +CG_API void CGENTRY cgSetPassProgramParameters(CGprogram); +CG_API void CGENTRY cgUpdateProgramParameters(CGprogram program); + +/*** Parameter functions ***/ + +CG_API CGparameter CGENTRY cgCreateParameter(CGcontext ctx, CGtype type); +CG_API CGparameter CGENTRY cgCreateParameterArray(CGcontext ctx, + CGtype type, + int length); +CG_API CGparameter CGENTRY cgCreateParameterMultiDimArray(CGcontext ctx, + CGtype type, + int dim, + const int *lengths); +CG_API void CGENTRY cgDestroyParameter(CGparameter param); +CG_API void CGENTRY cgConnectParameter(CGparameter from, CGparameter to); +CG_API void CGENTRY cgDisconnectParameter(CGparameter param); +CG_API CGparameter CGENTRY cgGetConnectedParameter(CGparameter param); + +CG_API int CGENTRY cgGetNumConnectedToParameters(CGparameter param); +CG_API CGparameter CGENTRY cgGetConnectedToParameter(CGparameter param, int index); + +CG_API CGparameter CGENTRY cgGetNamedParameter(CGprogram prog, const char *name); +CG_API CGparameter CGENTRY cgGetNamedProgramParameter(CGprogram prog, + CGenum name_space, + const char *name); + +CG_API CGparameter CGENTRY cgGetFirstParameter(CGprogram prog, CGenum name_space); +CG_API CGparameter CGENTRY cgGetNextParameter(CGparameter current); +CG_API CGparameter CGENTRY cgGetFirstLeafParameter(CGprogram prog, CGenum name_space); +CG_API CGparameter CGENTRY cgGetNextLeafParameter(CGparameter current); + +CG_API CGparameter CGENTRY cgGetFirstStructParameter(CGparameter param); +CG_API CGparameter CGENTRY cgGetNamedStructParameter(CGparameter param, + const char *name); + +CG_API CGparameter CGENTRY cgGetFirstDependentParameter(CGparameter param); + +CG_API CGparameter CGENTRY cgGetArrayParameter(CGparameter aparam, int index); +CG_API int CGENTRY cgGetArrayDimension(CGparameter param); +CG_API CGtype CGENTRY cgGetArrayType(CGparameter param); +CG_API int CGENTRY cgGetArraySize(CGparameter param, int dimension); +CG_API int CGENTRY cgGetArrayTotalSize(CGparameter param); +CG_API void CGENTRY cgSetArraySize(CGparameter param, int size); +CG_API void CGENTRY cgSetMultiDimArraySize(CGparameter param, const int *sizes); + +CG_API CGprogram CGENTRY cgGetParameterProgram(CGparameter param); +CG_API CGcontext CGENTRY cgGetParameterContext(CGparameter param); +CG_API CGbool CGENTRY cgIsParameter(CGparameter param); +CG_API const char * CGENTRY cgGetParameterName(CGparameter param); +CG_API CGtype CGENTRY cgGetParameterType(CGparameter param); +CG_API CGtype CGENTRY cgGetParameterBaseType(CGparameter param); +CG_API CGparameterclass CGENTRY cgGetParameterClass(CGparameter param); +CG_API int CGENTRY cgGetParameterRows(CGparameter param); +CG_API int CGENTRY cgGetParameterColumns(CGparameter param); +CG_API CGtype CGENTRY cgGetParameterNamedType(CGparameter param); +CG_API const char * CGENTRY cgGetParameterSemantic(CGparameter param); +CG_API CGresource CGENTRY cgGetParameterResource(CGparameter param); +CG_API CGresource CGENTRY cgGetParameterBaseResource(CGparameter param); +CG_API unsigned long CGENTRY cgGetParameterResourceIndex(CGparameter param); +CG_API CGenum CGENTRY cgGetParameterVariability(CGparameter param); +CG_API CGenum CGENTRY cgGetParameterDirection(CGparameter param); +CG_API CGbool CGENTRY cgIsParameterReferenced(CGparameter param); +CG_API CGbool CGENTRY cgIsParameterUsed(CGparameter param, CGhandle handle); +CG_API const double * CGENTRY cgGetParameterValues(CGparameter param, + CGenum value_type, + int *nvalues); +CG_API void CGENTRY cgSetParameterValuedr(CGparameter param, int n, const double *vals); +CG_API void CGENTRY cgSetParameterValuedc(CGparameter param, int n, const double *vals); +CG_API void CGENTRY cgSetParameterValuefr(CGparameter param, int n, const float *vals); +CG_API void CGENTRY cgSetParameterValuefc(CGparameter param, int n, const float *vals); +CG_API void CGENTRY cgSetParameterValueir(CGparameter param, int n, const int *vals); +CG_API void CGENTRY cgSetParameterValueic(CGparameter param, int n, const int *vals); +CG_API int CGENTRY cgGetParameterValuedr(CGparameter param, int n, double *vals); +CG_API int CGENTRY cgGetParameterValuedc(CGparameter param, int n, double *vals); +CG_API int CGENTRY cgGetParameterValuefr(CGparameter param, int n, float *vals); +CG_API int CGENTRY cgGetParameterValuefc(CGparameter param, int n, float *vals); +CG_API int CGENTRY cgGetParameterValueir(CGparameter param, int n, int *vals); +CG_API int CGENTRY cgGetParameterValueic(CGparameter param, int n, int *vals); +CG_API const char * CGENTRY cgGetStringParameterValue(CGparameter param); +CG_API void CGENTRY cgSetStringParameterValue(CGparameter param, const char *str); + +CG_API int CGENTRY cgGetParameterOrdinalNumber(CGparameter param); +CG_API CGbool CGENTRY cgIsParameterGlobal(CGparameter param); +CG_API int CGENTRY cgGetParameterIndex(CGparameter param); + +CG_API void CGENTRY cgSetParameterVariability(CGparameter param, CGenum vary); +CG_API void CGENTRY cgSetParameterSemantic(CGparameter param, const char *semantic); + +CG_API void CGENTRY cgSetParameter1f(CGparameter param, float x); +CG_API void CGENTRY cgSetParameter2f(CGparameter param, float x, float y); +CG_API void CGENTRY cgSetParameter3f(CGparameter param, float x, float y, float z); +CG_API void CGENTRY cgSetParameter4f(CGparameter param, + float x, + float y, + float z, + float w); +CG_API void CGENTRY cgSetParameter1d(CGparameter param, double x); +CG_API void CGENTRY cgSetParameter2d(CGparameter param, double x, double y); +CG_API void CGENTRY cgSetParameter3d(CGparameter param, + double x, + double y, + double z); +CG_API void CGENTRY cgSetParameter4d(CGparameter param, + double x, + double y, + double z, + double w); +CG_API void CGENTRY cgSetParameter1i(CGparameter param, int x); +CG_API void CGENTRY cgSetParameter2i(CGparameter param, int x, int y); +CG_API void CGENTRY cgSetParameter3i(CGparameter param, int x, int y, int z); +CG_API void CGENTRY cgSetParameter4i(CGparameter param, + int x, + int y, + int z, + int w); + +CG_API void CGENTRY cgSetParameter1iv(CGparameter param, const int *v); +CG_API void CGENTRY cgSetParameter2iv(CGparameter param, const int *v); +CG_API void CGENTRY cgSetParameter3iv(CGparameter param, const int *v); +CG_API void CGENTRY cgSetParameter4iv(CGparameter param, const int *v); +CG_API void CGENTRY cgSetParameter1fv(CGparameter param, const float *v); +CG_API void CGENTRY cgSetParameter2fv(CGparameter param, const float *v); +CG_API void CGENTRY cgSetParameter3fv(CGparameter param, const float *v); +CG_API void CGENTRY cgSetParameter4fv(CGparameter param, const float *v); +CG_API void CGENTRY cgSetParameter1dv(CGparameter param, const double *v); +CG_API void CGENTRY cgSetParameter2dv(CGparameter param, const double *v); +CG_API void CGENTRY cgSetParameter3dv(CGparameter param, const double *v); +CG_API void CGENTRY cgSetParameter4dv(CGparameter param, const double *v); + +CG_API void CGENTRY cgSetMatrixParameterir(CGparameter param, const int *matrix); +CG_API void CGENTRY cgSetMatrixParameterdr(CGparameter param, const double *matrix); +CG_API void CGENTRY cgSetMatrixParameterfr(CGparameter param, const float *matrix); +CG_API void CGENTRY cgSetMatrixParameteric(CGparameter param, const int *matrix); +CG_API void CGENTRY cgSetMatrixParameterdc(CGparameter param, const double *matrix); +CG_API void CGENTRY cgSetMatrixParameterfc(CGparameter param, const float *matrix); + +CG_API void CGENTRY cgGetMatrixParameterir(CGparameter param, int *matrix); +CG_API void CGENTRY cgGetMatrixParameterdr(CGparameter param, double *matrix); +CG_API void CGENTRY cgGetMatrixParameterfr(CGparameter param, float *matrix); +CG_API void CGENTRY cgGetMatrixParameteric(CGparameter param, int *matrix); +CG_API void CGENTRY cgGetMatrixParameterdc(CGparameter param, double *matrix); +CG_API void CGENTRY cgGetMatrixParameterfc(CGparameter param, float *matrix); + +CG_API CGparameter CGENTRY cgGetNamedSubParameter(CGparameter param, const char *name); + +/*** Type Functions ***/ + +CG_API const char * CGENTRY cgGetTypeString(CGtype type); +CG_API CGtype CGENTRY cgGetType(const char *type_string); + +CG_API CGtype CGENTRY cgGetNamedUserType(CGhandle handle, const char *name); + +CG_API int CGENTRY cgGetNumUserTypes(CGhandle handle); +CG_API CGtype CGENTRY cgGetUserType(CGhandle handle, int index); + +CG_API int CGENTRY cgGetNumParentTypes(CGtype type); +CG_API CGtype CGENTRY cgGetParentType(CGtype type, int index); + +CG_API CGbool CGENTRY cgIsParentType(CGtype parent, CGtype child); +CG_API CGbool CGENTRY cgIsInterfaceType(CGtype type); + +/*** Resource Functions ***/ + +CG_API const char * CGENTRY cgGetResourceString(CGresource resource); +CG_API CGresource CGENTRY cgGetResource(const char *resource_string); + +/*** Enum Functions ***/ + +CG_API const char * CGENTRY cgGetEnumString(CGenum en); +CG_API CGenum CGENTRY cgGetEnum(const char *enum_string); + +/*** Profile Functions ***/ + +CG_API const char * CGENTRY cgGetProfileString(CGprofile profile); +CG_API CGprofile CGENTRY cgGetProfile(const char *profile_string); + +/*** Error Functions ***/ + +CG_API CGerror CGENTRY cgGetError(void); +CG_API CGerror CGENTRY cgGetFirstError(void); +CG_API const char * CGENTRY cgGetErrorString(CGerror error); +CG_API const char * CGENTRY cgGetLastErrorString(CGerror *error); +CG_API void CGENTRY cgSetErrorCallback(CGerrorCallbackFunc func); +CG_API CGerrorCallbackFunc CGENTRY cgGetErrorCallback(void); +CG_API void CGENTRY cgSetErrorHandler(CGerrorHandlerFunc func, void *data); +CG_API CGerrorHandlerFunc CGENTRY cgGetErrorHandler(void **data); + +/*** Misc Functions ***/ + +CG_API const char * CGENTRY cgGetString(CGenum sname); + + +/*** CgFX Functions ***/ + +CG_API CGeffect CGENTRY cgCreateEffect(CGcontext, const char *code, const char **args); +CG_API CGeffect CGENTRY cgCreateEffectFromFile(CGcontext, const char *filename, + const char **args); +CG_API CGeffect CGENTRY cgCopyEffect(CGeffect effect); +CG_API void CGENTRY cgDestroyEffect(CGeffect); +CG_API CGcontext CGENTRY cgGetEffectContext(CGeffect); +CG_API CGbool CGENTRY cgIsEffect(CGeffect effect); + +CG_API CGeffect CGENTRY cgGetFirstEffect(CGcontext); +CG_API CGeffect CGENTRY cgGetNextEffect(CGeffect); + +CG_API CGprogram CGENTRY cgCreateProgramFromEffect(CGeffect effect, + CGprofile profile, + const char *entry, + const char **args); + +CG_API CGtechnique CGENTRY cgGetFirstTechnique(CGeffect); +CG_API CGtechnique CGENTRY cgGetNextTechnique(CGtechnique); +CG_API CGtechnique CGENTRY cgGetNamedTechnique(CGeffect, const char *name); +CG_API const char * CGENTRY cgGetTechniqueName(CGtechnique); +CG_API CGbool CGENTRY cgIsTechnique(CGtechnique); +CG_API CGbool CGENTRY cgValidateTechnique(CGtechnique); +CG_API CGbool CGENTRY cgIsTechniqueValidated(CGtechnique); +CG_API CGeffect CGENTRY cgGetTechniqueEffect(CGtechnique); + +CG_API CGpass CGENTRY cgGetFirstPass(CGtechnique); +CG_API CGpass CGENTRY cgGetNamedPass(CGtechnique, const char *name); +CG_API CGpass CGENTRY cgGetNextPass(CGpass); +CG_API CGbool CGENTRY cgIsPass(CGpass); +CG_API const char * CGENTRY cgGetPassName(CGpass); +CG_API CGtechnique CGENTRY cgGetPassTechnique(CGpass); + +CG_API void CGENTRY cgSetPassState(CGpass); +CG_API void CGENTRY cgResetPassState(CGpass); + +CG_API CGstateassignment CGENTRY cgGetFirstStateAssignment(CGpass); +CG_API CGstateassignment CGENTRY cgGetNamedStateAssignment(CGpass, const char *name); +CG_API CGstateassignment CGENTRY cgGetNextStateAssignment(CGstateassignment); +CG_API CGbool CGENTRY cgIsStateAssignment(CGstateassignment); +CG_API CGbool CGENTRY cgCallStateSetCallback(CGstateassignment); +CG_API CGbool CGENTRY cgCallStateValidateCallback(CGstateassignment); +CG_API CGbool CGENTRY cgCallStateResetCallback(CGstateassignment); +CG_API CGpass CGENTRY cgGetStateAssignmentPass(CGstateassignment); +CG_API CGparameter CGENTRY cgGetSamplerStateAssignmentParameter(CGstateassignment); + +CG_API const float * CGENTRY cgGetFloatStateAssignmentValues(CGstateassignment, int *nVals); +CG_API const int * CGENTRY cgGetIntStateAssignmentValues(CGstateassignment, int *nVals); +CG_API const CGbool * CGENTRY cgGetBoolStateAssignmentValues(CGstateassignment, int *nVals); +CG_API const char * CGENTRY cgGetStringStateAssignmentValue(CGstateassignment); +CG_API CGprogram CGENTRY cgGetProgramStateAssignmentValue(CGstateassignment); +CG_API CGparameter CGENTRY cgGetTextureStateAssignmentValue(CGstateassignment); +CG_API CGparameter CGENTRY cgGetSamplerStateAssignmentValue(CGstateassignment); +CG_API int CGENTRY cgGetStateAssignmentIndex(CGstateassignment); + +CG_API int CGENTRY cgGetNumDependentStateAssignmentParameters(CGstateassignment); +CG_API CGparameter CGENTRY cgGetDependentStateAssignmentParameter(CGstateassignment, int index); + +CG_API CGparameter CGENTRY cgGetConnectedStateAssignmentParameter(CGstateassignment); + +CG_API CGstate CGENTRY cgGetStateAssignmentState(CGstateassignment); +CG_API CGstate CGENTRY cgGetSamplerStateAssignmentState(CGstateassignment); + +CG_API CGstate CGENTRY cgCreateState(CGcontext, const char *name, CGtype); +CG_API CGstate CGENTRY cgCreateArrayState(CGcontext, const char *name, CGtype, int nelems); +CG_API void CGENTRY cgSetStateCallbacks(CGstate, CGstatecallback set, CGstatecallback reset, + CGstatecallback validate); +CG_API CGstatecallback CGENTRY cgGetStateSetCallback(CGstate); +CG_API CGstatecallback CGENTRY cgGetStateResetCallback(CGstate); +CG_API CGstatecallback CGENTRY cgGetStateValidateCallback(CGstate); +CG_API CGcontext CGENTRY cgGetStateContext(CGstate); +CG_API CGtype CGENTRY cgGetStateType(CGstate); +CG_API const char * CGENTRY cgGetStateName(CGstate); +CG_API CGstate CGENTRY cgGetNamedState(CGcontext, const char *name); +CG_API CGstate CGENTRY cgGetFirstState(CGcontext); +CG_API CGstate CGENTRY cgGetNextState(CGstate); +CG_API CGbool CGENTRY cgIsState(CGstate); +CG_API void CGENTRY cgAddStateEnumerant(CGstate, const char *name, int value); + +CG_API CGstate CGENTRY cgCreateSamplerState(CGcontext, const char *name, CGtype); +CG_API CGstate CGENTRY cgCreateArraySamplerState(CGcontext, const char *name, CGtype, int nelems); +CG_API CGstate CGENTRY cgGetNamedSamplerState(CGcontext, const char *name); +CG_API CGstate CGENTRY cgGetFirstSamplerState(CGcontext); + +CG_API CGstateassignment CGENTRY cgGetFirstSamplerStateAssignment(CGparameter); +CG_API CGstateassignment CGENTRY cgGetNamedSamplerStateAssignment(CGparameter, const char *); +CG_API void CGENTRY cgSetSamplerState(CGparameter); + +CG_API CGparameter CGENTRY cgGetNamedEffectParameter(CGeffect, const char *); +CG_API CGparameter CGENTRY cgGetFirstLeafEffectParameter(CGeffect); +CG_API CGparameter CGENTRY cgGetFirstEffectParameter(CGeffect); +CG_API CGparameter CGENTRY cgGetEffectParameterBySemantic(CGeffect, const char *); + +CG_API CGannotation CGENTRY cgGetFirstTechniqueAnnotation(CGtechnique); +CG_API CGannotation CGENTRY cgGetFirstPassAnnotation(CGpass); +CG_API CGannotation CGENTRY cgGetFirstParameterAnnotation(CGparameter); +CG_API CGannotation CGENTRY cgGetFirstProgramAnnotation(CGprogram); +CG_API CGannotation CGENTRY cgGetFirstEffectAnnotation(CGeffect); +CG_API CGannotation CGENTRY cgGetNextAnnotation(CGannotation); + +CG_API CGannotation CGENTRY cgGetNamedTechniqueAnnotation(CGtechnique, const char *); +CG_API CGannotation CGENTRY cgGetNamedPassAnnotation(CGpass, const char *); +CG_API CGannotation CGENTRY cgGetNamedParameterAnnotation(CGparameter, const char *); +CG_API CGannotation CGENTRY cgGetNamedProgramAnnotation(CGprogram, const char *); +CG_API CGannotation CGENTRY cgGetNamedEffectAnnotation(CGeffect, const char *); + +CG_API CGbool CGENTRY cgIsAnnotation(CGannotation); + +CG_API const char * CGENTRY cgGetAnnotationName(CGannotation); +CG_API CGtype CGENTRY cgGetAnnotationType(CGannotation); + +CG_API const float * CGENTRY cgGetFloatAnnotationValues(CGannotation, int *nvalues); +CG_API const int * CGENTRY cgGetIntAnnotationValues(CGannotation, int *nvalues); +CG_API const char * CGENTRY cgGetStringAnnotationValue(CGannotation); +CG_API const char * const * CGENTRY cgGetStringAnnotationValues(CGannotation, int *nvalues); +CG_API const CGbool * CGENTRY cgGetBoolAnnotationValues(CGannotation, int *nvalues); +CG_API const int * CGENTRY cgGetBooleanAnnotationValues(CGannotation, int *nvalues); + +CG_API int CGENTRY cgGetNumDependentAnnotationParameters(CGannotation); +CG_API CGparameter CGENTRY cgGetDependentAnnotationParameter(CGannotation, int index); + +CG_API void CGENTRY cgEvaluateProgram(CGprogram, float *, int ncomps, int nx, int ny, int nz); + +/*** Cg 1.5 Additions ***/ + +CG_API CGbool CGENTRY cgSetEffectName(CGeffect, const char *name); +CG_API const char * CGENTRY cgGetEffectName(CGeffect); +CG_API CGeffect CGENTRY cgGetNamedEffect(CGcontext, const char *name); +CG_API CGparameter CGENTRY cgCreateEffectParameter(CGeffect, const char *name, CGtype); + +CG_API CGtechnique CGENTRY cgCreateTechnique(CGeffect, const char *name); + +CG_API CGparameter CGENTRY cgCreateEffectParameterArray(CGeffect, const char *name, CGtype type, int length); +CG_API CGparameter CGENTRY cgCreateEffectParameterMultiDimArray(CGeffect, const char *name, CGtype type, int dim, const int *lengths); + +CG_API CGpass CGENTRY cgCreatePass(CGtechnique, const char *name); + +CG_API CGstateassignment CGENTRY cgCreateStateAssignment(CGpass, CGstate); +CG_API CGstateassignment CGENTRY cgCreateStateAssignmentIndex(CGpass, CGstate, int index); +CG_API CGstateassignment CGENTRY cgCreateSamplerStateAssignment(CGparameter, CGstate); + +CG_API CGbool CGENTRY cgSetFloatStateAssignment(CGstateassignment, float); +CG_API CGbool CGENTRY cgSetIntStateAssignment(CGstateassignment, int); +CG_API CGbool CGENTRY cgSetBoolStateAssignment(CGstateassignment, CGbool); +CG_API CGbool CGENTRY cgSetStringStateAssignment(CGstateassignment, const char *); +CG_API CGbool CGENTRY cgSetProgramStateAssignment(CGstateassignment, CGprogram); +CG_API CGbool CGENTRY cgSetSamplerStateAssignment(CGstateassignment, CGparameter); +CG_API CGbool CGENTRY cgSetTextureStateAssignment(CGstateassignment, CGparameter); + +CG_API CGbool CGENTRY cgSetFloatArrayStateAssignment(CGstateassignment, const float *vals); +CG_API CGbool CGENTRY cgSetIntArrayStateAssignment(CGstateassignment, const int *vals); +CG_API CGbool CGENTRY cgSetBoolArrayStateAssignment(CGstateassignment, const CGbool *vals); + +CG_API CGannotation CGENTRY cgCreateTechniqueAnnotation(CGtechnique, const char *name, CGtype); +CG_API CGannotation CGENTRY cgCreatePassAnnotation(CGpass, const char *name, CGtype); +CG_API CGannotation CGENTRY cgCreateParameterAnnotation(CGparameter, const char *name, CGtype); +CG_API CGannotation CGENTRY cgCreateProgramAnnotation(CGprogram, const char *name, CGtype); +CG_API CGannotation CGENTRY cgCreateEffectAnnotation(CGeffect, const char *name, CGtype); + +CG_API CGbool CGENTRY cgSetIntAnnotation(CGannotation, int value); +CG_API CGbool CGENTRY cgSetFloatAnnotation(CGannotation, float value); +CG_API CGbool CGENTRY cgSetBoolAnnotation(CGannotation, CGbool value); +CG_API CGbool CGENTRY cgSetStringAnnotation(CGannotation, const char *value); + +CG_API const char * CGENTRY cgGetStateEnumerantName(CGstate, int value); +CG_API int CGENTRY cgGetStateEnumerantValue(CGstate, const char *name); + +CG_API CGeffect CGENTRY cgGetParameterEffect(CGparameter param); + +CG_API CGparameterclass CGENTRY cgGetTypeClass(CGtype type); +CG_API CGtype CGENTRY cgGetTypeBase(CGtype type); +CG_API CGbool CGENTRY cgGetTypeSizes(CGtype type, int *nrows, int *ncols); +CG_API void CGENTRY cgGetMatrixSize(CGtype type, int *nrows, int *ncols); + +CG_API int CGENTRY cgGetNumProgramDomains( CGprogram program ); +CG_API CGdomain CGENTRY cgGetProfileDomain( CGprofile profile ); +CG_API CGprogram CGENTRY cgCombinePrograms( int n, const CGprogram *exeList ); +CG_API CGprogram CGENTRY cgCombinePrograms2( const CGprogram exe1, const CGprogram exe2 ); +CG_API CGprogram CGENTRY cgCombinePrograms3( const CGprogram exe1, const CGprogram exe2, const CGprogram exe3 ); +CG_API CGprofile CGENTRY cgGetProgramDomainProfile(CGprogram program, int index); + +/*** CGobj Functions ***/ +CG_API CGobj CGENTRY cgCreateObj( CGcontext context, CGenum program_type, const char *source, CGprofile profile, const char **args ); +CG_API CGobj CGENTRY cgCreateObjFromFile( CGcontext context, CGenum program_type, const char *source_file, CGprofile profile, const char **args ); +CG_API void CGENTRY cgDestroyObj( CGobj obj ); + +CG_API long CGENTRY cgGetParameterResourceSize(CGparameter); +CG_API CGtype CGENTRY cgGetParameterResourceType(CGparameter); +CG_API int CGENTRY cgGetParameterBufferIndex(CGparameter); +CG_API int CGENTRY cgGetParameterBufferOffset(CGparameter); + +CG_API CGbuffer CGENTRY cgCreateBuffer(CGcontext, int size, const void *data, CGbufferusage bufferUsage); +CG_API void CGENTRY cgSetBufferData(CGbuffer, int size, const void *data); +CG_API void CGENTRY cgSetBufferSubData(CGbuffer, int offset, int size, const void *data); +CG_API void CGENTRY cgSetProgramBuffer(CGprogram program, int bufferIndex, CGbuffer buffer); + +CG_API void * CGENTRY cgMapBuffer(CGbuffer buffer, CGbufferaccess access); +CG_API void CGENTRY cgUnmapBuffer(CGbuffer buffer); +CG_API void CGENTRY cgDestroyBuffer(CGbuffer buffer); +CG_API CGbuffer CGENTRY cgGetProgramBuffer(CGprogram, int bufferIndex); +CG_API int CGENTRY cgGetBufferSize(CGbuffer); +CG_API int CGENTRY cgGetProgramBufferMaxSize(CGprofile profile); +CG_API int CGENTRY cgGetProgramBufferMaxIndex(CGprofile profile); + +#endif + +#ifdef __cplusplus +} +#endif + +#ifdef CG_APIENTRY_DEFINED +# undef CG_APIENTRY_DEFINED +# undef APIENTRY +#endif + +#ifdef CG_WINGDIAPI_DEFINED +# undef CG_WINGDIAPI_DEFINED +# undef WINGDIAPI +#endif + +#endif diff --git a/Externals/Cg/cg.lib b/Externals/Cg/cg.lib new file mode 100644 index 0000000000..9639c4535a Binary files /dev/null and b/Externals/Cg/cg.lib differ diff --git a/Externals/Cg/cgGL.h b/Externals/Cg/cgGL.h new file mode 100644 index 0000000000..4f30195f84 --- /dev/null +++ b/Externals/Cg/cgGL.h @@ -0,0 +1,423 @@ +/* + * + * Copyright (c) 2002-2007, NVIDIA Corporation. + * + * + * + * NVIDIA Corporation("NVIDIA") supplies this software to you in consideration + * of your agreement to the following terms, and your use, installation, + * modification or redistribution of this NVIDIA software constitutes + * acceptance of these terms. If you do not agree with these terms, please do + * not use, install, modify or redistribute this NVIDIA software. + * + * + * + * In consideration of your agreement to abide by the following terms, and + * subject to these terms, NVIDIA grants you a personal, non-exclusive license, + * under NVIDIA's copyrights in this original NVIDIA software (the "NVIDIA + * Software"), to use, reproduce, modify and redistribute the NVIDIA + * Software, with or without modifications, in source and/or binary forms; + * provided that if you redistribute the NVIDIA Software, you must retain the + * copyright notice of NVIDIA, this notice and the following text and + * disclaimers in all such redistributions of the NVIDIA Software. Neither the + * name, trademarks, service marks nor logos of NVIDIA Corporation may be used + * to endorse or promote products derived from the NVIDIA Software without + * specific prior written permission from NVIDIA. Except as expressly stated + * in this notice, no other rights or licenses express or implied, are granted + * by NVIDIA herein, including but not limited to any patent rights that may be + * infringed by your derivative works or by other works in which the NVIDIA + * Software may be incorporated. No hardware is licensed hereunder. + * + * + * + * THE NVIDIA SOFTWARE IS BEING PROVIDED ON AN "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING + * WITHOUT LIMITATION, WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR ITS USE AND OPERATION + * EITHER ALONE OR IN COMBINATION WITH OTHER PRODUCTS. + * + * + * + * IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL, + * EXEMPLARY, CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, LOST + * PROFITS; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) OR ARISING IN ANY WAY OUT OF THE USE, + * REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE NVIDIA SOFTWARE, + * HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING + * NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF NVIDIA HAS BEEN ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef _cggl_h +#define _cggl_h + +#include + +#ifdef _WIN32 +# ifndef APIENTRY /* From Win32's */ +# define CGGL_APIENTRY_DEFINED +# if (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED) || defined(__BORLANDC__) || defined(__LCC__) +# define APIENTRY __stdcall +# else +# define APIENTRY +# endif +# endif +# ifndef WINGDIAPI /* From Win32's and */ +# define CGGL_WINGDIAPI_DEFINED +# define WINGDIAPI __declspec(dllimport) +# endif +#endif /* _WIN32 */ + +/* Set up for either Win32 import/export/lib. */ +#ifndef CGGL_API +# ifdef _WIN32 +# ifdef CGGL_EXPORTS +# define CGGL_API __declspec(dllexport) +# elif defined (CG_LIB) +# define CGGL_API +# else +# define CGGL_API __declspec(dllimport) +# endif +# else +# define CGGL_API +# endif +#endif + +#ifndef CGGLENTRY +# ifdef _WIN32 +# define CGGLENTRY __cdecl +# else +# define CGGLENTRY +# endif +#endif + +#ifdef __APPLE__ +#include +#else +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/*****************************************************************************/ +/*** cgGL Type Definitions ***/ +/*****************************************************************************/ + +typedef enum + { + CG_GL_MATRIX_IDENTITY = 0, + CG_GL_MATRIX_TRANSPOSE = 1, + CG_GL_MATRIX_INVERSE = 2, + CG_GL_MATRIX_INVERSE_TRANSPOSE = 3, + + CG_GL_MODELVIEW_MATRIX, + CG_GL_PROJECTION_MATRIX, + CG_GL_TEXTURE_MATRIX, + CG_GL_MODELVIEW_PROJECTION_MATRIX, + + CG_GL_VERTEX, + CG_GL_FRAGMENT, + CG_GL_GEOMETRY + + } CGGLenum; + + +#ifndef CGGL_EXPLICIT + +/****************************************************************************** + *** Profile Functions + *****************************************************************************/ + +CGGL_API CGbool CGGLENTRY cgGLIsProfileSupported(CGprofile profile); + +CGGL_API void CGGLENTRY cgGLEnableProfile(CGprofile profile); +CGGL_API void CGGLENTRY cgGLDisableProfile(CGprofile profile); + +CGGL_API CGprofile CGGLENTRY cgGLGetLatestProfile(CGGLenum profile_type); +CGGL_API void CGGLENTRY cgGLSetOptimalOptions(CGprofile profile); + +/****************************************************************************** + *** Program Managment Functions + *****************************************************************************/ + +CGGL_API void CGGLENTRY cgGLLoadProgram(CGprogram program); +CGGL_API CGbool CGGLENTRY cgGLIsProgramLoaded(CGprogram program); +CGGL_API void CGGLENTRY cgGLBindProgram(CGprogram program); +CGGL_API void CGGLENTRY cgGLUnbindProgram(CGprofile profile); +CGGL_API GLuint CGGLENTRY cgGLGetProgramID(CGprogram program); + +/****************************************************************************** + *** Parameter Managment Functions + *****************************************************************************/ + +CGGL_API void CGGLENTRY cgGLSetParameter1f(CGparameter param, + float x); + +CGGL_API void CGGLENTRY cgGLSetParameter2f(CGparameter param, + float x, + float y); + +CGGL_API void CGGLENTRY cgGLSetParameter3f(CGparameter param, + float x, + float y, + float z); + +CGGL_API void CGGLENTRY cgGLSetParameter4f(CGparameter param, + float x, + float y, + float z, + float w); + +CGGL_API void CGGLENTRY cgGLSetParameter1fv(CGparameter param, const float *v); + +CGGL_API void CGGLENTRY cgGLSetParameter2fv(CGparameter param, const float *v); + +CGGL_API void CGGLENTRY cgGLSetParameter3fv(CGparameter param, const float *v); + +CGGL_API void CGGLENTRY cgGLSetParameter4fv(CGparameter param, const float *v); + +CGGL_API void CGGLENTRY cgGLSetParameter1d(CGparameter param, + double x); + +CGGL_API void CGGLENTRY cgGLSetParameter2d(CGparameter param, + double x, + double y); + +CGGL_API void CGGLENTRY cgGLSetParameter3d(CGparameter param, + double x, + double y, + double z); + +CGGL_API void CGGLENTRY cgGLSetParameter4d(CGparameter param, + double x, + double y, + double z, + double w); + +CGGL_API void CGGLENTRY cgGLSetParameter1dv(CGparameter param, const double *v); + +CGGL_API void CGGLENTRY cgGLSetParameter2dv(CGparameter param, const double *v); + +CGGL_API void CGGLENTRY cgGLSetParameter3dv(CGparameter param, const double *v); + +CGGL_API void CGGLENTRY cgGLSetParameter4dv(CGparameter param, const double *v); + +CGGL_API void CGGLENTRY cgGLGetParameter1f(CGparameter param, float *v); + +CGGL_API void CGGLENTRY cgGLGetParameter2f(CGparameter param, float *v); + +CGGL_API void CGGLENTRY cgGLGetParameter3f(CGparameter param, float *v); + +CGGL_API void CGGLENTRY cgGLGetParameter4f(CGparameter param, float *v); + +CGGL_API void CGGLENTRY cgGLGetParameter1d(CGparameter param, double *v); + +CGGL_API void CGGLENTRY cgGLGetParameter2d(CGparameter param, double *v); + +CGGL_API void CGGLENTRY cgGLGetParameter3d(CGparameter param, double *v); + +CGGL_API void CGGLENTRY cgGLGetParameter4d(CGparameter param, double *v); + +CGGL_API void CGGLENTRY cgGLSetParameterArray1f(CGparameter param, + long offset, + long nelements, + const float *v); + +CGGL_API void CGGLENTRY cgGLSetParameterArray2f(CGparameter param, + long offset, + long nelements, + const float *v); + +CGGL_API void CGGLENTRY cgGLSetParameterArray3f(CGparameter param, + long offset, + long nelements, + const float *v); + +CGGL_API void CGGLENTRY cgGLSetParameterArray4f(CGparameter param, + long offset, + long nelements, + const float *v); + +CGGL_API void CGGLENTRY cgGLSetParameterArray1d(CGparameter param, + long offset, + long nelements, + const double *v); + +CGGL_API void CGGLENTRY cgGLSetParameterArray2d(CGparameter param, + long offset, + long nelements, + const double *v); + +CGGL_API void CGGLENTRY cgGLSetParameterArray3d(CGparameter param, + long offset, + long nelements, + const double *v); + +CGGL_API void CGGLENTRY cgGLSetParameterArray4d(CGparameter param, + long offset, + long nelements, + const double *v); + +CGGL_API void CGGLENTRY cgGLGetParameterArray1f(CGparameter param, + long offset, + long nelements, + float *v); + +CGGL_API void CGGLENTRY cgGLGetParameterArray2f(CGparameter param, + long offset, + long nelements, + float *v); + +CGGL_API void CGGLENTRY cgGLGetParameterArray3f(CGparameter param, + long offset, + long nelements, + float *v); + +CGGL_API void CGGLENTRY cgGLGetParameterArray4f(CGparameter param, + long offset, + long nelements, + float *v); + +CGGL_API void CGGLENTRY cgGLGetParameterArray1d(CGparameter param, + long offset, + long nelements, + double *v); + +CGGL_API void CGGLENTRY cgGLGetParameterArray2d(CGparameter param, + long offset, + long nelements, + double *v); + +CGGL_API void CGGLENTRY cgGLGetParameterArray3d(CGparameter param, + long offset, + long nelements, + double *v); + +CGGL_API void CGGLENTRY cgGLGetParameterArray4d(CGparameter param, + long offset, + long nelements, + double *v); + +CGGL_API void CGGLENTRY cgGLSetParameterPointer(CGparameter param, + GLint fsize, + GLenum type, + GLsizei stride, + const GLvoid *pointer); + +CGGL_API void CGGLENTRY cgGLEnableClientState(CGparameter param); +CGGL_API void CGGLENTRY cgGLDisableClientState(CGparameter param); + +/****************************************************************************** + *** Matrix Parameter Managment Functions + *****************************************************************************/ + +CGGL_API void CGGLENTRY cgGLSetMatrixParameterdr(CGparameter param, + const double *matrix); +CGGL_API void CGGLENTRY cgGLSetMatrixParameterfr(CGparameter param, + const float *matrix); +CGGL_API void CGGLENTRY cgGLSetMatrixParameterdc(CGparameter param, + const double *matrix); +CGGL_API void CGGLENTRY cgGLSetMatrixParameterfc(CGparameter param, + const float *matrix); + +CGGL_API void CGGLENTRY cgGLGetMatrixParameterdr(CGparameter param, double *matrix); +CGGL_API void CGGLENTRY cgGLGetMatrixParameterfr(CGparameter param, float *matrix); +CGGL_API void CGGLENTRY cgGLGetMatrixParameterdc(CGparameter param, double *matrix); +CGGL_API void CGGLENTRY cgGLGetMatrixParameterfc(CGparameter param, float *matrix); + +CGGL_API void CGGLENTRY cgGLSetStateMatrixParameter(CGparameter param, + CGGLenum matrix, + CGGLenum transform); + +CGGL_API void CGGLENTRY cgGLSetMatrixParameterArrayfc(CGparameter param, + long offset, + long nelements, + const float *matrices); + +CGGL_API void CGGLENTRY cgGLSetMatrixParameterArrayfr(CGparameter param, + long offset, + long nelements, + const float *matrices); + +CGGL_API void CGGLENTRY cgGLSetMatrixParameterArraydc(CGparameter param, + long offset, + long nelements, + const double *matrices); + +CGGL_API void CGGLENTRY cgGLSetMatrixParameterArraydr(CGparameter param, + long offset, + long nelements, + const double *matrices); + +CGGL_API void CGGLENTRY cgGLGetMatrixParameterArrayfc(CGparameter param, + long offset, + long nelements, + float *matrices); + +CGGL_API void CGGLENTRY cgGLGetMatrixParameterArrayfr(CGparameter param, + long offset, + long nelements, + float *matrices); + +CGGL_API void CGGLENTRY cgGLGetMatrixParameterArraydc(CGparameter param, + long offset, + long nelements, + double *matrices); + +CGGL_API void CGGLENTRY cgGLGetMatrixParameterArraydr(CGparameter param, + long offset, + long nelements, + double *matrices); + +/****************************************************************************** + *** Texture Parameter Managment Functions + *****************************************************************************/ + +CGGL_API void CGGLENTRY cgGLSetTextureParameter(CGparameter param, GLuint texobj); +CGGL_API GLuint CGGLENTRY cgGLGetTextureParameter(CGparameter param); +CGGL_API void CGGLENTRY cgGLEnableTextureParameter(CGparameter param); +CGGL_API void CGGLENTRY cgGLDisableTextureParameter(CGparameter param); +CGGL_API GLenum CGGLENTRY cgGLGetTextureEnum(CGparameter param); + +CGGL_API void CGGLENTRY cgGLSetManageTextureParameters(CGcontext ctx, CGbool flag); +CGGL_API CGbool CGGLENTRY cgGLGetManageTextureParameters(CGcontext ctx); + +CGGL_API void CGGLENTRY cgGLSetupSampler(CGparameter param, GLuint texobj); +CGGL_API void CGGLENTRY cgGLRegisterStates(CGcontext); + +CGGL_API void CGGLENTRY cgGLEnableProgramProfiles( CGprogram program ); +CGGL_API void CGGLENTRY cgGLDisableProgramProfiles( CGprogram program ); + +/****************************************************************************** + *** Misc Functions + *****************************************************************************/ + +CGGL_API void CGGLENTRY cgGLSetDebugMode( CGbool debug ); + +/****************************************************************************** + *** Buffer Functions + *****************************************************************************/ + +CGGL_API CGbuffer CGGLENTRY cgGLCreateBuffer(CGcontext context, int size, const void *data, GLenum bufferUsage); +CGGL_API GLuint CGGLENTRY cgGLGetBufferObject(CGbuffer buffer); + +#endif + +#ifdef __cplusplus +} +#endif + +#ifdef CGGL_APIENTRY_DEFINED +# undef CGGL_APIENTRY_DEFINED +# undef APIENTRY +#endif + +#ifdef CGGL_WINGDIAPI_DEFINED +# undef CGGL_WINGDIAPI_DEFINED +# undef WINGDIAPI +#endif + +#endif diff --git a/Externals/Cg/cgGL.lib b/Externals/Cg/cgGL.lib new file mode 100644 index 0000000000..013c427c6d Binary files /dev/null and b/Externals/Cg/cgGL.lib differ diff --git a/Externals/Cg/cgGL_profiles.h b/Externals/Cg/cgGL_profiles.h new file mode 100644 index 0000000000..44948edfb1 --- /dev/null +++ b/Externals/Cg/cgGL_profiles.h @@ -0,0 +1,70 @@ +/* + * + * Copyright (c) 2002-2007, NVIDIA Corporation. + * + * + * + * NVIDIA Corporation("NVIDIA") supplies this software to you in consideration + * of your agreement to the following terms, and your use, installation, + * modification or redistribution of this NVIDIA software constitutes + * acceptance of these terms. If you do not agree with these terms, please do + * not use, install, modify or redistribute this NVIDIA software. + * + * + * + * In consideration of your agreement to abide by the following terms, and + * subject to these terms, NVIDIA grants you a personal, non-exclusive license, + * under NVIDIA's copyrights in this original NVIDIA software (the "NVIDIA + * Software"), to use, reproduce, modify and redistribute the NVIDIA + * Software, with or without modifications, in source and/or binary forms; + * provided that if you redistribute the NVIDIA Software, you must retain the + * copyright notice of NVIDIA, this notice and the following text and + * disclaimers in all such redistributions of the NVIDIA Software. Neither the + * name, trademarks, service marks nor logos of NVIDIA Corporation may be used + * to endorse or promote products derived from the NVIDIA Software without + * specific prior written permission from NVIDIA. Except as expressly stated + * in this notice, no other rights or licenses express or implied, are granted + * by NVIDIA herein, including but not limited to any patent rights that may be + * infringed by your derivative works or by other works in which the NVIDIA + * Software may be incorporated. No hardware is licensed hereunder. + * + * + * + * THE NVIDIA SOFTWARE IS BEING PROVIDED ON AN "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING + * WITHOUT LIMITATION, WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR ITS USE AND OPERATION + * EITHER ALONE OR IN COMBINATION WITH OTHER PRODUCTS. + * + * + * + * IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL, + * EXEMPLARY, CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, LOST + * PROFITS; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) OR ARISING IN ANY WAY OUT OF THE USE, + * REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE NVIDIA SOFTWARE, + * HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING + * NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF NVIDIA HAS BEEN ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + + +CG_PROFILE_MACRO(Vertex,vp20,VP20,"vp20",6146,1) +CG_PROFILE_MACRO(Fragment20,fp20,FP20,"fp20",6147,0) +CG_PROFILE_MACRO(Vertex30,vp30,VP30,"vp30",6148,1) +CG_PROFILE_MACRO(Fragment,fp30,FP30,"fp30",6149,0) +CG_PROFILE_MACRO(ARBVertex,arbvp1,ARBVP1,"arbvp1",6150,1) +CG_PROFILE_MACRO(Fragment40,fp40,FP40,"fp40",6151,0) +CG_PROFILE_MACRO(ARBFragment,arbfp1,ARBFP1,"arbfp1",7000,0) +CG_PROFILE_MACRO(Vertex40,vp40,VP40,"vp40",7001,1) +CG_PROFILE_MACRO(GLSLVertex,glslv,GLSLV,"glslv",7007,1) +CG_PROFILE_MACRO(GLSLFragment,glslf,GLSLF,"glslf",7008,0) +CG_PROFILE_MACRO(GLSLCombined, glslc, GLSLC, "glslc", 7009, 0) +CG_PROFILE_MACRO(GPUFragment,gpu_fp,GPU_FP,"gp4fp",7010,0) +CG_PROFILE_MACRO(GPUVertex,gpu_vp,GPU_VP,"gp4vp",7011,1) +CG_PROFILE_MACRO(GPUGeometry,gpu_gp,GPU_GP,"gp4gp",7012,0) + +#ifndef CG_IN_PROFILES_INCLUDE +# undef CG_PROFILE_MACRO +#endif diff --git a/Externals/Cg/cg_bindlocations.h b/Externals/Cg/cg_bindlocations.h new file mode 100644 index 0000000000..adcff5548b --- /dev/null +++ b/Externals/Cg/cg_bindlocations.h @@ -0,0 +1,382 @@ + + +/* + * + * Copyright (c) 2002-2007, NVIDIA Corporation. + * + * + * + * NVIDIA Corporation("NVIDIA") supplies this software to you in consideration + * of your agreement to the following terms, and your use, installation, + * modification or redistribution of this NVIDIA software constitutes + * acceptance of these terms. If you do not agree with these terms, please do + * not use, install, modify or redistribute this NVIDIA software. + * + * + * + * In consideration of your agreement to abide by the following terms, and + * subject to these terms, NVIDIA grants you a personal, non-exclusive license, + * under NVIDIA's copyrights in this original NVIDIA software (the "NVIDIA + * Software"), to use, reproduce, modify and redistribute the NVIDIA + * Software, with or without modifications, in source and/or binary forms; + * provided that if you redistribute the NVIDIA Software, you must retain the + * copyright notice of NVIDIA, this notice and the following text and + * disclaimers in all such redistributions of the NVIDIA Software. Neither the + * name, trademarks, service marks nor logos of NVIDIA Corporation may be used + * to endorse or promote products derived from the NVIDIA Software without + * specific prior written permission from NVIDIA. Except as expressly stated + * in this notice, no other rights or licenses express or implied, are granted + * by NVIDIA herein, including but not limited to any patent rights that may be + * infringed by your derivative works or by other works in which the NVIDIA + * Software may be incorporated. No hardware is licensed hereunder. + * + * + * + * THE NVIDIA SOFTWARE IS BEING PROVIDED ON AN "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING + * WITHOUT LIMITATION, WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR ITS USE AND OPERATION + * EITHER ALONE OR IN COMBINATION WITH OTHER PRODUCTS. + * + * + * + * IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL, + * EXEMPLARY, CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, LOST + * PROFITS; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) OR ARISING IN ANY WAY OUT OF THE USE, + * REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE NVIDIA SOFTWARE, + * HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING + * NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF NVIDIA HAS BEEN ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + + +/* + * The following macro invocations define the supported CG basic hardware + * bind locations. + * + * The macros have the form : + * + * CG_BINDLOCATION_MACRO(name, compiler_name, enum_int) + * + * name : The name of the location. + * enum_name : The C enumerant. + * compiler_name : The name of the location within the compiler syntax. + * int_id : Integer enumerant associated with this bind location. + * (3256 is reservered for CG_UNDEFINED) + * addressable : The bind location must have an integer address + * associated with it. + * ParamType : the cgParamType of this register. + * + */ + + +CG_BINDLOCATION_MACRO(TexUnit0,CG_TEXUNIT0,"texunit 0",2048,0,CG_TEXOBJ_PARAM) +CG_BINDLOCATION_MACRO(TexUnit1,CG_TEXUNIT1,"texunit 1",2049,0,CG_TEXOBJ_PARAM) +CG_BINDLOCATION_MACRO(TexUnit2,CG_TEXUNIT2,"texunit 2",2050,0,CG_TEXOBJ_PARAM) +CG_BINDLOCATION_MACRO(TexUnit3,CG_TEXUNIT3,"texunit 3",2051,0,CG_TEXOBJ_PARAM) +CG_BINDLOCATION_MACRO(TexUnit4,CG_TEXUNIT4,"texunit 4",2052,0,CG_TEXOBJ_PARAM) +CG_BINDLOCATION_MACRO(TexUnit5,CG_TEXUNIT5,"texunit 5",2053,0,CG_TEXOBJ_PARAM) +CG_BINDLOCATION_MACRO(TexUnit6,CG_TEXUNIT6,"texunit 6",2054,0,CG_TEXOBJ_PARAM) +CG_BINDLOCATION_MACRO(TexUnit7,CG_TEXUNIT7,"texunit 7",2055,0,CG_TEXOBJ_PARAM) +CG_BINDLOCATION_MACRO(TexUnit8,CG_TEXUNIT8,"texunit 8",2056,0,CG_TEXOBJ_PARAM) +CG_BINDLOCATION_MACRO(TexUnit9,CG_TEXUNIT9,"texunit 9",2057,0,CG_TEXOBJ_PARAM) +CG_BINDLOCATION_MACRO(TexUnit10,CG_TEXUNIT10,"texunit 10",2058,0,CG_TEXOBJ_PARAM) +CG_BINDLOCATION_MACRO(TexUnit11,CG_TEXUNIT11,"texunit 11",2059,0,CG_TEXOBJ_PARAM) +CG_BINDLOCATION_MACRO(TexUnit12,CG_TEXUNIT12,"texunit 12",2060,0,CG_TEXOBJ_PARAM) +CG_BINDLOCATION_MACRO(TexUnit13,CG_TEXUNIT13,"texunit 13",2061,0,CG_TEXOBJ_PARAM) +CG_BINDLOCATION_MACRO(TexUnit14,CG_TEXUNIT14,"texunit 14",2062,0,CG_TEXOBJ_PARAM) +CG_BINDLOCATION_MACRO(TexUnit15,CG_TEXUNIT15,"texunit 15",2063,0,CG_TEXOBJ_PARAM) + +CG_BINDLOCATION_MACRO(Buffer0, CG_BUFFER0, "buffer[0]", 2064, 1, CGI_UNIFORM_PARAM) +CG_BINDLOCATION_MACRO(Buffer1, CG_BUFFER1, "buffer[1]", 2065, 1, CGI_UNIFORM_PARAM) +CG_BINDLOCATION_MACRO(Buffer2, CG_BUFFER2, "buffer[2]", 2066, 1, CGI_UNIFORM_PARAM) +CG_BINDLOCATION_MACRO(Buffer3, CG_BUFFER3, "buffer[3]", 2067, 1, CGI_UNIFORM_PARAM) +CG_BINDLOCATION_MACRO(Buffer4, CG_BUFFER4, "buffer[4]", 2068, 1, CGI_UNIFORM_PARAM) +CG_BINDLOCATION_MACRO(Buffer5, CG_BUFFER5, "buffer[5]", 2069, 1, CGI_UNIFORM_PARAM) +CG_BINDLOCATION_MACRO(Buffer6, CG_BUFFER6, "buffer[6]", 2070, 1, CGI_UNIFORM_PARAM) +CG_BINDLOCATION_MACRO(Buffer7, CG_BUFFER7, "buffer[7]", 2071, 1, CGI_UNIFORM_PARAM) +CG_BINDLOCATION_MACRO(Buffer8, CG_BUFFER8, "buffer[8]", 2072, 1, CGI_UNIFORM_PARAM) +CG_BINDLOCATION_MACRO(Buffer9, CG_BUFFER9, "buffer[9]", 2073, 1, CGI_UNIFORM_PARAM) +CG_BINDLOCATION_MACRO(Buffer10, CG_BUFFER10, "buffer[10]", 2074, 1, CGI_UNIFORM_PARAM) +CG_BINDLOCATION_MACRO(Buffer11, CG_BUFFER11, "buffer[11]", 2075, 1, CGI_UNIFORM_PARAM) + +CG_BINDLOCATION_MACRO(Attr0,CG_ATTR0,"ATTR0",2113,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Attr1,CG_ATTR1,"ATTR1",2114,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Attr2,CG_ATTR2,"ATTR2",2115,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Attr3,CG_ATTR3,"ATTR3",2116,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Attr4,CG_ATTR4,"ATTR4",2117,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Attr5,CG_ATTR5,"ATTR5",2118,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Attr6,CG_ATTR6,"ATTR6",2119,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Attr7,CG_ATTR7,"ATTR7",2120,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Attr8,CG_ATTR8,"ATTR8",2121,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Attr9,CG_ATTR9,"ATTR9",2122,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Attr10,CG_ATTR10,"ATTR10",2123,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Attr11,CG_ATTR11,"ATTR11",2124,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Attr12,CG_ATTR12,"ATTR12",2125,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Attr13,CG_ATTR13,"ATTR13",2126,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Attr14,CG_ATTR14,"ATTR14",2127,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Attr15,CG_ATTR15,"ATTR15",2128,0,CG_VARYING_PARAM) + +CG_BINDLOCATION_MACRO(VertUniform,CG_C,"c",2178,1,CGI_UNIFORM_PARAM) + +CG_BINDLOCATION_MACRO(Tex0,CG_TEX0,"TEX0",2179,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Tex1,CG_TEX1,"TEX1",2180,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Tex2,CG_TEX2,"TEX2",2181,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Tex3,CG_TEX3,"TEX3",2192,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Tex4,CG_TEX4,"TEX4",2193,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Tex5,CG_TEX5,"TEX5",2194,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Tex6,CG_TEX6,"TEX6",2195,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Tex7,CG_TEX7,"TEX7",2196,0,CG_VARYING_PARAM) + +CG_BINDLOCATION_MACRO(HPos,CG_HPOS,"HPOS",2243,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Col0,CG_COL0,"COL0",2245,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Col1,CG_COL1,"COL1",2246,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Col2,CG_COL2,"COL2",2247,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Col3,CG_COL3,"COL3",2248,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(PSiz,CG_PSIZ,"PSIZ",2309,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Clp0,CG_CLP0,"CLP0",2310,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Clp1,CG_CLP1,"CLP1",2311,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Clp2,CG_CLP2,"CLP2",2312,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Clp3,CG_CLP3,"CLP3",2313,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Clp4,CG_CLP4,"CLP4",2314,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Clp5,CG_CLP5,"CLP5",2315,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(WPos,CG_WPOS,"WPOS",2373,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(PointCoord,CG_POINTCOORD,"POINTCOORD",2374,0,CG_VARYING_PARAM) + +CG_BINDLOCATION_MACRO(Position0,CG_POSITION0,"POSITION0",2437,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Position1,CG_POSITION1,"POSITION1",2438,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Position2,CG_POSITION2,"POSITION2",2439,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Position3,CG_POSITION3,"POSITION3",2440,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Position4,CG_POSITION4,"POSITION4",2441,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Position5,CG_POSITION5,"POSITION5",2442,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Position6,CG_POSITION6,"POSITION6",2443,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Position7,CG_POSITION7,"POSITION7",2444,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Position8,CG_POSITION8,"POSITION8",2445,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Position9,CG_POSITION9,"POSITION9",2446,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Position10,CG_POSITION10,"POSITION10",2447,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Position11,CG_POSITION11,"POSITION11",2448,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Position12,CG_POSITION12,"POSITION12",2449,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Position13,CG_POSITION13,"POSITION13",2450,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Position14,CG_POSITION14,"POSITION14",2451,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Position15,CG_POSITION15,"POSITION15",2452,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Diffuse0,CG_DIFFUSE0,"DIFFUSE0",2501,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Tangent0,CG_TANGENT0,"TANGENT0",2565,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Tangent1,CG_TANGENT1,"TANGENT1",2566,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Tangent2,CG_TANGENT2,"TANGENT2",2567,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Tangent3,CG_TANGENT3,"TANGENT3",2568,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Tangent4,CG_TANGENT4,"TANGENT4",2569,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Tangent5,CG_TANGENT5,"TANGENT5",2570,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Tangent6,CG_TANGENT6,"TANGENT6",2571,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Tangent7,CG_TANGENT7,"TANGENT7",2572,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Tangent8,CG_TANGENT8,"TANGENT8",2573,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Tangent9,CG_TANGENT9,"TANGENT9",2574,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Tangent10,CG_TANGENT10,"TANGENT10",2575,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Tangent11,CG_TANGENT11,"TANGENT11",2576,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Tangent12,CG_TANGENT12,"TANGENT12",2577,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Tangent13,CG_TANGENT13,"TANGENT13",2578,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Tangent14,CG_TANGENT14,"TANGENT14",2579,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Tangent15,CG_TANGENT15,"TANGENT15",2580,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Specular0,CG_SPECULAR0,"SPECULAR0",2629,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(BlendIndices0,CG_BLENDINDICES0,"BLENDINDICES0",2693,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(BlendIndices1,CG_BLENDINDICES1,"BLENDINDICES1",2694,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(BlendIndices2,CG_BLENDINDICES2,"BLENDINDICES2",2695,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(BlendIndices3,CG_BLENDINDICES3,"BLENDINDICES3",2696,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(BlendIndices4,CG_BLENDINDICES4,"BLENDINDICES4",2697,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(BlendIndices5,CG_BLENDINDICES5,"BLENDINDICES5",2698,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(BlendIndices6,CG_BLENDINDICES6,"BLENDINDICES6",2699,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(BlendIndices7,CG_BLENDINDICES7,"BLENDINDICES7",2700,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(BlendIndices8,CG_BLENDINDICES8,"BLENDINDICES8",2701,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(BlendIndices9,CG_BLENDINDICES9,"BLENDINDICES9",2702,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(BlendIndices10,CG_BLENDINDICES10,"BLENDINDICES10",2703,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(BlendIndices11,CG_BLENDINDICES11,"BLENDINDICES11",2704,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(BlendIndices12,CG_BLENDINDICES12,"BLENDINDICES12",2705,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(BlendIndices13,CG_BLENDINDICES13,"BLENDINDICES13",2706,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(BlendIndices14,CG_BLENDINDICES14,"BLENDINDICES14",2707,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(BlendIndices15,CG_BLENDINDICES15,"BLENDINDICES15",2708,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Color0,CG_COLOR0,"COLOR0",2757,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Color1,CG_COLOR1,"COLOR1",2758,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Color2,CG_COLOR2,"COLOR2",2759,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Color3,CG_COLOR3,"COLOR3",2760,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Color4,CG_COLOR4,"COLOR4",2761,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Color5,CG_COLOR5,"COLOR5",2762,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Color6,CG_COLOR6,"COLOR6",2763,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Color7,CG_COLOR7,"COLOR7",2764,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Color8,CG_COLOR8,"COLOR8",2765,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Color9,CG_COLOR9,"COLOR9",2766,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Color10,CG_COLOR10,"COLOR10",2767,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Color11,CG_COLOR11,"COLOR11",2768,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Color12,CG_COLOR12,"COLOR12",2769,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Color13,CG_COLOR13,"COLOR13",2770,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Color14,CG_COLOR14,"COLOR14",2771,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Color15,CG_COLOR15,"COLOR15",2772,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(PSize0,CG_PSIZE0,"PSIZE0",2821,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(PSize1,CG_PSIZE1,"PSIZE1",2822,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(PSize2,CG_PSIZE2,"PSIZE2",2823,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(PSize3,CG_PSIZE3,"PSIZE3",2824,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(PSize4,CG_PSIZE4,"PSIZE4",2825,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(PSize5,CG_PSIZE5,"PSIZE5",2826,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(PSize6,CG_PSIZE6,"PSIZE6",2827,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(PSize7,CG_PSIZE7,"PSIZE7",2828,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(PSize8,CG_PSIZE8,"PSIZE8",2829,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(PSize9,CG_PSIZE9,"PSIZE9",2830,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(PSize10,CG_PSIZE10,"PSIZE10",2831,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(PSize11,CG_PSIZE11,"PSIZE11",2832,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(PSize12,CG_PSIZE12,"PSIZE12",2833,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(PSize13,CG_PSIZE13,"PSIZE13",2834,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(PSize14,CG_PSIZE14,"PSIZE14",2835,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(PSize15,CG_PSIZE15,"PSIZE15",2836,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(BiNormal0,CG_BINORMAL0,"BINORMAL0",2885,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(BiNormal1,CG_BINORMAL1,"BINORMAL1",2886,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(BiNormal2,CG_BINORMAL2,"BINORMAL2",2887,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(BiNormal3,CG_BINORMAL3,"BINORMAL3",2888,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(BiNormal4,CG_BINORMAL4,"BINORMAL4",2889,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(BiNormal5,CG_BINORMAL5,"BINORMAL5",2890,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(BiNormal6,CG_BINORMAL6,"BINORMAL6",2891,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(BiNormal7,CG_BINORMAL7,"BINORMAL7",2892,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(BiNormal8,CG_BINORMAL8,"BINORMAL8",2893,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(BiNormal9,CG_BINORMAL9,"BINORMAL9",2894,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(BiNormal10,CG_BINORMAL10,"BINORMAL10",2895,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(BiNormal11,CG_BINORMAL11,"BINORMAL11",2896,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(BiNormal12,CG_BINORMAL12,"BINORMAL12",2897,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(BiNormal13,CG_BINORMAL13,"BINORMAL13",2898,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(BiNormal14,CG_BINORMAL14,"BINORMAL14",2899,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(BiNormal15,CG_BINORMAL15,"BINORMAL15",2900,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(FOG0,CG_FOG0,"FOG0",2917,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(FOG1,CG_FOG1,"FOG1",2918,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(FOG2,CG_FOG2,"FOG2",2919,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(FOG3,CG_FOG3,"FOG3",2920,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(FOG4,CG_FOG4,"FOG4",2921,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(FOG5,CG_FOG5,"FOG5",2922,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(FOG6,CG_FOG6,"FOG6",2923,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(FOG7,CG_FOG7,"FOG7",2924,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(FOG8,CG_FOG8,"FOG8",2925,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(FOG9,CG_FOG9,"FOG9",2926,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(FOG10,CG_FOG10,"FOG10",2927,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(FOG11,CG_FOG11,"FOG11",2928,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(FOG12,CG_FOG12,"FOG12",2929,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(FOG13,CG_FOG13,"FOG13",2930,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(FOG14,CG_FOG14,"FOG14",2931,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(FOG15,CG_FOG15,"FOG15",2932,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(DEPTH0,CG_DEPTH0,"DEPTH0",2933,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(DEPTH1,CG_DEPTH1,"DEPTH1",2934,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(DEPTH2,CG_DEPTH2,"DEPTH2",2935,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(DEPTH3,CG_DEPTH3,"DEPTH3",2936,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(DEPTH4,CG_DEPTH4,"DEPTH4",2937,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(DEPTH5,CG_DEPTH5,"DEPTH5",2938,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(DEPTH6,CG_DEPTH6,"DEPTH6",2939,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(DEPTH7,CG_DEPTH7,"DEPTH7",2940,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(DEPTH8,CG_DEPTH8,"DEPTH8",2941,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(DEPTH9,CG_DEPTH9,"DEPTH9",2942,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(DEPTH10,CG_DEPTH10,"DEPTH10",2943,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(DEPTH11,CG_DEPTH11,"DEPTH11",2944,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(DEPTH12,CG_DEPTH12,"DEPTH12",2945,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(DEPTH13,CG_DEPTH13,"DEPTH13",2946,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(DEPTH14,CG_DEPTH14,"DEPTH14",2947,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(DEPTH15,CG_DEPTH15,"DEPTH15",2948,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(SAMPLE0,CG_SAMPLE0,"SAMPLE0",2949,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(SAMPLE1,CG_SAMPLE1,"SAMPLE1",2950,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(SAMPLE2,CG_SAMPLE2,"SAMPLE2",2951,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(SAMPLE3,CG_SAMPLE3,"SAMPLE3",2952,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(SAMPLE4,CG_SAMPLE4,"SAMPLE4",2953,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(SAMPLE5,CG_SAMPLE5,"SAMPLE5",2954,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(SAMPLE6,CG_SAMPLE6,"SAMPLE6",2955,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(SAMPLE7,CG_SAMPLE7,"SAMPLE7",2956,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(SAMPLE8,CG_SAMPLE8,"SAMPLE8",2957,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(SAMPLE9,CG_SAMPLE9,"SAMPLE9",2958,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(SAMPLE10,CG_SAMPLE10,"SAMPLE10",2959,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(SAMPLE11,CG_SAMPLE11,"SAMPLE11",2960,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(SAMPLE12,CG_SAMPLE12,"SAMPLE12",2961,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(SAMPLE13,CG_SAMPLE13,"SAMPLE13",2962,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(SAMPLE14,CG_SAMPLE14,"SAMPLE14",2963,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(SAMPLE15,CG_SAMPLE15,"SAMPLE15",2964,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(BlendWeight0,CG_BLENDWEIGHT0,"BLENDWEIGHT0",3028,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(BlendWeight1,CG_BLENDWEIGHT1,"BLENDWEIGHT1",3029,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(BlendWeight2,CG_BLENDWEIGHT2,"BLENDWEIGHT2",3030,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(BlendWeight3,CG_BLENDWEIGHT3,"BLENDWEIGHT3",3031,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(BlendWeight4,CG_BLENDWEIGHT4,"BLENDWEIGHT4",3032,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(BlendWeight5,CG_BLENDWEIGHT5,"BLENDWEIGHT5",3033,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(BlendWeight6,CG_BLENDWEIGHT6,"BLENDWEIGHT6",3034,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(BlendWeight7,CG_BLENDWEIGHT7,"BLENDWEIGHT7",3035,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(BlendWeight8,CG_BLENDWEIGHT8,"BLENDWEIGHT8",3036,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(BlendWeight9,CG_BLENDWEIGHT9,"BLENDWEIGHT9",3037,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(BlendWeight10,CG_BLENDWEIGHT10,"BLENDWEIGHT10",3038,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(BlendWeight11,CG_BLENDWEIGHT11,"BLENDWEIGHT11",3039,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(BlendWeight12,CG_BLENDWEIGHT12,"BLENDWEIGHT12",3040,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(BlendWeight13,CG_BLENDWEIGHT13,"BLENDWEIGHT13",3041,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(BlendWeight14,CG_BLENDWEIGHT14,"BLENDWEIGHT14",3042,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(BlendWeight15,CG_BLENDWEIGHT15,"BLENDWEIGHT15",3043,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Normal0,CG_NORMAL0,"NORMAL0",3092,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Normal1,CG_NORMAL1,"NORMAL1",3093,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Normal2,CG_NORMAL2,"NORMAL2",3094,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Normal3,CG_NORMAL3,"NORMAL3",3095,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Normal4,CG_NORMAL4,"NORMAL4",3096,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Normal5,CG_NORMAL5,"NORMAL5",3097,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Normal6,CG_NORMAL6,"NORMAL6",3098,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Normal7,CG_NORMAL7,"NORMAL7",3099,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Normal8,CG_NORMAL8,"NORMAL8",3100,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Normal9,CG_NORMAL9,"NORMAL9",3101,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Normal10,CG_NORMAL10,"NORMAL10",3102,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Normal11,CG_NORMAL11,"NORMAL11",3103,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Normal12,CG_NORMAL12,"NORMAL12",3104,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Normal13,CG_NORMAL13,"NORMAL13",3105,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Normal14,CG_NORMAL14,"NORMAL14",3106,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Normal15,CG_NORMAL15,"NORMAL15",3107,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(FogCoord,CG_FOGCOORD,"FOGCOORD",3156,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(TexCoord0,CG_TEXCOORD0,"TEXCOORD0",3220,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(TexCoord1,CG_TEXCOORD1,"TEXCOORD1",3221,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(TexCoord2,CG_TEXCOORD2,"TEXCOORD2",3222,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(TexCoord3,CG_TEXCOORD3,"TEXCOORD3",3223,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(TexCoord4,CG_TEXCOORD4,"TEXCOORD4",3224,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(TexCoord5,CG_TEXCOORD5,"TEXCOORD5",3225,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(TexCoord6,CG_TEXCOORD6,"TEXCOORD6",3226,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(TexCoord7,CG_TEXCOORD7,"TEXCOORD7",3227,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(TexCoord8,CG_TEXCOORD8,"TEXCOORD8",3228,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(TexCoord9,CG_TEXCOORD9,"TEXCOORD9",3229,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(TexCoord10,CG_TEXCOORD10,"TEXCOORD10",3230,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(TexCoord11,CG_TEXCOORD11,"TEXCOORD11",3231,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(TexCoord12,CG_TEXCOORD12,"TEXCOORD12",3232,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(TexCoord13,CG_TEXCOORD13,"TEXCOORD13",3233,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(TexCoord14,CG_TEXCOORD14,"TEXCOORD14",3234,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(TexCoord15,CG_TEXCOORD15,"TEXCOORD15",3235,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(CombinerConst0,CG_COMBINER_CONST0,"COMBINER_CONST0",3284,0,CGI_UNIFORM_PARAM) +CG_BINDLOCATION_MACRO(CombinerConst1,CG_COMBINER_CONST1,"COMBINER_CONST1",3285,0,CGI_UNIFORM_PARAM) +CG_BINDLOCATION_MACRO(CombinerStageConst0,CG_COMBINER_STAGE_CONST0,"COMBINER_STAGE_CONST0",3286,1,CGI_UNIFORM_PARAM) +CG_BINDLOCATION_MACRO(CombinerStageConst1,CG_COMBINER_STAGE_CONST1,"COMBINER_STAGE_CONST1",3287,1,CGI_UNIFORM_PARAM) +CG_BINDLOCATION_MACRO(OffsetTextureMatrix,CG_OFFSET_TEXTURE_MATRIX,"OFFSET_TEXTURE_MATRIX",3288,0,CGI_UNIFORM_PARAM) +CG_BINDLOCATION_MACRO(OffsetTextureScale,CG_OFFSET_TEXTURE_SCALE,"OFFSET_TEXTURE_SCALE",3289,0,CGI_UNIFORM_PARAM) +CG_BINDLOCATION_MACRO(OffsetTextureBias,CG_OFFSET_TEXTURE_BIAS,"OFFSET_TEXTURE_BIAS",3290,0,CGI_UNIFORM_PARAM) +CG_BINDLOCATION_MACRO(ConstEye,CG_CONST_EYE,"CONST_EYE",3291,0,CGI_UNIFORM_PARAM) +CG_BINDLOCATION_MACRO(Coverage, CG_COVERAGE, "COVERAGE", 3292, 0, CG_VARYING_PARAM) + +CG_BINDLOCATION_MACRO(TessFactor,CG_TESSFACTOR,"TESSFACTOR",3255,0,CG_VARYING_PARAM) + +CG_BINDLOCATION_MACRO(GLSLUniform,CG_GLSL_UNIFORM,"glsl_uniform",3300,1,CGI_UNIFORM_PARAM) +CG_BINDLOCATION_MACRO(GLSLAttrib,CG_GLSL_ATTRIB,"glsl_attrib",3301,1,CG_VARYING_PARAM) + +CG_BINDLOCATION_MACRO(Env,CG_ENV,"ENV",3302,1,CG_VARYING_PARAM) + +CG_BINDLOCATION_MACRO(HLSLUniform,CG_HLSL_UNIFORM,"hlsl_uniform",3559,1,CGI_UNIFORM_PARAM) +CG_BINDLOCATION_MACRO(HLSLAttrib,CG_HLSL_VARYING,"hlsl_attrib",3560,1,CG_VARYING_PARAM) + +CG_BINDLOCATION_MACRO(SamplerResource,CG_SAMPLER_RES, "SAMPLER_RES", 3561, 1, CGI_UNIFORM_PARAM) + +CG_BINDLOCATION_MACRO(LastColor0, CG_LASTCOL0, "LASTCOL0", 4400, 0, CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(LastColor1, CG_LASTCOL1, "LASTCOL1", 4401, 0, CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(LastColor2, CG_LASTCOL2, "LASTCOL2", 4402, 0, CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(LastColor3, CG_LASTCOL3, "LASTCOL3", 4403, 0, CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(LastColor4, CG_LASTCOL4, "LASTCOL4", 4404, 0, CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(LastColor5, CG_LASTCOL5, "LASTCOL5", 4405, 0, CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(LastColor6, CG_LASTCOL6, "LASTCOL6", 4406, 0, CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(LastColor7, CG_LASTCOL7, "LASTCOL7", 4407, 0, CG_VARYING_PARAM) + +CG_BINDLOCATION_MACRO(Face,CG_FACE,"FACE",4410,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(PrimitiveId,CG_PRIMITIVEID,"PRIMITIVEID",4411,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(InstanceId,CG_INSTANCEID,"INSTANCEID",4412,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(SampleId,CG_SAMPLEID,"SAMPLEID",4413,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(VertexId,CG_VERTEXID,"VERTEXID",4414,0,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(Layer,CG_LAYER,"LAYER",4415,1,CG_VARYING_PARAM) +CG_BINDLOCATION_MACRO(SampleMask,CG_SAMPLEMASK,"SAMPLEMASK",4416,0,CG_VARYING_PARAM) + +#undef CG_BINDLOCATION_MACRO diff --git a/Externals/Cg/cg_datatypes.h b/Externals/Cg/cg_datatypes.h new file mode 100644 index 0000000000..f61d6fb302 --- /dev/null +++ b/Externals/Cg/cg_datatypes.h @@ -0,0 +1,191 @@ +/* + * + * Copyright (c) 2002-2007, NVIDIA Corporation. + * + * + * + * NVIDIA Corporation("NVIDIA") supplies this software to you in consideration + * of your agreement to the following terms, and your use, installation, + * modification or redistribution of this NVIDIA software constitutes + * acceptance of these terms. If you do not agree with these terms, please do + * not use, install, modify or redistribute this NVIDIA software. + * + * + * + * In consideration of your agreement to abide by the following terms, and + * subject to these terms, NVIDIA grants you a personal, non-exclusive license, + * under NVIDIA's copyrights in this original NVIDIA software (the "NVIDIA + * Software"), to use, reproduce, modify and redistribute the NVIDIA + * Software, with or without modifications, in source and/or binary forms; + * provided that if you redistribute the NVIDIA Software, you must retain the + * copyright notice of NVIDIA, this notice and the following text and + * disclaimers in all such redistributions of the NVIDIA Software. Neither the + * name, trademarks, service marks nor logos of NVIDIA Corporation may be used + * to endorse or promote products derived from the NVIDIA Software without + * specific prior written permission from NVIDIA. Except as expressly stated + * in this notice, no other rights or licenses express or implied, are granted + * by NVIDIA herein, including but not limited to any patent rights that may be + * infringed by your derivative works or by other works in which the NVIDIA + * Software may be incorporated. No hardware is licensed hereunder. + * + * + * + * THE NVIDIA SOFTWARE IS BEING PROVIDED ON AN "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING + * WITHOUT LIMITATION, WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR ITS USE AND OPERATION + * EITHER ALONE OR IN COMBINATION WITH OTHER PRODUCTS. + * + * + * + * IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL, + * EXEMPLARY, CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, LOST + * PROFITS; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) OR ARISING IN ANY WAY OUT OF THE USE, + * REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE NVIDIA SOFTWARE, + * HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING + * NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF NVIDIA HAS BEEN ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + + +/* + * The following macro invocations define the supported CG basic data types. + * + * The macros have the form : + * + * CG_DATATYPE_MACRO(name, compiler_name, enum_name, base_name, nrows, ncols, pc_name) + * + * name : The name of the data type. + * compiler_name : The name of the data type within the compiler syntax. + * enum_name : The C enumerant. + * base_name : The C enumerant of the base type. + * nrows : Number of rows for matrix types. Should be 0 other-wise. + * ncols : Number of columns for scalar, vector, and matrix types. + * pc_name : The C enumerant of the parameter class. + * + */ + + + +CG_DATATYPE_MACRO(Half,half,CG_HALF,CG_HALF,0,1,CG_PARAMETERCLASS_SCALAR) +CG_DATATYPE_MACRO(Half2,half2,CG_HALF2,CG_HALF,0,2,CG_PARAMETERCLASS_VECTOR) +CG_DATATYPE_MACRO(Half3,half3,CG_HALF3,CG_HALF,0,3,CG_PARAMETERCLASS_VECTOR) +CG_DATATYPE_MACRO(Half4,half4,CG_HALF4,CG_HALF,0,4,CG_PARAMETERCLASS_VECTOR) +CG_DATATYPE_MACRO(Half1x1,half1x1,CG_HALF1x1,CG_HALF,1,1,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Half1x2,half1x2,CG_HALF1x2,CG_HALF,1,2,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Half1x3,half1x3,CG_HALF1x3,CG_HALF,1,3,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Half1x4,half1x4,CG_HALF1x4,CG_HALF,1,4,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Half2x1,half2x1,CG_HALF2x1,CG_HALF,2,1,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Half2x2,half2x2,CG_HALF2x2,CG_HALF,2,2,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Half2x3,half2x3,CG_HALF2x3,CG_HALF,2,3,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Half2x4,half2x4,CG_HALF2x4,CG_HALF,2,4,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Half3x1,half3x1,CG_HALF3x1,CG_HALF,3,1,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Half3x2,half3x2,CG_HALF3x2,CG_HALF,3,2,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Half3x3,half3x3,CG_HALF3x3,CG_HALF,3,3,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Half3x4,half3x4,CG_HALF3x4,CG_HALF,3,4,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Half4x1,half4x1,CG_HALF4x1,CG_HALF,4,1,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Half4x2,half4x2,CG_HALF4x2,CG_HALF,4,2,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Half4x3,half4x3,CG_HALF4x3,CG_HALF,4,3,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Half4x4,half4x4,CG_HALF4x4,CG_HALF,4,4,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Float,float,CG_FLOAT,CG_FLOAT,0,1,CG_PARAMETERCLASS_SCALAR) +CG_DATATYPE_MACRO(Float2,float2,CG_FLOAT2,CG_FLOAT,0,2,CG_PARAMETERCLASS_VECTOR) +CG_DATATYPE_MACRO(Float3,float3,CG_FLOAT3,CG_FLOAT,0,3,CG_PARAMETERCLASS_VECTOR) +CG_DATATYPE_MACRO(Float4,float4,CG_FLOAT4,CG_FLOAT,0,4,CG_PARAMETERCLASS_VECTOR) +CG_DATATYPE_MACRO(Float1x1,float1x1,CG_FLOAT1x1,CG_FLOAT,1,1,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Float1x2,float1x2,CG_FLOAT1x2,CG_FLOAT,1,2,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Float1x3,float1x3,CG_FLOAT1x3,CG_FLOAT,1,3,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Float1x4,float1x4,CG_FLOAT1x4,CG_FLOAT,1,4,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Float2x1,float2x1,CG_FLOAT2x1,CG_FLOAT,2,1,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Float2x2,float2x2,CG_FLOAT2x2,CG_FLOAT,2,2,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Float2x3,float2x3,CG_FLOAT2x3,CG_FLOAT,2,3,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Float2x4,float2x4,CG_FLOAT2x4,CG_FLOAT,2,4,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Float3x1,float3x1,CG_FLOAT3x1,CG_FLOAT,3,1,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Float3x2,float3x2,CG_FLOAT3x2,CG_FLOAT,3,2,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Float3x3,float3x3,CG_FLOAT3x3,CG_FLOAT,3,3,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Float3x4,float3x4,CG_FLOAT3x4,CG_FLOAT,3,4,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Float4x1,float4x1,CG_FLOAT4x1,CG_FLOAT,4,1,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Float4x2,float4x2,CG_FLOAT4x2,CG_FLOAT,4,2,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Float4x3,float4x3,CG_FLOAT4x3,CG_FLOAT,4,3,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Float4x4,float4x4,CG_FLOAT4x4,CG_FLOAT,4,4,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Sampler1D,sampler1D,CG_SAMPLER1D,CG_SAMPLER1D,0,0,CG_PARAMETERCLASS_SAMPLER) +CG_DATATYPE_MACRO(Sampler2D,sampler2D,CG_SAMPLER2D,CG_SAMPLER2D,0,0,CG_PARAMETERCLASS_SAMPLER) +CG_DATATYPE_MACRO(Sampler3D,sampler3D,CG_SAMPLER3D,CG_SAMPLER3D,0,0,CG_PARAMETERCLASS_SAMPLER) +CG_DATATYPE_MACRO(SamplerRECT,samplerRECT,CG_SAMPLERRECT,CG_SAMPLERRECT,0,0,CG_PARAMETERCLASS_SAMPLER) +CG_DATATYPE_MACRO(SamplerCUBE,samplerCUBE,CG_SAMPLERCUBE,CG_SAMPLERCUBE,0,0,CG_PARAMETERCLASS_SAMPLER) +CG_DATATYPE_MACRO(Fixed,fixed,CG_FIXED,CG_FIXED,0,1,CG_PARAMETERCLASS_SCALAR) +CG_DATATYPE_MACRO(Fixed2,fixed2,CG_FIXED2,CG_FIXED,0,2,CG_PARAMETERCLASS_VECTOR) +CG_DATATYPE_MACRO(Fixed3,fixed3,CG_FIXED3,CG_FIXED,0,3,CG_PARAMETERCLASS_VECTOR) +CG_DATATYPE_MACRO(Fixed4,fixed4,CG_FIXED4,CG_FIXED,0,4,CG_PARAMETERCLASS_VECTOR) +CG_DATATYPE_MACRO(Fixed1x1,fixed1x1,CG_FIXED1x1,CG_FIXED,1,1,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Fixed1x2,fixed1x2,CG_FIXED1x2,CG_FIXED,1,2,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Fixed1x3,fixed1x3,CG_FIXED1x3,CG_FIXED,1,3,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Fixed1x4,fixed1x4,CG_FIXED1x4,CG_FIXED,1,4,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Fixed2x1,fixed2x1,CG_FIXED2x1,CG_FIXED,2,1,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Fixed2x2,fixed2x2,CG_FIXED2x2,CG_FIXED,2,2,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Fixed2x3,fixed2x3,CG_FIXED2x3,CG_FIXED,2,3,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Fixed2x4,fixed2x4,CG_FIXED2x4,CG_FIXED,2,4,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Fixed3x1,fixed3x1,CG_FIXED3x1,CG_FIXED,3,1,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Fixed3x2,fixed3x2,CG_FIXED3x2,CG_FIXED,3,2,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Fixed3x3,fixed3x3,CG_FIXED3x3,CG_FIXED,3,3,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Fixed3x4,fixed3x4,CG_FIXED3x4,CG_FIXED,3,4,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Fixed4x1,fixed4x1,CG_FIXED4x1,CG_FIXED,4,1,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Fixed4x2,fixed4x2,CG_FIXED4x2,CG_FIXED,4,2,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Fixed4x3,fixed4x3,CG_FIXED4x3,CG_FIXED,4,3,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Fixed4x4,fixed4x4,CG_FIXED4x4,CG_FIXED,4,4,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Half1,half1,CG_HALF1,CG_HALF,0,1,CG_PARAMETERCLASS_VECTOR) +CG_DATATYPE_MACRO(Float1,float1,CG_FLOAT1,CG_FLOAT,0,1,CG_PARAMETERCLASS_VECTOR) +CG_DATATYPE_MACRO(Fixed1,fixed1,CG_FIXED1,CG_FIXED,0,1,CG_PARAMETERCLASS_VECTOR) +CG_DATATYPE_MACRO(Int,int,CG_INT,CG_INT,0,1,CG_PARAMETERCLASS_SCALAR) +CG_DATATYPE_MACRO(Int1,int1,CG_INT1,CG_INT,0,1,CG_PARAMETERCLASS_VECTOR) +CG_DATATYPE_MACRO(Int2,int2,CG_INT2,CG_INT,0,2,CG_PARAMETERCLASS_VECTOR) +CG_DATATYPE_MACRO(Int3,int3,CG_INT3,CG_INT,0,3,CG_PARAMETERCLASS_VECTOR) +CG_DATATYPE_MACRO(Int4,int4,CG_INT4,CG_INT,0,4,CG_PARAMETERCLASS_VECTOR) +CG_DATATYPE_MACRO(Int1x1,int1x1,CG_INT1x1,CG_INT,1,1,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Int1x2,int1x2,CG_INT1x2,CG_INT,1,2,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Int1x3,int1x3,CG_INT1x3,CG_INT,1,3,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Int1x4,int1x4,CG_INT1x4,CG_INT,1,4,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Int2x1,int2x1,CG_INT2x1,CG_INT,2,1,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Int2x2,int2x2,CG_INT2x2,CG_INT,2,2,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Int2x3,int2x3,CG_INT2x3,CG_INT,2,3,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Int2x4,int2x4,CG_INT2x4,CG_INT,2,4,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Int3x1,int3x1,CG_INT3x1,CG_INT,3,1,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Int3x2,int3x2,CG_INT3x2,CG_INT,3,2,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Int3x3,int3x3,CG_INT3x3,CG_INT,3,3,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Int3x4,int3x4,CG_INT3x4,CG_INT,3,4,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Int4x1,int4x1,CG_INT4x1,CG_INT,4,1,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Int4x2,int4x2,CG_INT4x2,CG_INT,4,2,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Int4x3,int4x3,CG_INT4x3,CG_INT,4,3,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Int4x4,int4x4,CG_INT4x4,CG_INT,4,4,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Bool,bool,CG_BOOL,CG_BOOL,0,1,CG_PARAMETERCLASS_SCALAR) +CG_DATATYPE_MACRO(Bool1,bool1,CG_BOOL1,CG_BOOL,0,1,CG_PARAMETERCLASS_VECTOR) +CG_DATATYPE_MACRO(Bool2,bool2,CG_BOOL2,CG_BOOL,0,2,CG_PARAMETERCLASS_VECTOR) +CG_DATATYPE_MACRO(Bool3,bool3,CG_BOOL3,CG_BOOL,0,3,CG_PARAMETERCLASS_VECTOR) +CG_DATATYPE_MACRO(Bool4,bool4,CG_BOOL4,CG_BOOL,0,4,CG_PARAMETERCLASS_VECTOR) +CG_DATATYPE_MACRO(Bool1x1,bool1x1,CG_BOOL1x1,CG_BOOL,1,1,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Bool1x2,bool1x2,CG_BOOL1x2,CG_BOOL,1,2,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Bool1x3,bool1x3,CG_BOOL1x3,CG_BOOL,1,3,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Bool1x4,bool1x4,CG_BOOL1x4,CG_BOOL,1,4,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Bool2x1,bool2x1,CG_BOOL2x1,CG_BOOL,2,1,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Bool2x2,bool2x2,CG_BOOL2x2,CG_BOOL,2,2,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Bool2x3,bool2x3,CG_BOOL2x3,CG_BOOL,2,3,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Bool2x4,bool2x4,CG_BOOL2x4,CG_BOOL,2,4,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Bool3x1,bool3x1,CG_BOOL3x1,CG_BOOL,3,1,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Bool3x2,bool3x2,CG_BOOL3x2,CG_BOOL,3,2,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Bool3x3,bool3x3,CG_BOOL3x3,CG_BOOL,3,3,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Bool3x4,bool3x4,CG_BOOL3x4,CG_BOOL,3,4,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Bool4x1,bool4x1,CG_BOOL4x1,CG_BOOL,4,1,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Bool4x2,bool4x2,CG_BOOL4x2,CG_BOOL,4,2,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Bool4x3,bool4x3,CG_BOOL4x3,CG_BOOL,4,3,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(Bool4x4,bool4x4,CG_BOOL4x4,CG_BOOL,4,4,CG_PARAMETERCLASS_MATRIX) +CG_DATATYPE_MACRO(String,string,CG_STRING,CG_STRING,0,1,CG_PARAMETERCLASS_OBJECT) +CG_DATATYPE_MACRO(Program,program,CG_PROGRAM_TYPE,CG_PROGRAM_TYPE,0,0,CG_PARAMETERCLASS_OBJECT) +CG_DATATYPE_MACRO(Texture,texture,CG_TEXTURE,CG_TEXTURE,0,0,CG_PARAMETERCLASS_OBJECT) +CG_DATATYPE_MACRO(Sampler1DARRAY,sampler1DARRAY,CG_SAMPLER1DARRAY,CG_SAMPLER1DARRAY,0,0,CG_PARAMETERCLASS_SAMPLER) +CG_DATATYPE_MACRO(Sampler2DARRAY,sampler2DARRAY,CG_SAMPLER2DARRAY,CG_SAMPLER2DARRAY,0,0,CG_PARAMETERCLASS_SAMPLER) +CG_DATATYPE_MACRO(SamplerCUBEARRAY,samplerCUBEARRAY,CG_SAMPLERCUBEARRAY,CG_SAMPLERCUBEARRAY,0,0,CG_PARAMETERCLASS_SAMPLER) +CG_DATATYPE_MACRO(VertexShader, vertexshader, CG_VERTEXSHADER_TYPE, CG_VERTEXSHADER_TYPE, 0, 0, CG_PARAMETERCLASS_OBJECT) +CG_DATATYPE_MACRO(PixelShader, pixelshader, CG_PIXELSHADER_TYPE, CG_PIXELSHADER_TYPE, 0, 0, CG_PARAMETERCLASS_OBJECT) +CG_DATATYPE_MACRO(Sampler, sampler, CG_SAMPLER, CG_SAMPLER, 0, 0, CG_PARAMETERCLASS_SAMPLER) +#undef CG_DATATYPE_MACRO diff --git a/Externals/Cg/cg_enums.h b/Externals/Cg/cg_enums.h new file mode 100644 index 0000000000..07cfd837a6 --- /dev/null +++ b/Externals/Cg/cg_enums.h @@ -0,0 +1,112 @@ + +/* + * + * Copyright (c) 2002-2007, NVIDIA Corporation. + * + * + * + * NVIDIA Corporation("NVIDIA") supplies this software to you in consideration + * of your agreement to the following terms, and your use, installation, + * modification or redistribution of this NVIDIA software constitutes + * acceptance of these terms. If you do not agree with these terms, please do + * not use, install, modify or redistribute this NVIDIA software. + * + * + * + * In consideration of your agreement to abide by the following terms, and + * subject to these terms, NVIDIA grants you a personal, non-exclusive license, + * under NVIDIA's copyrights in this original NVIDIA software (the "NVIDIA + * Software"), to use, reproduce, modify and redistribute the NVIDIA + * Software, with or without modifications, in source and/or binary forms; + * provided that if you redistribute the NVIDIA Software, you must retain the + * copyright notice of NVIDIA, this notice and the following text and + * disclaimers in all such redistributions of the NVIDIA Software. Neither the + * name, trademarks, service marks nor logos of NVIDIA Corporation may be used + * to endorse or promote products derived from the NVIDIA Software without + * specific prior written permission from NVIDIA. Except as expressly stated + * in this notice, no other rights or licenses express or implied, are granted + * by NVIDIA herein, including but not limited to any patent rights that may be + * infringed by your derivative works or by other works in which the NVIDIA + * Software may be incorporated. No hardware is licensed hereunder. + * + * + * + * THE NVIDIA SOFTWARE IS BEING PROVIDED ON AN "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING + * WITHOUT LIMITATION, WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR ITS USE AND OPERATION + * EITHER ALONE OR IN COMBINATION WITH OTHER PRODUCTS. + * + * + * + * IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL, + * EXEMPLARY, CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, LOST + * PROFITS; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) OR ARISING IN ANY WAY OUT OF THE USE, + * REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE NVIDIA SOFTWARE, + * HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING + * NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF NVIDIA HAS BEEN ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + + +/* + * The following macro invocations define the supported CG basic data types. + * + * The macros have the form : + * + * CG_ENUM_MACRO(enum_name, enum_val) + * + * enum_name : The C enumerant name. + * enum_val : The enumerant value. + * + */ + + + +CG_ENUM_MACRO(CG_UNKNOWN, 4096) +CG_ENUM_MACRO(CG_IN, 4097) +CG_ENUM_MACRO(CG_OUT, 4098) +CG_ENUM_MACRO(CG_INOUT, 4099) +CG_ENUM_MACRO(CG_MIXED, 4100) +CG_ENUM_MACRO(CG_VARYING, 4101) +CG_ENUM_MACRO(CG_UNIFORM, 4102) +CG_ENUM_MACRO(CG_CONSTANT, 4103) +CG_ENUM_MACRO(CG_PROGRAM_SOURCE, 4104) +CG_ENUM_MACRO(CG_PROGRAM_ENTRY, 4105) +CG_ENUM_MACRO(CG_COMPILED_PROGRAM, 4106) +CG_ENUM_MACRO(CG_PROGRAM_PROFILE, 4107) +CG_ENUM_MACRO(CG_GLOBAL, 4108) +CG_ENUM_MACRO(CG_PROGRAM, 4109) +CG_ENUM_MACRO(CG_DEFAULT, 4110) +CG_ENUM_MACRO(CG_ERROR, 4111) +CG_ENUM_MACRO(CG_SOURCE, 4112) +CG_ENUM_MACRO(CG_OBJECT, 4113) +CG_ENUM_MACRO(CG_COMPILE_MANUAL, 4114) +CG_ENUM_MACRO(CG_COMPILE_IMMEDIATE, 4115) +CG_ENUM_MACRO(CG_COMPILE_LAZY, 4116) +CG_ENUM_MACRO(CG_CURRENT, 4117) +CG_ENUM_MACRO(CG_LITERAL, 4118) +CG_ENUM_MACRO(CG_VERSION, 4119) +CG_ENUM_MACRO(CG_ROW_MAJOR, 4120) +CG_ENUM_MACRO(CG_COLUMN_MAJOR, 4121) +CG_ENUM_MACRO(CG_FRAGMENT, 4122) +CG_ENUM_MACRO(CG_VERTEX, 4123) +CG_ENUM_MACRO(CG_POINT, 4124) +CG_ENUM_MACRO(CG_LINE, 4125) +CG_ENUM_MACRO(CG_LINE_ADJ, 4126) +CG_ENUM_MACRO(CG_TRIANGLE, 4127) +CG_ENUM_MACRO(CG_TRIANGLE_ADJ, 4128) +CG_ENUM_MACRO(CG_POINT_OUT, 4129) +CG_ENUM_MACRO(CG_LINE_OUT, 4130) +CG_ENUM_MACRO(CG_TRIANGLE_OUT, 4131) +CG_ENUM_MACRO(CG_IMMEDIATE_PARAMETER_SETTING, 4132) +CG_ENUM_MACRO(CG_DEFERRED_PARAMETER_SETTING, 4133) +CG_ENUM_MACRO(CG_NO_LOCKS_POLICY, 4134) +CG_ENUM_MACRO(CG_THREAD_SAFE_POLICY, 4135) +CG_ENUM_MACRO(CG_FORCE_UPPER_CASE_POLICY, 4136) +CG_ENUM_MACRO(CG_UNCHANGED_CASE_POLICY, 4137) +#undef CG_ENUM_MACRO + + diff --git a/Externals/Cg/cg_errors.h b/Externals/Cg/cg_errors.h new file mode 100644 index 0000000000..73731e16f6 --- /dev/null +++ b/Externals/Cg/cg_errors.h @@ -0,0 +1,320 @@ +/* + * + * Copyright (c) 2002-2007, NVIDIA Corporation. + * + * + * + * NVIDIA Corporation("NVIDIA") supplies this software to you in consideration + * of your agreement to the following terms, and your use, installation, + * modification or redistribution of this NVIDIA software constitutes + * acceptance of these terms. If you do not agree with these terms, please do + * not use, install, modify or redistribute this NVIDIA software. + * + * + * + * In consideration of your agreement to abide by the following terms, and + * subject to these terms, NVIDIA grants you a personal, non-exclusive license, + * under NVIDIA's copyrights in this original NVIDIA software (the "NVIDIA + * Software"), to use, reproduce, modify and redistribute the NVIDIA + * Software, with or without modifications, in source and/or binary forms; + * provided that if you redistribute the NVIDIA Software, you must retain the + * copyright notice of NVIDIA, this notice and the following text and + * disclaimers in all such redistributions of the NVIDIA Software. Neither the + * name, trademarks, service marks nor logos of NVIDIA Corporation may be used + * to endorse or promote products derived from the NVIDIA Software without + * specific prior written permission from NVIDIA. Except as expressly stated + * in this notice, no other rights or licenses express or implied, are granted + * by NVIDIA herein, including but not limited to any patent rights that may be + * infringed by your derivative works or by other works in which the NVIDIA + * Software may be incorporated. No hardware is licensed hereunder. + * + * + * + * THE NVIDIA SOFTWARE IS BEING PROVIDED ON AN "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING + * WITHOUT LIMITATION, WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR ITS USE AND OPERATION + * EITHER ALONE OR IN COMBINATION WITH OTHER PRODUCTS. + * + * + * + * IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL, + * EXEMPLARY, CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, LOST + * PROFITS; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) OR ARISING IN ANY WAY OUT OF THE USE, + * REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE NVIDIA SOFTWARE, + * HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING + * NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF NVIDIA HAS BEEN ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +/* + * The following macro invocations define error codes returned by various cg + * API functions. + * + * The macros have the form : + * + * CG_ERROR_MACRO(code, enum_name, message) + * + * code : The integer error code associated with the error. + * enum_name : The name of enumerant of the error code in the API. + * message : A description string associated with the error. + * + */ + + +CG_ERROR_MACRO(0, + CG_NO_ERROR, + "No error has occurred.") + +CG_ERROR_MACRO(1, + CG_COMPILER_ERROR, + "The compile returned an error.") + +CG_ERROR_MACRO(2, + CG_INVALID_PARAMETER_ERROR, + "The parameter used is invalid.") + +CG_ERROR_MACRO(3, + CG_INVALID_PROFILE_ERROR, + "The profile is not supported.") + +CG_ERROR_MACRO(4, + CG_PROGRAM_LOAD_ERROR, + "The program could not load.") + +CG_ERROR_MACRO(5, + CG_PROGRAM_BIND_ERROR, + "The program could not bind.") + +CG_ERROR_MACRO(6, + CG_PROGRAM_NOT_LOADED_ERROR, + "The program must be loaded before this operation may be used.") + +CG_ERROR_MACRO(7, + CG_UNSUPPORTED_GL_EXTENSION_ERROR, + "An unsupported GL extension was required to perform this operation.") + +CG_ERROR_MACRO(8, + CG_INVALID_VALUE_TYPE_ERROR, + "An unknown value type was assigned to a parameter.") + +CG_ERROR_MACRO(9, + CG_NOT_MATRIX_PARAM_ERROR, + "The parameter is not of matrix type.") + +CG_ERROR_MACRO(10, + CG_INVALID_ENUMERANT_ERROR, + "The enumerant parameter has an invalid value.") + +CG_ERROR_MACRO(11, + CG_NOT_4x4_MATRIX_ERROR, + "The parameter must be a 4x4 matrix type.") + +CG_ERROR_MACRO(12, + CG_FILE_READ_ERROR, + "The file could not be read.") + +CG_ERROR_MACRO(13, + CG_FILE_WRITE_ERROR, + "The file could not be written.") + +CG_ERROR_MACRO(14, + CG_NVPARSE_ERROR, + "nvparse could not successfully parse the output from the Cg " + "compiler backend.") + +CG_ERROR_MACRO(15, + CG_MEMORY_ALLOC_ERROR, + "Memory allocation failed.") + +CG_ERROR_MACRO(16, + CG_INVALID_CONTEXT_HANDLE_ERROR, + "Invalid context handle.") + +CG_ERROR_MACRO(17, + CG_INVALID_PROGRAM_HANDLE_ERROR, + "Invalid program handle.") + +CG_ERROR_MACRO(18, + CG_INVALID_PARAM_HANDLE_ERROR, + "Invalid parameter handle.") + +CG_ERROR_MACRO(19, + CG_UNKNOWN_PROFILE_ERROR, + "The specified profile is unknown.") + +CG_ERROR_MACRO(20, + CG_VAR_ARG_ERROR, + "The variable arguments were specified incorrectly.") + +CG_ERROR_MACRO(21, + CG_INVALID_DIMENSION_ERROR, + "The dimension value is invalid.") + +CG_ERROR_MACRO(22, + CG_ARRAY_PARAM_ERROR, + "The parameter must be an array.") + +CG_ERROR_MACRO(23, + CG_OUT_OF_ARRAY_BOUNDS_ERROR, + "Index into the array is out of bounds.") + +CG_ERROR_MACRO(24, + CG_CONFLICTING_TYPES_ERROR, + "A type being added to the context conflicts with an " + "existing type.") + +CG_ERROR_MACRO(25, + CG_CONFLICTING_PARAMETER_TYPES_ERROR, + "The parameters being bound have conflicting types.") + +CG_ERROR_MACRO(26, + CG_PARAMETER_IS_NOT_SHARED_ERROR, + "The parameter must be global.") + +CG_ERROR_MACRO(27, + CG_INVALID_PARAMETER_VARIABILITY_ERROR, + "The parameter could not be changed to the given variability.") + +CG_ERROR_MACRO(28, + CG_CANNOT_DESTROY_PARAMETER_ERROR, + "Cannot destroy the parameter. It is bound to other parameters " + "or is not a root parameter.") + + +CG_ERROR_MACRO(29, + CG_NOT_ROOT_PARAMETER_ERROR, + "The parameter is not a root parameter.") + +CG_ERROR_MACRO(30, + CG_PARAMETERS_DO_NOT_MATCH_ERROR, + "The two parameters being bound do not match.") + +CG_ERROR_MACRO(31, + CG_IS_NOT_PROGRAM_PARAMETER_ERROR, + "The parameter is not a program parameter.") + +CG_ERROR_MACRO(32, + CG_INVALID_PARAMETER_TYPE_ERROR, + "The type of the parameter is invalid.") + +CG_ERROR_MACRO(33, + CG_PARAMETER_IS_NOT_RESIZABLE_ARRAY_ERROR, + "The parameter must be a resizable array.") + +CG_ERROR_MACRO(34, + CG_INVALID_SIZE_ERROR, + "The size value is invalid.") + +CG_ERROR_MACRO(35, + CG_BIND_CREATES_CYCLE_ERROR, + "Cannot bind the given parameters. Binding will form a cycle.") + +CG_ERROR_MACRO(36, + CG_ARRAY_TYPES_DO_NOT_MATCH_ERROR, + "Cannot bind the given parameters. Array types do not match.") + +CG_ERROR_MACRO(37, + CG_ARRAY_DIMENSIONS_DO_NOT_MATCH_ERROR, + "Cannot bind the given parameters. " + "Array dimensions do not match.") + +CG_ERROR_MACRO(38, + CG_ARRAY_HAS_WRONG_DIMENSION_ERROR, + "The array has the wrong dimension.") + +CG_ERROR_MACRO(39, + CG_TYPE_IS_NOT_DEFINED_IN_PROGRAM_ERROR, + "Connecting the parameters failed because The type of the " + "source parameter is not defined within the given program " + "or does not match the type with the same name in the program.") + +CG_ERROR_MACRO(40, + CG_INVALID_EFFECT_HANDLE_ERROR, + "Invalid effect handle.") + +CG_ERROR_MACRO(41, + CG_INVALID_STATE_HANDLE_ERROR, + "Invalid state handle.") + +CG_ERROR_MACRO(42, + CG_INVALID_STATE_ASSIGNMENT_HANDLE_ERROR, + "Invalid stateassignment handle.") + +CG_ERROR_MACRO(43, + CG_INVALID_PASS_HANDLE_ERROR, + "Invalid pass handle.") + +CG_ERROR_MACRO(44, + CG_INVALID_ANNOTATION_HANDLE_ERROR, + "Invalid annotation handle.") + +CG_ERROR_MACRO(45, + CG_INVALID_TECHNIQUE_HANDLE_ERROR, + "Invalid technique handle.") + +// Do not use this! Use CG_INVALID_PARAM_HANDLE_ERROR instead. +CG_ERROR_MACRO(46, + CG_INVALID_PARAMETER_HANDLE_ERROR, + "Invalid parameter handle.") + +CG_ERROR_MACRO(47, + CG_STATE_ASSIGNMENT_TYPE_MISMATCH_ERROR, + "Operation is not valid for this type of stateassignment.") + +CG_ERROR_MACRO(48, + CG_INVALID_FUNCTION_HANDLE_ERROR, + "Invalid function handle.") + +CG_ERROR_MACRO(49, + CG_INVALID_TECHNIQUE_ERROR, + "Technique did not pass validation.") + +CG_ERROR_MACRO(50, + CG_INVALID_POINTER_ERROR, + "The supplied pointer is NULL.") + +CG_ERROR_MACRO(51, + CG_NOT_ENOUGH_DATA_ERROR, + "Not enough data was provided.") + +CG_ERROR_MACRO(52, + CG_NON_NUMERIC_PARAMETER_ERROR, + "The parameter is not of a numeric type.") + +CG_ERROR_MACRO(53, + CG_ARRAY_SIZE_MISMATCH_ERROR, + "The specified array sizes are not compatible with the given array.") + +CG_ERROR_MACRO(54, + CG_CANNOT_SET_NON_UNIFORM_PARAMETER_ERROR, + "Cannot set the value of a non-uniform parameter.") + +CG_ERROR_MACRO(55, + CG_DUPLICATE_NAME_ERROR, + "This name is already in use.") + +CG_ERROR_MACRO(56, + CG_INVALID_OBJ_HANDLE_ERROR, + "Invalid object handle.") + +CG_ERROR_MACRO(57, + CG_INVALID_BUFFER_HANDLE_ERROR, + "Invalid buffer handle.") + +CG_ERROR_MACRO(58, + CG_BUFFER_INDEX_OUT_OF_RANGE_ERROR, + "Buffer index is out of bounds.") + +CG_ERROR_MACRO(59, + CG_BUFFER_ALREADY_MAPPED_ERROR, + "The buffer is already mapped.") + +CG_ERROR_MACRO(60, + CG_BUFFER_UPDATE_NOT_ALLOWED_ERROR, + "The buffer cannot be updated.") + +#undef CG_ERROR_MACRO + diff --git a/Externals/Cg/cg_profiles.h b/Externals/Cg/cg_profiles.h new file mode 100644 index 0000000000..6b995f6e50 --- /dev/null +++ b/Externals/Cg/cg_profiles.h @@ -0,0 +1,95 @@ +/* + * + * Copyright (c) 2002-2007, NVIDIA Corporation. + * + * + * + * NVIDIA Corporation("NVIDIA") supplies this software to you in consideration + * of your agreement to the following terms, and your use, installation, + * modification or redistribution of this NVIDIA software constitutes + * acceptance of these terms. If you do not agree with these terms, please do + * not use, install, modify or redistribute this NVIDIA software. + * + * + * + * In consideration of your agreement to abide by the following terms, and + * subject to these terms, NVIDIA grants you a personal, non-exclusive license, + * under NVIDIA's copyrights in this original NVIDIA software (the "NVIDIA + * Software"), to use, reproduce, modify and redistribute the NVIDIA + * Software, with or without modifications, in source and/or binary forms; + * provided that if you redistribute the NVIDIA Software, you must retain the + * copyright notice of NVIDIA, this notice and the following text and + * disclaimers in all such redistributions of the NVIDIA Software. Neither the + * name, trademarks, service marks nor logos of NVIDIA Corporation may be used + * to endorse or promote products derived from the NVIDIA Software without + * specific prior written permission from NVIDIA. Except as expressly stated + * in this notice, no other rights or licenses express or implied, are granted + * by NVIDIA herein, including but not limited to any patent rights that may be + * infringed by your derivative works or by other works in which the NVIDIA + * Software may be incorporated. No hardware is licensed hereunder. + * + * + * + * THE NVIDIA SOFTWARE IS BEING PROVIDED ON AN "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING + * WITHOUT LIMITATION, WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR ITS USE AND OPERATION + * EITHER ALONE OR IN COMBINATION WITH OTHER PRODUCTS. + * + * + * + * IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL, + * EXEMPLARY, CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, LOST + * PROFITS; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) OR ARISING IN ANY WAY OUT OF THE USE, + * REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE NVIDIA SOFTWARE, + * HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING + * NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF NVIDIA HAS BEEN ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +/* + * The following macro invocations define the supported CG profiles. + * + * The macros have the form : + * + * CG_PROFILE_MACRO(name, compiler_id, compiler_opt) + * + * name : The name of the profile. Used consistently with the API. + * compiler_id : The identifier string for the profile used by the compiler. + * compiler_id_caps : compiler_id in caps. + * compiler_opt : The command-line switch used to force compilation into + * the profile. + * int_id : Integer enumerant associated with this bind location. + * vertex_profile : Non-zero if this is a vertex profile, otherwise it + * is considered to be a fragment profile. + * + * + */ + +#define CG_IN_PROFILES_INCLUDE + +#include + + +CG_PROFILE_MACRO(DX9Vertex11,vs_1_1,VS_1_1,"vs_1_1",6153,1) +CG_PROFILE_MACRO(DX9Vertex20,vs_2_0,VS_2_0,"vs_2_0",6154,1) +CG_PROFILE_MACRO(DX9Vertex2x,vs_2_x,VS_2_X,"vs_2_x",6155,1) +CG_PROFILE_MACRO(DX9Vertex2sw,vs_2_sw,VS_2_SW,"vs_2_sw",6156,1) +CG_PROFILE_MACRO(DX9Vertex30,vs_3_0,VS_3_0,"vs_3_0",6157,1) +CG_PROFILE_MACRO(DX9VertexHLSL,hlslv, HLSLV,"hlslv",6158,1) + +CG_PROFILE_MACRO(DX9Pixel11,ps_1_1,PS_1_1,"ps_1_1",6159,0) +CG_PROFILE_MACRO(DX9Pixel12,ps_1_2,PS_1_2,"ps_1_2",6160,0) +CG_PROFILE_MACRO(DX9Pixel13,ps_1_3,PS_1_3,"ps_1_3",6161,0) +CG_PROFILE_MACRO(DX9Pixel20,ps_2_0,PS_2_0,"ps_2_0",6162,0) +CG_PROFILE_MACRO(DX9Pixel2x,ps_2_x,PS_2_X,"ps_2_x",6163,0) +CG_PROFILE_MACRO(DX9Pixel2sw,ps_2_sw,PS_2_SW,"ps_2_sw",6164,0) +CG_PROFILE_MACRO(DX9Pixel30,ps_3_0,PS_3_0,"ps_3_0",6165,0) +CG_PROFILE_MACRO(DX9PixelHLSL,hlslf,HLSLF,"hlslf",6166,0) + +CG_PROFILE_MACRO(Generic, generic, GENERIC, "generic", 7002,0) + +#undef CG_PROFILE_MACRO +#undef CG_IN_PROFILES_INCLUDE diff --git a/Externals/Cg64/cg.lib b/Externals/Cg64/cg.lib new file mode 100644 index 0000000000..f9022d7b37 Binary files /dev/null and b/Externals/Cg64/cg.lib differ diff --git a/Externals/Cg64/cgGL.lib b/Externals/Cg64/cgGL.lib new file mode 100644 index 0000000000..97338019b2 Binary files /dev/null and b/Externals/Cg64/cgGL.lib differ diff --git a/Externals/WTL80/atlapp.h b/Externals/WTL80/atlapp.h new file mode 100644 index 0000000000..b62e097044 --- /dev/null +++ b/Externals/WTL80/atlapp.h @@ -0,0 +1,1688 @@ +// Windows Template Library - WTL version 8.0 +// Copyright (C) Microsoft Corporation. All rights reserved. +// +// This file is a part of the Windows Template Library. +// The use and distribution terms for this software are covered by the +// Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php) +// which can be found in the file CPL.TXT at the root of this distribution. +// By using this software in any fashion, you are agreeing to be bound by +// the terms of this license. You must not remove this notice, or +// any other, from this software. + +#ifndef __ATLAPP_H__ +#define __ATLAPP_H__ + +#pragma once + +#ifndef __cplusplus + #error ATL requires C++ compilation (use a .cpp suffix) +#endif + +#ifndef __ATLBASE_H__ + #error atlapp.h requires atlbase.h to be included first +#endif + +#ifndef _WIN32_WCE + #if (WINVER < 0x0400) + #error WTL requires Windows version 4.0 or higher + #endif + + #if (_WIN32_IE < 0x0300) + #error WTL requires IE version 3.0 or higher + #endif +#endif + +#ifdef _ATL_NO_COMMODULE + #error WTL requires that _ATL_NO_COMMODULE is not defined +#endif // _ATL_NO_COMMODULE + +#if defined(_WIN32_WCE) && defined(_ATL_MIN_CRT) + #pragma message("Warning: WTL for Windows CE doesn't use _ATL_MIN_CRT") +#endif // defined(_WIN32_WCE) && defined(_ATL_MIN_CRT) + +#include +#if !defined(_ATL_MIN_CRT) && defined(_MT) && !defined(_WIN32_WCE) + #include // for _beginthreadex +#endif + +#if (_ATL_VER < 0x0800) && !defined(_DEBUG) + #include +#endif + +#include +#ifndef _WIN32_WCE +#pragma comment(lib, "comctl32.lib") +#endif // !_WIN32_WCE + +#ifndef _WIN32_WCE + #include "atlres.h" +#else // CE specific + #include "atlresce.h" +#endif // _WIN32_WCE + +// We need to disable this warning because of template class arguments +#pragma warning(disable: 4127) + + +/////////////////////////////////////////////////////////////////////////////// +// WTL version number + +#define _WTL_VER 0x0800 + + +/////////////////////////////////////////////////////////////////////////////// +// Classes in this file: +// +// CMessageFilter +// CIdleHandler +// CMessageLoop +// +// CAppModule +// CServerAppModule +// +// Global functions: +// AtlGetDefaultGuiFont() +// AtlCreateBoldFont() +// AtlInitCommonControls() + + +/////////////////////////////////////////////////////////////////////////////// +// Global support for Windows CE + +#ifdef _WIN32_WCE + +#ifndef SW_SHOWDEFAULT + #define SW_SHOWDEFAULT SW_SHOWNORMAL +#endif // !SW_SHOWDEFAULT + +// These get's OR-ed in a constant and will have no effect. +// Defining them reduces the number of #ifdefs required for CE. +#define LR_DEFAULTSIZE 0 +#define LR_LOADFROMFILE 0 + +#ifndef SM_CXCURSOR + #define SM_CXCURSOR 13 +#endif +#ifndef SM_CYCURSOR + #define SM_CYCURSOR 14 +#endif + +inline BOOL IsMenu(HMENU hMenu) +{ + MENUITEMINFO mii = { sizeof(MENUITEMINFO) }; + ::SetLastError(0); + BOOL bRet = ::GetMenuItemInfo(hMenu, 0, TRUE, &mii); + if(!bRet) + bRet = (::GetLastError() != ERROR_INVALID_MENU_HANDLE) ? TRUE : FALSE; + return bRet; +} + +#if (_WIN32_WCE >= 410) +extern "C" void WINAPI ListView_SetItemSpacing(HWND hwndLV, int iHeight); +#endif // (_WIN32_WCE >= 410) + +inline int MulDiv(IN int nNumber, IN int nNumerator, IN int nDenominator) +{ + __int64 multiple = nNumber * nNumerator; + return static_cast(multiple / nDenominator); +} + +#if (_ATL_VER >= 0x0800) + +#ifndef _WTL_KEEP_WS_OVERLAPPEDWINDOW + #ifdef WS_OVERLAPPEDWINDOW + #undef WS_OVERLAPPEDWINDOW + #define WS_OVERLAPPEDWINDOW 0 + #endif // WS_OVERLAPPEDWINDOW +#endif // !_WTL_KEEP_WS_OVERLAPPEDWINDOW + +#ifndef RDW_FRAME + #define RDW_FRAME 0 +#endif // !RDW_FRAME + +#ifndef WM_WINDOWPOSCHANGING + #define WM_WINDOWPOSCHANGING 0 +#endif // !WM_WINDOWPOSCHANGING + +#define FreeResource(x) +#define UnlockResource(x) + +namespace ATL +{ + inline HRESULT CComModule::RegisterClassObjects(DWORD /*dwClsContext*/, DWORD /*dwFlags*/) throw() + { return E_NOTIMPL; } + inline HRESULT CComModule::RevokeClassObjects() throw() + { return E_NOTIMPL; } +}; // namespace ATL + +#ifndef lstrlenW + #define lstrlenW (int)ATL::lstrlenW +#endif // lstrlenW + +inline int WINAPI lstrlenA(LPCSTR lpszString) +{ return ATL::lstrlenA(lpszString); } + +#ifdef lstrcpyn + #undef lstrcpyn + #define lstrcpyn ATL::lstrcpynW +#endif // lstrcpyn + +#ifndef SetWindowLongPtrW + inline LONG_PTR tmp_SetWindowLongPtrW( HWND hWnd, int nIndex, LONG_PTR dwNewLong ) + { + return( ::SetWindowLongW( hWnd, nIndex, LONG( dwNewLong ) ) ); + } + #define SetWindowLongPtrW tmp_SetWindowLongPtrW +#endif + +#ifndef GetWindowLongPtrW + inline LONG_PTR tmp_GetWindowLongPtrW( HWND hWnd, int nIndex ) + { + return( ::GetWindowLongW( hWnd, nIndex ) ); + } + #define GetWindowLongPtrW tmp_GetWindowLongPtrW +#endif + +#ifndef LongToPtr + #define LongToPtr(x) ((void*)x) +#endif + +#ifndef PtrToInt + #define PtrToInt( p ) ((INT)(INT_PTR) (p) ) +#endif + +#else // !(_ATL_VER >= 0x0800) + +#ifdef lstrlenW + #undef lstrlenW + #define lstrlenW (int)::wcslen +#endif // lstrlenW + +#define lstrlenA (int)strlen + +#ifndef lstrcpyn + inline LPTSTR lstrcpyn(LPTSTR lpstrDest, LPCTSTR lpstrSrc, int nLength) + { + if(lpstrDest == NULL || lpstrSrc == NULL || nLength <= 0) + return NULL; + int nLen = min(lstrlen(lpstrSrc), nLength - 1); + LPTSTR lpstrRet = (LPTSTR)memcpy(lpstrDest, lpstrSrc, nLen * sizeof(TCHAR)); + lpstrDest[nLen] = 0; + return lpstrRet; + } +#endif // !lstrcpyn + +#ifndef lstrcpynW + inline LPWSTR lstrcpynW(LPWSTR lpstrDest, LPCWSTR lpstrSrc, int nLength) + { + return lstrcpyn(lpstrDest, lpstrSrc, nLength); // WinCE is Unicode only + } +#endif // !lstrcpynW + +#ifndef lstrcpynA + inline LPSTR lstrcpynA(LPSTR lpstrDest, LPCSTR lpstrSrc, int nLength) + { + if(lpstrDest == NULL || lpstrSrc == NULL || nLength <= 0) + return NULL; + int nLen = min(lstrlenA(lpstrSrc), nLength - 1); + LPSTR lpstrRet = (LPSTR)memcpy(lpstrDest, lpstrSrc, nLen * sizeof(char)); + lpstrDest[nLen] = 0; + return lpstrRet; + } +#endif // !lstrcpyn + +#ifdef TrackPopupMenu + #undef TrackPopupMenu +#endif // TrackPopupMenu + +#define DECLARE_WND_CLASS_EX(WndClassName, style, bkgnd) \ +static CWndClassInfo& GetWndClassInfo() \ +{ \ + static CWndClassInfo wc = \ + { \ + { style, StartWindowProc, \ + 0, 0, NULL, NULL, NULL, (HBRUSH)(bkgnd + 1), NULL, WndClassName }, \ + NULL, NULL, IDC_ARROW, TRUE, 0, _T("") \ + }; \ + return wc; \ +} + +#ifndef _MAX_FNAME + #define _MAX_FNAME _MAX_PATH +#endif // _MAX_FNAME + +#if (_WIN32_WCE < 400) + #define MAKEINTATOM(i) (LPTSTR)((ULONG_PTR)((WORD)(i))) +#endif // (_WIN32_WCE < 400) + +#if (_WIN32_WCE < 410) + #define WHEEL_PAGESCROLL (UINT_MAX) + #define WHEEL_DELTA 120 +#endif // (_WIN32_WCE < 410) + +#ifdef DrawIcon + #undef DrawIcon +#endif + +#ifndef VARCMP_LT + #define VARCMP_LT 0 +#endif +#ifndef VARCMP_EQ + #define VARCMP_EQ 1 +#endif +#ifndef VARCMP_GT + #define VARCMP_GT 2 +#endif +#ifndef VARCMP_NULL + #define VARCMP_NULL 3 +#endif + +#ifndef RDW_ALLCHILDREN + #define RDW_ALLCHILDREN 0 +#endif + +#endif // !(_ATL_VER >= 0x0800) + +#endif // _WIN32_WCE + + +/////////////////////////////////////////////////////////////////////////////// +// Global support for using original VC++ 6.0 headers with WTL + +#ifndef _ATL_NO_OLD_HEADERS_WIN64 +#if !defined(_WIN64) && (_ATL_VER < 0x0700) + + #ifndef PSM_INSERTPAGE + #define PSM_INSERTPAGE (WM_USER + 119) + #endif // !PSM_INSERTPAGE + + #ifndef GetClassLongPtr + #define GetClassLongPtrA GetClassLongA + #define GetClassLongPtrW GetClassLongW + #ifdef UNICODE + #define GetClassLongPtr GetClassLongPtrW + #else + #define GetClassLongPtr GetClassLongPtrA + #endif // !UNICODE + #endif // !GetClassLongPtr + + #ifndef GCLP_HICONSM + #define GCLP_HICONSM (-34) + #endif // !GCLP_HICONSM + + #ifndef GetWindowLongPtr + #define GetWindowLongPtrA GetWindowLongA + #define GetWindowLongPtrW GetWindowLongW + #ifdef UNICODE + #define GetWindowLongPtr GetWindowLongPtrW + #else + #define GetWindowLongPtr GetWindowLongPtrA + #endif // !UNICODE + #endif // !GetWindowLongPtr + + #ifndef SetWindowLongPtr + #define SetWindowLongPtrA SetWindowLongA + #define SetWindowLongPtrW SetWindowLongW + #ifdef UNICODE + #define SetWindowLongPtr SetWindowLongPtrW + #else + #define SetWindowLongPtr SetWindowLongPtrA + #endif // !UNICODE + #endif // !SetWindowLongPtr + + #ifndef GWLP_WNDPROC + #define GWLP_WNDPROC (-4) + #endif + #ifndef GWLP_HINSTANCE + #define GWLP_HINSTANCE (-6) + #endif + #ifndef GWLP_HWNDPARENT + #define GWLP_HWNDPARENT (-8) + #endif + #ifndef GWLP_USERDATA + #define GWLP_USERDATA (-21) + #endif + #ifndef GWLP_ID + #define GWLP_ID (-12) + #endif + + #ifndef DWLP_MSGRESULT + #define DWLP_MSGRESULT 0 + #endif + + typedef long LONG_PTR; + typedef unsigned long ULONG_PTR; + typedef ULONG_PTR DWORD_PTR; + + #ifndef HandleToUlong + #define HandleToUlong( h ) ((ULONG)(ULONG_PTR)(h) ) + #endif + #ifndef HandleToLong + #define HandleToLong( h ) ((LONG)(LONG_PTR) (h) ) + #endif + #ifndef LongToHandle + #define LongToHandle( h) ((HANDLE)(LONG_PTR) (h)) + #endif + #ifndef PtrToUlong + #define PtrToUlong( p ) ((ULONG)(ULONG_PTR) (p) ) + #endif + #ifndef PtrToLong + #define PtrToLong( p ) ((LONG)(LONG_PTR) (p) ) + #endif + #ifndef PtrToUint + #define PtrToUint( p ) ((UINT)(UINT_PTR) (p) ) + #endif + #ifndef PtrToInt + #define PtrToInt( p ) ((INT)(INT_PTR) (p) ) + #endif + #ifndef PtrToUshort + #define PtrToUshort( p ) ((unsigned short)(ULONG_PTR)(p) ) + #endif + #ifndef PtrToShort + #define PtrToShort( p ) ((short)(LONG_PTR)(p) ) + #endif + #ifndef IntToPtr + #define IntToPtr( i ) ((VOID *)(INT_PTR)((int)i)) + #endif + #ifndef UIntToPtr + #define UIntToPtr( ui ) ((VOID *)(UINT_PTR)((unsigned int)ui)) + #endif + #ifndef LongToPtr + #define LongToPtr( l ) ((VOID *)(LONG_PTR)((long)l)) + #endif + #ifndef ULongToPtr + #define ULongToPtr( ul ) ((VOID *)(ULONG_PTR)((unsigned long)ul)) + #endif + +#endif // !defined(_WIN64) && (_ATL_VER < 0x0700) +#endif // !_ATL_NO_OLD_HEADERS_WIN64 + + +/////////////////////////////////////////////////////////////////////////////// +// Global support for SecureHelper functions + +#ifndef _TRUNCATE + #define _TRUNCATE ((size_t)-1) +#endif + +#ifndef _ERRCODE_DEFINED + #define _ERRCODE_DEFINED + typedef int errno_t; +#endif + +#ifndef _SECURECRT_ERRCODE_VALUES_DEFINED + #define _SECURECRT_ERRCODE_VALUES_DEFINED + #define EINVAL 22 + #define STRUNCATE 80 +#endif + +#ifndef _countof + #define _countof(_Array) (sizeof(_Array) / sizeof(_Array[0])) +#endif + + +/////////////////////////////////////////////////////////////////////////////// +// Miscellaneous global support + +// define useful macros from winuser.h +#ifndef IS_INTRESOURCE + #define IS_INTRESOURCE(_r) (((ULONG_PTR)(_r) >> 16) == 0) +#endif // IS_INTRESOURCE + +// protect template members from windowsx.h macros +#ifdef _INC_WINDOWSX + #undef SubclassWindow +#endif // _INC_WINDOWSX + +// define useful macros from windowsx.h +#ifndef GET_X_LPARAM + #define GET_X_LPARAM(lParam) ((int)(short)LOWORD(lParam)) +#endif +#ifndef GET_Y_LPARAM + #define GET_Y_LPARAM(lParam) ((int)(short)HIWORD(lParam)) +#endif + +// Dummy structs for compiling with /CLR +#if (_MSC_VER >= 1300) && defined(_MANAGED) + __if_not_exists(_IMAGELIST::_IMAGELIST) { struct _IMAGELIST { }; } + __if_not_exists(_TREEITEM::_TREEITEM) { struct _TREEITEM { }; } + __if_not_exists(_PSP::_PSP) { struct _PSP { }; } +#endif + +// Define ATLVERIFY macro for ATL3 +#if (_ATL_VER < 0x0700) + #ifndef ATLVERIFY + #ifdef _DEBUG + #define ATLVERIFY(expr) ATLASSERT(expr) + #else + #define ATLVERIFY(expr) (expr) + #endif // DEBUG + #endif // ATLVERIFY +#endif // (_ATL_VER < 0x0700) + +// Forward declaration for ATL3 fix +#if (_ATL_VER < 0x0700) && defined(_ATL_DLL) && !defined(_WIN32_WCE) + namespace ATL { HRESULT AtlGetCommCtrlVersion(LPDWORD pdwMajor, LPDWORD pdwMinor); }; +#endif + + +namespace WTL +{ + +#if (_ATL_VER >= 0x0700) + DECLARE_TRACE_CATEGORY(atlTraceUI); + #ifdef _DEBUG + __declspec(selectany) ATL::CTraceCategory atlTraceUI(_T("atlTraceUI")); + #endif // _DEBUG +#else // !(_ATL_VER >= 0x0700) + enum wtlTraceFlags + { + atlTraceUI = 0x10000000 + }; +#endif // !(_ATL_VER >= 0x0700) + +// Windows version helper +inline bool AtlIsOldWindows() +{ + OSVERSIONINFO ovi = { 0 }; + ovi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + BOOL bRet = ::GetVersionEx(&ovi); + return (!bRet || !((ovi.dwMajorVersion >= 5) || (ovi.dwMajorVersion == 4 && ovi.dwMinorVersion >= 90))); +} + +// default GUI font helper +inline HFONT AtlGetDefaultGuiFont() +{ +#ifndef _WIN32_WCE + return (HFONT)::GetStockObject(DEFAULT_GUI_FONT); +#else // CE specific + return (HFONT)::GetStockObject(SYSTEM_FONT); +#endif // _WIN32_WCE +} + +// bold font helper (NOTE: Caller owns the font, and should destroy it when done using it) +inline HFONT AtlCreateBoldFont(HFONT hFont = NULL) +{ + if(hFont == NULL) + hFont = AtlGetDefaultGuiFont(); + ATLASSERT(hFont != NULL); + HFONT hFontBold = NULL; + LOGFONT lf = { 0 }; + if(::GetObject(hFont, sizeof(LOGFONT), &lf) == sizeof(LOGFONT)) + { + lf.lfWeight = FW_BOLD; + hFontBold = ::CreateFontIndirect(&lf); + ATLASSERT(hFontBold != NULL); + } + else + { + ATLASSERT(FALSE); + } + return hFontBold; +} + +// Common Controls initialization helper +inline BOOL AtlInitCommonControls(DWORD dwFlags) +{ + INITCOMMONCONTROLSEX iccx = { sizeof(INITCOMMONCONTROLSEX), dwFlags }; + BOOL bRet = ::InitCommonControlsEx(&iccx); + ATLASSERT(bRet); + return bRet; +} + + +/////////////////////////////////////////////////////////////////////////////// +// RunTimeHelper - helper functions for Windows version and structure sizes + +// Not for Windows CE +#if defined(_WIN32_WCE) && !defined(_WTL_NO_RUNTIME_STRUCT_SIZE) + #define _WTL_NO_RUNTIME_STRUCT_SIZE +#endif + +#ifndef _WTL_NO_RUNTIME_STRUCT_SIZE + +#ifndef _SIZEOF_STRUCT + #define _SIZEOF_STRUCT(structname, member) (((int)((LPBYTE)(&((structname*)0)->member) - ((LPBYTE)((structname*)0)))) + sizeof(((structname*)0)->member)) +#endif + +#if (_WIN32_WINNT >= 0x0600) && !defined(REBARBANDINFO_V6_SIZE) + #define REBARBANDINFO_V6_SIZE _SIZEOF_STRUCT(REBARBANDINFO, cxHeader) +#endif // (_WIN32_WINNT >= 0x0600) && !defined(REBARBANDINFO_V6_SIZE) + +#if (_WIN32_WINNT >= 0x0600) && !defined(LVGROUP_V5_SIZE) + #define LVGROUP_V5_SIZE _SIZEOF_STRUCT(LVGROUP, uAlign) +#endif // (_WIN32_WINNT >= 0x0600) && !defined(LVGROUP_V5_SIZE) + +#if (_WIN32_WINNT >= 0x0600) && !defined(LVTILEINFO_V5_SIZE) + #define LVTILEINFO_V5_SIZE _SIZEOF_STRUCT(LVTILEINFO, puColumns) +#endif // (_WIN32_WINNT >= 0x0600) && !defined(LVTILEINFO_V5_SIZE) + +#if defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN) && !defined(MCHITTESTINFO_V1_SIZE) + #define MCHITTESTINFO_V1_SIZE _SIZEOF_STRUCT(MCHITTESTINFO, st) +#endif // defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN) && !defined(MCHITTESTINFO_V1_SIZE) + +#if !defined(_WIN32_WCE) && (WINVER >= 0x0600) && !defined(NONCLIENTMETRICS_V1_SIZE) + #define NONCLIENTMETRICS_V1_SIZE _SIZEOF_STRUCT(NONCLIENTMETRICS, lfMessageFont) +#endif // !defined(_WIN32_WCE) && (WINVER >= 0x0600) && !defined(NONCLIENTMETRICS_V1_SIZE) + +#endif // !_WTL_NO_RUNTIME_STRUCT_SIZE + +namespace RunTimeHelper +{ +#ifndef _WIN32_WCE + inline bool IsCommCtrl6() + { + DWORD dwMajor = 0, dwMinor = 0; + HRESULT hRet = ATL::AtlGetCommCtrlVersion(&dwMajor, &dwMinor); + return (SUCCEEDED(hRet) && (dwMajor >= 6)); + } + + inline bool IsVista() + { + OSVERSIONINFO ovi = { sizeof(OSVERSIONINFO) }; + BOOL bRet = ::GetVersionEx(&ovi); + return ((bRet != FALSE) && (ovi.dwMajorVersion >= 6)); + } +#endif // !_WIN32_WCE + + inline int SizeOf_REBARBANDINFO() + { + int nSize = sizeof(REBARBANDINFO); +#if !defined(_WTL_NO_RUNTIME_STRUCT_SIZE) && (_WIN32_WINNT >= 0x0600) + if(!(IsVista() && IsCommCtrl6())) + nSize = REBARBANDINFO_V6_SIZE; +#endif // !defined(_WTL_NO_RUNTIME_STRUCT_SIZE) && (_WIN32_WINNT >= 0x0600) + return nSize; + } + +#if (_WIN32_WINNT >= 0x501) + inline int SizeOf_LVGROUP() + { + int nSize = sizeof(LVGROUP); +#if !defined(_WTL_NO_RUNTIME_STRUCT_SIZE) && (_WIN32_WINNT >= 0x0600) + if(!IsVista()) + nSize = LVGROUP_V5_SIZE; +#endif // !defined(_WTL_NO_RUNTIME_STRUCT_SIZE) && (_WIN32_WINNT >= 0x0600) + return nSize; + } + + inline int SizeOf_LVTILEINFO() + { + int nSize = sizeof(LVTILEINFO); +#if !defined(_WTL_NO_RUNTIME_STRUCT_SIZE) && (_WIN32_WINNT >= 0x0600) + if(!IsVista()) + nSize = LVTILEINFO_V5_SIZE; +#endif // !defined(_WTL_NO_RUNTIME_STRUCT_SIZE) && (_WIN32_WINNT >= 0x0600) + return nSize; + } +#endif // (_WIN32_WINNT >= 0x501) + + inline int SizeOf_MCHITTESTINFO() + { + int nSize = sizeof(MCHITTESTINFO); +#if !defined(_WTL_NO_RUNTIME_STRUCT_SIZE) && defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN) + if(!(IsVista() && IsCommCtrl6())) + nSize = MCHITTESTINFO_V1_SIZE; +#endif // !defined(_WTL_NO_RUNTIME_STRUCT_SIZE) && defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN) + return nSize; + } + +#ifndef _WIN32_WCE + inline int SizeOf_NONCLIENTMETRICS() + { + int nSize = sizeof(NONCLIENTMETRICS); +#if !defined(_WTL_NO_RUNTIME_STRUCT_SIZE) && (WINVER >= 0x0600) + if(!IsVista()) + nSize = NONCLIENTMETRICS_V1_SIZE; +#endif // !defined(_WTL_NO_RUNTIME_STRUCT_SIZE) && (WINVER >= 0x0600) + return nSize; + } +#endif // !_WIN32_WCE +}; + + +/////////////////////////////////////////////////////////////////////////////// +// ModuleHelper - helper functions for ATL3 and ATL7 module classes + +namespace ModuleHelper +{ + inline HINSTANCE GetModuleInstance() + { +#if (_ATL_VER >= 0x0700) + return ATL::_AtlBaseModule.GetModuleInstance(); +#else // !(_ATL_VER >= 0x0700) + return ATL::_pModule->GetModuleInstance(); +#endif // !(_ATL_VER >= 0x0700) + } + + inline HINSTANCE GetResourceInstance() + { +#if (_ATL_VER >= 0x0700) + return ATL::_AtlBaseModule.GetResourceInstance(); +#else // !(_ATL_VER >= 0x0700) + return ATL::_pModule->GetResourceInstance(); +#endif // !(_ATL_VER >= 0x0700) + } + + inline void AddCreateWndData(ATL::_AtlCreateWndData* pData, void* pObject) + { +#if (_ATL_VER >= 0x0700) + ATL::_AtlWinModule.AddCreateWndData(pData, pObject); +#else // !(_ATL_VER >= 0x0700) + ATL::_pModule->AddCreateWndData(pData, pObject); +#endif // !(_ATL_VER >= 0x0700) + } + + inline void* ExtractCreateWndData() + { +#if (_ATL_VER >= 0x0700) + return ATL::_AtlWinModule.ExtractCreateWndData(); +#else // !(_ATL_VER >= 0x0700) + return ATL::_pModule->ExtractCreateWndData(); +#endif // !(_ATL_VER >= 0x0700) + } +}; + + +/////////////////////////////////////////////////////////////////////////////// +// SecureHelper - helper functions for VS2005 secure CRT + +namespace SecureHelper +{ + inline void strcpyA_x(char* lpstrDest, size_t cchDest, const char* lpstrSrc) + { +#if _SECURE_ATL + ATL::Checked::strcpy_s(lpstrDest, cchDest, lpstrSrc); +#else + if(cchDest > (size_t)lstrlenA(lpstrSrc)) + ATLVERIFY(lstrcpyA(lpstrDest, lpstrSrc) != NULL); + else + ATLASSERT(FALSE); +#endif + } + + inline void strcpyW_x(wchar_t* lpstrDest, size_t cchDest, const wchar_t* lpstrSrc) + { +#if _SECURE_ATL + ATL::Checked::wcscpy_s(lpstrDest, cchDest, lpstrSrc); +#else + if(cchDest > (size_t)lstrlenW(lpstrSrc)) + ATLVERIFY(lstrcpyW(lpstrDest, lpstrSrc) != NULL); + else + ATLASSERT(FALSE); +#endif + } + + inline void strcpy_x(LPTSTR lpstrDest, size_t cchDest, LPCTSTR lpstrSrc) + { +#ifdef _UNICODE + strcpyW_x(lpstrDest, cchDest, lpstrSrc); +#else + strcpyA_x(lpstrDest, cchDest, lpstrSrc); +#endif + } + + inline errno_t strncpyA_x(char* lpstrDest, size_t cchDest, const char* lpstrSrc, size_t cchCount) + { +#if _SECURE_ATL + return ATL::Checked::strncpy_s(lpstrDest, cchDest, lpstrSrc, cchCount); +#else + errno_t nRet = 0; + if(lpstrDest == NULL || cchDest == 0 || lpstrSrc == NULL) + { + nRet = EINVAL; + } + else if(cchCount == _TRUNCATE) + { + cchCount = min(cchDest - 1, size_t(lstrlenA(lpstrSrc))); + nRet = STRUNCATE; + } + else if(cchDest <= cchCount) + { + lpstrDest[0] = 0; + nRet = EINVAL; + } + if(nRet == 0 || nRet == STRUNCATE) + nRet = (lstrcpynA(lpstrDest, lpstrSrc, (int)cchCount + 1) != NULL) ? nRet : EINVAL; + ATLASSERT(nRet == 0 || nRet == STRUNCATE); + return nRet; +#endif + } + + inline errno_t strncpyW_x(wchar_t* lpstrDest, size_t cchDest, const wchar_t* lpstrSrc, size_t cchCount) + { +#if _SECURE_ATL + return ATL::Checked::wcsncpy_s(lpstrDest, cchDest, lpstrSrc, cchCount); +#else + errno_t nRet = 0; + if(lpstrDest == NULL || cchDest == 0 || lpstrSrc == NULL) + { + nRet = EINVAL; + } + else if(cchCount == _TRUNCATE) + { + cchCount = min(cchDest - 1, size_t(lstrlenW(lpstrSrc))); + nRet = STRUNCATE; + } + else if(cchDest <= cchCount) + { + lpstrDest[0] = 0; + nRet = EINVAL; + } + if(nRet == 0 || nRet == STRUNCATE) + nRet = (lstrcpynW(lpstrDest, lpstrSrc, (int)cchCount + 1) != NULL) ? nRet : EINVAL; + ATLASSERT(nRet == 0 || nRet == STRUNCATE); + return nRet; +#endif + } + + inline errno_t strncpy_x(LPTSTR lpstrDest, size_t cchDest, LPCTSTR lpstrSrc, size_t cchCount) + { +#ifdef _UNICODE + return strncpyW_x(lpstrDest, cchDest, lpstrSrc, cchCount); +#else + return strncpyA_x(lpstrDest, cchDest, lpstrSrc, cchCount); +#endif + } + + inline void strcatA_x(char* lpstrDest, size_t cchDest, const char* lpstrSrc) + { +#if _SECURE_ATL + ATL::Checked::strcat_s(lpstrDest, cchDest, lpstrSrc); +#else + if(cchDest > (size_t)lstrlenA(lpstrSrc)) + ATLVERIFY(lstrcatA(lpstrDest, lpstrSrc) != NULL); + else + ATLASSERT(FALSE); +#endif + } + + inline void strcatW_x(wchar_t* lpstrDest, size_t cchDest, const wchar_t* lpstrSrc) + { +#if _SECURE_ATL + ATL::Checked::wcscat_s(lpstrDest, cchDest, lpstrSrc); +#else + if(cchDest > (size_t)lstrlenW(lpstrSrc)) + ATLVERIFY(lstrcatW(lpstrDest, lpstrSrc) != NULL); + else + ATLASSERT(FALSE); +#endif + } + + inline void strcat_x(LPTSTR lpstrDest, size_t cchDest, LPCTSTR lpstrSrc) + { +#ifdef _UNICODE + strcatW_x(lpstrDest, cchDest, lpstrSrc); +#else + strcatA_x(lpstrDest, cchDest, lpstrSrc); +#endif + } + + inline void memcpy_x(void* pDest, size_t cbDest, const void* pSrc, size_t cbSrc) + { +#if _SECURE_ATL + ATL::Checked::memcpy_s(pDest, cbDest, pSrc, cbSrc); +#else + if(cbDest >= cbSrc) + memcpy(pDest, pSrc, cbSrc); + else + ATLASSERT(FALSE); +#endif + } + + inline void memmove_x(void* pDest, size_t cbDest, const void* pSrc, size_t cbSrc) + { +#if _SECURE_ATL + ATL::Checked::memmove_s(pDest, cbDest, pSrc, cbSrc); +#else + if(cbDest >= cbSrc) + memmove(pDest, pSrc, cbSrc); + else + ATLASSERT(FALSE); +#endif + } + + inline int vsprintf_x(LPTSTR lpstrBuff, size_t cchBuff, LPCTSTR lpstrFormat, va_list args) + { +#if _SECURE_ATL && !defined(_ATL_MIN_CRT) && !defined(_WIN32_WCE) + return _vstprintf_s(lpstrBuff, cchBuff, lpstrFormat, args); +#else + cchBuff; // Avoid unused argument warning + return _vstprintf(lpstrBuff, lpstrFormat, args); +#endif + } + + inline int wvsprintf_x(LPTSTR lpstrBuff, size_t cchBuff, LPCTSTR lpstrFormat, va_list args) + { +#if _SECURE_ATL && !defined(_ATL_MIN_CRT) && !defined(_WIN32_WCE) + return _vstprintf_s(lpstrBuff, cchBuff, lpstrFormat, args); +#else + cchBuff; // Avoid unused argument warning + return ::wvsprintf(lpstrBuff, lpstrFormat, args); +#endif + } + + inline int sprintf_x(LPTSTR lpstrBuff, size_t cchBuff, LPCTSTR lpstrFormat, ...) + { + va_list args; + va_start(args, lpstrFormat); + int nRes = vsprintf_x(lpstrBuff, cchBuff, lpstrFormat, args); + va_end(args); + return nRes; + } + + inline int wsprintf_x(LPTSTR lpstrBuff, size_t cchBuff, LPCTSTR lpstrFormat, ...) + { + va_list args; + va_start(args, lpstrFormat); + int nRes = wvsprintf_x(lpstrBuff, cchBuff, lpstrFormat, args); + va_end(args); + return nRes; + } +}; // namespace SecureHelper + + +/////////////////////////////////////////////////////////////////////////////// +// CMessageFilter - Interface for message filter support + +class CMessageFilter +{ +public: + virtual BOOL PreTranslateMessage(MSG* pMsg) = 0; +}; + + +/////////////////////////////////////////////////////////////////////////////// +// CIdleHandler - Interface for idle processing + +class CIdleHandler +{ +public: + virtual BOOL OnIdle() = 0; +}; + +#ifndef _ATL_NO_OLD_NAMES + // for compatilibility with old names only + typedef CIdleHandler CUpdateUIObject; + #define DoUpdate OnIdle +#endif // !_ATL_NO_OLD_NAMES + + +/////////////////////////////////////////////////////////////////////////////// +// CMessageLoop - message loop implementation + +class CMessageLoop +{ +public: + ATL::CSimpleArray m_aMsgFilter; + ATL::CSimpleArray m_aIdleHandler; + MSG m_msg; + +// Message filter operations + BOOL AddMessageFilter(CMessageFilter* pMessageFilter) + { + return m_aMsgFilter.Add(pMessageFilter); + } + + BOOL RemoveMessageFilter(CMessageFilter* pMessageFilter) + { + return m_aMsgFilter.Remove(pMessageFilter); + } + +// Idle handler operations + BOOL AddIdleHandler(CIdleHandler* pIdleHandler) + { + return m_aIdleHandler.Add(pIdleHandler); + } + + BOOL RemoveIdleHandler(CIdleHandler* pIdleHandler) + { + return m_aIdleHandler.Remove(pIdleHandler); + } + +#ifndef _ATL_NO_OLD_NAMES + // for compatilibility with old names only + BOOL AddUpdateUI(CIdleHandler* pIdleHandler) + { + ATLTRACE2(atlTraceUI, 0, _T("CUpdateUIObject and AddUpdateUI are deprecated. Please change your code to use CIdleHandler and OnIdle\n")); + return AddIdleHandler(pIdleHandler); + } + + BOOL RemoveUpdateUI(CIdleHandler* pIdleHandler) + { + ATLTRACE2(atlTraceUI, 0, _T("CUpdateUIObject and RemoveUpdateUI are deprecated. Please change your code to use CIdleHandler and OnIdle\n")); + return RemoveIdleHandler(pIdleHandler); + } +#endif // !_ATL_NO_OLD_NAMES + +// message loop + int Run() + { + BOOL bDoIdle = TRUE; + int nIdleCount = 0; + BOOL bRet; + + for(;;) + { + while(bDoIdle && !::PeekMessage(&m_msg, NULL, 0, 0, PM_NOREMOVE)) + { + if(!OnIdle(nIdleCount++)) + bDoIdle = FALSE; + } + + bRet = ::GetMessage(&m_msg, NULL, 0, 0); + + if(bRet == -1) + { + ATLTRACE2(atlTraceUI, 0, _T("::GetMessage returned -1 (error)\n")); + continue; // error, don't process + } + else if(!bRet) + { + ATLTRACE2(atlTraceUI, 0, _T("CMessageLoop::Run - exiting\n")); + break; // WM_QUIT, exit message loop + } + + if(!PreTranslateMessage(&m_msg)) + { + ::TranslateMessage(&m_msg); + ::DispatchMessage(&m_msg); + } + + if(IsIdleMessage(&m_msg)) + { + bDoIdle = TRUE; + nIdleCount = 0; + } + } + + return (int)m_msg.wParam; + } + + static BOOL IsIdleMessage(MSG* pMsg) + { + // These messages should NOT cause idle processing + switch(pMsg->message) + { + case WM_MOUSEMOVE: +#ifndef _WIN32_WCE + case WM_NCMOUSEMOVE: +#endif // !_WIN32_WCE + case WM_PAINT: + case 0x0118: // WM_SYSTIMER (caret blink) + return FALSE; + } + + return TRUE; + } + +// Overrideables + // Override to change message filtering + virtual BOOL PreTranslateMessage(MSG* pMsg) + { + // loop backwards + for(int i = m_aMsgFilter.GetSize() - 1; i >= 0; i--) + { + CMessageFilter* pMessageFilter = m_aMsgFilter[i]; + if(pMessageFilter != NULL && pMessageFilter->PreTranslateMessage(pMsg)) + return TRUE; + } + return FALSE; // not translated + } + + // override to change idle processing + virtual BOOL OnIdle(int /*nIdleCount*/) + { + for(int i = 0; i < m_aIdleHandler.GetSize(); i++) + { + CIdleHandler* pIdleHandler = m_aIdleHandler[i]; + if(pIdleHandler != NULL) + pIdleHandler->OnIdle(); + } + return FALSE; // don't continue + } +}; + + +/////////////////////////////////////////////////////////////////////////////// +// CStaticDataInitCriticalSectionLock and CWindowCreateCriticalSectionLock +// internal classes to manage critical sections for both ATL3 and ATL7 + +class CStaticDataInitCriticalSectionLock +{ +public: +#if (_ATL_VER >= 0x0700) + ATL::CComCritSecLock m_cslock; + + CStaticDataInitCriticalSectionLock() : m_cslock(ATL::_pAtlModule->m_csStaticDataInitAndTypeInfo, false) + { } +#endif // (_ATL_VER >= 0x0700) + + HRESULT Lock() + { +#if (_ATL_VER >= 0x0700) + return m_cslock.Lock(); +#else // !(_ATL_VER >= 0x0700) + ::EnterCriticalSection(&ATL::_pModule->m_csStaticDataInit); + return S_OK; +#endif // !(_ATL_VER >= 0x0700) + } + + void Unlock() + { +#if (_ATL_VER >= 0x0700) + m_cslock.Unlock(); +#else // !(_ATL_VER >= 0x0700) + ::LeaveCriticalSection(&ATL::_pModule->m_csStaticDataInit); +#endif // !(_ATL_VER >= 0x0700) + } +}; + + +class CWindowCreateCriticalSectionLock +{ +public: +#if (_ATL_VER >= 0x0700) + ATL::CComCritSecLock m_cslock; + + CWindowCreateCriticalSectionLock() : m_cslock(ATL::_AtlWinModule.m_csWindowCreate, false) + { } +#endif // (_ATL_VER >= 0x0700) + + HRESULT Lock() + { +#if (_ATL_VER >= 0x0700) + return m_cslock.Lock(); +#else // !(_ATL_VER >= 0x0700) + ::EnterCriticalSection(&ATL::_pModule->m_csWindowCreate); + return S_OK; +#endif // !(_ATL_VER >= 0x0700) + } + + void Unlock() + { +#if (_ATL_VER >= 0x0700) + m_cslock.Unlock(); +#else // !(_ATL_VER >= 0x0700) + ::LeaveCriticalSection(&ATL::_pModule->m_csWindowCreate); +#endif // !(_ATL_VER >= 0x0700) + } +}; + + +/////////////////////////////////////////////////////////////////////////////// +// CTempBuffer - helper class for stack allocations for ATL3 + +#ifndef _WTL_STACK_ALLOC_THRESHOLD + #define _WTL_STACK_ALLOC_THRESHOLD 512 +#endif + +#if (_ATL_VER >= 0x0700) + +using ATL::CTempBuffer; + +#else // !(_ATL_VER >= 0x0700) + +#ifndef SIZE_MAX + #ifdef _WIN64 + #define SIZE_MAX _UI64_MAX + #else + #define SIZE_MAX UINT_MAX + #endif +#endif + +#pragma warning(disable: 4284) // warning for operator -> + +template +class CTempBuffer +{ +public: + CTempBuffer() : m_p(NULL) + { + } + + CTempBuffer(size_t nElements) : m_p(NULL) + { + Allocate(nElements); + } + + ~CTempBuffer() + { + if(m_p != reinterpret_cast(m_abFixedBuffer)) + free(m_p); + } + + operator T*() const + { + return m_p; + } + + T* operator ->() const + { + ATLASSERT(m_p != NULL); + return m_p; + } + + T* Allocate(size_t nElements) + { + ATLASSERT(nElements <= (SIZE_MAX / sizeof(T))); + return AllocateBytes(nElements * sizeof(T)); + } + + T* AllocateBytes(size_t nBytes) + { + ATLASSERT(m_p == NULL); + if(nBytes > t_nFixedBytes) + m_p = static_cast(malloc(nBytes)); + else + m_p = reinterpret_cast(m_abFixedBuffer); + + return m_p; + } + +private: + T* m_p; + BYTE m_abFixedBuffer[t_nFixedBytes]; +}; + +#pragma warning(default: 4284) + +#endif // !(_ATL_VER >= 0x0700) + + +/////////////////////////////////////////////////////////////////////////////// +// CAppModule - module class for an application + +class CAppModule : public ATL::CComModule +{ +public: + DWORD m_dwMainThreadID; + ATL::CSimpleMap* m_pMsgLoopMap; + ATL::CSimpleArray* m_pSettingChangeNotify; + +// Overrides of CComModule::Init and Term + HRESULT Init(ATL::_ATL_OBJMAP_ENTRY* pObjMap, HINSTANCE hInstance, const GUID* pLibID = NULL) + { + HRESULT hRet = CComModule::Init(pObjMap, hInstance, pLibID); + if(FAILED(hRet)) + return hRet; + + m_dwMainThreadID = ::GetCurrentThreadId(); + typedef ATL::CSimpleMap _mapClass; + m_pMsgLoopMap = NULL; + ATLTRY(m_pMsgLoopMap = new _mapClass); + if(m_pMsgLoopMap == NULL) + return E_OUTOFMEMORY; + m_pSettingChangeNotify = NULL; + + return hRet; + } + + void Term() + { + TermSettingChangeNotify(); + delete m_pMsgLoopMap; + CComModule::Term(); + } + +// Message loop map methods + BOOL AddMessageLoop(CMessageLoop* pMsgLoop) + { + CStaticDataInitCriticalSectionLock lock; + if(FAILED(lock.Lock())) + { + ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CAppModule::AddMessageLoop.\n")); + ATLASSERT(FALSE); + return FALSE; + } + + ATLASSERT(pMsgLoop != NULL); + ATLASSERT(m_pMsgLoopMap->Lookup(::GetCurrentThreadId()) == NULL); // not in map yet + + BOOL bRet = m_pMsgLoopMap->Add(::GetCurrentThreadId(), pMsgLoop); + + lock.Unlock(); + + return bRet; + } + + BOOL RemoveMessageLoop() + { + CStaticDataInitCriticalSectionLock lock; + if(FAILED(lock.Lock())) + { + ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CAppModule::RemoveMessageLoop.\n")); + ATLASSERT(FALSE); + return FALSE; + } + + BOOL bRet = m_pMsgLoopMap->Remove(::GetCurrentThreadId()); + + lock.Unlock(); + + return bRet; + } + + CMessageLoop* GetMessageLoop(DWORD dwThreadID = ::GetCurrentThreadId()) const + { + CStaticDataInitCriticalSectionLock lock; + if(FAILED(lock.Lock())) + { + ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CAppModule::GetMessageLoop.\n")); + ATLASSERT(FALSE); + return NULL; + } + + CMessageLoop* pLoop = m_pMsgLoopMap->Lookup(dwThreadID); + + lock.Unlock(); + + return pLoop; + } + +// Setting change notify methods + // Note: Call this from the main thread for MSDI apps + BOOL InitSettingChangeNotify(DLGPROC pfnDlgProc = _SettingChangeDlgProc) + { + CStaticDataInitCriticalSectionLock lock; + if(FAILED(lock.Lock())) + { + ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CAppModule::InitSettingChangeNotify.\n")); + ATLASSERT(FALSE); + return FALSE; + } + + if(m_pSettingChangeNotify == NULL) + { + typedef ATL::CSimpleArray _notifyClass; + ATLTRY(m_pSettingChangeNotify = new _notifyClass); + ATLASSERT(m_pSettingChangeNotify != NULL); + } + + BOOL bRet = (m_pSettingChangeNotify != NULL); + if(bRet && m_pSettingChangeNotify->GetSize() == 0) + { + // init everything + _ATL_EMPTY_DLGTEMPLATE templ; + HWND hNtfWnd = ::CreateDialogIndirect(GetModuleInstance(), &templ, NULL, pfnDlgProc); + ATLASSERT(::IsWindow(hNtfWnd)); + if(::IsWindow(hNtfWnd)) + { +// need conditional code because types don't match in winuser.h +#ifdef _WIN64 + ::SetWindowLongPtr(hNtfWnd, GWLP_USERDATA, (LONG_PTR)this); +#else + ::SetWindowLongPtr(hNtfWnd, GWLP_USERDATA, PtrToLong(this)); +#endif + bRet = m_pSettingChangeNotify->Add(hNtfWnd); + } + else + { + bRet = FALSE; + } + } + + lock.Unlock(); + + return bRet; + } + + void TermSettingChangeNotify() + { + CStaticDataInitCriticalSectionLock lock; + if(FAILED(lock.Lock())) + { + ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CAppModule::TermSettingChangeNotify.\n")); + ATLASSERT(FALSE); + return; + } + + if(m_pSettingChangeNotify != NULL && m_pSettingChangeNotify->GetSize() > 0) + ::DestroyWindow((*m_pSettingChangeNotify)[0]); + delete m_pSettingChangeNotify; + m_pSettingChangeNotify = NULL; + + lock.Unlock(); + } + + BOOL AddSettingChangeNotify(HWND hWnd) + { + CStaticDataInitCriticalSectionLock lock; + if(FAILED(lock.Lock())) + { + ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CAppModule::AddSettingChangeNotify.\n")); + ATLASSERT(FALSE); + return FALSE; + } + + ATLASSERT(::IsWindow(hWnd)); + BOOL bRet = FALSE; + if(InitSettingChangeNotify() != FALSE) + bRet = m_pSettingChangeNotify->Add(hWnd); + + lock.Unlock(); + + return bRet; + } + + BOOL RemoveSettingChangeNotify(HWND hWnd) + { + CStaticDataInitCriticalSectionLock lock; + if(FAILED(lock.Lock())) + { + ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CAppModule::RemoveSettingChangeNotify.\n")); + ATLASSERT(FALSE); + return FALSE; + } + + BOOL bRet = FALSE; + if(m_pSettingChangeNotify != NULL) + bRet = m_pSettingChangeNotify->Remove(hWnd); + + lock.Unlock(); + + return bRet; + } + +// Implementation - setting change notify dialog template and dialog procedure + struct _ATL_EMPTY_DLGTEMPLATE : DLGTEMPLATE + { + _ATL_EMPTY_DLGTEMPLATE() + { + memset(this, 0, sizeof(_ATL_EMPTY_DLGTEMPLATE)); + style = WS_POPUP; + } + WORD wMenu, wClass, wTitle; + }; + +#ifdef _WIN64 + static INT_PTR CALLBACK _SettingChangeDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +#else + static BOOL CALLBACK _SettingChangeDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +#endif + { + if(uMsg == WM_SETTINGCHANGE) + { +// need conditional code because types don't match in winuser.h +#ifdef _WIN64 + CAppModule* pModule = (CAppModule*)::GetWindowLongPtr(hWnd, GWLP_USERDATA); +#else + CAppModule* pModule = (CAppModule*)LongToPtr(::GetWindowLongPtr(hWnd, GWLP_USERDATA)); +#endif + ATLASSERT(pModule != NULL); + ATLASSERT(pModule->m_pSettingChangeNotify != NULL); + const UINT uTimeout = 1500; // ms + for(int i = 1; i < pModule->m_pSettingChangeNotify->GetSize(); i++) + { +#if !defined(_WIN32_WCE) + ::SendMessageTimeout((*pModule->m_pSettingChangeNotify)[i], uMsg, wParam, lParam, SMTO_ABORTIFHUNG, uTimeout, NULL); +#elif(_WIN32_WCE >= 400) // CE specific + ::SendMessageTimeout((*pModule->m_pSettingChangeNotify)[i], uMsg, wParam, lParam, SMTO_NORMAL, uTimeout, NULL); +#else // _WIN32_WCE < 400 specific + uTimeout; + ::SendMessage((*pModule->m_pSettingChangeNotify)[i], uMsg, wParam, lParam); +#endif + } + return TRUE; + } + return FALSE; + } +}; + + +/////////////////////////////////////////////////////////////////////////////// +// CServerAppModule - module class for a COM server application + +class CServerAppModule : public CAppModule +{ +public: + HANDLE m_hEventShutdown; + bool m_bActivity; + DWORD m_dwTimeOut; + DWORD m_dwPause; + +// Override of CAppModule::Init + HRESULT Init(ATL::_ATL_OBJMAP_ENTRY* pObjMap, HINSTANCE hInstance, const GUID* pLibID = NULL) + { + m_dwTimeOut = 5000; + m_dwPause = 1000; + return CAppModule::Init(pObjMap, hInstance, pLibID); + } + + void Term() + { + if(m_hEventShutdown != NULL && ::CloseHandle(m_hEventShutdown)) + m_hEventShutdown = NULL; + CAppModule::Term(); + } + +// COM Server methods + LONG Unlock() + { + LONG lRet = CComModule::Unlock(); + if(lRet == 0) + { + m_bActivity = true; + ::SetEvent(m_hEventShutdown); // tell monitor that we transitioned to zero + } + return lRet; + } + + void MonitorShutdown() + { + for(;;) + { + ::WaitForSingleObject(m_hEventShutdown, INFINITE); + DWORD dwWait = 0; + do + { + m_bActivity = false; + dwWait = ::WaitForSingleObject(m_hEventShutdown, m_dwTimeOut); + } + while(dwWait == WAIT_OBJECT_0); + // timed out + if(!m_bActivity && m_nLockCnt == 0) // if no activity let's really bail + { +#if ((_WIN32_WINNT >= 0x0400 ) || defined(_WIN32_DCOM)) && defined(_ATL_FREE_THREADED) && !defined(_WIN32_WCE) + ::CoSuspendClassObjects(); + if(!m_bActivity && m_nLockCnt == 0) +#endif + break; + } + } + // This handle should be valid now. If it isn't, + // check if _Module.Term was called first (it shouldn't) + if(::CloseHandle(m_hEventShutdown)) + m_hEventShutdown = NULL; + ::PostThreadMessage(m_dwMainThreadID, WM_QUIT, 0, 0); + } + + bool StartMonitor() + { + m_hEventShutdown = ::CreateEvent(NULL, false, false, NULL); + if(m_hEventShutdown == NULL) + return false; + DWORD dwThreadID = 0; +#if !defined(_ATL_MIN_CRT) && defined(_MT) && !defined(_WIN32_WCE) + HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, (UINT (WINAPI*)(void*))MonitorProc, this, 0, (UINT*)&dwThreadID); +#else + HANDLE hThread = ::CreateThread(NULL, 0, MonitorProc, this, 0, &dwThreadID); +#endif + bool bRet = (hThread != NULL); + if(bRet) + ::CloseHandle(hThread); + return bRet; + } + + static DWORD WINAPI MonitorProc(void* pv) + { + CServerAppModule* p = (CServerAppModule*)pv; + p->MonitorShutdown(); + return 0; + } + +#if (_ATL_VER < 0x0700) + // search for an occurence of string p2 in string p1 + static LPCTSTR FindOneOf(LPCTSTR p1, LPCTSTR p2) + { + while(p1 != NULL && *p1 != NULL) + { + LPCTSTR p = p2; + while(p != NULL && *p != NULL) + { + if(*p1 == *p) + return ::CharNext(p1); + p = ::CharNext(p); + } + p1 = ::CharNext(p1); + } + return NULL; + } +#endif // (_ATL_VER < 0x0700) +}; + + +/////////////////////////////////////////////////////////////////////////////// +// CString forward reference (enables CString use in atluser.h and atlgdi.h) + +#if defined(_WTL_FORWARD_DECLARE_CSTRING) && !defined(_WTL_USE_CSTRING) + #define _WTL_USE_CSTRING +#endif // defined(_WTL_FORWARD_DECLARE_CSTRING) && !defined(_WTL_USE_CSTRING) + +#ifdef _WTL_USE_CSTRING + class CString; // forward declaration (include atlmisc.h for the whole class) +#endif // _WTL_USE_CSTRING + +// CString namespace +#ifndef _CSTRING_NS + #ifdef __ATLSTR_H__ + #define _CSTRING_NS ATL + #else + #define _CSTRING_NS WTL + #endif +#endif // _CSTRING_NS + +// Type classes namespace +#ifndef _WTYPES_NS + #ifdef __ATLTYPES_H__ + #define _WTYPES_NS + #else + #define _WTYPES_NS WTL + #endif +#endif // _WTYPES_NS + +}; // namespace WTL + + +/////////////////////////////////////////////////////////////////////////////// +// General DLL version helpers (excluded from atlbase.h if _ATL_DLL is defined) + +#if (_ATL_VER < 0x0700) && defined(_ATL_DLL) && !defined(_WIN32_WCE) + +namespace ATL +{ + +inline HRESULT AtlGetDllVersion(HINSTANCE hInstDLL, DLLVERSIONINFO* pDllVersionInfo) +{ + ATLASSERT(pDllVersionInfo != NULL); + if(pDllVersionInfo == NULL) + return E_INVALIDARG; + + // We must get this function explicitly because some DLLs don't implement it. + DLLGETVERSIONPROC pfnDllGetVersion = (DLLGETVERSIONPROC)::GetProcAddress(hInstDLL, "DllGetVersion"); + if(pfnDllGetVersion == NULL) + return E_NOTIMPL; + + return (*pfnDllGetVersion)(pDllVersionInfo); +} + +inline HRESULT AtlGetDllVersion(LPCTSTR lpstrDllName, DLLVERSIONINFO* pDllVersionInfo) +{ + HINSTANCE hInstDLL = ::LoadLibrary(lpstrDllName); + if(hInstDLL == NULL) + return E_FAIL; + HRESULT hRet = AtlGetDllVersion(hInstDLL, pDllVersionInfo); + ::FreeLibrary(hInstDLL); + return hRet; +} + +// Common Control Versions: +// Win95/WinNT 4.0 maj=4 min=00 +// IE 3.x maj=4 min=70 +// IE 4.0 maj=4 min=71 +inline HRESULT AtlGetCommCtrlVersion(LPDWORD pdwMajor, LPDWORD pdwMinor) +{ + ATLASSERT(pdwMajor != NULL && pdwMinor != NULL); + if(pdwMajor == NULL || pdwMinor == NULL) + return E_INVALIDARG; + + DLLVERSIONINFO dvi; + ::ZeroMemory(&dvi, sizeof(dvi)); + dvi.cbSize = sizeof(dvi); + HRESULT hRet = AtlGetDllVersion(_T("comctl32.dll"), &dvi); + + if(SUCCEEDED(hRet)) + { + *pdwMajor = dvi.dwMajorVersion; + *pdwMinor = dvi.dwMinorVersion; + } + else if(hRet == E_NOTIMPL) + { + // If DllGetVersion is not there, then the DLL is a version + // previous to the one shipped with IE 3.x + *pdwMajor = 4; + *pdwMinor = 0; + hRet = S_OK; + } + + return hRet; +} + +// Shell Versions: +// Win95/WinNT 4.0 maj=4 min=00 +// IE 3.x, IE 4.0 without Web Integrated Desktop maj=4 min=00 +// IE 4.0 with Web Integrated Desktop maj=4 min=71 +// IE 4.01 with Web Integrated Desktop maj=4 min=72 +inline HRESULT AtlGetShellVersion(LPDWORD pdwMajor, LPDWORD pdwMinor) +{ + ATLASSERT(pdwMajor != NULL && pdwMinor != NULL); + if(pdwMajor == NULL || pdwMinor == NULL) + return E_INVALIDARG; + + DLLVERSIONINFO dvi; + ::ZeroMemory(&dvi, sizeof(dvi)); + dvi.cbSize = sizeof(dvi); + HRESULT hRet = AtlGetDllVersion(_T("shell32.dll"), &dvi); + + if(SUCCEEDED(hRet)) + { + *pdwMajor = dvi.dwMajorVersion; + *pdwMinor = dvi.dwMinorVersion; + } + else if(hRet == E_NOTIMPL) + { + // If DllGetVersion is not there, then the DLL is a version + // previous to the one shipped with IE 4.x + *pdwMajor = 4; + *pdwMinor = 0; + hRet = S_OK; + } + + return hRet; +} + +}; // namespace ATL + +#endif // (_ATL_VER < 0x0700) && defined(_ATL_DLL) && !defined(_WIN32_WCE) + + +// These are always included +#include "atlwinx.h" +#include "atluser.h" +#include "atlgdi.h" + +#ifndef _WTL_NO_AUTOMATIC_NAMESPACE +using namespace WTL; +#endif // !_WTL_NO_AUTOMATIC_NAMESPACE + +#endif // __ATLAPP_H__ diff --git a/Externals/WTL80/atlcrack.h b/Externals/WTL80/atlcrack.h new file mode 100644 index 0000000000..f92b35ad21 --- /dev/null +++ b/Externals/WTL80/atlcrack.h @@ -0,0 +1,2380 @@ +// Windows Template Library - WTL version 8.0 +// Copyright (C) Microsoft Corporation. All rights reserved. +// +// This file is a part of the Windows Template Library. +// The use and distribution terms for this software are covered by the +// Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php) +// which can be found in the file CPL.TXT at the root of this distribution. +// By using this software in any fashion, you are agreeing to be bound by +// the terms of this license. You must not remove this notice, or +// any other, from this software. + +#ifndef __ATLCRACK_H__ +#define __ATLCRACK_H__ + +#pragma once + + +/////////////////////////////////////////////////////////////////////////////// +// Message map macro for cracked handlers + +// Note about message maps with cracked handlers: +// For ATL 3.0, a message map using cracked handlers MUST use BEGIN_MSG_MAP_EX. +// For ATL 7.0 or higher, you can use BEGIN_MSG_MAP for CWindowImpl/CDialogImpl derived classes, +// but must use BEGIN_MSG_MAP_EX for classes that don't derive from CWindowImpl/CDialogImpl. + +#define BEGIN_MSG_MAP_EX(theClass) \ +public: \ + BOOL m_bMsgHandled; \ + /* "handled" management for cracked handlers */ \ + BOOL IsMsgHandled() const \ + { \ + return m_bMsgHandled; \ + } \ + void SetMsgHandled(BOOL bHandled) \ + { \ + m_bMsgHandled = bHandled; \ + } \ + BOOL ProcessWindowMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT& lResult, DWORD dwMsgMapID = 0) \ + { \ + BOOL bOldMsgHandled = m_bMsgHandled; \ + BOOL bRet = _ProcessWindowMessage(hWnd, uMsg, wParam, lParam, lResult, dwMsgMapID); \ + m_bMsgHandled = bOldMsgHandled; \ + return bRet; \ + } \ + BOOL _ProcessWindowMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT& lResult, DWORD dwMsgMapID) \ + { \ + BOOL bHandled = TRUE; \ + hWnd; \ + uMsg; \ + wParam; \ + lParam; \ + lResult; \ + bHandled; \ + switch(dwMsgMapID) \ + { \ + case 0: + + +/////////////////////////////////////////////////////////////////////////////// +// Standard Windows message macros + +// int OnCreate(LPCREATESTRUCT lpCreateStruct) +#define MSG_WM_CREATE(func) \ + if (uMsg == WM_CREATE) \ + { \ + SetMsgHandled(TRUE); \ + lResult = (LRESULT)func((LPCREATESTRUCT)lParam); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// BOOL OnInitDialog(CWindow wndFocus, LPARAM lInitParam) +#define MSG_WM_INITDIALOG(func) \ + if (uMsg == WM_INITDIALOG) \ + { \ + SetMsgHandled(TRUE); \ + lResult = (LRESULT)func((HWND)wParam, lParam); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// BOOL OnCopyData(CWindow wnd, PCOPYDATASTRUCT pCopyDataStruct) +#define MSG_WM_COPYDATA(func) \ + if (uMsg == WM_COPYDATA) \ + { \ + SetMsgHandled(TRUE); \ + lResult = (LRESULT)func((HWND)wParam, (PCOPYDATASTRUCT)lParam); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnDestroy() +#define MSG_WM_DESTROY(func) \ + if (uMsg == WM_DESTROY) \ + { \ + SetMsgHandled(TRUE); \ + func(); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnMove(CPoint ptPos) +#define MSG_WM_MOVE(func) \ + if (uMsg == WM_MOVE) \ + { \ + SetMsgHandled(TRUE); \ + func(_WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnSize(UINT nType, CSize size) +#define MSG_WM_SIZE(func) \ + if (uMsg == WM_SIZE) \ + { \ + SetMsgHandled(TRUE); \ + func((UINT)wParam, _WTYPES_NS::CSize(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnActivate(UINT nState, BOOL bMinimized, CWindow wndOther) +#define MSG_WM_ACTIVATE(func) \ + if (uMsg == WM_ACTIVATE) \ + { \ + SetMsgHandled(TRUE); \ + func((UINT)LOWORD(wParam), (BOOL)HIWORD(wParam), (HWND)lParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnSetFocus(CWindow wndOld) +#define MSG_WM_SETFOCUS(func) \ + if (uMsg == WM_SETFOCUS) \ + { \ + SetMsgHandled(TRUE); \ + func((HWND)wParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnKillFocus(CWindow wndFocus) +#define MSG_WM_KILLFOCUS(func) \ + if (uMsg == WM_KILLFOCUS) \ + { \ + SetMsgHandled(TRUE); \ + func((HWND)wParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnEnable(BOOL bEnable) +#define MSG_WM_ENABLE(func) \ + if (uMsg == WM_ENABLE) \ + { \ + SetMsgHandled(TRUE); \ + func((BOOL)wParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnPaint(CDCHandle dc) +#define MSG_WM_PAINT(func) \ + if (uMsg == WM_PAINT) \ + { \ + SetMsgHandled(TRUE); \ + func((HDC)wParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnClose() +#define MSG_WM_CLOSE(func) \ + if (uMsg == WM_CLOSE) \ + { \ + SetMsgHandled(TRUE); \ + func(); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// BOOL OnQueryEndSession(UINT nSource, UINT uLogOff) +#define MSG_WM_QUERYENDSESSION(func) \ + if (uMsg == WM_QUERYENDSESSION) \ + { \ + SetMsgHandled(TRUE); \ + lResult = (LRESULT)func((UINT)wParam, (UINT)lParam); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// BOOL OnQueryOpen() +#define MSG_WM_QUERYOPEN(func) \ + if (uMsg == WM_QUERYOPEN) \ + { \ + SetMsgHandled(TRUE); \ + lResult = (LRESULT)func(); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// BOOL OnEraseBkgnd(CDCHandle dc) +#define MSG_WM_ERASEBKGND(func) \ + if (uMsg == WM_ERASEBKGND) \ + { \ + SetMsgHandled(TRUE); \ + lResult = (LRESULT)func((HDC)wParam); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnSysColorChange() +#define MSG_WM_SYSCOLORCHANGE(func) \ + if (uMsg == WM_SYSCOLORCHANGE) \ + { \ + SetMsgHandled(TRUE); \ + func(); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnEndSession(BOOL bEnding, UINT uLogOff) +#define MSG_WM_ENDSESSION(func) \ + if (uMsg == WM_ENDSESSION) \ + { \ + SetMsgHandled(TRUE); \ + func((BOOL)wParam, (UINT)lParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnShowWindow(BOOL bShow, UINT nStatus) +#define MSG_WM_SHOWWINDOW(func) \ + if (uMsg == WM_SHOWWINDOW) \ + { \ + SetMsgHandled(TRUE); \ + func((BOOL)wParam, (int)lParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// HBRUSH OnCtlColorEdit(CDCHandle dc, CEdit edit) +#define MSG_WM_CTLCOLOREDIT(func) \ + if (uMsg == WM_CTLCOLOREDIT) \ + { \ + SetMsgHandled(TRUE); \ + lResult = (LRESULT)func((HDC)wParam, (HWND)lParam); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// HBRUSH OnCtlColorListBox(CDCHandle dc, CListBox listBox) +#define MSG_WM_CTLCOLORLISTBOX(func) \ + if (uMsg == WM_CTLCOLORLISTBOX) \ + { \ + SetMsgHandled(TRUE); \ + lResult = (LRESULT)func((HDC)wParam, (HWND)lParam); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// HBRUSH OnCtlColorBtn(CDCHandle dc, CButton button) +#define MSG_WM_CTLCOLORBTN(func) \ + if (uMsg == WM_CTLCOLORBTN) \ + { \ + SetMsgHandled(TRUE); \ + lResult = (LRESULT)func((HDC)wParam, (HWND)lParam); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// HBRUSH OnCtlColorDlg(CDCHandle dc, CWindow wnd) +#define MSG_WM_CTLCOLORDLG(func) \ + if (uMsg == WM_CTLCOLORDLG) \ + { \ + SetMsgHandled(TRUE); \ + lResult = (LRESULT)func((HDC)wParam, (HWND)lParam); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// HBRUSH OnCtlColorScrollBar(CDCHandle dc, CScrollBar scrollBar) +#define MSG_WM_CTLCOLORSCROLLBAR(func) \ + if (uMsg == WM_CTLCOLORSCROLLBAR) \ + { \ + SetMsgHandled(TRUE); \ + lResult = (LRESULT)func((HDC)wParam, (HWND)lParam); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// HBRUSH OnCtlColorStatic(CDCHandle dc, CStatic wndStatic) +#define MSG_WM_CTLCOLORSTATIC(func) \ + if (uMsg == WM_CTLCOLORSTATIC) \ + { \ + SetMsgHandled(TRUE); \ + lResult = (LRESULT)func((HDC)wParam, (HWND)lParam); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnSettingChange(UINT uFlags, LPCTSTR lpszSection) +#define MSG_WM_SETTINGCHANGE(func) \ + if (uMsg == WM_SETTINGCHANGE) \ + { \ + SetMsgHandled(TRUE); \ + func((UINT)wParam, (LPCTSTR)lParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnDevModeChange(LPCTSTR lpDeviceName) +#define MSG_WM_DEVMODECHANGE(func) \ + if (uMsg == WM_DEVMODECHANGE) \ + { \ + SetMsgHandled(TRUE); \ + func((LPCTSTR)lParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnActivateApp(BOOL bActive, DWORD dwThreadID) +#define MSG_WM_ACTIVATEAPP(func) \ + if (uMsg == WM_ACTIVATEAPP) \ + { \ + SetMsgHandled(TRUE); \ + func((BOOL)wParam, (DWORD)lParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnFontChange() +#define MSG_WM_FONTCHANGE(func) \ + if (uMsg == WM_FONTCHANGE) \ + { \ + SetMsgHandled(TRUE); \ + func(); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnTimeChange() +#define MSG_WM_TIMECHANGE(func) \ + if (uMsg == WM_TIMECHANGE) \ + { \ + SetMsgHandled(TRUE); \ + func(); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnCancelMode() +#define MSG_WM_CANCELMODE(func) \ + if (uMsg == WM_CANCELMODE) \ + { \ + SetMsgHandled(TRUE); \ + func(); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// BOOL OnSetCursor(CWindow wnd, UINT nHitTest, UINT message) +#define MSG_WM_SETCURSOR(func) \ + if (uMsg == WM_SETCURSOR) \ + { \ + SetMsgHandled(TRUE); \ + lResult = (LRESULT)func((HWND)wParam, (UINT)LOWORD(lParam), (UINT)HIWORD(lParam)); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// int OnMouseActivate(CWindow wndTopLevel, UINT nHitTest, UINT message) +#define MSG_WM_MOUSEACTIVATE(func) \ + if (uMsg == WM_MOUSEACTIVATE) \ + { \ + SetMsgHandled(TRUE); \ + lResult = (LRESULT)func((HWND)wParam, (UINT)LOWORD(lParam), (UINT)HIWORD(lParam)); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnChildActivate() +#define MSG_WM_CHILDACTIVATE(func) \ + if (uMsg == WM_CHILDACTIVATE) \ + { \ + SetMsgHandled(TRUE); \ + func(); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnGetMinMaxInfo(LPMINMAXINFO lpMMI) +#define MSG_WM_GETMINMAXINFO(func) \ + if (uMsg == WM_GETMINMAXINFO) \ + { \ + SetMsgHandled(TRUE); \ + func((LPMINMAXINFO)lParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnIconEraseBkgnd(CDCHandle dc) +#define MSG_WM_ICONERASEBKGND(func) \ + if (uMsg == WM_ICONERASEBKGND) \ + { \ + SetMsgHandled(TRUE); \ + func((HDC)wParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnSpoolerStatus(UINT nStatus, UINT nJobs) +#define MSG_WM_SPOOLERSTATUS(func) \ + if (uMsg == WM_SPOOLERSTATUS) \ + { \ + SetMsgHandled(TRUE); \ + func((UINT)wParam, (UINT)LOWORD(lParam)); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct) +#define MSG_WM_DRAWITEM(func) \ + if (uMsg == WM_DRAWITEM) \ + { \ + SetMsgHandled(TRUE); \ + func((UINT)wParam, (LPDRAWITEMSTRUCT)lParam); \ + lResult = TRUE; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct) +#define MSG_WM_MEASUREITEM(func) \ + if (uMsg == WM_MEASUREITEM) \ + { \ + SetMsgHandled(TRUE); \ + func((UINT)wParam, (LPMEASUREITEMSTRUCT)lParam); \ + lResult = TRUE; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnDeleteItem(int nIDCtl, LPDELETEITEMSTRUCT lpDeleteItemStruct) +#define MSG_WM_DELETEITEM(func) \ + if (uMsg == WM_DELETEITEM) \ + { \ + SetMsgHandled(TRUE); \ + func((UINT)wParam, (LPDELETEITEMSTRUCT)lParam); \ + lResult = TRUE; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +//int OnCharToItem(UINT nChar, UINT nIndex, CListBox listBox) +#define MSG_WM_CHARTOITEM(func) \ + if (uMsg == WM_CHARTOITEM) \ + { \ + SetMsgHandled(TRUE); \ + lResult = (LRESULT)func((UINT)LOWORD(wParam), (UINT)HIWORD(wParam), (HWND)lParam); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// int OnVKeyToItem(UINT nKey, UINT nIndex, CListBox listBox) +#define MSG_WM_VKEYTOITEM(func) \ + if (uMsg == WM_VKEYTOITEM) \ + { \ + SetMsgHandled(TRUE); \ + lResult = (LRESULT)func((UINT)LOWORD(wParam), (UINT)HIWORD(wParam), (HWND)lParam); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// HCURSOR OnQueryDragIcon() +#define MSG_WM_QUERYDRAGICON(func) \ + if (uMsg == WM_QUERYDRAGICON) \ + { \ + SetMsgHandled(TRUE); \ + lResult = (LRESULT)func(); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// int OnCompareItem(int nIDCtl, LPCOMPAREITEMSTRUCT lpCompareItemStruct) +#define MSG_WM_COMPAREITEM(func) \ + if (uMsg == WM_COMPAREITEM) \ + { \ + SetMsgHandled(TRUE); \ + lResult = (LRESULT)func((UINT)wParam, (LPCOMPAREITEMSTRUCT)lParam); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnCompacting(UINT nCpuTime) +#define MSG_WM_COMPACTING(func) \ + if (uMsg == WM_COMPACTING) \ + { \ + SetMsgHandled(TRUE); \ + func((UINT)wParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// BOOL OnNcCreate(LPCREATESTRUCT lpCreateStruct) +#define MSG_WM_NCCREATE(func) \ + if (uMsg == WM_NCCREATE) \ + { \ + SetMsgHandled(TRUE); \ + lResult = (LRESULT)func((LPCREATESTRUCT)lParam); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnNcDestroy() +#define MSG_WM_NCDESTROY(func) \ + if (uMsg == WM_NCDESTROY) \ + { \ + SetMsgHandled(TRUE); \ + func(); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// LRESULT OnNcCalcSize(BOOL bCalcValidRects, LPARAM lParam) +#define MSG_WM_NCCALCSIZE(func) \ + if (uMsg == WM_NCCALCSIZE) \ + { \ + SetMsgHandled(TRUE); \ + lResult = func((BOOL)wParam, lParam); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// UINT OnNcHitTest(CPoint point) +#define MSG_WM_NCHITTEST(func) \ + if (uMsg == WM_NCHITTEST) \ + { \ + SetMsgHandled(TRUE); \ + lResult = (LRESULT)func(_WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnNcPaint(CRgn rgn) +#define MSG_WM_NCPAINT(func) \ + if (uMsg == WM_NCPAINT) \ + { \ + SetMsgHandled(TRUE); \ + func((HRGN)wParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// BOOL OnNcActivate(BOOL bActive) +#define MSG_WM_NCACTIVATE(func) \ + if (uMsg == WM_NCACTIVATE) \ + { \ + SetMsgHandled(TRUE); \ + lResult = (LRESULT)func((BOOL)wParam); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// UINT OnGetDlgCode(LPMSG lpMsg) +#define MSG_WM_GETDLGCODE(func) \ + if (uMsg == WM_GETDLGCODE) \ + { \ + SetMsgHandled(TRUE); \ + lResult = (LRESULT)func((LPMSG)lParam); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnNcMouseMove(UINT nHitTest, CPoint point) +#define MSG_WM_NCMOUSEMOVE(func) \ + if (uMsg == WM_NCMOUSEMOVE) \ + { \ + SetMsgHandled(TRUE); \ + func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnNcLButtonDown(UINT nHitTest, CPoint point) +#define MSG_WM_NCLBUTTONDOWN(func) \ + if (uMsg == WM_NCLBUTTONDOWN) \ + { \ + SetMsgHandled(TRUE); \ + func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnNcLButtonUp(UINT nHitTest, CPoint point) +#define MSG_WM_NCLBUTTONUP(func) \ + if (uMsg == WM_NCLBUTTONUP) \ + { \ + SetMsgHandled(TRUE); \ + func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnNcLButtonDblClk(UINT nHitTest, CPoint point) +#define MSG_WM_NCLBUTTONDBLCLK(func) \ + if (uMsg == WM_NCLBUTTONDBLCLK) \ + { \ + SetMsgHandled(TRUE); \ + func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnNcRButtonDown(UINT nHitTest, CPoint point) +#define MSG_WM_NCRBUTTONDOWN(func) \ + if (uMsg == WM_NCRBUTTONDOWN) \ + { \ + SetMsgHandled(TRUE); \ + func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnNcRButtonUp(UINT nHitTest, CPoint point) +#define MSG_WM_NCRBUTTONUP(func) \ + if (uMsg == WM_NCRBUTTONUP) \ + { \ + SetMsgHandled(TRUE); \ + func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnNcRButtonDblClk(UINT nHitTest, CPoint point) +#define MSG_WM_NCRBUTTONDBLCLK(func) \ + if (uMsg == WM_NCRBUTTONDBLCLK) \ + { \ + SetMsgHandled(TRUE); \ + func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnNcMButtonDown(UINT nHitTest, CPoint point) +#define MSG_WM_NCMBUTTONDOWN(func) \ + if (uMsg == WM_NCMBUTTONDOWN) \ + { \ + SetMsgHandled(TRUE); \ + func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnNcMButtonUp(UINT nHitTest, CPoint point) +#define MSG_WM_NCMBUTTONUP(func) \ + if (uMsg == WM_NCMBUTTONUP) \ + { \ + SetMsgHandled(TRUE); \ + func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnNcMButtonDblClk(UINT nHitTest, CPoint point) +#define MSG_WM_NCMBUTTONDBLCLK(func) \ + if (uMsg == WM_NCMBUTTONDBLCLK) \ + { \ + SetMsgHandled(TRUE); \ + func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) +#define MSG_WM_KEYDOWN(func) \ + if (uMsg == WM_KEYDOWN) \ + { \ + SetMsgHandled(TRUE); \ + func((TCHAR)wParam, (UINT)lParam & 0xFFFF, (UINT)((lParam & 0xFFFF0000) >> 16)); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags) +#define MSG_WM_KEYUP(func) \ + if (uMsg == WM_KEYUP) \ + { \ + SetMsgHandled(TRUE); \ + func((TCHAR)wParam, (UINT)lParam & 0xFFFF, (UINT)((lParam & 0xFFFF0000) >> 16)); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) +#define MSG_WM_CHAR(func) \ + if (uMsg == WM_CHAR) \ + { \ + SetMsgHandled(TRUE); \ + func((TCHAR)wParam, (UINT)lParam & 0xFFFF, (UINT)((lParam & 0xFFFF0000) >> 16)); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnDeadChar(UINT nChar, UINT nRepCnt, UINT nFlags) +#define MSG_WM_DEADCHAR(func) \ + if (uMsg == WM_DEADCHAR) \ + { \ + SetMsgHandled(TRUE); \ + func((TCHAR)wParam, (UINT)lParam & 0xFFFF, (UINT)((lParam & 0xFFFF0000) >> 16)); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnSysKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) +#define MSG_WM_SYSKEYDOWN(func) \ + if (uMsg == WM_SYSKEYDOWN) \ + { \ + SetMsgHandled(TRUE); \ + func((TCHAR)wParam, (UINT)lParam & 0xFFFF, (UINT)((lParam & 0xFFFF0000) >> 16)); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnSysKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags) +#define MSG_WM_SYSKEYUP(func) \ + if (uMsg == WM_SYSKEYUP) \ + { \ + SetMsgHandled(TRUE); \ + func((TCHAR)wParam, (UINT)lParam & 0xFFFF, (UINT)((lParam & 0xFFFF0000) >> 16)); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnSysChar(UINT nChar, UINT nRepCnt, UINT nFlags) +#define MSG_WM_SYSCHAR(func) \ + if (uMsg == WM_SYSCHAR) \ + { \ + SetMsgHandled(TRUE); \ + func((TCHAR)wParam, (UINT)lParam & 0xFFFF, (UINT)((lParam & 0xFFFF0000) >> 16)); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnSysDeadChar(UINT nChar, UINT nRepCnt, UINT nFlags) +#define MSG_WM_SYSDEADCHAR(func) \ + if (uMsg == WM_SYSDEADCHAR) \ + { \ + SetMsgHandled(TRUE); \ + func((TCHAR)wParam, (UINT)lParam & 0xFFFF, (UINT)((lParam & 0xFFFF0000) >> 16)); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnSysCommand(UINT nID, LPARAM lParam) +#define MSG_WM_SYSCOMMAND(func) \ + if (uMsg == WM_SYSCOMMAND) \ + { \ + SetMsgHandled(TRUE); \ + func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnTCard(UINT idAction, DWORD dwActionData) +#define MSG_WM_TCARD(func) \ + if (uMsg == WM_TCARD) \ + { \ + SetMsgHandled(TRUE); \ + func((UINT)wParam, (DWORD)lParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnTimer(UINT_PTR nIDEvent) +#define MSG_WM_TIMER(func) \ + if (uMsg == WM_TIMER) \ + { \ + SetMsgHandled(TRUE); \ + func((UINT_PTR)wParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar pScrollBar) +#define MSG_WM_HSCROLL(func) \ + if (uMsg == WM_HSCROLL) \ + { \ + SetMsgHandled(TRUE); \ + func((int)LOWORD(wParam), (short)HIWORD(wParam), (HWND)lParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar pScrollBar) +#define MSG_WM_VSCROLL(func) \ + if (uMsg == WM_VSCROLL) \ + { \ + SetMsgHandled(TRUE); \ + func((int)LOWORD(wParam), (short)HIWORD(wParam), (HWND)lParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnInitMenu(CMenu menu) +#define MSG_WM_INITMENU(func) \ + if (uMsg == WM_INITMENU) \ + { \ + SetMsgHandled(TRUE); \ + func((HMENU)wParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnInitMenuPopup(CMenu menuPopup, UINT nIndex, BOOL bSysMenu) +#define MSG_WM_INITMENUPOPUP(func) \ + if (uMsg == WM_INITMENUPOPUP) \ + { \ + SetMsgHandled(TRUE); \ + func((HMENU)wParam, (UINT)LOWORD(lParam), (BOOL)HIWORD(lParam)); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnMenuSelect(UINT nItemID, UINT nFlags, CMenu menu) +#define MSG_WM_MENUSELECT(func) \ + if (uMsg == WM_MENUSELECT) \ + { \ + SetMsgHandled(TRUE); \ + func((UINT)LOWORD(wParam), (UINT)HIWORD(wParam), (HMENU)lParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// LRESULT OnMenuChar(UINT nChar, UINT nFlags, CMenu menu) +#define MSG_WM_MENUCHAR(func) \ + if (uMsg == WM_MENUCHAR) \ + { \ + SetMsgHandled(TRUE); \ + lResult = func((TCHAR)LOWORD(wParam), (UINT)HIWORD(wParam), (HMENU)lParam); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// LRESULT OnNotify(int idCtrl, LPNMHDR pnmh) +#define MSG_WM_NOTIFY(func) \ + if (uMsg == WM_NOTIFY) \ + { \ + SetMsgHandled(TRUE); \ + lResult = func((int)wParam, (LPNMHDR)lParam); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnEnterIdle(UINT nWhy, CWindow wndWho) +#define MSG_WM_ENTERIDLE(func) \ + if (uMsg == WM_ENTERIDLE) \ + { \ + SetMsgHandled(TRUE); \ + func((UINT)wParam, (HWND)lParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnMouseMove(UINT nFlags, CPoint point) +#define MSG_WM_MOUSEMOVE(func) \ + if (uMsg == WM_MOUSEMOVE) \ + { \ + SetMsgHandled(TRUE); \ + func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt) +#define MSG_WM_MOUSEWHEEL(func) \ + if (uMsg == WM_MOUSEWHEEL) \ + { \ + SetMsgHandled(TRUE); \ + lResult = (LRESULT)func((UINT)LOWORD(wParam), (short)HIWORD(wParam), _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnLButtonDown(UINT nFlags, CPoint point) +#define MSG_WM_LBUTTONDOWN(func) \ + if (uMsg == WM_LBUTTONDOWN) \ + { \ + SetMsgHandled(TRUE); \ + func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnLButtonUp(UINT nFlags, CPoint point) +#define MSG_WM_LBUTTONUP(func) \ + if (uMsg == WM_LBUTTONUP) \ + { \ + SetMsgHandled(TRUE); \ + func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnLButtonDblClk(UINT nFlags, CPoint point) +#define MSG_WM_LBUTTONDBLCLK(func) \ + if (uMsg == WM_LBUTTONDBLCLK) \ + { \ + SetMsgHandled(TRUE); \ + func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnRButtonDown(UINT nFlags, CPoint point) +#define MSG_WM_RBUTTONDOWN(func) \ + if (uMsg == WM_RBUTTONDOWN) \ + { \ + SetMsgHandled(TRUE); \ + func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnRButtonUp(UINT nFlags, CPoint point) +#define MSG_WM_RBUTTONUP(func) \ + if (uMsg == WM_RBUTTONUP) \ + { \ + SetMsgHandled(TRUE); \ + func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnRButtonDblClk(UINT nFlags, CPoint point) +#define MSG_WM_RBUTTONDBLCLK(func) \ + if (uMsg == WM_RBUTTONDBLCLK) \ + { \ + SetMsgHandled(TRUE); \ + func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnMButtonDown(UINT nFlags, CPoint point) +#define MSG_WM_MBUTTONDOWN(func) \ + if (uMsg == WM_MBUTTONDOWN) \ + { \ + SetMsgHandled(TRUE); \ + func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnMButtonUp(UINT nFlags, CPoint point) +#define MSG_WM_MBUTTONUP(func) \ + if (uMsg == WM_MBUTTONUP) \ + { \ + SetMsgHandled(TRUE); \ + func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnMButtonDblClk(UINT nFlags, CPoint point) +#define MSG_WM_MBUTTONDBLCLK(func) \ + if (uMsg == WM_MBUTTONDBLCLK) \ + { \ + SetMsgHandled(TRUE); \ + func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnParentNotify(UINT message, UINT nChildID, LPARAM lParam) +#define MSG_WM_PARENTNOTIFY(func) \ + if (uMsg == WM_PARENTNOTIFY) \ + { \ + SetMsgHandled(TRUE); \ + func((UINT)LOWORD(wParam), (UINT)HIWORD(wParam), lParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnMDIActivate(CWindow wndActivate, CWindow wndDeactivate) +#define MSG_WM_MDIACTIVATE(func) \ + if (uMsg == WM_MDIACTIVATE) \ + { \ + SetMsgHandled(TRUE); \ + func((HWND)wParam, (HWND)lParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnRenderFormat(UINT nFormat) +#define MSG_WM_RENDERFORMAT(func) \ + if (uMsg == WM_RENDERFORMAT) \ + { \ + SetMsgHandled(TRUE); \ + func((UINT)wParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnRenderAllFormats() +#define MSG_WM_RENDERALLFORMATS(func) \ + if (uMsg == WM_RENDERALLFORMATS) \ + { \ + SetMsgHandled(TRUE); \ + func(); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnDestroyClipboard() +#define MSG_WM_DESTROYCLIPBOARD(func) \ + if (uMsg == WM_DESTROYCLIPBOARD) \ + { \ + SetMsgHandled(TRUE); \ + func(); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnDrawClipboard() +#define MSG_WM_DRAWCLIPBOARD(func) \ + if (uMsg == WM_DRAWCLIPBOARD) \ + { \ + SetMsgHandled(TRUE); \ + func(); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnPaintClipboard(CWindow wndViewer, const LPPAINTSTRUCT lpPaintStruct) +#define MSG_WM_PAINTCLIPBOARD(func) \ + if (uMsg == WM_PAINTCLIPBOARD) \ + { \ + SetMsgHandled(TRUE); \ + func((HWND)wParam, (const LPPAINTSTRUCT)::GlobalLock((HGLOBAL)lParam)); \ + ::GlobalUnlock((HGLOBAL)lParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnVScrollClipboard(CWindow wndViewer, UINT nSBCode, UINT nPos) +#define MSG_WM_VSCROLLCLIPBOARD(func) \ + if (uMsg == WM_VSCROLLCLIPBOARD) \ + { \ + SetMsgHandled(TRUE); \ + func((HWND)wParam, (UINT)LOWORD(lParam), (UINT)HIWORD(lParam)); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnContextMenu(CWindow wnd, CPoint point) +#define MSG_WM_CONTEXTMENU(func) \ + if (uMsg == WM_CONTEXTMENU) \ + { \ + SetMsgHandled(TRUE); \ + func((HWND)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnSizeClipboard(CWindow wndViewer, const LPRECT lpRect) +#define MSG_WM_SIZECLIPBOARD(func) \ + if (uMsg == WM_SIZECLIPBOARD) \ + { \ + SetMsgHandled(TRUE); \ + func((HWND)wParam, (const LPRECT)::GlobalLock((HGLOBAL)lParam)); \ + ::GlobalUnlock((HGLOBAL)lParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnAskCbFormatName(UINT nMaxCount, LPTSTR lpszString) +#define MSG_WM_ASKCBFORMATNAME(func) \ + if (uMsg == WM_ASKCBFORMATNAME) \ + { \ + SetMsgHandled(TRUE); \ + func((DWORD)wParam, (LPTSTR)lParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnChangeCbChain(CWindow wndRemove, CWindow wndAfter) +#define MSG_WM_CHANGECBCHAIN(func) \ + if (uMsg == WM_CHANGECBCHAIN) \ + { \ + SetMsgHandled(TRUE); \ + func((HWND)wParam, (HWND)lParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnHScrollClipboard(CWindow wndViewer, UINT nSBCode, UINT nPos) +#define MSG_WM_HSCROLLCLIPBOARD(func) \ + if (uMsg == WM_HSCROLLCLIPBOARD) \ + { \ + SetMsgHandled(TRUE); \ + func((HWND)wParam, (UINT)LOWORD(lParam), (UINT)HIWORD(lParam)); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// BOOL OnQueryNewPalette() +#define MSG_WM_QUERYNEWPALETTE(func) \ + if (uMsg == WM_QUERYNEWPALETTE) \ + { \ + SetMsgHandled(TRUE); \ + lResult = (LRESULT)func(); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnPaletteChanged(CWindow wndFocus) +#define MSG_WM_PALETTECHANGED(func) \ + if (uMsg == WM_PALETTECHANGED) \ + { \ + SetMsgHandled(TRUE); \ + func((HWND)wParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnPaletteIsChanging(CWindow wndPalChg) +#define MSG_WM_PALETTEISCHANGING(func) \ + if (uMsg == WM_PALETTEISCHANGING) \ + { \ + SetMsgHandled(TRUE); \ + func((HWND)wParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnDropFiles(HDROP hDropInfo) +#define MSG_WM_DROPFILES(func) \ + if (uMsg == WM_DROPFILES) \ + { \ + SetMsgHandled(TRUE); \ + func((HDROP)wParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnWindowPosChanging(LPWINDOWPOS lpWndPos) +#define MSG_WM_WINDOWPOSCHANGING(func) \ + if (uMsg == WM_WINDOWPOSCHANGING) \ + { \ + SetMsgHandled(TRUE); \ + func((LPWINDOWPOS)lParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnWindowPosChanged(LPWINDOWPOS lpWndPos) +#define MSG_WM_WINDOWPOSCHANGED(func) \ + if (uMsg == WM_WINDOWPOSCHANGED) \ + { \ + SetMsgHandled(TRUE); \ + func((LPWINDOWPOS)lParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnExitMenuLoop(BOOL fIsTrackPopupMenu) +#define MSG_WM_EXITMENULOOP(func) \ + if (uMsg == WM_EXITMENULOOP) \ + { \ + SetMsgHandled(TRUE); \ + func((BOOL)wParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnEnterMenuLoop(BOOL fIsTrackPopupMenu) +#define MSG_WM_ENTERMENULOOP(func) \ + if (uMsg == WM_ENTERMENULOOP) \ + { \ + SetMsgHandled(TRUE); \ + func((BOOL)wParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnStyleChanged(int nStyleType, LPSTYLESTRUCT lpStyleStruct) +#define MSG_WM_STYLECHANGED(func) \ + if (uMsg == WM_STYLECHANGED) \ + { \ + SetMsgHandled(TRUE); \ + func((UINT)wParam, (LPSTYLESTRUCT)lParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnStyleChanging(int nStyleType, LPSTYLESTRUCT lpStyleStruct) +#define MSG_WM_STYLECHANGING(func) \ + if (uMsg == WM_STYLECHANGING) \ + { \ + SetMsgHandled(TRUE); \ + func((UINT)wParam, (LPSTYLESTRUCT)lParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnSizing(UINT fwSide, LPRECT pRect) +#define MSG_WM_SIZING(func) \ + if (uMsg == WM_SIZING) \ + { \ + SetMsgHandled(TRUE); \ + func((UINT)wParam, (LPRECT)lParam); \ + lResult = TRUE; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnMoving(UINT fwSide, LPRECT pRect) +#define MSG_WM_MOVING(func) \ + if (uMsg == WM_MOVING) \ + { \ + SetMsgHandled(TRUE); \ + func((UINT)wParam, (LPRECT)lParam); \ + lResult = TRUE; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnCaptureChanged(CWindow wnd) +#define MSG_WM_CAPTURECHANGED(func) \ + if (uMsg == WM_CAPTURECHANGED) \ + { \ + SetMsgHandled(TRUE); \ + func((HWND)lParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// BOOL OnDeviceChange(UINT nEventType, DWORD dwData) +#define MSG_WM_DEVICECHANGE(func) \ + if (uMsg == WM_DEVICECHANGE) \ + { \ + SetMsgHandled(TRUE); \ + lResult = (LRESULT)func((UINT)wParam, (DWORD)lParam); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnCommand(UINT uNotifyCode, int nID, CWindow wndCtl) +#define MSG_WM_COMMAND(func) \ + if (uMsg == WM_COMMAND) \ + { \ + SetMsgHandled(TRUE); \ + func((UINT)HIWORD(wParam), (int)LOWORD(wParam), (HWND)lParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnDisplayChange(UINT uBitsPerPixel, CSize sizeScreen) +#define MSG_WM_DISPLAYCHANGE(func) \ + if (uMsg == WM_DISPLAYCHANGE) \ + { \ + SetMsgHandled(TRUE); \ + func((UINT)wParam, _WTYPES_NS::CSize(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnEnterSizeMove() +#define MSG_WM_ENTERSIZEMOVE(func) \ + if (uMsg == WM_ENTERSIZEMOVE) \ + { \ + SetMsgHandled(TRUE); \ + func(); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnExitSizeMove() +#define MSG_WM_EXITSIZEMOVE(func) \ + if (uMsg == WM_EXITSIZEMOVE) \ + { \ + SetMsgHandled(TRUE); \ + func(); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// HFONT OnGetFont() +#define MSG_WM_GETFONT(func) \ + if (uMsg == WM_GETFONT) \ + { \ + SetMsgHandled(TRUE); \ + lResult = (LRESULT)func(); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// LRESULT OnGetHotKey() +#define MSG_WM_GETHOTKEY(func) \ + if (uMsg == WM_GETHOTKEY) \ + { \ + SetMsgHandled(TRUE); \ + lResult = func(); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// HICON OnGetIcon() +#define MSG_WM_GETICON(func) \ + if (uMsg == WM_GETICON) \ + { \ + SetMsgHandled(TRUE); \ + lResult = (LRESULT)func((UINT)wParam); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// int OnGetText(int cchTextMax, LPTSTR lpszText) +#define MSG_WM_GETTEXT(func) \ + if (uMsg == WM_GETTEXT) \ + { \ + SetMsgHandled(TRUE); \ + lResult = (LRESULT)func((int)wParam, (LPTSTR)lParam); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// int OnGetTextLength() +#define MSG_WM_GETTEXTLENGTH(func) \ + if (uMsg == WM_GETTEXTLENGTH) \ + { \ + SetMsgHandled(TRUE); \ + lResult = (LRESULT)func(); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnHelp(LPHELPINFO lpHelpInfo) +#define MSG_WM_HELP(func) \ + if (uMsg == WM_HELP) \ + { \ + SetMsgHandled(TRUE); \ + func((LPHELPINFO)lParam); \ + lResult = TRUE; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnHotKey(int nHotKeyID, UINT uModifiers, UINT uVirtKey) +#define MSG_WM_HOTKEY(func) \ + if (uMsg == WM_HOTKEY) \ + { \ + SetMsgHandled(TRUE); \ + func((int)wParam, (UINT)LOWORD(lParam), (UINT)HIWORD(lParam)); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnInputLangChange(DWORD dwCharSet, HKL hKbdLayout) +#define MSG_WM_INPUTLANGCHANGE(func) \ + if (uMsg == WM_INPUTLANGCHANGE) \ + { \ + SetMsgHandled(TRUE); \ + func((DWORD)wParam, (HKL)lParam); \ + lResult = TRUE; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnInputLangChangeRequest(BOOL bSysCharSet, HKL hKbdLayout) +#define MSG_WM_INPUTLANGCHANGEREQUEST(func) \ + if (uMsg == WM_INPUTLANGCHANGEREQUEST) \ + { \ + SetMsgHandled(TRUE); \ + func((BOOL)wParam, (HKL)lParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnNextDlgCtl(BOOL bHandle, WPARAM wCtlFocus) +#define MSG_WM_NEXTDLGCTL(func) \ + if (uMsg == WM_NEXTDLGCTL) \ + { \ + SetMsgHandled(TRUE); \ + func((BOOL)LOWORD(lParam), wParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnNextMenu(int nVirtKey, LPMDINEXTMENU lpMdiNextMenu) +#define MSG_WM_NEXTMENU(func) \ + if (uMsg == WM_NEXTMENU) \ + { \ + SetMsgHandled(TRUE); \ + func((int)wParam, (LPMDINEXTMENU)lParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// int OnNotifyFormat(CWindow wndFrom, int nCommand) +#define MSG_WM_NOTIFYFORMAT(func) \ + if (uMsg == WM_NOTIFYFORMAT) \ + { \ + SetMsgHandled(TRUE); \ + lResult = (LRESULT)func((HWND)wParam, (int)lParam); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// BOOL OnPowerBroadcast(DWORD dwPowerEvent, DWORD dwData) +#define MSG_WM_POWERBROADCAST(func) \ + if (uMsg == WM_POWERBROADCAST) \ + { \ + SetMsgHandled(TRUE); \ + lResult = (LRESULT)func((DWORD)wParam, (DWORD)lParam); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnPrint(CDCHandle dc, UINT uFlags) +#define MSG_WM_PRINT(func) \ + if (uMsg == WM_PRINT) \ + { \ + SetMsgHandled(TRUE); \ + func((HDC)wParam, (UINT)lParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnPrintClient(CDCHandle dc, UINT uFlags) +#define MSG_WM_PRINTCLIENT(func) \ + if (uMsg == WM_PRINTCLIENT) \ + { \ + SetMsgHandled(TRUE); \ + func((HDC)wParam, (UINT)lParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnRasDialEvent(RASCONNSTATE rasconnstate, DWORD dwError) +#define MSG_WM_RASDIALEVENT(func) \ + if (uMsg == WM_RASDIALEVENT) \ + { \ + SetMsgHandled(TRUE); \ + func((RASCONNSTATE)wParam, (DWORD)lParam); \ + lResult = TRUE; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnSetFont(CFont font, BOOL bRedraw) +#define MSG_WM_SETFONT(func) \ + if (uMsg == WM_SETFONT) \ + { \ + SetMsgHandled(TRUE); \ + func((HFONT)wParam, (BOOL)LOWORD(lParam)); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// int OnSetHotKey(int nVirtKey, UINT uFlags) +#define MSG_WM_SETHOTKEY(func) \ + if (uMsg == WM_SETHOTKEY) \ + { \ + SetMsgHandled(TRUE); \ + lResult = (LRESULT)func((int)LOBYTE(LOWORD(wParam)), (UINT)HIBYTE(LOWORD(wParam))); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// HICON OnSetIcon(UINT uType, HICON hIcon) +#define MSG_WM_SETICON(func) \ + if (uMsg == WM_SETICON) \ + { \ + SetMsgHandled(TRUE); \ + lResult = (LRESULT)func((UINT)wParam, (HICON)lParam); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnSetRedraw(BOOL bRedraw) +#define MSG_WM_SETREDRAW(func) \ + if (uMsg == WM_SETREDRAW) \ + { \ + SetMsgHandled(TRUE); \ + func((BOOL)wParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// int OnSetText(LPCTSTR lpstrText) +#define MSG_WM_SETTEXT(func) \ + if (uMsg == WM_SETTEXT) \ + { \ + SetMsgHandled(TRUE); \ + lResult = (LRESULT)func((LPCTSTR)lParam); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnUserChanged() +#define MSG_WM_USERCHANGED(func) \ + if (uMsg == WM_USERCHANGED) \ + { \ + SetMsgHandled(TRUE); \ + func(); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +/////////////////////////////////////////////////////////////////////////////// +// New NT4 & NT5 messages + +#if(_WIN32_WINNT >= 0x0400) + +// void OnMouseHover(WPARAM wParam, CPoint ptPos) +#define MSG_WM_MOUSEHOVER(func) \ + if (uMsg == WM_MOUSEHOVER) \ + { \ + SetMsgHandled(TRUE); \ + func(wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnMouseLeave() +#define MSG_WM_MOUSELEAVE(func) \ + if (uMsg == WM_MOUSELEAVE) \ + { \ + SetMsgHandled(TRUE); \ + func(); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +#endif /* _WIN32_WINNT >= 0x0400 */ + +#if(WINVER >= 0x0500) + +// void OnMenuRButtonUp(WPARAM wParam, CMenu menu) +#define MSG_WM_MENURBUTTONUP(func) \ + if (uMsg == WM_MENURBUTTONUP) \ + { \ + SetMsgHandled(TRUE); \ + func(wParam, (HMENU)lParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// LRESULT OnMenuDrag(WPARAM wParam, CMenu menu) +#define MSG_WM_MENUDRAG(func) \ + if (uMsg == WM_MENUDRAG) \ + { \ + SetMsgHandled(TRUE); \ + lResult = func(wParam, (HMENU)lParam); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// LRESULT OnMenuGetObject(PMENUGETOBJECTINFO info) +#define MSG_WM_MENUGETOBJECT(func) \ + if (uMsg == WM_MENUGETOBJECT) \ + { \ + SetMsgHandled(TRUE); \ + lResult = func((PMENUGETOBJECTINFO)lParam); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnUnInitMenuPopup(UINT nID, CMenu menu) +#define MSG_WM_UNINITMENUPOPUP(func) \ + if (uMsg == WM_UNINITMENUPOPUP) \ + { \ + SetMsgHandled(TRUE); \ + func((UINT)HIWORD(lParam), (HMENU)wParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnMenuCommand(WPARAM nIndex, CMenu menu) +#define MSG_WM_MENUCOMMAND(func) \ + if (uMsg == WM_MENUCOMMAND) \ + { \ + SetMsgHandled(TRUE); \ + func(wParam, (HMENU)lParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +#endif /* WINVER >= 0x0500 */ + +#if(_WIN32_WINNT >= 0x0500) + +// BOOL OnAppCommand(CWindow wndFocus, short cmd, WORD uDevice, int dwKeys) +#define MSG_WM_APPCOMMAND(func) \ + if (uMsg == WM_APPCOMMAND) \ + { \ + SetMsgHandled(TRUE); \ + lResult = (LRESULT)func((HWND)wParam, GET_APPCOMMAND_LPARAM(lParam), GET_DEVICE_LPARAM(lParam), GET_KEYSTATE_LPARAM(lParam)); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnNCXButtonDown(int fwButton, short nHittest, CPoint ptPos) +#define MSG_WM_NCXBUTTONDOWN(func) \ + if (uMsg == WM_NCXBUTTONDOWN) \ + { \ + SetMsgHandled(TRUE); \ + func(GET_XBUTTON_WPARAM(wParam), GET_NCHITTEST_WPARAM(wParam), _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnNCXButtonUp(int fwButton, short nHittest, CPoint ptPos) +#define MSG_WM_NCXBUTTONUP(func) \ + if (uMsg == WM_NCXBUTTONUP) \ + { \ + SetMsgHandled(TRUE); \ + func(GET_XBUTTON_WPARAM(wParam), GET_NCHITTEST_WPARAM(wParam), _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnNCXButtonDblClk(int fwButton, short nHittest, CPoint ptPos) +#define MSG_WM_NCXBUTTONDBLCLK(func) \ + if (uMsg == WM_NCXBUTTONDBLCLK) \ + { \ + SetMsgHandled(TRUE); \ + func(GET_XBUTTON_WPARAM(wParam), GET_NCHITTEST_WPARAM(wParam), _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnXButtonDown(int fwButton, int dwKeys, CPoint ptPos) +#define MSG_WM_XBUTTONDOWN(func) \ + if (uMsg == WM_XBUTTONDOWN) \ + { \ + SetMsgHandled(TRUE); \ + func(GET_XBUTTON_WPARAM(wParam), GET_KEYSTATE_WPARAM(wParam), _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnXButtonUp(int fwButton, int dwKeys, CPoint ptPos) +#define MSG_WM_XBUTTONUP(func) \ + if (uMsg == WM_XBUTTONUP) \ + { \ + SetMsgHandled(TRUE); \ + func(GET_XBUTTON_WPARAM(wParam), GET_KEYSTATE_WPARAM(wParam), _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnXButtonDblClk(int fwButton, int dwKeys, CPoint ptPos) +#define MSG_WM_XBUTTONDBLCLK(func) \ + if (uMsg == WM_XBUTTONDBLCLK) \ + { \ + SetMsgHandled(TRUE); \ + func(GET_XBUTTON_WPARAM(wParam), GET_KEYSTATE_WPARAM(wParam), _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnChangeUIState(WORD nAction, WORD nState) +#define MSG_WM_CHANGEUISTATE(func) \ + if (uMsg == WM_CHANGEUISTATE) \ + { \ + SetMsgHandled(TRUE); \ + func(LOWORD(wParam), HIWORD(wParam)); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnUpdateUIState(WORD nAction, WORD nState) +#define MSG_WM_UPDATEUISTATE(func) \ + if (uMsg == WM_UPDATEUISTATE) \ + { \ + SetMsgHandled(TRUE); \ + func(LOWORD(wParam), HIWORD(wParam)); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// LRESULT OnQueryUIState() +#define MSG_WM_QUERYUISTATE(func) \ + if (uMsg == WM_QUERYUISTATE) \ + { \ + SetMsgHandled(TRUE); \ + lResult = func(); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +#endif // (_WIN32_WINNT >= 0x0500) + +#if(_WIN32_WINNT >= 0x0501) + +// void OnInput(WPARAM RawInputCode, HRAWINPUT hRawInput) +#define MSG_WM_INPUT(func) \ + if (uMsg == WM_INPUT) \ + { \ + SetMsgHandled(TRUE); \ + func(GET_RAWINPUT_CODE_WPARAM(wParam), (HRAWINPUT)lParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnUniChar(TCHAR nChar, UINT nRepCnt, UINT nFlags) +#define MSG_WM_UNICHAR(func) \ + if (uMsg == WM_UNICHAR) \ + { \ + SetMsgHandled(TRUE); \ + func((TCHAR)wParam, (UINT)lParam & 0xFFFF, (UINT)((lParam & 0xFFFF0000) >> 16)); \ + if(IsMsgHandled()) \ + { \ + lResult = (wParam == UNICODE_NOCHAR) ? TRUE : FALSE; \ + return TRUE; \ + } \ + } + +// void OnWTSSessionChange(WPARAM nStatusCode, PWTSSESSION_NOTIFICATION nSessionID) +#define MSG_WM_WTSSESSION_CHANGE(func) \ + if (uMsg == WM_WTSSESSION_CHANGE) \ + { \ + SetMsgHandled(TRUE); \ + func(wParam, (PWTSSESSION_NOTIFICATION)lParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// OnThemeChanged() +#define MSG_WM_THEMECHANGED(func) \ + if (uMsg == WM_THEMECHANGED) \ + { \ + SetMsgHandled(TRUE); \ + func(); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +#endif /* _WIN32_WINNT >= 0x0501 */ + +/////////////////////////////////////////////////////////////////////////////// +// ATL defined messages + +// BOOL OnForwardMsg(LPMSG Msg, DWORD nUserData) +#define MSG_WM_FORWARDMSG(func) \ + if (uMsg == WM_FORWARDMSG) \ + { \ + SetMsgHandled(TRUE); \ + lResult = (LRESULT)func((LPMSG)lParam, (DWORD)wParam); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +/////////////////////////////////////////////////////////////////////////////// +// Dialog specific messages + +// LRESULT OnDMGetDefID() +#define MSG_DM_GETDEFID(func) \ + if (uMsg == DM_GETDEFID) \ + { \ + SetMsgHandled(TRUE); \ + lResult = func(); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnDMSetDefID(UINT DefID) +#define MSG_DM_SETDEFID(func) \ + if (uMsg == DM_SETDEFID) \ + { \ + SetMsgHandled(TRUE); \ + func((UINT)wParam); \ + lResult = TRUE; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnDMReposition() +#define MSG_DM_REPOSITION(func) \ + if (uMsg == DM_REPOSITION) \ + { \ + SetMsgHandled(TRUE); \ + func(); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +/////////////////////////////////////////////////////////////////////////////// +// Reflected messages + +// void OnReflectedCommand(UINT uNotifyCode, int nID, CWindow wndCtl) +#define MSG_OCM_COMMAND(func) \ + if (uMsg == OCM_COMMAND) \ + { \ + SetMsgHandled(TRUE); \ + func((UINT)HIWORD(wParam), (int)LOWORD(wParam), (HWND)lParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// LRESULT OnReflectedNotify(int idCtrl, LPNMHDR pnmh) +#define MSG_OCM_NOTIFY(func) \ + if (uMsg == OCM_NOTIFY) \ + { \ + SetMsgHandled(TRUE); \ + lResult = func((int)wParam, (LPNMHDR)lParam); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnReflectedParentNotify(UINT message, UINT nChildID, LPARAM lParam) +#define MSG_OCM_PARENTNOTIFY(func) \ + if (uMsg == OCM_PARENTNOTIFY) \ + { \ + SetMsgHandled(TRUE); \ + func((UINT)LOWORD(wParam), (UINT)HIWORD(wParam), lParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnReflectedDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct) +#define MSG_OCM_DRAWITEM(func) \ + if (uMsg == OCM_DRAWITEM) \ + { \ + SetMsgHandled(TRUE); \ + func((UINT)wParam, (LPDRAWITEMSTRUCT)lParam); \ + lResult = TRUE; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnReflectedMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct) +#define MSG_OCM_MEASUREITEM(func) \ + if (uMsg == OCM_MEASUREITEM) \ + { \ + SetMsgHandled(TRUE); \ + func((UINT)wParam, (LPMEASUREITEMSTRUCT)lParam); \ + lResult = TRUE; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// int OnReflectedCompareItem(int nIDCtl, LPCOMPAREITEMSTRUCT lpCompareItemStruct) +#define MSG_OCM_COMPAREITEM(func) \ + if (uMsg == OCM_COMPAREITEM) \ + { \ + SetMsgHandled(TRUE); \ + lResult = (LRESULT)func((UINT)wParam, (LPCOMPAREITEMSTRUCT)lParam); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnReflectedDeleteItem(int nIDCtl, LPDELETEITEMSTRUCT lpDeleteItemStruct) +#define MSG_OCM_DELETEITEM(func) \ + if (uMsg == OCM_DELETEITEM) \ + { \ + SetMsgHandled(TRUE); \ + func((UINT)wParam, (LPDELETEITEMSTRUCT)lParam); \ + lResult = TRUE; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// int OnReflectedVKeyToItem(UINT nKey, UINT nIndex, CListBox listBox) +#define MSG_OCM_VKEYTOITEM(func) \ + if (uMsg == OCM_VKEYTOITEM) \ + { \ + SetMsgHandled(TRUE); \ + lResult = (LRESULT)func((UINT)LOWORD(wParam), (UINT)HIWORD(wParam), (HWND)lParam); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +//int OnReflectedCharToItem(UINT nChar, UINT nIndex, CListBox listBox) +#define MSG_OCM_CHARTOITEM(func) \ + if (uMsg == OCM_CHARTOITEM) \ + { \ + SetMsgHandled(TRUE); \ + lResult = (LRESULT)func((UINT)LOWORD(wParam), (UINT)HIWORD(wParam), (HWND)lParam); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnReflectedHScroll(UINT nSBCode, UINT nPos, CScrollBar pScrollBar) +#define MSG_OCM_HSCROLL(func) \ + if (uMsg == OCM_HSCROLL) \ + { \ + SetMsgHandled(TRUE); \ + func((int)LOWORD(wParam), (short)HIWORD(wParam), (HWND)lParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnReflectedVScroll(UINT nSBCode, UINT nPos, CScrollBar pScrollBar) +#define MSG_OCM_VSCROLL(func) \ + if (uMsg == OCM_VSCROLL) \ + { \ + SetMsgHandled(TRUE); \ + func((int)LOWORD(wParam), (short)HIWORD(wParam), (HWND)lParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// HBRUSH OnReflectedCtlColorEdit(CDCHandle dc, CEdit edit) +#define MSG_OCM_CTLCOLOREDIT(func) \ + if (uMsg == OCM_CTLCOLOREDIT) \ + { \ + SetMsgHandled(TRUE); \ + lResult = (LRESULT)func((HDC)wParam, (HWND)lParam); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// HBRUSH OnReflectedCtlColorListBox(CDCHandle dc, CListBox listBox) +#define MSG_OCM_CTLCOLORLISTBOX(func) \ + if (uMsg == OCM_CTLCOLORLISTBOX) \ + { \ + SetMsgHandled(TRUE); \ + lResult = (LRESULT)func((HDC)wParam, (HWND)lParam); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// HBRUSH OnReflectedCtlColorBtn(CDCHandle dc, CButton button) +#define MSG_OCM_CTLCOLORBTN(func) \ + if (uMsg == OCM_CTLCOLORBTN) \ + { \ + SetMsgHandled(TRUE); \ + lResult = (LRESULT)func((HDC)wParam, (HWND)lParam); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// HBRUSH OnReflectedCtlColorDlg(CDCHandle dc, CWindow wnd) +#define MSG_OCM_CTLCOLORDLG(func) \ + if (uMsg == OCM_CTLCOLORDLG) \ + { \ + SetMsgHandled(TRUE); \ + lResult = (LRESULT)func((HDC)wParam, (HWND)lParam); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// HBRUSH OnReflectedCtlColorScrollBar(CDCHandle dc, CScrollBar scrollBar) +#define MSG_OCM_CTLCOLORSCROLLBAR(func) \ + if (uMsg == OCM_CTLCOLORSCROLLBAR) \ + { \ + SetMsgHandled(TRUE); \ + lResult = (LRESULT)func((HDC)wParam, (HWND)lParam); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// HBRUSH OnReflectedCtlColorStatic(CDCHandle dc, CStatic wndStatic) +#define MSG_OCM_CTLCOLORSTATIC(func) \ + if (uMsg == OCM_CTLCOLORSTATIC) \ + { \ + SetMsgHandled(TRUE); \ + lResult = (LRESULT)func((HDC)wParam, (HWND)lParam); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +/////////////////////////////////////////////////////////////////////////////// +// Edit specific messages + +// void OnClear() +#define MSG_WM_CLEAR(func) \ + if (uMsg == WM_CLEAR) \ + { \ + SetMsgHandled(TRUE); \ + func(); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnCopy() +#define MSG_WM_COPY(func) \ + if (uMsg == WM_COPY) \ + { \ + SetMsgHandled(TRUE); \ + func(); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnCut() +#define MSG_WM_CUT(func) \ + if (uMsg == WM_CUT) \ + { \ + SetMsgHandled(TRUE); \ + func(); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnPaste() +#define MSG_WM_PASTE(func) \ + if (uMsg == WM_PASTE) \ + { \ + SetMsgHandled(TRUE); \ + func(); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnUndo() +#define MSG_WM_UNDO(func) \ + if (uMsg == WM_UNDO) \ + { \ + SetMsgHandled(TRUE); \ + func(); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +/////////////////////////////////////////////////////////////////////////////// +// Generic message handlers + +// LRESULT OnMessageHandlerEX(UINT uMsg, WPARAM wParam, LPARAM lParam) +#define MESSAGE_HANDLER_EX(msg, func) \ + if(uMsg == msg) \ + { \ + SetMsgHandled(TRUE); \ + lResult = func(uMsg, wParam, lParam); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// LRESULT OnMessageRangeHandlerEX(UINT uMsg, WPARAM wParam, LPARAM lParam) +#define MESSAGE_RANGE_HANDLER_EX(msgFirst, msgLast, func) \ + if(uMsg >= msgFirst && uMsg <= msgLast) \ + { \ + SetMsgHandled(TRUE); \ + lResult = func(uMsg, wParam, lParam); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +/////////////////////////////////////////////////////////////////////////////// +// Commands and notifications + +// void OnCommandHandlerEX(UINT uNotifyCode, int nID, CWindow wndCtl) +#define COMMAND_HANDLER_EX(id, code, func) \ + if (uMsg == WM_COMMAND && code == HIWORD(wParam) && id == LOWORD(wParam)) \ + { \ + SetMsgHandled(TRUE); \ + func((UINT)HIWORD(wParam), (int)LOWORD(wParam), (HWND)lParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnCommandIDHandlerEX(UINT uNotifyCode, int nID, CWindow wndCtl) +#define COMMAND_ID_HANDLER_EX(id, func) \ + if (uMsg == WM_COMMAND && id == LOWORD(wParam)) \ + { \ + SetMsgHandled(TRUE); \ + func((UINT)HIWORD(wParam), (int)LOWORD(wParam), (HWND)lParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnCommandCodeHandlerEX(UINT uNotifyCode, int nID, CWindow wndCtl) +#define COMMAND_CODE_HANDLER_EX(code, func) \ + if (uMsg == WM_COMMAND && code == HIWORD(wParam)) \ + { \ + SetMsgHandled(TRUE); \ + func((UINT)HIWORD(wParam), (int)LOWORD(wParam), (HWND)lParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// LRESULT OnNotifyHandlerEX(LPNMHDR pnmh) +#define NOTIFY_HANDLER_EX(id, cd, func) \ + if (uMsg == WM_NOTIFY && cd == ((LPNMHDR)lParam)->code && id == ((LPNMHDR)lParam)->idFrom) \ + { \ + SetMsgHandled(TRUE); \ + lResult = func((LPNMHDR)lParam); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// LRESULT OnNotifyIDHandlerEX(LPNMHDR pnmh) +#define NOTIFY_ID_HANDLER_EX(id, func) \ + if (uMsg == WM_NOTIFY && id == ((LPNMHDR)lParam)->idFrom) \ + { \ + SetMsgHandled(TRUE); \ + lResult = func((LPNMHDR)lParam); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// LRESULT OnNotifyCodeHandlerEX(LPNMHDR pnmh) +#define NOTIFY_CODE_HANDLER_EX(cd, func) \ + if (uMsg == WM_NOTIFY && cd == ((LPNMHDR)lParam)->code) \ + { \ + SetMsgHandled(TRUE); \ + lResult = func((LPNMHDR)lParam); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnCommandRangeHandlerEX(UINT uNotifyCode, int nID, CWindow wndCtl) +#define COMMAND_RANGE_HANDLER_EX(idFirst, idLast, func) \ + if(uMsg == WM_COMMAND && LOWORD(wParam) >= idFirst && LOWORD(wParam) <= idLast) \ + { \ + SetMsgHandled(TRUE); \ + func((UINT)HIWORD(wParam), (int)LOWORD(wParam), (HWND)lParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnCommandRangeCodeHandlerEX(UINT uNotifyCode, int nID, CWindow wndCtl) +#define COMMAND_RANGE_CODE_HANDLER_EX(idFirst, idLast, code, func) \ + if(uMsg == WM_COMMAND && code == HIWORD(wParam) && LOWORD(wParam) >= idFirst && LOWORD(wParam) <= idLast) \ + { \ + SetMsgHandled(TRUE); \ + func((UINT)HIWORD(wParam), (int)LOWORD(wParam), (HWND)lParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// LRESULT OnNotifyRangeHandlerEX(LPNMHDR pnmh) +#define NOTIFY_RANGE_HANDLER_EX(idFirst, idLast, func) \ + if(uMsg == WM_NOTIFY && ((LPNMHDR)lParam)->idFrom >= idFirst && ((LPNMHDR)lParam)->idFrom <= idLast) \ + { \ + SetMsgHandled(TRUE); \ + lResult = func((LPNMHDR)lParam); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// LRESULT OnNotifyRangeCodeHandlerEX(LPNMHDR pnmh) +#define NOTIFY_RANGE_CODE_HANDLER_EX(idFirst, idLast, cd, func) \ + if(uMsg == WM_NOTIFY && cd == ((LPNMHDR)lParam)->code && ((LPNMHDR)lParam)->idFrom >= idFirst && ((LPNMHDR)lParam)->idFrom <= idLast) \ + { \ + SetMsgHandled(TRUE); \ + lResult = func((LPNMHDR)lParam); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// LRESULT OnReflectedCommandHandlerEX(UINT uNotifyCode, int nID, CWindow wndCtl) +#define REFLECTED_COMMAND_HANDLER_EX(id, code, func) \ + if (uMsg == OCM_COMMAND && code == HIWORD(wParam) && id == LOWORD(wParam)) \ + { \ + SetMsgHandled(TRUE); \ + func((UINT)HIWORD(wParam), (int)LOWORD(wParam), (HWND)lParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// LRESULT OnReflectedCommandIDHandlerEX(UINT uNotifyCode, int nID, CWindow wndCtl) +#define REFLECTED_COMMAND_ID_HANDLER_EX(id, func) \ + if (uMsg == OCM_COMMAND && id == LOWORD(wParam)) \ + { \ + SetMsgHandled(TRUE); \ + func((UINT)HIWORD(wParam), (int)LOWORD(wParam), (HWND)lParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// LRESULT OnReflectedCommandCodeHandlerEX(UINT uNotifyCode, int nID, CWindow wndCtl) +#define REFLECTED_COMMAND_CODE_HANDLER_EX(code, func) \ + if (uMsg == OCM_COMMAND && code == HIWORD(wParam)) \ + { \ + SetMsgHandled(TRUE); \ + func((UINT)HIWORD(wParam), (int)LOWORD(wParam), (HWND)lParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// LRESULT OnReflectedNotifyHandlerEX(LPNMHDR pnmh) +#define REFLECTED_NOTIFY_HANDLER_EX(id, cd, func) \ + if (uMsg == OCM_NOTIFY && cd == ((LPNMHDR)lParam)->code && id == ((LPNMHDR)lParam)->idFrom) \ + { \ + SetMsgHandled(TRUE); \ + lResult = func((LPNMHDR)lParam); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// LRESULT OnReflectedNotifyIDHandlerEX(LPNMHDR pnmh) +#define REFLECTED_NOTIFY_ID_HANDLER_EX(id, func) \ + if (uMsg == OCM_NOTIFY && id == ((LPNMHDR)lParam)->idFrom) \ + { \ + SetMsgHandled(TRUE); \ + lResult = func((LPNMHDR)lParam); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// LRESULT OnReflectedNotifyCodeHandlerEX(LPNMHDR pnmh) +#define REFLECTED_NOTIFY_CODE_HANDLER_EX(cd, func) \ + if (uMsg == OCM_NOTIFY && cd == ((LPNMHDR)lParam)->code) \ + { \ + SetMsgHandled(TRUE); \ + lResult = func((LPNMHDR)lParam); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnReflectedCommandRangeHandlerEX(UINT uNotifyCode, int nID, CWindow wndCtl) +#define REFLECTED_COMMAND_RANGE_HANDLER_EX(idFirst, idLast, func) \ + if(uMsg == OCM_COMMAND && LOWORD(wParam) >= idFirst && LOWORD(wParam) <= idLast) \ + { \ + SetMsgHandled(TRUE); \ + func((UINT)HIWORD(wParam), (int)LOWORD(wParam), (HWND)lParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// void OnReflectedCommandRangeCodeHandlerEX(UINT uNotifyCode, int nID, CWindow wndCtl) +#define REFLECTED_COMMAND_RANGE_CODE_HANDLER_EX(idFirst, idLast, code, func) \ + if(uMsg == OCM_COMMAND && code == HIWORD(wParam) && LOWORD(wParam) >= idFirst && LOWORD(wParam) <= idLast) \ + { \ + SetMsgHandled(TRUE); \ + func((UINT)HIWORD(wParam), (int)LOWORD(wParam), (HWND)lParam); \ + lResult = 0; \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// LRESULT OnReflectedNotifyRangeHandlerEX(LPNMHDR pnmh) +#define REFLECTED_NOTIFY_RANGE_HANDLER_EX(idFirst, idLast, func) \ + if(uMsg == OCM_NOTIFY && ((LPNMHDR)lParam)->idFrom >= idFirst && ((LPNMHDR)lParam)->idFrom <= idLast) \ + { \ + SetMsgHandled(TRUE); \ + lResult = func((LPNMHDR)lParam); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +// LRESULT OnReflectedNotifyRangeCodeHandlerEX(LPNMHDR pnmh) +#define REFLECTED_NOTIFY_RANGE_CODE_HANDLER_EX(idFirst, idLast, cd, func) \ + if(uMsg == OCM_NOTIFY && cd == ((LPNMHDR)lParam)->code && ((LPNMHDR)lParam)->idFrom >= idFirst && ((LPNMHDR)lParam)->idFrom <= idLast) \ + { \ + SetMsgHandled(TRUE); \ + lResult = func((LPNMHDR)lParam); \ + if(IsMsgHandled()) \ + return TRUE; \ + } + +#endif // __ATLCRACK_H__ diff --git a/Externals/WTL80/atlctrls.h b/Externals/WTL80/atlctrls.h new file mode 100644 index 0000000000..338f51d0be --- /dev/null +++ b/Externals/WTL80/atlctrls.h @@ -0,0 +1,10039 @@ +// Windows Template Library - WTL version 8.0 +// Copyright (C) Microsoft Corporation. All rights reserved. +// +// This file is a part of the Windows Template Library. +// The use and distribution terms for this software are covered by the +// Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php) +// which can be found in the file CPL.TXT at the root of this distribution. +// By using this software in any fashion, you are agreeing to be bound by +// the terms of this license. You must not remove this notice, or +// any other, from this software. + +#ifndef __ATLCTRLS_H__ +#define __ATLCTRLS_H__ + +#pragma once + +#ifndef __cplusplus + #error ATL requires C++ compilation (use a .cpp suffix) +#endif + +#ifndef __ATLAPP_H__ + #error atlctrls.h requires atlapp.h to be included first +#endif + +#ifndef __ATLWIN_H__ + #error atlctrls.h requires atlwin.h to be included first +#endif + +#if (_WIN32_IE < 0x0300) + #error atlctrls.h requires IE Version 3.0 or higher +#endif + +#ifndef _WIN32_WCE + #include + #include +#elif defined(WIN32_PLATFORM_WFSP) && !defined(_WINUSERM_H_) + #include +#endif // !_WIN32_WCE + +// protect template members from windowsx.h macros +#ifdef _INC_WINDOWSX + #undef GetNextSibling + #undef GetPrevSibling +#endif // _INC_WINDOWSX + + +/////////////////////////////////////////////////////////////////////////////// +// Classes in this file: +// +// CStaticT - CStatic +// CButtonT - CButton +// CListBoxT - CListBox +// CComboBoxT - CComboBox +// CEditT - CEdit +// CEditCommands +// CScrollBarT - CScrollBar +// +// CImageList +// CListViewCtrlT - CListViewCtrl +// CTreeViewCtrlT - CTreeViewCtrl +// CTreeItemT - CTreeItem +// CTreeViewCtrlExT - CTreeViewCtrlEx +// CHeaderCtrlT - CHeaderCtrl +// CToolBarCtrlT - CToolBarCtrl +// CStatusBarCtrlT - CStatusBarCtrl +// CTabCtrlT - CTabCtrl +// CToolInfo +// CToolTipCtrlT - CToolTipCtrl +// CTrackBarCtrlT - CTrackBarCtrl +// CUpDownCtrlT - CUpDownCtrl +// CProgressBarCtrlT - CProgressBarCtrl +// CHotKeyCtrlT - CHotKeyCtrl +// CAnimateCtrlT - CAnimateCtrl +// CRichEditCtrlT - CRichEditCtrl +// CRichEditCommands +// CDragListBoxT - CDragListBox +// CDragListNotifyImpl +// CReBarCtrlT - CReBarCtrl +// CComboBoxExT - CComboBoxEx +// CDateTimePickerCtrlT - CDateTimePickerCtrl +// CMonthCalendarCtrlT - CMonthCalendarCtrl +// CFlatScrollBarImpl +// CFlatScrollBarT - CFlatScrollBar +// CIPAddressCtrlT - CIPAddressCtrl +// CPagerCtrlT - CPagerCtrl +// CLinkCtrlT - CLinkCtrl +// +// CCustomDraw +// +// CCECommandBarCtrlT - CCECommandBarCtrl +// CCECommandBandsCtrlT - CCECommandBandsCtrl + + +namespace WTL +{ + +// These are wrapper classes for Windows standard and common controls. +// To implement a window based on a control, use following: +// Example: Implementing a window based on a list box +// +// class CMyListBox : CWindowImpl +// { +// public: +// BEGIN_MSG_MAP(CMyListBox) +// // put your message handler entries here +// END_MSG_MAP() +// }; + + + +// --- Standard Windows controls --- + +/////////////////////////////////////////////////////////////////////////////// +// CStatic - client side for a Windows STATIC control + +template +class CStaticT : public TBase +{ +public: +// Constructors + CStaticT(HWND hWnd = NULL) : TBase(hWnd) + { } + + CStaticT< TBase >& operator =(HWND hWnd) + { + m_hWnd = hWnd; + return *this; + } + + HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, + DWORD dwStyle = 0, DWORD dwExStyle = 0, + ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) + { + return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); + } + +// Attributes + static LPCTSTR GetWndClassName() + { + return _T("STATIC"); + } + +#ifndef _WIN32_WCE + HICON GetIcon() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (HICON)::SendMessage(m_hWnd, STM_GETICON, 0, 0L); + } + + HICON SetIcon(HICON hIcon) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (HICON)::SendMessage(m_hWnd, STM_SETICON, (WPARAM)hIcon, 0L); + } + + HENHMETAFILE GetEnhMetaFile() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (HENHMETAFILE)::SendMessage(m_hWnd, STM_GETIMAGE, IMAGE_ENHMETAFILE, 0L); + } + + HENHMETAFILE SetEnhMetaFile(HENHMETAFILE hMetaFile) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (HENHMETAFILE)::SendMessage(m_hWnd, STM_SETIMAGE, IMAGE_ENHMETAFILE, (LPARAM)hMetaFile); + } +#else // CE specific + HICON GetIcon() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (HICON)::SendMessage(m_hWnd, STM_GETIMAGE, IMAGE_ICON, 0L); + } + + HICON SetIcon(HICON hIcon) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (HICON)::SendMessage(m_hWnd, STM_SETIMAGE, IMAGE_ICON, (LPARAM)hIcon); + } +#endif // _WIN32_WCE + + CBitmapHandle GetBitmap() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return CBitmapHandle((HBITMAP)::SendMessage(m_hWnd, STM_GETIMAGE, IMAGE_BITMAP, 0L)); + } + + CBitmapHandle SetBitmap(HBITMAP hBitmap) + { + ATLASSERT(::IsWindow(m_hWnd)); + return CBitmapHandle((HBITMAP)::SendMessage(m_hWnd, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBitmap)); + } + + HCURSOR GetCursor() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (HCURSOR)::SendMessage(m_hWnd, STM_GETIMAGE, IMAGE_CURSOR, 0L); + } + + HCURSOR SetCursor(HCURSOR hCursor) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (HCURSOR)::SendMessage(m_hWnd, STM_SETIMAGE, IMAGE_CURSOR, (LPARAM)hCursor); + } +}; + +typedef CStaticT CStatic; + + +/////////////////////////////////////////////////////////////////////////////// +// CButton - client side for a Windows BUTTON control + +template +class CButtonT : public TBase +{ +public: +// Constructors + CButtonT(HWND hWnd = NULL) : TBase(hWnd) + { } + + CButtonT< TBase >& operator =(HWND hWnd) + { + m_hWnd = hWnd; + return *this; + } + + HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, + DWORD dwStyle = 0, DWORD dwExStyle = 0, + ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) + { + return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); + } + +// Attributes + static LPCTSTR GetWndClassName() + { + return _T("BUTTON"); + } + + UINT GetState() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (UINT)::SendMessage(m_hWnd, BM_GETSTATE, 0, 0L); + } + + void SetState(BOOL bHighlight) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, BM_SETSTATE, bHighlight, 0L); + } + + int GetCheck() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, BM_GETCHECK, 0, 0L); + } + + void SetCheck(int nCheck) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, BM_SETCHECK, nCheck, 0L); + } + + UINT GetButtonStyle() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (UINT)::GetWindowLong(m_hWnd, GWL_STYLE) & 0xFFFF; + } + + void SetButtonStyle(UINT nStyle, BOOL bRedraw = TRUE) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, BM_SETSTYLE, nStyle, (LPARAM)bRedraw); + } + +#ifndef _WIN32_WCE + HICON GetIcon() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (HICON)::SendMessage(m_hWnd, BM_GETIMAGE, IMAGE_ICON, 0L); + } + + HICON SetIcon(HICON hIcon) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (HICON)::SendMessage(m_hWnd, BM_SETIMAGE, IMAGE_ICON, (LPARAM)hIcon); + } + + CBitmapHandle GetBitmap() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return CBitmapHandle((HBITMAP)::SendMessage(m_hWnd, BM_GETIMAGE, IMAGE_BITMAP, 0L)); + } + + CBitmapHandle SetBitmap(HBITMAP hBitmap) + { + ATLASSERT(::IsWindow(m_hWnd)); + return CBitmapHandle((HBITMAP)::SendMessage(m_hWnd, BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBitmap)); + } +#endif // !_WIN32_WCE + +#if (_WIN32_WINNT >= 0x0501) + BOOL GetIdealSize(LPSIZE lpSize) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, BCM_GETIDEALSIZE, 0, (LPARAM)lpSize); + } + + BOOL GetImageList(PBUTTON_IMAGELIST pButtonImagelist) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, BCM_GETIMAGELIST, 0, (LPARAM)pButtonImagelist); + } + + BOOL SetImageList(PBUTTON_IMAGELIST pButtonImagelist) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, BCM_SETIMAGELIST, 0, (LPARAM)pButtonImagelist); + } + + BOOL GetTextMargin(LPRECT lpRect) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, BCM_GETTEXTMARGIN, 0, (LPARAM)lpRect); + } + + BOOL SetTextMargin(LPRECT lpRect) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, BCM_SETTEXTMARGIN, 0, (LPARAM)lpRect); + } +#endif // (_WIN32_WINNT >= 0x0501) + +#if (WINVER >= 0x0600) + void SetDontClick(BOOL bDontClick) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, BM_SETDONTCLICK, (WPARAM)bDontClick, 0L); + } +#endif // (WINVER >= 0x0600) + +#if (_WIN32_WINNT >= 0x0600) + BOOL SetDropDownState(BOOL bDropDown) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT((GetStyle() & (BS_SPLITBUTTON | BS_DEFSPLITBUTTON)) != 0); + return (BOOL)::SendMessage(m_hWnd, BCM_SETDROPDOWNSTATE, (WPARAM)bDropDown, 0L); + } + + BOOL GetSplitInfo(PBUTTON_SPLITINFO pSplitInfo) const + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT((GetStyle() & (BS_SPLITBUTTON | BS_DEFSPLITBUTTON)) != 0); + return (BOOL)::SendMessage(m_hWnd, BCM_GETSPLITINFO, 0, (LPARAM)pSplitInfo); + } + + BOOL SetSplitInfo(PBUTTON_SPLITINFO pSplitInfo) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT((GetStyle() & (BS_SPLITBUTTON | BS_DEFSPLITBUTTON)) != 0); + return (BOOL)::SendMessage(m_hWnd, BCM_SETSPLITINFO, 0, (LPARAM)pSplitInfo); + } + + int GetNoteLength() const + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT((GetStyle() & (BS_COMMANDLINK | BS_DEFCOMMANDLINK)) != 0); + return (int)::SendMessage(m_hWnd, BCM_GETNOTELENGTH, 0, 0L); + } + + BOOL GetNote(LPWSTR lpstrNoteText, int cchNoteText) const + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT((GetStyle() & (BS_COMMANDLINK | BS_DEFCOMMANDLINK)) != 0); + return (BOOL)::SendMessage(m_hWnd, BCM_GETNOTE, cchNoteText, (LPARAM)lpstrNoteText); + } + + BOOL SetNote(LPCWSTR lpstrNoteText) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT((GetStyle() & (BS_COMMANDLINK | BS_DEFCOMMANDLINK)) != 0); + return (BOOL)::SendMessage(m_hWnd, BCM_SETNOTE, 0, (LPARAM)lpstrNoteText); + } + + LRESULT SetElevationRequiredState(BOOL bSet) + { + ATLASSERT(::IsWindow(m_hWnd)); + return ::SendMessage(m_hWnd, BCM_SETSHIELD, 0, (LPARAM)bSet); + } +#endif // (_WIN32_WINNT >= 0x0600) + +// Operations + void Click() + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, BM_CLICK, 0, 0L); + } +}; + +typedef CButtonT CButton; + + +/////////////////////////////////////////////////////////////////////////////// +// CListBox - client side for a Windows LISTBOX control + +template +class CListBoxT : public TBase +{ +public: +// Constructors + CListBoxT(HWND hWnd = NULL) : TBase(hWnd) + { } + + CListBoxT< TBase >& operator =(HWND hWnd) + { + m_hWnd = hWnd; + return *this; + } + + HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, + DWORD dwStyle = 0, DWORD dwExStyle = 0, + ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) + { + return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); + } + +// Attributes + static LPCTSTR GetWndClassName() + { + return _T("LISTBOX"); + } + + // for entire listbox + int GetCount() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, LB_GETCOUNT, 0, 0L); + } + +#ifndef _WIN32_WCE + int SetCount(int cItems) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(((GetStyle() & LBS_NODATA) != 0) && ((GetStyle() & LBS_HASSTRINGS) == 0)); + return (int)::SendMessage(m_hWnd, LB_SETCOUNT, cItems, 0L); + } +#endif // !_WIN32_WCE + + int GetHorizontalExtent() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, LB_GETHORIZONTALEXTENT, 0, 0L); + } + + void SetHorizontalExtent(int cxExtent) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, LB_SETHORIZONTALEXTENT, cxExtent, 0L); + } + + int GetTopIndex() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, LB_GETTOPINDEX, 0, 0L); + } + + int SetTopIndex(int nIndex) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, LB_SETTOPINDEX, nIndex, 0L); + } + + LCID GetLocale() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (LCID)::SendMessage(m_hWnd, LB_GETLOCALE, 0, 0L); + } + + LCID SetLocale(LCID nNewLocale) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (LCID)::SendMessage(m_hWnd, LB_SETLOCALE, (WPARAM)nNewLocale, 0L); + } + +#if (WINVER >= 0x0500) && !defined(_WIN32_WCE) + DWORD GetListBoxInfo() const + { + ATLASSERT(::IsWindow(m_hWnd)); +#if (_WIN32_WINNT >= 0x0501) + return (DWORD)::SendMessage(m_hWnd, LB_GETLISTBOXINFO, 0, 0L); +#else // !(_WIN32_WINNT >= 0x0501) + return ::GetListBoxInfo(m_hWnd); +#endif // !(_WIN32_WINNT >= 0x0501) + } +#endif // (WINVER >= 0x0500) && !defined(_WIN32_WCE) + + // for single-selection listboxes + int GetCurSel() const + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT((GetStyle() & (LBS_MULTIPLESEL | LBS_EXTENDEDSEL)) == 0); + return (int)::SendMessage(m_hWnd, LB_GETCURSEL, 0, 0L); + } + + int SetCurSel(int nSelect) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT((GetStyle() & (LBS_MULTIPLESEL | LBS_EXTENDEDSEL)) == 0); + return (int)::SendMessage(m_hWnd, LB_SETCURSEL, nSelect, 0L); + } + + // for multiple-selection listboxes + int GetSel(int nIndex) const // also works for single-selection + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, LB_GETSEL, nIndex, 0L); + } + + int SetSel(int nIndex, BOOL bSelect = TRUE) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT((GetStyle() & (LBS_MULTIPLESEL | LBS_EXTENDEDSEL)) != 0); + return (int)::SendMessage(m_hWnd, LB_SETSEL, bSelect, nIndex); + } + + int GetSelCount() const + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT((GetStyle() & (LBS_MULTIPLESEL | LBS_EXTENDEDSEL)) != 0); + return (int)::SendMessage(m_hWnd, LB_GETSELCOUNT, 0, 0L); + } + + int GetSelItems(int nMaxItems, LPINT rgIndex) const + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT((GetStyle() & (LBS_MULTIPLESEL | LBS_EXTENDEDSEL)) != 0); + return (int)::SendMessage(m_hWnd, LB_GETSELITEMS, nMaxItems, (LPARAM)rgIndex); + } + + int GetAnchorIndex() const + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT((GetStyle() & (LBS_MULTIPLESEL | LBS_EXTENDEDSEL)) != 0); + return (int)::SendMessage(m_hWnd, LB_GETANCHORINDEX, 0, 0L); + } + + void SetAnchorIndex(int nIndex) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT((GetStyle() & (LBS_MULTIPLESEL | LBS_EXTENDEDSEL)) != 0); + ::SendMessage(m_hWnd, LB_SETANCHORINDEX, nIndex, 0L); + } + + int GetCaretIndex() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, LB_GETCARETINDEX, 0, 0); + } + + int SetCaretIndex(int nIndex, BOOL bScroll = TRUE) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, LB_SETCARETINDEX, nIndex, MAKELONG(bScroll, 0)); + } + + // for listbox items + DWORD_PTR GetItemData(int nIndex) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (DWORD_PTR)::SendMessage(m_hWnd, LB_GETITEMDATA, nIndex, 0L); + } + + int SetItemData(int nIndex, DWORD_PTR dwItemData) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, LB_SETITEMDATA, nIndex, (LPARAM)dwItemData); + } + + void* GetItemDataPtr(int nIndex) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (void*)::SendMessage(m_hWnd, LB_GETITEMDATA, nIndex, 0L); + } + + int SetItemDataPtr(int nIndex, void* pData) + { + ATLASSERT(::IsWindow(m_hWnd)); + return SetItemData(nIndex, (DWORD_PTR)pData); + } + + int GetItemRect(int nIndex, LPRECT lpRect) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, LB_GETITEMRECT, nIndex, (LPARAM)lpRect); + } + + int GetText(int nIndex, LPTSTR lpszBuffer) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, LB_GETTEXT, nIndex, (LPARAM)lpszBuffer); + } + +#ifndef _ATL_NO_COM +#ifdef _OLEAUTO_H_ + BOOL GetTextBSTR(int nIndex, BSTR& bstrText) const + { + USES_CONVERSION; + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(bstrText == NULL); + + int nLen = GetTextLen(nIndex); + if(nLen == LB_ERR) + return FALSE; + + CTempBuffer buff; + LPTSTR lpstrText = buff.Allocate(nLen + 1); + if(lpstrText == NULL) + return FALSE; + + if(GetText(nIndex, lpstrText) == LB_ERR) + return FALSE; + + bstrText = ::SysAllocString(T2OLE(lpstrText)); + return (bstrText != NULL) ? TRUE : FALSE; + } +#endif // _OLEAUTO_H_ +#endif // !_ATL_NO_COM + +#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) + int GetText(int nIndex, _CSTRING_NS::CString& strText) const + { + ATLASSERT(::IsWindow(m_hWnd)); + int cchLen = GetTextLen(nIndex); + if(cchLen == LB_ERR) + return LB_ERR; + int nRet = LB_ERR; + LPTSTR lpstr = strText.GetBufferSetLength(cchLen); + if(lpstr != NULL) + { + nRet = GetText(nIndex, lpstr); + strText.ReleaseBuffer(); + } + return nRet; + } +#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) + + int GetTextLen(int nIndex) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, LB_GETTEXTLEN, nIndex, 0L); + } + + int GetItemHeight(int nIndex) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, LB_GETITEMHEIGHT, nIndex, 0L); + } + + int SetItemHeight(int nIndex, UINT cyItemHeight) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, LB_SETITEMHEIGHT, nIndex, MAKELONG(cyItemHeight, 0)); + } + + // Settable only attributes + void SetColumnWidth(int cxWidth) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, LB_SETCOLUMNWIDTH, cxWidth, 0L); + } + + BOOL SetTabStops(int nTabStops, LPINT rgTabStops) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT((GetStyle() & LBS_USETABSTOPS) != 0); + return (BOOL)::SendMessage(m_hWnd, LB_SETTABSTOPS, nTabStops, (LPARAM)rgTabStops); + } + + BOOL SetTabStops() + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT((GetStyle() & LBS_USETABSTOPS) != 0); + return (BOOL)::SendMessage(m_hWnd, LB_SETTABSTOPS, 0, 0L); + } + + BOOL SetTabStops(const int& cxEachStop) // takes an 'int' + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT((GetStyle() & LBS_USETABSTOPS) != 0); + return (BOOL)::SendMessage(m_hWnd, LB_SETTABSTOPS, 1, (LPARAM)(LPINT)&cxEachStop); + } + +// Operations + int InitStorage(int nItems, UINT nBytes) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, LB_INITSTORAGE, (WPARAM)nItems, nBytes); + } + + void ResetContent() + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, LB_RESETCONTENT, 0, 0L); + } + + UINT ItemFromPoint(POINT pt, BOOL& bOutside) const + { + ATLASSERT(::IsWindow(m_hWnd)); + DWORD dw = (DWORD)::SendMessage(m_hWnd, LB_ITEMFROMPOINT, 0, MAKELPARAM(pt.x, pt.y)); + bOutside = (BOOL)HIWORD(dw); + return (UINT)LOWORD(dw); + } + + // manipulating listbox items + int AddString(LPCTSTR lpszItem) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, LB_ADDSTRING, 0, (LPARAM)lpszItem); + } + + int DeleteString(UINT nIndex) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, LB_DELETESTRING, nIndex, 0L); + } + + int InsertString(int nIndex, LPCTSTR lpszItem) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, LB_INSERTSTRING, nIndex, (LPARAM)lpszItem); + } + +#ifndef _WIN32_WCE + int Dir(UINT attr, LPCTSTR lpszWildCard) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, LB_DIR, attr, (LPARAM)lpszWildCard); + } + + int AddFile(LPCTSTR lpstrFileName) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, LB_ADDFILE, 0, (LPARAM)lpstrFileName); + } +#endif // !_WIN32_WCE + + // selection helpers + int FindString(int nStartAfter, LPCTSTR lpszItem) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, LB_FINDSTRING, nStartAfter, (LPARAM)lpszItem); + } + + int FindStringExact(int nIndexStart, LPCTSTR lpszFind) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, LB_FINDSTRINGEXACT, nIndexStart, (LPARAM)lpszFind); + } + + int SelectString(int nStartAfter, LPCTSTR lpszItem) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, LB_SELECTSTRING, nStartAfter, (LPARAM)lpszItem); + } + + int SelItemRange(BOOL bSelect, int nFirstItem, int nLastItem) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT((GetStyle() & (LBS_MULTIPLESEL | LBS_EXTENDEDSEL)) != 0); + ATLASSERT(nFirstItem <= nLastItem); + return bSelect ? (int)::SendMessage(m_hWnd, LB_SELITEMRANGEEX, nFirstItem, nLastItem) : (int)::SendMessage(m_hWnd, LB_SELITEMRANGEEX, nLastItem, nFirstItem); + } + +#ifdef WIN32_PLATFORM_WFSP // SmartPhone only messages + DWORD GetInputMode(BOOL bCurrentMode = TRUE) + { + return SendMessage(LB_GETINPUTMODE, 0, (LPARAM)bCurrentMode); + } + + BOOL SetInputMode(DWORD dwMode) + { + return SendMessage(LB_SETINPUTMODE, 0, (LPARAM)dwMode); + } +#endif // WIN32_PLATFORM_WFSP +}; + +typedef CListBoxT CListBox; + + +/////////////////////////////////////////////////////////////////////////////// +// CComboBox - client side for a Windows COMBOBOX control + +#ifndef WIN32_PLATFORM_WFSP // No COMBOBOX on SmartPhones + +template +class CComboBoxT : public TBase +{ +public: +// Constructors + CComboBoxT(HWND hWnd = NULL) : TBase(hWnd) + { } + + CComboBoxT< TBase >& operator =(HWND hWnd) + { + m_hWnd = hWnd; + return *this; + } + + HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, + DWORD dwStyle = 0, DWORD dwExStyle = 0, + ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) + { + return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); + } + +// Attributes + static LPCTSTR GetWndClassName() + { + return _T("COMBOBOX"); + } + + // for entire combo box + int GetCount() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, CB_GETCOUNT, 0, 0L); + } + + int GetCurSel() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, CB_GETCURSEL, 0, 0L); + } + + int SetCurSel(int nSelect) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, CB_SETCURSEL, nSelect, 0L); + } + + LCID GetLocale() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (LCID)::SendMessage(m_hWnd, CB_GETLOCALE, 0, 0L); + } + + LCID SetLocale(LCID nNewLocale) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (LCID)::SendMessage(m_hWnd, CB_SETLOCALE, (WPARAM)nNewLocale, 0L); + } + + int GetTopIndex() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, CB_GETTOPINDEX, 0, 0L); + } + + int SetTopIndex(int nIndex) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, CB_SETTOPINDEX, nIndex, 0L); + } + + UINT GetHorizontalExtent() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (UINT)::SendMessage(m_hWnd, CB_GETHORIZONTALEXTENT, 0, 0L); + } + + void SetHorizontalExtent(UINT nExtent) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, CB_SETHORIZONTALEXTENT, nExtent, 0L); + } + + int GetDroppedWidth() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, CB_GETDROPPEDWIDTH, 0, 0L); + } + + int SetDroppedWidth(UINT nWidth) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, CB_SETDROPPEDWIDTH, nWidth, 0L); + } + +#if ((WINVER >= 0x0500) && !defined(_WIN32_WCE)) || (defined(_WIN32_WCE) && (_WIN32_WCE >= 420)) + BOOL GetComboBoxInfo(PCOMBOBOXINFO pComboBoxInfo) const + { + ATLASSERT(::IsWindow(m_hWnd)); +#if ((_WIN32_WINNT >= 0x0501) && !defined(_WIN32_WCE)) || (defined(_WIN32_WCE) && (_WIN32_WCE >= 420)) + return (BOOL)::SendMessage(m_hWnd, CB_GETCOMBOBOXINFO, 0, (LPARAM)pComboBoxInfo); +#else // !((_WIN32_WINNT >= 0x0501) && !defined(_WIN32_WCE)) || (defined(_WIN32_WCE) && (_WIN32_WCE >= 420)) + return ::GetComboBoxInfo(m_hWnd, pComboBoxInfo); +#endif // !((_WIN32_WINNT >= 0x0501) && !defined(_WIN32_WCE)) || (defined(_WIN32_WCE) && (_WIN32_WCE >= 420)) + } +#endif // ((WINVER >= 0x0500) && !defined(_WIN32_WCE)) || (defined(_WIN32_WCE) && (_WIN32_WCE >= 420)) + + // for edit control + DWORD GetEditSel() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (DWORD)::SendMessage(m_hWnd, CB_GETEDITSEL, 0, 0L); + } + + BOOL SetEditSel(int nStartChar, int nEndChar) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, CB_SETEDITSEL, 0, MAKELONG(nStartChar, nEndChar)); + } + + // for combobox item + DWORD_PTR GetItemData(int nIndex) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (DWORD_PTR)::SendMessage(m_hWnd, CB_GETITEMDATA, nIndex, 0L); + } + + int SetItemData(int nIndex, DWORD_PTR dwItemData) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, CB_SETITEMDATA, nIndex, (LPARAM)dwItemData); + } + + void* GetItemDataPtr(int nIndex) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (void*)GetItemData(nIndex); + } + + int SetItemDataPtr(int nIndex, void* pData) + { + ATLASSERT(::IsWindow(m_hWnd)); + return SetItemData(nIndex, (DWORD_PTR)pData); + } + + int GetLBText(int nIndex, LPTSTR lpszText) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, CB_GETLBTEXT, nIndex, (LPARAM)lpszText); + } + +#ifndef _ATL_NO_COM + BOOL GetLBTextBSTR(int nIndex, BSTR& bstrText) const + { + USES_CONVERSION; + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(bstrText == NULL); + + int nLen = GetLBTextLen(nIndex); + if(nLen == CB_ERR) + return FALSE; + + CTempBuffer buff; + LPTSTR lpstrText = buff.Allocate(nLen + 1); + if(lpstrText == NULL) + return FALSE; + + if(GetLBText(nIndex, lpstrText) == CB_ERR) + return FALSE; + + bstrText = ::SysAllocString(T2OLE(lpstrText)); + return (bstrText != NULL) ? TRUE : FALSE; + } +#endif // !_ATL_NO_COM + +#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) + int GetLBText(int nIndex, _CSTRING_NS::CString& strText) const + { + ATLASSERT(::IsWindow(m_hWnd)); + int cchLen = GetLBTextLen(nIndex); + if(cchLen == CB_ERR) + return CB_ERR; + int nRet = CB_ERR; + LPTSTR lpstr = strText.GetBufferSetLength(cchLen); + if(lpstr != NULL) + { + nRet = GetLBText(nIndex, lpstr); + strText.ReleaseBuffer(); + } + return nRet; + } +#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) + + int GetLBTextLen(int nIndex) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, CB_GETLBTEXTLEN, nIndex, 0L); + } + + int GetItemHeight(int nIndex) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, CB_GETITEMHEIGHT, nIndex, 0L); + } + + int SetItemHeight(int nIndex, UINT cyItemHeight) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, CB_SETITEMHEIGHT, nIndex, MAKELONG(cyItemHeight, 0)); + } + + BOOL GetExtendedUI() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, CB_GETEXTENDEDUI, 0, 0L); + } + + int SetExtendedUI(BOOL bExtended = TRUE) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, CB_SETEXTENDEDUI, bExtended, 0L); + } + + void GetDroppedControlRect(LPRECT lprect) const + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, CB_GETDROPPEDCONTROLRECT, 0, (LPARAM)lprect); + } + + BOOL GetDroppedState() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, CB_GETDROPPEDSTATE, 0, 0L); + } + +#if (_WIN32_WINNT >= 0x0501) + int GetMinVisible() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, CB_GETMINVISIBLE, 0, 0L); + } + + BOOL SetMinVisible(int nMinVisible) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, CB_SETMINVISIBLE, nMinVisible, 0L); + } + + // Vista only + BOOL GetCueBannerText(LPWSTR lpwText, int cchText) const + { +#ifndef CB_GETCUEBANNER + const UINT CB_GETCUEBANNER = (CBM_FIRST + 4); +#endif + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, CB_GETCUEBANNER, (WPARAM)lpwText, cchText); + } + + // Vista only + BOOL SetCueBannerText(LPCWSTR lpcwText) + { +#ifndef CB_SETCUEBANNER + const UINT CB_SETCUEBANNER = (CBM_FIRST + 3); +#endif + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, CB_SETCUEBANNER, 0, (LPARAM)lpcwText); + } +#endif // (_WIN32_WINNT >= 0x0501) + +// Operations + int InitStorage(int nItems, UINT nBytes) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, CB_INITSTORAGE, (WPARAM)nItems, nBytes); + } + + void ResetContent() + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, CB_RESETCONTENT, 0, 0L); + } + + // for edit control + BOOL LimitText(int nMaxChars) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, CB_LIMITTEXT, nMaxChars, 0L); + } + + // for drop-down combo boxes + void ShowDropDown(BOOL bShowIt = TRUE) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, CB_SHOWDROPDOWN, bShowIt, 0L); + } + + // manipulating listbox items + int AddString(LPCTSTR lpszString) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, CB_ADDSTRING, 0, (LPARAM)lpszString); + } + + int DeleteString(UINT nIndex) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, CB_DELETESTRING, nIndex, 0L); + } + + int InsertString(int nIndex, LPCTSTR lpszString) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, CB_INSERTSTRING, nIndex, (LPARAM)lpszString); + } + +#ifndef _WIN32_WCE + int Dir(UINT attr, LPCTSTR lpszWildCard) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, CB_DIR, attr, (LPARAM)lpszWildCard); + } +#endif // !_WIN32_WCE + + // selection helpers + int FindString(int nStartAfter, LPCTSTR lpszString) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, CB_FINDSTRING, nStartAfter, (LPARAM)lpszString); + } + + int FindStringExact(int nIndexStart, LPCTSTR lpszFind) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, CB_FINDSTRINGEXACT, nIndexStart, (LPARAM)lpszFind); + } + + int SelectString(int nStartAfter, LPCTSTR lpszString) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, CB_SELECTSTRING, nStartAfter, (LPARAM)lpszString); + } + + // Clipboard operations + void Clear() + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, WM_CLEAR, 0, 0L); + } + + void Copy() + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, WM_COPY, 0, 0L); + } + + void Cut() + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, WM_CUT, 0, 0L); + } + + void Paste() + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, WM_PASTE, 0, 0L); + } +}; + +typedef CComboBoxT CComboBox; + +#endif // !WIN32_PLATFORM_WFSP + +/////////////////////////////////////////////////////////////////////////////// +// CEdit - client side for a Windows EDIT control + +template +class CEditT : public TBase +{ +public: +// Constructors + CEditT(HWND hWnd = NULL) : TBase(hWnd) + { } + + CEditT< TBase >& operator =(HWND hWnd) + { + m_hWnd = hWnd; + return *this; + } + + HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, + DWORD dwStyle = 0, DWORD dwExStyle = 0, + ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) + { + return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); + } + +// Attributes + static LPCTSTR GetWndClassName() + { + return _T("EDIT"); + } + + BOOL CanUndo() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, EM_CANUNDO, 0, 0L); + } + + int GetLineCount() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, EM_GETLINECOUNT, 0, 0L); + } + + BOOL GetModify() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, EM_GETMODIFY, 0, 0L); + } + + void SetModify(BOOL bModified = TRUE) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, EM_SETMODIFY, bModified, 0L); + } + + void GetRect(LPRECT lpRect) const + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, EM_GETRECT, 0, (LPARAM)lpRect); + } + + DWORD GetSel() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (DWORD)::SendMessage(m_hWnd, EM_GETSEL, 0, 0L); + } + + void GetSel(int& nStartChar, int& nEndChar) const + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, EM_GETSEL, (WPARAM)&nStartChar, (LPARAM)&nEndChar); + } + +#ifndef _WIN32_WCE + HLOCAL GetHandle() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (HLOCAL)::SendMessage(m_hWnd, EM_GETHANDLE, 0, 0L); + } + + void SetHandle(HLOCAL hBuffer) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, EM_SETHANDLE, (WPARAM)hBuffer, 0L); + } +#endif // !_WIN32_WCE + + DWORD GetMargins() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (DWORD)::SendMessage(m_hWnd, EM_GETMARGINS, 0, 0L); + } + + void SetMargins(UINT nLeft, UINT nRight) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, EM_SETMARGINS, EC_LEFTMARGIN|EC_RIGHTMARGIN, MAKELONG(nLeft, nRight)); + } + + UINT GetLimitText() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (UINT)::SendMessage(m_hWnd, EM_GETLIMITTEXT, 0, 0L); + } + + void SetLimitText(UINT nMax) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, EM_SETLIMITTEXT, nMax, 0L); + } + + POINT PosFromChar(UINT nChar) const + { + ATLASSERT(::IsWindow(m_hWnd)); + DWORD dwRet = (DWORD)::SendMessage(m_hWnd, EM_POSFROMCHAR, nChar, 0); + POINT point = { GET_X_LPARAM(dwRet), GET_Y_LPARAM(dwRet) }; + return point; + } + + int CharFromPos(POINT pt, int* pLine = NULL) const + { + ATLASSERT(::IsWindow(m_hWnd)); + DWORD dwRet = (DWORD)::SendMessage(m_hWnd, EM_CHARFROMPOS, 0, MAKELPARAM(pt.x, pt.y)); + if(pLine != NULL) + *pLine = (int)(short)HIWORD(dwRet); + return (int)(short)LOWORD(dwRet); + } + + // NOTE: first word in lpszBuffer must contain the size of the buffer! + int GetLine(int nIndex, LPTSTR lpszBuffer) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, EM_GETLINE, nIndex, (LPARAM)lpszBuffer); + } + + int GetLine(int nIndex, LPTSTR lpszBuffer, int nMaxLength) const + { + ATLASSERT(::IsWindow(m_hWnd)); + *(LPWORD)lpszBuffer = (WORD)nMaxLength; + return (int)::SendMessage(m_hWnd, EM_GETLINE, nIndex, (LPARAM)lpszBuffer); + } + + TCHAR GetPasswordChar() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (TCHAR)::SendMessage(m_hWnd, EM_GETPASSWORDCHAR, 0, 0L); + } + + void SetPasswordChar(TCHAR ch) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, EM_SETPASSWORDCHAR, ch, 0L); + } + +#ifndef _WIN32_WCE + EDITWORDBREAKPROC GetWordBreakProc() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (EDITWORDBREAKPROC)::SendMessage(m_hWnd, EM_GETWORDBREAKPROC, 0, 0L); + } + + void SetWordBreakProc(EDITWORDBREAKPROC ewbprc) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, EM_SETWORDBREAKPROC, 0, (LPARAM)ewbprc); + } +#endif // !_WIN32_WCE + + int GetFirstVisibleLine() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, EM_GETFIRSTVISIBLELINE, 0, 0L); + } + +#ifndef _WIN32_WCE + int GetThumb() const + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT((GetStyle() & ES_MULTILINE) != 0); + return (int)::SendMessage(m_hWnd, EM_GETTHUMB, 0, 0L); + } +#endif // !_WIN32_WCE + + BOOL SetReadOnly(BOOL bReadOnly = TRUE) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, EM_SETREADONLY, bReadOnly, 0L); + } + +#if (WINVER >= 0x0500) && !defined(_WIN32_WCE) + UINT GetImeStatus(UINT uStatus) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (UINT)::SendMessage(m_hWnd, EM_GETIMESTATUS, uStatus, 0L); + } + + UINT SetImeStatus(UINT uStatus, UINT uData) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (UINT)::SendMessage(m_hWnd, EM_SETIMESTATUS, uStatus, uData); + } +#endif // (WINVER >= 0x0500) && !defined(_WIN32_WCE) + +#if (_WIN32_WINNT >= 0x0501) + BOOL GetCueBannerText(LPCWSTR lpstrText, int cchText) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, EM_GETCUEBANNER, (WPARAM)lpstrText, cchText); + } + + // bKeepWithFocus - Vista only + BOOL SetCueBannerText(LPCWSTR lpstrText, BOOL bKeepWithFocus = FALSE) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, EM_SETCUEBANNER, (WPARAM)bKeepWithFocus, (LPARAM)(lpstrText)); + } +#endif // (_WIN32_WINNT >= 0x0501) + +// Operations + void EmptyUndoBuffer() + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, EM_EMPTYUNDOBUFFER, 0, 0L); + } + + BOOL FmtLines(BOOL bAddEOL) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, EM_FMTLINES, bAddEOL, 0L); + } + + void LimitText(int nChars = 0) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, EM_LIMITTEXT, nChars, 0L); + } + + int LineFromChar(int nIndex = -1) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, EM_LINEFROMCHAR, nIndex, 0L); + } + + int LineIndex(int nLine = -1) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, EM_LINEINDEX, nLine, 0L); + } + + int LineLength(int nLine = -1) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, EM_LINELENGTH, nLine, 0L); + } + + void LineScroll(int nLines, int nChars = 0) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, EM_LINESCROLL, nChars, nLines); + } + + void ReplaceSel(LPCTSTR lpszNewText, BOOL bCanUndo = FALSE) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, EM_REPLACESEL, (WPARAM) bCanUndo, (LPARAM)lpszNewText); + } + + void SetRect(LPCRECT lpRect) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, EM_SETRECT, 0, (LPARAM)lpRect); + } + + void SetRectNP(LPCRECT lpRect) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, EM_SETRECTNP, 0, (LPARAM)lpRect); + } + + void SetSel(DWORD dwSelection, BOOL bNoScroll = FALSE) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, EM_SETSEL, LOWORD(dwSelection), HIWORD(dwSelection)); + if(!bNoScroll) + ::SendMessage(m_hWnd, EM_SCROLLCARET, 0, 0L); + } + + void SetSel(int nStartChar, int nEndChar, BOOL bNoScroll = FALSE) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, EM_SETSEL, nStartChar, nEndChar); + if(!bNoScroll) + ::SendMessage(m_hWnd, EM_SCROLLCARET, 0, 0L); + } + + void SetSelAll(BOOL bNoScroll = FALSE) + { + SetSel(0, -1, bNoScroll); + } + + void SetSelNone(BOOL bNoScroll = FALSE) + { + SetSel(-1, 0, bNoScroll); + } + + BOOL SetTabStops(int nTabStops, LPINT rgTabStops) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, EM_SETTABSTOPS, nTabStops, (LPARAM)rgTabStops); + } + + BOOL SetTabStops() + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, EM_SETTABSTOPS, 0, 0L); + } + + BOOL SetTabStops(const int& cxEachStop) // takes an 'int' + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, EM_SETTABSTOPS, 1, (LPARAM)(LPINT)&cxEachStop); + } + + void ScrollCaret() + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, EM_SCROLLCARET, 0, 0L); + } + + int Scroll(int nScrollAction) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT((GetStyle() & ES_MULTILINE) != 0); + LRESULT lRet = ::SendMessage(m_hWnd, EM_SCROLL, nScrollAction, 0L); + if(!(BOOL)HIWORD(lRet)) + return -1; // failed + return (int)(short)LOWORD(lRet); + + } + + void InsertText(int nInsertAfterChar, LPCTSTR lpstrText, BOOL bNoScroll = FALSE, BOOL bCanUndo = FALSE) + { + SetSel(nInsertAfterChar, nInsertAfterChar, bNoScroll); + ReplaceSel(lpstrText, bCanUndo); + } + + void AppendText(LPCTSTR lpstrText, BOOL bNoScroll = FALSE, BOOL bCanUndo = FALSE) + { + InsertText(GetWindowTextLength(), lpstrText, bNoScroll, bCanUndo); + } + +#if (_WIN32_WINNT >= 0x0501) + BOOL ShowBalloonTip(PEDITBALLOONTIP pEditBaloonTip) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, EM_SHOWBALLOONTIP, 0, (LPARAM)pEditBaloonTip); + } + + BOOL HideBalloonTip() + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, EM_HIDEBALLOONTIP, 0, 0L); + } +#endif // (_WIN32_WINNT >= 0x0501) + +#if (_WIN32_WINNT >= 0x0600) + DWORD GetHilite() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (DWORD)::SendMessage(m_hWnd, EM_GETHILITE, 0, 0L); + } + + void GetHilite(int& nStartChar, int& nEndChar) const + { + ATLASSERT(::IsWindow(m_hWnd)); + DWORD dwRet = (DWORD)::SendMessage(m_hWnd, EM_GETHILITE, 0, 0L); + nStartChar = (int)(short)LOWORD(dwRet); + nEndChar = (int)(short)HIWORD(dwRet); + } + + void SetHilite(int nStartChar, int nEndChar) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, EM_SETHILITE, nStartChar, nEndChar); + } +#endif // (_WIN32_WINNT >= 0x0600) + + // Clipboard operations + BOOL Undo() + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, EM_UNDO, 0, 0L); + } + + void Clear() + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, WM_CLEAR, 0, 0L); + } + + void Copy() + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, WM_COPY, 0, 0L); + } + + void Cut() + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, WM_CUT, 0, 0L); + } + + void Paste() + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, WM_PASTE, 0, 0L); + } + +#ifdef WIN32_PLATFORM_WFSP // SmartPhone only messages + DWORD GetExtendedStyle() + { + return SendMessage(EM_GETEXTENDEDSTYLE); + } + + DWORD SetExtendedStyle(DWORD dwMask, DWORD dwExStyle) + { + return SendMessage(EM_SETEXTENDEDSTYLE, (WPARAM)dwMask, (LPARAM)dwExStyle); + } + + DWORD GetInputMode(BOOL bCurrentMode = TRUE) + { + return SendMessage(EM_GETINPUTMODE, 0, (LPARAM)bCurrentMode); + } + + BOOL SetInputMode(DWORD dwMode) + { + return SendMessage(EM_SETINPUTMODE, 0, (LPARAM)dwMode); + } + + BOOL SetSymbols(LPCTSTR szSymbols) + { + return SendMessage(EM_SETSYMBOLS, 0, (LPARAM)szSymbols); + } + + BOOL ResetSymbols() + { + return SendMessage(EM_SETSYMBOLS); + } +#endif // WIN32_PLATFORM_WFSP +}; + +typedef CEditT CEdit; + + +/////////////////////////////////////////////////////////////////////////////// +// CEditCommands - message handlers for standard EDIT commands + +// Chain to CEditCommands message map. Your class must also derive from CEdit. +// Example: +// class CMyEdit : public CWindowImpl, +// public CEditCommands +// { +// public: +// BEGIN_MSG_MAP(CMyEdit) +// // your handlers... +// CHAIN_MSG_MAP_ALT(CEditCommands, 1) +// END_MSG_MAP() +// // other stuff... +// }; + +template +class CEditCommands +{ +public: + BEGIN_MSG_MAP(CEditCommands< T >) + ALT_MSG_MAP(1) + COMMAND_ID_HANDLER(ID_EDIT_CLEAR, OnEditClear) + COMMAND_ID_HANDLER(ID_EDIT_CLEAR_ALL, OnEditClearAll) + COMMAND_ID_HANDLER(ID_EDIT_COPY, OnEditCopy) + COMMAND_ID_HANDLER(ID_EDIT_CUT, OnEditCut) + COMMAND_ID_HANDLER(ID_EDIT_PASTE, OnEditPaste) + COMMAND_ID_HANDLER(ID_EDIT_SELECT_ALL, OnEditSelectAll) + COMMAND_ID_HANDLER(ID_EDIT_UNDO, OnEditUndo) + END_MSG_MAP() + + LRESULT OnEditClear(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) + { + T* pT = static_cast(this); + pT->Clear(); + return 0; + } + + LRESULT OnEditClearAll(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) + { + T* pT = static_cast(this); + pT->SetSel(0, -1); + pT->Clear(); + return 0; + } + + LRESULT OnEditCopy(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) + { + T* pT = static_cast(this); + pT->Copy(); + return 0; + } + + LRESULT OnEditCut(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) + { + T* pT = static_cast(this); + pT->Cut(); + return 0; + } + + LRESULT OnEditPaste(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) + { + T* pT = static_cast(this); + pT->Paste(); + return 0; + } + + LRESULT OnEditSelectAll(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) + { + T* pT = static_cast(this); + pT->SetSel(0, -1); + return 0; + } + + LRESULT OnEditUndo(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) + { + T* pT = static_cast(this); + pT->Undo(); + return 0; + } + +// State (update UI) helpers + BOOL CanCut() const + { return HasSelection(); } + + BOOL CanCopy() const + { return HasSelection(); } + + BOOL CanClear() const + { return HasSelection(); } + + BOOL CanSelectAll() const + { return HasText(); } + + BOOL CanFind() const + { return HasText(); } + + BOOL CanRepeat() const + { return HasText(); } + + BOOL CanReplace() const + { return HasText(); } + + BOOL CanClearAll() const + { return HasText(); } + +// Implementation + BOOL HasSelection() const + { + const T* pT = static_cast(this); + int nMin, nMax; + ::SendMessage(pT->m_hWnd, EM_GETSEL, (WPARAM)&nMin, (LPARAM)&nMax); + return (nMin != nMax); + } + + BOOL HasText() const + { + const T* pT = static_cast(this); + return (pT->GetWindowTextLength() > 0); + } +}; + + +/////////////////////////////////////////////////////////////////////////////// +// CScrollBar - client side for a Windows SCROLLBAR control + +template +class CScrollBarT : public TBase +{ +public: +// Constructors + CScrollBarT(HWND hWnd = NULL) : TBase(hWnd) + { } + + CScrollBarT< TBase >& operator =(HWND hWnd) + { + m_hWnd = hWnd; + return *this; + } + + HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, + DWORD dwStyle = 0, DWORD dwExStyle = 0, + ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) + { + return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); + } + +// Attributes + static LPCTSTR GetWndClassName() + { + return _T("SCROLLBAR"); + } + +#ifndef _WIN32_WCE + int GetScrollPos() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return ::GetScrollPos(m_hWnd, SB_CTL); + } +#endif // !_WIN32_WCE + + int SetScrollPos(int nPos, BOOL bRedraw = TRUE) + { + ATLASSERT(::IsWindow(m_hWnd)); + return ::SetScrollPos(m_hWnd, SB_CTL, nPos, bRedraw); + } + +#ifndef _WIN32_WCE + void GetScrollRange(LPINT lpMinPos, LPINT lpMaxPos) const + { + ATLASSERT(::IsWindow(m_hWnd)); + ::GetScrollRange(m_hWnd, SB_CTL, lpMinPos, lpMaxPos); + } +#endif // !_WIN32_WCE + + void SetScrollRange(int nMinPos, int nMaxPos, BOOL bRedraw = TRUE) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SetScrollRange(m_hWnd, SB_CTL, nMinPos, nMaxPos, bRedraw); + } + + BOOL GetScrollInfo(LPSCROLLINFO lpScrollInfo) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return ::GetScrollInfo(m_hWnd, SB_CTL, lpScrollInfo); + } + + int SetScrollInfo(LPSCROLLINFO lpScrollInfo, BOOL bRedraw = TRUE) + { + ATLASSERT(::IsWindow(m_hWnd)); + return ::SetScrollInfo(m_hWnd, SB_CTL, lpScrollInfo, bRedraw); + } + +#ifndef _WIN32_WCE + int GetScrollLimit() const + { + int nMin = 0, nMax = 0; + ::GetScrollRange(m_hWnd, SB_CTL, &nMin, &nMax); + SCROLLINFO info = { 0 }; + info.cbSize = sizeof(SCROLLINFO); + info.fMask = SIF_PAGE; + if(::GetScrollInfo(m_hWnd, SB_CTL, &info)) + nMax -= ((info.nPage - 1) > 0) ? (info.nPage - 1) : 0; + + return nMax; + } + +#if (WINVER >= 0x0500) + BOOL GetScrollBarInfo(PSCROLLBARINFO pScrollBarInfo) const + { + ATLASSERT(::IsWindow(m_hWnd)); +#if (_WIN32_WINNT >= 0x0501) + return (BOOL)::SendMessage(m_hWnd, SBM_GETSCROLLBARINFO, 0, (LPARAM)pScrollBarInfo); +#else // !(_WIN32_WINNT >= 0x0501) + return ::GetScrollBarInfo(m_hWnd, OBJID_CLIENT, pScrollBarInfo); +#endif // !(_WIN32_WINNT >= 0x0501) + } +#endif // (WINVER >= 0x0500) + +// Operations + void ShowScrollBar(BOOL bShow = TRUE) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::ShowScrollBar(m_hWnd, SB_CTL, bShow); + } + + BOOL EnableScrollBar(UINT nArrowFlags = ESB_ENABLE_BOTH) + { + ATLASSERT(::IsWindow(m_hWnd)); + return ::EnableScrollBar(m_hWnd, SB_CTL, nArrowFlags); + } +#endif // !_WIN32_WCE +}; + +typedef CScrollBarT CScrollBar; + + +// --- Windows Common Controls --- + +/////////////////////////////////////////////////////////////////////////////// +// CImageList + +class CImageList +{ +public: + HIMAGELIST m_hImageList; + +// Constructor + CImageList(HIMAGELIST hImageList = NULL) : m_hImageList(hImageList) + { } + +// Operators, etc. + CImageList& operator =(HIMAGELIST hImageList) + { + m_hImageList = hImageList; + return *this; + } + + operator HIMAGELIST() const { return m_hImageList; } + + void Attach(HIMAGELIST hImageList) + { + ATLASSERT(m_hImageList == NULL); + ATLASSERT(hImageList != NULL); + m_hImageList = hImageList; + } + + HIMAGELIST Detach() + { + HIMAGELIST hImageList = m_hImageList; + m_hImageList = NULL; + return hImageList; + } + + bool IsNull() const { return (m_hImageList == NULL); } + +// Attributes + int GetImageCount() const + { + ATLASSERT(m_hImageList != NULL); + return ImageList_GetImageCount(m_hImageList); + } + + COLORREF GetBkColor() const + { + ATLASSERT(m_hImageList != NULL); + return ImageList_GetBkColor(m_hImageList); + } + + COLORREF SetBkColor(COLORREF cr) + { + ATLASSERT(m_hImageList != NULL); + return ImageList_SetBkColor(m_hImageList, cr); + } + + BOOL GetImageInfo(int nImage, IMAGEINFO* pImageInfo) const + { + ATLASSERT(m_hImageList != NULL); + return ImageList_GetImageInfo(m_hImageList, nImage, pImageInfo); + } + + HICON GetIcon(int nIndex, UINT uFlags = ILD_NORMAL) const + { + ATLASSERT(m_hImageList != NULL); + return ImageList_GetIcon(m_hImageList, nIndex, uFlags); + } + + BOOL GetIconSize(int& cx, int& cy) const + { + ATLASSERT(m_hImageList != NULL); + return ImageList_GetIconSize(m_hImageList, &cx, &cy); + } + + BOOL GetIconSize(SIZE& size) const + { + ATLASSERT(m_hImageList != NULL); + return ImageList_GetIconSize(m_hImageList, (int*)&size.cx, (int*)&size.cy); + } + + BOOL SetIconSize(int cx, int cy) + { + ATLASSERT(m_hImageList != NULL); + return ImageList_SetIconSize(m_hImageList, cx, cy); + } + + BOOL SetIconSize(SIZE size) + { + ATLASSERT(m_hImageList != NULL); + return ImageList_SetIconSize(m_hImageList, size.cx, size.cy); + } + + BOOL SetImageCount(UINT uNewCount) + { + ATLASSERT(m_hImageList != NULL); + return ImageList_SetImageCount(m_hImageList, uNewCount); + } + + BOOL SetOverlayImage(int nImage, int nOverlay) + { + ATLASSERT(m_hImageList != NULL); + return ImageList_SetOverlayImage(m_hImageList, nImage, nOverlay); + } + +// Operations + BOOL Create(int cx, int cy, UINT nFlags, int nInitial, int nGrow) + { + ATLASSERT(m_hImageList == NULL); + m_hImageList = ImageList_Create(cx, cy, nFlags, nInitial, nGrow); + return (m_hImageList != NULL) ? TRUE : FALSE; + } + + BOOL Create(ATL::_U_STRINGorID bitmap, int cx, int nGrow, COLORREF crMask) + { + ATLASSERT(m_hImageList == NULL); + m_hImageList = ImageList_LoadBitmap(ModuleHelper::GetResourceInstance(), bitmap.m_lpstr, cx, nGrow, crMask); + return (m_hImageList != NULL) ? TRUE : FALSE; + } + + BOOL CreateFromImage(ATL::_U_STRINGorID image, int cx, int nGrow, COLORREF crMask, UINT uType, UINT uFlags = LR_DEFAULTCOLOR | LR_DEFAULTSIZE) + { + ATLASSERT(m_hImageList == NULL); + m_hImageList = ImageList_LoadImage(ModuleHelper::GetResourceInstance(), image.m_lpstr, cx, nGrow, crMask, uType, uFlags); + return (m_hImageList != NULL) ? TRUE : FALSE; + } + + BOOL Merge(HIMAGELIST hImageList1, int nImage1, HIMAGELIST hImageList2, int nImage2, int dx, int dy) + { + ATLASSERT(m_hImageList == NULL); + m_hImageList = ImageList_Merge(hImageList1, nImage1, hImageList2, nImage2, dx, dy); + return (m_hImageList != NULL) ? TRUE : FALSE; + } + +#ifndef _WIN32_WCE +#ifdef __IStream_INTERFACE_DEFINED__ + BOOL CreateFromStream(LPSTREAM lpStream) + { + ATLASSERT(m_hImageList == NULL); + m_hImageList = ImageList_Read(lpStream); + return (m_hImageList != NULL) ? TRUE : FALSE; + } +#endif // __IStream_INTERFACE_DEFINED__ +#endif // !_WIN32_WCE + + BOOL Destroy() + { + if (m_hImageList == NULL) + return FALSE; + BOOL bRet = ImageList_Destroy(m_hImageList); + if(bRet) + m_hImageList = NULL; + return bRet; + } + + int Add(HBITMAP hBitmap, HBITMAP hBitmapMask = NULL) + { + ATLASSERT(m_hImageList != NULL); + return ImageList_Add(m_hImageList, hBitmap, hBitmapMask); + } + + int Add(HBITMAP hBitmap, COLORREF crMask) + { + ATLASSERT(m_hImageList != NULL); + return ImageList_AddMasked(m_hImageList, hBitmap, crMask); + } + + BOOL Remove(int nImage) + { + ATLASSERT(m_hImageList != NULL); + return ImageList_Remove(m_hImageList, nImage); + } + + BOOL RemoveAll() + { + ATLASSERT(m_hImageList != NULL); + return ImageList_RemoveAll(m_hImageList); + } + + BOOL Replace(int nImage, HBITMAP hBitmap, HBITMAP hBitmapMask) + { + ATLASSERT(m_hImageList != NULL); + return ImageList_Replace(m_hImageList, nImage, hBitmap, hBitmapMask); + } + + int AddIcon(HICON hIcon) + { + ATLASSERT(m_hImageList != NULL); + return ImageList_AddIcon(m_hImageList, hIcon); + } + + int ReplaceIcon(int nImage, HICON hIcon) + { + ATLASSERT(m_hImageList != NULL); + return ImageList_ReplaceIcon(m_hImageList, nImage, hIcon); + } + + HICON ExtractIcon(int nImage) + { + ATLASSERT(m_hImageList != NULL); + return ImageList_ExtractIcon(NULL, m_hImageList, nImage); + } + + BOOL Draw(HDC hDC, int nImage, int x, int y, UINT nStyle) + { + ATLASSERT(m_hImageList != NULL); + ATLASSERT(hDC != NULL); + return ImageList_Draw(m_hImageList, nImage, hDC, x, y, nStyle); + } + + BOOL Draw(HDC hDC, int nImage, POINT pt, UINT nStyle) + { + ATLASSERT(m_hImageList != NULL); + ATLASSERT(hDC != NULL); + return ImageList_Draw(m_hImageList, nImage, hDC, pt.x, pt.y, nStyle); + } + + BOOL DrawEx(int nImage, HDC hDC, int x, int y, int dx, int dy, COLORREF rgbBk, COLORREF rgbFg, UINT fStyle) + { + ATLASSERT(m_hImageList != NULL); + ATLASSERT(hDC != NULL); + return ImageList_DrawEx(m_hImageList, nImage, hDC, x, y, dx, dy, rgbBk, rgbFg, fStyle); + } + + BOOL DrawEx(int nImage, HDC hDC, RECT& rect, COLORREF rgbBk, COLORREF rgbFg, UINT fStyle) + { + ATLASSERT(m_hImageList != NULL); + ATLASSERT(hDC != NULL); + return ImageList_DrawEx(m_hImageList, nImage, hDC, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, rgbBk, rgbFg, fStyle); + } + + static BOOL DrawIndirect(IMAGELISTDRAWPARAMS* pimldp) + { + return ImageList_DrawIndirect(pimldp); + } + + BOOL Copy(int nSrc, int nDst, UINT uFlags = ILCF_MOVE) + { + ATLASSERT(m_hImageList != NULL); + return ImageList_Copy(m_hImageList, nDst, m_hImageList, nSrc, uFlags); + } + +#ifdef __IStream_INTERFACE_DEFINED__ +#ifndef _WIN32_WCE + static HIMAGELIST Read(LPSTREAM lpStream) + { + return ImageList_Read(lpStream); + } + + BOOL Write(LPSTREAM lpStream) + { + ATLASSERT(m_hImageList != NULL); + return ImageList_Write(m_hImageList, lpStream); + } +#endif // !_WIN32_WCE + +#if (_WIN32_WINNT >= 0x0501) + static HRESULT ReadEx(DWORD dwFlags, LPSTREAM lpStream, REFIID riid, PVOID* ppv) + { + return ImageList_ReadEx(dwFlags, lpStream, riid, ppv); + } + + HRESULT WriteEx(DWORD dwFlags, LPSTREAM lpStream) + { + ATLASSERT(m_hImageList != NULL); + return ImageList_WriteEx(m_hImageList, dwFlags, lpStream); + } +#endif // (_WIN32_WINNT >= 0x0501) +#endif // __IStream_INTERFACE_DEFINED__ + + // Drag operations + BOOL BeginDrag(int nImage, POINT ptHotSpot) + { + ATLASSERT(m_hImageList != NULL); + return ImageList_BeginDrag(m_hImageList, nImage, ptHotSpot.x, ptHotSpot.y); + } + + BOOL BeginDrag(int nImage, int xHotSpot, int yHotSpot) + { + ATLASSERT(m_hImageList != NULL); + return ImageList_BeginDrag(m_hImageList, nImage, xHotSpot, yHotSpot); + } + + static void EndDrag() + { + ImageList_EndDrag(); + } + + static BOOL DragMove(POINT pt) + { + return ImageList_DragMove(pt.x, pt.y); + } + + static BOOL DragMove(int x, int y) + { + return ImageList_DragMove(x, y); + } + + BOOL SetDragCursorImage(int nDrag, POINT ptHotSpot) + { + ATLASSERT(m_hImageList != NULL); + return ImageList_SetDragCursorImage(m_hImageList, nDrag, ptHotSpot.x, ptHotSpot.y); + } + + BOOL SetDragCursorImage(int nDrag, int xHotSpot, int yHotSpot) + { + ATLASSERT(m_hImageList != NULL); + return ImageList_SetDragCursorImage(m_hImageList, nDrag, xHotSpot, yHotSpot); + } + + static BOOL DragShowNolock(BOOL bShow = TRUE) + { + return ImageList_DragShowNolock(bShow); + } + + static CImageList GetDragImage(LPPOINT lpPoint, LPPOINT lpPointHotSpot) + { + return CImageList(ImageList_GetDragImage(lpPoint, lpPointHotSpot)); + } + + static BOOL DragEnter(HWND hWnd, POINT point) + { + return ImageList_DragEnter(hWnd, point.x, point.y); + } + + static BOOL DragEnter(HWND hWnd, int x, int y) + { + return ImageList_DragEnter(hWnd, x, y); + } + + static BOOL DragLeave(HWND hWnd) + { + return ImageList_DragLeave(hWnd); + } + +#if (_WIN32_IE >= 0x0400) + CImageList Duplicate() const + { + ATLASSERT(m_hImageList != NULL); + return CImageList(ImageList_Duplicate(m_hImageList)); + } + + static CImageList Duplicate(HIMAGELIST hImageList) + { + ATLASSERT(hImageList != NULL); + return CImageList(ImageList_Duplicate(hImageList)); + } +#endif // (_WIN32_IE >= 0x0400) +}; + + +/////////////////////////////////////////////////////////////////////////////// +// CToolTipCtrl + +#ifndef _WIN32_WCE + +class CToolInfo : public TOOLINFO +{ +public: + CToolInfo(UINT nFlags, HWND hWnd, UINT nIDTool = 0, LPRECT lpRect = NULL, LPTSTR lpstrText = LPSTR_TEXTCALLBACK, LPARAM lUserParam = NULL) + { + Init(nFlags, hWnd, nIDTool, lpRect, lpstrText, lUserParam); + } + + operator LPTOOLINFO() { return this; } + + operator LPARAM() { return (LPARAM)this; } + + void Init(UINT nFlags, HWND hWnd, UINT nIDTool = 0, LPRECT lpRect = NULL, LPTSTR lpstrText = LPSTR_TEXTCALLBACK, LPARAM lUserParam = NULL) + { + ATLASSERT(::IsWindow(hWnd)); + memset(this, 0, sizeof(TOOLINFO)); + cbSize = sizeof(TOOLINFO); + uFlags = nFlags; + if(nIDTool == 0) + { + hwnd = ::GetParent(hWnd); + uFlags |= TTF_IDISHWND; + uId = (UINT_PTR)hWnd; + } + else + { + hwnd = hWnd; + uId = nIDTool; + } + if(lpRect != NULL) + rect = *lpRect; + hinst = ModuleHelper::GetResourceInstance(); + lpszText = lpstrText; + lParam = lUserParam; + } +}; + +template +class CToolTipCtrlT : public TBase +{ +public: +// Constructors + CToolTipCtrlT(HWND hWnd = NULL) : TBase(hWnd) + { } + + CToolTipCtrlT< TBase >& operator =(HWND hWnd) + { + m_hWnd = hWnd; + return *this; + } + + HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, + DWORD dwStyle = 0, DWORD dwExStyle = 0, + ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) + { + return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); + } + +// Attributes + static LPCTSTR GetWndClassName() + { + return TOOLTIPS_CLASS; + } + + void GetText(LPTOOLINFO lpToolInfo) const + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, TTM_GETTEXT, 0, (LPARAM)&lpToolInfo); + } + + void GetText(LPTSTR lpstrText, HWND hWnd, UINT nIDTool = 0) const + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(hWnd != NULL); + CToolInfo ti(0, hWnd, nIDTool, NULL, lpstrText); + ::SendMessage(m_hWnd, TTM_GETTEXT, 0, ti); + } + + BOOL GetToolInfo(LPTOOLINFO lpToolInfo) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TTM_GETTOOLINFO, 0, (LPARAM)lpToolInfo); + } + + BOOL GetToolInfo(HWND hWnd, UINT nIDTool, UINT* puFlags, LPRECT lpRect, LPTSTR lpstrText) const + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(hWnd != NULL); + ATLASSERT(puFlags != NULL); + ATLASSERT(lpRect != NULL); + CToolInfo ti(0, hWnd, nIDTool, NULL, lpstrText); + BOOL bRet = (BOOL)::SendMessage(m_hWnd, TTM_GETTOOLINFO, 0, ti); + if(bRet != FALSE) + { + *puFlags = ti.uFlags; + *lpRect = ti.rect; + } + return bRet; + } + + void SetToolInfo(LPTOOLINFO lpToolInfo) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, TTM_SETTOOLINFO, 0, (LPARAM)lpToolInfo); + } + + void SetToolRect(LPTOOLINFO lpToolInfo) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, TTM_NEWTOOLRECT, 0, (LPARAM)lpToolInfo); + } + + void SetToolRect(HWND hWnd, UINT nIDTool, LPCRECT lpRect) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(hWnd != NULL); + ATLASSERT(nIDTool != 0); + + CToolInfo ti(0, hWnd, nIDTool, (LPRECT)lpRect, NULL); + ::SendMessage(m_hWnd, TTM_NEWTOOLRECT, 0, ti); + } + + int GetToolCount() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, TTM_GETTOOLCOUNT, 0, 0L); + } + + int GetDelayTime(DWORD dwType) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, TTM_GETDELAYTIME, dwType, 0L); + } + + void SetDelayTime(DWORD dwType, int nTime) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, TTM_SETDELAYTIME, dwType, MAKELPARAM(nTime, 0)); + } + + void GetMargin(LPRECT lpRect) const + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, TTM_GETMARGIN, 0, (LPARAM)lpRect); + } + + void SetMargin(LPRECT lpRect) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, TTM_SETMARGIN, 0, (LPARAM)lpRect); + } + + int GetMaxTipWidth() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, TTM_GETMAXTIPWIDTH, 0, 0L); + } + + int SetMaxTipWidth(int nWidth) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, TTM_SETMAXTIPWIDTH, 0, nWidth); + } + + COLORREF GetTipBkColor() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (COLORREF)::SendMessage(m_hWnd, TTM_GETTIPBKCOLOR, 0, 0L); + } + + void SetTipBkColor(COLORREF clr) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, TTM_SETTIPBKCOLOR, (WPARAM)clr, 0L); + } + + COLORREF GetTipTextColor() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (COLORREF)::SendMessage(m_hWnd, TTM_GETTIPTEXTCOLOR, 0, 0L); + } + + void SetTipTextColor(COLORREF clr) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, TTM_SETTIPTEXTCOLOR, (WPARAM)clr, 0L); + } + + BOOL GetCurrentTool(LPTOOLINFO lpToolInfo) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TTM_GETCURRENTTOOL, 0, (LPARAM)lpToolInfo); + } + +#if (_WIN32_IE >= 0x0500) + SIZE GetBubbleSize(LPTOOLINFO lpToolInfo) const + { + ATLASSERT(::IsWindow(m_hWnd)); + DWORD dwRet = (DWORD)::SendMessage(m_hWnd, TTM_GETBUBBLESIZE, 0, (LPARAM)lpToolInfo); + SIZE size = { GET_X_LPARAM(dwRet), GET_Y_LPARAM(dwRet) }; + return size; + } + + BOOL SetTitle(UINT uIcon, LPCTSTR lpstrTitle) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TTM_SETTITLE, uIcon, (LPARAM)lpstrTitle); + } +#endif // (_WIN32_IE >= 0x0500) + +#if (_WIN32_WINNT >= 0x0501) + void GetTitle(PTTGETTITLE pTTGetTitle) const + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, TTM_GETTITLE, 0, (LPARAM)pTTGetTitle); + } + + void SetWindowTheme(LPCWSTR lpstrTheme) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, TTM_SETWINDOWTHEME, 0, (LPARAM)lpstrTheme); + } +#endif // (_WIN32_WINNT >= 0x0501) + +// Operations + void Activate(BOOL bActivate) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, TTM_ACTIVATE, bActivate, 0L); + } + + BOOL AddTool(LPTOOLINFO lpToolInfo) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TTM_ADDTOOL, 0, (LPARAM)lpToolInfo); + } + + BOOL AddTool(HWND hWnd, ATL::_U_STRINGorID text = LPSTR_TEXTCALLBACK, LPCRECT lpRectTool = NULL, UINT nIDTool = 0) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(hWnd != NULL); + // the toolrect and toolid must both be zero or both valid + ATLASSERT((lpRectTool != NULL && nIDTool != 0) || (lpRectTool == NULL && nIDTool == 0)); + + CToolInfo ti(0, hWnd, nIDTool, (LPRECT)lpRectTool, (LPTSTR)text.m_lpstr); + return (BOOL)::SendMessage(m_hWnd, TTM_ADDTOOL, 0, ti); + } + + void DelTool(LPTOOLINFO lpToolInfo) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, TTM_DELTOOL, 0, (LPARAM)lpToolInfo); + } + + void DelTool(HWND hWnd, UINT nIDTool = 0) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(hWnd != NULL); + + CToolInfo ti(0, hWnd, nIDTool, NULL, NULL); + ::SendMessage(m_hWnd, TTM_DELTOOL, 0, ti); + } + + BOOL HitTest(LPTTHITTESTINFO lpHitTestInfo) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TTM_HITTEST, 0, (LPARAM)lpHitTestInfo); + } + + BOOL HitTest(HWND hWnd, POINT pt, LPTOOLINFO lpToolInfo) const + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(hWnd != NULL); + ATLASSERT(lpToolInfo != NULL); + + TTHITTESTINFO hti = { 0 }; + hti.ti.cbSize = sizeof(TOOLINFO); + hti.hwnd = hWnd; + hti.pt.x = pt.x; + hti.pt.y = pt.y; + if((BOOL)::SendMessage(m_hWnd, TTM_HITTEST, 0, (LPARAM)&hti) != FALSE) + { + *lpToolInfo = hti.ti; + return TRUE; + } + return FALSE; + } + + void RelayEvent(LPMSG lpMsg) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, TTM_RELAYEVENT, 0, (LPARAM)lpMsg); + } + + void UpdateTipText(LPTOOLINFO lpToolInfo) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, TTM_UPDATETIPTEXT, 0, (LPARAM)lpToolInfo); + } + + void UpdateTipText(ATL::_U_STRINGorID text, HWND hWnd, UINT nIDTool = 0) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(hWnd != NULL); + + CToolInfo ti(0, hWnd, nIDTool, NULL, (LPTSTR)text.m_lpstr); + ::SendMessage(m_hWnd, TTM_UPDATETIPTEXT, 0, ti); + } + + BOOL EnumTools(UINT nTool, LPTOOLINFO lpToolInfo) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TTM_ENUMTOOLS, nTool, (LPARAM)lpToolInfo); + } + + void Pop() + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, TTM_POP, 0, 0L); + } + + void TrackActivate(LPTOOLINFO lpToolInfo, BOOL bActivate) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, TTM_TRACKACTIVATE, bActivate, (LPARAM)lpToolInfo); + } + + void TrackPosition(int xPos, int yPos) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, TTM_TRACKPOSITION, 0, MAKELPARAM(xPos, yPos)); + } + +#if (_WIN32_IE >= 0x0400) + void Update() + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, TTM_UPDATE, 0, 0L); + } +#endif // (_WIN32_IE >= 0x0400) + +#if (_WIN32_IE >= 0x0500) + BOOL AdjustRect(LPRECT lpRect, BOOL bLarger /*= TRUE*/) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TTM_ADJUSTRECT, bLarger, (LPARAM)lpRect); + } +#endif // (_WIN32_IE >= 0x0500) + +#if (_WIN32_WINNT >= 0x0501) + void Popup() + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, TTM_POPUP, 0, 0L); + } +#endif // (_WIN32_WINNT >= 0x0501) +}; + +typedef CToolTipCtrlT CToolTipCtrl; + +#endif // !_WIN32_WCE + + +/////////////////////////////////////////////////////////////////////////////// +// CHeaderCtrl + +template +class CHeaderCtrlT : public TBase +{ +public: +// Constructors + CHeaderCtrlT(HWND hWnd = NULL) : TBase(hWnd) + { } + + CHeaderCtrlT< TBase >& operator =(HWND hWnd) + { + m_hWnd = hWnd; + return *this; + } + + HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, + DWORD dwStyle = 0, DWORD dwExStyle = 0, + ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) + { + return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); + } + +// Attributes + static LPCTSTR GetWndClassName() + { + return WC_HEADER; + } + + int GetItemCount() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, HDM_GETITEMCOUNT, 0, 0L); + } + + BOOL GetItem(int nIndex, LPHDITEM pHeaderItem) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, HDM_GETITEM, nIndex, (LPARAM)pHeaderItem); + } + + BOOL SetItem(int nIndex, LPHDITEM pHeaderItem) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, HDM_SETITEM, nIndex, (LPARAM)pHeaderItem); + } + + CImageList GetImageList() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return CImageList((HIMAGELIST)::SendMessage(m_hWnd, HDM_GETIMAGELIST, 0, 0L)); + } + + CImageList SetImageList(HIMAGELIST hImageList) + { + ATLASSERT(::IsWindow(m_hWnd)); + return CImageList((HIMAGELIST)::SendMessage(m_hWnd, HDM_SETIMAGELIST, 0, (LPARAM)hImageList)); + } + + BOOL GetOrderArray(int nSize, int* lpnArray) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, HDM_GETORDERARRAY, nSize, (LPARAM)lpnArray); + } + + BOOL SetOrderArray(int nSize, int* lpnArray) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, HDM_SETORDERARRAY, nSize, (LPARAM)lpnArray); + } + + BOOL GetItemRect(int nIndex, LPRECT lpItemRect) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, HDM_GETITEMRECT, nIndex, (LPARAM)lpItemRect); + } + + int SetHotDivider(BOOL bPos, DWORD dwInputValue) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, HDM_SETHOTDIVIDER, bPos, dwInputValue); + } + +#if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) + BOOL GetUnicodeFormat() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, HDM_GETUNICODEFORMAT, 0, 0L); + } + + BOOL SetUnicodeFormat(BOOL bUnicode = TRUE) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, HDM_SETUNICODEFORMAT, bUnicode, 0L); + } +#endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) + +#if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) + int GetBitmapMargin() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, HDM_GETBITMAPMARGIN, 0, 0L); + } + + int SetBitmapMargin(int nWidth) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, HDM_SETBITMAPMARGIN, nWidth, 0L); + } + + int SetFilterChangeTimeout(DWORD dwTimeOut) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, HDM_SETFILTERCHANGETIMEOUT, 0, dwTimeOut); + } +#endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) + +#if (_WIN32_WINNT >= 0x0600) + BOOL GetItemDropDownRect(int nIndex, LPRECT lpRect) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, HDM_GETITEMDROPDOWNRECT, nIndex, (LPARAM)lpRect); + } + + BOOL GetOverflowRect(LPRECT lpRect) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, HDM_GETOVERFLOWRECT, 0, (LPARAM)lpRect); + } + + int GetFocusedItem() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, HDM_GETFOCUSEDITEM, 0, 0L); + } + + BOOL SetFocusedItem(int nIndex) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, HDM_SETFOCUSEDITEM, 0, nIndex); + } +#endif // (_WIN32_WINNT >= 0x0600) + +// Operations + int InsertItem(int nIndex, LPHDITEM phdi) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, HDM_INSERTITEM, nIndex, (LPARAM)phdi); + } + + int AddItem(LPHDITEM phdi) + { + return InsertItem(GetItemCount(), phdi); + } + + BOOL DeleteItem(int nIndex) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, HDM_DELETEITEM, nIndex, 0L); + } + + BOOL Layout(HD_LAYOUT* pHeaderLayout) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, HDM_LAYOUT, 0, (LPARAM)pHeaderLayout); + } + + int HitTest(LPHDHITTESTINFO lpHitTestInfo) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, HDM_HITTEST, 0, (LPARAM)lpHitTestInfo); + } + + int OrderToIndex(int nOrder) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, HDM_ORDERTOINDEX, nOrder, 0L); + } + + CImageList CreateDragImage(int nIndex) + { + ATLASSERT(::IsWindow(m_hWnd)); + return CImageList((HIMAGELIST)::SendMessage(m_hWnd, HDM_CREATEDRAGIMAGE, nIndex, 0L)); + } + +#if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) + int EditFilter(int nColumn, BOOL bDiscardChanges) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, HDM_EDITFILTER, nColumn, MAKELPARAM(bDiscardChanges, 0)); + } + + int ClearFilter(int nColumn) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, HDM_CLEARFILTER, nColumn, 0L); + } + + int ClearAllFilters() + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, HDM_CLEARFILTER, (WPARAM)-1, 0L); + } +#endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) +}; + +typedef CHeaderCtrlT CHeaderCtrl; + + +/////////////////////////////////////////////////////////////////////////////// +// CListViewCtrl + +template +class CListViewCtrlT : public TBase +{ +public: +// Constructors + CListViewCtrlT(HWND hWnd = NULL) : TBase(hWnd) + { } + + CListViewCtrlT< TBase >& operator =(HWND hWnd) + { + m_hWnd = hWnd; + return *this; + } + + HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, + DWORD dwStyle = 0, DWORD dwExStyle = 0, + ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) + { + return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); + } + +// Attributes + static LPCTSTR GetWndClassName() + { + return WC_LISTVIEW; + } + + COLORREF GetBkColor() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (COLORREF)::SendMessage(m_hWnd, LVM_GETBKCOLOR, 0, 0L); + } + + BOOL SetBkColor(COLORREF cr) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, LVM_SETBKCOLOR, 0, cr); + } + + CImageList GetImageList(int nImageListType) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return CImageList((HIMAGELIST)::SendMessage(m_hWnd, LVM_GETIMAGELIST, nImageListType, 0L)); + } + + CImageList SetImageList(HIMAGELIST hImageList, int nImageList) + { + ATLASSERT(::IsWindow(m_hWnd)); + return CImageList((HIMAGELIST)::SendMessage(m_hWnd, LVM_SETIMAGELIST, nImageList, (LPARAM)hImageList)); + } + + int GetItemCount() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, LVM_GETITEMCOUNT, 0, 0L); + } + + BOOL SetItemCount(int nItems) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, LVM_SETITEMCOUNT, nItems, 0L); + } + + BOOL GetItem(LPLVITEM pItem) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, LVM_GETITEM, 0, (LPARAM)pItem); + } + + BOOL SetItem(const LVITEM* pItem) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, LVM_SETITEM, 0, (LPARAM)pItem); + } + + BOOL SetItem(int nItem, int nSubItem, UINT nMask, LPCTSTR lpszItem, + int nImage, UINT nState, UINT nStateMask, LPARAM lParam) + { + ATLASSERT(::IsWindow(m_hWnd)); + LVITEM lvi = { 0 }; + lvi.mask = nMask; + lvi.iItem = nItem; + lvi.iSubItem = nSubItem; + lvi.stateMask = nStateMask; + lvi.state = nState; + lvi.pszText = (LPTSTR) lpszItem; + lvi.iImage = nImage; + lvi.lParam = lParam; + return (BOOL)::SendMessage(m_hWnd, LVM_SETITEM, 0, (LPARAM)&lvi); + } + + UINT GetItemState(int nItem, UINT nMask) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (UINT)::SendMessage(m_hWnd, LVM_GETITEMSTATE, nItem, nMask); + } + + BOOL SetItemState(int nItem, UINT nState, UINT nStateMask) + { + ATLASSERT(::IsWindow(m_hWnd)); + LVITEM lvi = { 0 }; + lvi.state = nState; + lvi.stateMask = nStateMask; + return (BOOL)::SendMessage(m_hWnd, LVM_SETITEMSTATE, nItem, (LPARAM)&lvi); + } + + BOOL SetItemState(int nItem, LPLVITEM pItem) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, LVM_SETITEMSTATE, nItem, (LPARAM)pItem); + } + +#ifndef _ATL_NO_COM + BOOL GetItemText(int nItem, int nSubItem, BSTR& bstrText) const + { + USES_CONVERSION; + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(bstrText == NULL); + LVITEM lvi = { 0 }; + lvi.iSubItem = nSubItem; + + LPTSTR lpstrText = NULL; + int nRes = 0; + for(int nLen = 256; ; nLen *= 2) + { + ATLTRY(lpstrText = new TCHAR[nLen]); + if(lpstrText == NULL) + break; + lpstrText[0] = NULL; + lvi.cchTextMax = nLen; + lvi.pszText = lpstrText; + nRes = (int)::SendMessage(m_hWnd, LVM_GETITEMTEXT, (WPARAM)nItem, (LPARAM)&lvi); + if(nRes < nLen - 1) + break; + delete [] lpstrText; + lpstrText = NULL; + } + + if(lpstrText != NULL) + { + if(nRes != 0) + bstrText = ::SysAllocString(T2OLE(lpstrText)); + delete [] lpstrText; + } + + return (bstrText != NULL) ? TRUE : FALSE; + } +#endif // !_ATL_NO_COM + +#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) + int GetItemText(int nItem, int nSubItem, _CSTRING_NS::CString& strText) const + { + ATLASSERT(::IsWindow(m_hWnd)); + LVITEM lvi = { 0 }; + lvi.iSubItem = nSubItem; + + strText.Empty(); + int nRes = 0; + for(int nLen = 256; ; nLen *= 2) + { + lvi.cchTextMax = nLen; + lvi.pszText = strText.GetBufferSetLength(nLen); + if(lvi.pszText == NULL) + { + nRes = 0; + break; + } + nRes = (int)::SendMessage(m_hWnd, LVM_GETITEMTEXT, (WPARAM)nItem, (LPARAM)&lvi); + if(nRes < nLen - 1) + break; + } + strText.ReleaseBuffer(); + return nRes; + } +#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) + + int GetItemText(int nItem, int nSubItem, LPTSTR lpszText, int nLen) const + { + ATLASSERT(::IsWindow(m_hWnd)); + LVITEM lvi = { 0 }; + lvi.iSubItem = nSubItem; + lvi.cchTextMax = nLen; + lvi.pszText = lpszText; + return (int)::SendMessage(m_hWnd, LVM_GETITEMTEXT, (WPARAM)nItem, (LPARAM)&lvi); + } + + BOOL SetItemText(int nItem, int nSubItem, LPCTSTR lpszText) + { + ATLASSERT(::IsWindow(m_hWnd)); + return SetItem(nItem, nSubItem, LVIF_TEXT, lpszText, 0, 0, 0, 0); + } + + DWORD_PTR GetItemData(int nItem) const + { + ATLASSERT(::IsWindow(m_hWnd)); + LVITEM lvi = { 0 }; + lvi.iItem = nItem; + lvi.mask = LVIF_PARAM; + BOOL bRet = (BOOL)::SendMessage(m_hWnd, LVM_GETITEM, 0, (LPARAM)&lvi); + return (DWORD_PTR)(bRet ? lvi.lParam : NULL); + } + + BOOL SetItemData(int nItem, DWORD_PTR dwData) + { + ATLASSERT(::IsWindow(m_hWnd)); + return SetItem(nItem, 0, LVIF_PARAM, NULL, 0, 0, 0, (LPARAM)dwData); + } + + UINT GetCallbackMask() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (UINT)::SendMessage(m_hWnd, LVM_GETCALLBACKMASK, 0, 0L); + } + + BOOL SetCallbackMask(UINT nMask) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, LVM_SETCALLBACKMASK, nMask, 0L); + } + + BOOL GetItemPosition(int nItem, LPPOINT lpPoint) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, LVM_GETITEMPOSITION, nItem, (LPARAM)lpPoint); + } + + BOOL SetItemPosition(int nItem, POINT pt) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(((GetStyle() & LVS_TYPEMASK) == LVS_ICON) || ((GetStyle() & LVS_TYPEMASK) == LVS_SMALLICON)); + return (BOOL)::SendMessage(m_hWnd, LVM_SETITEMPOSITION32, nItem, (LPARAM)&pt); + } + + BOOL SetItemPosition(int nItem, int x, int y) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(((GetStyle() & LVS_TYPEMASK) == LVS_ICON) || ((GetStyle() & LVS_TYPEMASK) == LVS_SMALLICON)); + POINT pt = { x, y }; + return (BOOL)::SendMessage(m_hWnd, LVM_SETITEMPOSITION32, nItem, (LPARAM)&pt); + } + + int GetStringWidth(LPCTSTR lpsz) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, LVM_GETSTRINGWIDTH, 0, (LPARAM)lpsz); + } + + CEdit GetEditControl() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return CEdit((HWND)::SendMessage(m_hWnd, LVM_GETEDITCONTROL, 0, 0L)); + } + + BOOL GetColumn(int nCol, LVCOLUMN* pColumn) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, LVM_GETCOLUMN, nCol, (LPARAM)pColumn); + } + + BOOL SetColumn(int nCol, const LVCOLUMN* pColumn) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, LVM_SETCOLUMN, nCol, (LPARAM)pColumn); + } + + int GetColumnWidth(int nCol) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, LVM_GETCOLUMNWIDTH, nCol, 0L); + } + + BOOL SetColumnWidth(int nCol, int cx) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, LVM_SETCOLUMNWIDTH, nCol, MAKELPARAM(cx, 0)); + } + + BOOL GetViewRect(LPRECT lpRect) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, LVM_GETVIEWRECT, 0, (LPARAM)lpRect); + } + + COLORREF GetTextColor() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (COLORREF)::SendMessage(m_hWnd, LVM_GETTEXTCOLOR, 0, 0L); + } + + BOOL SetTextColor(COLORREF cr) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, LVM_SETTEXTCOLOR, 0, cr); + } + + COLORREF GetTextBkColor() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (COLORREF)::SendMessage(m_hWnd, LVM_GETTEXTBKCOLOR, 0, 0L); + } + + BOOL SetTextBkColor(COLORREF cr) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, LVM_SETTEXTBKCOLOR, 0, cr); + } + + int GetTopIndex() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, LVM_GETTOPINDEX, 0, 0L); + } + + int GetCountPerPage() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, LVM_GETCOUNTPERPAGE, 0, 0L); + } + + BOOL GetOrigin(LPPOINT lpPoint) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, LVM_GETORIGIN, 0, (LPARAM)lpPoint); + } + + UINT GetSelectedCount() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (UINT)::SendMessage(m_hWnd, LVM_GETSELECTEDCOUNT, 0, 0L); + } + + BOOL GetItemRect(int nItem, LPRECT lpRect, UINT nCode) const + { + ATLASSERT(::IsWindow(m_hWnd)); + lpRect->left = nCode; + return (BOOL)::SendMessage(m_hWnd, LVM_GETITEMRECT, (WPARAM)nItem, (LPARAM)lpRect); + } + +#ifndef _WIN32_WCE + HCURSOR GetHotCursor() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (HCURSOR)::SendMessage(m_hWnd, LVM_GETHOTCURSOR, 0, 0L); + } + + HCURSOR SetHotCursor(HCURSOR hHotCursor) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (HCURSOR)::SendMessage(m_hWnd, LVM_SETHOTCURSOR, 0, (LPARAM)hHotCursor); + } + + int GetHotItem() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, LVM_GETHOTITEM, 0, 0L); + } + + int SetHotItem(int nIndex) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, LVM_SETHOTITEM, nIndex, 0L); + } +#endif // !_WIN32_WCE + + BOOL GetColumnOrderArray(int nCount, int* lpnArray) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, LVM_GETCOLUMNORDERARRAY, nCount, (LPARAM)lpnArray); + } + + BOOL SetColumnOrderArray(int nCount, int* lpnArray) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, LVM_SETCOLUMNORDERARRAY, nCount, (LPARAM)lpnArray); + } + + CHeaderCtrl GetHeader() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return CHeaderCtrl((HWND)::SendMessage(m_hWnd, LVM_GETHEADER, 0, 0L)); + } + + BOOL GetSubItemRect(int nItem, int nSubItem, int nFlag, LPRECT lpRect) const + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT((GetStyle() & LVS_TYPEMASK) == LVS_REPORT); + ATLASSERT(lpRect != NULL); + lpRect->top = nSubItem; + lpRect->left = nFlag; + return (BOOL)::SendMessage(m_hWnd, LVM_GETSUBITEMRECT, nItem, (LPARAM)lpRect); + } + + DWORD SetIconSpacing(int cx, int cy) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT((GetStyle() & LVS_TYPEMASK) == LVS_ICON); + return (DWORD)::SendMessage(m_hWnd, LVM_SETICONSPACING, 0, MAKELPARAM(cx, cy)); + } + + int GetISearchString(LPTSTR lpstr) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, LVM_GETISEARCHSTRING, 0, (LPARAM)lpstr); + } + + void GetItemSpacing(SIZE& sizeSpacing, BOOL bSmallIconView = FALSE) const + { + ATLASSERT(::IsWindow(m_hWnd)); + DWORD dwRet = (DWORD)::SendMessage(m_hWnd, LVM_GETITEMSPACING, bSmallIconView, 0L); + sizeSpacing.cx = GET_X_LPARAM(dwRet); + sizeSpacing.cy = GET_Y_LPARAM(dwRet); + } + +#if (_WIN32_WCE >= 410) + void SetItemSpacing(INT cySpacing) + { + ATLASSERT(::IsWindow(m_hWnd)); + ListView_SetItemSpacing(m_hWnd, cySpacing); + } +#endif // (_WIN32_WCE >= 410) + + // single-selection only + int GetSelectedIndex() const + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT((GetStyle() & LVS_SINGLESEL) != 0); + return (int)::SendMessage(m_hWnd, LVM_GETNEXTITEM, (WPARAM)-1, MAKELPARAM(LVNI_ALL | LVNI_SELECTED, 0)); + } + + BOOL GetSelectedItem(LPLVITEM pItem) const + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT((GetStyle() & LVS_SINGLESEL) != 0); + ATLASSERT(pItem != NULL); + pItem->iItem = (int)::SendMessage(m_hWnd, LVM_GETNEXTITEM, (WPARAM)-1, MAKELPARAM(LVNI_ALL | LVNI_SELECTED, 0)); + if(pItem->iItem == -1) + return FALSE; + return (BOOL)::SendMessage(m_hWnd, LVM_GETITEM, 0, (LPARAM)pItem); + } + + // extended list view styles + DWORD GetExtendedListViewStyle() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (DWORD)::SendMessage(m_hWnd, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0L); + } + + // dwExMask = 0 means all styles + DWORD SetExtendedListViewStyle(DWORD dwExStyle, DWORD dwExMask = 0) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (DWORD)::SendMessage(m_hWnd, LVM_SETEXTENDEDLISTVIEWSTYLE, dwExMask, dwExStyle); + } + + // checkboxes only + BOOL GetCheckState(int nIndex) const + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT((GetExtendedListViewStyle() & LVS_EX_CHECKBOXES) != 0); + UINT uRet = GetItemState(nIndex, LVIS_STATEIMAGEMASK); + return (uRet >> 12) - 1; + } + + BOOL SetCheckState(int nItem, BOOL bCheck) + { + int nCheck = bCheck ? 2 : 1; // one based index + return SetItemState(nItem, INDEXTOSTATEIMAGEMASK(nCheck), LVIS_STATEIMAGEMASK); + } + + // view type + DWORD GetViewType() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (GetStyle() & LVS_TYPEMASK); + } + + DWORD SetViewType(DWORD dwType) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(dwType == LVS_ICON || dwType == LVS_SMALLICON || dwType == LVS_LIST || dwType == LVS_REPORT); + DWORD dwOldType = GetViewType(); + if(dwType != dwOldType) + ModifyStyle(LVS_TYPEMASK, (dwType & LVS_TYPEMASK)); + return dwOldType; + } + +#if (_WIN32_IE >= 0x0400) +#ifndef _WIN32_WCE + BOOL GetBkImage(LPLVBKIMAGE plvbki) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, LVM_GETBKIMAGE, 0, (LPARAM)plvbki); + } + + BOOL SetBkImage(LPLVBKIMAGE plvbki) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, LVM_SETBKIMAGE, 0, (LPARAM)plvbki); + } +#endif // !_WIN32_WCE + + int GetSelectionMark() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, LVM_GETSELECTIONMARK, 0, 0L); + } + + int SetSelectionMark(int nIndex) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, LVM_SETSELECTIONMARK, 0, nIndex); + } + +#ifndef _WIN32_WCE + BOOL GetWorkAreas(int nWorkAreas, LPRECT lpRect) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, LVM_GETWORKAREAS, nWorkAreas, (LPARAM)lpRect); + } + + BOOL SetWorkAreas(int nWorkAreas, LPRECT lpRect) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, LVM_SETWORKAREAS, nWorkAreas, (LPARAM)lpRect); + } + + DWORD GetHoverTime() const + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT((GetExtendedListViewStyle() & (LVS_EX_TRACKSELECT | LVS_EX_ONECLICKACTIVATE | LVS_EX_TWOCLICKACTIVATE)) != 0); + return (DWORD)::SendMessage(m_hWnd, LVM_GETHOVERTIME, 0, 0L); + } + + DWORD SetHoverTime(DWORD dwHoverTime) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT((GetExtendedListViewStyle() & (LVS_EX_TRACKSELECT | LVS_EX_ONECLICKACTIVATE | LVS_EX_TWOCLICKACTIVATE)) != 0); + return (DWORD)::SendMessage(m_hWnd, LVM_SETHOVERTIME, 0, dwHoverTime); + } + + BOOL GetNumberOfWorkAreas(int* pnWorkAreas) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, LVM_GETNUMBEROFWORKAREAS, 0, (LPARAM)pnWorkAreas); + } +#endif // !_WIN32_WCE + + BOOL SetItemCountEx(int nItems, DWORD dwFlags) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(((GetStyle() & LVS_OWNERDATA) != 0) && (((GetStyle() & LVS_TYPEMASK) == LVS_REPORT) || ((GetStyle() & LVS_TYPEMASK) == LVS_LIST))); + return (BOOL)::SendMessage(m_hWnd, LVM_SETITEMCOUNT, nItems, dwFlags); + } + +#ifndef _WIN32_WCE + CToolTipCtrl GetToolTips() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return CToolTipCtrl((HWND)::SendMessage(m_hWnd, LVM_GETTOOLTIPS, 0, 0L)); + } + + CToolTipCtrl SetToolTips(HWND hWndTT) + { + ATLASSERT(::IsWindow(m_hWnd)); + return CToolTipCtrl((HWND)::SendMessage(m_hWnd, LVM_SETTOOLTIPS, (WPARAM)hWndTT, 0L)); + } + + BOOL GetUnicodeFormat() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, LVM_GETUNICODEFORMAT, 0, 0L); + } + + BOOL SetUnicodeFormat(BOOL bUnicode = TRUE) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, LVM_SETUNICODEFORMAT, bUnicode, 0L); + } +#endif // !_WIN32_WCE +#endif // (_WIN32_IE >= 0x0400) + +#if (_WIN32_WINNT >= 0x0501) + int GetSelectedColumn() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, LVM_GETSELECTEDCOLUMN, 0, 0L); + } + + void SetSelectedColumn(int nColumn) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, LVM_SETSELECTEDCOLUMN, nColumn, 0L); + } + + DWORD GetView() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (DWORD)::SendMessage(m_hWnd, LVM_GETVIEW, 0, 0L); + } + + int SetView(DWORD dwView) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, LVM_SETVIEW, dwView, 0L); + } + + BOOL IsGroupViewEnabled() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, LVM_ISGROUPVIEWENABLED, 0, 0L); + } + + int GetGroupInfo(int nGroupID, PLVGROUP pGroup) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, LVM_GETGROUPINFO, nGroupID, (LPARAM)pGroup); + } + + int SetGroupInfo(int nGroupID, PLVGROUP pGroup) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, LVM_SETGROUPINFO, nGroupID, (LPARAM)pGroup); + } + + void GetGroupMetrics(PLVGROUPMETRICS pGroupMetrics) const + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, LVM_GETGROUPMETRICS, 0, (LPARAM)pGroupMetrics); + } + + void SetGroupMetrics(PLVGROUPMETRICS pGroupMetrics) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, LVM_SETGROUPMETRICS, 0, (LPARAM)pGroupMetrics); + } + + void GetTileViewInfo(PLVTILEVIEWINFO pTileViewInfo) const + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, LVM_GETTILEVIEWINFO, 0, (LPARAM)pTileViewInfo); + } + + BOOL SetTileViewInfo(PLVTILEVIEWINFO pTileViewInfo) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, LVM_SETTILEVIEWINFO, 0, (LPARAM)pTileViewInfo); + } + + void GetTileInfo(PLVTILEINFO pTileInfo) const + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, LVM_GETTILEINFO, 0, (LPARAM)pTileInfo); + } + + BOOL SetTileInfo(PLVTILEINFO pTileInfo) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, LVM_SETTILEINFO, 0, (LPARAM)pTileInfo); + } + + BOOL GetInsertMark(LPLVINSERTMARK pInsertMark) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, LVM_GETINSERTMARK, 0, (LPARAM)pInsertMark); + } + + BOOL SetInsertMark(LPLVINSERTMARK pInsertMark) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, LVM_SETINSERTMARK, 0, (LPARAM)pInsertMark); + } + + int GetInsertMarkRect(LPRECT lpRect) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, LVM_GETINSERTMARKRECT, 0, (LPARAM)lpRect); + } + + COLORREF GetInsertMarkColor() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (COLORREF)::SendMessage(m_hWnd, LVM_GETINSERTMARKCOLOR, 0, 0L); + } + + COLORREF SetInsertMarkColor(COLORREF clr) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (COLORREF)::SendMessage(m_hWnd, LVM_SETINSERTMARKCOLOR, 0, clr); + } + + COLORREF GetOutlineColor() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (COLORREF)::SendMessage(m_hWnd, LVM_GETOUTLINECOLOR, 0, 0L); + } + + COLORREF SetOutlineColor(COLORREF clr) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (COLORREF)::SendMessage(m_hWnd, LVM_SETOUTLINECOLOR, 0, clr); + } +#endif // (_WIN32_WINNT >= 0x0501) + +#if (_WIN32_WINNT >= 0x0600) + int GetGroupCount() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, LVM_GETGROUPCOUNT, 0, 0L); + } + + BOOL GetGroupInfoByIndex(int nIndex, PLVGROUP pGroup) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, LVM_GETGROUPINFOBYINDEX, nIndex, (LPARAM)pGroup); + } + + BOOL GetGroupRect(int nGroupID, int nType, LPRECT lpRect) const + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(lpRect != NULL); + if(lpRect != NULL) + lpRect->top = nType; + return (BOOL)::SendMessage(m_hWnd, LVM_GETGROUPRECT, nGroupID, (LPARAM)lpRect); + } + + UINT GetGroupState(int nGroupID, UINT uMask) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (UINT)::SendMessage(m_hWnd, LVM_GETGROUPSTATE, nGroupID, (LPARAM)uMask); + } + + int GetFocusedGroup() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, LVM_GETFOCUSEDGROUP, 0, 0L); + } + + BOOL GetEmptyText(LPWSTR lpstrText, int cchText) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, LVM_GETEMPTYTEXT, cchText, (LPARAM)lpstrText); + } + + BOOL GetFooterRect(LPRECT lpRect) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, LVM_GETFOOTERRECT, 0, (LPARAM)lpRect); + } + + BOOL GetFooterInfo(LPLVFOOTERINFO lpFooterInfo) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, LVM_GETFOOTERINFO, 0, (LPARAM)lpFooterInfo); + } + + BOOL GetFooterItemRect(int nItem, LPRECT lpRect) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, LVM_GETFOOTERITEMRECT, nItem, (LPARAM)lpRect); + } + + BOOL GetFooterItem(int nItem, LPLVFOOTERITEM lpFooterItem) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, LVM_GETFOOTERITEM, nItem, (LPARAM)lpFooterItem); + } + + BOOL GetItemIndexRect(PLVITEMINDEX pItemIndex, int nSubItem, int nType, LPRECT lpRect) const + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(pItemIndex != NULL); + ATLASSERT(lpRect != NULL); + if(lpRect != NULL) + { + lpRect->top = nSubItem; + lpRect->left = nType; + } + return (BOOL)::SendMessage(m_hWnd, LVM_GETITEMINDEXRECT, (WPARAM)pItemIndex, (LPARAM)lpRect); + } + + BOOL SetItemIndexState(PLVITEMINDEX pItemIndex, UINT uState, UINT dwMask) + { + ATLASSERT(::IsWindow(m_hWnd)); + LVITEM lvi = { 0 }; + lvi.state = uState; + lvi.stateMask = dwMask; + return (BOOL)::SendMessage(m_hWnd, LVM_SETITEMINDEXSTATE, (WPARAM)pItemIndex, (LPARAM)&lvi); + } + + BOOL GetNextItemIndex(PLVITEMINDEX pItemIndex, WORD wFlags) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, LVM_GETNEXTITEMINDEX, (WPARAM)pItemIndex, MAKELPARAM(wFlags, 0)); + } +#endif // (_WIN32_WINNT >= 0x0600) + +// Operations + int InsertColumn(int nCol, const LVCOLUMN* pColumn) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, LVM_INSERTCOLUMN, nCol, (LPARAM)pColumn); + } + + int InsertColumn(int nCol, LPCTSTR lpszColumnHeading, int nFormat = LVCFMT_LEFT, + int nWidth = -1, int nSubItem = -1, int iImage = -1, int iOrder = -1) + { + LVCOLUMN column = { 0 }; + column.mask = LVCF_TEXT|LVCF_FMT; + column.pszText = (LPTSTR)lpszColumnHeading; + column.fmt = nFormat; + if (nWidth != -1) + { + column.mask |= LVCF_WIDTH; + column.cx = nWidth; + } + if (nSubItem != -1) + { + column.mask |= LVCF_SUBITEM; + column.iSubItem = nSubItem; + } + if (iImage != -1) + { + column.mask |= LVCF_IMAGE; + column.iImage = iImage; + } + if (iOrder != -1) + { + column.mask |= LVCF_ORDER; + column.iOrder = iOrder; + } + return InsertColumn(nCol, &column); + } + + BOOL DeleteColumn(int nCol) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, LVM_DELETECOLUMN, nCol, 0L); + } + + int InsertItem(UINT nMask, int nItem, LPCTSTR lpszItem, UINT nState, UINT nStateMask, int nImage, LPARAM lParam) + { + ATLASSERT(::IsWindow(m_hWnd)); + LVITEM item = { 0 }; + item.mask = nMask; + item.iItem = nItem; + item.iSubItem = 0; + item.pszText = (LPTSTR)lpszItem; + item.state = nState; + item.stateMask = nStateMask; + item.iImage = nImage; + item.lParam = lParam; + return InsertItem(&item); + } + + int InsertItem(const LVITEM* pItem) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, LVM_INSERTITEM, 0, (LPARAM)pItem); + } + + int InsertItem(int nItem, LPCTSTR lpszItem) + { + ATLASSERT(::IsWindow(m_hWnd)); + return InsertItem(LVIF_TEXT, nItem, lpszItem, 0, 0, 0, 0); + } + + int InsertItem(int nItem, LPCTSTR lpszItem, int nImage) + { + ATLASSERT(::IsWindow(m_hWnd)); + return InsertItem(LVIF_TEXT|LVIF_IMAGE, nItem, lpszItem, 0, 0, nImage, 0); + } + + int GetNextItem(int nItem, int nFlags) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, LVM_GETNEXTITEM, nItem, MAKELPARAM(nFlags, 0)); + } + + BOOL DeleteItem(int nItem) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, LVM_DELETEITEM, nItem, 0L); + } + + BOOL DeleteAllItems() + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, LVM_DELETEALLITEMS, 0, 0L); + } + + int FindItem(LVFINDINFO* pFindInfo, int nStart) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, LVM_FINDITEM, nStart, (LPARAM)pFindInfo); + } + + int HitTest(LVHITTESTINFO* pHitTestInfo) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, LVM_HITTEST, 0, (LPARAM)pHitTestInfo); + } + + int HitTest(POINT pt, UINT* pFlags) const + { + ATLASSERT(::IsWindow(m_hWnd)); + LVHITTESTINFO hti = { 0 }; + hti.pt = pt; + int nRes = (int)::SendMessage(m_hWnd, LVM_HITTEST, 0, (LPARAM)&hti); + if (pFlags != NULL) + *pFlags = hti.flags; + return nRes; + } + + BOOL EnsureVisible(int nItem, BOOL bPartialOK) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, LVM_ENSUREVISIBLE, nItem, MAKELPARAM(bPartialOK, 0)); + } + + BOOL Scroll(SIZE size) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, LVM_SCROLL, size.cx, size.cy); + } + + BOOL RedrawItems(int nFirst, int nLast) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, LVM_REDRAWITEMS, nFirst, nLast); + } + + BOOL Arrange(UINT nCode) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, LVM_ARRANGE, nCode, 0L); + } + + CEdit EditLabel(int nItem) + { + ATLASSERT(::IsWindow(m_hWnd)); + return CEdit((HWND)::SendMessage(m_hWnd, LVM_EDITLABEL, nItem, 0L)); + } + + BOOL Update(int nItem) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, LVM_UPDATE, nItem, 0L); + } + + BOOL SortItems(PFNLVCOMPARE pfnCompare, LPARAM lParamSort) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, LVM_SORTITEMS, (WPARAM)lParamSort, (LPARAM)pfnCompare); + } + + CImageList RemoveImageList(int nImageList) + { + ATLASSERT(::IsWindow(m_hWnd)); + return CImageList((HIMAGELIST)::SendMessage(m_hWnd, LVM_SETIMAGELIST, (WPARAM)nImageList, NULL)); + } + + CImageList CreateDragImage(int nItem, LPPOINT lpPoint) + { + ATLASSERT(::IsWindow(m_hWnd)); + return CImageList((HIMAGELIST)::SendMessage(m_hWnd, LVM_CREATEDRAGIMAGE, nItem, (LPARAM)lpPoint)); + } + + DWORD ApproximateViewRect(int cx = -1, int cy = -1, int nCount = -1) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (DWORD)::SendMessage(m_hWnd, LVM_APPROXIMATEVIEWRECT, nCount, MAKELPARAM(cx, cy)); + } + + int SubItemHitTest(LPLVHITTESTINFO lpInfo) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, LVM_SUBITEMHITTEST, 0, (LPARAM)lpInfo); + } + + int AddColumn(LPCTSTR strItem, int nItem, int nSubItem = -1, + int nMask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM, + int nFmt = LVCFMT_LEFT) + { + const int cxOffset = 15; + ATLASSERT(::IsWindow(m_hWnd)); + LVCOLUMN lvc = { 0 }; + lvc.mask = nMask; + lvc.fmt = nFmt; + lvc.pszText = (LPTSTR)strItem; + lvc.cx = GetStringWidth(lvc.pszText) + cxOffset; + if(nMask & LVCF_SUBITEM) + lvc.iSubItem = (nSubItem != -1) ? nSubItem : nItem; + return InsertColumn(nItem, &lvc); + } + + int AddItem(int nItem, int nSubItem, LPCTSTR strItem, int nImageIndex = -1) + { + ATLASSERT(::IsWindow(m_hWnd)); + LVITEM lvItem = { 0 }; + lvItem.mask = LVIF_TEXT; + lvItem.iItem = nItem; + lvItem.iSubItem = nSubItem; + lvItem.pszText = (LPTSTR)strItem; + if(nImageIndex != -1) + { + lvItem.mask |= LVIF_IMAGE; + lvItem.iImage = nImageIndex; + } + if(nSubItem == 0) + return InsertItem(&lvItem); + return SetItem(&lvItem) ? nItem : -1; + } + +#if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) + BOOL SortItemsEx(PFNLVCOMPARE pfnCompare, LPARAM lParamSort) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, LVM_SORTITEMSEX, (WPARAM)lParamSort, (LPARAM)pfnCompare); + } +#endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) + +#if (_WIN32_WINNT >= 0x0501) + int InsertGroup(int nItem, PLVGROUP pGroup) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, LVM_INSERTGROUP, nItem, (LPARAM)pGroup); + } + + int AddGroup(PLVGROUP pGroup) + { + return InsertGroup(-1, pGroup); + } + + int RemoveGroup(int nGroupID) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, LVM_REMOVEGROUP, nGroupID, 0L); + } + + void MoveGroup(int nGroupID, int nItem) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, LVM_MOVEGROUP, nGroupID, nItem); + } + + void MoveItemToGroup(int nItem, int nGroupID) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, LVM_MOVEITEMTOGROUP, nItem, nGroupID); + } + + int EnableGroupView(BOOL bEnable) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, LVM_ENABLEGROUPVIEW, bEnable, 0L); + } + + int SortGroups(PFNLVGROUPCOMPARE pCompareFunc, LPVOID lpVoid = NULL) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, LVM_SORTGROUPS, (WPARAM)pCompareFunc, (LPARAM)lpVoid); + } + + void InsertGroupSorted(PLVINSERTGROUPSORTED pInsertGroupSorted) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, LVM_INSERTGROUPSORTED, (WPARAM)pInsertGroupSorted, 0L); + } + + void RemoveAllGroups() + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, LVM_REMOVEALLGROUPS, 0, 0L); + } + + BOOL HasGroup(int nGroupID) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, LVM_HASGROUP, nGroupID, 0L); + } + + BOOL InsertMarkHitTest(LPPOINT lpPoint, LPLVINSERTMARK pInsertMark) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, LVM_INSERTMARKHITTEST, (WPARAM)lpPoint, (LPARAM)pInsertMark); + } + + BOOL SetInfoTip(PLVSETINFOTIP pSetInfoTip) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, LVM_SETINFOTIP, 0, (LPARAM)pSetInfoTip); + } + + void CancelEditLabel() + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, LVM_CANCELEDITLABEL, 0, 0L); + } + + UINT MapIndexToID(int nIndex) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (UINT)::SendMessage(m_hWnd, LVM_MAPINDEXTOID, nIndex, 0L); + } + + int MapIDToIndex(UINT uID) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, LVM_MAPIDTOINDEX, uID, 0L); + } +#endif // (_WIN32_WINNT >= 0x0501) + +#if (_WIN32_WINNT >= 0x0600) + int HitTestEx(LPLVHITTESTINFO lpHitTestInfo) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, LVM_HITTEST, (WPARAM)-1, (LPARAM)lpHitTestInfo); + } + + int HitTestEx(POINT pt, UINT* pFlags) const + { + ATLASSERT(::IsWindow(m_hWnd)); + LVHITTESTINFO hti = { 0 }; + hti.pt = pt; + int nRes = (int)::SendMessage(m_hWnd, LVM_HITTEST, (WPARAM)-1, (LPARAM)&hti); + if (pFlags != NULL) + *pFlags = hti.flags; + return nRes; + } + + int SubItemHitTestEx(LPLVHITTESTINFO lpHitTestInfo) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, LVM_SUBITEMHITTEST, (WPARAM)-1, (LPARAM)lpHitTestInfo); + } +#endif // (_WIN32_WINNT >= 0x0600) + + // single-selection only + BOOL SelectItem(int nIndex) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT((GetStyle() & LVS_SINGLESEL) != 0); + + BOOL bRet = SetItemState(nIndex, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED); + if(bRet) + bRet = EnsureVisible(nIndex, FALSE); + return bRet; + } +}; + +typedef CListViewCtrlT CListViewCtrl; + + +/////////////////////////////////////////////////////////////////////////////// +// CTreeViewCtrl + +template +class CTreeViewCtrlT : public TBase +{ +public: +// Constructors + CTreeViewCtrlT(HWND hWnd = NULL) : TBase(hWnd) + { } + + CTreeViewCtrlT< TBase >& operator =(HWND hWnd) + { + m_hWnd = hWnd; + return *this; + } + + HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, + DWORD dwStyle = 0, DWORD dwExStyle = 0, + ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) + { + return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); + } + +// Attributes + static LPCTSTR GetWndClassName() + { + return WC_TREEVIEW; + } + + UINT GetCount() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (UINT)::SendMessage(m_hWnd, TVM_GETCOUNT, 0, 0L); + } + + UINT GetIndent() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (UINT)::SendMessage(m_hWnd, TVM_GETINDENT, 0, 0L); + } + + void SetIndent(UINT nIndent) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, TVM_SETINDENT, nIndent, 0L); + } + + CImageList GetImageList(int nImageListType = TVSIL_NORMAL) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TVM_GETIMAGELIST, (WPARAM)nImageListType, 0L)); + } + + CImageList SetImageList(HIMAGELIST hImageList, int nImageListType = TVSIL_NORMAL) + { + ATLASSERT(::IsWindow(m_hWnd)); + return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TVM_SETIMAGELIST, (WPARAM)nImageListType, (LPARAM)hImageList)); + } + + BOOL GetItem(LPTVITEM pItem) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TVM_GETITEM, 0, (LPARAM)pItem); + } + + BOOL SetItem(LPTVITEM pItem) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TVM_SETITEM, 0, (LPARAM)pItem); + } + + BOOL SetItem(HTREEITEM hItem, UINT nMask, LPCTSTR lpszItem, int nImage, + int nSelectedImage, UINT nState, UINT nStateMask, LPARAM lParam) + { + ATLASSERT(::IsWindow(m_hWnd)); + TVITEM item = { 0 }; + item.hItem = hItem; + item.mask = nMask; + item.pszText = (LPTSTR) lpszItem; + item.iImage = nImage; + item.iSelectedImage = nSelectedImage; + item.state = nState; + item.stateMask = nStateMask; + item.lParam = lParam; + return (BOOL)::SendMessage(m_hWnd, TVM_SETITEM, 0, (LPARAM)&item); + } + + BOOL GetItemText(HTREEITEM hItem, LPTSTR lpstrText, int nLen) const + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(lpstrText != NULL); + + TVITEM item = { 0 }; + item.hItem = hItem; + item.mask = TVIF_TEXT; + item.pszText = lpstrText; + item.cchTextMax = nLen; + + return (BOOL)::SendMessage(m_hWnd, TVM_GETITEM, 0, (LPARAM)&item); + } + +#ifndef _ATL_NO_COM + BOOL GetItemText(HTREEITEM hItem, BSTR& bstrText) const + { + USES_CONVERSION; + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(bstrText == NULL); + TVITEM item = { 0 }; + item.hItem = hItem; + item.mask = TVIF_TEXT; + + LPTSTR lpstrText = NULL; + BOOL bRet = FALSE; + for(int nLen = 256; ; nLen *= 2) + { + ATLTRY(lpstrText = new TCHAR[nLen]); + if(lpstrText == NULL) + break; + lpstrText[0] = NULL; + item.pszText = lpstrText; + item.cchTextMax = nLen; + bRet = (BOOL)::SendMessage(m_hWnd, TVM_GETITEM, 0, (LPARAM)&item); + if(!bRet || (lstrlen(item.pszText) < nLen - 1)) + break; + delete [] lpstrText; + lpstrText = NULL; + } + + if(lpstrText != NULL) + { + if(bRet) + bstrText = ::SysAllocString(T2OLE(lpstrText)); + delete [] lpstrText; + } + + return (bstrText != NULL) ? TRUE : FALSE; + } +#endif // !_ATL_NO_COM + +#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) + BOOL GetItemText(HTREEITEM hItem, _CSTRING_NS::CString& strText) const + { + ATLASSERT(::IsWindow(m_hWnd)); + TVITEM item = { 0 }; + item.hItem = hItem; + item.mask = TVIF_TEXT; + + strText.Empty(); + BOOL bRet = FALSE; + for(int nLen = 256; ; nLen *= 2) + { + item.pszText = strText.GetBufferSetLength(nLen); + if(item.pszText == NULL) + { + bRet = FALSE; + break; + } + item.cchTextMax = nLen; + bRet = (BOOL)::SendMessage(m_hWnd, TVM_GETITEM, 0, (LPARAM)&item); + if(!bRet || (lstrlen(item.pszText) < nLen - 1)) + break; + } + strText.ReleaseBuffer(); + return bRet; + } +#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) + + BOOL SetItemText(HTREEITEM hItem, LPCTSTR lpszItem) + { + ATLASSERT(::IsWindow(m_hWnd)); + return SetItem(hItem, TVIF_TEXT, lpszItem, 0, 0, 0, 0, NULL); + } + + BOOL GetItemImage(HTREEITEM hItem, int& nImage, int& nSelectedImage) const + { + ATLASSERT(::IsWindow(m_hWnd)); + TVITEM item = { 0 }; + item.hItem = hItem; + item.mask = TVIF_IMAGE|TVIF_SELECTEDIMAGE; + BOOL bRes = (BOOL)::SendMessage(m_hWnd, TVM_GETITEM, 0, (LPARAM)&item); + if (bRes) + { + nImage = item.iImage; + nSelectedImage = item.iSelectedImage; + } + return bRes; + } + + BOOL SetItemImage(HTREEITEM hItem, int nImage, int nSelectedImage) + { + ATLASSERT(::IsWindow(m_hWnd)); + return SetItem(hItem, TVIF_IMAGE|TVIF_SELECTEDIMAGE, NULL, nImage, nSelectedImage, 0, 0, NULL); + } + + UINT GetItemState(HTREEITEM hItem, UINT nStateMask) const + { + ATLASSERT(::IsWindow(m_hWnd)); +#if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) + return (((UINT)::SendMessage(m_hWnd, TVM_GETITEMSTATE, (WPARAM)hItem, (LPARAM)nStateMask)) & nStateMask); +#else // !((_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)) + TVITEM item = { 0 }; + item.hItem = hItem; + item.mask = TVIF_STATE; + item.state = 0; + item.stateMask = nStateMask; + ::SendMessage(m_hWnd, TVM_GETITEM, 0, (LPARAM)&item); + return (item.state & nStateMask); +#endif // !((_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)) + } + + BOOL SetItemState(HTREEITEM hItem, UINT nState, UINT nStateMask) + { + ATLASSERT(::IsWindow(m_hWnd)); + return SetItem(hItem, TVIF_STATE, NULL, 0, 0, nState, nStateMask, NULL); + } + + DWORD_PTR GetItemData(HTREEITEM hItem) const + { + ATLASSERT(::IsWindow(m_hWnd)); + TVITEM item = { 0 }; + item.hItem = hItem; + item.mask = TVIF_PARAM; + BOOL bRet = (BOOL)::SendMessage(m_hWnd, TVM_GETITEM, 0, (LPARAM)&item); + return (DWORD_PTR)(bRet ? item.lParam : NULL); + } + + BOOL SetItemData(HTREEITEM hItem, DWORD_PTR dwData) + { + ATLASSERT(::IsWindow(m_hWnd)); + return SetItem(hItem, TVIF_PARAM, NULL, 0, 0, 0, 0, (LPARAM)dwData); + } + + CEdit GetEditControl() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return CEdit((HWND)::SendMessage(m_hWnd, TVM_GETEDITCONTROL, 0, 0L)); + } + + UINT GetVisibleCount() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (UINT)::SendMessage(m_hWnd, TVM_GETVISIBLECOUNT, 0, 0L); + } + + BOOL GetItemRect(HTREEITEM hItem, LPRECT lpRect, BOOL bTextOnly) const + { + ATLASSERT(::IsWindow(m_hWnd)); + *(HTREEITEM*)lpRect = hItem; + return (BOOL)::SendMessage(m_hWnd, TVM_GETITEMRECT, (WPARAM)bTextOnly, (LPARAM)lpRect); + } + + BOOL ItemHasChildren(HTREEITEM hItem) const + { + ATLASSERT(::IsWindow(m_hWnd)); + TVITEM item = { 0 }; + item.hItem = hItem; + item.mask = TVIF_CHILDREN; + ::SendMessage(m_hWnd, TVM_GETITEM, 0, (LPARAM)&item); + return item.cChildren; + } + +#ifndef _WIN32_WCE + CToolTipCtrl GetToolTips() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return CToolTipCtrl((HWND)::SendMessage(m_hWnd, TVM_GETTOOLTIPS, 0, 0L)); + } + + CToolTipCtrl SetToolTips(HWND hWndTT) + { + ATLASSERT(::IsWindow(m_hWnd)); + return CToolTipCtrl((HWND)::SendMessage(m_hWnd, TVM_SETTOOLTIPS, (WPARAM)hWndTT, 0L)); + } +#endif // !_WIN32_WCE + + int GetISearchString(LPTSTR lpstr) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, TVM_GETISEARCHSTRING, 0, (LPARAM)lpstr); + } + + // checkboxes only + BOOL GetCheckState(HTREEITEM hItem) const + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT((GetStyle() & TVS_CHECKBOXES) != 0); + UINT uRet = GetItemState(hItem, TVIS_STATEIMAGEMASK); + return (uRet >> 12) - 1; + } + + BOOL SetCheckState(HTREEITEM hItem, BOOL bCheck) + { + int nCheck = bCheck ? 2 : 1; // one based index + return SetItemState(hItem, INDEXTOSTATEIMAGEMASK(nCheck), TVIS_STATEIMAGEMASK); + } + +#if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) + COLORREF GetBkColor() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (COLORREF)::SendMessage(m_hWnd, TVM_GETBKCOLOR, 0, 0L); + } + + COLORREF SetBkColor(COLORREF clr) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (COLORREF)::SendMessage(m_hWnd, TVM_SETBKCOLOR, 0, (LPARAM)clr); + } + + COLORREF GetInsertMarkColor() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (COLORREF)::SendMessage(m_hWnd, TVM_GETINSERTMARKCOLOR, 0, 0L); + } + + COLORREF SetInsertMarkColor(COLORREF clr) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (COLORREF)::SendMessage(m_hWnd, TVM_SETINSERTMARKCOLOR, 0, (LPARAM)clr); + } + + int GetItemHeight() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, TVM_GETITEMHEIGHT, 0, 0L); + } + + int SetItemHeight(int cyHeight) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, TVM_SETITEMHEIGHT, cyHeight, 0L); + } + + int GetScrollTime() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, TVM_GETSCROLLTIME, 0, 0L); + } + + int SetScrollTime(int nScrollTime) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, TVM_SETSCROLLTIME, nScrollTime, 0L); + } + + COLORREF GetTextColor() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (COLORREF)::SendMessage(m_hWnd, TVM_GETTEXTCOLOR, 0, 0L); + } + + COLORREF SetTextColor(COLORREF clr) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (COLORREF)::SendMessage(m_hWnd, TVM_SETTEXTCOLOR, 0, (LPARAM)clr); + } + + BOOL GetUnicodeFormat() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TVM_GETUNICODEFORMAT, 0, 0L); + } + + BOOL SetUnicodeFormat(BOOL bUnicode = TRUE) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TVM_SETUNICODEFORMAT, bUnicode, 0L); + } +#endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) + +#if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) + COLORREF GetLineColor() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (COLORREF)::SendMessage(m_hWnd, TVM_GETLINECOLOR, 0, 0L); + } + + COLORREF SetLineColor(COLORREF clrNew /*= CLR_DEFAULT*/) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (COLORREF)::SendMessage(m_hWnd, TVM_SETLINECOLOR, 0, (LPARAM)clrNew); + } +#endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) + +#if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) + BOOL GetItem(LPTVITEMEX pItem) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TVM_GETITEM, 0, (LPARAM)pItem); + } + + BOOL SetItem(LPTVITEMEX pItem) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TVM_SETITEM, 0, (LPARAM)pItem); + } +#endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) + + DWORD GetExtendedStyle() const + { +#ifndef TVM_GETEXTENDEDSTYLE + const UINT TVM_GETEXTENDEDSTYLE = (TV_FIRST + 45); +#endif + ATLASSERT(::IsWindow(m_hWnd)); + return (DWORD)::SendMessage(m_hWnd, TVM_GETEXTENDEDSTYLE, 0, 0L); + } + + DWORD SetExtendedStyle(DWORD dwStyle, DWORD dwMask) + { +#ifndef TVM_SETEXTENDEDSTYLE + const UINT TVM_SETEXTENDEDSTYLE = (TV_FIRST + 44); +#endif + ATLASSERT(::IsWindow(m_hWnd)); + return (DWORD)::SendMessage(m_hWnd, TVM_SETEXTENDEDSTYLE, dwMask, dwStyle); + } + +#if (_WIN32_WINNT >= 0x0600) + BOOL SetAutoScrollInfo(UINT uPixPerSec, UINT uUpdateTime) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TVM_SETAUTOSCROLLINFO, (WPARAM)uPixPerSec, (LPARAM)uUpdateTime); + } + + DWORD GetSelectedCount() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (DWORD)::SendMessage(m_hWnd, TVM_GETSELECTEDCOUNT, 0, 0L); + } + + BOOL GetItemPartRect(HTREEITEM hItem, TVITEMPART partID, LPRECT lpRect) const + { + ATLASSERT(::IsWindow(m_hWnd)); + TVGETITEMPARTRECTINFO gipri = { hItem, lpRect, partID }; + return (BOOL)::SendMessage(m_hWnd, TVM_GETITEMPARTRECT, 0, (LPARAM)&gipri); + } +#endif // (_WIN32_WINNT >= 0x0600) + +// Operations + HTREEITEM InsertItem(LPTVINSERTSTRUCT lpInsertStruct) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (HTREEITEM)::SendMessage(m_hWnd, TVM_INSERTITEM, 0, (LPARAM)lpInsertStruct); + } + + HTREEITEM InsertItem(LPCTSTR lpszItem, int nImage, + int nSelectedImage, HTREEITEM hParent, HTREEITEM hInsertAfter) + { + ATLASSERT(::IsWindow(m_hWnd)); + return InsertItem(TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE, lpszItem, nImage, nSelectedImage, 0, 0, 0, hParent, hInsertAfter); + } + + HTREEITEM InsertItem(LPCTSTR lpszItem, HTREEITEM hParent, HTREEITEM hInsertAfter) + { + ATLASSERT(::IsWindow(m_hWnd)); + return InsertItem(TVIF_TEXT, lpszItem, 0, 0, 0, 0, 0, hParent, hInsertAfter); + } + + HTREEITEM InsertItem(UINT nMask, LPCTSTR lpszItem, int nImage, + int nSelectedImage, UINT nState, UINT nStateMask, LPARAM lParam, + HTREEITEM hParent, HTREEITEM hInsertAfter) + { + ATLASSERT(::IsWindow(m_hWnd)); + TVINSERTSTRUCT tvis = { 0 }; + tvis.hParent = hParent; + tvis.hInsertAfter = hInsertAfter; + tvis.item.mask = nMask; + tvis.item.pszText = (LPTSTR) lpszItem; + tvis.item.iImage = nImage; + tvis.item.iSelectedImage = nSelectedImage; + tvis.item.state = nState; + tvis.item.stateMask = nStateMask; + tvis.item.lParam = lParam; + return (HTREEITEM)::SendMessage(m_hWnd, TVM_INSERTITEM, 0, (LPARAM)&tvis); + } + + BOOL DeleteItem(HTREEITEM hItem) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TVM_DELETEITEM, 0, (LPARAM)hItem); + } + + BOOL DeleteAllItems() + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TVM_DELETEITEM, 0, (LPARAM)TVI_ROOT); + } + + BOOL Expand(HTREEITEM hItem, UINT nCode = TVE_EXPAND) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TVM_EXPAND, nCode, (LPARAM)hItem); + } + + HTREEITEM GetNextItem(HTREEITEM hItem, UINT nCode) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, nCode, (LPARAM)hItem); + } + + HTREEITEM GetChildItem(HTREEITEM hItem) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_CHILD, (LPARAM)hItem); + } + + HTREEITEM GetNextSiblingItem(HTREEITEM hItem) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_NEXT, (LPARAM)hItem); + } + + HTREEITEM GetPrevSiblingItem(HTREEITEM hItem) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_PREVIOUS, (LPARAM)hItem); + } + + HTREEITEM GetParentItem(HTREEITEM hItem) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_PARENT, (LPARAM)hItem); + } + + HTREEITEM GetFirstVisibleItem() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_FIRSTVISIBLE, 0L); + } + + HTREEITEM GetNextVisibleItem(HTREEITEM hItem) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_NEXTVISIBLE, (LPARAM)hItem); + } + + HTREEITEM GetPrevVisibleItem(HTREEITEM hItem) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_PREVIOUSVISIBLE, (LPARAM)hItem); + } + + HTREEITEM GetSelectedItem() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_CARET, 0L); + } + + HTREEITEM GetDropHilightItem() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_DROPHILITE, 0L); + } + + HTREEITEM GetRootItem() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_ROOT, 0L); + } + +#if !defined(_WIN32_WCE) && (_WIN32_IE >= 0x0400) + HTREEITEM GetLastVisibleItem() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_LASTVISIBLE, 0L); + } +#endif // !defined(_WIN32_WCE) && (_WIN32_IE >= 0x0400) + +#if (_WIN32_IE >= 0x0600) + HTREEITEM GetNextSelectedItem() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_NEXTSELECTED, 0L); + } +#endif // (_WIN32_IE >= 0x0600) + + BOOL Select(HTREEITEM hItem, UINT nCode) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TVM_SELECTITEM, nCode, (LPARAM)hItem); + } + + BOOL SelectItem(HTREEITEM hItem) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TVM_SELECTITEM, TVGN_CARET, (LPARAM)hItem); + } + + BOOL SelectDropTarget(HTREEITEM hItem) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TVM_SELECTITEM, TVGN_DROPHILITE, (LPARAM)hItem); + } + + BOOL SelectSetFirstVisible(HTREEITEM hItem) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TVM_SELECTITEM, TVGN_FIRSTVISIBLE, (LPARAM)hItem); + } + + CEdit EditLabel(HTREEITEM hItem) + { + ATLASSERT(::IsWindow(m_hWnd)); + return CEdit((HWND)::SendMessage(m_hWnd, TVM_EDITLABEL, 0, (LPARAM)hItem)); + } + + BOOL EndEditLabelNow(BOOL bCancel) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TVM_ENDEDITLABELNOW, bCancel, 0L); + } + + HTREEITEM HitTest(TVHITTESTINFO* pHitTestInfo) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (HTREEITEM)::SendMessage(m_hWnd, TVM_HITTEST, 0, (LPARAM)pHitTestInfo); + } + + HTREEITEM HitTest(POINT pt, UINT* pFlags) const + { + ATLASSERT(::IsWindow(m_hWnd)); + TVHITTESTINFO hti = { 0 }; + hti.pt = pt; + HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_HITTEST, 0, (LPARAM)&hti); + if (pFlags != NULL) + *pFlags = hti.flags; + return hTreeItem; + } + + BOOL SortChildren(HTREEITEM hItem, BOOL bRecurse = FALSE) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TVM_SORTCHILDREN, (WPARAM)bRecurse, (LPARAM)hItem); + } + + BOOL EnsureVisible(HTREEITEM hItem) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TVM_ENSUREVISIBLE, 0, (LPARAM)hItem); + } + + BOOL SortChildrenCB(LPTVSORTCB pSort, BOOL bRecurse = FALSE) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TVM_SORTCHILDRENCB, (WPARAM)bRecurse, (LPARAM)pSort); + } + + CImageList RemoveImageList(int nImageList) + { + ATLASSERT(::IsWindow(m_hWnd)); + return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TVM_SETIMAGELIST, (WPARAM)nImageList, NULL)); + } + + CImageList CreateDragImage(HTREEITEM hItem) + { + ATLASSERT(::IsWindow(m_hWnd)); + return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TVM_CREATEDRAGIMAGE, 0, (LPARAM)hItem)); + } + +#if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) + BOOL SetInsertMark(HTREEITEM hTreeItem, BOOL bAfter) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TVM_SETINSERTMARK, bAfter, (LPARAM)hTreeItem); + } + + BOOL RemoveInsertMark() + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TVM_SETINSERTMARK, 0, 0L); + } +#endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) + +#if (_WIN32_WINNT >= 0x0501) + HTREEITEM MapAccIDToHTREEITEM(UINT uID) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (HTREEITEM)::SendMessage(m_hWnd, TVM_MAPACCIDTOHTREEITEM, uID, 0L); + } + + UINT MapHTREEITEMToAccID(HTREEITEM hTreeItem) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (UINT)::SendMessage(m_hWnd, TVM_MAPHTREEITEMTOACCID, (WPARAM)hTreeItem, 0L); + } +#endif // (_WIN32_WINNT >= 0x0501) + +#if (_WIN32_WINNT >= 0x0600) + void ShowInfoTip(HTREEITEM hItem) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, TVM_SHOWINFOTIP, 0, (LPARAM)hItem); + } +#endif // (_WIN32_WINNT >= 0x0600) +}; + +typedef CTreeViewCtrlT CTreeViewCtrl; + + +/////////////////////////////////////////////////////////////////////////////// +// CTreeViewCtrlEx + +// forward declaration +template class CTreeViewCtrlExT; + +// Note: TBase here is for CTreeViewCtrlExT, and not for CTreeItemT itself +template +class CTreeItemT +{ +public: + HTREEITEM m_hTreeItem; + CTreeViewCtrlExT* m_pTreeView; + +// Construction + CTreeItemT(HTREEITEM hTreeItem = NULL, CTreeViewCtrlExT* pTreeView = NULL) : m_hTreeItem(hTreeItem), m_pTreeView(pTreeView) + { } + + CTreeItemT(const CTreeItemT& posSrc) + { + *this = posSrc; + } + + operator HTREEITEM() { return m_hTreeItem; } + + CTreeItemT& operator =(const CTreeItemT& itemSrc) + { + m_hTreeItem = itemSrc.m_hTreeItem; + m_pTreeView = itemSrc.m_pTreeView; + return *this; + } + +// Attributes + CTreeViewCtrlExT* GetTreeView() const { return m_pTreeView; } + + BOOL operator !() const { return m_hTreeItem == NULL; } + + BOOL IsNull() const { return m_hTreeItem == NULL; } + + BOOL GetRect(LPRECT lpRect, BOOL bTextOnly) const; + BOOL GetText(LPTSTR lpstrText, int nLen) const; +#ifndef _ATL_NO_COM + BOOL GetText(BSTR& bstrText) const; +#endif // !_ATL_NO_COM +#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) + BOOL GetText(_CSTRING_NS::CString& strText) const; +#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) + BOOL SetText(LPCTSTR lpszItem); + BOOL GetImage(int& nImage, int& nSelectedImage) const; + BOOL SetImage(int nImage, int nSelectedImage); + UINT GetState(UINT nStateMask) const; + BOOL SetState(UINT nState, UINT nStateMask); + DWORD_PTR GetData() const; + BOOL SetData(DWORD_PTR dwData); + BOOL SetItem(UINT nMask, LPCTSTR lpszItem, int nImage, int nSelectedImage, UINT nState, UINT nStateMask, LPARAM lParam); + +// Operations + CTreeItemT InsertAfter(LPCTSTR lpstrItem, HTREEITEM hItemAfter, int nImageIndex) + { + return _Insert(lpstrItem, nImageIndex, hItemAfter); + } + + CTreeItemT AddHead(LPCTSTR lpstrItem, int nImageIndex) + { + return _Insert(lpstrItem, nImageIndex, TVI_FIRST); + } + + CTreeItemT AddTail(LPCTSTR lpstrItem, int nImageIndex) + { + return _Insert(lpstrItem, nImageIndex, TVI_LAST); + } + + CTreeItemT GetChild() const; + CTreeItemT GetNext(UINT nCode) const; + CTreeItemT GetNextSibling() const; + CTreeItemT GetPrevSibling() const; + CTreeItemT GetParent() const; + CTreeItemT GetFirstVisible() const; + CTreeItemT GetNextVisible() const; + CTreeItemT GetPrevVisible() const; + CTreeItemT GetSelected() const; + CTreeItemT GetDropHilight() const; + CTreeItemT GetRoot() const; +#if !defined(_WIN32_WCE) && (_WIN32_IE >= 0x0400) + CTreeItemT GetLastVisible() const; +#endif // !defined(_WIN32_WCE) && (_WIN32_IE >= 0x0400) +#if (_WIN32_IE >= 0x0600) + CTreeItemT GetNextSelected() const; +#endif // (_WIN32_IE >= 0x0600) + BOOL HasChildren() const; + BOOL Delete(); + BOOL Expand(UINT nCode = TVE_EXPAND); + BOOL Select(UINT nCode); + BOOL Select(); + BOOL SelectDropTarget(); + BOOL SelectSetFirstVisible(); + HWND EditLabel(); + HIMAGELIST CreateDragImage(); + BOOL SortChildren(BOOL bRecurse = FALSE); + BOOL EnsureVisible(); + CTreeItemT _Insert(LPCTSTR lpstrItem, int nImageIndex, HTREEITEM hItemAfter); + int GetImageIndex() const; +#if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) + BOOL SetInsertMark(BOOL bAfter); +#endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) +#if (_WIN32_WINNT >= 0x0501) + UINT MapHTREEITEMToAccID() const; +#endif // (_WIN32_WINNT >= 0x0501) +#if (_WIN32_WINNT >= 0x0600) + void ShowInfoTip(); + BOOL GetPartRect(TVITEMPART partID, LPRECT lpRect) const; +#endif // (_WIN32_WINNT >= 0x0600) +}; + +typedef CTreeItemT CTreeItem; + + +template +class CTreeViewCtrlExT : public CTreeViewCtrlT< TBase > +{ +public: +// Constructors + CTreeViewCtrlExT(HWND hWnd = NULL) : CTreeViewCtrlT< TBase >(hWnd) + { } + + CTreeViewCtrlExT< TBase >& operator =(HWND hWnd) + { + m_hWnd = hWnd; + return *this; + } + +// Operations (overides that return CTreeItem) + CTreeItemT InsertItem(LPTVINSERTSTRUCT lpInsertStruct) + { + ATLASSERT(::IsWindow(m_hWnd)); + HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_INSERTITEM, 0, (LPARAM)lpInsertStruct); + return CTreeItemT(hTreeItem, this); + } + + CTreeItemT InsertItem(LPCTSTR lpszItem, int nImage, + int nSelectedImage, HTREEITEM hParent, HTREEITEM hInsertAfter) + { + ATLASSERT(::IsWindow(m_hWnd)); + return InsertItem(TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE, lpszItem, nImage, nSelectedImage, 0, 0, 0, hParent, hInsertAfter); + } + + CTreeItemT InsertItem(LPCTSTR lpszItem, HTREEITEM hParent, HTREEITEM hInsertAfter) + { + ATLASSERT(::IsWindow(m_hWnd)); + return InsertItem(TVIF_TEXT, lpszItem, 0, 0, 0, 0, 0, hParent, hInsertAfter); + } + + CTreeItemT GetNextItem(HTREEITEM hItem, UINT nCode) const + { + ATLASSERT(::IsWindow(m_hWnd)); + HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, nCode, (LPARAM)hItem); + return CTreeItemT(hTreeItem, (CTreeViewCtrlExT*)this); + } + + CTreeItemT GetChildItem(HTREEITEM hItem) const + { + ATLASSERT(::IsWindow(m_hWnd)); + HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_CHILD, (LPARAM)hItem); + return CTreeItemT(hTreeItem, (CTreeViewCtrlExT*)this); + } + + CTreeItemT GetNextSiblingItem(HTREEITEM hItem) const + { + ATLASSERT(::IsWindow(m_hWnd)); + HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_NEXT, (LPARAM)hItem); + return CTreeItemT(hTreeItem, (CTreeViewCtrlExT*)this); + } + + CTreeItemT GetPrevSiblingItem(HTREEITEM hItem) const + { + ATLASSERT(::IsWindow(m_hWnd)); + HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_PREVIOUS, (LPARAM)hItem); + return CTreeItemT(hTreeItem, (CTreeViewCtrlExT*)this); + } + + CTreeItemT GetParentItem(HTREEITEM hItem) const + { + ATLASSERT(::IsWindow(m_hWnd)); + HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_PARENT, (LPARAM)hItem); + return CTreeItemT(hTreeItem, (CTreeViewCtrlExT*)this); + } + + CTreeItemT GetFirstVisibleItem() const + { + ATLASSERT(::IsWindow(m_hWnd)); + HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_FIRSTVISIBLE, 0L); + return CTreeItemT(hTreeItem, (CTreeViewCtrlExT*)this); + } + + CTreeItemT GetNextVisibleItem(HTREEITEM hItem) const + { + ATLASSERT(::IsWindow(m_hWnd)); + HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_NEXTVISIBLE, (LPARAM)hItem); + return CTreeItemT(hTreeItem, (CTreeViewCtrlExT*)this); + } + + CTreeItemT GetPrevVisibleItem(HTREEITEM hItem) const + { + ATLASSERT(::IsWindow(m_hWnd)); + HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_PREVIOUSVISIBLE, (LPARAM)hItem); + return CTreeItemT(hTreeItem, (CTreeViewCtrlExT*)this); + } + + CTreeItemT GetSelectedItem() const + { + ATLASSERT(::IsWindow(m_hWnd)); + HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_CARET, 0L); + return CTreeItemT(hTreeItem, (CTreeViewCtrlExT*)this); + } + + CTreeItemT GetDropHilightItem() const + { + ATLASSERT(::IsWindow(m_hWnd)); + HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_DROPHILITE, 0L); + return CTreeItemT(hTreeItem, (CTreeViewCtrlExT*)this); + } + + CTreeItemT GetRootItem() const + { + ATLASSERT(::IsWindow(m_hWnd)); + HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_ROOT, 0L); + return CTreeItemT(hTreeItem, (CTreeViewCtrlExT*)this); + } + +#if !defined(_WIN32_WCE) && (_WIN32_IE >= 0x0400) + CTreeItemT GetLastVisibleItem() const + { + ATLASSERT(::IsWindow(m_hWnd)); + HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_LASTVISIBLE, 0L); + return CTreeItemT(hTreeItem, (CTreeViewCtrlExT*)this); + } +#endif // !defined(_WIN32_WCE) && (_WIN32_IE >= 0x0400) + +#if (_WIN32_IE >= 0x0600) + CTreeItemT GetNextSelectedItem() const + { + ATLASSERT(::IsWindow(m_hWnd)); + HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_NEXTSELECTED, 0L); + return CTreeItemT(hTreeItem, (CTreeViewCtrlExT*)this); + } +#endif // (_WIN32_IE >= 0x0600) + + CTreeItemT HitTest(TVHITTESTINFO* pHitTestInfo) const + { + ATLASSERT(::IsWindow(m_hWnd)); + HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_HITTEST, 0, (LPARAM)pHitTestInfo); + return CTreeItemT(hTreeItem, (CTreeViewCtrlExT*)this); + } + + CTreeItemT InsertItem(UINT nMask, LPCTSTR lpszItem, int nImage, + int nSelectedImage, UINT nState, UINT nStateMask, LPARAM lParam, + HTREEITEM hParent, HTREEITEM hInsertAfter) + { + ATLASSERT(::IsWindow(m_hWnd)); + TVINSERTSTRUCT tvis = { 0 }; + tvis.hParent = hParent; + tvis.hInsertAfter = hInsertAfter; + tvis.item.mask = nMask; + tvis.item.pszText = (LPTSTR) lpszItem; + tvis.item.iImage = nImage; + tvis.item.iSelectedImage = nSelectedImage; + tvis.item.state = nState; + tvis.item.stateMask = nStateMask; + tvis.item.lParam = lParam; + HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_INSERTITEM, 0, (LPARAM)&tvis); + return CTreeItemT(hTreeItem, this); + } + + CTreeItemT HitTest(POINT pt, UINT* pFlags) const + { + ATLASSERT(::IsWindow(m_hWnd)); + TVHITTESTINFO hti = { 0 }; + hti.pt = pt; + HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_HITTEST, 0, (LPARAM)&hti); + if (pFlags != NULL) + *pFlags = hti.flags; + return CTreeItemT(hTreeItem, (CTreeViewCtrlExT*)this); + } + +#if (_WIN32_WINNT >= 0x0501) + CTreeItemT MapAccIDToHTREEITEM(UINT uID) const + { + ATLASSERT(::IsWindow(m_hWnd)); + HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_MAPACCIDTOHTREEITEM, uID, 0L); + return CTreeItemT(hTreeItem, (CTreeViewCtrlExT*)this); + } +#endif // (_WIN32_WINNT >= 0x0501) +}; + +typedef CTreeViewCtrlExT CTreeViewCtrlEx; + + +// CTreeItem inline methods +template +inline BOOL CTreeItemT::GetRect(LPRECT lpRect, BOOL bTextOnly) const +{ + ATLASSERT(m_pTreeView != NULL); + return m_pTreeView->GetItemRect(m_hTreeItem,lpRect,bTextOnly); +} + +template +inline CTreeItemT CTreeItemT::GetNext(UINT nCode) const +{ + ATLASSERT(m_pTreeView != NULL); + return m_pTreeView->GetNextItem(m_hTreeItem,nCode); +} + +template +inline CTreeItemT CTreeItemT::GetChild() const +{ + ATLASSERT(m_pTreeView != NULL); + return m_pTreeView->GetChildItem(m_hTreeItem); +} + +template +inline CTreeItemT CTreeItemT::GetNextSibling() const +{ + ATLASSERT(m_pTreeView != NULL); + return m_pTreeView->GetNextSiblingItem(m_hTreeItem); +} + +template +inline CTreeItemT CTreeItemT::GetPrevSibling() const +{ + ATLASSERT(m_pTreeView != NULL); + return m_pTreeView->GetPrevSiblingItem(m_hTreeItem); +} + +template +inline CTreeItemT CTreeItemT::GetParent() const +{ + ATLASSERT(m_pTreeView != NULL); + return m_pTreeView->GetParentItem(m_hTreeItem); +} + +template +inline CTreeItemT CTreeItemT::GetFirstVisible() const +{ + ATLASSERT(m_pTreeView != NULL); + return m_pTreeView->GetFirstVisibleItem(); +} + +template +inline CTreeItemT CTreeItemT::GetNextVisible() const +{ + ATLASSERT(m_pTreeView != NULL); + return m_pTreeView->GetNextVisibleItem(m_hTreeItem); +} + +template +inline CTreeItemT CTreeItemT::GetPrevVisible() const +{ + ATLASSERT(m_pTreeView != NULL); + return m_pTreeView->GetPrevVisibleItem(m_hTreeItem); +} + +template +inline CTreeItemT CTreeItemT::GetSelected() const +{ + ATLASSERT(m_pTreeView != NULL); + return m_pTreeView->GetSelectedItem(); +} + +template +inline CTreeItemT CTreeItemT::GetDropHilight() const +{ + ATLASSERT(m_pTreeView != NULL); + return m_pTreeView->GetDropHilightItem(); +} + +template +inline CTreeItemT CTreeItemT::GetRoot() const +{ + ATLASSERT(m_pTreeView != NULL); + return m_pTreeView->GetRootItem(); +} + +#if !defined(_WIN32_WCE) && (_WIN32_IE >= 0x0400) +template +inline CTreeItemT CTreeItemT::GetLastVisible() const +{ + ATLASSERT(m_pTreeView != NULL); + return m_pTreeView->GetLastVisibleItem(); +} +#endif // !defined(_WIN32_WCE) && (_WIN32_IE >= 0x0400) + +#if (_WIN32_IE >= 0x0600) +template +inline CTreeItemT CTreeItemT::GetNextSelected() const +{ + ATLASSERT(m_pTreeView != NULL); + return m_pTreeView->GetNextSelectedItem(); +} +#endif // (_WIN32_IE >= 0x0600) + +template +inline BOOL CTreeItemT::GetText(LPTSTR lpstrText, int nLen) const +{ + ATLASSERT(m_pTreeView != NULL); + return m_pTreeView->GetItemText(m_hTreeItem, lpstrText, nLen); +} + +#ifndef _ATL_NO_COM +#ifdef _OLEAUTO_H_ +template +inline BOOL CTreeItemT::GetText(BSTR& bstrText) const +{ + ATLASSERT(m_pTreeView != NULL); + return m_pTreeView->GetItemText(m_hTreeItem, bstrText); +} +#endif // _OLEAUTO_H_ +#endif // !_ATL_NO_COM + +#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) +template +inline BOOL CTreeItemT::GetText(_CSTRING_NS::CString& strText) const +{ + ATLASSERT(m_pTreeView != NULL); + return m_pTreeView->GetItemText(m_hTreeItem, strText); +} +#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) + +template +inline BOOL CTreeItemT::GetImage(int& nImage, int& nSelectedImage) const +{ + ATLASSERT(m_pTreeView != NULL); + return m_pTreeView->GetItemImage(m_hTreeItem,nImage,nSelectedImage); +} + +template +inline UINT CTreeItemT::GetState(UINT nStateMask) const +{ + ATLASSERT(m_pTreeView != NULL); + return m_pTreeView->GetItemState(m_hTreeItem,nStateMask); +} + +template +inline DWORD_PTR CTreeItemT::GetData() const +{ + ATLASSERT(m_pTreeView != NULL); + return m_pTreeView->GetItemData(m_hTreeItem); +} + +template +inline BOOL CTreeItemT::SetItem(UINT nMask, LPCTSTR lpszItem, int nImage, + int nSelectedImage, UINT nState, UINT nStateMask, LPARAM lParam) +{ + ATLASSERT(m_pTreeView != NULL); + return m_pTreeView->SetItem(m_hTreeItem, nMask, lpszItem, nImage, nSelectedImage, nState, nStateMask, lParam); +} + +template +inline BOOL CTreeItemT::SetText(LPCTSTR lpszItem) +{ + ATLASSERT(m_pTreeView != NULL); + return m_pTreeView->SetItemText(m_hTreeItem,lpszItem); +} + +template +inline BOOL CTreeItemT::SetImage(int nImage, int nSelectedImage) +{ + ATLASSERT(m_pTreeView != NULL); + return m_pTreeView->SetItemImage(m_hTreeItem,nImage,nSelectedImage); +} + +template +inline BOOL CTreeItemT::SetState(UINT nState, UINT nStateMask) +{ + ATLASSERT(m_pTreeView != NULL); + return m_pTreeView->SetItemState(m_hTreeItem,nState,nStateMask); +} + +template +inline BOOL CTreeItemT::SetData(DWORD_PTR dwData) +{ + ATLASSERT(m_pTreeView != NULL); + return m_pTreeView->SetItemData(m_hTreeItem,dwData); +} + +template +inline BOOL CTreeItemT::HasChildren() const +{ + ATLASSERT(m_pTreeView != NULL); + return m_pTreeView->ItemHasChildren(m_hTreeItem); +} + +template +inline BOOL CTreeItemT::Delete() +{ + ATLASSERT(m_pTreeView != NULL); + return m_pTreeView->DeleteItem(m_hTreeItem); +} + +template +inline BOOL CTreeItemT::Expand(UINT nCode /*= TVE_EXPAND*/) +{ + ATLASSERT(m_pTreeView != NULL); + return m_pTreeView->Expand(m_hTreeItem,nCode); +} + +template +inline BOOL CTreeItemT::Select(UINT nCode) +{ + ATLASSERT(m_pTreeView != NULL); + return m_pTreeView->Select(m_hTreeItem,nCode); +} + +template +inline BOOL CTreeItemT::Select() +{ + ATLASSERT(m_pTreeView != NULL); + return m_pTreeView->SelectItem(m_hTreeItem); +} + +template +inline BOOL CTreeItemT::SelectDropTarget() +{ + ATLASSERT(m_pTreeView != NULL); + return m_pTreeView->SelectDropTarget(m_hTreeItem); +} + +template +inline BOOL CTreeItemT::SelectSetFirstVisible() +{ + ATLASSERT(m_pTreeView != NULL); + return m_pTreeView->SelectSetFirstVisible(m_hTreeItem); +} + +template +inline HWND CTreeItemT::EditLabel() +{ + ATLASSERT(m_pTreeView != NULL); + return m_pTreeView->EditLabel(m_hTreeItem); +} + +template +inline HIMAGELIST CTreeItemT::CreateDragImage() +{ + ATLASSERT(m_pTreeView != NULL); + return m_pTreeView->CreateDragImage(m_hTreeItem); +} + +template +inline BOOL CTreeItemT::SortChildren(BOOL bRecurse /*= FALSE*/) +{ + ATLASSERT(m_pTreeView != NULL); + return m_pTreeView->SortChildren(m_hTreeItem, bRecurse); +} + +template +inline BOOL CTreeItemT::EnsureVisible() +{ + ATLASSERT(m_pTreeView != NULL); + return m_pTreeView->EnsureVisible(m_hTreeItem); +} + +template +inline CTreeItemT CTreeItemT::_Insert(LPCTSTR lpstrItem, int nImageIndex, HTREEITEM hItemAfter) +{ + ATLASSERT(m_pTreeView != NULL); + TVINSERTSTRUCT ins = { 0 }; + ins.hParent = m_hTreeItem; + ins.hInsertAfter = hItemAfter; + ins.item.mask = TVIF_TEXT; + ins.item.pszText = (LPTSTR)lpstrItem; + if(nImageIndex != -1) + { + ins.item.mask |= TVIF_IMAGE | TVIF_SELECTEDIMAGE; + ins.item.iImage = nImageIndex; + ins.item.iSelectedImage = nImageIndex; + } + return CTreeItemT(m_pTreeView->InsertItem(&ins), m_pTreeView); +} + +template +inline int CTreeItemT::GetImageIndex() const +{ + ATLASSERT(m_pTreeView != NULL); + TVITEM item = { 0 }; + item.mask = TVIF_HANDLE | TVIF_IMAGE; + item.hItem = m_hTreeItem; + m_pTreeView->GetItem(&item); + return item.iImage; +} + +#if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) +template +inline BOOL CTreeItemT::SetInsertMark(BOOL bAfter) +{ + ATLASSERT(m_pTreeView != NULL); + return m_pTreeView->SetInsertMark(m_hTreeItem, bAfter); +} +#endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) + +#if (_WIN32_WINNT >= 0x0501) +template +inline UINT CTreeItemT::MapHTREEITEMToAccID() const +{ + ATLASSERT(m_pTreeView != NULL); + return m_pTreeView->MapHTREEITEMToAccID(m_hTreeItem); +} +#endif // (_WIN32_WINNT >= 0x0501) + +#if (_WIN32_WINNT >= 0x0600) +template +inline void CTreeItemT::ShowInfoTip() +{ + ATLASSERT(m_pTreeView != NULL); + m_pTreeView->ShowInfoTip(m_hTreeItem); +} + +template +inline BOOL CTreeItemT::GetPartRect(TVITEMPART partID, LPRECT lpRect) const +{ + ATLASSERT(m_pTreeView != NULL); + return m_pTreeView->GetItemPartRect(m_hTreeItem, partID, lpRect); +} +#endif // (_WIN32_WINNT >= 0x0600) + + +/////////////////////////////////////////////////////////////////////////////// +// CToolBarCtrl + +template +class CToolBarCtrlT : public TBase +{ +public: +// Construction + CToolBarCtrlT(HWND hWnd = NULL) : TBase(hWnd) + { } + + CToolBarCtrlT< TBase >& operator =(HWND hWnd) + { + m_hWnd = hWnd; + return *this; + } + + HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, + DWORD dwStyle = 0, DWORD dwExStyle = 0, + ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) + { + return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); + } + +// Attributes + static LPCTSTR GetWndClassName() + { + return TOOLBARCLASSNAME; + } + + BOOL IsButtonEnabled(int nID) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TB_ISBUTTONENABLED, nID, 0L); + } + + BOOL IsButtonChecked(int nID) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TB_ISBUTTONCHECKED, nID, 0L); + } + + BOOL IsButtonPressed(int nID) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TB_ISBUTTONPRESSED, nID, 0L); + } + + BOOL IsButtonHidden(int nID) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return(BOOL) ::SendMessage(m_hWnd, TB_ISBUTTONHIDDEN, nID, 0L); + } + + BOOL IsButtonIndeterminate(int nID) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TB_ISBUTTONINDETERMINATE, nID, 0L); + } + + int GetState(int nID) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, TB_GETSTATE, nID, 0L); + } + + BOOL SetState(int nID, UINT nState) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TB_SETSTATE, nID, MAKELPARAM(nState, 0)); + } + + BOOL GetButton(int nIndex, LPTBBUTTON lpButton) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TB_GETBUTTON, nIndex, (LPARAM)lpButton); + } + + int GetButtonCount() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, TB_BUTTONCOUNT, 0, 0L); + } + + BOOL GetItemRect(int nIndex, LPRECT lpRect) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TB_GETITEMRECT, nIndex, (LPARAM)lpRect); + } + + void SetButtonStructSize(int nSize = sizeof(TBBUTTON)) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, TB_BUTTONSTRUCTSIZE, nSize, 0L); + } + + BOOL SetButtonSize(SIZE size) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TB_SETBUTTONSIZE, 0, MAKELPARAM(size.cx, size.cy)); + } + + BOOL SetButtonSize(int cx, int cy) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TB_SETBUTTONSIZE, 0, MAKELPARAM(cx, cy)); + } + + BOOL SetBitmapSize(SIZE size) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TB_SETBITMAPSIZE, 0, MAKELPARAM(size.cx, size.cy)); + } + + BOOL SetBitmapSize(int cx, int cy) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TB_SETBITMAPSIZE, 0, MAKELPARAM(cx, cy)); + } + +#ifndef _WIN32_WCE + CToolTipCtrl GetToolTips() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return CToolTipCtrl((HWND)::SendMessage(m_hWnd, TB_GETTOOLTIPS, 0, 0L)); + } + + void SetToolTips(HWND hWndToolTip) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, TB_SETTOOLTIPS, (WPARAM)hWndToolTip, 0L); + } +#endif // !_WIN32_WCE + + void SetNotifyWnd(HWND hWnd) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, TB_SETPARENT, (WPARAM)hWnd, 0L); + } + + int GetRows() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, TB_GETROWS, 0, 0L); + } + + void SetRows(int nRows, BOOL bLarger, LPRECT lpRect) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, TB_SETROWS, MAKELPARAM(nRows, bLarger), (LPARAM)lpRect); + } + + BOOL SetCmdID(int nIndex, UINT nID) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TB_SETCMDID, nIndex, nID); + } + + DWORD GetBitmapFlags() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (DWORD)::SendMessage(m_hWnd, TB_GETBITMAPFLAGS, 0, 0L); + } + + int GetBitmap(int nID) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, TB_GETBITMAP, nID, 0L); + } + + int GetButtonText(int nID, LPTSTR lpstrText) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, TB_GETBUTTONTEXT, nID, (LPARAM)lpstrText); + } + + // nIndex - IE5 or higher only + CImageList GetImageList(int nIndex = 0) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TB_GETIMAGELIST, nIndex, 0L)); + } + + // nIndex - IE5 or higher only + CImageList SetImageList(HIMAGELIST hImageList, int nIndex = 0) + { + ATLASSERT(::IsWindow(m_hWnd)); + return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TB_SETIMAGELIST, nIndex, (LPARAM)hImageList)); + } + + // nIndex - IE5 or higher only + CImageList GetDisabledImageList(int nIndex = 0) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TB_GETDISABLEDIMAGELIST, nIndex, 0L)); + } + + // nIndex - IE5 or higher only + CImageList SetDisabledImageList(HIMAGELIST hImageList, int nIndex = 0) + { + ATLASSERT(::IsWindow(m_hWnd)); + return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TB_SETDISABLEDIMAGELIST, nIndex, (LPARAM)hImageList)); + } + +#ifndef _WIN32_WCE + // nIndex - IE5 or higher only + CImageList GetHotImageList(int nIndex = 0) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TB_GETHOTIMAGELIST, nIndex, 0L)); + } + + // nIndex - IE5 or higher only + CImageList SetHotImageList(HIMAGELIST hImageList, int nIndex = 0) + { + ATLASSERT(::IsWindow(m_hWnd)); + return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TB_SETHOTIMAGELIST, nIndex, (LPARAM)hImageList)); + } +#endif // !_WIN32_WCE + + DWORD GetStyle() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (DWORD)::SendMessage(m_hWnd, TB_GETSTYLE, 0, 0L); + } + + void SetStyle(DWORD dwStyle) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, TB_SETSTYLE, 0, dwStyle); + } + + DWORD GetButtonSize() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (DWORD)::SendMessage(m_hWnd, TB_GETBUTTONSIZE, 0, 0L); + } + + void GetButtonSize(SIZE& size) const + { + ATLASSERT(::IsWindow(m_hWnd)); + DWORD dwRet = (DWORD)::SendMessage(m_hWnd, TB_GETBUTTONSIZE, 0, 0L); + size.cx = LOWORD(dwRet); + size.cy = HIWORD(dwRet); + } + + BOOL GetRect(int nID, LPRECT lpRect) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TB_GETRECT, nID, (LPARAM)lpRect); + } + + int GetTextRows() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, TB_GETTEXTROWS, 0, 0L); + } + + BOOL SetButtonWidth(int cxMin, int cxMax) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TB_SETBUTTONWIDTH, 0, MAKELPARAM(cxMin, cxMax)); + } + + BOOL SetIndent(int nIndent) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TB_SETINDENT, nIndent, 0L); + } + + BOOL SetMaxTextRows(int nMaxTextRows) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TB_SETMAXTEXTROWS, nMaxTextRows, 0L); + } + +#if (_WIN32_IE >= 0x0400) +#ifndef _WIN32_WCE + BOOL GetAnchorHighlight() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TB_GETANCHORHIGHLIGHT, 0, 0L); + } + + BOOL SetAnchorHighlight(BOOL bEnable = TRUE) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TB_SETANCHORHIGHLIGHT, bEnable, 0L); + } +#endif // !_WIN32_WCE + + int GetButtonInfo(int nID, LPTBBUTTONINFO lptbbi) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, TB_GETBUTTONINFO, nID, (LPARAM)lptbbi); + } + + BOOL SetButtonInfo(int nID, LPTBBUTTONINFO lptbbi) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TB_SETBUTTONINFO, nID, (LPARAM)lptbbi); + } + + BOOL SetButtonInfo(int nID, DWORD dwMask, BYTE Style, BYTE State, LPCTSTR lpszItem, + int iImage, WORD cx, int iCommand, DWORD_PTR lParam) + { + ATLASSERT(::IsWindow(m_hWnd)); + TBBUTTONINFO tbbi = { 0 }; + tbbi.cbSize = sizeof(TBBUTTONINFO); + tbbi.dwMask = dwMask; + tbbi.idCommand = iCommand; + tbbi.iImage = iImage; + tbbi.fsState = State; + tbbi.fsStyle = Style; + tbbi.cx = cx; + tbbi.pszText = (LPTSTR) lpszItem; + tbbi.lParam = lParam; + return (BOOL)::SendMessage(m_hWnd, TB_SETBUTTONINFO, nID, (LPARAM)&tbbi); + } + +#ifndef _WIN32_WCE + int GetHotItem() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, TB_GETHOTITEM, 0, 0L); + } + + int SetHotItem(int nItem) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, TB_SETHOTITEM, nItem, 0L); + } +#endif // !_WIN32_WCE + + BOOL IsButtonHighlighted(int nButtonID) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TB_ISBUTTONHIGHLIGHTED, nButtonID, 0L); + } + + DWORD SetDrawTextFlags(DWORD dwMask, DWORD dwFlags) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (DWORD)::SendMessage(m_hWnd, TB_SETDRAWTEXTFLAGS, dwMask, dwFlags); + } + +#ifndef _WIN32_WCE + BOOL GetColorScheme(LPCOLORSCHEME lpcs) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TB_GETCOLORSCHEME, 0, (LPARAM)lpcs); + } + + void SetColorScheme(LPCOLORSCHEME lpcs) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, TB_SETCOLORSCHEME, 0, (LPARAM)lpcs); + } + + DWORD GetExtendedStyle() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (DWORD)::SendMessage(m_hWnd, TB_GETEXTENDEDSTYLE, 0, 0L); + } + + DWORD SetExtendedStyle(DWORD dwStyle) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (DWORD)::SendMessage(m_hWnd, TB_SETEXTENDEDSTYLE, 0, dwStyle); + } + + void GetInsertMark(LPTBINSERTMARK lptbim) const + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, TB_GETINSERTMARK, 0, (LPARAM)lptbim); + } + + void SetInsertMark(LPTBINSERTMARK lptbim) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, TB_SETINSERTMARK, 0, (LPARAM)lptbim); + } + + COLORREF GetInsertMarkColor() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (COLORREF)::SendMessage(m_hWnd, TB_GETINSERTMARKCOLOR, 0, 0L); + } + + COLORREF SetInsertMarkColor(COLORREF clr) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (COLORREF)::SendMessage(m_hWnd, TB_SETINSERTMARKCOLOR, 0, (LPARAM)clr); + } + + BOOL GetMaxSize(LPSIZE lpSize) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TB_GETMAXSIZE, 0, (LPARAM)lpSize); + } + + void GetPadding(LPSIZE lpSizePadding) const + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(lpSizePadding != NULL); + DWORD dwRet = (DWORD)::SendMessage(m_hWnd, TB_GETPADDING, 0, 0L); + lpSizePadding->cx = GET_X_LPARAM(dwRet); + lpSizePadding->cy = GET_Y_LPARAM(dwRet); + } + + void SetPadding(int cx, int cy, LPSIZE lpSizePadding = NULL) + { + ATLASSERT(::IsWindow(m_hWnd)); + DWORD dwRet = (DWORD)::SendMessage(m_hWnd, TB_SETPADDING, 0, MAKELPARAM(cx, cy)); + if(lpSizePadding != NULL) + { + lpSizePadding->cx = GET_X_LPARAM(dwRet); + lpSizePadding->cy = GET_Y_LPARAM(dwRet); + } + } + + BOOL GetUnicodeFormat() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TB_GETUNICODEFORMAT, 0, 0L); + } + + BOOL SetUnicodeFormat(BOOL bUnicode = TRUE) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TB_SETUNICODEFORMAT, bUnicode, 0L); + } +#endif // !_WIN32_WCE +#endif // (_WIN32_IE >= 0x0400) + +#if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) + int GetString(int nString, LPTSTR lpstrString, int cchMaxLen) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, TB_GETSTRING, MAKEWPARAM(cchMaxLen, nString), (LPARAM)lpstrString); + } + + int GetStringBSTR(int nString, BSTR& bstrString) const + { + USES_CONVERSION; + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(bstrString == NULL); + int nLength = (int)(short)LOWORD(::SendMessage(m_hWnd, TB_GETSTRING, MAKEWPARAM(0, nString), NULL)); + if(nLength != -1) + { + CTempBuffer buff; + LPTSTR lpstrText = buff.Allocate(nLength + 1); + if(lpstrText != NULL) + { + nLength = (int)::SendMessage(m_hWnd, TB_GETSTRING, MAKEWPARAM(nLength + 1, nString), (LPARAM)lpstrText); + if(nLength != -1) + bstrString = ::SysAllocString(T2OLE(lpstrText)); + } + else + { + nLength = -1; + } + } + + return nLength; + } + +#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) + int GetString(int nString, _CSTRING_NS::CString& str) const + { + ATLASSERT(::IsWindow(m_hWnd)); + int nLength = (int)(short)LOWORD(::SendMessage(m_hWnd, TB_GETSTRING, MAKEWPARAM(0, nString), NULL)); + if(nLength != -1) + { + LPTSTR lpstr = str.GetBufferSetLength(nLength + 1); + if(lpstr != NULL) + nLength = (int)::SendMessage(m_hWnd, TB_GETSTRING, MAKEWPARAM(nLength + 1, nString), (LPARAM)lpstr); + else + nLength = -1; + str.ReleaseBuffer(); + } + return nLength; + } +#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) +#endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) + +#if (_WIN32_WINNT >= 0x0501) + void GetMetrics(LPTBMETRICS lptbm) const + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, TB_GETMETRICS, 0, (LPARAM)lptbm); + } + + void SetMetrics(LPTBMETRICS lptbm) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, TB_SETMETRICS, 0, (LPARAM)lptbm); + } + + void SetWindowTheme(LPCWSTR lpstrTheme) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, TB_SETWINDOWTHEME, 0, (LPARAM)lpstrTheme); + } +#endif // (_WIN32_WINNT >= 0x0501) + +#if (_WIN32_WINNT >= 0x0600) + CImageList GetPressedImageList(int nIndex = 0) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TB_GETPRESSEDIMAGELIST, nIndex, 0L)); + } + + CImageList SetPressedImageList(HIMAGELIST hImageList, int nIndex = 0) + { + ATLASSERT(::IsWindow(m_hWnd)); + return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TB_SETPRESSEDIMAGELIST, nIndex, (LPARAM)hImageList)); + } +#endif // (_WIN32_WINNT >= 0x0600) + +// Operations + BOOL EnableButton(int nID, BOOL bEnable = TRUE) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TB_ENABLEBUTTON, nID, MAKELPARAM(bEnable, 0)); + } + + BOOL CheckButton(int nID, BOOL bCheck = TRUE) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TB_CHECKBUTTON, nID, MAKELPARAM(bCheck, 0)); + } + + BOOL PressButton(int nID, BOOL bPress = TRUE) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TB_PRESSBUTTON, nID, MAKELPARAM(bPress, 0)); + } + + BOOL HideButton(int nID, BOOL bHide = TRUE) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TB_HIDEBUTTON, nID, MAKELPARAM(bHide, 0)); + } + + BOOL Indeterminate(int nID, BOOL bIndeterminate = TRUE) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TB_INDETERMINATE, nID, MAKELPARAM(bIndeterminate, 0)); + } + + int AddBitmap(int nNumButtons, UINT nBitmapID) + { + ATLASSERT(::IsWindow(m_hWnd)); + TBADDBITMAP tbab = { 0 }; + tbab.hInst = ModuleHelper::GetResourceInstance(); + ATLASSERT(tbab.hInst != NULL); + tbab.nID = nBitmapID; + return (int)::SendMessage(m_hWnd, TB_ADDBITMAP, (WPARAM)nNumButtons, (LPARAM)&tbab); + } + + int AddBitmap(int nNumButtons, HBITMAP hBitmap) + { + ATLASSERT(::IsWindow(m_hWnd)); + TBADDBITMAP tbab = { 0 }; + tbab.hInst = NULL; + tbab.nID = (UINT_PTR)hBitmap; + return (int)::SendMessage(m_hWnd, TB_ADDBITMAP, (WPARAM)nNumButtons, (LPARAM)&tbab); + } + + BOOL AddButtons(int nNumButtons, LPTBBUTTON lpButtons) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TB_ADDBUTTONS, nNumButtons, (LPARAM)lpButtons); + } + + BOOL InsertButton(int nIndex, LPTBBUTTON lpButton) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TB_INSERTBUTTON, nIndex, (LPARAM)lpButton); + } + + BOOL InsertButton(int nIndex, int iCommand, BYTE Style, BYTE State, int iBitmap, + INT_PTR iString, DWORD_PTR lParam) + { + ATLASSERT(::IsWindow(m_hWnd)); + TBBUTTON tbb = { 0 }; + tbb.fsStyle = Style; + tbb.fsState = State; + tbb.idCommand = iCommand; + tbb.iBitmap = iBitmap; + tbb.iString = iString; + tbb.dwData = lParam; + return (BOOL)::SendMessage(m_hWnd, TB_INSERTBUTTON, nIndex, (LPARAM)&tbb); + } + + BOOL InsertButton(int nIndex, int iCommand, BYTE Style, BYTE State, int iBitmap, + LPCTSTR lpszItem, DWORD_PTR lParam) + { + return InsertButton(nIndex, iCommand, Style, State, iBitmap, (INT_PTR)lpszItem, lParam); + } + + BOOL AddButton(LPTBBUTTON lpButton) + { + return InsertButton(-1, lpButton); + } + + BOOL AddButton(int iCommand, BYTE Style, BYTE State, int iBitmap, INT_PTR iString, DWORD_PTR lParam) + { + return InsertButton(-1, iCommand, Style, State, iBitmap, iString, lParam); + } + + BOOL AddButton(int iCommand, BYTE Style, BYTE State, int iBitmap, LPCTSTR lpszItem, DWORD_PTR lParam) + { + return InsertButton(-1, iCommand, Style, State, iBitmap, lpszItem, lParam); + } + + BOOL DeleteButton(int nIndex) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TB_DELETEBUTTON, nIndex, 0L); + } + + UINT CommandToIndex(UINT nID) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (UINT)::SendMessage(m_hWnd, TB_COMMANDTOINDEX, nID, 0L); + } + +#ifndef _WIN32_WCE + void SaveState(HKEY hKeyRoot, LPCTSTR lpszSubKey, LPCTSTR lpszValueName) + { + ATLASSERT(::IsWindow(m_hWnd)); + TBSAVEPARAMS tbs = { 0 }; + tbs.hkr = hKeyRoot; + tbs.pszSubKey = lpszSubKey; + tbs.pszValueName = lpszValueName; + ::SendMessage(m_hWnd, TB_SAVERESTORE, (WPARAM)TRUE, (LPARAM)&tbs); + } + + void RestoreState(HKEY hKeyRoot, LPCTSTR lpszSubKey, LPCTSTR lpszValueName) + { + ATLASSERT(::IsWindow(m_hWnd)); + TBSAVEPARAMS tbs = { 0 }; + tbs.hkr = hKeyRoot; + tbs.pszSubKey = lpszSubKey; + tbs.pszValueName = lpszValueName; + ::SendMessage(m_hWnd, TB_SAVERESTORE, (WPARAM)FALSE, (LPARAM)&tbs); + } + + void Customize() + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, TB_CUSTOMIZE, 0, 0L); + } +#endif // !_WIN32_WCE + + int AddString(UINT nStringID) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, TB_ADDSTRING, (WPARAM)ModuleHelper::GetResourceInstance(), (LPARAM)nStringID); + } + + int AddStrings(LPCTSTR lpszStrings) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, TB_ADDSTRING, 0, (LPARAM)lpszStrings); + } + + void AutoSize() + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, TB_AUTOSIZE, 0, 0L); + } + + BOOL ChangeBitmap(int nID, int nBitmap) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TB_CHANGEBITMAP, nID, MAKELPARAM(nBitmap, 0)); + } + + int LoadImages(int nBitmapID) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, TB_LOADIMAGES, nBitmapID, (LPARAM)ModuleHelper::GetResourceInstance()); + } + + int LoadStdImages(int nBitmapID) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, TB_LOADIMAGES, nBitmapID, (LPARAM)HINST_COMMCTRL); + } + + BOOL ReplaceBitmap(LPTBREPLACEBITMAP ptbrb) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TB_REPLACEBITMAP, 0, (LPARAM)ptbrb); + } + +#if (_WIN32_IE >= 0x0400) + int HitTest(LPPOINT lpPoint) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, TB_HITTEST, 0, (LPARAM)lpPoint); + } + +#ifndef _WIN32_WCE + BOOL InsertMarkHitTest(LPPOINT lpPoint, LPTBINSERTMARK lptbim) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TB_INSERTMARKHITTEST, (WPARAM)lpPoint, (LPARAM)lptbim); + } + + BOOL InsertMarkHitTest(int x, int y, LPTBINSERTMARK lptbim) const + { + ATLASSERT(::IsWindow(m_hWnd)); + POINT pt = { x, y }; + return (BOOL)::SendMessage(m_hWnd, TB_INSERTMARKHITTEST, (WPARAM)&pt, (LPARAM)lptbim); + } + + BOOL MapAccelerator(TCHAR chAccel, int& nID) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TB_MAPACCELERATOR, (WPARAM)chAccel, (LPARAM)&nID); + } + + BOOL MarkButton(int nID, BOOL bHighlight = TRUE) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TB_MARKBUTTON, nID, MAKELPARAM(bHighlight, 0)); + } + + BOOL MoveButton(int nOldPos, int nNewPos) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TB_MOVEBUTTON, nOldPos, nNewPos); + } + + HRESULT GetObject(REFIID iid, LPVOID* ppvObject) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (HRESULT)::SendMessage(m_hWnd, TB_GETOBJECT, (WPARAM)&iid, (LPARAM)ppvObject); + } +#endif // !_WIN32_WCE +#endif // (_WIN32_IE >= 0x0400) +}; + +typedef CToolBarCtrlT CToolBarCtrl; + + +/////////////////////////////////////////////////////////////////////////////// +// CStatusBarCtrl + +template +class CStatusBarCtrlT : public TBase +{ +public: +// Constructors + CStatusBarCtrlT(HWND hWnd = NULL) : TBase(hWnd) + { } + + CStatusBarCtrlT< TBase >& operator =(HWND hWnd) + { + m_hWnd = hWnd; + return *this; + } + + HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, + DWORD dwStyle = 0, DWORD dwExStyle = 0, + ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) + { + return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); + } + +// Methods + static LPCTSTR GetWndClassName() + { + return STATUSCLASSNAME; + } + + int GetParts(int nParts, int* pParts) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, SB_GETPARTS, nParts, (LPARAM)pParts); + } + + BOOL SetParts(int nParts, int* pWidths) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, SB_SETPARTS, nParts, (LPARAM)pWidths); + } + + int GetTextLength(int nPane, int* pType = NULL) const + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(nPane < 256); + DWORD dwRet = (DWORD)::SendMessage(m_hWnd, SB_GETTEXTLENGTH, (WPARAM)nPane, 0L); + if (pType != NULL) + *pType = (int)(short)HIWORD(dwRet); + return (int)(short)LOWORD(dwRet); + } + + int GetText(int nPane, LPTSTR lpszText, int* pType = NULL) const + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(nPane < 256); + DWORD dwRet = (DWORD)::SendMessage(m_hWnd, SB_GETTEXT, (WPARAM)nPane, (LPARAM)lpszText); + if(pType != NULL) + *pType = (int)(short)HIWORD(dwRet); + return (int)(short)LOWORD(dwRet); + } + +#ifndef _ATL_NO_COM + BOOL GetTextBSTR(int nPane, BSTR& bstrText, int* pType = NULL) const + { + USES_CONVERSION; + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(nPane < 256); + ATLASSERT(bstrText == NULL); + int nLength = (int)(short)LOWORD(::SendMessage(m_hWnd, SB_GETTEXTLENGTH, (WPARAM)nPane, 0L)); + if(nLength == 0) + return FALSE; + + CTempBuffer buff; + LPTSTR lpstrText = buff.Allocate(nLength + 1); + if(lpstrText == NULL) + return FALSE; + + if(!GetText(nPane, lpstrText, pType)) + return FALSE; + + bstrText = ::SysAllocString(T2OLE(lpstrText)); + return (bstrText != NULL) ? TRUE : FALSE; + } +#endif // !_ATL_NO_COM + +#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) + int GetText(int nPane, _CSTRING_NS::CString& strText, int* pType = NULL) const + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(nPane < 256); + int nLength = (int)(short)LOWORD(::SendMessage(m_hWnd, SB_GETTEXTLENGTH, (WPARAM)nPane, 0L)); + if(nLength == 0) + return 0; + + LPTSTR lpstr = strText.GetBufferSetLength(nLength); + if(lpstr == NULL) + return 0; + return GetText(nPane, lpstr, pType); + } +#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) + + BOOL SetText(int nPane, LPCTSTR lpszText, int nType = 0) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(nPane < 256); + return (BOOL)::SendMessage(m_hWnd, SB_SETTEXT, (nPane | nType), (LPARAM)lpszText); + } + + BOOL GetRect(int nPane, LPRECT lpRect) const + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(nPane < 256); + return (BOOL)::SendMessage(m_hWnd, SB_GETRECT, nPane, (LPARAM)lpRect); + } + + BOOL GetBorders(int* pBorders) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, SB_GETBORDERS, 0, (LPARAM)pBorders); + } + + BOOL GetBorders(int& nHorz, int& nVert, int& nSpacing) const + { + ATLASSERT(::IsWindow(m_hWnd)); + int borders[3] = { 0, 0, 0 }; + BOOL bResult = (BOOL)::SendMessage(m_hWnd, SB_GETBORDERS, 0, (LPARAM)&borders); + if(bResult) + { + nHorz = borders[0]; + nVert = borders[1]; + nSpacing = borders[2]; + } + return bResult; + } + + void SetMinHeight(int nMin) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, SB_SETMINHEIGHT, nMin, 0L); + } + + BOOL SetSimple(BOOL bSimple = TRUE) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, SB_SIMPLE, bSimple, 0L); + } + + BOOL IsSimple() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, SB_ISSIMPLE, 0, 0L); + } + +#if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) + BOOL GetUnicodeFormat() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, SB_GETUNICODEFORMAT, 0, 0L); + } + + BOOL SetUnicodeFormat(BOOL bUnicode = TRUE) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, SB_SETUNICODEFORMAT, bUnicode, 0L); + } + + void GetTipText(int nPane, LPTSTR lpstrText, int nSize) const + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(nPane < 256); + ::SendMessage(m_hWnd, SB_GETTIPTEXT, MAKEWPARAM(nPane, nSize), (LPARAM)lpstrText); + } + + void SetTipText(int nPane, LPCTSTR lpstrText) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(nPane < 256); + ::SendMessage(m_hWnd, SB_SETTIPTEXT, nPane, (LPARAM)lpstrText); + } +#endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) + +#if ((_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)) || (defined(_WIN32_WCE) && (_WIN32_WCE >= 0x0500)) + COLORREF SetBkColor(COLORREF clrBk) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (COLORREF)::SendMessage(m_hWnd, SB_SETBKCOLOR, 0, (LPARAM)clrBk); + } + + HICON GetIcon(int nPane) const + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(nPane < 256); + return (HICON)::SendMessage(m_hWnd, SB_GETICON, nPane, 0L); + } + + BOOL SetIcon(int nPane, HICON hIcon) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(nPane < 256); + return (BOOL)::SendMessage(m_hWnd, SB_SETICON, nPane, (LPARAM)hIcon); + } +#endif // ((_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)) || (defined(_WIN32_WCE) && (_WIN32_WCE >= 0x0500)) +}; + +typedef CStatusBarCtrlT CStatusBarCtrl; + + +/////////////////////////////////////////////////////////////////////////////// +// CTabCtrl + +template +class CTabCtrlT : public TBase +{ +public: +// Constructors + CTabCtrlT(HWND hWnd = NULL) : TBase(hWnd) + { } + + CTabCtrlT< TBase >& operator =(HWND hWnd) + { + m_hWnd = hWnd; + return *this; + } + + HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, + DWORD dwStyle = 0, DWORD dwExStyle = 0, + ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) + { + return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); + } + +// Attributes + static LPCTSTR GetWndClassName() + { + return WC_TABCONTROL; + } + + CImageList GetImageList() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TCM_GETIMAGELIST, 0, 0L)); + } + + CImageList SetImageList(HIMAGELIST hImageList) + { + ATLASSERT(::IsWindow(m_hWnd)); + return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TCM_SETIMAGELIST, 0, (LPARAM)hImageList)); + } + + int GetItemCount() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, TCM_GETITEMCOUNT, 0, 0L); + } + + BOOL GetItem(int nItem, LPTCITEM pTabCtrlItem) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TCM_GETITEM, nItem, (LPARAM)pTabCtrlItem); + } + + BOOL SetItem(int nItem, LPTCITEM pTabCtrlItem) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TCM_SETITEM, nItem, (LPARAM)pTabCtrlItem); + } + + int SetItem(int nItem, UINT mask, LPCTSTR lpszItem, DWORD dwState, DWORD dwStateMask, int iImage, LPARAM lParam) + { + ATLASSERT(::IsWindow(m_hWnd)); + TCITEM tci = { 0 }; + tci.mask = mask; + tci.pszText = (LPTSTR) lpszItem; + tci.dwState = dwState; + tci.dwStateMask = dwStateMask; + tci.iImage = iImage; + tci.lParam = lParam; + return (int)::SendMessage(m_hWnd, TCM_SETITEM, nItem, (LPARAM)&tci); + } + + BOOL GetItemRect(int nItem, LPRECT lpRect) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TCM_GETITEMRECT, nItem, (LPARAM)lpRect); + } + + int GetCurSel() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, TCM_GETCURSEL, 0, 0L); + } + + int SetCurSel(int nItem) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, TCM_SETCURSEL, nItem, 0L); + } + + SIZE SetItemSize(SIZE size) + { + ATLASSERT(::IsWindow(m_hWnd)); + DWORD dwSize = (DWORD)::SendMessage(m_hWnd, TCM_SETITEMSIZE, 0, MAKELPARAM(size.cx, size.cy)); + SIZE sizeRet = { GET_X_LPARAM(dwSize), GET_Y_LPARAM(dwSize) }; + return sizeRet; + } + + void SetItemSize(int cx, int cy) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, TCM_SETITEMSIZE, 0, MAKELPARAM(cx, cy)); + } + + void SetPadding(SIZE size) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, TCM_SETPADDING, 0, MAKELPARAM(size.cx, size.cy)); + } + + int GetRowCount() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, TCM_GETROWCOUNT, 0, 0L); + } + +#ifndef _WIN32_WCE + CToolTipCtrl GetTooltips() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return CToolTipCtrl((HWND)::SendMessage(m_hWnd, TCM_GETTOOLTIPS, 0, 0L)); + } + + void SetTooltips(HWND hWndToolTip) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, TCM_SETTOOLTIPS, (WPARAM)hWndToolTip, 0L); + } +#endif // !_WIN32_WCE + + int GetCurFocus() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, TCM_GETCURFOCUS, 0, 0L); + } + + void SetCurFocus(int nItem) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, TCM_SETCURFOCUS, nItem, 0L); + } + + BOOL SetItemExtra(int cbExtra) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(GetItemCount() == 0); // must be empty + return (BOOL)::SendMessage(m_hWnd, TCM_SETITEMEXTRA, cbExtra, 0L); + } + + int SetMinTabWidth(int nWidth = -1) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, TCM_SETMINTABWIDTH, 0, nWidth); + } + +#if (_WIN32_IE >= 0x0400) + DWORD GetExtendedStyle() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (DWORD)::SendMessage(m_hWnd, TCM_GETEXTENDEDSTYLE, 0, 0L); + } + + DWORD SetExtendedStyle(DWORD dwExMask, DWORD dwExStyle) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (DWORD)::SendMessage(m_hWnd, TCM_SETEXTENDEDSTYLE, dwExMask, dwExStyle); + } + +#ifndef _WIN32_WCE + BOOL GetUnicodeFormat() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TCM_GETUNICODEFORMAT, 0, 0L); + } + + BOOL SetUnicodeFormat(BOOL bUnicode = TRUE) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TCM_SETUNICODEFORMAT, bUnicode, 0L); + } +#endif // !_WIN32_WCE +#endif // (_WIN32_IE >= 0x0400) + +// Operations + int InsertItem(int nItem, LPTCITEM pTabCtrlItem) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, TCM_INSERTITEM, nItem, (LPARAM)pTabCtrlItem); + } + + int InsertItem(int nItem, UINT mask, LPCTSTR lpszItem, int iImage, LPARAM lParam) + { + ATLASSERT(::IsWindow(m_hWnd)); + TCITEM tci = { 0 }; + tci.mask = mask; + tci.pszText = (LPTSTR) lpszItem; + tci.iImage = iImage; + tci.lParam = lParam; + return (int)::SendMessage(m_hWnd, TCM_INSERTITEM, nItem, (LPARAM)&tci); + } + + int InsertItem(int nItem, LPCTSTR lpszItem) + { + ATLASSERT(::IsWindow(m_hWnd)); + TCITEM tci = { 0 }; + tci.mask = TCIF_TEXT; + tci.pszText = (LPTSTR) lpszItem; + return (int)::SendMessage(m_hWnd, TCM_INSERTITEM, nItem, (LPARAM)&tci); + } + + int AddItem(LPTCITEM pTabCtrlItem) + { + return InsertItem(GetItemCount(), pTabCtrlItem); + } + + int AddItem(UINT mask, LPCTSTR lpszItem, int iImage, LPARAM lParam) + { + return InsertItem(GetItemCount(), mask, lpszItem, iImage, lParam); + } + + int AddItem(LPCTSTR lpszItem) + { + return InsertItem(GetItemCount(), lpszItem); + } + + BOOL DeleteItem(int nItem) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TCM_DELETEITEM, nItem, 0L); + } + + BOOL DeleteAllItems() + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TCM_DELETEALLITEMS, 0, 0L); + } + + void AdjustRect(BOOL bLarger, LPRECT lpRect) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, TCM_ADJUSTRECT, bLarger, (LPARAM)lpRect); + } + + void RemoveImage(int nImage) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, TCM_REMOVEIMAGE, nImage, 0L); + } + + int HitTest(TC_HITTESTINFO* pHitTestInfo) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, TCM_HITTEST, 0, (LPARAM)pHitTestInfo); + } + + void DeselectAll(BOOL bExcludeFocus = TRUE) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, TCM_DESELECTALL, bExcludeFocus, 0L); + } + +#if (_WIN32_IE >= 0x0400) + BOOL HighlightItem(int nIndex, BOOL bHighlight = TRUE) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TCM_HIGHLIGHTITEM, nIndex, MAKELPARAM(bHighlight, 0)); + } +#endif // (_WIN32_IE >= 0x0400) +}; + +typedef CTabCtrlT CTabCtrl; + + +/////////////////////////////////////////////////////////////////////////////// +// CTrackBarCtrl + +template +class CTrackBarCtrlT : public TBase +{ +public: +// Constructors + CTrackBarCtrlT(HWND hWnd = NULL) : TBase(hWnd) + { } + + CTrackBarCtrlT< TBase >& operator =(HWND hWnd) + { + m_hWnd = hWnd; + return *this; + } + + HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, + DWORD dwStyle = 0, DWORD dwExStyle = 0, + ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) + { + return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); + } + +// Attributes + static LPCTSTR GetWndClassName() + { + return TRACKBAR_CLASS; + } + + int GetLineSize() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, TBM_GETLINESIZE, 0, 0L); + } + + int SetLineSize(int nSize) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, TBM_SETLINESIZE, 0, nSize); + } + + int GetPageSize() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, TBM_GETPAGESIZE, 0, 0L); + } + + int SetPageSize(int nSize) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, TBM_SETPAGESIZE, 0, nSize); + } + + int GetRangeMin() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, TBM_GETRANGEMIN, 0, 0L); + } + + void SetRangeMin(int nMin, BOOL bRedraw = FALSE) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, TBM_SETRANGEMIN, bRedraw, nMin); + } + + int GetRangeMax() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, TBM_GETRANGEMAX, 0, 0L); + } + + void SetRangeMax(int nMax, BOOL bRedraw = FALSE) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, TBM_SETRANGEMAX, bRedraw, nMax); + } + + void GetRange(int& nMin, int& nMax) const + { + nMin = GetRangeMin(); + nMax = GetRangeMax(); + } + + void SetRange(int nMin, int nMax, BOOL bRedraw = TRUE) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, TBM_SETRANGE, bRedraw, MAKELPARAM(nMin, nMax)); + } + + int GetSelStart() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, TBM_GETSELSTART, 0, 0L); + } + + void SetSelStart(int nMin) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, TBM_SETSELSTART, 0, (LPARAM)nMin); + } + + int GetSelEnd() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, TBM_GETSELEND, 0, 0L); + } + + void SetSelEnd(int nMax) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, TBM_SETSELEND, 0, (LPARAM)nMax); + } + + void GetSelection(int& nMin, int& nMax) const + { + nMin = GetSelStart(); + nMax = GetSelEnd(); + } + + void SetSelection(int nMin, int nMax) + { + SetSelStart(nMin); + SetSelEnd(nMax); + } + + void GetChannelRect(LPRECT lprc) const + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, TBM_GETCHANNELRECT, 0, (LPARAM)lprc); + } + + void GetThumbRect(LPRECT lprc) const + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, TBM_GETTHUMBRECT, 0, (LPARAM)lprc); + } + + int GetPos() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, TBM_GETPOS, 0, 0L); + } + + void SetPos(int nPos) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, TBM_SETPOS, TRUE, nPos); + } + + UINT GetNumTics() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (UINT)::SendMessage(m_hWnd, TBM_GETNUMTICS, 0, 0L); + } + + DWORD* GetTicArray() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (DWORD*)::SendMessage(m_hWnd, TBM_GETPTICS, 0, 0L); + } + + int GetTic(int nTic) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, TBM_GETTIC, nTic, 0L); + } + + BOOL SetTic(int nTic) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TBM_SETTIC, 0, nTic); + } + + int GetTicPos(int nTic) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, TBM_GETTICPOS, nTic, 0L); + } + + void SetTicFreq(int nFreq) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, TBM_SETTICFREQ, nFreq, 0L); + } + + int GetThumbLength() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, TBM_GETTHUMBLENGTH, 0, 0L); + } + + void SetThumbLength(int nLength) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, TBM_SETTHUMBLENGTH, nLength, 0L); + } + + void SetSel(int nStart, int nEnd, BOOL bRedraw = TRUE) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT((GetStyle() & TBS_ENABLESELRANGE) != 0); + ::SendMessage(m_hWnd, TBM_SETSEL, bRedraw, MAKELPARAM(nStart, nEnd)); + } + + ATL::CWindow GetBuddy(BOOL bLeft = TRUE) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return ATL::CWindow((HWND)::SendMessage(m_hWnd, TBM_GETBUDDY, bLeft, 0L)); + } + + ATL::CWindow SetBuddy(HWND hWndBuddy, BOOL bLeft = TRUE) + { + ATLASSERT(::IsWindow(m_hWnd)); + return ATL::CWindow((HWND)::SendMessage(m_hWnd, TBM_SETBUDDY, bLeft, (LPARAM)hWndBuddy)); + } + +#ifndef _WIN32_WCE + CToolTipCtrl GetToolTips() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return CToolTipCtrl((HWND)::SendMessage(m_hWnd, TBM_GETTOOLTIPS, 0, 0L)); + } + + void SetToolTips(HWND hWndTT) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, TBM_SETTOOLTIPS, (WPARAM)hWndTT, 0L); + } + + int SetTipSide(int nSide) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, TBM_SETTIPSIDE, nSide, 0L); + } +#endif // !_WIN32_WCE + +#if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) + BOOL GetUnicodeFormat() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TBM_GETUNICODEFORMAT, 0, 0L); + } + + BOOL SetUnicodeFormat(BOOL bUnicode = TRUE) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, TBM_SETUNICODEFORMAT, bUnicode, 0L); + } +#endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) + +// Operations + void ClearSel(BOOL bRedraw = FALSE) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, TBM_CLEARSEL, bRedraw, 0L); + } + + void VerifyPos() + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, TBM_SETPOS, FALSE, 0L); + } + + void ClearTics(BOOL bRedraw = FALSE) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, TBM_CLEARTICS, bRedraw, 0L); + } +}; + +typedef CTrackBarCtrlT CTrackBarCtrl; + + +/////////////////////////////////////////////////////////////////////////////// +// CUpDownCtrl + +template +class CUpDownCtrlT : public TBase +{ +public: +// Constructors + CUpDownCtrlT(HWND hWnd = NULL) : TBase(hWnd) + { } + + CUpDownCtrlT< TBase >& operator =(HWND hWnd) + { + m_hWnd = hWnd; + return *this; + } + + HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, + DWORD dwStyle = 0, DWORD dwExStyle = 0, + ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) + { + return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); + } + +// Attributes + static LPCTSTR GetWndClassName() + { + return UPDOWN_CLASS; + } + + UINT GetAccel(int nAccel, UDACCEL* pAccel) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (UINT)LOWORD(::SendMessage(m_hWnd, UDM_GETACCEL, nAccel, (LPARAM)pAccel)); + } + + BOOL SetAccel(int nAccel, UDACCEL* pAccel) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)LOWORD(::SendMessage(m_hWnd, UDM_SETACCEL, nAccel, (LPARAM)pAccel)); + } + + UINT GetBase() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (UINT)LOWORD(::SendMessage(m_hWnd, UDM_GETBASE, 0, 0L)); + } + + int SetBase(int nBase) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, UDM_SETBASE, nBase, 0L); + } + + ATL::CWindow GetBuddy() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return ATL::CWindow((HWND)::SendMessage(m_hWnd, UDM_GETBUDDY, 0, 0L)); + } + + ATL::CWindow SetBuddy(HWND hWndBuddy) + { + ATLASSERT(::IsWindow(m_hWnd)); + return ATL::CWindow((HWND)::SendMessage(m_hWnd, UDM_SETBUDDY, (WPARAM)hWndBuddy, 0L)); + } + + int GetPos(LPBOOL lpbError = NULL) const + { + ATLASSERT(::IsWindow(m_hWnd)); + DWORD dwRet = (DWORD)::SendMessage(m_hWnd, UDM_GETPOS, 0, 0L); + // Note: Seems that Windows always sets error to TRUE if + // UDS_SETBUDDYINT style is not used + if(lpbError != NULL) + *lpbError = (HIWORD(dwRet) != 0) ? TRUE : FALSE; + return (int)(short)LOWORD(dwRet); + } + + int SetPos(int nPos) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)(short)LOWORD(::SendMessage(m_hWnd, UDM_SETPOS, 0, MAKELPARAM(nPos, 0))); + } + + DWORD GetRange() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (DWORD)::SendMessage(m_hWnd, UDM_GETRANGE, 0, 0L); + } + + void GetRange(int& nLower, int& nUpper) const + { + ATLASSERT(::IsWindow(m_hWnd)); + DWORD dwRet = (DWORD)::SendMessage(m_hWnd, UDM_GETRANGE, 0, 0L); + nLower = (int)(short)HIWORD(dwRet); + nUpper = (int)(short)LOWORD(dwRet); + } + + void SetRange(int nLower, int nUpper) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, UDM_SETRANGE, 0, MAKELPARAM(nUpper, nLower)); + } + +#if (_WIN32_IE >= 0x0400) + void SetRange32(int nLower, int nUpper) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, UDM_SETRANGE32, nLower, nUpper); + } + + void GetRange32(int& nLower, int& nUpper) const + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, UDM_GETRANGE32, (WPARAM)&nLower, (LPARAM)&nUpper); + } + +#ifndef _WIN32_WCE + BOOL GetUnicodeFormat() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, UDM_GETUNICODEFORMAT, 0, 0L); + } + + BOOL SetUnicodeFormat(BOOL bUnicode = TRUE) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, UDM_SETUNICODEFORMAT, bUnicode, 0L); + } +#endif // !_WIN32_WCE +#endif // (_WIN32_IE >= 0x0400) + +#if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) + int GetPos32(LPBOOL lpbError = NULL) const + { + ATLASSERT(::IsWindow(m_hWnd)); + // Note: Seems that Windows always sets error to TRUE if + // UDS_SETBUDDYINT style is not used + return (int)::SendMessage(m_hWnd, UDM_GETPOS32, 0, (LPARAM)lpbError); + } + + int SetPos32(int nPos) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, UDM_SETPOS32, 0, (LPARAM)nPos); + } +#endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) +}; + +typedef CUpDownCtrlT CUpDownCtrl; + + +/////////////////////////////////////////////////////////////////////////////// +// CProgressBarCtrl + +template +class CProgressBarCtrlT : public TBase +{ +public: +// Constructors + CProgressBarCtrlT(HWND hWnd = NULL) : TBase(hWnd) + { } + + CProgressBarCtrlT< TBase >& operator =(HWND hWnd) + { + m_hWnd = hWnd; + return *this; + } + + HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, + DWORD dwStyle = 0, DWORD dwExStyle = 0, + ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) + { + return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); + } + +// Attributes + static LPCTSTR GetWndClassName() + { + return PROGRESS_CLASS; + } + + DWORD SetRange(int nLower, int nUpper) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (DWORD)::SendMessage(m_hWnd, PBM_SETRANGE, 0, MAKELPARAM(nLower, nUpper)); + } + + int SetPos(int nPos) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)(short)LOWORD(::SendMessage(m_hWnd, PBM_SETPOS, nPos, 0L)); + } + + int OffsetPos(int nPos) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)(short)LOWORD(::SendMessage(m_hWnd, PBM_DELTAPOS, nPos, 0L)); + } + + int SetStep(int nStep) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)(short)LOWORD(::SendMessage(m_hWnd, PBM_SETSTEP, nStep, 0L)); + } + + UINT GetPos() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (UINT)::SendMessage(m_hWnd, PBM_GETPOS, 0, 0L); + } + + void GetRange(PPBRANGE pPBRange) const + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(pPBRange != NULL); + ::SendMessage(m_hWnd, PBM_GETRANGE, TRUE, (LPARAM)pPBRange); + } + + void GetRange(int& nLower, int& nUpper) const + { + ATLASSERT(::IsWindow(m_hWnd)); + PBRANGE range = { 0 }; + ::SendMessage(m_hWnd, PBM_GETRANGE, TRUE, (LPARAM)&range); + nLower = range.iLow; + nUpper = range.iHigh; + } + + int GetRangeLimit(BOOL bLowLimit) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, PBM_GETRANGE, bLowLimit, (LPARAM)NULL); + } + + DWORD SetRange32(int nMin, int nMax) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (DWORD)::SendMessage(m_hWnd, PBM_SETRANGE32, nMin, nMax); + } + +#if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) + COLORREF SetBarColor(COLORREF clr) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (COLORREF)::SendMessage(m_hWnd, PBM_SETBARCOLOR, 0, (LPARAM)clr); + } + + COLORREF SetBkColor(COLORREF clr) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (COLORREF)::SendMessage(m_hWnd, PBM_SETBKCOLOR, 0, (LPARAM)clr); + } +#endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) + +#if (_WIN32_WINNT >= 0x0501) && defined(PBM_SETMARQUEE) + BOOL SetMarquee(BOOL bMarquee, UINT uUpdateTime = 0U) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, PBM_SETMARQUEE, (WPARAM)bMarquee, (LPARAM)uUpdateTime); + } +#endif // (_WIN32_WINNT >= 0x0501) && defined(PBM_SETMARQUEE) + +#if (_WIN32_WINNT >= 0x0600) + int GetStep() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, PBM_GETSTEP, 0, 0L); + } + + COLORREF GetBkColor() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (COLORREF)::SendMessage(m_hWnd, PBM_GETBKCOLOR, 0, 0L); + } + + COLORREF GetBarColor() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (COLORREF)::SendMessage(m_hWnd, PBM_GETBARCOLOR, 0, 0L); + } + + int GetState() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, PBM_GETSTATE, 0, 0L); + } + + int SetState(int nState) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, PBM_SETSTATE, nState, 0L); + } +#endif // (_WIN32_WINNT >= 0x0600) + +// Operations + int StepIt() + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)(short)LOWORD(::SendMessage(m_hWnd, PBM_STEPIT, 0, 0L)); + } +}; + +typedef CProgressBarCtrlT CProgressBarCtrl; + + +/////////////////////////////////////////////////////////////////////////////// +// CHotKeyCtrl + +#ifndef _WIN32_WCE + +template +class CHotKeyCtrlT : public TBase +{ +public: +// Constructors + CHotKeyCtrlT(HWND hWnd = NULL) : TBase(hWnd) + { } + + CHotKeyCtrlT< TBase >& operator =(HWND hWnd) + { + m_hWnd = hWnd; + return *this; + } + + HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, + DWORD dwStyle = 0, DWORD dwExStyle = 0, + ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) + { + return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); + } + +// Attributes + static LPCTSTR GetWndClassName() + { + return HOTKEY_CLASS; + } + + DWORD GetHotKey() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (DWORD)::SendMessage(m_hWnd, HKM_GETHOTKEY, 0, 0L); + } + + void GetHotKey(WORD &wVirtualKeyCode, WORD &wModifiers) const + { + ATLASSERT(::IsWindow(m_hWnd)); + DWORD dw = (DWORD)::SendMessage(m_hWnd, HKM_GETHOTKEY, 0, 0L); + wVirtualKeyCode = LOBYTE(LOWORD(dw)); + wModifiers = HIBYTE(LOWORD(dw)); + } + + void SetHotKey(WORD wVirtualKeyCode, WORD wModifiers) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, HKM_SETHOTKEY, MAKEWORD(wVirtualKeyCode, wModifiers), 0L); + } + + void SetRules(WORD wInvalidComb, WORD wModifiers) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, HKM_SETRULES, wInvalidComb, MAKELPARAM(wModifiers, 0)); + } +}; + +typedef CHotKeyCtrlT CHotKeyCtrl; + +#endif // !_WIN32_WCE + + +/////////////////////////////////////////////////////////////////////////////// +// CAnimateCtrl + +#ifndef _WIN32_WCE + +template +class CAnimateCtrlT : public TBase +{ +public: +// Constructors + CAnimateCtrlT(HWND hWnd = NULL) : TBase(hWnd) + { } + + CAnimateCtrlT< TBase >& operator =(HWND hWnd) + { + m_hWnd = hWnd; + return *this; + } + + HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, + DWORD dwStyle = 0, DWORD dwExStyle = 0, + ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) + { + return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); + } + +// Attributes + static LPCTSTR GetWndClassName() + { + return ANIMATE_CLASS; + } + +// Operations + BOOL Open(ATL::_U_STRINGorID FileName) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, ACM_OPEN, 0, (LPARAM)FileName.m_lpstr); + } + + BOOL Play(UINT nFrom, UINT nTo, UINT nRep) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, ACM_PLAY, nRep, MAKELPARAM(nFrom, nTo)); + } + + BOOL Stop() + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, ACM_STOP, 0, 0L); + } + + BOOL Close() + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, ACM_OPEN, 0, 0L); + } + + BOOL Seek(UINT nTo) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, ACM_PLAY, 0, MAKELPARAM(nTo, nTo)); + } + + // Vista only + BOOL IsPlaying() const + { +#ifndef ACM_ISPLAYING + const UINT ACM_ISPLAYING = (WM_USER+104); +#endif + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, ACM_ISPLAYING, 0, 0L); + } +}; + +typedef CAnimateCtrlT CAnimateCtrl; + +#endif // !_WIN32_WCE + + +/////////////////////////////////////////////////////////////////////////////// +// CRichEditCtrl + +#ifndef _WIN32_WCE + +#ifdef _UNICODE +#if (_RICHEDIT_VER == 0x0100) +#undef RICHEDIT_CLASS +#define RICHEDIT_CLASS L"RICHEDIT" +#endif // (_RICHEDIT_VER == 0x0100) +#endif // _UNICODE + +template +class CRichEditCtrlT : public TBase +{ +public: +// Constructors + CRichEditCtrlT(HWND hWnd = NULL) : TBase(hWnd) + { } + + CRichEditCtrlT< TBase >& operator =(HWND hWnd) + { + m_hWnd = hWnd; + return *this; + } + + HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, + DWORD dwStyle = 0, DWORD dwExStyle = 0, + ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) + { + return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); + } + +// Attributes + static LPCTSTR GetWndClassName() + { + return RICHEDIT_CLASS; + } + + static LPCTSTR GetLibraryName() + { +#if (_RICHEDIT_VER >= 0x0200) + return _T("RICHED20.DLL"); +#else + return _T("RICHED32.DLL"); +#endif + } + + int GetLineCount() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, EM_GETLINECOUNT, 0, 0L); + } + + BOOL GetModify() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, EM_GETMODIFY, 0, 0L); + } + + void SetModify(BOOL bModified = TRUE) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, EM_SETMODIFY, bModified, 0L); + } + + void GetRect(LPRECT lpRect) const + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, EM_GETRECT, 0, (LPARAM)lpRect); + } + + DWORD GetOptions() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (DWORD)::SendMessage(m_hWnd, EM_GETOPTIONS, 0, 0L); + } + + DWORD SetOptions(WORD wOperation, DWORD dwOptions) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (DWORD)::SendMessage(m_hWnd, EM_SETOPTIONS, wOperation, dwOptions); + } + + // NOTE: first word in lpszBuffer must contain the size of the buffer! + int GetLine(int nIndex, LPTSTR lpszBuffer) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, EM_GETLINE, nIndex, (LPARAM)lpszBuffer); + } + + int GetLine(int nIndex, LPTSTR lpszBuffer, int nMaxLength) const + { + ATLASSERT(::IsWindow(m_hWnd)); + *(LPWORD)lpszBuffer = (WORD)nMaxLength; + return (int)::SendMessage(m_hWnd, EM_GETLINE, nIndex, (LPARAM)lpszBuffer); + } + + BOOL CanUndo() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, EM_CANUNDO, 0, 0L); + } + + BOOL CanPaste(UINT nFormat = 0) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, EM_CANPASTE, nFormat, 0L); + } + + void GetSel(LONG& nStartChar, LONG& nEndChar) const + { + ATLASSERT(::IsWindow(m_hWnd)); + CHARRANGE cr = { 0, 0 }; + ::SendMessage(m_hWnd, EM_EXGETSEL, 0, (LPARAM)&cr); + nStartChar = cr.cpMin; + nEndChar = cr.cpMax; + } + + void GetSel(CHARRANGE &cr) const + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, EM_EXGETSEL, 0, (LPARAM)&cr); + } + + int SetSel(LONG nStartChar, LONG nEndChar) + { + ATLASSERT(::IsWindow(m_hWnd)); + CHARRANGE cr = { nStartChar, nEndChar }; + return (int)::SendMessage(m_hWnd, EM_EXSETSEL, 0, (LPARAM)&cr); + } + + int SetSel(CHARRANGE &cr) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, EM_EXSETSEL, 0, (LPARAM)&cr); + } + + int SetSelAll() + { + return SetSel(0, -1); + } + + int SetSelNone() + { + return SetSel(-1, 0); + } + + DWORD GetDefaultCharFormat(CHARFORMAT& cf) const + { + ATLASSERT(::IsWindow(m_hWnd)); + cf.cbSize = sizeof(CHARFORMAT); + return (DWORD)::SendMessage(m_hWnd, EM_GETCHARFORMAT, 0, (LPARAM)&cf); + } + + DWORD GetSelectionCharFormat(CHARFORMAT& cf) const + { + ATLASSERT(::IsWindow(m_hWnd)); + cf.cbSize = sizeof(CHARFORMAT); + return (DWORD)::SendMessage(m_hWnd, EM_GETCHARFORMAT, 1, (LPARAM)&cf); + } + + DWORD GetEventMask() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (DWORD)::SendMessage(m_hWnd, EM_GETEVENTMASK, 0, 0L); + } + + LONG GetLimitText() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (LONG)::SendMessage(m_hWnd, EM_GETLIMITTEXT, 0, 0L); + } + + DWORD GetParaFormat(PARAFORMAT& pf) const + { + ATLASSERT(::IsWindow(m_hWnd)); + pf.cbSize = sizeof(PARAFORMAT); + return (DWORD)::SendMessage(m_hWnd, EM_GETPARAFORMAT, 0, (LPARAM)&pf); + } + +#if (_RICHEDIT_VER >= 0x0200) + LONG GetSelText(LPTSTR lpstrBuff) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (LONG)::SendMessage(m_hWnd, EM_GETSELTEXT, 0, (LPARAM)lpstrBuff); + } +#else // !(_RICHEDIT_VER >= 0x0200) + // RichEdit 1.0 EM_GETSELTEXT is ANSI only + LONG GetSelText(LPSTR lpstrBuff) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (LONG)::SendMessage(m_hWnd, EM_GETSELTEXT, 0, (LPARAM)lpstrBuff); + } +#endif // !(_RICHEDIT_VER >= 0x0200) + +#ifndef _ATL_NO_COM + BOOL GetSelTextBSTR(BSTR& bstrText) const + { + USES_CONVERSION; + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(bstrText == NULL); + + CHARRANGE cr = { 0, 0 }; + ::SendMessage(m_hWnd, EM_EXGETSEL, 0, (LPARAM)&cr); + +#if (_RICHEDIT_VER >= 0x0200) + CTempBuffer buff; + LPTSTR lpstrText = buff.Allocate(cr.cpMax - cr.cpMin + 1); + if(lpstrText == NULL) + return FALSE; + if(::SendMessage(m_hWnd, EM_GETSELTEXT, 0, (LPARAM)lpstrText) == 0) + return FALSE; + + bstrText = ::SysAllocString(T2W(lpstrText)); +#else // !(_RICHEDIT_VER >= 0x0200) + CTempBuffer buff; + LPSTR lpstrText = buff.Allocate(cr.cpMax - cr.cpMin + 1); + if(lpstrText == NULL) + return FALSE; + if(::SendMessage(m_hWnd, EM_GETSELTEXT, 0, (LPARAM)lpstrText) == 0) + return FALSE; + + bstrText = ::SysAllocString(A2W(lpstrText)); +#endif // !(_RICHEDIT_VER >= 0x0200) + + return (bstrText != NULL) ? TRUE : FALSE; + } +#endif // !_ATL_NO_COM + +#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) + LONG GetSelText(_CSTRING_NS::CString& strText) const + { + ATLASSERT(::IsWindow(m_hWnd)); + + CHARRANGE cr = { 0, 0 }; + ::SendMessage(m_hWnd, EM_EXGETSEL, 0, (LPARAM)&cr); + +#if (_RICHEDIT_VER >= 0x0200) + LONG lLen = 0; + LPTSTR lpstrText = strText.GetBufferSetLength(cr.cpMax - cr.cpMin); + if(lpstrText != NULL) + { + lLen = (LONG)::SendMessage(m_hWnd, EM_GETSELTEXT, 0, (LPARAM)lpstrText); + strText.ReleaseBuffer(); + } +#else // !(_RICHEDIT_VER >= 0x0200) + CTempBuffer buff; + LPSTR lpstrText = buff.Allocate(cr.cpMax - cr.cpMin + 1); + if(lpstrText == NULL) + return 0; + LONG lLen = (LONG)::SendMessage(m_hWnd, EM_GETSELTEXT, 0, (LPARAM)lpstrText); + if(lLen == 0) + return 0; + + USES_CONVERSION; + strText = A2T(lpstrText); +#endif // !(_RICHEDIT_VER >= 0x0200) + + return lLen; + } +#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) + + WORD GetSelectionType() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (WORD)::SendMessage(m_hWnd, EM_SELECTIONTYPE, 0, 0L); + } + + COLORREF SetBackgroundColor(COLORREF cr) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (COLORREF)::SendMessage(m_hWnd, EM_SETBKGNDCOLOR, 0, cr); + } + + COLORREF SetBackgroundColor() // sets to system background + { + ATLASSERT(::IsWindow(m_hWnd)); + return (COLORREF)::SendMessage(m_hWnd, EM_SETBKGNDCOLOR, 1, 0); + } + + BOOL SetCharFormat(CHARFORMAT& cf, WORD wFlags) + { + ATLASSERT(::IsWindow(m_hWnd)); + cf.cbSize = sizeof(CHARFORMAT); + return (BOOL)::SendMessage(m_hWnd, EM_SETCHARFORMAT, (WPARAM)wFlags, (LPARAM)&cf); + } + + BOOL SetDefaultCharFormat(CHARFORMAT& cf) + { + ATLASSERT(::IsWindow(m_hWnd)); + cf.cbSize = sizeof(CHARFORMAT); + return (BOOL)::SendMessage(m_hWnd, EM_SETCHARFORMAT, 0, (LPARAM)&cf); + } + + BOOL SetSelectionCharFormat(CHARFORMAT& cf) + { + ATLASSERT(::IsWindow(m_hWnd)); + cf.cbSize = sizeof(CHARFORMAT); + return (BOOL)::SendMessage(m_hWnd, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf); + } + + BOOL SetWordCharFormat(CHARFORMAT& cf) + { + ATLASSERT(::IsWindow(m_hWnd)); + cf.cbSize = sizeof(CHARFORMAT); + return (BOOL)::SendMessage(m_hWnd, EM_SETCHARFORMAT, SCF_SELECTION | SCF_WORD, (LPARAM)&cf); + } + + DWORD SetEventMask(DWORD dwEventMask) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (DWORD)::SendMessage(m_hWnd, EM_SETEVENTMASK, 0, dwEventMask); + } + + BOOL SetParaFormat(PARAFORMAT& pf) + { + ATLASSERT(::IsWindow(m_hWnd)); + pf.cbSize = sizeof(PARAFORMAT); + return (BOOL)::SendMessage(m_hWnd, EM_SETPARAFORMAT, 0, (LPARAM)&pf); + } + + BOOL SetTargetDevice(HDC hDC, int cxLineWidth) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, EM_SETTARGETDEVICE, (WPARAM)hDC, cxLineWidth); + } + + int GetTextLength() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, WM_GETTEXTLENGTH, 0, 0L); + } + + BOOL SetReadOnly(BOOL bReadOnly = TRUE) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, EM_SETREADONLY, bReadOnly, 0L); + } + + int GetFirstVisibleLine() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, EM_GETFIRSTVISIBLELINE, 0, 0L); + } + + EDITWORDBREAKPROCEX GetWordBreakProcEx() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (EDITWORDBREAKPROCEX)::SendMessage(m_hWnd, EM_GETWORDBREAKPROCEX, 0, 0L); + } + + EDITWORDBREAKPROCEX SetWordBreakProcEx(EDITWORDBREAKPROCEX pfnEditWordBreakProcEx) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (EDITWORDBREAKPROCEX)::SendMessage(m_hWnd, EM_SETWORDBREAKPROCEX, 0, (LPARAM)pfnEditWordBreakProcEx); + } + + int GetTextRange(TEXTRANGE* pTextRange) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, EM_GETTEXTRANGE, 0, (LPARAM)pTextRange); + } + +#if (_RICHEDIT_VER >= 0x0200) + int GetTextRange(LONG nStartChar, LONG nEndChar, LPTSTR lpstrText) const + { + ATLASSERT(::IsWindow(m_hWnd)); + TEXTRANGE tr = { 0 }; + tr.chrg.cpMin = nStartChar; + tr.chrg.cpMax = nEndChar; + tr.lpstrText = lpstrText; + return (int)::SendMessage(m_hWnd, EM_GETTEXTRANGE, 0, (LPARAM)&tr); + } +#else // !(_RICHEDIT_VER >= 0x0200) + + int GetTextRange(LONG nStartChar, LONG nEndChar, LPSTR lpstrText) const + { + ATLASSERT(::IsWindow(m_hWnd)); + TEXTRANGE tr = { 0 }; + tr.chrg.cpMin = nStartChar; + tr.chrg.cpMax = nEndChar; + tr.lpstrText = lpstrText; + return (int)::SendMessage(m_hWnd, EM_GETTEXTRANGE, 0, (LPARAM)&tr); + } +#endif // !(_RICHEDIT_VER >= 0x0200) + +#if (_RICHEDIT_VER >= 0x0200) + DWORD GetDefaultCharFormat(CHARFORMAT2& cf) const + { + ATLASSERT(::IsWindow(m_hWnd)); + cf.cbSize = sizeof(CHARFORMAT2); + return (DWORD)::SendMessage(m_hWnd, EM_GETCHARFORMAT, 0, (LPARAM)&cf); + } + + BOOL SetCharFormat(CHARFORMAT2& cf, WORD wFlags) + { + ATLASSERT(::IsWindow(m_hWnd)); + cf.cbSize = sizeof(CHARFORMAT2); + return (BOOL)::SendMessage(m_hWnd, EM_SETCHARFORMAT, (WPARAM)wFlags, (LPARAM)&cf); + } + + BOOL SetDefaultCharFormat(CHARFORMAT2& cf) + { + ATLASSERT(::IsWindow(m_hWnd)); + cf.cbSize = sizeof(CHARFORMAT2); + return (BOOL)::SendMessage(m_hWnd, EM_SETCHARFORMAT, 0, (LPARAM)&cf); + } + + DWORD GetSelectionCharFormat(CHARFORMAT2& cf) const + { + ATLASSERT(::IsWindow(m_hWnd)); + cf.cbSize = sizeof(CHARFORMAT2); + return (DWORD)::SendMessage(m_hWnd, EM_GETCHARFORMAT, 1, (LPARAM)&cf); + } + + BOOL SetSelectionCharFormat(CHARFORMAT2& cf) + { + ATLASSERT(::IsWindow(m_hWnd)); + cf.cbSize = sizeof(CHARFORMAT2); + return (BOOL)::SendMessage(m_hWnd, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf); + } + + BOOL SetWordCharFormat(CHARFORMAT2& cf) + { + ATLASSERT(::IsWindow(m_hWnd)); + cf.cbSize = sizeof(CHARFORMAT2); + return (BOOL)::SendMessage(m_hWnd, EM_SETCHARFORMAT, SCF_SELECTION | SCF_WORD, (LPARAM)&cf); + } + + DWORD GetParaFormat(PARAFORMAT2& pf) const + { + ATLASSERT(::IsWindow(m_hWnd)); + pf.cbSize = sizeof(PARAFORMAT2); + return (DWORD)::SendMessage(m_hWnd, EM_GETPARAFORMAT, 0, (LPARAM)&pf); + } + + BOOL SetParaFormat(PARAFORMAT2& pf) + { + ATLASSERT(::IsWindow(m_hWnd)); + pf.cbSize = sizeof(PARAFORMAT2); + return (BOOL)::SendMessage(m_hWnd, EM_SETPARAFORMAT, 0, (LPARAM)&pf); + } + + TEXTMODE GetTextMode() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (TEXTMODE)::SendMessage(m_hWnd, EM_GETTEXTMODE, 0, 0L); + } + + BOOL SetTextMode(TEXTMODE enumTextMode) + { + ATLASSERT(::IsWindow(m_hWnd)); + return !(BOOL)::SendMessage(m_hWnd, EM_SETTEXTMODE, enumTextMode, 0L); + } + + UNDONAMEID GetUndoName() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (UNDONAMEID)::SendMessage(m_hWnd, EM_GETUNDONAME, 0, 0L); + } + + UNDONAMEID GetRedoName() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (UNDONAMEID)::SendMessage(m_hWnd, EM_GETREDONAME, 0, 0L); + } + + BOOL CanRedo() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, EM_CANREDO, 0, 0L); + } + + BOOL GetAutoURLDetect() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, EM_GETAUTOURLDETECT, 0, 0L); + } + + BOOL SetAutoURLDetect(BOOL bAutoDetect = TRUE) + { + ATLASSERT(::IsWindow(m_hWnd)); + return !(BOOL)::SendMessage(m_hWnd, EM_AUTOURLDETECT, bAutoDetect, 0L); + } + + // this method is deprecated, please use SetAutoURLDetect + BOOL EnableAutoURLDetect(BOOL bEnable = TRUE) { return SetAutoURLDetect(bEnable); } + + UINT SetUndoLimit(UINT uUndoLimit) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (UINT)::SendMessage(m_hWnd, EM_SETUNDOLIMIT, uUndoLimit, 0L); + } + + void SetPalette(HPALETTE hPalette) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, EM_SETPALETTE, (WPARAM)hPalette, 0L); + } + + int GetTextEx(GETTEXTEX* pGetTextEx, LPTSTR lpstrText) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, EM_GETTEXTEX, (WPARAM)pGetTextEx, (LPARAM)lpstrText); + } + + int GetTextEx(LPTSTR lpstrText, int nTextLen, DWORD dwFlags = GT_DEFAULT, UINT uCodePage = CP_ACP, LPCSTR lpDefaultChar = NULL, LPBOOL lpUsedDefChar = NULL) const + { + ATLASSERT(::IsWindow(m_hWnd)); + GETTEXTEX gte = { 0 }; + gte.cb = nTextLen * sizeof(TCHAR); + gte.codepage = uCodePage; + gte.flags = dwFlags; + gte.lpDefaultChar = lpDefaultChar; + gte.lpUsedDefChar = lpUsedDefChar; + return (int)::SendMessage(m_hWnd, EM_GETTEXTEX, (WPARAM)>e, (LPARAM)lpstrText); + } + + int GetTextLengthEx(GETTEXTLENGTHEX* pGetTextLengthEx) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, EM_GETTEXTLENGTHEX, (WPARAM)pGetTextLengthEx, 0L); + } + + int GetTextLengthEx(DWORD dwFlags = GTL_DEFAULT, UINT uCodePage = CP_ACP) const + { + ATLASSERT(::IsWindow(m_hWnd)); + GETTEXTLENGTHEX gtle = { 0 }; + gtle.codepage = uCodePage; + gtle.flags = dwFlags; + return (int)::SendMessage(m_hWnd, EM_GETTEXTLENGTHEX, (WPARAM)>le, 0L); + } +#endif // (_RICHEDIT_VER >= 0x0200) + +#if (_RICHEDIT_VER >= 0x0300) + int SetTextEx(SETTEXTEX* pSetTextEx, LPCTSTR lpstrText) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, EM_SETTEXTEX, (WPARAM)pSetTextEx, (LPARAM)lpstrText); + } + + int SetTextEx(LPCTSTR lpstrText, DWORD dwFlags = ST_DEFAULT, UINT uCodePage = CP_ACP) + { + ATLASSERT(::IsWindow(m_hWnd)); + SETTEXTEX ste = { 0 }; + ste.flags = dwFlags; + ste.codepage = uCodePage; + return (int)::SendMessage(m_hWnd, EM_SETTEXTEX, (WPARAM)&ste, (LPARAM)lpstrText); + } + + int GetEditStyle() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, EM_GETEDITSTYLE, 0, 0L); + } + + int SetEditStyle(int nStyle, int nMask = -1) + { + ATLASSERT(::IsWindow(m_hWnd)); + if(nMask == -1) + nMask = nStyle; // set everything specified + return (int)::SendMessage(m_hWnd, EM_SETEDITSTYLE, nStyle, nMask); + } + + BOOL SetFontSize(int nFontSizeDelta) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(nFontSizeDelta >= -1637 && nFontSizeDelta <= 1638); + return (BOOL)::SendMessage(m_hWnd, EM_SETFONTSIZE, nFontSizeDelta, 0L); + } + + void GetScrollPos(LPPOINT lpPoint) const + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(lpPoint != NULL); + ::SendMessage(m_hWnd, EM_GETSCROLLPOS, 0, (LPARAM)lpPoint); + } + + void SetScrollPos(LPPOINT lpPoint) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(lpPoint != NULL); + ::SendMessage(m_hWnd, EM_SETSCROLLPOS, 0, (LPARAM)lpPoint); + } + + BOOL GetZoom(int& nNum, int& nDen) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, EM_GETZOOM, (WPARAM)&nNum, (LPARAM)&nDen); + } + + BOOL SetZoom(int nNum, int nDen) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(nNum >= 0 && nNum <= 64); + ATLASSERT(nDen >= 0 && nDen <= 64); + return (BOOL)::SendMessage(m_hWnd, EM_SETZOOM, nNum, nDen); + } + + BOOL SetZoomOff() + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, EM_SETZOOM, 0, 0L); + } +#endif // (_RICHEDIT_VER >= 0x0300) + +// Operations + void LimitText(LONG nChars = 0) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, EM_EXLIMITTEXT, 0, nChars); + } + + int LineFromChar(LONG nIndex) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, EM_EXLINEFROMCHAR, 0, nIndex); + } + + POINT PosFromChar(LONG nChar) const + { + ATLASSERT(::IsWindow(m_hWnd)); + POINT point = { 0, 0 }; + ::SendMessage(m_hWnd, EM_POSFROMCHAR, (WPARAM)&point, nChar); + return point; + } + + int CharFromPos(POINT pt) const + { + ATLASSERT(::IsWindow(m_hWnd)); + POINTL ptl = { pt.x, pt.y }; + return (int)::SendMessage(m_hWnd, EM_CHARFROMPOS, 0, (LPARAM)&ptl); + } + + void EmptyUndoBuffer() + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, EM_EMPTYUNDOBUFFER, 0, 0L); + } + + int LineIndex(int nLine = -1) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, EM_LINEINDEX, nLine, 0L); + } + + int LineLength(int nLine = -1) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, EM_LINELENGTH, nLine, 0L); + } + + BOOL LineScroll(int nLines, int nChars = 0) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, EM_LINESCROLL, nChars, nLines); + } + + void ReplaceSel(LPCTSTR lpszNewText, BOOL bCanUndo = FALSE) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, EM_REPLACESEL, (WPARAM) bCanUndo, (LPARAM)lpszNewText); + } + + void SetRect(LPCRECT lpRect) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, EM_SETRECT, 0, (LPARAM)lpRect); + } + + BOOL DisplayBand(LPRECT pDisplayRect) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, EM_DISPLAYBAND, 0, (LPARAM)pDisplayRect); + } + + LONG FindText(DWORD dwFlags, FINDTEXT& ft) const + { + ATLASSERT(::IsWindow(m_hWnd)); +#if (_RICHEDIT_VER >= 0x0200) && defined(_UNICODE) + return (LONG)::SendMessage(m_hWnd, EM_FINDTEXTW, dwFlags, (LPARAM)&ft); +#else + return (LONG)::SendMessage(m_hWnd, EM_FINDTEXT, dwFlags, (LPARAM)&ft); +#endif + } + + LONG FindText(DWORD dwFlags, FINDTEXTEX& ft) const + { + ATLASSERT(::IsWindow(m_hWnd)); +#if (_RICHEDIT_VER >= 0x0200) && defined(_UNICODE) + return (LONG)::SendMessage(m_hWnd, EM_FINDTEXTEXW, dwFlags, (LPARAM)&ft); +#else + return (LONG)::SendMessage(m_hWnd, EM_FINDTEXTEX, dwFlags, (LPARAM)&ft); +#endif + } + + LONG FormatRange(FORMATRANGE& fr, BOOL bDisplay = TRUE) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (LONG)::SendMessage(m_hWnd, EM_FORMATRANGE, bDisplay, (LPARAM)&fr); + } + + LONG FormatRange(FORMATRANGE* pFormatRange, BOOL bDisplay = TRUE) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (LONG)::SendMessage(m_hWnd, EM_FORMATRANGE, bDisplay, (LPARAM)pFormatRange); + } + + void HideSelection(BOOL bHide = TRUE, BOOL bChangeStyle = FALSE) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, EM_HIDESELECTION, bHide, bChangeStyle); + } + + void PasteSpecial(UINT uClipFormat, DWORD dwAspect = 0, HMETAFILE hMF = 0) + { + ATLASSERT(::IsWindow(m_hWnd)); + REPASTESPECIAL reps = { dwAspect, (DWORD_PTR)hMF }; + ::SendMessage(m_hWnd, EM_PASTESPECIAL, uClipFormat, (LPARAM)&reps); + } + + void RequestResize() + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, EM_REQUESTRESIZE, 0, 0L); + } + + LONG StreamIn(UINT uFormat, EDITSTREAM& es) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (LONG)::SendMessage(m_hWnd, EM_STREAMIN, uFormat, (LPARAM)&es); + } + + LONG StreamOut(UINT uFormat, EDITSTREAM& es) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (LONG)::SendMessage(m_hWnd, EM_STREAMOUT, uFormat, (LPARAM)&es); + } + + DWORD FindWordBreak(int nCode, LONG nStartChar) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (DWORD)::SendMessage(m_hWnd, EM_FINDWORDBREAK, nCode, nStartChar); + } + + // Additional operations + void ScrollCaret() + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, EM_SCROLLCARET, 0, 0L); + } + + int InsertText(long nInsertAfterChar, LPCTSTR lpstrText, BOOL bCanUndo = FALSE) + { + int nRet = SetSel(nInsertAfterChar, nInsertAfterChar); + ReplaceSel(lpstrText, bCanUndo); + return nRet; + } + + int AppendText(LPCTSTR lpstrText, BOOL bCanUndo = FALSE) + { + return InsertText(GetWindowTextLength(), lpstrText, bCanUndo); + } + + // Clipboard operations + BOOL Undo() + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, EM_UNDO, 0, 0L); + } + + void Clear() + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, WM_CLEAR, 0, 0L); + } + + void Copy() + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, WM_COPY, 0, 0L); + } + + void Cut() + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, WM_CUT, 0, 0L); + } + + void Paste() + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, WM_PASTE, 0, 0L); + } + + // OLE support + IRichEditOle* GetOleInterface() const + { + ATLASSERT(::IsWindow(m_hWnd)); + IRichEditOle *pRichEditOle = NULL; + ::SendMessage(m_hWnd, EM_GETOLEINTERFACE, 0, (LPARAM)&pRichEditOle); + return pRichEditOle; + } + + BOOL SetOleCallback(IRichEditOleCallback* pCallback) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, EM_SETOLECALLBACK, 0, (LPARAM)pCallback); + } + +#if (_RICHEDIT_VER >= 0x0200) + BOOL Redo() + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, EM_REDO, 0, 0L); + } + + void StopGroupTyping() + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, EM_STOPGROUPTYPING, 0, 0L); + } + + void ShowScrollBar(int nBarType, BOOL bVisible = TRUE) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, EM_SHOWSCROLLBAR, nBarType, bVisible); + } +#endif // (_RICHEDIT_VER >= 0x0200) + +#if (_RICHEDIT_VER >= 0x0300) + BOOL SetTabStops(int nTabStops, LPINT rgTabStops) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, EM_SETTABSTOPS, nTabStops, (LPARAM)rgTabStops); + } + + BOOL SetTabStops() + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, EM_SETTABSTOPS, 0, 0L); + } + + BOOL SetTabStops(const int& cxEachStop) // takes an 'int' + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, EM_SETTABSTOPS, 1, (LPARAM)(LPINT)&cxEachStop); + } +#endif // (_RICHEDIT_VER >= 0x0300) +}; + +typedef CRichEditCtrlT CRichEditCtrl; + +#endif // !_WIN32_WCE + + +/////////////////////////////////////////////////////////////////////////////// +// CRichEditCommands - message handlers for standard EDIT commands + +#ifndef _WIN32_WCE + +// Chain to CRichEditCommands message map. Your class must also derive from CRichEditCtrl. +// Example: +// class CMyRichEdit : public CWindowImpl, +// public CRichEditCommands +// { +// public: +// BEGIN_MSG_MAP(CMyRichEdit) +// // your handlers... +// CHAIN_MSG_MAP_ALT(CRichEditCommands, 1) +// END_MSG_MAP() +// // other stuff... +// }; + +template +class CRichEditCommands : public CEditCommands< T > +{ +public: + BEGIN_MSG_MAP(CRichEditCommands< T >) + ALT_MSG_MAP(1) + COMMAND_ID_HANDLER(ID_EDIT_CLEAR, CEditCommands< T >::OnEditClear) + COMMAND_ID_HANDLER(ID_EDIT_CLEAR_ALL, CEditCommands< T >::OnEditClearAll) + COMMAND_ID_HANDLER(ID_EDIT_COPY, CEditCommands< T >::OnEditCopy) + COMMAND_ID_HANDLER(ID_EDIT_CUT, CEditCommands< T >::OnEditCut) + COMMAND_ID_HANDLER(ID_EDIT_PASTE, CEditCommands< T >::OnEditPaste) + COMMAND_ID_HANDLER(ID_EDIT_SELECT_ALL, CEditCommands< T >::OnEditSelectAll) + COMMAND_ID_HANDLER(ID_EDIT_UNDO, CEditCommands< T >::OnEditUndo) +#if (_RICHEDIT_VER >= 0x0200) + COMMAND_ID_HANDLER(ID_EDIT_REDO, OnEditRedo) +#endif // (_RICHEDIT_VER >= 0x0200) + END_MSG_MAP() + +#if (_RICHEDIT_VER >= 0x0200) + LRESULT OnEditRedo(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) + { + T* pT = static_cast(this); + pT->Redo(); + return 0; + } +#endif // (_RICHEDIT_VER >= 0x0200) + +// State (update UI) helpers + BOOL CanCut() const + { return HasSelection(); } + + BOOL CanCopy() const + { return HasSelection(); } + + BOOL CanClear() const + { return HasSelection(); } + +// Implementation + BOOL HasSelection() const + { + const T* pT = static_cast(this); + return (pT->GetSelectionType() != SEL_EMPTY); + } +}; + +#endif // _WIN32_WCE + + +/////////////////////////////////////////////////////////////////////////////// +// CDragListBox + +#ifndef _WIN32_WCE + +template +class CDragListBoxT : public CListBoxT< TBase > +{ +public: +// Constructors + CDragListBoxT(HWND hWnd = NULL) : CListBoxT< TBase >(hWnd) + { } + + CDragListBoxT< TBase >& operator =(HWND hWnd) + { + m_hWnd = hWnd; + return *this; + } + + HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, + DWORD dwStyle = 0, DWORD dwExStyle = 0, + ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) + { + HWND hWnd = TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); + if(hWnd != NULL) + MakeDragList(); + return hWnd; + } + +// Operations + BOOL MakeDragList() + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT((GetStyle() & (LBS_MULTIPLESEL | LBS_EXTENDEDSEL)) == 0); + return ::MakeDragList(m_hWnd); + } + + int LBItemFromPt(POINT pt, BOOL bAutoScroll = TRUE) + { + ATLASSERT(::IsWindow(m_hWnd)); + return ::LBItemFromPt(m_hWnd, pt, bAutoScroll); + } + + void DrawInsert(int nItem) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::DrawInsert(GetParent(), m_hWnd, nItem); + } + + static UINT GetDragListMessage() + { + static UINT uDragListMessage = 0; + if(uDragListMessage == 0) + { + CStaticDataInitCriticalSectionLock lock; + if(FAILED(lock.Lock())) + { + ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CDragListBox::GetDragListMessage.\n")); + ATLASSERT(FALSE); + return 0; + } + + if(uDragListMessage == 0) + uDragListMessage = ::RegisterWindowMessage(DRAGLISTMSGSTRING); + + lock.Unlock(); + } + ATLASSERT(uDragListMessage != 0); + return uDragListMessage; + } +}; + +typedef CDragListBoxT CDragListBox; + +template +class CDragListNotifyImpl +{ +public: + BEGIN_MSG_MAP(CDragListNotifyImpl< T >) + MESSAGE_HANDLER(CDragListBox::GetDragListMessage(), OnDragListNotify) + END_MSG_MAP() + + LRESULT OnDragListNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) + { + uMsg; // avoid level 4 warning + ATLASSERT(uMsg == CDragListBox::GetDragListMessage()); + T* pT = static_cast(this); + LPDRAGLISTINFO lpDragListInfo = (LPDRAGLISTINFO)lParam; + LRESULT lRet = 0; + switch(lpDragListInfo->uNotification) + { + case DL_BEGINDRAG: + lRet = (LPARAM)pT->OnBeginDrag((int)wParam, lpDragListInfo->hWnd, lpDragListInfo->ptCursor); + break; + case DL_CANCELDRAG: + pT->OnCancelDrag((int)wParam, lpDragListInfo->hWnd, lpDragListInfo->ptCursor); + break; + case DL_DRAGGING: + lRet = (LPARAM)pT->OnDragging((int)wParam, lpDragListInfo->hWnd, lpDragListInfo->ptCursor); + break; + case DL_DROPPED: + pT->OnDropped((int)wParam, lpDragListInfo->hWnd, lpDragListInfo->ptCursor); + break; + default: + ATLTRACE2(atlTraceUI, 0, _T("Unknown DragListBox notification\n")); + bHandled = FALSE; // don't handle it + break; + } + return lRet; + } + +// Overrideables + BOOL OnBeginDrag(int /*nCtlID*/, HWND /*hWndDragList*/, POINT /*ptCursor*/) + { + return TRUE; // allow dragging + } + + void OnCancelDrag(int /*nCtlID*/, HWND /*hWndDragList*/, POINT /*ptCursor*/) + { + // nothing to do + } + + int OnDragging(int /*nCtlID*/, HWND /*hWndDragList*/, POINT /*ptCursor*/) + { + return 0; // don't change cursor + } + + void OnDropped(int /*nCtlID*/, HWND /*hWndDragList*/, POINT /*ptCursor*/) + { + // nothing to do + } +}; + +#endif // _WIN32_WCE + + +/////////////////////////////////////////////////////////////////////////////// +// CReBarCtrl + +template +class CReBarCtrlT : public TBase +{ +public: +// Constructors + CReBarCtrlT(HWND hWnd = NULL) : TBase(hWnd) + { } + + CReBarCtrlT< TBase >& operator =(HWND hWnd) + { + m_hWnd = hWnd; + return *this; + } + + HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, + DWORD dwStyle = 0, DWORD dwExStyle = 0, + ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) + { + return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); + } + +// Attributes + static LPCTSTR GetWndClassName() + { + return REBARCLASSNAME; + } + + UINT GetBandCount() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (UINT)::SendMessage(m_hWnd, RB_GETBANDCOUNT, 0, 0L); + } + + BOOL GetBandInfo(int nBand, LPREBARBANDINFO lprbbi) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, RB_GETBANDINFO, nBand, (LPARAM)lprbbi); + } + + BOOL SetBandInfo(int nBand, LPREBARBANDINFO lprbbi) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, RB_SETBANDINFO, nBand, (LPARAM)lprbbi); + } + + BOOL GetBarInfo(LPREBARINFO lprbi) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, RB_GETBARINFO, 0, (LPARAM)lprbi); + } + + BOOL SetBarInfo(LPREBARINFO lprbi) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, RB_SETBARINFO, 0, (LPARAM)lprbi); + } + + CImageList GetImageList() const + { + ATLASSERT(::IsWindow(m_hWnd)); + REBARINFO rbi = { 0 }; + rbi.cbSize = sizeof(REBARINFO); + rbi.fMask = RBIM_IMAGELIST; + if( (BOOL)::SendMessage(m_hWnd, RB_GETBARINFO, 0, (LPARAM)&rbi) == FALSE ) return CImageList(); + return CImageList(rbi.himl); + } + + BOOL SetImageList(HIMAGELIST hImageList) + { + ATLASSERT(::IsWindow(m_hWnd)); + REBARINFO rbi = { 0 }; + rbi.cbSize = sizeof(REBARINFO); + rbi.fMask = RBIM_IMAGELIST; + rbi.himl = hImageList; + return (BOOL)::SendMessage(m_hWnd, RB_SETBARINFO, 0, (LPARAM)&rbi); + } + + UINT GetRowCount() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (UINT)::SendMessage(m_hWnd, RB_GETROWCOUNT, 0, 0L); + } + + UINT GetRowHeight(int nBand) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (UINT)::SendMessage(m_hWnd, RB_GETROWHEIGHT, nBand, 0L); + } + +#if (_WIN32_IE >= 0x0400) + COLORREF GetTextColor() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (COLORREF)::SendMessage(m_hWnd, RB_GETTEXTCOLOR, 0, 0L); + } + + COLORREF SetTextColor(COLORREF clr) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (COLORREF)::SendMessage(m_hWnd, RB_SETTEXTCOLOR, 0, (LPARAM)clr); + } + + COLORREF GetBkColor() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (COLORREF)::SendMessage(m_hWnd, RB_GETBKCOLOR, 0, 0L); + } + + COLORREF SetBkColor(COLORREF clr) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (COLORREF)::SendMessage(m_hWnd, RB_SETBKCOLOR, 0, (LPARAM)clr); + } + + UINT GetBarHeight() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (UINT)::SendMessage(m_hWnd, RB_GETBARHEIGHT, 0, 0L); + } + + BOOL GetRect(int nBand, LPRECT lpRect) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, RB_GETRECT, nBand, (LPARAM)lpRect); + } + +#ifndef _WIN32_WCE + CToolTipCtrl GetToolTips() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return CToolTipCtrl((HWND)::SendMessage(m_hWnd, RB_GETTOOLTIPS, 0, 0L)); + } + + void SetToolTips(HWND hwndToolTip) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, RB_SETTOOLTIPS, (WPARAM)hwndToolTip, 0L); + } +#endif // !_WIN32_WCE + + void GetBandBorders(int nBand, LPRECT lpRect) const + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(lpRect != NULL); + ::SendMessage(m_hWnd, RB_GETBANDBORDERS, nBand, (LPARAM)lpRect); + } + +#ifndef _WIN32_WCE + BOOL GetColorScheme(LPCOLORSCHEME lpColorScheme) const + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(lpColorScheme != NULL); + return (BOOL)::SendMessage(m_hWnd, RB_GETCOLORSCHEME, 0, (LPARAM)lpColorScheme); + } + + void SetColorScheme(LPCOLORSCHEME lpColorScheme) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(lpColorScheme != NULL); + ::SendMessage(m_hWnd, RB_SETCOLORSCHEME, 0, (LPARAM)lpColorScheme); + } + + HPALETTE GetPalette() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (HPALETTE)::SendMessage(m_hWnd, RB_GETPALETTE, 0, 0L); + } + + HPALETTE SetPalette(HPALETTE hPalette) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (HPALETTE)::SendMessage(m_hWnd, RB_SETPALETTE, 0, (LPARAM)hPalette); + } + + BOOL GetUnicodeFormat() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, RB_GETUNICODEFORMAT, 0, 0L); + } + + BOOL SetUnicodeFormat(BOOL bUnicode = TRUE) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, RB_SETUNICODEFORMAT, bUnicode, 0L); + } +#endif // !_WIN32_WCE +#endif // (_WIN32_IE >= 0x0400) + +#if (_WIN32_WINNT >= 0x0501) + // requires uxtheme.h to be included to use MARGINS struct +#ifndef _UXTHEME_H_ + typedef struct _MARGINS* PMARGINS; +#endif // !_UXTHEME_H_ + void GetBandMargins(PMARGINS pMargins) const + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, RB_GETBANDMARGINS, 0, (LPARAM)pMargins); + } + + void SetWindowTheme(LPCWSTR lpstrTheme) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, RB_SETWINDOWTHEME, 0, (LPARAM)lpstrTheme); + } +#endif // (_WIN32_WINNT >= 0x0501) + +#if (_WIN32_IE >= 0x0600) + DWORD GetExtendedStyle() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (DWORD)::SendMessage(m_hWnd, RB_GETEXTENDEDSTYLE, 0, 0L); + } + + DWORD SetExtendedStyle(DWORD dwStyle, DWORD dwMask) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (DWORD)::SendMessage(m_hWnd, RB_SETEXTENDEDSTYLE, dwMask, dwStyle); + } +#endif // (_WIN32_IE >= 0x0600) + +// Operations + BOOL InsertBand(int nBand, LPREBARBANDINFO lprbbi) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, RB_INSERTBAND, nBand, (LPARAM)lprbbi); + } + + BOOL AddBand(LPREBARBANDINFO lprbbi) + { + return InsertBand(-1, lprbbi); + } + + BOOL DeleteBand(int nBand) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, RB_DELETEBAND, nBand, 0L); + } + + ATL::CWindow SetNotifyWnd(HWND hWnd) + { + ATLASSERT(::IsWindow(m_hWnd)); + return ATL::CWindow((HWND)::SendMessage(m_hWnd, RB_SETPARENT, (WPARAM)hWnd, 0L)); + } + +#if (_WIN32_IE >= 0x0400) + void BeginDrag(int nBand, DWORD dwPos) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, RB_BEGINDRAG, nBand, dwPos); + } + + void BeginDrag(int nBand, int xPos, int yPos) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, RB_BEGINDRAG, nBand, MAKELPARAM(xPos, yPos)); + } + + void EndDrag() + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, RB_ENDDRAG, 0, 0L); + } + + void DragMove(DWORD dwPos) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, RB_DRAGMOVE, 0, dwPos); + } + + void DragMove(int xPos, int yPos) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, RB_DRAGMOVE, 0, MAKELPARAM(xPos, yPos)); + } + +#ifndef _WIN32_WCE + void GetDropTarget(IDropTarget** ppDropTarget) const + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, RB_GETDROPTARGET, 0, (LPARAM)ppDropTarget); + } +#endif // !_WIN32_WCE + + void MaximizeBand(int nBand, BOOL bIdeal = FALSE) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, RB_MAXIMIZEBAND, nBand, bIdeal); + } + + void MinimizeBand(int nBand) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, RB_MINIMIZEBAND, nBand, 0L); + } + + BOOL SizeToRect(LPRECT lpRect) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, RB_SIZETORECT, 0, (LPARAM)lpRect); + } + + int IdToIndex(UINT uBandID) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, RB_IDTOINDEX, uBandID, 0L); + } + + int HitTest(LPRBHITTESTINFO lprbht) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, RB_HITTEST, 0, (LPARAM)lprbht); + } + + BOOL ShowBand(int nBand, BOOL bShow) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, RB_SHOWBAND, nBand, bShow); + } + +#ifndef _WIN32_WCE + BOOL MoveBand(int nBand, int nNewPos) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(nNewPos >= 0 && nNewPos <= ((int)GetBandCount() - 1)); + return (BOOL)::SendMessage(m_hWnd, RB_MOVEBAND, nBand, nNewPos); + } +#endif // !_WIN32_WCE +#endif // (_WIN32_IE >= 0x0400) + +#if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) + void PushChevron(int nBand, LPARAM lAppValue) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, RB_PUSHCHEVRON, nBand, lAppValue); + } +#endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) + +// Extra operations +#if (_WIN32_IE >= 0x0400) + void LockBands(bool bLock) + { + int nBandCount = GetBandCount(); + for(int i =0; i < nBandCount; i++) + { + REBARBANDINFO rbbi = { RunTimeHelper::SizeOf_REBARBANDINFO() }; + rbbi.fMask = RBBIM_STYLE; + BOOL bRet = GetBandInfo(i, &rbbi); + ATLASSERT(bRet); + + if((rbbi.fStyle & RBBS_GRIPPERALWAYS) == 0) + { + rbbi.fStyle |= RBBS_GRIPPERALWAYS; + bRet = SetBandInfo(i, &rbbi); + ATLASSERT(bRet); + rbbi.fStyle &= ~RBBS_GRIPPERALWAYS; + } + + if(bLock) + rbbi.fStyle |= RBBS_NOGRIPPER; + else + rbbi.fStyle &= ~RBBS_NOGRIPPER; + + bRet = SetBandInfo(i, &rbbi); + ATLASSERT(bRet); + } + } +#endif // (_WIN32_IE >= 0x0400) + +#if (_WIN32_WINNT >= 0x0600) + BOOL SetBandWidth(int nBand, int cxWidth) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, RB_SETBANDWIDTH, nBand, cxWidth); + } +#endif // (_WIN32_WINNT >= 0x0600) +}; + +typedef CReBarCtrlT CReBarCtrl; + + +/////////////////////////////////////////////////////////////////////////////// +// CComboBoxEx + +#ifndef _WIN32_WCE + +template +class CComboBoxExT : public CComboBoxT< TBase > +{ +public: +// Constructors + CComboBoxExT(HWND hWnd = NULL) : CComboBoxT< TBase >(hWnd) + { } + + CComboBoxExT< TBase >& operator =(HWND hWnd) + { + m_hWnd = hWnd; + return *this; + } + + HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, + DWORD dwStyle = 0, DWORD dwExStyle = 0, + ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) + { + return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); + } + +// Attributes + static LPCTSTR GetWndClassName() + { + return WC_COMBOBOXEX; + } + + CImageList GetImageList() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return CImageList((HIMAGELIST)::SendMessage(m_hWnd, CBEM_GETIMAGELIST, 0, 0L)); + } + + CImageList SetImageList(HIMAGELIST hImageList) + { + ATLASSERT(::IsWindow(m_hWnd)); + return CImageList((HIMAGELIST)::SendMessage(m_hWnd, CBEM_SETIMAGELIST, 0, (LPARAM)hImageList)); + } + +#if (_WIN32_IE >= 0x0400) + DWORD GetExtendedStyle() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (DWORD)::SendMessage(m_hWnd, CBEM_GETEXTENDEDSTYLE, 0, 0L); + } + + DWORD SetExtendedStyle(DWORD dwExMask, DWORD dwExStyle) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (DWORD)::SendMessage(m_hWnd, CBEM_SETEXTENDEDSTYLE, dwExMask, dwExStyle); + } + + BOOL GetUnicodeFormat() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, CBEM_GETUNICODEFORMAT, 0, 0L); + } + + BOOL SetUnicodeFormat(BOOL bUnicode = TRUE) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, CBEM_SETUNICODEFORMAT, bUnicode, 0L); + } +#endif // (_WIN32_IE >= 0x0400) + +#if (_WIN32_WINNT >= 0x0501) + void SetWindowTheme(LPCWSTR lpstrTheme) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, CBEM_SETWINDOWTHEME, 0, (LPARAM)lpstrTheme); + } +#endif // (_WIN32_WINNT >= 0x0501) + +// Operations + int InsertItem(const COMBOBOXEXITEM* lpcCBItem) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, CBEM_INSERTITEM, 0, (LPARAM)lpcCBItem); + } + + int InsertItem(UINT nMask, int nIndex, LPCTSTR lpszItem, int nImage, int nSelImage, + int iIndent, int iOverlay, LPARAM lParam) + { + ATLASSERT(::IsWindow(m_hWnd)); + COMBOBOXEXITEM cbex = { 0 }; + cbex.mask = nMask; + cbex.iItem = nIndex; + cbex.pszText = (LPTSTR) lpszItem; + cbex.iImage = nImage; + cbex.iSelectedImage = nSelImage; + cbex.iIndent = iIndent; + cbex.iOverlay = iOverlay; + cbex.lParam = lParam; + return (int)::SendMessage(m_hWnd, CBEM_INSERTITEM, 0, (LPARAM)&cbex); + } + + int InsertItem(int nIndex, LPCTSTR lpszItem, int nImage, int nSelImage, int iIndent, LPARAM lParam = 0) + { + ATLASSERT(::IsWindow(m_hWnd)); + COMBOBOXEXITEM cbex = { 0 }; + cbex.mask = CBEIF_TEXT | CBEIF_IMAGE | CBEIF_SELECTEDIMAGE | CBEIF_INDENT | CBEIF_LPARAM; + cbex.iItem = nIndex; + cbex.pszText = (LPTSTR) lpszItem; + cbex.iImage = nImage; + cbex.iSelectedImage = nSelImage; + cbex.iIndent = iIndent; + cbex.lParam = lParam; + return (int)::SendMessage(m_hWnd, CBEM_INSERTITEM, 0, (LPARAM)&cbex); + } + + int AddItem(UINT nMask, LPCTSTR lpszItem, int nImage, int nSelImage, int iIndent, int iOverlay, LPARAM lParam) + { + return InsertItem(nMask, -1, lpszItem, nImage, nSelImage, iIndent, iOverlay, lParam); + } + + int AddItem(LPCTSTR lpszItem, int nImage, int nSelImage, int iIndent, LPARAM lParam = 0) + { + return InsertItem(-1, lpszItem, nImage, nSelImage, iIndent, lParam); + } + + int DeleteItem(int nIndex) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, CBEM_DELETEITEM, nIndex, 0L); + } + + BOOL GetItem(PCOMBOBOXEXITEM pCBItem) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, CBEM_GETITEM, 0, (LPARAM)pCBItem); + } + + BOOL SetItem(const COMBOBOXEXITEM* lpcCBItem) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, CBEM_SETITEM, 0, (LPARAM)lpcCBItem); + } + + int SetItem(int nIndex, UINT nMask, LPCTSTR lpszItem, int nImage, int nSelImage, + int iIndent, int iOverlay, LPARAM lParam) + { + ATLASSERT(::IsWindow(m_hWnd)); + COMBOBOXEXITEM cbex = { 0 }; + cbex.mask = nMask; + cbex.iItem = nIndex; + cbex.pszText = (LPTSTR) lpszItem; + cbex.iImage = nImage; + cbex.iSelectedImage = nSelImage; + cbex.iIndent = iIndent; + cbex.iOverlay = iOverlay; + cbex.lParam = lParam; + return (int)::SendMessage(m_hWnd, CBEM_SETITEM, 0, (LPARAM)&cbex); + } + + BOOL GetItemText(int nIndex, LPTSTR lpszItem, int nLen) const + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(lpszItem != NULL); + + COMBOBOXEXITEM cbex = { 0 }; + cbex.mask = CBEIF_TEXT; + cbex.iItem = nIndex; + cbex.pszText = lpszItem; + cbex.cchTextMax = nLen; + + return (BOOL)::SendMessage(m_hWnd, CBEM_GETITEM, 0, (LPARAM)&cbex); + } + +#ifndef _ATL_NO_COM + BOOL GetItemText(int nIndex, BSTR& bstrText) const + { + USES_CONVERSION; + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(bstrText == NULL); + + COMBOBOXEXITEM cbex = { 0 }; + cbex.mask = CBEIF_TEXT; + cbex.iItem = nIndex; + + LPTSTR lpstrText = NULL; + BOOL bRet = FALSE; + for(int nLen = 256; ; nLen *= 2) + { + ATLTRY(lpstrText = new TCHAR[nLen]); + if(lpstrText == NULL) + break; + lpstrText[0] = NULL; + cbex.pszText = lpstrText; + cbex.cchTextMax = nLen; + bRet = (BOOL)::SendMessage(m_hWnd, CBEM_GETITEM, 0, (LPARAM)&cbex); + if(!bRet || (lstrlen(cbex.pszText) < nLen - 1)) + break; + delete [] lpstrText; + lpstrText = NULL; + } + + if(lpstrText != NULL) + { + if(bRet) + bstrText = ::SysAllocString(T2OLE(lpstrText)); + delete [] lpstrText; + } + + return (bstrText != NULL) ? TRUE : FALSE; + } +#endif // !_ATL_NO_COM + +#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) + BOOL GetItemText(int nIndex, _CSTRING_NS::CString& strText) const + { + ATLASSERT(::IsWindow(m_hWnd)); + + COMBOBOXEXITEM cbex = { 0 }; + cbex.mask = CBEIF_TEXT; + cbex.iItem = nIndex; + + strText.Empty(); + BOOL bRet = FALSE; + for(int nLen = 256; ; nLen *= 2) + { + cbex.pszText = strText.GetBufferSetLength(nLen); + if(cbex.pszText == NULL) + { + bRet = FALSE; + break; + } + cbex.cchTextMax = nLen; + bRet = (BOOL)::SendMessage(m_hWnd, CBEM_GETITEM, 0, (LPARAM)&cbex); + if(!bRet || (lstrlen(cbex.pszText) < nLen - 1)) + break; + } + strText.ReleaseBuffer(); + return bRet; + } +#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) + + BOOL SetItemText(int nIndex, LPCTSTR lpszItem) + { + ATLASSERT(::IsWindow(m_hWnd)); + return SetItem(nIndex, CBEIF_TEXT, lpszItem, 0, 0, 0, 0, 0); + } + + CComboBox GetComboCtrl() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return CComboBox((HWND)::SendMessage(m_hWnd, CBEM_GETCOMBOCONTROL, 0, 0L)); + } + + CEdit GetEditCtrl() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return CEdit((HWND)::SendMessage(m_hWnd, CBEM_GETEDITCONTROL, 0, 0L)); + } + + BOOL HasEditChanged() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, CBEM_HASEDITCHANGED, 0, 0L); + } + +// Non-functional + int AddString(LPCTSTR /*lpszItem*/) + { + ATLASSERT(FALSE); // Not available in CComboBoxEx; use InsertItem + return 0; + } + + int InsertString(int /*nIndex*/, LPCTSTR /*lpszString*/) + { + ATLASSERT(FALSE); // Not available in CComboBoxEx; use InsertItem + return 0; + } + + int Dir(UINT /*attr*/, LPCTSTR /*lpszWildCard*/) + { + ATLASSERT(FALSE); // Not available in CComboBoxEx + return 0; + } + + int FindString(int /*nStartAfter*/, LPCTSTR /*lpszString*/) const + { + ATLASSERT(FALSE); // Not available in CComboBoxEx; try FindStringExact + return 0; + } +}; + +typedef CComboBoxExT CComboBoxEx; + +#endif // !_WIN32_WCE + + +/////////////////////////////////////////////////////////////////////////////// +// CMonthCalendarCtrl + +template +class CMonthCalendarCtrlT : public TBase +{ +public: +// Constructors + CMonthCalendarCtrlT(HWND hWnd = NULL) : TBase(hWnd) + { } + + CMonthCalendarCtrlT< TBase >& operator =(HWND hWnd) + { + m_hWnd = hWnd; + return *this; + } + + HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, + DWORD dwStyle = 0, DWORD dwExStyle = 0, + ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) + { + return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); + } + +// Attributes + static LPCTSTR GetWndClassName() + { + return MONTHCAL_CLASS; + } + + COLORREF GetColor(int nColorType) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (COLORREF)::SendMessage(m_hWnd, MCM_GETCOLOR, nColorType, 0L); + } + + COLORREF SetColor(int nColorType, COLORREF clr) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (COLORREF)::SendMessage(m_hWnd, MCM_SETCOLOR, nColorType, clr); + } + + BOOL GetCurSel(LPSYSTEMTIME lpSysTime) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, MCM_GETCURSEL, 0, (LPARAM)lpSysTime); + } + + BOOL SetCurSel(LPSYSTEMTIME lpSysTime) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, MCM_SETCURSEL, 0, (LPARAM)lpSysTime); + } + + int GetFirstDayOfWeek(BOOL* pbLocaleVal = NULL) const + { + ATLASSERT(::IsWindow(m_hWnd)); + DWORD dwRet = (DWORD)::SendMessage(m_hWnd, MCM_GETFIRSTDAYOFWEEK, 0, 0L); + if(pbLocaleVal != NULL) + *pbLocaleVal = (BOOL)HIWORD(dwRet); + return (int)(short)LOWORD(dwRet); + } + + int SetFirstDayOfWeek(int nDay, BOOL* pbLocaleVal = NULL) + { + ATLASSERT(::IsWindow(m_hWnd)); + DWORD dwRet = (DWORD)::SendMessage(m_hWnd, MCM_SETFIRSTDAYOFWEEK, 0, nDay); + if(pbLocaleVal != NULL) + *pbLocaleVal = (BOOL)HIWORD(dwRet); + return (int)(short)LOWORD(dwRet); + } + + int GetMaxSelCount() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, MCM_GETMAXSELCOUNT, 0, 0L); + } + + BOOL SetMaxSelCount(int nMax) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, MCM_SETMAXSELCOUNT, nMax, 0L); + } + + int GetMonthDelta() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, MCM_GETMONTHDELTA, 0, 0L); + } + + int SetMonthDelta(int nDelta) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, MCM_SETMONTHDELTA, nDelta, 0L); + } + + DWORD GetRange(LPSYSTEMTIME lprgSysTimeArray) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (DWORD)::SendMessage(m_hWnd, MCM_GETRANGE, 0, (LPARAM)lprgSysTimeArray); + } + + BOOL SetRange(DWORD dwFlags, LPSYSTEMTIME lprgSysTimeArray) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, MCM_SETRANGE, dwFlags, (LPARAM)lprgSysTimeArray); + } + + BOOL GetSelRange(LPSYSTEMTIME lprgSysTimeArray) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, MCM_GETSELRANGE, 0, (LPARAM)lprgSysTimeArray); + } + + BOOL SetSelRange(LPSYSTEMTIME lprgSysTimeArray) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, MCM_SETSELRANGE, 0, (LPARAM)lprgSysTimeArray); + } + + BOOL GetToday(LPSYSTEMTIME lpSysTime) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, MCM_GETTODAY, 0, (LPARAM)lpSysTime); + } + + void SetToday(LPSYSTEMTIME lpSysTime) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, MCM_SETTODAY, 0, (LPARAM)lpSysTime); + } + + BOOL GetMinReqRect(LPRECT lpRectInfo) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, MCM_GETMINREQRECT, 0, (LPARAM)lpRectInfo); + } + + int GetMaxTodayWidth() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, MCM_GETMAXTODAYWIDTH, 0, 0L); + } + +#if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) + BOOL GetUnicodeFormat() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, MCM_GETUNICODEFORMAT, 0, 0L); + } + + BOOL SetUnicodeFormat(BOOL bUnicode = TRUE) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, MCM_SETUNICODEFORMAT, bUnicode, 0L); + } +#endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) + +#if defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN) + DWORD GetCurrentView() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (DWORD)::SendMessage(m_hWnd, MCM_GETCURRENTVIEW, 0, 0L); + } + + BOOL SetCurrentView(DWORD dwView) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, MCM_SETCURRENTVIEW, 0, dwView); + } + + DWORD GetCalendarCount() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (DWORD)::SendMessage(m_hWnd, MCM_GETCALENDARCOUNT, 0, 0L); + } + + BOOL GetCalendarGridInfo(PMCGRIDINFO pGridInfo) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, MCM_GETCALENDARGRIDINFO, 0, (LPARAM)pGridInfo); + } + + CALID GetCALID() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (CALID)::SendMessage(m_hWnd, MCM_GETCALID, 0, 0L); + } + + void SetCALID(CALID calid) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, MCM_SETCALID, (LPARAM)calid, 0L); + } + + int GetCalendarBorder() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, MCM_GETCALENDARBORDER, 0, 0L); + } + + void SetCalendarBorder(int cxyBorder, BOOL bSet = TRUE) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, MCM_SETCALENDARBORDER, (WPARAM)bSet, (LPARAM)cxyBorder); + } +#endif // defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN) + +// Operations + int GetMonthRange(DWORD dwFlags, LPSYSTEMTIME lprgSysTimeArray) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, MCM_GETMONTHRANGE, dwFlags, (LPARAM)lprgSysTimeArray); + } + + BOOL SetDayState(int nMonths, LPMONTHDAYSTATE lpDayStateArray) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, MCM_SETDAYSTATE, nMonths, (LPARAM)lpDayStateArray); + } + + DWORD HitTest(PMCHITTESTINFO pMCHitTest) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (DWORD)::SendMessage(m_hWnd, MCM_HITTEST, 0, (LPARAM)pMCHitTest); + } + +#if defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN) + void SizeRectToMin(LPRECT lpRect) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, MCM_SIZERECTTOMIN, 0, (LPARAM)lpRect); + } +#endif // defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN) +}; + +typedef CMonthCalendarCtrlT CMonthCalendarCtrl; + + +/////////////////////////////////////////////////////////////////////////////// +// CDateTimePickerCtrl + +template +class CDateTimePickerCtrlT : public TBase +{ +public: +// Constructors + CDateTimePickerCtrlT(HWND hWnd = NULL) : TBase(hWnd) + { } + + CDateTimePickerCtrlT< TBase >& operator =(HWND hWnd) + { + m_hWnd = hWnd; + return *this; + } + + HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, + DWORD dwStyle = 0, DWORD dwExStyle = 0, + ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) + { + return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); + } + +// Operations + static LPCTSTR GetWndClassName() + { + return DATETIMEPICK_CLASS; + } + + BOOL SetFormat(LPCTSTR lpszFormat) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, DTM_SETFORMAT, 0, (LPARAM)lpszFormat); + } + + COLORREF GetMonthCalColor(int nColorType) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (COLORREF)::SendMessage(m_hWnd, DTM_GETMCCOLOR, nColorType, 0L); + } + + COLORREF SetMonthCalColor(int nColorType, COLORREF clr) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (COLORREF)::SendMessage(m_hWnd, DTM_SETMCCOLOR, nColorType, clr); + } + + DWORD GetRange(LPSYSTEMTIME lpSysTimeArray) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (DWORD)::SendMessage(m_hWnd, DTM_GETRANGE, 0, (LPARAM)lpSysTimeArray); + } + + BOOL SetRange(DWORD dwFlags, LPSYSTEMTIME lpSysTimeArray) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, DTM_SETRANGE, dwFlags, (LPARAM)lpSysTimeArray); + } + + DWORD GetSystemTime(LPSYSTEMTIME lpSysTime) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (DWORD)::SendMessage(m_hWnd, DTM_GETSYSTEMTIME, 0, (LPARAM)lpSysTime); + } + + BOOL SetSystemTime(DWORD dwFlags, LPSYSTEMTIME lpSysTime) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, DTM_SETSYSTEMTIME, dwFlags, (LPARAM)lpSysTime); + } + + CMonthCalendarCtrl GetMonthCal() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return CMonthCalendarCtrl((HWND)::SendMessage(m_hWnd, DTM_GETMONTHCAL, 0, 0L)); + } + +#if (_WIN32_IE >= 0x0400) + CFontHandle GetMonthCalFont() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return CFontHandle((HFONT)::SendMessage(m_hWnd, DTM_GETMCFONT, 0, 0L)); + } + + void SetMonthCalFont(HFONT hFont, BOOL bRedraw = TRUE) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, DTM_SETMCFONT, (WPARAM)hFont, MAKELPARAM(bRedraw, 0)); + } +#endif // (_WIN32_IE >= 0x0400) + +#if defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN) + DWORD GetMonthCalStyle() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (DWORD)::SendMessage(m_hWnd, DTM_GETMCSTYLE, 0, 0L); + } + + DWORD SetMonthCalStyle(DWORD dwStyle) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (DWORD)::SendMessage(m_hWnd, DTM_SETMCSTYLE, 0, (LPARAM)dwStyle); + } + + void GetDateTimePickerInfo(LPDATETIMEPICKERINFO lpPickerInfo) const + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, DTM_GETDATETIMEPICKERINFO, 0, (LPARAM)lpPickerInfo); + } + + BOOL GetIdealSize(LPSIZE lpSize) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, DTM_GETIDEALSIZE, 0, (LPARAM)lpSize); + } + + void CloseMonthCal() + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, DTM_CLOSEMONTHCAL, 0, 0L); + } +#endif // defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN) +}; + +typedef CDateTimePickerCtrlT CDateTimePickerCtrl; + + +/////////////////////////////////////////////////////////////////////////////// +// CFlatScrollBarImpl - support for flat scroll bars + +#if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) + +template +class CFlatScrollBarImpl +{ +public: +// Initialization + BOOL FlatSB_Initialize() + { + T* pT = static_cast(this); + ATLASSERT(::IsWindow(pT->m_hWnd)); + return ::InitializeFlatSB(pT->m_hWnd); + } + + HRESULT FlatSB_Uninitialize() + { + T* pT = static_cast(this); + ATLASSERT(::IsWindow(pT->m_hWnd)); + return ::UninitializeFlatSB(pT->m_hWnd); + } + +// Flat scroll bar properties + BOOL FlatSB_GetScrollProp(UINT uIndex, LPINT lpnValue) const + { + const T* pT = static_cast(this); + ATLASSERT(::IsWindow(pT->m_hWnd)); + return ::FlatSB_GetScrollProp(pT->m_hWnd, uIndex, lpnValue); + } + + BOOL FlatSB_SetScrollProp(UINT uIndex, int nValue, BOOL bRedraw = TRUE) + { + T* pT = static_cast(this); + ATLASSERT(::IsWindow(pT->m_hWnd)); + return ::FlatSB_SetScrollProp(pT->m_hWnd, uIndex, nValue, bRedraw); + } + +// Attributes + int FlatSB_GetScrollPos(int nBar) const + { + const T* pT = static_cast(this); + ATLASSERT(::IsWindow(pT->m_hWnd)); + return ::FlatSB_GetScrollPos(pT->m_hWnd, nBar); + } + + int FlatSB_SetScrollPos(int nBar, int nPos, BOOL bRedraw = TRUE) + { + T* pT = static_cast(this); + ATLASSERT(::IsWindow(pT->m_hWnd)); + return ::FlatSB_SetScrollPos(pT->m_hWnd, nBar, nPos, bRedraw); + } + + BOOL FlatSB_GetScrollRange(int nBar, LPINT lpMinPos, LPINT lpMaxPos) const + { + const T* pT = static_cast(this); + ATLASSERT(::IsWindow(pT->m_hWnd)); + return ::FlatSB_GetScrollRange(pT->m_hWnd, nBar, lpMinPos, lpMaxPos); + } + + BOOL FlatSB_SetScrollRange(int nBar, int nMinPos, int nMaxPos, BOOL bRedraw = TRUE) + { + T* pT = static_cast(this); + ATLASSERT(::IsWindow(pT->m_hWnd)); + return ::FlatSB_SetScrollRange(pT->m_hWnd, nBar, nMinPos, nMaxPos, bRedraw); + } + + BOOL FlatSB_GetScrollInfo(int nBar, LPSCROLLINFO lpScrollInfo) const + { + const T* pT = static_cast(this); + ATLASSERT(::IsWindow(pT->m_hWnd)); + return ::FlatSB_GetScrollInfo(pT->m_hWnd, nBar, lpScrollInfo); + } + + int FlatSB_SetScrollInfo(int nBar, LPSCROLLINFO lpScrollInfo, BOOL bRedraw = TRUE) + { + T* pT = static_cast(this); + ATLASSERT(::IsWindow(pT->m_hWnd)); + return ::FlatSB_SetScrollInfo(pT->m_hWnd, nBar, lpScrollInfo, bRedraw); + } + +// Operations + BOOL FlatSB_ShowScrollBar(UINT nBar, BOOL bShow = TRUE) + { + T* pT = static_cast(this); + ATLASSERT(::IsWindow(pT->m_hWnd)); + return ::FlatSB_ShowScrollBar(pT->m_hWnd, nBar, bShow); + } + + BOOL FlatSB_EnableScrollBar(UINT uSBFlags, UINT uArrowFlags = ESB_ENABLE_BOTH) + { + T* pT = static_cast(this); + ATLASSERT(::IsWindow(pT->m_hWnd)); + return ::FlatSB_EnableScrollBar(pT->m_hWnd, uSBFlags, uArrowFlags); + } +}; + +template +class CFlatScrollBarT : public TBase, public CFlatScrollBarImpl > +{ +public: + CFlatScrollBarT(HWND hWnd = NULL) : TBase(hWnd) + { } + + CFlatScrollBarT< TBase >& operator =(HWND hWnd) + { + m_hWnd = hWnd; + return *this; + } +}; + +typedef CFlatScrollBarT CFlatScrollBar; + +#endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) + + +/////////////////////////////////////////////////////////////////////////////// +// CIPAddressCtrl + +#if (_WIN32_IE >= 0x0400) + +template +class CIPAddressCtrlT : public TBase +{ +public: +// Constructors + CIPAddressCtrlT(HWND hWnd = NULL) : TBase(hWnd) + { } + + CIPAddressCtrlT< TBase >& operator =(HWND hWnd) + { + m_hWnd = hWnd; + return *this; + } + + HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, + DWORD dwStyle = 0, DWORD dwExStyle = 0, + ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) + { + return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); + } + +// Atteributes + static LPCTSTR GetWndClassName() + { + return WC_IPADDRESS; + } + + BOOL IsBlank() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, IPM_ISBLANK, 0, 0L); + } + + int GetAddress(LPDWORD lpdwAddress) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, IPM_GETADDRESS, 0, (LPARAM)lpdwAddress); + } + + void SetAddress(DWORD dwAddress) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, IPM_SETADDRESS, 0, dwAddress); + } + + void ClearAddress() + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, IPM_CLEARADDRESS, 0, 0L); + } + + void SetRange(int nField, WORD wRange) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, IPM_SETRANGE, nField, wRange); + } + + void SetRange(int nField, BYTE nMin, BYTE nMax) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, IPM_SETRANGE, nField, MAKEIPRANGE(nMin, nMax)); + } + + void SetFocus(int nField) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, IPM_SETFOCUS, nField, 0L); + } +}; + +typedef CIPAddressCtrlT CIPAddressCtrl; + +#endif // (_WIN32_IE >= 0x0400) + + +/////////////////////////////////////////////////////////////////////////////// +// CPagerCtrl + +#if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) + +template +class CPagerCtrlT : public TBase +{ +public: +// Constructors + CPagerCtrlT(HWND hWnd = NULL) : TBase(hWnd) + { } + + CPagerCtrlT< TBase >& operator =(HWND hWnd) + { + m_hWnd = hWnd; + return *this; + } + + HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, + DWORD dwStyle = 0, DWORD dwExStyle = 0, + ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) + { + return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); + } + +// Attributes + static LPCTSTR GetWndClassName() + { + return WC_PAGESCROLLER; + } + + int GetButtonSize() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, PGM_GETBUTTONSIZE, 0, 0L); + } + + int SetButtonSize(int nButtonSize) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, PGM_SETBUTTONSIZE, 0, nButtonSize); + } + + DWORD GetButtonState(int nButton) const + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(nButton == PGB_TOPORLEFT || nButton == PGB_BOTTOMORRIGHT); + return (DWORD)::SendMessage(m_hWnd, PGM_GETBUTTONSTATE, 0, nButton); + } + + COLORREF GetBkColor() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (COLORREF)::SendMessage(m_hWnd, PGM_GETBKCOLOR, 0, 0L); + } + + COLORREF SetBkColor(COLORREF clrBk) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (COLORREF)::SendMessage(m_hWnd, PGM_SETBKCOLOR, 0, (LPARAM)clrBk); + } + + int GetBorder() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, PGM_GETBORDER, 0, 0L); + } + + int SetBorder(int nBorderSize) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, PGM_SETBORDER, 0, nBorderSize); + } + + int GetPos() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, PGM_GETPOS, 0, 0L); + } + + int SetPos(int nPos) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, PGM_SETPOS, 0, nPos); + } + +// Operations + void SetChild(HWND hWndChild) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, PGM_SETCHILD, 0, (LPARAM)hWndChild); + } + + void ForwardMouse(BOOL bForward = TRUE) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, PGM_FORWARDMOUSE, bForward, 0L); + } + + void RecalcSize() + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, PGM_RECALCSIZE, 0, 0L); + } + + void GetDropTarget(IDropTarget** ppDropTarget) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(ppDropTarget != NULL); + ::SendMessage(m_hWnd, PGM_GETDROPTARGET, 0, (LPARAM)ppDropTarget); + } +}; + +typedef CPagerCtrlT CPagerCtrl; + +#endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) + + +/////////////////////////////////////////////////////////////////////////////// +// CLinkCtrl - Windows SYSLINK control + +#if (_WIN32_WINNT >= 0x0501) && !defined(_WIN32_WCE) + +template +class CLinkCtrlT : public TBase +{ +public: +// Constructors + CLinkCtrlT(HWND hWnd = NULL) : TBase(hWnd) + { } + + CLinkCtrlT< TBase >& operator =(HWND hWnd) + { + m_hWnd = hWnd; + return *this; + } + + HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, + DWORD dwStyle = 0, DWORD dwExStyle = 0, + ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) + { + return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); + } + +// Attributes + static LPCTSTR GetWndClassName() + { +#ifdef _UNICODE + return WC_LINK; +#else // !_UNICODE + return "SysLink"; +#endif // !_UNICODE + } + + int GetIdealHeight(int cxMaxWidth = 0) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, LM_GETIDEALHEIGHT, cxMaxWidth, 0L); + } + + BOOL GetItem(PLITEM pLItem) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, LM_GETITEM, 0, (LPARAM)pLItem); + } + + BOOL SetItem(PLITEM pLItem) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, LM_SETITEM, 0, (LPARAM)pLItem); + } + + // Vista only + int GetIdealSize(SIZE& size, int cxMaxWidth = 0) const + { +#ifndef LM_GETIDEALSIZE + const UINT LM_GETIDEALSIZE = LM_GETIDEALHEIGHT; +#endif + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, LM_GETIDEALSIZE, cxMaxWidth, (LPARAM)&size); + } + +// Operations + BOOL HitTest(PLHITTESTINFO pLHitTestInfo) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, LM_HITTEST, 0, (LPARAM)pLHitTestInfo); + } +}; + +typedef CLinkCtrlT CLinkCtrl; + +#endif // (_WIN32_WINNT >= 0x0501) && !defined(_WIN32_WCE) + + +/////////////////////////////////////////////////////////////////////////////// +// CCustomDraw - MI class for custom-draw support + +template +class CCustomDraw +{ +public: +#if (_ATL_VER < 0x0700) + BOOL m_bHandledCD; + + BOOL IsMsgHandled() const + { + return m_bHandledCD; + } + + void SetMsgHandled(BOOL bHandled) + { + m_bHandledCD = bHandled; + } +#endif // !(_ATL_VER < 0x0700) + +// Message map and handlers + BEGIN_MSG_MAP(CCustomDraw< T >) + NOTIFY_CODE_HANDLER(NM_CUSTOMDRAW, OnCustomDraw) + ALT_MSG_MAP(1) + REFLECTED_NOTIFY_CODE_HANDLER(NM_CUSTOMDRAW, OnCustomDraw) + END_MSG_MAP() + +// message handler + LRESULT OnCustomDraw(int idCtrl, LPNMHDR pnmh, BOOL& bHandled) + { + T* pT = static_cast(this); + pT->SetMsgHandled(TRUE); + LPNMCUSTOMDRAW lpNMCustomDraw = (LPNMCUSTOMDRAW)pnmh; + DWORD dwRet = 0; + switch(lpNMCustomDraw->dwDrawStage) + { + case CDDS_PREPAINT: + dwRet = pT->OnPrePaint(idCtrl, lpNMCustomDraw); + break; + case CDDS_POSTPAINT: + dwRet = pT->OnPostPaint(idCtrl, lpNMCustomDraw); + break; + case CDDS_PREERASE: + dwRet = pT->OnPreErase(idCtrl, lpNMCustomDraw); + break; + case CDDS_POSTERASE: + dwRet = pT->OnPostErase(idCtrl, lpNMCustomDraw); + break; + case CDDS_ITEMPREPAINT: + dwRet = pT->OnItemPrePaint(idCtrl, lpNMCustomDraw); + break; + case CDDS_ITEMPOSTPAINT: + dwRet = pT->OnItemPostPaint(idCtrl, lpNMCustomDraw); + break; + case CDDS_ITEMPREERASE: + dwRet = pT->OnItemPreErase(idCtrl, lpNMCustomDraw); + break; + case CDDS_ITEMPOSTERASE: + dwRet = pT->OnItemPostErase(idCtrl, lpNMCustomDraw); + break; +#if (_WIN32_IE >= 0x0400) + case (CDDS_ITEMPREPAINT | CDDS_SUBITEM): + dwRet = pT->OnSubItemPrePaint(idCtrl, lpNMCustomDraw); + break; +#endif // (_WIN32_IE >= 0x0400) + default: + pT->SetMsgHandled(FALSE); + break; + } + bHandled = pT->IsMsgHandled(); + return dwRet; + } + +// Overrideables + DWORD OnPrePaint(int /*idCtrl*/, LPNMCUSTOMDRAW /*lpNMCustomDraw*/) + { + return CDRF_DODEFAULT; + } + + DWORD OnPostPaint(int /*idCtrl*/, LPNMCUSTOMDRAW /*lpNMCustomDraw*/) + { + return CDRF_DODEFAULT; + } + + DWORD OnPreErase(int /*idCtrl*/, LPNMCUSTOMDRAW /*lpNMCustomDraw*/) + { + return CDRF_DODEFAULT; + } + + DWORD OnPostErase(int /*idCtrl*/, LPNMCUSTOMDRAW /*lpNMCustomDraw*/) + { + return CDRF_DODEFAULT; + } + + DWORD OnItemPrePaint(int /*idCtrl*/, LPNMCUSTOMDRAW /*lpNMCustomDraw*/) + { + return CDRF_DODEFAULT; + } + + DWORD OnItemPostPaint(int /*idCtrl*/, LPNMCUSTOMDRAW /*lpNMCustomDraw*/) + { + return CDRF_DODEFAULT; + } + + DWORD OnItemPreErase(int /*idCtrl*/, LPNMCUSTOMDRAW /*lpNMCustomDraw*/) + { + return CDRF_DODEFAULT; + } + + DWORD OnItemPostErase(int /*idCtrl*/, LPNMCUSTOMDRAW /*lpNMCustomDraw*/) + { + return CDRF_DODEFAULT; + } + +#if (_WIN32_IE >= 0x0400) + DWORD OnSubItemPrePaint(int /*idCtrl*/, LPNMCUSTOMDRAW /*lpNMCustomDraw*/) + { + return CDRF_DODEFAULT; + } +#endif // (_WIN32_IE >= 0x0400) +}; + + +// --- Windows CE common controls --- + +#ifdef _WIN32_WCE + +/////////////////////////////////////////////////////////////////////////////// +// CCECommandBarCtrl + +template +class CCECommandBarCtrlT : public TBase +{ +public: +// Constructors + CCECommandBarCtrlT(HWND hWnd = NULL) : TBase(hWnd) { } + + CCECommandBarCtrlT< TBase >& operator=(HWND hWnd) + { + m_hWnd = hWnd; + return *this; + } + +// Attributes + BOOL IsVisible() const + { + return IsWindowVisible(); + } + + int GetHeight() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return ::CommandBar_Height(m_hWnd); + } + + HMENU GetMenu(WORD wButton) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return ::CommandBar_GetMenu(m_hWnd, wButton); + } + +// Operations + HWND Create(HWND hWndParent, int nCmdBarID) + { + m_hWnd = ::CommandBar_Create(ModuleHelper::GetModuleInstance(), hWndParent, nCmdBarID); + ATLASSERT(::IsWindow(m_hWnd)); + return m_hWnd; + } + + void Destroy() + { + DestroyWindow(); + } + + BOOL Show(BOOL bShow = TRUE) + { + ATLASSERT(::IsWindow(m_hWnd)); + return ::CommandBar_Show(m_hWnd, bShow); + } + + BOOL DrawMenuBar(WORD wButton) + { + ATLASSERT(::IsWindow(m_hWnd)); + return ::CommandBar_DrawMenuBar(m_hWnd, wButton); + } + + BOOL AddAdornments(DWORD dwFlags = 0) + { + ATLASSERT(::IsWindow(m_hWnd)); + return ::CommandBar_AddAdornments(m_hWnd, dwFlags, 0); + } + + int AddBitmap(int nBitmapID, int nNumImages) + { + ATLASSERT(::IsWindow(m_hWnd)); + return ::CommandBar_AddBitmap(m_hWnd, ModuleHelper::GetResourceInstance(), nBitmapID, nNumImages, 16, 16); + } + + BOOL AddButtons(UINT uNumButtons, LPTBBUTTON lpButtons) + { + ATLASSERT(::IsWindow(m_hWnd)); + return CommandBar_AddButtons(m_hWnd, uNumButtons, lpButtons); + } + + BOOL AddToolTips(UINT uNumToolTips, LPTSTR lpToolTips) + { + ATLASSERT(::IsWindow(m_hWnd)); + return CommandBar_AddToolTips(m_hWnd, uNumToolTips, lpToolTips); + } + + BOOL InsertButton(int nButton, LPTBBUTTON lpButton) + { + ATLASSERT(::IsWindow(m_hWnd)); + return CommandBar_InsertButton(m_hWnd, nButton, lpButton); + } + + HWND InsertComboBox(int nWidth, UINT dwStyle, WORD wComboBoxID, WORD wButton) + { + ATLASSERT(::IsWindow(m_hWnd)); + return ::CommandBar_InsertComboBox(m_hWnd, ModuleHelper::GetModuleInstance(), nWidth, dwStyle, wComboBoxID, wButton); + } + + BOOL InsertMenubar(WORD wMenuID, WORD wButton) + { + ATLASSERT(::IsWindow(m_hWnd)); + return ::CommandBar_InsertMenubar(m_hWnd, ModuleHelper::GetResourceInstance(), wMenuID, wButton); + } + + BOOL InsertMenubarEx(ATL::_U_STRINGorID menu, WORD wButton) + { + ATLASSERT(::IsWindow(m_hWnd)); + return ::CommandBar_InsertMenubarEx(m_hWnd, ModuleHelper::GetResourceInstance(), (LPTSTR)menu.m_lpstr, wButton); + } + + BOOL IsCommandBarMessage(LPMSG lpMsg) + { + ATLASSERT(::IsWindow(m_hWnd)); + return ::IsCommandBarMessage(m_hWnd, lpMsg); + } +}; + +#if defined(_AYGSHELL_H_) || defined(__AYGSHELL_H__) // PPC MenuBar + typedef CCECommandBarCtrlT CMenuBarCtrl; +#else + typedef CCECommandBarCtrlT CCECommandBarCtrl; +#endif // defined(_AYGSHELL_H_) || defined(__AYGSHELL_H__) + +/////////////////////////////////////////////////////////////////////////////// +// CCECommandBandsCtrl + +template +class CCECommandBandsCtrlT : public TBase +{ +public: +// Constructors + CCECommandBandsCtrlT(HWND hWnd = NULL) : TBase(hWnd) { } + + CCECommandBandsCtrlT< TBase >& operator=(HWND hWnd) + { + m_hWnd = hWnd; + return *this; + } + +// Attributes + BOOL IsVisible() const + { + return IsWindowVisible(); + } + +#if (_WIN32_IE >= 0x0400) + UINT GetHeight() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return CommandBands_Height(m_hWnd); + } +#endif // (_WIN32_IE >= 0x0400) + + HWND GetCommandBar(UINT uBand) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return ::CommandBands_GetCommandBar(m_hWnd, uBand); + } + + BOOL GetRestoreInformation(UINT uBand, LPCOMMANDBANDSRESTOREINFO pcbr) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return ::CommandBands_GetRestoreInformation(m_hWnd, uBand, pcbr); + } + +// Operations + HWND Create(HWND hWndParent, UINT wID, DWORD dwStyles, HIMAGELIST hImageList = NULL) + { + m_hWnd = ::CommandBands_Create(ModuleHelper::GetModuleInstance(), hWndParent, wID, dwStyles, hImageList); + ATLASSERT(::IsWindow(m_hWnd)); + return m_hWnd; + } + + BOOL AddAdornments(DWORD dwFlags = 0, LPREBARBANDINFO prbbi = NULL) + { + ATLASSERT(::IsWindow(m_hWnd)); + return ::CommandBands_AddAdornments(m_hWnd, ModuleHelper::GetModuleInstance(), dwFlags, prbbi); + } + + BOOL AddBands(UINT uBandCount, LPREBARBANDINFO prbbi) + { + ATLASSERT(::IsWindow(m_hWnd)); + return ::CommandBands_AddBands(m_hWnd, ModuleHelper::GetModuleInstance(), uBandCount, prbbi); + } + + BOOL Show(BOOL bShow = TRUE) + { + ATLASSERT(::IsWindow(m_hWnd)); + return ::CommandBands_Show(m_hWnd, bShow); + } +}; + +typedef CCECommandBandsCtrlT CCECommandBandsCtrl; + +#endif // _WIN32_WCE + +}; // namespace WTL + +#endif // __ATLCTRLS_H__ diff --git a/Externals/WTL80/atlctrlw.h b/Externals/WTL80/atlctrlw.h new file mode 100644 index 0000000000..3bf16ee586 --- /dev/null +++ b/Externals/WTL80/atlctrlw.h @@ -0,0 +1,4161 @@ +// Windows Template Library - WTL version 8.0 +// Copyright (C) Microsoft Corporation. All rights reserved. +// +// This file is a part of the Windows Template Library. +// The use and distribution terms for this software are covered by the +// Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php) +// which can be found in the file CPL.TXT at the root of this distribution. +// By using this software in any fashion, you are agreeing to be bound by +// the terms of this license. You must not remove this notice, or +// any other, from this software. + +#ifndef __ATLCTRLW_H__ +#define __ATLCTRLW_H__ + +#pragma once + +#ifndef __cplusplus + #error ATL requires C++ compilation (use a .cpp suffix) +#endif + +#ifdef _WIN32_WCE + #error atlctrlw.h is not supported on Windows CE +#endif + +#ifndef __ATLAPP_H__ + #error atlctrlw.h requires atlapp.h to be included first +#endif + +#ifndef __ATLCTRLS_H__ + #error atlctrlw.h requires atlctrls.h to be included first +#endif + +#if (_WIN32_IE < 0x0400) + #error atlctrlw.h requires _WIN32_IE >= 0x0400 +#endif + +// Define _WTL_CMDBAR_VISTA_MENUS as 0 to exclude Vista menus support +#if !defined(_WTL_CMDBAR_VISTA_MENUS) && (WINVER >= 0x0500) && (_WIN32_WINNT >= 0x0501) && (_WIN32_IE >= 0x0501) + #define _WTL_CMDBAR_VISTA_MENUS 1 +#endif + +#if _WTL_CMDBAR_VISTA_MENUS + #if !((_WIN32_WINNT >= 0x0501) && (_WIN32_IE >= 0x0501)) + #error _WTL_CMDBAR_VISTA_MENUS requires (_WIN32_WINNT >= 0x0501) && (_WIN32_IE >= 0x0501) + #endif +#endif + + +/////////////////////////////////////////////////////////////////////////////// +// Classes in this file: +// +// CCommandBarCtrlImpl +// CCommandBarCtrl +// CMDICommandBarCtrlImpl +// CMDICommandBarCtrl + + +namespace WTL +{ + +/////////////////////////////////////////////////////////////////////////////// +// Command Bars + +// Window Styles: +#define CBRWS_TOP CCS_TOP +#define CBRWS_BOTTOM CCS_BOTTOM +#define CBRWS_NORESIZE CCS_NORESIZE +#define CBRWS_NOPARENTALIGN CCS_NOPARENTALIGN +#define CBRWS_NODIVIDER CCS_NODIVIDER + +// Extended styles +#define CBR_EX_TRANSPARENT 0x00000001L +#define CBR_EX_SHAREMENU 0x00000002L +#define CBR_EX_ALTFOCUSMODE 0x00000004L +#define CBR_EX_TRACKALWAYS 0x00000008L +#define CBR_EX_NOVISTAMENUS 0x00000010L + +// standard command bar styles +#define ATL_SIMPLE_CMDBAR_PANE_STYLE \ + (WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | CBRWS_NODIVIDER | CBRWS_NORESIZE | CBRWS_NOPARENTALIGN) + +// Messages - support chevrons for frame windows +#define CBRM_GETCMDBAR (WM_USER + 301) // returns command bar HWND +#define CBRM_GETMENU (WM_USER + 302) // returns loaded or attached menu +#define CBRM_TRACKPOPUPMENU (WM_USER + 303) // displays a popup menu + +typedef struct tagCBRPOPUPMENU +{ + int cbSize; + HMENU hMenu; // popup menu do display + UINT uFlags; // TPM_* flags for ::TrackPopupMenuEx + int x; + int y; + LPTPMPARAMS lptpm; // ptr to TPMPARAMS for ::TrackPopupMenuEx +} CBRPOPUPMENU, *LPCBRPOPUPMENU; + +// helper class +template +class CSimpleStack : public ATL::CSimpleArray< T > +{ +public: + BOOL Push(T t) + { +#ifdef _CMDBAR_EXTRA_TRACE + ATLTRACE2(atlTraceUI, 0, _T("CmdBar - STACK-PUSH (%8.8X) size = %i\n"), t, GetSize()); +#endif + return Add(t); + } + + T Pop() + { + int nLast = GetSize() - 1; + if(nLast < 0) + return NULL; // must be able to convert to NULL + T t = m_aT[nLast]; +#ifdef _CMDBAR_EXTRA_TRACE + ATLTRACE2(atlTraceUI, 0, _T("CmdBar - STACK-POP (%8.8X) size = %i\n"), t, GetSize()); +#endif + if(!RemoveAt(nLast)) + return NULL; + return t; + } + + T GetCurrent() + { + int nLast = GetSize() - 1; + if(nLast < 0) + return NULL; // must be able to convert to NULL + return m_aT[nLast]; + } +}; + + +/////////////////////////////////////////////////////////////////////////////// +// CCommandBarCtrlBase - base class for the Command Bar implementation + +class CCommandBarCtrlBase : public CToolBarCtrl +{ +public: + struct _MsgHookData + { + HHOOK hMsgHook; + DWORD dwUsage; + + _MsgHookData() : hMsgHook(NULL), dwUsage(0) + { } + }; + + typedef ATL::CSimpleMap CMsgHookMap; + static CMsgHookMap* s_pmapMsgHook; + + static HHOOK s_hCreateHook; + static bool s_bW2K; // For animation flag + static CCommandBarCtrlBase* s_pCurrentBar; + static bool s_bStaticInit; + + CSimpleStack m_stackMenuWnd; + CSimpleStack m_stackMenuHandle; + + HWND m_hWndHook; + DWORD m_dwMagic; + + + CCommandBarCtrlBase() : m_hWndHook(NULL), m_dwMagic(1314) + { + // init static variables + if(!s_bStaticInit) + { + CStaticDataInitCriticalSectionLock lock; + if(FAILED(lock.Lock())) + { + ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CCommandBarCtrlBase::CCommandBarCtrlBase.\n")); + ATLASSERT(FALSE); + return; + } + + if(!s_bStaticInit) + { + // Just in case... + AtlInitCommonControls(ICC_COOL_CLASSES | ICC_BAR_CLASSES); + // Animation on Win2000 only + s_bW2K = !AtlIsOldWindows(); + // done + s_bStaticInit = true; + } + + lock.Unlock(); + } + } + + bool IsCommandBarBase() const { return m_dwMagic == 1314; } +}; + +__declspec(selectany) CCommandBarCtrlBase::CMsgHookMap* CCommandBarCtrlBase::s_pmapMsgHook = NULL; +__declspec(selectany) HHOOK CCommandBarCtrlBase::s_hCreateHook = NULL; +__declspec(selectany) CCommandBarCtrlBase* CCommandBarCtrlBase::s_pCurrentBar = NULL; +__declspec(selectany) bool CCommandBarCtrlBase::s_bW2K = false; +__declspec(selectany) bool CCommandBarCtrlBase::s_bStaticInit = false; + + +/////////////////////////////////////////////////////////////////////////////// +// CCommandBarCtrl - ATL implementation of Command Bars + +template +class ATL_NO_VTABLE CCommandBarCtrlImpl : public ATL::CWindowImpl< T, TBase, TWinTraits > +{ +public: + DECLARE_WND_SUPERCLASS(NULL, TBase::GetWndClassName()) + +// Declarations + struct _MenuItemData // menu item data + { + DWORD dwMagic; + LPTSTR lpstrText; + UINT fType; + UINT fState; + int iButton; + + _MenuItemData() { dwMagic = 0x1313; } + bool IsCmdBarMenuItem() { return (dwMagic == 0x1313); } + }; + + struct _ToolBarData // toolbar resource data + { + WORD wVersion; + WORD wWidth; + WORD wHeight; + WORD wItemCount; + //WORD aItems[wItemCount] + + WORD* items() + { return (WORD*)(this+1); } + }; + +// Constants + enum _CmdBarDrawConstants + { + s_kcxGap = 1, + s_kcxTextMargin = 2, + s_kcxButtonMargin = 3, + s_kcyButtonMargin = 3 + }; + + enum + { + _nMaxMenuItemTextLength = 100, + _chChevronShortcut = _T('/') + }; + +#ifndef DT_HIDEPREFIX + enum { DT_HIDEPREFIX = 0x00100000 }; +#endif // !DT_HIDEPREFIX + +// Data members + HMENU m_hMenu; + HIMAGELIST m_hImageList; + ATL::CSimpleValArray m_arrCommand; + + DWORD m_dwExtendedStyle; // Command Bar specific extended styles + + ATL::CContainedWindow m_wndParent; + + bool m_bMenuActive:1; + bool m_bAttachedMenu:1; + bool m_bImagesVisible:1; + bool m_bPopupItem:1; + bool m_bContextMenu:1; + bool m_bEscapePressed:1; + bool m_bSkipMsg:1; + bool m_bParentActive:1; + bool m_bFlatMenus:1; + bool m_bUseKeyboardCues:1; + bool m_bShowKeyboardCues:1; + bool m_bAllowKeyboardCues:1; + bool m_bKeyboardInput:1; + bool m_bAlphaImages:1; + bool m_bLayoutRTL:1; + bool m_bSkipPostDown:1; + bool m_bVistaMenus:1; + + int m_nPopBtn; + int m_nNextPopBtn; + + SIZE m_szBitmap; + SIZE m_szButton; + + COLORREF m_clrMask; + CFont m_fontMenu; // used internally, only to measure text + + UINT m_uSysKey; + + HWND m_hWndFocus; // Alternate focus mode + + int m_cxExtraSpacing; + +#if _WTL_CMDBAR_VISTA_MENUS + ATL::CSimpleValArray m_arrVistaBitmap; // Bitmaps for Vista menus +#endif // _WTL_CMDBAR_VISTA_MENUS + +// Constructor/destructor + CCommandBarCtrlImpl() : + m_hMenu(NULL), + m_hImageList(NULL), + m_wndParent(this, 1), + m_bMenuActive(false), + m_bAttachedMenu(false), + m_nPopBtn(-1), + m_nNextPopBtn(-1), + m_bPopupItem(false), + m_bImagesVisible(true), + m_bSkipMsg(false), + m_uSysKey(0), + m_hWndFocus(NULL), + m_bContextMenu(false), + m_bEscapePressed(false), + m_clrMask(RGB(192, 192, 192)), + m_dwExtendedStyle(CBR_EX_TRANSPARENT | CBR_EX_SHAREMENU | CBR_EX_TRACKALWAYS), + m_bParentActive(true), + m_bFlatMenus(false), + m_bUseKeyboardCues(false), + m_bShowKeyboardCues(false), + m_bAllowKeyboardCues(true), + m_bKeyboardInput(false), + m_cxExtraSpacing(0), + m_bAlphaImages(false), + m_bLayoutRTL(false), + m_bSkipPostDown(false), + m_bVistaMenus(false) + { + SetImageSize(16, 15); // default + } + + ~CCommandBarCtrlImpl() + { + if(m_wndParent.IsWindow()) +/*scary!*/ m_wndParent.UnsubclassWindow(); + + if(m_hMenu != NULL && (m_dwExtendedStyle & CBR_EX_SHAREMENU) == 0) + ::DestroyMenu(m_hMenu); + + if(m_hImageList != NULL) + ::ImageList_Destroy(m_hImageList); + } + +// Attributes + DWORD GetCommandBarExtendedStyle() const + { + return m_dwExtendedStyle; + } + + DWORD SetCommandBarExtendedStyle(DWORD dwExtendedStyle, DWORD dwMask = 0) + { + DWORD dwPrevStyle = m_dwExtendedStyle; + if(dwMask == 0) + m_dwExtendedStyle = dwExtendedStyle; + else + m_dwExtendedStyle = (m_dwExtendedStyle & ~dwMask) | (dwExtendedStyle & dwMask); + return dwPrevStyle; + } + + CMenuHandle GetMenu() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return m_hMenu; + } + + COLORREF GetImageMaskColor() const + { + return m_clrMask; + } + + COLORREF SetImageMaskColor(COLORREF clrMask) + { + COLORREF clrOld = m_clrMask; + m_clrMask = clrMask; + return clrOld; + } + + bool GetImagesVisible() const + { + return m_bImagesVisible; + } + + bool SetImagesVisible(bool bVisible) + { + bool bOld = m_bImagesVisible; + m_bImagesVisible = bVisible; + return bOld; + } + + void GetImageSize(SIZE& size) const + { + size = m_szBitmap; + } + + bool SetImageSize(SIZE& size) + { + return SetImageSize(size.cx, size.cy); + } + + bool SetImageSize(int cx, int cy) + { + if(m_hImageList != NULL) + { + if(::ImageList_GetImageCount(m_hImageList) == 0) // empty + { + ::ImageList_Destroy(m_hImageList); + m_hImageList = NULL; + } + else + { + return false; // can't set, image list exists + } + } + + if(cx == 0 || cy == 0) + return false; + + m_szBitmap.cx = cx; + m_szBitmap.cy = cy; + m_szButton.cx = m_szBitmap.cx + 2 * s_kcxButtonMargin; + m_szButton.cy = m_szBitmap.cy + 2 * s_kcyButtonMargin; + + return true; + } + + bool GetAlphaImages() const + { + return m_bAlphaImages; + } + + bool SetAlphaImages(bool bAlphaImages) + { + if(m_hImageList != NULL) + { + if(::ImageList_GetImageCount(m_hImageList) == 0) // empty + { + ::ImageList_Destroy(m_hImageList); + m_hImageList = NULL; + } + else + { + return false; // can't set, image list exists + } + } + + m_bAlphaImages = bAlphaImages; + return true; + } + + HWND GetCmdBar() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (HWND)::SendMessage(m_hWnd, CBRM_GETCMDBAR, 0, 0L); + } + +// Methods + HWND Create(HWND hWndParent, RECT& rcPos, LPCTSTR szWindowName = NULL, + DWORD dwStyle = 0, DWORD dwExStyle = 0, + UINT nID = 0, LPVOID lpCreateParam = NULL) + { + // These styles are required for command bars + dwStyle |= TBSTYLE_LIST | TBSTYLE_FLAT; +#if (_MSC_VER >= 1300) + return ATL::CWindowImpl< T, TBase, TWinTraits >::Create(hWndParent, rcPos, szWindowName, dwStyle, dwExStyle, nID, lpCreateParam); +#else // !(_MSC_VER >= 1300) + typedef ATL::CWindowImpl< T, TBase, TWinTraits > _baseClass; + return _baseClass::Create(hWndParent, rcPos, szWindowName, dwStyle, dwExStyle, nID, lpCreateParam); +#endif // !(_MSC_VER >= 1300) + } + + BOOL AttachToWindow(HWND hWnd) + { + ATLASSERT(m_hWnd == NULL); + ATLASSERT(::IsWindow(hWnd)); + BOOL bRet = SubclassWindow(hWnd); + if(bRet) + { + m_bAttachedMenu = true; + T* pT = static_cast(this); + pT->GetSystemSettings(); + } + return bRet; + } + + BOOL LoadMenu(ATL::_U_STRINGorID menu) + { + ATLASSERT(::IsWindow(m_hWnd)); + + if(m_bAttachedMenu) // doesn't work in this mode + return FALSE; + if(menu.m_lpstr == NULL) + return FALSE; + + HMENU hMenu = ::LoadMenu(ModuleHelper::GetResourceInstance(), menu.m_lpstr); + if(hMenu == NULL) + return FALSE; + + return AttachMenu(hMenu); + } + + BOOL AttachMenu(HMENU hMenu) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(hMenu == NULL || ::IsMenu(hMenu)); + if(hMenu != NULL && !::IsMenu(hMenu)) + return FALSE; + +#if _WTL_CMDBAR_VISTA_MENUS + // remove Vista bitmaps if used + if(m_bVistaMenus && (m_hMenu != NULL)) + { + T* pT = static_cast(this); + pT->_RemoveVistaBitmapsFromMenu(); + } +#endif // _WTL_CMDBAR_VISTA_MENUS + + // destroy old menu, if needed, and set new one + if(m_hMenu != NULL && (m_dwExtendedStyle & CBR_EX_SHAREMENU) == 0) + ::DestroyMenu(m_hMenu); + + m_hMenu = hMenu; + + if(m_bAttachedMenu) // Nothing else in this mode + return TRUE; + + // Build buttons according to menu + SetRedraw(FALSE); + + // Clear all buttons + int nCount = GetButtonCount(); + for(int i = 0; i < nCount; i++) + ATLVERIFY(DeleteButton(0) != FALSE); + + // Add buttons for each menu item + if(m_hMenu != NULL) + { + int nItems = ::GetMenuItemCount(m_hMenu); + + T* pT = static_cast(this); + pT; // avoid level 4 warning + TCHAR szString[pT->_nMaxMenuItemTextLength]; + for(int i = 0; i < nItems; i++) + { + CMenuItemInfo mii; + mii.fMask = MIIM_TYPE | MIIM_STATE | MIIM_SUBMENU; + mii.fType = MFT_STRING; + mii.dwTypeData = szString; + mii.cch = pT->_nMaxMenuItemTextLength; + BOOL bRet = ::GetMenuItemInfo(m_hMenu, i, TRUE, &mii); + ATLASSERT(bRet); + // If we have more than the buffer, we assume we have bitmaps bits + if(lstrlen(szString) > pT->_nMaxMenuItemTextLength - 1) + { + mii.fType = MFT_BITMAP; + ::SetMenuItemInfo(m_hMenu, i, TRUE, &mii); + szString[0] = 0; + } + + // NOTE: Command Bar currently supports only drop-down menu items + ATLASSERT(mii.hSubMenu != NULL); + + TBBUTTON btn = { 0 }; + btn.iBitmap = 0; + btn.idCommand = i; + btn.fsState = (BYTE)(((mii.fState & MFS_DISABLED) == 0) ? TBSTATE_ENABLED : 0); + btn.fsStyle = TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE | TBSTYLE_DROPDOWN; + btn.dwData = 0; + btn.iString = 0; + + bRet = InsertButton(-1, &btn); + ATLASSERT(bRet); + + TBBUTTONINFO bi = { 0 }; + bi.cbSize = sizeof(TBBUTTONINFO); + bi.dwMask = TBIF_TEXT; + bi.pszText = szString; + + bRet = SetButtonInfo(i, &bi); + ATLASSERT(bRet); + } + } + + SetRedraw(TRUE); + Invalidate(); + UpdateWindow(); + + return TRUE; + } + + BOOL LoadImages(ATL::_U_STRINGorID image) + { + return _LoadImagesHelper(image, false); + } + + BOOL LoadMappedImages(UINT nIDImage, UINT nFlags = 0, LPCOLORMAP lpColorMap = NULL, int nMapSize = 0) + { + return _LoadImagesHelper(nIDImage, true, nFlags , lpColorMap, nMapSize); + } + + BOOL _LoadImagesHelper(ATL::_U_STRINGorID image, bool bMapped, UINT nFlags = 0, LPCOLORMAP lpColorMap = NULL, int nMapSize = 0) + { + ATLASSERT(::IsWindow(m_hWnd)); + HINSTANCE hInstance = ModuleHelper::GetResourceInstance(); + + HRSRC hRsrc = ::FindResource(hInstance, image.m_lpstr, (LPTSTR)RT_TOOLBAR); + if(hRsrc == NULL) + return FALSE; + + HGLOBAL hGlobal = ::LoadResource(hInstance, hRsrc); + if(hGlobal == NULL) + return FALSE; + + _ToolBarData* pData = (_ToolBarData*)::LockResource(hGlobal); + if(pData == NULL) + return FALSE; + ATLASSERT(pData->wVersion == 1); + + WORD* pItems = pData->items(); + int nItems = pData->wItemCount; + + // Set internal data + SetImageSize(pData->wWidth, pData->wHeight); + + // Create image list if needed + if(m_hImageList == NULL) + { + // Check if the bitmap is 32-bit (alpha channel) bitmap (valid for Windows XP only) + T* pT = static_cast(this); + m_bAlphaImages = AtlIsAlphaBitmapResource(image); + + if(!pT->CreateInternalImageList(pData->wItemCount)) + return FALSE; + } + +#if _WTL_CMDBAR_VISTA_MENUS + int nOldImageCount = ::ImageList_GetImageCount(m_hImageList); +#endif // _WTL_CMDBAR_VISTA_MENUS + + // Add bitmap to our image list + CBitmap bmp; + if(bMapped) + { + ATLASSERT(HIWORD(PtrToUlong(image.m_lpstr)) == 0); // if mapped, must be a numeric ID + int nIDImage = (int)(short)LOWORD(PtrToUlong(image.m_lpstr)); + bmp.LoadMappedBitmap(nIDImage, (WORD)nFlags, lpColorMap, nMapSize); + } + else + { + if(m_bAlphaImages) + bmp = (HBITMAP)::LoadImage(ModuleHelper::GetResourceInstance(), image.m_lpstr, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_DEFAULTSIZE); + else + bmp.LoadBitmap(image.m_lpstr); + } + ATLASSERT(bmp.m_hBitmap != NULL); + if(bmp.m_hBitmap == NULL) + return FALSE; + if(::ImageList_AddMasked(m_hImageList, bmp, m_clrMask) == -1) + return FALSE; + + // Fill the array with command IDs + for(int i = 0; i < nItems; i++) + { + if(pItems[i] != 0) + m_arrCommand.Add(pItems[i]); + } + + int nImageCount = ::ImageList_GetImageCount(m_hImageList); + ATLASSERT(nImageCount == m_arrCommand.GetSize()); + if(nImageCount != m_arrCommand.GetSize()) + return FALSE; + +#if _WTL_CMDBAR_VISTA_MENUS + if(RunTimeHelper::IsVista()) + { + T* pT = static_cast(this); + pT->_AddVistaBitmapsFromImageList(nOldImageCount, nImageCount - nOldImageCount); + ATLASSERT(nImageCount == m_arrVistaBitmap.GetSize()); + } +#endif // _WTL_CMDBAR_VISTA_MENUS + + return TRUE; + } + + BOOL AddBitmap(ATL::_U_STRINGorID bitmap, int nCommandID) + { + ATLASSERT(::IsWindow(m_hWnd)); + CBitmap bmp; + bmp.LoadBitmap(bitmap.m_lpstr); + if(bmp.m_hBitmap == NULL) + return FALSE; + return AddBitmap(bmp, nCommandID); + } + + BOOL AddBitmap(HBITMAP hBitmap, UINT nCommandID) + { + ATLASSERT(::IsWindow(m_hWnd)); + T* pT = static_cast(this); + // Create image list if it doesn't exist + if(m_hImageList == NULL) + { + if(!pT->CreateInternalImageList(1)) + return FALSE; + } + // check bitmap size + CBitmapHandle bmp = hBitmap; + SIZE size = { 0, 0 }; + bmp.GetSize(size); + if(size.cx != m_szBitmap.cx || size.cy != m_szBitmap.cy) + { + ATLASSERT(FALSE); // must match size! + return FALSE; + } + // add bitmap + int nRet = ::ImageList_AddMasked(m_hImageList, hBitmap, m_clrMask); + if(nRet == -1) + return FALSE; + BOOL bRet = m_arrCommand.Add((WORD)nCommandID); + ATLASSERT(::ImageList_GetImageCount(m_hImageList) == m_arrCommand.GetSize()); +#if _WTL_CMDBAR_VISTA_MENUS + if(RunTimeHelper::IsVista()) + { + pT->_AddVistaBitmapFromImageList(m_arrCommand.GetSize() - 1); + ATLASSERT(m_arrVistaBitmap.GetSize() == m_arrCommand.GetSize()); + } +#endif // _WTL_CMDBAR_VISTA_MENUS + return bRet; + } + + BOOL AddIcon(ATL::_U_STRINGorID icon, UINT nCommandID) + { + ATLASSERT(::IsWindow(m_hWnd)); + HICON hIcon = ::LoadIcon(ModuleHelper::GetResourceInstance(), icon.m_lpstr); + if(hIcon == NULL) + return FALSE; + return AddIcon(hIcon, nCommandID); + } + + BOOL AddIcon(HICON hIcon, UINT nCommandID) + { + ATLASSERT(::IsWindow(m_hWnd)); + T* pT = static_cast(this); + // create image list if it doesn't exist + if(m_hImageList == NULL) + { + if(!pT->CreateInternalImageList(1)) + return FALSE; + } + + int nRet = ::ImageList_AddIcon(m_hImageList, hIcon); + if(nRet == -1) + return FALSE; + BOOL bRet = m_arrCommand.Add((WORD)nCommandID); + ATLASSERT(::ImageList_GetImageCount(m_hImageList) == m_arrCommand.GetSize()); +#if _WTL_CMDBAR_VISTA_MENUS + if(RunTimeHelper::IsVista()) + { + pT->_AddVistaBitmapFromImageList(m_arrCommand.GetSize() - 1); + ATLASSERT(m_arrVistaBitmap.GetSize() == m_arrCommand.GetSize()); + } +#endif // _WTL_CMDBAR_VISTA_MENUS + return bRet; + } + + BOOL ReplaceBitmap(ATL::_U_STRINGorID bitmap, int nCommandID) + { + ATLASSERT(::IsWindow(m_hWnd)); + CBitmap bmp; + bmp.LoadBitmap(bitmap.m_lpstr); + if(bmp.m_hBitmap == NULL) + return FALSE; + return ReplaceBitmap(bmp, nCommandID); + } + + BOOL ReplaceBitmap(HBITMAP hBitmap, UINT nCommandID) + { + ATLASSERT(::IsWindow(m_hWnd)); + BOOL bRet = FALSE; + for(int i = 0; i < m_arrCommand.GetSize(); i++) + { + if(m_arrCommand[i] == nCommandID) + { + bRet = ::ImageList_Remove(m_hImageList, i); + if(bRet) + { + m_arrCommand.RemoveAt(i); +#if _WTL_CMDBAR_VISTA_MENUS + if(RunTimeHelper::IsVista()) + { + if(m_arrVistaBitmap[i] != NULL) + ::DeleteObject(m_arrVistaBitmap[i]); + m_arrVistaBitmap.RemoveAt(i); + } +#endif // _WTL_CMDBAR_VISTA_MENUS + } + break; + } + } + if(bRet) + bRet = AddBitmap(hBitmap, nCommandID); + return bRet; + } + + BOOL ReplaceIcon(ATL::_U_STRINGorID icon, UINT nCommandID) + { + ATLASSERT(::IsWindow(m_hWnd)); + HICON hIcon = ::LoadIcon(ModuleHelper::GetResourceInstance(), icon.m_lpstr); + if(hIcon == NULL) + return FALSE; + return ReplaceIcon(hIcon, nCommandID); + } + + BOOL ReplaceIcon(HICON hIcon, UINT nCommandID) + { + ATLASSERT(::IsWindow(m_hWnd)); + BOOL bRet = FALSE; + for(int i = 0; i < m_arrCommand.GetSize(); i++) + { + if(m_arrCommand[i] == nCommandID) + { + bRet = (::ImageList_ReplaceIcon(m_hImageList, i, hIcon) != -1); +#if _WTL_CMDBAR_VISTA_MENUS + if(RunTimeHelper::IsVista() && bRet != FALSE) + { + T* pT = static_cast(this); + pT->_ReplaceVistaBitmapFromImageList(i); + } +#endif // _WTL_CMDBAR_VISTA_MENUS + break; + } + } + return bRet; + } + + BOOL RemoveImage(int nCommandID) + { + ATLASSERT(::IsWindow(m_hWnd)); + + BOOL bRet = FALSE; + for(int i = 0; i < m_arrCommand.GetSize(); i++) + { + if(m_arrCommand[i] == nCommandID) + { + bRet = ::ImageList_Remove(m_hImageList, i); + if(bRet) + { + m_arrCommand.RemoveAt(i); +#if _WTL_CMDBAR_VISTA_MENUS + if(RunTimeHelper::IsVista()) + { + if(m_arrVistaBitmap[i] != NULL) + ::DeleteObject(m_arrVistaBitmap[i]); + m_arrVistaBitmap.RemoveAt(i); + } +#endif // _WTL_CMDBAR_VISTA_MENUS + } + break; + } + } + return bRet; + } + + BOOL RemoveAllImages() + { + ATLASSERT(::IsWindow(m_hWnd)); + + ATLTRACE2(atlTraceUI, 0, _T("CmdBar - Removing all images\n")); + BOOL bRet = ::ImageList_RemoveAll(m_hImageList); + if(bRet) + { + m_arrCommand.RemoveAll(); +#if _WTL_CMDBAR_VISTA_MENUS + for(int i = 0; i < m_arrVistaBitmap.GetSize(); i++) + { + if(m_arrVistaBitmap[i] != NULL) + ::DeleteObject(m_arrVistaBitmap[i]); + } + m_arrVistaBitmap.RemoveAll(); +#endif // _WTL_CMDBAR_VISTA_MENUS + } + return bRet; + } + + BOOL TrackPopupMenu(HMENU hMenu, UINT uFlags, int x, int y, LPTPMPARAMS lpParams = NULL) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(::IsMenu(hMenu)); + if(!::IsMenu(hMenu)) + return FALSE; + m_bContextMenu = true; + if(m_bUseKeyboardCues) + m_bShowKeyboardCues = m_bKeyboardInput; + T* pT = static_cast(this); + return pT->DoTrackPopupMenu(hMenu, uFlags, x, y, lpParams); + } + + BOOL SetMDIClient(HWND /*hWndMDIClient*/) + { + // Use CMDICommandBarCtrl for MDI support + ATLASSERT(FALSE); + return FALSE; + } + +// Message map and handlers + BEGIN_MSG_MAP(CCommandBarCtrlImpl) + MESSAGE_HANDLER(WM_CREATE, OnCreate) + MESSAGE_HANDLER(WM_DESTROY, OnDestroy) + MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground) + MESSAGE_HANDLER(WM_INITMENU, OnInitMenu) + MESSAGE_HANDLER(WM_INITMENUPOPUP, OnInitMenuPopup) + MESSAGE_HANDLER(WM_MENUSELECT, OnMenuSelect) + MESSAGE_HANDLER(GetAutoPopupMessage(), OnInternalAutoPopup) + MESSAGE_HANDLER(GetGetBarMessage(), OnInternalGetBar) + MESSAGE_HANDLER(WM_SETTINGCHANGE, OnSettingChange) + MESSAGE_HANDLER(WM_MENUCHAR, OnMenuChar) + + MESSAGE_HANDLER(WM_KEYDOWN, OnKeyDown) + MESSAGE_HANDLER(WM_KEYUP, OnKeyUp) + MESSAGE_HANDLER(WM_CHAR, OnChar) + MESSAGE_HANDLER(WM_SYSKEYDOWN, OnSysKeyDown) + MESSAGE_HANDLER(WM_SYSKEYUP, OnSysKeyUp) + MESSAGE_HANDLER(WM_SYSCHAR, OnSysChar) +// public API handlers - these stay to support chevrons in atlframe.h + MESSAGE_HANDLER(CBRM_GETMENU, OnAPIGetMenu) + MESSAGE_HANDLER(CBRM_TRACKPOPUPMENU, OnAPITrackPopupMenu) + MESSAGE_HANDLER(CBRM_GETCMDBAR, OnAPIGetCmdBar) + + MESSAGE_HANDLER(WM_DRAWITEM, OnDrawItem) + MESSAGE_HANDLER(WM_MEASUREITEM, OnMeasureItem) + + MESSAGE_HANDLER(WM_FORWARDMSG, OnForwardMsg) + ALT_MSG_MAP(1) // Parent window messages + NOTIFY_CODE_HANDLER(TBN_HOTITEMCHANGE, OnParentHotItemChange) + NOTIFY_CODE_HANDLER(TBN_DROPDOWN, OnParentDropDown) + MESSAGE_HANDLER(WM_INITMENUPOPUP, OnParentInitMenuPopup) + MESSAGE_HANDLER(GetGetBarMessage(), OnParentInternalGetBar) + MESSAGE_HANDLER(WM_SYSCOMMAND, OnParentSysCommand) + MESSAGE_HANDLER(CBRM_GETMENU, OnParentAPIGetMenu) + MESSAGE_HANDLER(WM_MENUCHAR, OnParentMenuChar) + MESSAGE_HANDLER(CBRM_TRACKPOPUPMENU, OnParentAPITrackPopupMenu) + MESSAGE_HANDLER(CBRM_GETCMDBAR, OnParentAPIGetCmdBar) + MESSAGE_HANDLER(WM_SETTINGCHANGE, OnParentSettingChange) + + MESSAGE_HANDLER(WM_DRAWITEM, OnParentDrawItem) + MESSAGE_HANDLER(WM_MEASUREITEM, OnParentMeasureItem) + + MESSAGE_HANDLER(WM_ACTIVATE, OnParentActivate) + NOTIFY_CODE_HANDLER(NM_CUSTOMDRAW, OnParentCustomDraw) + ALT_MSG_MAP(2) // MDI client window messages + // Use CMDICommandBarCtrl for MDI support + ALT_MSG_MAP(3) // Message hook messages + MESSAGE_HANDLER(WM_MOUSEMOVE, OnHookMouseMove) + MESSAGE_HANDLER(WM_SYSKEYDOWN, OnHookSysKeyDown) + MESSAGE_HANDLER(WM_SYSKEYUP, OnHookSysKeyUp) + MESSAGE_HANDLER(WM_SYSCHAR, OnHookSysChar) + MESSAGE_HANDLER(WM_KEYDOWN, OnHookKeyDown) + MESSAGE_HANDLER(WM_NEXTMENU, OnHookNextMenu) + MESSAGE_HANDLER(WM_CHAR, OnHookChar) + END_MSG_MAP() + + LRESULT OnForwardMsg(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/) + { + LPMSG pMsg = (LPMSG)lParam; + if(pMsg->message >= WM_MOUSEFIRST && pMsg->message <= WM_MOUSELAST) + m_bKeyboardInput = false; + else if(pMsg->message >= WM_KEYFIRST && pMsg->message <= WM_KEYLAST) + m_bKeyboardInput = true; + LRESULT lRet = 0; + ProcessWindowMessage(pMsg->hwnd, pMsg->message, pMsg->wParam, pMsg->lParam, lRet, 3); + return lRet; + } + + LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) + { + // Let the toolbar initialize itself + LRESULT lRet = DefWindowProc(uMsg, wParam, lParam); + // get and use system settings + T* pT = static_cast(this); + pT->GetSystemSettings(); + // Parent init + ATL::CWindow wndParent = GetParent(); + ATL::CWindow wndTopLevelParent = wndParent.GetTopLevelParent(); + m_wndParent.SubclassWindow(wndTopLevelParent); + // Toolbar Init + SetButtonStructSize(); + SetImageList(NULL); + + // Create message hook if needed + CWindowCreateCriticalSectionLock lock; + if(FAILED(lock.Lock())) + { + ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CCommandBarCtrlImpl::OnCreate.\n")); + ATLASSERT(FALSE); + return -1; + } + + if(s_pmapMsgHook == NULL) + { + ATLTRY(s_pmapMsgHook = new CMsgHookMap); + ATLASSERT(s_pmapMsgHook != NULL); + } + + if(s_pmapMsgHook != NULL) + { + DWORD dwThreadID = ::GetCurrentThreadId(); + _MsgHookData* pData = s_pmapMsgHook->Lookup(dwThreadID); + if(pData == NULL) + { + ATLTRY(pData = new _MsgHookData); + ATLASSERT(pData != NULL); + HHOOK hMsgHook = ::SetWindowsHookEx(WH_GETMESSAGE, MessageHookProc, ModuleHelper::GetModuleInstance(), dwThreadID); + ATLASSERT(hMsgHook != NULL); + if(pData != NULL && hMsgHook != NULL) + { + pData->hMsgHook = hMsgHook; + pData->dwUsage = 1; + BOOL bRet = s_pmapMsgHook->Add(dwThreadID, pData); + bRet; + ATLASSERT(bRet); + } + } + else + { + (pData->dwUsage)++; + } + } + lock.Unlock(); + + // Get layout +#if (WINVER >= 0x0500) + m_bLayoutRTL = ((GetExStyle() & WS_EX_LAYOUTRTL) != 0); +#endif // (WINVER >= 0x0500) + + return lRet; + } + + LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) + { + LRESULT lRet = DefWindowProc(uMsg, wParam, lParam); + +#if _WTL_CMDBAR_VISTA_MENUS + if(m_bVistaMenus && (m_hMenu != NULL)) + { + T* pT = static_cast(this); + pT->_RemoveVistaBitmapsFromMenu(); + } + + for(int i = 0; i < m_arrVistaBitmap.GetSize(); i++) + { + if(m_arrVistaBitmap[i] != NULL) + ::DeleteObject(m_arrVistaBitmap[i]); + } +#endif // _WTL_CMDBAR_VISTA_MENUS + + if(m_bAttachedMenu) // nothing to do in this mode + return lRet; + + CWindowCreateCriticalSectionLock lock; + if(FAILED(lock.Lock())) + { + ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CCommandBarCtrlImpl::OnDestroy.\n")); + ATLASSERT(FALSE); + return lRet; + } + + if(s_pmapMsgHook != NULL) + { + DWORD dwThreadID = ::GetCurrentThreadId(); + _MsgHookData* pData = s_pmapMsgHook->Lookup(dwThreadID); + if(pData != NULL) + { + (pData->dwUsage)--; + if(pData->dwUsage == 0) + { + BOOL bRet = ::UnhookWindowsHookEx(pData->hMsgHook); + ATLASSERT(bRet); + bRet = s_pmapMsgHook->Remove(dwThreadID); + ATLASSERT(bRet); + if(bRet) + delete pData; + } + + if(s_pmapMsgHook->GetSize() == 0) + { + delete s_pmapMsgHook; + s_pmapMsgHook = NULL; + } + } + } + + lock.Unlock(); + + return lRet; + } + + LRESULT OnKeyDown(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled) + { +#ifdef _CMDBAR_EXTRA_TRACE + ATLTRACE2(atlTraceUI, 0, _T("CmdBar - OnKeyDown\n")); +#endif + bHandled = FALSE; + // Simulate Alt+Space for the parent + if(wParam == VK_SPACE) + { + m_wndParent.PostMessage(WM_SYSKEYDOWN, wParam, lParam | (1 << 29)); + bHandled = TRUE; + } +#if (_WIN32_IE >= 0x0500) + else if(wParam == VK_LEFT || wParam == VK_RIGHT) + { + WPARAM wpNext = m_bLayoutRTL ? VK_LEFT : VK_RIGHT; + + if(!m_bMenuActive) + { + T* pT = static_cast(this); + int nBtn = GetHotItem(); + int nNextBtn = (wParam == wpNext) ? pT->GetNextMenuItem(nBtn) : pT->GetPreviousMenuItem(nBtn); + if(nNextBtn == -2) + { + SetHotItem(-1); + if(pT->DisplayChevronMenu()) + bHandled = TRUE; + } + } + } +#endif // (_WIN32_IE >= 0x0500) + return 0; + } + + LRESULT OnKeyUp(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) + { +#ifdef _CMDBAR_EXTRA_TRACE + ATLTRACE2(atlTraceUI, 0, _T("CmdBar - OnKeyUp\n")); +#endif + if(wParam != VK_SPACE) + bHandled = FALSE; + return 0; + } + + LRESULT OnChar(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) + { +#ifdef _CMDBAR_EXTRA_TRACE + ATLTRACE2(atlTraceUI, 0, _T("CmdBar - OnChar\n")); +#endif + if(wParam != VK_SPACE) + bHandled = FALSE; + else + return 0; + // Security + if(!m_wndParent.IsWindowEnabled() || ::GetFocus() != m_hWnd) + return 0; + + // Handle mnemonic press when we have focus + int nBtn = 0; + if(wParam != VK_RETURN && !MapAccelerator((TCHAR)LOWORD(wParam), nBtn)) + { +#if (_WIN32_IE >= 0x0500) + if((TCHAR)LOWORD(wParam) != _chChevronShortcut) +#endif // (_WIN32_IE >= 0x0500) + ::MessageBeep(0); + } + else + { +#if (_WIN32_IE >= 0x0500) + RECT rcClient = { 0 }; + GetClientRect(&rcClient); + RECT rcBtn = { 0 }; + GetItemRect(nBtn, &rcBtn); + TBBUTTON tbb = { 0 }; + GetButton(nBtn, &tbb); + if((tbb.fsState & TBSTATE_ENABLED) != 0 && (tbb.fsState & TBSTATE_HIDDEN) == 0 && rcBtn.right <= rcClient.right) + { +#endif // (_WIN32_IE >= 0x0500) + PostMessage(WM_KEYDOWN, VK_DOWN, 0L); + if(wParam != VK_RETURN) + SetHotItem(nBtn); +#if (_WIN32_IE >= 0x0500) + } + else + { + ::MessageBeep(0); + bHandled = TRUE; + } +#endif // (_WIN32_IE >= 0x0500) + } + return 0; + } + + LRESULT OnSysKeyDown(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) + { +#ifdef _CMDBAR_EXTRA_TRACE + ATLTRACE2(atlTraceUI, 0, _T("CmdBar - OnSysKeyDown\n")); +#endif + bHandled = FALSE; + return 0; + } + + LRESULT OnSysKeyUp(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) + { +#ifdef _CMDBAR_EXTRA_TRACE + ATLTRACE2(atlTraceUI, 0, _T("CmdBar - OnSysKeyUp\n")); +#endif + bHandled = FALSE; + return 0; + } + + LRESULT OnSysChar(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) + { +#ifdef _CMDBAR_EXTRA_TRACE + ATLTRACE2(atlTraceUI, 0, _T("CmdBar - OnSysChar\n")); +#endif + bHandled = FALSE; + return 0; + } + + LRESULT OnEraseBackground(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) + { + if(m_bAttachedMenu || (m_dwExtendedStyle & CBR_EX_TRANSPARENT)) + { + bHandled = FALSE; + return 0; + } + + CDCHandle dc = (HDC)wParam; + RECT rect = { 0 }; + GetClientRect(&rect); + dc.FillRect(&rect, COLOR_MENU); + + return 1; // don't do the default erase + } + + LRESULT OnInitMenu(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) + { + int nIndex = GetHotItem(); + SendMessage(WM_MENUSELECT, MAKEWPARAM(nIndex, MF_POPUP|MF_HILITE), (LPARAM)m_hMenu); + bHandled = FALSE; + return 1; + } + + LRESULT OnInitMenuPopup(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) + { + if((BOOL)HIWORD(lParam)) // System menu, do nothing + { + bHandled = FALSE; + return 1; + } + + if(!(m_bAttachedMenu || m_bMenuActive)) // Not attached or ours, do nothing + { + bHandled = FALSE; + return 1; + } + +#ifdef _CMDBAR_EXTRA_TRACE + ATLTRACE2(atlTraceUI, 0, _T("CmdBar - OnInitMenuPopup\n")); +#endif + // forward to the parent or subclassed window, so it can handle update UI + LRESULT lRet = 0; + if(m_bAttachedMenu) + lRet = DefWindowProc(uMsg, wParam, (lParam || m_bContextMenu) ? lParam : GetHotItem()); + else + lRet = m_wndParent.DefWindowProc(uMsg, wParam, (lParam || m_bContextMenu) ? lParam : GetHotItem()); + +#if _WTL_CMDBAR_VISTA_MENUS + // If Vista menus are active, just set bitmaps and return + if(m_bVistaMenus) + { + CMenuHandle menu = (HMENU)wParam; + ATLASSERT(menu.m_hMenu != NULL); + + for(int i = 0; i < menu.GetMenuItemCount(); i++) + { + WORD nID = (WORD)menu.GetMenuItemID(i); + int nIndex = m_arrCommand.Find(nID); + + CMenuItemInfo mii; + mii.fMask = MIIM_BITMAP; + mii.hbmpItem = (m_bImagesVisible && (nIndex != -1)) ? m_arrVistaBitmap[nIndex] : NULL; + menu.SetMenuItemInfo(i, TRUE, &mii); + } + + return lRet; + } +#endif // _WTL_CMDBAR_VISTA_MENUS + + // Convert menu items to ownerdraw, add our data + if(m_bImagesVisible) + { + CMenuHandle menuPopup = (HMENU)wParam; + ATLASSERT(menuPopup.m_hMenu != NULL); + + T* pT = static_cast(this); + pT; // avoid level 4 warning + TCHAR szString[pT->_nMaxMenuItemTextLength]; + BOOL bRet = FALSE; + for(int i = 0; i < menuPopup.GetMenuItemCount(); i++) + { + CMenuItemInfo mii; + mii.cch = pT->_nMaxMenuItemTextLength; + mii.fMask = MIIM_CHECKMARKS | MIIM_DATA | MIIM_ID | MIIM_STATE | MIIM_SUBMENU | MIIM_TYPE; + mii.dwTypeData = szString; + bRet = menuPopup.GetMenuItemInfo(i, TRUE, &mii); + ATLASSERT(bRet); + + if(!(mii.fType & MFT_OWNERDRAW)) // Not already an ownerdraw item + { + mii.fMask = MIIM_DATA | MIIM_TYPE | MIIM_STATE; + _MenuItemData* pMI = NULL; + ATLTRY(pMI = new _MenuItemData); + ATLASSERT(pMI != NULL); + if(pMI != NULL) + { + pMI->fType = mii.fType; + pMI->fState = mii.fState; + mii.fType |= MFT_OWNERDRAW; + pMI->iButton = -1; + for(int j = 0; j < m_arrCommand.GetSize(); j++) + { + if(m_arrCommand[j] == mii.wID) + { + pMI->iButton = j; + break; + } + } + int cchLen = lstrlen(szString) + 1; + pMI->lpstrText = NULL; + ATLTRY(pMI->lpstrText = new TCHAR[cchLen]); + ATLASSERT(pMI->lpstrText != NULL); + if(pMI->lpstrText != NULL) + SecureHelper::strcpy_x(pMI->lpstrText, cchLen, szString); + mii.dwItemData = (ULONG_PTR)pMI; + bRet = menuPopup.SetMenuItemInfo(i, TRUE, &mii); + ATLASSERT(bRet); + } + } + } + + // Add it to the list + m_stackMenuHandle.Push(menuPopup.m_hMenu); + } + + return lRet; + } + + LRESULT OnMenuSelect(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) + { + if(!m_bAttachedMenu) // Not attached, do nothing, forward to parent + { + m_bPopupItem = (lParam != NULL) && ((HMENU)lParam != m_hMenu) && (HIWORD(wParam) & MF_POPUP); + if(m_wndParent.IsWindow()) + m_wndParent.SendMessage(uMsg, wParam, lParam); + bHandled = FALSE; + return 1; + } + + // Check if a menu is closing, do a cleanup + if(HIWORD(wParam) == 0xFFFF && lParam == NULL) // Menu closing + { +#ifdef _CMDBAR_EXTRA_TRACE + ATLTRACE2(atlTraceUI, 0, _T("CmdBar - OnMenuSelect - CLOSING!!!!\n")); +#endif + ATLASSERT(m_stackMenuWnd.GetSize() == 0); + // Restore the menu items to the previous state for all menus that were converted + if(m_bImagesVisible) + { + HMENU hMenu = NULL; + while((hMenu = m_stackMenuHandle.Pop()) != NULL) + { + CMenuHandle menuPopup = hMenu; + ATLASSERT(menuPopup.m_hMenu != NULL); + // Restore state and delete menu item data + BOOL bRet = FALSE; + for(int i = 0; i < menuPopup.GetMenuItemCount(); i++) + { + CMenuItemInfo mii; + mii.fMask = MIIM_DATA | MIIM_TYPE; + bRet = menuPopup.GetMenuItemInfo(i, TRUE, &mii); + ATLASSERT(bRet); + + _MenuItemData* pMI = (_MenuItemData*)mii.dwItemData; + if(pMI != NULL && pMI->IsCmdBarMenuItem()) + { + mii.fMask = MIIM_DATA | MIIM_TYPE | MIIM_STATE; + mii.fType = pMI->fType; + mii.dwTypeData = pMI->lpstrText; + mii.cch = lstrlen(pMI->lpstrText); + mii.dwItemData = NULL; + + bRet = menuPopup.SetMenuItemInfo(i, TRUE, &mii); + ATLASSERT(bRet); + + delete [] pMI->lpstrText; + pMI->dwMagic = 0x6666; + delete pMI; + } + } + } + } + } + + bHandled = FALSE; + return 1; + } + + LRESULT OnInternalAutoPopup(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/) + { + int nIndex = (int)wParam; + T* pT = static_cast(this); + pT->DoPopupMenu(nIndex, false); + return 0; + } + + LRESULT OnInternalGetBar(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/) + { + // Let's make sure we're not embedded in another process + if((LPVOID)wParam != NULL) + *((DWORD*)wParam) = GetCurrentProcessId(); + if(IsWindowVisible()) + return (LRESULT)static_cast(this); + else + return NULL; + } + + LRESULT OnSettingChange(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/) + { +#ifndef SPI_GETKEYBOARDCUES + const UINT SPI_SETKEYBOARDCUES = 0x100B; +#endif // !SPI_GETKEYBOARDCUES +#ifndef SPI_GETFLATMENU + const UINT SPI_SETFLATMENU = 0x1023; +#endif // !SPI_GETFLATMENU + + if(wParam == SPI_SETNONCLIENTMETRICS || wParam == SPI_SETKEYBOARDCUES || wParam == SPI_SETFLATMENU) + { + T* pT = static_cast(this); + pT->GetSystemSettings(); + } + + return 0; + } + + LRESULT OnWindowPosChanging(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) + { + LRESULT lRet = DefWindowProc(uMsg, wParam, lParam); + + LPWINDOWPOS lpWP = (LPWINDOWPOS)lParam; + int cyMin = ::GetSystemMetrics(SM_CYMENU); + if(lpWP->cy < cyMin) + lpWP->cy = cyMin; + + return lRet; + } + + LRESULT OnMenuChar(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled) + { +#ifdef _CMDBAR_EXTRA_TRACE + ATLTRACE2(atlTraceUI, 0, _T("CmdBar - OnMenuChar\n")); +#endif + bHandled = TRUE; + T* pT = static_cast(this); + + LRESULT lRet; + if(m_bMenuActive && LOWORD(wParam) != 0x0D) + lRet = 0; + else + lRet = MAKELRESULT(1, 1); + + if(m_bMenuActive && HIWORD(wParam) == MF_POPUP) + { + // Convert character to lower/uppercase and possibly Unicode, using current keyboard layout + TCHAR ch = (TCHAR)LOWORD(wParam); + CMenuHandle menu = (HMENU)lParam; + int nCount = ::GetMenuItemCount(menu); + int nRetCode = MNC_EXECUTE; + BOOL bRet = FALSE; + TCHAR szString[pT->_nMaxMenuItemTextLength]; + WORD wMnem = 0; + bool bFound = false; + for(int i = 0; i < nCount; i++) + { + CMenuItemInfo mii; + mii.cch = pT->_nMaxMenuItemTextLength; + mii.fMask = MIIM_CHECKMARKS | MIIM_DATA | MIIM_ID | MIIM_STATE | MIIM_SUBMENU | MIIM_TYPE; + mii.dwTypeData = szString; + bRet = menu.GetMenuItemInfo(i, TRUE, &mii); + if(!bRet || (mii.fType & MFT_SEPARATOR)) + continue; + _MenuItemData* pmd = (_MenuItemData*)mii.dwItemData; + if(pmd != NULL && pmd->IsCmdBarMenuItem()) + { + LPTSTR p = pmd->lpstrText; + + if(p != NULL) + { + while(*p && *p != _T('&')) + p = ::CharNext(p); + if(p != NULL && *p) + { + DWORD dwP = MAKELONG(*(++p), 0); + DWORD dwC = MAKELONG(ch, 0); + if(::CharLower((LPTSTR)ULongToPtr(dwP)) == ::CharLower((LPTSTR)ULongToPtr(dwC))) + { + if(!bFound) + { + wMnem = (WORD)i; + bFound = true; + } + else + { + nRetCode = MNC_SELECT; + break; + } + } + } + } + } + } + if(bFound) + { + if(nRetCode == MNC_EXECUTE) + { + PostMessage(TB_SETHOTITEM, (WPARAM)-1, 0L); + pT->GiveFocusBack(); + } + bHandled = TRUE; + lRet = MAKELRESULT(wMnem, nRetCode); + } + } + else if(!m_bMenuActive) + { + int nBtn = 0; + if(!MapAccelerator((TCHAR)LOWORD(wParam), nBtn)) + { + bHandled = FALSE; + PostMessage(TB_SETHOTITEM, (WPARAM)-1, 0L); + pT->GiveFocusBack(); + +#if (_WIN32_IE >= 0x0500) + // check if we should display chevron menu + if((TCHAR)LOWORD(wParam) == pT->_chChevronShortcut) + { + if(pT->DisplayChevronMenu()) + bHandled = TRUE; + } +#endif // (_WIN32_IE >= 0x0500) + } + else if(m_wndParent.IsWindowEnabled()) + { +#if (_WIN32_IE >= 0x0500) + RECT rcClient = { 0 }; + GetClientRect(&rcClient); + RECT rcBtn = { 0 }; + GetItemRect(nBtn, &rcBtn); + TBBUTTON tbb = { 0 }; + GetButton(nBtn, &tbb); + if((tbb.fsState & TBSTATE_ENABLED) != 0 && (tbb.fsState & TBSTATE_HIDDEN) == 0 && rcBtn.right <= rcClient.right) + { +#endif // (_WIN32_IE >= 0x0500) + if(m_bUseKeyboardCues && !m_bShowKeyboardCues) + { + m_bAllowKeyboardCues = true; + ShowKeyboardCues(true); + } + pT->TakeFocus(); + PostMessage(WM_KEYDOWN, VK_DOWN, 0L); + SetHotItem(nBtn); +#if (_WIN32_IE >= 0x0500) + } + else + { + ::MessageBeep(0); + } +#endif // (_WIN32_IE >= 0x0500) + } + } + + return lRet; + } + + LRESULT OnDrawItem(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled) + { + LPDRAWITEMSTRUCT lpDrawItemStruct = (LPDRAWITEMSTRUCT)lParam; + _MenuItemData* pmd = (_MenuItemData*)lpDrawItemStruct->itemData; + if(lpDrawItemStruct->CtlType == ODT_MENU && pmd != NULL && pmd->IsCmdBarMenuItem()) + { + T* pT = static_cast(this); + pT->DrawItem(lpDrawItemStruct); + } + else + { + bHandled = FALSE; + } + return (LRESULT)TRUE; + } + + LRESULT OnMeasureItem(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled) + { + LPMEASUREITEMSTRUCT lpMeasureItemStruct = (LPMEASUREITEMSTRUCT)lParam; + _MenuItemData* pmd = (_MenuItemData*)lpMeasureItemStruct->itemData; + if(lpMeasureItemStruct->CtlType == ODT_MENU && pmd != NULL && pmd->IsCmdBarMenuItem()) + { + T* pT = static_cast(this); + pT->MeasureItem(lpMeasureItemStruct); + } + else + { + bHandled = FALSE; + } + return (LRESULT)TRUE; + } + +// API message handlers + LRESULT OnAPIGetMenu(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) + { + return (LRESULT)m_hMenu; + } + + LRESULT OnAPITrackPopupMenu(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/) + { + if(lParam == NULL) + return FALSE; + LPCBRPOPUPMENU lpCBRPopupMenu = (LPCBRPOPUPMENU)lParam; + if(lpCBRPopupMenu->cbSize != sizeof(CBRPOPUPMENU)) + return FALSE; + + T* pT = static_cast(this); + return pT->TrackPopupMenu(lpCBRPopupMenu->hMenu, lpCBRPopupMenu->uFlags, lpCBRPopupMenu->x, lpCBRPopupMenu->y, lpCBRPopupMenu->lptpm); + } + + LRESULT OnAPIGetCmdBar(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) + { + return (LRESULT)m_hWnd; + } + +// Parent window message handlers + LRESULT OnParentHotItemChange(int /*idCtrl*/, LPNMHDR pnmh, BOOL& bHandled) + { + LPNMTBHOTITEM lpNMHT = (LPNMTBHOTITEM)pnmh; + + // Check if this comes from us + if(pnmh->hwndFrom != m_hWnd) + { + bHandled = FALSE; + return 0; + } + + bool bBlockTracking = false; + if((m_dwExtendedStyle & CBR_EX_TRACKALWAYS) == 0) + { + DWORD dwProcessID; + ::GetWindowThreadProcessId(::GetActiveWindow(), &dwProcessID); + bBlockTracking = (::GetCurrentProcessId() != dwProcessID); + } + + if((!m_wndParent.IsWindowEnabled() || bBlockTracking) && (lpNMHT->dwFlags & HICF_MOUSE)) + { + return 1; + } + else + { +#ifndef HICF_LMOUSE + const DWORD HICF_LMOUSE = 0x00000080; // left mouse button selected +#endif + bHandled = FALSE; + + // Send WM_MENUSELECT to the app if it needs to display a status text + if(!(lpNMHT->dwFlags & HICF_MOUSE) + && !(lpNMHT->dwFlags & HICF_ACCELERATOR) + && !(lpNMHT->dwFlags & HICF_LMOUSE)) + { + if(lpNMHT->dwFlags & HICF_ENTERING) + m_wndParent.SendMessage(WM_MENUSELECT, 0, (LPARAM)m_hMenu); + if(lpNMHT->dwFlags & HICF_LEAVING) + m_wndParent.SendMessage(WM_MENUSELECT, MAKEWPARAM(0, 0xFFFF), NULL); + } + + return 0; + } + } + + LRESULT OnParentDropDown(int /*idCtrl*/, LPNMHDR pnmh, BOOL& bHandled) + { + // Check if this comes from us + if(pnmh->hwndFrom != m_hWnd) + { + bHandled = FALSE; + return 1; + } + + T* pT = static_cast(this); + if(::GetFocus() != m_hWnd) + pT->TakeFocus(); + LPNMTOOLBAR pNMToolBar = (LPNMTOOLBAR)pnmh; + int nIndex = CommandToIndex(pNMToolBar->iItem); + m_bContextMenu = false; + m_bEscapePressed = false; + pT->DoPopupMenu(nIndex, true); + + return TBDDRET_DEFAULT; + } + + LRESULT OnParentInitMenuPopup(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) + { + return OnInitMenuPopup(uMsg, wParam, lParam, bHandled); + } + + LRESULT OnParentInternalGetBar(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) + { + return OnInternalGetBar(uMsg, wParam, lParam, bHandled); + } + + LRESULT OnParentSysCommand(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) + { + bHandled = FALSE; + if((m_uSysKey == VK_MENU + || (m_uSysKey == VK_F10 && !(::GetKeyState(VK_SHIFT) & 0x80)) + || m_uSysKey == VK_SPACE) + && wParam == SC_KEYMENU) + { + T* pT = static_cast(this); + if(::GetFocus() == m_hWnd) + { + pT->GiveFocusBack(); // exit menu "loop" + PostMessage(TB_SETHOTITEM, (WPARAM)-1, 0L); + } + else if(m_uSysKey != VK_SPACE && !m_bSkipMsg) + { + if(m_bUseKeyboardCues && !m_bShowKeyboardCues && m_bAllowKeyboardCues) + ShowKeyboardCues(true); + + pT->TakeFocus(); // enter menu "loop" + bHandled = TRUE; + } + else if(m_uSysKey != VK_SPACE) + { + bHandled = TRUE; + } + } + m_bSkipMsg = false; + return 0; + } + + LRESULT OnParentAPIGetMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) + { + return OnAPIGetMenu(uMsg, wParam, lParam, bHandled); + } + + LRESULT OnParentMenuChar(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) + { + return OnMenuChar(uMsg, wParam, lParam, bHandled); + } + + LRESULT OnParentAPITrackPopupMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) + { + return OnAPITrackPopupMenu(uMsg, wParam, lParam, bHandled); + } + + LRESULT OnParentAPIGetCmdBar(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) + { + return OnAPIGetCmdBar(uMsg, wParam, lParam, bHandled); + } + + LRESULT OnParentSettingChange(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) + { + OnSettingChange(uMsg, wParam, lParam, bHandled); + bHandled = FALSE; + return 1; + } + + LRESULT OnParentDrawItem(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) + { + return OnDrawItem(uMsg, wParam, lParam, bHandled); + } + + LRESULT OnParentMeasureItem(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) + { + return OnMeasureItem(uMsg, wParam, lParam, bHandled); + } + + LRESULT OnParentActivate(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) + { + m_bParentActive = (LOWORD(wParam) != WA_INACTIVE); + if(!m_bParentActive && m_bUseKeyboardCues && m_bShowKeyboardCues) + { + ShowKeyboardCues(false); // this will repaint our window + } + else + { + Invalidate(); + UpdateWindow(); + } + bHandled = FALSE; + return 1; + } + + LRESULT OnParentCustomDraw(int /*idCtrl*/, LPNMHDR pnmh, BOOL& bHandled) + { + LRESULT lRet = CDRF_DODEFAULT; + bHandled = FALSE; + if(pnmh->hwndFrom == m_hWnd) + { + LPNMTBCUSTOMDRAW lpTBCustomDraw = (LPNMTBCUSTOMDRAW)pnmh; + if(lpTBCustomDraw->nmcd.dwDrawStage == CDDS_PREPAINT) + { + lRet = CDRF_NOTIFYITEMDRAW; + bHandled = TRUE; + } + else if(lpTBCustomDraw->nmcd.dwDrawStage == CDDS_ITEMPREPAINT) + { + if(m_bFlatMenus) + { +#ifndef COLOR_MENUHILIGHT + const int COLOR_MENUHILIGHT = 29; +#endif // !COLOR_MENUHILIGHT + bool bDisabled = ((lpTBCustomDraw->nmcd.uItemState & CDIS_DISABLED) == CDIS_DISABLED); + if(!bDisabled && ((lpTBCustomDraw->nmcd.uItemState & CDIS_HOT) == CDIS_HOT || + (lpTBCustomDraw->nmcd.uItemState & CDIS_SELECTED) == CDIS_SELECTED)) + { + ::FillRect(lpTBCustomDraw->nmcd.hdc, &lpTBCustomDraw->nmcd.rc, ::GetSysColorBrush(COLOR_MENUHILIGHT)); + ::FrameRect(lpTBCustomDraw->nmcd.hdc, &lpTBCustomDraw->nmcd.rc, ::GetSysColorBrush(COLOR_HIGHLIGHT)); + lpTBCustomDraw->clrText = ::GetSysColor(m_bParentActive ? COLOR_HIGHLIGHTTEXT : COLOR_GRAYTEXT); + } + else if(bDisabled || !m_bParentActive) + { + lpTBCustomDraw->clrText = ::GetSysColor(COLOR_GRAYTEXT); + } + CDCHandle dc = lpTBCustomDraw->nmcd.hdc; + dc.SetTextColor(lpTBCustomDraw->clrText); + dc.SetBkMode(lpTBCustomDraw->nStringBkMode); + HFONT hFont = GetFont(); + HFONT hFontOld = NULL; + if(hFont != NULL) + hFontOld = dc.SelectFont(hFont); + const int cchText = 200; + TCHAR szText[cchText] = { 0 }; + TBBUTTONINFO tbbi = { 0 }; + tbbi.cbSize = sizeof(TBBUTTONINFO); + tbbi.dwMask = TBIF_TEXT; + tbbi.pszText = szText; + tbbi.cchText = cchText; + GetButtonInfo((int)lpTBCustomDraw->nmcd.dwItemSpec, &tbbi); + dc.DrawText(szText, -1, &lpTBCustomDraw->nmcd.rc, DT_SINGLELINE | DT_CENTER | DT_VCENTER | (m_bShowKeyboardCues ? 0 : DT_HIDEPREFIX)); + if(hFont != NULL) + dc.SelectFont(hFontOld); + lRet = CDRF_SKIPDEFAULT; + bHandled = TRUE; + } + else if(!m_bParentActive) + { + lpTBCustomDraw->clrText = ::GetSysColor(COLOR_GRAYTEXT); + bHandled = TRUE; + } + } + } + return lRet; + } + +// Message hook handlers + LRESULT OnHookMouseMove(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) + { + static POINT s_point = { -1, -1 }; + DWORD dwPoint = ::GetMessagePos(); + POINT point = { GET_X_LPARAM(dwPoint), GET_Y_LPARAM(dwPoint) }; + + bHandled = FALSE; + if(m_bMenuActive) + { + if(::WindowFromPoint(point) == m_hWnd) + { + ScreenToClient(&point); + int nHit = HitTest(&point); + + if((point.x != s_point.x || point.y != s_point.y) && nHit >= 0 && nHit < ::GetMenuItemCount(m_hMenu) && nHit != m_nPopBtn && m_nPopBtn != -1) + { + TBBUTTON tbb = { 0 }; + GetButton(nHit, &tbb); + if((tbb.fsState & TBSTATE_ENABLED) != 0) + { + m_nNextPopBtn = nHit | 0xFFFF0000; + HWND hWndMenu = m_stackMenuWnd.GetCurrent(); + ATLASSERT(hWndMenu != NULL); + + // this one is needed to close a menu if mouse button was down + ::PostMessage(hWndMenu, WM_LBUTTONUP, 0, MAKELPARAM(point.x, point.y)); + // this one closes a popup menu + ::PostMessage(hWndMenu, WM_KEYDOWN, VK_ESCAPE, 0L); + + bHandled = TRUE; + } + } + } + } + else + { + ScreenToClient(&point); + } + + s_point = point; + return 0; + } + + LRESULT OnHookSysKeyDown(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) + { + bHandled = FALSE; +#ifdef _CMDBAR_EXTRA_TRACE + ATLTRACE2(atlTraceUI, 0, _T("CmdBar - Hook WM_SYSKEYDOWN (0x%2.2X)\n"), wParam); +#endif + + if(wParam == VK_MENU && m_bParentActive && m_bUseKeyboardCues && !m_bShowKeyboardCues && m_bAllowKeyboardCues) + ShowKeyboardCues(true); + + if(wParam != VK_SPACE && !m_bMenuActive && ::GetFocus() == m_hWnd) + { + m_bAllowKeyboardCues = false; + PostMessage(TB_SETHOTITEM, (WPARAM)-1, 0L); + T* pT = static_cast(this); + pT->GiveFocusBack(); + m_bSkipMsg = true; + } + else + { + if(wParam == VK_SPACE && m_bUseKeyboardCues && m_bShowKeyboardCues) + { + m_bAllowKeyboardCues = true; + ShowKeyboardCues(false); + } + m_uSysKey = (UINT)wParam; + } + return 0; + } + + LRESULT OnHookSysKeyUp(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) + { + if(!m_bAllowKeyboardCues) + m_bAllowKeyboardCues = true; + bHandled = FALSE; + wParam; +#ifdef _CMDBAR_EXTRA_TRACE + ATLTRACE2(atlTraceUI, 0, _T("CmdBar - Hook WM_SYSKEYUP (0x%2.2X)\n"), wParam); +#endif + return 0; + } + + LRESULT OnHookSysChar(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) + { + bHandled = FALSE; +#ifdef _CMDBAR_EXTRA_TRACE + ATLTRACE2(atlTraceUI, 0, _T("CmdBar - Hook WM_SYSCHAR (0x%2.2X)\n"), wParam); +#endif + + if(!m_bMenuActive && m_hWndHook != m_hWnd && wParam != VK_SPACE) + bHandled = TRUE; + return 0; + } + + LRESULT OnHookKeyDown(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) + { +#ifdef _CMDBAR_EXTRA_TRACE + ATLTRACE2(atlTraceUI, 0, _T("CmdBar - Hook WM_KEYDOWN (0x%2.2X)\n"), wParam); +#endif + bHandled = FALSE; + T* pT = static_cast(this); + + if(wParam == VK_ESCAPE && m_stackMenuWnd.GetSize() <= 1) + { + if(m_bMenuActive && !m_bContextMenu) + { + int nHot = GetHotItem(); + if(nHot == -1) + nHot = m_nPopBtn; + if(nHot == -1) + nHot = 0; + SetHotItem(nHot); + bHandled = TRUE; + pT->TakeFocus(); + m_bEscapePressed = true; // To keep focus + m_bSkipPostDown = false; + } + else if(::GetFocus() == m_hWnd && m_wndParent.IsWindow()) + { + SetHotItem(-1); + pT->GiveFocusBack(); + bHandled = TRUE; + } + } + else if(wParam == VK_RETURN || wParam == VK_UP || wParam == VK_DOWN) + { + if(!m_bMenuActive && ::GetFocus() == m_hWnd && m_wndParent.IsWindow()) + { + int nHot = GetHotItem(); + if(nHot != -1) + { + if(wParam != VK_RETURN) + { + if(!m_bSkipPostDown) + { +// IE4 only: WM_KEYDOWN doesn't generate TBN_DROPDOWN, we need to simulate a mouse click +#if (_WIN32_IE < 0x0500) + DWORD dwMajor = 0, dwMinor = 0; + ATL::AtlGetCommCtrlVersion(&dwMajor, &dwMinor); + if(dwMajor <= 4 || (dwMajor == 5 && dwMinor < 80)) + { + RECT rect; + GetItemRect(nHot, &rect); + PostMessage(WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(rect.left, rect.top)); + } +#endif // (_WIN32_IE < 0x0500) + PostMessage(WM_KEYDOWN, VK_DOWN, 0L); + m_bSkipPostDown = true; + } + else + { + ATLTRACE2(atlTraceUI, 0, _T("CmdBar - skipping posting another VK_DOWN\n")); + m_bSkipPostDown = false; + } + } + } + else + { + ATLTRACE2(atlTraceUI, 0, _T("CmdBar - Can't find hot button\n")); + } + } + if(wParam == VK_RETURN && m_bMenuActive) + { + PostMessage(TB_SETHOTITEM, (WPARAM)-1, 0L); + m_nNextPopBtn = -1; + pT->GiveFocusBack(); + } + } + else if(wParam == VK_LEFT || wParam == VK_RIGHT) + { + WPARAM wpNext = m_bLayoutRTL ? VK_LEFT : VK_RIGHT; + WPARAM wpPrev = m_bLayoutRTL ? VK_RIGHT : VK_LEFT; + + if(m_bMenuActive && !m_bContextMenu && !(wParam == wpNext && m_bPopupItem)) + { + bool bAction = false; + if(wParam == wpPrev && s_pCurrentBar->m_stackMenuWnd.GetSize() == 1) + { + m_nNextPopBtn = pT->GetPreviousMenuItem(m_nPopBtn); + if(m_nNextPopBtn != -1) + bAction = true; + } + else if(wParam == wpNext) + { + m_nNextPopBtn = pT->GetNextMenuItem(m_nPopBtn); + if(m_nNextPopBtn != -1) + bAction = true; + } + HWND hWndMenu = m_stackMenuWnd.GetCurrent(); + ATLASSERT(hWndMenu != NULL); + + // Close the popup menu + if(bAction) + { + ::PostMessage(hWndMenu, WM_KEYDOWN, VK_ESCAPE, 0L); + if(wParam == wpNext) + { + int cItem = m_stackMenuWnd.GetSize() - 1; + while(cItem >= 0) + { + hWndMenu = m_stackMenuWnd[cItem]; + if(hWndMenu != NULL) + ::PostMessage(hWndMenu, WM_KEYDOWN, VK_ESCAPE, 0L); + cItem--; + } + } +#if (_WIN32_IE >= 0x0500) + if(m_nNextPopBtn == -2) + { + m_nNextPopBtn = -1; + pT->DisplayChevronMenu(); + } +#endif // (_WIN32_IE >= 0x0500) + bHandled = TRUE; + } + } + } + return 0; + } + + LRESULT OnHookNextMenu(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) + { +#ifdef _CMDBAR_EXTRA_TRACE + ATLTRACE2(atlTraceUI, 0, _T("CmdBar - Hook WM_NEXTMENU\n")); +#endif + bHandled = FALSE; + return 1; + } + + LRESULT OnHookChar(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) + { +#ifdef _CMDBAR_EXTRA_TRACE + ATLTRACE2(atlTraceUI, 0, _T("CmdBar - Hook WM_CHAR (0x%2.2X)\n"), wParam); +#endif + bHandled = (wParam == VK_ESCAPE); + return 0; + } + +// Implementation - ownerdraw overrideables and helpers + void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) + { + T* pT = static_cast(this); + if(m_bFlatMenus) + pT->DrawItemFlat(lpDrawItemStruct); + else + pT->DrawItem3D(lpDrawItemStruct); + + } + + void DrawItem3D(LPDRAWITEMSTRUCT lpDrawItemStruct) + { + _MenuItemData* pmd = (_MenuItemData*)lpDrawItemStruct->itemData; + CDCHandle dc = lpDrawItemStruct->hDC; + const RECT& rcItem = lpDrawItemStruct->rcItem; + T* pT = static_cast(this); + + if(pmd->fType & MFT_SEPARATOR) + { + // draw separator + RECT rc = rcItem; + rc.top += (rc.bottom - rc.top) / 2; // vertical center + dc.DrawEdge(&rc, EDGE_ETCHED, BF_TOP); // draw separator line + } + else // not a separator + { + BOOL bDisabled = lpDrawItemStruct->itemState & ODS_GRAYED; + BOOL bSelected = lpDrawItemStruct->itemState & ODS_SELECTED; + BOOL bChecked = lpDrawItemStruct->itemState & ODS_CHECKED; + BOOL bHasImage = FALSE; + + if(LOWORD(lpDrawItemStruct->itemID) == (WORD)-1) + bSelected = FALSE; + RECT rcButn = { rcItem.left, rcItem.top, rcItem.left + m_szButton.cx, rcItem.top + m_szButton.cy }; // button rect + ::OffsetRect(&rcButn, 0, ((rcItem.bottom - rcItem.top) - (rcButn.bottom - rcButn.top)) / 2); // center vertically + + int iButton = pmd->iButton; + if(iButton >= 0) + { + bHasImage = TRUE; + + // calc drawing point + SIZE sz = { rcButn.right - rcButn.left - m_szBitmap.cx, rcButn.bottom - rcButn.top - m_szBitmap.cy }; + sz.cx /= 2; + sz.cy /= 2; + POINT point = { rcButn.left + sz.cx, rcButn.top + sz.cy }; + + // fill background depending on state + if(!bChecked || (bSelected && !bDisabled)) + { + if(!bDisabled) + dc.FillRect(&rcButn, (bChecked && !bSelected) ? COLOR_3DLIGHT : COLOR_MENU); + else + dc.FillRect(&rcButn, COLOR_MENU); + } + else + { + COLORREF crTxt = dc.SetTextColor(::GetSysColor(COLOR_BTNFACE)); + COLORREF crBk = dc.SetBkColor(::GetSysColor(COLOR_BTNHILIGHT)); + CBrush hbr(CDCHandle::GetHalftoneBrush()); + dc.SetBrushOrg(rcButn.left, rcButn.top); + dc.FillRect(&rcButn, hbr); + dc.SetTextColor(crTxt); + dc.SetBkColor(crBk); + } + + // draw disabled or normal + if(!bDisabled) + { + // draw pushed-in or popped-out edge + if(bSelected || bChecked) + { + RECT rc2 = rcButn; + dc.DrawEdge(&rc2, bChecked ? BDR_SUNKENOUTER : BDR_RAISEDINNER, BF_RECT); + } + // draw the image + ::ImageList_Draw(m_hImageList, iButton, dc, point.x, point.y, ILD_TRANSPARENT); + } + else + { + HBRUSH hBrushBackground = bChecked ? NULL : ::GetSysColorBrush(COLOR_MENU); + pT->DrawBitmapDisabled(dc, iButton, point, hBrushBackground); + } + } + else + { + // no image - look for custom checked/unchecked bitmaps + CMenuItemInfo info; + info.fMask = MIIM_CHECKMARKS | MIIM_TYPE; + ::GetMenuItemInfo((HMENU)lpDrawItemStruct->hwndItem, lpDrawItemStruct->itemID, MF_BYCOMMAND, &info); + if(bChecked || info.hbmpUnchecked != NULL) + { + BOOL bRadio = ((info.fType & MFT_RADIOCHECK) != 0); + bHasImage = pT->DrawCheckmark(dc, rcButn, bSelected, bDisabled, bRadio, bChecked ? info.hbmpChecked : info.hbmpUnchecked); + } + } + + // draw item text + int cxButn = m_szButton.cx; + COLORREF colorBG = ::GetSysColor(bSelected ? COLOR_HIGHLIGHT : COLOR_MENU); + if(bSelected || lpDrawItemStruct->itemAction == ODA_SELECT) + { + RECT rcBG = rcItem; + if(bHasImage) + rcBG.left += cxButn + s_kcxGap; + dc.FillRect(&rcBG, bSelected ? COLOR_HIGHLIGHT : COLOR_MENU); + } + + // calc text rectangle and colors + RECT rcText = rcItem; + rcText.left += cxButn + s_kcxGap + s_kcxTextMargin; + rcText.right -= cxButn; + dc.SetBkMode(TRANSPARENT); + COLORREF colorText = ::GetSysColor(bDisabled ? (bSelected ? COLOR_GRAYTEXT : COLOR_3DSHADOW) : (bSelected ? COLOR_HIGHLIGHTTEXT : COLOR_MENUTEXT)); + + // font already selected by Windows + if(bDisabled && (!bSelected || colorText == colorBG)) + { + // disabled - draw shadow text shifted down and right 1 pixel (unles selected) + RECT rcDisabled = rcText; + ::OffsetRect(&rcDisabled, 1, 1); + pT->DrawMenuText(dc, rcDisabled, pmd->lpstrText, ::GetSysColor(COLOR_3DHILIGHT)); + } + pT->DrawMenuText(dc, rcText, pmd->lpstrText, colorText); // finally! + } + } + + void DrawItemFlat(LPDRAWITEMSTRUCT lpDrawItemStruct) + { + _MenuItemData* pmd = (_MenuItemData*)lpDrawItemStruct->itemData; + CDCHandle dc = lpDrawItemStruct->hDC; + const RECT& rcItem = lpDrawItemStruct->rcItem; + T* pT = static_cast(this); + +#ifndef COLOR_MENUHILIGHT + const int COLOR_MENUHILIGHT = 29; +#endif // !COLOR_MENUHILIGHT + + BOOL bDisabled = lpDrawItemStruct->itemState & ODS_GRAYED; + BOOL bSelected = lpDrawItemStruct->itemState & ODS_SELECTED; + BOOL bChecked = lpDrawItemStruct->itemState & ODS_CHECKED; + + // paint background + if(bSelected || lpDrawItemStruct->itemAction == ODA_SELECT) + { + if(bSelected) + { + dc.FillRect(&rcItem, ::GetSysColorBrush(COLOR_MENUHILIGHT)); + dc.FrameRect(&rcItem, ::GetSysColorBrush(COLOR_HIGHLIGHT)); + } + else + { + dc.FillRect(&rcItem, ::GetSysColorBrush(COLOR_MENU)); + } + } + + if(pmd->fType & MFT_SEPARATOR) + { + // draw separator + RECT rc = rcItem; + rc.top += (rc.bottom - rc.top) / 2; // vertical center + dc.DrawEdge(&rc, EDGE_ETCHED, BF_TOP); // draw separator line + } + else // not a separator + { + if(LOWORD(lpDrawItemStruct->itemID) == (WORD)-1) + bSelected = FALSE; + RECT rcButn = { rcItem.left, rcItem.top, rcItem.left + m_szButton.cx, rcItem.top + m_szButton.cy }; // button rect + ::OffsetRect(&rcButn, 0, ((rcItem.bottom - rcItem.top) - (rcButn.bottom - rcButn.top)) / 2); // center vertically + + // draw background and border for checked items + if(bChecked) + { + RECT rcCheck = rcButn; + ::InflateRect(&rcCheck, -1, -1); + if(bSelected) + dc.FillRect(&rcCheck, ::GetSysColorBrush(COLOR_MENU)); + dc.FrameRect(&rcCheck, ::GetSysColorBrush(COLOR_HIGHLIGHT)); + } + + int iButton = pmd->iButton; + if(iButton >= 0) + { + // calc drawing point + SIZE sz = { rcButn.right - rcButn.left - m_szBitmap.cx, rcButn.bottom - rcButn.top - m_szBitmap.cy }; + sz.cx /= 2; + sz.cy /= 2; + POINT point = { rcButn.left + sz.cx, rcButn.top + sz.cy }; + + // draw disabled or normal + if(!bDisabled) + { + ::ImageList_Draw(m_hImageList, iButton, dc, point.x, point.y, ILD_TRANSPARENT); + } + else + { + HBRUSH hBrushBackground = ::GetSysColorBrush((bSelected && !(bDisabled && bChecked)) ? COLOR_MENUHILIGHT : COLOR_MENU); + HBRUSH hBrushDisabledImage = ::GetSysColorBrush(COLOR_3DSHADOW); + pT->DrawBitmapDisabled(dc, iButton, point, hBrushBackground, hBrushBackground, hBrushDisabledImage); + } + } + else + { + // no image - look for custom checked/unchecked bitmaps + CMenuItemInfo info; + info.fMask = MIIM_CHECKMARKS | MIIM_TYPE; + ::GetMenuItemInfo((HMENU)lpDrawItemStruct->hwndItem, lpDrawItemStruct->itemID, MF_BYCOMMAND, &info); + if(bChecked || info.hbmpUnchecked != NULL) + { + BOOL bRadio = ((info.fType & MFT_RADIOCHECK) != 0); + pT->DrawCheckmark(dc, rcButn, bSelected, bDisabled, bRadio, bChecked ? info.hbmpChecked : info.hbmpUnchecked); + } + } + + // draw item text + int cxButn = m_szButton.cx; + // calc text rectangle and colors + RECT rcText = rcItem; + rcText.left += cxButn + s_kcxGap + s_kcxTextMargin; + rcText.right -= cxButn; + dc.SetBkMode(TRANSPARENT); + COLORREF colorText = ::GetSysColor(bDisabled ? (bSelected ? COLOR_GRAYTEXT : COLOR_3DSHADOW) : (bSelected ? COLOR_HIGHLIGHTTEXT : COLOR_MENUTEXT)); + + pT->DrawMenuText(dc, rcText, pmd->lpstrText, colorText); // finally! + } + } + + void DrawMenuText(CDCHandle& dc, RECT& rc, LPCTSTR lpstrText, COLORREF color) + { + int nTab = -1; + for(int i = 0; i < lstrlen(lpstrText); i++) + { + if(lpstrText[i] == _T('\t')) + { + nTab = i; + break; + } + } + dc.SetTextColor(color); + dc.DrawText(lpstrText, nTab, &rc, DT_SINGLELINE | DT_LEFT | DT_VCENTER | (m_bShowKeyboardCues ? 0 : DT_HIDEPREFIX)); + if(nTab != -1) + dc.DrawText(&lpstrText[nTab + 1], -1, &rc, DT_SINGLELINE | DT_RIGHT | DT_VCENTER | (m_bShowKeyboardCues ? 0 : DT_HIDEPREFIX)); + } + + void DrawBitmapDisabled(CDCHandle& dc, int nImage, POINT point, + HBRUSH hBrushBackground = ::GetSysColorBrush(COLOR_3DFACE), + HBRUSH hBrush3DEffect = ::GetSysColorBrush(COLOR_3DHILIGHT), + HBRUSH hBrushDisabledImage = ::GetSysColorBrush(COLOR_3DSHADOW)) + { +#if (_WIN32_WINNT >= 0x0501) && (_WIN32_IE >= 0x0501) + if(m_bAlphaImages) + { + IMAGELISTDRAWPARAMS ildp = { 0 }; + ildp.cbSize = sizeof(IMAGELISTDRAWPARAMS); + ildp.himl = m_hImageList; + ildp.i = nImage; + ildp.hdcDst = dc; + ildp.x = point.x; + ildp.y = point.y; + ildp.cx = 0; + ildp.cy = 0; + ildp.xBitmap = 0; + ildp.yBitmap = 0; + ildp.fStyle = ILD_TRANSPARENT; + ildp.fState = ILS_SATURATE; + ildp.Frame = 0; + ::ImageList_DrawIndirect(&ildp); + } + else +#endif // (_WIN32_WINNT >= 0x0501) && (_WIN32_IE >= 0x0501) + { + // create memory DC + CDC dcMem; + dcMem.CreateCompatibleDC(dc); + // create mono or color bitmap + CBitmap bmp; + bmp.CreateCompatibleBitmap(dc, m_szBitmap.cx, m_szBitmap.cy); + ATLASSERT(bmp.m_hBitmap != NULL); + // draw image into memory DC--fill BG white first + HBITMAP hBmpOld = dcMem.SelectBitmap(bmp); + dcMem.PatBlt(0, 0, m_szBitmap.cx, m_szBitmap.cy, WHITENESS); + // If white is the text color, we can't use the normal painting since + // it would blend with the WHITENESS, but the mask is OK + UINT uDrawStyle = (::GetSysColor(COLOR_BTNTEXT) == RGB(255, 255, 255)) ? ILD_MASK : ILD_NORMAL; + ::ImageList_Draw(m_hImageList, nImage, dcMem, 0, 0, uDrawStyle); + dc.DitherBlt(point.x, point.y, m_szBitmap.cx, m_szBitmap.cy, dcMem, NULL, 0, 0, hBrushBackground, hBrush3DEffect, hBrushDisabledImage); + dcMem.SelectBitmap(hBmpOld); // restore + } + } + + // old name + BOOL Draw3DCheckmark(CDCHandle& dc, const RECT& rc, BOOL bSelected, BOOL bDisabled, BOOL bRadio, HBITMAP hBmpCheck) + { + return DrawCheckmark(dc, rc, bSelected, bDisabled, bRadio, hBmpCheck); + } + + BOOL DrawCheckmark(CDCHandle& dc, const RECT& rc, BOOL bSelected, BOOL bDisabled, BOOL bRadio, HBITMAP hBmpCheck) + { + // get checkmark bitmap, if none, use Windows standard + SIZE size = { 0, 0 }; + CBitmapHandle bmp = hBmpCheck; + if(hBmpCheck != NULL) + { + bmp.GetSize(size); + } + else + { + size.cx = ::GetSystemMetrics(SM_CXMENUCHECK); + size.cy = ::GetSystemMetrics(SM_CYMENUCHECK); + bmp.CreateCompatibleBitmap(dc, size.cx, size.cy); + ATLASSERT(bmp.m_hBitmap != NULL); + } + // center bitmap in caller's rectangle + RECT rcDest = rc; + if((rc.right - rc.left) > size.cx) + { + rcDest.left = rc.left + (rc.right - rc.left - size.cx) / 2; + rcDest.right = rcDest.left + size.cx; + } + if((rc.bottom - rc.top) > size.cy) + { + rcDest.top = rc.top + (rc.bottom - rc.top - size.cy) / 2; + rcDest.bottom = rcDest.top + size.cy; + } + // paint background + if(!m_bFlatMenus) + { + if(bSelected && !bDisabled) + { + dc.FillRect(&rcDest, COLOR_MENU); + } + else + { + COLORREF clrTextOld = dc.SetTextColor(::GetSysColor(COLOR_BTNFACE)); + COLORREF clrBkOld = dc.SetBkColor(::GetSysColor(COLOR_BTNHILIGHT)); + CBrush hbr(CDCHandle::GetHalftoneBrush()); + dc.SetBrushOrg(rcDest.left, rcDest.top); + dc.FillRect(&rcDest, hbr); + dc.SetTextColor(clrTextOld); + dc.SetBkColor(clrBkOld); + } + } + + // create source image + CDC dcSource; + dcSource.CreateCompatibleDC(dc); + HBITMAP hBmpOld = dcSource.SelectBitmap(bmp); + // set colors + const COLORREF clrBlack = RGB(0, 0, 0); + const COLORREF clrWhite = RGB(255, 255, 255); + COLORREF clrTextOld = dc.SetTextColor(clrBlack); + COLORREF clrBkOld = dc.SetBkColor(clrWhite); + // create mask + CDC dcMask; + dcMask.CreateCompatibleDC(dc); + CBitmap bmpMask; + bmpMask.CreateBitmap(size.cx, size.cy, 1, 1, NULL); + HBITMAP hBmpOld1 = dcMask.SelectBitmap(bmpMask); + + // draw the checkmark transparently + int cx = rcDest.right - rcDest.left; + int cy = rcDest.bottom - rcDest.top; + if(hBmpCheck != NULL) + { + // build mask based on transparent color + dcSource.SetBkColor(m_clrMask); + dcMask.SetBkColor(clrBlack); + dcMask.SetTextColor(clrWhite); + dcMask.BitBlt(0, 0, size.cx, size.cy, dcSource, 0, 0, SRCCOPY); + // draw bitmap using the mask + dc.BitBlt(rcDest.left, rcDest.top, cx, cy, dcSource, 0, 0, SRCINVERT); + dc.BitBlt(rcDest.left, rcDest.top, cx, cy, dcMask, 0, 0, SRCAND); + dc.BitBlt(rcDest.left, rcDest.top, cx, cy, dcSource, 0, 0, SRCINVERT); + } + else + { + const DWORD ROP_DSno = 0x00BB0226L; + const DWORD ROP_DSa = 0x008800C6L; + const DWORD ROP_DSo = 0x00EE0086L; + const DWORD ROP_DSna = 0x00220326L; + + // draw mask + RECT rcSource = { 0, 0, min(size.cx, rc.right - rc.left), min(size.cy, rc.bottom - rc.top) }; + dcMask.DrawFrameControl(&rcSource, DFC_MENU, bRadio ? DFCS_MENUBULLET : DFCS_MENUCHECK); + + // draw shadow if disabled + if(!m_bFlatMenus && bDisabled) + { + // offset by one pixel + int x = rcDest.left + 1; + int y = rcDest.top + 1; + // paint source bitmap + const int nColor = COLOR_3DHILIGHT; + dcSource.FillRect(&rcSource, nColor); + // draw checkmark - special case black and white colors + COLORREF clrCheck = ::GetSysColor(nColor); + if(clrCheck == clrWhite) + { + dc.BitBlt(x, y, cx, cy, dcMask, 0, 0, ROP_DSno); + dc.BitBlt(x, y, cx, cy, dcSource, 0, 0, ROP_DSa); + } + else + { + if(clrCheck != clrBlack) + { + ATLASSERT(dcSource.GetTextColor() == clrBlack); + ATLASSERT(dcSource.GetBkColor() == clrWhite); + dcSource.BitBlt(0, 0, size.cx, size.cy, dcMask, 0, 0, ROP_DSna); + } + dc.BitBlt(x, y, cx, cy, dcMask, 0, 0, ROP_DSa); + dc.BitBlt(x, y, cx, cy, dcSource, 0, 0, ROP_DSo); + } + } + + // paint source bitmap + const int nColor = bDisabled ? COLOR_BTNSHADOW : COLOR_MENUTEXT; + dcSource.FillRect(&rcSource, nColor); + // draw checkmark - special case black and white colors + COLORREF clrCheck = ::GetSysColor(nColor); + if(clrCheck == clrWhite) + { + dc.BitBlt(rcDest.left, rcDest.top, cx, cy, dcMask, 0, 0, ROP_DSno); + dc.BitBlt(rcDest.left, rcDest.top, cx, cy, dcSource, 0, 0, ROP_DSa); + } + else + { + if(clrCheck != clrBlack) + { + ATLASSERT(dcSource.GetTextColor() == clrBlack); + ATLASSERT(dcSource.GetBkColor() == clrWhite); + dcSource.BitBlt(0, 0, size.cx, size.cy, dcMask, 0, 0, ROP_DSna); + } + dc.BitBlt(rcDest.left, rcDest.top, cx, cy, dcMask, 0, 0, ROP_DSa); + dc.BitBlt(rcDest.left, rcDest.top, cx, cy, dcSource, 0, 0, ROP_DSo); + } + } + // restore all + dc.SetTextColor(clrTextOld); + dc.SetBkColor(clrBkOld); + dcSource.SelectBitmap(hBmpOld); + dcMask.SelectBitmap(hBmpOld1); + if(hBmpCheck == NULL) + bmp.DeleteObject(); + // draw pushed-in hilight + if(!m_bFlatMenus && !bDisabled) + { + if(rc.right - rc.left > size.cx) + ::InflateRect(&rcDest, 1,1); // inflate checkmark by one pixel all around + dc.DrawEdge(&rcDest, BDR_SUNKENOUTER, BF_RECT); + } + + return TRUE; + } + + void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct) + { + _MenuItemData* pmd = (_MenuItemData*)lpMeasureItemStruct->itemData; + + if(pmd->fType & MFT_SEPARATOR) // separator - use half system height and zero width + { + lpMeasureItemStruct->itemHeight = ::GetSystemMetrics(SM_CYMENU) / 2; + lpMeasureItemStruct->itemWidth = 0; + } + else + { + // compute size of text - use DrawText with DT_CALCRECT + CWindowDC dc(NULL); + CFont fontBold; + HFONT hOldFont = NULL; + if(pmd->fState & MFS_DEFAULT) + { + // need bold version of font + LOGFONT lf = { 0 }; + m_fontMenu.GetLogFont(lf); + lf.lfWeight += 200; + fontBold.CreateFontIndirect(&lf); + ATLASSERT(fontBold.m_hFont != NULL); + hOldFont = dc.SelectFont(fontBold); + } + else + { + hOldFont = dc.SelectFont(m_fontMenu); + } + + RECT rcText = { 0, 0, 0, 0 }; + dc.DrawText(pmd->lpstrText, -1, &rcText, DT_SINGLELINE | DT_LEFT | DT_VCENTER | DT_CALCRECT); + int cx = rcText.right - rcText.left; + dc.SelectFont(hOldFont); + + LOGFONT lf = { 0 }; + m_fontMenu.GetLogFont(lf); + int cy = lf.lfHeight; + if(cy < 0) + cy = -cy; + const int cyMargin = 8; + cy += cyMargin; + + // height of item is the bigger of these two + lpMeasureItemStruct->itemHeight = max(cy, (int)m_szButton.cy); + + // width is width of text plus a bunch of stuff + cx += 2 * s_kcxTextMargin; // L/R margin for readability + cx += s_kcxGap; // space between button and menu text + cx += 2 * m_szButton.cx; // button width (L=button; R=empty margin) + cx += m_cxExtraSpacing; // extra between item text and accelerator keys + + // Windows adds 1 to returned value + cx -= ::GetSystemMetrics(SM_CXMENUCHECK) - 1; + lpMeasureItemStruct->itemWidth = cx; // done deal + } + } + +// Implementation - Hook procs + static LRESULT CALLBACK CreateHookProc(int nCode, WPARAM wParam, LPARAM lParam) + { + const int cchClassName = 7; + TCHAR szClassName[cchClassName] = { 0 }; + + if(nCode == HCBT_CREATEWND) + { + HWND hWndMenu = (HWND)wParam; +#ifdef _CMDBAR_EXTRA_TRACE + ATLTRACE2(atlTraceUI, 0, _T("CmdBar - HCBT_CREATEWND (HWND = %8.8X)\n"), hWndMenu); +#endif + + ::GetClassName(hWndMenu, szClassName, cchClassName); + if(!lstrcmp(_T("#32768"), szClassName)) + s_pCurrentBar->m_stackMenuWnd.Push(hWndMenu); + } + else if(nCode == HCBT_DESTROYWND) + { + HWND hWndMenu = (HWND)wParam; +#ifdef _CMDBAR_EXTRA_TRACE + ATLTRACE2(atlTraceUI, 0, _T("CmdBar - HCBT_DESTROYWND (HWND = %8.8X)\n"), hWndMenu); +#endif + + ::GetClassName(hWndMenu, szClassName, cchClassName); + if(!lstrcmp(_T("#32768"), szClassName)) + { + ATLASSERT(hWndMenu == s_pCurrentBar->m_stackMenuWnd.GetCurrent()); + s_pCurrentBar->m_stackMenuWnd.Pop(); + } + } + + return ::CallNextHookEx(s_hCreateHook, nCode, wParam, lParam); + } + + static LRESULT CALLBACK MessageHookProc(int nCode, WPARAM wParam, LPARAM lParam) + { + LPMSG pMsg = (LPMSG)lParam; + + if(nCode == HC_ACTION && wParam == PM_REMOVE && pMsg->message != GetGetBarMessage() && pMsg->message != WM_FORWARDMSG) + { + CCommandBarCtrlBase* pCmdBar = NULL; + HWND hWnd = pMsg->hwnd; + DWORD dwPID = 0; + while(pCmdBar == NULL && hWnd != NULL) + { + pCmdBar = (CCommandBarCtrlBase*)::SendMessage(hWnd, GetGetBarMessage(), (WPARAM)&dwPID, 0L); + hWnd = ::GetParent(hWnd); + } + + if(pCmdBar != NULL && dwPID == GetCurrentProcessId()) + { + pCmdBar->m_hWndHook = pMsg->hwnd; + ATLASSERT(pCmdBar->IsCommandBarBase()); + + if(::IsWindow(pCmdBar->m_hWnd)) + pCmdBar->SendMessage(WM_FORWARDMSG, 0, (LPARAM)pMsg); + else + ATLTRACE2(atlTraceUI, 0, _T("CmdBar - Hook skipping message, can't find command bar!\n")); + } + } + + LRESULT lRet = 0; + ATLASSERT(s_pmapMsgHook != NULL); + if(s_pmapMsgHook != NULL) + { + DWORD dwThreadID = ::GetCurrentThreadId(); + _MsgHookData* pData = s_pmapMsgHook->Lookup(dwThreadID); + if(pData != NULL) + { + lRet = ::CallNextHookEx(pData->hMsgHook, nCode, wParam, lParam); + } + } + return lRet; + } + +// Implementation + void DoPopupMenu(int nIndex, bool bAnimate) + { +#ifdef _CMDBAR_EXTRA_TRACE + ATLTRACE2(atlTraceUI, 0, _T("CmdBar - DoPopupMenu, bAnimate = %s\n"), bAnimate ? "true" : "false"); +#endif + + // Menu animation flags +#ifndef TPM_VERPOSANIMATION + const UINT TPM_VERPOSANIMATION = 0x1000L; +#endif +#ifndef TPM_NOANIMATION + const UINT TPM_NOANIMATION = 0x4000L; +#endif + T* pT = static_cast(this); + + // get popup menu and it's position + RECT rect = { 0 }; + GetItemRect(nIndex, &rect); + POINT pt = { rect.left, rect.bottom }; + MapWindowPoints(NULL, &pt, 1); + MapWindowPoints(NULL, &rect); + TPMPARAMS TPMParams = { 0 }; + TPMParams.cbSize = sizeof(TPMPARAMS); + TPMParams.rcExclude = rect; + HMENU hMenuPopup = ::GetSubMenu(m_hMenu, nIndex); + ATLASSERT(hMenuPopup != NULL); + + // get button ID + TBBUTTON tbb = { 0 }; + GetButton(nIndex, &tbb); + int nCmdID = tbb.idCommand; + + m_nPopBtn = nIndex; // remember current button's index + + // press button and display popup menu + PressButton(nCmdID, TRUE); + SetHotItem(nCmdID); + pT->DoTrackPopupMenu(hMenuPopup, TPM_LEFTBUTTON | TPM_VERTICAL | TPM_LEFTALIGN | TPM_TOPALIGN | + (s_bW2K ? (bAnimate ? TPM_VERPOSANIMATION : TPM_NOANIMATION) : 0), pt.x, pt.y, &TPMParams); + PressButton(nCmdID, FALSE); + if(::GetFocus() != m_hWnd) + SetHotItem(-1); + + m_nPopBtn = -1; // restore + + // eat next message if click is on the same button + MSG msg = { 0 }; + if(::PeekMessage(&msg, m_hWnd, WM_LBUTTONDOWN, WM_LBUTTONDOWN, PM_NOREMOVE) && ::PtInRect(&rect, msg.pt)) + ::PeekMessage(&msg, m_hWnd, WM_LBUTTONDOWN, WM_LBUTTONDOWN, PM_REMOVE); + + // check if another popup menu should be displayed + if(m_nNextPopBtn != -1) + { + PostMessage(GetAutoPopupMessage(), m_nNextPopBtn & 0xFFFF); + if(!(m_nNextPopBtn & 0xFFFF0000) && !m_bPopupItem) + PostMessage(WM_KEYDOWN, VK_DOWN, 0); + m_nNextPopBtn = -1; + } + else + { + m_bContextMenu = false; + // If user didn't hit escape, give focus back + if(!m_bEscapePressed) + { + if(m_bUseKeyboardCues && m_bShowKeyboardCues) + m_bAllowKeyboardCues = false; + pT->GiveFocusBack(); + } + else + { + SetHotItem(nCmdID); + SetAnchorHighlight(TRUE); + } + } + } + + BOOL DoTrackPopupMenu(HMENU hMenu, UINT uFlags, int x, int y, LPTPMPARAMS lpParams = NULL) + { + CMenuHandle menuPopup = hMenu; + + CWindowCreateCriticalSectionLock lock; + if(FAILED(lock.Lock())) + { + ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CCommandBarCtrlImpl::DoTrackPopupMenu.\n")); + ATLASSERT(FALSE); + return FALSE; + } + + ATLASSERT(s_hCreateHook == NULL); + + s_pCurrentBar = static_cast(this); + + s_hCreateHook = ::SetWindowsHookEx(WH_CBT, CreateHookProc, ModuleHelper::GetModuleInstance(), GetCurrentThreadId()); + ATLASSERT(s_hCreateHook != NULL); + + m_bPopupItem = false; + m_bMenuActive = true; + + BOOL bTrackRet = menuPopup.TrackPopupMenuEx(uFlags, x, y, m_hWnd, lpParams); + m_bMenuActive = false; + + ::UnhookWindowsHookEx(s_hCreateHook); + + s_hCreateHook = NULL; + s_pCurrentBar = NULL; + + lock.Unlock(); + + // cleanup - convert menus back to original state +#ifdef _CMDBAR_EXTRA_TRACE + ATLTRACE2(atlTraceUI, 0, _T("CmdBar - TrackPopupMenu - cleanup\n")); +#endif + + ATLASSERT(m_stackMenuWnd.GetSize() == 0); + + UpdateWindow(); + ATL::CWindow wndTL = GetTopLevelParent(); + wndTL.UpdateWindow(); + + // restore the menu items to the previous state for all menus that were converted + if(m_bImagesVisible) + { + HMENU hMenuSav = NULL; + while((hMenuSav = m_stackMenuHandle.Pop()) != NULL) + { + menuPopup = hMenuSav; + BOOL bRet = FALSE; + // restore state and delete menu item data + for(int i = 0; i < menuPopup.GetMenuItemCount(); i++) + { + CMenuItemInfo mii; + mii.fMask = MIIM_DATA | MIIM_TYPE | MIIM_ID; + bRet = menuPopup.GetMenuItemInfo(i, TRUE, &mii); + ATLASSERT(bRet); + + _MenuItemData* pMI = (_MenuItemData*)mii.dwItemData; + if(pMI != NULL && pMI->IsCmdBarMenuItem()) + { + mii.fMask = MIIM_DATA | MIIM_TYPE | MIIM_STATE; + mii.fType = pMI->fType; + mii.fState = pMI->fState; + mii.dwTypeData = pMI->lpstrText; + mii.cch = lstrlen(pMI->lpstrText); + mii.dwItemData = NULL; + + bRet = menuPopup.SetMenuItemInfo(i, TRUE, &mii); + // this one triggers WM_MEASUREITEM + menuPopup.ModifyMenu(i, MF_BYPOSITION | mii.fType | mii.fState, mii.wID, pMI->lpstrText); + ATLASSERT(bRet); + + delete [] pMI->lpstrText; + delete pMI; + } + } + } + } + return bTrackRet; + } + + int GetPreviousMenuItem(int nBtn) const + { + if(nBtn == -1) + return -1; +#if (_WIN32_IE >= 0x0500) + RECT rcClient; + GetClientRect(&rcClient); +#endif // (_WIN32_IE >= 0x0500) + int nNextBtn; + for(nNextBtn = nBtn - 1; nNextBtn != nBtn; nNextBtn--) + { + if(nNextBtn < 0) + nNextBtn = ::GetMenuItemCount(m_hMenu) - 1; + TBBUTTON tbb = { 0 }; + GetButton(nNextBtn, &tbb); +#if (_WIN32_IE >= 0x0500) + RECT rcBtn; + GetItemRect(nNextBtn, &rcBtn); + if(rcBtn.right > rcClient.right) + { + nNextBtn = -2; // chevron + break; + } +#endif // (_WIN32_IE >= 0x0500) + if((tbb.fsState & TBSTATE_ENABLED) != 0 && (tbb.fsState & TBSTATE_HIDDEN) == 0) + break; + } + return (nNextBtn != nBtn) ? nNextBtn : -1; + } + + int GetNextMenuItem(int nBtn) const + { + if(nBtn == -1) + return -1; +#if (_WIN32_IE >= 0x0500) + RECT rcClient = { 0 }; + GetClientRect(&rcClient); +#endif // (_WIN32_IE >= 0x0500) + int nNextBtn = 0; + int nCount = ::GetMenuItemCount(m_hMenu); + for(nNextBtn = nBtn + 1; nNextBtn != nBtn; nNextBtn++) + { + if(nNextBtn >= nCount) + nNextBtn = 0; + TBBUTTON tbb = { 0 }; + GetButton(nNextBtn, &tbb); +#if (_WIN32_IE >= 0x0500) + RECT rcBtn = { 0 }; + GetItemRect(nNextBtn, &rcBtn); + if(rcBtn.right > rcClient.right) + { + nNextBtn = -2; // chevron + break; + } +#endif // (_WIN32_IE >= 0x0500) + if((tbb.fsState & TBSTATE_ENABLED) != 0 && (tbb.fsState & TBSTATE_HIDDEN) == 0) + break; + } + return (nNextBtn != nBtn) ? nNextBtn : -1; + } + +#if (_WIN32_IE >= 0x0500) + bool DisplayChevronMenu() + { + // assume we are in a rebar + HWND hWndReBar = GetParent(); + int nCount = (int)::SendMessage(hWndReBar, RB_GETBANDCOUNT, 0, 0L); + bool bRet = false; + for(int i = 0; i < nCount; i++) + { + REBARBANDINFO rbbi = { RunTimeHelper::SizeOf_REBARBANDINFO(), RBBIM_CHILD | RBBIM_STYLE }; + BOOL bRetBandInfo = (BOOL)::SendMessage(hWndReBar, RB_GETBANDINFO, i, (LPARAM)&rbbi); + if(bRetBandInfo && rbbi.hwndChild == m_hWnd) + { + if((rbbi.fStyle & RBBS_USECHEVRON) != 0) + { + ::PostMessage(hWndReBar, RB_PUSHCHEVRON, i, 0L); + PostMessage(WM_KEYDOWN, VK_DOWN, 0L); + bRet = true; + } + break; + } + } + return bRet; + } +#endif // (_WIN32_IE >= 0x0500) + + void GetSystemSettings() + { + // refresh our font + NONCLIENTMETRICS info = { RunTimeHelper::SizeOf_NONCLIENTMETRICS() }; + BOOL bRet = ::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(info), &info, 0); + ATLASSERT(bRet); + if(bRet) + { + LOGFONT logfont = { 0 }; + if(m_fontMenu.m_hFont != NULL) + m_fontMenu.GetLogFont(logfont); + if(logfont.lfHeight != info.lfMenuFont.lfHeight || + logfont.lfWidth != info.lfMenuFont.lfWidth || + logfont.lfEscapement != info.lfMenuFont.lfEscapement || + logfont.lfOrientation != info.lfMenuFont.lfOrientation || + logfont.lfWeight != info.lfMenuFont.lfWeight || + logfont.lfItalic != info.lfMenuFont.lfItalic || + logfont.lfUnderline != info.lfMenuFont.lfUnderline || + logfont.lfStrikeOut != info.lfMenuFont.lfStrikeOut || + logfont.lfCharSet != info.lfMenuFont.lfCharSet || + logfont.lfOutPrecision != info.lfMenuFont.lfOutPrecision || + logfont.lfClipPrecision != info.lfMenuFont.lfClipPrecision || + logfont.lfQuality != info.lfMenuFont.lfQuality || + logfont.lfPitchAndFamily != info.lfMenuFont.lfPitchAndFamily || + lstrcmp(logfont.lfFaceName, info.lfMenuFont.lfFaceName) != 0) + { + HFONT hFontMenu = ::CreateFontIndirect(&info.lfMenuFont); + ATLASSERT(hFontMenu != NULL); + if(hFontMenu != NULL) + { + if(m_fontMenu.m_hFont != NULL) + m_fontMenu.DeleteObject(); + m_fontMenu.Attach(hFontMenu); + SetFont(m_fontMenu); + AddStrings(_T("NS\0")); // for proper item height + AutoSize(); + } + } + } + + // check if we need extra spacing for menu item text + CWindowDC dc(m_hWnd); + HFONT hFontOld = dc.SelectFont(m_fontMenu); + RECT rcText = { 0, 0, 0, 0 }; + dc.DrawText(_T("\t"), -1, &rcText, DT_SINGLELINE | DT_LEFT | DT_VCENTER | DT_CALCRECT); + if((rcText.right - rcText.left) < 4) + { + ::SetRectEmpty(&rcText); + dc.DrawText(_T("x"), -1, &rcText, DT_SINGLELINE | DT_LEFT | DT_VCENTER | DT_CALCRECT); + m_cxExtraSpacing = rcText.right - rcText.left; + } + else + { + m_cxExtraSpacing = 0; + } + dc.SelectFont(hFontOld); + + // get Windows version + OSVERSIONINFO ovi = { sizeof(OSVERSIONINFO) }; + ::GetVersionEx(&ovi); + + // query keyboard cues mode (Windows 2000 or later) + if(ovi.dwMajorVersion >= 5) + { +#ifndef SPI_GETKEYBOARDCUES + const UINT SPI_GETKEYBOARDCUES = 0x100A; +#endif // !SPI_GETKEYBOARDCUES + BOOL bRetVal = TRUE; + bRet = ::SystemParametersInfo(SPI_GETKEYBOARDCUES, 0, &bRetVal, 0); + m_bUseKeyboardCues = (bRet && !bRetVal); + m_bAllowKeyboardCues = true; + ShowKeyboardCues(!m_bUseKeyboardCues); + } + + // query flat menu mode (Windows XP or later) + if((ovi.dwMajorVersion == 5 && ovi.dwMinorVersion >= 1) || (ovi.dwMajorVersion > 5)) + { +#ifndef SPI_GETFLATMENU + const UINT SPI_GETFLATMENU = 0x1022; +#endif // !SPI_GETFLATMENU + BOOL bRetVal = FALSE; + bRet = ::SystemParametersInfo(SPI_GETFLATMENU, 0, &bRetVal, 0); + m_bFlatMenus = (bRet && bRetVal); + } + +#if _WTL_CMDBAR_VISTA_MENUS + // check if we should use Vista menus + bool bVistaMenus = (RunTimeHelper::IsVista() && RunTimeHelper::IsCommCtrl6() && ((m_dwExtendedStyle & CBR_EX_NOVISTAMENUS) == 0)); + + if(bVistaMenus) + { + HMODULE hThemeDLL = ::LoadLibrary(_T("uxtheme.dll")); + if(hThemeDLL != NULL) + { + typedef BOOL (STDAPICALLTYPE *PFN_IsThemeActive)(); + PFN_IsThemeActive pfnIsThemeActive = (PFN_IsThemeActive)::GetProcAddress(hThemeDLL, "IsThemeActive"); + ATLASSERT(pfnIsThemeActive != NULL); + bVistaMenus = bVistaMenus && (pfnIsThemeActive != NULL) && (pfnIsThemeActive() != FALSE); + + typedef BOOL (STDAPICALLTYPE *PFN_IsAppThemed)(); + PFN_IsAppThemed pfnIsAppThemed = (PFN_IsAppThemed)::GetProcAddress(hThemeDLL, "IsAppThemed"); + ATLASSERT(pfnIsAppThemed != NULL); + bVistaMenus = bVistaMenus && (pfnIsAppThemed != NULL) && (pfnIsAppThemed() != FALSE); + + ::FreeLibrary(hThemeDLL); + } + } + + if(!bVistaMenus && m_bVistaMenus && (m_hMenu != NULL) && (m_arrCommand.GetSize() > 0)) + { + T* pT = static_cast(this); + pT->_RemoveVistaBitmapsFromMenu(); + } + + m_bVistaMenus = bVistaMenus; +#endif // _WTL_CMDBAR_VISTA_MENUS + +#ifdef _CMDBAR_EXTRA_TRACE + ATLTRACE2(atlTraceUI, 0, _T("CmdBar - GetSystemSettings:\n m_bFlatMenus = %s\n m_bUseKeyboardCues = %s m_bVistaMenus = %s\n"), + m_bFlatMenus ? "true" : "false", m_bUseKeyboardCues ? "true" : "false", m_bVistaMenus ? "true" : "false"); +#endif + } + +// Implementation - alternate focus mode support + void TakeFocus() + { + if((m_dwExtendedStyle & CBR_EX_ALTFOCUSMODE) && m_hWndFocus == NULL) + m_hWndFocus = ::GetFocus(); + SetFocus(); + } + + void GiveFocusBack() + { + if(m_bParentActive) + { + if((m_dwExtendedStyle & CBR_EX_ALTFOCUSMODE) && ::IsWindow(m_hWndFocus)) + ::SetFocus(m_hWndFocus); + else if(!(m_dwExtendedStyle & CBR_EX_ALTFOCUSMODE) && m_wndParent.IsWindow()) + m_wndParent.SetFocus(); + } + m_hWndFocus = NULL; + SetAnchorHighlight(FALSE); + if(m_bUseKeyboardCues && m_bShowKeyboardCues) + ShowKeyboardCues(false); + m_bSkipPostDown = false; + } + + void ShowKeyboardCues(bool bShow) + { + m_bShowKeyboardCues = bShow; + SetDrawTextFlags(DT_HIDEPREFIX, m_bShowKeyboardCues ? 0 : DT_HIDEPREFIX); + Invalidate(); + UpdateWindow(); + } + +// Implementation - internal message helpers + static UINT GetAutoPopupMessage() + { + static UINT uAutoPopupMessage = 0; + if(uAutoPopupMessage == 0) + { + CStaticDataInitCriticalSectionLock lock; + if(FAILED(lock.Lock())) + { + ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CCommandBarCtrlImpl::GetAutoPopupMessage.\n")); + ATLASSERT(FALSE); + return 0; + } + + if(uAutoPopupMessage == 0) + uAutoPopupMessage = ::RegisterWindowMessage(_T("WTL_CmdBar_InternalAutoPopupMsg")); + + lock.Unlock(); + } + ATLASSERT(uAutoPopupMessage != 0); + return uAutoPopupMessage; + } + + static UINT GetGetBarMessage() + { + static UINT uGetBarMessage = 0; + if(uGetBarMessage == 0) + { + CStaticDataInitCriticalSectionLock lock; + if(FAILED(lock.Lock())) + { + ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CCommandBarCtrlImpl::GetGetBarMessage.\n")); + ATLASSERT(FALSE); + return 0; + } + + if(uGetBarMessage == 0) + uGetBarMessage = ::RegisterWindowMessage(_T("WTL_CmdBar_InternalGetBarMsg")); + + lock.Unlock(); + } + ATLASSERT(uGetBarMessage != 0); + return uGetBarMessage; + } + +// Implementation + bool CreateInternalImageList(int cImages) + { + UINT uFlags = (m_bAlphaImages ? ILC_COLOR32 : ILC_COLOR24) | ILC_MASK; + m_hImageList = ::ImageList_Create(m_szBitmap.cx, m_szBitmap.cy, uFlags, cImages, 1); + ATLASSERT(m_hImageList != NULL); + return (m_hImageList != NULL); + } + +// Implementation - support for Vista menus +#if _WTL_CMDBAR_VISTA_MENUS + void _AddVistaBitmapsFromImageList(int nStartIndex, int nCount) + { + // Create display compatible memory DC + HDC hDC = ::GetDC(NULL); + CDC dcMem; + dcMem.CreateCompatibleDC(hDC); + HBITMAP hBitmapSave = dcMem.GetCurrentBitmap(); + + T* pT = static_cast(this); + // Create bitmaps for all menu items + for(int i = 0; i < nCount; i++) + { + HBITMAP hBitmap = pT->_CreateVistaBitmapHelper(nStartIndex + i, hDC, dcMem); + dcMem.SelectBitmap(hBitmapSave); + m_arrVistaBitmap.Add(hBitmap); + } + } + + void _AddVistaBitmapFromImageList(int nIndex) + { + // Create display compatible memory DC + HDC hDC = ::GetDC(NULL); + CDC dcMem; + dcMem.CreateCompatibleDC(hDC); + HBITMAP hBitmapSave = dcMem.GetCurrentBitmap(); + + // Create bitmap for menu item + T* pT = static_cast(this); + HBITMAP hBitmap = pT->_CreateVistaBitmapHelper(nIndex, hDC, dcMem); + + // Select saved bitmap back and add bitmap to the array + dcMem.SelectBitmap(hBitmapSave); + m_arrVistaBitmap.Add(hBitmap); + } + + void _ReplaceVistaBitmapFromImageList(int nIndex) + { + // Delete existing bitmap + if(m_arrVistaBitmap[nIndex] != NULL) + ::DeleteObject(m_arrVistaBitmap[nIndex]); + + // Create display compatible memory DC + HDC hDC = ::GetDC(NULL); + CDC dcMem; + dcMem.CreateCompatibleDC(hDC); + HBITMAP hBitmapSave = dcMem.GetCurrentBitmap(); + + // Create bitmap for menu item + T* pT = static_cast(this); + HBITMAP hBitmap = pT->_CreateVistaBitmapHelper(nIndex, hDC, dcMem); + + // Select saved bitmap back and replace bitmap in the array + dcMem.SelectBitmap(hBitmapSave); + m_arrVistaBitmap.SetAtIndex(nIndex, hBitmap); + } + + HBITMAP _CreateVistaBitmapHelper(int nIndex, HDC hDCSource, HDC hDCTarget) + { + // Create 32-bit bitmap + BITMAPINFO bi = { 0 }; + bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + bi.bmiHeader.biWidth = m_szBitmap.cx; + bi.bmiHeader.biHeight = m_szBitmap.cy; + bi.bmiHeader.biPlanes = 1; + bi.bmiHeader.biBitCount = 32; + bi.bmiHeader.biCompression = BI_RGB; + bi.bmiHeader.biSizeImage = 0; + bi.bmiHeader.biXPelsPerMeter = 0; + bi.bmiHeader.biYPelsPerMeter = 0; + bi.bmiHeader.biClrUsed = 0; + bi.bmiHeader.biClrImportant = 0; + HBITMAP hBitmap = ::CreateDIBSection(hDCSource, &bi, DIB_RGB_COLORS, NULL, NULL, 0); + ATLASSERT(hBitmap != NULL); + + // Select bitmap into target DC and draw from image list to it + if(hBitmap != NULL) + { + ::SelectObject(hDCTarget, hBitmap); + + IMAGELISTDRAWPARAMS ildp = { 0 }; + ildp.cbSize = sizeof(IMAGELISTDRAWPARAMS); + ildp.himl = m_hImageList; + ildp.i = nIndex; + ildp.hdcDst = hDCTarget; + ildp.x = 0; + ildp.y = 0; + ildp.cx = 0; + ildp.cy = 0; + ildp.xBitmap = 0; + ildp.yBitmap = 0; + ildp.fStyle = ILD_TRANSPARENT; + ildp.fState = ILS_ALPHA; + ildp.Frame = 255; + ::ImageList_DrawIndirect(&ildp); + } + + return hBitmap; + } + + void _RemoveVistaBitmapsFromMenu() + { + CMenuHandle menu = m_hMenu; + for(int i = 0; i < m_arrCommand.GetSize(); i++) + { + CMenuItemInfo mii; + mii.fMask = MIIM_BITMAP; + mii.hbmpItem = NULL; + menu.SetMenuItemInfo(m_arrCommand[i], FALSE, &mii); + } + } +#endif // _WTL_CMDBAR_VISTA_MENUS +}; + + +class CCommandBarCtrl : public CCommandBarCtrlImpl +{ +public: + DECLARE_WND_SUPERCLASS(_T("WTL_CommandBar"), GetWndClassName()) +}; + + +/////////////////////////////////////////////////////////////////////////////// +// CMDICommandBarCtrl - ATL implementation of Command Bars for MDI apps + +template +class ATL_NO_VTABLE CMDICommandBarCtrlImpl : public CCommandBarCtrlImpl< T, TBase, TWinTraits> +{ +public: +// Data members + ATL::CContainedWindow m_wndMDIClient; + bool m_bChildMaximized; + HWND m_hWndChildMaximized; + HICON m_hIconChildMaximized; + int m_nBtnPressed; + int m_nBtnWasPressed; + + int m_cxyOffset; // offset between nonclient elements + int m_cxIconWidth; // small icon width + int m_cyIconHeight; // small icon height + int m_cxBtnWidth; // nonclient button width + int m_cyBtnHeight; // nonclient button height + int m_cxLeft; // left nonclient area width + int m_cxRight; // right nonclient area width + +// Theme declarations and data members +#ifndef _WTL_NO_AUTO_THEME +#ifndef _UXTHEME_H_ + typedef HANDLE HTHEME; +#endif // !_UXTHEME_H_ + typedef HTHEME (STDAPICALLTYPE *PFN_OpenThemeData)(HWND hwnd, LPCWSTR pszClassList); + typedef HRESULT (STDAPICALLTYPE *PFN_CloseThemeData)(HTHEME hTheme); + typedef HRESULT (STDAPICALLTYPE *PFN_DrawThemeBackground)(HTHEME hTheme, HDC hdc, int iPartId, int iStateId, const RECT *pRect, OPTIONAL const RECT *pClipRect); + typedef HRESULT (STDAPICALLTYPE *PFN_DrawThemeParentBackground)(HWND hwnd, HDC hdc, OPTIONAL RECT* prc); + + HMODULE m_hThemeDLL; + HTHEME m_hTheme; + PFN_DrawThemeBackground m_pfnDrawThemeBackground; + PFN_DrawThemeParentBackground m_pfnDrawThemeParentBackground; +#endif // !_WTL_NO_AUTO_THEME + +// Constructor/destructor + CMDICommandBarCtrlImpl() : + m_wndMDIClient(this, 2), m_bChildMaximized(false), + m_hWndChildMaximized(NULL), m_hIconChildMaximized(NULL), + m_nBtnPressed(-1), m_nBtnWasPressed(-1), +#ifndef _WTL_NO_AUTO_THEME + m_hThemeDLL(NULL), m_hTheme(NULL), m_pfnDrawThemeBackground(NULL), m_pfnDrawThemeParentBackground(NULL), +#endif // !_WTL_NO_AUTO_THEME + m_cxyOffset(2), + m_cxIconWidth(16), m_cyIconHeight(16), + m_cxBtnWidth(16), m_cyBtnHeight(14), + m_cxLeft(20), m_cxRight(55) + { } + + ~CMDICommandBarCtrlImpl() + { + if(m_wndMDIClient.IsWindow()) +/*scary!*/ m_wndMDIClient.UnsubclassWindow(); + } + +// Operations + BOOL SetMDIClient(HWND hWndMDIClient) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(::IsWindow(hWndMDIClient)); + if(!::IsWindow(hWndMDIClient)) + return FALSE; + +#ifdef _DEBUG + // BLOCK: Test if the passed window is MDICLIENT + { + LPCTSTR lpszMDIClientClass = _T("MDICLIENT"); + const int nNameLen = 9 + 1; // "MDICLIENT" + NULL + TCHAR szClassName[nNameLen] = { 0 }; + ::GetClassName(hWndMDIClient, szClassName, nNameLen); + ATLASSERT(lstrcmpi(szClassName, lpszMDIClientClass) == 0); + } +#endif // _DEBUG + + if(m_wndMDIClient.IsWindow()) +/*scary!*/ m_wndMDIClient.UnsubclassWindow(); + + return m_wndMDIClient.SubclassWindow(hWndMDIClient); + } + +// Message maps + typedef CCommandBarCtrlImpl< T, TBase, TWinTraits > _baseClass; + BEGIN_MSG_MAP(CMDICommandBarCtrlImpl) + MESSAGE_HANDLER(WM_CREATE, OnCreate) + MESSAGE_HANDLER(WM_DESTROY, OnDestroy) +#ifndef _WTL_NO_AUTO_THEME + MESSAGE_HANDLER(_GetThemeChangedMsg(), OnThemeChanged) +#endif // !_WTL_NO_AUTO_THEME + MESSAGE_HANDLER(WM_SIZE, OnSize) + MESSAGE_HANDLER(WM_NCCALCSIZE, OnNcCalcSize) + MESSAGE_HANDLER(WM_NCPAINT, OnNcPaint) + MESSAGE_HANDLER(WM_NCHITTEST, OnNcHitTest) + MESSAGE_HANDLER(WM_NCLBUTTONDOWN, OnNcLButtonDown) + MESSAGE_HANDLER(WM_MOUSEMOVE, OnMouseMove) + MESSAGE_HANDLER(WM_LBUTTONUP, OnLButtonUp) + MESSAGE_HANDLER(WM_NCLBUTTONDBLCLK, OnNcLButtonDblClk) + MESSAGE_HANDLER(WM_CAPTURECHANGED, OnCaptureChanged) + CHAIN_MSG_MAP(_baseClass) + ALT_MSG_MAP(1) // Parent window messages + MESSAGE_HANDLER(WM_ACTIVATE, OnParentActivate) + CHAIN_MSG_MAP_ALT(_baseClass, 1) + ALT_MSG_MAP(2) // MDI client window messages + MESSAGE_HANDLER(WM_MDISETMENU, OnMDISetMenu) + // no chaining needed since this was moved from the base class here + ALT_MSG_MAP(3) // Message hook messages + MESSAGE_RANGE_HANDLER(0, 0xFFFF, OnAllHookMessages) + CHAIN_MSG_MAP_ALT(_baseClass, 3) + END_MSG_MAP() + +// Additional MDI message handlers + LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) + { + LRESULT lRet = _baseClass::OnCreate(uMsg, wParam, lParam, bHandled); + if(lRet == (LRESULT)-1) + return lRet; + +#ifndef _WTL_NO_AUTO_THEME + // this will fail if theming is not supported + m_hThemeDLL = ::LoadLibrary(_T("uxtheme.dll")); + if(m_hThemeDLL != NULL) + { + m_pfnDrawThemeBackground = (PFN_DrawThemeBackground)::GetProcAddress(m_hThemeDLL, "DrawThemeBackground"); + ATLASSERT(m_pfnDrawThemeBackground != NULL); + if(m_pfnDrawThemeBackground != NULL) + { + T* pT = static_cast(this); + pT->_OpenThemeData(); + } + else + { + ::FreeLibrary(m_hThemeDLL); + m_hThemeDLL = NULL; + } + m_pfnDrawThemeParentBackground = (PFN_DrawThemeParentBackground)::GetProcAddress(m_hThemeDLL, "DrawThemeParentBackground"); + ATLASSERT(m_pfnDrawThemeParentBackground != NULL); + } +#endif // !_WTL_NO_AUTO_THEME + + return lRet; + } + + LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) + { + LRESULT lRet = _baseClass::OnDestroy(uMsg, wParam, lParam, bHandled); + +#ifndef _WTL_NO_AUTO_THEME + if(m_hThemeDLL != NULL) + { + T* pT = static_cast(this); + pT->_CloseThemeData(); + ::FreeLibrary(m_hThemeDLL); + m_hThemeDLL = NULL; + } +#endif // !_WTL_NO_AUTO_THEME + + return lRet; + } + +#ifndef _WTL_NO_AUTO_THEME + LRESULT OnThemeChanged(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) + { + if(m_hThemeDLL != NULL) + { + T* pT = static_cast(this); + pT->_CloseThemeData(); + pT->_OpenThemeData(); + } + return 0; + } +#endif // !_WTL_NO_AUTO_THEME + + LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) + { + LRESULT lRet = DefWindowProc(uMsg, wParam, lParam); + T* pT = static_cast(this); + pT->_AdjustBtnSize(GET_Y_LPARAM(lParam)); + return lRet; + } + + LRESULT OnNcCalcSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) + { + LRESULT lRet = DefWindowProc(uMsg, wParam, lParam); + + if(m_bChildMaximized && (BOOL)wParam) + { + LPNCCALCSIZE_PARAMS lpParams = (LPNCCALCSIZE_PARAMS)lParam; + if(m_bLayoutRTL) + { + lpParams->rgrc[0].left += m_cxRight; + lpParams->rgrc[0].right -= m_cxLeft; + } + else + { + lpParams->rgrc[0].left += m_cxLeft; + lpParams->rgrc[0].right -= m_cxRight; + } + } + + return lRet; + } + + LRESULT OnNcPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) + { + LRESULT lRet = DefWindowProc(uMsg, wParam, lParam); + + if(!m_bChildMaximized) + return lRet; + + ATLASSERT(m_hWndChildMaximized != NULL && m_hIconChildMaximized != NULL); + + // get DC and window rectangle + CWindowDC dc(m_hWnd); + RECT rect; + GetWindowRect(&rect); + int cxWidth = rect.right - rect.left; + int cyHeight = rect.bottom - rect.top; + + // paint left side nonclient background and draw icon + ::SetRect(&rect, 0, 0, m_cxLeft, cyHeight); +#ifndef _WTL_NO_AUTO_THEME + if(m_hTheme != NULL) + { + if(m_pfnDrawThemeParentBackground != NULL) + m_pfnDrawThemeParentBackground(m_hWnd, dc, &rect); + else + dc.FillRect(&rect, COLOR_WINDOW); + } + else +#endif // !_WTL_NO_AUTO_THEME + { + if((m_dwExtendedStyle & CBR_EX_TRANSPARENT) != 0) + dc.FillRect(&rect, COLOR_3DFACE); + else + dc.FillRect(&rect, COLOR_MENU); + } + + RECT rcIcon = { 0 }; + T* pT = static_cast(this); + pT->_CalcIconRect(cxWidth, cyHeight, rcIcon); + dc.DrawIconEx(rcIcon.left, rcIcon.top, m_hIconChildMaximized, m_cxIconWidth, m_cyIconHeight); + + // paint right side nonclient background + ::SetRect(&rect, cxWidth - m_cxRight, 0, cxWidth, cyHeight); +#ifndef _WTL_NO_AUTO_THEME + if(m_hTheme != NULL) + { + if(m_pfnDrawThemeParentBackground != NULL) + { + // this is to account for the left non-client area + POINT ptOrg = { 0, 0 }; + dc.GetViewportOrg(&ptOrg); + dc.SetViewportOrg(ptOrg.x + m_cxLeft, ptOrg.y); + ::OffsetRect(&rect, -m_cxLeft, 0); + + m_pfnDrawThemeParentBackground(m_hWnd, dc, &rect); + + // restore + dc.SetViewportOrg(ptOrg); + ::OffsetRect(&rect, m_cxLeft, 0); + } + else + { + dc.FillRect(&rect, COLOR_3DFACE); + } + } + else +#endif // !_WTL_NO_AUTO_THEME + { + if((m_dwExtendedStyle & CBR_EX_TRANSPARENT) != 0) + dc.FillRect(&rect, COLOR_3DFACE); + else + dc.FillRect(&rect, COLOR_MENU); + } + + // draw buttons + RECT arrRect[3] = { 0 }; + pT->_CalcBtnRects(cxWidth, cyHeight, arrRect); + pT->_DrawMDIButton(dc, arrRect, -1); // draw all buttons + + return lRet; + } + + LRESULT OnNcHitTest(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) + { + LRESULT lRet = DefWindowProc(uMsg, wParam, lParam); + if(m_bChildMaximized) + { + RECT rect = { 0 }; + GetWindowRect(&rect); + POINT pt = { GET_X_LPARAM(lParam) - rect.left, GET_Y_LPARAM(lParam) - rect.top }; + if(m_bLayoutRTL) + { + if((pt.x < m_cxRight) || (pt.x > ((rect.right - rect.left) - m_cxLeft))) + lRet = HTBORDER; + } + else + { + if((pt.x < m_cxLeft) || (pt.x > ((rect.right - rect.left) - m_cxRight))) + lRet = HTBORDER; + } + } + return lRet; + } + + LRESULT OnNcLButtonDown(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled) + { + if(!m_bChildMaximized) + { + bHandled = FALSE; + return 1; + } + + ATLASSERT(_DebugCheckChild()); + + POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; + RECT rect = { 0 }; + GetWindowRect(&rect); + pt.x -= rect.left; + pt.y -= rect.top; + + RECT rcIcon = { 0 }; + T* pT = static_cast(this); + pT->_CalcIconRect(rect.right - rect.left, rect.bottom - rect.top, rcIcon, m_bLayoutRTL); + RECT arrRect[3] = { 0 }; + pT->_CalcBtnRects(rect.right - rect.left, rect.bottom - rect.top, arrRect, m_bLayoutRTL); + + if(::PtInRect(&rcIcon, pt)) + { +#ifdef _CMDBAR_EXTRA_TRACE + ATLTRACE2(atlTraceUI, 0, _T("MDI CmdBar - LButtonDown: icon\n")); +#endif +#ifndef TPM_VERPOSANIMATION + const UINT TPM_VERPOSANIMATION = 0x1000L; // Menu animation flag +#endif + CMenuHandle menu = ::GetSystemMenu(m_hWndChildMaximized, FALSE); + UINT uRet = (UINT)menu.TrackPopupMenu(TPM_LEFTBUTTON | TPM_VERTICAL | TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RETURNCMD | + (s_bW2K ? TPM_VERPOSANIMATION : 0), m_bLayoutRTL ? rect.right : rect.left, rect.bottom, m_hWndChildMaximized); + + // eat next message if click is on the same button + ::OffsetRect(&rcIcon, rect.left, rect.top); + MSG msg = { 0 }; + if(::PeekMessage(&msg, m_hWnd, WM_NCLBUTTONDOWN, WM_NCLBUTTONDOWN, PM_NOREMOVE) && ::PtInRect(&rcIcon, msg.pt)) + ::PeekMessage(&msg, m_hWnd, WM_NCLBUTTONDOWN, WM_NCLBUTTONDOWN, PM_REMOVE); + + if(uRet != 0) + ::SendMessage(m_hWndChildMaximized, WM_SYSCOMMAND, uRet, 0L); + } + else if(::PtInRect(&arrRect[0], pt)) + { +#ifdef _CMDBAR_EXTRA_TRACE + ATLTRACE2(atlTraceUI, 0, _T("MDI CmdBar - LButtonDown: close button\n")); +#endif + m_nBtnWasPressed = m_nBtnPressed = 0; + } + else if(::PtInRect(&arrRect[1], pt)) + { +#ifdef _CMDBAR_EXTRA_TRACE + ATLTRACE2(atlTraceUI, 0, _T("MDI CmdBar - LButtonDown: restore button\n")); +#endif + m_nBtnWasPressed = m_nBtnPressed = 1; + } + else if(::PtInRect(&arrRect[2], pt)) + { +#ifdef _CMDBAR_EXTRA_TRACE + ATLTRACE2(atlTraceUI, 0, _T("MDI CmdBar - LButtonDown: minimize button\n")); +#endif + m_nBtnWasPressed = m_nBtnPressed = 2; + } + else + { + bHandled = FALSE; + } + + // draw the button state if it was pressed + if(m_nBtnPressed != -1) + { + SetCapture(); + CWindowDC dc(m_hWnd); + pT->_CalcBtnRects(rect.right - rect.left, rect.bottom - rect.top, arrRect); + pT->_DrawMDIButton(dc, arrRect, m_nBtnPressed); + } + + return 0; + } + + LRESULT OnMouseMove(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled) + { + if(!m_bChildMaximized || ::GetCapture() != m_hWnd || m_nBtnWasPressed == -1) + { + bHandled = FALSE; + return 1; + } + + POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; + ClientToScreen(&pt); + RECT rect = { 0 }; + GetWindowRect(&rect); + pt.x -= rect.left; + pt.y -= rect.top; + RECT arrRect[3] = { 0 }; + T* pT = static_cast(this); + pT->_CalcBtnRects(rect.right - rect.left, rect.bottom - rect.top, arrRect, m_bLayoutRTL); + int nOldBtnPressed = m_nBtnPressed; + m_nBtnPressed = ::PtInRect(&arrRect[m_nBtnWasPressed], pt) ? m_nBtnWasPressed : -1; + if(nOldBtnPressed != m_nBtnPressed) + { + CWindowDC dc(m_hWnd); + pT->_CalcBtnRects(rect.right - rect.left, rect.bottom - rect.top, arrRect); + pT->_DrawMDIButton(dc, arrRect, (m_nBtnPressed != -1) ? m_nBtnPressed : nOldBtnPressed); + } + + return 0; + } + + LRESULT OnLButtonUp(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled) + { + if(!m_bChildMaximized || ::GetCapture() != m_hWnd || m_nBtnWasPressed == -1) + { + bHandled = FALSE; + return 1; + } + + ATLASSERT(_DebugCheckChild()); + + POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; + ClientToScreen(&pt); + RECT rect = { 0 }; + GetWindowRect(&rect); + pt.x -= rect.left; + pt.y -= rect.top; + + int nBtn = m_nBtnWasPressed; + ReleaseCapture(); + + RECT arrRect[3] = { 0 }; + T* pT = static_cast(this); + pT->_CalcBtnRects(rect.right - rect.left, rect.bottom - rect.top, arrRect, m_bLayoutRTL); + if(::PtInRect(&arrRect[nBtn], pt)) + { + switch(nBtn) + { + case 0: // close +#ifdef _CMDBAR_EXTRA_TRACE + ATLTRACE2(atlTraceUI, 0, _T("MDI CmdBar - LButtonUp: close button\n")); +#endif + ::SendMessage(m_hWndChildMaximized, WM_SYSCOMMAND, SC_CLOSE, 0L); + break; + case 1: // restore +#ifdef _CMDBAR_EXTRA_TRACE + ATLTRACE2(atlTraceUI, 0, _T("MDI CmdBar - LButtonUp: restore button\n")); +#endif + ::SendMessage(m_hWndChildMaximized, WM_SYSCOMMAND, SC_RESTORE, 0L); + break; + case 2: // minimize +#ifdef _CMDBAR_EXTRA_TRACE + ATLTRACE2(atlTraceUI, 0, _T("MDI CmdBar - LButtonUp: minimize button\n")); +#endif + ::SendMessage(m_hWndChildMaximized, WM_SYSCOMMAND, SC_MINIMIZE, 0L); + break; + default: + break; + } + } + + return 0; + } + + LRESULT OnNcLButtonDblClk(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled) + { + if(!m_bChildMaximized || m_nBtnWasPressed != -1) + { + bHandled = FALSE; + return 1; + } + + ATLASSERT(_DebugCheckChild()); + + POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; + RECT rect = { 0 }; + GetWindowRect(&rect); + pt.x -= rect.left; + pt.y -= rect.top; + + RECT rcIcon = { 0 }; + T* pT = static_cast(this); + pT->_CalcIconRect(rect.right - rect.left, rect.bottom - rect.top, rcIcon, m_bLayoutRTL); + RECT arrRect[3] = { 0 }; + pT->_CalcBtnRects(rect.right - rect.left, rect.bottom - rect.top, arrRect, m_bLayoutRTL); + + if(::PtInRect(&rcIcon, pt)) + { + CMenuHandle menu = ::GetSystemMenu(m_hWndChildMaximized, FALSE); + UINT uDefID = menu.GetMenuDefaultItem(); + if(uDefID == (UINT)-1) + uDefID = SC_CLOSE; + ::SendMessage(m_hWndChildMaximized, WM_SYSCOMMAND, uDefID, 0L); + } + + return 0; + } + + LRESULT OnCaptureChanged(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) + { + if(m_bChildMaximized) + { + if(m_nBtnPressed != -1) + { + ATLASSERT(m_nBtnPressed == m_nBtnWasPressed); // must be + m_nBtnPressed = -1; + RECT rect = { 0 }; + GetWindowRect(&rect); + RECT arrRect[3] = { 0 }; + T* pT = static_cast(this); + pT->_CalcBtnRects(rect.right - rect.left, rect.bottom - rect.top, arrRect); + CWindowDC dc(m_hWnd); + pT->_DrawMDIButton(dc, arrRect, m_nBtnWasPressed); + } + m_nBtnWasPressed = -1; + } + else + { + bHandled = FALSE; + } + return 0; + } + +// Parent window message handlers + LRESULT OnParentActivate(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) + { + m_bParentActive = (LOWORD(wParam) != WA_INACTIVE); + RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_FRAME | RDW_UPDATENOW); + bHandled = FALSE; + return 1; + } + +// MDI client window message handlers + LRESULT OnMDISetMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) + { + m_wndMDIClient.DefWindowProc(uMsg, NULL, lParam); + HMENU hOldMenu = GetMenu(); + BOOL bRet = AttachMenu((HMENU)wParam); + bRet; // avoid level 4 warning + ATLASSERT(bRet); + +#if (_WIN32_IE >= 0x0400) + T* pT = static_cast(this); + pT->UpdateRebarBandIdealSize(); +#endif // (_WIN32_IE >= 0x0400) + + return (LRESULT)hOldMenu; + } + +// All messages from the message hook + LRESULT OnAllHookMessages(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) + { + T* pT = static_cast(this); + pT->_ProcessAllHookMessages(uMsg, wParam, lParam); + + bHandled = FALSE; + return 1; + } + +// Overrideables + // override this to provide different ideal size + void UpdateRebarBandIdealSize() + { + // assuming we are in a rebar, change ideal size to our size + // we hope that if we are not in a rebar, nCount will be 0 + int nCount = (int)::SendMessage(GetParent(), RB_GETBANDCOUNT, 0, 0L); + for(int i = 0; i < nCount; i++) + { + REBARBANDINFO rbi = { RunTimeHelper::SizeOf_REBARBANDINFO(), RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_IDEALSIZE }; + ::SendMessage(GetParent(), RB_GETBANDINFO, i, (LPARAM)&rbi); + if(rbi.hwndChild == m_hWnd) + { + rbi.fMask = RBBIM_IDEALSIZE; + rbi.cxIdeal = m_bChildMaximized ? m_cxLeft + m_cxRight : 0; + int nBtnCount = GetButtonCount(); + if(nBtnCount > 0) + { + RECT rect = { 0 }; + GetItemRect(nBtnCount - 1, &rect); + rbi.cxIdeal += rect.right; + } + ::SendMessage(GetParent(), RB_SETBANDINFO, i, (LPARAM)&rbi); + break; + } + } + } + + // all hook messages - check for the maximized MDI child window change + void _ProcessAllHookMessages(UINT uMsg, WPARAM /*wParam*/, LPARAM /*lParam*/) + { + if(uMsg == WM_MDIGETACTIVE || uMsg == WM_MDISETMENU) + return; + + BOOL bMaximized = FALSE; + HWND hWndChild = (HWND)::SendMessage(m_wndMDIClient, WM_MDIGETACTIVE, 0, (LPARAM)&bMaximized); + bool bMaxOld = m_bChildMaximized; + m_bChildMaximized = (hWndChild != NULL && bMaximized); + HICON hIconOld = m_hIconChildMaximized; + + if(m_bChildMaximized) + { + if(m_hWndChildMaximized != hWndChild) + { + ATL::CWindow wnd = m_hWndChildMaximized = hWndChild; + m_hIconChildMaximized = wnd.GetIcon(FALSE); + if(m_hIconChildMaximized == NULL) + { + m_hIconChildMaximized = wnd.GetIcon(TRUE); + if(m_hIconChildMaximized == NULL) + { + // no icon set with WM_SETICON, get the class one +// need conditional code because types don't match in winuser.h +#ifdef _WIN64 + m_hIconChildMaximized = (HICON)::GetClassLongPtr(wnd, GCLP_HICONSM); +#else + m_hIconChildMaximized = (HICON)LongToHandle(::GetClassLongPtr(wnd, GCLP_HICONSM)); +#endif + } + } + } + } + else + { + m_hWndChildMaximized = NULL; + m_hIconChildMaximized = NULL; + } + + if(bMaxOld != m_bChildMaximized) + { +#ifdef _CMDBAR_EXTRA_TRACE + ATLTRACE2(atlTraceUI, 0, _T("MDI CmdBar - All messages hook change: m_bChildMaximized = %s\n"), m_bChildMaximized ? "true" : "false"); +#endif + // assuming we are in a rebar, change our size to accomodate new state + // we hope that if we are not in a rebar, nCount will be 0 + int nCount = (int)::SendMessage(GetParent(), RB_GETBANDCOUNT, 0, 0L); + int cxDiff = (m_bChildMaximized ? 1 : -1) * (m_cxLeft + m_cxRight); + for(int i = 0; i < nCount; i++) + { +#if (_WIN32_IE >= 0x0500) + REBARBANDINFO rbi = { RunTimeHelper::SizeOf_REBARBANDINFO(), RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_IDEALSIZE | RBBIM_STYLE }; + ::SendMessage(GetParent(), RB_GETBANDINFO, i, (LPARAM)&rbi); + if(rbi.hwndChild == m_hWnd) + { + if((rbi.fStyle & RBBS_USECHEVRON) != 0) + { + rbi.fMask = RBBIM_CHILDSIZE | RBBIM_IDEALSIZE; + rbi.cxMinChild += cxDiff; + rbi.cxIdeal += cxDiff; + ::SendMessage(GetParent(), RB_SETBANDINFO, i, (LPARAM)&rbi); + } + break; + } +#elif (_WIN32_IE >= 0x0400) + REBARBANDINFO rbi = { RunTimeHelper::SizeOf_REBARBANDINFO(), RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_IDEALSIZE }; + ::SendMessage(GetParent(), RB_GETBANDINFO, i, (LPARAM)&rbi); + if(rbi.hwndChild == m_hWnd) + { + rbi.fMask = RBBIM_CHILDSIZE | RBBIM_IDEALSIZE; + rbi.cxMinChild += cxDiff; + rbi.cxIdeal += cxDiff; + ::SendMessage(GetParent(), RB_SETBANDINFO, i, (LPARAM)&rbi); + break; + } +#else // (_WIN32_IE < 0x0400) + REBARBANDINFO rbi = { RunTimeHelper::SizeOf_REBARBANDINFO(), RBBIM_CHILD | RBBIM_CHILDSIZE }; + ::SendMessage(GetParent(), RB_GETBANDINFO, i, (LPARAM)&rbi); + if(rbi.hwndChild == m_hWnd) + { + rbi.fMask = RBBIM_CHILDSIZE; + rbi.cxMinChild += cxDiff; + ::SendMessage(GetParent(), RB_SETBANDINFO, i, (LPARAM)&rbi); + break; + } +#endif // (_WIN32_IE < 0x0400) + } + } + + if(bMaxOld != m_bChildMaximized || hIconOld != m_hIconChildMaximized) + { + // force size change and redraw everything + RECT rect = { 0 }; + GetWindowRect(&rect); + ::MapWindowPoints(NULL, GetParent(), (LPPOINT)&rect, 2); + SetRedraw(FALSE); + SetWindowPos(NULL, 0, 0, 1, 1, SWP_NOZORDER | SWP_NOMOVE); + SetWindowPos(NULL, &rect, SWP_NOZORDER | SWP_NOMOVE); + SetRedraw(TRUE); + RedrawWindow(NULL, NULL, RDW_FRAME | RDW_INVALIDATE | RDW_UPDATENOW); + } + } + +// Implementation + void GetSystemSettings() + { +#ifdef _CMDBAR_EXTRA_TRACE + ATLTRACE2(atlTraceUI, 0, _T("MDI CmdBar - GetSystemSettings\n")); +#endif + _baseClass::GetSystemSettings(); + + NONCLIENTMETRICS info = { RunTimeHelper::SizeOf_NONCLIENTMETRICS() }; + BOOL bRet = ::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(info), &info, 0); + ATLASSERT(bRet); + if(bRet) + { + m_cxIconWidth = ::GetSystemMetrics(SM_CXSMICON); + m_cyIconHeight = ::GetSystemMetrics(SM_CYSMICON); + m_cxLeft = m_cxIconWidth; + +#ifndef _WTL_NO_AUTO_THEME + if(m_hTheme != NULL) + { + m_cxBtnWidth = info.iCaptionWidth - 2 * m_cxyOffset; + m_cyBtnHeight = info.iCaptionHeight - 2 * m_cxyOffset; + m_cxRight = 3 * m_cxBtnWidth; + } + else +#endif // !_WTL_NO_AUTO_THEME + { + m_cxBtnWidth = info.iCaptionWidth - m_cxyOffset; + m_cyBtnHeight = info.iCaptionHeight - 2 * m_cxyOffset; + m_cxRight = 3 * m_cxBtnWidth + m_cxyOffset; + } + } + + RECT rect = { 0 }; + GetClientRect(&rect); + T* pT = static_cast(this); + pT->_AdjustBtnSize(rect.bottom); + } + + void _AdjustBtnSize(int cyHeight) + { + if(cyHeight > 1 && m_cyBtnHeight > cyHeight) + { +#ifndef _WTL_NO_AUTO_THEME + if(m_hTheme != NULL) + { + m_cyBtnHeight = cyHeight; + m_cxBtnWidth = cyHeight; + m_cxRight = 3 * m_cxBtnWidth; + } + else +#endif // !_WTL_NO_AUTO_THEME + { + m_cyBtnHeight = cyHeight; + m_cxBtnWidth = cyHeight + m_cxyOffset; + m_cxRight = 3 * m_cxBtnWidth + m_cxyOffset; + } + } + } + + void _CalcIconRect(int cxWidth, int cyHeight, RECT& rect, bool bInvertX = false) const + { + int xStart = (m_cxLeft - m_cxIconWidth) / 2; + if(xStart < 0) + xStart = 0; + int yStart = (cyHeight - m_cyIconHeight) / 2; + if(yStart < 0) + yStart = 0; + + if(bInvertX) + ::SetRect(&rect, cxWidth - (xStart + m_cxBtnWidth), yStart, cxWidth - xStart, yStart + m_cyBtnHeight); + else + ::SetRect(&rect, xStart, yStart, xStart + m_cxBtnWidth, yStart + m_cyBtnHeight); + } + + void _CalcBtnRects(int cxWidth, int cyHeight, RECT arrRect[3], bool bInvertX = false) const + { + int yStart = (cyHeight - m_cyBtnHeight) / 2; + if(yStart < 0) + yStart = 0; + + RECT rcBtn = { cxWidth - m_cxBtnWidth, yStart, cxWidth, yStart + m_cyBtnHeight }; + int nDirection = -1; + if(bInvertX) + { + ::SetRect(&rcBtn, 0, yStart, m_cxBtnWidth, yStart + m_cyBtnHeight); + nDirection = 1; + } + + arrRect[0] = rcBtn; +#ifndef _WTL_NO_AUTO_THEME + if(m_hTheme != NULL) + ::OffsetRect(&rcBtn, nDirection * m_cxBtnWidth, 0); + else +#endif // !_WTL_NO_AUTO_THEME + ::OffsetRect(&rcBtn, nDirection * (m_cxBtnWidth + m_cxyOffset), 0); + arrRect[1] = rcBtn; + ::OffsetRect(&rcBtn, nDirection * m_cxBtnWidth, 0); + arrRect[2] = rcBtn; + } + + void _DrawMDIButton(CWindowDC& dc, LPRECT pRects, int nBtn) + { +#ifndef _WTL_NO_AUTO_THEME + if(m_hTheme != NULL) + { +#ifndef TMSCHEMA_H + const int WP_MDICLOSEBUTTON = 20; + const int CBS_NORMAL = 1; + const int CBS_PUSHED = 3; + const int CBS_DISABLED = 4; + const int WP_MDIRESTOREBUTTON = 22; + const int RBS_NORMAL = 1; + const int RBS_PUSHED = 3; + const int RBS_DISABLED = 4; + const int WP_MDIMINBUTTON = 16; + const int MINBS_NORMAL = 1; + const int MINBS_PUSHED = 3; + const int MINBS_DISABLED = 4; +#endif // TMSCHEMA_H + if(nBtn == -1 || nBtn == 0) + m_pfnDrawThemeBackground(m_hTheme, dc, WP_MDICLOSEBUTTON, m_bParentActive ? ((m_nBtnPressed == 0) ? CBS_PUSHED : CBS_NORMAL) : CBS_DISABLED, &pRects[0], NULL); + if(nBtn == -1 || nBtn == 1) + m_pfnDrawThemeBackground(m_hTheme, dc, WP_MDIRESTOREBUTTON, m_bParentActive ? ((m_nBtnPressed == 1) ? RBS_PUSHED : RBS_NORMAL) : RBS_DISABLED, &pRects[1], NULL); + if(nBtn == -1 || nBtn == 2) + m_pfnDrawThemeBackground(m_hTheme, dc, WP_MDIMINBUTTON, m_bParentActive ? ((m_nBtnPressed == 2) ? MINBS_PUSHED : MINBS_NORMAL) : MINBS_DISABLED, &pRects[2], NULL); + } + else +#endif // !_WTL_NO_AUTO_THEME + { + if(nBtn == -1 || nBtn == 0) + dc.DrawFrameControl(&pRects[0], DFC_CAPTION, DFCS_CAPTIONCLOSE | ((m_nBtnPressed == 0) ? DFCS_PUSHED : 0)); + if(nBtn == -1 || nBtn == 1) + dc.DrawFrameControl(&pRects[1], DFC_CAPTION, DFCS_CAPTIONRESTORE | ((m_nBtnPressed == 1) ? DFCS_PUSHED : 0)); + if(nBtn == -1 || nBtn == 2) + dc.DrawFrameControl(&pRects[2], DFC_CAPTION, DFCS_CAPTIONMIN | ((m_nBtnPressed == 2) ? DFCS_PUSHED : 0)); + } + } + +#ifndef _WTL_NO_AUTO_THEME + static UINT _GetThemeChangedMsg() + { +#ifndef WM_THEMECHANGED + static const UINT WM_THEMECHANGED = 0x031A; +#endif // !WM_THEMECHANGED + return WM_THEMECHANGED; + } + + void _OpenThemeData() + { + ATLASSERT(m_hThemeDLL != NULL); + + PFN_OpenThemeData pfnOpenThemeData = (PFN_OpenThemeData)::GetProcAddress(m_hThemeDLL, "OpenThemeData"); + ATLASSERT(pfnOpenThemeData != NULL); + if(pfnOpenThemeData != NULL) + m_hTheme = pfnOpenThemeData(m_hWnd, L"Window"); + } + + void _CloseThemeData() + { + ATLASSERT(m_hThemeDLL != NULL); + + if(m_hTheme == NULL) + return; // nothing to do + + PFN_CloseThemeData pfnCloseThemeData = (PFN_CloseThemeData)::GetProcAddress(m_hThemeDLL, "CloseThemeData"); + ATLASSERT(pfnCloseThemeData != NULL); + if(pfnCloseThemeData != NULL) + { + pfnCloseThemeData(m_hTheme); + m_hTheme = NULL; + } + } +#endif // !_WTL_NO_AUTO_THEME + + bool _DebugCheckChild() + { +#ifdef _DEBUG + BOOL bMaximized = FALSE; + HWND hWndChild = (HWND)::SendMessage(m_wndMDIClient, WM_MDIGETACTIVE, 0, (LPARAM)&bMaximized); + return (bMaximized && hWndChild == m_hWndChildMaximized); +#else // !_DEBUG + return true; +#endif // !_DEBUG + } +}; + +class CMDICommandBarCtrl : public CMDICommandBarCtrlImpl +{ +public: + DECLARE_WND_SUPERCLASS(_T("WTL_MDICommandBar"), GetWndClassName()) +}; + +}; // namespace WTL + +#endif // __ATLCTRLW_H__ diff --git a/Externals/WTL80/atlctrlx.h b/Externals/WTL80/atlctrlx.h new file mode 100644 index 0000000000..bd78e3f958 --- /dev/null +++ b/Externals/WTL80/atlctrlx.h @@ -0,0 +1,4827 @@ +// Windows Template Library - WTL version 8.0 +// Copyright (C) Microsoft Corporation. All rights reserved. +// +// This file is a part of the Windows Template Library. +// The use and distribution terms for this software are covered by the +// Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php) +// which can be found in the file CPL.TXT at the root of this distribution. +// By using this software in any fashion, you are agreeing to be bound by +// the terms of this license. You must not remove this notice, or +// any other, from this software. + +#ifndef __ATLCTRLX_H__ +#define __ATLCTRLX_H__ + +#pragma once + +#ifndef __cplusplus + #error ATL requires C++ compilation (use a .cpp suffix) +#endif + +#ifndef __ATLAPP_H__ + #error atlctrlx.h requires atlapp.h to be included first +#endif + +#ifndef __ATLCTRLS_H__ + #error atlctrlx.h requires atlctrls.h to be included first +#endif + +#ifndef WM_UPDATEUISTATE + #define WM_UPDATEUISTATE 0x0128 +#endif // !WM_UPDATEUISTATE + + +/////////////////////////////////////////////////////////////////////////////// +// Classes in this file: +// +// CBitmapButtonImpl +// CBitmapButton +// CCheckListViewCtrlImpl +// CCheckListViewCtrl +// CHyperLinkImpl +// CHyperLink +// CWaitCursor +// CCustomWaitCursor +// CMultiPaneStatusBarCtrlImpl +// CMultiPaneStatusBarCtrl +// CPaneContainerImpl +// CPaneContainer +// CSortListViewImpl +// CSortListViewCtrlImpl +// CSortListViewCtrl +// CTabViewImpl +// CTabView + +namespace WTL +{ + +/////////////////////////////////////////////////////////////////////////////// +// CBitmapButton - bitmap button implementation + +#ifndef _WIN32_WCE + +// bitmap button extended styles +#define BMPBTN_HOVER 0x00000001 +#define BMPBTN_AUTO3D_SINGLE 0x00000002 +#define BMPBTN_AUTO3D_DOUBLE 0x00000004 +#define BMPBTN_AUTOSIZE 0x00000008 +#define BMPBTN_SHAREIMAGELISTS 0x00000010 +#define BMPBTN_AUTOFIRE 0x00000020 + +template +class ATL_NO_VTABLE CBitmapButtonImpl : public ATL::CWindowImpl< T, TBase, TWinTraits> +{ +public: + DECLARE_WND_SUPERCLASS(NULL, TBase::GetWndClassName()) + + enum + { + _nImageNormal = 0, + _nImagePushed, + _nImageFocusOrHover, + _nImageDisabled, + + _nImageCount = 4, + }; + + enum + { + ID_TIMER_FIRST = 1000, + ID_TIMER_REPEAT = 1001 + }; + + // Bitmap button specific extended styles + DWORD m_dwExtendedStyle; + + CImageList m_ImageList; + int m_nImage[_nImageCount]; + + CToolTipCtrl m_tip; + LPTSTR m_lpstrToolTipText; + + // Internal states + unsigned m_fMouseOver:1; + unsigned m_fFocus:1; + unsigned m_fPressed:1; + + +// Constructor/Destructor + CBitmapButtonImpl(DWORD dwExtendedStyle = BMPBTN_AUTOSIZE, HIMAGELIST hImageList = NULL) : + m_ImageList(hImageList), m_dwExtendedStyle(dwExtendedStyle), + m_lpstrToolTipText(NULL), + m_fMouseOver(0), m_fFocus(0), m_fPressed(0) + { + m_nImage[_nImageNormal] = -1; + m_nImage[_nImagePushed] = -1; + m_nImage[_nImageFocusOrHover] = -1; + m_nImage[_nImageDisabled] = -1; + } + + ~CBitmapButtonImpl() + { + if((m_dwExtendedStyle & BMPBTN_SHAREIMAGELISTS) == 0) + m_ImageList.Destroy(); + delete [] m_lpstrToolTipText; + } + + // overridden to provide proper initialization + BOOL SubclassWindow(HWND hWnd) + { +#if (_MSC_VER >= 1300) + BOOL bRet = ATL::CWindowImpl< T, TBase, TWinTraits>::SubclassWindow(hWnd); +#else // !(_MSC_VER >= 1300) + typedef ATL::CWindowImpl< T, TBase, TWinTraits> _baseClass; + BOOL bRet = _baseClass::SubclassWindow(hWnd); +#endif // !(_MSC_VER >= 1300) + if(bRet) + Init(); + return bRet; + } + +// Attributes + DWORD GetBitmapButtonExtendedStyle() const + { + return m_dwExtendedStyle; + } + + DWORD SetBitmapButtonExtendedStyle(DWORD dwExtendedStyle, DWORD dwMask = 0) + { + DWORD dwPrevStyle = m_dwExtendedStyle; + if(dwMask == 0) + m_dwExtendedStyle = dwExtendedStyle; + else + m_dwExtendedStyle = (m_dwExtendedStyle & ~dwMask) | (dwExtendedStyle & dwMask); + return dwPrevStyle; + } + + HIMAGELIST GetImageList() const + { + return m_ImageList; + } + + HIMAGELIST SetImageList(HIMAGELIST hImageList) + { + HIMAGELIST hImageListPrev = m_ImageList; + m_ImageList = hImageList; + if((m_dwExtendedStyle & BMPBTN_AUTOSIZE) != 0 && ::IsWindow(m_hWnd)) + SizeToImage(); + return hImageListPrev; + } + + int GetToolTipTextLength() const + { + return (m_lpstrToolTipText == NULL) ? -1 : lstrlen(m_lpstrToolTipText); + } + + bool GetToolTipText(LPTSTR lpstrText, int nLength) const + { + ATLASSERT(lpstrText != NULL); + if(m_lpstrToolTipText == NULL) + return false; + + errno_t nRet = SecureHelper::strncpy_x(lpstrText, nLength, m_lpstrToolTipText, _TRUNCATE); + + return (nRet == 0 || nRet == STRUNCATE); + } + + bool SetToolTipText(LPCTSTR lpstrText) + { + if(m_lpstrToolTipText != NULL) + { + delete [] m_lpstrToolTipText; + m_lpstrToolTipText = NULL; + } + + if(lpstrText == NULL) + { + if(m_tip.IsWindow()) + m_tip.Activate(FALSE); + return true; + } + + int cchLen = lstrlen(lpstrText) + 1; + ATLTRY(m_lpstrToolTipText = new TCHAR[cchLen]); + if(m_lpstrToolTipText == NULL) + return false; + + SecureHelper::strcpy_x(m_lpstrToolTipText, cchLen, lpstrText); + if(m_tip.IsWindow()) + { + m_tip.Activate(TRUE); + m_tip.AddTool(m_hWnd, m_lpstrToolTipText); + } + + return true; + } + +// Operations + void SetImages(int nNormal, int nPushed = -1, int nFocusOrHover = -1, int nDisabled = -1) + { + if(nNormal != -1) + m_nImage[_nImageNormal] = nNormal; + if(nPushed != -1) + m_nImage[_nImagePushed] = nPushed; + if(nFocusOrHover != -1) + m_nImage[_nImageFocusOrHover] = nFocusOrHover; + if(nDisabled != -1) + m_nImage[_nImageDisabled] = nDisabled; + } + + BOOL SizeToImage() + { + ATLASSERT(::IsWindow(m_hWnd) && m_ImageList.m_hImageList != NULL); + int cx = 0; + int cy = 0; + if(!m_ImageList.GetIconSize(cx, cy)) + return FALSE; + return ResizeClient(cx, cy); + } + +// Overrideables + void DoPaint(CDCHandle dc) + { + ATLASSERT(m_ImageList.m_hImageList != NULL); // image list must be set + ATLASSERT(m_nImage[0] != -1); // main bitmap must be set + + // set bitmap according to the current button state + int nImage = -1; + bool bHover = IsHoverMode(); + if(!IsWindowEnabled()) + nImage = m_nImage[_nImageDisabled]; + else if(m_fPressed == 1) + nImage = m_nImage[_nImagePushed]; + else if((!bHover && m_fFocus == 1) || (bHover && m_fMouseOver == 1)) + nImage = m_nImage[_nImageFocusOrHover]; + if(nImage == -1) // not there, use default one + nImage = m_nImage[_nImageNormal]; + + // draw the button image + int xyPos = 0; + if((m_fPressed == 1) && ((m_dwExtendedStyle & (BMPBTN_AUTO3D_SINGLE | BMPBTN_AUTO3D_DOUBLE)) != 0) && (m_nImage[_nImagePushed] == -1)) + xyPos = 1; + m_ImageList.Draw(dc, nImage, xyPos, xyPos, ILD_NORMAL); + + // draw 3D border if required + if((m_dwExtendedStyle & (BMPBTN_AUTO3D_SINGLE | BMPBTN_AUTO3D_DOUBLE)) != 0) + { + RECT rect; + GetClientRect(&rect); + + if(m_fPressed == 1) + dc.DrawEdge(&rect, ((m_dwExtendedStyle & BMPBTN_AUTO3D_SINGLE) != 0) ? BDR_SUNKENOUTER : EDGE_SUNKEN, BF_RECT); + else if(!bHover || m_fMouseOver == 1) + dc.DrawEdge(&rect, ((m_dwExtendedStyle & BMPBTN_AUTO3D_SINGLE) != 0) ? BDR_RAISEDINNER : EDGE_RAISED, BF_RECT); + + if(!bHover && m_fFocus == 1) + { + ::InflateRect(&rect, -2 * ::GetSystemMetrics(SM_CXEDGE), -2 * ::GetSystemMetrics(SM_CYEDGE)); + dc.DrawFocusRect(&rect); + } + } + } + +// Message map and handlers + BEGIN_MSG_MAP(CBitmapButtonImpl) + MESSAGE_HANDLER(WM_CREATE, OnCreate) + MESSAGE_HANDLER(WM_DESTROY, OnDestroy) + MESSAGE_RANGE_HANDLER(WM_MOUSEFIRST, WM_MOUSELAST, OnMouseMessage) + MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground) + MESSAGE_HANDLER(WM_PAINT, OnPaint) + MESSAGE_HANDLER(WM_PRINTCLIENT, OnPaint) + MESSAGE_HANDLER(WM_SETFOCUS, OnFocus) + MESSAGE_HANDLER(WM_KILLFOCUS, OnFocus) + MESSAGE_HANDLER(WM_LBUTTONDOWN, OnLButtonDown) + MESSAGE_HANDLER(WM_LBUTTONDBLCLK, OnLButtonDblClk) + MESSAGE_HANDLER(WM_LBUTTONUP, OnLButtonUp) + MESSAGE_HANDLER(WM_CAPTURECHANGED, OnCaptureChanged) + MESSAGE_HANDLER(WM_ENABLE, OnEnable) + MESSAGE_HANDLER(WM_MOUSEMOVE, OnMouseMove) + MESSAGE_HANDLER(WM_MOUSELEAVE, OnMouseLeave) + MESSAGE_HANDLER(WM_KEYDOWN, OnKeyDown) + MESSAGE_HANDLER(WM_KEYUP, OnKeyUp) + MESSAGE_HANDLER(WM_TIMER, OnTimer) + MESSAGE_HANDLER(WM_UPDATEUISTATE, OnUpdateUiState) + END_MSG_MAP() + + LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) + { + Init(); + bHandled = FALSE; + return 1; + } + + LRESULT OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) + { + if(m_tip.IsWindow()) + { + m_tip.DestroyWindow(); + m_tip.m_hWnd = NULL; + } + bHandled = FALSE; + return 1; + } + + LRESULT OnMouseMessage(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) + { + MSG msg = { m_hWnd, uMsg, wParam, lParam }; + if(m_tip.IsWindow()) + m_tip.RelayEvent(&msg); + bHandled = FALSE; + return 1; + } + + LRESULT OnEraseBackground(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) + { + return 1; // no background needed + } + + LRESULT OnPaint(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/) + { + T* pT = static_cast(this); + if(wParam != NULL) + { + pT->DoPaint((HDC)wParam); + } + else + { + CPaintDC dc(m_hWnd); + pT->DoPaint(dc.m_hDC); + } + return 0; + } + + LRESULT OnFocus(UINT uMsg, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) + { + m_fFocus = (uMsg == WM_SETFOCUS) ? 1 : 0; + Invalidate(); + UpdateWindow(); + bHandled = FALSE; + return 1; + } + + LRESULT OnLButtonDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) + { + LRESULT lRet = 0; + if(IsHoverMode()) + SetCapture(); + else + lRet = DefWindowProc(uMsg, wParam, lParam); + if(::GetCapture() == m_hWnd) + { + m_fPressed = 1; + Invalidate(); + UpdateWindow(); + } + if((m_dwExtendedStyle & BMPBTN_AUTOFIRE) != 0) + { + int nElapse = 250; + int nDelay = 0; + if(::SystemParametersInfo(SPI_GETKEYBOARDDELAY, 0, &nDelay, 0)) + nElapse += nDelay * 250; // all milli-seconds + SetTimer(ID_TIMER_FIRST, nElapse); + } + return lRet; + } + + LRESULT OnLButtonDblClk(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) + { + LRESULT lRet = 0; + if(!IsHoverMode()) + lRet = DefWindowProc(uMsg, wParam, lParam); + if(::GetCapture() != m_hWnd) + SetCapture(); + if(m_fPressed == 0) + { + m_fPressed = 1; + Invalidate(); + UpdateWindow(); + } + return lRet; + } + + LRESULT OnLButtonUp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) + { + LRESULT lRet = 0; + bool bHover = IsHoverMode(); + if(!bHover) + lRet = DefWindowProc(uMsg, wParam, lParam); + if(::GetCapture() == m_hWnd) + { + if(bHover && m_fPressed == 1) + ::SendMessage(GetParent(), WM_COMMAND, MAKEWPARAM(GetDlgCtrlID(), BN_CLICKED), (LPARAM)m_hWnd); + ::ReleaseCapture(); + } + return lRet; + } + + LRESULT OnCaptureChanged(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) + { + if(m_fPressed == 1) + { + m_fPressed = 0; + Invalidate(); + UpdateWindow(); + } + bHandled = FALSE; + return 1; + } + + LRESULT OnEnable(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) + { + Invalidate(); + UpdateWindow(); + bHandled = FALSE; + return 1; + } + + LRESULT OnMouseMove(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled) + { + if(::GetCapture() == m_hWnd) + { + POINT ptCursor = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; + ClientToScreen(&ptCursor); + RECT rect = { 0 }; + GetWindowRect(&rect); + unsigned int uPressed = ::PtInRect(&rect, ptCursor) ? 1 : 0; + if(m_fPressed != uPressed) + { + m_fPressed = uPressed; + Invalidate(); + UpdateWindow(); + } + } + else if(IsHoverMode() && m_fMouseOver == 0) + { + m_fMouseOver = 1; + Invalidate(); + UpdateWindow(); + StartTrackMouseLeave(); + } + bHandled = FALSE; + return 1; + } + + LRESULT OnMouseLeave(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) + { + if(m_fMouseOver == 1) + { + m_fMouseOver = 0; + Invalidate(); + UpdateWindow(); + } + return 0; + } + + LRESULT OnKeyDown(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) + { + if(wParam == VK_SPACE && IsHoverMode()) + return 0; // ignore if in hover mode + if(wParam == VK_SPACE && m_fPressed == 0) + { + m_fPressed = 1; + Invalidate(); + UpdateWindow(); + } + bHandled = FALSE; + return 1; + } + + LRESULT OnKeyUp(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) + { + if(wParam == VK_SPACE && IsHoverMode()) + return 0; // ignore if in hover mode + if(wParam == VK_SPACE && m_fPressed == 1) + { + m_fPressed = 0; + Invalidate(); + UpdateWindow(); + } + bHandled = FALSE; + return 1; + } + + LRESULT OnTimer(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/) + { + ATLASSERT((m_dwExtendedStyle & BMPBTN_AUTOFIRE) != 0); + switch(wParam) // timer ID + { + case ID_TIMER_FIRST: + KillTimer(ID_TIMER_FIRST); + if(m_fPressed == 1) + { + ::SendMessage(GetParent(), WM_COMMAND, MAKEWPARAM(GetDlgCtrlID(), BN_CLICKED), (LPARAM)m_hWnd); + int nElapse = 250; + int nRepeat = 40; + if(::SystemParametersInfo(SPI_GETKEYBOARDSPEED, 0, &nRepeat, 0)) + nElapse = 10000 / (10 * nRepeat + 25); // milli-seconds, approximated + SetTimer(ID_TIMER_REPEAT, nElapse); + } + break; + case ID_TIMER_REPEAT: + if(m_fPressed == 1) + ::SendMessage(GetParent(), WM_COMMAND, MAKEWPARAM(GetDlgCtrlID(), BN_CLICKED), (LPARAM)m_hWnd); + else if(::GetCapture() != m_hWnd) + KillTimer(ID_TIMER_REPEAT); + break; + default: // not our timer + break; + } + return 0; + } + + LRESULT OnUpdateUiState(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) + { + // If the control is subclassed or superclassed, this message can cause + // repainting without WM_PAINT. We don't use this state, so just do nothing. + return 0; + } + +// Implementation + void Init() + { + // We need this style to prevent Windows from painting the button + ModifyStyle(0, BS_OWNERDRAW); + + // create a tool tip + m_tip.Create(m_hWnd); + ATLASSERT(m_tip.IsWindow()); + if(m_tip.IsWindow() && m_lpstrToolTipText != NULL) + { + m_tip.Activate(TRUE); + m_tip.AddTool(m_hWnd, m_lpstrToolTipText); + } + + if(m_ImageList.m_hImageList != NULL && (m_dwExtendedStyle & BMPBTN_AUTOSIZE) != 0) + SizeToImage(); + } + + BOOL StartTrackMouseLeave() + { + TRACKMOUSEEVENT tme = { 0 }; + tme.cbSize = sizeof(tme); + tme.dwFlags = TME_LEAVE; + tme.hwndTrack = m_hWnd; + return _TrackMouseEvent(&tme); + } + + bool IsHoverMode() const + { + return ((m_dwExtendedStyle & BMPBTN_HOVER) != 0); + } +}; + + +class CBitmapButton : public CBitmapButtonImpl +{ +public: + DECLARE_WND_SUPERCLASS(_T("WTL_BitmapButton"), GetWndClassName()) + + CBitmapButton(DWORD dwExtendedStyle = BMPBTN_AUTOSIZE, HIMAGELIST hImageList = NULL) : + CBitmapButtonImpl(dwExtendedStyle, hImageList) + { } +}; + +#endif // !_WIN32_WCE + + +/////////////////////////////////////////////////////////////////////////////// +// CCheckListCtrlView - list view control with check boxes + +template +class CCheckListViewCtrlImplTraits +{ +public: + static DWORD GetWndStyle(DWORD dwStyle) + { + return (dwStyle == 0) ? t_dwStyle : dwStyle; + } + + static DWORD GetWndExStyle(DWORD dwExStyle) + { + return (dwExStyle == 0) ? t_dwExStyle : dwExStyle; + } + + static DWORD GetExtendedLVStyle() + { + return t_dwExListViewStyle; + } +}; + +typedef CCheckListViewCtrlImplTraits CCheckListViewCtrlTraits; + +template +class ATL_NO_VTABLE CCheckListViewCtrlImpl : public ATL::CWindowImpl +{ +public: + DECLARE_WND_SUPERCLASS(NULL, TBase::GetWndClassName()) + +// Attributes + static DWORD GetExtendedLVStyle() + { + return TWinTraits::GetExtendedLVStyle(); + } + +// Operations + BOOL SubclassWindow(HWND hWnd) + { +#if (_MSC_VER >= 1300) + BOOL bRet = ATL::CWindowImplBaseT< TBase, TWinTraits>::SubclassWindow(hWnd); +#else // !(_MSC_VER >= 1300) + typedef ATL::CWindowImplBaseT< TBase, TWinTraits> _baseClass; + BOOL bRet = _baseClass::SubclassWindow(hWnd); +#endif // !(_MSC_VER >= 1300) + if(bRet) + { + T* pT = static_cast(this); + pT; + ATLASSERT((pT->GetExtendedLVStyle() & LVS_EX_CHECKBOXES) != 0); + SetExtendedListViewStyle(pT->GetExtendedLVStyle()); + } + return bRet; + } + + void CheckSelectedItems(int nCurrItem) + { + // first check if this item is selected + LVITEM lvi = { 0 }; + lvi.iItem = nCurrItem; + lvi.iSubItem = 0; + lvi.mask = LVIF_STATE; + lvi.stateMask = LVIS_SELECTED; + GetItem(&lvi); + // if item is not selected, don't do anything + if(!(lvi.state & LVIS_SELECTED)) + return; + // new check state will be reverse of the current state, + BOOL bCheck = !GetCheckState(nCurrItem); + int nItem = -1; + int nOldItem = -1; + while((nItem = GetNextItem(nOldItem, LVNI_SELECTED)) != -1) + { + if(nItem != nCurrItem) + SetCheckState(nItem, bCheck); + nOldItem = nItem; + } + } + +// Implementation + BEGIN_MSG_MAP(CCheckListViewCtrlImpl) + MESSAGE_HANDLER(WM_CREATE, OnCreate) + MESSAGE_HANDLER(WM_LBUTTONDOWN, OnLButtonDown) + MESSAGE_HANDLER(WM_LBUTTONDBLCLK, OnLButtonDown) + MESSAGE_HANDLER(WM_KEYDOWN, OnKeyDown) + END_MSG_MAP() + + LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) + { + // first let list view control initialize everything + LRESULT lRet = DefWindowProc(uMsg, wParam, lParam); + T* pT = static_cast(this); + pT; + ATLASSERT((pT->GetExtendedLVStyle() & LVS_EX_CHECKBOXES) != 0); + SetExtendedListViewStyle(pT->GetExtendedLVStyle()); + return lRet; + } + + LRESULT OnLButtonDown(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled) + { + POINT ptMsg = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; + LVHITTESTINFO lvh = { 0 }; + lvh.pt = ptMsg; + if(HitTest(&lvh) != -1 && lvh.flags == LVHT_ONITEMSTATEICON && ::GetKeyState(VK_CONTROL) >= 0) + { + T* pT = static_cast(this); + pT->CheckSelectedItems(lvh.iItem); + } + bHandled = FALSE; + return 1; + } + + LRESULT OnKeyDown(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) + { + if(wParam == VK_SPACE) + { + int nCurrItem = GetNextItem(-1, LVNI_FOCUSED); + if(nCurrItem != -1 && ::GetKeyState(VK_CONTROL) >= 0) + { + T* pT = static_cast(this); + pT->CheckSelectedItems(nCurrItem); + } + } + bHandled = FALSE; + return 1; + } +}; + +class CCheckListViewCtrl : public CCheckListViewCtrlImpl +{ +public: + DECLARE_WND_SUPERCLASS(_T("WTL_CheckListView"), GetWndClassName()) +}; + + +/////////////////////////////////////////////////////////////////////////////// +// CHyperLink - hyper link control implementation + +#if (WINVER < 0x0500) && !defined(_WIN32_WCE) +__declspec(selectany) struct +{ + enum { cxWidth = 32, cyHeight = 32 }; + int xHotSpot; + int yHotSpot; + unsigned char arrANDPlane[cxWidth * cyHeight / 8]; + unsigned char arrXORPlane[cxWidth * cyHeight / 8]; +} _AtlHyperLink_CursorData = +{ + 5, 0, + { + 0xF9, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, + 0xF0, 0xFF, 0xFF, 0xFF, 0xF0, 0x3F, 0xFF, 0xFF, 0xF0, 0x07, 0xFF, 0xFF, 0xF0, 0x01, 0xFF, 0xFF, + 0xF0, 0x00, 0xFF, 0xFF, 0x10, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x7F, 0xFF, + 0x80, 0x00, 0x7F, 0xFF, 0xC0, 0x00, 0x7F, 0xFF, 0xC0, 0x00, 0x7F, 0xFF, 0xE0, 0x00, 0x7F, 0xFF, + 0xE0, 0x00, 0xFF, 0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0xF8, 0x01, 0xFF, 0xFF, + 0xF8, 0x01, 0xFF, 0xFF, 0xF8, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF + }, + { + 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0xC0, 0x00, 0x00, 0x06, 0xD8, 0x00, 0x00, + 0x06, 0xDA, 0x00, 0x00, 0x06, 0xDB, 0x00, 0x00, 0x67, 0xFB, 0x00, 0x00, 0x77, 0xFF, 0x00, 0x00, + 0x37, 0xFF, 0x00, 0x00, 0x17, 0xFF, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x00, + 0x0F, 0xFE, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, + 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + } +}; +#endif // (WINVER < 0x0500) && !defined(_WIN32_WCE) + +#define HLINK_UNDERLINED 0x00000000 +#define HLINK_NOTUNDERLINED 0x00000001 +#define HLINK_UNDERLINEHOVER 0x00000002 +#define HLINK_COMMANDBUTTON 0x00000004 +#define HLINK_NOTIFYBUTTON 0x0000000C +#define HLINK_USETAGS 0x00000010 +#define HLINK_USETAGSBOLD 0x00000030 +#define HLINK_NOTOOLTIP 0x00000040 + +// Notes: +// - HLINK_USETAGS and HLINK_USETAGSBOLD are always left-aligned +// - When HLINK_USETAGSBOLD is used, the underlined styles will be ignored + +template +class ATL_NO_VTABLE CHyperLinkImpl : public ATL::CWindowImpl< T, TBase, TWinTraits > +{ +public: + LPTSTR m_lpstrLabel; + LPTSTR m_lpstrHyperLink; + + HCURSOR m_hCursor; + HFONT m_hFont; + HFONT m_hFontNormal; + + RECT m_rcLink; +#ifndef _WIN32_WCE + CToolTipCtrl m_tip; +#endif // !_WIN32_WCE + + COLORREF m_clrLink; + COLORREF m_clrVisited; + + DWORD m_dwExtendedStyle; // Hyper Link specific extended styles + + bool m_bPaintLabel:1; + bool m_bVisited:1; + bool m_bHover:1; + bool m_bInternalLinkFont:1; + + +// Constructor/Destructor + CHyperLinkImpl(DWORD dwExtendedStyle = HLINK_UNDERLINED) : + m_lpstrLabel(NULL), m_lpstrHyperLink(NULL), + m_hCursor(NULL), m_hFont(NULL), m_hFontNormal(NULL), + m_clrLink(RGB(0, 0, 255)), m_clrVisited(RGB(128, 0, 128)), + m_dwExtendedStyle(dwExtendedStyle), + m_bPaintLabel(true), m_bVisited(false), + m_bHover(false), m_bInternalLinkFont(false) + { + ::SetRectEmpty(&m_rcLink); + } + + ~CHyperLinkImpl() + { + delete [] m_lpstrLabel; + delete [] m_lpstrHyperLink; + if(m_bInternalLinkFont && m_hFont != NULL) + ::DeleteObject(m_hFont); +#if (WINVER < 0x0500) && !defined(_WIN32_WCE) + // It was created, not loaded, so we have to destroy it + if(m_hCursor != NULL) + ::DestroyCursor(m_hCursor); +#endif // (WINVER < 0x0500) && !defined(_WIN32_WCE) + } + +// Attributes + DWORD GetHyperLinkExtendedStyle() const + { + return m_dwExtendedStyle; + } + + DWORD SetHyperLinkExtendedStyle(DWORD dwExtendedStyle, DWORD dwMask = 0) + { + DWORD dwPrevStyle = m_dwExtendedStyle; + if(dwMask == 0) + m_dwExtendedStyle = dwExtendedStyle; + else + m_dwExtendedStyle = (m_dwExtendedStyle & ~dwMask) | (dwExtendedStyle & dwMask); + return dwPrevStyle; + } + + bool GetLabel(LPTSTR lpstrBuffer, int nLength) const + { + if(m_lpstrLabel == NULL) + return false; + ATLASSERT(lpstrBuffer != NULL); + if(nLength <= lstrlen(m_lpstrLabel)) + return false; + + SecureHelper::strcpy_x(lpstrBuffer, nLength, m_lpstrLabel); + + return true; + } + + bool SetLabel(LPCTSTR lpstrLabel) + { + delete [] m_lpstrLabel; + m_lpstrLabel = NULL; + int cchLen = lstrlen(lpstrLabel) + 1; + ATLTRY(m_lpstrLabel = new TCHAR[cchLen]); + if(m_lpstrLabel == NULL) + return false; + + SecureHelper::strcpy_x(m_lpstrLabel, cchLen, lpstrLabel); + T* pT = static_cast(this); + pT->CalcLabelRect(); + + if(m_hWnd != NULL) + SetWindowText(lpstrLabel); // Set this for accessibility + + return true; + } + + bool GetHyperLink(LPTSTR lpstrBuffer, int nLength) const + { + if(m_lpstrHyperLink == NULL) + return false; + ATLASSERT(lpstrBuffer != NULL); + if(nLength <= lstrlen(m_lpstrHyperLink)) + return false; + + SecureHelper::strcpy_x(lpstrBuffer, nLength, m_lpstrHyperLink); + + return true; + } + + bool SetHyperLink(LPCTSTR lpstrLink) + { + delete [] m_lpstrHyperLink; + m_lpstrHyperLink = NULL; + int cchLen = lstrlen(lpstrLink) + 1; + ATLTRY(m_lpstrHyperLink = new TCHAR[cchLen]); + if(m_lpstrHyperLink == NULL) + return false; + + SecureHelper::strcpy_x(m_lpstrHyperLink, cchLen, lpstrLink); + if(m_lpstrLabel == NULL) + { + T* pT = static_cast(this); + pT->CalcLabelRect(); + } +#ifndef _WIN32_WCE + if(m_tip.IsWindow()) + { + m_tip.Activate(TRUE); + m_tip.AddTool(m_hWnd, m_lpstrHyperLink, &m_rcLink, 1); + } +#endif // !_WIN32_WCE + return true; + } + + HFONT GetLinkFont() const + { + return m_hFont; + } + + void SetLinkFont(HFONT hFont) + { + if(m_bInternalLinkFont && m_hFont != NULL) + { + ::DeleteObject(m_hFont); + m_bInternalLinkFont = false; + } + m_hFont = hFont; + } + + int GetIdealHeight() const + { + ATLASSERT(::IsWindow(m_hWnd)); + if(m_lpstrLabel == NULL && m_lpstrHyperLink == NULL) + return -1; + if(!m_bPaintLabel) + return -1; + + CClientDC dc(m_hWnd); + RECT rect = { 0 }; + GetClientRect(&rect); + HFONT hFontOld = dc.SelectFont(m_hFontNormal); + RECT rcText = rect; + dc.DrawText(_T("NS"), -1, &rcText, DT_LEFT | DT_WORDBREAK | DT_CALCRECT); + dc.SelectFont(m_hFont); + RECT rcLink = rect; + dc.DrawText(_T("NS"), -1, &rcLink, DT_LEFT | DT_WORDBREAK | DT_CALCRECT); + dc.SelectFont(hFontOld); + return max(rcText.bottom - rcText.top, rcLink.bottom - rcLink.top); + } + + bool GetIdealSize(SIZE& size) const + { + int cx = 0, cy = 0; + bool bRet = GetIdealSize(cx, cy); + if(bRet) + { + size.cx = cx; + size.cy = cy; + } + return bRet; + } + + bool GetIdealSize(int& cx, int& cy) const + { + ATLASSERT(::IsWindow(m_hWnd)); + if(m_lpstrLabel == NULL && m_lpstrHyperLink == NULL) + return false; + if(!m_bPaintLabel) + return false; + + CClientDC dc(m_hWnd); + RECT rcClient = { 0 }; + GetClientRect(&rcClient); + RECT rcAll = rcClient; + + if(IsUsingTags()) + { + // find tags and label parts + LPTSTR lpstrLeft = NULL; + int cchLeft = 0; + LPTSTR lpstrLink = NULL; + int cchLink = 0; + LPTSTR lpstrRight = NULL; + int cchRight = 0; + + const T* pT = static_cast(this); + pT->CalcLabelParts(lpstrLeft, cchLeft, lpstrLink, cchLink, lpstrRight, cchRight); + + // get label part rects + HFONT hFontOld = dc.SelectFont(m_hFontNormal); + RECT rcLeft = rcClient; + dc.DrawText(lpstrLeft, cchLeft, &rcLeft, DT_LEFT | DT_WORDBREAK | DT_CALCRECT); + + dc.SelectFont(m_hFont); + RECT rcLink = { rcLeft.right, rcLeft.top, rcClient.right, rcClient.bottom }; + dc.DrawText(lpstrLink, cchLink, &rcLink, DT_LEFT | DT_WORDBREAK | DT_CALCRECT); + + dc.SelectFont(m_hFontNormal); + RECT rcRight = { rcLink.right, rcLink.top, rcClient.right, rcClient.bottom }; + dc.DrawText(lpstrRight, cchRight, &rcRight, DT_LEFT | DT_WORDBREAK | DT_CALCRECT); + + dc.SelectFont(hFontOld); + + int cyMax = max(rcLeft.bottom, max(rcLink.bottom, rcRight.bottom)); + ::SetRect(&rcAll, rcLeft.left, rcLeft.top, rcRight.right, cyMax); + } + else + { + HFONT hOldFont = NULL; + if(m_hFont != NULL) + hOldFont = dc.SelectFont(m_hFont); + LPTSTR lpstrText = (m_lpstrLabel != NULL) ? m_lpstrLabel : m_lpstrHyperLink; + DWORD dwStyle = GetStyle(); + int nDrawStyle = DT_LEFT; + if (dwStyle & SS_CENTER) + nDrawStyle = DT_CENTER; + else if (dwStyle & SS_RIGHT) + nDrawStyle = DT_RIGHT; + dc.DrawText(lpstrText, -1, &rcAll, nDrawStyle | DT_WORDBREAK | DT_CALCRECT); + if(m_hFont != NULL) + dc.SelectFont(hOldFont); + if (dwStyle & SS_CENTER) + { + int dx = (rcClient.right - rcAll.right) / 2; + ::OffsetRect(&rcAll, dx, 0); + } + else if (dwStyle & SS_RIGHT) + { + int dx = rcClient.right - rcAll.right; + ::OffsetRect(&rcAll, dx, 0); + } + } + + cx = rcAll.right - rcAll.left; + cy = rcAll.bottom - rcAll.top; + + return true; + } + + // for command buttons only + bool GetToolTipText(LPTSTR lpstrBuffer, int nLength) const + { + ATLASSERT(IsCommandButton()); + return GetHyperLink(lpstrBuffer, nLength); + } + + bool SetToolTipText(LPCTSTR lpstrToolTipText) + { + ATLASSERT(IsCommandButton()); + return SetHyperLink(lpstrToolTipText); + } + +// Operations + BOOL SubclassWindow(HWND hWnd) + { + ATLASSERT(m_hWnd == NULL); + ATLASSERT(::IsWindow(hWnd)); +#if (_MSC_VER >= 1300) + BOOL bRet = ATL::CWindowImpl< T, TBase, TWinTraits>::SubclassWindow(hWnd); +#else // !(_MSC_VER >= 1300) + typedef ATL::CWindowImpl< T, TBase, TWinTraits> _baseClass; + BOOL bRet = _baseClass::SubclassWindow(hWnd); +#endif // !(_MSC_VER >= 1300) + if(bRet) + { + T* pT = static_cast(this); + pT->Init(); + } + return bRet; + } + + bool Navigate() + { + ATLASSERT(::IsWindow(m_hWnd)); + bool bRet = true; + if(IsNotifyButton()) + { + NMHDR nmhdr = { m_hWnd, GetDlgCtrlID(), NM_CLICK }; + ::SendMessage(GetParent(), WM_NOTIFY, GetDlgCtrlID(), (LPARAM)&nmhdr); + } + else if(IsCommandButton()) + { + ::SendMessage(GetParent(), WM_COMMAND, MAKEWPARAM(GetDlgCtrlID(), BN_CLICKED), (LPARAM)m_hWnd); + } + else + { + ATLASSERT(m_lpstrHyperLink != NULL); +#ifndef _WIN32_WCE + DWORD_PTR dwRet = (DWORD_PTR)::ShellExecute(0, _T("open"), m_lpstrHyperLink, 0, 0, SW_SHOWNORMAL); + bRet = (dwRet > 32); +#else // CE specific + SHELLEXECUTEINFO shExeInfo = { sizeof(SHELLEXECUTEINFO), 0, 0, L"open", m_lpstrHyperLink, 0, 0, SW_SHOWNORMAL, 0, 0, 0, 0, 0, 0, 0 }; + ::ShellExecuteEx(&shExeInfo); + DWORD_PTR dwRet = (DWORD_PTR)shExeInfo.hInstApp; + bRet = (dwRet == 0) || (dwRet > 32); +#endif // _WIN32_WCE + ATLASSERT(bRet); + if(bRet) + { + m_bVisited = true; + Invalidate(); + } + } + return bRet; + } + +// Message map and handlers + BEGIN_MSG_MAP(CHyperLinkImpl) + MESSAGE_HANDLER(WM_CREATE, OnCreate) +#ifndef _WIN32_WCE + MESSAGE_HANDLER(WM_DESTROY, OnDestroy) + MESSAGE_RANGE_HANDLER(WM_MOUSEFIRST, WM_MOUSELAST, OnMouseMessage) +#endif // !_WIN32_WCE + MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground) + MESSAGE_HANDLER(WM_PAINT, OnPaint) +#ifndef _WIN32_WCE + MESSAGE_HANDLER(WM_PRINTCLIENT, OnPaint) +#endif // !_WIN32_WCE + MESSAGE_HANDLER(WM_SETFOCUS, OnFocus) + MESSAGE_HANDLER(WM_KILLFOCUS, OnFocus) + MESSAGE_HANDLER(WM_MOUSEMOVE, OnMouseMove) +#ifndef _WIN32_WCE + MESSAGE_HANDLER(WM_MOUSELEAVE, OnMouseLeave) +#endif // !_WIN32_WCE + MESSAGE_HANDLER(WM_LBUTTONDOWN, OnLButtonDown) + MESSAGE_HANDLER(WM_LBUTTONUP, OnLButtonUp) + MESSAGE_HANDLER(WM_CHAR, OnChar) + MESSAGE_HANDLER(WM_GETDLGCODE, OnGetDlgCode) + MESSAGE_HANDLER(WM_SETCURSOR, OnSetCursor) + MESSAGE_HANDLER(WM_ENABLE, OnEnable) + MESSAGE_HANDLER(WM_GETFONT, OnGetFont) + MESSAGE_HANDLER(WM_SETFONT, OnSetFont) + MESSAGE_HANDLER(WM_UPDATEUISTATE, OnUpdateUiState) + MESSAGE_HANDLER(WM_SIZE, OnSize) + END_MSG_MAP() + + LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) + { + T* pT = static_cast(this); + pT->Init(); + return 0; + } + +#ifndef _WIN32_WCE + LRESULT OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) + { + if(m_tip.IsWindow()) + { + m_tip.DestroyWindow(); + m_tip.m_hWnd = NULL; + } + bHandled = FALSE; + return 1; + } + + LRESULT OnMouseMessage(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) + { + MSG msg = { m_hWnd, uMsg, wParam, lParam }; + if(m_tip.IsWindow() && IsUsingToolTip()) + m_tip.RelayEvent(&msg); + bHandled = FALSE; + return 1; + } +#endif // !_WIN32_WCE + + LRESULT OnEraseBackground(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) + { + return 1; // no background painting needed (we do it all during WM_PAINT) + } + + LRESULT OnPaint(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) + { + if(!m_bPaintLabel) + { + bHandled = FALSE; + return 1; + } + + T* pT = static_cast(this); + if(wParam != NULL) + { + pT->DoEraseBackground((HDC)wParam); + pT->DoPaint((HDC)wParam); + } + else + { + CPaintDC dc(m_hWnd); + pT->DoEraseBackground(dc.m_hDC); + pT->DoPaint(dc.m_hDC); + } + + return 0; + } + + LRESULT OnFocus(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) + { + if(m_bPaintLabel) + Invalidate(); + else + bHandled = FALSE; + return 0; + } + + LRESULT OnMouseMove(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled) + { + POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; + if((m_lpstrHyperLink != NULL || IsCommandButton()) && ::PtInRect(&m_rcLink, pt)) + { + ::SetCursor(m_hCursor); + if(IsUnderlineHover()) + { + if(!m_bHover) + { + m_bHover = true; + InvalidateRect(&m_rcLink); + UpdateWindow(); +#ifndef _WIN32_WCE + StartTrackMouseLeave(); +#endif // !_WIN32_WCE + } + } + } + else + { + if(IsUnderlineHover()) + { + if(m_bHover) + { + m_bHover = false; + InvalidateRect(&m_rcLink); + UpdateWindow(); + } + } + bHandled = FALSE; + } + return 0; + } + +#ifndef _WIN32_WCE + LRESULT OnMouseLeave(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) + { + if(IsUnderlineHover() && m_bHover) + { + m_bHover = false; + InvalidateRect(&m_rcLink); + UpdateWindow(); + } + return 0; + } +#endif // !_WIN32_WCE + + LRESULT OnLButtonDown(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/) + { + POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; + if(::PtInRect(&m_rcLink, pt)) + { + SetFocus(); + SetCapture(); + } + return 0; + } + + LRESULT OnLButtonUp(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/) + { + if(GetCapture() == m_hWnd) + { + ReleaseCapture(); + POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; + if(::PtInRect(&m_rcLink, pt)) + { + T* pT = static_cast(this); + pT->Navigate(); + } + } + return 0; + } + + LRESULT OnChar(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/) + { + if(wParam == VK_RETURN || wParam == VK_SPACE) + { + T* pT = static_cast(this); + pT->Navigate(); + } + return 0; + } + + LRESULT OnGetDlgCode(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) + { + return DLGC_WANTCHARS; + } + + LRESULT OnSetCursor(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) + { + POINT pt = { 0, 0 }; + GetCursorPos(&pt); + ScreenToClient(&pt); + if((m_lpstrHyperLink != NULL || IsCommandButton()) && ::PtInRect(&m_rcLink, pt)) + { + return TRUE; + } + bHandled = FALSE; + return FALSE; + } + + LRESULT OnEnable(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) + { + Invalidate(); + UpdateWindow(); + return 0; + } + + LRESULT OnGetFont(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) + { + return (LRESULT)m_hFontNormal; + } + + LRESULT OnSetFont(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) + { + m_hFontNormal = (HFONT)wParam; + if((BOOL)lParam) + { + Invalidate(); + UpdateWindow(); + } + return 0; + } + + LRESULT OnUpdateUiState(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) + { + // If the control is subclassed or superclassed, this message can cause + // repainting without WM_PAINT. We don't use this state, so just do nothing. + return 0; + } + + LRESULT OnSize(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) + { + T* pT = static_cast(this); + pT->CalcLabelRect(); + pT->Invalidate(); + return 0; + } + +// Implementation + void Init() + { + ATLASSERT(::IsWindow(m_hWnd)); + + // Check if we should paint a label + const int cchBuff = 8; + TCHAR szBuffer[cchBuff] = { 0 }; + if(::GetClassName(m_hWnd, szBuffer, cchBuff)) + { + if(lstrcmpi(szBuffer, _T("static")) == 0) + { + ModifyStyle(0, SS_NOTIFY); // we need this + DWORD dwStyle = GetStyle() & 0x000000FF; +#ifndef _WIN32_WCE + if(dwStyle == SS_ICON || dwStyle == SS_BLACKRECT || dwStyle == SS_GRAYRECT || + dwStyle == SS_WHITERECT || dwStyle == SS_BLACKFRAME || dwStyle == SS_GRAYFRAME || + dwStyle == SS_WHITEFRAME || dwStyle == SS_OWNERDRAW || + dwStyle == SS_BITMAP || dwStyle == SS_ENHMETAFILE) +#else // CE specific + if(dwStyle == SS_ICON || dwStyle == SS_BITMAP) +#endif // _WIN32_WCE + m_bPaintLabel = false; + } + } + + // create or load a cursor +#if (WINVER >= 0x0500) || defined(_WIN32_WCE) + m_hCursor = ::LoadCursor(NULL, IDC_HAND); +#else + m_hCursor = ::CreateCursor(ModuleHelper::GetModuleInstance(), _AtlHyperLink_CursorData.xHotSpot, _AtlHyperLink_CursorData.yHotSpot, _AtlHyperLink_CursorData.cxWidth, _AtlHyperLink_CursorData.cyHeight, _AtlHyperLink_CursorData.arrANDPlane, _AtlHyperLink_CursorData.arrXORPlane); +#endif + ATLASSERT(m_hCursor != NULL); + + // set font + if(m_bPaintLabel) + { + ATL::CWindow wnd = GetParent(); + m_hFontNormal = wnd.GetFont(); + if(m_hFontNormal == NULL) + m_hFontNormal = (HFONT)::GetStockObject(SYSTEM_FONT); + if(m_hFontNormal != NULL && m_hFont == NULL) + { + LOGFONT lf = { 0 }; + CFontHandle font = m_hFontNormal; + font.GetLogFont(&lf); + if(IsUsingTagsBold()) + lf.lfWeight = FW_BOLD; + else if(!IsNotUnderlined()) + lf.lfUnderline = TRUE; + m_hFont = ::CreateFontIndirect(&lf); + m_bInternalLinkFont = true; + ATLASSERT(m_hFont != NULL); + } + } + +#ifndef _WIN32_WCE + // create a tool tip + m_tip.Create(m_hWnd); + ATLASSERT(m_tip.IsWindow()); +#endif // !_WIN32_WCE + + // set label (defaults to window text) + if(m_lpstrLabel == NULL) + { + int nLen = GetWindowTextLength(); + if(nLen > 0) + { + CTempBuffer buff; + LPTSTR lpstrText = buff.Allocate(nLen + 1); + ATLASSERT(lpstrText != NULL); + if((lpstrText != NULL) && (GetWindowText(lpstrText, nLen + 1) > 0)) + SetLabel(lpstrText); + } + } + + T* pT = static_cast(this); + pT->CalcLabelRect(); + + // set hyperlink (defaults to label), or just activate tool tip if already set + if(m_lpstrHyperLink == NULL && !IsCommandButton()) + { + if(m_lpstrLabel != NULL) + SetHyperLink(m_lpstrLabel); + } +#ifndef _WIN32_WCE + else + { + m_tip.Activate(TRUE); + m_tip.AddTool(m_hWnd, m_lpstrHyperLink, &m_rcLink, 1); + } +#endif // !_WIN32_WCE + + // set link colors + if(m_bPaintLabel) + { + ATL::CRegKey rk; + LONG lRet = rk.Open(HKEY_CURRENT_USER, _T("Software\\Microsoft\\Internet Explorer\\Settings")); + if(lRet == 0) + { + const int cchValue = 12; + TCHAR szValue[cchValue] = { 0 }; +#if (_ATL_VER >= 0x0700) + ULONG ulCount = cchValue; + lRet = rk.QueryStringValue(_T("Anchor Color"), szValue, &ulCount); +#else + DWORD dwCount = cchValue * sizeof(TCHAR); + lRet = rk.QueryValue(szValue, _T("Anchor Color"), &dwCount); +#endif + if(lRet == 0) + { + COLORREF clr = pT->_ParseColorString(szValue); + ATLASSERT(clr != CLR_INVALID); + if(clr != CLR_INVALID) + m_clrLink = clr; + } + +#if (_ATL_VER >= 0x0700) + ulCount = cchValue; + lRet = rk.QueryStringValue(_T("Anchor Color Visited"), szValue, &ulCount); +#else + dwCount = cchValue * sizeof(TCHAR); + lRet = rk.QueryValue(szValue, _T("Anchor Color Visited"), &dwCount); +#endif + if(lRet == 0) + { + COLORREF clr = pT->_ParseColorString(szValue); + ATLASSERT(clr != CLR_INVALID); + if(clr != CLR_INVALID) + m_clrVisited = clr; + } + } + } + } + + static COLORREF _ParseColorString(LPTSTR lpstr) + { + int c[3] = { -1, -1, -1 }; + LPTSTR p = NULL; + for(int i = 0; i < 2; i++) + { + for(p = lpstr; *p != _T('\0'); p = ::CharNext(p)) + { + if(*p == _T(',')) + { + *p = _T('\0'); + c[i] = T::_xttoi(lpstr); + lpstr = &p[1]; + break; + } + } + if(c[i] == -1) + return CLR_INVALID; + } + if(*lpstr == _T('\0')) + return CLR_INVALID; + c[2] = T::_xttoi(lpstr); + + return RGB(c[0], c[1], c[2]); + } + + bool CalcLabelRect() + { + if(!::IsWindow(m_hWnd)) + return false; + if(m_lpstrLabel == NULL && m_lpstrHyperLink == NULL) + return false; + + CClientDC dc(m_hWnd); + RECT rcClient = { 0 }; + GetClientRect(&rcClient); + m_rcLink = rcClient; + if(!m_bPaintLabel) + return true; + + if(IsUsingTags()) + { + // find tags and label parts + LPTSTR lpstrLeft = NULL; + int cchLeft = 0; + LPTSTR lpstrLink = NULL; + int cchLink = 0; + LPTSTR lpstrRight = NULL; + int cchRight = 0; + + T* pT = static_cast(this); + pT->CalcLabelParts(lpstrLeft, cchLeft, lpstrLink, cchLink, lpstrRight, cchRight); + ATLASSERT(lpstrLink != NULL); + ATLASSERT(cchLink > 0); + + // get label part rects + HFONT hFontOld = dc.SelectFont(m_hFontNormal); + + RECT rcLeft = rcClient; + if(lpstrLeft != NULL) + dc.DrawText(lpstrLeft, cchLeft, &rcLeft, DT_LEFT | DT_WORDBREAK | DT_CALCRECT); + + dc.SelectFont(m_hFont); + RECT rcLink = rcClient; + if(lpstrLeft != NULL) + rcLink.left = rcLeft.right; + dc.DrawText(lpstrLink, cchLink, &rcLink, DT_LEFT | DT_WORDBREAK | DT_CALCRECT); + + dc.SelectFont(hFontOld); + + m_rcLink = rcLink; + } + else + { + HFONT hOldFont = NULL; + if(m_hFont != NULL) + hOldFont = dc.SelectFont(m_hFont); + LPTSTR lpstrText = (m_lpstrLabel != NULL) ? m_lpstrLabel : m_lpstrHyperLink; + DWORD dwStyle = GetStyle(); + int nDrawStyle = DT_LEFT; + if (dwStyle & SS_CENTER) + nDrawStyle = DT_CENTER; + else if (dwStyle & SS_RIGHT) + nDrawStyle = DT_RIGHT; + dc.DrawText(lpstrText, -1, &m_rcLink, nDrawStyle | DT_WORDBREAK | DT_CALCRECT); + if(m_hFont != NULL) + dc.SelectFont(hOldFont); + if (dwStyle & SS_CENTER) + { + int dx = (rcClient.right - m_rcLink.right) / 2; + ::OffsetRect(&m_rcLink, dx, 0); + } + else if (dwStyle & SS_RIGHT) + { + int dx = rcClient.right - m_rcLink.right; + ::OffsetRect(&m_rcLink, dx, 0); + } + } + + return true; + } + + void CalcLabelParts(LPTSTR& lpstrLeft, int& cchLeft, LPTSTR& lpstrLink, int& cchLink, LPTSTR& lpstrRight, int& cchRight) const + { + lpstrLeft = NULL; + cchLeft = 0; + lpstrLink = NULL; + cchLink = 0; + lpstrRight = NULL; + cchRight = 0; + + LPTSTR lpstrText = (m_lpstrLabel != NULL) ? m_lpstrLabel : m_lpstrHyperLink; + int cchText = lstrlen(lpstrText); + bool bOutsideLink = true; + for(int i = 0; i < cchText; i++) + { + if(lpstrText[i] != _T('<')) + continue; + + if(bOutsideLink) + { + if(::CompareString(LOCALE_USER_DEFAULT, NORM_IGNORECASE, &lpstrText[i], 3, _T(""), 3) == CSTR_EQUAL) + { + if(i > 0) + { + lpstrLeft = lpstrText; + cchLeft = i; + } + lpstrLink = &lpstrText[i + 3]; + bOutsideLink = false; + } + } + else + { + if(::CompareString(LOCALE_USER_DEFAULT, NORM_IGNORECASE, &lpstrText[i], 4, _T(""), 4) == CSTR_EQUAL) + { + cchLink = i - 3 - cchLeft; + if(lpstrText[i + 4] != 0) + { + lpstrRight = &lpstrText[i + 4]; + cchRight = cchText - (i + 4); + break; + } + } + } + } + + } + + void DoEraseBackground(CDCHandle dc) + { + HBRUSH hBrush = (HBRUSH)::SendMessage(GetParent(), WM_CTLCOLORSTATIC, (WPARAM)dc.m_hDC, (LPARAM)m_hWnd); + if(hBrush != NULL) + { + RECT rect = { 0 }; + GetClientRect(&rect); + dc.FillRect(&rect, hBrush); + } + } + + void DoPaint(CDCHandle dc) + { + if(IsUsingTags()) + { + // find tags and label parts + LPTSTR lpstrLeft = NULL; + int cchLeft = 0; + LPTSTR lpstrLink = NULL; + int cchLink = 0; + LPTSTR lpstrRight = NULL; + int cchRight = 0; + + T* pT = static_cast(this); + pT->CalcLabelParts(lpstrLeft, cchLeft, lpstrLink, cchLink, lpstrRight, cchRight); + + // get label part rects + RECT rcClient = { 0 }; + GetClientRect(&rcClient); + + dc.SetBkMode(TRANSPARENT); + HFONT hFontOld = dc.SelectFont(m_hFontNormal); + + if(lpstrLeft != NULL) + dc.DrawText(lpstrLeft, cchLeft, &rcClient, DT_LEFT | DT_WORDBREAK); + + COLORREF clrOld = dc.SetTextColor(IsWindowEnabled() ? (m_bVisited ? m_clrVisited : m_clrLink) : (::GetSysColor(COLOR_GRAYTEXT))); + if(m_hFont != NULL && (!IsUnderlineHover() || (IsUnderlineHover() && m_bHover))) + dc.SelectFont(m_hFont); + else + dc.SelectFont(m_hFontNormal); + + dc.DrawText(lpstrLink, cchLink, &m_rcLink, DT_LEFT | DT_WORDBREAK); + + dc.SetTextColor(clrOld); + dc.SelectFont(m_hFontNormal); + if(lpstrRight != NULL) + { + RECT rcRight = { m_rcLink.right, m_rcLink.top, rcClient.right, rcClient.bottom }; + dc.DrawText(lpstrRight, cchRight, &rcRight, DT_LEFT | DT_WORDBREAK); + } + + if(GetFocus() == m_hWnd) + dc.DrawFocusRect(&m_rcLink); + + dc.SelectFont(hFontOld); + } + else + { + dc.SetBkMode(TRANSPARENT); + COLORREF clrOld = dc.SetTextColor(IsWindowEnabled() ? (m_bVisited ? m_clrVisited : m_clrLink) : (::GetSysColor(COLOR_GRAYTEXT))); + + HFONT hFontOld = NULL; + if(m_hFont != NULL && (!IsUnderlineHover() || (IsUnderlineHover() && m_bHover))) + hFontOld = dc.SelectFont(m_hFont); + else + hFontOld = dc.SelectFont(m_hFontNormal); + + LPTSTR lpstrText = (m_lpstrLabel != NULL) ? m_lpstrLabel : m_lpstrHyperLink; + + DWORD dwStyle = GetStyle(); + int nDrawStyle = DT_LEFT; + if (dwStyle & SS_CENTER) + nDrawStyle = DT_CENTER; + else if (dwStyle & SS_RIGHT) + nDrawStyle = DT_RIGHT; + + dc.DrawText(lpstrText, -1, &m_rcLink, nDrawStyle | DT_WORDBREAK); + + if(GetFocus() == m_hWnd) + dc.DrawFocusRect(&m_rcLink); + + dc.SetTextColor(clrOld); + dc.SelectFont(hFontOld); + } + } + +#ifndef _WIN32_WCE + BOOL StartTrackMouseLeave() + { + TRACKMOUSEEVENT tme = { 0 }; + tme.cbSize = sizeof(tme); + tme.dwFlags = TME_LEAVE; + tme.hwndTrack = m_hWnd; + return _TrackMouseEvent(&tme); + } +#endif // !_WIN32_WCE + +// Implementation helpers + bool IsUnderlined() const + { + return ((m_dwExtendedStyle & (HLINK_NOTUNDERLINED | HLINK_UNDERLINEHOVER)) == 0); + } + + bool IsNotUnderlined() const + { + return ((m_dwExtendedStyle & HLINK_NOTUNDERLINED) != 0); + } + + bool IsUnderlineHover() const + { + return ((m_dwExtendedStyle & HLINK_UNDERLINEHOVER) != 0); + } + + bool IsCommandButton() const + { + return ((m_dwExtendedStyle & HLINK_COMMANDBUTTON) != 0); + } + + bool IsNotifyButton() const + { + return ((m_dwExtendedStyle & HLINK_NOTIFYBUTTON) == HLINK_NOTIFYBUTTON); + } + + bool IsUsingTags() const + { + return ((m_dwExtendedStyle & HLINK_USETAGS) != 0); + } + + bool IsUsingTagsBold() const + { + return ((m_dwExtendedStyle & HLINK_USETAGSBOLD) == HLINK_USETAGSBOLD); + } + + bool IsUsingToolTip() const + { + return ((m_dwExtendedStyle & HLINK_NOTOOLTIP) == 0); + } + + static int _xttoi(const TCHAR* nptr) + { +#ifndef _ATL_MIN_CRT + return _ttoi(nptr); +#else // _ATL_MIN_CRT + while(*nptr == _T(' ')) // skip spaces + ++nptr; + + int c = (int)(_TUCHAR)*nptr++; + int sign = c; // save sign indication + if (c == _T('-') || c == _T('+')) + c = (int)(_TUCHAR)*nptr++; // skip sign + + int total = 0; + while((TCHAR)c >= _T('0') && (TCHAR)c <= _T('9')) + { + total = 10 * total + ((TCHAR)c - _T('0')); // accumulate digit + c = (int)(_TUCHAR)*nptr++; // get next char + } + + // return result, negated if necessary + return ((TCHAR)sign != _T('-')) ? total : -total; +#endif // _ATL_MIN_CRT + } +}; + + +class CHyperLink : public CHyperLinkImpl +{ +public: + DECLARE_WND_CLASS(_T("WTL_HyperLink")) +}; + + +/////////////////////////////////////////////////////////////////////////////// +// CWaitCursor - displays a wait cursor + +class CWaitCursor +{ +public: +// Data + HCURSOR m_hWaitCursor; + HCURSOR m_hOldCursor; + bool m_bInUse; + +// Constructor/destructor + CWaitCursor(bool bSet = true, LPCTSTR lpstrCursor = IDC_WAIT, bool bSys = true) : m_hOldCursor(NULL), m_bInUse(false) + { + HINSTANCE hInstance = bSys ? NULL : ModuleHelper::GetResourceInstance(); + m_hWaitCursor = ::LoadCursor(hInstance, lpstrCursor); + ATLASSERT(m_hWaitCursor != NULL); + + if(bSet) + Set(); + } + + ~CWaitCursor() + { + Restore(); + } + +// Methods + bool Set() + { + if(m_bInUse) + return false; + m_hOldCursor = ::SetCursor(m_hWaitCursor); + m_bInUse = true; + return true; + } + + bool Restore() + { + if(!m_bInUse) + return false; + ::SetCursor(m_hOldCursor); + m_bInUse = false; + return true; + } +}; + + +/////////////////////////////////////////////////////////////////////////////// +// CCustomWaitCursor - for custom and animated cursors + +class CCustomWaitCursor : public CWaitCursor +{ +public: +// Constructor/destructor + CCustomWaitCursor(ATL::_U_STRINGorID cursor, bool bSet = true, HINSTANCE hInstance = NULL) : + CWaitCursor(false, IDC_WAIT, true) + { + if(hInstance == NULL) + hInstance = ModuleHelper::GetResourceInstance(); + m_hWaitCursor = (HCURSOR)::LoadImage(hInstance, cursor.m_lpstr, IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE); + + if(bSet) + Set(); + } + + ~CCustomWaitCursor() + { + Restore(); +#if !defined(_WIN32_WCE) || ((_WIN32_WCE >= 0x400) && !(defined(WIN32_PLATFORM_PSPC) || defined(WIN32_PLATFORM_WFSP))) + ::DestroyCursor(m_hWaitCursor); +#endif // !defined(_WIN32_WCE) || ((_WIN32_WCE >= 0x400) && !(defined(WIN32_PLATFORM_PSPC) || defined(WIN32_PLATFORM_WFSP))) + } +}; + + +/////////////////////////////////////////////////////////////////////////////// +// CMultiPaneStatusBarCtrl - Status Bar with multiple panes + +template +class ATL_NO_VTABLE CMultiPaneStatusBarCtrlImpl : public ATL::CWindowImpl< T, TBase > +{ +public: + DECLARE_WND_SUPERCLASS(NULL, TBase::GetWndClassName()) + +// Data + enum { m_cxPaneMargin = 3 }; + + int m_nPanes; + int* m_pPane; + +// Constructor/destructor + CMultiPaneStatusBarCtrlImpl() : m_nPanes(0), m_pPane(NULL) + { } + + ~CMultiPaneStatusBarCtrlImpl() + { + delete [] m_pPane; + } + +// Methods + HWND Create(HWND hWndParent, LPCTSTR lpstrText, DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | SBARS_SIZEGRIP, UINT nID = ATL_IDW_STATUS_BAR) + { +#if (_MSC_VER >= 1300) + return ATL::CWindowImpl< T, TBase >::Create(hWndParent, rcDefault, lpstrText, dwStyle, 0, nID); +#else // !(_MSC_VER >= 1300) + typedef ATL::CWindowImpl< T, TBase > _baseClass; + return _baseClass::Create(hWndParent, rcDefault, lpstrText, dwStyle, 0, nID); +#endif // !(_MSC_VER >= 1300) + } + + HWND Create(HWND hWndParent, UINT nTextID = ATL_IDS_IDLEMESSAGE, DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | SBARS_SIZEGRIP, UINT nID = ATL_IDW_STATUS_BAR) + { + const int cchMax = 128; // max text length is 127 for status bars (+1 for null) + TCHAR szText[cchMax]; + szText[0] = 0; + ::LoadString(ModuleHelper::GetResourceInstance(), nTextID, szText, cchMax); + return Create(hWndParent, szText, dwStyle, nID); + } + + BOOL SetPanes(int* pPanes, int nPanes, bool bSetText = true) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(nPanes > 0); + + m_nPanes = nPanes; + delete [] m_pPane; + m_pPane = NULL; + + ATLTRY(m_pPane = new int[nPanes]); + ATLASSERT(m_pPane != NULL); + if(m_pPane == NULL) + return FALSE; + + CTempBuffer buff; + int* pPanesPos = buff.Allocate(nPanes); + ATLASSERT(pPanesPos != NULL); + if(pPanesPos == NULL) + return FALSE; + + SecureHelper::memcpy_x(m_pPane, nPanes * sizeof(int), pPanes, nPanes * sizeof(int)); + + // get status bar DC and set font + CClientDC dc(m_hWnd); + HFONT hOldFont = dc.SelectFont(GetFont()); + + // get status bar borders + int arrBorders[3] = { 0 }; + GetBorders(arrBorders); + + const int cchBuff = 128; + TCHAR szBuff[cchBuff] = { 0 }; + SIZE size = { 0, 0 }; + int cxLeft = arrBorders[0]; + + // calculate right edge of each part + for(int i = 0; i < nPanes; i++) + { + if(pPanes[i] == ID_DEFAULT_PANE) + { + // make very large, will be resized later + pPanesPos[i] = INT_MAX / 2; + } + else + { + ::LoadString(ModuleHelper::GetResourceInstance(), pPanes[i], szBuff, cchBuff); + dc.GetTextExtent(szBuff, lstrlen(szBuff), &size); + T* pT = static_cast(this); + pT; + pPanesPos[i] = cxLeft + size.cx + arrBorders[2] + 2 * pT->m_cxPaneMargin; + } + cxLeft = pPanesPos[i]; + } + + BOOL bRet = SetParts(nPanes, pPanesPos); + + if(bRet && bSetText) + { + for(int i = 0; i < nPanes; i++) + { + if(pPanes[i] != ID_DEFAULT_PANE) + { + ::LoadString(ModuleHelper::GetResourceInstance(), pPanes[i], szBuff, cchBuff); + SetPaneText(m_pPane[i], szBuff); + } + } + } + + dc.SelectFont(hOldFont); + return bRet; + } + + bool GetPaneTextLength(int nPaneID, int* pcchLength = NULL, int* pnType = NULL) const + { + ATLASSERT(::IsWindow(m_hWnd)); + int nIndex = GetPaneIndexFromID(nPaneID); + if(nIndex == -1) + return false; + + int nLength = GetTextLength(nIndex, pnType); + if(pcchLength != NULL) + *pcchLength = nLength; + + return true; + } + + BOOL GetPaneText(int nPaneID, LPTSTR lpstrText, int* pcchLength = NULL, int* pnType = NULL) const + { + ATLASSERT(::IsWindow(m_hWnd)); + int nIndex = GetPaneIndexFromID(nPaneID); + if(nIndex == -1) + return FALSE; + + int nLength = GetText(nIndex, lpstrText, pnType); + if(pcchLength != NULL) + *pcchLength = nLength; + + return TRUE; + } + + BOOL SetPaneText(int nPaneID, LPCTSTR lpstrText, int nType = 0) + { + ATLASSERT(::IsWindow(m_hWnd)); + int nIndex = GetPaneIndexFromID(nPaneID); + if(nIndex == -1) + return FALSE; + + return SetText(nIndex, lpstrText, nType); + } + + BOOL GetPaneRect(int nPaneID, LPRECT lpRect) const + { + ATLASSERT(::IsWindow(m_hWnd)); + int nIndex = GetPaneIndexFromID(nPaneID); + if(nIndex == -1) + return FALSE; + + return GetRect(nIndex, lpRect); + } + + BOOL SetPaneWidth(int nPaneID, int cxWidth) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(nPaneID != ID_DEFAULT_PANE); // Can't resize this one + int nIndex = GetPaneIndexFromID(nPaneID); + if(nIndex == -1) + return FALSE; + + // get pane positions + CTempBuffer buff; + int* pPanesPos = buff.Allocate(m_nPanes); + if(pPanesPos == NULL) + return FALSE; + GetParts(m_nPanes, pPanesPos); + // calculate offset + int cxPaneWidth = pPanesPos[nIndex] - ((nIndex == 0) ? 0 : pPanesPos[nIndex - 1]); + int cxOff = cxWidth - cxPaneWidth; + // find variable width pane + int nDef = m_nPanes; + for(int i = 0; i < m_nPanes; i++) + { + if(m_pPane[i] == ID_DEFAULT_PANE) + { + nDef = i; + break; + } + } + // resize + if(nIndex < nDef) // before default pane + { + for(int i = nIndex; i < nDef; i++) + pPanesPos[i] += cxOff; + + } + else // after default one + { + for(int i = nDef; i < nIndex; i++) + pPanesPos[i] -= cxOff; + } + // set pane postions + return SetParts(m_nPanes, pPanesPos); + } + +#if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) + BOOL GetPaneTipText(int nPaneID, LPTSTR lpstrText, int nSize) const + { + ATLASSERT(::IsWindow(m_hWnd)); + int nIndex = GetPaneIndexFromID(nPaneID); + if(nIndex == -1) + return FALSE; + + GetTipText(nIndex, lpstrText, nSize); + return TRUE; + } + + BOOL SetPaneTipText(int nPaneID, LPCTSTR lpstrText) + { + ATLASSERT(::IsWindow(m_hWnd)); + int nIndex = GetPaneIndexFromID(nPaneID); + if(nIndex == -1) + return FALSE; + + SetTipText(nIndex, lpstrText); + return TRUE; + } +#endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) + +#if ((_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)) || (defined(_WIN32_WCE) && (_WIN32_WCE >= 0x0500)) + BOOL GetPaneIcon(int nPaneID, HICON& hIcon) const + { + ATLASSERT(::IsWindow(m_hWnd)); + int nIndex = GetPaneIndexFromID(nPaneID); + if(nIndex == -1) + return FALSE; + + hIcon = GetIcon(nIndex); + return TRUE; + } + + BOOL SetPaneIcon(int nPaneID, HICON hIcon) + { + ATLASSERT(::IsWindow(m_hWnd)); + int nIndex = GetPaneIndexFromID(nPaneID); + if(nIndex == -1) + return FALSE; + + return SetIcon(nIndex, hIcon); + } +#endif // ((_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)) || (defined(_WIN32_WCE) && (_WIN32_WCE >= 0x0500)) + +// Message map and handlers + BEGIN_MSG_MAP(CMultiPaneStatusBarCtrlImpl< T >) + MESSAGE_HANDLER(WM_SIZE, OnSize) + END_MSG_MAP() + + LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) + { + LRESULT lRet = DefWindowProc(uMsg, wParam, lParam); + if(wParam != SIZE_MINIMIZED && m_nPanes > 0) + { + T* pT = static_cast(this); + pT->UpdatePanesLayout(); + } + return lRet; + } + +// Implementation + BOOL UpdatePanesLayout() + { + // get pane positions + CTempBuffer buff; + int* pPanesPos = buff.Allocate(m_nPanes); + ATLASSERT(pPanesPos != NULL); + if(pPanesPos == NULL) + return FALSE; + int nRet = GetParts(m_nPanes, pPanesPos); + ATLASSERT(nRet == m_nPanes); + if(nRet != m_nPanes) + return FALSE; + // calculate offset + RECT rcClient = { 0 }; + GetClientRect(&rcClient); + int cxOff = rcClient.right - pPanesPos[m_nPanes - 1]; +#ifndef _WIN32_WCE + // Move panes left if size grip box is present + if((GetStyle() & SBARS_SIZEGRIP) != 0) + cxOff -= ::GetSystemMetrics(SM_CXVSCROLL) + ::GetSystemMetrics(SM_CXEDGE); +#endif // !_WIN32_WCE + // find variable width pane + int i; + for(i = 0; i < m_nPanes; i++) + { + if(m_pPane[i] == ID_DEFAULT_PANE) + break; + } + // resize all panes from the variable one to the right + if((i < m_nPanes) && (pPanesPos[i] + cxOff) > ((i == 0) ? 0 : pPanesPos[i - 1])) + { + for(; i < m_nPanes; i++) + pPanesPos[i] += cxOff; + } + // set pane postions + return SetParts(m_nPanes, pPanesPos); + } + + int GetPaneIndexFromID(int nPaneID) const + { + for(int i = 0; i < m_nPanes; i++) + { + if(m_pPane[i] == nPaneID) + return i; + } + + return -1; // not found + } +}; + +class CMultiPaneStatusBarCtrl : public CMultiPaneStatusBarCtrlImpl +{ +public: + DECLARE_WND_SUPERCLASS(_T("WTL_MultiPaneStatusBar"), GetWndClassName()) +}; + + +/////////////////////////////////////////////////////////////////////////////// +// CPaneContainer - provides header with title and close button for panes + +// pane container extended styles +#define PANECNT_NOCLOSEBUTTON 0x00000001 +#define PANECNT_VERTICAL 0x00000002 +#define PANECNT_FLATBORDER 0x00000004 +#define PANECNT_NOBORDER 0x00000008 + +template +class ATL_NO_VTABLE CPaneContainerImpl : public ATL::CWindowImpl< T, TBase, TWinTraits >, public CCustomDraw< T > +{ +public: + DECLARE_WND_CLASS_EX(NULL, 0, -1) + +// Constants + enum + { + m_cxyBorder = 2, + m_cxyTextOffset = 4, + m_cxyBtnOffset = 1, + + m_cchTitle = 80, + + m_cxImageTB = 13, + m_cyImageTB = 11, + m_cxyBtnAddTB = 7, + + m_cxToolBar = m_cxImageTB + m_cxyBtnAddTB + m_cxyBorder + m_cxyBtnOffset, + + m_xBtnImageLeft = 6, + m_yBtnImageTop = 5, + m_xBtnImageRight = 12, + m_yBtnImageBottom = 11, + + m_nCloseBtnID = ID_PANE_CLOSE + }; + +// Data members + CToolBarCtrl m_tb; + ATL::CWindow m_wndClient; + int m_cxyHeader; + TCHAR m_szTitle[m_cchTitle]; + DWORD m_dwExtendedStyle; // Pane container specific extended styles + + +// Constructor + CPaneContainerImpl() : m_cxyHeader(0), m_dwExtendedStyle(0) + { + m_szTitle[0] = 0; + } + +// Attributes + DWORD GetPaneContainerExtendedStyle() const + { + return m_dwExtendedStyle; + } + + DWORD SetPaneContainerExtendedStyle(DWORD dwExtendedStyle, DWORD dwMask = 0) + { + DWORD dwPrevStyle = m_dwExtendedStyle; + if(dwMask == 0) + m_dwExtendedStyle = dwExtendedStyle; + else + m_dwExtendedStyle = (m_dwExtendedStyle & ~dwMask) | (dwExtendedStyle & dwMask); + if(m_hWnd != NULL) + { + T* pT = static_cast(this); + bool bUpdate = false; + + if(((dwPrevStyle & PANECNT_NOCLOSEBUTTON) != 0) && ((m_dwExtendedStyle & PANECNT_NOCLOSEBUTTON) == 0)) // add close button + { + pT->CreateCloseButton(); + bUpdate = true; + } + else if(((dwPrevStyle & PANECNT_NOCLOSEBUTTON) == 0) && ((m_dwExtendedStyle & PANECNT_NOCLOSEBUTTON) != 0)) // remove close button + { + pT->DestroyCloseButton(); + bUpdate = true; + } + + if((dwPrevStyle & PANECNT_VERTICAL) != (m_dwExtendedStyle & PANECNT_VERTICAL)) // change orientation + { + pT->CalcSize(); + bUpdate = true; + } + + if((dwPrevStyle & (PANECNT_FLATBORDER | PANECNT_NOBORDER)) != + (m_dwExtendedStyle & (PANECNT_FLATBORDER | PANECNT_NOBORDER))) // change border + { + bUpdate = true; + } + + if(bUpdate) + pT->UpdateLayout(); + } + return dwPrevStyle; + } + + HWND GetClient() const + { + return m_wndClient; + } + + HWND SetClient(HWND hWndClient) + { + HWND hWndOldClient = m_wndClient; + m_wndClient = hWndClient; + if(m_hWnd != NULL) + { + T* pT = static_cast(this); + pT->UpdateLayout(); + } + return hWndOldClient; + } + + BOOL GetTitle(LPTSTR lpstrTitle, int cchLength) const + { + ATLASSERT(lpstrTitle != NULL); + + errno_t nRet = SecureHelper::strncpy_x(lpstrTitle, cchLength, m_szTitle, _TRUNCATE); + + return (nRet == 0 || nRet == STRUNCATE); + } + + BOOL SetTitle(LPCTSTR lpstrTitle) + { + ATLASSERT(lpstrTitle != NULL); + + errno_t nRet = SecureHelper::strncpy_x(m_szTitle, m_cchTitle, lpstrTitle, _TRUNCATE); + bool bRet = (nRet == 0 || nRet == STRUNCATE); + if(bRet && m_hWnd != NULL) + { + T* pT = static_cast(this); + pT->UpdateLayout(); + } + + return bRet; + } + + int GetTitleLength() const + { + return lstrlen(m_szTitle); + } + +// Methods + HWND Create(HWND hWndParent, LPCTSTR lpstrTitle = NULL, DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, + DWORD dwExStyle = 0, UINT nID = 0, LPVOID lpCreateParam = NULL) + { + if(lpstrTitle != NULL) + SecureHelper::strncpy_x(m_szTitle, m_cchTitle, lpstrTitle, _TRUNCATE); +#if (_MSC_VER >= 1300) + return ATL::CWindowImpl< T, TBase, TWinTraits >::Create(hWndParent, rcDefault, NULL, dwStyle, dwExStyle, nID, lpCreateParam); +#else // !(_MSC_VER >= 1300) + typedef ATL::CWindowImpl< T, TBase, TWinTraits > _baseClass; + return _baseClass::Create(hWndParent, rcDefault, NULL, dwStyle, dwExStyle, nID, lpCreateParam); +#endif // !(_MSC_VER >= 1300) + } + + HWND Create(HWND hWndParent, UINT uTitleID, DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, + DWORD dwExStyle = 0, UINT nID = 0, LPVOID lpCreateParam = NULL) + { + if(uTitleID != 0U) + ::LoadString(ModuleHelper::GetResourceInstance(), uTitleID, m_szTitle, m_cchTitle); +#if (_MSC_VER >= 1300) + return ATL::CWindowImpl< T, TBase, TWinTraits >::Create(hWndParent, rcDefault, NULL, dwStyle, dwExStyle, nID, lpCreateParam); +#else // !(_MSC_VER >= 1300) + typedef ATL::CWindowImpl< T, TBase, TWinTraits > _baseClass; + return _baseClass::Create(hWndParent, rcDefault, NULL, dwStyle, dwExStyle, nID, lpCreateParam); +#endif // !(_MSC_VER >= 1300) + } + + BOOL EnableCloseButton(BOOL bEnable) + { + ATLASSERT(::IsWindow(m_hWnd)); + T* pT = static_cast(this); + pT; // avoid level 4 warning + return (m_tb.m_hWnd != NULL) ? m_tb.EnableButton(pT->m_nCloseBtnID, bEnable) : FALSE; + } + + void UpdateLayout() + { + RECT rcClient = { 0 }; + GetClientRect(&rcClient); + T* pT = static_cast(this); + pT->UpdateLayout(rcClient.right, rcClient.bottom); + } + +// Message map and handlers + BEGIN_MSG_MAP(CPaneContainerImpl) + MESSAGE_HANDLER(WM_CREATE, OnCreate) + MESSAGE_HANDLER(WM_SIZE, OnSize) + MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus) + MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground) + MESSAGE_HANDLER(WM_PAINT, OnPaint) +#ifndef _WIN32_WCE + MESSAGE_HANDLER(WM_PRINTCLIENT, OnPaint) +#endif // !_WIN32_WCE + MESSAGE_HANDLER(WM_NOTIFY, OnNotify) + MESSAGE_HANDLER(WM_COMMAND, OnCommand) + FORWARD_NOTIFICATIONS() + END_MSG_MAP() + + LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) + { + T* pT = static_cast(this); + pT->CalcSize(); + + if((m_dwExtendedStyle & PANECNT_NOCLOSEBUTTON) == 0) + pT->CreateCloseButton(); + + return 0; + } + + LRESULT OnSize(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/) + { + T* pT = static_cast(this); + pT->UpdateLayout(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)); + return 0; + } + + LRESULT OnSetFocus(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) + { + if(m_wndClient.m_hWnd != NULL) + m_wndClient.SetFocus(); + return 0; + } + + LRESULT OnEraseBackground(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) + { + return 1; // no background needed + } + + LRESULT OnPaint(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/) + { + T* pT = static_cast(this); + if(wParam != NULL) + { + pT->DrawPaneTitle((HDC)wParam); + + if(m_wndClient.m_hWnd == NULL) // no client window + pT->DrawPane((HDC)wParam); + } + else + { + CPaintDC dc(m_hWnd); + pT->DrawPaneTitle(dc.m_hDC); + + if(m_wndClient.m_hWnd == NULL) // no client window + pT->DrawPane(dc.m_hDC); + } + + return 0; + } + + LRESULT OnNotify(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled) + { + if(m_tb.m_hWnd == NULL) + { + bHandled = FALSE; + return 1; + } + + T* pT = static_cast(this); + pT; + LPNMHDR lpnmh = (LPNMHDR)lParam; + LRESULT lRet = 0; + + // pass toolbar custom draw notifications to the base class + if(lpnmh->code == NM_CUSTOMDRAW && lpnmh->hwndFrom == m_tb.m_hWnd) + lRet = CCustomDraw< T >::OnCustomDraw(0, lpnmh, bHandled); +#ifndef _WIN32_WCE + // tooltip notifications come with the tooltip window handle and button ID, + // pass them to the parent if we don't handle them + else if(lpnmh->code == TTN_GETDISPINFO && lpnmh->idFrom == pT->m_nCloseBtnID) + bHandled = pT->GetToolTipText(lpnmh); +#endif // !_WIN32_WCE + // only let notifications not from the toolbar go to the parent + else if(lpnmh->hwndFrom != m_tb.m_hWnd && lpnmh->idFrom != pT->m_nCloseBtnID) + bHandled = FALSE; + + return lRet; + } + + LRESULT OnCommand(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled) + { + // if command comes from the close button, substitute HWND of the pane container instead + if(m_tb.m_hWnd != NULL && (HWND)lParam == m_tb.m_hWnd) + return ::SendMessage(GetParent(), WM_COMMAND, wParam, (LPARAM)m_hWnd); + + bHandled = FALSE; + return 1; + } + +// Custom draw overrides + DWORD OnPrePaint(int /*idCtrl*/, LPNMCUSTOMDRAW /*lpNMCustomDraw*/) + { + return CDRF_NOTIFYITEMDRAW; // we need per-item notifications + } + + DWORD OnItemPrePaint(int /*idCtrl*/, LPNMCUSTOMDRAW lpNMCustomDraw) + { + CDCHandle dc = lpNMCustomDraw->hdc; +#if (_WIN32_IE >= 0x0400) + RECT& rc = lpNMCustomDraw->rc; +#else // !(_WIN32_IE >= 0x0400) + RECT rc; + m_tb.GetItemRect(0, &rc); +#endif // !(_WIN32_IE >= 0x0400) + + dc.FillRect(&rc, COLOR_3DFACE); + + return CDRF_NOTIFYPOSTPAINT; + } + + DWORD OnItemPostPaint(int /*idCtrl*/, LPNMCUSTOMDRAW lpNMCustomDraw) + { + CDCHandle dc = lpNMCustomDraw->hdc; +#if (_WIN32_IE >= 0x0400) + RECT& rc = lpNMCustomDraw->rc; +#else // !(_WIN32_IE >= 0x0400) + RECT rc = { 0 }; + m_tb.GetItemRect(0, &rc); +#endif // !(_WIN32_IE >= 0x0400) + + RECT rcImage = { m_xBtnImageLeft, m_yBtnImageTop, m_xBtnImageRight + 1, m_yBtnImageBottom + 1 }; + ::OffsetRect(&rcImage, rc.left, rc.top); + T* pT = static_cast(this); + + if((lpNMCustomDraw->uItemState & CDIS_DISABLED) != 0) + { + RECT rcShadow = rcImage; + ::OffsetRect(&rcShadow, 1, 1); + CPen pen1; + pen1.CreatePen(PS_SOLID, 0, ::GetSysColor(COLOR_3DHILIGHT)); + pT->DrawButtonImage(dc, rcShadow, pen1); + CPen pen2; + pen2.CreatePen(PS_SOLID, 0, ::GetSysColor(COLOR_3DSHADOW)); + pT->DrawButtonImage(dc, rcImage, pen2); + } + else + { + if((lpNMCustomDraw->uItemState & CDIS_SELECTED) != 0) + ::OffsetRect(&rcImage, 1, 1); + CPen pen; + pen.CreatePen(PS_SOLID, 0, ::GetSysColor(COLOR_BTNTEXT)); + pT->DrawButtonImage(dc, rcImage, pen); + } + + return CDRF_DODEFAULT; // continue with the default item painting + } + +// Implementation - overrideable methods + void UpdateLayout(int cxWidth, int cyHeight) + { + ATLASSERT(::IsWindow(m_hWnd)); + RECT rect = { 0 }; + + if(IsVertical()) + { + ::SetRect(&rect, 0, 0, m_cxyHeader, cyHeight); + if(m_tb.m_hWnd != NULL) + m_tb.SetWindowPos(NULL, m_cxyBorder, m_cxyBorder + m_cxyBtnOffset, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE); + + if(m_wndClient.m_hWnd != NULL) + m_wndClient.SetWindowPos(NULL, m_cxyHeader, 0, cxWidth - m_cxyHeader, cyHeight, SWP_NOZORDER); + else + rect.right = cxWidth; + } + else + { + ::SetRect(&rect, 0, 0, cxWidth, m_cxyHeader); + if(m_tb.m_hWnd != NULL) + m_tb.SetWindowPos(NULL, rect.right - m_cxToolBar, m_cxyBorder + m_cxyBtnOffset, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE); + + if(m_wndClient.m_hWnd != NULL) + m_wndClient.SetWindowPos(NULL, 0, m_cxyHeader, cxWidth, cyHeight - m_cxyHeader, SWP_NOZORDER); + else + rect.bottom = cyHeight; + } + + InvalidateRect(&rect); + } + + void CreateCloseButton() + { + ATLASSERT(m_tb.m_hWnd == NULL); + // create toolbar for the "x" button + m_tb.Create(m_hWnd, rcDefault, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | CCS_NODIVIDER | CCS_NORESIZE | CCS_NOPARENTALIGN | CCS_NOMOVEY | TBSTYLE_TOOLTIPS | TBSTYLE_FLAT, 0); + ATLASSERT(m_tb.IsWindow()); + + if(m_tb.m_hWnd != NULL) + { + T* pT = static_cast(this); + pT; // avoid level 4 warning + + m_tb.SetButtonStructSize(); + + TBBUTTON tbbtn = { 0 }; + tbbtn.idCommand = pT->m_nCloseBtnID; + tbbtn.fsState = TBSTATE_ENABLED; + tbbtn.fsStyle = TBSTYLE_BUTTON; + m_tb.AddButtons(1, &tbbtn); + + m_tb.SetBitmapSize(m_cxImageTB, m_cyImageTB); + m_tb.SetButtonSize(m_cxImageTB + m_cxyBtnAddTB, m_cyImageTB + m_cxyBtnAddTB); + + if(IsVertical()) + m_tb.SetWindowPos(NULL, m_cxyBorder + m_cxyBtnOffset, m_cxyBorder + m_cxyBtnOffset, m_cxImageTB + m_cxyBtnAddTB, m_cyImageTB + m_cxyBtnAddTB, SWP_NOZORDER | SWP_NOACTIVATE); + else + m_tb.SetWindowPos(NULL, 0, 0, m_cxImageTB + m_cxyBtnAddTB, m_cyImageTB + m_cxyBtnAddTB, SWP_NOZORDER | SWP_NOMOVE | SWP_NOACTIVATE); + } + } + + void DestroyCloseButton() + { + if(m_tb.m_hWnd != NULL) + m_tb.DestroyWindow(); + } + + void CalcSize() + { + T* pT = static_cast(this); + CFontHandle font = pT->GetTitleFont(); + LOGFONT lf = { 0 }; + font.GetLogFont(lf); + if(IsVertical()) + { + m_cxyHeader = m_cxImageTB + m_cxyBtnAddTB + m_cxyBorder; + } + else + { + int cyFont = abs(lf.lfHeight) + m_cxyBorder + 2 * m_cxyTextOffset; + int cyBtn = m_cyImageTB + m_cxyBtnAddTB + m_cxyBorder + 2 * m_cxyBtnOffset; + m_cxyHeader = max(cyFont, cyBtn); + } + } + + HFONT GetTitleFont() const + { + return AtlGetDefaultGuiFont(); + } + +#ifndef _WIN32_WCE + BOOL GetToolTipText(LPNMHDR /*lpnmh*/) + { + return FALSE; + } +#endif // !_WIN32_WCE + + void DrawPaneTitle(CDCHandle dc) + { + RECT rect = { 0 }; + GetClientRect(&rect); + + UINT uBorder = BF_LEFT | BF_TOP | BF_ADJUST; + if(IsVertical()) + { + rect.right = rect.left + m_cxyHeader; + uBorder |= BF_BOTTOM; + } + else + { + rect.bottom = rect.top + m_cxyHeader; + uBorder |= BF_RIGHT; + } + + if((m_dwExtendedStyle & PANECNT_NOBORDER) == 0) + { + if((m_dwExtendedStyle & PANECNT_FLATBORDER) != 0) + uBorder |= BF_FLAT; + dc.DrawEdge(&rect, EDGE_ETCHED, uBorder); + } + dc.FillRect(&rect, COLOR_3DFACE); + + if(!IsVertical()) // draw title only for horizontal pane container + { + dc.SetTextColor(::GetSysColor(COLOR_WINDOWTEXT)); + dc.SetBkMode(TRANSPARENT); + T* pT = static_cast(this); + HFONT hFontOld = dc.SelectFont(pT->GetTitleFont()); + rect.left += m_cxyTextOffset; + rect.right -= m_cxyTextOffset; + if(m_tb.m_hWnd != NULL) + rect.right -= m_cxToolBar;; +#ifndef _WIN32_WCE + dc.DrawText(m_szTitle, -1, &rect, DT_LEFT | DT_SINGLELINE | DT_VCENTER | DT_END_ELLIPSIS); +#else // CE specific + dc.DrawText(m_szTitle, -1, &rect, DT_LEFT | DT_SINGLELINE | DT_VCENTER); +#endif // _WIN32_WCE + dc.SelectFont(hFontOld); + } + } + + // called only if pane is empty + void DrawPane(CDCHandle dc) + { + RECT rect = { 0 }; + GetClientRect(&rect); + if(IsVertical()) + rect.left += m_cxyHeader; + else + rect.top += m_cxyHeader; + if((GetExStyle() & WS_EX_CLIENTEDGE) == 0) + dc.DrawEdge(&rect, EDGE_SUNKEN, BF_RECT | BF_ADJUST); + dc.FillRect(&rect, COLOR_APPWORKSPACE); + } + + // drawing helper - draws "x" button image + void DrawButtonImage(CDCHandle dc, RECT& rcImage, HPEN hPen) + { +#if !defined(_WIN32_WCE) || (_WIN32_WCE >= 400) + HPEN hPenOld = dc.SelectPen(hPen); + + dc.MoveTo(rcImage.left, rcImage.top); + dc.LineTo(rcImage.right, rcImage.bottom); + dc.MoveTo(rcImage.left + 1, rcImage.top); + dc.LineTo(rcImage.right + 1, rcImage.bottom); + + dc.MoveTo(rcImage.left, rcImage.bottom - 1); + dc.LineTo(rcImage.right, rcImage.top - 1); + dc.MoveTo(rcImage.left + 1, rcImage.bottom - 1); + dc.LineTo(rcImage.right + 1, rcImage.top - 1); + + dc.SelectPen(hPenOld); +#else // (_WIN32_WCE < 400) + rcImage; + hPen; + // no support for the "x" button image +#endif // (_WIN32_WCE < 400) + } + + bool IsVertical() const + { + return ((m_dwExtendedStyle & PANECNT_VERTICAL) != 0); + } +}; + +class CPaneContainer : public CPaneContainerImpl +{ +public: + DECLARE_WND_CLASS_EX(_T("WTL_PaneContainer"), 0, -1) +}; + + +/////////////////////////////////////////////////////////////////////////////// +// CSortListViewCtrl - implements sorting for a listview control + +// sort listview extended styles +#define SORTLV_USESHELLBITMAPS 0x00000001 + +// Notification sent to parent when sort column is changed by user clicking header. +#define SLVN_SORTCHANGED LVN_LAST + +// A LPNMSORTLISTVIEW is sent with the SLVN_SORTCHANGED notification +typedef struct tagNMSORTLISTVIEW +{ + NMHDR hdr; + int iNewSortColumn; + int iOldSortColumn; +} NMSORTLISTVIEW, *LPNMSORTLISTVIEW; + +// Column sort types. Can be set on a per-column basis with the SetColumnSortType method. +enum +{ + LVCOLSORT_NONE, + LVCOLSORT_TEXT, // default + LVCOLSORT_TEXTNOCASE, + LVCOLSORT_LONG, + LVCOLSORT_DOUBLE, + LVCOLSORT_DECIMAL, + LVCOLSORT_DATETIME, + LVCOLSORT_DATE, + LVCOLSORT_TIME, + LVCOLSORT_CUSTOM, + LVCOLSORT_LAST = LVCOLSORT_CUSTOM +}; + + +template +class CSortListViewImpl +{ +public: + enum + { + m_cchCmpTextMax = 32, // overrideable + m_cxSortImage = 16, + m_cySortImage = 15, + m_cxSortArrow = 11, + m_cySortArrow = 6, + m_iSortUp = 0, // index of sort bitmaps + m_iSortDown = 1, + m_nShellSortUpID = 133 + }; + + // passed to LVCompare functions as lParam1 and lParam2 + struct LVCompareParam + { + int iItem; + DWORD_PTR dwItemData; + union + { + long lValue; + double dblValue; + DECIMAL decValue; + LPCTSTR pszValue; + }; + }; + + // passed to LVCompare functions as the lParamSort parameter + struct LVSortInfo + { + T* pT; + int iSortCol; + bool bDescending; + }; + + bool m_bSortDescending; + bool m_bCommCtrl6; + int m_iSortColumn; + CBitmap m_bmSort[2]; + int m_fmtOldSortCol; + HBITMAP m_hbmOldSortCol; + DWORD m_dwSortLVExtendedStyle; + ATL::CSimpleArray m_arrColSortType; + bool m_bUseWaitCursor; + + CSortListViewImpl() : + m_bSortDescending(false), + m_bCommCtrl6(false), + m_iSortColumn(-1), + m_fmtOldSortCol(0), + m_hbmOldSortCol(NULL), + m_dwSortLVExtendedStyle(SORTLV_USESHELLBITMAPS), + m_bUseWaitCursor(true) + { +#ifndef _WIN32_WCE + DWORD dwMajor = 0; + DWORD dwMinor = 0; + HRESULT hRet = ATL::AtlGetCommCtrlVersion(&dwMajor, &dwMinor); + m_bCommCtrl6 = SUCCEEDED(hRet) && dwMajor >= 6; +#endif // !_WIN32_WCE + } + +// Attributes + void SetSortColumn(int iCol) + { + T* pT = static_cast(this); + ATLASSERT(::IsWindow(pT->m_hWnd)); + CHeaderCtrl header = pT->GetHeader(); + ATLASSERT(header.m_hWnd != NULL); + ATLASSERT(iCol >= -1 && iCol < m_arrColSortType.GetSize()); + + int iOldSortCol = m_iSortColumn; + m_iSortColumn = iCol; + if(m_bCommCtrl6) + { +#ifndef HDF_SORTUP + const int HDF_SORTUP = 0x0400; +#endif // HDF_SORTUP +#ifndef HDF_SORTDOWN + const int HDF_SORTDOWN = 0x0200; +#endif // HDF_SORTDOWN + const int nMask = HDF_SORTUP | HDF_SORTDOWN; + HDITEM hditem = { HDI_FORMAT }; + if(iOldSortCol != iCol && iOldSortCol >= 0 && header.GetItem(iOldSortCol, &hditem)) + { + hditem.fmt &= ~nMask; + header.SetItem(iOldSortCol, &hditem); + } + if(iCol >= 0 && header.GetItem(iCol, &hditem)) + { + hditem.fmt &= ~nMask; + hditem.fmt |= m_bSortDescending ? HDF_SORTDOWN : HDF_SORTUP; + header.SetItem(iCol, &hditem); + } + return; + } + + if(m_bmSort[m_iSortUp].IsNull()) + pT->CreateSortBitmaps(); + + // restore previous sort column's bitmap, if any, and format + HDITEM hditem = { HDI_BITMAP | HDI_FORMAT }; + if(iOldSortCol != iCol && iOldSortCol >= 0) + { + hditem.hbm = m_hbmOldSortCol; + hditem.fmt = m_fmtOldSortCol; + header.SetItem(iOldSortCol, &hditem); + } + + // save new sort column's bitmap and format, and add our sort bitmap + if(iCol >= 0 && header.GetItem(iCol, &hditem)) + { + if(iOldSortCol != iCol) + { + m_fmtOldSortCol = hditem.fmt; + m_hbmOldSortCol = hditem.hbm; + } + hditem.fmt &= ~HDF_IMAGE; + hditem.fmt |= HDF_BITMAP | HDF_BITMAP_ON_RIGHT; + int i = m_bSortDescending ? m_iSortDown : m_iSortUp; + hditem.hbm = m_bmSort[i]; + header.SetItem(iCol, &hditem); + } + } + + int GetSortColumn() const + { + return m_iSortColumn; + } + + void SetColumnSortType(int iCol, WORD wType) + { + ATLASSERT(iCol >= 0 && iCol < m_arrColSortType.GetSize()); + ATLASSERT(wType >= LVCOLSORT_NONE && wType <= LVCOLSORT_LAST); + m_arrColSortType[iCol] = wType; + } + + WORD GetColumnSortType(int iCol) const + { + ATLASSERT((iCol >= 0) && iCol < m_arrColSortType.GetSize()); + return m_arrColSortType[iCol]; + } + + int GetColumnCount() const + { + const T* pT = static_cast(this); + ATLASSERT(::IsWindow(pT->m_hWnd)); + CHeaderCtrl header = pT->GetHeader(); + return header.m_hWnd != NULL ? header.GetItemCount() : 0; + } + + bool IsSortDescending() const + { + return m_bSortDescending; + } + + DWORD GetSortListViewExtendedStyle() const + { + return m_dwSortLVExtendedStyle; + } + + DWORD SetSortListViewExtendedStyle(DWORD dwExtendedStyle, DWORD dwMask = 0) + { + DWORD dwPrevStyle = m_dwSortLVExtendedStyle; + if(dwMask == 0) + m_dwSortLVExtendedStyle = dwExtendedStyle; + else + m_dwSortLVExtendedStyle = (m_dwSortLVExtendedStyle & ~dwMask) | (dwExtendedStyle & dwMask); + return dwPrevStyle; + } + +// Operations + bool DoSortItems(int iCol, bool bDescending = false) + { + T* pT = static_cast(this); + ATLASSERT(::IsWindow(pT->m_hWnd)); + ATLASSERT(iCol >= 0 && iCol < m_arrColSortType.GetSize()); + + WORD wType = m_arrColSortType[iCol]; + if(wType == LVCOLSORT_NONE) + return false; + + int nCount = pT->GetItemCount(); + if(nCount < 2) + { + m_bSortDescending = bDescending; + SetSortColumn(iCol); + return true; + } + + CWaitCursor waitCursor(false); + if(m_bUseWaitCursor) + waitCursor.Set(); + + LVCompareParam* pParam = NULL; + ATLTRY(pParam = new LVCompareParam[nCount]); + PFNLVCOMPARE pFunc = NULL; + TCHAR pszTemp[pT->m_cchCmpTextMax]; + bool bStrValue = false; + + switch(wType) + { + case LVCOLSORT_TEXT: + pFunc = (PFNLVCOMPARE)pT->LVCompareText; + case LVCOLSORT_TEXTNOCASE: + if(pFunc == NULL) + pFunc = (PFNLVCOMPARE)pT->LVCompareTextNoCase; + case LVCOLSORT_CUSTOM: + { + if(pFunc == NULL) + pFunc = (PFNLVCOMPARE)pT->LVCompareCustom; + + for(int i = 0; i < nCount; i++) + { + pParam[i].iItem = i; + pParam[i].dwItemData = pT->GetItemData(i); + pParam[i].pszValue = new TCHAR[pT->m_cchCmpTextMax]; + pT->GetItemText(i, iCol, (LPTSTR)pParam[i].pszValue, pT->m_cchCmpTextMax); + pT->SetItemData(i, (DWORD_PTR)&pParam[i]); + } + bStrValue = true; + } + break; + case LVCOLSORT_LONG: + { + pFunc = (PFNLVCOMPARE)pT->LVCompareLong; + for(int i = 0; i < nCount; i++) + { + pParam[i].iItem = i; + pParam[i].dwItemData = pT->GetItemData(i); + pT->GetItemText(i, iCol, pszTemp, pT->m_cchCmpTextMax); + pParam[i].lValue = pT->StrToLong(pszTemp); + pT->SetItemData(i, (DWORD_PTR)&pParam[i]); + } + } + break; + case LVCOLSORT_DOUBLE: + { + pFunc = (PFNLVCOMPARE)pT->LVCompareDouble; + for(int i = 0; i < nCount; i++) + { + pParam[i].iItem = i; + pParam[i].dwItemData = pT->GetItemData(i); + pT->GetItemText(i, iCol, pszTemp, pT->m_cchCmpTextMax); + pParam[i].dblValue = pT->StrToDouble(pszTemp); + pT->SetItemData(i, (DWORD_PTR)&pParam[i]); + } + } + break; + case LVCOLSORT_DECIMAL: + { + pFunc = (PFNLVCOMPARE)pT->LVCompareDecimal; + for(int i = 0; i < nCount; i++) + { + pParam[i].iItem = i; + pParam[i].dwItemData = pT->GetItemData(i); + pT->GetItemText(i, iCol, pszTemp, pT->m_cchCmpTextMax); + pT->StrToDecimal(pszTemp, &pParam[i].decValue); + pT->SetItemData(i, (DWORD_PTR)&pParam[i]); + } + } + break; + case LVCOLSORT_DATETIME: + case LVCOLSORT_DATE: + case LVCOLSORT_TIME: + { + pFunc = (PFNLVCOMPARE)pT->LVCompareDouble; + DWORD dwFlags = LOCALE_NOUSEROVERRIDE; + if(wType == LVCOLSORT_DATE) + dwFlags |= VAR_DATEVALUEONLY; + else if(wType == LVCOLSORT_TIME) + dwFlags |= VAR_TIMEVALUEONLY; + for(int i = 0; i < nCount; i++) + { + pParam[i].iItem = i; + pParam[i].dwItemData = pT->GetItemData(i); + pT->GetItemText(i, iCol, pszTemp, pT->m_cchCmpTextMax); + pParam[i].dblValue = pT->DateStrToDouble(pszTemp, dwFlags); + pT->SetItemData(i, (DWORD_PTR)&pParam[i]); + } + } + break; + default: + ATLTRACE2(atlTraceUI, 0, _T("Unknown value for sort type in CSortListViewImpl::DoSortItems()\n")); + break; + } // switch(wType) + + ATLASSERT(pFunc != NULL); + LVSortInfo lvsi = { pT, iCol, bDescending }; + bool bRet = ((BOOL)pT->DefWindowProc(LVM_SORTITEMS, (WPARAM)&lvsi, (LPARAM)pFunc) != FALSE); + for(int i = 0; i < nCount; i++) + { + DWORD_PTR dwItemData = pT->GetItemData(i); + LVCompareParam* p = (LVCompareParam*)dwItemData; + ATLASSERT(p != NULL); + if(bStrValue) + delete [] (TCHAR*)p->pszValue; + pT->SetItemData(i, p->dwItemData); + } + delete [] pParam; + + if(bRet) + { + m_bSortDescending = bDescending; + SetSortColumn(iCol); + } + + if(m_bUseWaitCursor) + waitCursor.Restore(); + + return bRet; + } + + void CreateSortBitmaps() + { + if((m_dwSortLVExtendedStyle & SORTLV_USESHELLBITMAPS) != 0) + { + bool bFree = false; + LPCTSTR pszModule = _T("shell32.dll"); + HINSTANCE hShell = ::GetModuleHandle(pszModule); + + if (hShell == NULL) + { + hShell = ::LoadLibrary(pszModule); + bFree = true; + } + + if (hShell != NULL) + { + bool bSuccess = true; + for(int i = m_iSortUp; i <= m_iSortDown; i++) + { + if(!m_bmSort[i].IsNull()) + m_bmSort[i].DeleteObject(); + m_bmSort[i] = (HBITMAP)::LoadImage(hShell, MAKEINTRESOURCE(m_nShellSortUpID + i), +#ifndef _WIN32_WCE + IMAGE_BITMAP, 0, 0, LR_LOADMAP3DCOLORS); +#else // CE specific + IMAGE_BITMAP, 0, 0, 0); +#endif // _WIN32_WCE + if(m_bmSort[i].IsNull()) + { + bSuccess = false; + break; + } + } + if(bFree) + ::FreeLibrary(hShell); + if(bSuccess) + return; + } + } + + T* pT = static_cast(this); + for(int i = m_iSortUp; i <= m_iSortDown; i++) + { + if(!m_bmSort[i].IsNull()) + m_bmSort[i].DeleteObject(); + + CDC dcMem; + CClientDC dc(::GetDesktopWindow()); + dcMem.CreateCompatibleDC(dc.m_hDC); + m_bmSort[i].CreateCompatibleBitmap(dc.m_hDC, m_cxSortImage, m_cySortImage); + HBITMAP hbmOld = dcMem.SelectBitmap(m_bmSort[i]); + RECT rc = {0,0,m_cxSortImage, m_cySortImage}; + pT->DrawSortBitmap(dcMem.m_hDC, i, &rc); + dcMem.SelectBitmap(hbmOld); + dcMem.DeleteDC(); + } + } + + void NotifyParentSortChanged(int iNewSortCol, int iOldSortCol) + { + T* pT = static_cast(this); + int nID = pT->GetDlgCtrlID(); + NMSORTLISTVIEW nm = { { pT->m_hWnd, nID, SLVN_SORTCHANGED }, iNewSortCol, iOldSortCol }; + ::SendMessage(pT->GetParent(), WM_NOTIFY, (WPARAM)nID, (LPARAM)&nm); + } + +// Overrideables + int CompareItemsCustom(LVCompareParam* /*pItem1*/, LVCompareParam* /*pItem2*/, int /*iSortCol*/) + { + // pItem1 and pItem2 contain valid iItem, dwItemData, and pszValue members. + // If item1 > item2 return 1, if item1 < item2 return -1, else return 0. + return 0; + } + + void DrawSortBitmap(CDCHandle dc, int iBitmap, LPRECT prc) + { + dc.FillRect(prc, ::GetSysColorBrush(COLOR_BTNFACE)); + HBRUSH hbrOld = dc.SelectBrush(::GetSysColorBrush(COLOR_BTNSHADOW)); + CPen pen; + pen.CreatePen(PS_SOLID, 0, ::GetSysColor(COLOR_BTNSHADOW)); + HPEN hpenOld = dc.SelectPen(pen); + POINT ptOrg = { (m_cxSortImage - m_cxSortArrow) / 2, (m_cySortImage - m_cySortArrow) / 2 }; + if(iBitmap == m_iSortUp) + { + POINT pts[3] = + { + { ptOrg.x + m_cxSortArrow / 2, ptOrg.y }, + { ptOrg.x, ptOrg.y + m_cySortArrow - 1 }, + { ptOrg.x + m_cxSortArrow - 1, ptOrg.y + m_cySortArrow - 1 } + }; + dc.Polygon(pts, 3); + } + else + { + POINT pts[3] = + { + { ptOrg.x, ptOrg.y }, + { ptOrg.x + m_cxSortArrow / 2, ptOrg.y + m_cySortArrow - 1 }, + { ptOrg.x + m_cxSortArrow - 1, ptOrg.y } + }; + dc.Polygon(pts, 3); + } + dc.SelectBrush(hbrOld); + dc.SelectPen(hpenOld); + } + + double DateStrToDouble(LPCTSTR lpstr, DWORD dwFlags) + { + ATLASSERT(lpstr != NULL); + if(lpstr == NULL || lpstr[0] == _T('\0')) + return 0; + + USES_CONVERSION; + HRESULT hRet = E_FAIL; + DATE dRet = 0; + if (FAILED(hRet = ::VarDateFromStr((LPOLESTR)T2COLE(lpstr), LANG_USER_DEFAULT, dwFlags, &dRet))) + { + ATLTRACE2(atlTraceUI, 0, _T("VarDateFromStr failed with result of 0x%8.8X\n"), hRet); + dRet = 0; + } + return dRet; + } + + long StrToLong(LPCTSTR lpstr) + { + ATLASSERT(lpstr != NULL); + if(lpstr == NULL || lpstr[0] == _T('\0')) + return 0; + + USES_CONVERSION; + HRESULT hRet = E_FAIL; + long lRet = 0; + if (FAILED(hRet = ::VarI4FromStr((LPOLESTR)T2COLE(lpstr), LANG_USER_DEFAULT, LOCALE_NOUSEROVERRIDE, &lRet))) + { + ATLTRACE2(atlTraceUI, 0, _T("VarI4FromStr failed with result of 0x%8.8X\n"), hRet); + lRet = 0; + } + return lRet; + } + + double StrToDouble(LPCTSTR lpstr) + { + ATLASSERT(lpstr != NULL); + if(lpstr == NULL || lpstr[0] == _T('\0')) + return 0; + + USES_CONVERSION; + HRESULT hRet = E_FAIL; + double dblRet = 0; + if (FAILED(hRet = ::VarR8FromStr((LPOLESTR)T2COLE(lpstr), LANG_USER_DEFAULT, LOCALE_NOUSEROVERRIDE, &dblRet))) + { + ATLTRACE2(atlTraceUI, 0, _T("VarR8FromStr failed with result of 0x%8.8X\n"), hRet); + dblRet = 0; + } + return dblRet; + } + + bool StrToDecimal(LPCTSTR lpstr, DECIMAL* pDecimal) + { + ATLASSERT(lpstr != NULL); + ATLASSERT(pDecimal != NULL); + if(lpstr == NULL || pDecimal == NULL) + return false; + + USES_CONVERSION; + HRESULT hRet = E_FAIL; + if (FAILED(hRet = ::VarDecFromStr((LPOLESTR)T2COLE(lpstr), LANG_USER_DEFAULT, LOCALE_NOUSEROVERRIDE, pDecimal))) + { + ATLTRACE2(atlTraceUI, 0, _T("VarDecFromStr failed with result of 0x%8.8X\n"), hRet); + pDecimal->Lo64 = 0; + pDecimal->Hi32 = 0; + pDecimal->signscale = 0; + return false; + } + return true; + } + +// Overrideable PFNLVCOMPARE functions + static int CALLBACK LVCompareText(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) + { + ATLASSERT(lParam1 != NULL && lParam2 != NULL && lParamSort != NULL); + + LVCompareParam* pParam1 = (LVCompareParam*)lParam1; + LVCompareParam* pParam2 = (LVCompareParam*)lParam2; + LVSortInfo* pInfo = (LVSortInfo*)lParamSort; + + int nRet = lstrcmp(pParam1->pszValue, pParam2->pszValue); + return pInfo->bDescending ? -nRet : nRet; + } + + static int CALLBACK LVCompareTextNoCase(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) + { + ATLASSERT(lParam1 != NULL && lParam2 != NULL && lParamSort != NULL); + + LVCompareParam* pParam1 = (LVCompareParam*)lParam1; + LVCompareParam* pParam2 = (LVCompareParam*)lParam2; + LVSortInfo* pInfo = (LVSortInfo*)lParamSort; + + int nRet = lstrcmpi(pParam1->pszValue, pParam2->pszValue); + return pInfo->bDescending ? -nRet : nRet; + } + + static int CALLBACK LVCompareLong(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) + { + ATLASSERT(lParam1 != NULL && lParam2 != NULL && lParamSort != NULL); + + LVCompareParam* pParam1 = (LVCompareParam*)lParam1; + LVCompareParam* pParam2 = (LVCompareParam*)lParam2; + LVSortInfo* pInfo = (LVSortInfo*)lParamSort; + + int nRet = 0; + if(pParam1->lValue > pParam2->lValue) + nRet = 1; + else if(pParam1->lValue < pParam2->lValue) + nRet = -1; + return pInfo->bDescending ? -nRet : nRet; + } + + static int CALLBACK LVCompareDouble(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) + { + ATLASSERT(lParam1 != NULL && lParam2 != NULL && lParamSort != NULL); + + LVCompareParam* pParam1 = (LVCompareParam*)lParam1; + LVCompareParam* pParam2 = (LVCompareParam*)lParam2; + LVSortInfo* pInfo = (LVSortInfo*)lParamSort; + + int nRet = 0; + if(pParam1->dblValue > pParam2->dblValue) + nRet = 1; + else if(pParam1->dblValue < pParam2->dblValue) + nRet = -1; + return pInfo->bDescending ? -nRet : nRet; + } + + static int CALLBACK LVCompareCustom(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) + { + ATLASSERT(lParam1 != NULL && lParam2 != NULL && lParamSort != NULL); + + LVCompareParam* pParam1 = (LVCompareParam*)lParam1; + LVCompareParam* pParam2 = (LVCompareParam*)lParam2; + LVSortInfo* pInfo = (LVSortInfo*)lParamSort; + + int nRet = pInfo->pT->CompareItemsCustom(pParam1, pParam2, pInfo->iSortCol); + return pInfo->bDescending ? -nRet : nRet; + } + +#ifndef _WIN32_WCE + static int CALLBACK LVCompareDecimal(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) + { + ATLASSERT(lParam1 != NULL && lParam2 != NULL && lParamSort != NULL); + + LVCompareParam* pParam1 = (LVCompareParam*)lParam1; + LVCompareParam* pParam2 = (LVCompareParam*)lParam2; + LVSortInfo* pInfo = (LVSortInfo*)lParamSort; + + int nRet = (int)::VarDecCmp(&pParam1->decValue, &pParam2->decValue); + nRet--; + return pInfo->bDescending ? -nRet : nRet; + } +#else + // Compare mantissas, ignore sign and scale + static int CompareMantissas(const DECIMAL& decLeft, const DECIMAL& decRight) + { + if (decLeft.Hi32 < decRight.Hi32) + { + return -1; + } + if (decLeft.Hi32 > decRight.Hi32) + { + return 1; + } + // Here, decLeft.Hi32 == decRight.Hi32 + if (decLeft.Lo64 < decRight.Lo64) + { + return -1; + } + if (decLeft.Lo64 > decRight.Lo64) + { + return 1; + } + return 0; + } + + // return values: VARCMP_LT, VARCMP_EQ, VARCMP_GT, VARCMP_NULL + static HRESULT VarDecCmp(const DECIMAL* pdecLeft, const DECIMAL* pdecRight) + { + static const ULONG powersOfTen[] = + { + 10ul, + 100ul, + 1000ul, + 10000ul, + 100000ul, + 1000000ul, + 10000000ul, + 100000000ul, + 1000000000ul + }; + static const int largestPower = sizeof(powersOfTen) / sizeof(powersOfTen[0]); + if (!pdecLeft || !pdecRight) + { + return VARCMP_NULL; + } + + // Degenerate case - at least one comparand is of the form + // [+-]0*10^N (denormalized zero) + bool bLeftZero = (!pdecLeft->Lo64 && !pdecLeft->Hi32); + bool bRightZero = (!pdecRight->Lo64 && !pdecRight->Hi32); + if (bLeftZero && bRightZero) + { + return VARCMP_EQ; + } + bool bLeftNeg = ((pdecLeft->sign & DECIMAL_NEG) != 0); + bool bRightNeg = ((pdecRight->sign & DECIMAL_NEG) != 0); + if (bLeftZero) + { + return (bRightNeg ? VARCMP_GT : VARCMP_LT); + } + // This also covers the case where the comparands have different signs + if (bRightZero || bLeftNeg != bRightNeg) + { + return (bLeftNeg ? VARCMP_LT : VARCMP_GT); + } + + // Here both comparands have the same sign and need to be compared + // on mantissa and scale. The result is obvious when + // 1. Scales are equal (then compare mantissas) + // 2. A number with smaller scale is also the one with larger mantissa + // (then this number is obviously larger) + // In the remaining case, we would multiply the number with smaller + // scale by 10 and simultaneously increment its scale (which amounts to + // adding trailing zeros after decimal point), until the numbers fall under + // one of the two cases above + DECIMAL temp; + bool bInvert = bLeftNeg; // the final result needs to be inverted + if (pdecLeft->scale < pdecRight->scale) + { + temp = *pdecLeft; + } + else + { + temp = *pdecRight; + pdecRight = pdecLeft; + bInvert = !bInvert; + } + + // Now temp is the number with smaller (or equal) scale, and + // we can modify it freely without touching original parameters + int comp; + while ((comp = CompareMantissas(temp, *pdecRight)) < 0 && + temp.scale < pdecRight->scale) + { + // Multiply by an appropriate power of 10 + int scaleDiff = pdecRight->scale - temp.scale; + if (scaleDiff > largestPower) + { + // Keep the multiplier representable in 32bit + scaleDiff = largestPower; + } + DWORDLONG power = powersOfTen[scaleDiff - 1]; + // Multiply temp's mantissa by power + DWORDLONG product = temp.Lo32 * power; + ULONG carry = static_cast(product >> 32); + temp.Lo32 = static_cast(product); + product = temp.Mid32 * power + carry; + carry = static_cast(product >> 32); + temp.Mid32 = static_cast(product); + product = temp.Hi32 * power + carry; + if (static_cast(product >> 32)) + { + // Multiplication overflowed - pdecLeft is clearly larger + break; + } + temp.Hi32 = static_cast(product); + temp.scale = (BYTE)(temp.scale + scaleDiff); + } + if (temp.scale < pdecRight->scale) + { + comp = 1; + } + if (bInvert) + { + comp = -comp; + } + return (comp > 0 ? VARCMP_GT : comp < 0 ? VARCMP_LT : VARCMP_EQ); + } + + static int CALLBACK LVCompareDecimal(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) + { + ATLASSERT(lParam1 != NULL && lParam2 != NULL && lParamSort != NULL); + + LVCompareParam* pParam1 = (LVCompareParam*)lParam1; + LVCompareParam* pParam2 = (LVCompareParam*)lParam2; + LVSortInfo* pInfo = (LVSortInfo*)lParamSort; + + int nRet = (int)VarDecCmp(&pParam1->decValue, &pParam2->decValue); + nRet--; + return pInfo->bDescending ? -nRet : nRet; + } +#endif // !_WIN32_WCE + + BEGIN_MSG_MAP(CSortListViewImpl) + MESSAGE_HANDLER(LVM_INSERTCOLUMN, OnInsertColumn) + MESSAGE_HANDLER(LVM_DELETECOLUMN, OnDeleteColumn) + NOTIFY_CODE_HANDLER(HDN_ITEMCLICKA, OnHeaderItemClick) + NOTIFY_CODE_HANDLER(HDN_ITEMCLICKW, OnHeaderItemClick) + MESSAGE_HANDLER(WM_SETTINGCHANGE, OnSettingChange) + END_MSG_MAP() + + LRESULT OnInsertColumn(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) + { + T* pT = static_cast(this); + LRESULT lRet = pT->DefWindowProc(uMsg, wParam, lParam); + if(lRet == -1) + return -1; + + WORD wType = 0; + m_arrColSortType.Add(wType); + int nCount = m_arrColSortType.GetSize(); + ATLASSERT(nCount == GetColumnCount()); + + for(int i = nCount - 1; i > lRet; i--) + m_arrColSortType[i] = m_arrColSortType[i - 1]; + m_arrColSortType[(int)lRet] = LVCOLSORT_TEXT; + + if(lRet <= m_iSortColumn) + m_iSortColumn++; + + return lRet; + } + + LRESULT OnDeleteColumn(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) + { + T* pT = static_cast(this); + LRESULT lRet = pT->DefWindowProc(uMsg, wParam, lParam); + if(lRet == 0) + return 0; + + int iCol = (int)wParam; + if(m_iSortColumn == iCol) + m_iSortColumn = -1; + else if(m_iSortColumn > iCol) + m_iSortColumn--; + m_arrColSortType.RemoveAt(iCol); + + return lRet; + } + + LRESULT OnHeaderItemClick(int /*idCtrl*/, LPNMHDR pnmh, BOOL& bHandled) + { + LPNMHEADER p = (LPNMHEADER)pnmh; + if(p->iButton == 0) + { + int iOld = m_iSortColumn; + bool bDescending = (m_iSortColumn == p->iItem) ? !m_bSortDescending : false; + if(DoSortItems(p->iItem, bDescending)) + NotifyParentSortChanged(p->iItem, iOld); + } + bHandled = FALSE; + return 0; + } + + LRESULT OnSettingChange(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) + { +#ifndef _WIN32_WCE + if(wParam == SPI_SETNONCLIENTMETRICS) + GetSystemSettings(); +#else // CE specific + wParam; // avoid level 4 warning + GetSystemSettings(); +#endif // _WIN32_WCE + bHandled = FALSE; + return 0; + } + + void GetSystemSettings() + { + if(!m_bCommCtrl6 && !m_bmSort[m_iSortUp].IsNull()) + { + T* pT = static_cast(this); + pT->CreateSortBitmaps(); + if(m_iSortColumn != -1) + SetSortColumn(m_iSortColumn); + } + } + +}; + + +typedef ATL::CWinTraits CSortListViewCtrlTraits; + +template +class ATL_NO_VTABLE CSortListViewCtrlImpl: public ATL::CWindowImpl, public CSortListViewImpl +{ +public: + DECLARE_WND_SUPERCLASS(NULL, TBase::GetWndClassName()) + + bool SortItems(int iCol, bool bDescending = false) + { + return DoSortItems(iCol, bDescending); + } + + BEGIN_MSG_MAP(CSortListViewCtrlImpl) + MESSAGE_HANDLER(LVM_INSERTCOLUMN, CSortListViewImpl::OnInsertColumn) + MESSAGE_HANDLER(LVM_DELETECOLUMN, CSortListViewImpl::OnDeleteColumn) + NOTIFY_CODE_HANDLER(HDN_ITEMCLICKA, CSortListViewImpl::OnHeaderItemClick) + NOTIFY_CODE_HANDLER(HDN_ITEMCLICKW, CSortListViewImpl::OnHeaderItemClick) + MESSAGE_HANDLER(WM_SETTINGCHANGE, CSortListViewImpl::OnSettingChange) + END_MSG_MAP() +}; + +class CSortListViewCtrl : public CSortListViewCtrlImpl +{ +public: + DECLARE_WND_SUPERCLASS(_T("WTL_SortListViewCtrl"), GetWndClassName()) +}; + + +/////////////////////////////////////////////////////////////////////////////// +// CTabView - implements tab view window + +// TabView Notifications +#define TBVN_PAGEACTIVATED (0U-741) +#define TBVN_CONTEXTMENU (0U-742) + +// Notification data for TBVN_CONTEXTMENU +struct TBVCONTEXTMENUINFO +{ + NMHDR hdr; + POINT pt; +}; + +typedef TBVCONTEXTMENUINFO* LPTBVCONTEXTMENUINFO; + + +template +class ATL_NO_VTABLE CTabViewImpl : public ATL::CWindowImpl +{ +public: + DECLARE_WND_CLASS_EX(NULL, 0, COLOR_APPWORKSPACE) + +// Declarations and enums + struct TABVIEWPAGE + { + HWND hWnd; + LPTSTR lpstrTitle; + LPVOID pData; + }; + + struct TCITEMEXTRA + { + TCITEMHEADER tciheader; + TABVIEWPAGE tvpage; + + operator LPTCITEM() { return (LPTCITEM)this; } + }; + + enum + { + m_nTabID = 1313, + m_cxMoveMark = 6, + m_cyMoveMark = 3, + m_nMenuItemsMax = (ID_WINDOW_TABLAST - ID_WINDOW_TABFIRST + 1) + }; + +// Data members + ATL::CContainedWindowT m_tab; + int m_cyTabHeight; + + int m_nActivePage; + + int m_nInsertItem; + POINT m_ptStartDrag; + + CMenuHandle m_menu; + + int m_cchTabTextLength; + + int m_nMenuItemsCount; + + ATL::CWindow m_wndTitleBar; + LPTSTR m_lpstrTitleBarBase; + int m_cchTitleBarLength; + + CImageList m_ilDrag; + + bool m_bDestroyPageOnRemove:1; + bool m_bDestroyImageList:1; + bool m_bActivePageMenuItem:1; + bool m_bActiveAsDefaultMenuItem:1; + bool m_bEmptyMenuItem:1; + bool m_bWindowsMenuItem:1; + // internal + bool m_bTabCapture:1; + bool m_bTabDrag:1; + +// Constructor/destructor + CTabViewImpl() : + m_nActivePage(-1), + m_cyTabHeight(0), + m_tab(this, 1), + m_nInsertItem(-1), + m_cchTabTextLength(30), + m_nMenuItemsCount(10), + m_lpstrTitleBarBase(NULL), + m_cchTitleBarLength(100), + m_bDestroyPageOnRemove(true), + m_bDestroyImageList(true), + m_bActivePageMenuItem(true), + m_bActiveAsDefaultMenuItem(false), + m_bEmptyMenuItem(false), + m_bWindowsMenuItem(false), + m_bTabCapture(false), + m_bTabDrag(false) + { + m_ptStartDrag.x = 0; + m_ptStartDrag.y = 0; + } + + ~CTabViewImpl() + { + delete [] m_lpstrTitleBarBase; + } + +// Message filter function - to be called from PreTranslateMessage of the main window + BOOL PreTranslateMessage(MSG* pMsg) + { + if(IsWindow() == FALSE) + return FALSE; + + BOOL bRet = FALSE; + + // Check for TabView built-in accelerators (Ctrl+Tab/Ctrl+Shift+Tab - next/previous page) + int nCount = GetPageCount(); + if(nCount > 0) + { + bool bControl = (::GetKeyState(VK_CONTROL) < 0); + if((pMsg->message == WM_KEYDOWN) && (pMsg->wParam == VK_TAB) && bControl) + { + if(nCount > 1) + { + int nPage = m_nActivePage; + bool bShift = (::GetKeyState(VK_SHIFT) < 0); + if(bShift) + nPage = (nPage > 0) ? (nPage - 1) : (nCount - 1); + else + nPage = ((nPage >= 0) && (nPage < (nCount - 1))) ? (nPage + 1) : 0; + + SetActivePage(nPage); + T* pT = static_cast(this); + pT->OnPageActivated(m_nActivePage); + } + + bRet = TRUE; + } + } + + // If we are doing drag-drop, check for Escape key that cancels it + if(bRet == FALSE) + { + if(m_bTabCapture && pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_ESCAPE) + { + ::ReleaseCapture(); + bRet = TRUE; + } + } + + // Pass the message to the active page + if(bRet == FALSE) + { + if(m_nActivePage != -1) + bRet = (BOOL)::SendMessage(GetPageHWND(m_nActivePage), WM_FORWARDMSG, 0, (LPARAM)pMsg); + } + + return bRet; + } + +// Attributes + int GetPageCount() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return m_tab.GetItemCount(); + } + + int GetActivePage() const + { + return m_nActivePage; + } + + void SetActivePage(int nPage) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(IsValidPageIndex(nPage)); + + T* pT = static_cast(this); + + SetRedraw(FALSE); + + if(m_nActivePage != -1) + ::ShowWindow(GetPageHWND(m_nActivePage), FALSE); + m_nActivePage = nPage; + m_tab.SetCurSel(m_nActivePage); + ::ShowWindow(GetPageHWND(m_nActivePage), TRUE); + + pT->UpdateLayout(); + + SetRedraw(TRUE); + RedrawWindow(NULL, NULL, RDW_FRAME | RDW_INVALIDATE | RDW_UPDATENOW | RDW_ALLCHILDREN); + + if(::GetFocus() != m_tab.m_hWnd) + ::SetFocus(GetPageHWND(m_nActivePage)); + + pT->UpdateTitleBar(); + pT->UpdateMenu(); + } + + HIMAGELIST GetImageList() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return m_tab.GetImageList(); + } + + HIMAGELIST SetImageList(HIMAGELIST hImageList) + { + ATLASSERT(::IsWindow(m_hWnd)); + return m_tab.SetImageList(hImageList); + } + + void SetWindowMenu(HMENU hMenu) + { + ATLASSERT(::IsWindow(m_hWnd)); + + m_menu = hMenu; + + T* pT = static_cast(this); + pT->UpdateMenu(); + } + + void SetTitleBarWindow(HWND hWnd) + { + ATLASSERT(::IsWindow(m_hWnd)); + + delete [] m_lpstrTitleBarBase; + m_lpstrTitleBarBase = NULL; + + m_wndTitleBar = hWnd; + if(hWnd == NULL) + return; + + int cchLen = m_wndTitleBar.GetWindowTextLength() + 1; + ATLTRY(m_lpstrTitleBarBase = new TCHAR[cchLen]); + if(m_lpstrTitleBarBase != NULL) + { + m_wndTitleBar.GetWindowText(m_lpstrTitleBarBase, cchLen); + T* pT = static_cast(this); + pT->UpdateTitleBar(); + } + } + +// Page attributes + HWND GetPageHWND(int nPage) const + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(IsValidPageIndex(nPage)); + + TCITEMEXTRA tcix = { 0 }; + tcix.tciheader.mask = TCIF_PARAM; + m_tab.GetItem(nPage, tcix); + + return tcix.tvpage.hWnd; + } + + LPCTSTR GetPageTitle(int nPage) const + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(IsValidPageIndex(nPage)); + + TCITEMEXTRA tcix = { 0 }; + tcix.tciheader.mask = TCIF_PARAM; + if(m_tab.GetItem(nPage, tcix) == FALSE) + return NULL; + + return tcix.tvpage.lpstrTitle; + } + + bool SetPageTitle(int nPage, LPCTSTR lpstrTitle) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(IsValidPageIndex(nPage)); + + T* pT = static_cast(this); + + int cchBuff = lstrlen(lpstrTitle) + 1; + LPTSTR lpstrBuff = NULL; + ATLTRY(lpstrBuff = new TCHAR[cchBuff]); + if(lpstrBuff == NULL) + return false; + + SecureHelper::strcpy_x(lpstrBuff, cchBuff, lpstrTitle); + TCITEMEXTRA tcix = { 0 }; + tcix.tciheader.mask = TCIF_PARAM; + if(m_tab.GetItem(nPage, tcix) == FALSE) + return false; + + CTempBuffer buff; + LPTSTR lpstrTabText = buff.Allocate(m_cchTabTextLength + 1); + if(lpstrTabText == NULL) + return false; + + delete [] tcix.tvpage.lpstrTitle; + + pT->ShortenTitle(lpstrTitle, lpstrTabText, m_cchTabTextLength + 1); + + tcix.tciheader.mask = TCIF_TEXT | TCIF_PARAM; + tcix.tciheader.pszText = lpstrTabText; + tcix.tvpage.lpstrTitle = lpstrBuff; + if(m_tab.SetItem(nPage, tcix) == FALSE) + return false; + + pT->UpdateTitleBar(); + pT->UpdateMenu(); + + return true; + } + + LPVOID GetPageData(int nPage) const + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(IsValidPageIndex(nPage)); + + TCITEMEXTRA tcix = { 0 }; + tcix.tciheader.mask = TCIF_PARAM; + m_tab.GetItem(nPage, tcix); + + return tcix.tvpage.pData; + } + + LPVOID SetPageData(int nPage, LPVOID pData) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(IsValidPageIndex(nPage)); + + TCITEMEXTRA tcix = { 0 }; + tcix.tciheader.mask = TCIF_PARAM; + m_tab.GetItem(nPage, tcix); + LPVOID pDataOld = tcix.tvpage.pData; + + tcix.tvpage.pData = pData; + m_tab.SetItem(nPage, tcix); + + return pDataOld; + } + + int GetPageImage(int nPage) const + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(IsValidPageIndex(nPage)); + + TCITEMEXTRA tcix = { 0 }; + tcix.tciheader.mask = TCIF_IMAGE; + m_tab.GetItem(nPage, tcix); + + return tcix.tciheader.iImage; + } + + int SetPageImage(int nPage, int nImage) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(IsValidPageIndex(nPage)); + + TCITEMEXTRA tcix = { 0 }; + tcix.tciheader.mask = TCIF_IMAGE; + m_tab.GetItem(nPage, tcix); + int nImageOld = tcix.tciheader.iImage; + + tcix.tciheader.iImage = nImage; + m_tab.SetItem(nPage, tcix); + + return nImageOld; + } + +// Operations + bool AddPage(HWND hWndView, LPCTSTR lpstrTitle, int nImage = -1, LPVOID pData = NULL) + { + return InsertPage(GetPageCount(), hWndView, lpstrTitle, nImage, pData); + } + + bool InsertPage(int nPage, HWND hWndView, LPCTSTR lpstrTitle, int nImage = -1, LPVOID pData = NULL) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(nPage == GetPageCount() || IsValidPageIndex(nPage)); + + T* pT = static_cast(this); + + int cchBuff = lstrlen(lpstrTitle) + 1; + LPTSTR lpstrBuff = NULL; + ATLTRY(lpstrBuff = new TCHAR[cchBuff]); + if(lpstrBuff == NULL) + return false; + + SecureHelper::strcpy_x(lpstrBuff, cchBuff, lpstrTitle); + + CTempBuffer buff; + LPTSTR lpstrTabText = buff.Allocate(m_cchTabTextLength + 1); + if(lpstrTabText == NULL) + return false; + + pT->ShortenTitle(lpstrTitle, lpstrTabText, m_cchTabTextLength + 1); + + SetRedraw(FALSE); + + TCITEMEXTRA tcix = { 0 }; + tcix.tciheader.mask = TCIF_TEXT | TCIF_IMAGE | TCIF_PARAM; + tcix.tciheader.pszText = lpstrTabText; + tcix.tciheader.iImage = nImage; + tcix.tvpage.hWnd = hWndView; + tcix.tvpage.lpstrTitle = lpstrBuff; + tcix.tvpage.pData = pData; + int nItem = m_tab.InsertItem(nPage, tcix); + if(nItem == -1) + { + delete [] lpstrBuff; + SetRedraw(TRUE); + return false; + } + + SetActivePage(nItem); + pT->OnPageActivated(m_nActivePage); + + if(GetPageCount() == 1) + pT->ShowTabControl(true); + + pT->UpdateLayout(); + + SetRedraw(TRUE); + RedrawWindow(NULL, NULL, RDW_FRAME | RDW_INVALIDATE | RDW_UPDATENOW | RDW_ALLCHILDREN); + + return true; + } + + void RemovePage(int nPage) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(IsValidPageIndex(nPage)); + + T* pT = static_cast(this); + + SetRedraw(FALSE); + + if(GetPageCount() == 1) + pT->ShowTabControl(false); + + if(m_bDestroyPageOnRemove) + ::DestroyWindow(GetPageHWND(nPage)); + else + ::ShowWindow(GetPageHWND(nPage), FALSE); + LPTSTR lpstrTitle = (LPTSTR)GetPageTitle(nPage); + delete [] lpstrTitle; + + ATLVERIFY(m_tab.DeleteItem(nPage) != FALSE); + + if(m_nActivePage == nPage) + { + m_nActivePage = -1; + + if(nPage > 0) + { + SetActivePage(nPage - 1); + } + else if(GetPageCount() > 0) + { + SetActivePage(nPage); + } + else + { + SetRedraw(TRUE); + Invalidate(); + UpdateWindow(); + pT->UpdateTitleBar(); + pT->UpdateMenu(); + } + } + else + { + nPage = (nPage < m_nActivePage) ? (m_nActivePage - 1) : m_nActivePage; + m_nActivePage = -1; + SetActivePage(nPage); + } + + pT->OnPageActivated(m_nActivePage); + } + + void RemoveAllPages() + { + ATLASSERT(::IsWindow(m_hWnd)); + + if(GetPageCount() == 0) + return; + + T* pT = static_cast(this); + + SetRedraw(FALSE); + + pT->ShowTabControl(false); + + for(int i = 0; i < GetPageCount(); i++) + { + if(m_bDestroyPageOnRemove) + ::DestroyWindow(GetPageHWND(i)); + else + ::ShowWindow(GetPageHWND(i), FALSE); + LPTSTR lpstrTitle = (LPTSTR)GetPageTitle(i); + delete [] lpstrTitle; + } + m_tab.DeleteAllItems(); + + m_nActivePage = -1; + pT->OnPageActivated(m_nActivePage); + + SetRedraw(TRUE); + Invalidate(); + UpdateWindow(); + + pT->UpdateTitleBar(); + pT->UpdateMenu(); + } + + int PageIndexFromHwnd(HWND hWnd) const + { + int nIndex = -1; + + for(int i = 0; i < GetPageCount(); i++) + { + if(GetPageHWND(i) == hWnd) + { + nIndex = i; + break; + } + } + + return nIndex; + } + + void BuildWindowMenu(HMENU hMenu, int nMenuItemsCount = 10, bool bEmptyMenuItem = true, bool bWindowsMenuItem = true, bool bActivePageMenuItem = true, bool bActiveAsDefaultMenuItem = false) + { + ATLASSERT(::IsWindow(m_hWnd)); + + CMenuHandle menu = hMenu; + T* pT = static_cast(this); + pT; // avoid level 4 warning + int nFirstPos = 0; + + // Find first menu item in our range +#ifndef _WIN32_WCE + for(nFirstPos = 0; nFirstPos < menu.GetMenuItemCount(); nFirstPos++) + { + UINT nID = menu.GetMenuItemID(nFirstPos); + if((nID >= ID_WINDOW_TABFIRST && nID <= ID_WINDOW_TABLAST) || nID == ID_WINDOW_SHOWTABLIST) + break; + } +#else // CE specific + for(nFirstPos = 0; ; nFirstPos++) + { + CMenuItemInfo mii; + mii.fMask = MIIM_ID; + BOOL bRet = menu.GetMenuItemInfo(nFirstPos, TRUE, &mii); + if(bRet == FALSE) + break; + if((mii.wID >= ID_WINDOW_TABFIRST && mii.wID <= ID_WINDOW_TABLAST) || mii.wID == ID_WINDOW_SHOWTABLIST) + break; + } +#endif // _WIN32_WCE + + // Remove all menu items for tab pages + BOOL bRet = TRUE; + while(bRet != FALSE) + bRet = menu.DeleteMenu(nFirstPos, MF_BYPOSITION); + + // Add separator if it's not already there + int nPageCount = GetPageCount(); + if((bWindowsMenuItem || (nPageCount > 0)) && (nFirstPos > 0)) + { + CMenuItemInfo mii; + mii.fMask = MIIM_TYPE; + menu.GetMenuItemInfo(nFirstPos - 1, TRUE, &mii); + if((nFirstPos <= 0) || ((mii.fType & MFT_SEPARATOR) == 0)) + { + menu.AppendMenu(MF_SEPARATOR); + nFirstPos++; + } + } + + // Add menu items for all pages + if(nPageCount > 0) + { + // Append menu items for all pages + const int cchPrefix = 3; // 2 digits + space + nMenuItemsCount = min(min(nPageCount, nMenuItemsCount), (int)m_nMenuItemsMax); + ATLASSERT(nMenuItemsCount < 100); // 2 digits only + if(nMenuItemsCount >= 100) + nMenuItemsCount = 99; + + for(int i = 0; i < nMenuItemsCount; i++) + { + LPCTSTR lpstrTitle = GetPageTitle(i); + int nLen = lstrlen(lpstrTitle); + CTempBuffer buff; + LPTSTR lpstrText = buff.Allocate(cchPrefix + nLen + 1); + ATLASSERT(lpstrText != NULL); + if(lpstrText != NULL) + { + LPCTSTR lpstrFormat = (i < 9) ? _T("&%i %s") : _T("%i %s"); + SecureHelper::wsprintf_x(lpstrText, cchPrefix + nLen + 1, lpstrFormat, i + 1, lpstrTitle); + menu.AppendMenu(MF_STRING, ID_WINDOW_TABFIRST + i, lpstrText); + } + } + + // Mark active page + if(bActivePageMenuItem && (m_nActivePage != -1)) + { +#ifndef _WIN32_WCE + if(bActiveAsDefaultMenuItem) + { + menu.SetMenuDefaultItem((UINT)-1, TRUE); + menu.SetMenuDefaultItem(nFirstPos + m_nActivePage, TRUE); + } + else +#else // CE specific + bActiveAsDefaultMenuItem; // avoid level 4 warning +#endif // _WIN32_WCE + { + menu.CheckMenuRadioItem(nFirstPos, nFirstPos + nMenuItemsCount, nFirstPos + m_nActivePage, MF_BYPOSITION); + } + } + } + else + { + if(bEmptyMenuItem) + { + menu.AppendMenu(MF_BYPOSITION | MF_STRING, ID_WINDOW_TABFIRST, pT->GetEmptyListText()); + menu.EnableMenuItem(ID_WINDOW_TABFIRST, MF_GRAYED); + } + + // Remove separator if nothing else is there + if(!bEmptyMenuItem && !bWindowsMenuItem && (nFirstPos > 0)) + { + CMenuItemInfo mii; + mii.fMask = MIIM_TYPE; + menu.GetMenuItemInfo(nFirstPos - 1, TRUE, &mii); + if((mii.fType & MFT_SEPARATOR) != 0) + menu.DeleteMenu(nFirstPos - 1, MF_BYPOSITION); + } + } + + // Add "Windows..." menu item + if(bWindowsMenuItem) + menu.AppendMenu(MF_BYPOSITION | MF_STRING, ID_WINDOW_SHOWTABLIST, pT->GetWindowsMenuItemText()); + } + +// Message map and handlers + BEGIN_MSG_MAP(CTabViewImpl) + MESSAGE_HANDLER(WM_CREATE, OnCreate) + MESSAGE_HANDLER(WM_DESTROY, OnDestroy) + MESSAGE_HANDLER(WM_SIZE, OnSize) + MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus) + NOTIFY_HANDLER(m_nTabID, TCN_SELCHANGE, OnTabChanged) + NOTIFY_ID_HANDLER(m_nTabID, OnTabNotification) +#ifndef _WIN32_WCE + NOTIFY_CODE_HANDLER(TTN_GETDISPINFO, OnTabGetDispInfo) +#endif // !_WIN32_WCE + FORWARD_NOTIFICATIONS() + ALT_MSG_MAP(1) // tab control + MESSAGE_HANDLER(WM_LBUTTONDOWN, OnTabLButtonDown) + MESSAGE_HANDLER(WM_LBUTTONUP, OnTabLButtonUp) + MESSAGE_HANDLER(WM_CAPTURECHANGED, OnTabCaptureChanged) + MESSAGE_HANDLER(WM_MOUSEMOVE, OnTabMouseMove) + MESSAGE_HANDLER(WM_RBUTTONUP, OnTabRButtonUp) + MESSAGE_HANDLER(WM_SYSKEYDOWN, OnTabSysKeyDown) + END_MSG_MAP() + + LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) + { + T* pT = static_cast(this); + pT->CreateTabControl(); + + return 0; + } + + LRESULT OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) + { + RemoveAllPages(); + + if(m_bDestroyImageList) + { + CImageList il = m_tab.SetImageList(NULL); + if(il.m_hImageList != NULL) + il.Destroy(); + } + + return 0; + } + + LRESULT OnSize(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) + { + T* pT = static_cast(this); + pT->UpdateLayout(); + return 0; + } + + LRESULT OnSetFocus(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) + { + if(m_nActivePage != -1) + ::SetFocus(GetPageHWND(m_nActivePage)); + return 0; + } + + LRESULT OnTabChanged(int /*idCtrl*/, LPNMHDR /*pnmh*/, BOOL& /*bHandled*/) + { + SetActivePage(m_tab.GetCurSel()); + T* pT = static_cast(this); + pT->OnPageActivated(m_nActivePage); + + return 0; + } + + LRESULT OnTabNotification(int /*idCtrl*/, LPNMHDR /*pnmh*/, BOOL& /*bHandled*/) + { + // nothing to do - this just blocks all tab control + // notifications from being propagated further + return 0; + } + +#ifndef _WIN32_WCE + LRESULT OnTabGetDispInfo(int /*idCtrl*/, LPNMHDR pnmh, BOOL& bHandled) + { + LPNMTTDISPINFO pTTDI = (LPNMTTDISPINFO)pnmh; + if(pTTDI->hdr.hwndFrom == m_tab.GetTooltips()) + { + T* pT = static_cast(this); + pT->UpdateTooltipText(pTTDI); + } + else + { + bHandled = FALSE; + } + + return 0; + } +#endif // !_WIN32_WCE + +// Tab control message handlers + LRESULT OnTabLButtonDown(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled) + { + if(m_tab.GetItemCount() > 1) + { + m_bTabCapture = true; + m_tab.SetCapture(); + + m_ptStartDrag.x = GET_X_LPARAM(lParam); + m_ptStartDrag.y = GET_Y_LPARAM(lParam); + } + + bHandled = FALSE; + return 0; + } + + LRESULT OnTabLButtonUp(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled) + { + if(m_bTabCapture) + { + if(m_bTabDrag) + { + TCHITTESTINFO hti = { 0 }; + hti.pt.x = GET_X_LPARAM(lParam); + hti.pt.y = GET_Y_LPARAM(lParam); + int nItem = m_tab.HitTest(&hti); + if(nItem != -1) + MovePage(m_nActivePage, nItem); + } + + ::ReleaseCapture(); + } + + bHandled = FALSE; + return 0; + } + + LRESULT OnTabCaptureChanged(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) + { + if(m_bTabCapture) + { + m_bTabCapture = false; + + if(m_bTabDrag) + { + m_bTabDrag = false; + T* pT = static_cast(this); + pT->DrawMoveMark(-1); + +#ifndef _WIN32_WCE + m_ilDrag.DragLeave(GetDesktopWindow()); +#endif // !_WIN32_WCE + m_ilDrag.EndDrag(); + + m_ilDrag.Destroy(); + m_ilDrag.m_hImageList = NULL; + } + } + + bHandled = FALSE; + return 0; + } + + LRESULT OnTabMouseMove(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled) + { + bHandled = FALSE; + + if(m_bTabCapture) + { + POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; + + if(!m_bTabDrag) + { +#ifndef _WIN32_WCE + if(abs(m_ptStartDrag.x - GET_X_LPARAM(lParam)) >= ::GetSystemMetrics(SM_CXDRAG) || + abs(m_ptStartDrag.y - GET_Y_LPARAM(lParam)) >= ::GetSystemMetrics(SM_CYDRAG)) +#else // CE specific + if(abs(m_ptStartDrag.x - GET_X_LPARAM(lParam)) >= 4 || + abs(m_ptStartDrag.y - GET_Y_LPARAM(lParam)) >= 4) +#endif // _WIN32_WCE + { + T* pT = static_cast(this); + pT->GenerateDragImage(m_nActivePage); + + int cxCursor = ::GetSystemMetrics(SM_CXCURSOR); + int cyCursor = ::GetSystemMetrics(SM_CYCURSOR); + m_ilDrag.BeginDrag(0, -(cxCursor / 2), -(cyCursor / 2)); +#ifndef _WIN32_WCE + POINT ptEnter = m_ptStartDrag; + m_tab.ClientToScreen(&ptEnter); + m_ilDrag.DragEnter(GetDesktopWindow(), ptEnter); +#endif // !_WIN32_WCE + + m_bTabDrag = true; + } + } + + if(m_bTabDrag) + { + TCHITTESTINFO hti = { 0 }; + hti.pt = pt; + int nItem = m_tab.HitTest(&hti); + + T* pT = static_cast(this); + pT->SetMoveCursor(nItem != -1); + + if(m_nInsertItem != nItem) + pT->DrawMoveMark(nItem); + + m_ilDrag.DragShowNolock((nItem != -1) ? TRUE : FALSE); + m_tab.ClientToScreen(&pt); + m_ilDrag.DragMove(pt); + + bHandled = TRUE; + } + } + + return 0; + } + + LRESULT OnTabRButtonUp(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/) + { + TCHITTESTINFO hti = { 0 }; + hti.pt.x = GET_X_LPARAM(lParam); + hti.pt.y = GET_Y_LPARAM(lParam); + int nItem = m_tab.HitTest(&hti); + if(nItem != -1) + { + T* pT = static_cast(this); + pT->OnContextMenu(nItem, hti.pt); + } + + return 0; + } + + LRESULT OnTabSysKeyDown(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) + { + bool bShift = (::GetKeyState(VK_SHIFT) < 0); + if(wParam == VK_F10 && bShift) + { + if(m_nActivePage != -1) + { + RECT rect = { 0 }; + m_tab.GetItemRect(m_nActivePage, &rect); + POINT pt = { rect.left, rect.bottom }; + T* pT = static_cast(this); + pT->OnContextMenu(m_nActivePage, pt); + } + } + else + { + bHandled = FALSE; + } + + return 0; + } + +// Implementation helpers + bool IsValidPageIndex(int nPage) const + { + return (nPage >= 0 && nPage < GetPageCount()); + } + + bool MovePage(int nMovePage, int nInsertBeforePage) + { + ATLASSERT(IsValidPageIndex(nMovePage)); + ATLASSERT(IsValidPageIndex(nInsertBeforePage)); + + if(!IsValidPageIndex(nMovePage) || !IsValidPageIndex(nInsertBeforePage)) + return false; + + if(nMovePage == nInsertBeforePage) + return true; // nothing to do + + CTempBuffer buff; + LPTSTR lpstrTabText = buff.Allocate(m_cchTabTextLength + 1); + if(lpstrTabText == NULL) + return false; + TCITEMEXTRA tcix = { 0 }; + tcix.tciheader.mask = TCIF_TEXT | TCIF_IMAGE | TCIF_PARAM; + tcix.tciheader.pszText = lpstrTabText; + tcix.tciheader.cchTextMax = m_cchTabTextLength + 1; + BOOL bRet = m_tab.GetItem(nMovePage, tcix); + ATLASSERT(bRet != FALSE); + if(bRet == FALSE) + return false; + + int nInsertItem = (nInsertBeforePage > nMovePage) ? nInsertBeforePage + 1 : nInsertBeforePage; + int nNewItem = m_tab.InsertItem(nInsertItem, tcix); + ATLASSERT(nNewItem == nInsertItem); + if(nNewItem != nInsertItem) + { + ATLVERIFY(m_tab.DeleteItem(nNewItem)); + return false; + } + + if(nMovePage > nInsertBeforePage) + ATLVERIFY(m_tab.DeleteItem(nMovePage + 1) != FALSE); + else if(nMovePage < nInsertBeforePage) + ATLVERIFY(m_tab.DeleteItem(nMovePage) != FALSE); + + SetActivePage(nInsertBeforePage); + T* pT = static_cast(this); + pT->OnPageActivated(m_nActivePage); + + return true; + } + +// Implementation overrideables + bool CreateTabControl() + { +#ifndef _WIN32_WCE + m_tab.Create(m_hWnd, rcDefault, NULL, WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | TCS_TOOLTIPS, 0, m_nTabID); +#else // CE specific + m_tab.Create(m_hWnd, rcDefault, NULL, WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, 0, m_nTabID); +#endif // _WIN32_WCE + ATLASSERT(m_tab.m_hWnd != NULL); + if(m_tab.m_hWnd == NULL) + return false; + + m_tab.SetFont(AtlGetDefaultGuiFont()); + + m_tab.SetItemExtra(sizeof(TABVIEWPAGE)); + + T* pT = static_cast(this); + m_cyTabHeight = pT->CalcTabHeight(); + + return true; + } + + int CalcTabHeight() + { + int nCount = m_tab.GetItemCount(); + TCITEMEXTRA tcix = { 0 }; + tcix.tciheader.mask = TCIF_TEXT; + tcix.tciheader.pszText = _T("NS"); + int nIndex = m_tab.InsertItem(nCount, tcix); + + RECT rect = { 0, 0, 1000, 1000 }; + m_tab.AdjustRect(FALSE, &rect); + + RECT rcWnd = { 0, 0, 1000, rect.top }; + ::AdjustWindowRectEx(&rcWnd, m_tab.GetStyle(), FALSE, m_tab.GetExStyle()); + + int nHeight = rcWnd.bottom - rcWnd.top; + + m_tab.DeleteItem(nIndex); + + return nHeight; + } + + void ShowTabControl(bool bShow) + { + m_tab.ShowWindow(bShow ? SW_SHOWNOACTIVATE : SW_HIDE); + } + + void UpdateLayout() + { + RECT rect; + GetClientRect(&rect); + + if(m_tab.IsWindow() && ((m_tab.GetStyle() & WS_VISIBLE) != 0)) + m_tab.SetWindowPos(NULL, 0, 0, rect.right - rect.left, m_cyTabHeight, SWP_NOZORDER); + + if(m_nActivePage != -1) + ::SetWindowPos(GetPageHWND(m_nActivePage), NULL, 0, m_cyTabHeight, rect.right - rect.left, rect.bottom - rect.top - m_cyTabHeight, SWP_NOZORDER); + } + + void UpdateMenu() + { + if(m_menu.m_hMenu != NULL) + BuildWindowMenu(m_menu, m_nMenuItemsCount, m_bEmptyMenuItem, m_bWindowsMenuItem, m_bActivePageMenuItem, m_bActiveAsDefaultMenuItem); + } + + void UpdateTitleBar() + { + if(!m_wndTitleBar.IsWindow() || m_lpstrTitleBarBase == NULL) + return; // nothing to do + + if(m_nActivePage != -1) + { + T* pT = static_cast(this); + LPCTSTR lpstrTitle = pT->GetPageTitle(m_nActivePage); + LPCTSTR lpstrDivider = pT->GetTitleDividerText(); + int cchBuffer = m_cchTitleBarLength + lstrlen(lpstrDivider) + lstrlen(m_lpstrTitleBarBase) + 1; + CTempBuffer buff; + LPTSTR lpstrPageTitle = buff.Allocate(cchBuffer); + ATLASSERT(lpstrPageTitle != NULL); + if(lpstrPageTitle != NULL) + { + pT->ShortenTitle(lpstrTitle, lpstrPageTitle, m_cchTitleBarLength + 1); + SecureHelper::strcat_x(lpstrPageTitle, cchBuffer, lpstrDivider); + SecureHelper::strcat_x(lpstrPageTitle, cchBuffer, m_lpstrTitleBarBase); + } + else + { + lpstrPageTitle = m_lpstrTitleBarBase; + } + + m_wndTitleBar.SetWindowText(lpstrPageTitle); + } + else + { + m_wndTitleBar.SetWindowText(m_lpstrTitleBarBase); + } + } + + void DrawMoveMark(int nItem) + { + T* pT = static_cast(this); + + if(m_nInsertItem != -1) + { + RECT rect = { 0 }; + pT->GetMoveMarkRect(rect); + m_tab.InvalidateRect(&rect); + } + + m_nInsertItem = nItem; + + if(m_nInsertItem != -1) + { + CClientDC dc(m_tab.m_hWnd); + + RECT rect = { 0 }; + pT->GetMoveMarkRect(rect); + + CPen pen; + pen.CreatePen(PS_SOLID, 1, ::GetSysColor(COLOR_WINDOWTEXT)); + CBrush brush; + brush.CreateSolidBrush(::GetSysColor(COLOR_WINDOWTEXT)); + + HPEN hPenOld = dc.SelectPen(pen); + HBRUSH hBrushOld = dc.SelectBrush(brush); + + int x = rect.left; + int y = rect.top; + POINT ptsTop[3] = { { x, y }, { x + m_cxMoveMark, y }, { x + (m_cxMoveMark / 2), y + m_cyMoveMark } }; + dc.Polygon(ptsTop, 3); + + y = rect.bottom - 1; + POINT ptsBottom[3] = { { x, y }, { x + m_cxMoveMark, y }, { x + (m_cxMoveMark / 2), y - m_cyMoveMark } }; + dc.Polygon(ptsBottom, 3); + + dc.SelectPen(hPenOld); + dc.SelectBrush(hBrushOld); + } + } + + void GetMoveMarkRect(RECT& rect) const + { + m_tab.GetClientRect(&rect); + + RECT rcItem = { 0 }; + m_tab.GetItemRect(m_nInsertItem, &rcItem); + + if(m_nInsertItem <= m_nActivePage) + { + rect.left = rcItem.left - m_cxMoveMark / 2 - 1; + rect.right = rcItem.left + m_cxMoveMark / 2; + } + else + { + rect.left = rcItem.right - m_cxMoveMark / 2 - 1; + rect.right = rcItem.right + m_cxMoveMark / 2; + } + } + + void SetMoveCursor(bool bCanMove) + { + ::SetCursor(::LoadCursor(NULL, bCanMove ? IDC_ARROW : IDC_NO)); + } + + void GenerateDragImage(int nItem) + { + ATLASSERT(IsValidPageIndex(nItem)); + +#ifndef _WIN32_WCE + RECT rcItem = { 0 }; + m_tab.GetItemRect(nItem, &rcItem); + ::InflateRect(&rcItem, 2, 2); // make bigger to cover selected item +#else // CE specific + nItem; // avoid level 4 warning + RECT rcItem = { 0, 0, 40, 20 }; +#endif // _WIN32_WCE + + ATLASSERT(m_ilDrag.m_hImageList == NULL); + m_ilDrag.Create(rcItem.right - rcItem.left, rcItem.bottom - rcItem.top, ILC_COLORDDB | ILC_MASK, 1, 1); + + CClientDC dc(m_hWnd); + CDC dcMem; + dcMem.CreateCompatibleDC(dc); + ATLASSERT(dcMem.m_hDC != NULL); + dcMem.SetViewportOrg(-rcItem.left, -rcItem.top); + + CBitmap bmp; + bmp.CreateCompatibleBitmap(dc, rcItem.right - rcItem.left, rcItem.bottom - rcItem.top); + ATLASSERT(bmp.m_hBitmap != NULL); + + HBITMAP hBmpOld = dcMem.SelectBitmap(bmp); +#ifndef _WIN32_WCE + m_tab.SendMessage(WM_PRINTCLIENT, (WPARAM)dcMem.m_hDC); +#else // CE specific + dcMem.Rectangle(&rcItem); +#endif // _WIN32_WCE + dcMem.SelectBitmap(hBmpOld); + + ATLVERIFY(m_ilDrag.Add(bmp.m_hBitmap, RGB(255, 0, 255)) != -1); + } + + void ShortenTitle(LPCTSTR lpstrTitle, LPTSTR lpstrShortTitle, int cchShortTitle) + { + if(lstrlen(lpstrTitle) >= cchShortTitle) + { + LPCTSTR lpstrEllipsis = _T("..."); + int cchEllipsis = lstrlen(lpstrEllipsis); + SecureHelper::strncpy_x(lpstrShortTitle, cchShortTitle, lpstrTitle, cchShortTitle - cchEllipsis - 1); + SecureHelper::strcat_x(lpstrShortTitle, cchShortTitle, lpstrEllipsis); + } + else + { + SecureHelper::strcpy_x(lpstrShortTitle, cchShortTitle, lpstrTitle); + } + } + +#ifndef _WIN32_WCE + void UpdateTooltipText(LPNMTTDISPINFO pTTDI) + { + ATLASSERT(pTTDI != NULL); + pTTDI->lpszText = (LPTSTR)GetPageTitle((int)pTTDI->hdr.idFrom); + } +#endif // !_WIN32_WCE + +// Text for menu items and title bar - override to provide different strings + static LPCTSTR GetEmptyListText() + { + return _T("(Empty)"); + } + + static LPCTSTR GetWindowsMenuItemText() + { + return _T("&Windows..."); + } + + static LPCTSTR GetTitleDividerText() + { + return _T(" - "); + } + +// Notifications - override to provide different behavior + void OnPageActivated(int nPage) + { + NMHDR nmhdr = { 0 }; + nmhdr.hwndFrom = m_hWnd; + nmhdr.idFrom = nPage; + nmhdr.code = TBVN_PAGEACTIVATED; + ::SendMessage(GetParent(), WM_NOTIFY, GetDlgCtrlID(), (LPARAM)&nmhdr); + } + + void OnContextMenu(int nPage, POINT pt) + { + m_tab.ClientToScreen(&pt); + + TBVCONTEXTMENUINFO cmi = { 0 }; + cmi.hdr.hwndFrom = m_hWnd; + cmi.hdr.idFrom = nPage; + cmi.hdr.code = TBVN_CONTEXTMENU; + cmi.pt = pt; + ::SendMessage(GetParent(), WM_NOTIFY, GetDlgCtrlID(), (LPARAM)&cmi); + } +}; + + +class CTabView : public CTabViewImpl +{ +public: + DECLARE_WND_CLASS_EX(_T("WTL_TabView"), 0, COLOR_APPWORKSPACE) +}; + +}; // namespace WTL + +#endif // __ATLCTRLX_H__ diff --git a/Externals/WTL80/atlddx.h b/Externals/WTL80/atlddx.h new file mode 100644 index 0000000000..ad4249a81c --- /dev/null +++ b/Externals/WTL80/atlddx.h @@ -0,0 +1,624 @@ +// Windows Template Library - WTL version 8.0 +// Copyright (C) Microsoft Corporation. All rights reserved. +// +// This file is a part of the Windows Template Library. +// The use and distribution terms for this software are covered by the +// Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php) +// which can be found in the file CPL.TXT at the root of this distribution. +// By using this software in any fashion, you are agreeing to be bound by +// the terms of this license. You must not remove this notice, or +// any other, from this software. + +#ifndef __ATLDDX_H__ +#define __ATLDDX_H__ + +#pragma once + +#ifndef __cplusplus + #error ATL requires C++ compilation (use a .cpp suffix) +#endif + +#ifndef __ATLAPP_H__ + #error atlddx.h requires atlapp.h to be included first +#endif + +#if defined(_ATL_USE_DDX_FLOAT) && defined(_ATL_MIN_CRT) + #error Cannot use floating point DDX with _ATL_MIN_CRT defined +#endif // defined(_ATL_USE_DDX_FLOAT) && defined(_ATL_MIN_CRT) + +#ifdef _ATL_USE_DDX_FLOAT + #include +#endif // _ATL_USE_DDX_FLOAT + + +/////////////////////////////////////////////////////////////////////////////// +// Classes in this file: +// +// CWinDataExchange + + +namespace WTL +{ + +// Constants +#define DDX_LOAD FALSE +#define DDX_SAVE TRUE + +// DDX map macros +#define BEGIN_DDX_MAP(thisClass) \ + BOOL DoDataExchange(BOOL bSaveAndValidate = FALSE, UINT nCtlID = (UINT)-1) \ + { \ + bSaveAndValidate; \ + nCtlID; + +#define DDX_TEXT(nID, var) \ + if(nCtlID == (UINT)-1 || nCtlID == nID) \ + { \ + if(!DDX_Text(nID, var, sizeof(var), bSaveAndValidate)) \ + return FALSE; \ + } + +#define DDX_TEXT_LEN(nID, var, len) \ + if(nCtlID == (UINT)-1 || nCtlID == nID) \ + { \ + if(!DDX_Text(nID, var, sizeof(var), bSaveAndValidate, TRUE, len)) \ + return FALSE; \ + } + +#define DDX_INT(nID, var) \ + if(nCtlID == (UINT)-1 || nCtlID == nID) \ + { \ + if(!DDX_Int(nID, var, TRUE, bSaveAndValidate)) \ + return FALSE; \ + } + +#define DDX_INT_RANGE(nID, var, min, max) \ + if(nCtlID == (UINT)-1 || nCtlID == nID) \ + { \ + if(!DDX_Int(nID, var, TRUE, bSaveAndValidate, TRUE, min, max)) \ + return FALSE; \ + } + +#define DDX_UINT(nID, var) \ + if(nCtlID == (UINT)-1 || nCtlID == nID) \ + { \ + if(!DDX_Int(nID, var, FALSE, bSaveAndValidate)) \ + return FALSE; \ + } + +#define DDX_UINT_RANGE(nID, var, min, max) \ + if(nCtlID == (UINT)-1 || nCtlID == nID) \ + { \ + if(!DDX_Int(nID, var, FALSE, bSaveAndValidate, TRUE, min, max)) \ + return FALSE; \ + } + +#ifdef _ATL_USE_DDX_FLOAT +#define DDX_FLOAT(nID, var) \ + if(nCtlID == (UINT)-1 || nCtlID == nID) \ + { \ + if(!DDX_Float(nID, var, bSaveAndValidate)) \ + return FALSE; \ + } + +#define DDX_FLOAT_RANGE(nID, var, min, max) \ + if(nCtlID == (UINT)-1 || nCtlID == nID) \ + { \ + if(!DDX_Float(nID, var, bSaveAndValidate, TRUE, min, max)) \ + return FALSE; \ + } +#define DDX_FLOAT_P(nID, var, precision) \ + if(nCtlID == (UINT)-1 || nCtlID == nID) \ + { \ + if(!DDX_Float(nID, var, bSaveAndValidate, FALSE, 0, 0, precision)) \ + return FALSE; \ + } + +#define DDX_FLOAT_P_RANGE(nID, var, min, max, precision) \ + if(nCtlID == (UINT)-1 || nCtlID == nID) \ + { \ + if(!DDX_Float(nID, var, bSaveAndValidate, TRUE, min, max, precision)) \ + return FALSE; \ + } +#endif // _ATL_USE_DDX_FLOAT + +#define DDX_CONTROL(nID, obj) \ + if(nCtlID == (UINT)-1 || nCtlID == nID) \ + DDX_Control(nID, obj, bSaveAndValidate); + +#define DDX_CONTROL_HANDLE(nID, obj) \ + if(nCtlID == (UINT)-1 || nCtlID == nID) \ + DDX_Control_Handle(nID, obj, bSaveAndValidate); + +#define DDX_CHECK(nID, var) \ + if(nCtlID == (UINT)-1 || nCtlID == nID) \ + DDX_Check(nID, var, bSaveAndValidate); + +#define DDX_RADIO(nID, var) \ + if(nCtlID == (UINT)-1 || nCtlID == nID) \ + DDX_Radio(nID, var, bSaveAndValidate); + +#define END_DDX_MAP() \ + return TRUE; \ + } + + +/////////////////////////////////////////////////////////////////////////////// +// CWinDataExchange - provides support for DDX + +template +class CWinDataExchange +{ +public: +// Data exchange method - override in your derived class + BOOL DoDataExchange(BOOL /*bSaveAndValidate*/ = FALSE, UINT /*nCtlID*/ = (UINT)-1) + { + // this one should never be called, override it in + // your derived class by implementing DDX map + ATLASSERT(FALSE); + return FALSE; + } + +// Helpers for validation error reporting + enum _XDataType + { + ddxDataNull = 0, + ddxDataText = 1, + ddxDataInt = 2, + ddxDataFloat = 3, + ddxDataDouble = 4 + }; + + struct _XTextData + { + int nLength; + int nMaxLength; + }; + + struct _XIntData + { + long nVal; + long nMin; + long nMax; + }; + + struct _XFloatData + { + double nVal; + double nMin; + double nMax; + }; + + struct _XData + { + _XDataType nDataType; + union + { + _XTextData textData; + _XIntData intData; + _XFloatData floatData; + }; + }; + +// Text exchange + BOOL DDX_Text(UINT nID, LPTSTR lpstrText, int cbSize, BOOL bSave, BOOL bValidate = FALSE, int nLength = 0) + { + T* pT = static_cast(this); + BOOL bSuccess = TRUE; + + if(bSave) + { + HWND hWndCtrl = pT->GetDlgItem(nID); + int nRetLen = ::GetWindowText(hWndCtrl, lpstrText, cbSize / sizeof(TCHAR)); + if(nRetLen < ::GetWindowTextLength(hWndCtrl)) + bSuccess = FALSE; + } + else + { + ATLASSERT(!bValidate || lstrlen(lpstrText) <= nLength); + bSuccess = pT->SetDlgItemText(nID, lpstrText); + } + + if(!bSuccess) + { + pT->OnDataExchangeError(nID, bSave); + } + else if(bSave && bValidate) // validation + { + ATLASSERT(nLength > 0); + if(lstrlen(lpstrText) > nLength) + { + _XData data = { ddxDataText }; + data.textData.nLength = lstrlen(lpstrText); + data.textData.nMaxLength = nLength; + pT->OnDataValidateError(nID, bSave, data); + bSuccess = FALSE; + } + } + return bSuccess; + } + + BOOL DDX_Text(UINT nID, BSTR& bstrText, int /*cbSize*/, BOOL bSave, BOOL bValidate = FALSE, int nLength = 0) + { + T* pT = static_cast(this); + BOOL bSuccess = TRUE; + + if(bSave) + { + bSuccess = pT->GetDlgItemText(nID, bstrText); + } + else + { + USES_CONVERSION; + LPTSTR lpstrText = OLE2T(bstrText); + ATLASSERT(!bValidate || lstrlen(lpstrText) <= nLength); + bSuccess = pT->SetDlgItemText(nID, lpstrText); + } + + if(!bSuccess) + { + pT->OnDataExchangeError(nID, bSave); + } + else if(bSave && bValidate) // validation + { + ATLASSERT(nLength > 0); + if((int)::SysStringLen(bstrText) > nLength) + { + _XData data = { ddxDataText }; + data.textData.nLength = (int)::SysStringLen(bstrText); + data.textData.nMaxLength = nLength; + pT->OnDataValidateError(nID, bSave, data); + bSuccess = FALSE; + } + } + return bSuccess; + } + + BOOL DDX_Text(UINT nID, ATL::CComBSTR& bstrText, int /*cbSize*/, BOOL bSave, BOOL bValidate = FALSE, int nLength = 0) + { + T* pT = static_cast(this); + BOOL bSuccess = TRUE; + + if(bSave) + { + bSuccess = pT->GetDlgItemText(nID, (BSTR&)bstrText); + } + else + { + USES_CONVERSION; + LPTSTR lpstrText = OLE2T(bstrText); + ATLASSERT(!bValidate || lstrlen(lpstrText) <= nLength); + bSuccess = pT->SetDlgItemText(nID, lpstrText); + } + + if(!bSuccess) + { + pT->OnDataExchangeError(nID, bSave); + } + else if(bSave && bValidate) // validation + { + ATLASSERT(nLength > 0); + if((int)bstrText.Length() > nLength) + { + _XData data = { ddxDataText }; + data.textData.nLength = (int)bstrText.Length(); + data.textData.nMaxLength = nLength; + pT->OnDataValidateError(nID, bSave, data); + bSuccess = FALSE; + } + } + return bSuccess; + } + +#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) + BOOL DDX_Text(UINT nID, _CSTRING_NS::CString& strText, int /*cbSize*/, BOOL bSave, BOOL bValidate = FALSE, int nLength = 0) + { + T* pT = static_cast(this); + BOOL bSuccess = TRUE; + + if(bSave) + { + HWND hWndCtrl = pT->GetDlgItem(nID); + int nLen = ::GetWindowTextLength(hWndCtrl); + int nRetLen = -1; + LPTSTR lpstr = strText.GetBufferSetLength(nLen); + if(lpstr != NULL) + { + nRetLen = ::GetWindowText(hWndCtrl, lpstr, nLen + 1); + strText.ReleaseBuffer(); + } + if(nRetLen < nLen) + bSuccess = FALSE; + } + else + { + bSuccess = pT->SetDlgItemText(nID, strText); + } + + if(!bSuccess) + { + pT->OnDataExchangeError(nID, bSave); + } + else if(bSave && bValidate) // validation + { + ATLASSERT(nLength > 0); + if(strText.GetLength() > nLength) + { + _XData data = { ddxDataText }; + data.textData.nLength = strText.GetLength(); + data.textData.nMaxLength = nLength; + pT->OnDataValidateError(nID, bSave, data); + bSuccess = FALSE; + } + } + return bSuccess; + } +#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) + +// Numeric exchange + template + BOOL DDX_Int(UINT nID, Type& nVal, BOOL bSigned, BOOL bSave, BOOL bValidate = FALSE, Type nMin = 0, Type nMax = 0) + { + T* pT = static_cast(this); + BOOL bSuccess = TRUE; + + if(bSave) + { + nVal = (Type)pT->GetDlgItemInt(nID, &bSuccess, bSigned); + } + else + { + ATLASSERT(!bValidate || nVal >= nMin && nVal <= nMax); + bSuccess = pT->SetDlgItemInt(nID, nVal, bSigned); + } + + if(!bSuccess) + { + pT->OnDataExchangeError(nID, bSave); + } + else if(bSave && bValidate) // validation + { + ATLASSERT(nMin != nMax); + if(nVal < nMin || nVal > nMax) + { + _XData data = { ddxDataInt }; + data.intData.nVal = (long)nVal; + data.intData.nMin = (long)nMin; + data.intData.nMax = (long)nMax; + pT->OnDataValidateError(nID, bSave, data); + bSuccess = FALSE; + } + } + return bSuccess; + } + +// Float exchange +#ifdef _ATL_USE_DDX_FLOAT + static BOOL _AtlSimpleFloatParse(LPCTSTR lpszText, double& d) + { + ATLASSERT(lpszText != NULL); + while (*lpszText == _T(' ') || *lpszText == _T('\t')) + lpszText++; + + TCHAR chFirst = lpszText[0]; + d = _tcstod(lpszText, (LPTSTR*)&lpszText); + if (d == 0.0 && chFirst != _T('0')) + return FALSE; // could not convert + while (*lpszText == _T(' ') || *lpszText == _T('\t')) + lpszText++; + + if (*lpszText != _T('\0')) + return FALSE; // not terminated properly + + return TRUE; + } + + BOOL DDX_Float(UINT nID, float& nVal, BOOL bSave, BOOL bValidate = FALSE, float nMin = 0.F, float nMax = 0.F, int nPrecision = FLT_DIG) + { + T* pT = static_cast(this); + BOOL bSuccess = TRUE; + const int cchBuff = 32; + TCHAR szBuff[cchBuff] = { 0 }; + + if(bSave) + { + pT->GetDlgItemText(nID, szBuff, cchBuff); + double d = 0; + if(_AtlSimpleFloatParse(szBuff, d)) + nVal = (float)d; + else + bSuccess = FALSE; + } + else + { + ATLASSERT(!bValidate || nVal >= nMin && nVal <= nMax); + SecureHelper::sprintf_x(szBuff, cchBuff, _T("%.*g"), nPrecision, nVal); + bSuccess = pT->SetDlgItemText(nID, szBuff); + } + + if(!bSuccess) + { + pT->OnDataExchangeError(nID, bSave); + } + else if(bSave && bValidate) // validation + { + ATLASSERT(nMin != nMax); + if(nVal < nMin || nVal > nMax) + { + _XData data = { ddxDataFloat }; + data.floatData.nVal = (double)nVal; + data.floatData.nMin = (double)nMin; + data.floatData.nMax = (double)nMax; + pT->OnDataValidateError(nID, bSave, data); + bSuccess = FALSE; + } + } + return bSuccess; + } + + BOOL DDX_Float(UINT nID, double& nVal, BOOL bSave, BOOL bValidate = FALSE, double nMin = 0., double nMax = 0., int nPrecision = DBL_DIG) + { + T* pT = static_cast(this); + BOOL bSuccess = TRUE; + const int cchBuff = 32; + TCHAR szBuff[cchBuff] = { 0 }; + + if(bSave) + { + pT->GetDlgItemText(nID, szBuff, cchBuff); + double d = 0; + if(_AtlSimpleFloatParse(szBuff, d)) + nVal = d; + else + bSuccess = FALSE; + } + else + { + ATLASSERT(!bValidate || nVal >= nMin && nVal <= nMax); + SecureHelper::sprintf_x(szBuff, cchBuff, _T("%.*g"), nPrecision, nVal); + bSuccess = pT->SetDlgItemText(nID, szBuff); + } + + if(!bSuccess) + { + pT->OnDataExchangeError(nID, bSave); + } + else if(bSave && bValidate) // validation + { + ATLASSERT(nMin != nMax); + if(nVal < nMin || nVal > nMax) + { + _XData data = { ddxDataFloat }; + data.floatData.nVal = nVal; + data.floatData.nMin = nMin; + data.floatData.nMax = nMax; + pT->OnDataValidateError(nID, bSave, data); + bSuccess = FALSE; + } + } + return bSuccess; + } +#endif // _ATL_USE_DDX_FLOAT + +// Full control subclassing (for CWindowImpl derived controls) + template + void DDX_Control(UINT nID, TControl& ctrl, BOOL bSave) + { + if(!bSave && ctrl.m_hWnd == NULL) + { + T* pT = static_cast(this); + ctrl.SubclassWindow(pT->GetDlgItem(nID)); + } + } + +// Simple control attaching (for HWND wrapper controls) + template + void DDX_Control_Handle(UINT nID, TControl& ctrl, BOOL bSave) + { + if(!bSave && ctrl.m_hWnd == NULL) + { + T* pT = static_cast(this); + ctrl = pT->GetDlgItem(nID); + } + } + +// Control state + void DDX_Check(UINT nID, int& nValue, BOOL bSave) + { + T* pT = static_cast(this); + HWND hWndCtrl = pT->GetDlgItem(nID); + if(bSave) + { + nValue = (int)::SendMessage(hWndCtrl, BM_GETCHECK, 0, 0L); + ATLASSERT(nValue >= 0 && nValue <= 2); + } + else + { + if(nValue < 0 || nValue > 2) + { + ATLTRACE2(atlTraceUI, 0, _T("ATL: Warning - dialog data checkbox value (%d) out of range.\n"), nValue); + nValue = 0; // default to off + } + ::SendMessage(hWndCtrl, BM_SETCHECK, nValue, 0L); + } + } + + // variant that supports bool (checked/not-checked, no intermediate state) + void DDX_Check(UINT nID, bool& bCheck, BOOL bSave) + { + int nValue = bCheck ? 1 : 0; + DDX_Check(nID, nValue, bSave); + + if(bSave) + { + if(nValue == 2) + ATLTRACE2(atlTraceUI, 0, _T("ATL: Warning - checkbox state (%d) out of supported range.\n"), nValue); + bCheck = (nValue == 1); + } + } + + void DDX_Radio(UINT nID, int& nValue, BOOL bSave) + { + T* pT = static_cast(this); + HWND hWndCtrl = pT->GetDlgItem(nID); + ATLASSERT(hWndCtrl != NULL); + + // must be first in a group of auto radio buttons + ATLASSERT(::GetWindowLong(hWndCtrl, GWL_STYLE) & WS_GROUP); + ATLASSERT(::SendMessage(hWndCtrl, WM_GETDLGCODE, 0, 0L) & DLGC_RADIOBUTTON); + + if(bSave) + nValue = -1; // value if none found + + // walk all children in group + int nButton = 0; + do + { + if(::SendMessage(hWndCtrl, WM_GETDLGCODE, 0, 0L) & DLGC_RADIOBUTTON) + { + // control in group is a radio button + if(bSave) + { + if(::SendMessage(hWndCtrl, BM_GETCHECK, 0, 0L) != 0) + { + ATLASSERT(nValue == -1); // only set once + nValue = nButton; + } + } + else + { + // select button + ::SendMessage(hWndCtrl, BM_SETCHECK, (nButton == nValue), 0L); + } + nButton++; + } + else + { + ATLTRACE2(atlTraceUI, 0, _T("ATL: Warning - skipping non-radio button in group.\n")); + } + hWndCtrl = ::GetWindow(hWndCtrl, GW_HWNDNEXT); + } + while (hWndCtrl != NULL && !(GetWindowLong(hWndCtrl, GWL_STYLE) & WS_GROUP)); + } + +// Overrideables + void OnDataExchangeError(UINT nCtrlID, BOOL /*bSave*/) + { + // Override to display an error message + ::MessageBeep((UINT)-1); + T* pT = static_cast(this); + ::SetFocus(pT->GetDlgItem(nCtrlID)); + } + + void OnDataValidateError(UINT nCtrlID, BOOL /*bSave*/, _XData& /*data*/) + { + // Override to display an error message + ::MessageBeep((UINT)-1); + T* pT = static_cast(this); + ::SetFocus(pT->GetDlgItem(nCtrlID)); + } +}; + +}; // namespace WTL + +#endif // __ATLDDX_H__ diff --git a/Externals/WTL80/atldlgs.h b/Externals/WTL80/atldlgs.h new file mode 100644 index 0000000000..c0fd568608 --- /dev/null +++ b/Externals/WTL80/atldlgs.h @@ -0,0 +1,6212 @@ +// Windows Template Library - WTL version 8.0 +// Copyright (C) Microsoft Corporation. All rights reserved. +// +// This file is a part of the Windows Template Library. +// The use and distribution terms for this software are covered by the +// Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php) +// which can be found in the file CPL.TXT at the root of this distribution. +// By using this software in any fashion, you are agreeing to be bound by +// the terms of this license. You must not remove this notice, or +// any other, from this software. + +#ifndef __ATLDLGS_H__ +#define __ATLDLGS_H__ + +#pragma once + +#ifndef __cplusplus + #error ATL requires C++ compilation (use a .cpp suffix) +#endif + +#ifndef __ATLAPP_H__ + #error atldlgs.h requires atlapp.h to be included first +#endif + +#ifndef __ATLWIN_H__ + #error atldlgs.h requires atlwin.h to be included first +#endif + +#include +#include + +#if (_WIN32_WINNT >= 0x0600) && !defined(_WIN32_WCE) + #include +#endif // (_WIN32_WINNT >= 0x0600) && !defined(_WIN32_WCE) + + +/////////////////////////////////////////////////////////////////////////////// +// Classes in this file: +// +// CFileDialogImpl +// CFileDialog +// CFileDialogEx +// CMultiFileDialogImpl +// CMultiFileDialog +// CShellFileDialogImpl +// CShellFileOpenDialogImpl +// CShellFileOpenDialog +// CShellFileSaveDialogImpl +// CShellFileSaveDialog +// CFolderDialogImpl +// CFolderDialog +// CFontDialogImpl +// CFontDialog +// CRichEditFontDialogImpl +// CRichEditFontDialog +// CColorDialogImpl +// CColorDialog +// CPrintDialogImpl +// CPrintDialog +// CPrintDialogExImpl +// CPrintDialogEx +// CPageSetupDialogImpl +// CPageSetupDialog +// CFindReplaceDialogImpl +// CFindReplaceDialog +// +// CMemDlgTemplate +// CIndirectDialogImpl +// +// CPropertySheetWindow +// CPropertySheetImpl +// CPropertySheet +// CPropertyPageWindow +// CPropertyPageImpl +// CPropertyPage +// CAxPropertyPageImpl +// CAxPropertyPage +// +// CWizard97SheetWindow +// CWizard97SheetImpl +// CWizard97Sheet +// CWizard97PageWindow +// CWizard97PageImpl +// CWizard97ExteriorPageImpl +// CWizard97InteriorPageImpl +// +// CAeroWizardFrameWindow +// CAeroWizardFrameImpl +// CAeroWizardFrame +// CAeroWizardPageWindow +// CAeroWizardPageImpl +// CAeroWizardPage +// CAeroWizardAxPageImpl +// CAeroWizardAxPage +// +// CTaskDialogConfig +// CTaskDialogImpl +// CTaskDialog +// +// Global functions: +// AtlTaskDialog() + + +namespace WTL +{ + +/////////////////////////////////////////////////////////////////////////////// +// CFileDialogImpl - used for File Open or File Save As + +// compatibility with the old (vc6.0) headers +#if (_WIN32_WINNT >= 0x0500) && !defined(OPENFILENAME_SIZE_VERSION_400) + #ifndef CDSIZEOF_STRUCT + #define CDSIZEOF_STRUCT(structname, member) (((int)((LPBYTE)(&((structname*)0)->member) - ((LPBYTE)((structname*)0)))) + sizeof(((structname*)0)->member)) + #endif + #define OPENFILENAME_SIZE_VERSION_400A CDSIZEOF_STRUCT(OPENFILENAMEA,lpTemplateName) + #define OPENFILENAME_SIZE_VERSION_400W CDSIZEOF_STRUCT(OPENFILENAMEW,lpTemplateName) + #ifdef UNICODE + #define OPENFILENAME_SIZE_VERSION_400 OPENFILENAME_SIZE_VERSION_400W + #else + #define OPENFILENAME_SIZE_VERSION_400 OPENFILENAME_SIZE_VERSION_400A + #endif // !UNICODE +#endif // (_WIN32_WINNT >= 0x0500) && !defined(OPENFILENAME_SIZE_VERSION_400) + +#if !defined(_WIN32_WCE) && !defined(CDN_INCLUDEITEM) + #define CDN_INCLUDEITEM (CDN_FIRST - 0x0007) +#endif + +template +class ATL_NO_VTABLE CFileDialogImpl : public ATL::CDialogImplBase +{ +public: +#if defined(__AYGSHELL_H__) && (_WIN32_WCE >= 0x0501) + OPENFILENAMEEX m_ofn; +#else + OPENFILENAME m_ofn; +#endif + BOOL m_bOpenFileDialog; // TRUE for file open, FALSE for file save + TCHAR m_szFileTitle[_MAX_FNAME]; // contains file title after return + TCHAR m_szFileName[_MAX_PATH]; // contains full path name after return + + CFileDialogImpl(BOOL bOpenFileDialog, // TRUE for FileOpen, FALSE for FileSaveAs + LPCTSTR lpszDefExt = NULL, + LPCTSTR lpszFileName = NULL, + DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, + LPCTSTR lpszFilter = NULL, + HWND hWndParent = NULL) + { + memset(&m_ofn, 0, sizeof(m_ofn)); // initialize structure to 0/NULL + m_szFileName[0] = _T('\0'); + m_szFileTitle[0] = _T('\0'); + + m_bOpenFileDialog = bOpenFileDialog; + + m_ofn.lStructSize = sizeof(m_ofn); +#if (_WIN32_WINNT >= 0x0500) + // adjust struct size if running on older version of Windows + if(AtlIsOldWindows()) + { + ATLASSERT(sizeof(m_ofn) > OPENFILENAME_SIZE_VERSION_400); // must be + m_ofn.lStructSize = OPENFILENAME_SIZE_VERSION_400; + } +#endif // (_WIN32_WINNT >= 0x0500) + m_ofn.lpstrFile = m_szFileName; + m_ofn.nMaxFile = _MAX_PATH; + m_ofn.lpstrDefExt = lpszDefExt; + m_ofn.lpstrFileTitle = (LPTSTR)m_szFileTitle; + m_ofn.nMaxFileTitle = _MAX_FNAME; +#ifndef _WIN32_WCE + m_ofn.Flags = dwFlags | OFN_EXPLORER | OFN_ENABLEHOOK | OFN_ENABLESIZING; +#else // CE specific + m_ofn.Flags = dwFlags | OFN_EXPLORER | OFN_ENABLEHOOK; +#endif // !_WIN32_WCE + m_ofn.lpstrFilter = lpszFilter; + m_ofn.hInstance = ModuleHelper::GetResourceInstance(); + m_ofn.lpfnHook = (LPOFNHOOKPROC)T::StartDialogProc; + m_ofn.hwndOwner = hWndParent; + + // setup initial file name + if(lpszFileName != NULL) + SecureHelper::strncpy_x(m_szFileName, _countof(m_szFileName), lpszFileName, _TRUNCATE); + } + + INT_PTR DoModal(HWND hWndParent = ::GetActiveWindow()) + { + ATLASSERT((m_ofn.Flags & OFN_ENABLEHOOK) != 0); + ATLASSERT(m_ofn.lpfnHook != NULL); // can still be a user hook + + ATLASSERT((m_ofn.Flags & OFN_EXPLORER) != 0); + + if(m_ofn.hwndOwner == NULL) // set only if not specified before + m_ofn.hwndOwner = hWndParent; + + ATLASSERT(m_hWnd == NULL); + ModuleHelper::AddCreateWndData(&m_thunk.cd, (ATL::CDialogImplBase*)this); + + BOOL bRet; + if(m_bOpenFileDialog) +#if defined(__AYGSHELL_H__) && (_WIN32_WCE >= 0x0501) + bRet = ::GetOpenFileNameEx(&m_ofn); + else + bRet = ::GetSaveFileName((LPOPENFILENAME)&m_ofn); +#else + bRet = ::GetOpenFileName(&m_ofn); + else + bRet = ::GetSaveFileName(&m_ofn); +#endif + + m_hWnd = NULL; + + return bRet ? IDOK : IDCANCEL; + } + +// Attributes + ATL::CWindow GetFileDialogWindow() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return ATL::CWindow(GetParent()); + } + + int GetFilePath(LPTSTR lpstrFilePath, int nLength) const + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT((m_ofn.Flags & OFN_EXPLORER) != 0); + + return (int)GetFileDialogWindow().SendMessage(CDM_GETFILEPATH, nLength, (LPARAM)lpstrFilePath); + } + + int GetFolderIDList(LPVOID lpBuff, int nLength) const + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT((m_ofn.Flags & OFN_EXPLORER) != 0); + + return (int)GetFileDialogWindow().SendMessage(CDM_GETFOLDERIDLIST, nLength, (LPARAM)lpBuff); + } + + int GetFolderPath(LPTSTR lpstrFolderPath, int nLength) const + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT((m_ofn.Flags & OFN_EXPLORER) != 0); + + return (int)GetFileDialogWindow().SendMessage(CDM_GETFOLDERPATH, nLength, (LPARAM)lpstrFolderPath); + } + + int GetSpec(LPTSTR lpstrSpec, int nLength) const + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT((m_ofn.Flags & OFN_EXPLORER) != 0); + + return (int)GetFileDialogWindow().SendMessage(CDM_GETSPEC, nLength, (LPARAM)lpstrSpec); + } + + void SetControlText(int nCtrlID, LPCTSTR lpstrText) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT((m_ofn.Flags & OFN_EXPLORER) != 0); + + GetFileDialogWindow().SendMessage(CDM_SETCONTROLTEXT, nCtrlID, (LPARAM)lpstrText); + } + + void SetDefExt(LPCTSTR lpstrExt) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT((m_ofn.Flags & OFN_EXPLORER) != 0); + + GetFileDialogWindow().SendMessage(CDM_SETDEFEXT, 0, (LPARAM)lpstrExt); + } + + BOOL GetReadOnlyPref() const // return TRUE if readonly checked + { + return ((m_ofn.Flags & OFN_READONLY) != 0) ? TRUE : FALSE; + } + +// Operations + void HideControl(int nCtrlID) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT((m_ofn.Flags & OFN_EXPLORER) != 0); + + GetFileDialogWindow().SendMessage(CDM_HIDECONTROL, nCtrlID); + } + +// Special override for common dialogs + BOOL EndDialog(INT_PTR /*nRetCode*/ = 0) + { + ATLASSERT(::IsWindow(m_hWnd)); + GetFileDialogWindow().SendMessage(WM_COMMAND, MAKEWPARAM(IDCANCEL, 0)); + return TRUE; + } + +// Message map and handlers + BEGIN_MSG_MAP(CFileDialogImpl) + NOTIFY_CODE_HANDLER(CDN_FILEOK, _OnFileOK) + NOTIFY_CODE_HANDLER(CDN_FOLDERCHANGE, _OnFolderChange) + NOTIFY_CODE_HANDLER(CDN_HELP, _OnHelp) + NOTIFY_CODE_HANDLER(CDN_INITDONE, _OnInitDone) + NOTIFY_CODE_HANDLER(CDN_SELCHANGE, _OnSelChange) + NOTIFY_CODE_HANDLER(CDN_SHAREVIOLATION, _OnShareViolation) + NOTIFY_CODE_HANDLER(CDN_TYPECHANGE, _OnTypeChange) +#ifndef _WIN32_WCE + NOTIFY_CODE_HANDLER(CDN_INCLUDEITEM, _OnIncludeItem) +#endif // !_WIN32_WCE + END_MSG_MAP() + + LRESULT _OnFileOK(int /*idCtrl*/, LPNMHDR pnmh, BOOL& /*bHandled*/) + { + ATLASSERT(::IsWindow(m_hWnd)); + T* pT = static_cast(this); + return !pT->OnFileOK((LPOFNOTIFY)pnmh); + } + + LRESULT _OnFolderChange(int /*idCtrl*/, LPNMHDR pnmh, BOOL& /*bHandled*/) + { + ATLASSERT(::IsWindow(m_hWnd)); + T* pT = static_cast(this); + pT->OnFolderChange((LPOFNOTIFY)pnmh); + return 0; + } + + LRESULT _OnHelp(int /*idCtrl*/, LPNMHDR pnmh, BOOL& /*bHandled*/) + { + ATLASSERT(::IsWindow(m_hWnd)); + T* pT = static_cast(this); + pT->OnHelp((LPOFNOTIFY)pnmh); + return 0; + } + + LRESULT _OnInitDone(int /*idCtrl*/, LPNMHDR pnmh, BOOL& /*bHandled*/) + { + ATLASSERT(::IsWindow(m_hWnd)); + T* pT = static_cast(this); + pT->OnInitDone((LPOFNOTIFY)pnmh); + return 0; + } + + LRESULT _OnSelChange(int /*idCtrl*/, LPNMHDR pnmh, BOOL& /*bHandled*/) + { + ATLASSERT(::IsWindow(m_hWnd)); + T* pT = static_cast(this); + pT->OnSelChange((LPOFNOTIFY)pnmh); + return 0; + } + + LRESULT _OnShareViolation(int /*idCtrl*/, LPNMHDR pnmh, BOOL& /*bHandled*/) + { + ATLASSERT(::IsWindow(m_hWnd)); + T* pT = static_cast(this); + return pT->OnShareViolation((LPOFNOTIFY)pnmh); + } + + LRESULT _OnTypeChange(int /*idCtrl*/, LPNMHDR pnmh, BOOL& /*bHandled*/) + { + ATLASSERT(::IsWindow(m_hWnd)); + T* pT = static_cast(this); + pT->OnTypeChange((LPOFNOTIFY)pnmh); + return 0; + } + +#ifndef _WIN32_WCE + LRESULT _OnIncludeItem(int /*idCtrl*/, LPNMHDR pnmh, BOOL& /*bHandled*/) + { + ATLASSERT(::IsWindow(m_hWnd)); + T* pT = static_cast(this); + return pT->OnIncludeItem((LPOFNOTIFYEX)pnmh); + } +#endif // !_WIN32_WCE + +// Overrideables + BOOL OnFileOK(LPOFNOTIFY /*lpon*/) + { + return TRUE; + } + + void OnFolderChange(LPOFNOTIFY /*lpon*/) + { + } + + void OnHelp(LPOFNOTIFY /*lpon*/) + { + } + + void OnInitDone(LPOFNOTIFY /*lpon*/) + { + } + + void OnSelChange(LPOFNOTIFY /*lpon*/) + { + } + + int OnShareViolation(LPOFNOTIFY /*lpon*/) + { + return 0; + } + + void OnTypeChange(LPOFNOTIFY /*lpon*/) + { + } + +#ifndef _WIN32_WCE + BOOL OnIncludeItem(LPOFNOTIFYEX /*lponex*/) + { + return TRUE; // include item + } +#endif // !_WIN32_WCE +}; + +class CFileDialog : public CFileDialogImpl +{ +public: + CFileDialog(BOOL bOpenFileDialog, // TRUE for FileOpen, FALSE for FileSaveAs + LPCTSTR lpszDefExt = NULL, + LPCTSTR lpszFileName = NULL, + DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, + LPCTSTR lpszFilter = NULL, + HWND hWndParent = NULL) + : CFileDialogImpl(bOpenFileDialog, lpszDefExt, lpszFileName, dwFlags, lpszFilter, hWndParent) + { } + + // override base class map and references to handlers + DECLARE_EMPTY_MSG_MAP() +}; + +#if defined(__AYGSHELL_H__) && (_WIN32_WCE >= 0x0501) +class CFileDialogEx : public CFileDialogImpl +{ +public: + CFileDialogEx( // Supports only FileOpen + LPCTSTR lpszDefExt = NULL, + LPCTSTR lpszFileName = NULL, + DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, + OFN_EXFLAG ExFlags = OFN_EXFLAG_THUMBNAILVIEW, + OFN_SORTORDER dwSortOrder = OFN_SORTORDER_AUTO, + LPCTSTR lpszFilter = NULL, + HWND hWndParent = NULL) + : CFileDialogImpl(TRUE, lpszDefExt, lpszFileName, dwFlags, lpszFilter, hWndParent) + { + m_ofn.ExFlags = ExFlags; + m_ofn.dwSortOrder = dwSortOrder; + } + + // override base class map and references to handlers + DECLARE_EMPTY_MSG_MAP() +}; +#endif // defined(__AYGSHELL_H__) && (_WIN32_WCE >= 0x0501) + + +/////////////////////////////////////////////////////////////////////////////// +// Multi File Dialog - Multi-select File Open dialog + +#ifndef _WIN32_WCE + +// The class dynamically resizes the buffer as the file selection changes +// (as described in Knowledge Base article 131462). It also expands selected +// shortcut files to take into account the full path of the target file. +// Note that this doesn't work on Win9x for the old style dialogs, as well as +// on NT for non-Unicode builds. + +#ifndef _WTL_FIXED_OFN_BUFFER_LENGTH + #define _WTL_FIXED_OFN_BUFFER_LENGTH 0x10000 +#endif + +template +class ATL_NO_VTABLE CMultiFileDialogImpl : public CFileDialogImpl< T > +{ +public: + mutable LPCTSTR m_pNextFile; +#ifndef _UNICODE + bool m_bIsNT; +#endif + + CMultiFileDialogImpl( + LPCTSTR lpszDefExt = NULL, + LPCTSTR lpszFileName = NULL, + DWORD dwFlags = OFN_HIDEREADONLY, + LPCTSTR lpszFilter = NULL, + HWND hWndParent = NULL) + : CFileDialogImpl(TRUE, lpszDefExt, lpszFileName, dwFlags, lpszFilter, hWndParent), + m_pNextFile(NULL) + { + m_ofn.Flags |= OFN_ALLOWMULTISELECT; // Force multiple selection mode + +#ifndef _UNICODE + OSVERSIONINFO ovi = { sizeof(ovi) }; + ::GetVersionEx(&ovi); + m_bIsNT = (ovi.dwPlatformId == VER_PLATFORM_WIN32_NT); + if (m_bIsNT) + { + // On NT platforms, GetOpenFileNameA thunks to GetOpenFileNameW and there + // is absolutely nothing we can do except to start off with a large buffer. + ATLVERIFY(ResizeFilenameBuffer(_WTL_FIXED_OFN_BUFFER_LENGTH)); + } +#endif + } + + ~CMultiFileDialogImpl() + { + if (m_ofn.lpstrFile != m_szFileName) // Free the buffer if we allocated it + delete[] m_ofn.lpstrFile; + } + +// Operations + // Get the directory that the files were chosen from. + // The function returns the number of characters copied, not including the terminating zero. + // If the buffer is NULL, the function returns the required size, in characters, including the terminating zero. + // If the function fails, the return value is zero. + int GetDirectory(LPTSTR pBuffer, int nBufLen) const + { + if (m_ofn.lpstrFile == NULL) + return 0; + + LPCTSTR pStr = m_ofn.lpstrFile; + int nLength = lstrlen(pStr); + if (pStr[nLength + 1] == 0) + { + // The OFN buffer contains a single item so extract its path. + LPCTSTR pSep = _strrchr(pStr, _T('\\')); + if (pSep != NULL) + nLength = (int)(DWORD_PTR)(pSep - pStr); + } + + int nRet = 0; + if (pBuffer == NULL) // If the buffer is NULL, return the required length + { + nRet = nLength + 1; + } + else if (nBufLen > nLength) + { + SecureHelper::strncpy_x(pBuffer, nBufLen, pStr, nLength); + nRet = nLength; + } + + return nRet; + } + +#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) + bool GetDirectory(_CSTRING_NS::CString& strDir) const + { + bool bRet = false; + + int nLength = GetDirectory(NULL, 0); + if (nLength > 0) + { + bRet = (GetDirectory(strDir.GetBuffer(nLength), nLength) > 0); + strDir.ReleaseBuffer(nLength - 1); + } + + return bRet; + } +#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) + + // Get the first filename as a pointer into the buffer. + LPCTSTR GetFirstFileName() const + { + if (m_ofn.lpstrFile == NULL) + return NULL; + + m_pNextFile = NULL; // Reset internal buffer pointer + + LPCTSTR pStr = m_ofn.lpstrFile; + int nLength = lstrlen(pStr); + if (pStr[nLength + 1] != 0) + { + // Multiple items were selected. The first string is the directory, + // so skip forwards to the second string. + pStr += nLength + 1; + + // Set up m_pNext so it points to the second item (or null). + m_pNextFile = pStr; + GetNextFileName(); + } + else + { + // A single item was selected. Skip forward past the path. + LPCTSTR pSep = _strrchr(pStr, _T('\\')); + if (pSep != NULL) + pStr = pSep + 1; + } + + return pStr; + } + + // Get the next filename as a pointer into the buffer. + LPCTSTR GetNextFileName() const + { + if (m_pNextFile == NULL) + return NULL; + + LPCTSTR pStr = m_pNextFile; + // Set "m_pNextFile" to point to the next file name, or null if we + // have reached the last file in the list. + int nLength = lstrlen(pStr); + m_pNextFile = (pStr[nLength + 1] != 0) ? &pStr[nLength + 1] : NULL; + + return pStr; + } + + // Get the first filename as a full path. + // The function returns the number of characters copied, not including the terminating zero. + // If the buffer is NULL, the function returns the required size, in characters, including the terminating zero. + // If the function fails, the return value is zero. + int GetFirstPathName(LPTSTR pBuffer, int nBufLen) const + { + LPCTSTR pStr = GetFirstFileName(); + int nLengthDir = GetDirectory(NULL, 0); + if((pStr == NULL) || (nLengthDir == 0)) + return 0; + + // Figure out the required length. + int nLengthTotal = nLengthDir + lstrlen(pStr); + + int nRet = 0; + if(pBuffer == NULL) // If the buffer is NULL, return the required length + { + nRet = nLengthTotal + 1; + } + else if (nBufLen > nLengthTotal) // If the buffer is big enough, go ahead and construct the path + { + GetDirectory(pBuffer, nBufLen); + SecureHelper::strcat_x(pBuffer, nBufLen, _T("\\")); + SecureHelper::strcat_x(pBuffer, nBufLen, pStr); + nRet = nLengthTotal; + } + + return nRet; + } + +#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) + bool GetFirstPathName(_CSTRING_NS::CString& strPath) const + { + bool bRet = false; + + int nLength = GetFirstPathName(NULL, 0); + if (nLength > 0) + { + bRet = (GetFirstPathName(strPath.GetBuffer(nLength), nLength) > 0); + strPath.ReleaseBuffer(nLength - 1); + } + + return bRet; + } +#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) + + // Get the next filename as a full path. + // The function returns the number of characters copied, not including the terminating zero. + // If the buffer is NULL, the function returns the required size, in characters, including the terminating zero. + // If the function fails, the return value is zero. + // The internal position marker is moved forward only if the function succeeds and the buffer was large enough. + int GetNextPathName(LPTSTR pBuffer, int nBufLen) const + { + if (m_pNextFile == NULL) + return 0; + + int nRet = 0; + LPCTSTR pStr = m_pNextFile; + // Does the filename contain a backslash? + if (_strrchr(pStr, _T('\\')) != NULL) + { + // Yes, so we'll assume it's a full path. + int nLength = lstrlen(pStr); + + if (pBuffer == NULL) // If the buffer is NULL, return the required length + { + nRet = nLength + 1; + } + else if (nBufLen > nLength) // The buffer is big enough, so go ahead and copy the filename + { + SecureHelper::strcpy_x(pBuffer, nBufLen, GetNextFileName()); + nRet = nBufLen; + } + } + else + { + // The filename is relative, so construct the full path. + int nLengthDir = GetDirectory(NULL, 0); + if (nLengthDir > 0) + { + // Calculate the required space. + int nLengthTotal = nLengthDir + lstrlen(pStr); + + if(pBuffer == NULL) // If the buffer is NULL, return the required length + { + nRet = nLengthTotal + 1; + } + else if (nBufLen > nLengthTotal) // If the buffer is big enough, go ahead and construct the path + { + GetDirectory(pBuffer, nBufLen); + SecureHelper::strcat_x(pBuffer, nBufLen, _T("\\")); + SecureHelper::strcat_x(pBuffer, nBufLen, GetNextFileName()); + nRet = nLengthTotal; + } + } + } + + return nRet; + } + +#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) + bool GetNextPathName(_CSTRING_NS::CString& strPath) const + { + bool bRet = false; + + int nLength = GetNextPathName(NULL, 0); + if (nLength > 0) + { + bRet = (GetNextPathName(strPath.GetBuffer(nLength), nLength) > 0); + strPath.ReleaseBuffer(nLength - 1); + } + + return bRet; + } +#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) + +// Implementation + bool ResizeFilenameBuffer(DWORD dwLength) + { + if (dwLength > m_ofn.nMaxFile) + { + // Free the old buffer. + if (m_ofn.lpstrFile != m_szFileName) + { + delete[] m_ofn.lpstrFile; + m_ofn.lpstrFile = NULL; + m_ofn.nMaxFile = 0; + } + + // Allocate the new buffer. + LPTSTR lpstrBuff = NULL; + ATLTRY(lpstrBuff = new TCHAR[dwLength]); + if (lpstrBuff != NULL) + { + m_ofn.lpstrFile = lpstrBuff; + m_ofn.lpstrFile[0] = 0; + m_ofn.nMaxFile = dwLength; + } + } + + return (m_ofn.lpstrFile != NULL); + } + + void OnSelChange(LPOFNOTIFY /*lpon*/) + { +#ifndef _UNICODE + // There is no point resizing the buffer in ANSI builds running on NT. + if (m_bIsNT) + return; +#endif + + // Get the buffer length required to hold the spec. + int nLength = GetSpec(NULL, 0); + if (nLength <= 1) + return; // no files are selected, presumably + + // Add room for the directory, and an extra terminating zero. + nLength += GetFolderPath(NULL, 0) + 1; + + if (!ResizeFilenameBuffer(nLength)) + { + ATLASSERT(FALSE); + return; + } + + // If we are not following links then our work is done. + if ((m_ofn.Flags & OFN_NODEREFERENCELINKS) != 0) + return; + + // Get the file spec, which is the text in the edit control. + if (GetSpec(m_ofn.lpstrFile, m_ofn.nMaxFile) <= 0) + return; + + // Get the ID-list of the current folder. + int nBytes = GetFolderIDList(NULL, 0); + CTempBuffer idlist; + idlist.AllocateBytes(nBytes); + if ((nBytes <= 0) || (GetFolderIDList(idlist, nBytes) <= 0)) + return; + + // First bind to the desktop folder, then to the current folder. + ATL::CComPtr pDesktop, pFolder; + if (FAILED(::SHGetDesktopFolder(&pDesktop))) + return; + if (FAILED(pDesktop->BindToObject(idlist, NULL, IID_IShellFolder, (void**)&pFolder))) + return; + + // Work through the file spec, looking for quoted filenames. If we find a shortcut file, then + // we need to add enough extra buffer space to hold its target path. + DWORD nExtraChars = 0; + bool bInsideQuotes = false; + LPCTSTR pAnchor = m_ofn.lpstrFile; + LPCTSTR pChar = m_ofn.lpstrFile; + for ( ; *pChar; ++pChar) + { + // Look for quotation marks. + if (*pChar == _T('\"')) + { + // We are either entering or leaving a passage of quoted text. + bInsideQuotes = !bInsideQuotes; + + // Is it an opening or closing quote? + if (bInsideQuotes) + { + // We found an opening quote, so set "pAnchor" to the following character. + pAnchor = pChar + 1; + } + else // closing quote + { + // Each quoted entity should be shorter than MAX_PATH. + if (pChar - pAnchor >= MAX_PATH) + return; + + // Get the ID-list and attributes of the file. + USES_CONVERSION; + int nFileNameLength = (int)(DWORD_PTR)(pChar - pAnchor); + TCHAR szFileName[MAX_PATH]; + SecureHelper::strncpy_x(szFileName, MAX_PATH, pAnchor, nFileNameLength); + LPITEMIDLIST pidl = NULL; + DWORD dwAttrib = SFGAO_LINK; + if (SUCCEEDED(pFolder->ParseDisplayName(NULL, NULL, T2W(szFileName), NULL, &pidl, &dwAttrib))) + { + // Is it a shortcut file? + if (dwAttrib & SFGAO_LINK) + { + // Bind to its IShellLink interface. + ATL::CComPtr pLink; + if (SUCCEEDED(pFolder->BindToObject(pidl, NULL, IID_IShellLink, (void**)&pLink))) + { + // Get the shortcut's target path. + TCHAR szPath[MAX_PATH]; + if (SUCCEEDED(pLink->GetPath(szPath, MAX_PATH, NULL, 0))) + { + // If the target path is longer than the shortcut name, then add on the number + // of extra characters that are required. + int nNewLength = lstrlen(szPath); + if (nNewLength > nFileNameLength) + nExtraChars += nNewLength - nFileNameLength; + } + } + } + + // Free the ID-list returned by ParseDisplayName. + ::CoTaskMemFree(pidl); + } + } + } + } + + // If we need more space for shortcut targets, then reallocate. + if (nExtraChars > 0) + ATLVERIFY(ResizeFilenameBuffer(m_ofn.nMaxFile + nExtraChars)); + } + + // Helper for _ATM_MIN_CRT + static const TCHAR* _strrchr(const TCHAR* p, TCHAR ch) + { +#ifndef _ATL_MIN_CRT + return _tcsrchr(p, ch); +#else // _ATL_MIN_CRT + const TCHAR* lpsz = NULL; + while (*p != 0) + { + if (*p == ch) + lpsz = p; + p = ::CharNext(p); + } + return lpsz; +#endif // _ATL_MIN_CRT + } +}; + +class CMultiFileDialog : public CMultiFileDialogImpl +{ +public: + CMultiFileDialog( + LPCTSTR lpszDefExt = NULL, + LPCTSTR lpszFileName = NULL, + DWORD dwFlags = OFN_HIDEREADONLY, + LPCTSTR lpszFilter = NULL, + HWND hWndParent = NULL) + : CMultiFileDialogImpl(lpszDefExt, lpszFileName, dwFlags, lpszFilter, hWndParent) + { } + + BEGIN_MSG_MAP(CMultiFileDialog) + CHAIN_MSG_MAP(CMultiFileDialogImpl) + END_MSG_MAP() +}; + +#endif // !_WIN32_WCE + + +/////////////////////////////////////////////////////////////////////////////// +// Shell File Dialog - new Shell File Open and Save dialogs in Vista + +// Note: Use GetPtr() to access dialog interface methods. +// Example: +// CShellFileOpenDialog dlg; +// dlg.GetPtr()->SetTitle(L"MyFileOpenDialog"); + +#if (_WIN32_WINNT >= 0x0600) && !defined(_WIN32_WCE) + +/////////////////////////////////////////////////////////////////////////////// +// CShellFileDialogImpl - base class for CShellFileOpenDialogImpl and CShellFileSaveDialogImpl + +template +class ATL_NO_VTABLE CShellFileDialogImpl : public IFileDialogEvents +{ +public: +// Operations + INT_PTR DoModal(HWND hWndParent = ::GetActiveWindow()) + { + INT_PTR nRet = -1; + + T* pT = static_cast(this); + if(pT->m_spFileDlg == NULL) + { + ATLASSERT(FALSE); + return nRet; + } + + DWORD dwCookie = 0; + pT->_Advise(dwCookie); + + HRESULT hRet = pT->m_spFileDlg->Show(hWndParent); + if(SUCCEEDED(hRet)) + nRet = IDOK; + else if(hRet == HRESULT_FROM_WIN32(ERROR_CANCELLED)) + nRet = IDCANCEL; + else + ATLASSERT(FALSE); // error + + pT->_Unadvise(dwCookie); + + return nRet; + } + + bool IsNull() const + { + const T* pT = static_cast(this); + return (pT->m_spFileDlg == NULL); + } + +// Operations - get file path after dialog returns + HRESULT GetFilePath(LPWSTR lpstrFilePath, int cchLength) + { + T* pT = static_cast(this); + ATLASSERT(pT->m_spFileDlg != NULL); + + ATL::CComPtr spItem; + HRESULT hRet = pT->m_spFileDlg->GetResult(&spItem); + + if(SUCCEEDED(hRet)) + hRet = GetFileNameFromShellItem(spItem, SIGDN_FILESYSPATH, lpstrFilePath, cchLength); + + return hRet; + } + + HRESULT GetFileTitle(LPWSTR lpstrFileTitle, int cchLength) + { + T* pT = static_cast(this); + ATLASSERT(pT->m_spFileDlg != NULL); + + ATL::CComPtr spItem; + HRESULT hRet = pT->m_spFileDlg->GetResult(&spItem); + + if(SUCCEEDED(hRet)) + hRet = GetFileNameFromShellItem(spItem, SIGDN_NORMALDISPLAY, lpstrFileTitle, cchLength); + + return hRet; + } + +#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) + HRESULT GetFilePath(_CSTRING_NS::CString& strFilePath) + { + T* pT = static_cast(this); + ATLASSERT(pT->m_spFileDlg != NULL); + + ATL::CComPtr spItem; + HRESULT hRet = pT->m_spFileDlg->GetResult(&spItem); + + if(SUCCEEDED(hRet)) + hRet = GetFileNameFromShellItem(spItem, SIGDN_FILESYSPATH, strFilePath); + + return hRet; + } + + HRESULT GetFileTitle(_CSTRING_NS::CString& strFileTitle) + { + T* pT = static_cast(this); + ATLASSERT(pT->m_spFileDlg != NULL); + + ATL::CComPtr spItem; + HRESULT hRet = pT->m_spFileDlg->GetResult(&spItem); + + if(SUCCEEDED(hRet)) + hRet = GetFileNameFromShellItem(spItem, SIGDN_NORMALDISPLAY, strFileTitle); + + return hRet; + } +#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) + +// Helpers for IShellItem + static HRESULT GetFileNameFromShellItem(IShellItem* pShellItem, SIGDN type, LPWSTR lpstr, int cchLength) + { + ATLASSERT(pShellItem != NULL); + + LPWSTR lpstrName = NULL; + HRESULT hRet = pShellItem->GetDisplayName(type, &lpstrName); + + if(SUCCEEDED(hRet)) + { + if(lstrlenW(lpstrName) < cchLength) + { + SecureHelper::strcpyW_x(lpstr, cchLength, lpstrName); + } + else + { + ATLASSERT(FALSE); + hRet = DISP_E_BUFFERTOOSMALL; + } + + ::CoTaskMemFree(lpstrName); + } + + return hRet; + } + +#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) + static HRESULT GetFileNameFromShellItem(IShellItem* pShellItem, SIGDN type, _CSTRING_NS::CString& str) + { + ATLASSERT(pShellItem != NULL); + + LPWSTR lpstrName = NULL; + HRESULT hRet = pShellItem->GetDisplayName(type, &lpstrName); + + if(SUCCEEDED(hRet)) + { + str = lpstrName; + ::CoTaskMemFree(lpstrName); + } + + return hRet; + } +#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) + +// Implementation + void _Advise(DWORD& dwCookie) + { + T* pT = static_cast(this); + ATLASSERT(pT->m_spFileDlg != NULL); + HRESULT hRet = pT->m_spFileDlg->Advise((IFileDialogEvents*)this, &dwCookie); + ATLVERIFY(SUCCEEDED(hRet)); + } + + void _Unadvise(DWORD dwCookie) + { + T* pT = static_cast(this); + ATLASSERT(pT->m_spFileDlg != NULL); + HRESULT hRet = pT->m_spFileDlg->Unadvise(dwCookie); + ATLVERIFY(SUCCEEDED(hRet)); + } + + void _Init(LPCWSTR lpszFileName, DWORD dwOptions, LPCWSTR lpszDefExt, const COMDLG_FILTERSPEC* arrFilterSpec, UINT uFilterSpecCount) + { + T* pT = static_cast(this); + ATLASSERT(pT->m_spFileDlg != NULL); + + HRESULT hRet = E_FAIL; + + if(lpszFileName != NULL) + { + hRet = pT->m_spFileDlg->SetFileName(lpszFileName); + ATLASSERT(SUCCEEDED(hRet)); + } + + hRet = pT->m_spFileDlg->SetOptions(dwOptions); + ATLASSERT(SUCCEEDED(hRet)); + + if(lpszDefExt != NULL) + { + hRet = pT->m_spFileDlg->SetDefaultExtension(lpszDefExt); + ATLASSERT(SUCCEEDED(hRet)); + } + + if(arrFilterSpec != NULL && uFilterSpecCount != 0U) + { + hRet = pT->m_spFileDlg->SetFileTypes(uFilterSpecCount, arrFilterSpec); + ATLASSERT(SUCCEEDED(hRet)); + } + } + +// Implementation - IUnknown interface + STDMETHOD(QueryInterface)(REFIID riid, void** ppvObject) + { + if(ppvObject == NULL) + return E_POINTER; + + T* pT = static_cast(this); + if(IsEqualGUID(riid, IID_IUnknown) || IsEqualGUID(riid, IID_IFileDialogEvents)) + { + *ppvObject = (IFileDialogEvents*)pT; + // AddRef() not needed + return S_OK; + } + + return E_NOINTERFACE; + } + + virtual ULONG STDMETHODCALLTYPE AddRef() + { + return 1; + } + + virtual ULONG STDMETHODCALLTYPE Release() + { + return 1; + } + +// Implementation - IFileDialogEvents interface + virtual HRESULT STDMETHODCALLTYPE IFileDialogEvents::OnFileOk(IFileDialog* pfd) + { + T* pT = static_cast(this); + ATLASSERT(pT->m_spFileDlg.IsEqualObject(pfd)); + pfd; // avoid level 4 warning + return pT->OnFileOk(); + } + + virtual HRESULT STDMETHODCALLTYPE IFileDialogEvents::OnFolderChanging(IFileDialog* pfd, IShellItem* psiFolder) + { + T* pT = static_cast(this); + ATLASSERT(pT->m_spFileDlg.IsEqualObject(pfd)); + pfd; // avoid level 4 warning + return pT->OnFolderChanging(psiFolder); + } + + virtual HRESULT STDMETHODCALLTYPE IFileDialogEvents::OnFolderChange(IFileDialog* pfd) + { + T* pT = static_cast(this); + ATLASSERT(pT->m_spFileDlg.IsEqualObject(pfd)); + pfd; // avoid level 4 warning + return pT->OnFolderChange(); + } + + virtual HRESULT STDMETHODCALLTYPE IFileDialogEvents::OnSelectionChange(IFileDialog* pfd) + { + T* pT = static_cast(this); + ATLASSERT(pT->m_spFileDlg.IsEqualObject(pfd)); + pfd; // avoid level 4 warning + return pT->OnSelectionChange(); + } + + virtual HRESULT STDMETHODCALLTYPE IFileDialogEvents::OnShareViolation(IFileDialog* pfd, IShellItem* psi, FDE_SHAREVIOLATION_RESPONSE* pResponse) + { + T* pT = static_cast(this); + ATLASSERT(pT->m_spFileDlg.IsEqualObject(pfd)); + pfd; // avoid level 4 warning + return pT->OnShareViolation(psi, pResponse); + } + + virtual HRESULT STDMETHODCALLTYPE IFileDialogEvents::OnTypeChange(IFileDialog* pfd) + { + T* pT = static_cast(this); + ATLASSERT(pT->m_spFileDlg.IsEqualObject(pfd)); + pfd; // avoid level 4 warning + return pT->OnTypeChange(); + } + + virtual HRESULT STDMETHODCALLTYPE IFileDialogEvents::OnOverwrite(IFileDialog* pfd, IShellItem* psi, FDE_OVERWRITE_RESPONSE* pResponse) + { + T* pT = static_cast(this); + ATLASSERT(pT->m_spFileDlg.IsEqualObject(pfd)); + pfd; // avoid level 4 warning + return pT->OnOverwrite(psi, pResponse); + } + +// Overrideables - Event handlers + HRESULT OnFileOk() + { + return E_NOTIMPL; + } + + HRESULT OnFolderChanging(IShellItem* /*psiFolder*/) + { + return E_NOTIMPL; + } + + HRESULT OnFolderChange() + { + return E_NOTIMPL; + } + + HRESULT OnSelectionChange() + { + return E_NOTIMPL; + } + + HRESULT OnShareViolation(IShellItem* /*psi*/, FDE_SHAREVIOLATION_RESPONSE* /*pResponse*/) + { + return E_NOTIMPL; + } + + HRESULT OnTypeChange() + { + return E_NOTIMPL; + } + + HRESULT OnOverwrite(IShellItem* /*psi*/, FDE_OVERWRITE_RESPONSE* /*pResponse*/) + { + return E_NOTIMPL; + } +}; + + +/////////////////////////////////////////////////////////////////////////////// +// CShellFileOpenDialogImpl - implements new Shell File Open dialog + +template +class ATL_NO_VTABLE CShellFileOpenDialogImpl : public CShellFileDialogImpl< T > +{ +public: + ATL::CComPtr m_spFileDlg; + + CShellFileOpenDialogImpl(LPCWSTR lpszFileName = NULL, + DWORD dwOptions = FOS_FORCEFILESYSTEM | FOS_PATHMUSTEXIST | FOS_FILEMUSTEXIST, + LPCWSTR lpszDefExt = NULL, + const COMDLG_FILTERSPEC* arrFilterSpec = NULL, + UINT uFilterSpecCount = 0U) + { + HRESULT hRet = m_spFileDlg.CoCreateInstance(CLSID_FileOpenDialog); + + if(SUCCEEDED(hRet)) + _Init(lpszFileName, dwOptions, lpszDefExt, arrFilterSpec, uFilterSpecCount); + } + + IFileOpenDialog* GetPtr() + { + return m_spFileDlg; + } +}; + + +/////////////////////////////////////////////////////////////////////////////// +// CShellFileOpenDialog - new Shell File Open dialog without events + +class CShellFileOpenDialog : public CShellFileOpenDialogImpl +{ +public: + CShellFileOpenDialog(LPCWSTR lpszFileName = NULL, + DWORD dwOptions = FOS_FORCEFILESYSTEM | FOS_PATHMUSTEXIST | FOS_FILEMUSTEXIST, + LPCWSTR lpszDefExt = NULL, + const COMDLG_FILTERSPEC* arrFilterSpec = NULL, + UINT uFilterSpecCount = 0U) : CShellFileOpenDialogImpl(lpszFileName, dwOptions, lpszDefExt, arrFilterSpec, uFilterSpecCount) + { } + +// Implementation (remove _Advise/_Unadvise code using template magic) + void _Advise(DWORD& /*dwCookie*/) + { } + + void _Unadvise(DWORD /*dwCookie*/) + { } +}; + + +/////////////////////////////////////////////////////////////////////////////// +// CShellFileSaveDialogImpl - implements new Shell File Save dialog + +template +class ATL_NO_VTABLE CShellFileSaveDialogImpl : public CShellFileDialogImpl< T > +{ +public: + ATL::CComPtr m_spFileDlg; + + CShellFileSaveDialogImpl(LPCWSTR lpszFileName = NULL, + DWORD dwOptions = FOS_FORCEFILESYSTEM | FOS_PATHMUSTEXIST | FOS_OVERWRITEPROMPT, + LPCWSTR lpszDefExt = NULL, + const COMDLG_FILTERSPEC* arrFilterSpec = NULL, + UINT uFilterSpecCount = 0U) + { + HRESULT hRet = m_spFileDlg.CoCreateInstance(CLSID_FileSaveDialog); + + if(SUCCEEDED(hRet)) + _Init(lpszFileName, dwOptions, lpszDefExt, arrFilterSpec, uFilterSpecCount); + } + + IFileSaveDialog* GetPtr() + { + return m_spFileDlg; + } +}; + + +/////////////////////////////////////////////////////////////////////////////// +// CShellFileSaveDialog - new Shell File Save dialog without events + +class CShellFileSaveDialog : public CShellFileSaveDialogImpl +{ +public: + CShellFileSaveDialog(LPCWSTR lpszFileName = NULL, + DWORD dwOptions = FOS_FORCEFILESYSTEM | FOS_PATHMUSTEXIST | FOS_OVERWRITEPROMPT, + LPCWSTR lpszDefExt = NULL, + const COMDLG_FILTERSPEC* arrFilterSpec = NULL, + UINT uFilterSpecCount = 0U) : CShellFileSaveDialogImpl(lpszFileName, dwOptions, lpszDefExt, arrFilterSpec, uFilterSpecCount) + { } + +// Implementation (remove _Advise/_Unadvise code using template magic) + void _Advise(DWORD& /*dwCookie*/) + { } + + void _Unadvise(DWORD /*dwCookie*/) + { } +}; + +#endif // (_WIN32_WINNT >= 0x0600) && !defined(_WIN32_WCE) + + +/////////////////////////////////////////////////////////////////////////////// +// CFolderDialogImpl - used for browsing for a folder + +#ifndef _WIN32_WCE + +template +class ATL_NO_VTABLE CFolderDialogImpl +{ +public: + BROWSEINFO m_bi; + LPCTSTR m_lpstrInitialFolder; + LPCITEMIDLIST m_pidlInitialSelection; + bool m_bExpandInitialSelection; + TCHAR m_szFolderDisplayName[MAX_PATH]; + TCHAR m_szFolderPath[MAX_PATH]; + LPITEMIDLIST m_pidlSelected; + HWND m_hWnd; // used only in the callback function + +// Constructor + CFolderDialogImpl(HWND hWndParent = NULL, LPCTSTR lpstrTitle = NULL, UINT uFlags = BIF_RETURNONLYFSDIRS) : + m_lpstrInitialFolder(NULL), m_pidlInitialSelection(NULL), m_bExpandInitialSelection(false), m_pidlSelected(NULL), m_hWnd(NULL) + { + memset(&m_bi, 0, sizeof(m_bi)); // initialize structure to 0/NULL + + m_bi.hwndOwner = hWndParent; + m_bi.pidlRoot = NULL; + m_bi.pszDisplayName = m_szFolderDisplayName; + m_bi.lpszTitle = lpstrTitle; + m_bi.ulFlags = uFlags; + m_bi.lpfn = BrowseCallbackProc; + m_bi.lParam = (LPARAM)static_cast(this); + + m_szFolderPath[0] = 0; + m_szFolderDisplayName[0] = 0; + } + + ~CFolderDialogImpl() + { + ::CoTaskMemFree(m_pidlSelected); + } + +// Operations + INT_PTR DoModal(HWND hWndParent = ::GetActiveWindow()) + { + if(m_bi.hwndOwner == NULL) // set only if not specified before + m_bi.hwndOwner = hWndParent; + + // Clear out any previous results + m_szFolderPath[0] = 0; + m_szFolderDisplayName[0] = 0; + ::CoTaskMemFree(m_pidlSelected); + + INT_PTR nRet = IDCANCEL; + m_pidlSelected = ::SHBrowseForFolder(&m_bi); + + if(m_pidlSelected != NULL) + { + nRet = IDOK; + + // If BIF_RETURNONLYFSDIRS is set, we try to get the filesystem path. + // Otherwise, the caller must handle the ID-list directly. + if((m_bi.ulFlags & BIF_RETURNONLYFSDIRS) != 0) + { + if(::SHGetPathFromIDList(m_pidlSelected, m_szFolderPath) == FALSE) + nRet = IDCANCEL; + } + } + + return nRet; + } + + // Methods to call before DoModal + void SetInitialFolder(LPCTSTR lpstrInitialFolder, bool bExpand = true) + { + // lpstrInitialFolder may be a file if BIF_BROWSEINCLUDEFILES is specified + m_lpstrInitialFolder = lpstrInitialFolder; + m_bExpandInitialSelection = bExpand; + } + + void SetInitialSelection(LPCITEMIDLIST pidl, bool bExpand = true) + { + m_pidlInitialSelection = pidl; + m_bExpandInitialSelection = bExpand; + } + + // Methods to call after DoModal + LPITEMIDLIST GetSelectedItem(bool bDetach = false) + { + LPITEMIDLIST pidl = m_pidlSelected; + if(bDetach) + m_pidlSelected = NULL; + + return pidl; + } + + LPCTSTR GetFolderPath() const + { + return m_szFolderPath; + } + + LPCTSTR GetFolderDisplayName() const + { + return m_szFolderDisplayName; + } + + int GetFolderImageIndex() const + { + return m_bi.iImage; + } + +// Callback function and overrideables + static int CALLBACK BrowseCallbackProc(HWND hWnd, UINT uMsg, LPARAM lParam, LPARAM lpData) + { +#ifndef BFFM_VALIDATEFAILED + #ifdef UNICODE + const int BFFM_VALIDATEFAILED = 4; + #else + const int BFFM_VALIDATEFAILED = 3; + #endif +#endif // !BFFM_VALIDATEFAILED +#ifndef BFFM_IUNKNOWN + const int BFFM_IUNKNOWN = 5; +#endif // !BFFM_IUNKNOWN +#ifndef BIF_NEWDIALOGSTYLE + const UINT BIF_NEWDIALOGSTYLE = 0x0040; +#endif // !BIF_NEWDIALOGSTYLE + + int nRet = 0; + T* pT = (T*)lpData; + bool bClear = false; + if(pT->m_hWnd == NULL) + { + pT->m_hWnd = hWnd; + bClear = true; + } + else + { + ATLASSERT(pT->m_hWnd == hWnd); + } + + switch(uMsg) + { + case BFFM_INITIALIZED: + // Set initial selection + // Note that m_pidlInitialSelection, if set, takes precedence over m_lpstrInitialFolder + if(pT->m_pidlInitialSelection != NULL) + pT->SetSelection(pT->m_pidlInitialSelection); + else if(pT->m_lpstrInitialFolder != NULL) + pT->SetSelection(pT->m_lpstrInitialFolder); + + // Expand initial selection if appropriate + if(pT->m_bExpandInitialSelection && ((pT->m_bi.ulFlags & BIF_NEWDIALOGSTYLE) != 0)) + { + if(pT->m_pidlInitialSelection != NULL) + pT->SetExpanded(pT->m_pidlInitialSelection); + else if(pT->m_lpstrInitialFolder != NULL) + pT->SetExpanded(pT->m_lpstrInitialFolder); + } + pT->OnInitialized(); + break; + case BFFM_SELCHANGED: + pT->OnSelChanged((LPITEMIDLIST)lParam); + break; + case BFFM_VALIDATEFAILED: + nRet = pT->OnValidateFailed((LPCTSTR)lParam); + break; + case BFFM_IUNKNOWN: + pT->OnIUnknown((IUnknown*)lParam); + break; + default: + ATLTRACE2(atlTraceUI, 0, _T("Unknown message received in CFolderDialogImpl::BrowseCallbackProc\n")); + break; + } + + if(bClear) + pT->m_hWnd = NULL; + return nRet; + } + + void OnInitialized() + { + } + + void OnSelChanged(LPITEMIDLIST /*pItemIDList*/) + { + } + + int OnValidateFailed(LPCTSTR /*lpstrFolderPath*/) + { + return 1; // 1=continue, 0=EndDialog + } + + void OnIUnknown(IUnknown* /*pUnknown*/) + { + } + + // Commands - valid to call only from handlers + void EnableOK(BOOL bEnable) + { + ATLASSERT(m_hWnd != NULL); + ::SendMessage(m_hWnd, BFFM_ENABLEOK, 0, bEnable); + } + + void SetSelection(LPCITEMIDLIST pItemIDList) + { + ATLASSERT(m_hWnd != NULL); + ::SendMessage(m_hWnd, BFFM_SETSELECTION, FALSE, (LPARAM)pItemIDList); + } + + void SetSelection(LPCTSTR lpstrFolderPath) + { + ATLASSERT(m_hWnd != NULL); + ::SendMessage(m_hWnd, BFFM_SETSELECTION, TRUE, (LPARAM)lpstrFolderPath); + } + + void SetStatusText(LPCTSTR lpstrText) + { + ATLASSERT(m_hWnd != NULL); + ::SendMessage(m_hWnd, BFFM_SETSTATUSTEXT, 0, (LPARAM)lpstrText); + } + + void SetOKText(LPCTSTR lpstrOKText) + { +#ifndef BFFM_SETOKTEXT + const UINT BFFM_SETOKTEXT = WM_USER + 105; +#endif + ATLASSERT(m_hWnd != NULL); + USES_CONVERSION; + LPCWSTR lpstr = T2CW(lpstrOKText); + ::SendMessage(m_hWnd, BFFM_SETOKTEXT, (WPARAM)lpstr, 0L); + } + + void SetExpanded(LPCITEMIDLIST pItemIDList) + { +#ifndef BFFM_SETEXPANDED + const UINT BFFM_SETEXPANDED = WM_USER + 106; +#endif + ATLASSERT(m_hWnd != NULL); + ::SendMessage(m_hWnd, BFFM_SETEXPANDED, FALSE, (LPARAM)pItemIDList); + } + + void SetExpanded(LPCTSTR lpstrFolderPath) + { +#ifndef BFFM_SETEXPANDED + const UINT BFFM_SETEXPANDED = WM_USER + 106; +#endif + ATLASSERT(m_hWnd != NULL); + USES_CONVERSION; + LPCWSTR lpstr = T2CW(lpstrFolderPath); + ::SendMessage(m_hWnd, BFFM_SETEXPANDED, TRUE, (LPARAM)lpstr); + } +}; + +class CFolderDialog : public CFolderDialogImpl +{ +public: + CFolderDialog(HWND hWndParent = NULL, LPCTSTR lpstrTitle = NULL, UINT uFlags = BIF_RETURNONLYFSDIRS) + : CFolderDialogImpl(hWndParent, lpstrTitle, uFlags) + { } +}; + +#endif // !_WIN32_WCE + + +/////////////////////////////////////////////////////////////////////////////// +// CCommonDialogImplBase - base class for common dialog classes + +class ATL_NO_VTABLE CCommonDialogImplBase : public ATL::CWindowImplBase +{ +public: + static UINT_PTR APIENTRY HookProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) + { + if(uMsg != WM_INITDIALOG) + return 0; + CCommonDialogImplBase* pT = (CCommonDialogImplBase*)ModuleHelper::ExtractCreateWndData(); + ATLASSERT(pT != NULL); + ATLASSERT(pT->m_hWnd == NULL); + ATLASSERT(::IsWindow(hWnd)); + // subclass dialog's window + if(!pT->SubclassWindow(hWnd)) + { + ATLTRACE2(atlTraceUI, 0, _T("Subclassing a common dialog failed\n")); + return 0; + } + // check message map for WM_INITDIALOG handler + LRESULT lRes = 0; + if(pT->ProcessWindowMessage(pT->m_hWnd, uMsg, wParam, lParam, lRes, 0) == FALSE) + return 0; + return lRes; + } + +// Special override for common dialogs + BOOL EndDialog(INT_PTR /*nRetCode*/ = 0) + { + ATLASSERT(::IsWindow(m_hWnd)); + SendMessage(WM_COMMAND, MAKEWPARAM(IDABORT, 0)); + return TRUE; + } + +// Implementation - try to override these, to prevent errors + HWND Create(HWND, ATL::_U_RECT, LPCTSTR, DWORD, DWORD, ATL::_U_MENUorID, ATOM, LPVOID) + { + ATLASSERT(FALSE); // should not be called + return NULL; + } + + static LRESULT CALLBACK StartWindowProc(HWND /*hWnd*/, UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/) + { + ATLASSERT(FALSE); // should not be called + return 0; + } +}; + + +/////////////////////////////////////////////////////////////////////////////// +// CFontDialogImpl - font selection dialog + +#ifndef _WIN32_WCE + +template +class ATL_NO_VTABLE CFontDialogImpl : public CCommonDialogImplBase +{ +public: + enum { _cchStyleName = 64 }; + + CHOOSEFONT m_cf; + TCHAR m_szStyleName[_cchStyleName]; // contains style name after return + LOGFONT m_lf; // default LOGFONT to store the info + +// Constructors + CFontDialogImpl(LPLOGFONT lplfInitial = NULL, + DWORD dwFlags = CF_EFFECTS | CF_SCREENFONTS, + HDC hDCPrinter = NULL, + HWND hWndParent = NULL) + { + memset(&m_cf, 0, sizeof(m_cf)); + memset(&m_lf, 0, sizeof(m_lf)); + memset(&m_szStyleName, 0, sizeof(m_szStyleName)); + + m_cf.lStructSize = sizeof(m_cf); + m_cf.hwndOwner = hWndParent; + m_cf.rgbColors = RGB(0, 0, 0); + m_cf.lpszStyle = (LPTSTR)&m_szStyleName; + m_cf.Flags = dwFlags | CF_ENABLEHOOK; + m_cf.lpfnHook = (LPCFHOOKPROC)T::HookProc; + + if(lplfInitial != NULL) + { + m_cf.lpLogFont = lplfInitial; + m_cf.Flags |= CF_INITTOLOGFONTSTRUCT; + m_lf = *lplfInitial; + } + else + { + m_cf.lpLogFont = &m_lf; + } + + if(hDCPrinter != NULL) + { + m_cf.hDC = hDCPrinter; + m_cf.Flags |= CF_PRINTERFONTS; + } + } + +// Operations + INT_PTR DoModal(HWND hWndParent = ::GetActiveWindow()) + { + ATLASSERT((m_cf.Flags & CF_ENABLEHOOK) != 0); + ATLASSERT(m_cf.lpfnHook != NULL); // can still be a user hook + + if(m_cf.hwndOwner == NULL) // set only if not specified before + m_cf.hwndOwner = hWndParent; + + ATLASSERT(m_hWnd == NULL); + ModuleHelper::AddCreateWndData(&m_thunk.cd, (CCommonDialogImplBase*)this); + + BOOL bRet = ::ChooseFont(&m_cf); + + m_hWnd = NULL; + + if(bRet) // copy logical font from user's initialization buffer (if needed) + SecureHelper::memcpy_x(&m_lf, sizeof(m_lf), m_cf.lpLogFont, sizeof(m_lf)); + + return bRet ? IDOK : IDCANCEL; + } + + // works only when the dialog is dislayed or after + void GetCurrentFont(LPLOGFONT lplf) const + { + ATLASSERT(lplf != NULL); + + if(m_hWnd != NULL) + ::SendMessage(m_hWnd, WM_CHOOSEFONT_GETLOGFONT, 0, (LPARAM)lplf); + else + *lplf = m_lf; + } + + // works only when the dialog is dislayed or before +#ifndef _WIN32_WCE + void SetLogFont(LPLOGFONT lplf) + { + ATLASSERT(lplf != NULL); +#ifndef WM_CHOOSEFONT_SETLOGFONT + const UINT WM_CHOOSEFONT_SETLOGFONT = (WM_USER + 101); +#endif + if(m_hWnd != NULL) + { + ::SendMessage(m_hWnd, WM_CHOOSEFONT_SETLOGFONT, 0, (LPARAM)lplf); + } + else + { + m_lf = *lplf; + m_cf.Flags |= CF_INITTOLOGFONTSTRUCT; + } + } + + void SetFlags(DWORD dwFlags) + { +#ifndef WM_CHOOSEFONT_SETFLAGS + const UINT WM_CHOOSEFONT_SETFLAGS = (WM_USER + 102); +#endif + if(m_hWnd != NULL) + { + CHOOSEFONT cf = { sizeof(CHOOSEFONT) }; + cf.Flags = dwFlags; + ::SendMessage(m_hWnd, WM_CHOOSEFONT_SETFLAGS, 0, (LPARAM)&cf); + } + else + { + m_cf.Flags = dwFlags; + } + } +#endif // !_WIN32_WCE + + // Helpers for parsing information after successful return + LPCTSTR GetFaceName() const // return the face name of the font + { + return (LPCTSTR)m_cf.lpLogFont->lfFaceName; + } + + LPCTSTR GetStyleName() const // return the style name of the font + { + return m_cf.lpszStyle; + } + + int GetSize() const // return the pt size of the font + { + return m_cf.iPointSize; + } + + COLORREF GetColor() const // return the color of the font + { + return m_cf.rgbColors; + } + + int GetWeight() const // return the chosen font weight + { + return (int)m_cf.lpLogFont->lfWeight; + } + + BOOL IsStrikeOut() const // return TRUE if strikeout + { + return (m_cf.lpLogFont->lfStrikeOut) ? TRUE : FALSE; + } + + BOOL IsUnderline() const // return TRUE if underline + { + return (m_cf.lpLogFont->lfUnderline) ? TRUE : FALSE; + } + + BOOL IsBold() const // return TRUE if bold font + { + return (m_cf.lpLogFont->lfWeight == FW_BOLD) ? TRUE : FALSE; + } + + BOOL IsItalic() const // return TRUE if italic font + { + return m_cf.lpLogFont->lfItalic ? TRUE : FALSE; + } +}; + +class CFontDialog : public CFontDialogImpl +{ +public: + CFontDialog(LPLOGFONT lplfInitial = NULL, + DWORD dwFlags = CF_EFFECTS | CF_SCREENFONTS, + HDC hDCPrinter = NULL, + HWND hWndParent = NULL) + : CFontDialogImpl(lplfInitial, dwFlags, hDCPrinter, hWndParent) + { } + + DECLARE_EMPTY_MSG_MAP() +}; + +#endif // _WIN32_WCE + + +/////////////////////////////////////////////////////////////////////////////// +// CRichEditFontDialogImpl - font selection for the Rich Edit ctrl + +#if defined(_RICHEDIT_) && !defined(_WIN32_WCE) + +template +class ATL_NO_VTABLE CRichEditFontDialogImpl : public CFontDialogImpl< T > +{ +public: + CRichEditFontDialogImpl(const CHARFORMAT& charformat, + DWORD dwFlags = CF_SCREENFONTS, + HDC hDCPrinter = NULL, + HWND hWndParent = NULL) + : CFontDialogImpl< T >(NULL, dwFlags, hDCPrinter, hWndParent) + { + m_cf.Flags |= CF_INITTOLOGFONTSTRUCT; + m_cf.Flags |= FillInLogFont(charformat); + m_cf.lpLogFont = &m_lf; + + if((charformat.dwMask & CFM_COLOR) != 0) + m_cf.rgbColors = charformat.crTextColor; + } + + void GetCharFormat(CHARFORMAT& cf) const + { + USES_CONVERSION; + cf.dwEffects = 0; + cf.dwMask = 0; + if((m_cf.Flags & CF_NOSTYLESEL) == 0) + { + cf.dwMask |= CFM_BOLD | CFM_ITALIC; + cf.dwEffects |= IsBold() ? CFE_BOLD : 0; + cf.dwEffects |= IsItalic() ? CFE_ITALIC : 0; + } + if((m_cf.Flags & CF_NOSIZESEL) == 0) + { + cf.dwMask |= CFM_SIZE; + // GetSize() returns in tenths of points so mulitply by 2 to get twips + cf.yHeight = GetSize() * 2; + } + + if((m_cf.Flags & CF_NOFACESEL) == 0) + { + cf.dwMask |= CFM_FACE; + cf.bPitchAndFamily = m_cf.lpLogFont->lfPitchAndFamily; +#if (_RICHEDIT_VER >= 0x0200) + SecureHelper::strcpy_x(cf.szFaceName, _countof(cf.szFaceName), GetFaceName()); +#else // !(_RICHEDIT_VER >= 0x0200) + SecureHelper::strcpyA_x(cf.szFaceName, _countof(cf.szFaceName), T2A((LPTSTR)(LPCTSTR)GetFaceName())); +#endif // !(_RICHEDIT_VER >= 0x0200) + } + + if((m_cf.Flags & CF_EFFECTS) != 0) + { + cf.dwMask |= CFM_UNDERLINE | CFM_STRIKEOUT | CFM_COLOR; + cf.dwEffects |= IsUnderline() ? CFE_UNDERLINE : 0; + cf.dwEffects |= IsStrikeOut() ? CFE_STRIKEOUT : 0; + cf.crTextColor = GetColor(); + } + if((m_cf.Flags & CF_NOSCRIPTSEL) == 0) + { + cf.bCharSet = m_cf.lpLogFont->lfCharSet; + cf.dwMask |= CFM_CHARSET; + } + cf.yOffset = 0; + } + + DWORD FillInLogFont(const CHARFORMAT& cf) + { + USES_CONVERSION; + DWORD dwFlags = 0; + if((cf.dwMask & CFM_SIZE) != 0) + { + HDC hDC = ::CreateDC(_T("DISPLAY"), NULL, NULL, NULL); + LONG yPerInch = ::GetDeviceCaps(hDC, LOGPIXELSY); + m_lf.lfHeight = -(int)((cf.yHeight * yPerInch) / 1440); + } + else + m_lf.lfHeight = 0; + + m_lf.lfWidth = 0; + m_lf.lfEscapement = 0; + m_lf.lfOrientation = 0; + + if((cf.dwMask & (CFM_ITALIC | CFM_BOLD)) == (CFM_ITALIC | CFM_BOLD)) + { + m_lf.lfWeight = ((cf.dwEffects & CFE_BOLD) != 0) ? FW_BOLD : FW_NORMAL; + m_lf.lfItalic = (BYTE)(((cf.dwEffects & CFE_ITALIC) != 0) ? TRUE : FALSE); + } + else + { + dwFlags |= CF_NOSTYLESEL; + m_lf.lfWeight = FW_DONTCARE; + m_lf.lfItalic = FALSE; + } + + if((cf.dwMask & (CFM_UNDERLINE | CFM_STRIKEOUT | CFM_COLOR)) == (CFM_UNDERLINE|CFM_STRIKEOUT|CFM_COLOR)) + { + dwFlags |= CF_EFFECTS; + m_lf.lfUnderline = (BYTE)(((cf.dwEffects & CFE_UNDERLINE) != 0) ? TRUE : FALSE); + m_lf.lfStrikeOut = (BYTE)(((cf.dwEffects & CFE_STRIKEOUT) != 0) ? TRUE : FALSE); + } + else + { + m_lf.lfUnderline = (BYTE)FALSE; + m_lf.lfStrikeOut = (BYTE)FALSE; + } + + if((cf.dwMask & CFM_CHARSET) != 0) + m_lf.lfCharSet = cf.bCharSet; + else + dwFlags |= CF_NOSCRIPTSEL; + m_lf.lfOutPrecision = OUT_DEFAULT_PRECIS; + m_lf.lfClipPrecision = CLIP_DEFAULT_PRECIS; + m_lf.lfQuality = DEFAULT_QUALITY; + if((cf.dwMask & CFM_FACE) != 0) + { + m_lf.lfPitchAndFamily = cf.bPitchAndFamily; +#if (_RICHEDIT_VER >= 0x0200) + SecureHelper::strcpy_x(m_lf.lfFaceName, _countof(m_lf.lfFaceName), cf.szFaceName); +#else // !(_RICHEDIT_VER >= 0x0200) + SecureHelper::strcpy_x(m_lf.lfFaceName, _countof(m_lf.lfFaceName), A2T((LPSTR)cf.szFaceName)); +#endif // !(_RICHEDIT_VER >= 0x0200) + } + else + { + m_lf.lfPitchAndFamily = DEFAULT_PITCH|FF_DONTCARE; + m_lf.lfFaceName[0] = (TCHAR)0; + } + return dwFlags; + } +}; + +class CRichEditFontDialog : public CRichEditFontDialogImpl +{ +public: + CRichEditFontDialog(const CHARFORMAT& charformat, + DWORD dwFlags = CF_SCREENFONTS, + HDC hDCPrinter = NULL, + HWND hWndParent = NULL) + : CRichEditFontDialogImpl(charformat, dwFlags, hDCPrinter, hWndParent) + { } + + DECLARE_EMPTY_MSG_MAP() +}; + +#endif // defined(_RICHEDIT_) && !defined(_WIN32_WCE) + + +/////////////////////////////////////////////////////////////////////////////// +// CColorDialogImpl - color selection + +#if !defined(_WIN32_WCE) || ((_WIN32_WCE > 420) && !(defined(WIN32_PLATFORM_WFSP) && (_WIN32_WCE > 0x0500))) + +#ifdef _WIN32_WCE + #pragma comment(lib, "commdlg.lib") + + #ifndef SETRGBSTRING + #define SETRGBSTRING _T("commdlg_SetRGBColor") + #endif + + #ifndef COLOROKSTRING + #define COLOROKSTRING _T("commdlg_ColorOK") + #endif +#endif + +template +class ATL_NO_VTABLE CColorDialogImpl : public CCommonDialogImplBase +{ +public: + CHOOSECOLOR m_cc; + +// Constructor + CColorDialogImpl(COLORREF clrInit = 0, DWORD dwFlags = 0, HWND hWndParent = NULL) + { + memset(&m_cc, 0, sizeof(m_cc)); + + m_cc.lStructSize = sizeof(m_cc); + m_cc.lpCustColors = GetCustomColors(); + m_cc.hwndOwner = hWndParent; + m_cc.Flags = dwFlags | CC_ENABLEHOOK; + m_cc.lpfnHook = (LPCCHOOKPROC)T::HookProc; + + if(clrInit != 0) + { + m_cc.rgbResult = clrInit; + m_cc.Flags |= CC_RGBINIT; + } + } + +// Operations + INT_PTR DoModal(HWND hWndParent = ::GetActiveWindow()) + { + ATLASSERT((m_cc.Flags & CC_ENABLEHOOK) != 0); + ATLASSERT(m_cc.lpfnHook != NULL); // can still be a user hook + + if(m_cc.hwndOwner == NULL) // set only if not specified before + m_cc.hwndOwner = hWndParent; + + ATLASSERT(m_hWnd == NULL); + ModuleHelper::AddCreateWndData(&m_thunk.cd, (CCommonDialogImplBase*)this); + + BOOL bRet = ::ChooseColor(&m_cc); + + m_hWnd = NULL; + + return bRet ? IDOK : IDCANCEL; + } + + // Set the current color while dialog is displayed + void SetCurrentColor(COLORREF clr) + { + ATLASSERT(::IsWindow(m_hWnd)); + SendMessage(_GetSetRGBMessage(), 0, (LPARAM)clr); + } + + // Get the selected color after DoModal returns, or in OnColorOK + COLORREF GetColor() const + { + return m_cc.rgbResult; + } + +// Special override for the color dialog + static UINT_PTR APIENTRY HookProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) + { + if(uMsg != WM_INITDIALOG && uMsg != _GetColorOKMessage()) + return 0; + + LPCHOOSECOLOR lpCC = (LPCHOOSECOLOR)lParam; + CCommonDialogImplBase* pT = NULL; + + if(uMsg == WM_INITDIALOG) + { + pT = (CCommonDialogImplBase*)ModuleHelper::ExtractCreateWndData(); + lpCC->lCustData = (LPARAM)pT; + ATLASSERT(pT != NULL); + ATLASSERT(pT->m_hWnd == NULL); + ATLASSERT(::IsWindow(hWnd)); + // subclass dialog's window + if(!pT->SubclassWindow(hWnd)) + { + ATLTRACE2(atlTraceUI, 0, _T("Subclassing a Color common dialog failed\n")); + return 0; + } + } + else if(uMsg == _GetColorOKMessage()) + { + pT = (CCommonDialogImplBase*)lpCC->lCustData; + ATLASSERT(pT != NULL); + ATLASSERT(::IsWindow(pT->m_hWnd)); + } + + // pass to the message map + LRESULT lRes; + if(pT->ProcessWindowMessage(pT->m_hWnd, uMsg, wParam, lParam, lRes, 0) == FALSE) + return 0; + return lRes; + } + +// Helpers + static COLORREF* GetCustomColors() + { + static COLORREF rgbCustomColors[16] = + { + RGB(255, 255, 255), RGB(255, 255, 255), + RGB(255, 255, 255), RGB(255, 255, 255), + RGB(255, 255, 255), RGB(255, 255, 255), + RGB(255, 255, 255), RGB(255, 255, 255), + RGB(255, 255, 255), RGB(255, 255, 255), + RGB(255, 255, 255), RGB(255, 255, 255), + RGB(255, 255, 255), RGB(255, 255, 255), + RGB(255, 255, 255), RGB(255, 255, 255), + }; + + return rgbCustomColors; + } + + static UINT _GetSetRGBMessage() + { + static UINT uSetRGBMessage = 0; + if(uSetRGBMessage == 0) + { + CStaticDataInitCriticalSectionLock lock; + if(FAILED(lock.Lock())) + { + ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CColorDialogImpl::_GetSetRGBMessage.\n")); + ATLASSERT(FALSE); + return 0; + } + + if(uSetRGBMessage == 0) + uSetRGBMessage = ::RegisterWindowMessage(SETRGBSTRING); + + lock.Unlock(); + } + ATLASSERT(uSetRGBMessage != 0); + return uSetRGBMessage; + } + + static UINT _GetColorOKMessage() + { + static UINT uColorOKMessage = 0; + if(uColorOKMessage == 0) + { + CStaticDataInitCriticalSectionLock lock; + if(FAILED(lock.Lock())) + { + ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CColorDialogImpl::_GetColorOKMessage.\n")); + ATLASSERT(FALSE); + return 0; + } + + if(uColorOKMessage == 0) + uColorOKMessage = ::RegisterWindowMessage(COLOROKSTRING); + + lock.Unlock(); + } + ATLASSERT(uColorOKMessage != 0); + return uColorOKMessage; + } + +// Message map and handlers + BEGIN_MSG_MAP(CColorDialogImpl) + MESSAGE_HANDLER(_GetColorOKMessage(), _OnColorOK) + END_MSG_MAP() + + LRESULT _OnColorOK(UINT, WPARAM, LPARAM, BOOL&) + { + T* pT = static_cast(this); + return pT->OnColorOK(); + } + +// Overrideable + BOOL OnColorOK() // validate color + { + return FALSE; + } +}; + +class CColorDialog : public CColorDialogImpl +{ +public: + CColorDialog(COLORREF clrInit = 0, DWORD dwFlags = 0, HWND hWndParent = NULL) + : CColorDialogImpl(clrInit, dwFlags, hWndParent) + { } + + // override base class map and references to handlers + DECLARE_EMPTY_MSG_MAP() +}; + +#endif // !defined(_WIN32_WCE) || ((_WIN32_WCE > 420) && !(defined(WIN32_PLATFORM_WFSP) && (_WIN32_WCE > 0x0500))) + + +/////////////////////////////////////////////////////////////////////////////// +// CPrintDialogImpl - used for Print... and PrintSetup... + +#ifndef _WIN32_WCE + +// global helper +static HDC _AtlCreateDC(HGLOBAL hDevNames, HGLOBAL hDevMode) +{ + if(hDevNames == NULL) + return NULL; + + LPDEVNAMES lpDevNames = (LPDEVNAMES)::GlobalLock(hDevNames); + LPDEVMODE lpDevMode = (hDevMode != NULL) ? (LPDEVMODE)::GlobalLock(hDevMode) : NULL; + + if(lpDevNames == NULL) + return NULL; + + HDC hDC = ::CreateDC((LPCTSTR)lpDevNames + lpDevNames->wDriverOffset, + (LPCTSTR)lpDevNames + lpDevNames->wDeviceOffset, + (LPCTSTR)lpDevNames + lpDevNames->wOutputOffset, + lpDevMode); + + ::GlobalUnlock(hDevNames); + if(hDevMode != NULL) + ::GlobalUnlock(hDevMode); + return hDC; +} + +template +class ATL_NO_VTABLE CPrintDialogImpl : public CCommonDialogImplBase +{ +public: + // print dialog parameter block (note this is a reference) + PRINTDLG& m_pd; + +// Constructors + CPrintDialogImpl(BOOL bPrintSetupOnly = FALSE, // TRUE for Print Setup, FALSE for Print Dialog + DWORD dwFlags = PD_ALLPAGES | PD_USEDEVMODECOPIES | PD_NOPAGENUMS | PD_NOSELECTION, + HWND hWndParent = NULL) + : m_pd(m_pdActual) + { + memset(&m_pdActual, 0, sizeof(m_pdActual)); + + m_pd.lStructSize = sizeof(m_pdActual); + m_pd.hwndOwner = hWndParent; + m_pd.Flags = (dwFlags | PD_ENABLEPRINTHOOK | PD_ENABLESETUPHOOK); + m_pd.lpfnPrintHook = (LPPRINTHOOKPROC)T::HookProc; + m_pd.lpfnSetupHook = (LPSETUPHOOKPROC)T::HookProc; + + if(bPrintSetupOnly) + m_pd.Flags |= PD_PRINTSETUP; + else + m_pd.Flags |= PD_RETURNDC; + + m_pd.Flags &= ~PD_RETURNIC; // do not support information context + } + +// Operations + INT_PTR DoModal(HWND hWndParent = ::GetActiveWindow()) + { + ATLASSERT((m_pd.Flags & PD_ENABLEPRINTHOOK) != 0); + ATLASSERT((m_pd.Flags & PD_ENABLESETUPHOOK) != 0); + ATLASSERT(m_pd.lpfnPrintHook != NULL); // can still be a user hook + ATLASSERT(m_pd.lpfnSetupHook != NULL); // can still be a user hook + ATLASSERT((m_pd.Flags & PD_RETURNDEFAULT) == 0); // use GetDefaults for this + + if(m_pd.hwndOwner == NULL) // set only if not specified before + m_pd.hwndOwner = hWndParent; + + ATLASSERT(m_hWnd == NULL); + ModuleHelper::AddCreateWndData(&m_thunk.cd, (CCommonDialogImplBase*)this); + + BOOL bRet = ::PrintDlg(&m_pd); + + m_hWnd = NULL; + + return bRet ? IDOK : IDCANCEL; + } + + // GetDefaults will not display a dialog but will get device defaults + BOOL GetDefaults() + { + m_pd.Flags |= PD_RETURNDEFAULT; + ATLASSERT(m_pd.hDevMode == NULL); // must be NULL + ATLASSERT(m_pd.hDevNames == NULL); // must be NULL + + return ::PrintDlg(&m_pd); + } + + // Helpers for parsing information after successful return num. copies requested + int GetCopies() const + { + if((m_pd.Flags & PD_USEDEVMODECOPIES) != 0) + { + LPDEVMODE lpDevMode = GetDevMode(); + return (lpDevMode != NULL) ? lpDevMode->dmCopies : -1; + } + + return m_pd.nCopies; + } + + BOOL PrintCollate() const // TRUE if collate checked + { + return ((m_pd.Flags & PD_COLLATE) != 0) ? TRUE : FALSE; + } + + BOOL PrintSelection() const // TRUE if printing selection + { + return ((m_pd.Flags & PD_SELECTION) != 0) ? TRUE : FALSE; + } + + BOOL PrintAll() const // TRUE if printing all pages + { + return (!PrintRange() && !PrintSelection()) ? TRUE : FALSE; + } + + BOOL PrintRange() const // TRUE if printing page range + { + return ((m_pd.Flags & PD_PAGENUMS) != 0) ? TRUE : FALSE; + } + + BOOL PrintToFile() const // TRUE if printing to a file + { + return ((m_pd.Flags & PD_PRINTTOFILE) != 0) ? TRUE : FALSE; + } + + int GetFromPage() const // starting page if valid + { + return PrintRange() ? m_pd.nFromPage : -1; + } + + int GetToPage() const // ending page if valid + { + return PrintRange() ? m_pd.nToPage : -1; + } + + LPDEVMODE GetDevMode() const // return DEVMODE + { + if(m_pd.hDevMode == NULL) + return NULL; + + return (LPDEVMODE)::GlobalLock(m_pd.hDevMode); + } + + LPCTSTR GetDriverName() const // return driver name + { + if(m_pd.hDevNames == NULL) + return NULL; + + LPDEVNAMES lpDev = (LPDEVNAMES)::GlobalLock(m_pd.hDevNames); + if(lpDev == NULL) + return NULL; + + return (LPCTSTR)lpDev + lpDev->wDriverOffset; + } + + LPCTSTR GetDeviceName() const // return device name + { + if(m_pd.hDevNames == NULL) + return NULL; + + LPDEVNAMES lpDev = (LPDEVNAMES)::GlobalLock(m_pd.hDevNames); + if(lpDev == NULL) + return NULL; + + return (LPCTSTR)lpDev + lpDev->wDeviceOffset; + } + + LPCTSTR GetPortName() const // return output port name + { + if(m_pd.hDevNames == NULL) + return NULL; + + LPDEVNAMES lpDev = (LPDEVNAMES)::GlobalLock(m_pd.hDevNames); + if(lpDev == NULL) + return NULL; + + return (LPCTSTR)lpDev + lpDev->wOutputOffset; + } + + HDC GetPrinterDC() const // return HDC (caller must delete) + { + ATLASSERT((m_pd.Flags & PD_RETURNDC) != 0); + return m_pd.hDC; + } + + // This helper creates a DC based on the DEVNAMES and DEVMODE structures. + // This DC is returned, but also stored in m_pd.hDC as though it had been + // returned by CommDlg. It is assumed that any previously obtained DC + // has been/will be deleted by the user. This may be + // used without ever invoking the print/print setup dialogs. + HDC CreatePrinterDC() + { + m_pd.hDC = _AtlCreateDC(m_pd.hDevNames, m_pd.hDevMode); + return m_pd.hDC; + } + +// Implementation + PRINTDLG m_pdActual; // the Print/Print Setup need to share this + + // The following handle the case of print setup... from the print dialog + CPrintDialogImpl(PRINTDLG& pdInit) : m_pd(pdInit) + { } + + BEGIN_MSG_MAP(CPrintDialogImpl) +#ifdef psh1 + COMMAND_ID_HANDLER(psh1, OnPrintSetup) // print setup button when print is displayed +#else // !psh1 + COMMAND_ID_HANDLER(0x0400, OnPrintSetup) // value from dlgs.h +#endif // !psh1 + END_MSG_MAP() + + LRESULT OnPrintSetup(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& /*bHandled*/) + { + T dlgSetup(m_pd); + ModuleHelper::AddCreateWndData(&dlgSetup.m_thunk.cd, (CCommonDialogImplBase*)&dlgSetup); + return DefWindowProc(WM_COMMAND, MAKEWPARAM(wID, wNotifyCode), (LPARAM)hWndCtl); + } +}; + +class CPrintDialog : public CPrintDialogImpl +{ +public: + CPrintDialog(BOOL bPrintSetupOnly = FALSE, + DWORD dwFlags = PD_ALLPAGES | PD_USEDEVMODECOPIES | PD_NOPAGENUMS | PD_NOSELECTION, + HWND hWndParent = NULL) + : CPrintDialogImpl(bPrintSetupOnly, dwFlags, hWndParent) + { } + + CPrintDialog(PRINTDLG& pdInit) : CPrintDialogImpl(pdInit) + { } +}; + +#endif // _WIN32_WCE + + +/////////////////////////////////////////////////////////////////////////////// +// CPrintDialogExImpl - new print dialog for Windows 2000 + +#if (WINVER >= 0x0500) && !defined(_WIN32_WCE) + +}; // namespace WTL + +#include + +extern "C" const __declspec(selectany) IID IID_IPrintDialogCallback = {0x5852a2c3, 0x6530, 0x11d1, {0xb6, 0xa3, 0x0, 0x0, 0xf8, 0x75, 0x7b, 0xf9}}; +extern "C" const __declspec(selectany) IID IID_IPrintDialogServices = {0x509aaeda, 0x5639, 0x11d1, {0xb6, 0xa1, 0x0, 0x0, 0xf8, 0x75, 0x7b, 0xf9}}; + +namespace WTL +{ + +template +class ATL_NO_VTABLE CPrintDialogExImpl : + public ATL::CWindow, + public ATL::CMessageMap, + public IPrintDialogCallback, + public ATL::IObjectWithSiteImpl< T > +{ +public: + PRINTDLGEX m_pdex; + +// Constructor + CPrintDialogExImpl(DWORD dwFlags = PD_ALLPAGES | PD_USEDEVMODECOPIES | PD_NOPAGENUMS | PD_NOSELECTION | PD_NOCURRENTPAGE, + HWND hWndParent = NULL) + { + memset(&m_pdex, 0, sizeof(m_pdex)); + + m_pdex.lStructSize = sizeof(PRINTDLGEX); + m_pdex.hwndOwner = hWndParent; + m_pdex.Flags = dwFlags; + m_pdex.nStartPage = START_PAGE_GENERAL; + // callback object will be set in DoModal + + m_pdex.Flags &= ~PD_RETURNIC; // do not support information context + } + +// Operations + HRESULT DoModal(HWND hWndParent = ::GetActiveWindow()) + { + ATLASSERT(m_hWnd == NULL); + ATLASSERT((m_pdex.Flags & PD_RETURNDEFAULT) == 0); // use GetDefaults for this + + if(m_pdex.hwndOwner == NULL) // set only if not specified before + m_pdex.hwndOwner = hWndParent; + + T* pT = static_cast(this); + m_pdex.lpCallback = (IUnknown*)(IPrintDialogCallback*)pT; + + HRESULT hResult = ::PrintDlgEx(&m_pdex); + + m_hWnd = NULL; + + return hResult; + } + + BOOL EndDialog(INT_PTR /*nRetCode*/ = 0) + { + ATLASSERT(::IsWindow(m_hWnd)); + SendMessage(WM_COMMAND, MAKEWPARAM(IDABORT, 0)); + return TRUE; + } + + // GetDefaults will not display a dialog but will get device defaults + HRESULT GetDefaults() + { + m_pdex.Flags |= PD_RETURNDEFAULT; + ATLASSERT(m_pdex.hDevMode == NULL); // must be NULL + ATLASSERT(m_pdex.hDevNames == NULL); // must be NULL + + return ::PrintDlgEx(&m_pdex); + } + + // Helpers for parsing information after successful return num. copies requested + int GetCopies() const + { + if((m_pdex.Flags & PD_USEDEVMODECOPIES) != 0) + { + LPDEVMODE lpDevMode = GetDevMode(); + return (lpDevMode != NULL) ? lpDevMode->dmCopies : -1; + } + + return m_pdex.nCopies; + } + + BOOL PrintCollate() const // TRUE if collate checked + { + return ((m_pdex.Flags & PD_COLLATE) != 0) ? TRUE : FALSE; + } + + BOOL PrintSelection() const // TRUE if printing selection + { + return ((m_pdex.Flags & PD_SELECTION) != 0) ? TRUE : FALSE; + } + + BOOL PrintAll() const // TRUE if printing all pages + { + return (!PrintRange() && !PrintSelection()) ? TRUE : FALSE; + } + + BOOL PrintRange() const // TRUE if printing page range + { + return ((m_pdex.Flags & PD_PAGENUMS) != 0) ? TRUE : FALSE; + } + + BOOL PrintToFile() const // TRUE if printing to a file + { + return ((m_pdex.Flags & PD_PRINTTOFILE) != 0) ? TRUE : FALSE; + } + + LPDEVMODE GetDevMode() const // return DEVMODE + { + if(m_pdex.hDevMode == NULL) + return NULL; + + return (LPDEVMODE)::GlobalLock(m_pdex.hDevMode); + } + + LPCTSTR GetDriverName() const // return driver name + { + if(m_pdex.hDevNames == NULL) + return NULL; + + LPDEVNAMES lpDev = (LPDEVNAMES)::GlobalLock(m_pdex.hDevNames); + if(lpDev == NULL) + return NULL; + + return (LPCTSTR)lpDev + lpDev->wDriverOffset; + } + + LPCTSTR GetDeviceName() const // return device name + { + if(m_pdex.hDevNames == NULL) + return NULL; + + LPDEVNAMES lpDev = (LPDEVNAMES)::GlobalLock(m_pdex.hDevNames); + if(lpDev == NULL) + return NULL; + + return (LPCTSTR)lpDev + lpDev->wDeviceOffset; + } + + LPCTSTR GetPortName() const // return output port name + { + if(m_pdex.hDevNames == NULL) + return NULL; + + LPDEVNAMES lpDev = (LPDEVNAMES)::GlobalLock(m_pdex.hDevNames); + if(lpDev == NULL) + return NULL; + + return (LPCTSTR)lpDev + lpDev->wOutputOffset; + } + + HDC GetPrinterDC() const // return HDC (caller must delete) + { + ATLASSERT((m_pdex.Flags & PD_RETURNDC) != 0); + return m_pdex.hDC; + } + + // This helper creates a DC based on the DEVNAMES and DEVMODE structures. + // This DC is returned, but also stored in m_pdex.hDC as though it had been + // returned by CommDlg. It is assumed that any previously obtained DC + // has been/will be deleted by the user. This may be + // used without ever invoking the print/print setup dialogs. + HDC CreatePrinterDC() + { + m_pdex.hDC = _AtlCreateDC(m_pdex.hDevNames, m_pdex.hDevMode); + return m_pdex.hDC; + } + +// Implementation - interfaces + +// IUnknown + STDMETHOD(QueryInterface)(REFIID riid, void** ppvObject) + { + if(ppvObject == NULL) + return E_POINTER; + + T* pT = static_cast(this); + if(IsEqualGUID(riid, IID_IUnknown) || IsEqualGUID(riid, IID_IPrintDialogCallback)) + { + *ppvObject = (IPrintDialogCallback*)pT; + // AddRef() not needed + return S_OK; + } + else if(IsEqualGUID(riid, IID_IObjectWithSite)) + { + *ppvObject = (IObjectWithSite*)pT; + // AddRef() not needed + return S_OK; + } + + return E_NOINTERFACE; + } + + virtual ULONG STDMETHODCALLTYPE AddRef() + { + return 1; + } + + virtual ULONG STDMETHODCALLTYPE Release() + { + return 1; + } + +// IPrintDialogCallback + STDMETHOD(InitDone)() + { + return S_FALSE; + } + + STDMETHOD(SelectionChange)() + { + return S_FALSE; + } + + STDMETHOD(HandleMessage)(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT* plResult) + { + // set up m_hWnd the first time + if(m_hWnd == NULL) + Attach(hWnd); + + // call message map + HRESULT hRet = ProcessWindowMessage(hWnd, uMsg, wParam, lParam, *plResult, 0) ? S_OK : S_FALSE; + if(hRet == S_OK && uMsg == WM_NOTIFY) // return in DWLP_MSGRESULT + ::SetWindowLongPtr(GetParent(), DWLP_MSGRESULT, (LONG_PTR)*plResult); + + if(uMsg == WM_INITDIALOG && hRet == S_OK && (BOOL)*plResult != FALSE) + hRet = S_FALSE; + + return hRet; + } +}; + +class CPrintDialogEx : public CPrintDialogExImpl +{ +public: + CPrintDialogEx( + DWORD dwFlags = PD_ALLPAGES | PD_USEDEVMODECOPIES | PD_NOPAGENUMS | PD_NOSELECTION | PD_NOCURRENTPAGE, + HWND hWndParent = NULL) + : CPrintDialogExImpl(dwFlags, hWndParent) + { } + + DECLARE_EMPTY_MSG_MAP() +}; + +#endif // (WINVER >= 0x0500) && !defined(_WIN32_WCE) + + +/////////////////////////////////////////////////////////////////////////////// +// CPageSetupDialogImpl - Page Setup dialog + +#ifndef _WIN32_WCE + +template +class ATL_NO_VTABLE CPageSetupDialogImpl : public CCommonDialogImplBase +{ +public: + PAGESETUPDLG m_psd; + ATL::CWndProcThunk m_thunkPaint; + +// Constructors + CPageSetupDialogImpl(DWORD dwFlags = PSD_MARGINS | PSD_INWININIINTLMEASURE, HWND hWndParent = NULL) + { + memset(&m_psd, 0, sizeof(m_psd)); + + m_psd.lStructSize = sizeof(m_psd); + m_psd.hwndOwner = hWndParent; + m_psd.Flags = (dwFlags | PSD_ENABLEPAGESETUPHOOK | PSD_ENABLEPAGEPAINTHOOK); + m_psd.lpfnPageSetupHook = (LPPAGESETUPHOOK)T::HookProc; + m_thunkPaint.Init((WNDPROC)T::PaintHookProc, this); +#if (_ATL_VER >= 0x0700) + m_psd.lpfnPagePaintHook = (LPPAGEPAINTHOOK)m_thunkPaint.GetWNDPROC(); +#else + m_psd.lpfnPagePaintHook = (LPPAGEPAINTHOOK)&(m_thunkPaint.thunk); +#endif + } + + DECLARE_EMPTY_MSG_MAP() + +// Attributes + LPDEVMODE GetDevMode() const // return DEVMODE + { + if(m_psd.hDevMode == NULL) + return NULL; + + return (LPDEVMODE)::GlobalLock(m_psd.hDevMode); + } + + LPCTSTR GetDriverName() const // return driver name + { + if(m_psd.hDevNames == NULL) + return NULL; + + LPDEVNAMES lpDev = (LPDEVNAMES)::GlobalLock(m_psd.hDevNames); + return (LPCTSTR)lpDev + lpDev->wDriverOffset; + } + + LPCTSTR GetDeviceName() const // return device name + { + if(m_psd.hDevNames == NULL) + return NULL; + + LPDEVNAMES lpDev = (LPDEVNAMES)::GlobalLock(m_psd.hDevNames); + return (LPCTSTR)lpDev + lpDev->wDeviceOffset; + } + + LPCTSTR GetPortName() const // return output port name + { + if(m_psd.hDevNames == NULL) + return NULL; + + LPDEVNAMES lpDev = (LPDEVNAMES)::GlobalLock(m_psd.hDevNames); + return (LPCTSTR)lpDev + lpDev->wOutputOffset; + } + + HDC CreatePrinterDC() + { + return _AtlCreateDC(m_psd.hDevNames, m_psd.hDevMode); + } + + SIZE GetPaperSize() const + { + SIZE size; + size.cx = m_psd.ptPaperSize.x; + size.cy = m_psd.ptPaperSize.y; + return size; + } + + void GetMargins(LPRECT lpRectMargins, LPRECT lpRectMinMargins) const + { + if(lpRectMargins != NULL) + *lpRectMargins = m_psd.rtMargin; + if(lpRectMinMargins != NULL) + *lpRectMinMargins = m_psd.rtMinMargin; + } + +// Operations + INT_PTR DoModal(HWND hWndParent = ::GetActiveWindow()) + { + ATLASSERT((m_psd.Flags & PSD_ENABLEPAGESETUPHOOK) != 0); + ATLASSERT((m_psd.Flags & PSD_ENABLEPAGEPAINTHOOK) != 0); + ATLASSERT(m_psd.lpfnPageSetupHook != NULL); // can still be a user hook + ATLASSERT(m_psd.lpfnPagePaintHook != NULL); // can still be a user hook + + if(m_psd.hwndOwner == NULL) // set only if not specified before + m_psd.hwndOwner = hWndParent; + + ATLASSERT(m_hWnd == NULL); + ModuleHelper::AddCreateWndData(&m_thunk.cd, (CCommonDialogImplBase*)this); + + BOOL bRet = ::PageSetupDlg(&m_psd); + + m_hWnd = NULL; + + return bRet ? IDOK : IDCANCEL; + } + +// Implementation + static UINT_PTR CALLBACK PaintHookProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) + { + T* pT = (T*)hWnd; + UINT_PTR uRet = 0; + switch(uMsg) + { + case WM_PSD_PAGESETUPDLG: + uRet = pT->PreDrawPage(LOWORD(wParam), HIWORD(wParam), (LPPAGESETUPDLG)lParam); + break; + case WM_PSD_FULLPAGERECT: + case WM_PSD_MINMARGINRECT: + case WM_PSD_MARGINRECT: + case WM_PSD_GREEKTEXTRECT: + case WM_PSD_ENVSTAMPRECT: + case WM_PSD_YAFULLPAGERECT: + uRet = pT->OnDrawPage(uMsg, (HDC)wParam, (LPRECT)lParam); + break; + default: + ATLTRACE2(atlTraceUI, 0, _T("CPageSetupDialogImpl::PaintHookProc - unknown message received\n")); + break; + } + return uRet; + } + +// Overridables + UINT_PTR PreDrawPage(WORD /*wPaper*/, WORD /*wFlags*/, LPPAGESETUPDLG /*pPSD*/) + { + // return 1 to prevent any more drawing + return 0; + } + + UINT_PTR OnDrawPage(UINT /*uMsg*/, HDC /*hDC*/, LPRECT /*lpRect*/) + { + return 0; // do the default + } +}; + +class CPageSetupDialog : public CPageSetupDialogImpl +{ +public: + CPageSetupDialog(DWORD dwFlags = PSD_MARGINS | PSD_INWININIINTLMEASURE, HWND hWndParent = NULL) + : CPageSetupDialogImpl(dwFlags, hWndParent) + { } + + // override PaintHookProc and references to handlers + static UINT_PTR CALLBACK PaintHookProc(HWND, UINT, WPARAM, LPARAM) + { + return 0; + } +}; + +#endif // _WIN32_WCE + + +/////////////////////////////////////////////////////////////////////////////// +// CFindReplaceDialogImpl - Find/FindReplace modeless dialogs + +#ifndef _WIN32_WCE + +template +class ATL_NO_VTABLE CFindReplaceDialogImpl : public CCommonDialogImplBase +{ +public: + enum { _cchFindReplaceBuffer = 128 }; + + FINDREPLACE m_fr; + TCHAR m_szFindWhat[_cchFindReplaceBuffer]; + TCHAR m_szReplaceWith[_cchFindReplaceBuffer]; + +// Constructors + CFindReplaceDialogImpl() + { + memset(&m_fr, 0, sizeof(m_fr)); + m_szFindWhat[0] = _T('\0'); + m_szReplaceWith[0] = _T('\0'); + + m_fr.lStructSize = sizeof(m_fr); + m_fr.Flags = FR_ENABLEHOOK; + m_fr.lpfnHook = (LPFRHOOKPROC)T::HookProc; + m_fr.lpstrFindWhat = (LPTSTR)m_szFindWhat; + m_fr.wFindWhatLen = _cchFindReplaceBuffer; + m_fr.lpstrReplaceWith = (LPTSTR)m_szReplaceWith; + m_fr.wReplaceWithLen = _cchFindReplaceBuffer; + } + + // Note: You must allocate the object on the heap. + // If you do not, you must override OnFinalMessage() + virtual void OnFinalMessage(HWND /*hWnd*/) + { + delete this; + } + + HWND Create(BOOL bFindDialogOnly, // TRUE for Find, FALSE for FindReplace + LPCTSTR lpszFindWhat, + LPCTSTR lpszReplaceWith = NULL, + DWORD dwFlags = FR_DOWN, + HWND hWndParent = NULL) + { + ATLASSERT((m_fr.Flags & FR_ENABLEHOOK) != 0); + ATLASSERT(m_fr.lpfnHook != NULL); + + m_fr.Flags |= dwFlags; + + if(hWndParent == NULL) + m_fr.hwndOwner = ::GetActiveWindow(); + else + m_fr.hwndOwner = hWndParent; + ATLASSERT(m_fr.hwndOwner != NULL); // must have an owner for modeless dialog + + if(lpszFindWhat != NULL) + SecureHelper::strncpy_x(m_szFindWhat, _countof(m_szFindWhat), lpszFindWhat, _TRUNCATE); + + if(lpszReplaceWith != NULL) + SecureHelper::strncpy_x(m_szReplaceWith, _countof(m_szReplaceWith), lpszReplaceWith, _TRUNCATE); + + ATLASSERT(m_hWnd == NULL); + ModuleHelper::AddCreateWndData(&m_thunk.cd, (CCommonDialogImplBase*)this); + + HWND hWnd = NULL; + if(bFindDialogOnly) + hWnd = ::FindText(&m_fr); + else + hWnd = ::ReplaceText(&m_fr); + + ATLASSERT(m_hWnd == hWnd); + return hWnd; + } + + static const UINT GetFindReplaceMsg() + { + static const UINT nMsgFindReplace = ::RegisterWindowMessage(FINDMSGSTRING); + return nMsgFindReplace; + } + // call while handling FINDMSGSTRING registered message + // to retreive the object + static T* PASCAL GetNotifier(LPARAM lParam) + { + ATLASSERT(lParam != NULL); + T* pDlg = (T*)(lParam - offsetof(T, m_fr)); + return pDlg; + } + +// Operations + // Helpers for parsing information after successful return + LPCTSTR GetFindString() const // get find string + { + return (LPCTSTR)m_fr.lpstrFindWhat; + } + + LPCTSTR GetReplaceString() const // get replacement string + { + return (LPCTSTR)m_fr.lpstrReplaceWith; + } + + BOOL SearchDown() const // TRUE if search down, FALSE is up + { + return ((m_fr.Flags & FR_DOWN) != 0) ? TRUE : FALSE; + } + + BOOL FindNext() const // TRUE if command is find next + { + return ((m_fr.Flags & FR_FINDNEXT) != 0) ? TRUE : FALSE; + } + + BOOL MatchCase() const // TRUE if matching case + { + return ((m_fr.Flags & FR_MATCHCASE) != 0) ? TRUE : FALSE; + } + + BOOL MatchWholeWord() const // TRUE if matching whole words only + { + return ((m_fr.Flags & FR_WHOLEWORD) != 0) ? TRUE : FALSE; + } + + BOOL ReplaceCurrent() const // TRUE if replacing current string + { + return ((m_fr. Flags & FR_REPLACE) != 0) ? TRUE : FALSE; + } + + BOOL ReplaceAll() const // TRUE if replacing all occurrences + { + return ((m_fr.Flags & FR_REPLACEALL) != 0) ? TRUE : FALSE; + } + + BOOL IsTerminating() const // TRUE if terminating dialog + { + return ((m_fr.Flags & FR_DIALOGTERM) != 0) ? TRUE : FALSE ; + } +}; + +class CFindReplaceDialog : public CFindReplaceDialogImpl +{ +public: + DECLARE_EMPTY_MSG_MAP() +}; + +#endif // !_WIN32_WCE + + +#if (_ATL_VER >= 0x800) +typedef ATL::_DialogSplitHelper::DLGTEMPLATEEX DLGTEMPLATEEX; +typedef ATL::_DialogSplitHelper::DLGITEMTEMPLATEEX DLGITEMTEMPLATEEX; +#else // (_ATL_VER >= 0x800) +typedef ATL::_DialogSizeHelper::_ATL_DLGTEMPLATEEX DLGTEMPLATEEX; +#pragma pack(push, 4) +struct DLGITEMTEMPLATEEX +{ + DWORD helpID; + DWORD exStyle; + DWORD style; + short x; + short y; + short cx; + short cy; + WORD id; +}; +#pragma pack(pop) +#endif // (_ATL_VER >= 0x800) + + +/////////////////////////////////////////////////////////////////////////////// +// CMemDlgTemplate - in-memory dialog template - DLGTEMPLATE or DLGTEMPLATEEX + +class CMemDlgTemplate +{ +public: + enum StdCtrlType + { + CTRL_BUTTON = 0x0080, + CTRL_EDIT = 0x0081, + CTRL_STATIC = 0x0082, + CTRL_LISTBOX = 0x0083, + CTRL_SCROLLBAR = 0x0084, + CTRL_COMBOBOX = 0x0085 + }; + + CMemDlgTemplate() : m_pData(NULL), m_pPtr(NULL), m_cAllocated(0) + { } + + ~CMemDlgTemplate() + { + Reset(); + } + + bool IsValid() const + { + return (m_pData != NULL); + } + + bool IsTemplateEx() const + { + return (IsValid() && ((DLGTEMPLATEEX*)m_pData)->signature == 0xFFFF); + } + + LPDLGTEMPLATE GetTemplatePtr() + { + return reinterpret_cast(m_pData); + } + + DLGTEMPLATEEX* GetTemplateExPtr() + { + return reinterpret_cast(m_pData); + } + + void Reset() + { + if (IsValid()) + ATLVERIFY(::GlobalFree(m_pData) == NULL); + + m_pData = NULL; + m_pPtr = NULL; + m_cAllocated = 0; + } + + void Create(bool bDlgEx, LPCTSTR lpszCaption, short nX, short nY, short nWidth, short nHeight, DWORD dwStyle = 0, DWORD dwExStyle = 0, + LPCTSTR lpstrFontName = NULL, WORD wFontSize = 0, WORD wWeight = 0, BYTE bItalic = 0, BYTE bCharset = 0, DWORD dwHelpID = 0, + ATL::_U_STRINGorID ClassName = 0U, ATL::_U_STRINGorID Menu = 0U) + { + // Should have DS_SETFONT style to set the dialog font name and size + if (lpstrFontName != NULL) + { + dwStyle |= DS_SETFONT; + } + else + { + dwStyle &= ~DS_SETFONT; + } + + if (bDlgEx) + { + DLGTEMPLATEEX dlg = {1, 0xFFFF, dwHelpID, dwExStyle, dwStyle, 0, nX, nY, nWidth, nHeight}; + AddData(&dlg, sizeof(dlg)); + } + else + { + DLGTEMPLATE dlg = {dwStyle, dwExStyle, 0, nX, nY, nWidth, nHeight}; + AddData(&dlg, sizeof(dlg)); + } + +#ifndef _WIN32_WCE + if (Menu.m_lpstr == NULL) + { + WORD menuData = 0; + AddData(&menuData, sizeof(WORD)); + } + else if (IS_INTRESOURCE(Menu.m_lpstr)) + { + WORD menuData[] = {0xFFFF, (WORD)Menu.m_lpstr}; + AddData(menuData, sizeof(menuData)); + } + else + { + AddString(Menu.m_lpstr); + } +#else // _WIN32_WCE + // Windows CE doesn't support the addition of menus to a dialog box + ATLASSERT(Menu.m_lpstr == NULL); + Menu.m_lpstr; // avoid level 4 warning + WORD menuData = 0; + AddData(&menuData, sizeof(WORD)); +#endif // _WIN32_WCE + + if (ClassName.m_lpstr == NULL) + { + WORD classData = 0; + AddData(&classData, sizeof(WORD)); + } + else if (IS_INTRESOURCE(ClassName.m_lpstr)) + { + WORD classData[] = {0xFFFF, (WORD)ClassName.m_lpstr}; + AddData(classData, sizeof(classData)); + } + else + { + AddString(ClassName.m_lpstr); + } + + // Set dialog caption + AddString(lpszCaption); + + if (lpstrFontName != NULL) + { + AddData(&wFontSize, sizeof(wFontSize)); + + if (bDlgEx) + { + AddData(&wWeight, sizeof(wWeight)); + AddData(&bItalic, sizeof(bItalic)); + AddData(&bCharset, sizeof(bCharset)); + } + + AddString(lpstrFontName); + } + } + + void AddControl(ATL::_U_STRINGorID ClassName, WORD wId, short nX, short nY, short nWidth, short nHeight, DWORD dwStyle, DWORD dwExStyle, + ATL::_U_STRINGorID Text, const WORD* pCreationData = NULL, WORD nCreationData = 0, DWORD dwHelpID = 0) + { + ATLASSERT(IsValid()); + + // DWORD align data + m_pPtr = (LPBYTE)(DWORD_PTR)((DWORD)(DWORD_PTR)(m_pPtr + 3) & (~3)); + + if (IsTemplateEx()) + { + DLGTEMPLATEEX* dlg = (DLGTEMPLATEEX*)m_pData; + dlg->cDlgItems++; + + DLGITEMTEMPLATEEX item = {dwHelpID, ATL::CControlWinTraits::GetWndExStyle(0) | dwExStyle, ATL::CControlWinTraits::GetWndStyle(0) | dwStyle, nX, nY, nWidth, nHeight, wId}; + AddData(&item, sizeof(item)); + } + else + { + LPDLGTEMPLATE dlg = (LPDLGTEMPLATE)m_pData; + dlg->cdit++; + + DLGITEMTEMPLATE item = {ATL::CControlWinTraits::GetWndStyle(0) | dwStyle, ATL::CControlWinTraits::GetWndExStyle(0) | dwExStyle, nX, nY, nWidth, nHeight, wId}; + AddData(&item, sizeof(item)); + } + + ATLASSERT(ClassName.m_lpstr != NULL); + if (IS_INTRESOURCE(ClassName.m_lpstr)) + { + WORD wData[] = {0xFFFF, (WORD)ClassName.m_lpstr}; + AddData(wData, sizeof(wData)); + } + else + { + AddString(ClassName.m_lpstr); + } + + if (Text.m_lpstr == NULL) + { + WORD classData = 0; + AddData(&classData, sizeof(WORD)); + } + else if (IS_INTRESOURCE(Text.m_lpstr)) + { + WORD wData[] = {0xFFFF, (WORD)Text.m_lpstr}; + AddData(wData, sizeof(wData)); + } + else + { + AddString(Text.m_lpstr); + } + + AddData(&nCreationData, sizeof(nCreationData)); + + if ((nCreationData != 0)) + { + ATLASSERT(pCreationData != NULL); + AddData(pCreationData, nCreationData * sizeof(WORD)); + } + } + + void AddStdControl(StdCtrlType CtrlType, WORD wId, short nX, short nY, short nWidth, short nHeight, + DWORD dwStyle, DWORD dwExStyle, ATL::_U_STRINGorID Text, const WORD* pCreationData = NULL, WORD nCreationData = 0, DWORD dwHelpID = 0) + { + AddControl(CtrlType, wId, nX, nY, nWidth, nHeight, dwStyle, dwExStyle, Text, pCreationData, nCreationData, dwHelpID); + } + +protected: + void AddData(LPCVOID pData, size_t nData) + { + ATLASSERT(pData != NULL); + + const size_t ALLOCATION_INCREMENT = 1024; + + if (m_pData == NULL) + { + m_cAllocated = ((nData / ALLOCATION_INCREMENT) + 1) * ALLOCATION_INCREMENT; + m_pPtr = m_pData = static_cast(::GlobalAlloc(GPTR, m_cAllocated)); + ATLASSERT(m_pData != NULL); + } + else if (((m_pPtr - m_pData) + nData) > m_cAllocated) + { + size_t ptrPos = (m_pPtr - m_pData); + m_cAllocated += ((nData / ALLOCATION_INCREMENT) + 1) * ALLOCATION_INCREMENT; + m_pData = static_cast(::GlobalReAlloc(m_pData, m_cAllocated, 0)); + ATLASSERT(m_pData != NULL); + m_pPtr = m_pData + ptrPos; + } + + SecureHelper::memcpy_x(m_pPtr, m_cAllocated - (m_pPtr - m_pData), pData, nData); + + m_pPtr += nData; + } + + void AddString(LPCTSTR lpszStr) + { + if (lpszStr == NULL) + { + WCHAR szEmpty = 0; + AddData(&szEmpty, sizeof(szEmpty)); + } + else + { + USES_CONVERSION; + LPCWSTR lpstr = T2CW(lpszStr); + int nSize = lstrlenW(lpstr) + 1; + AddData(lpstr, nSize * sizeof(WCHAR)); + } + } + + LPBYTE m_pData; + LPBYTE m_pPtr; + SIZE_T m_cAllocated; +}; + + +/////////////////////////////////////////////////////////////////////////////// +// Dialog and control macros for indirect dialogs + +// for DLGTEMPLATE +#define BEGIN_DIALOG(x, y, width, height) \ + void DoInitTemplate() \ + { \ + bool bExTemplate = false; \ + short nX = x, nY = y, nWidth = width, nHeight = height; \ + LPCTSTR szCaption = NULL; \ + DWORD dwStyle = WS_POPUP | WS_BORDER | WS_SYSMENU; \ + DWORD dwExStyle = 0; \ + LPCTSTR szFontName = NULL; \ + WORD wFontSize = 0; \ + WORD wWeight = 0; \ + BYTE bItalic = 0; \ + BYTE bCharset = 0; \ + DWORD dwHelpID = 0; \ + ATL::_U_STRINGorID Menu = 0U; \ + ATL::_U_STRINGorID ClassName = 0U; + +// for DLGTEMPLATEEX +#define BEGIN_DIALOG_EX(x, y, width, height, helpID) \ + void DoInitTemplate() \ + { \ + bool bExTemplate = true; \ + short nX = x, nY = y, nWidth = width, nHeight = height; \ + LPCTSTR szCaption = NULL; \ + DWORD dwStyle = WS_POPUP | WS_BORDER | WS_SYSMENU; \ + DWORD dwExStyle = 0; \ + LPCTSTR szFontName = NULL; \ + WORD wFontSize = 0; \ + WORD wWeight = 0; \ + BYTE bItalic = 0; \ + BYTE bCharset = 0; \ + DWORD dwHelpID = helpID; \ + ATL::_U_STRINGorID Menu = 0U; \ + ATL::_U_STRINGorID ClassName = 0U; + +#define END_DIALOG() \ + m_Template.Create(bExTemplate, szCaption, nX, nY, nWidth, nHeight, dwStyle, dwExStyle, szFontName, wFontSize, wWeight, bItalic, bCharset, dwHelpID, ClassName, Menu); \ + }; + +#define DIALOG_CAPTION(caption) \ + szCaption = caption; +#define DIALOG_STYLE(style) \ + dwStyle = style; +#define DIALOG_EXSTYLE(exStyle) \ + dwExStyle = exStyle; +#define DIALOG_FONT(pointSize, typeFace) \ + wFontSize = pointSize; \ + szFontName = typeFace; +#define DIALOG_FONT_EX(pointsize, typeface, weight, italic, charset) \ + ATLASSERT(bExTemplate); \ + wFontSize = pointsize; \ + szFontName = typeface; \ + wWeight = weight; \ + bItalic = italic; \ + bCharset = charset; +#define DIALOG_MENU(menuName) \ + Menu = menuName; +#define DIALOG_CLASS(className) \ + ClassName = className; + +#define BEGIN_CONTROLS_MAP() \ + void DoInitControls() \ + { + +#define END_CONTROLS_MAP() \ + }; + + +#define CONTROL_LTEXT(text, id, x, y, width, height, style, exStyle) \ + m_Template.AddStdControl(WTL::CMemDlgTemplate::CTRL_STATIC, (WORD)id, x, y, width, height, style | SS_LEFT | WS_GROUP, exStyle, text, NULL, 0); +#define CONTROL_CTEXT(text, id, x, y, width, height, style, exStyle) \ + m_Template.AddStdControl(WTL::CMemDlgTemplate::CTRL_STATIC, (WORD)id, x, y, width, height, style | SS_CENTER | WS_GROUP, exStyle, text, NULL, 0); +#define CONTROL_RTEXT(text, id, x, y, width, height, style, exStyle) \ + m_Template.AddStdControl(WTL::CMemDlgTemplate::CTRL_STATIC, (WORD)id, x, y, width, height, style | SS_RIGHT | WS_GROUP, exStyle, text, NULL, 0); +#define CONTROL_PUSHBUTTON(text, id, x, y, width, height, style, exStyle) \ + m_Template.AddStdControl(WTL::CMemDlgTemplate::CTRL_BUTTON, (WORD)id, x, y, width, height, style | BS_PUSHBUTTON | WS_TABSTOP, exStyle, text, NULL, 0); +#define CONTROL_DEFPUSHBUTTON(text, id, x, y, width, height, style, exStyle) \ + m_Template.AddStdControl(WTL::CMemDlgTemplate::CTRL_BUTTON, (WORD)id, x, y, width, height, style | BS_DEFPUSHBUTTON | WS_TABSTOP, exStyle, text, NULL, 0); +#ifndef _WIN32_WCE +#define CONTROL_PUSHBOX(text, id, x, y, width, height, style, exStyle) \ + m_Template.AddStdControl(WTL::CMemDlgTemplate::CTRL_BUTTON, (WORD)id, x, y, width, height, style | BS_PUSHBOX | WS_TABSTOP, exStyle, text, NULL, 0); +#endif // !_WIN32_WCE +#define CONTROL_STATE3(text, id, x, y, width, height, style, exStyle) \ + m_Template.AddStdControl(WTL::CMemDlgTemplate::CTRL_BUTTON, (WORD)id, x, y, width, height, style | BS_3STATE | WS_TABSTOP, exStyle, text, NULL, 0); +#define CONTROL_AUTO3STATE(text, id, x, y, width, height, style, exStyle) \ + m_Template.AddStdControl(WTL::CMemDlgTemplate::CTRL_BUTTON, (WORD)id, x, y, width, height, style | BS_AUTO3STATE | WS_TABSTOP, exStyle, text, NULL, 0); +#define CONTROL_CHECKBOX(text, id, x, y, width, height, style, exStyle) \ + m_Template.AddStdControl(WTL::CMemDlgTemplate::CTRL_BUTTON, (WORD)id, x, y, width, height, style | BS_CHECKBOX | WS_TABSTOP, exStyle, text, NULL, 0); +#define CONTROL_AUTOCHECKBOX(text, id, x, y, width, height, style, exStyle) \ + m_Template.AddStdControl(WTL::CMemDlgTemplate::CTRL_BUTTON, (WORD)id, x, y, width, height, style | BS_AUTOCHECKBOX | WS_TABSTOP, exStyle, text, NULL, 0); +#define CONTROL_RADIOBUTTON(text, id, x, y, width, height, style, exStyle) \ + m_Template.AddStdControl(WTL::CMemDlgTemplate::CTRL_BUTTON, (WORD)id, x, y, width, height, style | BS_RADIOBUTTON | WS_TABSTOP, exStyle, text, NULL, 0); +#define CONTROL_AUTORADIOBUTTON(text, id, x, y, width, height, style, exStyle) \ + m_Template.AddStdControl(WTL::CMemDlgTemplate::CTRL_BUTTON, (WORD)id, x, y, width, height, style | BS_AUTORADIOBUTTON | WS_TABSTOP, exStyle, text, NULL, 0); +#define CONTROL_COMBOBOX(id, x, y, width, height, style, exStyle) \ + m_Template.AddStdControl(WTL::CMemDlgTemplate::CTRL_COMBOBOX, (WORD)id, x, y, width, height, style | CBS_DROPDOWN | WS_TABSTOP, exStyle, (LPCTSTR)NULL, NULL, 0); +#define CONTROL_EDITTEXT(id, x, y, width, height, style, exStyle) \ + m_Template.AddStdControl(WTL::CMemDlgTemplate::CTRL_EDIT, (WORD)id, x, y, width, height, style | ES_LEFT | WS_BORDER | WS_TABSTOP, exStyle, (LPCTSTR)NULL, NULL, 0); +#define CONTROL_GROUPBOX(text, id, x, y, width, height, style, exStyle) \ + m_Template.AddStdControl(WTL::CMemDlgTemplate::CTRL_BUTTON, (WORD)id, x, y, width, height, style | BS_GROUPBOX, exStyle, text, NULL, 0); +#define CONTROL_LISTBOX(id, x, y, width, height, style, exStyle) \ + m_Template.AddStdControl(WTL::CMemDlgTemplate::CTRL_LISTBOX, (WORD)id, x, y, width, height, style | LBS_NOTIFY | WS_BORDER, exStyle, (LPCTSTR)NULL, NULL, 0); +#define CONTROL_SCROLLBAR(id, x, y, width, height, style, exStyle) \ + m_Template.AddStdControl(WTL::CMemDlgTemplate::CTRL_SCROLLBAR, (WORD)id, x, y, width, height, style | SBS_HORZ, exStyle, (LPCTSTR)NULL, NULL, 0); +#define CONTROL_ICON(text, id, x, y, width, height, style, exStyle) \ + m_Template.AddStdControl(WTL::CMemDlgTemplate::CTRL_STATIC, (WORD)id, x, y, width, height, style | SS_ICON, exStyle, text, NULL, 0); +#define CONTROL_CONTROL(text, id, className, style, x, y, width, height, exStyle) \ + m_Template.AddControl(className, (WORD)id, x, y, width, height, style, exStyle, text, NULL, 0); + + +/////////////////////////////////////////////////////////////////////////////// +// CIndirectDialogImpl - dialogs with template in memory + +template > +class ATL_NO_VTABLE CIndirectDialogImpl : public TBase +{ +public: + enum { IDD = 0 }; // no dialog template resource + + TDlgTemplate m_Template; + + void CreateTemplate() + { + T* pT = static_cast(this); + pT->DoInitTemplate(); + pT->DoInitControls(); + } + + INT_PTR DoModal(HWND hWndParent = ::GetActiveWindow(), LPARAM dwInitParam = NULL) + { + T* pT = static_cast(this); + ATLASSERT(pT->m_hWnd == NULL); + + if (!m_Template.IsValid()) + CreateTemplate(); + +#if (_ATL_VER >= 0x0800) + // Allocate the thunk structure here, where we can fail gracefully. + BOOL result = m_thunk.Init(NULL, NULL); + if (result == FALSE) + { + SetLastError(ERROR_OUTOFMEMORY); + return -1; + } +#endif // (_ATL_VER >= 0x0800) + + ModuleHelper::AddCreateWndData(&m_thunk.cd, pT); + +#ifdef _DEBUG + m_bModal = true; +#endif // _DEBUG + + return ::DialogBoxIndirectParam(ModuleHelper::GetResourceInstance(), m_Template.GetTemplatePtr(), hWndParent, (DLGPROC)T::StartDialogProc, dwInitParam); + } + + HWND Create(HWND hWndParent, LPARAM dwInitParam = NULL) + { + T* pT = static_cast(this); + ATLASSERT(pT->m_hWnd == NULL); + + if (!m_Template.IsValid()) + CreateTemplate(); + +#if (_ATL_VER >= 0x0800) + // Allocate the thunk structure here, where we can fail gracefully. + BOOL result = m_thunk.Init(NULL, NULL); + if (result == FALSE) + { + SetLastError(ERROR_OUTOFMEMORY); + return NULL; + } +#endif // (_ATL_VER >= 0x0800) + + ModuleHelper::AddCreateWndData(&m_thunk.cd, pT); + +#ifdef _DEBUG + m_bModal = false; +#endif // _DEBUG + + HWND hWnd = ::CreateDialogIndirectParam(ModuleHelper::GetResourceInstance(), (LPCDLGTEMPLATE)m_Template.GetTemplatePtr(), hWndParent, (DLGPROC)T::StartDialogProc, dwInitParam); + ATLASSERT(m_hWnd == hWnd); + + return hWnd; + } + + // for CComControl + HWND Create(HWND hWndParent, RECT&, LPARAM dwInitParam = NULL) + { + return Create(hWndParent, dwInitParam); + } + + void DoInitTemplate() + { + ATLASSERT(FALSE); // MUST be defined in derived class + } + + void DoInitControls() + { + ATLASSERT(FALSE); // MUST be defined in derived class + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// CPropertySheetWindow - client side for a property sheet + +class CPropertySheetWindow : public ATL::CWindow +{ +public: +// Constructors + CPropertySheetWindow(HWND hWnd = NULL) : ATL::CWindow(hWnd) + { } + + CPropertySheetWindow& operator =(HWND hWnd) + { + m_hWnd = hWnd; + return *this; + } + +// Attributes + int GetPageCount() const + { + ATLASSERT(::IsWindow(m_hWnd)); + HWND hWndTabCtrl = GetTabControl(); + ATLASSERT(hWndTabCtrl != NULL); + return (int)::SendMessage(hWndTabCtrl, TCM_GETITEMCOUNT, 0, 0L); + } + + HWND GetActivePage() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (HWND)::SendMessage(m_hWnd, PSM_GETCURRENTPAGEHWND, 0, 0L); + } + + int GetActiveIndex() const + { + ATLASSERT(::IsWindow(m_hWnd)); + HWND hWndTabCtrl = GetTabControl(); + ATLASSERT(hWndTabCtrl != NULL); + return (int)::SendMessage(hWndTabCtrl, TCM_GETCURSEL, 0, 0L); + } + + BOOL SetActivePage(int nPageIndex) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, PSM_SETCURSEL, nPageIndex, 0L); + } + + BOOL SetActivePage(HPROPSHEETPAGE hPage) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(hPage != NULL); + return (BOOL)::SendMessage(m_hWnd, PSM_SETCURSEL, 0, (LPARAM)hPage); + } + + BOOL SetActivePageByID(int nPageID) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, PSM_SETCURSELID, 0, nPageID); + } + + void SetTitle(LPCTSTR lpszText, UINT nStyle = 0) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT((nStyle & ~PSH_PROPTITLE) == 0); // only PSH_PROPTITLE is valid + ATLASSERT(lpszText != NULL); + ::SendMessage(m_hWnd, PSM_SETTITLE, nStyle, (LPARAM)lpszText); + } + + HWND GetTabControl() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (HWND)::SendMessage(m_hWnd, PSM_GETTABCONTROL, 0, 0L); + } + + void SetFinishText(LPCTSTR lpszText) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, PSM_SETFINISHTEXT, 0, (LPARAM)lpszText); + } + + void SetWizardButtons(DWORD dwFlags) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::PostMessage(m_hWnd, PSM_SETWIZBUTTONS, 0, dwFlags); + } + +// Operations + BOOL AddPage(HPROPSHEETPAGE hPage) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(hPage != NULL); + return (BOOL)::SendMessage(m_hWnd, PSM_ADDPAGE, 0, (LPARAM)hPage); + } + + BOOL AddPage(LPCPROPSHEETPAGE pPage) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(pPage != NULL); + HPROPSHEETPAGE hPage = ::CreatePropertySheetPage(pPage); + if(hPage == NULL) + return FALSE; + return (BOOL)::SendMessage(m_hWnd, PSM_ADDPAGE, 0, (LPARAM)hPage); + } + +#ifndef _WIN32_WCE + BOOL InsertPage(int nNewPageIndex, HPROPSHEETPAGE hPage) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(hPage != NULL); + return (BOOL)::SendMessage(m_hWnd, PSM_INSERTPAGE, nNewPageIndex, (LPARAM)hPage); + } + + BOOL InsertPage(int nNewPageIndex, LPCPROPSHEETPAGE pPage) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(pPage != NULL); + HPROPSHEETPAGE hPage = ::CreatePropertySheetPage(pPage); + if(hPage == NULL) + return FALSE; + return (BOOL)::SendMessage(m_hWnd, PSM_INSERTPAGE, nNewPageIndex, (LPARAM)hPage); + } + + BOOL InsertPage(HPROPSHEETPAGE hPageInsertAfter, HPROPSHEETPAGE hPage) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(hPage != NULL); + return (BOOL)::SendMessage(m_hWnd, PSM_INSERTPAGE, (WPARAM)hPageInsertAfter, (LPARAM)hPage); + } + + BOOL InsertPage(HPROPSHEETPAGE hPageInsertAfter, LPCPROPSHEETPAGE pPage) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(pPage != NULL); + HPROPSHEETPAGE hPage = ::CreatePropertySheetPage(pPage); + if(hPage == NULL) + return FALSE; + return (BOOL)::SendMessage(m_hWnd, PSM_INSERTPAGE, (WPARAM)hPageInsertAfter, (LPARAM)hPage); + } +#endif // !_WIN32_WCE + + void RemovePage(int nPageIndex) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, PSM_REMOVEPAGE, nPageIndex, 0L); + } + + void RemovePage(HPROPSHEETPAGE hPage) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(hPage != NULL); + ::SendMessage(m_hWnd, PSM_REMOVEPAGE, 0, (LPARAM)hPage); + } + + BOOL PressButton(int nButton) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, PSM_PRESSBUTTON, nButton, 0L); + } + + BOOL Apply() + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, PSM_APPLY, 0, 0L); + } + + void CancelToClose() + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, PSM_CANCELTOCLOSE, 0, 0L); + } + + void SetModified(HWND hWndPage, BOOL bChanged = TRUE) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(::IsWindow(hWndPage)); + UINT uMsg = bChanged ? PSM_CHANGED : PSM_UNCHANGED; + ::SendMessage(m_hWnd, uMsg, (WPARAM)hWndPage, 0L); + } + + LRESULT QuerySiblings(WPARAM wParam, LPARAM lParam) + { + ATLASSERT(::IsWindow(m_hWnd)); + return ::SendMessage(m_hWnd, PSM_QUERYSIBLINGS, wParam, lParam); + } + + void RebootSystem() + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, PSM_REBOOTSYSTEM, 0, 0L); + } + + void RestartWindows() + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, PSM_RESTARTWINDOWS, 0, 0L); + } + + BOOL IsDialogMessage(LPMSG lpMsg) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, PSM_ISDIALOGMESSAGE, 0, (LPARAM)lpMsg); + } + +#if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) + int HwndToIndex(HWND hWnd) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, PSM_HWNDTOINDEX, (WPARAM)hWnd, 0L); + } + + HWND IndexToHwnd(int nIndex) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (HWND)::SendMessage(m_hWnd, PSM_INDEXTOHWND, nIndex, 0L); + } + + int PageToIndex(HPROPSHEETPAGE hPage) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, PSM_PAGETOINDEX, 0, (LPARAM)hPage); + } + + HPROPSHEETPAGE IndexToPage(int nIndex) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (HPROPSHEETPAGE)::SendMessage(m_hWnd, PSM_INDEXTOPAGE, nIndex, 0L); + } + + int IdToIndex(int nID) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, PSM_IDTOINDEX, 0, nID); + } + + int IndexToId(int nIndex) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, PSM_INDEXTOID, nIndex, 0L); + } + + int GetResult() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, PSM_GETRESULT, 0, 0L); + } + + BOOL RecalcPageSizes() + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, PSM_RECALCPAGESIZES, 0, 0L); + } + + void SetHeaderTitle(int nIndex, LPCTSTR lpstrHeaderTitle) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, PSM_SETHEADERTITLE, nIndex, (LPARAM)lpstrHeaderTitle); + } + + void SetHeaderSubTitle(int nIndex, LPCTSTR lpstrHeaderSubTitle) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, PSM_SETHEADERSUBTITLE, nIndex, (LPARAM)lpstrHeaderSubTitle); + } +#endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) + +// Implementation - override to prevent usage + HWND Create(LPCTSTR, HWND, ATL::_U_RECT = NULL, LPCTSTR = NULL, DWORD = 0, DWORD = 0, ATL::_U_MENUorID = 0U, LPVOID = NULL) + { + ATLASSERT(FALSE); + return NULL; + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// CPropertySheetImpl - implements a property sheet + +template +class ATL_NO_VTABLE CPropertySheetImpl : public ATL::CWindowImplBaseT< TBase > +{ +public: + PROPSHEETHEADER m_psh; + ATL::CSimpleArray m_arrPages; + +#if defined(_AYGSHELL_H_) || defined(__AYGSHELL_H__) // PPC specific + #ifndef PROPSHEET_LINK_SIZE + #define PROPSHEET_LINK_SIZE 128 + #endif // PROPSHEET_LINK_SIZE + TCHAR m_szLink[PROPSHEET_LINK_SIZE]; + static LPCTSTR m_pszTitle; + static LPCTSTR m_pszLink; +#endif // defined(_AYGSHELL_H_) || defined(__AYGSHELL_H__) + +// Construction/Destruction + CPropertySheetImpl(ATL::_U_STRINGorID title = (LPCTSTR)NULL, UINT uStartPage = 0, HWND hWndParent = NULL) + { + memset(&m_psh, 0, sizeof(PROPSHEETHEADER)); + m_psh.dwSize = sizeof(PROPSHEETHEADER); + m_psh.dwFlags = PSH_USECALLBACK; + m_psh.hInstance = ModuleHelper::GetResourceInstance(); + m_psh.phpage = NULL; // will be set later + m_psh.nPages = 0; // will be set later + m_psh.pszCaption = title.m_lpstr; + m_psh.nStartPage = uStartPage; + m_psh.hwndParent = hWndParent; // if NULL, will be set in DoModal/Create + m_psh.pfnCallback = T::PropSheetCallback; + +#if defined(_AYGSHELL_H_) || defined(__AYGSHELL_H__) // PPC specific + m_psh.dwFlags |= PSH_MAXIMIZE; + m_szLink[0] = 0; +#endif // defined(_AYGSHELL_H_) || defined(__AYGSHELL_H__) + } + + ~CPropertySheetImpl() + { + if(m_arrPages.GetSize() > 0) // sheet never created, destroy all pages + { + for(int i = 0; i < m_arrPages.GetSize(); i++) + ::DestroyPropertySheetPage((HPROPSHEETPAGE)m_arrPages[i]); + } + } + +// Callback function and overrideables + static int CALLBACK PropSheetCallback(HWND hWnd, UINT uMsg, LPARAM lParam) + { + lParam; // avoid level 4 warning + int nRet = 0; + + if(uMsg == PSCB_INITIALIZED) + { + ATLASSERT(hWnd != NULL); + T* pT = (T*)ModuleHelper::ExtractCreateWndData(); + // subclass the sheet window + pT->SubclassWindow(hWnd); + // remove page handles array + pT->_CleanUpPages(); + +#if defined(_AYGSHELL_H_) || defined(__AYGSHELL_H__) // PPC specific + m_pszTitle = pT->m_psh.pszCaption; + if(*pT->m_szLink != 0) + m_pszLink = pT->m_szLink; +#endif // defined(_AYGSHELL_H_) || defined(__AYGSHELL_H__) // PPC specific + + pT->OnSheetInitialized(); + } +#if defined(_AYGSHELL_H_) || defined(__AYGSHELL_H__) // PPC specific uMsg + else + { + switch(uMsg) + { + case PSCB_GETVERSION : + nRet = COMCTL32_VERSION; + break; + case PSCB_GETTITLE : + if(m_pszTitle != NULL) + { + lstrcpy((LPTSTR)lParam, m_pszTitle); + m_pszTitle = NULL; + } + break; + case PSCB_GETLINKTEXT: + if(m_pszLink != NULL) + { + lstrcpy((LPTSTR)lParam, m_pszLink); + m_pszLink = NULL; + } + break; + default: + break; + } + } +#endif // defined(_AYGSHELL_H_) || defined(__AYGSHELL_H__) + + return nRet; + } + + void OnSheetInitialized() + { + } + +// Create method + HWND Create(HWND hWndParent = NULL) + { + ATLASSERT(m_hWnd == NULL); + + m_psh.dwFlags |= PSH_MODELESS; + if(m_psh.hwndParent == NULL) + m_psh.hwndParent = hWndParent; + m_psh.phpage = (HPROPSHEETPAGE*)m_arrPages.GetData(); + m_psh.nPages = m_arrPages.GetSize(); + + T* pT = static_cast(this); + ModuleHelper::AddCreateWndData(&pT->m_thunk.cd, pT); + + HWND hWnd = (HWND)::PropertySheet(&m_psh); + _CleanUpPages(); // ensure clean-up, required if call failed + + ATLASSERT(m_hWnd == hWnd); + + return hWnd; + } + + INT_PTR DoModal(HWND hWndParent = ::GetActiveWindow()) + { + ATLASSERT(m_hWnd == NULL); + + m_psh.dwFlags &= ~PSH_MODELESS; + if(m_psh.hwndParent == NULL) + m_psh.hwndParent = hWndParent; + m_psh.phpage = (HPROPSHEETPAGE*)m_arrPages.GetData(); + m_psh.nPages = m_arrPages.GetSize(); + + T* pT = static_cast(this); + ModuleHelper::AddCreateWndData(&pT->m_thunk.cd, pT); + + INT_PTR nRet = ::PropertySheet(&m_psh); + _CleanUpPages(); // ensure clean-up, required if call failed + + return nRet; + } + + // implementation helper - clean up pages array + void _CleanUpPages() + { + m_psh.nPages = 0; + m_psh.phpage = NULL; + m_arrPages.RemoveAll(); + } + +// Attributes (extended overrides of client class methods) +// These now can be called before the sheet is created +// Note: Calling these after the sheet is created gives unpredictable results + int GetPageCount() const + { + if(m_hWnd == NULL) // not created yet + return m_arrPages.GetSize(); + return TBase::GetPageCount(); + } + + int GetActiveIndex() const + { + if(m_hWnd == NULL) // not created yet + return m_psh.nStartPage; + return TBase::GetActiveIndex(); + } + + HPROPSHEETPAGE GetPage(int nPageIndex) const + { + ATLASSERT(m_hWnd == NULL); // can't do this after it's created + return (HPROPSHEETPAGE)m_arrPages[nPageIndex]; + } + + int GetPageIndex(HPROPSHEETPAGE hPage) const + { + ATLASSERT(m_hWnd == NULL); // can't do this after it's created + return m_arrPages.Find((HPROPSHEETPAGE&)hPage); + } + + BOOL SetActivePage(int nPageIndex) + { + if(m_hWnd == NULL) // not created yet + { + ATLASSERT(nPageIndex >= 0 && nPageIndex < m_arrPages.GetSize()); + m_psh.nStartPage = nPageIndex; + return TRUE; + } + return TBase::SetActivePage(nPageIndex); + } + + BOOL SetActivePage(HPROPSHEETPAGE hPage) + { + ATLASSERT(hPage != NULL); + if (m_hWnd == NULL) // not created yet + { + int nPageIndex = GetPageIndex(hPage); + if(nPageIndex == -1) + return FALSE; + + return SetActivePage(nPageIndex); + } + return TBase::SetActivePage(hPage); + + } + + void SetTitle(LPCTSTR lpszText, UINT nStyle = 0) + { + ATLASSERT((nStyle & ~PSH_PROPTITLE) == 0); // only PSH_PROPTITLE is valid + ATLASSERT(lpszText != NULL); + + if(m_hWnd == NULL) + { + // set internal state + m_psh.pszCaption = lpszText; // must exist until sheet is created + m_psh.dwFlags &= ~PSH_PROPTITLE; + m_psh.dwFlags |= nStyle; + } + else + { + // set external state + TBase::SetTitle(lpszText, nStyle); + } + } + +#if defined(_AYGSHELL_H_) || defined(__AYGSHELL_H__) // PPC specific Link field + void SetLinkText(LPCTSTR lpszText) + { + ATLASSERT(lpszText != NULL); + ATLASSERT(lstrlen(lpszText) < PROPSHEET_LINK_SIZE); + lstrcpy(m_szLink, lpszText); + } +#endif // defined(_AYGSHELL_H_) || defined(__AYGSHELL_H__) + + void SetWizardMode() + { + m_psh.dwFlags |= PSH_WIZARD; + } + + void EnableHelp() + { + m_psh.dwFlags |= PSH_HASHELP; + } + +// Operations + BOOL AddPage(HPROPSHEETPAGE hPage) + { + ATLASSERT(hPage != NULL); + BOOL bRet = FALSE; + if(m_hWnd != NULL) + bRet = TBase::AddPage(hPage); + else // sheet not created yet, use internal data + bRet = m_arrPages.Add((HPROPSHEETPAGE&)hPage); + return bRet; + } + + BOOL AddPage(LPCPROPSHEETPAGE pPage) + { + ATLASSERT(pPage != NULL); + HPROPSHEETPAGE hPage = ::CreatePropertySheetPage(pPage); + if(hPage == NULL) + return FALSE; + BOOL bRet = AddPage(hPage); + if(!bRet) + ::DestroyPropertySheetPage(hPage); + return bRet; + } + + BOOL RemovePage(HPROPSHEETPAGE hPage) + { + ATLASSERT(hPage != NULL); + if (m_hWnd == NULL) // not created yet + { + int nPage = GetPageIndex(hPage); + if(nPage == -1) + return FALSE; + return RemovePage(nPage); + } + TBase::RemovePage(hPage); + return TRUE; + + } + + BOOL RemovePage(int nPageIndex) + { + BOOL bRet = TRUE; + if(m_hWnd != NULL) + TBase::RemovePage(nPageIndex); + else // sheet not created yet, use internal data + bRet = m_arrPages.RemoveAt(nPageIndex); + return bRet; + } + +#if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) + void SetHeader(LPCTSTR szbmHeader) + { + ATLASSERT(m_hWnd == NULL); // can't do this after it's created + + m_psh.dwFlags &= ~PSH_WIZARD; + m_psh.dwFlags |= (PSH_HEADER | PSH_WIZARD97); + m_psh.pszbmHeader = szbmHeader; + } + + void SetHeader(HBITMAP hbmHeader) + { + ATLASSERT(m_hWnd == NULL); // can't do this after it's created + + m_psh.dwFlags &= ~PSH_WIZARD; + m_psh.dwFlags |= (PSH_HEADER | PSH_USEHBMHEADER | PSH_WIZARD97); + m_psh.hbmHeader = hbmHeader; + } + + void SetWatermark(LPCTSTR szbmWatermark, HPALETTE hplWatermark = NULL) + { + ATLASSERT(m_hWnd == NULL); // can't do this after it's created + + m_psh.dwFlags &= ~PSH_WIZARD; + m_psh.dwFlags |= PSH_WATERMARK | PSH_WIZARD97; + m_psh.pszbmWatermark = szbmWatermark; + + if (hplWatermark != NULL) + { + m_psh.dwFlags |= PSH_USEHPLWATERMARK; + m_psh.hplWatermark = hplWatermark; + } + } + + void SetWatermark(HBITMAP hbmWatermark, HPALETTE hplWatermark = NULL) + { + ATLASSERT(m_hWnd == NULL); // can't do this after it's created + + m_psh.dwFlags &= ~PSH_WIZARD; + m_psh.dwFlags |= (PSH_WATERMARK | PSH_USEHBMWATERMARK | PSH_WIZARD97); + m_psh.hbmWatermark = hbmWatermark; + + if (hplWatermark != NULL) + { + m_psh.dwFlags |= PSH_USEHPLWATERMARK; + m_psh.hplWatermark = hplWatermark; + } + } + + void StretchWatermark(bool bStretchWatermark) + { + ATLASSERT(m_hWnd == NULL); // can't do this after it's created + if (bStretchWatermark) + m_psh.dwFlags |= PSH_STRETCHWATERMARK; + else + m_psh.dwFlags &= ~PSH_STRETCHWATERMARK; + } +#endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) + +// Message map and handlers + BEGIN_MSG_MAP(CPropertySheetImpl) + MESSAGE_HANDLER(WM_COMMAND, OnCommand) + MESSAGE_HANDLER(WM_SYSCOMMAND, OnSysCommand) + END_MSG_MAP() + + LRESULT OnCommand(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) + { + LRESULT lRet = DefWindowProc(uMsg, wParam, lParam); + if(HIWORD(wParam) == BN_CLICKED && (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) && + ((m_psh.dwFlags & PSH_MODELESS) != 0) && (GetActivePage() == NULL)) + DestroyWindow(); + return lRet; + } + + LRESULT OnSysCommand(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) + { + if(((m_psh.dwFlags & PSH_MODELESS) == PSH_MODELESS) && ((wParam & 0xFFF0) == SC_CLOSE)) + SendMessage(WM_CLOSE); + else + bHandled = FALSE; + return 0; + } +}; + +#if defined(_AYGSHELL_H_) || defined(__AYGSHELL_H__) // PPC static pointers +template < class T, class TBase > +LPCWSTR CPropertySheetImpl::m_pszTitle = NULL; +template < class T, class TBase> +LPCWSTR CPropertySheetImpl::m_pszLink = NULL; +#endif // defined(_AYGSHELL_H_) || defined(__AYGSHELL_H__) + +// for non-customized sheets +class CPropertySheet : public CPropertySheetImpl +{ +public: + CPropertySheet(ATL::_U_STRINGorID title = (LPCTSTR)NULL, UINT uStartPage = 0, HWND hWndParent = NULL) + : CPropertySheetImpl(title, uStartPage, hWndParent) + { } +}; + + +/////////////////////////////////////////////////////////////////////////////// +// CPropertyPageWindow - client side for a property page + +class CPropertyPageWindow : public ATL::CWindow +{ +public: +// Constructors + CPropertyPageWindow(HWND hWnd = NULL) : ATL::CWindow(hWnd) + { } + + CPropertyPageWindow& operator =(HWND hWnd) + { + m_hWnd = hWnd; + return *this; + } + +// Attributes + CPropertySheetWindow GetPropertySheet() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return CPropertySheetWindow(GetParent()); + } + +// Operations + BOOL Apply() + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(GetParent() != NULL); + return GetPropertySheet().Apply(); + } + + void CancelToClose() + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(GetParent() != NULL); + GetPropertySheet().CancelToClose(); + } + + void SetModified(BOOL bChanged = TRUE) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(GetParent() != NULL); + GetPropertySheet().SetModified(m_hWnd, bChanged); + } + + LRESULT QuerySiblings(WPARAM wParam, LPARAM lParam) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(GetParent() != NULL); + return GetPropertySheet().QuerySiblings(wParam, lParam); + } + + void RebootSystem() + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(GetParent() != NULL); + GetPropertySheet().RebootSystem(); + } + + void RestartWindows() + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(GetParent() != NULL); + GetPropertySheet().RestartWindows(); + } + + void SetWizardButtons(DWORD dwFlags) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(GetParent() != NULL); + GetPropertySheet().SetWizardButtons(dwFlags); + } + +// Implementation - overrides to prevent usage + HWND Create(LPCTSTR, HWND, ATL::_U_RECT = NULL, LPCTSTR = NULL, DWORD = 0, DWORD = 0, ATL::_U_MENUorID = 0U, LPVOID = NULL) + { + ATLASSERT(FALSE); + return NULL; + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// CPropertyPageImpl - implements a property page + +template +class ATL_NO_VTABLE CPropertyPageImpl : public ATL::CDialogImplBaseT< TBase > +{ +public: + PROPSHEETPAGE m_psp; + + operator PROPSHEETPAGE*() { return &m_psp; } + +// Construction + CPropertyPageImpl(ATL::_U_STRINGorID title = (LPCTSTR)NULL) + { + // initialize PROPSHEETPAGE struct + memset(&m_psp, 0, sizeof(PROPSHEETPAGE)); + m_psp.dwSize = sizeof(PROPSHEETPAGE); + m_psp.dwFlags = PSP_USECALLBACK; + m_psp.hInstance = ModuleHelper::GetResourceInstance(); + T* pT = static_cast(this); + m_psp.pszTemplate = MAKEINTRESOURCE(pT->IDD); + m_psp.pfnDlgProc = (DLGPROC)T::StartDialogProc; + m_psp.pfnCallback = T::PropPageCallback; + m_psp.lParam = (LPARAM)pT; + + if(title.m_lpstr != NULL) + SetTitle(title); + } + +// Callback function and overrideables + static UINT CALLBACK PropPageCallback(HWND hWnd, UINT uMsg, LPPROPSHEETPAGE ppsp) + { + hWnd; // avoid level 4 warning + ATLASSERT(hWnd == NULL); + T* pT = (T*)ppsp->lParam; + UINT uRet = 0; + + switch(uMsg) + { + case PSPCB_CREATE: + { + ATL::CDialogImplBaseT< TBase >* pPage = (ATL::CDialogImplBaseT< TBase >*)pT; + ModuleHelper::AddCreateWndData(&pPage->m_thunk.cd, pPage); + uRet = pT->OnPageCreate() ? 1 : 0; + } + break; +#if (_WIN32_IE >= 0x0500) + case PSPCB_ADDREF: + pT->OnPageAddRef(); + break; +#endif // (_WIN32_IE >= 0x0500) + case PSPCB_RELEASE: + pT->OnPageRelease(); + break; + default: + break; + } + + return uRet; + } + + bool OnPageCreate() + { + return true; // true - allow page to be created, false - prevent creation + } + +#if (_WIN32_IE >= 0x0500) + void OnPageAddRef() + { + } +#endif // (_WIN32_IE >= 0x0500) + + void OnPageRelease() + { + } + +// Create method + HPROPSHEETPAGE Create() + { + return ::CreatePropertySheetPage(&m_psp); + } + +// Attributes + void SetTitle(ATL::_U_STRINGorID title) + { + m_psp.pszTitle = title.m_lpstr; + m_psp.dwFlags |= PSP_USETITLE; + } + +#if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) + void SetHeaderTitle(LPCTSTR lpstrHeaderTitle) + { + ATLASSERT(m_hWnd == NULL); // can't do this after it's created + m_psp.dwFlags |= PSP_USEHEADERTITLE; + m_psp.pszHeaderTitle = lpstrHeaderTitle; + } + + void SetHeaderSubTitle(LPCTSTR lpstrHeaderSubTitle) + { + ATLASSERT(m_hWnd == NULL); // can't do this after it's created + m_psp.dwFlags |= PSP_USEHEADERSUBTITLE; + m_psp.pszHeaderSubTitle = lpstrHeaderSubTitle; + } +#endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) + +// Operations + void EnableHelp() + { + m_psp.dwFlags |= PSP_HASHELP; + } + +// Message map and handlers + BEGIN_MSG_MAP(CPropertyPageImpl) + MESSAGE_HANDLER(WM_NOTIFY, OnNotify) + END_MSG_MAP() + + // NOTE: Define _WTL_NEW_PAGE_NOTIFY_HANDLERS to use new notification + // handlers that return direct values without any restrictions + LRESULT OnNotify(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled) + { +#ifndef _WIN32_WCE + // This notification is sometimes received on Windows CE after the window is already destroyed + ATLASSERT(::IsWindow(m_hWnd)); +#endif + NMHDR* pNMHDR = (NMHDR*)lParam; + + // don't handle messages not from the page/sheet itself + if(pNMHDR->hwndFrom != m_hWnd && pNMHDR->hwndFrom != ::GetParent(m_hWnd)) + { + bHandled = FALSE; + return 1; + } +#ifdef _WIN32_WCE + ATLASSERT(::IsWindow(m_hWnd)); +#endif + + T* pT = static_cast(this); + LRESULT lResult = 0; + switch(pNMHDR->code) + { +#ifdef _WTL_NEW_PAGE_NOTIFY_HANDLERS + case PSN_SETACTIVE: + lResult = pT->OnSetActive(); + break; + case PSN_KILLACTIVE: + lResult = pT->OnKillActive(); + break; + case PSN_APPLY: + lResult = pT->OnApply(); + break; + case PSN_RESET: + pT->OnReset(); + break; + case PSN_QUERYCANCEL: + lResult = pT->OnQueryCancel(); + break; + case PSN_WIZNEXT: + lResult = pT->OnWizardNext(); + break; + case PSN_WIZBACK: + lResult = pT->OnWizardBack(); + break; + case PSN_WIZFINISH: + lResult = pT->OnWizardFinish(); + break; + case PSN_HELP: + pT->OnHelp(); + break; +#ifndef _WIN32_WCE +#if (_WIN32_IE >= 0x0400) + case PSN_GETOBJECT: + if(!pT->OnGetObject((LPNMOBJECTNOTIFY)lParam)) + bHandled = FALSE; + break; +#endif // (_WIN32_IE >= 0x0400) +#if (_WIN32_IE >= 0x0500) + case PSN_TRANSLATEACCELERATOR: + { + LPPSHNOTIFY lpPSHNotify = (LPPSHNOTIFY)lParam; + lResult = pT->OnTranslateAccelerator((LPMSG)lpPSHNotify->lParam); + } + break; + case PSN_QUERYINITIALFOCUS: + { + LPPSHNOTIFY lpPSHNotify = (LPPSHNOTIFY)lParam; + lResult = (LRESULT)pT->OnQueryInitialFocus((HWND)lpPSHNotify->lParam); + } + break; +#endif // (_WIN32_IE >= 0x0500) +#endif // !_WIN32_WCE + +#else // !_WTL_NEW_PAGE_NOTIFY_HANDLERS + case PSN_SETACTIVE: + lResult = pT->OnSetActive() ? 0 : -1; + break; + case PSN_KILLACTIVE: + lResult = !pT->OnKillActive(); + break; + case PSN_APPLY: + lResult = pT->OnApply() ? PSNRET_NOERROR : PSNRET_INVALID_NOCHANGEPAGE; + break; + case PSN_RESET: + pT->OnReset(); + break; + case PSN_QUERYCANCEL: + lResult = !pT->OnQueryCancel(); + break; + case PSN_WIZNEXT: + lResult = pT->OnWizardNext(); + break; + case PSN_WIZBACK: + lResult = pT->OnWizardBack(); + break; + case PSN_WIZFINISH: + lResult = !pT->OnWizardFinish(); + break; + case PSN_HELP: + pT->OnHelp(); + break; +#ifndef _WIN32_WCE +#if (_WIN32_IE >= 0x0400) + case PSN_GETOBJECT: + if(!pT->OnGetObject((LPNMOBJECTNOTIFY)lParam)) + bHandled = FALSE; + break; +#endif // (_WIN32_IE >= 0x0400) +#if (_WIN32_IE >= 0x0500) + case PSN_TRANSLATEACCELERATOR: + { + LPPSHNOTIFY lpPSHNotify = (LPPSHNOTIFY)lParam; + lResult = pT->OnTranslateAccelerator((LPMSG)lpPSHNotify->lParam) ? PSNRET_MESSAGEHANDLED : PSNRET_NOERROR; + } + break; + case PSN_QUERYINITIALFOCUS: + { + LPPSHNOTIFY lpPSHNotify = (LPPSHNOTIFY)lParam; + lResult = (LRESULT)pT->OnQueryInitialFocus((HWND)lpPSHNotify->lParam); + } + break; +#endif // (_WIN32_IE >= 0x0500) +#endif // !_WIN32_WCE + +#endif // !_WTL_NEW_PAGE_NOTIFY_HANDLERS + default: + bHandled = FALSE; // not handled + } + + return lResult; + } + +// Overridables + // NOTE: Define _WTL_NEW_PAGE_NOTIFY_HANDLERS to use new notification + // handlers that return direct values without any restrictions +#ifdef _WTL_NEW_PAGE_NOTIFY_HANDLERS + int OnSetActive() + { + // 0 = allow activate + // -1 = go back that was active + // page ID = jump to page + return 0; + } + + BOOL OnKillActive() + { + // FALSE = allow deactivate + // TRUE = prevent deactivation + return FALSE; + } + + int OnApply() + { + // PSNRET_NOERROR = apply OK + // PSNRET_INVALID = apply not OK, return to this page + // PSNRET_INVALID_NOCHANGEPAGE = apply not OK, don't change focus + return PSNRET_NOERROR; + } + + void OnReset() + { + } + + BOOL OnQueryCancel() + { + // FALSE = allow cancel + // TRUE = prevent cancel + return FALSE; + } + + int OnWizardBack() + { + // 0 = goto previous page + // -1 = prevent page change + // >0 = jump to page by dlg ID + return 0; + } + + int OnWizardNext() + { + // 0 = goto next page + // -1 = prevent page change + // >0 = jump to page by dlg ID + return 0; + } + + INT_PTR OnWizardFinish() + { + // FALSE = allow finish + // TRUE = prevent finish + // HWND = prevent finish and set focus to HWND (CommCtrl 5.80 only) + return FALSE; + } + + void OnHelp() + { + } + +#ifndef _WIN32_WCE +#if (_WIN32_IE >= 0x0400) + BOOL OnGetObject(LPNMOBJECTNOTIFY /*lpObjectNotify*/) + { + return FALSE; // not processed + } +#endif // (_WIN32_IE >= 0x0400) + +#if (_WIN32_IE >= 0x0500) + int OnTranslateAccelerator(LPMSG /*lpMsg*/) + { + // PSNRET_NOERROR - message not handled + // PSNRET_MESSAGEHANDLED - message handled + return PSNRET_NOERROR; + } + + HWND OnQueryInitialFocus(HWND /*hWndFocus*/) + { + // NULL = set focus to default control + // HWND = set focus to HWND + return NULL; + } +#endif // (_WIN32_IE >= 0x0500) +#endif // !_WIN32_WCE + +#else // !_WTL_NEW_PAGE_NOTIFY_HANDLERS + BOOL OnSetActive() + { + return TRUE; + } + + BOOL OnKillActive() + { + return TRUE; + } + + BOOL OnApply() + { + return TRUE; + } + + void OnReset() + { + } + + BOOL OnQueryCancel() + { + return TRUE; // ok to cancel + } + + int OnWizardBack() + { + // 0 = goto previous page + // -1 = prevent page change + // >0 = jump to page by dlg ID + return 0; + } + + int OnWizardNext() + { + // 0 = goto next page + // -1 = prevent page change + // >0 = jump to page by dlg ID + return 0; + } + + BOOL OnWizardFinish() + { + return TRUE; + } + + void OnHelp() + { + } + +#ifndef _WIN32_WCE +#if (_WIN32_IE >= 0x0400) + BOOL OnGetObject(LPNMOBJECTNOTIFY /*lpObjectNotify*/) + { + return FALSE; // not processed + } +#endif // (_WIN32_IE >= 0x0400) + +#if (_WIN32_IE >= 0x0500) + BOOL OnTranslateAccelerator(LPMSG /*lpMsg*/) + { + return FALSE; // not translated + } + + HWND OnQueryInitialFocus(HWND /*hWndFocus*/) + { + return NULL; // default + } +#endif // (_WIN32_IE >= 0x0500) +#endif // !_WIN32_WCE + +#endif // !_WTL_NEW_PAGE_NOTIFY_HANDLERS +}; + +// for non-customized pages +template +class CPropertyPage : public CPropertyPageImpl > +{ +public: + enum { IDD = t_wDlgTemplateID }; + + CPropertyPage(ATL::_U_STRINGorID title = (LPCTSTR)NULL) : CPropertyPageImpl(title) + { } + + DECLARE_EMPTY_MSG_MAP() +}; + +/////////////////////////////////////////////////////////////////////////////// +// CAxPropertyPageImpl - property page that hosts ActiveX controls + +#ifndef _ATL_NO_HOSTING + +// Note: You must #include to use these classes + +template +class ATL_NO_VTABLE CAxPropertyPageImpl : public CPropertyPageImpl< T, TBase > +{ +public: +// Data members + HGLOBAL m_hInitData; + HGLOBAL m_hDlgRes; + HGLOBAL m_hDlgResSplit; + +// Constructor/destructor + CAxPropertyPageImpl(ATL::_U_STRINGorID title = (LPCTSTR)NULL) : + CPropertyPageImpl< T, TBase >(title), + m_hInitData(NULL), m_hDlgRes(NULL), m_hDlgResSplit(NULL) + { + T* pT = static_cast(this); + pT; // avoid level 4 warning + + // initialize ActiveX hosting and modify dialog template + ATL::AtlAxWinInit(); + + HINSTANCE hInstance = ModuleHelper::GetResourceInstance(); + LPCTSTR lpTemplateName = MAKEINTRESOURCE(pT->IDD); + HRSRC hDlg = ::FindResource(hInstance, lpTemplateName, (LPTSTR)RT_DIALOG); + if(hDlg != NULL) + { + HRSRC hDlgInit = ::FindResource(hInstance, lpTemplateName, (LPTSTR)_ATL_RT_DLGINIT); + + BYTE* pInitData = NULL; + if(hDlgInit != NULL) + { + m_hInitData = ::LoadResource(hInstance, hDlgInit); + pInitData = (BYTE*)::LockResource(m_hInitData); + } + + m_hDlgRes = ::LoadResource(hInstance, hDlg); + DLGTEMPLATE* pDlg = (DLGTEMPLATE*)::LockResource(m_hDlgRes); + LPCDLGTEMPLATE lpDialogTemplate = ATL::_DialogSplitHelper::SplitDialogTemplate(pDlg, pInitData); + if(lpDialogTemplate != pDlg) + m_hDlgResSplit = GlobalHandle(lpDialogTemplate); + + // set up property page to use in-memory dialog template + if(lpDialogTemplate != NULL) + { + m_psp.dwFlags |= PSP_DLGINDIRECT; + m_psp.pResource = lpDialogTemplate; + } + else + { + ATLASSERT(FALSE && _T("CAxPropertyPageImpl - ActiveX initializtion failed!")); + } + } + else + { + ATLASSERT(FALSE && _T("CAxPropertyPageImpl - Cannot find dialog template!")); + } + } + + ~CAxPropertyPageImpl() + { + if(m_hInitData != NULL) + { + UnlockResource(m_hInitData); + FreeResource(m_hInitData); + } + if(m_hDlgRes != NULL) + { + UnlockResource(m_hDlgRes); + FreeResource(m_hDlgRes); + } + if(m_hDlgResSplit != NULL) + { + ::GlobalFree(m_hDlgResSplit); + } + } + +// Methods + // call this one to handle keyboard message for ActiveX controls + BOOL PreTranslateMessage(LPMSG pMsg) + { + if ((pMsg->message < WM_KEYFIRST || pMsg->message > WM_KEYLAST) && + (pMsg->message < WM_MOUSEFIRST || pMsg->message > WM_MOUSELAST)) + return FALSE; + // find a direct child of the dialog from the window that has focus + HWND hWndCtl = ::GetFocus(); + if (IsChild(hWndCtl) && ::GetParent(hWndCtl) != m_hWnd) + { + do + { + hWndCtl = ::GetParent(hWndCtl); + } + while (::GetParent(hWndCtl) != m_hWnd); + } + // give controls a chance to translate this message + return (BOOL)::SendMessage(hWndCtl, WM_FORWARDMSG, 0, (LPARAM)pMsg); + } + +// Overridables +#if (_WIN32_IE >= 0x0500) + // new default implementation for ActiveX hosting pages +#ifdef _WTL_NEW_PAGE_NOTIFY_HANDLERS + int OnTranslateAccelerator(LPMSG lpMsg) + { + T* pT = static_cast(this); + return (pT->PreTranslateMessage(lpMsg) != FALSE) ? PSNRET_MESSAGEHANDLED : PSNRET_NOERROR; + } +#else // !_WTL_NEW_PAGE_NOTIFY_HANDLERS + BOOL OnTranslateAccelerator(LPMSG lpMsg) + { + T* pT = static_cast(this); + return pT->PreTranslateMessage(lpMsg); + } +#endif // !_WTL_NEW_PAGE_NOTIFY_HANDLERS +#endif // (_WIN32_IE >= 0x0500) + +// Support for new stuff in ATL7 +#if (_ATL_VER >= 0x0700) + int GetIDD() + { + return( static_cast(this)->IDD ); + } + + virtual DLGPROC GetDialogProc() + { + return DialogProc; + } + + static INT_PTR CALLBACK DialogProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) + { + CAxPropertyPageImpl< T, TBase >* pThis = (CAxPropertyPageImpl< T, TBase >*)hWnd; + if (uMsg == WM_INITDIALOG) + { + HRESULT hr; + if (FAILED(hr = pThis->CreateActiveXControls(pThis->GetIDD()))) + { + ATLASSERT(FALSE); + return FALSE; + } + } + return CPropertyPageImpl< T, TBase >::DialogProc(hWnd, uMsg, wParam, lParam); + } + +// ActiveX controls creation + virtual HRESULT CreateActiveXControls(UINT nID) + { + // Load dialog template and InitData + HRSRC hDlgInit = ::FindResource(ATL::_AtlBaseModule.GetResourceInstance(), MAKEINTRESOURCE(nID), (LPTSTR)_ATL_RT_DLGINIT); + BYTE* pInitData = NULL; + HGLOBAL hData = NULL; + HRESULT hr = S_OK; + if (hDlgInit != NULL) + { + hData = ::LoadResource(ATL::_AtlBaseModule.GetResourceInstance(), hDlgInit); + if (hData != NULL) + pInitData = (BYTE*) ::LockResource(hData); + } + + HRSRC hDlg = ::FindResource(ATL::_AtlBaseModule.GetResourceInstance(), MAKEINTRESOURCE(nID), (LPTSTR)RT_DIALOG); + if (hDlg != NULL) + { + HGLOBAL hResource = ::LoadResource(ATL::_AtlBaseModule.GetResourceInstance(), hDlg); + DLGTEMPLATE* pDlg = NULL; + if (hResource != NULL) + { + pDlg = (DLGTEMPLATE*) ::LockResource(hResource); + if (pDlg != NULL) + { + // Get first control on the template + BOOL bDialogEx = ATL::_DialogSplitHelper::IsDialogEx(pDlg); + WORD nItems = ATL::_DialogSplitHelper::DlgTemplateItemCount(pDlg); + + // Get first control on the dialog + DLGITEMTEMPLATE* pItem = ATL::_DialogSplitHelper::FindFirstDlgItem(pDlg); + HWND hWndPrev = GetWindow(GW_CHILD); + + // Create all ActiveX cotnrols in the dialog template and place them in the correct tab order (z-order) + for (WORD nItem = 0; nItem < nItems; nItem++) + { + DWORD wID = bDialogEx ? ((ATL::_DialogSplitHelper::DLGITEMTEMPLATEEX*)pItem)->id : pItem->id; + if (ATL::_DialogSplitHelper::IsActiveXControl(pItem, bDialogEx)) + { + BYTE* pData = NULL; + DWORD dwLen = ATL::_DialogSplitHelper::FindCreateData(wID, pInitData, &pData); + ATL::CComPtr spStream; + if (dwLen != 0) + { + HGLOBAL h = GlobalAlloc(GHND, dwLen); + if (h != NULL) + { + BYTE* pBytes = (BYTE*) GlobalLock(h); + BYTE* pSource = pData; + SecureHelper::memcpy_x(pBytes, dwLen, pSource, dwLen); + GlobalUnlock(h); + CreateStreamOnHGlobal(h, TRUE, &spStream); + } + else + { + hr = E_OUTOFMEMORY; + break; + } + } + + ATL::CComBSTR bstrLicKey; + hr = ATL::_DialogSplitHelper::ParseInitData(spStream, &bstrLicKey.m_str); + if (SUCCEEDED(hr)) + { + ATL::CAxWindow2 wnd; + // Get control caption. + LPWSTR pszClassName = + bDialogEx ? + (LPWSTR)(((ATL::_DialogSplitHelper::DLGITEMTEMPLATEEX*)pItem) + 1) : + (LPWSTR)(pItem + 1); + // Get control rect. + RECT rect; + rect.left = + bDialogEx ? + ((ATL::_DialogSplitHelper::DLGITEMTEMPLATEEX*)pItem)->x : + pItem->x; + rect.top = + bDialogEx ? + ((ATL::_DialogSplitHelper::DLGITEMTEMPLATEEX*)pItem)->y : + pItem->y; + rect.right = rect.left + + (bDialogEx ? + ((ATL::_DialogSplitHelper::DLGITEMTEMPLATEEX*)pItem)->cx : + pItem->cx); + rect.bottom = rect.top + + (bDialogEx ? + ((ATL::_DialogSplitHelper::DLGITEMTEMPLATEEX*)pItem)->cy : + pItem->cy); + + // Convert from dialog units to screen units + MapDialogRect(&rect); + + // Create AxWindow with a NULL caption. + wnd.Create(m_hWnd, + &rect, + NULL, + (bDialogEx ? + ((ATL::_DialogSplitHelper::DLGITEMTEMPLATEEX*)pItem)->style : + pItem->style) | WS_TABSTOP, + bDialogEx ? + ((ATL::_DialogSplitHelper::DLGITEMTEMPLATEEX*)pItem)->exStyle : + 0, + bDialogEx ? + ((ATL::_DialogSplitHelper::DLGITEMTEMPLATEEX*)pItem)->id : + pItem->id, + NULL); + + if (wnd != NULL) + { +#ifndef _WIN32_WCE + // Set the Help ID + if (bDialogEx && ((ATL::_DialogSplitHelper::DLGITEMTEMPLATEEX*)pItem)->helpID != 0) + wnd.SetWindowContextHelpId(((ATL::_DialogSplitHelper::DLGITEMTEMPLATEEX*)pItem)->helpID); +#endif // !_WIN32_WCE + // Try to create the ActiveX control. + hr = wnd.CreateControlLic(pszClassName, spStream, NULL, bstrLicKey); + if (FAILED(hr)) + break; + // Set the correct tab position. + if (nItem == 0) + hWndPrev = HWND_TOP; + wnd.SetWindowPos(hWndPrev, 0,0,0,0,SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE); + hWndPrev = wnd; + } + else + { + hr = ATL::AtlHresultFromLastError(); + } + } + } + else + { + if (nItem != 0) + hWndPrev = ::GetWindow(hWndPrev, GW_HWNDNEXT); + } + pItem = ATL::_DialogSplitHelper::FindNextDlgItem(pItem, bDialogEx); + } + } + else + hr = ATL::AtlHresultFromLastError(); + } + else + hr = ATL::AtlHresultFromLastError(); + } + return hr; + } + +// Event handling support + HRESULT AdviseSinkMap(bool bAdvise) + { + if(!bAdvise && m_hWnd == NULL) + { + // window is gone, controls are already unadvised + ATLTRACE2(atlTraceUI, 0, _T("CAxPropertyPageImpl::AdviseSinkMap called after the window was destroyed\n")); + return S_OK; + } + HRESULT hRet = E_NOTIMPL; + __if_exists(T::_GetSinkMapFinder) + { + T* pT = static_cast(this); + hRet = AtlAdviseSinkMap(pT, bAdvise); + } + return hRet; + } + +// Message map and handlers + typedef CPropertyPageImpl< T, TBase> _baseClass; + BEGIN_MSG_MAP(CAxPropertyPageImpl) + MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) + MESSAGE_HANDLER(WM_DESTROY, OnDestroy) + CHAIN_MSG_MAP(_baseClass) + END_MSG_MAP() + + LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) + { + // initialize controls in dialog with DLGINIT resource section + ExecuteDlgInit(static_cast(this)->IDD); + AdviseSinkMap(true); + bHandled = FALSE; + return 1; + } + + LRESULT OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) + { + AdviseSinkMap(false); + bHandled = FALSE; + return 1; + } +#endif // (_ATL_VER >= 0x0700) +}; + +// for non-customized pages +template +class CAxPropertyPage : public CAxPropertyPageImpl > +{ +public: + enum { IDD = t_wDlgTemplateID }; + + CAxPropertyPage(ATL::_U_STRINGorID title = (LPCTSTR)NULL) : CAxPropertyPageImpl(title) + { } + +#if (_WIN32_IE >= 0x0500) || (_ATL_VER >= 0x0700) + // not empty so we handle accelerators/create controls + BEGIN_MSG_MAP(CAxPropertyPage) + CHAIN_MSG_MAP(CAxPropertyPageImpl >) + END_MSG_MAP() +#else // !((_WIN32_IE >= 0x0500) || (_ATL_VER >= 0x0700)) + DECLARE_EMPTY_MSG_MAP() +#endif // !((_WIN32_IE >= 0x0500) || (_ATL_VER >= 0x0700)) +}; + +#endif // _ATL_NO_HOSTING + + +/////////////////////////////////////////////////////////////////////////////// +// Wizard97 Support + +#if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) + +// Sample wizard dialog resources: +// +// IDD_WIZ97_INTERIOR_BLANK DIALOG 0, 0, 317, 143 +// STYLE DS_SETFONT | WS_CHILD | WS_DISABLED | WS_CAPTION +// CAPTION "Wizard97 Property Page - Interior" +// FONT 8, "MS Shell Dlg" +// BEGIN +// END +// +// IDD_WIZ97_EXTERIOR_BLANK DIALOGEX 0, 0, 317, 193 +// STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION +// CAPTION "Wizard97 Property Page - Welcome/Complete" +// FONT 8, "MS Shell Dlg", 0, 0, 0x0 +// BEGIN +// LTEXT "Welcome to the X Wizard",IDC_WIZ97_EXTERIOR_TITLE,115,8, +// 195,24 +// LTEXT "Wizard Explanation\r\n(The height of the static text should be in multiples of 8 dlus)", +// IDC_STATIC,115,40,195,16 +// LTEXT "h",IDC_WIZ97_BULLET1,118,64,8,8 +// LTEXT "List Item 1 (the h is turned into a bullet)",IDC_STATIC, +// 127,63,122,8 +// LTEXT "h",IDC_WIZ97_BULLET2,118,79,8,8 +// LTEXT "List Item 2. Keep 7 dlus between paragraphs",IDC_STATIC, +// 127,78,33,8 +// CONTROL "&Do not show this Welcome page again", +// IDC_WIZ97_WELCOME_NOTAGAIN,"Button",BS_AUTOCHECKBOX | +// WS_TABSTOP,115,169,138,10 +// END +// +// GUIDELINES DESIGNINFO +// BEGIN +// IDD_WIZ97_INTERIOR_BLANK, DIALOG +// BEGIN +// LEFTMARGIN, 7 +// RIGHTMARGIN, 310 +// VERTGUIDE, 21 +// VERTGUIDE, 31 +// VERTGUIDE, 286 +// VERTGUIDE, 296 +// TOPMARGIN, 7 +// BOTTOMMARGIN, 136 +// HORZGUIDE, 8 +// END +// +// IDD_WIZ97_EXTERIOR_BLANK, DIALOG +// BEGIN +// RIGHTMARGIN, 310 +// VERTGUIDE, 115 +// VERTGUIDE, 118 +// VERTGUIDE, 127 +// TOPMARGIN, 7 +// BOTTOMMARGIN, 186 +// HORZGUIDE, 8 +// HORZGUIDE, 32 +// HORZGUIDE, 40 +// HORZGUIDE, 169 +// END +// END + +/////////////////////////////////////////////////////////////////////////////// +// CWizard97SheetWindow - client side for a Wizard 97 style wizard sheet + +class CWizard97SheetWindow : public CPropertySheetWindow +{ +public: +// Constructors + CWizard97SheetWindow(HWND hWnd = NULL) : CPropertySheetWindow(hWnd) + { } + + CWizard97SheetWindow& operator =(HWND hWnd) + { + m_hWnd = hWnd; + return *this; + } + +// Operations + HFONT GetExteriorPageTitleFont(void) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (HFONT)::SendMessage(m_hWnd, GetMessage_GetExteriorPageTitleFont(), 0, 0L); + } + + HFONT GetBulletFont(void) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (HFONT)::SendMessage(m_hWnd, GetMessage_GetBulletFont(), 0, 0L); + } + +// Helpers + static UINT GetMessage_GetExteriorPageTitleFont() + { + static UINT uGetExteriorPageTitleFont = 0; + if(uGetExteriorPageTitleFont == 0) + { + CStaticDataInitCriticalSectionLock lock; + if(FAILED(lock.Lock())) + { + ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CWizard97SheetWindow::GetMessage_GetExteriorPageTitleFont().\n")); + ATLASSERT(FALSE); + return 0; + } + + if(uGetExteriorPageTitleFont == 0) + uGetExteriorPageTitleFont = ::RegisterWindowMessage(_T("GetExteriorPageTitleFont_531AF056-B8BE-4c4c-B786-AC608DF0DF12")); + + lock.Unlock(); + } + ATLASSERT(uGetExteriorPageTitleFont != 0); + return uGetExteriorPageTitleFont; + } + + static UINT GetMessage_GetBulletFont() + { + static UINT uGetBulletFont = 0; + if(uGetBulletFont == 0) + { + CStaticDataInitCriticalSectionLock lock; + if(FAILED(lock.Lock())) + { + ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CWizard97SheetWindow::GetMessage_GetBulletFont().\n")); + ATLASSERT(FALSE); + return 0; + } + + if(uGetBulletFont == 0) + uGetBulletFont = ::RegisterWindowMessage(_T("GetBulletFont_AD347D08-8F65-45ef-982E-6352E8218AD5")); + + lock.Unlock(); + } + ATLASSERT(uGetBulletFont != 0); + return uGetBulletFont; + } + +// Implementation - override to prevent usage + HWND Create(LPCTSTR, HWND, ATL::_U_RECT = NULL, LPCTSTR = NULL, DWORD = 0, DWORD = 0, ATL::_U_MENUorID = 0U, LPVOID = NULL) + { + ATLASSERT(FALSE); + return NULL; + } +}; + + +/////////////////////////////////////////////////////////////////////////////// +// CWizard97SheetImpl - implements a Wizard 97 style wizard sheet + +template +class ATL_NO_VTABLE CWizard97SheetImpl : public CPropertySheetImpl< T, TBase > +{ +protected: +// Typedefs + typedef CWizard97SheetImpl< T, TBase > thisClass; + typedef CPropertySheetImpl< T, TBase > baseClass; + +// Member variables + CFont m_fontExteriorPageTitle; // Welcome and Completion page title font + CFont m_fontBullet; // Bullet font (used on static text 'h' to produce a small bullet) + bool m_bReceivedFirstSizeMessage; + +public: + CWizard97SheetImpl(ATL::_U_STRINGorID title, ATL::_U_STRINGorID headerBitmap, ATL::_U_STRINGorID watermarkBitmap, UINT uStartPage = 0, HWND hWndParent = NULL) : + baseClass(title, uStartPage, hWndParent), + m_bReceivedFirstSizeMessage(false) + { + m_psh.dwFlags &= ~(PSH_NOCONTEXTHELP); + m_psh.dwFlags &= ~(PSH_WIZARD | PSH_WIZARD_LITE); + + m_psh.dwFlags |= (PSH_HASHELP | PSH_WIZARDCONTEXTHELP); + m_psh.dwFlags |= PSH_WIZARD97; + + baseClass::SetHeader(headerBitmap.m_lpstr); + baseClass::SetWatermark(watermarkBitmap.m_lpstr); + } + +// Overrides from base class + void OnSheetInitialized() + { + T* pT = static_cast(this); + pT->_InitializeFonts(); + + // We'd like to center the wizard here, but its too early. + // Instead, we'll do CenterWindow upon our first WM_SIZE message + } + +// Initialization + void _InitializeFonts() + { + // Setup the Title and Bullet Font + // (Property pages can send the "get external page title font" and "get bullet font" messages) + // The derived class needs to do the actual SetFont for the dialog items) + + CFontHandle fontThisDialog = this->GetFont(); + CClientDC dcScreen(NULL); + + LOGFONT titleLogFont = {0}; + LOGFONT bulletLogFont = {0}; + fontThisDialog.GetLogFont(&titleLogFont); + fontThisDialog.GetLogFont(&bulletLogFont); + + // The Wizard 97 Spec recommends to do the Title Font + // as Verdana Bold, 12pt. + titleLogFont.lfCharSet = DEFAULT_CHARSET; + titleLogFont.lfWeight = FW_BOLD; + SecureHelper::strcpy_x(titleLogFont.lfFaceName, _countof(titleLogFont.lfFaceName), _T("Verdana Bold")); + INT titleFontPointSize = 12; + titleLogFont.lfHeight = -::MulDiv(titleFontPointSize, dcScreen.GetDeviceCaps(LOGPIXELSY), 72); + m_fontExteriorPageTitle.CreateFontIndirect(&titleLogFont); + + // The Wizard 97 Spec recommends to do Bullets by having + // static text of "h" in the Marlett font. + bulletLogFont.lfCharSet = DEFAULT_CHARSET; + bulletLogFont.lfWeight = FW_NORMAL; + SecureHelper::strcpy_x(bulletLogFont.lfFaceName, _countof(bulletLogFont.lfFaceName), _T("Marlett")); + INT bulletFontSize = 8; + bulletLogFont.lfHeight = -::MulDiv(bulletFontSize, dcScreen.GetDeviceCaps(LOGPIXELSY), 72); + m_fontBullet.CreateFontIndirect(&bulletLogFont); + } + +// Message Handling + BEGIN_MSG_MAP(thisClass) + MESSAGE_HANDLER(CWizard97SheetWindow::GetMessage_GetExteriorPageTitleFont(), OnGetExteriorPageTitleFont) + MESSAGE_HANDLER(CWizard97SheetWindow::GetMessage_GetBulletFont(), OnGetBulletFont) + MESSAGE_HANDLER(WM_SIZE, OnSize) + CHAIN_MSG_MAP(baseClass) + END_MSG_MAP() + + LRESULT OnGetExteriorPageTitleFont(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) + { + return (LRESULT)(HFONT)m_fontExteriorPageTitle; + } + + LRESULT OnGetBulletFont(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) + { + return (LRESULT)(HFONT)m_fontBullet; + } + + LRESULT OnSize(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) + { + if(!m_bReceivedFirstSizeMessage) + { + m_bReceivedFirstSizeMessage = true; + this->CenterWindow(); + } + + bHandled = FALSE; + return 0; + } +}; + +// for non-customized sheets +class CWizard97Sheet : public CWizard97SheetImpl +{ +protected: +// Typedefs + typedef CWizard97Sheet thisClass; + typedef CWizard97SheetImpl baseClass; + +public: + CWizard97Sheet(ATL::_U_STRINGorID title, ATL::_U_STRINGorID headerBitmap, ATL::_U_STRINGorID watermarkBitmap, UINT uStartPage = 0, HWND hWndParent = NULL) : + baseClass(title, headerBitmap, watermarkBitmap, uStartPage, hWndParent) + { } + + BEGIN_MSG_MAP(thisClass) + CHAIN_MSG_MAP(baseClass) + END_MSG_MAP() +}; + + +/////////////////////////////////////////////////////////////////////////////// +// CWizard97PageWindow - client side for a Wizard 97 style wizard page + +#define WIZARD97_EXTERIOR_CXDLG 317 +#define WIZARD97_EXTERIOR_CYDLG 193 + +#define WIZARD97_INTERIOR_CXDLG 317 +#define WIZARD97_INTERIOR_CYDLG 143 + +class CWizard97PageWindow : public CPropertyPageWindow +{ +public: +// Constructors + CWizard97PageWindow(HWND hWnd = NULL) : CPropertyPageWindow(hWnd) + { } + + CWizard97PageWindow& operator =(HWND hWnd) + { + m_hWnd = hWnd; + return *this; + } + +// Attributes + CWizard97SheetWindow GetPropertySheet() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return CWizard97SheetWindow(GetParent()); + } + +// Operations + HFONT GetExteriorPageTitleFont(void) + { + ATLASSERT(::IsWindow(m_hWnd)); + return GetPropertySheet().GetExteriorPageTitleFont(); + } + + HFONT GetBulletFont(void) + { + ATLASSERT(::IsWindow(m_hWnd)); + return GetPropertySheet().GetBulletFont(); + } + +// Implementation - overrides to prevent usage + HWND Create(LPCTSTR, HWND, ATL::_U_RECT = NULL, LPCTSTR = NULL, DWORD = 0, DWORD = 0, ATL::_U_MENUorID = 0U, LPVOID = NULL) + { + ATLASSERT(FALSE); + return NULL; + } + +}; + + +/////////////////////////////////////////////////////////////////////////////// +// CWizard97PageImpl - implements a Wizard 97 style wizard page + +template +class ATL_NO_VTABLE CWizard97PageImpl : public CPropertyPageImpl< T, TBase > +{ +protected: +// Typedefs + typedef CWizard97PageImpl< T, TBase > thisClass; + typedef CPropertyPageImpl< T, TBase > baseClass; + +public: + CWizard97PageImpl(ATL::_U_STRINGorID title = (LPCTSTR)NULL) : baseClass(title) + { } + +// Message Handling + BEGIN_MSG_MAP(thisClass) + CHAIN_MSG_MAP(baseClass) + END_MSG_MAP() +}; + + +/////////////////////////////////////////////////////////////////////////////// +// CWizard97ExteriorPageImpl - implements a Wizard 97 style exterior wizard page + +template +class ATL_NO_VTABLE CWizard97ExteriorPageImpl : public CPropertyPageImpl< T, TBase > +{ +protected: +// Typedefs + typedef CWizard97ExteriorPageImpl< T, TBase > thisClass; + typedef CPropertyPageImpl< T, TBase > baseClass; + +public: +// Constructors + CWizard97ExteriorPageImpl(ATL::_U_STRINGorID title = (LPCTSTR)NULL) : baseClass(title) + { + m_psp.dwFlags |= PSP_HASHELP; + m_psp.dwFlags |= PSP_HIDEHEADER; + } + +// Message Handling + BEGIN_MSG_MAP(thisClass) + CHAIN_MSG_MAP(baseClass) + END_MSG_MAP() +}; + + +/////////////////////////////////////////////////////////////////////////////// +// CWizard97InteriorPageImpl - implements a Wizard 97 style interior wizard page + +template +class ATL_NO_VTABLE CWizard97InteriorPageImpl : public CPropertyPageImpl< T, TBase > +{ +protected: +// Typedefs + typedef CWizard97InteriorPageImpl< T, TBase > thisClass; + typedef CPropertyPageImpl< T, TBase > baseClass; + +public: +// Constructors + CWizard97InteriorPageImpl(ATL::_U_STRINGorID title = (LPCTSTR)NULL) : baseClass(title) + { + m_psp.dwFlags |= PSP_HASHELP; + m_psp.dwFlags &= ~PSP_HIDEHEADER; + m_psp.dwFlags |= PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE; + + // Be sure to have the derived class define this in the constructor. + // We'll default it to something obvious in case its forgotten. + baseClass::SetHeaderTitle(_T("Call SetHeaderTitle in Derived Class")); + baseClass::SetHeaderSubTitle(_T("Call SetHeaderSubTitle in the constructor of the Derived Class.")); + } + +// Message Handling + BEGIN_MSG_MAP(thisClass) + CHAIN_MSG_MAP(baseClass) + END_MSG_MAP() +}; + +#endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) + + +/////////////////////////////////////////////////////////////////////////////// +// Aero Wizard support + +#if (_WIN32_WINNT >= 0x0600) && !defined(_WIN32_WCE) + +/////////////////////////////////////////////////////////////////////////////// +// CAeroWizardFrameWindow - client side for an Aero Wizard frame window + +class CAeroWizardFrameWindow : public CPropertySheetWindow +{ +public: +// Constructors + CAeroWizardFrameWindow(HWND hWnd = NULL) : CPropertySheetWindow(hWnd) + { } + + CAeroWizardFrameWindow& operator =(HWND hWnd) + { + m_hWnd = hWnd; + return *this; + } + +// Operations - new, Aero Wizard only + void SetNextText(LPCWSTR lpszText) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, PSM_SETNEXTTEXT, 0, (LPARAM)lpszText); + } + + void ShowWizardButtons(DWORD dwButtons, DWORD dwStates) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::PostMessage(m_hWnd, PSM_SHOWWIZBUTTONS, (WPARAM)dwStates, (LPARAM)dwButtons); + } + + void EnableWizardButtons(DWORD dwButtons, DWORD dwStates) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::PostMessage(m_hWnd, PSM_ENABLEWIZBUTTONS, (WPARAM)dwStates, (LPARAM)dwButtons); + } + + void SetButtonText(DWORD dwButton, LPCWSTR lpszText) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, PSM_SETBUTTONTEXT, (WPARAM)dwButton, (LPARAM)lpszText); + } +}; + + +/////////////////////////////////////////////////////////////////////////////// +// CAeroWizardFrameImpl - implements an Aero Wizard frame + +template +class ATL_NO_VTABLE CAeroWizardFrameImpl : public CPropertySheetImpl +{ +public: +// Constructor + CAeroWizardFrameImpl(ATL::_U_STRINGorID title = (LPCTSTR)NULL, UINT uStartPage = 0, HWND hWndParent = NULL) : + CPropertySheetImpl(title, uStartPage, hWndParent) + { + m_psh.dwFlags |= PSH_WIZARD | PSH_AEROWIZARD; + } + +// Operations + void EnableResizing() + { + ATLASSERT(m_hWnd == NULL); // can't do this after it's created + m_psh.dwFlags |= PSH_RESIZABLE; + } + + void UseHeaderBitmap() + { + ATLASSERT(m_hWnd == NULL); // can't do this after it's created + m_psh.dwFlags |= PSH_HEADERBITMAP; + } + + void SetNoMargin() + { + ATLASSERT(m_hWnd == NULL); // can't do this after it's created + m_psh.dwFlags |= PSH_NOMARGIN; + } + +// Override to prevent use + HWND Create(HWND /*hWndParent*/ = NULL) + { + ATLASSERT(FALSE); // not supported for Aero Wizard + return NULL; + } +}; + + +/////////////////////////////////////////////////////////////////////////////// +// CAeroWizardFrame - for non-customized frames + +class CAeroWizardFrame : public CAeroWizardFrameImpl +{ +public: + CAeroWizardFrame(ATL::_U_STRINGorID title = (LPCTSTR)NULL, UINT uStartPage = 0, HWND hWndParent = NULL) + : CAeroWizardFrameImpl(title, uStartPage, hWndParent) + { } + + BEGIN_MSG_MAP(CAeroWizardFrame) + MESSAGE_HANDLER(WM_COMMAND, CAeroWizardFrameImpl::OnCommand) + END_MSG_MAP() +}; + + +/////////////////////////////////////////////////////////////////////////////// +// CAeroWizardPageWindow - client side for an Aero Wizard page + +class CAeroWizardPageWindow : public CPropertyPageWindow +{ +public: +// Constructors + CAeroWizardPageWindow(HWND hWnd = NULL) : CPropertyPageWindow(hWnd) + { } + + CAeroWizardPageWindow& operator =(HWND hWnd) + { + m_hWnd = hWnd; + return *this; + } + +// Attributes + CAeroWizardFrameWindow GetAeroWizardFrame() const + { + ATLASSERT(::IsWindow(m_hWnd)); + // This is not really top-level frame window, but it processes all frame messages + return CAeroWizardFrameWindow(GetParent()); + } + +// Operations - new, Aero Wizard only + void SetNextText(LPCWSTR lpszText) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(GetParent() != NULL); + GetAeroWizardFrame().SetNextText(lpszText); + } + + void ShowWizardButtons(DWORD dwButtons, DWORD dwStates) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(GetParent() != NULL); + GetAeroWizardFrame().ShowWizardButtons(dwButtons, dwStates); + } + + void EnableWizardButtons(DWORD dwButtons, DWORD dwStates) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(GetParent() != NULL); + GetAeroWizardFrame().EnableWizardButtons(dwButtons, dwStates); + } + + void SetButtonText(DWORD dwButton, LPCWSTR lpszText) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(GetParent() != NULL); + GetAeroWizardFrame().SetButtonText(dwButton, lpszText); + } +}; + + +/////////////////////////////////////////////////////////////////////////////// +// CAeroWizardPageImpl - implements an Aero Wizard page + +template +class ATL_NO_VTABLE CAeroWizardPageImpl : public CPropertyPageImpl +{ +public: + CAeroWizardPageImpl(ATL::_U_STRINGorID title = (LPCTSTR)NULL) : CPropertyPageImpl(title) + { } +}; + + +/////////////////////////////////////////////////////////////////////////////// +// CAeroWizardPage - for non-customized pages + +template +class CAeroWizardPage : public CAeroWizardPageImpl > +{ +public: + enum { IDD = t_wDlgTemplateID }; + + CAeroWizardPage(ATL::_U_STRINGorID title = (LPCTSTR)NULL) : CAeroWizardPageImpl(title) + { } + + DECLARE_EMPTY_MSG_MAP() +}; + + +#ifndef _ATL_NO_HOSTING + +// Note: You must #include to use these classes + +/////////////////////////////////////////////////////////////////////////////// +// CAeroWizardAxPageImpl - Aero Wizard page that hosts ActiveX controls + +template +class ATL_NO_VTABLE CAeroWizardAxPageImpl : public CAxPropertyPageImpl< T, TBase > +{ +public: + CAeroWizardAxPageImpl(ATL::_U_STRINGorID title = (LPCTSTR)NULL) : CAxPropertyPageImpl< T, TBase >(title) + { } +}; + + +/////////////////////////////////////////////////////////////////////////////// +// CAeroWizardAxPage - for non-customized pages + +template +class CAeroWizardAxPage : public CAeroWizardAxPageImpl > +{ +public: + enum { IDD = t_wDlgTemplateID }; + + CAeroWizardAxPage(ATL::_U_STRINGorID title = (LPCTSTR)NULL) : CAeroWizardAxPageImpl(title) + { } + +#if (_WIN32_IE >= 0x0500) || (_ATL_VER >= 0x0700) + // not empty so we handle accelerators/create controls + BEGIN_MSG_MAP(CAeroWizardAxPage) + CHAIN_MSG_MAP(CAeroWizardAxPageImpl >) + END_MSG_MAP() +#else // !((_WIN32_IE >= 0x0500) || (_ATL_VER >= 0x0700)) + DECLARE_EMPTY_MSG_MAP() +#endif // !((_WIN32_IE >= 0x0500) || (_ATL_VER >= 0x0700)) +}; + +#endif // _ATL_NO_HOSTING + +#endif // (_WIN32_WINNT >= 0x0600) && !defined(_WIN32_WCE) + + +/////////////////////////////////////////////////////////////////////////////// +// TaskDialog support + +#if ((_WIN32_WINNT >= 0x0600) || defined(_WTL_TASKDIALOG)) && !defined(_WIN32_WCE) + +/////////////////////////////////////////////////////////////////////////////// +// AtlTaskDialog - support for TaskDialog() function + +inline int AtlTaskDialog(HWND hWndParent, + ATL::_U_STRINGorID WindowTitle, ATL::_U_STRINGorID MainInstructionText, ATL::_U_STRINGorID ContentText, + TASKDIALOG_COMMON_BUTTON_FLAGS dwCommonButtons = 0U, ATL::_U_STRINGorID Icon = (LPCTSTR)NULL) +{ + int nRet = -1; + +#ifdef _WTL_TASKDIALOG_DIRECT + USES_CONVERSION; + HRESULT hRet = ::TaskDialog(hWndParent, ModuleHelper::GetResourceInstance(), T2CW(WindowTitle.m_lpstr), T2CW(MainInstructionText.m_lpstr), T2CW(ContentText.m_lpstr), dwCommonButtons, T2CW(Icon.m_lpstr), &nRet); + ATLVERIFY(SUCCEEDED(hRet)); +#else + // This allows apps to run on older versions of Windows + typedef HRESULT (STDAPICALLTYPE *PFN_TaskDialog)(HWND hwndParent, HINSTANCE hInstance, PCWSTR pszWindowTitle, PCWSTR pszMainInstruction, PCWSTR pszContent, TASKDIALOG_COMMON_BUTTON_FLAGS dwCommonButtons, PCWSTR pszIcon, int* pnButton); + + HMODULE m_hCommCtrlDLL = ::LoadLibrary(_T("comctl32.dll")); + if(m_hCommCtrlDLL != NULL) + { + PFN_TaskDialog pfnTaskDialog = (PFN_TaskDialog)::GetProcAddress(m_hCommCtrlDLL, "TaskDialog"); + if(pfnTaskDialog != NULL) + { + USES_CONVERSION; + HRESULT hRet = pfnTaskDialog(hWndParent, ModuleHelper::GetResourceInstance(), T2CW(WindowTitle.m_lpstr), T2CW(MainInstructionText.m_lpstr), T2CW(ContentText.m_lpstr), dwCommonButtons, T2CW(Icon.m_lpstr), &nRet); + ATLVERIFY(SUCCEEDED(hRet)); + } + + ::FreeLibrary(m_hCommCtrlDLL); + } +#endif + + return nRet; +} + + +/////////////////////////////////////////////////////////////////////////////// +// CTaskDialogConfig - TASKDIALOGCONFIG wrapper + +class CTaskDialogConfig : public TASKDIALOGCONFIG +{ +public: +// Constructor + CTaskDialogConfig() + { + Init(); + } + + void Init() + { + memset(this, 0, sizeof(TASKDIALOGCONFIG)); // initialize structure to 0/NULL + this->cbSize = sizeof(TASKDIALOGCONFIG); + this->hInstance = ModuleHelper::GetResourceInstance(); + } + +// Operations - setting values + // common buttons + void SetCommonButtons(TASKDIALOG_COMMON_BUTTON_FLAGS dwCommonButtons) + { + this->dwCommonButtons = dwCommonButtons; + } + + // window title text + void SetWindowTitle(UINT nID) + { + this->pszWindowTitle = MAKEINTRESOURCEW(nID); + } + + void SetWindowTitle(LPCWSTR lpstrWindowTitle) + { + this->pszWindowTitle = lpstrWindowTitle; + } + + // main icon + void SetMainIcon(HICON hIcon) + { + this->dwFlags |= TDF_USE_HICON_MAIN; + this->hMainIcon = hIcon; + } + + void SetMainIcon(UINT nID) + { + this->dwFlags &= ~TDF_USE_HICON_MAIN; + this->pszMainIcon = MAKEINTRESOURCEW(nID); + } + + void SetMainIcon(LPCWSTR lpstrMainIcon) + { + this->dwFlags &= ~TDF_USE_HICON_MAIN; + this->pszMainIcon = lpstrMainIcon; + } + + // main instruction text + void SetMainInstructionText(UINT nID) + { + this->pszMainInstruction = MAKEINTRESOURCEW(nID); + } + + void SetMainInstructionText(LPCWSTR lpstrMainInstruction) + { + this->pszMainInstruction = lpstrMainInstruction; + } + + // content text + void SetContentText(UINT nID) + { + this->pszContent = MAKEINTRESOURCEW(nID); + } + + void SetContentText(LPCWSTR lpstrContent) + { + this->pszContent = lpstrContent; + } + + // buttons + void SetButtons(const TASKDIALOG_BUTTON* pButtons, UINT cButtons, int nDefaultButton = 0) + { + this->pButtons = pButtons; + this->cButtons = cButtons; + if(nDefaultButton != 0) + this->nDefaultButton = nDefaultButton; + } + + void SetDefaultButton(int nDefaultButton) + { + this->nDefaultButton = nDefaultButton; + } + + // radio buttons + void SetRadioButtons(const TASKDIALOG_BUTTON* pRadioButtons, UINT cRadioButtons, int nDefaultRadioButton = 0) + { + this->pRadioButtons = pRadioButtons; + this->cRadioButtons = cRadioButtons; + if(nDefaultRadioButton != 0) + this->nDefaultRadioButton = nDefaultRadioButton; + } + + void SetDefaultRadioButton(int nDefaultRadioButton) + { + this->nDefaultRadioButton = nDefaultRadioButton; + } + + // verification text + void SetVerificationText(UINT nID) + { + this->pszVerificationText = MAKEINTRESOURCEW(nID); + } + + void SetVerificationText(LPCWSTR lpstrVerificationText) + { + this->pszVerificationText = lpstrVerificationText; + } + + // expanded information text + void SetExpandedInformationText(UINT nID) + { + this->pszExpandedInformation = MAKEINTRESOURCEW(nID); + } + + void SetExpandedInformationText(LPCWSTR lpstrExpandedInformation) + { + this->pszExpandedInformation = lpstrExpandedInformation; + } + + // expanded control text + void SetExpandedControlText(UINT nID) + { + this->pszExpandedControlText = MAKEINTRESOURCEW(nID); + } + + void SetExpandedControlText(LPCWSTR lpstrExpandedControlText) + { + this->pszExpandedControlText = lpstrExpandedControlText; + } + + // collapsed control text + void SetCollapsedControlText(UINT nID) + { + this->pszCollapsedControlText = MAKEINTRESOURCEW(nID); + } + + void SetCollapsedControlText(LPCWSTR lpstrCollapsedControlText) + { + this->pszCollapsedControlText = lpstrCollapsedControlText; + } + + // footer icon + void SetFooterIcon(HICON hIcon) + { + this->dwFlags |= TDF_USE_HICON_FOOTER; + this->hFooterIcon = hIcon; + } + + void SetFooterIcon(UINT nID) + { + this->dwFlags &= ~TDF_USE_HICON_FOOTER; + this->pszFooterIcon = MAKEINTRESOURCEW(nID); + } + + void SetFooterIcon(LPCWSTR lpstrFooterIcon) + { + this->dwFlags &= ~TDF_USE_HICON_FOOTER; + this->pszFooterIcon = lpstrFooterIcon; + } + + // footer text + void SetFooterText(UINT nID) + { + this->pszFooter = MAKEINTRESOURCEW(nID); + } + + void SetFooterText(LPCWSTR lpstrFooterText) + { + this->pszFooter = lpstrFooterText; + } + + // width (in DLUs) + void SetWidth(UINT cxWidth) + { + this->cxWidth = cxWidth; + } + + // modify flags + void ModifyFlags(DWORD dwRemove, DWORD dwAdd) + { + this->dwFlags = (this->dwFlags & ~dwRemove) | dwAdd; + } +}; + + +/////////////////////////////////////////////////////////////////////////////// +// CTaskDialogImpl - implements a Task Dialog + +template +class ATL_NO_VTABLE CTaskDialogImpl +{ +public: + CTaskDialogConfig m_tdc; + HWND m_hWnd; // used only in callback functions + +// Constructor + CTaskDialogImpl(HWND hWndParent = NULL) : m_hWnd(NULL) + { + m_tdc.hwndParent = hWndParent; + m_tdc.pfCallback = T::TaskDialogCallback; + m_tdc.lpCallbackData = (LONG_PTR)static_cast(this); + } + +// Operations + HRESULT DoModal(HWND hWndParent = ::GetActiveWindow(), int* pnButton = NULL, int* pnRadioButton = NULL, BOOL* pfVerificationFlagChecked = NULL) + { + if(m_tdc.hwndParent == NULL) + m_tdc.hwndParent = hWndParent; + +#ifdef _WTL_TASKDIALOG_DIRECT + return ::TaskDialogIndirect(&m_tdc, pnButton, pnRadioButton, pfVerificationFlagChecked); +#else + + // This allows apps to run on older versions of Windows + typedef HRESULT (STDAPICALLTYPE *PFN_TaskDialogIndirect)(const TASKDIALOGCONFIG* pTaskConfig, int* pnButton, int* pnRadioButton, BOOL* pfVerificationFlagChecked); + + HRESULT hRet = E_UNEXPECTED; + HMODULE m_hCommCtrlDLL = ::LoadLibrary(_T("comctl32.dll")); + if(m_hCommCtrlDLL != NULL) + { + PFN_TaskDialogIndirect pfnTaskDialogIndirect = (PFN_TaskDialogIndirect)::GetProcAddress(m_hCommCtrlDLL, "TaskDialogIndirect"); + if(pfnTaskDialogIndirect != NULL) + hRet = pfnTaskDialogIndirect(&m_tdc, pnButton, pnRadioButton, pfVerificationFlagChecked); + + ::FreeLibrary(m_hCommCtrlDLL); + } + + return hRet; +#endif + } + +// Operations - setting values of TASKDIALOGCONFIG + // common buttons + void SetCommonButtons(TASKDIALOG_COMMON_BUTTON_FLAGS dwCommonButtons) + { m_tdc.SetCommonButtons(dwCommonButtons); } + // window title text + void SetWindowTitle(UINT nID) + { m_tdc.SetWindowTitle(nID); } + void SetWindowTitle(LPCWSTR lpstrWindowTitle) + { m_tdc.SetWindowTitle(lpstrWindowTitle); } + // main icon + void SetMainIcon(HICON hIcon) + { m_tdc.SetMainIcon(hIcon); } + void SetMainIcon(UINT nID) + { m_tdc.SetMainIcon(nID); } + void SetMainIcon(LPCWSTR lpstrMainIcon) + { m_tdc.SetMainIcon(lpstrMainIcon); } + // main instruction text + void SetMainInstructionText(UINT nID) + { m_tdc.SetMainInstructionText(nID); } + void SetMainInstructionText(LPCWSTR lpstrMainInstruction) + { m_tdc.SetMainInstructionText(lpstrMainInstruction); } + // content text + void SetContentText(UINT nID) + { m_tdc.SetContentText(nID); } + void SetContentText(LPCWSTR lpstrContent) + { m_tdc.SetContentText(lpstrContent); } + // buttons + void SetButtons(const TASKDIALOG_BUTTON* pButtons, UINT cButtons, int nDefaultButton = 0) + { m_tdc.SetButtons(pButtons, cButtons, nDefaultButton); } + void SetDefaultButton(int nDefaultButton) + { m_tdc.SetDefaultButton(nDefaultButton); } + // radio buttons + void SetRadioButtons(const TASKDIALOG_BUTTON* pRadioButtons, UINT cRadioButtons, int nDefaultRadioButton = 0) + { m_tdc.SetRadioButtons(pRadioButtons, cRadioButtons, nDefaultRadioButton); } + void SetDefaultRadioButton(int nDefaultRadioButton) + { m_tdc.SetDefaultRadioButton(nDefaultRadioButton); } + // verification text + void SetVerificationText(UINT nID) + { m_tdc.SetVerificationText(nID); } + void SetVerificationText(LPCWSTR lpstrVerificationText) + { m_tdc.SetVerificationText(lpstrVerificationText); } + // expanded information text + void SetExpandedInformationText(UINT nID) + { m_tdc.SetExpandedInformationText(nID); } + void SetExpandedInformationText(LPCWSTR lpstrExpandedInformation) + { m_tdc.SetExpandedInformationText(lpstrExpandedInformation); } + // expanded control text + void SetExpandedControlText(UINT nID) + { m_tdc.SetExpandedControlText(nID); } + void SetExpandedControlText(LPCWSTR lpstrExpandedControlText) + { m_tdc.SetExpandedControlText(lpstrExpandedControlText); } + // collapsed control text + void SetCollapsedControlText(UINT nID) + { m_tdc.SetCollapsedControlText(nID); } + void SetCollapsedControlText(LPCWSTR lpstrCollapsedControlText) + { m_tdc.SetCollapsedControlText(lpstrCollapsedControlText); } + // footer icon + void SetFooterIcon(HICON hIcon) + { m_tdc.SetFooterIcon(hIcon); } + void SetFooterIcon(UINT nID) + { m_tdc.SetFooterIcon(nID); } + void SetFooterIcon(LPCWSTR lpstrFooterIcon) + { m_tdc.SetFooterIcon(lpstrFooterIcon); } + // footer text + void SetFooterText(UINT nID) + { m_tdc.SetFooterText(nID); } + void SetFooterText(LPCWSTR lpstrFooterText) + { m_tdc.SetFooterText(lpstrFooterText); } + // width (in DLUs) + void SetWidth(UINT cxWidth) + { m_tdc.SetWidth(cxWidth); } + // modify flags + void ModifyFlags(DWORD dwRemove, DWORD dwAdd) + { m_tdc.ModifyFlags(dwRemove, dwAdd); } + +// Implementation + static HRESULT CALLBACK TaskDialogCallback(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LONG_PTR lpRefData) + { + T* pT = (T*)lpRefData; + ATLASSERT(pT->m_hWnd == NULL || pT->m_hWnd == hWnd); + + BOOL bRet = FALSE; + switch(uMsg) + { + case TDN_DIALOG_CONSTRUCTED: + pT->m_hWnd = hWnd; + pT->OnDialogConstructed(); + break; + case TDN_CREATED: + pT->OnCreated(); + break; + case TDN_BUTTON_CLICKED: + bRet = pT->OnButtonClicked((int)wParam); + break; + case TDN_RADIO_BUTTON_CLICKED: + pT->OnRadioButtonClicked((int)wParam); + break; + case TDN_HYPERLINK_CLICKED: + pT->OnHyperlinkClicked((LPCWSTR)lParam); + break; + case TDN_EXPANDO_BUTTON_CLICKED: + pT->OnExpandoButtonClicked((wParam != 0)); + break; + case TDN_VERIFICATION_CLICKED: + pT->OnVerificationClicked((wParam != 0)); + break; + case TDN_HELP: + pT->OnHelp(); + break; + case TDN_TIMER: + bRet = pT->OnTimer((DWORD)wParam); + break; + case TDN_NAVIGATED: + pT->OnNavigated(); + break; + case TDN_DESTROYED: + pT->OnDestroyed(); + pT->m_hWnd = NULL; + break; + default: + ATLTRACE2(atlTraceUI, 0, _T("Unknown notification received in CTaskDialogImpl::TaskDialogCallback\n")); + break; + } + + return (HRESULT)bRet; + } + +// Overrideables - notification handlers + void OnDialogConstructed() + { + } + + void OnCreated() + { + } + + BOOL OnButtonClicked(int /*nButton*/) + { + return FALSE; // don't prevent dialog to close + } + + void OnRadioButtonClicked(int /*nRadioButton*/) + { + } + + void OnHyperlinkClicked(LPCWSTR /*pszHREF*/) + { + } + + void OnExpandoButtonClicked(bool /*bExpanded*/) + { + } + + void OnVerificationClicked(bool /*bChecked*/) + { + } + + void OnHelp() + { + } + + BOOL OnTimer(DWORD /*dwTickCount*/) + { + return FALSE; // don't reset counter + } + + void OnNavigated() + { + } + + void OnDestroyed() + { + } + +// Commands - valid to call only from handlers + void NavigatePage(TASKDIALOGCONFIG& tdc) + { + ATLASSERT(m_hWnd != NULL); + + tdc.cbSize = sizeof(TASKDIALOGCONFIG); + if(tdc.hwndParent == NULL) + tdc.hwndParent = m_tdc.hwndParent; + tdc.pfCallback = m_tdc.pfCallback; + tdc.lpCallbackData = m_tdc.lpCallbackData; + (TASKDIALOGCONFIG)m_tdc = tdc; + + ::SendMessage(m_hWnd, TDM_NAVIGATE_PAGE, 0, (LPARAM)&tdc); + } + + // modify TASKDIALOGCONFIG values, then call this to update task dialog + void NavigatePage() + { + ATLASSERT(m_hWnd != NULL); + ::SendMessage(m_hWnd, TDM_NAVIGATE_PAGE, 0, (LPARAM)&m_tdc); + } + + void ClickButton(int nButton) + { + ATLASSERT(m_hWnd != NULL); + ::SendMessage(m_hWnd, TDM_CLICK_BUTTON, nButton, 0L); + } + + void SetMarqueeProgressBar(BOOL bMarquee) + { + ATLASSERT(m_hWnd != NULL); + ::SendMessage(m_hWnd, TDM_SET_MARQUEE_PROGRESS_BAR, bMarquee, 0L); + } + + BOOL SetProgressBarState(int nNewState) + { + ATLASSERT(m_hWnd != NULL); + return (BOOL)::SendMessage(m_hWnd, TDM_SET_PROGRESS_BAR_STATE, nNewState, 0L); + } + + DWORD SetProgressBarRange(int nMinRange, int nMaxRange) + { + ATLASSERT(m_hWnd != NULL); + return (DWORD)::SendMessage(m_hWnd, TDM_SET_PROGRESS_BAR_RANGE, 0, MAKELPARAM(nMinRange, nMaxRange)); + } + + int SetProgressBarPos(int nNewPos) + { + ATLASSERT(m_hWnd != NULL); + return (int)::SendMessage(m_hWnd, TDM_SET_PROGRESS_BAR_POS, nNewPos, 0L); + } + + BOOL SetProgressBarMarquee(BOOL bMarquee, UINT uSpeed) + { + ATLASSERT(m_hWnd != NULL); + return (BOOL)::SendMessage(m_hWnd, TDM_SET_PROGRESS_BAR_MARQUEE, bMarquee, uSpeed); + } + + void SetElementText(TASKDIALOG_ELEMENTS element, LPCWSTR lpstrText) + { + ATLASSERT(m_hWnd != NULL); + ::SendMessage(m_hWnd, TDM_SET_ELEMENT_TEXT, element, (LPARAM)lpstrText); + } + + void ClickRadioButton(int nRadioButton) + { + ATLASSERT(m_hWnd != NULL); + ::SendMessage(m_hWnd, TDM_CLICK_RADIO_BUTTON, nRadioButton, 0L); + } + + void EnableButton(int nButton, BOOL bEnable) + { + ATLASSERT(m_hWnd != NULL); + ::SendMessage(m_hWnd, TDM_ENABLE_BUTTON, nButton, bEnable); + } + + void EnableRadioButton(int nButton, BOOL bEnable) + { + ATLASSERT(m_hWnd != NULL); + ::SendMessage(m_hWnd, TDM_ENABLE_RADIO_BUTTON, nButton, bEnable); + } + + void ClickVerification(BOOL bCheck, BOOL bFocus) + { + ATLASSERT(m_hWnd != NULL); + ::SendMessage(m_hWnd, TDM_CLICK_VERIFICATION, bCheck, bFocus); + } + + void UpdateElementText(TASKDIALOG_ELEMENTS element, LPCWSTR lpstrText) + { + ATLASSERT(m_hWnd != NULL); + ::SendMessage(m_hWnd, TDM_UPDATE_ELEMENT_TEXT, element, (LPARAM)lpstrText); + } + + void SetButtonElevationRequiredState(int nButton, BOOL bElevation) + { + ATLASSERT(m_hWnd != NULL); + ::SendMessage(m_hWnd, TDM_SET_BUTTON_ELEVATION_REQUIRED_STATE, nButton, bElevation); + } + + void UpdateIcon(TASKDIALOG_ICON_ELEMENTS element, HICON hIcon) + { + ATLASSERT(m_hWnd != NULL); +#ifdef _DEBUG + if(element == TDIE_ICON_MAIN) + ATLASSERT((m_tdc.dwFlags & TDF_USE_HICON_MAIN) != 0); + else if(element == TDIE_ICON_FOOTER) + ATLASSERT((m_tdc.dwFlags & TDF_USE_HICON_FOOTER) != 0); +#endif // _DEBUG + ::SendMessage(m_hWnd, TDM_UPDATE_ICON, element, (LPARAM)hIcon); + } + + void UpdateIcon(TASKDIALOG_ICON_ELEMENTS element, LPCWSTR lpstrIcon) + { + ATLASSERT(m_hWnd != NULL); +#ifdef _DEBUG + if(element == TDIE_ICON_MAIN) + ATLASSERT((m_tdc.dwFlags & TDF_USE_HICON_MAIN) == 0); + else if(element == TDIE_ICON_FOOTER) + ATLASSERT((m_tdc.dwFlags & TDF_USE_HICON_FOOTER) == 0); +#endif // _DEBUG + ::SendMessage(m_hWnd, TDM_UPDATE_ICON, element, (LPARAM)lpstrIcon); + } +}; + + +/////////////////////////////////////////////////////////////////////////////// +// CTaskDialog - for non-customized task dialogs + +class CTaskDialog : public CTaskDialogImpl +{ +public: + CTaskDialog(HWND hWndParent = NULL) : CTaskDialogImpl(hWndParent) + { + m_tdc.pfCallback = NULL; + } +}; + +#endif // ((_WIN32_WINNT >= 0x0600) || defined(_WTL_TASKDIALOG)) && !defined(_WIN32_WCE) + +}; // namespace WTL + +#endif // __ATLDLGS_H__ diff --git a/Externals/WTL80/atlfind.h b/Externals/WTL80/atlfind.h new file mode 100644 index 0000000000..a1dd52dbe6 --- /dev/null +++ b/Externals/WTL80/atlfind.h @@ -0,0 +1,1036 @@ +// Windows Template Library - WTL version 8.0 +// Copyright (C) Microsoft Corporation. All rights reserved. +// +// This file is a part of the Windows Template Library. +// The use and distribution terms for this software are covered by the +// Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php) +// which can be found in the file CPL.TXT at the root of this distribution. +// By using this software in any fashion, you are agreeing to be bound by +// the terms of this license. You must not remove this notice, or +// any other, from this software. + +#ifndef __ATLFIND_H__ +#define __ATLFIND_H__ + +#pragma once + +#ifndef __cplusplus + #error ATL requires C++ compilation (use a .cpp suffix) +#endif + +#ifdef _WIN32_WCE + #error atlfind.h is not supported on Windows CE +#endif + +#ifndef __ATLCTRLS_H__ + #error atlfind.h requires atlctrls.h to be included first +#endif + +#ifndef __ATLDLGS_H__ + #error atlfind.h requires atldlgs.h to be included first +#endif + +#if !((defined(__ATLMISC_H__) && defined(_WTL_USE_CSTRING)) || defined(__ATLSTR_H__)) + #error atlfind.h requires CString (either from ATL's atlstr.h or WTL's atlmisc.h with _WTL_USE_CSTRING) +#endif + + +/////////////////////////////////////////////////////////////////////////////// +// Classes in this file: +// +// CEditFindReplaceImplBase +// CEditFindReplaceImpl +// CRichEditFindReplaceImpl + + +namespace WTL +{ + +/////////////////////////////////////////////////////////////////////////////// +// CEditFindReplaceImplBase - Base class for mixin classes that +// help implement Find/Replace for CEdit or CRichEditCtrl based window classes. + +template +class CEditFindReplaceImplBase +{ +protected: +// Typedefs + typedef CEditFindReplaceImplBase thisClass; + +// Data members + TFindReplaceDialog* m_pFindReplaceDialog; + _CSTRING_NS::CString m_sFindNext, m_sReplaceWith; + BOOL m_bFindOnly, m_bFirstSearch, m_bMatchCase, m_bWholeWord, m_bFindDown; + LONG m_nInitialSearchPos; + HCURSOR m_hOldCursor; + +// Enumerations + enum TranslationTextItem + { + eText_OnReplaceAllMessage = 0, + eText_OnReplaceAllTitle = 1, + eText_OnTextNotFoundMessage = 2, + eText_OnTextNotFoundTitle = 3 + }; + +public: +// Constructors + CEditFindReplaceImplBase() : + m_pFindReplaceDialog(NULL), + m_bFindOnly(TRUE), + m_bFirstSearch(TRUE), + m_bMatchCase(FALSE), + m_bWholeWord(FALSE), + m_bFindDown(TRUE), + m_nInitialSearchPos(0), + m_hOldCursor(NULL) + { + } + +// Message Handlers + BEGIN_MSG_MAP(thisClass) + ALT_MSG_MAP(1) + MESSAGE_HANDLER(WM_DESTROY, OnDestroy) + MESSAGE_HANDLER(TFindReplaceDialog::GetFindReplaceMsg(), OnFindReplaceCmd) + COMMAND_ID_HANDLER(ID_EDIT_FIND, OnEditFind) + COMMAND_ID_HANDLER(ID_EDIT_REPEAT, OnEditRepeat) + COMMAND_ID_HANDLER(ID_EDIT_REPLACE, OnEditReplace) + END_MSG_MAP() + + LRESULT OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) + { + if(m_pFindReplaceDialog != NULL) + { + m_pFindReplaceDialog->SendMessage(WM_CLOSE); + ATLASSERT(m_pFindReplaceDialog == NULL); + } + + bHandled = FALSE; + return 0; + } + + LRESULT OnFindReplaceCmd(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/) + { + T* pT = static_cast(this); + + TFindReplaceDialog* pDialog = TFindReplaceDialog::GetNotifier(lParam); + if(pDialog == NULL) + { + ATLASSERT(FALSE); + ::MessageBeep(MB_ICONERROR); + return 1; + } + ATLASSERT(pDialog == m_pFindReplaceDialog); + + LPFINDREPLACE findReplace = (LPFINDREPLACE)lParam; + if((m_pFindReplaceDialog != NULL) && (findReplace != NULL)) + { + if(pDialog->FindNext()) + { + pT->OnFindNext(pDialog->GetFindString(), pDialog->SearchDown(), + pDialog->MatchCase(), pDialog->MatchWholeWord()); + } + else if(pDialog->ReplaceCurrent()) + { + pT->OnReplaceSel(pDialog->GetFindString(), + pDialog->SearchDown(), pDialog->MatchCase(), pDialog->MatchWholeWord(), + pDialog->GetReplaceString()); + } + else if(pDialog->ReplaceAll()) + { + pT->OnReplaceAll(pDialog->GetFindString(), pDialog->GetReplaceString(), + pDialog->MatchCase(), pDialog->MatchWholeWord()); + } + else if(pDialog->IsTerminating()) + { + // Dialog is going away (but hasn't gone away yet) + // OnFinalMessage will "delete this" + pT->OnTerminatingFindReplaceDialog(m_pFindReplaceDialog); + m_pFindReplaceDialog = NULL; + } + } + + return 0; + } + + LRESULT OnEditFind(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) + { + T* pT = static_cast(this); + pT->FindReplace(TRUE); + + return 0; + } + + LRESULT OnEditRepeat(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) + { + T* pT = static_cast(this); + + // If the user is holding down SHIFT when hitting F3, we'll + // search in reverse. Otherwise, we'll search forward. + // (be sure to have an accelerator mapped to ID_EDIT_REPEAT + // for both F3 and Shift+F3) + m_bFindDown = !((::GetKeyState(VK_SHIFT) & 0x8000) == 0x8000); + + if(m_sFindNext.IsEmpty()) + { + pT->FindReplace(TRUE); + } + else + { + if(!pT->FindTextSimple(m_sFindNext, m_bMatchCase, m_bWholeWord, m_bFindDown)) + pT->TextNotFound(m_sFindNext); + } + + return 0; + } + + LRESULT OnEditReplace(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& bHandled) + { + T* pT = static_cast(this); + + DWORD style = pT->GetStyle(); + if((style & ES_READONLY) != ES_READONLY) + { + pT->FindReplace(FALSE); + } + else + { + // Don't allow replace when the edit control is read only + bHandled = FALSE; + } + + return 0; + } + +// Operations (overrideable) + TFindReplaceDialog* CreateFindReplaceDialog(BOOL bFindOnly, // TRUE for Find, FALSE for FindReplace + LPCTSTR lpszFindWhat, + LPCTSTR lpszReplaceWith = NULL, + DWORD dwFlags = FR_DOWN, + HWND hWndParent = NULL) + { + // You can override all of this in a derived class + + TFindReplaceDialog* findReplaceDialog = new TFindReplaceDialog(); + if(findReplaceDialog == NULL) + { + ::MessageBeep(MB_ICONHAND); + } + else + { + HWND hWndFindReplace = findReplaceDialog->Create(bFindOnly, + lpszFindWhat, lpszReplaceWith, dwFlags, hWndParent); + if(hWndFindReplace == NULL) + { + delete findReplaceDialog; + findReplaceDialog = NULL; + } + else + { + findReplaceDialog->SetActiveWindow(); + findReplaceDialog->ShowWindow(SW_SHOW); + } + } + + return findReplaceDialog; + } + + void AdjustDialogPosition(HWND hWndDialog) + { + ATLASSERT((hWndDialog != NULL) && ::IsWindow(hWndDialog)); + + T* pT = static_cast(this); + LONG nStartChar = 0, nEndChar = 0; + // Send EM_GETSEL so we can use both Edit and RichEdit + // (CEdit::GetSel uses int&, and CRichEditCtrlT::GetSel uses LONG&) + ::SendMessage(pT->m_hWnd, EM_GETSEL, (WPARAM)&nStartChar, (LPARAM)&nEndChar); + POINT point = pT->PosFromChar(nStartChar); + ::ClientToScreen(pT->GetParent(), &point); + CRect rect; + ::GetWindowRect(hWndDialog, &rect); + if(rect.PtInRect(point)) + { + if(point.y > rect.Height()) + { + rect.OffsetRect(0, point.y - rect.bottom - 20); + } + else + { + int nVertExt = GetSystemMetrics(SM_CYSCREEN); + if(point.y + rect.Height() < nVertExt) + rect.OffsetRect(0, 40 + point.y - rect.top); + } + + ::MoveWindow(hWndDialog, rect.left, rect.top, rect.Width(), rect.Height(), TRUE); + } + } + + DWORD GetFindReplaceDialogFlags(void) const + { + DWORD dwFlags = 0; + + if(m_bFindDown) + dwFlags |= FR_DOWN; + if(m_bMatchCase) + dwFlags |= FR_MATCHCASE; + if(m_bWholeWord) + dwFlags |= FR_WHOLEWORD; + + return dwFlags; + } + + void FindReplace(BOOL bFindOnly) + { + T* pT = static_cast(this); + m_bFirstSearch = TRUE; + if(m_pFindReplaceDialog != NULL) + { + if(m_bFindOnly == bFindOnly) + { + m_pFindReplaceDialog->SetActiveWindow(); + m_pFindReplaceDialog->ShowWindow(SW_SHOW); + return; + } + else + { + m_pFindReplaceDialog->SendMessage(WM_CLOSE); + ATLASSERT(m_pFindReplaceDialog == NULL); + } + } + + ATLASSERT(m_pFindReplaceDialog == NULL); + + _CSTRING_NS::CString findNext; + pT->GetSelText(findNext); + // if selection is empty or spans multiple lines use old find text + if(findNext.IsEmpty() || (findNext.FindOneOf(_T("\n\r")) != -1)) + findNext = m_sFindNext; + _CSTRING_NS::CString replaceWith = m_sReplaceWith; + DWORD dwFlags = pT->GetFindReplaceDialogFlags(); + + m_pFindReplaceDialog = pT->CreateFindReplaceDialog(bFindOnly, + findNext, replaceWith, dwFlags, pT->operator HWND()); + ATLASSERT(m_pFindReplaceDialog != NULL); + if(m_pFindReplaceDialog != NULL) + m_bFindOnly = bFindOnly; + } + + BOOL SameAsSelected(LPCTSTR lpszCompare, BOOL bMatchCase, BOOL /*bWholeWord*/) + { + T* pT = static_cast(this); + + // check length first + size_t nLen = lstrlen(lpszCompare); + LONG nStartChar = 0, nEndChar = 0; + // Send EM_GETSEL so we can use both Edit and RichEdit + // (CEdit::GetSel uses int&, and CRichEditCtrlT::GetSel uses LONG&) + ::SendMessage(pT->m_hWnd, EM_GETSEL, (WPARAM)&nStartChar, (LPARAM)&nEndChar); + if(nLen != (size_t)(nEndChar - nStartChar)) + return FALSE; + + // length is the same, check contents + _CSTRING_NS::CString selectedText; + pT->GetSelText(selectedText); + + return (bMatchCase && selectedText.Compare(lpszCompare) == 0) || + (!bMatchCase && selectedText.CompareNoCase(lpszCompare) == 0); + } + + void TextNotFound(LPCTSTR lpszFind) + { + T* pT = static_cast(this); + m_bFirstSearch = TRUE; + pT->OnTextNotFound(lpszFind); + } + + _CSTRING_NS::CString GetTranslationText(enum TranslationTextItem eItem) const + { + _CSTRING_NS::CString text; + switch(eItem) + { + case eText_OnReplaceAllMessage: + text = _T("Replaced %d occurances of \"%s\" with \"%s\""); + break; + case eText_OnReplaceAllTitle: + text = _T("Replace All"); + break; + case eText_OnTextNotFoundMessage: + text = _T("Unable to find the text \"%s\""); + break; + case eText_OnTextNotFoundTitle: + text = _T("Text not found"); + break; + } + + return text; + } + +// Overrideable Handlers + void OnFindNext(LPCTSTR lpszFind, BOOL bFindDown, BOOL bMatchCase, BOOL bWholeWord) + { + T* pT = static_cast(this); + + m_sFindNext = lpszFind; + m_bMatchCase = bMatchCase; + m_bWholeWord = bWholeWord; + m_bFindDown = bFindDown; + + if(!pT->FindTextSimple(m_sFindNext, m_bMatchCase, m_bWholeWord, m_bFindDown)) + pT->TextNotFound(m_sFindNext); + else + pT->AdjustDialogPosition(m_pFindReplaceDialog->operator HWND()); + } + + void OnReplaceSel(LPCTSTR lpszFind, BOOL bFindDown, BOOL bMatchCase, BOOL bWholeWord, LPCTSTR lpszReplace) + { + T* pT = static_cast(this); + + m_sFindNext = lpszFind; + m_sReplaceWith = lpszReplace; + m_bMatchCase = bMatchCase; + m_bWholeWord = bWholeWord; + m_bFindDown = bFindDown; + + if(pT->SameAsSelected(m_sFindNext, m_bMatchCase, m_bWholeWord)) + pT->ReplaceSel(m_sReplaceWith); + + if(!pT->FindTextSimple(m_sFindNext, m_bMatchCase, m_bWholeWord, m_bFindDown)) + pT->TextNotFound(m_sFindNext); + else + pT->AdjustDialogPosition(m_pFindReplaceDialog->operator HWND()); + } + + void OnReplaceAll(LPCTSTR lpszFind, LPCTSTR lpszReplace, BOOL bMatchCase, BOOL bWholeWord) + { + T* pT = static_cast(this); + + m_sFindNext = lpszFind; + m_sReplaceWith = lpszReplace; + m_bMatchCase = bMatchCase; + m_bWholeWord = bWholeWord; + m_bFindDown = TRUE; + + // no selection or different than what looking for + if(!pT->SameAsSelected(m_sFindNext, m_bMatchCase, m_bWholeWord)) + { + if(!pT->FindTextSimple(m_sFindNext, m_bMatchCase, m_bWholeWord, m_bFindDown)) + { + pT->TextNotFound(m_sFindNext); + return; + } + } + + pT->OnReplaceAllCoreBegin(); + + int replaceCount=0; + do + { + ++replaceCount; + pT->ReplaceSel(m_sReplaceWith); + } while(pT->FindTextSimple(m_sFindNext, m_bMatchCase, m_bWholeWord, m_bFindDown)); + + pT->OnReplaceAllCoreEnd(replaceCount); + } + + void OnReplaceAllCoreBegin() + { + T* pT = static_cast(this); + + m_hOldCursor = ::SetCursor(::LoadCursor(NULL, IDC_WAIT)); + + pT->HideSelection(TRUE, FALSE); + + } + + void OnReplaceAllCoreEnd(int replaceCount) + { + T* pT = static_cast(this); + pT->HideSelection(FALSE, FALSE); + + ::SetCursor(m_hOldCursor); + + _CSTRING_NS::CString message = pT->GetTranslationText(eText_OnReplaceAllMessage); + if(message.GetLength() > 0) + { + _CSTRING_NS::CString formattedMessage; + formattedMessage.Format(message, + replaceCount, m_sFindNext, m_sReplaceWith); + if(m_pFindReplaceDialog != NULL) + { + m_pFindReplaceDialog->MessageBox(formattedMessage, + pT->GetTranslationText(eText_OnReplaceAllTitle), + MB_OK | MB_ICONINFORMATION | MB_APPLMODAL); + } + else + { + pT->MessageBox(formattedMessage, + pT->GetTranslationText(eText_OnReplaceAllTitle), + MB_OK | MB_ICONINFORMATION | MB_APPLMODAL); + } + } + } + + void OnTextNotFound(LPCTSTR lpszFind) + { + T* pT = static_cast(this); + _CSTRING_NS::CString message = pT->GetTranslationText(eText_OnTextNotFoundMessage); + if(message.GetLength() > 0) + { + _CSTRING_NS::CString formattedMessage; + formattedMessage.Format(message, lpszFind); + if(m_pFindReplaceDialog != NULL) + { + m_pFindReplaceDialog->MessageBox(formattedMessage, + pT->GetTranslationText(eText_OnTextNotFoundTitle), + MB_OK | MB_ICONINFORMATION | MB_APPLMODAL); + } + else + { + pT->MessageBox(formattedMessage, + pT->GetTranslationText(eText_OnTextNotFoundTitle), + MB_OK | MB_ICONINFORMATION | MB_APPLMODAL); + } + } + else + { + ::MessageBeep(MB_ICONHAND); + } + } + + void OnTerminatingFindReplaceDialog(TFindReplaceDialog*& /*findReplaceDialog*/) + { + } +}; + + +/////////////////////////////////////////////////////////////////////////////// +// CEditFindReplaceImpl - Mixin class for implementing Find/Replace for CEdit +// based window classes. + +// Chain to CEditFindReplaceImpl message map. Your class must also derive from CEdit. +// Example: +// class CMyEdit : public CWindowImpl, +// public CEditFindReplaceImpl +// { +// public: +// BEGIN_MSG_MAP(CMyEdit) +// // your handlers... +// CHAIN_MSG_MAP_ALT(CEditFindReplaceImpl, 1) +// END_MSG_MAP() +// // other stuff... +// }; + +template +class CEditFindReplaceImpl : public CEditFindReplaceImplBase +{ +protected: + typedef CEditFindReplaceImpl thisClass; + typedef CEditFindReplaceImplBase baseClass; + +// Data members + LPTSTR m_pShadowBuffer; // Special shadow buffer only used in some cases. + UINT m_nShadowSize; + int m_bShadowBufferNeeded; // TRUE, FALSE, < 0 => Need to check + +public: +// Constructors + CEditFindReplaceImpl() : + m_pShadowBuffer(NULL), + m_nShadowSize(0), + m_bShadowBufferNeeded(-1) + { + } + + virtual ~CEditFindReplaceImpl() + { + if(m_pShadowBuffer != NULL) + { + delete [] m_pShadowBuffer; + m_pShadowBuffer = NULL; + } + } + +// Message Handlers + BEGIN_MSG_MAP(thisClass) + ALT_MSG_MAP(1) + CHAIN_MSG_MAP_ALT(baseClass, 1) + END_MSG_MAP() + +// Operations + // Supported only for RichEdit, so this does nothing for Edit + void HideSelection(BOOL /*bHide*/ = TRUE, BOOL /*bChangeStyle*/ = FALSE) + { + } + +// Operations (overrideable) + BOOL FindTextSimple(LPCTSTR lpszFind, BOOL bMatchCase, BOOL bWholeWord, BOOL bFindDown = TRUE) + { + T* pT = static_cast(this); + + ATLASSERT(lpszFind != NULL); + ATLASSERT(*lpszFind != _T('\0')); + + UINT nLen = pT->GetBufferLength(); + int nStartChar = 0, nEndChar = 0; + pT->GetSel(nStartChar, nEndChar); + UINT nStart = nStartChar; + int iDir = bFindDown ? +1 : -1; + + // can't find a match before the first character + if(nStart == 0 && iDir < 0) + return FALSE; + + LPCTSTR lpszText = pT->LockBuffer(); + + bool isDBCS = false; +#ifdef _MBCS + CPINFO info = { 0 }; + ::GetCPInfo(::GetOEMCP(), &info); + isDBCS = (info.MaxCharSize > 1); +#endif + + if(iDir < 0) + { + // always go back one for search backwards + nStart -= int((lpszText + nStart) - ::CharPrev(lpszText, lpszText + nStart)); + } + else if(nStartChar != nEndChar && pT->SameAsSelected(lpszFind, bMatchCase, bWholeWord)) + { + // easy to go backward/forward with SBCS +#ifndef _UNICODE + if(::IsDBCSLeadByte(lpszText[nStart])) + nStart++; +#endif + nStart += iDir; + } + + // handle search with nStart past end of buffer + UINT nLenFind = ::lstrlen(lpszFind); + if(nStart + nLenFind - 1 >= nLen) + { + if(iDir < 0 && nLen >= nLenFind) + { + if(isDBCS) + { + // walk back to previous character n times + nStart = nLen; + int n = nLenFind; + while(n--) + { + nStart -= int((lpszText + nStart) - ::CharPrev(lpszText, lpszText + nStart)); + } + } + else + { + // single-byte character set is easy and fast + nStart = nLen - nLenFind; + } + ATLASSERT(nStart + nLenFind - 1 <= nLen); + } + else + { + pT->UnlockBuffer(); + return FALSE; + } + } + + // start the search at nStart + LPCTSTR lpsz = lpszText + nStart; + typedef int (WINAPI* CompareProc)(LPCTSTR str1, LPCTSTR str2); + CompareProc pfnCompare = bMatchCase ? lstrcmp : lstrcmpi; + + if(isDBCS) + { + // double-byte string search + LPCTSTR lpszStop = NULL; + if(iDir > 0) + { + // start at current and find _first_ occurrance + lpszStop = lpszText + nLen - nLenFind + 1; + } + else + { + // start at top and find _last_ occurrance + lpszStop = lpsz; + lpsz = lpszText; + } + + LPCTSTR lpszFound = NULL; + while(lpsz <= lpszStop) + { +#ifndef _UNICODE + if(!bMatchCase || (*lpsz == *lpszFind && (!::IsDBCSLeadByte(*lpsz) || lpsz[1] == lpszFind[1]))) +#else + if(!bMatchCase || (*lpsz == *lpszFind && lpsz[1] == lpszFind[1])) +#endif + { + LPTSTR lpch = (LPTSTR)(lpsz + nLenFind); + TCHAR chSave = *lpch; + *lpch = _T('\0'); + int nResult = (*pfnCompare)(lpsz, lpszFind); + *lpch = chSave; + if(nResult == 0) + { + lpszFound = lpsz; + if(iDir > 0) + break; + } + } + lpsz = ::CharNext(lpsz); + } + pT->UnlockBuffer(); + + if(lpszFound != NULL) + { + int n = (int)(lpszFound - lpszText); + pT->SetSel(n, n + nLenFind); + return TRUE; + } + } + else + { + // single-byte string search + UINT nCompare; + if(iDir < 0) + nCompare = (UINT)(lpsz - lpszText) + 1; + else + nCompare = nLen - (UINT)(lpsz - lpszText) - nLenFind + 1; + + while(nCompare > 0) + { + ATLASSERT(lpsz >= lpszText); + ATLASSERT(lpsz + nLenFind - 1 <= lpszText + nLen - 1); + + LPSTR lpch = (LPSTR)(lpsz + nLenFind); + char chSave = *lpch; + *lpch = '\0'; + int nResult = (*pfnCompare)(lpsz, lpszFind); + *lpch = chSave; + if(nResult == 0) + { + pT->UnlockBuffer(); + int n = (int)(lpsz - lpszText); + pT->SetSel(n, n + nLenFind); + return TRUE; + } + + // restore character at end of search + *lpch = chSave; + + // move on to next substring + nCompare--; + lpsz += iDir; + } + pT->UnlockBuffer(); + } + + return FALSE; + } + + LPCTSTR LockBuffer() const + { + const T* pT = static_cast(this); + + ATLASSERT(pT->m_hWnd != NULL); + + BOOL useShadowBuffer = pT->UseShadowBuffer(); + if(useShadowBuffer) + { + if(m_pShadowBuffer == NULL || pT->GetModify()) + { + ATLASSERT(m_pShadowBuffer != NULL || m_nShadowSize == 0); + UINT nSize = pT->GetWindowTextLength() + 1; + if(nSize > m_nShadowSize) + { + // need more room for shadow buffer + T* pThisNoConst = const_cast(pT); + delete[] m_pShadowBuffer; + pThisNoConst->m_pShadowBuffer = NULL; + pThisNoConst->m_nShadowSize = 0; + pThisNoConst->m_pShadowBuffer = new TCHAR[nSize]; + pThisNoConst->m_nShadowSize = nSize; + } + + // update the shadow buffer with GetWindowText + ATLASSERT(m_nShadowSize >= nSize); + ATLASSERT(m_pShadowBuffer != NULL); + pT->GetWindowText(m_pShadowBuffer, nSize); + } + + return m_pShadowBuffer; + } + + HLOCAL hLocal = pT->GetHandle(); + ATLASSERT(hLocal != NULL); + LPCTSTR lpszText = (LPCTSTR)::LocalLock(hLocal); + ATLASSERT(lpszText != NULL); + + return lpszText; + } + + void UnlockBuffer() const + { + const T* pT = static_cast(this); + + ATLASSERT(pT->m_hWnd != NULL); + + BOOL useShadowBuffer = pT->UseShadowBuffer(); + if(!useShadowBuffer) + { + HLOCAL hLocal = pT->GetHandle(); + ATLASSERT(hLocal != NULL); + ::LocalUnlock(hLocal); + } + } + + UINT GetBufferLength() const + { + const T* pT = static_cast(this); + + ATLASSERT(pT->m_hWnd != NULL); + UINT nLen = 0; + LPCTSTR lpszText = pT->LockBuffer(); + if(lpszText != NULL) + nLen = ::lstrlen(lpszText); + pT->UnlockBuffer(); + + return nLen; + } + + LONG EndOfLine(LPCTSTR lpszText, UINT nLen, UINT nIndex) const + { + LPCTSTR lpsz = lpszText + nIndex; + LPCTSTR lpszStop = lpszText + nLen; + while(lpsz < lpszStop && *lpsz != _T('\r')) + ++lpsz; + return LONG(lpsz - lpszText); + } + + LONG GetSelText(_CSTRING_NS::CString& strText) const + { + const T* pT = static_cast(this); + + int nStartChar = 0, nEndChar = 0; + pT->GetSel(nStartChar, nEndChar); + ATLASSERT((UINT)nEndChar <= pT->GetBufferLength()); + LPCTSTR lpszText = pT->LockBuffer(); + LONG nLen = pT->EndOfLine(lpszText, nEndChar, nStartChar) - nStartChar; + SecureHelper::memcpy_x(strText.GetBuffer(nLen), nLen * sizeof(TCHAR), lpszText + nStartChar, nLen * sizeof(TCHAR)); + strText.ReleaseBuffer(nLen); + pT->UnlockBuffer(); + + return nLen; + } + + BOOL UseShadowBuffer(void) const + { + const T* pT = static_cast(this); + + if(pT->m_bShadowBufferNeeded < 0) + { + T* pThisNoConst = const_cast(pT); + + OSVERSIONINFO ovi = { 0 }; + ovi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + ::GetVersionEx(&ovi); + + bool bWin9x = (ovi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS); + if(bWin9x) + { + // Windows 95, 98, ME + // Under Win9x, it is necessary to maintain a shadow buffer. + // It is only updated when the control contents have been changed. + pThisNoConst->m_bShadowBufferNeeded = TRUE; + } + else + { + // Windows NT, 2000, XP, etc. + pThisNoConst->m_bShadowBufferNeeded = FALSE; + +#ifndef _UNICODE + // On Windows XP (or later), if common controls version 6 is in use + // (such as via theming), then EM_GETHANDLE will always return a UNICODE string. + // If theming is enabled and Common Controls version 6 is in use, + // you're really not suppose to superclass or subclass common controls + // with an ANSI windows procedure (so its best to only theme if you use UNICODE). + // Using a shadow buffer uses GetWindowText instead, so it solves + // this problem for us (although it makes it a little less efficient). + + if((ovi.dwMajorVersion == 5 && ovi.dwMinorVersion >= 1) || (ovi.dwMajorVersion > 5)) + { + // We use DLLVERSIONINFO_private so we don't have to depend on shlwapi.h + typedef struct _DLLVERSIONINFO_private + { + DWORD cbSize; + DWORD dwMajorVersion; + DWORD dwMinorVersion; + DWORD dwBuildNumber; + DWORD dwPlatformID; + } DLLVERSIONINFO_private; + + HMODULE hModule = ::LoadLibrary("comctl32.dll"); + if(hModule != NULL) + { + typedef HRESULT (CALLBACK *LPFN_DllGetVersion)(DLLVERSIONINFO_private *); + LPFN_DllGetVersion fnDllGetVersion = (LPFN_DllGetVersion)::GetProcAddress(hModule, "DllGetVersion"); + if(fnDllGetVersion != NULL) + { + DLLVERSIONINFO_private version = { 0 }; + version.cbSize = sizeof(DLLVERSIONINFO_private); + if(SUCCEEDED(fnDllGetVersion(&version))) + { + if(version.dwMajorVersion >= 6) + { + pThisNoConst->m_bShadowBufferNeeded = TRUE; + + ATLTRACE2(atlTraceUI, 0, _T("Warning: You have compiled for MBCS/ANSI but are using common controls version 6 or later (likely through a manifest file).\r\n")); + ATLTRACE2(atlTraceUI, 0, _T("If you use common controls version 6 or later, you should only do so for UNICODE builds.\r\n")); + } + } + } + + ::FreeLibrary(hModule); + hModule = NULL; + } + } +#endif // !_UNICODE + } + } + + return (pT->m_bShadowBufferNeeded == TRUE); + } +}; + + +/////////////////////////////////////////////////////////////////////////////// +// CRichEditFindReplaceImpl - Mixin class for implementing Find/Replace for CRichEditCtrl +// based window classes. + +// Chain to CRichEditFindReplaceImpl message map. Your class must also derive from CRichEditCtrl. +// Example: +// class CMyRichEdit : public CWindowImpl, +// public CRichEditFindReplaceImpl +// { +// public: +// BEGIN_MSG_MAP(CMyRichEdit) +// // your handlers... +// CHAIN_MSG_MAP_ALT(CRichEditFindReplaceImpl, 1) +// END_MSG_MAP() +// // other stuff... +// }; + +template +class CRichEditFindReplaceImpl : public CEditFindReplaceImplBase +{ +protected: + typedef CRichEditFindReplaceImpl thisClass; + typedef CEditFindReplaceImplBase baseClass; + +public: + BEGIN_MSG_MAP(thisClass) + ALT_MSG_MAP(1) + CHAIN_MSG_MAP_ALT(baseClass, 1) + END_MSG_MAP() + +// Operations (overrideable) + BOOL FindTextSimple(LPCTSTR lpszFind, BOOL bMatchCase, BOOL bWholeWord, BOOL bFindDown = TRUE) + { + T* pT = static_cast(this); + + ATLASSERT(lpszFind != NULL); + FINDTEXTEX ft = { 0 }; + + pT->GetSel(ft.chrg); + if(m_bFirstSearch) + { + if(bFindDown) + m_nInitialSearchPos = ft.chrg.cpMin; + else + m_nInitialSearchPos = ft.chrg.cpMax; + m_bFirstSearch = FALSE; + } + +#if (_RICHEDIT_VER >= 0x0200) + ft.lpstrText = (LPTSTR)lpszFind; +#else // !(_RICHEDIT_VER >= 0x0200) + USES_CONVERSION; + ft.lpstrText = T2A((LPTSTR)lpszFind); +#endif // !(_RICHEDIT_VER >= 0x0200) + + if(ft.chrg.cpMin != ft.chrg.cpMax) // i.e. there is a selection + { + if(bFindDown) + { + ft.chrg.cpMin++; + } + else + { + // won't wraparound backwards + ft.chrg.cpMin = max(ft.chrg.cpMin, 0); + } + } + + DWORD dwFlags = bMatchCase ? FR_MATCHCASE : 0; + dwFlags |= bWholeWord ? FR_WHOLEWORD : 0; + + ft.chrg.cpMax = pT->GetTextLength() + m_nInitialSearchPos; + + if(bFindDown) + { + if(m_nInitialSearchPos >= 0) + ft.chrg.cpMax = pT->GetTextLength(); + + dwFlags |= FR_DOWN; + ATLASSERT(ft.chrg.cpMax >= ft.chrg.cpMin); + } + else + { + if(m_nInitialSearchPos >= 0) + ft.chrg.cpMax = 0; + + dwFlags &= ~FR_DOWN; + ATLASSERT(ft.chrg.cpMax <= ft.chrg.cpMin); + } + + BOOL bRet = FALSE; + + if(pT->FindAndSelect(dwFlags, ft) != -1) + { + bRet = TRUE; // we found the text + } + else if(m_nInitialSearchPos > 0) + { + // if the original starting point was not the beginning + // of the buffer and we haven't already been here + if(bFindDown) + { + ft.chrg.cpMin = 0; + ft.chrg.cpMax = m_nInitialSearchPos; + } + else + { + ft.chrg.cpMin = pT->GetTextLength(); + ft.chrg.cpMax = m_nInitialSearchPos; + } + m_nInitialSearchPos = m_nInitialSearchPos - pT->GetTextLength(); + + bRet = (pT->FindAndSelect(dwFlags, ft) != -1) ? TRUE : FALSE; + } + + return bRet; + } + + long FindAndSelect(DWORD dwFlags, FINDTEXTEX& ft) + { + T* pT = static_cast(this); + LONG index = pT->FindText(dwFlags, ft); + if(index != -1) // i.e. we found something + pT->SetSel(ft.chrgText); + + return index; + } +}; + +}; // namespace WTL + +#endif // __ATLFIND_H__ diff --git a/Externals/WTL80/atlframe.h b/Externals/WTL80/atlframe.h new file mode 100644 index 0000000000..7eb102f8a4 --- /dev/null +++ b/Externals/WTL80/atlframe.h @@ -0,0 +1,3465 @@ +// Windows Template Library - WTL version 8.0 +// Copyright (C) Microsoft Corporation. All rights reserved. +// +// This file is a part of the Windows Template Library. +// The use and distribution terms for this software are covered by the +// Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php) +// which can be found in the file CPL.TXT at the root of this distribution. +// By using this software in any fashion, you are agreeing to be bound by +// the terms of this license. You must not remove this notice, or +// any other, from this software. + +#ifndef __ATLFRAME_H__ +#define __ATLFRAME_H__ + +#pragma once + +#ifndef __cplusplus + #error ATL requires C++ compilation (use a .cpp suffix) +#endif + +#ifndef __ATLAPP_H__ + #error atlframe.h requires atlapp.h to be included first +#endif + +#ifndef __ATLWIN_H__ + #error atlframe.h requires atlwin.h to be included first +#endif + + +/////////////////////////////////////////////////////////////////////////////// +// Classes in this file: +// +// CFrameWindowImpl +// CMDIWindow +// CMDIFrameWindowImpl +// CMDIChildWindowImpl +// COwnerDraw +// CUpdateUIBase +// CUpdateUI +// CDynamicUpdateUI +// CDialogResize +// CDoubleBufferImpl +// CDoubleBufferWindowImpl +// +// Global functions: +// AtlCreateSimpleToolBar() + + +namespace WTL +{ + +/////////////////////////////////////////////////////////////////////////////// +// CFrameWndClassInfo - Manages frame window Windows class information + +class CFrameWndClassInfo +{ +public: +#ifndef _WIN32_WCE + enum { cchAutoName = 5 + sizeof(void*) * 2 }; // sizeof(void*) * 2 is the number of digits %p outputs + WNDCLASSEX m_wc; +#else // CE specific + enum { cchAutoName = MAX_PATH }; // MAX_PATH because this can be set in the wizard generated CMainFrame::ActivatePreviousInstance to a user defined string. + WNDCLASS m_wc; +#endif // !_WIN32_WCE + LPCTSTR m_lpszOrigName; + WNDPROC pWndProc; + LPCTSTR m_lpszCursorID; + BOOL m_bSystemCursor; + ATOM m_atom; + TCHAR m_szAutoName[cchAutoName]; + UINT m_uCommonResourceID; + +#ifndef _WIN32_WCE + ATOM Register(WNDPROC* pProc) + { + if (m_atom == 0) + { + CWindowCreateCriticalSectionLock lock; + if(FAILED(lock.Lock())) + { + ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CFrameWndClassInfo::Register.\n")); + ATLASSERT(FALSE); + return 0; + } + + if(m_atom == 0) + { + HINSTANCE hInst = ModuleHelper::GetModuleInstance(); + + if (m_lpszOrigName != NULL) + { + ATLASSERT(pProc != NULL); + LPCTSTR lpsz = m_wc.lpszClassName; + WNDPROC proc = m_wc.lpfnWndProc; + + WNDCLASSEX wc = { 0 }; + wc.cbSize = sizeof(WNDCLASSEX); + // try process local class first + if(!::GetClassInfoEx(ModuleHelper::GetModuleInstance(), m_lpszOrigName, &wc)) + { + // try global class + if(!::GetClassInfoEx(NULL, m_lpszOrigName, &wc)) + { + lock.Unlock(); + return 0; + } + } + m_wc = wc; + pWndProc = m_wc.lpfnWndProc; + m_wc.lpszClassName = lpsz; + m_wc.lpfnWndProc = proc; + } + else + { + m_wc.hCursor = ::LoadCursor(m_bSystemCursor ? NULL : hInst, m_lpszCursorID); + } + + m_wc.hInstance = hInst; + m_wc.style &= ~CS_GLOBALCLASS; // we don't register global classes + if (m_wc.lpszClassName == NULL) + { +#if (_WIN32_WINNT >= 0x0500) || defined(_WIN64) + SecureHelper::wsprintf_x(m_szAutoName, cchAutoName, _T("ATL:%p"), &m_wc); +#else // !((_WIN32_WINNT >= 0x0500) || defined(_WIN64)) + SecureHelper::wsprintf_x(m_szAutoName, cchAutoName, _T("ATL:%8.8X"), (DWORD_PTR)&m_wc); +#endif // !((_WIN32_WINNT >= 0x0500) || defined(_WIN64)) + m_wc.lpszClassName = m_szAutoName; + } + + WNDCLASSEX wcTemp = m_wc; + m_atom = (ATOM)::GetClassInfoEx(m_wc.hInstance, m_wc.lpszClassName, &wcTemp); + if (m_atom == 0) + { + if(m_uCommonResourceID != 0) // use it if not zero + { + m_wc.hIcon = (HICON)::LoadImage(ModuleHelper::GetResourceInstance(), MAKEINTRESOURCE(m_uCommonResourceID), IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR); + m_wc.hIconSm = (HICON)::LoadImage(ModuleHelper::GetResourceInstance(), MAKEINTRESOURCE(m_uCommonResourceID), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR); + } + m_atom = ::RegisterClassEx(&m_wc); + } + } + + lock.Unlock(); + } + + if (m_lpszOrigName != NULL) + { + ATLASSERT(pProc != NULL); + ATLASSERT(pWndProc != NULL); + *pProc = pWndProc; + } + + return m_atom; + } +#else // CE specific + ATOM Register(WNDPROC* pProc) + { + if (m_atom == 0) + { + CWindowCreateCriticalSectionLock lock; + if(FAILED(lock.Lock())) + { + ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CFrameWndClassInfo::Register.\n")); + ATLASSERT(FALSE); + return 0; + } + + if(m_atom == 0) + { + HINSTANCE hInst = ModuleHelper::GetModuleInstance(); + + if (m_lpszOrigName != NULL) + { + ATLASSERT(pProc != NULL); + LPCTSTR lpsz = m_wc.lpszClassName; + WNDPROC proc = m_wc.lpfnWndProc; + + WNDCLASS wc = { 0 }; + // try process local class first + if(!::GetClassInfo(ModuleHelper::GetModuleInstance(), m_lpszOrigName, &wc)) + { + // try global class + if(!::GetClassInfo(NULL, m_lpszOrigName, &wc)) + { + lock.Unlock(); + return 0; + } + } + m_wc = wc; + pWndProc = m_wc.lpfnWndProc; + m_wc.lpszClassName = lpsz; + m_wc.lpfnWndProc = proc; + } + else + { +#if defined(GWES_CURSOR) || defined(GWES_MCURSOR) + m_wc.hCursor = ::LoadCursor(m_bSystemCursor ? NULL : hInst, m_lpszCursorID); +#else // !(defined(GWES_CURSOR) || defined(GWES_MCURSOR)) + m_wc.hCursor = NULL; +#endif // !(defined(GWES_CURSOR) || defined(GWES_MCURSOR)) + } + + m_wc.hInstance = hInst; + m_wc.style &= ~CS_GLOBALCLASS; // we don't register global classes + if (m_wc.lpszClassName == NULL) + { + wsprintf(m_szAutoName, _T("ATL:%8.8X"), (DWORD_PTR)&m_wc); + m_wc.lpszClassName = m_szAutoName; + } + + WNDCLASS wcTemp = m_wc; + m_atom = (ATOM)::GetClassInfo(m_wc.hInstance, m_wc.lpszClassName, &wcTemp); + if (m_atom == 0) + { + if(m_uCommonResourceID != 0) // use it if not zero + m_wc.hIcon = (HICON)::LoadImage(ModuleHelper::GetResourceInstance(), MAKEINTRESOURCE(m_uCommonResourceID), IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR); + m_atom = ::RegisterClass(&m_wc); + } + } + + lock.Unlock(); + } + + if (m_lpszOrigName != NULL) + { + ATLASSERT(pProc != NULL); + ATLASSERT(pWndProc != NULL); + *pProc = pWndProc; + } + + return m_atom; + } +#endif // _WIN32_WCE +}; + + +/////////////////////////////////////////////////////////////////////////////// +// Macros for declaring frame window WNDCLASS + +#ifndef _WIN32_WCE + +#define DECLARE_FRAME_WND_CLASS(WndClassName, uCommonResourceID) \ +static WTL::CFrameWndClassInfo& GetWndClassInfo() \ +{ \ + static WTL::CFrameWndClassInfo wc = \ + { \ + { sizeof(WNDCLASSEX), 0, StartWindowProc, \ + 0, 0, NULL, NULL, NULL, (HBRUSH)(COLOR_WINDOW + 1), NULL, WndClassName, NULL }, \ + NULL, NULL, IDC_ARROW, TRUE, 0, _T(""), uCommonResourceID \ + }; \ + return wc; \ +} + +#define DECLARE_FRAME_WND_CLASS_EX(WndClassName, uCommonResourceID, style, bkgnd) \ +static WTL::CFrameWndClassInfo& GetWndClassInfo() \ +{ \ + static WTL::CFrameWndClassInfo wc = \ + { \ + { sizeof(WNDCLASSEX), style, StartWindowProc, \ + 0, 0, NULL, NULL, NULL, (HBRUSH)(bkgnd + 1), NULL, WndClassName, NULL }, \ + NULL, NULL, IDC_ARROW, TRUE, 0, _T(""), uCommonResourceID \ + }; \ + return wc; \ +} + +#define DECLARE_FRAME_WND_SUPERCLASS(WndClassName, OrigWndClassName, uCommonResourceID) \ +static WTL::CFrameWndClassInfo& GetWndClassInfo() \ +{ \ + static WTL::CFrameWndClassInfo wc = \ + { \ + { sizeof(WNDCLASSEX), 0, StartWindowProc, \ + 0, 0, NULL, NULL, NULL, NULL, NULL, WndClassName, NULL }, \ + OrigWndClassName, NULL, NULL, TRUE, 0, _T(""), uCommonResourceID \ + }; \ + return wc; \ +} + +#else // CE specific + +#define DECLARE_FRAME_WND_CLASS(WndClassName, uCommonResourceID) \ +static WTL::CFrameWndClassInfo& GetWndClassInfo() \ +{ \ + static WTL::CFrameWndClassInfo wc = \ + { \ + { 0, StartWindowProc, \ + 0, 0, NULL, NULL, NULL, (HBRUSH)(COLOR_WINDOW + 1), NULL, WndClassName }, \ + NULL, NULL, IDC_ARROW, TRUE, 0, _T(""), uCommonResourceID \ + }; \ + return wc; \ +} + +#define DECLARE_FRAME_WND_CLASS_EX(WndClassName, uCommonResourceID, style, bkgnd) \ +static WTL::CFrameWndClassInfo& GetWndClassInfo() \ +{ \ + static WTL::CFrameWndClassInfo wc = \ + { \ + { style, StartWindowProc, \ + 0, 0, NULL, NULL, NULL, (HBRUSH)(bkgnd + 1), NULL, WndClassName }, \ + NULL, NULL, IDC_ARROW, TRUE, 0, _T(""), uCommonResourceID \ + }; \ + return wc; \ +} + +#define DECLARE_FRAME_WND_SUPERCLASS(WndClassName, OrigWndClassName, uCommonResourceID) \ +static WTL::CFrameWndClassInfo& GetWndClassInfo() \ +{ \ + static WTL::CFrameWndClassInfo wc = \ + { \ + { NULL, StartWindowProc, \ + 0, 0, NULL, NULL, NULL, NULL, NULL, WndClassName }, \ + OrigWndClassName, NULL, IDC_ARROW, TRUE, 0, _T(""), uCommonResourceID \ + }; \ + return wc; \ +} + +#endif // !_WIN32_WCE + + +/////////////////////////////////////////////////////////////////////////////// +// CFrameWindowImpl + +// Client window command chaining macro (only for frame windows) +#define CHAIN_CLIENT_COMMANDS() \ + if(uMsg == WM_COMMAND && m_hWndClient != NULL) \ + ::SendMessage(m_hWndClient, uMsg, wParam, lParam); + +// standard toolbar styles +#define ATL_SIMPLE_TOOLBAR_STYLE \ + (WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | TBSTYLE_TOOLTIPS) +// toolbar in a rebar pane +#define ATL_SIMPLE_TOOLBAR_PANE_STYLE \ + (WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | CCS_NODIVIDER | CCS_NORESIZE | CCS_NOPARENTALIGN | TBSTYLE_TOOLTIPS | TBSTYLE_FLAT) +// standard rebar styles +#if (_WIN32_IE >= 0x0400) + #define ATL_SIMPLE_REBAR_STYLE \ + (WS_CHILD | WS_VISIBLE | WS_BORDER | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | RBS_VARHEIGHT | RBS_BANDBORDERS | RBS_AUTOSIZE) +#else + #define ATL_SIMPLE_REBAR_STYLE \ + (WS_CHILD | WS_VISIBLE | WS_BORDER | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | RBS_VARHEIGHT | RBS_BANDBORDERS) +#endif // !(_WIN32_IE >= 0x0400) +// rebar without borders +#if (_WIN32_IE >= 0x0400) + #define ATL_SIMPLE_REBAR_NOBORDER_STYLE \ + (WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | RBS_VARHEIGHT | RBS_BANDBORDERS | RBS_AUTOSIZE | CCS_NODIVIDER) +#else + #define ATL_SIMPLE_REBAR_NOBORDER_STYLE \ + (WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | RBS_VARHEIGHT | RBS_BANDBORDERS | CCS_NODIVIDER) +#endif // !(_WIN32_IE >= 0x0400) + +// command bar support +#if !defined(__ATLCTRLW_H__) && !defined(_WIN32_WCE) + +#define CBRM_GETCMDBAR (WM_USER + 301) // returns command bar HWND +#define CBRM_GETMENU (WM_USER + 302) // returns loaded or attached menu +#define CBRM_TRACKPOPUPMENU (WM_USER + 303) // displays a popup menu + +struct _AtlFrameWnd_CmdBarPopupMenu +{ + int cbSize; + HMENU hMenu; + UINT uFlags; + int x; + int y; + LPTPMPARAMS lptpm; +}; + +#define CBRPOPUPMENU _AtlFrameWnd_CmdBarPopupMenu + +#endif // !defined(__ATLCTRLW_H__) && !defined(_WIN32_WCE) + + +template +class ATL_NO_VTABLE CFrameWindowImplBase : public ATL::CWindowImplBaseT< TBase, TWinTraits > +{ +public: + DECLARE_FRAME_WND_CLASS(NULL, 0) + +// Data members + HWND m_hWndToolBar; + HWND m_hWndStatusBar; + HWND m_hWndClient; + + HACCEL m_hAccel; + +#ifdef _WIN32_WCE + HWND m_hWndCECommandBar; +#endif // _WIN32_WCE + + struct _AtlToolBarData + { + WORD wVersion; + WORD wWidth; + WORD wHeight; + WORD wItemCount; + //WORD aItems[wItemCount] + + WORD* items() + { return (WORD*)(this+1); } + }; + +#if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) + struct _ChevronMenuInfo + { + HMENU hMenu; + LPNMREBARCHEVRON lpnm; + bool bCmdBar; + }; +#endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) + +// Constructor + CFrameWindowImplBase() : +#ifdef _WIN32_WCE + m_hWndCECommandBar(NULL), +#endif // _WIN32_WCE + m_hWndToolBar(NULL), + m_hWndStatusBar(NULL), + m_hWndClient(NULL), + m_hAccel(NULL) + { } + +// Methods + HWND Create(HWND hWndParent, ATL::_U_RECT rect, LPCTSTR szWindowName, DWORD dwStyle, DWORD dwExStyle, ATL::_U_MENUorID MenuOrID, ATOM atom, LPVOID lpCreateParam) + { + ATLASSERT(m_hWnd == NULL); + + if(atom == 0) + return NULL; + + ModuleHelper::AddCreateWndData(&m_thunk.cd, this); + + if(MenuOrID.m_hMenu == NULL && (dwStyle & WS_CHILD)) + MenuOrID.m_hMenu = (HMENU)(UINT_PTR)this; + if(rect.m_lpRect == NULL) + rect.m_lpRect = &TBase::rcDefault; + + HWND hWnd = ::CreateWindowEx(dwExStyle, MAKEINTATOM(atom), szWindowName, + dwStyle, rect.m_lpRect->left, rect.m_lpRect->top, rect.m_lpRect->right - rect.m_lpRect->left, + rect.m_lpRect->bottom - rect.m_lpRect->top, hWndParent, MenuOrID.m_hMenu, + ModuleHelper::GetModuleInstance(), lpCreateParam); + + ATLASSERT(hWnd == NULL || m_hWnd == hWnd); + + return hWnd; + } + + static HWND CreateSimpleToolBarCtrl(HWND hWndParent, UINT nResourceID, BOOL bInitialSeparator = FALSE, + DWORD dwStyle = ATL_SIMPLE_TOOLBAR_STYLE, UINT nID = ATL_IDW_TOOLBAR) + { + HINSTANCE hInst = ModuleHelper::GetResourceInstance(); + HRSRC hRsrc = ::FindResource(hInst, MAKEINTRESOURCE(nResourceID), RT_TOOLBAR); + if (hRsrc == NULL) + return NULL; + + HGLOBAL hGlobal = ::LoadResource(hInst, hRsrc); + if (hGlobal == NULL) + return NULL; + + _AtlToolBarData* pData = (_AtlToolBarData*)::LockResource(hGlobal); + if (pData == NULL) + return NULL; + ATLASSERT(pData->wVersion == 1); + + WORD* pItems = pData->items(); + int nItems = pData->wItemCount + (bInitialSeparator ? 1 : 0); + CTempBuffer buff; + TBBUTTON* pTBBtn = buff.Allocate(nItems); + ATLASSERT(pTBBtn != NULL); + if(pTBBtn == NULL) + return NULL; + + const int cxSeparator = 8; + + // set initial separator (half width) + if(bInitialSeparator) + { + pTBBtn[0].iBitmap = cxSeparator / 2; + pTBBtn[0].idCommand = 0; + pTBBtn[0].fsState = 0; + pTBBtn[0].fsStyle = TBSTYLE_SEP; + pTBBtn[0].dwData = 0; + pTBBtn[0].iString = 0; + } + + int nBmp = 0; + for(int i = 0, j = bInitialSeparator ? 1 : 0; i < pData->wItemCount; i++, j++) + { + if(pItems[i] != 0) + { + pTBBtn[j].iBitmap = nBmp++; + pTBBtn[j].idCommand = pItems[i]; + pTBBtn[j].fsState = TBSTATE_ENABLED; + pTBBtn[j].fsStyle = TBSTYLE_BUTTON; + pTBBtn[j].dwData = 0; + pTBBtn[j].iString = 0; + } + else + { + pTBBtn[j].iBitmap = cxSeparator; + pTBBtn[j].idCommand = 0; + pTBBtn[j].fsState = 0; + pTBBtn[j].fsStyle = TBSTYLE_SEP; + pTBBtn[j].dwData = 0; + pTBBtn[j].iString = 0; + } + } + +#ifndef _WIN32_WCE + HWND hWnd = ::CreateWindowEx(0, TOOLBARCLASSNAME, NULL, dwStyle, 0, 0, 100, 100, hWndParent, (HMENU)LongToHandle(nID), ModuleHelper::GetModuleInstance(), NULL); + if(hWnd == NULL) + { + ATLASSERT(FALSE); + return NULL; + } +#else // CE specific + dwStyle; + nID; + // The toolbar must go onto the existing CommandBar or MenuBar + HWND hWnd = hWndParent; +#endif // _WIN32_WCE + + ::SendMessage(hWnd, TB_BUTTONSTRUCTSIZE, sizeof(TBBUTTON), 0L); + + // check if font is taller than our bitmaps + CFontHandle font = (HFONT)::SendMessage(hWnd, WM_GETFONT, 0, 0L); + if(font.IsNull()) + font = AtlGetDefaultGuiFont(); + LOGFONT lf = { 0 }; + font.GetLogFont(lf); + WORD cyFontHeight = (WORD)abs(lf.lfHeight); + +#ifndef _WIN32_WCE + WORD bitsPerPixel = AtlGetBitmapResourceBitsPerPixel(nResourceID); + if(bitsPerPixel > 4) + { + COLORREF crMask = CLR_DEFAULT; + if(bitsPerPixel == 32) + { + // 32-bit color bitmap with alpha channel (valid for Windows XP and later) + crMask = CLR_NONE; + } + HIMAGELIST hImageList = ImageList_LoadImage(ModuleHelper::GetResourceInstance(), MAKEINTRESOURCE(nResourceID), pData->wWidth, 1, crMask, IMAGE_BITMAP, LR_CREATEDIBSECTION | LR_DEFAULTSIZE); + ATLASSERT(hImageList != NULL); + ::SendMessage(hWnd, TB_SETIMAGELIST, 0, (LPARAM)hImageList); + } + else +#endif // !_WIN32_WCE + { + TBADDBITMAP tbab = { 0 }; + tbab.hInst = hInst; + tbab.nID = nResourceID; + ::SendMessage(hWnd, TB_ADDBITMAP, nBmp, (LPARAM)&tbab); + } + + ::SendMessage(hWnd, TB_ADDBUTTONS, nItems, (LPARAM)pTBBtn); + ::SendMessage(hWnd, TB_SETBITMAPSIZE, 0, MAKELONG(pData->wWidth, max(pData->wHeight, cyFontHeight))); + const int cxyButtonMargin = 7; + ::SendMessage(hWnd, TB_SETBUTTONSIZE, 0, MAKELONG(pData->wWidth + cxyButtonMargin, max(pData->wHeight, cyFontHeight) + cxyButtonMargin)); + + return hWnd; + } + +#ifndef _WIN32_WCE + static HWND CreateSimpleReBarCtrl(HWND hWndParent, DWORD dwStyle = ATL_SIMPLE_REBAR_STYLE, UINT nID = ATL_IDW_TOOLBAR) + { + // Ensure style combinations for proper rebar painting + if(dwStyle & CCS_NODIVIDER && dwStyle & WS_BORDER) + dwStyle &= ~WS_BORDER; + else if(!(dwStyle & WS_BORDER) && !(dwStyle & CCS_NODIVIDER)) + dwStyle |= CCS_NODIVIDER; + + // Create rebar window + HWND hWndReBar = ::CreateWindowEx(0, REBARCLASSNAME, NULL, dwStyle, 0, 0, 100, 100, hWndParent, (HMENU)LongToHandle(nID), ModuleHelper::GetModuleInstance(), NULL); + if(hWndReBar == NULL) + { + ATLTRACE2(atlTraceUI, 0, _T("Failed to create rebar.\n")); + return NULL; + } + + // Initialize and send the REBARINFO structure + REBARINFO rbi = { 0 }; + rbi.cbSize = sizeof(REBARINFO); + rbi.fMask = 0; + if(!::SendMessage(hWndReBar, RB_SETBARINFO, 0, (LPARAM)&rbi)) + { + ATLTRACE2(atlTraceUI, 0, _T("Failed to initialize rebar.\n")); + ::DestroyWindow(hWndReBar); + return NULL; + } + + return hWndReBar; + } + + BOOL CreateSimpleReBar(DWORD dwStyle = ATL_SIMPLE_REBAR_STYLE, UINT nID = ATL_IDW_TOOLBAR) + { + ATLASSERT(!::IsWindow(m_hWndToolBar)); + m_hWndToolBar = CreateSimpleReBarCtrl(m_hWnd, dwStyle, nID); + return (m_hWndToolBar != NULL); + } + + static BOOL AddSimpleReBarBandCtrl(HWND hWndReBar, HWND hWndBand, int nID = 0, LPCTSTR lpstrTitle = NULL, BOOL bNewRow = FALSE, int cxWidth = 0, BOOL bFullWidthAlways = FALSE) + { + ATLASSERT(::IsWindow(hWndReBar)); // must be already created +#ifdef _DEBUG + // block - check if this is really a rebar + { + TCHAR lpszClassName[sizeof(REBARCLASSNAME)] = { 0 }; + ::GetClassName(hWndReBar, lpszClassName, sizeof(REBARCLASSNAME)); + ATLASSERT(lstrcmp(lpszClassName, REBARCLASSNAME) == 0); + } +#endif // _DEBUG + ATLASSERT(::IsWindow(hWndBand)); // must be already created + + // Get number of buttons on the toolbar + int nBtnCount = (int)::SendMessage(hWndBand, TB_BUTTONCOUNT, 0, 0L); + + // Set band info structure + REBARBANDINFO rbBand = { RunTimeHelper::SizeOf_REBARBANDINFO() }; +#if (_WIN32_IE >= 0x0400) + rbBand.fMask = RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_STYLE | RBBIM_ID | RBBIM_SIZE | RBBIM_IDEALSIZE; +#else + rbBand.fMask = RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_STYLE | RBBIM_ID | RBBIM_SIZE; +#endif // !(_WIN32_IE >= 0x0400) + if(lpstrTitle != NULL) + rbBand.fMask |= RBBIM_TEXT; + rbBand.fStyle = RBBS_CHILDEDGE; +#if (_WIN32_IE >= 0x0500) + if(nBtnCount > 0) // add chevron style for toolbar with buttons + rbBand.fStyle |= RBBS_USECHEVRON; +#endif // (_WIN32_IE >= 0x0500) + if(bNewRow) + rbBand.fStyle |= RBBS_BREAK; + + rbBand.lpText = (LPTSTR)lpstrTitle; + rbBand.hwndChild = hWndBand; + if(nID == 0) // calc band ID + nID = ATL_IDW_BAND_FIRST + (int)::SendMessage(hWndReBar, RB_GETBANDCOUNT, 0, 0L); + rbBand.wID = nID; + + // Calculate the size of the band + BOOL bRet = FALSE; + RECT rcTmp = { 0 }; + if(nBtnCount > 0) + { + bRet = (BOOL)::SendMessage(hWndBand, TB_GETITEMRECT, nBtnCount - 1, (LPARAM)&rcTmp); + ATLASSERT(bRet); + rbBand.cx = (cxWidth != 0) ? cxWidth : rcTmp.right; + rbBand.cyMinChild = rcTmp.bottom - rcTmp.top; + if(bFullWidthAlways) + { + rbBand.cxMinChild = rbBand.cx; + } + else if(lpstrTitle == NULL) + { + bRet = (BOOL)::SendMessage(hWndBand, TB_GETITEMRECT, 0, (LPARAM)&rcTmp); + ATLASSERT(bRet); + rbBand.cxMinChild = rcTmp.right; + } + else + { + rbBand.cxMinChild = 0; + } + } + else // no buttons, either not a toolbar or really has no buttons + { + bRet = ::GetWindowRect(hWndBand, &rcTmp); + ATLASSERT(bRet); + rbBand.cx = (cxWidth != 0) ? cxWidth : (rcTmp.right - rcTmp.left); + rbBand.cxMinChild = bFullWidthAlways ? rbBand.cx : 0; + rbBand.cyMinChild = rcTmp.bottom - rcTmp.top; + } + +#if (_WIN32_IE >= 0x0400) + rbBand.cxIdeal = rbBand.cx; +#endif // (_WIN32_IE >= 0x0400) + + // Add the band + LRESULT lRes = ::SendMessage(hWndReBar, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbBand); + if(lRes == 0) + { + ATLTRACE2(atlTraceUI, 0, _T("Failed to add a band to the rebar.\n")); + return FALSE; + } + +#if (_WIN32_IE >= 0x0501) + DWORD dwExStyle = (DWORD)::SendMessage(hWndBand, TB_GETEXTENDEDSTYLE, 0, 0L); + ::SendMessage(hWndBand, TB_SETEXTENDEDSTYLE, 0, dwExStyle | TBSTYLE_EX_HIDECLIPPEDBUTTONS); +#endif // (_WIN32_IE >= 0x0501) + + return TRUE; + } + + BOOL AddSimpleReBarBand(HWND hWndBand, LPCTSTR lpstrTitle = NULL, BOOL bNewRow = FALSE, int cxWidth = 0, BOOL bFullWidthAlways = FALSE) + { + ATLASSERT(::IsWindow(m_hWndToolBar)); // must be an existing rebar + ATLASSERT(::IsWindow(hWndBand)); // must be created + return AddSimpleReBarBandCtrl(m_hWndToolBar, hWndBand, 0, lpstrTitle, bNewRow, cxWidth, bFullWidthAlways); + } + +#if (_WIN32_IE >= 0x0400) + void SizeSimpleReBarBands() + { + ATLASSERT(::IsWindow(m_hWndToolBar)); // must be an existing rebar + + int nCount = (int)::SendMessage(m_hWndToolBar, RB_GETBANDCOUNT, 0, 0L); + + for(int i = 0; i < nCount; i++) + { + REBARBANDINFO rbBand = { RunTimeHelper::SizeOf_REBARBANDINFO() }; + rbBand.fMask = RBBIM_SIZE; + BOOL bRet = (BOOL)::SendMessage(m_hWndToolBar, RB_GETBANDINFO, i, (LPARAM)&rbBand); + ATLASSERT(bRet); + RECT rect = { 0, 0, 0, 0 }; + ::SendMessage(m_hWndToolBar, RB_GETBANDBORDERS, i, (LPARAM)&rect); + rbBand.cx += rect.left + rect.right; + bRet = (BOOL)::SendMessage(m_hWndToolBar, RB_SETBANDINFO, i, (LPARAM)&rbBand); + ATLASSERT(bRet); + } + } +#endif // (_WIN32_IE >= 0x0400) +#endif // _WIN32_WCE + +#ifndef _WIN32_WCE + BOOL CreateSimpleStatusBar(LPCTSTR lpstrText, DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | SBARS_SIZEGRIP, UINT nID = ATL_IDW_STATUS_BAR) +#else // CE specific + BOOL CreateSimpleStatusBar(LPCTSTR lpstrText, DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, UINT nID = ATL_IDW_STATUS_BAR) +#endif // _WIN32_WCE + { + ATLASSERT(!::IsWindow(m_hWndStatusBar)); + m_hWndStatusBar = ::CreateStatusWindow(dwStyle, lpstrText, m_hWnd, nID); + return (m_hWndStatusBar != NULL); + } + +#ifndef _WIN32_WCE + BOOL CreateSimpleStatusBar(UINT nTextID = ATL_IDS_IDLEMESSAGE, DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | SBARS_SIZEGRIP, UINT nID = ATL_IDW_STATUS_BAR) +#else // CE specific + BOOL CreateSimpleStatusBar(UINT nTextID = ATL_IDS_IDLEMESSAGE, DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, UINT nID = ATL_IDW_STATUS_BAR) +#endif // _WIN32_WCE + { + const int cchMax = 128; // max text length is 127 for status bars (+1 for null) + TCHAR szText[cchMax]; + szText[0] = 0; + ::LoadString(ModuleHelper::GetResourceInstance(), nTextID, szText, cchMax); + return CreateSimpleStatusBar(szText, dwStyle, nID); + } + +#ifdef _WIN32_WCE + BOOL CreateSimpleCECommandBar(LPTSTR pszMenu = NULL, WORD iButton = 0, DWORD dwFlags = 0, int nCmdBarID = 1) + { + ATLASSERT(m_hWndCECommandBar == NULL); + ATLASSERT(m_hWndToolBar == NULL); + + m_hWndCECommandBar = ::CommandBar_Create(ModuleHelper::GetModuleInstance(), m_hWnd, nCmdBarID); + if(m_hWndCECommandBar == NULL) + return FALSE; + + m_hWndToolBar = m_hWndCECommandBar; + + BOOL bRet = TRUE; + + if(pszMenu != NULL) + bRet &= ::CommandBar_InsertMenubarEx(m_hWndCECommandBar, IS_INTRESOURCE(pszMenu) ? ModuleHelper::GetResourceInstance() : NULL, pszMenu, iButton); + + bRet &= ::CommandBar_AddAdornments(m_hWndCECommandBar, dwFlags, 0); + + return bRet; + } + +#if defined(_AYGSHELL_H_) || defined(__AYGSHELL_H__) + BOOL CreateSimpleCEMenuBar(UINT nToolBarId = ATL_IDW_MENU_BAR, DWORD dwFlags = 0, int nBmpId = 0, int cBmpImages = 0) + { + ATLASSERT(m_hWndCECommandBar == NULL); + + SHMENUBARINFO mbi = { 0 }; + mbi.cbSize = sizeof(mbi); + mbi.hwndParent = m_hWnd; + mbi.dwFlags = dwFlags; + mbi.nToolBarId = nToolBarId; + mbi.hInstRes = ModuleHelper::GetResourceInstance(); + mbi.nBmpId = nBmpId; + mbi.cBmpImages = cBmpImages; + mbi.hwndMB = NULL; // This gets set by SHCreateMenuBar + + BOOL bRet = ::SHCreateMenuBar(&mbi); + if(bRet != FALSE) + { + m_hWndCECommandBar = mbi.hwndMB; + SizeToMenuBar(); + } + + return bRet; + } + + void SizeToMenuBar() // for menu bar only + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(::IsWindow(m_hWndCECommandBar)); + + RECT rect = { 0 }; + GetWindowRect(&rect); + RECT rectMB = { 0 }; + ::GetWindowRect(m_hWndCECommandBar, &rectMB); + int cy = ::IsWindowVisible(m_hWndCECommandBar) ? rectMB.top - rect.top : rectMB.bottom - rect.top; + SetWindowPos(NULL, 0, 0, rect.right - rect.left, cy, SWP_NOZORDER | SWP_NOMOVE); + } +#endif // defined(_AYGSHELL_H_) || defined(__AYGSHELL_H__) +#endif // _WIN32_WCE + + void UpdateLayout(BOOL bResizeBars = TRUE) + { + RECT rect = { 0 }; + GetClientRect(&rect); + + // position bars and offset their dimensions + UpdateBarsPosition(rect, bResizeBars); + + // resize client window + if(m_hWndClient != NULL) + ::SetWindowPos(m_hWndClient, NULL, rect.left, rect.top, + rect.right - rect.left, rect.bottom - rect.top, + SWP_NOZORDER | SWP_NOACTIVATE); + } + + void UpdateBarsPosition(RECT& rect, BOOL bResizeBars = TRUE) + { + // resize toolbar + if(m_hWndToolBar != NULL && ((DWORD)::GetWindowLong(m_hWndToolBar, GWL_STYLE) & WS_VISIBLE)) + { + if(bResizeBars) + { + ::SendMessage(m_hWndToolBar, WM_SIZE, 0, 0); + ::InvalidateRect(m_hWndToolBar, NULL, FALSE); + } + RECT rectTB = { 0 }; + ::GetWindowRect(m_hWndToolBar, &rectTB); + rect.top += rectTB.bottom - rectTB.top; + } + + // resize status bar + if(m_hWndStatusBar != NULL && ((DWORD)::GetWindowLong(m_hWndStatusBar, GWL_STYLE) & WS_VISIBLE)) + { + if(bResizeBars) + ::SendMessage(m_hWndStatusBar, WM_SIZE, 0, 0); + RECT rectSB = { 0 }; + ::GetWindowRect(m_hWndStatusBar, &rectSB); + rect.bottom -= rectSB.bottom - rectSB.top; + } + } + + BOOL PreTranslateMessage(MSG* pMsg) + { + if(m_hAccel != NULL && ::TranslateAccelerator(m_hWnd, m_hAccel, pMsg)) + return TRUE; + return FALSE; + } + + BEGIN_MSG_MAP(CFrameWindowImplBase) + MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground) +#ifndef _WIN32_WCE + MESSAGE_HANDLER(WM_MENUSELECT, OnMenuSelect) +#endif // !_WIN32_WCE + MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus) + MESSAGE_HANDLER(WM_DESTROY, OnDestroy) +#ifndef _WIN32_WCE + NOTIFY_CODE_HANDLER(TTN_GETDISPINFOA, OnToolTipTextA) + NOTIFY_CODE_HANDLER(TTN_GETDISPINFOW, OnToolTipTextW) +#endif // !_WIN32_WCE + END_MSG_MAP() + + LRESULT OnEraseBackground(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) + { + if(m_hWndClient != NULL) // view will paint itself instead + return 1; + + bHandled = FALSE; + return 0; + } + +#ifndef _WIN32_WCE + LRESULT OnMenuSelect(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled) + { + bHandled = FALSE; + + if(m_hWndStatusBar == NULL) + return 1; + + WORD wFlags = HIWORD(wParam); + if(wFlags == 0xFFFF && lParam == NULL) // menu closing + { + ::SendMessage(m_hWndStatusBar, SB_SIMPLE, FALSE, 0L); + } + else + { + const int cchBuff = 256; + TCHAR szBuff[cchBuff]; + szBuff[0] = 0; + if(!(wFlags & MF_POPUP)) + { + WORD wID = LOWORD(wParam); + // check for special cases + if(wID >= 0xF000 && wID < 0xF1F0) // system menu IDs + wID = (WORD)(((wID - 0xF000) >> 4) + ATL_IDS_SCFIRST); + else if(wID >= ID_FILE_MRU_FIRST && wID <= ID_FILE_MRU_LAST) // MRU items + wID = ATL_IDS_MRU_FILE; + else if(wID >= ATL_IDM_FIRST_MDICHILD && wID <= ATL_IDM_LAST_MDICHILD) // MDI child windows + wID = ATL_IDS_MDICHILD; + + int nRet = ::LoadString(ModuleHelper::GetResourceInstance(), wID, szBuff, cchBuff); + for(int i = 0; i < nRet; i++) + { + if(szBuff[i] == _T('\n')) + { + szBuff[i] = 0; + break; + } + } + } + ::SendMessage(m_hWndStatusBar, SB_SIMPLE, TRUE, 0L); + ::SendMessage(m_hWndStatusBar, SB_SETTEXT, (255 | SBT_NOBORDERS), (LPARAM)szBuff); + } + + return 1; + } +#endif // !_WIN32_WCE + + LRESULT OnSetFocus(UINT, WPARAM, LPARAM, BOOL& bHandled) + { + if(m_hWndClient != NULL) + ::SetFocus(m_hWndClient); + + bHandled = FALSE; + return 1; + } + + LRESULT OnDestroy(UINT, WPARAM, LPARAM, BOOL& bHandled) + { + if((GetStyle() & (WS_CHILD | WS_POPUP)) == 0) + ::PostQuitMessage(1); + + bHandled = FALSE; + return 1; + } + +#ifndef _WIN32_WCE + LRESULT OnToolTipTextA(int idCtrl, LPNMHDR pnmh, BOOL& /*bHandled*/) + { + LPNMTTDISPINFOA pDispInfo = (LPNMTTDISPINFOA)pnmh; + pDispInfo->szText[0] = 0; + + if((idCtrl != 0) && !(pDispInfo->uFlags & TTF_IDISHWND)) + { + const int cchBuff = 256; + char szBuff[cchBuff]; + szBuff[0] = 0; + int nRet = ::LoadStringA(ModuleHelper::GetResourceInstance(), idCtrl, szBuff, cchBuff); + for(int i = 0; i < nRet; i++) + { + if(szBuff[i] == '\n') + { + SecureHelper::strncpyA_x(pDispInfo->szText, _countof(pDispInfo->szText), &szBuff[i + 1], _TRUNCATE); + break; + } + } +#if (_WIN32_IE >= 0x0300) + if(nRet > 0) // string was loaded, save it + pDispInfo->uFlags |= TTF_DI_SETITEM; +#endif // (_WIN32_IE >= 0x0300) + } + + return 0; + } + + LRESULT OnToolTipTextW(int idCtrl, LPNMHDR pnmh, BOOL& /*bHandled*/) + { + LPNMTTDISPINFOW pDispInfo = (LPNMTTDISPINFOW)pnmh; + pDispInfo->szText[0] = 0; + + if((idCtrl != 0) && !(pDispInfo->uFlags & TTF_IDISHWND)) + { + const int cchBuff = 256; + wchar_t szBuff[cchBuff]; + szBuff[0] = 0; + int nRet = ::LoadStringW(ModuleHelper::GetResourceInstance(), idCtrl, szBuff, cchBuff); + for(int i = 0; i < nRet; i++) + { + if(szBuff[i] == L'\n') + { + SecureHelper::strncpyW_x(pDispInfo->szText, _countof(pDispInfo->szText), &szBuff[i + 1], _TRUNCATE); + break; + } + } +#if (_WIN32_IE >= 0x0300) + if(nRet > 0) // string was loaded, save it + pDispInfo->uFlags |= TTF_DI_SETITEM; +#endif // (_WIN32_IE >= 0x0300) + } + + return 0; + } +#endif // !_WIN32_WCE + +// Implementation - chevron menu support +#if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) + bool PrepareChevronMenu(_ChevronMenuInfo& cmi) + { + // get rebar and toolbar + REBARBANDINFO rbbi = { RunTimeHelper::SizeOf_REBARBANDINFO() }; + rbbi.fMask = RBBIM_CHILD; + BOOL bRet = (BOOL)::SendMessage(cmi.lpnm->hdr.hwndFrom, RB_GETBANDINFO, cmi.lpnm->uBand, (LPARAM)&rbbi); + ATLASSERT(bRet); + + // assume the band is a toolbar + ATL::CWindow wnd = rbbi.hwndChild; + int nCount = (int)wnd.SendMessage(TB_BUTTONCOUNT); + if(nCount <= 0) // probably not a toolbar + return false; + + // check if it's a command bar + CMenuHandle menuCmdBar = (HMENU)wnd.SendMessage(CBRM_GETMENU); + cmi.bCmdBar = (menuCmdBar.m_hMenu != NULL); + + // build a menu from hidden items + CMenuHandle menu; + bRet = menu.CreatePopupMenu(); + ATLASSERT(bRet); + RECT rcClient = { 0 }; + bRet = wnd.GetClientRect(&rcClient); + ATLASSERT(bRet); + for(int i = 0; i < nCount; i++) + { + TBBUTTON tbb = { 0 }; + bRet = (BOOL)wnd.SendMessage(TB_GETBUTTON, i, (LPARAM)&tbb); + ATLASSERT(bRet); + // skip hidden buttons + if((tbb.fsState & TBSTATE_HIDDEN) != 0) + continue; + RECT rcButton = { 0 }; + bRet = (BOOL)wnd.SendMessage(TB_GETITEMRECT, i, (LPARAM)&rcButton); + ATLASSERT(bRet); + bool bEnabled = ((tbb.fsState & TBSTATE_ENABLED) != 0); + if(rcButton.right > rcClient.right) + { + if(tbb.fsStyle & BTNS_SEP) + { + if(menu.GetMenuItemCount() > 0) + menu.AppendMenu(MF_SEPARATOR); + } + else if(cmi.bCmdBar) + { + const int cchBuff = 200; + TCHAR szBuff[cchBuff] = { 0 }; + CMenuItemInfo mii; + mii.fMask = MIIM_TYPE | MIIM_SUBMENU; + mii.dwTypeData = szBuff; + mii.cch = cchBuff; + bRet = menuCmdBar.GetMenuItemInfo(i, TRUE, &mii); + ATLASSERT(bRet); + // Note: CmdBar currently supports only drop-down items + ATLASSERT(::IsMenu(mii.hSubMenu)); + bRet = menu.AppendMenu(MF_STRING | MF_POPUP | (bEnabled ? MF_ENABLED : MF_GRAYED), (UINT_PTR)mii.hSubMenu, mii.dwTypeData); + ATLASSERT(bRet); + } + else + { + // get button's text + const int cchBuff = 200; + TCHAR szBuff[cchBuff] = { 0 }; + LPTSTR lpstrText = szBuff; + TBBUTTONINFO tbbi = { 0 }; + tbbi.cbSize = sizeof(TBBUTTONINFO); + tbbi.dwMask = TBIF_TEXT; + tbbi.pszText = szBuff; + tbbi.cchText = cchBuff; + if(wnd.SendMessage(TB_GETBUTTONINFO, tbb.idCommand, (LPARAM)&tbbi) == -1 || lstrlen(szBuff) == 0) + { + // no text for this button, try a resource string + lpstrText = _T(""); + int nRet = ::LoadString(ModuleHelper::GetResourceInstance(), tbb.idCommand, szBuff, cchBuff); + for(int n = 0; n < nRet; n++) + { + if(szBuff[n] == _T('\n')) + { + lpstrText = &szBuff[n + 1]; + break; + } + } + } + bRet = menu.AppendMenu(MF_STRING | (bEnabled ? MF_ENABLED : MF_GRAYED), tbb.idCommand, lpstrText); + ATLASSERT(bRet); + } + } + } + + if(menu.GetMenuItemCount() == 0) // no hidden buttons after all + { + menu.DestroyMenu(); + ::MessageBeep((UINT)-1); + return false; + } + + cmi.hMenu = menu; + return true; + } + + void DisplayChevronMenu(_ChevronMenuInfo& cmi) + { +#ifndef TPM_VERPOSANIMATION + const UINT TPM_VERPOSANIMATION = 0x1000L; // Menu animation flag +#endif + // convert chevron rect to screen coordinates + ATL::CWindow wndFrom = cmi.lpnm->hdr.hwndFrom; + POINT pt = { cmi.lpnm->rc.left, cmi.lpnm->rc.bottom }; + wndFrom.MapWindowPoints(NULL, &pt, 1); + RECT rc = cmi.lpnm->rc; + wndFrom.MapWindowPoints(NULL, &rc); + // set up flags and rect + UINT uMenuFlags = TPM_LEFTBUTTON | TPM_VERTICAL | TPM_LEFTALIGN | TPM_TOPALIGN | (!AtlIsOldWindows() ? TPM_VERPOSANIMATION : 0); + TPMPARAMS TPMParams = { 0 }; + TPMParams.cbSize = sizeof(TPMPARAMS); + TPMParams.rcExclude = rc; + // check if this window has a command bar + HWND hWndCmdBar = (HWND)::SendMessage(m_hWnd, CBRM_GETCMDBAR, 0, 0L); + if(::IsWindow(hWndCmdBar)) + { + CBRPOPUPMENU CBRPopupMenu = { sizeof(CBRPOPUPMENU), cmi.hMenu, uMenuFlags, pt.x, pt.y, &TPMParams }; + ::SendMessage(hWndCmdBar, CBRM_TRACKPOPUPMENU, 0, (LPARAM)&CBRPopupMenu); + } + else + { + CMenuHandle menu = cmi.hMenu; + menu.TrackPopupMenuEx(uMenuFlags, pt.x, pt.y, m_hWnd, &TPMParams); + } + } + + void CleanupChevronMenu(_ChevronMenuInfo& cmi) + { + CMenuHandle menu = cmi.hMenu; + // if menu is from a command bar, detach submenus so they are not destroyed + if(cmi.bCmdBar) + { + for(int i = menu.GetMenuItemCount() - 1; i >=0; i--) + menu.RemoveMenu(i, MF_BYPOSITION); + } + // destroy menu + menu.DestroyMenu(); + // convert chevron rect to screen coordinates + ATL::CWindow wndFrom = cmi.lpnm->hdr.hwndFrom; + RECT rc = cmi.lpnm->rc; + wndFrom.MapWindowPoints(NULL, &rc); + // eat next message if click is on the same button + MSG msg = { 0 }; + if(::PeekMessage(&msg, m_hWnd, WM_LBUTTONDOWN, WM_LBUTTONDOWN, PM_NOREMOVE) && ::PtInRect(&rc, msg.pt)) + ::PeekMessage(&msg, m_hWnd, WM_LBUTTONDOWN, WM_LBUTTONDOWN, PM_REMOVE); + } +#endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) +}; + + +template +class ATL_NO_VTABLE CFrameWindowImpl : public CFrameWindowImplBase< TBase, TWinTraits > +{ +public: + HWND Create(HWND hWndParent = NULL, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, + DWORD dwStyle = 0, DWORD dwExStyle = 0, + HMENU hMenu = NULL, LPVOID lpCreateParam = NULL) + { + ATOM atom = T::GetWndClassInfo().Register(&m_pfnSuperWindowProc); + + dwStyle = T::GetWndStyle(dwStyle); + dwExStyle = T::GetWndExStyle(dwExStyle); + + if(rect.m_lpRect == NULL) + rect.m_lpRect = &TBase::rcDefault; + + return CFrameWindowImplBase< TBase, TWinTraits >::Create(hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, hMenu, atom, lpCreateParam); + } + + HWND CreateEx(HWND hWndParent = NULL, ATL::_U_RECT rect = NULL, DWORD dwStyle = 0, DWORD dwExStyle = 0, LPVOID lpCreateParam = NULL) + { + const int cchName = 256; + TCHAR szWindowName[cchName]; + szWindowName[0] = 0; +#ifndef _WIN32_WCE + ::LoadString(ModuleHelper::GetResourceInstance(), T::GetWndClassInfo().m_uCommonResourceID, szWindowName, cchName); + HMENU hMenu = ::LoadMenu(ModuleHelper::GetResourceInstance(), MAKEINTRESOURCE(T::GetWndClassInfo().m_uCommonResourceID)); +#else // CE specific + ::LoadString(ModuleHelper::GetResourceInstance(), T::GetWndClassInfo().m_uCommonResourceID, szWindowName, cchName); + + // This always needs to be NULL for Windows CE. + // Frame Window menus have to go onto the CommandBar. + // Use CreateSimpleCECommandBar + HMENU hMenu = NULL; +#endif // _WIN32_WCE + + T* pT = static_cast(this); + HWND hWnd = pT->Create(hWndParent, rect, szWindowName, dwStyle, dwExStyle, hMenu, lpCreateParam); + + if(hWnd != NULL) + m_hAccel = ::LoadAccelerators(ModuleHelper::GetResourceInstance(), MAKEINTRESOURCE(T::GetWndClassInfo().m_uCommonResourceID)); + + return hWnd; + } + + BOOL CreateSimpleToolBar(UINT nResourceID = 0, DWORD dwStyle = ATL_SIMPLE_TOOLBAR_STYLE, UINT nID = ATL_IDW_TOOLBAR) + { + if(nResourceID == 0) + nResourceID = T::GetWndClassInfo().m_uCommonResourceID; +#ifndef _WIN32_WCE + ATLASSERT(!::IsWindow(m_hWndToolBar)); + m_hWndToolBar = T::CreateSimpleToolBarCtrl(m_hWnd, nResourceID, TRUE, dwStyle, nID); + return (m_hWndToolBar != NULL); +#else // CE specific + HWND hWnd= T::CreateSimpleToolBarCtrl(m_hWndCECommandBar, nResourceID, TRUE, dwStyle, nID); + return (hWnd != NULL); +#endif // _WIN32_WCE + } + +#ifdef _WIN32_WCE + // CE specific variant that returns the handle of the toolbar + HWND CreateSimpleCEToolBar(UINT nResourceID = 0, DWORD dwStyle = ATL_SIMPLE_TOOLBAR_STYLE, UINT nID = ATL_IDW_TOOLBAR) + { + if(nResourceID == 0) + nResourceID = T::GetWndClassInfo().m_uCommonResourceID; + + return T::CreateSimpleToolBarCtrl(m_hWndCECommandBar, nResourceID, TRUE, dwStyle, nID); + } +#endif // _WIN32_WCE + +// message map and handlers + typedef CFrameWindowImplBase< TBase, TWinTraits > _baseClass; + + BEGIN_MSG_MAP(CFrameWindowImpl) + MESSAGE_HANDLER(WM_SIZE, OnSize) +#ifndef _ATL_NO_REBAR_SUPPORT +#if (_WIN32_IE >= 0x0400) + NOTIFY_CODE_HANDLER(RBN_AUTOSIZE, OnReBarAutoSize) +#endif // (_WIN32_IE >= 0x0400) +#if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) + NOTIFY_CODE_HANDLER(RBN_CHEVRONPUSHED, OnChevronPushed) +#endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) +#endif // !_ATL_NO_REBAR_SUPPORT + CHAIN_MSG_MAP(_baseClass) + END_MSG_MAP() + + LRESULT OnSize(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) + { + if(wParam != SIZE_MINIMIZED) + { + T* pT = static_cast(this); + pT->UpdateLayout(); + } + bHandled = FALSE; + return 1; + } + +#ifndef _ATL_NO_REBAR_SUPPORT +#if (_WIN32_IE >= 0x0400) + LRESULT OnReBarAutoSize(int /*idCtrl*/, LPNMHDR /*pnmh*/, BOOL& /*bHandled*/) + { + T* pT = static_cast(this); + pT->UpdateLayout(FALSE); + return 0; + } +#endif // (_WIN32_IE >= 0x0400) + +#if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) + LRESULT OnChevronPushed(int /*idCtrl*/, LPNMHDR pnmh, BOOL& bHandled) + { + T* pT = static_cast(this); + _ChevronMenuInfo cmi = { NULL, (LPNMREBARCHEVRON)pnmh, false }; + if(!pT->PrepareChevronMenu(cmi)) + { + bHandled = FALSE; + return 1; + } + // display a popup menu with hidden items + pT->DisplayChevronMenu(cmi); + // cleanup + pT->CleanupChevronMenu(cmi); + return 0; + } +#endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) +#endif // !_ATL_NO_REBAR_SUPPORT +}; + + +/////////////////////////////////////////////////////////////////////////////// +// AtlCreateSimpleToolBar - helper for creating simple toolbars + +#ifndef _WIN32_WCE + +inline HWND AtlCreateSimpleToolBar(HWND hWndParent, UINT nResourceID, BOOL bInitialSeparator = FALSE, + DWORD dwStyle = ATL_SIMPLE_TOOLBAR_STYLE, UINT nID = ATL_IDW_TOOLBAR) +{ + return CFrameWindowImplBase<>::CreateSimpleToolBarCtrl(hWndParent, nResourceID, bInitialSeparator, dwStyle, nID); +} + +#endif // !_WIN32_WCE + + +/////////////////////////////////////////////////////////////////////////////// +// CMDIWindow + +#ifndef _WIN32_WCE + +#ifndef _WTL_MDIWINDOWMENU_TEXT +#define _WTL_MDIWINDOWMENU_TEXT _T("&Window") +#endif + +class CMDIWindow : public ATL::CWindow +{ +public: +// Data members + HWND m_hWndMDIClient; + HMENU m_hMenu; + +// Constructors + CMDIWindow(HWND hWnd = NULL) : ATL::CWindow(hWnd), m_hWndMDIClient(NULL), m_hMenu(NULL) + { } + + CMDIWindow& operator =(HWND hWnd) + { + m_hWnd = hWnd; + return *this; + } + +// Operations + HWND MDIGetActive(BOOL* lpbMaximized = NULL) + { + ATLASSERT(::IsWindow(m_hWndMDIClient)); + return (HWND)::SendMessage(m_hWndMDIClient, WM_MDIGETACTIVE, 0, (LPARAM)lpbMaximized); + } + + void MDIActivate(HWND hWndChildToActivate) + { + ATLASSERT(::IsWindow(m_hWndMDIClient)); + ATLASSERT(::IsWindow(hWndChildToActivate)); + ::SendMessage(m_hWndMDIClient, WM_MDIACTIVATE, (WPARAM)hWndChildToActivate, 0); + } + + void MDINext(HWND hWndChild, BOOL bPrevious = FALSE) + { + ATLASSERT(::IsWindow(m_hWndMDIClient)); + ATLASSERT(hWndChild == NULL || ::IsWindow(hWndChild)); + ::SendMessage(m_hWndMDIClient, WM_MDINEXT, (WPARAM)hWndChild, (LPARAM)bPrevious); + } + + void MDIMaximize(HWND hWndChildToMaximize) + { + ATLASSERT(::IsWindow(m_hWndMDIClient)); + ATLASSERT(::IsWindow(hWndChildToMaximize)); + ::SendMessage(m_hWndMDIClient, WM_MDIMAXIMIZE, (WPARAM)hWndChildToMaximize, 0); + } + + void MDIRestore(HWND hWndChildToRestore) + { + ATLASSERT(::IsWindow(m_hWndMDIClient)); + ATLASSERT(::IsWindow(hWndChildToRestore)); + ::SendMessage(m_hWndMDIClient, WM_MDIRESTORE, (WPARAM)hWndChildToRestore, 0); + } + + void MDIDestroy(HWND hWndChildToDestroy) + { + ATLASSERT(::IsWindow(m_hWndMDIClient)); + ATLASSERT(::IsWindow(hWndChildToDestroy)); + ::SendMessage(m_hWndMDIClient, WM_MDIDESTROY, (WPARAM)hWndChildToDestroy, 0); + } + + BOOL MDICascade(UINT uFlags = 0) + { + ATLASSERT(::IsWindow(m_hWndMDIClient)); + return (BOOL)::SendMessage(m_hWndMDIClient, WM_MDICASCADE, (WPARAM)uFlags, 0); + } + + BOOL MDITile(UINT uFlags = MDITILE_HORIZONTAL) + { + ATLASSERT(::IsWindow(m_hWndMDIClient)); + return (BOOL)::SendMessage(m_hWndMDIClient, WM_MDITILE, (WPARAM)uFlags, 0); + } + + void MDIIconArrange() + { + ATLASSERT(::IsWindow(m_hWndMDIClient)); + ::SendMessage(m_hWndMDIClient, WM_MDIICONARRANGE, 0, 0); + } + + HMENU MDISetMenu(HMENU hMenuFrame, HMENU hMenuWindow) + { + ATLASSERT(::IsWindow(m_hWndMDIClient)); + return (HMENU)::SendMessage(m_hWndMDIClient, WM_MDISETMENU, (WPARAM)hMenuFrame, (LPARAM)hMenuWindow); + } + + HMENU MDIRefreshMenu() + { + ATLASSERT(::IsWindow(m_hWndMDIClient)); + return (HMENU)::SendMessage(m_hWndMDIClient, WM_MDIREFRESHMENU, 0, 0); + } + +// Additional operations + static HMENU GetStandardWindowMenu(HMENU hMenu) + { + int nCount = ::GetMenuItemCount(hMenu); + if(nCount == -1) + return NULL; + int nLen = ::GetMenuString(hMenu, nCount - 2, NULL, 0, MF_BYPOSITION); + if(nLen == 0) + return NULL; + CTempBuffer buff; + LPTSTR lpszText = buff.Allocate(nLen + 1); + if(lpszText == NULL) + return NULL; + if(::GetMenuString(hMenu, nCount - 2, lpszText, nLen + 1, MF_BYPOSITION) != nLen) + return NULL; + if(lstrcmp(lpszText, _WTL_MDIWINDOWMENU_TEXT) != 0) + return NULL; + return ::GetSubMenu(hMenu, nCount - 2); + } + + void SetMDIFrameMenu() + { + HMENU hWindowMenu = GetStandardWindowMenu(m_hMenu); + MDISetMenu(m_hMenu, hWindowMenu); + MDIRefreshMenu(); + ::DrawMenuBar(GetMDIFrame()); + } + + HWND GetMDIFrame() const + { + return ::GetParent(m_hWndMDIClient); + } +}; + +#endif // !_WIN32_WCE + + +/////////////////////////////////////////////////////////////////////////////// +// CMDIFrameWindowImpl + +#ifndef _WIN32_WCE + +// MDI child command chaining macro (only for MDI frame windows) +#define CHAIN_MDI_CHILD_COMMANDS() \ + if(uMsg == WM_COMMAND) \ + { \ + HWND hWndChild = MDIGetActive(); \ + if(hWndChild != NULL) \ + ::SendMessage(hWndChild, uMsg, wParam, lParam); \ + } + +template +class ATL_NO_VTABLE CMDIFrameWindowImpl : public CFrameWindowImplBase +{ +public: + HWND Create(HWND hWndParent = NULL, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, + DWORD dwStyle = 0, DWORD dwExStyle = 0, + HMENU hMenu = NULL, LPVOID lpCreateParam = NULL) + { + m_hMenu = hMenu; + ATOM atom = T::GetWndClassInfo().Register(&m_pfnSuperWindowProc); + + dwStyle = T::GetWndStyle(dwStyle); + dwExStyle = T::GetWndExStyle(dwExStyle); + + if(rect.m_lpRect == NULL) + rect.m_lpRect = &TBase::rcDefault; + + return CFrameWindowImplBase::Create(hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, hMenu, atom, lpCreateParam); + } + + HWND CreateEx(HWND hWndParent = NULL, ATL::_U_RECT rect = NULL, DWORD dwStyle = 0, DWORD dwExStyle = 0, LPVOID lpCreateParam = NULL) + { + const int cchName = 256; + TCHAR szWindowName[cchName]; + szWindowName[0] = 0; + ::LoadString(ModuleHelper::GetResourceInstance(), T::GetWndClassInfo().m_uCommonResourceID, szWindowName, cchName); + HMENU hMenu = ::LoadMenu(ModuleHelper::GetResourceInstance(), MAKEINTRESOURCE(T::GetWndClassInfo().m_uCommonResourceID)); + + T* pT = static_cast(this); + HWND hWnd = pT->Create(hWndParent, rect, szWindowName, dwStyle, dwExStyle, hMenu, lpCreateParam); + + if(hWnd != NULL) + m_hAccel = ::LoadAccelerators(ModuleHelper::GetResourceInstance(), MAKEINTRESOURCE(T::GetWndClassInfo().m_uCommonResourceID)); + + return hWnd; + } + + BOOL CreateSimpleToolBar(UINT nResourceID = 0, DWORD dwStyle = ATL_SIMPLE_TOOLBAR_STYLE, UINT nID = ATL_IDW_TOOLBAR) + { + ATLASSERT(!::IsWindow(m_hWndToolBar)); + if(nResourceID == 0) + nResourceID = T::GetWndClassInfo().m_uCommonResourceID; + m_hWndToolBar = T::CreateSimpleToolBarCtrl(m_hWnd, nResourceID, TRUE, dwStyle, nID); + return (m_hWndToolBar != NULL); + } + + virtual WNDPROC GetWindowProc() + { + return MDIFrameWindowProc; + } + + static LRESULT CALLBACK MDIFrameWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) + { + CMDIFrameWindowImpl< T, TBase, TWinTraits >* pThis = (CMDIFrameWindowImpl< T, TBase, TWinTraits >*)hWnd; + // set a ptr to this message and save the old value +#if (_ATL_VER >= 0x0700) + ATL::_ATL_MSG msg(pThis->m_hWnd, uMsg, wParam, lParam); + const ATL::_ATL_MSG* pOldMsg = pThis->m_pCurrentMsg; +#else // !(_ATL_VER >= 0x0700) + MSG msg = { pThis->m_hWnd, uMsg, wParam, lParam, 0, { 0, 0 } }; + const MSG* pOldMsg = pThis->m_pCurrentMsg; +#endif // !(_ATL_VER >= 0x0700) + pThis->m_pCurrentMsg = &msg; + // pass to the message map to process + LRESULT lRes = 0; + BOOL bRet = pThis->ProcessWindowMessage(pThis->m_hWnd, uMsg, wParam, lParam, lRes, 0); + // restore saved value for the current message + ATLASSERT(pThis->m_pCurrentMsg == &msg); + pThis->m_pCurrentMsg = pOldMsg; + // do the default processing if message was not handled + if(!bRet) + { + if(uMsg != WM_NCDESTROY) + lRes = pThis->DefWindowProc(uMsg, wParam, lParam); + else + { + // unsubclass, if needed + LONG_PTR pfnWndProc = ::GetWindowLongPtr(pThis->m_hWnd, GWLP_WNDPROC); + lRes = pThis->DefWindowProc(uMsg, wParam, lParam); + if(pThis->m_pfnSuperWindowProc != ::DefWindowProc && ::GetWindowLongPtr(pThis->m_hWnd, GWLP_WNDPROC) == pfnWndProc) + ::SetWindowLongPtr(pThis->m_hWnd, GWLP_WNDPROC, (LONG_PTR)pThis->m_pfnSuperWindowProc); +#if (_ATL_VER >= 0x0700) + // mark window as destryed + pThis->m_dwState |= WINSTATE_DESTROYED; +#else // !(_ATL_VER >= 0x0700) + // clear out window handle + HWND hWnd = pThis->m_hWnd; + pThis->m_hWnd = NULL; + // clean up after window is destroyed + pThis->OnFinalMessage(hWnd); +#endif // !(_ATL_VER >= 0x0700) + } + } +#if (_ATL_VER >= 0x0700) + if(pThis->m_dwState & WINSTATE_DESTROYED && pThis->m_pCurrentMsg == NULL) + { + // clear out window handle + HWND hWnd = pThis->m_hWnd; + pThis->m_hWnd = NULL; + pThis->m_dwState &= ~WINSTATE_DESTROYED; + // clean up after window is destroyed + pThis->OnFinalMessage(hWnd); + } +#endif // (_ATL_VER >= 0x0700) + return lRes; + } + + // Overriden to call DefWindowProc which uses DefFrameProc + LRESULT DefWindowProc() + { + const MSG* pMsg = m_pCurrentMsg; + LRESULT lRes = 0; + if (pMsg != NULL) + lRes = DefWindowProc(pMsg->message, pMsg->wParam, pMsg->lParam); + return lRes; + } + + LRESULT DefWindowProc(UINT uMsg, WPARAM wParam, LPARAM lParam) + { + return ::DefFrameProc(m_hWnd, m_hWndMDIClient, uMsg, wParam, lParam); + } + + BOOL PreTranslateMessage(MSG* pMsg) + { + if(CFrameWindowImplBase::PreTranslateMessage(pMsg)) + return TRUE; + return ::TranslateMDISysAccel(m_hWndMDIClient, pMsg); + } + + HWND CreateMDIClient(HMENU hWindowMenu = NULL, UINT nID = ATL_IDW_CLIENT, UINT nFirstChildID = ATL_IDM_FIRST_MDICHILD) + { + DWORD dwStyle = WS_VISIBLE | WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | MDIS_ALLCHILDSTYLES; + DWORD dwExStyle = WS_EX_CLIENTEDGE; + + CLIENTCREATESTRUCT ccs = { 0 }; + ccs.hWindowMenu = hWindowMenu; + ccs.idFirstChild = nFirstChildID; + + if((GetStyle() & (WS_HSCROLL | WS_VSCROLL)) != 0) + { + // parent MDI frame's scroll styles move to the MDICLIENT + dwStyle |= (GetStyle() & (WS_HSCROLL | WS_VSCROLL)); + + // fast way to turn off the scrollbar bits (without a resize) + ModifyStyle(WS_HSCROLL | WS_VSCROLL, 0, SWP_NOREDRAW | SWP_FRAMECHANGED); + } + + // Create MDICLIENT window + m_hWndClient = ::CreateWindowEx(dwExStyle, _T("MDIClient"), NULL, + dwStyle, 0, 0, 1, 1, m_hWnd, (HMENU)LongToHandle(nID), + ModuleHelper::GetModuleInstance(), (LPVOID)&ccs); + if (m_hWndClient == NULL) + { + ATLTRACE2(atlTraceUI, 0, _T("MDI Frame failed to create MDICLIENT.\n")); + return NULL; + } + + // Move it to the top of z-order + ::BringWindowToTop(m_hWndClient); + + // set as MDI client window + m_hWndMDIClient = m_hWndClient; + + // update to proper size + T* pT = static_cast(this); + pT->UpdateLayout(); + + return m_hWndClient; + } + + typedef CFrameWindowImplBase _baseClass; + + BEGIN_MSG_MAP(CMDIFrameWindowImpl) + MESSAGE_HANDLER(WM_SIZE, OnSize) + MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus) + MESSAGE_HANDLER(WM_MDISETMENU, OnMDISetMenu) +#ifndef _ATL_NO_REBAR_SUPPORT +#if (_WIN32_IE >= 0x0400) + NOTIFY_CODE_HANDLER(RBN_AUTOSIZE, OnReBarAutoSize) +#endif // (_WIN32_IE >= 0x0400) +#if (_WIN32_IE >= 0x0500) + NOTIFY_CODE_HANDLER(RBN_CHEVRONPUSHED, OnChevronPushed) +#endif // (_WIN32_IE >= 0x0500) +#endif // !_ATL_NO_REBAR_SUPPORT + CHAIN_MSG_MAP(_baseClass) + END_MSG_MAP() + + LRESULT OnSize(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/) + { + if(wParam != SIZE_MINIMIZED) + { + T* pT = static_cast(this); + pT->UpdateLayout(); + } + // message must be handled, otherwise DefFrameProc would resize the client again + return 0; + } + + LRESULT OnSetFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) + { + // don't allow CFrameWindowImplBase to handle this one + return DefWindowProc(uMsg, wParam, lParam); + } + + LRESULT OnMDISetMenu(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) + { + SetMDIFrameMenu(); + return 0; + } + +#ifndef _ATL_NO_REBAR_SUPPORT +#if (_WIN32_IE >= 0x0400) + LRESULT OnReBarAutoSize(int /*idCtrl*/, LPNMHDR /*pnmh*/, BOOL& /*bHandled*/) + { + T* pT = static_cast(this); + pT->UpdateLayout(FALSE); + return 0; + } +#endif // (_WIN32_IE >= 0x0400) + +#if (_WIN32_IE >= 0x0500) + LRESULT OnChevronPushed(int /*idCtrl*/, LPNMHDR pnmh, BOOL& bHandled) + { + T* pT = static_cast(this); + _ChevronMenuInfo cmi = { NULL, (LPNMREBARCHEVRON)pnmh, false }; + if(!pT->PrepareChevronMenu(cmi)) + { + bHandled = FALSE; + return 1; + } + // display a popup menu with hidden items + pT->DisplayChevronMenu(cmi); + // cleanup + pT->CleanupChevronMenu(cmi); + return 0; + } +#endif // (_WIN32_IE >= 0x0500) +#endif // !_ATL_NO_REBAR_SUPPORT +}; + +#endif // !_WIN32_WCE + + +/////////////////////////////////////////////////////////////////////////////// +// CMDIChildWindowImpl + +#ifndef _WIN32_WCE + +template +class ATL_NO_VTABLE CMDIChildWindowImpl : public CFrameWindowImplBase +{ +public: + HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, + DWORD dwStyle = 0, DWORD dwExStyle = 0, + UINT nMenuID = 0, LPVOID lpCreateParam = NULL) + { + ATOM atom = T::GetWndClassInfo().Register(&m_pfnSuperWindowProc); + + if(nMenuID != 0) + m_hMenu = ::LoadMenu(ModuleHelper::GetResourceInstance(), MAKEINTRESOURCE(nMenuID)); + + dwStyle = T::GetWndStyle(dwStyle); + dwExStyle = T::GetWndExStyle(dwExStyle); + + dwExStyle |= WS_EX_MDICHILD; // force this one + m_pfnSuperWindowProc = ::DefMDIChildProc; + m_hWndMDIClient = hWndParent; + ATLASSERT(::IsWindow(m_hWndMDIClient)); + + if(rect.m_lpRect == NULL) + rect.m_lpRect = &TBase::rcDefault; + + // If the currently active MDI child is maximized, we want to create this one maximized too + ATL::CWindow wndParent = hWndParent; + BOOL bMaximized = FALSE; + wndParent.SendMessage(WM_MDIGETACTIVE, 0, (LPARAM)&bMaximized); + if(bMaximized) + wndParent.SetRedraw(FALSE); + + HWND hWnd = CFrameWindowImplBase::Create(hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, (UINT)0U, atom, lpCreateParam); + + if(bMaximized) + { + // Maximize and redraw everything + if(hWnd != NULL) + MDIMaximize(hWnd); + wndParent.SetRedraw(TRUE); + wndParent.RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN); + ::SetFocus(GetMDIFrame()); // focus will be set back to this window + } + else if(hWnd != NULL && ::IsWindowVisible(m_hWnd) && !::IsChild(hWnd, ::GetFocus())) + { + ::SetFocus(hWnd); + } + + return hWnd; + } + + HWND CreateEx(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR lpcstrWindowName = NULL, DWORD dwStyle = 0, DWORD dwExStyle = 0, LPVOID lpCreateParam = NULL) + { + const int cchName = 256; + TCHAR szWindowName[cchName]; + szWindowName[0] = 0; + if(lpcstrWindowName == NULL) + { + ::LoadString(ModuleHelper::GetResourceInstance(), T::GetWndClassInfo().m_uCommonResourceID, szWindowName, cchName); + lpcstrWindowName = szWindowName; + } + + T* pT = static_cast(this); + HWND hWnd = pT->Create(hWndParent, rect, lpcstrWindowName, dwStyle, dwExStyle, T::GetWndClassInfo().m_uCommonResourceID, lpCreateParam); + + if(hWnd != NULL) + m_hAccel = ::LoadAccelerators(ModuleHelper::GetResourceInstance(), MAKEINTRESOURCE(T::GetWndClassInfo().m_uCommonResourceID)); + + return hWnd; + } + + BOOL CreateSimpleToolBar(UINT nResourceID = 0, DWORD dwStyle = ATL_SIMPLE_TOOLBAR_STYLE, UINT nID = ATL_IDW_TOOLBAR) + { + ATLASSERT(!::IsWindow(m_hWndToolBar)); + if(nResourceID == 0) + nResourceID = T::GetWndClassInfo().m_uCommonResourceID; + m_hWndToolBar = T::CreateSimpleToolBarCtrl(m_hWnd, nResourceID, TRUE, dwStyle, nID); + return (m_hWndToolBar != NULL); + } + + BOOL UpdateClientEdge(LPRECT lpRect = NULL) + { + // only adjust for active MDI child window + HWND hWndChild = MDIGetActive(); + if(hWndChild != NULL && hWndChild != m_hWnd) + return FALSE; + + // need to adjust the client edge style as max/restore happens + DWORD dwStyle = ::GetWindowLong(m_hWndMDIClient, GWL_EXSTYLE); + DWORD dwNewStyle = dwStyle; + if(hWndChild != NULL && ((GetExStyle() & WS_EX_CLIENTEDGE) == 0) && ((GetStyle() & WS_MAXIMIZE) != 0)) + dwNewStyle &= ~(WS_EX_CLIENTEDGE); + else + dwNewStyle |= WS_EX_CLIENTEDGE; + + if(dwStyle != dwNewStyle) + { + // SetWindowPos will not move invalid bits + ::RedrawWindow(m_hWndMDIClient, NULL, NULL, + RDW_INVALIDATE | RDW_ALLCHILDREN); + // remove/add WS_EX_CLIENTEDGE to MDI client area + ::SetWindowLong(m_hWndMDIClient, GWL_EXSTYLE, dwNewStyle); + ::SetWindowPos(m_hWndMDIClient, NULL, 0, 0, 0, 0, + SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE | + SWP_NOZORDER | SWP_NOCOPYBITS); + + // return new client area + if (lpRect != NULL) + ::GetClientRect(m_hWndMDIClient, lpRect); + + return TRUE; + } + + return FALSE; + } + + typedef CFrameWindowImplBase _baseClass; + BEGIN_MSG_MAP(CMDIChildWindowImpl) + MESSAGE_HANDLER(WM_SIZE, OnSize) + MESSAGE_HANDLER(WM_WINDOWPOSCHANGED, OnWindowPosChanged) + MESSAGE_HANDLER(WM_MOUSEACTIVATE, OnMouseActivate) + MESSAGE_HANDLER(WM_MENUSELECT, OnMenuSelect) + MESSAGE_HANDLER(WM_MDIACTIVATE, OnMDIActivate) + MESSAGE_HANDLER(WM_DESTROY, OnDestroy) +#ifndef _ATL_NO_REBAR_SUPPORT +#if (_WIN32_IE >= 0x0400) + NOTIFY_CODE_HANDLER(RBN_AUTOSIZE, OnReBarAutoSize) +#endif // (_WIN32_IE >= 0x0400) +#if (_WIN32_IE >= 0x0500) + NOTIFY_CODE_HANDLER(RBN_CHEVRONPUSHED, OnChevronPushed) +#endif // (_WIN32_IE >= 0x0500) +#endif // !_ATL_NO_REBAR_SUPPORT + CHAIN_MSG_MAP(_baseClass) + END_MSG_MAP() + + LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) + { + DefWindowProc(uMsg, wParam, lParam); // needed for MDI children + if(wParam != SIZE_MINIMIZED) + { + T* pT = static_cast(this); + pT->UpdateLayout(); + } + return 0; + } + + LRESULT OnWindowPosChanged(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled) + { + // update MDI client edge and adjust MDI child rect + LPWINDOWPOS lpWndPos = (LPWINDOWPOS)lParam; + + if(!(lpWndPos->flags & SWP_NOSIZE)) + { + RECT rectClient; + if(UpdateClientEdge(&rectClient) && ((GetStyle() & WS_MAXIMIZE) != 0)) + { + ::AdjustWindowRectEx(&rectClient, GetStyle(), FALSE, GetExStyle()); + lpWndPos->x = rectClient.left; + lpWndPos->y = rectClient.top; + lpWndPos->cx = rectClient.right - rectClient.left; + lpWndPos->cy = rectClient.bottom - rectClient.top; + } + } + + bHandled = FALSE; + return 1; + } + + LRESULT OnMouseActivate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) + { + LRESULT lRes = DefWindowProc(uMsg, wParam, lParam); + + // Activate this MDI window if needed + if(lRes == MA_ACTIVATE || lRes == MA_ACTIVATEANDEAT) + { + if(MDIGetActive() != m_hWnd) + MDIActivate(m_hWnd); + } + + return lRes; + } + + LRESULT OnMenuSelect(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) + { + return ::SendMessage(GetMDIFrame(), uMsg, wParam, lParam); + } + + LRESULT OnMDIActivate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled) + { + if((HWND)lParam == m_hWnd && m_hMenu != NULL) + SetMDIFrameMenu(); + else if((HWND)lParam == NULL) + ::SendMessage(GetMDIFrame(), WM_MDISETMENU, 0, 0); + + bHandled = FALSE; + return 1; + } + + LRESULT OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) + { + if(m_hMenu != NULL) + { + ::DestroyMenu(m_hMenu); + m_hMenu = NULL; + } + UpdateClientEdge(); + bHandled = FALSE; + return 1; + } + +#ifndef _ATL_NO_REBAR_SUPPORT +#if (_WIN32_IE >= 0x0400) + LRESULT OnReBarAutoSize(int /*idCtrl*/, LPNMHDR /*pnmh*/, BOOL& /*bHandled*/) + { + T* pT = static_cast(this); + pT->UpdateLayout(FALSE); + return 0; + } +#endif // (_WIN32_IE >= 0x0400) + +#if (_WIN32_IE >= 0x0500) + LRESULT OnChevronPushed(int /*idCtrl*/, LPNMHDR pnmh, BOOL& bHandled) + { + T* pT = static_cast(this); + _ChevronMenuInfo cmi = { NULL, (LPNMREBARCHEVRON)pnmh, false }; + if(!pT->PrepareChevronMenu(cmi)) + { + bHandled = FALSE; + return 1; + } + // display a popup menu with hidden items + pT->DisplayChevronMenu(cmi); + // cleanup + pT->CleanupChevronMenu(cmi); + return 0; + } +#endif // (_WIN32_IE >= 0x0500) +#endif // !_ATL_NO_REBAR_SUPPORT +}; + +#endif // !_WIN32_WCE + + +/////////////////////////////////////////////////////////////////////////////// +// COwnerDraw - MI class for owner-draw support + +template +class COwnerDraw +{ +public: +#if (_ATL_VER < 0x0700) + BOOL m_bHandledOD; + + BOOL IsMsgHandled() const + { + return m_bHandledOD; + } + void SetMsgHandled(BOOL bHandled) + { + m_bHandledOD = bHandled; + } +#endif // (_ATL_VER < 0x0700) + +// Message map and handlers + BEGIN_MSG_MAP(COwnerDraw< T >) + MESSAGE_HANDLER(WM_DRAWITEM, OnDrawItem) + MESSAGE_HANDLER(WM_MEASUREITEM, OnMeasureItem) + MESSAGE_HANDLER(WM_COMPAREITEM, OnCompareItem) + MESSAGE_HANDLER(WM_DELETEITEM, OnDeleteItem) + ALT_MSG_MAP(1) + MESSAGE_HANDLER(OCM_DRAWITEM, OnDrawItem) + MESSAGE_HANDLER(OCM_MEASUREITEM, OnMeasureItem) + MESSAGE_HANDLER(OCM_COMPAREITEM, OnCompareItem) + MESSAGE_HANDLER(OCM_DELETEITEM, OnDeleteItem) + END_MSG_MAP() + + LRESULT OnDrawItem(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled) + { + T* pT = static_cast(this); + pT->SetMsgHandled(TRUE); + pT->DrawItem((LPDRAWITEMSTRUCT)lParam); + bHandled = pT->IsMsgHandled(); + return (LRESULT)TRUE; + } + + LRESULT OnMeasureItem(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled) + { + T* pT = static_cast(this); + pT->SetMsgHandled(TRUE); + pT->MeasureItem((LPMEASUREITEMSTRUCT)lParam); + bHandled = pT->IsMsgHandled(); + return (LRESULT)TRUE; + } + + LRESULT OnCompareItem(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled) + { + T* pT = static_cast(this); + pT->SetMsgHandled(TRUE); + bHandled = pT->IsMsgHandled(); + return (LRESULT)pT->CompareItem((LPCOMPAREITEMSTRUCT)lParam); + } + + LRESULT OnDeleteItem(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled) + { + T* pT = static_cast(this); + pT->SetMsgHandled(TRUE); + pT->DeleteItem((LPDELETEITEMSTRUCT)lParam); + bHandled = pT->IsMsgHandled(); + return (LRESULT)TRUE; + } + +// Overrideables + void DrawItem(LPDRAWITEMSTRUCT /*lpDrawItemStruct*/) + { + // must be implemented + ATLASSERT(FALSE); + } + + void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct) + { + if(lpMeasureItemStruct->CtlType != ODT_MENU) + { + // return default height for a system font + T* pT = static_cast(this); + HWND hWnd = pT->GetDlgItem(lpMeasureItemStruct->CtlID); + CClientDC dc(hWnd); + TEXTMETRIC tm = { 0 }; + dc.GetTextMetrics(&tm); + + lpMeasureItemStruct->itemHeight = tm.tmHeight; + } + else + lpMeasureItemStruct->itemHeight = ::GetSystemMetrics(SM_CYMENU); + } + + int CompareItem(LPCOMPAREITEMSTRUCT /*lpCompareItemStruct*/) + { + // all items are equal + return 0; + } + + void DeleteItem(LPDELETEITEMSTRUCT /*lpDeleteItemStruct*/) + { + // default - nothing + } +}; + + +/////////////////////////////////////////////////////////////////////////////// +// Update UI macros + +// these build the Update UI map inside a class definition +#define BEGIN_UPDATE_UI_MAP(thisClass) \ + static const CUpdateUIBase::_AtlUpdateUIMap* GetUpdateUIMap() \ + { \ + static const _AtlUpdateUIMap theMap[] = \ + { + +#define UPDATE_ELEMENT(nID, wType) \ + { nID, wType }, + +#define END_UPDATE_UI_MAP() \ + { (WORD)-1, 0 } \ + }; \ + return theMap; \ + } + +/////////////////////////////////////////////////////////////////////////////// +// CUpdateUI - manages UI elements updating + +class CUpdateUIBase +{ +public: + // constants + enum + { + // UI element type + UPDUI_MENUPOPUP = 0x0001, + UPDUI_MENUBAR = 0x0002, + UPDUI_CHILDWINDOW = 0x0004, + UPDUI_TOOLBAR = 0x0008, + UPDUI_STATUSBAR = 0x0010, + // state + UPDUI_ENABLED = 0x0000, + UPDUI_DISABLED = 0x0100, + UPDUI_CHECKED = 0x0200, + UPDUI_CHECKED2 = 0x0400, + UPDUI_RADIO = 0x0800, + UPDUI_DEFAULT = 0x1000, + UPDUI_TEXT = 0x2000, + // internal state + UPDUI_CLEARDEFAULT = 0x4000, + }; + + // element data + struct _AtlUpdateUIElement + { + HWND m_hWnd; + WORD m_wType; + + bool operator ==(const _AtlUpdateUIElement& e) const + { return (m_hWnd == e.m_hWnd && m_wType == e.m_wType); } + }; + + // map data + struct _AtlUpdateUIMap + { + WORD m_nID; + WORD m_wType; + + bool operator ==(const _AtlUpdateUIMap& e) const + { return (m_nID == e.m_nID && m_wType == e.m_wType); } + }; + + // instance data + struct _AtlUpdateUIData + { + WORD m_wState; + union + { + void* m_lpData; + LPTSTR m_lpstrText; + }; + + bool operator ==(const _AtlUpdateUIData& e) const + { return (m_wState == e.m_wState && m_lpData == e.m_lpData); } + }; + + ATL::CSimpleArray<_AtlUpdateUIElement> m_UIElements; // elements data + const _AtlUpdateUIMap* m_pUIMap; // static UI data + _AtlUpdateUIData* m_pUIData; // instance UI data + WORD m_wDirtyType; // global dirty flag + + bool m_bBlockAccelerators; + + +// Constructor, destructor + CUpdateUIBase() : m_pUIMap(NULL), m_pUIData(NULL), m_wDirtyType(0), m_bBlockAccelerators(false) + { } + + ~CUpdateUIBase() + { + if(m_pUIMap != NULL && m_pUIData != NULL) + { + const _AtlUpdateUIMap* pUIMap = m_pUIMap; + _AtlUpdateUIData* pUIData = m_pUIData; + while(pUIMap->m_nID != (WORD)-1) + { + if(pUIData->m_wState & UPDUI_TEXT) + delete [] pUIData->m_lpstrText; + pUIMap++; + pUIData++; + } + delete [] m_pUIData; + } + } + +// Check for disabled commands + bool UIGetBlockAccelerators() const + { + return m_bBlockAccelerators; + } + + bool UISetBlockAccelerators(bool bBlock) + { + bool bOld = m_bBlockAccelerators; + m_bBlockAccelerators = bBlock; + return bOld; + } + +// Add elements + BOOL UIAddMenuBar(HWND hWnd) // menu bar (main menu) + { + if(hWnd == NULL) + return FALSE; + _AtlUpdateUIElement e; + e.m_hWnd = hWnd; + e.m_wType = UPDUI_MENUBAR; + return m_UIElements.Add(e); + } + + BOOL UIAddToolBar(HWND hWnd) // toolbar + { + if(hWnd == NULL) + return FALSE; + _AtlUpdateUIElement e; + e.m_hWnd = hWnd; + e.m_wType = UPDUI_TOOLBAR; + return m_UIElements.Add(e); + } + + BOOL UIAddStatusBar(HWND hWnd) // status bar + { + if(hWnd == NULL) + return FALSE; + _AtlUpdateUIElement e; + e.m_hWnd = hWnd; + e.m_wType = UPDUI_STATUSBAR; + return m_UIElements.Add(e); + } + + BOOL UIAddChildWindowContainer(HWND hWnd) // child window + { + if(hWnd == NULL) + return FALSE; + _AtlUpdateUIElement e; + e.m_hWnd = hWnd; + e.m_wType = UPDUI_CHILDWINDOW; + return m_UIElements.Add(e); + } + +// Message map for popup menu updates and accelerator blocking + BEGIN_MSG_MAP(CUpdateUIBase) + MESSAGE_HANDLER(WM_INITMENUPOPUP, OnInitMenuPopup) + MESSAGE_HANDLER(WM_COMMAND, OnCommand) + END_MSG_MAP() + + LRESULT OnInitMenuPopup(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) + { + bHandled = FALSE; + HMENU hMenu = (HMENU)wParam; + if(hMenu == NULL) + return 1; + _AtlUpdateUIData* pUIData = m_pUIData; + if(pUIData == NULL) + return 1; + const _AtlUpdateUIMap* pMap = m_pUIMap; + while(pMap->m_nID != (WORD)-1) + { + if(pMap->m_wType & UPDUI_MENUPOPUP) + UIUpdateMenuBarElement(pMap->m_nID, pUIData, hMenu); + pMap++; + pUIData++; + } + return 0; + } + + LRESULT OnCommand(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) + { + bHandled = FALSE; + if(m_bBlockAccelerators && HIWORD(wParam) == 1) // accelerators only + { + int nID = LOWORD(wParam); + if((UIGetState(nID) & UPDUI_DISABLED) == UPDUI_DISABLED) + { + ATLTRACE2(atlTraceUI, 0, _T("CUpdateUIBase::OnCommand - blocked disabled command 0x%4.4X\n"), nID); + bHandled = TRUE; // eat the command, UI item is disabled + } + } + return 0; + } + +// methods for setting UI element state + BOOL UIEnable(int nID, BOOL bEnable, BOOL bForceUpdate = FALSE) + { + const _AtlUpdateUIMap* pMap = m_pUIMap; + _AtlUpdateUIData* pUIData = m_pUIData; + if(pUIData == NULL) + return FALSE; + + for( ; pMap->m_nID != (WORD)-1; pMap++, pUIData++) + { + if(nID == (int)pMap->m_nID) + { + if(bEnable) + { + if(pUIData->m_wState & UPDUI_DISABLED) + { + pUIData->m_wState |= pMap->m_wType; + pUIData->m_wState &= ~UPDUI_DISABLED; + } + } + else + { + if(!(pUIData->m_wState & UPDUI_DISABLED)) + { + pUIData->m_wState |= pMap->m_wType; + pUIData->m_wState |= UPDUI_DISABLED; + } + } + + if(bForceUpdate) + pUIData->m_wState |= pMap->m_wType; + if(pUIData->m_wState & pMap->m_wType) + m_wDirtyType |= pMap->m_wType; + + break; // found + } + } + + return TRUE; + } + + BOOL UISetCheck(int nID, int nCheck, BOOL bForceUpdate = FALSE) + { + const _AtlUpdateUIMap* pMap = m_pUIMap; + _AtlUpdateUIData* pUIData = m_pUIData; + if(pUIData == NULL) + return FALSE; + + for( ; pMap->m_nID != (WORD)-1; pMap++, pUIData++) + { + if(nID == (int)pMap->m_nID) + { + switch(nCheck) + { + case 0: + if((pUIData->m_wState & UPDUI_CHECKED) || (pUIData->m_wState & UPDUI_CHECKED2)) + { + pUIData->m_wState |= pMap->m_wType; + pUIData->m_wState &= ~(UPDUI_CHECKED | UPDUI_CHECKED2); + } + break; + case 1: + if(!(pUIData->m_wState & UPDUI_CHECKED)) + { + pUIData->m_wState |= pMap->m_wType; + pUIData->m_wState &= ~UPDUI_CHECKED2; + pUIData->m_wState |= UPDUI_CHECKED; + } + break; + case 2: + if(!(pUIData->m_wState & UPDUI_CHECKED2)) + { + pUIData->m_wState |= pMap->m_wType; + pUIData->m_wState &= ~UPDUI_CHECKED; + pUIData->m_wState |= UPDUI_CHECKED2; + } + break; + } + + if(bForceUpdate) + pUIData->m_wState |= pMap->m_wType; + if(pUIData->m_wState & pMap->m_wType) + m_wDirtyType |= pMap->m_wType; + + break; // found + } + } + + return TRUE; + } + + // variant that supports bool (checked/not-checked, no intermediate state) + BOOL UISetCheck(int nID, bool bCheck, BOOL bForceUpdate = FALSE) + { + return UISetCheck(nID, bCheck ? 1 : 0, bForceUpdate); + } + + BOOL UISetRadio(int nID, BOOL bRadio, BOOL bForceUpdate = FALSE) + { + const _AtlUpdateUIMap* pMap = m_pUIMap; + _AtlUpdateUIData* pUIData = m_pUIData; + if(pUIData == NULL) + return FALSE; + + for( ; pMap->m_nID != (WORD)-1; pMap++, pUIData++) + { + if(nID == (int)pMap->m_nID) + { + if(bRadio) + { + if(!(pUIData->m_wState & UPDUI_RADIO)) + { + pUIData->m_wState |= pMap->m_wType; + pUIData->m_wState |= UPDUI_RADIO; + } + } + else + { + if(pUIData->m_wState & UPDUI_RADIO) + { + pUIData->m_wState |= pMap->m_wType; + pUIData->m_wState &= ~UPDUI_RADIO; + } + } + + if(bForceUpdate) + pUIData->m_wState |= pMap->m_wType; + if(pUIData->m_wState & pMap->m_wType) + m_wDirtyType |= pMap->m_wType; + + break; // found + } + } + + return TRUE; + } + + BOOL UISetText(int nID, LPCTSTR lpstrText, BOOL bForceUpdate = FALSE) + { + const _AtlUpdateUIMap* pMap = m_pUIMap; + _AtlUpdateUIData* pUIData = m_pUIData; + if(pUIData == NULL) + return FALSE; + if(lpstrText == NULL) + lpstrText = _T(""); + + for( ; pMap->m_nID != (WORD)-1; pMap++, pUIData++) + { + if(nID == (int)pMap->m_nID) + { + if(pUIData->m_lpstrText == NULL || lstrcmp(pUIData->m_lpstrText, lpstrText)) + { + delete [] pUIData->m_lpstrText; + pUIData->m_lpstrText = NULL; + int nStrLen = lstrlen(lpstrText); + ATLTRY(pUIData->m_lpstrText = new TCHAR[nStrLen + 1]); + if(pUIData->m_lpstrText == NULL) + { + ATLTRACE2(atlTraceUI, 0, _T("UISetText - memory allocation failed\n")); + break; + } + SecureHelper::strcpy_x(pUIData->m_lpstrText, nStrLen + 1, lpstrText); + pUIData->m_wState |= (UPDUI_TEXT | pMap->m_wType); + } + + if(bForceUpdate) + pUIData->m_wState |= (UPDUI_TEXT | pMap->m_wType); + if(pUIData->m_wState & pMap->m_wType) + m_wDirtyType |= pMap->m_wType; + + break; // found + } + } + + return TRUE; + } + + BOOL UISetDefault(int nID, BOOL bDefault, BOOL bForceUpdate = FALSE) + { + const _AtlUpdateUIMap* pMap = m_pUIMap; + _AtlUpdateUIData* pUIData = m_pUIData; + if(pUIData == NULL) + return FALSE; + + for( ; pMap->m_nID != (WORD)-1; pMap++, pUIData++) + { + if(nID == (int)pMap->m_nID) + { + if(bDefault) + { + if((pUIData->m_wState & UPDUI_DEFAULT) == 0) + { + pUIData->m_wState |= pMap->m_wType; + pUIData->m_wState |= UPDUI_DEFAULT; + } + } + else + { + if((pUIData->m_wState & UPDUI_DEFAULT) != 0) + { + pUIData->m_wState |= pMap->m_wType; + pUIData->m_wState &= ~UPDUI_DEFAULT; + pUIData->m_wState |= UPDUI_CLEARDEFAULT; + } + } + + if(bForceUpdate) + pUIData->m_wState |= pMap->m_wType; + if(pUIData->m_wState & pMap->m_wType) + m_wDirtyType |= pMap->m_wType; + + break; // found + } + } + + return TRUE; + } + +// methods for complete state set/get + BOOL UISetState(int nID, DWORD dwState) + { + const _AtlUpdateUIMap* pMap = m_pUIMap; + _AtlUpdateUIData* pUIData = m_pUIData; + if(pUIData == NULL) + return FALSE; + for( ; pMap->m_nID != (WORD)-1; pMap++, pUIData++) + { + if(nID == (int)pMap->m_nID) + { + pUIData->m_wState = (WORD)(dwState | pMap->m_wType); + m_wDirtyType |= pMap->m_wType; + break; // found + } + } + return TRUE; + } + + DWORD UIGetState(int nID) + { + const _AtlUpdateUIMap* pMap = m_pUIMap; + _AtlUpdateUIData* pUIData = m_pUIData; + if(pUIData == NULL) + return 0; + for( ; pMap->m_nID != (WORD)-1; pMap++, pUIData++) + { + if(nID == (int)pMap->m_nID) + return pUIData->m_wState; + } + return 0; + } + +// methods for updating UI +#ifndef _WIN32_WCE + BOOL UIUpdateMenuBar(BOOL bForceUpdate = FALSE, BOOL bMainMenu = FALSE) + { + if(!(m_wDirtyType & UPDUI_MENUBAR) && !bForceUpdate) + return TRUE; + + const _AtlUpdateUIMap* pMap = m_pUIMap; + _AtlUpdateUIData* pUIData = m_pUIData; + if(pUIData == NULL) + return FALSE; + + while(pMap->m_nID != (WORD)-1) + { + for(int i = 0; i < m_UIElements.GetSize(); i++) + { + if(m_UIElements[i].m_wType == UPDUI_MENUBAR) + { + HMENU hMenu = ::GetMenu(m_UIElements[i].m_hWnd); + if(hMenu != NULL && (pUIData->m_wState & UPDUI_MENUBAR) && (pMap->m_wType & UPDUI_MENUBAR)) + UIUpdateMenuBarElement(pMap->m_nID, pUIData, hMenu); + } + if(bMainMenu) + ::DrawMenuBar(m_UIElements[i].m_hWnd); + } + pMap++; + pUIData->m_wState &= ~UPDUI_MENUBAR; + if(pUIData->m_wState & UPDUI_TEXT) + { + delete [] pUIData->m_lpstrText; + pUIData->m_lpstrText = NULL; + pUIData->m_wState &= ~UPDUI_TEXT; + } + pUIData++; + } + + m_wDirtyType &= ~UPDUI_MENUBAR; + return TRUE; + } +#endif // !_WIN32_WCE + + BOOL UIUpdateToolBar(BOOL bForceUpdate = FALSE) + { + if(!(m_wDirtyType & UPDUI_TOOLBAR) && !bForceUpdate) + return TRUE; + + const _AtlUpdateUIMap* pMap = m_pUIMap; + _AtlUpdateUIData* pUIData = m_pUIData; + if(pUIData == NULL) + return FALSE; + + while(pMap->m_nID != (WORD)-1) + { + for(int i = 0; i < m_UIElements.GetSize(); i++) + { + if(m_UIElements[i].m_wType == UPDUI_TOOLBAR) + { + if((pUIData->m_wState & UPDUI_TOOLBAR) && (pMap->m_wType & UPDUI_TOOLBAR)) + UIUpdateToolBarElement(pMap->m_nID, pUIData, m_UIElements[i].m_hWnd); + } + } + pMap++; + pUIData->m_wState &= ~UPDUI_TOOLBAR; + pUIData++; + } + + m_wDirtyType &= ~UPDUI_TOOLBAR; + return TRUE; + } + + BOOL UIUpdateStatusBar(BOOL bForceUpdate = FALSE) + { + if(!(m_wDirtyType & UPDUI_STATUSBAR) && !bForceUpdate) + return TRUE; + + const _AtlUpdateUIMap* pMap = m_pUIMap; + _AtlUpdateUIData* pUIData = m_pUIData; + if(pUIData == NULL) + return FALSE; + + while(pMap->m_nID != (WORD)-1) + { + for(int i = 0; i < m_UIElements.GetSize(); i++) + { + if(m_UIElements[i].m_wType == UPDUI_STATUSBAR) + { + if((pUIData->m_wState & UPDUI_STATUSBAR) && (pMap->m_wType & UPDUI_STATUSBAR)) + UIUpdateStatusBarElement(pMap->m_nID, pUIData, m_UIElements[i].m_hWnd); + } + } + pMap++; + pUIData->m_wState &= ~UPDUI_STATUSBAR; + if(pUIData->m_wState & UPDUI_TEXT) + { + delete [] pUIData->m_lpstrText; + pUIData->m_lpstrText = NULL; + pUIData->m_wState &= ~UPDUI_TEXT; + } + pUIData++; + } + + m_wDirtyType &= ~UPDUI_STATUSBAR; + return TRUE; + } + + BOOL UIUpdateChildWindows(BOOL bForceUpdate = FALSE) + { + if(!(m_wDirtyType & UPDUI_CHILDWINDOW) && !bForceUpdate) + return TRUE; + + const _AtlUpdateUIMap* pMap = m_pUIMap; + _AtlUpdateUIData* pUIData = m_pUIData; + if(pUIData == NULL) + return FALSE; + + while(pMap->m_nID != (WORD)-1) + { + for(int i = 0; i < m_UIElements.GetSize(); i++) + { + if(m_UIElements[i].m_wType == UPDUI_CHILDWINDOW) + { + if((pUIData->m_wState & UPDUI_CHILDWINDOW) && (pMap->m_wType & UPDUI_CHILDWINDOW)) + UIUpdateChildWindow(pMap->m_nID, pUIData, m_UIElements[i].m_hWnd); + } + } + pMap++; + pUIData->m_wState &= ~UPDUI_CHILDWINDOW; + if(pUIData->m_wState & UPDUI_TEXT) + { + delete [] pUIData->m_lpstrText; + pUIData->m_lpstrText = NULL; + pUIData->m_wState &= ~UPDUI_TEXT; + } + pUIData++; + } + + m_wDirtyType &= ~UPDUI_CHILDWINDOW; + return TRUE; + } + +// internal element specific methods + static void UIUpdateMenuBarElement(int nID, _AtlUpdateUIData* pUIData, HMENU hMenu) + { +#ifndef _WIN32_WCE + if((pUIData->m_wState & UPDUI_CLEARDEFAULT) != 0) + { + ::SetMenuDefaultItem(hMenu, (UINT)-1, 0); + pUIData->m_wState &= ~UPDUI_CLEARDEFAULT; + } +#endif // !_WIN32_WCE + + CMenuItemInfo mii; + mii.fMask = MIIM_STATE; + mii.wID = nID; + +#ifndef _WIN32_WCE + if((pUIData->m_wState & UPDUI_DISABLED) != 0) + mii.fState |= MFS_DISABLED | MFS_GRAYED; + else + mii.fState |= MFS_ENABLED; + + if((pUIData->m_wState & UPDUI_CHECKED) != 0) + mii.fState |= MFS_CHECKED; + else + mii.fState |= MFS_UNCHECKED; + + if((pUIData->m_wState & UPDUI_DEFAULT) != 0) + mii.fState |= MFS_DEFAULT; +#else // CE specific + // ::SetMenuItemInfo() can't disable or check menu items + // on Windows CE, so we have to do that directly + UINT uEnable = MF_BYCOMMAND; + if((pUIData->m_wState & UPDUI_DISABLED) != 0) + uEnable |= MF_GRAYED; + else + uEnable |= MF_ENABLED; + ::EnableMenuItem(hMenu, nID, uEnable); + + UINT uCheck = MF_BYCOMMAND; + if((pUIData->m_wState & UPDUI_CHECKED) != 0) + uCheck |= MF_CHECKED; + else + uCheck |= MF_UNCHECKED; + ::CheckMenuItem(hMenu, nID, uCheck); +#endif // _WIN32_WCE + + if((pUIData->m_wState & UPDUI_TEXT) != 0) + { + CMenuItemInfo miiNow; + miiNow.fMask = MIIM_TYPE; + miiNow.wID = nID; + if(::GetMenuItemInfo(hMenu, nID, FALSE, &miiNow)) + { + mii.fMask |= MIIM_TYPE; + // MFT_BITMAP and MFT_SEPARATOR don't go together with MFT_STRING +#ifndef _WIN32_WCE + mii.fType |= (miiNow.fType & ~(MFT_BITMAP | MFT_SEPARATOR)) | MFT_STRING; +#else // CE specific + mii.fType |= (miiNow.fType & ~(MFT_SEPARATOR)) | MFT_STRING; +#endif // _WIN32_WCE + mii.dwTypeData = pUIData->m_lpstrText; + } + } + + ::SetMenuItemInfo(hMenu, nID, FALSE, &mii); + } + + static void UIUpdateToolBarElement(int nID, _AtlUpdateUIData* pUIData, HWND hWndToolBar) + { + // Note: only handles enabled/disabled, checked state, and radio (press) + ::SendMessage(hWndToolBar, TB_ENABLEBUTTON, nID, (LPARAM)(pUIData->m_wState & UPDUI_DISABLED) ? FALSE : TRUE); + ::SendMessage(hWndToolBar, TB_CHECKBUTTON, nID, (LPARAM)(pUIData->m_wState & UPDUI_CHECKED) ? TRUE : FALSE); + ::SendMessage(hWndToolBar, TB_INDETERMINATE, nID, (LPARAM)(pUIData->m_wState & UPDUI_CHECKED2) ? TRUE : FALSE); + ::SendMessage(hWndToolBar, TB_PRESSBUTTON, nID, (LPARAM)(pUIData->m_wState & UPDUI_RADIO) ? TRUE : FALSE); + } + + static void UIUpdateStatusBarElement(int nID, _AtlUpdateUIData* pUIData, HWND hWndStatusBar) + { + // Note: only handles text + if(pUIData->m_wState & UPDUI_TEXT) + ::SendMessage(hWndStatusBar, SB_SETTEXT, nID, (LPARAM)pUIData->m_lpstrText); + } + + static void UIUpdateChildWindow(int nID, _AtlUpdateUIData* pUIData, HWND hWnd) + { + HWND hChild = ::GetDlgItem(hWnd, nID); + + ::EnableWindow(hChild, (pUIData->m_wState & UPDUI_DISABLED) ? FALSE : TRUE); + // for check and radio, assume that window is a button + int nCheck = BST_UNCHECKED; + if(pUIData->m_wState & UPDUI_CHECKED || pUIData->m_wState & UPDUI_RADIO) + nCheck = BST_CHECKED; + else if(pUIData->m_wState & UPDUI_CHECKED2) + nCheck = BST_INDETERMINATE; + ::SendMessage(hChild, BM_SETCHECK, nCheck, 0L); + if(pUIData->m_wState & UPDUI_DEFAULT) + { + DWORD dwRet = (DWORD)::SendMessage(hWnd, DM_GETDEFID, 0, 0L); + if(HIWORD(dwRet) == DC_HASDEFID) + { + HWND hOldDef = ::GetDlgItem(hWnd, (int)(short)LOWORD(dwRet)); + // remove BS_DEFPUSHBUTTON + ::SendMessage(hOldDef, BM_SETSTYLE, BS_PUSHBUTTON, MAKELPARAM(TRUE, 0)); + } + ::SendMessage(hWnd, DM_SETDEFID, nID, 0L); + } + if(pUIData->m_wState & UPDUI_TEXT) + ::SetWindowText(hChild, pUIData->m_lpstrText); + } +}; + +template +class CUpdateUI : public CUpdateUIBase +{ +public: + CUpdateUI() + { + T* pT = static_cast(this); + pT; + const _AtlUpdateUIMap* pMap = pT->GetUpdateUIMap(); + m_pUIMap = pMap; + ATLASSERT(m_pUIMap != NULL); + int nCount; + for(nCount = 1; pMap->m_nID != (WORD)-1; nCount++) + pMap++; + + // check for duplicates (debug only) +#ifdef _DEBUG + for(int i = 0; i < nCount; i++) + { + for(int j = 0; j < nCount; j++) + { + // shouldn't have duplicates in the update UI map + if(i != j) + ATLASSERT(m_pUIMap[j].m_nID != m_pUIMap[i].m_nID); + } + } +#endif // _DEBUG + + ATLTRY(m_pUIData = new _AtlUpdateUIData[nCount]); + ATLASSERT(m_pUIData != NULL); + + if(m_pUIData != NULL) + memset(m_pUIData, 0, sizeof(_AtlUpdateUIData) * nCount); + } +}; + + +/////////////////////////////////////////////////////////////////////////////// +// CDynamicUpdateUI - allows update elements to dynamically added and removed +// in addition to a static update UI map + +template +class CDynamicUpdateUI : public CUpdateUIBase +{ +public: +// Data members + ATL::CSimpleArray<_AtlUpdateUIMap> m_arrUIMap; // copy of the static UI data + ATL::CSimpleArray<_AtlUpdateUIData> m_arrUIData; // instance UI data + +// Constructor/destructor + CDynamicUpdateUI() + { + T* pT = static_cast(this); + pT; + const _AtlUpdateUIMap* pMap = pT->GetUpdateUIMap(); + ATLASSERT(pMap != NULL); + + for(;;) + { + BOOL bRet = m_arrUIMap.Add(*(_AtlUpdateUIMap*)pMap); + ATLASSERT(bRet); + + if(bRet != FALSE) + { + _AtlUpdateUIData data = { 0, NULL }; + bRet = m_arrUIData.Add(data); + ATLASSERT(bRet); + } + + if(pMap->m_nID == (WORD)-1) + break; + + pMap++; + } + + ATLASSERT(m_arrUIMap.GetSize() == m_arrUIData.GetSize()); + +#ifdef _DEBUG + // check for duplicates (debug only) + for(int i = 0; i < m_arrUIMap.GetSize(); i++) + { + for(int j = 0; j < m_arrUIMap.GetSize(); j++) + { + // shouldn't have duplicates in the update UI map + if(i != j) + ATLASSERT(m_arrUIMap[j].m_nID != m_arrUIMap[i].m_nID); + } + } +#endif // _DEBUG + + // Set internal data pointers to point to the new data arrays + m_pUIMap = m_arrUIMap.m_aT; + m_pUIData = m_arrUIData.m_aT; + } + + ~CDynamicUpdateUI() + { + for(int i = 0; i < m_arrUIData.GetSize(); i++) + { + if((m_arrUIData[i].m_wState & UPDUI_TEXT) != 0) + delete [] m_arrUIData[i].m_lpstrText; + } + + // Reset internal data pointers (memory will be released by CSimpleArray d-tor) + m_pUIMap = NULL; + m_pUIData = NULL; + } + +// Methods for dynamically adding and removing update elements + bool UIAddUpdateElement(WORD nID, WORD wType) + { + // check for duplicates + for(int i = 0; i < m_arrUIMap.GetSize(); i++) + { + // shouldn't have duplicates in the update UI map + ATLASSERT(m_arrUIMap[i].m_nID != nID); + if(m_arrUIMap[i].m_nID == nID) + return false; + } + + bool bRetVal = false; + + // Add new end element + _AtlUpdateUIMap uumEnd = { (WORD)-1, 0 }; + BOOL bRet = m_arrUIMap.Add(uumEnd); + ATLASSERT(bRet); + + if(bRet != FALSE) + { + _AtlUpdateUIData uud = { 0, NULL }; + bRet = m_arrUIData.Add(uud); + ATLASSERT(bRet); + + // Set new data to the previous end element + if(bRet != FALSE) + { + int nSize = m_arrUIMap.GetSize(); + _AtlUpdateUIMap uum = { nID, wType }; + m_arrUIMap.SetAtIndex(nSize - 2, uum); + m_arrUIData.SetAtIndex(nSize - 2, uud); + + // Set internal data pointers again, just in case that memory moved + m_pUIMap = m_arrUIMap.m_aT; + m_pUIData = m_arrUIData.m_aT; + + bRetVal = true; + } + } + + return bRetVal; + } + + bool UIRemoveUpdateElement(WORD nID) + { + bool bRetVal = false; + + for(int i = 0; i < m_arrUIMap.GetSize(); i++) + { + if(m_arrUIMap[i].m_nID == nID) + { + BOOL bRet = m_arrUIMap.RemoveAt(i); + ATLASSERT(bRet); + bRet = m_arrUIData.RemoveAt(i); + ATLASSERT(bRet); + + bRetVal = true; + break; + } + } + + return bRetVal; + } +}; + + +/////////////////////////////////////////////////////////////////////////////// +// CDialogResize - provides support for resizing dialog controls +// (works for any window that has child controls) + +// Put CDialogResize in the list of base classes for a dialog (or even plain window), +// then implement DLGRESIZE map by specifying controls and groups of control +// and using DLSZ_* values to specify how are they supposed to be resized. +// +// Notes: +// - Resizeable border (WS_THICKFRAME style) should be set in the dialog template +// for top level dialogs (popup or overlapped), so that users can resize the dialog. +// - Some flags cannot be combined; for instance DLSZ_CENTER_X overrides DLSZ_SIZE_X, +// DLSZ_SIZE_X overrides DLSZ_MOVE_X. X and Y flags can be combined. +// - Order of controls is important - group controls are resized and moved based +// on the position of the previous control in a group. + +// dialog resize map macros +#define BEGIN_DLGRESIZE_MAP(thisClass) \ + static const _AtlDlgResizeMap* GetDlgResizeMap() \ + { \ + static const _AtlDlgResizeMap theMap[] = \ + { + +#define END_DLGRESIZE_MAP() \ + { -1, 0 }, \ + }; \ + return theMap; \ + } + +#define DLGRESIZE_CONTROL(id, flags) \ + { id, flags }, + +#define BEGIN_DLGRESIZE_GROUP() \ + { -1, _DLSZ_BEGIN_GROUP }, + +#define END_DLGRESIZE_GROUP() \ + { -1, _DLSZ_END_GROUP }, + + +template +class CDialogResize +{ +public: +// Data declarations and members + enum + { + DLSZ_SIZE_X = 0x00000001, + DLSZ_SIZE_Y = 0x00000002, + DLSZ_MOVE_X = 0x00000004, + DLSZ_MOVE_Y = 0x00000008, + DLSZ_REPAINT = 0x00000010, + DLSZ_CENTER_X = 0x00000020, + DLSZ_CENTER_Y = 0x00000040, + + // internal use only + _DLSZ_BEGIN_GROUP = 0x00001000, + _DLSZ_END_GROUP = 0x00002000, + _DLSZ_GRIPPER = 0x00004000 + }; + + struct _AtlDlgResizeMap + { + int m_nCtlID; + DWORD m_dwResizeFlags; + }; + + struct _AtlDlgResizeData + { + int m_nCtlID; + DWORD m_dwResizeFlags; + RECT m_rect; + + int GetGroupCount() const + { + return (int)LOBYTE(HIWORD(m_dwResizeFlags)); + } + + void SetGroupCount(int nCount) + { + ATLASSERT(nCount > 0 && nCount < 256); + DWORD dwCount = (DWORD)MAKELONG(0, MAKEWORD(nCount, 0)); + m_dwResizeFlags &= 0xFF00FFFF; + m_dwResizeFlags |= dwCount; + } + + bool operator ==(const _AtlDlgResizeData& r) const + { return (m_nCtlID == r.m_nCtlID && m_dwResizeFlags == r.m_dwResizeFlags); } + }; + + ATL::CSimpleArray<_AtlDlgResizeData> m_arrData; + SIZE m_sizeDialog; + POINT m_ptMinTrackSize; + bool m_bGripper; + + +// Constructor + CDialogResize() : m_bGripper(false) + { + m_sizeDialog.cx = 0; + m_sizeDialog.cy = 0; + m_ptMinTrackSize.x = -1; + m_ptMinTrackSize.y = -1; + } + +// Operations + void DlgResize_Init(bool bAddGripper = true, bool bUseMinTrackSize = true, DWORD dwForceStyle = WS_CLIPCHILDREN) + { + T* pT = static_cast(this); + ATLASSERT(::IsWindow(pT->m_hWnd)); + + DWORD dwStyle = pT->GetStyle(); + +#ifdef _DEBUG + // Debug only: Check if top level dialogs have a resizeable border. + if(((dwStyle & WS_CHILD) == 0) && ((dwStyle & WS_THICKFRAME) == 0)) + ATLTRACE2(atlTraceUI, 0, _T("DlgResize_Init - warning: top level dialog without the WS_THICKFRAME style - user cannot resize it\n")); +#endif // _DEBUG + + // Force specified styles (default WS_CLIPCHILDREN reduces flicker) + if((dwStyle & dwForceStyle) != dwForceStyle) + pT->ModifyStyle(0, dwForceStyle); + + // Adding this style removes an empty icon that dialogs with WS_THICKFRAME have. + // Setting icon to NULL is required when XP themes are active. + // Note: This will not prevent adding an icon for the dialog using SetIcon() + if((dwStyle & WS_CHILD) == 0) + { + pT->ModifyStyleEx(0, WS_EX_DLGMODALFRAME); + if(pT->GetIcon(FALSE) == NULL) + pT->SetIcon(NULL, FALSE); + } + + // Cleanup in case of multiple initialization + // block: first check for the gripper control, destroy it if needed + { + ATL::CWindow wndGripper = pT->GetDlgItem(ATL_IDW_STATUS_BAR); + if(wndGripper.IsWindow() && m_arrData.GetSize() > 0 && (m_arrData[0].m_dwResizeFlags & _DLSZ_GRIPPER) != 0) + wndGripper.DestroyWindow(); + } + // clear out everything else + m_arrData.RemoveAll(); + m_sizeDialog.cx = 0; + m_sizeDialog.cy = 0; + m_ptMinTrackSize.x = -1; + m_ptMinTrackSize.y = -1; + + // Get initial dialog client size + RECT rectDlg = { 0 }; + pT->GetClientRect(&rectDlg); + m_sizeDialog.cx = rectDlg.right; + m_sizeDialog.cy = rectDlg.bottom; + +#ifndef _WIN32_WCE + // Create gripper if requested + m_bGripper = false; + if(bAddGripper) + { + // shouldn't exist already + ATLASSERT(!::IsWindow(pT->GetDlgItem(ATL_IDW_STATUS_BAR))); + if(!::IsWindow(pT->GetDlgItem(ATL_IDW_STATUS_BAR))) + { + ATL::CWindow wndGripper; + wndGripper.Create(_T("SCROLLBAR"), pT->m_hWnd, rectDlg, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | SBS_SIZEBOX | SBS_SIZEGRIP | SBS_SIZEBOXBOTTOMRIGHTALIGN, 0, ATL_IDW_STATUS_BAR); + ATLASSERT(wndGripper.IsWindow()); + if(wndGripper.IsWindow()) + { + m_bGripper = true; + RECT rectCtl = { 0 }; + wndGripper.GetWindowRect(&rectCtl); + ::MapWindowPoints(NULL, pT->m_hWnd, (LPPOINT)&rectCtl, 2); + _AtlDlgResizeData data = { ATL_IDW_STATUS_BAR, DLSZ_MOVE_X | DLSZ_MOVE_Y | DLSZ_REPAINT | _DLSZ_GRIPPER, { rectCtl.left, rectCtl.top, rectCtl.right, rectCtl.bottom } }; + m_arrData.Add(data); + } + } + } +#else // CE specific + bAddGripper; // avoid level 4 warning +#endif // _WIN32_WCE + + // Get min track position if requested + if(bUseMinTrackSize) + { + if((dwStyle & WS_CHILD) != 0) + { + RECT rect = { 0 }; + pT->GetClientRect(&rect); + m_ptMinTrackSize.x = rect.right - rect.left; + m_ptMinTrackSize.y = rect.bottom - rect.top; + } + else + { + RECT rect = { 0 }; + pT->GetWindowRect(&rect); + m_ptMinTrackSize.x = rect.right - rect.left; + m_ptMinTrackSize.y = rect.bottom - rect.top; + } + } + + // Walk the map and initialize data + const _AtlDlgResizeMap* pMap = pT->GetDlgResizeMap(); + ATLASSERT(pMap != NULL); + int nGroupStart = -1; + for(int nCount = 1; !(pMap->m_nCtlID == -1 && pMap->m_dwResizeFlags == 0); nCount++, pMap++) + { + if(pMap->m_nCtlID == -1) + { + switch(pMap->m_dwResizeFlags) + { + case _DLSZ_BEGIN_GROUP: + ATLASSERT(nGroupStart == -1); + nGroupStart = m_arrData.GetSize(); + break; + case _DLSZ_END_GROUP: + { + ATLASSERT(nGroupStart != -1); + int nGroupCount = m_arrData.GetSize() - nGroupStart; + m_arrData[nGroupStart].SetGroupCount(nGroupCount); + nGroupStart = -1; + } + break; + default: + ATLASSERT(FALSE && _T("Invalid DLGRESIZE Map Entry")); + break; + } + } + else + { + // this ID conflicts with the default gripper one + ATLASSERT(m_bGripper ? (pMap->m_nCtlID != ATL_IDW_STATUS_BAR) : TRUE); + + ATL::CWindow ctl = pT->GetDlgItem(pMap->m_nCtlID); + ATLASSERT(ctl.IsWindow()); + RECT rectCtl = { 0 }; + ctl.GetWindowRect(&rectCtl); + ::MapWindowPoints(NULL, pT->m_hWnd, (LPPOINT)&rectCtl, 2); + + DWORD dwGroupFlag = (nGroupStart != -1 && m_arrData.GetSize() == nGroupStart) ? _DLSZ_BEGIN_GROUP : 0; + _AtlDlgResizeData data = { pMap->m_nCtlID, pMap->m_dwResizeFlags | dwGroupFlag, { rectCtl.left, rectCtl.top, rectCtl.right, rectCtl.bottom } }; + m_arrData.Add(data); + } + } + ATLASSERT((nGroupStart == -1) && _T("No End Group Entry in the DLGRESIZE Map")); + } + + void DlgResize_UpdateLayout(int cxWidth, int cyHeight) + { + T* pT = static_cast(this); + ATLASSERT(::IsWindow(pT->m_hWnd)); + + // Restrict minimum size if requested + if(((pT->GetStyle() & WS_CHILD) != 0) && m_ptMinTrackSize.x != -1 && m_ptMinTrackSize.y != -1) + { + if(cxWidth < m_ptMinTrackSize.x) + cxWidth = m_ptMinTrackSize.x; + if(cyHeight < m_ptMinTrackSize.y) + cyHeight = m_ptMinTrackSize.y; + } + + BOOL bVisible = pT->IsWindowVisible(); + if(bVisible) + pT->SetRedraw(FALSE); + + for(int i = 0; i < m_arrData.GetSize(); i++) + { + if((m_arrData[i].m_dwResizeFlags & _DLSZ_BEGIN_GROUP) != 0) // start of a group + { + int nGroupCount = m_arrData[i].GetGroupCount(); + ATLASSERT(nGroupCount > 0 && i + nGroupCount - 1 < m_arrData.GetSize()); + RECT rectGroup = m_arrData[i].m_rect; + + int j = 1; + for(j = 1; j < nGroupCount; j++) + { + rectGroup.left = min(rectGroup.left, m_arrData[i + j].m_rect.left); + rectGroup.top = min(rectGroup.top, m_arrData[i + j].m_rect.top); + rectGroup.right = max(rectGroup.right, m_arrData[i + j].m_rect.right); + rectGroup.bottom = max(rectGroup.bottom, m_arrData[i + j].m_rect.bottom); + } + + for(j = 0; j < nGroupCount; j++) + { + _AtlDlgResizeData* pDataPrev = NULL; + if(j > 0) + pDataPrev = &(m_arrData[i + j - 1]); + pT->DlgResize_PositionControl(cxWidth, cyHeight, rectGroup, m_arrData[i + j], true, pDataPrev); + } + + i += nGroupCount - 1; // increment to skip all group controls + } + else // one control entry + { + RECT rectGroup = { 0, 0, 0, 0 }; + pT->DlgResize_PositionControl(cxWidth, cyHeight, rectGroup, m_arrData[i], false); + } + } + + if(bVisible) + pT->SetRedraw(TRUE); + + pT->RedrawWindow(NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_UPDATENOW | RDW_ALLCHILDREN); + } + +// Message map and handlers + BEGIN_MSG_MAP(CDialogResize) + MESSAGE_HANDLER(WM_SIZE, OnSize) +#ifndef _WIN32_WCE + MESSAGE_HANDLER(WM_GETMINMAXINFO, OnGetMinMaxInfo) +#endif // _WIN32_WCE + END_MSG_MAP() + + LRESULT OnSize(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) + { + T* pT = static_cast(this); +#ifndef _WIN32_WCE + if(m_bGripper) + { + ATL::CWindow wndGripper = pT->GetDlgItem(ATL_IDW_STATUS_BAR); + if(wParam == SIZE_MAXIMIZED) + wndGripper.ShowWindow(SW_HIDE); + else if(wParam == SIZE_RESTORED) + wndGripper.ShowWindow(SW_SHOW); + } +#endif // _WIN32_WCE + if(wParam != SIZE_MINIMIZED) + { + ATLASSERT(::IsWindow(pT->m_hWnd)); + pT->DlgResize_UpdateLayout(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)); + } + return 0; + } + +#ifndef _WIN32_WCE + LRESULT OnGetMinMaxInfo(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/) + { + if(m_ptMinTrackSize.x != -1 && m_ptMinTrackSize.y != -1) + { + LPMINMAXINFO lpMMI = (LPMINMAXINFO)lParam; + lpMMI->ptMinTrackSize = m_ptMinTrackSize; + } + return 0; + } +#endif // _WIN32_WCE + +// Implementation + bool DlgResize_PositionControl(int cxWidth, int cyHeight, RECT& rectGroup, _AtlDlgResizeData& data, bool bGroup, + _AtlDlgResizeData* pDataPrev = NULL) + { + T* pT = static_cast(this); + ATLASSERT(::IsWindow(pT->m_hWnd)); + ATL::CWindow ctl; + RECT rectCtl = { 0 }; + + ctl = pT->GetDlgItem(data.m_nCtlID); + if(!ctl.GetWindowRect(&rectCtl)) + return false; + ::MapWindowPoints(NULL, pT->m_hWnd, (LPPOINT)&rectCtl, 2); + + if(bGroup) + { + if((data.m_dwResizeFlags & DLSZ_CENTER_X) != 0) + { + int cxRight = rectGroup.right + cxWidth - m_sizeDialog.cx; + int cxCtl = data.m_rect.right - data.m_rect.left; + rectCtl.left = rectGroup.left + (cxRight - rectGroup.left - cxCtl) / 2; + rectCtl.right = rectCtl.left + cxCtl; + } + else if((data.m_dwResizeFlags & (DLSZ_SIZE_X | DLSZ_MOVE_X)) != 0) + { + rectCtl.left = rectGroup.left + ::MulDiv(data.m_rect.left - rectGroup.left, rectGroup.right - rectGroup.left + (cxWidth - m_sizeDialog.cx), rectGroup.right - rectGroup.left); + + if((data.m_dwResizeFlags & DLSZ_SIZE_X) != 0) + { + rectCtl.right = rectGroup.left + ::MulDiv(data.m_rect.right - rectGroup.left, rectGroup.right - rectGroup.left + (cxWidth - m_sizeDialog.cx), rectGroup.right - rectGroup.left); + + if(pDataPrev != NULL) + { + ATL::CWindow ctlPrev = pT->GetDlgItem(pDataPrev->m_nCtlID); + RECT rcPrev = { 0 }; + ctlPrev.GetWindowRect(&rcPrev); + ::MapWindowPoints(NULL, pT->m_hWnd, (LPPOINT)&rcPrev, 2); + int dxAdjust = (rectCtl.left - rcPrev.right) - (data.m_rect.left - pDataPrev->m_rect.right); + rcPrev.right += dxAdjust; + ctlPrev.SetWindowPos(NULL, &rcPrev, SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOMOVE); + } + } + else + { + rectCtl.right = rectCtl.left + (data.m_rect.right - data.m_rect.left); + } + } + + if((data.m_dwResizeFlags & DLSZ_CENTER_Y) != 0) + { + int cyBottom = rectGroup.bottom + cyHeight - m_sizeDialog.cy; + int cyCtl = data.m_rect.bottom - data.m_rect.top; + rectCtl.top = rectGroup.top + (cyBottom - rectGroup.top - cyCtl) / 2; + rectCtl.bottom = rectCtl.top + cyCtl; + } + else if((data.m_dwResizeFlags & (DLSZ_SIZE_Y | DLSZ_MOVE_Y)) != 0) + { + rectCtl.top = rectGroup.top + ::MulDiv(data.m_rect.top - rectGroup.top, rectGroup.bottom - rectGroup.top + (cyHeight - m_sizeDialog.cy), rectGroup.bottom - rectGroup.top); + + if((data.m_dwResizeFlags & DLSZ_SIZE_Y) != 0) + { + rectCtl.bottom = rectGroup.top + ::MulDiv(data.m_rect.bottom - rectGroup.top, rectGroup.bottom - rectGroup.top + (cyHeight - m_sizeDialog.cy), rectGroup.bottom - rectGroup.top); + + if(pDataPrev != NULL) + { + ATL::CWindow ctlPrev = pT->GetDlgItem(pDataPrev->m_nCtlID); + RECT rcPrev = { 0 }; + ctlPrev.GetWindowRect(&rcPrev); + ::MapWindowPoints(NULL, pT->m_hWnd, (LPPOINT)&rcPrev, 2); + int dxAdjust = (rectCtl.top - rcPrev.bottom) - (data.m_rect.top - pDataPrev->m_rect.bottom); + rcPrev.bottom += dxAdjust; + ctlPrev.SetWindowPos(NULL, &rcPrev, SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOMOVE); + } + } + else + { + rectCtl.bottom = rectCtl.top + (data.m_rect.bottom - data.m_rect.top); + } + } + } + else // no group + { + if((data.m_dwResizeFlags & DLSZ_CENTER_X) != 0) + { + int cxCtl = data.m_rect.right - data.m_rect.left; + rectCtl.left = (cxWidth - cxCtl) / 2; + rectCtl.right = rectCtl.left + cxCtl; + } + else if((data.m_dwResizeFlags & (DLSZ_SIZE_X | DLSZ_MOVE_X)) != 0) + { + rectCtl.right = data.m_rect.right + (cxWidth - m_sizeDialog.cx); + + if((data.m_dwResizeFlags & DLSZ_MOVE_X) != 0) + rectCtl.left = rectCtl.right - (data.m_rect.right - data.m_rect.left); + } + + if((data.m_dwResizeFlags & DLSZ_CENTER_Y) != 0) + { + int cyCtl = data.m_rect.bottom - data.m_rect.top; + rectCtl.top = (cyHeight - cyCtl) / 2; + rectCtl.bottom = rectCtl.top + cyCtl; + } + else if((data.m_dwResizeFlags & (DLSZ_SIZE_Y | DLSZ_MOVE_Y)) != 0) + { + rectCtl.bottom = data.m_rect.bottom + (cyHeight - m_sizeDialog.cy); + + if((data.m_dwResizeFlags & DLSZ_MOVE_Y) != 0) + rectCtl.top = rectCtl.bottom - (data.m_rect.bottom - data.m_rect.top); + } + } + + if((data.m_dwResizeFlags & DLSZ_REPAINT) != 0) + ctl.Invalidate(); + + if((data.m_dwResizeFlags & (DLSZ_SIZE_X | DLSZ_SIZE_Y | DLSZ_MOVE_X | DLSZ_MOVE_Y | DLSZ_REPAINT | DLSZ_CENTER_X | DLSZ_CENTER_Y)) != 0) + ctl.SetWindowPos(NULL, &rectCtl, SWP_NOZORDER | SWP_NOACTIVATE); + + return true; + } +}; + + +/////////////////////////////////////////////////////////////////////////////// +// CDoubleBufferImpl - Provides double-buffer painting support to any window + +template +class CDoubleBufferImpl +{ +public: +// Overrideables + void DoPaint(CDCHandle /*dc*/) + { + // must be implemented in a derived class + ATLASSERT(FALSE); + } + +// Message map and handlers + BEGIN_MSG_MAP(CDoubleBufferImpl) + MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground) + MESSAGE_HANDLER(WM_PAINT, OnPaint) +#ifndef _WIN32_WCE + MESSAGE_HANDLER(WM_PRINTCLIENT, OnPaint) +#endif // !_WIN32_WCE + END_MSG_MAP() + + LRESULT OnEraseBackground(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) + { + return 1; // no background painting needed + } + + LRESULT OnPaint(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/) + { + T* pT = static_cast(this); + ATLASSERT(::IsWindow(pT->m_hWnd)); + + if(wParam != NULL) + { + RECT rect = { 0 }; + pT->GetClientRect(&rect); + CMemoryDC dcMem((HDC)wParam, rect); + pT->DoPaint(dcMem.m_hDC); + } + else + { + CPaintDC dc(pT->m_hWnd); + CMemoryDC dcMem(dc.m_hDC, dc.m_ps.rcPaint); + pT->DoPaint(dcMem.m_hDC); + } + + return 0; + } +}; + + +/////////////////////////////////////////////////////////////////////////////// +// CDoubleBufferWindowImpl - Implements a double-buffer painting window + +template +class ATL_NO_VTABLE CDoubleBufferWindowImpl : public ATL::CWindowImpl< T, TBase, TWinTraits >, public CDoubleBufferImpl< T > +{ +public: + BEGIN_MSG_MAP(CDoubleBufferWindowImpl) + CHAIN_MSG_MAP(CDoubleBufferImpl< T >) + END_MSG_MAP() +}; + + +// command bar support +#if !defined(__ATLCTRLW_H__) && !defined(_WIN32_WCE) + #undef CBRM_GETMENU + #undef CBRM_TRACKPOPUPMENU + #undef CBRM_GETCMDBAR + #undef CBRPOPUPMENU +#endif // !defined(__ATLCTRLW_H__) && !defined(_WIN32_WCE) + +}; // namespace WTL + +#endif // __ATLFRAME_H__ diff --git a/Externals/WTL80/atlgdi.h b/Externals/WTL80/atlgdi.h new file mode 100644 index 0000000000..49a1371cac --- /dev/null +++ b/Externals/WTL80/atlgdi.h @@ -0,0 +1,3850 @@ +// Windows Template Library - WTL version 8.0 +// Copyright (C) Microsoft Corporation. All rights reserved. +// +// This file is a part of the Windows Template Library. +// The use and distribution terms for this software are covered by the +// Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php) +// which can be found in the file CPL.TXT at the root of this distribution. +// By using this software in any fashion, you are agreeing to be bound by +// the terms of this license. You must not remove this notice, or +// any other, from this software. + +#ifndef __ATLGDI_H__ +#define __ATLGDI_H__ + +#pragma once + +#ifndef __cplusplus + #error ATL requires C++ compilation (use a .cpp suffix) +#endif + +#ifndef __ATLAPP_H__ + #error atlgdi.h requires atlapp.h to be included first +#endif + + +// protect template members from windowsx.h macros +#ifdef _INC_WINDOWSX + #undef CopyRgn + #undef CreateBrush + #undef CreatePen + #undef SelectBrush + #undef SelectPen + #undef SelectFont + #undef SelectBitmap +#endif // _INC_WINDOWSX + +// required libraries +#if !defined(_ATL_NO_MSIMG) && !defined(_WIN32_WCE) + #pragma comment(lib, "msimg32.lib") +#endif // !defined(_ATL_NO_MSIMG) && !defined(_WIN32_WCE) +#if !defined(_ATL_NO_OPENGL) && !defined(_WIN32_WCE) + #pragma comment(lib, "opengl32.lib") +#endif // !defined(_ATL_NO_OPENGL) && !defined(_WIN32_WCE) + + +/////////////////////////////////////////////////////////////////////////////// +// Classes in this file: +// +// CPenT +// CBrushT +// CLogFont +// CFontT +// CBitmapT +// CPaletteT +// CRgnT +// CDCT +// CPaintDC +// CClientDC +// CWindowDC +// CMemoryDC +// CEnhMetaFileInfo +// CEnhMetaFileT +// CEnhMetaFileDC +// +// Global functions: +// AtlGetBitmapResourceInfo() +// AtlGetBitmapResourceBitsPerPixel() +// AtlIsAlphaBitmapResource() +// AtlIsDib16() +// AtlGetDibColorTableSize() +// AtlGetDibNumColors(), +// AtlGetDibBitmap() +// AtlCopyBitmap() +// AtlCreatePackedDib16() +// AtlSetClipboardDib16() +// AtlGetClipboardDib() + + +namespace WTL +{ + +/////////////////////////////////////////////////////////////////////////////// +// Bitmap resource helpers to extract bitmap information for a bitmap resource + +inline LPBITMAPINFOHEADER AtlGetBitmapResourceInfo(HMODULE hModule, ATL::_U_STRINGorID image) +{ + HRSRC hResource = ::FindResource(hModule, image.m_lpstr, RT_BITMAP); + ATLASSERT(hResource != NULL); + HGLOBAL hGlobal = ::LoadResource(hModule, hResource); + ATLASSERT(hGlobal != NULL); + LPBITMAPINFOHEADER pBitmapInfoHeader = (LPBITMAPINFOHEADER)::LockResource(hGlobal); + ATLASSERT(pBitmapInfoHeader != NULL); + return pBitmapInfoHeader; +} + +inline WORD AtlGetBitmapResourceBitsPerPixel(HMODULE hModule, ATL::_U_STRINGorID image) +{ + LPBITMAPINFOHEADER pBitmapInfoHeader = AtlGetBitmapResourceInfo(hModule, image); + ATLASSERT(pBitmapInfoHeader != NULL); + return pBitmapInfoHeader->biBitCount; +} + +inline WORD AtlGetBitmapResourceBitsPerPixel(ATL::_U_STRINGorID image) +{ + return AtlGetBitmapResourceBitsPerPixel(ModuleHelper::GetResourceInstance(), image); +} + +/////////////////////////////////////////////////////////////////////////////// +// 32-bit (alpha channel) bitmap resource helper + +// Note: 32-bit (alpha channel) images work only on Windows XP with Common Controls version 6. +// If you want your app to work on older version of Windows, load non-alpha images if Common +// Controls version is less than 6. + +inline bool AtlIsAlphaBitmapResource(ATL::_U_STRINGorID image) +{ + return (AtlGetBitmapResourceBitsPerPixel(image) == 32); +} + + +/////////////////////////////////////////////////////////////////////////////// +// CPen + +template +class CPenT +{ +public: +// Data members + HPEN m_hPen; + +// Constructor/destructor/operators + CPenT(HPEN hPen = NULL) : m_hPen(hPen) + { } + + ~CPenT() + { + if(t_bManaged && m_hPen != NULL) + DeleteObject(); + } + + CPenT& operator =(HPEN hPen) + { + Attach(hPen); + return *this; + } + + void Attach(HPEN hPen) + { + if(t_bManaged && m_hPen != NULL && m_hPen != hPen) + ::DeleteObject(m_hPen); + m_hPen = hPen; + } + + HPEN Detach() + { + HPEN hPen = m_hPen; + m_hPen = NULL; + return hPen; + } + + operator HPEN() const { return m_hPen; } + + bool IsNull() const { return (m_hPen == NULL); } + +// Create methods + HPEN CreatePen(int nPenStyle, int nWidth, COLORREF crColor) + { + ATLASSERT(m_hPen == NULL); + m_hPen = ::CreatePen(nPenStyle, nWidth, crColor); + return m_hPen; + } + +#ifndef _WIN32_WCE + HPEN CreatePen(int nPenStyle, int nWidth, const LOGBRUSH* pLogBrush, int nStyleCount = 0, const DWORD* lpStyle = NULL) + { + ATLASSERT(m_hPen == NULL); + m_hPen = ::ExtCreatePen(nPenStyle, nWidth, pLogBrush, nStyleCount, lpStyle); + return m_hPen; + } +#endif // !_WIN32_WCE + + HPEN CreatePenIndirect(LPLOGPEN lpLogPen) + { + ATLASSERT(m_hPen == NULL); + m_hPen = ::CreatePenIndirect(lpLogPen); + return m_hPen; + } + + BOOL DeleteObject() + { + ATLASSERT(m_hPen != NULL); + BOOL bRet = ::DeleteObject(m_hPen); + if(bRet) + m_hPen = NULL; + return bRet; + } + +// Attributes + int GetLogPen(LOGPEN* pLogPen) const + { + ATLASSERT(m_hPen != NULL); + return ::GetObject(m_hPen, sizeof(LOGPEN), pLogPen); + } + + bool GetLogPen(LOGPEN& LogPen) const + { + ATLASSERT(m_hPen != NULL); + return (::GetObject(m_hPen, sizeof(LOGPEN), &LogPen) == sizeof(LOGPEN)); + } + +#ifndef _WIN32_WCE + int GetExtLogPen(EXTLOGPEN* pLogPen) const + { + ATLASSERT(m_hPen != NULL); + return ::GetObject(m_hPen, sizeof(EXTLOGPEN), pLogPen); + } + + bool GetExtLogPen(EXTLOGPEN& ExtLogPen) const + { + ATLASSERT(m_hPen != NULL); + return (::GetObject(m_hPen, sizeof(EXTLOGPEN), &ExtLogPen) == sizeof(EXTLOGPEN)); + } +#endif // !_WIN32_WCE +}; + +typedef CPenT CPenHandle; +typedef CPenT CPen; + + +/////////////////////////////////////////////////////////////////////////////// +// CBrush + +template +class CBrushT +{ +public: +// Data members + HBRUSH m_hBrush; + +// Constructor/destructor/operators + CBrushT(HBRUSH hBrush = NULL) : m_hBrush(hBrush) + { } + + ~CBrushT() + { + if(t_bManaged && m_hBrush != NULL) + DeleteObject(); + } + + CBrushT& operator =(HBRUSH hBrush) + { + Attach(hBrush); + return *this; + } + + void Attach(HBRUSH hBrush) + { + if(t_bManaged && m_hBrush != NULL && m_hBrush != hBrush) + ::DeleteObject(m_hBrush); + m_hBrush = hBrush; + } + + HBRUSH Detach() + { + HBRUSH hBrush = m_hBrush; + m_hBrush = NULL; + return hBrush; + } + + operator HBRUSH() const { return m_hBrush; } + + bool IsNull() const { return (m_hBrush == NULL); } + +// Create methods + HBRUSH CreateSolidBrush(COLORREF crColor) + { + ATLASSERT(m_hBrush == NULL); + m_hBrush = ::CreateSolidBrush(crColor); + return m_hBrush; + } + +#ifndef _WIN32_WCE + HBRUSH CreateHatchBrush(int nIndex, COLORREF crColor) + { + ATLASSERT(m_hBrush == NULL); + m_hBrush = ::CreateHatchBrush(nIndex, crColor); + return m_hBrush; + } +#endif // !_WIN32_WCE + +#if !defined(_WIN32_WCE) || (_ATL_VER >= 0x0800) + HBRUSH CreateBrushIndirect(const LOGBRUSH* lpLogBrush) + { + ATLASSERT(m_hBrush == NULL); +#ifndef _WIN32_WCE + m_hBrush = ::CreateBrushIndirect(lpLogBrush); +#else // CE specific + m_hBrush = ATL::CreateBrushIndirect(lpLogBrush); +#endif // _WIN32_WCE + return m_hBrush; + } +#endif // !defined(_WIN32_WCE) || (_ATL_VER >= 0x0800) + + HBRUSH CreatePatternBrush(HBITMAP hBitmap) + { + ATLASSERT(m_hBrush == NULL); + m_hBrush = ::CreatePatternBrush(hBitmap); + return m_hBrush; + } + + HBRUSH CreateDIBPatternBrush(HGLOBAL hPackedDIB, UINT nUsage) + { + ATLASSERT(hPackedDIB != NULL); + const void* lpPackedDIB = GlobalLock(hPackedDIB); + ATLASSERT(lpPackedDIB != NULL); + m_hBrush = ::CreateDIBPatternBrushPt(lpPackedDIB, nUsage); + GlobalUnlock(hPackedDIB); + return m_hBrush; + } + + HBRUSH CreateDIBPatternBrush(const void* lpPackedDIB, UINT nUsage) + { + ATLASSERT(m_hBrush == NULL); + m_hBrush = ::CreateDIBPatternBrushPt(lpPackedDIB, nUsage); + return m_hBrush; + } + + HBRUSH CreateSysColorBrush(int nIndex) + { + ATLASSERT(m_hBrush == NULL); + m_hBrush = ::GetSysColorBrush(nIndex); + return m_hBrush; + } + + BOOL DeleteObject() + { + ATLASSERT(m_hBrush != NULL); + BOOL bRet = ::DeleteObject(m_hBrush); + if(bRet) + m_hBrush = NULL; + return bRet; + } + +// Attributes + int GetLogBrush(LOGBRUSH* pLogBrush) const + { + ATLASSERT(m_hBrush != NULL); + return ::GetObject(m_hBrush, sizeof(LOGBRUSH), pLogBrush); + } + + bool GetLogBrush(LOGBRUSH& LogBrush) const + { + ATLASSERT(m_hBrush != NULL); + return (::GetObject(m_hBrush, sizeof(LOGBRUSH), &LogBrush) == sizeof(LOGBRUSH)); + } +}; + +typedef CBrushT CBrushHandle; +typedef CBrushT CBrush; + + +/////////////////////////////////////////////////////////////////////////////// +// CFont + +class CLogFont : public LOGFONT +{ +public: + CLogFont() + { + memset(this, 0, sizeof(LOGFONT)); + } + + CLogFont(const LOGFONT& lf) + { + Copy(&lf); + } + + CLogFont(HFONT hFont) + { + ATLASSERT(::GetObjectType(hFont) == OBJ_FONT); + ::GetObject(hFont, sizeof(LOGFONT), (LOGFONT*)this); + } + + HFONT CreateFontIndirect() + { + return ::CreateFontIndirect(this); + } + + void SetBold() + { + lfWeight = FW_BOLD; + } + + bool IsBold() const + { + return (lfWeight >= FW_BOLD); + } + + void MakeBolder(int iScale = 1) + { + lfWeight += FW_BOLD * iScale; + } + + void MakeLarger(int iScale) + { + if(lfHeight > 0) + lfHeight += iScale; + else + lfHeight -= iScale; + } + + void SetHeight(LONG nPointSize, HDC hDC = NULL) + { + // For MM_TEXT mapping mode + lfHeight = -::MulDiv(nPointSize, ::GetDeviceCaps(hDC, LOGPIXELSY), 72); + } + + LONG GetHeight(HDC hDC = NULL) const + { + // For MM_TEXT mapping mode + return ::MulDiv(-lfHeight, 72, ::GetDeviceCaps(hDC, LOGPIXELSY)); + } + + LONG GetDeciPointHeight(HDC hDC = NULL) const + { +#ifndef _WIN32_WCE + POINT ptOrg = { 0, 0 }; + ::DPtoLP(hDC, &ptOrg, 1); + POINT pt = { 0, 0 }; + pt.y = abs(lfHeight) + ptOrg.y; + ::LPtoDP(hDC,&pt,1); + return ::MulDiv(pt.y, 720, ::GetDeviceCaps(hDC, LOGPIXELSY)); // 72 points/inch, 10 decipoints/point +#else // CE specific + // DP and LP are always the same on CE + return ::MulDiv(abs(lfHeight), 720, ::GetDeviceCaps(hDC, LOGPIXELSY)); // 72 points/inch, 10 decipoints/point +#endif // _WIN32_WCE + } + + void SetHeightFromDeciPoint(LONG nDeciPtHeight, HDC hDC = NULL) + { +#ifndef _WIN32_WCE + POINT pt = { 0, 0 }; + pt.y = ::MulDiv(::GetDeviceCaps(hDC, LOGPIXELSY), nDeciPtHeight, 720); // 72 points/inch, 10 decipoints/point + ::DPtoLP(hDC, &pt, 1); + POINT ptOrg = { 0, 0 }; + ::DPtoLP(hDC, &ptOrg, 1); + lfHeight = -abs(pt.y - ptOrg.y); +#else // CE specific + // DP and LP are always the same on CE + lfHeight = -abs(::MulDiv(::GetDeviceCaps(hDC, LOGPIXELSY), nDeciPtHeight, 720)); // 72 points/inch, 10 decipoints/point +#endif // _WIN32_WCE + } + +#ifndef _WIN32_WCE + void SetCaptionFont() + { + NONCLIENTMETRICS ncm = { RunTimeHelper::SizeOf_NONCLIENTMETRICS() }; + ATLVERIFY(::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(ncm), &ncm, 0)); + Copy(&ncm.lfCaptionFont); + } + + void SetMenuFont() + { + NONCLIENTMETRICS ncm = { RunTimeHelper::SizeOf_NONCLIENTMETRICS() }; + ATLVERIFY(::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(ncm), &ncm, 0)); + Copy(&ncm.lfMenuFont); + } + + void SetStatusFont() + { + NONCLIENTMETRICS ncm = { RunTimeHelper::SizeOf_NONCLIENTMETRICS() }; + ATLVERIFY(::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(ncm), &ncm, 0)); + Copy(&ncm.lfStatusFont); + } + + void SetMessageBoxFont() + { + NONCLIENTMETRICS ncm = { RunTimeHelper::SizeOf_NONCLIENTMETRICS() }; + ATLVERIFY(::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(ncm), &ncm, 0)); + Copy(&ncm.lfMessageFont); + } +#endif // !_WIN32_WCE + + void Copy(const LOGFONT* pLogFont) + { + ATLASSERT(pLogFont != NULL); + *(LOGFONT*)this = *pLogFont; + } + + CLogFont& operator =(const CLogFont& src) + { + Copy(&src); + return *this; + } + + CLogFont& operator =(const LOGFONT& src) + { + Copy(&src); + return *this; + } + + CLogFont& operator =(HFONT hFont) + { + ATLASSERT(::GetObjectType(hFont) == OBJ_FONT); + ::GetObject(hFont, sizeof(LOGFONT), (LOGFONT*)this); + return *this; + } + + bool operator ==(const LOGFONT& logfont) const + { + return(logfont.lfHeight == lfHeight && + logfont.lfWidth == lfWidth && + logfont.lfEscapement == lfEscapement && + logfont.lfOrientation == lfOrientation && + logfont.lfWeight == lfWeight && + logfont.lfItalic == lfItalic && + logfont.lfUnderline == lfUnderline && + logfont.lfStrikeOut == lfStrikeOut && + logfont.lfCharSet == lfCharSet && + logfont.lfOutPrecision == lfOutPrecision && + logfont.lfClipPrecision == lfClipPrecision && + logfont.lfQuality == lfQuality && + logfont.lfPitchAndFamily == lfPitchAndFamily && + lstrcmp(logfont.lfFaceName, lfFaceName) == 0); + } +}; + + +template +class CFontT +{ +public: +// Data members + HFONT m_hFont; + +// Constructor/destructor/operators + CFontT(HFONT hFont = NULL) : m_hFont(hFont) + { } + + ~CFontT() + { + if(t_bManaged && m_hFont != NULL) + DeleteObject(); + } + + CFontT& operator =(HFONT hFont) + { + Attach(hFont); + return *this; + } + + void Attach(HFONT hFont) + { + if(t_bManaged && m_hFont != NULL && m_hFont != hFont) + ::DeleteObject(m_hFont); + m_hFont = hFont; + } + + HFONT Detach() + { + HFONT hFont = m_hFont; + m_hFont = NULL; + return hFont; + } + + operator HFONT() const { return m_hFont; } + + bool IsNull() const { return (m_hFont == NULL); } + +// Create methods + HFONT CreateFontIndirect(const LOGFONT* lpLogFont) + { + ATLASSERT(m_hFont == NULL); + m_hFont = ::CreateFontIndirect(lpLogFont); + return m_hFont; + } + +#if !defined(_WIN32_WCE) && (_WIN32_WINNT >= 0x0500) + HFONT CreateFontIndirectEx(CONST ENUMLOGFONTEXDV* penumlfex) + { + ATLASSERT(m_hFont == NULL); + m_hFont = ::CreateFontIndirectEx(penumlfex); + return m_hFont; + } +#endif // !defined(_WIN32_WCE) && (_WIN32_WINNT >= 0x0500) + +#if !defined(_WIN32_WCE) || (_ATL_VER >= 0x0800) + HFONT CreateFont(int nHeight, int nWidth, int nEscapement, + int nOrientation, int nWeight, BYTE bItalic, BYTE bUnderline, + BYTE cStrikeOut, BYTE nCharSet, BYTE nOutPrecision, + BYTE nClipPrecision, BYTE nQuality, BYTE nPitchAndFamily, + LPCTSTR lpszFacename) + { + ATLASSERT(m_hFont == NULL); +#ifndef _WIN32_WCE + m_hFont = ::CreateFont(nHeight, nWidth, nEscapement, + nOrientation, nWeight, bItalic, bUnderline, cStrikeOut, + nCharSet, nOutPrecision, nClipPrecision, nQuality, + nPitchAndFamily, lpszFacename); +#else // CE specific + m_hFont = ATL::CreateFont(nHeight, nWidth, nEscapement, + nOrientation, nWeight, bItalic, bUnderline, cStrikeOut, + nCharSet, nOutPrecision, nClipPrecision, nQuality, + nPitchAndFamily, lpszFacename); +#endif // _WIN32_WCE + return m_hFont; + } +#endif // !defined(_WIN32_WCE) || (_ATL_VER >= 0x0800) + + HFONT CreatePointFont(int nPointSize, LPCTSTR lpszFaceName, HDC hDC = NULL, bool bBold = false, bool bItalic = false) + { + LOGFONT logFont = { 0 }; + logFont.lfCharSet = DEFAULT_CHARSET; + logFont.lfHeight = nPointSize; + SecureHelper::strncpy_x(logFont.lfFaceName, _countof(logFont.lfFaceName), lpszFaceName, _TRUNCATE); + + if(bBold) + logFont.lfWeight = FW_BOLD; + if(bItalic) + logFont.lfItalic = (BYTE)TRUE; + + return CreatePointFontIndirect(&logFont, hDC); + } + + HFONT CreatePointFontIndirect(const LOGFONT* lpLogFont, HDC hDC = NULL) + { + HDC hDC1 = (hDC != NULL) ? hDC : ::GetDC(NULL); + + // convert nPointSize to logical units based on hDC + LOGFONT logFont = *lpLogFont; +#ifndef _WIN32_WCE + POINT pt = { 0, 0 }; + pt.y = ::MulDiv(::GetDeviceCaps(hDC1, LOGPIXELSY), logFont.lfHeight, 720); // 72 points/inch, 10 decipoints/point + ::DPtoLP(hDC1, &pt, 1); + POINT ptOrg = { 0, 0 }; + ::DPtoLP(hDC1, &ptOrg, 1); + logFont.lfHeight = -abs(pt.y - ptOrg.y); +#else // CE specific + // DP and LP are always the same on CE + logFont.lfHeight = -abs(::MulDiv(::GetDeviceCaps(hDC1, LOGPIXELSY), logFont.lfHeight, 720)); // 72 points/inch, 10 decipoints/point +#endif // _WIN32_WCE + + if(hDC == NULL) + ::ReleaseDC(NULL, hDC1); + + return CreateFontIndirect(&logFont); + } + + BOOL DeleteObject() + { + ATLASSERT(m_hFont != NULL); + BOOL bRet = ::DeleteObject(m_hFont); + if(bRet) + m_hFont = NULL; + return bRet; + } + +// Attributes + int GetLogFont(LOGFONT* pLogFont) const + { + ATLASSERT(m_hFont != NULL); + return ::GetObject(m_hFont, sizeof(LOGFONT), pLogFont); + } + + bool GetLogFont(LOGFONT& LogFont) const + { + ATLASSERT(m_hFont != NULL); + return (::GetObject(m_hFont, sizeof(LOGFONT), &LogFont) == sizeof(LOGFONT)); + } +}; + +typedef CFontT CFontHandle; +typedef CFontT CFont; + + +/////////////////////////////////////////////////////////////////////////////// +// CBitmap + +template +class CBitmapT +{ +public: +// Data members + HBITMAP m_hBitmap; + +// Constructor/destructor/operators + CBitmapT(HBITMAP hBitmap = NULL) : m_hBitmap(hBitmap) + { } + + ~CBitmapT() + { + if(t_bManaged && m_hBitmap != NULL) + DeleteObject(); + } + + CBitmapT& operator =(HBITMAP hBitmap) + { + Attach(hBitmap); + return *this; + } + + void Attach(HBITMAP hBitmap) + { + if(t_bManaged && m_hBitmap != NULL&& m_hBitmap != hBitmap) + ::DeleteObject(m_hBitmap); + m_hBitmap = hBitmap; + } + + HBITMAP Detach() + { + HBITMAP hBitmap = m_hBitmap; + m_hBitmap = NULL; + return hBitmap; + } + + operator HBITMAP() const { return m_hBitmap; } + + bool IsNull() const { return (m_hBitmap == NULL); } + +// Create and load methods + HBITMAP LoadBitmap(ATL::_U_STRINGorID bitmap) + { + ATLASSERT(m_hBitmap == NULL); + m_hBitmap = ::LoadBitmap(ModuleHelper::GetResourceInstance(), bitmap.m_lpstr); + return m_hBitmap; + } + + HBITMAP LoadOEMBitmap(UINT nIDBitmap) // for OBM_/OCR_/OIC_ + { + ATLASSERT(m_hBitmap == NULL); + m_hBitmap = ::LoadBitmap(NULL, MAKEINTRESOURCE(nIDBitmap)); + return m_hBitmap; + } + +#ifndef _WIN32_WCE + HBITMAP LoadMappedBitmap(UINT nIDBitmap, UINT nFlags = 0, LPCOLORMAP lpColorMap = NULL, int nMapSize = 0) + { + ATLASSERT(m_hBitmap == NULL); + m_hBitmap = ::CreateMappedBitmap(ModuleHelper::GetResourceInstance(), nIDBitmap, (WORD)nFlags, lpColorMap, nMapSize); + return m_hBitmap; + } +#endif // !_WIN32_WCE + + HBITMAP CreateBitmap(int nWidth, int nHeight, UINT nPlanes, UINT nBitsPerPixel, const void* lpBits) + { + ATLASSERT(m_hBitmap == NULL); + m_hBitmap = ::CreateBitmap(nWidth, nHeight, nPlanes, nBitsPerPixel, lpBits); + return m_hBitmap; + } + +#ifndef _WIN32_WCE + HBITMAP CreateBitmapIndirect(LPBITMAP lpBitmap) + { + ATLASSERT(m_hBitmap == NULL); + m_hBitmap = ::CreateBitmapIndirect(lpBitmap); + return m_hBitmap; + } +#endif // !_WIN32_WCE + + HBITMAP CreateCompatibleBitmap(HDC hDC, int nWidth, int nHeight) + { + ATLASSERT(m_hBitmap == NULL); + m_hBitmap = ::CreateCompatibleBitmap(hDC, nWidth, nHeight); + return m_hBitmap; + } + +#ifndef _WIN32_WCE + HBITMAP CreateDiscardableBitmap(HDC hDC, int nWidth, int nHeight) + { + ATLASSERT(m_hBitmap == NULL); + m_hBitmap = ::CreateDiscardableBitmap(hDC, nWidth, nHeight); + return m_hBitmap; + } +#endif // !_WIN32_WCE + + BOOL DeleteObject() + { + ATLASSERT(m_hBitmap != NULL); + BOOL bRet = ::DeleteObject(m_hBitmap); + if(bRet) + m_hBitmap = NULL; + return bRet; + } + +// Attributes + int GetBitmap(BITMAP* pBitMap) const + { + ATLASSERT(m_hBitmap != NULL); + return ::GetObject(m_hBitmap, sizeof(BITMAP), pBitMap); + } + + bool GetBitmap(BITMAP& bm) const + { + ATLASSERT(m_hBitmap != NULL); + return (::GetObject(m_hBitmap, sizeof(BITMAP), &bm) == sizeof(BITMAP)); + } + + bool GetSize(SIZE& size) const + { + ATLASSERT(m_hBitmap != NULL); + BITMAP bm = { 0 }; + if(!GetBitmap(&bm)) + return false; + size.cx = bm.bmWidth; + size.cy = bm.bmHeight; + return true; + } + +#ifndef _WIN32_WCE + DWORD GetBitmapBits(DWORD dwCount, LPVOID lpBits) const + { + ATLASSERT(m_hBitmap != NULL); + return ::GetBitmapBits(m_hBitmap, dwCount, lpBits); + } +#endif // !_WIN32_WCE + +#if !defined(_WIN32_WCE) || (_WIN32_WCE >= 410) + DWORD SetBitmapBits(DWORD dwCount, const void* lpBits) + { + ATLASSERT(m_hBitmap != NULL); + return ::SetBitmapBits(m_hBitmap, dwCount, lpBits); + } +#endif // !defined(_WIN32_WCE) || (_WIN32_WCE >= 410) + +#ifndef _WIN32_WCE + BOOL GetBitmapDimension(LPSIZE lpSize) const + { + ATLASSERT(m_hBitmap != NULL); + return ::GetBitmapDimensionEx(m_hBitmap, lpSize); + } + + BOOL SetBitmapDimension(int nWidth, int nHeight, LPSIZE lpSize = NULL) + { + ATLASSERT(m_hBitmap != NULL); + return ::SetBitmapDimensionEx(m_hBitmap, nWidth, nHeight, lpSize); + } + +// DIB support + HBITMAP CreateDIBitmap(HDC hDC, CONST BITMAPINFOHEADER* lpbmih, DWORD dwInit, CONST VOID* lpbInit, CONST BITMAPINFO* lpbmi, UINT uColorUse) + { + ATLASSERT(m_hBitmap == NULL); + m_hBitmap = ::CreateDIBitmap(hDC, lpbmih, dwInit, lpbInit, lpbmi, uColorUse); + return m_hBitmap; + } +#endif // !_WIN32_WCE + + HBITMAP CreateDIBSection(HDC hDC, CONST BITMAPINFO* lpbmi, UINT uColorUse, VOID** ppvBits, HANDLE hSection, DWORD dwOffset) + { + ATLASSERT(m_hBitmap == NULL); + m_hBitmap = ::CreateDIBSection(hDC, lpbmi, uColorUse, ppvBits, hSection, dwOffset); + return m_hBitmap; + } + +#ifndef _WIN32_WCE + int GetDIBits(HDC hDC, UINT uStartScan, UINT cScanLines, LPVOID lpvBits, LPBITMAPINFO lpbmi, UINT uColorUse) const + { + ATLASSERT(m_hBitmap != NULL); + return ::GetDIBits(hDC, m_hBitmap, uStartScan, cScanLines, lpvBits, lpbmi, uColorUse); + } + + int SetDIBits(HDC hDC, UINT uStartScan, UINT cScanLines, CONST VOID* lpvBits, CONST BITMAPINFO* lpbmi, UINT uColorUse) + { + ATLASSERT(m_hBitmap != NULL); + return ::SetDIBits(hDC, m_hBitmap, uStartScan, cScanLines, lpvBits, lpbmi, uColorUse); + } +#endif // !_WIN32_WCE +}; + +typedef CBitmapT CBitmapHandle; +typedef CBitmapT CBitmap; + + +/////////////////////////////////////////////////////////////////////////////// +// CPalette + +template +class CPaletteT +{ +public: +// Data members + HPALETTE m_hPalette; + +// Constructor/destructor/operators + CPaletteT(HPALETTE hPalette = NULL) : m_hPalette(hPalette) + { } + + ~CPaletteT() + { + if(t_bManaged && m_hPalette != NULL) + DeleteObject(); + } + + CPaletteT& operator =(HPALETTE hPalette) + { + Attach(hPalette); + return *this; + } + + void Attach(HPALETTE hPalette) + { + if(t_bManaged && m_hPalette != NULL && m_hPalette != hPalette) + ::DeleteObject(m_hPalette); + m_hPalette = hPalette; + } + + HPALETTE Detach() + { + HPALETTE hPalette = m_hPalette; + m_hPalette = NULL; + return hPalette; + } + + operator HPALETTE() const { return m_hPalette; } + + bool IsNull() const { return (m_hPalette == NULL); } + +// Create methods + HPALETTE CreatePalette(LPLOGPALETTE lpLogPalette) + { + ATLASSERT(m_hPalette == NULL); + m_hPalette = ::CreatePalette(lpLogPalette); + return m_hPalette; + } + +#ifndef _WIN32_WCE + HPALETTE CreateHalftonePalette(HDC hDC) + { + ATLASSERT(m_hPalette == NULL); + ATLASSERT(hDC != NULL); + m_hPalette = ::CreateHalftonePalette(hDC); + return m_hPalette; + } +#endif // !_WIN32_WCE + + BOOL DeleteObject() + { + ATLASSERT(m_hPalette != NULL); + BOOL bRet = ::DeleteObject(m_hPalette); + if(bRet) + m_hPalette = NULL; + return bRet; + } + +// Attributes + int GetEntryCount() const + { + ATLASSERT(m_hPalette != NULL); + WORD nEntries = 0; + ::GetObject(m_hPalette, sizeof(WORD), &nEntries); + return (int)nEntries; + } + + UINT GetPaletteEntries(UINT nStartIndex, UINT nNumEntries, LPPALETTEENTRY lpPaletteColors) const + { + ATLASSERT(m_hPalette != NULL); + return ::GetPaletteEntries(m_hPalette, nStartIndex, nNumEntries, lpPaletteColors); + } + + UINT SetPaletteEntries(UINT nStartIndex, UINT nNumEntries, LPPALETTEENTRY lpPaletteColors) + { + ATLASSERT(m_hPalette != NULL); + return ::SetPaletteEntries(m_hPalette, nStartIndex, nNumEntries, lpPaletteColors); + } + +// Operations +#ifndef _WIN32_WCE + void AnimatePalette(UINT nStartIndex, UINT nNumEntries, LPPALETTEENTRY lpPaletteColors) + { + ATLASSERT(m_hPalette != NULL); + ::AnimatePalette(m_hPalette, nStartIndex, nNumEntries, lpPaletteColors); + } + + BOOL ResizePalette(UINT nNumEntries) + { + ATLASSERT(m_hPalette != NULL); + return ::ResizePalette(m_hPalette, nNumEntries); + } +#endif // !_WIN32_WCE + + UINT GetNearestPaletteIndex(COLORREF crColor) const + { + ATLASSERT(m_hPalette != NULL); + return ::GetNearestPaletteIndex(m_hPalette, crColor); + } +}; + +typedef CPaletteT CPaletteHandle; +typedef CPaletteT CPalette; + + +/////////////////////////////////////////////////////////////////////////////// +// CRgn + +template +class CRgnT +{ +public: +// Data members + HRGN m_hRgn; + +// Constructor/destructor/operators + CRgnT(HRGN hRgn = NULL) : m_hRgn(hRgn) + { } + + ~CRgnT() + { + if(t_bManaged && m_hRgn != NULL) + DeleteObject(); + } + + CRgnT& operator =(HRGN hRgn) + { + Attach(hRgn); + return *this; + } + + void Attach(HRGN hRgn) + { + if(t_bManaged && m_hRgn != NULL && m_hRgn != hRgn) + ::DeleteObject(m_hRgn); + m_hRgn = hRgn; + } + + HRGN Detach() + { + HRGN hRgn = m_hRgn; + m_hRgn = NULL; + return hRgn; + } + + operator HRGN() const { return m_hRgn; } + + bool IsNull() const { return (m_hRgn == NULL); } + +// Create methods + HRGN CreateRectRgn(int x1, int y1, int x2, int y2) + { + ATLASSERT(m_hRgn == NULL); + m_hRgn = ::CreateRectRgn(x1, y1, x2, y2); + return m_hRgn; + } + + HRGN CreateRectRgnIndirect(LPCRECT lpRect) + { + ATLASSERT(m_hRgn == NULL); + m_hRgn = ::CreateRectRgnIndirect(lpRect); + return m_hRgn; + } + +#ifndef _WIN32_WCE + HRGN CreateEllipticRgn(int x1, int y1, int x2, int y2) + { + ATLASSERT(m_hRgn == NULL); + m_hRgn = ::CreateEllipticRgn(x1, y1, x2, y2); + return m_hRgn; + } + + HRGN CreateEllipticRgnIndirect(LPCRECT lpRect) + { + ATLASSERT(m_hRgn == NULL); + m_hRgn = ::CreateEllipticRgnIndirect(lpRect); + return m_hRgn; + } + + HRGN CreatePolygonRgn(LPPOINT lpPoints, int nCount, int nMode) + { + ATLASSERT(m_hRgn == NULL); + m_hRgn = ::CreatePolygonRgn(lpPoints, nCount, nMode); + return m_hRgn; + } + + HRGN CreatePolyPolygonRgn(LPPOINT lpPoints, LPINT lpPolyCounts, int nCount, int nPolyFillMode) + { + ATLASSERT(m_hRgn == NULL); + m_hRgn = ::CreatePolyPolygonRgn(lpPoints, lpPolyCounts, nCount, nPolyFillMode); + return m_hRgn; + } + + HRGN CreateRoundRectRgn(int x1, int y1, int x2, int y2, int x3, int y3) + { + ATLASSERT(m_hRgn == NULL); + m_hRgn = ::CreateRoundRectRgn(x1, y1, x2, y2, x3, y3); + return m_hRgn; + } + + HRGN CreateFromPath(HDC hDC) + { + ATLASSERT(m_hRgn == NULL); + ATLASSERT(hDC != NULL); + m_hRgn = ::PathToRegion(hDC); + return m_hRgn; + } + + HRGN CreateFromData(const XFORM* lpXForm, int nCount, const RGNDATA* pRgnData) + { + ATLASSERT(m_hRgn == NULL); + m_hRgn = ::ExtCreateRegion(lpXForm, nCount, pRgnData); + return m_hRgn; + } +#endif // !_WIN32_WCE + + BOOL DeleteObject() + { + ATLASSERT(m_hRgn != NULL); + BOOL bRet = ::DeleteObject(m_hRgn); + if(bRet) + m_hRgn = NULL; + return bRet; + } + +// Operations + void SetRectRgn(int x1, int y1, int x2, int y2) + { + ATLASSERT(m_hRgn != NULL); + ::SetRectRgn(m_hRgn, x1, y1, x2, y2); + } + + void SetRectRgn(LPCRECT lpRect) + { + ATLASSERT(m_hRgn != NULL); + ::SetRectRgn(m_hRgn, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom); + } + + int CombineRgn(HRGN hRgnSrc1, HRGN hRgnSrc2, int nCombineMode) + { + ATLASSERT(m_hRgn != NULL); + return ::CombineRgn(m_hRgn, hRgnSrc1, hRgnSrc2, nCombineMode); + } + + int CombineRgn(HRGN hRgnSrc, int nCombineMode) + { + ATLASSERT(m_hRgn != NULL); + return ::CombineRgn(m_hRgn, m_hRgn, hRgnSrc, nCombineMode); + } + + int CopyRgn(HRGN hRgnSrc) + { + ATLASSERT(m_hRgn != NULL); + return ::CombineRgn(m_hRgn, hRgnSrc, NULL, RGN_COPY); + } + + BOOL EqualRgn(HRGN hRgn) const + { + ATLASSERT(m_hRgn != NULL); + return ::EqualRgn(m_hRgn, hRgn); + } + + int OffsetRgn(int x, int y) + { + ATLASSERT(m_hRgn != NULL); + return ::OffsetRgn(m_hRgn, x, y); + } + + int OffsetRgn(POINT point) + { + ATLASSERT(m_hRgn != NULL); + return ::OffsetRgn(m_hRgn, point.x, point.y); + } + + int GetRgnBox(LPRECT lpRect) const + { + ATLASSERT(m_hRgn != NULL); + return ::GetRgnBox(m_hRgn, lpRect); + } + + BOOL PtInRegion(int x, int y) const + { + ATLASSERT(m_hRgn != NULL); + return ::PtInRegion(m_hRgn, x, y); + } + + BOOL PtInRegion(POINT point) const + { + ATLASSERT(m_hRgn != NULL); + return ::PtInRegion(m_hRgn, point.x, point.y); + } + + BOOL RectInRegion(LPCRECT lpRect) const + { + ATLASSERT(m_hRgn != NULL); + return ::RectInRegion(m_hRgn, lpRect); + } + + int GetRegionData(LPRGNDATA lpRgnData, int nDataSize) const + { + ATLASSERT(m_hRgn != NULL); + return (int)::GetRegionData(m_hRgn, nDataSize, lpRgnData); + } +}; + +typedef CRgnT CRgnHandle; +typedef CRgnT CRgn; + + +/////////////////////////////////////////////////////////////////////////////// +// CDC - The device context class + +template +class CDCT +{ +public: +// Data members + HDC m_hDC; + +// Constructor/destructor/operators + CDCT(HDC hDC = NULL) : m_hDC(hDC) + { + } + + ~CDCT() + { + if(t_bManaged && m_hDC != NULL) + ::DeleteDC(Detach()); + } + + CDCT& operator =(HDC hDC) + { + Attach(hDC); + return *this; + } + + void Attach(HDC hDC) + { + if(t_bManaged && m_hDC != NULL && m_hDC != hDC) + ::DeleteDC(m_hDC); + m_hDC = hDC; + } + + HDC Detach() + { + HDC hDC = m_hDC; + m_hDC = NULL; + return hDC; + } + + operator HDC() const { return m_hDC; } + + bool IsNull() const { return (m_hDC == NULL); } + +// Operations +#ifndef _WIN32_WCE + HWND WindowFromDC() const + { + ATLASSERT(m_hDC != NULL); + return ::WindowFromDC(m_hDC); + } +#endif // !_WIN32_WCE + + CPenHandle GetCurrentPen() const + { + ATLASSERT(m_hDC != NULL); + return CPenHandle((HPEN)::GetCurrentObject(m_hDC, OBJ_PEN)); + } + + CBrushHandle GetCurrentBrush() const + { + ATLASSERT(m_hDC != NULL); + return CBrushHandle((HBRUSH)::GetCurrentObject(m_hDC, OBJ_BRUSH)); + } + + CPaletteHandle GetCurrentPalette() const + { + ATLASSERT(m_hDC != NULL); + return CPaletteHandle((HPALETTE)::GetCurrentObject(m_hDC, OBJ_PAL)); + } + + CFontHandle GetCurrentFont() const + { + ATLASSERT(m_hDC != NULL); + return CFontHandle((HFONT)::GetCurrentObject(m_hDC, OBJ_FONT)); + } + + CBitmapHandle GetCurrentBitmap() const + { + ATLASSERT(m_hDC != NULL); + return CBitmapHandle((HBITMAP)::GetCurrentObject(m_hDC, OBJ_BITMAP)); + } + + HDC CreateDC(LPCTSTR lpszDriverName, LPCTSTR lpszDeviceName, LPCTSTR lpszOutput, const DEVMODE* lpInitData) + { + ATLASSERT(m_hDC == NULL); + m_hDC = ::CreateDC(lpszDriverName, lpszDeviceName, lpszOutput, lpInitData); + return m_hDC; + } + + HDC CreateCompatibleDC(HDC hDC = NULL) + { + ATLASSERT(m_hDC == NULL); + m_hDC = ::CreateCompatibleDC(hDC); + return m_hDC; + } + + BOOL DeleteDC() + { + if(m_hDC == NULL) + return FALSE; + BOOL bRet = ::DeleteDC(m_hDC); + if(bRet) + m_hDC = NULL; + return bRet; + } + +// Device-Context Functions + int SaveDC() + { + ATLASSERT(m_hDC != NULL); + return ::SaveDC(m_hDC); + } + + BOOL RestoreDC(int nSavedDC) + { + ATLASSERT(m_hDC != NULL); + return ::RestoreDC(m_hDC, nSavedDC); + } + + int GetDeviceCaps(int nIndex) const + { + ATLASSERT(m_hDC != NULL); + return ::GetDeviceCaps(m_hDC, nIndex); + } + +#ifndef _WIN32_WCE + UINT SetBoundsRect(LPCRECT lpRectBounds, UINT flags) + { + ATLASSERT(m_hDC != NULL); + return ::SetBoundsRect(m_hDC, lpRectBounds, flags); + } + + UINT GetBoundsRect(LPRECT lpRectBounds, UINT flags) const + { + ATLASSERT(m_hDC != NULL); + return ::GetBoundsRect(m_hDC, lpRectBounds, flags); + } + + BOOL ResetDC(const DEVMODE* lpDevMode) + { + ATLASSERT(m_hDC != NULL); + return ::ResetDC(m_hDC, lpDevMode) != NULL; + } + +// Drawing-Tool Functions + BOOL GetBrushOrg(LPPOINT lpPoint) const + { + ATLASSERT(m_hDC != NULL); + return ::GetBrushOrgEx(m_hDC, lpPoint); + } +#endif // !_WIN32_WCE + + BOOL SetBrushOrg(int x, int y, LPPOINT lpPoint = NULL) + { + ATLASSERT(m_hDC != NULL); + return ::SetBrushOrgEx(m_hDC, x, y, lpPoint); + } + + BOOL SetBrushOrg(POINT point, LPPOINT lpPointRet = NULL) + { + ATLASSERT(m_hDC != NULL); + return ::SetBrushOrgEx(m_hDC, point.x, point.y, lpPointRet); + } + +#ifndef _WIN32_WCE + int EnumObjects(int nObjectType, int (CALLBACK* lpfn)(LPVOID, LPARAM), LPARAM lpData) + { + ATLASSERT(m_hDC != NULL); +#ifdef STRICT + return ::EnumObjects(m_hDC, nObjectType, (GOBJENUMPROC)lpfn, lpData); +#else + return ::EnumObjects(m_hDC, nObjectType, (GOBJENUMPROC)lpfn, (LPVOID)lpData); +#endif + } +#endif // !_WIN32_WCE + +// Type-safe selection helpers + HPEN SelectPen(HPEN hPen) + { + ATLASSERT(m_hDC != NULL); +#ifndef _WIN32_WCE + ATLASSERT(hPen == NULL || ::GetObjectType(hPen) == OBJ_PEN || ::GetObjectType(hPen) == OBJ_EXTPEN); +#else // CE specific + ATLASSERT(hPen == NULL || ::GetObjectType(hPen) == OBJ_PEN); +#endif // _WIN32_WCE + return (HPEN)::SelectObject(m_hDC, hPen); + } + + HBRUSH SelectBrush(HBRUSH hBrush) + { + ATLASSERT(m_hDC != NULL); + ATLASSERT(hBrush == NULL || ::GetObjectType(hBrush) == OBJ_BRUSH); + return (HBRUSH)::SelectObject(m_hDC, hBrush); + } + + HFONT SelectFont(HFONT hFont) + { + ATLASSERT(m_hDC != NULL); + ATLASSERT(hFont == NULL || ::GetObjectType(hFont) == OBJ_FONT); + return (HFONT)::SelectObject(m_hDC, hFont); + } + + HBITMAP SelectBitmap(HBITMAP hBitmap) + { + ATLASSERT(m_hDC != NULL); + ATLASSERT(hBitmap == NULL || ::GetObjectType(hBitmap) == OBJ_BITMAP); + return (HBITMAP)::SelectObject(m_hDC, hBitmap); + } + + int SelectRgn(HRGN hRgn) // special return for regions + { + ATLASSERT(m_hDC != NULL); + ATLASSERT(hRgn == NULL || ::GetObjectType(hRgn) == OBJ_REGION); + return PtrToInt(::SelectObject(m_hDC, hRgn)); + } + +// Type-safe selection helpers for stock objects + HPEN SelectStockPen(int nPen) + { + ATLASSERT(m_hDC != NULL); +#if (_WIN32_WINNT >= 0x0500) + ATLASSERT(nPen == WHITE_PEN || nPen == BLACK_PEN || nPen == NULL_PEN || nPen == DC_PEN); +#else + ATLASSERT(nPen == WHITE_PEN || nPen == BLACK_PEN || nPen == NULL_PEN); +#endif // !(_WIN32_WINNT >= 0x0500) + return SelectPen((HPEN)::GetStockObject(nPen)); + } + + HBRUSH SelectStockBrush(int nBrush) + { +#if (_WIN32_WINNT >= 0x0500) + ATLASSERT((nBrush >= WHITE_BRUSH && nBrush <= HOLLOW_BRUSH) || nBrush == DC_BRUSH); +#else + ATLASSERT(nBrush >= WHITE_BRUSH && nBrush <= HOLLOW_BRUSH); +#endif // !(_WIN32_WINNT >= 0x0500) + return SelectBrush((HBRUSH)::GetStockObject(nBrush)); + } + + HFONT SelectStockFont(int nFont) + { +#ifndef _WIN32_WCE + ATLASSERT((nFont >= OEM_FIXED_FONT && nFont <= SYSTEM_FIXED_FONT) || nFont == DEFAULT_GUI_FONT); +#else // CE specific + ATLASSERT(nFont == SYSTEM_FONT); +#endif // _WIN32_WCE + return SelectFont((HFONT)::GetStockObject(nFont)); + } + + HPALETTE SelectStockPalette(int nPalette, BOOL bForceBackground) + { + ATLASSERT(nPalette == DEFAULT_PALETTE); // the only one supported + return SelectPalette((HPALETTE)::GetStockObject(nPalette), bForceBackground); + } + +// Color and Color Palette Functions + COLORREF GetNearestColor(COLORREF crColor) const + { + ATLASSERT(m_hDC != NULL); + return ::GetNearestColor(m_hDC, crColor); + } + + HPALETTE SelectPalette(HPALETTE hPalette, BOOL bForceBackground) + { + ATLASSERT(m_hDC != NULL); + + return ::SelectPalette(m_hDC, hPalette, bForceBackground); + } + + UINT RealizePalette() + { + ATLASSERT(m_hDC != NULL); + return ::RealizePalette(m_hDC); + } + +#ifndef _WIN32_WCE + void UpdateColors() + { + ATLASSERT(m_hDC != NULL); + ::UpdateColors(m_hDC); + } +#endif // !_WIN32_WCE + +// Drawing-Attribute Functions + COLORREF GetBkColor() const + { + ATLASSERT(m_hDC != NULL); + return ::GetBkColor(m_hDC); + } + + int GetBkMode() const + { + ATLASSERT(m_hDC != NULL); + return ::GetBkMode(m_hDC); + } + +#ifndef _WIN32_WCE + int GetPolyFillMode() const + { + ATLASSERT(m_hDC != NULL); + return ::GetPolyFillMode(m_hDC); + } + + int GetROP2() const + { + ATLASSERT(m_hDC != NULL); + return ::GetROP2(m_hDC); + } + + int GetStretchBltMode() const + { + ATLASSERT(m_hDC != NULL); + return ::GetStretchBltMode(m_hDC); + } +#endif // !_WIN32_WCE + + COLORREF GetTextColor() const + { + ATLASSERT(m_hDC != NULL); + return ::GetTextColor(m_hDC); + } + + COLORREF SetBkColor(COLORREF crColor) + { + ATLASSERT(m_hDC != NULL); + return ::SetBkColor(m_hDC, crColor); + } + + int SetBkMode(int nBkMode) + { + ATLASSERT(m_hDC != NULL); + return ::SetBkMode(m_hDC, nBkMode); + } + +#ifndef _WIN32_WCE + int SetPolyFillMode(int nPolyFillMode) + { + ATLASSERT(m_hDC != NULL); + return ::SetPolyFillMode(m_hDC, nPolyFillMode); + } +#endif // !_WIN32_WCE + + int SetROP2(int nDrawMode) + { + ATLASSERT(m_hDC != NULL); + return ::SetROP2(m_hDC, nDrawMode); + } + +#ifndef _WIN32_WCE + int SetStretchBltMode(int nStretchMode) + { + ATLASSERT(m_hDC != NULL); + return ::SetStretchBltMode(m_hDC, nStretchMode); + } +#endif // !_WIN32_WCE + + COLORREF SetTextColor(COLORREF crColor) + { + ATLASSERT(m_hDC != NULL); + return ::SetTextColor(m_hDC, crColor); + } + +#ifndef _WIN32_WCE + BOOL GetColorAdjustment(LPCOLORADJUSTMENT lpColorAdjust) const + { + ATLASSERT(m_hDC != NULL); + return ::GetColorAdjustment(m_hDC, lpColorAdjust); + } + + BOOL SetColorAdjustment(const COLORADJUSTMENT* lpColorAdjust) + { + ATLASSERT(m_hDC != NULL); + return ::SetColorAdjustment(m_hDC, lpColorAdjust); + } + +// Mapping Functions + int GetMapMode() const + { + ATLASSERT(m_hDC != NULL); + return ::GetMapMode(m_hDC); + } + + BOOL GetViewportOrg(LPPOINT lpPoint) const + { + ATLASSERT(m_hDC != NULL); + return ::GetViewportOrgEx(m_hDC, lpPoint); + } + + int SetMapMode(int nMapMode) + { + ATLASSERT(m_hDC != NULL); + return ::SetMapMode(m_hDC, nMapMode); + } +#endif // !_WIN32_WCE + + // Viewport Origin + BOOL SetViewportOrg(int x, int y, LPPOINT lpPoint = NULL) + { + ATLASSERT(m_hDC != NULL); + return ::SetViewportOrgEx(m_hDC, x, y, lpPoint); + } + + BOOL SetViewportOrg(POINT point, LPPOINT lpPointRet = NULL) + { + ATLASSERT(m_hDC != NULL); + return SetViewportOrg(point.x, point.y, lpPointRet); + } + +#ifndef _WIN32_WCE + BOOL OffsetViewportOrg(int nWidth, int nHeight, LPPOINT lpPoint = NULL) + { + ATLASSERT(m_hDC != NULL); + return ::OffsetViewportOrgEx(m_hDC, nWidth, nHeight, lpPoint); + } + + // Viewport Extent + BOOL GetViewportExt(LPSIZE lpSize) const + { + ATLASSERT(m_hDC != NULL); + return ::GetViewportExtEx(m_hDC, lpSize); + } + + BOOL SetViewportExt(int x, int y, LPSIZE lpSize = NULL) + { + ATLASSERT(m_hDC != NULL); + return ::SetViewportExtEx(m_hDC, x, y, lpSize); + } + + BOOL SetViewportExt(SIZE size, LPSIZE lpSizeRet = NULL) + { + ATLASSERT(m_hDC != NULL); + return SetViewportExt(size.cx, size.cy, lpSizeRet); + } + + BOOL ScaleViewportExt(int xNum, int xDenom, int yNum, int yDenom, LPSIZE lpSize = NULL) + { + ATLASSERT(m_hDC != NULL); + return ::ScaleViewportExtEx(m_hDC, xNum, xDenom, yNum, yDenom, lpSize); + } +#endif // !_WIN32_WCE + + // Window Origin +#ifndef _WIN32_WCE + BOOL GetWindowOrg(LPPOINT lpPoint) const + { + ATLASSERT(m_hDC != NULL); + return ::GetWindowOrgEx(m_hDC, lpPoint); + } + + BOOL SetWindowOrg(int x, int y, LPPOINT lpPoint = NULL) + { + ATLASSERT(m_hDC != NULL); + return ::SetWindowOrgEx(m_hDC, x, y, lpPoint); + } + + BOOL SetWindowOrg(POINT point, LPPOINT lpPointRet = NULL) + { + ATLASSERT(m_hDC != NULL); + return SetWindowOrg(point.x, point.y, lpPointRet); + } + + BOOL OffsetWindowOrg(int nWidth, int nHeight, LPPOINT lpPoint = NULL) + { + ATLASSERT(m_hDC != NULL); + return ::OffsetWindowOrgEx(m_hDC, nWidth, nHeight, lpPoint); + } + + // Window extent + BOOL GetWindowExt(LPSIZE lpSize) const + { + ATLASSERT(m_hDC != NULL); + return ::GetWindowExtEx(m_hDC, lpSize); + } + + BOOL SetWindowExt(int x, int y, LPSIZE lpSize = NULL) + { + ATLASSERT(m_hDC != NULL); + return ::SetWindowExtEx(m_hDC, x, y, lpSize); + } + + BOOL SetWindowExt(SIZE size, LPSIZE lpSizeRet = NULL) + { + ATLASSERT(m_hDC != NULL); + return SetWindowExt(size.cx, size.cy, lpSizeRet); + } + + BOOL ScaleWindowExt(int xNum, int xDenom, int yNum, int yDenom, LPSIZE lpSize = NULL) + { + ATLASSERT(m_hDC != NULL); + return ::ScaleWindowExtEx(m_hDC, xNum, xDenom, yNum, yDenom, lpSize); + } + +// Coordinate Functions + BOOL DPtoLP(LPPOINT lpPoints, int nCount = 1) const + { + ATLASSERT(m_hDC != NULL); + return ::DPtoLP(m_hDC, lpPoints, nCount); + } + + BOOL DPtoLP(LPRECT lpRect) const + { + ATLASSERT(m_hDC != NULL); + return ::DPtoLP(m_hDC, (LPPOINT)lpRect, 2); + } + + BOOL DPtoLP(LPSIZE lpSize) const + { + SIZE sizeWinExt = { 0, 0 }; + if(!GetWindowExt(&sizeWinExt)) + return FALSE; + SIZE sizeVpExt = { 0, 0 }; + if(!GetViewportExt(&sizeVpExt)) + return FALSE; + lpSize->cx = ::MulDiv(lpSize->cx, abs(sizeWinExt.cx), abs(sizeVpExt.cx)); + lpSize->cy = ::MulDiv(lpSize->cy, abs(sizeWinExt.cy), abs(sizeVpExt.cy)); + return TRUE; + } + + BOOL LPtoDP(LPPOINT lpPoints, int nCount = 1) const + { + ATLASSERT(m_hDC != NULL); + return ::LPtoDP(m_hDC, lpPoints, nCount); + } + + BOOL LPtoDP(LPRECT lpRect) const + { + ATLASSERT(m_hDC != NULL); + return ::LPtoDP(m_hDC, (LPPOINT)lpRect, 2); + } + + BOOL LPtoDP(LPSIZE lpSize) const + { + SIZE sizeWinExt = { 0, 0 }; + if(!GetWindowExt(&sizeWinExt)) + return FALSE; + SIZE sizeVpExt = { 0, 0 }; + if(!GetViewportExt(&sizeVpExt)) + return FALSE; + lpSize->cx = ::MulDiv(lpSize->cx, abs(sizeVpExt.cx), abs(sizeWinExt.cx)); + lpSize->cy = ::MulDiv(lpSize->cy, abs(sizeVpExt.cy), abs(sizeWinExt.cy)); + return TRUE; + } + +// Special Coordinate Functions (useful for dealing with metafiles and OLE) + #define HIMETRIC_INCH 2540 // HIMETRIC units per inch + + void DPtoHIMETRIC(LPSIZE lpSize) const + { + ATLASSERT(m_hDC != NULL); + int nMapMode; + if((nMapMode = GetMapMode()) < MM_ISOTROPIC && nMapMode != MM_TEXT) + { + // when using a constrained map mode, map against physical inch + ((CDCHandle*)this)->SetMapMode(MM_HIMETRIC); + DPtoLP(lpSize); + ((CDCHandle*)this)->SetMapMode(nMapMode); + } + else + { + // map against logical inch for non-constrained mapping modes + int cxPerInch = GetDeviceCaps(LOGPIXELSX); + int cyPerInch = GetDeviceCaps(LOGPIXELSY); + ATLASSERT(cxPerInch != 0 && cyPerInch != 0); + lpSize->cx = ::MulDiv(lpSize->cx, HIMETRIC_INCH, cxPerInch); + lpSize->cy = ::MulDiv(lpSize->cy, HIMETRIC_INCH, cyPerInch); + } + } + + void HIMETRICtoDP(LPSIZE lpSize) const + { + ATLASSERT(m_hDC != NULL); + int nMapMode; + if((nMapMode = GetMapMode()) < MM_ISOTROPIC && nMapMode != MM_TEXT) + { + // when using a constrained map mode, map against physical inch + ((CDCHandle*)this)->SetMapMode(MM_HIMETRIC); + LPtoDP(lpSize); + ((CDCHandle*)this)->SetMapMode(nMapMode); + } + else + { + // map against logical inch for non-constrained mapping modes + int cxPerInch = GetDeviceCaps(LOGPIXELSX); + int cyPerInch = GetDeviceCaps(LOGPIXELSY); + ATLASSERT(cxPerInch != 0 && cyPerInch != 0); + lpSize->cx = ::MulDiv(lpSize->cx, cxPerInch, HIMETRIC_INCH); + lpSize->cy = ::MulDiv(lpSize->cy, cyPerInch, HIMETRIC_INCH); + } + } + + void LPtoHIMETRIC(LPSIZE lpSize) const + { + LPtoDP(lpSize); + DPtoHIMETRIC(lpSize); + } + + void HIMETRICtoLP(LPSIZE lpSize) const + { + HIMETRICtoDP(lpSize); + DPtoLP(lpSize); + } +#endif // !_WIN32_WCE + +// Region Functions + BOOL FillRgn(HRGN hRgn, HBRUSH hBrush) + { + ATLASSERT(m_hDC != NULL); + return ::FillRgn(m_hDC, hRgn, hBrush); + } + +#ifndef _WIN32_WCE + BOOL FrameRgn(HRGN hRgn, HBRUSH hBrush, int nWidth, int nHeight) + { + ATLASSERT(m_hDC != NULL); + return ::FrameRgn(m_hDC, hRgn, hBrush, nWidth, nHeight); + } + + BOOL InvertRgn(HRGN hRgn) + { + ATLASSERT(m_hDC != NULL); + return ::InvertRgn(m_hDC, hRgn); + } + + BOOL PaintRgn(HRGN hRgn) + { + ATLASSERT(m_hDC != NULL); + return ::PaintRgn(m_hDC, hRgn); + } +#endif // !_WIN32_WCE + +// Clipping Functions + int GetClipBox(LPRECT lpRect) const + { + ATLASSERT(m_hDC != NULL); + return ::GetClipBox(m_hDC, lpRect); + } + + int GetClipRgn(CRgn& region) const + { + ATLASSERT(m_hDC != NULL); + if(region.IsNull()) + region.CreateRectRgn(0, 0, 0, 0); + + int nRet = ::GetClipRgn(m_hDC, region); + if(nRet != 1) + region.DeleteObject(); + + return nRet; + } + +#ifndef _WIN32_WCE + BOOL PtVisible(int x, int y) const + { + ATLASSERT(m_hDC != NULL); + return ::PtVisible(m_hDC, x, y); + } + + BOOL PtVisible(POINT point) const + { + ATLASSERT(m_hDC != NULL); + return ::PtVisible(m_hDC, point.x, point.y); + } +#endif // !_WIN32_WCE + + BOOL RectVisible(LPCRECT lpRect) const + { + ATLASSERT(m_hDC != NULL); + return ::RectVisible(m_hDC, lpRect); + } + + int SelectClipRgn(HRGN hRgn) + { + ATLASSERT(m_hDC != NULL); + return ::SelectClipRgn(m_hDC, (HRGN)hRgn); + } + + int ExcludeClipRect(int x1, int y1, int x2, int y2) + { + ATLASSERT(m_hDC != NULL); + return ::ExcludeClipRect(m_hDC, x1, y1, x2, y2); + } + + int ExcludeClipRect(LPCRECT lpRect) + { + ATLASSERT(m_hDC != NULL); + return ::ExcludeClipRect(m_hDC, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom); + } + +#ifndef _WIN32_WCE + int ExcludeUpdateRgn(HWND hWnd) + { + ATLASSERT(m_hDC != NULL); + return ::ExcludeUpdateRgn(m_hDC, hWnd); + } +#endif // !_WIN32_WCE + + int IntersectClipRect(int x1, int y1, int x2, int y2) + { + ATLASSERT(m_hDC != NULL); + return ::IntersectClipRect(m_hDC, x1, y1, x2, y2); + } + + int IntersectClipRect(LPCRECT lpRect) + { + ATLASSERT(m_hDC != NULL); + return ::IntersectClipRect(m_hDC, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom); + } + +#ifndef _WIN32_WCE + int OffsetClipRgn(int x, int y) + { + ATLASSERT(m_hDC != NULL); + return ::OffsetClipRgn(m_hDC, x, y); + } + + int OffsetClipRgn(SIZE size) + { + ATLASSERT(m_hDC != NULL); + return ::OffsetClipRgn(m_hDC, size.cx, size.cy); + } + + int SelectClipRgn(HRGN hRgn, int nMode) + { + ATLASSERT(m_hDC != NULL); + return ::ExtSelectClipRgn(m_hDC, hRgn, nMode); + } +#endif // !_WIN32_WCE + +// Line-Output Functions +#if !defined(_WIN32_WCE) || (_WIN32_WCE >= 400) + BOOL GetCurrentPosition(LPPOINT lpPoint) const + { + ATLASSERT(m_hDC != NULL); + return ::GetCurrentPositionEx(m_hDC, lpPoint); + } + + BOOL MoveTo(int x, int y, LPPOINT lpPoint = NULL) + { + ATLASSERT(m_hDC != NULL); + return ::MoveToEx(m_hDC, x, y, lpPoint); + } + + BOOL MoveTo(POINT point, LPPOINT lpPointRet = NULL) + { + ATLASSERT(m_hDC != NULL); + return MoveTo(point.x, point.y, lpPointRet); + } + + BOOL LineTo(int x, int y) + { + ATLASSERT(m_hDC != NULL); + return ::LineTo(m_hDC, x, y); + } + + BOOL LineTo(POINT point) + { + ATLASSERT(m_hDC != NULL); + return LineTo(point.x, point.y); + } +#endif // !defined(_WIN32_WCE) || (_WIN32_WCE >= 400) + +#ifndef _WIN32_WCE + BOOL Arc(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4) + { + ATLASSERT(m_hDC != NULL); + return ::Arc(m_hDC, x1, y1, x2, y2, x3, y3, x4, y4); + } + + BOOL Arc(LPCRECT lpRect, POINT ptStart, POINT ptEnd) + { + ATLASSERT(m_hDC != NULL); + return ::Arc(m_hDC, lpRect->left, lpRect->top, + lpRect->right, lpRect->bottom, ptStart.x, ptStart.y, + ptEnd.x, ptEnd.y); + } +#endif // !_WIN32_WCE + + BOOL Polyline(LPPOINT lpPoints, int nCount) + { + ATLASSERT(m_hDC != NULL); + return ::Polyline(m_hDC, lpPoints, nCount); + } + +#ifndef _WIN32_WCE + BOOL AngleArc(int x, int y, int nRadius, float fStartAngle, float fSweepAngle) + { + ATLASSERT(m_hDC != NULL); + return ::AngleArc(m_hDC, x, y, nRadius, fStartAngle, fSweepAngle); + } + + BOOL ArcTo(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4) + { + ATLASSERT(m_hDC != NULL); + return ::ArcTo(m_hDC, x1, y1, x2, y2, x3, y3, x4, y4); + } + + BOOL ArcTo(LPCRECT lpRect, POINT ptStart, POINT ptEnd) + { + ATLASSERT(m_hDC != NULL); + return ArcTo(lpRect->left, lpRect->top, lpRect->right, + lpRect->bottom, ptStart.x, ptStart.y, ptEnd.x, ptEnd.y); + } + + int GetArcDirection() const + { + ATLASSERT(m_hDC != NULL); + return ::GetArcDirection(m_hDC); + } + + int SetArcDirection(int nArcDirection) + { + ATLASSERT(m_hDC != NULL); + return ::SetArcDirection(m_hDC, nArcDirection); + } + + BOOL PolyDraw(const POINT* lpPoints, const BYTE* lpTypes, int nCount) + { + ATLASSERT(m_hDC != NULL); + return ::PolyDraw(m_hDC, lpPoints, lpTypes, nCount); + } + + BOOL PolylineTo(const POINT* lpPoints, int nCount) + { + ATLASSERT(m_hDC != NULL); + return ::PolylineTo(m_hDC, lpPoints, nCount); + } + + BOOL PolyPolyline(const POINT* lpPoints, + const DWORD* lpPolyPoints, int nCount) + { + ATLASSERT(m_hDC != NULL); + return ::PolyPolyline(m_hDC, lpPoints, lpPolyPoints, nCount); + } + + BOOL PolyBezier(const POINT* lpPoints, int nCount) + { + ATLASSERT(m_hDC != NULL); + return ::PolyBezier(m_hDC, lpPoints, nCount); + } + + BOOL PolyBezierTo(const POINT* lpPoints, int nCount) + { + ATLASSERT(m_hDC != NULL); + return ::PolyBezierTo(m_hDC, lpPoints, nCount); + } +#endif // !_WIN32_WCE + +// Simple Drawing Functions + BOOL FillRect(LPCRECT lpRect, HBRUSH hBrush) + { + ATLASSERT(m_hDC != NULL); + return ::FillRect(m_hDC, lpRect, hBrush); + } + + BOOL FillRect(LPCRECT lpRect, int nColorIndex) + { + ATLASSERT(m_hDC != NULL); +#ifndef _WIN32_WCE + return ::FillRect(m_hDC, lpRect, (HBRUSH)LongToPtr(nColorIndex + 1)); +#else // CE specific + return ::FillRect(m_hDC, lpRect, ::GetSysColorBrush(nColorIndex)); +#endif // _WIN32_WCE + } + +#ifndef _WIN32_WCE + BOOL FrameRect(LPCRECT lpRect, HBRUSH hBrush) + { + ATLASSERT(m_hDC != NULL); + return ::FrameRect(m_hDC, lpRect, hBrush); + } +#endif // !_WIN32_WCE + +#if !defined(_WIN32_WCE) || (_WIN32_WCE >= 420) + BOOL InvertRect(LPCRECT lpRect) + { + ATLASSERT(m_hDC != NULL); + return ::InvertRect(m_hDC, lpRect); + } +#endif // !defined(_WIN32_WCE) || (_WIN32_WCE >= 420) + + BOOL DrawIcon(int x, int y, HICON hIcon) + { + ATLASSERT(m_hDC != NULL); +#ifndef _WIN32_WCE + return ::DrawIcon(m_hDC, x, y, hIcon); +#else // CE specific + return ::DrawIconEx(m_hDC, x, y, hIcon, 0, 0, 0, NULL, DI_NORMAL); +#endif // _WIN32_WCE + } + + BOOL DrawIcon(POINT point, HICON hIcon) + { + ATLASSERT(m_hDC != NULL); +#ifndef _WIN32_WCE + return ::DrawIcon(m_hDC, point.x, point.y, hIcon); +#else // CE specific + return ::DrawIconEx(m_hDC, point.x, point.y, hIcon, 0, 0, 0, NULL, DI_NORMAL); +#endif // _WIN32_WCE + } + + BOOL DrawIconEx(int x, int y, HICON hIcon, int cxWidth, int cyWidth, UINT uStepIfAniCur = 0, HBRUSH hbrFlickerFreeDraw = NULL, UINT uFlags = DI_NORMAL) + { + ATLASSERT(m_hDC != NULL); + return ::DrawIconEx(m_hDC, x, y, hIcon, cxWidth, cyWidth, uStepIfAniCur, hbrFlickerFreeDraw, uFlags); + } + + BOOL DrawIconEx(POINT point, HICON hIcon, SIZE size, UINT uStepIfAniCur = 0, HBRUSH hbrFlickerFreeDraw = NULL, UINT uFlags = DI_NORMAL) + { + ATLASSERT(m_hDC != NULL); + return ::DrawIconEx(m_hDC, point.x, point.y, hIcon, size.cx, size.cy, uStepIfAniCur, hbrFlickerFreeDraw, uFlags); + } + +#ifndef _WIN32_WCE + BOOL DrawState(POINT pt, SIZE size, HBITMAP hBitmap, UINT nFlags, HBRUSH hBrush = NULL) + { + ATLASSERT(m_hDC != NULL); + return ::DrawState(m_hDC, hBrush, NULL, (LPARAM)hBitmap, 0, pt.x, pt.y, size.cx, size.cy, nFlags | DST_BITMAP); + } + + BOOL DrawState(POINT pt, SIZE size, HICON hIcon, UINT nFlags, HBRUSH hBrush = NULL) + { + ATLASSERT(m_hDC != NULL); + return ::DrawState(m_hDC, hBrush, NULL, (LPARAM)hIcon, 0, pt.x, pt.y, size.cx, size.cy, nFlags | DST_ICON); + } + + BOOL DrawState(POINT pt, SIZE size, LPCTSTR lpszText, UINT nFlags, BOOL bPrefixText = TRUE, int nTextLen = 0, HBRUSH hBrush = NULL) + { + ATLASSERT(m_hDC != NULL); + return ::DrawState(m_hDC, hBrush, NULL, (LPARAM)lpszText, (WPARAM)nTextLen, pt.x, pt.y, size.cx, size.cy, nFlags | (bPrefixText ? DST_PREFIXTEXT : DST_TEXT)); + } + + BOOL DrawState(POINT pt, SIZE size, DRAWSTATEPROC lpDrawProc, LPARAM lData, UINT nFlags, HBRUSH hBrush = NULL) + { + ATLASSERT(m_hDC != NULL); + return ::DrawState(m_hDC, hBrush, lpDrawProc, lData, 0, pt.x, pt.y, size.cx, size.cy, nFlags | DST_COMPLEX); + } +#endif // !_WIN32_WCE + +// Ellipse and Polygon Functions +#ifndef _WIN32_WCE + BOOL Chord(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4) + { + ATLASSERT(m_hDC != NULL); + return ::Chord(m_hDC, x1, y1, x2, y2, x3, y3, x4, y4); + } + + BOOL Chord(LPCRECT lpRect, POINT ptStart, POINT ptEnd) + { + ATLASSERT(m_hDC != NULL); + return ::Chord(m_hDC, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom, ptStart.x, ptStart.y, ptEnd.x, ptEnd.y); + } +#endif // !_WIN32_WCE + + void DrawFocusRect(LPCRECT lpRect) + { + ATLASSERT(m_hDC != NULL); + ::DrawFocusRect(m_hDC, lpRect); + } + + BOOL Ellipse(int x1, int y1, int x2, int y2) + { + ATLASSERT(m_hDC != NULL); + return ::Ellipse(m_hDC, x1, y1, x2, y2); + } + + BOOL Ellipse(LPCRECT lpRect) + { + ATLASSERT(m_hDC != NULL); + return ::Ellipse(m_hDC, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom); + } + +#ifndef _WIN32_WCE + BOOL Pie(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4) + { + ATLASSERT(m_hDC != NULL); + return ::Pie(m_hDC, x1, y1, x2, y2, x3, y3, x4, y4); + } + + BOOL Pie(LPCRECT lpRect, POINT ptStart, POINT ptEnd) + { + ATLASSERT(m_hDC != NULL); + return ::Pie(m_hDC, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom, ptStart.x, ptStart.y, ptEnd.x, ptEnd.y); + } +#endif // !_WIN32_WCE + + BOOL Polygon(LPPOINT lpPoints, int nCount) + { + ATLASSERT(m_hDC != NULL); + return ::Polygon(m_hDC, lpPoints, nCount); + } + +#ifndef _WIN32_WCE + BOOL PolyPolygon(LPPOINT lpPoints, LPINT lpPolyCounts, int nCount) + { + ATLASSERT(m_hDC != NULL); + return ::PolyPolygon(m_hDC, lpPoints, lpPolyCounts, nCount); + } +#endif // !_WIN32_WCE + + BOOL Rectangle(int x1, int y1, int x2, int y2) + { + ATLASSERT(m_hDC != NULL); + return ::Rectangle(m_hDC, x1, y1, x2, y2); + } + + BOOL Rectangle(LPCRECT lpRect) + { + ATLASSERT(m_hDC != NULL); + return ::Rectangle(m_hDC, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom); + } + + BOOL RoundRect(int x1, int y1, int x2, int y2, int x3, int y3) + { + ATLASSERT(m_hDC != NULL); + return ::RoundRect(m_hDC, x1, y1, x2, y2, x3, y3); + } + + BOOL RoundRect(LPCRECT lpRect, POINT point) + { + ATLASSERT(m_hDC != NULL); + return ::RoundRect(m_hDC, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom, point.x, point.y); + } + +// Bitmap Functions + BOOL PatBlt(int x, int y, int nWidth, int nHeight, DWORD dwRop) + { + ATLASSERT(m_hDC != NULL); + return ::PatBlt(m_hDC, x, y, nWidth, nHeight, dwRop); + } + + BOOL BitBlt(int x, int y, int nWidth, int nHeight, HDC hSrcDC, + int xSrc, int ySrc, DWORD dwRop) + { + ATLASSERT(m_hDC != NULL); + return ::BitBlt(m_hDC, x, y, nWidth, nHeight, hSrcDC, xSrc, ySrc, dwRop); + } + + BOOL StretchBlt(int x, int y, int nWidth, int nHeight, HDC hSrcDC, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, DWORD dwRop) + { + ATLASSERT(m_hDC != NULL); + return ::StretchBlt(m_hDC, x, y, nWidth, nHeight, hSrcDC, xSrc, ySrc, nSrcWidth, nSrcHeight, dwRop); + } + + COLORREF GetPixel(int x, int y) const + { + ATLASSERT(m_hDC != NULL); + return ::GetPixel(m_hDC, x, y); + } + + COLORREF GetPixel(POINT point) const + { + ATLASSERT(m_hDC != NULL); + return ::GetPixel(m_hDC, point.x, point.y); + } + + COLORREF SetPixel(int x, int y, COLORREF crColor) + { + ATLASSERT(m_hDC != NULL); + return ::SetPixel(m_hDC, x, y, crColor); + } + + COLORREF SetPixel(POINT point, COLORREF crColor) + { + ATLASSERT(m_hDC != NULL); + return ::SetPixel(m_hDC, point.x, point.y, crColor); + } + +#ifndef _WIN32_WCE + BOOL FloodFill(int x, int y, COLORREF crColor) + { + ATLASSERT(m_hDC != NULL); + return ::FloodFill(m_hDC, x, y, crColor); + } + + BOOL ExtFloodFill(int x, int y, COLORREF crColor, UINT nFillType) + { + ATLASSERT(m_hDC != NULL); + return ::ExtFloodFill(m_hDC, x, y, crColor, nFillType); + } +#endif // !_WIN32_WCE + + BOOL MaskBlt(int x, int y, int nWidth, int nHeight, HDC hSrcDC, int xSrc, int ySrc, HBITMAP hMaskBitmap, int xMask, int yMask, DWORD dwRop) + { + ATLASSERT(m_hDC != NULL); + return ::MaskBlt(m_hDC, x, y, nWidth, nHeight, hSrcDC, xSrc, ySrc, hMaskBitmap, xMask, yMask, dwRop); + } + +#ifndef _WIN32_WCE + BOOL PlgBlt(LPPOINT lpPoint, HDC hSrcDC, int xSrc, int ySrc, int nWidth, int nHeight, HBITMAP hMaskBitmap, int xMask, int yMask) + { + ATLASSERT(m_hDC != NULL); + return ::PlgBlt(m_hDC, lpPoint, hSrcDC, xSrc, ySrc, nWidth, nHeight, hMaskBitmap, xMask, yMask); + } + + BOOL SetPixelV(int x, int y, COLORREF crColor) + { + ATLASSERT(m_hDC != NULL); + return ::SetPixelV(m_hDC, x, y, crColor); + } + + BOOL SetPixelV(POINT point, COLORREF crColor) + { + ATLASSERT(m_hDC != NULL); + return ::SetPixelV(m_hDC, point.x, point.y, crColor); + } +#endif // !_WIN32_WCE + +#if !defined(_ATL_NO_MSIMG) || defined(_WIN32_WCE) +#ifndef _WIN32_WCE + BOOL TransparentBlt(int x, int y, int nWidth, int nHeight, HDC hSrcDC, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, UINT crTransparent) + { + ATLASSERT(m_hDC != NULL); + return ::TransparentBlt(m_hDC, x, y, nWidth, nHeight, hSrcDC, xSrc, ySrc, nSrcWidth, nSrcHeight, crTransparent); + } +#else // CE specific + BOOL TransparentImage(int x, int y, int nWidth, int nHeight, HDC hSrcDC, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, UINT crTransparent) + { + ATLASSERT(m_hDC != NULL); + return ::TransparentImage(m_hDC, x, y, nWidth, nHeight, hSrcDC, xSrc, ySrc, nSrcWidth, nSrcHeight, crTransparent); + } +#endif // _WIN32_WCE + +#if (!defined(_WIN32_WCE) || (_WIN32_WCE >= 420)) + BOOL GradientFill(const PTRIVERTEX pVertices, DWORD nVertices, void* pMeshElements, DWORD nMeshElements, DWORD dwMode) + { + ATLASSERT(m_hDC != NULL); + return ::GradientFill(m_hDC, pVertices, nVertices, pMeshElements, nMeshElements, dwMode); + } +#endif // !defined(_WIN32_WCE) || (_WIN32_WCE >= 420) + +#if !defined(_WIN32_WCE) || (_WIN32_WCE > 0x500) + BOOL AlphaBlend(int x, int y, int nWidth, int nHeight, HDC hSrcDC, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, BLENDFUNCTION bf) + { + ATLASSERT(m_hDC != NULL); + return ::AlphaBlend(m_hDC, x, y, nWidth, nHeight, hSrcDC, xSrc, ySrc, nSrcWidth, nSrcHeight, bf); + } +#endif // !defined(_WIN32_WCE) || (_WIN32_WCE > 0x500) +#endif // !defined(_ATL_NO_MSIMG) || defined(_WIN32_WCE) + +// Extra bitmap functions + // Helper function for painting a disabled toolbar or menu bitmap + // This function can take either an HBITMAP (for SS) or a DC with + // the bitmap already painted (for cmdbar) + BOOL DitherBlt(int x, int y, int nWidth, int nHeight, HDC hSrcDC, HBITMAP hBitmap, int xSrc, int ySrc, + HBRUSH hBrushBackground = ::GetSysColorBrush(COLOR_3DFACE), + HBRUSH hBrush3DEffect = ::GetSysColorBrush(COLOR_3DHILIGHT), + HBRUSH hBrushDisabledImage = ::GetSysColorBrush(COLOR_3DSHADOW)) + { + ATLASSERT(m_hDC != NULL || hBitmap != NULL); + ATLASSERT(nWidth > 0 && nHeight > 0); + + // Create a generic DC for all BitBlts + CDCHandle dc = (hSrcDC != NULL) ? hSrcDC : ::CreateCompatibleDC(m_hDC); + ATLASSERT(dc.m_hDC != NULL); + if(dc.m_hDC == NULL) + return FALSE; + + // Create a DC for the monochrome DIB section + CDC dcBW = ::CreateCompatibleDC(m_hDC); + ATLASSERT(dcBW.m_hDC != NULL); + if(dcBW.m_hDC == NULL) + { + if(hSrcDC == NULL) + dc.DeleteDC(); + return FALSE; + } + + // Create the monochrome DIB section with a black and white palette + struct RGBBWBITMAPINFO + { + BITMAPINFOHEADER bmiHeader; + RGBQUAD bmiColors[2]; + }; + + RGBBWBITMAPINFO rgbBWBitmapInfo = + { + { sizeof(BITMAPINFOHEADER), nWidth, nHeight, 1, 1, BI_RGB, 0, 0, 0, 0, 0 }, + { { 0x00, 0x00, 0x00, 0x00 }, { 0xFF, 0xFF, 0xFF, 0x00 } } + }; + + VOID* pbitsBW; + CBitmap bmpBW = ::CreateDIBSection(dcBW, (LPBITMAPINFO)&rgbBWBitmapInfo, DIB_RGB_COLORS, &pbitsBW, NULL, 0); + ATLASSERT(bmpBW.m_hBitmap != NULL); + if(bmpBW.m_hBitmap == NULL) + { + if(hSrcDC == NULL) + dc.DeleteDC(); + return FALSE; + } + + // Attach the monochrome DIB section and the bitmap to the DCs + HBITMAP hbmOldBW = dcBW.SelectBitmap(bmpBW); + HBITMAP hbmOldDC = NULL; + if(hBitmap != NULL) + hbmOldDC = dc.SelectBitmap(hBitmap); + + // Block: Dark gray removal: we want (128, 128, 128) pixels to become black and not white + { + CDC dcTemp1 = ::CreateCompatibleDC(m_hDC); + CDC dcTemp2 = ::CreateCompatibleDC(m_hDC); + CBitmap bmpTemp1; + bmpTemp1.CreateCompatibleBitmap(dc, nWidth, nHeight); + CBitmap bmpTemp2; + bmpTemp2.CreateBitmap(nWidth, nHeight, 1, 1, NULL); + HBITMAP hOldBmp1 = dcTemp1.SelectBitmap(bmpTemp1); + HBITMAP hOldBmp2 = dcTemp2.SelectBitmap(bmpTemp2); + // Let's copy our image, it will be altered + dcTemp1.BitBlt(0, 0, nWidth, nHeight, dc, xSrc, ySrc, SRCCOPY); + + // All dark gray pixels will become white, the others black + dcTemp1.SetBkColor(RGB(128, 128, 128)); + dcTemp2.BitBlt(0, 0, nWidth, nHeight, dcTemp1, 0, 0, SRCCOPY); + // Do an XOR to set to black these white pixels + dcTemp1.BitBlt(0, 0, nWidth, nHeight, dcTemp2, 0, 0, SRCINVERT); + + // BitBlt the bitmap into the monochrome DIB section + // The DIB section will do a true monochrome conversion + // The magenta background being closer to white will become white + dcBW.BitBlt(0, 0, nWidth, nHeight, dcTemp1, 0, 0, SRCCOPY); + + // Cleanup + dcTemp1.SelectBitmap(hOldBmp1); + dcTemp2.SelectBitmap(hOldBmp2); + } + + // Paint the destination rectangle using hBrushBackground + if(hBrushBackground != NULL) + { + RECT rc = { x, y, x + nWidth, y + nHeight }; + FillRect(&rc, hBrushBackground); + } + + // BitBlt the black bits in the monochrome bitmap into hBrush3DEffect color in the destination DC + // The magic ROP comes from the Charles Petzold's book + HBRUSH hOldBrush = SelectBrush(hBrush3DEffect); + BitBlt(x + 1, y + 1, nWidth, nHeight, dcBW, 0, 0, 0xB8074A); + + // BitBlt the black bits in the monochrome bitmap into hBrushDisabledImage color in the destination DC + SelectBrush(hBrushDisabledImage); + BitBlt(x, y, nWidth, nHeight, dcBW, 0, 0, 0xB8074A); + + SelectBrush(hOldBrush); + dcBW.SelectBitmap(hbmOldBW); + dc.SelectBitmap(hbmOldDC); + + if(hSrcDC == NULL) + dc.DeleteDC(); + + return TRUE; + } + +// Text Functions +#ifndef _WIN32_WCE + BOOL TextOut(int x, int y, LPCTSTR lpszString, int nCount = -1) + { + ATLASSERT(m_hDC != NULL); + if(nCount == -1) + nCount = lstrlen(lpszString); + return ::TextOut(m_hDC, x, y, lpszString, nCount); + } +#endif // !_WIN32_WCE + + BOOL ExtTextOut(int x, int y, UINT nOptions, LPCRECT lpRect, LPCTSTR lpszString, UINT nCount = -1, LPINT lpDxWidths = NULL) + { + ATLASSERT(m_hDC != NULL); + if(nCount == -1) + nCount = lstrlen(lpszString); + return ::ExtTextOut(m_hDC, x, y, nOptions, lpRect, lpszString, nCount, lpDxWidths); + } + +#ifndef _WIN32_WCE + SIZE TabbedTextOut(int x, int y, LPCTSTR lpszString, int nCount = -1, int nTabPositions = 0, LPINT lpnTabStopPositions = NULL, int nTabOrigin = 0) + { + ATLASSERT(m_hDC != NULL); + if(nCount == -1) + nCount = lstrlen(lpszString); + LONG lRes = ::TabbedTextOut(m_hDC, x, y, lpszString, nCount, nTabPositions, lpnTabStopPositions, nTabOrigin); + SIZE size = { GET_X_LPARAM(lRes), GET_Y_LPARAM(lRes) }; + return size; + } +#endif // !_WIN32_WCE + + int DrawText(LPCTSTR lpstrText, int cchText, LPRECT lpRect, UINT uFormat) + { + ATLASSERT(m_hDC != NULL); +#ifndef _WIN32_WCE + ATLASSERT((uFormat & DT_MODIFYSTRING) == 0); +#endif // !_WIN32_WCE + return ::DrawText(m_hDC, lpstrText, cchText, lpRect, uFormat); + } + + int DrawText(LPTSTR lpstrText, int cchText, LPRECT lpRect, UINT uFormat) + { + ATLASSERT(m_hDC != NULL); + return ::DrawText(m_hDC, lpstrText, cchText, lpRect, uFormat); + } + +#ifndef _WIN32_WCE + int DrawTextEx(LPTSTR lpstrText, int cchText, LPRECT lpRect, UINT uFormat, LPDRAWTEXTPARAMS lpDTParams = NULL) + { + ATLASSERT(m_hDC != NULL); + return ::DrawTextEx(m_hDC, lpstrText, cchText, lpRect, uFormat, lpDTParams); + } +#endif // !_WIN32_WCE + +#if (_WIN32_WINNT >= 0x0501) + int DrawShadowText(LPCWSTR lpstrText, int cchText, LPRECT lpRect, DWORD dwFlags, COLORREF clrText, COLORREF clrShadow, int xOffset, int yOffset) + { + ATLASSERT(m_hDC != NULL); + // This function is present only if comctl32.dll version 6 is loaded; + // we use LoadLibrary/GetProcAddress to allow apps compiled with + // _WIN32_WINNT >= 0x0501 to run on older Windows/CommCtrl + int nRet = 0; + HMODULE hCommCtrlDLL = ::LoadLibrary(_T("comctl32.dll")); + ATLASSERT(hCommCtrlDLL != NULL); + if(hCommCtrlDLL != NULL) + { + typedef int (WINAPI *PFN_DrawShadowText)(HDC hDC, LPCWSTR lpstrText, UINT cchText, LPRECT lpRect, DWORD dwFlags, COLORREF clrText, COLORREF clrShadow, int xOffset, int yOffset); + PFN_DrawShadowText pfnDrawShadowText = (PFN_DrawShadowText)::GetProcAddress(hCommCtrlDLL, "DrawShadowText"); + ATLASSERT(pfnDrawShadowText != NULL); // this function requires CommCtrl6 + if(pfnDrawShadowText != NULL) + nRet = pfnDrawShadowText(m_hDC, lpstrText, cchText, lpRect, dwFlags, clrText, clrShadow, xOffset, yOffset); + ::FreeLibrary(hCommCtrlDLL); + } + return nRet; + } +#endif // (_WIN32_WINNT >= 0x0501) + + BOOL GetTextExtent(LPCTSTR lpszString, int nCount, LPSIZE lpSize) const + { + ATLASSERT(m_hDC != NULL); + if(nCount == -1) + nCount = lstrlen(lpszString); + return ::GetTextExtentPoint32(m_hDC, lpszString, nCount, lpSize); + } + + BOOL GetTextExtentExPoint(LPCTSTR lpszString, int cchString, LPSIZE lpSize, int nMaxExtent, LPINT lpnFit = NULL, LPINT alpDx = NULL) + { + ATLASSERT(m_hDC != NULL); + return ::GetTextExtentExPoint(m_hDC, lpszString, cchString, nMaxExtent, lpnFit, alpDx, lpSize); + } + +#ifndef _WIN32_WCE + DWORD GetTabbedTextExtent(LPCTSTR lpszString, int nCount = -1, int nTabPositions = 0, LPINT lpnTabStopPositions = NULL) const + { + ATLASSERT(m_hDC != NULL); + if(nCount == -1) + nCount = lstrlen(lpszString); + return ::GetTabbedTextExtent(m_hDC, lpszString, nCount, nTabPositions, lpnTabStopPositions); + } + + BOOL GrayString(HBRUSH hBrush, BOOL (CALLBACK* lpfnOutput)(HDC, LPARAM, int), LPARAM lpData, int nCount, int x, int y, int nWidth, int nHeight) + { + ATLASSERT(m_hDC != NULL); + return ::GrayString(m_hDC, hBrush, (GRAYSTRINGPROC)lpfnOutput, lpData, nCount, x, y, nWidth, nHeight); + } +#endif // !_WIN32_WCE + +#if !defined(_WIN32_WCE) || (_WIN32_WCE >= 400) + UINT GetTextAlign() const + { + ATLASSERT(m_hDC != NULL); + return ::GetTextAlign(m_hDC); + } + + UINT SetTextAlign(UINT nFlags) + { + ATLASSERT(m_hDC != NULL); + return ::SetTextAlign(m_hDC, nFlags); + } +#endif // !defined(_WIN32_WCE) || (_WIN32_WCE >= 400) + + int GetTextFace(LPTSTR lpszFacename, int nCount) const + { + ATLASSERT(m_hDC != NULL); + return ::GetTextFace(m_hDC, nCount, lpszFacename); + } + + int GetTextFaceLen() const + { + ATLASSERT(m_hDC != NULL); + return ::GetTextFace(m_hDC, 0, NULL); + } + +#ifndef _ATL_NO_COM +#ifdef _OLEAUTO_H_ + BOOL GetTextFace(BSTR& bstrFace) const + { + USES_CONVERSION; + ATLASSERT(m_hDC != NULL); + ATLASSERT(bstrFace == NULL); + + int nLen = GetTextFaceLen(); + if(nLen == 0) + return FALSE; + + CTempBuffer buff; + LPTSTR lpszText = buff.Allocate(nLen); + if(lpszText == NULL) + return FALSE; + + if(!GetTextFace(lpszText, nLen)) + return FALSE; + + bstrFace = ::SysAllocString(T2OLE(lpszText)); + return (bstrFace != NULL) ? TRUE : FALSE; + } +#endif +#endif // !_ATL_NO_COM + +#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) + int GetTextFace(_CSTRING_NS::CString& strFace) const + { + ATLASSERT(m_hDC != NULL); + + int nLen = GetTextFaceLen(); + if(nLen == 0) + return 0; + + LPTSTR lpstr = strFace.GetBufferSetLength(nLen); + if(lpstr == NULL) + return 0; + int nRet = GetTextFace(lpstr, nLen); + strFace.ReleaseBuffer(); + return nRet; + } +#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) + + BOOL GetTextMetrics(LPTEXTMETRIC lpMetrics) const + { + ATLASSERT(m_hDC != NULL); + return ::GetTextMetrics(m_hDC, lpMetrics); + } + +#ifndef _WIN32_WCE + int SetTextJustification(int nBreakExtra, int nBreakCount) + { + ATLASSERT(m_hDC != NULL); + return ::SetTextJustification(m_hDC, nBreakExtra, nBreakCount); + } + + int GetTextCharacterExtra() const + { + ATLASSERT(m_hDC != NULL); + return ::GetTextCharacterExtra(m_hDC); + } + + int SetTextCharacterExtra(int nCharExtra) + { + ATLASSERT(m_hDC != NULL); + return ::SetTextCharacterExtra(m_hDC, nCharExtra); + } +#endif // !_WIN32_WCE + +// Advanced Drawing + BOOL DrawEdge(LPRECT lpRect, UINT nEdge, UINT nFlags) + { + ATLASSERT(m_hDC != NULL); + return ::DrawEdge(m_hDC, lpRect, nEdge, nFlags); + } + + BOOL DrawFrameControl(LPRECT lpRect, UINT nType, UINT nState) + { + ATLASSERT(m_hDC != NULL); + return ::DrawFrameControl(m_hDC, lpRect, nType, nState); + } + +// Scrolling Functions + BOOL ScrollDC(int dx, int dy, LPCRECT lpRectScroll, LPCRECT lpRectClip, HRGN hRgnUpdate, LPRECT lpRectUpdate) + { + ATLASSERT(m_hDC != NULL); + return ::ScrollDC(m_hDC, dx, dy, lpRectScroll, lpRectClip, hRgnUpdate, lpRectUpdate); + } + +// Font Functions +#ifndef _WIN32_WCE + BOOL GetCharWidth(UINT nFirstChar, UINT nLastChar, LPINT lpBuffer) const + { + ATLASSERT(m_hDC != NULL); + return ::GetCharWidth(m_hDC, nFirstChar, nLastChar, lpBuffer); + } + + // GetCharWidth32 is not supported under Win9x + BOOL GetCharWidth32(UINT nFirstChar, UINT nLastChar, LPINT lpBuffer) const + { + ATLASSERT(m_hDC != NULL); + return ::GetCharWidth32(m_hDC, nFirstChar, nLastChar, lpBuffer); + } + + DWORD SetMapperFlags(DWORD dwFlag) + { + ATLASSERT(m_hDC != NULL); + return ::SetMapperFlags(m_hDC, dwFlag); + } + + BOOL GetAspectRatioFilter(LPSIZE lpSize) const + { + ATLASSERT(m_hDC != NULL); + return ::GetAspectRatioFilterEx(m_hDC, lpSize); + } + + BOOL GetCharABCWidths(UINT nFirstChar, UINT nLastChar, LPABC lpabc) const + { + ATLASSERT(m_hDC != NULL); + return ::GetCharABCWidths(m_hDC, nFirstChar, nLastChar, lpabc); + } + + DWORD GetFontData(DWORD dwTable, DWORD dwOffset, LPVOID lpData, DWORD cbData) const + { + ATLASSERT(m_hDC != NULL); + return ::GetFontData(m_hDC, dwTable, dwOffset, lpData, cbData); + } + + int GetKerningPairs(int nPairs, LPKERNINGPAIR lpkrnpair) const + { + ATLASSERT(m_hDC != NULL); + return ::GetKerningPairs(m_hDC, nPairs, lpkrnpair); + } + + UINT GetOutlineTextMetrics(UINT cbData, LPOUTLINETEXTMETRIC lpotm) const + { + ATLASSERT(m_hDC != NULL); + return ::GetOutlineTextMetrics(m_hDC, cbData, lpotm); + } + + DWORD GetGlyphOutline(UINT nChar, UINT nFormat, LPGLYPHMETRICS lpgm, DWORD cbBuffer, LPVOID lpBuffer, const MAT2* lpmat2) const + { + ATLASSERT(m_hDC != NULL); + return ::GetGlyphOutline(m_hDC, nChar, nFormat, lpgm, cbBuffer, lpBuffer, lpmat2); + } + + BOOL GetCharABCWidths(UINT nFirstChar, UINT nLastChar, LPABCFLOAT lpABCF) const + { + ATLASSERT(m_hDC != NULL); + return ::GetCharABCWidthsFloat(m_hDC, nFirstChar, nLastChar, lpABCF); + } + + BOOL GetCharWidth(UINT nFirstChar, UINT nLastChar, float* lpFloatBuffer) const + { + ATLASSERT(m_hDC != NULL); + return ::GetCharWidthFloat(m_hDC, nFirstChar, nLastChar, lpFloatBuffer); + } +#endif // !_WIN32_WCE + +// Printer/Device Escape Functions +#ifndef _WIN32_WCE + int Escape(int nEscape, int nCount, LPCSTR lpszInData, LPVOID lpOutData) + { + ATLASSERT(m_hDC != NULL); + return ::Escape(m_hDC, nEscape, nCount, lpszInData, lpOutData); + } +#endif // !_WIN32_WCE + + int Escape(int nEscape, int nInputSize, LPCSTR lpszInputData, + int nOutputSize, LPSTR lpszOutputData) + { + ATLASSERT(m_hDC != NULL); + return ::ExtEscape(m_hDC, nEscape, nInputSize, lpszInputData, nOutputSize, lpszOutputData); + } + +#ifndef _WIN32_WCE + int DrawEscape(int nEscape, int nInputSize, LPCSTR lpszInputData) + { + ATLASSERT(m_hDC != NULL); + return ::DrawEscape(m_hDC, nEscape, nInputSize, lpszInputData); + } +#endif // !_WIN32_WCE + + // Escape helpers +#if !defined(_WIN32_WCE) || ((_WIN32_WCE >= 200) && defined(StartDoc)) + int StartDoc(LPCTSTR lpszDocName) // old Win3.0 version + { + DOCINFO di = { 0 }; + di.cbSize = sizeof(DOCINFO); + di.lpszDocName = lpszDocName; + return StartDoc(&di); + } + + int StartDoc(LPDOCINFO lpDocInfo) + { + ATLASSERT(m_hDC != NULL); + return ::StartDoc(m_hDC, lpDocInfo); + } + + int StartPage() + { + ATLASSERT(m_hDC != NULL); + return ::StartPage(m_hDC); + } + + int EndPage() + { + ATLASSERT(m_hDC != NULL); + return ::EndPage(m_hDC); + } + + int SetAbortProc(BOOL (CALLBACK* lpfn)(HDC, int)) + { + ATLASSERT(m_hDC != NULL); + return ::SetAbortProc(m_hDC, (ABORTPROC)lpfn); + } + + int AbortDoc() + { + ATLASSERT(m_hDC != NULL); + return ::AbortDoc(m_hDC); + } + + int EndDoc() + { + ATLASSERT(m_hDC != NULL); + return ::EndDoc(m_hDC); + } +#endif // !defined(_WIN32_WCE) || ((_WIN32_WCE >= 200) && defined(StartDoc)) + +// MetaFile Functions +#ifndef _WIN32_WCE + BOOL PlayMetaFile(HMETAFILE hMF) + { + ATLASSERT(m_hDC != NULL); + if(::GetDeviceCaps(m_hDC, TECHNOLOGY) == DT_METAFILE) + { + // playing metafile in metafile, just use core windows API + return ::PlayMetaFile(m_hDC, hMF); + } + + // for special playback, lParam == pDC + return ::EnumMetaFile(m_hDC, hMF, EnumMetaFileProc, (LPARAM)this); + } + + BOOL PlayMetaFile(HENHMETAFILE hEnhMetaFile, LPCRECT lpBounds) + { + ATLASSERT(m_hDC != NULL); + return ::PlayEnhMetaFile(m_hDC, hEnhMetaFile, lpBounds); + } + + BOOL AddMetaFileComment(UINT nDataSize, const BYTE* pCommentData) // can be used for enhanced metafiles only + { + ATLASSERT(m_hDC != NULL); + return ::GdiComment(m_hDC, nDataSize, pCommentData); + } + + // Special handling for metafile playback + static int CALLBACK EnumMetaFileProc(HDC hDC, HANDLETABLE* pHandleTable, METARECORD* pMetaRec, int nHandles, LPARAM lParam) + { + CDCHandle* pDC = (CDCHandle*)lParam; + + switch (pMetaRec->rdFunction) + { + case META_SETMAPMODE: + pDC->SetMapMode((int)(short)pMetaRec->rdParm[0]); + break; + case META_SETWINDOWEXT: + pDC->SetWindowExt((int)(short)pMetaRec->rdParm[1], (int)(short)pMetaRec->rdParm[0]); + break; + case META_SETWINDOWORG: + pDC->SetWindowOrg((int)(short)pMetaRec->rdParm[1], (int)(short)pMetaRec->rdParm[0]); + break; + case META_SETVIEWPORTEXT: + pDC->SetViewportExt((int)(short)pMetaRec->rdParm[1], (int)(short)pMetaRec->rdParm[0]); + break; + case META_SETVIEWPORTORG: + pDC->SetViewportOrg((int)(short)pMetaRec->rdParm[1], (int)(short)pMetaRec->rdParm[0]); + break; + case META_SCALEWINDOWEXT: + pDC->ScaleWindowExt((int)(short)pMetaRec->rdParm[3], (int)(short)pMetaRec->rdParm[2], + (int)(short)pMetaRec->rdParm[1], (int)(short)pMetaRec->rdParm[0]); + break; + case META_SCALEVIEWPORTEXT: + pDC->ScaleViewportExt((int)(short)pMetaRec->rdParm[3], (int)(short)pMetaRec->rdParm[2], + (int)(short)pMetaRec->rdParm[1], (int)(short)pMetaRec->rdParm[0]); + break; + case META_OFFSETVIEWPORTORG: + pDC->OffsetViewportOrg((int)(short)pMetaRec->rdParm[1], (int)(short)pMetaRec->rdParm[0]); + break; + case META_SAVEDC: + pDC->SaveDC(); + break; + case META_RESTOREDC: + pDC->RestoreDC((int)(short)pMetaRec->rdParm[0]); + break; + case META_SETBKCOLOR: + pDC->SetBkColor(*(UNALIGNED COLORREF*)&pMetaRec->rdParm[0]); + break; + case META_SETTEXTCOLOR: + pDC->SetTextColor(*(UNALIGNED COLORREF*)&pMetaRec->rdParm[0]); + break; + + // need to watch out for SelectObject(HFONT), for custom font mapping + case META_SELECTOBJECT: + { + HGDIOBJ hObject = pHandleTable->objectHandle[pMetaRec->rdParm[0]]; + UINT nObjType = ::GetObjectType(hObject); + if(nObjType == 0) + { + // object type is unknown, determine if it is a font + HFONT hStockFont = (HFONT)::GetStockObject(SYSTEM_FONT); + HFONT hFontOld = (HFONT)::SelectObject(pDC->m_hDC, hStockFont); + HGDIOBJ hObjOld = ::SelectObject(pDC->m_hDC, hObject); + if(hObjOld == hStockFont) + { + // got the stock object back, so must be selecting a font + pDC->SelectFont((HFONT)hObject); + break; // don't play the default record + } + else + { + // didn't get the stock object back, so restore everything + ::SelectObject(pDC->m_hDC, hFontOld); + ::SelectObject(pDC->m_hDC, hObjOld); + } + // and fall through to PlayMetaFileRecord... + } + else if(nObjType == OBJ_FONT) + { + // play back as CDCHandle::SelectFont(HFONT) + pDC->SelectFont((HFONT)hObject); + break; // don't play the default record + } + } + // fall through... + + default: + ::PlayMetaFileRecord(hDC, pHandleTable, pMetaRec, nHandles); + break; + } + + return 1; + } +#endif // !_WIN32_WCE + +// Path Functions +#ifndef _WIN32_WCE + BOOL AbortPath() + { + ATLASSERT(m_hDC != NULL); + return ::AbortPath(m_hDC); + } + + BOOL BeginPath() + { + ATLASSERT(m_hDC != NULL); + return ::BeginPath(m_hDC); + } + + BOOL CloseFigure() + { + ATLASSERT(m_hDC != NULL); + return ::CloseFigure(m_hDC); + } + + BOOL EndPath() + { + ATLASSERT(m_hDC != NULL); + return ::EndPath(m_hDC); + } + + BOOL FillPath() + { + ATLASSERT(m_hDC != NULL); + return ::FillPath(m_hDC); + } + + BOOL FlattenPath() + { + ATLASSERT(m_hDC != NULL); + return ::FlattenPath(m_hDC); + } + + BOOL StrokeAndFillPath() + { + ATLASSERT(m_hDC != NULL); + return ::StrokeAndFillPath(m_hDC); + } + + BOOL StrokePath() + { + ATLASSERT(m_hDC != NULL); + return ::StrokePath(m_hDC); + } + + BOOL WidenPath() + { + ATLASSERT(m_hDC != NULL); + return ::WidenPath(m_hDC); + } + + BOOL GetMiterLimit(PFLOAT pfMiterLimit) const + { + ATLASSERT(m_hDC != NULL); + return ::GetMiterLimit(m_hDC, pfMiterLimit); + } + + BOOL SetMiterLimit(float fMiterLimit) + { + ATLASSERT(m_hDC != NULL); + return ::SetMiterLimit(m_hDC, fMiterLimit, NULL); + } + + int GetPath(LPPOINT lpPoints, LPBYTE lpTypes, int nCount) const + { + ATLASSERT(m_hDC != NULL); + return ::GetPath(m_hDC, lpPoints, lpTypes, nCount); + } + + BOOL SelectClipPath(int nMode) + { + ATLASSERT(m_hDC != NULL); + return ::SelectClipPath(m_hDC, nMode); + } +#endif // !_WIN32_WCE + +// Misc Helper Functions + static CBrushHandle PASCAL GetHalftoneBrush() + { + HBRUSH halftoneBrush = NULL; + WORD grayPattern[8]; + for(int i = 0; i < 8; i++) + grayPattern[i] = (WORD)(0x5555 << (i & 1)); + HBITMAP grayBitmap = CreateBitmap(8, 8, 1, 1, &grayPattern); + if(grayBitmap != NULL) + { + halftoneBrush = ::CreatePatternBrush(grayBitmap); + DeleteObject(grayBitmap); + } + return CBrushHandle(halftoneBrush); + } + + void DrawDragRect(LPCRECT lpRect, SIZE size, LPCRECT lpRectLast, SIZE sizeLast, HBRUSH hBrush = NULL, HBRUSH hBrushLast = NULL) + { + // first, determine the update region and select it + CRgn rgnOutside; + rgnOutside.CreateRectRgnIndirect(lpRect); + RECT rect = *lpRect; + ::InflateRect(&rect, -size.cx, -size.cy); + ::IntersectRect(&rect, &rect, lpRect); + CRgn rgnInside; + rgnInside.CreateRectRgnIndirect(&rect); + CRgn rgnNew; + rgnNew.CreateRectRgn(0, 0, 0, 0); + rgnNew.CombineRgn(rgnOutside, rgnInside, RGN_XOR); + + HBRUSH hBrushOld = NULL; + CBrush brushHalftone; + if(hBrush == NULL) + brushHalftone = hBrush = CDCHandle::GetHalftoneBrush(); + if(hBrushLast == NULL) + hBrushLast = hBrush; + + CRgn rgnLast; + CRgn rgnUpdate; + if(lpRectLast != NULL) + { + // find difference between new region and old region + rgnLast.CreateRectRgn(0, 0, 0, 0); + rgnOutside.SetRectRgn(lpRectLast->left, lpRectLast->top, lpRectLast->right, lpRectLast->bottom); + rect = *lpRectLast; + ::InflateRect(&rect, -sizeLast.cx, -sizeLast.cy); + ::IntersectRect(&rect, &rect, lpRectLast); + rgnInside.SetRectRgn(rect.left, rect.top, rect.right, rect.bottom); + rgnLast.CombineRgn(rgnOutside, rgnInside, RGN_XOR); + + // only diff them if brushes are the same + if(hBrush == hBrushLast) + { + rgnUpdate.CreateRectRgn(0, 0, 0, 0); + rgnUpdate.CombineRgn(rgnLast, rgnNew, RGN_XOR); + } + } + if(hBrush != hBrushLast && lpRectLast != NULL) + { + // brushes are different -- erase old region first + SelectClipRgn(rgnLast); + GetClipBox(&rect); + hBrushOld = SelectBrush(hBrushLast); + PatBlt(rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, PATINVERT); + SelectBrush(hBrushOld); + hBrushOld = NULL; + } + + // draw into the update/new region + SelectClipRgn(rgnUpdate.IsNull() ? rgnNew : rgnUpdate); + GetClipBox(&rect); + hBrushOld = SelectBrush(hBrush); + PatBlt(rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, PATINVERT); + + // cleanup DC + if(hBrushOld != NULL) + SelectBrush(hBrushOld); + SelectClipRgn(NULL); + } + + void FillSolidRect(LPCRECT lpRect, COLORREF clr) + { + ATLASSERT(m_hDC != NULL); + + COLORREF clrOld = ::SetBkColor(m_hDC, clr); + ATLASSERT(clrOld != CLR_INVALID); + if(clrOld != CLR_INVALID) + { + ::ExtTextOut(m_hDC, 0, 0, ETO_OPAQUE, lpRect, NULL, 0, NULL); + ::SetBkColor(m_hDC, clrOld); + } + } + + void FillSolidRect(int x, int y, int cx, int cy, COLORREF clr) + { + ATLASSERT(m_hDC != NULL); + + RECT rect = { x, y, x + cx, y + cy }; + FillSolidRect(&rect, clr); + } + + void Draw3dRect(LPCRECT lpRect, COLORREF clrTopLeft, COLORREF clrBottomRight) + { + Draw3dRect(lpRect->left, lpRect->top, lpRect->right - lpRect->left, + lpRect->bottom - lpRect->top, clrTopLeft, clrBottomRight); + } + + void Draw3dRect(int x, int y, int cx, int cy, COLORREF clrTopLeft, COLORREF clrBottomRight) + { + FillSolidRect(x, y, cx - 1, 1, clrTopLeft); + FillSolidRect(x, y, 1, cy - 1, clrTopLeft); + FillSolidRect(x + cx, y, -1, cy, clrBottomRight); + FillSolidRect(x, y + cy, cx, -1, clrBottomRight); + } + +// DIB support +#if !defined(_WIN32_WCE) || (_WIN32_WCE >= 410) + int SetDIBitsToDevice(int x, int y, DWORD dwWidth, DWORD dwHeight, int xSrc, int ySrc, UINT uStartScan, UINT cScanLines, CONST VOID* lpvBits, CONST BITMAPINFO* lpbmi, UINT uColorUse) + { + ATLASSERT(m_hDC != NULL); + return ::SetDIBitsToDevice(m_hDC, x, y, dwWidth, dwHeight, xSrc, ySrc, uStartScan, cScanLines, lpvBits, lpbmi, uColorUse); + } +#endif // !defined(_WIN32_WCE) || (_WIN32_WCE >= 410) + +#if !defined(_WIN32_WCE) || (_WIN32_WCE >= 400) + int StretchDIBits(int x, int y, int nWidth, int nHeight, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, CONST VOID* lpvBits, CONST BITMAPINFO* lpbmi, UINT uColorUse, DWORD dwRop) + { + ATLASSERT(m_hDC != NULL); + return ::StretchDIBits(m_hDC, x, y, nWidth, nHeight, xSrc, ySrc, nSrcWidth, nSrcHeight, lpvBits, lpbmi, uColorUse, dwRop); + } + + UINT GetDIBColorTable(UINT uStartIndex, UINT cEntries, RGBQUAD* pColors) const + { + ATLASSERT(m_hDC != NULL); + return ::GetDIBColorTable(m_hDC, uStartIndex, cEntries, pColors); + } + + UINT SetDIBColorTable(UINT uStartIndex, UINT cEntries, CONST RGBQUAD* pColors) + { + ATLASSERT(m_hDC != NULL); + return ::SetDIBColorTable(m_hDC, uStartIndex, cEntries, pColors); + } +#endif // !defined(_WIN32_WCE) || (_WIN32_WCE >= 400) + +// OpenGL support +#if !defined(_ATL_NO_OPENGL) && !defined(_WIN32_WCE) + int ChoosePixelFormat(CONST PIXELFORMATDESCRIPTOR* ppfd) + { + ATLASSERT(m_hDC != NULL); + return ::ChoosePixelFormat(m_hDC, ppfd); + } + + int DescribePixelFormat(int iPixelFormat, UINT nBytes, LPPIXELFORMATDESCRIPTOR ppfd) + { + ATLASSERT(m_hDC != NULL); + return ::DescribePixelFormat(m_hDC, iPixelFormat, nBytes, ppfd); + } + + int GetPixelFormat() const + { + ATLASSERT(m_hDC != NULL); + return ::GetPixelFormat(m_hDC); + } + + BOOL SetPixelFormat(int iPixelFormat, CONST PIXELFORMATDESCRIPTOR* ppfd) + { + ATLASSERT(m_hDC != NULL); + return ::SetPixelFormat(m_hDC, iPixelFormat, ppfd); + } + + BOOL SwapBuffers() + { + ATLASSERT(m_hDC != NULL); + return ::SwapBuffers(m_hDC); + } + + HGLRC wglCreateContext() + { + ATLASSERT(m_hDC != NULL); + return ::wglCreateContext(m_hDC); + } + + HGLRC wglCreateLayerContext(int iLayerPlane) + { + ATLASSERT(m_hDC != NULL); + return ::wglCreateLayerContext(m_hDC, iLayerPlane); + } + + BOOL wglMakeCurrent(HGLRC hglrc) + { + ATLASSERT(m_hDC != NULL); + return ::wglMakeCurrent(m_hDC, hglrc); + } + + BOOL wglUseFontBitmaps(DWORD dwFirst, DWORD dwCount, DWORD listBase) + { + ATLASSERT(m_hDC != NULL); + return ::wglUseFontBitmaps(m_hDC, dwFirst, dwCount, listBase); + } + + BOOL wglUseFontOutlines(DWORD dwFirst, DWORD dwCount, DWORD listBase, FLOAT deviation, FLOAT extrusion, int format, LPGLYPHMETRICSFLOAT lpgmf) + { + ATLASSERT(m_hDC != NULL); + return ::wglUseFontOutlines(m_hDC, dwFirst, dwCount, listBase, deviation, extrusion, format, lpgmf); + } + + BOOL wglDescribeLayerPlane(int iPixelFormat, int iLayerPlane, UINT nBytes, LPLAYERPLANEDESCRIPTOR plpd) + { + ATLASSERT(m_hDC != NULL); + return ::wglDescribeLayerPlane(m_hDC, iPixelFormat, iLayerPlane, nBytes, plpd); + } + + int wglSetLayerPaletteEntries(int iLayerPlane, int iStart, int cEntries, CONST COLORREF* pclr) + { + ATLASSERT(m_hDC != NULL); + return ::wglSetLayerPaletteEntries(m_hDC, iLayerPlane, iStart, cEntries, pclr); + } + + int wglGetLayerPaletteEntries(int iLayerPlane, int iStart, int cEntries, COLORREF* pclr) + { + ATLASSERT(m_hDC != NULL); + return ::wglGetLayerPaletteEntries(m_hDC, iLayerPlane, iStart, cEntries, pclr); + } + + BOOL wglRealizeLayerPalette(int iLayerPlane, BOOL bRealize) + { + ATLASSERT(m_hDC != NULL); + return ::wglRealizeLayerPalette(m_hDC, iLayerPlane, bRealize); + } + + BOOL wglSwapLayerBuffers(UINT uPlanes) + { + ATLASSERT(m_hDC != NULL); + return ::wglSwapLayerBuffers(m_hDC, uPlanes); + } +#endif // !defined(_ATL_NO_OPENGL) && !defined(_WIN32_WCE) + +// New for Windows 2000 only +#if (_WIN32_WINNT >= 0x0500) + COLORREF GetDCPenColor() const + { + ATLASSERT(m_hDC != NULL); + return ::GetDCPenColor(m_hDC); + } + + COLORREF SetDCPenColor(COLORREF clr) + { + ATLASSERT(m_hDC != NULL); + return ::SetDCPenColor(m_hDC, clr); + } + + COLORREF GetDCBrushColor() const + { + ATLASSERT(m_hDC != NULL); + return ::GetDCBrushColor(m_hDC); + } + + COLORREF SetDCBrushColor(COLORREF clr) + { + ATLASSERT(m_hDC != NULL); + return ::SetDCBrushColor(m_hDC, clr); + } + +#ifndef _WIN32_WCE + DWORD GetFontUnicodeRanges(LPGLYPHSET lpgs) const + { + ATLASSERT(m_hDC != NULL); + return ::GetFontUnicodeRanges(m_hDC, lpgs); + } +#endif // !_WIN32_WCE + + DWORD GetGlyphIndices(LPCTSTR lpstr, int cch, LPWORD pgi, DWORD dwFlags) const + { + ATLASSERT(m_hDC != NULL); + return ::GetGlyphIndices(m_hDC, lpstr, cch, pgi, dwFlags); + } + + BOOL GetTextExtentPointI(LPWORD pgiIn, int cgi, LPSIZE lpSize) const + { + ATLASSERT(m_hDC != NULL); + return ::GetTextExtentPointI(m_hDC, pgiIn, cgi, lpSize); + } + + BOOL GetTextExtentExPointI(LPWORD pgiIn, int cgi, int nMaxExtent, LPINT lpnFit, LPINT alpDx, LPSIZE lpSize) const + { + ATLASSERT(m_hDC != NULL); + return ::GetTextExtentExPointI(m_hDC, pgiIn, cgi, nMaxExtent, lpnFit, alpDx, lpSize); + } + + BOOL GetCharWidthI(UINT giFirst, UINT cgi, LPWORD pgi, LPINT lpBuffer) const + { + ATLASSERT(m_hDC != NULL); + return ::GetCharWidthI(m_hDC, giFirst, cgi, pgi, lpBuffer); + } + + BOOL GetCharABCWidthsI(UINT giFirst, UINT cgi, LPWORD pgi, LPABC lpabc) const + { + ATLASSERT(m_hDC != NULL); + return ::GetCharABCWidthsI(m_hDC, giFirst, cgi, pgi, lpabc); + } +#endif // (_WIN32_WINNT >= 0x0500) + +// New for Windows 2000 and Windows 98 +#if (WINVER >= 0x0500) && !defined(_WIN32_WCE) + BOOL ColorCorrectPalette(HPALETTE hPalette, DWORD dwFirstEntry, DWORD dwNumOfEntries) + { + ATLASSERT(m_hDC != NULL); + return ::ColorCorrectPalette(m_hDC, hPalette, dwFirstEntry, dwNumOfEntries); + } +#endif // (WINVER >= 0x0500) && !defined(_WIN32_WCE) +}; + +typedef CDCT CDCHandle; +typedef CDCT CDC; + + +/////////////////////////////////////////////////////////////////////////////// +// CDC Helpers + +class CPaintDC : public CDC +{ +public: +// Data members + HWND m_hWnd; + PAINTSTRUCT m_ps; + +// Constructor/destructor + CPaintDC(HWND hWnd) + { + ATLASSERT(::IsWindow(hWnd)); + m_hWnd = hWnd; + m_hDC = ::BeginPaint(hWnd, &m_ps); + } + + ~CPaintDC() + { + ATLASSERT(m_hDC != NULL); + ATLASSERT(::IsWindow(m_hWnd)); + ::EndPaint(m_hWnd, &m_ps); + Detach(); + } +}; + +class CClientDC : public CDC +{ +public: +// Data members + HWND m_hWnd; + +// Constructor/destructor + CClientDC(HWND hWnd) + { + ATLASSERT(hWnd == NULL || ::IsWindow(hWnd)); + m_hWnd = hWnd; + m_hDC = ::GetDC(hWnd); + } + + ~CClientDC() + { + ATLASSERT(m_hDC != NULL); + ::ReleaseDC(m_hWnd, Detach()); + } +}; + +class CWindowDC : public CDC +{ +public: +// Data members + HWND m_hWnd; + +// Constructor/destructor + CWindowDC(HWND hWnd) + { + ATLASSERT(hWnd == NULL || ::IsWindow(hWnd)); + m_hWnd = hWnd; + m_hDC = ::GetWindowDC(hWnd); + } + + ~CWindowDC() + { + ATLASSERT(m_hDC != NULL); + ::ReleaseDC(m_hWnd, Detach()); + } +}; + +class CMemoryDC : public CDC +{ +public: +// Data members + HDC m_hDCOriginal; + RECT m_rcPaint; + CBitmap m_bmp; + HBITMAP m_hBmpOld; + +// Constructor/destructor + CMemoryDC(HDC hDC, RECT& rcPaint) : m_hDCOriginal(hDC), m_hBmpOld(NULL) + { + m_rcPaint = rcPaint; + CreateCompatibleDC(m_hDCOriginal); + ATLASSERT(m_hDC != NULL); + m_bmp.CreateCompatibleBitmap(m_hDCOriginal, m_rcPaint.right - m_rcPaint.left, m_rcPaint.bottom - m_rcPaint.top); + ATLASSERT(m_bmp.m_hBitmap != NULL); + m_hBmpOld = SelectBitmap(m_bmp); + SetViewportOrg(-m_rcPaint.left, -m_rcPaint.top); + } + + ~CMemoryDC() + { + ::BitBlt(m_hDCOriginal, m_rcPaint.left, m_rcPaint.top, m_rcPaint.right - m_rcPaint.left, m_rcPaint.bottom - m_rcPaint.top, m_hDC, m_rcPaint.left, m_rcPaint.top, SRCCOPY); + SelectBitmap(m_hBmpOld); + } +}; + + +/////////////////////////////////////////////////////////////////////////////// +// Enhanced metafile support + +#ifndef _WIN32_WCE + +class CEnhMetaFileInfo +{ +public: +// Data members + HENHMETAFILE m_hEMF; + BYTE* m_pBits; + TCHAR* m_pDesc; + ENHMETAHEADER m_header; + PIXELFORMATDESCRIPTOR m_pfd; + +// Constructor/destructor + CEnhMetaFileInfo(HENHMETAFILE hEMF) : m_pBits(NULL), m_pDesc(NULL), m_hEMF(hEMF) + { } + + ~CEnhMetaFileInfo() + { + delete [] m_pBits; + delete [] m_pDesc; + } + +// Operations + BYTE* GetEnhMetaFileBits() + { + ATLASSERT(m_hEMF != NULL); + UINT nBytes = ::GetEnhMetaFileBits(m_hEMF, 0, NULL); + delete [] m_pBits; + m_pBits = NULL; + ATLTRY(m_pBits = new BYTE[nBytes]); + if (m_pBits != NULL) + ::GetEnhMetaFileBits(m_hEMF, nBytes, m_pBits); + return m_pBits; + } + + LPTSTR GetEnhMetaFileDescription() + { + ATLASSERT(m_hEMF != NULL); + UINT nLen = ::GetEnhMetaFileDescription(m_hEMF, 0, NULL); + delete [] m_pDesc; + m_pDesc = NULL; + ATLTRY(m_pDesc = new TCHAR[nLen]); + if (m_pDesc != NULL) + nLen = ::GetEnhMetaFileDescription(m_hEMF, nLen, m_pDesc); + return m_pDesc; + } + + ENHMETAHEADER* GetEnhMetaFileHeader() + { + ATLASSERT(m_hEMF != NULL); + memset(&m_header, 0, sizeof(m_header)); + m_header.iType = EMR_HEADER; + m_header.nSize = sizeof(ENHMETAHEADER); + UINT n = ::GetEnhMetaFileHeader(m_hEMF, sizeof(ENHMETAHEADER), &m_header); + return (n != 0) ? &m_header : NULL; + } + + PIXELFORMATDESCRIPTOR* GetEnhMetaFilePixelFormat() + { + ATLASSERT(m_hEMF != NULL); + memset(&m_pfd, 0, sizeof(m_pfd)); + UINT n = ::GetEnhMetaFilePixelFormat(m_hEMF, sizeof(m_pfd), &m_pfd); + return (n != 0) ? &m_pfd : NULL; + } +}; + + +template +class CEnhMetaFileT +{ +public: +// Data members + HENHMETAFILE m_hEMF; + +// Constructor/destructor + CEnhMetaFileT(HENHMETAFILE hEMF = NULL) : m_hEMF(hEMF) + { + } + + ~CEnhMetaFileT() + { + if(t_bManaged && m_hEMF != NULL) + DeleteObject(); + } + +// Operations + CEnhMetaFileT& operator =(HENHMETAFILE hEMF) + { + Attach(hEMF); + return *this; + } + + void Attach(HENHMETAFILE hEMF) + { + if(t_bManaged && m_hEMF != NULL && m_hEMF != hEMF) + DeleteObject(); + m_hEMF = hEMF; + } + + HENHMETAFILE Detach() + { + HENHMETAFILE hEMF = m_hEMF; + m_hEMF = NULL; + return hEMF; + } + + operator HENHMETAFILE() const { return m_hEMF; } + + bool IsNull() const { return (m_hEMF == NULL); } + + BOOL DeleteObject() + { + ATLASSERT(m_hEMF != NULL); + BOOL bRet = ::DeleteEnhMetaFile(m_hEMF); + m_hEMF = NULL; + return bRet; + } + + UINT GetEnhMetaFileBits(UINT cbBuffer, LPBYTE lpbBuffer) const + { + ATLASSERT(m_hEMF != NULL); + return ::GetEnhMetaFileBits(m_hEMF, cbBuffer, lpbBuffer); + } + + UINT GetEnhMetaFileDescription(UINT cchBuffer, LPTSTR lpszDescription) const + { + ATLASSERT(m_hEMF != NULL); + return ::GetEnhMetaFileDescription(m_hEMF, cchBuffer, lpszDescription); + } + + UINT GetEnhMetaFileHeader(LPENHMETAHEADER lpemh) const + { + ATLASSERT(m_hEMF != NULL); + lpemh->iType = EMR_HEADER; + lpemh->nSize = sizeof(ENHMETAHEADER); + return ::GetEnhMetaFileHeader(m_hEMF, sizeof(ENHMETAHEADER), lpemh); + } + + UINT GetEnhMetaFilePaletteEntries(UINT cEntries, LPPALETTEENTRY lppe) const + { + ATLASSERT(m_hEMF != NULL); + return ::GetEnhMetaFilePaletteEntries(m_hEMF, cEntries, lppe); + } + + UINT GetEnhMetaFilePixelFormat(DWORD cbBuffer, PIXELFORMATDESCRIPTOR* ppfd) const + { + ATLASSERT(m_hEMF != NULL); + return ::GetEnhMetaFilePixelFormat(m_hEMF, cbBuffer, ppfd); + } +}; + +typedef CEnhMetaFileT CEnhMetaFileHandle; +typedef CEnhMetaFileT CEnhMetaFile; + + +class CEnhMetaFileDC : public CDC +{ +public: +// Constructor/destructor + CEnhMetaFileDC() + { + } + + CEnhMetaFileDC(HDC hdc, LPCRECT lpRect) + { + Create(hdc, NULL, lpRect, NULL); + ATLASSERT(m_hDC != NULL); + } + + CEnhMetaFileDC(HDC hdcRef, LPCTSTR lpFilename, LPCRECT lpRect, LPCTSTR lpDescription) + { + Create(hdcRef, lpFilename, lpRect, lpDescription); + ATLASSERT(m_hDC != NULL); + } + + ~CEnhMetaFileDC() + { + HENHMETAFILE hEMF = Close(); + if (hEMF != NULL) + ::DeleteEnhMetaFile(hEMF); + } + +// Operations + void Create(HDC hdcRef, LPCTSTR lpFilename, LPCRECT lpRect, LPCTSTR lpDescription) + { + ATLASSERT(m_hDC == NULL); + m_hDC = ::CreateEnhMetaFile(hdcRef, lpFilename, lpRect, lpDescription); + } + + HENHMETAFILE Close() + { + HENHMETAFILE hEMF = NULL; + if (m_hDC != NULL) + { + hEMF = ::CloseEnhMetaFile(m_hDC); + m_hDC = NULL; + } + return hEMF; + } +}; + +#endif // !_WIN32_WCE + + +/////////////////////////////////////////////////////////////////////////////// +// WinCE compatible clipboard CF_DIB format support functions + +#ifndef _WTL_NO_DIB16 + +#define DIBINFO16_BITFIELDS { 31744, 992, 31 } + +// DIBINFO16 - To avoid color table problems in WinCE we only create this type of Dib +struct DIBINFO16 // a BITMAPINFO with 2 additional color bitfields +{ + BITMAPINFOHEADER bmiHeader; + RGBQUAD bmiColors[3]; + + DIBINFO16(SIZE size) + { + BITMAPINFOHEADER bmih = { sizeof(BITMAPINFOHEADER), size.cx, size.cy, + 1, 16, BI_BITFIELDS, 2 * size.cx * size.cy , 0, 0, 3 }; + DWORD dw[3] = DIBINFO16_BITFIELDS ; + + bmiHeader = bmih; + memcpy(bmiColors, dw, 3 * sizeof(DWORD)); + } +}; + + +// AtlxxxDibxxx minimal packed DIB implementation and helpers to copy and paste CF_DIB + +inline bool AtlIsDib16(LPBITMAPINFOHEADER pbmih) +{ + return (pbmih->biBitCount == 16) && (pbmih->biCompression == BI_BITFIELDS); +} + +inline int AtlGetDibColorTableSize(LPBITMAPINFOHEADER pbmih) +{ + switch (pbmih->biBitCount) + { + case 2: + case 4: + case 8: + return pbmih->biClrUsed ? pbmih->biClrUsed : 1 << pbmih->biBitCount; + case 24: + break; + case 16: + case 32: + return pbmih->biCompression == BI_BITFIELDS ? 3 : 0; + default: + ATLASSERT(FALSE); // should never come here + } + + return 0; +} + +inline int AtlGetDibNumColors(LPBITMAPINFOHEADER pbmih) +{ + switch (pbmih->biBitCount) + { + case 2: + case 4: + case 8: + if (pbmih->biClrUsed) + return pbmih->biClrUsed; + else + break; + case 16: + if (pbmih->biCompression == BI_BITFIELDS ) + return 1 << 15; + else + break; + case 24: + break; + case 32: + if (pbmih->biCompression == BI_BITFIELDS ) + return 1 << 24; + else + break; + default: + ATLASSERT(FALSE); + } + + return 1 << pbmih->biBitCount; +} + +inline HBITMAP AtlGetDibBitmap(LPBITMAPINFO pbmi) +{ + HBITMAP hbm = NULL; + CDC dc(NULL); + void * pBits = NULL; + + LPBYTE pDibBits = (LPBYTE)pbmi + sizeof(BITMAPINFOHEADER) + AtlGetDibColorTableSize(&pbmi->bmiHeader) * sizeof(RGBQUAD); + if (hbm = CreateDIBSection(dc, pbmi, DIB_RGB_COLORS, &pBits, NULL, NULL)) + memcpy(pBits, pDibBits, pbmi->bmiHeader.biSizeImage); + + return hbm; +} + +inline HBITMAP AtlCopyBitmap(HBITMAP hbm , SIZE sizeDst, bool bAsBitmap = false) +{ + CDC hdcSrc = CreateCompatibleDC(NULL); + CDC hdcDst = CreateCompatibleDC(NULL); + + CBitmapHandle hbmOld = NULL, hbmOld2 = NULL, bmSrc = hbm; + + CBitmap bmNew = NULL; + + SIZE sizeSrc = { 0 }; + bmSrc.GetSize(sizeSrc); + + hbmOld = hdcSrc.SelectBitmap(bmSrc); + + if (bAsBitmap) + { + bmNew.CreateCompatibleBitmap(hdcSrc, sizeDst.cx, sizeDst.cy); + } + else + { + DIBINFO16 dib16(sizeDst); + LPVOID pBits = NULL; + bmNew = CreateDIBSection(hdcDst, (const BITMAPINFO*)&dib16, DIB_RGB_COLORS, &pBits, NULL, NULL); + } + + ATLASSERT(!bmNew.IsNull()); + + hbmOld2 = hdcDst.SelectBitmap(bmNew); + BOOL bOK = FALSE; + + if ((sizeDst.cx == sizeSrc.cx) && (sizeDst.cy == sizeSrc.cy)) + bOK = hdcDst.BitBlt(0, 0, sizeDst.cx, sizeDst.cy, hdcSrc, 0, 0, SRCCOPY); + else + bOK = hdcDst.StretchBlt(0, 0, sizeDst.cx, sizeDst.cy, hdcSrc, 0, 0, sizeSrc.cx, sizeSrc.cy, SRCCOPY); + + hdcSrc.SelectBitmap(hbmOld); + hdcDst.SelectBitmap(hbmOld2); + + if (bOK == FALSE) + bmNew.DeleteObject(); + + return bmNew.Detach(); +} + +inline HLOCAL AtlCreatePackedDib16(HBITMAP hbm, SIZE size) +{ + DIBSECTION ds = { 0 }; + LPBYTE pDib = NULL; + bool bCopied = false; + + bool bOK = GetObject(hbm, sizeof(ds), &ds) == sizeof(ds); + if ((bOK == FALSE) || (ds.dsBm.bmBits == NULL) || (AtlIsDib16(&ds.dsBmih) == FALSE) || + (ds.dsBmih.biWidth != size.cx ) || (ds.dsBmih.biHeight != size.cy )) + { + if ((hbm = AtlCopyBitmap(hbm, size)) != NULL) + { + bCopied = true; + bOK = GetObject(hbm, sizeof(ds), &ds) == sizeof(ds); + } + else + { + bOK = FALSE; + } + } + + if((bOK == TRUE) && (AtlIsDib16(&ds.dsBmih) == TRUE) && (ds.dsBm.bmBits != NULL)) + { + pDib = (LPBYTE)LocalAlloc(LMEM_ZEROINIT, sizeof(DIBINFO16) + ds.dsBmih.biSizeImage); + if (pDib != NULL) + { + memcpy(pDib , &ds.dsBmih, sizeof(DIBINFO16)); + memcpy(pDib + sizeof(DIBINFO16), ds.dsBm.bmBits, ds.dsBmih.biSizeImage); + } + } + + if (bCopied == true) + DeleteObject(hbm); + + return (HLOCAL)pDib; +} + +inline bool AtlSetClipboardDib16(HBITMAP hbm, SIZE size, HWND hWnd) +{ + ATLASSERT(::IsWindow(hWnd)); + BOOL bOK = OpenClipboard(hWnd); + if (bOK == TRUE) + { + if ((bOK = EmptyClipboard()) == TRUE) + { + HLOCAL hDib = AtlCreatePackedDib16(hbm, size); + if (hDib != NULL) + { + bOK = SetClipboardData(CF_DIB, hDib) != NULL; + if (bOK == FALSE) + LocalFree(hDib); + } + else + { + bOK = FALSE; + } + } + CloseClipboard(); + } + + return bOK == TRUE; +} + +inline HBITMAP AtlGetClipboardDib(HWND hWnd) +{ + ATLASSERT(::IsWindow(hWnd) == TRUE); + HBITMAP hbm = NULL; + if (OpenClipboard(hWnd) == TRUE) + { + LPBITMAPINFO pbmi = (LPBITMAPINFO)GetClipboardData(CF_DIB); + if (pbmi != NULL) + hbm = AtlGetDibBitmap(pbmi); + CloseClipboard(); + } + + return hbm; +} + +#endif // _WTL_NO_DIB16 + +}; // namespace WTL + +#endif // __ATLGDI_H__ diff --git a/Externals/WTL80/atlmisc.h b/Externals/WTL80/atlmisc.h new file mode 100644 index 0000000000..70c8745f91 --- /dev/null +++ b/Externals/WTL80/atlmisc.h @@ -0,0 +1,4021 @@ +// Windows Template Library - WTL version 8.0 +// Copyright (C) Microsoft Corporation. All rights reserved. +// +// This file is a part of the Windows Template Library. +// The use and distribution terms for this software are covered by the +// Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php) +// which can be found in the file CPL.TXT at the root of this distribution. +// By using this software in any fashion, you are agreeing to be bound by +// the terms of this license. You must not remove this notice, or +// any other, from this software. + +#ifndef __ATLMISC_H__ +#define __ATLMISC_H__ + +#pragma once + +#ifndef __cplusplus + #error ATL requires C++ compilation (use a .cpp suffix) +#endif + +#ifndef __ATLAPP_H__ + #error atlmisc.h requires atlapp.h to be included first +#endif + + +#ifdef _ATL_TMP_NO_CSTRING + #define _WTL_NO_CSTRING +#endif + +#if defined(_WTL_USE_CSTRING) && defined(_WTL_NO_CSTRING) + #error Conflicting options - both _WTL_USE_CSTRING and _WTL_NO_CSTRING are defined +#endif // defined(_WTL_USE_CSTRING) && defined(_WTL_NO_CSTRING) + +#if !defined(_WTL_USE_CSTRING) && !defined(_WTL_NO_CSTRING) + #define _WTL_USE_CSTRING +#endif // !defined(_WTL_USE_CSTRING) && !defined(_WTL_NO_CSTRING) + +#ifndef _WTL_NO_CSTRING + #if defined(_ATL_USE_CSTRING_FLOAT) && defined(_ATL_MIN_CRT) + #error Cannot use CString floating point formatting with _ATL_MIN_CRT defined + #endif // defined(_ATL_USE_CSTRING_FLOAT) && defined(_ATL_MIN_CRT) +#endif // !_WTL_NO_CSTRING + + +/////////////////////////////////////////////////////////////////////////////// +// Classes in this file: +// +// CSize +// CPoint +// CRect +// CString +// +// CRecentDocumentListBase +// CRecentDocumentList +// CFindFile +// +// Global functions: +// AtlLoadAccelerators() +// AtlLoadMenu() +// AtlLoadBitmap() +// AtlLoadSysBitmap() +// AtlLoadCursor() +// AtlLoadSysCursor() +// AtlLoadIcon() +// AtlLoadSysIcon() +// AtlLoadBitmapImage() +// AtlLoadCursorImage() +// AtlLoadIconImage() +// AtlLoadSysBitmapImage() +// AtlLoadSysCursorImage() +// AtlLoadSysIconImage() +// AtlLoadString() +// +// AtlGetStockPen() +// AtlGetStockBrush() +// AtlGetStockFont() +// AtlGetStockPalette() +// +// AtlCompactPath() + + +namespace WTL +{ + +#ifndef _WTL_NO_WTYPES + +// forward declarations +class CSize; +class CPoint; +class CRect; + +/////////////////////////////////////////////////////////////////////////////// +// CSize - Wrapper for Windows SIZE structure. + +class CSize : public SIZE +{ +public: +// Constructors + CSize() + { + cx = 0; + cy = 0; + } + + CSize(int initCX, int initCY) + { + cx = initCX; + cy = initCY; + } + + CSize(SIZE initSize) + { + *(SIZE*)this = initSize; + } + + CSize(POINT initPt) + { + *(POINT*)this = initPt; + } + + CSize(DWORD dwSize) + { + cx = (short)LOWORD(dwSize); + cy = (short)HIWORD(dwSize); + } + +// Operations + BOOL operator ==(SIZE size) const + { + return (cx == size.cx && cy == size.cy); + } + + BOOL operator !=(SIZE size) const + { + return (cx != size.cx || cy != size.cy); + } + + void operator +=(SIZE size) + { + cx += size.cx; + cy += size.cy; + } + + void operator -=(SIZE size) + { + cx -= size.cx; + cy -= size.cy; + } + + void SetSize(int CX, int CY) + { + cx = CX; + cy = CY; + } + +// Operators returning CSize values + CSize operator +(SIZE size) const + { + return CSize(cx + size.cx, cy + size.cy); + } + + CSize operator -(SIZE size) const + { + return CSize(cx - size.cx, cy - size.cy); + } + + CSize operator -() const + { + return CSize(-cx, -cy); + } + +// Operators returning CPoint values + CPoint operator +(POINT point) const; + CPoint operator -(POINT point) const; + +// Operators returning CRect values + CRect operator +(const RECT* lpRect) const; + CRect operator -(const RECT* lpRect) const; +}; + + +/////////////////////////////////////////////////////////////////////////////// +// CPoint - Wrapper for Windows POINT structure. + +class CPoint : public POINT +{ +public: +// Constructors + CPoint() + { + x = 0; + y = 0; + } + + CPoint(int initX, int initY) + { + x = initX; + y = initY; + } + + CPoint(POINT initPt) + { + *(POINT*)this = initPt; + } + + CPoint(SIZE initSize) + { + *(SIZE*)this = initSize; + } + + CPoint(DWORD dwPoint) + { + x = (short)LOWORD(dwPoint); + y = (short)HIWORD(dwPoint); + } + +// Operations + void Offset(int xOffset, int yOffset) + { + x += xOffset; + y += yOffset; + } + + void Offset(POINT point) + { + x += point.x; + y += point.y; + } + + void Offset(SIZE size) + { + x += size.cx; + y += size.cy; + } + + BOOL operator ==(POINT point) const + { + return (x == point.x && y == point.y); + } + + BOOL operator !=(POINT point) const + { + return (x != point.x || y != point.y); + } + + void operator +=(SIZE size) + { + x += size.cx; + y += size.cy; + } + + void operator -=(SIZE size) + { + x -= size.cx; + y -= size.cy; + } + + void operator +=(POINT point) + { + x += point.x; + y += point.y; + } + + void operator -=(POINT point) + { + x -= point.x; + y -= point.y; + } + + void SetPoint(int X, int Y) + { + x = X; + y = Y; + } + +// Operators returning CPoint values + CPoint operator +(SIZE size) const + { + return CPoint(x + size.cx, y + size.cy); + } + + CPoint operator -(SIZE size) const + { + return CPoint(x - size.cx, y - size.cy); + } + + CPoint operator -() const + { + return CPoint(-x, -y); + } + + CPoint operator +(POINT point) const + { + return CPoint(x + point.x, y + point.y); + } + +// Operators returning CSize values + CSize operator -(POINT point) const + { + return CSize(x - point.x, y - point.y); + } + +// Operators returning CRect values + CRect operator +(const RECT* lpRect) const; + CRect operator -(const RECT* lpRect) const; +}; + + +/////////////////////////////////////////////////////////////////////////////// +// CRect - Wrapper for Windows RECT structure. + +class CRect : public RECT +{ +public: +// Constructors + CRect() + { + left = 0; + top = 0; + right = 0; + bottom = 0; + } + + CRect(int l, int t, int r, int b) + { + left = l; + top = t; + right = r; + bottom = b; + } + + CRect(const RECT& srcRect) + { + ::CopyRect(this, &srcRect); + } + + CRect(LPCRECT lpSrcRect) + { + ::CopyRect(this, lpSrcRect); + } + + CRect(POINT point, SIZE size) + { + right = (left = point.x) + size.cx; + bottom = (top = point.y) + size.cy; + } + + CRect(POINT topLeft, POINT bottomRight) + { + left = topLeft.x; + top = topLeft.y; + right = bottomRight.x; + bottom = bottomRight.y; + } + +// Attributes (in addition to RECT members) + int Width() const + { + return right - left; + } + + int Height() const + { + return bottom - top; + } + + CSize Size() const + { + return CSize(right - left, bottom - top); + } + + CPoint& TopLeft() + { + return *((CPoint*)this); + } + + CPoint& BottomRight() + { + return *((CPoint*)this + 1); + } + + const CPoint& TopLeft() const + { + return *((CPoint*)this); + } + + const CPoint& BottomRight() const + { + return *((CPoint*)this + 1); + } + + CPoint CenterPoint() const + { + return CPoint((left + right) / 2, (top + bottom) / 2); + } + + // convert between CRect and LPRECT/LPCRECT (no need for &) + operator LPRECT() + { + return this; + } + + operator LPCRECT() const + { + return this; + } + + BOOL IsRectEmpty() const + { + return ::IsRectEmpty(this); + } + + BOOL IsRectNull() const + { + return (left == 0 && right == 0 && top == 0 && bottom == 0); + } + + BOOL PtInRect(POINT point) const + { + return ::PtInRect(this, point); + } + +// Operations + void SetRect(int x1, int y1, int x2, int y2) + { + ::SetRect(this, x1, y1, x2, y2); + } + + void SetRect(POINT topLeft, POINT bottomRight) + { + ::SetRect(this, topLeft.x, topLeft.y, bottomRight.x, bottomRight.y); + } + + void SetRectEmpty() + { + ::SetRectEmpty(this); + } + + void CopyRect(LPCRECT lpSrcRect) + { + ::CopyRect(this, lpSrcRect); + } + + BOOL EqualRect(LPCRECT lpRect) const + { + return ::EqualRect(this, lpRect); + } + + void InflateRect(int x, int y) + { + ::InflateRect(this, x, y); + } + + void InflateRect(SIZE size) + { + ::InflateRect(this, size.cx, size.cy); + } + + void InflateRect(LPCRECT lpRect) + { + left -= lpRect->left; + top -= lpRect->top; + right += lpRect->right; + bottom += lpRect->bottom; + } + + void InflateRect(int l, int t, int r, int b) + { + left -= l; + top -= t; + right += r; + bottom += b; + } + + void DeflateRect(int x, int y) + { + ::InflateRect(this, -x, -y); + } + + void DeflateRect(SIZE size) + { + ::InflateRect(this, -size.cx, -size.cy); + } + + void DeflateRect(LPCRECT lpRect) + { + left += lpRect->left; + top += lpRect->top; + right -= lpRect->right; + bottom -= lpRect->bottom; + } + + void DeflateRect(int l, int t, int r, int b) + { + left += l; + top += t; + right -= r; + bottom -= b; + } + + void OffsetRect(int x, int y) + { + ::OffsetRect(this, x, y); + } + void OffsetRect(SIZE size) + { + ::OffsetRect(this, size.cx, size.cy); + } + + void OffsetRect(POINT point) + { + ::OffsetRect(this, point.x, point.y); + } + + void NormalizeRect() + { + int nTemp; + if (left > right) + { + nTemp = left; + left = right; + right = nTemp; + } + if (top > bottom) + { + nTemp = top; + top = bottom; + bottom = nTemp; + } + } + + // absolute position of rectangle + void MoveToY(int y) + { + bottom = Height() + y; + top = y; + } + + void MoveToX(int x) + { + right = Width() + x; + left = x; + } + + void MoveToXY(int x, int y) + { + MoveToX(x); + MoveToY(y); + } + + void MoveToXY(POINT pt) + { + MoveToX(pt.x); + MoveToY(pt.y); + } + + // operations that fill '*this' with result + BOOL IntersectRect(LPCRECT lpRect1, LPCRECT lpRect2) + { + return ::IntersectRect(this, lpRect1, lpRect2); + } + + BOOL UnionRect(LPCRECT lpRect1, LPCRECT lpRect2) + { + return ::UnionRect(this, lpRect1, lpRect2); + } + + BOOL SubtractRect(LPCRECT lpRectSrc1, LPCRECT lpRectSrc2) + { + return ::SubtractRect(this, lpRectSrc1, lpRectSrc2); + } + +// Additional Operations + void operator =(const RECT& srcRect) + { + ::CopyRect(this, &srcRect); + } + + BOOL operator ==(const RECT& rect) const + { + return ::EqualRect(this, &rect); + } + + BOOL operator !=(const RECT& rect) const + { + return !::EqualRect(this, &rect); + } + + void operator +=(POINT point) + { + ::OffsetRect(this, point.x, point.y); + } + + void operator +=(SIZE size) + { + ::OffsetRect(this, size.cx, size.cy); + } + + void operator +=(LPCRECT lpRect) + { + InflateRect(lpRect); + } + + void operator -=(POINT point) + { + ::OffsetRect(this, -point.x, -point.y); + } + + void operator -=(SIZE size) + { + ::OffsetRect(this, -size.cx, -size.cy); + } + + void operator -=(LPCRECT lpRect) + { + DeflateRect(lpRect); + } + + void operator &=(const RECT& rect) + { + ::IntersectRect(this, this, &rect); + } + + void operator |=(const RECT& rect) + { + ::UnionRect(this, this, &rect); + } + +// Operators returning CRect values + CRect operator +(POINT pt) const + { + CRect rect(*this); + ::OffsetRect(&rect, pt.x, pt.y); + return rect; + } + + CRect operator -(POINT pt) const + { + CRect rect(*this); + ::OffsetRect(&rect, -pt.x, -pt.y); + return rect; + } + + CRect operator +(LPCRECT lpRect) const + { + CRect rect(this); + rect.InflateRect(lpRect); + return rect; + } + + CRect operator +(SIZE size) const + { + CRect rect(*this); + ::OffsetRect(&rect, size.cx, size.cy); + return rect; + } + + CRect operator -(SIZE size) const + { + CRect rect(*this); + ::OffsetRect(&rect, -size.cx, -size.cy); + return rect; + } + + CRect operator -(LPCRECT lpRect) const + { + CRect rect(this); + rect.DeflateRect(lpRect); + return rect; + } + + CRect operator &(const RECT& rect2) const + { + CRect rect; + ::IntersectRect(&rect, this, &rect2); + return rect; + } + + CRect operator |(const RECT& rect2) const + { + CRect rect; + ::UnionRect(&rect, this, &rect2); + return rect; + } + + CRect MulDiv(int nMultiplier, int nDivisor) const + { + return CRect( + ::MulDiv(left, nMultiplier, nDivisor), + ::MulDiv(top, nMultiplier, nDivisor), + ::MulDiv(right, nMultiplier, nDivisor), + ::MulDiv(bottom, nMultiplier, nDivisor)); + } +}; + + +// CSize implementation + +inline CPoint CSize::operator +(POINT point) const +{ return CPoint(cx + point.x, cy + point.y); } + +inline CPoint CSize::operator -(POINT point) const +{ return CPoint(cx - point.x, cy - point.y); } + +inline CRect CSize::operator +(const RECT* lpRect) const +{ return CRect(lpRect) + *this; } + +inline CRect CSize::operator -(const RECT* lpRect) const +{ return CRect(lpRect) - *this; } + + +// CPoint implementation + +inline CRect CPoint::operator +(const RECT* lpRect) const +{ return CRect(lpRect) + *this; } + +inline CRect CPoint::operator -(const RECT* lpRect) const +{ return CRect(lpRect) - *this; } + +#endif // !_WTL_NO_WTYPES + + +// WTL::CSize or ATL::CSize scalar operators + +#if !defined(_WTL_NO_SIZE_SCALAR) && (!defined(_WTL_NO_WTYPES) || defined(__ATLTYPES_H__)) + +template +inline CSize operator *(SIZE s, Num n) +{ + return CSize((int)(s.cx * n), (int)(s.cy * n)); +}; + +template +inline void operator *=(SIZE & s, Num n) +{ + s = s * n; +}; + +template +inline CSize operator /(SIZE s, Num n) +{ + return CSize((int)(s.cx / n), (int)(s.cy / n)); +}; + +template +inline void operator /=(SIZE & s, Num n) +{ + s = s / n; +}; + +#endif // !defined(_WTL_NO_SIZE_SCALAR) && (!defined(_WTL_NO_WTYPES) || defined(__ATLTYPES_H__)) + + +/////////////////////////////////////////////////////////////////////////////// +// CString - String class + +#ifndef _WTL_NO_CSTRING + +struct CStringData +{ + long nRefs; // reference count + int nDataLength; + int nAllocLength; + // TCHAR data[nAllocLength] + + TCHAR* data() + { return (TCHAR*)(this + 1); } +}; + +// Globals + +// For an empty string, m_pchData will point here +// (note: avoids special case of checking for NULL m_pchData) +// empty string data (and locked) +_declspec(selectany) int rgInitData[] = { -1, 0, 0, 0 }; +_declspec(selectany) CStringData* _atltmpDataNil = (CStringData*)&rgInitData; +_declspec(selectany) LPCTSTR _atltmpPchNil = (LPCTSTR)(((BYTE*)&rgInitData) + sizeof(CStringData)); + + +class CString +{ +public: +// Constructors + CString() + { + Init(); + } + + CString(const CString& stringSrc) + { + ATLASSERT(stringSrc.GetData()->nRefs != 0); + if (stringSrc.GetData()->nRefs >= 0) + { + ATLASSERT(stringSrc.GetData() != _atltmpDataNil); + m_pchData = stringSrc.m_pchData; + InterlockedIncrement(&GetData()->nRefs); + } + else + { + Init(); + *this = stringSrc.m_pchData; + } + } + + CString(TCHAR ch, int nRepeat = 1) + { + ATLASSERT(!_istlead(ch)); // can't create a lead byte string + Init(); + if (nRepeat >= 1) + { + if(AllocBuffer(nRepeat)) + { +#ifdef _UNICODE + for (int i = 0; i < nRepeat; i++) + m_pchData[i] = ch; +#else + memset(m_pchData, ch, nRepeat); +#endif + } + } + } + + CString(LPCTSTR lpsz) + { + Init(); + if (lpsz != NULL && HIWORD(lpsz) == NULL) + { + UINT nID = LOWORD((DWORD_PTR)lpsz); + if (!LoadString(nID)) + ATLTRACE2(atlTraceUI, 0, _T("Warning: implicit LoadString(%u) in CString failed\n"), nID); + } + else + { + int nLen = SafeStrlen(lpsz); + if (nLen != 0) + { + if(AllocBuffer(nLen)) + SecureHelper::memcpy_x(m_pchData, (nLen + 1) * sizeof(TCHAR), lpsz, nLen * sizeof(TCHAR)); + } + } + } + +#ifdef _UNICODE + CString(LPCSTR lpsz) + { + Init(); +#if defined(_WIN32_WCE) && (_ATL_VER >= 0x0800) + int nSrcLen = (lpsz != NULL) ? ATL::lstrlenA(lpsz) : 0; +#else + int nSrcLen = (lpsz != NULL) ? lstrlenA(lpsz) : 0; +#endif + if (nSrcLen != 0) + { + if(AllocBuffer(nSrcLen)) + { + _mbstowcsz(m_pchData, lpsz, nSrcLen + 1); + ReleaseBuffer(); + } + } + } +#else // !_UNICODE + CString(LPCWSTR lpsz) + { + Init(); + int nSrcLen = (lpsz != NULL) ? (int)wcslen(lpsz) : 0; + if (nSrcLen != 0) + { + if(AllocBuffer(nSrcLen * 2)) + { + _wcstombsz(m_pchData, lpsz, (nSrcLen * 2) + 1); + ReleaseBuffer(); + } + } + } +#endif // !_UNICODE + + CString(LPCTSTR lpch, int nLength) + { + Init(); + if (nLength != 0) + { + if(AllocBuffer(nLength)) + SecureHelper::memcpy_x(m_pchData, (nLength + 1) * sizeof(TCHAR), lpch, nLength * sizeof(TCHAR)); + } + } + +#ifdef _UNICODE + CString(LPCSTR lpsz, int nLength) + { + Init(); + if (nLength != 0) + { + if(AllocBuffer(nLength)) + { + int n = ::MultiByteToWideChar(CP_ACP, 0, lpsz, nLength, m_pchData, nLength + 1); + ReleaseBuffer((n >= 0) ? n : -1); + } + } + } +#else // !_UNICODE + CString(LPCWSTR lpsz, int nLength) + { + Init(); + if (nLength != 0) + { + if(((nLength * 2) > nLength) && AllocBuffer(nLength * 2)) + { + int n = ::WideCharToMultiByte(CP_ACP, 0, lpsz, nLength, m_pchData, (nLength * 2) + 1, NULL, NULL); + ReleaseBuffer((n >= 0) ? n : -1); + } + } + } +#endif // !_UNICODE + + CString(const unsigned char* lpsz) + { + Init(); + *this = (LPCSTR)lpsz; + } + +// Attributes & Operations + int GetLength() const // as an array of characters + { + return GetData()->nDataLength; + } + + BOOL IsEmpty() const + { + return GetData()->nDataLength == 0; + } + + void Empty() // free up the data + { + if (GetData()->nDataLength == 0) + return; + + if (GetData()->nRefs >= 0) + Release(); + else + *this = _T(""); + + ATLASSERT(GetData()->nDataLength == 0); + ATLASSERT(GetData()->nRefs < 0 || GetData()->nAllocLength == 0); + } + + TCHAR GetAt(int nIndex) const // 0 based + { + ATLASSERT(nIndex >= 0); + ATLASSERT(nIndex < GetData()->nDataLength); + return m_pchData[nIndex]; + } + + TCHAR operator [](int nIndex) const // same as GetAt + { + // same as GetAt + ATLASSERT(nIndex >= 0); + ATLASSERT(nIndex < GetData()->nDataLength); + return m_pchData[nIndex]; + } + + void SetAt(int nIndex, TCHAR ch) + { + ATLASSERT(nIndex >= 0); + ATLASSERT(nIndex < GetData()->nDataLength); + + CopyBeforeWrite(); + m_pchData[nIndex] = ch; + } + + operator LPCTSTR() const // as a C string + { + return m_pchData; + } + + // overloaded assignment + CString& operator =(const CString& stringSrc) + { + if (m_pchData != stringSrc.m_pchData) + { + if ((GetData()->nRefs < 0 && GetData() != _atltmpDataNil) || stringSrc.GetData()->nRefs < 0) + { + // actual copy necessary since one of the strings is locked + AssignCopy(stringSrc.GetData()->nDataLength, stringSrc.m_pchData); + } + else + { + // can just copy references around + Release(); + ATLASSERT(stringSrc.GetData() != _atltmpDataNil); + m_pchData = stringSrc.m_pchData; + InterlockedIncrement(&GetData()->nRefs); + } + } + return *this; + } + + CString& operator =(TCHAR ch) + { + ATLASSERT(!_istlead(ch)); // can't set single lead byte + AssignCopy(1, &ch); + return *this; + } + +#ifdef _UNICODE + CString& operator =(char ch) + { + *this = (TCHAR)ch; + return *this; + } +#endif + + CString& operator =(LPCTSTR lpsz) + { + ATLASSERT(lpsz == NULL || _IsValidString(lpsz)); + AssignCopy(SafeStrlen(lpsz), lpsz); + return *this; + } + +#ifdef _UNICODE + CString& operator =(LPCSTR lpsz) + { +#if defined(_WIN32_WCE) && (_ATL_VER >= 0x0800) + int nSrcLen = (lpsz != NULL) ? ATL::lstrlenA(lpsz) : 0; +#else + int nSrcLen = (lpsz != NULL) ? lstrlenA(lpsz) : 0; +#endif + if(AllocBeforeWrite(nSrcLen)) + { + _mbstowcsz(m_pchData, lpsz, nSrcLen + 1); + ReleaseBuffer(); + } + return *this; + } +#else // !_UNICODE + CString& operator =(LPCWSTR lpsz) + { + int nSrcLen = (lpsz != NULL) ? (int)wcslen(lpsz) : 0; + if(AllocBeforeWrite(nSrcLen * 2)) + { + _wcstombsz(m_pchData, lpsz, (nSrcLen * 2) + 1); + ReleaseBuffer(); + } + return *this; + } +#endif // !_UNICODE + + CString& operator =(const unsigned char* lpsz) + { + *this = (LPCSTR)lpsz; + return *this; + } + + // string concatenation + CString& operator +=(const CString& string) + { + ConcatInPlace(string.GetData()->nDataLength, string.m_pchData); + return *this; + } + + CString& operator +=(TCHAR ch) + { + ConcatInPlace(1, &ch); + return *this; + } + +#ifdef _UNICODE + CString& operator +=(char ch) + { + *this += (TCHAR)ch; + return *this; + } +#endif + + CString& operator +=(LPCTSTR lpsz) + { + ATLASSERT(lpsz == NULL || _IsValidString(lpsz)); + ConcatInPlace(SafeStrlen(lpsz), lpsz); + return *this; + } + + friend CString __stdcall operator +(const CString& string1, const CString& string2); + friend CString __stdcall operator +(const CString& string, TCHAR ch); + friend CString __stdcall operator +(TCHAR ch, const CString& string); +#ifdef _UNICODE + friend CString __stdcall operator +(const CString& string, char ch); + friend CString __stdcall operator +(char ch, const CString& string); +#endif + friend CString __stdcall operator +(const CString& string, LPCTSTR lpsz); + friend CString __stdcall operator +(LPCTSTR lpsz, const CString& string); + + // string comparison + int Compare(LPCTSTR lpsz) const // straight character (MBCS/Unicode aware) + { + return _cstrcmp(m_pchData, lpsz); + } + + int CompareNoCase(LPCTSTR lpsz) const // ignore case (MBCS/Unicode aware) + { + return _cstrcmpi(m_pchData, lpsz); + } + +#ifndef _WIN32_WCE + // CString::Collate is often slower than Compare but is MBSC/Unicode + // aware as well as locale-sensitive with respect to sort order. + int Collate(LPCTSTR lpsz) const // NLS aware + { + return _cstrcoll(m_pchData, lpsz); + } + + int CollateNoCase(LPCTSTR lpsz) const // ignore case + { + return _cstrcolli(m_pchData, lpsz); + } +#endif // !_WIN32_WCE + + // simple sub-string extraction + CString Mid(int nFirst, int nCount) const + { + // out-of-bounds requests return sensible things + if (nFirst < 0) + nFirst = 0; + if (nCount < 0) + nCount = 0; + + if (nFirst + nCount > GetData()->nDataLength) + nCount = GetData()->nDataLength - nFirst; + if (nFirst > GetData()->nDataLength) + nCount = 0; + + CString dest; + AllocCopy(dest, nCount, nFirst, 0); + return dest; + } + + CString Mid(int nFirst) const + { + return Mid(nFirst, GetData()->nDataLength - nFirst); + } + + CString Left(int nCount) const + { + if (nCount < 0) + nCount = 0; + else if (nCount > GetData()->nDataLength) + nCount = GetData()->nDataLength; + + CString dest; + AllocCopy(dest, nCount, 0, 0); + return dest; + } + + CString Right(int nCount) const + { + if (nCount < 0) + nCount = 0; + else if (nCount > GetData()->nDataLength) + nCount = GetData()->nDataLength; + + CString dest; + AllocCopy(dest, nCount, GetData()->nDataLength-nCount, 0); + return dest; + } + + CString SpanIncluding(LPCTSTR lpszCharSet) const // strspn equivalent + { + ATLASSERT(_IsValidString(lpszCharSet)); + return Left(_cstrspn(m_pchData, lpszCharSet)); + } + + CString SpanExcluding(LPCTSTR lpszCharSet) const // strcspn equivalent + { + ATLASSERT(_IsValidString(lpszCharSet)); + return Left(_cstrcspn(m_pchData, lpszCharSet)); + } + + // upper/lower/reverse conversion + void MakeUpper() + { + CopyBeforeWrite(); + CharUpper(m_pchData); + } + + void MakeLower() + { + CopyBeforeWrite(); + CharLower(m_pchData); + } + + void MakeReverse() + { + CopyBeforeWrite(); + _cstrrev(m_pchData); + } + + // trimming whitespace (either side) + void TrimRight() + { + CopyBeforeWrite(); + + // find beginning of trailing spaces by starting at beginning (DBCS aware) + LPTSTR lpsz = m_pchData; + LPTSTR lpszLast = NULL; + while (*lpsz != _T('\0')) + { + if (_cstrisspace(*lpsz)) + { + if (lpszLast == NULL) + lpszLast = lpsz; + } + else + { + lpszLast = NULL; + } + lpsz = ::CharNext(lpsz); + } + + if (lpszLast != NULL) + { + // truncate at trailing space start + *lpszLast = _T('\0'); + GetData()->nDataLength = (int)(DWORD_PTR)(lpszLast - m_pchData); + } + } + + void TrimLeft() + { + CopyBeforeWrite(); + + // find first non-space character + LPCTSTR lpsz = m_pchData; + while (_cstrisspace(*lpsz)) + lpsz = ::CharNext(lpsz); + + // fix up data and length + int nDataLength = GetData()->nDataLength - (int)(DWORD_PTR)(lpsz - m_pchData); + SecureHelper::memmove_x(m_pchData, (GetData()->nAllocLength + 1) * sizeof(TCHAR), lpsz, (nDataLength + 1) * sizeof(TCHAR)); + GetData()->nDataLength = nDataLength; + } + + // remove continuous occurrences of chTarget starting from right + void TrimRight(TCHAR chTarget) + { + // find beginning of trailing matches + // by starting at beginning (DBCS aware) + + CopyBeforeWrite(); + LPTSTR lpsz = m_pchData; + LPTSTR lpszLast = NULL; + + while (*lpsz != _T('\0')) + { + if (*lpsz == chTarget) + { + if (lpszLast == NULL) + lpszLast = lpsz; + } + else + lpszLast = NULL; + lpsz = ::CharNext(lpsz); + } + + if (lpszLast != NULL) + { + // truncate at left-most matching character + *lpszLast = _T('\0'); + GetData()->nDataLength = (int)(DWORD_PTR)(lpszLast - m_pchData); + } + } + + // remove continuous occcurrences of characters in passed string, starting from right + void TrimRight(LPCTSTR lpszTargetList) + { + // find beginning of trailing matches by starting at beginning (DBCS aware) + + CopyBeforeWrite(); + LPTSTR lpsz = m_pchData; + LPTSTR lpszLast = NULL; + + while (*lpsz != _T('\0')) + { + TCHAR* pNext = ::CharNext(lpsz); + if(pNext > lpsz + 1) + { + if (_cstrchr_db(lpszTargetList, *lpsz, *(lpsz + 1)) != NULL) + { + if (lpszLast == NULL) + lpszLast = lpsz; + } + else + { + lpszLast = NULL; + } + } + else + { + if (_cstrchr(lpszTargetList, *lpsz) != NULL) + { + if (lpszLast == NULL) + lpszLast = lpsz; + } + else + { + lpszLast = NULL; + } + } + + lpsz = pNext; + } + + if (lpszLast != NULL) + { + // truncate at left-most matching character + *lpszLast = _T('\0'); + GetData()->nDataLength = (int)(DWORD_PTR)(lpszLast - m_pchData); + } + } + + // remove continuous occurrences of chTarget starting from left + void TrimLeft(TCHAR chTarget) + { + // find first non-matching character + + CopyBeforeWrite(); + LPCTSTR lpsz = m_pchData; + + while (chTarget == *lpsz) + lpsz = ::CharNext(lpsz); + + if (lpsz != m_pchData) + { + // fix up data and length + int nDataLength = GetData()->nDataLength - (int)(DWORD_PTR)(lpsz - m_pchData); + SecureHelper::memmove_x(m_pchData, (GetData()->nAllocLength + 1) * sizeof(TCHAR), lpsz, (nDataLength + 1) * sizeof(TCHAR)); + GetData()->nDataLength = nDataLength; + } + } + + // remove continuous occcurrences of characters in passed string, starting from left + void TrimLeft(LPCTSTR lpszTargets) + { + // if we're not trimming anything, we're not doing any work + if (SafeStrlen(lpszTargets) == 0) + return; + + CopyBeforeWrite(); + LPCTSTR lpsz = m_pchData; + + while (*lpsz != _T('\0')) + { + TCHAR* pNext = ::CharNext(lpsz); + if(pNext > lpsz + 1) + { + if (_cstrchr_db(lpszTargets, *lpsz, *(lpsz + 1)) == NULL) + break; + } + else + { + if (_cstrchr(lpszTargets, *lpsz) == NULL) + break; + } + lpsz = pNext; + } + + if (lpsz != m_pchData) + { + // fix up data and length + int nDataLength = GetData()->nDataLength - (int)(DWORD_PTR)(lpsz - m_pchData); + SecureHelper::memmove_x(m_pchData, (GetData()->nAllocLength + 1) * sizeof(TCHAR), lpsz, (nDataLength + 1) * sizeof(TCHAR)); + GetData()->nDataLength = nDataLength; + } + } + + // advanced manipulation + // replace occurrences of chOld with chNew + int Replace(TCHAR chOld, TCHAR chNew) + { + int nCount = 0; + + // short-circuit the nop case + if (chOld != chNew) + { + // otherwise modify each character that matches in the string + CopyBeforeWrite(); + LPTSTR psz = m_pchData; + LPTSTR pszEnd = psz + GetData()->nDataLength; + while (psz < pszEnd) + { + // replace instances of the specified character only + if (*psz == chOld) + { + *psz = chNew; + nCount++; + } + psz = ::CharNext(psz); + } + } + return nCount; + } + + // replace occurrences of substring lpszOld with lpszNew; + // empty lpszNew removes instances of lpszOld + int Replace(LPCTSTR lpszOld, LPCTSTR lpszNew) + { + // can't have empty or NULL lpszOld + + int nSourceLen = SafeStrlen(lpszOld); + if (nSourceLen == 0) + return 0; + int nReplacementLen = SafeStrlen(lpszNew); + + // loop once to figure out the size of the result string + int nCount = 0; + LPTSTR lpszStart = m_pchData; + LPTSTR lpszEnd = m_pchData + GetData()->nDataLength; + LPTSTR lpszTarget = NULL; + while (lpszStart < lpszEnd) + { + while ((lpszTarget = (TCHAR*)_cstrstr(lpszStart, lpszOld)) != NULL) + { + nCount++; + lpszStart = lpszTarget + nSourceLen; + } + lpszStart += lstrlen(lpszStart) + 1; + } + + // if any changes were made, make them + if (nCount > 0) + { + CopyBeforeWrite(); + + // if the buffer is too small, just allocate a new buffer (slow but sure) + int nOldLength = GetData()->nDataLength; + int nNewLength = nOldLength + (nReplacementLen - nSourceLen) * nCount; + if (GetData()->nAllocLength < nNewLength || GetData()->nRefs > 1) + { + CStringData* pOldData = GetData(); + LPTSTR pstr = m_pchData; + if(!AllocBuffer(nNewLength)) + return -1; + SecureHelper::memcpy_x(m_pchData, (nNewLength + 1) * sizeof(TCHAR), pstr, pOldData->nDataLength * sizeof(TCHAR)); + CString::Release(pOldData); + } + // else, we just do it in-place + lpszStart = m_pchData; + lpszEnd = m_pchData + GetData()->nDataLength; + + // loop again to actually do the work + while (lpszStart < lpszEnd) + { + while ((lpszTarget = (TCHAR*)_cstrstr(lpszStart, lpszOld)) != NULL) + { + int nBalance = nOldLength - ((int)(DWORD_PTR)(lpszTarget - m_pchData) + nSourceLen); + int cchBuffLen = GetData()->nAllocLength - (int)(DWORD_PTR)(lpszTarget - m_pchData); + SecureHelper::memmove_x(lpszTarget + nReplacementLen, (cchBuffLen - nReplacementLen + 1) * sizeof(TCHAR), lpszTarget + nSourceLen, nBalance * sizeof(TCHAR)); + SecureHelper::memcpy_x(lpszTarget, (cchBuffLen + 1) * sizeof(TCHAR), lpszNew, nReplacementLen * sizeof(TCHAR)); + lpszStart = lpszTarget + nReplacementLen; + lpszStart[nBalance] = _T('\0'); + nOldLength += (nReplacementLen - nSourceLen); + } + lpszStart += lstrlen(lpszStart) + 1; + } + ATLASSERT(m_pchData[nNewLength] == _T('\0')); + GetData()->nDataLength = nNewLength; + } + + return nCount; + } + + // remove occurrences of chRemove + int Remove(TCHAR chRemove) + { + CopyBeforeWrite(); + + LPTSTR pstrSource = m_pchData; + LPTSTR pstrDest = m_pchData; + LPTSTR pstrEnd = m_pchData + GetData()->nDataLength; + + while (pstrSource < pstrEnd) + { + if (*pstrSource != chRemove) + { + *pstrDest = *pstrSource; + pstrDest = ::CharNext(pstrDest); + } + pstrSource = ::CharNext(pstrSource); + } + *pstrDest = _T('\0'); + int nCount = (int)(DWORD_PTR)(pstrSource - pstrDest); + GetData()->nDataLength -= nCount; + + return nCount; + } + + // insert character at zero-based index; concatenates if index is past end of string + int Insert(int nIndex, TCHAR ch) + { + CopyBeforeWrite(); + + if (nIndex < 0) + nIndex = 0; + + int nNewLength = GetData()->nDataLength; + if (nIndex > nNewLength) + nIndex = nNewLength; + nNewLength++; + + if (GetData()->nAllocLength < nNewLength) + { + CStringData* pOldData = GetData(); + LPTSTR pstr = m_pchData; + if(!AllocBuffer(nNewLength)) + return -1; + SecureHelper::memcpy_x(m_pchData, (nNewLength + 1) * sizeof(TCHAR), pstr, (pOldData->nDataLength + 1) * sizeof(TCHAR)); + CString::Release(pOldData); + } + + // move existing bytes down + SecureHelper::memmove_x(m_pchData + nIndex + 1, (GetData()->nAllocLength - nIndex) * sizeof(TCHAR), m_pchData + nIndex, (nNewLength - nIndex) * sizeof(TCHAR)); + m_pchData[nIndex] = ch; + GetData()->nDataLength = nNewLength; + + return nNewLength; + } + + // insert substring at zero-based index; concatenates if index is past end of string + int Insert(int nIndex, LPCTSTR pstr) + { + if (nIndex < 0) + nIndex = 0; + + int nInsertLength = SafeStrlen(pstr); + int nNewLength = GetData()->nDataLength; + if (nInsertLength > 0) + { + CopyBeforeWrite(); + if (nIndex > nNewLength) + nIndex = nNewLength; + nNewLength += nInsertLength; + + if (GetData()->nAllocLength < nNewLength) + { + CStringData* pOldData = GetData(); + LPTSTR pstr = m_pchData; + if(!AllocBuffer(nNewLength)) + return -1; + SecureHelper::memcpy_x(m_pchData, (nNewLength + 1) * sizeof(TCHAR), pstr, (pOldData->nDataLength + 1) * sizeof(TCHAR)); + CString::Release(pOldData); + } + + // move existing bytes down + SecureHelper::memmove_x(m_pchData + nIndex + nInsertLength, (GetData()->nAllocLength + 1 - nIndex - nInsertLength) * sizeof(TCHAR), m_pchData + nIndex, (nNewLength - nIndex - nInsertLength + 1) * sizeof(TCHAR)); + SecureHelper::memcpy_x(m_pchData + nIndex, (GetData()->nAllocLength + 1 - nIndex) * sizeof(TCHAR), pstr, nInsertLength * sizeof(TCHAR)); + GetData()->nDataLength = nNewLength; + } + + return nNewLength; + } + + // delete nCount characters starting at zero-based index + int Delete(int nIndex, int nCount = 1) + { + if (nIndex < 0) + nIndex = 0; + int nLength = GetData()->nDataLength; + if (nCount > 0 && nIndex < nLength) + { + if((nIndex + nCount) > nLength) + nCount = nLength - nIndex; + CopyBeforeWrite(); + int nBytesToCopy = nLength - (nIndex + nCount) + 1; + + SecureHelper::memmove_x(m_pchData + nIndex, (GetData()->nAllocLength + 1 - nIndex) * sizeof(TCHAR), m_pchData + nIndex + nCount, nBytesToCopy * sizeof(TCHAR)); + nLength -= nCount; + GetData()->nDataLength = nLength; + } + + return nLength; + } + + // searching (return starting index, or -1 if not found) + // look for a single character match + int Find(TCHAR ch) const // like "C" strchr + { + return Find(ch, 0); + } + + int ReverseFind(TCHAR ch) const + { + // find last single character + LPCTSTR lpsz = _cstrrchr(m_pchData, (_TUCHAR)ch); + + // return -1 if not found, distance from beginning otherwise + return (lpsz == NULL) ? -1 : (int)(lpsz - m_pchData); + } + + int Find(TCHAR ch, int nStart) const // starting at index + { + int nLength = GetData()->nDataLength; + if (nStart < 0 || nStart >= nLength) + return -1; + + // find first single character + LPCTSTR lpsz = _cstrchr(m_pchData + nStart, (_TUCHAR)ch); + + // return -1 if not found and index otherwise + return (lpsz == NULL) ? -1 : (int)(lpsz - m_pchData); + } + + int FindOneOf(LPCTSTR lpszCharSet) const + { + ATLASSERT(_IsValidString(lpszCharSet)); + LPCTSTR lpsz = _cstrpbrk(m_pchData, lpszCharSet); + return (lpsz == NULL) ? -1 : (int)(lpsz - m_pchData); + } + + // look for a specific sub-string + // find a sub-string (like strstr) + int Find(LPCTSTR lpszSub) const // like "C" strstr + { + return Find(lpszSub, 0); + } + + int Find(LPCTSTR lpszSub, int nStart) const // starting at index + { + ATLASSERT(_IsValidString(lpszSub)); + + int nLength = GetData()->nDataLength; + if (nStart < 0 || nStart > nLength) + return -1; + + // find first matching substring + LPCTSTR lpsz = _cstrstr(m_pchData + nStart, lpszSub); + + // return -1 for not found, distance from beginning otherwise + return (lpsz == NULL) ? -1 : (int)(lpsz - m_pchData); + } + + // Concatentation for non strings + CString& Append(int n) + { + const int cchBuff = 12; + TCHAR szBuffer[cchBuff] = { 0 }; + SecureHelper::wsprintf_x(szBuffer, cchBuff, _T("%d"), n); + ConcatInPlace(SafeStrlen(szBuffer), szBuffer); + return *this; + } + + // simple formatting + // formatting (using wsprintf style formatting) + BOOL __cdecl Format(LPCTSTR lpszFormat, ...) + { + ATLASSERT(_IsValidString(lpszFormat)); + + va_list argList; + va_start(argList, lpszFormat); + BOOL bRet = FormatV(lpszFormat, argList); + va_end(argList); + return bRet; + } + + BOOL __cdecl Format(UINT nFormatID, ...) + { + CString strFormat; + BOOL bRet = strFormat.LoadString(nFormatID); + ATLASSERT(bRet != 0); + + va_list argList; + va_start(argList, nFormatID); + bRet = FormatV(strFormat, argList); + va_end(argList); + return bRet; + } + + BOOL FormatV(LPCTSTR lpszFormat, va_list argList) + { + ATLASSERT(_IsValidString(lpszFormat)); + + enum _FormatModifiers + { + FORCE_ANSI = 0x10000, + FORCE_UNICODE = 0x20000, + FORCE_INT64 = 0x40000 + }; + + va_list argListSave = argList; + + // make a guess at the maximum length of the resulting string + int nMaxLen = 0; + for (LPCTSTR lpsz = lpszFormat; *lpsz != _T('\0'); lpsz = ::CharNext(lpsz)) + { + // handle '%' character, but watch out for '%%' + if (*lpsz != _T('%') || *(lpsz = ::CharNext(lpsz)) == _T('%')) + { + nMaxLen += (int)(::CharNext(lpsz) - lpsz); + continue; + } + + int nItemLen = 0; + + // handle '%' character with format + int nWidth = 0; + for (; *lpsz != _T('\0'); lpsz = ::CharNext(lpsz)) + { + // check for valid flags + if (*lpsz == _T('#')) + nMaxLen += 2; // for '0x' + else if (*lpsz == _T('*')) + nWidth = va_arg(argList, int); + else if (*lpsz == _T('-') || *lpsz == _T('+') || *lpsz == _T('0') || *lpsz == _T(' ')) + ; + else // hit non-flag character + break; + } + // get width and skip it + if (nWidth == 0) + { + // width indicated by + nWidth = _cstrtoi(lpsz); + for (; *lpsz != _T('\0') && _cstrisdigit(*lpsz); lpsz = ::CharNext(lpsz)) + ; + } + ATLASSERT(nWidth >= 0); + + int nPrecision = 0; + if (*lpsz == _T('.')) + { + // skip past '.' separator (width.precision) + lpsz = ::CharNext(lpsz); + + // get precision and skip it + if (*lpsz == _T('*')) + { + nPrecision = va_arg(argList, int); + lpsz = ::CharNext(lpsz); + } + else + { + nPrecision = _cstrtoi(lpsz); + for (; *lpsz != _T('\0') && _cstrisdigit(*lpsz); lpsz = ::CharNext(lpsz)) + ; + } + ATLASSERT(nPrecision >= 0); + } + + // should be on type modifier or specifier + int nModifier = 0; + if(lpsz[0] == _T('I') && lpsz[1] == _T('6') && lpsz[2] == _T('4')) + { + lpsz += 3; + nModifier = FORCE_INT64; + } + else + { + switch (*lpsz) + { + // modifiers that affect size + case _T('h'): + nModifier = FORCE_ANSI; + lpsz = ::CharNext(lpsz); + break; + case _T('l'): + nModifier = FORCE_UNICODE; + lpsz = ::CharNext(lpsz); + break; + + // modifiers that do not affect size + case _T('F'): + case _T('N'): + case _T('L'): + lpsz = ::CharNext(lpsz); + break; + } + } + + // now should be on specifier + switch (*lpsz | nModifier) + { + // single characters + case _T('c'): + case _T('C'): + nItemLen = 2; + va_arg(argList, TCHAR); + break; + case _T('c') | FORCE_ANSI: + case _T('C') | FORCE_ANSI: + nItemLen = 2; + va_arg(argList, char); + break; + case _T('c') | FORCE_UNICODE: + case _T('C') | FORCE_UNICODE: + nItemLen = 2; + va_arg(argList, WCHAR); + break; + + // strings + case _T('s'): + { + LPCTSTR pstrNextArg = va_arg(argList, LPCTSTR); + if (pstrNextArg == NULL) + { + nItemLen = 6; // "(null)" + } + else + { + nItemLen = lstrlen(pstrNextArg); + nItemLen = max(1, nItemLen); + } + break; + } + + case _T('S'): + { +#ifndef _UNICODE + LPWSTR pstrNextArg = va_arg(argList, LPWSTR); + if (pstrNextArg == NULL) + { + nItemLen = 6; // "(null)" + } + else + { + nItemLen = (int)wcslen(pstrNextArg); + nItemLen = max(1, nItemLen); + } +#else // _UNICODE + LPCSTR pstrNextArg = va_arg(argList, LPCSTR); + if (pstrNextArg == NULL) + { + nItemLen = 6; // "(null)" + } + else + { +#if defined(_WIN32_WCE) && (_ATL_VER >= 0x0800) + nItemLen = ATL::lstrlenA(pstrNextArg); +#else + nItemLen = lstrlenA(pstrNextArg); +#endif + nItemLen = max(1, nItemLen); + } +#endif // _UNICODE + break; + } + + case _T('s') | FORCE_ANSI: + case _T('S') | FORCE_ANSI: + { + LPCSTR pstrNextArg = va_arg(argList, LPCSTR); + if (pstrNextArg == NULL) + { + nItemLen = 6; // "(null)" + } + else + { +#if defined(_WIN32_WCE) && (_ATL_VER >= 0x0800) + nItemLen = ATL::lstrlenA(pstrNextArg); +#else + nItemLen = lstrlenA(pstrNextArg); +#endif + nItemLen = max(1, nItemLen); + } + break; + } + + case _T('s') | FORCE_UNICODE: + case _T('S') | FORCE_UNICODE: + { + LPWSTR pstrNextArg = va_arg(argList, LPWSTR); + if (pstrNextArg == NULL) + { + nItemLen = 6; // "(null)" + } + else + { + nItemLen = (int)wcslen(pstrNextArg); + nItemLen = max(1, nItemLen); + } + break; + } + } + + // adjust nItemLen for strings + if (nItemLen != 0) + { + nItemLen = max(nItemLen, nWidth); + if (nPrecision != 0) + nItemLen = min(nItemLen, nPrecision); + } + else + { + switch (*lpsz) + { + // integers + case _T('d'): + case _T('i'): + case _T('u'): + case _T('x'): + case _T('X'): + case _T('o'): + if (nModifier & FORCE_INT64) + va_arg(argList, __int64); + else + va_arg(argList, int); + nItemLen = 32; + nItemLen = max(nItemLen, nWidth + nPrecision); + break; + +#ifndef _ATL_USE_CSTRING_FLOAT + case _T('e'): + case _T('E'): + case _T('f'): + case _T('g'): + case _T('G'): + ATLASSERT(!"Floating point (%%e, %%E, %%f, %%g, and %%G) is not supported by the WTL::CString class."); +#ifndef _DEBUG + ::OutputDebugString(_T("Floating point (%%e, %%f, %%g, and %%G) is not supported by the WTL::CString class.")); +#ifndef _WIN32_WCE + ::DebugBreak(); +#else // CE specific + DebugBreak(); +#endif // _WIN32_WCE +#endif // !_DEBUG + break; +#else // _ATL_USE_CSTRING_FLOAT + case _T('e'): + case _T('E'): + case _T('g'): + case _T('G'): + va_arg(argList, double); + nItemLen = 128; + nItemLen = max(nItemLen, nWidth + nPrecision); + break; + case _T('f'): + { + double f = va_arg(argList, double); + // 312 == strlen("-1+(309 zeroes).") + // 309 zeroes == max precision of a double + // 6 == adjustment in case precision is not specified, + // which means that the precision defaults to 6 + int cchLen = max(nWidth, 312 + nPrecision + 6); + CTempBuffer buff; + LPTSTR pszTemp = buff.Allocate(cchLen); + if(pszTemp != NULL) + { + SecureHelper::sprintf_x(pszTemp, cchLen, _T("%*.*f"), nWidth, nPrecision + 6, f); + nItemLen = (int)_tcslen(pszTemp); + } + else + { + nItemLen = cchLen; + } + } + break; +#endif // _ATL_USE_CSTRING_FLOAT + + case _T('p'): + va_arg(argList, void*); + nItemLen = 32; + nItemLen = max(nItemLen, nWidth + nPrecision); + break; + + // no output + case _T('n'): + va_arg(argList, int*); + break; + + default: + ATLASSERT(FALSE); // unknown formatting option + } + } + + // adjust nMaxLen for output nItemLen + nMaxLen += nItemLen; + } + + if(GetBuffer(nMaxLen) == NULL) + return FALSE; +#ifndef _ATL_USE_CSTRING_FLOAT + int nRet = SecureHelper::wvsprintf_x(m_pchData, GetAllocLength() + 1, lpszFormat, argListSave); +#else // _ATL_USE_CSTRING_FLOAT + int nRet = SecureHelper::vsprintf_x(m_pchData, GetAllocLength() + 1, lpszFormat, argListSave); +#endif // _ATL_USE_CSTRING_FLOAT + nRet; // ref + ATLASSERT(nRet <= GetAllocLength()); + ReleaseBuffer(); + + va_end(argListSave); + return TRUE; + } + + // formatting for localization (uses FormatMessage API) + // formatting (using FormatMessage style formatting) + BOOL __cdecl FormatMessage(LPCTSTR lpszFormat, ...) + { + // format message into temporary buffer lpszTemp + va_list argList; + va_start(argList, lpszFormat); + LPTSTR lpszTemp; + BOOL bRet = TRUE; + + if (::FormatMessage(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ALLOCATE_BUFFER, + lpszFormat, 0, 0, (LPTSTR)&lpszTemp, 0, &argList) == 0 || lpszTemp == NULL) + bRet = FALSE; + + // assign lpszTemp into the resulting string and free the temporary + *this = lpszTemp; + LocalFree(lpszTemp); + va_end(argList); + return bRet; + } + + BOOL __cdecl FormatMessage(UINT nFormatID, ...) + { + // get format string from string table + CString strFormat; + BOOL bRetTmp = strFormat.LoadString(nFormatID); + bRetTmp; // ref + ATLASSERT(bRetTmp != 0); + + // format message into temporary buffer lpszTemp + va_list argList; + va_start(argList, nFormatID); + LPTSTR lpszTemp; + BOOL bRet = TRUE; + + if (::FormatMessage(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ALLOCATE_BUFFER, + strFormat, 0, 0, (LPTSTR)&lpszTemp, 0, &argList) == 0 || lpszTemp == NULL) + bRet = FALSE; + + // assign lpszTemp into the resulting string and free lpszTemp + *this = lpszTemp; + LocalFree(lpszTemp); + va_end(argList); + return bRet; + } + + // Windows support + BOOL LoadString(UINT nID) // load from string resource (255 chars max.) + { +#ifdef _UNICODE + const int CHAR_FUDGE = 1; // one TCHAR unused is good enough +#else + const int CHAR_FUDGE = 2; // two BYTES unused for case of DBC last char +#endif + + // try fixed buffer first (to avoid wasting space in the heap) + TCHAR szTemp[256]; + int nCount = sizeof(szTemp) / sizeof(szTemp[0]); + int nLen = _LoadString(nID, szTemp, nCount); + if (nCount - nLen > CHAR_FUDGE) + { + *this = szTemp; + return (nLen > 0); + } + + // try buffer size of 512, then larger size until entire string is retrieved + int nSize = 256; + do + { + nSize += 256; + LPTSTR lpstr = GetBuffer(nSize - 1); + if(lpstr == NULL) + { + nLen = 0; + break; + } + nLen = _LoadString(nID, lpstr, nSize); + } while (nSize - nLen <= CHAR_FUDGE); + ReleaseBuffer(); + + return (nLen > 0); + } + +#ifndef _UNICODE + // ANSI <-> OEM support (convert string in place) + void AnsiToOem() + { + CopyBeforeWrite(); + ::AnsiToOem(m_pchData, m_pchData); + } + + void OemToAnsi() + { + CopyBeforeWrite(); + ::OemToAnsi(m_pchData, m_pchData); + } +#endif + +#ifndef _ATL_NO_COM + // OLE BSTR support (use for OLE automation) + BSTR AllocSysString() const + { +#if defined(_UNICODE) || defined(OLE2ANSI) + BSTR bstr = ::SysAllocStringLen(m_pchData, GetData()->nDataLength); +#else + int nLen = MultiByteToWideChar(CP_ACP, 0, m_pchData, + GetData()->nDataLength, NULL, NULL); + BSTR bstr = ::SysAllocStringLen(NULL, nLen); + if(bstr != NULL) + MultiByteToWideChar(CP_ACP, 0, m_pchData, GetData()->nDataLength, bstr, nLen); +#endif + return bstr; + } + + BSTR SetSysString(BSTR* pbstr) const + { +#if defined(_UNICODE) || defined(OLE2ANSI) + ::SysReAllocStringLen(pbstr, m_pchData, GetData()->nDataLength); +#else + int nLen = MultiByteToWideChar(CP_ACP, 0, m_pchData, + GetData()->nDataLength, NULL, NULL); + if(::SysReAllocStringLen(pbstr, NULL, nLen)) + MultiByteToWideChar(CP_ACP, 0, m_pchData, GetData()->nDataLength, *pbstr, nLen); +#endif + ATLASSERT(*pbstr != NULL); + return *pbstr; + } +#endif // !_ATL_NO_COM + + // Access to string implementation buffer as "C" character array + LPTSTR GetBuffer(int nMinBufLength) + { + ATLASSERT(nMinBufLength >= 0); + + if (GetData()->nRefs > 1 || nMinBufLength > GetData()->nAllocLength) + { + // we have to grow the buffer + CStringData* pOldData = GetData(); + int nOldLen = GetData()->nDataLength; // AllocBuffer will tromp it + if (nMinBufLength < nOldLen) + nMinBufLength = nOldLen; + + if(!AllocBuffer(nMinBufLength)) + return NULL; + + SecureHelper::memcpy_x(m_pchData, (nMinBufLength + 1) * sizeof(TCHAR), pOldData->data(), (nOldLen + 1) * sizeof(TCHAR)); + GetData()->nDataLength = nOldLen; + CString::Release(pOldData); + } + ATLASSERT(GetData()->nRefs <= 1); + + // return a pointer to the character storage for this string + ATLASSERT(m_pchData != NULL); + return m_pchData; + } + + void ReleaseBuffer(int nNewLength = -1) + { + CopyBeforeWrite(); // just in case GetBuffer was not called + + if (nNewLength == -1) + nNewLength = lstrlen(m_pchData); // zero terminated + + ATLASSERT(nNewLength <= GetData()->nAllocLength); + GetData()->nDataLength = nNewLength; + m_pchData[nNewLength] = _T('\0'); + } + + LPTSTR GetBufferSetLength(int nNewLength) + { + ATLASSERT(nNewLength >= 0); + + if(GetBuffer(nNewLength) == NULL) + return NULL; + + GetData()->nDataLength = nNewLength; + m_pchData[nNewLength] = _T('\0'); + return m_pchData; + } + + void FreeExtra() + { + ATLASSERT(GetData()->nDataLength <= GetData()->nAllocLength); + if (GetData()->nDataLength != GetData()->nAllocLength) + { + CStringData* pOldData = GetData(); + if(AllocBuffer(GetData()->nDataLength)) + { + SecureHelper::memcpy_x(m_pchData, (GetData()->nAllocLength + 1) * sizeof(TCHAR), pOldData->data(), pOldData->nDataLength * sizeof(TCHAR)); + ATLASSERT(m_pchData[GetData()->nDataLength] == _T('\0')); + CString::Release(pOldData); + } + } + ATLASSERT(GetData() != NULL); + } + + // Use LockBuffer/UnlockBuffer to turn refcounting off + LPTSTR LockBuffer() + { + LPTSTR lpsz = GetBuffer(0); + if(lpsz != NULL) + GetData()->nRefs = -1; + return lpsz; + } + + void UnlockBuffer() + { + ATLASSERT(GetData()->nRefs == -1); + if (GetData() != _atltmpDataNil) + GetData()->nRefs = 1; + } + +// Implementation +public: + ~CString() // free any attached data + { + if (GetData() != _atltmpDataNil) + { + if (InterlockedDecrement(&GetData()->nRefs) <= 0) + delete[] (BYTE*)GetData(); + } + } + + int GetAllocLength() const + { + return GetData()->nAllocLength; + } + + static BOOL __stdcall _IsValidString(LPCTSTR lpsz, int /*nLength*/ = -1) + { + return (lpsz != NULL) ? TRUE : FALSE; + } + +protected: + LPTSTR m_pchData; // pointer to ref counted string data + + // implementation helpers + CStringData* GetData() const + { + ATLASSERT(m_pchData != NULL); + return ((CStringData*)m_pchData) - 1; + } + + void Init() + { + m_pchData = _GetEmptyString().m_pchData; + } + + BOOL AllocCopy(CString& dest, int nCopyLen, int nCopyIndex, int nExtraLen) const + { + // will clone the data attached to this string + // allocating 'nExtraLen' characters + // Places results in uninitialized string 'dest' + // Will copy the part or all of original data to start of new string + + BOOL bRet = FALSE; + int nNewLen = nCopyLen + nExtraLen; + if (nNewLen == 0) + { + dest.Init(); + bRet = TRUE; + } + else if(nNewLen >= nCopyLen) + { + if(dest.AllocBuffer(nNewLen)) + { + SecureHelper::memcpy_x(dest.m_pchData, (nNewLen + 1) * sizeof(TCHAR), m_pchData + nCopyIndex, nCopyLen * sizeof(TCHAR)); + bRet = TRUE; + } + } + + return bRet; + } + + // always allocate one extra character for '\0' termination + // assumes [optimistically] that data length will equal allocation length + BOOL AllocBuffer(int nLen) + { + ATLASSERT(nLen >= 0); + ATLASSERT(nLen <= INT_MAX - 1); // max size (enough room for 1 extra) + + if (nLen == 0) + { + Init(); + } + else + { + CStringData* pData = NULL; + ATLTRY(pData = (CStringData*)new BYTE[sizeof(CStringData) + (nLen + 1) * sizeof(TCHAR)]); + if(pData == NULL) + return FALSE; + + pData->nRefs = 1; + pData->data()[nLen] = _T('\0'); + pData->nDataLength = nLen; + pData->nAllocLength = nLen; + m_pchData = pData->data(); + } + + return TRUE; + } + + // Assignment operators + // All assign a new value to the string + // (a) first see if the buffer is big enough + // (b) if enough room, copy on top of old buffer, set size and type + // (c) otherwise free old string data, and create a new one + // + // All routines return the new string (but as a 'const CString&' so that + // assigning it again will cause a copy, eg: s1 = s2 = "hi there". + // + void AssignCopy(int nSrcLen, LPCTSTR lpszSrcData) + { + if(AllocBeforeWrite(nSrcLen)) + { + SecureHelper::memcpy_x(m_pchData, (nSrcLen + 1) * sizeof(TCHAR), lpszSrcData, nSrcLen * sizeof(TCHAR)); + GetData()->nDataLength = nSrcLen; + m_pchData[nSrcLen] = _T('\0'); + } + } + + // Concatenation + // NOTE: "operator +" is done as friend functions for simplicity + // There are three variants: + // CString + CString + // and for ? = TCHAR, LPCTSTR + // CString + ? + // ? + CString + BOOL ConcatCopy(int nSrc1Len, LPCTSTR lpszSrc1Data, int nSrc2Len, LPCTSTR lpszSrc2Data) + { + // -- master concatenation routine + // Concatenate two sources + // -- assume that 'this' is a new CString object + + BOOL bRet = TRUE; + int nNewLen = nSrc1Len + nSrc2Len; + if(nNewLen < nSrc1Len || nNewLen < nSrc2Len) + { + bRet = FALSE; + } + else if(nNewLen != 0) + { + bRet = AllocBuffer(nNewLen); + if (bRet) + { + SecureHelper::memcpy_x(m_pchData, (nNewLen + 1) * sizeof(TCHAR), lpszSrc1Data, nSrc1Len * sizeof(TCHAR)); + SecureHelper::memcpy_x(m_pchData + nSrc1Len, (nNewLen + 1 - nSrc1Len) * sizeof(TCHAR), lpszSrc2Data, nSrc2Len * sizeof(TCHAR)); + } + } + return bRet; + } + + void ConcatInPlace(int nSrcLen, LPCTSTR lpszSrcData) + { + // -- the main routine for += operators + + // concatenating an empty string is a no-op! + if (nSrcLen == 0) + return; + + // if the buffer is too small, or we have a width mis-match, just + // allocate a new buffer (slow but sure) + if (GetData()->nRefs > 1 || GetData()->nDataLength + nSrcLen > GetData()->nAllocLength) + { + // we have to grow the buffer, use the ConcatCopy routine + CStringData* pOldData = GetData(); + if (ConcatCopy(GetData()->nDataLength, m_pchData, nSrcLen, lpszSrcData)) + { + ATLASSERT(pOldData != NULL); + CString::Release(pOldData); + } + } + else + { + // fast concatenation when buffer big enough + SecureHelper::memcpy_x(m_pchData + GetData()->nDataLength, (GetData()->nAllocLength + 1) * sizeof(TCHAR), lpszSrcData, nSrcLen * sizeof(TCHAR)); + GetData()->nDataLength += nSrcLen; + ATLASSERT(GetData()->nDataLength <= GetData()->nAllocLength); + m_pchData[GetData()->nDataLength] = _T('\0'); + } + } + + void CopyBeforeWrite() + { + if (GetData()->nRefs > 1) + { + CStringData* pData = GetData(); + Release(); + if(AllocBuffer(pData->nDataLength)) + SecureHelper::memcpy_x(m_pchData, (GetData()->nAllocLength + 1) * sizeof(TCHAR), pData->data(), (pData->nDataLength + 1) * sizeof(TCHAR)); + } + ATLASSERT(GetData()->nRefs <= 1); + } + + BOOL AllocBeforeWrite(int nLen) + { + BOOL bRet = TRUE; + if (GetData()->nRefs > 1 || nLen > GetData()->nAllocLength) + { + Release(); + bRet = AllocBuffer(nLen); + } + ATLASSERT(GetData()->nRefs <= 1); + return bRet; + } + + void Release() + { + if (GetData() != _atltmpDataNil) + { + ATLASSERT(GetData()->nRefs != 0); + if (InterlockedDecrement(&GetData()->nRefs) <= 0) + delete[] (BYTE*)GetData(); + Init(); + } + } + + static void PASCAL Release(CStringData* pData) + { + if (pData != _atltmpDataNil) + { + ATLASSERT(pData->nRefs != 0); + if (InterlockedDecrement(&pData->nRefs) <= 0) + delete[] (BYTE*)pData; + } + } + + static int PASCAL SafeStrlen(LPCTSTR lpsz) + { + return (lpsz == NULL) ? 0 : lstrlen(lpsz); + } + + static int __stdcall _LoadString(UINT nID, LPTSTR lpszBuf, UINT nMaxBuf) + { +#ifdef _DEBUG + // LoadString without annoying warning from the Debug kernel if the + // segment containing the string is not present + if (::FindResource(ModuleHelper::GetResourceInstance(), MAKEINTRESOURCE((nID >> 4) + 1), RT_STRING) == NULL) + { + lpszBuf[0] = _T('\0'); + return 0; // not found + } +#endif // _DEBUG + + int nLen = ::LoadString(ModuleHelper::GetResourceInstance(), nID, lpszBuf, nMaxBuf); + if (nLen == 0) + lpszBuf[0] = _T('\0'); + + return nLen; + } + + static const CString& __stdcall _GetEmptyString() + { + return *(CString*)&_atltmpPchNil; + } + +// CString conversion helpers + static int __cdecl _wcstombsz(char* mbstr, const wchar_t* wcstr, size_t count) + { + if (count == 0 && mbstr != NULL) + return 0; + + int result = ::WideCharToMultiByte(CP_ACP, 0, wcstr, -1, mbstr, (int)count, NULL, NULL); + ATLASSERT(mbstr == NULL || result <= (int)count); + if (result > 0) + mbstr[result - 1] = 0; + return result; + } + + static int __cdecl _mbstowcsz(wchar_t* wcstr, const char* mbstr, size_t count) + { + if (count == 0 && wcstr != NULL) + return 0; + + int result = ::MultiByteToWideChar(CP_ACP, 0, mbstr, -1, wcstr, (int)count); + ATLASSERT(wcstr == NULL || result <= (int)count); + if (result > 0) + wcstr[result - 1] = 0; + return result; + } + +// Helpers to avoid CRT startup code +#ifdef _ATL_MIN_CRT + static const TCHAR* _cstrchr(const TCHAR* p, TCHAR ch) + { + // strchr for '\0' should succeed + while (*p != 0) + { + if (*p == ch) + break; + p = ::CharNext(p); + } + return (*p == ch) ? p : NULL; + } + + static const TCHAR* _cstrrchr(const TCHAR* p, TCHAR ch) + { + const TCHAR* lpsz = NULL; + while (*p != 0) + { + if (*p == ch) + lpsz = p; + p = ::CharNext(p); + } + return lpsz; + } + + static TCHAR* _cstrrev(TCHAR* pStr) + { + // optimize NULL, zero-length, and single-char case + if ((pStr == NULL) || (pStr[0] == _T('\0')) || (pStr[1] == _T('\0'))) + return pStr; + + TCHAR* p = pStr; + + while (*p != 0) + { + TCHAR* pNext = ::CharNext(p); + if(pNext > p + 1) + { + char p1 = *(char*)p; + *(char*)p = *(char*)(p + 1); + *(char*)(p + 1) = p1; + } + p = pNext; + } + + p--; + TCHAR* q = pStr; + + while (q < p) + { + TCHAR t = *q; + *q = *p; + *p = t; + q++; + p--; + } + return pStr; + } + + static const TCHAR* _cstrstr(const TCHAR* pStr, const TCHAR* pCharSet) + { + int nLen = lstrlen(pCharSet); + if (nLen == 0) + return (TCHAR*)pStr; + + const TCHAR* pRet = NULL; + const TCHAR* pCur = pStr; + while((pCur = _cstrchr(pCur, *pCharSet)) != NULL) + { + if(memcmp(pCur, pCharSet, nLen * sizeof(TCHAR)) == 0) + { + pRet = pCur; + break; + } + pCur = ::CharNext(pCur); + } + return pRet; + } + + static int _cstrspn(const TCHAR* pStr, const TCHAR* pCharSet) + { + int nRet = 0; + const TCHAR* p = pStr; + while (*p != 0) + { + const TCHAR* pNext = ::CharNext(p); + if(pNext > p + 1) + { + if(_cstrchr_db(pCharSet, *p, *(p + 1)) == NULL) + break; + nRet += 2; + } + else + { + if(_cstrchr(pCharSet, *p) == NULL) + break; + nRet++; + } + p = pNext; + } + return nRet; + } + + static int _cstrcspn(const TCHAR* pStr, const TCHAR* pCharSet) + { + int nRet = 0; + TCHAR* p = (TCHAR*)pStr; + while (*p != 0) + { + TCHAR* pNext = ::CharNext(p); + if(pNext > p + 1) + { + if(_cstrchr_db(pCharSet, *p, *(p + 1)) != NULL) + break; + nRet += 2; + } + else + { + if(_cstrchr(pCharSet, *p) != NULL) + break; + nRet++; + } + p = pNext; + } + return nRet; + } + + static const TCHAR* _cstrpbrk(const TCHAR* p, const TCHAR* lpszCharSet) + { + int n = _cstrcspn(p, lpszCharSet); + return (p[n] != 0) ? &p[n] : NULL; + } + + static int _cstrisdigit(TCHAR ch) + { + WORD type; + GetStringTypeEx(GetThreadLocale(), CT_CTYPE1, &ch, 1, &type); + return (type & C1_DIGIT) == C1_DIGIT; + } + + static int _cstrisspace(TCHAR ch) + { + WORD type; + GetStringTypeEx(GetThreadLocale(), CT_CTYPE1, &ch, 1, &type); + return (type & C1_SPACE) == C1_SPACE; + } + + static int _cstrcmp(const TCHAR* pstrOne, const TCHAR* pstrOther) + { + return lstrcmp(pstrOne, pstrOther); + } + + static int _cstrcmpi(const TCHAR* pstrOne, const TCHAR* pstrOther) + { + return lstrcmpi(pstrOne, pstrOther); + } + + static int _cstrcoll(const TCHAR* pstrOne, const TCHAR* pstrOther) + { + int nRet = CompareString(GetThreadLocale(), 0, pstrOne, -1, pstrOther, -1); + ATLASSERT(nRet != 0); + return nRet - 2; // convert to strcmp convention + } + + static int _cstrcolli(const TCHAR* pstrOne, const TCHAR* pstrOther) + { + int nRet = CompareString(GetThreadLocale(), NORM_IGNORECASE, pstrOne, -1, pstrOther, -1); + ATLASSERT(nRet != 0); + return nRet - 2; // convert to strcmp convention + } + + static int _cstrtoi(const TCHAR* nptr) + { + int c; // current char + int total; // current total + int sign; // if '-', then negative, otherwise positive + + while (_cstrisspace(*nptr)) + ++nptr; + + c = (int)(_TUCHAR)*nptr++; + sign = c; // save sign indication + if (c == _T('-') || c == _T('+')) + c = (int)(_TUCHAR)*nptr++; // skip sign + + total = 0; + + while (_cstrisdigit((TCHAR)c)) + { + total = 10 * total + (c - '0'); // accumulate digit + c = (int)(_TUCHAR)*nptr++; // get next char + } + + if (sign == '-') + return -total; + else + return total; // return result, negated if necessary + } +#else // !_ATL_MIN_CRT + static const TCHAR* _cstrchr(const TCHAR* p, TCHAR ch) + { + return _tcschr(p, ch); + } + + static const TCHAR* _cstrrchr(const TCHAR* p, TCHAR ch) + { + return _tcsrchr(p, ch); + } + + static TCHAR* _cstrrev(TCHAR* pStr) + { + return _tcsrev(pStr); + } + + static const TCHAR* _cstrstr(const TCHAR* pStr, const TCHAR* pCharSet) + { + return _tcsstr(pStr, pCharSet); + } + + static int _cstrspn(const TCHAR* pStr, const TCHAR* pCharSet) + { + return (int)_tcsspn(pStr, pCharSet); + } + + static int _cstrcspn(const TCHAR* pStr, const TCHAR* pCharSet) + { + return (int)_tcscspn(pStr, pCharSet); + } + + static const TCHAR* _cstrpbrk(const TCHAR* p, const TCHAR* lpszCharSet) + { + return _tcspbrk(p, lpszCharSet); + } + + static int _cstrisdigit(TCHAR ch) + { + return _istdigit(ch); + } + + static int _cstrisspace(TCHAR ch) + { + return _istspace((_TUCHAR)ch); + } + + static int _cstrcmp(const TCHAR* pstrOne, const TCHAR* pstrOther) + { + return _tcscmp(pstrOne, pstrOther); + } + + static int _cstrcmpi(const TCHAR* pstrOne, const TCHAR* pstrOther) + { + return _tcsicmp(pstrOne, pstrOther); + } + +#ifndef _WIN32_WCE + static int _cstrcoll(const TCHAR* pstrOne, const TCHAR* pstrOther) + { + return _tcscoll(pstrOne, pstrOther); + } + + static int _cstrcolli(const TCHAR* pstrOne, const TCHAR* pstrOther) + { + return _tcsicoll(pstrOne, pstrOther); + } +#endif // !_WIN32_WCE + + static int _cstrtoi(const TCHAR* nptr) + { + return _ttoi(nptr); + } +#endif // !_ATL_MIN_CRT + + static const TCHAR* _cstrchr_db(const TCHAR* p, TCHAR ch1, TCHAR ch2) + { + const TCHAR* lpsz = NULL; + while (*p != 0) + { + if (*p == ch1 && *(p + 1) == ch2) + { + lpsz = p; + break; + } + p = ::CharNext(p); + } + return lpsz; + } +}; + + +// Compare helpers + +inline bool __stdcall operator ==(const CString& s1, const CString& s2) +{ return s1.Compare(s2) == 0; } + +inline bool __stdcall operator ==(const CString& s1, LPCTSTR s2) +{ return s1.Compare(s2) == 0; } + +inline bool __stdcall operator ==(LPCTSTR s1, const CString& s2) +{ return s2.Compare(s1) == 0; } + +inline bool __stdcall operator !=(const CString& s1, const CString& s2) +{ return s1.Compare(s2) != 0; } + +inline bool __stdcall operator !=(const CString& s1, LPCTSTR s2) +{ return s1.Compare(s2) != 0; } + +inline bool __stdcall operator !=(LPCTSTR s1, const CString& s2) +{ return s2.Compare(s1) != 0; } + +inline bool __stdcall operator <(const CString& s1, const CString& s2) +{ return s1.Compare(s2) < 0; } + +inline bool __stdcall operator <(const CString& s1, LPCTSTR s2) +{ return s1.Compare(s2) < 0; } + +inline bool __stdcall operator <(LPCTSTR s1, const CString& s2) +{ return s2.Compare(s1) > 0; } + +inline bool __stdcall operator >(const CString& s1, const CString& s2) +{ return s1.Compare(s2) > 0; } + +inline bool __stdcall operator >(const CString& s1, LPCTSTR s2) +{ return s1.Compare(s2) > 0; } + +inline bool __stdcall operator >(LPCTSTR s1, const CString& s2) +{ return s2.Compare(s1) < 0; } + +inline bool __stdcall operator <=(const CString& s1, const CString& s2) +{ return s1.Compare(s2) <= 0; } + +inline bool __stdcall operator <=(const CString& s1, LPCTSTR s2) +{ return s1.Compare(s2) <= 0; } + +inline bool __stdcall operator <=(LPCTSTR s1, const CString& s2) +{ return s2.Compare(s1) >= 0; } + +inline bool __stdcall operator >=(const CString& s1, const CString& s2) +{ return s1.Compare(s2) >= 0; } + +inline bool __stdcall operator >=(const CString& s1, LPCTSTR s2) +{ return s1.Compare(s2) >= 0; } + +inline bool __stdcall operator >=(LPCTSTR s1, const CString& s2) +{ return s2.Compare(s1) <= 0; } + + +// CString "operator +" functions + +inline CString __stdcall operator +(const CString& string1, const CString& string2) +{ + CString s; + s.ConcatCopy(string1.GetData()->nDataLength, string1.m_pchData, string2.GetData()->nDataLength, string2.m_pchData); + return s; +} + +inline CString __stdcall operator +(const CString& string, TCHAR ch) +{ + CString s; + s.ConcatCopy(string.GetData()->nDataLength, string.m_pchData, 1, &ch); + return s; +} + +inline CString __stdcall operator +(TCHAR ch, const CString& string) +{ + CString s; + s.ConcatCopy(1, &ch, string.GetData()->nDataLength, string.m_pchData); + return s; +} + +#ifdef _UNICODE +inline CString __stdcall operator +(const CString& string, char ch) +{ + return string + (TCHAR)ch; +} + +inline CString __stdcall operator +(char ch, const CString& string) +{ + return (TCHAR)ch + string; +} +#endif // _UNICODE + +inline CString __stdcall operator +(const CString& string, LPCTSTR lpsz) +{ + ATLASSERT(lpsz == NULL || CString::_IsValidString(lpsz)); + CString s; + s.ConcatCopy(string.GetData()->nDataLength, string.m_pchData, CString::SafeStrlen(lpsz), lpsz); + return s; +} + +inline CString __stdcall operator +(LPCTSTR lpsz, const CString& string) +{ + ATLASSERT(lpsz == NULL || CString::_IsValidString(lpsz)); + CString s; + s.ConcatCopy(CString::SafeStrlen(lpsz), lpsz, string.GetData()->nDataLength, string.m_pchData); + return s; +} + +#endif // !_WTL_NO_CSTRING + + +/////////////////////////////////////////////////////////////////////////////// +// CRecentDocumentList - MRU List Support + +#ifndef _WIN32_WCE + +#ifndef _WTL_MRUEMPTY_TEXT + #define _WTL_MRUEMPTY_TEXT _T("(empty)") +#endif + +// forward declaration +inline bool AtlCompactPath(LPTSTR lpstrOut, LPCTSTR lpstrIn, int cchLen); + +template +class CRecentDocumentListBase +{ +public: +// Declarations + struct _DocEntry + { + TCHAR szDocName[t_cchItemLen]; + bool operator ==(const _DocEntry& de) const + { return (lstrcmpi(szDocName, de.szDocName) == 0); } + }; + + enum + { + m_nMaxEntries_Min = 2, + m_nMaxEntries_Max = t_nLastID - t_nFirstID + 1, + m_cchMaxItemLen_Min = 6, + m_cchMaxItemLen_Max = t_cchItemLen, + m_cchItemNameLen = 11 + }; + +// Data members + ATL::CSimpleArray<_DocEntry> m_arrDocs; + int m_nMaxEntries; // default is 4 + HMENU m_hMenu; + + TCHAR m_szNoEntries[t_cchItemLen]; + + int m_cchMaxItemLen; + +// Constructor + CRecentDocumentListBase() : m_hMenu(NULL), m_nMaxEntries(4), m_cchMaxItemLen(-1) + { + // These ASSERTs verify values of the template arguments + ATLASSERT(t_cchItemLen > m_cchMaxItemLen_Min); + ATLASSERT(m_nMaxEntries_Max > m_nMaxEntries_Min); + } + +// Attributes + HMENU GetMenuHandle() const + { + return m_hMenu; + } + + void SetMenuHandle(HMENU hMenu) + { + ATLASSERT(hMenu == NULL || ::IsMenu(hMenu)); + m_hMenu = hMenu; + if(m_hMenu == NULL || (::GetMenuString(m_hMenu, t_nFirstID, m_szNoEntries, t_cchItemLen, MF_BYCOMMAND) == 0)) + { + T* pT = static_cast(this); + pT; // avoid level 4 warning + SecureHelper::strncpy_x(m_szNoEntries, _countof(m_szNoEntries), pT->GetMRUEmptyText(), _TRUNCATE); + } + } + + int GetMaxEntries() const + { + return m_nMaxEntries; + } + + void SetMaxEntries(int nMaxEntries) + { + ATLASSERT(nMaxEntries >= m_nMaxEntries_Min && nMaxEntries <= m_nMaxEntries_Max); + if(nMaxEntries < m_nMaxEntries_Min) + nMaxEntries = m_nMaxEntries_Min; + else if(nMaxEntries > m_nMaxEntries_Max) + nMaxEntries = m_nMaxEntries_Max; + m_nMaxEntries = nMaxEntries; + } + + int GetMaxItemLength() const + { + return m_cchMaxItemLen; + } + + void SetMaxItemLength(int cchMaxLen) + { + ATLASSERT((cchMaxLen >= m_cchMaxItemLen_Min && cchMaxLen <= m_cchMaxItemLen_Max) || cchMaxLen == -1); + if(cchMaxLen != -1) + { + if(cchMaxLen < m_cchMaxItemLen_Min) + cchMaxLen = m_cchMaxItemLen_Min; + else if(cchMaxLen > m_cchMaxItemLen_Max) + cchMaxLen = m_cchMaxItemLen_Max; + } + m_cchMaxItemLen = cchMaxLen; + T* pT = static_cast(this); + pT->UpdateMenu(); + } + +// Operations + BOOL AddToList(LPCTSTR lpstrDocName) + { + _DocEntry de; + errno_t nRet = SecureHelper::strncpy_x(de.szDocName, _countof(de.szDocName), lpstrDocName, _TRUNCATE); + if(nRet != 0 && nRet != STRUNCATE) + return FALSE; + + for(int i = 0; i < m_arrDocs.GetSize(); i++) + { + if(lstrcmpi(m_arrDocs[i].szDocName, lpstrDocName) == 0) + { + m_arrDocs.RemoveAt(i); + break; + } + } + + if(m_arrDocs.GetSize() == m_nMaxEntries) + m_arrDocs.RemoveAt(0); + + BOOL bRet = m_arrDocs.Add(de); + if(bRet) + { + T* pT = static_cast(this); + bRet = pT->UpdateMenu(); + } + return bRet; + } + + // This function is deprecated because it is not safe. + // Use the version below that accepts the buffer length. +#if (_MSC_VER >= 1300) + __declspec(deprecated) +#endif + BOOL GetFromList(int /*nItemID*/, LPTSTR /*lpstrDocName*/) + { + ATLASSERT(FALSE); + return FALSE; + } + + BOOL GetFromList(int nItemID, LPTSTR lpstrDocName, int cchLength) + { + int nIndex = m_arrDocs.GetSize() - (nItemID - t_nFirstID) - 1; + if(nIndex < 0 || nIndex >= m_arrDocs.GetSize()) + return FALSE; + if(lstrlen(m_arrDocs[nIndex].szDocName) >= cchLength) + return FALSE; + SecureHelper::strcpy_x(lpstrDocName, cchLength, m_arrDocs[nIndex].szDocName); + + return TRUE; + } + +#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) + BOOL GetFromList(int nItemID, _CSTRING_NS::CString& strDocName) + { + int nIndex = m_arrDocs.GetSize() - (nItemID - t_nFirstID) - 1; + if(nIndex < 0 || nIndex >= m_arrDocs.GetSize()) + return FALSE; + strDocName = m_arrDocs[nIndex].szDocName; + return TRUE; + } +#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) + + BOOL RemoveFromList(int nItemID) + { + int nIndex = m_arrDocs.GetSize() - (nItemID - t_nFirstID) - 1; + BOOL bRet = m_arrDocs.RemoveAt(nIndex); + if(bRet) + { + T* pT = static_cast(this); + bRet = pT->UpdateMenu(); + } + return bRet; + } + + BOOL MoveToTop(int nItemID) + { + int nIndex = m_arrDocs.GetSize() - (nItemID - t_nFirstID) - 1; + if(nIndex < 0 || nIndex >= m_arrDocs.GetSize()) + return FALSE; + _DocEntry de; + de = m_arrDocs[nIndex]; + m_arrDocs.RemoveAt(nIndex); + BOOL bRet = m_arrDocs.Add(de); + if(bRet) + { + T* pT = static_cast(this); + bRet = pT->UpdateMenu(); + } + return bRet; + } + + BOOL ReadFromRegistry(LPCTSTR lpstrRegKey) + { + T* pT = static_cast(this); + ATL::CRegKey rkParent; + ATL::CRegKey rk; + + LONG lRet = rkParent.Open(HKEY_CURRENT_USER, lpstrRegKey); + if(lRet != ERROR_SUCCESS) + return FALSE; + lRet = rk.Open(rkParent, pT->GetRegKeyName()); + if(lRet != ERROR_SUCCESS) + return FALSE; + + DWORD dwRet = 0; +#if (_ATL_VER >= 0x0700) + lRet = rk.QueryDWORDValue(pT->GetRegCountName(), dwRet); +#else + lRet = rk.QueryValue(dwRet, pT->GetRegCountName()); +#endif + if(lRet != ERROR_SUCCESS) + return FALSE; + SetMaxEntries(dwRet); + + m_arrDocs.RemoveAll(); + + TCHAR szRetString[t_cchItemLen] = { 0 }; + _DocEntry de; + + for(int nItem = m_nMaxEntries; nItem > 0; nItem--) + { + TCHAR szBuff[m_cchItemNameLen] = { 0 }; + SecureHelper::wsprintf_x(szBuff, m_cchItemNameLen, pT->GetRegItemName(), nItem); +#if (_ATL_VER >= 0x0700) + ULONG ulCount = t_cchItemLen; + lRet = rk.QueryStringValue(szBuff, szRetString, &ulCount); +#else + DWORD dwCount = t_cchItemLen * sizeof(TCHAR); + lRet = rk.QueryValue(szRetString, szBuff, &dwCount); +#endif + if(lRet == ERROR_SUCCESS) + { + SecureHelper::strcpy_x(de.szDocName, _countof(de.szDocName), szRetString); + m_arrDocs.Add(de); + } + } + + rk.Close(); + rkParent.Close(); + + return pT->UpdateMenu(); + } + + BOOL WriteToRegistry(LPCTSTR lpstrRegKey) + { + T* pT = static_cast(this); + pT; // avoid level 4 warning + ATL::CRegKey rkParent; + ATL::CRegKey rk; + + LONG lRet = rkParent.Create(HKEY_CURRENT_USER, lpstrRegKey); + if(lRet != ERROR_SUCCESS) + return FALSE; + lRet = rk.Create(rkParent, pT->GetRegKeyName()); + if(lRet != ERROR_SUCCESS) + return FALSE; + +#if (_ATL_VER >= 0x0700) + lRet = rk.SetDWORDValue(pT->GetRegCountName(), m_nMaxEntries); +#else + lRet = rk.SetValue(m_nMaxEntries, pT->GetRegCountName()); +#endif + ATLASSERT(lRet == ERROR_SUCCESS); + + // set new values + int nItem; + for(nItem = m_arrDocs.GetSize(); nItem > 0; nItem--) + { + TCHAR szBuff[m_cchItemNameLen] = { 0 }; + SecureHelper::wsprintf_x(szBuff, m_cchItemNameLen, pT->GetRegItemName(), nItem); + TCHAR szDocName[t_cchItemLen] = { 0 }; + GetFromList(t_nFirstID + nItem - 1, szDocName, t_cchItemLen); +#if (_ATL_VER >= 0x0700) + lRet = rk.SetStringValue(szBuff, szDocName); +#else + lRet = rk.SetValue(szDocName, szBuff); +#endif + ATLASSERT(lRet == ERROR_SUCCESS); + } + + // delete unused keys + for(nItem = m_arrDocs.GetSize() + 1; nItem < m_nMaxEntries_Max; nItem++) + { + TCHAR szBuff[m_cchItemNameLen] = { 0 }; + SecureHelper::wsprintf_x(szBuff, m_cchItemNameLen, pT->GetRegItemName(), nItem); + rk.DeleteValue(szBuff); + } + + rk.Close(); + rkParent.Close(); + + return TRUE; + } + +// Implementation + BOOL UpdateMenu() + { + if(m_hMenu == NULL) + return FALSE; + ATLASSERT(::IsMenu(m_hMenu)); + + int nItems = ::GetMenuItemCount(m_hMenu); + int nInsertPoint; + for(nInsertPoint = 0; nInsertPoint < nItems; nInsertPoint++) + { + CMenuItemInfo mi; + mi.fMask = MIIM_ID; + ::GetMenuItemInfo(m_hMenu, nInsertPoint, TRUE, &mi); + if (mi.wID == t_nFirstID) + break; + } + ATLASSERT(nInsertPoint < nItems && "You need a menu item with an ID = t_nFirstID"); + + int nItem; + for(nItem = t_nFirstID; nItem < t_nFirstID + m_nMaxEntries; nItem++) + { + // keep the first one as an insertion point + if (nItem != t_nFirstID) + ::DeleteMenu(m_hMenu, nItem, MF_BYCOMMAND); + } + + TCHAR szItemText[t_cchItemLen + 6] = { 0 }; // add space for &, 2 digits, and a space + int nSize = m_arrDocs.GetSize(); + nItem = 0; + if(nSize > 0) + { + for(nItem = 0; nItem < nSize; nItem++) + { + if(m_cchMaxItemLen == -1) + { + SecureHelper::wsprintf_x(szItemText, t_cchItemLen + 6, _T("&%i %s"), nItem + 1, m_arrDocs[nSize - 1 - nItem].szDocName); + } + else + { + TCHAR szBuff[t_cchItemLen] = { 0 }; + T* pT = static_cast(this); + pT; // avoid level 4 warning + bool bRet = pT->CompactDocumentName(szBuff, m_arrDocs[nSize - 1 - nItem].szDocName, m_cchMaxItemLen); + bRet; // avoid level 4 warning + ATLASSERT(bRet); + SecureHelper::wsprintf_x(szItemText, t_cchItemLen + 6, _T("&%i %s"), nItem + 1, szBuff); + } + ::InsertMenu(m_hMenu, nInsertPoint + nItem, MF_BYPOSITION | MF_STRING, t_nFirstID + nItem, szItemText); + } + } + else // empty + { + ::InsertMenu(m_hMenu, nInsertPoint, MF_BYPOSITION | MF_STRING, t_nFirstID, m_szNoEntries); + ::EnableMenuItem(m_hMenu, t_nFirstID, MF_GRAYED); + nItem++; + } + ::DeleteMenu(m_hMenu, nInsertPoint + nItem, MF_BYPOSITION); + + return TRUE; + } + +// Overrideables + // override to provide a different method of compacting document names + static bool CompactDocumentName(LPTSTR lpstrOut, LPCTSTR lpstrIn, int cchLen) + { + return AtlCompactPath(lpstrOut, lpstrIn, cchLen); + } + + static LPCTSTR GetRegKeyName() + { + return _T("Recent Document List"); + } + + static LPCTSTR GetRegCountName() + { + return _T("DocumentCount"); + } + + static LPCTSTR GetRegItemName() + { + // Note: This string is a format string used with wsprintf(). + // Resulting formatted string must be m_cchItemNameLen or less + // characters long, including the terminating null character. + return _T("Document%i"); + } + + static LPCTSTR GetMRUEmptyText() + { + return _WTL_MRUEMPTY_TEXT; + } +}; + +class CRecentDocumentList : public CRecentDocumentListBase +{ +public: +// nothing here +}; + +#endif // _WIN32_WCE + + +/////////////////////////////////////////////////////////////////////////////// +// CFindFile - file search helper class + +class CFindFile +{ +public: +// Data members + WIN32_FIND_DATA m_fd; + TCHAR m_lpszRoot[MAX_PATH]; + TCHAR m_chDirSeparator; + HANDLE m_hFind; + BOOL m_bFound; + +// Constructor/destructor + CFindFile() : m_hFind(NULL), m_chDirSeparator(_T('\\')), m_bFound(FALSE) + { } + + ~CFindFile() + { + Close(); + } + +// Attributes + ULONGLONG GetFileSize() const + { + ATLASSERT(m_hFind != NULL); + + ULARGE_INTEGER nFileSize = { 0 }; + + if(m_bFound) + { + nFileSize.LowPart = m_fd.nFileSizeLow; + nFileSize.HighPart = m_fd.nFileSizeHigh; + } + else + { + nFileSize.QuadPart = 0; + } + + return nFileSize.QuadPart; + } + + BOOL GetFileName(LPTSTR lpstrFileName, int cchLength) const + { + ATLASSERT(m_hFind != NULL); + if(lstrlen(m_fd.cFileName) >= cchLength) + return FALSE; + + if(m_bFound) + SecureHelper::strcpy_x(lpstrFileName, cchLength, m_fd.cFileName); + + return m_bFound; + } + + BOOL GetFilePath(LPTSTR lpstrFilePath, int cchLength) const + { + ATLASSERT(m_hFind != NULL); + + int nLen = lstrlen(m_lpszRoot); +#ifndef _WIN32_WCE + ATLASSERT(nLen > 0); + if(nLen == 0) + return FALSE; + + bool bAddSep = (m_lpszRoot[nLen - 1] != _T('\\') && m_lpszRoot[nLen - 1] !=_T('/')); +#else // CE specific + // allow diskless devices (nLen == 0) + bool bAddSep = ((nLen == 0) || (m_lpszRoot[nLen - 1] != _T('\\') && m_lpszRoot[nLen - 1] !=_T('/'))); +#endif // _WIN32_WCE + + if((lstrlen(m_lpszRoot) + (bAddSep ? 1 : 0)) >= cchLength) + return FALSE; + + SecureHelper::strcpy_x(lpstrFilePath, cchLength, m_lpszRoot); + + if(bAddSep) + { + TCHAR szSeparator[2] = { m_chDirSeparator, 0 }; + SecureHelper::strcat_x(lpstrFilePath, cchLength, szSeparator); + } + + SecureHelper::strcat_x(lpstrFilePath, cchLength, m_fd.cFileName); + + return TRUE; + } + +#ifndef _WIN32_WCE + BOOL GetFileTitle(LPTSTR lpstrFileTitle, int cchLength) const + { + ATLASSERT(m_hFind != NULL); + + TCHAR szBuff[MAX_PATH] = { 0 }; + if(!GetFileName(szBuff, MAX_PATH)) + return FALSE; + + if(lstrlen(szBuff) >= cchLength || cchLength < 1) + return FALSE; + + // find the last dot + LPTSTR pstrDot = (LPTSTR)_cstrrchr(szBuff, _T('.')); + if(pstrDot != NULL) + *pstrDot = 0; + + SecureHelper::strcpy_x(lpstrFileTitle, cchLength, szBuff); + + return TRUE; + } +#endif // !_WIN32_WCE + + BOOL GetFileURL(LPTSTR lpstrFileURL, int cchLength) const + { + ATLASSERT(m_hFind != NULL); + + TCHAR szBuff[MAX_PATH] = { 0 }; + if(!GetFilePath(szBuff, MAX_PATH)) + return FALSE; + LPCTSTR lpstrFileURLPrefix = _T("file://"); + if(lstrlen(szBuff) + lstrlen(lpstrFileURLPrefix) >= cchLength) + return FALSE; + SecureHelper::strcpy_x(lpstrFileURL, cchLength, lpstrFileURLPrefix); + SecureHelper::strcat_x(lpstrFileURL, cchLength, szBuff); + + return TRUE; + } + + BOOL GetRoot(LPTSTR lpstrRoot, int cchLength) const + { + ATLASSERT(m_hFind != NULL); + if(lstrlen(m_lpszRoot) >= cchLength) + return FALSE; + + SecureHelper::strcpy_x(lpstrRoot, cchLength, m_lpszRoot); + + return TRUE; + } + +#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) + _CSTRING_NS::CString GetFileName() const + { + ATLASSERT(m_hFind != NULL); + + _CSTRING_NS::CString ret; + + if(m_bFound) + ret = m_fd.cFileName; + return ret; + } + + _CSTRING_NS::CString GetFilePath() const + { + ATLASSERT(m_hFind != NULL); + + _CSTRING_NS::CString strResult = m_lpszRoot; + int nLen = strResult.GetLength(); +#ifndef _WIN32_WCE + ATLASSERT(nLen > 0); + if(nLen == 0) + return strResult; + + if((strResult[nLen - 1] != _T('\\')) && (strResult[nLen - 1] != _T('/'))) +#else // CE specific + // allow diskless devices (nLen == 0) + if((nLen == 0) || ((strResult[nLen - 1] != _T('\\')) && (strResult[nLen - 1] != _T('/')))) +#endif // _WIN32_WCE + strResult += m_chDirSeparator; + strResult += GetFileName(); + return strResult; + } + +#ifndef _WIN32_WCE + _CSTRING_NS::CString GetFileTitle() const + { + ATLASSERT(m_hFind != NULL); + + _CSTRING_NS::CString strResult; + GetFileTitle(strResult.GetBuffer(MAX_PATH), MAX_PATH); + strResult.ReleaseBuffer(); + + return strResult; + } +#endif // !_WIN32_WCE + + _CSTRING_NS::CString GetFileURL() const + { + ATLASSERT(m_hFind != NULL); + + _CSTRING_NS::CString strResult("file://"); + strResult += GetFilePath(); + return strResult; + } + + _CSTRING_NS::CString GetRoot() const + { + ATLASSERT(m_hFind != NULL); + + _CSTRING_NS::CString str = m_lpszRoot; + return str; + } +#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) + + BOOL GetLastWriteTime(FILETIME* pTimeStamp) const + { + ATLASSERT(m_hFind != NULL); + ATLASSERT(pTimeStamp != NULL); + + if(m_bFound && pTimeStamp != NULL) + { + *pTimeStamp = m_fd.ftLastWriteTime; + return TRUE; + } + + return FALSE; + } + + BOOL GetLastAccessTime(FILETIME* pTimeStamp) const + { + ATLASSERT(m_hFind != NULL); + ATLASSERT(pTimeStamp != NULL); + + if(m_bFound && pTimeStamp != NULL) + { + *pTimeStamp = m_fd.ftLastAccessTime; + return TRUE; + } + + return FALSE; + } + + BOOL GetCreationTime(FILETIME* pTimeStamp) const + { + ATLASSERT(m_hFind != NULL); + + if(m_bFound && pTimeStamp != NULL) + { + *pTimeStamp = m_fd.ftCreationTime; + return TRUE; + } + + return FALSE; + } + + BOOL MatchesMask(DWORD dwMask) const + { + ATLASSERT(m_hFind != NULL); + + if(m_bFound) + return ((m_fd.dwFileAttributes & dwMask) != 0); + + return FALSE; + } + + BOOL IsDots() const + { + ATLASSERT(m_hFind != NULL); + + // return TRUE if the file name is "." or ".." and + // the file is a directory + + BOOL bResult = FALSE; + if(m_bFound && IsDirectory()) + { + if(m_fd.cFileName[0] == _T('.') && (m_fd.cFileName[1] == _T('\0') || (m_fd.cFileName[1] == _T('.') && m_fd.cFileName[2] == _T('\0')))) + bResult = TRUE; + } + + return bResult; + } + + BOOL IsReadOnly() const + { + return MatchesMask(FILE_ATTRIBUTE_READONLY); + } + + BOOL IsDirectory() const + { + return MatchesMask(FILE_ATTRIBUTE_DIRECTORY); + } + + BOOL IsCompressed() const + { + return MatchesMask(FILE_ATTRIBUTE_COMPRESSED); + } + + BOOL IsSystem() const + { + return MatchesMask(FILE_ATTRIBUTE_SYSTEM); + } + + BOOL IsHidden() const + { + return MatchesMask(FILE_ATTRIBUTE_HIDDEN); + } + + BOOL IsTemporary() const + { + return MatchesMask(FILE_ATTRIBUTE_TEMPORARY); + } + + BOOL IsNormal() const + { + return MatchesMask(FILE_ATTRIBUTE_NORMAL); + } + + BOOL IsArchived() const + { + return MatchesMask(FILE_ATTRIBUTE_ARCHIVE); + } + +// Operations + BOOL FindFile(LPCTSTR pstrName = NULL) + { + Close(); + + if(pstrName == NULL) + { + pstrName = _T("*.*"); + } + else if(lstrlen(pstrName) >= MAX_PATH) + { + ATLASSERT(FALSE); + return FALSE; + } + + SecureHelper::strcpy_x(m_fd.cFileName, _countof(m_fd.cFileName), pstrName); + + m_hFind = ::FindFirstFile(pstrName, &m_fd); + + if(m_hFind == INVALID_HANDLE_VALUE) + return FALSE; + +#ifndef _WIN32_WCE + bool bFullPath = (::GetFullPathName(pstrName, MAX_PATH, m_lpszRoot, NULL) != 0); +#else // CE specific + errno_t nRet = SecureHelper::strncpy_x(m_lpszRoot, _countof(m_lpszRoot), pstrName, _TRUNCATE); + bool bFullPath = (nRet == 0 || nRet == STRUNCATE); +#endif // _WIN32_WCE + + // passed name isn't a valid path but was found by the API + ATLASSERT(bFullPath); + if(!bFullPath) + { + Close(); + ::SetLastError(ERROR_INVALID_NAME); + return FALSE; + } + else + { + // find the last forward or backward whack + LPTSTR pstrBack = (LPTSTR)_cstrrchr(m_lpszRoot, _T('\\')); + LPTSTR pstrFront = (LPTSTR)_cstrrchr(m_lpszRoot, _T('/')); + + if(pstrFront != NULL || pstrBack != NULL) + { + if(pstrFront == NULL) + pstrFront = m_lpszRoot; + if(pstrBack == NULL) + pstrBack = m_lpszRoot; + + // from the start to the last whack is the root + + if(pstrFront >= pstrBack) + *pstrFront = _T('\0'); + else + *pstrBack = _T('\0'); + } + } + + m_bFound = TRUE; + + return TRUE; + } + + BOOL FindNextFile() + { + ATLASSERT(m_hFind != NULL); + + if(m_hFind == NULL) + return FALSE; + + if(!m_bFound) + return FALSE; + + m_bFound = ::FindNextFile(m_hFind, &m_fd); + + return m_bFound; + } + + void Close() + { + m_bFound = FALSE; + + if(m_hFind != NULL && m_hFind != INVALID_HANDLE_VALUE) + { + ::FindClose(m_hFind); + m_hFind = NULL; + } + } + +// Helper + static const TCHAR* _cstrrchr(const TCHAR* p, TCHAR ch) + { +#ifdef _ATL_MIN_CRT + const TCHAR* lpsz = NULL; + while (*p != 0) + { + if (*p == ch) + lpsz = p; + p = ::CharNext(p); + } + return lpsz; +#else // !_ATL_MIN_CRT + return _tcsrchr(p, ch); +#endif // !_ATL_MIN_CRT + } +}; + + +/////////////////////////////////////////////////////////////////////////////// +// Global functions for loading resources + +inline HACCEL AtlLoadAccelerators(ATL::_U_STRINGorID table) +{ + return ::LoadAccelerators(ModuleHelper::GetResourceInstance(), table.m_lpstr); +} + +inline HMENU AtlLoadMenu(ATL::_U_STRINGorID menu) +{ + return ::LoadMenu(ModuleHelper::GetResourceInstance(), menu.m_lpstr); +} + +inline HBITMAP AtlLoadBitmap(ATL::_U_STRINGorID bitmap) +{ + return ::LoadBitmap(ModuleHelper::GetResourceInstance(), bitmap.m_lpstr); +} + +#ifdef OEMRESOURCE +inline HBITMAP AtlLoadSysBitmap(ATL::_U_STRINGorID bitmap) +{ +#ifdef _DEBUG + WORD wID = (WORD)bitmap.m_lpstr; + ATLASSERT(wID >= 32734 && wID <= 32767); +#endif // _DEBUG + return ::LoadBitmap(NULL, bitmap.m_lpstr); +} +#endif // OEMRESOURCE + +inline HCURSOR AtlLoadCursor(ATL::_U_STRINGorID cursor) +{ + return ::LoadCursor(ModuleHelper::GetResourceInstance(), cursor.m_lpstr); +} + +inline HCURSOR AtlLoadSysCursor(LPCTSTR lpCursorName) +{ +#if (WINVER >= 0x0500) + ATLASSERT(lpCursorName == IDC_ARROW || lpCursorName == IDC_IBEAM || lpCursorName == IDC_WAIT || + lpCursorName == IDC_CROSS || lpCursorName == IDC_UPARROW || lpCursorName == IDC_SIZE || + lpCursorName == IDC_ICON || lpCursorName == IDC_SIZENWSE || lpCursorName == IDC_SIZENESW || + lpCursorName == IDC_SIZEWE || lpCursorName == IDC_SIZENS || lpCursorName == IDC_SIZEALL || + lpCursorName == IDC_NO || lpCursorName == IDC_APPSTARTING || lpCursorName == IDC_HELP || + lpCursorName == IDC_HAND); +#else // !(WINVER >= 0x0500) + ATLASSERT(lpCursorName == IDC_ARROW || lpCursorName == IDC_IBEAM || lpCursorName == IDC_WAIT || + lpCursorName == IDC_CROSS || lpCursorName == IDC_UPARROW || lpCursorName == IDC_SIZE || + lpCursorName == IDC_ICON || lpCursorName == IDC_SIZENWSE || lpCursorName == IDC_SIZENESW || + lpCursorName == IDC_SIZEWE || lpCursorName == IDC_SIZENS || lpCursorName == IDC_SIZEALL || + lpCursorName == IDC_NO || lpCursorName == IDC_APPSTARTING || lpCursorName == IDC_HELP); +#endif // !(WINVER >= 0x0500) + return ::LoadCursor(NULL, lpCursorName); +} + +inline HICON AtlLoadIcon(ATL::_U_STRINGorID icon) +{ + return ::LoadIcon(ModuleHelper::GetResourceInstance(), icon.m_lpstr); +} + +#ifndef _WIN32_WCE +inline HICON AtlLoadSysIcon(LPCTSTR lpIconName) +{ +#if (WINVER >= 0x0600) + ATLASSERT(lpIconName == IDI_APPLICATION || lpIconName == IDI_ASTERISK || lpIconName == IDI_EXCLAMATION || + lpIconName == IDI_HAND || lpIconName == IDI_QUESTION || lpIconName == IDI_WINLOGO || + lpIconName == IDI_SHIELD); +#else // !(WINVER >= 0x0600) + ATLASSERT(lpIconName == IDI_APPLICATION || lpIconName == IDI_ASTERISK || lpIconName == IDI_EXCLAMATION || + lpIconName == IDI_HAND || lpIconName == IDI_QUESTION || lpIconName == IDI_WINLOGO); +#endif // !(WINVER >= 0x0600) + return ::LoadIcon(NULL, lpIconName); +} +#endif // !_WIN32_WCE + +inline HBITMAP AtlLoadBitmapImage(ATL::_U_STRINGorID bitmap, UINT fuLoad = LR_DEFAULTCOLOR) +{ + return (HBITMAP)::LoadImage(ModuleHelper::GetResourceInstance(), bitmap.m_lpstr, IMAGE_BITMAP, 0, 0, fuLoad); +} + +inline HCURSOR AtlLoadCursorImage(ATL::_U_STRINGorID cursor, UINT fuLoad = LR_DEFAULTCOLOR | LR_DEFAULTSIZE, int cxDesired = 0, int cyDesired = 0) +{ + return (HCURSOR)::LoadImage(ModuleHelper::GetResourceInstance(), cursor.m_lpstr, IMAGE_CURSOR, cxDesired, cyDesired, fuLoad); +} + +inline HICON AtlLoadIconImage(ATL::_U_STRINGorID icon, UINT fuLoad = LR_DEFAULTCOLOR | LR_DEFAULTSIZE, int cxDesired = 0, int cyDesired = 0) +{ + return (HICON)::LoadImage(ModuleHelper::GetResourceInstance(), icon.m_lpstr, IMAGE_ICON, cxDesired, cyDesired, fuLoad); +} + +#ifdef OEMRESOURCE +inline HBITMAP AtlLoadSysBitmapImage(WORD wBitmapID, UINT fuLoad = LR_DEFAULTCOLOR) +{ + ATLASSERT(wBitmapID >= 32734 && wBitmapID <= 32767); + ATLASSERT((fuLoad & LR_LOADFROMFILE) == 0); // this one doesn't load from a file + return (HBITMAP)::LoadImage(NULL, MAKEINTRESOURCE(wBitmapID), IMAGE_BITMAP, 0, 0, fuLoad); +} +#endif // OEMRESOURCE + +inline HCURSOR AtlLoadSysCursorImage(ATL::_U_STRINGorID cursor, UINT fuLoad = LR_DEFAULTCOLOR | LR_DEFAULTSIZE, int cxDesired = 0, int cyDesired = 0) +{ +#ifdef _DEBUG + WORD wID = (WORD)cursor.m_lpstr; + ATLASSERT((wID >= 32512 && wID <= 32516) || (wID >= 32640 && wID <= 32648) || (wID == 32650) || (wID == 32651)); + ATLASSERT((fuLoad & LR_LOADFROMFILE) == 0); // this one doesn't load from a file +#endif // _DEBUG + return (HCURSOR)::LoadImage(NULL, cursor.m_lpstr, IMAGE_CURSOR, cxDesired, cyDesired, fuLoad); +} + +inline HICON AtlLoadSysIconImage(ATL::_U_STRINGorID icon, UINT fuLoad = LR_DEFAULTCOLOR | LR_DEFAULTSIZE, int cxDesired = 0, int cyDesired = 0) +{ +#ifdef _DEBUG + WORD wID = (WORD)icon.m_lpstr; + ATLASSERT(wID >= 32512 && wID <= 32517); + ATLASSERT((fuLoad & LR_LOADFROMFILE) == 0); // this one doesn't load from a file +#endif // _DEBUG + return (HICON)::LoadImage(NULL, icon.m_lpstr, IMAGE_ICON, cxDesired, cyDesired, fuLoad); +} + +#if (_ATL_VER < 0x0700) +inline int AtlLoadString(UINT uID, LPTSTR lpBuffer, int nBufferMax) +{ + return ::LoadString(_Module.GetResourceInstance(), uID, lpBuffer, nBufferMax); +} +#endif // (_ATL_VER < 0x0700) + +#ifdef _WIN32_WCE // CE only direct access to the resource +inline LPCTSTR AtlLoadString(UINT uID) +{ + LPCTSTR s = (LPCTSTR)::LoadString(ModuleHelper::GetResourceInstance(), uID, NULL, 0); +#ifdef DEBUG // Check for null-termination + if(s != NULL) + // Note: RC -n compiles null-terminated resource strings + ATLASSERT(s[*((WORD*)s -1) - 1] == L'\0'); +#endif + return s; +} +#endif // _WIN32_WCE + +inline bool AtlLoadString(UINT uID, BSTR& bstrText) +{ + USES_CONVERSION; + ATLASSERT(bstrText == NULL); + + LPTSTR lpstrText = NULL; + int nRes = 0; + for(int nLen = 256; ; nLen *= 2) + { + ATLTRY(lpstrText = new TCHAR[nLen]); + if(lpstrText == NULL) + break; + nRes = ::LoadString(ModuleHelper::GetResourceInstance(), uID, lpstrText, nLen); + if(nRes < nLen - 1) + break; + delete [] lpstrText; + lpstrText = NULL; + } + + if(lpstrText != NULL) + { + if(nRes != 0) + bstrText = ::SysAllocString(T2OLE(lpstrText)); + delete [] lpstrText; + } + + return (bstrText != NULL) ? true : false; +} + + +/////////////////////////////////////////////////////////////////////////////// +// Global functions for stock GDI objects + +inline HPEN AtlGetStockPen(int nPen) +{ +#if (_WIN32_WINNT >= 0x0500) && !defined(_WIN32_WCE) + ATLASSERT(nPen == WHITE_PEN || nPen == BLACK_PEN || nPen == NULL_PEN || nPen == DC_PEN); +#else + ATLASSERT(nPen == WHITE_PEN || nPen == BLACK_PEN || nPen == NULL_PEN); +#endif + return (HPEN)::GetStockObject(nPen); +} + +inline HBRUSH AtlGetStockBrush(int nBrush) +{ +#if (_WIN32_WINNT >= 0x0500) && !defined(_WIN32_WCE) + ATLASSERT((nBrush >= WHITE_BRUSH && nBrush <= HOLLOW_BRUSH) || nBrush == DC_BRUSH); +#else + ATLASSERT(nBrush >= WHITE_BRUSH && nBrush <= HOLLOW_BRUSH); +#endif + return (HBRUSH)::GetStockObject(nBrush); +} + +inline HFONT AtlGetStockFont(int nFont) +{ +#ifndef _WIN32_WCE + ATLASSERT((nFont >= OEM_FIXED_FONT && nFont <= SYSTEM_FIXED_FONT) || nFont == DEFAULT_GUI_FONT); +#else // CE specific + ATLASSERT(nFont == SYSTEM_FONT); +#endif // _WIN32_WCE + return (HFONT)::GetStockObject(nFont); +} + +inline HPALETTE AtlGetStockPalette(int nPalette) +{ + ATLASSERT(nPalette == DEFAULT_PALETTE); // the only one supported + return (HPALETTE)::GetStockObject(nPalette); +} + + +/////////////////////////////////////////////////////////////////////////////// +// Global function for compacting a path by replacing parts with ellipsis + +// helper for multi-byte character sets +inline bool _IsDBCSTrailByte(LPCTSTR lpstr, int nChar) +{ +#ifndef _UNICODE + int i = nChar; + for( ; i > 0; i--) + { + if(!::IsDBCSLeadByte(lpstr[i - 1])) + break; + } + return ((nChar > 0) && (((nChar - i) & 1) != 0)); +#else // _UNICODE + lpstr; nChar; + return false; +#endif // _UNICODE +} + +inline bool AtlCompactPath(LPTSTR lpstrOut, LPCTSTR lpstrIn, int cchLen) +{ + ATLASSERT(lpstrOut != NULL); + ATLASSERT(lpstrIn != NULL); + ATLASSERT(cchLen > 0); + + LPCTSTR szEllipsis = _T("..."); + const int cchEndEllipsis = 3; + const int cchMidEllipsis = 4; + + if(lstrlen(lpstrIn) < cchLen) + { + SecureHelper::strcpy_x(lpstrOut, cchLen, lpstrIn); + return true; + } + + lpstrOut[0] = 0; + + // check if the separator is a slash or a backslash + TCHAR chSlash = _T('\\'); + for(LPTSTR lpstr = (LPTSTR)lpstrIn; *lpstr != 0; lpstr = ::CharNext(lpstr)) + { + if((*lpstr == _T('/')) || (*lpstr == _T('\\'))) + chSlash = *lpstr; + } + + // find the filename portion of the path + LPCTSTR lpstrFileName = lpstrIn; + for(LPCTSTR pPath = lpstrIn; *pPath; pPath = ::CharNext(pPath)) + { + if((pPath[0] == _T('\\') || pPath[0] == _T(':') || pPath[0] == _T('/')) + && pPath[1] && pPath[1] != _T('\\') && pPath[1] != _T('/')) + lpstrFileName = pPath + 1; + } + int cchFileName = lstrlen(lpstrFileName); + + // handle just the filename without a path + if(lpstrFileName == lpstrIn && cchLen > cchEndEllipsis) + { + bool bRet = (SecureHelper::strncpy_x(lpstrOut, cchLen, lpstrIn, cchLen - cchEndEllipsis - 1) == 0); + if(bRet) + { +#ifndef _UNICODE + if(_IsDBCSTrailByte(lpstrIn, cchLen - cchEndEllipsis)) + lpstrOut[cchLen - cchEndEllipsis - 1] = 0; +#endif // _UNICODE + SecureHelper::strcat_x(lpstrOut, cchLen, szEllipsis); + } + return bRet; + } + + // handle just ellipsis + if((cchLen < (cchMidEllipsis + cchEndEllipsis))) + { + for(int i = 0; i < cchLen - 1; i++) + lpstrOut[i] = ((i + 1) == cchMidEllipsis) ? chSlash : _T('.'); + lpstrOut[cchLen - 1] = 0; + return true; + } + + // calc how much we have to copy + int cchToCopy = cchLen - (cchMidEllipsis + cchFileName) - 1; + + if(cchToCopy < 0) + cchToCopy = 0; + +#ifndef _UNICODE + if(cchToCopy > 0 && _IsDBCSTrailByte(lpstrIn, cchToCopy)) + cchToCopy--; +#endif // _UNICODE + + bool bRet = (SecureHelper::strncpy_x(lpstrOut, cchLen, lpstrIn, cchToCopy) == 0); + if(!bRet) + return false; + + // add ellipsis + SecureHelper::strcat_x(lpstrOut, cchLen, szEllipsis); + if(!bRet) + return false; + TCHAR szSlash[2] = { chSlash, 0 }; + SecureHelper::strcat_x(lpstrOut, cchLen, szSlash); + if(!bRet) + return false; + + // add filename (and ellipsis, if needed) + if(cchLen > (cchMidEllipsis + cchFileName)) + { + SecureHelper::strcat_x(lpstrOut, cchLen, lpstrFileName); + } + else + { + cchToCopy = cchLen - cchMidEllipsis - cchEndEllipsis - 1; +#ifndef _UNICODE + if(cchToCopy > 0 && _IsDBCSTrailByte(lpstrFileName, cchToCopy)) + cchToCopy--; +#endif // _UNICODE + bRet = (SecureHelper::strncpy_x(&lpstrOut[cchMidEllipsis], cchLen - cchMidEllipsis, lpstrFileName, cchToCopy) == 0); + if(bRet) + SecureHelper::strcat_x(lpstrOut, cchLen, szEllipsis); + } + + return bRet; +} + +}; // namespace WTL + +#endif // __ATLMISC_H__ diff --git a/Externals/WTL80/atlprint.h b/Externals/WTL80/atlprint.h new file mode 100644 index 0000000000..fed9a3fba3 --- /dev/null +++ b/Externals/WTL80/atlprint.h @@ -0,0 +1,1113 @@ +// Windows Template Library - WTL version 8.0 +// Copyright (C) Microsoft Corporation. All rights reserved. +// +// This file is a part of the Windows Template Library. +// The use and distribution terms for this software are covered by the +// Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php) +// which can be found in the file CPL.TXT at the root of this distribution. +// By using this software in any fashion, you are agreeing to be bound by +// the terms of this license. You must not remove this notice, or +// any other, from this software. + +#ifndef __ATLPRINT_H__ +#define __ATLPRINT_H__ + +#pragma once + +#ifndef __cplusplus + #error ATL requires C++ compilation (use a .cpp suffix) +#endif + +#ifdef _WIN32_WCE + #error atlprint.h is not supported on Windows CE +#endif + +#ifndef __ATLAPP_H__ + #error atlprint.h requires atlapp.h to be included first +#endif + +#ifndef __ATLWIN_H__ + #error atlprint.h requires atlwin.h to be included first +#endif + + +/////////////////////////////////////////////////////////////////////////////// +// Classes in this file: +// +// CPrinterInfo +// CPrinterT +// CDevModeT +// CPrinterDC +// CPrintJobInfo +// CPrintJob +// CPrintPreview +// CPrintPreviewWindowImpl +// CPrintPreviewWindow +// CZoomPrintPreviewWindowImpl +// CZoomPrintPreviewWindow + +namespace WTL +{ + +/////////////////////////////////////////////////////////////////////////////// +// CPrinterInfo - This class wraps all of the PRINTER_INFO_* structures +// and provided by ::GetPrinter. + +template +class _printer_info +{ +public: + typedef void infotype; +}; + +template <> class _printer_info<1> { public: typedef PRINTER_INFO_1 infotype; }; +template <> class _printer_info<2> { public: typedef PRINTER_INFO_2 infotype; }; +template <> class _printer_info<3> { public: typedef PRINTER_INFO_3 infotype; }; +template <> class _printer_info<4> { public: typedef PRINTER_INFO_4 infotype; }; +template <> class _printer_info<5> { public: typedef PRINTER_INFO_5 infotype; }; +template <> class _printer_info<6> { public: typedef PRINTER_INFO_6 infotype; }; +template <> class _printer_info<7> { public: typedef PRINTER_INFO_7 infotype; }; +// these are not in the old (vc6.0) headers +#ifdef _ATL_USE_NEW_PRINTER_INFO +template <> class _printer_info<8> { public: typedef PRINTER_INFO_8 infotype; }; +template <> class _printer_info<9> { public: typedef PRINTER_INFO_9 infotype; }; +#endif // _ATL_USE_NEW_PRINTER_INFO + + +template +class CPrinterInfo +{ +public: +// Data members + typename _printer_info::infotype* m_pi; + +// Constructor/destructor + CPrinterInfo() : m_pi(NULL) + { } + + CPrinterInfo(HANDLE hPrinter) : m_pi(NULL) + { + GetPrinterInfo(hPrinter); + } + + ~CPrinterInfo() + { + Cleanup(); + } + +// Operations + bool GetPrinterInfo(HANDLE hPrinter) + { + Cleanup(); + return GetPrinterInfoHelper(hPrinter, (BYTE**)&m_pi, t_nInfo); + } + +// Implementation + void Cleanup() + { + delete [] (BYTE*)m_pi; + m_pi = NULL; + } + + static bool GetPrinterInfoHelper(HANDLE hPrinter, BYTE** pi, int nIndex) + { + ATLASSERT(pi != NULL); + DWORD dw = 0; + BYTE* pb = NULL; + ::GetPrinter(hPrinter, nIndex, NULL, 0, &dw); + if (dw > 0) + { + ATLTRY(pb = new BYTE[dw]); + if (pb != NULL) + { + memset(pb, 0, dw); + DWORD dwNew; + if (!::GetPrinter(hPrinter, nIndex, pb, dw, &dwNew)) + { + delete [] pb; + pb = NULL; + } + } + } + *pi = pb; + return (pb != NULL); + } +}; + + +/////////////////////////////////////////////////////////////////////////////// +// CPrinter - Wrapper class for a HANDLE to a printer + +template +class CPrinterT +{ +public: +// Data members + HANDLE m_hPrinter; + +// Constructor/destructor + CPrinterT(HANDLE hPrinter = NULL) : m_hPrinter(hPrinter) + { } + + ~CPrinterT() + { + ClosePrinter(); + } + +// Operations + CPrinterT& operator =(HANDLE hPrinter) + { + if (hPrinter != m_hPrinter) + { + ClosePrinter(); + m_hPrinter = hPrinter; + } + return *this; + } + + bool IsNull() const { return (m_hPrinter == NULL); } + + bool OpenPrinter(HANDLE hDevNames, const DEVMODE* pDevMode = NULL) + { + bool b = false; + DEVNAMES* pdn = (DEVNAMES*)::GlobalLock(hDevNames); + if (pdn != NULL) + { + LPTSTR lpszPrinterName = (LPTSTR)pdn + pdn->wDeviceOffset; + b = OpenPrinter(lpszPrinterName, pDevMode); + ::GlobalUnlock(hDevNames); + } + return b; + } + + bool OpenPrinter(LPCTSTR lpszPrinterName, const DEVMODE* pDevMode = NULL) + { + ClosePrinter(); + PRINTER_DEFAULTS pdefs = { NULL, (DEVMODE*)pDevMode, PRINTER_ACCESS_USE }; + ::OpenPrinter((LPTSTR) lpszPrinterName, &m_hPrinter, (pDevMode == NULL) ? NULL : &pdefs); + + return (m_hPrinter != NULL); + } + + bool OpenPrinter(LPCTSTR lpszPrinterName, PRINTER_DEFAULTS* pprintdefs) + { + ClosePrinter(); + ::OpenPrinter((LPTSTR) lpszPrinterName, &m_hPrinter, pprintdefs); + return (m_hPrinter != NULL); + } + + bool OpenDefaultPrinter(const DEVMODE* pDevMode = NULL) + { + ClosePrinter(); + const int cchBuff = 512; + TCHAR buffer[cchBuff]; + buffer[0] = 0; + ::GetProfileString(_T("windows"), _T("device"), _T(",,,"), buffer, cchBuff); + int nLen = lstrlen(buffer); + if (nLen != 0) + { + LPTSTR lpsz = buffer; + while (*lpsz) + { + if (*lpsz == _T(',')) + { + *lpsz = 0; + break; + } + lpsz = CharNext(lpsz); + } + PRINTER_DEFAULTS pdefs = { NULL, (DEVMODE*)pDevMode, PRINTER_ACCESS_USE }; + ::OpenPrinter(buffer, &m_hPrinter, (pDevMode == NULL) ? NULL : &pdefs); + } + return m_hPrinter != NULL; + } + + void ClosePrinter() + { + if (m_hPrinter != NULL) + { + if (t_bManaged) + ::ClosePrinter(m_hPrinter); + m_hPrinter = NULL; + } + } + + bool PrinterProperties(HWND hWnd = NULL) + { + if (hWnd == NULL) + hWnd = ::GetActiveWindow(); + return !!::PrinterProperties(hWnd, m_hPrinter); + } + + HANDLE CopyToHDEVNAMES() const + { + HANDLE h = NULL; + CPrinterInfo<5> pinfon5; + CPrinterInfo<2> pinfon2; + LPTSTR lpszPrinterName = NULL; + // Some printers fail for PRINTER_INFO_5 in some situations + if (pinfon5.GetPrinterInfo(m_hPrinter)) + lpszPrinterName = pinfon5.m_pi->pPrinterName; + else if (pinfon2.GetPrinterInfo(m_hPrinter)) + lpszPrinterName = pinfon2.m_pi->pPrinterName; + if (lpszPrinterName != NULL) + { + int nLen = sizeof(DEVNAMES) + (lstrlen(lpszPrinterName) + 1) * sizeof(TCHAR); + h = ::GlobalAlloc(GMEM_MOVEABLE, nLen); + BYTE* pv = (BYTE*)::GlobalLock(h); + DEVNAMES* pdev = (DEVNAMES*)pv; + if (pv != NULL) + { + memset(pv, 0, nLen); + pdev->wDeviceOffset = sizeof(DEVNAMES) / sizeof(TCHAR); + pv = pv + sizeof(DEVNAMES); // now points to end + SecureHelper::strcpy_x((LPTSTR)pv, lstrlen(lpszPrinterName) + 1, lpszPrinterName); + ::GlobalUnlock(h); + } + } + return h; + } + + HDC CreatePrinterDC(const DEVMODE* pdm = NULL) const + { + CPrinterInfo<5> pinfo5; + CPrinterInfo<2> pinfo2; + HDC hDC = NULL; + LPTSTR lpszPrinterName = NULL; + // Some printers fail for PRINTER_INFO_5 in some situations + if (pinfo5.GetPrinterInfo(m_hPrinter)) + lpszPrinterName = pinfo5.m_pi->pPrinterName; + else if (pinfo2.GetPrinterInfo(m_hPrinter)) + lpszPrinterName = pinfo2.m_pi->pPrinterName; + if (lpszPrinterName != NULL) + hDC = ::CreateDC(NULL, lpszPrinterName, NULL, pdm); + return hDC; + } + + HDC CreatePrinterIC(const DEVMODE* pdm = NULL) const + { + CPrinterInfo<5> pinfo5; + CPrinterInfo<2> pinfo2; + HDC hDC = NULL; + LPTSTR lpszPrinterName = NULL; + // Some printers fail for PRINTER_INFO_5 in some situations + if (pinfo5.GetPrinterInfo(m_hPrinter)) + lpszPrinterName = pinfo5.m_pi->pPrinterName; + else if (pinfo2.GetPrinterInfo(m_hPrinter)) + lpszPrinterName = pinfo2.m_pi->pPrinterName; + if (lpszPrinterName != NULL) + hDC = ::CreateIC(NULL, lpszPrinterName, NULL, pdm); + return hDC; + } + + void Attach(HANDLE hPrinter) + { + ClosePrinter(); + m_hPrinter = hPrinter; + } + + HANDLE Detach() + { + HANDLE hPrinter = m_hPrinter; + m_hPrinter = NULL; + return hPrinter; + } + + operator HANDLE() const { return m_hPrinter; } +}; + +typedef CPrinterT CPrinterHandle; +typedef CPrinterT CPrinter; + + +/////////////////////////////////////////////////////////////////////////////// +// CDevMode - Wrapper class for DEVMODE + +template +class CDevModeT +{ +public: +// Data members + HANDLE m_hDevMode; + DEVMODE* m_pDevMode; + +// Constructor/destructor + CDevModeT(HANDLE hDevMode = NULL) : m_hDevMode(hDevMode) + { + m_pDevMode = (m_hDevMode != NULL) ? (DEVMODE*)::GlobalLock(m_hDevMode) : NULL; + } + + ~CDevModeT() + { + Cleanup(); + } + +// Operations + CDevModeT& operator =(HANDLE hDevMode) + { + Attach(hDevMode); + return *this; + } + + void Attach(HANDLE hDevModeNew) + { + Cleanup(); + m_hDevMode = hDevModeNew; + m_pDevMode = (m_hDevMode != NULL) ? (DEVMODE*)::GlobalLock(m_hDevMode) : NULL; + } + + HANDLE Detach() + { + if (m_hDevMode != NULL) + ::GlobalUnlock(m_hDevMode); + HANDLE hDevMode = m_hDevMode; + m_hDevMode = NULL; + return hDevMode; + } + + bool IsNull() const { return (m_hDevMode == NULL); } + + bool CopyFromPrinter(HANDLE hPrinter) + { + CPrinterInfo<2> pinfo; + bool b = pinfo.GetPrinterInfo(hPrinter); + if (b) + b = CopyFromDEVMODE(pinfo.m_pi->pDevMode); + return b; + } + + bool CopyFromDEVMODE(const DEVMODE* pdm) + { + if (pdm == NULL) + return false; + int nSize = pdm->dmSize + pdm->dmDriverExtra; + HANDLE h = ::GlobalAlloc(GMEM_MOVEABLE, nSize); + if (h != NULL) + { + void* p = ::GlobalLock(h); + SecureHelper::memcpy_x(p, nSize, pdm, nSize); + ::GlobalUnlock(h); + } + Attach(h); + return (h != NULL); + } + + bool CopyFromHDEVMODE(HANDLE hdm) + { + bool b = false; + if (hdm != NULL) + { + DEVMODE* pdm = (DEVMODE*)::GlobalLock(hdm); + b = CopyFromDEVMODE(pdm); + ::GlobalUnlock(hdm); + } + return b; + } + + HANDLE CopyToHDEVMODE() + { + if ((m_hDevMode == NULL) || (m_pDevMode == NULL)) + return NULL; + int nSize = m_pDevMode->dmSize + m_pDevMode->dmDriverExtra; + HANDLE h = ::GlobalAlloc(GMEM_MOVEABLE, nSize); + if (h != NULL) + { + void* p = ::GlobalLock(h); + SecureHelper::memcpy_x(p, nSize, m_pDevMode, nSize); + ::GlobalUnlock(h); + } + return h; + } + + // If this devmode was for another printer, this will create a new devmode + // based on the existing devmode, but retargeted at the new printer + bool UpdateForNewPrinter(HANDLE hPrinter) + { + bool bRet = false; + LONG nLen = ::DocumentProperties(NULL, hPrinter, NULL, NULL, NULL, 0); + CTempBuffer buff; + DEVMODE* pdm = buff.AllocateBytes(nLen); + if(pdm != NULL) + { + memset(pdm, 0, nLen); + LONG l = ::DocumentProperties(NULL, hPrinter, NULL, pdm, m_pDevMode, DM_IN_BUFFER | DM_OUT_BUFFER); + if (l == IDOK) + bRet = CopyFromDEVMODE(pdm); + } + + return bRet; + } + + bool DocumentProperties(HANDLE hPrinter, HWND hWnd = NULL) + { + CPrinterInfo<1> pi; + pi.GetPrinterInfo(hPrinter); + if (hWnd == NULL) + hWnd = ::GetActiveWindow(); + + bool bRet = false; + LONG nLen = ::DocumentProperties(hWnd, hPrinter, pi.m_pi->pName, NULL, NULL, 0); + CTempBuffer buff; + DEVMODE* pdm = buff.AllocateBytes(nLen); + if(pdm != NULL) + { + memset(pdm, 0, nLen); + LONG l = ::DocumentProperties(hWnd, hPrinter, pi.m_pi->pName, pdm, m_pDevMode, DM_IN_BUFFER | DM_OUT_BUFFER | DM_PROMPT); + if (l == IDOK) + bRet = CopyFromDEVMODE(pdm); + } + + return bRet; + } + + operator HANDLE() const { return m_hDevMode; } + + operator DEVMODE*() const { return m_pDevMode; } + +// Implementation + void Cleanup() + { + if (m_hDevMode != NULL) + { + ::GlobalUnlock(m_hDevMode); + if(t_bManaged) + ::GlobalFree(m_hDevMode); + m_hDevMode = NULL; + } + } +}; + +typedef CDevModeT CDevModeHandle; +typedef CDevModeT CDevMode; + + +/////////////////////////////////////////////////////////////////////////////// +// CPrinterDC + +class CPrinterDC : public CDC +{ +public: +// Constructors/destructor + CPrinterDC() + { + CPrinter printer; + printer.OpenDefaultPrinter(); + Attach(printer.CreatePrinterDC()); + ATLASSERT(m_hDC != NULL); + } + + CPrinterDC(HANDLE hPrinter, const DEVMODE* pdm = NULL) + { + CPrinterHandle p; + p.Attach(hPrinter); + Attach(p.CreatePrinterDC(pdm)); + ATLASSERT(m_hDC != NULL); + } + + ~CPrinterDC() + { + DeleteDC(); + } +}; + + +/////////////////////////////////////////////////////////////////////////////// +// CPrintJob - Wraps a set of tasks for a specific printer (StartDoc/EndDoc) +// Handles aborting, background printing + +// Defines callbacks used by CPrintJob (not a COM interface) +class ATL_NO_VTABLE IPrintJobInfo +{ +public: + virtual void BeginPrintJob(HDC hDC) = 0; // allocate handles needed, etc. + virtual void EndPrintJob(HDC hDC, bool bAborted) = 0; // free handles, etc. + virtual void PrePrintPage(UINT nPage, HDC hDC) = 0; + virtual bool PrintPage(UINT nPage, HDC hDC) = 0; + virtual void PostPrintPage(UINT nPage, HDC hDC) = 0; + // If you want per page devmodes, return the DEVMODE* to use for nPage. + // You can optimize by only returning a new DEVMODE* when it is different + // from the one for nLastPage, otherwise return NULL. + // When nLastPage==0, the current DEVMODE* will be the default passed to + // StartPrintJob. + // Note: During print preview, nLastPage will always be "0". + virtual DEVMODE* GetNewDevModeForPage(UINT nLastPage, UINT nPage) = 0; + virtual bool IsValidPage(UINT nPage) = 0; +}; + +// Provides a default implementatin for IPrintJobInfo +// Typically, MI'd into a document or view class +class ATL_NO_VTABLE CPrintJobInfo : public IPrintJobInfo +{ +public: + virtual void BeginPrintJob(HDC /*hDC*/) // allocate handles needed, etc + { + } + + virtual void EndPrintJob(HDC /*hDC*/, bool /*bAborted*/) // free handles, etc + { + } + + virtual void PrePrintPage(UINT /*nPage*/, HDC hDC) + { + m_nPJState = ::SaveDC(hDC); + } + + virtual bool PrintPage(UINT /*nPage*/, HDC /*hDC*/) = 0; + + virtual void PostPrintPage(UINT /*nPage*/, HDC hDC) + { + RestoreDC(hDC, m_nPJState); + } + + virtual DEVMODE* GetNewDevModeForPage(UINT /*nLastPage*/, UINT /*nPage*/) + { + return NULL; + } + + virtual bool IsValidPage(UINT /*nPage*/) + { + return true; + } + +// Implementation - data + int m_nPJState; +}; + + +class CPrintJob +{ +public: +// Data members + CPrinterHandle m_printer; + IPrintJobInfo* m_pInfo; + DEVMODE* m_pDefDevMode; + DOCINFO m_docinfo; + int m_nJobID; + bool m_bCancel; + bool m_bComplete; + unsigned long m_nStartPage; + unsigned long m_nEndPage; + +// Constructor/destructor + CPrintJob() : m_nJobID(0), m_bCancel(false), m_bComplete(true) + { } + + ~CPrintJob() + { + ATLASSERT(IsJobComplete()); // premature destruction? + } + +// Operations + bool IsJobComplete() const + { + return m_bComplete; + } + + bool StartPrintJob(bool bBackground, HANDLE hPrinter, DEVMODE* pDefaultDevMode, + IPrintJobInfo* pInfo, LPCTSTR lpszDocName, + unsigned long nStartPage, unsigned long nEndPage, + bool bPrintToFile = false, LPCTSTR lpstrOutputFile = NULL) + { + ATLASSERT(m_bComplete); // previous job not done yet? + if (pInfo == NULL) + return false; + + memset(&m_docinfo, 0, sizeof(m_docinfo)); + m_docinfo.cbSize = sizeof(m_docinfo); + m_docinfo.lpszDocName = lpszDocName; + m_pInfo = pInfo; + m_nStartPage = nStartPage; + m_nEndPage = nEndPage; + m_printer.Attach(hPrinter); + m_pDefDevMode = pDefaultDevMode; + m_bComplete = false; + + if(bPrintToFile) + m_docinfo.lpszOutput = (lpstrOutputFile != NULL) ? lpstrOutputFile : _T("FILE:"); + + if (!bBackground) + { + m_bComplete = true; + return StartHelper(); + } + + // Create a thread and return + DWORD dwThreadID = 0; +#if !defined(_ATL_MIN_CRT) && defined(_MT) + HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, (UINT (WINAPI*)(void*))StartProc, this, 0, (UINT*)&dwThreadID); +#else + HANDLE hThread = ::CreateThread(NULL, 0, StartProc, (void*)this, 0, &dwThreadID); +#endif + if (hThread == NULL) + return false; + + ::CloseHandle(hThread); + + return true; + } + +// Implementation + static DWORD WINAPI StartProc(void* p) + { + CPrintJob* pThis = (CPrintJob*)p; + pThis->StartHelper(); + pThis->m_bComplete = true; + return 0; + } + + bool StartHelper() + { + CDC dcPrinter; + dcPrinter.Attach(m_printer.CreatePrinterDC(m_pDefDevMode)); + if (dcPrinter.IsNull()) + return false; + + m_nJobID = ::StartDoc(dcPrinter, &m_docinfo); + if (m_nJobID <= 0) + return false; + + m_pInfo->BeginPrintJob(dcPrinter); + + // print all the pages now + unsigned long nLastPage = 0; + for (unsigned long nPage = m_nStartPage; nPage <= m_nEndPage; nPage++) + { + if (!m_pInfo->IsValidPage(nPage)) + break; + DEVMODE* pdm = m_pInfo->GetNewDevModeForPage(nLastPage, nPage); + if (pdm != NULL) + dcPrinter.ResetDC(pdm); + dcPrinter.StartPage(); + m_pInfo->PrePrintPage(nPage, dcPrinter); + if (!m_pInfo->PrintPage(nPage, dcPrinter)) + m_bCancel = true; + m_pInfo->PostPrintPage(nPage, dcPrinter); + dcPrinter.EndPage(); + if (m_bCancel) + break; + nLastPage = nPage; + } + + m_pInfo->EndPrintJob(dcPrinter, m_bCancel); + if (m_bCancel) + ::AbortDoc(dcPrinter); + else + ::EndDoc(dcPrinter); + m_nJobID = 0; + return true; + } + + // Cancels a print job. Can be called asynchronously. + void CancelPrintJob() + { + m_bCancel = true; + } +}; + + +/////////////////////////////////////////////////////////////////////////////// +// CPrintPreview - Adds print preview support to an existing window + +class CPrintPreview +{ +public: +// Data members + IPrintJobInfo* m_pInfo; + CPrinterHandle m_printer; + CEnhMetaFile m_meta; + DEVMODE* m_pDefDevMode; + DEVMODE* m_pCurDevMode; + SIZE m_sizeCurPhysOffset; + +// Constructor + CPrintPreview() : m_pInfo(NULL), m_pDefDevMode(NULL), m_pCurDevMode(NULL) + { + m_sizeCurPhysOffset.cx = 0; + m_sizeCurPhysOffset.cy = 0; + } + +// Operations + void SetPrintPreviewInfo(HANDLE hPrinter, DEVMODE* pDefaultDevMode, IPrintJobInfo* pji) + { + m_printer.Attach(hPrinter); + m_pDefDevMode = pDefaultDevMode; + m_pInfo = pji; + m_nCurPage = 0; + m_pCurDevMode = NULL; + } + + void SetEnhMetaFile(HENHMETAFILE hEMF) + { + m_meta = hEMF; + } + + void SetPage(int nPage) + { + if (!m_pInfo->IsValidPage(nPage)) + return; + m_nCurPage = nPage; + m_pCurDevMode = m_pInfo->GetNewDevModeForPage(0, nPage); + if (m_pCurDevMode == NULL) + m_pCurDevMode = m_pDefDevMode; + CDC dcPrinter = m_printer.CreatePrinterDC(m_pCurDevMode); + + int iWidth = dcPrinter.GetDeviceCaps(PHYSICALWIDTH); + int iHeight = dcPrinter.GetDeviceCaps(PHYSICALHEIGHT); + int nLogx = dcPrinter.GetDeviceCaps(LOGPIXELSX); + int nLogy = dcPrinter.GetDeviceCaps(LOGPIXELSY); + + RECT rcMM = { 0, 0, ::MulDiv(iWidth, 2540, nLogx), ::MulDiv(iHeight, 2540, nLogy) }; + + m_sizeCurPhysOffset.cx = dcPrinter.GetDeviceCaps(PHYSICALOFFSETX); + m_sizeCurPhysOffset.cy = dcPrinter.GetDeviceCaps(PHYSICALOFFSETY); + + CEnhMetaFileDC dcMeta(dcPrinter, &rcMM); + m_pInfo->PrePrintPage(nPage, dcMeta); + m_pInfo->PrintPage(nPage, dcMeta); + m_pInfo->PostPrintPage(nPage, dcMeta); + m_meta.Attach(dcMeta.Close()); + } + + void GetPageRect(RECT& rc, LPRECT prc) + { + int x1 = rc.right-rc.left; + int y1 = rc.bottom - rc.top; + if ((x1 < 0) || (y1 < 0)) + return; + + CEnhMetaFileInfo emfinfo(m_meta); + ENHMETAHEADER* pmh = emfinfo.GetEnhMetaFileHeader(); + + // Compute whether we are OK vertically or horizontally + int x2 = pmh->szlDevice.cx; + int y2 = pmh->szlDevice.cy; + int y1p = MulDiv(x1, y2, x2); + int x1p = MulDiv(y1, x2, y2); + ATLASSERT((x1p <= x1) || (y1p <= y1)); + if (x1p <= x1) + { + prc->left = rc.left + (x1 - x1p) / 2; + prc->right = prc->left + x1p; + prc->top = rc.top; + prc->bottom = rc.bottom; + } + else + { + prc->left = rc.left; + prc->right = rc.right; + prc->top = rc.top + (y1 - y1p) / 2; + prc->bottom = prc->top + y1p; + } + } + +// Painting helpers + void DoPaint(CDCHandle dc) + { + // this one is not used + } + + void DoPaint(CDCHandle dc, RECT& rc) + { + CEnhMetaFileInfo emfinfo(m_meta); + ENHMETAHEADER* pmh = emfinfo.GetEnhMetaFileHeader(); + int nOffsetX = MulDiv(m_sizeCurPhysOffset.cx, rc.right-rc.left, pmh->szlDevice.cx); + int nOffsetY = MulDiv(m_sizeCurPhysOffset.cy, rc.bottom-rc.top, pmh->szlDevice.cy); + + dc.OffsetWindowOrg(-nOffsetX, -nOffsetY); + dc.PlayMetaFile(m_meta, &rc); + } + +// Implementation - data + int m_nCurPage; +}; + + +/////////////////////////////////////////////////////////////////////////////// +// CPrintPreviewWindow - Implements a print preview window + +template +class ATL_NO_VTABLE CPrintPreviewWindowImpl : public ATL::CWindowImpl, public CPrintPreview +{ +public: + DECLARE_WND_CLASS_EX(NULL, CS_VREDRAW | CS_HREDRAW, -1) + + enum { m_cxOffset = 10, m_cyOffset = 10 }; + +// Constructor + CPrintPreviewWindowImpl() : m_nMaxPage(0), m_nMinPage(0) + { } + +// Operations + void SetPrintPreviewInfo(HANDLE hPrinter, DEVMODE* pDefaultDevMode, + IPrintJobInfo* pji, int nMinPage, int nMaxPage) + { + CPrintPreview::SetPrintPreviewInfo(hPrinter, pDefaultDevMode, pji); + m_nMinPage = nMinPage; + m_nMaxPage = nMaxPage; + } + + bool NextPage() + { + if (m_nCurPage == m_nMaxPage) + return false; + SetPage(m_nCurPage + 1); + Invalidate(); + return true; + } + + bool PrevPage() + { + if (m_nCurPage == m_nMinPage) + return false; + if (m_nCurPage == 0) + return false; + SetPage(m_nCurPage - 1); + Invalidate(); + return true; + } + +// Message map and handlers + BEGIN_MSG_MAP(CPrintPreviewWindowImpl) + MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBkgnd) + MESSAGE_HANDLER(WM_PAINT, OnPaint) + MESSAGE_HANDLER(WM_PRINTCLIENT, OnPaint) + END_MSG_MAP() + + LRESULT OnEraseBkgnd(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) + { + return 1; // no need for the background + } + + LRESULT OnPaint(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/) + { + T* pT = static_cast(this); + RECT rc = { 0 }; + + if(wParam != NULL) + { + pT->DoPrePaint((HDC)wParam, rc); + pT->DoPaint((HDC)wParam, rc); + } + else + { + CPaintDC dc(m_hWnd); + pT->DoPrePaint(dc.m_hDC, rc); + pT->DoPaint(dc.m_hDC, rc); + } + + return 0; + } + +// Painting helper + void DoPrePaint(CDCHandle dc, RECT& rc) + { + RECT rcClient = { 0 }; + GetClientRect(&rcClient); + RECT rcArea = rcClient; + T* pT = static_cast(this); + pT; // avoid level 4 warning + ::InflateRect(&rcArea, -pT->m_cxOffset, -pT->m_cyOffset); + if (rcArea.left > rcArea.right) + rcArea.right = rcArea.left; + if (rcArea.top > rcArea.bottom) + rcArea.bottom = rcArea.top; + GetPageRect(rcArea, &rc); + CRgn rgn1, rgn2; + rgn1.CreateRectRgnIndirect(&rc); + rgn2.CreateRectRgnIndirect(&rcClient); + rgn2.CombineRgn(rgn1, RGN_DIFF); + dc.SelectClipRgn(rgn2); + dc.FillRect(&rcClient, COLOR_BTNSHADOW); + dc.SelectClipRgn(NULL); + dc.FillRect(&rc, (HBRUSH)::GetStockObject(WHITE_BRUSH)); + } + +// Implementation - data + int m_nMinPage; + int m_nMaxPage; +}; + + +class CPrintPreviewWindow : public CPrintPreviewWindowImpl +{ +public: + DECLARE_WND_CLASS_EX(_T("WTL_PrintPreview"), CS_VREDRAW | CS_HREDRAW, -1) +}; + + +/////////////////////////////////////////////////////////////////////////////// +// CZoomPrintPreviewWindowImpl - Implements print preview window with zooming + +#ifdef __ATLSCRL_H__ + +template +class ATL_NO_VTABLE CZoomPrintPreviewWindowImpl : public CPrintPreviewWindowImpl< T, TBase, TWinTraits >, public CZoomScrollImpl< T > +{ +public: + bool m_bSized; + + CZoomPrintPreviewWindowImpl() + { + SetScrollExtendedStyle(SCRL_DISABLENOSCROLL); + InitZoom(); + } + + // should be called to reset data members before recreating window + void InitZoom() + { + m_bSized = false; + m_nZoomMode = ZOOMMODE_OFF; + m_fZoomScaleMin = 1.0; + m_fZoomScale = 1.0; + } + + BEGIN_MSG_MAP(CZoomPrintPreviewWindowImpl) + MESSAGE_HANDLER(WM_SETCURSOR, CZoomScrollImpl< T >::OnSetCursor) + MESSAGE_HANDLER(WM_VSCROLL, CScrollImpl< T >::OnVScroll) + MESSAGE_HANDLER(WM_HSCROLL, CScrollImpl< T >::OnHScroll) + MESSAGE_HANDLER(WM_MOUSEWHEEL, CScrollImpl< T >::OnMouseWheel) +#if !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) + MESSAGE_HANDLER(m_uMsgMouseWheel, CScrollImpl< T >::OnMouseWheel) +#endif // !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) + MESSAGE_HANDLER(WM_SETTINGCHANGE, CScrollImpl< T >::OnSettingChange) + MESSAGE_HANDLER(WM_LBUTTONDOWN, CZoomScrollImpl< T >::OnLButtonDown) + MESSAGE_HANDLER(WM_MOUSEMOVE, CZoomScrollImpl< T >::OnMouseMove) + MESSAGE_HANDLER(WM_LBUTTONUP, CZoomScrollImpl< T >::OnLButtonUp) + MESSAGE_HANDLER(WM_CAPTURECHANGED, CZoomScrollImpl< T >::OnCaptureChanged) + MESSAGE_HANDLER(WM_SIZE, OnSize) + MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBkgnd) + MESSAGE_HANDLER(WM_PAINT, OnPaint) + MESSAGE_HANDLER(WM_PRINTCLIENT, OnPaint) + ALT_MSG_MAP(1) + COMMAND_ID_HANDLER(ID_SCROLL_UP, CScrollImpl< T >::OnScrollUp) + COMMAND_ID_HANDLER(ID_SCROLL_DOWN, CScrollImpl< T >::OnScrollDown) + COMMAND_ID_HANDLER(ID_SCROLL_PAGE_UP, CScrollImpl< T >::OnScrollPageUp) + COMMAND_ID_HANDLER(ID_SCROLL_PAGE_DOWN, CScrollImpl< T >::OnScrollPageDown) + COMMAND_ID_HANDLER(ID_SCROLL_TOP, CScrollImpl< T >::OnScrollTop) + COMMAND_ID_HANDLER(ID_SCROLL_BOTTOM, CScrollImpl< T >::OnScrollBottom) + COMMAND_ID_HANDLER(ID_SCROLL_LEFT, CScrollImpl< T >::OnScrollLeft) + COMMAND_ID_HANDLER(ID_SCROLL_RIGHT, CScrollImpl< T >::OnScrollRight) + COMMAND_ID_HANDLER(ID_SCROLL_PAGE_LEFT, CScrollImpl< T >::OnScrollPageLeft) + COMMAND_ID_HANDLER(ID_SCROLL_PAGE_RIGHT, CScrollImpl< T >::OnScrollPageRight) + COMMAND_ID_HANDLER(ID_SCROLL_ALL_LEFT, CScrollImpl< T >::OnScrollAllLeft) + COMMAND_ID_HANDLER(ID_SCROLL_ALL_RIGHT, CScrollImpl< T >::OnScrollAllRight) + END_MSG_MAP() + + LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) + { + SIZE sizeClient = {GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)}; + POINT ptOffset = m_ptOffset; + SIZE sizeAll = m_sizeAll; + SetScrollSize(sizeClient); + if(sizeAll.cx > 0) + ptOffset.x = ::MulDiv(ptOffset.x, m_sizeAll.cx, sizeAll.cx); + if(sizeAll.cy > 0) + ptOffset.y = ::MulDiv(ptOffset.y, m_sizeAll.cy, sizeAll.cy); + SetScrollOffset(ptOffset); + CScrollImpl< T >::OnSize(uMsg, wParam, lParam, bHandled); + if(!m_bSized) + { + m_bSized = true; + T* pT = static_cast(this); + pT->ShowScrollBar(SB_HORZ, TRUE); + pT->ShowScrollBar(SB_VERT, TRUE); + } + return 0; + } + + LRESULT OnEraseBkgnd(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) + { + return 1; + } + + LRESULT OnPaint(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/) + { + T* pT = static_cast(this); + RECT rc = { 0 }; + + if(wParam != NULL) + { + CDCHandle dc = (HDC)wParam; + int nMapModeSav = dc.GetMapMode(); + dc.SetMapMode(MM_ANISOTROPIC); + SIZE szWindowExt = { 0, 0 }; + dc.SetWindowExt(m_sizeLogAll, &szWindowExt); + SIZE szViewportExt = { 0, 0 }; + dc.SetViewportExt(m_sizeAll, &szViewportExt); + POINT ptViewportOrg = { 0, 0 }; + dc.SetViewportOrg(-m_ptOffset.x, -m_ptOffset.y, &ptViewportOrg); + + pT->DoPrePaint(dc, rc); + pT->DoPaint(dc, rc); + + dc.SetMapMode(nMapModeSav); + dc.SetWindowExt(szWindowExt); + dc.SetViewportExt(szViewportExt); + dc.SetViewportOrg(ptViewportOrg); + } + else + { + CPaintDC dc(pT->m_hWnd); + pT->PrepareDC(dc.m_hDC); + pT->DoPrePaint(dc.m_hDC, rc); + pT->DoPaint(dc.m_hDC, rc); + } + + return 0; + } + + // Painting helpers + void DoPaint(CDCHandle dc) + { + // this one is not used + } + + void DoPrePaint(CDCHandle dc, RECT& rc) + { + RECT rcClient; + GetClientRect(&rcClient); + RECT rcArea = rcClient; + T* pT = static_cast(this); + pT; // avoid level 4 warning + ::InflateRect(&rcArea, -pT->m_cxOffset, -pT->m_cyOffset); + if (rcArea.left > rcArea.right) + rcArea.right = rcArea.left; + if (rcArea.top > rcArea.bottom) + rcArea.bottom = rcArea.top; + GetPageRect(rcArea, &rc); + HBRUSH hbrOld = dc.SelectBrush(::GetSysColorBrush(COLOR_BTNSHADOW)); + dc.PatBlt(rcClient.left, rcClient.top, rc.left - rcClient.left, rcClient.bottom - rcClient.top, PATCOPY); + dc.PatBlt(rc.left, rcClient.top, rc.right - rc.left, rc.top - rcClient.top, PATCOPY); + dc.PatBlt(rc.right, rcClient.top, rcClient.right - rc.right, rcClient.bottom - rcClient.top, PATCOPY); + dc.PatBlt(rc.left, rc.bottom, rc.right - rc.left, rcClient.bottom - rc.bottom, PATCOPY); + dc.SelectBrush((HBRUSH)::GetStockObject(WHITE_BRUSH)); + dc.PatBlt(rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, PATCOPY); + dc.SelectBrush(::GetSysColorBrush(COLOR_3DDKSHADOW)); + dc.PatBlt(rc.right, rc.top + 4, 4, rc.bottom - rc.top, PATCOPY); + dc.PatBlt(rc.left + 4, rc.bottom, rc.right - rc.left, 4, PATCOPY); + dc.SelectBrush(hbrOld); + } + + void DoPaint(CDCHandle dc, RECT& rc) + { + CEnhMetaFileInfo emfinfo(m_meta); + ENHMETAHEADER* pmh = emfinfo.GetEnhMetaFileHeader(); + int nOffsetX = MulDiv(m_sizeCurPhysOffset.cx, rc.right-rc.left, pmh->szlDevice.cx); + int nOffsetY = MulDiv(m_sizeCurPhysOffset.cy, rc.bottom-rc.top, pmh->szlDevice.cy); + + dc.OffsetWindowOrg(-nOffsetX, -nOffsetY); + dc.PlayMetaFile(m_meta, &rc); + } +}; + +class CZoomPrintPreviewWindow : public CZoomPrintPreviewWindowImpl +{ +public: + DECLARE_WND_CLASS_EX(_T("WTL_ZoomPrintPreview"), CS_VREDRAW | CS_HREDRAW, -1) +}; + +#endif // __ATLSCRL_H__ + +}; // namespace WTL + +#endif // __ATLPRINT_H__ diff --git a/Externals/WTL80/atlres.h b/Externals/WTL80/atlres.h new file mode 100644 index 0000000000..ae058876ae --- /dev/null +++ b/Externals/WTL80/atlres.h @@ -0,0 +1,262 @@ +// Windows Template Library - WTL version 8.0 +// Copyright (C) Microsoft Corporation. All rights reserved. +// +// This file is a part of the Windows Template Library. +// The use and distribution terms for this software are covered by the +// Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php) +// which can be found in the file CPL.TXT at the root of this distribution. +// By using this software in any fashion, you are agreeing to be bound by +// the terms of this license. You must not remove this notice, or +// any other, from this software. + +#ifndef __ATLRES_H__ +#define __ATLRES_H__ + +#pragma once + +#if defined(_WIN32_WCE) && !defined(__ATLRESCE_H__) + #error Use atlresCE.h instead of atlres.h for Windows CE +#endif + + +#ifdef RC_INVOKED +#ifndef _INC_WINDOWS + + #define _INC_WINDOWS + + #ifndef _WIN32_WCE + #define VS_VERSION_INFO 1 + + #ifdef APSTUDIO_INVOKED + #define APSTUDIO_HIDDEN_SYMBOLS // Ignore following symbols + #endif // APSTUDIO_INVOKED + + #ifndef WINVER + #define WINVER 0x0400 // default to Windows Version 4.0 + #endif // !WINVER + + #include + + // operation messages sent to DLGINIT + #define LB_ADDSTRING (WM_USER+1) + #define CB_ADDSTRING (WM_USER+3) + #endif // !_WIN32_WCE + + #ifdef APSTUDIO_INVOKED + #undef APSTUDIO_HIDDEN_SYMBOLS + #endif // APSTUDIO_INVOKED + + #ifdef IDC_STATIC + #undef IDC_STATIC + #endif // IDC_STATIC + #define IDC_STATIC (-1) + +#endif // !_INC_WINDOWS +#endif // RC_INVOKED + +#ifdef APSTUDIO_INVOKED + #define APSTUDIO_HIDDEN_SYMBOLS +#endif // APSTUDIO_INVOKED + +/////////////////////////////////////////////////////////////////////////////// +// ATL resource types + +#ifndef RC_INVOKED + #define RT_DLGINIT MAKEINTRESOURCE(240) + #define RT_TOOLBAR MAKEINTRESOURCE(241) +#endif // RC_INVOKED + +/////////////////////////////////////////////////////////////////////////////// + +#ifdef APSTUDIO_INVOKED + #undef APSTUDIO_HIDDEN_SYMBOLS +#endif // APSTUDIO_INVOKED + +/////////////////////////////////////////////////////////////////////////////// +// Standard window components + +#define ID_SEPARATOR 0 // special separator value +#define ID_DEFAULT_PANE 0 // default status bar pane + +#ifndef RC_INVOKED // code only +// standard control bars (IDW = window ID) + #define ATL_IDW_TOOLBAR 0xE800 // main Toolbar for window + #define ATL_IDW_STATUS_BAR 0xE801 // Status bar window + #define ATL_IDW_COMMAND_BAR 0xE802 // Command bar window + +// parts of a frame window + #define ATL_IDW_CLIENT 0xE900 + #define ATL_IDW_PANE_FIRST 0xE900 // first pane (256 max) + #define ATL_IDW_PANE_LAST 0xE9FF + #define ATL_IDW_HSCROLL_FIRST 0xEA00 // first Horz scrollbar (16 max) + #define ATL_IDW_VSCROLL_FIRST 0xEA10 // first Vert scrollbar (16 max) + + #define ATL_IDW_SIZE_BOX 0xEA20 // size box for splitters + #define ATL_IDW_PANE_SAVE 0xEA21 // to shift ATL_IDW_PANE_FIRST + +// bands for a rebar + #define ATL_IDW_BAND_FIRST 0xEB00 + #define ATL_IDW_BAND_LAST 0xEBFF +#endif // !RC_INVOKED + +/////////////////////////////////////////////////////////////////////////////// +// Standard Commands + +// File commands +#define ID_FILE_NEW 0xE100 +#define ID_FILE_OPEN 0xE101 +#define ID_FILE_CLOSE 0xE102 +#define ID_FILE_SAVE 0xE103 +#define ID_FILE_SAVE_AS 0xE104 +#define ID_FILE_PAGE_SETUP 0xE105 +#define ID_FILE_PRINT_SETUP 0xE106 +#define ID_FILE_PRINT 0xE107 +#define ID_FILE_PRINT_DIRECT 0xE108 +#define ID_FILE_PRINT_PREVIEW 0xE109 +#define ID_FILE_UPDATE 0xE10A +#define ID_FILE_SAVE_COPY_AS 0xE10B +#define ID_FILE_SEND_MAIL 0xE10C + +#define ID_FILE_MRU_FIRST 0xE110 +#define ID_FILE_MRU_FILE1 0xE110 // range - 16 max +#define ID_FILE_MRU_FILE2 0xE111 +#define ID_FILE_MRU_FILE3 0xE112 +#define ID_FILE_MRU_FILE4 0xE113 +#define ID_FILE_MRU_FILE5 0xE114 +#define ID_FILE_MRU_FILE6 0xE115 +#define ID_FILE_MRU_FILE7 0xE116 +#define ID_FILE_MRU_FILE8 0xE117 +#define ID_FILE_MRU_FILE9 0xE118 +#define ID_FILE_MRU_FILE10 0xE119 +#define ID_FILE_MRU_FILE11 0xE11A +#define ID_FILE_MRU_FILE12 0xE11B +#define ID_FILE_MRU_FILE13 0xE11C +#define ID_FILE_MRU_FILE14 0xE11D +#define ID_FILE_MRU_FILE15 0xE11E +#define ID_FILE_MRU_FILE16 0xE11F +#define ID_FILE_MRU_LAST 0xE11F + +// Edit commands +#define ID_EDIT_CLEAR 0xE120 +#define ID_EDIT_CLEAR_ALL 0xE121 +#define ID_EDIT_COPY 0xE122 +#define ID_EDIT_CUT 0xE123 +#define ID_EDIT_FIND 0xE124 +#define ID_EDIT_PASTE 0xE125 +#define ID_EDIT_PASTE_LINK 0xE126 +#define ID_EDIT_PASTE_SPECIAL 0xE127 +#define ID_EDIT_REPEAT 0xE128 +#define ID_EDIT_REPLACE 0xE129 +#define ID_EDIT_SELECT_ALL 0xE12A +#define ID_EDIT_UNDO 0xE12B +#define ID_EDIT_REDO 0xE12C + +// Window commands +#define ID_WINDOW_NEW 0xE130 +#define ID_WINDOW_ARRANGE 0xE131 +#define ID_WINDOW_CASCADE 0xE132 +#define ID_WINDOW_TILE_HORZ 0xE133 +#define ID_WINDOW_TILE_VERT 0xE134 +#define ID_WINDOW_SPLIT 0xE135 +#ifndef RC_INVOKED // code only + #define ATL_IDM_WINDOW_FIRST 0xE130 + #define ATL_IDM_WINDOW_LAST 0xE13F + #define ATL_IDM_FIRST_MDICHILD 0xFF00 // window list starts here + #define ATL_IDM_LAST_MDICHILD 0xFFFD +#endif // !RC_INVOKED +// TabView +#define ID_WINDOW_TABFIRST 0xFF00 // = ATL_IDM_FIRST_MDICHILD +#define ID_WINDOW_TABLAST 0xFFFD +#define ID_WINDOW_SHOWTABLIST 0xFFFE + +// Help and App commands +#define ID_APP_ABOUT 0xE140 +#define ID_APP_EXIT 0xE141 +#define ID_HELP_INDEX 0xE142 +#define ID_HELP_FINDER 0xE143 +#define ID_HELP_USING 0xE144 +#define ID_CONTEXT_HELP 0xE145 // shift-F1 +// special commands for processing help +#define ID_HELP 0xE146 // first attempt for F1 +#define ID_DEFAULT_HELP 0xE147 // last attempt + +// Misc +#define ID_NEXT_PANE 0xE150 +#define ID_PREV_PANE 0xE151 +#define ID_PANE_CLOSE 0xE152 + +// Format +#define ID_FORMAT_FONT 0xE160 + +// Scroll +#define ID_SCROLL_UP 0xE170 +#define ID_SCROLL_DOWN 0xE171 +#define ID_SCROLL_PAGE_UP 0xE172 +#define ID_SCROLL_PAGE_DOWN 0xE173 +#define ID_SCROLL_TOP 0xE174 +#define ID_SCROLL_BOTTOM 0xE175 +#define ID_SCROLL_LEFT 0xE176 +#define ID_SCROLL_RIGHT 0xE177 +#define ID_SCROLL_PAGE_LEFT 0xE178 +#define ID_SCROLL_PAGE_RIGHT 0xE179 +#define ID_SCROLL_ALL_LEFT 0xE17A +#define ID_SCROLL_ALL_RIGHT 0xE17B + +// OLE commands +#define ID_OLE_INSERT_NEW 0xE200 +#define ID_OLE_EDIT_LINKS 0xE201 +#define ID_OLE_EDIT_CONVERT 0xE202 +#define ID_OLE_EDIT_CHANGE_ICON 0xE203 +#define ID_OLE_EDIT_PROPERTIES 0xE204 +#define ID_OLE_VERB_FIRST 0xE210 // range - 16 max +#ifndef RC_INVOKED // code only + #define ID_OLE_VERB_LAST 0xE21F +#endif // !RC_INVOKED + +// View commands (same number used as IDW used for toolbar and status bar) +#define ID_VIEW_TOOLBAR 0xE800 +#define ID_VIEW_STATUS_BAR 0xE801 +#define ID_VIEW_REFRESH 0xE803 + +/////////////////////////////////////////////////////////////////////////////// +// Standard control IDs + +#ifdef IDC_STATIC + #undef IDC_STATIC +#endif // IDC_STATIC +#define IDC_STATIC (-1) // all static controls + +/////////////////////////////////////////////////////////////////////////////// +// Standard string error/warnings + +// idle status bar message +#define ATL_IDS_IDLEMESSAGE 0xE001 + +#ifndef RC_INVOKED // code only + #define ATL_IDS_SCFIRST 0xEF00 +#endif // !RC_INVOKED + +#define ATL_IDS_SCSIZE 0xEF00 +#define ATL_IDS_SCMOVE 0xEF01 +#define ATL_IDS_SCMINIMIZE 0xEF02 +#define ATL_IDS_SCMAXIMIZE 0xEF03 +#define ATL_IDS_SCNEXTWINDOW 0xEF04 +#define ATL_IDS_SCPREVWINDOW 0xEF05 +#define ATL_IDS_SCCLOSE 0xEF06 +#define ATL_IDS_SCRESTORE 0xEF12 +#define ATL_IDS_SCTASKLIST 0xEF13 + +#define ATL_IDS_MDICHILD 0xEF1F +#define ATL_IDS_MRU_FILE 0xEFDA + +/////////////////////////////////////////////////////////////////////////////// +// Misc. control IDs + +// Property Sheet control id's (determined with Spy++) +#define ID_APPLY_NOW 0x3021 +#define ID_WIZBACK 0x3023 +#define ID_WIZNEXT 0x3024 +#define ID_WIZFINISH 0x3025 +#define ATL_IDC_TAB_CONTROL 0x3020 + +#endif // __ATLRES_H__ diff --git a/Externals/WTL80/atlresce.h b/Externals/WTL80/atlresce.h new file mode 100644 index 0000000000..64346b1e5e --- /dev/null +++ b/Externals/WTL80/atlresce.h @@ -0,0 +1,93 @@ +// Windows Template Library - WTL version 8.0 +// Copyright (C) Microsoft Corporation. All rights reserved. +// +// This file is a part of the Windows Template Library. +// The use and distribution terms for this software are covered by the +// Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php) +// which can be found in the file CPL.TXT at the root of this distribution. +// By using this software in any fashion, you are agreeing to be bound by +// the terms of this license. You must not remove this notice, or +// any other, from this software. + +#ifndef __ATLRESCE_H__ +#define __ATLRESCE_H__ + +#pragma once + +#ifndef _WIN32_WCE + #error atlresCE.h is only for Windows CE +#endif + + +#ifdef RC_INVOKED +#ifndef _INC_WINDOWS + + #define VS_VERSION_INFO 1 + + #ifdef APSTUDIO_INVOKED + #define APSTUDIO_HIDDEN_SYMBOLS // Ignore following symbols + #endif // APSTUDIO_INVOKED + + #ifndef WINVER + #define WINVER 0x0400 // default to Windows Version 4.0 + #endif // !WINVER + + #if !defined(WCEOLE_ENABLE_DIALOGEX) + #define DIALOGEX DIALOG DISCARDABLE + #endif + + #include + #define SHMENUBAR RCDATA + + #if defined(SHELLSDK_MODULES_AYGSHELL) + #include + #else + #define NOMENU 0xFFFF + #define IDS_SHNEW 1 + #define IDM_SHAREDNEW 10 + #define IDM_SHAREDNEWDEFAULT 11 + #endif + #ifndef I_IMAGENONE + #define I_IMAGENONE (-2) + #endif + + #include + +#endif // !_INC_WINDOWS +#endif // RC_INVOKED + +#include "atlres.h" + +#ifdef APSTUDIO_INVOKED + #undef APSTUDIO_HIDDEN_SYMBOLS +#endif // APSTUDIO_INVOKED + +// Visual Studio dialog editor bug fix +#ifndef DS_FIXEDSYS + #define DS_FIXEDSYS 0 +#endif + +#define IDC_INFOSTATIC 0xFFFE // == IDC_STATIC -1 + +/////////////////////////////////////////////////////////////////////////////// +// Smartphone and PPC 2005 Resource IDs + +// Command and associated string resource IDs +#define ID_MENU_OK 0xE790 +#define ID_MENU_CANCEL 0xE791 +#define ID_MENU 0xE792 +#define ID_ACTION 0xE793 +#define ID_VIEW_FULLSCREEN 0xE802 + +// MenuBar resource IDs +#define ATL_IDM_MENU_DONE 0xE701 +#define ATL_IDM_MENU_CANCEL 0xE702 +#define ATL_IDM_MENU_DONECANCEL 0xE703 + +// Default device MenuBar control ID and MenuBar resource ID +#define ATL_IDW_MENU_BAR 0xE802 + +// SmartPhone spinned controls ID offset for CSpinCtrl +#define ATL_IDW_SPIN_ID 9999 + +#endif // __ATLRESCE_H__ diff --git a/Externals/WTL80/atlscrl.h b/Externals/WTL80/atlscrl.h new file mode 100644 index 0000000000..9eb32eda9d --- /dev/null +++ b/Externals/WTL80/atlscrl.h @@ -0,0 +1,2015 @@ +// Windows Template Library - WTL version 8.0 +// Copyright (C) Microsoft Corporation. All rights reserved. +// +// This file is a part of the Windows Template Library. +// The use and distribution terms for this software are covered by the +// Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php) +// which can be found in the file CPL.TXT at the root of this distribution. +// By using this software in any fashion, you are agreeing to be bound by +// the terms of this license. You must not remove this notice, or +// any other, from this software. + +#ifndef __ATLSCRL_H__ +#define __ATLSCRL_H__ + +#pragma once + +#ifndef __cplusplus + #error ATL requires C++ compilation (use a .cpp suffix) +#endif + +#ifndef __ATLAPP_H__ + #error atlscrl.h requires atlapp.h to be included first +#endif + +#ifndef __ATLWIN_H__ + #error atlscrl.h requires atlwin.h to be included first +#endif + +#if !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) && !defined(_WIN32_WCE) + #include +#endif // !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) && !defined(_WIN32_WCE) + +#ifndef GET_WHEEL_DELTA_WPARAM + #define GET_WHEEL_DELTA_WPARAM(wParam) ((short)HIWORD(wParam)) +#endif + +#ifndef WM_MOUSEHWHEEL + #define WM_MOUSEHWHEEL 0x020E +#endif + + +/////////////////////////////////////////////////////////////////////////////// +// Classes in this file: +// +// CScrollImpl +// CScrollWindowImpl +// CMapScrollImpl +// CMapScrollWindowImpl +// CFSBWindowT +// CZoomScrollImpl +// CZoomScrollWindowImpl +// CScrollContainerImpl +// CScrollContainer + +namespace WTL +{ + +/////////////////////////////////////////////////////////////////////////////// +// CScrollImpl - Provides scrolling support to any window + +// Scroll extended styles +#define SCRL_SCROLLCHILDREN 0x00000001 +#define SCRL_ERASEBACKGROUND 0x00000002 +#define SCRL_NOTHUMBTRACKING 0x00000004 +#if (WINVER >= 0x0500) +#define SCRL_SMOOTHSCROLL 0x00000008 +#endif // (WINVER >= 0x0500) +#define SCRL_DISABLENOSCROLLV 0x00000010 +#define SCRL_DISABLENOSCROLLH 0x00000020 +#define SCRL_DISABLENOSCROLL (SCRL_DISABLENOSCROLLV | SCRL_DISABLENOSCROLLH) + + +template +class CScrollImpl +{ +public: + enum { uSCROLL_FLAGS = SW_INVALIDATE }; + + POINT m_ptOffset; + SIZE m_sizeAll; + SIZE m_sizeLine; + SIZE m_sizePage; + SIZE m_sizeClient; + int m_zDelta; // current wheel value + int m_nWheelLines; // number of lines to scroll on wheel +#if !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) && !defined(_WIN32_WCE) + // Note that this message must be forwarded from a top level window + UINT m_uMsgMouseWheel; // MSH_MOUSEWHEEL +#endif // !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) && !defined(_WIN32_WCE) + int m_zHDelta; // current horizontal wheel value + int m_nHWheelChars; // number of chars to scroll on horizontal wheel + UINT m_uScrollFlags; + DWORD m_dwExtendedStyle; // scroll specific extended styles + +// Constructor + CScrollImpl() : m_zDelta(0), m_nWheelLines(3), +#if !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) && !defined(_WIN32_WCE) + m_uMsgMouseWheel(0U), +#endif // !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) && !defined(_WIN32_WCE) + m_zHDelta(0), m_nHWheelChars(3), + m_uScrollFlags(0U), m_dwExtendedStyle(0) + { + m_ptOffset.x = 0; + m_ptOffset.y = 0; + m_sizeAll.cx = 0; + m_sizeAll.cy = 0; + m_sizePage.cx = 0; + m_sizePage.cy = 0; + m_sizeLine.cx = 0; + m_sizeLine.cy = 0; + m_sizeClient.cx = 0; + m_sizeClient.cy = 0; + + SetScrollExtendedStyle(SCRL_SCROLLCHILDREN | SCRL_ERASEBACKGROUND); + } + +// Attributes & Operations + DWORD GetScrollExtendedStyle() const + { + return m_dwExtendedStyle; + } + + DWORD SetScrollExtendedStyle(DWORD dwExtendedStyle, DWORD dwMask = 0) + { + DWORD dwPrevStyle = m_dwExtendedStyle; + if(dwMask == 0) + m_dwExtendedStyle = dwExtendedStyle; + else + m_dwExtendedStyle = (m_dwExtendedStyle & ~dwMask) | (dwExtendedStyle & dwMask); + // cache scroll flags + T* pT = static_cast(this); + pT; // avoid level 4 warning + m_uScrollFlags = pT->uSCROLL_FLAGS | (IsScrollingChildren() ? SW_SCROLLCHILDREN : 0) | (IsErasingBackground() ? SW_ERASE : 0); +#if (WINVER >= 0x0500) && !defined(_WIN32_WCE) + m_uScrollFlags |= (IsSmoothScroll() ? SW_SMOOTHSCROLL : 0); +#endif // (WINVER >= 0x0500) && !defined(_WIN32_WCE) + return dwPrevStyle; + } + + // offset operations + void SetScrollOffset(int x, int y, BOOL bRedraw = TRUE) + { + T* pT = static_cast(this); + ATLASSERT(::IsWindow(pT->m_hWnd)); + + pT->AdjustScrollOffset(x, y); + + int dx = m_ptOffset.x - x; + int dy = m_ptOffset.y - y; + m_ptOffset.x = x; + m_ptOffset.y = y; + + // block: set horizontal scroll bar + { + SCROLLINFO si = { sizeof(SCROLLINFO) }; + si.fMask = SIF_POS; + if((m_dwExtendedStyle & SCRL_DISABLENOSCROLLH) != 0) + si.fMask |= SIF_DISABLENOSCROLL; + si.nPos = m_ptOffset.x; + pT->SetScrollInfo(SB_HORZ, &si, bRedraw); + } + + // block: set vertical scroll bar + { + SCROLLINFO si = { sizeof(SCROLLINFO) }; + si.fMask = SIF_POS; + if((m_dwExtendedStyle & SCRL_DISABLENOSCROLLV) != 0) + si.fMask |= SIF_DISABLENOSCROLL; + si.nPos = m_ptOffset.y; + pT->SetScrollInfo(SB_VERT, &si, bRedraw); + } + + // Move all children if needed + if(IsScrollingChildren() && (dx != 0 || dy != 0)) + { + for(HWND hWndChild = ::GetWindow(pT->m_hWnd, GW_CHILD); hWndChild != NULL; hWndChild = ::GetWindow(hWndChild, GW_HWNDNEXT)) + { + RECT rect = { 0 }; + ::GetWindowRect(hWndChild, &rect); + ::MapWindowPoints(NULL, pT->m_hWnd, (LPPOINT)&rect, 1); + ::SetWindowPos(hWndChild, NULL, rect.left + dx, rect.top + dy, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE); + } + } + + if(bRedraw) + pT->Invalidate(); + } + + void SetScrollOffset(POINT ptOffset, BOOL bRedraw = TRUE) + { + SetScrollOffset(ptOffset.x, ptOffset.y, bRedraw); + } + + void GetScrollOffset(POINT& ptOffset) const + { + ptOffset = m_ptOffset; + } + + // size operations + void SetScrollSize(int cx, int cy, BOOL bRedraw = TRUE, bool bResetOffset = true) + { + T* pT = static_cast(this); + ATLASSERT(::IsWindow(pT->m_hWnd)); + + m_sizeAll.cx = cx; + m_sizeAll.cy = cy; + + int x = 0; + int y = 0; + if(!bResetOffset) + { + x = m_ptOffset.x; + y = m_ptOffset.y; + pT->AdjustScrollOffset(x, y); + } + + int dx = m_ptOffset.x - x; + int dy = m_ptOffset.y - y; + m_ptOffset.x = x; + m_ptOffset.y = y; + + // block: set horizontal scroll bar + { + SCROLLINFO si = { sizeof(SCROLLINFO) }; + si.fMask = SIF_PAGE | SIF_RANGE | SIF_POS; + if((m_dwExtendedStyle & SCRL_DISABLENOSCROLLH) != 0) + si.fMask |= SIF_DISABLENOSCROLL; + si.nMin = 0; + si.nMax = m_sizeAll.cx - 1; + si.nPage = m_sizeClient.cx; + si.nPos = m_ptOffset.x; + pT->SetScrollInfo(SB_HORZ, &si, bRedraw); + } + + // block: set vertical scroll bar + { + SCROLLINFO si = { sizeof(SCROLLINFO) }; + si.fMask = SIF_PAGE | SIF_RANGE | SIF_POS; + if((m_dwExtendedStyle & SCRL_DISABLENOSCROLLV) != 0) + si.fMask |= SIF_DISABLENOSCROLL; + si.nMin = 0; + si.nMax = m_sizeAll.cy - 1; + si.nPage = m_sizeClient.cy; + si.nPos = m_ptOffset.y; + pT->SetScrollInfo(SB_VERT, &si, bRedraw); + } + + // Move all children if needed + if(IsScrollingChildren() && (dx != 0 || dy != 0)) + { + for(HWND hWndChild = ::GetWindow(pT->m_hWnd, GW_CHILD); hWndChild != NULL; hWndChild = ::GetWindow(hWndChild, GW_HWNDNEXT)) + { + RECT rect = { 0 }; + ::GetWindowRect(hWndChild, &rect); + ::MapWindowPoints(NULL, pT->m_hWnd, (LPPOINT)&rect, 1); + ::SetWindowPos(hWndChild, NULL, rect.left + dx, rect.top + dy, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE); + } + } + + SetScrollLine(0, 0); + SetScrollPage(0, 0); + + if(bRedraw) + pT->Invalidate(); + } + + void SetScrollSize(SIZE size, BOOL bRedraw = TRUE, bool bResetOffset = true) + { + SetScrollSize(size.cx, size.cy, bRedraw, bResetOffset); + } + + void GetScrollSize(SIZE& sizeWnd) const + { + sizeWnd = m_sizeAll; + } + + // line operations + void SetScrollLine(int cxLine, int cyLine) + { + ATLASSERT(cxLine >= 0 && cyLine >= 0); + ATLASSERT(m_sizeAll.cx != 0 && m_sizeAll.cy != 0); + + m_sizeLine.cx = T::CalcLineOrPage(cxLine, m_sizeAll.cx, 100); + m_sizeLine.cy = T::CalcLineOrPage(cyLine, m_sizeAll.cy, 100); + } + + void SetScrollLine(SIZE sizeLine) + { + SetScrollLine(sizeLine.cx, sizeLine.cy); + } + + void GetScrollLine(SIZE& sizeLine) const + { + sizeLine = m_sizeLine; + } + + // page operations + void SetScrollPage(int cxPage, int cyPage) + { + ATLASSERT(cxPage >= 0 && cyPage >= 0); + ATLASSERT(m_sizeAll.cx != 0 && m_sizeAll.cy != 0); + + m_sizePage.cx = T::CalcLineOrPage(cxPage, m_sizeAll.cx, 10); + m_sizePage.cy = T::CalcLineOrPage(cyPage, m_sizeAll.cy, 10); + } + + void SetScrollPage(SIZE sizePage) + { + SetScrollPage(sizePage.cx, sizePage.cy); + } + + void GetScrollPage(SIZE& sizePage) const + { + sizePage = m_sizePage; + } + + // commands + void ScrollLineDown() + { + T* pT = static_cast(this); + ATLASSERT(::IsWindow(pT->m_hWnd)); + pT->DoScroll(SB_VERT, SB_LINEDOWN, (int&)m_ptOffset.y, m_sizeAll.cy, m_sizePage.cy, m_sizeLine.cy); + } + + void ScrollLineUp() + { + T* pT = static_cast(this); + ATLASSERT(::IsWindow(pT->m_hWnd)); + pT->DoScroll(SB_VERT, SB_LINEUP, (int&)m_ptOffset.y, m_sizeAll.cy, m_sizePage.cy, m_sizeLine.cy); + } + + void ScrollPageDown() + { + T* pT = static_cast(this); + ATLASSERT(::IsWindow(pT->m_hWnd)); + pT->DoScroll(SB_VERT, SB_PAGEDOWN, (int&)m_ptOffset.y, m_sizeAll.cy, m_sizePage.cy, m_sizeLine.cy); + } + + void ScrollPageUp() + { + T* pT = static_cast(this); + ATLASSERT(::IsWindow(pT->m_hWnd)); + pT->DoScroll(SB_VERT, SB_PAGEUP, (int&)m_ptOffset.y, m_sizeAll.cy, m_sizePage.cy, m_sizeLine.cy); + } + + void ScrollTop() + { + T* pT = static_cast(this); + ATLASSERT(::IsWindow(pT->m_hWnd)); + pT->DoScroll(SB_VERT, SB_TOP, (int&)m_ptOffset.y, m_sizeAll.cy, m_sizePage.cy, m_sizeLine.cy); + } + + void ScrollBottom() + { + T* pT = static_cast(this); + ATLASSERT(::IsWindow(pT->m_hWnd)); + pT->DoScroll(SB_VERT, SB_BOTTOM, (int&)m_ptOffset.y, m_sizeAll.cy, m_sizePage.cy, m_sizeLine.cy); + } + + void ScrollLineRight() + { + T* pT = static_cast(this); + ATLASSERT(::IsWindow(pT->m_hWnd)); + pT->DoScroll(SB_HORZ, SB_LINEDOWN, (int&)m_ptOffset.x, m_sizeAll.cx, m_sizePage.cx, m_sizeLine.cx); + } + + void ScrollLineLeft() + { + T* pT = static_cast(this); + ATLASSERT(::IsWindow(pT->m_hWnd)); + pT->DoScroll(SB_HORZ, SB_LINEUP, (int&)m_ptOffset.x, m_sizeAll.cx, m_sizePage.cx, m_sizeLine.cx); + } + + void ScrollPageRight() + { + T* pT = static_cast(this); + ATLASSERT(::IsWindow(pT->m_hWnd)); + pT->DoScroll(SB_HORZ, SB_PAGEDOWN, (int&)m_ptOffset.x, m_sizeAll.cx, m_sizePage.cx, m_sizeLine.cx); + } + + void ScrollPageLeft() + { + T* pT = static_cast(this); + ATLASSERT(::IsWindow(pT->m_hWnd)); + pT->DoScroll(SB_HORZ, SB_PAGEUP, (int&)m_ptOffset.x, m_sizeAll.cx, m_sizePage.cx, m_sizeLine.cx); + } + + void ScrollAllLeft() + { + T* pT = static_cast(this); + ATLASSERT(::IsWindow(pT->m_hWnd)); + pT->DoScroll(SB_HORZ, SB_TOP, (int&)m_ptOffset.x, m_sizeAll.cx, m_sizePage.cx, m_sizeLine.cx); + } + + void ScrollAllRight() + { + T* pT = static_cast(this); + ATLASSERT(::IsWindow(pT->m_hWnd)); + pT->DoScroll(SB_HORZ, SB_BOTTOM, (int&)m_ptOffset.x, m_sizeAll.cx, m_sizePage.cx, m_sizeLine.cx); + } + + // scroll to make point/view/window visible + void ScrollToView(POINT pt) + { + T* pT = static_cast(this); + ATLASSERT(::IsWindow(pT->m_hWnd)); + RECT rect = { pt.x, pt.y, pt.x, pt.y }; + pT->ScrollToView(rect); + } + + void ScrollToView(RECT& rect) + { + T* pT = static_cast(this); + ATLASSERT(::IsWindow(pT->m_hWnd)); + + RECT rcClient = { 0 }; + pT->GetClientRect(&rcClient); + + int x = m_ptOffset.x; + if(rect.left < m_ptOffset.x) + x = rect.left; + else if(rect.right > (m_ptOffset.x + rcClient.right)) + x = rect.right - rcClient.right; + + int y = m_ptOffset.y; + if(rect.top < m_ptOffset.y) + y = rect.top; + else if(rect.bottom > (m_ptOffset.y + rcClient.bottom)) + y = rect.bottom - rcClient.bottom; + + SetScrollOffset(x, y); + } + + void ScrollToView(HWND hWnd) + { + T* pT = static_cast(this); + ATLASSERT(::IsWindow(pT->m_hWnd)); + + RECT rect = { 0 }; + ::GetWindowRect(hWnd, &rect); + ::MapWindowPoints(NULL, pT->m_hWnd, (LPPOINT)&rect, 2); + ScrollToView(rect); + } + + BEGIN_MSG_MAP(CScrollImpl) + MESSAGE_HANDLER(WM_CREATE, OnCreate) + MESSAGE_HANDLER(WM_VSCROLL, OnVScroll) + MESSAGE_HANDLER(WM_HSCROLL, OnHScroll) + MESSAGE_HANDLER(WM_MOUSEWHEEL, OnMouseWheel) +#if !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) && !defined(_WIN32_WCE) + MESSAGE_HANDLER(m_uMsgMouseWheel, OnMouseWheel) +#endif // !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) && !defined(_WIN32_WCE) + MESSAGE_HANDLER(WM_MOUSEHWHEEL, OnMouseHWheel) + MESSAGE_HANDLER(WM_SETTINGCHANGE, OnSettingChange) + MESSAGE_HANDLER(WM_SIZE, OnSize) + MESSAGE_HANDLER(WM_PAINT, OnPaint) +#ifndef _WIN32_WCE + MESSAGE_HANDLER(WM_PRINTCLIENT, OnPaint) +#endif // !_WIN32_WCE + // standard scroll commands + ALT_MSG_MAP(1) + COMMAND_ID_HANDLER(ID_SCROLL_UP, OnScrollUp) + COMMAND_ID_HANDLER(ID_SCROLL_DOWN, OnScrollDown) + COMMAND_ID_HANDLER(ID_SCROLL_PAGE_UP, OnScrollPageUp) + COMMAND_ID_HANDLER(ID_SCROLL_PAGE_DOWN, OnScrollPageDown) + COMMAND_ID_HANDLER(ID_SCROLL_TOP, OnScrollTop) + COMMAND_ID_HANDLER(ID_SCROLL_BOTTOM, OnScrollBottom) + COMMAND_ID_HANDLER(ID_SCROLL_LEFT, OnScrollLeft) + COMMAND_ID_HANDLER(ID_SCROLL_RIGHT, OnScrollRight) + COMMAND_ID_HANDLER(ID_SCROLL_PAGE_LEFT, OnScrollPageLeft) + COMMAND_ID_HANDLER(ID_SCROLL_PAGE_RIGHT, OnScrollPageRight) + COMMAND_ID_HANDLER(ID_SCROLL_ALL_LEFT, OnScrollAllLeft) + COMMAND_ID_HANDLER(ID_SCROLL_ALL_RIGHT, OnScrollAllRight) + END_MSG_MAP() + + LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) + { + GetSystemSettings(); + bHandled = FALSE; + return 1; + } + + LRESULT OnVScroll(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/) + { + T* pT = static_cast(this); + ATLASSERT(::IsWindow(pT->m_hWnd)); + pT->DoScroll(SB_VERT, (int)(short)LOWORD(wParam), (int&)m_ptOffset.y, m_sizeAll.cy, m_sizePage.cy, m_sizeLine.cy); + return 0; + } + + LRESULT OnHScroll(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/) + { + T* pT = static_cast(this); + ATLASSERT(::IsWindow(pT->m_hWnd)); + pT->DoScroll(SB_HORZ, (int)(short)LOWORD(wParam), (int&)m_ptOffset.x, m_sizeAll.cx, m_sizePage.cx, m_sizeLine.cx); + return 0; + } + + LRESULT OnMouseWheel(UINT uMsg, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/) + { + T* pT = static_cast(this); + ATLASSERT(::IsWindow(pT->m_hWnd)); + +#if (_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400) || defined(_WIN32_WCE) + uMsg; + int zDelta = (int)GET_WHEEL_DELTA_WPARAM(wParam); +#else + int zDelta = (uMsg == WM_MOUSEWHEEL) ? (int)GET_WHEEL_DELTA_WPARAM(wParam) : (int)wParam; +#endif // !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400) || defined(_WIN32_WCE)) + int nScrollCode = (m_nWheelLines == WHEEL_PAGESCROLL) ? ((zDelta > 0) ? SB_PAGEUP : SB_PAGEDOWN) : ((zDelta > 0) ? SB_LINEUP : SB_LINEDOWN); + m_zDelta += zDelta; // cumulative + int zTotal = (m_nWheelLines == WHEEL_PAGESCROLL) ? abs(m_zDelta) : abs(m_zDelta) * m_nWheelLines; + if(m_sizeAll.cy > m_sizeClient.cy) + { + for(int i = 0; i < zTotal; i += WHEEL_DELTA) + { + pT->DoScroll(SB_VERT, nScrollCode, (int&)m_ptOffset.y, m_sizeAll.cy, m_sizePage.cy, m_sizeLine.cy); + pT->UpdateWindow(); + } + } + else // can't scroll vertically, scroll horizontally + { + for(int i = 0; i < zTotal; i += WHEEL_DELTA) + { + pT->DoScroll(SB_HORZ, nScrollCode, (int&)m_ptOffset.x, m_sizeAll.cx, m_sizePage.cx, m_sizeLine.cx); + pT->UpdateWindow(); + } + } + m_zDelta %= WHEEL_DELTA; + + return 0; + } + + LRESULT OnMouseHWheel(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/) + { + T* pT = static_cast(this); + ATLASSERT(::IsWindow(pT->m_hWnd)); + + int zDelta = (int)GET_WHEEL_DELTA_WPARAM(wParam); + int nScrollCode = (m_nHWheelChars == WHEEL_PAGESCROLL) ? ((zDelta > 0) ? SB_PAGERIGHT : SB_PAGELEFT) : ((zDelta > 0) ? SB_LINERIGHT : SB_LINELEFT); + m_zHDelta += zDelta; // cumulative + int zTotal = (m_nHWheelChars == WHEEL_PAGESCROLL) ? abs(m_zHDelta) : abs(m_zHDelta) * m_nHWheelChars; + if(m_sizeAll.cx > m_sizeClient.cx) + { + for(int i = 0; i < zTotal; i += WHEEL_DELTA) + { + pT->DoScroll(SB_HORZ, nScrollCode, (int&)m_ptOffset.x, m_sizeAll.cx, m_sizePage.cx, m_sizeLine.cx); + pT->UpdateWindow(); + } + } + m_zHDelta %= WHEEL_DELTA; + + return 0; + } + + LRESULT OnSettingChange(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) + { + GetSystemSettings(); + return 0; + } + + LRESULT OnSize(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled) + { + T* pT = static_cast(this); + ATLASSERT(::IsWindow(pT->m_hWnd)); + + m_sizeClient.cx = GET_X_LPARAM(lParam); + m_sizeClient.cy = GET_Y_LPARAM(lParam); + + // block: set horizontal scroll bar + { + SCROLLINFO si = { sizeof(SCROLLINFO) }; + si.fMask = SIF_PAGE | SIF_RANGE | SIF_POS; + si.nMin = 0; + si.nMax = m_sizeAll.cx - 1; + if((m_dwExtendedStyle & SCRL_DISABLENOSCROLLH) != 0) + si.fMask |= SIF_DISABLENOSCROLL; + si.nPage = m_sizeClient.cx; + si.nPos = m_ptOffset.x; + pT->SetScrollInfo(SB_HORZ, &si, TRUE); + } + + // block: set vertical scroll bar + { + SCROLLINFO si = { sizeof(SCROLLINFO) }; + si.fMask = SIF_PAGE | SIF_RANGE | SIF_POS; + si.nMin = 0; + si.nMax = m_sizeAll.cy - 1; + if((m_dwExtendedStyle & SCRL_DISABLENOSCROLLV) != 0) + si.fMask |= SIF_DISABLENOSCROLL; + si.nPage = m_sizeClient.cy; + si.nPos = m_ptOffset.y; + pT->SetScrollInfo(SB_VERT, &si, TRUE); + } + + int x = m_ptOffset.x; + int y = m_ptOffset.y; + if(pT->AdjustScrollOffset(x, y)) + { + // Children will be moved in SetScrollOffset, if needed + pT->ScrollWindowEx(m_ptOffset.x - x, m_ptOffset.y - y, (m_uScrollFlags & ~SCRL_SCROLLCHILDREN)); + SetScrollOffset(x, y, FALSE); + } + + bHandled = FALSE; + return 1; + } + + LRESULT OnPaint(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/) + { + T* pT = static_cast(this); + ATLASSERT(::IsWindow(pT->m_hWnd)); + if(wParam != NULL) + { + CDCHandle dc = (HDC)wParam; + POINT ptViewportOrg = { 0, 0 }; + dc.SetViewportOrg(-m_ptOffset.x, -m_ptOffset.y, &ptViewportOrg); + pT->DoPaint(dc); + dc.SetViewportOrg(ptViewportOrg); + } + else + { + CPaintDC dc(pT->m_hWnd); + dc.SetViewportOrg(-m_ptOffset.x, -m_ptOffset.y); + pT->DoPaint(dc.m_hDC); + } + return 0; + } + + // scrolling handlers + LRESULT OnScrollUp(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) + { + ScrollLineUp(); + return 0; + } + + LRESULT OnScrollDown(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) + { + ScrollLineDown(); + return 0; + } + + LRESULT OnScrollPageUp(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) + { + ScrollPageUp(); + return 0; + } + + LRESULT OnScrollPageDown(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) + { + ScrollPageDown(); + return 0; + } + + LRESULT OnScrollTop(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) + { + ScrollTop(); + return 0; + } + + LRESULT OnScrollBottom(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) + { + ScrollBottom(); + return 0; + } + + LRESULT OnScrollLeft(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) + { + ScrollLineLeft(); + return 0; + } + + LRESULT OnScrollRight(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) + { + ScrollLineRight(); + return 0; + } + + LRESULT OnScrollPageLeft(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) + { + ScrollPageLeft(); + return 0; + } + + LRESULT OnScrollPageRight(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) + { + ScrollPageRight(); + return 0; + } + + LRESULT OnScrollAllLeft(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) + { + ScrollAllLeft(); + return 0; + } + + LRESULT OnScrollAllRight(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) + { + ScrollAllRight(); + return 0; + } + +// Overrideables + void DoPaint(CDCHandle /*dc*/) + { + // must be implemented in a derived class + ATLASSERT(FALSE); + } + +// Implementation + void DoScroll(int nType, int nScrollCode, int& cxyOffset, int cxySizeAll, int cxySizePage, int cxySizeLine) + { + T* pT = static_cast(this); + RECT rect = { 0 }; + pT->GetClientRect(&rect); + int cxyClient = (nType == SB_VERT) ? rect.bottom : rect.right; + int cxyMax = cxySizeAll - cxyClient; + + if(cxyMax < 0) // can't scroll, client area is bigger + return; + + bool bUpdate = true; + int cxyScroll = 0; + + switch(nScrollCode) + { + case SB_TOP: // top or all left + cxyScroll = cxyOffset; + cxyOffset = 0; + break; + case SB_BOTTOM: // bottom or all right + cxyScroll = cxyOffset - cxyMax; + cxyOffset = cxyMax; + break; + case SB_LINEUP: // line up or line left + if(cxyOffset >= cxySizeLine) + { + cxyScroll = cxySizeLine; + cxyOffset -= cxySizeLine; + } + else + { + cxyScroll = cxyOffset; + cxyOffset = 0; + } + break; + case SB_LINEDOWN: // line down or line right + if(cxyOffset < cxyMax - cxySizeLine) + { + cxyScroll = -cxySizeLine; + cxyOffset += cxySizeLine; + } + else + { + cxyScroll = cxyOffset - cxyMax; + cxyOffset = cxyMax; + } + break; + case SB_PAGEUP: // page up or page left + if(cxyOffset >= cxySizePage) + { + cxyScroll = cxySizePage; + cxyOffset -= cxySizePage; + } + else + { + cxyScroll = cxyOffset; + cxyOffset = 0; + } + break; + case SB_PAGEDOWN: // page down or page right + if(cxyOffset < cxyMax - cxySizePage) + { + cxyScroll = -cxySizePage; + cxyOffset += cxySizePage; + } + else + { + cxyScroll = cxyOffset - cxyMax; + cxyOffset = cxyMax; + } + break; + case SB_THUMBTRACK: + if(IsNoThumbTracking()) + break; + // else fall through + case SB_THUMBPOSITION: + { + SCROLLINFO si = { sizeof(SCROLLINFO), SIF_TRACKPOS }; + if(pT->GetScrollInfo(nType, &si)) + { + cxyScroll = cxyOffset - si.nTrackPos; + cxyOffset = si.nTrackPos; + } + } + break; + case SB_ENDSCROLL: + default: + bUpdate = false; + break; + } + + if(bUpdate && cxyScroll != 0) + { + pT->SetScrollPos(nType, cxyOffset, TRUE); + if(nType == SB_VERT) + pT->ScrollWindowEx(0, cxyScroll, m_uScrollFlags); + else + pT->ScrollWindowEx(cxyScroll, 0, m_uScrollFlags); + } + } + + static int CalcLineOrPage(int nVal, int nMax, int nDiv) + { + if(nVal == 0) + { + nVal = nMax / nDiv; + if(nVal < 1) + nVal = 1; + } + else if(nVal > nMax) + { + nVal = nMax; + } + + return nVal; + } + + bool AdjustScrollOffset(int& x, int& y) + { + int xOld = x; + int yOld = y; + + int cxMax = m_sizeAll.cx - m_sizeClient.cx; + if(x > cxMax) + x = (cxMax >= 0) ? cxMax : 0; + else if(x < 0) + x = 0; + + int cyMax = m_sizeAll.cy - m_sizeClient.cy; + if(y > cyMax) + y = (cyMax >= 0) ? cyMax : 0; + else if(y < 0) + y = 0; + + return (x != xOld || y != yOld); + } + + void GetSystemSettings() + { +#ifndef _WIN32_WCE +#ifndef SPI_GETWHEELSCROLLLINES + const UINT SPI_GETWHEELSCROLLLINES = 104; +#endif // !SPI_GETWHEELSCROLLLINES + ::SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, &m_nWheelLines, 0); + +#ifndef SPI_GETWHEELSCROLLCHARS + const UINT SPI_GETWHEELSCROLLCHARS = 0x006C; +#endif // !SPI_GETWHEELSCROLLCHARS + ::SystemParametersInfo(SPI_GETWHEELSCROLLCHARS, 0, &m_nHWheelChars, 0); + +#if !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) + if(m_uMsgMouseWheel != 0) + m_uMsgMouseWheel = ::RegisterWindowMessage(MSH_MOUSEWHEEL); + + HWND hWndWheel = FindWindow(MSH_WHEELMODULE_CLASS, MSH_WHEELMODULE_TITLE); + if(::IsWindow(hWndWheel)) + { + UINT uMsgScrollLines = ::RegisterWindowMessage(MSH_SCROLL_LINES); + if(uMsgScrollLines != 0) + m_nWheelLines = (int)::SendMessage(hWndWheel, uMsgScrollLines, 0, 0L); + } +#endif // !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) +#endif // !_WIN32_WCE + } + + bool IsScrollingChildren() const + { + return (m_dwExtendedStyle & SCRL_SCROLLCHILDREN) != 0; + } + + bool IsErasingBackground() const + { + return (m_dwExtendedStyle & SCRL_ERASEBACKGROUND) != 0; + } + + bool IsNoThumbTracking() const + { + return (m_dwExtendedStyle & SCRL_NOTHUMBTRACKING) != 0; + } + +#if (WINVER >= 0x0500) + bool IsSmoothScroll() const + { + return (m_dwExtendedStyle & SCRL_SMOOTHSCROLL) != 0; + } +#endif // (WINVER >= 0x0500) +}; + + +/////////////////////////////////////////////////////////////////////////////// +// CScrollWindowImpl - Implements a scrollable window + +template +class ATL_NO_VTABLE CScrollWindowImpl : public ATL::CWindowImpl, public CScrollImpl< T > +{ +public: + BEGIN_MSG_MAP(CScrollWindowImpl) + MESSAGE_HANDLER(WM_VSCROLL, CScrollImpl< T >::OnVScroll) + MESSAGE_HANDLER(WM_HSCROLL, CScrollImpl< T >::OnHScroll) + MESSAGE_HANDLER(WM_MOUSEWHEEL, CScrollImpl< T >::OnMouseWheel) +#if !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) && !defined(_WIN32_WCE) + MESSAGE_HANDLER(m_uMsgMouseWheel, CScrollImpl< T >::OnMouseWheel) +#endif // !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) && !defined(_WIN32_WCE) + MESSAGE_HANDLER(WM_MOUSEHWHEEL, CScrollImpl< T >::OnMouseHWheel) + MESSAGE_HANDLER(WM_SETTINGCHANGE, CScrollImpl< T >::OnSettingChange) + MESSAGE_HANDLER(WM_SIZE, CScrollImpl< T >::OnSize) + MESSAGE_HANDLER(WM_PAINT, CScrollImpl< T >::OnPaint) +#ifndef _WIN32_WCE + MESSAGE_HANDLER(WM_PRINTCLIENT, CScrollImpl< T >::OnPaint) +#endif // !_WIN32_WCE + ALT_MSG_MAP(1) + COMMAND_ID_HANDLER(ID_SCROLL_UP, CScrollImpl< T >::OnScrollUp) + COMMAND_ID_HANDLER(ID_SCROLL_DOWN, CScrollImpl< T >::OnScrollDown) + COMMAND_ID_HANDLER(ID_SCROLL_PAGE_UP, CScrollImpl< T >::OnScrollPageUp) + COMMAND_ID_HANDLER(ID_SCROLL_PAGE_DOWN, CScrollImpl< T >::OnScrollPageDown) + COMMAND_ID_HANDLER(ID_SCROLL_TOP, CScrollImpl< T >::OnScrollTop) + COMMAND_ID_HANDLER(ID_SCROLL_BOTTOM, CScrollImpl< T >::OnScrollBottom) + COMMAND_ID_HANDLER(ID_SCROLL_LEFT, CScrollImpl< T >::OnScrollLeft) + COMMAND_ID_HANDLER(ID_SCROLL_RIGHT, CScrollImpl< T >::OnScrollRight) + COMMAND_ID_HANDLER(ID_SCROLL_PAGE_LEFT, CScrollImpl< T >::OnScrollPageLeft) + COMMAND_ID_HANDLER(ID_SCROLL_PAGE_RIGHT, CScrollImpl< T >::OnScrollPageRight) + COMMAND_ID_HANDLER(ID_SCROLL_ALL_LEFT, CScrollImpl< T >::OnScrollAllLeft) + COMMAND_ID_HANDLER(ID_SCROLL_ALL_RIGHT, CScrollImpl< T >::OnScrollAllRight) + END_MSG_MAP() +}; + + +/////////////////////////////////////////////////////////////////////////////// +// CMapScrollImpl - Provides mapping and scrolling support to any window + +#ifndef _WIN32_WCE + +template +class CMapScrollImpl : public CScrollImpl< T > +{ +public: + int m_nMapMode; + RECT m_rectLogAll; + SIZE m_sizeLogLine; + SIZE m_sizeLogPage; + +// Constructor + CMapScrollImpl() : m_nMapMode(MM_TEXT) + { + ::SetRectEmpty(&m_rectLogAll); + m_sizeLogPage.cx = 0; + m_sizeLogPage.cy = 0; + m_sizeLogLine.cx = 0; + m_sizeLogLine.cy = 0; + } + +// Attributes & Operations + // mapping mode operations + void SetScrollMapMode(int nMapMode) + { + ATLASSERT(nMapMode >= MM_MIN && nMapMode <= MM_MAX_FIXEDSCALE); + m_nMapMode = nMapMode; + } + + int GetScrollMapMode() const + { + ATLASSERT(m_nMapMode >= MM_MIN && m_nMapMode <= MM_MAX_FIXEDSCALE); + return m_nMapMode; + } + + // offset operations + void SetScrollOffset(int x, int y, BOOL bRedraw = TRUE) + { + ATLASSERT(m_nMapMode >= MM_MIN && m_nMapMode <= MM_MAX_FIXEDSCALE); + POINT ptOff = { x, y }; + // block: convert logical to device units + { + CWindowDC dc(NULL); + dc.SetMapMode(m_nMapMode); + dc.LPtoDP(&ptOff); + } + CScrollImpl< T >::SetScrollOffset(ptOff, bRedraw); + } + + void SetScrollOffset(POINT ptOffset, BOOL bRedraw = TRUE) + { + SetScrollOffset(ptOffset.x, ptOffset.y, bRedraw); + } + + void GetScrollOffset(POINT& ptOffset) const + { + ATLASSERT(m_nMapMode >= MM_MIN && m_nMapMode <= MM_MAX_FIXEDSCALE); + ptOffset = m_ptOffset; + // block: convert device to logical units + { + CWindowDC dc(NULL); + dc.SetMapMode(m_nMapMode); + dc.DPtoLP(&ptOffset); + } + } + + // size operations + void SetScrollSize(int xMin, int yMin, int xMax, int yMax, BOOL bRedraw = TRUE, bool bResetOffset = true) + { + ATLASSERT(xMax > xMin && yMax > yMin); + ATLASSERT(m_nMapMode >= MM_MIN && m_nMapMode <= MM_MAX_FIXEDSCALE); + + ::SetRect(&m_rectLogAll, xMin, yMin, xMax, yMax); + + SIZE sizeAll = { 0 }; + sizeAll.cx = xMax - xMin + 1; + sizeAll.cy = yMax - yMin + 1; + // block: convert logical to device units + { + CWindowDC dc(NULL); + dc.SetMapMode(m_nMapMode); + dc.LPtoDP(&sizeAll); + } + CScrollImpl< T >::SetScrollSize(sizeAll, bRedraw, bResetOffset); + SetScrollLine(0, 0); + SetScrollPage(0, 0); + } + + void SetScrollSize(RECT& rcScroll, BOOL bRedraw = TRUE, bool bResetOffset = true) + { + SetScrollSize(rcScroll.left, rcScroll.top, rcScroll.right, rcScroll.bottom, bRedraw, bResetOffset); + } + + void SetScrollSize(int cx, int cy, BOOL bRedraw = TRUE, bool bResetOffset = true) + { + SetScrollSize(0, 0, cx, cy, bRedraw, bResetOffset); + } + + void SetScrollSize(SIZE size, BOOL bRedraw = TRUE, bool bResetOffset = true) + { + SetScrollSize(0, 0, size.cx, size.cy, bRedraw, bResetOffset); + } + + void GetScrollSize(RECT& rcScroll) const + { + ATLASSERT(m_nMapMode >= MM_MIN && m_nMapMode <= MM_MAX_FIXEDSCALE); + rcScroll = m_rectLogAll; + } + + // line operations + void SetScrollLine(int cxLine, int cyLine) + { + ATLASSERT(cxLine >= 0 && cyLine >= 0); + ATLASSERT(m_nMapMode >= MM_MIN && m_nMapMode <= MM_MAX_FIXEDSCALE); + + m_sizeLogLine.cx = cxLine; + m_sizeLogLine.cy = cyLine; + SIZE sizeLine = m_sizeLogLine; + // block: convert logical to device units + { + CWindowDC dc(NULL); + dc.SetMapMode(m_nMapMode); + dc.LPtoDP(&sizeLine); + } + CScrollImpl< T >::SetScrollLine(sizeLine); + } + + void SetScrollLine(SIZE sizeLine) + { + SetScrollLine(sizeLine.cx, sizeLine.cy); + } + + void GetScrollLine(SIZE& sizeLine) const + { + ATLASSERT(m_nMapMode >= MM_MIN && m_nMapMode <= MM_MAX_FIXEDSCALE); + sizeLine = m_sizeLogLine; + } + + // page operations + void SetScrollPage(int cxPage, int cyPage) + { + ATLASSERT(cxPage >= 0 && cyPage >= 0); + ATLASSERT(m_nMapMode >= MM_MIN && m_nMapMode <= MM_MAX_FIXEDSCALE); + + m_sizeLogPage.cx = cxPage; + m_sizeLogPage.cy = cyPage; + SIZE sizePage = m_sizeLogPage; + // block: convert logical to device units + { + CWindowDC dc(NULL); + dc.SetMapMode(m_nMapMode); + dc.LPtoDP(&sizePage); + } + CScrollImpl< T >::SetScrollPage(sizePage); + } + + void SetScrollPage(SIZE sizePage) + { + SetScrollPage(sizePage.cx, sizePage.cy); + } + + void GetScrollPage(SIZE& sizePage) const + { + ATLASSERT(m_nMapMode >= MM_MIN && m_nMapMode <= MM_MAX_FIXEDSCALE); + sizePage = m_sizeLogPage; + } + + BEGIN_MSG_MAP(CMapScrollImpl) + MESSAGE_HANDLER(WM_VSCROLL, CScrollImpl< T >::OnVScroll) + MESSAGE_HANDLER(WM_HSCROLL, CScrollImpl< T >::OnHScroll) + MESSAGE_HANDLER(WM_MOUSEWHEEL, CScrollImpl< T >::OnMouseWheel) +#if !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) + MESSAGE_HANDLER(m_uMsgMouseWheel, CScrollImpl< T >::OnMouseWheel) +#endif // !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) + MESSAGE_HANDLER(WM_MOUSEHWHEEL, CScrollImpl< T >::OnMouseHWheel) + MESSAGE_HANDLER(WM_SETTINGCHANGE, CScrollImpl< T >::OnSettingChange) + MESSAGE_HANDLER(WM_SIZE, CScrollImpl< T >::OnSize) + MESSAGE_HANDLER(WM_PAINT, OnPaint) + MESSAGE_HANDLER(WM_PRINTCLIENT, OnPaint) + ALT_MSG_MAP(1) + COMMAND_ID_HANDLER(ID_SCROLL_UP, CScrollImpl< T >::OnScrollUp) + COMMAND_ID_HANDLER(ID_SCROLL_DOWN, CScrollImpl< T >::OnScrollDown) + COMMAND_ID_HANDLER(ID_SCROLL_PAGE_UP, CScrollImpl< T >::OnScrollPageUp) + COMMAND_ID_HANDLER(ID_SCROLL_PAGE_DOWN, CScrollImpl< T >::OnScrollPageDown) + COMMAND_ID_HANDLER(ID_SCROLL_TOP, CScrollImpl< T >::OnScrollTop) + COMMAND_ID_HANDLER(ID_SCROLL_BOTTOM, CScrollImpl< T >::OnScrollBottom) + COMMAND_ID_HANDLER(ID_SCROLL_LEFT, CScrollImpl< T >::OnScrollLeft) + COMMAND_ID_HANDLER(ID_SCROLL_RIGHT, CScrollImpl< T >::OnScrollRight) + COMMAND_ID_HANDLER(ID_SCROLL_PAGE_LEFT, CScrollImpl< T >::OnScrollPageLeft) + COMMAND_ID_HANDLER(ID_SCROLL_PAGE_RIGHT, CScrollImpl< T >::OnScrollPageRight) + COMMAND_ID_HANDLER(ID_SCROLL_ALL_LEFT, CScrollImpl< T >::OnScrollAllLeft) + COMMAND_ID_HANDLER(ID_SCROLL_ALL_RIGHT, CScrollImpl< T >::OnScrollAllRight) + END_MSG_MAP() + + LRESULT OnPaint(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/) + { + T* pT = static_cast(this); + ATLASSERT(::IsWindow(pT->m_hWnd)); + if(wParam != NULL) + { + CDCHandle dc = (HDC)wParam; + int nMapModeSav = dc.GetMapMode(); + dc.SetMapMode(m_nMapMode); + POINT ptViewportOrg = { 0, 0 }; + if(m_nMapMode == MM_TEXT) + dc.SetViewportOrg(-m_ptOffset.x, -m_ptOffset.y, &ptViewportOrg); + else + dc.SetViewportOrg(-m_ptOffset.x, -m_ptOffset.y + m_sizeAll.cy, &ptViewportOrg); + POINT ptWindowOrg = { 0, 0 }; + dc.SetWindowOrg(m_rectLogAll.left, m_rectLogAll.top, &ptWindowOrg); + + pT->DoPaint(dc); + + dc.SetMapMode(nMapModeSav); + dc.SetViewportOrg(ptViewportOrg); + dc.SetWindowOrg(ptWindowOrg); + } + else + { + CPaintDC dc(pT->m_hWnd); + dc.SetMapMode(m_nMapMode); + if(m_nMapMode == MM_TEXT) + dc.SetViewportOrg(-m_ptOffset.x, -m_ptOffset.y); + else + dc.SetViewportOrg(-m_ptOffset.x, -m_ptOffset.y + m_sizeAll.cy); + dc.SetWindowOrg(m_rectLogAll.left, m_rectLogAll.top); + pT->DoPaint(dc.m_hDC); + } + return 0; + } +}; + +#endif // !_WIN32_WCE + + +/////////////////////////////////////////////////////////////////////////////// +// CMapScrollWindowImpl - Implements scrolling window with mapping + +#ifndef _WIN32_WCE + +template +class ATL_NO_VTABLE CMapScrollWindowImpl : public ATL::CWindowImpl< T, TBase, TWinTraits >, public CMapScrollImpl< T > +{ +public: + BEGIN_MSG_MAP(CMapScrollWindowImpl) + MESSAGE_HANDLER(WM_VSCROLL, CScrollImpl< T >::OnVScroll) + MESSAGE_HANDLER(WM_HSCROLL, CScrollImpl< T >::OnHScroll) + MESSAGE_HANDLER(WM_MOUSEWHEEL, CScrollImpl< T >::OnMouseWheel) +#if !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) + MESSAGE_HANDLER(m_uMsgMouseWheel, CScrollImpl< T >::OnMouseWheel) +#endif // !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) + MESSAGE_HANDLER(WM_MOUSEHWHEEL, CScrollImpl< T >::OnMouseHWheel) + MESSAGE_HANDLER(WM_SETTINGCHANGE, CScrollImpl< T >::OnSettingChange) + MESSAGE_HANDLER(WM_SIZE, CScrollImpl< T >::OnSize) + MESSAGE_HANDLER(WM_PAINT, CMapScrollImpl< T >::OnPaint) + MESSAGE_HANDLER(WM_PRINTCLIENT, CMapScrollImpl< T >::OnPaint) + ALT_MSG_MAP(1) + COMMAND_ID_HANDLER(ID_SCROLL_UP, CScrollImpl< T >::OnScrollUp) + COMMAND_ID_HANDLER(ID_SCROLL_DOWN, CScrollImpl< T >::OnScrollDown) + COMMAND_ID_HANDLER(ID_SCROLL_PAGE_UP, CScrollImpl< T >::OnScrollPageUp) + COMMAND_ID_HANDLER(ID_SCROLL_PAGE_DOWN, CScrollImpl< T >::OnScrollPageDown) + COMMAND_ID_HANDLER(ID_SCROLL_TOP, CScrollImpl< T >::OnScrollTop) + COMMAND_ID_HANDLER(ID_SCROLL_BOTTOM, CScrollImpl< T >::OnScrollBottom) + COMMAND_ID_HANDLER(ID_SCROLL_LEFT, CScrollImpl< T >::OnScrollLeft) + COMMAND_ID_HANDLER(ID_SCROLL_RIGHT, CScrollImpl< T >::OnScrollRight) + COMMAND_ID_HANDLER(ID_SCROLL_PAGE_LEFT, CScrollImpl< T >::OnScrollPageLeft) + COMMAND_ID_HANDLER(ID_SCROLL_PAGE_RIGHT, CScrollImpl< T >::OnScrollPageRight) + COMMAND_ID_HANDLER(ID_SCROLL_ALL_LEFT, CScrollImpl< T >::OnScrollAllLeft) + COMMAND_ID_HANDLER(ID_SCROLL_ALL_RIGHT, CScrollImpl< T >::OnScrollAllRight) + END_MSG_MAP() +}; + +#endif // !_WIN32_WCE + + +/////////////////////////////////////////////////////////////////////////////// +// CFSBWindow - Use as a base instead of CWindow to get flat scroll bar support + +#if defined(__ATLCTRLS_H__) && (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) + +template +class CFSBWindowT : public TBase, public CFlatScrollBarImpl > +{ +public: +// Constructors + CFSBWindowT(HWND hWnd = NULL) : TBase(hWnd) + { } + + CFSBWindowT< TBase >& operator =(HWND hWnd) + { + m_hWnd = hWnd; + return *this; + } + +// CWindow overrides that use flat scroll bar API +// (only those methods that are used by scroll window classes) + int SetScrollPos(int nBar, int nPos, BOOL bRedraw = TRUE) + { + ATLASSERT(::IsWindow(m_hWnd)); + return FlatSB_SetScrollPos(nBar, nPos, bRedraw); + } + + BOOL GetScrollInfo(int nBar, LPSCROLLINFO lpScrollInfo) + { + ATLASSERT(::IsWindow(m_hWnd)); + return FlatSB_GetScrollInfo(nBar, lpScrollInfo); + } + + BOOL SetScrollInfo(int nBar, LPSCROLLINFO lpScrollInfo, BOOL bRedraw = TRUE) + { + ATLASSERT(::IsWindow(m_hWnd)); + return FlatSB_SetScrollInfo(nBar, lpScrollInfo, bRedraw); + } +}; + +typedef CFSBWindowT CFSBWindow; + +#endif // defined(__ATLCTRLS_H__) && (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) + + +/////////////////////////////////////////////////////////////////////////////// +// CZoomScrollImpl - Provides zooming and scrolling support to any window + +#ifndef _WIN32_WCE + +// The zoom modes that can be set with the SetZoomMode method +enum +{ + ZOOMMODE_OFF, + ZOOMMODE_IN, // If left mouse button is clicked or dragged, zoom in on point clicked or rectangle dragged. + ZOOMMODE_OUT // If left mouse button clicked, zoom out on point clicked. +}; + +// Notification to parent that zoom scale changed as a result of user mouse action. +#define ZSN_ZOOMCHANGED (NM_FIRST - 50) + +template +class CZoomScrollImpl : public CScrollImpl< T > +{ +public: + enum { m_cxyMinZoomRect = 12 }; // min rect size to zoom in on rect. + +// Data members + SIZE m_sizeLogAll; + SIZE m_sizeLogLine; + SIZE m_sizeLogPage; + float m_fZoomScale; + float m_fZoomScaleMin; + float m_fZoomDelta; // Used in ZOOMMODE_IN and ZOOMMODE_OUT on left-button click. + int m_nZoomMode; + RECT m_rcTrack; + bool m_bTracking; + +// Constructor + CZoomScrollImpl(): + m_fZoomScale(1.0), + m_fZoomScaleMin(0.5), + m_fZoomDelta(0.5), + m_nZoomMode(ZOOMMODE_OFF), + m_bTracking(false) + { + m_sizeLogAll.cx = 0; + m_sizeLogAll.cy = 0; + m_sizeLogPage.cx = 0; + m_sizeLogPage.cy = 0; + m_sizeLogLine.cx = 0; + m_sizeLogLine.cy = 0; + ::SetRectEmpty(&m_rcTrack); + } + +// Attributes & Operations + + // size operations + void SetScrollSize(int cxLog, int cyLog, BOOL bRedraw = TRUE, bool bResetOffset = true) + { + ATLASSERT(cxLog >= 0 && cyLog >= 0); + + // Set up the defaults + if (cxLog == 0 && cyLog == 0) + { + cxLog = 1; + cyLog = 1; + } + + m_sizeLogAll.cx = cxLog; + m_sizeLogAll.cy = cyLog; + SIZE sizeAll = { 0 }; + sizeAll.cx = (int)((float)m_sizeLogAll.cx * m_fZoomScale); + sizeAll.cy = (int)((float)m_sizeLogAll.cy * m_fZoomScale); + + CScrollImpl< T >::SetScrollSize(sizeAll, bRedraw, bResetOffset); + } + + void SetScrollSize(SIZE sizeLog, BOOL bRedraw = TRUE, bool bResetOffset = true) + { + SetScrollSize(sizeLog.cx, sizeLog.cy, bRedraw, bResetOffset); + } + + void GetScrollSize(SIZE& sizeLog) const + { + sizeLog = m_sizeLogAll; + } + + // line operations + void SetScrollLine(int cxLogLine, int cyLogLine) + { + ATLASSERT(cxLogLine >= 0 && cyLogLine >= 0); + + m_sizeLogLine.cx = cxLogLine; + m_sizeLogLine.cy = cyLogLine; + + SIZE sizeLine = { 0 }; + sizeLine.cx = (int)((float)m_sizeLogLine.cx * m_fZoomScale); + sizeLine.cy = (int)((float)m_sizeLogLine.cy * m_fZoomScale); + CScrollImpl< T >::SetScrollLine(sizeLine); + } + + void SetScrollLine(SIZE sizeLogLine) + { + SetScrollLine(sizeLogLine.cx, sizeLogLine.cy); + } + + void GetScrollLine(SIZE& sizeLogLine) const + { + sizeLogLine = m_sizeLogLine; + } + + // page operations + void SetScrollPage(int cxLogPage, int cyLogPage) + { + ATLASSERT(cxLogPage >= 0 && cyLogPage >= 0); + + m_sizeLogPage.cx = cxLogPage; + m_sizeLogPage.cy = cyLogPage; + + SIZE sizePage = { 0 }; + sizePage.cx = (int)((float)m_sizeLogPage.cx * m_fZoomScale); + sizePage.cy = (int)((float)m_sizeLogPage.cy * m_fZoomScale); + + CScrollImpl< T >::SetScrollPage(sizePage); + } + + void SetScrollPage(SIZE sizeLogPage) + { + SetScrollPage(sizeLogPage.cx, sizeLogPage.cy); + } + + void GetScrollPage(SIZE& sizeLogPage) const + { + sizeLogPage = m_sizeLogPage; + } + + void SetZoomScale(float fZoomScale) + { + ATLASSERT(fZoomScale > 0); + + if(fZoomScale > 0 && fZoomScale >= m_fZoomScaleMin) + m_fZoomScale = fZoomScale; + } + + float GetZoomScale() const + { + return m_fZoomScale; + } + + void SetZoomScaleMin(float fZoomScaleMin) + { + m_fZoomScaleMin = fZoomScaleMin; + } + + float GetZoomScaleMin() const + { + return m_fZoomScaleMin; + } + + void SetZoomDelta(float fZoomDelta) + { + ATLASSERT(fZoomDelta >= 0); + + if(fZoomDelta >= 0) + m_fZoomDelta = fZoomDelta; + } + + float GetZoomDelta() const + { + return m_fZoomDelta; + } + + void SetZoomMode(int nZoomMode) + { + m_nZoomMode = nZoomMode; + } + + int GetZoomMode() const + { + return m_nZoomMode; + } + + void Zoom(int x, int y, float fZoomScale) + { + if(fZoomScale <= 0) + return; + + fZoomScale = max(fZoomScale, m_fZoomScaleMin); + + T* pT = static_cast(this); + POINT pt = { x, y }; + if(!pT->PtInDevRect(pt)) + return; + + pT->ViewDPtoLP(&pt); + pT->Zoom(fZoomScale, false); + pT->CenterOnLogicalPoint(pt); + } + + void Zoom(POINT pt, float fZoomScale) + { + T* pT = static_cast(this); + pT->Zoom(pt.x, pt.y, fZoomScale); + } + + void Zoom(RECT& rc) + { + T* pT = static_cast(this); + RECT rcZoom = rc; + pT->NormalizeRect(rcZoom); + SIZE size = { rcZoom.right - rcZoom.left, rcZoom.bottom - rcZoom.top }; + POINT pt = { rcZoom.left + size.cx / 2, rcZoom.top + size.cy / 2 }; + if(size.cx < m_cxyMinZoomRect || size.cy < m_cxyMinZoomRect) + { + pT->Zoom(pt, m_fZoomScale + m_fZoomDelta); + return; + } + + ATLASSERT(size.cx > 0 && size.cy > 0); + + float fScaleH = (float)(m_sizeClient.cx + 1) / (float)size.cx; + float fScaleV = (float)(m_sizeClient.cy + 1) / (float)size.cy; + float fZoomScale = min(fScaleH, fScaleV) * m_fZoomScale; + pT->Zoom(pt, fZoomScale); + } + + void Zoom(float fZoomScale, bool bCenter = true) + { + if(fZoomScale <= 0) + return; + + fZoomScale = max(fZoomScale, m_fZoomScaleMin); + + + T* pT = static_cast(this); + POINT pt = { 0 }; + if(bCenter) + { + RECT rc; + ::GetClientRect(pT->m_hWnd, &rc); + pt.x = rc.right / 2; + pt.y = rc.bottom / 2; + pT->ViewDPtoLP(&pt); + } + + // Modify the Viewport extent + m_fZoomScale = fZoomScale; + SIZE sizeAll = { 0 }; + sizeAll.cx = (int)((float)m_sizeLogAll.cx * fZoomScale); + sizeAll.cy = (int)((float)m_sizeLogAll.cy * fZoomScale); + + // Update scroll bars and window + CScrollImpl< T >::SetScrollSize(sizeAll); + + if(bCenter) + pT->CenterOnLogicalPoint(pt); + } + + // Helper functions + void PrepareDC(CDCHandle dc) + { + ATLASSERT(m_sizeAll.cx >= 0 && m_sizeAll.cy >= 0); + dc.SetMapMode(MM_ANISOTROPIC); + dc.SetWindowExt(m_sizeLogAll); + dc.SetViewportExt(m_sizeAll); + dc.SetViewportOrg(-m_ptOffset.x, -m_ptOffset.y); + } + + void ViewDPtoLP(LPPOINT lpPoints, int nCount = 1) + { + ATLASSERT(lpPoints); + T* pT = static_cast(this); + ATLASSERT(::IsWindow(pT->m_hWnd)); + + CWindowDC dc(pT->m_hWnd); + pT->PrepareDC(dc.m_hDC); + dc.DPtoLP(lpPoints, nCount); + } + + void ViewLPtoDP(LPPOINT lpPoints, int nCount = 1) + { + ATLASSERT(lpPoints); + T* pT = static_cast(this); + ATLASSERT(::IsWindow(pT->m_hWnd)); + + CWindowDC dc(pT->m_hWnd); + pT->PrepareDC(dc.m_hDC); + dc.LPtoDP(lpPoints, nCount); + } + + void ClientToDevice(POINT &pt) + { + pt.x += m_ptOffset.x; + pt.y += m_ptOffset.y; + } + + void DeviceToClient(POINT &pt) + { + pt.x -= m_ptOffset.x; + pt.y -= m_ptOffset.y; + } + + void CenterOnPoint(POINT pt) + { + T* pT = static_cast(this); + RECT rect; + pT->GetClientRect(&rect); + + int xOfs = pt.x - (rect.right / 2) + m_ptOffset.x; + if(xOfs < 0) + { + xOfs = 0; + } + else + { + int xMax = max((int)(m_sizeAll.cx - rect.right), 0); + if(xOfs > xMax) + xOfs = xMax; + } + + int yOfs = pt.y - (rect.bottom / 2) + m_ptOffset.y; + if(yOfs < 0) + { + yOfs = 0; + } + else + { + int yMax = max((int)(m_sizeAll.cy - rect.bottom), 0); + if(yOfs > yMax) + yOfs = yMax; + } + + CScrollImpl< T >::SetScrollOffset(xOfs, yOfs); + } + + void CenterOnLogicalPoint(POINT ptLog) + { + T* pT = static_cast(this); + pT->ViewLPtoDP(&ptLog); + pT->DeviceToClient(ptLog); + pT->CenterOnPoint(ptLog); + } + + BOOL PtInDevRect(POINT pt) + { + RECT rc = { 0, 0, m_sizeAll.cx, m_sizeAll.cy }; + ::OffsetRect(&rc, -m_ptOffset.x, -m_ptOffset.y); + return ::PtInRect(&rc, pt); + } + + void NormalizeRect(RECT& rc) + { + if(rc.left > rc.right) + { + int r = rc.right; + rc.right = rc.left; + rc.left = r; + } + if(rc.top > rc.bottom) + { + int b = rc.bottom; + rc.bottom = rc.top; + rc.top = b; + } + } + + void DrawTrackRect() + { + T* pT = static_cast(this); + const SIZE sizeLines = { 2, 2 }; + RECT rc = m_rcTrack; + pT->NormalizeRect(rc); + if(!::IsRectEmpty(&rc)) + { + ::MapWindowPoints(pT->m_hWnd, NULL, (LPPOINT)&rc, 2); + CWindowDC dc(NULL); + dc.DrawDragRect(&rc, sizeLines, NULL, sizeLines); + } + } + + void NotifyParentZoomChanged() + { + T* pT = static_cast(this); + int nId = pT->GetDlgCtrlID(); + NMHDR nmhdr = { pT->m_hWnd, nId, ZSN_ZOOMCHANGED }; + ::SendMessage(pT->GetParent(), WM_NOTIFY, (WPARAM)nId, (LPARAM)&nmhdr); + } + + BEGIN_MSG_MAP(CZoomScrollImpl) + MESSAGE_HANDLER(WM_SETCURSOR, OnSetCursor) + MESSAGE_HANDLER(WM_VSCROLL, CScrollImpl< T >::OnVScroll) + MESSAGE_HANDLER(WM_HSCROLL, CScrollImpl< T >::OnHScroll) + MESSAGE_HANDLER(WM_MOUSEWHEEL, CScrollImpl< T >::OnMouseWheel) +#if !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) + MESSAGE_HANDLER(m_uMsgMouseWheel, CScrollImpl< T >::OnMouseWheel) +#endif // !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) + MESSAGE_HANDLER(WM_MOUSEHWHEEL, CScrollImpl< T >::OnMouseHWheel) + MESSAGE_HANDLER(WM_SETTINGCHANGE, CScrollImpl< T >::OnSettingChange) + MESSAGE_HANDLER(WM_SIZE, CScrollImpl< T >::OnSize) + MESSAGE_HANDLER(WM_PAINT, OnPaint) + MESSAGE_HANDLER(WM_PRINTCLIENT, OnPaint) + MESSAGE_HANDLER(WM_LBUTTONDOWN, OnLButtonDown) + MESSAGE_HANDLER(WM_MOUSEMOVE, OnMouseMove) + MESSAGE_HANDLER(WM_LBUTTONUP, OnLButtonUp) + MESSAGE_HANDLER(WM_CAPTURECHANGED, OnCaptureChanged) + ALT_MSG_MAP(1) + COMMAND_ID_HANDLER(ID_SCROLL_UP, CScrollImpl< T >::OnScrollUp) + COMMAND_ID_HANDLER(ID_SCROLL_DOWN, CScrollImpl< T >::OnScrollDown) + COMMAND_ID_HANDLER(ID_SCROLL_PAGE_UP, CScrollImpl< T >::OnScrollPageUp) + COMMAND_ID_HANDLER(ID_SCROLL_PAGE_DOWN, CScrollImpl< T >::OnScrollPageDown) + COMMAND_ID_HANDLER(ID_SCROLL_TOP, CScrollImpl< T >::OnScrollTop) + COMMAND_ID_HANDLER(ID_SCROLL_BOTTOM, CScrollImpl< T >::OnScrollBottom) + COMMAND_ID_HANDLER(ID_SCROLL_LEFT, CScrollImpl< T >::OnScrollLeft) + COMMAND_ID_HANDLER(ID_SCROLL_RIGHT, CScrollImpl< T >::OnScrollRight) + COMMAND_ID_HANDLER(ID_SCROLL_PAGE_LEFT, CScrollImpl< T >::OnScrollPageLeft) + COMMAND_ID_HANDLER(ID_SCROLL_PAGE_RIGHT, CScrollImpl< T >::OnScrollPageRight) + COMMAND_ID_HANDLER(ID_SCROLL_ALL_LEFT, CScrollImpl< T >::OnScrollAllLeft) + COMMAND_ID_HANDLER(ID_SCROLL_ALL_RIGHT, CScrollImpl< T >::OnScrollAllRight) + END_MSG_MAP() + + LRESULT OnPaint(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/) + { + T* pT = static_cast(this); + ATLASSERT(::IsWindow(pT->m_hWnd)); + ATLASSERT(m_sizeLogAll.cx >= 0 && m_sizeLogAll.cy >= 0); + ATLASSERT(m_sizeAll.cx >= 0 && m_sizeAll.cy >= 0); + + if(wParam != NULL) + { + CDCHandle dc = (HDC)wParam; + int nMapModeSav = dc.GetMapMode(); + dc.SetMapMode(MM_ANISOTROPIC); + SIZE szWindowExt = { 0, 0 }; + dc.SetWindowExt(m_sizeLogAll, &szWindowExt); + SIZE szViewportExt = { 0, 0 }; + dc.SetViewportExt(m_sizeAll, &szViewportExt); + POINT ptViewportOrg = { 0, 0 }; + dc.SetViewportOrg(-m_ptOffset.x, -m_ptOffset.y, &ptViewportOrg); + + pT->DoPaint(dc); + + dc.SetMapMode(nMapModeSav); + dc.SetWindowExt(szWindowExt); + dc.SetViewportExt(szViewportExt); + dc.SetViewportOrg(ptViewportOrg); + } + else + { + CPaintDC dc(pT->m_hWnd); + pT->PrepareDC(dc.m_hDC); + pT->DoPaint(dc.m_hDC); + } + return 0; + } + + LRESULT OnLButtonDown(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled) + { + if(m_nZoomMode == ZOOMMODE_IN && !m_bTracking) + { + T* pT = static_cast(this); + POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; + if(pT->PtInDevRect(pt)) + { + pT->SetCapture(); + m_bTracking = true; + ::SetRect(&m_rcTrack, pt.x, pt.y, pt.x, pt.y); + } + } + bHandled = FALSE; + return 0; + } + + LRESULT OnMouseMove(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled) + { + if(m_bTracking) + { + T* pT = static_cast(this); + POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; + if(pT->PtInDevRect(pt)) + { + pT->DrawTrackRect(); + m_rcTrack.right = pt.x; + m_rcTrack.bottom = pt.y; + pT->DrawTrackRect(); + } + } + bHandled = FALSE; + return 0; + } + + LRESULT OnLButtonUp(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled) + { + ::ReleaseCapture(); + if(m_nZoomMode == ZOOMMODE_OUT) + { + T* pT = static_cast(this); + pT->Zoom(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam), m_fZoomScale - m_fZoomDelta); + pT->NotifyParentZoomChanged(); + } + bHandled = FALSE; + return 0; + } + + LRESULT OnCaptureChanged(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) + { + if(m_bTracking) + { + m_bTracking = false; + T* pT = static_cast(this); + pT->DrawTrackRect(); + pT->Zoom(m_rcTrack); + pT->NotifyParentZoomChanged(); + ::SetRectEmpty(&m_rcTrack); + } + bHandled = FALSE; + return 0; + } + + LRESULT OnSetCursor(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled) + { + if(LOWORD(lParam) == HTCLIENT && m_nZoomMode != ZOOMMODE_OFF) + { + T* pT = static_cast(this); + if((HWND)wParam == pT->m_hWnd) + { + DWORD dwPos = ::GetMessagePos(); + POINT pt = { GET_X_LPARAM(dwPos), GET_Y_LPARAM(dwPos) }; + pT->ScreenToClient(&pt); + if(pT->PtInDevRect(pt)) + { + ::SetCursor(::LoadCursor(NULL, IDC_CROSS)); + return 1; + } + } + } + bHandled = FALSE; + return 0; + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// CZoomScrollWindowImpl - Implements scrolling window with zooming + +template +class ATL_NO_VTABLE CZoomScrollWindowImpl : public ATL::CWindowImpl< T, TBase, TWinTraits >, public CZoomScrollImpl< T > +{ +public: + BEGIN_MSG_MAP(CZoomScrollWindowImpl) + MESSAGE_HANDLER(WM_SETCURSOR, CZoomScrollImpl< T >::OnSetCursor) + MESSAGE_HANDLER(WM_VSCROLL, CScrollImpl< T >::OnVScroll) + MESSAGE_HANDLER(WM_HSCROLL, CScrollImpl< T >::OnHScroll) + MESSAGE_HANDLER(WM_MOUSEWHEEL, CScrollImpl< T >::OnMouseWheel) +#if !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) + MESSAGE_HANDLER(m_uMsgMouseWheel, CScrollImpl< T >::OnMouseWheel) +#endif // !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) + MESSAGE_HANDLER(WM_MOUSEHWHEEL, CScrollImpl< T >::OnMouseHWheel) + MESSAGE_HANDLER(WM_SETTINGCHANGE, CScrollImpl< T >::OnSettingChange) + MESSAGE_HANDLER(WM_SIZE, CScrollImpl< T >::OnSize) + MESSAGE_HANDLER(WM_PAINT, CZoomScrollImpl< T >::OnPaint) + MESSAGE_HANDLER(WM_PRINTCLIENT, CZoomScrollImpl< T >::OnPaint) + MESSAGE_HANDLER(WM_LBUTTONDOWN, CZoomScrollImpl< T >::OnLButtonDown) + MESSAGE_HANDLER(WM_MOUSEMOVE, CZoomScrollImpl< T >::OnMouseMove) + MESSAGE_HANDLER(WM_LBUTTONUP, CZoomScrollImpl< T >::OnLButtonUp) + MESSAGE_HANDLER(WM_CAPTURECHANGED, CZoomScrollImpl< T >::OnCaptureChanged) + ALT_MSG_MAP(1) + COMMAND_ID_HANDLER(ID_SCROLL_UP, CScrollImpl< T >::OnScrollUp) + COMMAND_ID_HANDLER(ID_SCROLL_DOWN, CScrollImpl< T >::OnScrollDown) + COMMAND_ID_HANDLER(ID_SCROLL_PAGE_UP, CScrollImpl< T >::OnScrollPageUp) + COMMAND_ID_HANDLER(ID_SCROLL_PAGE_DOWN, CScrollImpl< T >::OnScrollPageDown) + COMMAND_ID_HANDLER(ID_SCROLL_TOP, CScrollImpl< T >::OnScrollTop) + COMMAND_ID_HANDLER(ID_SCROLL_BOTTOM, CScrollImpl< T >::OnScrollBottom) + COMMAND_ID_HANDLER(ID_SCROLL_LEFT, CScrollImpl< T >::OnScrollLeft) + COMMAND_ID_HANDLER(ID_SCROLL_RIGHT, CScrollImpl< T >::OnScrollRight) + COMMAND_ID_HANDLER(ID_SCROLL_PAGE_LEFT, CScrollImpl< T >::OnScrollPageLeft) + COMMAND_ID_HANDLER(ID_SCROLL_PAGE_RIGHT, CScrollImpl< T >::OnScrollPageRight) + COMMAND_ID_HANDLER(ID_SCROLL_ALL_LEFT, CScrollImpl< T >::OnScrollAllLeft) + COMMAND_ID_HANDLER(ID_SCROLL_ALL_RIGHT, CScrollImpl< T >::OnScrollAllRight) + END_MSG_MAP() +}; + +#endif // !_WIN32_WCE + + +/////////////////////////////////////////////////////////////////////////////// +// CScrollContainer + +template +class ATL_NO_VTABLE CScrollContainerImpl : public CScrollWindowImpl< T, TBase, TWinTraits > +{ +public: + DECLARE_WND_CLASS_EX(NULL, 0, -1) + + typedef CScrollWindowImpl< T, TBase, TWinTraits > _baseClass; + +// Data members + ATL::CWindow m_wndClient; + bool m_bAutoSizeClient; + bool m_bDrawEdgeIfEmpty; + +// Constructor + CScrollContainerImpl() : m_bAutoSizeClient(true), m_bDrawEdgeIfEmpty(false) + { + // Set CScrollWindowImpl extended style + SetScrollExtendedStyle(SCRL_SCROLLCHILDREN); + } + +// Attributes + HWND GetClient() const + { + return m_wndClient; + } + + HWND SetClient(HWND hWndClient, bool bClientSizeAsMin = true) + { + ATLASSERT(::IsWindow(m_hWnd)); + + HWND hWndOldClient = m_wndClient; + m_wndClient = hWndClient; + + SetRedraw(FALSE); + SetScrollSize(1, 1, FALSE); + + if(m_wndClient.m_hWnd != NULL) + { + m_wndClient.SetWindowPos(NULL, 0, 0, 0, 0, SWP_NOZORDER | SWP_NOSIZE); + + if(bClientSizeAsMin) + { + RECT rect = { 0 }; + m_wndClient.GetWindowRect(&rect); + if((rect.right - rect.left) > 0 && (rect.bottom - rect.top) > 0) + SetScrollSize(rect.right - rect.left, rect.bottom - rect.top, FALSE); + } + + T* pT = static_cast(this); + pT->UpdateLayout(); + } + + SetRedraw(TRUE); + RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_FRAME | RDW_UPDATENOW | RDW_ALLCHILDREN); + + return hWndOldClient; + } + +// Message map and handlers + BEGIN_MSG_MAP(CScrollContainerImpl) + MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus) + MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground) + MESSAGE_HANDLER(WM_SIZE, OnSize) + CHAIN_MSG_MAP(_baseClass) + FORWARD_NOTIFICATIONS() + ALT_MSG_MAP(1) + CHAIN_MSG_MAP_ALT(_baseClass, 1) + END_MSG_MAP() + + LRESULT OnSetFocus(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) + { + if(m_wndClient.m_hWnd != NULL) + m_wndClient.SetFocus(); + + return 0; + } + + LRESULT OnEraseBackground(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) + { + return 1; // no background needed + } + + LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) + { + BOOL bTmp = TRUE; + LRESULT lRet = _baseClass::OnSize(uMsg, wParam, lParam, bTmp); + + T* pT = static_cast(this); + pT->UpdateLayout(); + + return lRet; + } + +// Overrides for CScrollWindowImpl + void DoPaint(CDCHandle dc) + { + if(!m_bAutoSizeClient || m_wndClient.m_hWnd == NULL) + { + T* pT = static_cast(this); + RECT rect = { 0 }; + pT->GetContainerRect(rect); + + if(m_bDrawEdgeIfEmpty && m_wndClient.m_hWnd == NULL) + dc.DrawEdge(&rect, EDGE_SUNKEN, BF_RECT | BF_ADJUST); + + dc.FillRect(&rect, COLOR_APPWORKSPACE); + } + } + + void ScrollToView(POINT pt) + { + CScrollWindowImpl< T, TBase, TWinTraits >::ScrollToView(pt); + } + + void ScrollToView(RECT& rect) + { + CScrollWindowImpl< T, TBase, TWinTraits >::ScrollToView(rect); + } + + void ScrollToView(HWND hWnd) // client window coordinates + { + T* pT = static_cast(this); + pT; // avoid level 4 warning + ATLASSERT(::IsWindow(pT->m_hWnd)); + ATLASSERT(m_wndClient.IsWindow()); + + RECT rect = { 0 }; + ::GetWindowRect(hWnd, &rect); + ::MapWindowPoints(NULL, m_wndClient.m_hWnd, (LPPOINT)&rect, 2); + ScrollToView(rect); + } + +// Implementation - overrideable methods + void UpdateLayout() + { + ATLASSERT(::IsWindow(m_hWnd)); + + if(m_bAutoSizeClient && m_wndClient.m_hWnd != NULL) + { + T* pT = static_cast(this); + RECT rect = { 0 }; + pT->GetContainerRect(rect); + + m_wndClient.SetWindowPos(NULL, &rect, SWP_NOZORDER | SWP_NOMOVE); + } + else + { + Invalidate(); + } + } + + void GetContainerRect(RECT& rect) + { + GetClientRect(&rect); + + if(rect.right < m_sizeAll.cx) + rect.right = m_sizeAll.cx; + + if(rect.bottom < m_sizeAll.cy) + rect.bottom = m_sizeAll.cy; + } +}; + +class CScrollContainer : public CScrollContainerImpl +{ +public: + DECLARE_WND_CLASS_EX(_T("WTL_ScrollContainer"), 0, -1) +}; + +}; // namespace WTL + +#endif // __ATLSCRL_H__ diff --git a/Externals/WTL80/atlsplit.h b/Externals/WTL80/atlsplit.h new file mode 100644 index 0000000000..df879dbc78 --- /dev/null +++ b/Externals/WTL80/atlsplit.h @@ -0,0 +1,892 @@ +// Windows Template Library - WTL version 8.0 +// Copyright (C) Microsoft Corporation. All rights reserved. +// +// This file is a part of the Windows Template Library. +// The use and distribution terms for this software are covered by the +// Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php) +// which can be found in the file CPL.TXT at the root of this distribution. +// By using this software in any fashion, you are agreeing to be bound by +// the terms of this license. You must not remove this notice, or +// any other, from this software. + +#ifndef __ATLSPLIT_H__ +#define __ATLSPLIT_H__ + +#pragma once + +#ifndef __cplusplus + #error ATL requires C++ compilation (use a .cpp suffix) +#endif + +#ifndef __ATLAPP_H__ + #error atlsplit.h requires atlapp.h to be included first +#endif + +#ifndef __ATLWIN_H__ + #error atlsplit.h requires atlwin.h to be included first +#endif + + +/////////////////////////////////////////////////////////////////////////////// +// Classes in this file: +// +// CSplitterImpl +// CSplitterWindowImpl +// CSplitterWindowT + + +namespace WTL +{ + +/////////////////////////////////////////////////////////////////////////////// +// CSplitterImpl - Provides splitter support to any window + +// Splitter panes constants +#define SPLIT_PANE_LEFT 0 +#define SPLIT_PANE_RIGHT 1 +#define SPLIT_PANE_TOP SPLIT_PANE_LEFT +#define SPLIT_PANE_BOTTOM SPLIT_PANE_RIGHT +#define SPLIT_PANE_NONE -1 + +// Splitter extended styles +#define SPLIT_PROPORTIONAL 0x00000001 +#define SPLIT_NONINTERACTIVE 0x00000002 +#define SPLIT_RIGHTALIGNED 0x00000004 +#define SPLIT_BOTTOMALIGNED SPLIT_RIGHTALIGNED + +// Note: SPLIT_PROPORTIONAL and SPLIT_RIGHTALIGNED/SPLIT_BOTTOMALIGNED are +// mutually exclusive. If both are set, splitter defaults to SPLIT_PROPORTIONAL + + +template +class CSplitterImpl +{ +public: + enum { m_nPanesCount = 2, m_nPropMax = 10000 }; + + HWND m_hWndPane[m_nPanesCount]; + RECT m_rcSplitter; + int m_xySplitterPos; + int m_nDefActivePane; + int m_cxySplitBar; // splitter bar width/height + static HCURSOR m_hCursor; + int m_cxyMin; // minimum pane size + int m_cxyBarEdge; // splitter bar edge + bool m_bFullDrag; + int m_cxyDragOffset; + int m_nProportionalPos; + bool m_bUpdateProportionalPos; + DWORD m_dwExtendedStyle; // splitter specific extended styles + int m_nSinglePane; // single pane mode + +// Constructor + CSplitterImpl() : + m_xySplitterPos(-1), m_nDefActivePane(SPLIT_PANE_NONE), + m_cxySplitBar(0), m_cxyMin(0), m_cxyBarEdge(0), m_bFullDrag(true), + m_cxyDragOffset(0), m_nProportionalPos(0), m_bUpdateProportionalPos(true), + m_dwExtendedStyle(SPLIT_PROPORTIONAL), + m_nSinglePane(SPLIT_PANE_NONE) + { + m_hWndPane[SPLIT_PANE_LEFT] = NULL; + m_hWndPane[SPLIT_PANE_RIGHT] = NULL; + + ::SetRectEmpty(&m_rcSplitter); + + if(m_hCursor == NULL) + { + CStaticDataInitCriticalSectionLock lock; + if(FAILED(lock.Lock())) + { + ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CSplitterImpl::CSplitterImpl.\n")); + ATLASSERT(FALSE); + return; + } + + if(m_hCursor == NULL) + m_hCursor = ::LoadCursor(NULL, t_bVertical ? IDC_SIZEWE : IDC_SIZENS); + + lock.Unlock(); + } + } + +// Attributes + void SetSplitterRect(LPRECT lpRect = NULL, bool bUpdate = true) + { + if(lpRect == NULL) + { + T* pT = static_cast(this); + pT->GetClientRect(&m_rcSplitter); + } + else + { + m_rcSplitter = *lpRect; + } + + if(IsProportional()) + UpdateProportionalPos(); + else if(IsRightAligned()) + UpdateRightAlignPos(); + + if(bUpdate) + UpdateSplitterLayout(); + } + + void GetSplitterRect(LPRECT lpRect) const + { + ATLASSERT(lpRect != NULL); + *lpRect = m_rcSplitter; + } + + bool SetSplitterPos(int xyPos = -1, bool bUpdate = true) + { + if(xyPos == -1) // -1 == middle + { + if(t_bVertical) + xyPos = (m_rcSplitter.right - m_rcSplitter.left - m_cxySplitBar - m_cxyBarEdge) / 2; + else + xyPos = (m_rcSplitter.bottom - m_rcSplitter.top - m_cxySplitBar - m_cxyBarEdge) / 2; + } + + // Adjust if out of valid range + int cxyMax = 0; + if(t_bVertical) + cxyMax = m_rcSplitter.right - m_rcSplitter.left; + else + cxyMax = m_rcSplitter.bottom - m_rcSplitter.top; + + if(xyPos < m_cxyMin + m_cxyBarEdge) + xyPos = m_cxyMin; + else if(xyPos > (cxyMax - m_cxySplitBar - m_cxyBarEdge - m_cxyMin)) + xyPos = cxyMax - m_cxySplitBar - m_cxyBarEdge - m_cxyMin; + + // Set new position and update if requested + bool bRet = (m_xySplitterPos != xyPos); + m_xySplitterPos = xyPos; + + if(m_bUpdateProportionalPos) + { + if(IsProportional()) + StoreProportionalPos(); + else if(IsRightAligned()) + StoreRightAlignPos(); + } + else + { + m_bUpdateProportionalPos = true; + } + + if(bUpdate && bRet) + UpdateSplitterLayout(); + + return bRet; + } + + void SetSplitterPosPct(int nPct, bool bUpdate = true) + { + ATLASSERT(nPct >= 0 && nPct <= 100); + + m_nProportionalPos = ::MulDiv(nPct, m_nPropMax, 100); + UpdateProportionalPos(); + + if(bUpdate) + UpdateSplitterLayout(); + } + + int GetSplitterPos() const + { + return m_xySplitterPos; + } + + bool SetSinglePaneMode(int nPane = SPLIT_PANE_NONE) + { + ATLASSERT(nPane == SPLIT_PANE_LEFT || nPane == SPLIT_PANE_RIGHT || nPane == SPLIT_PANE_NONE); + if(!(nPane == SPLIT_PANE_LEFT || nPane == SPLIT_PANE_RIGHT || nPane == SPLIT_PANE_NONE)) + return false; + + if(nPane != SPLIT_PANE_NONE) + { + if(!::IsWindowVisible(m_hWndPane[nPane])) + ::ShowWindow(m_hWndPane[nPane], SW_SHOW); + int nOtherPane = (nPane == SPLIT_PANE_LEFT) ? SPLIT_PANE_RIGHT : SPLIT_PANE_LEFT; + ::ShowWindow(m_hWndPane[nOtherPane], SW_HIDE); + if(m_nDefActivePane != nPane) + m_nDefActivePane = nPane; + } + else if(m_nSinglePane != SPLIT_PANE_NONE) + { + int nOtherPane = (m_nSinglePane == SPLIT_PANE_LEFT) ? SPLIT_PANE_RIGHT : SPLIT_PANE_LEFT; + ::ShowWindow(m_hWndPane[nOtherPane], SW_SHOW); + } + + m_nSinglePane = nPane; + UpdateSplitterLayout(); + return true; + } + + int GetSinglePaneMode() const + { + return m_nSinglePane; + } + + DWORD GetSplitterExtendedStyle() const + { + return m_dwExtendedStyle; + } + + DWORD SetSplitterExtendedStyle(DWORD dwExtendedStyle, DWORD dwMask = 0) + { + DWORD dwPrevStyle = m_dwExtendedStyle; + if(dwMask == 0) + m_dwExtendedStyle = dwExtendedStyle; + else + m_dwExtendedStyle = (m_dwExtendedStyle & ~dwMask) | (dwExtendedStyle & dwMask); +#ifdef _DEBUG + if(IsProportional() && IsRightAligned()) + ATLTRACE2(atlTraceUI, 0, _T("CSplitterImpl::SetSplitterExtendedStyle - SPLIT_PROPORTIONAL and SPLIT_RIGHTALIGNED are mutually exclusive, defaulting to SPLIT_PROPORTIONAL.\n")); +#endif // _DEBUG + return dwPrevStyle; + } + +// Splitter operations + void SetSplitterPanes(HWND hWndLeftTop, HWND hWndRightBottom, bool bUpdate = true) + { + m_hWndPane[SPLIT_PANE_LEFT] = hWndLeftTop; + m_hWndPane[SPLIT_PANE_RIGHT] = hWndRightBottom; + ATLASSERT(m_hWndPane[SPLIT_PANE_LEFT] == NULL || m_hWndPane[SPLIT_PANE_RIGHT] == NULL || m_hWndPane[SPLIT_PANE_LEFT] != m_hWndPane[SPLIT_PANE_RIGHT]); + if(bUpdate) + UpdateSplitterLayout(); + } + + bool SetSplitterPane(int nPane, HWND hWnd, bool bUpdate = true) + { + ATLASSERT(nPane == SPLIT_PANE_LEFT || nPane == SPLIT_PANE_RIGHT); + + if(nPane != SPLIT_PANE_LEFT && nPane != SPLIT_PANE_RIGHT) + return false; + m_hWndPane[nPane] = hWnd; + ATLASSERT(m_hWndPane[SPLIT_PANE_LEFT] == NULL || m_hWndPane[SPLIT_PANE_RIGHT] == NULL || m_hWndPane[SPLIT_PANE_LEFT] != m_hWndPane[SPLIT_PANE_RIGHT]); + if(bUpdate) + UpdateSplitterLayout(); + return true; + } + + HWND GetSplitterPane(int nPane) const + { + ATLASSERT(nPane == SPLIT_PANE_LEFT || nPane == SPLIT_PANE_RIGHT); + + if(nPane != SPLIT_PANE_LEFT && nPane != SPLIT_PANE_RIGHT) + return false; + return m_hWndPane[nPane]; + } + + bool SetActivePane(int nPane) + { + ATLASSERT(nPane == SPLIT_PANE_LEFT || nPane == SPLIT_PANE_RIGHT); + + if(nPane != SPLIT_PANE_LEFT && nPane != SPLIT_PANE_RIGHT) + return false; + if(m_nSinglePane != SPLIT_PANE_NONE && nPane != m_nSinglePane) + return false; + ::SetFocus(m_hWndPane[nPane]); + m_nDefActivePane = nPane; + return true; + } + + int GetActivePane() const + { + int nRet = SPLIT_PANE_NONE; + HWND hWndFocus = ::GetFocus(); + if(hWndFocus != NULL) + { + for(int nPane = 0; nPane < m_nPanesCount; nPane++) + { + if(hWndFocus == m_hWndPane[nPane] || ::IsChild(m_hWndPane[nPane], hWndFocus)) + { + nRet = nPane; + break; + } + } + } + return nRet; + } + + bool ActivateNextPane(bool bNext = true) + { + int nPane = m_nSinglePane; + if(nPane == SPLIT_PANE_NONE) + { + switch(GetActivePane()) + { + case SPLIT_PANE_LEFT: + nPane = SPLIT_PANE_RIGHT; + break; + case SPLIT_PANE_RIGHT: + nPane = SPLIT_PANE_LEFT; + break; + default: + nPane = bNext ? SPLIT_PANE_LEFT : SPLIT_PANE_RIGHT; + break; + } + } + return SetActivePane(nPane); + } + + bool SetDefaultActivePane(int nPane) + { + ATLASSERT(nPane == SPLIT_PANE_LEFT || nPane == SPLIT_PANE_RIGHT); + + if(nPane != SPLIT_PANE_LEFT && nPane != SPLIT_PANE_RIGHT) + return false; + m_nDefActivePane = nPane; + return true; + } + + bool SetDefaultActivePane(HWND hWnd) + { + for(int nPane = 0; nPane < m_nPanesCount; nPane++) + { + if(hWnd == m_hWndPane[nPane]) + { + m_nDefActivePane = nPane; + return true; + } + } + return false; // not found + } + + int GetDefaultActivePane() const + { + return m_nDefActivePane; + } + + void DrawSplitter(CDCHandle dc) + { + ATLASSERT(dc.m_hDC != NULL); + if(m_nSinglePane == SPLIT_PANE_NONE && m_xySplitterPos == -1) + return; + + T* pT = static_cast(this); + if(m_nSinglePane == SPLIT_PANE_NONE) + { + pT->DrawSplitterBar(dc); + + for(int nPane = 0; nPane < m_nPanesCount; nPane++) + { + if(m_hWndPane[nPane] == NULL) + pT->DrawSplitterPane(dc, nPane); + } + } + else + { + if(m_hWndPane[m_nSinglePane] == NULL) + pT->DrawSplitterPane(dc, m_nSinglePane); + } + } + +// Overrideables + void DrawSplitterBar(CDCHandle dc) + { + RECT rect; + if(GetSplitterBarRect(&rect)) + { + dc.FillRect(&rect, COLOR_3DFACE); + // draw 3D edge if needed + T* pT = static_cast(this); + if((pT->GetExStyle() & WS_EX_CLIENTEDGE) != 0) + dc.DrawEdge(&rect, EDGE_RAISED, t_bVertical ? (BF_LEFT | BF_RIGHT) : (BF_TOP | BF_BOTTOM)); + } + } + + // called only if pane is empty + void DrawSplitterPane(CDCHandle dc, int nPane) + { + RECT rect; + if(GetSplitterPaneRect(nPane, &rect)) + { + T* pT = static_cast(this); + if((pT->GetExStyle() & WS_EX_CLIENTEDGE) == 0) + dc.DrawEdge(&rect, EDGE_SUNKEN, BF_RECT | BF_ADJUST); + dc.FillRect(&rect, COLOR_APPWORKSPACE); + } + } + +// Message map and handlers + BEGIN_MSG_MAP(CSplitterImpl) + MESSAGE_HANDLER(WM_CREATE, OnCreate) + MESSAGE_HANDLER(WM_PAINT, OnPaint) +#ifndef _WIN32_WCE + MESSAGE_HANDLER(WM_PRINTCLIENT, OnPaint) +#endif // !_WIN32_WCE + if(IsInteractive()) + { + MESSAGE_HANDLER(WM_SETCURSOR, OnSetCursor) + MESSAGE_HANDLER(WM_MOUSEMOVE, OnMouseMove) + MESSAGE_HANDLER(WM_LBUTTONDOWN, OnLButtonDown) + MESSAGE_HANDLER(WM_LBUTTONUP, OnLButtonUp) + MESSAGE_HANDLER(WM_LBUTTONDBLCLK, OnLButtonDoubleClick) + MESSAGE_HANDLER(WM_CAPTURECHANGED, OnCaptureChanged) + } + MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus) +#ifndef _WIN32_WCE + MESSAGE_HANDLER(WM_MOUSEACTIVATE, OnMouseActivate) +#endif // !_WIN32_WCE + MESSAGE_HANDLER(WM_SETTINGCHANGE, OnSettingChange) + END_MSG_MAP() + + LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) + { + GetSystemSettings(false); + bHandled = FALSE; + return 1; + } + + LRESULT OnPaint(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) + { + T* pT = static_cast(this); + // try setting position if not set + if(m_nSinglePane == SPLIT_PANE_NONE && m_xySplitterPos == -1) + pT->SetSplitterPos(); + // do painting + CPaintDC dc(pT->m_hWnd); + pT->DrawSplitter(dc.m_hDC); + return 0; + } + + LRESULT OnSetCursor(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled) + { + T* pT = static_cast(this); + if((HWND)wParam == pT->m_hWnd && LOWORD(lParam) == HTCLIENT) + { + DWORD dwPos = ::GetMessagePos(); + POINT ptPos = { GET_X_LPARAM(dwPos), GET_Y_LPARAM(dwPos) }; + pT->ScreenToClient(&ptPos); + if(IsOverSplitterBar(ptPos.x, ptPos.y)) + return 1; + } + + bHandled = FALSE; + return 0; + } + + LRESULT OnMouseMove(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled) + { + T* pT = static_cast(this); + int xPos = GET_X_LPARAM(lParam); + int yPos = GET_Y_LPARAM(lParam); + if((wParam & MK_LBUTTON) && ::GetCapture() == pT->m_hWnd) + { + int xyNewSplitPos = 0; + if(t_bVertical) + xyNewSplitPos = xPos - m_rcSplitter.left - m_cxyDragOffset; + else + xyNewSplitPos = yPos - m_rcSplitter.top - m_cxyDragOffset; + + if(xyNewSplitPos == -1) // avoid -1, that means middle + xyNewSplitPos = -2; + + if(m_xySplitterPos != xyNewSplitPos) + { + if(m_bFullDrag) + { + if(pT->SetSplitterPos(xyNewSplitPos, true)) + pT->UpdateWindow(); + } + else + { + DrawGhostBar(); + pT->SetSplitterPos(xyNewSplitPos, false); + DrawGhostBar(); + } + } + } + else // not dragging, just set cursor + { + if(IsOverSplitterBar(xPos, yPos)) + ::SetCursor(m_hCursor); + bHandled = FALSE; + } + + return 0; + } + + LRESULT OnLButtonDown(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled) + { + int xPos = GET_X_LPARAM(lParam); + int yPos = GET_Y_LPARAM(lParam); + if(IsOverSplitterBar(xPos, yPos)) + { + T* pT = static_cast(this); + pT->SetCapture(); + ::SetCursor(m_hCursor); + if(!m_bFullDrag) + DrawGhostBar(); + if(t_bVertical) + m_cxyDragOffset = xPos - m_rcSplitter.left - m_xySplitterPos; + else + m_cxyDragOffset = yPos - m_rcSplitter.top - m_xySplitterPos; + } + bHandled = FALSE; + return 1; + } + + LRESULT OnLButtonUp(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) + { + ::ReleaseCapture(); + bHandled = FALSE; + return 1; + } + + LRESULT OnLButtonDoubleClick(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) + { + T* pT = static_cast(this); + pT->SetSplitterPos(); // middle + return 0; + } + + LRESULT OnCaptureChanged(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) + { + if(!m_bFullDrag) + { + DrawGhostBar(); + UpdateSplitterLayout(); + T* pT = static_cast(this); + pT->UpdateWindow(); + } + return 0; + } + + LRESULT OnSetFocus(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM, BOOL& bHandled) + { + if(m_nSinglePane == SPLIT_PANE_NONE) + { + if(m_nDefActivePane == SPLIT_PANE_LEFT || m_nDefActivePane == SPLIT_PANE_RIGHT) + ::SetFocus(m_hWndPane[m_nDefActivePane]); + } + else + { + ::SetFocus(m_hWndPane[m_nSinglePane]); + } + bHandled = FALSE; + return 1; + } + +#ifndef _WIN32_WCE + LRESULT OnMouseActivate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) + { + T* pT = static_cast(this); + LRESULT lRet = pT->DefWindowProc(uMsg, wParam, lParam); + if(lRet == MA_ACTIVATE || lRet == MA_ACTIVATEANDEAT) + { + DWORD dwPos = ::GetMessagePos(); + POINT pt = { GET_X_LPARAM(dwPos), GET_Y_LPARAM(dwPos) }; + pT->ScreenToClient(&pt); + RECT rcPane; + for(int nPane = 0; nPane < m_nPanesCount; nPane++) + { + if(GetSplitterPaneRect(nPane, &rcPane) && ::PtInRect(&rcPane, pt)) + { + m_nDefActivePane = nPane; + break; + } + } + } + return lRet; + } +#endif // !_WIN32_WCE + + LRESULT OnSettingChange(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) + { + GetSystemSettings(true); + return 0; + } + +// Implementation - internal helpers + void UpdateSplitterLayout() + { + if(m_nSinglePane == SPLIT_PANE_NONE && m_xySplitterPos == -1) + return; + + T* pT = static_cast(this); + RECT rect = { 0, 0, 0, 0 }; + if(m_nSinglePane == SPLIT_PANE_NONE) + { + if(GetSplitterBarRect(&rect)) + pT->InvalidateRect(&rect); + + for(int nPane = 0; nPane < m_nPanesCount; nPane++) + { + if(GetSplitterPaneRect(nPane, &rect)) + { + if(m_hWndPane[nPane] != NULL) + ::SetWindowPos(m_hWndPane[nPane], NULL, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, SWP_NOZORDER); + else + pT->InvalidateRect(&rect); + } + } + } + else + { + if(GetSplitterPaneRect(m_nSinglePane, &rect)) + { + if(m_hWndPane[m_nSinglePane] != NULL) + ::SetWindowPos(m_hWndPane[m_nSinglePane], NULL, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, SWP_NOZORDER); + else + pT->InvalidateRect(&rect); + } + } + } + + bool GetSplitterBarRect(LPRECT lpRect) const + { + ATLASSERT(lpRect != NULL); + if(m_nSinglePane != SPLIT_PANE_NONE || m_xySplitterPos == -1) + return false; + + if(t_bVertical) + { + lpRect->left = m_rcSplitter.left + m_xySplitterPos; + lpRect->top = m_rcSplitter.top; + lpRect->right = m_rcSplitter.left + m_xySplitterPos + m_cxySplitBar + m_cxyBarEdge; + lpRect->bottom = m_rcSplitter.bottom; + } + else + { + lpRect->left = m_rcSplitter.left; + lpRect->top = m_rcSplitter.top + m_xySplitterPos; + lpRect->right = m_rcSplitter.right; + lpRect->bottom = m_rcSplitter.top + m_xySplitterPos + m_cxySplitBar + m_cxyBarEdge; + } + + return true; + } + + bool GetSplitterPaneRect(int nPane, LPRECT lpRect) const + { + ATLASSERT(nPane == SPLIT_PANE_LEFT || nPane == SPLIT_PANE_RIGHT); + ATLASSERT(lpRect != NULL); + bool bRet = true; + if(m_nSinglePane != SPLIT_PANE_NONE) + { + if(nPane == m_nSinglePane) + *lpRect = m_rcSplitter; + else + bRet = false; + } + else if(nPane == SPLIT_PANE_LEFT) + { + if(t_bVertical) + { + lpRect->left = m_rcSplitter.left; + lpRect->top = m_rcSplitter.top; + lpRect->right = m_rcSplitter.left + m_xySplitterPos; + lpRect->bottom = m_rcSplitter.bottom; + } + else + { + lpRect->left = m_rcSplitter.left; + lpRect->top = m_rcSplitter.top; + lpRect->right = m_rcSplitter.right; + lpRect->bottom = m_rcSplitter.top + m_xySplitterPos; + } + } + else if(nPane == SPLIT_PANE_RIGHT) + { + if(t_bVertical) + { + lpRect->left = m_rcSplitter.left + m_xySplitterPos + m_cxySplitBar + m_cxyBarEdge; + lpRect->top = m_rcSplitter.top; + lpRect->right = m_rcSplitter.right; + lpRect->bottom = m_rcSplitter.bottom; + } + else + { + lpRect->left = m_rcSplitter.left; + lpRect->top = m_rcSplitter.top + m_xySplitterPos + m_cxySplitBar + m_cxyBarEdge; + lpRect->right = m_rcSplitter.right; + lpRect->bottom = m_rcSplitter.bottom; + } + } + else + { + bRet = false; + } + return bRet; + } + + bool IsOverSplitterRect(int x, int y) const + { + // -1 == don't check + return ((x == -1 || (x >= m_rcSplitter.left && x <= m_rcSplitter.right)) && + (y == -1 || (y >= m_rcSplitter.top && y <= m_rcSplitter.bottom))); + } + + bool IsOverSplitterBar(int x, int y) const + { + if(m_nSinglePane != SPLIT_PANE_NONE) + return false; + if(m_xySplitterPos == -1 || !IsOverSplitterRect(x, y)) + return false; + int xy = t_bVertical ? x : y; + int xyOff = t_bVertical ? m_rcSplitter.left : m_rcSplitter.top; + return ((xy >= (xyOff + m_xySplitterPos)) && (xy < xyOff + m_xySplitterPos + m_cxySplitBar + m_cxyBarEdge)); + } + + void DrawGhostBar() + { + RECT rect = { 0, 0, 0, 0 }; + if(GetSplitterBarRect(&rect)) + { + // invert the brush pattern (looks just like frame window sizing) + T* pT = static_cast(this); + CWindowDC dc(pT->m_hWnd); + CBrush brush = CDCHandle::GetHalftoneBrush(); + if(brush.m_hBrush != NULL) + { + CBrushHandle brushOld = dc.SelectBrush(brush); + dc.PatBlt(rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, PATINVERT); + dc.SelectBrush(brushOld); + } + } + } + + void GetSystemSettings(bool bUpdate) + { +#ifndef _WIN32_WCE + m_cxySplitBar = ::GetSystemMetrics(t_bVertical ? SM_CXSIZEFRAME : SM_CYSIZEFRAME); +#else // CE specific + m_cxySplitBar = 2 * ::GetSystemMetrics(t_bVertical ? SM_CXEDGE : SM_CYEDGE); +#endif // _WIN32_WCE + + T* pT = static_cast(this); + if((pT->GetExStyle() & WS_EX_CLIENTEDGE)) + { + m_cxyBarEdge = 2 * ::GetSystemMetrics(t_bVertical ? SM_CXEDGE : SM_CYEDGE); + m_cxyMin = 0; + } + else + { + m_cxyBarEdge = 0; + m_cxyMin = 2 * ::GetSystemMetrics(t_bVertical ? SM_CXEDGE : SM_CYEDGE); + } + +#ifndef _WIN32_WCE + ::SystemParametersInfo(SPI_GETDRAGFULLWINDOWS, 0, &m_bFullDrag, 0); +#endif // !_WIN32_WCE + + if(bUpdate) + UpdateSplitterLayout(); + } + + bool IsProportional() const + { + return ((m_dwExtendedStyle & SPLIT_PROPORTIONAL) != 0); + } + + void StoreProportionalPos() + { + int cxyTotal = t_bVertical ? (m_rcSplitter.right - m_rcSplitter.left - m_cxySplitBar - m_cxyBarEdge) : (m_rcSplitter.bottom - m_rcSplitter.top - m_cxySplitBar - m_cxyBarEdge); + if(cxyTotal > 0) + m_nProportionalPos = ::MulDiv(m_xySplitterPos, m_nPropMax, cxyTotal); + else + m_nProportionalPos = 0; + ATLTRACE2(atlTraceUI, 0, _T("CSplitterImpl::StoreProportionalPos - %i\n"), m_nProportionalPos); + } + + void UpdateProportionalPos() + { + int cxyTotal = t_bVertical ? (m_rcSplitter.right - m_rcSplitter.left - m_cxySplitBar - m_cxyBarEdge) : (m_rcSplitter.bottom - m_rcSplitter.top - m_cxySplitBar - m_cxyBarEdge); + if(cxyTotal > 0) + { + int xyNewPos = ::MulDiv(m_nProportionalPos, cxyTotal, m_nPropMax); + m_bUpdateProportionalPos = false; + T* pT = static_cast(this); + pT->SetSplitterPos(xyNewPos, false); + } + } + + bool IsRightAligned() const + { + return ((m_dwExtendedStyle & SPLIT_RIGHTALIGNED) != 0); + } + + void StoreRightAlignPos() + { + int cxyTotal = t_bVertical ? (m_rcSplitter.right - m_rcSplitter.left - m_cxySplitBar - m_cxyBarEdge) : (m_rcSplitter.bottom - m_rcSplitter.top - m_cxySplitBar - m_cxyBarEdge); + if(cxyTotal > 0) + m_nProportionalPos = cxyTotal - m_xySplitterPos; + else + m_nProportionalPos = 0; + ATLTRACE2(atlTraceUI, 0, _T("CSplitterImpl::StoreRightAlignPos - %i\n"), m_nProportionalPos); + } + + void UpdateRightAlignPos() + { + int cxyTotal = t_bVertical ? (m_rcSplitter.right - m_rcSplitter.left - m_cxySplitBar - m_cxyBarEdge) : (m_rcSplitter.bottom - m_rcSplitter.top - m_cxySplitBar - m_cxyBarEdge); + if(cxyTotal > 0) + { + m_bUpdateProportionalPos = false; + T* pT = static_cast(this); + pT->SetSplitterPos(cxyTotal - m_nProportionalPos, false); + } + } + + bool IsInteractive() const + { + return ((m_dwExtendedStyle & SPLIT_NONINTERACTIVE) == 0); + } +}; + +template HCURSOR CSplitterImpl< T, t_bVertical>::m_hCursor = NULL; + + +/////////////////////////////////////////////////////////////////////////////// +// CSplitterWindowImpl - Implements a splitter window + +template +class ATL_NO_VTABLE CSplitterWindowImpl : public ATL::CWindowImpl< T, TBase, TWinTraits >, public CSplitterImpl< T , t_bVertical > +{ +public: + DECLARE_WND_CLASS_EX(NULL, CS_DBLCLKS, COLOR_WINDOW) + + typedef CSplitterImpl< T , t_bVertical > _baseClass; + + BEGIN_MSG_MAP(CSplitterWindowImpl) + MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground) + MESSAGE_HANDLER(WM_SIZE, OnSize) + CHAIN_MSG_MAP(_baseClass) + FORWARD_NOTIFICATIONS() + END_MSG_MAP() + + LRESULT OnEraseBackground(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) + { + // handled, no background painting needed + return 1; + } + + LRESULT OnSize(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) + { + if(wParam != SIZE_MINIMIZED) + SetSplitterRect(); + + bHandled = FALSE; + return 1; + } +}; + + +/////////////////////////////////////////////////////////////////////////////// +// CSplitterWindow - Implements a splitter window to be used as is + +template +class CSplitterWindowT : public CSplitterWindowImpl, t_bVertical> +{ +public: + DECLARE_WND_CLASS_EX(_T("WTL_SplitterWindow"), CS_DBLCLKS, COLOR_WINDOW) +}; + +typedef CSplitterWindowT CSplitterWindow; +typedef CSplitterWindowT CHorSplitterWindow; + +}; // namespace WTL + +#endif // __ATLSPLIT_H__ diff --git a/Externals/WTL80/atltheme.h b/Externals/WTL80/atltheme.h new file mode 100644 index 0000000000..4c0725f4d9 --- /dev/null +++ b/Externals/WTL80/atltheme.h @@ -0,0 +1,1218 @@ +// Windows Template Library - WTL version 8.0 +// Copyright (C) Microsoft Corporation. All rights reserved. +// +// This file is a part of the Windows Template Library. +// The use and distribution terms for this software are covered by the +// Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php) +// which can be found in the file CPL.TXT at the root of this distribution. +// By using this software in any fashion, you are agreeing to be bound by +// the terms of this license. You must not remove this notice, or +// any other, from this software. + +#ifndef __ATLTHEME_H__ +#define __ATLTHEME_H__ + +#pragma once + +#ifndef __cplusplus + #error ATL requires C++ compilation (use a .cpp suffix) +#endif + +#ifdef _WIN32_WCE + #error atltheme.h is not supported on Windows CE +#endif + +#ifndef __ATLAPP_H__ + #error atltheme.h requires atlapp.h to be included first +#endif + +#ifndef __ATLWIN_H__ + #error atltheme.h requires atlwin.h to be included first +#endif + +#if (_WIN32_WINNT < 0x0501) + #error atltheme.h requires _WIN32_WINNT >= 0x0501 +#endif // (_WIN32_WINNT < 0x0501) + +#if defined(_WTL_USE_VSSYM32) || (defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN)) + #include +#else + #include +#endif + +#include +#pragma comment(lib, "uxtheme.lib") + +// Note: To create an application that also runs on older versions of Windows, +// use delay load of uxtheme.dll and ensure that no calls to the Theme API are +// made if theming is not supported. It is enough to check if m_hTheme is NULL. +// Example: +// if(m_hTheme != NULL) +// { +// DrawThemeBackground(dc, BP_PUSHBUTTON, PBS_NORMAL, &rect, NULL); +// DrawThemeText(dc, BP_PUSHBUTTON, PBS_NORMAL, L"Button", -1, DT_SINGLELINE | DT_CENTER | DT_VCENTER, 0, &rect); +// } +// else +// { +// dc.DrawFrameControl(&rect, DFC_BUTTON, DFCS_BUTTONPUSH); +// dc.DrawText(_T("Button"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); +// } +// +// Delay load is NOT AUTOMATIC for VC++ 7, you have to link to delayimp.lib, +// and add uxtheme.dll in the Linker.Input.Delay Loaded DLLs section of the +// project properties. +#if (_MSC_VER < 1300) && !defined(_WTL_NO_THEME_DELAYLOAD) + #pragma comment(lib, "delayimp.lib") + #pragma comment(linker, "/delayload:uxtheme.dll") +#endif // (_MSC_VER < 1300) && !defined(_WTL_NO_THEME_DELAYLOAD) + +// Hack: Signatures in uxtheme.h changed - the only way to check which variant of uxtheme.h +// is included is to check for presence of new defines MAX_THEMECOLOR and MAX_THEMESIZE +#ifndef _WTL_NEW_UXTHEME + #if defined(MAX_THEMECOLOR) && defined(MAX_THEMESIZE) + #define _WTL_NEW_UXTHEME + #endif // defined(MAX_THEMECOLOR) && defined(MAX_THEMESIZE) +#endif // _WTL_NEW_UXTHEME + + +/////////////////////////////////////////////////////////////////////////////// +// Classes in this file: +// +// CTheme +// CThemeImpl +// +// CBufferedPaint +// CBufferedPaintImpl +// CBufferedPaintWindowImpl +// CBufferedAnimation +// CBufferedAnimationImpl +// CBufferedAnimationWindowImpl +// +// Global functions: +// AtlDrawThemeClientEdge() + + +namespace WTL +{ + +/////////////////////////////////////////////////////////////////////////////// +// CTheme - wrapper for theme handle + +class CTheme +{ +public: +// Data members + HTHEME m_hTheme; + static int m_nIsThemingSupported; + +// Constructor + CTheme(HTHEME hTheme = NULL) : m_hTheme(hTheme) + { + IsThemingSupported(); + } + +// Operators and helpers + bool IsThemeNull() const + { + return (m_hTheme == NULL); + } + + CTheme& operator =(HTHEME hTheme) + { + m_hTheme = hTheme; + return *this; + } + + operator HTHEME() const + { + return m_hTheme; + } + + void Attach(HTHEME hTheme) + { + m_hTheme = hTheme; + } + + HTHEME Detach() + { + HTHEME hTheme = m_hTheme; + m_hTheme = NULL; + return hTheme; + } + +// Theme support helper + static bool IsThemingSupported() + { + if(m_nIsThemingSupported == -1) + { + CStaticDataInitCriticalSectionLock lock; + if(FAILED(lock.Lock())) + { + ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CTheme::IsThemingSupported.\n")); + ATLASSERT(FALSE); + return false; + } + + if(m_nIsThemingSupported == -1) + { + HMODULE hThemeDLL = ::LoadLibrary(_T("uxtheme.dll")); + m_nIsThemingSupported = (hThemeDLL != NULL) ? 1 : 0; + if(hThemeDLL != NULL) + ::FreeLibrary(hThemeDLL); + } + + lock.Unlock(); + } + + ATLASSERT(m_nIsThemingSupported != -1); + return (m_nIsThemingSupported == 1); + } + +// Operations and theme properties + HTHEME OpenThemeData(HWND hWnd, LPCWSTR pszClassList) + { + if(!IsThemingSupported()) + return NULL; + + ATLASSERT(m_hTheme == NULL); + m_hTheme = ::OpenThemeData(hWnd, pszClassList); + return m_hTheme; + } + + HRESULT CloseThemeData() + { + HRESULT hRet = S_FALSE; + if(m_hTheme != NULL) + { + hRet = ::CloseThemeData(m_hTheme); + if(SUCCEEDED(hRet)) + m_hTheme = NULL; + } + return hRet; + } + + HRESULT DrawThemeBackground(HDC hDC, int nPartID, int nStateID, LPCRECT pRect, LPCRECT pClipRect = NULL) + { + ATLASSERT(m_hTheme != NULL); + return ::DrawThemeBackground(m_hTheme, hDC, nPartID, nStateID, pRect, pClipRect); + } + + HRESULT DrawThemeBackgroundEx(HDC hDC, int nPartID, int nStateID, LPCRECT pRect, const DTBGOPTS* pOptions = NULL) + { + ATLASSERT(m_hTheme != NULL); + return ::DrawThemeBackgroundEx(m_hTheme, hDC, nPartID, nStateID, pRect, pOptions); + } + + HRESULT DrawThemeText(HDC hDC, int nPartID, int nStateID, LPCWSTR pszText, int nCharCount, DWORD dwTextFlags, DWORD dwTextFlags2, LPCRECT pRect) + { + ATLASSERT(m_hTheme != NULL); + return ::DrawThemeText(m_hTheme, hDC, nPartID, nStateID, pszText, nCharCount, dwTextFlags, dwTextFlags2, pRect); + } + + HRESULT GetThemeBackgroundContentRect(HDC hDC, int nPartID, int nStateID, LPCRECT pBoundingRect, LPRECT pContentRect) const + { + ATLASSERT(m_hTheme != NULL); + return ::GetThemeBackgroundContentRect(m_hTheme, hDC, nPartID, nStateID, pBoundingRect, pContentRect); + } + + HRESULT GetThemeBackgroundExtent(HDC hDC, int nPartID, int nStateID, LPCRECT pContentRect, LPRECT pExtentRect) const + { + ATLASSERT(m_hTheme != NULL); + return ::GetThemeBackgroundExtent(m_hTheme, hDC, nPartID, nStateID, pContentRect, pExtentRect); + } + + HRESULT GetThemePartSize(HDC hDC, int nPartID, int nStateID, LPRECT pRect, enum THEMESIZE eSize, LPSIZE pSize) const + { + ATLASSERT(m_hTheme != NULL); + return ::GetThemePartSize(m_hTheme, hDC, nPartID, nStateID, pRect, eSize, pSize); + } + + HRESULT GetThemeTextExtent(HDC hDC, int nPartID, int nStateID, LPCWSTR pszText, int nCharCount, DWORD dwTextFlags, LPCRECT pBoundingRect, LPRECT pExtentRect) const + { + ATLASSERT(m_hTheme != NULL); + return ::GetThemeTextExtent(m_hTheme, hDC, nPartID, nStateID, pszText, nCharCount, dwTextFlags, pBoundingRect, pExtentRect); + } + + HRESULT GetThemeTextMetrics(HDC hDC, int nPartID, int nStateID, PTEXTMETRICW pTextMetric) const + { + ATLASSERT(m_hTheme != NULL); +#ifdef _WTL_NEW_UXTHEME + return ::GetThemeTextMetrics(m_hTheme, hDC, nPartID, nStateID, pTextMetric); +#else // !_WTL_NEW_UXTHEME + // Note: The cast to PTEXTMETRIC is because uxtheme.h incorrectly uses it instead of PTEXTMETRICW + return ::GetThemeTextMetrics(m_hTheme, hDC, nPartID, nStateID, (PTEXTMETRIC)pTextMetric); +#endif // !_WTL_NEW_UXTHEME + } + + HRESULT GetThemeBackgroundRegion(HDC hDC, int nPartID, int nStateID, LPCRECT pRect, HRGN* pRegion) const + { + ATLASSERT(m_hTheme != NULL); + return ::GetThemeBackgroundRegion(m_hTheme, hDC, nPartID, nStateID, pRect, pRegion); + } + + HRESULT HitTestThemeBackground(HDC hDC, int nPartID, int nStateID, DWORD dwOptions, LPCRECT pRect, HRGN hrgn, POINT ptTest, WORD* pwHitTestCode) const + { + ATLASSERT(m_hTheme != NULL); + return ::HitTestThemeBackground(m_hTheme, hDC, nPartID, nStateID, dwOptions, pRect, hrgn, ptTest, pwHitTestCode); + } + + HRESULT DrawThemeEdge(HDC hDC, int nPartID, int nStateID, LPCRECT pDestRect, UINT uEdge, UINT uFlags, LPRECT pContentRect = NULL) + { + ATLASSERT(m_hTheme != NULL); + return ::DrawThemeEdge(m_hTheme, hDC, nPartID, nStateID, pDestRect, uEdge, uFlags, pContentRect); + } + + HRESULT DrawThemeIcon(HDC hDC, int nPartID, int nStateID, LPCRECT pRect, HIMAGELIST himl, int nImageIndex) + { + ATLASSERT(m_hTheme != NULL); + return ::DrawThemeIcon(m_hTheme, hDC, nPartID, nStateID, pRect, himl, nImageIndex); + } + + BOOL IsThemePartDefined(int nPartID, int nStateID) const + { + ATLASSERT(m_hTheme != NULL); + return ::IsThemePartDefined(m_hTheme, nPartID, nStateID); + } + + BOOL IsThemeBackgroundPartiallyTransparent(int nPartID, int nStateID) const + { + ATLASSERT(m_hTheme != NULL); + return ::IsThemeBackgroundPartiallyTransparent(m_hTheme, nPartID, nStateID); + } + + HRESULT GetThemeColor(int nPartID, int nStateID, int nPropID, COLORREF* pColor) const + { + ATLASSERT(m_hTheme != NULL); + return ::GetThemeColor(m_hTheme, nPartID, nStateID, nPropID, pColor); + } + + HRESULT GetThemeMetric(HDC hDC, int nPartID, int nStateID, int nPropID, int* pnVal) const + { + ATLASSERT(m_hTheme != NULL); + return ::GetThemeMetric(m_hTheme, hDC, nPartID, nStateID, nPropID, pnVal); + } + + HRESULT GetThemeString(int nPartID, int nStateID, int nPropID, LPWSTR pszBuff, int cchMaxBuffChars) const + { + ATLASSERT(m_hTheme != NULL); + return ::GetThemeString(m_hTheme, nPartID, nStateID, nPropID, pszBuff, cchMaxBuffChars); + } + + HRESULT GetThemeBool(int nPartID, int nStateID, int nPropID, BOOL* pfVal) const + { + ATLASSERT(m_hTheme != NULL); + return ::GetThemeBool(m_hTheme, nPartID, nStateID, nPropID, pfVal); + } + + HRESULT GetThemeInt(int nPartID, int nStateID, int nPropID, int* pnVal) const + { + ATLASSERT(m_hTheme != NULL); + return ::GetThemeInt(m_hTheme, nPartID, nStateID, nPropID, pnVal); + } + + HRESULT GetThemeEnumValue(int nPartID, int nStateID, int nPropID, int* pnVal) const + { + ATLASSERT(m_hTheme != NULL); + return ::GetThemeEnumValue(m_hTheme, nPartID, nStateID, nPropID, pnVal); + } + + HRESULT GetThemePosition(int nPartID, int nStateID, int nPropID, LPPOINT pPoint) const + { + ATLASSERT(m_hTheme != NULL); + return ::GetThemePosition(m_hTheme, nPartID, nStateID, nPropID, pPoint); + } + + // deprecated + HRESULT GetThemeFont(int nPartID, HDC hDC, int nStateID, int nPropID, LOGFONTW* pFont) const + { + ATLASSERT(m_hTheme != NULL); +#ifdef _WTL_NEW_UXTHEME + return ::GetThemeFont(m_hTheme, hDC, nPartID, nStateID, nPropID, pFont); +#else // !_WTL_NEW_UXTHEME + // Note: The cast to LOGFONT* is because uxtheme.h incorrectly uses it instead of LOGFONTW* + return ::GetThemeFont(m_hTheme, hDC, nPartID, nStateID, nPropID, (LOGFONT*)pFont); +#endif // !_WTL_NEW_UXTHEME + } + + HRESULT GetThemeFont(HDC hDC, int nPartID, int nStateID, int nPropID, LOGFONTW* pFont) const + { + ATLASSERT(m_hTheme != NULL); +#ifdef _WTL_NEW_UXTHEME + return ::GetThemeFont(m_hTheme, hDC, nPartID, nStateID, nPropID, pFont); +#else // !_WTL_NEW_UXTHEME + // Note: The cast to LOGFONT* is because uxtheme.h incorrectly uses it instead of LOGFONTW* + return ::GetThemeFont(m_hTheme, hDC, nPartID, nStateID, nPropID, (LOGFONT*)pFont); +#endif // !_WTL_NEW_UXTHEME + } + + HRESULT GetThemeRect(int nPartID, int nStateID, int nPropID, LPRECT pRect) const + { + ATLASSERT(m_hTheme != NULL); + return ::GetThemeRect(m_hTheme, nPartID, nStateID, nPropID, pRect); + } + + HRESULT GetThemeMargins(HDC hDC, int nPartID, int nStateID, int nPropID, LPRECT pRect, PMARGINS pMargins) const + { + ATLASSERT(m_hTheme != NULL); + return ::GetThemeMargins(m_hTheme, hDC, nPartID, nStateID, nPropID, pRect, pMargins); + } + + HRESULT GetThemeIntList(int nPartID, int nStateID, int nPropID, INTLIST* pIntList) const + { + ATLASSERT(m_hTheme != NULL); + return ::GetThemeIntList(m_hTheme, nPartID, nStateID, nPropID, pIntList); + } + + HRESULT GetThemePropertyOrigin(int nPartID, int nStateID, int nPropID, enum PROPERTYORIGIN* pOrigin) const + { + ATLASSERT(m_hTheme != NULL); + return ::GetThemePropertyOrigin(m_hTheme, nPartID, nStateID, nPropID, pOrigin); + } + + HRESULT GetThemeFilename(int nPartID, int nStateID, int nPropID, LPWSTR pszThemeFileName, int cchMaxBuffChars) const + { + ATLASSERT(m_hTheme != NULL); + return ::GetThemeFilename(m_hTheme, nPartID, nStateID, nPropID, pszThemeFileName, cchMaxBuffChars); + } + + COLORREF GetThemeSysColor(int nColorID) const + { + ATLASSERT(m_hTheme != NULL); + return ::GetThemeSysColor(m_hTheme, nColorID); + } + + HBRUSH GetThemeSysColorBrush(int nColorID) const + { + ATLASSERT(m_hTheme != NULL); + return ::GetThemeSysColorBrush(m_hTheme, nColorID); + } + + int GetThemeSysSize(int nSizeID) const + { + ATLASSERT(m_hTheme != NULL); + return ::GetThemeSysSize(m_hTheme, nSizeID); + } + + BOOL GetThemeSysBool(int nBoolID) const + { + ATLASSERT(m_hTheme != NULL); + return ::GetThemeSysBool(m_hTheme, nBoolID); + } + + HRESULT GetThemeSysFont(int nFontID, LOGFONTW* plf) const + { + ATLASSERT(m_hTheme != NULL); +#ifdef _WTL_NEW_UXTHEME + return ::GetThemeSysFont(m_hTheme, nFontID, plf); +#else // !_WTL_NEW_UXTHEME + // Note: The cast to LOGFONT* is because uxtheme.h incorrectly uses it instead of LOGFONTW* + return ::GetThemeSysFont(m_hTheme, nFontID, (LOGFONT*)plf); +#endif // !_WTL_NEW_UXTHEME + } + + HRESULT GetThemeSysString(int nStringID, LPWSTR pszStringBuff, int cchMaxStringChars) const + { + ATLASSERT(m_hTheme != NULL); + return ::GetThemeSysString(m_hTheme, nStringID, pszStringBuff, cchMaxStringChars); + } + + HRESULT GetThemeSysInt(int nIntID, int* pnValue) const + { + ATLASSERT(m_hTheme != NULL); + return ::GetThemeSysInt(m_hTheme, nIntID, pnValue); + } + +#ifdef _WTL_NEW_UXTHEME + HTHEME OpenThemeDataEx(HWND hWnd, LPCWSTR pszClassList, DWORD dwFlags) + { + if(!IsThemingSupported()) + return NULL; + + ATLASSERT(m_hTheme == NULL); + m_hTheme = ::OpenThemeDataEx(hWnd, pszClassList, dwFlags); + return m_hTheme; + } + + HRESULT DrawThemeTextEx(HDC hDC, int nPartID, int nStateID, LPCWSTR pszText, int cchText, DWORD dwTextFlags, LPRECT lpRect, const DTTOPTS* pOptions) + { + ATLASSERT(m_hTheme != NULL); + return ::DrawThemeTextEx(m_hTheme, hDC, nPartID, nStateID, pszText, cchText, dwTextFlags, lpRect, pOptions); + } + + HRESULT GetThemeTransitionDuration(int nPartID, int nFromStateID, int nToStateID, int nPropID, DWORD& dwDuration) + { + ATLASSERT(m_hTheme != NULL); + return ::GetThemeTransitionDuration(m_hTheme, nPartID, nFromStateID, nToStateID, nPropID, &dwDuration); + } +#endif // _WTL_NEW_UXTHEME + +#if (_WIN32_WINNT >= 0x0600) + HRESULT GetThemeBitmap(int nPartID, int nStateID, int nPropID, ULONG uFlags, HBITMAP& hBitmap) + { + ATLASSERT(m_hTheme != NULL); + return ::GetThemeBitmap(m_hTheme, nPartID, nStateID, nPropID, uFlags, &hBitmap); + } + + HRESULT GetThemeStream(int nPartID, int nStateID, int nPropID, VOID** ppvStream, DWORD* pcbStream, HINSTANCE hInstance) + { + ATLASSERT(m_hTheme != NULL); + return ::GetThemeStream(m_hTheme, nPartID, nStateID, nPropID, ppvStream, pcbStream, hInstance); + } +#endif // (_WIN32_WINNT >= 0x0600) +}; + +__declspec(selectany) int CTheme::m_nIsThemingSupported = -1; + + +/////////////////////////////////////////////////////////////////////////////// +// CThemeImpl - theme support implementation + +// Derive from this class to implement window with theme support. +// Example: +// class CMyThemeWindow : public CWindowImpl, public CThemeImpl +// { +// ... +// BEGIN_MSG_MAP(CMyThemeWindow) +// CHAIN_MSG_MAP(CThemeImpl) +// ... +// END_MSG_MAP() +// ... +// }; +// +// If you set theme class list, the class will automaticaly open/close/reopen theme data. + + +// Helper for drawing theme client edge +inline bool AtlDrawThemeClientEdge(HTHEME hTheme, HWND hWnd, HRGN hRgnUpdate = NULL, HBRUSH hBrush = NULL, int nPartID = 0, int nStateID = 0) +{ + ATLASSERT(hTheme != NULL); + ATLASSERT(::IsWindow(hWnd)); + + CWindowDC dc(hWnd); + if(dc.IsNull()) + return false; + + // Get border size + int cxBorder = GetSystemMetrics(SM_CXBORDER); + int cyBorder = GetSystemMetrics(SM_CYBORDER); + if(SUCCEEDED(::GetThemeInt(hTheme, nPartID, nStateID, TMT_SIZINGBORDERWIDTH, &cxBorder))) + cyBorder = cxBorder; + + RECT rect; + ::GetWindowRect(hWnd, &rect); + + // Remove the client edge from the update region + int cxEdge = GetSystemMetrics(SM_CXEDGE); + int cyEdge = GetSystemMetrics(SM_CYEDGE); + ::InflateRect(&rect, -cxEdge, -cyEdge); + CRgn rgn; + rgn.CreateRectRgnIndirect(&rect); + if(rgn.IsNull()) + return false; + + if(hRgnUpdate != NULL) + rgn.CombineRgn(hRgnUpdate, rgn, RGN_AND); + + ::OffsetRect(&rect, -rect.left, -rect.top); + + ::OffsetRect(&rect, cxEdge, cyEdge); + dc.ExcludeClipRect(&rect); + ::InflateRect(&rect, cxEdge, cyEdge); + + ::DrawThemeBackground(hTheme, dc, nPartID, nStateID, &rect, NULL); + + // Use background brush too, since theme border might not cover everything + if(cxBorder < cxEdge && cyBorder < cyEdge) + { + if(hBrush == NULL) +// need conditional code because types don't match in winuser.h +#ifdef _WIN64 + hBrush = (HBRUSH)::GetClassLongPtr(hWnd, GCLP_HBRBACKGROUND); +#else + hBrush = (HBRUSH)UlongToPtr(::GetClassLongPtr(hWnd, GCLP_HBRBACKGROUND)); +#endif + + ::InflateRect(&rect, cxBorder - cxEdge, cyBorder - cyEdge); + dc.FillRect(&rect, hBrush); + } + + ::DefWindowProc(hWnd, WM_NCPAINT, (WPARAM)rgn.m_hRgn, 0L); + + return true; +} + + +// Theme extended styles +#define THEME_EX_3DCLIENTEDGE 0x00000001 +#define THEME_EX_THEMECLIENTEDGE 0x00000002 + +template +class CThemeImpl : public TBase +{ +public: +// Data members + LPWSTR m_lpstrThemeClassList; + DWORD m_dwExtendedStyle; // theme specific extended styles + +// Constructor & destructor + CThemeImpl() : m_lpstrThemeClassList(NULL), m_dwExtendedStyle(0) + { } + + ~CThemeImpl() + { + delete [] m_lpstrThemeClassList; + } + +// Attributes + bool SetThemeClassList(LPCWSTR lpstrThemeClassList) + { + if(m_lpstrThemeClassList != NULL) + { + delete [] m_lpstrThemeClassList; + m_lpstrThemeClassList = NULL; + } + + if(lpstrThemeClassList == NULL) + return true; + + int cchLen = lstrlenW(lpstrThemeClassList) + 1; + ATLTRY(m_lpstrThemeClassList = new WCHAR[cchLen]); + if(m_lpstrThemeClassList == NULL) + return false; + + SecureHelper::strcpyW_x(m_lpstrThemeClassList, cchLen, lpstrThemeClassList); + + return true; + } + + bool GetThemeClassList(LPWSTR lpstrThemeClassList, int cchListBuffer) const + { + int cchLen = lstrlenW(m_lpstrThemeClassList) + 1; + if(cchListBuffer < cchLen) + return false; + + SecureHelper::strcpyW_x(lpstrThemeClassList, cchListBuffer, m_lpstrThemeClassList); + + return true; + } + + LPCWSTR GetThemeClassList() const + { + return m_lpstrThemeClassList; + } + + DWORD SetThemeExtendedStyle(DWORD dwExtendedStyle, DWORD dwMask = 0) + { + DWORD dwPrevStyle = m_dwExtendedStyle; + if(dwMask == 0) + m_dwExtendedStyle = dwExtendedStyle; + else + m_dwExtendedStyle = (m_dwExtendedStyle & ~dwMask) | (dwExtendedStyle & dwMask); + return dwPrevStyle; + } + + DWORD GetThemeExtendedStyle() const + { + return m_dwExtendedStyle; + } + +// Operations + HTHEME OpenThemeData() + { + T* pT = static_cast(this); + ATLASSERT(::IsWindow(pT->m_hWnd)); + ATLASSERT(m_lpstrThemeClassList != NULL); + if(m_lpstrThemeClassList == NULL) + return NULL; + CloseThemeData(); + return TBase::OpenThemeData(pT->m_hWnd, m_lpstrThemeClassList); + } + + HTHEME OpenThemeData(LPCWSTR pszClassList) + { + if(!SetThemeClassList(pszClassList)) + return NULL; + return OpenThemeData(); + } + + HRESULT SetWindowTheme(LPCWSTR pszSubAppName, LPCWSTR pszSubIDList) + { + if(!IsThemingSupported()) + return S_FALSE; + + T* pT = static_cast(this); + ATLASSERT(::IsWindow(pT->m_hWnd)); + return ::SetWindowTheme(pT->m_hWnd, pszSubAppName, pszSubIDList); + } + + HTHEME GetWindowTheme() const + { + if(!IsThemingSupported()) + return NULL; + + const T* pT = static_cast(this); + ATLASSERT(::IsWindow(pT->m_hWnd)); + return ::GetWindowTheme(pT->m_hWnd); + } + + HRESULT EnableThemeDialogTexture(DWORD dwFlags) + { + if(!IsThemingSupported()) + return S_FALSE; + + T* pT = static_cast(this); + ATLASSERT(::IsWindow(pT->m_hWnd)); + return ::EnableThemeDialogTexture(pT->m_hWnd, dwFlags); + } + + BOOL IsThemeDialogTextureEnabled() const + { + if(!IsThemingSupported()) + return FALSE; + + const T* pT = static_cast(this); + ATLASSERT(::IsWindow(pT->m_hWnd)); + return ::IsThemeDialogTextureEnabled(pT->m_hWnd); + } + + HRESULT DrawThemeParentBackground(HDC hDC, const RECT* pRect = NULL) + { + if(!IsThemingSupported()) + return S_FALSE; + + T* pT = static_cast(this); + ATLASSERT(::IsWindow(pT->m_hWnd)); +#ifdef _WTL_NEW_UXTHEME + return ::DrawThemeParentBackground(pT->m_hWnd, hDC, pRect); +#else + return ::DrawThemeParentBackground(pT->m_hWnd, hDC, (RECT*)pRect); +#endif + } + +#ifdef _WTL_NEW_UXTHEME + HRESULT SetWindowThemeAttribute(WINDOWTHEMEATTRIBUTETYPE type, PVOID pvAttribute, DWORD cbAttribute) + { + if(!IsThemingSupported()) + return S_FALSE; + + T* pT = static_cast(this); + ATLASSERT(::IsWindow(pT->m_hWnd)); + return ::SetWindowThemeAttribute(pT->m_hWnd, type, pvAttribute, cbAttribute); + } + + HRESULT SetWindowThemeNonClientAttributes(DWORD dwAttributes, DWORD dwMask) + { + if(!IsThemingSupported()) + return S_FALSE; + + T* pT = static_cast(this); + ATLASSERT(::IsWindow(pT->m_hWnd)); + WTA_OPTIONS opt = { dwAttributes, dwMask }; + return ::SetWindowThemeAttribute(pT->m_hWnd, WTA_NONCLIENT, (PVOID)&opt, sizeof(opt)); + } + + HRESULT DrawThemeParentBackgroundEx(HDC hDC, DWORD dwFlags, const RECT* lpRect = NULL) + { + if(!IsThemingSupported()) + return S_FALSE; + + T* pT = static_cast(this); + ATLASSERT(::IsWindow(pT->m_hWnd)); + return ::DrawThemeParentBackgroundEx(pT->m_hWnd, hDC, dwFlags, lpRect); + } +#endif // _WTL_NEW_UXTHEME + +// Message map and handlers + // Note: If you handle any of these messages in your derived class, + // it is better to put CHAIN_MSG_MAP at the start of your message map. + BEGIN_MSG_MAP(CThemeImpl) + MESSAGE_HANDLER(WM_CREATE, OnCreate) + MESSAGE_HANDLER(WM_DESTROY, OnDestroy) + MESSAGE_HANDLER(WM_THEMECHANGED, OnThemeChanged) + MESSAGE_HANDLER(WM_NCPAINT, OnNcPaint) + END_MSG_MAP() + + LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) + { + if(m_lpstrThemeClassList != NULL) + OpenThemeData(); + bHandled = FALSE; + return 1; + } + + LRESULT OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) + { + CloseThemeData(); + bHandled = FALSE; + return 1; + } + + LRESULT OnThemeChanged(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) + { + CloseThemeData(); + if(m_lpstrThemeClassList != NULL) + OpenThemeData(); + bHandled = FALSE; + return 1; + } + + LRESULT OnNcPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) + { + T* pT = static_cast(this); + ATLASSERT(::IsWindow(pT->m_hWnd)); + LRESULT lRet = 0; + bHandled = FALSE; + if(IsThemingSupported() && ((pT->GetExStyle() & WS_EX_CLIENTEDGE) != 0)) + { + if((m_dwExtendedStyle & THEME_EX_3DCLIENTEDGE) != 0) + { + lRet = ::DefWindowProc(pT->m_hWnd, uMsg, wParam, lParam); + bHandled = TRUE; + } + else if((m_hTheme != NULL) && ((m_dwExtendedStyle & THEME_EX_THEMECLIENTEDGE) != 0)) + { + HRGN hRgn = (wParam != 1) ? (HRGN)wParam : NULL; + if(pT->DrawThemeClientEdge(hRgn)) + bHandled = TRUE; + } + } + return lRet; + } + +// Drawing helper + bool DrawThemeClientEdge(HRGN hRgnUpdate) + { + T* pT = static_cast(this); + return AtlDrawThemeClientEdge(m_hTheme, pT->m_hWnd, hRgnUpdate, NULL, 0, 0); + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// Buffered Paint and Animation + +#ifdef _WTL_NEW_UXTHEME + +/////////////////////////////////////////////////////////////////////////////// +// CBufferedPaintBase - Buffered Paint support for othe classes + +class CBufferedPaintBase +{ +public: + static int m_nIsBufferedPaintSupported; + + CBufferedPaintBase() + { + if(IsBufferedPaintSupported()) + ATLVERIFY(SUCCEEDED(::BufferedPaintInit())); + } + + ~CBufferedPaintBase() + { + if(IsBufferedPaintSupported()) + ATLVERIFY(SUCCEEDED(::BufferedPaintUnInit())); + } + + static bool IsBufferedPaintSupported() + { + if(m_nIsBufferedPaintSupported == -1) + { + CStaticDataInitCriticalSectionLock lock; + if(FAILED(lock.Lock())) + { + ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CBufferedPaintBase::IsBufferedPaintSupported.\n")); + ATLASSERT(FALSE); + return false; + } + + if(m_nIsBufferedPaintSupported == -1) + m_nIsBufferedPaintSupported = RunTimeHelper::IsVista() ? 1 : 0; + + lock.Unlock(); + } + + ATLASSERT(m_nIsBufferedPaintSupported != -1); + return (m_nIsBufferedPaintSupported == 1); + } +}; + +__declspec(selectany) int CBufferedPaintBase::m_nIsBufferedPaintSupported = -1; + + +/////////////////////////////////////////////////////////////////////////////// +// CBufferedPaint - support for buffered paint functions + +class CBufferedPaint +{ +public: + HPAINTBUFFER m_hPaintBuffer; + + CBufferedPaint() : m_hPaintBuffer(NULL) + { } + + ~CBufferedPaint() + { + ATLVERIFY(SUCCEEDED(End())); + } + + bool IsNull() const + { + return (m_hPaintBuffer == NULL); + } + + HPAINTBUFFER Begin(HDC hdcTarget, const RECT* prcTarget, BP_BUFFERFORMAT dwFormat, BP_PAINTPARAMS* pPaintParams, HDC* phdcPaint) + { + ATLASSERT(m_hPaintBuffer == NULL); + m_hPaintBuffer = ::BeginBufferedPaint(hdcTarget, prcTarget, dwFormat, pPaintParams, phdcPaint); + return m_hPaintBuffer; + } + + HRESULT End(BOOL bUpdate = TRUE) + { + HRESULT hRet = S_FALSE; + if(m_hPaintBuffer != NULL) + { + hRet = ::EndBufferedPaint(m_hPaintBuffer, bUpdate); + m_hPaintBuffer = NULL; + } + return hRet; + } + + HRESULT GetTargetRect(LPRECT pRect) const + { + ATLASSERT(m_hPaintBuffer != NULL); + return ::GetBufferedPaintTargetRect(m_hPaintBuffer, pRect); + } + + HDC GetTargetDC() const + { + ATLASSERT(m_hPaintBuffer != NULL); + return ::GetBufferedPaintTargetDC(m_hPaintBuffer); + } + + HDC GetPaintDC() const + { + ATLASSERT(m_hPaintBuffer != NULL); + return ::GetBufferedPaintDC(m_hPaintBuffer); + } + + HRESULT GetBits(RGBQUAD** ppbBuffer, int* pcxRow) const + { + ATLASSERT(m_hPaintBuffer != NULL); + return ::GetBufferedPaintBits(m_hPaintBuffer, ppbBuffer, pcxRow); + } + + HRESULT Clear(const RECT* pRect = NULL) + { + ATLASSERT(m_hPaintBuffer != NULL); + return ::BufferedPaintClear(m_hPaintBuffer, pRect); + } + + HRESULT SetAlpha(BYTE alpha, const RECT* pRect = NULL) + { + ATLASSERT(m_hPaintBuffer != NULL); + return ::BufferedPaintSetAlpha(m_hPaintBuffer, pRect, alpha); + } + + HRESULT MakeOpaque(const RECT* pRect = NULL) + { + ATLASSERT(m_hPaintBuffer != NULL); + return ::BufferedPaintSetAlpha(m_hPaintBuffer, pRect, 255); + } +}; + + +/////////////////////////////////////////////////////////////////////////////// +// CBufferedPaintImpl - provides buffered paint for any window + +template +class ATL_NO_VTABLE CBufferedPaintImpl : public CBufferedPaintBase +{ +public: + CBufferedPaint m_BufferedPaint; + BP_BUFFERFORMAT m_dwFormat; + BP_PAINTPARAMS m_PaintParams; + + CBufferedPaintImpl() : m_dwFormat(BPBF_TOPDOWNDIB) + { + memset(&m_PaintParams, 0, sizeof(BP_PAINTPARAMS)); + m_PaintParams.cbSize = sizeof(BP_PAINTPARAMS); + } + +// Message map and handlers + BEGIN_MSG_MAP(CBufferedPaintImpl) + MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground) + MESSAGE_HANDLER(WM_PAINT, OnPaint) + MESSAGE_HANDLER(WM_PRINTCLIENT, OnPaint) + END_MSG_MAP() + + LRESULT OnEraseBackground(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) + { + return 1; // no background needed + } + + LRESULT OnPaint(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/) + { + T* pT = static_cast(this); + if(wParam != NULL) + { + RECT rect = { 0 }; + pT->GetClientRect(&rect); + pT->DoPaint((HDC)wParam, rect); + } + else + { + CPaintDC dc(pT->m_hWnd); + pT->DoBufferedPaint(dc.m_hDC, dc.m_ps.rcPaint); + } + + return 0; + } + +// Overrideables + void DoBufferedPaint(CDCHandle dc, RECT& rect) + { + HDC hDCPaint = NULL; + if(IsBufferedPaintSupported()) + m_BufferedPaint.Begin(dc, &rect, m_dwFormat, &m_PaintParams, &hDCPaint); + + T* pT = static_cast(this); + if(hDCPaint != NULL) + pT->DoPaint(hDCPaint, rect); + else + pT->DoPaint(dc.m_hDC, rect); + + if(IsBufferedPaintSupported()) + m_BufferedPaint.End(); + } + + void DoPaint(CDCHandle /*dc*/, RECT& /*rect*/) + { + // must be implemented in a derived class + ATLASSERT(FALSE); + } +}; + + +/////////////////////////////////////////////////////////////////////////////// +// CBufferedPaintWindowImpl - implements a window that uses buffered paint + +template +class ATL_NO_VTABLE CBufferedPaintWindowImpl : + public ATL::CWindowImpl, + public CBufferedPaintImpl< T > +{ +public: + BEGIN_MSG_MAP(CBufferedPaintWindowImpl) + CHAIN_MSG_MAP(CBufferedPaintImpl< T >) + END_MSG_MAP() +}; + + +/////////////////////////////////////////////////////////////////////////////// +// CBufferedAnimation - support for buffered animation + +class CBufferedAnimation +{ +public: + HANIMATIONBUFFER m_hAnimationBuffer; + + CBufferedAnimation() : m_hAnimationBuffer(NULL) + { } + + ~CBufferedAnimation() + { + ATLVERIFY(SUCCEEDED(End())); + } + + bool IsNull() const + { + return (m_hAnimationBuffer == NULL); + } + + HANIMATIONBUFFER Begin(HWND hWnd, HDC hDCTarget, const RECT* pRectTarget, BP_BUFFERFORMAT dwFormat, BP_PAINTPARAMS* pPaintParams, BP_ANIMATIONPARAMS* pAnimationParams, HDC* phdcFrom, HDC* phdcTo) + { + ATLASSERT(m_hAnimationBuffer == NULL); + m_hAnimationBuffer = ::BeginBufferedAnimation(hWnd, hDCTarget, pRectTarget, dwFormat, pPaintParams, pAnimationParams, phdcFrom, phdcTo); + return m_hAnimationBuffer; + } + + HRESULT End(BOOL bUpdate = TRUE) + { + HRESULT hRet = S_FALSE; + if(m_hAnimationBuffer != NULL) + { + hRet = ::EndBufferedAnimation(m_hAnimationBuffer, bUpdate); + m_hAnimationBuffer = NULL; + } + return hRet; + } + + static bool IsRendering(HWND hWnd, HDC hDC) + { + return (::BufferedPaintRenderAnimation(hWnd, hDC) != FALSE); + } +}; + + +/////////////////////////////////////////////////////////////////////////////// +// CBufferedAnimationImpl - provides buffered animation support for any window + +// Note: You can either use m_State and m_NewState to store the state information +// for the animation change, or map your state to those data members. DoPaint() +// should only rely on the state information that is passed to it. + +template +class ATL_NO_VTABLE CBufferedAnimationImpl : public CBufferedPaintBase +{ +public: + BP_BUFFERFORMAT m_dwFormat; + BP_PAINTPARAMS m_PaintParams; + BP_ANIMATIONPARAMS m_AnimationParams; + + TState m_State; + TState m_NewState; + + CBufferedAnimationImpl(TState InitialState) : m_dwFormat(BPBF_TOPDOWNDIB) + { + memset(&m_PaintParams, 0, sizeof(BP_PAINTPARAMS)); + m_PaintParams.cbSize = sizeof(BP_PAINTPARAMS); + + memset(&m_AnimationParams, 0, sizeof(BP_ANIMATIONPARAMS)); + m_AnimationParams.cbSize = sizeof(BP_ANIMATIONPARAMS); + m_AnimationParams.style = BPAS_LINEAR; + m_AnimationParams.dwDuration = 500; + + T* pT = static_cast(this); + pT->SetState(InitialState); + pT->SetNewState(InitialState); + } + + DWORD GetDuration() const + { + return m_AnimationParams.dwDuration; + } + + void SetDuration(DWORD dwDuration) + { + m_AnimationParams.dwDuration = dwDuration; + } + + void DoAnimation(TState NewState, const RECT* pRect = NULL) + { + T* pT = static_cast(this); + pT->SetNewState(NewState); + + pT->InvalidateRect(pRect, FALSE); + pT->UpdateWindow(); + + pT->SetState(NewState); + } + +// Message map and handlers + BEGIN_MSG_MAP(CBufferedAnimationImpl) + MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground) + MESSAGE_HANDLER(WM_PAINT, OnPaint) + MESSAGE_HANDLER(WM_PRINTCLIENT, OnPaint) + END_MSG_MAP() + + LRESULT OnEraseBackground(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) + { + return 1; // no background needed + } + + LRESULT OnPaint(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/) + { + T* pT = static_cast(this); + if(wParam != NULL) + { + RECT rect = { 0 }; + pT->GetClientRect(&rect); + pT->DoPaint((HDC)wParam, rect, m_NewState); + } + else + { + CPaintDC dc(pT->m_hWnd); + pT->DoAnimationPaint(dc.m_hDC, dc.m_ps.rcPaint); + } + + return 0; + } + +// Overrideables + void SetState(TState State) + { + m_State = State; + } + + void SetNewState(TState State) + { + m_NewState = State; + } + + bool AreStatesEqual() const + { + return (m_State == m_NewState); + } + + void DoAnimationPaint(CDCHandle dc, RECT& rect) + { + T* pT = static_cast(this); + if(IsBufferedPaintSupported() && CBufferedAnimation::IsRendering(pT->m_hWnd, dc)) + return; + + DWORD dwDurationSave = m_AnimationParams.dwDuration; + if(pT->AreStatesEqual()) + m_AnimationParams.dwDuration = 0; + + HDC hdcFrom = NULL, hdcTo = NULL; + CBufferedAnimation ba; + if(IsBufferedPaintSupported()) + ba.Begin(pT->m_hWnd, dc, &rect, m_dwFormat, &m_PaintParams, &m_AnimationParams, &hdcFrom, &hdcTo); + + if(!ba.IsNull()) + { + if(hdcFrom != NULL) + pT->DoPaint(hdcFrom, rect, m_State); + + if (hdcTo != NULL) + pT->DoPaint(hdcTo, rect, m_NewState); + } + else + { + pT->DoPaint(dc.m_hDC, rect, m_NewState); + } + + m_AnimationParams.dwDuration = dwDurationSave; + } + + void DoPaint(CDCHandle /*dc*/, RECT& /*rect*/, TState /*State*/) + { + // must be implemented in a derived class + ATLASSERT(FALSE); + } +}; + + +/////////////////////////////////////////////////////////////////////////////// +// CBufferedAnimationWindowImpl - implements a window that uses buffered animation + +template +class ATL_NO_VTABLE CBufferedAnimationWindowImpl : + public ATL::CWindowImpl, + public CBufferedAnimationImpl< T, TState > +{ +public: + CBufferedAnimationWindowImpl(TState InitialState) : CBufferedAnimationImpl< T, TState >(InitialState) + { } + + typedef CBufferedAnimationImpl< T, TState > _baseBufferedAnimation; + BEGIN_MSG_MAP(CBufferedAnimationWindowImpl) + CHAIN_MSG_MAP(_baseBufferedAnimation) + END_MSG_MAP() +}; + +#endif // _WTL_NEW_UXTHEME + +}; // namespace WTL + +#endif // __ATLTHEME_H__ diff --git a/Externals/WTL80/atluser.h b/Externals/WTL80/atluser.h new file mode 100644 index 0000000000..6570b8bbec --- /dev/null +++ b/Externals/WTL80/atluser.h @@ -0,0 +1,1162 @@ +// Windows Template Library - WTL version 8.0 +// Copyright (C) Microsoft Corporation. All rights reserved. +// +// This file is a part of the Windows Template Library. +// The use and distribution terms for this software are covered by the +// Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php) +// which can be found in the file CPL.TXT at the root of this distribution. +// By using this software in any fashion, you are agreeing to be bound by +// the terms of this license. You must not remove this notice, or +// any other, from this software. + +#ifndef __ATLUSER_H__ +#define __ATLUSER_H__ + +#pragma once + +#ifndef __cplusplus + #error ATL requires C++ compilation (use a .cpp suffix) +#endif + +#ifndef __ATLAPP_H__ + #error atluser.h requires atlapp.h to be included first +#endif + + +/////////////////////////////////////////////////////////////////////////////// +// Classes in this file: +// +// CMenuItemInfo +// CMenuT +// CAcceleratorT +// CIconT +// CCursorT +// CResource +// +// Global functions: +// AtlMessageBox() + + +namespace WTL +{ + +/////////////////////////////////////////////////////////////////////////////// +// AtlMessageBox - accepts both memory and resource based strings + +inline int AtlMessageBox(HWND hWndOwner, ATL::_U_STRINGorID message, ATL::_U_STRINGorID title = (LPCTSTR)NULL, UINT uType = MB_OK | MB_ICONINFORMATION) +{ + ATLASSERT(hWndOwner == NULL || ::IsWindow(hWndOwner)); + + LPTSTR lpstrMessage = NULL; + if(IS_INTRESOURCE(message.m_lpstr)) + { + for(int nLen = 256; ; nLen *= 2) + { + ATLTRY(lpstrMessage = new TCHAR[nLen]); + if(lpstrMessage == NULL) + { + ATLASSERT(FALSE); + return 0; + } + int nRes = ::LoadString(ModuleHelper::GetResourceInstance(), LOWORD(message.m_lpstr), lpstrMessage, nLen); + if(nRes < nLen - 1) + break; + delete [] lpstrMessage; + lpstrMessage = NULL; + } + + message.m_lpstr = lpstrMessage; + } + + LPTSTR lpstrTitle = NULL; + if(IS_INTRESOURCE(title.m_lpstr) && LOWORD(title.m_lpstr) != 0) + { + for(int nLen = 256; ; nLen *= 2) + { + ATLTRY(lpstrTitle = new TCHAR[nLen]); + if(lpstrTitle == NULL) + { + ATLASSERT(FALSE); + return 0; + } + int nRes = ::LoadString(ModuleHelper::GetResourceInstance(), LOWORD(title.m_lpstr), lpstrTitle, nLen); + if(nRes < nLen - 1) + break; + delete [] lpstrTitle; + lpstrTitle = NULL; + } + + title.m_lpstr = lpstrTitle; + } + + int nRet = ::MessageBox(hWndOwner, message.m_lpstr, title.m_lpstr, uType); + + delete [] lpstrMessage; + delete [] lpstrTitle; + + return nRet; +} + + +/////////////////////////////////////////////////////////////////////////////// +// CMenu + +#if (WINVER >= 0x0500) + #ifndef MII_SIZEOF_STRUCT + #define MII_SIZEOF_STRUCT(structname, member) (((int)((LPBYTE)(&((structname*)0)->member) - ((LPBYTE)((structname*)0)))) + sizeof(((structname*)0)->member)) + #endif + #define MENUITEMINFO_SIZE_VERSION_400A MII_SIZEOF_STRUCT(MENUITEMINFOA, cch) + #define MENUITEMINFO_SIZE_VERSION_400W MII_SIZEOF_STRUCT(MENUITEMINFOW, cch) + #ifdef UNICODE + #define MENUITEMINFO_SIZE_VERSION_400 MENUITEMINFO_SIZE_VERSION_400W + #else + #define MENUITEMINFO_SIZE_VERSION_400 MENUITEMINFO_SIZE_VERSION_400A + #endif // !UNICODE +#endif // (WINVER >= 0x0500) + +class CMenuItemInfo : public MENUITEMINFO +{ +public: + CMenuItemInfo() + { + memset(this, 0, sizeof(MENUITEMINFO)); + cbSize = sizeof(MENUITEMINFO); +#if (WINVER >= 0x0500) + // adjust struct size if running on older version of Windows + if(AtlIsOldWindows()) + { + ATLASSERT(cbSize > MENUITEMINFO_SIZE_VERSION_400); // must be + cbSize = MENUITEMINFO_SIZE_VERSION_400; + } +#endif // (WINVER >= 0x0500) + } +}; + + +// forward declarations +template class CMenuT; +typedef CMenuT CMenuHandle; +typedef CMenuT CMenu; + + +template +class CMenuT +{ +public: +// Data members + HMENU m_hMenu; + +// Constructor/destructor/operators + CMenuT(HMENU hMenu = NULL) : m_hMenu(hMenu) + { } + + ~CMenuT() + { + if(t_bManaged && m_hMenu != NULL) + DestroyMenu(); + } + + CMenuT& operator =(HMENU hMenu) + { + Attach(hMenu); + return *this; + } + + void Attach(HMENU hMenuNew) + { + ATLASSERT(::IsMenu(hMenuNew)); + if(t_bManaged && m_hMenu != NULL && m_hMenu != hMenuNew) + ::DestroyMenu(m_hMenu); + m_hMenu = hMenuNew; + } + + HMENU Detach() + { + HMENU hMenu = m_hMenu; + m_hMenu = NULL; + return hMenu; + } + + operator HMENU() const { return m_hMenu; } + + bool IsNull() const { return (m_hMenu == NULL); } + + BOOL IsMenu() const + { + return ::IsMenu(m_hMenu); + } + +// Create/destroy methods + BOOL CreateMenu() + { + ATLASSERT(m_hMenu == NULL); + m_hMenu = ::CreateMenu(); + return (m_hMenu != NULL) ? TRUE : FALSE; + } + + BOOL CreatePopupMenu() + { + ATLASSERT(m_hMenu == NULL); + m_hMenu = ::CreatePopupMenu(); + return (m_hMenu != NULL) ? TRUE : FALSE; + } + + BOOL LoadMenu(ATL::_U_STRINGorID menu) + { + ATLASSERT(m_hMenu == NULL); + m_hMenu = ::LoadMenu(ModuleHelper::GetResourceInstance(), menu.m_lpstr); + return (m_hMenu != NULL) ? TRUE : FALSE; + } + +#ifndef _WIN32_WCE + BOOL LoadMenuIndirect(const void* lpMenuTemplate) + { + ATLASSERT(m_hMenu == NULL); + m_hMenu = ::LoadMenuIndirect(lpMenuTemplate); + return (m_hMenu != NULL) ? TRUE : FALSE; + } +#endif // !_WIN32_WCE + + BOOL DestroyMenu() + { + if (m_hMenu == NULL) + return FALSE; + BOOL bRet = ::DestroyMenu(m_hMenu); + if(bRet) + m_hMenu = NULL; + return bRet; + } + +// Menu Operations + BOOL DeleteMenu(UINT nPosition, UINT nFlags) + { + ATLASSERT(::IsMenu(m_hMenu)); + return ::DeleteMenu(m_hMenu, nPosition, nFlags); + } + + BOOL TrackPopupMenu(UINT nFlags, int x, int y, HWND hWnd, LPCRECT lpRect = NULL) + { + ATLASSERT(::IsMenu(m_hMenu)); +#ifndef _WIN32_WCE +#if (WINVER >= 0x0500) + x = _FixTrackMenuPopupX(x, y); +#endif // !(WINVER >= 0x0500) + return ::TrackPopupMenu(m_hMenu, nFlags, x, y, 0, hWnd, lpRect); +#else // CE specific + lpRect; + return ::TrackPopupMenuEx(m_hMenu, nFlags, x, y, hWnd, NULL); +#endif // _WIN32_WCE + } + + BOOL TrackPopupMenuEx(UINT uFlags, int x, int y, HWND hWnd, LPTPMPARAMS lptpm = NULL) + { + ATLASSERT(::IsMenu(m_hMenu)); +#if (WINVER >= 0x0500) && !defined(_WIN32_WCE) + x = _FixTrackMenuPopupX(x, y); +#endif // (WINVER >= 0x0500) && !defined(_WIN32_WCE) + return ::TrackPopupMenuEx(m_hMenu, uFlags, x, y, hWnd, lptpm); + } + +#if (WINVER >= 0x0500) && !defined(_WIN32_WCE) + // helper that fixes popup menu X position when it's off-screen + static int _FixTrackMenuPopupX(int x, int y) + { + POINT pt = { x, y }; + HMONITOR hMonitor = ::MonitorFromPoint(pt, MONITOR_DEFAULTTONULL); + if(hMonitor == NULL) + { + HMONITOR hMonitorNear = ::MonitorFromPoint(pt, MONITOR_DEFAULTTONEAREST); + if(hMonitorNear != NULL) + { + MONITORINFO mi = { 0 }; + mi.cbSize = sizeof(MONITORINFO); + if(::GetMonitorInfo(hMonitorNear, &mi) != FALSE) + { + if(x < mi.rcWork.left) + x = mi.rcWork.left; + else if(x > mi.rcWork.right) + x = mi.rcWork.right; + } + } + } + + return x; + } + + BOOL GetMenuInfo(LPMENUINFO lpMenuInfo) const + { + ATLASSERT(::IsMenu(m_hMenu)); + return ::GetMenuInfo(m_hMenu, lpMenuInfo); + } + + BOOL SetMenuInfo(LPCMENUINFO lpMenuInfo) + { + ATLASSERT(::IsMenu(m_hMenu)); + return ::SetMenuInfo(m_hMenu, lpMenuInfo); + } +#endif // (WINVER >= 0x0500) && !defined(_WIN32_WCE) + +// Menu Item Operations + BOOL AppendMenu(UINT nFlags, UINT_PTR nIDNewItem = 0, LPCTSTR lpszNewItem = NULL) + { + ATLASSERT(::IsMenu(m_hMenu)); + return ::AppendMenu(m_hMenu, nFlags, nIDNewItem, lpszNewItem); + } + + BOOL AppendMenu(UINT nFlags, HMENU hSubMenu, LPCTSTR lpszNewItem) + { + ATLASSERT(::IsMenu(m_hMenu)); + ATLASSERT(::IsMenu(hSubMenu)); + return ::AppendMenu(m_hMenu, nFlags | MF_POPUP, (UINT_PTR)hSubMenu, lpszNewItem); + } + +#ifndef _WIN32_WCE + BOOL AppendMenu(UINT nFlags, UINT_PTR nIDNewItem, HBITMAP hBmp) + { + ATLASSERT(::IsMenu(m_hMenu)); + return ::AppendMenu(m_hMenu, nFlags | MF_BITMAP, nIDNewItem, (LPCTSTR)hBmp); + } + + BOOL AppendMenu(UINT nFlags, HMENU hSubMenu, HBITMAP hBmp) + { + ATLASSERT(::IsMenu(m_hMenu)); + ATLASSERT(::IsMenu(hSubMenu)); + return ::AppendMenu(m_hMenu, nFlags | (MF_BITMAP | MF_POPUP), (UINT_PTR)hSubMenu, (LPCTSTR)hBmp); + } +#endif // !_WIN32_WCE + + UINT CheckMenuItem(UINT nIDCheckItem, UINT nCheck) + { + ATLASSERT(::IsMenu(m_hMenu)); + return (UINT)::CheckMenuItem(m_hMenu, nIDCheckItem, nCheck); + } + + UINT EnableMenuItem(UINT nIDEnableItem, UINT nEnable) + { + ATLASSERT(::IsMenu(m_hMenu)); + return ::EnableMenuItem(m_hMenu, nIDEnableItem, nEnable); + } + +#ifndef _WIN32_WCE + BOOL HiliteMenuItem(HWND hWnd, UINT uIDHiliteItem, UINT uHilite) + { + ATLASSERT(::IsMenu(m_hMenu)); + return ::HiliteMenuItem(hWnd, m_hMenu, uIDHiliteItem, uHilite); + } + + int GetMenuItemCount() const + { + ATLASSERT(::IsMenu(m_hMenu)); + return ::GetMenuItemCount(m_hMenu); + } + + UINT GetMenuItemID(int nPos) const + { + ATLASSERT(::IsMenu(m_hMenu)); + return ::GetMenuItemID(m_hMenu, nPos); + } + + UINT GetMenuState(UINT nID, UINT nFlags) const + { + ATLASSERT(::IsMenu(m_hMenu)); + return ::GetMenuState(m_hMenu, nID, nFlags); + } + + int GetMenuString(UINT nIDItem, LPTSTR lpString, int nMaxCount, UINT nFlags) const + { + ATLASSERT(::IsMenu(m_hMenu)); + return ::GetMenuString(m_hMenu, nIDItem, lpString, nMaxCount, nFlags); + } + + int GetMenuStringLen(UINT nIDItem, UINT nFlags) const + { + ATLASSERT(::IsMenu(m_hMenu)); + return ::GetMenuString(m_hMenu, nIDItem, NULL, 0, nFlags); + } + +#ifndef _ATL_NO_COM + BOOL GetMenuString(UINT nIDItem, BSTR& bstrText, UINT nFlags) const + { + USES_CONVERSION; + ATLASSERT(::IsMenu(m_hMenu)); + ATLASSERT(bstrText == NULL); + + int nLen = GetMenuStringLen(nIDItem, nFlags); + if(nLen == 0) + { + bstrText = ::SysAllocString(OLESTR("")); + return (bstrText != NULL) ? TRUE : FALSE; + } + + nLen++; // increment to include terminating NULL char + CTempBuffer buff; + LPTSTR lpszText = buff.Allocate(nLen); + if(lpszText == NULL) + return FALSE; + + if(!GetMenuString(nIDItem, lpszText, nLen, nFlags)) + return FALSE; + + bstrText = ::SysAllocString(T2OLE(lpszText)); + return (bstrText != NULL) ? TRUE : FALSE; + } +#endif // !_ATL_NO_COM +#endif // !_WIN32_WCE + +#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) + int GetMenuString(UINT nIDItem, _CSTRING_NS::CString& strText, UINT nFlags) const + { + ATLASSERT(::IsMenu(m_hMenu)); + + int nLen = GetMenuStringLen(nIDItem, nFlags); + if(nLen == 0) + return 0; + + nLen++; // increment to include terminating NULL char + LPTSTR lpstr = strText.GetBufferSetLength(nLen); + if(lpstr == NULL) + return 0; + int nRet = GetMenuString(nIDItem, lpstr, nLen, nFlags); + strText.ReleaseBuffer(); + return nRet; + } +#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) + + CMenuHandle GetSubMenu(int nPos) const + { + ATLASSERT(::IsMenu(m_hMenu)); + return CMenuHandle(::GetSubMenu(m_hMenu, nPos)); + } + + BOOL InsertMenu(UINT nPosition, UINT nFlags, UINT_PTR nIDNewItem = 0, LPCTSTR lpszNewItem = NULL) + { + ATLASSERT(::IsMenu(m_hMenu)); + return ::InsertMenu(m_hMenu, nPosition, nFlags, nIDNewItem, lpszNewItem); + } + + BOOL InsertMenu(UINT nPosition, UINT nFlags, HMENU hSubMenu, LPCTSTR lpszNewItem) + { + ATLASSERT(::IsMenu(m_hMenu)); + ATLASSERT(::IsMenu(hSubMenu)); + return ::InsertMenu(m_hMenu, nPosition, nFlags | MF_POPUP, (UINT_PTR)hSubMenu, lpszNewItem); + } + +#ifndef _WIN32_WCE + BOOL InsertMenu(UINT nPosition, UINT nFlags, UINT_PTR nIDNewItem, HBITMAP hBmp) + { + ATLASSERT(::IsMenu(m_hMenu)); + return ::InsertMenu(m_hMenu, nPosition, nFlags | MF_BITMAP, nIDNewItem, (LPCTSTR)hBmp); + } + + BOOL InsertMenu(UINT nPosition, UINT nFlags, HMENU hSubMenu, HBITMAP hBmp) + { + ATLASSERT(::IsMenu(m_hMenu)); + ATLASSERT(::IsMenu(hSubMenu)); + return ::InsertMenu(m_hMenu, nPosition, nFlags | (MF_BITMAP | MF_POPUP), (UINT_PTR)hSubMenu, (LPCTSTR)hBmp); + } + + BOOL ModifyMenu(UINT nPosition, UINT nFlags, UINT_PTR nIDNewItem = 0, LPCTSTR lpszNewItem = NULL) + { + ATLASSERT(::IsMenu(m_hMenu)); + return ::ModifyMenu(m_hMenu, nPosition, nFlags, nIDNewItem, lpszNewItem); + } + + BOOL ModifyMenu(UINT nPosition, UINT nFlags, HMENU hSubMenu, LPCTSTR lpszNewItem) + { + ATLASSERT(::IsMenu(m_hMenu)); + ATLASSERT(::IsMenu(hSubMenu)); + return ::ModifyMenu(m_hMenu, nPosition, nFlags | MF_POPUP, (UINT_PTR)hSubMenu, lpszNewItem); + } + + BOOL ModifyMenu(UINT nPosition, UINT nFlags, UINT_PTR nIDNewItem, HBITMAP hBmp) + { + ATLASSERT(::IsMenu(m_hMenu)); + return ::ModifyMenu(m_hMenu, nPosition, nFlags | MF_BITMAP, nIDNewItem, (LPCTSTR)hBmp); + } + + BOOL ModifyMenu(UINT nPosition, UINT nFlags, HMENU hSubMenu, HBITMAP hBmp) + { + ATLASSERT(::IsMenu(m_hMenu)); + ATLASSERT(::IsMenu(hSubMenu)); + return ::ModifyMenu(m_hMenu, nPosition, nFlags | (MF_BITMAP | MF_POPUP), (UINT_PTR)hSubMenu, (LPCTSTR)hBmp); + } +#endif // !_WIN32_WCE + + BOOL RemoveMenu(UINT nPosition, UINT nFlags) + { + ATLASSERT(::IsMenu(m_hMenu)); + return ::RemoveMenu(m_hMenu, nPosition, nFlags); + } + +#ifndef _WIN32_WCE + BOOL SetMenuItemBitmaps(UINT nPosition, UINT nFlags, HBITMAP hBmpUnchecked, HBITMAP hBmpChecked) + { + ATLASSERT(::IsMenu(m_hMenu)); + return ::SetMenuItemBitmaps(m_hMenu, nPosition, nFlags, hBmpUnchecked, hBmpChecked); + } +#endif // !_WIN32_WCE + + BOOL CheckMenuRadioItem(UINT nIDFirst, UINT nIDLast, UINT nIDItem, UINT nFlags) + { + ATLASSERT(::IsMenu(m_hMenu)); + return ::CheckMenuRadioItem(m_hMenu, nIDFirst, nIDLast, nIDItem, nFlags); + } + + BOOL GetMenuItemInfo(UINT uItem, BOOL bByPosition, LPMENUITEMINFO lpmii) const + { + ATLASSERT(::IsMenu(m_hMenu)); + return (BOOL)::GetMenuItemInfo(m_hMenu, uItem, bByPosition, lpmii); + } + + BOOL SetMenuItemInfo(UINT uItem, BOOL bByPosition, LPMENUITEMINFO lpmii) + { + ATLASSERT(::IsMenu(m_hMenu)); + return (BOOL)::SetMenuItemInfo(m_hMenu, uItem, bByPosition, lpmii); + } + +#ifndef _WIN32_WCE + BOOL InsertMenuItem(UINT uItem, BOOL bByPosition, LPMENUITEMINFO lpmii) + { + ATLASSERT(::IsMenu(m_hMenu)); + return (BOOL)::InsertMenuItem(m_hMenu, uItem, bByPosition, lpmii); + } + + UINT GetMenuDefaultItem(BOOL bByPosition = FALSE, UINT uFlags = 0U) const + { + ATLASSERT(::IsMenu(m_hMenu)); + return ::GetMenuDefaultItem(m_hMenu, (UINT)bByPosition, uFlags); + } + + BOOL SetMenuDefaultItem(UINT uItem = (UINT)-1, BOOL bByPosition = FALSE) + { + ATLASSERT(::IsMenu(m_hMenu)); + return ::SetMenuDefaultItem(m_hMenu, uItem, (UINT)bByPosition); + } + + BOOL GetMenuItemRect(HWND hWnd, UINT uItem, LPRECT lprcItem) const + { + ATLASSERT(::IsMenu(m_hMenu)); + return ::GetMenuItemRect(hWnd, m_hMenu, uItem, lprcItem); + } + + int MenuItemFromPoint(HWND hWnd, POINT point) const + { + ATLASSERT(::IsMenu(m_hMenu)); + return ::MenuItemFromPoint(hWnd, m_hMenu, point); + } + +// Context Help Functions + BOOL SetMenuContextHelpId(DWORD dwContextHelpId) + { + ATLASSERT(::IsMenu(m_hMenu)); + return ::SetMenuContextHelpId(m_hMenu, dwContextHelpId); + } + + DWORD GetMenuContextHelpId() const + { + ATLASSERT(::IsMenu(m_hMenu)); + return ::GetMenuContextHelpId(m_hMenu); + } +#endif // !_WIN32_WCE +}; + + +/////////////////////////////////////////////////////////////////////////////// +// CAccelerator + +template +class CAcceleratorT +{ +public: + HACCEL m_hAccel; + +// Constructor/destructor/operators + CAcceleratorT(HACCEL hAccel = NULL) : m_hAccel(hAccel) + { } + + ~CAcceleratorT() + { + if(t_bManaged && m_hAccel != NULL) + ::DestroyAcceleratorTable(m_hAccel); + } + + CAcceleratorT& operator =(HACCEL hAccel) + { + Attach(hAccel); + return *this; + } + + void Attach(HACCEL hAccel) + { + if(t_bManaged && m_hAccel != NULL) + ::DestroyAcceleratorTable(m_hAccel); + m_hAccel = hAccel; + } + + HACCEL Detach() + { + HACCEL hAccel = m_hAccel; + m_hAccel = NULL; + return hAccel; + } + + operator HACCEL() const { return m_hAccel; } + + bool IsNull() const { return m_hAccel == NULL; } + +// Create/destroy methods + HACCEL LoadAccelerators(ATL::_U_STRINGorID accel) + { + ATLASSERT(m_hAccel == NULL); + m_hAccel = ::LoadAccelerators(ModuleHelper::GetResourceInstance(), accel.m_lpstr); + return m_hAccel; + } + + HACCEL CreateAcceleratorTable(LPACCEL pAccel, int cEntries) + { + ATLASSERT(m_hAccel == NULL); + ATLASSERT(pAccel != NULL); + m_hAccel = ::CreateAcceleratorTable(pAccel, cEntries); + return m_hAccel; + } + + void DestroyObject() + { + if(m_hAccel != NULL) + { + ::DestroyAcceleratorTable(m_hAccel); + m_hAccel = NULL; + } + } + +// Operations +#ifndef _WIN32_WCE + int CopyAcceleratorTable(LPACCEL lpAccelDst, int cEntries) + { + ATLASSERT(m_hAccel != NULL); + ATLASSERT(lpAccelDst != NULL); + return ::CopyAcceleratorTable(m_hAccel, lpAccelDst, cEntries); + } + + int GetEntriesCount() const + { + ATLASSERT(m_hAccel != NULL); + return ::CopyAcceleratorTable(m_hAccel, NULL, 0); + } +#endif // !_WIN32_WCE + + BOOL TranslateAccelerator(HWND hWnd, LPMSG pMsg) + { + ATLASSERT(m_hAccel != NULL); + ATLASSERT(::IsWindow(hWnd)); + ATLASSERT(pMsg != NULL); + return ::TranslateAccelerator(hWnd, m_hAccel, pMsg); + } +}; + +typedef CAcceleratorT CAcceleratorHandle; +typedef CAcceleratorT CAccelerator; + + +/////////////////////////////////////////////////////////////////////////////// +// CIcon + +template +class CIconT +{ +public: + HICON m_hIcon; + +// Constructor/destructor/operators + CIconT(HICON hIcon = NULL) : m_hIcon(hIcon) + { } + + ~CIconT() + { + if(t_bManaged && m_hIcon != NULL) + ::DestroyIcon(m_hIcon); + } + + CIconT& operator =(HICON hIcon) + { + Attach(hIcon); + return *this; + } + + void Attach(HICON hIcon) + { + if(t_bManaged && m_hIcon != NULL) + ::DestroyIcon(m_hIcon); + m_hIcon = hIcon; + } + + HICON Detach() + { + HICON hIcon = m_hIcon; + m_hIcon = NULL; + return hIcon; + } + + operator HICON() const { return m_hIcon; } + + bool IsNull() const { return m_hIcon == NULL; } + +// Create/destroy methods + HICON LoadIcon(ATL::_U_STRINGorID icon) + { + ATLASSERT(m_hIcon == NULL); + m_hIcon = ::LoadIcon(ModuleHelper::GetResourceInstance(), icon.m_lpstr); + return m_hIcon; + } + + HICON LoadIcon(ATL::_U_STRINGorID icon, int cxDesired, int cyDesired, UINT fuLoad = 0) + { + ATLASSERT(m_hIcon == NULL); + m_hIcon = (HICON) ::LoadImage(ModuleHelper::GetResourceInstance(), icon.m_lpstr, IMAGE_ICON, cxDesired, cyDesired, fuLoad); + return m_hIcon; + } + +#ifndef _WIN32_WCE + HICON LoadOEMIcon(LPCTSTR lpstrIconName) + { + ATLASSERT(m_hIcon == NULL); + ATLASSERT(IsOEMIcon(lpstrIconName)); + m_hIcon = ::LoadIcon(NULL, lpstrIconName); + return m_hIcon; + } + + HICON CreateIcon(int nWidth, int nHeight, BYTE cPlanes, BYTE cBitsPixel, CONST BYTE* lpbANDbits, CONST BYTE *lpbXORbits) + { + ATLASSERT(m_hIcon == NULL); + ATLASSERT(lpbANDbits != NULL); + ATLASSERT(lpbXORbits != NULL); + m_hIcon = ::CreateIcon(ModuleHelper::GetResourceInstance(), nWidth, nHeight, cPlanes, cBitsPixel, lpbANDbits, lpbXORbits); + return m_hIcon; + } + + HICON CreateIconFromResource(PBYTE pBits, DWORD dwResSize, DWORD dwVersion = 0x00030000) + { + ATLASSERT(m_hIcon == NULL); + ATLASSERT(pBits != NULL); + m_hIcon = ::CreateIconFromResource(pBits, dwResSize, TRUE, dwVersion); + return m_hIcon; + } + + HICON CreateIconFromResourceEx(PBYTE pbBits, DWORD cbBits, DWORD dwVersion = 0x00030000, int cxDesired = 0, int cyDesired = 0, UINT uFlags = LR_DEFAULTCOLOR) + { + ATLASSERT(m_hIcon == NULL); + ATLASSERT(pbBits != NULL); + ATLASSERT(cbBits > 0); + m_hIcon = ::CreateIconFromResourceEx(pbBits, cbBits, TRUE, dwVersion, cxDesired, cyDesired, uFlags); + return m_hIcon; + } +#endif // !_WIN32_WCE + + HICON CreateIconIndirect(PICONINFO pIconInfo) + { + ATLASSERT(m_hIcon == NULL); + ATLASSERT(pIconInfo != NULL); + m_hIcon = ::CreateIconIndirect(pIconInfo); + return m_hIcon; + } + +#ifndef _WIN32_WCE + HICON ExtractIcon(LPCTSTR lpszExeFileName, UINT nIconIndex) + { + ATLASSERT(m_hIcon == NULL); + ATLASSERT(lpszExeFileName != NULL); + m_hIcon = ::ExtractIcon(ModuleHelper::GetModuleInstance(), lpszExeFileName, nIconIndex); + return m_hIcon; + } + + HICON ExtractAssociatedIcon(HINSTANCE hInst, LPTSTR lpIconPath, LPWORD lpiIcon) + { + ATLASSERT(m_hIcon == NULL); + ATLASSERT(lpIconPath != NULL); + ATLASSERT(lpiIcon != NULL); + m_hIcon = ::ExtractAssociatedIcon(hInst, lpIconPath, lpiIcon); + return m_hIcon; + } +#endif // !_WIN32_WCE + + BOOL DestroyIcon() + { + ATLASSERT(m_hIcon != NULL); + BOOL bRet = ::DestroyIcon(m_hIcon); + if(bRet != FALSE) + m_hIcon = NULL; + return bRet; + } + +// Operations +#ifndef _WIN32_WCE + HICON CopyIcon() + { + ATLASSERT(m_hIcon != NULL); + return ::CopyIcon(m_hIcon); + } + + HICON DuplicateIcon() + { + ATLASSERT(m_hIcon != NULL); + return ::DuplicateIcon(NULL, m_hIcon); + } +#endif // !_WIN32_WCE + + BOOL DrawIcon(HDC hDC, int x, int y) + { + ATLASSERT(m_hIcon != NULL); +#ifndef _WIN32_WCE + return ::DrawIcon(hDC, x, y, m_hIcon); +#else // CE specific + return ::DrawIconEx(hDC, x, y, m_hIcon, 0, 0, 0, NULL, DI_NORMAL); +#endif // _WIN32_WCE + } + + BOOL DrawIcon(HDC hDC, POINT pt) + { + ATLASSERT(m_hIcon != NULL); +#ifndef _WIN32_WCE + return ::DrawIcon(hDC, pt.x, pt.y, m_hIcon); +#else // CE specific + return ::DrawIconEx(hDC, pt.x, pt.y, m_hIcon, 0, 0, 0, NULL, DI_NORMAL); +#endif // _WIN32_WCE + } + + BOOL DrawIconEx(HDC hDC, int x, int y, int cxWidth, int cyWidth, UINT uStepIfAniCur = 0, HBRUSH hbrFlickerFreeDraw = NULL, UINT uFlags = DI_NORMAL) + { + ATLASSERT(m_hIcon != NULL); + return ::DrawIconEx(hDC, x, y, m_hIcon, cxWidth, cyWidth, uStepIfAniCur, hbrFlickerFreeDraw, uFlags); + } + + BOOL DrawIconEx(HDC hDC, POINT pt, SIZE size, UINT uStepIfAniCur = 0, HBRUSH hbrFlickerFreeDraw = NULL, UINT uFlags = DI_NORMAL) + { + ATLASSERT(m_hIcon != NULL); + return ::DrawIconEx(hDC, pt.x, pt.y, m_hIcon, size.cx, size.cy, uStepIfAniCur, hbrFlickerFreeDraw, uFlags); + } + +#ifndef _WIN32_WCE + BOOL GetIconInfo(PICONINFO pIconInfo) const + { + ATLASSERT(m_hIcon != NULL); + ATLASSERT(pIconInfo != NULL); + return ::GetIconInfo(m_hIcon, pIconInfo); + } + +#if (_WIN32_WINNT >= 0x0600) + BOOL GetIconInfoEx(PICONINFOEX pIconInfo) const + { + ATLASSERT(m_hIcon != NULL); + ATLASSERT(pIconInfo != NULL); + return ::GetIconInfoEx(m_hIcon, pIconInfo); + } +#endif // (_WIN32_WINNT >= 0x0600) + +#if defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN) + HRESULT LoadIconMetric(ATL::_U_STRINGorID icon, int lims) + { + ATLASSERT(m_hIcon == NULL); + USES_CONVERSION; + return ::LoadIconMetric(ModuleHelper::GetResourceInstance(), T2CW(icon.m_lpstr), lims, &m_hIcon); + } + + HRESULT LoadIconWithScaleDown(ATL::_U_STRINGorID icon, int cx, int cy) + { + ATLASSERT(m_hIcon == NULL); + USES_CONVERSION; + return ::LoadIconWithScaleDown(ModuleHelper::GetResourceInstance(), T2CW(icon.m_lpstr), cx, cy, &m_hIcon); + } + + HRESULT LoadOEMIconMetric(LPCTSTR lpstrIconName, int lims) + { + ATLASSERT(m_hIcon == NULL); + ATLASSERT(IsOEMIcon(lpstrIconName)); + return ::LoadIconMetric(NULL, (LPCWSTR)lpstrIconName, lims, &m_hIcon); + } + + HRESULT LoadOEMIconWithScaleDown(LPCTSTR lpstrIconName, int cx, int cy) + { + ATLASSERT(m_hIcon == NULL); + ATLASSERT(IsOEMIcon(lpstrIconName)); + USES_CONVERSION; + return ::LoadIconWithScaleDown(NULL, (LPCWSTR)lpstrIconName, cx, cy, &m_hIcon); + } +#endif // defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN) +#endif // !_WIN32_WCE + + // Helper +#ifndef _WIN32_WCE + static bool IsOEMIcon(LPCTSTR lpstrIconName) + { +#if (WINVER >= 0x0600) + return (lpstrIconName == IDI_APPLICATION || lpstrIconName == IDI_ASTERISK || lpstrIconName == IDI_EXCLAMATION || + lpstrIconName == IDI_HAND || lpstrIconName == IDI_QUESTION || lpstrIconName == IDI_WINLOGO || + lpstrIconName == IDI_SHIELD); +#else // !(WINVER >= 0x0600) + return (lpstrIconName == IDI_APPLICATION || lpstrIconName == IDI_ASTERISK || lpstrIconName == IDI_EXCLAMATION || + lpstrIconName == IDI_HAND || lpstrIconName == IDI_QUESTION || lpstrIconName == IDI_WINLOGO); +#endif // !(WINVER >= 0x0600) + } +#endif // !_WIN32_WCE +}; + +typedef CIconT CIconHandle; +typedef CIconT CIcon; + + +/////////////////////////////////////////////////////////////////////////////// +// CCursor + +// protect template member from a winuser.h macro +#ifdef CopyCursor + #undef CopyCursor +#endif + +template +class CCursorT +{ +public: + HCURSOR m_hCursor; + +// Constructor/destructor/operators + CCursorT(HCURSOR hCursor = NULL) : m_hCursor(hCursor) + { } + + ~CCursorT() + { + if(t_bManaged && m_hCursor != NULL) + DestroyCursor(); + } + + CCursorT& operator =(HCURSOR hCursor) + { + Attach(hCursor); + return *this; + } + + void Attach(HCURSOR hCursor) + { + if(t_bManaged && m_hCursor != NULL) + DestroyCursor(); + m_hCursor = hCursor; + } + + HCURSOR Detach() + { + HCURSOR hCursor = m_hCursor; + m_hCursor = NULL; + return hCursor; + } + + operator HCURSOR() const { return m_hCursor; } + + bool IsNull() const { return m_hCursor == NULL; } + +// Create/destroy methods + HCURSOR LoadCursor(ATL::_U_STRINGorID cursor) + { + ATLASSERT(m_hCursor == NULL); + m_hCursor = ::LoadCursor(ModuleHelper::GetResourceInstance(), cursor.m_lpstr); + return m_hCursor; + } + + HCURSOR LoadSysCursor(LPCTSTR lpstrCursorName) + { + ATLASSERT(m_hCursor == NULL); +#if (WINVER >= 0x0500) + ATLASSERT(lpstrCursorName == IDC_ARROW || lpstrCursorName == IDC_IBEAM || lpstrCursorName == IDC_WAIT || + lpstrCursorName == IDC_CROSS || lpstrCursorName == IDC_UPARROW || lpstrCursorName == IDC_SIZE || + lpstrCursorName == IDC_ICON || lpstrCursorName == IDC_SIZENWSE || lpstrCursorName == IDC_SIZENESW || + lpstrCursorName == IDC_SIZEWE || lpstrCursorName == IDC_SIZENS || lpstrCursorName == IDC_SIZEALL || + lpstrCursorName == IDC_NO || lpstrCursorName == IDC_APPSTARTING || lpstrCursorName == IDC_HELP || + lpstrCursorName == IDC_HAND); +#else // !(WINVER >= 0x0500) + ATLASSERT(lpstrCursorName == IDC_ARROW || lpstrCursorName == IDC_IBEAM || lpstrCursorName == IDC_WAIT || + lpstrCursorName == IDC_CROSS || lpstrCursorName == IDC_UPARROW || lpstrCursorName == IDC_SIZE || + lpstrCursorName == IDC_ICON || lpstrCursorName == IDC_SIZENWSE || lpstrCursorName == IDC_SIZENESW || + lpstrCursorName == IDC_SIZEWE || lpstrCursorName == IDC_SIZENS || lpstrCursorName == IDC_SIZEALL || + lpstrCursorName == IDC_NO || lpstrCursorName == IDC_APPSTARTING || lpstrCursorName == IDC_HELP); +#endif // !(WINVER >= 0x0500) + m_hCursor = ::LoadCursor(NULL, lpstrCursorName); + return m_hCursor; + } + + // deprecated + HCURSOR LoadOEMCursor(LPCTSTR lpstrCursorName) + { + return LoadSysCursor(lpstrCursorName); + } + + HCURSOR LoadCursor(ATL::_U_STRINGorID cursor, int cxDesired, int cyDesired, UINT fuLoad = 0) + { + ATLASSERT(m_hCursor == NULL); + m_hCursor = (HCURSOR) ::LoadImage(ModuleHelper::GetResourceInstance(), cursor.m_lpstr, IMAGE_CURSOR, cxDesired, cyDesired, fuLoad); + return m_hCursor; + } + +#ifndef _WIN32_WCE + HCURSOR LoadCursorFromFile(LPCTSTR pstrFilename) + { + ATLASSERT(m_hCursor == NULL); + ATLASSERT(pstrFilename != NULL); + m_hCursor = ::LoadCursorFromFile(pstrFilename); + return m_hCursor; + } +#endif // !_WIN32_WCE + +#if !defined(_WIN32_WCE) || ((_WIN32_WCE >= 0x400) && !(defined(WIN32_PLATFORM_PSPC) || defined(WIN32_PLATFORM_WFSP))) + HCURSOR CreateCursor(int xHotSpot, int yHotSpot, int nWidth, int nHeight, CONST VOID *pvANDPlane, CONST VOID *pvXORPlane) + { + ATLASSERT(m_hCursor == NULL); + m_hCursor = ::CreateCursor(ModuleHelper::GetResourceInstance(), xHotSpot, yHotSpot, nWidth, nHeight, pvANDPlane, pvXORPlane); + return m_hCursor; + } +#endif // !defined(_WIN32_WCE) || ((_WIN32_WCE >= 0x400) && !(defined(WIN32_PLATFORM_PSPC) || defined(WIN32_PLATFORM_WFSP))) + +#ifndef _WIN32_WCE + HCURSOR CreateCursorFromResource(PBYTE pBits, DWORD dwResSize, DWORD dwVersion = 0x00030000) + { + ATLASSERT(m_hCursor == NULL); + ATLASSERT(pBits != NULL); + m_hCursor = (HCURSOR)::CreateIconFromResource(pBits, dwResSize, FALSE, dwVersion); + return m_hCursor; + } + + HCURSOR CreateCursorFromResourceEx(PBYTE pbBits, DWORD cbBits, DWORD dwVersion = 0x00030000, int cxDesired = 0, int cyDesired = 0, UINT uFlags = LR_DEFAULTCOLOR) + { + ATLASSERT(m_hCursor == NULL); + ATLASSERT(pbBits != NULL); + ATLASSERT(cbBits > 0); + m_hCursor = (HCURSOR)::CreateIconFromResourceEx(pbBits, cbBits, FALSE, dwVersion, cxDesired, cyDesired, uFlags); + return m_hCursor; + } +#endif // !_WIN32_WCE + + BOOL DestroyCursor() + { + ATLASSERT(m_hCursor != NULL); +#if !defined(_WIN32_WCE) || ((_WIN32_WCE >= 0x400) && !(defined(WIN32_PLATFORM_PSPC) || defined(WIN32_PLATFORM_WFSP))) + BOOL bRet = ::DestroyCursor(m_hCursor); + if(bRet != FALSE) + m_hCursor = NULL; + return bRet; +#else // !(!defined(_WIN32_WCE) || ((_WIN32_WCE >= 0x400) && !(defined(WIN32_PLATFORM_PSPC) || defined(WIN32_PLATFORM_WFSP)))) + ATLTRACE2(atlTraceUI, 0, _T("Warning: This version of Windows CE does not have ::DestroyCursor()\n")); + return FALSE; +#endif // !(!defined(_WIN32_WCE) || ((_WIN32_WCE >= 0x400) && !(defined(WIN32_PLATFORM_PSPC) || defined(WIN32_PLATFORM_WFSP)))) + } + +// Operations +#ifndef _WIN32_WCE + HCURSOR CopyCursor() + { + ATLASSERT(m_hCursor != NULL); + return (HCURSOR)::CopyIcon((HICON)m_hCursor); + } +#endif // !_WIN32_WCE + +#if (WINVER >= 0x0500) && !defined(_WIN32_WCE) + BOOL GetCursorInfo(LPCURSORINFO pCursorInfo) + { + ATLASSERT(m_hCursor != NULL); + ATLASSERT(pCursorInfo != NULL); + return ::GetCursorInfo(pCursorInfo); + } +#endif // (WINVER >= 0x0500) && !defined(_WIN32_WCE) +}; + +typedef CCursorT CCursorHandle; +typedef CCursorT CCursor; + + +/////////////////////////////////////////////////////////////////////////////// +// CResource - Wraps a generic Windows resource. +// Use it with custom resource types other than the +// standard RT_CURSOR, RT_BITMAP, etc. + +class CResource +{ +public: + HGLOBAL m_hGlobal; + HRSRC m_hResource; + +// Constructor/destructor + CResource() : m_hGlobal(NULL), m_hResource(NULL) + { } + + ~CResource() + { + Release(); + } + +// Load methods + bool Load(ATL::_U_STRINGorID Type, ATL::_U_STRINGorID ID) + { + ATLASSERT(m_hResource == NULL); + ATLASSERT(m_hGlobal == NULL); + + m_hResource = ::FindResource(ModuleHelper::GetResourceInstance(), ID.m_lpstr, Type.m_lpstr); + if(m_hResource == NULL) + return false; + + m_hGlobal = ::LoadResource(ModuleHelper::GetResourceInstance(), m_hResource); + if(m_hGlobal == NULL) + { + m_hResource = NULL; + return false; + } + + return true; + } + +#ifndef _WIN32_WCE + bool LoadEx(ATL::_U_STRINGorID Type, ATL::_U_STRINGorID ID, WORD wLanguage) + { + ATLASSERT(m_hResource == NULL); + ATLASSERT(m_hGlobal == NULL); + + m_hResource = ::FindResourceEx(ModuleHelper::GetResourceInstance(), ID.m_lpstr, Type.m_lpstr, wLanguage); + if(m_hResource == NULL) + return false; + + m_hGlobal = ::LoadResource(ModuleHelper::GetResourceInstance(), m_hResource); + if(m_hGlobal == NULL) + { + m_hResource = NULL; + return false; + } + + return true; + } +#endif // !_WIN32_WCE + +// Misc. operations + DWORD GetSize() const + { + ATLASSERT(m_hResource != NULL); + return ::SizeofResource(ModuleHelper::GetResourceInstance(), m_hResource); + } + + LPVOID Lock() + { + ATLASSERT(m_hResource != NULL); + ATLASSERT(m_hGlobal != NULL); + LPVOID pVoid = ::LockResource(m_hGlobal); + ATLASSERT(pVoid != NULL); + return pVoid; + } + + void Release() + { + if(m_hGlobal != NULL) + { + FreeResource(m_hGlobal); + m_hGlobal = NULL; + m_hResource = NULL; + } + } +}; + +}; // namespace WTL + +#endif // __ATLUSER_H__ diff --git a/Externals/WTL80/atlwince.h b/Externals/WTL80/atlwince.h new file mode 100644 index 0000000000..5502d2ec15 --- /dev/null +++ b/Externals/WTL80/atlwince.h @@ -0,0 +1,3010 @@ +// Windows Template Library - WTL version 8.0 +// Copyright (C) Microsoft Corporation. All rights reserved. +// +// This file is a part of the Windows Template Library. +// The use and distribution terms for this software are covered by the +// Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php) +// which can be found in the file CPL.TXT at the root of this distribution. +// By using this software in any fashion, you are agreeing to be bound by +// the terms of this license. You must not remove this notice, or +// any other, from this software. + +#ifndef __ATLWINCE_H__ +#define __ATLWINCE_H__ + +#pragma once + +#ifndef __cplusplus + #error ATL requires C++ compilation (use a .cpp suffix) +#endif + +#ifndef __ATLAPP_H__ + #error atlwince.h requires atlapp.h to be included first +#endif + +#ifndef __ATLWIN_H__ + #error atlwince.h requires atlwin.h to be included first +#endif + +#ifndef _WIN32_WCE + #error atlwince.h compiles under Windows CE only +#elif (_WIN32_WCE < 300) + #error atlwince.h requires Windows CE 3.0 or higher. +#endif + +#if defined(WIN32_PLATFORM_WFSP) && _MSC_VER < 1400 // EVC compiling SmartPhone code + #if (WIN32_PLATFORM_WFSP < 200) + #error atlwince.h requires Smartphone 2003 or higher + #endif +#endif // WIN32_PLATFORM_WFSP + +#if defined(WIN32_PLATFORM_PSPC) && _MSC_VER < 1400 // EVC compiling Pocket PC code + #if (WIN32_PLATFORM_PSPC < 310) + #error atlwince.h requires Pocket PC 2002 or higher + #endif +#endif // WIN32_PLATFORM_PSPC + +#if !defined(_AYGSHELL_H_) && !defined(__AYGSHELL_H__) + #error atlwince.h requires aygshell.h to be included first +#else + #if defined(WIN32_PLATFORM_WFSP) && !defined(_TPCSHELL_H_) + #error SmartPhone dialog classes require tpcshell.h to be included first + #endif +#endif + +#if (_MSC_VER >= 1400) // VS2005 + #include + #define _WTL_CE_DRA +#endif // (_MSC_VER >= 1400) + +#if !defined(_WTL_CE_NO_DIALOGS) && !defined(__ATLFRAME_H__) + #error Orientation aware dialog classes require atlframe.h to be included first +#endif + +#if !defined(_WTL_CE_NO_APPWINDOW) && !defined(__ATLFRAME_H__) + #error Application window class require atlframe.h to be included first +#endif + +#if !defined(_WTL_CE_NO_ZOOMSCROLL) && !defined(__ATLSCRL_H__) + #error ZoomScroll implementation requires atlscrl.h to be included first +#endif + +#if !defined(_WTL_CE_NO_ZOOMSCROLL) + #if !(defined(__ATLTYPES_H__) || (defined(__ATLMISC_H__) && !defined(_WTL_NO_WTYPES))) + #error ZoomScroll requires _WTL_NO_WTYPES not to be defined and either atlmisc.h or atltypes.h to be included first + #endif // !(defined(__ATLTYPES_H__) || (defined(__ATLMISC_H__) && !defined(_WTL_NO_WTYPES))) +#endif // !defined(_WTL_CE_NO_ZOOMSCROLL) + +#if !defined(WIN32_PLATFORM_WFSP) && !defined(WIN32_PLATFORM_PSPC) + #define _WTL_CE_NO_CONTROLS +#endif // !defined(WIN32_PLATFORM_WFSP) && !defined(WIN32_PLATFORM_PSPC) + +#ifndef _WTL_CE_NO_CONTROLS + #ifndef __ATLCTRLS_H__ + #error The PPC/SmartPhone controls classes require atlctrls.h to be included first + #endif + + #include + #pragma comment(lib, "htmlview.lib") + + #include + #pragma comment(lib, "voicectl.lib") + + #ifdef WIN32_PLATFORM_PSPC + #include + #pragma comment(lib, "richink.lib") + + #include + #pragma comment(lib, "inkx.lib") + + #include + #pragma comment(lib, "doclist.lib") + #endif +#endif + + +/////////////////////////////////////////////////////////////////////////////// +// Classes in this file: +// +// CStdDialogBase : Standard PPC/SmartPhone dialog base class +// CStdDialogImplBase - Base implementation of standard dialog +// CStdDialogImpl : Standard dialog implementation +// CStdIndirectDialogImpl - implementation of standard indirect PPC/SmartPhone dialog +// CStdAxDialogImpl : Standard AxDialog implementation +// CStdSimpleDialog : Standard simple dialog +// CStdDialogResizeImplBase - Base implementation of orientation resizing standard dialog +// CStdDialogResizeImpl : Orientation resizing standard dialog implementation +// CStdAxDialogResizeImpl - implementation of orientation resizing standard AxDialog +// CStdSimpleDialogResizeImpl : Standard resizing simple dialog implementation +// CStdOrientedDialogBase - Oriented PPC standard dialog base class +// CStdOrientedDialogImplBase - Oriented PPC standard dialog base implementation +// CStdOrientedDialogImpl : Oriented PPC standard dialog implementation +// CStdAxOrientedDialogImpl - Oriented PPC standard AxDialog implementation +// CStdSimpleOrientedDialog : Standard simple orientable dialog +// +// CAppInfoBase : Helper for application state save/restore to registry +// CAppInfoT : CAppInfoBase constructed from a CAppWindow +// CAppWindowBase : Base class for PPC/SmartPhone well-behaved application window or dialog +// CAppWindow : PPC/SmartPhone well-behaved application window class +// CAppDialog : PPC/SmartPhone well-behaved application dialog class +// CAppStdDialogImplBase - Base implementation of standard application dialogs +// CAppStdDialogImpl : Implementation of standard application dialog +// CAppStdDialogResizeImpl - implementation of orientation resizing standard application dialog +// CAppStdAxDialogImpl - Implementation of standard application AxDialog +// CAppStdAxDialogResizeImpl - implementation of orientation resizing standard application AxDialog +// CAppStdOrientedDialogImpl - implementation of oriented PPC standard application dialog +// CAppStdAxOrientedDialogImpl - implementation of oriented PPC standard application AxDialog +// +// CFullScreenFrame : Full screen frame class +// +// CZoomScrollImpl : WinCE zooming implementation +// +// CBottomTabViewImpl - CBottomTabView +// CHtmlCtrlT - CHtmlCtrl +// CRichInkCtrlT - CRichInkCtrl +// CInkXCtrlT - CInkXCtrl +// CVoiceRecorderCtrlT - CVoiceRecorderCtrl +// CDocListCtrlT - CDocListCtrl +// CCapEditT - CCapEdit +// CTTStaticT - CTTStatic +// CTTButtonT - CTTButton +// +// CSpinCtrlT - CSpinCtrl : SmartPhone specific UpDown control +// CSpinned : SmartPhone association of control and Spin +// CSpinListBox : SmartPhone spinned ListBox control +// CExpandListBox : SmartPhone expandable ListBox control +// CExpandEdit : SmartPhone expandable Edit control +// CExpandCapEdit : SmartPhone expandable CapEdit control +// +// Global functions: +// AtlCreateMenuBar() +// AtlCreateEmptyMenuBar() +// AtlIsEditFocus() +// AtlActivateBackKey() + +namespace WTL +{ + +/////////////////////////////////////////////////////////////////////////////// +// MenuBar creation functions for property sheets and dialogs +// Frame windows use CreateSimpleCEMenuBar + +inline HWND AtlCreateMenuBar(SHMENUBARINFO& mbi) +{ + ATLASSERT(::IsWindow(mbi.hwndParent)); + ATLVERIFY(::SHCreateMenuBar(&mbi) != FALSE); + return mbi.hwndMB; +}; + +inline HWND AtlCreateMenuBar(HWND hWnd, UINT nToolBarId = ATL_IDW_TOOLBAR, DWORD dwFlags = 0, int nBmpId = 0, int cBmpImages = 0, COLORREF clrBk = 0) +{ + SHMENUBARINFO mbi = { sizeof(mbi), hWnd, dwFlags, nToolBarId, ModuleHelper::GetResourceInstance(), nBmpId, cBmpImages, 0, clrBk }; + return AtlCreateMenuBar(mbi); +} + +inline HWND AtlCreateEmptyMenuBar(HWND hWnd, bool bSip = true) +{ + SHMENUBARINFO embi = { sizeof(SHMENUBARINFO), hWnd, SHCMBF_EMPTYBAR }; + if (!bSip) + embi.dwFlags |= SHCMBF_HIDESIPBUTTON; + + return AtlCreateMenuBar(embi); +} + +/////////////////////////////////////////////////////////////////////////////// +// Helper functions for SmartPhone back key handling + +inline bool AtlIsEditFocus() +{ + ATL::CWindow wCtrl = GetFocus(); + if (wCtrl.IsWindow()) + { + TCHAR szClassName[8] = {0}; + ATLVERIFY(::GetClassName(wCtrl.m_hWnd, szClassName, 8)); + return !_tcscmp(szClassName, _T("Edit")) || !_tcscmp(szClassName, WC_CAPEDIT); + } + return false; +} + +#if defined WIN32_PLATFORM_WFSP +inline void AtlActivateBackKey(HWND hMenuBar) +{ + ATLASSERT(::IsWindow(hMenuBar)); + ::SendMessage(hMenuBar, SHCMBM_OVERRIDEKEY, VK_TBACK, + MAKELPARAM(SHMBOF_NODEFAULT | SHMBOF_NOTIFY, SHMBOF_NODEFAULT | SHMBOF_NOTIFY)); +} +#endif // WIN32_PLATFORM_WFSP + +// --- Standard PPC/SmartPhone dialogs --- + +#ifndef _WTL_CE_NO_DIALOGS + +/////////////////////////////////////////////////////////////////////////////// +// CStdDialogBase - base class for standard PPC/SmartPhone dialogs + +#define WTL_STD_SHIDIF SHIDIF_DONEBUTTON | SHIDIF_SIPDOWN | SHIDIF_SIZEDLGFULLSCREEN +#define WTL_SP_SHIDIF SHIDIF_SIZEDLGFULLSCREEN + +// Title setting macros +#define WTL_DLG_TITLEHEIGHT(iHeight) static const int GetTitleHeight(){return iHeight;} +#define WTL_DLG_NOTITLE WTL_DLG_TITLEHEIGHT(0) + +/////////////////////////////////////////////////////////////////////////////// +// CStdDialogBase - Base class for standard PPC/SmartPhone dialog + +template +class CStdDialogBase +{ +public: +#ifdef WIN32_PLATFORM_PSPC +// Pocket PC only Dialog title handling + const int nTitleHeight; + + CStdDialogBase() : nTitleHeight(T::GetTitleHeight()) + { } + +// Overloads + BOOL GetClientRect(LPRECT lpRect) + { + T* pT = static_cast(this); + ATLASSERT(pT->IsWindow()); + BOOL bRes = ::GetClientRect(pT->m_hWnd, lpRect); + lpRect->top += nTitleHeight; + return bRes; + } + + BOOL SetWindowText(LPCTSTR lpszString) + { + T* pT = static_cast(this); + ATLASSERT(pT->IsWindow()); + BOOL bRes = ::SetWindowText(pT->m_hWnd, lpszString); + if (nTitleHeight != 0) + pT->DoPaintTitle(); + return bRes; + } + +// Overrideables + static const int GetTitleHeight() + { + #ifdef _WTL_CE_DRA + return DRA::SCALEY(24); + #else // !_WTL_CE_DRA + CWindowDC dc(NULL); + return dc.GetDeviceCaps(LOGPIXELSY) >> 2; // LOGPIXELSY * 24 / 96, + #endif // !_WTL_CE_DRA + } + + // Title painting + bool DoPaintTitle() + { + T* pT = static_cast(this); + ATLASSERT(pT->IsWindow()); + TCHAR sTitle[48]; + + // Preparation + CPaintDC dc(pT->m_hWnd); + CFont fontTitle = AtlCreateBoldFont(); + CFontHandle fontOld = dc.SelectFont(fontTitle); + dc.SetTextColor(GetSysColor(COLOR_HIGHLIGHT)); + int nLen = pT->GetWindowText(sTitle, 48); + int nWidth = dc.GetDeviceCaps(HORZRES); + + // Display title text + RECT rTitle = { 0, 0, nWidth, nTitleHeight }; + dc.FillRect(&rTitle, COLOR_3DHIGHLIGHT); + #ifdef _WTL_CE_DRA + rTitle.left = DRA::SCALEX(8); + #else // !_WTL_CE_DRA + rTitle.left = nTitleHeight / 3; // 8 == 24 / 3 + #endif // !_WTL_CE_DRA + dc.DrawText(sTitle, nLen, &rTitle, DT_VCENTER | DT_SINGLELINE); + dc.SelectFont(fontOld); + + // Draw bottom line, 2 pixels thick if HI_RES_AWARE + CPenHandle penOld = dc.SelectStockPen(BLACK_PEN); + POINT line[4] = {{0, nTitleHeight}, {nWidth, nTitleHeight}, {0, nTitleHeight - 1}, {nWidth, nTitleHeight - 1}}; + + #ifdef _WTL_CE_DRA + int nSeg = DRA::SCALEY(1); + #else // !_WTL_CE_DRA + int nSeg = nTitleHeight / 24; + #endif // !_WTL_CE_DRA + + dc.Polyline(line, nSeg <= 2 ? nSeg * 2 : 4); + dc.SelectPen(penOld); + + return false; + } + + // Title preparation: move the dialog controls down to make room for title + void DialogTitleInit() + { + T* pT = static_cast(this); + ATLASSERT(pT->IsWindow()); + + ATL::CWindow wCtl = pT->GetWindow(GW_CHILD); + while (wCtl.IsWindow()) + { + RECT rCtl = { 0 }; + wCtl.GetWindowRect(&rCtl); + ::MapWindowPoints(NULL, pT->m_hWnd, (LPPOINT)&rCtl, 2); + ::OffsetRect(&rCtl, 0, nTitleHeight); + wCtl.MoveWindow(&rCtl, FALSE); + wCtl = wCtl.GetWindow(GW_HWNDNEXT); + } + } + + // SIP management + void DoSipInfo() + { + T* pT = static_cast(this); + ATLASSERT(pT->IsWindow()); + + SIPINFO si = {sizeof(SIPINFO)}; + SipGetInfo(&si); + if ((si.fdwFlags & SIPF_ON) ^ SIPF_ON) + si.rcVisibleDesktop.bottom = si.rcSipRect.bottom; + pT->MoveWindow(&si.rcVisibleDesktop, FALSE); + } + +// Title painting handler + LRESULT OnPaintTitle(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) + { + T* pT = static_cast(this); + return bHandled = nTitleHeight ? pT->DoPaintTitle() : FALSE; + } + +// SIP handler + LRESULT OnSettingChange(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) + { + T* pT = static_cast(this); + if (wParam == SPI_SETSIPINFO) + { + pT->DoSipInfo(); + return TRUE; + } + return bHandled = FALSE; + } + +#elif defined WIN32_PLATFORM_WFSP +// SmartPhone VK_TBACK key standard management + LRESULT OnHotKey(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) + { + T* pT = static_cast(this); + const UINT uModif = (UINT)LOWORD(lParam); + const UINT uVirtKey = (UINT)HIWORD(lParam); + + if(uVirtKey == VK_TBACK) + if (AtlIsEditFocus()) + ::SHSendBackToFocusWindow(uMsg, wParam, lParam); + else if (uModif & MOD_KEYUP) + pT->StdCloseDialog(IDCANCEL); + return 1; + } + + // SmartPhone MenuBar and VK_TBACK key initialization + void StdSPInit() + { + T* pT = static_cast(this); + HWND hMenuBar = ::SHFindMenuBar(pT->m_hWnd); + + if (!hMenuBar && (t_shidiFlags & SHIDIF_DONEBUTTON)) + hMenuBar = CreateMenuBar(ATL_IDM_MENU_DONE); + + if(hMenuBar != NULL) + AtlActivateBackKey(hMenuBar); + } + + void SetStaticBold() + { + T* pT = static_cast(this); + ATLASSERT(pT->IsWindow()); + + CFontHandle fontBold = AtlCreateBoldFont(pT->GetFont()); + + ATL::CWindow wCtl = pT->GetWindow(GW_CHILD); + + while (wCtl.IsWindow()) + { + if ((short int)wCtl.GetDlgCtrlID() == IDC_STATIC) + wCtl.SetFont(fontBold); + wCtl = wCtl.GetWindow(GW_HWNDNEXT); + } + } +#endif // WIN32_PLATFORM_WFSP + +// Platform dependant initialization + void StdPlatformInit() + { + T* pT = static_cast(this); +#ifdef WIN32_PLATFORM_PSPC // Pocket PC title initialization + if (nTitleHeight != 0) + pT->DialogTitleInit(); +#elif defined(WIN32_PLATFORM_WFSP) + pT->StdSPInit(); + SetStaticBold(); +#endif // WIN32_PLATFORM_WFSP + } + + // Menu bar creation + HWND CreateMenuBar(UINT uiMB = T::IDD, int nBmpImages = 0) + { + T* pT = static_cast(this); + return AtlCreateMenuBar(pT->m_hWnd, uiMB, 0, nBmpImages ? uiMB : 0, nBmpImages); + } + + // Dialog closing + void StdCloseDialog(WORD wID) + { + T* pT = static_cast(this); + if (t_bModal) + ::EndDialog(pT->m_hWnd, wID); + else + pT->DestroyWindow(); + } + + // Shell dialog layout initialization + void StdShidInit() + { + T* pT = static_cast(this); + SHINITDLGINFO shidi = { SHIDIM_FLAGS, pT->m_hWnd, t_shidiFlags }; + ::SHInitDialog(&shidi); + } + +// IDC_INFOSTATIC background setting + LRESULT OnColorStatic(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled) + { + if (::GetDlgCtrlID((HWND)lParam) == IDC_INFOSTATIC) + { + ::SetBkMode((HDC)wParam, TRANSPARENT); + return (LRESULT)::GetSysColorBrush(COLOR_INFOBK); + } + return bHandled = FALSE; + } + +// Menu dialog ending + LRESULT OnMenuClose(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/) + { + T* pT = static_cast(this); + pT->StdCloseDialog((WORD)(wID - ID_MENU_OK + IDOK)); + return 0; + } + +// Standard dialog ending: may be used with any command + LRESULT OnCloseCmd(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/) + { + T* pT = static_cast(this); + pT->StdCloseDialog(wID); + return 0; + } +}; + + +/////////////////////////////////////////////////////////////////////////////// +// CStdDialogImplBase - Base implementation of standard PPC/SmartPhone dialog + +template > +class ATL_NO_VTABLE CStdDialogImplBase : + public TBase, + public CStdDialogBase +{ +public: +#ifdef WIN32_PLATFORM_PSPC + BOOL GetClientRect(LPRECT lpRect) + { + return CStdDialogBase::GetClientRect(lpRect); + } + + BOOL SetWindowText(LPCTSTR lpszString) + { + return CStdDialogBase::SetWindowText(lpszString); + } +#endif + + BEGIN_MSG_MAP(CStdDialogImplBase) +#ifdef WIN32_PLATFORM_PSPC // Pocket PC title and SIP + MESSAGE_HANDLER(WM_PAINT, OnPaintTitle) + MESSAGE_HANDLER(WM_SETTINGCHANGE, OnSettingChange) +#elif defined(WIN32_PLATFORM_WFSP) // SmartPhone VK_TBACK key + MESSAGE_HANDLER(WM_HOTKEY, OnHotKey) +#endif + MESSAGE_HANDLER(WM_CTLCOLORSTATIC, OnColorStatic) + MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) + COMMAND_RANGE_HANDLER(IDOK, IDCANCEL, OnCloseCmd) + COMMAND_RANGE_HANDLER(ID_MENU_OK, ID_MENU_CANCEL, OnMenuClose) + END_MSG_MAP() + + LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) + { +#ifdef _DEBUG + T* pT = static_cast(this); + ATLASSERT(t_bModal == pT->m_bModal); +#endif + StdPlatformInit(); + StdShidInit(); + return bHandled = FALSE; + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// CStdDialogImpl - implementation of standard PPC/SmartPhone dialog + +template +class ATL_NO_VTABLE CStdDialogImpl : public CStdDialogImplBase< T, t_shidiFlags, t_bModal> +{}; + +/////////////////////////////////////////////////////////////////////////////// +// CStdIndirectDialogImpl - implementation of standard indirect PPC/SmartPhone dialog + +#if defined __ATLDLGS_H__ + +template +class ATL_NO_VTABLE CStdIndirectDialogImpl : + public CIndirectDialogImpl< T, CMemDlgTemplate, CStdDialogImpl > +{ +public: + typedef CIndirectDialogImpl< T, CMemDlgTemplate, CStdDialogImpl > _baseClass; + typedef CStdDialogImpl _baseStd; + + INT_PTR DoModal(HWND hWndParent = ::GetActiveWindow(), LPARAM dwInitParam = NULL) + { + ATLASSERT(t_bModal); + + if (!m_Template.IsValid()) + CreateTemplate(); + + if (m_Template.IsTemplateEx()) + { + if (m_Template.GetTemplateExPtr()->style & DS_CENTER) + { + ATLASSERT(m_Template.GetTemplateExPtr()->style ^ WS_CHILD); + GetTemplateExPtr()->style |= WS_POPUP; + } + } + else + { + if (m_Template.GetTemplatePtr()->style & DS_CENTER) + { + ATLASSERT(m_Template.GetTemplatePtr()->style ^ WS_CHILD); + m_Template.GetTemplatePtr()->style |= WS_POPUP; + } + } + + return _baseClass::DoModal(hWndParent, dwInitParam); + } + + HWND Create(HWND hWndParent, LPARAM dwInitParam = NULL) + { + ATLASSERT(!t_bModal); + + if (!m_Template.IsValid()) + CreateTemplate(); + + if (m_Template.IsTemplateEx()) + { + if (GetTemplateExPtr()->style & DS_CENTER) + { + ATLASSERT(GetTemplateExPtr()->style ^ WS_CHILD); + GetTemplateExPtr()->style |= WS_POPUP; + } + } + else + { + if (GetTemplatePtr()->style & DS_CENTER) + { + ATLASSERT(GetTemplatePtr()->style ^ WS_CHILD); + GetTemplatePtr()->style |= WS_POPUP; + } + } + + return _baseClass::Create(hWndParent, dwInitParam); + } + + BEGIN_MSG_MAP(CStdIndirectDialogImpl) + CHAIN_MSG_MAP(_baseStd) + END_MSG_MAP() + +}; + +#endif // defined __ATLDLGS_H__ + +#ifndef _ATL_NO_HOSTING + +/////////////////////////////////////////////////////////////////////////////// +// CStdAxDialogImpl - implementation of standard PPC/SmartPhone AxDialog + +template +class ATL_NO_VTABLE CStdAxDialogImpl : public CStdDialogImplBase< T, t_shidiFlags, t_bModal, ATL::CAxDialogImpl< T > > +{}; +#endif // _ATL_NO_HOSTING + +/////////////////////////////////////////////////////////////////////////////// +// CStdSimpleDialog - standard PPC/SmartPhone simple dialog with SHIDIF_xxx flags + +template +class CStdSimpleDialog : + public ATL::CSimpleDialog, + public CStdDialogBase, t_shidiFlags> +{ +public: + typedef CStdDialogBase, t_shidiFlags> baseClass; + +#ifdef WIN32_PLATFORM_PSPC + BOOL GetClientRect(LPRECT lpRect) + { + return baseClass::GetClientRect(lpRect); + } + + BOOL SetWindowText(LPCTSTR lpszString) + { + return baseClass::SetWindowText(lpszString); + } +#endif + + BEGIN_MSG_MAP(CStdSimpleDialog) +#ifdef WIN32_PLATFORM_PSPC // Pocket PC title and SIP + MESSAGE_HANDLER(WM_PAINT, OnPaintTitle) + MESSAGE_HANDLER(WM_SETTINGCHANGE, OnSettingChange) +#elif defined(WIN32_PLATFORM_WFSP) // SmartPhone VK_TBACK key + MESSAGE_HANDLER(WM_HOTKEY, OnHotKey) +#endif + MESSAGE_HANDLER(WM_CTLCOLORSTATIC, OnColorStatic) + MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) + COMMAND_RANGE_HANDLER(ID_MENU_OK, ID_MENU_CANCEL, OnMenuClose) + COMMAND_RANGE_HANDLER(IDOK, IDCANCEL, baseClass::OnCloseCmd) + END_MSG_MAP() + + LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) + { + StdPlatformInit(); + StdShidInit(); + return bHandled = FALSE; + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// CStdDialogResizeImplBase - Base implementation of orientation resizing standard PPC/SmartPhone dialog + +template > +class ATL_NO_VTABLE CStdDialogResizeImplBase : + public CStdDialogImplBase< T, t_shidiFlags, t_bModal, TBase>, + public CDialogResize +{ +public: + // Note: BEGIN_DLGRESIZE_MAP is required in the derived class. + + BEGIN_MSG_MAP(CStdResizeDialogImplBase) +#ifdef WIN32_PLATFORM_PSPC // Pocket PC title + MESSAGE_HANDLER(WM_PAINT, OnPaintTitle) +#elif defined(WIN32_PLATFORM_WFSP) // SmartPhone VK_TBACK key + MESSAGE_HANDLER(WM_HOTKEY, OnHotKey) +#endif + MESSAGE_HANDLER(WM_CTLCOLORSTATIC, OnColorStatic) + MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) + COMMAND_RANGE_HANDLER(IDOK, IDCANCEL, OnCloseCmd) + COMMAND_RANGE_HANDLER(ID_MENU_OK, ID_MENU_CANCEL, OnMenuClose) + CHAIN_MSG_MAP(CDialogResize< T >) + END_MSG_MAP() + + LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) + { +#ifdef _DEBUG + T* pT = static_cast(this); + ATLASSERT(t_bModal == pT->m_bModal); +#endif + StdPlatformInit(); + DlgResize_Init(FALSE); + StdShidInit(); + return bHandled = FALSE; + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// CStdDialogResizeImpl - implementation of orientation resizing standard PPC/SmartPhone dialog + +template +class ATL_NO_VTABLE CStdDialogResizeImpl : public CStdDialogResizeImplBase< T, t_shidiFlags, t_bModal> +{}; + +#ifndef _ATL_NO_HOSTING + +/////////////////////////////////////////////////////////////////////////////// +// CStdAxDialogResizeImpl - implementation of orientation resizing standard PPC/SmartPhone AxDialog + +template +class ATL_NO_VTABLE CStdAxDialogResizeImpl : public CStdDialogResizeImplBase< T, t_shidiFlags, t_bModal, ATL::CAxDialogImpl > +{}; +#endif // _ATL_NO_HOSTING + +/////////////////////////////////////////////////////////////////////////////// +// CStdSimpleDialogResizeImpl - implementation of standard resizing simple dialog with SHIDIF_xxx flags + +// Usage: +// class CMyDlg : public CStdSimpleDialogResize +// { +// public: +// BEGIN_DLGRESIZE_MAP(CMyDlg) +// ... +// END_DLGRESIZE_MAP() +// }; + +template +class ATL_NO_VTABLE CStdSimpleDialogResizeImpl : + public CStdSimpleDialog, + public CDialogResize< T > +{ +public: + typedef CStdSimpleDialog::baseClass baseClass; + + BEGIN_MSG_MAP(CStdSimpleDialogResizeImpl) +#ifdef WIN32_PLATFORM_PSPC // Pocket PC title + MESSAGE_HANDLER(WM_PAINT, OnPaintTitle) +#elif defined(WIN32_PLATFORM_WFSP) // SmartPhone VK_TBACK key + MESSAGE_HANDLER(WM_HOTKEY, OnHotKey) +#endif + MESSAGE_HANDLER(WM_CTLCOLORSTATIC, OnColorStatic) + MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) + COMMAND_RANGE_HANDLER(IDOK, IDCANCEL, baseClass::OnCloseCmd) + COMMAND_RANGE_HANDLER(ID_MENU_OK, ID_MENU_CANCEL, OnMenuClose) + CHAIN_MSG_MAP(CDialogResize< T >) + END_MSG_MAP() + + LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) + { + StdPlatformInit(); + DlgResize_Init(FALSE); + StdShidInit(); + return bHandled = FALSE; + } +}; + +#if defined(_WTL_CE_DRA) && defined(WIN32_PLATFORM_PSPC) + +/////////////////////////////////////////////////////////////////////////////// +// CStdOrientedDialogBase - Oriented PPC standard dialog base class + +template +class CStdOrientedDialogBase +{ +public: +// Operation + BOOL SetOrientation(DRA::DisplayMode mode) + { + T* pT = static_cast(this); + ATLASSERT(pT->IsWindow()); + ATLASSERT(mode == DRA::GetDisplayMode()); + + // Derived dialog must enumerate TWO dialog templates with the same control ids and types ie: + // enum { IDD = IDD_MYDLG, IDD_LANDSCAPE = IDD_MYDLG_L }; + UINT iResource = (mode == DRA::Landscape)? T::IDD_LANDSCAPE : T::IDD; + + BOOL bRes = DRA::RelayoutDialog(ModuleHelper::GetResourceInstance(), pT->m_hWnd, MAKEINTRESOURCE(iResource)); + pT->OnOrientation(mode); + return bRes; + } + +// Override + void OnOrientation(DRA::DisplayMode /*mode*/) + {} + +// Message handlers + LRESULT OnSettingChange(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) + { + T* pT = static_cast(this); + ATLASSERT(pT->IsWindow()); + if (wParam == SETTINGCHANGE_RESET) + { + SetOrientation(DRA::GetDisplayMode()); + pT->StdPlatformInit(); + pT->StdShidInit(); + } + else if (wParam == SPI_SETSIPINFO) + { + pT->DoSipInfo(); + return TRUE; + } + return bHandled = FALSE; + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// CStdOrientedDialogImplBase - Oriented PPC standard dialog base implementation + +template > +class ATL_NO_VTABLE CStdOrientedDialogImplBase : + public CStdDialogImplBase< T, t_shidiFlags, t_bModal, TBase>, + public CStdOrientedDialogBase +{ +public: + BEGIN_MSG_MAP(CStdOrientedDialogImpl) + MESSAGE_HANDLER(WM_PAINT, OnPaintTitle) + MESSAGE_HANDLER(WM_CTLCOLORSTATIC, OnColorStatic) + MESSAGE_HANDLER(WM_SETTINGCHANGE, CStdOrientedDialogBase::OnSettingChange) + MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) + COMMAND_RANGE_HANDLER(IDOK, IDCANCEL, OnCloseCmd) + COMMAND_RANGE_HANDLER(ID_MENU_OK, ID_MENU_CANCEL, OnMenuClose) + END_MSG_MAP() + + LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) + { + T* pT = static_cast(this); +#ifdef _DEBUG + ATLASSERT(t_bModal == pT->m_bModal); +#endif + if (DRA::GetDisplayMode() == DRA::Landscape) + SetOrientation(DRA::Landscape); + pT->StdPlatformInit(); + pT->StdShidInit(); + return bHandled = FALSE; + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// CStdOrientedDialogImpl - Oriented PPC standard dialog implementation + +template +class ATL_NO_VTABLE CStdOrientedDialogImpl : public CStdOrientedDialogImplBase< T, t_shidiFlags, t_bModal> +{}; + +#ifndef _ATL_NO_HOSTING +/////////////////////////////////////////////////////////////////////////////// +// CStdAxOrientedDialogImpl - Oriented PPC standard AxDialog implementation + +template +class ATL_NO_VTABLE CStdAxOrientedDialogImpl : public CStdOrientedDialogImplBase< T, t_shidiFlags, t_bModal, ATL::CAxDialogImpl > +{}; +#endif // _ATL_NO_HOSTING + +/////////////////////////////////////////////////////////////////////////////// +// CStdSimpleOrientedDialog - Standard simple orientable dialog + +template +class CStdSimpleOrientedDialog : + public CStdSimpleDialog, + public CStdOrientedDialogBase > +{ +public: + typedef CStdSimpleDialog::baseClass baseClass; + typedef CStdOrientedDialogBase > baseOriented; + + enum {IDD = t_wDlgTemplateID, IDD_LANDSCAPE = t_wDlgLandscapeID}; + + BEGIN_MSG_MAP(CStdSimpleDialog) + MESSAGE_HANDLER(WM_PAINT, OnPaintTitle) + MESSAGE_HANDLER(WM_CTLCOLORSTATIC, OnColorStatic) + MESSAGE_HANDLER(WM_SETTINGCHANGE, baseOriented::OnSettingChange) + MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) + COMMAND_RANGE_HANDLER(IDOK, IDCANCEL, baseClass::OnCloseCmd) + COMMAND_RANGE_HANDLER(ID_MENU_OK, ID_MENU_CANCEL, OnMenuClose) + END_MSG_MAP() + + LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) + { + if (DRA::GetDisplayMode() == DRA::Landscape) + SetOrientation(DRA::Landscape); + StdPlatformInit(); + StdShidInit(); + return bHandled = FALSE; + } +}; + +#endif // _WTL_CE_DRA + + +#endif // _WTL_CE_NO_DIALOGS + + +// --- PPC/SmartPhone application window and helpers --- + +#ifndef _WTL_CE_NO_APPWINDOW + +/////////////////////////////////////////////////////////////////////////////// +// CAppInfoBase - Helper for application state save/restore to registry + +class CAppInfoBase +{ +public: + ATL::CRegKey m_Key; + + CAppInfoBase(ATL::_U_STRINGorID sAppKey) + { + m_Key.Create(HKEY_CURRENT_USER, sAppKey.m_lpstr); + ATLASSERT(m_Key.m_hKey); + } + + template + LONG Save(V& val, ATL::_U_STRINGorID sName) + { + return ::RegSetValueEx(m_Key, sName.m_lpstr, 0, REG_BINARY, (LPBYTE)&val, sizeof(V)); + } + + template + LONG Save(int nb, V& val0, ATL::_U_STRINGorID sName) + { + return ::RegSetValueEx(m_Key, sName.m_lpstr, 0, REG_BINARY, (LPBYTE)&val0, nb * sizeof(V)); + } + + template + LONG Restore(V& val, ATL::_U_STRINGorID sName) + { + DWORD valtype; + DWORD bufSize = sizeof(V); + return ::RegQueryValueEx(m_Key, sName.m_lpstr, 0, &valtype, (LPBYTE)&val, &bufSize); + } + + template + LONG Restore(int nb, V& val0, ATL::_U_STRINGorID sName) + { + DWORD valtype; + DWORD bufSize = nb * sizeof(V); + return ::RegQueryValueEx(m_Key, sName.m_lpstr, 0, &valtype, (LPBYTE)&val0, &bufSize); + } + +#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) +#if (_ATL_VER < 0x0800) + LONG Save(_CSTRING_NS::CString& sval, ATL::_U_STRINGorID sName) + { + return m_Key.SetValue(sval, sName.m_lpstr); + } + + LONG Restore(_CSTRING_NS::CString& sval, ATL::_U_STRINGorID sName) + { + DWORD size = MAX_PATH; + LONG res = m_Key.QueryValue(sval.GetBuffer(size), sName.m_lpstr, &size); + sval.ReleaseBuffer(); + return res; + } +#else // !(_ATL_VER < 0x0800) + LONG Save(_CSTRING_NS::CString& sval, ATL::_U_STRINGorID sName) + { + return m_Key.SetStringValue(sName.m_lpstr, sval); + } + + LONG Restore(_CSTRING_NS::CString& sval, ATL::_U_STRINGorID sName) + { + DWORD size = MAX_PATH; + LONG res = m_Key.QueryStringValue(sName.m_lpstr, sval.GetBuffer(size), &size); + sval.ReleaseBuffer(); + return res; + } +#endif // !(_ATL_VER < 0x0800) +#else + #pragma message("Warning: CAppInfoBase compiles without CString support. Do not use CString in Save or Restore.") +#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) + +#if (_ATL_VER < 0x0800) + LONG Save(LPCTSTR sval, ATL::_U_STRINGorID sName) + { + return m_Key.SetValue(sval, sName.m_lpstr); + } + + LONG Restore(LPTSTR sval, ATL::_U_STRINGorID sName, DWORD *plength) + { + return m_Key.QueryValue(sval, sName.m_lpstr, plength); + } +#else // !(_ATL_VER < 0x0800) + LONG Save(LPCTSTR sval, ATL::_U_STRINGorID sName) + { + return m_Key.SetStringValue(sName.m_lpstr, sval); + } + + LONG Restore(LPTSTR sval, ATL::_U_STRINGorID sName, DWORD *plength) + { + return m_Key.QueryStringValue(sName.m_lpstr, sval, plength); + } +#endif // !(_ATL_VER < 0x0800) + + LONG Delete(ATL::_U_STRINGorID sName) + { + return m_Key.DeleteValue(sName.m_lpstr); + } +}; + + +/////////////////////////////////////////////////////////////////////////////// +// CAppInfoT - CAppInfoBase constructed from a class with T::GetAppKey() + +// Macro for declaring AppKey +#define DECLARE_APPKEY(uAppKey) \ + static LPCTSTR GetAppKey() \ + { \ + static LPCTSTR sAppKey = ATL::_U_STRINGorID(uAppKey).m_lpstr; \ + return sAppKey; \ + } + +template +class CAppInfoT : public CAppInfoBase +{ +public: + CAppInfoT() : CAppInfoBase(T::GetAppKey()){} +}; + + +/////////////////////////////////////////////////////////////////////////////// +// CAppWindowBase - Base class for PPC/SmartPhone "well-behaved" application window or dialog + +// Macros for declaring frame WNDCLASS and AppKey +#define DECLARE_APP_FRAME_CLASS(WndClassName, uCommonResourceID, uAppKey) \ + DECLARE_FRAME_WND_CLASS(WndClassName, uCommonResourceID) \ + DECLARE_APPKEY(uAppKey) + +#define DECLARE_APP_FRAME_CLASS_EX(WndClassName, uCommonResourceID, style, bkgnd, uAppKey) \ + DECLARE_FRAME_WND_CLASS_EX(WndClassName, uCommonResourceID, style, bkgnd) \ + DECLARE_APPKEY(uAppKey) + +template +class CAppWindowBase +{ +public: + typedef class CAppInfoT< T > CAppInfo; + +#ifndef WIN32_PLATFORM_WFSP + SHACTIVATEINFO m_sai; // NoOp on SmartPhones +#endif // WIN32_PLATFORM_WFSP + + bool m_bHibernate; + + CAppWindowBase< T >() : m_bHibernate(false) + { +#ifndef WIN32_PLATFORM_WFSP + SHACTIVATEINFO sai = { sizeof(SHACTIVATEINFO) }; + m_sai = sai; +#endif // WIN32_PLATFORM_WFSP + }; + + // Same as WTL 7.1 AppWizard generated ActivatePreviousInstance + SendMessage WM_COPYDATA + static HRESULT ActivatePreviousInstance(HINSTANCE hInstance, LPCTSTR lpstrCmdLine, bool bDialog) + { + // requires T does DECLARE_APP_FRAME_CLASS, DECLARE_APP_FRAME_CLASS_EX or DECLARE_APP_DLG_CLASS + CFrameWndClassInfo& classInfo = T::GetWndClassInfo(); + + ATLVERIFY(::LoadString(hInstance, classInfo.m_uCommonResourceID, classInfo.m_szAutoName, sizeof(classInfo.m_szAutoName)/sizeof(classInfo.m_szAutoName[0])) != 0); + + classInfo.m_wc.lpszClassName = classInfo.m_szAutoName; + + const TCHAR* pszClass = classInfo.m_wc.lpszClassName; + + if(NULL == pszClass || '\0' == *pszClass) + { + return E_FAIL; + } + + const DWORD dRetryInterval = 100; + const int iMaxRetries = 25; + + for(int i = 0; i < iMaxRetries; ++i) + { + HANDLE hMutex = CreateMutex(NULL, FALSE, pszClass); + + DWORD dw = GetLastError(); + + if(NULL == hMutex) + { + HRESULT hr; + + switch(dw) + { + case ERROR_INVALID_HANDLE: + // A non-mutext object with this name already exists. + hr = E_INVALIDARG; + break; + default: + // This should never happen... + hr = E_FAIL; + } + + return hr; + } + + // If the mutex already exists, then there should be another instance running + if(dw == ERROR_ALREADY_EXISTS) + { + CloseHandle(hMutex); + + HWND hwnd = NULL; + if (bDialog) + hwnd = FindWindow(NULL, pszClass); + else + hwnd = FindWindow(pszClass, NULL); + + if(hwnd == NULL) + { + Sleep(dRetryInterval); + continue; + } + else + { + // Transmit our params to previous instance + if (lpstrCmdLine && *lpstrCmdLine) + { + COPYDATASTRUCT cd = { NULL, sizeof(TCHAR) * (wcslen(lpstrCmdLine) + 1), (PVOID)lpstrCmdLine }; + ::SendMessage(hwnd, WM_COPYDATA, NULL, (LPARAM)&cd); + } + // Set the previous instance as the foreground window + if(0 != SetForegroundWindow(reinterpret_cast(reinterpret_cast(hwnd) | 0x1))) + return S_FALSE; + } + } + else + { + return S_OK; + } + } + return S_OK; + } + +// Operations overriden in derived class + bool AppHibernate(bool /*bHibernate*/) + { + return false; + } + + bool AppNewInstance(LPCTSTR /*lpstrCmdLine*/) + { + return false; + } + + void AppSave() + { + } + +#ifdef WIN32_PLATFORM_WFSP + void AppBackKey() + { + ::SHNavigateBack(); + } +#endif + +// Message map and handlers + BEGIN_MSG_MAP(CAppWindowBase) + MESSAGE_HANDLER(WM_ACTIVATE, OnActivate) +#ifdef WIN32_PLATFORM_WFSP + MESSAGE_HANDLER(WM_HOTKEY, OnHotKey) +#else + MESSAGE_HANDLER(WM_SETTINGCHANGE, OnSettingChange) +#endif // WIN32_PLATFORM_WFSP + MESSAGE_HANDLER(WM_HIBERNATE, OnHibernate) + MESSAGE_HANDLER(WM_COPYDATA, OnNewInstance) + MESSAGE_HANDLER(WM_CLOSE, OnClose) + END_MSG_MAP() + + LRESULT OnActivate(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled) + { + T* pT = static_cast(this); + if (m_bHibernate) + m_bHibernate = pT->AppHibernate(false); +#ifndef WIN32_PLATFORM_WFSP + ::SHHandleWMActivate(pT->m_hWnd, wParam, lParam, &m_sai, 0); +#else + wParam; + lParam; +#endif // WIN32_PLATFORM_WFSP + return bHandled = FALSE; + } + +#ifdef WIN32_PLATFORM_WFSP +// SmartPhone VK_TBACK key standard management + LRESULT OnHotKey(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) + { + T* pT = static_cast(this); + const UINT uModif = (UINT)LOWORD(lParam); + const UINT uVirtKey = (UINT)HIWORD(lParam); + if(uVirtKey == VK_TBACK) + if (AtlIsEditFocus()) + ::SHSendBackToFocusWindow(uMsg, wParam, lParam); + else if (uModif & MOD_KEYUP) + pT->AppBackKey(); + return 1; + } + +#else // !WIN32_PLATFORM_WFSP +// PPC SIP handling + LRESULT OnSettingChange(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled) + { + T* pT = static_cast(this); + bHandled = FALSE; + return ::SHHandleWMSettingChange(pT->m_hWnd, wParam, lParam, &m_sai); + } +#endif // !WIN32_PLATFORM_WFSP + + LRESULT OnHibernate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) + { + T* pT = static_cast(this); + return m_bHibernate = pT->AppHibernate(true); + } + + LRESULT OnNewInstance(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/) + { + T* pT = static_cast(this); + PCOPYDATASTRUCT pcds = (PCOPYDATASTRUCT)lParam; + return pT->AppNewInstance((LPCTSTR)pcds->lpData); + } + + LRESULT OnClose(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) + { + T* pT = static_cast(this); + pT->AppSave(); + bHandled = FALSE; + return 1; + } +}; + + +/////////////////////////////////////////////////////////////////////////////// +// CAppWindow - PPC/SmartPhone "well-behaved" application window class + +template +class CAppWindow : public CAppWindowBase< T > +{ +public: + // Same as WTL 7.1 AppWizard generated Run + lpstrCmdLine in CreateEx + static int AppRun(LPTSTR lpstrCmdLine = NULL, int nCmdShow = SW_SHOWNORMAL) + { + CMessageLoop theLoop; + _Module.AddMessageLoop(&theLoop); + + T wndMain; + + if(wndMain.CreateEx(NULL, NULL, 0, 0, lpstrCmdLine) == NULL) + { + ATLTRACE2(atlTraceUI, 0, _T("Main window creation failed!\n")); + return 0; + } + + wndMain.ShowWindow(nCmdShow); + + int nRet = theLoop.Run(); + + _Module.RemoveMessageLoop(); + return nRet; + } + + static HRESULT ActivatePreviousInstance(HINSTANCE hInstance, LPCTSTR lpstrCmdLine) + { + return CAppWindowBase< T >::ActivatePreviousInstance(hInstance, lpstrCmdLine, false); + } +}; + + +#ifndef _WTL_CE_NO_DIALOGS + +/////////////////////////////////////////////////////////////////////////////// +// CAppDialog - PPC/SmartPhone "well-behaved" dialog application class + +// Macro for declaring dialog WNDCLASS and AppKey +#define DECLARE_APP_DLG_CLASS(WndClassName, uCommonResourceID, uAppKey) \ + static WTL::CFrameWndClassInfo& GetWndClassInfo() \ + { \ + static WTL::CFrameWndClassInfo wc = \ + { \ + { 0, (WNDPROC)StartDialogProc, \ + 0, 0, NULL, NULL, NULL, (HBRUSH)(COLOR_WINDOW + 1), NULL, WndClassName }, \ + NULL, NULL, IDC_ARROW, TRUE, 0, _T(""), uCommonResourceID \ + }; \ + return wc; \ + }; \ + DECLARE_APPKEY(uAppKey) + +template +class CAppDialog : public CAppWindowBase< T > +{ +public: + static int AppRun(LPTSTR lpstrCmdLine = NULL, int nCmdShow = SW_SHOWNORMAL) + { + CMessageLoop theLoop; + _Module.AddMessageLoop(&theLoop); + + T dlgMain; + + if(dlgMain.Create(NULL, (LPARAM)lpstrCmdLine) == NULL) + { + ATLTRACE2(atlTraceUI, 0, _T("Main dialog creation failed!\n")); + return 0; + } + + dlgMain.ShowWindow(nCmdShow); + + int nRet = theLoop.Run(); + + _Module.RemoveMessageLoop(); + return nRet; + } + + static HRESULT ActivatePreviousInstance(HINSTANCE hInstance, LPCTSTR lpstrCmdLine) + { + return CAppWindowBase< T >::ActivatePreviousInstance(hInstance, lpstrCmdLine, true); + }; +}; + +// PPC/SmartPhone standard application dialogs + +#ifdef WIN32_PLATFORM_WFSP +#define WTL_APP_SHIDIF WTL_SP_SHIDIF +#else +#define WTL_APP_SHIDIF WTL_STD_SHIDIF +#endif + +/////////////////////////////////////////////////////////////////////////////// +// CAppStdDialogImplBase - Base implementation of standard application dialogs + +template +class ATL_NO_VTABLE CAppStdDialogImplBase : + public TImplBase, + public CAppDialog< T > +{ +public: + WTL_DLG_NOTITLE; + + void StdCloseDialog(int nVal) + { + T* pT = static_cast(this); + if (nVal != IDCANCEL) + pT->AppSave(); + if (t_bModal == false) + { + pT->DestroyWindow(); + ::PostQuitMessage(nVal); + } + else + ::EndDialog(pT->m_hWnd, nVal); + } + + BEGIN_MSG_MAP(CAppStdDialogImplBase) + MESSAGE_HANDLER(WM_CLOSE, OnSystemClose) + CHAIN_MSG_MAP(TImplBase) + CHAIN_MSG_MAP(CAppDialog< T >) + END_MSG_MAP() + + LRESULT OnSystemClose(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) + { + T* pT = static_cast(this); + pT->StdCloseDialog(IDCANCEL); + return 0; + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// CAppStdDialogImpl - Implementation of standard application dialog + +template +class ATL_NO_VTABLE CAppStdDialogImpl : + public CAppStdDialogImplBase, t_shidiFlags, t_bModal> +{}; + +/////////////////////////////////////////////////////////////////////////////// +// CAppStdDialogResizeImpl - implementation of orientation resizing standard application dialog + +template +class ATL_NO_VTABLE CAppStdDialogResizeImpl : + public CAppStdDialogImplBase, t_shidiFlags, t_bModal> +{}; + +#ifndef _ATL_NO_HOSTING +/////////////////////////////////////////////////////////////////////////////// +// CAppStdAxDialogImpl - Implementation of standard application AxDialog + +template +class ATL_NO_VTABLE CAppStdAxDialogImpl : + public CAppStdDialogImplBase, t_shidiFlags, t_bModal> +{}; + +/////////////////////////////////////////////////////////////////////////////// +// CAppStdAxDialogResizeImpl - implementation of orientation resizing standard application AxDialog + +template +class ATL_NO_VTABLE CAppStdAxDialogResizeImpl : + public CAppStdDialogImplBase, t_shidiFlags, t_bModal> +{}; +#endif // _ATL_NO_HOSTING + +#if defined(_WTL_CE_DRA) && defined(WIN32_PLATFORM_PSPC) +/////////////////////////////////////////////////////////////////////////////// +// CAppStdOrientedDialogImpl - implementation of oriented PPC standard application dialog + +template +class ATL_NO_VTABLE CAppStdOrientedDialogImpl : + public CAppStdDialogImplBase, t_shidiFlags, t_bModal> +{}; + +#ifndef _ATL_NO_HOSTING +/////////////////////////////////////////////////////////////////////////////// +// CAppStdAxOrientedDialogImpl - implementation of oriented PPC standard application AxDialog + +template +class ATL_NO_VTABLE CAppStdAxOrientedDialogImpl : + public CAppStdDialogImplBase, t_shidiFlags, t_bModal> +{}; +#endif // _ATL_NO_HOSTING + +#endif // defined(_WTL_CE_DRA) && defined(WIN32_PLATFORM_PSPC) + +#endif // _WTL_CE_NO_DIALOGS + +#endif // _WTL_CE_NO_APPWINDOW + + +// --- Full screen support --- + +#ifndef _WTL_CE_NO_FULLSCREEN + +/////////////////////////////////////////////////////////////////////////////// +// CFullScreenFrame - full screen frame implementation + +template +class CFullScreenFrame +{ +public: + bool m_bFullScreen; + + CFullScreenFrame() : m_bFullScreen(false) + { } + +// Operation + void SetFullScreen(bool bFull) + { + m_bFullScreen = bFull; + ShowTaskBar(!bFull, false); + ShowMenuBar(!bFull); + } + +// Manage TaskBar for modal dialogs and property sheets + template + int FSDoModal(D& dlg) + { + T* pT = static_cast(this); + pT; // avoid level 4 warning + ATLASSERT(pT->IsWindow()); + if (m_bFullScreen) // Show taskbar if hidden + ShowTaskBar(true, false); + int iRet = dlg.DoModal(); + if (m_bFullScreen) // Hide taskbar if restored + ShowTaskBar(false); + return iRet; + } + +// Implementation + void ShowMenuBar(bool bShow) + { + T* pT = static_cast(this); + ATLASSERT(pT->IsWindow()); + ATL::CWindow MenuBar = pT->m_hWndCECommandBar; + ATLASSERT(MenuBar.IsWindow()); + MenuBar.ShowWindow(bShow ? SW_SHOWNORMAL : SW_HIDE); + pT->SizeToMenuBar(); + } + + void ShowTaskBar(bool bShow, bool bRepaint = true) + { + T* pT = static_cast(this); + ATLASSERT(pT->IsWindow()); + RECT rect = { 0 }; + SystemParametersInfo(SPI_GETWORKAREA, NULL, &rect, FALSE); + if (!bShow) + rect.top = 0; + +#ifdef WIN32_PLATFORM_PSPC // Pocket PC code + UINT uShow = t_bHasSip ? SHFS_SHOWTASKBAR | SHFS_SHOWSIPBUTTON : SHFS_SHOWTASKBAR | SHFS_HIDESIPBUTTON; + SHFullScreen(pT->m_hWnd, bShow ? uShow : SHFS_HIDETASKBAR | SHFS_HIDESIPBUTTON); +#elif _WIN32_WCE > 0x500 // Smartphone 2005 code + SHFullScreen(pT->m_hWnd, bShow ? SHFS_SHOWTASKBAR : SHFS_HIDETASKBAR); +#else // Smartphone 2003 + HWND hTaskBar = FindWindow(_T("tray"), NULL); + ATLASSERT(::IsWindow(hTaskBar)); + ::ShowWindow(hTaskBar, bShow ? SW_SHOW : SW_HIDE); +#endif // WIN32_PLATFORM_PSPC + + pT->MoveWindow(&rect, bRepaint); + } + +// Message map and handler + BEGIN_MSG_MAP(CFullScreenFrame) + MESSAGE_HANDLER(WM_SETTINGCHANGE, OnSettingChange) + MESSAGE_HANDLER(WM_ACTIVATE, OnActivate) + END_MSG_MAP() + + LRESULT OnSettingChange(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) + { +#ifndef SETTINGCHANGE_RESET // not defined for PPC 2002 + #define SETTINGCHANGE_RESET SPI_SETWORKAREA +#endif + if (m_bFullScreen && (wParam & SETTINGCHANGE_RESET)) + SetFullScreen(m_bFullScreen); + return bHandled = FALSE; + } + + LRESULT OnActivate(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) + { + if (m_bFullScreen) + { + ShowTaskBar(!wParam); + ShowMenuBar(!wParam); + } + return bHandled = FALSE; + } +}; + +#endif // _WTL_CE_NO_FULLSCREEN + + +// --- WinCE zoom support --- + +#ifndef _WTL_CE_NO_ZOOMSCROLL + +/////////////////////////////////////////////////////////////////////////////// +// CZoomScrollImpl - WinCE zooming implementation on top of CScrollImpl + +template +class CZoomScrollImpl: public CScrollImpl< T > +{ +public: +// Data members + _WTYPES_NS::CSize m_sizeTrue; + double m_fzoom; + +// Creation + CZoomScrollImpl() : m_sizeTrue(0), m_fzoom(1.) + { } + +// Zoom operations and access + void SetZoomScrollSize(_WTYPES_NS::CSize sizeTrue, double fzoom = 1., BOOL bRedraw = TRUE) + { + ATLASSERT(fzoom > 0.); + m_sizeTrue = sizeTrue; + m_fzoom = fzoom; + + CScrollImpl< T >::SetScrollSize(sizeTrue / fzoom, bRedraw); + } + + void SetZoomScrollSize(int cx, int cy, double fzoom=1., BOOL bRedraw = TRUE) + { + SetZoomScrollSize(_WTYPES_NS::CSize(cx, cy), fzoom, bRedraw); + } + + void SetZoom(double fzoom, BOOL bRedraw = TRUE) + { + _WTYPES_NS::CPoint ptCenter = WndtoTrue(m_sizeClient / 2); + _WTYPES_NS::CSize sizePage = GetScrollPage(); + _WTYPES_NS::CSize sizeLine = GetScrollLine(); + + SetZoomScrollSize(GetScrollSize(), fzoom, bRedraw); + + SetScrollLine(sizeLine); + SetScrollPage(sizePage); + _WTYPES_NS::CPoint ptOffset = ptCenter - (m_sizeClient / 2) * fzoom; + SetScrollOffset(ptOffset, bRedraw); + } + + double GetZoom() + { + return m_fzoom; + } + +// CScrollImpl overrides + void SetScrollOffset(int x, int y, BOOL bRedraw = TRUE) + { + CScrollImpl< T >::SetScrollOffset((int)(x / m_fzoom), (int)(y / m_fzoom), bRedraw); + } + + void SetScrollOffset(POINT ptOffset, BOOL bRedraw = TRUE) + { + SetScrollOffset(ptOffset.x, ptOffset.y, bRedraw); + } + + void GetScrollOffset(POINT& ptOffset) + { + ptOffset.x = (LONG)(m_ptOffset.x * m_fzoom); + ptOffset.y = (LONG)(m_ptOffset.y * m_fzoom); + } + + void SetScrollSize(int cx, int cy, BOOL bRedraw = TRUE) + { + SetZoomScrollSize(cx, cy, GetZoom(), bRedraw); + } + + void SetScrollSize(SIZE sizeTrue, BOOL bRedraw = TRUE) + { + SetZoomScrollSize(sizeTrue, GetZoom(), bRedraw); + } + + void GetScrollSize(SIZE& sizeTrue) const + { + sizeTrue = m_sizeTrue; + } + + void SetScrollPage(int cxPage, int cyPage) + { + SetScrollPage(_WTYPES_NS::CSize(cxPage, cyPage)); + } + + void SetScrollPage(SIZE sizePage) + { + CScrollImpl< T >::SetScrollPage(sizePage / m_fzoom); + } + + void GetScrollPage(SIZE& sizePage) const + { + sizePage = m_sizePage * m_fzoom; + } + + void SetScrollLine(int cxLine, int cyLine) + { + SetScrollLine(_WTYPES_NS::CSize(cxLine, cyLine)); + } + + void SetScrollLine(SIZE sizeLine) + { + CScrollImpl< T >::SetScrollLine(sizeLine / m_fzoom); + } + + void GetScrollLine(SIZE& sizeLine) const + { + sizeLine = m_sizeLine * m_fzoom; + } + +// Data access complements + _WTYPES_NS::CSize GetScrollSize() + { + return m_sizeTrue; + } + + _WTYPES_NS::CSize GetScrollPage() + { + return m_sizePage * m_fzoom; + } + + _WTYPES_NS::CSize GetScrollLine() + { + return m_sizeLine * m_fzoom; + } + + _WTYPES_NS::CPoint GetScrollOffset() + { + return (_WTYPES_NS::CSize)m_ptOffset * m_fzoom; + } + +// Helper coordinate functions + _WTYPES_NS::CPoint WndtoTrue(CPoint ptW) + { + return (_WTYPES_NS::CSize)ptW * GetZoom() + GetScrollOffset(); + } + + void WndtoTrue(LPPOINT aptW, int nPts) // in place coord transformation + { + for (int i = 0 ; i < nPts ; i++) + aptW[i] = WndtoTrue(aptW[i]); + } + + void WndtoTrue(LPRECT prectW) // in place coord transformation + { + WndtoTrue((LPPOINT)prectW, 2); + } + + _WTYPES_NS::CPoint TruetoWnd(CPoint ptT) + { + return (ptT - GetScrollOffset()) / GetZoom(); + } + + void TruetoWnd(LPPOINT aptT, int nPts) // in place coord transformation + { + for (int i = 0 ; i < nPts ; i++) + aptT[i] = TruetoWnd(aptT[i]); + } + + void TruetoWnd(LPRECT prectT) // in place coord transformation + { + TruetoWnd((LPPOINT)prectT, 2); + } + +// Drawing operations : assume adequate setting of data members + BOOL Draw(HBITMAP hbm, HDC hdestDC, DWORD dwROP = SRCCOPY) + { + CDC memDC = CreateCompatibleDC(hdestDC); + CBitmapHandle bmpOld = memDC.SelectBitmap(hbm); + BOOL bRes = Draw(memDC, hdestDC, dwROP); + memDC.SelectBitmap(bmpOld); + return bRes; + } + + BOOL Draw(HDC hsourceDC, HDC hdestDC, DWORD dwROP = SRCCOPY) + { + CDCHandle destDC = hdestDC; + destDC.SetViewportOrg(0,0); + _WTYPES_NS::CPoint ptOffset = GetScrollOffset(); + _WTYPES_NS::CSize sizeZClient = m_sizeClient * GetZoom(); + return destDC.StretchBlt(0, 0, m_sizeClient.cx, m_sizeClient.cy, hsourceDC, ptOffset.x, ptOffset.y, sizeZClient.cx, sizeZClient.cy, dwROP); + } + +#ifdef _IMAGING_H + BOOL Draw(IImage* pIImage, HDC hdestDC) + { + CDCHandle destDC = hdestDC; + destDC.SetViewportOrg(0,0); + return SUCCEEDED(pIImage->Draw(destDC, _WTYPES_NS::CRect(-_WTYPES_NS::CPoint(m_ptOffset), m_sizeAll), NULL)); + } +#endif + +// Message map and handlers + BEGIN_MSG_MAP(CZoomScrollImpl< T >) + MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBkgnd) + CHAIN_MSG_MAP(CScrollImpl< T >) + END_MSG_MAP() + + LRESULT OnEraseBkgnd(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) + { + T* pT = static_cast(this); + ATLASSERT(::IsWindow(pT->m_hWnd)); + if ((GetScrollExtendedStyle() & SCRL_ERASEBACKGROUND)) + { + _WTYPES_NS::CRect rect; + pT->GetClientRect(rect); + _WTYPES_NS::CSize sizeClient=rect.Size(); + + if (m_sizeAll.cx < sizeClient.cx || m_sizeAll.cy < sizeClient.cy) + { + CDCHandle hdc = (HDC)wParam; + HBRUSH hbr = GetSysColorBrush((int)T::GetWndClassInfo().m_wc.hbrBackground - 1); + + if (m_sizeAll.cx < sizeClient.cx) + { + _WTYPES_NS::CRect rectBG(_WTYPES_NS::CPoint(m_sizeAll.cx, 0), sizeClient); + hdc.FillRect(rectBG, hbr); + } + + if (m_sizeAll.cy < sizeClient.cy) + { + _WTYPES_NS::CRect rectBG(_WTYPES_NS::CPoint(0, m_sizeAll.cy), sizeClient); + hdc.FillRect(rectBG, hbr); + } + } + } + else + { + bHandled = FALSE; + } + + return 1; + } +}; + +#endif // _WTL_CE_NO_ZOOMSCROLL + +#ifndef _WTL_CE_NO_CONTROLS + +// --- PPC bottom TabView control --- + +#if defined(__ATLCTRLX_H__) && defined(WIN32_PLATFORM_PSPC) + +/////////////////////////////////////////////////////////////////////////////// +// CBottomTabViewImpl + +template +class ATL_NO_VTABLE CBottomTabViewImpl : public CTabViewImpl +{ +public: + DECLARE_WND_CLASS_EX(NULL, 0, COLOR_APPWORKSPACE) + +// Implementation overrideables + bool CreateTabControl() + { + m_tab.Create(m_hWnd, rcDefault, NULL, WS_CHILD | TCS_BOTTOM, 0, m_nTabID); + + ATLASSERT(m_tab.m_hWnd != NULL); + if(m_tab.m_hWnd == NULL) + return false; + + m_tab.SendMessage(CCM_SETVERSION, COMCTL32_VERSION); + m_tab.SetItemExtra(sizeof(TABVIEWPAGE)); + + T* pT = static_cast(this); + m_cyTabHeight = pT->CalcTabHeight(); + + return true; + } + + int CalcTabHeight() + { + int nCount = m_tab.GetItemCount(); + TCITEMEXTRA tcix = { 0 }; + tcix.tciheader.mask = TCIF_TEXT; + tcix.tciheader.pszText = _T("NS"); + int nIndex = m_tab.InsertItem(nCount, tcix); + + RECT rect = { 0 }; + SystemParametersInfo(SPI_GETWORKAREA, 0, &rect, 0); + RECT rcWnd = rect; + + m_tab.AdjustRect(FALSE, &rect); + rcWnd.top = rect.bottom; + ::AdjustWindowRectEx(&rcWnd, m_tab.GetStyle(), FALSE, m_tab.GetExStyle()); + m_tab.DeleteItem(nIndex); + + return rcWnd.bottom - rcWnd.top; + } + + void UpdateLayout() + { + RECT rect; + GetClientRect(&rect); + + if(m_tab.IsWindow() && ((m_tab.GetStyle() & WS_VISIBLE) != 0)) + m_tab.SetWindowPos(NULL, 0, rect.bottom - m_cyTabHeight, rect.right - rect.left, m_cyTabHeight, SWP_NOZORDER /*| SWP_SHOWWINDOW*/); + + if(m_nActivePage != -1) + ::SetWindowPos(GetPageHWND(m_nActivePage), NULL, 0, 0, rect.right - rect.left, rect.bottom - m_cyTabHeight, SWP_NOZORDER); + } + +}; + +class CBottomTabView : public CBottomTabViewImpl +{ +public: + DECLARE_WND_CLASS_EX(_T("WTL_BottomTabView"), 0, COLOR_APPWORKSPACE) +}; + +#endif // defined(__ATLCTRLX_H__) && defined(WIN32_PLATFORM_PSPC) + + +// --- PPC/SmartPhone controls --- + +//////////////////////////////////////////////////////////////////////////////// +// These are wrapper classes for the Pocket PC 2002/2003 and SmartPhone 2003 controls +// To implement a window based on a control, use following: +// Example: Implementing a window based on a Html control +// +// class CMyHtml : CWindowImpl +// { +// public: +// BEGIN_MSG_MAP(CMyHtml) +// // put your message handler entries here +// END_MSG_MAP() +// }; +/////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////// +// CHtmlCtrl + +template +class CHtmlCtrlT : public TBase +{ +public: +// Constructors + CHtmlCtrlT(HWND hWnd = NULL) : TBase(hWnd) + { } + + CHtmlCtrlT< TBase >& operator =(HWND hWnd) + { + m_hWnd = hWnd; + return *this; + } + + HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, + DWORD dwStyle = 0, DWORD dwExStyle = 0, + ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) + { + HWND hWnd = TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); + ATLASSERT(hWnd != NULL); // Did you remember to call InitHTMLControl(hInstance) ?? + return hWnd; + } + +// Attributes + static LPCTSTR GetWndClassName() + { + return WC_HTML; + } + +#if (_WIN32_WCE >= 400) + void AddStyle(LPCWSTR pszStyle) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, DTM_ADDSTYLE, 0, (LPARAM)pszStyle); + } +#endif // (_WIN32_WCE >= 400) + + void AddText(BOOL bPlainText, LPCSTR pszText) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, DTM_ADDTEXT, (WPARAM)bPlainText, (LPARAM)pszText); + } + + void AddHTML(LPCSTR pszHTML) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, DTM_ADDTEXT, (WPARAM)FALSE, (LPARAM)pszHTML); + } + + void AddText(BOOL bPlainText, LPCWSTR pszText) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, DTM_ADDTEXTW, (WPARAM)bPlainText, (LPARAM)pszText); + } + + void AddHTML(LPCWSTR pszHTML) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, DTM_ADDTEXTW, (WPARAM)FALSE, (LPARAM)pszHTML); + } + + void Anchor(LPCSTR pszAnchor) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, DTM_ANCHOR, 0, (LPARAM)pszAnchor); + } + + void Anchor(LPCWSTR pszAnchor) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, DTM_ANCHORW, 0, (LPARAM)pszAnchor); + } + +#if (_WIN32_WCE >= 420) + void GetBrowserDispatch(IDispatch** ppDispatch) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(ppDispatch); + ATLASSERT(*ppDispatch==NULL); + ::SendMessage(m_hWnd, DTM_BROWSERDISPATCH, 0, (LPARAM)ppDispatch); + } + void GetDocumentDispatch(IDispatch** ppDispatch) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(ppDispatch); + ATLASSERT(*ppDispatch==NULL); + ::SendMessage(m_hWnd, DTM_DOCUMENTDISPATCH , 0, (LPARAM)ppDispatch); + } +#endif // (_WIN32_WCE >= 420) + + void Clear() + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, DTM_CLEAR, 0, 0L); + } + + void EnableClearType(BOOL bEnable = TRUE) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, DTM_ENABLECLEARTYPE, 0, (LPARAM)bEnable); + } + + void EnableContextMenu(BOOL bEnable = TRUE) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, DTM_ENABLECONTEXTMENU, 0, (LPARAM)bEnable); + } + + void EnableScripting(BOOL bEnable = TRUE) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, DTM_ENABLESCRIPTING, 0, (LPARAM)bEnable); + } + + void EnableShrink(BOOL bEnable = TRUE) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, DTM_ENABLESHRINK, 0, (LPARAM)bEnable); + } + + void EndOfSource() + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, DTM_ENDOFSOURCE, 0, 0L); + } + + void ImageFail(DWORD dwCookie) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, DTM_IMAGEFAIL, 0, (LPARAM)dwCookie); + } + + int GetLayoutHeight() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, DTM_LAYOUTHEIGHT, 0, 0L); + } + + int GetLayoutWidth() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, DTM_LAYOUTWIDTH, 0, 0L); + } + + void Navigate(LPCTSTR pstrURL, UINT uFlags = 0) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(pstrURL); + ::SendMessage(m_hWnd, DTM_NAVIGATE, (WPARAM)uFlags, (LPARAM)pstrURL); + } + + void SelectAll() + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, DTM_SELECTALL, 0, 0L); + } + + void SetImage(INLINEIMAGEINFO* pImageInfo) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(pImageInfo); + ::SendMessage(m_hWnd, DTM_SETIMAGE, 0, (LPARAM)pImageInfo); + } + + void ZoomLevel(int iLevel) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, DTM_ZOOMLEVEL, 0, (LPARAM)iLevel); + } + +#if (_WIN32_WCE >= 400) + void Stop() + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, DTM_STOP, 0, 0L); + } +#endif // (_WIN32_WCE >= 400) + + void GetScriptDispatch(IDispatch** ppDispatch) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(ppDispatch); + ATLASSERT(*ppDispatch==NULL); + ::SendMessage(m_hWnd, DTM_SCRIPTDISPATCH, 0, (LPARAM)ppDispatch); + } +}; + +typedef CHtmlCtrlT CHtmlCtrl; + + +#ifdef WIN32_PLATFORM_PSPC + +/////////////////////////////////////////////////////////////////////////////// +// CRichInkCtrl + +template +class CRichInkCtrlT : public TBase +{ +public: +// Constructors + CRichInkCtrlT(HWND hWnd = NULL) : TBase(hWnd) + { } + + CRichInkCtrlT< TBase >& operator =(HWND hWnd) + { + m_hWnd = hWnd; + return *this; + } + + HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, + DWORD dwStyle = 0, DWORD dwExStyle = 0, + ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) + { + HWND hWnd = TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); + ATLASSERT(hWnd != NULL); // Did you remember to call InitRichInkDLL() ?? + return hWnd; + } + +// Attributes + static LPCTSTR GetWndClassName() + { + return WC_RICHINK; + } + + BOOL CanPaste(UINT uFormat = 0) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, EM_CANPASTE, (WPARAM)uFormat, 0L); + } + + BOOL CanRedo() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, EM_CANREDO, 0, 0L); + } + + BOOL CanUndo() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, EM_CANUNDO, 0, 0L); + } + + void ClearAll(BOOL bRepaint = TRUE) const + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, EM_CLEARALL, (WPARAM)bRepaint, 0L); + } + + BOOL GetModify() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, EM_GETMODIFY, 0, 0L); + } + + UINT GetPageStyle() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (UINT)::SendMessage(m_hWnd, EM_GETPAGESTYLE, 0, 0L); + } + + UINT GetPenMode() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (UINT)::SendMessage(m_hWnd, EM_GETPENMODE, 0, 0L); + } + + UINT GetViewStyle() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (UINT)::SendMessage(m_hWnd, EM_GETVIEW, 0, 0L); + } + + UINT GetWrapMode() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (UINT)::SendMessage(m_hWnd, EM_GETWRAPMODE, 0, 0L); + } + + UINT GetZoomPercent() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (UINT)::SendMessage(m_hWnd, EM_GETZOOMPERCENT, 0, 0L); + } + + void InsertLinks(LPWSTR lpString, int cchLength = -1) + { + ATLASSERT(::IsWindow(m_hWnd)); + if(cchLength == -1) + cchLength = lstrlen(lpString); + ::SendMessage(m_hWnd, EM_INSERTLINKS, (WPARAM)cchLength, (LPARAM)lpString); + } + + void RedoEvent() + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, EM_REDOEVENT, 0, 0L); + } + + UINT SetInkLayer(UINT uLayer) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (UINT)::SendMessage(m_hWnd, EM_SETINKLAYER, (WPARAM)uLayer, 0L); + } + + void SetPageStyle(UINT uStyle) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, EM_SETPAGESTYLE, (WPARAM)uStyle, 0L); + } + + void SetPenMode(UINT uMode) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, EM_SETPENMODE, (WPARAM)uMode, 0L); + } + + void SetViewStyle(UINT uStyle) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, EM_SETVIEW, (WPARAM)uStyle, 0L); + } + + void SetViewAttributes(VIEWATTRIBUTES* pAttribs) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(pAttribs); + ::SendMessage(m_hWnd, EM_SETVIEWATTRIBUTES, 0, (LPARAM)pAttribs); + } + + void SetWrapMode(UINT uMode) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, EM_SETWRAPMODE, (WPARAM)uMode, 0L); + } + + void SetZoomPercent(UINT uPercent) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, EM_SETZOOMPERCENT, (WPARAM)uPercent, 0L); + } + + LONG StreamIn(UINT uFormat, EDITSTREAM& es) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (LONG)::SendMessage(m_hWnd, EM_STREAMIN, (WPARAM)uFormat, (LPARAM)&es); + } + + LONG StreamOut(UINT uFormat, EDITSTREAM& es) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (LONG)::SendMessage(m_hWnd, EM_STREAMOUT, (WPARAM)uFormat, (LPARAM)&es); + } + + void UndoEvent() + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, EM_UNDOEVENT, 0, 0L); + } + +// Standard EM_xxx messages + DWORD GetSel() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (DWORD)::SendMessage(m_hWnd, EM_GETSEL, 0, 0L); + } + + void GetSel(int& nStartChar, int& nEndChar) const + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, EM_GETSEL, (WPARAM)&nStartChar, (LPARAM)&nEndChar); + } + + void ReplaceSel(LPCTSTR lpszNewText, BOOL bCanUndo = FALSE) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, EM_REPLACESEL, (WPARAM)bCanUndo, (LPARAM)lpszNewText); + } + + void SetModify(BOOL bModified = TRUE) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, EM_SETMODIFY, (WPARAM)bModified, 0L); + } + + int GetTextLength() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, WM_GETTEXTLENGTH, 0, 0L); + } + +// Clipboard operations + void Clear() + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, WM_CLEAR, 0, 0L); + } + + void Copy() + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, WM_COPY, 0, 0L); + } + + void Cut() + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, WM_CUT, 0, 0L); + } + + void Paste() + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, WM_PASTE, 0, 0L); + } +}; + +typedef CRichInkCtrlT CRichInkCtrl; + + +/////////////////////////////////////////////////////////////////////////////// +// CInkXCtrl + +template +class CInkXCtrlT : public TBase +{ +public: +// Constructors + CInkXCtrlT(HWND hWnd = NULL) : TBase(hWnd) + { } + + CInkXCtrlT< TBase >& operator =(HWND hWnd) + { + m_hWnd = hWnd; + return *this; + } + + HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, + DWORD dwStyle = 0, DWORD dwExStyle = 0, + ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) + { + HWND hWnd = TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); + ATLASSERT(hWnd != NULL); // Did you remember to call InitInkX() ?? + return hWnd; + } + +// Attributes + static LPCTSTR GetWndClassName() + { + return WC_INKX; + } + + static UINT GetHotRecordingMessage() + { + return ::RegisterWindowMessage(szHotRecording); + } + + void ClearAll() + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, IM_CLEARALL, 0, 0L); + } + + int GetData(BYTE* lpBuffer, INT cbBuffer) const + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(lpBuffer); + return (int)::SendMessage(m_hWnd, IM_GETDATA, (WPARAM)cbBuffer, (LPARAM)lpBuffer); + } + + int GetDataLen() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, IM_GETDATALEN, 0, 0L); + } + + CRichInkCtrl GetRichInk() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (HWND)::SendMessage(m_hWnd, IM_GETRICHINK, 0, 0L); + } + + BOOL IsRecording() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, IM_RECORDING, 0, 0L); + } + + void ReInit() + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, IM_REINIT, 0, 0L); + } + + void SetData(const BYTE* lpInkData, INT cbInkData) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(lpInkData); + ::SendMessage(m_hWnd, IM_SETDATA, (WPARAM)cbInkData, (LPARAM)lpInkData); + } + + void VoicePlay() + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, IM_VOICE_PLAY, 0, 0L); + } + + BOOL IsVoicePlaying() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, IM_VOICE_PLAYING, 0, 0L); + } + + BOOL VoiceRecord() + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, IM_VOICE_RECORD, 0, 0L); + } + + void VoiceStop() + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, IM_VOICE_STOP, 0, 0L); + } + + void ShowVoiceBar(BOOL bShow = TRUE) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, IM_VOICEBAR, (WPARAM)bShow, 0L); + } +}; + +typedef CInkXCtrlT CInkXCtrl; + +#endif // WIN32_PLATFORM_PSPC + + +/////////////////////////////////////////////////////////////////////////////// +// CVoiceRecorderCtrl + +template +class CVoiceRecorderCtrlT : public TBase +{ +public: +// Constructors + CVoiceRecorderCtrlT(HWND hWnd = NULL) : TBase(hWnd) + { } + + CVoiceRecorderCtrlT< TBase >& operator =(HWND hWnd) + { + m_hWnd = hWnd; + return *this; + } + + HWND Create(HWND hWndParent, const POINT pt, LPTSTR pstrFileName, UINT nID, DWORD dwStyle = 0) + { + ATLASSERT(pstrFileName != NULL); + CM_VOICE_RECORDER cmvr = { 0 }; + cmvr.cb = sizeof(CM_VOICE_RECORDER); + cmvr.dwStyle = dwStyle; + cmvr.xPos = pt.x; + cmvr.yPos = pt.y; + cmvr.hwndParent = hWndParent; + cmvr.id = nID; + cmvr.lpszRecordFileName = pstrFileName; + m_hWnd = VoiceRecorder_Create(&cmvr); + return m_hWnd; + } + + HWND Create(LPCM_VOICE_RECORDER pAttribs) + { + ATLASSERT(pAttribs); + m_hWnd = VoiceRecorder_Create(pAttribs); + return m_hWnd; + } + +// Attributes + void Record() + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, VRM_RECORD, 0, 0L); + } + + void Play() + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, VRM_PLAY, 0, 0L); + } + + void Stop() + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, VRM_STOP, 0, 0L); + } + + void Cancel() + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, VRM_CANCEL, 0, 0L); + } + + void Done() + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, VRM_OK, 0, 0L); + } +}; + +typedef CVoiceRecorderCtrlT CVoiceRecorderCtrl; + + +#ifdef WIN32_PLATFORM_PSPC + +/////////////////////////////////////////////////////////////////////////////// +// CDocListCtrl + +template +class CDocListCtrlT : public TBase +{ +public: +// Attributes + DOCLISTCREATE m_dlc; + TCHAR m_szPath[MAX_PATH]; + +// Constructors + CDocListCtrlT(HWND hWnd = NULL) : TBase(hWnd) + { } + + CDocListCtrlT< TBase >& operator =(HWND hWnd) + { + m_hWnd = hWnd; + return *this; + } + + HWND Create(HWND hWndParent, WORD wId, LPCTSTR pszFolder = NULL, LPCTSTR pstrFilter = NULL, + WORD wFilterIndex = 0, DWORD dwFlags = DLF_SHOWEXTENSION) + { + ATLASSERT(pstrFilter != NULL); // It seems to need a filter badly!! + ::ZeroMemory(&m_dlc, sizeof(DOCLISTCREATE)); + ::ZeroMemory(m_szPath, sizeof(m_szPath)); + if(pszFolder != NULL) + ::lstrcpyn(m_szPath, pszFolder, MAX_PATH - 1); + m_dlc.dwStructSize = sizeof(DOCLISTCREATE); + m_dlc.hwndParent = hWndParent; + m_dlc.pszFolder = m_szPath; + m_dlc.pstrFilter = pstrFilter; + m_dlc.wFilterIndex = wFilterIndex; + m_dlc.wId = wId; + m_dlc.dwFlags = dwFlags; + m_hWnd = DocList_Create(&m_dlc); + return m_hWnd; + } + + HWND Create(DOCLISTCREATE* pDlc) + { + m_dlc = *pDlc; + m_hWnd = DocList_Create(&m_dlc); + return m_hWnd; + } + +// Attributes + void DeleteSel() + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, DLM_DELETESEL, 0, 0L); + } + + void DisableUpdates() + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, DLM_DISABLEUPDATES, 0, 0L); + } + + void EnableUpdates() + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, DLM_ENABLEUPDATES, 0, 0L); + } + + int GetFilterIndex() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, DLM_GETFILTERINDEX, 0, 0L); + } + + int GetItemCount() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, DLM_GETITEMCOUNT, 0, 0L); + } + + int GetNextItem(int iIndex, DWORD dwRelation = LVNI_ALL) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, DLM_GETNEXTITEM, (WPARAM)iIndex, (LPARAM)dwRelation); + } + + int GetFirstItem(DWORD dwRelation = LVNI_ALL) const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, DLM_GETNEXTITEM, (WPARAM)-1, (LPARAM)dwRelation); + } + + BOOL GetNextWave(int* pIndex) const + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(pIndex); + return (BOOL)::SendMessage(m_hWnd, DLM_GETNEXTWAVE, 0, (LPARAM)pIndex); + } + + BOOL GetPrevWave(int* pIndex) const + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(pIndex); + return (BOOL)::SendMessage(m_hWnd, DLM_GETPREVWAVE, 0, (LPARAM)pIndex); + } + + int GetSelCount() const + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, DLM_GETSELCOUNT, 0, 0L); + } + + BOOL GetSelPathName(LPTSTR pstrPath, int cchMax) const + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(pstrPath); + return (BOOL)::SendMessage(m_hWnd, DLM_GETSELPATHNAME, (WPARAM)cchMax, (LPARAM)pstrPath); + } + + void ReceiveIR(LPCTSTR pstrPath) const + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(pstrPath); + ::SendMessage(m_hWnd, DLM_RECEIVEIR, 0, (LPARAM)pstrPath); + } + + void Refresh() + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, DLM_REFRESH, 0, 0L); + } + + BOOL RenameMoveSelectedItems() + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, DLM_RENAMEMOVE, 0, 0L); + } + + int SelectAll() + { + ATLASSERT(::IsWindow(m_hWnd)); + return (int)::SendMessage(m_hWnd, DLM_SELECTALL, 0, 0L); + } + + HRESULT SelectItem(LPCTSTR pstrPath, BOOL bVisible = TRUE) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(pstrPath); + return (HRESULT)::SendMessage(m_hWnd, DLM_SELECTITEM, (WPARAM)bVisible, (LPARAM)pstrPath); + } + + void SendEMail(LPCTSTR pstrAttachment) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, DLM_SENDEMAIL, 0, (LPARAM)pstrAttachment); + } + + void SendIR(LPCTSTR pstrPath) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, DLM_SENDIR, 0, (LPARAM)pstrPath); + } + + HRESULT SetFilterIndex(int iIndex) + { + ATLASSERT(::IsWindow(m_hWnd)); + return (HRESULT)::SendMessage(m_hWnd, DLM_SETFILTERINDEX, (WPARAM)iIndex, 0L); + } + + void SetFolder(LPCTSTR pstrPath) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(pstrPath); + ::SendMessage(m_hWnd, DLM_SETFOLDER, 0, (LPARAM)pstrPath); + } + + BOOL SetItemState(int iIndex, const LVITEM* pItem) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(pItem); + return (BOOL)::SendMessage(m_hWnd, DLM_SETITEMSTATE, (WPARAM)iIndex, (LPARAM)pItem); + } + + BOOL SetItemState(int iIndex, UINT uState, UINT uMask) + { + ATLASSERT(::IsWindow(m_hWnd)); + LV_ITEM lvi = { 0 }; + lvi.stateMask = uMask; + lvi.state = uState; + return (BOOL)::SendMessage(m_hWnd, DLM_SETITEMSTATE, (WPARAM)iIndex, (LPARAM)&lvi); + } + + void SetOneItem(int iIndex, LPCVOID pPA) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, DLM_SETONEITEM, (WPARAM)iIndex, (LPARAM)pPA); + } + + void SetSelect(int iIndex) + { + ATLASSERT(::IsWindow(m_hWnd)); + ::SendMessage(m_hWnd, DLM_SETSELECT, (WPARAM)iIndex, 0L); + } + + void SetSelPathName(LPCTSTR pstrPath) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(pstrPath); + ::SendMessage(m_hWnd, DLM_SETSELPATHNAME, 0, (LPARAM)pstrPath); + } + + BOOL SetSortOrder() + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, DLM_SETSORTORDER, 0, 0L); + } + + HRESULT Update() + { + ATLASSERT(::IsWindow(m_hWnd)); + return (HRESULT)::SendMessage(m_hWnd, DLM_UPDATE, 0, 0L); + } + + BOOL ValidateFolder() + { + ATLASSERT(::IsWindow(m_hWnd)); + return (BOOL)::SendMessage(m_hWnd, DLM_VALIDATEFOLDER, 0, 0L); + } + +// Functions + BOOL GetFirstSelectedWaveFile(int* pIndex, LPTSTR szPath, const size_t cchPath) + { + ATLASSERT(::IsWindow(m_hWnd)); + return DocList_GetFirstSelectedWaveFile(m_hWnd, pIndex, szPath, cchPath); + } + + BOOL GetNextSelectedWaveFile(int* pIndex, LPTSTR szPath, const size_t cchPath) + { + ATLASSERT(::IsWindow(m_hWnd)); + return DocList_GetNextSelectedWaveFile(m_hWnd, pIndex, szPath, cchPath); + } +}; + +typedef CDocListCtrlT CDocListCtrl; + +#endif // WIN32_PLATFORM_PSPC + + +/////////////////////////////////////////////////////////////////////////////// +// CCapEdit + +template +class CCapEditT : public TBase +{ +public: +// Constructors + CCapEditT(HWND hWnd = NULL) : TBase(hWnd) + { } + + CCapEditT< TBase >& operator =(HWND hWnd) + { + m_hWnd = hWnd; + return *this; + } + + HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, + DWORD dwStyle = 0, DWORD dwExStyle = 0, + ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) + { + HWND hWnd = /*TBase*/CWindow::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); + ATLASSERT(hWnd != NULL); // Did you remember to call SHInitExtraControls() ?? + return hWnd; + } + +// Attributes + static LPCTSTR GetWndClassName() + { + return WC_CAPEDIT; + } +}; + +typedef CCapEditT CCapEdit; + +/////////////////////////////////////////////////////////////////////////////// +// CTTStatic + +#ifndef WIN32_PLATFORM_WFSP // Tooltips not supported on SmartPhone + +template +class CTTStaticT : public TBase +{ +public: +// Constructors + CTTStaticT(HWND hWnd = NULL) : TBase(hWnd) + { } + + CTTStaticT< TBase >& operator =(HWND hWnd) + { + m_hWnd = hWnd; + return *this; + } + + HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, + DWORD dwStyle = 0, DWORD dwExStyle = 0, + ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) + { + HWND hWnd = TBase::Create(hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); + ATLASSERT(hWnd != NULL); // Did you remember to call SHInitExtraControls() ?? + return hWnd; + } + +// Attributes + static LPCTSTR GetWndClassName() + { + return WC_TSTATIC; + } + +// Operations + BOOL SetToolTipText(LPCTSTR pstrTipText) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(pstrTipText); + ATLASSERT(lstrlen(pstrTipText)<= 253); + CTempBuffer buff; + LPTSTR pstr = buff.Allocate(lstrlen(pstrTipText) + 3); + if(pstr == NULL) + return FALSE; + ::lstrcpy(pstr, _T("~~")); + ::lstrcat(pstr, pstrTipText); + return SetWindowText(pstr); + } +}; + +typedef CTTStaticT CTTStatic; + + +/////////////////////////////////////////////////////////////////////////////// +// CTTButton + +template +class CTTButtonT : public TBase +{ +public: +// Constructors + CTTButtonT(HWND hWnd = NULL) : TBase(hWnd) + { } + + CTTButtonT< TBase >& operator =(HWND hWnd) + { + m_hWnd = hWnd; + return *this; + } + + HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, + DWORD dwStyle = 0, DWORD dwExStyle = 0, + ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) + { + HWND hWnd = TBase::Create(hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); + ATLASSERT(hWnd != NULL); // Did you remember to call SHInitExtraControls() ?? + return hWnd; + } + +// Attributes + static LPCTSTR GetWndClassName() + { + return WC_TBUTTON; + } + +// Operations + BOOL SetToolTipText(LPCTSTR pstrTipText) + { + ATLASSERT(::IsWindow(m_hWnd)); + ATLASSERT(pstrTipText); + ATLASSERT(lstrlen(pstrTipText)<= 253); + CTempBuffer buff; + LPTSTR pstr = buff.Allocate(lstrlen(pstrTipText) + 3); + if(pstr == NULL) + return FALSE; + ::lstrcpy(pstr, _T("~~")); + ::lstrcat(pstr, pstrTipText); + return SetWindowText(pstr); + } +}; + +typedef CTTButtonT CTTButton; + +#endif // !WIN32_PLATFORM_WFSP + + +// --- SmartPhone specific controls --- + +#ifdef WIN32_PLATFORM_WFSP + +/////////////////////////////////////////////////////////////////////////////// +// CSpinCtrlT - CSpinCtrl : SmartPhone adapted UpDown control + +template +class CSpinCtrlT : public CUpDownCtrlT< TBase > +{ +public: +// Constructors + CSpinCtrlT(HWND hWnd = NULL) : CUpDownCtrlT< TBase >(hWnd) + { } + + CSpinCtrlT< TBase >& operator =(HWND hWnd) + { + m_hWnd = hWnd; + return *this; + } + + HWND Create(HWND hWndParent, HWND hBuddy, DWORD dwStyle, int nID, LPCTSTR szExpandedName = NULL) + { + ATLASSERT(::IsWindow(hWndParent)); + CUpDownCtrlT< TBase >::Create(hWndParent, NULL, szExpandedName, dwStyle, 0, nID, NULL); + ATLASSERT(m_hWnd != NULL); // Did you remember to call AtlInitCommonControls(ICC_UPDOWN_CLASS)? + if (hBuddy != NULL) + { + ATLASSERT(::IsWindow(hBuddy)); + SetBuddy(hBuddy); + } + return m_hWnd; + } +}; + +typedef CSpinCtrlT CSpinCtrl; + + +/////////////////////////////////////////////////////////////////////////////// +// CSpinned - SmartPhone association of control and Spin + +template +class CSpinned : public TBase +{ +public: + CSpinCtrl m_SpinCtrl; + DWORD m_dwSpinnedStyle; + +// Constructors + CSpinned(HWND hWnd = NULL) : TBase(hWnd) + { + m_dwSpinnedStyle = WS_VISIBLE | UDS_ALIGNRIGHT | UDS_EXPANDABLE; + + if (t_bExpandOnly == true) + m_dwSpinnedStyle |= UDS_NOSCROLL; + else + m_dwSpinnedStyle |= UDS_HORZ | UDS_ARROWKEYS | UDS_SETBUDDYINT | UDS_WRAP; + + if (hWnd != NULL) + AttachOrCreateSpinCtrl(); + } + + CSpinned& operator =(HWND hWnd) + { + Attach(hWnd); + return *this; + } + + void Attach(HWND hWnd) + { + ATLASSERT(!IsWindow()); + TBase* pT = static_cast(this); + pT->m_hWnd = hWnd; + if (hWnd != NULL) + AttachOrCreateSpinCtrl(); + } + + HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szExpandedName = NULL, + DWORD dwStyle = 0, DWORD dwExStyle = 0, + ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) + { + + TBase* pT = static_cast(this); + TBase::Create(hWndParent, rect, NULL, dwStyle, dwExStyle, MenuOrID, lpCreateParam); + ATLASSERT(pT->m_hWnd != NULL); + + m_SpinCtrl.Create(hWndParent, pT->m_hWnd, m_dwSpinnedStyle, ATL_IDW_SPIN_ID + (int)MenuOrID.m_hMenu, szExpandedName); + + ATLASSERT(m_SpinCtrl.m_hWnd != NULL); // Did you remember to call AtlInitCommonControls(ICC_UPDOWN_CLASS)? + + return pT->m_hWnd; + } + +// Attributes + CSpinCtrl& GetSpinCtrl() + { + return m_SpinCtrl; + } + +// Implementation + // Attach our existing SpinCtrl or create one + bool AttachOrCreateSpinCtrl() + { + TBase* pT = static_cast(this); + + HWND hSpin = ::GetDlgItem(pT->GetParent(), ATL_IDW_SPIN_ID + pT->GetDlgCtrlID()); + + if (hSpin != NULL) + { + m_SpinCtrl.Attach(hSpin); +#ifdef DEBUG + TCHAR sClassName[16]; + ::GetClassName(hSpin, sClassName, 16); + ATLASSERT(!_tcscmp(sClassName, UPDOWN_CLASS)); + ATLASSERT(m_SpinCtrl.GetBuddy().m_hWnd == pT->m_hWnd); +#endif // DEBUG + } + else + { + m_SpinCtrl.Create(pT->GetParent(), pT->m_hWnd, m_dwSpinnedStyle, ATL_IDW_SPIN_ID + pT->GetDlgCtrlID()); + } + + return m_SpinCtrl.m_hWnd != NULL; + } +}; + + +/////////////////////////////////////////////////////////////////////////////// +// CSpinListBox - SmartPhone spinned ListBox control +// CExpandListBox - SmartPhone expandable ListBox control +// CExpandEdit - SmartPhone expandable Edit control +// CExpandCapEdit - SmartPhone expandable CapEdit control + +typedef CSpinned CSpinListBox; +typedef CSpinned CExpandListBox; +typedef CSpinned CExpandEdit; +typedef CSpinned CExpandCapEdit; + +#endif // WIN32_PLATFORM_WFSP + +#endif // _WTL_CE_NO_CONTROLS + +}; // namespace WTL + +#endif // __ATLWINCE_H__ diff --git a/Externals/WTL80/atlwinx.h b/Externals/WTL80/atlwinx.h new file mode 100644 index 0000000000..9767fa1039 --- /dev/null +++ b/Externals/WTL80/atlwinx.h @@ -0,0 +1,529 @@ +// Windows Template Library - WTL version 8.0 +// Copyright (C) Microsoft Corporation. All rights reserved. +// +// This file is a part of the Windows Template Library. +// The use and distribution terms for this software are covered by the +// Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php) +// which can be found in the file CPL.TXT at the root of this distribution. +// By using this software in any fashion, you are agreeing to be bound by +// the terms of this license. You must not remove this notice, or +// any other, from this software. + +#ifndef __ATLWINX_H__ +#define __ATLWINX_H__ + +#pragma once + +#ifndef __cplusplus + #error ATL requires C++ compilation (use a .cpp suffix) +#endif + +#ifndef __ATLAPP_H__ + #error atlwinx.h requires atlapp.h to be included first +#endif + +#if (_ATL_VER >= 0x0700) + #include +#endif // (_ATL_VER >= 0x0700) + + +/////////////////////////////////////////////////////////////////////////////// +// Classes in this file: +// +// _U_RECT +// _U_MENUorID +// _U_STRINGorID + + +/////////////////////////////////////////////////////////////////////////////// +// Command Chaining Macros + +#define CHAIN_COMMANDS(theChainClass) \ + if(uMsg == WM_COMMAND) \ + CHAIN_MSG_MAP(theChainClass) + +#define CHAIN_COMMANDS_ALT(theChainClass, msgMapID) \ + if(uMsg == WM_COMMAND) \ + CHAIN_MSG_MAP_ALT(theChainClass, msgMapID) + +#define CHAIN_COMMANDS_MEMBER(theChainMember) \ + if(uMsg == WM_COMMAND) \ + CHAIN_MSG_MAP_MEMBER(theChainMember) + +#define CHAIN_COMMANDS_ALT_MEMBER(theChainMember, msgMapID) \ + if(uMsg == WM_COMMAND) \ + CHAIN_MSG_MAP_ALT_MEMBER(theChainMember, msgMapID) + + +/////////////////////////////////////////////////////////////////////////////// +// Macros for parent message map to selectively reflect control messages + +// NOTE: ReflectNotifications is a member of ATL's CWindowImplRoot +// (and overridden in 2 cases - CContainedWindowT and CAxHostWindow) +// Since we can't modify ATL, we'll provide the needed additions +// in a separate function (that is not a member of CWindowImplRoot) + +namespace WTL +{ + +inline LRESULT WtlReflectNotificationsFiltered(HWND hWndParent, UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled, + UINT uMsgFilter = WM_NULL, UINT_PTR idFromFilter = 0, HWND hWndChildFilter = NULL) +{ + if((uMsgFilter != WM_NULL) && (uMsgFilter != uMsg)) + { + // The notification message doesn't match the filter. + bHandled = FALSE; + return 1; + } + + HWND hWndChild = NULL; + UINT_PTR idFrom = 0; + + switch(uMsg) + { + case WM_COMMAND: + if(lParam != NULL) // not from a menu + { + hWndChild = (HWND)lParam; + idFrom = (UINT_PTR)LOWORD(wParam); + } + break; + case WM_NOTIFY: + hWndChild = ((LPNMHDR)lParam)->hwndFrom; + idFrom = ((LPNMHDR)lParam)->idFrom; + break; +#ifndef _WIN32_WCE + case WM_PARENTNOTIFY: + switch(LOWORD(wParam)) + { + case WM_CREATE: + case WM_DESTROY: + hWndChild = (HWND)lParam; + idFrom = (UINT_PTR)HIWORD(wParam); + break; + default: + hWndChild = ::GetDlgItem(hWndParent, HIWORD(wParam)); + idFrom = (UINT_PTR)::GetDlgCtrlID(hWndChild); + break; + } + break; +#endif // !_WIN32_WCE + case WM_DRAWITEM: + if(wParam) // not from a menu + { + hWndChild = ((LPDRAWITEMSTRUCT)lParam)->hwndItem; + idFrom = (UINT_PTR)wParam; + } + break; + case WM_MEASUREITEM: + if(wParam) // not from a menu + { + hWndChild = ::GetDlgItem(hWndParent, ((LPMEASUREITEMSTRUCT)lParam)->CtlID); + idFrom = (UINT_PTR)wParam; + } + break; + case WM_COMPAREITEM: + if(wParam) // not from a menu + { + hWndChild = ((LPCOMPAREITEMSTRUCT)lParam)->hwndItem; + idFrom = (UINT_PTR)wParam; + } + break; + case WM_DELETEITEM: + if(wParam) // not from a menu + { + hWndChild = ((LPDELETEITEMSTRUCT)lParam)->hwndItem; + idFrom = (UINT_PTR)wParam; + } + break; + case WM_VKEYTOITEM: + case WM_CHARTOITEM: + case WM_HSCROLL: + case WM_VSCROLL: + hWndChild = (HWND)lParam; + idFrom = (UINT_PTR)::GetDlgCtrlID(hWndChild); + break; + case WM_CTLCOLORBTN: + case WM_CTLCOLORDLG: + case WM_CTLCOLOREDIT: + case WM_CTLCOLORLISTBOX: + case WM_CTLCOLORMSGBOX: + case WM_CTLCOLORSCROLLBAR: + case WM_CTLCOLORSTATIC: + hWndChild = (HWND)lParam; + idFrom = (UINT_PTR)::GetDlgCtrlID(hWndChild); + break; + default: + break; + } + + if((hWndChild == NULL) || + ((hWndChildFilter != NULL) && (hWndChildFilter != hWndChild))) + { + // Either hWndChild isn't valid, or + // hWndChild doesn't match the filter. + bHandled = FALSE; + return 1; + } + + if((idFromFilter != 0) && (idFromFilter != idFrom)) + { + // The dialog control id doesn't match the filter. + bHandled = FALSE; + return 1; + } + + ATLASSERT(::IsWindow(hWndChild)); + LRESULT lResult = ::SendMessage(hWndChild, OCM__BASE + uMsg, wParam, lParam); + if((lResult == 0) && (uMsg >= WM_CTLCOLORMSGBOX) && (uMsg <= WM_CTLCOLORSTATIC)) + { + // Try to prevent problems with WM_CTLCOLOR* messages when + // the message wasn't really handled + bHandled = FALSE; + } + + return lResult; +} + +}; // namespace WTL + +// Try to prevent problems with WM_CTLCOLOR* messages when +// the message wasn't really handled +#define REFLECT_NOTIFICATIONS_EX() \ +{ \ + bHandled = TRUE; \ + lResult = ReflectNotifications(uMsg, wParam, lParam, bHandled); \ + if((lResult == 0) && (uMsg >= WM_CTLCOLORMSGBOX) && (uMsg <= WM_CTLCOLORSTATIC)) \ + bHandled = FALSE; \ + if(bHandled) \ + return TRUE; \ +} + +#define REFLECT_NOTIFICATIONS_MSG_FILTERED(uMsgFilter) \ + { \ + bHandled = TRUE; \ + lResult = WTL::WtlReflectNotificationsFiltered(m_hWnd, uMsg, wParam, lParam, bHandled, uMsgFilter, 0, NULL); \ + if(bHandled) \ + return TRUE; \ + } + +#define REFLECT_NOTIFICATIONS_ID_FILTERED(idFromFilter) \ + { \ + bHandled = TRUE; \ + lResult = WTL::WtlReflectNotificationsFiltered(m_hWnd, uMsg, wParam, lParam, bHandled, WM_NULL, idFromFilter, NULL); \ + if(bHandled) \ + return TRUE; \ + } + +#define REFLECT_NOTIFICATIONS_HWND_FILTERED(hWndChildFilter) \ + { \ + bHandled = TRUE; \ + lResult = WTL::WtlReflectNotificationsFiltered(m_hWnd, uMsg, wParam, lParam, bHandled, WM_NULL, 0, hWndChildFilter); \ + if(bHandled) \ + return TRUE; \ + } + +#define REFLECT_NOTIFICATIONS_MSG_ID_FILTERED(uMsgFilter, idFromFilter) \ + { \ + bHandled = TRUE; \ + lResult = WTL::WtlReflectNotificationsFiltered(m_hWnd, uMsg, wParam, lParam, bHandled, uMsgFilter, idFromFilter, NULL); \ + if(bHandled) \ + return TRUE; \ + } + +#define REFLECT_NOTIFICATIONS_MSG_HWND_FILTERED(uMsgFilter, hWndChildFilter) \ + { \ + bHandled = TRUE; \ + lResult = WTL::WtlReflectNotificationsFiltered(m_hWnd, uMsg, wParam, lParam, bHandled, uMsgFilter, 0, hWndChildFilter); \ + if(bHandled) \ + return TRUE; \ + } + +#define REFLECT_COMMAND(id, code) \ + if(uMsg == WM_COMMAND && id == LOWORD(wParam) && code == HIWORD(wParam)) \ + { \ + bHandled = TRUE; \ + lResult = ReflectNotifications(uMsg, wParam, lParam, bHandled); \ + if(bHandled) \ + return TRUE; \ + } + +#define REFLECT_COMMAND_ID(id) \ + if(uMsg == WM_COMMAND && id == LOWORD(wParam)) \ + { \ + bHandled = TRUE; \ + lResult = ReflectNotifications(uMsg, wParam, lParam, bHandled); \ + if(bHandled) \ + return TRUE; \ + } + +#define REFLECT_COMMAND_CODE(code) \ + if(uMsg == WM_COMMAND && code == HIWORD(wParam)) \ + { \ + bHandled = TRUE; \ + lResult = ReflectNotifications(uMsg, wParam, lParam, bHandled); \ + if(bHandled) \ + return TRUE; \ + } + +#define REFLECT_COMMAND_RANGE(idFirst, idLast) \ + if(uMsg == WM_COMMAND && LOWORD(wParam) >= idFirst && LOWORD(wParam) <= idLast) \ + { \ + bHandled = TRUE; \ + lResult = ReflectNotifications(uMsg, wParam, lParam, bHandled); \ + if(bHandled) \ + return TRUE; \ + } + +#define REFLECT_COMMAND_RANGE_CODE(idFirst, idLast, code) \ + if(uMsg == WM_COMMAND && code == HIWORD(wParam) && LOWORD(wParam) >= idFirst && LOWORD(wParam) <= idLast) \ + { \ + bHandled = TRUE; \ + lResult = ReflectNotifications(uMsg, wParam, lParam, bHandled); \ + if(bHandled) \ + return TRUE; \ + } + +#define REFLECT_NOTIFY(id, cd) \ + if(uMsg == WM_NOTIFY && id == ((LPNMHDR)lParam)->idFrom && cd == ((LPNMHDR)lParam)->code) \ + { \ + bHandled = TRUE; \ + lResult = ReflectNotifications(uMsg, wParam, lParam, bHandled); \ + if(bHandled) \ + return TRUE; \ + } + +#define REFLECT_NOTIFY_ID(id) \ + if(uMsg == WM_NOTIFY && id == ((LPNMHDR)lParam)->idFrom) \ + { \ + bHandled = TRUE; \ + lResult = ReflectNotifications(uMsg, wParam, lParam, bHandled); \ + if(bHandled) \ + return TRUE; \ + } + +#define REFLECT_NOTIFY_CODE(cd) \ + if(uMsg == WM_NOTIFY && cd == ((LPNMHDR)lParam)->code) \ + { \ + bHandled = TRUE; \ + lResult = ReflectNotifications(uMsg, wParam, lParam, bHandled); \ + if(bHandled) \ + return TRUE; \ + } + +#define REFLECT_NOTIFY_RANGE(idFirst, idLast) \ + if(uMsg == WM_NOTIFY && ((LPNMHDR)lParam)->idFrom >= idFirst && ((LPNMHDR)lParam)->idFrom <= idLast) \ + { \ + bHandled = TRUE; \ + lResult = ReflectNotifications(uMsg, wParam, lParam, bHandled); \ + if(bHandled) \ + return TRUE; \ + } + +#define REFLECT_NOTIFY_RANGE_CODE(idFirst, idLast, cd) \ + if(uMsg == WM_NOTIFY && cd == ((LPNMHDR)lParam)->code && ((LPNMHDR)lParam)->idFrom >= idFirst && ((LPNMHDR)lParam)->idFrom <= idLast) \ + { \ + bHandled = TRUE; \ + lResult = ReflectNotifications(uMsg, wParam, lParam, bHandled); \ + if(bHandled) \ + return TRUE; \ + } + + +/////////////////////////////////////////////////////////////////////////////// +// Reflected message handler macros for message maps (for ATL 3.0) + +#if (_ATL_VER < 0x0700) + +#define REFLECTED_COMMAND_HANDLER(id, code, func) \ + if(uMsg == OCM_COMMAND && id == LOWORD(wParam) && code == HIWORD(wParam)) \ + { \ + bHandled = TRUE; \ + lResult = func(HIWORD(wParam), LOWORD(wParam), (HWND)lParam, bHandled); \ + if(bHandled) \ + return TRUE; \ + } + +#define REFLECTED_COMMAND_ID_HANDLER(id, func) \ + if(uMsg == OCM_COMMAND && id == LOWORD(wParam)) \ + { \ + bHandled = TRUE; \ + lResult = func(HIWORD(wParam), LOWORD(wParam), (HWND)lParam, bHandled); \ + if(bHandled) \ + return TRUE; \ + } + +#define REFLECTED_COMMAND_CODE_HANDLER(code, func) \ + if(uMsg == OCM_COMMAND && code == HIWORD(wParam)) \ + { \ + bHandled = TRUE; \ + lResult = func(HIWORD(wParam), LOWORD(wParam), (HWND)lParam, bHandled); \ + if(bHandled) \ + return TRUE; \ + } + +#define REFLECTED_COMMAND_RANGE_HANDLER(idFirst, idLast, func) \ + if(uMsg == OCM_COMMAND && LOWORD(wParam) >= idFirst && LOWORD(wParam) <= idLast) \ + { \ + bHandled = TRUE; \ + lResult = func(HIWORD(wParam), LOWORD(wParam), (HWND)lParam, bHandled); \ + if(bHandled) \ + return TRUE; \ + } + +#define REFLECTED_COMMAND_RANGE_CODE_HANDLER(idFirst, idLast, code, func) \ + if(uMsg == OCM_COMMAND && code == HIWORD(wParam) && LOWORD(wParam) >= idFirst && LOWORD(wParam) <= idLast) \ + { \ + bHandled = TRUE; \ + lResult = func(HIWORD(wParam), LOWORD(wParam), (HWND)lParam, bHandled); \ + if(bHandled) \ + return TRUE; \ + } + +#define REFLECTED_NOTIFY_HANDLER(id, cd, func) \ + if(uMsg == OCM_NOTIFY && id == ((LPNMHDR)lParam)->idFrom && cd == ((LPNMHDR)lParam)->code) \ + { \ + bHandled = TRUE; \ + lResult = func((int)wParam, (LPNMHDR)lParam, bHandled); \ + if(bHandled) \ + return TRUE; \ + } + +#define REFLECTED_NOTIFY_ID_HANDLER(id, func) \ + if(uMsg == OCM_NOTIFY && id == ((LPNMHDR)lParam)->idFrom) \ + { \ + bHandled = TRUE; \ + lResult = func((int)wParam, (LPNMHDR)lParam, bHandled); \ + if(bHandled) \ + return TRUE; \ + } + +#define REFLECTED_NOTIFY_CODE_HANDLER(cd, func) \ + if(uMsg == OCM_NOTIFY && cd == ((LPNMHDR)lParam)->code) \ + { \ + bHandled = TRUE; \ + lResult = func((int)wParam, (LPNMHDR)lParam, bHandled); \ + if(bHandled) \ + return TRUE; \ + } + +#define REFLECTED_NOTIFY_RANGE_HANDLER(idFirst, idLast, func) \ + if(uMsg == OCM_NOTIFY && ((LPNMHDR)lParam)->idFrom >= idFirst && ((LPNMHDR)lParam)->idFrom <= idLast) \ + { \ + bHandled = TRUE; \ + lResult = func((int)wParam, (LPNMHDR)lParam, bHandled); \ + if(bHandled) \ + return TRUE; \ + } + +#define REFLECTED_NOTIFY_RANGE_CODE_HANDLER(idFirst, idLast, cd, func) \ + if(uMsg == OCM_NOTIFY && cd == ((LPNMHDR)lParam)->code && ((LPNMHDR)lParam)->idFrom >= idFirst && ((LPNMHDR)lParam)->idFrom <= idLast) \ + { \ + bHandled = TRUE; \ + lResult = func((int)wParam, (LPNMHDR)lParam, bHandled); \ + if(bHandled) \ + return TRUE; \ + } + +#endif // (_ATL_VER < 0x0700) + + +/////////////////////////////////////////////////////////////////////////////// +// Dual argument helper classes (for ATL 3.0) + +#if (_ATL_VER < 0x0700) + +namespace ATL +{ + +class _U_RECT +{ +public: + _U_RECT(LPRECT lpRect) : m_lpRect(lpRect) + { } + _U_RECT(RECT& rc) : m_lpRect(&rc) + { } + LPRECT m_lpRect; +}; + +class _U_MENUorID +{ +public: + _U_MENUorID(HMENU hMenu) : m_hMenu(hMenu) + { } + _U_MENUorID(UINT nID) : m_hMenu((HMENU)LongToHandle(nID)) + { } + HMENU m_hMenu; +}; + +class _U_STRINGorID +{ +public: + _U_STRINGorID(LPCTSTR lpString) : m_lpstr(lpString) + { } + _U_STRINGorID(UINT nID) : m_lpstr(MAKEINTRESOURCE(nID)) + { } + LPCTSTR m_lpstr; +}; + +}; // namespace ATL + +#endif // (_ATL_VER < 0x0700) + + +namespace WTL +{ + +/////////////////////////////////////////////////////////////////////////////// +// Forward notifications support for message maps (for ATL 3.0) + +#if (_ATL_VER < 0x0700) + +// forward notifications support +#define FORWARD_NOTIFICATIONS() \ + { \ + bHandled = TRUE; \ + lResult = WTL::Atl3ForwardNotifications(m_hWnd, uMsg, wParam, lParam, bHandled); \ + if(bHandled) \ + return TRUE; \ + } + +static LRESULT Atl3ForwardNotifications(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) +{ + LRESULT lResult = 0; + switch(uMsg) + { + case WM_COMMAND: + case WM_NOTIFY: +#ifndef _WIN32_WCE + case WM_PARENTNOTIFY: +#endif // !_WIN32_WCE + case WM_DRAWITEM: + case WM_MEASUREITEM: + case WM_COMPAREITEM: + case WM_DELETEITEM: + case WM_VKEYTOITEM: + case WM_CHARTOITEM: + case WM_HSCROLL: + case WM_VSCROLL: + case WM_CTLCOLORBTN: + case WM_CTLCOLORDLG: + case WM_CTLCOLOREDIT: + case WM_CTLCOLORLISTBOX: + case WM_CTLCOLORMSGBOX: + case WM_CTLCOLORSCROLLBAR: + case WM_CTLCOLORSTATIC: + lResult = ::SendMessage(::GetParent(hWnd), uMsg, wParam, lParam); + break; + default: + bHandled = FALSE; + break; + } + return lResult; +} + +#endif // (_ATL_VER < 0x0700) + +}; // namespace WTL + +#endif // __ATLWINX_H__ diff --git a/Externals/wxWidgets/art/addbookm.xpm b/Externals/wxWidgets/art/addbookm.xpm new file mode 100644 index 0000000000..18851bcdf4 --- /dev/null +++ b/Externals/wxWidgets/art/addbookm.xpm @@ -0,0 +1,24 @@ +/* XPM */ +static char *addbookm_xpm[] = { +/* columns rows colors chars-per-pixel */ +"16 15 3 1", +". c Black", +"X c #00C000", +" c None", +/* pixels */ +" ....... ", +" .XXXXX. ", +" .. .XXXXX. ", +" .. .XXXXX. ", +" ...... .XXXXX. ", +" ...... .XXXXX. ", +" .. .XXXXX. ", +" .. .XXXXX. ", +" .XXXXX. ", +" .XXXXX. ", +" .XXXXX. ", +" .XXXXX. ", +" .XX.XX. ", +" .X. .X. ", +" .. .. " +}; diff --git a/Externals/wxWidgets/art/back.xpm b/Externals/wxWidgets/art/back.xpm new file mode 100644 index 0000000000..81b7a909f2 --- /dev/null +++ b/Externals/wxWidgets/art/back.xpm @@ -0,0 +1,21 @@ +/* XPM */ +static char * back_xpm[] = { +"16 15 3 1", +" c None", +". c Black", +"X c Gray100", +" ", +" ", +" . ", +" .. ", +" .X. ", +" .XX........ ", +" .XXXXXXXXXX. ", +" .XXXXXXXXXXX. ", +" .XXXXXXXXXXX. ", +" .XXXXXXXXXX. ", +" .XX........ ", +" .X. ", +" .. ", +" . ", +" "}; diff --git a/Externals/wxWidgets/art/cdrom.xpm b/Externals/wxWidgets/art/cdrom.xpm new file mode 100644 index 0000000000..b43abd7f0b --- /dev/null +++ b/Externals/wxWidgets/art/cdrom.xpm @@ -0,0 +1,57 @@ +/* XPM */ +static char *cdrom_xpm[] = { +/* columns rows colors chars-per-pixel */ +"16 15 36 1", +"= c #9BACC2", +"y c #547B99", +"$ c #FFFFFF", +"@ c #839CB5", +"o c #547897", +"4 c #4D7492", +"% c #F1F4F7", +"X c #5A809C", +"< c #8497A5", +"0 c #7898AD", +"+ c #CAD2DC", +"r c #ACAEB2", +"2 c #BECAD9", +"* c #65839D", +"e c #DCE2EA", +"- c #ADBED2", +"t c #597B9A", +" c None", +"1 c #467291", +"9 c #D6DFE7", +"O c #7393AB", +"u c #49708B", +"5 c #A0BACB", +"& c #AABFCD", +"8 c #B9CBD5", +"; c #B4C4D3", +": c #6F90A6", +"3 c #A8B6CA", +"# c #ADBACE", +"w c #E4E9ED", +". c #8EA9BC", +"> c #B3BFD1", +", c #C2CBDB", +"6 c #C0D1DC", +"7 c #A2B3C5", +"q c #5D7C93", +/* pixels */ +" .XooOo+ ", +" X@#$$$%o& ", +" *=-;$$$$$o+ ", +" +O#;-$$$$$$: ", +" o=>,-<1<$2-o ", +" o3>--1$122-* ", +" o=--$<4<22-X ", +" o5$$$$$26;7* ", +" X%$$$$2;-X8 ", +" 90*9$$$-7Xqo ", +" wXwe@O44X422222<<*4", +" ttyyyoo4441uuuo", +" t>$$$$$$$$$$$>o", +" XXXtyyyoo44411u" +}; diff --git a/Externals/wxWidgets/art/copy.xpm b/Externals/wxWidgets/art/copy.xpm new file mode 100644 index 0000000000..95ad44880d --- /dev/null +++ b/Externals/wxWidgets/art/copy.xpm @@ -0,0 +1,44 @@ +/* XPM */ +static char *copy_xpm[] = { +/* columns rows colors chars-per-pixel */ +"16 15 23 1", +"o c #97C4E7", +"* c #FFFFFF", +"@ c #60A9DA", +"= c #D1E5F5", +"& c #C3DDF1", +". c #7EA6C0", +" c None", +"X c #2F93CD", +"O c #85BBE2", +", c #EFF6FC", +"; c #DEEDF8", +"+ c #72B2DD", +"3 c #F7FBFD", +"4 c #FAFCFE", +": c #DAEAF7", +"< c #E9F3FA", +"1 c #E2EFF8", +"- c #FDFDFE", +"% c #B6D5EE", +"$ c #A5CCEA", +"> c #E5F0F9", +"# c #AFD1EC", +"2 c #F4F9FD", +/* pixels */ +" .....XX ", +" .oO+@X#X ", +" .$oO+X##X ", +" .%$o........ ", +" .&%$.*=&#o.-. ", +" .=&%.*;=&#.--. ", +" .:=&.*>;=&.... ", +" .>:=.*,>;=&#o. ", +" .<1:.*2,>:=&#. ", +" .2<1.*32,>:=&. ", +" .32<.*432,>:=. ", +" .32<.*-432,>:. ", +" .....**-432,>. ", +" .***-432,. ", +" .......... " +}; diff --git a/Externals/wxWidgets/art/cross.xpm b/Externals/wxWidgets/art/cross.xpm new file mode 100644 index 0000000000..b30173b398 --- /dev/null +++ b/Externals/wxWidgets/art/cross.xpm @@ -0,0 +1,17 @@ +/* XPM */ +static char *cross_xpm[] = { +/* columns rows colors chars-per-pixel */ +"10 10 2 1", +" c Gray0", +"# c None", +/* pixels */ +" ######## ", +" #### ", +"# ## #", +"## ##", +"### ###", +"### ###", +"## ##", +"# ## #", +" #### ", +" ###### "}; diff --git a/Externals/wxWidgets/art/cut.xpm b/Externals/wxWidgets/art/cut.xpm new file mode 100644 index 0000000000..8afa8f6d15 --- /dev/null +++ b/Externals/wxWidgets/art/cut.xpm @@ -0,0 +1,46 @@ +/* XPM */ +static char *cut_xpm[] = { +/* columns rows colors chars-per-pixel */ +"16 15 25 1", +"6 c #D8BDC0", +": c #C3C3C4", +"- c #FFFFFF", +". c #6C6D70", +"2 c #AD3A45", +"o c #DBDBDB", +"# c #939495", +"< c #E42234", +"& c #C3C5C8", +"; c #C6CCD3", +"% c #B7B7B8", +" c None", +"* c #DFE0E2", +"5 c #B69596", +"3 c #9C2A35", +"1 c #CFCFD0", +", c #AB5C64", +"+ c #D2D3D4", +"$ c #BCBDBE", +"@ c #C6C8CA", +"> c #CDC0C1", +"O c #826F72", +"X c #979BA0", +"4 c #9B8687", +"= c #9FA0A0", +/* pixels */ +" .X .o ", +" O.+ @. ", +" O. .. ", +" O#$ %.& ", +" O.*.. ", +" #%#.. ", +" O=-.. ", +" #%#;. ", +" OO:=O ", +" >,,<, ,<,,1 ", +" ><23<1 1<32<1 ", +" ,2 4< <5 2, ", +" <, ,2 2, ,< ", +" 23,<5 5<,32 ", +" 6225 522> " +}; diff --git a/Externals/wxWidgets/art/deffile.xpm b/Externals/wxWidgets/art/deffile.xpm new file mode 100644 index 0000000000..5442c6cc68 --- /dev/null +++ b/Externals/wxWidgets/art/deffile.xpm @@ -0,0 +1,54 @@ +/* XPM */ +static char *deffile_xpm[] = { +/* columns rows colors chars-per-pixel */ +"16 16 32 1", +"= c #97C4E7", +": c #72A8D2", +"1 c #FFFFFF", +"w c #839CB5", +"X c #6B98B8", +". c #5A89A6", +"@ c #3A749C", +", c #D1E5F5", +"< c #67A1CF", +"> c #F1F4F7", +"e c #85A7BC", +"% c #C3DDF1", +"0 c #749BB4", +"2 c #7EA6C0", +"; c #5F9BC8", +" c None", +"O c #538DB3", +"- c #85BBE2", +"$ c #D6DFE7", +"9 c #EFF6FC", +"o c #6591AE", +"4 c #F7FBFD", +"8 c #FAFCFE", +"6 c #DAEAF7", +"7 c #E9F3FA", +"q c #FDFDFE", +"3 c #E2EFF8", +"# c #8EA9BC", +"& c #B6D5EE", +"* c #A5CCEA", +"5 c #F4F9FD", +"+ c #4581AA", +/* pixels */ +" ..XooO+@#$ ", +" .%%&*=-;:;> ", +" .,,%&*=<1=X> ", +" #%%%%&*211=X ", +" #3----- c #5A7BB4", +"% c #5F7FB5", +/* pixels */ +" ", +" .Xo OO ", +" +@#. $@% ", +" &@@X .*@*o ", +" =@= .*@*. ", +" -@@X*@*. ", +" .#@@@$. ", +" ;@@: ", +" ;@@@+ ", +" .>@#%@@. ", +" o*@*oO@@, ", +" <#@*. .@@= ", +"&@@$ :@@1 ", +";#& 2#>. ", +" " +}; diff --git a/Externals/wxWidgets/art/dir_up.xpm b/Externals/wxWidgets/art/dir_up.xpm new file mode 100644 index 0000000000..efdf4340a8 --- /dev/null +++ b/Externals/wxWidgets/art/dir_up.xpm @@ -0,0 +1,52 @@ +/* XPM */ +static char *dir_up_xpm[] = { +/* columns rows colors chars-per-pixel */ +"16 15 31 1", +"6 c #9BACC2", +"o c #9AEA53", +"7 c #94A5BD", +"8 c #547897", +"5 c #839CB5", +"@ c #376485", +"$ c #5A809C", +"# c #7F99B4", +": c #D1D9E5", +"< c #EAEDF3", +"& c #446A8C", +"q c #65839D", +"> c #DCE2EA", +", c #E1E6EE", +"2 c #F5F6F7", +"O c #8DA0B9", +" c None", +"% c #467291", +". c #305F81", +"X c #7393AB", +"+ c #6A89A2", +"4 c #A8B6CA", +"1 c #EEF1F3", +"3 c #F8F9FA", +"0 c #215579", +"9 c #7F97B0", +"* c #B3BFD1", +"w c #7A90AC", +"- c #C2CBDB", +"; c #CAD6E1", +"= c #BBC4D6", +/* pixels */ +" .. ", +" X.o. ", +".... X.ooo. ", +".OO+....ooooo. ", +".OOOOOO@@ooo.. ", +".OOOO#OO@ooo.$ ", +".OOOOOOO@ooo.$ ", +".O%............&", +".O&*=-;:>,<1231.", +".+.4*=-;:>,<12$.", +"..564*=-;:>,<1. ", +".@O764*=-;:>,<. ", +".89O764*=-;:>$$ ", +"0qw9O764*=-;:. ", +"0............. " +}; diff --git a/Externals/wxWidgets/art/down.xpm b/Externals/wxWidgets/art/down.xpm new file mode 100644 index 0000000000..f03819e4d3 --- /dev/null +++ b/Externals/wxWidgets/art/down.xpm @@ -0,0 +1,21 @@ +/* XPM */ +static char * down_xpm[] = { +"16 15 3 1", +" c None", +". c Black", +"X c Gray100", +" ", +" ...... ", +" .XXXX. ", +" .XXXX. ", +" .XXXX. ", +" .XXXX. ", +" .XXXX. ", +" .XXXX. ", +" ....XXXX.... ", +" .XXXXXXXX. ", +" .XXXXXX. ", +" .XXXX. ", +" .XX. ", +" .. ", +" "}; diff --git a/Externals/wxWidgets/art/exefile.xpm b/Externals/wxWidgets/art/exefile.xpm new file mode 100644 index 0000000000..4defb732e3 --- /dev/null +++ b/Externals/wxWidgets/art/exefile.xpm @@ -0,0 +1,73 @@ +/* XPM */ +static char *exefile_xpm[] = { +/* columns rows colors chars-per-pixel */ +"16 16 51 1", +"% c #E8E8EC", +"= c #E8E8ED", +"z c #CACAD4", +"8 c #D9D9E1", +"p c #D2D2DA", +"u c #E1E1E7", +"a c #D2D2DB", +"< c #E9E9ED", +"q c #DADAE1", +"+ c #F1F1F4", +"g c #D3D3DB", +"1 c #E2E2E8", +"x c #D3D3DC", +"5 c #00A5FF", +"$ c #EAEAEE", +"4 c #DBDBE2", +"h c #CCCCD6", +"y c #D4D4DC", +"r c #E3E3E9", +"d c #D4D4DD", +"7 c #DCDCE2", +": c #EBEBEF", +"0 c #DCDCE3", +" c None", +"O c #F3F3F5", +"> c #E4E4E9", +"& c #F3F3F6", +"j c #D5D5DD", +"6 c #E4E4EA", +". c #C6C6D5", +"# c #ECECF0", +"f c #CECED7", +"l c #CECED8", +"e c #D6D6DE", +"; c #EDEDF0", +"3 c #DEDEE4", +", c #EDEDF1", +"c c #CFCFD8", +"o c #F5F5F7", +"- c #E6E6EB", +"w c #D7D7DF", +"v c #C8C8D3", +"i c #DFDFE5", +"@ c #EEEEF2", +"s c #D0D0D9", +"X c #9494AD", +"9 c #D8D8DF", +"t c #D8D8E0", +"* c #EFEFF2", +"2 c #E0E0E6", +"k c #D1D1DA", +/* pixels */ +" ........X ", +" .oO+@#$%XX ", +" .&+*#$=-XXX ", +" .+*;:=->XXXX ", +" .*,:<->1234X ", +" .,5:5612378X ", +" 5,5559530qwX ", +" 55555550q9eX ", +" 5555r5555teyX ", +" 55rui559eypX ", +" 5555i5555yasX ", +" 5555555dasfX ", +" 5355595gsfhX ", +" .3595jgklhzX ", +" .0qwjxkchzvX ", +" XXXXXXXXXXXX " +}; diff --git a/Externals/wxWidgets/art/fileopen.xpm b/Externals/wxWidgets/art/fileopen.xpm new file mode 100644 index 0000000000..50724a857c --- /dev/null +++ b/Externals/wxWidgets/art/fileopen.xpm @@ -0,0 +1,57 @@ +/* XPM */ +static char *fileopen_xpm[] = { +/* columns rows colors chars-per-pixel */ +"16 15 36 1", +"6 c #9BACC2", +"< c #9AEA53", +"9 c #94A5BD", +"5 c #839CB5", +"; c #4D7492", +". c #376485", +"$ c #7F99B4", +"r c #D1D9E5", +"7 c #EAEDF3", +"@ c #CAD2DC", +"% c #718BA7", +"t c #BECAD9", +"& c #65839D", +"0 c #DCE2EA", +"4 c #F5F6F7", +"w c #597B9A", +"O c #8DA0B9", +" c None", +"+ c #467291", +"u c #305F81", +"= c #B4C4D3", +"# c #CAE2AA", +"1 c #FAFCFE", +"3 c #A8B6CA", +"q c #E4E9ED", +"8 c #EEF1F3", +"X c #215579", +"2 c #7F97B0", +": c #B3BFD1", +"y c #7A90AC", +", c #C2CBDB", +"- c #ADD668", +"* c #B6D791", +"e c #CAD6E1", +"o c #DFF0D0", +"> c #BBC4D6", +/* pixels */ +" ", +" .... ", +"XXXXX .oo. ", +"XOOOO+@.#o. ", +"XOOOO$%&.*oXXX ", +"XOOOOOOO.*oX=X ", +"XOXXXX...-oXXXX;", +"XOX:>,.<<<<,.<<>.>.X0q7; ", +"Xw2O963:>>er0t; ", +"X&y2O963:>,er; ", +"uXXXXXXXXXXXX; ", +" " +}; diff --git a/Externals/wxWidgets/art/filesave.xpm b/Externals/wxWidgets/art/filesave.xpm new file mode 100644 index 0000000000..5c63fcfd5d --- /dev/null +++ b/Externals/wxWidgets/art/filesave.xpm @@ -0,0 +1,42 @@ +/* XPM */ +static char *filesave_xpm[] = { +/* columns rows colors chars-per-pixel */ +"16 15 21 1", +"O c #FFFFFF", +"> c #D5D6D8", +"; c #446A8C", +"1 c #CAD2DC", +": c #C0C7D1", +" c #5F666D", +"% c #A5B0BA", +"o c #65839D", +", c #DCE2EA", +"< c #C3C5C8", +"- c #E1E6EE", +"* c #C6CCD3", +". c None", +"$ c #305F81", +"2 c #D6DFE7", +"= c #D2D9E0", +"& c #B7BFC7", +"X c #1B4467", +"# c #BCBDBE", +"@ c #7A90AC", +"+ c #5D7C93", +/* pixels */ +" .", +" XoOOOOOOOOO+X .", +" @oO#######O+@ .", +" @oOOOOOOOOO+@ .", +" @oO#######O+@ .", +" @oOOOOOOOOO+@ .", +" @@+++++++++@@ .", +" @@@@@@@@@@@@@ .", +" @@@$$$$$$$$@@ .", +" @@$%%%&*=-O$@ .", +" @@$%X;;*=-O$@ .", +" @@$%X;;:>,O$@ .", +" @@$%X;;<12O$@ .", +" @@$<<2OOOOO$@ .", +". .." +}; diff --git a/Externals/wxWidgets/art/filesaveas.xpm b/Externals/wxWidgets/art/filesaveas.xpm new file mode 100644 index 0000000000..9fb5fca7a5 --- /dev/null +++ b/Externals/wxWidgets/art/filesaveas.xpm @@ -0,0 +1,44 @@ +/* XPM */ +static char *filesaveas_xpm[] = { +/* columns rows colors chars-per-pixel */ +"16 15 23 1", +"X c Black", +"+ c #FFFFFF", +"< c #D5D6D8", +"> c #446A8C", +"3 c #CAD2DC", +", c #C0C7D1", +" c #5F666D", +"* c #A5B0BA", +"O c #65839D", +"1 c #DCE2EA", +"2 c #C3C5C8", +": c #E1E6EE", +". c #FFFF00", +"- c #C6CCD3", +"@ c None", +"& c #305F81", +"4 c #D6DFE7", +"; c #D2D9E0", +"= c #B7BFC7", +"o c #1B4467", +"$ c #BCBDBE", +"# c #7A90AC", +"% c #5D7C93", +/* pixels */ +" .X .XX.", +" oO+++++++.X.X.@", +" #O+$$$$$XX...XX", +" #O++++++.......", +" #O+$$$$$XX...XX", +" #O+++++++.X.X.@", +" ##%%%%%%.X%.X .", +" ############# @", +" ###&&&&&&&&## @", +" ##&***=-;:+&# @", +" ##&*o>>-;:+&# @", +" ##&*o>>,<1+&# @", +" ##&*o>>234+&# @", +" ##&224+++++&# @", +"@ @@" +}; diff --git a/Externals/wxWidgets/art/find.xpm b/Externals/wxWidgets/art/find.xpm new file mode 100644 index 0000000000..fe90d31ba8 --- /dev/null +++ b/Externals/wxWidgets/art/find.xpm @@ -0,0 +1,62 @@ +/* XPM */ +static char *find_xpm[] = { +/* columns rows colors chars-per-pixel */ +"16 15 41 1", +"y c #A06959", +"9 c #A7DAF2", +"$ c #B5CAD7", +"> c #35B4E1", +"t c #6B98B8", +"w c #B6E0F4", +"q c #AEC9D7", +"1 c #5A89A6", +"+ c #98B3C6", +"4 c #EAF6FC", +"3 c #DEF1FA", +"= c #4CBCE3", +"d c #DB916B", +"X c #85A7BC", +"s c #D8BCA4", +"o c #749BB4", +"e c #BCD9EF", +"* c #62B4DD", +"< c #91D2EF", +"a c #E6DED2", +"0 c #E9F4FB", +" c None", +"@ c #A0BACB", +"O c #AABFCD", +"i c #6591AE", +": c #B9CBD5", +"- c #71C5E7", +"5 c #D3ECF8", +"% c #81A3B9", +"6 c #8AD0EE", +"8 c #FDFDFE", +"p c #8EA9BC", +"r c #B6D5EE", +", c #81CCEB", +". c #ACC4D3", +"; c #AFD1DE", +"7 c #EFF8FC", +"u c #C2CBDB", +"# c #C0D1DC", +"2 c #CAD6E1", +"& c #8FB0C3", +/* pixels */ +" .XooXO ", +" +@###$+% ", +" .&#*==-;@@ ", +" o:*>,<--:X ", +" 12>-345-#% ", +" 12>678392% ", +" %$*,3059q& ", +" @Oq,wwer@@ ", +" t@q22q&+ ", +" yyui+%o%p ", +" yasy ", +" yasdy ", +" yasdy ", +" ysdy ", +" yy " +}; diff --git a/Externals/wxWidgets/art/findrepl.xpm b/Externals/wxWidgets/art/findrepl.xpm new file mode 100644 index 0000000000..13c5aa08b4 --- /dev/null +++ b/Externals/wxWidgets/art/findrepl.xpm @@ -0,0 +1,63 @@ +/* XPM */ +static char *findrepl_xpm[] = { +/* columns rows colors chars-per-pixel */ +"16 15 42 1", +"y c #A06959", +"9 c #A7DAF2", +"$ c #B5CAD7", +"> c #35B4E1", +"t c #6B98B8", +"w c #B6E0F4", +"q c #AEC9D7", +"1 c #5A89A6", +"+ c #98B3C6", +"4 c #EAF6FC", +"d c #008000", +"3 c #DEF1FA", +"= c #4CBCE3", +"f c #DB916B", +"X c #85A7BC", +"s c #D8BCA4", +"o c #749BB4", +"e c #BCD9EF", +"* c #62B4DD", +"< c #91D2EF", +"a c #E6DED2", +"0 c #E9F4FB", +" c None", +"@ c #A0BACB", +"O c #AABFCD", +"i c #6591AE", +": c #B9CBD5", +"- c #71C5E7", +"5 c #D3ECF8", +"% c #81A3B9", +"6 c #8AD0EE", +"8 c #FDFDFE", +"p c #8EA9BC", +"r c #B6D5EE", +", c #81CCEB", +". c #ACC4D3", +"; c #AFD1DE", +"7 c #EFF8FC", +"u c #C2CBDB", +"# c #C0D1DC", +"2 c #CAD6E1", +"& c #8FB0C3", +/* pixels */ +" .XooXO ", +" +@###$+% ", +" .&#*==-;@@ ", +" o:*>,<--:X ", +" 12>-345-#% ", +" 12>678392% ", +" %$*,3059q& ", +" @Oq,wwer@@ ", +" t@q22q&+ ", +" yyui+%o%p ", +" yasy d d ", +" yasfy dd dd ", +"yasfy ddddddddd", +"ysfy dd dd ", +" yy d d " +}; diff --git a/Externals/wxWidgets/art/floppy.xpm b/Externals/wxWidgets/art/floppy.xpm new file mode 100644 index 0000000000..408d8fdf7c --- /dev/null +++ b/Externals/wxWidgets/art/floppy.xpm @@ -0,0 +1,39 @@ +/* XPM */ +static char *floppy_xpm[] = { +/* columns rows colors chars-per-pixel */ +"16 15 18 1", +"& c #E3E4E6", +"+ c #FFFFFF", +". c #446A8C", +"o c #697787", +"> c #5F666D", +"* c #B2B3B3", +" c None", +", c #4B4C4D", +"= c #DCDBDA", +"$ c #1B4467", +": c #E4E9ED", +"@ c #979BA0", +"X c #203646", +"O c #215579", +"- c #545B63", +"; c #636465", +"# c #CAD6E1", +"% c #7F8286", +/* pixels */ +" .XoooooooXO ", +" .o+++++++.O ", +" .o+OOOOO+.O ", +" .o+++++++.O ", +" .o@@@@@@@.O ", +" ..........O ", +" ..#+++++#.O ", +" ..+$O+++#.O ", +" ..+$O+++#.O ", +" %&.........*% ", +"%=+++++++++++&% ", +"--------------; ", +"-:::::::::::::- ", +"-:X:XXXXXXXXX:> ", +"-*************, " +}; diff --git a/Externals/wxWidgets/art/folder.xpm b/Externals/wxWidgets/art/folder.xpm new file mode 100644 index 0000000000..638f10cd8f --- /dev/null +++ b/Externals/wxWidgets/art/folder.xpm @@ -0,0 +1,43 @@ +/* XPM */ +static char *folder_xpm[] = { +/* columns rows colors chars-per-pixel */ +"16 15 22 1", +"> c #9BACC2", +". c #547897", +"1 c #7F99B4", +"X c #D1D9E5", +"< c #EAEDF3", +"+ c #CAD2DC", +"3 c #718BA7", +"O c #BECAD9", +"$ c #E1E6EE", +"* c #F5F6F7", +", c #8DA0B9", +" c None", +"# c #D6DFE7", +"@ c #D2D9E0", +"- c #FAFCFE", +"; c #ADBACE", +"& c #EEF1F3", +"= c #F8F9FA", +"o c #B3BFD1", +"2 c #7A90AC", +": c #A2B3C5", +"% c #E5EAF1", +/* pixels */ +" ", +" ..... ", +" .XXXX. ", +" ............. ", +" .oO+@#$%&*=-. ", +" .oO+@#$%&*=-. ", +" .;oO+X#$%&*=. ", +" .:;oO+X#$%&*. ", +" .>:;oO+X#$%&. ", +" .,>:;oO+X#$<. ", +" .1,>:;oO+X#$. ", +" .21,>:;oO+X#. ", +" .321,>:;oO+X. ", +" ............. ", +" " +}; diff --git a/Externals/wxWidgets/art/folder_open.xpm b/Externals/wxWidgets/art/folder_open.xpm new file mode 100644 index 0000000000..e1253161cf --- /dev/null +++ b/Externals/wxWidgets/art/folder_open.xpm @@ -0,0 +1,52 @@ +/* XPM */ +static char *folder_open_xpm[] = { +/* columns rows colors chars-per-pixel */ +"16 15 31 1", +"6 c #9BACC2", +"w c #547B99", +"5 c #94A5BD", +". c #376485", +"; c #F1F4F7", +"o c #7F99B4", +"2 c #D1D9E5", +"- c #EAEDF3", +"O c #718BA7", +"0 c #65839D", +"* c #DCE2EA", +": c #F5F6F7", +"7 c #597B9A", +"X c #8DA0B9", +" c None", +"+ c #467291", +"q c #305F81", +"& c #D6DFE7", +"3 c #6A89A2", +"1 c #A8B6CA", +"= c #E4E9ED", +"> c #F8F9FA", +", c #FDFDFE", +"9 c #215579", +"8 c #7F97B0", +"@ c #B3BFD1", +"< c #7A90AC", +"$ c #C2CBDB", +"4 c #A2B3C5", +"% c #CAD6E1", +"# c #BBC4D6", +/* pixels */ +" ", +"..... ", +".XXXo. ", +".XXXXO........ ", +".XXXXXXXXXXXX. ", +".XXXXXXXXXXXX. ", +".X++++++++++++++", +".X+@#$%&*=-;:>,+", +".<.1@#$%2*=-;:23", +"..X41@#$%2*=-;3 ", +"..X561@#$%2*=-3 ", +".78X561@#$%2*%3 ", +"90<8X561@#$%23 ", +"q++++++++++++w ", +" " +}; diff --git a/Externals/wxWidgets/art/forward.xpm b/Externals/wxWidgets/art/forward.xpm new file mode 100644 index 0000000000..ebe75efb01 --- /dev/null +++ b/Externals/wxWidgets/art/forward.xpm @@ -0,0 +1,21 @@ +/* XPM */ +static char * forward_xpm[] = { +"16 15 3 1", +" c None", +". c Black", +"X c Gray100", +" ", +" ", +" . ", +" .. ", +" .X. ", +" ........XX. ", +" .XXXXXXXXXX. ", +" .XXXXXXXXXXX. ", +" .XXXXXXXXXXX. ", +" .XXXXXXXXXX. ", +" ........XX. ", +" .X. ", +" .. ", +" . ", +" "}; diff --git a/Externals/wxWidgets/art/gtk/error.xpm b/Externals/wxWidgets/art/gtk/error.xpm new file mode 100644 index 0000000000..e77c8e9fb6 --- /dev/null +++ b/Externals/wxWidgets/art/gtk/error.xpm @@ -0,0 +1,58 @@ +/* XPM */ +static char *error_xpm[] = { +/* columns rows colors chars-per-pixel */ +"48 48 4 1", +" c None", +"X c #242424", +"o c #DCDF00", +". c #C00000", +/* pixels */ +" ", +" ", +" ", +" ", +" ", +" ..... ", +" ............. ", +" ................. ", +" ................... ", +" ....................... ", +" ......................... ", +" ........................... ", +" ...........................X ", +" .............................X ", +" ............................... ", +" ...............................X ", +" .................................X ", +" .................................X ", +" .................................XX ", +" ...ooooooooooooooooooooooooooo...XX ", +" ....ooooooooooooooooooooooooooo....X ", +" ....ooooooooooooooooooooooooooo....X ", +" ....ooooooooooooooooooooooooooo....XX ", +" ....ooooooooooooooooooooooooooo....XX ", +" ....ooooooooooooooooooooooooooo....XX ", +" ...ooooooooooooooooooooooooooo...XXX ", +" ...ooooooooooooooooooooooooooo...XXX ", +" .................................XX ", +" .................................XX ", +" ...............................XXX ", +" ...............................XXX ", +" .............................XXX ", +" ...........................XXXX ", +" ...........................XXX ", +" .........................XXX ", +" .......................XXXX ", +" X...................XXXXX ", +" X.................XXXXX ", +" X.............XXXXX ", +" XXXX.....XXXXXXXX ", +" XXXXXXXXXXXXX ", +" XXXXX ", +" ", +" ", +" ", +" ", +" ", +" " +}; diff --git a/Externals/wxWidgets/art/gtk/info.xpm b/Externals/wxWidgets/art/gtk/info.xpm new file mode 100644 index 0000000000..8892f504c1 --- /dev/null +++ b/Externals/wxWidgets/art/gtk/info.xpm @@ -0,0 +1,63 @@ +/* XPM */ +static char *info_xpm[] = { +/* columns rows colors chars-per-pixel */ +"48 48 9 1", +"$ c Black", +"O c #FFFFFF", +"@ c #808080", +"+ c #000080", +"o c #E8EB01", +" c None", +"X c #FFFF40", +"# c #C0C0C0", +". c #ABAD01", +/* pixels */ +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ..... ", +" ..XXXXX.. ", +" ..XXXXXXXXo.. ", +" .XXXOXXXXXXXoo. ", +" .XOOXXX+XXXXXo. ", +" .XOOOXX+++XXXXoo. ", +" .XOOXXX+++XXXXXo. ", +" .XOOOXXX+++XXXXXXo. ", +" .XOOXXXX+++XXXXXXo. ", +" .XXXXXXX+++XXXXXXX. ", +" .XXXXXXX+++XXXXXXo. ", +" .XXXXXXX+++XXXXXoo. ", +" .XXXXXX+++XXXXXo. ", +" .XXXXXXX+XXXXXXo. ", +" .XXXXXXXXXXXXo. ", +" .XXXXX+++XXXoo. ", +" .XXXX+++XXoo. ", +" .XXXXXXXXo. ", +" ..XXXXXXo.. ", +" .XXXXXo.. ", +" @#######@ ", +" @@@@@@@@@ ", +" @#######@ ", +" @@@@@@@@@ ", +" @#######@ ", +" @@@@@@@ ", +" ### ", +" $$$ ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" " +}; diff --git a/Externals/wxWidgets/art/gtk/question.xpm b/Externals/wxWidgets/art/gtk/question.xpm new file mode 100644 index 0000000000..8b3cb01ef5 --- /dev/null +++ b/Externals/wxWidgets/art/gtk/question.xpm @@ -0,0 +1,75 @@ +/* XPM */ +static char *question_xpm[] = { +/* columns rows colors chars-per-pixel */ +"48 48 21 1", +". c Black", +"> c #696969", +"O c #1F1F00", +"+ c #181818", +"o c #F6F900", +"; c #3F3F00", +"$ c #111111", +" c None", +"& c #202020", +"X c #AAAA00", +"@ c #949400", +": c #303030", +"1 c #383838", +"% c #2A2A00", +", c #404040", +"= c #B4B400", +"- c #484848", +"# c #151500", +"< c #9F9F00", +"2 c #6A6A00", +"* c #353500", +/* pixels */ +" ", +" ", +" ", +" ", +" ......... ", +" ...XXXXXXX.. ", +" ..XXXXoooooXXXO+ ", +" ..XXooooooooooooX@.. ", +" ..XoooooooooooooooXX#. ", +" $%XoooooooooooooooooXX#. ", +" &.XoooooooXXXXXXooooooXX.. ", +" .XooooooXX.$...$XXoooooX*. ", +" $.XoooooX%.$ .*oooooo=.. ", +" .XooooooX.. -.XoooooX.. ", +" .XoooooX..+ .XoooooX;. ", +" ...XXXX..: .XoooooX;. ", +" ........ >.XoooooX;. ", +" +.XoooooX.. ", +" ,.Xoooooo<.. ", +" 1#XooooooXO.. ", +" &#XooooooX2.. ", +" $%XooooooXX.. ", +" $%XooooooXX.. ", +" $%XooooooXX.. ", +" &.XooooooXX.. ", +" .XooooooXX.. ", +" &.XoooooXX.. ", +" ..XooooXX.. ", +" ..XooooX... ", +" ..XXooXX..& ", +" ...XXXXX.. ", +" ........ ", +" ", +" ", +" ....... ", +" ..XXXXX.. ", +" ..XXoooXX.. ", +" ..XoooooX.. ", +" ..XoooooX.. ", +" ..XXoooXX.. ", +" ..XXXXX.. ", +" ....... ", +" ", +" ", +" ", +" ", +" ", +" " +}; diff --git a/Externals/wxWidgets/art/gtk/warning.xpm b/Externals/wxWidgets/art/gtk/warning.xpm new file mode 100644 index 0000000000..92b7a70860 --- /dev/null +++ b/Externals/wxWidgets/art/gtk/warning.xpm @@ -0,0 +1,63 @@ +/* XPM */ +static char *warning_xpm[] = { +/* columns rows colors chars-per-pixel */ +"48 48 9 1", +"@ c Black", +"o c #A6A800", +"+ c #8A8C00", +"$ c #B8BA00", +" c None", +"O c #6E7000", +"X c #DCDF00", +". c #C00000", +"# c #373800", +/* pixels */ +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" . ", +" ... ", +" ... ", +" ..... ", +" ...X.. ", +" ..XXX.. ", +" ...XXX... ", +" ..XXXXX.. ", +" ..XXXXXX... ", +" ...XXoO+XX.. ", +" ..XXXO@#XXX.. ", +" ..XXXXO@#XXX... ", +" ...XXXXO@#XXXX.. ", +" ..XXXXXO@#XXXX... ", +" ...XXXXXo@OXXXXX.. ", +" ...XXXXXXo@OXXXXXX.. ", +" ..XXXXXXX$@OXXXXXX... ", +" ...XXXXXXXX@XXXXXXXX.. ", +" ...XXXXXXXXXXXXXXXXXX... ", +" ..XXXXXXXXXXOXXXXXXXXX.. ", +" ...XXXXXXXXXO@#XXXXXXXXX.. ", +" ..XXXXXXXXXXX#XXXXXXXXXX... ", +" ...XXXXXXXXXXXXXXXXXXXXXXX.. ", +" ...XXXXXXXXXXXXXXXXXXXXXXXX... ", +" .............................. ", +" .............................. ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" " +}; diff --git a/Externals/wxWidgets/art/harddisk.xpm b/Externals/wxWidgets/art/harddisk.xpm new file mode 100644 index 0000000000..7586442052 --- /dev/null +++ b/Externals/wxWidgets/art/harddisk.xpm @@ -0,0 +1,60 @@ +/* XPM */ +static char *harddisk_xpm[] = { +/* columns rows colors chars-per-pixel */ +"16 15 39 1", +"7 c #E3E4E6", +"4 c #FFFFFF", +"5 c #839CB5", +". c #547897", +"1 c #4D7492", +"@ c #376485", +"o c #7A92A3", +"u c #D1D9E5", +"y c #446A8C", +"i c #51B03D", +"> c #CAD2DC", +"O c #718BA7", +"2 c #65839D", +"6 c #DCE2EA", +"0 c #C3C5C8", +"9 c #F5F6F7", +": c #EBEBEC", +"< c #597B9A", +"t c #C6CCD3", +" c None", +"* c #DFE0E2", +"e c #467291", +"a c #526E8B", +", c #7393AB", +"p c #130A0B", +"# c #AABFCD", +"r c #B4C4D3", +"; c #CFCFD0", +"X c #6F90A6", +"+ c #6A89A2", +"- c #D2D3D4", +"= c #DCDBDA", +"w c #E4E9ED", +"q c #C6C8CA", +"% c #215579", +"$ c #E7E7E7", +"3 c #7F97B0", +"8 c #C0D1DC", +"& c #5D7C93", +/* pixels */ +" ", +" .XoooXO+@ ", +" #$$%%%%$$$X ", +" &$*==-;$$$& ", +" &:>+,<1234o5 ", +" ###+67;;78242 ", +" &4,49*0q*9we4. ", +" &4+49*,,*9wo4. ", +"&4%r,67;;782t%4.", +"&44468rrrr84444,", +"y11111111111111e", +"1uu1:::::::::::1", +"1uu1::::::::ip:1", +"auu&:::::::::::1", +"1111111111111111" +}; diff --git a/Externals/wxWidgets/art/helpicon.xpm b/Externals/wxWidgets/art/helpicon.xpm new file mode 100644 index 0000000000..1c34d8ba2f --- /dev/null +++ b/Externals/wxWidgets/art/helpicon.xpm @@ -0,0 +1,44 @@ +/* XPM */ +static char *helpicon_xpm[] = { +/* columns rows colors chars-per-pixel */ +"32 32 6 1", +" c Gray0", +". c Blue", +"X c #808080808080", +"o c #c0c0c0c0c0c0", +"O c Gray100", +"+ c None", +/* pixels */ +"+++++++++++XXXXXXXX+++++++++++++", +"++++++++XXXoOOOOOOoXXX++++++++++", +"++++++XXoOOOOOOOOOOOOoXX++++++++", +"+++++XoOOOOOOOOOOOOOOOOoX+++++++", +"++++XOOOOOOOOOOOOOOOOOOOO ++++++", +"+++XOOOOOOOo......oOOOOOOO +++++", +"++XOOOOOOOo.oOO....oOOOOOOO ++++", +"+XoOOOOOOO..OOOO....OOOOOOOo +++", +"+XOOOOOOOO....OO....OOOOOOOO X++", +"XoOOOOOOOO....Oo....OOOOOOOOo X+", +"XOOOOOOOOOo..oO....OOOOOOOOOO X+", +"XOOOOOOOOOOOOOo...OOOOOOOOOOO XX", +"XOOOOOOOOOOOOO...OOOOOOOOOOOO XX", +"XOOOOOOOOOOOOO..oOOOOOOOOOOOO XX", +"XOOOOOOOOOOOOO..OOOOOOOOOOOOO XX", +"XoOOOOOOOOOOOOOOOOOOOOOOOOOOo XX", +"+XOOOOOOOOOOOo..oOOOOOOOOOOO XXX", +"+XoOOOOOOOOOO....OOOOOOOOOOo XXX", +"++XOOOOOOOOOO....OOOOOOOOOO XXX+", +"+++ OOOOOOOOOo..oOOOOOOOOO XXXX+", +"++++ OOOOOOOOOOOOOOOOOOOO XXXX++", +"+++++ oOOOOOOOOOOOOOOOOo XXXX+++", +"++++++ oOOOOOOOOOOOOo XXXX++++", +"+++++++X oOOOOOOo XXXXX+++++", +"++++++++XXX oOOO XXXXXXX++++++", +"++++++++++XXXX OOO XXXXX++++++++", +"+++++++++++++X OOO XX+++++++++++", +"+++++++++++++++ OO XX+++++++++++", +"++++++++++++++++ O XX+++++++++++", +"+++++++++++++++++ XX+++++++++++", +"++++++++++++++++++XXX+++++++++++", +"+++++++++++++++++++XX+++++++++++" +}; diff --git a/Externals/wxWidgets/art/home.xpm b/Externals/wxWidgets/art/home.xpm new file mode 100644 index 0000000000..5bb2d0c68b --- /dev/null +++ b/Externals/wxWidgets/art/home.xpm @@ -0,0 +1,24 @@ +/* XPM */ +static char *home_xpm[] = { +/* columns rows colors chars-per-pixel */ +"16 15 3 1", +". c Black", +"X c #FFFFFF", +" c None", +/* pixels */ +" .... ", +" .XXXX. ", +" .XXXXXX. ", +" .XXXXXXXX. ", +" .XXXXXXXXXX. ", +" .............. ", +" .XXXXXXXXXXXX. ", +" .XXXXXXXXXXXX. ", +" .XXXXXXXXXXXX. ", +" .X.....X....X. ", +" .X. .X. .X. ", +" .X. .X. .X. ", +" .X.....X. .X. ", +" .XXXXXXX. .X. ", +" ......... ... " +}; diff --git a/Externals/wxWidgets/art/htmbook.xpm b/Externals/wxWidgets/art/htmbook.xpm new file mode 100644 index 0000000000..c219b59e5c --- /dev/null +++ b/Externals/wxWidgets/art/htmbook.xpm @@ -0,0 +1,25 @@ +/* XPM */ +static char * htmbook_xpm[] = { +"16 16 6 1", +" c None", +". c Black", +"X c #000080", +"o c #c0c0c0", +"O c #808080", +"+ c Gray100", +" ", +" .. ", +" ..XX. ", +" ..XXXXX. ", +" ..XXXXXXXX. ", +".oXXXXXXXXXX. ", +".XoXXXXXXXXXX. ", +".XXoXXXXXXXXXX. ", +".XXXoXXXXXXXXX..", +".XXXXoXXXXXX..O ", +" .XXXXoXXX..O+O ", +" .XXXXo..O++o..", +" .XXX.O+++o.. ", +" .XX.o+o.. ", +" .X.o.. ", +" ... "}; diff --git a/Externals/wxWidgets/art/htmfoldr.xpm b/Externals/wxWidgets/art/htmfoldr.xpm new file mode 100644 index 0000000000..d7a1c7139a --- /dev/null +++ b/Externals/wxWidgets/art/htmfoldr.xpm @@ -0,0 +1,25 @@ +/* XPM */ +static char * htmfoldr_xpm[] = { +"16 16 6 1", +" c None", +". c Black", +"X c #000080", +"o c #c0c0c0", +"O c #808080", +"+ c Gray100", +" ", +" .. ", +" ..XX. ", +" ..XXXXX. ", +" ..XXXXXXXX. ", +".oXXXXXXXXXX. ", +".XoXXXXXXXXXX. ", +".XXoXXXXXXXXXX. ", +".XXXoXXXXXXXXX..", +".XXXXoXXXXXX..O ", +" .XXXXoXXX..O+O ", +" .XXXXo..O++o..", +" .XXX.O+++o.. ", +" .XX.o+o.. ", +" .X.o.. ", +" ... "}; diff --git a/Externals/wxWidgets/art/htmoptns.xpm b/Externals/wxWidgets/art/htmoptns.xpm new file mode 100644 index 0000000000..107bc67864 --- /dev/null +++ b/Externals/wxWidgets/art/htmoptns.xpm @@ -0,0 +1,20 @@ +/* XPM */ +static char * htmoptns_xpm[] = { +"16 15 2 1", +" c None", +". c #000000", +" ", +" .. ", +" ... ", +" .... ", +" . ... ", +" .. ... ", +" . .. ", +" .. ... ", +" . .. ", +" ......... ", +" .. ... ", +" . ... ", +" .. ... ", +" .... ....... ", +" "}; diff --git a/Externals/wxWidgets/art/htmpage.xpm b/Externals/wxWidgets/art/htmpage.xpm new file mode 100644 index 0000000000..8b4e60e8a2 --- /dev/null +++ b/Externals/wxWidgets/art/htmpage.xpm @@ -0,0 +1,23 @@ +/* XPM */ +static char * htmpage_xpm[] = { +"16 16 4 1", +" c None", +". c #808080", +"X c Gray100", +"o c Black", +" ", +" .......... ", +" .XXXXXXXX.. ", +" .XXXXXXXXooo ", +" .X......XXXo ", +" .XXXXXXXXXXo ", +" .X........Xo ", +" .XXXXXXXXXXo ", +" .X........Xo ", +" .XXXXXXXXXXo ", +" .X........Xo ", +" .XXXXXXXXXXo ", +" .X........Xo ", +" .XXXXXXXXXXo ", +" .XXXXXXXXXXo ", +" oooooooooooo "}; diff --git a/Externals/wxWidgets/art/htmsidep.xpm b/Externals/wxWidgets/art/htmsidep.xpm new file mode 100644 index 0000000000..d71129f9e2 --- /dev/null +++ b/Externals/wxWidgets/art/htmsidep.xpm @@ -0,0 +1,27 @@ +/* XPM */ +static char *htmsidep_xpm[] = { +/* columns rows colors chars-per-pixel */ +"16 15 6 1", +". c Black", +"X c #FFFFFF", +"+ c #808080", +" c None", +"O c #0000C0", +"o c #C0C0C0", +/* pixels */ +" ", +" .............. ", +" .XXXX.ooooooo. ", +" .XOXX.oo...oo. ", +" .XXOX.ooooooo. ", +" .OOOO.o...+.o. ", +" .XXOX.ooooooo. ", +" .XOXX.ooooooo. ", +" .XXXX.o..+ooo. ", +" .XXOX.ooooooo. ", +" .XOXX.o...+.o. ", +" .OOOO.ooooooo. ", +" .XOXX.o.+...o. ", +" .XXOX.ooooooo. ", +" .............. " +}; diff --git a/Externals/wxWidgets/art/listview.xpm b/Externals/wxWidgets/art/listview.xpm new file mode 100644 index 0000000000..9d8d804c02 --- /dev/null +++ b/Externals/wxWidgets/art/listview.xpm @@ -0,0 +1,25 @@ +/* XPM */ +static char *listview_xpm[] = { +/* columns rows colors chars-per-pixel */ +"16 15 4 1", +" c Black", +". c #FFFFFF", +"X c #000084", +"o c #848484", +/* pixels */ +" ", +" .............. ", +" .XXX.......... ", +" .XXX. o o . ", +" .XXX.......... ", +" .............. ", +" .XXX.......... ", +" .XXX. o . ", +" .XXX.......... ", +" .............. ", +" .XXX.......... ", +" .XXX. o o . ", +" .XXX.......... ", +" .............. ", +" " +}; diff --git a/Externals/wxWidgets/art/missimg.xpm b/Externals/wxWidgets/art/missimg.xpm new file mode 100644 index 0000000000..f235f6277c --- /dev/null +++ b/Externals/wxWidgets/art/missimg.xpm @@ -0,0 +1,43 @@ +/* XPM */ +static char *missimg_xpm[] = { +/* columns rows colors chars-per-pixel */ +"32 32 5 1", +"X c Black", +"o c #FFFFFF", +" c None", +". c #C0C0C0", +"O c #E0E0E0", +/* pixels */ +" .............................X ", +" .ooooooooooooooooooooooooooooX ", +" .ooooooooooooooooooooooooooooX ", +" .ooOOOOOOOOOOOOOOOOOOOOOOOOooX ", +" .ooOOOOOOOOOOOOOOOOOOOOOOOOooX ", +" .ooOOOOOOOOOOOOOOOOOOOOOOOOooX ", +" .ooOOOOOOOOOOOOOOOOOOOOOOOOooX ", +" .ooOOOOOOOOOOOOOOOOOOOOOOOOooX ", +" .ooOOOOOOOOOOOOOOOOOOOOOOOOooX ", +" .ooOOOOOOOXOOOOOOOOOOOOOOOOooX ", +" XXXOOOOOXX XOOOOOOOOOOOOOOOooX ", +" XXXXX XOOOOOOOOOOOOOOooX ", +" XOOOXXXOOOOOOOooX ", +" XXX XXOOOOOooX ", +" XOOOOooX ", +" . XOOOooX ", +" .. XXOooX ", +" .o.. XooX ", +" .ooO... XXX ", +" .ooOOOO.......... ", +" .ooOOOOOOOOOOOOOO.. ", +" .ooOOOOOOOOOOOOOOOO.. ", +" .ooOOOOOOOOOOOOOOOOOO......... ", +" .ooOOOOOOOOOOOOOOOOOOOOOOOOooX ", +" .ooOOOOOOOOOOOOOOOOOOOOOOOOooX ", +" .ooOOOOOOOOOOOOOOOOOOOOOOOOooX ", +" .ooOOOOOOOOOOOOOOOOOOOOOOOOooX ", +" .ooOOOOOOOOOOOOOOOOOOOOOOOOooX ", +" .ooOOOOOOOOOOOOOOOOOOOOOOOOooX ", +" .ooooooooooooooooooooooooooooX ", +" .ooooooooooooooooooooooooooooX ", +" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX " +}; diff --git a/Externals/wxWidgets/art/motif/error.xpm b/Externals/wxWidgets/art/motif/error.xpm new file mode 100644 index 0000000000..e77c8e9fb6 --- /dev/null +++ b/Externals/wxWidgets/art/motif/error.xpm @@ -0,0 +1,58 @@ +/* XPM */ +static char *error_xpm[] = { +/* columns rows colors chars-per-pixel */ +"48 48 4 1", +" c None", +"X c #242424", +"o c #DCDF00", +". c #C00000", +/* pixels */ +" ", +" ", +" ", +" ", +" ", +" ..... ", +" ............. ", +" ................. ", +" ................... ", +" ....................... ", +" ......................... ", +" ........................... ", +" ...........................X ", +" .............................X ", +" ............................... ", +" ...............................X ", +" .................................X ", +" .................................X ", +" .................................XX ", +" ...ooooooooooooooooooooooooooo...XX ", +" ....ooooooooooooooooooooooooooo....X ", +" ....ooooooooooooooooooooooooooo....X ", +" ....ooooooooooooooooooooooooooo....XX ", +" ....ooooooooooooooooooooooooooo....XX ", +" ....ooooooooooooooooooooooooooo....XX ", +" ...ooooooooooooooooooooooooooo...XXX ", +" ...ooooooooooooooooooooooooooo...XXX ", +" .................................XX ", +" .................................XX ", +" ...............................XXX ", +" ...............................XXX ", +" .............................XXX ", +" ...........................XXXX ", +" ...........................XXX ", +" .........................XXX ", +" .......................XXXX ", +" X...................XXXXX ", +" X.................XXXXX ", +" X.............XXXXX ", +" XXXX.....XXXXXXXX ", +" XXXXXXXXXXXXX ", +" XXXXX ", +" ", +" ", +" ", +" ", +" ", +" " +}; diff --git a/Externals/wxWidgets/art/motif/info.xpm b/Externals/wxWidgets/art/motif/info.xpm new file mode 100644 index 0000000000..8892f504c1 --- /dev/null +++ b/Externals/wxWidgets/art/motif/info.xpm @@ -0,0 +1,63 @@ +/* XPM */ +static char *info_xpm[] = { +/* columns rows colors chars-per-pixel */ +"48 48 9 1", +"$ c Black", +"O c #FFFFFF", +"@ c #808080", +"+ c #000080", +"o c #E8EB01", +" c None", +"X c #FFFF40", +"# c #C0C0C0", +". c #ABAD01", +/* pixels */ +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ..... ", +" ..XXXXX.. ", +" ..XXXXXXXXo.. ", +" .XXXOXXXXXXXoo. ", +" .XOOXXX+XXXXXo. ", +" .XOOOXX+++XXXXoo. ", +" .XOOXXX+++XXXXXo. ", +" .XOOOXXX+++XXXXXXo. ", +" .XOOXXXX+++XXXXXXo. ", +" .XXXXXXX+++XXXXXXX. ", +" .XXXXXXX+++XXXXXXo. ", +" .XXXXXXX+++XXXXXoo. ", +" .XXXXXX+++XXXXXo. ", +" .XXXXXXX+XXXXXXo. ", +" .XXXXXXXXXXXXo. ", +" .XXXXX+++XXXoo. ", +" .XXXX+++XXoo. ", +" .XXXXXXXXo. ", +" ..XXXXXXo.. ", +" .XXXXXo.. ", +" @#######@ ", +" @@@@@@@@@ ", +" @#######@ ", +" @@@@@@@@@ ", +" @#######@ ", +" @@@@@@@ ", +" ### ", +" $$$ ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" " +}; diff --git a/Externals/wxWidgets/art/motif/question.xpm b/Externals/wxWidgets/art/motif/question.xpm new file mode 100644 index 0000000000..8b3cb01ef5 --- /dev/null +++ b/Externals/wxWidgets/art/motif/question.xpm @@ -0,0 +1,75 @@ +/* XPM */ +static char *question_xpm[] = { +/* columns rows colors chars-per-pixel */ +"48 48 21 1", +". c Black", +"> c #696969", +"O c #1F1F00", +"+ c #181818", +"o c #F6F900", +"; c #3F3F00", +"$ c #111111", +" c None", +"& c #202020", +"X c #AAAA00", +"@ c #949400", +": c #303030", +"1 c #383838", +"% c #2A2A00", +", c #404040", +"= c #B4B400", +"- c #484848", +"# c #151500", +"< c #9F9F00", +"2 c #6A6A00", +"* c #353500", +/* pixels */ +" ", +" ", +" ", +" ", +" ......... ", +" ...XXXXXXX.. ", +" ..XXXXoooooXXXO+ ", +" ..XXooooooooooooX@.. ", +" ..XoooooooooooooooXX#. ", +" $%XoooooooooooooooooXX#. ", +" &.XoooooooXXXXXXooooooXX.. ", +" .XooooooXX.$...$XXoooooX*. ", +" $.XoooooX%.$ .*oooooo=.. ", +" .XooooooX.. -.XoooooX.. ", +" .XoooooX..+ .XoooooX;. ", +" ...XXXX..: .XoooooX;. ", +" ........ >.XoooooX;. ", +" +.XoooooX.. ", +" ,.Xoooooo<.. ", +" 1#XooooooXO.. ", +" &#XooooooX2.. ", +" $%XooooooXX.. ", +" $%XooooooXX.. ", +" $%XooooooXX.. ", +" &.XooooooXX.. ", +" .XooooooXX.. ", +" &.XoooooXX.. ", +" ..XooooXX.. ", +" ..XooooX... ", +" ..XXooXX..& ", +" ...XXXXX.. ", +" ........ ", +" ", +" ", +" ....... ", +" ..XXXXX.. ", +" ..XXoooXX.. ", +" ..XoooooX.. ", +" ..XoooooX.. ", +" ..XXoooXX.. ", +" ..XXXXX.. ", +" ....... ", +" ", +" ", +" ", +" ", +" ", +" " +}; diff --git a/Externals/wxWidgets/art/motif/warning.xpm b/Externals/wxWidgets/art/motif/warning.xpm new file mode 100644 index 0000000000..92b7a70860 --- /dev/null +++ b/Externals/wxWidgets/art/motif/warning.xpm @@ -0,0 +1,63 @@ +/* XPM */ +static char *warning_xpm[] = { +/* columns rows colors chars-per-pixel */ +"48 48 9 1", +"@ c Black", +"o c #A6A800", +"+ c #8A8C00", +"$ c #B8BA00", +" c None", +"O c #6E7000", +"X c #DCDF00", +". c #C00000", +"# c #373800", +/* pixels */ +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" . ", +" ... ", +" ... ", +" ..... ", +" ...X.. ", +" ..XXX.. ", +" ...XXX... ", +" ..XXXXX.. ", +" ..XXXXXX... ", +" ...XXoO+XX.. ", +" ..XXXO@#XXX.. ", +" ..XXXXO@#XXX... ", +" ...XXXXO@#XXXX.. ", +" ..XXXXXO@#XXXX... ", +" ...XXXXXo@OXXXXX.. ", +" ...XXXXXXo@OXXXXXX.. ", +" ..XXXXXXX$@OXXXXXX... ", +" ...XXXXXXXX@XXXXXXXX.. ", +" ...XXXXXXXXXXXXXXXXXX... ", +" ..XXXXXXXXXXOXXXXXXXXX.. ", +" ...XXXXXXXXXO@#XXXXXXXXX.. ", +" ..XXXXXXXXXXX#XXXXXXXXXX... ", +" ...XXXXXXXXXXXXXXXXXXXXXXX.. ", +" ...XXXXXXXXXXXXXXXXXXXXXXXX... ", +" .............................. ", +" .............................. ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" " +}; diff --git a/Externals/wxWidgets/art/new.xpm b/Externals/wxWidgets/art/new.xpm new file mode 100644 index 0000000000..4c2641c663 --- /dev/null +++ b/Externals/wxWidgets/art/new.xpm @@ -0,0 +1,50 @@ +/* XPM */ +static char *new_xpm[] = { +/* columns rows colors chars-per-pixel */ +"16 15 29 1", +"* c #97C4E7", +"- c #72A8D2", +": c #FFFFFF", +"9 c #839CB5", +"o c #6B98B8", +"X c #5A89A6", +"# c #3A749C", +", c #D1E5F5", +"0 c #85A7BC", +"$ c #C3DDF1", +"8 c #749BB4", +"; c #5F9BC8", +" c None", +"+ c #538DB3", +"= c #85BBE2", +"3 c #EFF6FC", +"O c #6591AE", +"5 c #F7FBFD", +"7 c #FAFCFE", +"< c #DAEAF7", +"4 c #E9F3FA", +"6 c #FDFDFE", +"1 c #E2EFF8", +". c #8EA9BC", +"% c #B6D5EE", +"& c #A5CCEA", +"> c #ACE95B", +"2 c #F4F9FD", +"@ c #4581AA", +/* pixels */ +" .XoOO+@#. ", +" .$$%&*=O-; ", +" @@@@$%&*O:*o ", +" @>>@$$%&O::*o ", +"@@@>>@@@$%OOoO+ ", +"@>>>>>>@,$%&*=+ ", +"@>>>>>>@<,$%&*+ ", +"@@@>>@@@1<,$%&O ", +" @>>@2341<,$%O ", +" @@@@52341<,$o ", +" .:6752341<,8 ", +" .::6752341<8 ", +" .:::67523419 ", +" .::::6752340 ", +" ............ " +}; diff --git a/Externals/wxWidgets/art/new_dir.xpm b/Externals/wxWidgets/art/new_dir.xpm new file mode 100644 index 0000000000..45ff9e6583 --- /dev/null +++ b/Externals/wxWidgets/art/new_dir.xpm @@ -0,0 +1,43 @@ +/* XPM */ +static char *new_dir_xpm[] = { +/* columns rows colors chars-per-pixel */ +"16 15 22 1", +"X c Black", +"> c #9BACC2", +"o c #547897", +"1 c #7F99B4", +"O c #D1D9E5", +"< c #EAEDF3", +"# c #CAD2DC", +"3 c #718BA7", +"@ c #BECAD9", +"& c #E1E6EE", +"; c #F5F6F7", +". c #FFFF00", +", c #8DA0B9", +" c None", +"% c #D6DFE7", +"$ c #D2D9E0", +"- c #ADBACE", +"= c #EEF1F3", +"+ c #B3BFD1", +"2 c #7A90AC", +": c #A2B3C5", +"* c #E5EAF1", +/* pixels */ +" .X .XX.", +" ooooo .X.X. ", +" oOOOOo XX...XX", +" oooooooo.......", +" o+@#$%&*XX...XX", +" o+@#$%&*=.X.X. ", +" o-+@#O%&.X;.X .", +" o:-+@#O%&*=;o ", +" o>:-+@#O%&*=o ", +" o,>:-+@#O%&:-+@#O%&o ", +" o21,>:-+@#O%o ", +" o321,>:-+@#Oo ", +" ooooooooooooo ", +" " +}; diff --git a/Externals/wxWidgets/art/paste.xpm b/Externals/wxWidgets/art/paste.xpm new file mode 100644 index 0000000000..57e7f2a593 --- /dev/null +++ b/Externals/wxWidgets/art/paste.xpm @@ -0,0 +1,46 @@ +/* XPM */ +static char *paste_xpm[] = { +/* columns rows colors chars-per-pixel */ +"16 15 25 1", +"< c #FEECE4", +"> c #FEE3D7", +"O c #FFFFFF", +"o c #7B767D", +"% c #F79586", +"& c #CAE1F3", +"@ c #F08B62", +"# c #FCCBB8", +"- c #FDD8C9", +"4 c #FFF8F4", +"5 c #FFF5F0", +" c None", +"$ c #F8AA8F", +", c #EFF6FC", +"1 c #F7FBFD", +"2 c #FAFCFE", +"; c #DAEAF7", +": c #E9F3FA", +"6 c #FFFAF8", +". c #3C78A6", +"3 c #FFF1ED", +"X c #9B8687", +"+ c #FBBCA4", +"* c #B6D5EE", +"= c #F4F9FD", +/* pixels */ +" ...... ", +" .XoOOOOoo. ", +".+XOOOOOOX@. ", +".+XXXXXXXX@. ", +".#++$$%@..... ", +".##++$$%.&*.=. ", +".-##++$$.;&.==. ", +".--##++$.:;.... ", +".>--##++.,:;&*. ", +".<>--##+.1,:;&. ", +".<<>--##.21,:;. ", +".3<<>--#.O21=:. ", +".45<<>--....... ", +".6453<>----. ", +"............ " +}; diff --git a/Externals/wxWidgets/art/print.xpm b/Externals/wxWidgets/art/print.xpm new file mode 100644 index 0000000000..a090f99931 --- /dev/null +++ b/Externals/wxWidgets/art/print.xpm @@ -0,0 +1,60 @@ +/* XPM */ +static char *print_xpm[] = { +/* columns rows colors chars-per-pixel */ +"16 15 39 1", +"< c #E3E4E6", +"+ c #C3C3C4", +"i c #FFFFFF", +": c #74879B", +"# c #5A89A6", +"a c #F1F4F7", +"r c #5A809C", +"@ c #BDCCD9", +"e c #7A92A4", +"% c #3F6F93", +"t c #9FA2A6", +"3 c #939495", +"w c #5F666D", +"9 c #65839E", +"5 c #4A7291", +"$ c #4B7F9E", +" c None", +"O c #DFE0E2", +"o c #F3F3F3", +"; c #84A5BB", +"& c #467291", +". c #7897AD", +"* c #407598", +"4 c #CFCFD0", +"7 c #6F90A6", +"y c #6A89A2", +"0 c #AAADB2", +"1 c #D2D3D4", +"u c #4F7592", +", c #BCBDBE", +"p c #57778E", +"q c #979BA0", +"2 c #ABABAC", +"- c #E7E7E7", +"= c #D6DEE6", +"> c #9FA0A0", +"8 c #829EB5", +"X c #8FB0C3", +"6 c #5D7C93", +/* pixels */ +" .XXXXXXXX ", +" .oooooooX ", +" .OOOOOOOX ", +" .+++++++X ", +"@##$%&&&&&%*##@ ", +"$=-;:>,<123$-=$ ", +".44.5678.96$44. ", +"7,,,,,,,,,,,,,7 ", +"900qwwwwwwwe009 ", +"rtt9ryyyyyyuttr ", +"6qq6iiiiiii%qq6 ", +"633paiiiiii%336 ", +"XXX*iiiiiii%XXX ", +" 6iiiiiii% ", +" $XXXXXXX# " +}; diff --git a/Externals/wxWidgets/art/quit.xpm b/Externals/wxWidgets/art/quit.xpm new file mode 100644 index 0000000000..a2e25e9c1a --- /dev/null +++ b/Externals/wxWidgets/art/quit.xpm @@ -0,0 +1,90 @@ +/* XPM */ +static char *quit_xpm[] = { +/* columns rows colors chars-per-pixel */ +"16 15 69 1", +"@ c Black", +"i c #9AEA53", +"D c #7E9BB1", +"H c #839FB4", +", c #B7C7D3", +"8 c #BCCBD6", +"7 c #C1CFDA", +"v c #92ABBD", +"- c #D0DBE2", +"O c #547897", +"+ c #376485", +"L c #7090A8", +"t c #AEC0CE", +"g c #B3C4D1", +"S c #84A0B4", +"G c #89A4B8", +"> c #BDCCD7", +"F c #5A809C", +"2 c #C2D0DA", +"k c #93ACBE", +"= c #D6E0E6", +"* c #446A8C", +"z c #A5B9C8", +"# c #DEE5EB", +"0 c #AFC1CE", +"r c #B4C5D2", +"p c #B9C9D5", +"A c #8AA5B8", +"M c #92AABD", +"j c #A6BAC9", +"K c #7796AC", +"l c #ABBECC", +"o c #E4EAEF", +"9 c #B5C6D2", +" c None", +"; c #C9D6DF", +"X c #305F81", +"m c #98AFC0", +"V c #9DB3C3", +"% c #D1DBE3", +"u c #A2B7C6", +"y c #A7BBCA", +"h c #ACBFCD", +"4 c #B6C7D3", +"w c #C0CFD9", +"d c #982106", +"B c #85A0B5", +"6 c #C8D4DE", +"c c #99B0C1", +"x c #9EB4C4", +"$ c #D7E0E7", +"q c #A8BCCA", +"s c #ADC0CD", +"3 c #BCCCD7", +"N c #8BA5B9", +": c #C4D1DB", +"1 c #C9D5DE", +"f c #9AB1C2", +"n c #A4B9C8", +"a c #B3C5D1", +". c #215579", +"J c #7D9AB0", +"& c #829EB5", +"e c #BBCAD6", +"b c #8CA6B9", +"Z c #91AABC", +"C c #96AEC0", +"< c #CFDAE2", +"5 c #AFC2CF", +/* pixels */ +" ..XXXXXXXXXX ", +" XoO+X@@@@@@X ", +" X#$%&X*@@@@X ", +" X=-;:>,X@@@X ", +" X<12345X@@@X ", +" X67890qX@XXX ", +" XwertyuX@XiX ", +" XpasddfX++iiX ", +" XghjddkXiiiiiX ", +" XlzxcvbXiiiiiiX", +" XnxmMNBXiiiiiX ", +" XVCZASDXXXiiX ", +" XXFGHJKX XiX ", +" FXXFLX XX ", +" XX* " +}; diff --git a/Externals/wxWidgets/art/redo.xpm b/Externals/wxWidgets/art/redo.xpm new file mode 100644 index 0000000000..442c1d036b --- /dev/null +++ b/Externals/wxWidgets/art/redo.xpm @@ -0,0 +1,58 @@ +/* XPM */ +static char *redo_xpm[] = { +/* columns rows colors chars-per-pixel */ +"16 15 37 1", +"4 c #9BACC2", +"; c #4C7398", +"3 c #547B99", +"* c #547897", +"# c #5A89A6", +"8 c #3A749C", +"5 c #5A809C", +", c #7F99B4", +"& c #3F6F93", +"9 c #85A7BC", +"+ c #749BB4", +"> c #718BA7", +"e c #A5B3C8", +"w c #BECAD9", +": c #65839D", +"u c #E1E6EE", +"o c #236289", +"r c #ADBED2", +"= c #597B9A", +"2 c #8DA0B9", +" c None", +"% c #467291", +"1 c #7393AB", +"i c #4C809F", +"- c #A0BACB", +"O c #6591AE", +"X c #407598", +"6 c #6F90A6", +"t c #D2D9E0", +"7 c #ADBACE", +"@ c #326A8F", +"0 c #467A9C", +". c #ACC4D3", +"< c #7F97B0", +"y c #B3BFD1", +"q c #A2B3C5", +"$ c #8FB0C3", +/* pixels */ +" .XoooO ", +" +o@@@@@o# +", +" $@%%&@&%%&@ +o", +" X*=@+-+@*=;@#&@", +" @:=+ @=:=*:@", +" &>:$ @:>>>@", +" &,,,,&", +" +123 @<2222&", +" X44X #@56<44X", +" O1748 .9#&o", +" 0qwe8 ", +" 8rty8 ", +" 8wu+ ", +" i## ", +" " +}; diff --git a/Externals/wxWidgets/art/removable.xpm b/Externals/wxWidgets/art/removable.xpm new file mode 100644 index 0000000000..1036c8f4d3 --- /dev/null +++ b/Externals/wxWidgets/art/removable.xpm @@ -0,0 +1,44 @@ +/* XPM */ +static char *removable_xpm[] = { +/* columns rows colors chars-per-pixel */ +"16 15 23 1", +"@ c #C3C3C4", +"4 c #FFFFFF", +"o c #D5D6D8", +"> c #7A92A3", +". c #8497A5", +"% c #ACAEB2", +"2 c #4A7898", +": c #DCE2EA", +", c #F5F6F7", +"= c #EBEBEC", +"$ c #B7B7B8", +" c None", +"X c #DFE0E2", +"* c #A6A8AD", +"1 c #4C809F", +"3 c #407598", +"O c #CFCFD0", +"; c #9EA2A8", +"# c #BCBDBE", +"+ c #C6C8CA", +"- c #979BA0", +"& c #E7E7E7", +"< c #8FB0C3", +/* pixels */ +" ......... ", +" .XoO+@#$%. ", +" .XoO+@#$%. ", +" .&XoO+@#$%*. ", +" .&XoO+@#$%*. ", +" .=&XoO+@#$%*-. ", +" .=&XoO+@#$%*;. ", +".:=&XoO+@#$%*;>.", +".,=&XoO+@#$%*;-.", +"<..............<", +"<,=&XoO+@#$%%%%.", +" c #718BA7", +"0 c #A5B3C8", +"q c #BECAD9", +": c #65839D", +"u c #E1E6EE", +"X c #236289", +"y c #ADBED2", +"= c #597B9A", +"1 c #8DA0B9", +" c None", +"% c #467291", +"3 c #7393AB", +"i c #4C809F", +"; c #A0BACB", +". c #6591AE", +"o c #407598", +"5 c #6F90A6", +"t c #D2D9E0", +"9 c #ADBACE", +"# c #326A8F", +"e c #467A9C", +"O c #ACC4D3", +"< c #7F97B0", +"r c #B3BFD1", +"w c #A2B3C5", +"& c #8FB0C3", +/* pixels */ +" .XXXoO ", +"+ @X#####X+ ", +"X+ #$%%$#$%%#& ", +"#$@#*=-#+;+#=-o ", +"#:-=:=# +=:# ", +"#>>>:# &:>$ ", +"$,,,>o o<,$ ", +"$1111<# 213+ ", +"o44<56#@ o44o ", +"X$@7O 8493. ", +" 80qwe ", +" 8rty8 ", +" +uq8 ", +" @@i ", +" " +}; diff --git a/Externals/wxWidgets/art/up.xpm b/Externals/wxWidgets/art/up.xpm new file mode 100644 index 0000000000..57d1168837 --- /dev/null +++ b/Externals/wxWidgets/art/up.xpm @@ -0,0 +1,21 @@ +/* XPM */ +static char * up_xpm[] = { +"16 15 3 1", +" c None", +". c Black", +"X c Gray100", +" ", +" .. ", +" .XX. ", +" .XXXX. ", +" .XXXXXX. ", +" .XXXXXXXX. ", +" ....XXXX.... ", +" .XXXX. ", +" .XXXX. ", +" .XXXX. ", +" .XXXX. ", +" .XXXX. ", +" .XXXX. ", +" ...... ", +" "}; diff --git a/Externals/wxWidgets/art/wxwin.ico b/Externals/wxWidgets/art/wxwin.ico new file mode 100644 index 0000000000..8d2dc18c6b Binary files /dev/null and b/Externals/wxWidgets/art/wxwin.ico differ diff --git a/Externals/wxWidgets/art/wxwin16x16.png b/Externals/wxWidgets/art/wxwin16x16.png new file mode 100644 index 0000000000..e07faeb73f Binary files /dev/null and b/Externals/wxWidgets/art/wxwin16x16.png differ diff --git a/Externals/wxWidgets/art/wxwin16x16.xpm b/Externals/wxWidgets/art/wxwin16x16.xpm new file mode 100644 index 0000000000..c737fbb802 --- /dev/null +++ b/Externals/wxWidgets/art/wxwin16x16.xpm @@ -0,0 +1,25 @@ +/* XPM */ +static char *wxwin16x16_xpm[] = { +"16 16 6 1", +" c None", +". c #000000", +"X c #000084", +"o c #FFFFFF", +"O c #FFFF00", +"+ c #FF0000", +" ", +" ", +" ....... ", +" .XXXXX. ", +" .oXXXX. ", +" .oXXX.......", +".....oXXX.OOOOO.", +".+++.XXXX.oOOOO.", +".o++......oOOOO.", +".o++++. .oOOOO.", +".o++++. .OOOOO.", +".+++++. .......", +"....... ", +" ", +" ", +" "}; diff --git a/Externals/wxWidgets/art/wxwin32x32.png b/Externals/wxWidgets/art/wxwin32x32.png new file mode 100644 index 0000000000..20eda44161 Binary files /dev/null and b/Externals/wxWidgets/art/wxwin32x32.png differ diff --git a/Externals/wxWidgets/art/wxwin32x32.xpm b/Externals/wxWidgets/art/wxwin32x32.xpm new file mode 100644 index 0000000000..34b841a0e8 --- /dev/null +++ b/Externals/wxWidgets/art/wxwin32x32.xpm @@ -0,0 +1,41 @@ +/* XPM */ +static char *wxwin32x32_xpm[] = { +"32 32 6 1", +" c None", +". c #000000", +"X c #000084", +"o c #FFFFFF", +"O c #FFFF00", +"+ c #FF0000", +" ", +" ", +" ", +" ", +" ", +" .............. ", +" .XXXXXXXXXXXX. ", +" .XXXXXXXXXXXX. ", +" .XooXXXXXXXXX. ", +" .XooXXXXXXXXX. ", +" .XooXXXXXXXXX. ", +" .XooXXXXXX..............", +" .XooXXXXXX.OOOOOOOOOOOO.", +".........XooXXXXXX.OOOOOOOOOOOO.", +".+++++++.XooXXXXXX.OooOOOOOOOOO.", +".+++++++.XooXXXXXX.OooOOOOOOOOO.", +".+oo++++.XXXXXXXXX.OooOOOOOOOOO.", +".+oo++++.XXXXXXXXX.OooOOOOOOOOO.", +".+oo++++...........OooOOOOOOOOO.", +".+oo+++++++++. .OooOOOOOOOOO.", +".+oo+++++++++. .OooOOOOOOOOO.", +".+oo+++++++++. .OooOOOOOOOOO.", +".+oo+++++++++. .OOOOOOOOOOOO.", +".+oo+++++++++. .OOOOOOOOOOOO.", +".++++++++++++. ..............", +".++++++++++++. ", +".............. ", +" ", +" ", +" ", +" ", +" "}; diff --git a/Externals/wxWidgets/build/msw/wx_base.vcproj b/Externals/wxWidgets/build/msw/wx_base.vcproj new file mode 100644 index 0000000000..657287285a --- /dev/null +++ b/Externals/wxWidgets/build/msw/wx_base.vcproj @@ -0,0 +1,6397 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Externals/wxWidgets/build/msw/wx_core.vcproj b/Externals/wxWidgets/build/msw/wx_core.vcproj new file mode 100644 index 0000000000..ba5660411a --- /dev/null +++ b/Externals/wxWidgets/build/msw/wx_core.vcproj @@ -0,0 +1,20127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Externals/wxWidgets/include/msvc/wx/setup.h b/Externals/wxWidgets/include/msvc/wx/setup.h new file mode 100644 index 0000000000..7cc58760bb --- /dev/null +++ b/Externals/wxWidgets/include/msvc/wx/setup.h @@ -0,0 +1,249 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: msvc/wx/msw/setup.h +// Purpose: wrapper around the real wx/setup.h for Visual C++ +// Author: Vadim Zeitlin +// Modified by: +// Created: 2004-12-12 +// RCS-ID: $Id: setup.h 43687 2006-11-27 15:03:59Z VZ $ +// Copyright: (c) 2004 Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// VC++ IDE predefines _DEBUG and _UNICODE for the new projects itself, but +// the other symbols (WXUSINGDLL, __WXUNIVERSAL__, ...) should be defined +// explicitly! + +#ifdef _MSC_VER + #ifdef _UNICODE + #ifdef WXUSINGDLL + #ifdef _DEBUG + #include "../../../lib/vc_dll/mswud/wx/setup.h" + #else + #include "../../../lib/vc_dll/mswu/wx/setup.h" + #endif + #else + #ifdef _DEBUG + #include "../../../lib/vc_lib/mswud/wx/setup.h" + #else + #include "../../../lib/vc_lib/mswu/wx/setup.h" + #endif + #endif + + #ifdef _DEBUG + #pragma comment(lib,"wxbase28ud") + #pragma comment(lib,"wxbase28ud_net") + #pragma comment(lib,"wxbase28ud_xml") + #if wxUSE_REGEX + #pragma comment(lib,"wxregexud") + #endif + + #if wxUSE_GUI + #if wxUSE_XML + #pragma comment(lib,"wxexpatd") + #endif + #if wxUSE_LIBJPEG + #pragma comment(lib,"wxjpegd") + #endif + #if wxUSE_LIBPNG + #pragma comment(lib,"wxpngd") + #endif + #if wxUSE_LIBTIFF + #pragma comment(lib,"wxtiffd") + #endif + #if wxUSE_ZLIB + #pragma comment(lib,"wxzlibd") + #endif + #pragma comment(lib,"wxmsw28ud_adv") + #pragma comment(lib,"wxmsw28ud_core") + #pragma comment(lib,"wxmsw28ud_html") + #if wxUSE_GLCANVAS + #pragma comment(lib,"wxmsw28ud_gl") + #endif + #if wxUSE_DEBUGREPORT + #pragma comment(lib,"wxmsw28ud_qa") + #endif + #if wxUSE_XRC + #pragma comment(lib,"wxmsw28ud_xrc") + #endif + #if wxUSE_AUI + #pragma comment(lib,"wxmsw28ud_aui") + #endif + #if wxUSE_RICHTEXT + #pragma comment(lib,"wxmsw28ud_richtext") + #endif + #if wxUSE_MEDIACTRL + #pragma comment(lib,"wxmsw28ud_media") + #endif + #if wxUSE_ODBC + #pragma comment(lib,"wxbase28ud_odbc") + #endif + #endif // wxUSE_GUI + #else // release + #pragma comment(lib,"wxbase28u") + #pragma comment(lib,"wxbase28u_net") + #pragma comment(lib,"wxbase28u_xml") + #if wxUSE_REGEX + #pragma comment(lib,"wxregexu") + #endif + + #if wxUSE_GUI + #if wxUSE_XML + #pragma comment(lib,"wxexpat") + #endif + #if wxUSE_LIBJPEG + #pragma comment(lib,"wxjpeg") + #endif + #if wxUSE_LIBPNG + #pragma comment(lib,"wxpng") + #endif + #if wxUSE_LIBTIFF + #pragma comment(lib,"wxtiff") + #endif + #if wxUSE_ZLIB + #pragma comment(lib,"wxzlib") + #endif + #pragma comment(lib,"wxmsw28u_adv") + #pragma comment(lib,"wxmsw28u_core") + #pragma comment(lib,"wxmsw28u_html") + #if wxUSE_GLCANVAS + #pragma comment(lib,"wxmsw28u_gl") + #endif + #if wxUSE_DEBUGREPORT + #pragma comment(lib,"wxmsw28u_qa") + #endif + #if wxUSE_XRC + #pragma comment(lib,"wxmsw28u_xrc") + #endif + #if wxUSE_AUI + #pragma comment(lib,"wxmsw28u_aui") + #endif + #if wxUSE_RICHTEXT + #pragma comment(lib,"wxmsw28u_richtext") + #endif + #if wxUSE_MEDIACTRL + #pragma comment(lib,"wxmsw28u_media") + #endif + #if wxUSE_ODBC + #pragma comment(lib,"wxbase28u_odbc") + #endif + #endif // wxUSE_GUI + #endif // debug/release + #else // !_UNICODE + #ifdef WXUSINGDLL + #ifdef _DEBUG + #include "../../../lib/vc_dll/mswd/wx/setup.h" + #else + #include "../../../lib/vc_dll/msw/wx/setup.h" + #endif + #else // static lib + #ifdef _DEBUG + #include "../../../lib/vc_lib/mswd/wx/setup.h" + #else + #include "../../../lib/vc_lib/msw/wx/setup.h" + #endif + #endif // shared/static + + #ifdef _DEBUG + #pragma comment(lib,"wxbase28d") + #pragma comment(lib,"wxbase28d_net") + #pragma comment(lib,"wxbase28d_xml") + #if wxUSE_REGEX + #pragma comment(lib,"wxregexd") + #endif + + #if wxUSE_GUI + #if wxUSE_XML + #pragma comment(lib,"wxexpatd") + #endif + #if wxUSE_LIBJPEG + #pragma comment(lib,"wxjpegd") + #endif + #if wxUSE_LIBPNG + #pragma comment(lib,"wxpngd") + #endif + #if wxUSE_LIBTIFF + #pragma comment(lib,"wxtiffd") + #endif + #if wxUSE_ZLIB + #pragma comment(lib,"wxzlibd") + #endif + #pragma comment(lib,"wxmsw28d_adv") + #pragma comment(lib,"wxmsw28d_core") + #pragma comment(lib,"wxmsw28d_html") + #if wxUSE_GLCANVAS + #pragma comment(lib,"wxmsw28d_gl") + #endif + #if wxUSE_DEBUGREPORT + #pragma comment(lib,"wxmsw28d_qa") + #endif + #if wxUSE_XRC + #pragma comment(lib,"wxmsw28d_xrc") + #endif + #if wxUSE_AUI + #pragma comment(lib,"wxmsw28d_aui") + #endif + #if wxUSE_RICHTEXT + #pragma comment(lib,"wxmsw28d_richtext") + #endif + #if wxUSE_MEDIACTRL + #pragma comment(lib,"wxmsw28d_media") + #endif + #if wxUSE_ODBC + #pragma comment(lib,"wxbase28d_odbc") + #endif + #endif // wxUSE_GUI + #else // release + #pragma comment(lib,"wxbase28") + #pragma comment(lib,"wxbase28_net") + #pragma comment(lib,"wxbase28_xml") + #if wxUSE_REGEX + #pragma comment(lib,"wxregex") + #endif + + #if wxUSE_GUI + #if wxUSE_XML + #pragma comment(lib,"wxexpat") + #endif + #if wxUSE_LIBJPEG + #pragma comment(lib,"wxjpeg") + #endif + #if wxUSE_LIBPNG + #pragma comment(lib,"wxpng") + #endif + #if wxUSE_LIBTIFF + #pragma comment(lib,"wxtiff") + #endif + #if wxUSE_ZLIB + #pragma comment(lib,"wxzlib") + #endif + #pragma comment(lib,"wxmsw28_adv") + #pragma comment(lib,"wxmsw28_core") + #pragma comment(lib,"wxmsw28_html") + #if wxUSE_GLCANVAS + #pragma comment(lib,"wxmsw28_gl") + #endif + #if wxUSE_DEBUGREPORT + #pragma comment(lib,"wxmsw28_qa") + #endif + #if wxUSE_XRC + #pragma comment(lib,"wxmsw28_xrc") + #endif + #if wxUSE_AUI + #pragma comment(lib,"wxmsw28_aui") + #endif + #if wxUSE_RICHTEXT + #pragma comment(lib,"wxmsw28_richtext") + #endif + #if wxUSE_MEDIACTRL + #pragma comment(lib,"wxmsw28_media") + #endif + #if wxUSE_ODBC + #pragma comment(lib,"wxbase28_odbc") + #endif + #endif // wxUSE_GUI + #endif // debug/release + #endif // _UNICODE/!_UNICODE +#else + #error "This file should only be included when using Microsoft Visual C++" +#endif + diff --git a/Externals/wxWidgets/include/wx/aboutdlg.h b/Externals/wxWidgets/include/wx/aboutdlg.h new file mode 100644 index 0000000000..15b80f9916 --- /dev/null +++ b/Externals/wxWidgets/include/wx/aboutdlg.h @@ -0,0 +1,155 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/aboutdlg.h +// Purpose: declaration of wxAboutDialog class +// Author: Vadim Zeitlin +// Created: 2006-10-07 +// RCS-ID: $Id: aboutdlg.h 41813 2006-10-09 16:56:18Z RD $ +// Copyright: (c) 2006 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_ABOUTDLG_H_ +#define _WX_ABOUTDLG_H_ + +#include "wx/defs.h" + +#if wxUSE_ABOUTDLG + +#include "wx/app.h" +#include "wx/icon.h" + +// ---------------------------------------------------------------------------- +// wxAboutDialogInfo: information shown by the standard "About" dialog +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxAboutDialogInfo +{ +public: + // all fields are initially uninitialized + wxAboutDialogInfo() { } + + // accessors for various simply fields + // ----------------------------------- + + // name of the program, if not used defaults wxApp::GetAppName() + void SetName(const wxString& name) { m_name = name; } + wxString GetName() const + { return m_name.empty() ? wxTheApp->GetAppName() : m_name; } + + // version of the program, in free format (but without "version" word) + void SetVersion(const wxString& version) { m_version = version; } + bool HasVersion() const { return !m_version.empty(); } + wxString GetVersion() const { return m_version; } + + // brief, but possibly multiline, description of the program + void SetDescription(const wxString& desc) { m_description = desc; } + bool HasDescription() const { return !m_description.empty(); } + wxString GetDescription() const { return m_description; } + + // short string containing the program copyright information + void SetCopyright(const wxString& copyright) { m_copyright = copyright; } + bool HasCopyright() const { return !m_copyright.empty(); } + wxString GetCopyright() const { return m_copyright; } + + // long, multiline string containing the text of the program licence + void SetLicence(const wxString& licence) { m_licence = licence; } + void SetLicense(const wxString& licence) { m_licence = licence; } + bool HasLicence() const { return !m_licence.empty(); } + wxString GetLicence() const { return m_licence; } + + // icon to be shown in the dialog, defaults to the main frame icon + void SetIcon(const wxIcon& icon) { m_icon = icon; } + bool HasIcon() const { return m_icon.Ok(); } + wxIcon GetIcon() const; + + // web site for the program and its description (defaults to URL itself if + // empty) + void SetWebSite(const wxString& url, const wxString& desc = wxEmptyString) + { + m_url = url; + m_urlDesc = desc.empty() ? url : desc; + } + + bool HasWebSite() const { return !m_url.empty(); } + + wxString GetWebSiteURL() const { return m_url; } + wxString GetWebSiteDescription() const { return m_urlDesc; } + + // accessors for the arrays + // ------------------------ + + // the list of developers of the program + void SetDevelopers(const wxArrayString& developers) + { m_developers = developers; } + void AddDeveloper(const wxString& developer) + { m_developers.push_back(developer); } + + bool HasDevelopers() const { return !m_developers.empty(); } + const wxArrayString& GetDevelopers() const { return m_developers; } + + // the list of documentation writers + void SetDocWriters(const wxArrayString& docwriters) + { m_docwriters = docwriters; } + void AddDocWriter(const wxString& docwriter) + { m_docwriters.push_back(docwriter); } + + bool HasDocWriters() const { return !m_docwriters.empty(); } + const wxArrayString& GetDocWriters() const { return m_docwriters; } + + // the list of artists for the program art + void SetArtists(const wxArrayString& artists) + { m_artists = artists; } + void AddArtist(const wxString& artist) + { m_artists.push_back(artist); } + + bool HasArtists() const { return !m_artists.empty(); } + const wxArrayString& GetArtists() const { return m_artists; } + + // the list of translators + void SetTranslators(const wxArrayString& translators) + { m_translators = translators; } + void AddTranslator(const wxString& translator) + { m_translators.push_back(translator); } + + bool HasTranslators() const { return !m_translators.empty(); } + const wxArrayString& GetTranslators() const { return m_translators; } + + + // implementation only + // ------------------- + + // "simple" about dialog shows only textual information (with possibly + // default icon but without hyperlink nor any long texts such as the + // licence text) + bool IsSimple() const + { return !HasWebSite() && !HasIcon() && !HasLicence(); } + + // get the description and credits (i.e. all of developers, doc writers, + // artists and translators) as a one long multiline string + wxString GetDescriptionAndCredits() const; + +private: + wxString m_name, + m_version, + m_description, + m_copyright, + m_licence; + + wxIcon m_icon; + + wxString m_url, + m_urlDesc; + + wxArrayString m_developers, + m_docwriters, + m_artists, + m_translators; +}; + +// functions to show the about dialog box +WXDLLIMPEXP_ADV void wxAboutBox(const wxAboutDialogInfo& info); + +#endif // wxUSE_ABOUTDLG + +#endif // _WX_ABOUTDLG_H_ + diff --git a/Externals/wxWidgets/include/wx/accel.h b/Externals/wxWidgets/include/wx/accel.h new file mode 100644 index 0000000000..05c6f6c7d3 --- /dev/null +++ b/Externals/wxWidgets/include/wx/accel.h @@ -0,0 +1,171 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/accel.h +// Purpose: wxAcceleratorEntry and wxAcceleratorTable classes +// Author: Julian Smart, Robert Roebling, Vadim Zeitlin +// Modified by: +// Created: 31.05.01 (extracted from other files) +// RCS-ID: $Id: accel.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_ACCEL_H_BASE_ +#define _WX_ACCEL_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_ACCEL + +#include "wx/object.h" + +class WXDLLIMPEXP_FWD_CORE wxAcceleratorTable; +class WXDLLIMPEXP_FWD_CORE wxMenuItem; +class WXDLLIMPEXP_FWD_CORE wxKeyEvent; + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// wxAcceleratorEntry flags +enum +{ + wxACCEL_NORMAL = 0x0000, // no modifiers + wxACCEL_ALT = 0x0001, // hold Alt key down + wxACCEL_CTRL = 0x0002, // hold Ctrl key down + wxACCEL_SHIFT = 0x0004, // hold Shift key down +#if defined(__WXMAC__) || defined(__WXCOCOA__) + wxACCEL_CMD = 0x0008 // Command key on OS X +#else + wxACCEL_CMD = wxACCEL_CTRL +#endif +}; + +// ---------------------------------------------------------------------------- +// an entry in wxAcceleratorTable corresponds to one accelerator +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxAcceleratorEntry +{ +public: + wxAcceleratorEntry(int flags = 0, int keyCode = 0, int cmd = 0, + wxMenuItem *item = NULL) + : m_flags(flags) + , m_keyCode(keyCode) + , m_command(cmd) + , m_item(item) + { } + + wxAcceleratorEntry(const wxAcceleratorEntry& entry) + : m_flags(entry.m_flags) + , m_keyCode(entry.m_keyCode) + , m_command(entry.m_command) + , m_item(entry.m_item) + { } + + // create accelerator corresponding to the specified string, return NULL if + // string couldn't be parsed or a pointer to be deleted by the caller + static wxAcceleratorEntry *Create(const wxString& str); + + wxAcceleratorEntry& operator=(const wxAcceleratorEntry& entry) + { + Set(entry.m_flags, entry.m_keyCode, entry.m_command, entry.m_item); + return *this; + } + + void Set(int flags, int keyCode, int cmd, wxMenuItem *item = NULL) + { + m_flags = flags; + m_keyCode = keyCode; + m_command = cmd; + m_item = item; + } + + void SetMenuItem(wxMenuItem *item) { m_item = item; } + + int GetFlags() const { return m_flags; } + int GetKeyCode() const { return m_keyCode; } + int GetCommand() const { return m_command; } + + wxMenuItem *GetMenuItem() const { return m_item; } + + bool operator==(const wxAcceleratorEntry& entry) const + { + return m_flags == entry.m_flags && + m_keyCode == entry.m_keyCode && + m_command == entry.m_command && + m_item == entry.m_item; + } + + bool operator!=(const wxAcceleratorEntry& entry) const + { return !(*this == entry); } + +#if defined(__WXMOTIF__) + // Implementation use only + bool MatchesEvent(const wxKeyEvent& event) const; +#endif + + bool IsOk() const + { + return m_flags != 0 && + m_keyCode != 0; + } + + + // string <-> wxAcceleratorEntry conversion + // ---------------------------------------- + + // returns a wxString for the this accelerator. + // this function formats it using the - format + // where maybe a hyphen-separed list of "shift|alt|ctrl" + wxString ToString() const; + + // returns true if the given string correctly initialized this object + // (i.e. if IsOk() returns true after this call) + bool FromString(const wxString& str); + + +private: + // common part of Create() and FromString() + static bool ParseAccel(const wxString& str, int *flags, int *keycode); + + + int m_flags; // combination of wxACCEL_XXX constants + int m_keyCode; // ASCII or virtual keycode + int m_command; // Command id to generate + + // the menu item this entry corresponds to, may be NULL + wxMenuItem *m_item; + + // for compatibility with old code, use accessors now! + friend class WXDLLEXPORT wxMenu; +}; + +// ---------------------------------------------------------------------------- +// include wxAcceleratorTable class declaration, it is only used by the library +// and so doesn't have any published user visible interface +// ---------------------------------------------------------------------------- + +#if defined(__WXUNIVERSAL__) + #include "wx/generic/accel.h" +#elif defined(__WXMSW__) + #include "wx/msw/accel.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/accel.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/accel.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/accel.h" +#elif defined(__WXMAC__) + #include "wx/mac/accel.h" +#elif defined(__WXCOCOA__) + #include "wx/generic/accel.h" +#elif defined(__WXPM__) + #include "wx/os2/accel.h" +#endif + +extern WXDLLEXPORT_DATA(wxAcceleratorTable) wxNullAcceleratorTable; + +#endif // wxUSE_ACCEL + +#endif + // _WX_ACCEL_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/access.h b/Externals/wxWidgets/include/wx/access.h new file mode 100644 index 0000000000..01e54be23c --- /dev/null +++ b/Externals/wxWidgets/include/wx/access.h @@ -0,0 +1,377 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/access.h +// Purpose: Accessibility classes +// Author: Julian Smart +// Modified by: +// Created: 2003-02-12 +// RCS-ID: $Id: access.h 43047 2006-11-04 17:43:58Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_ACCESSBASE_H_ +#define _WX_ACCESSBASE_H_ + +// ---------------------------------------------------------------------------- +// headers we have to include here +// ---------------------------------------------------------------------------- + +#include "wx/defs.h" + +#if wxUSE_ACCESSIBILITY + +#include "wx/variant.h" + +typedef enum +{ + wxACC_FAIL, + wxACC_FALSE, + wxACC_OK, + wxACC_NOT_IMPLEMENTED, + wxACC_NOT_SUPPORTED +} wxAccStatus; + +// Child ids are integer identifiers from 1 up. +// So zero represents 'this' object. +#define wxACC_SELF 0 + +// Navigation constants + +typedef enum +{ + wxNAVDIR_DOWN, + wxNAVDIR_FIRSTCHILD, + wxNAVDIR_LASTCHILD, + wxNAVDIR_LEFT, + wxNAVDIR_NEXT, + wxNAVDIR_PREVIOUS, + wxNAVDIR_RIGHT, + wxNAVDIR_UP +} wxNavDir; + +// Role constants + +typedef enum { + wxROLE_NONE, + wxROLE_SYSTEM_ALERT, + wxROLE_SYSTEM_ANIMATION, + wxROLE_SYSTEM_APPLICATION, + wxROLE_SYSTEM_BORDER, + wxROLE_SYSTEM_BUTTONDROPDOWN, + wxROLE_SYSTEM_BUTTONDROPDOWNGRID, + wxROLE_SYSTEM_BUTTONMENU, + wxROLE_SYSTEM_CARET, + wxROLE_SYSTEM_CELL, + wxROLE_SYSTEM_CHARACTER, + wxROLE_SYSTEM_CHART, + wxROLE_SYSTEM_CHECKBUTTON, + wxROLE_SYSTEM_CLIENT, + wxROLE_SYSTEM_CLOCK, + wxROLE_SYSTEM_COLUMN, + wxROLE_SYSTEM_COLUMNHEADER, + wxROLE_SYSTEM_COMBOBOX, + wxROLE_SYSTEM_CURSOR, + wxROLE_SYSTEM_DIAGRAM, + wxROLE_SYSTEM_DIAL, + wxROLE_SYSTEM_DIALOG, + wxROLE_SYSTEM_DOCUMENT, + wxROLE_SYSTEM_DROPLIST, + wxROLE_SYSTEM_EQUATION, + wxROLE_SYSTEM_GRAPHIC, + wxROLE_SYSTEM_GRIP, + wxROLE_SYSTEM_GROUPING, + wxROLE_SYSTEM_HELPBALLOON, + wxROLE_SYSTEM_HOTKEYFIELD, + wxROLE_SYSTEM_INDICATOR, + wxROLE_SYSTEM_LINK, + wxROLE_SYSTEM_LIST, + wxROLE_SYSTEM_LISTITEM, + wxROLE_SYSTEM_MENUBAR, + wxROLE_SYSTEM_MENUITEM, + wxROLE_SYSTEM_MENUPOPUP, + wxROLE_SYSTEM_OUTLINE, + wxROLE_SYSTEM_OUTLINEITEM, + wxROLE_SYSTEM_PAGETAB, + wxROLE_SYSTEM_PAGETABLIST, + wxROLE_SYSTEM_PANE, + wxROLE_SYSTEM_PROGRESSBAR, + wxROLE_SYSTEM_PROPERTYPAGE, + wxROLE_SYSTEM_PUSHBUTTON, + wxROLE_SYSTEM_RADIOBUTTON, + wxROLE_SYSTEM_ROW, + wxROLE_SYSTEM_ROWHEADER, + wxROLE_SYSTEM_SCROLLBAR, + wxROLE_SYSTEM_SEPARATOR, + wxROLE_SYSTEM_SLIDER, + wxROLE_SYSTEM_SOUND, + wxROLE_SYSTEM_SPINBUTTON, + wxROLE_SYSTEM_STATICTEXT, + wxROLE_SYSTEM_STATUSBAR, + wxROLE_SYSTEM_TABLE, + wxROLE_SYSTEM_TEXT, + wxROLE_SYSTEM_TITLEBAR, + wxROLE_SYSTEM_TOOLBAR, + wxROLE_SYSTEM_TOOLTIP, + wxROLE_SYSTEM_WHITESPACE, + wxROLE_SYSTEM_WINDOW +} wxAccRole; + +// Object types + +typedef enum { + wxOBJID_WINDOW = 0x00000000, + wxOBJID_SYSMENU = 0xFFFFFFFF, + wxOBJID_TITLEBAR = 0xFFFFFFFE, + wxOBJID_MENU = 0xFFFFFFFD, + wxOBJID_CLIENT = 0xFFFFFFFC, + wxOBJID_VSCROLL = 0xFFFFFFFB, + wxOBJID_HSCROLL = 0xFFFFFFFA, + wxOBJID_SIZEGRIP = 0xFFFFFFF9, + wxOBJID_CARET = 0xFFFFFFF8, + wxOBJID_CURSOR = 0xFFFFFFF7, + wxOBJID_ALERT = 0xFFFFFFF6, + wxOBJID_SOUND = 0xFFFFFFF5 +} wxAccObject; + +// Accessible states + +#define wxACC_STATE_SYSTEM_ALERT_HIGH 0x00000001 +#define wxACC_STATE_SYSTEM_ALERT_MEDIUM 0x00000002 +#define wxACC_STATE_SYSTEM_ALERT_LOW 0x00000004 +#define wxACC_STATE_SYSTEM_ANIMATED 0x00000008 +#define wxACC_STATE_SYSTEM_BUSY 0x00000010 +#define wxACC_STATE_SYSTEM_CHECKED 0x00000020 +#define wxACC_STATE_SYSTEM_COLLAPSED 0x00000040 +#define wxACC_STATE_SYSTEM_DEFAULT 0x00000080 +#define wxACC_STATE_SYSTEM_EXPANDED 0x00000100 +#define wxACC_STATE_SYSTEM_EXTSELECTABLE 0x00000200 +#define wxACC_STATE_SYSTEM_FLOATING 0x00000400 +#define wxACC_STATE_SYSTEM_FOCUSABLE 0x00000800 +#define wxACC_STATE_SYSTEM_FOCUSED 0x00001000 +#define wxACC_STATE_SYSTEM_HOTTRACKED 0x00002000 +#define wxACC_STATE_SYSTEM_INVISIBLE 0x00004000 +#define wxACC_STATE_SYSTEM_MARQUEED 0x00008000 +#define wxACC_STATE_SYSTEM_MIXED 0x00010000 +#define wxACC_STATE_SYSTEM_MULTISELECTABLE 0x00020000 +#define wxACC_STATE_SYSTEM_OFFSCREEN 0x00040000 +#define wxACC_STATE_SYSTEM_PRESSED 0x00080000 +#define wxACC_STATE_SYSTEM_PROTECTED 0x00100000 +#define wxACC_STATE_SYSTEM_READONLY 0x00200000 +#define wxACC_STATE_SYSTEM_SELECTABLE 0x00400000 +#define wxACC_STATE_SYSTEM_SELECTED 0x00800000 +#define wxACC_STATE_SYSTEM_SELFVOICING 0x01000000 +#define wxACC_STATE_SYSTEM_UNAVAILABLE 0x02000000 + +// Selection flag + +typedef enum +{ + wxACC_SEL_NONE = 0, + wxACC_SEL_TAKEFOCUS = 1, + wxACC_SEL_TAKESELECTION = 2, + wxACC_SEL_EXTENDSELECTION = 4, + wxACC_SEL_ADDSELECTION = 8, + wxACC_SEL_REMOVESELECTION = 16 +} wxAccSelectionFlags; + +// Accessibility event identifiers + +#define wxACC_EVENT_SYSTEM_SOUND 0x0001 +#define wxACC_EVENT_SYSTEM_ALERT 0x0002 +#define wxACC_EVENT_SYSTEM_FOREGROUND 0x0003 +#define wxACC_EVENT_SYSTEM_MENUSTART 0x0004 +#define wxACC_EVENT_SYSTEM_MENUEND 0x0005 +#define wxACC_EVENT_SYSTEM_MENUPOPUPSTART 0x0006 +#define wxACC_EVENT_SYSTEM_MENUPOPUPEND 0x0007 +#define wxACC_EVENT_SYSTEM_CAPTURESTART 0x0008 +#define wxACC_EVENT_SYSTEM_CAPTUREEND 0x0009 +#define wxACC_EVENT_SYSTEM_MOVESIZESTART 0x000A +#define wxACC_EVENT_SYSTEM_MOVESIZEEND 0x000B +#define wxACC_EVENT_SYSTEM_CONTEXTHELPSTART 0x000C +#define wxACC_EVENT_SYSTEM_CONTEXTHELPEND 0x000D +#define wxACC_EVENT_SYSTEM_DRAGDROPSTART 0x000E +#define wxACC_EVENT_SYSTEM_DRAGDROPEND 0x000F +#define wxACC_EVENT_SYSTEM_DIALOGSTART 0x0010 +#define wxACC_EVENT_SYSTEM_DIALOGEND 0x0011 +#define wxACC_EVENT_SYSTEM_SCROLLINGSTART 0x0012 +#define wxACC_EVENT_SYSTEM_SCROLLINGEND 0x0013 +#define wxACC_EVENT_SYSTEM_SWITCHSTART 0x0014 +#define wxACC_EVENT_SYSTEM_SWITCHEND 0x0015 +#define wxACC_EVENT_SYSTEM_MINIMIZESTART 0x0016 +#define wxACC_EVENT_SYSTEM_MINIMIZEEND 0x0017 +#define wxACC_EVENT_OBJECT_CREATE 0x8000 +#define wxACC_EVENT_OBJECT_DESTROY 0x8001 +#define wxACC_EVENT_OBJECT_SHOW 0x8002 +#define wxACC_EVENT_OBJECT_HIDE 0x8003 +#define wxACC_EVENT_OBJECT_REORDER 0x8004 +#define wxACC_EVENT_OBJECT_FOCUS 0x8005 +#define wxACC_EVENT_OBJECT_SELECTION 0x8006 +#define wxACC_EVENT_OBJECT_SELECTIONADD 0x8007 +#define wxACC_EVENT_OBJECT_SELECTIONREMOVE 0x8008 +#define wxACC_EVENT_OBJECT_SELECTIONWITHIN 0x8009 +#define wxACC_EVENT_OBJECT_STATECHANGE 0x800A +#define wxACC_EVENT_OBJECT_LOCATIONCHANGE 0x800B +#define wxACC_EVENT_OBJECT_NAMECHANGE 0x800C +#define wxACC_EVENT_OBJECT_DESCRIPTIONCHANGE 0x800D +#define wxACC_EVENT_OBJECT_VALUECHANGE 0x800E +#define wxACC_EVENT_OBJECT_PARENTCHANGE 0x800F +#define wxACC_EVENT_OBJECT_HELPCHANGE 0x8010 +#define wxACC_EVENT_OBJECT_DEFACTIONCHANGE 0x8011 +#define wxACC_EVENT_OBJECT_ACCELERATORCHANGE 0x8012 + +// ---------------------------------------------------------------------------- +// wxAccessible +// All functions return an indication of success, failure, or not implemented. +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxAccessible; +class WXDLLEXPORT wxWindow; +class WXDLLEXPORT wxPoint; +class WXDLLEXPORT wxRect; +class WXDLLEXPORT wxAccessibleBase : public wxObject +{ + DECLARE_NO_COPY_CLASS(wxAccessibleBase) + +public: + wxAccessibleBase(wxWindow* win): m_window(win) {} + virtual ~wxAccessibleBase() {} + +// Overridables + + // Can return either a child object, or an integer + // representing the child element, starting from 1. + // pt is in screen coordinates. + virtual wxAccStatus HitTest(const wxPoint& WXUNUSED(pt), int* WXUNUSED(childId), wxAccessible** WXUNUSED(childObject)) + { return wxACC_NOT_IMPLEMENTED; } + + // Returns the rectangle for this object (id = 0) or a child element (id > 0). + // rect is in screen coordinates. + virtual wxAccStatus GetLocation(wxRect& WXUNUSED(rect), int WXUNUSED(elementId)) + { return wxACC_NOT_IMPLEMENTED; } + + // Navigates from fromId to toId/toObject. + virtual wxAccStatus Navigate(wxNavDir WXUNUSED(navDir), int WXUNUSED(fromId), + int* WXUNUSED(toId), wxAccessible** WXUNUSED(toObject)) + { return wxACC_NOT_IMPLEMENTED; } + + // Gets the name of the specified object. + virtual wxAccStatus GetName(int WXUNUSED(childId), wxString* WXUNUSED(name)) + { return wxACC_NOT_IMPLEMENTED; } + + // Gets the number of children. + virtual wxAccStatus GetChildCount(int* WXUNUSED(childCount)) + { return wxACC_NOT_IMPLEMENTED; } + + // Gets the specified child (starting from 1). + // If *child is NULL and return value is wxACC_OK, + // this means that the child is a simple element and + // not an accessible object. + virtual wxAccStatus GetChild(int WXUNUSED(childId), wxAccessible** WXUNUSED(child)) + { return wxACC_NOT_IMPLEMENTED; } + + // Gets the parent, or NULL. + virtual wxAccStatus GetParent(wxAccessible** WXUNUSED(parent)) + { return wxACC_NOT_IMPLEMENTED; } + + // Performs the default action. childId is 0 (the action for this object) + // or > 0 (the action for a child). + // Return wxACC_NOT_SUPPORTED if there is no default action for this + // window (e.g. an edit control). + virtual wxAccStatus DoDefaultAction(int WXUNUSED(childId)) + { return wxACC_NOT_IMPLEMENTED; } + + // Gets the default action for this object (0) or > 0 (the action for a child). + // Return wxACC_OK even if there is no action. actionName is the action, or the empty + // string if there is no action. + // The retrieved string describes the action that is performed on an object, + // not what the object does as a result. For example, a toolbar button that prints + // a document has a default action of "Press" rather than "Prints the current document." + virtual wxAccStatus GetDefaultAction(int WXUNUSED(childId), wxString* WXUNUSED(actionName)) + { return wxACC_NOT_IMPLEMENTED; } + + // Returns the description for this object or a child. + virtual wxAccStatus GetDescription(int WXUNUSED(childId), wxString* WXUNUSED(description)) + { return wxACC_NOT_IMPLEMENTED; } + + // Returns help text for this object or a child, similar to tooltip text. + virtual wxAccStatus GetHelpText(int WXUNUSED(childId), wxString* WXUNUSED(helpText)) + { return wxACC_NOT_IMPLEMENTED; } + + // Returns the keyboard shortcut for this object or child. + // Return e.g. ALT+K + virtual wxAccStatus GetKeyboardShortcut(int WXUNUSED(childId), wxString* WXUNUSED(shortcut)) + { return wxACC_NOT_IMPLEMENTED; } + + // Returns a role constant. + virtual wxAccStatus GetRole(int WXUNUSED(childId), wxAccRole* WXUNUSED(role)) + { return wxACC_NOT_IMPLEMENTED; } + + // Returns a state constant. + virtual wxAccStatus GetState(int WXUNUSED(childId), long* WXUNUSED(state)) + { return wxACC_NOT_IMPLEMENTED; } + + // Returns a localized string representing the value for the object + // or child. + virtual wxAccStatus GetValue(int WXUNUSED(childId), wxString* WXUNUSED(strValue)) + { return wxACC_NOT_IMPLEMENTED; } + + // Selects the object or child. + virtual wxAccStatus Select(int WXUNUSED(childId), wxAccSelectionFlags WXUNUSED(selectFlags)) + { return wxACC_NOT_IMPLEMENTED; } + + // Gets the window with the keyboard focus. + // If childId is 0 and child is NULL, no object in + // this subhierarchy has the focus. + // If this object has the focus, child should be 'this'. + virtual wxAccStatus GetFocus(int* WXUNUSED(childId), wxAccessible** WXUNUSED(child)) + { return wxACC_NOT_IMPLEMENTED; } + +#if wxUSE_VARIANT + // Gets a variant representing the selected children + // of this object. + // Acceptable values: + // - a null variant (IsNull() returns TRUE) + // - a list variant (GetType() == wxT("list")) + // - an integer representing the selected child element, + // or 0 if this object is selected (GetType() == wxT("long")) + // - a "void*" pointer to a wxAccessible child object + virtual wxAccStatus GetSelections(wxVariant* WXUNUSED(selections)) + { return wxACC_NOT_IMPLEMENTED; } +#endif // wxUSE_VARIANT + +// Accessors + + // Returns the window associated with this object. + + wxWindow* GetWindow() { return m_window; } + + // Sets the window associated with this object. + + void SetWindow(wxWindow* window) { m_window = window; } + +// Operations + + // Each platform's implementation must define this + // static void NotifyEvent(int eventType, wxWindow* window, wxAccObject objectType, + // int objectId); + +private: + +// Data members + + wxWindow* m_window; +}; + + +// ---------------------------------------------------------------------------- +// now include the declaration of the real class +// ---------------------------------------------------------------------------- + +#if defined(__WXMSW__) + #include "wx/msw/ole/access.h" +#endif + +#endif // wxUSE_ACCESSIBILITY + +#endif // _WX_ACCESSBASE_H_ + diff --git a/Externals/wxWidgets/include/wx/afterstd.h b/Externals/wxWidgets/include/wx/afterstd.h new file mode 100644 index 0000000000..df325f06f9 --- /dev/null +++ b/Externals/wxWidgets/include/wx/afterstd.h @@ -0,0 +1,48 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: include/wx/afterstd.h +// Purpose: #include after STL headers +// Author: Vadim Zeitlin +// Modified by: +// Created: 07/07/03 +// RCS-ID: $Id: afterstd.h 42906 2006-11-01 14:16:42Z VZ $ +// Copyright: (c) 2003 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +/** + See the comments in beforestd.h. + */ + +#if defined(__WXMSW__) + #include "wx/msw/winundef.h" +#endif + +// undo what we did in wx/beforestd.h +#if defined(__VISUALC__) && __VISUALC__ <= 1201 + // MSVC 5 does not have this + #if _MSC_VER > 1100 + // don't restore this one for VC6, it gives it in each try/catch which is a + // bit annoying to say the least + #if _MSC_VER >= 0x1300 + // unreachable code + #pragma warning(default:4702) + #endif // VC++ >= 7 + + #pragma warning(pop) + #else + // 'expression' : signed/unsigned mismatch + #pragma warning(default:4018) + + // 'identifier' : unreferenced formal parameter + #pragma warning(default:4100) + + // 'conversion' : conversion from 'type1' to 'type2', + // possible loss of data + #pragma warning(default:4244) + + // C++ language change: to explicitly specialize class template + // 'identifier' use the following syntax + #pragma warning(default:4663) + #endif +#endif + diff --git a/Externals/wxWidgets/include/wx/anidecod.h b/Externals/wxWidgets/include/wx/anidecod.h new file mode 100644 index 0000000000..6e3847614a --- /dev/null +++ b/Externals/wxWidgets/include/wx/anidecod.h @@ -0,0 +1,77 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/anidecod.h +// Purpose: wxANIDecoder, ANI reader for wxImage and wxAnimation +// Author: Francesco Montorsi +// CVS-ID: $Id: anidecod.h 45563 2007-04-21 18:17:50Z VZ $ +// Copyright: (c) 2006 Francesco Montorsi +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_ANIDECOD_H +#define _WX_ANIDECOD_H + +#include "wx/defs.h" + +#if wxUSE_STREAMS && wxUSE_ICO_CUR + +#include "wx/stream.h" +#include "wx/image.h" +#include "wx/animdecod.h" +#include "wx/dynarray.h" + + +class /*WXDLLEXPORT*/ wxANIFrameInfo; + +WX_DECLARE_EXPORTED_OBJARRAY(wxANIFrameInfo, wxANIFrameInfoArray); +WX_DECLARE_EXPORTED_OBJARRAY(wxImage, wxImageArray); + +// -------------------------------------------------------------------------- +// wxANIDecoder class +// -------------------------------------------------------------------------- + +class WXDLLEXPORT wxANIDecoder : public wxAnimationDecoder +{ +public: + // constructor, destructor, etc. + wxANIDecoder(); + ~wxANIDecoder(); + + + virtual wxSize GetFrameSize(unsigned int frame) const; + virtual wxPoint GetFramePosition(unsigned int frame) const; + virtual wxAnimationDisposal GetDisposalMethod(unsigned int frame) const; + virtual long GetDelay(unsigned int frame) const; + virtual wxColour GetTransparentColour(unsigned int frame) const; + + // implementation of wxAnimationDecoder's pure virtuals + virtual bool CanRead( wxInputStream& stream ) const; + virtual bool Load( wxInputStream& stream ); + + bool ConvertToImage(unsigned int frame, wxImage *image) const; + + wxAnimationDecoder *Clone() const + { return new wxANIDecoder; } + wxAnimationType GetType() const + { return wxANIMATION_TYPE_ANI; } + +private: + // frames stored as wxImage(s): ANI files are meant to be used mostly for animated + // cursors and thus they do not use any optimization to encode differences between + // two frames: they are just a list of images to display sequentially. + wxImageArray m_images; + + // the info about each image stored in m_images. + // NB: m_info.GetCount() may differ from m_images.GetCount()! + wxANIFrameInfoArray m_info; + + // this is the wxCURHandler used to load the ICON chunk of the ANI files + static wxCURHandler sm_handler; + + + DECLARE_NO_COPY_CLASS(wxANIDecoder) +}; + + +#endif // wxUSE_STREAM && wxUSE_ICO_CUR + +#endif // _WX_ANIDECOD_H diff --git a/Externals/wxWidgets/include/wx/animate.h b/Externals/wxWidgets/include/wx/animate.h new file mode 100644 index 0000000000..eab495e800 --- /dev/null +++ b/Externals/wxWidgets/include/wx/animate.h @@ -0,0 +1,124 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/animate.h +// Purpose: wxAnimation and wxAnimationCtrl +// Author: Julian Smart and Guillermo Rodriguez Garcia +// Modified by: Francesco Montorsi +// Created: 13/8/99 +// RCS-ID: $Id: animate.h 43898 2006-12-10 14:18:37Z VZ $ +// Copyright: (c) Julian Smart and Guillermo Rodriguez Garcia +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_ANIMATE_H_ +#define _WX_ANIMATE_H_ + +#include "wx/defs.h" + +#if wxUSE_ANIMATIONCTRL + +#include "wx/animdecod.h" +#include "wx/control.h" +#include "wx/timer.h" +#include "wx/bitmap.h" + +class WXDLLIMPEXP_ADV wxAnimation; + +extern WXDLLIMPEXP_DATA_ADV(wxAnimation) wxNullAnimation; +extern WXDLLIMPEXP_DATA_ADV(const wxChar) wxAnimationCtrlNameStr[]; + + +// ---------------------------------------------------------------------------- +// wxAnimationBase +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxAnimationBase : public wxGDIObject +{ +public: + wxAnimationBase() {} + + virtual bool IsOk() const = 0; + + // can be -1 + virtual int GetDelay(unsigned int frame) const = 0; + + virtual unsigned int GetFrameCount() const = 0; + virtual wxImage GetFrame(unsigned int frame) const = 0; + virtual wxSize GetSize() const = 0; + + virtual bool LoadFile(const wxString& name, + wxAnimationType type = wxANIMATION_TYPE_ANY) = 0; + virtual bool Load(wxInputStream& stream, + wxAnimationType type = wxANIMATION_TYPE_ANY) = 0; + +protected: + DECLARE_ABSTRACT_CLASS(wxAnimationBase) +}; + + + +// ---------------------------------------------------------------------------- +// wxAnimationCtrlBase +// ---------------------------------------------------------------------------- + +// do not autoresize to the animation's size when SetAnimation() is called +#define wxAC_NO_AUTORESIZE (0x0010) + +// default style does not include wxAC_NO_AUTORESIZE, that is, the control +// auto-resizes by default to fit the new animation when SetAnimation() is called +#define wxAC_DEFAULT_STYLE (wxNO_BORDER) + +class WXDLLIMPEXP_ADV wxAnimationCtrlBase : public wxControl +{ +public: + wxAnimationCtrlBase() { } + + // public API + virtual bool LoadFile(const wxString& filename, + wxAnimationType type = wxANIMATION_TYPE_ANY) = 0; + + virtual void SetAnimation(const wxAnimation &anim) = 0; + virtual wxAnimation GetAnimation() const = 0; + + virtual bool Play() = 0; + virtual void Stop() = 0; + + virtual bool IsPlaying() const = 0; + + virtual void SetInactiveBitmap(const wxBitmap &bmp); + + // always return the original bitmap set in this control + wxBitmap GetInactiveBitmap() const + { return m_bmpStatic; } + +protected: + // the inactive bitmap as it was set by the user + wxBitmap m_bmpStatic; + + // the inactive bitmap currently shown in the control + // (may differ in the size from m_bmpStatic) + wxBitmap m_bmpStaticReal; + + // updates m_bmpStaticReal from m_bmpStatic if needed + virtual void UpdateStaticImage(); + + // called by SetInactiveBitmap + virtual void DisplayStaticImage() = 0; + +private: + DECLARE_ABSTRACT_CLASS(wxAnimationCtrlBase) +}; + + +// ---------------------------------------------------------------------------- +// include the platform-specific version of the wxAnimationCtrl class +// ---------------------------------------------------------------------------- + +#if defined(__WXGTK20__) && !defined(__WXUNIVERSAL__) + #include "wx/gtk/animate.h" +#else + #include "wx/generic/animate.h" +#endif + +#endif // wxUSE_ANIMATIONCTRL + +#endif // _WX_ANIMATE_H_ diff --git a/Externals/wxWidgets/include/wx/animdecod.h b/Externals/wxWidgets/include/wx/animdecod.h new file mode 100644 index 0000000000..a1cb15eaa1 --- /dev/null +++ b/Externals/wxWidgets/include/wx/animdecod.h @@ -0,0 +1,146 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/animdecod.h +// Purpose: wxAnimationDecoder +// Author: Francesco Montorsi +// CVS-ID: $Id: animdecod.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) 2006 Francesco Montorsi +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_ANIMDECOD_H +#define _WX_ANIMDECOD_H + +#include "wx/defs.h" + +#if wxUSE_STREAMS + +#include "wx/colour.h" +#include "wx/gdicmn.h" + +class WXDLLIMPEXP_FWD_BASE wxInputStream; +class WXDLLIMPEXP_FWD_CORE wxImage; + +/* + + Differences between a wxAnimationDecoder and a wxImageHandler: + + 1) wxImageHandlers always load an input stream directly into a given wxImage + object converting from the format-specific data representation to the + wxImage native format (RGB24). + wxAnimationDecoders always load an input stream using some optimized format + to store it which is format-depedent. This allows to store a (possibly big) + animation using a format which is a good compromise between required memory + and time required to blit in on the screen. + + 2) wxAnimationDecoders contain the animation data in some internal var. + That's why they derive from wxObjectRefData: they are data which can be shared. + + 3) wxAnimationDecoders can be used by a wxImageHandler to retrieve a frame + in wxImage format; the viceversa cannot be done. + + 4) wxAnimationDecoders are decoders only, thus do not support save features. + + 5) wxAnimationDecoders are directly used by wxAnimation (generic implementation) + as wxObjectRefData while they need to be 'wrapped' by a wxImageHandler for + wxImage uses. + +*/ + + +// -------------------------------------------------------------------------- +// Constants +// -------------------------------------------------------------------------- + +// NB: the values of these enum items are not casual but coincide with the +// GIF disposal codes. Do not change them !! +enum wxAnimationDisposal +{ + // No disposal specified. The decoder is not required to take any action. + wxANIM_UNSPECIFIED = -1, + + // Do not dispose. The graphic is to be left in place. + wxANIM_DONOTREMOVE = 0, + + // Restore to background color. The area used by the graphic must be + // restored to the background color. + wxANIM_TOBACKGROUND = 1, + + // Restore to previous. The decoder is required to restore the area + // overwritten by the graphic with what was there prior to rendering the graphic. + wxANIM_TOPREVIOUS = 2 +}; + +enum wxAnimationType +{ + wxANIMATION_TYPE_INVALID, + wxANIMATION_TYPE_GIF, + wxANIMATION_TYPE_ANI, + + wxANIMATION_TYPE_ANY +}; + + +// -------------------------------------------------------------------------- +// wxAnimationDecoder class +// -------------------------------------------------------------------------- + +class WXDLLEXPORT wxAnimationDecoder : public wxObjectRefData +{ +public: + wxAnimationDecoder() + { + m_background = wxNullColour; + m_nFrames = 0; + } + virtual ~wxAnimationDecoder() { } + + + virtual bool Load( wxInputStream& stream ) = 0; + virtual bool CanRead( wxInputStream& stream ) const = 0; + + virtual wxAnimationDecoder *Clone() const = 0; + virtual wxAnimationType GetType() const = 0; + + // convert given frame to wxImage + virtual bool ConvertToImage(unsigned int frame, wxImage *image) const = 0; + + + // frame specific data getters + + // not all frames may be of the same size; e.g. GIF allows to + // specify that between two frames only a smaller portion of the + // entire animation has changed. + virtual wxSize GetFrameSize(unsigned int frame) const = 0; + + // the position of this frame in case it's not as big as m_szAnimation + // or wxPoint(0,0) otherwise. + virtual wxPoint GetFramePosition(unsigned int frame) const = 0; + + // what should be done after displaying this frame. + virtual wxAnimationDisposal GetDisposalMethod(unsigned int frame) const = 0; + + // the number of milliseconds this frame should be displayed. + // if returns -1 then the frame must be displayed forever. + virtual long GetDelay(unsigned int frame) const = 0; + + // the transparent colour for this frame if any or wxNullColour. + virtual wxColour GetTransparentColour(unsigned int frame) const = 0; + + // get global data + wxSize GetAnimationSize() const { return m_szAnimation; } + wxColour GetBackgroundColour() const { return m_background; } + unsigned int GetFrameCount() const { return m_nFrames; } + +protected: + wxSize m_szAnimation; + unsigned int m_nFrames; + + // this is the colour to use for the wxANIM_TOBACKGROUND disposal. + // if not specified by the animation, it's set to wxNullColour + wxColour m_background; +}; + + +#endif // wxUSE_STREAM +#endif // _WX_ANIMDECOD_H + diff --git a/Externals/wxWidgets/include/wx/app.h b/Externals/wxWidgets/include/wx/app.h new file mode 100644 index 0000000000..ab4b981153 --- /dev/null +++ b/Externals/wxWidgets/include/wx/app.h @@ -0,0 +1,701 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/app.h +// Purpose: wxAppBase class and macros used for declaration of wxApp +// derived class in the user code +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: app.h 49804 2007-11-10 01:09:42Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_APP_H_BASE_ +#define _WX_APP_H_BASE_ + +// ---------------------------------------------------------------------------- +// headers we have to include here +// ---------------------------------------------------------------------------- + +#include "wx/event.h" // for the base class +#include "wx/build.h" +#include "wx/init.h" // we must declare wxEntry() +#include "wx/intl.h" // for wxLayoutDirection + +class WXDLLIMPEXP_FWD_BASE wxAppConsole; +class WXDLLIMPEXP_FWD_BASE wxAppTraits; +class WXDLLIMPEXP_FWD_BASE wxCmdLineParser; +class WXDLLIMPEXP_FWD_BASE wxLog; +class WXDLLIMPEXP_FWD_BASE wxMessageOutput; + +#if wxUSE_GUI + class WXDLLIMPEXP_FWD_BASE wxEventLoop; + struct WXDLLIMPEXP_FWD_CORE wxVideoMode; +#endif + +// ---------------------------------------------------------------------------- +// typedefs +// ---------------------------------------------------------------------------- + +// the type of the function used to create a wxApp object on program start up +typedef wxAppConsole* (*wxAppInitializerFunction)(); + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +enum +{ + wxPRINT_WINDOWS = 1, + wxPRINT_POSTSCRIPT = 2 +}; + +// ---------------------------------------------------------------------------- +// wxAppConsole: wxApp for non-GUI applications +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxAppConsole : public wxEvtHandler +{ +public: + // ctor and dtor + wxAppConsole(); + virtual ~wxAppConsole(); + + + // the virtual functions which may/must be overridden in the derived class + // ----------------------------------------------------------------------- + + // This is the very first function called for a newly created wxApp object, + // it is used by the library to do the global initialization. If, for some + // reason, you must override it (instead of just overriding OnInit(), as + // usual, for app-specific initializations), do not forget to call the base + // class version! + virtual bool Initialize(int& argc, wxChar **argv); + + // This gives wxCocoa a chance to call OnInit() with a memory pool in place + virtual bool CallOnInit() { return OnInit(); } + + // Called before OnRun(), this is a good place to do initialization -- if + // anything fails, return false from here to prevent the program from + // continuing. The command line is normally parsed here, call the base + // class OnInit() to do it. + virtual bool OnInit(); + + // this is here only temporary hopefully (FIXME) + virtual bool OnInitGui() { return true; } + + // This is the replacement for the normal main(): all program work should + // be done here. When OnRun() returns, the programs starts shutting down. + virtual int OnRun() = 0; + + // This is only called if OnInit() returned true so it's a good place to do + // any cleanup matching the initializations done there. + virtual int OnExit(); + + // This is the very last function called on wxApp object before it is + // destroyed. If you override it (instead of overriding OnExit() as usual) + // do not forget to call the base class version! + virtual void CleanUp(); + + // Called when a fatal exception occurs, this function should take care not + // to do anything which might provoke a nested exception! It may be + // overridden if you wish to react somehow in non-default way (core dump + // under Unix, application crash under Windows) to fatal program errors, + // however extreme care should be taken if you don't want this function to + // crash. + virtual void OnFatalException() { } + + // Called from wxExit() function, should terminate the application a.s.a.p. + virtual void Exit(); + + + // application info: name, description, vendor + // ------------------------------------------- + + // NB: all these should be set by the application itself, there are no + // reasonable default except for the application name which is taken to + // be argv[0] + + // set/get the application name + wxString GetAppName() const + { + return m_appName.empty() ? m_className : m_appName; + } + void SetAppName(const wxString& name) { m_appName = name; } + + // set/get the app class name + wxString GetClassName() const { return m_className; } + void SetClassName(const wxString& name) { m_className = name; } + + // set/get the vendor name + const wxString& GetVendorName() const { return m_vendorName; } + void SetVendorName(const wxString& name) { m_vendorName = name; } + + + // cmd line parsing stuff + // ---------------------- + + // all of these methods may be overridden in the derived class to + // customize the command line parsing (by default only a few standard + // options are handled) + // + // you also need to call wxApp::OnInit() from YourApp::OnInit() for all + // this to work + +#if wxUSE_CMDLINE_PARSER + // this one is called from OnInit() to add all supported options + // to the given parser (don't forget to call the base class version if you + // override it!) + virtual void OnInitCmdLine(wxCmdLineParser& parser); + + // called after successfully parsing the command line, return true + // to continue and false to exit (don't forget to call the base class + // version if you override it!) + virtual bool OnCmdLineParsed(wxCmdLineParser& parser); + + // called if "--help" option was specified, return true to continue + // and false to exit + virtual bool OnCmdLineHelp(wxCmdLineParser& parser); + + // called if incorrect command line options were given, return + // false to abort and true to continue + virtual bool OnCmdLineError(wxCmdLineParser& parser); +#endif // wxUSE_CMDLINE_PARSER + + + // miscellaneous customization functions + // ------------------------------------- + + // create the app traits object to which we delegate for everything which + // either should be configurable by the user (then he can change the + // default behaviour simply by overriding CreateTraits() and returning his + // own traits object) or which is GUI/console dependent as then wxAppTraits + // allows us to abstract the differences behind the common façade + wxAppTraits *GetTraits(); + + // the functions below shouldn't be used now that we have wxAppTraits +#if WXWIN_COMPATIBILITY_2_4 + +#if wxUSE_LOG + // override this function to create default log target of arbitrary + // user-defined class (default implementation creates a wxLogGui + // object) -- this log object is used by default by all wxLogXXX() + // functions. + wxDEPRECATED( virtual wxLog *CreateLogTarget() ); +#endif // wxUSE_LOG + + // similar to CreateLogTarget() but for the global wxMessageOutput + // object + wxDEPRECATED( virtual wxMessageOutput *CreateMessageOutput() ); + +#endif // WXWIN_COMPATIBILITY_2_4 + + + // event processing functions + // -------------------------- + + // this method allows to filter all the events processed by the program, so + // you should try to return quickly from it to avoid slowing down the + // program to the crawl + // + // return value should be -1 to continue with the normal event processing, + // or TRUE or FALSE to stop further processing and pretend that the event + // had been already processed or won't be processed at all, respectively + virtual int FilterEvent(wxEvent& event); + +#if wxUSE_EXCEPTIONS + // call the specified handler on the given object with the given event + // + // this method only exists to allow catching the exceptions thrown by any + // event handler, it would lead to an extra (useless) virtual function call + // if the exceptions were not used, so it doesn't even exist in that case + virtual void HandleEvent(wxEvtHandler *handler, + wxEventFunction func, + wxEvent& event) const; + + // Called when an unhandled C++ exception occurs inside OnRun(): note that + // the exception type is lost by now, so if you really want to handle the + // exception you should override OnRun() and put a try/catch around + // MainLoop() call there or use OnExceptionInMainLoop() + virtual void OnUnhandledException() { } +#endif // wxUSE_EXCEPTIONS + + // process all events in the wxPendingEvents list -- it is necessary to + // call this function to process posted events. This happens during each + // event loop iteration in GUI mode but if there is no main loop, it may be + // also called directly. + virtual void ProcessPendingEvents(); + + // doesn't do anything in this class, just a hook for GUI wxApp + virtual bool Yield(bool WXUNUSED(onlyIfNeeded) = false) { return true; } + + // make sure that idle events are sent again + virtual void WakeUpIdle() { } + + // this is just a convenience: by providing its implementation here we + // avoid #ifdefs in the code using it + static bool IsMainLoopRunning() { return false; } + + + // debugging support + // ----------------- + +#ifdef __WXDEBUG__ + // this function is called when an assert failure occurs, the base class + // version does the normal processing (i.e. shows the usual assert failure + // dialog box) + // + // the arguments are the location of the failed assert (func may be empty + // if the compiler doesn't support C99 __FUNCTION__), the text of the + // assert itself and the user-specified message + virtual void OnAssertFailure(const wxChar *file, + int line, + const wxChar *func, + const wxChar *cond, + const wxChar *msg); + + // old version of the function without func parameter, for compatibility + // only, override OnAssertFailure() in the new code + virtual void OnAssert(const wxChar *file, + int line, + const wxChar *cond, + const wxChar *msg); +#endif // __WXDEBUG__ + + // check that the wxBuildOptions object (constructed in the application + // itself, usually the one from IMPLEMENT_APP() macro) matches the build + // options of the library and abort if it doesn't + static bool CheckBuildOptions(const char *optionsSignature, + const char *componentName); +#if WXWIN_COMPATIBILITY_2_4 + wxDEPRECATED( static bool CheckBuildOptions(const wxBuildOptions& buildOptions) ); +#endif + + // implementation only from now on + // ------------------------------- + + // helpers for dynamic wxApp construction + static void SetInitializerFunction(wxAppInitializerFunction fn) + { ms_appInitFn = fn; } + static wxAppInitializerFunction GetInitializerFunction() + { return ms_appInitFn; } + + // accessors for ms_appInstance field (external code might wish to modify + // it, this is why we provide a setter here as well, but you should really + // know what you're doing if you call it), wxTheApp is usually used instead + // of GetInstance() + static wxAppConsole *GetInstance() { return ms_appInstance; } + static void SetInstance(wxAppConsole *app) { ms_appInstance = app; } + + + // command line arguments (public for backwards compatibility) + int argc; + wxChar **argv; + +protected: + // the function which creates the traits object when GetTraits() needs it + // for the first time + virtual wxAppTraits *CreateTraits(); + + + // function used for dynamic wxApp creation + static wxAppInitializerFunction ms_appInitFn; + + // the one and only global application object + static wxAppConsole *ms_appInstance; + + + // application info (must be set from the user code) + wxString m_vendorName, // vendor name (ACME Inc) + m_appName, // app name + m_className; // class name + + // the class defining the application behaviour, NULL initially and created + // by GetTraits() when first needed + wxAppTraits *m_traits; + + + // the application object is a singleton anyhow, there is no sense in + // copying it + DECLARE_NO_COPY_CLASS(wxAppConsole) +}; + +// ---------------------------------------------------------------------------- +// wxAppBase: the common part of wxApp implementations for all platforms +// ---------------------------------------------------------------------------- + +#if wxUSE_GUI + +class WXDLLIMPEXP_CORE wxAppBase : public wxAppConsole +{ +public: + wxAppBase(); + virtual ~wxAppBase(); + + // the virtual functions which may/must be overridden in the derived class + // ----------------------------------------------------------------------- + + // very first initialization function + // + // Override: very rarely + virtual bool Initialize(int& argc, wxChar **argv); + + // a platform-dependent version of OnInit(): the code here is likely to + // depend on the toolkit. default version does nothing. + // + // Override: rarely. + virtual bool OnInitGui(); + + // called to start program execution - the default version just enters + // the main GUI loop in which events are received and processed until + // the last window is not deleted (if GetExitOnFrameDelete) or + // ExitMainLoop() is called. In console mode programs, the execution + // of the program really starts here + // + // Override: rarely in GUI applications, always in console ones. + virtual int OnRun(); + + // a matching function for OnInit() + virtual int OnExit(); + + // very last clean up function + // + // Override: very rarely + virtual void CleanUp(); + + + // the worker functions - usually not used directly by the user code + // ----------------------------------------------------------------- + + // return true if we're running main loop, i.e. if the events can + // (already) be dispatched + static bool IsMainLoopRunning() + { + wxAppBase *app = wx_static_cast(wxAppBase *, GetInstance()); + return app && app->m_mainLoop != NULL; + } + + // execute the main GUI loop, the function returns when the loop ends + virtual int MainLoop(); + + // exit the main loop thus terminating the application + virtual void Exit(); + + // exit the main GUI loop during the next iteration (i.e. it does not + // stop the program immediately!) + virtual void ExitMainLoop(); + + // returns true if there are unprocessed events in the event queue + virtual bool Pending(); + + // process the first event in the event queue (blocks until an event + // appears if there are none currently, use Pending() if this is not + // wanted), returns false if the event loop should stop and true + // otherwise + virtual bool Dispatch(); + + // process all currently pending events right now + // + // it is an error to call Yield() recursively unless the value of + // onlyIfNeeded is true + // + // WARNING: this function is dangerous as it can lead to unexpected + // reentrancies (i.e. when called from an event handler it + // may result in calling the same event handler again), use + // with _extreme_ care or, better, don't use at all! + virtual bool Yield(bool onlyIfNeeded = false) = 0; + + // this virtual function is called in the GUI mode when the application + // becomes idle and normally just sends wxIdleEvent to all interested + // parties + // + // it should return true if more idle events are needed, false if not + virtual bool ProcessIdle(); + + // Send idle event to window and all subwindows + // Returns true if more idle time is requested. + virtual bool SendIdleEvents(wxWindow* win, wxIdleEvent& event); + + +#if wxUSE_EXCEPTIONS + // Function called if an uncaught exception is caught inside the main + // event loop: it may return true to continue running the event loop or + // false to stop it (in the latter case it may rethrow the exception as + // well) + virtual bool OnExceptionInMainLoop(); +#endif // wxUSE_EXCEPTIONS + + + // top level window functions + // -------------------------- + + // return true if our app has focus + virtual bool IsActive() const { return m_isActive; } + + // set the "main" top level window + void SetTopWindow(wxWindow *win) { m_topWindow = win; } + + // return the "main" top level window (if it hadn't been set previously + // with SetTopWindow(), will return just some top level window and, if + // there are none, will return NULL) + virtual wxWindow *GetTopWindow() const; + + // control the exit behaviour: by default, the program will exit the + // main loop (and so, usually, terminate) when the last top-level + // program window is deleted. Beware that if you disable this behaviour + // (with SetExitOnFrameDelete(false)), you'll have to call + // ExitMainLoop() explicitly from somewhere. + void SetExitOnFrameDelete(bool flag) + { m_exitOnFrameDelete = flag ? Yes : No; } + bool GetExitOnFrameDelete() const + { return m_exitOnFrameDelete == Yes; } + + + // display mode, visual, printing mode, ... + // ------------------------------------------------------------------------ + + // Get display mode that is used use. This is only used in framebuffer + // wxWin ports (such as wxMGL or wxDFB). + virtual wxVideoMode GetDisplayMode() const; + // Set display mode to use. This is only used in framebuffer wxWin + // ports (such as wxMGL or wxDFB). This method should be called from + // wxApp::OnInitGui + virtual bool SetDisplayMode(const wxVideoMode& WXUNUSED(info)) { return true; } + + // set use of best visual flag (see below) + void SetUseBestVisual( bool flag, bool forceTrueColour = false ) + { m_useBestVisual = flag; m_forceTrueColour = forceTrueColour; } + bool GetUseBestVisual() const { return m_useBestVisual; } + + // set/get printing mode: see wxPRINT_XXX constants. + // + // default behaviour is the normal one for Unix: always use PostScript + // printing. + virtual void SetPrintMode(int WXUNUSED(mode)) { } + int GetPrintMode() const { return wxPRINT_POSTSCRIPT; } + + // Return the layout direction for the current locale or wxLayout_Default + // if it's unknown + virtual wxLayoutDirection GetLayoutDirection() const; + + + // command line parsing (GUI-specific) + // ------------------------------------------------------------------------ + +#if wxUSE_CMDLINE_PARSER + virtual bool OnCmdLineParsed(wxCmdLineParser& parser); + virtual void OnInitCmdLine(wxCmdLineParser& parser); +#endif + + // miscellaneous other stuff + // ------------------------------------------------------------------------ + + // called by toolkit-specific code to set the app status: active (we have + // focus) or not and also the last window which had focus before we were + // deactivated + virtual void SetActive(bool isActive, wxWindow *lastFocus); + +#if WXWIN_COMPATIBILITY_2_6 + // OBSOLETE: don't use, always returns true + // + // returns true if the program is successfully initialized + wxDEPRECATED( bool Initialized() ); +#endif // WXWIN_COMPATIBILITY_2_6 + + // perform standard OnIdle behaviour, ensure that this is always called + void OnIdle(wxIdleEvent& event); + + +protected: + // delete all objects in wxPendingDelete list + void DeletePendingObjects(); + + // override base class method to use GUI traits + virtual wxAppTraits *CreateTraits(); + + + // the main event loop of the application (may be NULL if the loop hasn't + // been started yet or has already terminated) + wxEventLoop *m_mainLoop; + + // the main top level window (may be NULL) + wxWindow *m_topWindow; + + // if Yes, exit the main loop when the last top level window is deleted, if + // No don't do it and if Later -- only do it once we reach our OnRun() + // + // the explanation for using this strange scheme is given in appcmn.cpp + enum + { + Later = -1, + No, + Yes + } m_exitOnFrameDelete; + + // true if the app wants to use the best visual on systems where + // more than one are available (Sun, SGI, XFree86 4.0 ?) + bool m_useBestVisual; + // force TrueColour just in case "best" isn't TrueColour + bool m_forceTrueColour; + + // does any of our windows have focus? + bool m_isActive; + + + DECLARE_NO_COPY_CLASS(wxAppBase) +}; + +#if WXWIN_COMPATIBILITY_2_6 + inline bool wxAppBase::Initialized() { return true; } +#endif // WXWIN_COMPATIBILITY_2_6 + +#endif // wxUSE_GUI + +// ---------------------------------------------------------------------------- +// now include the declaration of the real class +// ---------------------------------------------------------------------------- + +#if wxUSE_GUI + #if defined(__WXPALMOS__) + #include "wx/palmos/app.h" + #elif defined(__WXMSW__) + #include "wx/msw/app.h" + #elif defined(__WXMOTIF__) + #include "wx/motif/app.h" + #elif defined(__WXMGL__) + #include "wx/mgl/app.h" + #elif defined(__WXDFB__) + #include "wx/dfb/app.h" + #elif defined(__WXGTK20__) + #include "wx/gtk/app.h" + #elif defined(__WXGTK__) + #include "wx/gtk1/app.h" + #elif defined(__WXX11__) + #include "wx/x11/app.h" + #elif defined(__WXMAC__) + #include "wx/mac/app.h" + #elif defined(__WXCOCOA__) + #include "wx/cocoa/app.h" + #elif defined(__WXPM__) + #include "wx/os2/app.h" + #endif +#else // !GUI + // allow using just wxApp (instead of wxAppConsole) in console programs + typedef wxAppConsole wxApp; +#endif // GUI/!GUI + +// ---------------------------------------------------------------------------- +// the global data +// ---------------------------------------------------------------------------- + +// for compatibility, we define this macro to access the global application +// object of type wxApp +// +// note that instead of using of wxTheApp in application code you should +// consider using DECLARE_APP() after which you may call wxGetApp() which will +// return the object of the correct type (i.e. MyApp and not wxApp) +// +// the cast is safe as in GUI build we only use wxApp, not wxAppConsole, and in +// console mode it does nothing at all +#define wxTheApp wx_static_cast(wxApp*, wxApp::GetInstance()) + +// ---------------------------------------------------------------------------- +// global functions +// ---------------------------------------------------------------------------- + +// event loop related functions only work in GUI programs +// ------------------------------------------------------ + +// Force an exit from main loop +extern void WXDLLIMPEXP_BASE wxExit(); + +// Yield to other apps/messages +extern bool WXDLLIMPEXP_BASE wxYield(); + +// Yield to other apps/messages +extern void WXDLLIMPEXP_BASE wxWakeUpIdle(); + +// ---------------------------------------------------------------------------- +// macros for dynamic creation of the application object +// ---------------------------------------------------------------------------- + +// Having a global instance of this class allows wxApp to be aware of the app +// creator function. wxApp can then call this function to create a new app +// object. Convoluted, but necessary. + +class WXDLLIMPEXP_BASE wxAppInitializer +{ +public: + wxAppInitializer(wxAppInitializerFunction fn) + { wxApp::SetInitializerFunction(fn); } +}; + +// the code below defines a IMPLEMENT_WXWIN_MAIN macro which you can use if +// your compiler really, really wants main() to be in your main program (e.g. +// hello.cpp). Now IMPLEMENT_APP should add this code if required. + +#define IMPLEMENT_WXWIN_MAIN_CONSOLE \ + int main(int argc, char **argv) { return wxEntry(argc, argv); } + +// port-specific header could have defined it already in some special way +#ifndef IMPLEMENT_WXWIN_MAIN + #define IMPLEMENT_WXWIN_MAIN IMPLEMENT_WXWIN_MAIN_CONSOLE +#endif // defined(IMPLEMENT_WXWIN_MAIN) + +#ifdef __WXUNIVERSAL__ + #include "wx/univ/theme.h" + + #ifdef wxUNIV_DEFAULT_THEME + #define IMPLEMENT_WX_THEME_SUPPORT \ + WX_USE_THEME(wxUNIV_DEFAULT_THEME); + #else + #define IMPLEMENT_WX_THEME_SUPPORT + #endif +#else + #define IMPLEMENT_WX_THEME_SUPPORT +#endif + +// Use this macro if you want to define your own main() or WinMain() function +// and call wxEntry() from there. +#define IMPLEMENT_APP_NO_MAIN(appname) \ + wxAppConsole *wxCreateApp() \ + { \ + wxAppConsole::CheckBuildOptions(WX_BUILD_OPTIONS_SIGNATURE, \ + "your program"); \ + return new appname; \ + } \ + wxAppInitializer \ + wxTheAppInitializer((wxAppInitializerFunction) wxCreateApp); \ + DECLARE_APP(appname) \ + appname& wxGetApp() { return *wx_static_cast(appname*, wxApp::GetInstance()); } + +// Same as IMPLEMENT_APP() normally but doesn't include themes support in +// wxUniversal builds +#define IMPLEMENT_APP_NO_THEMES(appname) \ + IMPLEMENT_APP_NO_MAIN(appname) \ + IMPLEMENT_WXWIN_MAIN + +// Use this macro exactly once, the argument is the name of the wxApp-derived +// class which is the class of your application. +#define IMPLEMENT_APP(appname) \ + IMPLEMENT_APP_NO_THEMES(appname) \ + IMPLEMENT_WX_THEME_SUPPORT + +// Same as IMPLEMENT_APP(), but for console applications. +#define IMPLEMENT_APP_CONSOLE(appname) \ + IMPLEMENT_APP_NO_MAIN(appname) \ + IMPLEMENT_WXWIN_MAIN_CONSOLE + +// this macro can be used multiple times and just allows you to use wxGetApp() +// function +#define DECLARE_APP(appname) extern appname& wxGetApp(); + + +// declare the stuff defined by IMPLEMENT_APP() macro, it's not really needed +// anywhere else but at the very least it suppresses icc warnings about +// defining extern symbols without prior declaration, and it shouldn't do any +// harm +extern wxAppConsole *wxCreateApp(); +extern wxAppInitializer wxTheAppInitializer; + +#endif // _WX_APP_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/apptrait.h b/Externals/wxWidgets/include/wx/apptrait.h new file mode 100644 index 0000000000..56f36dfea7 --- /dev/null +++ b/Externals/wxWidgets/include/wx/apptrait.h @@ -0,0 +1,272 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/apptrait.h +// Purpose: declaration of wxAppTraits and derived classes +// Author: Vadim Zeitlin +// Modified by: +// Created: 19.06.2003 +// RCS-ID: $Id: apptrait.h 49804 2007-11-10 01:09:42Z VZ $ +// Copyright: (c) 2003 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_APPTRAIT_H_ +#define _WX_APPTRAIT_H_ + +#include "wx/string.h" +#include "wx/platinfo.h" + +class WXDLLIMPEXP_FWD_BASE wxObject; +class WXDLLIMPEXP_FWD_BASE wxAppTraits; +#if wxUSE_FONTMAP + class WXDLLIMPEXP_FWD_CORE wxFontMapper; +#endif // wxUSE_FONTMAP +class WXDLLIMPEXP_FWD_BASE wxLog; +class WXDLLIMPEXP_FWD_BASE wxMessageOutput; +class WXDLLIMPEXP_FWD_CORE wxRendererNative; +class WXDLLIMPEXP_FWD_BASE wxString; + +class GSocketGUIFunctionsTable; + + +// ---------------------------------------------------------------------------- +// wxAppTraits: this class defines various configurable aspects of wxApp +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_BASE wxStandardPathsBase; + +class WXDLLIMPEXP_BASE wxAppTraitsBase +{ +public: + // needed since this class declares virtual members + virtual ~wxAppTraitsBase() { } + + // hooks for creating the global objects, may be overridden by the user + // ------------------------------------------------------------------------ + +#if wxUSE_LOG + // create the default log target + virtual wxLog *CreateLogTarget() = 0; +#endif // wxUSE_LOG + + // create the global object used for printing out messages + virtual wxMessageOutput *CreateMessageOutput() = 0; + +#if wxUSE_FONTMAP + // create the global font mapper object used for encodings/charset mapping + virtual wxFontMapper *CreateFontMapper() = 0; +#endif // wxUSE_FONTMAP + + // get the renderer to use for drawing the generic controls (return value + // may be NULL in which case the default renderer for the current platform + // is used); this is used in GUI only and always returns NULL in console + // + // NB: returned pointer will be deleted by the caller + virtual wxRendererNative *CreateRenderer() = 0; + +#if wxUSE_STDPATHS + // wxStandardPaths object is normally the same for wxBase and wxGUI + // except in the case of wxMac and wxCocoa + virtual wxStandardPathsBase& GetStandardPaths(); +#endif // wxUSE_STDPATHS + + // functions abstracting differences between GUI and console modes + // ------------------------------------------------------------------------ + +#ifdef __WXDEBUG__ + // show the assert dialog with the specified message in GUI or just print + // the string to stderr in console mode + // + // base class version has an implementation (in spite of being pure + // virtual) in base/appbase.cpp which can be called as last resort. + // + // return true to suppress subsequent asserts, false to continue as before + virtual bool ShowAssertDialog(const wxString& msg) = 0; +#endif // __WXDEBUG__ + + // return true if fprintf(stderr) goes somewhere, false otherwise + virtual bool HasStderr() = 0; + + // managing "pending delete" list: in GUI mode we can't immediately delete + // some objects because there may be unprocessed events for them and so we + // only do it during the next idle loop iteration while this is, of course, + // unnecessary in wxBase, so we have a few functions to abstract these + // operations + + // add the object to the pending delete list in GUI, delete it immediately + // in wxBase + virtual void ScheduleForDestroy(wxObject *object) = 0; + + // remove this object from the pending delete list in GUI, do nothing in + // wxBase + virtual void RemoveFromPendingDelete(wxObject *object) = 0; + +#if wxUSE_SOCKETS + // return table of GUI callbacks for GSocket code or NULL in wxBase. This + // is needed because networking classes are in their own library and so + // they can't directly call GUI functions (the same net library can be + // used in both GUI and base apps). To complicate it further, GUI library + // ("wxCore") doesn't depend on networking library and so only a functions + // table can be passed around + virtual GSocketGUIFunctionsTable* GetSocketGUIFunctionsTable() = 0; +#endif + + // return information about the (native) toolkit currently used and its + // runtime (not compile-time) version. + // returns wxPORT_BASE for console applications and one of the remaining + // wxPORT_* values for GUI applications. + virtual wxPortId GetToolkitVersion(int *majVer, int *minVer) const = 0; + + // return true if the port is using wxUniversal for the GUI, false if not + virtual bool IsUsingUniversalWidgets() const = 0; + + // return the name of the Desktop Environment such as + // "KDE" or "GNOME". May return an empty string. + virtual wxString GetDesktopEnvironment() const { return wxEmptyString; } + +protected: +#if wxUSE_STACKWALKER && defined( __WXDEBUG__ ) + // utility function: returns the stack frame as a plain wxString + virtual wxString GetAssertStackTrace(); +#endif +}; + +// ---------------------------------------------------------------------------- +// include the platform-specific version of the class +// ---------------------------------------------------------------------------- + +// NB: test for __UNIX__ before __WXMAC__ as under Darwin we want to use the +// Unix code (and otherwise __UNIX__ wouldn't be defined) +// ABX: check __WIN32__ instead of __WXMSW__ for the same MSWBase in any Win32 port +#if defined(__WXPALMOS__) + #include "wx/palmos/apptbase.h" +#elif defined(__WIN32__) + #include "wx/msw/apptbase.h" +#elif defined(__UNIX__) && !defined(__EMX__) + #include "wx/unix/apptbase.h" +#elif defined(__WXMAC__) + #include "wx/mac/apptbase.h" +#elif defined(__OS2__) + #include "wx/os2/apptbase.h" +#else // no platform-specific methods to add to wxAppTraits + // wxAppTraits must be a class because it was forward declared as class + class WXDLLIMPEXP_BASE wxAppTraits : public wxAppTraitsBase + { + }; +#endif // platform + +// ============================================================================ +// standard traits for console and GUI applications +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxConsoleAppTraitsBase: wxAppTraits implementation for the console apps +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxConsoleAppTraitsBase : public wxAppTraits +{ +public: +#if wxUSE_LOG + virtual wxLog *CreateLogTarget(); +#endif // wxUSE_LOG + virtual wxMessageOutput *CreateMessageOutput(); +#if wxUSE_FONTMAP + virtual wxFontMapper *CreateFontMapper(); +#endif // wxUSE_FONTMAP + virtual wxRendererNative *CreateRenderer(); +#if wxUSE_SOCKETS + virtual GSocketGUIFunctionsTable* GetSocketGUIFunctionsTable(); +#endif + +#ifdef __WXDEBUG__ + virtual bool ShowAssertDialog(const wxString& msg); +#endif // __WXDEBUG__ + virtual bool HasStderr(); + + virtual void ScheduleForDestroy(wxObject *object); + virtual void RemoveFromPendingDelete(wxObject *object); + + // the GetToolkitVersion for console application is always the same + virtual wxPortId GetToolkitVersion(int *verMaj, int *verMin) const + { + // no toolkits (wxBase is for console applications without GUI support) + // NB: zero means "no toolkit", -1 means "not initialized yet" + // so we must use zero here! + if (verMaj) *verMaj = 0; + if (verMin) *verMin = 0; + return wxPORT_BASE; + } + + virtual bool IsUsingUniversalWidgets() const { return false; } +}; + +// ---------------------------------------------------------------------------- +// wxGUIAppTraitsBase: wxAppTraits implementation for the GUI apps +// ---------------------------------------------------------------------------- + +#if wxUSE_GUI + +class WXDLLEXPORT wxGUIAppTraitsBase : public wxAppTraits +{ +public: +#if wxUSE_LOG + virtual wxLog *CreateLogTarget(); +#endif // wxUSE_LOG + virtual wxMessageOutput *CreateMessageOutput(); +#if wxUSE_FONTMAP + virtual wxFontMapper *CreateFontMapper(); +#endif // wxUSE_FONTMAP + virtual wxRendererNative *CreateRenderer(); +#if wxUSE_SOCKETS + virtual GSocketGUIFunctionsTable* GetSocketGUIFunctionsTable(); +#endif + +#ifdef __WXDEBUG__ + virtual bool ShowAssertDialog(const wxString& msg); +#endif // __WXDEBUG__ + virtual bool HasStderr(); + + virtual void ScheduleForDestroy(wxObject *object); + virtual void RemoveFromPendingDelete(wxObject *object); + + virtual bool IsUsingUniversalWidgets() const + { + #ifdef __WXUNIVERSAL__ + return true; + #else + return false; + #endif + } +}; + +#endif // wxUSE_GUI + +// ---------------------------------------------------------------------------- +// include the platform-specific version of the classes above +// ---------------------------------------------------------------------------- + +// ABX: check __WIN32__ instead of __WXMSW__ for the same MSWBase in any Win32 port +#if defined(__WXPALMOS__) + #include "wx/palmos/apptrait.h" +#elif defined(__WIN32__) + #include "wx/msw/apptrait.h" +#elif defined(__OS2__) + #include "wx/os2/apptrait.h" +#elif defined(__UNIX__) + #include "wx/unix/apptrait.h" +#elif defined(__WXMAC__) + #include "wx/mac/apptrait.h" +#elif defined(__DOS__) + #include "wx/msdos/apptrait.h" +#else + #if wxUSE_GUI + class wxGUIAppTraits : public wxGUIAppTraitsBase + { + }; + #endif // wxUSE_GUI + class wxConsoleAppTraits: public wxConsoleAppTraitsBase + { + }; +#endif // platform + +#endif // _WX_APPTRAIT_H_ + diff --git a/Externals/wxWidgets/include/wx/archive.h b/Externals/wxWidgets/include/wx/archive.h new file mode 100644 index 0000000000..dbf26c25c5 --- /dev/null +++ b/Externals/wxWidgets/include/wx/archive.h @@ -0,0 +1,381 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/archive.h +// Purpose: Streams for archive formats +// Author: Mike Wetherell +// RCS-ID: $Id: archive.h 43445 2006-11-16 14:30:20Z MW $ +// Copyright: (c) 2004 Mike Wetherell +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_ARCHIVE_H__ +#define _WX_ARCHIVE_H__ + +#include "wx/defs.h" + +#if wxUSE_STREAMS && wxUSE_ARCHIVE_STREAMS + +#include "wx/stream.h" +#include "wx/filename.h" + + +///////////////////////////////////////////////////////////////////////////// +// wxArchiveNotifier + +class WXDLLIMPEXP_BASE wxArchiveNotifier +{ +public: + virtual ~wxArchiveNotifier() { } + + virtual void OnEntryUpdated(class wxArchiveEntry& entry) = 0; +}; + + +///////////////////////////////////////////////////////////////////////////// +// wxArchiveEntry +// +// Holds an entry's meta data, such as filename and timestamp. + +class WXDLLIMPEXP_BASE wxArchiveEntry : public wxObject +{ +public: + virtual ~wxArchiveEntry() { } + + virtual wxDateTime GetDateTime() const = 0; + virtual wxFileOffset GetSize() const = 0; + virtual wxFileOffset GetOffset() const = 0; + virtual bool IsDir() const = 0; + virtual bool IsReadOnly() const = 0; + virtual wxString GetInternalName() const = 0; + virtual wxPathFormat GetInternalFormat() const = 0; + virtual wxString GetName(wxPathFormat format = wxPATH_NATIVE) const = 0; + + virtual void SetDateTime(const wxDateTime& dt) = 0; + virtual void SetSize(wxFileOffset size) = 0; + virtual void SetIsDir(bool isDir = true) = 0; + virtual void SetIsReadOnly(bool isReadOnly = true) = 0; + virtual void SetName(const wxString& name, + wxPathFormat format = wxPATH_NATIVE) = 0; + + wxArchiveEntry *Clone() const { return DoClone(); } + + void SetNotifier(wxArchiveNotifier& notifier); + virtual void UnsetNotifier() { m_notifier = NULL; } + +protected: + wxArchiveEntry() : m_notifier(NULL) { } + wxArchiveEntry(const wxArchiveEntry& e) : wxObject(e), m_notifier(NULL) { } + + virtual void SetOffset(wxFileOffset offset) = 0; + virtual wxArchiveEntry* DoClone() const = 0; + + wxArchiveNotifier *GetNotifier() const { return m_notifier; } + wxArchiveEntry& operator=(const wxArchiveEntry& entry); + +private: + wxArchiveNotifier *m_notifier; + + DECLARE_ABSTRACT_CLASS(wxArchiveEntry) +}; + + +///////////////////////////////////////////////////////////////////////////// +// wxArchiveInputStream +// +// GetNextEntry() returns an wxArchiveEntry object containing the meta-data +// for the next entry in the archive (and gives away ownership). Reading from +// the wxArchiveInputStream then returns the entry's data. Eof() becomes true +// after an attempt has been made to read past the end of the entry's data. +// +// When there are no more entries, GetNextEntry() returns NULL and sets Eof(). + +class WXDLLIMPEXP_BASE wxArchiveInputStream : public wxFilterInputStream +{ +public: + typedef wxArchiveEntry entry_type; + + virtual ~wxArchiveInputStream() { } + + virtual bool OpenEntry(wxArchiveEntry& entry) = 0; + virtual bool CloseEntry() = 0; + + wxArchiveEntry *GetNextEntry() { return DoGetNextEntry(); } + + virtual char Peek() { return wxInputStream::Peek(); } + +protected: + wxArchiveInputStream(wxInputStream& stream, wxMBConv& conv); + wxArchiveInputStream(wxInputStream *stream, wxMBConv& conv); + + virtual wxArchiveEntry *DoGetNextEntry() = 0; + + wxMBConv& GetConv() const { return m_conv; } + +private: + wxMBConv& m_conv; +}; + + +///////////////////////////////////////////////////////////////////////////// +// wxArchiveOutputStream +// +// PutNextEntry is used to create a new entry in the output archive, then +// the entry's data is written to the wxArchiveOutputStream. +// +// Only one entry can be open for output at a time; another call to +// PutNextEntry closes the current entry and begins the next. +// +// The overload 'bool PutNextEntry(wxArchiveEntry *entry)' takes ownership +// of the entry object. + +class WXDLLIMPEXP_BASE wxArchiveOutputStream : public wxFilterOutputStream +{ +public: + virtual ~wxArchiveOutputStream() { } + + virtual bool PutNextEntry(wxArchiveEntry *entry) = 0; + + virtual bool PutNextEntry(const wxString& name, + const wxDateTime& dt = wxDateTime::Now(), + wxFileOffset size = wxInvalidOffset) = 0; + + virtual bool PutNextDirEntry(const wxString& name, + const wxDateTime& dt = wxDateTime::Now()) = 0; + + virtual bool CopyEntry(wxArchiveEntry *entry, + wxArchiveInputStream& stream) = 0; + + virtual bool CopyArchiveMetaData(wxArchiveInputStream& stream) = 0; + + virtual bool CloseEntry() = 0; + +protected: + wxArchiveOutputStream(wxOutputStream& stream, wxMBConv& conv); + wxArchiveOutputStream(wxOutputStream *stream, wxMBConv& conv); + + wxMBConv& GetConv() const { return m_conv; } + +private: + wxMBConv& m_conv; +}; + + +///////////////////////////////////////////////////////////////////////////// +// wxArchiveIterator +// +// An input iterator that can be used to transfer an archive's catalog to +// a container. + +#if wxUSE_STL || defined WX_TEST_ARCHIVE_ITERATOR +#include +#include + +template inline +void _wxSetArchiveIteratorValue( + X& val, Y entry, void *WXUNUSED(d)) +{ + val = X(entry); +} +template inline +void _wxSetArchiveIteratorValue( + std::pair& val, Z entry, Z WXUNUSED(d)) +{ + val = std::make_pair(X(entry->GetInternalName()), Y(entry)); +} + +#if defined _MSC_VER && _MSC_VER < 1300 +template +#else +template +#endif +class wxArchiveIterator +{ +public: + typedef std::input_iterator_tag iterator_category; + typedef T value_type; + typedef ptrdiff_t difference_type; + typedef T* pointer; + typedef T& reference; + + wxArchiveIterator() : m_rep(NULL) { } + + wxArchiveIterator(Arc& arc) { + typename Arc::entry_type* entry = arc.GetNextEntry(); + m_rep = entry ? new Rep(arc, entry) : NULL; + } + + wxArchiveIterator(const wxArchiveIterator& it) : m_rep(it.m_rep) { + if (m_rep) + m_rep->AddRef(); + } + + ~wxArchiveIterator() { + if (m_rep) + m_rep->UnRef(); + } + + const T& operator *() const { + return m_rep->GetValue(); + } + + const T* operator ->() const { + return &**this; + } + + wxArchiveIterator& operator =(const wxArchiveIterator& it) { + if (it.m_rep) + it.m_rep.AddRef(); + if (m_rep) + m_rep.UnRef(); + m_rep = it.m_rep; + return *this; + } + + wxArchiveIterator& operator ++() { + m_rep = m_rep->Next(); + return *this; + } + + wxArchiveIterator operator ++(int) { + wxArchiveIterator it(*this); + ++(*this); + return it; + } + + bool operator ==(const wxArchiveIterator& j) const { + return m_rep == j.m_rep; + } + + bool operator !=(const wxArchiveIterator& j) const { + return !(*this == j); + } + +private: + class Rep { + Arc& m_arc; + typename Arc::entry_type* m_entry; + T m_value; + int m_ref; + + public: + Rep(Arc& arc, typename Arc::entry_type* entry) + : m_arc(arc), m_entry(entry), m_value(), m_ref(1) { } + ~Rep() + { delete m_entry; } + + void AddRef() { + m_ref++; + } + + void UnRef() { + if (--m_ref == 0) + delete this; + } + + Rep *Next() { + typename Arc::entry_type* entry = m_arc.GetNextEntry(); + if (!entry) { + UnRef(); + return NULL; + } + if (m_ref > 1) { + m_ref--; + return new Rep(m_arc, entry); + } + delete m_entry; + m_entry = entry; + m_value = T(); + return this; + } + + const T& GetValue() { + if (m_entry) { + _wxSetArchiveIteratorValue(m_value, m_entry, m_entry); + m_entry = NULL; + } + return m_value; + } + } *m_rep; +}; + +typedef wxArchiveIterator wxArchiveIter; +typedef wxArchiveIterator > wxArchivePairIter; + +#endif // wxUSE_STL || defined WX_TEST_ARCHIVE_ITERATOR + + +///////////////////////////////////////////////////////////////////////////// +// wxArchiveClassFactory +// +// A wxArchiveClassFactory instance for a particular archive type allows +// the creation of the other classes that may be needed. + +void WXDLLIMPEXP_BASE wxUseArchiveClasses(); + +class WXDLLIMPEXP_BASE wxArchiveClassFactory : public wxFilterClassFactoryBase +{ +public: + typedef wxArchiveEntry entry_type; + typedef wxArchiveInputStream instream_type; + typedef wxArchiveOutputStream outstream_type; + typedef wxArchiveNotifier notifier_type; +#if wxUSE_STL || defined WX_TEST_ARCHIVE_ITERATOR + typedef wxArchiveIter iter_type; + typedef wxArchivePairIter pairiter_type; +#endif + + virtual ~wxArchiveClassFactory() { } + + wxArchiveEntry *NewEntry() const + { return DoNewEntry(); } + wxArchiveInputStream *NewStream(wxInputStream& stream) const + { return DoNewStream(stream); } + wxArchiveOutputStream *NewStream(wxOutputStream& stream) const + { return DoNewStream(stream); } + wxArchiveInputStream *NewStream(wxInputStream *stream) const + { return DoNewStream(stream); } + wxArchiveOutputStream *NewStream(wxOutputStream *stream) const + { return DoNewStream(stream); } + + virtual wxString GetInternalName( + const wxString& name, + wxPathFormat format = wxPATH_NATIVE) const = 0; + + void SetConv(wxMBConv& conv) { m_pConv = &conv; } + wxMBConv& GetConv() const + { if (m_pConv) return *m_pConv; else return wxConvLocal; } + + static const wxArchiveClassFactory *Find(const wxChar *protocol, + wxStreamProtocolType type + = wxSTREAM_PROTOCOL); + + static const wxArchiveClassFactory *GetFirst(); + const wxArchiveClassFactory *GetNext() const { return m_next; } + + void PushFront() { Remove(); m_next = sm_first; sm_first = this; } + void Remove(); + +protected: + // old compilers don't support covarient returns, so 'Do' methods are + // used to simulate them + virtual wxArchiveEntry *DoNewEntry() const = 0; + virtual wxArchiveInputStream *DoNewStream(wxInputStream& stream) const = 0; + virtual wxArchiveOutputStream *DoNewStream(wxOutputStream& stream) const = 0; + virtual wxArchiveInputStream *DoNewStream(wxInputStream *stream) const = 0; + virtual wxArchiveOutputStream *DoNewStream(wxOutputStream *stream) const = 0; + + wxArchiveClassFactory() : m_pConv(NULL), m_next(this) { } + wxArchiveClassFactory& operator=(const wxArchiveClassFactory& WXUNUSED(f)) + { return *this; } + +private: + wxMBConv *m_pConv; + static wxArchiveClassFactory *sm_first; + wxArchiveClassFactory *m_next; + + DECLARE_ABSTRACT_CLASS(wxArchiveClassFactory) +}; + +#endif // wxUSE_STREAMS && wxUSE_ARCHIVE_STREAMS + +#endif // _WX_ARCHIVE_H__ diff --git a/Externals/wxWidgets/include/wx/arrimpl.cpp b/Externals/wxWidgets/include/wx/arrimpl.cpp new file mode 100644 index 0000000000..37b26314ad --- /dev/null +++ b/Externals/wxWidgets/include/wx/arrimpl.cpp @@ -0,0 +1,120 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/arrimpl.cpp +// Purpose: helper file for implementation of dynamic lists +// Author: Vadim Zeitlin +// Modified by: +// Created: 16.10.97 +// RCS-ID: $Id: arrimpl.cpp 34241 2005-05-22 12:10:55Z JS $ +// Copyright: (c) 1997 Vadim Zeitlin +// Licence: wxWindows license +/////////////////////////////////////////////////////////////////////////////// + +/***************************************************************************** + * Purpose: implements methods of "template" class declared in * + * DECLARE_OBJARRAY macro and which couldn't be implemented inline * + * (because they need the full definition of type T in scope) * + * * + * Usage: 1) #include dynarray.h * + * 2) WX_DECLARE_OBJARRAY * + * 3) #include arrimpl.cpp * + * 4) WX_DEFINE_OBJARRAY * + *****************************************************************************/ + +// needed to resolve the conflict between global T and macro parameter T + +#define _WX_ERROR_REMOVE2(x) wxT("bad index in ") wxT(#x) wxT("::RemoveAt()") + +// macro implements remaining (not inline) methods of template list +// (it's private to this file) +#undef _DEFINE_OBJARRAY +#define _DEFINE_OBJARRAY(T, name) \ +name::~name() \ +{ \ + Empty(); \ +} \ + \ +void name::DoCopy(const name& src) \ +{ \ + for ( size_t ui = 0; ui < src.size(); ui++ ) \ + Add(src[ui]); \ +} \ + \ +name& name::operator=(const name& src) \ +{ \ + Empty(); \ + DoCopy(src); \ + \ + return *this; \ +} \ + \ +name::name(const name& src) : wxArrayPtrVoid() \ +{ \ + DoCopy(src); \ +} \ + \ +void name::DoEmpty() \ +{ \ + for ( size_t ui = 0; ui < size(); ui++ ) \ + delete (T*)base_array::operator[](ui); \ +} \ + \ +void name::RemoveAt(size_t uiIndex, size_t nRemove) \ +{ \ + wxCHECK_RET( uiIndex < size(), _WX_ERROR_REMOVE2(name) ); \ + \ + for (size_t i = 0; i < nRemove; i++ ) \ + delete (T*)base_array::operator[](uiIndex + i); \ + \ + base_array::erase(begin() + uiIndex, begin() + uiIndex + nRemove); \ +} \ + \ +void name::Add(const T& item, size_t nInsert) \ +{ \ + if (nInsert == 0) \ + return; \ + T* pItem = new T(item); \ + size_t nOldSize = size(); \ + if ( pItem != NULL ) \ + base_array::insert(end(), nInsert, pItem); \ + for (size_t i = 1; i < nInsert; i++) \ + base_array::operator[](nOldSize + i) = new T(item); \ +} \ + \ +void name::Insert(const T& item, size_t uiIndex, size_t nInsert) \ +{ \ + if (nInsert == 0) \ + return; \ + T* pItem = new T(item); \ + if ( pItem != NULL ) \ + base_array::insert(begin() + uiIndex, nInsert, pItem); \ + for (size_t i = 1; i < nInsert; i++) \ + base_array::operator[](uiIndex + i) = new T(item); \ +} \ + \ +int name::Index(const T& Item, bool bFromEnd) const \ +{ \ + if ( bFromEnd ) { \ + if ( size() > 0 ) { \ + size_t ui = size() - 1; \ + do { \ + if ( (T*)base_array::operator[](ui) == &Item ) \ + return wx_static_cast(int, ui); \ + ui--; \ + } \ + while ( ui != 0 ); \ + } \ + } \ + else { \ + for( size_t ui = 0; ui < size(); ui++ ) { \ + if( (T*)base_array::operator[](ui) == &Item ) \ + return wx_static_cast(int, ui); \ + } \ + } \ + \ + return wxNOT_FOUND; \ +} + +// redefine the macro so that now it will generate the class implementation +// old value would provoke a compile-time error if this file is not included +#undef WX_DEFINE_OBJARRAY +#define WX_DEFINE_OBJARRAY(name) _DEFINE_OBJARRAY(_wxObjArray##name, name) diff --git a/Externals/wxWidgets/include/wx/arrstr.h b/Externals/wxWidgets/include/wx/arrstr.h new file mode 100644 index 0000000000..d2dd4770ae --- /dev/null +++ b/Externals/wxWidgets/include/wx/arrstr.h @@ -0,0 +1,372 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: include/wx/arrstr.h +// Purpose: wxArrayString class +// Author: Mattia Barbon and Vadim Zeitlin +// Modified by: +// Created: 07/07/03 +// RCS-ID: $Id: arrstr.h 33888 2005-04-26 19:24:12Z MBN $ +// Copyright: (c) 2003 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_ARRSTR_H +#define _WX_ARRSTR_H + +#include "wx/defs.h" +#include "wx/string.h" + +WXDLLIMPEXP_BASE int wxCMPFUNC_CONV wxStringSortAscending(wxString*, wxString*); +WXDLLIMPEXP_BASE int wxCMPFUNC_CONV wxStringSortDescending(wxString*, wxString*); + +#if wxUSE_STL + +#include "wx/dynarray.h" + +typedef int (wxCMPFUNC_CONV *CMPFUNCwxString)(wxString*, wxString*); +typedef wxString _wxArraywxBaseArrayStringBase; +_WX_DECLARE_BASEARRAY_2(_wxArraywxBaseArrayStringBase, wxBaseArrayStringBase, + wxArray_SortFunction, + class WXDLLIMPEXP_BASE); +WX_DEFINE_USER_EXPORTED_TYPEARRAY(wxString, wxArrayStringBase, + wxBaseArrayStringBase, WXDLLIMPEXP_BASE); +_WX_DEFINE_SORTED_TYPEARRAY_2(wxString, wxSortedArrayStringBase, + wxBaseArrayStringBase, = wxStringSortAscending, + class WXDLLIMPEXP_BASE, CMPFUNCwxString); + +class WXDLLIMPEXP_BASE wxArrayString : public wxArrayStringBase +{ +public: + // type of function used by wxArrayString::Sort() + typedef int (wxCMPFUNC_CONV *CompareFunction)(const wxString& first, + const wxString& second); + + wxArrayString() { } + wxArrayString(const wxArrayString& a) : wxArrayStringBase(a) { } + wxArrayString(size_t sz, const wxChar** a); + wxArrayString(size_t sz, const wxString* a); + + int Index(const wxChar* sz, bool bCase = true, bool bFromEnd = false) const; + + void Sort(bool reverseOrder = false); + void Sort(CompareFunction function); + void Sort(CMPFUNCwxString function) { wxArrayStringBase::Sort(function); } + + size_t Add(const wxString& string, size_t copies = 1) + { + wxArrayStringBase::Add(string, copies); + return size() - copies; + } +}; + +class WXDLLIMPEXP_BASE wxSortedArrayString : public wxSortedArrayStringBase +{ +public: + wxSortedArrayString() : wxSortedArrayStringBase(wxStringSortAscending) + { } + wxSortedArrayString(const wxSortedArrayString& array) + : wxSortedArrayStringBase(array) + { } + wxSortedArrayString(const wxArrayString& src) + : wxSortedArrayStringBase(wxStringSortAscending) + { + reserve(src.size()); + + for ( size_t n = 0; n < src.size(); n++ ) + Add(src[n]); + } + + int Index(const wxChar* sz, bool bCase = true, bool bFromEnd = false) const; +}; + +#else // if !wxUSE_STL + +// ---------------------------------------------------------------------------- +// The string array uses it's knowledge of internal structure of the wxString +// class to optimize string storage. Normally, we would store pointers to +// string, but as wxString is, in fact, itself a pointer (sizeof(wxString) is +// sizeof(char *)) we store these pointers instead. The cast to "wxString *" is +// really all we need to turn such pointer into a string! +// +// Of course, it can be called a dirty hack, but we use twice less memory and +// this approach is also more speed efficient, so it's probably worth it. +// +// Usage notes: when a string is added/inserted, a new copy of it is created, +// so the original string may be safely deleted. When a string is retrieved +// from the array (operator[] or Item() method), a reference is returned. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxArrayString +{ +public: + // type of function used by wxArrayString::Sort() + typedef int (wxCMPFUNC_CONV *CompareFunction)(const wxString& first, + const wxString& second); + // type of function used by wxArrayString::Sort(), for compatibility with + // wxArray + typedef int (wxCMPFUNC_CONV *CompareFunction2)(wxString* first, + wxString* second); + + // constructors and destructor + // default ctor + wxArrayString() { Init(false); } + // if autoSort is true, the array is always sorted (in alphabetical order) + // + // NB: the reason for using int and not bool is that like this we can avoid + // using this ctor for implicit conversions from "const char *" (which + // we'd like to be implicitly converted to wxString instead!) + // + // of course, using explicit would be even better - if all compilers + // supported it... + wxArrayString(int autoSort) { Init(autoSort != 0); } + // C string array ctor + wxArrayString(size_t sz, const wxChar** a); + // wxString string array ctor + wxArrayString(size_t sz, const wxString* a); + // copy ctor + wxArrayString(const wxArrayString& array); + // assignment operator + wxArrayString& operator=(const wxArrayString& src); + // not virtual, this class should not be derived from + ~wxArrayString(); + + // memory management + // empties the list, but doesn't release memory + void Empty(); + // empties the list and releases memory + void Clear(); + // preallocates memory for given number of items + void Alloc(size_t nCount); + // minimzes the memory usage (by freeing all extra memory) + void Shrink(); + + // simple accessors + // number of elements in the array + size_t GetCount() const { return m_nCount; } + // is it empty? + bool IsEmpty() const { return m_nCount == 0; } + // number of elements in the array (GetCount is preferred API) + size_t Count() const { return m_nCount; } + + // items access (range checking is done in debug version) + // get item at position uiIndex + wxString& Item(size_t nIndex) const + { + wxASSERT_MSG( nIndex < m_nCount, + _T("wxArrayString: index out of bounds") ); + + return *(wxString *)&(m_pItems[nIndex]); + } + + // same as Item() + wxString& operator[](size_t nIndex) const { return Item(nIndex); } + // get last item + wxString& Last() const + { + wxASSERT_MSG( !IsEmpty(), + _T("wxArrayString: index out of bounds") ); + return Item(Count() - 1); + } + + // return a wxString[], useful for the controls which + // take one in their ctor. You must delete[] it yourself + // once you are done with it. Will return NULL if the + // ArrayString was empty. +#if WXWIN_COMPATIBILITY_2_4 + wxDEPRECATED( wxString* GetStringArray() const ); +#endif + + // item management + // Search the element in the array, starting from the beginning if + // bFromEnd is false or from end otherwise. If bCase, comparison is case + // sensitive (default). Returns index of the first item matched or + // wxNOT_FOUND + int Index (const wxChar *sz, bool bCase = true, bool bFromEnd = false) const; + // add new element at the end (if the array is not sorted), return its + // index + size_t Add(const wxString& str, size_t nInsert = 1); + // add new element at given position + void Insert(const wxString& str, size_t uiIndex, size_t nInsert = 1); + // expand the array to have count elements + void SetCount(size_t count); + // remove first item matching this value + void Remove(const wxChar *sz); + // remove item by index +#if WXWIN_COMPATIBILITY_2_4 + wxDEPRECATED( void Remove(size_t nIndex, size_t nRemove = 1) ); +#endif + void RemoveAt(size_t nIndex, size_t nRemove = 1); + + // sorting + // sort array elements in alphabetical order (or reversed alphabetical + // order if reverseOrder parameter is true) + void Sort(bool reverseOrder = false); + // sort array elements using specified comparaison function + void Sort(CompareFunction compareFunction); + void Sort(CompareFunction2 compareFunction); + + // comparison + // compare two arrays case sensitively + bool operator==(const wxArrayString& a) const; + // compare two arrays case sensitively + bool operator!=(const wxArrayString& a) const { return !(*this == a); } + + // STL-like interface + typedef wxString value_type; + typedef value_type* pointer; + typedef const value_type* const_pointer; + typedef value_type* iterator; + typedef const value_type* const_iterator; + typedef value_type& reference; + typedef const value_type& const_reference; + typedef int difference_type; + typedef size_t size_type; + + // TODO: this code duplicates the one in dynarray.h + class reverse_iterator + { + typedef wxString value_type; + typedef value_type* pointer; + typedef value_type& reference; + typedef reverse_iterator itor; + friend itor operator+(int o, const itor& it); + friend itor operator+(const itor& it, int o); + friend itor operator-(const itor& it, int o); + friend difference_type operator -(const itor& i1, const itor& i2); + public: + pointer m_ptr; + reverse_iterator() : m_ptr(NULL) { } + reverse_iterator(pointer ptr) : m_ptr(ptr) { } + reverse_iterator(const itor& it) : m_ptr(it.m_ptr) { } + reference operator*() const { return *m_ptr; } + pointer operator->() const { return m_ptr; } + itor& operator++() { --m_ptr; return *this; } + const itor operator++(int) + { reverse_iterator tmp = *this; --m_ptr; return tmp; } + itor& operator--() { ++m_ptr; return *this; } + const itor operator--(int) { itor tmp = *this; ++m_ptr; return tmp; } + bool operator ==(const itor& it) const { return m_ptr == it.m_ptr; } + bool operator !=(const itor& it) const { return m_ptr != it.m_ptr; } + }; + + class const_reverse_iterator + { + typedef wxString value_type; + typedef const value_type* pointer; + typedef const value_type& reference; + typedef const_reverse_iterator itor; + friend itor operator+(int o, const itor& it); + friend itor operator+(const itor& it, int o); + friend itor operator-(const itor& it, int o); + friend difference_type operator -(const itor& i1, const itor& i2); + public: + pointer m_ptr; + const_reverse_iterator() : m_ptr(NULL) { } + const_reverse_iterator(pointer ptr) : m_ptr(ptr) { } + const_reverse_iterator(const itor& it) : m_ptr(it.m_ptr) { } + const_reverse_iterator(const reverse_iterator& it) : m_ptr(it.m_ptr) { } + reference operator*() const { return *m_ptr; } + pointer operator->() const { return m_ptr; } + itor& operator++() { --m_ptr; return *this; } + const itor operator++(int) + { itor tmp = *this; --m_ptr; return tmp; } + itor& operator--() { ++m_ptr; return *this; } + const itor operator--(int) { itor tmp = *this; ++m_ptr; return tmp; } + bool operator ==(const itor& it) const { return m_ptr == it.m_ptr; } + bool operator !=(const itor& it) const { return m_ptr != it.m_ptr; } + }; + + wxArrayString(const_iterator first, const_iterator last) + { Init(false); assign(first, last); } + wxArrayString(size_type n, const_reference v) { Init(false); assign(n, v); } + void assign(const_iterator first, const_iterator last); + void assign(size_type n, const_reference v) + { clear(); Add(v, n); } + reference back() { return *(end() - 1); } + const_reference back() const { return *(end() - 1); } + iterator begin() { return (wxString *)&(m_pItems[0]); } + const_iterator begin() const { return (wxString *)&(m_pItems[0]); } + size_type capacity() const { return m_nSize; } + void clear() { Clear(); } + bool empty() const { return IsEmpty(); } + iterator end() { return begin() + GetCount(); } + const_iterator end() const { return begin() + GetCount(); } + iterator erase(iterator first, iterator last) + { + size_t idx = first - begin(); + RemoveAt(idx, last - first); + return begin() + idx; + } + iterator erase(iterator it) { return erase(it, it + 1); } + reference front() { return *begin(); } + const_reference front() const { return *begin(); } + void insert(iterator it, size_type n, const_reference v) + { Insert(v, it - begin(), n); } + iterator insert(iterator it, const_reference v = value_type()) + { size_t idx = it - begin(); Insert(v, idx); return begin() + idx; } + void insert(iterator it, const_iterator first, const_iterator last); + size_type max_size() const { return INT_MAX; } + void pop_back() { RemoveAt(GetCount() - 1); } + void push_back(const_reference v) { Add(v); } + reverse_iterator rbegin() { return reverse_iterator(end() - 1); } + const_reverse_iterator rbegin() const; + reverse_iterator rend() { return reverse_iterator(begin() - 1); } + const_reverse_iterator rend() const; + void reserve(size_type n) /* base::reserve*/; + void resize(size_type n, value_type v = value_type()); + size_type size() const { return GetCount(); } + +protected: + void Init(bool autoSort); // common part of all ctors + void Copy(const wxArrayString& src); // copies the contents of another array + +private: + void Grow(size_t nIncrement = 0); // makes array bigger if needed + void Free(); // free all the strings stored + + void DoSort(); // common part of all Sort() variants + + size_t m_nSize, // current size of the array + m_nCount; // current number of elements + + wxChar **m_pItems; // pointer to data + + bool m_autoSort; // if true, keep the array always sorted +}; + +class WXDLLIMPEXP_BASE wxSortedArrayString : public wxArrayString +{ +public: + wxSortedArrayString() : wxArrayString(true) + { } + wxSortedArrayString(const wxArrayString& array) : wxArrayString(true) + { Copy(array); } +}; + +#endif // !wxUSE_STL + +// this class provides a temporary wxString* from a +// wxArrayString +class WXDLLIMPEXP_BASE wxCArrayString +{ +public: + wxCArrayString( const wxArrayString& array ) + : m_array( array ), m_strings( NULL ) + { } + ~wxCArrayString() { delete[] m_strings; } + + size_t GetCount() const { return m_array.GetCount(); } + wxString* GetStrings() + { + if( m_strings ) return m_strings; + size_t count = m_array.GetCount(); + m_strings = new wxString[count]; + for( size_t i = 0; i < count; ++i ) + m_strings[i] = m_array[i]; + return m_strings; + } +private: + const wxArrayString& m_array; + wxString* m_strings; +}; + +#endif diff --git a/Externals/wxWidgets/include/wx/artprov.h b/Externals/wxWidgets/include/wx/artprov.h new file mode 100644 index 0000000000..872b49e4d7 --- /dev/null +++ b/Externals/wxWidgets/include/wx/artprov.h @@ -0,0 +1,200 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/artprov.h +// Purpose: wxArtProvider class +// Author: Vaclav Slavik +// Modified by: +// Created: 18/03/2002 +// RCS-ID: $Id: artprov.h 42713 2006-10-30 11:56:12Z ABX $ +// Copyright: (c) Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_ARTPROV_H_ +#define _WX_ARTPROV_H_ + +#include "wx/string.h" +#include "wx/bitmap.h" +#include "wx/icon.h" + +class WXDLLEXPORT wxArtProvidersList; +class WXDLLEXPORT wxArtProviderCache; +class wxArtProviderModule; + +// ---------------------------------------------------------------------------- +// Types +// ---------------------------------------------------------------------------- + +typedef wxString wxArtClient; +typedef wxString wxArtID; + +#define wxART_MAKE_CLIENT_ID_FROM_STR(id) (id + _T("_C")) +#define wxART_MAKE_CLIENT_ID(id) _T(#id) _T("_C") +#define wxART_MAKE_ART_ID_FROM_STR(id) (id) +#define wxART_MAKE_ART_ID(id) _T(#id) + +// ---------------------------------------------------------------------------- +// Art clients +// ---------------------------------------------------------------------------- + +#define wxART_TOOLBAR wxART_MAKE_CLIENT_ID(wxART_TOOLBAR) +#define wxART_MENU wxART_MAKE_CLIENT_ID(wxART_MENU) +#define wxART_FRAME_ICON wxART_MAKE_CLIENT_ID(wxART_FRAME_ICON) + +#define wxART_CMN_DIALOG wxART_MAKE_CLIENT_ID(wxART_CMN_DIALOG) +#define wxART_HELP_BROWSER wxART_MAKE_CLIENT_ID(wxART_HELP_BROWSER) +#define wxART_MESSAGE_BOX wxART_MAKE_CLIENT_ID(wxART_MESSAGE_BOX) +#define wxART_BUTTON wxART_MAKE_CLIENT_ID(wxART_BUTTON) + +#define wxART_OTHER wxART_MAKE_CLIENT_ID(wxART_OTHER) + +// ---------------------------------------------------------------------------- +// Art IDs +// ---------------------------------------------------------------------------- + +#define wxART_ADD_BOOKMARK wxART_MAKE_ART_ID(wxART_ADD_BOOKMARK) +#define wxART_DEL_BOOKMARK wxART_MAKE_ART_ID(wxART_DEL_BOOKMARK) +#define wxART_HELP_SIDE_PANEL wxART_MAKE_ART_ID(wxART_HELP_SIDE_PANEL) +#define wxART_HELP_SETTINGS wxART_MAKE_ART_ID(wxART_HELP_SETTINGS) +#define wxART_HELP_BOOK wxART_MAKE_ART_ID(wxART_HELP_BOOK) +#define wxART_HELP_FOLDER wxART_MAKE_ART_ID(wxART_HELP_FOLDER) +#define wxART_HELP_PAGE wxART_MAKE_ART_ID(wxART_HELP_PAGE) +#define wxART_GO_BACK wxART_MAKE_ART_ID(wxART_GO_BACK) +#define wxART_GO_FORWARD wxART_MAKE_ART_ID(wxART_GO_FORWARD) +#define wxART_GO_UP wxART_MAKE_ART_ID(wxART_GO_UP) +#define wxART_GO_DOWN wxART_MAKE_ART_ID(wxART_GO_DOWN) +#define wxART_GO_TO_PARENT wxART_MAKE_ART_ID(wxART_GO_TO_PARENT) +#define wxART_GO_HOME wxART_MAKE_ART_ID(wxART_GO_HOME) +#define wxART_FILE_OPEN wxART_MAKE_ART_ID(wxART_FILE_OPEN) +#define wxART_FILE_SAVE wxART_MAKE_ART_ID(wxART_FILE_SAVE) +#define wxART_FILE_SAVE_AS wxART_MAKE_ART_ID(wxART_FILE_SAVE_AS) +#define wxART_PRINT wxART_MAKE_ART_ID(wxART_PRINT) +#define wxART_HELP wxART_MAKE_ART_ID(wxART_HELP) +#define wxART_TIP wxART_MAKE_ART_ID(wxART_TIP) +#define wxART_REPORT_VIEW wxART_MAKE_ART_ID(wxART_REPORT_VIEW) +#define wxART_LIST_VIEW wxART_MAKE_ART_ID(wxART_LIST_VIEW) +#define wxART_NEW_DIR wxART_MAKE_ART_ID(wxART_NEW_DIR) +#define wxART_HARDDISK wxART_MAKE_ART_ID(wxART_HARDDISK) +#define wxART_FLOPPY wxART_MAKE_ART_ID(wxART_FLOPPY) +#define wxART_CDROM wxART_MAKE_ART_ID(wxART_CDROM) +#define wxART_REMOVABLE wxART_MAKE_ART_ID(wxART_REMOVABLE) +#define wxART_FOLDER wxART_MAKE_ART_ID(wxART_FOLDER) +#define wxART_FOLDER_OPEN wxART_MAKE_ART_ID(wxART_FOLDER_OPEN) +#define wxART_GO_DIR_UP wxART_MAKE_ART_ID(wxART_GO_DIR_UP) +#define wxART_EXECUTABLE_FILE wxART_MAKE_ART_ID(wxART_EXECUTABLE_FILE) +#define wxART_NORMAL_FILE wxART_MAKE_ART_ID(wxART_NORMAL_FILE) +#define wxART_TICK_MARK wxART_MAKE_ART_ID(wxART_TICK_MARK) +#define wxART_CROSS_MARK wxART_MAKE_ART_ID(wxART_CROSS_MARK) +#define wxART_ERROR wxART_MAKE_ART_ID(wxART_ERROR) +#define wxART_QUESTION wxART_MAKE_ART_ID(wxART_QUESTION) +#define wxART_WARNING wxART_MAKE_ART_ID(wxART_WARNING) +#define wxART_INFORMATION wxART_MAKE_ART_ID(wxART_INFORMATION) +#define wxART_MISSING_IMAGE wxART_MAKE_ART_ID(wxART_MISSING_IMAGE) + +#define wxART_COPY wxART_MAKE_ART_ID(wxART_COPY) +#define wxART_CUT wxART_MAKE_ART_ID(wxART_CUT) +#define wxART_PASTE wxART_MAKE_ART_ID(wxART_PASTE) +#define wxART_DELETE wxART_MAKE_ART_ID(wxART_DELETE) +#define wxART_NEW wxART_MAKE_ART_ID(wxART_NEW) + +#define wxART_UNDO wxART_MAKE_ART_ID(wxART_UNDO) +#define wxART_REDO wxART_MAKE_ART_ID(wxART_REDO) + +#define wxART_QUIT wxART_MAKE_ART_ID(wxART_QUIT) + +#define wxART_FIND wxART_MAKE_ART_ID(wxART_FIND) +#define wxART_FIND_AND_REPLACE wxART_MAKE_ART_ID(wxART_FIND_AND_REPLACE) + + +// ---------------------------------------------------------------------------- +// wxArtProvider class +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxArtProvider : public wxObject +{ +public: + // Dtor removes the provider from providers stack if it's still on it + virtual ~wxArtProvider(); + + + // Add new provider to the top of providers stack (i.e. the provider will + // be queried first of all). + static void Push(wxArtProvider *provider); + + // Add new provider to the bottom of providers stack (i.e. the provider + // will be queried as the last one). + static void Insert(wxArtProvider *provider); + + // Remove latest added provider and delete it. + static bool Pop(); + + // Remove provider from providers stack but don't delete it. + static bool Remove(wxArtProvider *provider); + + // Delete the given provider and remove it from the providers stack. + static bool Delete(wxArtProvider *provider); + + + // Query the providers for bitmap with given ID and return it. Return + // wxNullBitmap if no provider provides it. + static wxBitmap GetBitmap(const wxArtID& id, + const wxArtClient& client = wxART_OTHER, + const wxSize& size = wxDefaultSize); + + // Query the providers for icon with given ID and return it. Return + // wxNullIcon if no provider provides it. + static wxIcon GetIcon(const wxArtID& id, + const wxArtClient& client = wxART_OTHER, + const wxSize& size = wxDefaultSize); + + // Get the size hint of an icon from a specific wxArtClient, queries + // the topmost provider if platform_dependent = false + static wxSize GetSizeHint(const wxArtClient& client, bool platform_dependent = false); + +#if WXWIN_COMPATIBILITY_2_6 + // use the corresponding methods without redundant "Provider" suffix + wxDEPRECATED( static void PushProvider(wxArtProvider *provider) ); + wxDEPRECATED( static void InsertProvider(wxArtProvider *provider) ); + wxDEPRECATED( static bool PopProvider() ); + + // use Delete() if this is what you really need, or just delete the + // provider pointer, do not use Remove() as it does not delete the pointer + // unlike RemoveProvider() which does + wxDEPRECATED( static bool RemoveProvider(wxArtProvider *provider) ); +#endif // WXWIN_COMPATIBILITY_2_6 + +protected: + friend class wxArtProviderModule; + // Initializes default provider + static void InitStdProvider(); + // Initializes platform's native provider, if available (e.g. GTK2) + static void InitNativeProvider(); + // Destroy caches & all providers + static void CleanUpProviders(); + + // Get the default size of an icon for a specific client + virtual wxSize DoGetSizeHint(const wxArtClient& client) + { + return GetSizeHint(client, true); + } + + // Derived classes must override this method to create requested + // art resource. This method is called only once per instance's + // lifetime for each requested wxArtID. + virtual wxBitmap CreateBitmap(const wxArtID& WXUNUSED(id), + const wxArtClient& WXUNUSED(client), + const wxSize& WXUNUSED(size)) = 0; + +private: + static void CommonAddingProvider(); + +private: + // list of providers: + static wxArtProvidersList *sm_providers; + // art resources cache (so that CreateXXX is not called that often): + static wxArtProviderCache *sm_cache; + + DECLARE_ABSTRACT_CLASS(wxArtProvider) +}; + + +#endif // _WX_ARTPROV_H_ diff --git a/Externals/wxWidgets/include/wx/aui/aui.h b/Externals/wxWidgets/include/wx/aui/aui.h new file mode 100644 index 0000000000..6902fa99bf --- /dev/null +++ b/Externals/wxWidgets/include/wx/aui/aui.h @@ -0,0 +1,22 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/aui/aui.h +// Purpose: wxaui: wx advanced user interface - docking window manager +// Author: Benjamin I. Williams +// Modified by: +// Created: 2005-05-17 +// RCS-ID: $Id: aui.h 40232 2006-07-22 13:14:07Z BIW $ +// Copyright: (C) Copyright 2005, Kirix Corporation, All Rights Reserved. +// Licence: wxWindows Library Licence, Version 3.1 +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_AUI_H_ +#define _WX_AUI_H_ + +#include "wx/aui/framemanager.h" +#include "wx/aui/dockart.h" +#include "wx/aui/floatpane.h" +#include "wx/aui/auibook.h" +#include "wx/aui/tabmdi.h" + +#endif // _WX_AUI_H_ + diff --git a/Externals/wxWidgets/include/wx/aui/auibook.h b/Externals/wxWidgets/include/wx/aui/auibook.h new file mode 100644 index 0000000000..fbef53ca4b --- /dev/null +++ b/Externals/wxWidgets/include/wx/aui/auibook.h @@ -0,0 +1,751 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/aui/auibook.h +// Purpose: wxaui: wx advanced user interface - notebook +// Author: Benjamin I. Williams +// Modified by: +// Created: 2006-06-28 +// Copyright: (C) Copyright 2006, Kirix Corporation, All Rights Reserved. +// Licence: wxWindows Library Licence, Version 3.1 +/////////////////////////////////////////////////////////////////////////////// + + + +#ifndef _WX_AUINOTEBOOK_H_ +#define _WX_AUINOTEBOOK_H_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/defs.h" + +#if wxUSE_AUI + +#include "wx/aui/framemanager.h" +#include "wx/aui/dockart.h" +#include "wx/aui/floatpane.h" +#include "wx/control.h" + + +class wxAuiNotebook; + + +enum wxAuiNotebookOption +{ + wxAUI_NB_TOP = 1 << 0, + wxAUI_NB_LEFT = 1 << 1, // not implemented yet + wxAUI_NB_RIGHT = 1 << 2, // not implemented yet + wxAUI_NB_BOTTOM = 1 << 3, + wxAUI_NB_TAB_SPLIT = 1 << 4, + wxAUI_NB_TAB_MOVE = 1 << 5, + wxAUI_NB_TAB_EXTERNAL_MOVE = 1 << 6, + wxAUI_NB_TAB_FIXED_WIDTH = 1 << 7, + wxAUI_NB_SCROLL_BUTTONS = 1 << 8, + wxAUI_NB_WINDOWLIST_BUTTON = 1 << 9, + wxAUI_NB_CLOSE_BUTTON = 1 << 10, + wxAUI_NB_CLOSE_ON_ACTIVE_TAB = 1 << 11, + wxAUI_NB_CLOSE_ON_ALL_TABS = 1 << 12, + wxAUI_NB_MIDDLE_CLICK_CLOSE = 1 << 13, + + wxAUI_NB_DEFAULT_STYLE = wxAUI_NB_TOP | + wxAUI_NB_TAB_SPLIT | + wxAUI_NB_TAB_MOVE | + wxAUI_NB_SCROLL_BUTTONS | + wxAUI_NB_CLOSE_ON_ACTIVE_TAB | + wxAUI_NB_MIDDLE_CLICK_CLOSE +}; + + + + +// aui notebook event class + +class WXDLLIMPEXP_AUI wxAuiNotebookEvent : public wxNotifyEvent +{ +public: + wxAuiNotebookEvent(wxEventType command_type = wxEVT_NULL, + int win_id = 0) + : wxNotifyEvent(command_type, win_id) + { + old_selection = -1; + selection = -1; + drag_source = NULL; + } +#ifndef SWIG + wxAuiNotebookEvent(const wxAuiNotebookEvent& c) : wxNotifyEvent(c) + { + old_selection = c.old_selection; + selection = c.selection; + drag_source = c.drag_source; + } +#endif + wxEvent *Clone() const { return new wxAuiNotebookEvent(*this); } + + void SetSelection(int s) { selection = s; m_commandInt = s; } + int GetSelection() const { return selection; } + + void SetOldSelection(int s) { old_selection = s; } + int GetOldSelection() const { return old_selection; } + + void SetDragSource(wxAuiNotebook* s) { drag_source = s; } + wxAuiNotebook* GetDragSource() const { return drag_source; } + +public: + int old_selection; + int selection; + wxAuiNotebook* drag_source; + +#ifndef SWIG +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxAuiNotebookEvent) +#endif +}; + + +class WXDLLIMPEXP_AUI wxAuiNotebookPage +{ +public: + wxWindow* window; // page's associated window + wxString caption; // caption displayed on the tab + wxBitmap bitmap; // tab's bitmap + wxRect rect; // tab's hit rectangle + bool active; // true if the page is currently active +}; + +class WXDLLIMPEXP_AUI wxAuiTabContainerButton +{ +public: + + int id; // button's id + int cur_state; // current state (normal, hover, pressed, etc.) + int location; // buttons location (wxLEFT, wxRIGHT, or wxCENTER) + wxBitmap bitmap; // button's hover bitmap + wxBitmap dis_bitmap; // button's disabled bitmap + wxRect rect; // button's hit rectangle +}; + + +#ifndef SWIG +WX_DECLARE_USER_EXPORTED_OBJARRAY(wxAuiNotebookPage, wxAuiNotebookPageArray, WXDLLIMPEXP_AUI); +WX_DECLARE_USER_EXPORTED_OBJARRAY(wxAuiTabContainerButton, wxAuiTabContainerButtonArray, WXDLLIMPEXP_AUI); +#endif + + +// tab art class + +class WXDLLIMPEXP_AUI wxAuiTabArt +{ +public: + + wxAuiTabArt() { } + virtual ~wxAuiTabArt() { } + + virtual wxAuiTabArt* Clone() = 0; + virtual void SetFlags(unsigned int flags) = 0; + + virtual void SetSizingInfo(const wxSize& tab_ctrl_size, + size_t tab_count) = 0; + + virtual void SetNormalFont(const wxFont& font) = 0; + virtual void SetSelectedFont(const wxFont& font) = 0; + virtual void SetMeasuringFont(const wxFont& font) = 0; + + virtual void DrawBackground( + wxDC& dc, + wxWindow* wnd, + const wxRect& rect) = 0; + + virtual void DrawTab(wxDC& dc, + wxWindow* wnd, + const wxAuiNotebookPage& pane, + const wxRect& in_rect, + int close_button_state, + wxRect* out_tab_rect, + wxRect* out_button_rect, + int* x_extent) = 0; + + virtual void DrawButton( + wxDC& dc, + wxWindow* wnd, + const wxRect& in_rect, + int bitmap_id, + int button_state, + int orientation, + wxRect* out_rect) = 0; + + virtual wxSize GetTabSize( + wxDC& dc, + wxWindow* wnd, + const wxString& caption, + const wxBitmap& bitmap, + bool active, + int close_button_state, + int* x_extent) = 0; + + virtual int ShowDropDown( + wxWindow* wnd, + const wxAuiNotebookPageArray& items, + int active_idx) = 0; + + virtual int GetIndentSize() = 0; + + virtual int GetBestTabCtrlSize( + wxWindow* wnd, + const wxAuiNotebookPageArray& pages, + const wxSize& required_bmp_size) = 0; +}; + + +class WXDLLIMPEXP_AUI wxAuiDefaultTabArt : public wxAuiTabArt +{ + +public: + + wxAuiDefaultTabArt(); + virtual ~wxAuiDefaultTabArt(); + + wxAuiTabArt* Clone(); + void SetFlags(unsigned int flags); + void SetSizingInfo(const wxSize& tab_ctrl_size, + size_t tab_count); + + void SetNormalFont(const wxFont& font); + void SetSelectedFont(const wxFont& font); + void SetMeasuringFont(const wxFont& font); + + void DrawBackground( + wxDC& dc, + wxWindow* wnd, + const wxRect& rect); + + void DrawTab(wxDC& dc, + wxWindow* wnd, + const wxAuiNotebookPage& pane, + const wxRect& in_rect, + int close_button_state, + wxRect* out_tab_rect, + wxRect* out_button_rect, + int* x_extent); + + void DrawButton( + wxDC& dc, + wxWindow* wnd, + const wxRect& in_rect, + int bitmap_id, + int button_state, + int orientation, + wxRect* out_rect); + + int GetIndentSize(); + + wxSize GetTabSize( + wxDC& dc, + wxWindow* wnd, + const wxString& caption, + const wxBitmap& bitmap, + bool active, + int close_button_state, + int* x_extent); + + int ShowDropDown( + wxWindow* wnd, + const wxAuiNotebookPageArray& items, + int active_idx); + + int GetBestTabCtrlSize(wxWindow* wnd, + const wxAuiNotebookPageArray& pages, + const wxSize& required_bmp_size); + +protected: + + wxFont m_normal_font; + wxFont m_selected_font; + wxFont m_measuring_font; + wxColour m_base_colour; + wxPen m_base_colour_pen; + wxPen m_border_pen; + wxBrush m_base_colour_brush; + wxBitmap m_active_close_bmp; + wxBitmap m_disabled_close_bmp; + wxBitmap m_active_left_bmp; + wxBitmap m_disabled_left_bmp; + wxBitmap m_active_right_bmp; + wxBitmap m_disabled_right_bmp; + wxBitmap m_active_windowlist_bmp; + wxBitmap m_disabled_windowlist_bmp; + + int m_fixed_tab_width; + int m_tab_ctrl_height; + unsigned int m_flags; +}; + + +class WXDLLIMPEXP_AUI wxAuiSimpleTabArt : public wxAuiTabArt +{ + +public: + + wxAuiSimpleTabArt(); + virtual ~wxAuiSimpleTabArt(); + + wxAuiTabArt* Clone(); + void SetFlags(unsigned int flags); + + void SetSizingInfo(const wxSize& tab_ctrl_size, + size_t tab_count); + + void SetNormalFont(const wxFont& font); + void SetSelectedFont(const wxFont& font); + void SetMeasuringFont(const wxFont& font); + + void DrawBackground( + wxDC& dc, + wxWindow* wnd, + const wxRect& rect); + + void DrawTab(wxDC& dc, + wxWindow* wnd, + const wxAuiNotebookPage& pane, + const wxRect& in_rect, + int close_button_state, + wxRect* out_tab_rect, + wxRect* out_button_rect, + int* x_extent); + + void DrawButton( + wxDC& dc, + wxWindow* wnd, + const wxRect& in_rect, + int bitmap_id, + int button_state, + int orientation, + wxRect* out_rect); + + int GetIndentSize(); + + wxSize GetTabSize( + wxDC& dc, + wxWindow* wnd, + const wxString& caption, + const wxBitmap& bitmap, + bool active, + int close_button_state, + int* x_extent); + + int ShowDropDown( + wxWindow* wnd, + const wxAuiNotebookPageArray& items, + int active_idx); + + int GetBestTabCtrlSize(wxWindow* wnd, + const wxAuiNotebookPageArray& pages, + const wxSize& required_bmp_size); + +protected: + + wxFont m_normal_font; + wxFont m_selected_font; + wxFont m_measuring_font; + wxPen m_normal_bkpen; + wxPen m_selected_bkpen; + wxBrush m_normal_bkbrush; + wxBrush m_selected_bkbrush; + wxBrush m_bkbrush; + wxBitmap m_active_close_bmp; + wxBitmap m_disabled_close_bmp; + wxBitmap m_active_left_bmp; + wxBitmap m_disabled_left_bmp; + wxBitmap m_active_right_bmp; + wxBitmap m_disabled_right_bmp; + wxBitmap m_active_windowlist_bmp; + wxBitmap m_disabled_windowlist_bmp; + + int m_fixed_tab_width; + unsigned int m_flags; +}; + + + + + + + + + +class WXDLLIMPEXP_AUI wxAuiTabContainer +{ +public: + + wxAuiTabContainer(); + virtual ~wxAuiTabContainer(); + + void SetArtProvider(wxAuiTabArt* art); + wxAuiTabArt* GetArtProvider() const; + + void SetFlags(unsigned int flags); + unsigned int GetFlags() const; + + bool AddPage(wxWindow* page, const wxAuiNotebookPage& info); + bool InsertPage(wxWindow* page, const wxAuiNotebookPage& info, size_t idx); + bool MovePage(wxWindow* page, size_t new_idx); + bool RemovePage(wxWindow* page); + bool SetActivePage(wxWindow* page); + bool SetActivePage(size_t page); + void SetNoneActive(); + int GetActivePage() const; + bool TabHitTest(int x, int y, wxWindow** hit) const; + bool ButtonHitTest(int x, int y, wxAuiTabContainerButton** hit) const; + wxWindow* GetWindowFromIdx(size_t idx) const; + int GetIdxFromWindow(wxWindow* page) const; + size_t GetPageCount() const; + wxAuiNotebookPage& GetPage(size_t idx); + const wxAuiNotebookPage& GetPage(size_t idx) const; + wxAuiNotebookPageArray& GetPages(); + void SetNormalFont(const wxFont& normal_font); + void SetSelectedFont(const wxFont& selected_font); + void SetMeasuringFont(const wxFont& measuring_font); + void DoShowHide(); + void SetRect(const wxRect& rect); + + void RemoveButton(int id); + void AddButton(int id, + int location, + const wxBitmap& normal_bitmap = wxNullBitmap, + const wxBitmap& disabled_bitmap = wxNullBitmap); + + size_t GetTabOffset() const; + void SetTabOffset(size_t offset); + + // Is the tab visible? + bool IsTabVisible(int tabPage, int tabOffset, wxDC* dc, wxWindow* wnd); + + // Make the tab visible if it wasn't already + void MakeTabVisible(int tabPage, wxWindow* win); + +protected: + + virtual void Render(wxDC* dc, wxWindow* wnd); + +protected: + + wxAuiTabArt* m_art; + wxAuiNotebookPageArray m_pages; + wxAuiTabContainerButtonArray m_buttons; + wxAuiTabContainerButtonArray m_tab_close_buttons; + wxRect m_rect; + size_t m_tab_offset; + unsigned int m_flags; +}; + + + +class WXDLLIMPEXP_AUI wxAuiTabCtrl : public wxControl, + public wxAuiTabContainer +{ +public: + + wxAuiTabCtrl(wxWindow* parent, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0); + + ~wxAuiTabCtrl(); + +#if wxABI_VERSION >= 20805 + bool IsDragging() const { return m_is_dragging; } +#endif + +protected: + + void OnPaint(wxPaintEvent& evt); + void OnEraseBackground(wxEraseEvent& evt); + void OnSize(wxSizeEvent& evt); + void OnLeftDown(wxMouseEvent& evt); + void OnLeftUp(wxMouseEvent& evt); +#if wxABI_VERSION >= 20805 + void OnMiddleDown(wxMouseEvent& evt); + void OnMiddleUp(wxMouseEvent& evt); + void OnRightDown(wxMouseEvent& evt); + void OnRightUp(wxMouseEvent& evt); + void OnLeftDClick(wxMouseEvent& evt); + void OnSetFocus(wxFocusEvent& event); + void OnKillFocus(wxFocusEvent& event); + void OnChar(wxKeyEvent& event); +#endif + void OnMotion(wxMouseEvent& evt); + void OnLeaveWindow(wxMouseEvent& evt); + void OnButton(wxAuiNotebookEvent& evt); + + +protected: + + wxPoint m_click_pt; + wxWindow* m_click_tab; + bool m_is_dragging; + wxAuiTabContainerButton* m_hover_button; + wxAuiTabContainerButton* m_pressed_button; + +#ifndef SWIG + DECLARE_CLASS(wxAuiTabCtrl) + DECLARE_EVENT_TABLE() +#endif +}; + + + + +class WXDLLIMPEXP_AUI wxAuiNotebook : public wxControl +{ + +public: + + wxAuiNotebook(); + + wxAuiNotebook(wxWindow* parent, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxAUI_NB_DEFAULT_STYLE); + + virtual ~wxAuiNotebook(); + + bool Create(wxWindow* parent, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0); + + void SetWindowStyleFlag(long style); + void SetArtProvider(wxAuiTabArt* art); + wxAuiTabArt* GetArtProvider() const; + + virtual void SetUniformBitmapSize(const wxSize& size); + virtual void SetTabCtrlHeight(int height); + + bool AddPage(wxWindow* page, + const wxString& caption, + bool select = false, + const wxBitmap& bitmap = wxNullBitmap); + + bool InsertPage(size_t page_idx, + wxWindow* page, + const wxString& caption, + bool select = false, + const wxBitmap& bitmap = wxNullBitmap); + + bool DeletePage(size_t page); + bool RemovePage(size_t page); + + size_t GetPageCount() const; + wxWindow* GetPage(size_t page_idx) const; + int GetPageIndex(wxWindow* page_wnd) const; + + bool SetPageText(size_t page, const wxString& text); + wxString GetPageText(size_t page_idx) const; + + bool SetPageBitmap(size_t page, const wxBitmap& bitmap); + wxBitmap GetPageBitmap(size_t page_idx) const; + + size_t SetSelection(size_t new_page); + int GetSelection() const; + + virtual void Split(size_t page, int direction); + +#if wxABI_VERSION >= 20801 + const wxAuiManager& GetAuiManager() const { return m_mgr; } +#endif + +#if wxABI_VERSION >= 20805 + // Sets the normal font + void SetNormalFont(const wxFont& font); + + // Sets the selected tab font + void SetSelectedFont(const wxFont& font); + + // Sets the measuring font + void SetMeasuringFont(const wxFont& font); + + // Sets the tab font + virtual bool SetFont(const wxFont& font); + + // Gets the tab control height + int GetTabCtrlHeight() const; + + // Gets the height of the notebook for a given page height + int GetHeightForPageHeight(int pageHeight); + + // Advances the selection, generation page selection events + void AdvanceSelection(bool forward = true); + + // Shows the window menu + bool ShowWindowMenu(); +#endif + +protected: + + // these can be overridden + virtual void UpdateTabCtrlHeight(); + virtual int CalculateTabCtrlHeight(); + virtual wxSize CalculateNewSplitSize(); + +protected: + + void DoSizing(); + void InitNotebook(long style); + wxAuiTabCtrl* GetTabCtrlFromPoint(const wxPoint& pt); + wxWindow* GetTabFrameFromTabCtrl(wxWindow* tab_ctrl); + wxAuiTabCtrl* GetActiveTabCtrl(); + bool FindTab(wxWindow* page, wxAuiTabCtrl** ctrl, int* idx); + void RemoveEmptyTabFrames(); + void UpdateHintWindowSize(); + +protected: + + void OnChildFocus(wxChildFocusEvent& evt); + void OnRender(wxAuiManagerEvent& evt); + void OnSize(wxSizeEvent& evt); + void OnTabClicked(wxCommandEvent& evt); + void OnTabBeginDrag(wxCommandEvent& evt); + void OnTabDragMotion(wxCommandEvent& evt); + void OnTabEndDrag(wxCommandEvent& evt); + void OnTabButton(wxCommandEvent& evt); +#if wxABI_VERSION >= 20805 + void OnTabMiddleDown(wxCommandEvent& evt); + void OnTabMiddleUp(wxCommandEvent& evt); + void OnTabRightDown(wxCommandEvent& evt); + void OnTabRightUp(wxCommandEvent& evt); + void OnNavigationKey(wxNavigationKeyEvent& event); + void OnTabBgDClick(wxCommandEvent& evt); +#endif + +protected: + + wxAuiManager m_mgr; + wxAuiTabContainer m_tabs; + int m_curpage; + int m_tab_id_counter; + wxWindow* m_dummy_wnd; + + wxSize m_requested_bmp_size; + int m_requested_tabctrl_height; + wxFont m_selected_font; + wxFont m_normal_font; + int m_tab_ctrl_height; + + int m_last_drag_x; + unsigned int m_flags; + +#ifndef SWIG + DECLARE_CLASS(wxAuiNotebook) + DECLARE_EVENT_TABLE() +#endif +}; + + + + +// wx event machinery + +#ifndef SWIG + +BEGIN_DECLARE_EVENT_TYPES() + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_AUI, wxEVT_COMMAND_AUINOTEBOOK_PAGE_CLOSE, 0) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_AUI, wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGED, 0) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_AUI, wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGING, 0) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_AUI, wxEVT_COMMAND_AUINOTEBOOK_BUTTON, 0) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_AUI, wxEVT_COMMAND_AUINOTEBOOK_BEGIN_DRAG, 0) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_AUI, wxEVT_COMMAND_AUINOTEBOOK_END_DRAG, 0) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_AUI, wxEVT_COMMAND_AUINOTEBOOK_DRAG_MOTION, 0) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_AUI, wxEVT_COMMAND_AUINOTEBOOK_ALLOW_DND, 0) +#if wxABI_VERSION >= 20805 + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_AUI, wxEVT_COMMAND_AUINOTEBOOK_TAB_MIDDLE_DOWN, 0) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_AUI, wxEVT_COMMAND_AUINOTEBOOK_TAB_MIDDLE_UP, 0) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_AUI, wxEVT_COMMAND_AUINOTEBOOK_TAB_RIGHT_DOWN, 0) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_AUI, wxEVT_COMMAND_AUINOTEBOOK_TAB_RIGHT_UP, 0) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_AUI, wxEVT_COMMAND_AUINOTEBOOK_PAGE_CLOSED, 0) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_AUI, wxEVT_COMMAND_AUINOTEBOOK_DRAG_DONE, 0) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_AUI, wxEVT_COMMAND_AUINOTEBOOK_BG_DCLICK, 0) +#endif +END_DECLARE_EVENT_TYPES() + +typedef void (wxEvtHandler::*wxAuiNotebookEventFunction)(wxAuiNotebookEvent&); + +#define wxAuiNotebookEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxAuiNotebookEventFunction, &func) + +#define EVT_AUINOTEBOOK_PAGE_CLOSE(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CLOSE, winid, wxAuiNotebookEventHandler(fn)) +#define EVT_AUINOTEBOOK_PAGE_CLOSED(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CLOSED, winid, wxAuiNotebookEventHandler(fn)) +#define EVT_AUINOTEBOOK_PAGE_CHANGED(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGED, winid, wxAuiNotebookEventHandler(fn)) +#define EVT_AUINOTEBOOK_PAGE_CHANGING(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGING, winid, wxAuiNotebookEventHandler(fn)) +#define EVT_AUINOTEBOOK_BUTTON(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_COMMAND_AUINOTEBOOK_BUTTON, winid, wxAuiNotebookEventHandler(fn)) +#define EVT_AUINOTEBOOK_BEGIN_DRAG(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_COMMAND_AUINOTEBOOK_BEGIN_DRAG, winid, wxAuiNotebookEventHandler(fn)) +#define EVT_AUINOTEBOOK_END_DRAG(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_COMMAND_AUINOTEBOOK_END_DRAG, winid, wxAuiNotebookEventHandler(fn)) +#define EVT_AUINOTEBOOK_DRAG_MOTION(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_COMMAND_AUINOTEBOOK_DRAG_MOTION, winid, wxAuiNotebookEventHandler(fn)) +#define EVT_AUINOTEBOOK_ALLOW_DND(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_COMMAND_AUINOTEBOOK_ALLOW_DND, winid, wxAuiNotebookEventHandler(fn)) + +#if wxABI_VERSION >= 20805 +#define EVT_AUINOTEBOOK_TAB_MIDDLE_DOWN(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_COMMAND_AUINOTEBOOK_TAB_MIDDLE_DOWN, winid, wxAuiNotebookEventHandler(fn)) +#define EVT_AUINOTEBOOK_TAB_MIDDLE_UP(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_COMMAND_AUINOTEBOOK_TAB_MIDDLE_UP, winid, wxAuiNotebookEventHandler(fn)) +#define EVT_AUINOTEBOOK_TAB_RIGHT_DOWN(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_COMMAND_AUINOTEBOOK_TAB_RIGHT_DOWN, winid, wxAuiNotebookEventHandler(fn)) +#define EVT_AUINOTEBOOK_TAB_RIGHT_UP(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_COMMAND_AUINOTEBOOK_TAB_RIGHT_UP, winid, wxAuiNotebookEventHandler(fn)) +#define EVT_AUINOTEBOOK_DRAG_DONE(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_COMMAND_AUINOTEBOOK_DRAG_DONE, winid, wxAuiNotebookEventHandler(fn)) +#define EVT_AUINOTEBOOK_BG_DCLICK(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_COMMAND_AUINOTEBOOK_BG_DCLICK, winid, wxAuiNotebookEventHandler(fn)) +#endif + +#else + +// wxpython/swig event work +%constant wxEventType wxEVT_COMMAND_AUINOTEBOOK_PAGE_CLOSE; +%constant wxEventType wxEVT_COMMAND_AUINOTEBOOK_PAGE_CLOSED; +%constant wxEventType wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGED; +%constant wxEventType wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGING; +%constant wxEventType wxEVT_COMMAND_AUINOTEBOOK_BUTTON; +%constant wxEventType wxEVT_COMMAND_AUINOTEBOOK_BEGIN_DRAG; +%constant wxEventType wxEVT_COMMAND_AUINOTEBOOK_END_DRAG; +%constant wxEventType wxEVT_COMMAND_AUINOTEBOOK_DRAG_MOTION; +%constant wxEventType wxEVT_COMMAND_AUINOTEBOOK_ALLOW_DND; +%constant wxEventType wxEVT_COMMAND_AUINOTEBOOK_DRAG_DONE; +%constant wxEventType wxEVT_COMMAND_AUINOTEBOOK_BG_DCLICK; +%constant wxEventType wxEVT_COMMAND_AUINOTEBOOK_TAB_MIDDLE_DOWN; +%constant wxEventType wxEVT_COMMAND_AUINOTEBOOK_TAB_MIDDLE_UP; +%constant wxEventType wxEVT_COMMAND_AUINOTEBOOK_TAB_RIGHT_DOWN; +%constant wxEventType wxEVT_COMMAND_AUINOTEBOOK_TAB_RIGHT_UP; + +%pythoncode { + EVT_AUINOTEBOOK_PAGE_CLOSE = wx.PyEventBinder( wxEVT_COMMAND_AUINOTEBOOK_PAGE_CLOSE, 1 ) + EVT_AUINOTEBOOK_PAGE_CLOSED = wx.PyEventBinder( wxEVT_COMMAND_AUINOTEBOOK_PAGE_CLOSED, 1 ) + EVT_AUINOTEBOOK_PAGE_CHANGED = wx.PyEventBinder( wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGED, 1 ) + EVT_AUINOTEBOOK_PAGE_CHANGING = wx.PyEventBinder( wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGING, 1 ) + EVT_AUINOTEBOOK_BUTTON = wx.PyEventBinder( wxEVT_COMMAND_AUINOTEBOOK_BUTTON, 1 ) + EVT_AUINOTEBOOK_BEGIN_DRAG = wx.PyEventBinder( wxEVT_COMMAND_AUINOTEBOOK_BEGIN_DRAG, 1 ) + EVT_AUINOTEBOOK_END_DRAG = wx.PyEventBinder( wxEVT_COMMAND_AUINOTEBOOK_END_DRAG, 1 ) + EVT_AUINOTEBOOK_DRAG_MOTION = wx.PyEventBinder( wxEVT_COMMAND_AUINOTEBOOK_DRAG_MOTION, 1 ) + EVT_AUINOTEBOOK_ALLOW_DND = wx.PyEventBinder( wxEVT_COMMAND_AUINOTEBOOK_ALLOW_DND, 1 ) + EVT_AUINOTEBOOK_DRAG_DONE = wx.PyEventBinder( wxEVT_COMMAND_AUINOTEBOOK_DRAG_DONE, 1 ) + EVT_AUINOTEBOOK_BG_DCLICK = wx.PyEventBinder( wxEVT_COMMAND_AUINOTEBOOK_BG_DCLICK, 1 ) + EVT_AUINOTEBOOK_TAB_MIDDLE_DOWN = wx.PyEventBinder( wxEVT_COMMAND_AUINOTEBOOK_TAB_MIDDLE_DOWN, 1 ) + EVT_AUINOTEBOOK_TAB_MIDDLE_UP = wx.PyEventBinder( wxEVT_COMMAND_AUINOTEBOOK_TAB_MIDDLE_UP , 1 ) + EVT_AUINOTEBOOK_TAB_RIGHT_DOWN = wx.PyEventBinder( wxEVT_COMMAND_AUINOTEBOOK_TAB_RIGHT_DOWN, 1 ) + EVT_AUINOTEBOOK_TAB_RIGHT_UP = wx.PyEventBinder( wxEVT_COMMAND_AUINOTEBOOK_TAB_RIGHT_UP, 1 ) +} +#endif + + +#endif // wxUSE_AUI +#endif // _WX_AUINOTEBOOK_H_ diff --git a/Externals/wxWidgets/include/wx/aui/dockart.h b/Externals/wxWidgets/include/wx/aui/dockart.h new file mode 100644 index 0000000000..4ff4a5122f --- /dev/null +++ b/Externals/wxWidgets/include/wx/aui/dockart.h @@ -0,0 +1,173 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/aui/dockart.h +// Purpose: wxaui: wx advanced user interface - docking window manager +// Author: Benjamin I. Williams +// Modified by: +// Created: 2005-05-17 +// RCS-ID: $Id: dockart.h 43154 2006-11-07 10:29:02Z BIW $ +// Copyright: (C) Copyright 2005, Kirix Corporation, All Rights Reserved. +// Licence: wxWindows Library Licence, Version 3.1 +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DOCKART_H_ +#define _WX_DOCKART_H_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/defs.h" + +#if wxUSE_AUI + +#include "wx/pen.h" +#include "wx/brush.h" +#include "wx/bitmap.h" +#include "wx/colour.h" + +// dock art provider code - a dock provider provides all drawing +// functionality to the wxAui dock manager. This allows the dock +// manager to have plugable look-and-feels + +class WXDLLIMPEXP_AUI wxAuiDockArt +{ +public: + + wxAuiDockArt() { } + virtual ~wxAuiDockArt() { } + + virtual int GetMetric(int id) = 0; + virtual void SetMetric(int id, int new_val) = 0; + virtual void SetFont(int id, const wxFont& font) = 0; + virtual wxFont GetFont(int id) = 0; + virtual wxColour GetColour(int id) = 0; + virtual void SetColour(int id, const wxColor& colour) = 0; + wxColour GetColor(int id) { return GetColour(id); } + void SetColor(int id, const wxColour& color) { SetColour(id, color); } + + virtual void DrawSash(wxDC& dc, + wxWindow* window, + int orientation, + const wxRect& rect) = 0; + + virtual void DrawBackground(wxDC& dc, + wxWindow* window, + int orientation, + const wxRect& rect) = 0; + + virtual void DrawCaption(wxDC& dc, + wxWindow* window, + const wxString& text, + const wxRect& rect, + wxAuiPaneInfo& pane) = 0; + + virtual void DrawGripper(wxDC& dc, + wxWindow* window, + const wxRect& rect, + wxAuiPaneInfo& pane) = 0; + + virtual void DrawBorder(wxDC& dc, + wxWindow* window, + const wxRect& rect, + wxAuiPaneInfo& pane) = 0; + + virtual void DrawPaneButton(wxDC& dc, + wxWindow* window, + int button, + int button_state, + const wxRect& rect, + wxAuiPaneInfo& pane) = 0; +}; + + +// this is the default art provider for wxAuiManager. Dock art +// can be customized by creating a class derived from this one, +// or replacing this class entirely + +class WXDLLIMPEXP_AUI wxAuiDefaultDockArt : public wxAuiDockArt +{ +public: + + wxAuiDefaultDockArt(); + + int GetMetric(int metric_id); + void SetMetric(int metric_id, int new_val); + wxColour GetColour(int id); + void SetColour(int id, const wxColor& colour); + void SetFont(int id, const wxFont& font); + wxFont GetFont(int id); + + void DrawSash(wxDC& dc, + wxWindow *window, + int orientation, + const wxRect& rect); + + void DrawBackground(wxDC& dc, + wxWindow *window, + int orientation, + const wxRect& rect); + + void DrawCaption(wxDC& dc, + wxWindow *window, + const wxString& text, + const wxRect& rect, + wxAuiPaneInfo& pane); + + void DrawGripper(wxDC& dc, + wxWindow *window, + const wxRect& rect, + wxAuiPaneInfo& pane); + + void DrawBorder(wxDC& dc, + wxWindow *window, + const wxRect& rect, + wxAuiPaneInfo& pane); + + void DrawPaneButton(wxDC& dc, + wxWindow *window, + int button, + int button_state, + const wxRect& rect, + wxAuiPaneInfo& pane); + +protected: + + void DrawCaptionBackground(wxDC& dc, const wxRect& rect, bool active); + +protected: + + wxPen m_border_pen; + wxBrush m_sash_brush; + wxBrush m_background_brush; + wxBrush m_gripper_brush; + wxFont m_caption_font; + wxBitmap m_inactive_close_bitmap; + wxBitmap m_inactive_pin_bitmap; + wxBitmap m_inactive_maximize_bitmap; + wxBitmap m_inactive_restore_bitmap; + wxBitmap m_active_close_bitmap; + wxBitmap m_active_pin_bitmap; + wxBitmap m_active_maximize_bitmap; + wxBitmap m_active_restore_bitmap; + wxPen m_gripper_pen1; + wxPen m_gripper_pen2; + wxPen m_gripper_pen3; + wxColour m_base_colour; + wxColour m_active_caption_colour; + wxColour m_active_caption_gradient_colour; + wxColour m_active_caption_text_colour; + wxColour m_inactive_caption_colour; + wxColour m_inactive_caption_gradient_colour; + wxColour m_inactive_caption_text_colour; + int m_border_size; + int m_caption_size; + int m_sash_size; + int m_button_size; + int m_gripper_size; + int m_gradient_type; +}; + + + +#endif // wxUSE_AUI +#endif //_WX_DOCKART_H_ diff --git a/Externals/wxWidgets/include/wx/aui/floatpane.h b/Externals/wxWidgets/include/wx/aui/floatpane.h new file mode 100644 index 0000000000..34baea5bc0 --- /dev/null +++ b/Externals/wxWidgets/include/wx/aui/floatpane.h @@ -0,0 +1,81 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/aui/floatpane.h +// Purpose: wxaui: wx advanced user interface - docking window manager +// Author: Benjamin I. Williams +// Modified by: +// Created: 2005-05-17 +// RCS-ID: $Id: floatpane.h 43467 2006-11-17 13:07:01Z BIW $ +// Copyright: (C) Copyright 2005, Kirix Corporation, All Rights Reserved. +// Licence: wxWindows Library Licence, Version 3.1 +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_FLOATPANE_H_ +#define _WX_FLOATPANE_H_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/defs.h" + +#if wxUSE_AUI + +#include "wx/frame.h" + +#if defined( __WXMSW__ ) || defined( __WXMAC__ ) || defined( __WXGTK__ ) +#include "wx/minifram.h" +#define wxAuiFloatingFrameBaseClass wxMiniFrame +#else +#define wxAuiFloatingFrameBaseClass wxFrame +#endif + +class WXDLLIMPEXP_AUI wxAuiFloatingFrame : public wxAuiFloatingFrameBaseClass +{ +public: + wxAuiFloatingFrame(wxWindow* parent, + wxAuiManager* owner_mgr, + const wxAuiPaneInfo& pane, + wxWindowID id = wxID_ANY, + long style = wxRESIZE_BORDER | wxSYSTEM_MENU | wxCAPTION | + wxFRAME_NO_TASKBAR | wxFRAME_FLOAT_ON_PARENT | + wxCLIP_CHILDREN + ); + virtual ~wxAuiFloatingFrame(); + void SetPaneWindow(const wxAuiPaneInfo& pane); + wxAuiManager* GetOwnerManager() const; + +protected: + virtual void OnMoveStart(); + virtual void OnMoving(const wxRect& window_rect, wxDirection dir); + virtual void OnMoveFinished(); + +private: + void OnSize(wxSizeEvent& event); + void OnClose(wxCloseEvent& event); + void OnMoveEvent(wxMoveEvent& event); + void OnIdle(wxIdleEvent& event); + void OnActivate(wxActivateEvent& event); + static bool isMouseDown(); + +private: + wxWindow* m_pane_window; // pane window being managed + bool m_solid_drag; // true if system uses solid window drag + bool m_moving; + wxRect m_last_rect; + wxRect m_last2_rect; + wxRect m_last3_rect; + wxSize m_last_size; + wxDirection m_lastDirection; + + wxAuiManager* m_owner_mgr; + wxAuiManager m_mgr; + +#ifndef SWIG + DECLARE_EVENT_TABLE() + DECLARE_CLASS(wxAuiFloatingFrame) +#endif // SWIG +}; + +#endif // wxUSE_AUI +#endif //_WX_FLOATPANE_H_ + diff --git a/Externals/wxWidgets/include/wx/aui/framemanager.h b/Externals/wxWidgets/include/wx/aui/framemanager.h new file mode 100644 index 0000000000..d37904987c --- /dev/null +++ b/Externals/wxWidgets/include/wx/aui/framemanager.h @@ -0,0 +1,851 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/aui/framemanager.h +// Purpose: wxaui: wx advanced user interface - docking window manager +// Author: Benjamin I. Williams +// Modified by: +// Created: 2005-05-17 +// RCS-ID: $Id: framemanager.h 49465 2007-10-26 19:06:57Z RD $ +// Copyright: (C) Copyright 2005, Kirix Corporation, All Rights Reserved. +// Licence: wxWindows Library Licence, Version 3.1 +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_FRAMEMANAGER_H_ +#define _WX_FRAMEMANAGER_H_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/defs.h" + +#if wxUSE_AUI + +#include "wx/dynarray.h" +#include "wx/gdicmn.h" +#include "wx/window.h" +#include "wx/timer.h" +#include "wx/sizer.h" + +enum wxAuiManagerDock +{ + wxAUI_DOCK_NONE = 0, + wxAUI_DOCK_TOP = 1, + wxAUI_DOCK_RIGHT = 2, + wxAUI_DOCK_BOTTOM = 3, + wxAUI_DOCK_LEFT = 4, + wxAUI_DOCK_CENTER = 5, + wxAUI_DOCK_CENTRE = wxAUI_DOCK_CENTER +}; + +enum wxAuiManagerOption +{ + wxAUI_MGR_ALLOW_FLOATING = 1 << 0, + wxAUI_MGR_ALLOW_ACTIVE_PANE = 1 << 1, + wxAUI_MGR_TRANSPARENT_DRAG = 1 << 2, + wxAUI_MGR_TRANSPARENT_HINT = 1 << 3, + wxAUI_MGR_VENETIAN_BLINDS_HINT = 1 << 4, + wxAUI_MGR_RECTANGLE_HINT = 1 << 5, + wxAUI_MGR_HINT_FADE = 1 << 6, + wxAUI_MGR_NO_VENETIAN_BLINDS_FADE = 1 << 7, + + wxAUI_MGR_DEFAULT = wxAUI_MGR_ALLOW_FLOATING | + wxAUI_MGR_TRANSPARENT_HINT | + wxAUI_MGR_HINT_FADE | + wxAUI_MGR_NO_VENETIAN_BLINDS_FADE +}; + + +enum wxAuiPaneDockArtSetting +{ + wxAUI_DOCKART_SASH_SIZE = 0, + wxAUI_DOCKART_CAPTION_SIZE = 1, + wxAUI_DOCKART_GRIPPER_SIZE = 2, + wxAUI_DOCKART_PANE_BORDER_SIZE = 3, + wxAUI_DOCKART_PANE_BUTTON_SIZE = 4, + wxAUI_DOCKART_BACKGROUND_COLOUR = 5, + wxAUI_DOCKART_SASH_COLOUR = 6, + wxAUI_DOCKART_ACTIVE_CAPTION_COLOUR = 7, + wxAUI_DOCKART_ACTIVE_CAPTION_GRADIENT_COLOUR = 8, + wxAUI_DOCKART_INACTIVE_CAPTION_COLOUR = 9, + wxAUI_DOCKART_INACTIVE_CAPTION_GRADIENT_COLOUR = 10, + wxAUI_DOCKART_ACTIVE_CAPTION_TEXT_COLOUR = 11, + wxAUI_DOCKART_INACTIVE_CAPTION_TEXT_COLOUR = 12, + wxAUI_DOCKART_BORDER_COLOUR = 13, + wxAUI_DOCKART_GRIPPER_COLOUR = 14, + wxAUI_DOCKART_CAPTION_FONT = 15, + wxAUI_DOCKART_GRADIENT_TYPE = 16 +}; + +enum wxAuiPaneDockArtGradients +{ + wxAUI_GRADIENT_NONE = 0, + wxAUI_GRADIENT_VERTICAL = 1, + wxAUI_GRADIENT_HORIZONTAL = 2 +}; + +enum wxAuiPaneButtonState +{ + wxAUI_BUTTON_STATE_NORMAL = 0, + wxAUI_BUTTON_STATE_HOVER = 1 << 1, + wxAUI_BUTTON_STATE_PRESSED = 1 << 2, + wxAUI_BUTTON_STATE_DISABLED = 1 << 3, + wxAUI_BUTTON_STATE_HIDDEN = 1 << 4, + wxAUI_BUTTON_STATE_CHECKED = 1 << 5 +}; + +enum wxAuiButtonId +{ + wxAUI_BUTTON_CLOSE = 101, + wxAUI_BUTTON_MAXIMIZE_RESTORE = 102, + wxAUI_BUTTON_MINIMIZE = 103, + wxAUI_BUTTON_PIN = 104, + wxAUI_BUTTON_OPTIONS = 105, + wxAUI_BUTTON_WINDOWLIST = 106, + wxAUI_BUTTON_LEFT = 107, + wxAUI_BUTTON_RIGHT = 108, + wxAUI_BUTTON_UP = 109, + wxAUI_BUTTON_DOWN = 110, + wxAUI_BUTTON_CUSTOM1 = 201, + wxAUI_BUTTON_CUSTOM2 = 202, + wxAUI_BUTTON_CUSTOM3 = 203 +}; + +enum wxAuiPaneInsertLevel +{ + wxAUI_INSERT_PANE = 0, + wxAUI_INSERT_ROW = 1, + wxAUI_INSERT_DOCK = 2 +}; + + + + +// forwards and array declarations +class wxAuiDockUIPart; +class wxAuiPaneButton; +class wxAuiPaneInfo; +class wxAuiDockInfo; +class wxAuiDockArt; +class wxAuiManagerEvent; + +#ifndef SWIG +WX_DECLARE_USER_EXPORTED_OBJARRAY(wxAuiDockInfo, wxAuiDockInfoArray, WXDLLIMPEXP_AUI); +WX_DECLARE_USER_EXPORTED_OBJARRAY(wxAuiDockUIPart, wxAuiDockUIPartArray, WXDLLIMPEXP_AUI); +WX_DECLARE_USER_EXPORTED_OBJARRAY(wxAuiPaneButton, wxAuiPaneButtonArray, WXDLLIMPEXP_AUI); +WX_DECLARE_USER_EXPORTED_OBJARRAY(wxAuiPaneInfo, wxAuiPaneInfoArray, WXDLLIMPEXP_AUI); +WX_DEFINE_USER_EXPORTED_ARRAY_PTR(wxAuiPaneInfo*, wxAuiPaneInfoPtrArray, class WXDLLIMPEXP_AUI); +WX_DEFINE_USER_EXPORTED_ARRAY_PTR(wxAuiDockInfo*, wxAuiDockInfoPtrArray, class WXDLLIMPEXP_AUI); +#endif // SWIG + +extern WXDLLIMPEXP_AUI wxAuiDockInfo wxAuiNullDockInfo; +extern WXDLLIMPEXP_AUI wxAuiPaneInfo wxAuiNullPaneInfo; + + + +class WXDLLIMPEXP_AUI wxAuiPaneInfo +{ +public: + + wxAuiPaneInfo() + { + window = NULL; + frame = NULL; + state = 0; + dock_direction = wxAUI_DOCK_LEFT; + dock_layer = 0; + dock_row = 0; + dock_pos = 0; + floating_pos = wxDefaultPosition; + floating_size = wxDefaultSize; + best_size = wxDefaultSize; + min_size = wxDefaultSize; + max_size = wxDefaultSize; + dock_proportion = 0; + + DefaultPane(); + } + + ~wxAuiPaneInfo() {} + +#ifndef SWIG + wxAuiPaneInfo(const wxAuiPaneInfo& c) + { + name = c.name; + caption = c.caption; + window = c.window; + frame = c.frame; + state = c.state; + dock_direction = c.dock_direction; + dock_layer = c.dock_layer; + dock_row = c.dock_row; + dock_pos = c.dock_pos; + best_size = c.best_size; + min_size = c.min_size; + max_size = c.max_size; + floating_pos = c.floating_pos; + floating_size = c.floating_size; + dock_proportion = c.dock_proportion; + buttons = c.buttons; + rect = c.rect; + } + + wxAuiPaneInfo& operator=(const wxAuiPaneInfo& c) + { + name = c.name; + caption = c.caption; + window = c.window; + frame = c.frame; + state = c.state; + dock_direction = c.dock_direction; + dock_layer = c.dock_layer; + dock_row = c.dock_row; + dock_pos = c.dock_pos; + best_size = c.best_size; + min_size = c.min_size; + max_size = c.max_size; + floating_pos = c.floating_pos; + floating_size = c.floating_size; + dock_proportion = c.dock_proportion; + buttons = c.buttons; + rect = c.rect; + return *this; + } +#endif // SWIG + + // Write the safe parts of a newly loaded PaneInfo structure "source" into "this" + // used on loading perspectives etc. + void SafeSet(wxAuiPaneInfo source) + { + // note source is not passed by reference so we can overwrite, to keep the + // unsafe bits of "dest" + source.window = window; + source.frame = frame; + source.buttons = buttons; + // now assign + *this = source; + } + + bool IsOk() const { return (window != NULL) ? true : false; } + bool IsFixed() const { return !HasFlag(optionResizable); } + bool IsResizable() const { return HasFlag(optionResizable); } + bool IsShown() const { return !HasFlag(optionHidden); } + bool IsFloating() const { return HasFlag(optionFloating); } + bool IsDocked() const { return !HasFlag(optionFloating); } + bool IsToolbar() const { return HasFlag(optionToolbar); } + bool IsTopDockable() const { return HasFlag(optionTopDockable); } + bool IsBottomDockable() const { return HasFlag(optionBottomDockable); } + bool IsLeftDockable() const { return HasFlag(optionLeftDockable); } + bool IsRightDockable() const { return HasFlag(optionRightDockable); } + bool IsFloatable() const { return HasFlag(optionFloatable); } + bool IsMovable() const { return HasFlag(optionMovable); } + bool IsDestroyOnClose() const { return HasFlag(optionDestroyOnClose); } + bool IsMaximized() const { return HasFlag(optionMaximized); } + bool HasCaption() const { return HasFlag(optionCaption); } + bool HasGripper() const { return HasFlag(optionGripper); } + bool HasBorder() const { return HasFlag(optionPaneBorder); } + bool HasCloseButton() const { return HasFlag(buttonClose); } + bool HasMaximizeButton() const { return HasFlag(buttonMaximize); } + bool HasMinimizeButton() const { return HasFlag(buttonMinimize); } + bool HasPinButton() const { return HasFlag(buttonPin); } + bool HasGripperTop() const { return HasFlag(optionGripperTop); } + +#ifdef SWIG + %typemap(out) wxAuiPaneInfo& { $result = $self; Py_INCREF($result); } +#endif + wxAuiPaneInfo& Window(wxWindow* w) { window = w; return *this; } + wxAuiPaneInfo& Name(const wxString& n) { name = n; return *this; } + wxAuiPaneInfo& Caption(const wxString& c) { caption = c; return *this; } + wxAuiPaneInfo& Left() { dock_direction = wxAUI_DOCK_LEFT; return *this; } + wxAuiPaneInfo& Right() { dock_direction = wxAUI_DOCK_RIGHT; return *this; } + wxAuiPaneInfo& Top() { dock_direction = wxAUI_DOCK_TOP; return *this; } + wxAuiPaneInfo& Bottom() { dock_direction = wxAUI_DOCK_BOTTOM; return *this; } + wxAuiPaneInfo& Center() { dock_direction = wxAUI_DOCK_CENTER; return *this; } + wxAuiPaneInfo& Centre() { dock_direction = wxAUI_DOCK_CENTRE; return *this; } + wxAuiPaneInfo& Direction(int direction) { dock_direction = direction; return *this; } + wxAuiPaneInfo& Layer(int layer) { dock_layer = layer; return *this; } + wxAuiPaneInfo& Row(int row) { dock_row = row; return *this; } + wxAuiPaneInfo& Position(int pos) { dock_pos = pos; return *this; } + wxAuiPaneInfo& BestSize(const wxSize& size) { best_size = size; return *this; } + wxAuiPaneInfo& MinSize(const wxSize& size) { min_size = size; return *this; } + wxAuiPaneInfo& MaxSize(const wxSize& size) { max_size = size; return *this; } + wxAuiPaneInfo& BestSize(int x, int y) { best_size.Set(x,y); return *this; } + wxAuiPaneInfo& MinSize(int x, int y) { min_size.Set(x,y); return *this; } + wxAuiPaneInfo& MaxSize(int x, int y) { max_size.Set(x,y); return *this; } + wxAuiPaneInfo& FloatingPosition(const wxPoint& pos) { floating_pos = pos; return *this; } + wxAuiPaneInfo& FloatingPosition(int x, int y) { floating_pos.x = x; floating_pos.y = y; return *this; } + wxAuiPaneInfo& FloatingSize(const wxSize& size) { floating_size = size; return *this; } + wxAuiPaneInfo& FloatingSize(int x, int y) { floating_size.Set(x,y); return *this; } + wxAuiPaneInfo& Fixed() { return SetFlag(optionResizable, false); } + wxAuiPaneInfo& Resizable(bool resizable = true) { return SetFlag(optionResizable, resizable); } + wxAuiPaneInfo& Dock() { return SetFlag(optionFloating, false); } + wxAuiPaneInfo& Float() { return SetFlag(optionFloating, true); } + wxAuiPaneInfo& Hide() { return SetFlag(optionHidden, true); } + wxAuiPaneInfo& Show(bool show = true) { return SetFlag(optionHidden, !show); } + wxAuiPaneInfo& CaptionVisible(bool visible = true) { return SetFlag(optionCaption, visible); } + wxAuiPaneInfo& Maximize() { return SetFlag(optionMaximized, true); } + wxAuiPaneInfo& Restore() { return SetFlag(optionMaximized, false); } + wxAuiPaneInfo& PaneBorder(bool visible = true) { return SetFlag(optionPaneBorder, visible); } + wxAuiPaneInfo& Gripper(bool visible = true) { return SetFlag(optionGripper, visible); } + wxAuiPaneInfo& GripperTop(bool attop = true) { return SetFlag(optionGripperTop, attop); } + wxAuiPaneInfo& CloseButton(bool visible = true) { return SetFlag(buttonClose, visible); } + wxAuiPaneInfo& MaximizeButton(bool visible = true) { return SetFlag(buttonMaximize, visible); } + wxAuiPaneInfo& MinimizeButton(bool visible = true) { return SetFlag(buttonMinimize, visible); } + wxAuiPaneInfo& PinButton(bool visible = true) { return SetFlag(buttonPin, visible); } + wxAuiPaneInfo& DestroyOnClose(bool b = true) { return SetFlag(optionDestroyOnClose, b); } + wxAuiPaneInfo& TopDockable(bool b = true) { return SetFlag(optionTopDockable, b); } + wxAuiPaneInfo& BottomDockable(bool b = true) { return SetFlag(optionBottomDockable, b); } + wxAuiPaneInfo& LeftDockable(bool b = true) { return SetFlag(optionLeftDockable, b); } + wxAuiPaneInfo& RightDockable(bool b = true) { return SetFlag(optionRightDockable, b); } + wxAuiPaneInfo& Floatable(bool b = true) { return SetFlag(optionFloatable, b); } + wxAuiPaneInfo& Movable(bool b = true) { return SetFlag(optionMovable, b); } +#if wxABI_VERSION >= 20807 + wxAuiPaneInfo& DockFixed(bool b = true) { return SetFlag(optionDockFixed, b); } +#endif + + wxAuiPaneInfo& Dockable(bool b = true) + { + return TopDockable(b).BottomDockable(b).LeftDockable(b).RightDockable(b); + } + + wxAuiPaneInfo& DefaultPane() + { + state |= optionTopDockable | optionBottomDockable | + optionLeftDockable | optionRightDockable | + optionFloatable | optionMovable | optionResizable | + optionCaption | optionPaneBorder | buttonClose; + return *this; + } + + wxAuiPaneInfo& CentrePane() { return CenterPane(); } + wxAuiPaneInfo& CenterPane() + { + state = 0; + return Center().PaneBorder().Resizable(); + } + + wxAuiPaneInfo& ToolbarPane() + { + DefaultPane(); + state |= (optionToolbar | optionGripper); + state &= ~(optionResizable | optionCaption); + if (dock_layer == 0) + dock_layer = 10; + return *this; + } + + wxAuiPaneInfo& SetFlag(unsigned int flag, bool option_state) + { + if (option_state) + state |= flag; + else + state &= ~flag; + return *this; + } + + bool HasFlag(unsigned int flag) const + { + return (state & flag) ? true:false; + } + +#ifdef SWIG + %typemap(out) wxAuiPaneInfo& ; +#endif + +public: + + // NOTE: You can add and subtract flags from this list, + // but do not change the values of the flags, because + // they are stored in a binary integer format in the + // perspective string. If you really need to change the + // values around, you'll have to ensure backwards-compatibility + // in the perspective loading code. + enum wxAuiPaneState + { + optionFloating = 1 << 0, + optionHidden = 1 << 1, + optionLeftDockable = 1 << 2, + optionRightDockable = 1 << 3, + optionTopDockable = 1 << 4, + optionBottomDockable = 1 << 5, + optionFloatable = 1 << 6, + optionMovable = 1 << 7, + optionResizable = 1 << 8, + optionPaneBorder = 1 << 9, + optionCaption = 1 << 10, + optionGripper = 1 << 11, + optionDestroyOnClose = 1 << 12, + optionToolbar = 1 << 13, + optionActive = 1 << 14, + optionGripperTop = 1 << 15, + optionMaximized = 1 << 16, + optionDockFixed = 1 << 17, + + buttonClose = 1 << 21, + buttonMaximize = 1 << 22, + buttonMinimize = 1 << 23, + buttonPin = 1 << 24, + + buttonCustom1 = 1 << 26, + buttonCustom2 = 1 << 27, + buttonCustom3 = 1 << 28, + + savedHiddenState = 1 << 30, // used internally + actionPane = 1 << 31 // used internally + }; + +public: + wxString name; // name of the pane + wxString caption; // caption displayed on the window + + wxWindow* window; // window that is in this pane + wxFrame* frame; // floating frame window that holds the pane + unsigned int state; // a combination of wxPaneState values + + int dock_direction; // dock direction (top, bottom, left, right, center) + int dock_layer; // layer number (0 = innermost layer) + int dock_row; // row number on the docking bar (0 = first row) + int dock_pos; // position inside the row (0 = first position) + + wxSize best_size; // size that the layout engine will prefer + wxSize min_size; // minimum size the pane window can tolerate + wxSize max_size; // maximum size the pane window can tolerate + + wxPoint floating_pos; // position while floating + wxSize floating_size; // size while floating + int dock_proportion; // proportion while docked + + wxAuiPaneButtonArray buttons; // buttons on the pane + + wxRect rect; // current rectangle (populated by wxAUI) +}; + + + +class WXDLLIMPEXP_AUI wxAuiFloatingFrame; + +class WXDLLIMPEXP_AUI wxAuiManager : public wxEvtHandler +{ +friend class wxAuiFloatingFrame; + +public: + + wxAuiManager(wxWindow* managed_wnd = NULL, + unsigned int flags = wxAUI_MGR_DEFAULT); + virtual ~wxAuiManager(); + void UnInit(); + + void SetFlags(unsigned int flags); + unsigned int GetFlags() const; + + void SetManagedWindow(wxWindow* managed_wnd); + wxWindow* GetManagedWindow() const; + + static wxAuiManager* GetManager(wxWindow* window); + + void SetArtProvider(wxAuiDockArt* art_provider); + wxAuiDockArt* GetArtProvider() const; + + wxAuiPaneInfo& GetPane(wxWindow* window); + wxAuiPaneInfo& GetPane(const wxString& name); + wxAuiPaneInfoArray& GetAllPanes(); + + bool AddPane(wxWindow* window, + const wxAuiPaneInfo& pane_info); + + bool AddPane(wxWindow* window, + const wxAuiPaneInfo& pane_info, + const wxPoint& drop_pos); + + bool AddPane(wxWindow* window, + int direction = wxLEFT, + const wxString& caption = wxEmptyString); + + bool InsertPane(wxWindow* window, + const wxAuiPaneInfo& insert_location, + int insert_level = wxAUI_INSERT_PANE); + + bool DetachPane(wxWindow* window); + + void Update(); + + wxString SavePaneInfo(wxAuiPaneInfo& pane); + void LoadPaneInfo(wxString pane_part, wxAuiPaneInfo &pane); + wxString SavePerspective(); + bool LoadPerspective(const wxString& perspective, bool update = true); + + void SetDockSizeConstraint(double width_pct, double height_pct); + void GetDockSizeConstraint(double* width_pct, double* height_pct) const; + + void ClosePane(wxAuiPaneInfo& pane_info); + void MaximizePane(wxAuiPaneInfo& pane_info); + void RestorePane(wxAuiPaneInfo& pane_info); + void RestoreMaximizedPane(); + +public: + + virtual wxAuiFloatingFrame* CreateFloatingFrame(wxWindow* parent, const wxAuiPaneInfo& p); + + void StartPaneDrag( + wxWindow* pane_window, + const wxPoint& offset); + + wxRect CalculateHintRect( + wxWindow* pane_window, + const wxPoint& pt, + const wxPoint& offset); + + void DrawHintRect( + wxWindow* pane_window, + const wxPoint& pt, + const wxPoint& offset); + + virtual void ShowHint(const wxRect& rect); + virtual void HideHint(); + +public: + + // deprecated -- please use SetManagedWindow() and + // and GetManagedWindow() instead + + wxDEPRECATED( void SetFrame(wxFrame* frame) ); + wxDEPRECATED( wxFrame* GetFrame() const ); + +protected: + + void UpdateHintWindowConfig(); + + void DoFrameLayout(); + + void LayoutAddPane(wxSizer* container, + wxAuiDockInfo& dock, + wxAuiPaneInfo& pane, + wxAuiDockUIPartArray& uiparts, + bool spacer_only); + + void LayoutAddDock(wxSizer* container, + wxAuiDockInfo& dock, + wxAuiDockUIPartArray& uiparts, + bool spacer_only); + + wxSizer* LayoutAll(wxAuiPaneInfoArray& panes, + wxAuiDockInfoArray& docks, + wxAuiDockUIPartArray& uiparts, + bool spacer_only = false); + + virtual bool ProcessDockResult(wxAuiPaneInfo& target, + const wxAuiPaneInfo& new_pos); + + bool DoDrop(wxAuiDockInfoArray& docks, + wxAuiPaneInfoArray& panes, + wxAuiPaneInfo& drop, + const wxPoint& pt, + const wxPoint& action_offset = wxPoint(0,0)); + + wxAuiDockUIPart* HitTest(int x, int y); + wxAuiDockUIPart* GetPanePart(wxWindow* pane); + int GetDockPixelOffset(wxAuiPaneInfo& test); + void OnFloatingPaneMoveStart(wxWindow* window); + void OnFloatingPaneMoving(wxWindow* window, wxDirection dir ); + void OnFloatingPaneMoved(wxWindow* window, wxDirection dir); + void OnFloatingPaneActivated(wxWindow* window); + void OnFloatingPaneClosed(wxWindow* window, wxCloseEvent& evt); + void OnFloatingPaneResized(wxWindow* window, const wxSize& size); + void Render(wxDC* dc); + void Repaint(wxDC* dc = NULL); + void ProcessMgrEvent(wxAuiManagerEvent& event); + void UpdateButtonOnScreen(wxAuiDockUIPart* button_ui_part, + const wxMouseEvent& event); + void GetPanePositionsAndSizes(wxAuiDockInfo& dock, + wxArrayInt& positions, + wxArrayInt& sizes); + + +public: + + // public events (which can be invoked externally) + void OnRender(wxAuiManagerEvent& evt); + void OnPaneButton(wxAuiManagerEvent& evt); + +protected: + + // protected events + void OnPaint(wxPaintEvent& evt); + void OnEraseBackground(wxEraseEvent& evt); + void OnSize(wxSizeEvent& evt); + void OnSetCursor(wxSetCursorEvent& evt); + void OnLeftDown(wxMouseEvent& evt); + void OnLeftUp(wxMouseEvent& evt); + void OnMotion(wxMouseEvent& evt); + void OnLeaveWindow(wxMouseEvent& evt); + void OnChildFocus(wxChildFocusEvent& evt); + void OnHintFadeTimer(wxTimerEvent& evt); + void OnFindManager(wxAuiManagerEvent& evt); + +protected: + + enum + { + actionNone = 0, + actionResize, + actionClickButton, + actionClickCaption, + actionDragToolbarPane, + actionDragFloatingPane + }; + +protected: + + wxWindow* m_frame; // the window being managed + wxAuiDockArt* m_art; // dock art object which does all drawing + unsigned int m_flags; // manager flags wxAUI_MGR_* + + wxAuiPaneInfoArray m_panes; // array of panes structures + wxAuiDockInfoArray m_docks; // array of docks structures + wxAuiDockUIPartArray m_uiparts; // array of UI parts (captions, buttons, etc) + + int m_action; // current mouse action + wxPoint m_action_start; // position where the action click started + wxPoint m_action_offset; // offset from upper left of the item clicked + wxAuiDockUIPart* m_action_part; // ptr to the part the action happened to + wxWindow* m_action_window; // action frame or window (NULL if none) + wxRect m_action_hintrect; // hint rectangle for the action + wxRect m_last_rect; + wxAuiDockUIPart* m_hover_button;// button uipart being hovered over + wxRect m_last_hint; // last hint rectangle + wxPoint m_last_mouse_move; // last mouse move position (see OnMotion) + bool m_skipping; + bool m_has_maximized; + + double m_dock_constraint_x; // 0.0 .. 1.0; max pct of window width a dock can consume + double m_dock_constraint_y; // 0.0 .. 1.0; max pct of window height a dock can consume + + wxFrame* m_hint_wnd; // transparent hint window, if supported by platform + wxTimer m_hint_fadetimer; // transparent fade timer + wxByte m_hint_fadeamt; // transparent fade amount + wxByte m_hint_fademax; // maximum value of hint fade + + void* m_reserved; + +#ifndef SWIG + DECLARE_EVENT_TABLE() + DECLARE_CLASS(wxAuiManager) +#endif // SWIG +}; + + + +// event declarations/classes + +class WXDLLIMPEXP_AUI wxAuiManagerEvent : public wxEvent +{ +public: + wxAuiManagerEvent(wxEventType type=wxEVT_NULL) : wxEvent(0, type) + { + manager = NULL; + pane = NULL; + button = 0; + veto_flag = false; + canveto_flag = true; + dc = NULL; + } +#ifndef SWIG + wxAuiManagerEvent(const wxAuiManagerEvent& c) : wxEvent(c) + { + manager = c.manager; + pane = c.pane; + button = c.button; + veto_flag = c.veto_flag; + canveto_flag = c.canveto_flag; + dc = c.dc; + } +#endif + wxEvent *Clone() const { return new wxAuiManagerEvent(*this); } + + void SetManager(wxAuiManager* mgr) { manager = mgr; } + void SetPane(wxAuiPaneInfo* p) { pane = p; } + void SetButton(int b) { button = b; } + void SetDC(wxDC* pdc) { dc = pdc; } + + wxAuiManager* GetManager() const { return manager; } + wxAuiPaneInfo* GetPane() const { return pane; } + int GetButton() const { return button; } + wxDC* GetDC() const { return dc; } + + void Veto(bool veto = true) { veto_flag = veto; } + bool GetVeto() const { return veto_flag; } + void SetCanVeto(bool can_veto) { canveto_flag = can_veto; } + bool CanVeto() const { return canveto_flag && veto_flag; } + +public: + wxAuiManager* manager; + wxAuiPaneInfo* pane; + int button; + bool veto_flag; + bool canveto_flag; + wxDC* dc; + +#ifndef SWIG +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxAuiManagerEvent) +#endif +}; + + +class WXDLLIMPEXP_AUI wxAuiDockInfo +{ +public: + wxAuiDockInfo() + { + dock_direction = 0; + dock_layer = 0; + dock_row = 0; + size = 0; + min_size = 0; + resizable = true; + fixed = false; + toolbar = false; + reserved1 = false; + } + +#ifndef SWIG + wxAuiDockInfo(const wxAuiDockInfo& c) + { + dock_direction = c.dock_direction; + dock_layer = c.dock_layer; + dock_row = c.dock_row; + size = c.size; + min_size = c.min_size; + resizable = c.resizable; + fixed = c.fixed; + toolbar = c.toolbar; + panes = c.panes; + rect = c.rect; + reserved1 = c.reserved1; + } + + wxAuiDockInfo& operator=(const wxAuiDockInfo& c) + { + dock_direction = c.dock_direction; + dock_layer = c.dock_layer; + dock_row = c.dock_row; + size = c.size; + min_size = c.min_size; + resizable = c.resizable; + fixed = c.fixed; + toolbar = c.toolbar; + panes = c.panes; + rect = c.rect; + reserved1 = c.reserved1; + return *this; + } +#endif // SWIG + + bool IsOk() const { return (dock_direction != 0) ? true : false; } + bool IsHorizontal() const { return (dock_direction == wxAUI_DOCK_TOP || + dock_direction == wxAUI_DOCK_BOTTOM) ? true:false; } + bool IsVertical() const { return (dock_direction == wxAUI_DOCK_LEFT || + dock_direction == wxAUI_DOCK_RIGHT || + dock_direction == wxAUI_DOCK_CENTER) ? true:false; } +public: + wxAuiPaneInfoPtrArray panes; // array of panes + wxRect rect; // current rectangle + int dock_direction; // dock direction (top, bottom, left, right, center) + int dock_layer; // layer number (0 = innermost layer) + int dock_row; // row number on the docking bar (0 = first row) + int size; // size of the dock + int min_size; // minimum size of a dock (0 if there is no min) + bool resizable; // flag indicating whether the dock is resizable + bool toolbar; // flag indicating dock contains only toolbars + bool fixed; // flag indicating that the dock operates on + // absolute coordinates as opposed to proportional + bool reserved1; +}; + + +class WXDLLIMPEXP_AUI wxAuiDockUIPart +{ +public: + enum + { + typeCaption, + typeGripper, + typeDock, + typeDockSizer, + typePane, + typePaneSizer, + typeBackground, + typePaneBorder, + typePaneButton + }; + + int type; // ui part type (see enum above) + int orientation; // orientation (either wxHORIZONTAL or wxVERTICAL) + wxAuiDockInfo* dock; // which dock the item is associated with + wxAuiPaneInfo* pane; // which pane the item is associated with + wxAuiPaneButton* button; // which pane button the item is associated with + wxSizer* cont_sizer; // the part's containing sizer + wxSizerItem* sizer_item; // the sizer item of the part + wxRect rect; // client coord rectangle of the part itself +}; + + +class WXDLLIMPEXP_AUI wxAuiPaneButton +{ +public: + int button_id; // id of the button (e.g. buttonClose) +}; + + + +#ifndef SWIG +// wx event machinery + +BEGIN_DECLARE_EVENT_TYPES() + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_AUI, wxEVT_AUI_PANE_BUTTON, 0) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_AUI, wxEVT_AUI_PANE_CLOSE, 0) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_AUI, wxEVT_AUI_PANE_MAXIMIZE, 0) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_AUI, wxEVT_AUI_PANE_RESTORE, 0) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_AUI, wxEVT_AUI_RENDER, 0) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_AUI, wxEVT_AUI_FIND_MANAGER, 0) +END_DECLARE_EVENT_TYPES() + +typedef void (wxEvtHandler::*wxAuiManagerEventFunction)(wxAuiManagerEvent&); + +#define wxAuiManagerEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxAuiManagerEventFunction, &func) + +#define EVT_AUI_PANE_BUTTON(func) \ + wx__DECLARE_EVT0(wxEVT_AUI_PANE_BUTTON, wxAuiManagerEventHandler(func)) +#define EVT_AUI_PANE_CLOSE(func) \ + wx__DECLARE_EVT0(wxEVT_AUI_PANE_CLOSE, wxAuiManagerEventHandler(func)) +#define EVT_AUI_PANE_MAXIMIZE(func) \ + wx__DECLARE_EVT0(wxEVT_AUI_PANE_MAXIMIZE, wxAuiManagerEventHandler(func)) +#define EVT_AUI_PANE_RESTORE(func) \ + wx__DECLARE_EVT0(wxEVT_AUI_PANE_RESTORE, wxAuiManagerEventHandler(func)) +#define EVT_AUI_RENDER(func) \ + wx__DECLARE_EVT0(wxEVT_AUI_RENDER, wxAuiManagerEventHandler(func)) +#define EVT_AUI_FIND_MANAGER(func) \ + wx__DECLARE_EVT0(wxEVT_AUI_FIND_MANAGER, wxAuiManagerEventHandler(func)) + +#else + +%constant wxEventType wxEVT_AUI_PANE_BUTTON; +%constant wxEventType wxEVT_AUI_PANE_CLOSE; +%constant wxEventType wxEVT_AUI_PANE_MAXIMIZE; +%constant wxEventType wxEVT_AUI_PANE_RESTORE; +%constant wxEventType wxEVT_AUI_RENDER; +%constant wxEventType wxEVT_AUI_FIND_MANAGER; + +%pythoncode { + EVT_AUI_PANE_BUTTON = wx.PyEventBinder( wxEVT_AUI_PANE_BUTTON ) + EVT_AUI_PANE_CLOSE = wx.PyEventBinder( wxEVT_AUI_PANE_CLOSE ) + EVT_AUI_PANE_MAXIMIZE = wx.PyEventBinder( wxEVT_AUI_PANE_MAXIMIZE ) + EVT_AUI_PANE_RESTORE = wx.PyEventBinder( wxEVT_AUI_PANE_RESTORE ) + EVT_AUI_RENDER = wx.PyEventBinder( wxEVT_AUI_RENDER ) + EVT_AUI_FIND_MANAGER = wx.PyEventBinder( wxEVT_AUI_FIND_MANAGER ) +} +#endif // SWIG + +#endif // wxUSE_AUI +#endif //_WX_FRAMEMANAGER_H_ + diff --git a/Externals/wxWidgets/include/wx/aui/tabmdi.h b/Externals/wxWidgets/include/wx/aui/tabmdi.h new file mode 100644 index 0000000000..8d05e96a60 --- /dev/null +++ b/Externals/wxWidgets/include/wx/aui/tabmdi.h @@ -0,0 +1,269 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/tabmdi.h +// Purpose: Generic MDI (Multiple Document Interface) classes +// Author: Hans Van Leemputten +// Modified by: Benjamin I. Williams / Kirix Corporation +// Created: 29/07/2002 +// RCS-ID: $Id: tabmdi.h 45498 2007-04-16 13:03:05Z VZ $ +// Copyright: (c) Hans Van Leemputten +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_AUITABMDI_H_ +#define _WX_AUITABMDI_H_ + +#if wxUSE_AUI + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/frame.h" +#include "wx/panel.h" +#include "wx/notebook.h" +#include "wx/icon.h" +#include "wx/aui/auibook.h" + +//----------------------------------------------------------------------------- +// classes +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_AUI wxAuiMDIParentFrame; +class WXDLLIMPEXP_AUI wxAuiMDIClientWindow; +class WXDLLIMPEXP_AUI wxAuiMDIChildFrame; + +//----------------------------------------------------------------------------- +// wxAuiMDIParentFrame +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_AUI wxAuiMDIParentFrame : public wxFrame +{ +public: + wxAuiMDIParentFrame(); + wxAuiMDIParentFrame(wxWindow *parent, + wxWindowID winid, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDEFAULT_FRAME_STYLE | wxVSCROLL | wxHSCROLL, + const wxString& name = wxFrameNameStr); + + ~wxAuiMDIParentFrame(); + + bool Create(wxWindow *parent, + wxWindowID winid, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDEFAULT_FRAME_STYLE | wxVSCROLL | wxHSCROLL, + const wxString& name = wxFrameNameStr ); + + void SetArtProvider(wxAuiTabArt* provider); + wxAuiTabArt* GetArtProvider(); + wxAuiNotebook* GetNotebook() const; + +#if wxUSE_MENUS + wxMenu* GetWindowMenu() const { return m_pWindowMenu; } + void SetWindowMenu(wxMenu* pMenu); + + virtual void SetMenuBar(wxMenuBar *pMenuBar); +#endif // wxUSE_MENUS + + void SetChildMenuBar(wxAuiMDIChildFrame *pChild); + + virtual bool ProcessEvent(wxEvent& event); + + wxAuiMDIChildFrame *GetActiveChild() const; + void SetActiveChild(wxAuiMDIChildFrame* pChildFrame); + + wxAuiMDIClientWindow *GetClientWindow() const; + virtual wxAuiMDIClientWindow *OnCreateClient(); + + virtual void Cascade() { /* Has no effect */ } + virtual void Tile(wxOrientation orient = wxHORIZONTAL); + virtual void ArrangeIcons() { /* Has no effect */ } + virtual void ActivateNext(); + virtual void ActivatePrevious(); + +protected: + wxAuiMDIClientWindow* m_pClientWindow; + wxAuiMDIChildFrame* m_pActiveChild; + wxEvent* m_pLastEvt; + +#if wxUSE_MENUS + wxMenu *m_pWindowMenu; + wxMenuBar *m_pMyMenuBar; +#endif // wxUSE_MENUS + +protected: + void Init(); + +#if wxUSE_MENUS + void RemoveWindowMenu(wxMenuBar *pMenuBar); + void AddWindowMenu(wxMenuBar *pMenuBar); + + void DoHandleMenu(wxCommandEvent &event); +#endif // wxUSE_MENUS + + virtual void DoGetClientSize(int *width, int *height) const; + +private: + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS(wxAuiMDIParentFrame) +}; + +//----------------------------------------------------------------------------- +// wxAuiMDIChildFrame +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_AUI wxAuiMDIChildFrame : public wxPanel +{ +public: + wxAuiMDIChildFrame(); + wxAuiMDIChildFrame(wxAuiMDIParentFrame *parent, + wxWindowID winid, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDEFAULT_FRAME_STYLE, + const wxString& name = wxFrameNameStr); + + virtual ~wxAuiMDIChildFrame(); + bool Create(wxAuiMDIParentFrame *parent, + wxWindowID winid, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDEFAULT_FRAME_STYLE, + const wxString& name = wxFrameNameStr); + +#if wxUSE_MENUS + virtual void SetMenuBar(wxMenuBar *menu_bar); + virtual wxMenuBar *GetMenuBar() const; +#endif // wxUSE_MENUS + + virtual void SetTitle(const wxString& title); + virtual wxString GetTitle() const; + + virtual void SetIcons(const wxIconBundle& icons); + virtual const wxIconBundle& GetIcons() const; + + virtual void SetIcon(const wxIcon& icon); + virtual const wxIcon& GetIcon() const; + + virtual void Activate(); + virtual bool Destroy(); + +#if wxUSE_STATUSBAR + // no status bars + virtual wxStatusBar* CreateStatusBar(int WXUNUSED(number) = 1, + long WXUNUSED(style) = 1, + wxWindowID WXUNUSED(winid) = 1, + const wxString& WXUNUSED(name) = wxEmptyString) + { return (wxStatusBar*)NULL; } + + virtual wxStatusBar *GetStatusBar() const { return (wxStatusBar*)NULL; } + virtual void SetStatusText( const wxString &WXUNUSED(text), int WXUNUSED(number)=0 ) {} + virtual void SetStatusWidths( int WXUNUSED(n), const int WXUNUSED(widths_field)[] ) {} +#endif + + // no size hints + virtual void DoSetSizeHints(int WXUNUSED(minW), + int WXUNUSED(minH), + int WXUNUSED(maxW) = wxDefaultCoord, + int WXUNUSED(maxH) = wxDefaultCoord, + int WXUNUSED(incW) = wxDefaultCoord, + int WXUNUSED(incH) = wxDefaultCoord) {} +#if wxUSE_TOOLBAR + // no toolbar bars + virtual wxToolBar* CreateToolBar(long WXUNUSED(style), + wxWindowID WXUNUSED(winid), + const wxString& WXUNUSED(name)) + { return (wxToolBar*)NULL; } + virtual wxToolBar *GetToolBar() const { return (wxToolBar*)NULL; } +#endif + + + // no maximize etc + virtual void Maximize(bool WXUNUSED(maximize) = true) { /* Has no effect */ } + virtual void Restore() { /* Has no effect */ } + virtual void Iconize(bool WXUNUSED(iconize) = true) { /* Has no effect */ } + virtual bool IsMaximized() const { return true; } + virtual bool IsIconized() const { return false; } + virtual bool ShowFullScreen(bool WXUNUSED(show), long WXUNUSED(style)) { return false; } + virtual bool IsFullScreen() const { return false; } + + virtual bool IsTopLevel() const { return false; } + + void OnMenuHighlight(wxMenuEvent& evt); + void OnActivate(wxActivateEvent& evt); + void OnCloseWindow(wxCloseEvent& evt); + + void SetMDIParentFrame(wxAuiMDIParentFrame* parent); + wxAuiMDIParentFrame* GetMDIParentFrame() const; + +protected: + void Init(); + virtual bool Show(bool show = true); + virtual void DoSetSize(int x, int y, int width, int height, int size_flags); + virtual void DoMoveWindow(int x, int y, int width, int height); + +public: + // This function needs to be called when a size change is confirmed, + // we needed this function to prevent anybody from the outside + // changing the panel... it messes the UI layout when we would allow it. + void ApplyMDIChildFrameRect(); + void DoShow(bool show); + +protected: + wxAuiMDIParentFrame* m_pMDIParentFrame; + wxRect m_mdi_newrect; + wxRect m_mdi_currect; + wxString m_title; + wxIcon m_icon; + wxIconBundle m_icon_bundle; + bool m_activate_on_create; + +#if wxUSE_MENUS + wxMenuBar* m_pMenuBar; +#endif // wxUSE_MENUS + + + +private: + DECLARE_DYNAMIC_CLASS(wxAuiMDIChildFrame) + DECLARE_EVENT_TABLE() + + friend class wxAuiMDIClientWindow; +}; + +//----------------------------------------------------------------------------- +// wxAuiMDIClientWindow +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_AUI wxAuiMDIClientWindow : public wxAuiNotebook +{ +public: + wxAuiMDIClientWindow(); + wxAuiMDIClientWindow(wxAuiMDIParentFrame *parent, long style = 0); + ~wxAuiMDIClientWindow(); + + virtual bool CreateClient(wxAuiMDIParentFrame *parent, + long style = wxVSCROLL | wxHSCROLL); + + virtual int SetSelection(size_t page); + +protected: + + void PageChanged(int old_selection, int new_selection); + void OnPageClose(wxAuiNotebookEvent& evt); + void OnPageChanged(wxAuiNotebookEvent& evt); + void OnSize(wxSizeEvent& evt); + +private: + DECLARE_DYNAMIC_CLASS(wxAuiMDIClientWindow) + DECLARE_EVENT_TABLE() +}; +#endif // wxUSE_AUI + +#endif // _WX_AUITABMDI_H_ diff --git a/Externals/wxWidgets/include/wx/beforestd.h b/Externals/wxWidgets/include/wx/beforestd.h new file mode 100644 index 0000000000..09882f4308 --- /dev/null +++ b/Externals/wxWidgets/include/wx/beforestd.h @@ -0,0 +1,65 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: include/wx/beforestd.h +// Purpose: #include before STL headers +// Author: Vadim Zeitlin +// Modified by: +// Created: 07/07/03 +// RCS-ID: $Id: beforestd.h 42906 2006-11-01 14:16:42Z VZ $ +// Copyright: (c) 2003 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +/** + Unfortunately, when compiling at maximum warning level, the standard + headers themselves may generate warnings -- and really lots of them. So + before including them, this header should be included to temporarily + suppress the warnings and after this the header afterstd.h should be + included to enable them back again. + + Note that there are intentionally no inclusion guards in this file, because + it can be included several times. + */ + +// VC 7.x isn't as bad as VC6 and doesn't give these warnings but eVC (which +// defines _MSC_VER as 1201) does need to be included as it's VC6-like +#if defined(__VISUALC__) && __VISUALC__ <= 1201 + // MSVC 5 does not have this + #if __VISUALC__ > 1100 + // we have to disable (and reenable in afterstd.h) this one because, + // even though it is of level 4, it is not disabled by warning(push, 1) + // below for VC7.1! + + // unreachable code + #pragma warning(disable:4702) + + #pragma warning(push, 1) + #else // VC 5 + // 'expression' : signed/unsigned mismatch + #pragma warning(disable:4018) + + // 'identifier' : unreferenced formal parameter + #pragma warning(disable:4100) + + // 'conversion' : conversion from 'type1' to 'type2', + // possible loss of data + #pragma warning(disable:4244) + + // C++ language change: to explicitly specialize class template + // 'identifier' use the following syntax + #pragma warning(disable:4663) + #endif + + // these warning have to be disabled and not just temporarily disabled + // because they will be given at the end of the compilation of the + // current source and there is absolutely nothing we can do about them + + // 'foo': unreferenced inline function has been removed + #pragma warning(disable:4514) + + // 'function' : function not inlined + #pragma warning(disable:4710) + + // 'id': identifier was truncated to 'num' characters in the debug info + #pragma warning(disable:4786) +#endif // VC++ < 7 + diff --git a/Externals/wxWidgets/include/wx/bitmap.h b/Externals/wxWidgets/include/wx/bitmap.h new file mode 100644 index 0000000000..bcee143739 --- /dev/null +++ b/Externals/wxWidgets/include/wx/bitmap.h @@ -0,0 +1,241 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/bitmap.h +// Purpose: wxBitmap class interface +// Author: Vaclav Slavik +// Modified by: +// Created: 22.04.01 +// RCS-ID: $Id: bitmap.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_BITMAP_H_BASE_ +#define _WX_BITMAP_H_BASE_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/string.h" +#include "wx/gdicmn.h" // for wxBitmapType +#include "wx/colour.h" + +class WXDLLIMPEXP_FWD_CORE wxBitmap; +class WXDLLIMPEXP_FWD_CORE wxBitmapHandler; +class WXDLLIMPEXP_FWD_CORE wxIcon; +class WXDLLIMPEXP_FWD_CORE wxImage; +class WXDLLIMPEXP_FWD_CORE wxMask; +class WXDLLIMPEXP_FWD_CORE wxPalette; + +// ---------------------------------------------------------------------------- +// wxVariant support +// ---------------------------------------------------------------------------- + +#if wxUSE_VARIANT +#include "wx/variant.h" +DECLARE_VARIANT_OBJECT_EXPORTED(wxBitmap,WXDLLEXPORT) +#endif + +// ---------------------------------------------------------------------------- +// wxMask represents the transparent area of the bitmap +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxMaskBase : public wxObject +{ +public: + // create the mask from bitmap pixels of the given colour + bool Create(const wxBitmap& bitmap, const wxColour& colour); + +#if wxUSE_PALETTE + // create the mask from bitmap pixels with the given palette index + bool Create(const wxBitmap& bitmap, int paletteIndex); +#endif // wxUSE_PALETTE + + // create the mask from the given mono bitmap + bool Create(const wxBitmap& bitmap); + +protected: + // this function is called from Create() to free the existing mask data + virtual void FreeData() = 0; + + // these functions must be overridden to implement the corresponding public + // Create() methods, they shouldn't call FreeData() as it's already called + // by the public wrappers + virtual bool InitFromColour(const wxBitmap& bitmap, + const wxColour& colour) = 0; + virtual bool InitFromMonoBitmap(const wxBitmap& bitmap) = 0; +}; + +#if defined(__WXMGL__) || \ + defined(__WXDFB__) || \ + defined(__WXMAC__) || \ + defined(__WXGTK__) || \ + defined(__WXCOCOA__) || \ + defined(__WXMOTIF__) || \ + defined(__WXX11__) + #define wxUSE_BITMAP_BASE 1 +#else + #define wxUSE_BITMAP_BASE 0 +#endif + +// Only used by some ports +// FIXME -- make all ports (but MSW which uses wxGDIImage) use these base classes +#if wxUSE_BITMAP_BASE + +// ---------------------------------------------------------------------------- +// wxBitmapHandler: class which knows how to create/load/save bitmaps in +// different formats +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxBitmapHandlerBase : public wxObject +{ +public: + wxBitmapHandlerBase() { m_type = wxBITMAP_TYPE_INVALID; } + virtual ~wxBitmapHandlerBase() { } + + virtual bool Create(wxBitmap *bitmap, const void* data, long flags, + int width, int height, int depth = 1); + virtual bool LoadFile(wxBitmap *bitmap, const wxString& name, long flags, + int desiredWidth, int desiredHeight); + virtual bool SaveFile(const wxBitmap *bitmap, const wxString& name, + int type, const wxPalette *palette = NULL); + + void SetName(const wxString& name) { m_name = name; } + void SetExtension(const wxString& ext) { m_extension = ext; } + void SetType(wxBitmapType type) { m_type = type; } + const wxString& GetName() const { return m_name; } + const wxString& GetExtension() const { return m_extension; } + wxBitmapType GetType() const { return m_type; } + +private: + wxString m_name; + wxString m_extension; + wxBitmapType m_type; + + DECLARE_ABSTRACT_CLASS(wxBitmapHandlerBase) +}; + +class WXDLLEXPORT wxBitmapBase : public wxGDIObject +{ +public: + /* + Derived class must implement these: + + wxBitmap(); + wxBitmap(int width, int height, int depth = -1); + wxBitmap(const char bits[], int width, int height, int depth = 1); + wxBitmap(const char* const* bits); + wxBitmap(const wxString &filename, wxBitmapType type = wxBITMAP_TYPE_XPM); + wxBitmap(const wxImage& image, int depth = -1); + + bool Create(int width, int height, int depth = -1); + + static void InitStandardHandlers(); + */ + + virtual bool Ok() const { return IsOk(); } + virtual bool IsOk() const = 0; + + virtual int GetHeight() const = 0; + virtual int GetWidth() const = 0; + virtual int GetDepth() const = 0; + + virtual wxImage ConvertToImage() const = 0; + + virtual wxMask *GetMask() const = 0; + virtual void SetMask(wxMask *mask) = 0; + + virtual wxBitmap GetSubBitmap(const wxRect& rect) const = 0; + + virtual bool SaveFile(const wxString &name, wxBitmapType type, + const wxPalette *palette = (wxPalette *)NULL) const = 0; + virtual bool LoadFile(const wxString &name, wxBitmapType type) = 0; + + /* + If raw bitmap access is supported (see wx/rawbmp.h), the following + methods should be implemented: + + virtual bool GetRawData(wxRawBitmapData *data) = 0; + virtual void UngetRawData(wxRawBitmapData *data) = 0; + */ + +#if wxUSE_PALETTE + virtual wxPalette *GetPalette() const = 0; + virtual void SetPalette(const wxPalette& palette) = 0; +#endif // wxUSE_PALETTE + + // copies the contents and mask of the given (colour) icon to the bitmap + virtual bool CopyFromIcon(const wxIcon& icon) = 0; + + // implementation: + virtual void SetHeight(int height) = 0; + virtual void SetWidth(int width) = 0; + virtual void SetDepth(int depth) = 0; + + // Format handling + static inline wxList& GetHandlers() { return sm_handlers; } + static void AddHandler(wxBitmapHandlerBase *handler); + static void InsertHandler(wxBitmapHandlerBase *handler); + static bool RemoveHandler(const wxString& name); + static wxBitmapHandler *FindHandler(const wxString& name); + static wxBitmapHandler *FindHandler(const wxString& extension, wxBitmapType bitmapType); + static wxBitmapHandler *FindHandler(wxBitmapType bitmapType); + + //static void InitStandardHandlers(); + // (wxBitmap must implement this one) + + static void CleanUpHandlers(); + + // this method is only used by the generic implementation of wxMask + // currently but could be useful elsewhere in the future: it can be + // overridden to quantize the colour to correspond to bitmap colour depth + // if necessary; default implementation simply returns the colour as is + virtual wxColour QuantizeColour(const wxColour& colour) const + { + return colour; + } + +protected: + static wxList sm_handlers; + + DECLARE_ABSTRACT_CLASS(wxBitmapBase) +}; + +#endif // wxUSE_BITMAP_BASE + +#if defined(__WXPALMOS__) + #include "wx/palmos/bitmap.h" +#elif defined(__WXMSW__) + #include "wx/msw/bitmap.h" +#elif defined(__WXMOTIF__) + #include "wx/x11/bitmap.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/bitmap.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/bitmap.h" +#elif defined(__WXX11__) + #include "wx/x11/bitmap.h" +#elif defined(__WXMGL__) + #include "wx/mgl/bitmap.h" +#elif defined(__WXDFB__) + #include "wx/dfb/bitmap.h" +#elif defined(__WXMAC__) + #include "wx/mac/bitmap.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/bitmap.h" +#elif defined(__WXPM__) + #include "wx/os2/bitmap.h" +#endif + +// we must include generic mask.h after wxBitmap definition +#if defined(__WXMGL__) || defined(__WXDFB__) + #define wxUSE_GENERIC_MASK 1 +#else + #define wxUSE_GENERIC_MASK 0 +#endif + +#if wxUSE_GENERIC_MASK + #include "wx/generic/mask.h" +#endif + +#endif // _WX_BITMAP_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/bmpbuttn.h b/Externals/wxWidgets/include/wx/bmpbuttn.h new file mode 100644 index 0000000000..f7b96b662d --- /dev/null +++ b/Externals/wxWidgets/include/wx/bmpbuttn.h @@ -0,0 +1,122 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/bmpbutton.h +// Purpose: wxBitmapButton class interface +// Author: Vadim Zeitlin +// Modified by: +// Created: 25.08.00 +// RCS-ID: $Id: bmpbuttn.h 45498 2007-04-16 13:03:05Z VZ $ +// Copyright: (c) 2000 Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_BMPBUTTON_H_BASE_ +#define _WX_BMPBUTTON_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_BMPBUTTON + +#include "wx/bitmap.h" +#include "wx/button.h" + +extern WXDLLEXPORT_DATA(const wxChar) wxButtonNameStr[]; + +// ---------------------------------------------------------------------------- +// wxBitmapButton: a button which shows bitmaps instead of the usual string. +// It has different bitmaps for different states (focused/disabled/pressed) +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxBitmapButtonBase : public wxButton +{ +public: + wxBitmapButtonBase() + { + m_marginX = + m_marginY = 0; + } + + // set the bitmaps + void SetBitmapLabel(const wxBitmap& bitmap) + { m_bmpNormal = bitmap; OnSetBitmap(); } + void SetBitmapSelected(const wxBitmap& sel) + { m_bmpSelected = sel; OnSetBitmap(); } + void SetBitmapFocus(const wxBitmap& focus) + { m_bmpFocus = focus; OnSetBitmap(); } + void SetBitmapDisabled(const wxBitmap& disabled) + { m_bmpDisabled = disabled; OnSetBitmap(); } + void SetBitmapHover(const wxBitmap& hover) + { m_bmpHover = hover; OnSetBitmap(); } + + // retrieve the bitmaps + const wxBitmap& GetBitmapLabel() const { return m_bmpNormal; } + const wxBitmap& GetBitmapSelected() const { return m_bmpSelected; } + const wxBitmap& GetBitmapFocus() const { return m_bmpFocus; } + const wxBitmap& GetBitmapDisabled() const { return m_bmpDisabled; } + const wxBitmap& GetBitmapHover() const { return m_bmpHover; } + wxBitmap& GetBitmapLabel() { return m_bmpNormal; } + wxBitmap& GetBitmapSelected() { return m_bmpSelected; } + wxBitmap& GetBitmapFocus() { return m_bmpFocus; } + wxBitmap& GetBitmapDisabled() { return m_bmpDisabled; } + wxBitmap& GetBitmapHover() { return m_bmpHover; } + + // set/get the margins around the button + virtual void SetMargins(int x, int y) { m_marginX = x; m_marginY = y; } + int GetMarginX() const { return m_marginX; } + int GetMarginY() const { return m_marginY; } + + // deprecated synonym for SetBitmapLabel() +#if WXWIN_COMPATIBILITY_2_6 + wxDEPRECATED( void SetLabel(const wxBitmap& bitmap) ); + + // prevent virtual function hiding + virtual void SetLabel(const wxString& label) + { wxWindow::SetLabel(label); } +#endif // WXWIN_COMPATIBILITY_2_6 + +protected: + // function called when any of the bitmaps changes + virtual void OnSetBitmap() { InvalidateBestSize(); Refresh(); } + + // the bitmaps for various states + wxBitmap m_bmpNormal, + m_bmpSelected, + m_bmpFocus, + m_bmpDisabled, + m_bmpHover; + + // the margins around the bitmap + int m_marginX, + m_marginY; + + + DECLARE_NO_COPY_CLASS(wxBitmapButtonBase) +}; + +#if WXWIN_COMPATIBILITY_2_6 +inline void wxBitmapButtonBase::SetLabel(const wxBitmap& bitmap) +{ + SetBitmapLabel(bitmap); +} +#endif // WXWIN_COMPATIBILITY_2_6 + +#if defined(__WXUNIVERSAL__) + #include "wx/univ/bmpbuttn.h" +#elif defined(__WXMSW__) + #include "wx/msw/bmpbuttn.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/bmpbuttn.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/bmpbuttn.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/bmpbuttn.h" +#elif defined(__WXMAC__) + #include "wx/mac/bmpbuttn.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/bmpbuttn.h" +#elif defined(__WXPM__) + #include "wx/os2/bmpbuttn.h" +#endif + +#endif // wxUSE_BMPBUTTON + +#endif // _WX_BMPBUTTON_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/bmpcbox.h b/Externals/wxWidgets/include/wx/bmpcbox.h new file mode 100644 index 0000000000..aab8ce3c88 --- /dev/null +++ b/Externals/wxWidgets/include/wx/bmpcbox.h @@ -0,0 +1,49 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/bmpcbox.h +// Purpose: wxBitmapComboBox base header +// Author: Jaakko Salli +// Modified by: +// Created: Aug-31-2006 +// Copyright: (c) Jaakko Salli +// RCS-ID: $Id: bmpcbox.h 42046 2006-10-16 09:30:01Z ABX $ +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_BMPCBOX_H_BASE_ +#define _WX_BMPCBOX_H_BASE_ + + +#include "wx/defs.h" + +#if wxUSE_BITMAPCOMBOBOX + +#include "wx/bitmap.h" + + +extern WXDLLIMPEXP_DATA_ADV(const wxChar) wxBitmapComboBoxNameStr[]; + + +class WXDLLIMPEXP_ADV wxBitmapComboBoxBase +{ +public: + // ctors and such + wxBitmapComboBoxBase() { } + + virtual ~wxBitmapComboBoxBase() { } + + // Returns the image of the item with the given index. + virtual wxBitmap GetItemBitmap(unsigned int n) const = 0; + + // Sets the image for the given item. + virtual void SetItemBitmap(unsigned int n, const wxBitmap& bitmap) = 0; + + // Returns size of the image used in list + virtual wxSize GetBitmapSize() const = 0; +}; + + +#include "wx/generic/bmpcbox.h" + +#endif // wxUSE_BITMAPCOMBOBOX + +#endif // _WX_BMPCBOX_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/bookctrl.h b/Externals/wxWidgets/include/wx/bookctrl.h new file mode 100644 index 0000000000..98a95dc6eb --- /dev/null +++ b/Externals/wxWidgets/include/wx/bookctrl.h @@ -0,0 +1,403 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/bookctrl.h +// Purpose: wxBookCtrlBase: common base class for wxList/Tree/Notebook +// Author: Vadim Zeitlin +// Modified by: +// Created: 19.08.03 +// RCS-ID: $Id: bookctrl.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) 2003 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_BOOKCTRL_H_ +#define _WX_BOOKCTRL_H_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/defs.h" + +#if wxUSE_BOOKCTRL + +#include "wx/control.h" +#include "wx/dynarray.h" + +WX_DEFINE_EXPORTED_ARRAY_PTR(wxWindow *, wxArrayPages); + +class WXDLLIMPEXP_FWD_CORE wxImageList; +class WXDLLIMPEXP_FWD_CORE wxBookCtrlBaseEvent; + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// wxBookCtrl hit results +enum +{ + wxBK_HITTEST_NOWHERE = 1, // not on tab + wxBK_HITTEST_ONICON = 2, // on icon + wxBK_HITTEST_ONLABEL = 4, // on label + wxBK_HITTEST_ONITEM = wxBK_HITTEST_ONICON | wxBK_HITTEST_ONLABEL, + wxBK_HITTEST_ONPAGE = 8 // not on tab control, but over the selected page +}; + +// wxBookCtrl flags (common for wxNotebook, wxListbook, wxChoicebook, wxTreebook) +#define wxBK_DEFAULT 0x0000 +#define wxBK_TOP 0x0010 +#define wxBK_BOTTOM 0x0020 +#define wxBK_LEFT 0x0040 +#define wxBK_RIGHT 0x0080 +#define wxBK_ALIGN_MASK (wxBK_TOP | wxBK_BOTTOM | wxBK_LEFT | wxBK_RIGHT) + +// ---------------------------------------------------------------------------- +// wxBookCtrlBase +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxBookCtrlBase : public wxControl +{ +public: + // construction + // ------------ + + wxBookCtrlBase() + { + Init(); + } + + wxBookCtrlBase(wxWindow *parent, + wxWindowID winid, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxEmptyString) + { + Init(); + + (void)Create(parent, winid, pos, size, style, name); + } + + // quasi ctor + bool Create(wxWindow *parent, + wxWindowID winid, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxEmptyString); + + // dtor + virtual ~wxBookCtrlBase(); + + + // accessors + // --------- + + // get number of pages in the dialog + virtual size_t GetPageCount() const { return m_pages.size(); } + + // get the panel which represents the given page + wxWindow *GetPage(size_t n) { return m_pages[n]; } + wxWindow *GetPage(size_t n) const { return m_pages[n]; } + + // get the current page or NULL if none + wxWindow *GetCurrentPage() const + { + const int n = GetSelection(); + return n == wxNOT_FOUND ? NULL : GetPage(n); + } + + // get the currently selected page or wxNOT_FOUND if none + virtual int GetSelection() const = 0; + + // set/get the title of a page + virtual bool SetPageText(size_t n, const wxString& strText) = 0; + virtual wxString GetPageText(size_t n) const = 0; + + + // image list stuff: each page may have an image associated with it (all + // images belong to the same image list) + // --------------------------------------------------------------------- + + // sets the image list to use, it is *not* deleted by the control + virtual void SetImageList(wxImageList *imageList); + + // as SetImageList() but we will delete the image list ourselves + void AssignImageList(wxImageList *imageList); + + // get pointer (may be NULL) to the associated image list + wxImageList* GetImageList() const { return m_imageList; } + + // sets/returns item's image index in the current image list + virtual int GetPageImage(size_t n) const = 0; + virtual bool SetPageImage(size_t n, int imageId) = 0; + + + // geometry + // -------- + + // resize the notebook so that all pages will have the specified size + virtual void SetPageSize(const wxSize& size); + + // calculate the size of the control from the size of its page + virtual wxSize CalcSizeFromPage(const wxSize& sizePage) const = 0; + + // get/set size of area between book control area and page area + unsigned int GetInternalBorder() const { return m_internalBorder; } + void SetInternalBorder(unsigned int border) { m_internalBorder = border; } + + // Sets/gets the margin around the controller + void SetControlMargin(int margin) { m_controlMargin = margin; } + int GetControlMargin() const { return m_controlMargin; } + + // returns true if we have wxBK_TOP or wxBK_BOTTOM style + bool IsVertical() const { return HasFlag(wxBK_BOTTOM | wxBK_TOP); } + + // set/get option to shrink to fit current page + void SetFitToCurrentPage(bool fit) { m_fitToCurrentPage = fit; } + bool GetFitToCurrentPage() const { return m_fitToCurrentPage; } + + // returns the sizer containing the control, if any + wxSizer* GetControlSizer() const { return m_controlSizer; } + + // operations + // ---------- + + // remove one page from the control and delete it + virtual bool DeletePage(size_t n); + + // remove one page from the notebook, without deleting it + virtual bool RemovePage(size_t n) + { + DoInvalidateBestSize(); + return DoRemovePage(n) != NULL; + } + + // remove all pages and delete them + virtual bool DeleteAllPages() + { + DoInvalidateBestSize(); + WX_CLEAR_ARRAY(m_pages); + return true; + } + + // adds a new page to the control + virtual bool AddPage(wxWindow *page, + const wxString& text, + bool bSelect = false, + int imageId = -1) + { + DoInvalidateBestSize(); + return InsertPage(GetPageCount(), page, text, bSelect, imageId); + } + + // the same as AddPage(), but adds the page at the specified position + virtual bool InsertPage(size_t n, + wxWindow *page, + const wxString& text, + bool bSelect = false, + int imageId = -1) = 0; + + // set the currently selected page, return the index of the previously + // selected one (or -1 on error) + // + // NB: this function will generate PAGE_CHANGING/ED events + virtual int SetSelection(size_t n) = 0; + + // acts as SetSelection but does not generate events + virtual int ChangeSelection(size_t n) = 0; + + + // cycle thru the pages + void AdvanceSelection(bool forward = true) + { + int nPage = GetNextPage(forward); + if ( nPage != -1 ) + { + // cast is safe because of the check above + SetSelection((size_t)nPage); + } + } + + // hit test: returns which page is hit and, optionally, where (icon, label) + virtual int HitTest(const wxPoint& WXUNUSED(pt), + long * WXUNUSED(flags) = NULL) const + { + return wxNOT_FOUND; + } + + + // we do have multiple pages + virtual bool HasMultiplePages() const { return true; } + + +protected: + // flags for DoSetSelection() + enum + { + SetSelection_SendEvent = 1 + }; + + // set the selection to the given page, sending the events (which can + // possibly prevent the page change from taking place) if SendEvent flag is + // included + virtual int DoSetSelection(size_t nPage, int flags = 0); + + // if the derived class uses DoSetSelection() for implementing + // [Set|Change]Selection, it must override UpdateSelectedPage(), + // CreatePageChangingEvent() and MakeChangedEvent(), but as it might not + // use it, these functions are not pure virtual + + // called to notify the control about a new current page + virtual void UpdateSelectedPage(size_t WXUNUSED(newsel)) + { wxFAIL_MSG(wxT("Override this function!")); } + + // create a new "page changing" event + virtual wxBookCtrlBaseEvent* CreatePageChangingEvent() const + { wxFAIL_MSG(wxT("Override this function!")); return NULL; } + + // modify the event created by CreatePageChangingEvent() to "page changed" + // event, usually by just calling SetEventType() on it + virtual void MakeChangedEvent(wxBookCtrlBaseEvent& WXUNUSED(event)) + { wxFAIL_MSG(wxT("Override this function!")); } + + + // Should we accept NULL page pointers in Add/InsertPage()? + // + // Default is no but derived classes may override it if they can treat NULL + // pages in some sensible way (e.g. wxTreebook overrides this to allow + // having nodes without any associated page) + virtual bool AllowNullPage() const { return false; } + + // remove the page and return a pointer to it + virtual wxWindow *DoRemovePage(size_t page) = 0; + + // our best size is the size which fits all our pages + virtual wxSize DoGetBestSize() const; + + // helper: get the next page wrapping if we reached the end + int GetNextPage(bool forward) const; + + // Lay out controls + void DoSize(); + + // This method also invalidates the size of the controller and should be + // called instead of just InvalidateBestSize() whenever pages are added or + // removed as this also affects the controller + void DoInvalidateBestSize(); + +#if wxUSE_HELP + // Show the help for the corresponding page + void OnHelp(wxHelpEvent& event); +#endif // wxUSE_HELP + + + // the array of all pages of this control + wxArrayPages m_pages; + + // the associated image list or NULL + wxImageList *m_imageList; + + // true if we must delete m_imageList + bool m_ownsImageList; + + // get the page area + wxRect GetPageRect() const; + + // event handlers + virtual wxSize GetControllerSize() const; + void OnSize(wxSizeEvent& event); + + // controller buddy if available, NULL otherwise (usually for native book controls like wxNotebook) + wxControl *m_bookctrl; + + // Whether to shrink to fit current page + bool m_fitToCurrentPage; + + // the sizer containing the choice control + wxSizer *m_controlSizer; + + // the margin around the choice control + int m_controlMargin; + +private: + + // common part of all ctors + void Init(); + + // internal border + unsigned int m_internalBorder; + + DECLARE_ABSTRACT_CLASS(wxBookCtrlBase) + DECLARE_NO_COPY_CLASS(wxBookCtrlBase) + DECLARE_EVENT_TABLE() +}; + +// ---------------------------------------------------------------------------- +// wxBookCtrlBaseEvent: page changing events generated by derived classes +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxBookCtrlBaseEvent : public wxNotifyEvent +{ +public: + wxBookCtrlBaseEvent(wxEventType commandType = wxEVT_NULL, int winid = 0, + int nSel = -1, int nOldSel = -1) + : wxNotifyEvent(commandType, winid) + { + m_nSel = nSel; + m_nOldSel = nOldSel; + } + + wxBookCtrlBaseEvent(const wxBookCtrlBaseEvent& event) + : wxNotifyEvent(event) + { + m_nSel = event.m_nSel; + m_nOldSel = event.m_nOldSel; + } + + // accessors + // the currently selected page (-1 if none) + int GetSelection() const { return m_nSel; } + void SetSelection(int nSel) { m_nSel = nSel; } + // the page that was selected before the change (-1 if none) + int GetOldSelection() const { return m_nOldSel; } + void SetOldSelection(int nOldSel) { m_nOldSel = nOldSel; } + +private: + int m_nSel, // currently selected page + m_nOldSel; // previously selected page +}; + +// make a default book control for given platform +#if wxUSE_NOTEBOOK + // dedicated to majority of desktops + #include "wx/notebook.h" + #define wxBookCtrl wxNotebook + #define wxBookCtrlEvent wxNotebookEvent + #define wxEVT_COMMAND_BOOKCTRL_PAGE_CHANGED wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED + #define wxEVT_COMMAND_BOOKCTRL_PAGE_CHANGING wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING + #define EVT_BOOKCTRL_PAGE_CHANGED(id, fn) EVT_NOTEBOOK_PAGE_CHANGED(id, fn) + #define EVT_BOOKCTRL_PAGE_CHANGING(id, fn) EVT_NOTEBOOK_PAGE_CHANGING(id, fn) + #define wxBookctrlEventHandler(func) wxNotebookEventHandler(func) +#else + // dedicated to Smartphones + #include "wx/choicebk.h" + #define wxBookCtrl wxChoicebook + #define wxBookCtrlEvent wxChoicebookEvent + #define wxEVT_COMMAND_BOOKCTRL_PAGE_CHANGED wxEVT_COMMAND_CHOICEBOOK_PAGE_CHANGED + #define wxEVT_COMMAND_BOOKCTRL_PAGE_CHANGING wxEVT_COMMAND_CHOICEBOOK_PAGE_CHANGING + #define EVT_BOOKCTRL_PAGE_CHANGED(id, fn) EVT_CHOICEBOOK_PAGE_CHANGED(id, fn) + #define EVT_BOOKCTRL_PAGE_CHANGING(id, fn) EVT_CHOICEBOOK_PAGE_CHANGING(id, fn) + #define wxBookctrlEventHandler(func) wxChoicebookEventHandler(func) +#endif + +#if WXWIN_COMPATIBILITY_2_6 + #define wxBC_TOP wxBK_TOP + #define wxBC_BOTTOM wxBK_BOTTOM + #define wxBC_LEFT wxBK_LEFT + #define wxBC_RIGHT wxBK_RIGHT + #define wxBC_DEFAULT wxBK_DEFAULT +#endif + +#endif // wxUSE_BOOKCTRL + +#endif // _WX_BOOKCTRL_H_ diff --git a/Externals/wxWidgets/include/wx/brush.h b/Externals/wxWidgets/include/wx/brush.h new file mode 100644 index 0000000000..cf963ab2df --- /dev/null +++ b/Externals/wxWidgets/include/wx/brush.h @@ -0,0 +1,54 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/brush.h +// Purpose: Includes platform-specific wxBrush file +// Author: Julian Smart +// Modified by: +// Created: +// RCS-ID: $Id: brush.h 40865 2006-08-27 09:42:42Z VS $ +// Copyright: Julian Smart +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_BRUSH_H_BASE_ +#define _WX_BRUSH_H_BASE_ + +#include "wx/defs.h" +#include "wx/object.h" +#include "wx/gdiobj.h" + +// wxBrushBase +class WXDLLEXPORT wxBrushBase: public wxGDIObject +{ +public: + virtual ~wxBrushBase() { } + + virtual int GetStyle() const = 0; + + virtual bool IsHatch() const + { return (GetStyle()>=wxFIRST_HATCH) && (GetStyle()<=wxLAST_HATCH); } +}; + +#if defined(__WXPALMOS__) + #include "wx/palmos/brush.h" +#elif defined(__WXMSW__) + #include "wx/msw/brush.h" +#elif defined(__WXMOTIF__) || defined(__WXX11__) + #include "wx/x11/brush.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/brush.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/brush.h" +#elif defined(__WXMGL__) + #include "wx/mgl/brush.h" +#elif defined(__WXDFB__) + #include "wx/dfb/brush.h" +#elif defined(__WXMAC__) + #include "wx/mac/brush.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/brush.h" +#elif defined(__WXPM__) + #include "wx/os2/brush.h" +#endif + +#endif + // _WX_BRUSH_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/buffer.h b/Externals/wxWidgets/include/wx/buffer.h new file mode 100644 index 0000000000..cd78fc6394 --- /dev/null +++ b/Externals/wxWidgets/include/wx/buffer.h @@ -0,0 +1,314 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/buffer.h +// Purpose: auto buffer classes: buffers which automatically free memory +// Author: Vadim Zeitlin +// Modified by: +// Created: 12.04.99 +// RCS-ID: $Id: buffer.h 45761 2007-05-02 17:09:30Z VS $ +// Copyright: (c) 1998 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_BUFFER_H +#define _WX_BUFFER_H + +#include "wx/wxchar.h" + +#include // malloc() and free() + +// ---------------------------------------------------------------------------- +// Special classes for (wide) character strings: they use malloc/free instead +// of new/delete +// ---------------------------------------------------------------------------- + +#define DEFINE_BUFFER(classname, chartype, strdupfunc) \ +class WXDLLIMPEXP_BASE classname \ +{ \ +public: \ + classname(const chartype *str = NULL) \ + : m_str(str ? strdupfunc(str) : NULL) \ + { \ + } \ + \ + classname(size_t len) \ + : m_str((chartype *)malloc((len + 1)*sizeof(chartype))) \ + { \ + m_str[len] = (chartype)0; \ + } \ + \ + /* no need to check for NULL, free() does it */ \ + ~classname() { free(m_str); } \ + \ + /* \ + WARNING: \ + \ + the copy ctor and assignment operators change the passed in object \ + even although it is declared as "const", so: \ + \ + a) it shouldn't be really const \ + b) you shouldn't use it afterwards (or know that it was reset) \ + \ + This is very ugly but is unfortunately needed to make the normal use\ + of classname buffer objects possible and is very similar to what \ + std::auto_ptr<> does (as if it were an excuse...) \ + */ \ + \ + /* \ + because of the remark above, release() is declared const even if it \ + isn't really const \ + */ \ + chartype *release() const \ + { \ + chartype *p = m_str; \ + ((classname *)this)->m_str = NULL; \ + return p; \ + } \ + \ + void reset() \ + { \ + free(m_str); \ + m_str = NULL; \ + } \ + \ + classname(const classname& src) \ + : m_str(src.release()) \ + { \ + } \ + \ + classname& operator=(const chartype *str) \ + { \ + free(m_str); \ + m_str = str ? strdupfunc(str) : NULL; \ + return *this; \ + } \ + \ + classname& operator=(const classname& src) \ + { \ + free(m_str); \ + m_str = src.release(); \ + \ + return *this; \ + } \ + \ + bool extend(size_t len) \ + { \ + chartype * \ + str = (chartype *)realloc(m_str, (len + 1)*sizeof(chartype)); \ + if ( !str ) \ + return false; \ + \ + m_str = str; \ + \ + return true; \ + } \ + \ + chartype *data() { return m_str; } \ + const chartype *data() const { return m_str; } \ + operator const chartype *() const { return m_str; } \ + chartype operator[](size_t n) const { return m_str[n]; } \ + \ +private: \ + chartype *m_str; \ +} + +#if wxABI_VERSION >= 20804 +// needed for wxString::char_str() and wchar_str() +#define DEFINE_WRITABLE_BUFFER(classname, baseclass, chartype) \ +class WXDLLIMPEXP_BASE classname : public baseclass \ +{ \ +public: \ + classname(const baseclass& src) : baseclass(src) {} \ + classname(const chartype *str = NULL) : baseclass(str) {} \ + \ + operator chartype*() { return this->data(); } \ +} +#endif // wxABI_VERSION >= 20804 + +DEFINE_BUFFER(wxCharBuffer, char, wxStrdupA); +#if wxABI_VERSION >= 20804 +DEFINE_WRITABLE_BUFFER(wxWritableCharBuffer, wxCharBuffer, char); +#endif + +#if wxUSE_WCHAR_T + +DEFINE_BUFFER(wxWCharBuffer, wchar_t, wxStrdupW); +#if wxABI_VERSION >= 20804 +DEFINE_WRITABLE_BUFFER(wxWritableWCharBuffer, wxWCharBuffer, wchar_t); +#endif + +#endif // wxUSE_WCHAR_T + +#undef DEFINE_BUFFER +#undef DEFINE_WRITABLE_BUFFER + +#if wxUSE_UNICODE + typedef wxWCharBuffer wxWxCharBuffer; + + #define wxMB2WXbuf wxWCharBuffer + #define wxWX2MBbuf wxCharBuffer + #define wxWC2WXbuf wxChar* + #define wxWX2WCbuf wxChar* +#else // ANSI + typedef wxCharBuffer wxWxCharBuffer; + + #define wxMB2WXbuf wxChar* + #define wxWX2MBbuf wxChar* + #define wxWC2WXbuf wxCharBuffer + #define wxWX2WCbuf wxWCharBuffer +#endif // Unicode/ANSI + +// ---------------------------------------------------------------------------- +// A class for holding growable data buffers (not necessarily strings) +// ---------------------------------------------------------------------------- + +// This class manages the actual data buffer pointer and is ref-counted. +class wxMemoryBufferData +{ +public: + // the initial size and also the size added by ResizeIfNeeded() + enum { DefBufSize = 1024 }; + + friend class wxMemoryBuffer; + + // everyting is private as it can only be used by wxMemoryBuffer +private: + wxMemoryBufferData(size_t size = wxMemoryBufferData::DefBufSize) + : m_data(size ? malloc(size) : NULL), m_size(size), m_len(0), m_ref(0) + { + } + ~wxMemoryBufferData() { free(m_data); } + + + void ResizeIfNeeded(size_t newSize) + { + if (newSize > m_size) + { + void *dataOld = m_data; + m_data = realloc(m_data, newSize + wxMemoryBufferData::DefBufSize); + if ( !m_data ) + { + free(dataOld); + } + + m_size = newSize + wxMemoryBufferData::DefBufSize; + } + } + + void IncRef() { m_ref += 1; } + void DecRef() + { + m_ref -= 1; + if (m_ref == 0) // are there no more references? + delete this; + } + + + // the buffer containing the data + void *m_data; + + // the size of the buffer + size_t m_size; + + // the amount of data currently in the buffer + size_t m_len; + + // the reference count + size_t m_ref; + + DECLARE_NO_COPY_CLASS(wxMemoryBufferData) +}; + + +class wxMemoryBuffer +{ +public: + // ctor and dtor + wxMemoryBuffer(size_t size = wxMemoryBufferData::DefBufSize) + { + m_bufdata = new wxMemoryBufferData(size); + m_bufdata->IncRef(); + } + + ~wxMemoryBuffer() { m_bufdata->DecRef(); } + + + // copy and assignment + wxMemoryBuffer(const wxMemoryBuffer& src) + : m_bufdata(src.m_bufdata) + { + m_bufdata->IncRef(); + } + + wxMemoryBuffer& operator=(const wxMemoryBuffer& src) + { + m_bufdata->DecRef(); + m_bufdata = src.m_bufdata; + m_bufdata->IncRef(); + return *this; + } + + + // Accessors + void *GetData() const { return m_bufdata->m_data; } + size_t GetBufSize() const { return m_bufdata->m_size; } + size_t GetDataLen() const { return m_bufdata->m_len; } + + void SetBufSize(size_t size) { m_bufdata->ResizeIfNeeded(size); } + void SetDataLen(size_t len) + { + wxASSERT(len <= m_bufdata->m_size); + m_bufdata->m_len = len; + } + + // Ensure the buffer is big enough and return a pointer to it + void *GetWriteBuf(size_t sizeNeeded) + { + m_bufdata->ResizeIfNeeded(sizeNeeded); + return m_bufdata->m_data; + } + + // Update the length after the write + void UngetWriteBuf(size_t sizeUsed) { SetDataLen(sizeUsed); } + + // Like the above, but appends to the buffer + void *GetAppendBuf(size_t sizeNeeded) + { + m_bufdata->ResizeIfNeeded(m_bufdata->m_len + sizeNeeded); + return (char*)m_bufdata->m_data + m_bufdata->m_len; + } + + // Update the length after the append + void UngetAppendBuf(size_t sizeUsed) + { + SetDataLen(m_bufdata->m_len + sizeUsed); + } + + // Other ways to append to the buffer + void AppendByte(char data) + { + wxCHECK_RET( m_bufdata->m_data, _T("invalid wxMemoryBuffer") ); + + m_bufdata->ResizeIfNeeded(m_bufdata->m_len + 1); + *(((char*)m_bufdata->m_data) + m_bufdata->m_len) = data; + m_bufdata->m_len += 1; + } + + void AppendData(const void *data, size_t len) + { + memcpy(GetAppendBuf(len), data, len); + UngetAppendBuf(len); + } + + operator const char *() const { return (const char*)GetData(); } + +private: + wxMemoryBufferData* m_bufdata; +}; + +// ---------------------------------------------------------------------------- +// template class for any kind of data +// ---------------------------------------------------------------------------- + +// TODO + +#endif // _WX_BUFFER_H diff --git a/Externals/wxWidgets/include/wx/build.h b/Externals/wxWidgets/include/wx/build.h new file mode 100644 index 0000000000..f6f5b0e225 --- /dev/null +++ b/Externals/wxWidgets/include/wx/build.h @@ -0,0 +1,149 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/build.h +// Purpose: Runtime build options checking +// Author: Vadim Zeitlin, Vaclav Slavik +// Modified by: +// Created: 07.05.02 +// RCS-ID: $Id: build.h 35858 2005-10-09 15:48:42Z MBN $ +// Copyright: (c) 2002 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_BUILD_H_ +#define _WX_BUILD_H_ + +#include "wx/version.h" + +// NB: This file contains macros for checking binary compatibility of libraries +// in multilib buildm, plugins and user components. +// The WX_BUILD_OPTIONS_SIGNATURE macro expands into string that should +// uniquely identify binary compatible builds: i.e. if two builds of the +// library are binary compatible, their signature string should be the +// same; if two builds are binary incompatible, their signatures should +// be different. +// +// Therefore, wxUSE_XXX flags that affect binary compatibility (vtables, +// function signatures) should be accounted for here. So should compilers +// and compiler versions (but note that binary compatible compiler versions +// such as gcc-2.95.2 and gcc-2.95.3 should have same signature!). + +// ---------------------------------------------------------------------------- +// WX_BUILD_OPTIONS_SIGNATURE +// ---------------------------------------------------------------------------- + +#define __WX_BO_STRINGIZE(x) __WX_BO_STRINGIZE0(x) +#define __WX_BO_STRINGIZE0(x) #x + +#if (wxMINOR_VERSION % 2) == 0 + #define __WX_BO_VERSION(x,y,z) \ + __WX_BO_STRINGIZE(x) "." __WX_BO_STRINGIZE(y) +#else + #define __WX_BO_VERSION(x,y,z) \ + __WX_BO_STRINGIZE(x) "." __WX_BO_STRINGIZE(y) "." __WX_BO_STRINGIZE(z) +#endif + +#ifdef __WXDEBUG__ + #define __WX_BO_DEBUG "debug" +#else + #define __WX_BO_DEBUG "no debug" +#endif + +#if wxUSE_UNICODE + #define __WX_BO_UNICODE "Unicode" +#else + #define __WX_BO_UNICODE "ANSI" +#endif + +// GCC and Intel C++ share same C++ ABI (and possibly others in the future), +// check if compiler versions are compatible: +#if defined(__GXX_ABI_VERSION) + #define __WX_BO_COMPILER \ + ",compiler with C++ ABI " __WX_BO_STRINGIZE(__GXX_ABI_VERSION) +#elif defined(__INTEL_COMPILER) + #define __WX_BO_COMPILER ",Intel C++" +#elif defined(__GNUG__) + #define __WX_BO_COMPILER ",GCC " \ + __WX_BO_STRINGIZE(__GNUC__) "." __WX_BO_STRINGIZE(__GNUC_MINOR__) +#elif defined(__VISUALC__) + #define __WX_BO_COMPILER ",Visual C++" +#elif defined(__BORLANDC__) + #define __WX_BO_COMPILER ",Borland C++" +#elif defined(__DIGITALMARS__) + #define __WX_BO_COMPILER ",DigitalMars" +#elif defined(__WATCOMC__) + #define __WX_BO_COMPILER ",Watcom C++" +#else + #define __WX_BO_COMPILER +#endif + +// WXWIN_COMPATIBILITY macros affect presence of virtual functions +#if WXWIN_COMPATIBILITY_2_4 + #define __WX_BO_WXWIN_COMPAT_2_4 ",compatible with 2.4" +#else + #define __WX_BO_WXWIN_COMPAT_2_4 +#endif +#if WXWIN_COMPATIBILITY_2_6 + #define __WX_BO_WXWIN_COMPAT_2_6 ",compatible with 2.6" +#else + #define __WX_BO_WXWIN_COMPAT_2_6 +#endif + +// deriving wxWin containers from STL ones changes them completely: +#if wxUSE_STL + #define __WX_BO_STL ",STL containers" +#else + #define __WX_BO_STL ",wx containers" +#endif + +// This macro is passed as argument to wxConsoleApp::CheckBuildOptions() +#define WX_BUILD_OPTIONS_SIGNATURE \ + __WX_BO_VERSION(wxMAJOR_VERSION, wxMINOR_VERSION, wxRELEASE_NUMBER) \ + " (" __WX_BO_DEBUG "," __WX_BO_UNICODE \ + __WX_BO_COMPILER \ + __WX_BO_STL \ + __WX_BO_WXWIN_COMPAT_2_4 __WX_BO_WXWIN_COMPAT_2_6 \ + ")" + + +// ---------------------------------------------------------------------------- +// WX_CHECK_BUILD_OPTIONS +// ---------------------------------------------------------------------------- + +// Use this macro to check build options. Adding it to a file in DLL will +// ensure that the DLL checks build options in same way IMPLEMENT_APP() does. +#define WX_CHECK_BUILD_OPTIONS(libName) \ + static struct wxBuildOptionsChecker \ + { \ + wxBuildOptionsChecker() \ + { \ + wxAppConsole::CheckBuildOptions(WX_BUILD_OPTIONS_SIGNATURE, \ + libName); \ + } \ + } gs_buildOptionsCheck; + + +#if WXWIN_COMPATIBILITY_2_4 + +// ---------------------------------------------------------------------------- +// wxBuildOptions +// ---------------------------------------------------------------------------- + +// NB: Don't use this class in new code, it relies on the ctor being always +// inlined. WX_BUILD_OPTIONS_SIGNATURE always works. +class wxBuildOptions +{ +public: + // the ctor must be inline to get the compilation settings of the code + // which included this header + wxBuildOptions() : m_signature(WX_BUILD_OPTIONS_SIGNATURE) {} + +private: + const char *m_signature; + + // actually only CheckBuildOptions() should be our friend but well... + friend class wxAppConsole; +}; + +#endif // WXWIN_COMPATIBILITY_2_4 + +#endif // _WX_BUILD_H_ diff --git a/Externals/wxWidgets/include/wx/busyinfo.h b/Externals/wxWidgets/include/wx/busyinfo.h new file mode 100644 index 0000000000..d13d3b68c1 --- /dev/null +++ b/Externals/wxWidgets/include/wx/busyinfo.h @@ -0,0 +1,21 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/busyinfo.h +// Purpose: Information window (when app is busy) +// Author: Vaclav Slavik +// Copyright: (c) 1999 Vaclav Slavik +// RCS-ID: $Id: busyinfo.h 37158 2006-01-26 15:40:46Z ABX $ +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef __BUSYINFO_H_BASE__ +#define __BUSYINFO_H_BASE__ + +#include "wx/defs.h" + +#if wxUSE_BUSYINFO + +#include "wx/generic/busyinfo.h" + +#endif // wxUSE_BUSYINFO + +#endif // __BUSYINFO_H_BASE__ diff --git a/Externals/wxWidgets/include/wx/button.h b/Externals/wxWidgets/include/wx/button.h new file mode 100644 index 0000000000..4ca2305ae0 --- /dev/null +++ b/Externals/wxWidgets/include/wx/button.h @@ -0,0 +1,106 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/button.h +// Purpose: wxButtonBase class +// Author: Vadim Zetlin +// Modified by: +// Created: 15.08.00 +// RCS-ID: $Id: button.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) Vadim Zetlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_BUTTON_H_BASE_ +#define _WX_BUTTON_H_BASE_ + +#include "wx/defs.h" + +// ---------------------------------------------------------------------------- +// wxButton flags shared with other classes +// ---------------------------------------------------------------------------- + +#if wxUSE_TOGGLEBTN || wxUSE_BUTTON + +// These flags affect label alignment +#define wxBU_LEFT 0x0040 +#define wxBU_TOP 0x0080 +#define wxBU_RIGHT 0x0100 +#define wxBU_BOTTOM 0x0200 +#define wxBU_ALIGN_MASK ( wxBU_LEFT | wxBU_TOP | wxBU_RIGHT | wxBU_BOTTOM ) +#endif + +#if wxUSE_BUTTON + +// ---------------------------------------------------------------------------- +// wxButton specific flags +// ---------------------------------------------------------------------------- + +// These two flags are obsolete +#define wxBU_NOAUTODRAW 0x0000 +#define wxBU_AUTODRAW 0x0004 + +// by default, the buttons will be created with some (system dependent) +// minimal size to make them look nicer, giving this style will make them as +// small as possible +#define wxBU_EXACTFIT 0x0001 + +#include "wx/control.h" + +class WXDLLIMPEXP_FWD_CORE wxBitmap; + +extern WXDLLEXPORT_DATA(const wxChar) wxButtonNameStr[]; + +// ---------------------------------------------------------------------------- +// wxButton: a push button +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxButtonBase : public wxControl +{ +public: + wxButtonBase() { } + + // show the image in the button in addition to the label + virtual void SetImageLabel(const wxBitmap& WXUNUSED(bitmap)) { } + + // set the margins around the image + virtual void SetImageMargins(wxCoord WXUNUSED(x), wxCoord WXUNUSED(y)) { } + + // this wxButton method is called when the button becomes the default one + // on its panel + virtual void SetDefault() { } + + // Buttons on MSW can look bad if they are not native colours, because + // then they become owner-drawn and not theme-drawn. Disable it here + // in wxButtonBase to make it consistent. + virtual bool ShouldInheritColours() const { return false; } + + // returns the default button size for this platform + static wxSize GetDefaultSize(); + +protected: + DECLARE_NO_COPY_CLASS(wxButtonBase) +}; + +#if defined(__WXUNIVERSAL__) + #include "wx/univ/button.h" +#elif defined(__WXMSW__) + #include "wx/msw/button.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/button.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/button.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/button.h" +#elif defined(__WXMAC__) + #include "wx/mac/button.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/button.h" +#elif defined(__WXPM__) + #include "wx/os2/button.h" +#elif defined(__WXPALMOS__) + #include "wx/palmos/button.h" +#endif + +#endif // wxUSE_BUTTON + +#endif + // _WX_BUTTON_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/calctrl.h b/Externals/wxWidgets/include/wx/calctrl.h new file mode 100644 index 0000000000..3235c41c35 --- /dev/null +++ b/Externals/wxWidgets/include/wx/calctrl.h @@ -0,0 +1,232 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/calctrl.h +// Purpose: date-picker control +// Author: Vadim Zeitlin +// Modified by: +// Created: 29.12.99 +// RCS-ID: $Id: calctrl.h 35530 2005-09-17 20:56:29Z VZ $ +// Copyright: (c) 1999 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +/* + TODO + + 1. implement multiple selections for date ranges + 2. background bitmap for the calendar? + */ + +#ifndef _WX_CALCTRL_H_ +#define _WX_CALCTRL_H_ + +#include "wx/defs.h" + +#if wxUSE_CALENDARCTRL + +#include "wx/dateevt.h" +#include "wx/colour.h" +#include "wx/font.h" + +// ---------------------------------------------------------------------------- +// wxCalendarCtrl flags +// ---------------------------------------------------------------------------- + +enum +{ + // show Sunday as the first day of the week (default) + wxCAL_SUNDAY_FIRST = 0x0000, + + // show Monder as the first day of the week + wxCAL_MONDAY_FIRST = 0x0001, + + // highlight holidays + wxCAL_SHOW_HOLIDAYS = 0x0002, + + // disable the year change control, show only the month change one + wxCAL_NO_YEAR_CHANGE = 0x0004, + + // don't allow changing neither month nor year (implies + // wxCAL_NO_YEAR_CHANGE) + wxCAL_NO_MONTH_CHANGE = 0x000c, + + // use MS-style month-selection instead of combo-spin combination + wxCAL_SEQUENTIAL_MONTH_SELECTION = 0x0010, + + // show the neighbouring weeks in the previous and next month + wxCAL_SHOW_SURROUNDING_WEEKS = 0x0020 +}; + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// return values for the HitTest() method +enum wxCalendarHitTestResult +{ + wxCAL_HITTEST_NOWHERE, // outside of anything + wxCAL_HITTEST_HEADER, // on the header (weekdays) + wxCAL_HITTEST_DAY, // on a day in the calendar + wxCAL_HITTEST_INCMONTH, + wxCAL_HITTEST_DECMONTH, + wxCAL_HITTEST_SURROUNDING_WEEK +}; + +// border types for a date +enum wxCalendarDateBorder +{ + wxCAL_BORDER_NONE, // no border (default) + wxCAL_BORDER_SQUARE, // a rectangular border + wxCAL_BORDER_ROUND // a round border +}; + +// ---------------------------------------------------------------------------- +// wxCalendarDateAttr: custom attributes for a calendar date +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxCalendarDateAttr +{ +#if !defined(__VISAGECPP__) +protected: + // This has to be before the use of Init(), for MSVC++ 1.5 + // But dorks up Visualage! + void Init(wxCalendarDateBorder border = wxCAL_BORDER_NONE) + { + m_border = border; + m_holiday = false; + } +#endif +public: + // ctors + wxCalendarDateAttr() { Init(); } + wxCalendarDateAttr(const wxColour& colText, + const wxColour& colBack = wxNullColour, + const wxColour& colBorder = wxNullColour, + const wxFont& font = wxNullFont, + wxCalendarDateBorder border = wxCAL_BORDER_NONE) + : m_colText(colText), m_colBack(colBack), + m_colBorder(colBorder), m_font(font) + { + Init(border); + } + wxCalendarDateAttr(wxCalendarDateBorder border, + const wxColour& colBorder = wxNullColour) + : m_colBorder(colBorder) + { + Init(border); + } + + // setters + void SetTextColour(const wxColour& colText) { m_colText = colText; } + void SetBackgroundColour(const wxColour& colBack) { m_colBack = colBack; } + void SetBorderColour(const wxColour& col) { m_colBorder = col; } + void SetFont(const wxFont& font) { m_font = font; } + void SetBorder(wxCalendarDateBorder border) { m_border = border; } + void SetHoliday(bool holiday) { m_holiday = holiday; } + + // accessors + bool HasTextColour() const { return m_colText.Ok(); } + bool HasBackgroundColour() const { return m_colBack.Ok(); } + bool HasBorderColour() const { return m_colBorder.Ok(); } + bool HasFont() const { return m_font.Ok(); } + bool HasBorder() const { return m_border != wxCAL_BORDER_NONE; } + + bool IsHoliday() const { return m_holiday; } + + const wxColour& GetTextColour() const { return m_colText; } + const wxColour& GetBackgroundColour() const { return m_colBack; } + const wxColour& GetBorderColour() const { return m_colBorder; } + const wxFont& GetFont() const { return m_font; } + wxCalendarDateBorder GetBorder() const { return m_border; } +#if defined(__VISAGECPP__) +protected: + // This has to be here for VisualAge + void Init(wxCalendarDateBorder border = wxCAL_BORDER_NONE) + { + m_border = border; + m_holiday = false; + } +#endif +private: + wxColour m_colText, + m_colBack, + m_colBorder; + wxFont m_font; + wxCalendarDateBorder m_border; + bool m_holiday; +}; + +// ---------------------------------------------------------------------------- +// wxCalendarCtrl events +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxCalendarCtrl; + +class WXDLLIMPEXP_ADV wxCalendarEvent : public wxDateEvent +{ +friend class wxCalendarCtrl; +public: + wxCalendarEvent() { Init(); } + inline wxCalendarEvent(wxCalendarCtrl *cal, wxEventType type); + + void SetWeekDay(const wxDateTime::WeekDay wd) { m_wday = wd; } + wxDateTime::WeekDay GetWeekDay() const { return m_wday; } + +protected: + void Init() + { + m_wday = wxDateTime::Inv_WeekDay; + } + +private: + wxDateTime::WeekDay m_wday; + + DECLARE_DYNAMIC_CLASS_NO_COPY(wxCalendarEvent) +}; + +// ---------------------------------------------------------------------------- +// wxCalendarCtrl +// ---------------------------------------------------------------------------- + +// so far we only have a generic version, so keep it simple +#include "wx/generic/calctrl.h" + + +// now we can define the inline ctor using wxCalendarCtrl +inline +wxCalendarEvent::wxCalendarEvent(wxCalendarCtrl *cal, wxEventType type) + : wxDateEvent(cal, cal->GetDate(), type) +{ +} + +// ---------------------------------------------------------------------------- +// calendar event types and macros for handling them +// ---------------------------------------------------------------------------- + +BEGIN_DECLARE_EVENT_TYPES() + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_CALENDAR_SEL_CHANGED, 950) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_CALENDAR_DAY_CHANGED, 951) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_CALENDAR_MONTH_CHANGED, 952) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_CALENDAR_YEAR_CHANGED, 953) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_CALENDAR_DOUBLECLICKED, 954) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_CALENDAR_WEEKDAY_CLICKED, 955) +END_DECLARE_EVENT_TYPES() + +typedef void (wxEvtHandler::*wxCalendarEventFunction)(wxCalendarEvent&); + +#define wxCalendarEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxCalendarEventFunction, &func) + +#define wx__DECLARE_CALEVT(evt, id, fn) \ + wx__DECLARE_EVT1(wxEVT_CALENDAR_ ## evt, id, wxCalendarEventHandler(fn)) + +#define EVT_CALENDAR(id, fn) wx__DECLARE_CALEVT(DOUBLECLICKED, id, fn) +#define EVT_CALENDAR_SEL_CHANGED(id, fn) wx__DECLARE_CALEVT(SEL_CHANGED, id, fn) +#define EVT_CALENDAR_DAY(id, fn) wx__DECLARE_CALEVT(DAY_CHANGED, id, fn) +#define EVT_CALENDAR_MONTH(id, fn) wx__DECLARE_CALEVT(MONTH_CHANGED, id, fn) +#define EVT_CALENDAR_YEAR(id, fn) wx__DECLARE_CALEVT(YEAR_CHANGED, id, fn) +#define EVT_CALENDAR_WEEKDAY_CLICKED(id, fn) wx__DECLARE_CALEVT(WEEKDAY_CLICKED, id, fn) + +#endif // wxUSE_CALENDARCTRL + +#endif // _WX_CALCTRL_H_ + diff --git a/Externals/wxWidgets/include/wx/caret.h b/Externals/wxWidgets/include/wx/caret.h new file mode 100644 index 0000000000..848fdcf73e --- /dev/null +++ b/Externals/wxWidgets/include/wx/caret.h @@ -0,0 +1,252 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/caret.h +// Purpose: wxCaretBase class - the interface of wxCaret +// Author: Vadim Zeitlin +// Modified by: +// Created: 23.05.99 +// RCS-ID: $Id: caret.h 49804 2007-11-10 01:09:42Z VZ $ +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CARET_H_BASE_ +#define _WX_CARET_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_CARET + +// --------------------------------------------------------------------------- +// forward declarations +// --------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_CORE wxWindow; +class WXDLLIMPEXP_FWD_CORE wxWindowBase; + +// ---------------------------------------------------------------------------- +// headers we have to include +// ---------------------------------------------------------------------------- + +#include "wx/gdicmn.h" // for wxPoint, wxSize + +// ---------------------------------------------------------------------------- +// A caret is a blinking cursor showing the position where the typed text will +// appear. It can be either a solid block or a custom bitmap (TODO) +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxCaretBase +{ +public: + // ctors + // ----- + // default - use Create + wxCaretBase() { Init(); } + // create the caret of given (in pixels) width and height and associate + // with the given window + wxCaretBase(wxWindowBase *window, int width, int height) + { + Init(); + + (void)Create(window, width, height); + } + // same as above + wxCaretBase(wxWindowBase *window, const wxSize& size) + { + Init(); + + (void)Create(window, size); + } + + // a virtual dtor has been provided since this class has virtual members + virtual ~wxCaretBase() { } + + // Create() functions - same as ctor but returns the success code + // -------------------------------------------------------------- + + // same as ctor + bool Create(wxWindowBase *window, int width, int height) + { return DoCreate(window, width, height); } + // same as ctor + bool Create(wxWindowBase *window, const wxSize& size) + { return DoCreate(window, size.x, size.y); } + + // accessors + // --------- + + // is the caret valid? + bool IsOk() const { return m_width != 0 && m_height != 0; } + + // is the caret currently shown? + bool IsVisible() const { return m_countVisible > 0; } + + // get the caret position + void GetPosition(int *x, int *y) const + { + if ( x ) *x = m_x; + if ( y ) *y = m_y; + } + wxPoint GetPosition() const { return wxPoint(m_x, m_y); } + + // get the caret size + void GetSize(int *width, int *height) const + { + if ( width ) *width = m_width; + if ( height ) *height = m_height; + } + wxSize GetSize() const { return wxSize(m_width, m_height); } + + // get the window we're associated with + wxWindow *GetWindow() const { return (wxWindow *)m_window; } + + // change the size of the caret + void SetSize(int width, int height) { + m_width = width; + m_height = height; + DoSize(); + } + void SetSize(const wxSize& size) { SetSize(size.x, size.y); } + + + // operations + // ---------- + + // move the caret to given position (in logical coords) + void Move(int x, int y) { m_x = x; m_y = y; DoMove(); } + void Move(const wxPoint& pt) { m_x = pt.x; m_y = pt.y; DoMove(); } + + // show/hide the caret (should be called by wxWindow when needed): + // Show() must be called as many times as Hide() + 1 to make the caret + // visible + virtual void Show(bool show = true) + { + if ( show ) + { + if ( m_countVisible++ == 0 ) + DoShow(); + } + else + { + if ( --m_countVisible == 0 ) + DoHide(); + } + } + virtual void Hide() { Show(false); } + + // blink time is measured in milliseconds and is the time elapsed + // between 2 inversions of the caret (blink time of the caret is common + // to all carets in the Universe, so these functions are static) + static int GetBlinkTime(); + static void SetBlinkTime(int milliseconds); + + // implementation from now on + // -------------------------- + + // these functions should be called by wxWindow when the window gets/loses + // the focus - we create/show and hide/destroy the caret here + virtual void OnSetFocus() { } + virtual void OnKillFocus() { } + +protected: + // these functions may be overriden in the derived classes, but they + // should call the base class version first + virtual bool DoCreate(wxWindowBase *window, int width, int height) + { + m_window = window; + m_width = width; + m_height = height; + + return true; + } + + // pure virtuals to implement in the derived class + virtual void DoShow() = 0; + virtual void DoHide() = 0; + virtual void DoMove() = 0; + virtual void DoSize() { } + + // the common initialization + void Init() + { + m_window = (wxWindowBase *)NULL; + m_x = m_y = 0; + m_width = m_height = 0; + m_countVisible = 0; + } + + // the size of the caret + int m_width, m_height; + + // the position of the caret + int m_x, m_y; + + // the window we're associated with + wxWindowBase *m_window; + + // visibility count: the caret is visible only if it's positive + int m_countVisible; + +private: + DECLARE_NO_COPY_CLASS(wxCaretBase) +}; + +// --------------------------------------------------------------------------- +// now include the real thing +// --------------------------------------------------------------------------- + +#if defined(__WXMSW__) + #include "wx/msw/caret.h" +#else + #include "wx/generic/caret.h" +#endif // platform + +// ---------------------------------------------------------------------------- +// wxCaretSuspend: a simple class which hides the caret in its ctor and +// restores it in the dtor, this should be used when drawing on the screen to +// avoid overdrawing the caret +// ---------------------------------------------------------------------------- + +#ifdef wxHAS_CARET_USING_OVERLAYS + +// we don't need to hide the caret if it's rendered using overlays +class WXDLLEXPORT wxCaretSuspend +{ +public: + wxCaretSuspend(wxWindow *WXUNUSED(win)) {} + + DECLARE_NO_COPY_CLASS(wxCaretSuspend) +}; + +#else // !wxHAS_CARET_USING_OVERLAYS + +class WXDLLEXPORT wxCaretSuspend +{ +public: + wxCaretSuspend(wxWindow *win) + { + m_caret = win->GetCaret(); + m_show = false; + if ( m_caret && m_caret->IsVisible() ) + { + m_caret->Hide(); + m_show = true; + } + } + + ~wxCaretSuspend() + { + if ( m_caret && m_show ) + m_caret->Show(); + } + +private: + wxCaret *m_caret; + bool m_show; + + DECLARE_NO_COPY_CLASS(wxCaretSuspend) +}; + +#endif // wxHAS_CARET_USING_OVERLAYS/!wxHAS_CARET_USING_OVERLAYS + +#endif // wxUSE_CARET + +#endif // _WX_CARET_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/checkbox.h b/Externals/wxWidgets/include/wx/checkbox.h new file mode 100644 index 0000000000..4760475ab9 --- /dev/null +++ b/Externals/wxWidgets/include/wx/checkbox.h @@ -0,0 +1,156 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/checkbox.h +// Purpose: wxCheckBox class interface +// Author: Vadim Zeitlin +// Modified by: +// Created: 07.09.00 +// RCS-ID: $Id: checkbox.h 39901 2006-06-30 10:51:44Z VS $ +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CHECKBOX_H_BASE_ +#define _WX_CHECKBOX_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_CHECKBOX + +#include "wx/control.h" + + +/* + * wxCheckBox style flags + * (Using wxCHK_* because wxCB_* is used by wxComboBox). + * Determine whether to use a 3-state or 2-state + * checkbox. 3-state enables to differentiate + * between 'unchecked', 'checked' and 'undetermined'. + */ +#define wxCHK_2STATE 0x0000 +#define wxCHK_3STATE 0x1000 + +/* + * If this style is set the user can set the checkbox to the + * undetermined state. If not set the undetermined set can only + * be set programmatically. + * This style can only be used with 3 state checkboxes. + */ +#define wxCHK_ALLOW_3RD_STATE_FOR_USER 0x2000 + +/* + * The possible states of a 3-state checkbox (Compatible + * with the 2-state checkbox). + */ +enum wxCheckBoxState +{ + wxCHK_UNCHECKED, + wxCHK_CHECKED, + wxCHK_UNDETERMINED /* 3-state checkbox only */ +}; + + +extern WXDLLEXPORT_DATA(const wxChar) wxCheckBoxNameStr[]; + +// ---------------------------------------------------------------------------- +// wxCheckBox: a control which shows a label and a box which may be checked +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxCheckBoxBase : public wxControl +{ +public: + wxCheckBoxBase() { } + + // set/get the checked status of the listbox + virtual void SetValue(bool value) = 0; + virtual bool GetValue() const = 0; + + bool IsChecked() const + { + wxASSERT_MSG( !Is3State(), wxT("Calling IsChecked() doesn't make sense for") + wxT(" a three state checkbox, Use Get3StateValue() instead") ); + + return GetValue(); + } + + wxCheckBoxState Get3StateValue() const + { + wxCheckBoxState state = DoGet3StateValue(); + + if ( state == wxCHK_UNDETERMINED && !Is3State() ) + { + // Undetermined state with a 2-state checkbox?? + wxFAIL_MSG( wxT("DoGet3StateValue() says the 2-state checkbox is ") + wxT("in an undetermined/third state") ); + + state = wxCHK_UNCHECKED; + } + + return state; + } + + void Set3StateValue(wxCheckBoxState state) + { + if ( state == wxCHK_UNDETERMINED && !Is3State() ) + { + wxFAIL_MSG(wxT("Setting a 2-state checkbox to undetermined state")); + state = wxCHK_UNCHECKED; + } + + DoSet3StateValue(state); + } + + bool Is3State() const { return HasFlag(wxCHK_3STATE); } + + bool Is3rdStateAllowedForUser() const + { + return HasFlag(wxCHK_ALLOW_3RD_STATE_FOR_USER); + } + + virtual bool HasTransparentBackground() { return true; } + + // wxCheckBox-specific processing after processing the update event + virtual void DoUpdateWindowUI(wxUpdateUIEvent& event) + { + wxControl::DoUpdateWindowUI(event); + + if ( event.GetSetChecked() ) + SetValue(event.GetChecked()); + } + +protected: + virtual void DoSet3StateValue(wxCheckBoxState WXUNUSED(state)) { wxFAIL; } + + virtual wxCheckBoxState DoGet3StateValue() const + { + wxFAIL; + return wxCHK_UNCHECKED; + } + +private: + DECLARE_NO_COPY_CLASS(wxCheckBoxBase) +}; + +#if defined(__WXUNIVERSAL__) + #include "wx/univ/checkbox.h" +#elif defined(__WXMSW__) + #include "wx/msw/checkbox.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/checkbox.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/checkbox.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/checkbox.h" +#elif defined(__WXMAC__) + #include "wx/mac/checkbox.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/checkbox.h" +#elif defined(__WXPM__) + #include "wx/os2/checkbox.h" +#elif defined(__WXPALMOS__) + #include "wx/palmos/checkbox.h" +#endif + +#endif // wxUSE_CHECKBOX + +#endif + // _WX_CHECKBOX_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/checklst.h b/Externals/wxWidgets/include/wx/checklst.h new file mode 100644 index 0000000000..c8857fd086 --- /dev/null +++ b/Externals/wxWidgets/include/wx/checklst.h @@ -0,0 +1,64 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/checklst.h +// Purpose: wxCheckListBox class interface +// Author: Vadim Zeitlin +// Modified by: +// Created: 12.09.00 +// RCS-ID: $Id: checklst.h 38319 2006-03-23 22:05:23Z VZ $ +// Copyright: (c) Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CHECKLST_H_BASE_ +#define _WX_CHECKLST_H_BASE_ + +#if wxUSE_CHECKLISTBOX + +#include "wx/listbox.h" + +// ---------------------------------------------------------------------------- +// wxCheckListBox: a listbox whose items may be checked +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxCheckListBoxBase : public + #ifdef __WXWINCE__ + // keep virtuals synchronised + wxListBoxBase + #else + wxListBox + #endif +{ +public: + wxCheckListBoxBase() { } + + // check list box specific methods + virtual bool IsChecked(unsigned int item) const = 0; + virtual void Check(unsigned int item, bool check = true) = 0; + + DECLARE_NO_COPY_CLASS(wxCheckListBoxBase) +}; + +#if defined(__WXUNIVERSAL__) + #include "wx/univ/checklst.h" +#elif defined(__WXWINCE__) + #include "wx/msw/wince/checklst.h" +#elif defined(__WXMSW__) + #include "wx/msw/checklst.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/checklst.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/checklst.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/checklst.h" +#elif defined(__WXMAC__) + #include "wx/mac/checklst.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/checklst.h" +#elif defined(__WXPM__) + #include "wx/os2/checklst.h" +#endif + +#endif // wxUSE_CHECKLISTBOX + +#endif + // _WX_CHECKLST_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/chkconf.h b/Externals/wxWidgets/include/wx/chkconf.h new file mode 100644 index 0000000000..811e0c3041 --- /dev/null +++ b/Externals/wxWidgets/include/wx/chkconf.h @@ -0,0 +1,1871 @@ +/* + * Name: wx/chkconf.h + * Purpose: check the config settings for consistency + * Author: Vadim Zeitlin + * Modified by: + * Created: 09.08.00 + * RCS-ID: $Id: chkconf.h 48113 2007-08-15 17:43:50Z DE $ + * Copyright: (c) 2000 Vadim Zeitlin + * Licence: wxWindows licence + */ + +/* THIS IS A C FILE, DON'T USE C++ FEATURES (IN PARTICULAR COMMENTS) IN IT */ + +/* + Platform-specific checking. + */ + +#if defined(__WXPALMOS__) +# include "wx/palmos/chkconf.h" +#elif defined(__WXWINCE__) +# include "wx/msw/wince/chkconf.h" +#elif defined(__WXMSW__) +# include "wx/msw/chkconf.h" +#elif defined(__WXMAC__) +# include "wx/mac/chkconf.h" +#elif defined(__OS2__) +# include "wx/os2/chkconf.h" +#elif defined(__WXMGL__) +# include "wx/mgl/chkconf.h" +#elif defined(__WXDFB__) +# include "wx/dfb/chkconf.h" +#elif defined(__WXMOTIF__) +# include "wx/motif/chkconf.h" +#elif defined(__WXX11__) +# include "wx/x11/chkconf.h" +#endif + +#ifdef __WXUNIVERSAL__ +# include "wx/univ/chkconf.h" +#endif + +/* + this global setting determines what should we do if the setting FOO + requires BAR and BAR is not set: we can either silently unset FOO as well + (do this if you're trying to build the smallest possible library) or give an + error and abort (default as leads to least surprizing behaviour) + */ +#define wxABORT_ON_CONFIG_ERROR + +/* + global features + */ + +/* GUI build by default */ +#if !defined(wxUSE_GUI) +# define wxUSE_GUI 1 +#endif /* !defined(wxUSE_GUI) */ + +/* Turn off wxUSE_ABI_INCOMPATIBLE_FEATURES if not specified. */ +#if !defined(wxUSE_ABI_INCOMPATIBLE_FEATURES) +# define wxUSE_ABI_INCOMPATIBLE_FEATURES 0 +#endif /* !defined(wxUSE_ABI_INCOMPATIBLE_FEATURES) */ + +/* + If we're compiling without support for threads/exceptions we have to + disable the corresponding features. + */ +#ifdef wxNO_THREADS +# undef wxUSE_THREADS +# define wxUSE_THREADS 0 +#endif /* wxNO_THREADS */ + +#ifdef wxNO_EXCEPTIONS +# undef wxUSE_EXCEPTIONS +# define wxUSE_EXCEPTIONS 0 +#endif /* wxNO_EXCEPTIONS */ + +/* we also must disable exceptions if compiler doesn't support them */ +#if defined(_MSC_VER) && !defined(_CPPUNWIND) +# undef wxUSE_EXCEPTIONS +# define wxUSE_EXCEPTIONS 0 +#endif /* VC++ without exceptions support */ + + +/* + tests for non GUI features + + please keep the options in alphabetical order! + */ + +#ifndef wxUSE_CRASHREPORT + /* this one is special: as currently it is Windows-only, don't force it + to be defined on other platforms */ +# if defined(wxABORT_ON_CONFIG_ERROR) && defined(__WXMSW__) +# error "wxUSE_CRASHREPORT must be defined." +# else +# define wxUSE_CRASHREPORT 0 +# endif +#endif /* !defined(wxUSE_CRASHREPORT) */ + +#ifndef wxUSE_DYNLIB_CLASS +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_DYNLIB_CLASS must be defined." +# else +# define wxUSE_DYNLIB_CLASS 0 +# endif +#endif /* !defined(wxUSE_DYNLIB_CLASS) */ + +#ifndef wxUSE_EXCEPTIONS +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_EXCEPTIONS must be defined." +# else +# define wxUSE_EXCEPTIONS 0 +# endif +#endif /* !defined(wxUSE_EXCEPTIONS) */ + +#ifndef wxUSE_FILESYSTEM +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_FILESYSTEM must be defined." +# else +# define wxUSE_FILESYSTEM 0 +# endif +#endif /* !defined(wxUSE_FILESYSTEM) */ + +#ifndef wxUSE_FS_ARCHIVE +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_FS_ARCHIVE must be defined." +# else +# define wxUSE_FS_ARCHIVE 0 +# endif +#endif /* !defined(wxUSE_FS_ARCHIVE) */ + +/* don't give an error about this one yet, it's not fully implemented */ +#ifndef wxUSE_FSVOLUME +# define wxUSE_FSVOLUME 0 +#endif /* !defined(wxUSE_FSVOLUME) */ + +#ifndef wxUSE_DYNAMIC_LOADER +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_DYNAMIC_LOADER must be defined." +# else +# define wxUSE_DYNAMIC_LOADER 0 +# endif +#endif /* !defined(wxUSE_DYNAMIC_LOADER) */ + +#ifndef wxUSE_LOG +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_LOG must be defined." +# else +# define wxUSE_LOG 0 +# endif +#endif /* !defined(wxUSE_LOG) */ + +#ifndef wxUSE_LONGLONG +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_LONGLONG must be defined." +# else +# define wxUSE_LONGLONG 0 +# endif +#endif /* !defined(wxUSE_LONGLONG) */ + +#ifndef wxUSE_MIMETYPE +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_MIMETYPE must be defined." +# else +# define wxUSE_MIMETYPE 0 +# endif +#endif /* !defined(wxUSE_MIMETYPE) */ + +#ifndef wxUSE_ON_FATAL_EXCEPTION +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_ON_FATAL_EXCEPTION must be defined." +# else +# define wxUSE_ON_FATAL_EXCEPTION 0 +# endif +#endif /* !defined(wxUSE_ON_FATAL_EXCEPTION) */ + +#ifndef wxUSE_PRINTF_POS_PARAMS +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_PRINTF_POS_PARAMS must be defined." +# else +# define wxUSE_PRINTF_POS_PARAMS 0 +# endif +#endif /* !defined(wxUSE_PRINTF_POS_PARAMS) */ + +#ifndef wxUSE_PROTOCOL +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_PROTOCOL must be defined." +# else +# define wxUSE_PROTOCOL 0 +# endif +#endif /* !defined(wxUSE_PROTOCOL) */ + +/* we may not define wxUSE_PROTOCOL_XXX if wxUSE_PROTOCOL is set to 0 */ +#if !wxUSE_PROTOCOL +# undef wxUSE_PROTOCOL_HTTP +# undef wxUSE_PROTOCOL_FTP +# undef wxUSE_PROTOCOL_FILE +# define wxUSE_PROTOCOL_HTTP 0 +# define wxUSE_PROTOCOL_FTP 0 +# define wxUSE_PROTOCOL_FILE 0 +#endif /* wxUSE_PROTOCOL */ + +#ifndef wxUSE_PROTOCOL_HTTP +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_PROTOCOL_HTTP must be defined." +# else +# define wxUSE_PROTOCOL_HTTP 0 +# endif +#endif /* !defined(wxUSE_PROTOCOL_HTTP) */ + +#ifndef wxUSE_PROTOCOL_FTP +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_PROTOCOL_FTP must be defined." +# else +# define wxUSE_PROTOCOL_FTP 0 +# endif +#endif /* !defined(wxUSE_PROTOCOL_FTP) */ + +#ifndef wxUSE_PROTOCOL_FILE +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_PROTOCOL_FILE must be defined." +# else +# define wxUSE_PROTOCOL_FILE 0 +# endif +#endif /* !defined(wxUSE_PROTOCOL_FILE) */ + +#ifndef wxUSE_REGEX +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_REGEX must be defined." +# else +# define wxUSE_REGEX 0 +# endif +#endif /* !defined(wxUSE_REGEX) */ + +#ifndef wxUSE_STDPATHS +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_STDPATHS must be defined." +# else +# define wxUSE_STDPATHS 1 +# endif +#endif /* !defined(wxUSE_STDPATHS) */ + +#ifndef wxUSE_XML +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_XML must be defined." +# else +# define wxUSE_XML 0 +# endif +#endif /* !defined(wxUSE_XML) */ + +#ifndef wxUSE_SOCKETS +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_SOCKETS must be defined." +# else +# define wxUSE_SOCKETS 0 +# endif +#endif /* !defined(wxUSE_SOCKETS) */ + +#ifndef wxUSE_STREAMS +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_STREAMS must be defined." +# else +# define wxUSE_STREAMS 0 +# endif +#endif /* !defined(wxUSE_STREAMS) */ + +#ifndef wxUSE_STOPWATCH +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_STOPWATCH must be defined." +# else +# define wxUSE_STOPWATCH 0 +# endif +#endif /* !defined(wxUSE_STOPWATCH) */ + +#ifndef wxUSE_TEXTBUFFER +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_TEXTBUFFER must be defined." +# else +# define wxUSE_TEXTBUFFER 0 +# endif +#endif /* !defined(wxUSE_TEXTBUFFER) */ + +#ifndef wxUSE_TEXTFILE +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_TEXTFILE must be defined." +# else +# define wxUSE_TEXTFILE 0 +# endif +#endif /* !defined(wxUSE_TEXTFILE) */ + +#ifndef wxUSE_UNICODE +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_UNICODE must be defined." +# else +# define wxUSE_UNICODE 0 +# endif +#endif /* !defined(wxUSE_UNICODE) */ + +#ifndef wxUSE_URL +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_URL must be defined." +# else +# define wxUSE_URL 0 +# endif +#endif /* !defined(wxUSE_URL) */ + +#ifndef wxUSE_VARIANT +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_VARIANT must be defined." +# else +# define wxUSE_VARIANT 0 +# endif +#endif /* wxUSE_VARIANT */ + +/* + all these tests are for GUI only + + please keep the options in alphabetical order! + */ +#if wxUSE_GUI + +/* + all of the settings tested below must be defined or we'd get an error from + preprocessor about invalid integer expression + */ + +#ifndef wxUSE_ABOUTDLG +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_ABOUTDLG must be defined." +# else +# define wxUSE_ABOUTDLG 0 +# endif +#endif /* !defined(wxUSE_ABOUTDLG) */ + +#ifndef wxUSE_ACCEL +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_ACCEL must be defined." +# else +# define wxUSE_ACCEL 0 +# endif +#endif /* !defined(wxUSE_ACCEL) */ + +#ifndef wxUSE_ANIMATIONCTRL +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_ANIMATIONCTRL must be defined." +# else +# define wxUSE_ANIMATIONCTRL 0 +# endif +#endif /* !defined(wxUSE_ANIMATIONCTRL) */ + +#ifndef wxUSE_BITMAPCOMBOBOX +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_BITMAPCOMBOBOX must be defined." +# else +# define wxUSE_BITMAPCOMBOBOX 0 +# endif +#endif /* !defined(wxUSE_BITMAPCOMBOBOX) */ + +#ifndef wxUSE_BMPBUTTON +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_BMPBUTTON must be defined." +# else +# define wxUSE_BMPBUTTON 0 +# endif +#endif /* !defined(wxUSE_BMPBUTTON) */ + +#ifndef wxUSE_BUTTON +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_BUTTON must be defined." +# else +# define wxUSE_BUTTON 0 +# endif +#endif /* !defined(wxUSE_BUTTON) */ + +#ifndef wxUSE_CALENDARCTRL +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_CALENDARCTRL must be defined." +# else +# define wxUSE_CALENDARCTRL 0 +# endif +#endif /* !defined(wxUSE_CALENDARCTRL) */ + +#ifndef wxUSE_CARET +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_CARET must be defined." +# else +# define wxUSE_CARET 0 +# endif +#endif /* !defined(wxUSE_CARET) */ + +#ifndef wxUSE_CHECKBOX +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_CHECKBOX must be defined." +# else +# define wxUSE_CHECKBOX 0 +# endif +#endif /* !defined(wxUSE_CHECKBOX) */ + +#ifndef wxUSE_CHECKLISTBOX +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_CHECKLISTBOX must be defined." +# else +# define wxUSE_CHECKLISTBOX 0 +# endif +#endif /* !defined(wxUSE_CHECKLISTBOX) */ + +#ifndef wxUSE_CHOICE +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_CHOICE must be defined." +# else +# define wxUSE_CHOICE 0 +# endif +#endif /* !defined(wxUSE_CHOICE) */ + +#ifndef wxUSE_CHOICEBOOK +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_CHOICEBOOK must be defined." +# else +# define wxUSE_CHOICEBOOK 0 +# endif +#endif /* !defined(wxUSE_CHOICEBOOK) */ + +#ifndef wxUSE_CHOICEDLG +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_CHOICEDLG must be defined." +# else +# define wxUSE_CHOICEDLG 0 +# endif +#endif /* !defined(wxUSE_CHOICEDLG) */ + +#ifndef wxUSE_CLIPBOARD +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_CLIPBOARD must be defined." +# else +# define wxUSE_CLIPBOARD 0 +# endif +#endif /* !defined(wxUSE_CLIPBOARD) */ + +#ifndef wxUSE_COLLPANE +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_COLLPANE must be defined." +# else +# define wxUSE_COLLPANE 0 +# endif +#endif /* !defined(wxUSE_COLLPANE) */ + +#ifndef wxUSE_COLOURDLG +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_COLOURDLG must be defined." +# else +# define wxUSE_COLOURDLG 0 +# endif +#endif /* !defined(wxUSE_COLOURDLG) */ + +#ifndef wxUSE_COLOURPICKERCTRL +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_COLOURPICKERCTRL must be defined." +# else +# define wxUSE_COLOURPICKERCTRL 0 +# endif +#endif /* !defined(wxUSE_COLOURPICKERCTRL) */ + +#ifndef wxUSE_COMBOBOX +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_COMBOBOX must be defined." +# else +# define wxUSE_COMBOBOX 0 +# endif +#endif /* !defined(wxUSE_COMBOBOX) */ + +#ifndef wxUSE_COMBOCTRL +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_COMBOCTRL must be defined." +# else +# define wxUSE_COMBOCTRL 0 +# endif +#endif /* !defined(wxUSE_COMBOCTRL) */ + +#ifndef wxUSE_DATAOBJ +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_DATAOBJ must be defined." +# else +# define wxUSE_DATAOBJ 0 +# endif +#endif /* !defined(wxUSE_DATAOBJ) */ + +#ifndef wxUSE_DATAVIEWCTRL +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_DATAVIEWCTRL must be defined." +# else +# define wxUSE_DATAVIEWCTRL 0 +# endif +#endif /* !defined(wxUSE_DATAVIEWCTRL) */ + +#ifndef wxUSE_DATEPICKCTRL +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_DATEPICKCTRL must be defined." +# else +# define wxUSE_DATEPICKCTRL 0 +# endif +#endif /* !defined(wxUSE_DATEPICKCTRL) */ + +#ifndef wxUSE_DIRPICKERCTRL +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_DIRPICKERCTRL must be defined." +# else +# define wxUSE_DIRPICKERCTRL 0 +# endif +#endif /* !defined(wxUSE_DIRPICKERCTRL) */ + +#ifndef wxUSE_DISPLAY +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_DISPLAY must be defined." +# else +# define wxUSE_DISPLAY 0 +# endif +#endif /* !defined(wxUSE_DISPLAY) */ + +#ifndef wxUSE_DOC_VIEW_ARCHITECTURE +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_DOC_VIEW_ARCHITECTURE must be defined." +# else +# define wxUSE_DOC_VIEW_ARCHITECTURE 0 +# endif +#endif /* !defined(wxUSE_DOC_VIEW_ARCHITECTURE) */ + +#ifndef wxUSE_FILEDLG +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_FILEDLG must be defined." +# else +# define wxUSE_FILEDLG 0 +# endif +#endif /* !defined(wxUSE_FILEDLG) */ + +#ifndef wxUSE_FILEPICKERCTRL +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_FILEPICKERCTRL must be defined." +# else +# define wxUSE_FILEPICKERCTRL 0 +# endif +#endif /* !defined(wxUSE_FILEPICKERCTRL) */ + +#ifndef wxUSE_FONTDLG +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_FONTDLG must be defined." +# else +# define wxUSE_FONTDLG 0 +# endif +#endif /* !defined(wxUSE_FONTDLG) */ + +#ifndef wxUSE_FONTMAP +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_FONTMAP must be defined." +# else +# define wxUSE_FONTMAP 0 +# endif +#endif /* !defined(wxUSE_FONTMAP) */ + +#ifndef wxUSE_FONTPICKERCTRL +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_FONTPICKERCTRL must be defined." +# else +# define wxUSE_FONTPICKERCTRL 0 +# endif +#endif /* !defined(wxUSE_FONTPICKERCTRL) */ + +#ifndef wxUSE_GAUGE +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_GAUGE must be defined." +# else +# define wxUSE_GAUGE 0 +# endif +#endif /* !defined(wxUSE_GAUGE) */ + +#ifndef wxUSE_GRAPHICS_CONTEXT +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_GRAPHICS_CONTEXT must be defined." +# else +# define wxUSE_GRAPHICS_CONTEXT 0 +# endif +#endif /* !defined(wxUSE_GRAPHICS_CONTEXT) */ + + +#ifndef wxUSE_GRID +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_GRID must be defined." +# else +# define wxUSE_GRID 0 +# endif +#endif /* !defined(wxUSE_GRID) */ + +#ifndef wxUSE_HELP +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_HELP must be defined." +# else +# define wxUSE_HELP 0 +# endif +#endif /* !defined(wxUSE_HELP) */ + +#ifndef wxUSE_HYPERLINKCTRL +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_HYPERLINKCTRL must be defined." +# else +# define wxUSE_HYPERLINKCTRL 0 +# endif +#endif /* !defined(wxUSE_HYPERLINKCTRL) */ + +#ifndef wxUSE_HTML +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_HTML must be defined." +# else +# define wxUSE_HTML 0 +# endif +#endif /* !defined(wxUSE_HTML) */ + +#ifndef wxUSE_LIBMSPACK +# ifndef __UNIX__ + /* set to 0 on platforms that don't have libmspack */ +# define wxUSE_LIBMSPACK 0 +# else +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_LIBMSPACK must be defined." +# else +# define wxUSE_LIBMSPACK 0 +# endif +# endif +#endif /* !defined(wxUSE_LIBMSPACK) */ + +#ifndef wxUSE_ICO_CUR +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_ICO_CUR must be defined." +# else +# define wxUSE_ICO_CUR 0 +# endif +#endif /* !defined(wxUSE_ICO_CUR) */ + +#ifndef wxUSE_IFF +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_IFF must be defined." +# else +# define wxUSE_IFF 0 +# endif +#endif /* !defined(wxUSE_IFF) */ + +#ifndef wxUSE_IMAGLIST +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_IMAGLIST must be defined." +# else +# define wxUSE_IMAGLIST 0 +# endif +#endif /* !defined(wxUSE_IMAGLIST) */ + +#ifndef wxUSE_JOYSTICK +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_JOYSTICK must be defined." +# else +# define wxUSE_JOYSTICK 0 +# endif +#endif /* !defined(wxUSE_JOYSTICK) */ + +#ifndef wxUSE_LISTBOOK +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_LISTBOOK must be defined." +# else +# define wxUSE_LISTBOOK 0 +# endif +#endif /* !defined(wxUSE_LISTBOOK) */ + +#ifndef wxUSE_LISTBOX +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_LISTBOX must be defined." +# else +# define wxUSE_LISTBOX 0 +# endif +#endif /* !defined(wxUSE_LISTBOX) */ + +#ifndef wxUSE_LISTCTRL +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_LISTCTRL must be defined." +# else +# define wxUSE_LISTCTRL 0 +# endif +#endif /* !defined(wxUSE_LISTCTRL) */ + +#ifndef wxUSE_LOGGUI +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_LOGGUI must be defined." +# else +# define wxUSE_LOGGUI 0 +# endif +#endif /* !defined(wxUSE_LOGGUI) */ + +#ifndef wxUSE_LOGWINDOW +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_LOGWINDOW must be defined." +# else +# define wxUSE_LOGWINDOW 0 +# endif +#endif /* !defined(wxUSE_LOGWINDOW) */ + +#ifndef wxUSE_LOG_DIALOG +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_LOG_DIALOG must be defined." +# else +# define wxUSE_LOG_DIALOG 0 +# endif +#endif /* !defined(wxUSE_LOG_DIALOG) */ + +#ifndef wxUSE_MDI +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_MDI must be defined." +# else +# define wxUSE_MDI 0 +# endif +#endif /* !defined(wxUSE_MDI) */ + +#ifndef wxUSE_MDI_ARCHITECTURE +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_MDI_ARCHITECTURE must be defined." +# else +# define wxUSE_MDI_ARCHITECTURE 0 +# endif +#endif /* !defined(wxUSE_MDI_ARCHITECTURE) */ + +#ifndef wxUSE_MENUS +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_MENUS must be defined." +# else +# define wxUSE_MENUS 0 +# endif +#endif /* !defined(wxUSE_MENUS) */ + +#ifndef wxUSE_MSGDLG +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_MSGDLG must be defined." +# else +# define wxUSE_MSGDLG 0 +# endif +#endif /* !defined(wxUSE_MSGDLG) */ + +#ifndef wxUSE_NOTEBOOK +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_NOTEBOOK must be defined." +# else +# define wxUSE_NOTEBOOK 0 +# endif +#endif /* !defined(wxUSE_NOTEBOOK) */ + +#ifndef wxUSE_ODCOMBOBOX +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_ODCOMBOBOX must be defined." +# else +# define wxUSE_ODCOMBOBOX 0 +# endif +#endif /* !defined(wxUSE_ODCOMBOBOX) */ + +#ifndef wxUSE_PALETTE +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_PALETTE must be defined." +# else +# define wxUSE_PALETTE 0 +# endif +#endif /* !defined(wxUSE_PALETTE) */ + +#ifndef wxUSE_POPUPWIN +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_POPUPWIN must be defined." +# else +# define wxUSE_POPUPWIN 0 +# endif +#endif /* !defined(wxUSE_POPUPWIN) */ + +#ifndef wxUSE_PRINTING_ARCHITECTURE +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_PRINTING_ARCHITECTURE must be defined." +# else +# define wxUSE_PRINTING_ARCHITECTURE 0 +# endif +#endif /* !defined(wxUSE_PRINTING_ARCHITECTURE) */ + +#ifndef wxUSE_RADIOBOX +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_RADIOBOX must be defined." +# else +# define wxUSE_RADIOBOX 0 +# endif +#endif /* !defined(wxUSE_RADIOBOX) */ + +#ifndef wxUSE_RADIOBTN +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_RADIOBTN must be defined." +# else +# define wxUSE_RADIOBTN 0 +# endif +#endif /* !defined(wxUSE_RADIOBTN) */ + +#ifndef wxUSE_SASH +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_SASH must be defined." +# else +# define wxUSE_SASH 0 +# endif +#endif /* !defined(wxUSE_SASH) */ + +#ifndef wxUSE_SCROLLBAR +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_SCROLLBAR must be defined." +# else +# define wxUSE_SCROLLBAR 0 +# endif +#endif /* !defined(wxUSE_SCROLLBAR) */ + +#ifndef wxUSE_SLIDER +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_SLIDER must be defined." +# else +# define wxUSE_SLIDER 0 +# endif +#endif /* !defined(wxUSE_SLIDER) */ + +#ifndef wxUSE_SOUND +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_SOUND must be defined." +# else +# define wxUSE_SOUND 0 +# endif +#endif /* !defined(wxUSE_SOUND) */ + +#ifndef wxUSE_SPINBTN +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_SPINBTN must be defined." +# else +# define wxUSE_SPINBTN 0 +# endif +#endif /* !defined(wxUSE_SPINBTN) */ + +#ifndef wxUSE_SPINCTRL +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_SPINCTRL must be defined." +# else +# define wxUSE_SPINCTRL 0 +# endif +#endif /* !defined(wxUSE_SPINCTRL) */ + +#ifndef wxUSE_SPLASH +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_SPLASH must be defined." +# else +# define wxUSE_SPLASH 0 +# endif +#endif /* !defined(wxUSE_SPLASH) */ + +#ifndef wxUSE_SPLITTER +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_SPLITTER must be defined." +# else +# define wxUSE_SPLITTER 0 +# endif +#endif /* !defined(wxUSE_SPLITTER) */ + +#ifndef wxUSE_STATBMP +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_STATBMP must be defined." +# else +# define wxUSE_STATBMP 0 +# endif +#endif /* !defined(wxUSE_STATBMP) */ + +#ifndef wxUSE_STATBOX +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_STATBOX must be defined." +# else +# define wxUSE_STATBOX 0 +# endif +#endif /* !defined(wxUSE_STATBOX) */ + +#ifndef wxUSE_STATLINE +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_STATLINE must be defined." +# else +# define wxUSE_STATLINE 0 +# endif +#endif /* !defined(wxUSE_STATLINE) */ + +#ifndef wxUSE_STATTEXT +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_STATTEXT must be defined." +# else +# define wxUSE_STATTEXT 0 +# endif +#endif /* !defined(wxUSE_STATTEXT) */ + +#ifndef wxUSE_STATUSBAR +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_STATUSBAR must be defined." +# else +# define wxUSE_STATUSBAR 0 +# endif +#endif /* !defined(wxUSE_STATUSBAR) */ + +#ifndef wxUSE_TAB_DIALOG +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_TAB_DIALOG must be defined." +# else +# define wxUSE_TAB_DIALOG 0 +# endif +#endif /* !defined(wxUSE_TAB_DIALOG) */ + +#ifndef wxUSE_TEXTCTRL +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_TEXTCTRL must be defined." +# else +# define wxUSE_TEXTCTRL 0 +# endif +#endif /* !defined(wxUSE_TEXTCTRL) */ + +#ifndef wxUSE_TIPWINDOW +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_TIPWINDOW must be defined." +# else +# define wxUSE_TIPWINDOW 0 +# endif +#endif /* !defined(wxUSE_TIPWINDOW) */ + +#ifndef wxUSE_TOOLBAR +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_TOOLBAR must be defined." +# else +# define wxUSE_TOOLBAR 0 +# endif +#endif /* !defined(wxUSE_TOOLBAR) */ + +#ifndef wxUSE_TOOLTIPS +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_TOOLTIPS must be defined." +# else +# define wxUSE_TOOLTIPS 0 +# endif +#endif /* !defined(wxUSE_TOOLTIPS) */ + +#ifndef wxUSE_TREECTRL +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_TREECTRL must be defined." +# else +# define wxUSE_TREECTRL 0 +# endif +#endif /* !defined(wxUSE_TREECTRL) */ + +#ifndef wxUSE_VALIDATORS +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_VALIDATORS must be defined." +# else +# define wxUSE_VALIDATORS 0 +# endif +#endif /* !defined(wxUSE_VALIDATORS) */ + +#ifndef wxUSE_WXHTML_HELP +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_WXHTML_HELP must be defined." +# else +# define wxUSE_WXHTML_HELP 0 +# endif +#endif /* !defined(wxUSE_WXHTML_HELP) */ + +#ifndef wxUSE_XRC +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_XRC must be defined." +# else +# define wxUSE_XRC 0 +# endif +#endif /* !defined(wxUSE_XRC) */ + +#endif /* wxUSE_GUI */ + +/* + check consistency of the settings + */ + +#if WXWIN_COMPATIBILITY_2_4 +# if !WXWIN_COMPATIBILITY_2_6 +# ifdef wxABORT_ON_CONFIG_ERROR +# error "2.4.X compatibility requires 2.6.X compatibility" +# else +# undef WXWIN_COMPATIBILITY_2_6 +# define WXWIN_COMPATIBILITY_2_6 1 +# endif +# endif +#endif /* WXWIN_COMPATIBILITY_2_4 */ + +#if wxUSE_ARCHIVE_STREAMS +# if !wxUSE_DATETIME +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxArchive requires wxUSE_DATETIME" +# else +# undef wxUSE_ARCHIVE_STREAMS +# define wxUSE_ARCHIVE_STREAMS 0 +# endif +# endif +#endif /* wxUSE_ARCHIVE_STREAMS */ + +#if wxUSE_CRASHREPORT && !wxUSE_ON_FATAL_EXCEPTION +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_CRASHREPORT requires wxUSE_ON_FATAL_EXCEPTION" +# else +# undef wxUSE_CRASHREPORT +# define wxUSE_CRASHREPORT 0 +# endif +#endif /* wxUSE_CRASHREPORT */ + +#if wxUSE_PROTOCOL_FILE || wxUSE_PROTOCOL_FTP || wxUSE_PROTOCOL_HTTP +# if !wxUSE_PROTOCOL +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_PROTOCOL_XXX requires wxUSE_PROTOCOL" +# else +# undef wxUSE_PROTOCOL +# define wxUSE_PROTOCOL 1 +# endif +# endif +#endif /* wxUSE_PROTOCOL_XXX */ + +#if wxUSE_URL +# if !wxUSE_PROTOCOL +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_URL requires wxUSE_PROTOCOL" +# else +# undef wxUSE_PROTOCOL +# define wxUSE_PROTOCOL 1 +# endif +# endif +#endif /* wxUSE_URL */ + +#if wxUSE_PROTOCOL +# if !wxUSE_SOCKETS +# if wxUSE_PROTOCOL_HTTP || wxUSE_PROTOCOL_FTP +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_PROTOCOL_FTP/HTTP requires wxUSE_SOCKETS" +# else +# undef wxUSE_SOCKETS +# define wxUSE_SOCKETS 1 +# endif +# endif +# endif + +# if !wxUSE_STREAMS +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_PROTOCOL requires wxUSE_STREAMS" +# else +# undef wxUSE_STREAMS +# define wxUSE_STREAMS 1 +# endif +# endif +#endif /* wxUSE_PROTOCOL */ + +/* have to test for wxUSE_HTML before wxUSE_FILESYSTEM */ +#if wxUSE_HTML +# if !wxUSE_FILESYSTEM +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxHTML requires wxFileSystem" +# else +# undef wxUSE_FILESYSTEM +# define wxUSE_FILESYSTEM 1 +# endif +# endif +#endif /* wxUSE_HTML */ + +#if wxUSE_FS_ARCHIVE +# if !wxUSE_FILESYSTEM +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxArchiveFSHandler requires wxFileSystem" +# else +# undef wxUSE_FILESYSTEM +# define wxUSE_FILESYSTEM 1 +# endif +# endif +# if !wxUSE_ARCHIVE_STREAMS +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxArchiveFSHandler requires wxArchive" +# else +# undef wxUSE_ARCHIVE_STREAMS +# define wxUSE_ARCHIVE_STREAMS 1 +# endif +# endif +#endif /* wxUSE_FS_ARCHIVE */ + +#if wxUSE_FILESYSTEM +# if !wxUSE_STREAMS +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_FILESYSTEM requires wxUSE_STREAMS" +# else +# undef wxUSE_STREAMS +# define wxUSE_STREAMS 1 +# endif +# endif +# if !wxUSE_FILE && !wxUSE_FFILE +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_FILESYSTEM requires either wxUSE_FILE or wxUSE_FFILE" +# else +# undef wxUSE_FILE +# define wxUSE_FILE 1 +# undef wxUSE_FFILE +# define wxUSE_FFILE 1 +# endif +# endif +#endif /* wxUSE_FILESYSTEM */ + +#if wxUSE_FS_INET +# if !wxUSE_PROTOCOL +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_FS_INET requires wxUSE_PROTOCOL" +# else +# undef wxUSE_PROTOCOL +# define wxUSE_PROTOCOL 1 +# endif +# endif +#endif /* wxUSE_FS_INET */ + +#if wxUSE_STOPWATCH || wxUSE_DATETIME +# if !wxUSE_LONGLONG +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_STOPWATCH and wxUSE_DATETIME require wxUSE_LONGLONG" +# else +# undef wxUSE_LONGLONG +# define wxUSE_LONGLONG 1 +# endif +# endif +#endif /* wxUSE_STOPWATCH */ + +#if wxUSE_MIMETYPE && !wxUSE_TEXTFILE +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_MIMETYPE requires wxUSE_TEXTFILE" +# else +# undef wxUSE_TEXTFILE +# define wxUSE_TEXTFILE 1 +# endif +#endif /* wxUSE_MIMETYPE */ + +#if wxUSE_ODBC +# if !wxUSE_DATETIME +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxODBC requires wxUSE_DATETIME" +# else +# undef wxUSE_ODBC +# define wxUSE_ODBC 0 +# endif +# endif +#endif /* wxUSE_ODBC */ + +#if wxUSE_TEXTFILE && !wxUSE_TEXTBUFFER +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_TEXTFILE requires wxUSE_TEXTBUFFER" +# else +# undef wxUSE_TEXTBUFFER +# define wxUSE_TEXTBUFFER 1 +# endif +#endif /* wxUSE_TEXTFILE */ + +#if wxUSE_TEXTFILE && !wxUSE_FILE +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_TEXTFILE requires wxUSE_FILE" +# else +# undef wxUSE_FILE +# define wxUSE_FILE 1 +# endif +#endif /* wxUSE_TEXTFILE */ + +#if wxUSE_XML && !wxUSE_WCHAR_T +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_XML requires wxUSE_WCHAR_T" +# else +# undef wxUSE_XML +# define wxUSE_XML 0 +# endif +#endif /* wxUSE_XML */ + +#if !wxUSE_DYNLIB_CLASS +# if wxUSE_DYNAMIC_LOADER +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_DYNAMIC_LOADER requires wxUSE_DYNLIB_CLASS." +# else +# define wxUSE_DYNLIB_CLASS 1 +# endif +# endif +#endif /* wxUSE_DYNLIB_CLASS */ + +#if wxUSE_ZIPSTREAM +# if !wxUSE_ZLIB +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxZip requires wxZlib" +# else +# undef wxUSE_ZLIB +# define wxUSE_ZLIB 1 +# endif +# endif +# if !wxUSE_ARCHIVE_STREAMS +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxZip requires wxArchive" +# else +# undef wxUSE_ARCHIVE_STREAMS +# define wxUSE_ARCHIVE_STREAMS 1 +# endif +# endif +#endif /* wxUSE_ZIPSTREAM */ + +#if wxUSE_TARSTREAM + /* wxTar doesn't currently compile without wchar_t */ +# if !wxUSE_WCHAR_T +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxTar requires wchar_t" +# else +# undef wxUSE_TARSTREAM +# define wxUSE_TARSTREAM 0 +# endif +# endif +#endif /* wxUSE_TARSTREAM */ + +#if wxUSE_TARSTREAM +# if !wxUSE_ARCHIVE_STREAMS +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxTar requires wxArchive" +# else +# undef wxUSE_ARCHIVE_STREAMS +# define wxUSE_ARCHIVE_STREAMS 1 +# endif +# endif +#endif /* wxUSE_TARSTREAM */ + +/* the rest of the tests is for the GUI settings only */ +#if wxUSE_GUI + +#if wxUSE_BUTTON || \ + wxUSE_CALENDARCTRL || \ + wxUSE_CARET || \ + wxUSE_COMBOBOX || \ + wxUSE_BMPBUTTON || \ + wxUSE_CHECKBOX || \ + wxUSE_CHECKLISTBOX || \ + wxUSE_CHOICE || \ + wxUSE_GAUGE || \ + wxUSE_GRID || \ + wxUSE_LISTBOX || \ + wxUSE_LISTCTRL || \ + wxUSE_NOTEBOOK || \ + wxUSE_RADIOBOX || \ + wxUSE_RADIOBTN || \ + wxUSE_SCROLLBAR || \ + wxUSE_SLIDER || \ + wxUSE_SPINBTN || \ + wxUSE_SPINCTRL || \ + wxUSE_STATBMP || \ + wxUSE_STATBOX || \ + wxUSE_STATLINE || \ + wxUSE_STATTEXT || \ + wxUSE_STATUSBAR || \ + wxUSE_TEXTCTRL || \ + wxUSE_TOOLBAR || \ + wxUSE_TREECTRL +# if !wxUSE_CONTROLS +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_CONTROLS unset but some controls used" +# else +# undef wxUSE_CONTROLS +# define wxUSE_CONTROLS 1 +# endif +# endif +#endif /* controls */ + +#if wxUSE_BMPBUTTON +# if !wxUSE_BUTTON +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_BMPBUTTON requires wxUSE_BUTTON" +# else +# undef wxUSE_BUTTON +# define wxUSE_BUTTON 1 +# endif +# endif +#endif /* wxUSE_BMPBUTTON */ + +/* + wxUSE_BOOKCTRL should be only used if any of the controls deriving from it + are used + */ +#ifdef wxUSE_BOOKCTRL +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_BOOKCTRL is defined automatically, don't define it" +# else +# undef wxUSE_BOOKCTRL +# endif +#endif + +#define wxUSE_BOOKCTRL (wxUSE_NOTEBOOK || \ + wxUSE_LISTBOOK || \ + wxUSE_CHOICEBOOK || \ + wxUSE_TOOLBOOK || \ + wxUSE_TREEBOOK) + +#if wxUSE_COLLPANE +# if !wxUSE_BUTTON || !wxUSE_STATLINE +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_COLLPANE requires wxUSE_BUTTON and wxUSE_STATLINE" +# else +# undef wxUSE_COLLPANE +# define wxUSE_COLLPANE 0 +# endif +# endif +#endif /* wxUSE_COLLPANE */ + +#if wxUSE_LISTBOOK +# if !wxUSE_LISTCTRL +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxListbook requires wxListCtrl" +# else +# undef wxUSE_LISTCTRL +# define wxUSE_LISTCTRL 1 +# endif +# endif +#endif /* wxUSE_LISTBOOK */ + +#if wxUSE_CHOICEBOOK +# if !wxUSE_CHOICE +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxChoicebook requires wxChoice" +# else +# undef wxUSE_CHOICE +# define wxUSE_CHOICE 1 +# endif +# endif +#endif /* wxUSE_CHOICEBOOK */ + +#if wxUSE_TOOLBOOK +# if !wxUSE_TOOLBAR +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxToolbook requires wxToolBar" +# else +# undef wxUSE_TOOLBAR +# define wxUSE_TOOLBAR 1 +# endif +# endif +#endif /* wxUSE_TOOLBOOK */ + +#if !wxUSE_ODCOMBOBOX +# if wxUSE_BITMAPCOMBOBOX +# error "wxBitmapComboBox requires wxOwnerDrawnComboBox" +# else +# undef wxUSE_BITMAPCOMBOBOX +# define wxUSE_BITMAPCOMBOBOX 0 +# endif +#endif /* !wxUSE_ODCOMBOBOX */ + +/* don't attempt to use native status bar on the platforms not having it */ +#ifndef wxUSE_NATIVE_STATUSBAR +# define wxUSE_NATIVE_STATUSBAR 0 +#elif wxUSE_NATIVE_STATUSBAR +# if defined(__WXUNIVERSAL__) || !( defined(__WXMSW__) || \ + defined(__WXMAC__) || \ + defined(__WXPALMOS__) ) +# undef wxUSE_NATIVE_STATUSBAR +# define wxUSE_NATIVE_STATUSBAR 0 +# endif +#endif + +#if wxUSE_GRAPHICS_CONTEXT && !wxUSE_GEOMETRY +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_GRAPHICS_CONTEXT requires wxUSE_GEOMETRY" +# else +# undef wxUSE_GRAPHICS_CONTEXT +# define wxUSE_GRAPHICS_CONTEXT 0 +# endif +#endif /* wxUSE_GRAPHICS_CONTEXT */ + + +/* wxGTK-specific dependencies */ +#ifdef __WXGTK__ +# ifndef __WXUNIVERSAL__ +# if wxUSE_MDI_ARCHITECTURE && !wxUSE_MENUS +# ifdef wxABORT_ON_CONFIG_ERROR +# error "MDI requires wxUSE_MENUS in wxGTK" +# else +# undef wxUSE_MENUS +# define wxUSE_MENUS 1 +# endif +# endif +# endif /* !__WXUNIVERSAL__ */ + +# if wxUSE_JOYSTICK +# if !wxUSE_THREADS +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxJoystick requires threads in wxGTK" +# else +# undef wxUSE_JOYSTICK +# define wxUSE_JOYSTICK 0 +# endif +# endif +# endif +#endif /* wxGTK && !wxUniv */ + +/* Hopefully we can emulate these dialogs in due course */ +#if defined(__SMARTPHONE__) && defined(__WXWINCE__) +# ifdef wxUSE_COLOURDLG +# undef wxUSE_COLOURDLG +# define wxUSE_COLOURDLG 0 +# endif +#endif /* __SMARTPHONE__ && __WXWINCE__ */ + + +/* generic controls dependencies */ +#if !defined(__WXMSW__) || defined(__WXUNIVERSAL__) +# if wxUSE_FONTDLG || wxUSE_FILEDLG || wxUSE_CHOICEDLG + /* all common controls are needed by these dialogs */ +# if !defined(wxUSE_CHOICE) || \ + !defined(wxUSE_TEXTCTRL) || \ + !defined(wxUSE_BUTTON) || \ + !defined(wxUSE_CHECKBOX) || \ + !defined(wxUSE_STATTEXT) +# ifdef wxABORT_ON_CONFIG_ERROR +# error "These common controls are needed by common dialogs" +# else +# undef wxUSE_CHOICE +# define wxUSE_CHOICE 1 +# undef wxUSE_TEXTCTRL +# define wxUSE_TEXTCTRL 1 +# undef wxUSE_BUTTON +# define wxUSE_BUTTON 1 +# undef wxUSE_CHECKBOX +# define wxUSE_CHECKBOX 1 +# undef wxUSE_STATTEXT +# define wxUSE_STATTEXT 1 +# endif +# endif +# endif +#endif /* !wxMSW || wxUniv */ + +/* common dependencies */ +#if wxUSE_CALENDARCTRL +# if !(wxUSE_SPINBTN && wxUSE_COMBOBOX) +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxCalendarCtrl requires wxSpinButton and wxComboBox" +# else +# undef wxUSE_SPINBTN +# undef wxUSE_COMBOBOX +# define wxUSE_SPINBTN 1 +# define wxUSE_COMBOBOX 1 +# endif +# endif + +# if !wxUSE_DATETIME +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxCalendarCtrl requires wxUSE_DATETIME" +# else +# undef wxUSE_DATETIME +# define wxUSE_DATETIME 1 +# endif +# endif +#endif /* wxUSE_CALENDARCTRL */ + +#if wxUSE_DATEPICKCTRL +# if !wxUSE_DATETIME +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxDatePickerCtrl requires wxUSE_DATETIME" +# else +# undef wxUSE_DATETIME +# define wxUSE_DATETIME 1 +# endif +# endif +#endif /* wxUSE_DATEPICKCTRL */ + +#if wxUSE_CHECKLISTBOX +# if !wxUSE_LISTBOX +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxCheckListBox requires wxListBox" +# else +# undef wxUSE_LISTBOX +# define wxUSE_LISTBOX 1 +# endif +# endif +#endif /* wxUSE_CHECKLISTBOX */ + +#if wxUSE_CHOICEDLG +# if !wxUSE_LISTBOX +# ifdef wxABORT_ON_CONFIG_ERROR +# error "Choice dialogs requires wxListBox" +# else +# undef wxUSE_LISTBOX +# define wxUSE_LISTBOX 1 +# endif +# endif +#endif /* wxUSE_CHOICEDLG */ + +#if wxUSE_HELP +# if !wxUSE_BMPBUTTON +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_HELP requires wxUSE_BMPBUTTON" +# else +# undef wxUSE_BMPBUTTON +# define wxUSE_BMPBUTTON 1 +# endif +# endif + +# if !wxUSE_CHOICEDLG +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_HELP requires wxUSE_CHOICEDLG" +# else +# undef wxUSE_CHOICEDLG +# define wxUSE_CHOICEDLG 1 +# endif +# endif +#endif /* wxUSE_HELP */ + +#if wxUSE_MS_HTML_HELP + /* + this doesn't make sense for platforms other than MSW but we still + define it in wx/setup_inc.h so don't complain if it happens to be + defined under another platform but just silently fix it. + */ +# ifndef __WXMSW__ +# undef wxUSE_MS_HTML_HELP +# define wxUSE_MS_HTML_HELP 0 +# endif +#endif /* wxUSE_MS_HTML_HELP */ + +#if wxUSE_WXHTML_HELP +# if !wxUSE_HELP || !wxUSE_HTML || !wxUSE_COMBOBOX || !wxUSE_NOTEBOOK || !wxUSE_SPINCTRL +# ifdef wxABORT_ON_CONFIG_ERROR +# error "Built in help controller can't be compiled" +# else +# undef wxUSE_HELP +# define wxUSE_HELP 1 +# undef wxUSE_HTML +# define wxUSE_HTML 1 +# undef wxUSE_COMBOBOX +# define wxUSE_COMBOBOX 1 +# undef wxUSE_NOTEBOOK +# define wxUSE_NOTEBOOK 1 +# undef wxUSE_SPINCTRL +# define wxUSE_SPINCTRL 1 +# endif +# endif +#endif /* wxUSE_WXHTML_HELP */ + +#if !wxUSE_IMAGE +/* + The default wxUSE_IMAGE setting is 1, so if it's set to 0 we assume the + user explicitly wants this and disable all other features that require + wxUSE_IMAGE. + */ +# if wxUSE_DRAGIMAGE +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_DRAGIMAGE requires wxUSE_IMAGE" +# else +# undef wxUSE_DRAGIMAGE +# define wxUSE_DRAGIMAGE 0 +# endif +# endif + +# if wxUSE_LIBPNG +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_LIBPNG requires wxUSE_IMAGE" +# else +# undef wxUSE_LIBPNG +# define wxUSE_LIBPNG 0 +# endif +# endif + +# if wxUSE_LIBJPEG +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_LIBJPEG requires wxUSE_IMAGE" +# else +# undef wxUSE_LIBJPEG +# define wxUSE_LIBJPEG 0 +# endif +# endif + +# if wxUSE_LIBTIFF +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_LIBTIFF requires wxUSE_IMAGE" +# else +# undef wxUSE_LIBTIFF +# define wxUSE_LIBTIFF 0 +# endif +# endif + +# if wxUSE_GIF +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_GIF requires wxUSE_IMAGE" +# else +# undef wxUSE_GIF +# define wxUSE_GIF 0 +# endif +# endif + +# if wxUSE_PNM +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_PNM requires wxUSE_IMAGE" +# else +# undef wxUSE_PNM +# define wxUSE_PNM 0 +# endif +# endif + +# if wxUSE_PCX +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_PCX requires wxUSE_IMAGE" +# else +# undef wxUSE_PCX +# define wxUSE_PCX 0 +# endif +# endif + +# if wxUSE_IFF +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_IFF requires wxUSE_IMAGE" +# else +# undef wxUSE_IFF +# define wxUSE_IFF 0 +# endif +# endif + +# if wxUSE_TOOLBAR +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_TOOLBAR requires wxUSE_IMAGE" +# else +# undef wxUSE_TOOLBAR +# define wxUSE_TOOLBAR 0 +# endif +# endif + +# if wxUSE_XPM +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_XPM requires wxUSE_IMAGE" +# else +# undef wxUSE_XPM +# define wxUSE_XPM 0 +# endif +# endif + +#endif /* !wxUSE_IMAGE */ + +#if wxUSE_DOC_VIEW_ARCHITECTURE +# if !wxUSE_MENUS +# ifdef wxABORT_ON_CONFIG_ERROR +# error "DocView requires wxUSE_MENUS" +# else +# undef wxUSE_MENUS +# define wxUSE_MENUS 1 +# endif +# endif + +# if !wxUSE_CHOICEDLG +# ifdef wxABORT_ON_CONFIG_ERROR +# error "DocView requires wxUSE_CHOICEDLG" +# else +# undef wxUSE_CHOICEDLG +# define wxUSE_CHOICEDLG 1 +# endif +# endif + +# if !wxUSE_STREAMS && !wxUSE_STD_IOSTREAM +# ifdef wxABORT_ON_CONFIG_ERROR +# error "DocView requires wxUSE_STREAMS or wxUSE_STD_IOSTREAM" +# else +# undef wxUSE_STREAMS +# define wxUSE_STREAMS 1 +# endif +# endif +#endif /* wxUSE_DOC_VIEW_ARCHITECTURE */ + +#if wxUSE_PRINTING_ARCHITECTURE +# if !wxUSE_COMBOBOX +# ifdef wxABORT_ON_CONFIG_ERROR +# error "Print dialog requires wxUSE_COMBOBOX" +# else +# undef wxUSE_COMBOBOX +# define wxUSE_COMBOBOX 1 +# endif +# endif +#endif /* wxUSE_PRINTING_ARCHITECTURE */ + +#if wxUSE_MDI_ARCHITECTURE +# if !wxUSE_MDI +# ifdef wxABORT_ON_CONFIG_ERROR +# error "MDI requires wxUSE_MDI" +# else +# undef wxUSE_MDI +# define wxUSE_MDI 1 +# endif +# endif + +# if !wxUSE_DOC_VIEW_ARCHITECTURE +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_MDI_ARCHITECTURE requires wxUSE_DOC_VIEW_ARCHITECTURE" +# else +# undef wxUSE_DOC_VIEW_ARCHITECTURE +# define wxUSE_DOC_VIEW_ARCHITECTURE 1 +# endif +# endif +#endif /* wxUSE_MDI_ARCHITECTURE */ + +#if !wxUSE_FILEDLG +# if wxUSE_DOC_VIEW_ARCHITECTURE || wxUSE_WXHTML_HELP +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_FILEDLG is required by wxUSE_DOC_VIEW_ARCHITECTURE and wxUSE_WXHTML_HELP!" +# else +# undef wxUSE_FILEDLG +# define wxUSE_FILEDLG 1 +# endif +# endif +#endif /* wxUSE_FILEDLG */ + +#if !wxUSE_GAUGE || !wxUSE_BUTTON +# if wxUSE_PROGRESSDLG && !defined(__WXPALMOS__) +# ifdef wxABORT_ON_CONFIG_ERROR +# error "Generic progress dialog requires wxUSE_GAUGE and wxUSE_BUTTON" +# else +# undef wxUSE_GAUGE +# undef wxUSE_BUTTON +# define wxUSE_GAUGE 1 +# define wxUSE_BUTTON 1 +# endif +# endif +#endif /* !wxUSE_GAUGE */ + +#if !wxUSE_BUTTON +# if wxUSE_FONTDLG || \ + wxUSE_FILEDLG || \ + wxUSE_CHOICEDLG || \ + wxUSE_NUMBERDLG || \ + wxUSE_TEXTDLG || \ + wxUSE_DIRDLG || \ + wxUSE_STARTUP_TIPS || \ + wxUSE_WIZARDDLG +# ifdef wxABORT_ON_CONFIG_ERROR +# error "Common and generic dialogs require wxUSE_BUTTON" +# else +# undef wxUSE_BUTTON +# define wxUSE_BUTTON 1 +# endif +# endif +#endif /* !wxUSE_BUTTON */ + +#if !wxUSE_TOOLBAR +# if wxUSE_TOOLBAR_NATIVE +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_TOOLBAR is set to 0 but wxUSE_TOOLBAR_NATIVE is set to 1" +# else +# undef wxUSE_TOOLBAR_NATIVE +# define wxUSE_TOOLBAR_NATIVE 0 +# endif +# endif +#endif + +#if !wxUSE_IMAGLIST +# if wxUSE_TREECTRL || wxUSE_NOTEBOOK || wxUSE_LISTCTRL +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxImageList must be compiled as well" +# else +# undef wxUSE_IMAGLIST +# define wxUSE_IMAGLIST 1 +# endif +# endif +#endif /* !wxUSE_IMAGLIST */ + +#if !wxUSE_MSGDLG +# ifdef wxABORT_ON_CONFIG_ERROR + /* FIXME: should compile without it, of course, but doesn't */ +# error "wxMessageBox is always needed" +# else +# undef wxUSE_MSGDLG +# define wxUSE_MSGDLG 1 +# endif +#endif + +#if wxUSE_RADIOBOX +# if !wxUSE_RADIOBTN +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_RADIOBOX requires wxUSE_RADIOBTN" +# else +# undef wxUSE_RADIOBTN +# define wxUSE_RADIOBTN 1 +# endif +# endif +# if !wxUSE_STATBOX && !defined(__WXPALMOS__) +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_RADIOBOX requires wxUSE_STATBOX" +# else +# undef wxUSE_STATBOX +# define wxUSE_STATBOX 1 +# endif +# endif +#endif /* wxUSE_RADIOBOX */ + +#if wxUSE_LOGWINDOW +# if !wxUSE_TEXTCTRL +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_LOGWINDOW requires wxUSE_TEXTCTRL" +# else +# undef wxUSE_TEXTCTRL +# define wxUSE_TEXTCTRL 1 +# endif +# endif +#endif /* wxUSE_LOGWINDOW */ + +#if wxUSE_LOG_DIALOG +# if !wxUSE_LISTCTRL || !wxUSE_BUTTON +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_LOG_DIALOG requires wxUSE_LISTCTRL and wxUSE_BUTTON" +# else +# undef wxUSE_LISTCTRL +# define wxUSE_LISTCTRL 1 +# undef wxUSE_BUTTON +# define wxUSE_BUTTON 1 +# endif +# endif +#endif /* wxUSE_LOG_DIALOG */ + +#if wxUSE_CLIPBOARD && !wxUSE_DATAOBJ +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxClipboard requires wxDataObject" +# else +# undef wxUSE_DATAOBJ +# define wxUSE_DATAOBJ 1 +# endif +#endif /* wxUSE_CLIPBOARD */ + +#if wxUSE_WX_RESOURCES && !wxUSE_PROLOGIO +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxr resources require PrologIO" +# else +# undef wxUSE_PROLOGIO +# define wxUSE_PROLOGIO 1 +# endif +#endif /* wxUSE_WX_RESOURCES */ + +#if wxUSE_XRC && !wxUSE_XML +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_XRC requires wxUSE_XML" +# else +# undef wxUSE_XRC +# define wxUSE_XRC 0 +# endif +#endif /* wxUSE_XRC */ + +#if wxUSE_SOCKETS && !wxUSE_STOPWATCH +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_SOCKETS requires wxUSE_STOPWATCH" +# else +# undef wxUSE_SOCKETS +# define wxUSE_SOCKETS 0 +# endif +#endif /* wxUSE_SOCKETS */ + +#if !wxUSE_VARIANT +# if wxUSE_DATAVIEWCTRL +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxDataViewCtrl requires wxVariant" +# else +# undef wxUSE_DATAVIEWCTRL +# define wxUSE_DATAVIEWCTRL 0 +# endif +# endif + +# if wxUSE_ODBC +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_ODBC requires wxVariant" +# else +# undef wxUSE_ODBC +# define wxUSE_ODBC 0 +# endif +# endif +#endif /* wxUSE_VARIANT */ + +#endif /* wxUSE_GUI */ diff --git a/Externals/wxWidgets/include/wx/choicdlg.h b/Externals/wxWidgets/include/wx/choicdlg.h new file mode 100644 index 0000000000..76867ec675 --- /dev/null +++ b/Externals/wxWidgets/include/wx/choicdlg.h @@ -0,0 +1,22 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/choicdgg.h +// Purpose: Includes generic choice dialog file +// Author: Julian Smart +// Modified by: +// Created: +// RCS-ID: $Id: choicdlg.h 33948 2005-05-04 18:57:50Z JS $ +// Copyright: Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CHOICDLG_H_BASE_ +#define _WX_CHOICDLG_H_BASE_ + +#if wxUSE_CHOICEDLG + +#include "wx/generic/choicdgg.h" + +#endif + +#endif + // _WX_CHOICDLG_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/choice.h b/Externals/wxWidgets/include/wx/choice.h new file mode 100644 index 0000000000..fe2a9fa76a --- /dev/null +++ b/Externals/wxWidgets/include/wx/choice.h @@ -0,0 +1,88 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/choice.h +// Purpose: wxChoice class interface +// Author: Vadim Zeitlin +// Modified by: +// Created: 26.07.99 +// RCS-ID: $Id: choice.h 42727 2006-10-30 16:04:27Z VZ $ +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CHOICE_H_BASE_ +#define _WX_CHOICE_H_BASE_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/defs.h" + +#if wxUSE_CHOICE + +#include "wx/ctrlsub.h" // the base class + +// ---------------------------------------------------------------------------- +// global data +// ---------------------------------------------------------------------------- + +extern WXDLLEXPORT_DATA(const wxChar) wxChoiceNameStr[]; + +// ---------------------------------------------------------------------------- +// wxChoice allows to select one of a non-modifiable list of strings +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxChoiceBase : public wxControlWithItems +{ +public: + wxChoiceBase() { } + virtual ~wxChoiceBase(); + + // all generic methods are in wxControlWithItems + + // get the current selection: this can only be different from the normal + // selection if the popup items list is currently opened and the user + // selected some item in it but didn't close the list yet; otherwise (and + // currently always on platforms other than MSW) this is the same as + // GetSelection() + virtual int GetCurrentSelection() const { return GetSelection(); } + + // set/get the number of columns in the control (as they're not supported on + // most platforms, they do nothing by default) + virtual void SetColumns(int WXUNUSED(n) = 1 ) { } + virtual int GetColumns() const { return 1 ; } + + // emulate selecting the item event.GetInt() + void Command(wxCommandEvent& event); + +private: + DECLARE_NO_COPY_CLASS(wxChoiceBase) +}; + +// ---------------------------------------------------------------------------- +// include the platform-dependent class definition +// ---------------------------------------------------------------------------- + +#if defined(__WXUNIVERSAL__) + #include "wx/univ/choice.h" +#elif defined(__SMARTPHONE__) && defined(__WXWINCE__) + #include "wx/msw/wince/choicece.h" +#elif defined(__WXMSW__) + #include "wx/msw/choice.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/choice.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/choice.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/choice.h" +#elif defined(__WXMAC__) + #include "wx/mac/choice.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/choice.h" +#elif defined(__WXPM__) + #include "wx/os2/choice.h" +#endif + +#endif // wxUSE_CHOICE + +#endif // _WX_CHOICE_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/choicebk.h b/Externals/wxWidgets/include/wx/choicebk.h new file mode 100644 index 0000000000..391be77e33 --- /dev/null +++ b/Externals/wxWidgets/include/wx/choicebk.h @@ -0,0 +1,154 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/choicebk.h +// Purpose: wxChoicebook: wxChoice and wxNotebook combination +// Author: Vadim Zeitlin +// Modified by: Wlodzimierz ABX Skiba from wx/listbook.h +// Created: 15.09.04 +// RCS-ID: $Id: choicebk.h 49804 2007-11-10 01:09:42Z VZ $ +// Copyright: (c) Vadim Zeitlin, Wlodzimierz Skiba +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CHOICEBOOK_H_ +#define _WX_CHOICEBOOK_H_ + +#include "wx/defs.h" + +#if wxUSE_CHOICEBOOK + +#include "wx/bookctrl.h" +#include "wx/choice.h" + +class WXDLLIMPEXP_FWD_CORE wxChoice; + +extern WXDLLIMPEXP_CORE const wxEventType wxEVT_COMMAND_CHOICEBOOK_PAGE_CHANGED; +extern WXDLLIMPEXP_CORE const wxEventType wxEVT_COMMAND_CHOICEBOOK_PAGE_CHANGING; + +// wxChoicebook flags +#define wxCHB_DEFAULT wxBK_DEFAULT +#define wxCHB_TOP wxBK_TOP +#define wxCHB_BOTTOM wxBK_BOTTOM +#define wxCHB_LEFT wxBK_LEFT +#define wxCHB_RIGHT wxBK_RIGHT +#define wxCHB_ALIGN_MASK wxBK_ALIGN_MASK + +// ---------------------------------------------------------------------------- +// wxChoicebook +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxChoicebook : public wxBookCtrlBase +{ +public: + wxChoicebook() + { + Init(); + } + + wxChoicebook(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxEmptyString) + { + Init(); + + (void)Create(parent, id, pos, size, style, name); + } + + // quasi ctor + bool Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxEmptyString); + + + virtual int GetSelection() const; + virtual bool SetPageText(size_t n, const wxString& strText); + virtual wxString GetPageText(size_t n) const; + virtual int GetPageImage(size_t n) const; + virtual bool SetPageImage(size_t n, int imageId); + virtual wxSize CalcSizeFromPage(const wxSize& sizePage) const; + virtual bool InsertPage(size_t n, + wxWindow *page, + const wxString& text, + bool bSelect = false, + int imageId = -1); + virtual int SetSelection(size_t n) { return DoSetSelection(n, SetSelection_SendEvent); } + virtual int ChangeSelection(size_t n) { return DoSetSelection(n); } + virtual void SetImageList(wxImageList *imageList); + + virtual bool DeleteAllPages(); + + // returns the choice control + wxChoice* GetChoiceCtrl() const { return (wxChoice*)m_bookctrl; } + +protected: + virtual wxWindow *DoRemovePage(size_t page); + + // get the size which the choice control should have + virtual wxSize GetControllerSize() const; + + void UpdateSelectedPage(size_t newsel) + { + m_selection = newsel; + GetChoiceCtrl()->Select(newsel); + } + + wxBookCtrlBaseEvent* CreatePageChangingEvent() const; + void MakeChangedEvent(wxBookCtrlBaseEvent &event); + + // event handlers + void OnChoiceSelected(wxCommandEvent& event); + + // the currently selected page or wxNOT_FOUND if none + int m_selection; + +private: + // common part of all constructors + void Init(); + + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS_NO_COPY(wxChoicebook) +}; + +// ---------------------------------------------------------------------------- +// choicebook event class and related stuff +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxChoicebookEvent : public wxBookCtrlBaseEvent +{ +public: + wxChoicebookEvent(wxEventType commandType = wxEVT_NULL, int id = 0, + int nSel = -1, int nOldSel = -1) + : wxBookCtrlBaseEvent(commandType, id, nSel, nOldSel) + { + } + + wxChoicebookEvent(const wxChoicebookEvent& event) + : wxBookCtrlBaseEvent(event) + { + } + + virtual wxEvent *Clone() const { return new wxChoicebookEvent(*this); } + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxChoicebookEvent) +}; + +typedef void (wxEvtHandler::*wxChoicebookEventFunction)(wxChoicebookEvent&); + +#define wxChoicebookEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxChoicebookEventFunction, &func) + +#define EVT_CHOICEBOOK_PAGE_CHANGED(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_COMMAND_CHOICEBOOK_PAGE_CHANGED, winid, wxChoicebookEventHandler(fn)) + +#define EVT_CHOICEBOOK_PAGE_CHANGING(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_COMMAND_CHOICEBOOK_PAGE_CHANGING, winid, wxChoicebookEventHandler(fn)) + +#endif // wxUSE_CHOICEBOOK + +#endif // _WX_CHOICEBOOK_H_ diff --git a/Externals/wxWidgets/include/wx/clipbrd.h b/Externals/wxWidgets/include/wx/clipbrd.h new file mode 100644 index 0000000000..11976bec9f --- /dev/null +++ b/Externals/wxWidgets/include/wx/clipbrd.h @@ -0,0 +1,145 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/clipbrd.h +// Purpose: wxClipboad class and clipboard functions +// Author: Vadim Zeitlin +// Modified by: +// Created: 19.10.99 +// RCS-ID: $Id: clipbrd.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) wxWidgets Team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CLIPBRD_H_BASE_ +#define _WX_CLIPBRD_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_CLIPBOARD + + +#include "wx/object.h" +#include "wx/wxchar.h" + +class WXDLLIMPEXP_FWD_CORE wxDataFormat; +class WXDLLIMPEXP_FWD_CORE wxDataObject; +class WXDLLIMPEXP_FWD_CORE wxClipboard; + +// ---------------------------------------------------------------------------- +// wxClipboard represents the system clipboard. Normally, you should use +// wxTheClipboard which is a global pointer to the (unique) clipboard. +// +// Clipboard can be used to copy data to/paste data from. It works together +// with wxDataObject. +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxClipboardBase : public wxObject +{ +public: + wxClipboardBase() {} + + // open the clipboard before Add/SetData() and GetData() + virtual bool Open() = 0; + + // close the clipboard after Add/SetData() and GetData() + virtual void Close() = 0; + + // query whether the clipboard is opened + virtual bool IsOpened() const = 0; + + // add to the clipboard data + // + // NB: the clipboard owns the pointer and will delete it, so data must be + // allocated on the heap + virtual bool AddData( wxDataObject *data ) = 0; + + // set the clipboard data, this is the same as Clear() followed by + // AddData() + virtual bool SetData( wxDataObject *data ) = 0; + + // ask if data in correct format is available + virtual bool IsSupported( const wxDataFormat& format ) = 0; + + // fill data with data on the clipboard (if available) + virtual bool GetData( wxDataObject& data ) = 0; + + // clears wxTheClipboard and the system's clipboard if possible + virtual void Clear() = 0; + + // flushes the clipboard: this means that the data which is currently on + // clipboard will stay available even after the application exits (possibly + // eating memory), otherwise the clipboard will be emptied on exit + virtual bool Flush() { return false; } + + // X11 has two clipboards which get selected by this call. Empty on MSW. + virtual void UsePrimarySelection( bool WXUNUSED(primary) = false ) { } + + // Returns global instance (wxTheClipboard) of the object: + static wxClipboard *Get(); +}; + +// ---------------------------------------------------------------------------- +// globals +// ---------------------------------------------------------------------------- + +// The global clipboard object - backward compatible access macro: +#define wxTheClipboard (wxClipboard::Get()) + +// ---------------------------------------------------------------------------- +// include platform-specific class declaration +// ---------------------------------------------------------------------------- + +#if defined(__WXMSW__) + #include "wx/msw/clipbrd.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/clipbrd.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/clipbrd.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/clipbrd.h" +#elif defined(__WXX11__) + #include "wx/x11/clipbrd.h" +#elif defined(__WXMGL__) + #include "wx/mgl/clipbrd.h" +#elif defined(__WXMAC__) + #include "wx/mac/clipbrd.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/clipbrd.h" +#elif defined(__WXPM__) + #include "wx/os2/clipbrd.h" +#endif + +// ---------------------------------------------------------------------------- +// helpful class for opening the clipboard and automatically closing it +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxClipboardLocker +{ +public: + wxClipboardLocker(wxClipboard *clipboard = (wxClipboard *)NULL) + { + m_clipboard = clipboard ? clipboard : wxTheClipboard; + if ( m_clipboard ) + { + m_clipboard->Open(); + } + } + + bool operator!() const { return !m_clipboard->IsOpened(); } + + ~wxClipboardLocker() + { + if ( m_clipboard ) + { + m_clipboard->Close(); + } + } + +private: + wxClipboard *m_clipboard; + + DECLARE_NO_COPY_CLASS(wxClipboardLocker) +}; + +#endif // wxUSE_CLIPBOARD + +#endif // _WX_CLIPBRD_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/clntdata.h b/Externals/wxWidgets/include/wx/clntdata.h new file mode 100644 index 0000000000..f9704a7d0e --- /dev/null +++ b/Externals/wxWidgets/include/wx/clntdata.h @@ -0,0 +1,273 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/clntdata.h +// Purpose: A mixin class for holding a wxClientData or void pointer +// Author: Robin Dunn +// Modified by: +// Created: 9-Oct-2001 +// RCS-ID: $Id: clntdata.h 36973 2006-01-18 16:45:41Z JS $ +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CLNTDATAH__ +#define _WX_CLNTDATAH__ + +#include "wx/defs.h" +#include "wx/string.h" +#include "wx/hashmap.h" + +typedef int (*wxShadowObjectMethod)(void*, void*); +WX_DECLARE_STRING_HASH_MAP_WITH_DECL( + wxShadowObjectMethod, + wxShadowObjectMethods, + class WXDLLIMPEXP_BASE +); +WX_DECLARE_STRING_HASH_MAP_WITH_DECL( + void *, + wxShadowObjectFields, + class WXDLLIMPEXP_BASE +); + +class WXDLLIMPEXP_BASE wxShadowObject +{ +public: + wxShadowObject() { } + + void AddMethod( const wxString &name, wxShadowObjectMethod method ) + { + wxShadowObjectMethods::iterator it = m_methods.find( name ); + if (it == m_methods.end()) + m_methods[ name ] = method; + else + it->second = method; + } + + bool InvokeMethod( const wxString &name, void* window, void* param, int* returnValue ) + { + wxShadowObjectMethods::iterator it = m_methods.find( name ); + if (it == m_methods.end()) + return false; + wxShadowObjectMethod method = it->second; + int ret = (*method)(window, param); + if (returnValue) + *returnValue = ret; + return true; + } + + void AddField( const wxString &name, void* initialValue = NULL ) + { + wxShadowObjectFields::iterator it = m_fields.find( name ); + if (it == m_fields.end()) + m_fields[ name ] = initialValue; + else + it->second = initialValue; + } + + void SetField( const wxString &name, void* value ) + { + wxShadowObjectFields::iterator it = m_fields.find( name ); + if (it == m_fields.end()) + return; + it->second = value; + } + + void* GetField( const wxString &name, void *defaultValue = NULL ) + { + wxShadowObjectFields::iterator it = m_fields.find( name ); + if (it == m_fields.end()) + return defaultValue; + return it->second; + } + +private: + wxShadowObjectMethods m_methods; + wxShadowObjectFields m_fields; +}; + + +// ---------------------------------------------------------------------------- + +// what kind of client data do we have? +enum wxClientDataType +{ + wxClientData_None, // we don't know yet because we don't have it at all + wxClientData_Object, // our client data is typed and we own it + wxClientData_Void // client data is untyped and we don't own it +}; + +class WXDLLIMPEXP_BASE wxClientData +{ +public: + wxClientData() { } + virtual ~wxClientData() { } +}; + +class WXDLLIMPEXP_BASE wxStringClientData : public wxClientData +{ +public: + wxStringClientData() : m_data() { } + wxStringClientData( const wxString &data ) : m_data(data) { } + void SetData( const wxString &data ) { m_data = data; } + const wxString& GetData() const { return m_data; } + +private: + wxString m_data; +}; + +// This class is a mixin that provides storage and management of "client +// data." The client data stored can either be a pointer to a wxClientData +// object in which case it is managed by the container (i.e. it will delete +// the data when it's destroyed) or an untyped pointer which won't be deleted +// by the container - but not both of them +// +// NOTE: This functionality is currently duplicated in wxEvtHandler in order +// to avoid having more than one vtable in that class hierarchy. + +class WXDLLIMPEXP_BASE wxClientDataContainer +{ +public: + wxClientDataContainer(); + virtual ~wxClientDataContainer(); + + void SetClientObject( wxClientData *data ) { DoSetClientObject(data); } + wxClientData *GetClientObject() const { return DoGetClientObject(); } + + void SetClientData( void *data ) { DoSetClientData(data); } + void *GetClientData() const { return DoGetClientData(); } + +protected: + // The user data: either an object which will be deleted by the container + // when it's deleted or some raw pointer which we do nothing with. Only + // one type of data can be used with the given window, i.e. you cannot set + // the void data and then associate the container with wxClientData or vice + // versa. + union + { + wxClientData *m_clientObject; + void *m_clientData; + }; + + // client data accessors + virtual void DoSetClientObject( wxClientData *data ); + virtual wxClientData *DoGetClientObject() const; + + virtual void DoSetClientData( void *data ); + virtual void *DoGetClientData() const; + + // what kind of data do we have? + wxClientDataType m_clientDataType; + +}; + +#include "wx/vector.h" + +struct WXDLLIMPEXP_BASE wxClientDataDictionaryPair +{ + wxClientDataDictionaryPair( size_t idx ) : index( idx ), data( 0 ) { } + + size_t index; + wxClientData* data; +}; + +_WX_DECLARE_VECTOR( + wxClientDataDictionaryPair, + wxClientDataDictionaryPairVector, + WXDLLIMPEXP_BASE +); + +// this class is used internally to maintain the association between items +// of (some subclasses of) wxControlWithItems and their client data +// NOTE: this class does not keep track of whether it contains +// wxClientData or void*. The client must ensure that +// it does not contain a mix of the two, and that +// DestroyData is called if it contains wxClientData +class WXDLLIMPEXP_BASE wxClientDataDictionary +{ +public: + wxClientDataDictionary() {} + + // deletes all the data + void DestroyData() + { + for( size_t i = 0, end = m_vec.size(); i != end; ++i ) + delete m_vec[i].data; + m_vec.clear(); + } + + // if data for the given index is not present, add it, + // if it is present, delete the old data and replace it with + // the new one + void Set( size_t index, wxClientData* data, bool doDelete ) + { + size_t ptr = Find( index ); + + if( !data ) + { + if( ptr == m_vec.size() ) return; + if( doDelete ) + delete m_vec[ptr].data; + m_vec.erase( ptr ); + } + else + { + if( ptr == m_vec.size() ) + { + m_vec.push_back( wxClientDataDictionaryPair( index ) ); + ptr = m_vec.size() - 1; + } + + if( doDelete ) + delete m_vec[ptr].data; + m_vec[ptr].data = data; + } + } + + // get the data associated with the given index, + // return 0 if not found + wxClientData* Get( size_t index ) const + { + size_t it = Find( index ); + if( it == m_vec.size() ) return 0; + return (wxClientData*)m_vec[it].data; // const cast + } + + // delete the data associated with the given index + // it also decreases by one the indices of all the elements + // with an index greater than the given index + void Delete( size_t index, bool doDelete ) + { + size_t todel = m_vec.size(); + + for( size_t i = 0, end = m_vec.size(); i != end; ++i ) + { + if( m_vec[i].index == index ) + todel = i; + else if( m_vec[i].index > index ) + --(m_vec[i].index); + } + + if( todel != m_vec.size() ) + { + if( doDelete ) + delete m_vec[todel].data; + m_vec.erase( todel ); + } + } +private: + // returns MyVec.size() if not found + size_t Find( size_t index ) const + { + for( size_t i = 0, end = m_vec.size(); i != end; ++i ) + { + if( m_vec[i].index == index ) + return i; + } + + return m_vec.size(); + } + + wxClientDataDictionaryPairVector m_vec; +}; + +#endif // _WX_CLNTDATAH__ + diff --git a/Externals/wxWidgets/include/wx/clrpicker.h b/Externals/wxWidgets/include/wx/clrpicker.h new file mode 100644 index 0000000000..3a59b5418b --- /dev/null +++ b/Externals/wxWidgets/include/wx/clrpicker.h @@ -0,0 +1,200 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/clrpicker.h +// Purpose: wxColourPickerCtrl base header +// Author: Francesco Montorsi (based on Vadim Zeitlin's code) +// Modified by: +// Created: 14/4/2006 +// Copyright: (c) Vadim Zeitlin, Francesco Montorsi +// RCS-ID: $Id: clrpicker.h 41022 2006-09-05 21:02:27Z VZ $ +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CLRPICKER_H_BASE_ +#define _WX_CLRPICKER_H_BASE_ + +#include "wx/defs.h" + + +#if wxUSE_COLOURPICKERCTRL + +#include "wx/pickerbase.h" + + +class WXDLLIMPEXP_CORE wxColourPickerEvent; + +extern WXDLLEXPORT_DATA(const wxChar) wxColourPickerWidgetNameStr[]; +extern WXDLLEXPORT_DATA(const wxChar) wxColourPickerCtrlNameStr[]; + + +// ---------------------------------------------------------------------------- +// wxColourPickerWidgetBase: a generic abstract interface which must be +// implemented by controls used by wxColourPickerCtrl +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxColourPickerWidgetBase +{ +public: + wxColourPickerWidgetBase() { m_colour = *wxBLACK; } + virtual ~wxColourPickerWidgetBase() {} + + wxColour GetColour() const + { return m_colour; } + virtual void SetColour(const wxColour &col) + { m_colour = col; UpdateColour(); } + virtual void SetColour(const wxString &col) + { m_colour.Set(col); UpdateColour(); } + +protected: + + virtual void UpdateColour() = 0; + + // the current colour (may be invalid if none) + wxColour m_colour; +}; + + +// Styles which must be supported by all controls implementing wxColourPickerWidgetBase +// NB: these styles must be defined to carefully-chosen values to +// avoid conflicts with wxButton's styles + +// show the colour in HTML form (#AABBCC) as colour button label +// (instead of no label at all) +// NOTE: this style is supported just by wxColourButtonGeneric and +// thus is not exposed in wxColourPickerCtrl +#define wxCLRP_SHOW_LABEL 0x0008 + +// map platform-dependent controls which implement the wxColourPickerWidgetBase +// under the name "wxColourPickerWidget". +// NOTE: wxColourPickerCtrl allocates a wxColourPickerWidget and relies on the +// fact that all classes being mapped as wxColourPickerWidget have the +// same prototype for their contructor (and also explains why we use +// define instead of a typedef) +// since GTK > 2.4, there is GtkColorButton +#if defined(__WXGTK24__) && !defined(__WXUNIVERSAL__) + #include "wx/gtk/clrpicker.h" + #define wxColourPickerWidget wxColourButton +#else + #include "wx/generic/clrpickerg.h" + #define wxColourPickerWidget wxGenericColourButton +#endif + + +// ---------------------------------------------------------------------------- +// wxColourPickerCtrl: platform-independent class which embeds a +// platform-dependent wxColourPickerWidget and, if wxCLRP_USE_TEXTCTRL style is +// used, a textctrl next to it. +// ---------------------------------------------------------------------------- + +#define wxCLRP_USE_TEXTCTRL (wxPB_USE_TEXTCTRL) +#define wxCLRP_DEFAULT_STYLE 0 + +class WXDLLIMPEXP_CORE wxColourPickerCtrl : public wxPickerBase +{ +public: + wxColourPickerCtrl() : m_bIgnoreNextTextCtrlUpdate(false) {} + virtual ~wxColourPickerCtrl() {} + + + wxColourPickerCtrl(wxWindow *parent, wxWindowID id, + const wxColour& col = *wxBLACK, const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = wxCLRP_DEFAULT_STYLE, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxColourPickerCtrlNameStr) + : m_bIgnoreNextTextCtrlUpdate(false) + { Create(parent, id, col, pos, size, style, validator, name); } + + bool Create(wxWindow *parent, wxWindowID id, + const wxColour& col = *wxBLACK, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxCLRP_DEFAULT_STYLE, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxColourPickerCtrlNameStr); + + +public: // public API + + // get the colour chosen + wxColour GetColour() const + { return ((wxColourPickerWidget *)m_picker)->GetColour(); } + + // set currently displayed color + void SetColour(const wxColour& col); + + // set colour using RGB(r,g,b) syntax or considering given text as a colour name; + // returns true if the given text was successfully recognized. + bool SetColour(const wxString& text); + + +public: // internal functions + + // update the button colour to match the text control contents + void UpdatePickerFromTextCtrl(); + + // update the text control to match the button's colour + void UpdateTextCtrlFromPicker(); + + // event handler for our picker + void OnColourChange(wxColourPickerEvent &); + +protected: + virtual long GetPickerStyle(long style) const + { return (style & wxCLRP_SHOW_LABEL); } + + // true if the next UpdateTextCtrl() call is to ignore + bool m_bIgnoreNextTextCtrlUpdate; + +private: + DECLARE_DYNAMIC_CLASS(wxColourPickerCtrl) +}; + + +// ---------------------------------------------------------------------------- +// wxColourPickerEvent: used by wxColourPickerCtrl only +// ---------------------------------------------------------------------------- + +BEGIN_DECLARE_EVENT_TYPES() + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_CORE, wxEVT_COMMAND_COLOURPICKER_CHANGED, 1102) +END_DECLARE_EVENT_TYPES() + +class WXDLLIMPEXP_CORE wxColourPickerEvent : public wxCommandEvent +{ +public: + wxColourPickerEvent() {} + wxColourPickerEvent(wxObject *generator, int id, const wxColour &col) + : wxCommandEvent(wxEVT_COMMAND_COLOURPICKER_CHANGED, id), + m_colour(col) + { + SetEventObject(generator); + } + + wxColour GetColour() const { return m_colour; } + void SetColour(const wxColour &c) { m_colour = c; } + + + // default copy ctor, assignment operator and dtor are ok + virtual wxEvent *Clone() const { return new wxColourPickerEvent(*this); } + +private: + wxColour m_colour; + + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxColourPickerEvent) +}; + +// ---------------------------------------------------------------------------- +// event types and macros +// ---------------------------------------------------------------------------- + +typedef void (wxEvtHandler::*wxColourPickerEventFunction)(wxColourPickerEvent&); + +#define wxColourPickerEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxColourPickerEventFunction, &func) + +#define EVT_COLOURPICKER_CHANGED(id, fn) \ + wx__DECLARE_EVT1(wxEVT_COMMAND_COLOURPICKER_CHANGED, id, wxColourPickerEventHandler(fn)) + + +#endif // wxUSE_COLOURPICKERCTRL + +#endif // _WX_CLRPICKER_H_BASE_ + diff --git a/Externals/wxWidgets/include/wx/cmdline.h b/Externals/wxWidgets/include/wx/cmdline.h new file mode 100644 index 0000000000..9f6e6080b7 --- /dev/null +++ b/Externals/wxWidgets/include/wx/cmdline.h @@ -0,0 +1,239 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/cmdline.h +// Purpose: wxCmdLineParser and related classes for parsing the command +// line options +// Author: Vadim Zeitlin +// Modified by: +// Created: 04.01.00 +// RCS-ID: $Id: cmdline.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) 2000 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CMDLINE_H_ +#define _WX_CMDLINE_H_ + +#include "wx/defs.h" + +#include "wx/string.h" +#include "wx/arrstr.h" + +#if wxUSE_CMDLINE_PARSER + +class WXDLLIMPEXP_FWD_BASE wxDateTime; + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// by default, options are optional (sic) and each call to AddParam() allows +// one more parameter - this may be changed by giving non-default flags to it +enum +{ + wxCMD_LINE_OPTION_MANDATORY = 0x01, // this option must be given + wxCMD_LINE_PARAM_OPTIONAL = 0x02, // the parameter may be omitted + wxCMD_LINE_PARAM_MULTIPLE = 0x04, // the parameter may be repeated + wxCMD_LINE_OPTION_HELP = 0x08, // this option is a help request + wxCMD_LINE_NEEDS_SEPARATOR = 0x10 // must have sep before the value +}; + +// an option value or parameter may be a string (the most common case), a +// number or a date +enum wxCmdLineParamType +{ + wxCMD_LINE_VAL_STRING, // should be 0 (default) + wxCMD_LINE_VAL_NUMBER, + wxCMD_LINE_VAL_DATE, + wxCMD_LINE_VAL_NONE +}; + +// for constructing the cmd line description using Init() +enum wxCmdLineEntryType +{ + wxCMD_LINE_SWITCH, + wxCMD_LINE_OPTION, + wxCMD_LINE_PARAM, + wxCMD_LINE_NONE // to terminate the list +}; + +// ---------------------------------------------------------------------------- +// wxCmdLineEntryDesc is a description of one command line +// switch/option/parameter +// ---------------------------------------------------------------------------- + +struct wxCmdLineEntryDesc +{ + wxCmdLineEntryType kind; + const wxChar *shortName; + const wxChar *longName; + const wxChar *description; + wxCmdLineParamType type; + int flags; +}; + +// ---------------------------------------------------------------------------- +// wxCmdLineParser is a class for parsing command line. +// +// It has the following features: +// +// 1. distinguishes options, switches and parameters; allows option grouping +// 2. allows both short and long options +// 3. automatically generates the usage message from the cmd line description +// 4. does type checks on the options values (number, date, ...) +// +// To use it you should: +// +// 1. construct it giving it the cmd line to parse and optionally its desc +// 2. construct the cmd line description using AddXXX() if not done in (1) +// 3. call Parse() +// 4. use GetXXX() to retrieve the parsed info +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxCmdLineParser +{ +public: + // ctors and initializers + // ---------------------- + + // default ctor or ctor giving the cmd line in either Unix or Win form + wxCmdLineParser() { Init(); } + wxCmdLineParser(int argc, char **argv) { Init(); SetCmdLine(argc, argv); } +#if wxUSE_UNICODE + wxCmdLineParser(int argc, wxChar **argv) { Init(); SetCmdLine(argc, argv); } +#endif // wxUSE_UNICODE + wxCmdLineParser(const wxString& cmdline) { Init(); SetCmdLine(cmdline); } + + // the same as above, but also gives the cmd line description - otherwise, + // use AddXXX() later + wxCmdLineParser(const wxCmdLineEntryDesc *desc) + { Init(); SetDesc(desc); } + wxCmdLineParser(const wxCmdLineEntryDesc *desc, int argc, char **argv) + { Init(); SetCmdLine(argc, argv); SetDesc(desc); } +#if wxUSE_UNICODE + wxCmdLineParser(const wxCmdLineEntryDesc *desc, int argc, wxChar **argv) + { Init(); SetCmdLine(argc, argv); SetDesc(desc); } +#endif // wxUSE_UNICODE + wxCmdLineParser(const wxCmdLineEntryDesc *desc, const wxString& cmdline) + { Init(); SetCmdLine(cmdline); SetDesc(desc); } + + // set cmd line to parse after using one of the ctors which don't do it + void SetCmdLine(int argc, char **argv); +#if wxUSE_UNICODE + void SetCmdLine(int argc, wxChar **argv); +#endif // wxUSE_UNICODE + void SetCmdLine(const wxString& cmdline); + + // not virtual, don't use this class polymorphically + ~wxCmdLineParser(); + + // set different parser options + // ---------------------------- + + // by default, '-' is switch char under Unix, '-' or '/' under Win: + // switchChars contains all characters with which an option or switch may + // start + void SetSwitchChars(const wxString& switchChars); + + // long options are not POSIX-compliant, this option allows to disable them + void EnableLongOptions(bool enable = true); + void DisableLongOptions() { EnableLongOptions(false); } + + bool AreLongOptionsEnabled(); + + // extra text may be shown by Usage() method if set by this function + void SetLogo(const wxString& logo); + + // construct the cmd line description + // ---------------------------------- + + // take the cmd line description from the wxCMD_LINE_NONE terminated table + void SetDesc(const wxCmdLineEntryDesc *desc); + + // a switch: i.e. an option without value + void AddSwitch(const wxString& name, const wxString& lng = wxEmptyString, + const wxString& desc = wxEmptyString, + int flags = 0); + + // an option taking a value of the given type + void AddOption(const wxString& name, const wxString& lng = wxEmptyString, + const wxString& desc = wxEmptyString, + wxCmdLineParamType type = wxCMD_LINE_VAL_STRING, + int flags = 0); + + // a parameter + void AddParam(const wxString& desc = wxEmptyString, + wxCmdLineParamType type = wxCMD_LINE_VAL_STRING, + int flags = 0); + + // actions + // ------- + + // parse the command line, return 0 if ok, -1 if "-h" or "--help" option + // was encountered and the help message was given or a positive value if a + // syntax error occurred + // + // if showUsage is true, Usage() is called in case of syntax error or if + // help was requested + int Parse(bool showUsage = true); + + // give the usage message describing all program options + void Usage(); + + // get the command line arguments + // ------------------------------ + + // returns true if the given switch was found + bool Found(const wxString& name) const; + + // returns true if an option taking a string value was found and stores the + // value in the provided pointer + bool Found(const wxString& name, wxString *value) const; + + // returns true if an option taking an integer value was found and stores + // the value in the provided pointer + bool Found(const wxString& name, long *value) const; + +#if wxUSE_DATETIME + // returns true if an option taking a date value was found and stores the + // value in the provided pointer + bool Found(const wxString& name, wxDateTime *value) const; +#endif // wxUSE_DATETIME + + // gets the number of parameters found + size_t GetParamCount() const; + + // gets the value of Nth parameter (as string only for now) + wxString GetParam(size_t n = 0u) const; + + // Resets switches and options + void Reset(); + + // break down the command line in arguments + static wxArrayString ConvertStringToArgs(const wxChar *cmdline); + +private: + // get usage string + wxString GetUsageString(); + + // common part of all ctors + void Init(); + + struct wxCmdLineParserData *m_data; + + DECLARE_NO_COPY_CLASS(wxCmdLineParser) +}; + +#else // !wxUSE_CMDLINE_PARSER + +// this function is always available (even if !wxUSE_CMDLINE_PARSER) because it +// is used by wxWin itself under Windows +class WXDLLIMPEXP_BASE wxCmdLineParser +{ +public: + static wxArrayString ConvertStringToArgs(const wxChar *cmdline); +}; + +#endif // wxUSE_CMDLINE_PARSER/!wxUSE_CMDLINE_PARSER + +#endif // _WX_CMDLINE_H_ + diff --git a/Externals/wxWidgets/include/wx/cmdproc.h b/Externals/wxWidgets/include/wx/cmdproc.h new file mode 100644 index 0000000000..930cad7534 --- /dev/null +++ b/Externals/wxWidgets/include/wx/cmdproc.h @@ -0,0 +1,144 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/cmdproc.h +// Purpose: undo/redo capable command processing framework +// Author: Julian Smart (extracted from docview.h by VZ) +// Modified by: +// Created: 05.11.00 +// RCS-ID: $Id: cmdproc.h 49804 2007-11-10 01:09:42Z VZ $ +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CMDPROC_H_ +#define _WX_CMDPROC_H_ + +#include "wx/defs.h" +#include "wx/object.h" +#include "wx/list.h" + +class WXDLLIMPEXP_FWD_CORE wxMenu; + +// ---------------------------------------------------------------------------- +// wxCommand: a single command capable of performing itself +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxCommand : public wxObject +{ +public: + wxCommand(bool canUndoIt = false, const wxString& name = wxEmptyString); + virtual ~wxCommand(){} + + // Override this to perform a command + virtual bool Do() = 0; + + // Override this to undo a command + virtual bool Undo() = 0; + + virtual bool CanUndo() const { return m_canUndo; } + virtual wxString GetName() const { return m_commandName; } + +protected: + bool m_canUndo; + wxString m_commandName; + +private: + DECLARE_CLASS(wxCommand) +}; + +// ---------------------------------------------------------------------------- +// wxCommandProcessor: wxCommand manager +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxCommandProcessor : public wxObject +{ +public: + // if max number of commands is -1, it is unlimited + wxCommandProcessor(int maxCommands = -1); + virtual ~wxCommandProcessor(); + + // Pass a command to the processor. The processor calls Do(); if + // successful, is appended to the command history unless storeIt is false. + virtual bool Submit(wxCommand *command, bool storeIt = true); + + // just store the command without executing it + virtual void Store(wxCommand *command); + + virtual bool Undo(); + virtual bool Redo(); + virtual bool CanUndo() const; + virtual bool CanRedo() const; + + // Initialises the current command and menu strings. + virtual void Initialize(); + + // Sets the Undo/Redo menu strings for the current menu. + virtual void SetMenuStrings(); + + // Gets the current Undo menu label. + wxString GetUndoMenuLabel() const; + + // Gets the current Undo menu label. + wxString GetRedoMenuLabel() const; + +#if wxUSE_MENUS + // Call this to manage an edit menu. + void SetEditMenu(wxMenu *menu) { m_commandEditMenu = menu; } + wxMenu *GetEditMenu() const { return m_commandEditMenu; } +#endif // wxUSE_MENUS + + // command list access + wxList& GetCommands() { return m_commands; } + const wxList& GetCommands() const { return m_commands; } + wxCommand *GetCurrentCommand() const + { + return (wxCommand *)(m_currentCommand ? m_currentCommand->GetData() : NULL); + } + int GetMaxCommands() const { return m_maxNoCommands; } + virtual void ClearCommands(); + + // Has the current project been changed? + virtual bool IsDirty() const + { + return m_currentCommand && (m_lastSavedCommand != m_currentCommand); + } + + // Mark the current command as the one where the last save took place + void MarkAsSaved() + { + m_lastSavedCommand = m_currentCommand; + } + + + // By default, the accelerators are "\tCtrl+Z" and "\tCtrl+Y" + const wxString& GetUndoAccelerator() const { return m_undoAccelerator; } + const wxString& GetRedoAccelerator() const { return m_redoAccelerator; } + + void SetUndoAccelerator(const wxString& accel) { m_undoAccelerator = accel; } + void SetRedoAccelerator(const wxString& accel) { m_redoAccelerator = accel; } + +protected: + // for further flexibility, command processor doesn't call wxCommand::Do() + // and Undo() directly but uses these functions which can be overridden in + // the derived class + virtual bool DoCommand(wxCommand& cmd); + virtual bool UndoCommand(wxCommand& cmd); + + int m_maxNoCommands; + wxList m_commands; + wxList::compatibility_iterator m_currentCommand, + m_lastSavedCommand; + +#if wxUSE_MENUS + wxMenu* m_commandEditMenu; +#endif // wxUSE_MENUS + + wxString m_undoAccelerator; + wxString m_redoAccelerator; + +private: + DECLARE_DYNAMIC_CLASS(wxCommandProcessor) + DECLARE_NO_COPY_CLASS(wxCommandProcessor) +}; + +#endif // _WX_CMDPROC_H_ + diff --git a/Externals/wxWidgets/include/wx/cmndata.h b/Externals/wxWidgets/include/wx/cmndata.h new file mode 100644 index 0000000000..69a0dc5790 --- /dev/null +++ b/Externals/wxWidgets/include/wx/cmndata.h @@ -0,0 +1,454 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/cmndata.h +// Purpose: Common GDI data classes +// Author: Julian Smart and others +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: cmndata.h 45498 2007-04-16 13:03:05Z VZ $ +// Copyright: (c) +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CMNDATA_H_BASE_ +#define _WX_CMNDATA_H_BASE_ + +#include "wx/window.h" +#include "wx/font.h" +#include "wx/encinfo.h" +#include "wx/colour.h" +#include "wx/gdicmn.h" + +#if wxUSE_STREAMS +#include "wx/stream.h" +#endif + + +class WXDLLEXPORT wxPrintNativeDataBase; + + +class WXDLLEXPORT wxColourData: public wxObject +{ +public: + wxColourData(); + wxColourData(const wxColourData& data); + virtual ~wxColourData(); + + void SetChooseFull(bool flag) { m_chooseFull = flag; } + bool GetChooseFull() const { return m_chooseFull; } + void SetColour(const wxColour& colour) { m_dataColour = colour; } + const wxColour& GetColour() const { return m_dataColour; } + wxColour& GetColour() { return m_dataColour; } + + // Array of 16 custom colours + void SetCustomColour(int i, const wxColour& colour); + wxColour GetCustomColour(int i); + + void operator=(const wxColourData& data); + +public: + wxColour m_dataColour; + wxColour m_custColours[16]; + bool m_chooseFull; + +private: + DECLARE_DYNAMIC_CLASS(wxColourData) +}; + +class WXDLLEXPORT wxFontData : public wxObject +{ +public: + wxFontData(); + virtual ~wxFontData(); + + wxFontData(const wxFontData& data) + : wxObject(), + m_fontColour(data.m_fontColour), + m_showHelp(data.m_showHelp), + m_allowSymbols(data.m_allowSymbols), + m_enableEffects(data.m_enableEffects), + m_initialFont(data.m_initialFont), + m_chosenFont(data.m_chosenFont), + m_minSize(data.m_minSize), + m_maxSize(data.m_maxSize), + m_encoding(data.m_encoding), + m_encodingInfo(data.m_encodingInfo) + { + } + + wxFontData& operator=(const wxFontData& data) + { + wxObject::operator=(data); + m_fontColour = data.m_fontColour; + m_showHelp = data.m_showHelp; + m_allowSymbols = data.m_allowSymbols; + m_enableEffects = data.m_enableEffects; + m_initialFont = data.m_initialFont; + m_chosenFont = data.m_chosenFont; + m_minSize = data.m_minSize; + m_maxSize = data.m_maxSize; + m_encoding = data.m_encoding; + m_encodingInfo = data.m_encodingInfo; + return *this; + } + + void SetAllowSymbols(bool flag) { m_allowSymbols = flag; } + bool GetAllowSymbols() const { return m_allowSymbols; } + + void SetColour(const wxColour& colour) { m_fontColour = colour; } + const wxColour& GetColour() const { return m_fontColour; } + + void SetShowHelp(bool flag) { m_showHelp = flag; } + bool GetShowHelp() const { return m_showHelp; } + + void EnableEffects(bool flag) { m_enableEffects = flag; } + bool GetEnableEffects() const { return m_enableEffects; } + + void SetInitialFont(const wxFont& font) { m_initialFont = font; } + wxFont GetInitialFont() const { return m_initialFont; } + + void SetChosenFont(const wxFont& font) { m_chosenFont = font; } + wxFont GetChosenFont() const { return m_chosenFont; } + + void SetRange(int minRange, int maxRange) { m_minSize = minRange; m_maxSize = maxRange; } + + // encoding info is split into 2 parts: the logical wxWin encoding + // (wxFontEncoding) and a structure containing the native parameters for + // it (wxNativeEncodingInfo) + wxFontEncoding GetEncoding() const { return m_encoding; } + void SetEncoding(wxFontEncoding encoding) { m_encoding = encoding; } + + wxNativeEncodingInfo& EncodingInfo() { return m_encodingInfo; } + + + // public for backwards compatibility only: don't use directly +public: + wxColour m_fontColour; + bool m_showHelp; + bool m_allowSymbols; + bool m_enableEffects; + wxFont m_initialFont; + wxFont m_chosenFont; + int m_minSize; + int m_maxSize; + +private: + wxFontEncoding m_encoding; + wxNativeEncodingInfo m_encodingInfo; + +private: + DECLARE_DYNAMIC_CLASS(wxFontData) +}; + +#if wxUSE_PRINTING_ARCHITECTURE +/* + * wxPrintData + * Encapsulates printer information (not printer dialog information) + */ + +enum wxPrintBin +{ + wxPRINTBIN_DEFAULT, + + wxPRINTBIN_ONLYONE, + wxPRINTBIN_LOWER, + wxPRINTBIN_MIDDLE, + wxPRINTBIN_MANUAL, + wxPRINTBIN_ENVELOPE, + wxPRINTBIN_ENVMANUAL, + wxPRINTBIN_AUTO, + wxPRINTBIN_TRACTOR, + wxPRINTBIN_SMALLFMT, + wxPRINTBIN_LARGEFMT, + wxPRINTBIN_LARGECAPACITY, + wxPRINTBIN_CASSETTE, + wxPRINTBIN_FORMSOURCE, + + wxPRINTBIN_USER +}; + +const int wxPRINTMEDIA_DEFAULT = 0; + +class WXDLLEXPORT wxPrintData: public wxObject +{ +public: + wxPrintData(); + wxPrintData(const wxPrintData& printData); + virtual ~wxPrintData(); + + int GetNoCopies() const { return m_printNoCopies; } + bool GetCollate() const { return m_printCollate; } + int GetOrientation() const { return m_printOrientation; } + bool IsOrientationReversed() const { return m_printOrientationReversed; } + + // Is this data OK for showing the print dialog? + bool Ok() const { return IsOk(); } + bool IsOk() const ; + + const wxString& GetPrinterName() const { return m_printerName; } + bool GetColour() const { return m_colour; } + wxDuplexMode GetDuplex() const { return m_duplexMode; } + wxPaperSize GetPaperId() const { return m_paperId; } + const wxSize& GetPaperSize() const { return m_paperSize; } // Not used yet: confusable with paper size + // in wxPageSetupDialogData + wxPrintQuality GetQuality() const { return m_printQuality; } + wxPrintBin GetBin() const { return m_bin; } + wxPrintMode GetPrintMode() const { return m_printMode; } + int GetMedia() const { return m_media; } + + void SetNoCopies(int v) { m_printNoCopies = v; } + void SetCollate(bool flag) { m_printCollate = flag; } + void SetOrientation(int orient) { m_printOrientation = orient; } + void SetOrientationReversed(bool reversed) { m_printOrientationReversed = reversed; } + + void SetPrinterName(const wxString& name) { m_printerName = name; } + void SetColour(bool colour) { m_colour = colour; } + void SetDuplex(wxDuplexMode duplex) { m_duplexMode = duplex; } + void SetPaperId(wxPaperSize sizeId) { m_paperId = sizeId; } + void SetPaperSize(const wxSize& sz) { m_paperSize = sz; } + void SetQuality(wxPrintQuality quality) { m_printQuality = quality; } + void SetBin(wxPrintBin bin) { m_bin = bin; } + void SetMedia(int media) { m_media = media; } + void SetPrintMode(wxPrintMode printMode) { m_printMode = printMode; } + + wxString GetFilename() const { return m_filename; } + void SetFilename( const wxString &filename ) { m_filename = filename; } + + void operator=(const wxPrintData& data); + + char* GetPrivData() const { return m_privData; } + int GetPrivDataLen() const { return m_privDataLen; } + void SetPrivData( char *privData, int len ); + + +#if WXWIN_COMPATIBILITY_2_4 + // PostScript-specific data + wxString GetPrinterCommand() const; + wxString GetPrinterOptions() const; + wxString GetPreviewCommand() const; + wxString GetFontMetricPath() const; + double GetPrinterScaleX() const; + double GetPrinterScaleY() const; + long GetPrinterTranslateX() const; + long GetPrinterTranslateY() const; + + void SetPrinterCommand(const wxString& command); + void SetPrinterOptions(const wxString& options); + void SetPreviewCommand(const wxString& command); + void SetFontMetricPath(const wxString& path); + void SetPrinterScaleX(double x); + void SetPrinterScaleY(double y); + void SetPrinterScaling(double x, double y); + void SetPrinterTranslateX(long x); + void SetPrinterTranslateY(long y); + void SetPrinterTranslation(long x, long y); +#endif + + // Convert between wxPrintData and native data + void ConvertToNative(); + void ConvertFromNative(); + // Holds the native print data + wxPrintNativeDataBase *GetNativeData() const { return m_nativeData; } + +private: + wxPrintBin m_bin; + int m_media; + wxPrintMode m_printMode; + + int m_printNoCopies; + int m_printOrientation; + bool m_printOrientationReversed; + bool m_printCollate; + + wxString m_printerName; + bool m_colour; + wxDuplexMode m_duplexMode; + wxPrintQuality m_printQuality; + wxPaperSize m_paperId; + wxSize m_paperSize; + + wxString m_filename; + + char* m_privData; + int m_privDataLen; + + wxPrintNativeDataBase *m_nativeData; + +private: + DECLARE_DYNAMIC_CLASS(wxPrintData) +}; + +/* + * wxPrintDialogData + * Encapsulates information displayed and edited in the printer dialog box. + * Contains a wxPrintData object which is filled in according to the values retrieved + * from the dialog. + */ + +class WXDLLEXPORT wxPrintDialogData: public wxObject +{ +public: + wxPrintDialogData(); + wxPrintDialogData(const wxPrintDialogData& dialogData); + wxPrintDialogData(const wxPrintData& printData); + virtual ~wxPrintDialogData(); + + int GetFromPage() const { return m_printFromPage; } + int GetToPage() const { return m_printToPage; } + int GetMinPage() const { return m_printMinPage; } + int GetMaxPage() const { return m_printMaxPage; } + int GetNoCopies() const { return m_printNoCopies; } + bool GetAllPages() const { return m_printAllPages; } + bool GetSelection() const { return m_printSelection; } + bool GetCollate() const { return m_printCollate; } + bool GetPrintToFile() const { return m_printToFile; } +#if WXWIN_COMPATIBILITY_2_4 + bool GetSetupDialog() const { return m_printSetupDialog; } +#endif + void SetFromPage(int v) { m_printFromPage = v; } + void SetToPage(int v) { m_printToPage = v; } + void SetMinPage(int v) { m_printMinPage = v; } + void SetMaxPage(int v) { m_printMaxPage = v; } + void SetNoCopies(int v) { m_printNoCopies = v; } + void SetAllPages(bool flag) { m_printAllPages = flag; } + void SetSelection(bool flag) { m_printSelection = flag; } + void SetCollate(bool flag) { m_printCollate = flag; } + void SetPrintToFile(bool flag) { m_printToFile = flag; } +#if WXWIN_COMPATIBILITY_2_4 + void SetSetupDialog(bool flag) { m_printSetupDialog = flag; } +#endif + void EnablePrintToFile(bool flag) { m_printEnablePrintToFile = flag; } + void EnableSelection(bool flag) { m_printEnableSelection = flag; } + void EnablePageNumbers(bool flag) { m_printEnablePageNumbers = flag; } + void EnableHelp(bool flag) { m_printEnableHelp = flag; } + + bool GetEnablePrintToFile() const { return m_printEnablePrintToFile; } + bool GetEnableSelection() const { return m_printEnableSelection; } + bool GetEnablePageNumbers() const { return m_printEnablePageNumbers; } + bool GetEnableHelp() const { return m_printEnableHelp; } + + // Is this data OK for showing the print dialog? + bool Ok() const { return IsOk(); } + bool IsOk() const { return m_printData.Ok() ; } + + wxPrintData& GetPrintData() { return m_printData; } + void SetPrintData(const wxPrintData& printData) { m_printData = printData; } + + void operator=(const wxPrintDialogData& data); + void operator=(const wxPrintData& data); // Sets internal m_printData member + +private: + int m_printFromPage; + int m_printToPage; + int m_printMinPage; + int m_printMaxPage; + int m_printNoCopies; + bool m_printAllPages; + bool m_printCollate; + bool m_printToFile; + bool m_printSelection; + bool m_printEnableSelection; + bool m_printEnablePageNumbers; + bool m_printEnableHelp; + bool m_printEnablePrintToFile; +#if WXWIN_COMPATIBILITY_2_4 + bool m_printSetupDialog; +#endif + wxPrintData m_printData; + +private: + DECLARE_DYNAMIC_CLASS(wxPrintDialogData) +}; + +/* +* This is the data used (and returned) by the wxPageSetupDialog. +*/ + +// Compatibility with old name +#define wxPageSetupData wxPageSetupDialogData + +class WXDLLEXPORT wxPageSetupDialogData: public wxObject +{ +public: + wxPageSetupDialogData(); + wxPageSetupDialogData(const wxPageSetupDialogData& dialogData); + wxPageSetupDialogData(const wxPrintData& printData); + virtual ~wxPageSetupDialogData(); + + wxSize GetPaperSize() const { return m_paperSize; } + wxPaperSize GetPaperId() const { return m_printData.GetPaperId(); } + wxPoint GetMinMarginTopLeft() const { return m_minMarginTopLeft; } + wxPoint GetMinMarginBottomRight() const { return m_minMarginBottomRight; } + wxPoint GetMarginTopLeft() const { return m_marginTopLeft; } + wxPoint GetMarginBottomRight() const { return m_marginBottomRight; } + + bool GetDefaultMinMargins() const { return m_defaultMinMargins; } + bool GetEnableMargins() const { return m_enableMargins; } + bool GetEnableOrientation() const { return m_enableOrientation; } + bool GetEnablePaper() const { return m_enablePaper; } + bool GetEnablePrinter() const { return m_enablePrinter; } + bool GetDefaultInfo() const { return m_getDefaultInfo; } + bool GetEnableHelp() const { return m_enableHelp; } + + // Is this data OK for showing the page setup dialog? + bool Ok() const { return IsOk(); } + bool IsOk() const { return m_printData.Ok() ; } + + // If a corresponding paper type is found in the paper database, will set the m_printData + // paper size id member as well. + void SetPaperSize(const wxSize& sz); + + void SetPaperId(wxPaperSize id) { m_printData.SetPaperId(id); } + + // Sets the wxPrintData id, plus the paper width/height if found in the paper database. + void SetPaperSize(wxPaperSize id); + + void SetMinMarginTopLeft(const wxPoint& pt) { m_minMarginTopLeft = pt; } + void SetMinMarginBottomRight(const wxPoint& pt) { m_minMarginBottomRight = pt; } + void SetMarginTopLeft(const wxPoint& pt) { m_marginTopLeft = pt; } + void SetMarginBottomRight(const wxPoint& pt) { m_marginBottomRight = pt; } + void SetDefaultMinMargins(bool flag) { m_defaultMinMargins = flag; } + void SetDefaultInfo(bool flag) { m_getDefaultInfo = flag; } + + void EnableMargins(bool flag) { m_enableMargins = flag; } + void EnableOrientation(bool flag) { m_enableOrientation = flag; } + void EnablePaper(bool flag) { m_enablePaper = flag; } + void EnablePrinter(bool flag) { m_enablePrinter = flag; } + void EnableHelp(bool flag) { m_enableHelp = flag; } + + // Use paper size defined in this object to set the wxPrintData + // paper id + void CalculateIdFromPaperSize(); + + // Use paper id in wxPrintData to set this object's paper size + void CalculatePaperSizeFromId(); + + wxPageSetupDialogData& operator=(const wxPageSetupData& data); + wxPageSetupDialogData& operator=(const wxPrintData& data); + + wxPrintData& GetPrintData() { return m_printData; } + const wxPrintData& GetPrintData() const { return m_printData; } + void SetPrintData(const wxPrintData& printData); + +private: + wxSize m_paperSize; // The dimensions selected by the user (on return, same as in wxPrintData?) + wxPoint m_minMarginTopLeft; + wxPoint m_minMarginBottomRight; + wxPoint m_marginTopLeft; + wxPoint m_marginBottomRight; + bool m_defaultMinMargins; + bool m_enableMargins; + bool m_enableOrientation; + bool m_enablePaper; + bool m_enablePrinter; + bool m_getDefaultInfo; // Equiv. to PSD_RETURNDEFAULT + bool m_enableHelp; + wxPrintData m_printData; + +private: + DECLARE_DYNAMIC_CLASS(wxPageSetupDialogData) +}; + +#endif // wxUSE_PRINTING_ARCHITECTURE + +#endif +// _WX_CMNDATA_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/collpane.h b/Externals/wxWidgets/include/wx/collpane.h new file mode 100644 index 0000000000..483d33b264 --- /dev/null +++ b/Externals/wxWidgets/include/wx/collpane.h @@ -0,0 +1,104 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/collpane.h +// Purpose: wxCollapsiblePane +// Author: Francesco Montorsi +// Modified by: +// Created: 8/10/2006 +// RCS-ID: $Id: collpane.h 43300 2006-11-11 07:32:08Z RD $ +// Copyright: (c) Francesco Montorsi +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_COLLAPSABLE_PANE_H_BASE_ +#define _WX_COLLAPSABLE_PANE_H_BASE_ + +#include "wx/defs.h" + + +#if wxUSE_COLLPANE + +#include "wx/control.h" + + +// ---------------------------------------------------------------------------- +// wxCollapsiblePaneBase: interface for wxCollapsiblePane +// ---------------------------------------------------------------------------- + +#define wxCP_DEFAULT_STYLE (wxTAB_TRAVERSAL | wxNO_BORDER) +#define wxCP_NO_TLW_RESIZE (0x0002) + +class WXDLLIMPEXP_CORE wxCollapsiblePaneBase : public wxControl +{ +public: + wxCollapsiblePaneBase() {} + + virtual void Collapse(bool collapse = true) = 0; + void Expand() { Collapse(false); } + + virtual bool IsCollapsed() const = 0; + bool IsExpanded() const { return !IsCollapsed(); } + + virtual wxWindow *GetPane() const = 0; + + virtual wxString GetLabel() const = 0; + virtual void SetLabel(const wxString& label) = 0; +}; + + +// ---------------------------------------------------------------------------- +// event types and macros +// ---------------------------------------------------------------------------- + +BEGIN_DECLARE_EVENT_TYPES() + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_CORE, wxEVT_COMMAND_COLLPANE_CHANGED, 1102) +END_DECLARE_EVENT_TYPES() + +class WXDLLIMPEXP_CORE wxCollapsiblePaneEvent : public wxCommandEvent +{ +public: + wxCollapsiblePaneEvent() {} + wxCollapsiblePaneEvent(wxObject *generator, int id, bool collapsed) + : wxCommandEvent(wxEVT_COMMAND_COLLPANE_CHANGED, id), + m_bCollapsed(collapsed) + { + SetEventObject(generator); + } + + bool GetCollapsed() const { return m_bCollapsed; } + void SetCollapsed(bool c) { m_bCollapsed = c; } + + + // default copy ctor, assignment operator and dtor are ok + virtual wxEvent *Clone() const { return new wxCollapsiblePaneEvent(*this); } + +private: + bool m_bCollapsed; + + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxCollapsiblePaneEvent) +}; + +// ---------------------------------------------------------------------------- +// event types and macros +// ---------------------------------------------------------------------------- + +typedef void (wxEvtHandler::*wxCollapsiblePaneEventFunction)(wxCollapsiblePaneEvent&); + +#define wxCollapsiblePaneEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxCollapsiblePaneEventFunction, &func) + +#define EVT_COLLAPSIBLEPANE_CHANGED(id, fn) \ + wx__DECLARE_EVT1(wxEVT_COMMAND_COLLPANE_CHANGED, id, wxCollapsiblePaneEventHandler(fn)) + + +#if defined(__WXGTK24__) && !defined(__WXUNIVERSAL__) + #include "wx/gtk/collpane.h" +#else + #include "wx/generic/collpaneg.h" + + // use #define and not a typedef to allow forward declaring the class + #define wxCollapsiblePane wxGenericCollapsiblePane +#endif + +#endif // wxUSE_COLLPANE + +#endif // _WX_COLLAPSABLE_PANE_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/colordlg.h b/Externals/wxWidgets/include/wx/colordlg.h new file mode 100644 index 0000000000..f171920785 --- /dev/null +++ b/Externals/wxWidgets/include/wx/colordlg.h @@ -0,0 +1,41 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/colrdlgg.h +// Purpose: wxColourDialog +// Author: Vadim Zeitiln +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: colordlg.h 36623 2006-01-02 14:26:36Z JS $ +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_COLORDLG_H_BASE_ +#define _WX_COLORDLG_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_COLOURDLG + +#if defined(__WXMSW__) && !defined(__WXUNIVERSAL__) + #include "wx/msw/colordlg.h" +#elif defined(__WXMAC__) && !defined(__WXUNIVERSAL__) + #include "wx/mac/colordlg.h" +#elif defined(__WXGTK20__) && !defined(__WXUNIVERSAL__) + #include "wx/gtk/colordlg.h" +#elif defined(__WXPALMOS__) + #include "wx/palmos/colordlg.h" +#else + #include "wx/generic/colrdlgg.h" + + #define wxColourDialog wxGenericColourDialog +#endif + +// get the colour from user and return it +wxColour WXDLLEXPORT +wxGetColourFromUser(wxWindow *parent = (wxWindow *)NULL, + const wxColour& colInit = wxNullColour, const wxString& caption = wxEmptyString); + +#endif // wxUSE_COLOURDLG + +#endif + // _WX_COLORDLG_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/colour.h b/Externals/wxWidgets/include/wx/colour.h new file mode 100644 index 0000000000..11d09747bc --- /dev/null +++ b/Externals/wxWidgets/include/wx/colour.h @@ -0,0 +1,154 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/colour.h +// Purpose: wxColourBase definition +// Author: Julian Smart +// Modified by: Francesco Montorsi +// Created: +// RCS-ID: $Id: colour.h 45981 2007-05-11 22:41:50Z VZ $ +// Copyright: Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_COLOUR_H_BASE_ +#define _WX_COLOUR_H_BASE_ + +#include "wx/defs.h" +#include "wx/gdiobj.h" + + +class WXDLLEXPORT wxColour; + +// the standard wxColour constructors; +// this macro avoids to repeat these lines across all colour.h files, since +// Set() is a virtual function and thus cannot be called by wxColourBase +// constructors +#define DEFINE_STD_WXCOLOUR_CONSTRUCTORS \ + wxColour( ChannelType red, ChannelType green, ChannelType blue, \ + ChannelType alpha = wxALPHA_OPAQUE ) \ + { Set(red, green, blue, alpha); } \ + wxColour( unsigned long colRGB ) { Set(colRGB); } \ + wxColour(const wxString &colourName) { Set(colourName); } \ + wxColour(const wxChar *colourName) { Set(colourName); } + + +// flags for wxColour -> wxString conversion (see wxColour::GetAsString) +#define wxC2S_NAME 1 // return colour name, when possible +#define wxC2S_CSS_SYNTAX 2 // return colour in rgb(r,g,b) syntax +#define wxC2S_HTML_SYNTAX 4 // return colour in #rrggbb syntax + + +const unsigned char wxALPHA_TRANSPARENT = 0; +const unsigned char wxALPHA_OPAQUE = 0xff; + +// ---------------------------------------------------------------------------- +// wxVariant support +// ---------------------------------------------------------------------------- + +#if wxUSE_VARIANT +#include "wx/variant.h" +DECLARE_VARIANT_OBJECT_EXPORTED(wxColour,WXDLLEXPORT) +#endif + +//----------------------------------------------------------------------------- +// wxColourBase: this class has no data members, just some functions to avoid +// code redundancy in all native wxColour implementations +//----------------------------------------------------------------------------- + +class WXDLLEXPORT wxColourBase : public wxGDIObject +{ +public: + // type of a single colour component + typedef unsigned char ChannelType; + + wxColourBase() {} + virtual ~wxColourBase() {} + + + // Set() functions + // --------------- + + void Set(ChannelType red, + ChannelType green, + ChannelType blue, + ChannelType alpha = wxALPHA_OPAQUE) + { InitRGBA(red,green,blue, alpha); } + + // implemented in colourcmn.cpp + bool Set(const wxChar *str) + { return FromString(str); } + + bool Set(const wxString &str) + { return FromString(str); } + + void Set(unsigned long colRGB) + { + // we don't need to know sizeof(long) here because we assume that the three + // least significant bytes contain the R, G and B values + Set((ChannelType)(0xFF & colRGB), + (ChannelType)(0xFF & (colRGB >> 8)), + (ChannelType)(0xFF & (colRGB >> 16))); + } + + + + // accessors + // --------- + + virtual bool Ok() const { return IsOk(); } + virtual bool IsOk() const = 0; + + virtual ChannelType Red() const = 0; + virtual ChannelType Green() const = 0; + virtual ChannelType Blue() const = 0; + virtual ChannelType Alpha() const + { return wxALPHA_OPAQUE ; } + + // implemented in colourcmn.cpp + virtual wxString GetAsString(long flags = wxC2S_NAME | wxC2S_CSS_SYNTAX) const; + + + + // old, deprecated + // --------------- + +#if WXWIN_COMPATIBILITY_2_6 + wxDEPRECATED( static wxColour CreateByName(const wxString& name) ); + wxDEPRECATED( void InitFromName(const wxString& col) ); +#endif + +protected: + virtual void + InitRGBA(ChannelType r, ChannelType g, ChannelType b, ChannelType a) = 0; + + virtual bool FromString(const wxChar *s); +}; + + + +#if defined(__WXPALMOS__) + #include "wx/generic/colour.h" +#elif defined(__WXMSW__) + #include "wx/msw/colour.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/colour.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/colour.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/colour.h" +#elif defined(__WXMGL__) + #include "wx/generic/colour.h" +#elif defined(__WXDFB__) + #include "wx/generic/colour.h" +#elif defined(__WXX11__) + #include "wx/x11/colour.h" +#elif defined(__WXMAC__) + #include "wx/mac/colour.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/colour.h" +#elif defined(__WXPM__) + #include "wx/os2/colour.h" +#endif + +#define wxColor wxColour + +#endif // _WX_COLOUR_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/combo.h b/Externals/wxWidgets/include/wx/combo.h new file mode 100644 index 0000000000..64d0d0888b --- /dev/null +++ b/Externals/wxWidgets/include/wx/combo.h @@ -0,0 +1,746 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/combo.h +// Purpose: wxComboCtrl declaration +// Author: Jaakko Salli +// Modified by: +// Created: Apr-30-2006 +// RCS-ID: $Id: combo.h 49804 2007-11-10 01:09:42Z VZ $ +// Copyright: (c) Jaakko Salli +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_COMBOCONTROL_H_BASE_ +#define _WX_COMBOCONTROL_H_BASE_ + + +/* + A few words about all the classes defined in this file are probably in + order: why do we need extra wxComboCtrl and wxComboPopup classes? + + This is because a traditional combobox is a combination of a text control + (with a button allowing to open the pop down list) with a listbox and + wxComboBox class is exactly such control, however we want to also have other + combinations - in fact, we want to allow anything at all to be used as pop + down list, not just a wxListBox. + + So we define a base wxComboCtrl which can use any control as pop down + list and wxComboBox deriving from it which implements the standard wxWidgets + combobox API. wxComboCtrl needs to be told somehow which control to use + and this is done by SetPopupControl(). However, we need something more than + just a wxControl in this method as, for example, we need to call + SetSelection("initial text value") and wxControl doesn't have such method. + So we also need a wxComboPopup which is just a very simple interface which + must be implemented by a control to be usable as a popup. + + We couldn't derive wxComboPopup from wxControl as this would make it + impossible to have a class deriving from both wxListBx and from it, so + instead it is just a mix-in. + */ + + +#include "wx/defs.h" + +#if wxUSE_COMBOCTRL + +#include "wx/control.h" +#include "wx/renderer.h" // this is needed for wxCONTROL_XXX flags +#include "wx/bitmap.h" // wxBitmap used by-value + +class WXDLLIMPEXP_FWD_CORE wxTextCtrl; +class WXDLLIMPEXP_FWD_CORE wxComboPopup; + +// +// New window styles for wxComboCtrlBase +// +enum +{ + // Double-clicking a read-only combo triggers call to popup's OnComboPopup. + // In wxOwnerDrawnComboBox, for instance, it cycles item. + wxCC_SPECIAL_DCLICK = 0x0100, + + // Dropbutton acts like standard push button. + wxCC_STD_BUTTON = 0x0200 +}; + + +// wxComboCtrl internal flags +enum +{ + // First those that can be passed to Customize. + // It is Windows style for all flags to be clear. + + // Button is preferred outside the border (GTK style) + wxCC_BUTTON_OUTSIDE_BORDER = 0x0001, + // Show popup on mouse up instead of mouse down (which is the Windows style) + wxCC_POPUP_ON_MOUSE_UP = 0x0002, + // All text is not automatically selected on click + wxCC_NO_TEXT_AUTO_SELECT = 0x0004, + + // Internal use: signals creation is complete + wxCC_IFLAG_CREATED = 0x0100, + // Internal use: really put button outside + wxCC_IFLAG_BUTTON_OUTSIDE = 0x0200, + // Internal use: SetTextIndent has been called + wxCC_IFLAG_INDENT_SET = 0x0400, + // Internal use: Set wxTAB_TRAVERSAL to parent when popup is dismissed + wxCC_IFLAG_PARENT_TAB_TRAVERSAL = 0x0800, + // Internal use: Secondary popup window type should be used (if available). + wxCC_IFLAG_USE_ALT_POPUP = 0x1000, + // Internal use: Skip popup animation. + wxCC_IFLAG_DISABLE_POPUP_ANIM = 0x2000 +}; + + +// Flags used by PreprocessMouseEvent and HandleButtonMouseEvent +enum +{ + wxCC_MF_ON_BUTTON = 0x0001, // cursor is on dropbutton area + wxCC_MF_ON_CLICK_AREA = 0x0002 // cursor is on dropbutton or other area + // that can be clicked to show the popup. +}; + + +// Namespace for wxComboCtrl feature flags +struct wxComboCtrlFeatures +{ + enum + { + MovableButton = 0x0001, // Button can be on either side of control + BitmapButton = 0x0002, // Button may be replaced with bitmap + ButtonSpacing = 0x0004, // Button can have spacing from the edge + // of the control + TextIndent = 0x0008, // SetTextIndent can be used + PaintControl = 0x0010, // Combo control itself can be custom painted + PaintWritable = 0x0020, // A variable-width area in front of writable + // combo control's textctrl can be custom + // painted + Borderless = 0x0040, // wxNO_BORDER window style works + + // There are no feature flags for... + // PushButtonBitmapBackground - if its in wxRendererNative, then it should be + // not an issue to have it automatically under the bitmap. + + All = MovableButton|BitmapButton| + ButtonSpacing|TextIndent| + PaintControl|PaintWritable| + Borderless + }; +}; + + +class WXDLLEXPORT wxComboCtrlBase : public wxControl +{ + friend class wxComboPopup; +public: + // ctors and such + wxComboCtrlBase() : wxControl() { Init(); } + + bool Create(wxWindow *parent, + wxWindowID id, + const wxString& value, + const wxPoint& pos, + const wxSize& size, + long style, + const wxValidator& validator, + const wxString& name); + + virtual ~wxComboCtrlBase(); + + // show/hide popup window + virtual void ShowPopup(); + virtual void HidePopup(); + + // Override for totally custom combo action + virtual void OnButtonClick(); + + // return true if the popup is currently shown + bool IsPopupShown() const { return m_popupWinState == Visible; } + + // set interface class instance derived from wxComboPopup + // NULL popup can be used to indicate default in a derived class + void SetPopupControl( wxComboPopup* popup ) + { + DoSetPopupControl(popup); + } + + // get interface class instance derived from wxComboPopup + wxComboPopup* GetPopupControl() + { + EnsurePopupControl(); + return m_popupInterface; + } + + // get the popup window containing the popup control + wxWindow *GetPopupWindow() const { return m_winPopup; } + + // Get the text control which is part of the combobox. + wxTextCtrl *GetTextCtrl() const { return m_text; } + + // get the dropdown button which is part of the combobox + // note: its not necessarily a wxButton or wxBitmapButton + wxWindow *GetButton() const { return m_btn; } + + // forward these methods to all subcontrols + virtual bool Enable(bool enable = true); + virtual bool Show(bool show = true); + virtual bool SetFont(const wxFont& font); +#if wxUSE_VALIDATORS + virtual void SetValidator(const wxValidator &validator); + virtual wxValidator *GetValidator(); +#endif // wxUSE_VALIDATORS + + // wxTextCtrl methods - for readonly combo they should return + // without errors. + virtual wxString GetValue() const; + virtual void SetValue(const wxString& value); + virtual void Copy(); + virtual void Cut(); + virtual void Paste(); + virtual void SetInsertionPoint(long pos); + virtual void SetInsertionPointEnd(); + virtual long GetInsertionPoint() const; + virtual long GetLastPosition() const; + virtual void Replace(long from, long to, const wxString& value); + virtual void Remove(long from, long to); + virtual void SetSelection(long from, long to); + virtual void Undo(); + + // This method sets the text without affecting list selection + // (ie. wxComboPopup::SetStringValue doesn't get called). + void SetText(const wxString& value); + + // This method sets value and also optionally sends EVT_TEXT + // (needed by combo popups) + void SetValueWithEvent(const wxString& value, bool withEvent = true); + + // + // Popup customization methods + // + + // Sets minimum width of the popup. If wider than combo control, it will extend to the left. + // Remarks: + // * Value -1 indicates the default. + // * Custom popup may choose to ignore this (wxOwnerDrawnComboBox does not). + void SetPopupMinWidth( int width ) + { + m_widthMinPopup = width; + } + + // Sets preferred maximum height of the popup. + // Remarks: + // * Value -1 indicates the default. + // * Custom popup may choose to ignore this (wxOwnerDrawnComboBox does not). + void SetPopupMaxHeight( int height ) + { + m_heightPopup = height; + } + + // Extends popup size horizontally, relative to the edges of the combo control. + // Remarks: + // * Popup minimum width may override extLeft (ie. it has higher precedence). + // * Values 0 indicate default. + // * Custom popup may not take this fully into account (wxOwnerDrawnComboBox takes). + void SetPopupExtents( int extLeft, int extRight ) + { + m_extLeft = extLeft; + m_extRight = extRight; + } + + // Set width, in pixels, of custom paint area in writable combo. + // In read-only, used to indicate area that is not covered by the + // focus rectangle (which may or may not be drawn, depending on the + // popup type). + void SetCustomPaintWidth( int width ); + int GetCustomPaintWidth() const { return m_widthCustomPaint; } + + // Set side of the control to which the popup will align itself. + // Valid values are wxLEFT, wxRIGHT and 0. The default value 0 wmeans + // that the side of the button will be used. + void SetPopupAnchor( int anchorSide ) + { + m_anchorSide = anchorSide; + } + + // Set position of dropdown button. + // width: button width. <= 0 for default. + // height: button height. <= 0 for default. + // side: wxLEFT or wxRIGHT, indicates on which side the button will be placed. + // spacingX: empty space on sides of the button. Default is 0. + // Remarks: + // There is no spacingY - the button will be centered vertically. + void SetButtonPosition( int width = -1, + int height = -1, + int side = wxRIGHT, + int spacingX = 0 ); + + // Returns current size of the dropdown button. + wxSize GetButtonSize(); + + // + // Sets dropbutton to be drawn with custom bitmaps. + // + // bmpNormal: drawn when cursor is not on button + // pushButtonBg: Draw push button background below the image. + // NOTE! This is usually only properly supported on platforms with appropriate + // method in wxRendererNative. + // bmpPressed: drawn when button is depressed + // bmpHover: drawn when cursor hovers on button. This is ignored on platforms + // that do not generally display hover differently. + // bmpDisabled: drawn when combobox is disabled. + void SetButtonBitmaps( const wxBitmap& bmpNormal, + bool pushButtonBg = false, + const wxBitmap& bmpPressed = wxNullBitmap, + const wxBitmap& bmpHover = wxNullBitmap, + const wxBitmap& bmpDisabled = wxNullBitmap ); + + // + // This will set the space in pixels between left edge of the control and the + // text, regardless whether control is read-only (ie. no wxTextCtrl) or not. + // Platform-specific default can be set with value-1. + // Remarks + // * This method may do nothing on some native implementations. + void SetTextIndent( int indent ); + + // Returns actual indentation in pixels. + wxCoord GetTextIndent() const + { + return m_absIndent; + } + + // Returns area covered by the text field. + const wxRect& GetTextRect() const + { + return m_tcArea; + } + + // Call with enable as true to use a type of popup window that guarantees ability + // to focus the popup control, and normal function of common native controls. + // This alternative popup window is usually a wxDialog, and as such it's parent + // frame will appear as if the focus has been lost from it. + void UseAltPopupWindow( bool enable = true ) + { + wxASSERT_MSG( !m_winPopup, + wxT("call this only before SetPopupControl") ); + + if ( enable ) + m_iFlags |= wxCC_IFLAG_USE_ALT_POPUP; + else + m_iFlags &= ~wxCC_IFLAG_USE_ALT_POPUP; + } + + // Call with false to disable popup animation, if any. + void EnablePopupAnimation( bool enable = true ) + { + if ( enable ) + m_iFlags &= ~wxCC_IFLAG_DISABLE_POPUP_ANIM; + else + m_iFlags |= wxCC_IFLAG_DISABLE_POPUP_ANIM; + } + + // + // Utilies needed by the popups or native implementations + // + + // Returns true if given key combination should toggle the popup. + // NB: This is a separate from other keyboard handling because: + // 1) Replaceability. + // 2) Centralized code (otherwise it'd be split up between + // wxComboCtrl key handler and wxVListBoxComboPopup's + // key handler). + virtual bool IsKeyPopupToggle(const wxKeyEvent& event) const = 0; + + // Prepare background of combo control or an item in a dropdown list + // in a way typical on platform. This includes painting the focus/disabled + // background and setting the clipping region. + // Unless you plan to paint your own focus indicator, you should always call this + // in your wxComboPopup::PaintComboControl implementation. + // In addition, it sets pen and text colour to what looks good and proper + // against the background. + // flags: wxRendererNative flags: wxCONTROL_ISSUBMENU: is drawing a list item instead of combo control + // wxCONTROL_SELECTED: list item is selected + // wxCONTROL_DISABLED: control/item is disabled + virtual void PrepareBackground( wxDC& dc, const wxRect& rect, int flags ) const; + + // Returns true if focus indicator should be drawn in the control. + bool ShouldDrawFocus() const + { + const wxWindow* curFocus = FindFocus(); + return ( !IsPopupShown() && + (curFocus == this || (m_btn && curFocus == m_btn)) && + (m_windowStyle & wxCB_READONLY) ); + } + + // These methods return references to appropriate dropbutton bitmaps + const wxBitmap& GetBitmapNormal() const { return m_bmpNormal; } + const wxBitmap& GetBitmapPressed() const { return m_bmpPressed; } + const wxBitmap& GetBitmapHover() const { return m_bmpHover; } + const wxBitmap& GetBitmapDisabled() const { return m_bmpDisabled; } + + // Return internal flags + wxUint32 GetInternalFlags() const { return m_iFlags; } + + // Return true if Create has finished + bool IsCreated() const { return m_iFlags & wxCC_IFLAG_CREATED ? true : false; } + + // common code to be called on popup hide/dismiss + void OnPopupDismiss(); + + // PopupShown states + enum + { + Hidden = 0, + //Closing = 1, + Animating = 2, + Visible = 3 + }; + + bool IsPopupWindowState( int state ) const { return (state == m_popupWinState) ? true : false; } + + wxByte GetPopupWindowState() const { return m_popupWinState; } + + // Set value returned by GetMainWindowOfCompositeControl + void SetCtrlMainWnd( wxWindow* wnd ) { m_mainCtrlWnd = wnd; } + +protected: + + // + // Override these for customization purposes + // + + // called from wxSizeEvent handler + virtual void OnResize() = 0; + + // Return native text identation (for pure text, not textctrl) + virtual wxCoord GetNativeTextIndent() const; + + // Called in syscolourchanged handler and base create + virtual void OnThemeChange(); + + // Creates wxTextCtrl. + // extraStyle: Extra style parameters + void CreateTextCtrl( int extraStyle, const wxValidator& validator ); + + // Installs standard input handler to combo (and optionally to the textctrl) + void InstallInputHandlers(); + + // flags for DrawButton() + enum + { + Draw_PaintBg = 1 + }; + + // Draws dropbutton. Using wxRenderer or bitmaps, as appropriate. + void DrawButton( wxDC& dc, const wxRect& rect, int flags = Draw_PaintBg ); + + // Call if cursor is on button area or mouse is captured for the button. + //bool HandleButtonMouseEvent( wxMouseEvent& event, bool isInside ); + bool HandleButtonMouseEvent( wxMouseEvent& event, int flags ); + + // returns true if event was consumed or filtered (event type is also set to 0 in this case) + bool PreprocessMouseEvent( wxMouseEvent& event, int flags ); + + // + // This will handle left_down and left_dclick events outside button in a Windows-like manner. + // If you need alternate behaviour, it is recommended you manipulate and filter events to it + // instead of building your own handling routine (for reference, on wxEVT_LEFT_DOWN it will + // toggle popup and on wxEVT_LEFT_DCLICK it will do the same or run the popup's dclick method, + // if defined - you should pass events of other types of it for common processing). + void HandleNormalMouseEvent( wxMouseEvent& event ); + + // Creates popup window, calls interface->Create(), etc + void CreatePopup(); + + // Destroy popup window and all related constructs + void DestroyPopup(); + + // override the base class virtuals involved in geometry calculations + virtual wxSize DoGetBestSize() const; + + // NULL popup can be used to indicate default in a derived class + virtual void DoSetPopupControl(wxComboPopup* popup); + + // ensures there is atleast the default popup + void EnsurePopupControl(); + + // Recalculates button and textctrl areas. Called when size or button setup change. + // btnWidth: default/calculated width of the dropbutton. 0 means unchanged, + // just recalculate. + void CalculateAreas( int btnWidth = 0 ); + + // Standard textctrl positioning routine. Just give it platform-dependant + // textctrl coordinate adjustment. + void PositionTextCtrl( int textCtrlXAdjust, int textCtrlYAdjust ); + + // event handlers + void OnSizeEvent( wxSizeEvent& event ); + void OnFocusEvent(wxFocusEvent& event); + void OnIdleEvent(wxIdleEvent& event); + void OnTextCtrlEvent(wxCommandEvent& event); + void OnSysColourChanged(wxSysColourChangedEvent& event); + void OnKeyEvent(wxKeyEvent& event); + + // Set customization flags (directs how wxComboCtrlBase helpers behave) + void Customize( wxUint32 flags ) { m_iFlags |= flags; } + + // Dispatches size event and refreshes + void RecalcAndRefresh(); + + // Flags for DoShowPopup and AnimateShow + enum + { + ShowBelow = 0x0000, // Showing popup below the control + ShowAbove = 0x0001, // Showing popup above the control + CanDeferShow = 0x0002 // Can only return true from AnimateShow if this is set + }; + + // Shows and positions the popup. + virtual void DoShowPopup( const wxRect& rect, int flags ); + + // Implement in derived class to create a drop-down animation. + // Return true if finished immediately. Otherwise popup is only + // shown when the derived class call DoShowPopup. + // Flags are same as for DoShowPopup. + virtual bool AnimateShow( const wxRect& rect, int flags ); + +#if wxUSE_TOOLTIPS + virtual void DoSetToolTip( wxToolTip *tip ); +#endif + + virtual wxWindow *GetMainWindowOfCompositeControl() + { return m_mainCtrlWnd; } + + // This is used when m_text is hidden (readonly). + wxString m_valueString; + + // the text control and button we show all the time + wxTextCtrl* m_text; + wxWindow* m_btn; + + // wxPopupWindow or similar containing the window managed by the interface. + wxWindow* m_winPopup; + + // the popup control/panel + wxWindow* m_popup; + + // popup interface + wxComboPopup* m_popupInterface; + + // this is input etc. handler for the text control + wxEvtHandler* m_textEvtHandler; + + // this is for the top level window + wxEvtHandler* m_toplevEvtHandler; + + // this is for the control in popup + wxEvtHandler* m_popupExtraHandler; + + // this is for the popup window + wxEvtHandler* m_popupWinEvtHandler; + + // main (ie. topmost) window of a composite control (default = this) + wxWindow* m_mainCtrlWnd; + + // used to prevent immediate re-popupping incase closed popup + // by clicking on the combo control (needed because of inconsistent + // transient implementation across platforms). + wxLongLong m_timeCanAcceptClick; + + // how much popup should expand to the left/right of the control + wxCoord m_extLeft; + wxCoord m_extRight; + + // minimum popup width + wxCoord m_widthMinPopup; + + // preferred popup height + wxCoord m_heightPopup; + + // how much of writable combo is custom-paint by callback? + // also used to indicate area that is not covered by "blue" + // selection indicator. + wxCoord m_widthCustomPaint; + + // absolute text indentation, in pixels + wxCoord m_absIndent; + + // side on which the popup is aligned + int m_anchorSide; + + // Width of the "fake" border + wxCoord m_widthCustomBorder; + + // The button and textctrl click/paint areas + wxRect m_tcArea; + wxRect m_btnArea; + + // current button state (uses renderer flags) + int m_btnState; + + // button position + int m_btnWid; + int m_btnHei; + int m_btnSide; + int m_btnSpacingX; + + // last default button width + int m_btnWidDefault; + + // custom dropbutton bitmaps + wxBitmap m_bmpNormal; + wxBitmap m_bmpPressed; + wxBitmap m_bmpHover; + wxBitmap m_bmpDisabled; + + // area used by the button + wxSize m_btnSize; + + // platform-dependant customization and other flags + wxUint32 m_iFlags; + + // draw blank button background under bitmap? + bool m_blankButtonBg; + + // is the popup window currenty shown? + wxByte m_popupWinState; + + // should the focus be reset to the textctrl in idle time? + bool m_resetFocus; + +private: + void Init(); + + wxByte m_ignoreEvtText; // Number of next EVT_TEXTs to ignore + + // Is popup window wxPopupTransientWindow, wxPopupWindow or wxDialog? + wxByte m_popupWinType; + + DECLARE_EVENT_TABLE() + + DECLARE_ABSTRACT_CLASS(wxComboCtrlBase) +}; + + +// ---------------------------------------------------------------------------- +// wxComboPopup is the interface which must be implemented by a control to be +// used as a popup by wxComboCtrl +// ---------------------------------------------------------------------------- + + +// wxComboPopup internal flags +enum +{ + wxCP_IFLAG_CREATED = 0x0001 // Set by wxComboCtrlBase after Create is called +}; + + +class WXDLLEXPORT wxComboPopup +{ + friend class wxComboCtrlBase; +public: + wxComboPopup() + { + m_combo = (wxComboCtrlBase*) NULL; + m_iFlags = 0; + } + + // This is called immediately after construction finishes. m_combo member + // variable has been initialized before the call. + // NOTE: It is not in constructor so the derived class doesn't need to redefine + // a default constructor of its own. + virtual void Init() { } + + virtual ~wxComboPopup(); + + // Create the popup child control. + // Return true for success. + virtual bool Create(wxWindow* parent) = 0; + + // We must have an associated control which is subclassed by the combobox. + virtual wxWindow *GetControl() = 0; + + // Called immediately after the popup is shown + virtual void OnPopup(); + + // Called when popup is dismissed + virtual void OnDismiss(); + + // Called just prior to displaying popup. + // Default implementation does nothing. + virtual void SetStringValue( const wxString& value ); + + // Gets displayed string representation of the value. + virtual wxString GetStringValue() const = 0; + + // This is called to custom paint in the combo control itself (ie. not the popup). + // Default implementation draws value as string. + virtual void PaintComboControl( wxDC& dc, const wxRect& rect ); + + // Receives key events from the parent wxComboCtrl. + // Events not handled should be skipped, as usual. + virtual void OnComboKeyEvent( wxKeyEvent& event ); + + // Implement if you need to support special action when user + // double-clicks on the parent wxComboCtrl. + virtual void OnComboDoubleClick(); + + // Return final size of popup. Called on every popup, just prior to OnShow. + // minWidth = preferred minimum width for window + // prefHeight = preferred height. Only applies if > 0, + // maxHeight = max height for window, as limited by screen size + // and should only be rounded down, if necessary. + virtual wxSize GetAdjustedSize( int minWidth, int prefHeight, int maxHeight ); + + // Return true if you want delay call to Create until the popup is shown + // for the first time. It is more efficient, but note that it is often + // more convenient to have the control created immediately. + // Default returns false. + virtual bool LazyCreate(); + + // + // Utilies + // + + // Hides the popup + void Dismiss(); + + // Returns true if Create has been called. + bool IsCreated() const + { + return (m_iFlags & wxCP_IFLAG_CREATED) ? true : false; + } + + // Default PaintComboControl behaviour + static void DefaultPaintComboControl( wxComboCtrlBase* combo, + wxDC& dc, + const wxRect& rect ); + +protected: + wxComboCtrlBase* m_combo; + wxUint32 m_iFlags; + +private: + // Called in wxComboCtrlBase::SetPopupControl + void InitBase(wxComboCtrlBase *combo) + { + m_combo = combo; + } +}; + + +// ---------------------------------------------------------------------------- +// include the platform-dependent header defining the real class +// ---------------------------------------------------------------------------- + +#if defined(__WXUNIVERSAL__) + // No native universal (but it must still be first in the list) +#elif defined(__WXMSW__) + #include "wx/msw/combo.h" +#endif + +// Any ports may need generic as an alternative +#include "wx/generic/combo.h" + +#endif // wxUSE_COMBOCTRL + +#endif + // _WX_COMBOCONTROL_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/combobox.h b/Externals/wxWidgets/include/wx/combobox.h new file mode 100644 index 0000000000..af84fb668a --- /dev/null +++ b/Externals/wxWidgets/include/wx/combobox.h @@ -0,0 +1,97 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/combobox.h +// Purpose: wxComboBox declaration +// Author: Vadim Zeitlin +// Modified by: +// Created: 24.12.00 +// RCS-ID: $Id: combobox.h 42727 2006-10-30 16:04:27Z VZ $ +// Copyright: (c) 1996-2000 wxWidgets team +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_COMBOBOX_H_BASE_ +#define _WX_COMBOBOX_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_COMBOBOX + +extern WXDLLEXPORT_DATA(const wxChar) wxComboBoxNameStr[]; + +// ---------------------------------------------------------------------------- +// wxComboBoxBase: this interface defines the methods wxComboBox must implement +// ---------------------------------------------------------------------------- + +#include "wx/textctrl.h" +#include "wx/ctrlsub.h" + +class WXDLLEXPORT wxComboBoxBase : public wxItemContainer +{ +public: + // wxTextCtrl-like methods wxComboBox must implement + virtual wxString GetValue() const = 0; + virtual void SetValue(const wxString& value) = 0; + + virtual void Copy() = 0; + virtual void Cut() = 0; + virtual void Paste() = 0; + virtual void SetInsertionPoint(long pos) = 0; + virtual long GetInsertionPoint() const = 0; + virtual wxTextPos GetLastPosition() const = 0; + virtual void Replace(long from, long to, const wxString& value) = 0; + virtual void SetSelection(long from, long to) = 0; + virtual void SetEditable(bool editable) = 0; + + virtual void SetInsertionPointEnd() + { SetInsertionPoint(GetLastPosition()); } + virtual void Remove(long from, long to) + { Replace(from, to, wxEmptyString); } + + virtual bool IsEditable() const = 0; + + virtual void Undo() = 0; + virtual void Redo() = 0; + virtual void SelectAll() = 0; + + virtual bool CanCopy() const = 0; + virtual bool CanCut() const = 0; + virtual bool CanPaste() const = 0; + virtual bool CanUndo() const = 0; + virtual bool CanRedo() const = 0; + + // may return value different from GetSelection() when the combobox + // dropdown is shown and the user selected, but not yet accepted, a value + // different from the old one in it + virtual int GetCurrentSelection() const { return GetSelection(); } + + // redeclare inherited SetSelection() overload here as well to avoid + // virtual function hiding + virtual void SetSelection(int n) = 0; +}; + +// ---------------------------------------------------------------------------- +// include the platform-dependent header defining the real class +// ---------------------------------------------------------------------------- + +#if defined(__WXUNIVERSAL__) + #include "wx/univ/combobox.h" +#elif defined(__WXMSW__) + #include "wx/msw/combobox.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/combobox.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/combobox.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/combobox.h" +#elif defined(__WXMAC__) + #include "wx/mac/combobox.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/combobox.h" +#elif defined(__WXPM__) + #include "wx/os2/combobox.h" +#endif + +#endif // wxUSE_COMBOBOX + +#endif + // _WX_COMBOBOX_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/confbase.h b/Externals/wxWidgets/include/wx/confbase.h new file mode 100644 index 0000000000..03c1dab546 --- /dev/null +++ b/Externals/wxWidgets/include/wx/confbase.h @@ -0,0 +1,359 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: confbase.h +// Purpose: declaration of the base class of all config implementations +// (see also: fileconf.h and msw/regconf.h and iniconf.h) +// Author: Karsten Ballüder & Vadim Zeitlin +// Modified by: +// Created: 07.04.98 (adapted from appconf.h) +// RCS-ID: $Id: confbase.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) 1997 Karsten Ballüder Ballueder@usa.net +// Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CONFBASE_H_ +#define _WX_CONFBASE_H_ + +#include "wx/defs.h" +#include "wx/string.h" + +class WXDLLIMPEXP_FWD_BASE wxArrayString; + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +/// shall we be case sensitive in parsing variable names? +#ifndef wxCONFIG_CASE_SENSITIVE + #define wxCONFIG_CASE_SENSITIVE 0 +#endif + +/// separates group and entry names (probably shouldn't be changed) +#ifndef wxCONFIG_PATH_SEPARATOR + #define wxCONFIG_PATH_SEPARATOR _T('/') +#endif + +/// introduces immutable entries +// (i.e. the ones which can't be changed from the local config file) +#ifndef wxCONFIG_IMMUTABLE_PREFIX + #define wxCONFIG_IMMUTABLE_PREFIX _T('!') +#endif + +#if wxUSE_CONFIG + +#include "wx/string.h" + +/// should we use registry instead of configuration files under Windows? +// (i.e. whether wxConfigBase::Create() will create a wxFileConfig (if it's +// false) or wxRegConfig (if it's true and we're under Win32)) +#ifndef wxUSE_CONFIG_NATIVE + #define wxUSE_CONFIG_NATIVE 1 +#endif + +// Style flags for constructor style parameter +enum +{ + wxCONFIG_USE_LOCAL_FILE = 1, + wxCONFIG_USE_GLOBAL_FILE = 2, + wxCONFIG_USE_RELATIVE_PATH = 4, + wxCONFIG_USE_NO_ESCAPE_CHARACTERS = 8, + wxCONFIG_USE_SUBDIR = 16 +}; + +// ---------------------------------------------------------------------------- +// abstract base class wxConfigBase which defines the interface for derived +// classes +// +// wxConfig organizes the items in a tree-like structure (modeled after the +// Unix/Dos filesystem). There are groups (directories) and keys (files). +// There is always one current group given by the current path. +// +// Keys are pairs "key_name = value" where value may be of string or integer +// (long) type (TODO doubles and other types such as wxDate coming soon). +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxConfigBase +{ +public: + // constants + // the type of an entry + enum EntryType + { + Type_Unknown, + Type_String, + Type_Boolean, + Type_Integer, // use Read(long *) + Type_Float // use Read(double *) + }; + + // static functions + // sets the config object, returns the previous pointer + static wxConfigBase *Set(wxConfigBase *pConfig); + // get the config object, creates it on demand unless DontCreateOnDemand + // was called + static wxConfigBase *Get(bool createOnDemand = true) + { if ( createOnDemand && (!ms_pConfig) ) Create(); return ms_pConfig; } + // create a new config object: this function will create the "best" + // implementation of wxConfig available for the current platform, see + // comments near definition wxUSE_CONFIG_NATIVE for details. It returns + // the created object and also sets it as ms_pConfig. + static wxConfigBase *Create(); + // should Get() try to create a new log object if the current one is NULL? + static void DontCreateOnDemand() { ms_bAutoCreate = false; } + + // ctor & virtual dtor + // ctor (can be used as default ctor too) + // + // Not all args will always be used by derived classes, but including + // them all in each class ensures compatibility. If appName is empty, + // uses wxApp name + wxConfigBase(const wxString& appName = wxEmptyString, + const wxString& vendorName = wxEmptyString, + const wxString& localFilename = wxEmptyString, + const wxString& globalFilename = wxEmptyString, + long style = 0); + + // empty but ensures that dtor of all derived classes is virtual + virtual ~wxConfigBase(); + + // path management + // set current path: if the first character is '/', it's the absolute path, + // otherwise it's a relative path. '..' is supported. If the strPath + // doesn't exist it is created. + virtual void SetPath(const wxString& strPath) = 0; + // retrieve the current path (always as absolute path) + virtual const wxString& GetPath() const = 0; + + // enumeration: all functions here return false when there are no more items. + // you must pass the same lIndex to GetNext and GetFirst (don't modify it) + // enumerate subgroups + virtual bool GetFirstGroup(wxString& str, long& lIndex) const = 0; + virtual bool GetNextGroup (wxString& str, long& lIndex) const = 0; + // enumerate entries + virtual bool GetFirstEntry(wxString& str, long& lIndex) const = 0; + virtual bool GetNextEntry (wxString& str, long& lIndex) const = 0; + // get number of entries/subgroups in the current group, with or without + // it's subgroups + virtual size_t GetNumberOfEntries(bool bRecursive = false) const = 0; + virtual size_t GetNumberOfGroups(bool bRecursive = false) const = 0; + + // tests of existence + // returns true if the group by this name exists + virtual bool HasGroup(const wxString& strName) const = 0; + // same as above, but for an entry + virtual bool HasEntry(const wxString& strName) const = 0; + // returns true if either a group or an entry with a given name exist + bool Exists(const wxString& strName) const + { return HasGroup(strName) || HasEntry(strName); } + + // get the entry type + virtual EntryType GetEntryType(const wxString& name) const + { + // by default all entries are strings + return HasEntry(name) ? Type_String : Type_Unknown; + } + + // key access: returns true if value was really read, false if default used + // (and if the key is not found the default value is returned.) + + // read a string from the key + bool Read(const wxString& key, wxString *pStr) const; + bool Read(const wxString& key, wxString *pStr, const wxString& defVal) const; + + // read a number (long) + bool Read(const wxString& key, long *pl) const; + bool Read(const wxString& key, long *pl, long defVal) const; + + // read an int + bool Read(const wxString& key, int *pi) const; + bool Read(const wxString& key, int *pi, int defVal) const; + + // read a double + bool Read(const wxString& key, double* val) const; + bool Read(const wxString& key, double* val, double defVal) const; + + // read a bool + bool Read(const wxString& key, bool* val) const; + bool Read(const wxString& key, bool* val, bool defVal) const; + + // convenience functions returning directly the value (we don't have them for + // int/double/bool as there would be ambiguities with the long one then) + wxString Read(const wxString& key, + const wxString& defVal = wxEmptyString) const + { wxString s; (void)Read(key, &s, defVal); return s; } + + long Read(const wxString& key, long defVal) const + { long l; (void)Read(key, &l, defVal); return l; } + + // write the value (return true on success) + bool Write(const wxString& key, const wxString& value) + { return DoWriteString(key, value); } + + bool Write(const wxString& key, long value) + { return DoWriteLong(key, value); } + + bool Write(const wxString& key, int value) + { return DoWriteInt(key, value); } + + bool Write(const wxString& key, double value) + { return DoWriteDouble(key, value); } + + bool Write(const wxString& key, bool value) + { return DoWriteBool(key, value); } + + // we have to provide a separate version for C strings as otherwise they + // would be converted to bool and not to wxString as expected! + bool Write(const wxString& key, const wxChar *value) + { return Write(key, wxString(value)); } + + // permanently writes all changes + virtual bool Flush(bool bCurrentOnly = false) = 0; + + // renaming, all functions return false on failure (probably because the new + // name is already taken by an existing entry) + // rename an entry + virtual bool RenameEntry(const wxString& oldName, + const wxString& newName) = 0; + // rename a group + virtual bool RenameGroup(const wxString& oldName, + const wxString& newName) = 0; + + // delete entries/groups + // deletes the specified entry and the group it belongs to if + // it was the last key in it and the second parameter is true + virtual bool DeleteEntry(const wxString& key, + bool bDeleteGroupIfEmpty = true) = 0; + // delete the group (with all subgroups) + virtual bool DeleteGroup(const wxString& key) = 0; + // delete the whole underlying object (disk file, registry key, ...) + // primarily for use by uninstallation routine. + virtual bool DeleteAll() = 0; + + // options + // we can automatically expand environment variables in the config entries + // (this option is on by default, you can turn it on/off at any time) + bool IsExpandingEnvVars() const { return m_bExpandEnvVars; } + void SetExpandEnvVars(bool bDoIt = true) { m_bExpandEnvVars = bDoIt; } + // recording of default values + void SetRecordDefaults(bool bDoIt = true) { m_bRecordDefaults = bDoIt; } + bool IsRecordingDefaults() const { return m_bRecordDefaults; } + // does expansion only if needed + wxString ExpandEnvVars(const wxString& str) const; + + // misc accessors + wxString GetAppName() const { return m_appName; } + wxString GetVendorName() const { return m_vendorName; } + + // Used wxIniConfig to set members in constructor + void SetAppName(const wxString& appName) { m_appName = appName; } + void SetVendorName(const wxString& vendorName) { m_vendorName = vendorName; } + + void SetStyle(long style) { m_style = style; } + long GetStyle() const { return m_style; } + +protected: + static bool IsImmutable(const wxString& key) + { return !key.IsEmpty() && key[0] == wxCONFIG_IMMUTABLE_PREFIX; } + + // return the path without trailing separator, if any: this should be called + // to sanitize paths referring to the group names before passing them to + // wxConfigPathChanger as "/foo/bar/" should be the same as "/foo/bar" and it + // isn't interpreted in the same way by it (and this can't be changed there + // as it's not the same for the entries names) + static wxString RemoveTrailingSeparator(const wxString& key); + + // do read/write the values of different types + virtual bool DoReadString(const wxString& key, wxString *pStr) const = 0; + virtual bool DoReadLong(const wxString& key, long *pl) const = 0; + virtual bool DoReadInt(const wxString& key, int *pi) const; + virtual bool DoReadDouble(const wxString& key, double* val) const; + virtual bool DoReadBool(const wxString& key, bool* val) const; + + virtual bool DoWriteString(const wxString& key, const wxString& value) = 0; + virtual bool DoWriteLong(const wxString& key, long value) = 0; + virtual bool DoWriteInt(const wxString& key, int value); + virtual bool DoWriteDouble(const wxString& key, double value); + virtual bool DoWriteBool(const wxString& key, bool value); + +private: + // are we doing automatic environment variable expansion? + bool m_bExpandEnvVars; + // do we record default values? + bool m_bRecordDefaults; + + // static variables + static wxConfigBase *ms_pConfig; + static bool ms_bAutoCreate; + + // Application name and organisation name + wxString m_appName; + wxString m_vendorName; + + // Style flag + long m_style; +}; + +// a handy little class which changes current path to the path of given entry +// and restores it in dtor: so if you declare a local variable of this type, +// you work in the entry directory and the path is automatically restored +// when the function returns +// Taken out of wxConfig since not all compilers can cope with nested classes. +class WXDLLIMPEXP_BASE wxConfigPathChanger +{ +public: + // ctor/dtor do path changing/restoring of the path + wxConfigPathChanger(const wxConfigBase *pContainer, const wxString& strEntry); + ~wxConfigPathChanger(); + + // get the key name + const wxString& Name() const { return m_strName; } + + // this method must be called if the original path (i.e. the current path at + // the moment of creation of this object) could have been deleted to prevent + // us from restoring the not existing (any more) path + // + // if the original path doesn't exist any more, the path will be restored to + // the deepest still existing component of the old path + void UpdateIfDeleted(); + +private: + wxConfigBase *m_pContainer; // object we live in + wxString m_strName, // name of entry (i.e. name only) + m_strOldPath; // saved path + bool m_bChanged; // was the path changed? + + DECLARE_NO_COPY_CLASS(wxConfigPathChanger) +}; + + +// ---------------------------------------------------------------------------- +// the native wxConfigBase implementation +// ---------------------------------------------------------------------------- + +// under Windows we prefer to use the native implementation +// wxIniConfig isn't native anywhere after droping win16 in wxWidgets 2.6 +#if defined(__WXMSW__) && wxUSE_CONFIG_NATIVE + #define wxConfig wxRegConfig +#else // either we're under Unix or wish to use files even under Windows + #define wxConfig wxFileConfig +#endif + +#endif // wxUSE_CONFIG + +/* + Replace environment variables ($SOMETHING) with their values. The format is + $VARNAME or ${VARNAME} where VARNAME contains alphanumeric characters and + '_' only. '$' must be escaped ('\$') in order to be taken literally. +*/ + +WXDLLIMPEXP_BASE wxString wxExpandEnvVars(const wxString &sz); + +/* + Split path into parts removing '..' in progress + */ +WXDLLIMPEXP_BASE void wxSplitPath(wxArrayString& aParts, const wxChar *sz); + + +#endif + // _WX_CONFIG_H_ + diff --git a/Externals/wxWidgets/include/wx/config.h b/Externals/wxWidgets/include/wx/config.h new file mode 100644 index 0000000000..41ce1cf8e9 --- /dev/null +++ b/Externals/wxWidgets/include/wx/config.h @@ -0,0 +1,31 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: config.h +// Purpose: wxConfig base header +// Author: Julian Smart +// Modified by: +// Created: +// Copyright: (c) Julian Smart +// RCS-ID: $Id: config.h 33948 2005-05-04 18:57:50Z JS $ +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CONFIG_H_BASE_ +#define _WX_CONFIG_H_BASE_ + +#include "wx/defs.h" +#include "wx/confbase.h" + +#if defined(__WXMSW__) && wxUSE_CONFIG_NATIVE +# ifdef __WIN32__ +# include "wx/msw/regconf.h" +# else +# include "wx/msw/iniconf.h" +# endif +#elif defined(__WXPALMOS__) && wxUSE_CONFIG_NATIVE +# include "wx/palmos/prefconf.h" +#else +# include "wx/fileconf.h" +#endif + +#endif + // _WX_CONFIG_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/containr.h b/Externals/wxWidgets/include/wx/containr.h new file mode 100644 index 0000000000..8a446957e2 --- /dev/null +++ b/Externals/wxWidgets/include/wx/containr.h @@ -0,0 +1,141 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/containr.h +// Purpose: wxControlContainer class declration: a "mix-in" class which +// implements the TAB navigation between the controls +// Author: Vadim Zeitlin +// Modified by: +// Created: 06.08.01 +// RCS-ID: $Id: containr.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) 2001 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CONTAINR_H_ +#define _WX_CONTAINR_H_ + +class WXDLLIMPEXP_FWD_CORE wxFocusEvent; +class WXDLLIMPEXP_FWD_CORE wxNavigationKeyEvent; +class WXDLLIMPEXP_FWD_CORE wxWindow; +class WXDLLIMPEXP_FWD_CORE wxWindowBase; + +/* + Implementation note: wxControlContainer is not a real mix-in but rather + a class meant to be agregated with (and not inherited from). Although + logically it should be a mix-in, doing it like this has no advantage from + the point of view of the existing code but does have some problems (we'd + need to play tricks with event handlers which may be difficult to do + safely). The price we pay for this simplicity is the ugly macros below. + */ + +// ---------------------------------------------------------------------------- +// wxControlContainer +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxControlContainer +{ +public: + // ctors and such + wxControlContainer(wxWindow *winParent = NULL); + void SetContainerWindow(wxWindow *winParent) { m_winParent = winParent; } + + // the methods to be called from the window event handlers + void HandleOnNavigationKey(wxNavigationKeyEvent& event); + void HandleOnFocus(wxFocusEvent& event); + void HandleOnWindowDestroy(wxWindowBase *child); + + // should be called from SetFocus(), returns false if we did nothing with + // the focus and the default processing should take place + bool DoSetFocus(); + + // can our child get the focus? + bool AcceptsFocus() const; + + // called from OnChildFocus() handler, i.e. when one of our (grand) + // children gets the focus + void SetLastFocus(wxWindow *win); + +protected: + // set the focus to the child which had it the last time + bool SetFocusToChild(); + + // the parent window we manage the children for + wxWindow *m_winParent; + + // the child which had the focus last time this panel was activated + wxWindow *m_winLastFocused; + + // a guard against infinite recursion + bool m_inSetFocus; + + DECLARE_NO_COPY_CLASS(wxControlContainer) +}; + +// this function is for wxWidgets internal use only +extern bool wxSetFocusToChild(wxWindow *win, wxWindow **child); + +// ---------------------------------------------------------------------------- +// macros which may be used by the classes wishing to implement TAB navigation +// among their children +// ---------------------------------------------------------------------------- + +// declare the methods to be forwarded +#define WX_DECLARE_CONTROL_CONTAINER() \ +public: \ + void OnNavigationKey(wxNavigationKeyEvent& event); \ + void OnFocus(wxFocusEvent& event); \ + virtual void OnChildFocus(wxChildFocusEvent& event); \ + virtual void SetFocus(); \ + virtual void SetFocusIgnoringChildren(); \ + virtual void RemoveChild(wxWindowBase *child); \ + virtual bool AcceptsFocus() const; \ +\ +protected: \ + wxControlContainer m_container + +// implement the event table entries for wxControlContainer +#define WX_EVENT_TABLE_CONTROL_CONTAINER(classname) \ + EVT_SET_FOCUS(classname::OnFocus) \ + EVT_CHILD_FOCUS(classname::OnChildFocus) \ + EVT_NAVIGATION_KEY(classname::OnNavigationKey) + +// implement the methods forwarding to the wxControlContainer +#define WX_DELEGATE_TO_CONTROL_CONTAINER(classname, basename) \ +void classname::OnNavigationKey( wxNavigationKeyEvent& event ) \ +{ \ + m_container.HandleOnNavigationKey(event); \ +} \ + \ +void classname::RemoveChild(wxWindowBase *child) \ +{ \ + m_container.HandleOnWindowDestroy(child); \ + \ + basename::RemoveChild(child); \ +} \ + \ +void classname::SetFocus() \ +{ \ + if ( !m_container.DoSetFocus() ) \ + basename::SetFocus(); \ +} \ + \ +void classname::SetFocusIgnoringChildren() \ +{ \ + basename::SetFocus(); \ +} \ + \ +void classname::OnChildFocus(wxChildFocusEvent& event) \ +{ \ + m_container.SetLastFocus(event.GetWindow()); \ +} \ + \ +void classname::OnFocus(wxFocusEvent& event) \ +{ \ + m_container.HandleOnFocus(event); \ +} \ +bool classname::AcceptsFocus() const \ +{ \ + return m_container.AcceptsFocus(); \ +} + + +#endif // _WX_CONTAINR_H_ diff --git a/Externals/wxWidgets/include/wx/control.h b/Externals/wxWidgets/include/wx/control.h new file mode 100644 index 0000000000..ff11a93cf6 --- /dev/null +++ b/Externals/wxWidgets/include/wx/control.h @@ -0,0 +1,117 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/control.h +// Purpose: wxControl common interface +// Author: Vadim Zeitlin +// Modified by: +// Created: 26.07.99 +// RCS-ID: $Id: control.h 42816 2006-10-31 08:50:17Z RD $ +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CONTROL_H_BASE_ +#define _WX_CONTROL_H_BASE_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/defs.h" + +#if wxUSE_CONTROLS + +#include "wx/window.h" // base class + +extern WXDLLEXPORT_DATA(const wxChar) wxControlNameStr[]; + +// ---------------------------------------------------------------------------- +// wxControl is the base class for all controls +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxControlBase : public wxWindow +{ +public: + wxControlBase() { } + + virtual ~wxControlBase(); + + // Create() function adds the validator parameter + bool Create(wxWindow *parent, wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxControlNameStr); + + // get the control alignment (left/right/centre, top/bottom/centre) + int GetAlignment() const { return m_windowStyle & wxALIGN_MASK; } + + // get the string without mnemonic characters ('&') + static wxString GetLabelText(const wxString& label); + + // get just the text of the label, without mnemonic characters ('&') + wxString GetLabelText() const { return GetLabelText(GetLabel()); } + + // controls by default inherit the colours of their parents, if a + // particular control class doesn't want to do it, it can override + // ShouldInheritColours() to return false + virtual bool ShouldInheritColours() const { return true; } + + + // WARNING: this doesn't work for all controls nor all platforms! + // + // simulates the event of given type (i.e. wxButton::Command() is just as + // if the button was clicked) + virtual void Command(wxCommandEvent &event); + + virtual void SetLabel( const wxString &label ); + virtual bool SetFont(const wxFont& font); + + // wxControl-specific processing after processing the update event + virtual void DoUpdateWindowUI(wxUpdateUIEvent& event); + +protected: + // creates the control (calls wxWindowBase::CreateBase inside) and adds it + // to the list of parents children + bool CreateControl(wxWindowBase *parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + long style, + const wxValidator& validator, + const wxString& name); + + // initialize the common fields of wxCommandEvent + void InitCommandEvent(wxCommandEvent& event) const; + + DECLARE_NO_COPY_CLASS(wxControlBase) +}; + +// ---------------------------------------------------------------------------- +// include platform-dependent wxControl declarations +// ---------------------------------------------------------------------------- + +#if defined(__WXUNIVERSAL__) + #include "wx/univ/control.h" +#elif defined(__WXPALMOS__) + #include "wx/palmos/control.h" +#elif defined(__WXMSW__) + #include "wx/msw/control.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/control.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/control.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/control.h" +#elif defined(__WXMAC__) + #include "wx/mac/control.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/control.h" +#elif defined(__WXPM__) + #include "wx/os2/control.h" +#endif + +#endif // wxUSE_CONTROLS + +#endif + // _WX_CONTROL_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/convauto.h b/Externals/wxWidgets/include/wx/convauto.h new file mode 100644 index 0000000000..ced911950a --- /dev/null +++ b/Externals/wxWidgets/include/wx/convauto.h @@ -0,0 +1,108 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/convauto.h +// Purpose: wxConvAuto class declaration +// Author: Vadim Zeitlin +// Created: 2006-04-03 +// RCS-ID: $Id: convauto.h 45893 2007-05-08 20:05:16Z VZ $ +// Copyright: (c) 2006 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CONVAUTO_H_ +#define _WX_CONVAUTO_H_ + +#include "wx/strconv.h" + +#if wxUSE_WCHAR_T + +// ---------------------------------------------------------------------------- +// wxConvAuto: uses BOM to automatically detect input encoding +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxConvAuto : public wxMBConv +{ +public: + // default ctor, the real conversion will be created on demand + wxConvAuto() { m_conv = NULL; /* the rest will be initialized later */ } + + // copy ctor doesn't initialize anything neither as conversion can only be + // deduced on first use + wxConvAuto(const wxConvAuto& WXUNUSED(other)) : wxMBConv() { m_conv = NULL; } + + virtual ~wxConvAuto() { if ( m_conv && m_ownsConv ) delete m_conv; } + + // override the base class virtual function(s) to use our m_conv + virtual size_t ToWChar(wchar_t *dst, size_t dstLen, + const char *src, size_t srcLen = wxNO_LEN) const; + + virtual size_t FromWChar(char *dst, size_t dstLen, + const wchar_t *src, size_t srcLen = wxNO_LEN) const; + + virtual size_t GetMBNulLen() const { return m_conv->GetMBNulLen(); } + + virtual wxMBConv *Clone() const { return new wxConvAuto(*this); } + +private: + // all currently recognized BOM values + enum BOMType + { + BOM_None, + BOM_UTF32BE, + BOM_UTF32LE, + BOM_UTF16BE, + BOM_UTF16LE, + BOM_UTF8 + }; + + // return the BOM type of this buffer + static BOMType DetectBOM(const char *src, size_t srcLen); + + // initialize m_conv with the conversion to use by default (UTF-8) + void InitWithDefault() + { + m_conv = &wxConvUTF8; + m_ownsConv = false; + } + + // create the correct conversion object for the given BOM type + void InitFromBOM(BOMType bomType); + + // create the correct conversion object for the BOM present in the + // beginning of the buffer; adjust the buffer to skip the BOM if found + void InitFromInput(const char **src, size_t *len); + + // adjust src and len to skip over the BOM (identified by m_bomType) at the + // start of the buffer + void SkipBOM(const char **src, size_t *len) const; + + + // conversion object which we really use, NULL until the first call to + // either ToWChar() or FromWChar() + wxMBConv *m_conv; + + // our BOM type + BOMType m_bomType; + + // true if we allocated m_conv ourselves, false if we just use an existing + // global conversion + bool m_ownsConv; + + // true if we already skipped BOM when converting (and not just calculating + // the size) + bool m_consumedBOM; + + + DECLARE_NO_ASSIGN_CLASS(wxConvAuto) +}; + +#else // !wxUSE_WCHAR_T + +// it doesn't matter how we define it in this case as it's unused anyhow, but +// do define it to allow the code using wxConvAuto() as default argument (this +// is done in many places) to compile +typedef wxMBConv wxConvAuto; + +#endif // wxUSE_WCHAR_T/!wxUSE_WCHAR_T + +#endif // _WX_CONVAUTO_H_ + diff --git a/Externals/wxWidgets/include/wx/cpp.h b/Externals/wxWidgets/include/wx/cpp.h new file mode 100644 index 0000000000..8d7a646d7b --- /dev/null +++ b/Externals/wxWidgets/include/wx/cpp.h @@ -0,0 +1,57 @@ +/* + * Name: wx/cpp.h + * Purpose: Various preprocessor helpers + * Author: Vadim Zeitlin + * Created: 2006-09-30 + * RCS-ID: $Id: cpp.h 42993 2006-11-03 21:06:57Z VZ $ + * Copyright: (c) 2006 Vadim Zeitlin + * Licence: wxWindows licence + */ + +/* THIS IS A C FILE, DON'T USE C++ FEATURES (IN PARTICULAR COMMENTS) IN IT */ + +#ifndef _WX_CPP_H_ +#define _WX_CPP_H_ + +/* wxCONCAT works like preprocessor ## operator but also works with macros */ +#define wxCONCAT_HELPER(text, line) text ## line +#define wxCONCAT(text, line) wxCONCAT_HELPER(text, line) + +/* wxSTRINGIZE works as the preprocessor # operator but also works with macros */ +#define wxSTRINGIZE_HELPER(x) #x +#define wxSTRINGIZE(x) wxSTRINGIZE_HELPER(x) + +/* a Unicode-friendly version of wxSTRINGIZE_T */ +#define wxSTRINGIZE_T(x) wxAPPLY_T(wxSTRINGIZE(x)) + +/* + Helper macros for wxMAKE_UNIQUE_NAME: normally this works by appending the + current line number to the given identifier to reduce the probability of the + conflict (it may still happen if this is used in the headers, hence you + should avoid doing it or provide unique prefixes then) but we have to do it + differently for VC++ + */ +#if defined(__VISUALC__) && (__VISUALC__ >= 1300) + /* + __LINE__ handling is completely broken in VC++ when using "Edit and + Continue" (/ZI option) and results in preprocessor errors if we use it + inside the macros. Luckily VC7 has another standard macro which can be + used like this and is even better than __LINE__ because it is globally + unique. + */ +# define wxCONCAT_LINE(text) wxCONCAT(text, __COUNTER__) +#else /* normal compilers */ +# define wxCONCAT_LINE(text) wxCONCAT(text, __LINE__) +#endif + +/* Create a "unique" name with the given prefix */ +#define wxMAKE_UNIQUE_NAME(text) wxCONCAT_LINE(text) + +/* + This macro can be passed as argument to another macro when you don't have + anything to pass in fact. + */ +#define wxEMPTY_PARAMETER_VALUE /* Fake macro parameter value */ + +#endif // _WX_CPP_H_ + diff --git a/Externals/wxWidgets/include/wx/cppunit.h b/Externals/wxWidgets/include/wx/cppunit.h new file mode 100644 index 0000000000..6e159fd772 --- /dev/null +++ b/Externals/wxWidgets/include/wx/cppunit.h @@ -0,0 +1,125 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/cppunit.h +// Purpose: wrapper header for CppUnit headers +// Author: Vadim Zeitlin +// Created: 15.02.04 +// RCS-ID: $Id: cppunit.h 49019 2007-10-02 14:56:53Z MW $ +// Copyright: (c) 2004 Vadim Zeitlin +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CPPUNIT_H_ +#define _WX_CPPUNIT_H_ + +/////////////////////////////////////////////////////////////////////////////// +// using CPPUNIT_TEST() macro results in this warning, disable it as there is +// no other way to get rid of it and it's not very useful anyhow +#ifdef __VISUALC__ + // typedef-name 'foo' used as synonym for class-name 'bar' + #pragma warning(disable:4097) + + // unreachable code: we don't care about warnings in CppUnit headers + #pragma warning(disable:4702) + + // 'id': identifier was truncated to 'num' characters in the debug info + #pragma warning(disable:4786) +#endif // __VISUALC__ + +#ifdef __BORLANDC__ + #pragma warn -8022 +#endif + +#ifndef CPPUNIT_STD_NEED_ALLOCATOR + #define CPPUNIT_STD_NEED_ALLOCATOR 0 +#endif + +/////////////////////////////////////////////////////////////////////////////// +// Set the default format for the errors, which can be used by an IDE to jump +// to the error location. This default gets overridden by the cppunit headers +// for some compilers (e.g. VC++). + +#ifndef CPPUNIT_COMPILER_LOCATION_FORMAT + #define CPPUNIT_COMPILER_LOCATION_FORMAT "%p:%l:" +#endif + + +/////////////////////////////////////////////////////////////////////////////// +// Include all needed cppunit headers. +// + +#include "wx/beforestd.h" +#include +#include +#include +#include +#include +#include "wx/afterstd.h" + + +/////////////////////////////////////////////////////////////////////////////// +// Set of helpful test macros. +// + +// Base macro for wrapping CPPUNIT_TEST macros and so making them conditional +// tests, meaning that the test only get registered and thus run when a given +// runtime condition is true. +// In case the condition is evaluated as false a skip message is logged +// (the message will only be shown in verbose mode). +#define WXTEST_ANY_WITH_CONDITION(suiteName, Condition, testMethod, anyTest) \ + if (Condition) \ + { anyTest; } \ + else \ + wxLogInfo(wxString::Format(_T("skipping: %s.%s\n reason: %s equals false\n"), \ + wxString(suiteName, wxConvUTF8).c_str(), \ + wxString(#testMethod, wxConvUTF8).c_str(), \ + wxString(#Condition, wxConvUTF8).c_str())) + +// Conditional CPPUNIT_TEST macro. +#define WXTEST_WITH_CONDITION(suiteName, Condition, testMethod) \ + WXTEST_ANY_WITH_CONDITION(suiteName, Condition, testMethod, CPPUNIT_TEST(testMethod)) +// Conditional CPPUNIT_TEST_FAIL macro. +#define WXTEST_FAIL_WITH_CONDITION(suiteName, Condition, testMethod) \ + WXTEST_ANY_WITH_CONDITION(suiteName, Condition, testMethod, CPPUNIT_TEST_FAIL(testMethod)) + +// Use this macro to compare a wxString with a literal string. +#define WX_ASSERT_STR_EQUAL(p, s) CPPUNIT_ASSERT_EQUAL(wxString(p), s) + +// Use this macro to compare a size_t with a literal integer +#define WX_ASSERT_SIZET_EQUAL(n, m) CPPUNIT_ASSERT_EQUAL(((size_t)n), m) + + +/////////////////////////////////////////////////////////////////////////////// +// stream inserter for wxString +// + +#include "wx/string.h" + +inline std::ostream& operator<<(std::ostream& o, const wxString& s) +{ + return o << s.mb_str(); +} + + +/////////////////////////////////////////////////////////////////////////////// +// Some more compiler warning tweaking and auto linking. +// + +#ifdef __BORLANDC__ + #pragma warn .8022 +#endif + +#ifdef _MSC_VER + #pragma warning(default:4702) +#endif // _MSC_VER + +// for VC++ automatically link in cppunit library +#ifdef __VISUALC__ + #ifdef NDEBUG + #pragma comment(lib, "cppunit.lib") + #else // Debug + #pragma comment(lib, "cppunitd.lib") + #endif // Release/Debug +#endif + +#endif // _WX_CPPUNIT_H_ + diff --git a/Externals/wxWidgets/include/wx/cshelp.h b/Externals/wxWidgets/include/wx/cshelp.h new file mode 100644 index 0000000000..8b3d8adcc6 --- /dev/null +++ b/Externals/wxWidgets/include/wx/cshelp.h @@ -0,0 +1,244 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/cshelp.h +// Purpose: Context-sensitive help support classes +// Author: Julian Smart, Vadim Zeitlin +// Modified by: +// Created: 08/09/2000 +// RCS-ID: $Id: cshelp.h 39675 2006-06-11 21:10:32Z VZ $ +// Copyright: (c) 2000 Julian Smart, Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CSHELP_H_ +#define _WX_CSHELP_H_ + +#include "wx/defs.h" + +#if wxUSE_HELP + +#include "wx/help.h" + +#include "wx/hashmap.h" +#if wxUSE_BMPBUTTON +#include "wx/bmpbuttn.h" +#endif + +#include "wx/event.h" + +// ---------------------------------------------------------------------------- +// classes used to implement context help UI +// ---------------------------------------------------------------------------- + +/* + * wxContextHelp + * Invokes context-sensitive help. When the user + * clicks on a window, a wxEVT_HELP event will be sent to that + * window for the application to display help for. + */ + +class WXDLLEXPORT wxContextHelp : public wxObject +{ +public: + wxContextHelp(wxWindow* win = NULL, bool beginHelp = true); + virtual ~wxContextHelp(); + + bool BeginContextHelp(wxWindow* win); + bool EndContextHelp(); + + bool EventLoop(); + bool DispatchEvent(wxWindow* win, const wxPoint& pt); + + void SetStatus(bool status) { m_status = status; } + +protected: + bool m_inHelp; + bool m_status; // true if the user left-clicked + +private: + DECLARE_DYNAMIC_CLASS(wxContextHelp) +}; + +#if wxUSE_BMPBUTTON +/* + * wxContextHelpButton + * You can add this to your dialogs (especially on non-Windows platforms) + * to put the application into context help mode. + */ + +class WXDLLEXPORT wxContextHelpButton : public wxBitmapButton +{ +public: + wxContextHelpButton(wxWindow* parent, + wxWindowID id = wxID_CONTEXT_HELP, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxBU_AUTODRAW); + + void OnContextHelp(wxCommandEvent& event); + +private: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxContextHelpButton) + DECLARE_EVENT_TABLE() +}; + +#endif + +// ---------------------------------------------------------------------------- +// classes used to implement context help support +// ---------------------------------------------------------------------------- + +// wxHelpProvider is an abstract class used by the program implementing context help to +// show the help text (or whatever: it may be HTML page or anything else) for +// the given window. +// +// The current help provider must be explicitly set by the application using +// wxHelpProvider::Set(). +// +// Special note about ShowHelpAtPoint() and ShowHelp(): we want to be able to +// override ShowHelpAtPoint() when we need to use different help messages for +// different parts of the window, but it should also be possible to override +// just ShowHelp() both for backwards compatibility and just because most +// often the help does not, in fact, depend on the position and so +// implementing just ShowHelp() is simpler and more natural, so by default +// ShowHelpAtPoint() forwards to ShowHelp(). But this means that +// wxSimpleHelpProvider has to override ShowHelp() and not ShowHelpAtPoint() +// for backwards compatibility as otherwise the existing code deriving from it +// and overriding ShowHelp() but calling the base class version wouldn't work +// any more, which forces us to use a rather ugly hack and pass the extra +// parameters of ShowHelpAtPoint() to ShowHelp() via member variables. +class WXDLLEXPORT wxHelpProvider +{ +public: + // get/set the current (application-global) help provider (Set() returns + // the previous one) + static wxHelpProvider *Set(wxHelpProvider *helpProvider) + { + wxHelpProvider *helpProviderOld = ms_helpProvider; + ms_helpProvider = helpProvider; + return helpProviderOld; + } + + // unlike some other class, the help provider is not created on demand, + // this must be explicitly done by the application + static wxHelpProvider *Get() { return ms_helpProvider; } + + // get the help string (whose interpretation is help provider dependent + // except that empty string always means that no help is associated with + // the window) for this window + virtual wxString GetHelp(const wxWindowBase *window) = 0; + + // do show help for the given window (uses window->GetHelpAtPoint() + // internally if applicable), return true if it was done or false + // if no help available for this window + virtual bool ShowHelpAtPoint(wxWindowBase *window, + const wxPoint& pt, + wxHelpEvent::Origin origin) + { + wxCHECK_MSG( window, false, _T("window must not be NULL") ); + + m_helptextAtPoint = pt; + m_helptextOrigin = origin; + + return ShowHelp(window); + } + + // show help for the given window, see ShowHelpAtPoint() above + virtual bool ShowHelp(wxWindowBase * WXUNUSED(window)) { return false; } + + // associate the text with the given window or id: although all help + // providers have these functions to allow making wxWindow::SetHelpText() + // work, not all of them implement them + virtual void AddHelp(wxWindowBase *window, const wxString& text); + + // this version associates the given text with all window with this id + // (may be used to set the same help string for all [Cancel] buttons in + // the application, for example) + virtual void AddHelp(wxWindowID id, const wxString& text); + + // removes the association + virtual void RemoveHelp(wxWindowBase* window); + + // virtual dtor for any base class + virtual ~wxHelpProvider(); + +protected: + wxHelpProvider() + : m_helptextAtPoint(wxDefaultPosition), + m_helptextOrigin(wxHelpEvent::Origin_Unknown) + { + } + + // helper method used by ShowHelp(): returns the help string to use by + // using m_helptextAtPoint/m_helptextOrigin if they're set or just GetHelp + // otherwise + wxString GetHelpTextMaybeAtPoint(wxWindowBase *window); + + + // parameters of the last ShowHelpAtPoint() call, used by ShowHelp() + wxPoint m_helptextAtPoint; + wxHelpEvent::Origin m_helptextOrigin; + +private: + static wxHelpProvider *ms_helpProvider; +}; + +WX_DECLARE_EXPORTED_HASH_MAP( wxUIntPtr, wxString, wxIntegerHash, + wxIntegerEqual, wxSimpleHelpProviderHashMap ); + +// wxSimpleHelpProvider is an implementation of wxHelpProvider which supports +// only plain text help strings and shows the string associated with the +// control (if any) in a tooltip +class WXDLLEXPORT wxSimpleHelpProvider : public wxHelpProvider +{ +public: + // implement wxHelpProvider methods + virtual wxString GetHelp(const wxWindowBase *window); + + // override ShowHelp() and not ShowHelpAtPoint() as explained above + virtual bool ShowHelp(wxWindowBase *window); + + virtual void AddHelp(wxWindowBase *window, const wxString& text); + virtual void AddHelp(wxWindowID id, const wxString& text); + virtual void RemoveHelp(wxWindowBase* window); + +protected: + // we use 2 hashes for storing the help strings associated with windows + // and the ids + wxSimpleHelpProviderHashMap m_hashWindows, + m_hashIds; +}; + +// wxHelpControllerHelpProvider is an implementation of wxHelpProvider which supports +// both context identifiers and plain text help strings. If the help text is an integer, +// it is passed to wxHelpController::DisplayContextPopup. Otherwise, it shows the string +// in a tooltip as per wxSimpleHelpProvider. +class WXDLLEXPORT wxHelpControllerHelpProvider : public wxSimpleHelpProvider +{ +public: + // Note that it doesn't own the help controller. The help controller + // should be deleted separately. + wxHelpControllerHelpProvider(wxHelpControllerBase* hc = (wxHelpControllerBase*) NULL); + + // implement wxHelpProvider methods + + // again (see above): this should be ShowHelpAtPoint() but we need to + // override ShowHelp() to avoid breaking existing code + virtual bool ShowHelp(wxWindowBase *window); + + // Other accessors + void SetHelpController(wxHelpControllerBase* hc) { m_helpController = hc; } + wxHelpControllerBase* GetHelpController() const { return m_helpController; } + +protected: + wxHelpControllerBase* m_helpController; + + DECLARE_NO_COPY_CLASS(wxHelpControllerHelpProvider) +}; + +// Convenience function for turning context id into wxString +WXDLLEXPORT wxString wxContextId(int id); + +#endif // wxUSE_HELP + +#endif // _WX_CSHELP_H_ + diff --git a/Externals/wxWidgets/include/wx/ctrlsub.h b/Externals/wxWidgets/include/wx/ctrlsub.h new file mode 100644 index 0000000000..dc29fe63ff --- /dev/null +++ b/Externals/wxWidgets/include/wx/ctrlsub.h @@ -0,0 +1,210 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/ctrlsub.h (read: "wxConTRoL with SUBitems") +// Purpose: wxControlWithItems interface +// Author: Vadim Zeitlin +// Modified by: +// Created: 22.10.99 +// RCS-ID: $Id: ctrlsub.h 42816 2006-10-31 08:50:17Z RD $ +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CTRLSUB_H_BASE_ +#define _WX_CTRLSUB_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_CONTROLS + +#include "wx/control.h" // base class + +// ---------------------------------------------------------------------------- +// wxItemContainer defines an interface which is implemented by all controls +// which have string subitems each of which may be selected. +// +// It is decomposed in wxItemContainerImmutable which omits all methods +// adding/removing items and is used by wxRadioBox and wxItemContainer itself. +// +// Examples: wxListBox, wxCheckListBox, wxChoice and wxComboBox (which +// implements an extended interface deriving from this one) +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxItemContainerImmutable +{ +public: + wxItemContainerImmutable() { } + virtual ~wxItemContainerImmutable(); + + // accessing strings + // ----------------- + + virtual unsigned int GetCount() const = 0; + bool IsEmpty() const { return GetCount() == 0; } + + virtual wxString GetString(unsigned int n) const = 0; + wxArrayString GetStrings() const; + virtual void SetString(unsigned int n, const wxString& s) = 0; + + // finding string natively is either case sensitive or insensitive + // but never both so fall back to this base version for not + // supported search type + virtual int FindString(const wxString& s, bool bCase = false) const + { + unsigned int count = GetCount(); + + for ( unsigned int i = 0; i < count ; ++i ) + { + if (GetString(i).IsSameAs( s , bCase )) + return (int)i; + } + + return wxNOT_FOUND; + } + + + // selection + // --------- + + virtual void SetSelection(int n) = 0; + virtual int GetSelection() const = 0; + + // set selection to the specified string, return false if not found + bool SetStringSelection(const wxString& s); + + // return the selected string or empty string if none + wxString GetStringSelection() const; + + // this is the same as SetSelection( for single-selection controls but + // reads better for multi-selection ones + void Select(int n) { SetSelection(n); } + + +protected: + + // check that the index is valid + inline bool IsValid(unsigned int n) const { return n < GetCount(); } + inline bool IsValidInsert(unsigned int n) const { return n <= GetCount(); } +}; + +class WXDLLEXPORT wxItemContainer : public wxItemContainerImmutable +{ +public: + wxItemContainer() { m_clientDataItemsType = wxClientData_None; } + virtual ~wxItemContainer(); + + // adding items + // ------------ + + int Append(const wxString& item) + { return DoAppend(item); } + int Append(const wxString& item, void *clientData) + { int n = DoAppend(item); SetClientData(n, clientData); return n; } + int Append(const wxString& item, wxClientData *clientData) + { int n = DoAppend(item); SetClientObject(n, clientData); return n; } + + // only for rtti needs (separate name) + void AppendString( const wxString& item) + { Append( item ); } + + // append several items at once to the control + void Append(const wxArrayString& strings); + + int Insert(const wxString& item, unsigned int pos) + { return DoInsert(item, pos); } + int Insert(const wxString& item, unsigned int pos, void *clientData); + int Insert(const wxString& item, unsigned int pos, wxClientData *clientData); + + // deleting items + // -------------- + + virtual void Clear() = 0; + virtual void Delete(unsigned int n) = 0; + + // misc + // ---- + + // client data stuff + void SetClientData(unsigned int n, void* clientData); + void* GetClientData(unsigned int n) const; + + void SetClientObject(unsigned int n, wxClientData* clientData); + wxClientData* GetClientObject(unsigned int n) const; + + bool HasClientObjectData() const + { return m_clientDataItemsType == wxClientData_Object; } + bool HasClientUntypedData() const + { return m_clientDataItemsType == wxClientData_Void; } + +protected: + virtual int DoAppend(const wxString& item) = 0; + virtual int DoInsert(const wxString& item, unsigned int pos) = 0; + + virtual void DoSetItemClientData(unsigned int n, void* clientData) = 0; + virtual void* DoGetItemClientData(unsigned int n) const = 0; + virtual void DoSetItemClientObject(unsigned int n, wxClientData* clientData) = 0; + virtual wxClientData* DoGetItemClientObject(unsigned int n) const = 0; + + + // the type of the client data for the items + wxClientDataType m_clientDataItemsType; +}; + +// this macro must (unfortunately) be used in any class deriving from both +// wxItemContainer and wxControl because otherwise there is ambiguity when +// calling GetClientXXX() functions -- the compiler can't choose between the +// two versions +#define wxCONTROL_ITEMCONTAINER_CLIENTDATAOBJECT_RECAST \ + void SetClientData(void *data) \ + { wxEvtHandler::SetClientData(data); } \ + void *GetClientData() const \ + { return wxEvtHandler::GetClientData(); } \ + void SetClientObject(wxClientData *data) \ + { wxEvtHandler::SetClientObject(data); } \ + wxClientData *GetClientObject() const \ + { return wxEvtHandler::GetClientObject(); } \ + void SetClientData(unsigned int n, void* clientData) \ + { wxItemContainer::SetClientData(n, clientData); } \ + void* GetClientData(unsigned int n) const \ + { return wxItemContainer::GetClientData(n); } \ + void SetClientObject(unsigned int n, wxClientData* clientData) \ + { wxItemContainer::SetClientObject(n, clientData); } \ + wxClientData* GetClientObject(unsigned int n) const \ + { return wxItemContainer::GetClientObject(n); } + +class WXDLLEXPORT wxControlWithItems : public wxControl, public wxItemContainer +{ +public: + wxControlWithItems() { } + virtual ~wxControlWithItems(); + + // we have to redefine these functions here to avoid ambiguities in classes + // deriving from us which would arise otherwise because both base classses + // have the methods with the same names - hopefully, a smart compiler can + // optimize away these simple inline wrappers so we don't suffer much from + // this + wxCONTROL_ITEMCONTAINER_CLIENTDATAOBJECT_RECAST + + // usually the controls like list/combo boxes have their own background + // colour + virtual bool ShouldInheritColours() const { return false; } + +protected: + // fill in the client object or data field of the event as appropriate + // + // calls InitCommandEvent() and, if n != wxNOT_FOUND, also sets the per + // item client data + void InitCommandEventWithItems(wxCommandEvent& event, int n); + +private: + DECLARE_ABSTRACT_CLASS(wxControlWithItems) + DECLARE_NO_COPY_CLASS(wxControlWithItems) +}; + + +// ---------------------------------------------------------------------------- +// inline functions +// ---------------------------------------------------------------------------- + +#endif // wxUSE_CONTROLS + +#endif // _WX_CTRLSUB_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/cursor.h b/Externals/wxWidgets/include/wx/cursor.h new file mode 100644 index 0000000000..d072ff56a7 --- /dev/null +++ b/Externals/wxWidgets/include/wx/cursor.h @@ -0,0 +1,79 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/cursor.h +// Purpose: wxCursor base header +// Author: Julian Smart +// Modified by: +// Created: +// Copyright: (c) Julian Smart +// RCS-ID: $Id: cursor.h 40865 2006-08-27 09:42:42Z VS $ +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CURSOR_H_BASE_ +#define _WX_CURSOR_H_BASE_ + +#include "wx/defs.h" + +#if defined(__WXPALMOS__) + #include "wx/palmos/cursor.h" +#elif defined(__WXMSW__) + #include "wx/msw/cursor.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/cursor.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/cursor.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/cursor.h" +#elif defined(__WXX11__) + #include "wx/x11/cursor.h" +#elif defined(__WXMGL__) + #include "wx/mgl/cursor.h" +#elif defined(__WXDFB__) + #include "wx/dfb/cursor.h" +#elif defined(__WXMAC__) + #include "wx/mac/cursor.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/cursor.h" +#elif defined(__WXPM__) + #include "wx/os2/cursor.h" +#endif + +#include "wx/utils.h" + +/* This is a small class which can be used by all ports + to temporarily suspend the busy cursor. Useful in modal + dialogs. + + Actually that is not (any longer) quite true.. currently it is + only used in wxGTK Dialog::ShowModal() and now uses static + wxBusyCursor methods that are only implemented for wxGTK so far. + The BusyCursor handling code should probably be implemented in + common code somewhere instead of the separate implementations we + currently have. Also the name BusyCursorSuspender is a little + misleading since it doesn't actually suspend the BusyCursor, just + masks one that is already showing. + If another call to wxBeginBusyCursor is made while this is active + the Busy Cursor will again be shown. But at least now it doesn't + interfere with the state of wxIsBusy() -- RL + +*/ +class wxBusyCursorSuspender +{ +public: + wxBusyCursorSuspender() + { + if( wxIsBusy() ) + { + wxSetCursor( wxBusyCursor::GetStoredCursor() ); + } + } + ~wxBusyCursorSuspender() + { + if( wxIsBusy() ) + { + wxSetCursor( wxBusyCursor::GetBusyCursor() ); + } + } +}; +#endif + // _WX_CURSOR_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/dataobj.h b/Externals/wxWidgets/include/wx/dataobj.h new file mode 100644 index 0000000000..31a756e235 --- /dev/null +++ b/Externals/wxWidgets/include/wx/dataobj.h @@ -0,0 +1,540 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/dataobj.h +// Purpose: common data object classes +// Author: Vadim Zeitlin, Robert Roebling +// Modified by: +// Created: 26.05.99 +// RCS-ID: $Id: dataobj.h 40772 2006-08-23 13:38:45Z VZ $ +// Copyright: (c) wxWidgets Team +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DATAOBJ_H_BASE_ +#define _WX_DATAOBJ_H_BASE_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- +#include "wx/defs.h" + +#if wxUSE_DATAOBJ + +#include "wx/string.h" +#include "wx/bitmap.h" +#include "wx/list.h" +#include "wx/arrstr.h" + +// ============================================================================ +/* + Generic data transfer related classes. The class hierarchy is as follows: + + - wxDataObject- + / \ + / \ + wxDataObjectSimple wxDataObjectComposite + / | \ + / | \ + wxTextDataObject | wxBitmapDataObject + | + wxCustomDataObject + +*/ +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxDataFormat class is declared in platform-specific headers: it represents +// a format for data which may be either one of the standard ones (text, +// bitmap, ...) or a custom one which is then identified by a unique string. +// ---------------------------------------------------------------------------- + +/* the class interface looks like this (pseudo code): + +class wxDataFormat +{ +public: + typedef NativeFormat; + + wxDataFormat(NativeFormat format = wxDF_INVALID); + wxDataFormat(const wxChar *format); + + wxDataFormat& operator=(NativeFormat format); + wxDataFormat& operator=(const wxDataFormat& format); + + bool operator==(NativeFormat format) const; + bool operator!=(NativeFormat format) const; + + void SetType(NativeFormat format); + NativeFormat GetType() const; + + wxString GetId() const; + void SetId(const wxChar *format); +}; + +*/ + +#if defined(__WXMSW__) + #include "wx/msw/ole/dataform.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/dataform.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/dataform.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/dataform.h" +#elif defined(__WXX11__) + #include "wx/x11/dataform.h" +#elif defined(__WXMAC__) + #include "wx/mac/dataform.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/dataform.h" +#elif defined(__WXPM__) + #include "wx/os2/dataform.h" +#endif + +// the value for default argument to some functions (corresponds to +// wxDF_INVALID) +extern WXDLLEXPORT const wxDataFormat& wxFormatInvalid; + +// ---------------------------------------------------------------------------- +// wxDataObject represents a piece of data which knows which formats it +// supports and knows how to render itself in each of them - GetDataHere(), +// and how to restore data from the buffer (SetData()). +// +// Although this class may be used directly (i.e. custom classes may be +// derived from it), in many cases it might be simpler to use either +// wxDataObjectSimple or wxDataObjectComposite classes. +// +// A data object may be "read only", i.e. support only GetData() functions or +// "read-write", i.e. support both GetData() and SetData() (in principle, it +// might be "write only" too, but this is rare). Moreover, it doesn't have to +// support the same formats in Get() and Set() directions: for example, a data +// object containing JPEG image might accept BMPs in GetData() because JPEG +// image may be easily transformed into BMP but not in SetData(). Accordingly, +// all methods dealing with formats take an additional "direction" argument +// which is either SET or GET and which tells the function if the format needs +// to be supported by SetData() or GetDataHere(). +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxDataObjectBase +{ +public: + enum Direction + { + Get = 0x01, // format is supported by GetDataHere() + Set = 0x02, // format is supported by SetData() + Both = 0x03 // format is supported by both (unused currently) + }; + + // this class is polymorphic, hence it needs a virtual dtor + virtual ~wxDataObjectBase(); + + // get the best suited format for rendering our data + virtual wxDataFormat GetPreferredFormat(Direction dir = Get) const = 0; + + // get the number of formats we support + virtual size_t GetFormatCount(Direction dir = Get) const = 0; + + // return all formats in the provided array (of size GetFormatCount()) + virtual void GetAllFormats(wxDataFormat *formats, + Direction dir = Get) const = 0; + + // get the (total) size of data for the given format + virtual size_t GetDataSize(const wxDataFormat& format) const = 0; + + // copy raw data (in the specified format) to the provided buffer, return + // true if data copied successfully, false otherwise + virtual bool GetDataHere(const wxDataFormat& format, void *buf) const = 0; + + // get data from the buffer of specified length (in the given format), + // return true if the data was read successfully, false otherwise + virtual bool SetData(const wxDataFormat& WXUNUSED(format), + size_t WXUNUSED(len), const void * WXUNUSED(buf)) + { + return false; + } + + // returns true if this format is supported + bool IsSupported(const wxDataFormat& format, Direction dir = Get) const; +}; + +// ---------------------------------------------------------------------------- +// include the platform-specific declarations of wxDataObject +// ---------------------------------------------------------------------------- + +#if defined(__WXMSW__) + #include "wx/msw/ole/dataobj.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/dataobj.h" +#elif defined(__WXX11__) + #include "wx/x11/dataobj.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/dataobj.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/dataobj.h" +#elif defined(__WXMAC__) + #include "wx/mac/dataobj.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/dataobj.h" +#elif defined(__WXPM__) + #include "wx/os2/dataobj.h" +#endif + +// ---------------------------------------------------------------------------- +// wxDataObjectSimple is a wxDataObject which only supports one format (in +// both Get and Set directions, but you may return false from GetDataHere() or +// SetData() if one of them is not supported). This is the simplest possible +// wxDataObject implementation. +// +// This is still an "abstract base class" (although it doesn't have any pure +// virtual functions), to use it you should derive from it and implement +// GetDataSize(), GetDataHere() and SetData() functions because the base class +// versions don't do anything - they just return "not implemented". +// +// This class should be used when you provide data in only one format (no +// conversion to/from other formats), either a standard or a custom one. +// Otherwise, you should use wxDataObjectComposite or wxDataObject directly. +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxDataObjectSimple : public wxDataObject +{ +public: + // ctor takes the format we support, but it can also be set later with + // SetFormat() + wxDataObjectSimple(const wxDataFormat& format = wxFormatInvalid) + : m_format(format) + { + } + + // get/set the format we support + const wxDataFormat& GetFormat() const { return m_format; } + void SetFormat(const wxDataFormat& format) { m_format = format; } + + // virtual functions to override in derived class (the base class versions + // just return "not implemented") + // ----------------------------------------------------------------------- + + // get the size of our data + virtual size_t GetDataSize() const + { return 0; } + + // copy our data to the buffer + virtual bool GetDataHere(void *WXUNUSED(buf)) const + { return false; } + + // copy data from buffer to our data + virtual bool SetData(size_t WXUNUSED(len), const void *WXUNUSED(buf)) + { return false; } + + // implement base class pure virtuals + // ---------------------------------- + virtual wxDataFormat GetPreferredFormat(wxDataObjectBase::Direction WXUNUSED(dir) = Get) const + { return m_format; } + virtual size_t GetFormatCount(wxDataObjectBase::Direction WXUNUSED(dir) = Get) const + { return 1; } + virtual void GetAllFormats(wxDataFormat *formats, + wxDataObjectBase::Direction WXUNUSED(dir) = Get) const + { *formats = m_format; } + virtual size_t GetDataSize(const wxDataFormat& WXUNUSED(format)) const + { return GetDataSize(); } + virtual bool GetDataHere(const wxDataFormat& WXUNUSED(format), + void *buf) const + { return GetDataHere(buf); } + virtual bool SetData(const wxDataFormat& WXUNUSED(format), + size_t len, const void *buf) + { return SetData(len, buf); } + +private: + // the one and only format we support + wxDataFormat m_format; + + DECLARE_NO_COPY_CLASS(wxDataObjectSimple) +}; + +// ---------------------------------------------------------------------------- +// wxDataObjectComposite is the simplest way to implement wxDataObject +// supporting multiple formats. It contains several wxDataObjectSimple and +// supports all formats supported by any of them. +// +// This class shouldn't be (normally) derived from, but may be used directly. +// If you need more flexibility than what it provides, you should probably use +// wxDataObject directly. +// ---------------------------------------------------------------------------- + +WX_DECLARE_EXPORTED_LIST(wxDataObjectSimple, wxSimpleDataObjectList); + +class WXDLLEXPORT wxDataObjectComposite : public wxDataObject +{ +public: + // ctor + wxDataObjectComposite(); + virtual ~wxDataObjectComposite(); + + // add data object (it will be deleted by wxDataObjectComposite, hence it + // must be allocated on the heap) whose format will become the preferred + // one if preferred == true + void Add(wxDataObjectSimple *dataObject, bool preferred = false); + + // Report the format passed to the SetData method. This should be the + // format of the data object within the composite that recieved data from + // the clipboard or the DnD operation. You can use this method to find + // out what kind of data object was recieved. + wxDataFormat GetReceivedFormat() const; + + // implement base class pure virtuals + // ---------------------------------- + virtual wxDataFormat GetPreferredFormat(wxDataObjectBase::Direction dir = Get) const; + virtual size_t GetFormatCount(wxDataObjectBase::Direction dir = Get) const; + virtual void GetAllFormats(wxDataFormat *formats, wxDataObjectBase::Direction dir = Get) const; + virtual size_t GetDataSize(const wxDataFormat& format) const; + virtual bool GetDataHere(const wxDataFormat& format, void *buf) const; + virtual bool SetData(const wxDataFormat& format, size_t len, const void *buf); +#if defined(__WXMSW__) + virtual const void* GetSizeFromBuffer( const void* buffer, size_t* size, + const wxDataFormat& format ); + virtual void* SetSizeInBuffer( void* buffer, size_t size, + const wxDataFormat& format ); + virtual size_t GetBufferOffset( const wxDataFormat& format ); +#endif + +protected: + // returns the pointer to the object which supports this format or NULL + wxDataObjectSimple *GetObject(const wxDataFormat& format) const; + +private: + // the list of all (simple) data objects whose formats we support + wxSimpleDataObjectList m_dataObjects; + + // the index of the preferred one (0 initially, so by default the first + // one is the preferred) + size_t m_preferred; + + wxDataFormat m_receivedFormat; + + DECLARE_NO_COPY_CLASS(wxDataObjectComposite) +}; + +// ============================================================================ +// Standard implementations of wxDataObjectSimple which can be used directly +// (i.e. without having to derive from them) for standard data type transfers. +// +// Note that although all of them can work with provided data, you can also +// override their virtual GetXXX() functions to only provide data on demand. +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxTextDataObject contains text data +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxTextDataObject : public wxDataObjectSimple +{ +public: + // ctor: you can specify the text here or in SetText(), or override + // GetText() + wxTextDataObject(const wxString& text = wxEmptyString) + : wxDataObjectSimple( +#if wxUSE_UNICODE + wxDF_UNICODETEXT +#else + wxDF_TEXT +#endif + ), + m_text(text) + { + } + + // virtual functions which you may override if you want to provide text on + // demand only - otherwise, the trivial default versions will be used + virtual size_t GetTextLength() const { return m_text.Len() + 1; } + virtual wxString GetText() const { return m_text; } + virtual void SetText(const wxString& text) { m_text = text; } + + // implement base class pure virtuals + // ---------------------------------- + + // some platforms have 2 and not 1 format for text data +#if wxUSE_UNICODE && (defined(__WXGTK20__) || defined(__WXMAC__)) + virtual size_t GetFormatCount(Direction WXUNUSED(dir) = Get) const { return 2; } + virtual void GetAllFormats(wxDataFormat *formats, + wxDataObjectBase::Direction WXUNUSED(dir) = Get) const; + + virtual size_t GetDataSize() const { return GetDataSize(GetPreferredFormat()); } + virtual bool GetDataHere(void *buf) const { return GetDataHere(GetPreferredFormat(), buf); } + virtual bool SetData(size_t len, const void *buf) { return SetData(GetPreferredFormat(), len, buf); } + + size_t GetDataSize(const wxDataFormat& format) const; + bool GetDataHere(const wxDataFormat& format, void *pBuf) const; + bool SetData(const wxDataFormat& format, size_t nLen, const void* pBuf); +#else + virtual size_t GetDataSize() const; + virtual bool GetDataHere(void *buf) const; + virtual bool SetData(size_t len, const void *buf); + // Must provide overloads to avoid hiding them (and warnings about it) + virtual size_t GetDataSize(const wxDataFormat&) const + { + return GetDataSize(); + } + virtual bool GetDataHere(const wxDataFormat&, void *buf) const + { + return GetDataHere(buf); + } + virtual bool SetData(const wxDataFormat&, size_t len, const void *buf) + { + return SetData(len, buf); + } +#endif + +private: + wxString m_text; + + DECLARE_NO_COPY_CLASS(wxTextDataObject) +}; + +// ---------------------------------------------------------------------------- +// wxBitmapDataObject contains a bitmap +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxBitmapDataObjectBase : public wxDataObjectSimple +{ +public: + // ctor: you can specify the bitmap here or in SetBitmap(), or override + // GetBitmap() + wxBitmapDataObjectBase(const wxBitmap& bitmap = wxNullBitmap) + : wxDataObjectSimple(wxDF_BITMAP), m_bitmap(bitmap) + { + } + + // virtual functions which you may override if you want to provide data on + // demand only - otherwise, the trivial default versions will be used + virtual wxBitmap GetBitmap() const { return m_bitmap; } + virtual void SetBitmap(const wxBitmap& bitmap) { m_bitmap = bitmap; } + +protected: + wxBitmap m_bitmap; + + DECLARE_NO_COPY_CLASS(wxBitmapDataObjectBase) +}; + +// ---------------------------------------------------------------------------- +// wxFileDataObject contains a list of filenames +// +// NB: notice that this is a "write only" object, it can only be filled with +// data from drag and drop operation. +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxFileDataObjectBase : public wxDataObjectSimple +{ +public: + // ctor: use AddFile() later to fill the array + wxFileDataObjectBase() : wxDataObjectSimple(wxDF_FILENAME) { } + + // get a reference to our array + const wxArrayString& GetFilenames() const { return m_filenames; } + +protected: + wxArrayString m_filenames; + + DECLARE_NO_COPY_CLASS(wxFileDataObjectBase) +}; + +// ---------------------------------------------------------------------------- +// wxCustomDataObject contains arbitrary untyped user data. +// +// It is understood that this data can be copied bitwise. +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxCustomDataObject : public wxDataObjectSimple +{ +public: + // if you don't specify the format in the ctor, you can still use + // SetFormat() later + wxCustomDataObject(const wxDataFormat& format = wxFormatInvalid); + + // the dtor calls Free() + virtual ~wxCustomDataObject(); + + // you can call SetData() to set m_data: it will make a copy of the data + // you pass - or you can use TakeData() which won't copy anything, but + // will take ownership of data (i.e. will call Free() on it later) + void TakeData(size_t size, void *data); + + // this function is called to allocate "size" bytes of memory from + // SetData(). The default version uses operator new[]. + virtual void *Alloc(size_t size); + + // this function is called when the data is freed, you may override it to + // anything you want (or may be nothing at all). The default version calls + // operator delete[] on m_data + virtual void Free(); + + // get data: you may override these functions if you wish to provide data + // only when it's requested + virtual size_t GetSize() const { return m_size; } + virtual void *GetData() const { return m_data; } + + // implement base class pure virtuals + // ---------------------------------- + virtual size_t GetDataSize() const; + virtual bool GetDataHere(void *buf) const; + virtual bool SetData(size_t size, const void *buf); + // Must provide overloads to avoid hiding them (and warnings about it) + virtual size_t GetDataSize(const wxDataFormat&) const + { + return GetDataSize(); + } + virtual bool GetDataHere(const wxDataFormat&, void *buf) const + { + return GetDataHere(buf); + } + virtual bool SetData(const wxDataFormat&, size_t len, const void *buf) + { + return SetData(len, buf); + } + +private: + size_t m_size; + void *m_data; + + DECLARE_NO_COPY_CLASS(wxCustomDataObject) +}; + +// ---------------------------------------------------------------------------- +// include platform-specific declarations of wxXXXBase classes +// ---------------------------------------------------------------------------- + +#if defined(__WXMSW__) + #include "wx/msw/ole/dataobj2.h" + + // wxURLDataObject defined in msw/ole/dataobj2.h +#else // !__WXMSW__ + #if defined(__WXGTK20__) + #include "wx/gtk/dataobj2.h" + #elif defined(__WXGTK__) + #include "wx/gtk1/dataobj2.h" + #elif defined(__WXX11__) + #include "wx/x11/dataobj2.h" + #elif defined(__WXMOTIF__) + #include "wx/motif/dataobj2.h" + #elif defined(__WXMAC__) + #include "wx/mac/dataobj2.h" + #elif defined(__WXCOCOA__) + #include "wx/cocoa/dataobj2.h" + #elif defined(__WXPM__) + #include "wx/os2/dataobj2.h" + #endif + + // wxURLDataObject is simply wxTextDataObject with a different name + class WXDLLEXPORT wxURLDataObject : public wxTextDataObject + { + public: + wxURLDataObject(const wxString& url = wxEmptyString) + : wxTextDataObject(url) + { + } + + wxString GetURL() const { return GetText(); } + void SetURL(const wxString& url) { SetText(url); } + }; +#endif // __WXMSW__/!__WXMSW__ + +#endif // wxUSE_DATAOBJ + +#endif // _WX_DATAOBJ_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/dataview.h b/Externals/wxWidgets/include/wx/dataview.h new file mode 100644 index 0000000000..c84a424ea3 --- /dev/null +++ b/Externals/wxWidgets/include/wx/dataview.h @@ -0,0 +1,462 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/dataview.h +// Purpose: wxDataViewCtrl base classes +// Author: Robert Roebling +// Modified by: +// Created: 08.01.06 +// RCS-ID: $Id: dataview.h 42909 2006-11-01 15:24:48Z RR $ +// Copyright: (c) Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DATAVIEW_H_BASE_ +#define _WX_DATAVIEW_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_DATAVIEWCTRL + +#include "wx/control.h" +#include "wx/textctrl.h" +#include "wx/bitmap.h" +#include "wx/variant.h" + + +#if defined(__WXGTK20__) + // for testing + // #define wxUSE_GENERICDATAVIEWCTRL 1 +#elif defined(__WXMAC__) + #define wxUSE_GENERICDATAVIEWCTRL 1 +#else + #define wxUSE_GENERICDATAVIEWCTRL 1 +#endif + +// ---------------------------------------------------------------------------- +// wxDataViewCtrl flags +// ---------------------------------------------------------------------------- + +// ---------------------------------------------------------------------------- +// wxDataViewCtrl globals +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxDataViewModel; +class WXDLLIMPEXP_ADV wxDataViewListModel; +class WXDLLIMPEXP_ADV wxDataViewCtrl; +class WXDLLIMPEXP_ADV wxDataViewColumn; +class WXDLLIMPEXP_ADV wxDataViewRenderer; + +extern WXDLLIMPEXP_DATA_ADV(const wxChar) wxDataViewCtrlNameStr[]; + +// --------------------------------------------------------- +// wxDataViewModel +// --------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxDataViewModel: public wxObject +{ +public: + wxDataViewModel() { } + virtual ~wxDataViewModel() { } + +protected: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewModel) +}; + +// --------------------------------------------------------- +// wxDataViewListModelNotifier +// --------------------------------------------------------- + + +class WXDLLIMPEXP_ADV wxDataViewListModelNotifier: public wxObject +{ +public: + wxDataViewListModelNotifier() { } + virtual ~wxDataViewListModelNotifier() { } + + virtual bool RowAppended() = 0; + virtual bool RowPrepended() = 0; + virtual bool RowInserted( unsigned int before ) = 0; + virtual bool RowDeleted( unsigned int row ) = 0; + virtual bool RowChanged( unsigned int row ) = 0; + virtual bool ValueChanged( unsigned int col, unsigned int row ) = 0; + virtual bool RowsReordered( unsigned int *new_order ) = 0; + virtual bool Cleared() = 0; + + void SetOwner( wxDataViewListModel *owner ) { m_owner = owner; } + wxDataViewListModel *GetOwner() { return m_owner; } + +private: + wxDataViewListModel *m_owner; +}; + +// --------------------------------------------------------- +// wxDataViewListModel +// --------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxDataViewViewingColumn: public wxObject +{ +public: + wxDataViewViewingColumn( wxDataViewColumn *view_column, unsigned int model_column ) + { + m_viewColumn = view_column; + m_modelColumn = model_column; + } + + wxDataViewColumn *m_viewColumn; + unsigned int m_modelColumn; +}; + +class WXDLLIMPEXP_ADV wxDataViewListModel: public wxDataViewModel +{ +public: + wxDataViewListModel(); + virtual ~wxDataViewListModel(); + + virtual unsigned int GetNumberOfRows() = 0; + virtual unsigned int GetNumberOfCols() = 0; + // return type as reported by wxVariant + virtual wxString GetColType( unsigned int col ) = 0; + // get value into a wxVariant + virtual void GetValue( wxVariant &variant, unsigned int col, unsigned int row ) = 0; + // set value, call ValueChanged() afterwards! + virtual bool SetValue( wxVariant &variant, unsigned int col, unsigned int row ) = 0; + + // delegated notifiers + virtual bool RowAppended(); + virtual bool RowPrepended(); + virtual bool RowInserted( unsigned int before ); + virtual bool RowDeleted( unsigned int row ); + virtual bool RowChanged( unsigned int row ); + virtual bool ValueChanged( unsigned int col, unsigned int row ); + virtual bool RowsReordered( unsigned int *new_order ); + virtual bool Cleared(); + + // Used internally + void AddViewingColumn( wxDataViewColumn *view_column, unsigned int model_column ); + void RemoveViewingColumn( wxDataViewColumn *column ); + + void AddNotifier( wxDataViewListModelNotifier *notifier ); + void RemoveNotifier( wxDataViewListModelNotifier *notifier ); + + wxList m_notifiers; + wxList m_viewingColumns; + +protected: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewListModel) +}; + +// --------------------------------------------------------- +// wxDataViewSortedListModel +// --------------------------------------------------------- + +typedef int (wxCALLBACK *wxDataViewListModelCompare) + (unsigned int row1, unsigned int row2, unsigned int col, wxDataViewListModel* model ); + +WX_DEFINE_SORTED_USER_EXPORTED_ARRAY_SIZE_T(unsigned int, wxDataViewSortedIndexArray, WXDLLIMPEXP_ADV); + +class WXDLLIMPEXP_ADV wxDataViewSortedListModel: public wxDataViewListModel +{ +public: + wxDataViewSortedListModel( wxDataViewListModel *child ); + virtual ~wxDataViewSortedListModel(); + + void SetAscending( bool ascending ) { m_ascending = ascending; } + bool GetAscending() { return m_ascending; } + + virtual unsigned int GetNumberOfRows(); + virtual unsigned int GetNumberOfCols(); + // return type as reported by wxVariant + virtual wxString GetColType( unsigned int col ); + // get value into a wxVariant + virtual void GetValue( wxVariant &variant, unsigned int col, unsigned int row ); + // set value, call ValueChanged() afterwards! + virtual bool SetValue( wxVariant &variant, unsigned int col, unsigned int row ); + + // called from user + virtual bool RowAppended(); + virtual bool RowPrepended(); + virtual bool RowInserted( unsigned int before ); + virtual bool RowDeleted( unsigned int row ); + virtual bool RowChanged( unsigned int row ); + virtual bool ValueChanged( unsigned int col, unsigned int row ); + virtual bool RowsReordered( unsigned int *new_order ); + virtual bool Cleared(); + + // called if child's notifiers are called + bool ChildRowAppended(); + bool ChildRowPrepended(); + bool ChildRowInserted( unsigned int before ); + bool ChildRowDeleted( unsigned int row ); + bool ChildRowChanged( unsigned int row ); + bool ChildValueChanged( unsigned int col, unsigned int row ); + bool ChildRowsReordered( unsigned int *new_order ); + bool ChildCleared(); + + virtual void Resort(); + +private: + bool m_ascending; + wxDataViewListModel *m_child; + wxDataViewSortedIndexArray m_array; + wxDataViewListModelNotifier *m_notifierOnChild; + + void InitStatics(); // BAD + +protected: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewSortedListModel) +}; + +// --------------------------------------------------------- +// wxDataViewRendererBase +// --------------------------------------------------------- + +enum wxDataViewCellMode +{ + wxDATAVIEW_CELL_INERT, + wxDATAVIEW_CELL_ACTIVATABLE, + wxDATAVIEW_CELL_EDITABLE +}; + +enum wxDataViewCellRenderState +{ + wxDATAVIEW_CELL_SELECTED = 1, + wxDATAVIEW_CELL_PRELIT = 2, + wxDATAVIEW_CELL_INSENSITIVE = 4, + wxDATAVIEW_CELL_FOCUSED = 8 +}; + +class WXDLLIMPEXP_ADV wxDataViewRendererBase: public wxObject +{ +public: + wxDataViewRendererBase( const wxString &varianttype, wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT ); + + virtual bool SetValue( const wxVariant& WXUNUSED(value) ) { return true; } + virtual bool GetValue( wxVariant& WXUNUSED(value) ) { return true; } + virtual bool Validate( wxVariant& WXUNUSED(value) ) { return true; } + + wxString GetVariantType() { return m_variantType; } + wxDataViewCellMode GetMode() { return m_mode; } + + void SetOwner( wxDataViewColumn *owner ) { m_owner = owner; } + wxDataViewColumn* GetOwner() { return m_owner; } + +protected: + wxDataViewCellMode m_mode; + wxString m_variantType; + wxDataViewColumn *m_owner; + +protected: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewRendererBase) +}; + +// --------------------------------------------------------- +// wxDataViewColumnBase +// --------------------------------------------------------- + +enum wxDataViewColumnFlags +{ + wxDATAVIEW_COL_RESIZABLE = 1, + wxDATAVIEW_COL_SORTABLE = 2, + wxDATAVIEW_COL_HIDDEN = 4 +}; + +class WXDLLIMPEXP_ADV wxDataViewColumnBase: public wxObject +{ +public: + wxDataViewColumnBase( const wxString &title, wxDataViewRenderer *renderer, unsigned int model_column, + int width = 80, int flags = wxDATAVIEW_COL_RESIZABLE ); + wxDataViewColumnBase( const wxBitmap &bitmap, wxDataViewRenderer *renderer, unsigned int model_column, + int width = 80, int flags = wxDATAVIEW_COL_RESIZABLE ); + virtual ~wxDataViewColumnBase(); + + virtual void SetTitle( const wxString &title ); + virtual wxString GetTitle(); + + virtual void SetBitmap( const wxBitmap &bitmap ); + virtual const wxBitmap &GetBitmap(); + + virtual void SetAlignment( wxAlignment align ) = 0; + + virtual void SetSortable( bool sortable ) = 0; + virtual bool GetSortable() = 0; + virtual void SetSortOrder( bool ascending ) = 0; + virtual bool IsSortOrderAscending() = 0; + + wxDataViewRenderer* GetRenderer() { return m_renderer; } + + unsigned int GetModelColumn() { return m_model_column; } + + virtual void SetOwner( wxDataViewCtrl *owner ) { m_owner = owner; } + wxDataViewCtrl *GetOwner() { return m_owner; } + + virtual int GetWidth() = 0; + +private: + wxDataViewCtrl *m_ctrl; + wxDataViewRenderer *m_renderer; + int m_model_column; + int m_flags; + wxString m_title; + wxBitmap m_bitmap; + wxDataViewCtrl *m_owner; + +protected: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewColumnBase) +}; + +// --------------------------------------------------------- +// wxDataViewCtrlBase +// --------------------------------------------------------- + +#define wxDV_SINGLE 0x0000 // for convenience +#define wxDV_MULTIPLE 0x0020 // can select multiple items + +class WXDLLIMPEXP_ADV wxDataViewCtrlBase: public wxControl +{ +public: + wxDataViewCtrlBase(); + virtual ~wxDataViewCtrlBase(); + + virtual bool AssociateModel( wxDataViewListModel *model ); + wxDataViewListModel* GetModel(); + + // short cuts + bool AppendTextColumn( const wxString &label, unsigned int model_column, + wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = -1 ); + bool AppendToggleColumn( const wxString &label, unsigned int model_column, + wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = 30 ); + bool AppendProgressColumn( const wxString &label, unsigned int model_column, + wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = 80 ); + bool AppendDateColumn( const wxString &label, unsigned int model_column, + wxDataViewCellMode mode = wxDATAVIEW_CELL_ACTIVATABLE, int width = -1 ); + bool AppendBitmapColumn( const wxString &label, unsigned int model_column, + wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = -1 ); + bool AppendTextColumn( const wxBitmap &label, unsigned int model_column, + wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = -1 ); + bool AppendToggleColumn( const wxBitmap &label, unsigned int model_column, + wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = 30 ); + bool AppendProgressColumn( const wxBitmap &label, unsigned int model_column, + wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = 80 ); + bool AppendDateColumn( const wxBitmap &label, unsigned int model_column, + wxDataViewCellMode mode = wxDATAVIEW_CELL_ACTIVATABLE, int width = -1 ); + bool AppendBitmapColumn( const wxBitmap &label, unsigned int model_column, + wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = -1 ); + + virtual bool AppendColumn( wxDataViewColumn *col ); + virtual unsigned int GetNumberOfColumns(); + virtual bool DeleteColumn( unsigned int pos ); + virtual bool ClearColumns(); + virtual wxDataViewColumn* GetColumn( unsigned int pos ); + + virtual void SetSelection( int row ) = 0; // -1 for unselect + inline void ClearSelection() { SetSelection( -1 ); } + virtual void Unselect( unsigned int row ) = 0; + virtual void SetSelectionRange( unsigned int from, unsigned int to ) = 0; + virtual void SetSelections( const wxArrayInt& aSelections) = 0; + + virtual bool IsSelected( unsigned int row ) const = 0; + virtual int GetSelection() const = 0; + virtual int GetSelections(wxArrayInt& aSelections) const = 0; + +private: + wxDataViewListModel *m_model; + wxList m_cols; + +protected: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewCtrlBase) +}; + + +// ---------------------------------------------------------------------------- +// wxDataViewEvent - the event class for the wxDataViewCtrl notifications +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxDataViewEvent : public wxNotifyEvent +{ +public: + wxDataViewEvent(wxEventType commandType = wxEVT_NULL, int winid = 0) + : wxNotifyEvent(commandType, winid), + m_col(-1), + m_row(-1), + m_model(NULL), + m_value(wxNullVariant), + m_editCancelled(false), + m_column(NULL) + { } + + wxDataViewEvent(const wxDataViewEvent& event) + : wxNotifyEvent(event), + m_col(event.m_col), + m_row(event.m_col), + m_model(event.m_model), + m_value(event.m_value), + m_editCancelled(event.m_editCancelled), + m_column(event.m_column) + { } + + int GetColumn() const { return m_col; } + void SetColumn( int col ) { m_col = col; } + int GetRow() const { return m_row; } + void SetRow( int row ) { m_row = row; } + wxDataViewModel* GetModel() const { return m_model; } + void SetModel( wxDataViewModel *model ) { m_model = model; } + const wxVariant &GetValue() const { return m_value; } + void SetValue( const wxVariant &value ) { m_value = value; } + + // for wxEVT_DATAVIEW_COLUMN_HEADER_CLICKED only + void SetDataViewColumn( wxDataViewColumn *col ) { m_column = col; } + wxDataViewColumn *GetDataViewColumn() { return m_column; } + + // was label editing canceled? (for wxEVT_COMMAND_DATVIEW_END_LABEL_EDIT only) + bool IsEditCancelled() const { return m_editCancelled; } + void SetEditCanceled(bool editCancelled) { m_editCancelled = editCancelled; } + + virtual wxEvent *Clone() const { return new wxDataViewEvent(*this); } + +protected: + int m_col; + int m_row; + wxDataViewModel *m_model; + wxVariant m_value; + bool m_editCancelled; + wxDataViewColumn *m_column; + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxDataViewEvent) +}; + +BEGIN_DECLARE_EVENT_TYPES() + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_COMMAND_DATAVIEW_ROW_SELECTED, -1) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_COMMAND_DATAVIEW_ROW_ACTIVATED, -1) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_CLICK, -1) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK, -1) +END_DECLARE_EVENT_TYPES() + +typedef void (wxEvtHandler::*wxDataViewEventFunction)(wxDataViewEvent&); + +#define wxDataViewEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxDataViewEventFunction, &func) + +#define wx__DECLARE_DATAVIEWEVT(evt, id, fn) \ + wx__DECLARE_EVT1(wxEVT_COMMAND_DATAVIEW_ ## evt, id, wxDataViewEventHandler(fn)) + +#define EVT_DATAVIEW_ROW_SELECTED(id, fn) wx__DECLARE_DATAVIEWEVT(ROW_SELECTED, id, fn) +#define EVT_DATAVIEW_ROW_ACTIVATED(id, fn) wx__DECLARE_DATAVIEWEVT(ROW_ACTIVATED, id, fn) +#define EVT_DATAVIEW_COLUMN_HEADER_CLICK(id, fn) wx__DECLARE_DATAVIEWEVT(COLUMN_HEADER_CLICK, id, fn) +#define EVT_DATAVIEW_COLUMN_HEADER_RIGHT_CLICKED(id, fn) wx__DECLARE_DATAVIEWEVT(COLUMN_HEADER_RIGHT_CLICK, id, fn) + + +#if defined(wxUSE_GENERICDATAVIEWCTRL) + #include "wx/generic/dataview.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/dataview.h" +#elif defined(__WXMAC__) + // TODO + // #include "wx/mac/dataview.h" +#else + #include "wx/generic/dataview.h" +#endif + +#endif // wxUSE_DATAVIEWCTRL + +#endif + // _WX_DATAVIEW_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/datectrl.h b/Externals/wxWidgets/include/wx/datectrl.h new file mode 100644 index 0000000000..bb3aa3f6c5 --- /dev/null +++ b/Externals/wxWidgets/include/wx/datectrl.h @@ -0,0 +1,112 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/datectrl.h +// Purpose: implements wxDatePickerCtrl +// Author: Vadim Zeitlin +// Modified by: +// Created: 2005-01-09 +// RCS-ID: $Id: datectrl.h 37663 2006-02-21 22:14:31Z MR $ +// Copyright: (c) 2005 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DATECTRL_H_ +#define _WX_DATECTRL_H_ + +#include "wx/defs.h" + +#if wxUSE_DATEPICKCTRL + +#include "wx/control.h" // the base class +#include "wx/datetime.h" + +#define wxDatePickerCtrlNameStr _T("datectrl") + +// wxDatePickerCtrl styles +enum +{ + // default style on this platform, either wxDP_SPIN or wxDP_DROPDOWN + wxDP_DEFAULT = 0, + + // a spin control-like date picker (not supported in generic version) + wxDP_SPIN = 1, + + // a combobox-like date picker (not supported in mac version) + wxDP_DROPDOWN = 2, + + // always show century in the default date display (otherwise it depends on + // the system date format which may include the century or not) + wxDP_SHOWCENTURY = 4, + + // allow not having any valid date in the control (by default it always has + // some date, today initially if no valid date specified in ctor) + wxDP_ALLOWNONE = 8 +}; + +// ---------------------------------------------------------------------------- +// wxDatePickerCtrl: allow the user to enter the date +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxDatePickerCtrlBase : public wxControl +{ +public: + /* + The derived classes should implement ctor and Create() method with the + following signature: + + bool Create(wxWindow *parent, + wxWindowID id, + const wxDateTime& dt = wxDefaultDateTime, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDP_DEFAULT | wxDP_SHOWCENTURY, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxDatePickerCtrlNameStr); + */ + + // set/get the date + virtual void SetValue(const wxDateTime& dt) = 0; + virtual wxDateTime GetValue() const = 0; + + // set/get the allowed valid range for the dates, if either/both of them + // are invalid, there is no corresponding limit and if neither is set + // GetRange() returns false + virtual void SetRange(const wxDateTime& dt1, const wxDateTime& dt2) = 0; + virtual bool GetRange(wxDateTime *dt1, wxDateTime *dt2) const = 0; +}; + +#if defined(__WXPALMOS__) + #include "wx/palmos/datectrl.h" + + #define wxHAS_NATIVE_DATEPICKCTRL +#elif defined(__WXMSW__) && !defined(__WXUNIVERSAL__) + #include "wx/msw/datectrl.h" + + #define wxHAS_NATIVE_DATEPICKCTRL +#else + #include "wx/generic/datectrl.h" + + class WXDLLIMPEXP_ADV wxDatePickerCtrl : public wxDatePickerCtrlGeneric + { + public: + wxDatePickerCtrl() { } + wxDatePickerCtrl(wxWindow *parent, + wxWindowID id, + const wxDateTime& date = wxDefaultDateTime, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDP_DEFAULT | wxDP_SHOWCENTURY, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxDatePickerCtrlNameStr) + : wxDatePickerCtrlGeneric(parent, id, date, pos, size, style, validator, name) + { + } + + private: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxDatePickerCtrl) + }; +#endif + +#endif // wxUSE_DATEPICKCTRL + +#endif // _WX_DATECTRL_H_ + diff --git a/Externals/wxWidgets/include/wx/dateevt.h b/Externals/wxWidgets/include/wx/dateevt.h new file mode 100644 index 0000000000..a3458f7af6 --- /dev/null +++ b/Externals/wxWidgets/include/wx/dateevt.h @@ -0,0 +1,69 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/dateevt.h +// Purpose: declares wxDateEvent class +// Author: Vadim Zeitlin +// Modified by: +// Created: 2005-01-10 +// RCS-ID: $Id: dateevt.h 39637 2006-06-08 18:27:44Z RD $ +// Copyright: (c) 2005 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DATEEVT_H_ +#define _WX_DATEEVT_H_ + +#include "wx/event.h" +#include "wx/datetime.h" +#include "wx/window.h" + +// ---------------------------------------------------------------------------- +// wxDateEvent: used by wxCalendarCtrl and wxDatePickerCtrl +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxDateEvent : public wxCommandEvent +{ +public: + wxDateEvent() { } + wxDateEvent(wxWindow *win, const wxDateTime& dt, wxEventType type) + : wxCommandEvent(type, win->GetId()), + m_date(dt) + { + SetEventObject(win); + } + + const wxDateTime& GetDate() const { return m_date; } + void SetDate(const wxDateTime &date) { m_date = date; } + + // default copy ctor, assignment operator and dtor are ok + virtual wxEvent *Clone() const { return new wxDateEvent(*this); } + +private: + wxDateTime m_date; + + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxDateEvent) +}; + +// ---------------------------------------------------------------------------- +// event types and macros for handling them +// ---------------------------------------------------------------------------- + +BEGIN_DECLARE_EVENT_TYPES() + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_DATE_CHANGED, 1101) +END_DECLARE_EVENT_TYPES() + +typedef void (wxEvtHandler::*wxDateEventFunction)(wxDateEvent&); + +#define wxDateEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxDateEventFunction, &func) + +#define EVT_DATE_CHANGED(id, fn) \ + wx__DECLARE_EVT1(wxEVT_DATE_CHANGED, id, wxDateEventHandler(fn)) + +#ifdef _WX_DEFINE_DATE_EVENTS_ + DEFINE_EVENT_TYPE(wxEVT_DATE_CHANGED) + + IMPLEMENT_DYNAMIC_CLASS(wxDateEvent, wxCommandEvent) +#endif + +#endif // _WX_DATEEVT_H_ + diff --git a/Externals/wxWidgets/include/wx/datetime.h b/Externals/wxWidgets/include/wx/datetime.h new file mode 100644 index 0000000000..ca0c8712c4 --- /dev/null +++ b/Externals/wxWidgets/include/wx/datetime.h @@ -0,0 +1,2129 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/datetime.h +// Purpose: declarations of time/date related classes (wxDateTime, +// wxTimeSpan) +// Author: Vadim Zeitlin +// Modified by: +// Created: 10.02.99 +// RCS-ID: $Id: datetime.h 48283 2007-08-21 12:14:26Z JS $ +// Copyright: (c) 1998 Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DATETIME_H +#define _WX_DATETIME_H + +#include "wx/defs.h" + +#if wxUSE_DATETIME + +#ifndef __WXWINCE__ +#include +#else +#include "wx/msw/wince/time.h" +#endif + +#include // for INT_MIN + +#include "wx/longlong.h" + +class WXDLLIMPEXP_BASE wxDateTime; +class WXDLLIMPEXP_BASE wxTimeSpan; +class WXDLLIMPEXP_BASE wxDateSpan; + +#include "wx/dynarray.h" + +// not all c-runtimes are based on 1/1/1970 being (time_t) 0 +// set this to the corresponding value in seconds 1/1/1970 has on your +// systems c-runtime + +#if defined(__WXMAC__) && !defined(__DARWIN__) && __MSL__ < 0x6000 + #define WX_TIME_BASE_OFFSET ( 2082844800L + 126144000L ) +#else + #define WX_TIME_BASE_OFFSET 0 +#endif +/* + * TODO + * + * + 1. Time zones with minutes (make TimeZone a class) + * ? 2. getdate() function like under Solaris + * + 3. text conversion for wxDateSpan + * + 4. pluggable modules for the workdays calculations + * 5. wxDateTimeHolidayAuthority for Easter and other christian feasts + */ + +/* Two wrapper functions for thread safety */ +#ifdef HAVE_LOCALTIME_R +#define wxLocaltime_r localtime_r +#else +WXDLLIMPEXP_BASE struct tm *wxLocaltime_r(const time_t*, struct tm*); +#if wxUSE_THREADS && !defined(__WINDOWS__) && !defined(__WATCOMC__) + // On Windows, localtime _is_ threadsafe! +#warning using pseudo thread-safe wrapper for localtime to emulate localtime_r +#endif +#endif + +#ifdef HAVE_GMTIME_R +#define wxGmtime_r gmtime_r +#else +WXDLLIMPEXP_BASE struct tm *wxGmtime_r(const time_t*, struct tm*); +#if wxUSE_THREADS && !defined(__WINDOWS__) && !defined(__WATCOMC__) + // On Windows, gmtime _is_ threadsafe! +#warning using pseudo thread-safe wrapper for gmtime to emulate gmtime_r +#endif +#endif + +/* + The three (main) classes declared in this header represent: + + 1. An absolute moment in the time (wxDateTime) + 2. A difference between two moments in the time, positive or negative + (wxTimeSpan) + 3. A logical difference between two dates expressed in + years/months/weeks/days (wxDateSpan) + + The following arithmetic operations are permitted (all others are not): + + addition + -------- + + wxDateTime + wxTimeSpan = wxDateTime + wxDateTime + wxDateSpan = wxDateTime + wxTimeSpan + wxTimeSpan = wxTimeSpan + wxDateSpan + wxDateSpan = wxDateSpan + + subtraction + ------------ + wxDateTime - wxDateTime = wxTimeSpan + wxDateTime - wxTimeSpan = wxDateTime + wxDateTime - wxDateSpan = wxDateTime + wxTimeSpan - wxTimeSpan = wxTimeSpan + wxDateSpan - wxDateSpan = wxDateSpan + + multiplication + -------------- + wxTimeSpan * number = wxTimeSpan + number * wxTimeSpan = wxTimeSpan + wxDateSpan * number = wxDateSpan + number * wxDateSpan = wxDateSpan + + unitary minus + ------------- + -wxTimeSpan = wxTimeSpan + -wxDateSpan = wxDateSpan + + For each binary operation OP (+, -, *) we have the following operatorOP=() as + a method and the method with a symbolic name OPER (Add, Subtract, Multiply) + as a synonym for it and another const method with the same name which returns + the changed copy of the object and operatorOP() as a global function which is + implemented in terms of the const version of OPEN. For the unary - we have + operator-() as a method, Neg() as synonym for it and Negate() which returns + the copy of the object with the changed sign. +*/ + +// an invalid/default date time object which may be used as the default +// argument for arguments of type wxDateTime; it is also returned by all +// functions returning wxDateTime on failure (this is why it is also called +// wxInvalidDateTime) +class WXDLLIMPEXP_BASE wxDateTime; + +extern WXDLLIMPEXP_DATA_BASE(const wxChar*) wxDefaultDateTimeFormat; +extern WXDLLIMPEXP_DATA_BASE(const wxChar*) wxDefaultTimeSpanFormat; +extern WXDLLIMPEXP_DATA_BASE(const wxDateTime) wxDefaultDateTime; + +#define wxInvalidDateTime wxDefaultDateTime + +// ---------------------------------------------------------------------------- +// wxDateTime represents an absolute moment in the time +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxDateTime +{ +public: + // types + // ------------------------------------------------------------------------ + + // a small unsigned integer type for storing things like minutes, + // seconds &c. It should be at least short (i.e. not char) to contain + // the number of milliseconds - it may also be 'int' because there is + // no size penalty associated with it in our code, we don't store any + // data in this format + typedef unsigned short wxDateTime_t; + + // constants + // ------------------------------------------------------------------------ + + // the timezones + enum TZ + { + // the time in the current time zone + Local, + + // zones from GMT (= Greenwhich Mean Time): they're guaranteed to be + // consequent numbers, so writing something like `GMT0 + offset' is + // safe if abs(offset) <= 12 + + // underscore stands for minus + GMT_12, GMT_11, GMT_10, GMT_9, GMT_8, GMT_7, + GMT_6, GMT_5, GMT_4, GMT_3, GMT_2, GMT_1, + GMT0, + GMT1, GMT2, GMT3, GMT4, GMT5, GMT6, + GMT7, GMT8, GMT9, GMT10, GMT11, GMT12, GMT13, + // Note that GMT12 and GMT_12 are not the same: there is a difference + // of exactly one day between them + + // some symbolic names for TZ + + // Europe + WET = GMT0, // Western Europe Time + WEST = GMT1, // Western Europe Summer Time + CET = GMT1, // Central Europe Time + CEST = GMT2, // Central Europe Summer Time + EET = GMT2, // Eastern Europe Time + EEST = GMT3, // Eastern Europe Summer Time + MSK = GMT3, // Moscow Time + MSD = GMT4, // Moscow Summer Time + + // US and Canada + AST = GMT_4, // Atlantic Standard Time + ADT = GMT_3, // Atlantic Daylight Time + EST = GMT_5, // Eastern Standard Time + EDT = GMT_4, // Eastern Daylight Saving Time + CST = GMT_6, // Central Standard Time + CDT = GMT_5, // Central Daylight Saving Time + MST = GMT_7, // Mountain Standard Time + MDT = GMT_6, // Mountain Daylight Saving Time + PST = GMT_8, // Pacific Standard Time + PDT = GMT_7, // Pacific Daylight Saving Time + HST = GMT_10, // Hawaiian Standard Time + AKST = GMT_9, // Alaska Standard Time + AKDT = GMT_8, // Alaska Daylight Saving Time + + // Australia + + A_WST = GMT8, // Western Standard Time + A_CST = GMT13 + 1, // Central Standard Time (+9.5) + A_EST = GMT10, // Eastern Standard Time + A_ESST = GMT11, // Eastern Summer Time + + // New Zealand + NZST = GMT12, // Standard Time + NZDT = GMT13, // Daylight Saving Time + + // TODO add more symbolic timezone names here + + // Universal Coordinated Time = the new and politically correct name + // for GMT + UTC = GMT0 + }; + + // the calendar systems we know about: notice that it's valid (for + // this classes purpose anyhow) to work with any of these calendars + // even with the dates before the historical appearance of the + // calendar + enum Calendar + { + Gregorian, // current calendar + Julian // calendar in use since -45 until the 1582 (or later) + + // TODO Hebrew, Chinese, Maya, ... (just kidding) (or then may be not?) + }; + + // these values only are used to identify the different dates of + // adoption of the Gregorian calendar (see IsGregorian()) + // + // All data and comments taken verbatim from "The Calendar FAQ (v 2.0)" + // by Claus Tøndering, http://www.pip.dknet.dk/~c-t/calendar.html + // except for the comments "we take". + // + // Symbol "->" should be read as "was followed by" in the comments + // which follow. + enum GregorianAdoption + { + Gr_Unknown, // no data for this country or it's too uncertain to use + Gr_Standard, // on the day 0 of Gregorian calendar: 15 Oct 1582 + + Gr_Alaska, // Oct 1867 when Alaska became part of the USA + Gr_Albania, // Dec 1912 + + Gr_Austria = Gr_Unknown, // Different regions on different dates + Gr_Austria_Brixen, // 5 Oct 1583 -> 16 Oct 1583 + Gr_Austria_Salzburg = Gr_Austria_Brixen, + Gr_Austria_Tyrol = Gr_Austria_Brixen, + Gr_Austria_Carinthia, // 14 Dec 1583 -> 25 Dec 1583 + Gr_Austria_Styria = Gr_Austria_Carinthia, + + Gr_Belgium, // Then part of the Netherlands + + Gr_Bulgaria = Gr_Unknown, // Unknown precisely (from 1915 to 1920) + Gr_Bulgaria_1, // 18 Mar 1916 -> 1 Apr 1916 + Gr_Bulgaria_2, // 31 Mar 1916 -> 14 Apr 1916 + Gr_Bulgaria_3, // 3 Sep 1920 -> 17 Sep 1920 + + Gr_Canada = Gr_Unknown, // Different regions followed the changes in + // Great Britain or France + + Gr_China = Gr_Unknown, // Different authorities say: + Gr_China_1, // 18 Dec 1911 -> 1 Jan 1912 + Gr_China_2, // 18 Dec 1928 -> 1 Jan 1929 + + Gr_Czechoslovakia, // (Bohemia and Moravia) 6 Jan 1584 -> 17 Jan 1584 + Gr_Denmark, // (including Norway) 18 Feb 1700 -> 1 Mar 1700 + Gr_Egypt, // 1875 + Gr_Estonia, // 1918 + Gr_Finland, // Then part of Sweden + + Gr_France, // 9 Dec 1582 -> 20 Dec 1582 + Gr_France_Alsace, // 4 Feb 1682 -> 16 Feb 1682 + Gr_France_Lorraine, // 16 Feb 1760 -> 28 Feb 1760 + Gr_France_Strasbourg, // February 1682 + + Gr_Germany = Gr_Unknown, // Different states on different dates: + Gr_Germany_Catholic, // 1583-1585 (we take 1584) + Gr_Germany_Prussia, // 22 Aug 1610 -> 2 Sep 1610 + Gr_Germany_Protestant, // 18 Feb 1700 -> 1 Mar 1700 + + Gr_GreatBritain, // 2 Sep 1752 -> 14 Sep 1752 (use 'cal(1)') + + Gr_Greece, // 9 Mar 1924 -> 23 Mar 1924 + Gr_Hungary, // 21 Oct 1587 -> 1 Nov 1587 + Gr_Ireland = Gr_GreatBritain, + Gr_Italy = Gr_Standard, + + Gr_Japan = Gr_Unknown, // Different authorities say: + Gr_Japan_1, // 19 Dec 1872 -> 1 Jan 1873 + Gr_Japan_2, // 19 Dec 1892 -> 1 Jan 1893 + Gr_Japan_3, // 18 Dec 1918 -> 1 Jan 1919 + + Gr_Latvia, // 1915-1918 (we take 1915) + Gr_Lithuania, // 1915 + Gr_Luxemburg, // 14 Dec 1582 -> 25 Dec 1582 + Gr_Netherlands = Gr_Belgium, // (including Belgium) 1 Jan 1583 + + // this is too weird to take into account: the Gregorian calendar was + // introduced twice in Groningen, first time 28 Feb 1583 was followed + // by 11 Mar 1583, then it has gone back to Julian in the summer of + // 1584 and then 13 Dec 1700 -> 12 Jan 1701 - which is + // the date we take here + Gr_Netherlands_Groningen, // 13 Dec 1700 -> 12 Jan 1701 + Gr_Netherlands_Gelderland, // 30 Jun 1700 -> 12 Jul 1700 + Gr_Netherlands_Utrecht, // (and Overijssel) 30 Nov 1700->12 Dec 1700 + Gr_Netherlands_Friesland, // (and Drenthe) 31 Dec 1700 -> 12 Jan 1701 + + Gr_Norway = Gr_Denmark, // Then part of Denmark + Gr_Poland = Gr_Standard, + Gr_Portugal = Gr_Standard, + Gr_Romania, // 31 Mar 1919 -> 14 Apr 1919 + Gr_Russia, // 31 Jan 1918 -> 14 Feb 1918 + Gr_Scotland = Gr_GreatBritain, + Gr_Spain = Gr_Standard, + + // Sweden has a curious history. Sweden decided to make a gradual + // change from the Julian to the Gregorian calendar. By dropping every + // leap year from 1700 through 1740 the eleven superfluous days would + // be omitted and from 1 Mar 1740 they would be in sync with the + // Gregorian calendar. (But in the meantime they would be in sync with + // nobody!) + // + // So 1700 (which should have been a leap year in the Julian calendar) + // was not a leap year in Sweden. However, by mistake 1704 and 1708 + // became leap years. This left Sweden out of synchronisation with + // both the Julian and the Gregorian world, so they decided to go back + // to the Julian calendar. In order to do this, they inserted an extra + // day in 1712, making that year a double leap year! So in 1712, + // February had 30 days in Sweden. + // + // Later, in 1753, Sweden changed to the Gregorian calendar by + // dropping 11 days like everyone else. + Gr_Sweden = Gr_Finland, // 17 Feb 1753 -> 1 Mar 1753 + + Gr_Switzerland = Gr_Unknown,// Different cantons used different dates + Gr_Switzerland_Catholic, // 1583, 1584 or 1597 (we take 1584) + Gr_Switzerland_Protestant, // 31 Dec 1700 -> 12 Jan 1701 + + Gr_Turkey, // 1 Jan 1927 + Gr_USA = Gr_GreatBritain, + Gr_Wales = Gr_GreatBritain, + Gr_Yugoslavia // 1919 + }; + + // the country parameter is used so far for calculating the start and + // the end of DST period and for deciding whether the date is a work + // day or not + // + // TODO move this to intl.h + +// Required for WinCE +#ifdef USA +#undef USA +#endif + + enum Country + { + Country_Unknown, // no special information for this country + Country_Default, // set the default country with SetCountry() method + // or use the default country with any other + + // TODO add more countries (for this we must know about DST and/or + // holidays for this country) + + // Western European countries: we assume that they all follow the same + // DST rules (true or false?) + Country_WesternEurope_Start, + Country_EEC = Country_WesternEurope_Start, + France, + Germany, + UK, + Country_WesternEurope_End = UK, + + Russia, + USA + }; + // symbolic names for the months + enum Month + { + Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec, Inv_Month + }; + + // symbolic names for the weekdays + enum WeekDay + { + Sun, Mon, Tue, Wed, Thu, Fri, Sat, Inv_WeekDay + }; + + // invalid value for the year + enum Year + { + Inv_Year = SHRT_MIN // should hold in wxDateTime_t + }; + + // flags for GetWeekDayName and GetMonthName + enum NameFlags + { + Name_Full = 0x01, // return full name + Name_Abbr = 0x02 // return abbreviated name + }; + + // flags for GetWeekOfYear and GetWeekOfMonth + enum WeekFlags + { + Default_First, // Sunday_First for US, Monday_First for the rest + Monday_First, // week starts with a Monday + Sunday_First // week starts with a Sunday + }; + + // helper classes + // ------------------------------------------------------------------------ + + // a class representing a time zone: basicly, this is just an offset + // (in seconds) from GMT + class WXDLLIMPEXP_BASE TimeZone + { + public: + TimeZone(TZ tz); + TimeZone(wxDateTime_t offset = 0) { m_offset = offset; } + + long GetOffset() const { return m_offset; } + + private: + // offset for this timezone from GMT in seconds + long m_offset; + }; + + // standard struct tm is limited to the years from 1900 (because + // tm_year field is the offset from 1900), so we use our own struct + // instead to represent broken down time + // + // NB: this struct should always be kept normalized (i.e. mon should + // be < 12, 1 <= day <= 31 &c), so use AddMonths(), AddDays() + // instead of modifying the member fields directly! + struct WXDLLIMPEXP_BASE Tm + { + wxDateTime_t msec, sec, min, hour, mday; + Month mon; + int year; + + // default ctor inits the object to an invalid value + Tm(); + + // ctor from struct tm and the timezone + Tm(const struct tm& tm, const TimeZone& tz); + + // check that the given date/time is valid (in Gregorian calendar) + bool IsValid() const; + + // get the week day + WeekDay GetWeekDay() // not const because wday may be changed + { + if ( wday == Inv_WeekDay ) + ComputeWeekDay(); + + return (WeekDay)wday; + } + + // add the given number of months to the date keeping it normalized + void AddMonths(int monDiff); + + // add the given number of months to the date keeping it normalized + void AddDays(int dayDiff); + + private: + // compute the weekday from other fields + void ComputeWeekDay(); + + // the timezone we correspond to + TimeZone m_tz; + + // these values can't be accessed directly because they're not always + // computed and we calculate them on demand + wxDateTime_t wday, yday; + }; + + // static methods + // ------------------------------------------------------------------------ + + // set the current country + static void SetCountry(Country country); + // get the current country + static Country GetCountry(); + + // return true if the country is a West European one (in practice, + // this means that the same DST rules as for EEC apply) + static bool IsWestEuropeanCountry(Country country = Country_Default); + + // return the current year + static int GetCurrentYear(Calendar cal = Gregorian); + + // convert the year as returned by wxDateTime::GetYear() to a year + // suitable for BC/AD notation. The difference is that BC year 1 + // corresponds to the year 0 (while BC year 0 didn't exist) and AD + // year N is just year N. + static int ConvertYearToBC(int year); + + // return the current month + static Month GetCurrentMonth(Calendar cal = Gregorian); + + // returns true if the given year is a leap year in the given calendar + static bool IsLeapYear(int year = Inv_Year, Calendar cal = Gregorian); + + // get the century (19 for 1999, 20 for 2000 and -5 for 492 BC) + static int GetCentury(int year); + + // returns the number of days in this year (356 or 355 for Gregorian + // calendar usually :-) + static wxDateTime_t GetNumberOfDays(int year, Calendar cal = Gregorian); + + // get the number of the days in the given month (default value for + // the year means the current one) + static wxDateTime_t GetNumberOfDays(Month month, + int year = Inv_Year, + Calendar cal = Gregorian); + + // get the full (default) or abbreviated month name in the current + // locale, returns empty string on error + static wxString GetMonthName(Month month, + NameFlags flags = Name_Full); + + // get the full (default) or abbreviated weekday name in the current + // locale, returns empty string on error + static wxString GetWeekDayName(WeekDay weekday, + NameFlags flags = Name_Full); + + // get the AM and PM strings in the current locale (may be empty) + static void GetAmPmStrings(wxString *am, wxString *pm); + + // return true if the given country uses DST for this year + static bool IsDSTApplicable(int year = Inv_Year, + Country country = Country_Default); + + // get the beginning of DST for this year, will return invalid object + // if no DST applicable in this year. The default value of the + // parameter means to take the current year. + static wxDateTime GetBeginDST(int year = Inv_Year, + Country country = Country_Default); + // get the end of DST for this year, will return invalid object + // if no DST applicable in this year. The default value of the + // parameter means to take the current year. + static wxDateTime GetEndDST(int year = Inv_Year, + Country country = Country_Default); + + // return the wxDateTime object for the current time + static inline wxDateTime Now(); + + // return the wxDateTime object for the current time with millisecond + // precision (if available on this platform) + static wxDateTime UNow(); + + // return the wxDateTime object for today midnight: i.e. as Now() but + // with time set to 0 + static inline wxDateTime Today(); + + // constructors: you should test whether the constructor succeeded with + // IsValid() function. The values Inv_Month and Inv_Year for the + // parameters mean take current month and/or year values. + // ------------------------------------------------------------------------ + + // default ctor does not initialize the object, use Set()! + wxDateTime() { m_time = wxLongLong((long)ULONG_MAX, ULONG_MAX); } + + // from time_t: seconds since the Epoch 00:00:00 UTC, Jan 1, 1970) +#if (!(defined(__VISAGECPP__) && __IBMCPP__ >= 400)) +// VA C++ confuses this with wxDateTime(double jdn) thinking it is a duplicate declaration + inline wxDateTime(time_t timet); +#endif + // from broken down time/date (only for standard Unix range) + inline wxDateTime(const struct tm& tm); + // from broken down time/date (any range) + inline wxDateTime(const Tm& tm); + + // from JDN (beware of rounding errors) + inline wxDateTime(double jdn); + + // from separate values for each component, date set to today + inline wxDateTime(wxDateTime_t hour, + wxDateTime_t minute = 0, + wxDateTime_t second = 0, + wxDateTime_t millisec = 0); + // from separate values for each component with explicit date + inline wxDateTime(wxDateTime_t day, // day of the month + Month month, + int year = Inv_Year, // 1999, not 99 please! + wxDateTime_t hour = 0, + wxDateTime_t minute = 0, + wxDateTime_t second = 0, + wxDateTime_t millisec = 0); + + // default copy ctor ok + + // no dtor + + // assignment operators and Set() functions: all non const methods return + // the reference to this object. IsValid() should be used to test whether + // the function succeeded. + // ------------------------------------------------------------------------ + + // set to the current time + inline wxDateTime& SetToCurrent(); + +#if (!(defined(__VISAGECPP__) && __IBMCPP__ >= 400)) +// VA C++ confuses this with wxDateTime(double jdn) thinking it is a duplicate declaration + // set to given time_t value + inline wxDateTime& Set(time_t timet); +#endif + + // set to given broken down time/date + wxDateTime& Set(const struct tm& tm); + + // set to given broken down time/date + inline wxDateTime& Set(const Tm& tm); + + // set to given JDN (beware of rounding errors) + wxDateTime& Set(double jdn); + + // set to given time, date = today + wxDateTime& Set(wxDateTime_t hour, + wxDateTime_t minute = 0, + wxDateTime_t second = 0, + wxDateTime_t millisec = 0); + + // from separate values for each component with explicit date + // (defaults for month and year are the current values) + wxDateTime& Set(wxDateTime_t day, + Month month, + int year = Inv_Year, // 1999, not 99 please! + wxDateTime_t hour = 0, + wxDateTime_t minute = 0, + wxDateTime_t second = 0, + wxDateTime_t millisec = 0); + + // resets time to 00:00:00, doesn't change the date + wxDateTime& ResetTime(); + +#if wxABI_VERSION >= 20802 + // get the date part of this object only, i.e. the object which has the + // same date as this one but time of 00:00:00 + wxDateTime GetDateOnly() const; +#endif // wxABI 2.8.1+ + + // the following functions don't change the values of the other + // fields, i.e. SetMinute() won't change either hour or seconds value + + // set the year + wxDateTime& SetYear(int year); + // set the month + wxDateTime& SetMonth(Month month); + // set the day of the month + wxDateTime& SetDay(wxDateTime_t day); + // set hour + wxDateTime& SetHour(wxDateTime_t hour); + // set minute + wxDateTime& SetMinute(wxDateTime_t minute); + // set second + wxDateTime& SetSecond(wxDateTime_t second); + // set millisecond + wxDateTime& SetMillisecond(wxDateTime_t millisecond); + + // assignment operator from time_t + wxDateTime& operator=(time_t timet) { return Set(timet); } + + // assignment operator from broken down time/date + wxDateTime& operator=(const struct tm& tm) { return Set(tm); } + + // assignment operator from broken down time/date + wxDateTime& operator=(const Tm& tm) { return Set(tm); } + + // default assignment operator is ok + + // calendar calculations (functions which set the date only leave the time + // unchanged, e.g. don't explictly zero it): SetXXX() functions modify the + // object itself, GetXXX() ones return a new object. + // ------------------------------------------------------------------------ + + // set to the given week day in the same week as this one + wxDateTime& SetToWeekDayInSameWeek(WeekDay weekday, + WeekFlags flags = Monday_First); + inline wxDateTime GetWeekDayInSameWeek(WeekDay weekday, + WeekFlags flags = Monday_First) const; + + // set to the next week day following this one + wxDateTime& SetToNextWeekDay(WeekDay weekday); + inline wxDateTime GetNextWeekDay(WeekDay weekday) const; + + // set to the previous week day before this one + wxDateTime& SetToPrevWeekDay(WeekDay weekday); + inline wxDateTime GetPrevWeekDay(WeekDay weekday) const; + + // set to Nth occurence of given weekday in the given month of the + // given year (time is set to 0), return true on success and false on + // failure. n may be positive (1..5) or negative to count from the end + // of the month (see helper function SetToLastWeekDay()) + bool SetToWeekDay(WeekDay weekday, + int n = 1, + Month month = Inv_Month, + int year = Inv_Year); + inline wxDateTime GetWeekDay(WeekDay weekday, + int n = 1, + Month month = Inv_Month, + int year = Inv_Year) const; + + // sets to the last weekday in the given month, year + inline bool SetToLastWeekDay(WeekDay weekday, + Month month = Inv_Month, + int year = Inv_Year); + inline wxDateTime GetLastWeekDay(WeekDay weekday, + Month month = Inv_Month, + int year = Inv_Year); + +#if WXWIN_COMPATIBILITY_2_6 + // sets the date to the given day of the given week in the year, + // returns true on success and false if given date doesn't exist (e.g. + // numWeek is > 53) + // + // these functions are badly defined as they're not the reverse of + // GetWeekOfYear(), use SetToTheWeekOfYear() instead + wxDEPRECATED( bool SetToTheWeek(wxDateTime_t numWeek, + WeekDay weekday = Mon, + WeekFlags flags = Monday_First) ); + wxDEPRECATED( wxDateTime GetWeek(wxDateTime_t numWeek, + WeekDay weekday = Mon, + WeekFlags flags = Monday_First) const ); +#endif // WXWIN_COMPATIBILITY_2_6 + + // returns the date corresponding to the given week day of the given + // week (in ISO notation) of the specified year + static wxDateTime SetToWeekOfYear(int year, + wxDateTime_t numWeek, + WeekDay weekday = Mon); + + // sets the date to the last day of the given (or current) month or the + // given (or current) year + wxDateTime& SetToLastMonthDay(Month month = Inv_Month, + int year = Inv_Year); + inline wxDateTime GetLastMonthDay(Month month = Inv_Month, + int year = Inv_Year) const; + + // sets to the given year day (1..365 or 366) + wxDateTime& SetToYearDay(wxDateTime_t yday); + inline wxDateTime GetYearDay(wxDateTime_t yday) const; + + // The definitions below were taken verbatim from + // + // http://www.capecod.net/~pbaum/date/date0.htm + // + // (Peter Baum's home page) + // + // definition: The Julian Day Number, Julian Day, or JD of a + // particular instant of time is the number of days and fractions of a + // day since 12 hours Universal Time (Greenwich mean noon) on January + // 1 of the year -4712, where the year is given in the Julian + // proleptic calendar. The idea of using this reference date was + // originally proposed by Joseph Scalizer in 1582 to count years but + // it was modified by 19th century astronomers to count days. One + // could have equivalently defined the reference time to be noon of + // November 24, -4713 if were understood that Gregorian calendar rules + // were applied. Julian days are Julian Day Numbers and are not to be + // confused with Julian dates. + // + // definition: The Rata Die number is a date specified as the number + // of days relative to a base date of December 31 of the year 0. Thus + // January 1 of the year 1 is Rata Die day 1. + + // get the Julian Day number (the fractional part specifies the time of + // the day, related to noon - beware of rounding errors!) + double GetJulianDayNumber() const; + double GetJDN() const { return GetJulianDayNumber(); } + + // get the Modified Julian Day number: it is equal to JDN - 2400000.5 + // and so integral MJDs correspond to the midnights (and not noons). + // MJD 0 is Nov 17, 1858 + double GetModifiedJulianDayNumber() const { return GetJDN() - 2400000.5; } + double GetMJD() const { return GetModifiedJulianDayNumber(); } + + // get the Rata Die number + double GetRataDie() const; + + // TODO algorithms for calculating some important dates, such as + // religious holidays (Easter...) or moon/solar eclipses? Some + // algorithms can be found in the calendar FAQ + + + // Timezone stuff: a wxDateTime object constructed using given + // day/month/year/hour/min/sec values is interpreted as this moment in + // local time. Using the functions below, it may be converted to another + // time zone (e.g., the Unix epoch is wxDateTime(1, Jan, 1970).ToGMT()). + // + // These functions try to handle DST internally, but there is no magical + // way to know all rules for it in all countries in the world, so if the + // program can handle it itself (or doesn't want to handle it at all for + // whatever reason), the DST handling can be disabled with noDST. + // ------------------------------------------------------------------------ + + // transform to any given timezone + inline wxDateTime ToTimezone(const TimeZone& tz, bool noDST = false) const; + wxDateTime& MakeTimezone(const TimeZone& tz, bool noDST = false); + + // interpret current value as being in another timezone and transform + // it to local one + inline wxDateTime FromTimezone(const TimeZone& tz, bool noDST = false) const; + wxDateTime& MakeFromTimezone(const TimeZone& tz, bool noDST = false); + + // transform to/from GMT/UTC + wxDateTime ToUTC(bool noDST = false) const { return ToTimezone(UTC, noDST); } + wxDateTime& MakeUTC(bool noDST = false) { return MakeTimezone(UTC, noDST); } + + wxDateTime ToGMT(bool noDST = false) const { return ToUTC(noDST); } + wxDateTime& MakeGMT(bool noDST = false) { return MakeUTC(noDST); } + + wxDateTime FromUTC(bool noDST = false) const + { return FromTimezone(UTC, noDST); } + wxDateTime& MakeFromUTC(bool noDST = false) + { return MakeFromTimezone(UTC, noDST); } + + // is daylight savings time in effect at this moment according to the + // rules of the specified country? + // + // Return value is > 0 if DST is in effect, 0 if it is not and -1 if + // the information is not available (this is compatible with ANSI C) + int IsDST(Country country = Country_Default) const; + + + // accessors: many of them take the timezone parameter which indicates the + // timezone for which to make the calculations and the default value means + // to do it for the current timezone of this machine (even if the function + // only operates with the date it's necessary because a date may wrap as + // result of timezone shift) + // ------------------------------------------------------------------------ + + // is the date valid? + inline bool IsValid() const { return m_time != wxInvalidDateTime.m_time; } + + // get the broken down date/time representation in the given timezone + // + // If you wish to get several time components (day, month and year), + // consider getting the whole Tm strcuture first and retrieving the + // value from it - this is much more efficient + Tm GetTm(const TimeZone& tz = Local) const; + + // get the number of seconds since the Unix epoch - returns (time_t)-1 + // if the value is out of range + inline time_t GetTicks() const; + + // get the century, same as GetCentury(GetYear()) + int GetCentury(const TimeZone& tz = Local) const + { return GetCentury(GetYear(tz)); } + // get the year (returns Inv_Year if date is invalid) + int GetYear(const TimeZone& tz = Local) const + { return GetTm(tz).year; } + // get the month (Inv_Month if date is invalid) + Month GetMonth(const TimeZone& tz = Local) const + { return (Month)GetTm(tz).mon; } + // get the month day (in 1..31 range, 0 if date is invalid) + wxDateTime_t GetDay(const TimeZone& tz = Local) const + { return GetTm(tz).mday; } + // get the day of the week (Inv_WeekDay if date is invalid) + WeekDay GetWeekDay(const TimeZone& tz = Local) const + { return GetTm(tz).GetWeekDay(); } + // get the hour of the day + wxDateTime_t GetHour(const TimeZone& tz = Local) const + { return GetTm(tz).hour; } + // get the minute + wxDateTime_t GetMinute(const TimeZone& tz = Local) const + { return GetTm(tz).min; } + // get the second + wxDateTime_t GetSecond(const TimeZone& tz = Local) const + { return GetTm(tz).sec; } + // get milliseconds + wxDateTime_t GetMillisecond(const TimeZone& tz = Local) const + { return GetTm(tz).msec; } + + // get the day since the year start (1..366, 0 if date is invalid) + wxDateTime_t GetDayOfYear(const TimeZone& tz = Local) const; + // get the week number since the year start (1..52 or 53, 0 if date is + // invalid) + wxDateTime_t GetWeekOfYear(WeekFlags flags = Monday_First, + const TimeZone& tz = Local) const; + // get the week number since the month start (1..5, 0 if date is + // invalid) + wxDateTime_t GetWeekOfMonth(WeekFlags flags = Monday_First, + const TimeZone& tz = Local) const; + + // is this date a work day? This depends on a country, of course, + // because the holidays are different in different countries + bool IsWorkDay(Country country = Country_Default) const; + + // is this date later than Gregorian calendar introduction for the + // given country (see enum GregorianAdoption)? + // + // NB: this function shouldn't be considered as absolute authority in + // the matter. Besides, for some countries the exact date of + // adoption of the Gregorian calendar is simply unknown. + bool IsGregorianDate(GregorianAdoption country = Gr_Standard) const; + + // dos date and time format + // ------------------------------------------------------------------------ + + // set from the DOS packed format + wxDateTime& SetFromDOS(unsigned long ddt); + + // pack the date in DOS format + unsigned long GetAsDOS() const; + + // comparison (see also functions below for operator versions) + // ------------------------------------------------------------------------ + + // returns true if the two moments are strictly identical + inline bool IsEqualTo(const wxDateTime& datetime) const; + + // returns true if the date is strictly earlier than the given one + inline bool IsEarlierThan(const wxDateTime& datetime) const; + + // returns true if the date is strictly later than the given one + inline bool IsLaterThan(const wxDateTime& datetime) const; + + // returns true if the date is strictly in the given range + inline bool IsStrictlyBetween(const wxDateTime& t1, + const wxDateTime& t2) const; + + // returns true if the date is in the given range + inline bool IsBetween(const wxDateTime& t1, const wxDateTime& t2) const; + + // do these two objects refer to the same date? + inline bool IsSameDate(const wxDateTime& dt) const; + + // do these two objects have the same time? + inline bool IsSameTime(const wxDateTime& dt) const; + + // are these two objects equal up to given timespan? + inline bool IsEqualUpTo(const wxDateTime& dt, const wxTimeSpan& ts) const; + + inline bool operator<(const wxDateTime& dt) const + { + wxASSERT_MSG( IsValid() && dt.IsValid(), _T("invalid wxDateTime") ); + return GetValue() < dt.GetValue(); + } + + inline bool operator<=(const wxDateTime& dt) const + { + wxASSERT_MSG( IsValid() && dt.IsValid(), _T("invalid wxDateTime") ); + return GetValue() <= dt.GetValue(); + } + + inline bool operator>(const wxDateTime& dt) const + { + wxASSERT_MSG( IsValid() && dt.IsValid(), _T("invalid wxDateTime") ); + return GetValue() > dt.GetValue(); + } + + inline bool operator>=(const wxDateTime& dt) const + { + wxASSERT_MSG( IsValid() && dt.IsValid(), _T("invalid wxDateTime") ); + return GetValue() >= dt.GetValue(); + } + + inline bool operator==(const wxDateTime& dt) const + { + wxASSERT_MSG( IsValid() && dt.IsValid(), _T("invalid wxDateTime") ); + return GetValue() == dt.GetValue(); + } + + inline bool operator!=(const wxDateTime& dt) const + { + wxASSERT_MSG( IsValid() && dt.IsValid(), _T("invalid wxDateTime") ); + return GetValue() != dt.GetValue(); + } + + // arithmetics with dates (see also below for more operators) + // ------------------------------------------------------------------------ + + // return the sum of the date with a time span (positive or negative) + inline wxDateTime Add(const wxTimeSpan& diff) const; + // add a time span (positive or negative) + inline wxDateTime& Add(const wxTimeSpan& diff); + // add a time span (positive or negative) + inline wxDateTime& operator+=(const wxTimeSpan& diff); + inline wxDateTime operator+(const wxTimeSpan& ts) const + { + wxDateTime dt(*this); + dt.Add(ts); + return dt; + } + + // return the difference of the date with a time span + inline wxDateTime Subtract(const wxTimeSpan& diff) const; + // subtract a time span (positive or negative) + inline wxDateTime& Subtract(const wxTimeSpan& diff); + // subtract a time span (positive or negative) + inline wxDateTime& operator-=(const wxTimeSpan& diff); + inline wxDateTime operator-(const wxTimeSpan& ts) const + { + wxDateTime dt(*this); + dt.Subtract(ts); + return dt; + } + + // return the sum of the date with a date span + inline wxDateTime Add(const wxDateSpan& diff) const; + // add a date span (positive or negative) + wxDateTime& Add(const wxDateSpan& diff); + // add a date span (positive or negative) + inline wxDateTime& operator+=(const wxDateSpan& diff); + inline wxDateTime operator+(const wxDateSpan& ds) const + { + wxDateTime dt(*this); + dt.Add(ds); + return dt; + } + + // return the difference of the date with a date span + inline wxDateTime Subtract(const wxDateSpan& diff) const; + // subtract a date span (positive or negative) + inline wxDateTime& Subtract(const wxDateSpan& diff); + // subtract a date span (positive or negative) + inline wxDateTime& operator-=(const wxDateSpan& diff); + inline wxDateTime operator-(const wxDateSpan& ds) const + { + wxDateTime dt(*this); + dt.Subtract(ds); + return dt; + } + + // return the difference between two dates + inline wxTimeSpan Subtract(const wxDateTime& dt) const; + inline wxTimeSpan operator-(const wxDateTime& dt2) const; + + // conversion to/from text: all conversions from text return the pointer to + // the next character following the date specification (i.e. the one where + // the scan had to stop) or NULL on failure. + // ------------------------------------------------------------------------ + + // parse a string in RFC 822 format (found e.g. in mail headers and + // having the form "Wed, 10 Feb 1999 19:07:07 +0100") + const wxChar *ParseRfc822Date(const wxChar* date); + // parse a date/time in the given format (see strptime(3)), fill in + // the missing (in the string) fields with the values of dateDef (by + // default, they will not change if they had valid values or will + // default to Today() otherwise) + const wxChar *ParseFormat(const wxChar *date, + const wxChar *format = wxDefaultDateTimeFormat, + const wxDateTime& dateDef = wxDefaultDateTime); + // parse a string containing the date/time in "free" format, this + // function will try to make an educated guess at the string contents + const wxChar *ParseDateTime(const wxChar *datetime); + // parse a string containing the date only in "free" format (less + // flexible than ParseDateTime) + const wxChar *ParseDate(const wxChar *date); + // parse a string containing the time only in "free" format + const wxChar *ParseTime(const wxChar *time); + + // this function accepts strftime()-like format string (default + // argument corresponds to the preferred date and time representation + // for the current locale) and returns the string containing the + // resulting text representation + wxString Format(const wxChar *format = wxDefaultDateTimeFormat, + const TimeZone& tz = Local) const; + // preferred date representation for the current locale + wxString FormatDate() const { return Format(_T("%x")); } + // preferred time representation for the current locale + wxString FormatTime() const { return Format(_T("%X")); } + // returns the string representing the date in ISO 8601 format + // (YYYY-MM-DD) + wxString FormatISODate() const { return Format(_T("%Y-%m-%d")); } + // returns the string representing the time in ISO 8601 format + // (HH:MM:SS) + wxString FormatISOTime() const { return Format(_T("%H:%M:%S")); } + + // implementation + // ------------------------------------------------------------------------ + + // construct from internal representation + wxDateTime(const wxLongLong& time) { m_time = time; } + + // get the internal representation + inline wxLongLong GetValue() const; + + // a helper function to get the current time_t + static time_t GetTimeNow() { return time((time_t *)NULL); } + + // another one to get the current time broken down + static struct tm *GetTmNow() + { +#ifdef __WXWINCE__ + static struct tm l_CurrentTime; + return GetTmNow(&l_CurrentTime); +#else + time_t t = GetTimeNow(); + return localtime(&t); +#endif + } + + // get current time using thread-safe function + static struct tm *GetTmNow(struct tm *tmstruct); + +private: + // the current country - as it's the same for all program objects (unless + // it runs on a _really_ big cluster system :-), this is a static member: + // see SetCountry() and GetCountry() + static Country ms_country; + + // this constant is used to transform a time_t value to the internal + // representation, as time_t is in seconds and we use milliseconds it's + // fixed to 1000 + static const long TIME_T_FACTOR; + + // returns true if we fall in range in which we can use standard ANSI C + // functions + inline bool IsInStdRange() const; + + // the internal representation of the time is the amount of milliseconds + // elapsed since the origin which is set by convention to the UNIX/C epoch + // value: the midnight of January 1, 1970 (UTC) + wxLongLong m_time; +}; + +// ---------------------------------------------------------------------------- +// This class contains a difference between 2 wxDateTime values, so it makes +// sense to add it to wxDateTime and it is the result of subtraction of 2 +// objects of that class. See also wxDateSpan. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxTimeSpan +{ +public: + // constructors + // ------------------------------------------------------------------------ + + // return the timespan for the given number of milliseconds + static wxTimeSpan Milliseconds(wxLongLong ms) { return wxTimeSpan(0, 0, 0, ms); } + static wxTimeSpan Millisecond() { return Milliseconds(1); } + + // return the timespan for the given number of seconds + static wxTimeSpan Seconds(wxLongLong sec) { return wxTimeSpan(0, 0, sec); } + static wxTimeSpan Second() { return Seconds(1); } + + // return the timespan for the given number of minutes + static wxTimeSpan Minutes(long min) { return wxTimeSpan(0, min, 0 ); } + static wxTimeSpan Minute() { return Minutes(1); } + + // return the timespan for the given number of hours + static wxTimeSpan Hours(long hours) { return wxTimeSpan(hours, 0, 0); } + static wxTimeSpan Hour() { return Hours(1); } + + // return the timespan for the given number of days + static wxTimeSpan Days(long days) { return Hours(24 * days); } + static wxTimeSpan Day() { return Days(1); } + + // return the timespan for the given number of weeks + static wxTimeSpan Weeks(long days) { return Days(7 * days); } + static wxTimeSpan Week() { return Weeks(1); } + + // default ctor constructs the 0 time span + wxTimeSpan() { } + + // from separate values for each component, date set to 0 (hours are + // not restricted to 0..24 range, neither are minutes, seconds or + // milliseconds) + inline wxTimeSpan(long hours, + long minutes = 0, + wxLongLong seconds = 0, + wxLongLong milliseconds = 0); + + // default copy ctor is ok + + // no dtor + + // arithmetics with time spans (see also below for more operators) + // ------------------------------------------------------------------------ + + // return the sum of two timespans + inline wxTimeSpan Add(const wxTimeSpan& diff) const; + // add two timespans together + inline wxTimeSpan& Add(const wxTimeSpan& diff); + // add two timespans together + wxTimeSpan& operator+=(const wxTimeSpan& diff) { return Add(diff); } + inline wxTimeSpan operator+(const wxTimeSpan& ts) const + { + return wxTimeSpan(GetValue() + ts.GetValue()); + } + + // return the difference of two timespans + inline wxTimeSpan Subtract(const wxTimeSpan& diff) const; + // subtract another timespan + inline wxTimeSpan& Subtract(const wxTimeSpan& diff); + // subtract another timespan + wxTimeSpan& operator-=(const wxTimeSpan& diff) { return Subtract(diff); } + inline wxTimeSpan operator-(const wxTimeSpan& ts) + { + return wxTimeSpan(GetValue() - ts.GetValue()); + } + + // multiply timespan by a scalar + inline wxTimeSpan Multiply(int n) const; + // multiply timespan by a scalar + inline wxTimeSpan& Multiply(int n); + // multiply timespan by a scalar + wxTimeSpan& operator*=(int n) { return Multiply(n); } + inline wxTimeSpan operator*(int n) const + { + return wxTimeSpan(*this).Multiply(n); + } + + // return this timespan with opposite sign + wxTimeSpan Negate() const { return wxTimeSpan(-GetValue()); } + // negate the value of the timespan + wxTimeSpan& Neg() { m_diff = -GetValue(); return *this; } + // negate the value of the timespan + wxTimeSpan& operator-() { return Neg(); } + + // return the absolute value of the timespan: does _not_ modify the + // object + inline wxTimeSpan Abs() const; + + // there is intentionally no division because we don't want to + // introduce rounding errors in time calculations + + // comparaison (see also operator versions below) + // ------------------------------------------------------------------------ + + // is the timespan null? + bool IsNull() const { return m_diff == 0l; } + // returns true if the timespan is null + bool operator!() const { return !IsNull(); } + + // is the timespan positive? + bool IsPositive() const { return m_diff > 0l; } + + // is the timespan negative? + bool IsNegative() const { return m_diff < 0l; } + + // are two timespans equal? + inline bool IsEqualTo(const wxTimeSpan& ts) const; + // compare two timestamps: works with the absolute values, i.e. -2 + // hours is longer than 1 hour. Also, it will return false if the + // timespans are equal in absolute value. + inline bool IsLongerThan(const wxTimeSpan& ts) const; + // compare two timestamps: works with the absolute values, i.e. 1 + // hour is shorter than -2 hours. Also, it will return false if the + // timespans are equal in absolute value. + bool IsShorterThan(const wxTimeSpan& t) const { return !IsLongerThan(t); } + + inline bool operator<(const wxTimeSpan &ts) const + { + return GetValue() < ts.GetValue(); + } + + inline bool operator<=(const wxTimeSpan &ts) const + { + return GetValue() <= ts.GetValue(); + } + + inline bool operator>(const wxTimeSpan &ts) const + { + return GetValue() > ts.GetValue(); + } + + inline bool operator>=(const wxTimeSpan &ts) const + { + return GetValue() >= ts.GetValue(); + } + + inline bool operator==(const wxTimeSpan &ts) const + { + return GetValue() == ts.GetValue(); + } + + inline bool operator!=(const wxTimeSpan &ts) const + { + return GetValue() != ts.GetValue(); + } + + // breaking into days, hours, minutes and seconds + // ------------------------------------------------------------------------ + + // get the max number of weeks in this timespan + inline int GetWeeks() const; + // get the max number of days in this timespan + inline int GetDays() const; + // get the max number of hours in this timespan + inline int GetHours() const; + // get the max number of minutes in this timespan + inline int GetMinutes() const; + // get the max number of seconds in this timespan + inline wxLongLong GetSeconds() const; + // get the number of milliseconds in this timespan + wxLongLong GetMilliseconds() const { return m_diff; } + + // conversion to text + // ------------------------------------------------------------------------ + + // this function accepts strftime()-like format string (default + // argument corresponds to the preferred date and time representation + // for the current locale) and returns the string containing the + // resulting text representation. Notice that only some of format + // specifiers valid for wxDateTime are valid for wxTimeSpan: hours, + // minutes and seconds make sense, but not "PM/AM" string for example. + wxString Format(const wxChar *format = wxDefaultTimeSpanFormat) const; + + // implementation + // ------------------------------------------------------------------------ + + // construct from internal representation + wxTimeSpan(const wxLongLong& diff) { m_diff = diff; } + + // get the internal representation + wxLongLong GetValue() const { return m_diff; } + +private: + // the (signed) time span in milliseconds + wxLongLong m_diff; +}; + +// ---------------------------------------------------------------------------- +// This class is a "logical time span" and is useful for implementing program +// logic for such things as "add one month to the date" which, in general, +// doesn't mean to add 60*60*24*31 seconds to it, but to take the same date +// the next month (to understand that this is indeed different consider adding +// one month to Feb, 15 - we want to get Mar, 15, of course). +// +// When adding a month to the date, all lesser components (days, hours, ...) +// won't be changed unless the resulting date would be invalid: for example, +// Jan 31 + 1 month will be Feb 28, not (non existing) Feb 31. +// +// Because of this feature, adding and subtracting back again the same +// wxDateSpan will *not*, in general give back the original date: Feb 28 - 1 +// month will be Jan 28, not Jan 31! +// +// wxDateSpan can be either positive or negative. They may be +// multiplied by scalars which multiply all deltas by the scalar: i.e. 2*(1 +// month and 1 day) is 2 months and 2 days. They can be added together and +// with wxDateTime or wxTimeSpan, but the type of result is different for each +// case. +// +// Beware about weeks: if you specify both weeks and days, the total number of +// days added will be 7*weeks + days! See also GetTotalDays() function. +// +// Equality operators are defined for wxDateSpans. Two datespans are equal if +// they both give the same target date when added to *every* source date. +// Thus wxDateSpan::Months(1) is not equal to wxDateSpan::Days(30), because +// they not give the same date when added to 1 Feb. But wxDateSpan::Days(14) is +// equal to wxDateSpan::Weeks(2) +// +// Finally, notice that for adding hours, minutes &c you don't need this +// class: wxTimeSpan will do the job because there are no subtleties +// associated with those. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxDateSpan +{ +public: + // constructors + // ------------------------------------------------------------------------ + + // this many years/months/weeks/days + wxDateSpan(int years = 0, int months = 0, int weeks = 0, int days = 0) + { + m_years = years; + m_months = months; + m_weeks = weeks; + m_days = days; + } + + // get an object for the given number of days + static wxDateSpan Days(int days) { return wxDateSpan(0, 0, 0, days); } + static wxDateSpan Day() { return Days(1); } + + // get an object for the given number of weeks + static wxDateSpan Weeks(int weeks) { return wxDateSpan(0, 0, weeks, 0); } + static wxDateSpan Week() { return Weeks(1); } + + // get an object for the given number of months + static wxDateSpan Months(int mon) { return wxDateSpan(0, mon, 0, 0); } + static wxDateSpan Month() { return Months(1); } + + // get an object for the given number of years + static wxDateSpan Years(int years) { return wxDateSpan(years, 0, 0, 0); } + static wxDateSpan Year() { return Years(1); } + + // default copy ctor is ok + + // no dtor + + // accessors (all SetXXX() return the (modified) wxDateSpan object) + // ------------------------------------------------------------------------ + + // set number of years + wxDateSpan& SetYears(int n) { m_years = n; return *this; } + // set number of months + wxDateSpan& SetMonths(int n) { m_months = n; return *this; } + // set number of weeks + wxDateSpan& SetWeeks(int n) { m_weeks = n; return *this; } + // set number of days + wxDateSpan& SetDays(int n) { m_days = n; return *this; } + + // get number of years + int GetYears() const { return m_years; } + // get number of months + int GetMonths() const { return m_months; } + // get number of weeks + int GetWeeks() const { return m_weeks; } + // get number of days + int GetDays() const { return m_days; } + // returns 7*GetWeeks() + GetDays() + int GetTotalDays() const { return 7*m_weeks + m_days; } + + // arithmetics with date spans (see also below for more operators) + // ------------------------------------------------------------------------ + + // return sum of two date spans + inline wxDateSpan Add(const wxDateSpan& other) const; + // add another wxDateSpan to us + inline wxDateSpan& Add(const wxDateSpan& other); + // add another wxDateSpan to us + inline wxDateSpan& operator+=(const wxDateSpan& other); + inline wxDateSpan operator+(const wxDateSpan& ds) const + { + return wxDateSpan(GetYears() + ds.GetYears(), + GetMonths() + ds.GetMonths(), + GetWeeks() + ds.GetWeeks(), + GetDays() + ds.GetDays()); + } + + // return difference of two date spans + inline wxDateSpan Subtract(const wxDateSpan& other) const; + // subtract another wxDateSpan from us + inline wxDateSpan& Subtract(const wxDateSpan& other); + // subtract another wxDateSpan from us + inline wxDateSpan& operator-=(const wxDateSpan& other); + inline wxDateSpan operator-(const wxDateSpan& ds) const + { + return wxDateSpan(GetYears() - ds.GetYears(), + GetMonths() - ds.GetMonths(), + GetWeeks() - ds.GetWeeks(), + GetDays() - ds.GetDays()); + } + + // return a copy of this time span with changed sign + inline wxDateSpan Negate() const; + // inverse the sign of this timespan + inline wxDateSpan& Neg(); + // inverse the sign of this timespan + wxDateSpan& operator-() { return Neg(); } + + // return the date span proportional to this one with given factor + inline wxDateSpan Multiply(int factor) const; + // multiply all components by a (signed) number + inline wxDateSpan& Multiply(int factor); + // multiply all components by a (signed) number + inline wxDateSpan& operator*=(int factor) { return Multiply(factor); } + inline wxDateSpan operator*(int n) const + { + return wxDateSpan(*this).Multiply(n); + } + + // ds1 == d2 if and only if for every wxDateTime t t + ds1 == t + ds2 + inline bool operator==(const wxDateSpan& ds) const + { + return GetYears() == ds.GetYears() && + GetMonths() == ds.GetMonths() && + GetTotalDays() == ds.GetTotalDays(); + } + + inline bool operator!=(const wxDateSpan& ds) const + { + return !(*this == ds); + } + +private: + int m_years, + m_months, + m_weeks, + m_days; +}; + +// ---------------------------------------------------------------------------- +// wxDateTimeArray: array of dates. +// ---------------------------------------------------------------------------- + +WX_DECLARE_USER_EXPORTED_OBJARRAY(wxDateTime, wxDateTimeArray, WXDLLIMPEXP_BASE); + +// ---------------------------------------------------------------------------- +// wxDateTimeHolidayAuthority: an object of this class will decide whether a +// given date is a holiday and is used by all functions working with "work +// days". +// +// NB: the base class is an ABC, derived classes must implement the pure +// virtual methods to work with the holidays they correspond to. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxDateTimeHolidayAuthority; +WX_DEFINE_USER_EXPORTED_ARRAY_PTR(wxDateTimeHolidayAuthority *, + wxHolidayAuthoritiesArray, + class WXDLLIMPEXP_BASE); + +class wxDateTimeHolidaysModule; +class WXDLLIMPEXP_BASE wxDateTimeHolidayAuthority +{ +friend class wxDateTimeHolidaysModule; +public: + // returns true if the given date is a holiday + static bool IsHoliday(const wxDateTime& dt); + + // fills the provided array with all holidays in the given range, returns + // the number of them + static size_t GetHolidaysInRange(const wxDateTime& dtStart, + const wxDateTime& dtEnd, + wxDateTimeArray& holidays); + + // clear the list of holiday authorities + static void ClearAllAuthorities(); + + // add a new holiday authority (the pointer will be deleted by + // wxDateTimeHolidayAuthority) + static void AddAuthority(wxDateTimeHolidayAuthority *auth); + + // the base class must have a virtual dtor + virtual ~wxDateTimeHolidayAuthority(); + +protected: + // this function is called to determine whether a given day is a holiday + virtual bool DoIsHoliday(const wxDateTime& dt) const = 0; + + // this function should fill the array with all holidays between the two + // given dates - it is implemented in the base class, but in a very + // inefficient way (it just iterates over all days and uses IsHoliday() for + // each of them), so it must be overridden in the derived class where the + // base class version may be explicitly used if needed + // + // returns the number of holidays in the given range and fills holidays + // array + virtual size_t DoGetHolidaysInRange(const wxDateTime& dtStart, + const wxDateTime& dtEnd, + wxDateTimeArray& holidays) const = 0; + +private: + // all holiday authorities + static wxHolidayAuthoritiesArray ms_authorities; +}; + +// the holidays for this class are all Saturdays and Sundays +class WXDLLIMPEXP_BASE wxDateTimeWorkDays : public wxDateTimeHolidayAuthority +{ +protected: + virtual bool DoIsHoliday(const wxDateTime& dt) const; + virtual size_t DoGetHolidaysInRange(const wxDateTime& dtStart, + const wxDateTime& dtEnd, + wxDateTimeArray& holidays) const; +}; + +// ============================================================================ +// inline functions implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// private macros +// ---------------------------------------------------------------------------- + +#define MILLISECONDS_PER_DAY 86400000l + +// some broken compilers (HP-UX CC) refuse to compile the "normal" version, but +// using a temp variable always might prevent other compilers from optimising +// it away - hence use of this ugly macro +#ifndef __HPUX__ + #define MODIFY_AND_RETURN(op) return wxDateTime(*this).op +#else + #define MODIFY_AND_RETURN(op) wxDateTime dt(*this); dt.op; return dt +#endif + +// ---------------------------------------------------------------------------- +// wxDateTime construction +// ---------------------------------------------------------------------------- + +inline bool wxDateTime::IsInStdRange() const +{ + return m_time >= 0l && (m_time / TIME_T_FACTOR) < LONG_MAX; +} + +/* static */ +inline wxDateTime wxDateTime::Now() +{ + struct tm tmstruct; + return wxDateTime(*GetTmNow(&tmstruct)); +} + +/* static */ +inline wxDateTime wxDateTime::Today() +{ + wxDateTime dt(Now()); + dt.ResetTime(); + + return dt; +} + +#if (!(defined(__VISAGECPP__) && __IBMCPP__ >= 400)) +inline wxDateTime& wxDateTime::Set(time_t timet) +{ + // assign first to avoid long multiplication overflow! + m_time = timet - WX_TIME_BASE_OFFSET ; + m_time *= TIME_T_FACTOR; + + return *this; +} +#endif + +inline wxDateTime& wxDateTime::SetToCurrent() +{ + *this = Now(); + return *this; +} + +#if (!(defined(__VISAGECPP__) && __IBMCPP__ >= 400)) +inline wxDateTime::wxDateTime(time_t timet) +{ + Set(timet); +} +#endif + +inline wxDateTime::wxDateTime(const struct tm& tm) +{ + Set(tm); +} + +inline wxDateTime::wxDateTime(const Tm& tm) +{ + Set(tm); +} + +inline wxDateTime::wxDateTime(double jdn) +{ + Set(jdn); +} + +inline wxDateTime& wxDateTime::Set(const Tm& tm) +{ + wxASSERT_MSG( tm.IsValid(), _T("invalid broken down date/time") ); + + return Set(tm.mday, (Month)tm.mon, tm.year, + tm.hour, tm.min, tm.sec, tm.msec); +} + +inline wxDateTime::wxDateTime(wxDateTime_t hour, + wxDateTime_t minute, + wxDateTime_t second, + wxDateTime_t millisec) +{ + Set(hour, minute, second, millisec); +} + +inline wxDateTime::wxDateTime(wxDateTime_t day, + Month month, + int year, + wxDateTime_t hour, + wxDateTime_t minute, + wxDateTime_t second, + wxDateTime_t millisec) +{ + Set(day, month, year, hour, minute, second, millisec); +} + +// ---------------------------------------------------------------------------- +// wxDateTime accessors +// ---------------------------------------------------------------------------- + +inline wxLongLong wxDateTime::GetValue() const +{ + wxASSERT_MSG( IsValid(), _T("invalid wxDateTime")); + + return m_time; +} + +inline time_t wxDateTime::GetTicks() const +{ + wxASSERT_MSG( IsValid(), _T("invalid wxDateTime")); + if ( !IsInStdRange() ) + { + return (time_t)-1; + } + + return (time_t)((m_time / (long)TIME_T_FACTOR).ToLong()) + WX_TIME_BASE_OFFSET; +} + +inline bool wxDateTime::SetToLastWeekDay(WeekDay weekday, + Month month, + int year) +{ + return SetToWeekDay(weekday, -1, month, year); +} + +inline wxDateTime +wxDateTime::GetWeekDayInSameWeek(WeekDay weekday, + WeekFlags WXUNUSED(flags)) const +{ + MODIFY_AND_RETURN( SetToWeekDayInSameWeek(weekday) ); +} + +inline wxDateTime wxDateTime::GetNextWeekDay(WeekDay weekday) const +{ + MODIFY_AND_RETURN( SetToNextWeekDay(weekday) ); +} + +inline wxDateTime wxDateTime::GetPrevWeekDay(WeekDay weekday) const +{ + MODIFY_AND_RETURN( SetToPrevWeekDay(weekday) ); +} + +inline wxDateTime wxDateTime::GetWeekDay(WeekDay weekday, + int n, + Month month, + int year) const +{ + wxDateTime dt(*this); + + return dt.SetToWeekDay(weekday, n, month, year) ? dt : wxInvalidDateTime; +} + +inline wxDateTime wxDateTime::GetLastWeekDay(WeekDay weekday, + Month month, + int year) +{ + wxDateTime dt(*this); + + return dt.SetToLastWeekDay(weekday, month, year) ? dt : wxInvalidDateTime; +} + +inline wxDateTime wxDateTime::GetLastMonthDay(Month month, int year) const +{ + MODIFY_AND_RETURN( SetToLastMonthDay(month, year) ); +} + +inline wxDateTime wxDateTime::GetYearDay(wxDateTime_t yday) const +{ + MODIFY_AND_RETURN( SetToYearDay(yday) ); +} + +// ---------------------------------------------------------------------------- +// wxDateTime comparison +// ---------------------------------------------------------------------------- + +inline bool wxDateTime::IsEqualTo(const wxDateTime& datetime) const +{ + wxASSERT_MSG( IsValid() && datetime.IsValid(), _T("invalid wxDateTime")); + + return m_time == datetime.m_time; +} + +inline bool wxDateTime::IsEarlierThan(const wxDateTime& datetime) const +{ + wxASSERT_MSG( IsValid() && datetime.IsValid(), _T("invalid wxDateTime")); + + return m_time < datetime.m_time; +} + +inline bool wxDateTime::IsLaterThan(const wxDateTime& datetime) const +{ + wxASSERT_MSG( IsValid() && datetime.IsValid(), _T("invalid wxDateTime")); + + return m_time > datetime.m_time; +} + +inline bool wxDateTime::IsStrictlyBetween(const wxDateTime& t1, + const wxDateTime& t2) const +{ + // no need for assert, will be checked by the functions we call + return IsLaterThan(t1) && IsEarlierThan(t2); +} + +inline bool wxDateTime::IsBetween(const wxDateTime& t1, + const wxDateTime& t2) const +{ + // no need for assert, will be checked by the functions we call + return IsEqualTo(t1) || IsEqualTo(t2) || IsStrictlyBetween(t1, t2); +} + +inline bool wxDateTime::IsSameDate(const wxDateTime& dt) const +{ + Tm tm1 = GetTm(), + tm2 = dt.GetTm(); + + return tm1.year == tm2.year && + tm1.mon == tm2.mon && + tm1.mday == tm2.mday; +} + +inline bool wxDateTime::IsSameTime(const wxDateTime& dt) const +{ + // notice that we can't do something like this: + // + // m_time % MILLISECONDS_PER_DAY == dt.m_time % MILLISECONDS_PER_DAY + // + // because we have also to deal with (possibly) different DST settings! + Tm tm1 = GetTm(), + tm2 = dt.GetTm(); + + return tm1.hour == tm2.hour && + tm1.min == tm2.min && + tm1.sec == tm2.sec && + tm1.msec == tm2.msec; +} + +inline bool wxDateTime::IsEqualUpTo(const wxDateTime& dt, + const wxTimeSpan& ts) const +{ + return IsBetween(dt.Subtract(ts), dt.Add(ts)); +} + +// ---------------------------------------------------------------------------- +// wxDateTime arithmetics +// ---------------------------------------------------------------------------- + +inline wxDateTime wxDateTime::Add(const wxTimeSpan& diff) const +{ + wxASSERT_MSG( IsValid(), _T("invalid wxDateTime")); + + return wxDateTime(m_time + diff.GetValue()); +} + +inline wxDateTime& wxDateTime::Add(const wxTimeSpan& diff) +{ + wxASSERT_MSG( IsValid(), _T("invalid wxDateTime")); + + m_time += diff.GetValue(); + + return *this; +} + +inline wxDateTime& wxDateTime::operator+=(const wxTimeSpan& diff) +{ + return Add(diff); +} + +inline wxDateTime wxDateTime::Subtract(const wxTimeSpan& diff) const +{ + wxASSERT_MSG( IsValid(), _T("invalid wxDateTime")); + + return wxDateTime(m_time - diff.GetValue()); +} + +inline wxDateTime& wxDateTime::Subtract(const wxTimeSpan& diff) +{ + wxASSERT_MSG( IsValid(), _T("invalid wxDateTime")); + + m_time -= diff.GetValue(); + + return *this; +} + +inline wxDateTime& wxDateTime::operator-=(const wxTimeSpan& diff) +{ + return Subtract(diff); +} + +inline wxTimeSpan wxDateTime::Subtract(const wxDateTime& datetime) const +{ + wxASSERT_MSG( IsValid() && datetime.IsValid(), _T("invalid wxDateTime")); + + return wxTimeSpan(GetValue() - datetime.GetValue()); +} + +inline wxTimeSpan wxDateTime::operator-(const wxDateTime& dt2) const +{ + return this->Subtract(dt2); +} + +inline wxDateTime wxDateTime::Add(const wxDateSpan& diff) const +{ + return wxDateTime(*this).Add(diff); +} + +inline wxDateTime& wxDateTime::Subtract(const wxDateSpan& diff) +{ + return Add(diff.Negate()); +} + +inline wxDateTime wxDateTime::Subtract(const wxDateSpan& diff) const +{ + return wxDateTime(*this).Subtract(diff); +} + +inline wxDateTime& wxDateTime::operator-=(const wxDateSpan& diff) +{ + return Subtract(diff); +} + +inline wxDateTime& wxDateTime::operator+=(const wxDateSpan& diff) +{ + return Add(diff); +} + +// ---------------------------------------------------------------------------- +// wxDateTime and timezones +// ---------------------------------------------------------------------------- + +inline wxDateTime +wxDateTime::ToTimezone(const wxDateTime::TimeZone& tz, bool noDST) const +{ + MODIFY_AND_RETURN( MakeTimezone(tz, noDST) ); +} + +inline wxDateTime +wxDateTime::FromTimezone(const wxDateTime::TimeZone& tz, bool noDST) const +{ + MODIFY_AND_RETURN( MakeFromTimezone(tz, noDST) ); +} + +// ---------------------------------------------------------------------------- +// wxTimeSpan construction +// ---------------------------------------------------------------------------- + +inline wxTimeSpan::wxTimeSpan(long hours, + long minutes, + wxLongLong seconds, + wxLongLong milliseconds) +{ + // assign first to avoid precision loss + m_diff = hours; + m_diff *= 60l; + m_diff += minutes; + m_diff *= 60l; + m_diff += seconds; + m_diff *= 1000l; + m_diff += milliseconds; +} + +// ---------------------------------------------------------------------------- +// wxTimeSpan accessors +// ---------------------------------------------------------------------------- + +inline wxLongLong wxTimeSpan::GetSeconds() const +{ + return m_diff / 1000l; +} + +inline int wxTimeSpan::GetMinutes() const +{ + // explicit cast to int suppresses a warning with CodeWarrior and possibly + // others (changing the return type to long from int is impossible in 2.8) + return (int)((GetSeconds() / 60l).GetLo()); +} + +inline int wxTimeSpan::GetHours() const +{ + return GetMinutes() / 60; +} + +inline int wxTimeSpan::GetDays() const +{ + return GetHours() / 24; +} + +inline int wxTimeSpan::GetWeeks() const +{ + return GetDays() / 7; +} + +// ---------------------------------------------------------------------------- +// wxTimeSpan arithmetics +// ---------------------------------------------------------------------------- + +inline wxTimeSpan wxTimeSpan::Add(const wxTimeSpan& diff) const +{ + return wxTimeSpan(m_diff + diff.GetValue()); +} + +inline wxTimeSpan& wxTimeSpan::Add(const wxTimeSpan& diff) +{ + m_diff += diff.GetValue(); + + return *this; +} + +inline wxTimeSpan wxTimeSpan::Subtract(const wxTimeSpan& diff) const +{ + return wxTimeSpan(m_diff - diff.GetValue()); +} + +inline wxTimeSpan& wxTimeSpan::Subtract(const wxTimeSpan& diff) +{ + m_diff -= diff.GetValue(); + + return *this; +} + +inline wxTimeSpan& wxTimeSpan::Multiply(int n) +{ + m_diff *= (long)n; + + return *this; +} + +inline wxTimeSpan wxTimeSpan::Multiply(int n) const +{ + return wxTimeSpan(m_diff * (long)n); +} + +inline wxTimeSpan wxTimeSpan::Abs() const +{ + return wxTimeSpan(GetValue().Abs()); +} + +inline bool wxTimeSpan::IsEqualTo(const wxTimeSpan& ts) const +{ + return GetValue() == ts.GetValue(); +} + +inline bool wxTimeSpan::IsLongerThan(const wxTimeSpan& ts) const +{ + return GetValue().Abs() > ts.GetValue().Abs(); +} + +// ---------------------------------------------------------------------------- +// wxDateSpan +// ---------------------------------------------------------------------------- + +inline wxDateSpan& wxDateSpan::operator+=(const wxDateSpan& other) +{ + m_years += other.m_years; + m_months += other.m_months; + m_weeks += other.m_weeks; + m_days += other.m_days; + + return *this; +} + +inline wxDateSpan& wxDateSpan::Add(const wxDateSpan& other) +{ + return *this += other; +} + +inline wxDateSpan wxDateSpan::Add(const wxDateSpan& other) const +{ + wxDateSpan ds(*this); + ds.Add(other); + return ds; +} + +inline wxDateSpan& wxDateSpan::Multiply(int factor) +{ + m_years *= factor; + m_months *= factor; + m_weeks *= factor; + m_days *= factor; + + return *this; +} + +inline wxDateSpan wxDateSpan::Multiply(int factor) const +{ + wxDateSpan ds(*this); + ds.Multiply(factor); + return ds; +} + +inline wxDateSpan wxDateSpan::Negate() const +{ + return wxDateSpan(-m_years, -m_months, -m_weeks, -m_days); +} + +inline wxDateSpan& wxDateSpan::Neg() +{ + m_years = -m_years; + m_months = -m_months; + m_weeks = -m_weeks; + m_days = -m_days; + + return *this; +} + +inline wxDateSpan& wxDateSpan::operator-=(const wxDateSpan& other) +{ + return *this += other.Negate(); +} + +inline wxDateSpan& wxDateSpan::Subtract(const wxDateSpan& other) +{ + return *this -= other; +} + +inline wxDateSpan wxDateSpan::Subtract(const wxDateSpan& other) const +{ + wxDateSpan ds(*this); + ds.Subtract(other); + return ds; +} + +#undef MILLISECONDS_PER_DAY + +#undef MODIFY_AND_RETURN + +// ============================================================================ +// binary operators +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxTimeSpan operators +// ---------------------------------------------------------------------------- + +wxTimeSpan WXDLLIMPEXP_BASE operator*(int n, const wxTimeSpan& ts); + +// ---------------------------------------------------------------------------- +// wxDateSpan +// ---------------------------------------------------------------------------- + +wxDateSpan WXDLLIMPEXP_BASE operator*(int n, const wxDateSpan& ds); + +// ============================================================================ +// other helper functions +// ============================================================================ + +// ---------------------------------------------------------------------------- +// iteration helpers: can be used to write a for loop over enum variable like +// this: +// for ( m = wxDateTime::Jan; m < wxDateTime::Inv_Month; wxNextMonth(m) ) +// ---------------------------------------------------------------------------- + +WXDLLIMPEXP_BASE void wxNextMonth(wxDateTime::Month& m); +WXDLLIMPEXP_BASE void wxPrevMonth(wxDateTime::Month& m); +WXDLLIMPEXP_BASE void wxNextWDay(wxDateTime::WeekDay& wd); +WXDLLIMPEXP_BASE void wxPrevWDay(wxDateTime::WeekDay& wd); + +#endif // wxUSE_DATETIME + +#endif // _WX_DATETIME_H diff --git a/Externals/wxWidgets/include/wx/datstrm.h b/Externals/wxWidgets/include/wx/datstrm.h new file mode 100644 index 0000000000..b6d00e43e5 --- /dev/null +++ b/Externals/wxWidgets/include/wx/datstrm.h @@ -0,0 +1,170 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: datstrm.h +// Purpose: Data stream classes +// Author: Guilhem Lavaux +// Modified by: Mickael Gilabert +// Created: 28/06/1998 +// RCS-ID: $Id: datstrm.h 38576 2006-04-05 16:10:08Z VZ $ +// Copyright: (c) Guilhem Lavaux +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DATSTREAM_H_ +#define _WX_DATSTREAM_H_ + +#include "wx/stream.h" +#include "wx/longlong.h" +#include "wx/convauto.h" + +#if wxUSE_STREAMS + +class WXDLLIMPEXP_BASE wxDataInputStream +{ +public: +#if wxUSE_UNICODE + wxDataInputStream(wxInputStream& s, const wxMBConv& conv = wxConvAuto()); +#else + wxDataInputStream(wxInputStream& s); +#endif + ~wxDataInputStream(); + + bool IsOk() { return m_input->IsOk(); } + +#if wxHAS_INT64 + wxUint64 Read64(); +#endif +#if wxUSE_LONGLONG + wxLongLong ReadLL(); +#endif + wxUint32 Read32(); + wxUint16 Read16(); + wxUint8 Read8(); + double ReadDouble(); + wxString ReadString(); + +#if wxHAS_INT64 + void Read64(wxUint64 *buffer, size_t size); + void Read64(wxInt64 *buffer, size_t size); +#endif +#if defined(wxLongLong_t) && wxUSE_LONGLONG + void Read64(wxULongLong *buffer, size_t size); + void Read64(wxLongLong *buffer, size_t size); +#endif +#if wxUSE_LONGLONG + void ReadLL(wxULongLong *buffer, size_t size); + void ReadLL(wxLongLong *buffer, size_t size); +#endif + void Read32(wxUint32 *buffer, size_t size); + void Read16(wxUint16 *buffer, size_t size); + void Read8(wxUint8 *buffer, size_t size); + void ReadDouble(double *buffer, size_t size); + + wxDataInputStream& operator>>(wxString& s); + wxDataInputStream& operator>>(wxInt8& c); + wxDataInputStream& operator>>(wxInt16& i); + wxDataInputStream& operator>>(wxInt32& i); + wxDataInputStream& operator>>(wxUint8& c); + wxDataInputStream& operator>>(wxUint16& i); + wxDataInputStream& operator>>(wxUint32& i); +#if wxHAS_INT64 + wxDataInputStream& operator>>(wxUint64& i); + wxDataInputStream& operator>>(wxInt64& i); +#endif +#if defined(wxLongLong_t) && wxUSE_LONGLONG + wxDataInputStream& operator>>(wxULongLong& i); + wxDataInputStream& operator>>(wxLongLong& i); +#endif + wxDataInputStream& operator>>(double& i); + wxDataInputStream& operator>>(float& f); + + void BigEndianOrdered(bool be_order) { m_be_order = be_order; } + +protected: + wxInputStream *m_input; + bool m_be_order; +#if wxUSE_UNICODE + wxMBConv *m_conv; +#endif + + DECLARE_NO_COPY_CLASS(wxDataInputStream) +}; + +class WXDLLIMPEXP_BASE wxDataOutputStream +{ +public: +#if wxUSE_UNICODE + wxDataOutputStream(wxOutputStream& s, const wxMBConv& conv = wxConvAuto()); +#else + wxDataOutputStream(wxOutputStream& s); +#endif + ~wxDataOutputStream(); + + bool IsOk() { return m_output->IsOk(); } + +#if wxHAS_INT64 + void Write64(wxUint64 i); + void Write64(wxInt64 i); +#endif +#if wxUSE_LONGLONG + void WriteLL(const wxLongLong &ll); + void WriteLL(const wxULongLong &ll); +#endif + void Write32(wxUint32 i); + void Write16(wxUint16 i); + void Write8(wxUint8 i); + void WriteDouble(double d); + void WriteString(const wxString& string); + +#if wxHAS_INT64 + void Write64(const wxUint64 *buffer, size_t size); + void Write64(const wxInt64 *buffer, size_t size); +#endif +#if defined(wxLongLong_t) && wxUSE_LONGLONG + void Write64(const wxULongLong *buffer, size_t size); + void Write64(const wxLongLong *buffer, size_t size); +#endif +#if wxUSE_LONGLONG + void WriteLL(const wxULongLong *buffer, size_t size); + void WriteLL(const wxLongLong *buffer, size_t size); +#endif + void Write32(const wxUint32 *buffer, size_t size); + void Write16(const wxUint16 *buffer, size_t size); + void Write8(const wxUint8 *buffer, size_t size); + void WriteDouble(const double *buffer, size_t size); + + wxDataOutputStream& operator<<(const wxChar *string); + wxDataOutputStream& operator<<(const wxString& string); + wxDataOutputStream& operator<<(wxInt8 c); + wxDataOutputStream& operator<<(wxInt16 i); + wxDataOutputStream& operator<<(wxInt32 i); + wxDataOutputStream& operator<<(wxUint8 c); + wxDataOutputStream& operator<<(wxUint16 i); + wxDataOutputStream& operator<<(wxUint32 i); +#if wxHAS_INT64 + wxDataOutputStream& operator<<(wxUint64 i); + wxDataOutputStream& operator<<(wxInt64 i); +#endif +#if defined(wxLongLong_t) && wxUSE_LONGLONG + wxDataOutputStream& operator<<(const wxULongLong &i); + wxDataOutputStream& operator<<(const wxLongLong &i); +#endif + wxDataOutputStream& operator<<(double f); + wxDataOutputStream& operator<<(float f); + + void BigEndianOrdered(bool be_order) { m_be_order = be_order; } + +protected: + wxOutputStream *m_output; + bool m_be_order; +#if wxUSE_UNICODE + wxMBConv *m_conv; +#endif + + DECLARE_NO_COPY_CLASS(wxDataOutputStream) +}; + +#endif + // wxUSE_STREAMS + +#endif + // _WX_DATSTREAM_H_ diff --git a/Externals/wxWidgets/include/wx/db.h b/Externals/wxWidgets/include/wx/db.h new file mode 100644 index 0000000000..211f56dc47 --- /dev/null +++ b/Externals/wxWidgets/include/wx/db.h @@ -0,0 +1,848 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/db.h +// Purpose: Header file wxDb class. The wxDb class represents a connection +// to an ODBC data source. The wxDb class allows operations on the data +// source such as opening and closing the data source. +// Author: Doug Card +// Modified by: George Tasker +// Bart Jourquin +// Mark Johnson, wxWindows@mj10777.de +// Mods: Dec, 1998: +// -Added support for SQL statement logging and database cataloging +// April, 1999 +// -Added QUERY_ONLY mode support to reduce default number of cursors +// -Added additional SQL logging code +// -Added DEBUG-ONLY tracking of Ctable objects to detect orphaned DB connections +// -Set ODBC option to only read committed writes to the DB so all +// databases operate the same in that respect +// +// Created: 9.96 +// RCS-ID: $Id: db.h 45498 2007-04-16 13:03:05Z VZ $ +// Copyright: (c) 1996 Remstar International, Inc. +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DB_H_ +#define _WX_DB_H_ + + +// BJO 20000503: introduce new GetColumns members which are more database independent and +// return columns in the order they were created +#define OLD_GETCOLUMNS 1 +#define EXPERIMENTAL_WXDB_FUNCTIONS 1 + +#include "wx/defs.h" +#include "wx/string.h" + +#if defined(__VISUALC__) + // we need to include standard Windows headers but we can't include + // directly when using MFC because it includes it itself in a + // different manner + #if wxUSE_MFC + #include + #else // !wxUSE_MFC + #include "wx/msw/wrapwin.h" + #endif // wxUSE_MFC/!wxUSE_MFC + + // If you use the wxDbCreateDataSource() function with MSW/VC6, + // you cannot use the iODBC headers, you must use the VC headers, + // plus the odbcinst.h header - gt Nov 2 2000 + // + // Must add "odbccp32.lib" in \wx2\wxWidgets\src\makevc.env to the WINLIBS= line + // + #include "sql.h" + #include "sqlext.h" + //#if wxUSE_UNICODE + // #include + //#endif + #include "odbcinst.h" +#else + #if defined(__WINDOWS__) && ( defined(HAVE_W32API_H) || defined(__BORLANDC__) || defined (__DMC__)) + #include "wx/msw/wrapwin.h" + #endif + extern "C" { + #if defined(wxUSE_BUILTIN_IODBC) && wxUSE_BUILTIN_IODBC + // Use the ones from the library + #include "wx/isql.h" + #include "wx/isqlext.h" + // Not available in v2.x of iODBC + #ifndef __WXMSW__ + #if wxUSE_UNICODE + typedef wxChar SQLTCHAR; + #else + typedef UCHAR SQLTCHAR; + #endif + #endif + #else // !wxUSE_BUILTIN_IODBC + // SQL headers define BOOL if it's not defined yet but BOOL is also + // defined in many other places on other systems (Motif, at least on + // OpenVMS; Cocoa and X11) so prevent the problem by defining it before + // including these headers + #define BOOL int + #include + #include + #undef BOOL + #endif // wxUSE_BUILTIN_IODBC/!wxUSE_BUILTIN_IODBC + } +#endif + +#if wxUSE_UNICODE +#define SQL_C_WXCHAR SQL_C_WCHAR +#else +#define SQL_C_WXCHAR SQL_C_CHAR +#endif + +#ifdef __DIGITALMARS__ +#if wxUSE_UNICODE +typedef wxChar SQLTCHAR; +#else +typedef UCHAR SQLTCHAR; +#endif +#endif + +typedef float SFLOAT; +typedef double SDOUBLE; +typedef unsigned int UINT; +#define ULONG UDWORD + +#ifndef wxODBC_FWD_ONLY_CURSORS +#define wxODBC_FWD_ONLY_CURSORS 1 +#endif + +enum enumDummy {enumDum1}; + +#ifndef SQL_C_BOOLEAN + #define SQL_C_BOOLEAN(datatype) (sizeof(datatype) == 1 ? SQL_C_UTINYINT : (sizeof(datatype) == 2 ? SQL_C_USHORT : SQL_C_ULONG)) +#endif + +#ifndef SQL_C_ENUM + #define SQL_C_ENUM (sizeof(enumDummy) == 2 ? SQL_C_USHORT : SQL_C_ULONG) +#endif + +// NOTE: If SQL_C_BLOB is defined, and it is not SQL_C_BINARY, iODBC 2.x +// may not function correctly. Likely best to use SQL_C_BINARY direct +#ifndef SQL_C_BLOB + #ifdef SQL_C_BINARY + #define SQL_C_BLOB SQL_C_BINARY + #endif +#endif + +#ifndef _WIN64 +#ifndef SQLLEN +#define SQLLEN SQLINTEGER +#endif +#ifndef SQLULEN +#define SQLULEN SQLUINTEGER +#endif +#endif + +const int wxDB_PATH_MAX = 254; + +extern WXDLLIMPEXP_DATA_ODBC(wxChar const *) SQL_LOG_FILENAME; +extern WXDLLIMPEXP_DATA_ODBC(wxChar const *) SQL_CATALOG_FILENAME; + +// Database Globals +const int DB_TYPE_NAME_LEN = 40; +const int DB_MAX_STATEMENT_LEN = 4096; +const int DB_MAX_WHERE_CLAUSE_LEN = 2048; +const int DB_MAX_ERROR_MSG_LEN = 512; +const int DB_MAX_ERROR_HISTORY = 5; +const int DB_MAX_TABLE_NAME_LEN = 128; +const int DB_MAX_COLUMN_NAME_LEN = 128; + +const int DB_DATA_TYPE_VARCHAR = 1; +const int DB_DATA_TYPE_INTEGER = 2; +const int DB_DATA_TYPE_FLOAT = 3; +const int DB_DATA_TYPE_DATE = 4; +const int DB_DATA_TYPE_BLOB = 5; +const int DB_DATA_TYPE_MEMO = 6; + +const int DB_SELECT_KEYFIELDS = 1; +const int DB_SELECT_WHERE = 2; +const int DB_SELECT_MATCHING = 3; +const int DB_SELECT_STATEMENT = 4; + +const int DB_UPD_KEYFIELDS = 1; +const int DB_UPD_WHERE = 2; + +const int DB_DEL_KEYFIELDS = 1; +const int DB_DEL_WHERE = 2; +const int DB_DEL_MATCHING = 3; + +const int DB_WHERE_KEYFIELDS = 1; +const int DB_WHERE_MATCHING = 2; + +const int DB_GRANT_SELECT = 1; +const int DB_GRANT_INSERT = 2; +const int DB_GRANT_UPDATE = 4; +const int DB_GRANT_DELETE = 8; +const int DB_GRANT_ALL = DB_GRANT_SELECT | DB_GRANT_INSERT | DB_GRANT_UPDATE | DB_GRANT_DELETE; + +// ODBC Error codes (derived from ODBC SqlState codes) +enum wxODBC_ERRORS +{ + DB_FAILURE = 0, + DB_SUCCESS = 1, + DB_ERR_NOT_IN_USE, + DB_ERR_GENERAL_WARNING, // SqlState = '01000' + DB_ERR_DISCONNECT_ERROR, // SqlState = '01002' + DB_ERR_DATA_TRUNCATED, // SqlState = '01004' + DB_ERR_PRIV_NOT_REVOKED, // SqlState = '01006' + DB_ERR_INVALID_CONN_STR_ATTR, // SqlState = '01S00' + DB_ERR_ERROR_IN_ROW, // SqlState = '01S01' + DB_ERR_OPTION_VALUE_CHANGED, // SqlState = '01S02' + DB_ERR_NO_ROWS_UPD_OR_DEL, // SqlState = '01S03' + DB_ERR_MULTI_ROWS_UPD_OR_DEL, // SqlState = '01S04' + DB_ERR_WRONG_NO_OF_PARAMS, // SqlState = '07001' + DB_ERR_DATA_TYPE_ATTR_VIOL, // SqlState = '07006' + DB_ERR_UNABLE_TO_CONNECT, // SqlState = '08001' + DB_ERR_CONNECTION_IN_USE, // SqlState = '08002' + DB_ERR_CONNECTION_NOT_OPEN, // SqlState = '08003' + DB_ERR_REJECTED_CONNECTION, // SqlState = '08004' + DB_ERR_CONN_FAIL_IN_TRANS, // SqlState = '08007' + DB_ERR_COMM_LINK_FAILURE, // SqlState = '08S01' + DB_ERR_INSERT_VALUE_LIST_MISMATCH, // SqlState = '21S01' + DB_ERR_DERIVED_TABLE_MISMATCH, // SqlState = '21S02' + DB_ERR_STRING_RIGHT_TRUNC, // SqlState = '22001' + DB_ERR_NUMERIC_VALUE_OUT_OF_RNG, // SqlState = '22003' + DB_ERR_ERROR_IN_ASSIGNMENT, // SqlState = '22005' + DB_ERR_DATETIME_FLD_OVERFLOW, // SqlState = '22008' + DB_ERR_DIVIDE_BY_ZERO, // SqlState = '22012' + DB_ERR_STR_DATA_LENGTH_MISMATCH, // SqlState = '22026' + DB_ERR_INTEGRITY_CONSTRAINT_VIOL, // SqlState = '23000' + DB_ERR_INVALID_CURSOR_STATE, // SqlState = '24000' + DB_ERR_INVALID_TRANS_STATE, // SqlState = '25000' + DB_ERR_INVALID_AUTH_SPEC, // SqlState = '28000' + DB_ERR_INVALID_CURSOR_NAME, // SqlState = '34000' + DB_ERR_SYNTAX_ERROR_OR_ACCESS_VIOL, // SqlState = '37000' + DB_ERR_DUPLICATE_CURSOR_NAME, // SqlState = '3C000' + DB_ERR_SERIALIZATION_FAILURE, // SqlState = '40001' + DB_ERR_SYNTAX_ERROR_OR_ACCESS_VIOL2, // SqlState = '42000' + DB_ERR_OPERATION_ABORTED, // SqlState = '70100' + DB_ERR_UNSUPPORTED_FUNCTION, // SqlState = 'IM001' + DB_ERR_NO_DATA_SOURCE, // SqlState = 'IM002' + DB_ERR_DRIVER_LOAD_ERROR, // SqlState = 'IM003' + DB_ERR_SQLALLOCENV_FAILED, // SqlState = 'IM004' + DB_ERR_SQLALLOCCONNECT_FAILED, // SqlState = 'IM005' + DB_ERR_SQLSETCONNECTOPTION_FAILED, // SqlState = 'IM006' + DB_ERR_NO_DATA_SOURCE_DLG_PROHIB, // SqlState = 'IM007' + DB_ERR_DIALOG_FAILED, // SqlState = 'IM008' + DB_ERR_UNABLE_TO_LOAD_TRANSLATION_DLL, // SqlState = 'IM009' + DB_ERR_DATA_SOURCE_NAME_TOO_LONG, // SqlState = 'IM010' + DB_ERR_DRIVER_NAME_TOO_LONG, // SqlState = 'IM011' + DB_ERR_DRIVER_KEYWORD_SYNTAX_ERROR, // SqlState = 'IM012' + DB_ERR_TRACE_FILE_ERROR, // SqlState = 'IM013' + DB_ERR_TABLE_OR_VIEW_ALREADY_EXISTS, // SqlState = 'S0001' + DB_ERR_TABLE_NOT_FOUND, // SqlState = 'S0002' + DB_ERR_INDEX_ALREADY_EXISTS, // SqlState = 'S0011' + DB_ERR_INDEX_NOT_FOUND, // SqlState = 'S0012' + DB_ERR_COLUMN_ALREADY_EXISTS, // SqlState = 'S0021' + DB_ERR_COLUMN_NOT_FOUND, // SqlState = 'S0022' + DB_ERR_NO_DEFAULT_FOR_COLUMN, // SqlState = 'S0023' + DB_ERR_GENERAL_ERROR, // SqlState = 'S1000' + DB_ERR_MEMORY_ALLOCATION_FAILURE, // SqlState = 'S1001' + DB_ERR_INVALID_COLUMN_NUMBER, // SqlState = 'S1002' + DB_ERR_PROGRAM_TYPE_OUT_OF_RANGE, // SqlState = 'S1003' + DB_ERR_SQL_DATA_TYPE_OUT_OF_RANGE, // SqlState = 'S1004' + DB_ERR_OPERATION_CANCELLED, // SqlState = 'S1008' + DB_ERR_INVALID_ARGUMENT_VALUE, // SqlState = 'S1009' + DB_ERR_FUNCTION_SEQUENCE_ERROR, // SqlState = 'S1010' + DB_ERR_OPERATION_INVALID_AT_THIS_TIME, // SqlState = 'S1011' + DB_ERR_INVALID_TRANS_OPERATION_CODE, // SqlState = 'S1012' + DB_ERR_NO_CURSOR_NAME_AVAIL, // SqlState = 'S1015' + DB_ERR_INVALID_STR_OR_BUF_LEN, // SqlState = 'S1090' + DB_ERR_DESCRIPTOR_TYPE_OUT_OF_RANGE, // SqlState = 'S1091' + DB_ERR_OPTION_TYPE_OUT_OF_RANGE, // SqlState = 'S1092' + DB_ERR_INVALID_PARAM_NO, // SqlState = 'S1093' + DB_ERR_INVALID_SCALE_VALUE, // SqlState = 'S1094' + DB_ERR_FUNCTION_TYPE_OUT_OF_RANGE, // SqlState = 'S1095' + DB_ERR_INF_TYPE_OUT_OF_RANGE, // SqlState = 'S1096' + DB_ERR_COLUMN_TYPE_OUT_OF_RANGE, // SqlState = 'S1097' + DB_ERR_SCOPE_TYPE_OUT_OF_RANGE, // SqlState = 'S1098' + DB_ERR_NULLABLE_TYPE_OUT_OF_RANGE, // SqlState = 'S1099' + DB_ERR_UNIQUENESS_OPTION_TYPE_OUT_OF_RANGE, // SqlState = 'S1100' + DB_ERR_ACCURACY_OPTION_TYPE_OUT_OF_RANGE, // SqlState = 'S1101' + DB_ERR_DIRECTION_OPTION_OUT_OF_RANGE, // SqlState = 'S1103' + DB_ERR_INVALID_PRECISION_VALUE, // SqlState = 'S1104' + DB_ERR_INVALID_PARAM_TYPE, // SqlState = 'S1105' + DB_ERR_FETCH_TYPE_OUT_OF_RANGE, // SqlState = 'S1106' + DB_ERR_ROW_VALUE_OUT_OF_RANGE, // SqlState = 'S1107' + DB_ERR_CONCURRENCY_OPTION_OUT_OF_RANGE, // SqlState = 'S1108' + DB_ERR_INVALID_CURSOR_POSITION, // SqlState = 'S1109' + DB_ERR_INVALID_DRIVER_COMPLETION, // SqlState = 'S1110' + DB_ERR_INVALID_BOOKMARK_VALUE, // SqlState = 'S1111' + DB_ERR_DRIVER_NOT_CAPABLE, // SqlState = 'S1C00' + DB_ERR_TIMEOUT_EXPIRED // SqlState = 'S1T00' +}; + +#ifndef MAXNAME + #define MAXNAME 31 +#endif + +#ifndef SQL_MAX_AUTHSTR_LEN + // There does not seem to be a standard for this, so I am + // defaulting to the value that MS uses + #define SQL_MAX_AUTHSTR_LEN MAXNAME +#endif + +#ifndef SQL_MAX_CONNECTSTR_LEN + // There does not seem to be a standard for this, so I am + // defaulting to the value that MS recommends + #define SQL_MAX_CONNECTSTR_LEN 1024 +#endif + + +class WXDLLIMPEXP_ODBC wxDbConnectInf +{ + private: + bool freeHenvOnDestroy; + bool useConnectionStr; + + public: + HENV Henv; + wxChar Dsn[SQL_MAX_DSN_LENGTH+1]; // Data Source Name + wxChar Uid[SQL_MAX_USER_NAME_LEN+1]; // User ID + wxChar AuthStr[SQL_MAX_AUTHSTR_LEN+1]; // Authorization string (password) + wxChar ConnectionStr[SQL_MAX_CONNECTSTR_LEN+1]; // Connection string (password) + + wxString Description; // Not sure what the max length is + wxString FileType; // Not sure what the max length is + + // Optionals needed for some databases like dBase + wxString DefaultDir; // Directory that db file resides in + + public: + + wxDbConnectInf(); + wxDbConnectInf(HENV henv, const wxString &dsn, const wxString &userID=wxEmptyString, + const wxString &password=wxEmptyString, const wxString &defaultDir=wxEmptyString, + const wxString &description=wxEmptyString, const wxString &fileType=wxEmptyString); + + ~wxDbConnectInf(); + + bool Initialize(); + + bool AllocHenv(); + void FreeHenv(); + + // Accessors + const HENV &GetHenv() { return Henv; } + + const wxChar *GetDsn() { return Dsn; } + + const wxChar *GetUid() { return Uid; } + const wxChar *GetUserID() { return Uid; } + + const wxChar *GetAuthStr() { return AuthStr; } + const wxChar *GetPassword() { return AuthStr; } + + const wxChar *GetConnectionStr() { return ConnectionStr; } + bool UseConnectionStr() { return useConnectionStr; } + + const wxChar *GetDescription() { return Description; } + const wxChar *GetFileType() { return FileType; } + const wxChar *GetDefaultDir() { return DefaultDir; } + + void SetHenv(const HENV henv) { Henv = henv; } + + void SetDsn(const wxString &dsn); + + void SetUserID(const wxString &userID); + void SetUid(const wxString &uid) { SetUserID(uid); } + + void SetPassword(const wxString &password); + void SetAuthStr(const wxString &authstr) { SetPassword(authstr); } + + void SetConnectionStr(const wxString &connectStr); + + void SetDescription(const wxString &desc) { Description = desc; } + void SetFileType(const wxString &fileType) { FileType = fileType; } + void SetDefaultDir(const wxString &defDir) { DefaultDir = defDir; } +}; // class wxDbConnectInf + + +struct WXDLLIMPEXP_ODBC wxDbSqlTypeInfo +{ + wxString TypeName; + SWORD FsqlType; + long Precision; + short CaseSensitive; + short MaximumScale; +}; + + +class WXDLLIMPEXP_ODBC wxDbColFor +{ +public: + wxString s_Field; // Formatted String for Output + wxString s_Format[7]; // Formatted Objects - TIMESTAMP has the biggest (7) + wxString s_Amount[7]; // Formatted Objects - amount of things that can be formatted + int i_Amount[7]; // Formatted Objects - TT MM YYYY HH MM SS m + int i_Nation; // 0 = timestamp , 1=EU, 2=UK, 3=International, 4=US + int i_dbDataType; // conversion of the 'sqlDataType' to the generic data type used by these classes + SWORD i_sqlDataType; + + wxDbColFor(); + ~wxDbColFor(){} + + void Initialize(); + int Format(int Nation, int dbDataType, SWORD sqlDataType, short columnLength, short decimalDigits); +}; + + +class WXDLLIMPEXP_ODBC wxDbColInf +{ +public: + wxChar catalog[128+1]; + wxChar schema[128+1]; + wxChar tableName[DB_MAX_TABLE_NAME_LEN+1]; + wxChar colName[DB_MAX_COLUMN_NAME_LEN+1]; + SWORD sqlDataType; + wxChar typeName[128+1]; + SWORD columnLength; + SWORD bufferSize; + short decimalDigits; + short numPrecRadix; + short nullable; + wxChar remarks[254+1]; + int dbDataType; // conversion of the 'sqlDataType' to the generic data type used by these classes + // mj10777.19991224 : new + int PkCol; // Primary key column 0=No; 1= First Key, 2 = Second Key etc. + wxChar PkTableName[DB_MAX_TABLE_NAME_LEN+1]; // Tables that use this PKey as a FKey + int FkCol; // Foreign key column 0=No; 1= First Key, 2 = Second Key etc. + wxChar FkTableName[DB_MAX_TABLE_NAME_LEN+1]; // Foreign key table name + wxDbColFor *pColFor; // How should this columns be formatted + + wxDbColInf(); + ~wxDbColInf(); + + bool Initialize(); +}; + + +class WXDLLIMPEXP_ODBC wxDbTableInf // Description of a Table +{ +public: + wxChar tableName[DB_MAX_TABLE_NAME_LEN+1]; + wxChar tableType[254+1]; // "TABLE" or "SYSTEM TABLE" etc. + wxChar tableRemarks[254+1]; + UWORD numCols; // How many Columns does this Table have: GetColumnCount(..); + wxDbColInf *pColInf; // pColInf = NULL ; User can later call GetColumns(..); + + wxDbTableInf(); + ~wxDbTableInf(); + + bool Initialize(); +}; + + +class WXDLLIMPEXP_ODBC wxDbInf // Description of a Database +{ +public: + wxChar catalog[128+1]; + wxChar schema[128+1]; + int numTables; // How many tables does this database have + wxDbTableInf *pTableInf; // pTableInf = new wxDbTableInf[numTables]; + + wxDbInf(); + ~wxDbInf(); + + bool Initialize(); +}; + + +enum wxDbSqlLogState +{ + sqlLogOFF, + sqlLogON +}; + +// These are the databases currently tested and working with these classes +// See the comments in wxDb::Dbms() for exceptions/issues with +// each of these database engines +enum wxDBMS +{ + dbmsUNIDENTIFIED, + dbmsORACLE, + dbmsSYBASE_ASA, // Adaptive Server Anywhere + dbmsSYBASE_ASE, // Adaptive Server Enterprise + dbmsMS_SQL_SERVER, + dbmsMY_SQL, + dbmsPOSTGRES, + dbmsACCESS, + dbmsDBASE, + dbmsINFORMIX, + dbmsVIRTUOSO, + dbmsDB2, + dbmsINTERBASE, + dbmsPERVASIVE_SQL, + dbmsXBASE_SEQUITER, + dbmsFIREBIRD, + dbmsMAXDB, + dbmsFuture1, + dbmsFuture2, + dbmsFuture3, + dbmsFuture4, + dbmsFuture5, + dbmsFuture6, + dbmsFuture7, + dbmsFuture8, + dbmsFuture9, + dbmsFuture10 +}; + + +// The wxDb::errorList is copied to this variable when the wxDb object +// is closed. This way, the error list is still available after the +// database object is closed. This is necessary if the database +// connection fails so the calling application can show the operator +// why the connection failed. Note: as each wxDb object is closed, it +// will overwrite the errors of the previously destroyed wxDb object in +// this variable. + +extern WXDLLIMPEXP_DATA_ODBC(wxChar) + DBerrorList[DB_MAX_ERROR_HISTORY][DB_MAX_ERROR_MSG_LEN+1]; + + +class WXDLLIMPEXP_ODBC wxDb +{ +private: + bool dbIsOpen; + bool dbIsCached; // Was connection created by caching functions + bool dbOpenedWithConnectionString; // Was the database connection opened with a connection string + wxString dsn; // Data source name + wxString uid; // User ID + wxString authStr; // Authorization string (password) + wxString inConnectionStr; // Connection string used to connect to the database + wxString outConnectionStr;// Connection string returned by the database when a connection is successfully opened + FILE *fpSqlLog; // Sql Log file pointer + wxDbSqlLogState sqlLogState; // On or Off + bool fwdOnlyCursors; + wxDBMS dbmsType; // Type of datasource - i.e. Oracle, dBase, SQLServer, etc + + // Private member functions + bool getDbInfo(bool failOnDataTypeUnsupported=true); + bool getDataTypeInfo(SWORD fSqlType, wxDbSqlTypeInfo &structSQLTypeInfo); + bool setConnectionOptions(void); + void logError(const wxString &errMsg, const wxString &SQLState); + const wxChar *convertUserID(const wxChar *userID, wxString &UserID); + bool determineDataTypes(bool failOnDataTypeUnsupported); + void initialize(); + bool open(bool failOnDataTypeUnsupported=true); + +#if !wxODBC_BACKWARD_COMPATABILITY + // ODBC handles + HENV henv; // ODBC Environment handle + HDBC hdbc; // ODBC DB Connection handle + HSTMT hstmt; // ODBC Statement handle + + //Error reporting mode + bool silent; + + // Number of Ctable objects connected to this db object. FOR INTERNAL USE ONLY!!! + unsigned int nTables; + + // Information about logical data types VARCHAR, INTEGER, FLOAT and DATE. + // + // This information is obtained from the ODBC driver by use of the + // SQLGetTypeInfo() function. The key piece of information is the + // type name the data source uses for each logical data type. + // e.g. VARCHAR; Oracle calls it VARCHAR2. + wxDbSqlTypeInfo typeInfVarchar; + wxDbSqlTypeInfo typeInfInteger; + wxDbSqlTypeInfo typeInfFloat; + wxDbSqlTypeInfo typeInfDate; + wxDbSqlTypeInfo typeInfBlob; + wxDbSqlTypeInfo typeInfMemo; +#endif + +public: + + void setCached(bool cached) { dbIsCached = cached; } // This function must only be called by wxDbGetConnection() and wxDbCloseConnections!!! + bool IsCached() { return dbIsCached; } + + bool GetDataTypeInfo(SWORD fSqlType, wxDbSqlTypeInfo &structSQLTypeInfo) + { return getDataTypeInfo(fSqlType, structSQLTypeInfo); } + +#if wxODBC_BACKWARD_COMPATABILITY + // ODBC handles + HENV henv; // ODBC Environment handle + HDBC hdbc; // ODBC DB Connection handle + HSTMT hstmt; // ODBC Statement handle + + //Error reporting mode + bool silent; + + // Number of Ctable objects connected to this db object. FOR INTERNAL USE ONLY!!! + unsigned int nTables; +#endif + + // The following structure contains database information gathered from the + // datasource when the datasource is first opened. + struct + { + wxChar dbmsName[40]; // Name of the dbms product + wxChar dbmsVer[64]; // Version # of the dbms product + wxChar driverName[40]; // Driver name + wxChar odbcVer[60]; // ODBC version of the driver + wxChar drvMgrOdbcVer[60]; // ODBC version of the driver manager + wxChar driverVer[60]; // Driver version + wxChar serverName[80]; // Server Name, typically a connect string + wxChar databaseName[128]; // Database filename + wxChar outerJoins[2]; // Indicates whether the data source supports outer joins + wxChar procedureSupport[2]; // Indicates whether the data source supports stored procedures + wxChar accessibleTables[2]; // Indicates whether the data source only reports accessible tables in SQLTables. + UWORD maxConnections; // Maximum # of connections the data source supports + UWORD maxStmts; // Maximum # of HSTMTs per HDBC + UWORD apiConfLvl; // ODBC API conformance level + UWORD cliConfLvl; // Indicates whether the data source is SAG compliant + UWORD sqlConfLvl; // SQL conformance level + UWORD cursorCommitBehavior; // Indicates how cursors are affected by a db commit + UWORD cursorRollbackBehavior; // Indicates how cursors are affected by a db rollback + UWORD supportNotNullClause; // Indicates if data source supports NOT NULL clause + wxChar supportIEF[2]; // Integrity Enhancement Facility (Referential Integrity) + UDWORD txnIsolation; // Default transaction isolation level supported by the driver + UDWORD txnIsolationOptions; // Transaction isolation level options available + UDWORD fetchDirections; // Fetch directions supported + UDWORD lockTypes; // Lock types supported in SQLSetPos + UDWORD posOperations; // Position operations supported in SQLSetPos + UDWORD posStmts; // Position statements supported + UDWORD scrollConcurrency; // Concurrency control options supported for scrollable cursors + UDWORD scrollOptions; // Scroll Options supported for scrollable cursors + UDWORD staticSensitivity; // Indicates if additions, deletions and updates can be detected + UWORD txnCapable; // Indicates if the data source supports transactions + UDWORD loginTimeout; // Number seconds to wait for a login request + } dbInf; + + // ODBC Error Inf. + SWORD cbErrorMsg; + int DB_STATUS; +#ifdef __VMS + // The DECC compiler chokes when in db.cpp the array is accessed outside + // its bounds. Maybe this change should also applied for other platforms. + wxChar errorList[DB_MAX_ERROR_HISTORY][DB_MAX_ERROR_MSG_LEN+1]; +#else + wxChar errorList[DB_MAX_ERROR_HISTORY][DB_MAX_ERROR_MSG_LEN]; +#endif + wxChar errorMsg[SQL_MAX_MESSAGE_LENGTH]; + SQLINTEGER nativeError; + wxChar sqlState[20]; + +#if wxODBC_BACKWARD_COMPATABILITY + // Information about logical data types VARCHAR, INTEGER, FLOAT and DATE. + // + // This information is obtained from the ODBC driver by use of the + // SQLGetTypeInfo() function. The key piece of information is the + // type name the data source uses for each logical data type. + // e.g. VARCHAR; Oracle calls it VARCHAR2. + wxDbSqlTypeInfo typeInfVarchar; + wxDbSqlTypeInfo typeInfInteger; + wxDbSqlTypeInfo typeInfFloat; + wxDbSqlTypeInfo typeInfDate; + wxDbSqlTypeInfo typeInfBlob; +#endif + + // Public member functions + wxDb(const HENV &aHenv, bool FwdOnlyCursors=(bool)wxODBC_FWD_ONLY_CURSORS); + ~wxDb(); + + // Data Source Name, User ID, Password and whether open should fail on data type not supported + bool Open(const wxString& inConnectStr, bool failOnDataTypeUnsupported=true); + ///This version of Open will open the odbc source selection dialog. Cast a wxWindow::GetHandle() to SQLHWND to use. + bool Open(const wxString& inConnectStr, SQLHWND parentWnd, bool failOnDataTypeUnsupported=true); + bool Open(const wxString &Dsn, const wxString &Uid, const wxString &AuthStr, bool failOnDataTypeUnsupported=true); + bool Open(wxDbConnectInf *dbConnectInf, bool failOnDataTypeUnsupported=true); + bool Open(wxDb *copyDb); // pointer to a wxDb whose connection info should be copied rather than re-queried + void Close(void); + bool CommitTrans(void); + bool RollbackTrans(void); + bool DispAllErrors(HENV aHenv, HDBC aHdbc = SQL_NULL_HDBC, HSTMT aHstmt = SQL_NULL_HSTMT); + bool GetNextError(HENV aHenv, HDBC aHdbc = SQL_NULL_HDBC, HSTMT aHstmt = SQL_NULL_HSTMT); + void DispNextError(void); + bool CreateView(const wxString &viewName, const wxString &colList, const wxString &pSqlStmt, bool attemptDrop=true); + bool DropView(const wxString &viewName); + bool ExecSql(const wxString &pSqlStmt); + bool ExecSql(const wxString &pSqlStmt, wxDbColInf** columns, short& numcols); + bool GetNext(void); + bool GetData(UWORD colNo, SWORD cType, PTR pData, SDWORD maxLen, SQLLEN FAR *cbReturned); + bool Grant(int privileges, const wxString &tableName, const wxString &userList = wxT("PUBLIC")); + int TranslateSqlState(const wxString &SQLState); + wxDbInf *GetCatalog(const wxChar *userID=NULL); + bool Catalog(const wxChar *userID=NULL, const wxString &fileName=SQL_CATALOG_FILENAME); + int GetKeyFields(const wxString &tableName, wxDbColInf* colInf, UWORD noCols); + + wxDbColInf *GetColumns(wxChar *tableName[], const wxChar *userID=NULL); + wxDbColInf *GetColumns(const wxString &tableName, UWORD *numCols, const wxChar *userID=NULL); + + int GetColumnCount(const wxString &tableName, const wxChar *userID=NULL); + const wxChar *GetDatabaseName(void) {return dbInf.dbmsName;} + const wxString &GetDataSource(void) {return dsn;} + const wxString &GetDatasourceName(void){return dsn;} + const wxString &GetUsername(void) {return uid;} + const wxString &GetPassword(void) {return authStr;} + const wxString &GetConnectionInStr(void) {return inConnectionStr;} + const wxString &GetConnectionOutStr(void) {return outConnectionStr;} + bool IsOpen(void) {return dbIsOpen;} + bool OpenedWithConnectionString(void) {return dbOpenedWithConnectionString;} + HENV GetHENV(void) {return henv;} + HDBC GetHDBC(void) {return hdbc;} + HSTMT GetHSTMT(void) {return hstmt;} + int GetTableCount() {return nTables;} // number of tables using this connection + wxDbSqlTypeInfo GetTypeInfVarchar() {return typeInfVarchar;} + wxDbSqlTypeInfo GetTypeInfInteger() {return typeInfInteger;} + wxDbSqlTypeInfo GetTypeInfFloat() {return typeInfFloat;} + wxDbSqlTypeInfo GetTypeInfDate() {return typeInfDate;} + wxDbSqlTypeInfo GetTypeInfBlob() {return typeInfBlob;} + wxDbSqlTypeInfo GetTypeInfMemo() {return typeInfMemo;} + + // tableName can refer to a table, view, alias or synonym + bool TableExists(const wxString &tableName, const wxChar *userID=NULL, + const wxString &tablePath=wxEmptyString); + bool TablePrivileges(const wxString &tableName, const wxString &priv, + const wxChar *userID=NULL, const wxChar *schema=NULL, + const wxString &path=wxEmptyString); + + // These two functions return the table name or column name in a form ready + // for use in SQL statements. For example, if the datasource allows spaces + // in the table name or column name, the returned string will have the + // correct enclosing marks around the name to allow it to be properly + // included in a SQL statement + const wxString SQLTableName(const wxChar *tableName); + const wxString SQLColumnName(const wxChar *colName); + + void LogError(const wxString &errMsg, const wxString &SQLState = wxEmptyString) + { logError(errMsg, SQLState); } + void SetDebugErrorMessages(bool state) { silent = !state; } + bool SetSqlLogging(wxDbSqlLogState state, const wxString &filename = SQL_LOG_FILENAME, + bool append = false); + bool WriteSqlLog(const wxString &logMsg); + + wxDBMS Dbms(void); + bool ModifyColumn(const wxString &tableName, const wxString &columnName, + int dataType, ULONG columnLength=0, + const wxString &optionalParam=wxEmptyString); + + bool FwdOnlyCursors(void) {return fwdOnlyCursors;} + + // return the string with all special SQL characters escaped + wxString EscapeSqlChars(const wxString& value); + + // These two functions are provided strictly for use by wxDbTable. + // DO NOT USE THESE FUNCTIONS, OR MEMORY LEAKS MAY OCCUR + void incrementTableCount() { nTables++; return; } + void decrementTableCount() { nTables--; return; } + +}; // wxDb + + +// This structure forms a node in a linked list. The linked list of "DbList" objects +// keeps track of allocated database connections. This allows the application to +// open more than one database connection through ODBC for multiple transaction support +// or for multiple database support. +struct wxDbList +{ + wxDbList *PtrPrev; // Pointer to previous item in the list + wxString Dsn; // Data Source Name + wxString Uid; // User ID + wxString AuthStr; // Authorization string (password) + wxString ConnectionStr; // Connection string used instead of DSN + wxDb *PtrDb; // Pointer to the wxDb object + bool Free; // Is item free or in use? + wxDbList *PtrNext; // Pointer to next item in the list +}; + + +#ifdef __WXDEBUG__ +#include "wx/object.h" +class wxTablesInUse : public wxObject +{ + public: + const wxChar *tableName; + ULONG tableID; + class wxDb *pDb; +}; // wxTablesInUse +#endif + + +// The following routines allow a user to get new database connections, free them +// for other code segments to use, or close all of them when the application has +// completed. +wxDb WXDLLIMPEXP_ODBC *wxDbGetConnection(wxDbConnectInf *pDbConfig, bool FwdOnlyCursors=(bool)wxODBC_FWD_ONLY_CURSORS); +bool WXDLLIMPEXP_ODBC wxDbFreeConnection(wxDb *pDb); +void WXDLLIMPEXP_ODBC wxDbCloseConnections(void); +int WXDLLIMPEXP_ODBC wxDbConnectionsInUse(void); + + +// Writes a message to the wxLog window (stdout usually) when an internal error +// situation occurs. This function only works in DEBUG builds +const wxChar WXDLLIMPEXP_ODBC * +wxDbLogExtendedErrorMsg(const wxChar *userText, + wxDb *pDb, + const wxChar *ErrFile, + int ErrLine); + + +// This function sets the sql log state for all open wxDb objects +bool WXDLLIMPEXP_ODBC +wxDbSqlLog(wxDbSqlLogState state, const wxString &filename = SQL_LOG_FILENAME); + + +#if 0 +// MSW/VC6 ONLY!!! Experimental +int WXDLLEXPORT wxDbCreateDataSource(const wxString &driverName, const wxString &dsn, const wxString &description=wxEmptyString, + bool sysDSN=false, const wxString &defDir=wxEmptyString, wxWindow *parent=NULL); +#endif + +// This routine allows you to query a driver manager +// for a list of available datasources. Call this routine +// the first time using SQL_FETCH_FIRST. Continue to call it +// using SQL_FETCH_NEXT until you've exhausted the list. +bool WXDLLIMPEXP_ODBC +wxDbGetDataSource(HENV henv, wxChar *Dsn, SWORD DsnMaxLength, wxChar *DsDesc, + SWORD DsDescMaxLength, UWORD direction = SQL_FETCH_NEXT); + + +// Change this to 0 to remove use of all deprecated functions +#if wxODBC_BACKWARD_COMPATABILITY +//################################################################################# +//############### DEPRECATED functions for backward compatibility ################# +//################################################################################# + +// Backward compability structures/classes. This will eventually go away +const int DB_PATH_MAX = wxDB_PATH_MAX; + +typedef wxDb wxDB; +typedef wxDbTableInf wxTableInf; +typedef wxDbColInf wxColInf; +typedef wxDbColInf CcolInf; +typedef wxDbColFor wxColFor; +typedef wxDbSqlTypeInfo SqlTypeInfo; +typedef wxDbSqlTypeInfo wxSqlTypeInfo; +typedef enum wxDbSqlLogState sqlLog; +typedef enum wxDbSqlLogState wxSqlLogState; +typedef enum wxDBMS dbms; +typedef enum wxDBMS DBMS; +typedef wxODBC_ERRORS ODBC_ERRORS; +typedef wxDbConnectInf DbStuff; +typedef wxDbList DbList; +#ifdef __WXDEBUG__ +typedef wxTablesInUse CstructTablesInUse; +#endif + +// Deprecated function names that are replaced by the function names listed above +wxDB WXDLLIMPEXP_ODBC +*GetDbConnection(DbStuff *pDbStuff, bool FwdOnlyCursors=(bool)wxODBC_FWD_ONLY_CURSORS); +bool WXDLLIMPEXP_ODBC FreeDbConnection(wxDB *pDb); +void WXDLLIMPEXP_ODBC CloseDbConnections(void); +int WXDLLIMPEXP_ODBC NumberDbConnectionsInUse(void); + +bool SqlLog(sqlLog state, const wxChar *filename = SQL_LOG_FILENAME); + +bool WXDLLIMPEXP_ODBC +GetDataSource(HENV henv, char *Dsn, SWORD DsnMaxLength, char *DsDesc, SWORD DsDescMaxLength, + UWORD direction = SQL_FETCH_NEXT); + +#endif // Deprecated structures/classes/functions + +#endif // _WX_DB_H_ + diff --git a/Externals/wxWidgets/include/wx/dbgrid.h b/Externals/wxWidgets/include/wx/dbgrid.h new file mode 100644 index 0000000000..d9bcaae693 --- /dev/null +++ b/Externals/wxWidgets/include/wx/dbgrid.h @@ -0,0 +1,177 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: dbgrid.h +// Purpose: Displays a wxDbTable in a wxGrid. +// Author: Roger Gammans, Paul Gammans +// Modified by: +// Created: +// RCS-ID: $Id: dbgrid.h 41020 2006-09-05 20:47:48Z VZ $ +// Copyright: (c) 1999 The Computer Surgery (roger@computer-surgery.co.uk) +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// +// Branched From : dbgrid.h,v 1.19 2001/03/28 11:16:01 +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GENERIC_DBGRID_H_ +#define _WX_GENERIC_DBGRID_H_ + +#if wxUSE_ODBC +#if wxUSE_GRID + +#include "wx/log.h" +#include "wx/dbtable.h" +#include "wx/dynarray.h" +#include "wx/grid.h" +#include "wx/dbkeyg.h" + +#define wxGRID_VALUE_DBAUTO _T("dbauto") + +WX_DECLARE_USER_EXPORTED_OBJARRAY(GenericKey,keyarray,WXDLLIMPEXP_DBGRID); + +static const int wxUSE_QUERY = -1; + +class WXDLLIMPEXP_DBGRID wxDbGridColInfoBase +{ +public: + //Default ctor + wxDbGridColInfoBase() { } + wxDbGridColInfoBase(int colNo, + wxString type, wxString title) : + DbCol(colNo), + wxtypename(type), + Title(title) + { } + //Copy Ctor + wxDbGridColInfoBase(const wxDbGridColInfoBase& ref) + { + DbCol = ref.DbCol; + wxtypename = ref.wxtypename; + Title = ref.Title; + } + //Empty destructor for member obj's + ~wxDbGridColInfoBase() {} + + int DbCol; + wxString wxtypename; + wxString Title; +}; + + +class WXDLLIMPEXP_DBGRID wxDbGridColInfo +{ +public: + wxDbGridColInfo(int colNo, + wxString type, + wxString title, + wxDbGridColInfo *next) : + m_data(colNo,type,title) + { + m_next=next; + } + + //Empty List + ~wxDbGridColInfo() { delete m_next; } + + //Recurse to find length. + int Length() { return (m_next ? m_next->Length() +1 : 1); } + + // Adds a new column info (2 step creation) + void AddColInfo (int colNo, + wxString type, + wxString title) + { + GetLast()->m_next = new wxDbGridColInfo (colNo, type, title, NULL); + } + + // Searches last + wxDbGridColInfo *GetLast() { return (m_next ? m_next->GetLast() : this); } + + + protected: + wxDbGridColInfoBase m_data; + wxDbGridColInfo *m_next; + + friend class wxDbGridTableBase; +}; + + +class WXDLLIMPEXP_DBGRID wxDbGridCellAttrProvider : public wxGridCellAttrProvider +{ +public: + wxDbGridCellAttrProvider(); + wxDbGridCellAttrProvider(wxDbTable *tab, wxDbGridColInfoBase* ColInfo); + virtual ~wxDbGridCellAttrProvider(); + + virtual wxGridCellAttr *GetAttr(int row, int col, + wxGridCellAttr::wxAttrKind kind) const; + virtual void AssignDbTable(wxDbTable *tab); +private: + wxDbTable *m_data; + wxDbGridColInfoBase *m_ColInfo; +}; + + +class WXDLLIMPEXP_DBGRID wxDbGridTableBase : public wxGridTableBase +{ +public: + wxDbGridTableBase(wxDbTable *tab, wxDbGridColInfo *ColInfo, + int count = wxUSE_QUERY, bool takeOwnership = true); + virtual ~wxDbGridTableBase(); + + virtual int GetNumberRows() + { + wxLogDebug(_T(" GetNumberRows() = %i"),m_rowtotal); + return m_rowtotal; + } + virtual int GetNumberCols() + { + wxLogDebug(_T(" GetNumberCols() = %i"),m_nocols); + return m_nocols; + } + virtual bool IsEmptyCell(int row, int col) ; + virtual wxString GetValue(int row, int col) ; + virtual void SetValue(int row, int col, const wxString& value); + virtual bool CanHaveAttributes(); + virtual wxString GetTypeName(int row, int col); + virtual bool CanGetValueAs(int row, int col, const wxString& typeName); + virtual bool CanSetValueAs(int row, int col, const wxString& typeName); + virtual long GetValueAsLong(int row, int col); + virtual double GetValueAsDouble(int row, int col); + virtual bool GetValueAsBool(int row, int col); + virtual void SetValueAsLong(int row, int col, long value); + virtual void SetValueAsDouble(int row, int col, double value); + virtual void SetValueAsBool(int row, int col, bool value); + virtual void *GetValueAsCustom(int row, int col, const wxString& typeName); + virtual void SetValueAsCustom(int row, int col, const wxString& typeName, void* value); + + + virtual wxString GetColLabelValue(int col); + + virtual bool AssignDbTable(wxDbTable *tab, int count = wxUSE_QUERY, bool takeOwnership=true); + virtual void ValidateRow(int row); + virtual bool UpdateRow(int row) const + { + if (m_row != row) + return true; + else + return Writeback(); + } + +private: + //Operates on the current row + bool Writeback() const; + + typedef wxGridTableBase inherited; + keyarray m_keys; + wxDbTable *m_data; + bool m_dbowner; + int m_rowtotal; + int m_nocols; + int m_row; + wxDbGridColInfoBase *m_ColInfo; + bool m_rowmodified; +}; + +#endif // #if wxUSE_GRID +#endif // #if wxUSE_ODBC + +#endif // _WX_GENERIC_DBGRID_H_ diff --git a/Externals/wxWidgets/include/wx/dbkeyg.h b/Externals/wxWidgets/include/wx/dbkeyg.h new file mode 100644 index 0000000000..49efb9912c --- /dev/null +++ b/Externals/wxWidgets/include/wx/dbkeyg.h @@ -0,0 +1,41 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: dbkeyg.h +// Purpose: Generic key support for wxDbTable +// Author: Roger Gammans +// Modified by: +// Created: +// RCS-ID: $Id: dbkeyg.h 29077 2004-09-10 12:56:07Z ABX $ +// Copyright: (c) 1999 The Computer Surgery (roger@computer-surgery.co.uk) +// Licence: wxWindows licence +// +// NOTE : There is no CPP file to go along with this +// +/////////////////////////////////////////////////////////////////////////////// +// Branched From : gkey.h,v 1.3 2001/06/01 10:31:41 +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DBGKEY_H_ +#define _WX_DBGKEY_H_ + +class GenericKey +{ +public: + GenericKey(void *blk, size_t sz) { clone(blk,sz); } + GenericKey(const GenericKey &ref) { clone(ref.m_data,ref.m_sz); } + ~GenericKey() { free(m_data); } + + void *GetBlk(void) const { return m_data; } + +private: + void clone(void *blk, size_t sz) + { + m_data = malloc(sz); + memcpy(m_data,blk,sz); + m_sz = sz; + } + + void *m_data; + size_t m_sz; +}; + +#endif // _WX_DBGKEY_H_ diff --git a/Externals/wxWidgets/include/wx/dbtable.h b/Externals/wxWidgets/include/wx/dbtable.h new file mode 100644 index 0000000000..b3e1f7d8c1 --- /dev/null +++ b/Externals/wxWidgets/include/wx/dbtable.h @@ -0,0 +1,377 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: dbtable.h +// Purpose: Declaration of the wxDbTable class. +// Author: Doug Card +// Modified by: George Tasker +// Bart Jourquin +// Mark Johnson +// Created: 9.96 +// RCS-ID: $Id: dbtable.h 35650 2005-09-23 12:56:45Z MR $ +// Copyright: (c) 1996 Remstar International, Inc. +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +/* +// SYNOPSIS START +// SYNOPSIS STOP +*/ + +#ifndef DBTABLE_DOT_H +#define DBTABLE_DOT_H + +#include "wx/defs.h" + +#include "wx/db.h" + +#include "wx/variant.h" +#include "wx/dbkeyg.h" + +const int wxDB_ROWID_LEN = 24; // 18 is the max, 24 is in case it gets larger +const int wxDB_DEFAULT_CURSOR = 0; +const bool wxDB_QUERY_ONLY = true; +const bool wxDB_DISABLE_VIEW = true; + +// Used to indicate end of a variable length list of +// column numbers passed to member functions +const int wxDB_NO_MORE_COLUMN_NUMBERS = -1; + +// The following class is used to define a column of a table. +// The wxDbTable constructor will dynamically allocate as many of +// these as there are columns in the table. The class derived +// from wxDbTable must initialize these column definitions in it's +// constructor. These column definitions provide inf. to the +// wxDbTable class which allows it to create a table in the data +// source, exchange data between the data source and the C++ +// object, and so on. +class WXDLLIMPEXP_ODBC wxDbColDef +{ +public: + wxChar ColName[DB_MAX_COLUMN_NAME_LEN+1]; // Column Name + int DbDataType; // Logical Data Type; e.g. DB_DATA_TYPE_INTEGER + SWORD SqlCtype; // C data type; e.g. SQL_C_LONG + void *PtrDataObj; // Address of the data object + int SzDataObj; // Size, in bytes, of the data object + bool KeyField; // true if this column is part of the PRIMARY KEY to the table; Date fields should NOT be KeyFields. + bool Updateable; // Specifies whether this column is updateable + bool InsertAllowed; // Specifies whether this column should be included in an INSERT statement + bool DerivedCol; // Specifies whether this column is a derived value + SQLLEN CbValue; // Internal use only!!! + bool Null; // NOT FULLY IMPLEMENTED - Allows NULL values in Inserts and Updates + + wxDbColDef(); + + bool Initialize(); +}; // wxDbColDef + + +class WXDLLIMPEXP_ODBC wxDbColDataPtr +{ +public: + void *PtrDataObj; + int SzDataObj; + SWORD SqlCtype; +}; // wxDbColDataPtr + + +// This structure is used when creating secondary indexes. +class WXDLLIMPEXP_ODBC wxDbIdxDef +{ +public: + wxChar ColName[DB_MAX_COLUMN_NAME_LEN+1]; + bool Ascending; +}; // wxDbIdxDef + + +class WXDLLIMPEXP_ODBC wxDbTable +{ +private: + ULONG tableID; // Used for debugging. This can help to match up mismatched constructors/destructors + + // Private member variables + UDWORD cursorType; + bool insertable; + + // Private member functions + bool initialize(wxDb *pwxDb, const wxString &tblName, const UWORD numColumns, + const wxString &qryTblName, bool qryOnly, const wxString &tblPath); + void cleanup(); + + void setCbValueForColumn(int columnIndex); + bool bindParams(bool forUpdate); // called by the other 'bind' functions + bool bindInsertParams(void); + bool bindUpdateParams(void); + + bool bindCols(HSTMT cursor); + bool getRec(UWORD fetchType); + bool execDelete(const wxString &pSqlStmt); + bool execUpdate(const wxString &pSqlStmt); + bool query(int queryType, bool forUpdate, bool distinct, const wxString &pSqlStmt=wxEmptyString); + +#if !wxODBC_BACKWARD_COMPATABILITY +// these were public + // Where, Order By and From clauses + wxString where; // Standard SQL where clause, minus the word WHERE + wxString orderBy; // Standard SQL order by clause, minus the ORDER BY + wxString from; // Allows for joins in a wxDbTable::Query(). Format: ",tbl,tbl..." + + // ODBC Handles + HENV henv; // ODBC Environment handle + HDBC hdbc; // ODBC DB Connection handle + HSTMT hstmt; // ODBC Statement handle + HSTMT *hstmtDefault; // Default cursor + HSTMT hstmtInsert; // ODBC Statement handle used specifically for inserts + HSTMT hstmtDelete; // ODBC Statement handle used specifically for deletes + HSTMT hstmtUpdate; // ODBC Statement handle used specifically for updates + HSTMT hstmtInternal; // ODBC Statement handle used internally only + HSTMT *hstmtCount; // ODBC Statement handle used by Count() function (No binding of columns) + + // Flags + bool selectForUpdate; + + // Pointer to the database object this table belongs to + wxDb *pDb; + + // Table Inf. + wxString tablePath; // needed for dBase tables + wxString tableName; // Table name + wxString queryTableName; // Query Table Name + UWORD m_numCols; // # of columns in the table + bool queryOnly; // Query Only, no inserts, updates or deletes + + // Column Definitions + wxDbColDef *colDefs; // Array of wxDbColDef structures +#endif +public: +#if wxODBC_BACKWARD_COMPATABILITY + // Where, Order By and From clauses + char *where; // Standard SQL where clause, minus the word WHERE + char *orderBy; // Standard SQL order by clause, minus the ORDER BY + char *from; // Allows for joins in a wxDbTable::Query(). Format: ",tbl,tbl..." + + // ODBC Handles + HENV henv; // ODBC Environment handle + HDBC hdbc; // ODBC DB Connection handle + HSTMT hstmt; // ODBC Statement handle + HSTMT *hstmtDefault; // Default cursor + HSTMT hstmtInsert; // ODBC Statement handle used specifically for inserts + HSTMT hstmtDelete; // ODBC Statement handle used specifically for deletes + HSTMT hstmtUpdate; // ODBC Statement handle used specifically for updates + HSTMT hstmtInternal; // ODBC Statement handle used internally only + HSTMT *hstmtCount; // ODBC Statement handle used by Count() function (No binding of columns) + + // Flags + bool selectForUpdate; + + // Pointer to the database object this table belongs to + wxDb *pDb; + + // Table Inf. + char tablePath[wxDB_PATH_MAX]; // needed for dBase tables + char tableName[DB_MAX_TABLE_NAME_LEN+1]; // Table name + char queryTableName[DB_MAX_TABLE_NAME_LEN+1]; // Query Table Name + UWORD m_numCols; // # of columns in the table + bool queryOnly; // Query Only, no inserts, updates or deletes + + // Column Definitions + wxDbColDef *colDefs; // Array of wxDbColDef structures +#endif + // Public member functions + wxDbTable(wxDb *pwxDb, const wxString &tblName, const UWORD numColumns, + const wxString &qryTblName=wxEmptyString, bool qryOnly = !wxDB_QUERY_ONLY, + const wxString &tblPath=wxEmptyString); + +#if WXWIN_COMPATIBILITY_2_4 + wxDEPRECATED( + wxDbTable(wxDb *pwxDb, const wxString &tblName, const UWORD numColumns, + const wxChar *qryTblName, bool qryOnly, + const wxString &tblPath) + ); +#endif // WXWIN_COMPATIBILITY_2_4 + + virtual ~wxDbTable(); + + bool Open(bool checkPrivileges=false, bool checkTableExists=true); + bool CreateTable(bool attemptDrop=true); + bool DropTable(void); + bool CreateIndex(const wxString &indexName, bool unique, UWORD numIndexColumns, + wxDbIdxDef *pIndexDefs, bool attemptDrop=true); + bool DropIndex(const wxString &indexName); + + // Accessors + + // The member variables returned by these accessors are all + // set when the wxDbTable instance is created and cannot be + // changed, hence there is no corresponding SetXxxx function + wxDb *GetDb() { return pDb; } + const wxString &GetTableName() { return tableName; } + const wxString &GetQueryTableName() { return queryTableName; } + const wxString &GetTablePath() { return tablePath; } + + UWORD GetNumberOfColumns() { return m_numCols; } // number of "defined" columns for this wxDbTable instance + + const wxString &GetFromClause() { return from; } + const wxString &GetOrderByClause() { return orderBy; } + const wxString &GetWhereClause() { return where; } + + bool IsQueryOnly() { return queryOnly; } +#if wxODBC_BACKWARD_COMPATABILITY + void SetFromClause(const char *From) { from = (char *)From; } + void SetOrderByClause(const char *OrderBy) { orderBy = (char *)OrderBy; } + void SetWhereClause(const char *Where) { where = (char *)Where; } +#else + void SetFromClause(const wxString &From) { from = From; } + void SetOrderByClause(const wxString &OrderBy) { orderBy = OrderBy; } + bool SetOrderByColNums(UWORD first, ...); + void SetWhereClause(const wxString &Where) { where = Where; } + void From(const wxString &From) { from = From; } + void OrderBy(const wxString &OrderBy) { orderBy = OrderBy; } + void Where(const wxString &Where) { where = Where; } + const wxString &Where() { return where; } + const wxString &OrderBy() { return orderBy; } + const wxString &From() { return from; } +#endif + int Insert(void); + bool Update(void); + bool Update(const wxString &pSqlStmt); + bool UpdateWhere(const wxString &pWhereClause); + bool Delete(void); + bool DeleteWhere(const wxString &pWhereClause); + bool DeleteMatching(void); + virtual bool Query(bool forUpdate = false, bool distinct = false); + bool QueryBySqlStmt(const wxString &pSqlStmt); + bool QueryMatching(bool forUpdate = false, bool distinct = false); + bool QueryOnKeyFields(bool forUpdate = false, bool distinct = false); + bool Refresh(void); + bool GetNext(void) { return(getRec(SQL_FETCH_NEXT)); } + bool operator++(int) { return(getRec(SQL_FETCH_NEXT)); } + + /***** These four functions only work with wxDb instances that are defined ***** + ***** as not being FwdOnlyCursors *****/ + bool GetPrev(void); + bool operator--(int); + bool GetFirst(void); + bool GetLast(void); + + bool IsCursorClosedOnCommit(void); + UWORD GetRowNum(void); + + void BuildSelectStmt(wxString &pSqlStmt, int typeOfSelect, bool distinct); + void BuildSelectStmt(wxChar *pSqlStmt, int typeOfSelect, bool distinct); + + void BuildDeleteStmt(wxString &pSqlStmt, int typeOfDel, const wxString &pWhereClause=wxEmptyString); + void BuildDeleteStmt(wxChar *pSqlStmt, int typeOfDel, const wxString &pWhereClause=wxEmptyString); + + void BuildUpdateStmt(wxString &pSqlStmt, int typeOfUpdate, const wxString &pWhereClause=wxEmptyString); + void BuildUpdateStmt(wxChar *pSqlStmt, int typeOfUpdate, const wxString &pWhereClause=wxEmptyString); + + void BuildWhereClause(wxString &pWhereClause, int typeOfWhere, const wxString &qualTableName=wxEmptyString, bool useLikeComparison=false); + void BuildWhereClause(wxChar *pWhereClause, int typeOfWhere, const wxString &qualTableName=wxEmptyString, bool useLikeComparison=false); + +#if wxODBC_BACKWARD_COMPATABILITY +// The following member functions are deprecated. You should use the BuildXxxxxStmt functions (above) + void GetSelectStmt(char *pSqlStmt, int typeOfSelect, bool distinct) + { BuildSelectStmt(pSqlStmt,typeOfSelect,distinct); } + void GetDeleteStmt(char *pSqlStmt, int typeOfDel, const char *pWhereClause = NULL) + { BuildDeleteStmt(pSqlStmt,typeOfDel,pWhereClause); } + void GetUpdateStmt(char *pSqlStmt, int typeOfUpdate, const char *pWhereClause = NULL) + { BuildUpdateStmt(pSqlStmt,typeOfUpdate,pWhereClause); } + void GetWhereClause(char *pWhereClause, int typeOfWhere, + const char *qualTableName = NULL, bool useLikeComparison=false) + { BuildWhereClause(pWhereClause,typeOfWhere,qualTableName,useLikeComparison); } +#endif + bool CanSelectForUpdate(void); +#if wxODBC_BACKWARD_COMPATABILITY + bool CanUpdByROWID(void) { return CanUpdateByRowID(); }; +#endif + bool CanUpdateByROWID(void); + void ClearMemberVar(UWORD colNumber, bool setToNull=false); + void ClearMemberVars(bool setToNull=false); + bool SetQueryTimeout(UDWORD nSeconds); + + wxDbColDef *GetColDefs() { return colDefs; } + bool SetColDefs(UWORD index, const wxString &fieldName, int dataType, + void *pData, SWORD cType, + int size, bool keyField = false, bool updateable = true, + bool insertAllowed = true, bool derivedColumn = false); + wxDbColDataPtr *SetColDefs(wxDbColInf *colInfs, UWORD numCols); + + bool CloseCursor(HSTMT cursor); + bool DeleteCursor(HSTMT *hstmtDel); + void SetCursor(HSTMT *hstmtActivate = (void **) wxDB_DEFAULT_CURSOR); + HSTMT GetCursor(void) { return(hstmt); } + HSTMT *GetNewCursor(bool setCursor = false, bool bindColumns = true); +#if wxODBC_BACKWARD_COMPATABILITY +// The following member function is deprecated. You should use the GetNewCursor + HSTMT *NewCursor(bool setCursor = false, bool bindColumns = true) { return GetNewCursor(setCursor,bindColumns); } +#endif + + ULONG Count(const wxString &args=_T("*")); + int DB_STATUS(void) { return(pDb->DB_STATUS); } + + bool IsColNull(UWORD colNumber) const; + bool SetColNull(UWORD colNumber, bool set=true); + bool SetColNull(const wxString &colName, bool set=true); +#if wxODBC_BACKWARD_COMPATABILITY +// The following member functions are deprecated. You should use the SetColNull() + bool SetNull(int colNumber, bool set=true) { return (SetNull(colNumber,set)); } + bool SetNull(const char *colName, bool set=true) { return (SetNull(colName,set)); } +#endif +#ifdef __WXDEBUG__ + ULONG GetTableID() { return tableID; } +#endif + +//TODO: Need to Document + typedef enum { WX_ROW_MODE_QUERY , WX_ROW_MODE_INDIVIDUAL } rowmode_t; + virtual void SetRowMode(const rowmode_t rowmode); +#if wxODBC_BACKWARD_COMPATABILITY + virtual wxVariant GetCol(const int colNumber) const { return GetColumn(colNumber); }; + virtual void SetCol(const int colNumber, const wxVariant value) { return SetColumn(colNumber, value); }; +#endif + virtual wxVariant GetColumn(const int colNumber) const ; + virtual void SetColumn(const int colNumber, const wxVariant value); + virtual GenericKey GetKey(void); + virtual void SetKey(const GenericKey &key); + + private: + HSTMT *m_hstmtGridQuery; + rowmode_t m_rowmode; + size_t m_keysize; + +// typedef enum {unmodified=0, UpdatePending, InsertPending } recStatus; + +// recStatus get_ModifiedStatus() { return m_recstatus; } + +// void modify() { +// if (m_recstatus==unmodified) +// m_recstatus=UpdatePending; +// } +// protected: +// void insertify() {m_recstatus=InsertPending; } +// void unmodify() {m_recstatus=unmodified; } +// recStatus m_recstatus; +//TODO: Need to Document +}; // wxDbTable + + +// Change this to 0 to remove use of all deprecated functions +#if wxODBC_BACKWARD_COMPATABILITY +//################################################################################# +//############### DEPRECATED functions for backward compatibility ################# +//################################################################################# + +// Backward compability. These will eventually go away +typedef wxDbTable wxTable; +typedef wxDbIdxDef wxIdxDef; +typedef wxDbIdxDef CidxDef; +typedef wxDbColDef wxColDef; +typedef wxDbColDef CcolDef; +typedef wxDbColDataPtr wxColDataPtr; +typedef wxDbColDataPtr CcolDataPtr; + +const int ROWID = wxDB_ROWID_LEN; +const int DEFAULT_CURSOR = wxDB_DEFAULT_CURSOR; +const bool QUERY_ONLY = wxDB_QUERY_ONLY; +const bool DISABLE_VIEW = wxDB_DISABLE_VIEW; +#endif + +#endif diff --git a/Externals/wxWidgets/include/wx/dc.h b/Externals/wxWidgets/include/wx/dc.h new file mode 100644 index 0000000000..405f05db8d --- /dev/null +++ b/Externals/wxWidgets/include/wx/dc.h @@ -0,0 +1,997 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/dc.h +// Purpose: wxDC class +// Author: Vadim Zeitlin +// Modified by: +// Created: 05/25/99 +// RCS-ID: $Id: dc.h 43745 2006-12-02 14:11:15Z VZ $ +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DC_H_BASE_ +#define _WX_DC_H_BASE_ + +// ---------------------------------------------------------------------------- +// headers which we must include here +// ---------------------------------------------------------------------------- + +#include "wx/object.h" // the base class + +#include "wx/intl.h" // for wxLayoutDirection +#include "wx/cursor.h" // we have member variables of these classes +#include "wx/font.h" // so we can't do without them +#include "wx/colour.h" +#include "wx/bitmap.h" // for wxNullBitmap +#include "wx/brush.h" +#include "wx/pen.h" +#include "wx/palette.h" +#include "wx/list.h" // we use wxList in inline functions +#include "wx/dynarray.h" +#include "wx/math.h" + +class WXDLLEXPORT wxDC; +class WXDLLEXPORT wxDCBase; + +class WXDLLEXPORT wxDrawObject +{ +public: + + wxDrawObject() + : m_isBBoxValid(false) + , m_minX(0), m_minY(0), m_maxX(0), m_maxY(0) + { } + + virtual ~wxDrawObject() { } + + virtual void Draw(wxDCBase&) const { } + + virtual void CalcBoundingBox(wxCoord x, wxCoord y) + { + if ( m_isBBoxValid ) + { + if ( x < m_minX ) m_minX = x; + if ( y < m_minY ) m_minY = y; + if ( x > m_maxX ) m_maxX = x; + if ( y > m_maxY ) m_maxY = y; + } + else + { + m_isBBoxValid = true; + + m_minX = x; + m_minY = y; + m_maxX = x; + m_maxY = y; + } + } + + void ResetBoundingBox() + { + m_isBBoxValid = false; + + m_minX = m_maxX = m_minY = m_maxY = 0; + } + + // Get the final bounding box of the PostScript or Metafile picture. + + wxCoord MinX() const { return m_minX; } + wxCoord MaxX() const { return m_maxX; } + wxCoord MinY() const { return m_minY; } + wxCoord MaxY() const { return m_maxY; } + + //to define the type of object for derived objects + virtual int GetType()=0; + +protected: + //for boundingbox calculation + bool m_isBBoxValid:1; + //for boundingbox calculation + wxCoord m_minX, m_minY, m_maxX, m_maxY; +}; + +// --------------------------------------------------------------------------- +// global variables +// --------------------------------------------------------------------------- + +// --------------------------------------------------------------------------- +// wxDC is the device context - object on which any drawing is done +// --------------------------------------------------------------------------- + +class WXDLLEXPORT wxDCBase : public wxObject +{ +public: + wxDCBase() + : m_colour(wxColourDisplay()) + , m_ok(true) + , m_clipping(false) + , m_isInteractive(0) + , m_isBBoxValid(false) + , m_logicalOriginX(0), m_logicalOriginY(0) + , m_deviceOriginX(0), m_deviceOriginY(0) + , m_logicalScaleX(1.0), m_logicalScaleY(1.0) + , m_userScaleX(1.0), m_userScaleY(1.0) + , m_scaleX(1.0), m_scaleY(1.0) + , m_signX(1), m_signY(1) + , m_minX(0), m_minY(0), m_maxX(0), m_maxY(0) + , m_clipX1(0), m_clipY1(0), m_clipX2(0), m_clipY2(0) + , m_logicalFunction(wxCOPY) + , m_backgroundMode(wxTRANSPARENT) + , m_mappingMode(wxMM_TEXT) + , m_pen() + , m_brush() + , m_backgroundBrush(*wxTRANSPARENT_BRUSH) + , m_textForegroundColour(*wxBLACK) + , m_textBackgroundColour(*wxWHITE) + , m_font() +#if wxUSE_PALETTE + , m_palette() + , m_hasCustomPalette(false) +#endif // wxUSE_PALETTE + { + ResetBoundingBox(); + ResetClipping(); + } + + virtual ~wxDCBase() { } + + // graphic primitives + // ------------------ + + virtual void DrawObject(wxDrawObject* drawobject) + { + drawobject->Draw(*this); + CalcBoundingBox(drawobject->MinX(),drawobject->MinY()); + CalcBoundingBox(drawobject->MaxX(),drawobject->MaxY()); + } + + bool FloodFill(wxCoord x, wxCoord y, const wxColour& col, + int style = wxFLOOD_SURFACE) + { return DoFloodFill(x, y, col, style); } + bool FloodFill(const wxPoint& pt, const wxColour& col, + int style = wxFLOOD_SURFACE) + { return DoFloodFill(pt.x, pt.y, col, style); } + + // fill the area specified by rect with a radial gradient, starting from + // initialColour in the centre of the cercle and fading to destColour. + void GradientFillConcentric(const wxRect& rect, + const wxColour& initialColour, + const wxColour& destColour) + { GradientFillConcentric(rect, initialColour, destColour, + wxPoint(rect.GetWidth() / 2, + rect.GetHeight() / 2)); } + + void GradientFillConcentric(const wxRect& rect, + const wxColour& initialColour, + const wxColour& destColour, + const wxPoint& circleCenter) + { DoGradientFillConcentric(rect, initialColour, destColour, circleCenter); } + + // fill the area specified by rect with a linear gradient + void GradientFillLinear(const wxRect& rect, + const wxColour& initialColour, + const wxColour& destColour, + wxDirection nDirection = wxEAST) + { DoGradientFillLinear(rect, initialColour, destColour, nDirection); } + + bool GetPixel(wxCoord x, wxCoord y, wxColour *col) const + { return DoGetPixel(x, y, col); } + bool GetPixel(const wxPoint& pt, wxColour *col) const + { return DoGetPixel(pt.x, pt.y, col); } + + void DrawLine(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2) + { DoDrawLine(x1, y1, x2, y2); } + void DrawLine(const wxPoint& pt1, const wxPoint& pt2) + { DoDrawLine(pt1.x, pt1.y, pt2.x, pt2.y); } + + void CrossHair(wxCoord x, wxCoord y) + { DoCrossHair(x, y); } + void CrossHair(const wxPoint& pt) + { DoCrossHair(pt.x, pt.y); } + + void DrawArc(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2, + wxCoord xc, wxCoord yc) + { DoDrawArc(x1, y1, x2, y2, xc, yc); } + void DrawArc(const wxPoint& pt1, const wxPoint& pt2, const wxPoint& centre) + { DoDrawArc(pt1.x, pt1.y, pt2.x, pt2.y, centre.x, centre.y); } + + void DrawCheckMark(wxCoord x, wxCoord y, + wxCoord width, wxCoord height) + { DoDrawCheckMark(x, y, width, height); } + void DrawCheckMark(const wxRect& rect) + { DoDrawCheckMark(rect.x, rect.y, rect.width, rect.height); } + + void DrawEllipticArc(wxCoord x, wxCoord y, wxCoord w, wxCoord h, + double sa, double ea) + { DoDrawEllipticArc(x, y, w, h, sa, ea); } + void DrawEllipticArc(const wxPoint& pt, const wxSize& sz, + double sa, double ea) + { DoDrawEllipticArc(pt.x, pt.y, sz.x, sz.y, sa, ea); } + + void DrawPoint(wxCoord x, wxCoord y) + { DoDrawPoint(x, y); } + void DrawPoint(const wxPoint& pt) + { DoDrawPoint(pt.x, pt.y); } + + void DrawLines(int n, wxPoint points[], + wxCoord xoffset = 0, wxCoord yoffset = 0) + { DoDrawLines(n, points, xoffset, yoffset); } + void DrawLines(const wxList *list, + wxCoord xoffset = 0, wxCoord yoffset = 0); + + void DrawPolygon(int n, wxPoint points[], + wxCoord xoffset = 0, wxCoord yoffset = 0, + int fillStyle = wxODDEVEN_RULE) + { DoDrawPolygon(n, points, xoffset, yoffset, fillStyle); } + + void DrawPolygon(const wxList *list, + wxCoord xoffset = 0, wxCoord yoffset = 0, + int fillStyle = wxODDEVEN_RULE); + + void DrawPolyPolygon(int n, int count[], wxPoint points[], + wxCoord xoffset = 0, wxCoord yoffset = 0, + int fillStyle = wxODDEVEN_RULE) + { DoDrawPolyPolygon(n, count, points, xoffset, yoffset, fillStyle); } + + void DrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height) + { DoDrawRectangle(x, y, width, height); } + void DrawRectangle(const wxPoint& pt, const wxSize& sz) + { DoDrawRectangle(pt.x, pt.y, sz.x, sz.y); } + void DrawRectangle(const wxRect& rect) + { DoDrawRectangle(rect.x, rect.y, rect.width, rect.height); } + + void DrawRoundedRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height, + double radius) + { DoDrawRoundedRectangle(x, y, width, height, radius); } + void DrawRoundedRectangle(const wxPoint& pt, const wxSize& sz, + double radius) + { DoDrawRoundedRectangle(pt.x, pt.y, sz.x, sz.y, radius); } + void DrawRoundedRectangle(const wxRect& r, double radius) + { DoDrawRoundedRectangle(r.x, r.y, r.width, r.height, radius); } + + void DrawCircle(wxCoord x, wxCoord y, wxCoord radius) + { DoDrawEllipse(x - radius, y - radius, 2*radius, 2*radius); } + void DrawCircle(const wxPoint& pt, wxCoord radius) + { DrawCircle(pt.x, pt.y, radius); } + + void DrawEllipse(wxCoord x, wxCoord y, wxCoord width, wxCoord height) + { DoDrawEllipse(x, y, width, height); } + void DrawEllipse(const wxPoint& pt, const wxSize& sz) + { DoDrawEllipse(pt.x, pt.y, sz.x, sz.y); } + void DrawEllipse(const wxRect& rect) + { DoDrawEllipse(rect.x, rect.y, rect.width, rect.height); } + + void DrawIcon(const wxIcon& icon, wxCoord x, wxCoord y) + { DoDrawIcon(icon, x, y); } + void DrawIcon(const wxIcon& icon, const wxPoint& pt) + { DoDrawIcon(icon, pt.x, pt.y); } + + void DrawBitmap(const wxBitmap &bmp, wxCoord x, wxCoord y, + bool useMask = false) + { DoDrawBitmap(bmp, x, y, useMask); } + void DrawBitmap(const wxBitmap &bmp, const wxPoint& pt, + bool useMask = false) + { DoDrawBitmap(bmp, pt.x, pt.y, useMask); } + + void DrawText(const wxString& text, wxCoord x, wxCoord y) + { DoDrawText(text, x, y); } + void DrawText(const wxString& text, const wxPoint& pt) + { DoDrawText(text, pt.x, pt.y); } + + void DrawRotatedText(const wxString& text, wxCoord x, wxCoord y, double angle) + { DoDrawRotatedText(text, x, y, angle); } + void DrawRotatedText(const wxString& text, const wxPoint& pt, double angle) + { DoDrawRotatedText(text, pt.x, pt.y, angle); } + + // this version puts both optional bitmap and the text into the given + // rectangle and aligns is as specified by alignment parameter; it also + // will emphasize the character with the given index if it is != -1 and + // return the bounding rectangle if required + virtual void DrawLabel(const wxString& text, + const wxBitmap& image, + const wxRect& rect, + int alignment = wxALIGN_LEFT | wxALIGN_TOP, + int indexAccel = -1, + wxRect *rectBounding = NULL); + + void DrawLabel(const wxString& text, const wxRect& rect, + int alignment = wxALIGN_LEFT | wxALIGN_TOP, + int indexAccel = -1) + { DrawLabel(text, wxNullBitmap, rect, alignment, indexAccel); } + + bool Blit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height, + wxDC *source, wxCoord xsrc, wxCoord ysrc, + int rop = wxCOPY, bool useMask = false, wxCoord xsrcMask = wxDefaultCoord, wxCoord ysrcMask = wxDefaultCoord) + { + return DoBlit(xdest, ydest, width, height, + source, xsrc, ysrc, rop, useMask, xsrcMask, ysrcMask); + } + bool Blit(const wxPoint& destPt, const wxSize& sz, + wxDC *source, const wxPoint& srcPt, + int rop = wxCOPY, bool useMask = false, const wxPoint& srcPtMask = wxDefaultPosition) + { + return DoBlit(destPt.x, destPt.y, sz.x, sz.y, + source, srcPt.x, srcPt.y, rop, useMask, srcPtMask.x, srcPtMask.y); + } + + wxBitmap GetAsBitmap(const wxRect *subrect = (const wxRect *) NULL) const + { + return DoGetAsBitmap(subrect); + } + +#if wxUSE_SPLINES + // TODO: this API needs fixing (wxPointList, why (!const) "wxList *"?) + void DrawSpline(wxCoord x1, wxCoord y1, + wxCoord x2, wxCoord y2, + wxCoord x3, wxCoord y3); + void DrawSpline(int n, wxPoint points[]); + + void DrawSpline(wxList *points) { DoDrawSpline(points); } +#endif // wxUSE_SPLINES + + // Eventually we will have wxUSE_GENERIC_DRAWELLIPSE +#ifdef __WXWINCE__ + //! Generic method to draw ellipses, circles and arcs with current pen and brush. + /*! \param x Upper left corner of bounding box. + * \param y Upper left corner of bounding box. + * \param w Width of bounding box. + * \param h Height of bounding box. + * \param sa Starting angle of arc + * (counterclockwise, start at 3 o'clock, 360 is full circle). + * \param ea Ending angle of arc. + * \param angle Rotation angle, the Arc will be rotated after + * calculating begin and end. + */ + void DrawEllipticArcRot( wxCoord x, wxCoord y, + wxCoord width, wxCoord height, + double sa = 0, double ea = 0, double angle = 0 ) + { DoDrawEllipticArcRot( x, y, width, height, sa, ea, angle ); } + + void DrawEllipticArcRot( const wxPoint& pt, + const wxSize& sz, + double sa = 0, double ea = 0, double angle = 0 ) + { DoDrawEllipticArcRot( pt.x, pt.y, sz.x, sz.y, sa, ea, angle ); } + + void DrawEllipticArcRot( const wxRect& rect, + double sa = 0, double ea = 0, double angle = 0 ) + { DoDrawEllipticArcRot( rect.x, rect.y, rect.width, rect.height, sa, ea, angle ); } + + virtual void DoDrawEllipticArcRot( wxCoord x, wxCoord y, + wxCoord w, wxCoord h, + double sa = 0, double ea = 0, double angle = 0 ); + + //! Rotates points around center. + /*! This is a quite straight method, it calculates in pixels + * and so it produces rounding errors. + * \param points The points inside will be rotated. + * \param angle Rotating angle (counterclockwise, start at 3 o'clock, 360 is full circle). + * \param center Center of rotation. + */ + void Rotate( wxList* points, double angle, wxPoint center = wxPoint(0,0) ); + + // used by DrawEllipticArcRot + // Careful: wxList gets filled with points you have to delete later. + void CalculateEllipticPoints( wxList* points, + wxCoord xStart, wxCoord yStart, + wxCoord w, wxCoord h, + double sa, double ea ); +#endif + + // global DC operations + // -------------------- + + virtual void Clear() = 0; + + virtual bool StartDoc(const wxString& WXUNUSED(message)) { return true; } + virtual void EndDoc() { } + + virtual void StartPage() { } + virtual void EndPage() { } + +#if WXWIN_COMPATIBILITY_2_6 + wxDEPRECATED( void BeginDrawing() ); + wxDEPRECATED( void EndDrawing() ); +#endif // WXWIN_COMPATIBILITY_2_6 + + + // set objects to use for drawing + // ------------------------------ + + virtual void SetFont(const wxFont& font) = 0; + virtual void SetPen(const wxPen& pen) = 0; + virtual void SetBrush(const wxBrush& brush) = 0; + virtual void SetBackground(const wxBrush& brush) = 0; + virtual void SetBackgroundMode(int mode) = 0; +#if wxUSE_PALETTE + virtual void SetPalette(const wxPalette& palette) = 0; +#endif // wxUSE_PALETTE + + // clipping region + // --------------- + + void SetClippingRegion(wxCoord x, wxCoord y, wxCoord width, wxCoord height) + { DoSetClippingRegion(x, y, width, height); } + void SetClippingRegion(const wxPoint& pt, const wxSize& sz) + { DoSetClippingRegion(pt.x, pt.y, sz.x, sz.y); } + void SetClippingRegion(const wxRect& rect) + { DoSetClippingRegion(rect.x, rect.y, rect.width, rect.height); } + void SetClippingRegion(const wxRegion& region) + { DoSetClippingRegionAsRegion(region); } + + virtual void DestroyClippingRegion() { ResetClipping(); } + + void GetClippingBox(wxCoord *x, wxCoord *y, wxCoord *w, wxCoord *h) const + { DoGetClippingBox(x, y, w, h); } + void GetClippingBox(wxRect& rect) const + { + DoGetClippingBox(&rect.x, &rect.y, &rect.width, &rect.height); + } + + // text extent + // ----------- + + virtual wxCoord GetCharHeight() const = 0; + virtual wxCoord GetCharWidth() const = 0; + + // only works for single line strings + void GetTextExtent(const wxString& string, + wxCoord *x, wxCoord *y, + wxCoord *descent = NULL, + wxCoord *externalLeading = NULL, + wxFont *theFont = NULL) const + { DoGetTextExtent(string, x, y, descent, externalLeading, theFont); } + + wxSize GetTextExtent(const wxString& string) const + { + wxCoord w, h; + DoGetTextExtent(string, &w, &h); + return wxSize(w, h); + } + + // works for single as well as multi-line strings + virtual void GetMultiLineTextExtent(const wxString& string, + wxCoord *width, + wxCoord *height, + wxCoord *heightLine = NULL, + wxFont *font = NULL) const; + + wxSize GetMultiLineTextExtent(const wxString& string) const + { + wxCoord w, h; + GetMultiLineTextExtent(string, &w, &h); + return wxSize(w, h); + } + + // Measure cumulative width of text after each character + bool GetPartialTextExtents(const wxString& text, wxArrayInt& widths) const + { return DoGetPartialTextExtents(text, widths); } + + + // size and resolution + // ------------------- + + // in device units + void GetSize(int *width, int *height) const + { DoGetSize(width, height); } + wxSize GetSize() const + { + int w, h; + DoGetSize(&w, &h); + + return wxSize(w, h); + } + + // in mm + void GetSizeMM(int* width, int* height) const + { DoGetSizeMM(width, height); } + wxSize GetSizeMM() const + { + int w, h; + DoGetSizeMM(&w, &h); + + return wxSize(w, h); + } + + // coordinates conversions + // ----------------------- + + // This group of functions does actual conversion of the input, as you'd + // expect. + wxCoord DeviceToLogicalX(wxCoord x) const; + wxCoord DeviceToLogicalY(wxCoord y) const; + wxCoord DeviceToLogicalXRel(wxCoord x) const; + wxCoord DeviceToLogicalYRel(wxCoord y) const; + wxCoord LogicalToDeviceX(wxCoord x) const; + wxCoord LogicalToDeviceY(wxCoord y) const; + wxCoord LogicalToDeviceXRel(wxCoord x) const; + wxCoord LogicalToDeviceYRel(wxCoord y) const; + + // query DC capabilities + // --------------------- + + virtual bool CanDrawBitmap() const = 0; + virtual bool CanGetTextExtent() const = 0; + + // colour depth + virtual int GetDepth() const = 0; + + // Resolution in Pixels per inch + virtual wxSize GetPPI() const = 0; + + virtual bool Ok() const { return IsOk(); } + virtual bool IsOk() const { return m_ok; } + + // accessors and setters + // --------------------- + + virtual int GetBackgroundMode() const { return m_backgroundMode; } + virtual const wxBrush& GetBackground() const { return m_backgroundBrush; } + virtual const wxBrush& GetBrush() const { return m_brush; } + virtual const wxFont& GetFont() const { return m_font; } + virtual const wxPen& GetPen() const { return m_pen; } + + virtual const wxColour& GetTextForeground() const { return m_textForegroundColour; } + virtual const wxColour& GetTextBackground() const { return m_textBackgroundColour; } + virtual void SetTextForeground(const wxColour& colour) + { m_textForegroundColour = colour; } + virtual void SetTextBackground(const wxColour& colour) + { m_textBackgroundColour = colour; } + + virtual int GetMapMode() const { return m_mappingMode; } + virtual void SetMapMode(int mode) = 0; + + virtual void GetUserScale(double *x, double *y) const + { + if ( x ) *x = m_userScaleX; + if ( y ) *y = m_userScaleY; + } + virtual void SetUserScale(double x, double y) = 0; + + virtual void GetLogicalScale(double *x, double *y) + { + if ( x ) *x = m_logicalScaleX; + if ( y ) *y = m_logicalScaleY; + } + virtual void SetLogicalScale(double x, double y) + { + m_logicalScaleX = x; + m_logicalScaleY = y; + } + + void GetLogicalOrigin(wxCoord *x, wxCoord *y) const + { DoGetLogicalOrigin(x, y); } + wxPoint GetLogicalOrigin() const + { wxCoord x, y; DoGetLogicalOrigin(&x, &y); return wxPoint(x, y); } + virtual void SetLogicalOrigin(wxCoord x, wxCoord y) = 0; + + void GetDeviceOrigin(wxCoord *x, wxCoord *y) const + { DoGetDeviceOrigin(x, y); } + wxPoint GetDeviceOrigin() const + { wxCoord x, y; DoGetDeviceOrigin(&x, &y); return wxPoint(x, y); } + virtual void SetDeviceOrigin(wxCoord x, wxCoord y) = 0; + + virtual void ComputeScaleAndOrigin() {} + + virtual void SetAxisOrientation(bool xLeftRight, bool yBottomUp) = 0; + + virtual int GetLogicalFunction() const { return m_logicalFunction; } + virtual void SetLogicalFunction(int function) = 0; + +#if WXWIN_COMPATIBILITY_2_4 + virtual void SetOptimization(bool WXUNUSED(opt)) { } + virtual bool GetOptimization() { return false; } +#endif + + // bounding box + // ------------ + + virtual void CalcBoundingBox(wxCoord x, wxCoord y) + { + if ( m_isBBoxValid ) + { + if ( x < m_minX ) m_minX = x; + if ( y < m_minY ) m_minY = y; + if ( x > m_maxX ) m_maxX = x; + if ( y > m_maxY ) m_maxY = y; + } + else + { + m_isBBoxValid = true; + + m_minX = x; + m_minY = y; + m_maxX = x; + m_maxY = y; + } + } + + void ResetBoundingBox() + { + m_isBBoxValid = false; + + m_minX = m_maxX = m_minY = m_maxY = 0; + } + + // Get the final bounding box of the PostScript or Metafile picture. + wxCoord MinX() const { return m_minX; } + wxCoord MaxX() const { return m_maxX; } + wxCoord MinY() const { return m_minY; } + wxCoord MaxY() const { return m_maxY; } + + // misc old functions + // ------------------ + + // for compatibility with the old code when wxCoord was long everywhere + void GetTextExtent(const wxString& string, + long *x, long *y, + long *descent = NULL, + long *externalLeading = NULL, + wxFont *theFont = NULL) const + { + wxCoord x2, y2, descent2, externalLeading2; + DoGetTextExtent(string, &x2, &y2, + &descent2, &externalLeading2, + theFont); + if ( x ) + *x = x2; + if ( y ) + *y = y2; + if ( descent ) + *descent = descent2; + if ( externalLeading ) + *externalLeading = externalLeading2; + } + + void GetLogicalOrigin(long *x, long *y) const + { + wxCoord x2, y2; + DoGetLogicalOrigin(&x2, &y2); + if ( x ) + *x = x2; + if ( y ) + *y = y2; + } + + void GetDeviceOrigin(long *x, long *y) const + { + wxCoord x2, y2; + DoGetDeviceOrigin(&x2, &y2); + if ( x ) + *x = x2; + if ( y ) + *y = y2; + } + void GetClippingBox(long *x, long *y, long *w, long *h) const + { + wxCoord xx,yy,ww,hh; + DoGetClippingBox(&xx, &yy, &ww, &hh); + if (x) *x = xx; + if (y) *y = yy; + if (w) *w = ww; + if (h) *h = hh; + } + + // RTL related functions + // --------------------- + + // get or change the layout direction (LTR or RTL) for this dc, + // wxLayout_Default is returned if layout direction is not supported + virtual wxLayoutDirection GetLayoutDirection() const + { return wxLayout_Default; } + virtual void SetLayoutDirection(wxLayoutDirection WXUNUSED(dir)) + { } + +protected: + // the pure virtual functions which should be implemented by wxDC + virtual bool DoFloodFill(wxCoord x, wxCoord y, const wxColour& col, + int style = wxFLOOD_SURFACE) = 0; + + virtual void DoGradientFillLinear(const wxRect& rect, + const wxColour& initialColour, + const wxColour& destColour, + wxDirection nDirection = wxEAST); + + virtual void DoGradientFillConcentric(const wxRect& rect, + const wxColour& initialColour, + const wxColour& destColour, + const wxPoint& circleCenter); + + virtual bool DoGetPixel(wxCoord x, wxCoord y, wxColour *col) const = 0; + + virtual void DoDrawPoint(wxCoord x, wxCoord y) = 0; + virtual void DoDrawLine(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2) = 0; + + virtual void DoDrawArc(wxCoord x1, wxCoord y1, + wxCoord x2, wxCoord y2, + wxCoord xc, wxCoord yc) = 0; + virtual void DoDrawCheckMark(wxCoord x, wxCoord y, + wxCoord width, wxCoord height); + virtual void DoDrawEllipticArc(wxCoord x, wxCoord y, wxCoord w, wxCoord h, + double sa, double ea) = 0; + + virtual void DoDrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height) = 0; + virtual void DoDrawRoundedRectangle(wxCoord x, wxCoord y, + wxCoord width, wxCoord height, + double radius) = 0; + virtual void DoDrawEllipse(wxCoord x, wxCoord y, + wxCoord width, wxCoord height) = 0; + + virtual void DoCrossHair(wxCoord x, wxCoord y) = 0; + + virtual void DoDrawIcon(const wxIcon& icon, wxCoord x, wxCoord y) = 0; + virtual void DoDrawBitmap(const wxBitmap &bmp, wxCoord x, wxCoord y, + bool useMask = false) = 0; + + virtual void DoDrawText(const wxString& text, wxCoord x, wxCoord y) = 0; + virtual void DoDrawRotatedText(const wxString& text, + wxCoord x, wxCoord y, double angle) = 0; + + virtual bool DoBlit(wxCoord xdest, wxCoord ydest, + wxCoord width, wxCoord height, + wxDC *source, wxCoord xsrc, wxCoord ysrc, + int rop = wxCOPY, bool useMask = false, wxCoord xsrcMask = wxDefaultCoord, wxCoord ysrcMask = wxDefaultCoord) = 0; + + virtual wxBitmap DoGetAsBitmap(const wxRect *WXUNUSED(subrect)) const { return wxNullBitmap; } + + virtual void DoGetSize(int *width, int *height) const = 0; + virtual void DoGetSizeMM(int* width, int* height) const = 0; + + virtual void DoDrawLines(int n, wxPoint points[], + wxCoord xoffset, wxCoord yoffset) = 0; + virtual void DoDrawPolygon(int n, wxPoint points[], + wxCoord xoffset, wxCoord yoffset, + int fillStyle = wxODDEVEN_RULE) = 0; + virtual void DoDrawPolyPolygon(int n, int count[], wxPoint points[], + wxCoord xoffset, wxCoord yoffset, + int fillStyle); + + virtual void DoSetClippingRegionAsRegion(const wxRegion& region) = 0; + virtual void DoSetClippingRegion(wxCoord x, wxCoord y, + wxCoord width, wxCoord height) = 0; + +#if WXWIN_COMPATIBILITY_2_4 + // this was only for confusing people, use DoGetClippingBox only + virtual void DoGetClippingRegion(wxCoord *x, wxCoord *y, + wxCoord *w, wxCoord *h) + { DoGetClippingBox(x, y, w, h); } +#endif + + virtual void DoGetClippingBox(wxCoord *x, wxCoord *y, + wxCoord *w, wxCoord *h) const + { + if ( x ) + *x = m_clipX1; + if ( y ) + *y = m_clipY1; + if ( w ) + *w = m_clipX2 - m_clipX1; + if ( h ) + *h = m_clipY2 - m_clipY1; + } + + virtual void DoGetLogicalOrigin(wxCoord *x, wxCoord *y) const + { + if ( x ) *x = m_logicalOriginX; + if ( y ) *y = m_logicalOriginY; + } + + virtual void DoGetDeviceOrigin(wxCoord *x, wxCoord *y) const + { + if ( x ) *x = m_deviceOriginX; + if ( y ) *y = m_deviceOriginY; + } + + virtual void DoGetTextExtent(const wxString& string, + wxCoord *x, wxCoord *y, + wxCoord *descent = NULL, + wxCoord *externalLeading = NULL, + wxFont *theFont = NULL) const = 0; + + virtual bool DoGetPartialTextExtents(const wxString& text, wxArrayInt& widths) const; + +#if wxUSE_SPLINES + virtual void DoDrawSpline(wxList *points); +#endif + +protected: + // unset clipping variables (after clipping region was destroyed) + void ResetClipping() + { + m_clipping = false; + + m_clipX1 = m_clipX2 = m_clipY1 = m_clipY2 = 0; + } + + // flags + bool m_colour:1; + bool m_ok:1; + bool m_clipping:1; + bool m_isInteractive:1; + bool m_isBBoxValid:1; + + // coordinate system variables + + // TODO short descriptions of what exactly they are would be nice... + + wxCoord m_logicalOriginX, m_logicalOriginY; + wxCoord m_deviceOriginX, m_deviceOriginY; + + double m_logicalScaleX, m_logicalScaleY; + double m_userScaleX, m_userScaleY; + double m_scaleX, m_scaleY; + + // Used by SetAxisOrientation() to invert the axes + int m_signX, m_signY; + + // bounding and clipping boxes + wxCoord m_minX, m_minY, m_maxX, m_maxY; + wxCoord m_clipX1, m_clipY1, m_clipX2, m_clipY2; + + int m_logicalFunction; + int m_backgroundMode; + int m_mappingMode; + + // GDI objects + wxPen m_pen; + wxBrush m_brush; + wxBrush m_backgroundBrush; + wxColour m_textForegroundColour; + wxColour m_textBackgroundColour; + wxFont m_font; + +#if wxUSE_PALETTE + wxPalette m_palette; + bool m_hasCustomPalette; +#endif // wxUSE_PALETTE + +private: + DECLARE_NO_COPY_CLASS(wxDCBase) + DECLARE_ABSTRACT_CLASS(wxDCBase) +}; + +// ---------------------------------------------------------------------------- +// now include the declaration of wxDC class +// ---------------------------------------------------------------------------- + +#if defined(__WXPALMOS__) + #include "wx/palmos/dc.h" +#elif defined(__WXMSW__) + #include "wx/msw/dc.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/dc.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/dc.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/dc.h" +#elif defined(__WXX11__) + #include "wx/x11/dc.h" +#elif defined(__WXMGL__) + #include "wx/mgl/dc.h" +#elif defined(__WXDFB__) + #include "wx/dfb/dc.h" +#elif defined(__WXMAC__) + #include "wx/mac/dc.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/dc.h" +#elif defined(__WXPM__) + #include "wx/os2/dc.h" +#endif + +#if wxUSE_GRAPHICS_CONTEXT + #include "wx/dcgraph.h" +#endif + +// ---------------------------------------------------------------------------- +// helper class: you can use it to temporarily change the DC text colour and +// restore it automatically when the object goes out of scope +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxDCTextColourChanger +{ +public: + wxDCTextColourChanger(wxDC& dc) : m_dc(dc), m_colFgOld() { } + + wxDCTextColourChanger(wxDC& dc, const wxColour& col) : m_dc(dc) + { + Set(col); + } + + ~wxDCTextColourChanger() + { + if ( m_colFgOld.Ok() ) + m_dc.SetTextForeground(m_colFgOld); + } + + void Set(const wxColour& col) + { + if ( !m_colFgOld.Ok() ) + m_colFgOld = m_dc.GetTextForeground(); + m_dc.SetTextForeground(col); + } + +private: + wxDC& m_dc; + + wxColour m_colFgOld; + + DECLARE_NO_COPY_CLASS(wxDCTextColourChanger) +}; + +// ---------------------------------------------------------------------------- +// helper class: you can use it to temporarily change the DC pen and +// restore it automatically when the object goes out of scope +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxDCPenChanger +{ +public: + wxDCPenChanger(wxDC& dc, const wxPen& pen) : m_dc(dc), m_penOld(dc.GetPen()) + { + m_dc.SetPen(pen); + } + + ~wxDCPenChanger() + { + if ( m_penOld.Ok() ) + m_dc.SetPen(m_penOld); + } + +private: + wxDC& m_dc; + + wxPen m_penOld; + + DECLARE_NO_COPY_CLASS(wxDCPenChanger) +}; + +// ---------------------------------------------------------------------------- +// helper class: you can use it to temporarily change the DC brush and +// restore it automatically when the object goes out of scope +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxDCBrushChanger +{ +public: + wxDCBrushChanger(wxDC& dc, const wxBrush& brush) : m_dc(dc), m_brushOld(dc.GetBrush()) + { + m_dc.SetBrush(brush); + } + + ~wxDCBrushChanger() + { + if ( m_brushOld.Ok() ) + m_dc.SetBrush(m_brushOld); + } + +private: + wxDC& m_dc; + + wxBrush m_brushOld; + + DECLARE_NO_COPY_CLASS(wxDCBrushChanger) +}; + +// ---------------------------------------------------------------------------- +// another small helper class: sets the clipping region in its ctor and +// destroys it in the dtor +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxDCClipper +{ +public: + wxDCClipper(wxDC& dc, const wxRegion& r) : m_dc(dc) + { dc.SetClippingRegion(r); } + wxDCClipper(wxDC& dc, const wxRect& r) : m_dc(dc) + { dc.SetClippingRegion(r.x, r.y, r.width, r.height); } + wxDCClipper(wxDC& dc, wxCoord x, wxCoord y, wxCoord w, wxCoord h) : m_dc(dc) + { dc.SetClippingRegion(x, y, w, h); } + + ~wxDCClipper() { m_dc.DestroyClippingRegion(); } + +private: + wxDC& m_dc; + + DECLARE_NO_COPY_CLASS(wxDCClipper) +}; + +#endif // _WX_DC_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/dcbuffer.h b/Externals/wxWidgets/include/wx/dcbuffer.h new file mode 100644 index 0000000000..0e27ab8c76 --- /dev/null +++ b/Externals/wxWidgets/include/wx/dcbuffer.h @@ -0,0 +1,276 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/dcbuffer.h +// Purpose: wxBufferedDC class +// Author: Ron Lee +// Modified by: Vadim Zeitlin (refactored, added bg preservation) +// Created: 16/03/02 +// RCS-ID: $Id: dcbuffer.h 44609 2007-03-05 08:58:09Z VZ $ +// Copyright: (c) Ron Lee +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DCBUFFER_H_ +#define _WX_DCBUFFER_H_ + +#include "wx/dcmemory.h" +#include "wx/dcclient.h" +#include "wx/window.h" + +// Split platforms into two groups - those which have well-working +// double-buffering by default, and those which do not. +#if defined(__WXMAC__) || defined(__WXGTK20__) || defined(__WXDFB__) + #define wxALWAYS_NATIVE_DOUBLE_BUFFER 1 +#else + #define wxALWAYS_NATIVE_DOUBLE_BUFFER 0 +#endif + + +// ---------------------------------------------------------------------------- +// Double buffering helper. +// ---------------------------------------------------------------------------- + +// Assumes the buffer bitmap covers the entire scrolled window, +// and prepares the window DC accordingly +#define wxBUFFER_VIRTUAL_AREA 0x01 + +// Assumes the buffer bitmap only covers the client area; +// does not prepare the window DC +#define wxBUFFER_CLIENT_AREA 0x02 + +class WXDLLEXPORT wxBufferedDC : public wxMemoryDC +{ +public: + // Default ctor, must subsequently call Init for two stage construction. + wxBufferedDC() + : m_dc(NULL), + m_buffer(NULL), + m_style(0) + { + } + + // Construct a wxBufferedDC using a user supplied buffer. + wxBufferedDC(wxDC *dc, + wxBitmap& buffer = wxNullBitmap, + int style = wxBUFFER_CLIENT_AREA) + : m_dc(NULL), m_buffer(NULL) + { + Init(dc, buffer, style); + } + + // Construct a wxBufferedDC with an internal buffer of 'area' + // (where area is usually something like the size of the window + // being buffered) + wxBufferedDC(wxDC *dc, const wxSize& area, int style = wxBUFFER_CLIENT_AREA) + : m_dc(NULL), m_buffer(NULL) + { + Init(dc, area, style); + } + + // The usually desired action in the dtor is to blit the buffer. + virtual ~wxBufferedDC() + { + if ( m_dc ) + UnMask(); + } + + // These reimplement the actions of the ctors for two stage creation + void Init(wxDC *dc, + wxBitmap& buffer = wxNullBitmap, + int style = wxBUFFER_CLIENT_AREA) + { + InitCommon(dc, style); + + m_buffer = &buffer; + + UseBuffer(); + } + + void Init(wxDC *dc, const wxSize &area, int style = wxBUFFER_CLIENT_AREA) + { + InitCommon(dc, style); + + UseBuffer(area.x, area.y); + } + + // Blits the buffer to the dc, and detaches the dc from the buffer (so it + // can be effectively used once only). + // + // Usually called in the dtor or by the dtor of derived classes if the + // BufferedDC must blit before the derived class (which may own the dc it's + // blitting to) is destroyed. + void UnMask() + { + wxCHECK_RET( m_dc, _T("no underlying wxDC?") ); + wxASSERT_MSG( m_buffer && m_buffer->IsOk(), _T("invalid backing store") ); + + wxCoord x = 0, + y = 0; + + if ( m_style & wxBUFFER_CLIENT_AREA ) + GetDeviceOrigin(&x, &y); + + m_dc->Blit(0, 0, m_buffer->GetWidth(), m_buffer->GetHeight(), + this, -x, -y ); + m_dc = NULL; + } + + // Set and get the style + void SetStyle(int style) { m_style = style; } + int GetStyle() const { return m_style; } + +private: + // common part of Init()s + void InitCommon(wxDC *dc, int style) + { + wxASSERT_MSG( !m_dc, _T("wxBufferedDC already initialised") ); + + m_dc = dc; + m_style = style; + + // inherit the same layout direction as the original DC + if (dc && dc->IsOk()) + SetLayoutDirection(dc->GetLayoutDirection()); + } + + // check that the bitmap is valid and use it + void UseBuffer(wxCoord w = -1, wxCoord h = -1); + + // the underlying DC to which we copy everything drawn on this one in + // UnMask() + // + // NB: Without the existence of a wxNullDC, this must be a pointer, else it + // could probably be a reference. + wxDC *m_dc; + + // the buffer (selected in this DC), initially invalid + wxBitmap *m_buffer; + + // the buffering style + int m_style; + + DECLARE_DYNAMIC_CLASS(wxBufferedDC) + DECLARE_NO_COPY_CLASS(wxBufferedDC) +}; + + +// ---------------------------------------------------------------------------- +// Double buffered PaintDC. +// ---------------------------------------------------------------------------- + +// Creates a double buffered wxPaintDC, optionally allowing the +// user to specify their own buffer to use. +class WXDLLEXPORT wxBufferedPaintDC : public wxBufferedDC +{ +public: + // If no bitmap is supplied by the user, a temporary one will be created. + wxBufferedPaintDC(wxWindow *window, wxBitmap& buffer, int style = wxBUFFER_CLIENT_AREA) + : m_paintdc(window) + { + // If we're buffering the virtual window, scale the paint DC as well + if (style & wxBUFFER_VIRTUAL_AREA) + window->PrepareDC( m_paintdc ); + + if( buffer.IsOk() ) + Init(&m_paintdc, buffer, style); + else + Init(&m_paintdc, GetBufferedSize(window, style), style); + } + + // If no bitmap is supplied by the user, a temporary one will be created. + wxBufferedPaintDC(wxWindow *window, int style = wxBUFFER_CLIENT_AREA) + : m_paintdc(window) + { + // If we're using the virtual window, scale the paint DC as well + if (style & wxBUFFER_VIRTUAL_AREA) + window->PrepareDC( m_paintdc ); + + Init(&m_paintdc, GetBufferedSize(window, style), style); + } + + // default copy ctor ok. + + virtual ~wxBufferedPaintDC() + { + // We must UnMask here, else by the time the base class + // does it, the PaintDC will have already been destroyed. + UnMask(); + } + +protected: + // return the size needed by the buffer: this depends on whether we're + // buffering just the currently shown part or the total (scrolled) window + static wxSize GetBufferedSize(wxWindow *window, int style) + { + return style & wxBUFFER_VIRTUAL_AREA ? window->GetVirtualSize() + : window->GetClientSize(); + } + +private: + wxPaintDC m_paintdc; + + DECLARE_ABSTRACT_CLASS(wxBufferedPaintDC) + DECLARE_NO_COPY_CLASS(wxBufferedPaintDC) +}; + + + +// +// wxAutoBufferedPaintDC is a wxPaintDC in toolkits which have double- +// buffering by default. Otherwise it is a wxBufferedPaintDC. Thus, +// you can only expect it work with a simple constructor that +// accepts single wxWindow* argument. +// +#if wxALWAYS_NATIVE_DOUBLE_BUFFER + #define wxAutoBufferedPaintDCBase wxPaintDC +#else + #define wxAutoBufferedPaintDCBase wxBufferedPaintDC +#endif + + +#ifdef __WXDEBUG__ + +class wxAutoBufferedPaintDC : public wxAutoBufferedPaintDCBase +{ +public: + + wxAutoBufferedPaintDC(wxWindow* win) + : wxAutoBufferedPaintDCBase(win) + { + TestWinStyle(win); + } + + virtual ~wxAutoBufferedPaintDC() { } + +private: + + void TestWinStyle(wxWindow* win) + { + // Help the user to get the double-buffering working properly. + wxASSERT_MSG( win->GetBackgroundStyle() == wxBG_STYLE_CUSTOM, + wxT("In constructor, you need to call SetBackgroundStyle(wxBG_STYLE_CUSTOM), ") + wxT("and also, if needed, paint the background manually in the paint event handler.")); + } + + DECLARE_NO_COPY_CLASS(wxAutoBufferedPaintDC) +}; + +#else // !__WXDEBUG__ + +// In release builds, just use typedef +typedef wxAutoBufferedPaintDCBase wxAutoBufferedPaintDC; + +#endif + + +// Check if the window is natively double buffered and will return a wxPaintDC +// if it is, a wxBufferedPaintDC otherwise. It is the caller's responsibility +// to delete the wxDC pointer when finished with it. +inline wxDC* wxAutoBufferedPaintDCFactory(wxWindow* window) +{ + if ( window->IsDoubleBuffered() ) + return new wxPaintDC(window); + else + return new wxBufferedPaintDC(window); +} + +#endif // _WX_DCBUFFER_H_ diff --git a/Externals/wxWidgets/include/wx/dcclient.h b/Externals/wxWidgets/include/wx/dcclient.h new file mode 100644 index 0000000000..c770f6a2f7 --- /dev/null +++ b/Externals/wxWidgets/include/wx/dcclient.h @@ -0,0 +1,42 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/dcclient.h +// Purpose: wxClientDC base header +// Author: Julian Smart +// Modified by: +// Created: +// Copyright: (c) Julian Smart +// RCS-ID: $Id: dcclient.h 40865 2006-08-27 09:42:42Z VS $ +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DCCLIENT_H_BASE_ +#define _WX_DCCLIENT_H_BASE_ + +#include "wx/defs.h" + +#if defined(__WXPALMOS__) +#include "wx/palmos/dcclient.h" +#elif defined(__WXMSW__) +#include "wx/msw/dcclient.h" +#elif defined(__WXMOTIF__) +#include "wx/motif/dcclient.h" +#elif defined(__WXGTK20__) +#include "wx/gtk/dcclient.h" +#elif defined(__WXGTK__) +#include "wx/gtk1/dcclient.h" +#elif defined(__WXX11__) +#include "wx/x11/dcclient.h" +#elif defined(__WXMGL__) +#include "wx/mgl/dcclient.h" +#elif defined(__WXDFB__) +#include "wx/dfb/dcclient.h" +#elif defined(__WXMAC__) +#include "wx/mac/dcclient.h" +#elif defined(__WXCOCOA__) +#include "wx/cocoa/dcclient.h" +#elif defined(__WXPM__) +#include "wx/os2/dcclient.h" +#endif + +#endif + // _WX_DCCLIENT_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/dcgraph.h b/Externals/wxWidgets/include/wx/dcgraph.h new file mode 100644 index 0000000000..50ce9179c9 --- /dev/null +++ b/Externals/wxWidgets/include/wx/dcgraph.h @@ -0,0 +1,190 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/graphdc.h +// Purpose: graphics context device bridge header +// Author: Stefan Csomor +// Modified by: +// Created: +// Copyright: (c) Stefan Csomor +// RCS-ID: $Id: dcgraph.h 49295 2007-10-21 18:02:10Z SC $ +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GRAPHICS_DC_H_ +#define _WX_GRAPHICS_DC_H_ + +#if wxUSE_GRAPHICS_CONTEXT + +#include "wx/geometry.h" +#include "wx/dynarray.h" +#include "wx/graphics.h" + +class WXDLLEXPORT wxWindowDC; + +#ifdef __WXMAC__ +#define wxGCDC wxDC +#endif + +class WXDLLEXPORT wxGCDC: +#ifdef __WXMAC__ + public wxDCBase +#else + public wxDC +#endif +{ + DECLARE_DYNAMIC_CLASS(wxGCDC) + DECLARE_NO_COPY_CLASS(wxGCDC) + +public: + wxGCDC(const wxWindowDC& dc); +#ifdef __WXMSW__ + wxGCDC( const wxMemoryDC& dc); +#endif + wxGCDC(); + virtual ~wxGCDC(); + + void Init(); + + + // implement base class pure virtuals + // ---------------------------------- + + virtual void Clear(); + + virtual bool StartDoc( const wxString& message ); + virtual void EndDoc(); + + virtual void StartPage(); + virtual void EndPage(); + + // to be virtualized on next major + // flushing the content of this dc immediately onto screen + void Flush(); + + virtual void SetFont(const wxFont& font); + virtual void SetPen(const wxPen& pen); + virtual void SetBrush(const wxBrush& brush); + virtual void SetBackground(const wxBrush& brush); + virtual void SetBackgroundMode(int mode); + virtual void SetPalette(const wxPalette& palette); + + virtual void DestroyClippingRegion(); + + virtual wxCoord GetCharHeight() const; + virtual wxCoord GetCharWidth() const; + + virtual bool CanDrawBitmap() const; + virtual bool CanGetTextExtent() const; + virtual int GetDepth() const; + virtual wxSize GetPPI() const; + + virtual void SetMapMode(int mode); + virtual void SetUserScale(double x, double y); + + virtual void SetLogicalScale(double x, double y); + virtual void SetLogicalOrigin(wxCoord x, wxCoord y); + virtual void SetDeviceOrigin(wxCoord x, wxCoord y); + virtual void SetAxisOrientation(bool xLeftRight, bool yBottomUp); + virtual void SetLogicalFunction(int function); + + virtual void SetTextForeground(const wxColour& colour); + virtual void SetTextBackground(const wxColour& colour); + + virtual void ComputeScaleAndOrigin(); + + wxGraphicsContext* GetGraphicsContext() { return m_graphicContext; } + virtual void SetGraphicsContext( wxGraphicsContext* ctx ); + +protected: + // the true implementations + virtual bool DoFloodFill(wxCoord x, wxCoord y, const wxColour& col, + int style = wxFLOOD_SURFACE); + + virtual void DoGradientFillLinear(const wxRect& rect, + const wxColour& initialColour, + const wxColour& destColour, + wxDirection nDirection = wxEAST); + + virtual void DoGradientFillConcentric(const wxRect& rect, + const wxColour& initialColour, + const wxColour& destColour, + const wxPoint& circleCenter); + + virtual bool DoGetPixel(wxCoord x, wxCoord y, wxColour *col) const; + + virtual void DoDrawPoint(wxCoord x, wxCoord y); + +#if wxUSE_SPLINES + virtual void DoDrawSpline(wxList *points); +#endif + + virtual void DoDrawLine(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2); + + virtual void DoDrawArc(wxCoord x1, wxCoord y1, + wxCoord x2, wxCoord y2, + wxCoord xc, wxCoord yc); + + virtual void DoDrawCheckMark(wxCoord x, wxCoord y, + wxCoord width, wxCoord height); + + virtual void DoDrawEllipticArc(wxCoord x, wxCoord y, wxCoord w, wxCoord h, + double sa, double ea); + + virtual void DoDrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height); + virtual void DoDrawRoundedRectangle(wxCoord x, wxCoord y, + wxCoord width, wxCoord height, + double radius); + virtual void DoDrawEllipse(wxCoord x, wxCoord y, wxCoord width, wxCoord height); + + virtual void DoCrossHair(wxCoord x, wxCoord y); + + virtual void DoDrawIcon(const wxIcon& icon, wxCoord x, wxCoord y); + virtual void DoDrawBitmap(const wxBitmap &bmp, wxCoord x, wxCoord y, + bool useMask = false); + + virtual void DoDrawText(const wxString& text, wxCoord x, wxCoord y); + virtual void DoDrawRotatedText(const wxString& text, wxCoord x, wxCoord y, + double angle); + + virtual bool DoBlit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height, + wxDC *source, wxCoord xsrc, wxCoord ysrc, + int rop = wxCOPY, bool useMask = false, wxCoord xsrcMask = -1, wxCoord ysrcMask = -1); + + virtual void DoGetSize(int *,int *) const; + virtual void DoGetSizeMM(int* width, int* height) const; + + virtual void DoDrawLines(int n, wxPoint points[], + wxCoord xoffset, wxCoord yoffset); + virtual void DoDrawPolygon(int n, wxPoint points[], + wxCoord xoffset, wxCoord yoffset, + int fillStyle = wxODDEVEN_RULE); + virtual void DoDrawPolyPolygon(int n, int count[], wxPoint points[], + wxCoord xoffset, wxCoord yoffset, + int fillStyle); + + virtual void DoSetClippingRegionAsRegion(const wxRegion& region); + virtual void DoSetClippingRegion(wxCoord x, wxCoord y, + wxCoord width, wxCoord height); + + virtual void DoGetTextExtent(const wxString& string, + wxCoord *x, wxCoord *y, + wxCoord *descent = NULL, + wxCoord *externalLeading = NULL, + wxFont *theFont = NULL) const; + + virtual bool DoGetPartialTextExtents(const wxString& text, wxArrayInt& widths) const; + +protected: + // scaling variables + bool m_logicalFunctionSupported; + double m_mm_to_pix_x, m_mm_to_pix_y; + wxGraphicsMatrix m_matrixOriginal; + wxGraphicsMatrix m_matrixCurrent; + + double m_formerScaleX, m_formerScaleY; + + wxGraphicsContext* m_graphicContext; +}; + +#endif + +#endif // _WX_GRAPHICS_DC_H_ diff --git a/Externals/wxWidgets/include/wx/dcmemory.h b/Externals/wxWidgets/include/wx/dcmemory.h new file mode 100644 index 0000000000..cd7bb0c9d9 --- /dev/null +++ b/Externals/wxWidgets/include/wx/dcmemory.h @@ -0,0 +1,76 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/dcmemory.h +// Purpose: wxMemoryDC base header +// Author: Julian Smart +// Modified by: +// Created: +// Copyright: (c) Julian Smart +// RCS-ID: $Id: dcmemory.h 43843 2006-12-07 05:44:44Z PC $ +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DCMEMORY_H_BASE_ +#define _WX_DCMEMORY_H_BASE_ + +#include "wx/bitmap.h" + +// NOTE: different native implementations of wxMemoryDC will derive from +// different wxDC classes (wxPaintDC, wxWindowDC, etc), so that +// we cannot derive wxMemoryDCBase from wxDC and then use it as the +// only base class for native impl of wxMemoryDC... +class WXDLLEXPORT wxMemoryDCBase +{ +public: + wxMemoryDCBase() { } + + // avoid warnings about having virtual functions but non virtual dtor + virtual ~wxMemoryDCBase() { } + + // select the given bitmap to draw on it + void SelectObject(wxBitmap& bmp) + { + // make sure that the given wxBitmap is not sharing its data with other + // wxBitmap instances as its contents will be modified by any drawing + // operation done on this DC + if (bmp.IsOk()) + bmp.UnShare(); + + DoSelect(bmp); + } + + // select the given bitmap for read-only + virtual void SelectObjectAsSource(const wxBitmap& bmp) + { + DoSelect(bmp); + } + +protected: + virtual void DoSelect(const wxBitmap& bmp) = 0; +}; + +#if defined(__WXPALMOS__) +#include "wx/palmos/dcmemory.h" +#elif defined(__WXMSW__) +#include "wx/msw/dcmemory.h" +#elif defined(__WXMOTIF__) +#include "wx/motif/dcmemory.h" +#elif defined(__WXGTK20__) +#include "wx/gtk/dcmemory.h" +#elif defined(__WXGTK__) +#include "wx/gtk1/dcmemory.h" +#elif defined(__WXX11__) +#include "wx/x11/dcmemory.h" +#elif defined(__WXMGL__) +#include "wx/mgl/dcmemory.h" +#elif defined(__WXDFB__) +#include "wx/dfb/dcmemory.h" +#elif defined(__WXMAC__) +#include "wx/mac/dcmemory.h" +#elif defined(__WXCOCOA__) +#include "wx/cocoa/dcmemory.h" +#elif defined(__WXPM__) +#include "wx/os2/dcmemory.h" +#endif + +#endif + // _WX_DCMEMORY_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/dcmirror.h b/Externals/wxWidgets/include/wx/dcmirror.h new file mode 100644 index 0000000000..0faad6680f --- /dev/null +++ b/Externals/wxWidgets/include/wx/dcmirror.h @@ -0,0 +1,287 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/dcmirror.h +// Purpose: wxMirrorDC class +// Author: Vadim Zeitlin +// Modified by: +// Created: 21.07.2003 +// RCS-ID: $Id: dcmirror.h 41751 2006-10-08 21:56:55Z VZ $ +// Copyright: (c) 2003 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DCMIRROR_H_ +#define _WX_DCMIRROR_H_ + +#include "wx/dc.h" + +// ---------------------------------------------------------------------------- +// wxMirrorDC allows to write the same code for horz/vertical layout +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxMirrorDC : public wxDC +{ +public: + // constructs a mirror DC associated with the given real DC + // + // if mirror parameter is true, all vertical and horizontal coordinates are + // exchanged, otherwise this class behaves in exactly the same way as a + // plain DC + // + // the cast to wxMirrorDC is a dirty hack done to allow us to call the + // protected methods of wxDCBase directly in our code below, without it it + // would be impossible (this is correct from C++ point of view but doesn't + // make any sense in this particular situation) + wxMirrorDC(wxDC& dc, bool mirror) : m_dc((wxMirrorDC&)dc) + { m_mirror = mirror; } + + // wxDCBase operations + virtual void Clear() { m_dc.Clear(); } + virtual void SetFont(const wxFont& font) { m_dc.SetFont(font); } + virtual void SetPen(const wxPen& pen) { m_dc.SetPen(pen); } + virtual void SetBrush(const wxBrush& brush) { m_dc.SetBrush(brush); } + virtual void SetBackground(const wxBrush& brush) + { m_dc.SetBackground(brush); } + virtual void SetBackgroundMode(int mode) { m_dc.SetBackgroundMode(mode); } +#if wxUSE_PALETTE + virtual void SetPalette(const wxPalette& palette) + { m_dc.SetPalette(palette); } +#endif // wxUSE_PALETTE + virtual void DestroyClippingRegion() { m_dc.DestroyClippingRegion(); } + virtual wxCoord GetCharHeight() const { return m_dc.GetCharHeight(); } + virtual wxCoord GetCharWidth() const { return m_dc.GetCharWidth(); } + virtual bool CanDrawBitmap() const { return m_dc.CanDrawBitmap(); } + virtual bool CanGetTextExtent() const { return m_dc.CanGetTextExtent(); } + virtual int GetDepth() const { return m_dc.GetDepth(); } + virtual wxSize GetPPI() const { return m_dc.GetPPI(); } + virtual bool Ok() const { return IsOk(); } + virtual bool IsOk() const { return m_dc.Ok(); } + virtual void SetMapMode(int mode) { m_dc.SetMapMode(mode); } + virtual void SetUserScale(double x, double y) + { m_dc.SetUserScale(GetX(x, y), GetY(x, y)); } + virtual void SetLogicalOrigin(wxCoord x, wxCoord y) + { m_dc.SetLogicalOrigin(GetX(x, y), GetY(x, y)); } + virtual void SetDeviceOrigin(wxCoord x, wxCoord y) + { m_dc.SetDeviceOrigin(GetX(x, y), GetY(x, y)); } + virtual void SetAxisOrientation(bool xLeftRight, bool yBottomUp) + { m_dc.SetAxisOrientation(GetX(xLeftRight, yBottomUp), + GetY(xLeftRight, yBottomUp)); } + virtual void SetLogicalFunction(int function) + { m_dc.SetLogicalFunction(function); } + + // helper functions which may be useful for the users of this class + wxSize Reflect(const wxSize& sizeOrig) + { + return m_mirror ? wxSize(sizeOrig.y, sizeOrig.x) : sizeOrig; + } + +protected: + // returns x and y if not mirroring or y and x if mirroring + wxCoord GetX(wxCoord x, wxCoord y) const { return m_mirror ? y : x; } + wxCoord GetY(wxCoord x, wxCoord y) const { return m_mirror ? x : y; } + double GetX(double x, double y) const { return m_mirror ? y : x; } + double GetY(double x, double y) const { return m_mirror ? x : y; } + bool GetX(bool x, bool y) const { return m_mirror ? y : x; } + bool GetY(bool x, bool y) const { return m_mirror ? x : y; } + + // same thing but for pointers + wxCoord *GetX(wxCoord *x, wxCoord *y) const { return m_mirror ? y : x; } + wxCoord *GetY(wxCoord *x, wxCoord *y) const { return m_mirror ? x : y; } + + // exchange x and y unconditionally + static void Swap(wxCoord& x, wxCoord& y) + { + wxCoord t = x; + x = y; + y = t; + } + + // exchange x and y components of all points in the array if necessary + void Mirror(int n, wxPoint points[]) const + { + if ( m_mirror ) + { + for ( int i = 0; i < n; i++ ) + { + Swap(points[i].x, points[i].y); + } + } + } + + + // wxDCBase functions + virtual bool DoFloodFill(wxCoord x, wxCoord y, const wxColour& col, + int style = wxFLOOD_SURFACE) + { + return m_dc.DoFloodFill(GetX(x, y), GetY(x, y), col, style); + } + + virtual bool DoGetPixel(wxCoord x, wxCoord y, wxColour *col) const + { + return m_dc.DoGetPixel(GetX(x, y), GetY(x, y), col); + } + + + virtual void DoDrawPoint(wxCoord x, wxCoord y) + { + m_dc.DoDrawPoint(GetX(x, y), GetY(x, y)); + } + + virtual void DoDrawLine(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2) + { + m_dc.DoDrawLine(GetX(x1, y1), GetY(x1, y1), GetX(x2, y2), GetY(x2, y2)); + } + + virtual void DoDrawArc(wxCoord x1, wxCoord y1, + wxCoord x2, wxCoord y2, + wxCoord xc, wxCoord yc) + { + wxFAIL_MSG( _T("this is probably wrong") ); + + m_dc.DoDrawArc(GetX(x1, y1), GetY(x1, y1), + GetX(x2, y2), GetY(x2, y2), + xc, yc); + } + + virtual void DoDrawCheckMark(wxCoord x, wxCoord y, + wxCoord w, wxCoord h) + { + m_dc.DoDrawCheckMark(GetX(x, y), GetY(x, y), + GetX(w, h), GetY(w, h)); + } + + virtual void DoDrawEllipticArc(wxCoord x, wxCoord y, wxCoord w, wxCoord h, + double sa, double ea) + { + wxFAIL_MSG( _T("this is probably wrong") ); + + m_dc.DoDrawEllipticArc(GetX(x, y), GetY(x, y), + GetX(w, h), GetY(w, h), + sa, ea); + } + + virtual void DoDrawRectangle(wxCoord x, wxCoord y, wxCoord w, wxCoord h) + { + m_dc.DoDrawRectangle(GetX(x, y), GetY(x, y), GetX(w, h), GetY(w, h)); + } + + virtual void DoDrawRoundedRectangle(wxCoord x, wxCoord y, + wxCoord w, wxCoord h, + double radius) + { + m_dc.DoDrawRoundedRectangle(GetX(x, y), GetY(x, y), + GetX(w, h), GetY(w, h), + radius); + } + + virtual void DoDrawEllipse(wxCoord x, wxCoord y, wxCoord w, wxCoord h) + { + m_dc.DoDrawEllipse(GetX(x, y), GetY(x, y), GetX(w, h), GetY(w, h)); + } + + virtual void DoCrossHair(wxCoord x, wxCoord y) + { + m_dc.DoCrossHair(GetX(x, y), GetY(x, y)); + } + + virtual void DoDrawIcon(const wxIcon& icon, wxCoord x, wxCoord y) + { + m_dc.DoDrawIcon(icon, GetX(x, y), GetY(x, y)); + } + + virtual void DoDrawBitmap(const wxBitmap &bmp, wxCoord x, wxCoord y, + bool useMask = false) + { + m_dc.DoDrawBitmap(bmp, GetX(x, y), GetY(x, y), useMask); + } + + virtual void DoDrawText(const wxString& text, wxCoord x, wxCoord y) + { + // this is never mirrored + m_dc.DoDrawText(text, x, y); + } + + virtual void DoDrawRotatedText(const wxString& text, + wxCoord x, wxCoord y, double angle) + { + // this is never mirrored + m_dc.DoDrawRotatedText(text, x, y, angle); + } + + virtual bool DoBlit(wxCoord xdest, wxCoord ydest, + wxCoord w, wxCoord h, + wxDC *source, wxCoord xsrc, wxCoord ysrc, + int rop = wxCOPY, bool useMask = false, + wxCoord xsrcMask = wxDefaultCoord, wxCoord ysrcMask = wxDefaultCoord) + { + return m_dc.DoBlit(GetX(xdest, ydest), GetY(xdest, ydest), + GetX(w, h), GetY(w, h), + source, GetX(xsrc, ysrc), GetY(xsrc, ysrc), + rop, useMask, + GetX(xsrcMask, ysrcMask), GetX(xsrcMask, ysrcMask)); + } + + virtual void DoGetSize(int *w, int *h) const + { + m_dc.DoGetSize(GetX(w, h), GetY(w, h)); + } + + virtual void DoGetSizeMM(int *w, int *h) const + { + m_dc.DoGetSizeMM(GetX(w, h), GetY(w, h)); + } + + virtual void DoDrawLines(int n, wxPoint points[], + wxCoord xoffset, wxCoord yoffset) + { + Mirror(n, points); + + m_dc.DoDrawLines(n, points, + GetX(xoffset, yoffset), GetY(xoffset, yoffset)); + + Mirror(n, points); + } + + virtual void DoDrawPolygon(int n, wxPoint points[], + wxCoord xoffset, wxCoord yoffset, + int fillStyle = wxODDEVEN_RULE) + { + Mirror(n, points); + + m_dc.DoDrawPolygon(n, points, + GetX(xoffset, yoffset), GetY(xoffset, yoffset), + fillStyle); + + Mirror(n, points); + } + + virtual void DoSetClippingRegionAsRegion(const wxRegion& WXUNUSED(region)) + { + wxFAIL_MSG( _T("not implemented") ); + } + + virtual void DoSetClippingRegion(wxCoord x, wxCoord y, + wxCoord w, wxCoord h) + { + m_dc.DoSetClippingRegion(GetX(x, y), GetY(x, y), GetX(w, h), GetY(w, h)); + } + + virtual void DoGetTextExtent(const wxString& string, + wxCoord *x, wxCoord *y, + wxCoord *descent = NULL, + wxCoord *externalLeading = NULL, + wxFont *theFont = NULL) const + { + // never mirrored + m_dc.DoGetTextExtent(string, x, y, descent, externalLeading, theFont); + } + +private: + wxMirrorDC& m_dc; + + bool m_mirror; + + DECLARE_NO_COPY_CLASS(wxMirrorDC) +}; + +#endif // _WX_DCMIRROR_H_ + diff --git a/Externals/wxWidgets/include/wx/dcprint.h b/Externals/wxWidgets/include/wx/dcprint.h new file mode 100644 index 0000000000..b22394b089 --- /dev/null +++ b/Externals/wxWidgets/include/wx/dcprint.h @@ -0,0 +1,33 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/dcprint.h +// Purpose: wxPrinterDC base header +// Author: Julian Smart +// Modified by: +// Created: +// Copyright: (c) Julian Smart +// RCS-ID: $Id: dcprint.h 41240 2006-09-15 16:45:48Z PC $ +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DCPRINT_H_BASE_ +#define _WX_DCPRINT_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_PRINTING_ARCHITECTURE + +#if defined(__WXPALMOS__) +#include "wx/palmos/dcprint.h" +#elif defined(__WXMSW__) +#include "wx/msw/dcprint.h" +#endif +#if defined(__WXPM__) +#include "wx/os2/dcprint.h" +#endif +#if defined(__WXMAC__) +#include "wx/mac/dcprint.h" +#endif + +#endif // wxUSE_PRINTING_ARCHITECTURE +#endif + // _WX_DCPRINT_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/dcps.h b/Externals/wxWidgets/include/wx/dcps.h new file mode 100644 index 0000000000..0adffb7e49 --- /dev/null +++ b/Externals/wxWidgets/include/wx/dcps.h @@ -0,0 +1,18 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/dcps.h +// Purpose: wxPostScriptDC base header +// Author: Julian Smart +// Modified by: +// Created: +// Copyright: (c) Julian Smart +// RCS-ID: $Id: dcps.h 33948 2005-05-04 18:57:50Z JS $ +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DCPS_H_BASE_ +#define _WX_DCPS_H_BASE_ + +#include "wx/generic/dcpsg.h" + +#endif + diff --git a/Externals/wxWidgets/include/wx/dcscreen.h b/Externals/wxWidgets/include/wx/dcscreen.h new file mode 100644 index 0000000000..8b52dd9594 --- /dev/null +++ b/Externals/wxWidgets/include/wx/dcscreen.h @@ -0,0 +1,42 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/dcscreen.h +// Purpose: wxScreenDC base header +// Author: Julian Smart +// Modified by: +// Created: +// Copyright: (c) Julian Smart +// RCS-ID: $Id: dcscreen.h 40865 2006-08-27 09:42:42Z VS $ +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DCSCREEN_H_BASE_ +#define _WX_DCSCREEN_H_BASE_ + +#include "wx/defs.h" + +#if defined(__WXPALMOS__) +#include "wx/palmos/dcscreen.h" +#elif defined(__WXMSW__) +#include "wx/msw/dcscreen.h" +#elif defined(__WXMOTIF__) +#include "wx/motif/dcscreen.h" +#elif defined(__WXGTK20__) +#include "wx/gtk/dcscreen.h" +#elif defined(__WXGTK__) +#include "wx/gtk1/dcscreen.h" +#elif defined(__WXX11__) +#include "wx/x11/dcscreen.h" +#elif defined(__WXMGL__) +#include "wx/mgl/dcscreen.h" +#elif defined(__WXDFB__) +#include "wx/dfb/dcscreen.h" +#elif defined(__WXMAC__) +#include "wx/mac/dcscreen.h" +#elif defined(__WXCOCOA__) +#include "wx/cocoa/dcscreen.h" +#elif defined(__WXPM__) +#include "wx/os2/dcscreen.h" +#endif + +#endif + // _WX_DCSCREEN_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/dde.h b/Externals/wxWidgets/include/wx/dde.h new file mode 100644 index 0000000000..59eefc70d1 --- /dev/null +++ b/Externals/wxWidgets/include/wx/dde.h @@ -0,0 +1,32 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/dde.h +// Purpose: DDE base header +// Author: Julian Smart +// Modified by: +// Created: +// Copyright: (c) Julian Smart +// RCS-ID: $Id: dde.h 33948 2005-05-04 18:57:50Z JS $ +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DDE_H_BASE_ +#define _WX_DDE_H_BASE_ + +#include "wx/list.h" + +class WXDLLIMPEXP_BASE wxDDEClient; +class WXDLLIMPEXP_BASE wxDDEServer; +class WXDLLIMPEXP_BASE wxDDEConnection; + +WX_DECLARE_USER_EXPORTED_LIST(wxDDEClient, wxDDEClientList, WXDLLIMPEXP_BASE); +WX_DECLARE_USER_EXPORTED_LIST(wxDDEServer, wxDDEServerList, WXDLLIMPEXP_BASE); +WX_DECLARE_USER_EXPORTED_LIST(wxDDEConnection, wxDDEConnectionList, WXDLLIMPEXP_BASE); + +#if defined(__WXMSW__) + #include "wx/msw/dde.h" +#else + #error DDE is only supported on MSW +#endif + +#endif + // _WX_DDE_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/debug.h b/Externals/wxWidgets/include/wx/debug.h new file mode 100644 index 0000000000..1887a2818a --- /dev/null +++ b/Externals/wxWidgets/include/wx/debug.h @@ -0,0 +1,305 @@ +/** +* Name: wx/debug.h +* Purpose: Misc debug functions and macros +* Author: Vadim Zeitlin +* Modified by: Ryan Norton (Converted to C) +* Created: 29/01/98 +* RCS-ID: $Id: debug.h 39943 2006-07-02 21:40:38Z SN $ +* Copyright: (c) 1998 Vadim Zeitlin +* Licence: wxWindows licence +*/ + +/* THIS IS A C FILE, DON'T USE C++ FEATURES (IN PARTICULAR COMMENTS) IN IT */ + +#ifndef _WX_DEBUG_H_ +#define _WX_DEBUG_H_ + +#ifndef __WXWINCE__ +#include +#endif +#include /* for CHAR_BIT used below */ + +#include "wx/wxchar.h" /* for __TFILE__ and wxChar */ + +/* ---------------------------------------------------------------------------- */ +/* Defines controlling the debugging macros */ +/* ---------------------------------------------------------------------------- */ + +/* if _DEBUG is defined (MS VC++ and others use it in debug builds), define */ +/* __WXDEBUG__ too */ +#ifdef _DEBUG + #ifndef __WXDEBUG__ + #define __WXDEBUG__ + #endif /* !__WXDEBUG__ */ +#endif /* _DEBUG */ + +/* if NDEBUG is defined ( uses it), undef __WXDEBUG__ and WXDEBUG */ +#ifdef NDEBUG + #undef __WXDEBUG__ + #undef WXDEBUG +#endif /* NDEBUG */ + +/* if __WXDEBUG__ is defined, make sure that WXDEBUG is defined and >= 1 */ +#ifdef __WXDEBUG__ + #if !defined(WXDEBUG) || !WXDEBUG + #undef WXDEBUG + #define WXDEBUG 1 + #endif /* !WXDEBUG */ +#endif /* __WXDEBUG__ */ + +#ifndef __WXFUNCTION__ + /* TODO: add more compilers supporting __FUNCTION__ */ + #if defined(__DMC__) + /* + __FUNCTION__ happens to be not defined within class members + http://www.digitalmars.com/drn-bin/wwwnews?c%2B%2B.beta/485 + */ + #define __WXFUNCTION__ (NULL) + #elif defined(__GNUC__) || \ + (defined(_MSC_VER) && _MSC_VER >= 1300) || \ + defined(__FUNCTION__) + #define __WXFUNCTION__ __FUNCTION__ + #else + /* still define __WXFUNCTION__ to avoid #ifdefs elsewhere */ + #define __WXFUNCTION__ (NULL) + #endif +#endif /* __WXFUNCTION__ already defined */ + +/* ---------------------------------------------------------------------------- */ +/* Debugging macros */ +/* */ +/* All debugging macros rely on ASSERT() which in turn calls the user-defined */ +/* OnAssert() function. To keep things simple, it's called even when the */ +/* expression is true (i.e. everything is ok) and by default does nothing: just */ +/* returns the same value back. But if you redefine it to do something more sexy */ +/* (popping up a message box in your favourite GUI, sending you e-mail or */ +/* whatever) it will affect all ASSERTs, FAILs and CHECKs in your code. */ +/* */ +/* Warning: if you don't like advice on programming style, don't read */ +/* further! ;-) */ +/* */ +/* Extensive use of these macros is recommended! Remember that ASSERTs are */ +/* disabled in final build (without __WXDEBUG__ defined), so they add strictly */ +/* nothing to your program's code. On the other hand, CHECK macros do stay */ +/* even in release builds, but in general are not much of a burden, while */ +/* a judicious use of them might increase your program's stability. */ +/* ---------------------------------------------------------------------------- */ + +/* Macros which are completely disabled in 'release' mode */ +/* */ +/* NB: these functions are implemented in src/common/appcmn.cpp */ +#if defined(__cplusplus) && defined(__WXDEBUG__) + /* + This function is called whenever one of debugging macros fails (i.e. + condition is false in an assertion). To customize its behaviour, override + wxApp::OnAssert(). + + Parameters: + szFile and nLine - file name and line number of the ASSERT + szFunc - function name of the ASSERT, may be NULL (NB: ASCII) + szCond - text form of the condition which failed + szMsg - optional message explaining the reason + */ + extern void WXDLLIMPEXP_BASE wxOnAssert(const wxChar *szFile, + int nLine, + const char *szFunc, + const wxChar *szCond, + const wxChar *szMsg = NULL); + + /* call this function to break into the debugger unconditionally (assuming */ + /* the program is running under debugger, of course) */ + extern void WXDLLIMPEXP_BASE wxTrap(); + + /* generic assert macro */ + #define wxASSERT(cond) wxASSERT_MSG(cond, NULL) + + + /* assert with additional message explaining its cause */ + + /* compilers can give a warning (such as "possible unwanted ;") when using */ + /* the default definition of wxASSERT_MSG so we provide an alternative */ + #if defined(__MWERKS__) + #define wxASSERT_MSG(cond, msg) \ + if ( cond ) \ + {} \ + else \ + wxOnAssert(__TFILE__, __LINE__, __WXFUNCTION__, _T(#cond), msg) + #else + #define wxASSERT_MSG(cond, msg) \ + if ( cond ) \ + ; \ + else \ + wxOnAssert(__TFILE__, __LINE__, __WXFUNCTION__, _T(#cond), msg) + #endif + + /* special form of assert: always triggers it (in debug mode) */ + #define wxFAIL wxFAIL_MSG(NULL) + + /* FAIL with some message */ + #define wxFAIL_MSG(msg) wxFAIL_COND_MSG("wxAssertFailure", msg) + + /* FAIL with some message and a condition */ + #define wxFAIL_COND_MSG(cond, msg) \ + wxOnAssert(__TFILE__, __LINE__, __WXFUNCTION__, _T(cond), msg) + + /* An assert helper used to avoid warning when testing constant expressions, */ + /* i.e. wxASSERT( sizeof(int) == 4 ) can generate a compiler warning about */ + /* expression being always true, but not using */ + /* wxASSERT( wxAssertIsEqual(sizeof(int), 4) ) */ + /* */ + /* NB: this is made obsolete by wxCOMPILE_TIME_ASSERT() and should no */ + /* longer be used. */ + extern bool WXDLLIMPEXP_BASE wxAssertIsEqual(int x, int y); +#else + #define wxTrap() + + /* nothing to do in release mode (hopefully at this moment there are */ + /* no more bugs ;-) */ + #define wxASSERT(cond) + #define wxASSERT_MSG(cond, msg) + #define wxFAIL + #define wxFAIL_MSG(msg) + #define wxFAIL_COND_MSG(cond, msg) +#endif /* __WXDEBUG__ */ + +#ifdef __cplusplus + /* Use of wxFalse instead of false suppresses compiler warnings about testing */ + /* constant expression */ + extern WXDLLIMPEXP_DATA_BASE(const bool) wxFalse; +#endif + +#define wxAssertFailure wxFalse + +/* NB: the following macros also work in release mode! */ + +/* + These macros must be used only in invalid situation: for example, an + invalid parameter (e.g. a NULL pointer) is passed to a function. Instead of + dereferencing it and causing core dump the function might try using + CHECK( p != NULL ) or CHECK( p != NULL, return LogError("p is NULL!!") ) +*/ + +/* check that expression is true, "return" if not (also FAILs in debug mode) */ +#define wxCHECK(cond, rc) wxCHECK_MSG(cond, rc, NULL) + +/* as wxCHECK but with a message explaining why we fail */ +#define wxCHECK_MSG(cond, rc, msg) wxCHECK2_MSG(cond, return rc, msg) + +/* check that expression is true, perform op if not */ +#define wxCHECK2(cond, op) wxCHECK2_MSG(cond, op, NULL) + +/* as wxCHECK2 but with a message explaining why we fail */ + +/* see comment near the definition of wxASSERT_MSG for the # if/else reason */ +#if defined(__MWERKS__) + #define wxCHECK2_MSG(cond, op, msg) \ + if ( cond ) \ + {} \ + else \ + { \ + wxFAIL_COND_MSG(#cond, msg); \ + op; \ + } \ + struct wxDummyCheckStruct /* just to force a semicolon */ +#else + #define wxCHECK2_MSG(cond, op, msg) \ + if ( cond ) \ + ; \ + else \ + { \ + wxFAIL_COND_MSG(#cond, msg); \ + op; \ + } \ + struct wxDummyCheckStruct /* just to force a semicolon */ +#endif + +/* special form of wxCHECK2: as wxCHECK, but for use in void functions */ +/* */ +/* NB: there is only one form (with msg parameter) and it's intentional: */ +/* there is no other way to tell the caller what exactly went wrong */ +/* from the void function (of course, the function shouldn't be void */ +/* to begin with...) */ +#define wxCHECK_RET(cond, msg) wxCHECK2_MSG(cond, return, msg) + +/* ---------------------------------------------------------------------------- */ +/* Compile time asserts */ +/* */ +/* Unlike the normal assert and related macros above which are checked during */ +/* the program tun-time the macros below will result in a compilation error if */ +/* the condition they check is false. This is usually used to check the */ +/* expressions containing sizeof()s which cannot be tested with the */ +/* preprocessor. If you can use the #if's, do use them as you can give a more */ +/* detailed error message then. */ +/* ---------------------------------------------------------------------------- */ + +/* + How this works (you don't have to understand it to be able to use the + macros): we rely on the fact that it is invalid to define a named bit field + in a struct of width 0. All the rest are just the hacks to minimize the + possibility of the compiler warnings when compiling this macro: in + particular, this is why we define a struct and not an object (which would + result in a warning about unused variable) and a named struct (otherwise we'd + get a warning about an unnamed struct not used to define an object!). + */ + +#define wxMAKE_UNIQUE_ASSERT_NAME wxMAKE_UNIQUE_NAME(wxAssert_) + +/* + The second argument of this macro must be a valid C++ identifier and not a + string. I.e. you should use it like this: + + wxCOMPILE_TIME_ASSERT( sizeof(int) >= 2, YourIntsAreTooSmall ); + + It may be used both within a function and in the global scope. +*/ +#if defined(__WATCOMC__) && defined(__cplusplus) + /* avoid "unused symbol" warning */ + #define wxCOMPILE_TIME_ASSERT(expr, msg) \ + class wxMAKE_UNIQUE_ASSERT_NAME { \ + unsigned int msg: expr; \ + wxMAKE_UNIQUE_ASSERT_NAME() { wxUnusedVar(msg); } \ + } +#else + #define wxCOMPILE_TIME_ASSERT(expr, msg) \ + struct wxMAKE_UNIQUE_ASSERT_NAME { unsigned int msg: expr; } +#endif + +/* + When using VC++ 6 with "Edit and Continue" on, the compiler completely + mishandles __LINE__ and so wxCOMPILE_TIME_ASSERT() doesn't work, provide a + way to make "unique" assert names by specifying a unique prefix explicitly + */ +#define wxMAKE_UNIQUE_ASSERT_NAME2(text) wxCONCAT(wxAssert_, text) + +#define wxCOMPILE_TIME_ASSERT2(expr, msg, text) \ + struct wxMAKE_UNIQUE_ASSERT_NAME2(text) { unsigned int msg: expr; } + +/* helpers for wxCOMPILE_TIME_ASSERT below, for private use only */ +#define wxMAKE_BITSIZE_MSG(type, size) type ## SmallerThan ## size ## Bits + +/* a special case of compile time assert: check that the size of the given type */ +/* is at least the given number of bits */ +#define wxASSERT_MIN_BITSIZE(type, size) \ + wxCOMPILE_TIME_ASSERT(sizeof(type) * CHAR_BIT >= size, \ + wxMAKE_BITSIZE_MSG(type, size)) + +/* ---------------------------------------------------------------------------- */ +/* other miscellaneous debugger-related functions */ +/* ---------------------------------------------------------------------------- */ + +/* + Return true if we're running under debugger. + + Currently this only really works under Win32 and Mac in CodeWarrior builds, + it always returns false in other cases. + */ +#ifdef __cplusplus + /* ABX: check __WIN32__ instead of __WXMSW__ for the same MSWBase in any Win32 port */ + #if defined(__WXMAC__) || defined(__WIN32__) + extern bool WXDLLIMPEXP_BASE wxIsDebuggerRunning(); + #else /* !Mac */ + inline bool wxIsDebuggerRunning() { return false; } + #endif /* Mac/!Mac */ +#endif /* __cplusplus */ + +#endif /* _WX_DEBUG_H_ */ diff --git a/Externals/wxWidgets/include/wx/debugrpt.h b/Externals/wxWidgets/include/wx/debugrpt.h new file mode 100644 index 0000000000..faa4b068a4 --- /dev/null +++ b/Externals/wxWidgets/include/wx/debugrpt.h @@ -0,0 +1,235 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/debugrpt.h +// Purpose: declaration of wxDebugReport class +// Author: Vadim Zeitlin +// Created: 2005-01-17 +// RCS-ID: $Id: debugrpt.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) 2005 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DEBUGRPT_H_ +#define _WX_DEBUGRPT_H_ + +#include "wx/defs.h" + +#if wxUSE_DEBUGREPORT && wxUSE_XML + +#include "wx/string.h" +#include "wx/arrstr.h" + +class WXDLLIMPEXP_FWD_XML wxXmlNode; + +// ---------------------------------------------------------------------------- +// wxDebugReport: generate a debug report, processing is done in derived class +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_QA wxDebugReport +{ +public: + // this is used for the functions which may report either the current state + // or the state during the last (fatal) exception + enum Context { Context_Current, Context_Exception }; + + + // ctor creates a temporary directory where we create the files which will + // be included in the report, use IsOk() to check for errors + wxDebugReport(); + + // dtor normally destroys the temporary directory created in the ctor (with + // all the files it contains), call Reset() to prevent this from happening + virtual ~wxDebugReport(); + + // return the name of the directory used for this report + const wxString& GetDirectory() const { return m_dir; } + + // return true if the object was successfully initialized + bool IsOk() const { return !GetDirectory().empty(); } + + // reset the directory name we use, the object can't be used any more after + // this as it becomes invalid/uninitialized + void Reset() { m_dir.clear(); } + + + // add another file to the report: the file must already exist, its name + // can be either absolute in which case it is copied to the debug report + // directory or relative to GetDirectory() + // + // description is shown to the user in the report summary + virtual void AddFile(const wxString& filename, const wxString& description); + + // convenience function: write the given text to a file with the given name + // and then add it to the report (the difference with AddFile() is that the + // file will be created by this function and doesn't have to already exist) + bool AddText(const wxString& filename, + const wxString& text, + const wxString& description); + +#if wxUSE_STACKWALKER + // add an XML file containing the current or exception context and the + // stack trace + bool AddCurrentContext() { return AddContext(Context_Current); } + bool AddExceptionContext() { return AddContext(Context_Exception); } + virtual bool AddContext(Context ctx); +#endif + +#if wxUSE_CRASHREPORT + // add a file with crash report + bool AddCurrentDump() { return AddDump(Context_Current); } + bool AddExceptionDump() { return AddDump(Context_Exception); } + virtual bool AddDump(Context ctx); +#endif // wxUSE_CRASHREPORT + + // add all available information to the report + void AddAll(Context context = Context_Exception); + + + // process this report: the base class simply notifies the user that the + // report has been generated, this is usually not enough -- instead you + // should override this method to do something more useful to you + bool Process(); + + // get the name used as base name for various files, by default + // wxApp::GetName() + virtual wxString GetReportName() const; + + // get the files in this report + size_t GetFilesCount() const { return m_files.GetCount(); } + bool GetFile(size_t n, wxString *name, wxString *desc) const; + + // remove the file from report: this is used by wxDebugReportPreview to + // allow the user to remove files potentially containing private + // information from the report + void RemoveFile(const wxString& name); + +protected: +#if wxUSE_STACKWALKER + // used by AddContext() + virtual bool DoAddSystemInfo(wxXmlNode *nodeSystemInfo); + virtual bool DoAddLoadedModules(wxXmlNode *nodeModules); + virtual bool DoAddExceptionInfo(wxXmlNode *nodeContext); + virtual void DoAddCustomContext(wxXmlNode * WXUNUSED(nodeRoot)) { } +#endif + + // used by Process() + virtual bool DoProcess(); + +private: + // name of the report directory + wxString m_dir; + + // the arrays of files in this report and their descriptions + wxArrayString m_files, + m_descriptions; +}; + +#if wxUSE_ZIPSTREAM + +// ---------------------------------------------------------------------------- +// wxDebugReportCompress: compress all files of this debug report in a .ZIP +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_QA wxDebugReportCompress : public wxDebugReport +{ +public: + wxDebugReportCompress() { } + + // returns the full path of the compressed file (empty if creation failed) + const wxString& GetCompressedFileName() const { return m_zipfile; } + +protected: + virtual bool DoProcess(); + +private: + // full path to the ZIP file we created + wxString m_zipfile; +}; + +// ---------------------------------------------------------------------------- +// wxDebugReportUploader: uploads compressed file using HTTP POST request +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_QA wxDebugReportUpload : public wxDebugReportCompress +{ +public: + // this class will upload the compressed file created by its base class to + // an HTML multipart/form-data form at the specified address + // + // the URL is the base address, input is the name of the "type=file" + // control on the form used for the file name and action is the value of + // the form action field + wxDebugReportUpload(const wxString& url, + const wxString& input, + const wxString& action, + const wxString& curl = _T("curl")); + +protected: + virtual bool DoProcess(); + + // this function may be overridden in a derived class to show the output + // from curl: this may be an HTML page or anything else that the server + // returned + // + // return value becomes the return value of Process() + virtual bool OnServerReply(const wxArrayString& WXUNUSED(reply)) + { + return true; + } + +private: + // the full URL to use with HTTP POST request + wxString m_uploadURL; + + // the name of the input field containing the file name in the form at + // above URL + wxString m_inputField; + + // the curl command (by default it is just "curl" but could be full path to + // curl or a wrapper script with curl-compatible syntax) + wxString m_curlCmd; +}; + +#endif // wxUSE_ZIPSTREAM + + +// ---------------------------------------------------------------------------- +// wxDebugReportPreview: presents the debug report to the user and allows him +// to veto report entirely or remove some parts of it +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_QA wxDebugReportPreview +{ +public: + // ctor is trivial + wxDebugReportPreview() { } + + // present the report to the user and allow him to modify it by removing + // some or all of the files and, potentially, adding some notes + // + // return true if the report should be processed or false if the user chose + // to cancel report generation or removed all files from it + virtual bool Show(wxDebugReport& dbgrpt) const = 0; + + // dtor is trivial as well but should be virtual for a base class + virtual ~wxDebugReportPreview() { } +}; + +#if wxUSE_GUI + +// ---------------------------------------------------------------------------- +// wxDebugReportPreviewStd: standard debug report preview window +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_QA wxDebugReportPreviewStd : public wxDebugReportPreview +{ +public: + wxDebugReportPreviewStd() { } + + virtual bool Show(wxDebugReport& dbgrpt) const; +}; + +#endif // wxUSE_GUI + +#endif // wxUSE_DEBUGREPORT && wxUSE_XML + +#endif // _WX_DEBUGRPT_H_ diff --git a/Externals/wxWidgets/include/wx/defs.h b/Externals/wxWidgets/include/wx/defs.h new file mode 100644 index 0000000000..261352a938 --- /dev/null +++ b/Externals/wxWidgets/include/wx/defs.h @@ -0,0 +1,2886 @@ +/* + * Name: wx/defs.h + * Purpose: Declarations/definitions common to all wx source files + * Author: Julian Smart and others + * Modified by: Ryan Norton (Converted to C) + * Created: 01/02/97 + * RCS-ID: $Id: defs.h 49612 2007-11-03 23:50:04Z VZ $ + * Copyright: (c) Julian Smart + * Licence: wxWindows licence + */ + +/* THIS IS A C FILE, DON'T USE C++ FEATURES (IN PARTICULAR COMMENTS) IN IT */ + +#ifndef _WX_DEFS_H_ +#define _WX_DEFS_H_ + +/* ---------------------------------------------------------------------------- */ +/* compiler and OS identification */ +/* ---------------------------------------------------------------------------- */ + +#include "wx/platform.h" + +#ifdef __cplusplus +/* Make sure the environment is set correctly */ +# if defined(__WXMSW__) && defined(__X__) +# error "Target can't be both X and Windows" +# elif defined(__WXMSW__) && defined(__PALMOS__) +# error "Target can't be both PalmOS and Windows" +# elif !defined(__WXMOTIF__) && \ + !defined(__WXMSW__) && \ + !defined(__WXPALMOS__)&& \ + !defined(__WXGTK__) && \ + !defined(__WXPM__) && \ + !defined(__WXMAC__) && \ + !defined(__WXCOCOA__) && \ + !defined(__X__) && \ + !defined(__WXMGL__) && \ + !defined(__WXDFB__) && \ + !defined(__WXX11__) && \ + wxUSE_GUI +# ifdef __UNIX__ +# error "No Target! You should use wx-config program for compilation flags!" +# else /* !Unix */ +# error "No Target! You should use supplied makefiles for compilation!" +# endif /* Unix/!Unix */ +# endif +#endif /*__cplusplus*/ + +#ifndef __WXWINDOWS__ + #define __WXWINDOWS__ 1 +#endif + +#ifndef wxUSE_BASE + /* by default consider that this is a monolithic build */ + #define wxUSE_BASE 1 +#endif + +#if !wxUSE_GUI && !defined(__WXBASE__) + #define __WXBASE__ +#endif + +/* include the feature test macros */ +#include "wx/features.h" + +/* suppress some Visual C++ warnings */ +#ifdef __VISUALC__ + /* the only "real" warning here is 4244 but there are just too many of them */ + /* in our code... one day someone should go and fix them but until then... */ +# pragma warning(disable:4097) /* typedef used as class */ +# pragma warning(disable:4201) /* nonstandard extension used: nameless struct/union */ +# pragma warning(disable:4244) /* conversion from double to float */ +# pragma warning(disable:4355) /* 'this' used in base member initializer list */ +# pragma warning(disable:4511) /* copy ctor couldn't be generated */ +# pragma warning(disable:4512) /* operator=() couldn't be generated */ +# pragma warning(disable:4710) /* function not inlined */ + + /* For VC++ 5.0 for release mode, the warning 'C4702: unreachable code */ + /* is buggy, and occurs for code that does actually get executed */ +# if !defined __WXDEBUG__ && __VISUALC__ <= 1100 +# pragma warning(disable:4702) /* unreachable code */ +# endif + /* The VC++ 5.0 warning 'C4003: not enough actual parameters for macro' + * is incompatible with the wxWidgets headers since it is given when + * parameters are empty but not missing. */ +# if __VISUALC__ <= 1100 +# pragma warning(disable:4003) /* not enough actual parameters for macro */ +# endif + + /* + VC++ 8 gives a warning when using standard functions such as sprintf, + localtime, ... -- stop this madness, unless the user had already done it + */ + #if __VISUALC__ >= 1400 + #ifndef _CRT_SECURE_NO_DEPRECATE + #define _CRT_SECURE_NO_DEPRECATE 1 + #endif + #ifndef _CRT_NON_CONFORMING_SWPRINTFS + #define _CRT_NON_CONFORMING_SWPRINTFS 1 + #endif + #endif /* VC++ 8 */ +#endif /* __VISUALC__ */ + +/* suppress some Salford C++ warnings */ +#ifdef __SALFORDC__ +# pragma suppress 353 /* Possible nested comments */ +# pragma suppress 593 /* Define not used */ +# pragma suppress 61 /* enum has no name (doesn't suppress!) */ +# pragma suppress 106 /* unnamed, unused parameter */ +# pragma suppress 571 /* Virtual function hiding */ +#endif /* __SALFORDC__ */ + +/* suppress some Borland C++ warnings */ +#ifdef __BORLANDC__ +# pragma warn -inl /* Functions containing reserved words and certain constructs are not expanded inline */ +#endif /* __BORLANDC__ */ + +/* + g++ gives a warning when a class has private dtor if it has no friends but + this is a perfectly valid situation for a ref-counted class which destroys + itself when its ref count drops to 0, so provide a macro to suppress this + warning + */ +#ifdef __GNUG__ +# define wxSUPPRESS_GCC_PRIVATE_DTOR_WARNING(name) \ + friend class wxDummyFriendFor ## name; +#else /* !g++ */ +# define wxSUPPRESS_GCC_PRIVATE_DTOR_WARNING(name) +#endif + +/* ---------------------------------------------------------------------------- */ +/* wxWidgets version and compatibility defines */ +/* ---------------------------------------------------------------------------- */ + +#include "wx/version.h" + +/* ============================================================================ */ +/* non portable C++ features */ +/* ============================================================================ */ + +/* ---------------------------------------------------------------------------- */ +/* compiler defects workarounds */ +/* ---------------------------------------------------------------------------- */ + +/* + Digital Unix C++ compiler only defines this symbol for .cxx and .hxx files, + so define it ourselves (newer versions do it for all files, though, and + don't allow it to be redefined) + */ +#if defined(__DECCXX) && !defined(__VMS) && !defined(__cplusplus) +#define __cplusplus +#endif /* __DECCXX */ + +/* Resolves linking problems under HP-UX when compiling with gcc/g++ */ +#if defined(__HPUX__) && defined(__GNUG__) +#define va_list __gnuc_va_list +#endif /* HP-UX */ + +/* ---------------------------------------------------------------------------- */ +/* check for native bool type and TRUE/FALSE constants */ +/* ---------------------------------------------------------------------------- */ + +/* Add more tests here for Windows compilers that already define bool */ +/* (under Unix, configure tests for this) */ +#ifndef HAVE_BOOL + #if defined( __MWERKS__ ) + #if (__MWERKS__ >= 0x1000) && __option(bool) + #define HAVE_BOOL + #endif + #elif defined(__APPLE__) && defined(__APPLE_CC__) + /* Apple bundled gcc supports bool */ + #define HAVE_BOOL + #elif defined(__VISUALC__) && (__VISUALC__ == 1020) + /* in VC++ 4.2 the bool keyword is reserved (hence can't be typedefed) */ + /* but not implemented, so we must #define it */ + #define bool unsigned int + #elif defined(__VISUALC__) && (__VISUALC__ == 1010) + /* For VisualC++ 4.1, we need to define */ + /* bool as something between 4.0 & 5.0... */ + typedef unsigned int wxbool; + #define bool wxbool + #define HAVE_BOOL + #elif defined(__VISUALC__) && (__VISUALC__ > 1020) + /* VC++ supports bool since 4.2 */ + #define HAVE_BOOL + #elif defined(__BORLANDC__) && (__BORLANDC__ >= 0x500) + /* Borland 5.0+ supports bool */ + #define HAVE_BOOL + #elif wxCHECK_WATCOM_VERSION(1,0) + /* Watcom 11+ supports bool */ + #define HAVE_BOOL + #elif defined(__DIGITALMARS__) + /* DigitalMars supports bool */ + #define HAVE_BOOL + #elif defined(__GNUWIN32__) || defined(__MINGW32__) || defined(__CYGWIN__) + /* Cygwin supports bool */ + #define HAVE_BOOL + #elif defined(__VISAGECPP__) + #if __IBMCPP__ < 400 + typedef unsigned long bool; + #define true ((bool)1) + #define false ((bool)0) + #endif + #define HAVE_BOOL + #endif /* compilers */ +#endif /* HAVE_BOOL */ + +#if !defined(__MWERKS__) || !defined(true) +#if !defined(HAVE_BOOL) && !defined(bool) && !defined(VMS) + /* NB: of course, this doesn't replace the standard type, because, for */ + /* example, overloading based on bool/int parameter doesn't work and */ + /* so should be avoided in portable programs */ + typedef unsigned int bool; +#endif /* bool */ + +/* deal with TRUE/true stuff: we assume that if the compiler supports bool, it */ +/* supports true/false as well and that, OTOH, if it does _not_ support bool, */ +/* it doesn't support these keywords (this is less sure, in particular VC++ */ +/* 4.x could be a problem here) */ +#ifndef HAVE_BOOL + #define true ((bool)1) + #define false ((bool)0) +#endif +#endif + +/* for backwards compatibility, also define TRUE and FALSE */ +/* */ +/* note that these definitions should work both in C++ and C code, so don't */ +/* use true/false below */ +#ifndef TRUE + #define TRUE 1 +#endif + +#ifndef FALSE + #define FALSE 0 +#endif + +typedef short int WXTYPE; + +/* special care should be taken with this type under Windows where the real */ +/* window id is unsigned, so we must always do the cast before comparing them */ +/* (or else they would be always different!). Using wxGetWindowId() which does */ +/* the cast itself is recommended. Note that this type can't be unsigned */ +/* because wxID_ANY == -1 is a valid (and largely used) value for window id. */ +typedef int wxWindowID; + +/* ---------------------------------------------------------------------------- */ +/* other feature tests */ +/* ---------------------------------------------------------------------------- */ + +/* Every ride down a slippery slope begins with a single step.. */ +/* */ +/* Yes, using nested classes is indeed against our coding standards in */ +/* general, but there are places where you can use them to advantage */ +/* without totally breaking ports that cannot use them. If you do, then */ +/* wrap it in this guard, but such cases should still be relatively rare. */ +#define wxUSE_NESTED_CLASSES 1 + +/* check for explicit keyword support */ +#ifndef HAVE_EXPLICIT + #if defined(__VISUALC__) && (__VISUALC__ >= 1100) + /* VC++ 6.0 and 5.0 have explicit (what about earlier versions?) */ + #define HAVE_EXPLICIT + #elif ( defined(__MINGW32__) || defined(__CYGWIN32__) ) \ + && wxCHECK_GCC_VERSION(2, 95) + /* GCC 2.95 has explicit, what about earlier versions? */ + #define HAVE_EXPLICIT + #elif defined(__BORLANDC__) && (__BORLANDC__ >= 0x0520) + /* BC++ 4.52 doesn't support explicit, CBuilder 1 does */ + #define HAVE_EXPLICIT + #elif defined(__MWERKS__) && (__MWERKS__ >= 0x2400) + /* Metrowerks CW6 or higher has explicit */ + #define HAVE_EXPLICIT + #elif defined(__DIGITALMARS__) + #define HAVE_EXPLICIT + #endif +#endif /* !HAVE_EXPLICIT */ + +#ifdef HAVE_EXPLICIT + #define wxEXPLICIT explicit +#else /* !HAVE_EXPLICIT */ + #define wxEXPLICIT +#endif /* HAVE_EXPLICIT/!HAVE_EXPLICIT */ + +/* check for static/const_cast<>() (we don't use the other ones for now) */ +#ifndef HAVE_CXX_CASTS + #if defined(__VISUALC__) && (__VISUALC__ >= 1100) + /* VC++ 6.0 and 5.0 have C++ casts (what about earlier versions?) */ + #define HAVE_CXX_CASTS + #elif defined(__MINGW32__) || defined(__CYGWIN32__) + #if wxCHECK_GCC_VERSION(2, 95) + /* GCC 2.95 has C++ casts, what about earlier versions? */ + #define HAVE_CXX_CASTS + #endif + #endif +#endif /* !HAVE_CXX_CASTS */ + +#ifdef HAVE_CXX_CASTS + #ifndef HAVE_CONST_CAST + #define HAVE_CONST_CAST + #endif + #ifndef HAVE_REINTERPRET_CAST + #define HAVE_REINTERPRET_CAST + #endif + #ifndef HAVE_STATIC_CAST + #define HAVE_STATIC_CAST + #endif + #ifndef HAVE_DYNAMIC_CAST + #define HAVE_DYNAMIC_CAST + #endif +#endif /* HAVE_CXX_CASTS */ + +#ifdef HAVE_STATIC_CAST + #define wx_static_cast(t, x) static_cast(x) +#else + #define wx_static_cast(t, x) ((t)(x)) +#endif + +#ifdef HAVE_CONST_CAST + #define wx_const_cast(t, x) const_cast(x) +#else + #define wx_const_cast(t, x) ((t)(x)) +#endif + +#ifdef HAVE_REINTERPRET_CAST + #define wx_reinterpret_cast(t, x) reinterpret_cast(x) +#else + #define wx_reinterpret_cast(t, x) ((t)(x)) +#endif + +/* + This one is a wx invention: like static cast but used when we intentionally + truncate from a larger to smaller type, static_cast<> can't be used for it + as it results in warnings when using some compilers (SGI mipspro for example) + */ +#if defined(__INTELC__) && defined(__cplusplus) + template + inline T wx_truncate_cast_impl(X x) + { + #pragma warning(push) + /* implicit conversion of a 64-bit integral type to a smaller integral type */ + #pragma warning(disable: 1682) + /* conversion from "X" to "T" may lose significant bits */ + #pragma warning(disable: 810) + + return x; + + #pragma warning(pop) + } + + #define wx_truncate_cast(t, x) wx_truncate_cast_impl(x) + +#elif defined(__cplusplus) && defined(__VISUALC__) && __VISUALC__ >= 1310 + template + inline T wx_truncate_cast_impl(X x) + { + #pragma warning(push) + /* conversion from 'X' to 'T', possible loss of data */ + #pragma warning(disable: 4267) + + return x; + + #pragma warning(pop) + } + + #define wx_truncate_cast(t, x) wx_truncate_cast_impl(x) +#else + #define wx_truncate_cast(t, x) ((t)(x)) +#endif + +/* for consistency with wxStatic/DynamicCast defined in wx/object.h */ +#define wxConstCast(obj, className) wx_const_cast(className *, obj) + +#ifndef HAVE_STD_WSTRING + #if defined(__VISUALC__) && (__VISUALC__ >= 1100) + /* VC++ 6.0 and 5.0 have std::wstring (what about earlier versions?) */ + #define HAVE_STD_WSTRING + #elif ( defined(__MINGW32__) || defined(__CYGWIN32__) ) \ + && wxCHECK_GCC_VERSION(3, 3) + /* GCC 3.1 has std::wstring; 3.0 never was in MinGW, 2.95 hasn't it */ + #define HAVE_STD_WSTRING + #endif +#endif + +#ifndef HAVE_STD_STRING_COMPARE + #if defined(__VISUALC__) && (__VISUALC__ >= 1100) + /* VC++ 6.0 and 5.0 have std::string::compare */ + /* (what about earlier versions?) */ + #define HAVE_STD_STRING_COMPARE + #elif ( defined(__MINGW32__) || defined(__CYGWIN32__) ) \ + && wxCHECK_GCC_VERSION(3, 1) + /* GCC 3.1 has std::string::compare; */ + /* 3.0 never was in MinGW, 2.95 hasn't it */ + #define HAVE_STD_STRING_COMPARE + #endif +#endif + +/* provide replacement for C99 va_copy() if the compiler doesn't have it */ + +/* could be already defined by configure or the user */ +#ifndef wxVaCopy + /* if va_copy is a macro or configure detected that we have it, use it */ + #if defined(va_copy) || defined(HAVE_VA_COPY) + #define wxVaCopy va_copy + #else /* no va_copy, try to provide a replacement */ + /* + configure tries to determine whether va_list is an array or struct + type, but it may not be used under Windows, so deal with a few + special cases. + */ + + #ifdef __WATCOMC__ + /* Watcom uses array type for va_list except for PPC and Alpha */ + #if !defined(__PPC__) && !defined(__AXP__) + #define VA_LIST_IS_ARRAY + #endif + #endif /* __WATCOMC__ */ + + #if defined(__PPC__) && (defined(_CALL_SYSV) || defined (_WIN32)) + /* + PPC using SysV ABI and NT/PPC are special in that they use an + extra level of indirection. + */ + #define VA_LIST_IS_POINTER + #endif /* SysV or Win32 on __PPC__ */ + + /* + note that we use memmove(), not memcpy(), in case anybody tries + to do wxVaCopy(ap, ap) + */ + #if defined(VA_LIST_IS_POINTER) + #define wxVaCopy(d, s) memmove(*(d), *(s), sizeof(va_list)) + #elif defined(VA_LIST_IS_ARRAY) + #define wxVaCopy(d, s) memmove((d), (s), sizeof(va_list)) + #else /* we can only hope that va_lists are simple lvalues */ + #define wxVaCopy(d, s) ((d) = (s)) + #endif + #endif /* va_copy/!va_copy */ +#endif /* wxVaCopy */ + + +/* ---------------------------------------------------------------------------- */ +/* portable calling conventions macros */ +/* ---------------------------------------------------------------------------- */ + +/* stdcall is used for all functions called by Windows under Windows */ +#if defined(__WINDOWS__) + #if defined(__GNUWIN32__) + #define wxSTDCALL __attribute__((stdcall)) + #else + /* both VC++ and Borland understand this */ + #define wxSTDCALL _stdcall + #endif + +#else /* Win */ + /* no such stupidness under Unix */ + #define wxSTDCALL +#endif /* platform */ + +/* LINKAGEMODE mode is empty for everyting except OS/2 */ +#ifndef LINKAGEMODE + #define LINKAGEMODE +#endif /* LINKAGEMODE */ + +/* wxCALLBACK should be used for the functions which are called back by */ +/* Windows (such as compare function for wxListCtrl) */ +#if defined(__WIN32__) && !defined(__WXMICROWIN__) + #define wxCALLBACK wxSTDCALL +#else + /* no stdcall under Unix nor Win16 */ + #define wxCALLBACK +#endif /* platform */ + +/* generic calling convention for the extern "C" functions */ + +#if defined(__VISUALC__) + #define wxC_CALLING_CONV _cdecl +#elif defined(__VISAGECPP__) + #define wxC_CALLING_CONV _Optlink +#else /* !Visual C++ */ + #define wxC_CALLING_CONV +#endif /* compiler */ + +/* callling convention for the qsort(3) callback */ +#define wxCMPFUNC_CONV wxC_CALLING_CONV + +/* compatibility :-( */ +#define CMPFUNC_CONV wxCMPFUNC_CONV + +/* DLL import/export declarations */ +#include "wx/dlimpexp.h" + +/* ---------------------------------------------------------------------------- */ +/* Very common macros */ +/* ---------------------------------------------------------------------------- */ + +/* Printf-like attribute definitions to obtain warnings with GNU C/C++ */ +#ifndef ATTRIBUTE_PRINTF +# if defined(__GNUC__) && !wxUSE_UNICODE +# define ATTRIBUTE_PRINTF(m, n) __attribute__ ((__format__ (__printf__, m, n))) +# else +# define ATTRIBUTE_PRINTF(m, n) +# endif + +# define ATTRIBUTE_PRINTF_1 ATTRIBUTE_PRINTF(1, 2) +# define ATTRIBUTE_PRINTF_2 ATTRIBUTE_PRINTF(2, 3) +# define ATTRIBUTE_PRINTF_3 ATTRIBUTE_PRINTF(3, 4) +# define ATTRIBUTE_PRINTF_4 ATTRIBUTE_PRINTF(4, 5) +# define ATTRIBUTE_PRINTF_5 ATTRIBUTE_PRINTF(5, 6) +#endif /* !defined(ATTRIBUTE_PRINTF) */ + +/* Macro to issue warning when using deprecated functions with gcc3 or MSVC7: */ +#if wxCHECK_GCC_VERSION(3, 1) + #define wxDEPRECATED(x) x __attribute__ ((deprecated)) +#elif defined(__VISUALC__) && (__VISUALC__ >= 1300) + #define wxDEPRECATED(x) __declspec(deprecated) x +#else + #define wxDEPRECATED(x) x +#endif + +/* everybody gets the assert and other debug macros */ +#include "wx/debug.h" + +/* NULL declaration: it must be defined as 0 for C++ programs (in particular, */ +/* it must not be defined as "(void *)0" which is standard for C but completely */ +/* breaks C++ code) */ +#ifndef __HANDHELDPC__ +#include +#endif + +/* delete pointer if it is not NULL and NULL it afterwards */ +/* (checking that it's !NULL before passing it to delete is just a */ +/* a question of style, because delete will do it itself anyhow, but it might */ +/* be considered as an error by some overzealous debugging implementations of */ +/* the library, so we do it ourselves) */ +#define wxDELETE(p) if ( (p) != NULL ) { delete p; p = NULL; } + +/* delete an array and NULL it (see comments above) */ +#define wxDELETEA(p) if ( (p) ) { delete [] (p); p = NULL; } + +/* size of statically declared array */ +#define WXSIZEOF(array) (sizeof(array)/sizeof(array[0])) + +/* symbolic constant used by all Find()-like functions returning positive */ +/* integer on success as failure indicator */ +#define wxNOT_FOUND (-1) + +/* ---------------------------------------------------------------------------- */ +/* macros to avoid compiler warnings */ +/* ---------------------------------------------------------------------------- */ + +/* Macro to cut down on compiler warnings. */ +#if 1 /* there should be no more any compilers needing the "#else" version */ + #define WXUNUSED(identifier) /* identifier */ +#else /* stupid, broken compiler */ + #define WXUNUSED(identifier) identifier +#endif + +/* some arguments are only used in debug mode, but unused in release one */ +#ifdef __WXDEBUG__ + #define WXUNUSED_UNLESS_DEBUG(param) param +#else + #define WXUNUSED_UNLESS_DEBUG(param) WXUNUSED(param) +#endif + +/* some arguments are not used in unicode mode */ +#if wxUSE_UNICODE + #define WXUNUSED_IN_UNICODE(param) WXUNUSED(param) +#else + #define WXUNUSED_IN_UNICODE(param) param +#endif + +/* some arguments are not used in WinCE build */ +#ifdef __WXWINCE__ + #define WXUNUSED_IN_WINCE(param) WXUNUSED(param) +#else + #define WXUNUSED_IN_WINCE(param) param +#endif + +/* unused parameters in non stream builds */ +#if wxUSE_STREAMS + #define WXUNUSED_UNLESS_STREAMS(param) param +#else + #define WXUNUSED_UNLESS_STREAMS(param) WXUNUSED(param) +#endif + +/* some compilers give warning about a possibly unused variable if it is */ +/* initialized in both branches of if/else and shut up if it is initialized */ +/* when declared, but other compilers then give warnings about unused variable */ +/* value -- this should satisfy both of them */ +#if defined(__VISUALC__) + #define wxDUMMY_INITIALIZE(val) = val +#else + #define wxDUMMY_INITIALIZE(val) +#endif + +/* sometimes the value of a variable is *really* not used, to suppress the */ +/* resulting warning you may pass it to this function */ +#ifdef __cplusplus +# ifdef __BORLANDC__ +# define wxUnusedVar(identifier) identifier +# else + template + inline void wxUnusedVar(const T& WXUNUSED(t)) { } +# endif +#endif + +/* ---------------------------------------------------------------------------- */ +/* compiler specific settings */ +/* ---------------------------------------------------------------------------- */ + +/* to allow compiling with warning level 4 under Microsoft Visual C++ some */ +/* warnings just must be disabled */ +#ifdef __VISUALC__ + #pragma warning(disable: 4514) /* unreferenced inline func has been removed */ +/* + you might be tempted to disable this one also: triggered by CHECK and FAIL + macros in debug.h, but it's, overall, a rather useful one, so I leave it and + will try to find some way to disable this warning just for CHECK/FAIL. Anyone? +*/ + #pragma warning(disable: 4127) /* conditional expression is constant */ +#endif /* VC++ */ + +#if defined(__MWERKS__) + #undef try + #undef except + #undef finally + #define except(x) catch(...) +#endif /* Metrowerks */ + +#if wxONLY_WATCOM_EARLIER_THAN(1,4) + typedef short mode_t; +#endif + +/* where should i put this? we need to make sure of this as it breaks */ +/* the code. */ +#if !wxUSE_IOSTREAMH && defined(__WXDEBUG__) +# ifndef __MWERKS__ +/* #undef __WXDEBUG__ */ +# ifdef wxUSE_DEBUG_NEW_ALWAYS +# undef wxUSE_DEBUG_NEW_ALWAYS +# define wxUSE_DEBUG_NEW_ALWAYS 0 +# endif +# endif +#endif + +/* ---------------------------------------------------------------------------- */ +/* standard wxWidgets types */ +/* ---------------------------------------------------------------------------- */ + +/* the type for screen and DC coordinates */ +typedef int wxCoord; + +enum { wxDefaultCoord = -1 }; + +/* ---------------------------------------------------------------------------- */ +/* define fixed length types */ +/* ---------------------------------------------------------------------------- */ + +#if defined(__WXPALMOS__) || defined(__MINGW32__) + #include +#endif + +/* chars are always one byte (by definition), shorts are always two (in */ +/* practice) */ + +/* 8bit */ +#ifndef SIZEOF_CHAR + #define SIZEOF_CHAR 1 +#endif +typedef signed char wxInt8; +typedef unsigned char wxUint8; +typedef wxUint8 wxByte; + + +/* 16bit */ +#ifdef SIZEOF_SHORT + #if SIZEOF_SHORT != 2 + #error "wxWidgets assumes sizeof(short) == 2, please fix the code" + #endif +#else + #define SIZEOF_SHORT 2 +#endif + +typedef signed short wxInt16; +typedef unsigned short wxUint16; + +typedef wxUint16 wxWord; + +/* + things are getting more interesting with ints, longs and pointers + + there are several different standard data models described by this table: + + +-----------+----------------------------+ + |type\model | LP64 ILP64 LLP64 ILP32 LP32| + +-----------+----------------------------+ + |char | 8 8 8 8 8 | + |short | 16 16 16 16 16 | + |int | 32 64 32 32 16 | + |long | 64 64 32 32 32 | + |long long | 64 | + |void * | 64 64 64 32 32 | + +-----------+----------------------------+ + + Win16 used LP32 (but we don't support it any longer), Win32 obviously used + ILP32 and Win64 uses LLP64 (a.k.a. P64) + + Under Unix LP64 is the most widely used (the only I've ever seen, in fact) + */ + +/* 32bit */ +#ifdef __PALMOS__ + typedef int wxInt32; + typedef unsigned int wxUint32; + #define SIZEOF_INT 4 + #define SIZEOF_LONG 4 + #define SIZEOF_WCHAR_T 2 + #define SIZEOF_SIZE_T 4 + #define wxSIZE_T_IS_UINT + #define SIZEOF_VOID_P 4 + #define SIZEOF_SIZE_T 4 +#elif defined(__WINDOWS__) + /* Win64 uses LLP64 model and so ints and longs have the same size as in */ + /* Win32 */ + #if defined(__WIN32__) + typedef int wxInt32; + typedef unsigned int wxUint32; + + /* Assume that if SIZEOF_INT is defined that all the other ones except + SIZEOF_SIZE_T, are too. See next #if below. */ + #ifndef SIZEOF_INT + #define SIZEOF_INT 4 + #define SIZEOF_LONG 4 + #define SIZEOF_WCHAR_T 2 + + /* + under Win64 sizeof(size_t) == 8 and so it is neither unsigned + int nor unsigned long! + */ + #ifdef __WIN64__ + #define SIZEOF_SIZE_T 8 + + #undef wxSIZE_T_IS_UINT + #else /* Win32 */ + #define SIZEOF_SIZE_T 4 + + #define wxSIZE_T_IS_UINT + #endif + #undef wxSIZE_T_IS_ULONG + + #ifdef __WIN64__ + #define SIZEOF_VOID_P 8 + #else /* Win32 */ + #define SIZEOF_VOID_P 4 + #endif /* Win64/32 */ + #endif /* !defined(SIZEOF_INT) */ + + /* + If Python.h was included first, it defines all of the SIZEOF's above + except for SIZEOF_SIZE_T, so we need to do it here to avoid + triggering the #error in the ssize_t typedefs below... + */ + #ifndef SIZEOF_SIZE_T + #ifdef __WIN64__ + #define SIZEOF_SIZE_T 8 + #else /* Win32 */ + #define SIZEOF_SIZE_T 4 + #endif + #endif + #else + #error "Unsupported Windows version" + #endif +#else /* !Windows */ + /* SIZEOF_XXX are normally defined by configure */ + #ifdef SIZEOF_INT + #if SIZEOF_INT == 8 + /* must be ILP64 data model, there is normally a special 32 bit */ + /* type in it but we don't know what it is... */ + #error "No 32bit int type on this platform" + #elif SIZEOF_INT == 4 + typedef int wxInt32; + typedef unsigned int wxUint32; + #elif SIZEOF_INT == 2 + /* must be LP32 */ + #if SIZEOF_LONG != 4 + #error "No 32bit int type on this platform" + #endif + + typedef long wxInt32; + typedef unsigned long wxUint32; + #else + /* wxWidgets is not ready for 128bit systems yet... */ + #error "Unknown sizeof(int) value, what are you compiling for?" + #endif + #else /* !defined(SIZEOF_INT) */ + /* assume default 32bit machine -- what else can we do? */ + wxCOMPILE_TIME_ASSERT( sizeof(int) == 4, IntMustBeExactly4Bytes); + wxCOMPILE_TIME_ASSERT( sizeof(size_t) == 4, SizeTMustBeExactly4Bytes); + wxCOMPILE_TIME_ASSERT( sizeof(void *) == 4, PtrMustBeExactly4Bytes); + + #define SIZEOF_INT 4 + #define SIZEOF_SIZE_T 4 + #define SIZEOF_VOID_P 4 + + typedef int wxInt32; + typedef unsigned int wxUint32; + + #if defined(__MACH__) && !defined(SIZEOF_WCHAR_T) + #define SIZEOF_WCHAR_T 4 + #endif + #if wxUSE_WCHAR_T && !defined(SIZEOF_WCHAR_T) + /* also assume that sizeof(wchar_t) == 2 (under Unix the most */ + /* common case is 4 but there configure would have defined */ + /* SIZEOF_WCHAR_T for us) */ + /* the most common case */ + wxCOMPILE_TIME_ASSERT( sizeof(wchar_t) == 2, + Wchar_tMustBeExactly2Bytes); + + #define SIZEOF_WCHAR_T 2 + #endif /* wxUSE_WCHAR_T */ + #endif +#endif /* Win/!Win */ + +typedef wxUint32 wxDword; + +/* + Define an integral type big enough to contain all of long, size_t and void *. + */ +#if SIZEOF_LONG >= SIZEOF_VOID_P && SIZEOF_LONG >= SIZEOF_SIZE_T + /* normal case */ + typedef unsigned long wxUIntPtr; +#elif SIZEOF_SIZE_T >= SIZEOF_VOID_P + /* Win64 case */ + typedef size_t wxUIntPtr; +#else + /* + This should never happen for the current architectures but if you're + using one where it does, please contact wx-dev@lists.wxwidgets.org. + */ + #error "Pointers can't be stored inside integer types." +#endif + +#ifdef __cplusplus +/* And also define a couple of simple functions to cast pointer to/from it. */ +inline wxUIntPtr wxPtrToUInt(const void *p) +{ + /* + VC++ 7.1 gives warnings about casts such as below even when they're + explicit with /Wp64 option, suppress them as we really know what we're + doing here. Same thing with icc with -Wall. + */ +#ifdef __VISUALC__ + #if __VISUALC__ >= 1200 + #pragma warning(push) + #endif + /* pointer truncation from '' to '' */ + #pragma warning(disable: 4311) +#elif defined(__INTELC__) + #pragma warning(push) + /* conversion from pointer to same-sized integral type */ + #pragma warning(disable: 1684) +#endif + + return wx_reinterpret_cast(wxUIntPtr, p); + +#if (defined(__VISUALC__) && __VISUALC__ >= 1200) || defined(__INTELC__) + #pragma warning(pop) +#endif +} + +inline void *wxUIntToPtr(wxUIntPtr p) +{ +#ifdef __VISUALC__ + #if __VISUALC__ >= 1200 + #pragma warning(push) + #endif + /* conversion to type of greater size */ + #pragma warning(disable: 4312) +#elif defined(__INTELC__) + #pragma warning(push) + /* invalid type conversion: "wxUIntPtr={unsigned long}" to "void *" */ + #pragma warning(disable: 171) +#endif + + return wx_reinterpret_cast(void *, p); + +#if (defined(__VISUALC__) && __VISUALC__ >= 1200) || defined(__INTELC__) + #pragma warning(pop) +#endif +} +#endif /*__cplusplus*/ + + +/* 64 bit */ + +/* NB: we #define and not typedef wxLongLong_t because we use "#ifdef */ +/* wxLongLong_t" in wx/longlong.h */ + +/* wxULongLong_t is set later (usually to unsigned wxLongLong_t) */ + +/* to avoid compilation problems on 64bit machines with ambiguous method calls */ +/* we will need to define this */ +#undef wxLongLongIsLong + +/* + First check for specific compilers which have known 64 bit integer types, + this avoids clashes with SIZEOF_LONG[_LONG] being defined incorrectly for + e.g. MSVC builds (Python.h defines it as 8 even for MSVC). + + Also notice that we check for "long long" before checking for 64 bit long as + we still want to use "long long" and not "long" for wxLongLong_t on 64 bit + architectures to be able to pass wxLongLong_t to the standard functions + prototyped as taking "long long" such as strtoll(). + */ +#if (defined(__VISUALC__) && defined(__WIN32__)) + #define wxLongLong_t __int64 + #define wxLongLongSuffix i64 + #define wxLongLongFmtSpec _T("I64") +#elif defined(__BORLANDC__) && defined(__WIN32__) && (__BORLANDC__ >= 0x520) + #define wxLongLong_t __int64 + #define wxLongLongSuffix i64 + #define wxLongLongFmtSpec _T("L") +#elif (defined(__WATCOMC__) && (defined(__WIN32__) || defined(__DOS__) || defined(__OS2__))) + #define wxLongLong_t __int64 + #define wxLongLongSuffix i64 + #define wxLongLongFmtSpec _T("L") +#elif defined(__DIGITALMARS__) + #define wxLongLong_t __int64 + #define wxLongLongSuffix LL + #define wxLongLongFmtSpec _T("ll") +#elif defined(__MINGW32__) + #define wxLongLong_t long long + #define wxLongLongSuffix ll + #define wxLongLongFmtSpec _T("I64") +#elif defined(__MWERKS__) + #if __option(longlong) + #define wxLongLong_t long long + #define wxLongLongSuffix ll + #define wxLongLongFmtSpec _T("ll") + #else + #error "The 64 bit integer support in CodeWarrior has been disabled." + #error "See the documentation on the 'longlong' pragma." + #endif +#elif defined(__WXPALMOS__) + #define wxLongLong_t int64_t + #define wxLongLongSuffix ll + #define wxLongLongFmtSpec _T("ll") +#elif defined(__VISAGECPP__) && __IBMCPP__ >= 400 + #define wxLongLong_t long long +#elif (defined(SIZEOF_LONG_LONG) && SIZEOF_LONG_LONG >= 8) || \ + defined(__GNUC__) || \ + defined(__CYGWIN__) || \ + defined(__WXMICROWIN__) || \ + (defined(__DJGPP__) && __DJGPP__ >= 2) + #define wxLongLong_t long long + #define wxLongLongSuffix ll + #define wxLongLongFmtSpec _T("ll") +#elif defined(SIZEOF_LONG) && (SIZEOF_LONG == 8) + #define wxLongLong_t long + #define wxLongLongSuffix l + #define wxLongLongFmtSpec _T("l") + #define wxLongLongIsLong +#endif + + +#ifdef wxLongLong_t + + #ifdef __WXPALMOS__ + #define wxULongLong_t uint64_t + #else + #define wxULongLong_t unsigned wxLongLong_t + #endif + + /* these macros allow to define 64 bit constants in a portable way */ + #define wxLL(x) wxCONCAT(x, wxLongLongSuffix) + #define wxULL(x) wxCONCAT(x, wxCONCAT(u, wxLongLongSuffix)) + + typedef wxLongLong_t wxInt64; + typedef wxULongLong_t wxUint64; + + #define wxHAS_INT64 1 + +#elif wxUSE_LONGLONG + /* these macros allow to define 64 bit constants in a portable way */ + #define wxLL(x) wxLongLong(x) + #define wxULL(x) wxULongLong(x) + + #define wxInt64 wxLongLong + #define wxUint64 wxULongLong + + #define wxHAS_INT64 1 + +#else /* !wxUSE_LONGLONG */ + + #define wxHAS_INT64 0 + +#endif + + +/* Make sure ssize_t is defined (a signed type the same size as size_t) */ +/* HAVE_SSIZE_T should be defined for compiliers that already have it */ +#ifdef __MINGW32__ + #if defined(_SSIZE_T_) && !defined(HAVE_SSIZE_T) + #define HAVE_SSIZE_T + #endif +#endif +#if defined(__PALMOS__) && !defined(HAVE_SSIZE_T) + #define HAVE_SSIZE_T +#endif +#if wxCHECK_WATCOM_VERSION(1,4) + #define HAVE_SSIZE_T +#endif +#ifndef HAVE_SSIZE_T + #if SIZEOF_SIZE_T == 4 + typedef wxInt32 ssize_t; + #elif SIZEOF_SIZE_T == 8 + typedef wxInt64 ssize_t; + #else + #error "error defining ssize_t, size_t is not 4 or 8 bytes" + #endif +#endif + + +/* base floating point types */ +/* wxFloat32: 32 bit IEEE float ( 1 sign, 8 exponent bits, 23 fraction bits */ +/* wxFloat64: 64 bit IEEE float ( 1 sign, 11 exponent bits, 52 fraction bits */ +/* wxDouble: native fastest representation that has at least wxFloat64 */ +/* precision, so use the IEEE types for storage, and this for */ +/* calculations */ + +typedef float wxFloat32; +#if (defined( __WXMAC__ ) || defined(__WXCOCOA__)) && defined (__MWERKS__) + typedef short double wxFloat64; +#else + typedef double wxFloat64; +#endif + +typedef double wxDouble; + +/* + Some (non standard) compilers typedef wchar_t as an existing type instead + of treating it as a real fundamental type, set wxWCHAR_T_IS_REAL_TYPE to 0 + for them and to 1 for all the others. + */ +#if wxUSE_WCHAR_T + /* + VC++ typedefs wchar_t as unsigned short by default, that is unless + /Za or /Zc:wchar_t option is used in which case _WCHAR_T_DEFINED is + defined. + */ +# if defined(__VISUALC__) && !defined(_NATIVE_WCHAR_T_DEFINED) +# define wxWCHAR_T_IS_REAL_TYPE 0 +# else /* compiler having standard-conforming wchar_t */ +# define wxWCHAR_T_IS_REAL_TYPE 1 +# endif +#endif /* wxUSE_WCHAR_T */ + +/* ---------------------------------------------------------------------------- */ +/* byte ordering related definition and macros */ +/* ---------------------------------------------------------------------------- */ + +/* byte sex */ + +#define wxBIG_ENDIAN 4321 +#define wxLITTLE_ENDIAN 1234 +#define wxPDP_ENDIAN 3412 + +#ifdef WORDS_BIGENDIAN +#define wxBYTE_ORDER wxBIG_ENDIAN +#else +#define wxBYTE_ORDER wxLITTLE_ENDIAN +#endif + +/* byte swapping */ + +#if defined (__MWERKS__) && ( (__MWERKS__ < 0x0900) || macintosh ) +/* assembler versions for these */ +#ifdef __POWERPC__ + inline wxUint16 wxUINT16_SWAP_ALWAYS( wxUint16 i ) + {return (__lhbrx( &i , 0 ) );} + inline wxInt16 wxINT16_SWAP_ALWAYS( wxInt16 i ) + {return (__lhbrx( &i , 0 ) );} + inline wxUint32 wxUINT32_SWAP_ALWAYS( wxUint32 i ) + {return (__lwbrx( &i , 0 ) );} + inline wxInt32 wxINT32_SWAP_ALWAYS( wxInt32 i ) + {return (__lwbrx( &i , 0 ) );} +#else + #pragma parameter __D0 wxUINT16_SWAP_ALWAYS(__D0) + pascal wxUint16 wxUINT16_SWAP_ALWAYS(wxUint16 value) + = { 0xE158 }; + + #pragma parameter __D0 wxINT16_SWAP_ALWAYS(__D0) + pascal wxInt16 wxINT16_SWAP_ALWAYS(wxInt16 value) + = { 0xE158 }; + + #pragma parameter __D0 wxUINT32_SWAP_ALWAYS (__D0) + pascal wxUint32 wxUINT32_SWAP_ALWAYS(wxUint32 value) + = { 0xE158, 0x4840, 0xE158 }; + + #pragma parameter __D0 wxINT32_SWAP_ALWAYS (__D0) + pascal wxInt32 wxINT32_SWAP_ALWAYS(wxInt32 value) + = { 0xE158, 0x4840, 0xE158 }; + +#endif +#else /* !MWERKS */ +#define wxUINT16_SWAP_ALWAYS(val) \ + ((wxUint16) ( \ + (((wxUint16) (val) & (wxUint16) 0x00ffU) << 8) | \ + (((wxUint16) (val) & (wxUint16) 0xff00U) >> 8))) + +#define wxINT16_SWAP_ALWAYS(val) \ + ((wxInt16) ( \ + (((wxUint16) (val) & (wxUint16) 0x00ffU) << 8) | \ + (((wxUint16) (val) & (wxUint16) 0xff00U) >> 8))) + +#define wxUINT32_SWAP_ALWAYS(val) \ + ((wxUint32) ( \ + (((wxUint32) (val) & (wxUint32) 0x000000ffU) << 24) | \ + (((wxUint32) (val) & (wxUint32) 0x0000ff00U) << 8) | \ + (((wxUint32) (val) & (wxUint32) 0x00ff0000U) >> 8) | \ + (((wxUint32) (val) & (wxUint32) 0xff000000U) >> 24))) + +#define wxINT32_SWAP_ALWAYS(val) \ + ((wxInt32) ( \ + (((wxUint32) (val) & (wxUint32) 0x000000ffU) << 24) | \ + (((wxUint32) (val) & (wxUint32) 0x0000ff00U) << 8) | \ + (((wxUint32) (val) & (wxUint32) 0x00ff0000U) >> 8) | \ + (((wxUint32) (val) & (wxUint32) 0xff000000U) >> 24))) +#endif +/* machine specific byte swapping */ + +#ifdef wxLongLong_t + #define wxUINT64_SWAP_ALWAYS(val) \ + ((wxUint64) ( \ + (((wxUint64) (val) & (wxUint64) wxULL(0x00000000000000ff)) << 56) | \ + (((wxUint64) (val) & (wxUint64) wxULL(0x000000000000ff00)) << 40) | \ + (((wxUint64) (val) & (wxUint64) wxULL(0x0000000000ff0000)) << 24) | \ + (((wxUint64) (val) & (wxUint64) wxULL(0x00000000ff000000)) << 8) | \ + (((wxUint64) (val) & (wxUint64) wxULL(0x000000ff00000000)) >> 8) | \ + (((wxUint64) (val) & (wxUint64) wxULL(0x0000ff0000000000)) >> 24) | \ + (((wxUint64) (val) & (wxUint64) wxULL(0x00ff000000000000)) >> 40) | \ + (((wxUint64) (val) & (wxUint64) wxULL(0xff00000000000000)) >> 56))) + + #define wxINT64_SWAP_ALWAYS(val) \ + ((wxInt64) ( \ + (((wxUint64) (val) & (wxUint64) wxULL(0x00000000000000ff)) << 56) | \ + (((wxUint64) (val) & (wxUint64) wxULL(0x000000000000ff00)) << 40) | \ + (((wxUint64) (val) & (wxUint64) wxULL(0x0000000000ff0000)) << 24) | \ + (((wxUint64) (val) & (wxUint64) wxULL(0x00000000ff000000)) << 8) | \ + (((wxUint64) (val) & (wxUint64) wxULL(0x000000ff00000000)) >> 8) | \ + (((wxUint64) (val) & (wxUint64) wxULL(0x0000ff0000000000)) >> 24) | \ + (((wxUint64) (val) & (wxUint64) wxULL(0x00ff000000000000)) >> 40) | \ + (((wxUint64) (val) & (wxUint64) wxULL(0xff00000000000000)) >> 56))) +#elif wxUSE_LONGLONG /* !wxLongLong_t */ + #define wxUINT64_SWAP_ALWAYS(val) \ + ((wxUint64) ( \ + ((wxULongLong(val) & wxULongLong(0L, 0x000000ffU)) << 56) | \ + ((wxULongLong(val) & wxULongLong(0L, 0x0000ff00U)) << 40) | \ + ((wxULongLong(val) & wxULongLong(0L, 0x00ff0000U)) << 24) | \ + ((wxULongLong(val) & wxULongLong(0L, 0xff000000U)) << 8) | \ + ((wxULongLong(val) & wxULongLong(0x000000ffL, 0U)) >> 8) | \ + ((wxULongLong(val) & wxULongLong(0x0000ff00L, 0U)) >> 24) | \ + ((wxULongLong(val) & wxULongLong(0x00ff0000L, 0U)) >> 40) | \ + ((wxULongLong(val) & wxULongLong(0xff000000L, 0U)) >> 56))) + + #define wxINT64_SWAP_ALWAYS(val) \ + ((wxInt64) ( \ + ((wxLongLong(val) & wxLongLong(0L, 0x000000ffU)) << 56) | \ + ((wxLongLong(val) & wxLongLong(0L, 0x0000ff00U)) << 40) | \ + ((wxLongLong(val) & wxLongLong(0L, 0x00ff0000U)) << 24) | \ + ((wxLongLong(val) & wxLongLong(0L, 0xff000000U)) << 8) | \ + ((wxLongLong(val) & wxLongLong(0x000000ffL, 0U)) >> 8) | \ + ((wxLongLong(val) & wxLongLong(0x0000ff00L, 0U)) >> 24) | \ + ((wxLongLong(val) & wxLongLong(0x00ff0000L, 0U)) >> 40) | \ + ((wxLongLong(val) & wxLongLong(0xff000000L, 0U)) >> 56))) +#endif /* wxLongLong_t/!wxLongLong_t */ + +#ifdef WORDS_BIGENDIAN + #define wxUINT16_SWAP_ON_BE(val) wxUINT16_SWAP_ALWAYS(val) + #define wxINT16_SWAP_ON_BE(val) wxINT16_SWAP_ALWAYS(val) + #define wxUINT16_SWAP_ON_LE(val) (val) + #define wxINT16_SWAP_ON_LE(val) (val) + #define wxUINT32_SWAP_ON_BE(val) wxUINT32_SWAP_ALWAYS(val) + #define wxINT32_SWAP_ON_BE(val) wxINT32_SWAP_ALWAYS(val) + #define wxUINT32_SWAP_ON_LE(val) (val) + #define wxINT32_SWAP_ON_LE(val) (val) + #if wxHAS_INT64 + #define wxUINT64_SWAP_ON_BE(val) wxUINT64_SWAP_ALWAYS(val) + #define wxUINT64_SWAP_ON_LE(val) (val) + #endif +#else + #define wxUINT16_SWAP_ON_LE(val) wxUINT16_SWAP_ALWAYS(val) + #define wxINT16_SWAP_ON_LE(val) wxINT16_SWAP_ALWAYS(val) + #define wxUINT16_SWAP_ON_BE(val) (val) + #define wxINT16_SWAP_ON_BE(val) (val) + #define wxUINT32_SWAP_ON_LE(val) wxUINT32_SWAP_ALWAYS(val) + #define wxINT32_SWAP_ON_LE(val) wxINT32_SWAP_ALWAYS(val) + #define wxUINT32_SWAP_ON_BE(val) (val) + #define wxINT32_SWAP_ON_BE(val) (val) + #if wxHAS_INT64 + #define wxUINT64_SWAP_ON_LE(val) wxUINT64_SWAP_ALWAYS(val) + #define wxUINT64_SWAP_ON_BE(val) (val) + #endif +#endif + +/* ---------------------------------------------------------------------------- */ +/* Geometric flags */ +/* ---------------------------------------------------------------------------- */ + +enum wxGeometryCentre +{ + wxCENTRE = 0x0001, + wxCENTER = wxCENTRE +}; + +/* centering into frame rather than screen (obsolete) */ +#define wxCENTER_FRAME 0x0000 +/* centre on screen rather than parent */ +#define wxCENTRE_ON_SCREEN 0x0002 +#define wxCENTER_ON_SCREEN wxCENTRE_ON_SCREEN + +enum wxOrientation +{ + /* don't change the values of these elements, they are used elsewhere */ + wxHORIZONTAL = 0x0004, + wxVERTICAL = 0x0008, + + wxBOTH = wxVERTICAL | wxHORIZONTAL +}; + +enum wxDirection +{ + wxLEFT = 0x0010, + wxRIGHT = 0x0020, + wxUP = 0x0040, + wxDOWN = 0x0080, + + wxTOP = wxUP, + wxBOTTOM = wxDOWN, + + wxNORTH = wxUP, + wxSOUTH = wxDOWN, + wxWEST = wxLEFT, + wxEAST = wxRIGHT, + + wxALL = (wxUP | wxDOWN | wxRIGHT | wxLEFT) +}; + +enum wxAlignment +{ + wxALIGN_NOT = 0x0000, + wxALIGN_CENTER_HORIZONTAL = 0x0100, + wxALIGN_CENTRE_HORIZONTAL = wxALIGN_CENTER_HORIZONTAL, + wxALIGN_LEFT = wxALIGN_NOT, + wxALIGN_TOP = wxALIGN_NOT, + wxALIGN_RIGHT = 0x0200, + wxALIGN_BOTTOM = 0x0400, + wxALIGN_CENTER_VERTICAL = 0x0800, + wxALIGN_CENTRE_VERTICAL = wxALIGN_CENTER_VERTICAL, + + wxALIGN_CENTER = (wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL), + wxALIGN_CENTRE = wxALIGN_CENTER, + + /* a mask to extract alignment from the combination of flags */ + wxALIGN_MASK = 0x0f00 +}; + +enum wxStretch +{ + wxSTRETCH_NOT = 0x0000, + wxSHRINK = 0x1000, + wxGROW = 0x2000, + wxEXPAND = wxGROW, + wxSHAPED = 0x4000, + wxFIXED_MINSIZE = 0x8000, + wxTILE = 0xc000, + + /* for compatibility only, default now, don't use explicitly any more */ +#if WXWIN_COMPATIBILITY_2_4 + wxADJUST_MINSIZE = 0x00100000 +#else + wxADJUST_MINSIZE = 0 +#endif +}; + +/* border flags: the values are chosen for backwards compatibility */ +enum wxBorder +{ + /* this is different from wxBORDER_NONE as by default the controls do have */ + /* border */ + wxBORDER_DEFAULT = 0, + + wxBORDER_NONE = 0x00200000, + wxBORDER_STATIC = 0x01000000, + wxBORDER_SIMPLE = 0x02000000, + wxBORDER_RAISED = 0x04000000, + wxBORDER_SUNKEN = 0x08000000, + wxBORDER_DOUBLE = 0x10000000, /* deprecated */ + wxBORDER_THEME = 0x10000000, + + /* a mask to extract border style from the combination of flags */ + wxBORDER_MASK = 0x1f200000 +}; + +/* This makes it easier to specify a 'normal' border for a control */ +#if defined(__SMARTPHONE__) || defined(__POCKETPC__) +#define wxDEFAULT_CONTROL_BORDER wxBORDER_SIMPLE +#else +#define wxDEFAULT_CONTROL_BORDER wxBORDER_SUNKEN +#endif + +/* ---------------------------------------------------------------------------- */ +/* Window style flags */ +/* ---------------------------------------------------------------------------- */ + +/* + * Values are chosen so they can be |'ed in a bit list. + * Some styles are used across more than one group, + * so the values mustn't clash with others in the group. + * Otherwise, numbers can be reused across groups. + * + * From version 1.66: + * Window (cross-group) styles now take up the first half + * of the flag, and control-specific styles the + * second half. + * + */ + +/* + * Window (Frame/dialog/subwindow/panel item) style flags + */ +#define wxVSCROLL 0x80000000 +#define wxHSCROLL 0x40000000 +#define wxCAPTION 0x20000000 + +/* New styles (border styles are now in their own enum) */ +#define wxDOUBLE_BORDER wxBORDER_DOUBLE +#define wxSUNKEN_BORDER wxBORDER_SUNKEN +#define wxRAISED_BORDER wxBORDER_RAISED +#define wxBORDER wxBORDER_SIMPLE +#define wxSIMPLE_BORDER wxBORDER_SIMPLE +#define wxSTATIC_BORDER wxBORDER_STATIC +#define wxNO_BORDER wxBORDER_NONE + +/* wxALWAYS_SHOW_SB: instead of hiding the scrollbar when it is not needed, */ +/* disable it - but still show (see also wxLB_ALWAYS_SB style) */ +/* */ +/* NB: as this style is only supported by wxUniversal and wxMSW so far */ +#define wxALWAYS_SHOW_SB 0x00800000 + +/* Clip children when painting, which reduces flicker in e.g. frames and */ +/* splitter windows, but can't be used in a panel where a static box must be */ +/* 'transparent' (panel paints the background for it) */ +#define wxCLIP_CHILDREN 0x00400000 + +/* Note we're reusing the wxCAPTION style because we won't need captions */ +/* for subwindows/controls */ +#define wxCLIP_SIBLINGS 0x20000000 + +#define wxTRANSPARENT_WINDOW 0x00100000 + +/* Add this style to a panel to get tab traversal working outside of dialogs */ +/* (on by default for wxPanel, wxDialog, wxScrolledWindow) */ +#define wxTAB_TRAVERSAL 0x00080000 + +/* Add this style if the control wants to get all keyboard messages (under */ +/* Windows, it won't normally get the dialog navigation key events) */ +#define wxWANTS_CHARS 0x00040000 + +/* Make window retained (Motif only, see src/generic/scrolwing.cpp) + * This is non-zero only under wxMotif, to avoid a clash with wxPOPUP_WINDOW + * on other platforms + */ + +#ifdef __WXMOTIF__ +#define wxRETAINED 0x00020000 +#else +#define wxRETAINED 0x00000000 +#endif +#define wxBACKINGSTORE wxRETAINED + +/* set this flag to create a special popup window: it will be always shown on */ +/* top of other windows, will capture the mouse and will be dismissed when the */ +/* mouse is clicked outside of it or if it loses focus in any other way */ +#define wxPOPUP_WINDOW 0x00020000 + +/* force a full repaint when the window is resized (instead of repainting just */ +/* the invalidated area) */ +#define wxFULL_REPAINT_ON_RESIZE 0x00010000 + +/* obsolete: now this is the default behaviour */ +/* */ +/* don't invalidate the whole window (resulting in a PAINT event) when the */ +/* window is resized (currently, makes sense for wxMSW only) */ +#define wxNO_FULL_REPAINT_ON_RESIZE 0 + +/* A mask which can be used to filter (out) all wxWindow-specific styles. + */ +#define wxWINDOW_STYLE_MASK \ + (wxVSCROLL|wxHSCROLL|wxBORDER_MASK|wxALWAYS_SHOW_SB|wxCLIP_CHILDREN| \ + wxCLIP_SIBLINGS|wxTRANSPARENT_WINDOW|wxTAB_TRAVERSAL|wxWANTS_CHARS| \ + wxRETAINED|wxPOPUP_WINDOW|wxFULL_REPAINT_ON_RESIZE) + +/* + * Extra window style flags (use wxWS_EX prefix to make it clear that they + * should be passed to wxWindow::SetExtraStyle(), not SetWindowStyle()) + */ + +/* by default, TransferDataTo/FromWindow() only work on direct children of the */ +/* window (compatible behaviour), set this flag to make them recursively */ +/* descend into all subwindows */ +#define wxWS_EX_VALIDATE_RECURSIVELY 0x00000001 + +/* wxCommandEvents and the objects of the derived classes are forwarded to the */ +/* parent window and so on recursively by default. Using this flag for the */ +/* given window allows to block this propagation at this window, i.e. prevent */ +/* the events from being propagated further upwards. The dialogs have this */ +/* flag on by default. */ +#define wxWS_EX_BLOCK_EVENTS 0x00000002 + +/* don't use this window as an implicit parent for the other windows: this must */ +/* be used with transient windows as otherwise there is the risk of creating a */ +/* dialog/frame with this window as a parent which would lead to a crash if the */ +/* parent is destroyed before the child */ +#define wxWS_EX_TRANSIENT 0x00000004 + +/* don't paint the window background, we'll assume it will */ +/* be done by a theming engine. This is not yet used but could */ +/* possibly be made to work in the future, at least on Windows */ +#define wxWS_EX_THEMED_BACKGROUND 0x00000008 + +/* this window should always process idle events */ +#define wxWS_EX_PROCESS_IDLE 0x00000010 + +/* this window should always process UI update events */ +#define wxWS_EX_PROCESS_UI_UPDATES 0x00000020 + +/* Draw the window in a metal theme on Mac */ +#define wxFRAME_EX_METAL 0x00000040 +#define wxDIALOG_EX_METAL 0x00000040 + +/* Use this style to add a context-sensitive help to the window (currently for */ +/* Win32 only and it doesn't work if wxMINIMIZE_BOX or wxMAXIMIZE_BOX are used) */ +#define wxWS_EX_CONTEXTHELP 0x00000080 + +/* synonyms for wxWS_EX_CONTEXTHELP for compatibility */ +#define wxFRAME_EX_CONTEXTHELP wxWS_EX_CONTEXTHELP +#define wxDIALOG_EX_CONTEXTHELP wxWS_EX_CONTEXTHELP + +/* Create a window which is attachable to another top level window */ +#define wxFRAME_DRAWER 0x0020 + +/* + * MDI parent frame style flags + * Can overlap with some of the above. + */ + +#define wxFRAME_NO_WINDOW_MENU 0x0100 + +/* + * wxMenuBar style flags + */ +/* use native docking */ +#define wxMB_DOCKABLE 0x0001 + +/* + * wxMenu style flags + */ +#define wxMENU_TEAROFF 0x0001 + +/* + * Apply to all panel items + */ +#define wxCOLOURED 0x0800 +#define wxFIXED_LENGTH 0x0400 + +/* + * Styles for wxListBox + */ +#define wxLB_SORT 0x0010 +#define wxLB_SINGLE 0x0020 +#define wxLB_MULTIPLE 0x0040 +#define wxLB_EXTENDED 0x0080 +/* wxLB_OWNERDRAW is Windows-only */ +#define wxLB_OWNERDRAW 0x0100 +#define wxLB_NEEDED_SB 0x0200 +#define wxLB_ALWAYS_SB 0x0400 +#define wxLB_HSCROLL wxHSCROLL +/* always show an entire number of rows */ +#define wxLB_INT_HEIGHT 0x0800 + +#if WXWIN_COMPATIBILITY_2_6 + /* deprecated synonyms */ + #define wxPROCESS_ENTER 0x0400 /* wxTE_PROCESS_ENTER */ + #define wxPASSWORD 0x0800 /* wxTE_PASSWORD */ +#endif + +/* + * wxComboBox style flags + */ +#define wxCB_SIMPLE 0x0004 +#define wxCB_SORT 0x0008 +#define wxCB_READONLY 0x0010 +#define wxCB_DROPDOWN 0x0020 + +/* + * wxRadioBox style flags + */ +/* should we number the items from left to right or from top to bottom in a 2d */ +/* radiobox? */ +#define wxRA_LEFTTORIGHT 0x0001 +#define wxRA_TOPTOBOTTOM 0x0002 + +/* New, more intuitive names to specify majorDim argument */ +#define wxRA_SPECIFY_COLS wxHORIZONTAL +#define wxRA_SPECIFY_ROWS wxVERTICAL + +/* Old names for compatibility */ +#define wxRA_HORIZONTAL wxHORIZONTAL +#define wxRA_VERTICAL wxVERTICAL +#define wxRA_USE_CHECKBOX 0x0010 /* alternative native subcontrols (wxPalmOS) */ + +/* + * wxRadioButton style flag + */ +#define wxRB_GROUP 0x0004 +#define wxRB_SINGLE 0x0008 +#define wxRB_USE_CHECKBOX 0x0010 /* alternative native control (wxPalmOS) */ + +/* + * wxScrollBar flags + */ +#define wxSB_HORIZONTAL wxHORIZONTAL +#define wxSB_VERTICAL wxVERTICAL + +/* + * wxSpinButton flags. + * Note that a wxSpinCtrl is sometimes defined as + * a wxTextCtrl, and so the flags must be different + * from wxTextCtrl's. + */ +#define wxSP_HORIZONTAL wxHORIZONTAL /* 4 */ +#define wxSP_VERTICAL wxVERTICAL /* 8 */ +#define wxSP_ARROW_KEYS 0x1000 +#define wxSP_WRAP 0x2000 + +/* + * wxTabCtrl flags + */ +#define wxTC_RIGHTJUSTIFY 0x0010 +#define wxTC_FIXEDWIDTH 0x0020 +#define wxTC_TOP 0x0000 /* default */ +#define wxTC_LEFT 0x0020 +#define wxTC_RIGHT 0x0040 +#define wxTC_BOTTOM 0x0080 +#define wxTC_MULTILINE 0x0200 /* == wxNB_MULTILINE */ +#define wxTC_OWNERDRAW 0x0400 + +/* + * wxStatusBar95 flags + */ +#define wxST_SIZEGRIP 0x0010 + +/* + * wxStaticText flags + */ +#define wxST_NO_AUTORESIZE 0x0001 +#define wxST_DOTS_MIDDLE 0x0002 +#define wxST_DOTS_END 0x0004 + +/* + * wxStaticBitmap flags + */ +#define wxBI_EXPAND wxEXPAND + +/* + * wxStaticLine flags + */ +#define wxLI_HORIZONTAL wxHORIZONTAL +#define wxLI_VERTICAL wxVERTICAL + + +/* + * extended dialog specifiers. these values are stored in a different + * flag and thus do not overlap with other style flags. note that these + * values do not correspond to the return values of the dialogs (for + * those values, look at the wxID_XXX defines). + */ + +/* wxCENTRE already defined as 0x00000001 */ +#define wxYES 0x00000002 +#define wxOK 0x00000004 +#define wxNO 0x00000008 +#define wxYES_NO (wxYES | wxNO) +#define wxCANCEL 0x00000010 + +#define wxYES_DEFAULT 0x00000000 /* has no effect (default) */ +#define wxNO_DEFAULT 0x00000080 + +#define wxICON_EXCLAMATION 0x00000100 +#define wxICON_HAND 0x00000200 +#define wxICON_WARNING wxICON_EXCLAMATION +#define wxICON_ERROR wxICON_HAND +#define wxICON_QUESTION 0x00000400 +#define wxICON_INFORMATION 0x00000800 +#define wxICON_STOP wxICON_HAND +#define wxICON_ASTERISK wxICON_INFORMATION +#define wxICON_MASK (0x00000100|0x00000200|0x00000400|0x00000800) + +#define wxFORWARD 0x00001000 +#define wxBACKWARD 0x00002000 +#define wxRESET 0x00004000 +#define wxHELP 0x00008000 +#define wxMORE 0x00010000 +#define wxSETUP 0x00020000 + +/* + * Background styles. See wxWindow::SetBackgroundStyle + */ + +enum wxBackgroundStyle +{ + wxBG_STYLE_SYSTEM, + wxBG_STYLE_COLOUR, + wxBG_STYLE_CUSTOM +}; + +/* ---------------------------------------------------------------------------- */ +/* standard IDs */ +/* ---------------------------------------------------------------------------- */ + +/* Standard menu IDs */ +enum +{ + /* no id matches this one when compared to it */ + wxID_NONE = -3, + + /* id for a separator line in the menu (invalid for normal item) */ + wxID_SEPARATOR = -2, + + /* any id: means that we don't care about the id, whether when installing + * an event handler or when creating a new window */ + wxID_ANY = -1, + + + /* all predefined ids are between wxID_LOWEST and wxID_HIGHEST */ + wxID_LOWEST = 4999, + + wxID_OPEN, + wxID_CLOSE, + wxID_NEW, + wxID_SAVE, + wxID_SAVEAS, + wxID_REVERT, + wxID_EXIT, + wxID_UNDO, + wxID_REDO, + wxID_HELP, + wxID_PRINT, + wxID_PRINT_SETUP, + wxID_PAGE_SETUP, + wxID_PREVIEW, + wxID_ABOUT, + wxID_HELP_CONTENTS, + wxID_HELP_INDEX, + wxID_HELP_SEARCH, + wxID_HELP_COMMANDS, + wxID_HELP_PROCEDURES, + wxID_HELP_CONTEXT, + wxID_CLOSE_ALL, + wxID_PREFERENCES, + + wxID_EDIT = 5030, + wxID_CUT, + wxID_COPY, + wxID_PASTE, + wxID_CLEAR, + wxID_FIND, + wxID_DUPLICATE, + wxID_SELECTALL, + wxID_DELETE, + wxID_REPLACE, + wxID_REPLACE_ALL, + wxID_PROPERTIES, + + wxID_VIEW_DETAILS, + wxID_VIEW_LARGEICONS, + wxID_VIEW_SMALLICONS, + wxID_VIEW_LIST, + wxID_VIEW_SORTDATE, + wxID_VIEW_SORTNAME, + wxID_VIEW_SORTSIZE, + wxID_VIEW_SORTTYPE, + + wxID_FILE = 5050, + wxID_FILE1, + wxID_FILE2, + wxID_FILE3, + wxID_FILE4, + wxID_FILE5, + wxID_FILE6, + wxID_FILE7, + wxID_FILE8, + wxID_FILE9, + + /* Standard button and menu IDs */ + wxID_OK = 5100, + wxID_CANCEL, + wxID_APPLY, + wxID_YES, + wxID_NO, + wxID_STATIC, + wxID_FORWARD, + wxID_BACKWARD, + wxID_DEFAULT, + wxID_MORE, + wxID_SETUP, + wxID_RESET, + wxID_CONTEXT_HELP, + wxID_YESTOALL, + wxID_NOTOALL, + wxID_ABORT, + wxID_RETRY, + wxID_IGNORE, + wxID_ADD, + wxID_REMOVE, + + wxID_UP, + wxID_DOWN, + wxID_HOME, + wxID_REFRESH, + wxID_STOP, + wxID_INDEX, + + wxID_BOLD, + wxID_ITALIC, + wxID_JUSTIFY_CENTER, + wxID_JUSTIFY_FILL, + wxID_JUSTIFY_RIGHT, + wxID_JUSTIFY_LEFT, + wxID_UNDERLINE, + wxID_INDENT, + wxID_UNINDENT, + wxID_ZOOM_100, + wxID_ZOOM_FIT, + wxID_ZOOM_IN, + wxID_ZOOM_OUT, + wxID_UNDELETE, + wxID_REVERT_TO_SAVED, + + /* System menu IDs (used by wxUniv): */ + wxID_SYSTEM_MENU = 5200, + wxID_CLOSE_FRAME, + wxID_MOVE_FRAME, + wxID_RESIZE_FRAME, + wxID_MAXIMIZE_FRAME, + wxID_ICONIZE_FRAME, + wxID_RESTORE_FRAME, + + /* IDs used by generic file dialog (13 consecutive starting from this value) */ + wxID_FILEDLGG = 5900, + + wxID_HIGHEST = 5999 +}; + +/* ---------------------------------------------------------------------------- */ +/* other constants */ +/* ---------------------------------------------------------------------------- */ + +/* menu and toolbar item kinds */ +enum wxItemKind +{ + wxITEM_SEPARATOR = -1, + wxITEM_NORMAL, + wxITEM_CHECK, + wxITEM_RADIO, + wxITEM_MAX +}; + +/* hit test results */ +enum wxHitTest +{ + wxHT_NOWHERE, + + /* scrollbar */ + wxHT_SCROLLBAR_FIRST = wxHT_NOWHERE, + wxHT_SCROLLBAR_ARROW_LINE_1, /* left or upper arrow to scroll by line */ + wxHT_SCROLLBAR_ARROW_LINE_2, /* right or down */ + wxHT_SCROLLBAR_ARROW_PAGE_1, /* left or upper arrow to scroll by page */ + wxHT_SCROLLBAR_ARROW_PAGE_2, /* right or down */ + wxHT_SCROLLBAR_THUMB, /* on the thumb */ + wxHT_SCROLLBAR_BAR_1, /* bar to the left/above the thumb */ + wxHT_SCROLLBAR_BAR_2, /* bar to the right/below the thumb */ + wxHT_SCROLLBAR_LAST, + + /* window */ + wxHT_WINDOW_OUTSIDE, /* not in this window at all */ + wxHT_WINDOW_INSIDE, /* in the client area */ + wxHT_WINDOW_VERT_SCROLLBAR, /* on the vertical scrollbar */ + wxHT_WINDOW_HORZ_SCROLLBAR, /* on the horizontal scrollbar */ + wxHT_WINDOW_CORNER, /* on the corner between 2 scrollbars */ + + wxHT_MAX +}; + +/* ---------------------------------------------------------------------------- */ +/* Possible SetSize flags */ +/* ---------------------------------------------------------------------------- */ + +/* Use internally-calculated width if -1 */ +#define wxSIZE_AUTO_WIDTH 0x0001 +/* Use internally-calculated height if -1 */ +#define wxSIZE_AUTO_HEIGHT 0x0002 +/* Use internally-calculated width and height if each is -1 */ +#define wxSIZE_AUTO (wxSIZE_AUTO_WIDTH|wxSIZE_AUTO_HEIGHT) +/* Ignore missing (-1) dimensions (use existing). */ +/* For readability only: test for wxSIZE_AUTO_WIDTH/HEIGHT in code. */ +#define wxSIZE_USE_EXISTING 0x0000 +/* Allow -1 as a valid position */ +#define wxSIZE_ALLOW_MINUS_ONE 0x0004 +/* Don't do parent client adjustments (for implementation only) */ +#define wxSIZE_NO_ADJUSTMENTS 0x0008 +/* Change the window position even if it seems to be already correct */ +#define wxSIZE_FORCE 0x0010 + +/* ---------------------------------------------------------------------------- */ +/* GDI descriptions */ +/* ---------------------------------------------------------------------------- */ + +enum +{ + /* Text font families */ + wxDEFAULT = 70, + wxDECORATIVE, + wxROMAN, + wxSCRIPT, + wxSWISS, + wxMODERN, + wxTELETYPE, /* @@@@ */ + + /* Proportional or Fixed width fonts (not yet used) */ + wxVARIABLE = 80, + wxFIXED, + + wxNORMAL = 90, + wxLIGHT, + wxBOLD, + /* Also wxNORMAL for normal (non-italic text) */ + wxITALIC, + wxSLANT, + + /* Pen styles */ + wxSOLID = 100, + wxDOT, + wxLONG_DASH, + wxSHORT_DASH, + wxDOT_DASH, + wxUSER_DASH, + + wxTRANSPARENT, + + /* Brush & Pen Stippling. Note that a stippled pen cannot be dashed!! */ + /* Note also that stippling a Pen IS meaningfull, because a Line is */ + wxSTIPPLE_MASK_OPAQUE, /* mask is used for blitting monochrome using text fore and back ground colors */ + wxSTIPPLE_MASK, /* mask is used for masking areas in the stipple bitmap (TO DO) */ + /* drawn with a Pen, and without any Brush -- and it can be stippled. */ + wxSTIPPLE = 110, + + wxBDIAGONAL_HATCH, /* In wxWidgets < 2.6 use WX_HATCH macro */ + wxCROSSDIAG_HATCH, /* to verify these wx*_HATCH are in style */ + wxFDIAGONAL_HATCH, /* of wxBrush. In wxWidgets >= 2.6 use */ + wxCROSS_HATCH, /* wxBrush::IsHatch() instead. */ + wxHORIZONTAL_HATCH, + wxVERTICAL_HATCH, + wxFIRST_HATCH = wxBDIAGONAL_HATCH, + wxLAST_HATCH = wxVERTICAL_HATCH, + + wxJOIN_BEVEL = 120, + wxJOIN_MITER, + wxJOIN_ROUND, + + wxCAP_ROUND = 130, + wxCAP_PROJECTING, + wxCAP_BUTT +}; + +#if WXWIN_COMPATIBILITY_2_4 + #define IS_HATCH(s) ((s)>=wxFIRST_HATCH && (s)<=wxLAST_HATCH) +#else + /* use wxBrush::IsHatch() instead thought wxMotif still uses it in src/motif/dcclient.cpp */ +#endif + +/* Logical ops */ +typedef enum +{ + wxCLEAR, wxROP_BLACK = wxCLEAR, wxBLIT_BLACKNESS = wxCLEAR, /* 0 */ + wxXOR, wxROP_XORPEN = wxXOR, wxBLIT_SRCINVERT = wxXOR, /* src XOR dst */ + wxINVERT, wxROP_NOT = wxINVERT, wxBLIT_DSTINVERT = wxINVERT, /* NOT dst */ + wxOR_REVERSE, wxROP_MERGEPENNOT = wxOR_REVERSE, wxBLIT_00DD0228 = wxOR_REVERSE, /* src OR (NOT dst) */ + wxAND_REVERSE, wxROP_MASKPENNOT = wxAND_REVERSE, wxBLIT_SRCERASE = wxAND_REVERSE, /* src AND (NOT dst) */ + wxCOPY, wxROP_COPYPEN = wxCOPY, wxBLIT_SRCCOPY = wxCOPY, /* src */ + wxAND, wxROP_MASKPEN = wxAND, wxBLIT_SRCAND = wxAND, /* src AND dst */ + wxAND_INVERT, wxROP_MASKNOTPEN = wxAND_INVERT, wxBLIT_00220326 = wxAND_INVERT, /* (NOT src) AND dst */ + wxNO_OP, wxROP_NOP = wxNO_OP, wxBLIT_00AA0029 = wxNO_OP, /* dst */ + wxNOR, wxROP_NOTMERGEPEN = wxNOR, wxBLIT_NOTSRCERASE = wxNOR, /* (NOT src) AND (NOT dst) */ + wxEQUIV, wxROP_NOTXORPEN = wxEQUIV, wxBLIT_00990066 = wxEQUIV, /* (NOT src) XOR dst */ + wxSRC_INVERT, wxROP_NOTCOPYPEN = wxSRC_INVERT, wxBLIT_NOTSCRCOPY = wxSRC_INVERT, /* (NOT src) */ + wxOR_INVERT, wxROP_MERGENOTPEN = wxOR_INVERT, wxBLIT_MERGEPAINT = wxOR_INVERT, /* (NOT src) OR dst */ + wxNAND, wxROP_NOTMASKPEN = wxNAND, wxBLIT_007700E6 = wxNAND, /* (NOT src) OR (NOT dst) */ + wxOR, wxROP_MERGEPEN = wxOR, wxBLIT_SRCPAINT = wxOR, /* src OR dst */ + wxSET, wxROP_WHITE = wxSET, wxBLIT_WHITENESS = wxSET /* 1 */ +} form_ops_t; + +/* Flood styles */ +enum +{ + wxFLOOD_SURFACE = 1, + wxFLOOD_BORDER +}; + +/* Polygon filling mode */ +enum +{ + wxODDEVEN_RULE = 1, + wxWINDING_RULE +}; + +/* ToolPanel in wxFrame (VZ: unused?) */ +enum +{ + wxTOOL_TOP = 1, + wxTOOL_BOTTOM, + wxTOOL_LEFT, + wxTOOL_RIGHT +}; + +/* the values of the format constants should be the same as corresponding */ +/* CF_XXX constants in Windows API */ +enum wxDataFormatId +{ + wxDF_INVALID = 0, + wxDF_TEXT = 1, /* CF_TEXT */ + wxDF_BITMAP = 2, /* CF_BITMAP */ + wxDF_METAFILE = 3, /* CF_METAFILEPICT */ + wxDF_SYLK = 4, + wxDF_DIF = 5, + wxDF_TIFF = 6, + wxDF_OEMTEXT = 7, /* CF_OEMTEXT */ + wxDF_DIB = 8, /* CF_DIB */ + wxDF_PALETTE = 9, + wxDF_PENDATA = 10, + wxDF_RIFF = 11, + wxDF_WAVE = 12, + wxDF_UNICODETEXT = 13, + wxDF_ENHMETAFILE = 14, + wxDF_FILENAME = 15, /* CF_HDROP */ + wxDF_LOCALE = 16, + wxDF_PRIVATE = 20, + wxDF_HTML = 30, /* Note: does not correspond to CF_ constant */ + wxDF_MAX +}; + +/* Virtual keycodes */ +enum wxKeyCode +{ + WXK_BACK = 8, + WXK_TAB = 9, + WXK_RETURN = 13, + WXK_ESCAPE = 27, + WXK_SPACE = 32, + WXK_DELETE = 127, + + /* These are, by design, not compatible with unicode characters. + If you want to get a unicode character from a key event, use + wxKeyEvent::GetUnicodeKey instead. */ + WXK_START = 300, + WXK_LBUTTON, + WXK_RBUTTON, + WXK_CANCEL, + WXK_MBUTTON, + WXK_CLEAR, + WXK_SHIFT, + WXK_ALT, + WXK_CONTROL, + WXK_MENU, + WXK_PAUSE, + WXK_CAPITAL, + WXK_END, + WXK_HOME, + WXK_LEFT, + WXK_UP, + WXK_RIGHT, + WXK_DOWN, + WXK_SELECT, + WXK_PRINT, + WXK_EXECUTE, + WXK_SNAPSHOT, + WXK_INSERT, + WXK_HELP, + WXK_NUMPAD0, + WXK_NUMPAD1, + WXK_NUMPAD2, + WXK_NUMPAD3, + WXK_NUMPAD4, + WXK_NUMPAD5, + WXK_NUMPAD6, + WXK_NUMPAD7, + WXK_NUMPAD8, + WXK_NUMPAD9, + WXK_MULTIPLY, + WXK_ADD, + WXK_SEPARATOR, + WXK_SUBTRACT, + WXK_DECIMAL, + WXK_DIVIDE, + WXK_F1, + WXK_F2, + WXK_F3, + WXK_F4, + WXK_F5, + WXK_F6, + WXK_F7, + WXK_F8, + WXK_F9, + WXK_F10, + WXK_F11, + WXK_F12, + WXK_F13, + WXK_F14, + WXK_F15, + WXK_F16, + WXK_F17, + WXK_F18, + WXK_F19, + WXK_F20, + WXK_F21, + WXK_F22, + WXK_F23, + WXK_F24, + WXK_NUMLOCK, + WXK_SCROLL, + WXK_PAGEUP, + WXK_PAGEDOWN, +#if WXWIN_COMPATIBILITY_2_6 + WXK_PRIOR = WXK_PAGEUP, + WXK_NEXT = WXK_PAGEDOWN, +#endif + + WXK_NUMPAD_SPACE, + WXK_NUMPAD_TAB, + WXK_NUMPAD_ENTER, + WXK_NUMPAD_F1, + WXK_NUMPAD_F2, + WXK_NUMPAD_F3, + WXK_NUMPAD_F4, + WXK_NUMPAD_HOME, + WXK_NUMPAD_LEFT, + WXK_NUMPAD_UP, + WXK_NUMPAD_RIGHT, + WXK_NUMPAD_DOWN, + WXK_NUMPAD_PAGEUP, + WXK_NUMPAD_PAGEDOWN, +#if WXWIN_COMPATIBILITY_2_6 + WXK_NUMPAD_PRIOR = WXK_NUMPAD_PAGEUP, + WXK_NUMPAD_NEXT = WXK_NUMPAD_PAGEDOWN, +#endif + WXK_NUMPAD_END, + WXK_NUMPAD_BEGIN, + WXK_NUMPAD_INSERT, + WXK_NUMPAD_DELETE, + WXK_NUMPAD_EQUAL, + WXK_NUMPAD_MULTIPLY, + WXK_NUMPAD_ADD, + WXK_NUMPAD_SEPARATOR, + WXK_NUMPAD_SUBTRACT, + WXK_NUMPAD_DECIMAL, + WXK_NUMPAD_DIVIDE, + + WXK_WINDOWS_LEFT, + WXK_WINDOWS_RIGHT, + WXK_WINDOWS_MENU , + WXK_COMMAND, + + /* Hardware-specific buttons */ + WXK_SPECIAL1 = 193, + WXK_SPECIAL2, + WXK_SPECIAL3, + WXK_SPECIAL4, + WXK_SPECIAL5, + WXK_SPECIAL6, + WXK_SPECIAL7, + WXK_SPECIAL8, + WXK_SPECIAL9, + WXK_SPECIAL10, + WXK_SPECIAL11, + WXK_SPECIAL12, + WXK_SPECIAL13, + WXK_SPECIAL14, + WXK_SPECIAL15, + WXK_SPECIAL16, + WXK_SPECIAL17, + WXK_SPECIAL18, + WXK_SPECIAL19, + WXK_SPECIAL20 +}; + +/* This enum contains bit mask constants used in wxKeyEvent */ +enum wxKeyModifier +{ + wxMOD_NONE = 0x0000, + wxMOD_ALT = 0x0001, + wxMOD_CONTROL = 0x0002, + wxMOD_ALTGR = wxMOD_ALT | wxMOD_CONTROL, + wxMOD_SHIFT = 0x0004, + wxMOD_META = 0x0008, + wxMOD_WIN = wxMOD_META, +#if defined(__WXMAC__) || defined(__WXCOCOA__) + wxMOD_CMD = wxMOD_META, +#else + wxMOD_CMD = wxMOD_CONTROL, +#endif + wxMOD_ALL = 0xffff +}; + +/* Mapping modes (same values as used by Windows, don't change) */ +enum +{ + wxMM_TEXT = 1, + wxMM_LOMETRIC, + wxMM_HIMETRIC, + wxMM_LOENGLISH, + wxMM_HIENGLISH, + wxMM_TWIPS, + wxMM_ISOTROPIC, + wxMM_ANISOTROPIC, + wxMM_POINTS, + wxMM_METRIC +}; + +/* Shortcut for easier dialog-unit-to-pixel conversion */ +#define wxDLG_UNIT(parent, pt) parent->ConvertDialogToPixels(pt) + +/* Paper types */ +typedef enum +{ + wxPAPER_NONE, /* Use specific dimensions */ + wxPAPER_LETTER, /* Letter, 8 1/2 by 11 inches */ + wxPAPER_LEGAL, /* Legal, 8 1/2 by 14 inches */ + wxPAPER_A4, /* A4 Sheet, 210 by 297 millimeters */ + wxPAPER_CSHEET, /* C Sheet, 17 by 22 inches */ + wxPAPER_DSHEET, /* D Sheet, 22 by 34 inches */ + wxPAPER_ESHEET, /* E Sheet, 34 by 44 inches */ + wxPAPER_LETTERSMALL, /* Letter Small, 8 1/2 by 11 inches */ + wxPAPER_TABLOID, /* Tabloid, 11 by 17 inches */ + wxPAPER_LEDGER, /* Ledger, 17 by 11 inches */ + wxPAPER_STATEMENT, /* Statement, 5 1/2 by 8 1/2 inches */ + wxPAPER_EXECUTIVE, /* Executive, 7 1/4 by 10 1/2 inches */ + wxPAPER_A3, /* A3 sheet, 297 by 420 millimeters */ + wxPAPER_A4SMALL, /* A4 small sheet, 210 by 297 millimeters */ + wxPAPER_A5, /* A5 sheet, 148 by 210 millimeters */ + wxPAPER_B4, /* B4 sheet, 250 by 354 millimeters */ + wxPAPER_B5, /* B5 sheet, 182-by-257-millimeter paper */ + wxPAPER_FOLIO, /* Folio, 8-1/2-by-13-inch paper */ + wxPAPER_QUARTO, /* Quarto, 215-by-275-millimeter paper */ + wxPAPER_10X14, /* 10-by-14-inch sheet */ + wxPAPER_11X17, /* 11-by-17-inch sheet */ + wxPAPER_NOTE, /* Note, 8 1/2 by 11 inches */ + wxPAPER_ENV_9, /* #9 Envelope, 3 7/8 by 8 7/8 inches */ + wxPAPER_ENV_10, /* #10 Envelope, 4 1/8 by 9 1/2 inches */ + wxPAPER_ENV_11, /* #11 Envelope, 4 1/2 by 10 3/8 inches */ + wxPAPER_ENV_12, /* #12 Envelope, 4 3/4 by 11 inches */ + wxPAPER_ENV_14, /* #14 Envelope, 5 by 11 1/2 inches */ + wxPAPER_ENV_DL, /* DL Envelope, 110 by 220 millimeters */ + wxPAPER_ENV_C5, /* C5 Envelope, 162 by 229 millimeters */ + wxPAPER_ENV_C3, /* C3 Envelope, 324 by 458 millimeters */ + wxPAPER_ENV_C4, /* C4 Envelope, 229 by 324 millimeters */ + wxPAPER_ENV_C6, /* C6 Envelope, 114 by 162 millimeters */ + wxPAPER_ENV_C65, /* C65 Envelope, 114 by 229 millimeters */ + wxPAPER_ENV_B4, /* B4 Envelope, 250 by 353 millimeters */ + wxPAPER_ENV_B5, /* B5 Envelope, 176 by 250 millimeters */ + wxPAPER_ENV_B6, /* B6 Envelope, 176 by 125 millimeters */ + wxPAPER_ENV_ITALY, /* Italy Envelope, 110 by 230 millimeters */ + wxPAPER_ENV_MONARCH, /* Monarch Envelope, 3 7/8 by 7 1/2 inches */ + wxPAPER_ENV_PERSONAL, /* 6 3/4 Envelope, 3 5/8 by 6 1/2 inches */ + wxPAPER_FANFOLD_US, /* US Std Fanfold, 14 7/8 by 11 inches */ + wxPAPER_FANFOLD_STD_GERMAN, /* German Std Fanfold, 8 1/2 by 12 inches */ + wxPAPER_FANFOLD_LGL_GERMAN, /* German Legal Fanfold, 8 1/2 by 13 inches */ + + wxPAPER_ISO_B4, /* B4 (ISO) 250 x 353 mm */ + wxPAPER_JAPANESE_POSTCARD, /* Japanese Postcard 100 x 148 mm */ + wxPAPER_9X11, /* 9 x 11 in */ + wxPAPER_10X11, /* 10 x 11 in */ + wxPAPER_15X11, /* 15 x 11 in */ + wxPAPER_ENV_INVITE, /* Envelope Invite 220 x 220 mm */ + wxPAPER_LETTER_EXTRA, /* Letter Extra 9 \275 x 12 in */ + wxPAPER_LEGAL_EXTRA, /* Legal Extra 9 \275 x 15 in */ + wxPAPER_TABLOID_EXTRA, /* Tabloid Extra 11.69 x 18 in */ + wxPAPER_A4_EXTRA, /* A4 Extra 9.27 x 12.69 in */ + wxPAPER_LETTER_TRANSVERSE, /* Letter Transverse 8 \275 x 11 in */ + wxPAPER_A4_TRANSVERSE, /* A4 Transverse 210 x 297 mm */ + wxPAPER_LETTER_EXTRA_TRANSVERSE, /* Letter Extra Transverse 9\275 x 12 in */ + wxPAPER_A_PLUS, /* SuperA/SuperA/A4 227 x 356 mm */ + wxPAPER_B_PLUS, /* SuperB/SuperB/A3 305 x 487 mm */ + wxPAPER_LETTER_PLUS, /* Letter Plus 8.5 x 12.69 in */ + wxPAPER_A4_PLUS, /* A4 Plus 210 x 330 mm */ + wxPAPER_A5_TRANSVERSE, /* A5 Transverse 148 x 210 mm */ + wxPAPER_B5_TRANSVERSE, /* B5 (JIS) Transverse 182 x 257 mm */ + wxPAPER_A3_EXTRA, /* A3 Extra 322 x 445 mm */ + wxPAPER_A5_EXTRA, /* A5 Extra 174 x 235 mm */ + wxPAPER_B5_EXTRA, /* B5 (ISO) Extra 201 x 276 mm */ + wxPAPER_A2, /* A2 420 x 594 mm */ + wxPAPER_A3_TRANSVERSE, /* A3 Transverse 297 x 420 mm */ + wxPAPER_A3_EXTRA_TRANSVERSE, /* A3 Extra Transverse 322 x 445 mm */ + + wxPAPER_DBL_JAPANESE_POSTCARD,/* Japanese Double Postcard 200 x 148 mm */ + wxPAPER_A6, /* A6 105 x 148 mm */ + wxPAPER_JENV_KAKU2, /* Japanese Envelope Kaku #2 */ + wxPAPER_JENV_KAKU3, /* Japanese Envelope Kaku #3 */ + wxPAPER_JENV_CHOU3, /* Japanese Envelope Chou #3 */ + wxPAPER_JENV_CHOU4, /* Japanese Envelope Chou #4 */ + wxPAPER_LETTER_ROTATED, /* Letter Rotated 11 x 8 1/2 in */ + wxPAPER_A3_ROTATED, /* A3 Rotated 420 x 297 mm */ + wxPAPER_A4_ROTATED, /* A4 Rotated 297 x 210 mm */ + wxPAPER_A5_ROTATED, /* A5 Rotated 210 x 148 mm */ + wxPAPER_B4_JIS_ROTATED, /* B4 (JIS) Rotated 364 x 257 mm */ + wxPAPER_B5_JIS_ROTATED, /* B5 (JIS) Rotated 257 x 182 mm */ + wxPAPER_JAPANESE_POSTCARD_ROTATED,/* Japanese Postcard Rotated 148 x 100 mm */ + wxPAPER_DBL_JAPANESE_POSTCARD_ROTATED,/* Double Japanese Postcard Rotated 148 x 200 mm */ + wxPAPER_A6_ROTATED, /* A6 Rotated 148 x 105 mm */ + wxPAPER_JENV_KAKU2_ROTATED, /* Japanese Envelope Kaku #2 Rotated */ + wxPAPER_JENV_KAKU3_ROTATED, /* Japanese Envelope Kaku #3 Rotated */ + wxPAPER_JENV_CHOU3_ROTATED, /* Japanese Envelope Chou #3 Rotated */ + wxPAPER_JENV_CHOU4_ROTATED, /* Japanese Envelope Chou #4 Rotated */ + wxPAPER_B6_JIS, /* B6 (JIS) 128 x 182 mm */ + wxPAPER_B6_JIS_ROTATED, /* B6 (JIS) Rotated 182 x 128 mm */ + wxPAPER_12X11, /* 12 x 11 in */ + wxPAPER_JENV_YOU4, /* Japanese Envelope You #4 */ + wxPAPER_JENV_YOU4_ROTATED, /* Japanese Envelope You #4 Rotated */ + wxPAPER_P16K, /* PRC 16K 146 x 215 mm */ + wxPAPER_P32K, /* PRC 32K 97 x 151 mm */ + wxPAPER_P32KBIG, /* PRC 32K(Big) 97 x 151 mm */ + wxPAPER_PENV_1, /* PRC Envelope #1 102 x 165 mm */ + wxPAPER_PENV_2, /* PRC Envelope #2 102 x 176 mm */ + wxPAPER_PENV_3, /* PRC Envelope #3 125 x 176 mm */ + wxPAPER_PENV_4, /* PRC Envelope #4 110 x 208 mm */ + wxPAPER_PENV_5, /* PRC Envelope #5 110 x 220 mm */ + wxPAPER_PENV_6, /* PRC Envelope #6 120 x 230 mm */ + wxPAPER_PENV_7, /* PRC Envelope #7 160 x 230 mm */ + wxPAPER_PENV_8, /* PRC Envelope #8 120 x 309 mm */ + wxPAPER_PENV_9, /* PRC Envelope #9 229 x 324 mm */ + wxPAPER_PENV_10, /* PRC Envelope #10 324 x 458 mm */ + wxPAPER_P16K_ROTATED, /* PRC 16K Rotated */ + wxPAPER_P32K_ROTATED, /* PRC 32K Rotated */ + wxPAPER_P32KBIG_ROTATED, /* PRC 32K(Big) Rotated */ + wxPAPER_PENV_1_ROTATED, /* PRC Envelope #1 Rotated 165 x 102 mm */ + wxPAPER_PENV_2_ROTATED, /* PRC Envelope #2 Rotated 176 x 102 mm */ + wxPAPER_PENV_3_ROTATED, /* PRC Envelope #3 Rotated 176 x 125 mm */ + wxPAPER_PENV_4_ROTATED, /* PRC Envelope #4 Rotated 208 x 110 mm */ + wxPAPER_PENV_5_ROTATED, /* PRC Envelope #5 Rotated 220 x 110 mm */ + wxPAPER_PENV_6_ROTATED, /* PRC Envelope #6 Rotated 230 x 120 mm */ + wxPAPER_PENV_7_ROTATED, /* PRC Envelope #7 Rotated 230 x 160 mm */ + wxPAPER_PENV_8_ROTATED, /* PRC Envelope #8 Rotated 309 x 120 mm */ + wxPAPER_PENV_9_ROTATED, /* PRC Envelope #9 Rotated 324 x 229 mm */ + wxPAPER_PENV_10_ROTATED /* PRC Envelope #10 Rotated 458 x 324 m */ +} wxPaperSize; + +/* Printing orientation */ +#ifndef wxPORTRAIT +#define wxPORTRAIT 1 +#define wxLANDSCAPE 2 +#endif + +/* Duplex printing modes + */ + +enum wxDuplexMode +{ + wxDUPLEX_SIMPLEX, /* Non-duplex */ + wxDUPLEX_HORIZONTAL, + wxDUPLEX_VERTICAL +}; + +/* Print quality. + */ + +#define wxPRINT_QUALITY_HIGH -1 +#define wxPRINT_QUALITY_MEDIUM -2 +#define wxPRINT_QUALITY_LOW -3 +#define wxPRINT_QUALITY_DRAFT -4 + +typedef int wxPrintQuality; + +/* Print mode (currently PostScript only) + */ + +enum wxPrintMode +{ + wxPRINT_MODE_NONE = 0, + wxPRINT_MODE_PREVIEW = 1, /* Preview in external application */ + wxPRINT_MODE_FILE = 2, /* Print to file */ + wxPRINT_MODE_PRINTER = 3, /* Send to printer */ + wxPRINT_MODE_STREAM = 4 /* Send postscript data into a stream */ +}; + +/* ---------------------------------------------------------------------------- */ +/* UpdateWindowUI flags */ +/* ---------------------------------------------------------------------------- */ + +enum wxUpdateUI +{ + wxUPDATE_UI_NONE = 0x0000, + wxUPDATE_UI_RECURSE = 0x0001, + wxUPDATE_UI_FROMIDLE = 0x0002 /* Invoked from On(Internal)Idle */ +}; + +/* ---------------------------------------------------------------------------- */ +/* miscellaneous */ +/* ---------------------------------------------------------------------------- */ + +/* define this macro if font handling is done using the X font names */ +#if (defined(__WXGTK__) && !defined(__WXGTK20__)) || defined(__X__) + #define _WX_X_FONTLIKE +#endif + +/* macro to specify "All Files" on different platforms */ +#if defined(__WXMSW__) || defined(__WXPM__) +# define wxALL_FILES_PATTERN wxT("*.*") +# define wxALL_FILES gettext_noop("All files (*.*)|*.*") +#else +# define wxALL_FILES_PATTERN wxT("*") +# define wxALL_FILES gettext_noop("All files (*)|*") +#endif + +#if defined(__CYGWIN__) && defined(__WXMSW__) +# if wxUSE_STL || defined(wxUSE_STD_STRING) + /* + NASTY HACK because the gethostname in sys/unistd.h which the gnu + stl includes and wx builds with by default clash with each other + (windows version 2nd param is int, sys/unistd.h version is unsigned + int). + */ +# define gethostname gethostnameHACK +# include +# undef gethostname +# endif +#endif + +/* --------------------------------------------------------------------------- */ +/* macros that enable wxWidgets apps to be compiled in absence of the */ +/* sytem headers, although some platform specific types are used in the */ +/* platform specific (implementation) parts of the headers */ +/* --------------------------------------------------------------------------- */ + +#ifdef __WXMAC__ + +#define WX_OPAQUE_TYPE( name ) struct wxOpaque##name + +typedef unsigned char WXCOLORREF[6]; +typedef void* WXCGIMAGEREF; +typedef void* WXHBITMAP; +typedef void* WXHCURSOR; +typedef void* WXHRGN; +typedef void* WXRECTPTR; +typedef void* WXPOINTPTR; +typedef void* WXHWND; +typedef void* WXEVENTREF; +typedef void* WXEVENTHANDLERREF; +typedef void* WXEVENTHANDLERCALLREF; +typedef void* WXAPPLEEVENTREF; +typedef void* WXHDC; +typedef void* WXHMENU; +typedef unsigned int WXUINT; +typedef unsigned long WXDWORD; +typedef unsigned short WXWORD; + +typedef WX_OPAQUE_TYPE(CIconHandle ) * WXHICON ; +typedef WX_OPAQUE_TYPE(PicHandle ) * WXHMETAFILE ; + + +/* typedef void* WXWidget; */ +/* typedef void* WXWindow; */ +typedef WX_OPAQUE_TYPE(ControlRef ) * WXWidget ; +typedef WX_OPAQUE_TYPE(WindowRef) * WXWindow ; +typedef void* WXDisplay; + +/* typedef WindowPtr WXHWND; */ +/* typedef Handle WXHANDLE; */ +/* typedef CIconHandle WXHICON; */ +/* typedef unsigned long WXHFONT; */ +/* typedef MenuHandle WXHMENU; */ +/* typedef unsigned long WXHPEN; */ +/* typedef unsigned long WXHBRUSH; */ +/* typedef unsigned long WXHPALETTE; */ +/* typedef CursHandle WXHCURSOR; */ +/* typedef RgnHandle WXHRGN; */ +/* typedef unsigned long WXHACCEL; */ +/* typedef unsigned long WXHINSTANCE; */ +/* typedef unsigned long WXHIMAGELIST; */ +/* typedef unsigned long WXHGLOBAL; */ +/* typedef GrafPtr WXHDC; */ +/* typedef unsigned int WXWPARAM; */ +/* typedef long WXLPARAM; */ +/* typedef void * WXRGNDATA; */ +/* typedef void * WXMSG; */ +/* typedef unsigned long WXHCONV; */ +/* typedef unsigned long WXHKEY; */ +/* typedef void * WXDRAWITEMSTRUCT; */ +/* typedef void * WXMEASUREITEMSTRUCT; */ +/* typedef void * WXLPCREATESTRUCT; */ +/* typedef int (*WXFARPROC)(); */ + +/* typedef WindowPtr WXWindow; */ +/* typedef ControlHandle WXWidget; */ + +#endif + +#if defined( __WXCOCOA__ ) || ( defined(__WXMAC__) && defined(__DARWIN__) ) + +/* Definitions of 32-bit/64-bit types + * These are typedef'd exactly the same way in newer OS X headers so + * redefinition when real headers are included should not be a problem. If + * it is, the types are being defined wrongly here. + * The purpose of these types is so they can be used from public wx headers. + * and also because the older (pre-Leopard) headers don't define them. + */ + +/* NOTE: We don't pollute namespace with CGFLOAT_MIN/MAX/IS_DOUBLE macros + * since they are unlikely to be needed in a public header. + */ +#if defined(__LP64__) && __LP64__ + typedef double CGFloat; +#else + typedef float CGFloat; +#endif + +#if (defined(__LP64__) && __LP64__) || (defined(NS_BUILD_32_LIKE_64) && NS_BUILD_32_LIKE_64) +typedef long NSInteger; +typedef unsigned long NSUInteger; +#else +typedef int NSInteger; +typedef unsigned int NSUInteger; +#endif + +/* Objective-C type declarations. + * These are to be used in public headers in lieu of NSSomething* because + * Objective-C class names are not available in C/C++ code. + */ + +/* NOTE: This ought to work with other compilers too, but I'm being cautious */ +#if (defined(__GNUC__) && defined(__APPLE__)) || defined(__MWERKS__) +/* It's desirable to have type safety for Objective-C(++) code as it does +at least catch typos of method names among other things. However, it +is not possible to declare an Objective-C class from plain old C or C++ +code. Furthermore, because of C++ name mangling, the type name must +be the same for both C++ and Objective-C++ code. Therefore, we define +what should be a pointer to an Objective-C class as a pointer to a plain +old C struct with the same name. Unfortunately, because the compiler +does not see a struct as an Objective-C class we cannot declare it +as a struct in Objective-C(++) mode. +*/ +#if defined(__OBJC__) +#define DECLARE_WXCOCOA_OBJC_CLASS(klass) \ +@class klass; \ +typedef klass *WX_##klass +#else /* not defined(__OBJC__) */ +#define DECLARE_WXCOCOA_OBJC_CLASS(klass) \ +typedef struct klass *WX_##klass +#endif /* defined(__OBJC__) */ + +#else /* not Apple's GNU or CodeWarrior */ +#warning "Objective-C types will not be checked by the compiler." +/* NOTE: typedef struct objc_object *id; */ +/* IOW, we're declaring these using the id type without using that name, */ +/* since "id" is used extensively not only within wxWidgets itself, but */ +/* also in wxWidgets application code. The following works fine when */ +/* compiling C(++) code, and works without typesafety for Obj-C(++) code */ +#define DECLARE_WXCOCOA_OBJC_CLASS(klass) \ +typedef struct objc_object *WX_##klass + +#endif /* (defined(__GNUC__) && defined(__APPLE__)) || defined(__MWERKS__) */ + +DECLARE_WXCOCOA_OBJC_CLASS(NSApplication); +DECLARE_WXCOCOA_OBJC_CLASS(NSBitmapImageRep); +DECLARE_WXCOCOA_OBJC_CLASS(NSBox); +DECLARE_WXCOCOA_OBJC_CLASS(NSButton); +DECLARE_WXCOCOA_OBJC_CLASS(NSColor); +DECLARE_WXCOCOA_OBJC_CLASS(NSColorPanel); +DECLARE_WXCOCOA_OBJC_CLASS(NSControl); +DECLARE_WXCOCOA_OBJC_CLASS(NSCursor); +DECLARE_WXCOCOA_OBJC_CLASS(NSEvent); +DECLARE_WXCOCOA_OBJC_CLASS(NSFontPanel); +DECLARE_WXCOCOA_OBJC_CLASS(NSImage); +DECLARE_WXCOCOA_OBJC_CLASS(NSLayoutManager); +DECLARE_WXCOCOA_OBJC_CLASS(NSMenu); +DECLARE_WXCOCOA_OBJC_CLASS(NSMenuExtra); +DECLARE_WXCOCOA_OBJC_CLASS(NSMenuItem); +DECLARE_WXCOCOA_OBJC_CLASS(NSMutableArray); +DECLARE_WXCOCOA_OBJC_CLASS(NSNotification); +DECLARE_WXCOCOA_OBJC_CLASS(NSObject); +DECLARE_WXCOCOA_OBJC_CLASS(NSPanel); +DECLARE_WXCOCOA_OBJC_CLASS(NSScrollView); +DECLARE_WXCOCOA_OBJC_CLASS(NSSound); +DECLARE_WXCOCOA_OBJC_CLASS(NSStatusItem); +DECLARE_WXCOCOA_OBJC_CLASS(NSTableColumn); +DECLARE_WXCOCOA_OBJC_CLASS(NSTableView); +DECLARE_WXCOCOA_OBJC_CLASS(NSTextContainer); +DECLARE_WXCOCOA_OBJC_CLASS(NSTextField); +DECLARE_WXCOCOA_OBJC_CLASS(NSTextStorage); +DECLARE_WXCOCOA_OBJC_CLASS(NSThread); +DECLARE_WXCOCOA_OBJC_CLASS(NSWindow); +DECLARE_WXCOCOA_OBJC_CLASS(NSView); +#ifdef __WXMAC__ +// things added for __WXMAC__ +DECLARE_WXCOCOA_OBJC_CLASS(NSString); +#else +// things only for __WXCOCOA__ +typedef WX_NSView WXWidget; /* wxWidgets BASE definition */ +#endif +#endif /* __WXCOCOA__ || ( __WXMAC__ &__DARWIN__)*/ + +#if defined(__WXPALMOS__) + +typedef void * WXHWND; +typedef void * WXHANDLE; +typedef void * WXHICON; +typedef void * WXHFONT; +typedef void * WXHMENU; +typedef void * WXHPEN; +typedef void * WXHBRUSH; +typedef void * WXHPALETTE; +typedef void * WXHCURSOR; +typedef void * WXHRGN; +typedef void * WXHACCEL; +typedef void * WXHINSTANCE; +typedef void * WXHBITMAP; +typedef void * WXHIMAGELIST; +typedef void * WXHGLOBAL; +typedef void * WXHDC; +typedef unsigned int WXUINT; +typedef unsigned long WXDWORD; +typedef unsigned short WXWORD; + +typedef unsigned long WXCOLORREF; +typedef struct tagMSG WXMSG; + +typedef WXHWND WXWINHANDLE; /* WinHandle of PalmOS */ +typedef WXWINHANDLE WXWidget; + +typedef void * WXFORMPTR; +typedef void * WXEVENTPTR; +typedef void * WXRECTANGLEPTR; + +#endif /* __WXPALMOS__ */ + + +/* ABX: check __WIN32__ instead of __WXMSW__ for the same MSWBase in any Win32 port */ +#if defined(__WIN32__) + +/* the keywords needed for WinMain() declaration */ +#ifndef WXFAR +# define WXFAR +#endif + +/* Stand-ins for Windows types to avoid #including all of windows.h */ +typedef void * WXHWND; +typedef void * WXHANDLE; +typedef void * WXHICON; +typedef void * WXHFONT; +typedef void * WXHMENU; +typedef void * WXHPEN; +typedef void * WXHBRUSH; +typedef void * WXHPALETTE; +typedef void * WXHCURSOR; +typedef void * WXHRGN; +typedef void * WXRECTPTR; +typedef void * WXHACCEL; +typedef void WXFAR * WXHINSTANCE; +typedef void * WXHBITMAP; +typedef void * WXHIMAGELIST; +typedef void * WXHGLOBAL; +typedef void * WXHDC; +typedef unsigned int WXUINT; +typedef unsigned long WXDWORD; +typedef unsigned short WXWORD; + +typedef unsigned long WXCOLORREF; +typedef void * WXRGNDATA; +typedef struct tagMSG WXMSG; +typedef void * WXHCONV; +typedef void * WXHKEY; +typedef void * WXHTREEITEM; + +typedef void * WXDRAWITEMSTRUCT; +typedef void * WXMEASUREITEMSTRUCT; +typedef void * WXLPCREATESTRUCT; + +typedef WXHWND WXWidget; + +#ifdef __WIN64__ +typedef unsigned __int64 WXWPARAM; +typedef __int64 WXLPARAM; +typedef __int64 WXLRESULT; +#else +typedef unsigned int WXWPARAM; +typedef long WXLPARAM; +typedef long WXLRESULT; +#endif + +#if defined(__GNUWIN32__) || defined(__WXMICROWIN__) +typedef int (*WXFARPROC)(); +#else +typedef int (__stdcall *WXFARPROC)(); +#endif +#endif /* __WIN32__ */ + + +#if defined(__OS2__) +typedef unsigned long DWORD; +typedef unsigned short WORD; +#endif + +#if defined(__WXPM__) || defined(__EMX__) +#ifdef __WXPM__ +/* Stand-ins for OS/2 types, to avoid #including all of os2.h */ +typedef unsigned long WXHWND; +typedef unsigned long WXHANDLE; +typedef unsigned long WXHICON; +typedef unsigned long WXHFONT; +typedef unsigned long WXHMENU; +typedef unsigned long WXHPEN; +typedef unsigned long WXHBRUSH; +typedef unsigned long WXHPALETTE; +typedef unsigned long WXHCURSOR; +typedef unsigned long WXHRGN; +typedef unsigned long WXHACCEL; +typedef unsigned long WXHBITMAP; +typedef unsigned long WXHDC; +typedef unsigned int WXUINT; +typedef unsigned long WXDWORD; +typedef unsigned short WXWORD; + +typedef unsigned long WXCOLORREF; +typedef void * WXMSG; +typedef unsigned long WXHTREEITEM; + +typedef void * WXDRAWITEMSTRUCT; +typedef void * WXMEASUREITEMSTRUCT; +typedef void * WXLPCREATESTRUCT; + +typedef WXHWND WXWidget; +#endif +#ifdef __EMX__ +/* Need a well-known type for WXFARPROC + below. MPARAM is typedef'ed too late. */ +#define WXWPARAM void * +#define WXLPARAM void * +#else +#define WXWPARAM MPARAM +#define WXLPARAM MPARAM +#endif +#define RECT RECTL +#define LOGFONT FATTRS +#define LOWORD SHORT1FROMMP +#define HIWORD SHORT2FROMMP + +typedef unsigned long WXMPARAM; +typedef unsigned long WXMSGID; +typedef void* WXRESULT; +/* typedef int (*WXFARPROC)(); */ +/* some windows handles not defined by PM */ +typedef unsigned long HANDLE; +typedef unsigned long HICON; +typedef unsigned long HFONT; +typedef unsigned long HMENU; +typedef unsigned long HPEN; +typedef unsigned long HBRUSH; +typedef unsigned long HPALETTE; +typedef unsigned long HCURSOR; +typedef unsigned long HINSTANCE; +typedef unsigned long HIMAGELIST; +typedef unsigned long HGLOBAL; +#endif /* WXPM || EMX */ + +#if defined (__WXPM__) +/* WIN32 graphics types for OS/2 GPI */ + +/* RGB under OS2 is more like a PALETTEENTRY struct under Windows so we need a real RGB def */ +#define OS2RGB(r,g,b) ((DWORD)((unsigned char)(b) | ((unsigned char)(g) << 8)) | ((unsigned char)(r) << 16)) + +typedef unsigned long COLORREF; +#define GetRValue(rgb) ((unsigned char)((rgb) >> 16)) +#define GetGValue(rgb) ((unsigned char)(((unsigned short)(rgb)) >> 8)) +#define GetBValue(rgb) ((unsigned char)(rgb)) +#define PALETTEINDEX(i) ((COLORREF)(0x01000000 | (DWORD)(WORD)(i))) +#define PALETTERGB(r,g,b) (0x02000000 | OS2RGB(r,g,b)) +/* OS2's RGB/RGB2 is backwards from this */ +typedef struct tagPALETTEENTRY +{ + char bRed; + char bGreen; + char bBlue; + char bFlags; +} PALETTEENTRY; +typedef struct tagLOGPALETTE +{ + WORD palVersion; + WORD palNumentries; + WORD PALETTEENTRY[1]; +} LOGPALETTE; + +#if (defined(__VISAGECPP__) && (__IBMCPP__ < 400)) || defined (__WATCOMC__) + /* VA 3.0 for some reason needs base data types when typedefing a proc proto??? */ +typedef void* (_System *WXFARPROC)(unsigned long, unsigned long, void*, void*); +#else +#if defined(__EMX__) && !defined(_System) +#define _System +#endif +typedef WXRESULT (_System *WXFARPROC)(WXHWND, WXMSGID, WXWPARAM, WXLPARAM); +#endif + +#endif /* __WXPM__ */ + + +#if defined(__WXMOTIF__) || defined(__WXX11__) +/* Stand-ins for X/Xt/Motif types */ +typedef void* WXWindow; +typedef void* WXWidget; +typedef void* WXAppContext; +typedef void* WXColormap; +typedef void* WXColor; +typedef void WXDisplay; +typedef void WXEvent; +typedef void* WXCursor; +typedef void* WXPixmap; +typedef void* WXFontStructPtr; +typedef void* WXGC; +typedef void* WXRegion; +typedef void* WXFont; +typedef void* WXImage; +typedef void* WXFontList; +typedef void* WXFontSet; +typedef void* WXRendition; +typedef void* WXRenderTable; +typedef void* WXFontType; /* either a XmFontList or XmRenderTable */ +typedef void* WXString; + +typedef unsigned long Atom; /* this might fail on a few architectures */ +typedef long WXPixel; /* safety catch in src/motif/colour.cpp */ + +#endif /* Motif */ + +#ifdef __WXGTK__ + +/* Stand-ins for GLIB types */ +typedef char gchar; +typedef signed char gint8; +typedef int gint; +typedef unsigned guint; +typedef unsigned long gulong; +typedef void* gpointer; +typedef struct _GSList GSList; + +/* Stand-ins for GDK types */ +typedef struct _GdkColor GdkColor; +typedef struct _GdkColormap GdkColormap; +typedef struct _GdkFont GdkFont; +typedef struct _GdkGC GdkGC; +typedef struct _GdkVisual GdkVisual; + +#ifdef __WXGTK20__ +typedef struct _GdkAtom *GdkAtom; +typedef struct _GdkDrawable GdkWindow; +typedef struct _GdkDrawable GdkBitmap; +typedef struct _GdkDrawable GdkPixmap; +#else /* GTK+ 1.2 */ +typedef gulong GdkAtom; +typedef struct _GdkWindow GdkWindow; +typedef struct _GdkWindow GdkBitmap; +typedef struct _GdkWindow GdkPixmap; +#endif /* GTK+ 1.2/2.0 */ + +typedef struct _GdkCursor GdkCursor; +typedef struct _GdkRegion GdkRegion; +typedef struct _GdkDragContext GdkDragContext; + +#ifdef HAVE_XIM +typedef struct _GdkIC GdkIC; +typedef struct _GdkICAttr GdkICAttr; +#endif + +/* Stand-ins for GTK types */ +typedef struct _GtkWidget GtkWidget; +typedef struct _GtkRcStyle GtkRcStyle; +typedef struct _GtkAdjustment GtkAdjustment; +typedef struct _GtkList GtkList; +typedef struct _GtkToolbar GtkToolbar; +typedef struct _GtkTooltips GtkTooltips; +typedef struct _GtkNotebook GtkNotebook; +typedef struct _GtkNotebookPage GtkNotebookPage; +typedef struct _GtkAccelGroup GtkAccelGroup; +typedef struct _GtkItemFactory GtkItemFactory; +typedef struct _GtkSelectionData GtkSelectionData; +typedef struct _GtkTextBuffer GtkTextBuffer; +typedef struct _GtkRange GtkRange; + +typedef GtkWidget *WXWidget; + +#ifndef __WXGTK20__ +#define GTK_OBJECT_GET_CLASS(object) (GTK_OBJECT(object)->klass) +#define GTK_CLASS_TYPE(klass) ((klass)->type) +#endif + +#endif /* __WXGTK__ */ + +#if defined(__WXGTK20__) || (defined(__WXX11__) && wxUSE_UNICODE) +#define wxUSE_PANGO 1 +#else +#define wxUSE_PANGO 0 +#endif + +#if wxUSE_PANGO +/* Stand-ins for Pango types */ +typedef struct _PangoContext PangoContext; +typedef struct _PangoLayout PangoLayout; +typedef struct _PangoFontDescription PangoFontDescription; +#endif + +#ifdef __WXMGL__ +typedef struct window_t *WXWidget; +#endif /* MGL */ + +#ifdef __WXDFB__ +/* DirectFB doesn't have the concept of non-TLW window, so use + something arbitrary */ +typedef const void* WXWidget; +#endif /* DFB */ + +/* This is required because of clashing macros in windows.h, which may be */ +/* included before or after wxWidgets classes, and therefore must be */ +/* disabled here before any significant wxWidgets headers are included. */ +#ifdef __WXMSW__ +#include "wx/msw/winundef.h" +#endif /* __WXMSW__ */ + +/* --------------------------------------------------------------------------- */ +/* macro to define a class without copy ctor nor assignment operator */ +/* --------------------------------------------------------------------------- */ + +#define DECLARE_NO_COPY_CLASS(classname) \ + private: \ + classname(const classname&); \ + classname& operator=(const classname&); + +#define DECLARE_NO_ASSIGN_CLASS(classname) \ + private: \ + classname& operator=(const classname&); + +/* --------------------------------------------------------------------------- */ +/* If a manifest is being automatically generated, add common controls 6 to it */ +/* --------------------------------------------------------------------------- */ + +#if (!defined wxUSE_NO_MANIFEST || wxUSE_NO_MANIFEST == 0 ) && \ + ( defined _MSC_FULL_VER && _MSC_FULL_VER >= 140040130 ) + +#define WX_CC_MANIFEST(cpu) \ + "/manifestdependency:\"type='win32' \ + name='Microsoft.Windows.Common-Controls' \ + version='6.0.0.0' \ + processorArchitecture='"cpu"' \ + publicKeyToken='6595b64144ccf1df' \ + language='*'\"" + +#if defined _M_IX86 + #pragma comment(linker, WX_CC_MANIFEST("x86")) +#elif defined _M_X64 + #pragma comment(linker, WX_CC_MANIFEST("amd64")) +#elif defined _M_IA64 + #pragma comment(linker, WX_CC_MANIFEST("ia64")) +#else + #pragma comment(linker, WX_CC_MANIFEST("*")) +#endif + +#endif /* !wxUSE_NO_MANIFEST && _MSC_FULL_VER >= 140040130 */ + +#endif + /* _WX_DEFS_H_ */ diff --git a/Externals/wxWidgets/include/wx/dialog.h b/Externals/wxWidgets/include/wx/dialog.h new file mode 100644 index 0000000000..cf9dbf6c97 --- /dev/null +++ b/Externals/wxWidgets/include/wx/dialog.h @@ -0,0 +1,167 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/dialog.h +// Purpose: wxDialogBase class +// Author: Vadim Zeitlin +// Modified by: +// Created: 29.06.99 +// RCS-ID: $Id: dialog.h 49804 2007-11-10 01:09:42Z VZ $ +// Copyright: (c) Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DIALOG_H_BASE_ +#define _WX_DIALOG_H_BASE_ + +#include "wx/defs.h" +#include "wx/containr.h" +#include "wx/toplevel.h" + +class WXDLLIMPEXP_FWD_CORE wxSizer; +class WXDLLIMPEXP_FWD_CORE wxStdDialogButtonSizer; + +#define wxDIALOG_NO_PARENT 0x0001 // Don't make owned by apps top window + +#ifdef __WXWINCE__ +#define wxDEFAULT_DIALOG_STYLE (wxCAPTION | wxMAXIMIZE | wxCLOSE_BOX | wxNO_BORDER) +#else +#define wxDEFAULT_DIALOG_STYLE (wxCAPTION | wxSYSTEM_MENU | wxCLOSE_BOX) +#endif + +extern WXDLLEXPORT_DATA(const wxChar) wxDialogNameStr[]; + +class WXDLLEXPORT wxDialogBase : public wxTopLevelWindow +{ +public: + enum + { + // all flags allowed in wxDialogBase::CreateButtonSizer() + ButtonSizerFlags = wxOK|wxCANCEL|wxYES|wxNO|wxHELP|wxNO_DEFAULT + }; + + wxDialogBase() { Init(); } + virtual ~wxDialogBase() { } + + // define public wxDialog methods to be implemented by the derived classes + virtual int ShowModal() = 0; + virtual void EndModal(int retCode) = 0; + virtual bool IsModal() const = 0; + + + // Modal dialogs have a return code - usually the id of the last + // pressed button + void SetReturnCode(int returnCode) { m_returnCode = returnCode; } + int GetReturnCode() const { return m_returnCode; } + + // Set the identifier for the affirmative button: this button will close + // the dialog after validating data and calling TransferDataFromWindow() + void SetAffirmativeId(int affirmativeId); + int GetAffirmativeId() const { return m_affirmativeId; } + + // Set identifier for Esc key translation: the button with this id will + // close the dialog without doing anything else; special value wxID_NONE + // means to not handle Esc at all while wxID_ANY means to map Esc to + // wxID_CANCEL if present and GetAffirmativeId() otherwise + void SetEscapeId(int escapeId); + int GetEscapeId() const { return m_escapeId; } + +#if wxUSE_STATTEXT // && wxUSE_TEXTCTRL + // splits text up at newlines and places the + // lines into a vertical wxBoxSizer + wxSizer *CreateTextSizer( const wxString &message ); +#endif // wxUSE_STATTEXT // && wxUSE_TEXTCTRL + + // returns a horizontal wxBoxSizer containing the given buttons + // + // notice that the returned sizer can be NULL if no buttons are put in the + // sizer (this mostly happens under smart phones and other atypical + // platforms which have hardware buttons replacing OK/Cancel and such) + wxSizer *CreateButtonSizer(long flags); + + // returns the sizer containing CreateButtonSizer() below a separating + // static line for the platforms which use static lines for items + // separation (i.e. not Mac) + wxSizer *CreateSeparatedButtonSizer(long flags); + +#if wxUSE_BUTTON + wxStdDialogButtonSizer *CreateStdDialogButtonSizer( long flags ); +#endif // wxUSE_BUTTON + +protected: + // emulate click of a button with the given id if it's present in the dialog + // + // return true if button was "clicked" or false if we don't have it + bool EmulateButtonClickIfPresent(int id); + + // this function is used by OnCharHook() to decide whether the given key + // should close the dialog + // + // for most platforms the default implementation (which just checks for + // Esc) is sufficient, but Mac port also adds Cmd-. here and other ports + // could do something different if needed + virtual bool IsEscapeKey(const wxKeyEvent& event); + + // end either modal or modeless dialog, for the modal dialog rc is used as + // the dialog return code + void EndDialog(int rc); + + // call Validate() and TransferDataFromWindow() and close dialog with + // wxID_OK return code + void AcceptAndClose(); + + + // The return code from modal dialog + int m_returnCode; + + // The identifier for the affirmative button (usually wxID_OK) + int m_affirmativeId; + + // The identifier for cancel button (usually wxID_CANCEL) + int m_escapeId; + +private: + // common part of all ctors + void Init(); + + // handle Esc key presses + void OnCharHook(wxKeyEvent& event); + + // handle closing the dialog window + void OnCloseWindow(wxCloseEvent& event); + + // handle the standard buttons + void OnButton(wxCommandEvent& event); + + // update the background colour + void OnSysColourChanged(wxSysColourChangedEvent& event); + + + DECLARE_NO_COPY_CLASS(wxDialogBase) + DECLARE_EVENT_TABLE() + WX_DECLARE_CONTROL_CONTAINER(); +}; + + +#if defined(__WXUNIVERSAL__) && !defined(__WXMICROWIN__) + #include "wx/univ/dialog.h" +#else + #if defined(__WXPALMOS__) + #include "wx/palmos/dialog.h" + #elif defined(__WXMSW__) + #include "wx/msw/dialog.h" + #elif defined(__WXMOTIF__) + #include "wx/motif/dialog.h" + #elif defined(__WXGTK20__) + #include "wx/gtk/dialog.h" + #elif defined(__WXGTK__) + #include "wx/gtk1/dialog.h" + #elif defined(__WXMAC__) + #include "wx/mac/dialog.h" + #elif defined(__WXCOCOA__) + #include "wx/cocoa/dialog.h" + #elif defined(__WXPM__) + #include "wx/os2/dialog.h" + #endif +#endif + +#endif + // _WX_DIALOG_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/dialup.h b/Externals/wxWidgets/include/wx/dialup.h new file mode 100644 index 0000000000..b86e70cba8 --- /dev/null +++ b/Externals/wxWidgets/include/wx/dialup.h @@ -0,0 +1,201 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/dialup.h +// Purpose: Network related wxWidgets classes and functions +// Author: Vadim Zeitlin +// Modified by: +// Created: 07.07.99 +// RCS-ID: $Id: dialup.h 49804 2007-11-10 01:09:42Z VZ $ +// Copyright: (c) Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DIALUP_H +#define _WX_DIALUP_H + +#if wxUSE_DIALUP_MANAGER + +#include "wx/event.h" + +// ---------------------------------------------------------------------------- +// misc +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_BASE wxArrayString; + +#define WXDIALUP_MANAGER_DEFAULT_BEACONHOST wxT("www.yahoo.com") + +// ---------------------------------------------------------------------------- +// A class which groups functions dealing with connecting to the network from a +// workstation using dial-up access to the net. There is at most one instance +// of this class in the program accessed via GetDialUpManager(). +// ---------------------------------------------------------------------------- + +/* TODO + * + * 1. more configurability for Unix: i.e. how to initiate the connection, how + * to check for online status, &c. + * 2. a function to enumerate all connections (ISPs) and show a dialog in + * Dial() allowing to choose between them if no ISP given + * 3. add an async version of dialing functions which notify the caller about + * the progress (or may be even start another thread to monitor it) + * 4. the static creation/accessor functions are not MT-safe - but is this + * really crucial? I think we may suppose they're always called from the + * main thread? + */ + +class WXDLLEXPORT wxDialUpManager +{ +public: + // this function should create and return the object of the + // platform-specific class derived from wxDialUpManager. It's implemented + // in the platform-specific source files. + static wxDialUpManager *Create(); + + // could the dialup manager be initialized correctly? If this function + // returns false, no other functions will work neither, so it's a good idea + // to call this function and check its result before calling any other + // wxDialUpManager methods + virtual bool IsOk() const = 0; + + // virtual dtor for any base class + virtual ~wxDialUpManager() { } + + // operations + // ---------- + + // fills the array with the names of all possible values for the first + // parameter to Dial() on this machine and returns their number (may be 0) + virtual size_t GetISPNames(wxArrayString& names) const = 0; + + // dial the given ISP, use username and password to authentificate + // + // if no nameOfISP is given, the function will select the default one + // + // if no username/password are given, the function will try to do without + // them, but will ask the user if really needed + // + // if async parameter is false, the function waits until the end of dialing + // and returns true upon successful completion. + // if async is true, the function only initiates the connection and returns + // immediately - the result is reported via events (an event is sent + // anyhow, but if dialing failed it will be a DISCONNECTED one) + virtual bool Dial(const wxString& nameOfISP = wxEmptyString, + const wxString& username = wxEmptyString, + const wxString& password = wxEmptyString, + bool async = true) = 0; + + // returns true if (async) dialing is in progress + virtual bool IsDialing() const = 0; + + // cancel dialing the number initiated with Dial(async = true) + // NB: this won't result in DISCONNECTED event being sent + virtual bool CancelDialing() = 0; + + // hang up the currently active dial up connection + virtual bool HangUp() = 0; + + // online status + // ------------- + + // returns true if the computer has a permanent network connection (i.e. is + // on a LAN) and so there is no need to use Dial() function to go online + // + // NB: this functions tries to guess the result and it is not always + // guaranteed to be correct, so it's better to ask user for + // confirmation or give him a possibility to override it + virtual bool IsAlwaysOnline() const = 0; + + // returns true if the computer is connected to the network: under Windows, + // this just means that a RAS connection exists, under Unix we check that + // the "well-known host" (as specified by SetWellKnownHost) is reachable + virtual bool IsOnline() const = 0; + + // sometimes the built-in logic for determining the online status may fail, + // so, in general, the user should be allowed to override it. This function + // allows to forcefully set the online status - whatever our internal + // algorithm may think about it. + virtual void SetOnlineStatus(bool isOnline = true) = 0; + + // set misc wxDialUpManager options + // -------------------------------- + + // enable automatical checks for the connection status and sending of + // wxEVT_DIALUP_CONNECTED/wxEVT_DIALUP_DISCONNECTED events. The interval + // parameter is only for Unix where we do the check manually: under + // Windows, the notification about the change of connection status is + // instantenous. + // + // Returns false if couldn't set up automatic check for online status. + virtual bool EnableAutoCheckOnlineStatus(size_t nSeconds = 60) = 0; + + // disable automatic check for connection status change - notice that the + // wxEVT_DIALUP_XXX events won't be sent any more neither. + virtual void DisableAutoCheckOnlineStatus() = 0; + + // additional Unix-only configuration + // ---------------------------------- + + // under Unix, the value of well-known host is used to check whether we're + // connected to the internet. It's unused under Windows, but this function + // is always safe to call. The default value is www.yahoo.com. + virtual void SetWellKnownHost(const wxString& hostname, + int portno = 80) = 0; + + // Sets the commands to start up the network and to hang up again. Used by + // the Unix implementations only. + virtual void + SetConnectCommand(const wxString& commandDial = wxT("/usr/bin/pon"), + const wxString& commandHangup = wxT("/usr/bin/poff")) = 0; +}; + +// ---------------------------------------------------------------------------- +// wxDialUpManager events +// ---------------------------------------------------------------------------- + +BEGIN_DECLARE_EVENT_TYPES() + DECLARE_EVENT_TYPE(wxEVT_DIALUP_CONNECTED, 450) + DECLARE_EVENT_TYPE(wxEVT_DIALUP_DISCONNECTED, 451) +END_DECLARE_EVENT_TYPES() + +// the event class for the dialup events +class WXDLLEXPORT wxDialUpEvent : public wxEvent +{ +public: + wxDialUpEvent(bool isConnected, bool isOwnEvent) : wxEvent(isOwnEvent) + { + SetEventType(isConnected ? wxEVT_DIALUP_CONNECTED + : wxEVT_DIALUP_DISCONNECTED); + } + + // is this a CONNECTED or DISCONNECTED event? + bool IsConnectedEvent() const + { return GetEventType() == wxEVT_DIALUP_CONNECTED; } + + // does this event come from wxDialUpManager::Dial() or from some extrenal + // process (i.e. does it result from our own attempt to establish the + // connection)? + bool IsOwnEvent() const { return m_id != 0; } + + // implement the base class pure virtual + virtual wxEvent *Clone() const { return new wxDialUpEvent(*this); } + +private: + DECLARE_NO_ASSIGN_CLASS(wxDialUpEvent) +}; + +// the type of dialup event handler function +typedef void (wxEvtHandler::*wxDialUpEventFunction)(wxDialUpEvent&); + +#define wxDialUpEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxDialUpEventFunction, &func) + +// macros to catch dialup events +#define EVT_DIALUP_CONNECTED(func) \ + wx__DECLARE_EVT0(wxEVT_DIALUP_CONNECTED, wxDialUpEventHandler(func)) +#define EVT_DIALUP_DISCONNECTED(func) \ + wx__DECLARE_EVT0(wxEVT_DIALUP_DISCONNECTED, wxDialUpEventHandler(func)) + + +#endif // wxUSE_DIALUP_MANAGER + +#endif // _WX_DIALUP_H diff --git a/Externals/wxWidgets/include/wx/dir.h b/Externals/wxWidgets/include/wx/dir.h new file mode 100644 index 0000000000..255f15195f --- /dev/null +++ b/Externals/wxWidgets/include/wx/dir.h @@ -0,0 +1,161 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/dir.h +// Purpose: wxDir is a class for enumerating the files in a directory +// Author: Vadim Zeitlin +// Modified by: +// Created: 08.12.99 +// RCS-ID: $Id: dir.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) 1999 Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DIR_H_ +#define _WX_DIR_H_ + +#include "wx/longlong.h" +#include "wx/string.h" + +class WXDLLIMPEXP_FWD_BASE wxArrayString; + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// these flags define what kind of filenames is included in the list of files +// enumerated by GetFirst/GetNext +enum +{ + wxDIR_FILES = 0x0001, // include files + wxDIR_DIRS = 0x0002, // include directories + wxDIR_HIDDEN = 0x0004, // include hidden files + wxDIR_DOTDOT = 0x0008, // include '.' and '..' + + // by default, enumerate everything except '.' and '..' + wxDIR_DEFAULT = wxDIR_FILES | wxDIR_DIRS | wxDIR_HIDDEN +}; + +// these constants are possible return value of wxDirTraverser::OnDir() +enum wxDirTraverseResult +{ + wxDIR_IGNORE = -1, // ignore this directory but continue with others + wxDIR_STOP, // stop traversing + wxDIR_CONTINUE // continue into this directory +}; + +// ---------------------------------------------------------------------------- +// wxDirTraverser: helper class for wxDir::Traverse() +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxDirTraverser +{ +public: + /// a virtual dtor has been provided since this class has virtual members + virtual ~wxDirTraverser() { } + // called for each file found by wxDir::Traverse() + // + // return wxDIR_STOP or wxDIR_CONTINUE from here (wxDIR_IGNORE doesn't + // make sense) + virtual wxDirTraverseResult OnFile(const wxString& filename) = 0; + + // called for each directory found by wxDir::Traverse() + // + // return one of the enum elements defined above + virtual wxDirTraverseResult OnDir(const wxString& dirname) = 0; + + // called for each directory which we couldn't open during our traversal + // of the directory tyree + // + // this method can also return either wxDIR_STOP, wxDIR_IGNORE or + // wxDIR_CONTINUE but the latter is treated specially: it means to retry + // opening the directory and so may lead to infinite loop if it is + // returned unconditionally, be careful with this! + // + // the base class version always returns wxDIR_IGNORE + virtual wxDirTraverseResult OnOpenError(const wxString& dirname); +}; + +// ---------------------------------------------------------------------------- +// wxDir: portable equivalent of {open/read/close}dir functions +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxDirData; + +class WXDLLIMPEXP_BASE wxDir +{ +public: + // test for existence of a directory with the given name + static bool Exists(const wxString& dir); + + // ctors + // ----- + + // default, use Open() + wxDir() { m_data = NULL; } + + // opens the directory for enumeration, use IsOpened() to test success + wxDir(const wxString& dir); + + // dtor cleans up the associated ressources + ~wxDir(); + + // open the directory for enumerating + bool Open(const wxString& dir); + + // returns true if the directory was successfully opened + bool IsOpened() const; + + // get the full name of the directory (without '/' at the end) + wxString GetName() const; + + // file enumeration routines + // ------------------------- + + // start enumerating all files matching filespec (or all files if it is + // empty) and flags, return true on success + bool GetFirst(wxString *filename, + const wxString& filespec = wxEmptyString, + int flags = wxDIR_DEFAULT) const; + + // get next file in the enumeration started with GetFirst() + bool GetNext(wxString *filename) const; + + // return true if this directory has any files in it + bool HasFiles(const wxString& spec = wxEmptyString); + + // return true if this directory has any subdirectories + bool HasSubDirs(const wxString& spec = wxEmptyString); + + // enumerate all files in this directory and its subdirectories + // + // return the number of files found + size_t Traverse(wxDirTraverser& sink, + const wxString& filespec = wxEmptyString, + int flags = wxDIR_DEFAULT) const; + + // simplest version of Traverse(): get the names of all files under this + // directory into filenames array, return the number of files + static size_t GetAllFiles(const wxString& dirname, + wxArrayString *files, + const wxString& filespec = wxEmptyString, + int flags = wxDIR_DEFAULT); + + // check if there any files matching the given filespec under the given + // directory (i.e. searches recursively), return the file path if found or + // empty string otherwise + static wxString FindFirst(const wxString& dirname, + const wxString& filespec, + int flags = wxDIR_DEFAULT); + + // returns the size of all directories recursively found in given path + static wxULongLong GetTotalSize(const wxString &dir, wxArrayString *filesSkipped = NULL); + +private: + friend class wxDirData; + + wxDirData *m_data; + + DECLARE_NO_COPY_CLASS(wxDir) +}; + +#endif // _WX_DIR_H_ + diff --git a/Externals/wxWidgets/include/wx/dirctrl.h b/Externals/wxWidgets/include/wx/dirctrl.h new file mode 100644 index 0000000000..90a3694ba1 --- /dev/null +++ b/Externals/wxWidgets/include/wx/dirctrl.h @@ -0,0 +1,18 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/dirctrl.h +// Purpose: Directory control base header +// Author: Julian Smart +// Modified by: +// Created: +// Copyright: (c) Julian Smart +// RCS-ID: $Id: dirctrl.h 33948 2005-05-04 18:57:50Z JS $ +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DIRCTRL_H_BASE_ +#define _WX_DIRCTRL_H_BASE_ + +#include "wx/generic/dirctrlg.h" + +#endif + // _WX_DIRCTRL_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/dirdlg.h b/Externals/wxWidgets/include/wx/dirdlg.h new file mode 100644 index 0000000000..8c6d2f8fec --- /dev/null +++ b/Externals/wxWidgets/include/wx/dirdlg.h @@ -0,0 +1,141 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/dirdlg.h +// Purpose: wxDirDialog base class +// Author: Robert Roebling +// Modified by: +// Created: +// Copyright: (c) Robert Roebling +// RCS-ID: $Id: dirdlg.h 44027 2006-12-21 19:26:48Z VZ $ +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DIRDLG_H_BASE_ +#define _WX_DIRDLG_H_BASE_ + +#if wxUSE_DIRDLG + +#include "wx/dialog.h" + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +extern WXDLLEXPORT_DATA(const wxChar) wxDirDialogNameStr[]; +extern WXDLLEXPORT_DATA(const wxChar) wxDirDialogDefaultFolderStr[]; +extern WXDLLEXPORT_DATA(const wxChar) wxDirSelectorPromptStr[]; + +#define wxDD_CHANGE_DIR 0x0100 +#define wxDD_DIR_MUST_EXIST 0x0200 + +// deprecated, on by default now, use wxDD_DIR_MUST_EXIST to disable it +#define wxDD_NEW_DIR_BUTTON 0 + +#ifdef __WXWINCE__ + #define wxDD_DEFAULT_STYLE wxDEFAULT_DIALOG_STYLE +#else + #define wxDD_DEFAULT_STYLE (wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER) +#endif + +//------------------------------------------------------------------------- +// wxDirDialogBase +//------------------------------------------------------------------------- + +class WXDLLEXPORT wxDirDialogBase : public wxDialog +{ +public: + wxDirDialogBase() {} + wxDirDialogBase(wxWindow *parent, + const wxString& title = wxDirSelectorPromptStr, + const wxString& defaultPath = wxEmptyString, + long style = wxDD_DEFAULT_STYLE, + const wxPoint& pos = wxDefaultPosition, + const wxSize& sz = wxDefaultSize, + const wxString& name = wxDirDialogNameStr) + { + Create(parent, title, defaultPath, style, pos, sz, name); + } + + virtual ~wxDirDialogBase() {} + + + bool Create(wxWindow *parent, + const wxString& title = wxDirSelectorPromptStr, + const wxString& defaultPath = wxEmptyString, + long style = wxDD_DEFAULT_STYLE, + const wxPoint& pos = wxDefaultPosition, + const wxSize& sz = wxDefaultSize, + const wxString& name = wxDirDialogNameStr) + { + if (!wxDialog::Create(parent, wxID_ANY, title, pos, sz, style, name)) + return false; + m_path = defaultPath; + m_message = title; + return true; + } + +#if WXWIN_COMPATIBILITY_2_6 + + wxDEPRECATED( long GetStyle() const ); + wxDEPRECATED( void SetStyle(long style) ); + +#endif // WXWIN_COMPATIBILITY_2_6 + + virtual void SetMessage(const wxString& message) { m_message = message; } + virtual void SetPath(const wxString& path) { m_path = path; } + + virtual wxString GetMessage() const { return m_message; } + virtual wxString GetPath() const { return m_path; } + +protected: + wxString m_message; + wxString m_path; +}; + + +// Universal and non-port related switches with need for generic implementation +#if defined(__WXUNIVERSAL__) + #include "wx/generic/dirdlgg.h" + #define wxDirDialog wxGenericDirDialog +#elif defined(__WXMSW__) && (defined(__SALFORDC__) || \ + !wxUSE_OLE || \ + (defined (__GNUWIN32__) && !wxUSE_NORLANDER_HEADERS)) + #include "wx/generic/dirdlgg.h" + #define wxDirDialog wxGenericDirDialog +#elif defined(__WXMSW__) && defined(__WXWINCE__) && !defined(__HANDHELDPC__) + #include "wx/generic/dirdlgg.h" // MS PocketPC or MS Smartphone + #define wxDirDialog wxGenericDirDialog +#elif defined(__WXMSW__) + #include "wx/msw/dirdlg.h" // Native MSW +#elif defined(__WXGTK24__) + #include "wx/gtk/dirdlg.h" // Native GTK for gtk2.4 +#elif defined(__WXGTK__) + #include "wx/generic/dirdlgg.h" + #define wxDirDialog wxGenericDirDialog +#elif defined(__WXMAC__) + #include "wx/mac/dirdlg.h" // Native Mac +#elif defined(__WXCOCOA__) + #include "wx/cocoa/dirdlg.h" // Native Cocoa +#elif defined(__WXMOTIF__) || \ + defined(__WXX11__) || \ + defined(__WXMGL__) || \ + defined(__WXCOCOA__) || \ + defined(__WXPM__) + #include "wx/generic/dirdlgg.h" // Other ports use generic implementation + #define wxDirDialog wxGenericDirDialog +#endif + +// ---------------------------------------------------------------------------- +// common ::wxDirSelector() function +// ---------------------------------------------------------------------------- + +WXDLLEXPORT wxString +wxDirSelector(const wxString& message = wxDirSelectorPromptStr, + const wxString& defaultPath = wxEmptyString, + long style = wxDD_DEFAULT_STYLE, + const wxPoint& pos = wxDefaultPosition, + wxWindow *parent = NULL); + +#endif // wxUSE_DIRDLG + +#endif + // _WX_DIRDLG_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/display.h b/Externals/wxWidgets/include/wx/display.h new file mode 100644 index 0000000000..98a52ec305 --- /dev/null +++ b/Externals/wxWidgets/include/wx/display.h @@ -0,0 +1,128 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/display.h +// Purpose: wxDisplay class +// Author: Royce Mitchell III, Vadim Zeitlin +// Created: 06/21/02 +// RCS-ID: $Id: display.h 49804 2007-11-10 01:09:42Z VZ $ +// Copyright: (c) 2002-2006 wxWidgets team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DISPLAY_H_BASE_ +#define _WX_DISPLAY_H_BASE_ + +// NB: no #if wxUSE_DISPLAY here, the display geometry part of this class (but +// not the video mode stuff) is always available but if wxUSE_DISPLAY == 0 +// it becomes just a trivial wrapper around the old wxDisplayXXX() functions + +#if wxUSE_DISPLAY + #include "wx/dynarray.h" + #include "wx/vidmode.h" + + WX_DECLARE_EXPORTED_OBJARRAY(wxVideoMode, wxArrayVideoModes); + + // default, uninitialized, video mode object + extern WXDLLEXPORT_DATA(const wxVideoMode) wxDefaultVideoMode; +#endif // wxUSE_DISPLAY + +class WXDLLIMPEXP_FWD_CORE wxWindow; +class WXDLLIMPEXP_FWD_CORE wxPoint; +class WXDLLIMPEXP_FWD_CORE wxRect; +class WXDLLIMPEXP_FWD_BASE wxString; + +class WXDLLIMPEXP_FWD_CORE wxDisplayFactory; +class WXDLLIMPEXP_FWD_CORE wxDisplayImpl; + +// ---------------------------------------------------------------------------- +// wxDisplay: represents a display/monitor attached to the system +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxDisplay +{ +public: + // initialize the object containing all information about the given + // display + // + // the displays are numbered from 0 to GetCount() - 1, 0 is always the + // primary display and the only one which is always supported + wxDisplay(unsigned n = 0); + + // dtor is not virtual as this is a concrete class not meant to be derived + // from + ~wxDisplay(); + + + // return the number of available displays, valid parameters to + // wxDisplay ctor are from 0 up to this number + static unsigned GetCount(); + + // find the display where the given point lies, return wxNOT_FOUND if + // it doesn't belong to any display + static int GetFromPoint(const wxPoint& pt); + + // find the display where the given window lies, return wxNOT_FOUND if it + // is not shown at all + static int GetFromWindow(wxWindow *window); + + + // return true if the object was initialized successfully + bool IsOk() const { return m_impl != NULL; } + + // get the full display size + wxRect GetGeometry() const; + + // get the client area of the display, i.e. without taskbars and such + wxRect GetClientArea() const; + + // name may be empty + wxString GetName() const; + + // display 0 is usually the primary display + bool IsPrimary() const; + + +#if wxUSE_DISPLAY + // enumerate all video modes supported by this display matching the given + // one (in the sense of wxVideoMode::Match()) + // + // as any mode matches the default value of the argument and there is + // always at least one video mode supported by display, the returned array + // is only empty for the default value of the argument if this function is + // not supported at all on this platform + wxArrayVideoModes + GetModes(const wxVideoMode& mode = wxDefaultVideoMode) const; + + // get current video mode + wxVideoMode GetCurrentMode() const; + + // change current mode, return true if succeeded, false otherwise + // + // for the default value of the argument restores the video mode to default + bool ChangeMode(const wxVideoMode& mode = wxDefaultVideoMode); + + // restore the default video mode (just a more readable synonym) + void ResetMode() { (void)ChangeMode(); } +#endif // wxUSE_DISPLAY + +private: + // returns the factory used to implement our static methods and create new + // displays + static wxDisplayFactory& Factory(); + + // creates the factory object, called by Factory() when it is called for + // the first time and should return a pointer allocated with new (the + // caller will delete it) + // + // this method must be implemented in platform-specific code if + // wxUSE_DISPLAY == 1 (if it is 0 we provide the stub in common code) + static wxDisplayFactory *CreateFactory(); + + + // the real implementation + wxDisplayImpl *m_impl; + + + DECLARE_NO_COPY_CLASS(wxDisplay) +}; + +#endif // _WX_DISPLAY_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/display_impl.h b/Externals/wxWidgets/include/wx/display_impl.h new file mode 100644 index 0000000000..8c38f6522a --- /dev/null +++ b/Externals/wxWidgets/include/wx/display_impl.h @@ -0,0 +1,110 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/display_impl.h +// Purpose: wxDisplayImpl class declaration +// Author: Vadim Zeitlin +// Created: 2006-03-15 +// RCS-ID: $Id: display_impl.h 41548 2006-10-02 05:38:05Z PC $ +// Copyright: (c) 2002-2006 Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DISPLAY_IMPL_H_BASE_ +#define _WX_DISPLAY_IMPL_H_BASE_ + +#include "wx/gdicmn.h" // for wxRect + +// ---------------------------------------------------------------------------- +// wxDisplayFactory: allows to create wxDisplay objects +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxDisplayFactory +{ +public: + wxDisplayFactory() { } + virtual ~wxDisplayFactory() { } + + // create a new display object + // + // it can return a NULL pointer if the display creation failed + virtual wxDisplayImpl *CreateDisplay(unsigned n) = 0; + + // get the total number of displays + virtual unsigned GetCount() = 0; + + // return the display for the given point or wxNOT_FOUND + virtual int GetFromPoint(const wxPoint& pt) = 0; + + // return the display for the given window or wxNOT_FOUND + // + // the window pointer must not be NULL (i.e. caller should check it) + virtual int GetFromWindow(wxWindow *window); +}; + +// ---------------------------------------------------------------------------- +// wxDisplayImpl: base class for all wxDisplay implementations +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxDisplayImpl +{ +public: + // virtual dtor for this base class + virtual ~wxDisplayImpl() { } + + + // return the full area of this display + virtual wxRect GetGeometry() const = 0; + + // return the area of the display available for normal windows + virtual wxRect GetClientArea() const { return GetGeometry(); } + + // return the name (may be empty) + virtual wxString GetName() const = 0; + + // return the index of this display + unsigned GetIndex() const { return m_index; } + + // return true if this is the primary monitor (usually one with index 0) + virtual bool IsPrimary() const { return GetIndex() == 0; } + + +#if wxUSE_DISPLAY + // implements wxDisplay::GetModes() + virtual wxArrayVideoModes GetModes(const wxVideoMode& mode) const = 0; + + // get current video mode + virtual wxVideoMode GetCurrentMode() const = 0; + + // change current mode, return true if succeeded, false otherwise + virtual bool ChangeMode(const wxVideoMode& mode) = 0; +#endif // wxUSE_DISPLAY + +protected: + // create the object providing access to the display with the given index + wxDisplayImpl(unsigned n) : m_index(n) { } + + + // the index of this display (0 is always the primary one) + const unsigned m_index; + + + friend class wxDisplayFactory; + + DECLARE_NO_COPY_CLASS(wxDisplayImpl) +}; + +// ---------------------------------------------------------------------------- +// wxDisplayFactorySingle +// ---------------------------------------------------------------------------- + +// this is a stub implementation using single/main display only, it is +// available even if wxUSE_DISPLAY == 0 +class WXDLLEXPORT wxDisplayFactorySingle : public wxDisplayFactory +{ +public: + virtual wxDisplayImpl *CreateDisplay(unsigned n); + virtual unsigned GetCount() { return 1; } + virtual int GetFromPoint(const wxPoint& pt); +}; + +#endif // _WX_DISPLAY_IMPL_H_BASE_ + diff --git a/Externals/wxWidgets/include/wx/dlimpexp.h b/Externals/wxWidgets/include/wx/dlimpexp.h new file mode 100644 index 0000000000..743785e04a --- /dev/null +++ b/Externals/wxWidgets/include/wx/dlimpexp.h @@ -0,0 +1,275 @@ +/* + * Name: wx/dlimpexp.h + * Purpose: Macros for declaring DLL-imported/exported functions + * Author: Vadim Zeitlin + * Modified by: + * Created: 16.10.2003 (extracted from wx/defs.h) + * RCS-ID: $Id: dlimpexp.h 49563 2007-10-31 20:46:21Z VZ $ + * Copyright: (c) 2003 Vadim Zeitlin + * Licence: wxWindows licence + */ + +/* + This is a C file, not C++ one, do not use C++ comments here! + */ + +#ifndef _WX_DLIMPEXP_H_ +#define _WX_DLIMPEXP_H_ + +#if defined(__WXMSW__) + /* + __declspec works in BC++ 5 and later, Watcom C++ 11.0 and later as well + as VC++ and gcc + */ +# if defined(__VISUALC__) || defined(__BORLANDC__) || defined(__GNUC__) || defined(__WATCOMC__) +# define WXEXPORT __declspec(dllexport) +# define WXIMPORT __declspec(dllimport) +# else /* compiler doesn't support __declspec() */ +# define WXEXPORT +# define WXIMPORT +# endif +#elif defined(__WXPM__) +# if defined (__WATCOMC__) +# define WXEXPORT __declspec(dllexport) + /* + __declspec(dllimport) prepends __imp to imported symbols. We do NOT + want that! + */ +# define WXIMPORT +# elif defined(__EMX__) +# define WXEXPORT +# define WXIMPORT +# elif (!(defined(__VISAGECPP__) && (__IBMCPP__ < 400 || __IBMC__ < 400 ))) +# define WXEXPORT _Export +# define WXIMPORT _Export +# endif +#elif defined(__WXMAC__) || defined(__WXCOCOA__) +# ifdef __MWERKS__ +# define WXEXPORT __declspec(export) +# define WXIMPORT __declspec(import) +# endif +#elif defined(__CYGWIN__) +# define WXEXPORT __declspec(dllexport) +# define WXIMPORT __declspec(dllimport) +#endif + +/* for other platforms/compilers we don't anything */ +#ifndef WXEXPORT +# define WXEXPORT +# define WXIMPORT +#endif + +/* + We support building wxWidgets as a set of several libraries but we don't + support arbitrary combinations of libs/DLLs: either we build all of them as + DLLs (in which case WXMAKINGDLL is defined) or none (it isn't). + + However we have a problem because we need separate WXDLLEXPORT versions for + different libraries as, for example, wxString class should be dllexported + when compiled in wxBase and dllimported otherwise, so we do define separate + WXMAKING/USINGDLL_XYZ constants for each component XYZ. + */ +#ifdef WXMAKINGDLL +# if wxUSE_BASE +# define WXMAKINGDLL_BASE +# endif + +# define WXMAKINGDLL_NET +# define WXMAKINGDLL_CORE +# define WXMAKINGDLL_ADV +# define WXMAKINGDLL_QA +# define WXMAKINGDLL_ODBC +# define WXMAKINGDLL_DBGRID +# define WXMAKINGDLL_HTML +# define WXMAKINGDLL_GL +# define WXMAKINGDLL_XML +# define WXMAKINGDLL_XRC +# define WXMAKINGDLL_AUI +# define WXMAKINGDLL_RICHTEXT +# define WXMAKINGDLL_MEDIA +#endif /* WXMAKINGDLL */ + +/* + WXDLLEXPORT maps to export declaration when building the DLL, to import + declaration if using it or to nothing at all if we don't use wxWin as DLL + */ +#ifdef WXMAKINGDLL_BASE +# define WXDLLIMPEXP_BASE WXEXPORT +# define WXDLLIMPEXP_DATA_BASE(type) WXEXPORT type +#elif defined(WXUSINGDLL) +# define WXDLLIMPEXP_BASE WXIMPORT +# define WXDLLIMPEXP_DATA_BASE(type) WXIMPORT type +#else /* not making nor using DLL */ +# define WXDLLIMPEXP_BASE +# define WXDLLIMPEXP_DATA_BASE(type) type +#endif + +#ifdef WXMAKINGDLL_NET +# define WXDLLIMPEXP_NET WXEXPORT +# define WXDLLIMPEXP_DATA_NET(type) WXEXPORT type +#elif defined(WXUSINGDLL) +# define WXDLLIMPEXP_NET WXIMPORT +# define WXDLLIMPEXP_DATA_NET(type) WXIMPORT type +#else /* not making nor using DLL */ +# define WXDLLIMPEXP_NET +# define WXDLLIMPEXP_DATA_NET(type) type +#endif + +#ifdef WXMAKINGDLL_CORE +# define WXDLLIMPEXP_CORE WXEXPORT +# define WXDLLIMPEXP_DATA_CORE(type) WXEXPORT type +#elif defined(WXUSINGDLL) +# define WXDLLIMPEXP_CORE WXIMPORT +# define WXDLLIMPEXP_DATA_CORE(type) WXIMPORT type +#else /* not making nor using DLL */ +# define WXDLLIMPEXP_CORE +# define WXDLLIMPEXP_DATA_CORE(type) type +#endif + +#ifdef WXMAKINGDLL_ADV +# define WXDLLIMPEXP_ADV WXEXPORT +# define WXDLLIMPEXP_DATA_ADV(type) WXEXPORT type +#elif defined(WXUSINGDLL) +# define WXDLLIMPEXP_ADV WXIMPORT +# define WXDLLIMPEXP_DATA_ADV(type) WXIMPORT type +#else /* not making nor using DLL */ +# define WXDLLIMPEXP_ADV +# define WXDLLIMPEXP_DATA_ADV(type) type +#endif + +#ifdef WXMAKINGDLL_ODBC +# define WXDLLIMPEXP_ODBC WXEXPORT +# define WXDLLIMPEXP_DATA_ODBC(type) WXEXPORT type +#elif defined(WXUSINGDLL) +# define WXDLLIMPEXP_ODBC WXIMPORT +# define WXDLLIMPEXP_DATA_ODBC(type) WXIMPORT type +#else /* not making nor using DLL */ +# define WXDLLIMPEXP_ODBC +# define WXDLLIMPEXP_DATA_ODBC(type) type +#endif + +#ifdef WXMAKINGDLL_QA +# define WXDLLIMPEXP_QA WXEXPORT +# define WXDLLIMPEXP_DATA_QA(type) WXEXPORT type +#elif defined(WXUSINGDLL) +# define WXDLLIMPEXP_QA WXIMPORT +# define WXDLLIMPEXP_DATA_QA(type) WXIMPORT type +#else /* not making nor using DLL */ +# define WXDLLIMPEXP_QA +# define WXDLLIMPEXP_DATA_QA(type) type +#endif + +#ifdef WXMAKINGDLL_DBGRID +# define WXDLLIMPEXP_DBGRID WXEXPORT +# define WXDLLIMPEXP_DATA_DBGRID(type) WXEXPORT type +#elif defined(WXUSINGDLL) +# define WXDLLIMPEXP_DBGRID WXIMPORT +# define WXDLLIMPEXP_DATA_DBGRID(type) WXIMPORT type +#else /* not making nor using DLL */ +# define WXDLLIMPEXP_DBGRID +# define WXDLLIMPEXP_DATA_DBGRID(type) type +#endif + +#ifdef WXMAKINGDLL_HTML +# define WXDLLIMPEXP_HTML WXEXPORT +# define WXDLLIMPEXP_DATA_HTML(type) WXEXPORT type +#elif defined(WXUSINGDLL) +# define WXDLLIMPEXP_HTML WXIMPORT +# define WXDLLIMPEXP_DATA_HTML(type) WXIMPORT type +#else /* not making nor using DLL */ +# define WXDLLIMPEXP_HTML +# define WXDLLIMPEXP_DATA_HTML(type) type +#endif + +#ifdef WXMAKINGDLL_GL +# define WXDLLIMPEXP_GL WXEXPORT +#elif defined(WXUSINGDLL) +# define WXDLLIMPEXP_GL WXIMPORT +#else /* not making nor using DLL */ +# define WXDLLIMPEXP_GL +#endif + +#ifdef WXMAKINGDLL_XML +# define WXDLLIMPEXP_XML WXEXPORT +#elif defined(WXUSINGDLL) +# define WXDLLIMPEXP_XML WXIMPORT +#else /* not making nor using DLL */ +# define WXDLLIMPEXP_XML +#endif + +#ifdef WXMAKINGDLL_XRC +# define WXDLLIMPEXP_XRC WXEXPORT +#elif defined(WXUSINGDLL) +# define WXDLLIMPEXP_XRC WXIMPORT +#else /* not making nor using DLL */ +# define WXDLLIMPEXP_XRC +#endif + +#ifdef WXMAKINGDLL_AUI +# define WXDLLIMPEXP_AUI WXEXPORT +#elif defined(WXUSINGDLL) +# define WXDLLIMPEXP_AUI WXIMPORT +#else /* not making nor using DLL */ +# define WXDLLIMPEXP_AUI +#endif + +#ifdef WXMAKINGDLL_RICHTEXT +# define WXDLLIMPEXP_RICHTEXT WXEXPORT +#elif defined(WXUSINGDLL) +# define WXDLLIMPEXP_RICHTEXT WXIMPORT +#else /* not making nor using DLL */ +# define WXDLLIMPEXP_RICHTEXT +#endif + +#ifdef WXMAKINGDLL_MEDIA +# define WXDLLIMPEXP_MEDIA WXEXPORT +#elif defined(WXUSINGDLL) +# define WXDLLIMPEXP_MEDIA WXIMPORT +#else /* not making nor using DLL */ +# define WXDLLIMPEXP_MEDIA +#endif + +/* for backwards compatibility, define suffix-less versions too */ +#define WXDLLEXPORT WXDLLIMPEXP_CORE +#define WXDLLEXPORT_DATA WXDLLIMPEXP_DATA_CORE + +/* wx-2.9 introduces new macros for forward declarations, include them + * here for forward compatibility: + + GCC warns about using __attribute__ (and also __declspec in mingw32 case) on + forward declarations while MSVC complains about forward declarations without + __declspec for the classes later declared with it, so we need a separate set + of macros for forward declarations to hide this difference: + */ +#if defined(__WINDOWS__) && defined(__GNUC__) + #define WXDLLIMPEXP_FWD_BASE + #define WXDLLIMPEXP_FWD_NET + #define WXDLLIMPEXP_FWD_CORE + #define WXDLLIMPEXP_FWD_ADV + #define WXDLLIMPEXP_FWD_QA + #define WXDLLIMPEXP_FWD_HTML + #define WXDLLIMPEXP_FWD_GL + #define WXDLLIMPEXP_FWD_XML + #define WXDLLIMPEXP_FWD_XRC + #define WXDLLIMPEXP_FWD_AUI + #define WXDLLIMPEXP_FWD_RICHTEXT + #define WXDLLIMPEXP_FWD_MEDIA + #define WXDLLIMPEXP_FWD_STC +#else + #define WXDLLIMPEXP_FWD_BASE WXDLLIMPEXP_BASE + #define WXDLLIMPEXP_FWD_NET WXDLLIMPEXP_NET + #define WXDLLIMPEXP_FWD_CORE WXDLLIMPEXP_CORE + #define WXDLLIMPEXP_FWD_ADV WXDLLIMPEXP_ADV + #define WXDLLIMPEXP_FWD_QA WXDLLIMPEXP_QA + #define WXDLLIMPEXP_FWD_HTML WXDLLIMPEXP_HTML + #define WXDLLIMPEXP_FWD_GL WXDLLIMPEXP_GL + #define WXDLLIMPEXP_FWD_XML WXDLLIMPEXP_XML + #define WXDLLIMPEXP_FWD_XRC WXDLLIMPEXP_XRC + #define WXDLLIMPEXP_FWD_AUI WXDLLIMPEXP_AUI + #define WXDLLIMPEXP_FWD_RICHTEXT WXDLLIMPEXP_RICHTEXT + #define WXDLLIMPEXP_FWD_MEDIA WXDLLIMPEXP_MEDIA + #define WXDLLIMPEXP_FWD_STC WXDLLIMPEXP_STC +#endif + +#endif /* _WX_DLIMPEXP_H_ */ + diff --git a/Externals/wxWidgets/include/wx/dnd.h b/Externals/wxWidgets/include/wx/dnd.h new file mode 100644 index 0000000000..62dbac1179 --- /dev/null +++ b/Externals/wxWidgets/include/wx/dnd.h @@ -0,0 +1,267 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/dnd.h +// Purpose: Drag and drop classes declarations +// Author: Vadim Zeitlin, Robert Roebling +// Modified by: +// Created: 26.05.99 +// RCS-ID: $Id: dnd.h 43636 2006-11-25 14:08:27Z VZ $ +// Copyright: (c) wxWidgets Team +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DND_H_BASE_ +#define _WX_DND_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_DRAG_AND_DROP + +#include "wx/dataobj.h" +#include "wx/cursor.h" + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// flags for wxDropSource::DoDragDrop() +// +// NB: wxDrag_CopyOnly must be 0 (== FALSE) and wxDrag_AllowMove must be 1 +// (== TRUE) for compatibility with the old DoDragDrop(bool) method! +enum +{ + wxDrag_CopyOnly = 0, // allow only copying + wxDrag_AllowMove = 1, // allow moving (copying is always allowed) + wxDrag_DefaultMove = 3 // the default operation is move, not copy +}; + +// result of wxDropSource::DoDragDrop() call +enum wxDragResult +{ + wxDragError, // error prevented the d&d operation from completing + wxDragNone, // drag target didn't accept the data + wxDragCopy, // the data was successfully copied + wxDragMove, // the data was successfully moved (MSW only) + wxDragLink, // operation is a drag-link + wxDragCancel // the operation was cancelled by user (not an error) +}; + +// return true if res indicates that something was done during a dnd operation, +// i.e. is neither error nor none nor cancel +WXDLLEXPORT bool wxIsDragResultOk(wxDragResult res); + +// ---------------------------------------------------------------------------- +// wxDropSource is the object you need to create (and call DoDragDrop on it) +// to initiate a drag-and-drop operation +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxDropSourceBase +{ +public: + wxDropSourceBase(const wxCursor &cursorCopy = wxNullCursor, + const wxCursor &cursorMove = wxNullCursor, + const wxCursor &cursorStop = wxNullCursor) + : m_cursorCopy(cursorCopy), + m_cursorMove(cursorMove), + m_cursorStop(cursorStop) + { m_data = (wxDataObject *)NULL; } + virtual ~wxDropSourceBase() { } + + // set the data which is transfered by drag and drop + void SetData(wxDataObject& data) + { m_data = &data; } + + wxDataObject *GetDataObject() + { return m_data; } + + // set the icon corresponding to given drag result + void SetCursor(wxDragResult res, const wxCursor& cursor) + { + if ( res == wxDragCopy ) + m_cursorCopy = cursor; + else if ( res == wxDragMove ) + m_cursorMove = cursor; + else + m_cursorStop = cursor; + } + + // start drag action, see enum wxDragResult for return value description + // + // if flags contains wxDrag_AllowMove, moving (and only copying) data is + // allowed, if it contains wxDrag_DefaultMove (which includes the previous + // flag), it is even the default operation + virtual wxDragResult DoDragDrop(int flags = wxDrag_CopyOnly) = 0; + + // override to give feedback depending on the current operation result + // "effect" and return true if you did something, false to let the library + // give the default feedback + virtual bool GiveFeedback(wxDragResult WXUNUSED(effect)) { return false; } + +protected: + const wxCursor& GetCursor(wxDragResult res) const + { + if ( res == wxDragCopy ) + return m_cursorCopy; + else if ( res == wxDragMove ) + return m_cursorMove; + else + return m_cursorStop; + } + + // the data we're dragging + wxDataObject *m_data; + + // the cursors to use for feedback + wxCursor m_cursorCopy, + m_cursorMove, + m_cursorStop; + + DECLARE_NO_COPY_CLASS(wxDropSourceBase) +}; + +// ---------------------------------------------------------------------------- +// wxDropTarget should be associated with a window if it wants to be able to +// receive data via drag and drop. +// +// To use this class, you should derive from wxDropTarget and implement +// OnData() pure virtual method. You may also wish to override OnDrop() if you +// want to accept the data only inside some region of the window (this may +// avoid having to copy the data to this application which happens only when +// OnData() is called) +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxDropTargetBase +{ +public: + // ctor takes a pointer to heap-allocated wxDataObject which will be owned + // by wxDropTarget and deleted by it automatically. If you don't give it + // here, you can use SetDataObject() later. + wxDropTargetBase(wxDataObject *dataObject = (wxDataObject*)NULL) + { m_dataObject = dataObject; m_defaultAction = wxDragNone; } + // dtor deletes our data object + virtual ~wxDropTargetBase() + { delete m_dataObject; } + + // get/set the associated wxDataObject + wxDataObject *GetDataObject() const + { return m_dataObject; } + void SetDataObject(wxDataObject *dataObject) + { if (m_dataObject) delete m_dataObject; + m_dataObject = dataObject; } + + // these functions are called when data is moved over position (x, y) and + // may return either wxDragCopy, wxDragMove or wxDragNone depending on + // what would happen if the data were dropped here. + // + // the last parameter is what would happen by default and is determined by + // the platform-specific logic (for example, under Windows it's wxDragCopy + // if Ctrl key is pressed and wxDragMove otherwise) except that it will + // always be wxDragNone if the carried data is in an unsupported format. + + // called when the mouse enters the window (only once until OnLeave()) + virtual wxDragResult OnEnter(wxCoord x, wxCoord y, wxDragResult def) + { return OnDragOver(x, y, def); } + + // called when the mouse moves in the window - shouldn't take long to + // execute or otherwise mouse movement would be too slow + virtual wxDragResult OnDragOver(wxCoord WXUNUSED(x), wxCoord WXUNUSED(y), + wxDragResult def) + { return def; } + + // called when mouse leaves the window: might be used to remove the + // feedback which was given in OnEnter() + virtual void OnLeave() { } + + // this function is called when data is dropped at position (x, y) - if it + // returns true, OnData() will be called immediately afterwards which will + // allow to retrieve the data dropped. + virtual bool OnDrop(wxCoord x, wxCoord y) = 0; + + // called after OnDrop() returns TRUE: you will usually just call + // GetData() from here and, probably, also refresh something to update the + // new data and, finally, return the code indicating how did the operation + // complete (returning default value in case of success and wxDragError on + // failure is usually ok) + virtual wxDragResult OnData(wxCoord x, wxCoord y, wxDragResult def) = 0; + + // may be called *only* from inside OnData() and will fill m_dataObject + // with the data from the drop source if it returns true + virtual bool GetData() = 0; + + // sets the default action for drag and drop: + // use wxDragMove or wxDragCopy to set deafult action to move or copy + // and use wxDragNone (default) to set default action specified by + // initialization of draging (see wxDropSourceBase::DoDragDrop()) + void SetDefaultAction(wxDragResult action) + { m_defaultAction = action; } + + // returns default action for drag and drop or + // wxDragNone if this not specified + wxDragResult GetDefaultAction() + { return m_defaultAction; } + +protected: + wxDataObject *m_dataObject; + wxDragResult m_defaultAction; + + DECLARE_NO_COPY_CLASS(wxDropTargetBase) +}; + +// ---------------------------------------------------------------------------- +// include platform dependent class declarations +// ---------------------------------------------------------------------------- + +#if defined(__WXMSW__) + #include "wx/msw/ole/dropsrc.h" + #include "wx/msw/ole/droptgt.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/dnd.h" +#elif defined(__WXX11__) + #include "wx/x11/dnd.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/dnd.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/dnd.h" +#elif defined(__WXMAC__) + #include "wx/mac/dnd.h" +#elif defined(__WXPM__) + #include "wx/os2/dnd.h" +#endif + +// ---------------------------------------------------------------------------- +// standard wxDropTarget implementations (implemented in common/dobjcmn.cpp) +// ---------------------------------------------------------------------------- + +// A simple wxDropTarget derived class for text data: you only need to +// override OnDropText() to get something working +class WXDLLEXPORT wxTextDropTarget : public wxDropTarget +{ +public: + wxTextDropTarget(); + + virtual bool OnDropText(wxCoord x, wxCoord y, const wxString& text) = 0; + + virtual wxDragResult OnData(wxCoord x, wxCoord y, wxDragResult def); + +private: + DECLARE_NO_COPY_CLASS(wxTextDropTarget) +}; + +// A drop target which accepts files (dragged from File Manager or Explorer) +class WXDLLEXPORT wxFileDropTarget : public wxDropTarget +{ +public: + wxFileDropTarget(); + + // parameters are the number of files and the array of file names + virtual bool OnDropFiles(wxCoord x, wxCoord y, + const wxArrayString& filenames) = 0; + + virtual wxDragResult OnData(wxCoord x, wxCoord y, wxDragResult def); + +private: + DECLARE_NO_COPY_CLASS(wxFileDropTarget) +}; + +#endif // wxUSE_DRAG_AND_DROP + +#endif // _WX_DND_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/docmdi.h b/Externals/wxWidgets/include/wx/docmdi.h new file mode 100644 index 0000000000..d4d7fcfed1 --- /dev/null +++ b/Externals/wxWidgets/include/wx/docmdi.h @@ -0,0 +1,107 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: docmdi.h +// Purpose: Frame classes for MDI document/view applications +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: docmdi.h 41020 2006-09-05 20:47:48Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DOCMDI_H_ +#define _WX_DOCMDI_H_ + +#include "wx/defs.h" + +#if wxUSE_MDI_ARCHITECTURE + +#include "wx/docview.h" +#include "wx/mdi.h" + +/* + * Use this instead of wxMDIParentFrame + */ + +class WXDLLEXPORT wxDocMDIParentFrame: public wxMDIParentFrame +{ +public: + wxDocMDIParentFrame(); + wxDocMDIParentFrame(wxDocManager *manager, wxFrame *parent, wxWindowID id, + const wxString& title, const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = wxDEFAULT_FRAME_STYLE, const wxString& name = wxT("frame")); + + bool Create(wxDocManager *manager, wxFrame *parent, wxWindowID id, + const wxString& title, const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = wxDEFAULT_FRAME_STYLE, const wxString& name = wxT("frame")); + + // Extend event processing to search the document manager's event table + virtual bool ProcessEvent(wxEvent& event); + + wxDocManager *GetDocumentManager(void) const { return m_docManager; } + + void OnExit(wxCommandEvent& event); + void OnMRUFile(wxCommandEvent& event); + void OnCloseWindow(wxCloseEvent& event); + +protected: + void Init(); + wxDocManager *m_docManager; + +private: + DECLARE_CLASS(wxDocMDIParentFrame) + DECLARE_EVENT_TABLE() + DECLARE_NO_COPY_CLASS(wxDocMDIParentFrame) +}; + +/* + * Use this instead of wxMDIChildFrame + */ + +class WXDLLEXPORT wxDocMDIChildFrame: public wxMDIChildFrame +{ +public: + wxDocMDIChildFrame(); + wxDocMDIChildFrame(wxDocument *doc, wxView *view, wxMDIParentFrame *frame, wxWindowID id, + const wxString& title, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, + long type = wxDEFAULT_FRAME_STYLE, const wxString& name = wxT("frame")); + virtual ~wxDocMDIChildFrame(); + + bool Create(wxDocument *doc, + wxView *view, + wxMDIParentFrame *frame, + wxWindowID id, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long type = wxDEFAULT_FRAME_STYLE, + const wxString& name = wxFrameNameStr); + + // Extend event processing to search the view's event table + virtual bool ProcessEvent(wxEvent& event); + + void OnActivate(wxActivateEvent& event); + void OnCloseWindow(wxCloseEvent& event); + + inline wxDocument *GetDocument() const { return m_childDocument; } + inline wxView *GetView(void) const { return m_childView; } + inline void SetDocument(wxDocument *doc) { m_childDocument = doc; } + inline void SetView(wxView *view) { m_childView = view; } + bool Destroy() { m_childView = (wxView *)NULL; return wxMDIChildFrame::Destroy(); } + +protected: + void Init(); + wxDocument* m_childDocument; + wxView* m_childView; + +private: + DECLARE_EVENT_TABLE() + DECLARE_CLASS(wxDocMDIChildFrame) + DECLARE_NO_COPY_CLASS(wxDocMDIChildFrame) +}; + +#endif + // wxUSE_MDI_ARCHITECTURE + +#endif + // _WX_DOCMDI_H_ diff --git a/Externals/wxWidgets/include/wx/docview.h b/Externals/wxWidgets/include/wx/docview.h new file mode 100644 index 0000000000..9b36b07739 --- /dev/null +++ b/Externals/wxWidgets/include/wx/docview.h @@ -0,0 +1,661 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/docview.h +// Purpose: Doc/View classes +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: docview.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DOCH__ +#define _WX_DOCH__ + +#include "wx/defs.h" + +#if wxUSE_DOC_VIEW_ARCHITECTURE + +#include "wx/list.h" +#include "wx/string.h" +#include "wx/frame.h" + +#if wxUSE_PRINTING_ARCHITECTURE + #include "wx/print.h" +#endif + +class WXDLLIMPEXP_FWD_CORE wxWindow; +class WXDLLIMPEXP_FWD_CORE wxDocument; +class WXDLLIMPEXP_FWD_CORE wxView; +class WXDLLIMPEXP_FWD_CORE wxDocTemplate; +class WXDLLIMPEXP_FWD_CORE wxDocManager; +class WXDLLIMPEXP_FWD_CORE wxPrintInfo; +class WXDLLIMPEXP_FWD_CORE wxCommandProcessor; +class WXDLLIMPEXP_FWD_CORE wxFileHistory; +class WXDLLIMPEXP_FWD_CORE wxConfigBase; + +#if wxUSE_STD_IOSTREAM + #include "wx/iosfwrap.h" +#else + #include "wx/stream.h" +#endif + +// Document manager flags +enum +{ + wxDOC_SDI = 1, + wxDOC_MDI, + wxDOC_NEW, + wxDOC_SILENT, + wxDEFAULT_DOCMAN_FLAGS = wxDOC_SDI +}; + +// Document template flags +enum +{ + wxTEMPLATE_VISIBLE = 1, + wxTEMPLATE_INVISIBLE, + wxDEFAULT_TEMPLATE_FLAGS = wxTEMPLATE_VISIBLE +}; + +#define wxMAX_FILE_HISTORY 9 + +class WXDLLEXPORT wxDocument : public wxEvtHandler +{ +public: + wxDocument(wxDocument *parent = (wxDocument *) NULL); + virtual ~wxDocument(); + + // accessors + void SetFilename(const wxString& filename, bool notifyViews = false); + wxString GetFilename() const { return m_documentFile; } + + void SetTitle(const wxString& title) { m_documentTitle = title; } + wxString GetTitle() const { return m_documentTitle; } + + void SetDocumentName(const wxString& name) { m_documentTypeName = name; } + wxString GetDocumentName() const { return m_documentTypeName; } + + bool GetDocumentSaved() const { return m_savedYet; } + void SetDocumentSaved(bool saved = true) { m_savedYet = saved; } + + virtual bool Close(); + virtual bool Save(); + virtual bool SaveAs(); + virtual bool Revert(); + +#if wxUSE_STD_IOSTREAM + virtual wxSTD ostream& SaveObject(wxSTD ostream& stream); + virtual wxSTD istream& LoadObject(wxSTD istream& stream); +#else + virtual wxOutputStream& SaveObject(wxOutputStream& stream); + virtual wxInputStream& LoadObject(wxInputStream& stream); +#endif + + // Called by wxWidgets + virtual bool OnSaveDocument(const wxString& filename); + virtual bool OnOpenDocument(const wxString& filename); + virtual bool OnNewDocument(); + virtual bool OnCloseDocument(); + + // Prompts for saving if about to close a modified document. Returns true + // if ok to close the document (may have saved in the meantime, or set + // modified to false) + virtual bool OnSaveModified(); + + // Called by framework if created automatically by the default document + // manager: gives document a chance to initialise and (usually) create a + // view + virtual bool OnCreate(const wxString& path, long flags); + + // By default, creates a base wxCommandProcessor. + virtual wxCommandProcessor *OnCreateCommandProcessor(); + virtual wxCommandProcessor *GetCommandProcessor() const { return m_commandProcessor; } + virtual void SetCommandProcessor(wxCommandProcessor *proc) { m_commandProcessor = proc; } + + // Called after a view is added or removed. The default implementation + // deletes the document if this is there are no more views. + virtual void OnChangedViewList(); + + virtual bool DeleteContents(); + + virtual bool Draw(wxDC&); + virtual bool IsModified() const { return m_documentModified; } + virtual void Modify(bool mod) { m_documentModified = mod; } + + virtual bool AddView(wxView *view); + virtual bool RemoveView(wxView *view); + wxList& GetViews() { return m_documentViews; } + const wxList& GetViews() const { return m_documentViews; } + wxView *GetFirstView() const; + + virtual void UpdateAllViews(wxView *sender = (wxView *) NULL, wxObject *hint = (wxObject *) NULL); + virtual void NotifyClosing(); + + // Remove all views (because we're closing the document) + virtual bool DeleteAllViews(); + + // Other stuff + virtual wxDocManager *GetDocumentManager() const; + virtual wxDocTemplate *GetDocumentTemplate() const { return m_documentTemplate; } + virtual void SetDocumentTemplate(wxDocTemplate *temp) { m_documentTemplate = temp; } + + // Get title, or filename if no title, else [unnamed] + // + // NB: this method will be deprecated in wxWidgets 3.0, you still need to + // override it if you need to modify the existing behaviour in this + // version but use GetUserReadableName() below if you just need to call + // it + virtual bool GetPrintableName(wxString& buf) const; + +#if wxABI_VERSION >= 20805 + wxString GetUserReadableName() const + { + wxString s; + GetPrintableName(s); + return s; + } +#endif // wxABI 2.8.5+ + + // Returns a window that can be used as a parent for document-related + // dialogs. Override if necessary. + virtual wxWindow *GetDocumentWindow() const; + +protected: + wxList m_documentViews; + wxString m_documentFile; + wxString m_documentTitle; + wxString m_documentTypeName; + wxDocTemplate* m_documentTemplate; + bool m_documentModified; + wxDocument* m_documentParent; + wxCommandProcessor* m_commandProcessor; + bool m_savedYet; + + // Called by OnSaveDocument and OnOpenDocument to implement standard + // Save/Load behavior. Re-implement in derived class for custom + // behavior. + virtual bool DoSaveDocument(const wxString& file); + virtual bool DoOpenDocument(const wxString& file); + +private: + DECLARE_ABSTRACT_CLASS(wxDocument) + DECLARE_NO_COPY_CLASS(wxDocument) +}; + +class WXDLLEXPORT wxView: public wxEvtHandler +{ +public: + // wxView(wxDocument *doc = (wxDocument *) NULL); + wxView(); + virtual ~wxView(); + + wxDocument *GetDocument() const { return m_viewDocument; } + virtual void SetDocument(wxDocument *doc); + + wxString GetViewName() const { return m_viewTypeName; } + void SetViewName(const wxString& name) { m_viewTypeName = name; } + + wxWindow *GetFrame() const { return m_viewFrame ; } + void SetFrame(wxWindow *frame) { m_viewFrame = frame; } + + virtual void OnActivateView(bool activate, wxView *activeView, wxView *deactiveView); + virtual void OnDraw(wxDC *dc) = 0; + virtual void OnPrint(wxDC *dc, wxObject *info); + virtual void OnUpdate(wxView *sender, wxObject *hint = (wxObject *) NULL); + virtual void OnClosingDocument() {} + virtual void OnChangeFilename(); + + // Called by framework if created automatically by the default document + // manager class: gives view a chance to initialise + virtual bool OnCreate(wxDocument *WXUNUSED(doc), long WXUNUSED(flags)) { return true; } + + // Checks if the view is the last one for the document; if so, asks user + // to confirm save data (if modified). If ok, deletes itself and returns + // true. + virtual bool Close(bool deleteWindow = true); + + // Override to do cleanup/veto close + virtual bool OnClose(bool deleteWindow); + + // Extend event processing to search the document's event table + virtual bool ProcessEvent(wxEvent& event); + + // A view's window can call this to notify the view it is (in)active. + // The function then notifies the document manager. + virtual void Activate(bool activate); + + wxDocManager *GetDocumentManager() const + { return m_viewDocument->GetDocumentManager(); } + +#if wxUSE_PRINTING_ARCHITECTURE + virtual wxPrintout *OnCreatePrintout(); +#endif + +protected: + wxDocument* m_viewDocument; + wxString m_viewTypeName; + wxWindow* m_viewFrame; + +private: + DECLARE_ABSTRACT_CLASS(wxView) + DECLARE_NO_COPY_CLASS(wxView) +}; + +// Represents user interface (and other) properties of documents and views +class WXDLLEXPORT wxDocTemplate: public wxObject +{ + +friend class WXDLLEXPORT wxDocManager; + +public: + // Associate document and view types. They're for identifying what view is + // associated with what template/document type + wxDocTemplate(wxDocManager *manager, + const wxString& descr, + const wxString& filter, + const wxString& dir, + const wxString& ext, + const wxString& docTypeName, + const wxString& viewTypeName, + wxClassInfo *docClassInfo = (wxClassInfo *) NULL, + wxClassInfo *viewClassInfo = (wxClassInfo *)NULL, + long flags = wxDEFAULT_TEMPLATE_FLAGS); + + virtual ~wxDocTemplate(); + + // By default, these two member functions dynamically creates document and + // view using dynamic instance construction. Override these if you need a + // different method of construction. + virtual wxDocument *CreateDocument(const wxString& path, long flags = 0); + virtual wxView *CreateView(wxDocument *doc, long flags = 0); + + // Helper method for CreateDocument; also allows you to do your own document + // creation + virtual bool InitDocument(wxDocument* doc, const wxString& path, long flags = 0); + + wxString GetDefaultExtension() const { return m_defaultExt; } + wxString GetDescription() const { return m_description; } + wxString GetDirectory() const { return m_directory; } + wxDocManager *GetDocumentManager() const { return m_documentManager; } + void SetDocumentManager(wxDocManager *manager) { m_documentManager = manager; } + wxString GetFileFilter() const { return m_fileFilter; } + long GetFlags() const { return m_flags; } + virtual wxString GetViewName() const { return m_viewTypeName; } + virtual wxString GetDocumentName() const { return m_docTypeName; } + + void SetFileFilter(const wxString& filter) { m_fileFilter = filter; } + void SetDirectory(const wxString& dir) { m_directory = dir; } + void SetDescription(const wxString& descr) { m_description = descr; } + void SetDefaultExtension(const wxString& ext) { m_defaultExt = ext; } + void SetFlags(long flags) { m_flags = flags; } + + bool IsVisible() const { return ((m_flags & wxTEMPLATE_VISIBLE) == wxTEMPLATE_VISIBLE); } + + wxClassInfo* GetDocClassInfo() const { return m_docClassInfo; } + wxClassInfo* GetViewClassInfo() const { return m_viewClassInfo; } + + virtual bool FileMatchesTemplate(const wxString& path); + +protected: + long m_flags; + wxString m_fileFilter; + wxString m_directory; + wxString m_description; + wxString m_defaultExt; + wxString m_docTypeName; + wxString m_viewTypeName; + wxDocManager* m_documentManager; + + // For dynamic creation of appropriate instances. + wxClassInfo* m_docClassInfo; + wxClassInfo* m_viewClassInfo; + + // Called by CreateDocument and CreateView to create the actual document/view object. + // By default uses the ClassInfo provided to the constructor. Override these functions + // to provide a different method of creation. + virtual wxDocument *DoCreateDocument(); + virtual wxView *DoCreateView(); + +private: + DECLARE_CLASS(wxDocTemplate) + DECLARE_NO_COPY_CLASS(wxDocTemplate) +}; + +// One object of this class may be created in an application, to manage all +// the templates and documents. +class WXDLLEXPORT wxDocManager: public wxEvtHandler +{ +public: + wxDocManager(long flags = wxDEFAULT_DOCMAN_FLAGS, bool initialize = true); + virtual ~wxDocManager(); + + virtual bool Initialize(); + + // Handlers for common user commands + void OnFileClose(wxCommandEvent& event); + void OnFileCloseAll(wxCommandEvent& event); + void OnFileNew(wxCommandEvent& event); + void OnFileOpen(wxCommandEvent& event); + void OnFileRevert(wxCommandEvent& event); + void OnFileSave(wxCommandEvent& event); + void OnFileSaveAs(wxCommandEvent& event); + void OnPrint(wxCommandEvent& event); + void OnPreview(wxCommandEvent& event); + void OnUndo(wxCommandEvent& event); + void OnRedo(wxCommandEvent& event); + + // Handlers for UI update commands + void OnUpdateFileOpen(wxUpdateUIEvent& event); + void OnUpdateFileClose(wxUpdateUIEvent& event); + void OnUpdateFileRevert(wxUpdateUIEvent& event); + void OnUpdateFileNew(wxUpdateUIEvent& event); + void OnUpdateFileSave(wxUpdateUIEvent& event); + void OnUpdateFileSaveAs(wxUpdateUIEvent& event); + void OnUpdateUndo(wxUpdateUIEvent& event); + void OnUpdateRedo(wxUpdateUIEvent& event); + + void OnUpdatePrint(wxUpdateUIEvent& event); + void OnUpdatePreview(wxUpdateUIEvent& event); + + // Extend event processing to search the view's event table + virtual bool ProcessEvent(wxEvent& event); + + // called when file format detection didn't work, can be overridden to do + // something in this case + virtual void OnOpenFileFailure() { } + + virtual wxDocument *CreateDocument(const wxString& path, long flags = 0); + virtual wxView *CreateView(wxDocument *doc, long flags = 0); + virtual void DeleteTemplate(wxDocTemplate *temp, long flags = 0); + virtual bool FlushDoc(wxDocument *doc); + virtual wxDocTemplate *MatchTemplate(const wxString& path); + virtual wxDocTemplate *SelectDocumentPath(wxDocTemplate **templates, + int noTemplates, wxString& path, long flags, bool save = false); + virtual wxDocTemplate *SelectDocumentType(wxDocTemplate **templates, + int noTemplates, bool sort = false); + virtual wxDocTemplate *SelectViewType(wxDocTemplate **templates, + int noTemplates, bool sort = false); + virtual wxDocTemplate *FindTemplateForPath(const wxString& path); + + void AssociateTemplate(wxDocTemplate *temp); + void DisassociateTemplate(wxDocTemplate *temp); + + wxDocument *GetCurrentDocument() const; + + void SetMaxDocsOpen(int n) { m_maxDocsOpen = n; } + int GetMaxDocsOpen() const { return m_maxDocsOpen; } + + // Add and remove a document from the manager's list + void AddDocument(wxDocument *doc); + void RemoveDocument(wxDocument *doc); + + // closes all currently open documents + bool CloseDocuments(bool force = true); + + // closes the specified document + bool CloseDocument(wxDocument* doc, bool force = false); + + // Clear remaining documents and templates + bool Clear(bool force = true); + + // Views or windows should inform the document manager + // when a view is going in or out of focus + virtual void ActivateView(wxView *view, bool activate = true); + virtual wxView *GetCurrentView() const; + + wxList& GetDocuments() { return m_docs; } + wxList& GetTemplates() { return m_templates; } + + // Make a default document name + virtual bool MakeDefaultName(wxString& buf); + + // Make a frame title (override this to do something different) + virtual wxString MakeFrameTitle(wxDocument* doc); + + virtual wxFileHistory *OnCreateFileHistory(); + virtual wxFileHistory *GetFileHistory() const { return m_fileHistory; } + + // File history management + virtual void AddFileToHistory(const wxString& file); + virtual void RemoveFileFromHistory(size_t i); + virtual size_t GetHistoryFilesCount() const; + virtual wxString GetHistoryFile(size_t i) const; + virtual void FileHistoryUseMenu(wxMenu *menu); + virtual void FileHistoryRemoveMenu(wxMenu *menu); +#if wxUSE_CONFIG + virtual void FileHistoryLoad(wxConfigBase& config); + virtual void FileHistorySave(wxConfigBase& config); +#endif // wxUSE_CONFIG + + virtual void FileHistoryAddFilesToMenu(); + virtual void FileHistoryAddFilesToMenu(wxMenu* menu); + + wxString GetLastDirectory() const { return m_lastDirectory; } + void SetLastDirectory(const wxString& dir) { m_lastDirectory = dir; } + + // Get the current document manager + static wxDocManager* GetDocumentManager() { return sm_docManager; } + +#if WXWIN_COMPATIBILITY_2_6 + // deprecated, use GetHistoryFilesCount() instead + wxDEPRECATED( size_t GetNoHistoryFiles() const ); +#endif // WXWIN_COMPATIBILITY_2_6 + +protected: + long m_flags; + int m_defaultDocumentNameCounter; + int m_maxDocsOpen; + wxList m_docs; + wxList m_templates; + wxView* m_currentView; + wxFileHistory* m_fileHistory; + wxString m_lastDirectory; + static wxDocManager* sm_docManager; + + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS(wxDocManager) + DECLARE_NO_COPY_CLASS(wxDocManager) +}; + +#if WXWIN_COMPATIBILITY_2_6 +inline size_t wxDocManager::GetNoHistoryFiles() const +{ + return GetHistoryFilesCount(); +} +#endif // WXWIN_COMPATIBILITY_2_6 + +// ---------------------------------------------------------------------------- +// A default child frame +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxDocChildFrame : public wxFrame +{ +public: + wxDocChildFrame(wxDocument *doc, + wxView *view, + wxFrame *frame, + wxWindowID id, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long type = wxDEFAULT_FRAME_STYLE, + const wxString& name = wxT("frame")); + virtual ~wxDocChildFrame(){} + + // Extend event processing to search the view's event table + virtual bool ProcessEvent(wxEvent& event); + + void OnActivate(wxActivateEvent& event); + void OnCloseWindow(wxCloseEvent& event); + + wxDocument *GetDocument() const { return m_childDocument; } + wxView *GetView() const { return m_childView; } + void SetDocument(wxDocument *doc) { m_childDocument = doc; } + void SetView(wxView *view) { m_childView = view; } + bool Destroy() { m_childView = (wxView *)NULL; return wxFrame::Destroy(); } + +protected: + wxDocument* m_childDocument; + wxView* m_childView; + +private: + DECLARE_CLASS(wxDocChildFrame) + DECLARE_EVENT_TABLE() + DECLARE_NO_COPY_CLASS(wxDocChildFrame) +}; + +// ---------------------------------------------------------------------------- +// A default parent frame +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxDocParentFrame : public wxFrame +{ +public: + wxDocParentFrame(); + wxDocParentFrame(wxDocManager *manager, + wxFrame *frame, + wxWindowID id, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDEFAULT_FRAME_STYLE, + const wxString& name = wxFrameNameStr); + + bool Create(wxDocManager *manager, + wxFrame *frame, + wxWindowID id, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDEFAULT_FRAME_STYLE, + const wxString& name = wxFrameNameStr); + + // Extend event processing to search the document manager's event table + virtual bool ProcessEvent(wxEvent& event); + + wxDocManager *GetDocumentManager() const { return m_docManager; } + + void OnExit(wxCommandEvent& event); + void OnMRUFile(wxCommandEvent& event); + void OnCloseWindow(wxCloseEvent& event); + +protected: + wxDocManager *m_docManager; + +private: + typedef wxFrame base_type; + DECLARE_CLASS(wxDocParentFrame) + DECLARE_EVENT_TABLE() + DECLARE_NO_COPY_CLASS(wxDocParentFrame) +}; + +// ---------------------------------------------------------------------------- +// Provide simple default printing facilities +// ---------------------------------------------------------------------------- + +#if wxUSE_PRINTING_ARCHITECTURE +class WXDLLEXPORT wxDocPrintout : public wxPrintout +{ +public: + wxDocPrintout(wxView *view = (wxView *) NULL, const wxString& title = wxT("Printout")); + bool OnPrintPage(int page); + bool HasPage(int page); + bool OnBeginDocument(int startPage, int endPage); + void GetPageInfo(int *minPage, int *maxPage, int *selPageFrom, int *selPageTo); + + virtual wxView *GetView() { return m_printoutView; } + +protected: + wxView* m_printoutView; + +private: + DECLARE_DYNAMIC_CLASS(wxDocPrintout) + DECLARE_NO_COPY_CLASS(wxDocPrintout) +}; +#endif // wxUSE_PRINTING_ARCHITECTURE + +// ---------------------------------------------------------------------------- +// File history management +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxFileHistory : public wxObject +{ +public: + wxFileHistory(size_t maxFiles = 9, wxWindowID idBase = wxID_FILE1); + virtual ~wxFileHistory(); + + // Operations + virtual void AddFileToHistory(const wxString& file); + virtual void RemoveFileFromHistory(size_t i); + virtual int GetMaxFiles() const { return (int)m_fileMaxFiles; } + virtual void UseMenu(wxMenu *menu); + + // Remove menu from the list (MDI child may be closing) + virtual void RemoveMenu(wxMenu *menu); + +#if wxUSE_CONFIG + virtual void Load(wxConfigBase& config); + virtual void Save(wxConfigBase& config); +#endif // wxUSE_CONFIG + + virtual void AddFilesToMenu(); + virtual void AddFilesToMenu(wxMenu* menu); // Single menu + + // Accessors + virtual wxString GetHistoryFile(size_t i) const; + virtual size_t GetCount() const { return m_fileHistoryN; } + + const wxList& GetMenus() const { return m_fileMenus; } + +#if wxABI_VERSION >= 20802 + // Set/get base id + void SetBaseId(wxWindowID baseId) { m_idBase = baseId; } + wxWindowID GetBaseId() const { return m_idBase; } +#endif // wxABI 2.8.2+ + +#if WXWIN_COMPATIBILITY_2_6 + // deprecated, use GetCount() instead + wxDEPRECATED( size_t GetNoHistoryFiles() const ); +#endif // WXWIN_COMPATIBILITY_2_6 + +protected: + // Last n files + wxChar** m_fileHistory; + // Number of files saved + size_t m_fileHistoryN; + // Menus to maintain (may need several for an MDI app) + wxList m_fileMenus; + // Max files to maintain + size_t m_fileMaxFiles; + +private: + // The ID of the first history menu item (Doesn't have to be wxID_FILE1) + wxWindowID m_idBase; + + DECLARE_DYNAMIC_CLASS(wxFileHistory) + DECLARE_NO_COPY_CLASS(wxFileHistory) +}; + +#if WXWIN_COMPATIBILITY_2_6 +inline size_t wxFileHistory::GetNoHistoryFiles() const +{ + return m_fileHistoryN; +} +#endif // WXWIN_COMPATIBILITY_2_6 + +#if wxUSE_STD_IOSTREAM +// For compatibility with existing file formats: +// converts from/to a stream to/from a temporary file. +bool WXDLLEXPORT wxTransferFileToStream(const wxString& filename, wxSTD ostream& stream); +bool WXDLLEXPORT wxTransferStreamToFile(wxSTD istream& stream, const wxString& filename); +#else +// For compatibility with existing file formats: +// converts from/to a stream to/from a temporary file. +bool WXDLLEXPORT wxTransferFileToStream(const wxString& filename, wxOutputStream& stream); +bool WXDLLEXPORT wxTransferStreamToFile(wxInputStream& stream, const wxString& filename); +#endif // wxUSE_STD_IOSTREAM + +#endif // wxUSE_DOC_VIEW_ARCHITECTURE + +#endif // _WX_DOCH__ diff --git a/Externals/wxWidgets/include/wx/dragimag.h b/Externals/wxWidgets/include/wx/dragimag.h new file mode 100644 index 0000000000..6076abc3b2 --- /dev/null +++ b/Externals/wxWidgets/include/wx/dragimag.h @@ -0,0 +1,54 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/dragimag.h +// Purpose: wxDragImage base header +// Author: Julian Smart +// Modified by: +// Created: +// Copyright: (c) Julian Smart +// RCS-ID: $Id: dragimag.h 33948 2005-05-04 18:57:50Z JS $ +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DRAGIMAG_H_BASE_ +#define _WX_DRAGIMAG_H_BASE_ + +#if wxUSE_DRAGIMAGE + +class WXDLLEXPORT wxRect; +class WXDLLEXPORT wxMemoryDC; +class WXDLLEXPORT wxDC; + +#if defined(__WXMSW__) +# if defined(__WXUNIVERSAL__) +# include "wx/generic/dragimgg.h" +# define wxDragImage wxGenericDragImage +# else +# include "wx/msw/dragimag.h" +# endif + +#elif defined(__WXMOTIF__) +# include "wx/generic/dragimgg.h" +# define wxDragImage wxGenericDragImage + +#elif defined(__WXGTK__) +# include "wx/generic/dragimgg.h" +# define wxDragImage wxGenericDragImage + +#elif defined(__WXX11__) +# include "wx/generic/dragimgg.h" +# define wxDragImage wxGenericDragImage + +#elif defined(__WXMAC__) +# include "wx/generic/dragimgg.h" +# define wxDragImage wxGenericDragImage + +#elif defined(__WXPM__) +# include "wx/generic/dragimgg.h" +# define wxDragImage wxGenericDragImage + +#endif + +#endif // wxUSE_DRAGIMAGE + +#endif + // _WX_DRAGIMAG_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/dynarray.h b/Externals/wxWidgets/include/wx/dynarray.h new file mode 100644 index 0000000000..3cde91ae7a --- /dev/null +++ b/Externals/wxWidgets/include/wx/dynarray.h @@ -0,0 +1,1044 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/dynarray.h +// Purpose: auto-resizable (i.e. dynamic) array support +// Author: Vadim Zeitlin +// Modified by: +// Created: 12.09.97 +// RCS-ID: $Id: dynarray.h 45498 2007-04-16 13:03:05Z VZ $ +// Copyright: (c) 1998 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _DYNARRAY_H +#define _DYNARRAY_H + +#include "wx/defs.h" + +#if wxUSE_STL + #include "wx/beforestd.h" + #include + #include + #include "wx/afterstd.h" +#endif + +/* + This header defines the dynamic arrays and object arrays (i.e. arrays which + own their elements). Dynamic means that the arrays grow automatically as + needed. + + These macros are ugly (especially if you look in the sources ;-), but they + allow us to define "template" classes without actually using templates and so + this works with all compilers (and may be also much faster to compile even + with a compiler which does support templates). The arrays defined with these + macros are type-safe. + + Range checking is performed in debug build for both arrays and objarrays but + not in release build - so using an invalid index will just lead to a crash + then. + + Note about memory usage: arrays never shrink automatically (although you may + use Shrink() function explicitly), they only grow, so loading 10 millions in + an array only to delete them 2 lines below might be a bad idea if the array + object is not going to be destroyed soon. However, as it does free memory + when destroyed, it is ok if the array is a local variable. + */ + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +/* + The initial size by which an array grows when an element is added default + value avoids allocate one or two bytes when the array is created which is + rather inefficient +*/ +#define WX_ARRAY_DEFAULT_INITIAL_SIZE (16) + +// ---------------------------------------------------------------------------- +// types +// ---------------------------------------------------------------------------- + +/* + Callback compare function for quick sort. + + It must return negative value, 0 or positive value if the first item is + less than, equal to or greater than the second one. + */ +extern "C" +{ +typedef int (wxCMPFUNC_CONV *CMPFUNC)(const void* pItem1, const void* pItem2); +} + +// ---------------------------------------------------------------------------- +// Base class managing data having size of type 'long' (not used directly) +// +// NB: for efficiency this often used class has no virtual functions (hence no +// virtual table), even dtor is *not* virtual. If used as expected it +// won't create any problems because ARRAYs from DEFINE_ARRAY have no dtor +// at all, so it's not too important if it's not called (this happens when +// you cast "SomeArray *" as "BaseArray *" and then delete it) +// ---------------------------------------------------------------------------- + +#if wxUSE_STL + +template +class WXDLLIMPEXP_BASE wxArray_SortFunction +{ +public: + typedef int (wxCMPFUNC_CONV *CMPFUNC)(T* pItem1, T* pItem2); + + wxArray_SortFunction(CMPFUNC f) : m_f(f) { } + bool operator()(const T& i1, const T& i2) + { return m_f((T*)&i1, (T*)&i2) < 0; } +private: + CMPFUNC m_f; +}; + +template +class WXDLLIMPEXP_BASE wxSortedArray_SortFunction +{ +public: + typedef F CMPFUNC; + + wxSortedArray_SortFunction(CMPFUNC f) : m_f(f) { } + bool operator()(const T& i1, const T& i2) + { return m_f(i1, i2) < 0; } +private: + CMPFUNC m_f; +}; + +#define _WX_DECLARE_BASEARRAY(T, name, classexp) \ + typedef int (wxCMPFUNC_CONV *CMPFUN##name)(T pItem1, T pItem2); \ + typedef wxSortedArray_SortFunction name##_Predicate; \ + _WX_DECLARE_BASEARRAY_2(T, name, name##_Predicate, classexp) + +#define _WX_DECLARE_BASEARRAY_2(T, name, predicate, classexp) \ +classexp name : public std::vector \ +{ \ + typedef predicate Predicate; \ + typedef predicate::CMPFUNC SCMPFUNC; \ +public: \ + typedef wxArray_SortFunction::CMPFUNC CMPFUNC; \ +public: \ + void Empty() { clear(); } \ + void Clear() { clear(); } \ + void Alloc(size_t uiSize) { reserve(uiSize); } \ + void Shrink(); \ + \ + size_t GetCount() const { return size(); } \ + void SetCount(size_t n, T v = T()) { resize(n, v); } \ + bool IsEmpty() const { return empty(); } \ + size_t Count() const { return size(); } \ + \ + typedef T base_type; \ + \ +protected: \ + T& Item(size_t uiIndex) const \ + { wxASSERT( uiIndex < size() ); return (T&)operator[](uiIndex); } \ + \ + int Index(T e, bool bFromEnd = false) const; \ + int Index(T lItem, CMPFUNC fnCompare) const; \ + size_t IndexForInsert(T lItem, CMPFUNC fnCompare) const; \ + void Add(T lItem, size_t nInsert = 1) \ + { insert(end(), nInsert, lItem); } \ + size_t Add(T lItem, CMPFUNC fnCompare); \ + void Insert(T lItem, size_t uiIndex, size_t nInsert = 1) \ + { insert(begin() + uiIndex, nInsert, lItem); } \ + void Remove(T lItem); \ + void RemoveAt(size_t uiIndex, size_t nRemove = 1) \ + { erase(begin() + uiIndex, begin() + uiIndex + nRemove); } \ + \ + void Sort(CMPFUNC fCmp) \ + { \ + wxArray_SortFunction p(fCmp); \ + std::sort(begin(), end(), p); \ + } \ +} + +#else // if !wxUSE_STL + +#define _WX_DECLARE_BASEARRAY(T, name, classexp) \ +classexp name \ +{ \ + typedef CMPFUNC SCMPFUNC; /* for compatibility wuth wxUSE_STL */ \ +public: \ + name(); \ + name(const name& array); \ + name& operator=(const name& src); \ + ~name(); \ + \ + void Empty() { m_nCount = 0; } \ + void Clear(); \ + void Alloc(size_t n) { if ( n > m_nSize ) Realloc(n); } \ + void Shrink(); \ + \ + size_t GetCount() const { return m_nCount; } \ + void SetCount(size_t n, T defval = T()); \ + bool IsEmpty() const { return m_nCount == 0; } \ + size_t Count() const { return m_nCount; } \ + \ + typedef T base_type; \ + \ +protected: \ + T& Item(size_t uiIndex) const \ + { wxASSERT( uiIndex < m_nCount ); return m_pItems[uiIndex]; } \ + T& operator[](size_t uiIndex) const { return Item(uiIndex); } \ + \ + int Index(T lItem, bool bFromEnd = false) const; \ + int Index(T lItem, CMPFUNC fnCompare) const; \ + size_t IndexForInsert(T lItem, CMPFUNC fnCompare) const; \ + void Add(T lItem, size_t nInsert = 1); \ + size_t Add(T lItem, CMPFUNC fnCompare); \ + void Insert(T lItem, size_t uiIndex, size_t nInsert = 1); \ + void Remove(T lItem); \ + void RemoveAt(size_t uiIndex, size_t nRemove = 1); \ + \ + void Sort(CMPFUNC fnCompare); \ + \ + /* *minimal* STL-ish interface, for derived classes */ \ + typedef T value_type; \ + typedef value_type* iterator; \ + typedef const value_type* const_iterator; \ + typedef value_type& reference; \ + typedef const value_type& const_reference; \ + typedef int difference_type; \ + typedef size_t size_type; \ + \ + void assign(const_iterator first, const_iterator last); \ + void assign(size_type n, const_reference v); \ + size_type capacity() const { return m_nSize; } \ + iterator erase(iterator first, iterator last) \ + { \ + size_type idx = first - begin(); \ + RemoveAt(idx, last - first); \ + return begin() + idx; \ + } \ + iterator erase(iterator it) { return erase(it, it + 1); } \ + void insert(iterator it, size_type n, const value_type& v) \ + { Insert(v, it - begin(), n); } \ + iterator insert(iterator it, const value_type& v = value_type()) \ + { \ + size_type idx = it - begin(); \ + Insert(v, idx); \ + return begin() + idx; \ + } \ + void insert(iterator it, const_iterator first, const_iterator last);\ + void pop_back() { RemoveAt(size() - 1); } \ + void push_back(const value_type& v) { Add(v); } \ + void reserve(size_type n) { Alloc(n); } \ + void resize(size_type n, value_type v = value_type()) \ + { SetCount(n, v); } \ + \ + iterator begin() { return m_pItems; } \ + iterator end() { return m_pItems + m_nCount; } \ + const_iterator begin() const { return m_pItems; } \ + const_iterator end() const { return m_pItems + m_nCount; } \ + \ + /* the following functions may be made directly public because */ \ + /* they don't use the type of the elements at all */ \ +public: \ + void clear() { Clear(); } \ + bool empty() const { return IsEmpty(); } \ + size_type max_size() const { return INT_MAX; } \ + size_type size() const { return GetCount(); } \ + \ +private: \ + void Grow(size_t nIncrement = 0); \ + bool Realloc(size_t nSize); \ + \ + size_t m_nSize, \ + m_nCount; \ + \ + T *m_pItems; \ +} + +#endif // !wxUSE_STL + +// ============================================================================ +// The private helper macros containing the core of the array classes +// ============================================================================ + +// Implementation notes: +// +// JACS: Salford C++ doesn't like 'var->operator=' syntax, as in: +// { ((wxBaseArray *)this)->operator=((const wxBaseArray&)src); +// so using a temporary variable instead. +// +// The classes need a (even trivial) ~name() to link under Mac X +// +// _WX_ERROR_REMOVE is needed to resolve the name conflict between the wxT() +// macro and T typedef: we can't use wxT() inside WX_DEFINE_ARRAY! + +#define _WX_ERROR_REMOVE wxT("removing inexisting element in wxArray::Remove") + +// ---------------------------------------------------------------------------- +// _WX_DEFINE_TYPEARRAY: array for simple types +// ---------------------------------------------------------------------------- + +#if wxUSE_STL + +#define _WX_DEFINE_TYPEARRAY(T, name, base, classexp) \ +typedef int (CMPFUNC_CONV *CMPFUNC##T)(T *pItem1, T *pItem2); \ +classexp name : public base \ +{ \ +public: \ + T& operator[](size_t uiIndex) const \ + { return (T&)(base::operator[](uiIndex)); } \ + T& Item(size_t uiIndex) const \ + { return (T&)/*const cast*/base::operator[](uiIndex); } \ + T& Last() const \ + { return Item(Count() - 1); } \ + \ + int Index(T e, bool bFromEnd = false) const \ + { return base::Index(e, bFromEnd); } \ + \ + void Add(T lItem, size_t nInsert = 1) \ + { insert(end(), nInsert, lItem); } \ + void Insert(T lItem, size_t uiIndex, size_t nInsert = 1) \ + { insert(begin() + uiIndex, nInsert, lItem); } \ + \ + void RemoveAt(size_t uiIndex, size_t nRemove = 1) \ + { base::RemoveAt(uiIndex, nRemove); } \ + void Remove(T lItem) \ + { int iIndex = Index(lItem); \ + wxCHECK2_MSG( iIndex != wxNOT_FOUND, return, \ + _WX_ERROR_REMOVE); \ + RemoveAt((size_t)iIndex); } \ + \ + void Sort(CMPFUNC##T fCmp) { base::Sort((CMPFUNC)fCmp); } \ +} + +#define _WX_DEFINE_TYPEARRAY_PTR(T, name, base, classexp) \ + _WX_DEFINE_TYPEARRAY(T, name, base, classexp) + +#else // if !wxUSE_STL + +// common declaration used by both _WX_DEFINE_TYPEARRAY and +// _WX_DEFINE_TYPEARRAY_PTR +#define _WX_DEFINE_TYPEARRAY_HELPER(T, name, base, classexp, ptrop) \ +wxCOMPILE_TIME_ASSERT2(sizeof(T) <= sizeof(base::base_type), \ + TypeTooBigToBeStoredIn##base, \ + name); \ +typedef int (CMPFUNC_CONV *CMPFUNC##T)(T *pItem1, T *pItem2); \ +classexp name : public base \ +{ \ +public: \ + name() { } \ + ~name() { } \ + \ + name& operator=(const name& src) \ + { base* temp = (base*) this; \ + (*temp) = ((const base&)src); \ + return *this; } \ + \ + T& operator[](size_t uiIndex) const \ + { return (T&)(base::operator[](uiIndex)); } \ + T& Item(size_t uiIndex) const \ + { return (T&)(base::operator[](uiIndex)); } \ + T& Last() const \ + { return (T&)(base::operator[](Count() - 1)); } \ + \ + int Index(T lItem, bool bFromEnd = false) const \ + { return base::Index((base_type)lItem, bFromEnd); } \ + \ + void Add(T lItem, size_t nInsert = 1) \ + { base::Add((base_type)lItem, nInsert); } \ + void Insert(T lItem, size_t uiIndex, size_t nInsert = 1) \ + { base::Insert((base_type)lItem, uiIndex, nInsert) ; } \ + \ + void RemoveAt(size_t uiIndex, size_t nRemove = 1) \ + { base::RemoveAt(uiIndex, nRemove); } \ + void Remove(T lItem) \ + { int iIndex = Index(lItem); \ + wxCHECK2_MSG( iIndex != wxNOT_FOUND, return, \ + _WX_ERROR_REMOVE); \ + base::RemoveAt((size_t)iIndex); } \ + \ + void Sort(CMPFUNC##T fCmp) { base::Sort((CMPFUNC)fCmp); } \ + \ + /* STL-like interface */ \ +private: \ + typedef base::iterator biterator; \ + typedef base::const_iterator bconst_iterator; \ + typedef base::value_type bvalue_type; \ + typedef base::const_reference bconst_reference; \ +public: \ + typedef T value_type; \ + typedef value_type* pointer; \ + typedef const value_type* const_pointer; \ + typedef value_type* iterator; \ + typedef const value_type* const_iterator; \ + typedef value_type& reference; \ + typedef const value_type& const_reference; \ + typedef base::difference_type difference_type; \ + typedef base::size_type size_type; \ + \ + class reverse_iterator \ + { \ + typedef T value_type; \ + typedef value_type& reference; \ + typedef value_type* pointer; \ + typedef reverse_iterator itor; \ + friend inline itor operator+(int o, const itor& it) \ + { return it.m_ptr - o; } \ + friend inline itor operator+(const itor& it, int o) \ + { return it.m_ptr - o; } \ + friend inline itor operator-(const itor& it, int o) \ + { return it.m_ptr + o; } \ + friend inline difference_type operator-(const itor& i1, \ + const itor& i2) \ + { return i1.m_ptr - i2.m_ptr; } \ + \ + public: \ + pointer m_ptr; \ + reverse_iterator() : m_ptr(NULL) { } \ + reverse_iterator(pointer ptr) : m_ptr(ptr) { } \ + reverse_iterator(const itor& it) : m_ptr(it.m_ptr) { } \ + reference operator*() const { return *m_ptr; } \ + ptrop \ + itor& operator++() { --m_ptr; return *this; } \ + const itor operator++(int) \ + { reverse_iterator tmp = *this; --m_ptr; return tmp; } \ + itor& operator--() { ++m_ptr; return *this; } \ + const itor operator--(int) { itor tmp = *this; ++m_ptr; return tmp; }\ + bool operator ==(const itor& it) const { return m_ptr == it.m_ptr; }\ + bool operator !=(const itor& it) const { return m_ptr != it.m_ptr; }\ + }; \ + \ + class const_reverse_iterator \ + { \ + typedef T value_type; \ + typedef const value_type& reference; \ + typedef const value_type* pointer; \ + typedef const_reverse_iterator itor; \ + friend inline itor operator+(int o, const itor& it) \ + { return it.m_ptr - o; } \ + friend inline itor operator+(const itor& it, int o) \ + { return it.m_ptr - o; } \ + friend inline itor operator-(const itor& it, int o) \ + { return it.m_ptr + o; } \ + friend inline difference_type operator-(const itor& i1, \ + const itor& i2) \ + { return i1.m_ptr - i2.m_ptr; } \ + \ + public: \ + pointer m_ptr; \ + const_reverse_iterator() : m_ptr(NULL) { } \ + const_reverse_iterator(pointer ptr) : m_ptr(ptr) { } \ + const_reverse_iterator(const itor& it) : m_ptr(it.m_ptr) { } \ + const_reverse_iterator(const reverse_iterator& it) : m_ptr(it.m_ptr) { }\ + reference operator*() const { return *m_ptr; } \ + ptrop \ + itor& operator++() { --m_ptr; return *this; } \ + const itor operator++(int) \ + { itor tmp = *this; --m_ptr; return tmp; } \ + itor& operator--() { ++m_ptr; return *this; } \ + const itor operator--(int) { itor tmp = *this; ++m_ptr; return tmp; }\ + bool operator ==(const itor& it) const { return m_ptr == it.m_ptr; }\ + bool operator !=(const itor& it) const { return m_ptr != it.m_ptr; }\ + }; \ + \ + name(size_type n, const_reference v) { assign(n, v); } \ + name(const_iterator first, const_iterator last) \ + { assign(first, last); } \ + void assign(const_iterator first, const_iterator last) \ + { base::assign((bconst_iterator)first, (bconst_iterator)last); } \ + void assign(size_type n, const_reference v) \ + { base::assign(n, (bconst_reference)v); } \ + reference back() { return *(end() - 1); } \ + const_reference back() const { return *(end() - 1); } \ + iterator begin() { return (iterator)base::begin(); } \ + const_iterator begin() const { return (const_iterator)base::begin(); }\ + size_type capacity() const { return base::capacity(); } \ + iterator end() { return (iterator)base::end(); } \ + const_iterator end() const { return (const_iterator)base::end(); } \ + iterator erase(iterator first, iterator last) \ + { return (iterator)base::erase((biterator)first, (biterator)last); }\ + iterator erase(iterator it) \ + { return (iterator)base::erase((biterator)it); } \ + reference front() { return *begin(); } \ + const_reference front() const { return *begin(); } \ + void insert(iterator it, size_type n, const_reference v) \ + { base::insert((biterator)it, n, (bconst_reference)v); } \ + iterator insert(iterator it, const_reference v = value_type()) \ + { return (iterator)base::insert((biterator)it, (bconst_reference)v); }\ + void insert(iterator it, const_iterator first, const_iterator last) \ + { base::insert((biterator)it, (bconst_iterator)first, \ + (bconst_iterator)last); } \ + void pop_back() { base::pop_back(); } \ + void push_back(const_reference v) \ + { base::push_back((bconst_reference)v); } \ + reverse_iterator rbegin() { return reverse_iterator(end() - 1); } \ + const_reverse_iterator rbegin() const; \ + reverse_iterator rend() { return reverse_iterator(begin() - 1); } \ + const_reverse_iterator rend() const; \ + void reserve(size_type n) { base::reserve(n); } \ + void resize(size_type n, value_type v = value_type()) \ + { base::resize(n, v); } \ +} + +#define _WX_PTROP pointer operator->() const { return m_ptr; } +#define _WX_PTROP_NONE + +#define _WX_DEFINE_TYPEARRAY(T, name, base, classexp) \ + _WX_DEFINE_TYPEARRAY_HELPER(T, name, base, classexp, _WX_PTROP) +#define _WX_DEFINE_TYPEARRAY_PTR(T, name, base, classexp) \ + _WX_DEFINE_TYPEARRAY_HELPER(T, name, base, classexp, _WX_PTROP_NONE) + +#endif // !wxUSE_STL + +// ---------------------------------------------------------------------------- +// _WX_DEFINE_SORTED_TYPEARRAY: sorted array for simple data types +// cannot handle types with size greater than pointer because of sorting +// ---------------------------------------------------------------------------- + +#define _WX_DEFINE_SORTED_TYPEARRAY_2(T, name, base, defcomp, classexp, comptype)\ +wxCOMPILE_TIME_ASSERT2(sizeof(T) <= sizeof(base::base_type), \ + TypeTooBigToBeStoredInSorted##base, \ + name); \ +classexp name : public base \ +{ \ + typedef comptype SCMPFUNC; \ +public: \ + name(comptype fn defcomp) { m_fnCompare = fn; } \ + \ + name& operator=(const name& src) \ + { base* temp = (base*) this; \ + (*temp) = ((const base&)src); \ + m_fnCompare = src.m_fnCompare; \ + return *this; } \ + \ + T& operator[](size_t uiIndex) const \ + { return (T&)(base::operator[](uiIndex)); } \ + T& Item(size_t uiIndex) const \ + { return (T&)(base::operator[](uiIndex)); } \ + T& Last() const \ + { return (T&)(base::operator[](size() - 1)); } \ + \ + int Index(T lItem) const \ + { return base::Index(lItem, (CMPFUNC)m_fnCompare); } \ + \ + size_t IndexForInsert(T lItem) const \ + { return base::IndexForInsert(lItem, (CMPFUNC)m_fnCompare); } \ + \ + void AddAt(T item, size_t index) \ + { base::insert(begin() + index, item); } \ + \ + size_t Add(T lItem) \ + { return base::Add(lItem, (CMPFUNC)m_fnCompare); } \ + \ + void RemoveAt(size_t uiIndex, size_t nRemove = 1) \ + { base::erase(begin() + uiIndex, begin() + uiIndex + nRemove); } \ + void Remove(T lItem) \ + { int iIndex = Index(lItem); \ + wxCHECK2_MSG( iIndex != wxNOT_FOUND, return, \ + _WX_ERROR_REMOVE ); \ + base::erase(begin() + iIndex); } \ + \ +private: \ + comptype m_fnCompare; \ +} + + +// ---------------------------------------------------------------------------- +// _WX_DECLARE_OBJARRAY: an array for pointers to type T with owning semantics +// ---------------------------------------------------------------------------- + +#define _WX_DECLARE_OBJARRAY(T, name, base, classexp) \ +typedef int (CMPFUNC_CONV *CMPFUNC##T)(T **pItem1, T **pItem2); \ +classexp name : protected base \ +{ \ +typedef int (CMPFUNC_CONV *CMPFUNC##base)(void **pItem1, void **pItem2); \ +typedef base base_array; \ +public: \ + name() { } \ + name(const name& src); \ + name& operator=(const name& src); \ + \ + ~name(); \ + \ + void Alloc(size_t count) { reserve(count); } \ + size_t GetCount() const { return base_array::size(); } \ + size_t size() const { return base_array::size(); } \ + bool IsEmpty() const { return base_array::empty(); } \ + bool empty() const { return base_array::empty(); } \ + size_t Count() const { return base_array::size(); } \ + void Shrink() { base::Shrink(); } \ + \ + T& operator[](size_t uiIndex) const \ + { return *(T*)base::operator[](uiIndex); } \ + T& Item(size_t uiIndex) const \ + { return *(T*)base::operator[](uiIndex); } \ + T& Last() const \ + { return *(T*)(base::operator[](size() - 1)); } \ + \ + int Index(const T& lItem, bool bFromEnd = false) const; \ + \ + void Add(const T& lItem, size_t nInsert = 1); \ + void Add(const T* pItem) \ + { base::push_back((T*)pItem); } \ + void push_back(const T* pItem) \ + { base::push_back((T*)pItem); } \ + void push_back(const T& lItem) \ + { Add(lItem); } \ + \ + void Insert(const T& lItem, size_t uiIndex, size_t nInsert = 1); \ + void Insert(const T* pItem, size_t uiIndex) \ + { base::insert(begin() + uiIndex, (T*)pItem); } \ + \ + void Empty() { DoEmpty(); base::clear(); } \ + void Clear() { DoEmpty(); base::clear(); } \ + \ + T* Detach(size_t uiIndex) \ + { T* p = (T*)base::operator[](uiIndex); \ + base::erase(begin() + uiIndex); return p; } \ + void RemoveAt(size_t uiIndex, size_t nRemove = 1); \ + \ + void Sort(CMPFUNC##T fCmp) { base::Sort((CMPFUNC##base)fCmp); } \ + \ +private: \ + void DoEmpty(); \ + void DoCopy(const name& src); \ +} + +// ============================================================================ +// The public macros for declaration and definition of the dynamic arrays +// ============================================================================ + +// Please note that for each macro WX_FOO_ARRAY we also have +// WX_FOO_EXPORTED_ARRAY and WX_FOO_USER_EXPORTED_ARRAY which are exactly the +// same except that they use an additional __declspec(dllexport) or equivalent +// under Windows if needed. +// +// The first (just EXPORTED) macros do it if wxWidgets was compiled as a DLL +// and so must be used used inside the library. The second kind (USER_EXPORTED) +// allow the user code to do it when it wants. This is needed if you have a dll +// that wants to export a wxArray daubed with your own import/export goo. +// +// Finally, you can define the macro below as something special to modify the +// arrays defined by a simple WX_FOO_ARRAY as well. By default is is empty. +#define wxARRAY_DEFAULT_EXPORT + +// ---------------------------------------------------------------------------- +// WX_DECLARE_BASEARRAY(T, name) declare an array class named "name" containing +// the elements of type T +// ---------------------------------------------------------------------------- + +#define WX_DECLARE_BASEARRAY(T, name) \ + WX_DECLARE_USER_EXPORTED_BASEARRAY(T, name, wxARRAY_DEFAULT_EXPORT) + +#define WX_DECLARE_EXPORTED_BASEARRAY(T, name) \ + WX_DECLARE_USER_EXPORTED_BASEARRAY(T, name, WXDLLEXPORT) + +#define WX_DECLARE_USER_EXPORTED_BASEARRAY(T, name, expmode) \ + typedef T _wxArray##name; \ + _WX_DECLARE_BASEARRAY(_wxArray##name, name, class expmode) + +// ---------------------------------------------------------------------------- +// WX_DEFINE_TYPEARRAY(T, name, base) define an array class named "name" deriving +// from class "base" containing the elements of type T +// +// Note that the class defined has only inline function and doesn't take any +// space at all so there is no size penalty for defining multiple array classes +// ---------------------------------------------------------------------------- + +#define WX_DEFINE_TYPEARRAY(T, name, base) \ + WX_DEFINE_TYPEARRAY_WITH_DECL(T, name, base, class wxARRAY_DEFAULT_EXPORT) + +#define WX_DEFINE_TYPEARRAY_PTR(T, name, base) \ + WX_DEFINE_TYPEARRAY_WITH_DECL_PTR(T, name, base, class wxARRAY_DEFAULT_EXPORT) + +#define WX_DEFINE_EXPORTED_TYPEARRAY(T, name, base) \ + WX_DEFINE_TYPEARRAY_WITH_DECL(T, name, base, class WXDLLEXPORT) + +#define WX_DEFINE_EXPORTED_TYPEARRAY_PTR(T, name, base) \ + WX_DEFINE_TYPEARRAY_WITH_DECL_PTR(T, name, base, class WXDLLEXPORT) + +#define WX_DEFINE_USER_EXPORTED_TYPEARRAY(T, name, base, expdecl) \ + WX_DEFINE_TYPEARRAY_WITH_DECL(T, name, base, class expdecl) + +#define WX_DEFINE_USER_EXPORTED_TYPEARRAY_PTR(T, name, base, expdecl) \ + WX_DEFINE_TYPEARRAY_WITH_DECL_PTR(T, name, base, class expdecl) + +#define WX_DEFINE_TYPEARRAY_WITH_DECL(T, name, base, classdecl) \ + typedef T _wxArray##name; \ + _WX_DEFINE_TYPEARRAY(_wxArray##name, name, base, classdecl) + +#define WX_DEFINE_TYPEARRAY_WITH_DECL_PTR(T, name, base, classdecl) \ + typedef T _wxArray##name; \ + _WX_DEFINE_TYPEARRAY_PTR(_wxArray##name, name, base, classdecl) + +// ---------------------------------------------------------------------------- +// WX_DEFINE_SORTED_TYPEARRAY: this is the same as the previous macro, but it +// defines a sorted array. +// +// Differences: +// 1) it must be given a COMPARE function in ctor which takes 2 items of type +// T* and should return -1, 0 or +1 if the first one is less/greater +// than/equal to the second one. +// 2) the Add() method inserts the item in such was that the array is always +// sorted (it uses the COMPARE function) +// 3) it has no Sort() method because it's always sorted +// 4) Index() method is much faster (the sorted arrays use binary search +// instead of linear one), but Add() is slower. +// 5) there is no Insert() method because you can't insert an item into the +// given position in a sorted array but there is IndexForInsert()/AddAt() +// pair which may be used to optimize a common operation of "insert only if +// not found" +// +// Note that you have to specify the comparison function when creating the +// objects of this array type. If, as in 99% of cases, the comparison function +// is the same for all objects of a class, WX_DEFINE_SORTED_TYPEARRAY_CMP below +// is more convenient. +// +// Summary: use this class when the speed of Index() function is important, use +// the normal arrays otherwise. +// ---------------------------------------------------------------------------- + +// we need a macro which expands to nothing to pass correct number of +// parameters to a nested macro invocation even when we don't have anything to +// pass it +#define wxARRAY_EMPTY + +#define WX_DEFINE_SORTED_TYPEARRAY(T, name, base) \ + WX_DEFINE_SORTED_USER_EXPORTED_TYPEARRAY(T, name, base, \ + wxARRAY_DEFAULT_EXPORT) + +#define WX_DEFINE_SORTED_EXPORTED_TYPEARRAY(T, name, base) \ + WX_DEFINE_SORTED_USER_EXPORTED_TYPEARRAY(T, name, base, WXDLLEXPORT) + +#define WX_DEFINE_SORTED_USER_EXPORTED_TYPEARRAY(T, name, base, expmode) \ + typedef T _wxArray##name; \ + typedef int (CMPFUNC_CONV *SCMPFUNC##name)(T pItem1, T pItem2); \ + _WX_DEFINE_SORTED_TYPEARRAY_2(_wxArray##name, name, base, \ + wxARRAY_EMPTY, class expmode, SCMPFUNC##name) + +// ---------------------------------------------------------------------------- +// WX_DEFINE_SORTED_TYPEARRAY_CMP: exactly the same as above but the comparison +// function is provided by this macro and the objects of this class have a +// default constructor which just uses it. +// +// The arguments are: the element type, the comparison function and the array +// name +// +// NB: this is, of course, how WX_DEFINE_SORTED_TYPEARRAY() should have worked +// from the very beginning - unfortunately I didn't think about this earlier +// ---------------------------------------------------------------------------- + +#define WX_DEFINE_SORTED_TYPEARRAY_CMP(T, cmpfunc, name, base) \ + WX_DEFINE_SORTED_USER_EXPORTED_TYPEARRAY_CMP(T, cmpfunc, name, base, \ + wxARRAY_DEFAULT_EXPORT) + +#define WX_DEFINE_SORTED_EXPORTED_TYPEARRAY_CMP(T, cmpfunc, name, base) \ + WX_DEFINE_SORTED_USER_EXPORTED_TYPEARRAY_CMP(T, cmpfunc, name, base, \ + WXDLLEXPORT) + +#define WX_DEFINE_SORTED_USER_EXPORTED_TYPEARRAY_CMP(T, cmpfunc, name, base, \ + expmode) \ + typedef T _wxArray##name; \ + typedef int (CMPFUNC_CONV *SCMPFUNC##name)(T pItem1, T pItem2); \ + _WX_DEFINE_SORTED_TYPEARRAY_2(_wxArray##name, name, base, = cmpfunc, \ + class expmode, SCMPFUNC##name) + +// ---------------------------------------------------------------------------- +// WX_DECLARE_OBJARRAY(T, name): this macro generates a new array class +// named "name" which owns the objects of type T it contains, i.e. it will +// delete them when it is destroyed. +// +// An element is of type T*, but arguments of type T& are taken (see below!) +// and T& is returned. +// +// Don't use this for simple types such as "int" or "long"! +// +// Note on Add/Insert functions: +// 1) function(T*) gives the object to the array, i.e. it will delete the +// object when it's removed or in the array's dtor +// 2) function(T&) will create a copy of the object and work with it +// +// Also: +// 1) Remove() will delete the object after removing it from the array +// 2) Detach() just removes the object from the array (returning pointer to it) +// +// NB1: Base type T should have an accessible copy ctor if Add(T&) is used +// NB2: Never ever cast a array to it's base type: as dtor is not virtual +// and so you risk having at least the memory leaks and probably worse +// +// Some functions of this class are not inline, so it takes some space to +// define new class from this template even if you don't use it - which is not +// the case for the simple (non-object) array classes +// +// To use an objarray class you must +// #include "dynarray.h" +// WX_DECLARE_OBJARRAY(element_type, list_class_name) +// #include "arrimpl.cpp" +// WX_DEFINE_OBJARRAY(list_class_name) // name must be the same as above! +// +// This is necessary because at the moment of DEFINE_OBJARRAY class parsing the +// element_type must be fully defined (i.e. forward declaration is not +// enough), while WX_DECLARE_OBJARRAY may be done anywhere. The separation of +// two allows to break cicrcular dependencies with classes which have member +// variables of objarray type. +// ---------------------------------------------------------------------------- + +#define WX_DECLARE_OBJARRAY(T, name) \ + WX_DECLARE_USER_EXPORTED_OBJARRAY(T, name, wxARRAY_DEFAULT_EXPORT) + +#define WX_DECLARE_EXPORTED_OBJARRAY(T, name) \ + WX_DECLARE_USER_EXPORTED_OBJARRAY(T, name, WXDLLEXPORT) + +#define WX_DECLARE_OBJARRAY_WITH_DECL(T, name, decl) \ + typedef T _wxObjArray##name; \ + _WX_DECLARE_OBJARRAY(_wxObjArray##name, name, wxArrayPtrVoid, decl) + +#define WX_DECLARE_USER_EXPORTED_OBJARRAY(T, name, expmode) \ + WX_DECLARE_OBJARRAY_WITH_DECL(T, name, class expmode) + +// WX_DEFINE_OBJARRAY is going to be redefined when arrimpl.cpp is included, +// try to provoke a human-understandable error if it used incorrectly. +// +// there is no real need for 3 different macros in the DEFINE case but do it +// anyhow for consistency +#define WX_DEFINE_OBJARRAY(name) DidYouIncludeArrimplCpp +#define WX_DEFINE_EXPORTED_OBJARRAY(name) WX_DEFINE_OBJARRAY(name) +#define WX_DEFINE_USER_EXPORTED_OBJARRAY(name) WX_DEFINE_OBJARRAY(name) + +// ---------------------------------------------------------------------------- +// Some commonly used predefined base arrays +// ---------------------------------------------------------------------------- + +WX_DECLARE_USER_EXPORTED_BASEARRAY(const void *, wxBaseArrayPtrVoid, + WXDLLIMPEXP_BASE); +WX_DECLARE_USER_EXPORTED_BASEARRAY(char, wxBaseArrayChar, WXDLLIMPEXP_BASE); +WX_DECLARE_USER_EXPORTED_BASEARRAY(short, wxBaseArrayShort, WXDLLIMPEXP_BASE); +WX_DECLARE_USER_EXPORTED_BASEARRAY(int, wxBaseArrayInt, WXDLLIMPEXP_BASE); +WX_DECLARE_USER_EXPORTED_BASEARRAY(long, wxBaseArrayLong, WXDLLIMPEXP_BASE); +WX_DECLARE_USER_EXPORTED_BASEARRAY(size_t, wxBaseArraySizeT, WXDLLIMPEXP_BASE); +WX_DECLARE_USER_EXPORTED_BASEARRAY(double, wxBaseArrayDouble, WXDLLIMPEXP_BASE); + +// ---------------------------------------------------------------------------- +// Convenience macros to define arrays from base arrays +// ---------------------------------------------------------------------------- + +#define WX_DEFINE_ARRAY(T, name) \ + WX_DEFINE_TYPEARRAY(T, name, wxBaseArrayPtrVoid) +#define WX_DEFINE_ARRAY_PTR(T, name) \ + WX_DEFINE_TYPEARRAY_PTR(T, name, wxBaseArrayPtrVoid) +#define WX_DEFINE_EXPORTED_ARRAY(T, name) \ + WX_DEFINE_EXPORTED_TYPEARRAY(T, name, wxBaseArrayPtrVoid) +#define WX_DEFINE_EXPORTED_ARRAY_PTR(T, name) \ + WX_DEFINE_EXPORTED_TYPEARRAY_PTR(T, name, wxBaseArrayPtrVoid) +#define WX_DEFINE_ARRAY_WITH_DECL_PTR(T, name, decl) \ + WX_DEFINE_TYPEARRAY_WITH_DECL_PTR(T, name, wxBaseArrayPtrVoid, decl) +#define WX_DEFINE_USER_EXPORTED_ARRAY(T, name, expmode) \ + WX_DEFINE_TYPEARRAY_WITH_DECL(T, name, wxBaseArrayPtrVoid, wxARRAY_EMPTY expmode) +#define WX_DEFINE_USER_EXPORTED_ARRAY_PTR(T, name, expmode) \ + WX_DEFINE_TYPEARRAY_WITH_DECL_PTR(T, name, wxBaseArrayPtrVoid, wxARRAY_EMPTY expmode) + +#define WX_DEFINE_ARRAY_CHAR(T, name) \ + WX_DEFINE_TYPEARRAY_PTR(T, name, wxBaseArrayChar) +#define WX_DEFINE_EXPORTED_ARRAY_CHAR(T, name) \ + WX_DEFINE_EXPORTED_TYPEARRAY_PTR(T, name, wxBaseArrayChar) +#define WX_DEFINE_USER_EXPORTED_ARRAY_CHAR(T, name, expmode) \ + WX_DEFINE_TYPEARRAY_WITH_DECL_PTR(T, name, wxBaseArrayChar, wxARRAY_EMPTY expmode) + +#define WX_DEFINE_ARRAY_SHORT(T, name) \ + WX_DEFINE_TYPEARRAY_PTR(T, name, wxBaseArrayShort) +#define WX_DEFINE_EXPORTED_ARRAY_SHORT(T, name) \ + WX_DEFINE_EXPORTED_TYPEARRAY_PTR(T, name, wxBaseArrayShort) +#define WX_DEFINE_USER_EXPORTED_ARRAY_SHORT(T, name, expmode) \ + WX_DEFINE_TYPEARRAY_WITH_DECL_PTR(T, name, wxBaseArrayShort, wxARRAY_EMPTY expmode) + +#define WX_DEFINE_ARRAY_INT(T, name) \ + WX_DEFINE_TYPEARRAY_PTR(T, name, wxBaseArrayInt) +#define WX_DEFINE_EXPORTED_ARRAY_INT(T, name) \ + WX_DEFINE_EXPORTED_TYPEARRAY_PTR(T, name, wxBaseArrayInt) +#define WX_DEFINE_USER_EXPORTED_ARRAY_INT(T, name, expmode) \ + WX_DEFINE_TYPEARRAY_WITH_DECL_PTR(T, name, wxBaseArrayInt, wxARRAY_EMPTY expmode) + +#define WX_DEFINE_ARRAY_LONG(T, name) \ + WX_DEFINE_TYPEARRAY_PTR(T, name, wxBaseArrayLong) +#define WX_DEFINE_EXPORTED_ARRAY_LONG(T, name) \ + WX_DEFINE_EXPORTED_TYPEARRAY_PTR(T, name, wxBaseArrayLong) +#define WX_DEFINE_USER_EXPORTED_ARRAY_LONG(T, name, expmode) \ + WX_DEFINE_TYPEARRAY_WITH_DECL_PTR(T, name, wxBaseArrayLong, wxARRAY_EMPTY expmode) + +#define WX_DEFINE_ARRAY_SIZE_T(T, name) \ + WX_DEFINE_TYPEARRAY_PTR(T, name, wxBaseArraySizeT) +#define WX_DEFINE_EXPORTED_ARRAY_SIZE_T(T, name) \ + WX_DEFINE_EXPORTED_TYPEARRAY_PTR(T, name, wxBaseArraySizeT) +#define WX_DEFINE_USER_EXPORTED_ARRAY_SIZE_T(T, name, expmode) \ + WX_DEFINE_TYPEARRAY_WITH_DECL_PTR(T, name, wxBaseArraySizeT, wxARRAY_EMPTY expmode) + +#define WX_DEFINE_ARRAY_DOUBLE(T, name) \ + WX_DEFINE_TYPEARRAY_PTR(T, name, wxBaseArrayDouble) +#define WX_DEFINE_EXPORTED_ARRAY_DOUBLE(T, name) \ + WX_DEFINE_EXPORTED_TYPEARRAY_PTR(T, name, wxBaseArrayDouble) +#define WX_DEFINE_USER_EXPORTED_ARRAY_DOUBLE(T, name, expmode) \ + WX_DEFINE_TYPEARRAY_WITH_DECL_PTR(T, name, wxBaseArrayDouble, wxARRAY_EMPTY expmode) + +// ---------------------------------------------------------------------------- +// Convenience macros to define sorted arrays from base arrays +// ---------------------------------------------------------------------------- + +#define WX_DEFINE_SORTED_ARRAY(T, name) \ + WX_DEFINE_SORTED_TYPEARRAY(T, name, wxBaseArrayPtrVoid) +#define WX_DEFINE_SORTED_EXPORTED_ARRAY(T, name) \ + WX_DEFINE_SORTED_EXPORTED_TYPEARRAY(T, name, wxBaseArrayPtrVoid) +#define WX_DEFINE_SORTED_USER_EXPORTED_ARRAY(T, name, expmode) \ + WX_DEFINE_SORTED_USER_EXPORTED_TYPEARRAY(T, name, wxBaseArrayPtrVoid, wxARRAY_EMPTY expmode) + +#define WX_DEFINE_SORTED_ARRAY_CHAR(T, name) \ + WX_DEFINE_SORTED_TYPEARRAY(T, name, wxBaseArrayChar) +#define WX_DEFINE_SORTED_EXPORTED_ARRAY_CHAR(T, name) \ + WX_DEFINE_SORTED_EXPORTED_TYPEARRAY(T, name, wxBaseArrayChar) +#define WX_DEFINE_SORTED_USER_EXPORTED_ARRAY_CHAR(T, name, expmode) \ + WX_DEFINE_SORTED_USER_EXPORTED_TYPEARRAY(T, name, wxBaseArrayChar, wxARRAY_EMPTY expmode) + +#define WX_DEFINE_SORTED_ARRAY_SHORT(T, name) \ + WX_DEFINE_SORTED_TYPEARRAY(T, name, wxBaseArrayShort) +#define WX_DEFINE_SORTED_EXPORTED_ARRAY_SHORT(T, name) \ + WX_DEFINE_SORTED_EXPORTED_TYPEARRAY(T, name, wxBaseArrayShort) +#define WX_DEFINE_SORTED_USER_EXPORTED_ARRAY_SHORT(T, name, expmode) \ + WX_DEFINE_SORTED_USER_EXPORTED_TYPEARRAY(T, name, wxBaseArrayShort, wxARRAY_EMPTY expmode) + +#define WX_DEFINE_SORTED_ARRAY_INT(T, name) \ + WX_DEFINE_SORTED_TYPEARRAY(T, name, wxBaseArrayInt) +#define WX_DEFINE_SORTED_EXPORTED_ARRAY_INT(T, name) \ + WX_DEFINE_SORTED_EXPORTED_TYPEARRAY(T, name, wxBaseArrayInt) +#define WX_DEFINE_SORTED_USER_EXPORTED_ARRAY_INT(T, name, expmode) \ + WX_DEFINE_SORTED_USER_EXPORTED_TYPEARRAY(T, name, wxBaseArrayInt, expmode) + +#define WX_DEFINE_SORTED_ARRAY_LONG(T, name) \ + WX_DEFINE_SORTED_TYPEARRAY(T, name, wxBaseArrayLong) +#define WX_DEFINE_SORTED_EXPORTED_ARRAY_LONG(T, name) \ + WX_DEFINE_SORTED_EXPORTED_TYPEARRAY(T, name, wxBaseArrayLong) +#define WX_DEFINE_SORTED_USER_EXPORTED_ARRAY_LONG(T, name, expmode) \ + WX_DEFINE_SORTED_USER_EXPORTED_TYPEARRAY(T, name, wxBaseArrayLong, expmode) + +#define WX_DEFINE_SORTED_ARRAY_SIZE_T(T, name) \ + WX_DEFINE_SORTED_TYPEARRAY(T, name, wxBaseArraySizeT) +#define WX_DEFINE_SORTED_EXPORTED_ARRAY_SIZE_T(T, name) \ + WX_DEFINE_SORTED_EXPORTED_TYPEARRAY(T, name, wxBaseArraySizeT) +#define WX_DEFINE_SORTED_USER_EXPORTED_ARRAY_SIZE_T(T, name, expmode) \ + WX_DEFINE_SORTED_USER_EXPORTED_TYPEARRAY(T, name, wxBaseArraySizeT, wxARRAY_EMPTY expmode) + +// ---------------------------------------------------------------------------- +// Convenience macros to define sorted arrays from base arrays +// ---------------------------------------------------------------------------- + +#define WX_DEFINE_SORTED_ARRAY_CMP(T, cmpfunc, name) \ + WX_DEFINE_SORTED_TYPEARRAY_CMP(T, cmpfunc, name, wxBaseArrayPtrVoid) +#define WX_DEFINE_SORTED_EXPORTED_ARRAY_CMP(T, cmpfunc, name) \ + WX_DEFINE_SORTED_EXPORTED_TYPEARRAY_CMP(T, cmpfunc, name, wxBaseArrayPtrVoid) +#define WX_DEFINE_SORTED_USER_EXPORTED_ARRAY_CMP(T, cmpfunc, \ + name, expmode) \ + WX_DEFINE_SORTED_USER_EXPORTED_TYPEARRAY_CMP(T, cmpfunc, name, \ + wxBaseArrayPtrVoid, \ + wxARRAY_EMPTY expmode) + +#define WX_DEFINE_SORTED_ARRAY_CMP_CHAR(T, cmpfunc, name) \ + WX_DEFINE_SORTED_TYPEARRAY_CMP(T, cmpfunc, name, wxBaseArrayChar) +#define WX_DEFINE_SORTED_EXPORTED_ARRAY_CMP_CHAR(T, cmpfunc, name) \ + WX_DEFINE_SORTED_EXPORTED_TYPEARRAY_CMP(T, cmpfunc, name, wxBaseArrayChar) +#define WX_DEFINE_SORTED_USER_EXPORTED_ARRAY_CMP_CHAR(T, cmpfunc, \ + name, expmode) \ + WX_DEFINE_SORTED_USER_EXPORTED_TYPEARRAY_CMP(T, cmpfunc, name, \ + wxBaseArrayChar, \ + wxARRAY_EMPTY expmode) + +#define WX_DEFINE_SORTED_ARRAY_CMP_SHORT(T, cmpfunc, name) \ + WX_DEFINE_SORTED_TYPEARRAY_CMP(T, cmpfunc, name, wxBaseArrayShort) +#define WX_DEFINE_SORTED_EXPORTED_ARRAY_CMP_SHORT(T, cmpfunc, name) \ + WX_DEFINE_SORTED_EXPORTED_TYPEARRAY_CMP(T, cmpfunc, name, wxBaseArrayShort) +#define WX_DEFINE_SORTED_USER_EXPORTED_ARRAY_CMP_SHORT(T, cmpfunc, \ + name, expmode) \ + WX_DEFINE_SORTED_USER_EXPORTED_TYPEARRAY_CMP(T, cmpfunc, name, \ + wxBaseArrayShort, \ + wxARRAY_EMPTY expmode) + +#define WX_DEFINE_SORTED_ARRAY_CMP_INT(T, cmpfunc, name) \ + WX_DEFINE_SORTED_TYPEARRAY_CMP(T, cmpfunc, name, wxBaseArrayInt) +#define WX_DEFINE_SORTED_EXPORTED_ARRAY_CMP_INT(T, cmpfunc, name) \ + WX_DEFINE_SORTED_EXPORTED_TYPEARRAY_CMP(T, cmpfunc, name, wxBaseArrayInt) +#define WX_DEFINE_SORTED_USER_EXPORTED_ARRAY_CMP_INT(T, cmpfunc, \ + name, expmode) \ + WX_DEFINE_SORTED_USER_EXPORTED_TYPEARRAY_CMP(T, cmpfunc, name, \ + wxBaseArrayInt, \ + wxARRAY_EMPTY expmode) + +#define WX_DEFINE_SORTED_ARRAY_CMP_LONG(T, cmpfunc, name) \ + WX_DEFINE_SORTED_TYPEARRAY_CMP(T, cmpfunc, name, wxBaseArrayLong) +#define WX_DEFINE_SORTED_EXPORTED_ARRAY_CMP_LONG(T, cmpfunc, name) \ + WX_DEFINE_SORTED_EXPORTED_TYPEARRAY_CMP(T, cmpfunc, name, wxBaseArrayLong) +#define WX_DEFINE_SORTED_USER_EXPORTED_ARRAY_CMP_LONG(T, cmpfunc, \ + name, expmode) \ + WX_DEFINE_SORTED_USER_EXPORTED_TYPEARRAY_CMP(T, cmpfunc, name, \ + wxBaseArrayLong, \ + wxARRAY_EMPTY expmode) + +#define WX_DEFINE_SORTED_ARRAY_CMP_SIZE_T(T, cmpfunc, name) \ + WX_DEFINE_SORTED_TYPEARRAY_CMP(T, cmpfunc, name, wxBaseArraySizeT) +#define WX_DEFINE_SORTED_EXPORTED_ARRAY_CMP_SIZE_T(T, cmpfunc, name) \ + WX_DEFINE_SORTED_EXPORTED_TYPEARRAY_CMP(T, cmpfunc, name, wxBaseArraySizeT) +#define WX_DEFINE_SORTED_USER_EXPORTED_ARRAY_CMP_SIZE_T(T, cmpfunc, \ + name, expmode) \ + WX_DEFINE_SORTED_USER_EXPORTED_TYPEARRAY_CMP(T, cmpfunc, name, \ + wxBaseArraySizeT, \ + wxARRAY_EMPTY expmode) + +// ---------------------------------------------------------------------------- +// Some commonly used predefined arrays +// ---------------------------------------------------------------------------- + +WX_DEFINE_USER_EXPORTED_ARRAY_SHORT(short, wxArrayShort, class WXDLLIMPEXP_BASE); +WX_DEFINE_USER_EXPORTED_ARRAY_INT(int, wxArrayInt, class WXDLLIMPEXP_BASE); +WX_DEFINE_USER_EXPORTED_ARRAY_DOUBLE(double, wxArrayDouble, class WXDLLIMPEXP_BASE); +WX_DEFINE_USER_EXPORTED_ARRAY_LONG(long, wxArrayLong, class WXDLLIMPEXP_BASE); +WX_DEFINE_USER_EXPORTED_ARRAY_PTR(void *, wxArrayPtrVoid, class WXDLLIMPEXP_BASE); + +// ----------------------------------------------------------------------------- +// convenience macros +// ----------------------------------------------------------------------------- + +// prepend all element of one array to another one; e.g. if first array contains +// elements X,Y,Z and the second contains A,B,C (in those orders), then the +// first array will be result as A,B,C,X,Y,Z +#define WX_PREPEND_ARRAY(array, other) \ + { \ + size_t wxAAcnt = (other).size(); \ + (array).Alloc(wxAAcnt); \ + for ( size_t wxAAn = 0; wxAAn < wxAAcnt; wxAAn++ ) \ + { \ + (array).Insert((other)[wxAAn], wxAAn); \ + } \ + } + +// append all element of one array to another one +#define WX_APPEND_ARRAY(array, other) \ + { \ + size_t wxAAcnt = (other).size(); \ + (array).Alloc(wxAAcnt); \ + for ( size_t wxAAn = 0; wxAAn < wxAAcnt; wxAAn++ ) \ + { \ + (array).push_back((other)[wxAAn]); \ + } \ + } + +// delete all array elements +// +// NB: the class declaration of the array elements must be visible from the +// place where you use this macro, otherwise the proper destructor may not +// be called (a decent compiler should give a warning about it, but don't +// count on it)! +#define WX_CLEAR_ARRAY(array) \ + { \ + size_t wxAAcnt = (array).size(); \ + for ( size_t wxAAn = 0; wxAAn < wxAAcnt; wxAAn++ ) \ + { \ + delete (array)[wxAAn]; \ + } \ + \ + (array).clear(); \ + } + +#endif // _DYNARRAY_H diff --git a/Externals/wxWidgets/include/wx/dynlib.h b/Externals/wxWidgets/include/wx/dynlib.h new file mode 100644 index 0000000000..2b74627392 --- /dev/null +++ b/Externals/wxWidgets/include/wx/dynlib.h @@ -0,0 +1,324 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/dynlib.h +// Purpose: Dynamic library loading classes +// Author: Guilhem Lavaux, Vadim Zeitlin, Vaclav Slavik +// Modified by: +// Created: 20/07/98 +// RCS-ID: $Id: dynlib.h 36214 2005-11-20 21:23:53Z VZ $ +// Copyright: (c) 1998 Guilhem Lavaux +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DYNLIB_H__ +#define _WX_DYNLIB_H__ + +#include "wx/defs.h" + +#if wxUSE_DYNLIB_CLASS + +#include "wx/string.h" +#include "wx/dynarray.h" + +#if defined(__OS2__) || defined(__EMX__) +#include "wx/os2/private.h" +#endif + +#ifdef __WXMSW__ +#include "wx/msw/private.h" +#endif + +// note that we have our own dlerror() implementation under Darwin +#if (defined(HAVE_DLERROR) && !defined(__EMX__)) || defined(__DARWIN__) + #define wxHAVE_DYNLIB_ERROR +#endif + +class WXDLLIMPEXP_BASE wxDynamicLibraryDetailsCreator; + +// ---------------------------------------------------------------------------- +// conditional compilation +// ---------------------------------------------------------------------------- + +// Note: __OS2__/EMX has to be tested first, since we want to use +// native version, even if configure detected presence of DLOPEN. +#if defined(__OS2__) || defined(__EMX__) || defined(__WINDOWS__) + typedef HMODULE wxDllType; +#elif defined(HAVE_DLOPEN) + #include + typedef void *wxDllType; +#elif defined(HAVE_SHL_LOAD) + #include + typedef shl_t wxDllType; +#elif defined(__DARWIN__) + typedef void *wxDllType; +#elif defined(__WXMAC__) + #include + typedef CFragConnectionID wxDllType; +#else + #error "Dynamic Loading classes can't be compiled on this platform, sorry." +#endif + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +enum wxDLFlags +{ + wxDL_LAZY = 0x00000001, // resolve undefined symbols at first use + // (only works on some Unix versions) + wxDL_NOW = 0x00000002, // resolve undefined symbols on load + // (default, always the case under Win32) + wxDL_GLOBAL = 0x00000004, // export extern symbols to subsequently + // loaded libs. + wxDL_VERBATIM = 0x00000008, // attempt to load the supplied library + // name without appending the usual dll + // filename extension. + wxDL_NOSHARE = 0x00000010, // load new DLL, don't reuse already loaded + // (only for wxPluginManager) + + wxDL_DEFAULT = wxDL_NOW // default flags correspond to Win32 +}; + +enum wxDynamicLibraryCategory +{ + wxDL_LIBRARY, // standard library + wxDL_MODULE // loadable module/plugin +}; + +enum wxPluginCategory +{ + wxDL_PLUGIN_GUI, // plugin that uses GUI classes + wxDL_PLUGIN_BASE // wxBase-only plugin +}; + +// ---------------------------------------------------------------------------- +// macros +// ---------------------------------------------------------------------------- + +// when loading a function from a DLL you always have to cast the returned +// "void *" pointer to the correct type and, even more annoyingly, you have to +// repeat this type twice if you want to declare and define a function pointer +// all in one line +// +// this macro makes this slightly less painful by allowing you to specify the +// type only once, as the first parameter, and creating a variable of this type +// called "pfn" initialized with the "name" from the "dynlib" +#define wxDYNLIB_FUNCTION(type, name, dynlib) \ + type pfn ## name = (type)(dynlib).GetSymbol(_T(#name)) + +// ---------------------------------------------------------------------------- +// wxDynamicLibraryDetails: contains details about a loaded wxDynamicLibrary +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxDynamicLibraryDetails +{ +public: + // ctor, normally never used as these objects are only created by + // wxDynamicLibrary::ListLoaded() + wxDynamicLibraryDetails() { m_address = NULL; m_length = 0; } + + // get the (base) name + wxString GetName() const { return m_name; } + + // get the full path of this object + wxString GetPath() const { return m_path; } + + // get the load address and the extent, return true if this information is + // available + bool GetAddress(void **addr, size_t *len) const + { + if ( !m_address ) + return false; + + if ( addr ) + *addr = m_address; + if ( len ) + *len = m_length; + + return true; + } + + // return the version of the DLL (may be empty if no version info) + wxString GetVersion() const + { + return m_version; + } + +private: + wxString m_name, + m_path, + m_version; + + void *m_address; + size_t m_length; + + friend class wxDynamicLibraryDetailsCreator; +}; + +WX_DECLARE_USER_EXPORTED_OBJARRAY(wxDynamicLibraryDetails, + wxDynamicLibraryDetailsArray, + WXDLLIMPEXP_BASE); + +// ---------------------------------------------------------------------------- +// wxDynamicLibrary: represents a handle to a DLL/shared object +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxDynamicLibrary +{ +public: + // return a valid handle for the main program itself or NULL if back + // linking is not supported by the current platform (e.g. Win32) + static wxDllType GetProgramHandle(); + + // return the platform standard DLL extension (with leading dot) + static const wxChar *GetDllExt() { return ms_dllext; } + + wxDynamicLibrary() : m_handle(0) { } + wxDynamicLibrary(const wxString& libname, int flags = wxDL_DEFAULT) + : m_handle(0) + { + Load(libname, flags); + } + + // NOTE: this class is (deliberately) not virtual, do not attempt + // to use it polymorphically. + ~wxDynamicLibrary() { Unload(); } + + // return true if the library was loaded successfully + bool IsLoaded() const { return m_handle != 0; } + + // load the library with the given name (full or not), return true if ok + bool Load(const wxString& libname, int flags = wxDL_DEFAULT); + + // raw function for loading dynamic libs: always behaves as if + // wxDL_VERBATIM were specified and doesn't log error message if the + // library couldn't be loaded but simply returns NULL + static wxDllType RawLoad(const wxString& libname, int flags = wxDL_DEFAULT); + + // detach the library object from its handle, i.e. prevent the object from + // unloading the library in its dtor -- the caller is now responsible for + // doing this + wxDllType Detach() { wxDllType h = m_handle; m_handle = 0; return h; } + + // unload the given library handle (presumably returned by Detach() before) + static void Unload(wxDllType handle); + + // unload the library, also done automatically in dtor + void Unload() { if ( IsLoaded() ) { Unload(m_handle); m_handle = 0; } } + + // Return the raw handle from dlopen and friends. + wxDllType GetLibHandle() const { return m_handle; } + + // check if the given symbol is present in the library, useful to verify if + // a loadable module is our plugin, for example, without provoking error + // messages from GetSymbol() + bool HasSymbol(const wxString& name) const + { + bool ok; + DoGetSymbol(name, &ok); + return ok; + } + + // resolve a symbol in a loaded DLL, such as a variable or function name. + // 'name' is the (possibly mangled) name of the symbol. (use extern "C" to + // export unmangled names) + // + // Since it is perfectly valid for the returned symbol to actually be NULL, + // that is not always indication of an error. Pass and test the parameter + // 'success' for a true indication of success or failure to load the + // symbol. + // + // Returns a pointer to the symbol on success, or NULL if an error occurred + // or the symbol wasn't found. + void *GetSymbol(const wxString& name, bool *success = NULL) const; + + // low-level version of GetSymbol() + static void *RawGetSymbol(wxDllType handle, const wxString& name); + void *RawGetSymbol(const wxString& name) const + { +#if defined (__WXPM__) || defined(__EMX__) + return GetSymbol(name); +#else + return RawGetSymbol(m_handle, name); +#endif + } + +#ifdef __WXMSW__ + // this function is useful for loading functions from the standard Windows + // DLLs: such functions have an 'A' (in ANSI build) or 'W' (in Unicode, or + // wide character build) suffix if they take string parameters + static void *RawGetSymbolAorW(wxDllType handle, const wxString& name) + { + return RawGetSymbol + ( + handle, + name + +#if wxUSE_UNICODE + L'W' +#else + 'A' +#endif + ); + } + + void *GetSymbolAorW(const wxString& name) const + { + return RawGetSymbolAorW(m_handle, name); + } +#endif // __WXMSW__ + + // return all modules/shared libraries in the address space of this process + // + // returns an empty array if not implemented or an error occurred + static wxDynamicLibraryDetailsArray ListLoaded(); + + // return platform-specific name of dynamic library with proper extension + // and prefix (e.g. "foo.dll" on Windows or "libfoo.so" on Linux) + static wxString CanonicalizeName(const wxString& name, + wxDynamicLibraryCategory cat = wxDL_LIBRARY); + + // return name of wxWidgets plugin (adds compiler and version info + // to the filename): + static wxString + CanonicalizePluginName(const wxString& name, + wxPluginCategory cat = wxDL_PLUGIN_GUI); + + // return plugin directory on platforms where it makes sense and empty + // string on others: + static wxString GetPluginsDirectory(); + + +protected: + // common part of GetSymbol() and HasSymbol() + void *DoGetSymbol(const wxString& name, bool *success = 0) const; + +#ifdef wxHAVE_DYNLIB_ERROR + // log the error after a dlxxx() function failure + static void Error(); +#endif // wxHAVE_DYNLIB_ERROR + + + // platform specific shared lib suffix. + static const wxChar *ms_dllext; + + // the handle to DLL or NULL + wxDllType m_handle; + + // no copy ctor/assignment operators (or we'd try to unload the library + // twice) + DECLARE_NO_COPY_CLASS(wxDynamicLibrary) +}; + + +// ---------------------------------------------------------------------------- +// Interesting defines +// ---------------------------------------------------------------------------- + +#define WXDLL_ENTRY_FUNCTION() \ +extern "C" WXEXPORT const wxClassInfo *wxGetClassFirst(); \ +const wxClassInfo *wxGetClassFirst() { \ + return wxClassInfo::GetFirst(); \ +} + +#endif // wxUSE_DYNLIB_CLASS + +#endif // _WX_DYNLIB_H__ diff --git a/Externals/wxWidgets/include/wx/dynload.h b/Externals/wxWidgets/include/wx/dynload.h new file mode 100644 index 0000000000..ee809a3936 --- /dev/null +++ b/Externals/wxWidgets/include/wx/dynload.h @@ -0,0 +1,153 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: dynload.h +// Purpose: Dynamic loading framework +// Author: Ron Lee, David Falkinder, Vadim Zeitlin and a cast of 1000's +// (derived in part from dynlib.cpp (c) 1998 Guilhem Lavaux) +// Modified by: +// Created: 03/12/01 +// RCS-ID: $Id: dynload.h 36973 2006-01-18 16:45:41Z JS $ +// Copyright: (c) 2001 Ron Lee +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DYNAMICLOADER_H__ +#define _WX_DYNAMICLOADER_H__ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/defs.h" + +#if wxUSE_DYNAMIC_LOADER + +#include "wx/dynlib.h" +#include "wx/hashmap.h" +#include "wx/module.h" + +class WXDLLIMPEXP_BASE wxPluginLibrary; + + +WX_DECLARE_STRING_HASH_MAP_WITH_DECL(wxPluginLibrary *, wxDLManifest, + class WXDLLIMPEXP_BASE); +typedef wxDLManifest wxDLImports; + +// --------------------------------------------------------------------------- +// wxPluginLibrary +// --------------------------------------------------------------------------- + +// NOTE: Do not attempt to use a base class pointer to this class. +// wxDL is not virtual and we deliberately hide some of it's +// methods here. +// +// Unless you know exacty why you need to, you probably shouldn't +// instantiate this class directly anyway, use wxPluginManager +// instead. + +class WXDLLIMPEXP_BASE wxPluginLibrary : public wxDynamicLibrary +{ +public: + + static wxDLImports* ms_classes; // Static hash of all imported classes. + + wxPluginLibrary( const wxString &libname, int flags = wxDL_DEFAULT ); + ~wxPluginLibrary(); + + wxPluginLibrary *RefLib(); + bool UnrefLib(); + + // These two are called by the PluginSentinel on (PLUGGABLE) object + // creation/destruction. There is usually no reason for the user to + // call them directly. We have to separate this from the link count, + // since the two are not interchangeable. + + // FIXME: for even better debugging PluginSentinel should register + // the name of the class created too, then we can state + // exactly which object was not destroyed which may be + // difficult to find otherwise. Also this code should + // probably only be active in DEBUG mode, but let's just + // get it right first. + + void RefObj() { ++m_objcount; } + void UnrefObj() + { + wxASSERT_MSG( m_objcount > 0, _T("Too many objects deleted??") ); + --m_objcount; + } + + // Override/hide some base class methods + + bool IsLoaded() const { return m_linkcount > 0; } + void Unload() { UnrefLib(); } + +private: + + wxClassInfo *m_before; // sm_first before loading this lib + wxClassInfo *m_after; // ..and after. + + size_t m_linkcount; // Ref count of library link calls + size_t m_objcount; // ..and (pluggable) object instantiations. + wxModuleList m_wxmodules; // any wxModules that we initialised. + + void UpdateClasses(); // Update ms_classes + void RestoreClasses(); // Removes this library from ms_classes + void RegisterModules(); // Init any wxModules in the lib. + void UnregisterModules(); // Cleanup any wxModules we installed. + + DECLARE_NO_COPY_CLASS(wxPluginLibrary) +}; + + +class WXDLLIMPEXP_BASE wxPluginManager +{ +public: + + // Static accessors. + + static wxPluginLibrary *LoadLibrary( const wxString &libname, + int flags = wxDL_DEFAULT ); + static bool UnloadLibrary(const wxString &libname); + + // Instance methods. + + wxPluginManager() : m_entry(NULL) {} + wxPluginManager(const wxString &libname, int flags = wxDL_DEFAULT) + { + Load(libname, flags); + } + ~wxPluginManager() { if ( IsLoaded() ) Unload(); } + + bool Load(const wxString &libname, int flags = wxDL_DEFAULT); + void Unload(); + + bool IsLoaded() const { return m_entry && m_entry->IsLoaded(); } + void *GetSymbol(const wxString &symbol, bool *success = 0) + { + return m_entry->GetSymbol( symbol, success ); + } + + static void CreateManifest() { ms_manifest = new wxDLManifest(wxKEY_STRING); } + static void ClearManifest() { delete ms_manifest; ms_manifest = NULL; } + +private: + // return the pointer to the entry for the library with given name in + // ms_manifest or NULL if none + static wxPluginLibrary *FindByName(const wxString& name) + { + const wxDLManifest::iterator i = ms_manifest->find(name); + + return i == ms_manifest->end() ? NULL : i->second; + } + + static wxDLManifest* ms_manifest; // Static hash of loaded libs. + wxPluginLibrary* m_entry; // Cache our entry in the manifest. + + // We could allow this class to be copied if we really + // wanted to, but not without modification. + DECLARE_NO_COPY_CLASS(wxPluginManager) +}; + + +#endif // wxUSE_DYNAMIC_LOADER +#endif // _WX_DYNAMICLOADER_H__ + diff --git a/Externals/wxWidgets/include/wx/effects.h b/Externals/wxWidgets/include/wx/effects.h new file mode 100644 index 0000000000..987ddf51af --- /dev/null +++ b/Externals/wxWidgets/include/wx/effects.h @@ -0,0 +1,75 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/effects.h +// Purpose: wxEffects class +// Draws 3D effects. +// Author: Julian Smart et al +// Modified by: +// Created: 25/4/2000 +// RCS-ID: $Id: effects.h 39109 2006-05-08 11:31:03Z ABX $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_EFFECTS_H_ +#define _WX_EFFECTS_H_ + +/* + * wxEffects: various 3D effects + */ + +#include "wx/object.h" +#include "wx/colour.h" +#include "wx/gdicmn.h" +#include "wx/dc.h" + +class WXDLLEXPORT wxEffects: public wxObject +{ +DECLARE_CLASS(wxEffects) + +public: + // Assume system colours + wxEffects() ; + // Going from lightest to darkest + wxEffects(const wxColour& highlightColour, const wxColour& lightShadow, + const wxColour& faceColour, const wxColour& mediumShadow, + const wxColour& darkShadow) ; + + // Accessors + wxColour GetHighlightColour() const { return m_highlightColour; } + wxColour GetLightShadow() const { return m_lightShadow; } + wxColour GetFaceColour() const { return m_faceColour; } + wxColour GetMediumShadow() const { return m_mediumShadow; } + wxColour GetDarkShadow() const { return m_darkShadow; } + + void SetHighlightColour(const wxColour& c) { m_highlightColour = c; } + void SetLightShadow(const wxColour& c) { m_lightShadow = c; } + void SetFaceColour(const wxColour& c) { m_faceColour = c; } + void SetMediumShadow(const wxColour& c) { m_mediumShadow = c; } + void SetDarkShadow(const wxColour& c) { m_darkShadow = c; } + + void Set(const wxColour& highlightColour, const wxColour& lightShadow, + const wxColour& faceColour, const wxColour& mediumShadow, + const wxColour& darkShadow) + { + SetHighlightColour(highlightColour); + SetLightShadow(lightShadow); + SetFaceColour(faceColour); + SetMediumShadow(mediumShadow); + SetDarkShadow(darkShadow); + } + + // Draw a sunken edge + void DrawSunkenEdge(wxDC& dc, const wxRect& rect, int borderSize = 1); + + // Tile a bitmap + bool TileBitmap(const wxRect& rect, wxDC& dc, const wxBitmap& bitmap); + +protected: + wxColour m_highlightColour; // Usually white + wxColour m_lightShadow; // Usually light grey + wxColour m_faceColour; // Usually grey + wxColour m_mediumShadow; // Usually dark grey + wxColour m_darkShadow; // Usually black +}; + +#endif diff --git a/Externals/wxWidgets/include/wx/encconv.h b/Externals/wxWidgets/include/wx/encconv.h new file mode 100644 index 0000000000..f57d8ea9d8 --- /dev/null +++ b/Externals/wxWidgets/include/wx/encconv.h @@ -0,0 +1,159 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/encconv.h +// Purpose: wxEncodingConverter class for converting between different +// font encodings +// Author: Vaclav Slavik +// Copyright: (c) 1999 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_ENCCONV_H_ +#define _WX_ENCCONV_H_ + +#include "wx/defs.h" + +#include "wx/object.h" +#include "wx/fontenc.h" +#include "wx/dynarray.h" + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +enum +{ + wxCONVERT_STRICT, + wxCONVERT_SUBSTITUTE +}; + + +enum +{ + wxPLATFORM_CURRENT = -1, + + wxPLATFORM_UNIX = 0, + wxPLATFORM_WINDOWS, + wxPLATFORM_OS2, + wxPLATFORM_MAC +}; + +// ---------------------------------------------------------------------------- +// types +// ---------------------------------------------------------------------------- + +WX_DEFINE_ARRAY_INT(wxFontEncoding, wxFontEncodingArray); + +//-------------------------------------------------------------------------------- +// wxEncodingConverter +// This class is capable of converting strings between any two +// 8bit encodings/charsets. It can also convert from/to Unicode +//-------------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxEncodingConverter : public wxObject +{ + public: + + wxEncodingConverter(); + virtual ~wxEncodingConverter() { if (m_Table) delete[] m_Table; } + + // Initialize conversion. Both output or input encoding may + // be wxFONTENCODING_UNICODE, but only if wxUSE_WCHAR_T is set to 1. + // + // All subsequent calls to Convert() will interpret it's argument + // as a string in input_enc encoding and will output string in + // output_enc encoding. + // + // You must call this method before calling Convert. You may call + // it more than once in order to switch to another conversion + // + // Method affects behaviour of Convert() in case input character + // cannot be converted because it does not exist in output encoding: + // wxCONVERT_STRICT -- + // follow behaviour of GNU Recode - just copy unconvertable + // characters to output and don't change them (it's integer + // value will stay the same) + // wxCONVERT_SUBSTITUTE -- + // try some (lossy) substitutions - e.g. replace + // unconvertable latin capitals with acute by ordinary + // capitals, replace en-dash or em-dash by '-' etc. + // both modes gurantee that output string will have same length + // as input string + // + // Returns false if given conversion is impossible, true otherwise + // (conversion may be impossible either if you try to convert + // to Unicode with non-Unicode build of wxWidgets or if input + // or output encoding is not supported.) + bool Init(wxFontEncoding input_enc, wxFontEncoding output_enc, int method = wxCONVERT_STRICT); + + // Convert input string according to settings passed to Init. + // Note that you must call Init before using Convert! + bool Convert(const char* input, char* output) const; + bool Convert(char* str) const { return Convert(str, str); } + wxString Convert(const wxString& input) const; + +#if wxUSE_WCHAR_T + bool Convert(const char* input, wchar_t* output) const; + bool Convert(const wchar_t* input, char* output) const; + bool Convert(const wchar_t* input, wchar_t* output) const; + bool Convert(wchar_t* str) const { return Convert(str, str); } +#endif + // Return equivalent(s) for given font that are used + // under given platform. wxPLATFORM_CURRENT means the plaform + // this binary was compiled for + // + // Examples: + // current platform enc returned value + // ----------------------------------------------------- + // unix CP1250 {ISO8859_2} + // unix ISO8859_2 {} + // windows ISO8859_2 {CP1250} + // + // Equivalence is defined in terms of convertibility: + // 2 encodings are equivalent if you can convert text between + // then without loosing information (it may - and will - happen + // that you loose special chars like quotation marks or em-dashes + // but you shouldn't loose any diacritics and language-specific + // characters when converting between equivalent encodings). + // + // Convert() method is not limited to converting between + // equivalent encodings, it can convert between arbitrary + // two encodings! + // + // Remember that this function does _NOT_ check for presence of + // fonts in system. It only tells you what are most suitable + // encodings. (It usually returns only one encoding) + // + // Note that argument enc itself may be present in returned array! + // (so that you can -- as a side effect -- detect whether the + // encoding is native for this platform or not) + static wxFontEncodingArray GetPlatformEquivalents(wxFontEncoding enc, int platform = wxPLATFORM_CURRENT); + + // Similar to GetPlatformEquivalent, but this one will return ALL + // equivalent encodings, regardless the platform, including itself. + static wxFontEncodingArray GetAllEquivalents(wxFontEncoding enc); + + // Return true if [any text in] one multibyte encoding can be + // converted to another one losslessly. + // + // Do not call this with wxFONTENCODING_UNICODE, it doesn't make + // sense (always works in one sense and always depends on the text + // to convert in the other) + static bool CanConvert(wxFontEncoding encIn, wxFontEncoding encOut) + { + return GetAllEquivalents(encIn).Index(encOut) != wxNOT_FOUND; + } + + private: + +#if wxUSE_WCHAR_T + wchar_t *m_Table; +#else + char *m_Table; +#endif + bool m_UnicodeInput, m_UnicodeOutput; + bool m_JustCopy; + + DECLARE_NO_COPY_CLASS(wxEncodingConverter) +}; + +#endif // _WX_ENCCONV_H_ diff --git a/Externals/wxWidgets/include/wx/encinfo.h b/Externals/wxWidgets/include/wx/encinfo.h new file mode 100644 index 0000000000..fb3d9214f2 --- /dev/null +++ b/Externals/wxWidgets/include/wx/encinfo.h @@ -0,0 +1,74 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/encinfo.h +// Purpose: declares wxNativeEncodingInfo struct +// Author: Vadim Zeitlin +// Modified by: +// Created: 19.09.2003 (extracted from wx/fontenc.h) +// RCS-ID: $Id: encinfo.h 40865 2006-08-27 09:42:42Z VS $ +// Copyright: (c) 2003 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_ENCINFO_H_ +#define _WX_ENCINFO_H_ + +#include "wx/string.h" + +// ---------------------------------------------------------------------------- +// wxNativeEncodingInfo contains all encoding parameters for this platform +// ---------------------------------------------------------------------------- + +// This private structure specifies all the parameters needed to create a font +// with the given encoding on this platform. +// +// Under X, it contains the last 2 elements of the font specifications +// (registry and encoding). +// +// Under Windows, it contains a number which is one of predefined CHARSET_XXX +// values. +// +// Under all platforms it also contains a facename string which should be +// used, if not empty, to create fonts in this encoding (this is the only way +// to create a font of non-standard encoding (like KOI8) under Windows - the +// facename specifies the encoding then) + +struct WXDLLEXPORT wxNativeEncodingInfo +{ + wxString facename; // may be empty meaning "any" +#ifndef __WXPALMOS__ + wxFontEncoding encoding; // so that we know what this struct represents + +#if defined(__WXMSW__) || \ + defined(__WXPM__) || \ + defined(__WXMAC__) || \ + defined(__WXCOCOA__) // FIXME: __WXCOCOA__ + + wxNativeEncodingInfo() + : facename() + , encoding(wxFONTENCODING_SYSTEM) + , charset(0) /* ANSI_CHARSET */ + { } + + int charset; +#elif defined(_WX_X_FONTLIKE) + wxString xregistry, + xencoding; +#elif defined(__WXGTK20__) + // No way to specify this in Pango as this + // seems to be handled internally. +#elif defined(__WXMGL__) + int mglEncoding; +#elif defined(__WXDFB__) + // DirectFB uses UTF-8 internally, doesn't use font encodings +#else + #error "Unsupported toolkit" +#endif +#endif // !__WXPALMOS__ + // this struct is saved in config by wxFontMapper, so it should know to + // serialise itself (implemented in platform-specific code) + bool FromString(const wxString& s); + wxString ToString() const; +}; + +#endif // _WX_ENCINFO_H_ + diff --git a/Externals/wxWidgets/include/wx/event.h b/Externals/wxWidgets/include/wx/event.h new file mode 100644 index 0000000000..00f67158a5 --- /dev/null +++ b/Externals/wxWidgets/include/wx/event.h @@ -0,0 +1,3116 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/event.h +// Purpose: Event classes +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: event.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_EVENT_H__ +#define _WX_EVENT_H__ + +#include "wx/defs.h" +#include "wx/cpp.h" +#include "wx/object.h" +#include "wx/clntdata.h" + +#if wxUSE_GUI + #include "wx/gdicmn.h" + #include "wx/cursor.h" +#endif + +#include "wx/thread.h" + +#include "wx/dynarray.h" + +// ---------------------------------------------------------------------------- +// forward declarations +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_BASE wxList; + +#if wxUSE_GUI + class WXDLLIMPEXP_FWD_CORE wxDC; + class WXDLLIMPEXP_FWD_CORE wxMenu; + class WXDLLIMPEXP_FWD_CORE wxWindow; + class WXDLLIMPEXP_FWD_CORE wxWindowBase; +#endif // wxUSE_GUI + +class WXDLLIMPEXP_BASE wxEvtHandler; + +// ---------------------------------------------------------------------------- +// Event types +// ---------------------------------------------------------------------------- + +typedef int wxEventType; + +// this is used to make the event table entry type safe, so that for an event +// handler only a function with proper parameter list can be given. +#define wxStaticCastEvent(type, val) wx_static_cast(type, val) + +// in previous versions of wxWidgets the event types used to be constants +// which created difficulties with custom/user event types definition +// +// starting from wxWidgets 2.4 the event types are now dynamically assigned +// using wxNewEventType() which solves this problem, however at price of +// several incompatibilities: +// +// a) event table macros declaration changed, it now uses wxEventTableEntry +// ctor instead of initialisation from an agregate - the macro +// DECLARE_EVENT_TABLE_ENTRY may be used to write code which can compile +// with all versions of wxWidgets +// +// b) event types can't be used as switch() cases as they're not really +// constant any more - there is no magic solution here, you just have to +// change the switch()es to if()s +// +// if these are real problems for you, define WXWIN_COMPATIBILITY_EVENT_TYPES +// as 1 to get 100% old behaviour, however you won't be able to use the +// libraries using the new dynamic event type allocation in such case, so avoid +// it if possible. +#ifndef WXWIN_COMPATIBILITY_EVENT_TYPES + #define WXWIN_COMPATIBILITY_EVENT_TYPES 0 +#endif + +#if WXWIN_COMPATIBILITY_EVENT_TYPES + +#define DECLARE_EVENT_TABLE_ENTRY(type, winid, idLast, fn, obj) \ + { type, winid, idLast, fn, obj } + +#define BEGIN_DECLARE_EVENT_TYPES() enum { +#define END_DECLARE_EVENT_TYPES() }; +#define DECLARE_EVENT_TYPE(name, value) name = wxEVT_FIRST + value, +#define DECLARE_LOCAL_EVENT_TYPE(name, value) name = wxEVT_USER_FIRST + value, +#define DECLARE_EXPORTED_EVENT_TYPE(expdecl, name, value) \ + DECLARE_LOCAL_EVENT_TYPE(name, value) +#define DEFINE_EVENT_TYPE(name) +#define DEFINE_LOCAL_EVENT_TYPE(name) + + +#else // !WXWIN_COMPATIBILITY_EVENT_TYPES + +#define DECLARE_EVENT_TABLE_ENTRY(type, winid, idLast, fn, obj) \ + wxEventTableEntry(type, winid, idLast, fn, obj) + +#define BEGIN_DECLARE_EVENT_TYPES() +#define END_DECLARE_EVENT_TYPES() +#define DECLARE_EXPORTED_EVENT_TYPE(expdecl, name, value) \ + extern expdecl const wxEventType name; +#define DECLARE_EVENT_TYPE(name, value) \ + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_CORE, name, value) +#define DECLARE_LOCAL_EVENT_TYPE(name, value) \ + DECLARE_EXPORTED_EVENT_TYPE(wxEMPTY_PARAMETER_VALUE, name, value) +#define DEFINE_EVENT_TYPE(name) const wxEventType name = wxNewEventType(); +#define DEFINE_LOCAL_EVENT_TYPE(name) DEFINE_EVENT_TYPE(name) + +// generate a new unique event type +extern WXDLLIMPEXP_BASE wxEventType wxNewEventType(); + +#endif // WXWIN_COMPATIBILITY_EVENT_TYPES/!WXWIN_COMPATIBILITY_EVENT_TYPES + +BEGIN_DECLARE_EVENT_TYPES() + +#if WXWIN_COMPATIBILITY_EVENT_TYPES + wxEVT_NULL = 0, + wxEVT_FIRST = 10000, + wxEVT_USER_FIRST = wxEVT_FIRST + 2000, +#else // !WXWIN_COMPATIBILITY_EVENT_TYPES + // it is important to still have these as constants to avoid + // initialization order related problems + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_BASE, wxEVT_NULL, 0) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_BASE, wxEVT_FIRST, 10000) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_BASE, wxEVT_USER_FIRST, wxEVT_FIRST + 2000) +#endif // WXWIN_COMPATIBILITY_EVENT_TYPES/!WXWIN_COMPATIBILITY_EVENT_TYPES + + DECLARE_EVENT_TYPE(wxEVT_COMMAND_BUTTON_CLICKED, 1) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_CHECKBOX_CLICKED, 2) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_CHOICE_SELECTED, 3) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_LISTBOX_SELECTED, 4) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_LISTBOX_DOUBLECLICKED, 5) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_CHECKLISTBOX_TOGGLED, 6) + // now they are in wx/textctrl.h +#if WXWIN_COMPATIBILITY_EVENT_TYPES + DECLARE_EVENT_TYPE(wxEVT_COMMAND_TEXT_UPDATED, 7) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_TEXT_ENTER, 8) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_TEXT_URL, 13) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_TEXT_MAXLEN, 14) +#endif // WXWIN_COMPATIBILITY_EVENT_TYPES + DECLARE_EVENT_TYPE(wxEVT_COMMAND_MENU_SELECTED, 9) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_SLIDER_UPDATED, 10) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_RADIOBOX_SELECTED, 11) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_RADIOBUTTON_SELECTED, 12) + + // wxEVT_COMMAND_SCROLLBAR_UPDATED is now obsolete since we use + // wxEVT_SCROLL... events + + DECLARE_EVENT_TYPE(wxEVT_COMMAND_SCROLLBAR_UPDATED, 13) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_VLBOX_SELECTED, 14) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_COMBOBOX_SELECTED, 15) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_TOOL_RCLICKED, 16) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_TOOL_ENTER, 17) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_SPINCTRL_UPDATED, 18) + + // Sockets and timers send events, too + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_BASE, wxEVT_SOCKET, 50) + DECLARE_EVENT_TYPE(wxEVT_TIMER , 80) + + // Mouse event types + DECLARE_EVENT_TYPE(wxEVT_LEFT_DOWN, 100) + DECLARE_EVENT_TYPE(wxEVT_LEFT_UP, 101) + DECLARE_EVENT_TYPE(wxEVT_MIDDLE_DOWN, 102) + DECLARE_EVENT_TYPE(wxEVT_MIDDLE_UP, 103) + DECLARE_EVENT_TYPE(wxEVT_RIGHT_DOWN, 104) + DECLARE_EVENT_TYPE(wxEVT_RIGHT_UP, 105) + DECLARE_EVENT_TYPE(wxEVT_MOTION, 106) + DECLARE_EVENT_TYPE(wxEVT_ENTER_WINDOW, 107) + DECLARE_EVENT_TYPE(wxEVT_LEAVE_WINDOW, 108) + DECLARE_EVENT_TYPE(wxEVT_LEFT_DCLICK, 109) + DECLARE_EVENT_TYPE(wxEVT_MIDDLE_DCLICK, 110) + DECLARE_EVENT_TYPE(wxEVT_RIGHT_DCLICK, 111) + DECLARE_EVENT_TYPE(wxEVT_SET_FOCUS, 112) + DECLARE_EVENT_TYPE(wxEVT_KILL_FOCUS, 113) + DECLARE_EVENT_TYPE(wxEVT_CHILD_FOCUS, 114) + DECLARE_EVENT_TYPE(wxEVT_MOUSEWHEEL, 115) + + // Non-client mouse events + DECLARE_EVENT_TYPE(wxEVT_NC_LEFT_DOWN, 200) + DECLARE_EVENT_TYPE(wxEVT_NC_LEFT_UP, 201) + DECLARE_EVENT_TYPE(wxEVT_NC_MIDDLE_DOWN, 202) + DECLARE_EVENT_TYPE(wxEVT_NC_MIDDLE_UP, 203) + DECLARE_EVENT_TYPE(wxEVT_NC_RIGHT_DOWN, 204) + DECLARE_EVENT_TYPE(wxEVT_NC_RIGHT_UP, 205) + DECLARE_EVENT_TYPE(wxEVT_NC_MOTION, 206) + DECLARE_EVENT_TYPE(wxEVT_NC_ENTER_WINDOW, 207) + DECLARE_EVENT_TYPE(wxEVT_NC_LEAVE_WINDOW, 208) + DECLARE_EVENT_TYPE(wxEVT_NC_LEFT_DCLICK, 209) + DECLARE_EVENT_TYPE(wxEVT_NC_MIDDLE_DCLICK, 210) + DECLARE_EVENT_TYPE(wxEVT_NC_RIGHT_DCLICK, 211) + + // Character input event type + DECLARE_EVENT_TYPE(wxEVT_CHAR, 212) + DECLARE_EVENT_TYPE(wxEVT_CHAR_HOOK, 213) + DECLARE_EVENT_TYPE(wxEVT_NAVIGATION_KEY, 214) + DECLARE_EVENT_TYPE(wxEVT_KEY_DOWN, 215) + DECLARE_EVENT_TYPE(wxEVT_KEY_UP, 216) +#if wxUSE_HOTKEY + DECLARE_EVENT_TYPE(wxEVT_HOTKEY, 217) +#endif + // Set cursor event + DECLARE_EVENT_TYPE(wxEVT_SET_CURSOR, 230) + + // wxScrollBar and wxSlider event identifiers + DECLARE_EVENT_TYPE(wxEVT_SCROLL_TOP, 300) + DECLARE_EVENT_TYPE(wxEVT_SCROLL_BOTTOM, 301) + DECLARE_EVENT_TYPE(wxEVT_SCROLL_LINEUP, 302) + DECLARE_EVENT_TYPE(wxEVT_SCROLL_LINEDOWN, 303) + DECLARE_EVENT_TYPE(wxEVT_SCROLL_PAGEUP, 304) + DECLARE_EVENT_TYPE(wxEVT_SCROLL_PAGEDOWN, 305) + DECLARE_EVENT_TYPE(wxEVT_SCROLL_THUMBTRACK, 306) + DECLARE_EVENT_TYPE(wxEVT_SCROLL_THUMBRELEASE, 307) + DECLARE_EVENT_TYPE(wxEVT_SCROLL_CHANGED, 308) + + // Scroll events from wxWindow + DECLARE_EVENT_TYPE(wxEVT_SCROLLWIN_TOP, 320) + DECLARE_EVENT_TYPE(wxEVT_SCROLLWIN_BOTTOM, 321) + DECLARE_EVENT_TYPE(wxEVT_SCROLLWIN_LINEUP, 322) + DECLARE_EVENT_TYPE(wxEVT_SCROLLWIN_LINEDOWN, 323) + DECLARE_EVENT_TYPE(wxEVT_SCROLLWIN_PAGEUP, 324) + DECLARE_EVENT_TYPE(wxEVT_SCROLLWIN_PAGEDOWN, 325) + DECLARE_EVENT_TYPE(wxEVT_SCROLLWIN_THUMBTRACK, 326) + DECLARE_EVENT_TYPE(wxEVT_SCROLLWIN_THUMBRELEASE, 327) + + // System events + DECLARE_EVENT_TYPE(wxEVT_SIZE, 400) + DECLARE_EVENT_TYPE(wxEVT_MOVE, 401) + DECLARE_EVENT_TYPE(wxEVT_CLOSE_WINDOW, 402) + DECLARE_EVENT_TYPE(wxEVT_END_SESSION, 403) + DECLARE_EVENT_TYPE(wxEVT_QUERY_END_SESSION, 404) + DECLARE_EVENT_TYPE(wxEVT_ACTIVATE_APP, 405) + // 406..408 are power events + DECLARE_EVENT_TYPE(wxEVT_ACTIVATE, 409) + DECLARE_EVENT_TYPE(wxEVT_CREATE, 410) + DECLARE_EVENT_TYPE(wxEVT_DESTROY, 411) + DECLARE_EVENT_TYPE(wxEVT_SHOW, 412) + DECLARE_EVENT_TYPE(wxEVT_ICONIZE, 413) + DECLARE_EVENT_TYPE(wxEVT_MAXIMIZE, 414) + DECLARE_EVENT_TYPE(wxEVT_MOUSE_CAPTURE_CHANGED, 415) + DECLARE_EVENT_TYPE(wxEVT_MOUSE_CAPTURE_LOST, 416) + DECLARE_EVENT_TYPE(wxEVT_PAINT, 417) + DECLARE_EVENT_TYPE(wxEVT_ERASE_BACKGROUND, 418) + DECLARE_EVENT_TYPE(wxEVT_NC_PAINT, 419) + DECLARE_EVENT_TYPE(wxEVT_PAINT_ICON, 420) + DECLARE_EVENT_TYPE(wxEVT_MENU_OPEN, 421) + DECLARE_EVENT_TYPE(wxEVT_MENU_CLOSE, 422) + DECLARE_EVENT_TYPE(wxEVT_MENU_HIGHLIGHT, 423) + DECLARE_EVENT_TYPE(wxEVT_CONTEXT_MENU, 424) + DECLARE_EVENT_TYPE(wxEVT_SYS_COLOUR_CHANGED, 425) + DECLARE_EVENT_TYPE(wxEVT_DISPLAY_CHANGED, 426) + DECLARE_EVENT_TYPE(wxEVT_SETTING_CHANGED, 427) + DECLARE_EVENT_TYPE(wxEVT_QUERY_NEW_PALETTE, 428) + DECLARE_EVENT_TYPE(wxEVT_PALETTE_CHANGED, 429) + DECLARE_EVENT_TYPE(wxEVT_JOY_BUTTON_DOWN, 430) + DECLARE_EVENT_TYPE(wxEVT_JOY_BUTTON_UP, 431) + DECLARE_EVENT_TYPE(wxEVT_JOY_MOVE, 432) + DECLARE_EVENT_TYPE(wxEVT_JOY_ZMOVE, 433) + DECLARE_EVENT_TYPE(wxEVT_DROP_FILES, 434) + DECLARE_EVENT_TYPE(wxEVT_DRAW_ITEM, 435) + DECLARE_EVENT_TYPE(wxEVT_MEASURE_ITEM, 436) + DECLARE_EVENT_TYPE(wxEVT_COMPARE_ITEM, 437) + DECLARE_EVENT_TYPE(wxEVT_INIT_DIALOG, 438) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_BASE, wxEVT_IDLE, 439) + DECLARE_EVENT_TYPE(wxEVT_UPDATE_UI, 440) + DECLARE_EVENT_TYPE(wxEVT_SIZING, 441) + DECLARE_EVENT_TYPE(wxEVT_MOVING, 442) + DECLARE_EVENT_TYPE(wxEVT_HIBERNATE, 443) + // more power events follow -- see wx/power.h + + // Clipboard events + DECLARE_EVENT_TYPE(wxEVT_COMMAND_TEXT_COPY, 444) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_TEXT_CUT, 445) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_TEXT_PASTE, 446) + + // Generic command events + // Note: a click is a higher-level event than button down/up + DECLARE_EVENT_TYPE(wxEVT_COMMAND_LEFT_CLICK, 500) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_LEFT_DCLICK, 501) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_RIGHT_CLICK, 502) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_RIGHT_DCLICK, 503) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_SET_FOCUS, 504) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_KILL_FOCUS, 505) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_ENTER, 506) + + // Help events + DECLARE_EVENT_TYPE(wxEVT_HELP, 1050) + DECLARE_EVENT_TYPE(wxEVT_DETAILED_HELP, 1051) + +END_DECLARE_EVENT_TYPES() + +// these 2 events are the same +#define wxEVT_COMMAND_TOOL_CLICKED wxEVT_COMMAND_MENU_SELECTED + +// ---------------------------------------------------------------------------- +// Compatibility +// ---------------------------------------------------------------------------- + +// this event is also used by wxComboBox and wxSpinCtrl which don't include +// wx/textctrl.h in all ports [yet], so declare it here as well +// +// still, any new code using it should include wx/textctrl.h explicitly +#if !WXWIN_COMPATIBILITY_EVENT_TYPES + extern const wxEventType WXDLLIMPEXP_CORE wxEVT_COMMAND_TEXT_UPDATED; +#endif + +// the predefined constants for the number of times we propagate event +// upwards window child-parent chain +enum Propagation_state +{ + // don't propagate it at all + wxEVENT_PROPAGATE_NONE = 0, + + // propagate it until it is processed + wxEVENT_PROPAGATE_MAX = INT_MAX +}; + +/* + * wxWidgets events, covering all interesting things that might happen + * (button clicking, resizing, setting text in widgets, etc.). + * + * For each completely new event type, derive a new event class. + * An event CLASS represents a C++ class defining a range of similar event TYPES; + * examples are canvas events, panel item command events. + * An event TYPE is a unique identifier for a particular system event, + * such as a button press or a listbox deselection. + * + */ + +class WXDLLIMPEXP_BASE wxEvent : public wxObject +{ +private: + wxEvent& operator=(const wxEvent&); + +protected: + wxEvent(const wxEvent&); // for implementing Clone() + +public: + wxEvent(int winid = 0, wxEventType commandType = wxEVT_NULL ); + + void SetEventType(wxEventType typ) { m_eventType = typ; } + wxEventType GetEventType() const { return m_eventType; } + wxObject *GetEventObject() const { return m_eventObject; } + void SetEventObject(wxObject *obj) { m_eventObject = obj; } + long GetTimestamp() const { return m_timeStamp; } + void SetTimestamp(long ts = 0) { m_timeStamp = ts; } + int GetId() const { return m_id; } + void SetId(int Id) { m_id = Id; } + + // Can instruct event processor that we wish to ignore this event + // (treat as if the event table entry had not been found): this must be done + // to allow the event processing by the base classes (calling event.Skip() + // is the analog of calling the base class version of a virtual function) + void Skip(bool skip = true) { m_skipped = skip; } + bool GetSkipped() const { return m_skipped; } + + // this function is used to create a copy of the event polymorphically and + // all derived classes must implement it because otherwise wxPostEvent() + // for them wouldn't work (it needs to do a copy of the event) + virtual wxEvent *Clone() const = 0; + + // Implementation only: this test is explicitly anti OO and this function + // exists only for optimization purposes. + bool IsCommandEvent() const { return m_isCommandEvent; } + + // Determine if this event should be propagating to the parent window. + bool ShouldPropagate() const + { return m_propagationLevel != wxEVENT_PROPAGATE_NONE; } + + // Stop an event from propagating to its parent window, returns the old + // propagation level value + int StopPropagation() + { + int propagationLevel = m_propagationLevel; + m_propagationLevel = wxEVENT_PROPAGATE_NONE; + return propagationLevel; + } + + // Resume the event propagation by restoring the propagation level + // (returned by StopPropagation()) + void ResumePropagation(int propagationLevel) + { + m_propagationLevel = propagationLevel; + } + +#if WXWIN_COMPATIBILITY_2_4 +public: +#else +protected: +#endif + wxObject* m_eventObject; + wxEventType m_eventType; + long m_timeStamp; + int m_id; + +public: + // m_callbackUserData is for internal usage only + wxObject* m_callbackUserData; + +protected: + // the propagation level: while it is positive, we propagate the event to + // the parent window (if any) + // + // this one doesn't have to be public, we don't have to worry about + // backwards compatibility as it is new + int m_propagationLevel; + +#if WXWIN_COMPATIBILITY_2_4 +public: +#else +protected: +#endif + bool m_skipped; + bool m_isCommandEvent; + +private: + // it needs to access our m_propagationLevel + friend class WXDLLIMPEXP_BASE wxPropagateOnce; + + DECLARE_ABSTRACT_CLASS(wxEvent) +}; + +/* + * Helper class to temporarily change an event not to propagate. + */ +class WXDLLIMPEXP_BASE wxPropagationDisabler +{ +public: + wxPropagationDisabler(wxEvent& event) : m_event(event) + { + m_propagationLevelOld = m_event.StopPropagation(); + } + + ~wxPropagationDisabler() + { + m_event.ResumePropagation(m_propagationLevelOld); + } + +private: + wxEvent& m_event; + int m_propagationLevelOld; + + DECLARE_NO_COPY_CLASS(wxPropagationDisabler) +}; + +/* + * Another one to temporarily lower propagation level. + */ +class WXDLLIMPEXP_BASE wxPropagateOnce +{ +public: + wxPropagateOnce(wxEvent& event) : m_event(event) + { + wxASSERT_MSG( m_event.m_propagationLevel > 0, + _T("shouldn't be used unless ShouldPropagate()!") ); + + m_event.m_propagationLevel--; + } + + ~wxPropagateOnce() + { + m_event.m_propagationLevel++; + } + +private: + wxEvent& m_event; + + DECLARE_NO_COPY_CLASS(wxPropagateOnce) +}; + +#if wxUSE_GUI + + +// Item or menu event class +/* + wxEVT_COMMAND_BUTTON_CLICKED + wxEVT_COMMAND_CHECKBOX_CLICKED + wxEVT_COMMAND_CHOICE_SELECTED + wxEVT_COMMAND_LISTBOX_SELECTED + wxEVT_COMMAND_LISTBOX_DOUBLECLICKED + wxEVT_COMMAND_TEXT_UPDATED + wxEVT_COMMAND_TEXT_ENTER + wxEVT_COMMAND_MENU_SELECTED + wxEVT_COMMAND_SLIDER_UPDATED + wxEVT_COMMAND_RADIOBOX_SELECTED + wxEVT_COMMAND_RADIOBUTTON_SELECTED + wxEVT_COMMAND_SCROLLBAR_UPDATED + wxEVT_COMMAND_VLBOX_SELECTED + wxEVT_COMMAND_COMBOBOX_SELECTED + wxEVT_COMMAND_TOGGLEBUTTON_CLICKED +*/ + +#if WXWIN_COMPATIBILITY_2_4 +// Backwards compatibility for wxCommandEvent::m_commandString, will lead to compilation errors in some cases of usage +class WXDLLIMPEXP_CORE wxCommandEvent; + +class WXDLLIMPEXP_CORE wxCommandEventStringHelper +{ +public: + wxCommandEventStringHelper(wxCommandEvent * evt) + : m_evt(evt) + { } + + void operator=(const wxString &str); + operator wxString(); + const wxChar* c_str() const; + +private: + wxCommandEvent* m_evt; +}; +#endif + +class WXDLLIMPEXP_CORE wxCommandEvent : public wxEvent +{ +public: + wxCommandEvent(wxEventType commandType = wxEVT_NULL, int winid = 0); + + wxCommandEvent(const wxCommandEvent& event) + : wxEvent(event), +#if WXWIN_COMPATIBILITY_2_4 + m_commandString(this), +#endif + m_cmdString(event.m_cmdString), + m_commandInt(event.m_commandInt), + m_extraLong(event.m_extraLong), + m_clientData(event.m_clientData), + m_clientObject(event.m_clientObject) + { } + + // Set/Get client data from controls + void SetClientData(void* clientData) { m_clientData = clientData; } + void *GetClientData() const { return m_clientData; } + + // Set/Get client object from controls + void SetClientObject(wxClientData* clientObject) { m_clientObject = clientObject; } + wxClientData *GetClientObject() const { return m_clientObject; } + + // Get listbox selection if single-choice + int GetSelection() const { return m_commandInt; } + + // Set/Get listbox/choice selection string + void SetString(const wxString& s) { m_cmdString = s; } + wxString GetString() const; + + // Get checkbox value + bool IsChecked() const { return m_commandInt != 0; } + + // true if the listbox event was a selection. + bool IsSelection() const { return (m_extraLong != 0); } + + void SetExtraLong(long extraLong) { m_extraLong = extraLong; } + long GetExtraLong() const { return m_extraLong; } + + void SetInt(int i) { m_commandInt = i; } + int GetInt() const { return m_commandInt; } + + virtual wxEvent *Clone() const { return new wxCommandEvent(*this); } + +#if WXWIN_COMPATIBILITY_2_4 +public: + wxCommandEventStringHelper m_commandString; +#else +protected: +#endif + wxString m_cmdString; // String event argument + int m_commandInt; + long m_extraLong; // Additional information (e.g. select/deselect) + void* m_clientData; // Arbitrary client data + wxClientData* m_clientObject; // Arbitrary client object + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxCommandEvent) +}; + +#if WXWIN_COMPATIBILITY_2_4 +inline void wxCommandEventStringHelper::operator=(const wxString &str) +{ + m_evt->SetString(str); +} + +inline wxCommandEventStringHelper::operator wxString() +{ + return m_evt->GetString(); +} + +inline const wxChar* wxCommandEventStringHelper::c_str() const +{ + return m_evt->GetString().c_str(); +} +#endif + +// this class adds a possibility to react (from the user) code to a control +// notification: allow or veto the operation being reported. +class WXDLLIMPEXP_CORE wxNotifyEvent : public wxCommandEvent +{ +public: + wxNotifyEvent(wxEventType commandType = wxEVT_NULL, int winid = 0) + : wxCommandEvent(commandType, winid) + { m_bAllow = true; } + + wxNotifyEvent(const wxNotifyEvent& event) + : wxCommandEvent(event) + { m_bAllow = event.m_bAllow; } + + // veto the operation (usually it's allowed by default) + void Veto() { m_bAllow = false; } + + // allow the operation if it was disabled by default + void Allow() { m_bAllow = true; } + + // for implementation code only: is the operation allowed? + bool IsAllowed() const { return m_bAllow; } + + virtual wxEvent *Clone() const { return new wxNotifyEvent(*this); } + +private: + bool m_bAllow; + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxNotifyEvent) +}; + +// Scroll event class, derived form wxCommandEvent. wxScrollEvents are +// sent by wxSlider and wxScrollBar. +/* + wxEVT_SCROLL_TOP + wxEVT_SCROLL_BOTTOM + wxEVT_SCROLL_LINEUP + wxEVT_SCROLL_LINEDOWN + wxEVT_SCROLL_PAGEUP + wxEVT_SCROLL_PAGEDOWN + wxEVT_SCROLL_THUMBTRACK + wxEVT_SCROLL_THUMBRELEASE + wxEVT_SCROLL_CHANGED +*/ + +class WXDLLIMPEXP_CORE wxScrollEvent : public wxCommandEvent +{ +public: + wxScrollEvent(wxEventType commandType = wxEVT_NULL, + int winid = 0, int pos = 0, int orient = 0); + + int GetOrientation() const { return (int) m_extraLong; } + int GetPosition() const { return m_commandInt; } + void SetOrientation(int orient) { m_extraLong = (long) orient; } + void SetPosition(int pos) { m_commandInt = pos; } + + virtual wxEvent *Clone() const { return new wxScrollEvent(*this); } + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxScrollEvent) +}; + +// ScrollWin event class, derived fom wxEvent. wxScrollWinEvents +// are sent by wxWindow. +/* + wxEVT_SCROLLWIN_TOP + wxEVT_SCROLLWIN_BOTTOM + wxEVT_SCROLLWIN_LINEUP + wxEVT_SCROLLWIN_LINEDOWN + wxEVT_SCROLLWIN_PAGEUP + wxEVT_SCROLLWIN_PAGEDOWN + wxEVT_SCROLLWIN_THUMBTRACK + wxEVT_SCROLLWIN_THUMBRELEASE +*/ + +class WXDLLIMPEXP_CORE wxScrollWinEvent : public wxEvent +{ +public: + wxScrollWinEvent(wxEventType commandType = wxEVT_NULL, + int pos = 0, int orient = 0); + wxScrollWinEvent(const wxScrollWinEvent & event) : wxEvent(event) + { m_commandInt = event.m_commandInt; + m_extraLong = event.m_extraLong; } + + int GetOrientation() const { return (int) m_extraLong; } + int GetPosition() const { return m_commandInt; } + void SetOrientation(int orient) { m_extraLong = (long) orient; } + void SetPosition(int pos) { m_commandInt = pos; } + + virtual wxEvent *Clone() const { return new wxScrollWinEvent(*this); } + +#if WXWIN_COMPATIBILITY_2_4 +public: +#else +protected: +#endif + int m_commandInt; + long m_extraLong; + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxScrollWinEvent) +}; + +// Mouse event class + +/* + wxEVT_LEFT_DOWN + wxEVT_LEFT_UP + wxEVT_MIDDLE_DOWN + wxEVT_MIDDLE_UP + wxEVT_RIGHT_DOWN + wxEVT_RIGHT_UP + wxEVT_MOTION + wxEVT_ENTER_WINDOW + wxEVT_LEAVE_WINDOW + wxEVT_LEFT_DCLICK + wxEVT_MIDDLE_DCLICK + wxEVT_RIGHT_DCLICK + wxEVT_NC_LEFT_DOWN + wxEVT_NC_LEFT_UP, + wxEVT_NC_MIDDLE_DOWN, + wxEVT_NC_MIDDLE_UP, + wxEVT_NC_RIGHT_DOWN, + wxEVT_NC_RIGHT_UP, + wxEVT_NC_MOTION, + wxEVT_NC_ENTER_WINDOW, + wxEVT_NC_LEAVE_WINDOW, + wxEVT_NC_LEFT_DCLICK, + wxEVT_NC_MIDDLE_DCLICK, + wxEVT_NC_RIGHT_DCLICK, +*/ + +// the symbolic names for the mouse buttons +enum +{ + wxMOUSE_BTN_ANY = -1, + wxMOUSE_BTN_NONE = 0, + wxMOUSE_BTN_LEFT = 1, + wxMOUSE_BTN_MIDDLE = 2, + wxMOUSE_BTN_RIGHT = 3 +}; + +class WXDLLIMPEXP_CORE wxMouseEvent : public wxEvent +{ +public: + wxMouseEvent(wxEventType mouseType = wxEVT_NULL); + wxMouseEvent(const wxMouseEvent& event) : wxEvent(event) + { Assign(event); } + + // Was it a button event? (*doesn't* mean: is any button *down*?) + bool IsButton() const { return Button(wxMOUSE_BTN_ANY); } + + // Was it a down event from this (or any) button? + bool ButtonDown(int but = wxMOUSE_BTN_ANY) const; + + // Was it a dclick event from this (or any) button? + bool ButtonDClick(int but = wxMOUSE_BTN_ANY) const; + + // Was it a up event from this (or any) button? + bool ButtonUp(int but = wxMOUSE_BTN_ANY) const; + + // Was the given button? + bool Button(int but) const; + + // Was the given button in Down state? + bool ButtonIsDown(int but) const; + + // Get the button which is changing state (wxMOUSE_BTN_NONE if none) + int GetButton() const; + + // Find state of shift/control keys + bool ControlDown() const { return m_controlDown; } + bool MetaDown() const { return m_metaDown; } + bool AltDown() const { return m_altDown; } + bool ShiftDown() const { return m_shiftDown; } + bool CmdDown() const + { +#if defined(__WXMAC__) || defined(__WXCOCOA__) + return MetaDown(); +#else + return ControlDown(); +#endif + } + + // Find which event was just generated + bool LeftDown() const { return (m_eventType == wxEVT_LEFT_DOWN); } + bool MiddleDown() const { return (m_eventType == wxEVT_MIDDLE_DOWN); } + bool RightDown() const { return (m_eventType == wxEVT_RIGHT_DOWN); } + + bool LeftUp() const { return (m_eventType == wxEVT_LEFT_UP); } + bool MiddleUp() const { return (m_eventType == wxEVT_MIDDLE_UP); } + bool RightUp() const { return (m_eventType == wxEVT_RIGHT_UP); } + + bool LeftDClick() const { return (m_eventType == wxEVT_LEFT_DCLICK); } + bool MiddleDClick() const { return (m_eventType == wxEVT_MIDDLE_DCLICK); } + bool RightDClick() const { return (m_eventType == wxEVT_RIGHT_DCLICK); } + + // Find the current state of the mouse buttons (regardless + // of current event type) + bool LeftIsDown() const { return m_leftDown; } + bool MiddleIsDown() const { return m_middleDown; } + bool RightIsDown() const { return m_rightDown; } + + // True if a button is down and the mouse is moving + bool Dragging() const + { + return (m_eventType == wxEVT_MOTION) && ButtonIsDown(wxMOUSE_BTN_ANY); + } + + // True if the mouse is moving, and no button is down + bool Moving() const + { + return (m_eventType == wxEVT_MOTION) && !ButtonIsDown(wxMOUSE_BTN_ANY); + } + + // True if the mouse is just entering the window + bool Entering() const { return (m_eventType == wxEVT_ENTER_WINDOW); } + + // True if the mouse is just leaving the window + bool Leaving() const { return (m_eventType == wxEVT_LEAVE_WINDOW); } + + // Find the position of the event + void GetPosition(wxCoord *xpos, wxCoord *ypos) const + { + if (xpos) + *xpos = m_x; + if (ypos) + *ypos = m_y; + } + + void GetPosition(long *xpos, long *ypos) const + { + if (xpos) + *xpos = (long)m_x; + if (ypos) + *ypos = (long)m_y; + } + + // Find the position of the event + wxPoint GetPosition() const { return wxPoint(m_x, m_y); } + + // Find the logical position of the event given the DC + wxPoint GetLogicalPosition(const wxDC& dc) const; + + // Get X position + wxCoord GetX() const { return m_x; } + + // Get Y position + wxCoord GetY() const { return m_y; } + + // Get wheel rotation, positive or negative indicates direction of + // rotation. Current devices all send an event when rotation is equal to + // +/-WheelDelta, but this allows for finer resolution devices to be + // created in the future. Because of this you shouldn't assume that one + // event is equal to 1 line or whatever, but you should be able to either + // do partial line scrolling or wait until +/-WheelDelta rotation values + // have been accumulated before scrolling. + int GetWheelRotation() const { return m_wheelRotation; } + + // Get wheel delta, normally 120. This is the threshold for action to be + // taken, and one such action (for example, scrolling one increment) + // should occur for each delta. + int GetWheelDelta() const { return m_wheelDelta; } + + // Returns the configured number of lines (or whatever) to be scrolled per + // wheel action. Defaults to one. + int GetLinesPerAction() const { return m_linesPerAction; } + + // Is the system set to do page scrolling? + bool IsPageScroll() const { return ((unsigned int)m_linesPerAction == UINT_MAX); } + + virtual wxEvent *Clone() const { return new wxMouseEvent(*this); } + + wxMouseEvent& operator=(const wxMouseEvent& event) { Assign(event); return *this; } + +public: + wxCoord m_x, m_y; + + bool m_leftDown; + bool m_middleDown; + bool m_rightDown; + + bool m_controlDown; + bool m_shiftDown; + bool m_altDown; + bool m_metaDown; + + int m_wheelRotation; + int m_wheelDelta; + int m_linesPerAction; + +protected: + void Assign(const wxMouseEvent& evt); + +private: + DECLARE_DYNAMIC_CLASS(wxMouseEvent) +}; + +// Cursor set event + +/* + wxEVT_SET_CURSOR + */ + +class WXDLLIMPEXP_CORE wxSetCursorEvent : public wxEvent +{ +public: + wxSetCursorEvent(wxCoord x = 0, wxCoord y = 0) + : wxEvent(0, wxEVT_SET_CURSOR), + m_x(x), m_y(y), m_cursor() + { } + + wxSetCursorEvent(const wxSetCursorEvent & event) + : wxEvent(event), + m_x(event.m_x), + m_y(event.m_y), + m_cursor(event.m_cursor) + { } + + wxCoord GetX() const { return m_x; } + wxCoord GetY() const { return m_y; } + + void SetCursor(const wxCursor& cursor) { m_cursor = cursor; } + const wxCursor& GetCursor() const { return m_cursor; } + bool HasCursor() const { return m_cursor.Ok(); } + + virtual wxEvent *Clone() const { return new wxSetCursorEvent(*this); } + +private: + wxCoord m_x, m_y; + wxCursor m_cursor; + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxSetCursorEvent) +}; + +// Keyboard input event class + +/* + wxEVT_CHAR + wxEVT_CHAR_HOOK + wxEVT_KEY_DOWN + wxEVT_KEY_UP + wxEVT_HOTKEY + */ + +class WXDLLIMPEXP_CORE wxKeyEvent : public wxEvent +{ +public: + wxKeyEvent(wxEventType keyType = wxEVT_NULL); + wxKeyEvent(const wxKeyEvent& evt); + + // can be used check if the key event has exactly the given modifiers: + // "GetModifiers() = wxMOD_CONTROL" is easier to write than "ControlDown() + // && !MetaDown() && !AltDown() && !ShiftDown()" + int GetModifiers() const + { + return (m_controlDown ? wxMOD_CONTROL : 0) | + (m_shiftDown ? wxMOD_SHIFT : 0) | + (m_metaDown ? wxMOD_META : 0) | + (m_altDown ? wxMOD_ALT : 0); + } + + // Find state of shift/control keys + bool ControlDown() const { return m_controlDown; } + bool ShiftDown() const { return m_shiftDown; } + bool MetaDown() const { return m_metaDown; } + bool AltDown() const { return m_altDown; } + + // "Cmd" is a pseudo key which is Control for PC and Unix platforms but + // Apple ("Command") key under Macs: it makes often sense to use it instead + // of, say, ControlDown() because Cmd key is used for the same thing under + // Mac as Ctrl elsewhere (but Ctrl still exists, just not used for this + // purpose under Mac) + bool CmdDown() const + { +#if defined(__WXMAC__) || defined(__WXCOCOA__) + return MetaDown(); +#else + return ControlDown(); +#endif + } + + // exclude MetaDown() from HasModifiers() because NumLock under X is often + // configured as mod2 modifier, yet the key events even when it is pressed + // should be processed normally, not like Ctrl- or Alt-key + bool HasModifiers() const { return ControlDown() || AltDown(); } + + // get the key code: an ASCII7 char or an element of wxKeyCode enum + int GetKeyCode() const { return (int)m_keyCode; } + +#if wxUSE_UNICODE + // get the Unicode character corresponding to this key + wxChar GetUnicodeKey() const { return m_uniChar; } +#endif // wxUSE_UNICODE + + // get the raw key code (platform-dependent) + wxUint32 GetRawKeyCode() const { return m_rawCode; } + + // get the raw key flags (platform-dependent) + wxUint32 GetRawKeyFlags() const { return m_rawFlags; } + + // Find the position of the event + void GetPosition(wxCoord *xpos, wxCoord *ypos) const + { + if (xpos) *xpos = m_x; + if (ypos) *ypos = m_y; + } + + void GetPosition(long *xpos, long *ypos) const + { + if (xpos) *xpos = (long)m_x; + if (ypos) *ypos = (long)m_y; + } + + wxPoint GetPosition() const + { return wxPoint(m_x, m_y); } + + // Get X position + wxCoord GetX() const { return m_x; } + + // Get Y position + wxCoord GetY() const { return m_y; } + +#if WXWIN_COMPATIBILITY_2_6 + // deprecated, Use GetKeyCode instead. + wxDEPRECATED( long KeyCode() const ); +#endif // WXWIN_COMPATIBILITY_2_6 + + virtual wxEvent *Clone() const { return new wxKeyEvent(*this); } + + // we do need to copy wxKeyEvent sometimes (in wxTreeCtrl code, for + // example) + wxKeyEvent& operator=(const wxKeyEvent& evt) + { + m_x = evt.m_x; + m_y = evt.m_y; + + m_keyCode = evt.m_keyCode; + + m_controlDown = evt.m_controlDown; + m_shiftDown = evt.m_shiftDown; + m_altDown = evt.m_altDown; + m_metaDown = evt.m_metaDown; + m_scanCode = evt.m_scanCode; + m_rawCode = evt.m_rawCode; + m_rawFlags = evt.m_rawFlags; +#if wxUSE_UNICODE + m_uniChar = evt.m_uniChar; +#endif + + return *this; + } + +public: + wxCoord m_x, m_y; + + long m_keyCode; + + // TODO: replace those with a single m_modifiers bitmask of wxMOD_XXX? + bool m_controlDown; + bool m_shiftDown; + bool m_altDown; + bool m_metaDown; + + // FIXME: what is this for? relation to m_rawXXX? + bool m_scanCode; + +#if wxUSE_UNICODE + // This contains the full Unicode character + // in a character events in Unicode mode + wxChar m_uniChar; +#endif + + // these fields contain the platform-specific information about + // key that was pressed + wxUint32 m_rawCode; + wxUint32 m_rawFlags; + +private: + DECLARE_DYNAMIC_CLASS(wxKeyEvent) +}; + +// Size event class +/* + wxEVT_SIZE + */ + +class WXDLLIMPEXP_CORE wxSizeEvent : public wxEvent +{ +public: + wxSizeEvent() : wxEvent(0, wxEVT_SIZE) + { } + wxSizeEvent(const wxSize& sz, int winid = 0) + : wxEvent(winid, wxEVT_SIZE), + m_size(sz) + { } + wxSizeEvent(const wxSizeEvent & event) + : wxEvent(event), + m_size(event.m_size), m_rect(event.m_rect) + { } + wxSizeEvent(const wxRect& rect, int id = 0) + : m_size(rect.GetSize()), m_rect(rect) + { m_eventType = wxEVT_SIZING; m_id = id; } + + wxSize GetSize() const { return m_size; } + wxRect GetRect() const { return m_rect; } + void SetRect(const wxRect& rect) { m_rect = rect; } + + virtual wxEvent *Clone() const { return new wxSizeEvent(*this); } + +public: + // For internal usage only. Will be converted to protected members. + wxSize m_size; + wxRect m_rect; // Used for wxEVT_SIZING + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxSizeEvent) +}; + +// Move event class + +/* + wxEVT_MOVE + */ + +class WXDLLIMPEXP_CORE wxMoveEvent : public wxEvent +{ +public: + wxMoveEvent() + : wxEvent(0, wxEVT_MOVE) + { } + wxMoveEvent(const wxPoint& pos, int winid = 0) + : wxEvent(winid, wxEVT_MOVE), + m_pos(pos) + { } + wxMoveEvent(const wxMoveEvent& event) + : wxEvent(event), + m_pos(event.m_pos) + { } + wxMoveEvent(const wxRect& rect, int id = 0) + : m_pos(rect.GetPosition()), m_rect(rect) + { m_eventType = wxEVT_MOVING; m_id = id; } + + wxPoint GetPosition() const { return m_pos; } + void SetPosition(const wxPoint& pos) { m_pos = pos; } + wxRect GetRect() const { return m_rect; } + void SetRect(const wxRect& rect) { m_rect = rect; } + + virtual wxEvent *Clone() const { return new wxMoveEvent(*this); } + +#if WXWIN_COMPATIBILITY_2_4 +public: +#else +protected: +#endif + wxPoint m_pos; + wxRect m_rect; + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxMoveEvent) +}; + +// Paint event class +/* + wxEVT_PAINT + wxEVT_NC_PAINT + wxEVT_PAINT_ICON + */ + +#if defined(__WXDEBUG__) && (defined(__WXMSW__) || defined(__WXPM__)) + // see comments in src/msw|os2/dcclient.cpp where g_isPainting is defined + extern WXDLLIMPEXP_CORE int g_isPainting; +#endif // debug + +class WXDLLIMPEXP_CORE wxPaintEvent : public wxEvent +{ +public: + wxPaintEvent(int Id = 0) + : wxEvent(Id, wxEVT_PAINT) + { +#if defined(__WXDEBUG__) && (defined(__WXMSW__) || defined(__WXPM__)) + // set the internal flag for the duration of processing of WM_PAINT + g_isPainting++; +#endif // debug + } + + // default copy ctor and dtor are normally fine, we only need them to keep + // g_isPainting updated in debug build +#if defined(__WXDEBUG__) && (defined(__WXMSW__) || defined(__WXPM__)) + wxPaintEvent(const wxPaintEvent& event) + : wxEvent(event) + { + g_isPainting++; + } + + virtual ~wxPaintEvent() + { + g_isPainting--; + } +#endif // debug + + virtual wxEvent *Clone() const { return new wxPaintEvent(*this); } + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxPaintEvent) +}; + +class WXDLLIMPEXP_CORE wxNcPaintEvent : public wxEvent +{ +public: + wxNcPaintEvent(int winid = 0) + : wxEvent(winid, wxEVT_NC_PAINT) + { } + + virtual wxEvent *Clone() const { return new wxNcPaintEvent(*this); } + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxNcPaintEvent) +}; + +// Erase background event class +/* + wxEVT_ERASE_BACKGROUND + */ + +class WXDLLIMPEXP_CORE wxEraseEvent : public wxEvent +{ +public: + wxEraseEvent(int Id = 0, wxDC *dc = (wxDC *) NULL) + : wxEvent(Id, wxEVT_ERASE_BACKGROUND), + m_dc(dc) + { } + + wxEraseEvent(const wxEraseEvent& event) + : wxEvent(event), + m_dc(event.m_dc) + { } + + wxDC *GetDC() const { return m_dc; } + + virtual wxEvent *Clone() const { return new wxEraseEvent(*this); } + +#if WXWIN_COMPATIBILITY_2_4 +public: +#else +protected: +#endif + wxDC *m_dc; + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxEraseEvent) +}; + +// Focus event class +/* + wxEVT_SET_FOCUS + wxEVT_KILL_FOCUS + */ + +class WXDLLIMPEXP_CORE wxFocusEvent : public wxEvent +{ +public: + wxFocusEvent(wxEventType type = wxEVT_NULL, int winid = 0) + : wxEvent(winid, type) + { m_win = NULL; } + + wxFocusEvent(const wxFocusEvent& event) + : wxEvent(event) + { m_win = event.m_win; } + + // The window associated with this event is the window which had focus + // before for SET event and the window which will have focus for the KILL + // one. NB: it may be NULL in both cases! + wxWindow *GetWindow() const { return m_win; } + void SetWindow(wxWindow *win) { m_win = win; } + + virtual wxEvent *Clone() const { return new wxFocusEvent(*this); } + +private: + wxWindow *m_win; + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxFocusEvent) +}; + +// wxChildFocusEvent notifies the parent that a child has got the focus: unlike +// wxFocusEvent it is propagated upwards the window chain +class WXDLLIMPEXP_CORE wxChildFocusEvent : public wxCommandEvent +{ +public: + wxChildFocusEvent(wxWindow *win = NULL); + + wxWindow *GetWindow() const { return (wxWindow *)GetEventObject(); } + + virtual wxEvent *Clone() const { return new wxChildFocusEvent(*this); } + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxChildFocusEvent) +}; + +// Activate event class +/* + wxEVT_ACTIVATE + wxEVT_ACTIVATE_APP + wxEVT_HIBERNATE + */ + +class WXDLLIMPEXP_CORE wxActivateEvent : public wxEvent +{ +public: + wxActivateEvent(wxEventType type = wxEVT_NULL, bool active = true, int Id = 0) + : wxEvent(Id, type) + { m_active = active; } + wxActivateEvent(const wxActivateEvent& event) + : wxEvent(event) + { m_active = event.m_active; } + + bool GetActive() const { return m_active; } + + virtual wxEvent *Clone() const { return new wxActivateEvent(*this); } + +private: + bool m_active; + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxActivateEvent) +}; + +// InitDialog event class +/* + wxEVT_INIT_DIALOG + */ + +class WXDLLIMPEXP_CORE wxInitDialogEvent : public wxEvent +{ +public: + wxInitDialogEvent(int Id = 0) + : wxEvent(Id, wxEVT_INIT_DIALOG) + { } + + virtual wxEvent *Clone() const { return new wxInitDialogEvent(*this); } + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxInitDialogEvent) +}; + +// Miscellaneous menu event class +/* + wxEVT_MENU_OPEN, + wxEVT_MENU_CLOSE, + wxEVT_MENU_HIGHLIGHT, +*/ + +class WXDLLIMPEXP_CORE wxMenuEvent : public wxEvent +{ +public: + wxMenuEvent(wxEventType type = wxEVT_NULL, int winid = 0, wxMenu* menu = NULL) + : wxEvent(winid, type) + { m_menuId = winid; m_menu = menu; } + wxMenuEvent(const wxMenuEvent & event) + : wxEvent(event) + { m_menuId = event.m_menuId; m_menu = event.m_menu; } + + // only for wxEVT_MENU_HIGHLIGHT + int GetMenuId() const { return m_menuId; } + + // only for wxEVT_MENU_OPEN/CLOSE + bool IsPopup() const { return m_menuId == wxID_ANY; } + + // only for wxEVT_MENU_OPEN/CLOSE + wxMenu* GetMenu() const { return m_menu; } + + virtual wxEvent *Clone() const { return new wxMenuEvent(*this); } + +private: + int m_menuId; + wxMenu* m_menu; + + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxMenuEvent) +}; + +// Window close or session close event class +/* + wxEVT_CLOSE_WINDOW, + wxEVT_END_SESSION, + wxEVT_QUERY_END_SESSION + */ + +class WXDLLIMPEXP_CORE wxCloseEvent : public wxEvent +{ +public: + wxCloseEvent(wxEventType type = wxEVT_NULL, int winid = 0) + : wxEvent(winid, type), + m_loggingOff(true), + m_veto(false), // should be false by default + m_canVeto(true) {} + + wxCloseEvent(const wxCloseEvent & event) + : wxEvent(event), + m_loggingOff(event.m_loggingOff), + m_veto(event.m_veto), + m_canVeto(event.m_canVeto) {} + + void SetLoggingOff(bool logOff) { m_loggingOff = logOff; } + bool GetLoggingOff() const + { + // m_loggingOff flag is only used by wxEVT_[QUERY_]END_SESSION, it + // doesn't make sense for wxEVT_CLOSE_WINDOW + wxASSERT_MSG( m_eventType != wxEVT_CLOSE_WINDOW, + _T("this flag is for end session events only") ); + + return m_loggingOff; + } + + void Veto(bool veto = true) + { + // GetVeto() will return false anyhow... + wxCHECK_RET( m_canVeto, + wxT("call to Veto() ignored (can't veto this event)") ); + + m_veto = veto; + } + void SetCanVeto(bool canVeto) { m_canVeto = canVeto; } + bool CanVeto() const { return m_canVeto; } + bool GetVeto() const { return m_canVeto && m_veto; } + + virtual wxEvent *Clone() const { return new wxCloseEvent(*this); } + +protected: + bool m_loggingOff, + m_veto, + m_canVeto; + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxCloseEvent) +}; + +/* + wxEVT_SHOW + */ + +class WXDLLIMPEXP_CORE wxShowEvent : public wxEvent +{ +public: + wxShowEvent(int winid = 0, bool show = false) + : wxEvent(winid, wxEVT_SHOW) + { m_show = show; } + wxShowEvent(const wxShowEvent & event) + : wxEvent(event) + { m_show = event.m_show; } + + void SetShow(bool show) { m_show = show; } + bool GetShow() const { return m_show; } + + virtual wxEvent *Clone() const { return new wxShowEvent(*this); } + +protected: + bool m_show; + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxShowEvent) +}; + +/* + wxEVT_ICONIZE + */ + +class WXDLLIMPEXP_CORE wxIconizeEvent : public wxEvent +{ +public: + wxIconizeEvent(int winid = 0, bool iconized = true) + : wxEvent(winid, wxEVT_ICONIZE) + { m_iconized = iconized; } + wxIconizeEvent(const wxIconizeEvent & event) + : wxEvent(event) + { m_iconized = event.m_iconized; } + + // return true if the frame was iconized, false if restored + bool Iconized() const { return m_iconized; } + + virtual wxEvent *Clone() const { return new wxIconizeEvent(*this); } + +protected: + bool m_iconized; + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxIconizeEvent) +}; +/* + wxEVT_MAXIMIZE + */ + +class WXDLLIMPEXP_CORE wxMaximizeEvent : public wxEvent +{ +public: + wxMaximizeEvent(int winid = 0) + : wxEvent(winid, wxEVT_MAXIMIZE) + { } + + virtual wxEvent *Clone() const { return new wxMaximizeEvent(*this); } + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxMaximizeEvent) +}; + +// Joystick event class +/* + wxEVT_JOY_BUTTON_DOWN, + wxEVT_JOY_BUTTON_UP, + wxEVT_JOY_MOVE, + wxEVT_JOY_ZMOVE +*/ + +// Which joystick? Same as Windows ids so no conversion necessary. +enum +{ + wxJOYSTICK1, + wxJOYSTICK2 +}; + +// Which button is down? +enum +{ + wxJOY_BUTTON_ANY = -1, + wxJOY_BUTTON1 = 1, + wxJOY_BUTTON2 = 2, + wxJOY_BUTTON3 = 4, + wxJOY_BUTTON4 = 8 +}; + +class WXDLLIMPEXP_CORE wxJoystickEvent : public wxEvent +{ +#if WXWIN_COMPATIBILITY_2_4 +public: +#else +protected: +#endif + wxPoint m_pos; + int m_zPosition; + int m_buttonChange; // Which button changed? + int m_buttonState; // Which buttons are down? + int m_joyStick; // Which joystick? + +public: + wxJoystickEvent(wxEventType type = wxEVT_NULL, + int state = 0, + int joystick = wxJOYSTICK1, + int change = 0) + : wxEvent(0, type), + m_pos(), + m_zPosition(0), + m_buttonChange(change), + m_buttonState(state), + m_joyStick(joystick) + { + } + wxJoystickEvent(const wxJoystickEvent & event) + : wxEvent(event), + m_pos(event.m_pos), + m_zPosition(event.m_zPosition), + m_buttonChange(event.m_buttonChange), + m_buttonState(event.m_buttonState), + m_joyStick(event.m_joyStick) + { } + + wxPoint GetPosition() const { return m_pos; } + int GetZPosition() const { return m_zPosition; } + int GetButtonState() const { return m_buttonState; } + int GetButtonChange() const { return m_buttonChange; } + int GetJoystick() const { return m_joyStick; } + + void SetJoystick(int stick) { m_joyStick = stick; } + void SetButtonState(int state) { m_buttonState = state; } + void SetButtonChange(int change) { m_buttonChange = change; } + void SetPosition(const wxPoint& pos) { m_pos = pos; } + void SetZPosition(int zPos) { m_zPosition = zPos; } + + // Was it a button event? (*doesn't* mean: is any button *down*?) + bool IsButton() const { return ((GetEventType() == wxEVT_JOY_BUTTON_DOWN) || + (GetEventType() == wxEVT_JOY_BUTTON_UP)); } + + // Was it a move event? + bool IsMove() const { return (GetEventType() == wxEVT_JOY_MOVE); } + + // Was it a zmove event? + bool IsZMove() const { return (GetEventType() == wxEVT_JOY_ZMOVE); } + + // Was it a down event from button 1, 2, 3, 4 or any? + bool ButtonDown(int but = wxJOY_BUTTON_ANY) const + { return ((GetEventType() == wxEVT_JOY_BUTTON_DOWN) && + ((but == wxJOY_BUTTON_ANY) || (but == m_buttonChange))); } + + // Was it a up event from button 1, 2, 3 or any? + bool ButtonUp(int but = wxJOY_BUTTON_ANY) const + { return ((GetEventType() == wxEVT_JOY_BUTTON_UP) && + ((but == wxJOY_BUTTON_ANY) || (but == m_buttonChange))); } + + // Was the given button 1,2,3,4 or any in Down state? + bool ButtonIsDown(int but = wxJOY_BUTTON_ANY) const + { return (((but == wxJOY_BUTTON_ANY) && (m_buttonState != 0)) || + ((m_buttonState & but) == but)); } + + virtual wxEvent *Clone() const { return new wxJoystickEvent(*this); } + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxJoystickEvent) +}; + +// Drop files event class +/* + wxEVT_DROP_FILES + */ + +class WXDLLIMPEXP_CORE wxDropFilesEvent : public wxEvent +{ +public: + int m_noFiles; + wxPoint m_pos; + wxString* m_files; + + wxDropFilesEvent(wxEventType type = wxEVT_NULL, + int noFiles = 0, + wxString *files = (wxString *) NULL) + : wxEvent(0, type), + m_noFiles(noFiles), + m_pos(), + m_files(files) + { } + + // we need a copy ctor to avoid deleting m_files pointer twice + wxDropFilesEvent(const wxDropFilesEvent& other) + : wxEvent(other), + m_noFiles(other.m_noFiles), + m_pos(other.m_pos), + m_files(NULL) + { + m_files = new wxString[m_noFiles]; + for ( int n = 0; n < m_noFiles; n++ ) + { + m_files[n] = other.m_files[n]; + } + } + + virtual ~wxDropFilesEvent() + { + delete [] m_files; + } + + wxPoint GetPosition() const { return m_pos; } + int GetNumberOfFiles() const { return m_noFiles; } + wxString *GetFiles() const { return m_files; } + + virtual wxEvent *Clone() const { return new wxDropFilesEvent(*this); } + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxDropFilesEvent) +}; + +// Update UI event +/* + wxEVT_UPDATE_UI + */ + +// Whether to always send update events to windows, or +// to only send update events to those with the +// wxWS_EX_PROCESS_UI_UPDATES style. + +enum wxUpdateUIMode +{ + // Send UI update events to all windows + wxUPDATE_UI_PROCESS_ALL, + + // Send UI update events to windows that have + // the wxWS_EX_PROCESS_UI_UPDATES flag specified + wxUPDATE_UI_PROCESS_SPECIFIED +}; + +class WXDLLIMPEXP_CORE wxUpdateUIEvent : public wxCommandEvent +{ +public: + wxUpdateUIEvent(wxWindowID commandId = 0) + : wxCommandEvent(wxEVT_UPDATE_UI, commandId) + { + m_checked = + m_enabled = + m_shown = + m_setEnabled = + m_setShown = + m_setText = + m_setChecked = false; + } + wxUpdateUIEvent(const wxUpdateUIEvent & event) + : wxCommandEvent(event), + m_checked(event.m_checked), + m_enabled(event.m_enabled), + m_shown(event.m_shown), + m_setEnabled(event.m_setEnabled), + m_setShown(event.m_setShown), + m_setText(event.m_setText), + m_setChecked(event.m_setChecked), + m_text(event.m_text) + { } + + bool GetChecked() const { return m_checked; } + bool GetEnabled() const { return m_enabled; } + bool GetShown() const { return m_shown; } + wxString GetText() const { return m_text; } + bool GetSetText() const { return m_setText; } + bool GetSetChecked() const { return m_setChecked; } + bool GetSetEnabled() const { return m_setEnabled; } + bool GetSetShown() const { return m_setShown; } + + void Check(bool check) { m_checked = check; m_setChecked = true; } + void Enable(bool enable) { m_enabled = enable; m_setEnabled = true; } + void Show(bool show) { m_shown = show; m_setShown = true; } + void SetText(const wxString& text) { m_text = text; m_setText = true; } + + // Sets the interval between updates in milliseconds. + // Set to -1 to disable updates, or to 0 to update as frequently as possible. + static void SetUpdateInterval(long updateInterval) { sm_updateInterval = updateInterval; } + + // Returns the current interval between updates in milliseconds + static long GetUpdateInterval() { return sm_updateInterval; } + + // Can we update this window? + static bool CanUpdate(wxWindowBase *win); + + // Reset the update time to provide a delay until the next + // time we should update + static void ResetUpdateTime(); + + // Specify how wxWidgets will send update events: to + // all windows, or only to those which specify that they + // will process the events. + static void SetMode(wxUpdateUIMode mode) { sm_updateMode = mode; } + + // Returns the UI update mode + static wxUpdateUIMode GetMode() { return sm_updateMode; } + + virtual wxEvent *Clone() const { return new wxUpdateUIEvent(*this); } + +protected: + bool m_checked; + bool m_enabled; + bool m_shown; + bool m_setEnabled; + bool m_setShown; + bool m_setText; + bool m_setChecked; + wxString m_text; +#if wxUSE_LONGLONG + static wxLongLong sm_lastUpdate; +#endif + static long sm_updateInterval; + static wxUpdateUIMode sm_updateMode; + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxUpdateUIEvent) +}; + +/* + wxEVT_SYS_COLOUR_CHANGED + */ + +// TODO: shouldn't all events record the window ID? +class WXDLLIMPEXP_CORE wxSysColourChangedEvent : public wxEvent +{ +public: + wxSysColourChangedEvent() + : wxEvent(0, wxEVT_SYS_COLOUR_CHANGED) + { } + + virtual wxEvent *Clone() const { return new wxSysColourChangedEvent(*this); } + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxSysColourChangedEvent) +}; + +/* + wxEVT_MOUSE_CAPTURE_CHANGED + The window losing the capture receives this message + (even if it released the capture itself). + */ + +class WXDLLIMPEXP_CORE wxMouseCaptureChangedEvent : public wxEvent +{ +public: + wxMouseCaptureChangedEvent(wxWindowID winid = 0, wxWindow* gainedCapture = NULL) + : wxEvent(winid, wxEVT_MOUSE_CAPTURE_CHANGED), + m_gainedCapture(gainedCapture) + { } + + wxMouseCaptureChangedEvent(const wxMouseCaptureChangedEvent& event) + : wxEvent(event), + m_gainedCapture(event.m_gainedCapture) + { } + + virtual wxEvent *Clone() const { return new wxMouseCaptureChangedEvent(*this); } + + wxWindow* GetCapturedWindow() const { return m_gainedCapture; } + +private: + wxWindow* m_gainedCapture; + + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxMouseCaptureChangedEvent) +}; + +/* + wxEVT_MOUSE_CAPTURE_LOST + The window losing the capture receives this message, unless it released it + it itself or unless wxWindow::CaptureMouse was called on another window + (and so capture will be restored when the new capturer releases it). + */ + +class WXDLLIMPEXP_CORE wxMouseCaptureLostEvent : public wxEvent +{ +public: + wxMouseCaptureLostEvent(wxWindowID winid = 0) + : wxEvent(winid, wxEVT_MOUSE_CAPTURE_LOST) + {} + + wxMouseCaptureLostEvent(const wxMouseCaptureLostEvent& event) + : wxEvent(event) + {} + + virtual wxEvent *Clone() const { return new wxMouseCaptureLostEvent(*this); } + + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxMouseCaptureLostEvent) +}; + +/* + wxEVT_DISPLAY_CHANGED + */ +class WXDLLIMPEXP_CORE wxDisplayChangedEvent : public wxEvent +{ +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxDisplayChangedEvent) + +public: + wxDisplayChangedEvent() + : wxEvent(0, wxEVT_DISPLAY_CHANGED) + { } + + virtual wxEvent *Clone() const { return new wxDisplayChangedEvent(*this); } +}; + +/* + wxEVT_PALETTE_CHANGED + */ + +class WXDLLIMPEXP_CORE wxPaletteChangedEvent : public wxEvent +{ +public: + wxPaletteChangedEvent(wxWindowID winid = 0) + : wxEvent(winid, wxEVT_PALETTE_CHANGED), + m_changedWindow((wxWindow *) NULL) + { } + + wxPaletteChangedEvent(const wxPaletteChangedEvent& event) + : wxEvent(event), + m_changedWindow(event.m_changedWindow) + { } + + void SetChangedWindow(wxWindow* win) { m_changedWindow = win; } + wxWindow* GetChangedWindow() const { return m_changedWindow; } + + virtual wxEvent *Clone() const { return new wxPaletteChangedEvent(*this); } + +protected: + wxWindow* m_changedWindow; + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxPaletteChangedEvent) +}; + +/* + wxEVT_QUERY_NEW_PALETTE + Indicates the window is getting keyboard focus and should re-do its palette. + */ + +class WXDLLIMPEXP_CORE wxQueryNewPaletteEvent : public wxEvent +{ +public: + wxQueryNewPaletteEvent(wxWindowID winid = 0) + : wxEvent(winid, wxEVT_QUERY_NEW_PALETTE), + m_paletteRealized(false) + { } + wxQueryNewPaletteEvent(const wxQueryNewPaletteEvent & event) + : wxEvent(event), + m_paletteRealized(event.m_paletteRealized) + { } + + // App sets this if it changes the palette. + void SetPaletteRealized(bool realized) { m_paletteRealized = realized; } + bool GetPaletteRealized() const { return m_paletteRealized; } + + virtual wxEvent *Clone() const { return new wxQueryNewPaletteEvent(*this); } + +protected: + bool m_paletteRealized; + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxQueryNewPaletteEvent) +}; + +/* + Event generated by dialog navigation keys + wxEVT_NAVIGATION_KEY + */ +// NB: don't derive from command event to avoid being propagated to the parent +class WXDLLIMPEXP_CORE wxNavigationKeyEvent : public wxEvent +{ +public: + wxNavigationKeyEvent() + : wxEvent(0, wxEVT_NAVIGATION_KEY), + m_flags(IsForward | FromTab), // defaults are for TAB + m_focus((wxWindow *)NULL) + { + m_propagationLevel = wxEVENT_PROPAGATE_NONE; + } + + wxNavigationKeyEvent(const wxNavigationKeyEvent& event) + : wxEvent(event), + m_flags(event.m_flags), + m_focus(event.m_focus) + { } + + // direction: forward (true) or backward (false) + bool GetDirection() const + { return (m_flags & IsForward) != 0; } + void SetDirection(bool bForward) + { if ( bForward ) m_flags |= IsForward; else m_flags &= ~IsForward; } + + // it may be a window change event (MDI, notebook pages...) or a control + // change event + bool IsWindowChange() const + { return (m_flags & WinChange) != 0; } + void SetWindowChange(bool bIs) + { if ( bIs ) m_flags |= WinChange; else m_flags &= ~WinChange; } + + // Set to true under MSW if the event was generated using the tab key. + // This is required for proper navogation over radio buttons + bool IsFromTab() const + { return (m_flags & FromTab) != 0; } + void SetFromTab(bool bIs) + { if ( bIs ) m_flags |= FromTab; else m_flags &= ~FromTab; } + + // the child which has the focus currently (may be NULL - use + // wxWindow::FindFocus then) + wxWindow* GetCurrentFocus() const { return m_focus; } + void SetCurrentFocus(wxWindow *win) { m_focus = win; } + + // Set flags + void SetFlags(long flags) { m_flags = flags; } + + virtual wxEvent *Clone() const { return new wxNavigationKeyEvent(*this); } + + enum + { + IsBackward = 0x0000, + IsForward = 0x0001, + WinChange = 0x0002, + FromTab = 0x0004 + }; + + long m_flags; + wxWindow *m_focus; + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxNavigationKeyEvent) +}; + +// Window creation/destruction events: the first is sent as soon as window is +// created (i.e. the underlying GUI object exists), but when the C++ object is +// fully initialized (so virtual functions may be called). The second, +// wxEVT_DESTROY, is sent right before the window is destroyed - again, it's +// still safe to call virtual functions at this moment +/* + wxEVT_CREATE + wxEVT_DESTROY + */ + +class WXDLLIMPEXP_CORE wxWindowCreateEvent : public wxCommandEvent +{ +public: + wxWindowCreateEvent(wxWindow *win = NULL); + + wxWindow *GetWindow() const { return (wxWindow *)GetEventObject(); } + + virtual wxEvent *Clone() const { return new wxWindowCreateEvent(*this); } + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxWindowCreateEvent) +}; + +class WXDLLIMPEXP_CORE wxWindowDestroyEvent : public wxCommandEvent +{ +public: + wxWindowDestroyEvent(wxWindow *win = NULL); + + wxWindow *GetWindow() const { return (wxWindow *)GetEventObject(); } + + virtual wxEvent *Clone() const { return new wxWindowDestroyEvent(*this); } + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxWindowDestroyEvent) +}; + +// A help event is sent when the user clicks on a window in context-help mode. +/* + wxEVT_HELP + wxEVT_DETAILED_HELP +*/ + +class WXDLLIMPEXP_CORE wxHelpEvent : public wxCommandEvent +{ +public: + // how was this help event generated? + enum Origin + { + Origin_Unknown, // unrecognized event source + Origin_Keyboard, // event generated from F1 key press + Origin_HelpButton // event from [?] button on the title bar (Windows) + }; + + wxHelpEvent(wxEventType type = wxEVT_NULL, + wxWindowID winid = 0, + const wxPoint& pt = wxDefaultPosition, + Origin origin = Origin_Unknown) + : wxCommandEvent(type, winid), + m_pos(pt), + m_origin(GuessOrigin(origin)) + { } + wxHelpEvent(const wxHelpEvent & event) + : wxCommandEvent(event), + m_pos(event.m_pos), + m_target(event.m_target), + m_link(event.m_link), + m_origin(event.m_origin) + { } + + // Position of event (in screen coordinates) + const wxPoint& GetPosition() const { return m_pos; } + void SetPosition(const wxPoint& pos) { m_pos = pos; } + + // Optional link to further help + const wxString& GetLink() const { return m_link; } + void SetLink(const wxString& link) { m_link = link; } + + // Optional target to display help in. E.g. a window specification + const wxString& GetTarget() const { return m_target; } + void SetTarget(const wxString& target) { m_target = target; } + + virtual wxEvent *Clone() const { return new wxHelpEvent(*this); } + + // optional indication of the event source + Origin GetOrigin() const { return m_origin; } + void SetOrigin(Origin origin) { m_origin = origin; } + +protected: + wxPoint m_pos; + wxString m_target; + wxString m_link; + Origin m_origin; + + // we can try to guess the event origin ourselves, even if none is + // specified in the ctor + static Origin GuessOrigin(Origin origin); + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxHelpEvent) +}; + +// A Clipboard Text event is sent when a window intercepts text copy/cut/paste +// message, i.e. the user has cut/copied/pasted data from/into a text control +// via ctrl-C/X/V, ctrl/shift-del/insert, a popup menu command, etc. +// NOTE : under windows these events are *NOT* generated automatically +// for a Rich Edit text control. +/* +wxEVT_COMMAND_TEXT_COPY +wxEVT_COMMAND_TEXT_CUT +wxEVT_COMMAND_TEXT_PASTE +*/ + +class WXDLLIMPEXP_CORE wxClipboardTextEvent : public wxCommandEvent +{ +public: + wxClipboardTextEvent(wxEventType type = wxEVT_NULL, + wxWindowID winid = 0) + : wxCommandEvent(type, winid) + { } + wxClipboardTextEvent(const wxClipboardTextEvent & event) + : wxCommandEvent(event) + { } + + virtual wxEvent *Clone() const { return new wxClipboardTextEvent(*this); } + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxClipboardTextEvent) +}; + +// A Context event is sent when the user right clicks on a window or +// presses Shift-F10 +// NOTE : Under windows this is a repackaged WM_CONTETXMENU message +// Under other systems it may have to be generated from a right click event +/* + wxEVT_CONTEXT_MENU +*/ + +class WXDLLIMPEXP_CORE wxContextMenuEvent : public wxCommandEvent +{ +public: + wxContextMenuEvent(wxEventType type = wxEVT_NULL, + wxWindowID winid = 0, + const wxPoint& pt = wxDefaultPosition) + : wxCommandEvent(type, winid), + m_pos(pt) + { } + wxContextMenuEvent(const wxContextMenuEvent & event) + : wxCommandEvent(event), + m_pos(event.m_pos) + { } + + // Position of event (in screen coordinates) + const wxPoint& GetPosition() const { return m_pos; } + void SetPosition(const wxPoint& pos) { m_pos = pos; } + + virtual wxEvent *Clone() const { return new wxContextMenuEvent(*this); } + +protected: + wxPoint m_pos; + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxContextMenuEvent) +}; + +// Idle event +/* + wxEVT_IDLE + */ + +// Whether to always send idle events to windows, or +// to only send update events to those with the +// wxWS_EX_PROCESS_IDLE style. + +enum wxIdleMode +{ + // Send idle events to all windows + wxIDLE_PROCESS_ALL, + + // Send idle events to windows that have + // the wxWS_EX_PROCESS_IDLE flag specified + wxIDLE_PROCESS_SPECIFIED +}; + +class WXDLLIMPEXP_CORE wxIdleEvent : public wxEvent +{ +public: + wxIdleEvent() + : wxEvent(0, wxEVT_IDLE), + m_requestMore(false) + { } + wxIdleEvent(const wxIdleEvent & event) + : wxEvent(event), + m_requestMore(event.m_requestMore) + { } + + void RequestMore(bool needMore = true) { m_requestMore = needMore; } + bool MoreRequested() const { return m_requestMore; } + + virtual wxEvent *Clone() const { return new wxIdleEvent(*this); } + + // Specify how wxWidgets will send idle events: to + // all windows, or only to those which specify that they + // will process the events. + static void SetMode(wxIdleMode mode) { sm_idleMode = mode; } + + // Returns the idle event mode + static wxIdleMode GetMode() { return sm_idleMode; } + + // Can we send an idle event? + static bool CanSend(wxWindow* win); + +protected: + bool m_requestMore; + static wxIdleMode sm_idleMode; + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxIdleEvent) +}; + +#endif // wxUSE_GUI + +/* TODO + wxEVT_MOUSE_CAPTURE_CHANGED, + wxEVT_SETTING_CHANGED, // WM_WININICHANGE (NT) / WM_SETTINGCHANGE (Win95) +// wxEVT_FONT_CHANGED, // WM_FONTCHANGE: roll into wxEVT_SETTING_CHANGED, but remember to propagate + // wxEVT_FONT_CHANGED to all other windows (maybe). + wxEVT_DRAW_ITEM, // Leave these three as virtual functions in wxControl?? Platform-specific. + wxEVT_MEASURE_ITEM, + wxEVT_COMPARE_ITEM +*/ + + +// ============================================================================ +// event handler and related classes +// ============================================================================ + +// for backwards compatibility and to prevent eVC 4 for ARM from crashing with +// internal compiler error when compiling wx, we define wxObjectEventFunction +// as a wxObject method even though it can only be a wxEvtHandler one +typedef void (wxObject::*wxObjectEventFunction)(wxEvent&); + +// we can't have ctors nor base struct in backwards compatibility mode or +// otherwise we won't be able to initialize the objects with an agregate, so +// we have to keep both versions +#if WXWIN_COMPATIBILITY_EVENT_TYPES + +struct WXDLLIMPEXP_BASE wxEventTableEntry +{ + // For some reason, this can't be wxEventType, or VC++ complains. + int m_eventType; // main event type + int m_id; // control/menu/toolbar id + int m_lastId; // used for ranges of ids + wxObjectEventFunction m_fn; // function to call: not wxEventFunction, + // because of dependency problems + + wxObject* m_callbackUserData; +}; + +#else // !WXWIN_COMPATIBILITY_EVENT_TYPES + +// struct containing the members common to static and dynamic event tables +// entries +struct WXDLLIMPEXP_BASE wxEventTableEntryBase +{ +private: + wxEventTableEntryBase& operator=(const wxEventTableEntryBase& event); + +public: + wxEventTableEntryBase(int winid, int idLast, + wxObjectEventFunction fn, wxObject *data) + : m_id(winid), + m_lastId(idLast), + m_fn(fn), + m_callbackUserData(data) + { } + + wxEventTableEntryBase(const wxEventTableEntryBase& event) + : m_id(event.m_id), + m_lastId(event.m_lastId), + m_fn(event.m_fn), + m_callbackUserData(event.m_callbackUserData) + { } + + // the range of ids for this entry: if m_lastId == wxID_ANY, the range + // consists only of m_id, otherwise it is m_id..m_lastId inclusive + int m_id, + m_lastId; + + // function to call: not wxEventFunction, because of dependency problems + wxObjectEventFunction m_fn; + + // arbitrary user data asosciated with the callback + wxObject* m_callbackUserData; +}; + +// an entry from a static event table +struct WXDLLIMPEXP_BASE wxEventTableEntry : public wxEventTableEntryBase +{ + wxEventTableEntry(const int& evType, int winid, int idLast, + wxObjectEventFunction fn, wxObject *data) + : wxEventTableEntryBase(winid, idLast, fn, data), + m_eventType(evType) + { } + + // the reference to event type: this allows us to not care about the + // (undefined) order in which the event table entries and the event types + // are initialized: initially the value of this reference might be + // invalid, but by the time it is used for the first time, all global + // objects will have been initialized (including the event type constants) + // and so it will have the correct value when it is needed + const int& m_eventType; + +private: + wxEventTableEntry& operator=(const wxEventTableEntry&); +}; + +// an entry used in dynamic event table managed by wxEvtHandler::Connect() +struct WXDLLIMPEXP_BASE wxDynamicEventTableEntry : public wxEventTableEntryBase +{ + wxDynamicEventTableEntry(int evType, int winid, int idLast, + wxObjectEventFunction fn, wxObject *data, wxEvtHandler* eventSink) + : wxEventTableEntryBase(winid, idLast, fn, data), + m_eventType(evType), + m_eventSink(eventSink) + { } + + // not a reference here as we can't keep a reference to a temporary int + // created to wrap the constant value typically passed to Connect() - nor + // do we need it + int m_eventType; + + // Pointer to object whose function is fn - so we don't assume the + // EventFunction is always a member of the EventHandler receiving the + // message + wxEvtHandler* m_eventSink; + + DECLARE_NO_COPY_CLASS(wxDynamicEventTableEntry) +}; + +#endif // !WXWIN_COMPATIBILITY_EVENT_TYPES + +// ---------------------------------------------------------------------------- +// wxEventTable: an array of event entries terminated with {0, 0, 0, 0, 0} +// ---------------------------------------------------------------------------- + +struct WXDLLIMPEXP_BASE wxEventTable +{ + const wxEventTable *baseTable; // base event table (next in chain) + const wxEventTableEntry *entries; // bottom of entry array +}; + +// ---------------------------------------------------------------------------- +// wxEventHashTable: a helper of wxEvtHandler to speed up wxEventTable lookups. +// ---------------------------------------------------------------------------- + +WX_DEFINE_ARRAY_PTR(const wxEventTableEntry*, wxEventTableEntryPointerArray); + +class WXDLLIMPEXP_BASE wxEventHashTable +{ +private: + // Internal data structs + struct EventTypeTable + { + wxEventType eventType; + wxEventTableEntryPointerArray eventEntryTable; + }; + typedef EventTypeTable* EventTypeTablePointer; + +public: + // Constructor, needs the event table it needs to hash later on. + // Note: hashing of the event table is not done in the constructor as it + // can be that the event table is not yet full initialize, the hash + // will gets initialized when handling the first event look-up request. + wxEventHashTable(const wxEventTable &table); + // Destructor. + ~wxEventHashTable(); + + // Handle the given event, in other words search the event table hash + // and call self->ProcessEvent() if a match was found. + bool HandleEvent(wxEvent &event, wxEvtHandler *self); + + // Clear table + void Clear(); + + // Clear all tables + static void ClearAll(); + // Rebuild all tables + static void ReconstructAll(); + +protected: + // Init the hash table with the entries of the static event table. + void InitHashTable(); + // Helper funtion of InitHashTable() to insert 1 entry into the hash table. + void AddEntry(const wxEventTableEntry &entry); + // Allocate and init with null pointers the base hash table. + void AllocEventTypeTable(size_t size); + // Grow the hash table in size and transfer all items currently + // in the table to the correct location in the new table. + void GrowEventTypeTable(); + +protected: + const wxEventTable &m_table; + bool m_rebuildHash; + + size_t m_size; + EventTypeTablePointer *m_eventTypeTable; + + static wxEventHashTable* sm_first; + wxEventHashTable* m_previous; + wxEventHashTable* m_next; + + DECLARE_NO_COPY_CLASS(wxEventHashTable) +}; + +// ---------------------------------------------------------------------------- +// wxEvtHandler: the base class for all objects handling wxWidgets events +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxEvtHandler : public wxObject +{ +public: + wxEvtHandler(); + virtual ~wxEvtHandler(); + + wxEvtHandler *GetNextHandler() const { return m_nextHandler; } + wxEvtHandler *GetPreviousHandler() const { return m_previousHandler; } + void SetNextHandler(wxEvtHandler *handler) { m_nextHandler = handler; } + void SetPreviousHandler(wxEvtHandler *handler) { m_previousHandler = handler; } + + void SetEvtHandlerEnabled(bool enabled) { m_enabled = enabled; } + bool GetEvtHandlerEnabled() const { return m_enabled; } + + // process an event right now + virtual bool ProcessEvent(wxEvent& event); + + // add an event to be processed later + void AddPendingEvent(wxEvent& event); + + void ProcessPendingEvents(); + +#if wxUSE_THREADS + bool ProcessThreadEvent(wxEvent& event); +#endif + + // Dynamic association of a member function handler with the event handler, + // winid and event type + void Connect(int winid, + int lastId, + int eventType, + wxObjectEventFunction func, + wxObject *userData = (wxObject *) NULL, + wxEvtHandler *eventSink = (wxEvtHandler *) NULL); + + // Convenience function: take just one id + void Connect(int winid, + int eventType, + wxObjectEventFunction func, + wxObject *userData = (wxObject *) NULL, + wxEvtHandler *eventSink = (wxEvtHandler *) NULL) + { Connect(winid, wxID_ANY, eventType, func, userData, eventSink); } + + // Even more convenient: without id (same as using id of wxID_ANY) + void Connect(int eventType, + wxObjectEventFunction func, + wxObject *userData = (wxObject *) NULL, + wxEvtHandler *eventSink = (wxEvtHandler *) NULL) + { Connect(wxID_ANY, wxID_ANY, eventType, func, userData, eventSink); } + + bool Disconnect(int winid, + int lastId, + wxEventType eventType, + wxObjectEventFunction func = NULL, + wxObject *userData = (wxObject *) NULL, + wxEvtHandler *eventSink = (wxEvtHandler *) NULL); + + bool Disconnect(int winid = wxID_ANY, + wxEventType eventType = wxEVT_NULL, + wxObjectEventFunction func = NULL, + wxObject *userData = (wxObject *) NULL, + wxEvtHandler *eventSink = (wxEvtHandler *) NULL) + { return Disconnect(winid, wxID_ANY, eventType, func, userData, eventSink); } + + bool Disconnect(wxEventType eventType, + wxObjectEventFunction func, + wxObject *userData = (wxObject *) NULL, + wxEvtHandler *eventSink = (wxEvtHandler *) NULL) + { return Disconnect(wxID_ANY, eventType, func, userData, eventSink); } + + wxList* GetDynamicEventTable() const { return m_dynamicEvents ; } + + // User data can be associated with each wxEvtHandler + void SetClientObject( wxClientData *data ) { DoSetClientObject(data); } + wxClientData *GetClientObject() const { return DoGetClientObject(); } + + void SetClientData( void *data ) { DoSetClientData(data); } + void *GetClientData() const { return DoGetClientData(); } + + // check if the given event table entry matches this event and call the + // handler if it does + // + // return true if the event was processed, false otherwise (no match or the + // handler decided to skip the event) + static bool ProcessEventIfMatches(const wxEventTableEntryBase& tableEntry, + wxEvtHandler *handler, + wxEvent& event); + + // implementation from now on + virtual bool SearchEventTable(wxEventTable& table, wxEvent& event); + bool SearchDynamicEventTable( wxEvent& event ); + +#if wxUSE_THREADS + void ClearEventLocker(); +#endif // wxUSE_THREADS + + // Avoid problems at exit by cleaning up static hash table gracefully + void ClearEventHashTable() { GetEventHashTable().Clear(); } + +private: + static const wxEventTableEntry sm_eventTableEntries[]; + +protected: + // hooks for wxWindow used by ProcessEvent() + // ----------------------------------------- + + // This one is called before trying our own event table to allow plugging + // in the validators. + // + // NB: This method is intentionally *not* inside wxUSE_VALIDATORS! + // It is part of wxBase which doesn't use validators and the code + // is compiled out when building wxBase w/o GUI classes, which affects + // binary compatibility and wxBase library can't be used by GUI + // ports. + virtual bool TryValidator(wxEvent& WXUNUSED(event)) { return false; } + + // this one is called after failing to find the event handle in our own + // table to give a chance to the other windows to process it + // + // base class implementation passes the event to wxTheApp + virtual bool TryParent(wxEvent& event); + + + static const wxEventTable sm_eventTable; + virtual const wxEventTable *GetEventTable() const; + + static wxEventHashTable sm_eventHashTable; + virtual wxEventHashTable& GetEventHashTable() const; + + wxEvtHandler* m_nextHandler; + wxEvtHandler* m_previousHandler; + wxList* m_dynamicEvents; + wxList* m_pendingEvents; + +#if wxUSE_THREADS +#if defined (__VISAGECPP__) + const wxCriticalSection& Lock() const { return m_eventsLocker; } + wxCriticalSection& Lock() { return m_eventsLocker; } + + wxCriticalSection m_eventsLocker; +# else + const wxCriticalSection& Lock() const { return *m_eventsLocker; } + wxCriticalSection& Lock() { return *m_eventsLocker; } + + wxCriticalSection* m_eventsLocker; +# endif +#endif + + // Is event handler enabled? + bool m_enabled; + + + // The user data: either an object which will be deleted by the container + // when it's deleted or some raw pointer which we do nothing with - only + // one type of data can be used with the given window (i.e. you cannot set + // the void data and then associate the container with wxClientData or vice + // versa) + union + { + wxClientData *m_clientObject; + void *m_clientData; + }; + + // what kind of data do we have? + wxClientDataType m_clientDataType; + + // client data accessors + virtual void DoSetClientObject( wxClientData *data ); + virtual wxClientData *DoGetClientObject() const; + + virtual void DoSetClientData( void *data ); + virtual void *DoGetClientData() const; + +private: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxEvtHandler) +}; + +// Post a message to the given eventhandler which will be processed during the +// next event loop iteration +inline void wxPostEvent(wxEvtHandler *dest, wxEvent& event) +{ + wxCHECK_RET( dest, wxT("need an object to post event to in wxPostEvent") ); + + dest->AddPendingEvent(event); +} + +typedef void (wxEvtHandler::*wxEventFunction)(wxEvent&); + +#define wxEventHandler(func) \ + (wxObjectEventFunction)wxStaticCastEvent(wxEventFunction, &func) + +#if wxUSE_GUI + +typedef void (wxEvtHandler::*wxCommandEventFunction)(wxCommandEvent&); +typedef void (wxEvtHandler::*wxScrollEventFunction)(wxScrollEvent&); +typedef void (wxEvtHandler::*wxScrollWinEventFunction)(wxScrollWinEvent&); +typedef void (wxEvtHandler::*wxSizeEventFunction)(wxSizeEvent&); +typedef void (wxEvtHandler::*wxMoveEventFunction)(wxMoveEvent&); +typedef void (wxEvtHandler::*wxPaintEventFunction)(wxPaintEvent&); +typedef void (wxEvtHandler::*wxNcPaintEventFunction)(wxNcPaintEvent&); +typedef void (wxEvtHandler::*wxEraseEventFunction)(wxEraseEvent&); +typedef void (wxEvtHandler::*wxMouseEventFunction)(wxMouseEvent&); +typedef void (wxEvtHandler::*wxCharEventFunction)(wxKeyEvent&); +typedef void (wxEvtHandler::*wxFocusEventFunction)(wxFocusEvent&); +typedef void (wxEvtHandler::*wxChildFocusEventFunction)(wxChildFocusEvent&); +typedef void (wxEvtHandler::*wxActivateEventFunction)(wxActivateEvent&); +typedef void (wxEvtHandler::*wxMenuEventFunction)(wxMenuEvent&); +typedef void (wxEvtHandler::*wxJoystickEventFunction)(wxJoystickEvent&); +typedef void (wxEvtHandler::*wxDropFilesEventFunction)(wxDropFilesEvent&); +typedef void (wxEvtHandler::*wxInitDialogEventFunction)(wxInitDialogEvent&); +typedef void (wxEvtHandler::*wxSysColourChangedEventFunction)(wxSysColourChangedEvent&); +typedef void (wxEvtHandler::*wxDisplayChangedEventFunction)(wxDisplayChangedEvent&); +typedef void (wxEvtHandler::*wxUpdateUIEventFunction)(wxUpdateUIEvent&); +typedef void (wxEvtHandler::*wxIdleEventFunction)(wxIdleEvent&); +typedef void (wxEvtHandler::*wxCloseEventFunction)(wxCloseEvent&); +typedef void (wxEvtHandler::*wxShowEventFunction)(wxShowEvent&); +typedef void (wxEvtHandler::*wxIconizeEventFunction)(wxIconizeEvent&); +typedef void (wxEvtHandler::*wxMaximizeEventFunction)(wxMaximizeEvent&); +typedef void (wxEvtHandler::*wxNavigationKeyEventFunction)(wxNavigationKeyEvent&); +typedef void (wxEvtHandler::*wxPaletteChangedEventFunction)(wxPaletteChangedEvent&); +typedef void (wxEvtHandler::*wxQueryNewPaletteEventFunction)(wxQueryNewPaletteEvent&); +typedef void (wxEvtHandler::*wxWindowCreateEventFunction)(wxWindowCreateEvent&); +typedef void (wxEvtHandler::*wxWindowDestroyEventFunction)(wxWindowDestroyEvent&); +typedef void (wxEvtHandler::*wxSetCursorEventFunction)(wxSetCursorEvent&); +typedef void (wxEvtHandler::*wxNotifyEventFunction)(wxNotifyEvent&); +typedef void (wxEvtHandler::*wxHelpEventFunction)(wxHelpEvent&); +typedef void (wxEvtHandler::*wxContextMenuEventFunction)(wxContextMenuEvent&); +typedef void (wxEvtHandler::*wxMouseCaptureChangedEventFunction)(wxMouseCaptureChangedEvent&); +typedef void (wxEvtHandler::*wxMouseCaptureLostEventFunction)(wxMouseCaptureLostEvent&); +typedef void (wxEvtHandler::*wxClipboardTextEventFunction)(wxClipboardTextEvent&); + +// these typedefs don't have the same name structure as the others, keep for +// backwards compatibility only +#if WXWIN_COMPATIBILITY_2_4 + typedef wxSysColourChangedEventFunction wxSysColourChangedFunction; + typedef wxDisplayChangedEventFunction wxDisplayChangedFunction; +#endif // WXWIN_COMPATIBILITY_2_4 + + +#define wxCommandEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxCommandEventFunction, &func) +#define wxScrollEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxScrollEventFunction, &func) +#define wxScrollWinEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxScrollWinEventFunction, &func) +#define wxSizeEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxSizeEventFunction, &func) +#define wxMoveEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxMoveEventFunction, &func) +#define wxPaintEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxPaintEventFunction, &func) +#define wxNcPaintEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxNcPaintEventFunction, &func) +#define wxEraseEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxEraseEventFunction, &func) +#define wxMouseEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxMouseEventFunction, &func) +#define wxCharEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxCharEventFunction, &func) +#define wxKeyEventHandler(func) wxCharEventHandler(func) +#define wxFocusEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxFocusEventFunction, &func) +#define wxChildFocusEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxChildFocusEventFunction, &func) +#define wxActivateEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxActivateEventFunction, &func) +#define wxMenuEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxMenuEventFunction, &func) +#define wxJoystickEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxJoystickEventFunction, &func) +#define wxDropFilesEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxDropFilesEventFunction, &func) +#define wxInitDialogEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxInitDialogEventFunction, &func) +#define wxSysColourChangedEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxSysColourChangedEventFunction, &func) +#define wxDisplayChangedEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxDisplayChangedEventFunction, &func) +#define wxUpdateUIEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxUpdateUIEventFunction, &func) +#define wxIdleEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxIdleEventFunction, &func) +#define wxCloseEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxCloseEventFunction, &func) +#define wxShowEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxShowEventFunction, &func) +#define wxIconizeEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxIconizeEventFunction, &func) +#define wxMaximizeEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxMaximizeEventFunction, &func) +#define wxNavigationKeyEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxNavigationKeyEventFunction, &func) +#define wxPaletteChangedEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxPaletteChangedEventFunction, &func) +#define wxQueryNewPaletteEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxQueryNewPaletteEventFunction, &func) +#define wxWindowCreateEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxWindowCreateEventFunction, &func) +#define wxWindowDestroyEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxWindowDestroyEventFunction, &func) +#define wxSetCursorEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxSetCursorEventFunction, &func) +#define wxNotifyEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxNotifyEventFunction, &func) +#define wxHelpEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxHelpEventFunction, &func) +#define wxContextMenuEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxContextMenuEventFunction, &func) +#define wxMouseCaptureChangedEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxMouseCaptureChangedEventFunction, &func) +#define wxMouseCaptureLostEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxMouseCaptureLostEventFunction, &func) +#define wxClipboardTextEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxClipboardTextEventFunction, &func) + +#endif // wxUSE_GUI + +// N.B. In GNU-WIN32, you *have* to take the address of a member function +// (use &) or the compiler crashes... + +#define DECLARE_EVENT_TABLE() \ + private: \ + static const wxEventTableEntry sm_eventTableEntries[]; \ + protected: \ + static const wxEventTable sm_eventTable; \ + virtual const wxEventTable* GetEventTable() const; \ + static wxEventHashTable sm_eventHashTable; \ + virtual wxEventHashTable& GetEventHashTable() const; + +// N.B.: when building DLL with Borland C++ 5.5 compiler, you must initialize +// sm_eventTable before using it in GetEventTable() or the compiler gives +// E2233 (see http://groups.google.com/groups?selm=397dcc8a%241_2%40dnews) + +#define BEGIN_EVENT_TABLE(theClass, baseClass) \ + const wxEventTable theClass::sm_eventTable = \ + { &baseClass::sm_eventTable, &theClass::sm_eventTableEntries[0] }; \ + const wxEventTable *theClass::GetEventTable() const \ + { return &theClass::sm_eventTable; } \ + wxEventHashTable theClass::sm_eventHashTable(theClass::sm_eventTable); \ + wxEventHashTable &theClass::GetEventHashTable() const \ + { return theClass::sm_eventHashTable; } \ + const wxEventTableEntry theClass::sm_eventTableEntries[] = { \ + +#define BEGIN_EVENT_TABLE_TEMPLATE1(theClass, baseClass, T1) \ + template \ + const wxEventTable theClass::sm_eventTable = \ + { &baseClass::sm_eventTable, &theClass::sm_eventTableEntries[0] }; \ + template \ + const wxEventTable *theClass::GetEventTable() const \ + { return &theClass::sm_eventTable; } \ + template \ + wxEventHashTable theClass::sm_eventHashTable(theClass::sm_eventTable); \ + template \ + wxEventHashTable &theClass::GetEventHashTable() const \ + { return theClass::sm_eventHashTable; } \ + template \ + const wxEventTableEntry theClass::sm_eventTableEntries[] = { \ + +#define BEGIN_EVENT_TABLE_TEMPLATE2(theClass, baseClass, T1, T2) \ + template \ + const wxEventTable theClass::sm_eventTable = \ + { &baseClass::sm_eventTable, &theClass::sm_eventTableEntries[0] }; \ + template \ + const wxEventTable *theClass::GetEventTable() const \ + { return &theClass::sm_eventTable; } \ + template \ + wxEventHashTable theClass::sm_eventHashTable(theClass::sm_eventTable); \ + template \ + wxEventHashTable &theClass::GetEventHashTable() const \ + { return theClass::sm_eventHashTable; } \ + template \ + const wxEventTableEntry theClass::sm_eventTableEntries[] = { \ + +#define BEGIN_EVENT_TABLE_TEMPLATE3(theClass, baseClass, T1, T2, T3) \ + template \ + const wxEventTable theClass::sm_eventTable = \ + { &baseClass::sm_eventTable, &theClass::sm_eventTableEntries[0] }; \ + template \ + const wxEventTable *theClass::GetEventTable() const \ + { return &theClass::sm_eventTable; } \ + template \ + wxEventHashTable theClass::sm_eventHashTable(theClass::sm_eventTable); \ + template \ + wxEventHashTable &theClass::GetEventHashTable() const \ + { return theClass::sm_eventHashTable; } \ + template \ + const wxEventTableEntry theClass::sm_eventTableEntries[] = { \ + +#define BEGIN_EVENT_TABLE_TEMPLATE4(theClass, baseClass, T1, T2, T3, T4) \ + template \ + const wxEventTable theClass::sm_eventTable = \ + { &baseClass::sm_eventTable, &theClass::sm_eventTableEntries[0] }; \ + template \ + const wxEventTable *theClass::GetEventTable() const \ + { return &theClass::sm_eventTable; } \ + template \ + wxEventHashTable theClass::sm_eventHashTable(theClass::sm_eventTable); \ + template \ + wxEventHashTable &theClass::GetEventHashTable() const \ + { return theClass::sm_eventHashTable; } \ + template \ + const wxEventTableEntry theClass::sm_eventTableEntries[] = { \ + +#define BEGIN_EVENT_TABLE_TEMPLATE5(theClass, baseClass, T1, T2, T3, T4, T5) \ + template \ + const wxEventTable theClass::sm_eventTable = \ + { &baseClass::sm_eventTable, &theClass::sm_eventTableEntries[0] }; \ + template \ + const wxEventTable *theClass::GetEventTable() const \ + { return &theClass::sm_eventTable; } \ + template \ + wxEventHashTable theClass::sm_eventHashTable(theClass::sm_eventTable); \ + template \ + wxEventHashTable &theClass::GetEventHashTable() const \ + { return theClass::sm_eventHashTable; } \ + template \ + const wxEventTableEntry theClass::sm_eventTableEntries[] = { \ + +#define BEGIN_EVENT_TABLE_TEMPLATE7(theClass, baseClass, T1, T2, T3, T4, T5, T6, T7) \ + template \ + const wxEventTable theClass::sm_eventTable = \ + { &baseClass::sm_eventTable, &theClass::sm_eventTableEntries[0] }; \ + template \ + const wxEventTable *theClass::GetEventTable() const \ + { return &theClass::sm_eventTable; } \ + template \ + wxEventHashTable theClass::sm_eventHashTable(theClass::sm_eventTable); \ + template \ + wxEventHashTable &theClass::GetEventHashTable() const \ + { return theClass::sm_eventHashTable; } \ + template \ + const wxEventTableEntry theClass::sm_eventTableEntries[] = { \ + +#define BEGIN_EVENT_TABLE_TEMPLATE8(theClass, baseClass, T1, T2, T3, T4, T5, T6, T7, T8) \ + template \ + const wxEventTable theClass::sm_eventTable = \ + { &baseClass::sm_eventTable, &theClass::sm_eventTableEntries[0] }; \ + template \ + const wxEventTable *theClass::GetEventTable() const \ + { return &theClass::sm_eventTable; } \ + template \ + wxEventHashTable theClass::sm_eventHashTable(theClass::sm_eventTable); \ + template \ + wxEventHashTable &theClass::GetEventHashTable() const \ + { return theClass::sm_eventHashTable; } \ + template \ + const wxEventTableEntry theClass::sm_eventTableEntries[] = { \ + +#define END_EVENT_TABLE() DECLARE_EVENT_TABLE_ENTRY( wxEVT_NULL, 0, 0, 0, 0 ) }; + +/* + * Event table macros + */ + +// helpers for writing shorter code below: declare an event macro taking 2, 1 +// or none ids (the missing ids default to wxID_ANY) +// +// macro arguments: +// - evt one of wxEVT_XXX constants +// - id1, id2 ids of the first/last id +// - fn the function (should be cast to the right type) +#define wx__DECLARE_EVT2(evt, id1, id2, fn) \ + DECLARE_EVENT_TABLE_ENTRY(evt, id1, id2, fn, NULL), +#define wx__DECLARE_EVT1(evt, id, fn) \ + wx__DECLARE_EVT2(evt, id, wxID_ANY, fn) +#define wx__DECLARE_EVT0(evt, fn) \ + wx__DECLARE_EVT1(evt, wxID_ANY, fn) + + +// Generic events +#define EVT_CUSTOM(event, winid, func) \ + wx__DECLARE_EVT1(event, winid, wxEventHandler(func)) +#define EVT_CUSTOM_RANGE(event, id1, id2, func) \ + wx__DECLARE_EVT2(event, id1, id2, wxEventHandler(func)) + +// EVT_COMMAND +#define EVT_COMMAND(winid, event, func) \ + wx__DECLARE_EVT1(event, winid, wxCommandEventHandler(func)) +#define EVT_COMMAND_RANGE(id1, id2, event, func) \ + wx__DECLARE_EVT2(event, id1, id2, wxCommandEventHandler(func)) + +#define EVT_NOTIFY(event, winid, func) \ + wx__DECLARE_EVT1(event, winid, wxNotifyEventHandler(func)) +#define EVT_NOTIFY_RANGE(event, id1, id2, func) \ + wx__DECLARE_EVT2(event, id1, id2, wxNotifyEventHandler(func)) + +// Miscellaneous +#define EVT_SIZE(func) wx__DECLARE_EVT0(wxEVT_SIZE, wxSizeEventHandler(func)) +#define EVT_SIZING(func) wx__DECLARE_EVT0(wxEVT_SIZING, wxSizeEventHandler(func)) +#define EVT_MOVE(func) wx__DECLARE_EVT0(wxEVT_MOVE, wxMoveEventHandler(func)) +#define EVT_MOVING(func) wx__DECLARE_EVT0(wxEVT_MOVING, wxMoveEventHandler(func)) +#define EVT_CLOSE(func) wx__DECLARE_EVT0(wxEVT_CLOSE_WINDOW, wxCloseEventHandler(func)) +#define EVT_END_SESSION(func) wx__DECLARE_EVT0(wxEVT_END_SESSION, wxCloseEventHandler(func)) +#define EVT_QUERY_END_SESSION(func) wx__DECLARE_EVT0(wxEVT_QUERY_END_SESSION, wxCloseEventHandler(func)) +#define EVT_PAINT(func) wx__DECLARE_EVT0(wxEVT_PAINT, wxPaintEventHandler(func)) +#define EVT_NC_PAINT(func) wx__DECLARE_EVT0(wxEVT_NC_PAINT, wxNcPaintEventHandler(func)) +#define EVT_ERASE_BACKGROUND(func) wx__DECLARE_EVT0(wxEVT_ERASE_BACKGROUND, wxEraseEventHandler(func)) +#define EVT_CHAR(func) wx__DECLARE_EVT0(wxEVT_CHAR, wxCharEventHandler(func)) +#define EVT_KEY_DOWN(func) wx__DECLARE_EVT0(wxEVT_KEY_DOWN, wxKeyEventHandler(func)) +#define EVT_KEY_UP(func) wx__DECLARE_EVT0(wxEVT_KEY_UP, wxKeyEventHandler(func)) +#if wxUSE_HOTKEY +#define EVT_HOTKEY(winid, func) wx__DECLARE_EVT1(wxEVT_HOTKEY, winid, wxCharEventHandler(func)) +#endif +#define EVT_CHAR_HOOK(func) wx__DECLARE_EVT0(wxEVT_CHAR_HOOK, wxCharEventHandler(func)) +#define EVT_MENU_OPEN(func) wx__DECLARE_EVT0(wxEVT_MENU_OPEN, wxMenuEventHandler(func)) +#define EVT_MENU_CLOSE(func) wx__DECLARE_EVT0(wxEVT_MENU_CLOSE, wxMenuEventHandler(func)) +#define EVT_MENU_HIGHLIGHT(winid, func) wx__DECLARE_EVT1(wxEVT_MENU_HIGHLIGHT, winid, wxMenuEventHandler(func)) +#define EVT_MENU_HIGHLIGHT_ALL(func) wx__DECLARE_EVT0(wxEVT_MENU_HIGHLIGHT, wxMenuEventHandler(func)) +#define EVT_SET_FOCUS(func) wx__DECLARE_EVT0(wxEVT_SET_FOCUS, wxFocusEventHandler(func)) +#define EVT_KILL_FOCUS(func) wx__DECLARE_EVT0(wxEVT_KILL_FOCUS, wxFocusEventHandler(func)) +#define EVT_CHILD_FOCUS(func) wx__DECLARE_EVT0(wxEVT_CHILD_FOCUS, wxChildFocusEventHandler(func)) +#define EVT_ACTIVATE(func) wx__DECLARE_EVT0(wxEVT_ACTIVATE, wxActivateEventHandler(func)) +#define EVT_ACTIVATE_APP(func) wx__DECLARE_EVT0(wxEVT_ACTIVATE_APP, wxActivateEventHandler(func)) +#define EVT_HIBERNATE(func) wx__DECLARE_EVT0(wxEVT_HIBERNATE, wxActivateEventHandler(func)) +#define EVT_END_SESSION(func) wx__DECLARE_EVT0(wxEVT_END_SESSION, wxCloseEventHandler(func)) +#define EVT_QUERY_END_SESSION(func) wx__DECLARE_EVT0(wxEVT_QUERY_END_SESSION, wxCloseEventHandler(func)) +#define EVT_DROP_FILES(func) wx__DECLARE_EVT0(wxEVT_DROP_FILES, wxDropFilesEventHandler(func)) +#define EVT_INIT_DIALOG(func) wx__DECLARE_EVT0(wxEVT_INIT_DIALOG, wxInitDialogEventHandler(func)) +#define EVT_SYS_COLOUR_CHANGED(func) wx__DECLARE_EVT0(wxEVT_SYS_COLOUR_CHANGED, wxSysColourChangedEventHandler(func)) +#define EVT_DISPLAY_CHANGED(func) wx__DECLARE_EVT0(wxEVT_DISPLAY_CHANGED, wxDisplayChangedEventHandler(func)) +#define EVT_SHOW(func) wx__DECLARE_EVT0(wxEVT_SHOW, wxShowEventHandler(func)) +#define EVT_MAXIMIZE(func) wx__DECLARE_EVT0(wxEVT_MAXIMIZE, wxMaximizeEventHandler(func)) +#define EVT_ICONIZE(func) wx__DECLARE_EVT0(wxEVT_ICONIZE, wxIconizeEventHandler(func)) +#define EVT_NAVIGATION_KEY(func) wx__DECLARE_EVT0(wxEVT_NAVIGATION_KEY, wxNavigationKeyEventHandler(func)) +#define EVT_PALETTE_CHANGED(func) wx__DECLARE_EVT0(wxEVT_PALETTE_CHANGED, wxPaletteChangedEventHandler(func)) +#define EVT_QUERY_NEW_PALETTE(func) wx__DECLARE_EVT0(wxEVT_QUERY_NEW_PALETTE, wxQueryNewPaletteEventHandler(func)) +#define EVT_WINDOW_CREATE(func) wx__DECLARE_EVT0(wxEVT_CREATE, wxWindowCreateEventHandler(func)) +#define EVT_WINDOW_DESTROY(func) wx__DECLARE_EVT0(wxEVT_DESTROY, wxWindowDestroyEventHandler(func)) +#define EVT_SET_CURSOR(func) wx__DECLARE_EVT0(wxEVT_SET_CURSOR, wxSetCursorEventHandler(func)) +#define EVT_MOUSE_CAPTURE_CHANGED(func) wx__DECLARE_EVT0(wxEVT_MOUSE_CAPTURE_CHANGED, wxMouseCaptureChangedEventHandler(func)) +#define EVT_MOUSE_CAPTURE_LOST(func) wx__DECLARE_EVT0(wxEVT_MOUSE_CAPTURE_LOST, wxMouseCaptureLostEventHandler(func)) + +// Mouse events +#define EVT_LEFT_DOWN(func) wx__DECLARE_EVT0(wxEVT_LEFT_DOWN, wxMouseEventHandler(func)) +#define EVT_LEFT_UP(func) wx__DECLARE_EVT0(wxEVT_LEFT_UP, wxMouseEventHandler(func)) +#define EVT_MIDDLE_DOWN(func) wx__DECLARE_EVT0(wxEVT_MIDDLE_DOWN, wxMouseEventHandler(func)) +#define EVT_MIDDLE_UP(func) wx__DECLARE_EVT0(wxEVT_MIDDLE_UP, wxMouseEventHandler(func)) +#define EVT_RIGHT_DOWN(func) wx__DECLARE_EVT0(wxEVT_RIGHT_DOWN, wxMouseEventHandler(func)) +#define EVT_RIGHT_UP(func) wx__DECLARE_EVT0(wxEVT_RIGHT_UP, wxMouseEventHandler(func)) +#define EVT_MOTION(func) wx__DECLARE_EVT0(wxEVT_MOTION, wxMouseEventHandler(func)) +#define EVT_LEFT_DCLICK(func) wx__DECLARE_EVT0(wxEVT_LEFT_DCLICK, wxMouseEventHandler(func)) +#define EVT_MIDDLE_DCLICK(func) wx__DECLARE_EVT0(wxEVT_MIDDLE_DCLICK, wxMouseEventHandler(func)) +#define EVT_RIGHT_DCLICK(func) wx__DECLARE_EVT0(wxEVT_RIGHT_DCLICK, wxMouseEventHandler(func)) +#define EVT_LEAVE_WINDOW(func) wx__DECLARE_EVT0(wxEVT_LEAVE_WINDOW, wxMouseEventHandler(func)) +#define EVT_ENTER_WINDOW(func) wx__DECLARE_EVT0(wxEVT_ENTER_WINDOW, wxMouseEventHandler(func)) +#define EVT_MOUSEWHEEL(func) wx__DECLARE_EVT0(wxEVT_MOUSEWHEEL, wxMouseEventHandler(func)) + +// All mouse events +#define EVT_MOUSE_EVENTS(func) \ + EVT_LEFT_DOWN(func) \ + EVT_LEFT_UP(func) \ + EVT_MIDDLE_DOWN(func) \ + EVT_MIDDLE_UP(func) \ + EVT_RIGHT_DOWN(func) \ + EVT_RIGHT_UP(func) \ + EVT_MOTION(func) \ + EVT_LEFT_DCLICK(func) \ + EVT_MIDDLE_DCLICK(func) \ + EVT_RIGHT_DCLICK(func) \ + EVT_LEAVE_WINDOW(func) \ + EVT_ENTER_WINDOW(func) \ + EVT_MOUSEWHEEL(func) + +// Scrolling from wxWindow (sent to wxScrolledWindow) +#define EVT_SCROLLWIN_TOP(func) wx__DECLARE_EVT0(wxEVT_SCROLLWIN_TOP, wxScrollWinEventHandler(func)) +#define EVT_SCROLLWIN_BOTTOM(func) wx__DECLARE_EVT0(wxEVT_SCROLLWIN_BOTTOM, wxScrollWinEventHandler(func)) +#define EVT_SCROLLWIN_LINEUP(func) wx__DECLARE_EVT0(wxEVT_SCROLLWIN_LINEUP, wxScrollWinEventHandler(func)) +#define EVT_SCROLLWIN_LINEDOWN(func) wx__DECLARE_EVT0(wxEVT_SCROLLWIN_LINEDOWN, wxScrollWinEventHandler(func)) +#define EVT_SCROLLWIN_PAGEUP(func) wx__DECLARE_EVT0(wxEVT_SCROLLWIN_PAGEUP, wxScrollWinEventHandler(func)) +#define EVT_SCROLLWIN_PAGEDOWN(func) wx__DECLARE_EVT0(wxEVT_SCROLLWIN_PAGEDOWN, wxScrollWinEventHandler(func)) +#define EVT_SCROLLWIN_THUMBTRACK(func) wx__DECLARE_EVT0(wxEVT_SCROLLWIN_THUMBTRACK, wxScrollWinEventHandler(func)) +#define EVT_SCROLLWIN_THUMBRELEASE(func) wx__DECLARE_EVT0(wxEVT_SCROLLWIN_THUMBRELEASE, wxScrollWinEventHandler(func)) + +#define EVT_SCROLLWIN(func) \ + EVT_SCROLLWIN_TOP(func) \ + EVT_SCROLLWIN_BOTTOM(func) \ + EVT_SCROLLWIN_LINEUP(func) \ + EVT_SCROLLWIN_LINEDOWN(func) \ + EVT_SCROLLWIN_PAGEUP(func) \ + EVT_SCROLLWIN_PAGEDOWN(func) \ + EVT_SCROLLWIN_THUMBTRACK(func) \ + EVT_SCROLLWIN_THUMBRELEASE(func) + +// Scrolling from wxSlider and wxScrollBar +#define EVT_SCROLL_TOP(func) wx__DECLARE_EVT0(wxEVT_SCROLL_TOP, wxScrollEventHandler(func)) +#define EVT_SCROLL_BOTTOM(func) wx__DECLARE_EVT0(wxEVT_SCROLL_BOTTOM, wxScrollEventHandler(func)) +#define EVT_SCROLL_LINEUP(func) wx__DECLARE_EVT0(wxEVT_SCROLL_LINEUP, wxScrollEventHandler(func)) +#define EVT_SCROLL_LINEDOWN(func) wx__DECLARE_EVT0(wxEVT_SCROLL_LINEDOWN, wxScrollEventHandler(func)) +#define EVT_SCROLL_PAGEUP(func) wx__DECLARE_EVT0(wxEVT_SCROLL_PAGEUP, wxScrollEventHandler(func)) +#define EVT_SCROLL_PAGEDOWN(func) wx__DECLARE_EVT0(wxEVT_SCROLL_PAGEDOWN, wxScrollEventHandler(func)) +#define EVT_SCROLL_THUMBTRACK(func) wx__DECLARE_EVT0(wxEVT_SCROLL_THUMBTRACK, wxScrollEventHandler(func)) +#define EVT_SCROLL_THUMBRELEASE(func) wx__DECLARE_EVT0(wxEVT_SCROLL_THUMBRELEASE, wxScrollEventHandler(func)) +#define EVT_SCROLL_CHANGED(func) wx__DECLARE_EVT0(wxEVT_SCROLL_CHANGED, wxScrollEventHandler(func)) + +#define EVT_SCROLL(func) \ + EVT_SCROLL_TOP(func) \ + EVT_SCROLL_BOTTOM(func) \ + EVT_SCROLL_LINEUP(func) \ + EVT_SCROLL_LINEDOWN(func) \ + EVT_SCROLL_PAGEUP(func) \ + EVT_SCROLL_PAGEDOWN(func) \ + EVT_SCROLL_THUMBTRACK(func) \ + EVT_SCROLL_THUMBRELEASE(func) \ + EVT_SCROLL_CHANGED(func) + +// Scrolling from wxSlider and wxScrollBar, with an id +#define EVT_COMMAND_SCROLL_TOP(winid, func) wx__DECLARE_EVT1(wxEVT_SCROLL_TOP, winid, wxScrollEventHandler(func)) +#define EVT_COMMAND_SCROLL_BOTTOM(winid, func) wx__DECLARE_EVT1(wxEVT_SCROLL_BOTTOM, winid, wxScrollEventHandler(func)) +#define EVT_COMMAND_SCROLL_LINEUP(winid, func) wx__DECLARE_EVT1(wxEVT_SCROLL_LINEUP, winid, wxScrollEventHandler(func)) +#define EVT_COMMAND_SCROLL_LINEDOWN(winid, func) wx__DECLARE_EVT1(wxEVT_SCROLL_LINEDOWN, winid, wxScrollEventHandler(func)) +#define EVT_COMMAND_SCROLL_PAGEUP(winid, func) wx__DECLARE_EVT1(wxEVT_SCROLL_PAGEUP, winid, wxScrollEventHandler(func)) +#define EVT_COMMAND_SCROLL_PAGEDOWN(winid, func) wx__DECLARE_EVT1(wxEVT_SCROLL_PAGEDOWN, winid, wxScrollEventHandler(func)) +#define EVT_COMMAND_SCROLL_THUMBTRACK(winid, func) wx__DECLARE_EVT1(wxEVT_SCROLL_THUMBTRACK, winid, wxScrollEventHandler(func)) +#define EVT_COMMAND_SCROLL_THUMBRELEASE(winid, func) wx__DECLARE_EVT1(wxEVT_SCROLL_THUMBRELEASE, winid, wxScrollEventHandler(func)) +#define EVT_COMMAND_SCROLL_CHANGED(winid, func) wx__DECLARE_EVT1(wxEVT_SCROLL_CHANGED, winid, wxScrollEventHandler(func)) + +#define EVT_COMMAND_SCROLL(winid, func) \ + EVT_COMMAND_SCROLL_TOP(winid, func) \ + EVT_COMMAND_SCROLL_BOTTOM(winid, func) \ + EVT_COMMAND_SCROLL_LINEUP(winid, func) \ + EVT_COMMAND_SCROLL_LINEDOWN(winid, func) \ + EVT_COMMAND_SCROLL_PAGEUP(winid, func) \ + EVT_COMMAND_SCROLL_PAGEDOWN(winid, func) \ + EVT_COMMAND_SCROLL_THUMBTRACK(winid, func) \ + EVT_COMMAND_SCROLL_THUMBRELEASE(winid, func) \ + EVT_COMMAND_SCROLL_CHANGED(winid, func) + +#if WXWIN_COMPATIBILITY_2_6 + // compatibility macros for the old name, deprecated in 2.8 + #define wxEVT_SCROLL_ENDSCROLL wxEVT_SCROLL_CHANGED + #define EVT_COMMAND_SCROLL_ENDSCROLL EVT_COMMAND_SCROLL_CHANGED + #define EVT_SCROLL_ENDSCROLL EVT_SCROLL_CHANGED +#endif // WXWIN_COMPATIBILITY_2_6 + +// Convenience macros for commonly-used commands +#define EVT_CHECKBOX(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_CHECKBOX_CLICKED, winid, wxCommandEventHandler(func)) +#define EVT_CHOICE(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_CHOICE_SELECTED, winid, wxCommandEventHandler(func)) +#define EVT_LISTBOX(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_LISTBOX_SELECTED, winid, wxCommandEventHandler(func)) +#define EVT_LISTBOX_DCLICK(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_LISTBOX_DOUBLECLICKED, winid, wxCommandEventHandler(func)) +#define EVT_MENU(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_MENU_SELECTED, winid, wxCommandEventHandler(func)) +#define EVT_MENU_RANGE(id1, id2, func) wx__DECLARE_EVT2(wxEVT_COMMAND_MENU_SELECTED, id1, id2, wxCommandEventHandler(func)) +#if defined(__SMARTPHONE__) +# define EVT_BUTTON(winid, func) EVT_MENU(winid, func) +#else +# define EVT_BUTTON(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_BUTTON_CLICKED, winid, wxCommandEventHandler(func)) +#endif +#define EVT_SLIDER(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_SLIDER_UPDATED, winid, wxCommandEventHandler(func)) +#define EVT_RADIOBOX(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_RADIOBOX_SELECTED, winid, wxCommandEventHandler(func)) +#define EVT_RADIOBUTTON(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_RADIOBUTTON_SELECTED, winid, wxCommandEventHandler(func)) +// EVT_SCROLLBAR is now obsolete since we use EVT_COMMAND_SCROLL... events +#define EVT_SCROLLBAR(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_SCROLLBAR_UPDATED, winid, wxCommandEventHandler(func)) +#define EVT_VLBOX(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_VLBOX_SELECTED, winid, wxCommandEventHandler(func)) +#define EVT_COMBOBOX(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_COMBOBOX_SELECTED, winid, wxCommandEventHandler(func)) +#define EVT_TOOL(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_TOOL_CLICKED, winid, wxCommandEventHandler(func)) +#define EVT_TOOL_RANGE(id1, id2, func) wx__DECLARE_EVT2(wxEVT_COMMAND_TOOL_CLICKED, id1, id2, wxCommandEventHandler(func)) +#define EVT_TOOL_RCLICKED(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_TOOL_RCLICKED, winid, wxCommandEventHandler(func)) +#define EVT_TOOL_RCLICKED_RANGE(id1, id2, func) wx__DECLARE_EVT2(wxEVT_COMMAND_TOOL_RCLICKED, id1, id2, wxCommandEventHandler(func)) +#define EVT_TOOL_ENTER(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_TOOL_ENTER, winid, wxCommandEventHandler(func)) +#define EVT_CHECKLISTBOX(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_CHECKLISTBOX_TOGGLED, winid, wxCommandEventHandler(func)) + +// Generic command events +#define EVT_COMMAND_LEFT_CLICK(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_LEFT_CLICK, winid, wxCommandEventHandler(func)) +#define EVT_COMMAND_LEFT_DCLICK(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_LEFT_DCLICK, winid, wxCommandEventHandler(func)) +#define EVT_COMMAND_RIGHT_CLICK(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_RIGHT_CLICK, winid, wxCommandEventHandler(func)) +#define EVT_COMMAND_RIGHT_DCLICK(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_RIGHT_DCLICK, winid, wxCommandEventHandler(func)) +#define EVT_COMMAND_SET_FOCUS(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_SET_FOCUS, winid, wxCommandEventHandler(func)) +#define EVT_COMMAND_KILL_FOCUS(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_KILL_FOCUS, winid, wxCommandEventHandler(func)) +#define EVT_COMMAND_ENTER(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_ENTER, winid, wxCommandEventHandler(func)) + +// Joystick events + +#define EVT_JOY_BUTTON_DOWN(func) wx__DECLARE_EVT0(wxEVT_JOY_BUTTON_DOWN, wxJoystickEventHandler(func)) +#define EVT_JOY_BUTTON_UP(func) wx__DECLARE_EVT0(wxEVT_JOY_BUTTON_UP, wxJoystickEventHandler(func)) +#define EVT_JOY_MOVE(func) wx__DECLARE_EVT0(wxEVT_JOY_MOVE, wxJoystickEventHandler(func)) +#define EVT_JOY_ZMOVE(func) wx__DECLARE_EVT0(wxEVT_JOY_ZMOVE, wxJoystickEventHandler(func)) + +// These are obsolete, see _BUTTON_ events +#if WXWIN_COMPATIBILITY_2_4 + #define EVT_JOY_DOWN(func) EVT_JOY_BUTTON_DOWN(func) + #define EVT_JOY_UP(func) EVT_JOY_BUTTON_UP(func) +#endif // WXWIN_COMPATIBILITY_2_4 + +// All joystick events +#define EVT_JOYSTICK_EVENTS(func) \ + EVT_JOY_BUTTON_DOWN(func) \ + EVT_JOY_BUTTON_UP(func) \ + EVT_JOY_MOVE(func) \ + EVT_JOY_ZMOVE(func) + +// Idle event +#define EVT_IDLE(func) wx__DECLARE_EVT0(wxEVT_IDLE, wxIdleEventHandler(func)) + +// Update UI event +#define EVT_UPDATE_UI(winid, func) wx__DECLARE_EVT1(wxEVT_UPDATE_UI, winid, wxUpdateUIEventHandler(func)) +#define EVT_UPDATE_UI_RANGE(id1, id2, func) wx__DECLARE_EVT2(wxEVT_UPDATE_UI, id1, id2, wxUpdateUIEventHandler(func)) + +// Help events +#define EVT_HELP(winid, func) wx__DECLARE_EVT1(wxEVT_HELP, winid, wxHelpEventHandler(func)) +#define EVT_HELP_RANGE(id1, id2, func) wx__DECLARE_EVT2(wxEVT_HELP, id1, id2, wxHelpEventHandler(func)) +#define EVT_DETAILED_HELP(winid, func) wx__DECLARE_EVT1(wxEVT_DETAILED_HELP, winid, wxHelpEventHandler(func)) +#define EVT_DETAILED_HELP_RANGE(id1, id2, func) wx__DECLARE_EVT2(wxEVT_DETAILED_HELP, id1, id2, wxHelpEventHandler(func)) + +// Context Menu Events +#define EVT_CONTEXT_MENU(func) wx__DECLARE_EVT0(wxEVT_CONTEXT_MENU, wxContextMenuEventHandler(func)) +#define EVT_COMMAND_CONTEXT_MENU(winid, func) wx__DECLARE_EVT1(wxEVT_CONTEXT_MENU, winid, wxContextMenuEventHandler(func)) + +// Clipboard text Events +#define EVT_TEXT_CUT(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_TEXT_CUT, winid, wxClipboardTextEventHandler(func)) +#define EVT_TEXT_COPY(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_TEXT_COPY, winid, wxClipboardTextEventHandler(func)) +#define EVT_TEXT_PASTE(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_TEXT_PASTE, winid, wxClipboardTextEventHandler(func)) + +// ---------------------------------------------------------------------------- +// Global data +// ---------------------------------------------------------------------------- + +// for pending event processing - notice that there is intentionally no +// WXDLLEXPORT here +extern WXDLLIMPEXP_BASE wxList *wxPendingEvents; +#if wxUSE_THREADS + extern WXDLLIMPEXP_BASE wxCriticalSection *wxPendingEventsLocker; +#endif + +// ---------------------------------------------------------------------------- +// Helper functions +// ---------------------------------------------------------------------------- + +#if wxUSE_GUI + +// Find a window with the focus, that is also a descendant of the given window. +// This is used to determine the window to initially send commands to. +WXDLLIMPEXP_CORE wxWindow* wxFindFocusDescendant(wxWindow* ancestor); + +#endif // wxUSE_GUI + +#endif // _WX_EVENT_H__ diff --git a/Externals/wxWidgets/include/wx/evtloop.h b/Externals/wxWidgets/include/wx/evtloop.h new file mode 100644 index 0000000000..8c04bed5da --- /dev/null +++ b/Externals/wxWidgets/include/wx/evtloop.h @@ -0,0 +1,201 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/evtloop.h +// Purpose: declares wxEventLoop class +// Author: Vadim Zeitlin +// Modified by: +// Created: 01.06.01 +// RCS-ID: $Id: evtloop.h 40865 2006-08-27 09:42:42Z VS $ +// Copyright: (c) 2001 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_EVTLOOP_H_ +#define _WX_EVTLOOP_H_ + +#include "wx/utils.h" + +class WXDLLEXPORT wxEventLoop; + +// ---------------------------------------------------------------------------- +// wxEventLoop: a GUI event loop +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxEventLoopBase +{ +public: + // trivial, but needed (because of wxEventLoopBase) ctor + wxEventLoopBase() { } + + // dtor + virtual ~wxEventLoopBase() { } + + // start the event loop, return the exit code when it is finished + virtual int Run() = 0; + + // exit from the loop with the given exit code + virtual void Exit(int rc = 0) = 0; + + // return true if any events are available + virtual bool Pending() const = 0; + + // dispatch a single event, return false if we should exit from the loop + virtual bool Dispatch() = 0; + + // return currently active (running) event loop, may be NULL + static wxEventLoop *GetActive() { return ms_activeLoop; } + + // set currently active (running) event loop + static void SetActive(wxEventLoop* loop) { ms_activeLoop = loop; } + + // is this event loop running now? + // + // notice that even if this event loop hasn't terminated yet but has just + // spawned a nested (e.g. modal) event loop, this would return false + bool IsRunning() const; + +protected: + // this function should be called before the event loop terminates, whether + // this happens normally (because of Exit() call) or abnormally (because of + // an exception thrown from inside the loop) + virtual void OnExit() { } + + + // the pointer to currently active loop + static wxEventLoop *ms_activeLoop; + + DECLARE_NO_COPY_CLASS(wxEventLoopBase) +}; + +#if defined(__WXMSW__) || defined(__WXMAC__) || defined(__WXDFB__) + +// this class can be used to implement a standard event loop logic using +// Pending() and Dispatch() +// +// it also handles idle processing automatically +class WXDLLEXPORT wxEventLoopManual : public wxEventLoopBase +{ +public: + wxEventLoopManual(); + + // enters a loop calling OnNextIteration(), Pending() and Dispatch() and + // terminating when Exit() is called + virtual int Run(); + + // sets the "should exit" flag and wakes up the loop so that it terminates + // soon + virtual void Exit(int rc = 0); + +protected: + // implement this to wake up the loop: usually done by posting a dummy event + // to it (called from Exit()) + virtual void WakeUp() = 0; + + // may be overridden to perform some action at the start of each new event + // loop iteration + virtual void OnNextIteration() { } + + + // the loop exit code + int m_exitcode; + + // should we exit the loop? + bool m_shouldExit; +}; + +#endif // platforms using "manual" loop + +// we're moving away from old m_impl wxEventLoop model as otherwise the user +// code doesn't have access to platform-specific wxEventLoop methods and this +// can sometimes be very useful (e.g. under MSW this is necessary for +// integration with MFC) but currently this is done for MSW only, other ports +// should follow a.s.a.p. +#if defined(__WXPALMOS__) + #include "wx/palmos/evtloop.h" +#elif defined(__WXMSW__) + #include "wx/msw/evtloop.h" +#elif defined(__WXMAC__) + #include "wx/mac/evtloop.h" +#elif defined(__WXDFB__) + #include "wx/dfb/evtloop.h" +#else // other platform + +class WXDLLEXPORT wxEventLoopImpl; + +class WXDLLEXPORT wxEventLoop : public wxEventLoopBase +{ +public: + wxEventLoop() { m_impl = NULL; } + virtual ~wxEventLoop(); + + virtual int Run(); + virtual void Exit(int rc = 0); + virtual bool Pending() const; + virtual bool Dispatch(); + +protected: + // the pointer to the port specific implementation class + wxEventLoopImpl *m_impl; + + DECLARE_NO_COPY_CLASS(wxEventLoop) +}; + +#endif // platforms + +inline bool wxEventLoopBase::IsRunning() const { return GetActive() == this; } + +// ---------------------------------------------------------------------------- +// wxModalEventLoop +// ---------------------------------------------------------------------------- + +// this is a naive generic implementation which uses wxWindowDisabler to +// implement modality, we will surely need platform-specific implementations +// too, this generic implementation is here only temporarily to see how it +// works +class WXDLLEXPORT wxModalEventLoop : public wxEventLoop +{ +public: + wxModalEventLoop(wxWindow *winModal) + { + m_windowDisabler = new wxWindowDisabler(winModal); + } + +protected: + virtual void OnExit() + { + delete m_windowDisabler; + m_windowDisabler = NULL; + + wxEventLoop::OnExit(); + } + +private: + wxWindowDisabler *m_windowDisabler; +}; + +// ---------------------------------------------------------------------------- +// wxEventLoopActivator: helper class for wxEventLoop implementations +// ---------------------------------------------------------------------------- + +// this object sets the wxEventLoop given to the ctor as the currently active +// one and unsets it in its dtor, this is especially useful in presence of +// exceptions but is more tidy even when we don't use them +class wxEventLoopActivator +{ +public: + wxEventLoopActivator(wxEventLoop *evtLoop) + { + m_evtLoopOld = wxEventLoop::GetActive(); + wxEventLoop::SetActive(evtLoop); + } + + ~wxEventLoopActivator() + { + // restore the previously active event loop + wxEventLoop::SetActive(m_evtLoopOld); + } + +private: + wxEventLoop *m_evtLoopOld; +}; + +#endif // _WX_EVTLOOP_H_ diff --git a/Externals/wxWidgets/include/wx/except.h b/Externals/wxWidgets/include/wx/except.h new file mode 100644 index 0000000000..f6310a57f5 --- /dev/null +++ b/Externals/wxWidgets/include/wx/except.h @@ -0,0 +1,30 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/except.h +// Purpose: C++ exception related stuff +// Author: Vadim Zeitlin +// Modified by: +// Created: 17.09.2003 +// RCS-ID: $Id: except.h 27408 2004-05-23 20:53:33Z JS $ +// Copyright: (c) 2003 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_EXCEPT_H_ +#define _WX_EXCEPT_H_ + +#include "wx/defs.h" + +// ---------------------------------------------------------------------------- +// macros working whether wxUSE_EXCEPTIONS is 0 or 1 +// ---------------------------------------------------------------------------- + +#if wxUSE_EXCEPTIONS + #define wxTRY try + #define wxCATCH_ALL(code) catch ( ... ) { code } +#else // !wxUSE_EXCEPTIONS + #define wxTRY + #define wxCATCH_ALL(code) +#endif // wxUSE_EXCEPTIONS/!wxUSE_EXCEPTIONS + +#endif // _WX_EXCEPT_H_ + diff --git a/Externals/wxWidgets/include/wx/fdrepdlg.h b/Externals/wxWidgets/include/wx/fdrepdlg.h new file mode 100644 index 0000000000..822ec2b7f0 --- /dev/null +++ b/Externals/wxWidgets/include/wx/fdrepdlg.h @@ -0,0 +1,195 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/fdrepdlg.h +// Purpose: wxFindReplaceDialog class +// Author: Markus Greither and Vadim Zeitlin +// Modified by: +// Created: 23/03/2001 +// RCS-ID: +// Copyright: (c) Markus Greither +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_FINDREPLACEDLG_H_ +#define _WX_FINDREPLACEDLG_H_ + +#include "wx/defs.h" + +#if wxUSE_FINDREPLDLG + +#include "wx/dialog.h" + +class WXDLLEXPORT wxFindDialogEvent; +class WXDLLEXPORT wxFindReplaceDialog; +class WXDLLEXPORT wxFindReplaceData; +class WXDLLEXPORT wxFindReplaceDialogImpl; + +// ---------------------------------------------------------------------------- +// Flags for wxFindReplaceData.Flags +// ---------------------------------------------------------------------------- + +// flages used by wxFindDialogEvent::GetFlags() +enum wxFindReplaceFlags +{ + // downward search/replace selected (otherwise - upwards) + wxFR_DOWN = 1, + + // whole word search/replace selected + wxFR_WHOLEWORD = 2, + + // case sensitive search/replace selected (otherwise - case insensitive) + wxFR_MATCHCASE = 4 +}; + +// these flags can be specified in wxFindReplaceDialog ctor or Create() +enum wxFindReplaceDialogStyles +{ + // replace dialog (otherwise find dialog) + wxFR_REPLACEDIALOG = 1, + + // don't allow changing the search direction + wxFR_NOUPDOWN = 2, + + // don't allow case sensitive searching + wxFR_NOMATCHCASE = 4, + + // don't allow whole word searching + wxFR_NOWHOLEWORD = 8 +}; + +// ---------------------------------------------------------------------------- +// wxFindReplaceData: holds Setup Data/Feedback Data for wxFindReplaceDialog +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxFindReplaceData : public wxObject +{ +public: + wxFindReplaceData() { Init(); } + wxFindReplaceData(wxUint32 flags) { Init(); SetFlags(flags); } + + // accessors + const wxString& GetFindString() { return m_FindWhat; } + const wxString& GetReplaceString() { return m_ReplaceWith; } + + int GetFlags() const { return m_Flags; } + + // setters: may only be called before showing the dialog, no effect later + void SetFlags(wxUint32 flags) { m_Flags = flags; } + + void SetFindString(const wxString& str) { m_FindWhat = str; } + void SetReplaceString(const wxString& str) { m_ReplaceWith = str; } + +protected: + void Init(); + +private: + wxUint32 m_Flags; + wxString m_FindWhat, + m_ReplaceWith; + + friend class wxFindReplaceDialogBase; +}; + +// ---------------------------------------------------------------------------- +// wxFindReplaceDialogBase +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxFindReplaceDialogBase : public wxDialog +{ +public: + // ctors and such + wxFindReplaceDialogBase() { m_FindReplaceData = NULL; } + wxFindReplaceDialogBase(wxWindow * WXUNUSED(parent), + wxFindReplaceData *data, + const wxString& WXUNUSED(title), + int WXUNUSED(style) = 0) + { + m_FindReplaceData = data; + } + + virtual ~wxFindReplaceDialogBase(); + + // find dialog data access + const wxFindReplaceData *GetData() const { return m_FindReplaceData; } + void SetData(wxFindReplaceData *data) { m_FindReplaceData = data; } + + // implementation only, don't use + void Send(wxFindDialogEvent& event); + +protected: + wxFindReplaceData *m_FindReplaceData; + + // the last string we searched for + wxString m_lastSearch; + + DECLARE_NO_COPY_CLASS(wxFindReplaceDialogBase) +}; + +// include wxFindReplaceDialog declaration +#if defined(__WXMSW__) && !defined(__WXUNIVERSAL__) && !defined(__WXWINCE__) + #include "wx/msw/fdrepdlg.h" +#else + #define wxGenericFindReplaceDialog wxFindReplaceDialog + + #include "wx/generic/fdrepdlg.h" +#endif + +// ---------------------------------------------------------------------------- +// wxFindReplaceDialog events +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxFindDialogEvent : public wxCommandEvent +{ +public: + wxFindDialogEvent(wxEventType commandType = wxEVT_NULL, int id = 0) + : wxCommandEvent(commandType, id) { } + + int GetFlags() const { return GetInt(); } + wxString GetFindString() const { return GetString(); } + const wxString& GetReplaceString() const { return m_strReplace; } + + wxFindReplaceDialog *GetDialog() const + { return wxStaticCast(GetEventObject(), wxFindReplaceDialog); } + + // implementation only + void SetFlags(int flags) { SetInt(flags); } + void SetFindString(const wxString& str) { SetString(str); } + void SetReplaceString(const wxString& str) { m_strReplace = str; } + +private: + wxString m_strReplace; + + DECLARE_DYNAMIC_CLASS_NO_COPY(wxFindDialogEvent) +}; + +BEGIN_DECLARE_EVENT_TYPES() + DECLARE_EVENT_TYPE(wxEVT_COMMAND_FIND, 510) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_FIND_NEXT, 511) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_FIND_REPLACE, 512) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_FIND_REPLACE_ALL, 513) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_FIND_CLOSE, 514) +END_DECLARE_EVENT_TYPES() + +typedef void (wxEvtHandler::*wxFindDialogEventFunction)(wxFindDialogEvent&); + +#define wxFindDialogEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxFindDialogEventFunction, &func) + +#define EVT_FIND(id, fn) \ + wx__DECLARE_EVT1(wxEVT_COMMAND_FIND, id, wxFindDialogEventHandler(fn)) + +#define EVT_FIND_NEXT(id, fn) \ + wx__DECLARE_EVT1(wxEVT_COMMAND_FIND_NEXT, id, wxFindDialogEventHandler(fn)) + +#define EVT_FIND_REPLACE(id, fn) \ + wx__DECLARE_EVT1(wxEVT_COMMAND_FIND_REPLACE, id, wxFindDialogEventHandler(fn)) + +#define EVT_FIND_REPLACE_ALL(id, fn) \ + wx__DECLARE_EVT1(wxEVT_COMMAND_FIND_REPLACE_ALL, id, wxFindDialogEventHandler(fn)) + +#define EVT_FIND_CLOSE(id, fn) \ + wx__DECLARE_EVT1(wxEVT_COMMAND_FIND_CLOSE, id, wxFindDialogEventHandler(fn)) + +#endif // wxUSE_FINDREPLDLG + +#endif + // _WX_FDREPDLG_H diff --git a/Externals/wxWidgets/include/wx/features.h b/Externals/wxWidgets/include/wx/features.h new file mode 100644 index 0000000000..953940a873 --- /dev/null +++ b/Externals/wxWidgets/include/wx/features.h @@ -0,0 +1,64 @@ +/** +* Name: wx/features.h +* Purpose: test macros for the features which might be available in some +* wxWidgets ports but not others +* Author: Vadim Zeitlin +* Modified by: Ryan Norton (Converted to C) +* Created: 18.03.02 +* RCS-ID: $Id: features.h 40865 2006-08-27 09:42:42Z VS $ +* Copyright: (c) 2002 Vadim Zeitlin +* Licence: wxWindows licence +*/ + +/* THIS IS A C FILE, DON'T USE C++ FEATURES (IN PARTICULAR COMMENTS) IN IT */ + +#ifndef _WX_FEATURES_H_ +#define _WX_FEATURES_H_ + +/* radio menu items are currently not implemented in wxMotif, use this + symbol (kept for compatibility from the time when they were not implemented + under other platforms as well) to test for this */ +#if !defined(__WXMOTIF__) + #define wxHAS_RADIO_MENU_ITEMS +#else + #undef wxHAS_RADIO_MENU_ITEMS +#endif + +/* the raw keyboard codes are generated under wxGTK and wxMSW only */ +#if defined(__WXGTK__) || defined(__WXMSW__) || defined(__WXMAC__) \ + || defined(__WXDFB__) + #define wxHAS_RAW_KEY_CODES +#else + #undef wxHAS_RAW_KEY_CODES +#endif + +/* taskbar is implemented in the major ports */ +#if defined(__WXMSW__) || defined(__WXCOCOA__) \ + || defined(__WXGTK__) || defined(__WXMOTIF__) || defined(__WXX11__) \ + || defined(__WXMAC_OSX__) || defined(__WXCOCOA__) + #define wxHAS_TASK_BAR_ICON +#else + #undef wxHAS_TASK_BAR_ICON +#endif + +/* wxIconLocation appeared in the middle of 2.5.0 so it's handy to have a */ +/* separate define for it */ +#define wxHAS_ICON_LOCATION + +/* same for wxCrashReport */ +#ifdef __WXMSW__ + #define wxHAS_CRASH_REPORT +#else + #undef wxHAS_CRASH_REPORT +#endif + +/* wxRE_ADVANCED is not always available, depending on regex library used + * (it's unavailable only if compiling via configure against system library) */ +#ifndef WX_NO_REGEX_ADVANCED + #define wxHAS_REGEX_ADVANCED +#else + #undef wxHAS_REGEX_ADVANCED +#endif + +#endif /* _WX_FEATURES_H_ */ + diff --git a/Externals/wxWidgets/include/wx/ffile.h b/Externals/wxWidgets/include/wx/ffile.h new file mode 100644 index 0000000000..5a2d3e5bcd --- /dev/null +++ b/Externals/wxWidgets/include/wx/ffile.h @@ -0,0 +1,115 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/ffile.h +// Purpose: wxFFile - encapsulates "FILE *" stream +// Author: Vadim Zeitlin +// Modified by: +// Created: 14.07.99 +// RCS-ID: $Id: ffile.h 38570 2006-04-05 14:37:47Z VZ $ +// Copyright: (c) 1998 Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_FFILE_H_ +#define _WX_FFILE_H_ + +#include "wx/defs.h" // for wxUSE_FFILE + +#if wxUSE_FFILE + +#include "wx/string.h" +#include "wx/filefn.h" +#include "wx/convauto.h" + +#include + +// ---------------------------------------------------------------------------- +// class wxFFile: standard C stream library IO +// +// NB: for space efficiency this class has no virtual functions, including +// dtor which is _not_ virtual, so it shouldn't be used as a base class. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxFFile +{ +public: + // ctors + // ----- + // def ctor + wxFFile() { m_fp = NULL; } + // open specified file (may fail, use IsOpened()) + wxFFile(const wxChar *filename, const wxChar *mode = _T("r")); + // attach to (already opened) file + wxFFile(FILE *lfp) { m_fp = lfp; } + + // open/close + // open a file (existing or not - the mode controls what happens) + bool Open(const wxChar *filename, const wxChar *mode = _T("r")); + // closes the opened file (this is a NOP if not opened) + bool Close(); + + // assign an existing file descriptor and get it back from wxFFile object + void Attach(FILE *lfp, const wxString& name = wxEmptyString) + { Close(); m_fp = lfp; m_name = name; } + void Detach() { m_fp = NULL; } + FILE *fp() const { return m_fp; } + + // read/write (unbuffered) + // read all data from the file into a string (useful for text files) + bool ReadAll(wxString *str, const wxMBConv& conv = wxConvAuto()); + // returns number of bytes read - use Eof() and Error() to see if an error + // occurred or not + size_t Read(void *pBuf, size_t nCount); + // returns the number of bytes written + size_t Write(const void *pBuf, size_t nCount); + // returns true on success + bool Write(const wxString& s, const wxMBConv& conv = wxConvAuto()) + { + const wxWX2MBbuf buf = s.mb_str(conv); + size_t size = strlen(buf); + return Write((const char *)buf, size) == size; + } + // flush data not yet written + bool Flush(); + + // file pointer operations (return ofsInvalid on failure) + // move ptr ofs bytes related to start/current pos/end of file + bool Seek(wxFileOffset ofs, wxSeekMode mode = wxFromStart); + // move ptr to ofs bytes before the end + bool SeekEnd(wxFileOffset ofs = 0) { return Seek(ofs, wxFromEnd); } + // get current position in the file + wxFileOffset Tell() const; + // get current file length + wxFileOffset Length() const; + + // simple accessors: note that Eof() and Error() may only be called if + // IsOpened()! + // is file opened? + bool IsOpened() const { return m_fp != NULL; } + // is end of file reached? + bool Eof() const { return feof(m_fp) != 0; } + // has an error occurred? + bool Error() const { return ferror(m_fp) != 0; } + // get the file name + const wxString& GetName() const { return m_name; } + // type such as disk or pipe + wxFileKind GetKind() const { return wxGetFileKind(m_fp); } + + // dtor closes the file if opened + ~wxFFile() { Close(); } + +private: + // copy ctor and assignment operator are private because it doesn't make + // sense to copy files this way: attempt to do it will provoke a compile-time + // error. + wxFFile(const wxFFile&); + wxFFile& operator=(const wxFFile&); + + FILE *m_fp; // IO stream or NULL if not opened + + wxString m_name; // the name of the file (for diagnostic messages) +}; + +#endif // wxUSE_FFILE + +#endif // _WX_FFILE_H_ + diff --git a/Externals/wxWidgets/include/wx/file.h b/Externals/wxWidgets/include/wx/file.h new file mode 100644 index 0000000000..a2ccd4223d --- /dev/null +++ b/Externals/wxWidgets/include/wx/file.h @@ -0,0 +1,201 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: file.h +// Purpose: wxFile - encapsulates low-level "file descriptor" +// wxTempFile - safely replace the old file +// Author: Vadim Zeitlin +// Modified by: +// Created: 29/01/98 +// RCS-ID: $Id: file.h 46331 2007-06-05 13:16:11Z JS $ +// Copyright: (c) 1998 Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_FILEH__ +#define _WX_FILEH__ + +#include "wx/defs.h" + +#if wxUSE_FILE + +#include "wx/string.h" +#include "wx/filefn.h" +#include "wx/strconv.h" + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// we redefine these constants here because S_IREAD &c are _not_ standard +// however, we do assume that the values correspond to the Unix umask bits +#define wxS_IRUSR 00400 +#define wxS_IWUSR 00200 +#define wxS_IXUSR 00100 + +#define wxS_IRGRP 00040 +#define wxS_IWGRP 00020 +#define wxS_IXGRP 00010 + +#define wxS_IROTH 00004 +#define wxS_IWOTH 00002 +#define wxS_IXOTH 00001 + +// default mode for the new files: corresponds to umask 022 +#define wxS_DEFAULT (wxS_IRUSR | wxS_IWUSR | wxS_IRGRP | wxS_IWGRP |\ + wxS_IROTH | wxS_IWOTH) + +// ---------------------------------------------------------------------------- +// class wxFile: raw file IO +// +// NB: for space efficiency this class has no virtual functions, including +// dtor which is _not_ virtual, so it shouldn't be used as a base class. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxFile +{ +public: + // more file constants + // ------------------- + // opening mode + enum OpenMode { read, write, read_write, write_append, write_excl }; + // standard values for file descriptor + enum { fd_invalid = -1, fd_stdin, fd_stdout, fd_stderr }; + + // static functions + // ---------------- + // check whether a regular file by this name exists + static bool Exists(const wxChar *name); + // check whether we can access the given file in given mode + // (only read and write make sense here) + static bool Access(const wxChar *name, OpenMode mode); + + // ctors + // ----- + // def ctor + wxFile() { m_fd = fd_invalid; m_error = false; } + // open specified file (may fail, use IsOpened()) + wxFile(const wxChar *szFileName, OpenMode mode = read); + // attach to (already opened) file + wxFile(int lfd) { m_fd = lfd; m_error = false; } + + // open/close + // create a new file (with the default value of bOverwrite, it will fail if + // the file already exists, otherwise it will overwrite it and succeed) + bool Create(const wxChar *szFileName, bool bOverwrite = false, + int access = wxS_DEFAULT); + bool Open(const wxChar *szFileName, OpenMode mode = read, + int access = wxS_DEFAULT); + bool Close(); // Close is a NOP if not opened + + // assign an existing file descriptor and get it back from wxFile object + void Attach(int lfd) { Close(); m_fd = lfd; m_error = false; } + void Detach() { m_fd = fd_invalid; } + int fd() const { return m_fd; } + + // read/write (unbuffered) + // returns number of bytes read or wxInvalidOffset on error + ssize_t Read(void *pBuf, size_t nCount); + // returns the number of bytes written + size_t Write(const void *pBuf, size_t nCount); + // returns true on success + bool Write(const wxString& s, const wxMBConv& conv = wxConvUTF8) + { + const wxWX2MBbuf buf = s.mb_str(conv); + if (!buf) + return false; + size_t size = strlen(buf); + return Write((const char *) buf, size) == size; + } + // flush data not yet written + bool Flush(); + + // file pointer operations (return wxInvalidOffset on failure) + // move ptr ofs bytes related to start/current offset/end of file + wxFileOffset Seek(wxFileOffset ofs, wxSeekMode mode = wxFromStart); + // move ptr to ofs bytes before the end + wxFileOffset SeekEnd(wxFileOffset ofs = 0) { return Seek(ofs, wxFromEnd); } + // get current offset + wxFileOffset Tell() const; + // get current file length + wxFileOffset Length() const; + + // simple accessors + // is file opened? + bool IsOpened() const { return m_fd != fd_invalid; } + // is end of file reached? + bool Eof() const; + // has an error occurred? + bool Error() const { return m_error; } + // type such as disk or pipe + wxFileKind GetKind() const { return wxGetFileKind(m_fd); } + + // dtor closes the file if opened + ~wxFile() { Close(); } + +private: + // copy ctor and assignment operator are private because + // it doesn't make sense to copy files this way: + // attempt to do it will provoke a compile-time error. + wxFile(const wxFile&); + wxFile& operator=(const wxFile&); + + int m_fd; // file descriptor or INVALID_FD if not opened + bool m_error; // error memory +}; + +// ---------------------------------------------------------------------------- +// class wxTempFile: if you want to replace another file, create an instance +// of wxTempFile passing the name of the file to be replaced to the ctor. Then +// you can write to wxTempFile and call Commit() function to replace the old +// file (and close this one) or call Discard() to cancel the modification. If +// you call neither of them, dtor will call Discard(). +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxTempFile +{ +public: + // ctors + // default + wxTempFile() { } + // associates the temp file with the file to be replaced and opens it + wxTempFile(const wxString& strName); + + // open the temp file (strName is the name of file to be replaced) + bool Open(const wxString& strName); + + // is the file opened? + bool IsOpened() const { return m_file.IsOpened(); } + // get current file length + wxFileOffset Length() const { return m_file.Length(); } + // move ptr ofs bytes related to start/current offset/end of file + wxFileOffset Seek(wxFileOffset ofs, wxSeekMode mode = wxFromStart) + { return m_file.Seek(ofs, mode); } + // get current offset + wxFileOffset Tell() const { return m_file.Tell(); } + + // I/O (both functions return true on success, false on failure) + bool Write(const void *p, size_t n) { return m_file.Write(p, n) == n; } + bool Write(const wxString& str, const wxMBConv& conv = wxConvUTF8) + { return m_file.Write(str, conv); } + + // different ways to close the file + // validate changes and delete the old file of name m_strName + bool Commit(); + // discard changes + void Discard(); + + // dtor calls Discard() if file is still opened + ~wxTempFile(); + +private: + // no copy ctor/assignment operator + wxTempFile(const wxTempFile&); + wxTempFile& operator=(const wxTempFile&); + + wxString m_strName, // name of the file to replace in Commit() + m_strTemp; // temporary file name + wxFile m_file; // the temporary file +}; + +#endif // wxUSE_FILE + +#endif // _WX_FILEH__ diff --git a/Externals/wxWidgets/include/wx/fileconf.h b/Externals/wxWidgets/include/wx/fileconf.h new file mode 100644 index 0000000000..eae7039f7c --- /dev/null +++ b/Externals/wxWidgets/include/wx/fileconf.h @@ -0,0 +1,246 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/fileconf.h +// Purpose: wxFileConfig derivation of wxConfigBase +// Author: Vadim Zeitlin +// Modified by: +// Created: 07.04.98 (adapted from appconf.cpp) +// RCS-ID: $Id: fileconf.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) 1997 Karsten Ballüder & Vadim Zeitlin +// Ballueder@usa.net +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _FILECONF_H +#define _FILECONF_H + +#include "wx/defs.h" + +#if wxUSE_CONFIG + +#include "wx/textfile.h" +#include "wx/string.h" +#include "wx/confbase.h" + +// ---------------------------------------------------------------------------- +// wxFileConfig +// ---------------------------------------------------------------------------- + +/* + wxFileConfig derives from base Config and implements file based config class, + i.e. it uses ASCII disk files to store the information. These files are + alternatively called INI, .conf or .rc in the documentation. They are + organized in groups or sections, which can nest (i.e. a group contains + subgroups, which contain their own subgroups &c). Each group has some + number of entries, which are "key = value" pairs. More precisely, the format + is: + + # comments are allowed after either ';' or '#' (Win/UNIX standard) + + # blank lines (as above) are ignored + + # global entries are members of special (no name) top group + written_for = Windows + platform = Linux + + # the start of the group 'Foo' + [Foo] # may put comments like this also + # following 3 lines are entries + key = value + another_key = " strings with spaces in the beginning should be quoted, \ + otherwise the spaces are lost" + last_key = but you don't have to put " normally (nor quote them, like here) + + # subgroup of the group 'Foo' + # (order is not important, only the name is: separator is '/', as in paths) + [Foo/Bar] + # entries prefixed with "!" are immutable, i.e. can't be changed if they are + # set in the system-wide config file + !special_key = value + bar_entry = whatever + + [Foo/Bar/Fubar] # depth is (theoretically :-) unlimited + # may have the same name as key in another section + bar_entry = whatever not + + You have {read/write/delete}Entry functions (guess what they do) and also + setCurrentPath to select current group. enum{Subgroups/Entries} allow you + to get all entries in the config file (in the current group). Finally, + flush() writes immediately all changed entries to disk (otherwise it would + be done automatically in dtor) + + wxFileConfig manages not less than 2 config files for each program: global + and local (or system and user if you prefer). Entries are read from both of + them and the local entries override the global ones unless the latter is + immutable (prefixed with '!') in which case a warning message is generated + and local value is ignored. Of course, the changes are always written to local + file only. + + The names of these files can be specified in a number of ways. First of all, + you can use the standard convention: using the ctor which takes 'strAppName' + parameter will probably be sufficient for 90% of cases. If, for whatever + reason you wish to use the files with some other names, you can always use the + second ctor. + + wxFileConfig also may automatically expand the values of environment variables + in the entries it reads: for example, if you have an entry + score_file = $HOME/.score + a call to Read(&str, "score_file") will return a complete path to .score file + unless the expansion was previously disabled with SetExpandEnvVars(false) call + (it's on by default, the current status can be retrieved with + IsExpandingEnvVars function). +*/ +class WXDLLIMPEXP_FWD_BASE wxFileConfigGroup; +class WXDLLIMPEXP_FWD_BASE wxFileConfigEntry; +class WXDLLIMPEXP_FWD_BASE wxFileConfigLineList; + +#if wxUSE_STREAMS +class WXDLLIMPEXP_FWD_BASE wxInputStream; +class WXDLLIMPEXP_FWD_BASE wxOutputStream; +#endif // wxUSE_STREAMS + +class WXDLLIMPEXP_BASE wxFileConfig : public wxConfigBase +{ +public: + // construct the "standard" full name for global (system-wide) and + // local (user-specific) config files from the base file name. + // + // the following are the filenames returned by this functions: + // global local + // Unix /etc/file.ext ~/.file + // Win %windir%\file.ext %USERPROFILE%\file.ext + // + // where file is the basename of szFile, ext is its extension + // or .conf (Unix) or .ini (Win) if it has none + static wxString GetGlobalFileName(const wxChar *szFile); + static wxString GetLocalFileName(const wxChar *szFile); + + // ctor & dtor + // New constructor: one size fits all. Specify wxCONFIG_USE_LOCAL_FILE or + // wxCONFIG_USE_GLOBAL_FILE to say which files should be used. + wxFileConfig(const wxString& appName = wxEmptyString, + const wxString& vendorName = wxEmptyString, + const wxString& localFilename = wxEmptyString, + const wxString& globalFilename = wxEmptyString, + long style = wxCONFIG_USE_LOCAL_FILE | wxCONFIG_USE_GLOBAL_FILE, + const wxMBConv& conv = wxConvAuto()); + +#if wxUSE_STREAMS + // ctor that takes an input stream. + wxFileConfig(wxInputStream &inStream, const wxMBConv& conv = wxConvAuto()); +#endif // wxUSE_STREAMS + + // dtor will save unsaved data + virtual ~wxFileConfig(); + + // under Unix, set the umask to be used for the file creation, do nothing + // under other systems +#ifdef __UNIX__ + void SetUmask(int mode) { m_umask = mode; } +#else // !__UNIX__ + void SetUmask(int WXUNUSED(mode)) { } +#endif // __UNIX__/!__UNIX__ + + // implement inherited pure virtual functions + virtual void SetPath(const wxString& strPath); + virtual const wxString& GetPath() const { return m_strPath; } + + virtual bool GetFirstGroup(wxString& str, long& lIndex) const; + virtual bool GetNextGroup (wxString& str, long& lIndex) const; + virtual bool GetFirstEntry(wxString& str, long& lIndex) const; + virtual bool GetNextEntry (wxString& str, long& lIndex) const; + + virtual size_t GetNumberOfEntries(bool bRecursive = false) const; + virtual size_t GetNumberOfGroups(bool bRecursive = false) const; + + virtual bool HasGroup(const wxString& strName) const; + virtual bool HasEntry(const wxString& strName) const; + + virtual bool Flush(bool bCurrentOnly = false); + + virtual bool RenameEntry(const wxString& oldName, const wxString& newName); + virtual bool RenameGroup(const wxString& oldName, const wxString& newName); + + virtual bool DeleteEntry(const wxString& key, bool bGroupIfEmptyAlso = true); + virtual bool DeleteGroup(const wxString& szKey); + virtual bool DeleteAll(); + + // additional, wxFileConfig-specific, functionality +#if wxUSE_STREAMS + // save the entire config file text to the given stream, note that the text + // won't be saved again in dtor when Flush() is called if you use this method + // as it won't be "changed" any more + virtual bool Save(wxOutputStream& os, const wxMBConv& conv = wxConvAuto()); +#endif // wxUSE_STREAMS + +public: + // functions to work with this list + wxFileConfigLineList *LineListAppend(const wxString& str); + wxFileConfigLineList *LineListInsert(const wxString& str, + wxFileConfigLineList *pLine); // NULL => Prepend() + void LineListRemove(wxFileConfigLineList *pLine); + bool LineListIsEmpty(); + +protected: + virtual bool DoReadString(const wxString& key, wxString *pStr) const; + virtual bool DoReadLong(const wxString& key, long *pl) const; + + virtual bool DoWriteString(const wxString& key, const wxString& szValue); + virtual bool DoWriteLong(const wxString& key, long lValue); + +private: + // GetXXXFileName helpers: return ('/' terminated) directory names + static wxString GetGlobalDir(); + static wxString GetLocalDir(); + + // common part of all ctors (assumes that m_str{Local|Global}File are already + // initialized + void Init(); + + // common part of from dtor and DeleteAll + void CleanUp(); + + // parse the whole file + void Parse(const wxTextBuffer& buffer, bool bLocal); + + // the same as SetPath("/") + void SetRootPath(); + + // real SetPath() implementation, returns true if path could be set or false + // if path doesn't exist and createMissingComponents == false + bool DoSetPath(const wxString& strPath, bool createMissingComponents); + + // set/test the dirty flag + void SetDirty() { m_isDirty = true; } + void ResetDirty() { m_isDirty = false; } + bool IsDirty() const { return m_isDirty; } + + + // member variables + // ---------------- + wxFileConfigLineList *m_linesHead, // head of the linked list + *m_linesTail; // tail + + wxString m_strLocalFile, // local file name passed to ctor + m_strGlobalFile; // global + wxString m_strPath; // current path (not '/' terminated) + + wxFileConfigGroup *m_pRootGroup, // the top (unnamed) group + *m_pCurrentGroup; // the current group + + wxMBConv *m_conv; + +#ifdef __UNIX__ + int m_umask; // the umask to use for file creation +#endif // __UNIX__ + + bool m_isDirty; // if true, we have unsaved changes + + DECLARE_NO_COPY_CLASS(wxFileConfig) +}; + +#endif + // wxUSE_CONFIG + +#endif + //_FILECONF_H + diff --git a/Externals/wxWidgets/include/wx/filedlg.h b/Externals/wxWidgets/include/wx/filedlg.h new file mode 100644 index 0000000000..0e247b358f --- /dev/null +++ b/Externals/wxWidgets/include/wx/filedlg.h @@ -0,0 +1,226 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/filedlg.h +// Purpose: wxFileDialog base header +// Author: Robert Roebling +// Modified by: +// Created: 8/17/99 +// Copyright: (c) Robert Roebling +// RCS-ID: $Id: filedlg.h 44027 2006-12-21 19:26:48Z VZ $ +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_FILEDLG_H_BASE_ +#define _WX_FILEDLG_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_FILEDLG + +#include "wx/dialog.h" +#include "wx/arrstr.h" + +//---------------------------------------------------------------------------- +// wxFileDialog data +//---------------------------------------------------------------------------- + +/* + The flags below must coexist with the following flags in m_windowStyle + #define wxCAPTION 0x20000000 + #define wxMAXIMIZE 0x00002000 + #define wxCLOSE_BOX 0x00001000 + #define wxSYSTEM_MENU 0x00000800 + wxBORDER_NONE = 0x00200000 + #define wxRESIZE_BORDER 0x00000040 +*/ + +enum +{ + wxFD_OPEN = 0x0001, + wxFD_SAVE = 0x0002, + wxFD_OVERWRITE_PROMPT = 0x0004, + wxFD_FILE_MUST_EXIST = 0x0010, + wxFD_MULTIPLE = 0x0020, + wxFD_CHANGE_DIR = 0x0080, + wxFD_PREVIEW = 0x0100 +}; + +#if WXWIN_COMPATIBILITY_2_6 +enum +{ + wxOPEN = wxFD_OPEN, + wxSAVE = wxFD_SAVE, + wxOVERWRITE_PROMPT = wxFD_OVERWRITE_PROMPT, +#if WXWIN_COMPATIBILITY_2_4 + wxHIDE_READONLY = 0x0008, +#endif + wxFILE_MUST_EXIST = wxFD_FILE_MUST_EXIST, + wxMULTIPLE = wxFD_MULTIPLE, + wxCHANGE_DIR = wxFD_CHANGE_DIR +}; +#endif + +#define wxFD_DEFAULT_STYLE wxFD_OPEN + +extern WXDLLEXPORT_DATA(const wxChar) wxFileDialogNameStr[]; +extern WXDLLEXPORT_DATA(const wxChar) wxFileSelectorPromptStr[]; +extern WXDLLEXPORT_DATA(const wxChar) wxFileSelectorDefaultWildcardStr[]; + +//---------------------------------------------------------------------------- +// wxFileDialogBase +//---------------------------------------------------------------------------- + +class WXDLLEXPORT wxFileDialogBase: public wxDialog +{ +public: + wxFileDialogBase () { Init(); } + + wxFileDialogBase(wxWindow *parent, + const wxString& message = wxFileSelectorPromptStr, + const wxString& defaultDir = wxEmptyString, + const wxString& defaultFile = wxEmptyString, + const wxString& wildCard = wxFileSelectorDefaultWildcardStr, + long style = wxFD_DEFAULT_STYLE, + const wxPoint& pos = wxDefaultPosition, + const wxSize& sz = wxDefaultSize, + const wxString& name = wxFileDialogNameStr) + { + Init(); + Create(parent, message, defaultDir, defaultFile, wildCard, style, pos, sz, name); + } + + bool Create(wxWindow *parent, + const wxString& message = wxFileSelectorPromptStr, + const wxString& defaultDir = wxEmptyString, + const wxString& defaultFile = wxEmptyString, + const wxString& wildCard = wxFileSelectorDefaultWildcardStr, + long style = wxFD_DEFAULT_STYLE, + const wxPoint& pos = wxDefaultPosition, + const wxSize& sz = wxDefaultSize, + const wxString& name = wxFileDialogNameStr); + + bool HasFdFlag(int flag) const { return HasFlag(flag); } + + virtual void SetMessage(const wxString& message) { m_message = message; } + virtual void SetPath(const wxString& path) { m_path = path; } + virtual void SetDirectory(const wxString& dir) { m_dir = dir; } + virtual void SetFilename(const wxString& name) { m_fileName = name; } + virtual void SetWildcard(const wxString& wildCard) { m_wildCard = wildCard; } + virtual void SetFilterIndex(int filterIndex) { m_filterIndex = filterIndex; } + + virtual wxString GetMessage() const { return m_message; } + virtual wxString GetPath() const { return m_path; } + virtual void GetPaths(wxArrayString& paths) const { paths.Empty(); paths.Add(m_path); } + virtual wxString GetDirectory() const { return m_dir; } + virtual wxString GetFilename() const { return m_fileName; } + virtual void GetFilenames(wxArrayString& files) const { files.Empty(); files.Add(m_fileName); } + virtual wxString GetWildcard() const { return m_wildCard; } + virtual int GetFilterIndex() const { return m_filterIndex; } + + // Utility functions + +#if WXWIN_COMPATIBILITY_2_4 + // Parses the wildCard, returning the number of filters. + // Returns 0 if none or if there's a problem, + // The arrays will contain an equal number of items found before the error. + // wildCard is in the form: + // "All files (*)|*|Image Files (*.jpeg *.png)|*.jpg;*.png" + wxDEPRECATED( static int ParseWildcard(const wxString& wildCard, + wxArrayString& descriptions, + wxArrayString& filters) ); +#endif // WXWIN_COMPATIBILITY_2_4 + +#if WXWIN_COMPATIBILITY_2_6 + + wxDEPRECATED( long GetStyle() const ); + wxDEPRECATED( void SetStyle(long style) ); + +#endif // WXWIN_COMPATIBILITY_2_6 + + + // Append first extension to filePath from a ';' separated extensionList + // if filePath = "path/foo.bar" just return it as is + // if filePath = "foo[.]" and extensionList = "*.jpg;*.png" return "foo.jpg" + // if the extension is "*.j?g" (has wildcards) or "jpg" then return filePath + static wxString AppendExtension(const wxString &filePath, + const wxString &extensionList); + +protected: + wxString m_message; + wxString m_dir; + wxString m_path; // Full path + wxString m_fileName; + wxString m_wildCard; + int m_filterIndex; + +private: + void Init(); + DECLARE_DYNAMIC_CLASS(wxFileDialogBase) + DECLARE_NO_COPY_CLASS(wxFileDialogBase) +}; + +//---------------------------------------------------------------------------- +// wxFileDialog convenience functions +//---------------------------------------------------------------------------- + +// File selector - backward compatibility +WXDLLEXPORT wxString +wxFileSelector(const wxChar *message = wxFileSelectorPromptStr, + const wxChar *default_path = NULL, + const wxChar *default_filename = NULL, + const wxChar *default_extension = NULL, + const wxChar *wildcard = wxFileSelectorDefaultWildcardStr, + int flags = 0, + wxWindow *parent = NULL, + int x = wxDefaultCoord, int y = wxDefaultCoord); + +// An extended version of wxFileSelector +WXDLLEXPORT wxString +wxFileSelectorEx(const wxChar *message = wxFileSelectorPromptStr, + const wxChar *default_path = NULL, + const wxChar *default_filename = NULL, + int *indexDefaultExtension = NULL, + const wxChar *wildcard = wxFileSelectorDefaultWildcardStr, + int flags = 0, + wxWindow *parent = NULL, + int x = wxDefaultCoord, int y = wxDefaultCoord); + +// Ask for filename to load +WXDLLEXPORT wxString +wxLoadFileSelector(const wxChar *what, + const wxChar *extension, + const wxChar *default_name = (const wxChar *)NULL, + wxWindow *parent = (wxWindow *) NULL); + +// Ask for filename to save +WXDLLEXPORT wxString +wxSaveFileSelector(const wxChar *what, + const wxChar *extension, + const wxChar *default_name = (const wxChar *) NULL, + wxWindow *parent = (wxWindow *) NULL); + + +#if defined (__WXUNIVERSAL__) +#define wxUSE_GENERIC_FILEDIALOG +#include "wx/generic/filedlgg.h" +#elif defined(__WXMSW__) +#include "wx/msw/filedlg.h" +#elif defined(__WXMOTIF__) +#include "wx/motif/filedlg.h" +#elif defined(__WXGTK24__) +#include "wx/gtk/filedlg.h" // GTK+ > 2.4 has native version +#elif defined(__WXGTK20__) +#define wxUSE_GENERIC_FILEDIALOG +#include "wx/generic/filedlgg.h" +#elif defined(__WXGTK__) +#include "wx/gtk1/filedlg.h" +#elif defined(__WXMAC__) +#include "wx/mac/filedlg.h" +#elif defined(__WXCOCOA__) +#include "wx/cocoa/filedlg.h" +#elif defined(__WXPM__) +#include "wx/os2/filedlg.h" +#endif + +#endif // wxUSE_FILEDLG + +#endif // _WX_FILEDLG_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/filefn.h b/Externals/wxWidgets/include/wx/filefn.h new file mode 100644 index 0000000000..b0aa5acd88 --- /dev/null +++ b/Externals/wxWidgets/include/wx/filefn.h @@ -0,0 +1,731 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/filefn.h +// Purpose: File- and directory-related functions +// Author: Julian Smart +// Modified by: +// Created: 29/01/98 +// RCS-ID: $Id: filefn.h 49998 2007-11-16 17:19:37Z CE $ +// Copyright: (c) 1998 Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _FILEFN_H_ +#define _FILEFN_H_ + +#include "wx/list.h" +#include "wx/arrstr.h" + +#ifdef __WXWINCE__ + #include "wx/msw/wince/time.h" + #include "wx/msw/private.h" +#else + #include +#endif + +#ifdef __WXWINCE__ +// Nothing +#elif !defined(__MWERKS__) + #include + #include +#else + #ifdef __MACH__ + #include + #include + #include + #include + #else + #include + #include + #include + #endif +#endif + +#ifdef __OS2__ +// need to check for __OS2__ first since currently both +// __OS2__ and __UNIX__ are defined. + #include + #include "wx/os2/private.h" + #ifdef __WATCOMC__ + #include + #endif + #include + #ifdef __EMX__ + #include + #endif +#elif defined(__UNIX__) + #include + #include +#endif + +#if defined(__WINDOWS__) && !defined(__WXMICROWIN__) +#if !defined( __GNUWIN32__ ) && !defined( __MWERKS__ ) && !defined(__SALFORDC__) && !defined(__WXWINCE__) && !defined(__CYGWIN__) + #include + #include + #include +#endif // __WINDOWS__ +#endif // native Win compiler + +#if defined(__DOS__) + #ifdef __WATCOMC__ + #include + #include + #include + #endif + #ifdef __DJGPP__ + #include + #include + #endif +#endif + +#ifdef __BORLANDC__ // Please someone tell me which version of Borland needs + // this (3.1 I believe) and how to test for it. + // If this works for Borland 4.0 as well, then no worries. + #include +#endif + +#ifdef __SALFORDC__ + #include + #include +#endif + +#ifndef __WXWINCE__ + #include // O_RDONLY &c +#endif +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +#ifdef __WXWINCE__ + typedef long off_t; +#else + // define off_t + #if !defined(__WXMAC__) || defined(__UNIX__) || defined(__MACH__) + #include + #else + typedef long off_t; + #endif +#endif + +#if (defined(__VISUALC__) && !defined(__WXWINCE__)) || ( defined(__MWERKS__) && defined( __INTEL__) ) + typedef _off_t off_t; +#elif defined(__SYMANTEC__) + typedef long off_t; +#elif defined(__MWERKS__) && !defined(__INTEL__) && !defined(__MACH__) + typedef long off_t; +#endif + +enum wxSeekMode +{ + wxFromStart, + wxFromCurrent, + wxFromEnd +}; + +enum wxFileKind +{ + wxFILE_KIND_UNKNOWN, + wxFILE_KIND_DISK, // a file supporting seeking to arbitrary offsets + wxFILE_KIND_TERMINAL, // a tty + wxFILE_KIND_PIPE // a pipe +}; + +// ---------------------------------------------------------------------------- +// declare our versions of low level file functions: some compilers prepend +// underscores to the usual names, some also have Unicode versions of them +// ---------------------------------------------------------------------------- + +// Wrappers around Win32 api functions like CreateFile, ReadFile and such +// Implemented in filefnwce.cpp +#if defined( __WXWINCE__) + typedef __int64 wxFileOffset; + #define wxFileOffsetFmtSpec _("I64") + int wxOpen(const wxChar *filename, int oflag, int WXUNUSED(pmode)); + int wxAccess(const wxChar *name, int WXUNUSED(how)); + int wxClose(int fd); + int wxFsync(int WXUNUSED(fd)); + int wxRead(int fd, void *buf, unsigned int count); + int wxWrite(int fd, const void *buf, unsigned int count); + int wxEof(int fd); + wxFileOffset wxSeek(int fd, wxFileOffset offset, int origin); + #define wxLSeek wxSeek + wxFileOffset wxTell(int fd); + + // always Unicode under WinCE + #define wxMkDir _wmkdir + #define wxRmDir _wrmdir + #define wxStat _wstat + #define wxStructStat struct _stat +#elif (defined(__WXMSW__) || defined(__OS2__)) && !defined(__WXPALMOS__) && \ + ( \ + defined(__VISUALC__) || \ + (defined(__MINGW32__) && !defined(__WINE__) && \ + wxCHECK_W32API_VERSION(0, 5)) || \ + defined(__MWERKS__) || \ + defined(__DMC__) || \ + defined(__WATCOMC__) || \ + defined(__BORLANDC__) \ + ) + + #undef wxHAS_HUGE_FILES + + // detect compilers which have support for huge files + #if defined(__VISUALC__) + #define wxHAS_HUGE_FILES 1 + #elif defined(__MINGW32__) + #define wxHAS_HUGE_FILES 1 + #elif defined(_LARGE_FILES) + #define wxHAS_HUGE_FILES 1 + #endif + + // other Windows compilers (DMC, Watcom, Metrowerks and Borland) don't have + // huge file support (or at least not all functions needed for it by wx) + // currently + + #ifdef wxHAS_HUGE_FILES + typedef wxLongLong_t wxFileOffset; + #define wxFileOffsetFmtSpec wxLongLongFmtSpec + #else + typedef off_t wxFileOffset; + #endif + + + // functions + + // MSVC and compatible compilers prepend underscores to the POSIX function + // names, other compilers don't and even if their later versions usually do + // define the versions with underscores for MSVC compatibility, it's better + // to avoid using them as they're not present in earlier versions and + // always using the native functions spelling is easier than testing for + // the versions + #if defined(__BORLANDC__) || defined(__DMC__) || defined(__WATCOMC__) + #define wxPOSIX_IDENT(func) ::func + #else // by default assume MSVC-compatible names + #define wxPOSIX_IDENT(func) _ ## func + #define wxHAS_UNDERSCORES_IN_POSIX_IDENTS + #endif + + // at least Borland 5.5 doesn't like "struct ::stat" so don't use the scope + // resolution operator present in wxPOSIX_IDENT for it + #ifdef __BORLANDC__ + #define wxPOSIX_STRUCT(s) struct s + #else + #define wxPOSIX_STRUCT(s) struct wxPOSIX_IDENT(s) + #endif + + // first functions not working with strings, i.e. without ANSI/Unicode + // complications + #define wxClose wxPOSIX_IDENT(close) + + #if defined(__MWERKS__) + #if __MSL__ >= 0x6000 + #define wxRead(fd, buf, nCount) _read(fd, (void *)buf, nCount) + #define wxWrite(fd, buf, nCount) _write(fd, (void *)buf, nCount) + #else + #define wxRead(fd, buf, nCount)\ + _read(fd, (const char *)buf, nCount) + #define wxWrite(fd, buf, nCount)\ + _write(fd, (const char *)buf, nCount) + #endif + #else // __MWERKS__ + #define wxRead wxPOSIX_IDENT(read) + #define wxWrite wxPOSIX_IDENT(write) + #endif + + #ifdef wxHAS_HUGE_FILES + #define wxSeek wxPOSIX_IDENT(lseeki64) + #define wxLseek wxPOSIX_IDENT(lseeki64) + #define wxTell wxPOSIX_IDENT(telli64) + #else // !wxHAS_HUGE_FILES + #define wxSeek wxPOSIX_IDENT(lseek) + #define wxLseek wxPOSIX_IDENT(lseek) + #define wxTell wxPOSIX_IDENT(tell) + #endif // wxHAS_HUGE_FILES/!wxHAS_HUGE_FILES + + #ifndef __WATCOMC__ + #if !defined(__BORLANDC__) || (__BORLANDC__ > 0x540) + // NB: this one is not POSIX and always has the underscore + #define wxFsync _commit + + #define HAVE_FSYNC + #endif // BORLANDC + #endif + + #define wxEof wxPOSIX_IDENT(eof) + + // then the functions taking strings + #if wxUSE_UNICODE + #if wxUSE_UNICODE_MSLU + // implement the missing file functions in Win9x ourselves + #if defined( __VISUALC__ ) \ + || ( defined(__MINGW32__) && wxCHECK_W32API_VERSION( 0, 5 ) ) \ + || ( defined(__MWERKS__) && defined(__WXMSW__) ) \ + || ( defined(__BORLANDC__) && (__BORLANDC__ > 0x460) ) \ + || defined(__DMC__) + + WXDLLIMPEXP_BASE int wxMSLU__wopen(const wxChar *name, + int flags, int mode); + WXDLLIMPEXP_BASE int wxMSLU__waccess(const wxChar *name, + int mode); + WXDLLIMPEXP_BASE int wxMSLU__wmkdir(const wxChar *name); + WXDLLIMPEXP_BASE int wxMSLU__wrmdir(const wxChar *name); + + WXDLLIMPEXP_BASE int + wxMSLU__wstat(const wxChar *name, wxPOSIX_STRUCT(stat) *buffer); + WXDLLIMPEXP_BASE int + wxMSLU__wstati64(const wxChar *name, + wxPOSIX_STRUCT(stati64) *buffer); + #endif // Windows compilers with MSLU support + + #define wxOpen wxMSLU__wopen + + #define wxAccess wxMSLU__waccess + #define wxMkDir wxMSLU__wmkdir + #define wxRmDir wxMSLU__wrmdir + #ifdef wxHAS_HUGE_FILES + #define wxStat wxMSLU__wstati64 + #else + #define wxStat wxMSLU__wstat + #endif + #else // !wxUSE_UNICODE_MSLU + #ifdef __BORLANDC__ + #if __BORLANDC__ >= 0x550 && __BORLANDC__ <= 0x551 + WXDLLIMPEXP_BASE int wxOpen(const wxChar *pathname, + int flags, mode_t mode); + #else + #define wxOpen _wopen + #endif + #define wxAccess _waccess + #define wxMkDir _wmkdir + #define wxRmDir _wrmdir + #ifdef wxHAS_HUGE_FILES + #define wxStat _wstati64 + #else + #define wxStat _wstat + #endif + #else + #define wxOpen _wopen + #define wxAccess _waccess + #define wxMkDir _wmkdir + #define wxRmDir _wrmdir + #ifdef wxHAS_HUGE_FILES + #define wxStat _wstati64 + #else + #define wxStat _wstat + #endif + #endif + #endif // wxUSE_UNICODE_MSLU/!wxUSE_UNICODE_MSLU + #else // !wxUSE_UNICODE + #define wxOpen wxPOSIX_IDENT(open) + #define wxAccess wxPOSIX_IDENT(access) + #define wxMkDir wxPOSIX_IDENT(mkdir) + #define wxRmDir wxPOSIX_IDENT(rmdir) + #ifdef wxHAS_HUGE_FILES + #define wxStat wxPOSIX_IDENT(stati64) + #else + // Unfortunately Watcom is not consistent, so:- + #if defined(__OS2__) && defined(__WATCOMC__) + #define wxStat _stat + #else + #if defined (__BORLANDC__) + #define wxStat _stat //wxPOSIX_IDENT(stat) + #else + #define wxStat wxPOSIX_IDENT(stat) + #endif // !borland + #endif // !watcom + #endif + #endif // wxUSE_UNICODE/!wxUSE_UNICODE + + // Types: Notice that Watcom is the only compiler to have a wide char + // version of struct stat as well as a wide char stat function variant. + // This was droped since OW 1.4 "for consistency across platforms". + #ifdef wxHAS_HUGE_FILES + #if wxUSE_UNICODE && wxONLY_WATCOM_EARLIER_THAN(1,4) + #define wxStructStat struct _wstati64 + #else + #define wxStructStat struct _stati64 + #endif + #else + #if wxUSE_UNICODE && wxONLY_WATCOM_EARLIER_THAN(1,4) + #define wxStructStat struct _wstat + #else + #define wxStructStat struct _stat + #endif + #endif + + // constants (unless already defined by the user code) + #ifdef wxHAS_UNDERSCORES_IN_POSIX_IDENTS + #ifndef O_RDONLY + #define O_RDONLY _O_RDONLY + #define O_WRONLY _O_WRONLY + #define O_RDWR _O_RDWR + #define O_EXCL _O_EXCL + #define O_CREAT _O_CREAT + #define O_BINARY _O_BINARY + #endif + + #ifndef S_IFMT + #define S_IFMT _S_IFMT + #define S_IFDIR _S_IFDIR + #define S_IFREG _S_IFREG + #endif + #endif // wxHAS_UNDERSCORES_IN_POSIX_IDENTS + + #ifdef wxHAS_HUGE_FILES + // wxFile is present and supports large files. Currently wxFFile + // doesn't have large file support with any Windows compiler (even + // Win64 ones). + #if wxUSE_FILE + #define wxHAS_LARGE_FILES + #endif + #endif + + // it's a private define, undefine it so that nobody gets tempted to use it + #undef wxHAS_HUGE_FILES +#else // Unix or Windows using unknown compiler, assume POSIX supported + typedef off_t wxFileOffset; + #ifdef _LARGE_FILES + #define wxFileOffsetFmtSpec wxLongLongFmtSpec + wxCOMPILE_TIME_ASSERT( sizeof(off_t) == sizeof(wxLongLong_t), + BadFileSizeType ); + // wxFile is present and supports large files + #ifdef wxUSE_FILE + #define wxHAS_LARGE_FILES + #endif + // wxFFile is present and supports large files + #if SIZEOF_LONG == 8 || defined HAVE_FSEEKO + #define wxHAS_LARGE_FFILES + #endif + #else + #define wxFileOffsetFmtSpec _T("") + #endif + // functions + #define wxClose close + #define wxRead ::read + #define wxWrite ::write + #define wxLseek lseek + #define wxSeek lseek + #define wxFsync fsync + #define wxEof eof + + #define wxMkDir mkdir + #define wxRmDir rmdir + + #define wxTell(fd) lseek(fd, 0, SEEK_CUR) + + #define wxStructStat struct stat + + #if wxUSE_UNICODE + #define wxNEED_WX_UNISTD_H + #if defined(__DMC__) + typedef unsigned long mode_t; + #endif + WXDLLIMPEXP_BASE int wxStat( const wxChar *file_name, wxStructStat *buf ); + WXDLLIMPEXP_BASE int wxLstat( const wxChar *file_name, wxStructStat *buf ); + WXDLLIMPEXP_BASE int wxAccess( const wxChar *pathname, int mode ); + WXDLLIMPEXP_BASE int wxOpen( const wxChar *pathname, int flags, mode_t mode ); + #else + #define wxOpen open + #define wxStat stat + #define wxLstat lstat + #define wxAccess access + #endif + + #define wxHAS_NATIVE_LSTAT +#endif // platforms + +#ifdef O_BINARY + #define wxO_BINARY O_BINARY +#else + #define wxO_BINARY 0 +#endif + +// if the platform doesn't have symlinks, define wxLstat to be the same as +// wxStat to avoid #ifdefs in the code using it +#ifndef wxHAS_NATIVE_LSTAT + #define wxLstat wxStat +#endif + +#if defined(__VISAGECPP__) && __IBMCPP__ >= 400 +// +// VisualAge C++ V4.0 cannot have any external linkage const decs +// in headers included by more than one primary source +// +extern const int wxInvalidOffset; +#else +const int wxInvalidOffset = -1; +#endif + +// ---------------------------------------------------------------------------- +// functions +// ---------------------------------------------------------------------------- +WXDLLIMPEXP_BASE bool wxFileExists(const wxString& filename); + +// does the path exist? (may have or not '/' or '\\' at the end) +WXDLLIMPEXP_BASE bool wxDirExists(const wxChar *pszPathName); + +WXDLLIMPEXP_BASE bool wxIsAbsolutePath(const wxString& filename); + +// Get filename +WXDLLIMPEXP_BASE wxChar* wxFileNameFromPath(wxChar *path); +WXDLLIMPEXP_BASE wxString wxFileNameFromPath(const wxString& path); + +// Get directory +WXDLLIMPEXP_BASE wxString wxPathOnly(const wxString& path); + +// wxString version +WXDLLIMPEXP_BASE wxString wxRealPath(const wxString& path); + +WXDLLIMPEXP_BASE void wxDos2UnixFilename(wxChar *s); + +WXDLLIMPEXP_BASE void wxUnix2DosFilename(wxChar *s); + +// Strip the extension, in situ +WXDLLIMPEXP_BASE void wxStripExtension(wxChar *buffer); +WXDLLIMPEXP_BASE void wxStripExtension(wxString& buffer); + +// Get a temporary filename +WXDLLIMPEXP_BASE wxChar* wxGetTempFileName(const wxString& prefix, wxChar *buf = (wxChar *) NULL); +WXDLLIMPEXP_BASE bool wxGetTempFileName(const wxString& prefix, wxString& buf); + +// Expand file name (~/ and ${OPENWINHOME}/ stuff) +WXDLLIMPEXP_BASE wxChar* wxExpandPath(wxChar *dest, const wxChar *path); +WXDLLIMPEXP_BASE bool wxExpandPath(wxString& dest, const wxChar *path); + +// Contract w.r.t environment ( -> ${OPENWINHOME}/lib) +// and make (if under the home tree) relative to home +// [caller must copy-- volatile] +WXDLLIMPEXP_BASE wxChar* wxContractPath(const wxString& filename, + const wxString& envname = wxEmptyString, + const wxString& user = wxEmptyString); + +// Destructive removal of /./ and /../ stuff +WXDLLIMPEXP_BASE wxChar* wxRealPath(wxChar *path); + +// Allocate a copy of the full absolute path +WXDLLIMPEXP_BASE wxChar* wxCopyAbsolutePath(const wxString& path); + +// Get first file name matching given wild card. +// Flags are reserved for future use. +#define wxFILE 1 +#define wxDIR 2 +WXDLLIMPEXP_BASE wxString wxFindFirstFile(const wxChar *spec, int flags = wxFILE); +WXDLLIMPEXP_BASE wxString wxFindNextFile(); + +// Does the pattern contain wildcards? +WXDLLIMPEXP_BASE bool wxIsWild(const wxString& pattern); + +// Does the pattern match the text (usually a filename)? +// If dot_special is true, doesn't match * against . (eliminating +// `hidden' dot files) +WXDLLIMPEXP_BASE bool wxMatchWild(const wxString& pattern, const wxString& text, bool dot_special = true); + +// Concatenate two files to form third +WXDLLIMPEXP_BASE bool wxConcatFiles(const wxString& file1, const wxString& file2, const wxString& file3); + +// Copy file1 to file2 +WXDLLIMPEXP_BASE bool wxCopyFile(const wxString& file1, const wxString& file2, + bool overwrite = true); + +// Remove file +WXDLLIMPEXP_BASE bool wxRemoveFile(const wxString& file); + +// Rename file +WXDLLIMPEXP_BASE bool wxRenameFile(const wxString& file1, const wxString& file2, bool overwrite = true); + +// Get current working directory. +#if WXWIN_COMPATIBILITY_2_6 +// If buf is NULL, allocates space using new, else +// copies into buf. +// IMPORTANT NOTE getcwd is know not to work under some releases +// of Win32s 1.3, according to MS release notes! +wxDEPRECATED( WXDLLIMPEXP_BASE wxChar* wxGetWorkingDirectory(wxChar *buf = (wxChar *) NULL, int sz = 1000) ); +// new and preferred version of wxGetWorkingDirectory +// NB: can't have the same name because of overloading ambiguity +#endif // WXWIN_COMPATIBILITY_2_6 +WXDLLIMPEXP_BASE wxString wxGetCwd(); + +// Set working directory +WXDLLIMPEXP_BASE bool wxSetWorkingDirectory(const wxString& d); + +// Make directory +WXDLLIMPEXP_BASE bool wxMkdir(const wxString& dir, int perm = 0777); + +// Remove directory. Flags reserved for future use. +WXDLLIMPEXP_BASE bool wxRmdir(const wxString& dir, int flags = 0); + +// Return the type of an open file +WXDLLIMPEXP_BASE wxFileKind wxGetFileKind(int fd); +WXDLLIMPEXP_BASE wxFileKind wxGetFileKind(FILE *fp); + +#if WXWIN_COMPATIBILITY_2_6 +// compatibility defines, don't use in new code +wxDEPRECATED( inline bool wxPathExists(const wxChar *pszPathName) ); +inline bool wxPathExists(const wxChar *pszPathName) +{ + return wxDirExists(pszPathName); +} +#endif //WXWIN_COMPATIBILITY_2_6 + +// permissions; these functions work both on files and directories: +WXDLLIMPEXP_BASE bool wxIsWritable(const wxString &path); +WXDLLIMPEXP_BASE bool wxIsReadable(const wxString &path); +WXDLLIMPEXP_BASE bool wxIsExecutable(const wxString &path); + +// ---------------------------------------------------------------------------- +// separators in file names +// ---------------------------------------------------------------------------- + +// between file name and extension +#define wxFILE_SEP_EXT wxT('.') + +// between drive/volume name and the path +#define wxFILE_SEP_DSK wxT(':') + +// between the path components +#define wxFILE_SEP_PATH_DOS wxT('\\') +#define wxFILE_SEP_PATH_UNIX wxT('/') +#define wxFILE_SEP_PATH_MAC wxT(':') +#define wxFILE_SEP_PATH_VMS wxT('.') // VMS also uses '[' and ']' + +// separator in the path list (as in PATH environment variable) +// there is no PATH variable in Classic Mac OS so just use the +// semicolon (it must be different from the file name separator) +// NB: these are strings and not characters on purpose! +#define wxPATH_SEP_DOS wxT(";") +#define wxPATH_SEP_UNIX wxT(":") +#define wxPATH_SEP_MAC wxT(";") + +// platform independent versions +#if defined(__UNIX__) && !defined(__OS2__) + // CYGWIN also uses UNIX settings + #define wxFILE_SEP_PATH wxFILE_SEP_PATH_UNIX + #define wxPATH_SEP wxPATH_SEP_UNIX +#elif defined(__MAC__) + #define wxFILE_SEP_PATH wxFILE_SEP_PATH_MAC + #define wxPATH_SEP wxPATH_SEP_MAC +#else // Windows and OS/2 + #define wxFILE_SEP_PATH wxFILE_SEP_PATH_DOS + #define wxPATH_SEP wxPATH_SEP_DOS +#endif // Unix/Windows + +// this is useful for wxString::IsSameAs(): to compare two file names use +// filename1.IsSameAs(filename2, wxARE_FILENAMES_CASE_SENSITIVE) +#if defined(__UNIX__) && !defined(__DARWIN__) && !defined(__OS2__) + #define wxARE_FILENAMES_CASE_SENSITIVE true +#else // Windows, Mac OS and OS/2 + #define wxARE_FILENAMES_CASE_SENSITIVE false +#endif // Unix/Windows + +// is the char a path separator? +inline bool wxIsPathSeparator(wxChar c) +{ + // under DOS/Windows we should understand both Unix and DOS file separators +#if ( defined(__UNIX__) && !defined(__OS2__) )|| defined(__MAC__) + return c == wxFILE_SEP_PATH; +#else + return c == wxFILE_SEP_PATH_DOS || c == wxFILE_SEP_PATH_UNIX; +#endif +} + +// does the string ends with path separator? +WXDLLIMPEXP_BASE bool wxEndsWithPathSeparator(const wxChar *pszFileName); + +// split the full path into path (including drive for DOS), name and extension +// (understands both '/' and '\\') +WXDLLIMPEXP_BASE void wxSplitPath(const wxChar *pszFileName, + wxString *pstrPath, + wxString *pstrName, + wxString *pstrExt); + +// find a file in a list of directories, returns false if not found +WXDLLIMPEXP_BASE bool wxFindFileInPath(wxString *pStr, const wxChar *pszPath, const wxChar *pszFile); + +// Get the OS directory if appropriate (such as the Windows directory). +// On non-Windows platform, probably just return the empty string. +WXDLLIMPEXP_BASE wxString wxGetOSDirectory(); + +#if wxUSE_DATETIME + +// Get file modification time +WXDLLIMPEXP_BASE time_t wxFileModificationTime(const wxString& filename); + +#endif // wxUSE_DATETIME + +// Parses the wildCard, returning the number of filters. +// Returns 0 if none or if there's a problem, +// The arrays will contain an equal number of items found before the error. +// wildCard is in the form: +// "All files (*)|*|Image Files (*.jpeg *.png)|*.jpg;*.png" +WXDLLIMPEXP_BASE int wxParseCommonDialogsFilter(const wxString& wildCard, wxArrayString& descriptions, wxArrayString& filters); + +// ---------------------------------------------------------------------------- +// classes +// ---------------------------------------------------------------------------- + +#ifdef __UNIX__ + +// set umask to the given value in ctor and reset it to the old one in dtor +class WXDLLIMPEXP_BASE wxUmaskChanger +{ +public: + // change the umask to the given one if it is not -1: this allows to write + // the same code whether you really want to change umask or not, as is in + // wxFileConfig::Flush() for example + wxUmaskChanger(int umaskNew) + { + m_umaskOld = umaskNew == -1 ? -1 : (int)umask((mode_t)umaskNew); + } + + ~wxUmaskChanger() + { + if ( m_umaskOld != -1 ) + umask((mode_t)m_umaskOld); + } + +private: + int m_umaskOld; +}; + +// this macro expands to an "anonymous" wxUmaskChanger object under Unix and +// nothing elsewhere +#define wxCHANGE_UMASK(m) wxUmaskChanger wxMAKE_UNIQUE_NAME(umaskChanger_)(m) + +#else // !__UNIX__ + +#define wxCHANGE_UMASK(m) + +#endif // __UNIX__/!__UNIX__ + + +// Path searching +class WXDLLIMPEXP_BASE wxPathList : public wxArrayString +{ +public: + wxPathList() {} + wxPathList(const wxArrayString &arr) + { Add(arr); } + + // Adds all paths in environment variable + void AddEnvList(const wxString& envVariable); + + // Adds given path to this list + bool Add(const wxString& path); + void Add(const wxArrayString &paths); + + // Find the first full path for which the file exists + wxString FindValidPath(const wxString& filename) const; + + // Find the first full path for which the file exists; ensure it's an + // absolute path that gets returned. + wxString FindAbsoluteValidPath(const wxString& filename) const; + + // Given full path and filename, add path to list + bool EnsureFileAccessible(const wxString& path); + +#if WXWIN_COMPATIBILITY_2_6 + // Returns true if the path is in the list + wxDEPRECATED( bool Member(const wxString& path) const ); +#endif +}; + +#endif // _WX_FILEFN_H_ diff --git a/Externals/wxWidgets/include/wx/filename.h b/Externals/wxWidgets/include/wx/filename.h new file mode 100644 index 0000000000..878f1e4363 --- /dev/null +++ b/Externals/wxWidgets/include/wx/filename.h @@ -0,0 +1,541 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/filename.h +// Purpose: wxFileName - encapsulates a file path +// Author: Robert Roebling, Vadim Zeitlin +// Modified by: +// Created: 28.12.00 +// RCS-ID: $Id: filename.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) 2000 Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_FILENAME_H_ +#define _WX_FILENAME_H_ + +/* + TODO: + + 1. support for drives under Windows + 2. more file operations: + a) chmod() + b) [acm]time() - get and set + c) rename()? + 3. SameFileAs() function to compare inodes under Unix + */ + +#include "wx/arrstr.h" +#include "wx/filefn.h" +#include "wx/datetime.h" +#include "wx/intl.h" + +#if wxUSE_FILE +class WXDLLIMPEXP_FWD_BASE wxFile; +#endif + +#if wxUSE_FFILE +class WXDLLIMPEXP_FWD_BASE wxFFile; +#endif + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// the various values for the path format: this mainly affects the path +// separator but also whether or not the path has the drive part (as under +// Windows) +enum wxPathFormat +{ + wxPATH_NATIVE = 0, // the path format for the current platform + wxPATH_UNIX, + wxPATH_BEOS = wxPATH_UNIX, + wxPATH_MAC, + wxPATH_DOS, + wxPATH_WIN = wxPATH_DOS, + wxPATH_OS2 = wxPATH_DOS, + wxPATH_VMS, + + wxPATH_MAX // Not a valid value for specifying path format +}; + +// the kind of normalization to do with the file name: these values can be +// or'd together to perform several operations at once +enum wxPathNormalize +{ + wxPATH_NORM_ENV_VARS = 0x0001, // replace env vars with their values + wxPATH_NORM_DOTS = 0x0002, // squeeze all .. and . and prepend cwd + wxPATH_NORM_TILDE = 0x0004, // Unix only: replace ~ and ~user + wxPATH_NORM_CASE = 0x0008, // if case insensitive => tolower + wxPATH_NORM_ABSOLUTE = 0x0010, // make the path absolute + wxPATH_NORM_LONG = 0x0020, // make the path the long form + wxPATH_NORM_SHORTCUT = 0x0040, // resolve the shortcut, if it is a shortcut + wxPATH_NORM_ALL = 0x00ff & ~wxPATH_NORM_CASE +}; + +// what exactly should GetPath() return? +enum +{ + wxPATH_GET_VOLUME = 0x0001, // include the volume if applicable + wxPATH_GET_SEPARATOR = 0x0002 // terminate the path with the separator +}; + +// MkDir flags +enum +{ + wxPATH_MKDIR_FULL = 0x0001 // create directories recursively +}; + +// error code of wxFileName::GetSize() +extern WXDLLIMPEXP_DATA_BASE(wxULongLong) wxInvalidSize; + + + +// ---------------------------------------------------------------------------- +// wxFileName: encapsulates a file path +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxFileName +{ +public: + // constructors and assignment + + // the usual stuff + wxFileName() { Clear(); } + wxFileName(const wxFileName& filepath) { Assign(filepath); } + + // from a full filename: if it terminates with a '/', a directory path + // is contructed (the name will be empty), otherwise a file name and + // extension are extracted from it + wxFileName( const wxString& fullpath, wxPathFormat format = wxPATH_NATIVE ) + { Assign( fullpath, format ); } + + // from a directory name and a file name + wxFileName(const wxString& path, + const wxString& name, + wxPathFormat format = wxPATH_NATIVE) + { Assign(path, name, format); } + + // from a volume, directory name, file base name and extension + wxFileName(const wxString& volume, + const wxString& path, + const wxString& name, + const wxString& ext, + wxPathFormat format = wxPATH_NATIVE) + { Assign(volume, path, name, ext, format); } + + // from a directory name, file base name and extension + wxFileName(const wxString& path, + const wxString& name, + const wxString& ext, + wxPathFormat format = wxPATH_NATIVE) + { Assign(path, name, ext, format); } + + // the same for delayed initialization + + void Assign(const wxFileName& filepath); + + void Assign(const wxString& fullpath, + wxPathFormat format = wxPATH_NATIVE); + + void Assign(const wxString& volume, + const wxString& path, + const wxString& name, + const wxString& ext, + bool hasExt, + wxPathFormat format = wxPATH_NATIVE); + + void Assign(const wxString& volume, + const wxString& path, + const wxString& name, + const wxString& ext, + wxPathFormat format = wxPATH_NATIVE) + { Assign(volume, path, name, ext, !ext.empty(), format); } + + void Assign(const wxString& path, + const wxString& name, + wxPathFormat format = wxPATH_NATIVE); + + void Assign(const wxString& path, + const wxString& name, + const wxString& ext, + wxPathFormat format = wxPATH_NATIVE); + + void AssignDir(const wxString& dir, wxPathFormat format = wxPATH_NATIVE); + + // assorted assignment operators + + wxFileName& operator=(const wxFileName& filename) + { Assign(filename); return *this; } + + wxFileName& operator=(const wxString& filename) + { Assign(filename); return *this; } + + // reset all components to default, uninitialized state + void Clear(); + + // static pseudo constructors + static wxFileName FileName(const wxString& file, + wxPathFormat format = wxPATH_NATIVE); + static wxFileName DirName(const wxString& dir, + wxPathFormat format = wxPATH_NATIVE); + + // file tests + + // is the filename valid at all? + bool IsOk() const + { + // we're fine if we have the path or the name or if we're a root dir + return m_dirs.size() != 0 || !m_name.empty() || !m_relative || + !m_ext.empty() || m_hasExt; + } + + // does the file with this name exists? + bool FileExists() const; + static bool FileExists( const wxString &file ); + + // does the directory with this name exists? + bool DirExists() const; + static bool DirExists( const wxString &dir ); + + // checks on most common flags for files/directories; + // more platform-specific features (like e.g. Unix permissions) are not + // available in wxFileName + + bool IsDirWritable() const { return wxIsWritable(GetPath()); } + static bool IsDirWritable(const wxString &path) { return wxDirExists(path) && wxIsWritable(path); } + + bool IsDirReadable() const { return wxIsReadable(GetPath()); } + static bool IsDirReadable(const wxString &path) { return wxDirExists(path) && wxIsReadable(path); } + + // NOTE: IsDirExecutable() is not present because the meaning of "executable" + // directory is very platform-dependent and also not so useful + + bool IsFileWritable() const { return wxIsWritable(GetFullPath()); } + static bool IsFileWritable(const wxString &path) { return wxFileExists(path) && wxIsWritable(path); } + + bool IsFileReadable() const { return wxIsReadable(GetFullPath()); } + static bool IsFileReadable(const wxString &path) { return wxFileExists(path) && wxIsReadable(path); } + + bool IsFileExecutable() const { return wxIsExecutable(GetFullPath()); } + static bool IsFileExecutable(const wxString &path) { return wxFileExists(path) && wxIsExecutable(path); } + + + // time functions +#if wxUSE_DATETIME + // set the file last access/mod and creation times + // (any of the pointers may be NULL) + bool SetTimes(const wxDateTime *dtAccess, + const wxDateTime *dtMod, + const wxDateTime *dtCreate); + + // set the access and modification times to the current moment + bool Touch(); + + // return the last access, last modification and create times + // (any of the pointers may be NULL) + bool GetTimes(wxDateTime *dtAccess, + wxDateTime *dtMod, + wxDateTime *dtCreate) const; + + // convenience wrapper: get just the last mod time of the file + wxDateTime GetModificationTime() const + { + wxDateTime dtMod; + (void)GetTimes(NULL, &dtMod, NULL); + return dtMod; + } +#endif // wxUSE_DATETIME + +#ifdef __WXMAC__ + bool MacSetTypeAndCreator( wxUint32 type , wxUint32 creator ) ; + bool MacGetTypeAndCreator( wxUint32 *type , wxUint32 *creator ) ; + // gets the 'common' type and creator for a certain extension + static bool MacFindDefaultTypeAndCreator( const wxString& ext , wxUint32 *type , wxUint32 *creator ) ; + // registers application defined extensions and their default type and creator + static void MacRegisterDefaultTypeAndCreator( const wxString& ext , wxUint32 type , wxUint32 creator ) ; + // looks up the appropriate type and creator from the registration and then sets + bool MacSetDefaultTypeAndCreator() ; +#endif + + // various file/dir operations + + // retrieve the value of the current working directory + void AssignCwd(const wxString& volume = wxEmptyString); + static wxString GetCwd(const wxString& volume = wxEmptyString); + + // change the current working directory + bool SetCwd(); + static bool SetCwd( const wxString &cwd ); + + // get the value of user home (Unix only mainly) + void AssignHomeDir(); + static wxString GetHomeDir(); + + // get the system temporary directory + static wxString GetTempDir(); + +#if wxUSE_FILE || wxUSE_FFILE + // get a temp file name starting with the specified prefix + void AssignTempFileName(const wxString& prefix); + static wxString CreateTempFileName(const wxString& prefix); +#endif // wxUSE_FILE + +#if wxUSE_FILE + // get a temp file name starting with the specified prefix and open the + // file passed to us using this name for writing (atomically if + // possible) + void AssignTempFileName(const wxString& prefix, wxFile *fileTemp); + static wxString CreateTempFileName(const wxString& prefix, + wxFile *fileTemp); +#endif // wxUSE_FILE + +#if wxUSE_FFILE + // get a temp file name starting with the specified prefix and open the + // file passed to us using this name for writing (atomically if + // possible) + void AssignTempFileName(const wxString& prefix, wxFFile *fileTemp); + static wxString CreateTempFileName(const wxString& prefix, + wxFFile *fileTemp); +#endif // wxUSE_FFILE + + // directory creation and removal. + bool Mkdir( int perm = 0777, int flags = 0); + static bool Mkdir( const wxString &dir, int perm = 0777, int flags = 0 ); + + bool Rmdir(); + static bool Rmdir( const wxString &dir ); + + // operations on the path + + // normalize the path: with the default flags value, the path will be + // made absolute, without any ".." and "." and all environment + // variables will be expanded in it + // + // this may be done using another (than current) value of cwd + bool Normalize(int flags = wxPATH_NORM_ALL, + const wxString& cwd = wxEmptyString, + wxPathFormat format = wxPATH_NATIVE); + + // get a path path relative to the given base directory, i.e. opposite + // of Normalize + // + // pass an empty string to get a path relative to the working directory + // + // returns true if the file name was modified, false if we failed to do + // anything with it (happens when the file is on a different volume, + // for example) + bool MakeRelativeTo(const wxString& pathBase = wxEmptyString, + wxPathFormat format = wxPATH_NATIVE); + + // make the path absolute + // + // this may be done using another (than current) value of cwd + bool MakeAbsolute(const wxString& cwd = wxEmptyString, + wxPathFormat format = wxPATH_NATIVE) + { return Normalize(wxPATH_NORM_DOTS | wxPATH_NORM_ABSOLUTE | + wxPATH_NORM_TILDE, cwd, format); } + +#if defined(__WIN32__) && !defined(__WXWINCE__) && wxUSE_OLE + // if the path is a shortcut, return the target and optionally, + // the arguments + bool GetShortcutTarget(const wxString& shortcutPath, + wxString& targetFilename, + wxString* arguments = NULL); +#endif + + // Comparison + + // compares with the rules of the given platforms format + bool SameAs(const wxFileName& filepath, + wxPathFormat format = wxPATH_NATIVE) const; + + // compare with another filename object + bool operator==(const wxFileName& filename) const + { return SameAs(filename); } + bool operator!=(const wxFileName& filename) const + { return !SameAs(filename); } + + // compare with a filename string interpreted as a native file name + bool operator==(const wxString& filename) const + { return SameAs(wxFileName(filename)); } + bool operator!=(const wxString& filename) const + { return !SameAs(wxFileName(filename)); } + + // are the file names of this type cases sensitive? + static bool IsCaseSensitive( wxPathFormat format = wxPATH_NATIVE ); + + // is this filename absolute? + bool IsAbsolute(wxPathFormat format = wxPATH_NATIVE) const; + + // is this filename relative? + bool IsRelative(wxPathFormat format = wxPATH_NATIVE) const + { return !IsAbsolute(format); } + + // Returns the characters that aren't allowed in filenames + // on the specified platform. + static wxString GetForbiddenChars(wxPathFormat format = wxPATH_NATIVE); + + // Information about path format + + // get the string separating the volume from the path for this format, + // return an empty string if this format doesn't support the notion of + // volumes at all + static wxString GetVolumeSeparator(wxPathFormat format = wxPATH_NATIVE); + + // get the string of path separators for this format + static wxString GetPathSeparators(wxPathFormat format = wxPATH_NATIVE); + + // get the string of path terminators, i.e. characters which terminate the + // path + static wxString GetPathTerminators(wxPathFormat format = wxPATH_NATIVE); + + // get the canonical path separator for this format + static wxChar GetPathSeparator(wxPathFormat format = wxPATH_NATIVE) + { return GetPathSeparators(format)[0u]; } + + // is the char a path separator for this format? + static bool IsPathSeparator(wxChar ch, wxPathFormat format = wxPATH_NATIVE); + + // Dir accessors + size_t GetDirCount() const { return m_dirs.size(); } + void AppendDir(const wxString& dir); + void PrependDir(const wxString& dir); + void InsertDir(size_t before, const wxString& dir); + void RemoveDir(size_t pos); + void RemoveLastDir() { RemoveDir(GetDirCount() - 1); } + + // Other accessors + void SetExt( const wxString &ext ) { m_ext = ext; m_hasExt = !m_ext.empty(); } + void ClearExt() { m_ext = wxEmptyString; m_hasExt = false; } + void SetEmptyExt() { m_ext = wxT(""); m_hasExt = true; } + wxString GetExt() const { return m_ext; } + bool HasExt() const { return m_hasExt; } + + void SetName( const wxString &name ) { m_name = name; } + wxString GetName() const { return m_name; } + bool HasName() const { return !m_name.empty(); } + + void SetVolume( const wxString &volume ) { m_volume = volume; } + wxString GetVolume() const { return m_volume; } + bool HasVolume() const { return !m_volume.empty(); } + + // full name is the file name + extension (but without the path) + void SetFullName(const wxString& fullname); + wxString GetFullName() const; + + const wxArrayString& GetDirs() const { return m_dirs; } + + // flags are combination of wxPATH_GET_XXX flags + wxString GetPath(int flags = wxPATH_GET_VOLUME, + wxPathFormat format = wxPATH_NATIVE) const; + + // Replace current path with this one + void SetPath( const wxString &path, wxPathFormat format = wxPATH_NATIVE ); + + // Construct full path with name and ext + wxString GetFullPath( wxPathFormat format = wxPATH_NATIVE ) const; + + // Return the short form of the path (returns identity on non-Windows platforms) + wxString GetShortPath() const; + + // Return the long form of the path (returns identity on non-Windows platforms) + wxString GetLongPath() const; + + // Is this a file or directory (not necessarily an existing one) + bool IsDir() const { return m_name.empty() && m_ext.empty(); } + + // various helpers + + // get the canonical path format for this platform + static wxPathFormat GetFormat( wxPathFormat format = wxPATH_NATIVE ); + + // split a fullpath into the volume, path, (base) name and extension + // (all of the pointers can be NULL) + static void SplitPath(const wxString& fullpath, + wxString *volume, + wxString *path, + wxString *name, + wxString *ext, + bool *hasExt = NULL, + wxPathFormat format = wxPATH_NATIVE); + + static void SplitPath(const wxString& fullpath, + wxString *volume, + wxString *path, + wxString *name, + wxString *ext, + wxPathFormat format) + { + SplitPath(fullpath, volume, path, name, ext, NULL, format); + } + + // compatibility version: volume is part of path + static void SplitPath(const wxString& fullpath, + wxString *path, + wxString *name, + wxString *ext, + wxPathFormat format = wxPATH_NATIVE); + + // split a path into volume and pure path part + static void SplitVolume(const wxString& fullpathWithVolume, + wxString *volume, + wxString *path, + wxPathFormat format = wxPATH_NATIVE); + + // Filesize + + // returns the size of the given filename + wxULongLong GetSize() const; + static wxULongLong GetSize(const wxString &file); + + // returns the size in a human readable form + wxString GetHumanReadableSize(const wxString &nullsize = wxGetTranslation(_T("Not available")), + int precision = 1) const; + static wxString GetHumanReadableSize(const wxULongLong &sz, + const wxString &nullsize = wxGetTranslation(_T("Not available")), + int precision = 1); + + + // deprecated methods, don't use any more + // -------------------------------------- + +#ifndef __DIGITALMARS__ + wxString GetPath( bool withSep, wxPathFormat format = wxPATH_NATIVE ) const + { return GetPath(withSep ? wxPATH_GET_SEPARATOR : 0, format); } +#endif + wxString GetPathWithSep(wxPathFormat format = wxPATH_NATIVE ) const + { return GetPath(wxPATH_GET_VOLUME | wxPATH_GET_SEPARATOR, format); } + +private: + // check whether this dir is valid for Append/Prepend/InsertDir() + static bool IsValidDirComponent(const wxString& dir); + + // the drive/volume/device specification (always empty for Unix) + wxString m_volume; + + // the path components of the file + wxArrayString m_dirs; + + // the file name and extension (empty for directories) + wxString m_name, + m_ext; + + // when m_dirs is empty it may mean either that we have no path at all or + // that our path is '/', i.e. the root directory + // + // we use m_relative to distinguish between these two cases, it will be + // true in the former and false in the latter + // + // NB: the path is not absolute just because m_relative is false, it still + // needs the drive (i.e. volume) in some formats (Windows) + bool m_relative; + + // when m_ext is empty, it may be because we don't have any extension or + // because we have an empty extension + // + // the difference is important as file with name "foo" and without + // extension has full name "foo" while with empty extension it is "foo." + bool m_hasExt; +}; + +#endif // _WX_FILENAME_H_ + diff --git a/Externals/wxWidgets/include/wx/filepicker.h b/Externals/wxWidgets/include/wx/filepicker.h new file mode 100644 index 0000000000..ce08f8569a --- /dev/null +++ b/Externals/wxWidgets/include/wx/filepicker.h @@ -0,0 +1,398 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/filepicker.h +// Purpose: wxFilePickerCtrl, wxDirPickerCtrl base header +// Author: Francesco Montorsi +// Modified by: +// Created: 14/4/2006 +// Copyright: (c) Francesco Montorsi +// RCS-ID: $Id: filepicker.h 49804 2007-11-10 01:09:42Z VZ $ +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_FILEDIRPICKER_H_BASE_ +#define _WX_FILEDIRPICKER_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_FILEPICKERCTRL || wxUSE_DIRPICKERCTRL + +#include "wx/pickerbase.h" + +class WXDLLIMPEXP_FWD_CORE wxDialog; +class WXDLLIMPEXP_FWD_CORE wxFileDirPickerEvent; + +extern WXDLLEXPORT_DATA(const wxChar) wxFilePickerWidgetLabel[]; +extern WXDLLEXPORT_DATA(const wxChar) wxFilePickerWidgetNameStr[]; +extern WXDLLEXPORT_DATA(const wxChar) wxFilePickerCtrlNameStr[]; +extern WXDLLEXPORT_DATA(const wxChar) wxFileSelectorPromptStr[]; + +extern WXDLLEXPORT_DATA(const wxChar) wxDirPickerWidgetLabel[]; +extern WXDLLEXPORT_DATA(const wxChar) wxDirPickerWidgetNameStr[]; +extern WXDLLEXPORT_DATA(const wxChar) wxDirPickerCtrlNameStr[]; +extern WXDLLEXPORT_DATA(const wxChar) wxDirSelectorPromptStr[]; + + +// ---------------------------------------------------------------------------- +// wxFileDirPickerWidgetBase: a generic abstract interface which must be +// implemented by controls used by wxFileDirPickerCtrlBase +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxFileDirPickerWidgetBase +{ +public: + wxFileDirPickerWidgetBase() { } + virtual ~wxFileDirPickerWidgetBase() { } + + wxString GetPath() const { return m_path; } + virtual void SetPath(const wxString &str) { m_path=str; } + + // returns the picker widget cast to wxControl + virtual wxControl *AsControl() = 0; + +protected: + virtual void UpdateDialogPath(wxDialog *) = 0; + virtual void UpdatePathFromDialog(wxDialog *) = 0; + + wxString m_path; +}; + +// Styles which must be supported by all controls implementing wxFileDirPickerWidgetBase +// NB: these styles must be defined to carefully-chosen values to +// avoid conflicts with wxButton's styles + +#define wxFLP_OPEN 0x0400 +#define wxFLP_SAVE 0x0800 +#define wxFLP_OVERWRITE_PROMPT 0x1000 +#define wxFLP_FILE_MUST_EXIST 0x2000 +#define wxFLP_CHANGE_DIR 0x4000 + +// NOTE: wxMULTIPLE is not supported ! + + +#define wxDIRP_DIR_MUST_EXIST 0x0008 +#define wxDIRP_CHANGE_DIR 0x0010 + + +// map platform-dependent controls which implement the wxFileDirPickerWidgetBase +// under the name "wxFilePickerWidget" and "wxDirPickerWidget". +// NOTE: wxFileDirPickerCtrlBase will allocate a wx{File|Dir}PickerWidget and this +// requires that all classes being mapped as wx{File|Dir}PickerWidget have the +// same prototype for the contructor... +// since GTK >= 2.6, there is GtkFileButton +#if defined(__WXGTK26__) && !defined(__WXUNIVERSAL__) + #include "wx/gtk/filepicker.h" + #define wxFilePickerWidget wxFileButton + #define wxDirPickerWidget wxDirButton +#else + #include "wx/generic/filepickerg.h" + #define wxFilePickerWidget wxGenericFileButton + #define wxDirPickerWidget wxGenericDirButton +#endif + + + +// ---------------------------------------------------------------------------- +// wxFileDirPickerCtrlBase +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxFileDirPickerCtrlBase : public wxPickerBase +{ +public: + wxFileDirPickerCtrlBase() : m_bIgnoreNextTextCtrlUpdate(false) {} + +protected: + // NB: no default values since this function will never be used + // directly by the user and derived classes wouldn't use them + bool CreateBase(wxWindow *parent, + wxWindowID id, + const wxString& path, + const wxString &message, + const wxString &wildcard, + const wxPoint& pos, + const wxSize& size, + long style, + const wxValidator& validator, + const wxString& name); + +public: // public API + + wxString GetPath() const; + void SetPath(const wxString &str); + +public: // internal functions + + void UpdatePickerFromTextCtrl(); + void UpdateTextCtrlFromPicker(); + + // event handler for our picker + void OnFileDirChange(wxFileDirPickerEvent &); + + // Returns TRUE if the current path is a valid one + // (i.e. a valid file for a wxFilePickerWidget or a valid + // folder for a wxDirPickerWidget). + virtual bool CheckPath(const wxString &str) const = 0; + + // TRUE if any textctrl change should update the current working directory + virtual bool IsCwdToUpdate() const = 0; + + // Returns the event type sent by this picker + virtual wxEventType GetEventType() const = 0; + + // Returns the filtered value currently placed in the text control (if present). + virtual wxString GetTextCtrlValue() const = 0; + +protected: + // creates the picker control + virtual + wxFileDirPickerWidgetBase *CreatePicker(wxWindow *parent, + const wxString& path, + const wxString& message, + const wxString& wildcard) = 0; + +protected: + + // true if the next UpdateTextCtrl() call is to ignore + bool m_bIgnoreNextTextCtrlUpdate; + + // m_picker object as wxFileDirPickerWidgetBase interface + wxFileDirPickerWidgetBase *m_pickerIface; +}; + +#endif // wxUSE_FILEPICKERCTRL || wxUSE_DIRPICKERCTRL + + +#if wxUSE_FILEPICKERCTRL + +// ---------------------------------------------------------------------------- +// wxFilePickerCtrl: platform-independent class which embeds the +// platform-dependent wxFilePickerWidget and, if wxFLP_USE_TEXTCTRL style is +// used, a textctrl next to it. +// ---------------------------------------------------------------------------- + +#define wxFLP_USE_TEXTCTRL (wxPB_USE_TEXTCTRL) + +#ifdef __WXGTK__ + // GTK apps usually don't have a textctrl next to the picker + #define wxFLP_DEFAULT_STYLE (wxFLP_OPEN|wxFLP_FILE_MUST_EXIST) +#else + #define wxFLP_DEFAULT_STYLE (wxFLP_USE_TEXTCTRL|wxFLP_OPEN|wxFLP_FILE_MUST_EXIST) +#endif + +class WXDLLIMPEXP_CORE wxFilePickerCtrl : public wxFileDirPickerCtrlBase +{ +public: + wxFilePickerCtrl() {} + + wxFilePickerCtrl(wxWindow *parent, + wxWindowID id, + const wxString& path = wxEmptyString, + const wxString& message = wxFileSelectorPromptStr, + const wxString& wildcard = wxFileSelectorDefaultWildcardStr, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxFLP_DEFAULT_STYLE, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxFilePickerCtrlNameStr) + { + Create(parent, id, path, message, wildcard, pos, size, style, + validator, name); + } + + bool Create(wxWindow *parent, + wxWindowID id, + const wxString& path = wxEmptyString, + const wxString& message = wxFileSelectorPromptStr, + const wxString& wildcard = wxFileSelectorDefaultWildcardStr, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxFLP_DEFAULT_STYLE, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxFilePickerCtrlNameStr) + { + return wxFileDirPickerCtrlBase::CreateBase(parent, id, path, + message, wildcard, + pos, size, style, + validator, name); + } + + +public: // overrides + + // return true if the given path is valid for this control + bool CheckPath(const wxString& path) const; + + // return the text control value in canonical form + wxString GetTextCtrlValue() const; + + bool IsCwdToUpdate() const + { return HasFlag(wxFLP_CHANGE_DIR); } + + wxEventType GetEventType() const + { return wxEVT_COMMAND_FILEPICKER_CHANGED; } + +protected: + wxFileDirPickerWidgetBase *CreatePicker(wxWindow *parent, + const wxString& path, + const wxString& message, + const wxString& wildcard) + { + return new wxFilePickerWidget(parent, wxID_ANY, + wxFilePickerWidgetLabel, + path, message, wildcard, + wxDefaultPosition, wxDefaultSize, + GetPickerStyle(GetWindowStyle())); + } + + // extracts the style for our picker from wxFileDirPickerCtrlBase's style + long GetPickerStyle(long style) const + { + return (style & (wxFLP_OPEN|wxFLP_SAVE|wxFLP_OVERWRITE_PROMPT| + wxFLP_FILE_MUST_EXIST|wxFLP_CHANGE_DIR)); + } + +private: + DECLARE_DYNAMIC_CLASS(wxFilePickerCtrl) +}; + +#endif // wxUSE_FILEPICKERCTRL + + +#if wxUSE_DIRPICKERCTRL + +// ---------------------------------------------------------------------------- +// wxDirPickerCtrl: platform-independent class which embeds the +// platform-dependent wxDirPickerWidget and eventually a textctrl +// (see wxDIRP_USE_TEXTCTRL) next to it. +// ---------------------------------------------------------------------------- + +#define wxDIRP_USE_TEXTCTRL (wxPB_USE_TEXTCTRL) + +#ifdef __WXGTK__ + // GTK apps usually don't have a textctrl next to the picker + #define wxDIRP_DEFAULT_STYLE (wxDIRP_DIR_MUST_EXIST) +#else + #define wxDIRP_DEFAULT_STYLE (wxDIRP_USE_TEXTCTRL|wxDIRP_DIR_MUST_EXIST) +#endif + +class WXDLLIMPEXP_CORE wxDirPickerCtrl : public wxFileDirPickerCtrlBase +{ +public: + wxDirPickerCtrl() {} + + wxDirPickerCtrl(wxWindow *parent, wxWindowID id, + const wxString& path = wxEmptyString, + const wxString& message = wxDirSelectorPromptStr, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDIRP_DEFAULT_STYLE, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxDirPickerCtrlNameStr) + { + Create(parent, id, path, message, pos, size, style, validator, name); + } + + bool Create(wxWindow *parent, wxWindowID id, + const wxString& path = wxEmptyString, + const wxString& message = wxDirSelectorPromptStr, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDIRP_DEFAULT_STYLE, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxDirPickerCtrlNameStr) + { + return wxFileDirPickerCtrlBase::CreateBase + ( + parent, id, path, message, wxEmptyString, + pos, size, style, validator, name + ); + } + + +public: // overrides + + bool CheckPath(const wxString &path) const; + + wxString GetTextCtrlValue() const; + + bool IsCwdToUpdate() const + { return HasFlag(wxDIRP_CHANGE_DIR); } + + wxEventType GetEventType() const + { return wxEVT_COMMAND_DIRPICKER_CHANGED; } + +protected: + wxFileDirPickerWidgetBase *CreatePicker(wxWindow *parent, + const wxString& path, + const wxString& message, + const wxString& WXUNUSED(wildcard)) + { + return new wxDirPickerWidget(parent, wxID_ANY, wxDirPickerWidgetLabel, + path, message, + wxDefaultPosition, wxDefaultSize, + GetPickerStyle(GetWindowStyle())); + } + + // extracts the style for our picker from wxFileDirPickerCtrlBase's style + long GetPickerStyle(long style) const + { return (style & (wxDIRP_DIR_MUST_EXIST|wxDIRP_CHANGE_DIR)); } + +private: + DECLARE_DYNAMIC_CLASS(wxDirPickerCtrl) +}; + +#endif // wxUSE_DIRPICKERCTRL + + +#if wxUSE_FILEPICKERCTRL || wxUSE_DIRPICKERCTRL + +// ---------------------------------------------------------------------------- +// wxFileDirPickerEvent: used by wxFilePickerCtrl and wxDirPickerCtrl only +// ---------------------------------------------------------------------------- + +BEGIN_DECLARE_EVENT_TYPES() + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_CORE, wxEVT_COMMAND_FILEPICKER_CHANGED, 1102) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_CORE, wxEVT_COMMAND_DIRPICKER_CHANGED, 1103) +END_DECLARE_EVENT_TYPES() + +class WXDLLIMPEXP_CORE wxFileDirPickerEvent : public wxCommandEvent +{ +public: + wxFileDirPickerEvent() {} + wxFileDirPickerEvent(wxEventType type, wxObject *generator, int id, const wxString &path) + : wxCommandEvent(type, id), + m_path(path) + { + SetEventObject(generator); + } + + wxString GetPath() const { return m_path; } + void SetPath(const wxString &p) { m_path = p; } + + // default copy ctor, assignment operator and dtor are ok + virtual wxEvent *Clone() const { return new wxFileDirPickerEvent(*this); } + +private: + wxString m_path; + + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxFileDirPickerEvent) +}; + +// ---------------------------------------------------------------------------- +// event types and macros +// ---------------------------------------------------------------------------- + +typedef void (wxEvtHandler::*wxFileDirPickerEventFunction)(wxFileDirPickerEvent&); + +#define wxFileDirPickerEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxFileDirPickerEventFunction, &func) + +#define EVT_FILEPICKER_CHANGED(id, fn) \ + wx__DECLARE_EVT1(wxEVT_COMMAND_FILEPICKER_CHANGED, id, wxFileDirPickerEventHandler(fn)) +#define EVT_DIRPICKER_CHANGED(id, fn) \ + wx__DECLARE_EVT1(wxEVT_COMMAND_DIRPICKER_CHANGED, id, wxFileDirPickerEventHandler(fn)) + + +#endif // wxUSE_FILEPICKERCTRL || wxUSE_DIRPICKERCTRL + +#endif // _WX_FILEDIRPICKER_H_BASE_ + diff --git a/Externals/wxWidgets/include/wx/filesys.h b/Externals/wxWidgets/include/wx/filesys.h new file mode 100644 index 0000000000..4a0c7aa152 --- /dev/null +++ b/Externals/wxWidgets/include/wx/filesys.h @@ -0,0 +1,300 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/filesys.h +// Purpose: class for opening files - virtual file system +// Author: Vaclav Slavik +// Copyright: (c) 1999 Vaclav Slavik +// RCS-ID: $Id: filesys.h 43263 2006-11-10 09:00:06Z MW $ +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef __FILESYS_H__ +#define __FILESYS_H__ + +#include "wx/defs.h" + +#if !wxUSE_STREAMS +#error You cannot compile virtual file systems without wxUSE_STREAMS +#endif + +#if wxUSE_HTML && !wxUSE_FILESYSTEM +#error You cannot compile wxHTML without virtual file systems +#endif + +#if wxUSE_FILESYSTEM + +#include "wx/stream.h" +#include "wx/datetime.h" +#include "wx/filename.h" +#include "wx/hashmap.h" + +class WXDLLIMPEXP_BASE wxFSFile; +class WXDLLIMPEXP_BASE wxFileSystemHandler; +class WXDLLIMPEXP_BASE wxFileSystem; + +//-------------------------------------------------------------------------------- +// wxFSFile +// This class is a file opened using wxFileSystem. It consists of +// input stream, location, mime type & optional anchor +// (in 'index.htm#chapter2', 'chapter2' is anchor) +//-------------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxFSFile : public wxObject +{ +public: + wxFSFile(wxInputStream *stream, const wxString& loc, + const wxString& mimetype, const wxString& anchor +#if wxUSE_DATETIME + , wxDateTime modif +#endif // wxUSE_DATETIME + ) + { + m_Stream = stream; + m_Location = loc; + m_MimeType = mimetype; m_MimeType.MakeLower(); + m_Anchor = anchor; +#if wxUSE_DATETIME + m_Modif = modif; +#endif // wxUSE_DATETIME + } + + virtual ~wxFSFile() { delete m_Stream; } + + // returns stream. This doesn't give away ownership of the stream object. + wxInputStream *GetStream() const { return m_Stream; } + + // gives away the ownership of the current stream. + wxInputStream *DetachStream() + { + wxInputStream *stream = m_Stream; + m_Stream = NULL; + return stream; + } + + // deletes the current stream and takes ownership of another. + void SetStream(wxInputStream *stream) + { + delete m_Stream; + m_Stream = stream; + } + + // returns file's mime type + const wxString& GetMimeType() const { return m_MimeType; } + + // returns the original location (aka filename) of the file + const wxString& GetLocation() const { return m_Location; } + + const wxString& GetAnchor() const { return m_Anchor; } + +#if wxUSE_DATETIME + wxDateTime GetModificationTime() const { return m_Modif; } +#endif // wxUSE_DATETIME + +private: + wxInputStream *m_Stream; + wxString m_Location; + wxString m_MimeType; + wxString m_Anchor; +#if wxUSE_DATETIME + wxDateTime m_Modif; +#endif // wxUSE_DATETIME + + DECLARE_ABSTRACT_CLASS(wxFSFile) + DECLARE_NO_COPY_CLASS(wxFSFile) +}; + + + + + +//-------------------------------------------------------------------------------- +// wxFileSystemHandler +// This class is FS handler for wxFileSystem. It provides +// interface to access certain +// kinds of files (HTPP, FTP, local, tar.gz etc..) +//-------------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxFileSystemHandler : public wxObject +{ +public: + wxFileSystemHandler() : wxObject() {} + + // returns true if this handler is able to open given location + virtual bool CanOpen(const wxString& location) = 0; + + // opens given file and returns pointer to input stream. + // Returns NULL if opening failed. + // The location is always absolute path. + virtual wxFSFile* OpenFile(wxFileSystem& fs, const wxString& location) = 0; + + // Finds first/next file that matches spec wildcard. flags can be wxDIR for restricting + // the query to directories or wxFILE for files only or 0 for either. + // Returns filename or empty string if no more matching file exists + virtual wxString FindFirst(const wxString& spec, int flags = 0); + virtual wxString FindNext(); + +protected: + // returns protocol ("file", "http", "tar" etc.) The last (most right) + // protocol is used: + // {it returns "tar" for "file:subdir/archive.tar.gz#tar:/README.txt"} + wxString GetProtocol(const wxString& location) const; + + // returns left part of address: + // {it returns "file:subdir/archive.tar.gz" for "file:subdir/archive.tar.gz#tar:/README.txt"} + wxString GetLeftLocation(const wxString& location) const; + + // returns anchor part of address: + // {it returns "anchor" for "file:subdir/archive.tar.gz#tar:/README.txt#anchor"} + // NOTE: anchor is NOT a part of GetLeftLocation()'s return value + wxString GetAnchor(const wxString& location) const; + + // returns right part of address: + // {it returns "/README.txt" for "file:subdir/archive.tar.gz#tar:/README.txt"} + wxString GetRightLocation(const wxString& location) const; + + // Returns MIME type of the file - w/o need to open it + // (default behaviour is that it returns type based on extension) + wxString GetMimeTypeFromExt(const wxString& location); + + DECLARE_ABSTRACT_CLASS(wxFileSystemHandler) +}; + + + + +//-------------------------------------------------------------------------------- +// wxFileSystem +// This class provides simple interface for opening various +// kinds of files (HTPP, FTP, local, tar.gz etc..) +//-------------------------------------------------------------------------------- + +// Open Bit Flags +enum { + wxFS_READ = 1, // Open for reading + wxFS_SEEKABLE = 4 // Returned stream will be seekable +}; + +WX_DECLARE_VOIDPTR_HASH_MAP_WITH_DECL(wxFileSystemHandler*, wxFSHandlerHash, class WXDLLIMPEXP_BASE); + +class WXDLLIMPEXP_BASE wxFileSystem : public wxObject +{ +public: + wxFileSystem() : wxObject() { m_FindFileHandler = NULL;} + virtual ~wxFileSystem(); + + // sets the current location. Every call to OpenFile is + // relative to this location. + // NOTE !! + // unless is_dir = true 'location' is *not* the directory but + // file contained in this directory + // (so ChangePathTo("dir/subdir/xh.htm") sets m_Path to "dir/subdir/") + void ChangePathTo(const wxString& location, bool is_dir = false); + + wxString GetPath() const {return m_Path;} + + // opens given file and returns pointer to input stream. + // Returns NULL if opening failed. + // It first tries to open the file in relative scope + // (based on ChangePathTo()'s value) and then as an absolute + // path. + wxFSFile* OpenFile(const wxString& location, int flags = wxFS_READ); + + // Finds first/next file that matches spec wildcard. flags can be wxDIR for restricting + // the query to directories or wxFILE for files only or 0 for either. + // Returns filename or empty string if no more matching file exists + wxString FindFirst(const wxString& spec, int flags = 0); + wxString FindNext(); + + // find a file in a list of directories, returns false if not found + bool FindFileInPath(wxString *pStr, const wxChar *path, const wxChar *file); + + // Adds FS handler. + // In fact, this class is only front-end to the FS handlers :-) + static void AddHandler(wxFileSystemHandler *handler); + + // Removes FS handler + static wxFileSystemHandler* RemoveHandler(wxFileSystemHandler *handler); + + // Returns true if there is a handler which can open the given location. + static bool HasHandlerForPath(const wxString& location); + + // remove all items from the m_Handlers list + static void CleanUpHandlers(); + + // Returns the native path for a file URL + static wxFileName URLToFileName(const wxString& url); + + // Returns the file URL for a native path + static wxString FileNameToURL(const wxFileName& filename); + + +protected: + wxFileSystemHandler *MakeLocal(wxFileSystemHandler *h); + + wxString m_Path; + // the path (location) we are currently in + // this is path, not file! + // (so if you opened test/demo.htm, it is + // "test/", not "test/demo.htm") + wxString m_LastName; + // name of last opened file (full path) + static wxList m_Handlers; + // list of FS handlers + wxFileSystemHandler *m_FindFileHandler; + // handler that succeed in FindFirst query + wxFSHandlerHash m_LocalHandlers; + // Handlers local to this instance + + DECLARE_DYNAMIC_CLASS(wxFileSystem) + DECLARE_NO_COPY_CLASS(wxFileSystem) +}; + + +/* + +'location' syntax: + +To determine FS type, we're using standard KDE notation: +file:/absolute/path/file.htm +file:relative_path/xxxxx.html +/some/path/x.file ('file:' is default) +http://www.gnome.org +file:subdir/archive.tar.gz#tar:/README.txt + +special characters : + ':' - FS identificator is before this char + '#' - separator. It can be either HTML anchor ("index.html#news") + (in case there is no ':' in the string to the right from it) + or FS separator + (example : http://www.wxhtml.org/wxhtml-0.1.tar.gz#tar:/include/wxhtml/filesys.h" + this would access tgz archive stored on web) + '/' - directory (path) separator. It is used to determine upper-level path. + HEY! Don't use \ even if you're on Windows! + +*/ + + +class WXDLLIMPEXP_BASE wxLocalFSHandler : public wxFileSystemHandler +{ +public: + virtual bool CanOpen(const wxString& location); + virtual wxFSFile* OpenFile(wxFileSystem& fs, const wxString& location); + virtual wxString FindFirst(const wxString& spec, int flags = 0); + virtual wxString FindNext(); + + // wxLocalFSHandler will prefix all filenames with 'root' before accessing + // files on disk. This effectively makes 'root' the top-level directory + // and prevents access to files outside this directory. + // (This is similar to Unix command 'chroot'.) + static void Chroot(const wxString& root) { ms_root = root; } + +protected: + static wxString ms_root; +}; + + + +#endif + // wxUSE_FILESYSTEM + +#endif + // __FILESYS_H__ diff --git a/Externals/wxWidgets/include/wx/flags.h b/Externals/wxWidgets/include/wx/flags.h new file mode 100644 index 0000000000..803205fdf1 --- /dev/null +++ b/Externals/wxWidgets/include/wx/flags.h @@ -0,0 +1,165 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/flags.h +// Purpose: a bitset suited for replacing the current style flags +// Author: Stefan Csomor +// Modified by: +// Created: 27/07/03 +// RCS-ID: $Id: flags.h 35650 2005-09-23 12:56:45Z MR $ +// Copyright: (c) 2003 Stefan Csomor +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_SETH__ +#define _WX_SETH__ + +// wxBitset should be applied to an enum, then this can be used like +// bitwise operators but keeps the type safety and information, the +// enums must be in a sequence , their value determines the bit position +// that they represent +// The api is made as close as possible to + +template class wxBitset +{ + friend class wxEnumData ; +public: + // creates a wxBitset<> object with all flags initialized to 0 + wxBitset() { m_data = 0; } + + // created a wxBitset<> object initialized according to the bits of the + // integral value val + wxBitset(unsigned long val) { m_data = val ; } + + // copies the content in the new wxBitset<> object from another one + wxBitset(const wxBitset &src) { m_data = src.m_data; } + + // creates a wxBitset<> object that has the specific flag set + wxBitset(const T el) { m_data |= 1 << el; } + + // returns the integral value that the bits of this object represent + unsigned long to_ulong() const { return m_data ; } + + // assignment + wxBitset &operator =(const wxBitset &rhs) + { + m_data = rhs.m_data; + return *this; + } + + // bitwise or operator, sets all bits that are in rhs and leaves + // the rest unchanged + wxBitset &operator |=(const wxBitset &rhs) + { + m_data |= rhs.m_data; + return *this; + } + + // bitwsie exclusive-or operator, toggles the value of all bits + // that are set in bits and leaves all others unchanged + wxBitset &operator ^=(const wxBitset &rhs) // difference + { + m_data ^= rhs.m_data; + return *this; + } + + // bitwise and operator, resets all bits that are not in rhs and leaves + // all others unchanged + wxBitset &operator &=(const wxBitset &rhs) // intersection + { + m_data &= rhs.m_data; + return *this; + } + + // bitwise or operator, returns a new bitset that has all bits set that set are in + // bitset2 or in this bitset + wxBitset operator |(const wxBitset &bitset2) const // union + { + wxBitset s; + s.m_data = m_data | bitset2.m_data; + return s; + } + + // bitwise exclusive-or operator, returns a new bitset that has all bits set that are set either in + // bitset2 or in this bitset but not in both + wxBitset operator ^(const wxBitset &bitset2) const // difference + { + wxBitset s; + s.m_data = m_data ^ bitset2.m_data; + return s; + } + + // bitwise and operator, returns a new bitset that has all bits set that are set both in + // bitset2 and in this bitset + wxBitset operator &(const wxBitset &bitset2) const // intersection + { + wxBitset s; + s.m_data = m_data & bitset2.m_data; + return s; + } + + // sets appropriate the bit to true + wxBitset& set(const T el) //Add element + { + m_data |= 1 << el; + return *this; + } + + // clears the appropriate flag to false + wxBitset& reset(const T el) //remove element + { + m_data &= ~(1 << el); + return *this; + } + + // clear all flags + wxBitset& reset() + { + m_data = 0; + return *this; + } + + // true if this flag is set + bool test(const T el) const + { + return (m_data & (1 << el)) ? true : false; + } + + // true if no flag is set + bool none() const + { + return m_data == 0; + } + + // true if any flag is set + bool any() const + { + return m_data != 0; + } + + // true if both have the same flags + bool operator ==(const wxBitset &rhs) const + { + return m_data == rhs.m_data; + } + + // true if both differ in their flags set + bool operator !=(const wxBitset &rhs) const + { + return !operator==(rhs); + } + + bool operator[] (const T el) const { return test(el) ; } + +private : + unsigned long m_data; +}; + +#define WX_DEFINE_FLAGS( flags ) \ + class WXDLLEXPORT flags \ + {\ + public : \ + flags(long data=0) :m_data(data) {} \ + long m_data ;\ + bool operator ==(const flags &rhs) const { return m_data == rhs.m_data; }\ + } ; + +#endif diff --git a/Externals/wxWidgets/include/wx/fmappriv.h b/Externals/wxWidgets/include/wx/fmappriv.h new file mode 100644 index 0000000000..95df28c907 --- /dev/null +++ b/Externals/wxWidgets/include/wx/fmappriv.h @@ -0,0 +1,74 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/fmappriv.h +// Purpose: private wxFontMapper stuff, not to be used by the library users +// Author: Vadim Zeitlin +// Modified by: +// Created: 21.06.2003 (extracted from common/fontmap.cpp) +// RCS-ID: $Id: fmappriv.h 27454 2004-05-26 10:49:43Z JS $ +// Copyright: (c) 1999-2003 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_FMAPPRIV_H_ +#define _WX_FMAPPRIV_H_ + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// a special pseudo encoding which means "don't ask me about this charset +// any more" -- we need it to avoid driving the user crazy with asking him +// time after time about the same charset which he [presumably] doesn't +// have the fonts for +enum { wxFONTENCODING_UNKNOWN = -2 }; + +// the config paths we use +#if wxUSE_CONFIG + +#define FONTMAPPER_ROOT_PATH wxT("/wxWindows/FontMapper") +#define FONTMAPPER_CHARSET_PATH wxT("Charsets") +#define FONTMAPPER_CHARSET_ALIAS_PATH wxT("Aliases") + +#endif // wxUSE_CONFIG + +// ---------------------------------------------------------------------------- +// wxFontMapperPathChanger: change the config path during our lifetime +// ---------------------------------------------------------------------------- + +#if wxUSE_CONFIG && wxUSE_FILECONFIG + +class wxFontMapperPathChanger +{ +public: + wxFontMapperPathChanger(wxFontMapperBase *fontMapper, const wxString& path) + { + m_fontMapper = fontMapper; + m_ok = m_fontMapper->ChangePath(path, &m_pathOld); + } + + bool IsOk() const { return m_ok; } + + ~wxFontMapperPathChanger() + { + if ( IsOk() ) + m_fontMapper->RestorePath(m_pathOld); + } + +private: + // the fontmapper object we're working with + wxFontMapperBase *m_fontMapper; + + // the old path to be restored if m_ok + wxString m_pathOld; + + // have we changed the path successfully? + bool m_ok; + + + DECLARE_NO_COPY_CLASS(wxFontMapperPathChanger) +}; + +#endif // wxUSE_CONFIG + +#endif // _WX_FMAPPRIV_H_ + diff --git a/Externals/wxWidgets/include/wx/font.h b/Externals/wxWidgets/include/wx/font.h new file mode 100644 index 0000000000..051f47be3a --- /dev/null +++ b/Externals/wxWidgets/include/wx/font.h @@ -0,0 +1,251 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/font.h +// Purpose: wxFontBase class: the interface of wxFont +// Author: Vadim Zeitlin +// Modified by: +// Created: 20.09.99 +// RCS-ID: $Id: font.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_FONT_H_BASE_ +#define _WX_FONT_H_BASE_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/defs.h" // for wxDEFAULT &c +#include "wx/fontenc.h" // the font encoding constants +#include "wx/gdiobj.h" // the base class + +// ---------------------------------------------------------------------------- +// forward declarations +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_CORE wxFontData; +class WXDLLIMPEXP_FWD_CORE wxFontBase; +class WXDLLIMPEXP_FWD_CORE wxFont; +class WXDLLIMPEXP_FWD_CORE wxSize; + +// ---------------------------------------------------------------------------- +// font constants +// ---------------------------------------------------------------------------- + +// standard font families: these may be used only for the font creation, it +// doesn't make sense to query an existing font for its font family as, +// especially if the font had been created from a native font description, it +// may be unknown +enum wxFontFamily +{ + wxFONTFAMILY_DEFAULT = wxDEFAULT, + wxFONTFAMILY_DECORATIVE = wxDECORATIVE, + wxFONTFAMILY_ROMAN = wxROMAN, + wxFONTFAMILY_SCRIPT = wxSCRIPT, + wxFONTFAMILY_SWISS = wxSWISS, + wxFONTFAMILY_MODERN = wxMODERN, + wxFONTFAMILY_TELETYPE = wxTELETYPE, + wxFONTFAMILY_MAX, + wxFONTFAMILY_UNKNOWN = wxFONTFAMILY_MAX +}; + +// font styles +enum wxFontStyle +{ + wxFONTSTYLE_NORMAL = wxNORMAL, + wxFONTSTYLE_ITALIC = wxITALIC, + wxFONTSTYLE_SLANT = wxSLANT, + wxFONTSTYLE_MAX +}; + +// font weights +enum wxFontWeight +{ + wxFONTWEIGHT_NORMAL = wxNORMAL, + wxFONTWEIGHT_LIGHT = wxLIGHT, + wxFONTWEIGHT_BOLD = wxBOLD, + wxFONTWEIGHT_MAX +}; + +// the font flag bits for the new font ctor accepting one combined flags word +enum +{ + // no special flags: font with default weight/slant/anti-aliasing + wxFONTFLAG_DEFAULT = 0, + + // slant flags (default: no slant) + wxFONTFLAG_ITALIC = 1 << 0, + wxFONTFLAG_SLANT = 1 << 1, + + // weight flags (default: medium) + wxFONTFLAG_LIGHT = 1 << 2, + wxFONTFLAG_BOLD = 1 << 3, + + // anti-aliasing flag: force on or off (default: the current system default) + wxFONTFLAG_ANTIALIASED = 1 << 4, + wxFONTFLAG_NOT_ANTIALIASED = 1 << 5, + + // underlined/strikethrough flags (default: no lines) + wxFONTFLAG_UNDERLINED = 1 << 6, + wxFONTFLAG_STRIKETHROUGH = 1 << 7, + + // the mask of all currently used flags + wxFONTFLAG_MASK = wxFONTFLAG_ITALIC | + wxFONTFLAG_SLANT | + wxFONTFLAG_LIGHT | + wxFONTFLAG_BOLD | + wxFONTFLAG_ANTIALIASED | + wxFONTFLAG_NOT_ANTIALIASED | + wxFONTFLAG_UNDERLINED | + wxFONTFLAG_STRIKETHROUGH +}; + +// ---------------------------------------------------------------------------- +// wxFontBase represents a font object +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxNativeFontInfo; + +class WXDLLEXPORT wxFontBase : public wxGDIObject +{ +public: + // creator function + virtual ~wxFontBase(); + + // from the font components + static wxFont *New( + int pointSize, // size of the font in points + int family, // see wxFontFamily enum + int style, // see wxFontStyle enum + int weight, // see wxFontWeight enum + bool underlined = false, // not underlined by default + const wxString& face = wxEmptyString, // facename + wxFontEncoding encoding = wxFONTENCODING_DEFAULT); // ISO8859-X, ... + + // from the font components but using the font flags instead of separate + // parameters for each flag + static wxFont *New(int pointSize, + wxFontFamily family, + int flags = wxFONTFLAG_DEFAULT, + const wxString& face = wxEmptyString, + wxFontEncoding encoding = wxFONTENCODING_DEFAULT); + + // from the font components + static wxFont *New( + const wxSize& pixelSize, // size of the font in pixels + int family, // see wxFontFamily enum + int style, // see wxFontStyle enum + int weight, // see wxFontWeight enum + bool underlined = false, // not underlined by default + const wxString& face = wxEmptyString, // facename + wxFontEncoding encoding = wxFONTENCODING_DEFAULT); // ISO8859-X, ... + + // from the font components but using the font flags instead of separate + // parameters for each flag + static wxFont *New(const wxSize& pixelSize, + wxFontFamily family, + int flags = wxFONTFLAG_DEFAULT, + const wxString& face = wxEmptyString, + wxFontEncoding encoding = wxFONTENCODING_DEFAULT); + + // from the (opaque) native font description object + static wxFont *New(const wxNativeFontInfo& nativeFontDesc); + + // from the string representation of wxNativeFontInfo + static wxFont *New(const wxString& strNativeFontDesc); + + // was the font successfully created? + bool Ok() const { return IsOk(); } + bool IsOk() const { return m_refData != NULL; } + + // comparison + bool operator == (const wxFont& font) const; + bool operator != (const wxFont& font) const; + + // accessors: get the font characteristics + virtual int GetPointSize() const = 0; + virtual wxSize GetPixelSize() const; + virtual bool IsUsingSizeInPixels() const; + virtual int GetFamily() const = 0; + virtual int GetStyle() const = 0; + virtual int GetWeight() const = 0; + virtual bool GetUnderlined() const = 0; + virtual wxString GetFaceName() const = 0; + virtual wxFontEncoding GetEncoding() const = 0; + virtual const wxNativeFontInfo *GetNativeFontInfo() const = 0; + + virtual bool IsFixedWidth() const; + + wxString GetNativeFontInfoDesc() const; + wxString GetNativeFontInfoUserDesc() const; + + // change the font characteristics + virtual void SetPointSize( int pointSize ) = 0; + virtual void SetPixelSize( const wxSize& pixelSize ); + virtual void SetFamily( int family ) = 0; + virtual void SetStyle( int style ) = 0; + virtual void SetWeight( int weight ) = 0; + virtual void SetUnderlined( bool underlined ) = 0; + virtual void SetEncoding(wxFontEncoding encoding) = 0; + virtual bool SetFaceName( const wxString& faceName ); + void SetNativeFontInfo(const wxNativeFontInfo& info) + { DoSetNativeFontInfo(info); } + + bool SetNativeFontInfo(const wxString& info); + bool SetNativeFontInfoUserDesc(const wxString& info); + + // translate the fonts into human-readable string (i.e. GetStyleString() + // will return "wxITALIC" for an italic font, ...) + wxString GetFamilyString() const; + wxString GetStyleString() const; + wxString GetWeightString() const; + + // Unofficial API, don't use + virtual void SetNoAntiAliasing( bool WXUNUSED(no) = true ) { } + virtual bool GetNoAntiAliasing() const { return false; } + + // the default encoding is used for creating all fonts with default + // encoding parameter + static wxFontEncoding GetDefaultEncoding() { return ms_encodingDefault; } + static void SetDefaultEncoding(wxFontEncoding encoding); + +protected: + // the function called by both overloads of SetNativeFontInfo() + virtual void DoSetNativeFontInfo(const wxNativeFontInfo& info); + +private: + // the currently default encoding: by default, it's the default system + // encoding, but may be changed by the application using + // SetDefaultEncoding() to make all subsequent fonts created without + // specifying encoding parameter using this encoding + static wxFontEncoding ms_encodingDefault; +}; + +// include the real class declaration +#if defined(__WXPALMOS__) + #include "wx/palmos/font.h" +#elif defined(__WXMSW__) + #include "wx/msw/font.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/font.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/font.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/font.h" +#elif defined(__WXX11__) + #include "wx/x11/font.h" +#elif defined(__WXMGL__) + #include "wx/mgl/font.h" +#elif defined(__WXDFB__) + #include "wx/dfb/font.h" +#elif defined(__WXMAC__) + #include "wx/mac/font.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/font.h" +#elif defined(__WXPM__) + #include "wx/os2/font.h" +#endif + +#endif + // _WX_FONT_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/fontdlg.h b/Externals/wxWidgets/include/wx/fontdlg.h new file mode 100644 index 0000000000..f93bba49ef --- /dev/null +++ b/Externals/wxWidgets/include/wx/fontdlg.h @@ -0,0 +1,118 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/fontdlg.h +// Purpose: common interface for different wxFontDialog classes +// Author: Vadim Zeitlin +// Modified by: +// Created: 12.05.02 +// RCS-ID: $Id: fontdlg.h 41846 2006-10-09 22:56:48Z VZ $ +// Copyright: (c) 1997-2002 wxWidgets team +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_FONTDLG_H_BASE_ +#define _WX_FONTDLG_H_BASE_ + +#include "wx/defs.h" // for wxUSE_FONTDLG + +#if wxUSE_FONTDLG + +#include "wx/dialog.h" // the base class +#include "wx/cmndata.h" // wxFontData + +// ---------------------------------------------------------------------------- +// wxFontDialog interface +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxFontDialogBase : public wxDialog +{ +public: + // create the font dialog + wxFontDialogBase() { } + wxFontDialogBase(wxWindow *parent) { m_parent = parent; } + wxFontDialogBase(wxWindow *parent, const wxFontData& data) + { m_parent = parent; InitFontData(&data); } + + bool Create(wxWindow *parent) + { return DoCreate(parent); } + bool Create(wxWindow *parent, const wxFontData& data) + { InitFontData(&data); return Create(parent); } + + virtual ~wxFontDialogBase(); + + // retrieve the font data + const wxFontData& GetFontData() const { return m_fontData; } + wxFontData& GetFontData() { return m_fontData; } + +#if WXWIN_COMPATIBILITY_2_6 + // deprecated interface, for compatibility only, don't use + wxDEPRECATED( wxFontDialogBase(wxWindow *parent, const wxFontData *data) ); + + wxDEPRECATED( bool Create(wxWindow *parent, const wxFontData *data) ); +#endif // WXWIN_COMPATIBILITY_2_6 + +protected: + virtual bool DoCreate(wxWindow *parent) { m_parent = parent; return true; } + + void InitFontData(const wxFontData *data = NULL) + { if ( data ) m_fontData = *data; } + + wxFontData m_fontData; + + DECLARE_NO_COPY_CLASS(wxFontDialogBase) +}; + +#if WXWIN_COMPATIBILITY_2_6 + // deprecated interface, for compatibility only, don't use +inline wxFontDialogBase::wxFontDialogBase(wxWindow *parent, const wxFontData *data) +{ m_parent = parent; InitFontData(data); } + +inline bool wxFontDialogBase::Create(wxWindow *parent, const wxFontData *data) +{ InitFontData(data); return Create(parent); } +#endif // WXWIN_COMPATIBILITY_2_6 + +// ---------------------------------------------------------------------------- +// platform-specific wxFontDialog implementation +// ---------------------------------------------------------------------------- + +#if defined( __WXMAC_OSX__ ) && ( MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_2 ) +//set to 1 to use native mac font and color dialogs +#define USE_NATIVE_FONT_DIALOG_FOR_MACOSX 1 +#else +//not supported on these platforms, leave 0 +#define USE_NATIVE_FONT_DIALOG_FOR_MACOSX 0 +#endif + +#if defined(__WXUNIVERSAL__) || \ + defined(__WXMOTIF__) || \ + defined(__WXCOCOA__) || \ + defined(__WXWINCE__) || \ + defined(__WXGPE__) + + #include "wx/generic/fontdlgg.h" + #define wxFontDialog wxGenericFontDialog +#elif defined(__WXMSW__) + #include "wx/msw/fontdlg.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/fontdlg.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/fontdlg.h" +#elif defined(__WXPM__) + #include "wx/os2/fontdlg.h" +#elif defined(__WXMAC__) + #include "wx/mac/fontdlg.h" +#endif + +// ---------------------------------------------------------------------------- +// global public functions +// ---------------------------------------------------------------------------- + +// get the font from user and return it, returns wxNullFont if the dialog was +// cancelled +wxFont WXDLLEXPORT +wxGetFontFromUser(wxWindow *parent = (wxWindow *)NULL, + const wxFont& fontInit = wxNullFont, const wxString& caption = wxEmptyString); + +#endif // wxUSE_FONTDLG + +#endif + // _WX_FONTDLG_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/fontenc.h b/Externals/wxWidgets/include/wx/fontenc.h new file mode 100644 index 0000000000..b80acafffd --- /dev/null +++ b/Externals/wxWidgets/include/wx/fontenc.h @@ -0,0 +1,151 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/fontenc.h +// Purpose: wxFontEncoding constants +// Author: Vadim Zeitlin +// Modified by: +// Created: 29.03.00 +// RCS-ID: $Id: fontenc.h 29139 2004-09-14 12:08:28Z ABX $ +// Copyright: (c) Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_FONTENC_H_ +#define _WX_FONTENC_H_ + +// font encodings +enum wxFontEncoding +{ + wxFONTENCODING_SYSTEM = -1, // system default + wxFONTENCODING_DEFAULT, // current default encoding + + // ISO8859 standard defines a number of single-byte charsets + wxFONTENCODING_ISO8859_1, // West European (Latin1) + wxFONTENCODING_ISO8859_2, // Central and East European (Latin2) + wxFONTENCODING_ISO8859_3, // Esperanto (Latin3) + wxFONTENCODING_ISO8859_4, // Baltic (old) (Latin4) + wxFONTENCODING_ISO8859_5, // Cyrillic + wxFONTENCODING_ISO8859_6, // Arabic + wxFONTENCODING_ISO8859_7, // Greek + wxFONTENCODING_ISO8859_8, // Hebrew + wxFONTENCODING_ISO8859_9, // Turkish (Latin5) + wxFONTENCODING_ISO8859_10, // Variation of Latin4 (Latin6) + wxFONTENCODING_ISO8859_11, // Thai + wxFONTENCODING_ISO8859_12, // doesn't exist currently, but put it + // here anyhow to make all ISO8859 + // consecutive numbers + wxFONTENCODING_ISO8859_13, // Baltic (Latin7) + wxFONTENCODING_ISO8859_14, // Latin8 + wxFONTENCODING_ISO8859_15, // Latin9 (a.k.a. Latin0, includes euro) + wxFONTENCODING_ISO8859_MAX, + + // Cyrillic charset soup (see http://czyborra.com/charsets/cyrillic.html) + wxFONTENCODING_KOI8, // KOI8 Russian + wxFONTENCODING_KOI8_U, // KOI8 Ukrainian + wxFONTENCODING_ALTERNATIVE, // same as MS-DOS CP866 + wxFONTENCODING_BULGARIAN, // used under Linux in Bulgaria + + // what would we do without Microsoft? They have their own encodings + // for DOS + wxFONTENCODING_CP437, // original MS-DOS codepage + wxFONTENCODING_CP850, // CP437 merged with Latin1 + wxFONTENCODING_CP852, // CP437 merged with Latin2 + wxFONTENCODING_CP855, // another cyrillic encoding + wxFONTENCODING_CP866, // and another one + // and for Windows + wxFONTENCODING_CP874, // WinThai + wxFONTENCODING_CP932, // Japanese (shift-JIS) + wxFONTENCODING_CP936, // Chinese simplified (GB) + wxFONTENCODING_CP949, // Korean (Hangul charset) + wxFONTENCODING_CP950, // Chinese (traditional - Big5) + wxFONTENCODING_CP1250, // WinLatin2 + wxFONTENCODING_CP1251, // WinCyrillic + wxFONTENCODING_CP1252, // WinLatin1 + wxFONTENCODING_CP1253, // WinGreek (8859-7) + wxFONTENCODING_CP1254, // WinTurkish + wxFONTENCODING_CP1255, // WinHebrew + wxFONTENCODING_CP1256, // WinArabic + wxFONTENCODING_CP1257, // WinBaltic (same as Latin 7) + wxFONTENCODING_CP12_MAX, + + wxFONTENCODING_UTF7, // UTF-7 Unicode encoding + wxFONTENCODING_UTF8, // UTF-8 Unicode encoding + wxFONTENCODING_EUC_JP, // Extended Unix Codepage for Japanese + wxFONTENCODING_UTF16BE, // UTF-16 Big Endian Unicode encoding + wxFONTENCODING_UTF16LE, // UTF-16 Little Endian Unicode encoding + wxFONTENCODING_UTF32BE, // UTF-32 Big Endian Unicode encoding + wxFONTENCODING_UTF32LE, // UTF-32 Little Endian Unicode encoding + + wxFONTENCODING_MACROMAN, // the standard mac encodings + wxFONTENCODING_MACJAPANESE, + wxFONTENCODING_MACCHINESETRAD, + wxFONTENCODING_MACKOREAN, + wxFONTENCODING_MACARABIC, + wxFONTENCODING_MACHEBREW, + wxFONTENCODING_MACGREEK, + wxFONTENCODING_MACCYRILLIC, + wxFONTENCODING_MACDEVANAGARI, + wxFONTENCODING_MACGURMUKHI, + wxFONTENCODING_MACGUJARATI, + wxFONTENCODING_MACORIYA, + wxFONTENCODING_MACBENGALI, + wxFONTENCODING_MACTAMIL, + wxFONTENCODING_MACTELUGU, + wxFONTENCODING_MACKANNADA, + wxFONTENCODING_MACMALAJALAM, + wxFONTENCODING_MACSINHALESE, + wxFONTENCODING_MACBURMESE, + wxFONTENCODING_MACKHMER, + wxFONTENCODING_MACTHAI, + wxFONTENCODING_MACLAOTIAN, + wxFONTENCODING_MACGEORGIAN, + wxFONTENCODING_MACARMENIAN, + wxFONTENCODING_MACCHINESESIMP, + wxFONTENCODING_MACTIBETAN, + wxFONTENCODING_MACMONGOLIAN, + wxFONTENCODING_MACETHIOPIC, + wxFONTENCODING_MACCENTRALEUR, + wxFONTENCODING_MACVIATNAMESE, + wxFONTENCODING_MACARABICEXT, + wxFONTENCODING_MACSYMBOL, + wxFONTENCODING_MACDINGBATS, + wxFONTENCODING_MACTURKISH, + wxFONTENCODING_MACCROATIAN, + wxFONTENCODING_MACICELANDIC, + wxFONTENCODING_MACROMANIAN, + wxFONTENCODING_MACCELTIC, + wxFONTENCODING_MACGAELIC, + wxFONTENCODING_MACKEYBOARD, + + wxFONTENCODING_MAX, // highest enumerated encoding value + + wxFONTENCODING_MACMIN = wxFONTENCODING_MACROMAN , + wxFONTENCODING_MACMAX = wxFONTENCODING_MACKEYBOARD , + + // aliases for endian-dependent UTF encodings +#ifdef WORDS_BIGENDIAN + wxFONTENCODING_UTF16 = wxFONTENCODING_UTF16BE, // native UTF-16 + wxFONTENCODING_UTF32 = wxFONTENCODING_UTF32BE, // native UTF-32 +#else // WORDS_BIGENDIAN + wxFONTENCODING_UTF16 = wxFONTENCODING_UTF16LE, // native UTF-16 + wxFONTENCODING_UTF32 = wxFONTENCODING_UTF32LE, // native UTF-32 +#endif // WORDS_BIGENDIAN + + // alias for the native Unicode encoding on this platform + // (this is used by wxEncodingConverter and wxUTFFile only for now) +#if SIZEOF_WCHAR_T == 2 + wxFONTENCODING_UNICODE = wxFONTENCODING_UTF16, +#else // SIZEOF_WCHAR_T == 4 + wxFONTENCODING_UNICODE = wxFONTENCODING_UTF32, +#endif + + // alternative names for Far Eastern encodings + // Chinese + wxFONTENCODING_GB2312 = wxFONTENCODING_CP936, // Simplified Chinese + wxFONTENCODING_BIG5 = wxFONTENCODING_CP950, // Traditional Chinese + + // Japanese (see http://zsigri.tripod.com/fontboard/cjk/jis.html) + wxFONTENCODING_SHIFT_JIS = wxFONTENCODING_CP932 // Shift JIS +}; + +#endif // _WX_FONTENC_H_ + diff --git a/Externals/wxWidgets/include/wx/fontenum.h b/Externals/wxWidgets/include/wx/fontenum.h new file mode 100644 index 0000000000..8ea5a23c9d --- /dev/null +++ b/Externals/wxWidgets/include/wx/fontenum.h @@ -0,0 +1,88 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/fontenum.h +// Purpose: wxFontEnumerator class for getting available fonts +// Author: Julian Smart, Vadim Zeitlin +// Modified by: extended to enumerate more than just font facenames and works +// not only on Windows now (VZ) +// Created: 04/01/98 +// RCS-ID: $Id: fontenum.h 43727 2006-12-01 10:14:28Z VS $ +// Copyright: (c) Julian Smart, Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_FONTENUM_H_ +#define _WX_FONTENUM_H_ + +#include "wx/fontenc.h" +#include "wx/arrstr.h" + +#if wxUSE_PANGO || defined(__WXDFB__) + // defined if the port uses only UTF-8 font encodings internally + #define wxHAS_UTF8_FONTS +#endif + +// ---------------------------------------------------------------------------- +// wxFontEnumerator enumerates all available fonts on the system or only the +// fonts with given attributes +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxFontEnumerator +{ +public: + wxFontEnumerator() {} + + // virtual dtor for the base class + virtual ~wxFontEnumerator() {} + + // start enumerating font facenames (either all of them or those which + // support the given encoding) - will result in OnFacename() being + // called for each available facename (until they are exhausted or + // OnFacename returns false) + virtual bool EnumerateFacenames + ( + wxFontEncoding encoding = wxFONTENCODING_SYSTEM, // all + bool fixedWidthOnly = false + ); + + // enumerate the different encodings either for given font facename or for + // all facenames - will result in OnFontEncoding() being called for each + // available (facename, encoding) couple + virtual bool EnumerateEncodings(const wxString& facename = wxEmptyString); + + // callbacks which are called after one of EnumerateXXX() functions from + // above is invoked - all of them may return false to stop enumeration or + // true to continue with it + + // called by EnumerateFacenames + virtual bool OnFacename(const wxString& WXUNUSED(facename)) + { return true; } + + // called by EnumerateEncodings + virtual bool OnFontEncoding(const wxString& WXUNUSED(facename), + const wxString& WXUNUSED(encoding)) + { return true; } + + + + // convenience function that returns array of facenames. + static wxArrayString + GetFacenames(wxFontEncoding encoding = wxFONTENCODING_SYSTEM, // all + bool fixedWidthOnly = false); + + // convenience function that returns array of all available encodings. + static wxArrayString GetEncodings(const wxString& facename = wxEmptyString); + + // convenience function that returns true if the given face name exist + // in the user's system + static bool IsValidFacename(const wxString &str); + +private: +#ifdef wxHAS_UTF8_FONTS + // helper for ports that only use UTF-8 encoding natively + bool EnumerateEncodingsUTF8(const wxString& facename); +#endif + + DECLARE_NO_COPY_CLASS(wxFontEnumerator) +}; + +#endif // _WX_FONTENUM_H_ diff --git a/Externals/wxWidgets/include/wx/fontmap.h b/Externals/wxWidgets/include/wx/fontmap.h new file mode 100644 index 0000000000..c305113289 --- /dev/null +++ b/Externals/wxWidgets/include/wx/fontmap.h @@ -0,0 +1,290 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/fontmap.h +// Purpose: wxFontMapper class +// Author: Vadim Zeitlin +// Modified by: +// Created: 04.11.99 +// RCS-ID: $Id: fontmap.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_FONTMAPPER_H_ +#define _WX_FONTMAPPER_H_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#if wxUSE_FONTMAP + +#include "wx/fontenc.h" // for wxFontEncoding + +#if wxUSE_GUI + #include "wx/fontutil.h" // for wxNativeEncodingInfo +#endif // wxUSE_GUI + +#if wxUSE_CONFIG && wxUSE_FILECONFIG + class WXDLLIMPEXP_FWD_BASE wxConfigBase; +#endif // wxUSE_CONFIG + +class WXDLLIMPEXP_FWD_CORE wxFontMapper; + +#if wxUSE_GUI + class WXDLLIMPEXP_FWD_CORE wxWindow; +#endif // wxUSE_GUI + +// ============================================================================ +// wxFontMapper manages user-definable correspondence between wxWidgets font +// encodings and the fonts present on the machine. +// +// This is a singleton class, font mapper objects can only be accessed using +// wxFontMapper::Get(). +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxFontMapperBase: this is a non-interactive class which just uses its built +// in knowledge of the encodings equivalence +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxFontMapperBase +{ +public: + // constructtor and such + // --------------------- + + // default ctor + wxFontMapperBase(); + + // virtual dtor for any base class + virtual ~wxFontMapperBase(); + + // return instance of the wxFontMapper singleton + // wxBase code only cares that it's a wxFontMapperBase + // In wxBase, wxFontMapper is only forward declared + // so one cannot implicitly cast from it to wxFontMapperBase. + static wxFontMapperBase *Get(); + + // set the singleton to 'mapper' instance and return previous one + static wxFontMapper *Set(wxFontMapper *mapper); + + // delete the existing font mapper if any + static void Reset(); + + + // translates charset strings to encoding + // -------------------------------------- + + // returns the encoding for the given charset (in the form of RFC 2046) or + // wxFONTENCODING_SYSTEM if couldn't decode it + // + // interactive parameter is ignored in the base class, we behave as if it + // were always false + virtual wxFontEncoding CharsetToEncoding(const wxString& charset, + bool interactive = true); + + // information about supported encodings + // ------------------------------------- + + // get the number of font encodings we know about + static size_t GetSupportedEncodingsCount(); + + // get the n-th supported encoding + static wxFontEncoding GetEncoding(size_t n); + + // return canonical name of this encoding (this is a short string, + // GetEncodingDescription() returns a longer one) + static wxString GetEncodingName(wxFontEncoding encoding); + + // return a list of all names of this encoding (see GetEncodingName) + static const wxChar** GetAllEncodingNames(wxFontEncoding encoding); + + // return user-readable string describing the given encoding + // + // NB: hard-coded now, but might change later (read it from config?) + static wxString GetEncodingDescription(wxFontEncoding encoding); + + // find the encoding corresponding to the given name, inverse of + // GetEncodingName() and less general than CharsetToEncoding() + // + // returns wxFONTENCODING_MAX if the name is not a supported encoding + static wxFontEncoding GetEncodingFromName(const wxString& name); + + + // functions which allow to configure the config object used: by default, + // the global one (from wxConfigBase::Get() will be used) and the default + // root path for the config settings is the string returned by + // GetDefaultConfigPath() + // ---------------------------------------------------------------------- + +#if wxUSE_CONFIG && wxUSE_FILECONFIG + // set the root config path to use (should be an absolute path) + void SetConfigPath(const wxString& prefix); + + // return default config path + static const wxChar *GetDefaultConfigPath(); +#endif // wxUSE_CONFIG + + + // returns true for the base class and false for a "real" font mapper object + // (implementation-only) + virtual bool IsDummy() { return true; } + +protected: +#if wxUSE_CONFIG && wxUSE_FILECONFIG + // get the config object we're using -- either the global config object + // or a wxMemoryConfig object created by this class otherwise + wxConfigBase *GetConfig(); + + // gets the root path for our settings -- if it wasn't set explicitly, use + // GetDefaultConfigPath() + const wxString& GetConfigPath(); + + // change to the given (relative) path in the config, return true if ok + // (then GetConfig() will return something !NULL), false if no config + // object + // + // caller should provide a pointer to the string variable which should be + // later passed to RestorePath() + bool ChangePath(const wxString& pathNew, wxString *pathOld); + + // restore the config path after use + void RestorePath(const wxString& pathOld); + + // config object and path (in it) to use + wxConfigBase *m_configDummy; + + wxString m_configRootPath; +#endif // wxUSE_CONFIG + + // the real implementation of the base class version of CharsetToEncoding() + // + // returns wxFONTENCODING_UNKNOWN if encoding is unknown and we shouldn't + // ask the user about it, wxFONTENCODING_SYSTEM if it is unknown but we + // should/could ask the user + int NonInteractiveCharsetToEncoding(const wxString& charset); + +private: + // the global fontmapper object or NULL + static wxFontMapper *sm_instance; + + friend class wxFontMapperPathChanger; + + DECLARE_NO_COPY_CLASS(wxFontMapperBase) +}; + +// ---------------------------------------------------------------------------- +// wxFontMapper: interactive extension of wxFontMapperBase +// +// The default implementations of all functions will ask the user if they are +// not capable of finding the answer themselves and store the answer in a +// config file (configurable via SetConfigXXX functions). This behaviour may +// be disabled by giving the value of false to "interactive" parameter. +// However, the functions will always consult the config file to allow the +// user-defined values override the default logic and there is no way to +// disable this -- which shouldn't be ever needed because if "interactive" was +// never true, the config file is never created anyhow. +// ---------------------------------------------------------------------------- + +#if wxUSE_GUI + +class WXDLLIMPEXP_CORE wxFontMapper : public wxFontMapperBase +{ +public: + // default ctor + wxFontMapper(); + + // virtual dtor for a base class + virtual ~wxFontMapper(); + + // working with the encodings + // -------------------------- + + // returns the encoding for the given charset (in the form of RFC 2046) or + // wxFONTENCODING_SYSTEM if couldn't decode it + virtual wxFontEncoding CharsetToEncoding(const wxString& charset, + bool interactive = true); + + // find an alternative for the given encoding (which is supposed to not be + // available on this system). If successful, return true and fill info + // structure with the parameters required to create the font, otherwise + // return false + virtual bool GetAltForEncoding(wxFontEncoding encoding, + wxNativeEncodingInfo *info, + const wxString& facename = wxEmptyString, + bool interactive = true); + + // version better suitable for 'public' use. Returns wxFontEcoding + // that can be used it wxFont ctor + bool GetAltForEncoding(wxFontEncoding encoding, + wxFontEncoding *alt_encoding, + const wxString& facename = wxEmptyString, + bool interactive = true); + + // checks whether given encoding is available in given face or not. + // + // if no facename is given (default), return true if it's available in any + // facename at alll. + virtual bool IsEncodingAvailable(wxFontEncoding encoding, + const wxString& facename = wxEmptyString); + + + // configure the appearance of the dialogs we may popup + // ---------------------------------------------------- + + // the parent window for modal dialogs + void SetDialogParent(wxWindow *parent) { m_windowParent = parent; } + + // the title for the dialogs (note that default is quite reasonable) + void SetDialogTitle(const wxString& title) { m_titleDialog = title; } + + // GUI code needs to know it's a wxFontMapper because there + // are additional methods in the subclass. + static wxFontMapper *Get(); + + // pseudo-RTTI since we aren't a wxObject. + virtual bool IsDummy() { return false; } + +protected: + // GetAltForEncoding() helper: tests for the existence of the given + // encoding and saves the result in config if ok - this results in the + // following (desired) behaviour: when an unknown/unavailable encoding is + // requested for the first time, the user is asked about a replacement, + // but if he doesn't choose any and the default logic finds one, it will + // be saved in the config so that the user won't be asked about it any + // more + bool TestAltEncoding(const wxString& configEntry, + wxFontEncoding encReplacement, + wxNativeEncodingInfo *info); + + // the title for our dialogs + wxString m_titleDialog; + + // the parent window for our dialogs + wxWindow *m_windowParent; + +private: + DECLARE_NO_COPY_CLASS(wxFontMapper) +}; + +#endif // wxUSE_GUI + +// ---------------------------------------------------------------------------- +// global variables +// ---------------------------------------------------------------------------- + +// the default font mapper for wxWidgets programs do NOT use! This is for +// backward compatibility, use wxFontMapper::Get() instead +#define wxTheFontMapper (wxFontMapper::Get()) + +#else // !wxUSE_FONTMAP + +#if wxUSE_GUI + // wxEncodingToCodepage (utils.cpp) needs wxGetNativeFontEncoding + #include "wx/fontutil.h" +#endif + +#endif // wxUSE_FONTMAP/!wxUSE_FONTMAP + +#endif // _WX_FONTMAPPER_H_ + diff --git a/Externals/wxWidgets/include/wx/fontpicker.h b/Externals/wxWidgets/include/wx/fontpicker.h new file mode 100644 index 0000000000..e64159e2aa --- /dev/null +++ b/Externals/wxWidgets/include/wx/fontpicker.h @@ -0,0 +1,223 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/fontpicker.h +// Purpose: wxFontPickerCtrl base header +// Author: Francesco Montorsi +// Modified by: +// Created: 14/4/2006 +// Copyright: (c) Francesco Montorsi +// RCS-ID: $Id: fontpicker.h 42999 2006-11-03 21:54:13Z VZ $ +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_FONTPICKER_H_BASE_ +#define _WX_FONTPICKER_H_BASE_ + +#include "wx/defs.h" + + +#if wxUSE_FONTPICKERCTRL + +#include "wx/pickerbase.h" + + +class WXDLLIMPEXP_CORE wxFontPickerEvent; + +extern WXDLLEXPORT_DATA(const wxChar) wxFontPickerWidgetNameStr[]; +extern WXDLLEXPORT_DATA(const wxChar) wxFontPickerCtrlNameStr[]; + + +// ---------------------------------------------------------------------------- +// wxFontPickerWidgetBase: a generic abstract interface which must be +// implemented by controls used by wxFontPickerCtrl +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxFontPickerWidgetBase +{ +public: + wxFontPickerWidgetBase() { m_selectedFont = *wxNORMAL_FONT; } + virtual ~wxFontPickerWidgetBase() {} + + wxFont GetSelectedFont() const + { return m_selectedFont; } + virtual void SetSelectedFont(const wxFont &f) + { m_selectedFont = f; UpdateFont(); } + +protected: + + virtual void UpdateFont() = 0; + + // the current font (may be invalid if none) + // NOTE: don't call this m_font as wxWindow::m_font already exists + wxFont m_selectedFont; +}; + +// Styles which must be supported by all controls implementing wxFontPickerWidgetBase +// NB: these styles must be defined to carefully-chosen values to +// avoid conflicts with wxButton's styles + + +// keeps the label of the button updated with the fontface name + font size +// E.g. choosing "Times New Roman bold, italic with size 10" from the fontdialog, +// updates the wxFontButtonGeneric's label (overwriting any previous label) +// with the "Times New Roman, 10" text (only fontface + fontsize is displayed +// to avoid extralong labels). +#define wxFNTP_FONTDESC_AS_LABEL 0x0008 + +// uses the currently selected font to draw the label of the button +#define wxFNTP_USEFONT_FOR_LABEL 0x0010 + +// since GTK > 2.4, there is GtkFontButton +#if defined(__WXGTK24__) && !defined(__WXUNIVERSAL__) + #include "wx/gtk/fontpicker.h" + #define wxFontPickerWidget wxFontButton +#else + #include "wx/generic/fontpickerg.h" + #define wxFontPickerWidget wxGenericFontButton +#endif + + +// ---------------------------------------------------------------------------- +// wxFontPickerCtrl specific flags +// ---------------------------------------------------------------------------- + +#define wxFNTP_USE_TEXTCTRL (wxPB_USE_TEXTCTRL) +#define wxFNTP_DEFAULT_STYLE (wxFNTP_FONTDESC_AS_LABEL|wxFNTP_USEFONT_FOR_LABEL) + +// not a style but rather the default value of the maximum pointsize allowed +#define wxFNTP_MAXPOINT_SIZE 100 + + +// ---------------------------------------------------------------------------- +// wxFontPickerCtrl: platform-independent class which embeds the +// platform-dependent wxFontPickerWidget andm if wxFNTP_USE_TEXTCTRL style is +// used, a textctrl next to it. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxFontPickerCtrl : public wxPickerBase +{ +public: + wxFontPickerCtrl() + : m_bIgnoreNextTextCtrlUpdate(false), + m_nMaxPointSize(wxFNTP_MAXPOINT_SIZE) + { + } + + virtual ~wxFontPickerCtrl() {} + + + wxFontPickerCtrl(wxWindow *parent, + wxWindowID id, + const wxFont& initial = wxNullFont, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxFNTP_DEFAULT_STYLE, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxFontPickerCtrlNameStr) + : m_bIgnoreNextTextCtrlUpdate(false), + m_nMaxPointSize(wxFNTP_MAXPOINT_SIZE) + { + Create(parent, id, initial, pos, size, style, validator, name); + } + + bool Create(wxWindow *parent, + wxWindowID id, + const wxFont& initial = wxNullFont, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxFNTP_DEFAULT_STYLE, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxFontPickerCtrlNameStr); + + +public: // public API + + // get the font chosen + wxFont GetSelectedFont() const + { return ((wxFontPickerWidget *)m_picker)->GetSelectedFont(); } + + // sets currently displayed font + void SetSelectedFont(const wxFont& f); + + // set/get the max pointsize + void SetMaxPointSize(unsigned int max) + { m_nMaxPointSize=max; } + unsigned int GetMaxPointSize() const + { return m_nMaxPointSize; } + +public: // internal functions + + void UpdatePickerFromTextCtrl(); + void UpdateTextCtrlFromPicker(); + + // event handler for our picker + void OnFontChange(wxFontPickerEvent &); + + // used to convert wxString <-> wxFont + virtual wxString Font2String(const wxFont &font); + virtual wxFont String2Font(const wxString &font); + +protected: + + // extracts the style for our picker from wxFontPickerCtrl's style + long GetPickerStyle(long style) const + { return (style & (wxFNTP_FONTDESC_AS_LABEL|wxFNTP_USEFONT_FOR_LABEL)); } + + // true if the next UpdateTextCtrl() call is to ignore + bool m_bIgnoreNextTextCtrlUpdate; + + // the maximum pointsize allowed to the user + unsigned int m_nMaxPointSize; + +private: + DECLARE_DYNAMIC_CLASS(wxFontPickerCtrl) +}; + + +// ---------------------------------------------------------------------------- +// wxFontPickerEvent: used by wxFontPickerCtrl only +// ---------------------------------------------------------------------------- + +BEGIN_DECLARE_EVENT_TYPES() + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_CORE, wxEVT_COMMAND_FONTPICKER_CHANGED, 1102) +END_DECLARE_EVENT_TYPES() + +class WXDLLIMPEXP_CORE wxFontPickerEvent : public wxCommandEvent +{ +public: + wxFontPickerEvent() {} + wxFontPickerEvent(wxObject *generator, int id, const wxFont &f) + : wxCommandEvent(wxEVT_COMMAND_FONTPICKER_CHANGED, id), + m_font(f) + { + SetEventObject(generator); + } + + wxFont GetFont() const { return m_font; } + void SetFont(const wxFont &c) { m_font = c; } + + // default copy ctor, assignment operator and dtor are ok + virtual wxEvent *Clone() const { return new wxFontPickerEvent(*this); } + +private: + wxFont m_font; + + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxFontPickerEvent) +}; + +// ---------------------------------------------------------------------------- +// event types and macros +// ---------------------------------------------------------------------------- + +typedef void (wxEvtHandler::*wxFontPickerEventFunction)(wxFontPickerEvent&); + +#define wxFontPickerEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxFontPickerEventFunction, &func) + +#define EVT_FONTPICKER_CHANGED(id, fn) \ + wx__DECLARE_EVT1(wxEVT_COMMAND_FONTPICKER_CHANGED, id, wxFontPickerEventHandler(fn)) + + +#endif // wxUSE_FONTPICKERCTRL + +#endif + // _WX_FONTPICKER_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/fontutil.h b/Externals/wxWidgets/include/wx/fontutil.h new file mode 100644 index 0000000000..c0c46e4581 --- /dev/null +++ b/Externals/wxWidgets/include/wx/fontutil.h @@ -0,0 +1,242 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/fontutil.h +// Purpose: font-related helper functions +// Author: Vadim Zeitlin +// Modified by: +// Created: 05.11.99 +// RCS-ID: $Id: fontutil.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// General note: this header is private to wxWidgets and is not supposed to be +// included by user code. The functions declared here are implemented in +// msw/fontutil.cpp for Windows, unix/fontutil.cpp for GTK/Motif &c. + +#ifndef _WX_FONTUTIL_H_ +#define _WX_FONTUTIL_H_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/font.h" // for wxFont and wxFontEncoding + +#if defined(__WXMSW__) + #include "wx/msw/wrapwin.h" +#endif + +class WXDLLIMPEXP_FWD_BASE wxArrayString; +struct WXDLLIMPEXP_FWD_CORE wxNativeEncodingInfo; + +#if defined(_WX_X_FONTLIKE) + +// the symbolic names for the XLFD fields (with examples for their value) +// +// NB: we suppose that the font always starts with the empty token (font name +// registry field) as we never use nor generate it anyhow +enum wxXLFDField +{ + wxXLFD_FOUNDRY, // adobe + wxXLFD_FAMILY, // courier, times, ... + wxXLFD_WEIGHT, // black, bold, demibold, medium, regular, light + wxXLFD_SLANT, // r/i/o (roman/italique/oblique) + wxXLFD_SETWIDTH, // condensed, expanded, ... + wxXLFD_ADDSTYLE, // whatever - usually nothing + wxXLFD_PIXELSIZE, // size in pixels + wxXLFD_POINTSIZE, // size in points + wxXLFD_RESX, // 72, 75, 100, ... + wxXLFD_RESY, + wxXLFD_SPACING, // m/p/c (monospaced/proportional/character cell) + wxXLFD_AVGWIDTH, // average width in 1/10 pixels + wxXLFD_REGISTRY, // iso8859, rawin, koi8, ... + wxXLFD_ENCODING, // 1, r, r, ... + wxXLFD_MAX +}; + +#endif // _WX_X_FONTLIKE + +// ---------------------------------------------------------------------------- +// types +// ---------------------------------------------------------------------------- + +// wxNativeFontInfo is platform-specific font representation: this struct +// should be considered as opaque font description only used by the native +// functions, the user code can only get the objects of this type from +// somewhere and pass it somewhere else (possibly save them somewhere using +// ToString() and restore them using FromString()) +class WXDLLEXPORT wxNativeFontInfo +{ +public: +#if wxUSE_PANGO + PangoFontDescription *description; +#elif defined(_WX_X_FONTLIKE) + // the members can't be accessed directly as we only parse the + // xFontName on demand +private: + // the components of the XLFD + wxString fontElements[wxXLFD_MAX]; + + // the full XLFD + wxString xFontName; + + // true until SetXFontName() is called + bool m_isDefault; + + // return true if we have already initialized fontElements + inline bool HasElements() const; + +public: + // init the elements from an XLFD, return true if ok + bool FromXFontName(const wxString& xFontName); + + // return false if we were never initialized with a valid XLFD + bool IsDefault() const { return m_isDefault; } + + // return the XLFD (using the fontElements if necessary) + wxString GetXFontName() const; + + // get the given XFLD component + wxString GetXFontComponent(wxXLFDField field) const; + + // change the font component + void SetXFontComponent(wxXLFDField field, const wxString& value); + + // set the XFLD + void SetXFontName(const wxString& xFontName); +#elif defined(__WXMSW__) + LOGFONT lf; +#elif defined(__WXPM__) + // OS/2 native structures that define a font + FATTRS fa; + FONTMETRICS fm; + FACENAMEDESC fn; +#else // other platforms + // + // This is a generic implementation that should work on all ports + // without specific support by the port. + // + #define wxNO_NATIVE_FONTINFO + + int pointSize; + wxFontFamily family; + wxFontStyle style; + wxFontWeight weight; + bool underlined; + wxString faceName; + wxFontEncoding encoding; +#endif // platforms + + // default ctor (default copy ctor is ok) + wxNativeFontInfo() { Init(); } + +#if wxUSE_PANGO +private: + void Init(const wxNativeFontInfo& info); + void Free(); + +public: + wxNativeFontInfo(const wxNativeFontInfo& info) { Init(info); } + ~wxNativeFontInfo() { Free(); } + + wxNativeFontInfo& operator=(const wxNativeFontInfo& info) + { + Free(); + Init(info); + return *this; + } +#endif // wxUSE_PANGO + + // reset to the default state + void Init(); + + // init with the parameters of the given font + void InitFromFont(const wxFont& font) + { + // translate all font parameters + SetStyle((wxFontStyle)font.GetStyle()); + SetWeight((wxFontWeight)font.GetWeight()); + SetUnderlined(font.GetUnderlined()); +#if defined(__WXMSW__) + if ( font.IsUsingSizeInPixels() ) + SetPixelSize(font.GetPixelSize()); + else + SetPointSize(font.GetPointSize()); +#else + SetPointSize(font.GetPointSize()); +#endif + + // set the family/facename + SetFamily((wxFontFamily)font.GetFamily()); + const wxString& facename = font.GetFaceName(); + if ( !facename.empty() ) + { + SetFaceName(facename); + } + + // deal with encoding now (it may override the font family and facename + // so do it after setting them) + SetEncoding(font.GetEncoding()); + } + + // accessors and modifiers for the font elements + int GetPointSize() const; + wxSize GetPixelSize() const; + wxFontStyle GetStyle() const; + wxFontWeight GetWeight() const; + bool GetUnderlined() const; + wxString GetFaceName() const; + wxFontFamily GetFamily() const; + wxFontEncoding GetEncoding() const; + + void SetPointSize(int pointsize); + void SetPixelSize(const wxSize& pixelSize); + void SetStyle(wxFontStyle style); + void SetWeight(wxFontWeight weight); + void SetUnderlined(bool underlined); + bool SetFaceName(const wxString& facename); + void SetFamily(wxFontFamily family); + void SetEncoding(wxFontEncoding encoding); + + // sets the first facename in the given array which is found + // to be valid. If no valid facename is given, sets the + // first valid facename returned by wxFontEnumerator::GetFacenames(). + // Does not return a bool since it cannot fail. + void SetFaceName(const wxArrayString &facenames); + + + // it is important to be able to serialize wxNativeFontInfo objects to be + // able to store them (in config file, for example) + bool FromString(const wxString& s); + wxString ToString() const; + + // we also want to present the native font descriptions to the user in some + // human-readable form (it is not platform independent neither, but can + // hopefully be understood by the user) + bool FromUserString(const wxString& s); + wxString ToUserString() const; +}; + +// ---------------------------------------------------------------------------- +// font-related functions (common) +// ---------------------------------------------------------------------------- + +// translate a wxFontEncoding into native encoding parameter (defined above), +// returning true if an (exact) macth could be found, false otherwise (without +// attempting any substitutions) +extern bool wxGetNativeFontEncoding(wxFontEncoding encoding, + wxNativeEncodingInfo *info); + +// test for the existence of the font described by this facename/encoding, +// return true if such font(s) exist, false otherwise +extern bool wxTestFontEncoding(const wxNativeEncodingInfo& info); + +// ---------------------------------------------------------------------------- +// font-related functions (X and GTK) +// ---------------------------------------------------------------------------- + +#ifdef _WX_X_FONTLIKE + #include "wx/unix/fontutil.h" +#endif // X || GDK + +#endif // _WX_FONTUTIL_H_ diff --git a/Externals/wxWidgets/include/wx/frame.h b/Externals/wxWidgets/include/wx/frame.h new file mode 100644 index 0000000000..a1a8036fcc --- /dev/null +++ b/Externals/wxWidgets/include/wx/frame.h @@ -0,0 +1,262 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/frame.h +// Purpose: wxFrame class interface +// Author: Vadim Zeitlin +// Modified by: +// Created: 15.11.99 +// RCS-ID: $Id: frame.h 49804 2007-11-10 01:09:42Z VZ $ +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_FRAME_H_BASE_ +#define _WX_FRAME_H_BASE_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/toplevel.h" // the base class + +// the default names for various classs +extern WXDLLEXPORT_DATA(const wxChar) wxStatusLineNameStr[]; +extern WXDLLEXPORT_DATA(const wxChar) wxToolBarNameStr[]; + +class WXDLLIMPEXP_FWD_CORE wxFrame; +class WXDLLIMPEXP_FWD_CORE wxMenuBar; +class WXDLLIMPEXP_FWD_CORE wxStatusBar; +class WXDLLIMPEXP_FWD_CORE wxToolBar; + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// wxFrame-specific (i.e. not for wxDialog) styles +#define wxFRAME_NO_TASKBAR 0x0002 // No taskbar button (MSW only) +#define wxFRAME_TOOL_WINDOW 0x0004 // No taskbar button, no system menu +#define wxFRAME_FLOAT_ON_PARENT 0x0008 // Always above its parent +#define wxFRAME_SHAPED 0x0010 // Create a window that is able to be shaped + +// ---------------------------------------------------------------------------- +// wxFrame is a top-level window with optional menubar, statusbar and toolbar +// +// For each of *bars, a frame may have several of them, but only one is +// managed by the frame, i.e. resized/moved when the frame is and whose size +// is accounted for in client size calculations - all others should be taken +// care of manually. The CreateXXXBar() functions create this, main, XXXBar, +// but the actual creation is done in OnCreateXXXBar() functions which may be +// overridden to create custom objects instead of standard ones when +// CreateXXXBar() is called. +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxFrameBase : public wxTopLevelWindow +{ +public: + // construction + wxFrameBase(); + virtual ~wxFrameBase(); + + wxFrame *New(wxWindow *parent, + wxWindowID winid, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDEFAULT_FRAME_STYLE, + const wxString& name = wxFrameNameStr); + + // frame state + // ----------- + + // get the origin of the client area (which may be different from (0, 0) + // if the frame has a toolbar) in client coordinates + virtual wxPoint GetClientAreaOrigin() const; + + // sends a size event to the window using its current size -- this has an + // effect of refreshing the window layout + virtual void SendSizeEvent(); + + // menu bar functions + // ------------------ + +#if wxUSE_MENUS + virtual void SetMenuBar(wxMenuBar *menubar); + virtual wxMenuBar *GetMenuBar() const { return m_frameMenuBar; } +#endif // wxUSE_MENUS + + // process menu command: returns true if processed + bool ProcessCommand(int winid); + + // status bar functions + // -------------------- +#if wxUSE_STATUSBAR + // create the main status bar by calling OnCreateStatusBar() + virtual wxStatusBar* CreateStatusBar(int number = 1, + long style = wxST_SIZEGRIP|wxFULL_REPAINT_ON_RESIZE, + wxWindowID winid = 0, + const wxString& name = + wxStatusLineNameStr); + // return a new status bar + virtual wxStatusBar *OnCreateStatusBar(int number, + long style, + wxWindowID winid, + const wxString& name); + // get the main status bar + virtual wxStatusBar *GetStatusBar() const { return m_frameStatusBar; } + + // sets the main status bar + virtual void SetStatusBar(wxStatusBar *statBar); + + // forward these to status bar + virtual void SetStatusText(const wxString &text, int number = 0); + virtual void SetStatusWidths(int n, const int widths_field[]); + void PushStatusText(const wxString &text, int number = 0); + void PopStatusText(int number = 0); + + // set the status bar pane the help will be shown in + void SetStatusBarPane(int n) { m_statusBarPane = n; } + int GetStatusBarPane() const { return m_statusBarPane; } +#endif // wxUSE_STATUSBAR + + // toolbar functions + // ----------------- + +#if wxUSE_TOOLBAR + // create main toolbar bycalling OnCreateToolBar() + virtual wxToolBar* CreateToolBar(long style = -1, + wxWindowID winid = wxID_ANY, + const wxString& name = wxToolBarNameStr); + // return a new toolbar + virtual wxToolBar *OnCreateToolBar(long style, + wxWindowID winid, + const wxString& name ); + + // get/set the main toolbar + virtual wxToolBar *GetToolBar() const { return m_frameToolBar; } + virtual void SetToolBar(wxToolBar *toolbar); +#endif // wxUSE_TOOLBAR + + // implementation only from now on + // ------------------------------- + + // event handlers +#if wxUSE_MENUS +#if wxUSE_STATUSBAR + void OnMenuOpen(wxMenuEvent& event); + void OnMenuClose(wxMenuEvent& event); + void OnMenuHighlight(wxMenuEvent& event); +#endif // wxUSE_STATUSBAR + + // send wxUpdateUIEvents for all menu items in the menubar, + // or just for menu if non-NULL + virtual void DoMenuUpdates(wxMenu* menu = NULL); +#endif // wxUSE_MENUS + + // do the UI update processing for this window + virtual void UpdateWindowUI(long flags = wxUPDATE_UI_NONE); + + // Implement internal behaviour (menu updating on some platforms) + virtual void OnInternalIdle(); + + // if there is no real wxTopLevelWindow on this platform we have to define + // some wxTopLevelWindowBase pure virtual functions here to avoid breaking + // old ports (wxMotif) which don't define them in wxFrame +#ifndef wxTopLevelWindowNative + virtual bool ShowFullScreen(bool WXUNUSED(show), + long WXUNUSED(style) = wxFULLSCREEN_ALL) + { return false; } + virtual bool IsFullScreen() const + { return false; } +#endif // no wxTopLevelWindowNative + +#if wxUSE_MENUS || wxUSE_TOOLBAR + // show help text (typically in the statusbar); show is false + // if you are hiding the help, true otherwise + virtual void DoGiveHelp(const wxString& text, bool show); +#endif + +protected: + // the frame main menu/status/tool bars + // ------------------------------------ + + // this (non virtual!) function should be called from dtor to delete the + // main menubar, statusbar and toolbar (if any) + void DeleteAllBars(); + + // test whether this window makes part of the frame + virtual bool IsOneOfBars(const wxWindow *win) const; + +#if wxUSE_MENUS + // override to update menu bar position when the frame size changes + virtual void PositionMenuBar() { } + + // override to do something special when the menu bar is being removed + // from the frame + virtual void DetachMenuBar(); + + // override to do something special when the menu bar is attached to the + // frame + virtual void AttachMenuBar(wxMenuBar *menubar); + + wxMenuBar *m_frameMenuBar; +#endif // wxUSE_MENUS + +#if wxUSE_STATUSBAR && (wxUSE_MENUS || wxUSE_TOOLBAR) + // the saved status bar text overwritten by DoGiveHelp() + wxString m_oldStatusText; +#endif + +#if wxUSE_STATUSBAR + // override to update status bar position (or anything else) when + // something changes + virtual void PositionStatusBar() { } + + // show the help string for this menu item in the given status bar: the + // status bar pointer can be NULL; return true if help was shown + bool ShowMenuHelp(wxStatusBar *statbar, int helpid); + + wxStatusBar *m_frameStatusBar; +#endif // wxUSE_STATUSBAR + + + int m_statusBarPane; + +#if wxUSE_TOOLBAR + // override to update status bar position (or anything else) when + // something changes + virtual void PositionToolBar() { } + + wxToolBar *m_frameToolBar; +#endif // wxUSE_TOOLBAR + +#if wxUSE_MENUS && wxUSE_STATUSBAR + DECLARE_EVENT_TABLE() +#endif // wxUSE_MENUS && wxUSE_STATUSBAR + + DECLARE_NO_COPY_CLASS(wxFrameBase) +}; + +// include the real class declaration +#if defined(__WXUNIVERSAL__) // && !defined(__WXMICROWIN__) + #include "wx/univ/frame.h" +#else // !__WXUNIVERSAL__ + #if defined(__WXPALMOS__) + #include "wx/palmos/frame.h" + #elif defined(__WXMSW__) + #include "wx/msw/frame.h" + #elif defined(__WXGTK20__) + #include "wx/gtk/frame.h" + #elif defined(__WXGTK__) + #include "wx/gtk1/frame.h" + #elif defined(__WXMOTIF__) + #include "wx/motif/frame.h" + #elif defined(__WXMAC__) + #include "wx/mac/frame.h" + #elif defined(__WXCOCOA__) + #include "wx/cocoa/frame.h" + #elif defined(__WXPM__) + #include "wx/os2/frame.h" + #endif +#endif + +#endif + // _WX_FRAME_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/fs_arc.h b/Externals/wxWidgets/include/wx/fs_arc.h new file mode 100644 index 0000000000..02afd07465 --- /dev/null +++ b/Externals/wxWidgets/include/wx/fs_arc.h @@ -0,0 +1,56 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/fs_arc.h +// Purpose: Archive file system +// Author: Vaclav Slavik, Mike Wetherell +// Copyright: (c) 1999 Vaclav Slavik, (c) 2006 Mike Wetherell +// CVS-ID: $Id: fs_arc.h 42713 2006-10-30 11:56:12Z ABX $ +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_FS_ARC_H_ +#define _WX_FS_ARC_H_ + +#include "wx/defs.h" + +#if wxUSE_FS_ARCHIVE + +#include "wx/filesys.h" +#include "wx/hashmap.h" + +WX_DECLARE_STRING_HASH_MAP(int, wxArchiveFilenameHashMap); + +//--------------------------------------------------------------------------- +// wxArchiveFSHandler +//--------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxArchiveFSHandler : public wxFileSystemHandler +{ +public: + wxArchiveFSHandler(); + virtual bool CanOpen(const wxString& location); + virtual wxFSFile* OpenFile(wxFileSystem& fs, const wxString& location); + virtual wxString FindFirst(const wxString& spec, int flags = 0); + virtual wxString FindNext(); + void Cleanup(); + virtual ~wxArchiveFSHandler(); + +private: + class wxArchiveFSCache *m_cache; + wxFileSystem m_fs; + + // these vars are used by FindFirst/Next: + class wxArchiveFSCacheData *m_Archive; + struct wxArchiveFSEntry *m_FindEntry; + wxString m_Pattern, m_BaseDir, m_ZipFile; + bool m_AllowDirs, m_AllowFiles; + wxArchiveFilenameHashMap *m_DirsFound; + + wxString DoFind(); + + DECLARE_NO_COPY_CLASS(wxArchiveFSHandler) + DECLARE_DYNAMIC_CLASS(wxArchiveFSHandler) +}; + +#endif // wxUSE_FS_ARCHIVE + +#endif // _WX_FS_ARC_H_ diff --git a/Externals/wxWidgets/include/wx/fs_filter.h b/Externals/wxWidgets/include/wx/fs_filter.h new file mode 100644 index 0000000000..1eb0145100 --- /dev/null +++ b/Externals/wxWidgets/include/wx/fs_filter.h @@ -0,0 +1,41 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/fs_filter.h +// Purpose: Filter file system handler +// Author: Mike Wetherell +// Copyright: (c) 2006 Mike Wetherell +// CVS-ID: $Id: fs_filter.h 42713 2006-10-30 11:56:12Z ABX $ +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_FS_FILTER_H_ +#define _WX_FS_FILTER_H_ + +#include "wx/defs.h" + +#if wxUSE_FILESYSTEM + +#include "wx/filesys.h" + +//--------------------------------------------------------------------------- +// wxFilterFSHandler +//--------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxFilterFSHandler : public wxFileSystemHandler +{ +public: + wxFilterFSHandler() : wxFileSystemHandler() { } + virtual ~wxFilterFSHandler() { } + + virtual bool CanOpen(const wxString& location); + virtual wxFSFile* OpenFile(wxFileSystem& fs, const wxString& location); + + virtual wxString FindFirst(const wxString& spec, int flags = 0); + virtual wxString FindNext(); + +private: + DECLARE_NO_COPY_CLASS(wxFilterFSHandler) +}; + +#endif // wxUSE_FILESYSTEM + +#endif // _WX_FS_FILTER_H_ diff --git a/Externals/wxWidgets/include/wx/fs_inet.h b/Externals/wxWidgets/include/wx/fs_inet.h new file mode 100644 index 0000000000..f66872dee0 --- /dev/null +++ b/Externals/wxWidgets/include/wx/fs_inet.h @@ -0,0 +1,33 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: fs_inet.h +// Purpose: HTTP and FTP file system +// Author: Vaclav Slavik +// Copyright: (c) 1999 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_FS_INET_H_ +#define _WX_FS_INET_H_ + +#include "wx/defs.h" + +#if wxUSE_FILESYSTEM && wxUSE_FS_INET && wxUSE_STREAMS && wxUSE_SOCKETS + +#include "wx/filesys.h" + +// ---------------------------------------------------------------------------- +// wxInternetFSHandler +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_NET wxInternetFSHandler : public wxFileSystemHandler +{ + public: + virtual bool CanOpen(const wxString& location); + virtual wxFSFile* OpenFile(wxFileSystem& fs, const wxString& location); +}; + +#endif + // wxUSE_FILESYSTEM && wxUSE_FS_INET && wxUSE_STREAMS && wxUSE_SOCKETS + +#endif // _WX_FS_INET_H_ + diff --git a/Externals/wxWidgets/include/wx/fs_mem.h b/Externals/wxWidgets/include/wx/fs_mem.h new file mode 100644 index 0000000000..e4d6737d74 --- /dev/null +++ b/Externals/wxWidgets/include/wx/fs_mem.h @@ -0,0 +1,127 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: fs_mem.h +// Purpose: in-memory file system +// Author: Vaclav Slavik +// Copyright: (c) 2000 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_FS_MEM_H_ +#define _WX_FS_MEM_H_ + +#include "wx/defs.h" + +#if wxUSE_FILESYSTEM + +#include "wx/filesys.h" + +#if wxUSE_GUI + class WXDLLIMPEXP_FWD_CORE wxBitmap; + class WXDLLIMPEXP_FWD_CORE wxImage; +#endif // wxUSE_GUI + +// ---------------------------------------------------------------------------- +// wxMemoryFSHandlerBase +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxMemoryFSHandlerBase : public wxFileSystemHandler +{ +public: + wxMemoryFSHandlerBase(); + virtual ~wxMemoryFSHandlerBase(); + + // Add file to list of files stored in memory. Stored data (bitmap, text or + // raw data) will be copied into private memory stream and available under + // name "memory:" + filename + static void AddFile(const wxString& filename, const wxString& textdata); + static void AddFile(const wxString& filename, const void *binarydata, size_t size); +#if wxABI_VERSION >= 20805 + static void AddFileWithMimeType(const wxString& filename, + const wxString& textdata, + const wxString& mimetype); + static void AddFileWithMimeType(const wxString& filename, + const void *binarydata, size_t size, + const wxString& mimetype); +#endif // wxABI_VERSION >= 20805 + + // Remove file from memory FS and free occupied memory + static void RemoveFile(const wxString& filename); + + virtual bool CanOpen(const wxString& location); + virtual wxFSFile* OpenFile(wxFileSystem& fs, const wxString& location); + virtual wxString FindFirst(const wxString& spec, int flags = 0); + virtual wxString FindNext(); + +protected: + static bool CheckHash(const wxString& filename); + static wxHashTable *m_Hash; +}; + +// ---------------------------------------------------------------------------- +// wxMemoryFSHandler +// ---------------------------------------------------------------------------- + +#if wxUSE_GUI + +// add GUI-only operations to the base class +class WXDLLIMPEXP_CORE wxMemoryFSHandler : public wxMemoryFSHandlerBase +{ +public: + // bring the base class versions into the scope, otherwise they would be + // inaccessible in wxMemoryFSHandler + // (unfortunately "using" can't be used as gcc 2.95 doesn't have it...) + static void AddFile(const wxString& filename, const wxString& textdata) + { + wxMemoryFSHandlerBase::AddFile(filename, textdata); + } + + static void AddFile(const wxString& filename, + const void *binarydata, + size_t size) + { + wxMemoryFSHandlerBase::AddFile(filename, binarydata, size); + } +#if wxABI_VERSION >= 20805 + static void AddFileWithMimeType(const wxString& filename, + const wxString& textdata, + const wxString& mimetype) + { + wxMemoryFSHandlerBase::AddFileWithMimeType(filename, + textdata, + mimetype); + } + static void AddFileWithMimeType(const wxString& filename, + const void *binarydata, size_t size, + const wxString& mimetype) + { + wxMemoryFSHandlerBase::AddFileWithMimeType(filename, + binarydata, size, + mimetype); + } +#endif // wxABI_VERSION >= 20805 + +#if wxUSE_IMAGE + static void AddFile(const wxString& filename, + const wxImage& image, + long type); + + static void AddFile(const wxString& filename, + const wxBitmap& bitmap, + long type); +#endif // wxUSE_IMAGE + +}; + +#else // !wxUSE_GUI + +// just the same thing as the base class in wxBase +class WXDLLIMPEXP_BASE wxMemoryFSHandler : public wxMemoryFSHandlerBase +{ +}; + +#endif // wxUSE_GUI/!wxUSE_GUI + +#endif // wxUSE_FILESYSTEM + +#endif // _WX_FS_MEM_H_ + diff --git a/Externals/wxWidgets/include/wx/fs_zip.h b/Externals/wxWidgets/include/wx/fs_zip.h new file mode 100644 index 0000000000..e33a0674da --- /dev/null +++ b/Externals/wxWidgets/include/wx/fs_zip.h @@ -0,0 +1,23 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/fs_zip.h +// Purpose: wxZipFSHandler typedef for compatibility +// Author: Mike Wetherell +// Copyright: (c) 2006 Mike Wetherell +// CVS-ID: $Id: fs_zip.h 42713 2006-10-30 11:56:12Z ABX $ +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_FS_ZIP_H_ +#define _WX_FS_ZIP_H_ + +#include "wx/defs.h" + +#if wxUSE_FS_ZIP + +#include "wx/fs_arc.h" + +typedef wxArchiveFSHandler wxZipFSHandler; + +#endif // wxUSE_FS_ZIP + +#endif // _WX_FS_ZIP_H_ diff --git a/Externals/wxWidgets/include/wx/gauge.h b/Externals/wxWidgets/include/wx/gauge.h new file mode 100644 index 0000000000..a6246ca42d --- /dev/null +++ b/Externals/wxWidgets/include/wx/gauge.h @@ -0,0 +1,126 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/gauge.h +// Purpose: wxGauge interface +// Author: Vadim Zeitlin +// Modified by: +// Created: 20.02.01 +// RCS-ID: $Id: gauge.h 41089 2006-09-09 13:36:54Z RR $ +// Copyright: (c) 1996-2001 wxWidgets team +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GAUGE_H_BASE_ +#define _WX_GAUGE_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_GAUGE + +#include "wx/control.h" + +// ---------------------------------------------------------------------------- +// wxGauge style flags +// ---------------------------------------------------------------------------- + +#define wxGA_HORIZONTAL wxHORIZONTAL +#define wxGA_VERTICAL wxVERTICAL + +// Win32 only, is default (and only) on some other platforms +#define wxGA_SMOOTH 0x0020 + +#if WXWIN_COMPATIBILITY_2_6 + // obsolete style + #define wxGA_PROGRESSBAR 0 +#endif // WXWIN_COMPATIBILITY_2_6 + +// GTK and Mac always have native implementation of the indeterminate mode +// wxMSW has native implementation only if comctl32.dll >= 6.00 +#if !defined(__WXGTK20__) && !defined(__WXMAC__) && !defined(__WXCOCOA__) + #define wxGAUGE_EMULATE_INDETERMINATE_MODE 1 +#else + #define wxGAUGE_EMULATE_INDETERMINATE_MODE 0 +#endif + +extern WXDLLEXPORT_DATA(const wxChar) wxGaugeNameStr[]; + +// ---------------------------------------------------------------------------- +// wxGauge: a progress bar +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxGaugeBase : public wxControl +{ +public: + wxGaugeBase() { m_rangeMax = m_gaugePos = 0; } + virtual ~wxGaugeBase(); + + bool Create(wxWindow *parent, + wxWindowID id, + int range, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxGA_HORIZONTAL, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxGaugeNameStr); + + // determinate mode API + + // set/get the control range + virtual void SetRange(int range); + virtual int GetRange() const; + + virtual void SetValue(int pos); + virtual int GetValue() const; + + // indeterminate mode API + virtual void Pulse(); + + // simple accessors + bool IsVertical() const { return HasFlag(wxGA_VERTICAL); } + + // appearance params (not implemented for most ports) + virtual void SetShadowWidth(int w); + virtual int GetShadowWidth() const; + + virtual void SetBezelFace(int w); + virtual int GetBezelFace() const; + + // overriden base class virtuals + virtual bool AcceptsFocus() const { return false; } + +protected: + // the max position + int m_rangeMax; + + // the current position + int m_gaugePos; + +#if wxGAUGE_EMULATE_INDETERMINATE_MODE + int m_nDirection; // can be wxRIGHT or wxLEFT +#endif + + DECLARE_NO_COPY_CLASS(wxGaugeBase) +}; + +#if defined(__WXUNIVERSAL__) + #include "wx/univ/gauge.h" +#elif defined(__WXMSW__) + #include "wx/msw/gauge95.h" + #define wxGauge wxGauge95 +#elif defined(__WXMOTIF__) + #include "wx/motif/gauge.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/gauge.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/gauge.h" +#elif defined(__WXMAC__) + #include "wx/mac/gauge.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/gauge.h" +#elif defined(__WXPM__) + #include "wx/os2/gauge.h" +#endif + +#endif // wxUSE_GAUGE + +#endif + // _WX_GAUGE_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/gbsizer.h b/Externals/wxWidgets/include/wx/gbsizer.h new file mode 100644 index 0000000000..2ad9cb911d --- /dev/null +++ b/Externals/wxWidgets/include/wx/gbsizer.h @@ -0,0 +1,300 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: gbsizer.h +// Purpose: wxGridBagSizer: A sizer that can lay out items in a grid, +// with items at specified cells, and with the option of row +// and/or column spanning +// +// Author: Robin Dunn +// Created: 03-Nov-2003 +// RCS-ID: $Id: gbsizer.h 35650 2005-09-23 12:56:45Z MR $ +// Copyright: (c) Robin Dunn +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef __WXGBSIZER_H__ +#define __WXGBSIZER_H__ + +#include "wx/sizer.h" + + +//--------------------------------------------------------------------------- +// Classes to represent a position in the grid and a size of an item in the +// grid, IOW, the number of rows and columns it occupies. I chose to use these +// instead of wxPoint and wxSize because they are (x,y) and usually pixel +// oriented while grids and tables are usually thought of as (row,col) so some +// confusion would definitely result in using wxPoint... +// +// NOTE: This should probably be refactored to a common RowCol data type which +// is used for this and also for wxGridCellCoords. +//--------------------------------------------------------------------------- + +class WXDLLEXPORT wxGBPosition +{ +public: + wxGBPosition() : m_row(0), m_col(0) {} + wxGBPosition(int row, int col) : m_row(row), m_col(col) {} + + // default copy ctor and assignment operator are okay. + + int GetRow() const { return m_row; } + int GetCol() const { return m_col; } + void SetRow(int row) { m_row = row; } + void SetCol(int col) { m_col = col; } + + bool operator==(const wxGBPosition& p) const { return m_row == p.m_row && m_col == p.m_col; } + bool operator!=(const wxGBPosition& p) const { return !(*this == p); } + +private: + int m_row; + int m_col; +}; + + +class WXDLLEXPORT wxGBSpan +{ +public: + wxGBSpan() : m_rowspan(1), m_colspan(1) {} + wxGBSpan(int rowspan, int colspan) : m_rowspan(rowspan), m_colspan(colspan) {} + + // default copy ctor and assignment operator are okay. + + int GetRowspan() const { return m_rowspan; } + int GetColspan() const { return m_colspan; } + void SetRowspan(int rowspan) { m_rowspan = rowspan; } + void SetColspan(int colspan) { m_colspan = colspan; } + + bool operator==(const wxGBSpan& o) const { return m_rowspan == o.m_rowspan && m_colspan == o.m_colspan; } + bool operator!=(const wxGBSpan& o) const { return !(*this == o); } + +private: + int m_rowspan; + int m_colspan; +}; + + +extern WXDLLEXPORT_DATA(const wxGBSpan) wxDefaultSpan; + + +//--------------------------------------------------------------------------- +// wxGBSizerItem +//--------------------------------------------------------------------------- + +class WXDLLEXPORT wxGridBagSizer; + + +class WXDLLEXPORT wxGBSizerItem : public wxSizerItem +{ +public: + // spacer + wxGBSizerItem( int width, + int height, + const wxGBPosition& pos, + const wxGBSpan& span, + int flag, + int border, + wxObject* userData); + + // window + wxGBSizerItem( wxWindow *window, + const wxGBPosition& pos, + const wxGBSpan& span, + int flag, + int border, + wxObject* userData ); + + // subsizer + wxGBSizerItem( wxSizer *sizer, + const wxGBPosition& pos, + const wxGBSpan& span, + int flag, + int border, + wxObject* userData ); + + // default ctor + wxGBSizerItem(); + + + // Get the grid position of the item + wxGBPosition GetPos() const { return m_pos; } + void GetPos(int& row, int& col) const; + + // Get the row and column spanning of the item + wxGBSpan GetSpan() const { return m_span; } + void GetSpan(int& rowspan, int& colspan) const; + + // If the item is already a member of a sizer then first ensure that there + // is no other item that would intersect with this one at the new + // position, then set the new position. Returns true if the change is + // successful and after the next Layout the item will be moved. + bool SetPos( const wxGBPosition& pos ); + + // If the item is already a member of a sizer then first ensure that there + // is no other item that would intersect with this one with its new + // spanning size, then set the new spanning. Returns true if the change + // is successful and after the next Layout the item will be resized. + bool SetSpan( const wxGBSpan& span ); + + // Returns true if this item and the other item instersect + bool Intersects(const wxGBSizerItem& other); + + // Returns true if the given pos/span would intersect with this item. + bool Intersects(const wxGBPosition& pos, const wxGBSpan& span); + + // Get the row and column of the endpoint of this item + void GetEndPos(int& row, int& col); + + + wxGridBagSizer* GetGBSizer() const { return m_gbsizer; } + void SetGBSizer(wxGridBagSizer* sizer) { m_gbsizer = sizer; } + + +protected: + wxGBPosition m_pos; + wxGBSpan m_span; + wxGridBagSizer* m_gbsizer; // so SetPos/SetSpan can check for intersects + + +private: + DECLARE_DYNAMIC_CLASS(wxGBSizerItem) + DECLARE_NO_COPY_CLASS(wxGBSizerItem) +}; + + +//--------------------------------------------------------------------------- +// wxGridBagSizer +//--------------------------------------------------------------------------- + + +class WXDLLEXPORT wxGridBagSizer : public wxFlexGridSizer +{ +public: + wxGridBagSizer(int vgap = 0, int hgap = 0 ); + + // The Add methods return true if the item was successfully placed at the + // given position, false if something was already there. + wxSizerItem* Add( wxWindow *window, + const wxGBPosition& pos, + const wxGBSpan& span = wxDefaultSpan, + int flag = 0, + int border = 0, + wxObject* userData = NULL ); + wxSizerItem* Add( wxSizer *sizer, + const wxGBPosition& pos, + const wxGBSpan& span = wxDefaultSpan, + int flag = 0, + int border = 0, + wxObject* userData = NULL ); + wxSizerItem* Add( int width, + int height, + const wxGBPosition& pos, + const wxGBSpan& span = wxDefaultSpan, + int flag = 0, + int border = 0, + wxObject* userData = NULL ); + wxSizerItem* Add( wxGBSizerItem *item ); + + + // Get/Set the size used for cells in the grid with no item. + wxSize GetEmptyCellSize() const { return m_emptyCellSize; } + void SetEmptyCellSize(const wxSize& sz) { m_emptyCellSize = sz; } + + // Get the size of the specified cell, including hgap and vgap. Only + // valid after a Layout. + wxSize GetCellSize(int row, int col) const; + + // Get the grid position of the specified item (non-recursive) + wxGBPosition GetItemPosition(wxWindow *window); + wxGBPosition GetItemPosition(wxSizer *sizer); + wxGBPosition GetItemPosition(size_t index); + + // Set the grid position of the specified item. Returns true on success. + // If the move is not allowed (because an item is already there) then + // false is returned. (non-recursive) + bool SetItemPosition(wxWindow *window, const wxGBPosition& pos); + bool SetItemPosition(wxSizer *sizer, const wxGBPosition& pos); + bool SetItemPosition(size_t index, const wxGBPosition& pos); + + // Get the row/col spanning of the specified item (non-recursive) + wxGBSpan GetItemSpan(wxWindow *window); + wxGBSpan GetItemSpan(wxSizer *sizer); + wxGBSpan GetItemSpan(size_t index); + + // Set the row/col spanning of the specified item. Returns true on + // success. If the move is not allowed (because an item is already there) + // then false is returned. (non-recursive) + bool SetItemSpan(wxWindow *window, const wxGBSpan& span); + bool SetItemSpan(wxSizer *sizer, const wxGBSpan& span); + bool SetItemSpan(size_t index, const wxGBSpan& span); + + + // Find the sizer item for the given window or subsizer, returns NULL if + // not found. (non-recursive) + wxGBSizerItem* FindItem(wxWindow* window); + wxGBSizerItem* FindItem(wxSizer* sizer); + + + // Return the sizer item for the given grid cell, or NULL if there is no + // item at that position. (non-recursive) + wxGBSizerItem* FindItemAtPosition(const wxGBPosition& pos); + + + // Return the sizer item located at the point given in pt, or NULL if + // there is no item at that point. The (x,y) coordinates in pt correspond + // to the client coordinates of the window using the sizer for + // layout. (non-recursive) + wxGBSizerItem* FindItemAtPoint(const wxPoint& pt); + + + // Return the sizer item that has a matching user data (it only compares + // pointer values) or NULL if not found. (non-recursive) + wxGBSizerItem* FindItemWithData(const wxObject* userData); + + + // These are what make the sizer do size calculations and layout + virtual void RecalcSizes(); + virtual wxSize CalcMin(); + + + // Look at all items and see if any intersect (or would overlap) the given + // item. Returns true if so, false if there would be no overlap. If an + // excludeItem is given then it will not be checked for intersection, for + // example it may be the item we are checking the position of. + bool CheckForIntersection(wxGBSizerItem* item, wxGBSizerItem* excludeItem = NULL); + bool CheckForIntersection(const wxGBPosition& pos, const wxGBSpan& span, wxGBSizerItem* excludeItem = NULL); + + + // The Add base class virtuals should not be used with this class, but + // we'll try to make them automatically select a location for the item + // anyway. + virtual wxSizerItem* Add( wxWindow *window, int proportion = 0, int flag = 0, int border = 0, wxObject* userData = NULL ); + virtual wxSizerItem* Add( wxSizer *sizer, int proportion = 0, int flag = 0, int border = 0, wxObject* userData = NULL ); + virtual wxSizerItem* Add( int width, int height, int proportion = 0, int flag = 0, int border = 0, wxObject* userData = NULL ); + + // The Insert and Prepend base class virtuals that are not appropriate for + // this class and should not be used. Their implementation in this class + // simply fails. + virtual wxSizerItem* Add( wxSizerItem *item ); + virtual wxSizerItem* Insert( size_t index, wxWindow *window, int proportion = 0, int flag = 0, int border = 0, wxObject* userData = NULL ); + virtual wxSizerItem* Insert( size_t index, wxSizer *sizer, int proportion = 0, int flag = 0, int border = 0, wxObject* userData = NULL ); + virtual wxSizerItem* Insert( size_t index, int width, int height, int proportion = 0, int flag = 0, int border = 0, wxObject* userData = NULL ); + virtual wxSizerItem* Insert( size_t index, wxSizerItem *item ); + virtual wxSizerItem* Prepend( wxWindow *window, int proportion = 0, int flag = 0, int border = 0, wxObject* userData = NULL ); + virtual wxSizerItem* Prepend( wxSizer *sizer, int proportion = 0, int flag = 0, int border = 0, wxObject* userData = NULL ); + virtual wxSizerItem* Prepend( int width, int height, int proportion = 0, int flag = 0, int border = 0, wxObject* userData = NULL ); + virtual wxSizerItem* Prepend( wxSizerItem *item ); + + +protected: + wxGBPosition FindEmptyCell(); + + wxSize m_emptyCellSize; + + +private: + + DECLARE_CLASS(wxGridBagSizer) + DECLARE_NO_COPY_CLASS(wxGridBagSizer) +}; + +//--------------------------------------------------------------------------- +#endif diff --git a/Externals/wxWidgets/include/wx/gdicmn.h b/Externals/wxWidgets/include/wx/gdicmn.h new file mode 100644 index 0000000000..2b9e71b053 --- /dev/null +++ b/Externals/wxWidgets/include/wx/gdicmn.h @@ -0,0 +1,755 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gdicmn.h +// Purpose: Common GDI classes, types and declarations +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: gdicmn.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GDICMNH__ +#define _WX_GDICMNH__ + +// --------------------------------------------------------------------------- +// headers +// --------------------------------------------------------------------------- + +#include "wx/defs.h" +#include "wx/list.h" +#include "wx/string.h" +#include "wx/fontenc.h" +#include "wx/hashmap.h" +#include "wx/math.h" + +// --------------------------------------------------------------------------- +// forward declarations +// --------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_CORE wxBitmap; +class WXDLLIMPEXP_FWD_CORE wxBrush; +class WXDLLIMPEXP_FWD_CORE wxColour; +class WXDLLIMPEXP_FWD_CORE wxCursor; +class WXDLLIMPEXP_FWD_CORE wxFont; +class WXDLLIMPEXP_FWD_CORE wxIcon; +class WXDLLIMPEXP_FWD_CORE wxPalette; +class WXDLLIMPEXP_FWD_CORE wxPen; +class WXDLLIMPEXP_FWD_CORE wxRegion; +class WXDLLIMPEXP_FWD_BASE wxString; + +// --------------------------------------------------------------------------- +// constants +// --------------------------------------------------------------------------- + +// Bitmap flags +enum wxBitmapType +{ + wxBITMAP_TYPE_INVALID, // should be == 0 for compatibility! + wxBITMAP_TYPE_BMP, + wxBITMAP_TYPE_BMP_RESOURCE, + wxBITMAP_TYPE_RESOURCE = wxBITMAP_TYPE_BMP_RESOURCE, + wxBITMAP_TYPE_ICO, + wxBITMAP_TYPE_ICO_RESOURCE, + wxBITMAP_TYPE_CUR, + wxBITMAP_TYPE_CUR_RESOURCE, + wxBITMAP_TYPE_XBM, + wxBITMAP_TYPE_XBM_DATA, + wxBITMAP_TYPE_XPM, + wxBITMAP_TYPE_XPM_DATA, + wxBITMAP_TYPE_TIF, + wxBITMAP_TYPE_TIF_RESOURCE, + wxBITMAP_TYPE_GIF, + wxBITMAP_TYPE_GIF_RESOURCE, + wxBITMAP_TYPE_PNG, + wxBITMAP_TYPE_PNG_RESOURCE, + wxBITMAP_TYPE_JPEG, + wxBITMAP_TYPE_JPEG_RESOURCE, + wxBITMAP_TYPE_PNM, + wxBITMAP_TYPE_PNM_RESOURCE, + wxBITMAP_TYPE_PCX, + wxBITMAP_TYPE_PCX_RESOURCE, + wxBITMAP_TYPE_PICT, + wxBITMAP_TYPE_PICT_RESOURCE, + wxBITMAP_TYPE_ICON, + wxBITMAP_TYPE_ICON_RESOURCE, + wxBITMAP_TYPE_ANI, + wxBITMAP_TYPE_IFF, + wxBITMAP_TYPE_TGA, + wxBITMAP_TYPE_MACCURSOR, + wxBITMAP_TYPE_MACCURSOR_RESOURCE, + wxBITMAP_TYPE_ANY = 50 +}; + +// Standard cursors +enum wxStockCursor +{ + wxCURSOR_NONE, // should be 0 + wxCURSOR_ARROW, + wxCURSOR_RIGHT_ARROW, + wxCURSOR_BULLSEYE, + wxCURSOR_CHAR, + wxCURSOR_CROSS, + wxCURSOR_HAND, + wxCURSOR_IBEAM, + wxCURSOR_LEFT_BUTTON, + wxCURSOR_MAGNIFIER, + wxCURSOR_MIDDLE_BUTTON, + wxCURSOR_NO_ENTRY, + wxCURSOR_PAINT_BRUSH, + wxCURSOR_PENCIL, + wxCURSOR_POINT_LEFT, + wxCURSOR_POINT_RIGHT, + wxCURSOR_QUESTION_ARROW, + wxCURSOR_RIGHT_BUTTON, + wxCURSOR_SIZENESW, + wxCURSOR_SIZENS, + wxCURSOR_SIZENWSE, + wxCURSOR_SIZEWE, + wxCURSOR_SIZING, + wxCURSOR_SPRAYCAN, + wxCURSOR_WAIT, + wxCURSOR_WATCH, + wxCURSOR_BLANK, +#ifdef __WXGTK__ + wxCURSOR_DEFAULT, // standard X11 cursor +#endif +#ifdef __WXMAC__ + wxCURSOR_COPY_ARROW , // MacOS Theme Plus arrow +#endif +#ifdef __X__ + // Not yet implemented for Windows + wxCURSOR_CROSS_REVERSE, + wxCURSOR_DOUBLE_ARROW, + wxCURSOR_BASED_ARROW_UP, + wxCURSOR_BASED_ARROW_DOWN, +#endif // X11 + + wxCURSOR_ARROWWAIT, + + wxCURSOR_MAX +}; + +#ifndef __WXGTK__ + #define wxCURSOR_DEFAULT wxCURSOR_ARROW +#endif + +// --------------------------------------------------------------------------- +// macros +// --------------------------------------------------------------------------- + +/* Useful macro for creating icons portably, for example: + + wxIcon *icon = new wxICON(mondrian); + + expands into: + + wxIcon *icon = new wxIcon("mondrian"); // On wxMSW + wxIcon *icon = new wxIcon(mondrian_xpm); // On wxGTK + */ + +#ifdef __WXMSW__ + // Load from a resource + #define wxICON(X) wxIcon(wxT(#X)) +#elif defined(__WXPM__) + // Load from a resource + #define wxICON(X) wxIcon(wxT(#X)) +#elif defined(__WXMGL__) + // Initialize from an included XPM + #define wxICON(X) wxIcon( (const char**) X##_xpm ) +#elif defined(__WXDFB__) + // Initialize from an included XPM + #define wxICON(X) wxIcon( (const char**) X##_xpm ) +#elif defined(__WXGTK__) + // Initialize from an included XPM + #define wxICON(X) wxIcon( (const char**) X##_xpm ) +#elif defined(__WXMAC__) + // Initialize from an included XPM + #define wxICON(X) wxIcon( (const char**) X##_xpm ) +#elif defined(__WXMOTIF__) + // Initialize from an included XPM + #define wxICON(X) wxIcon( X##_xpm ) +#elif defined(__WXX11__) + // Initialize from an included XPM + #define wxICON(X) wxIcon( X##_xpm ) +#else + // This will usually mean something on any platform + #define wxICON(X) wxIcon(wxT(#X)) +#endif // platform + +/* Another macro: this one is for portable creation of bitmaps. We assume that + under Unix bitmaps live in XPMs and under Windows they're in ressources. + */ + +#if defined(__WXMSW__) || defined(__WXPM__) + #define wxBITMAP(name) wxBitmap(wxT(#name), wxBITMAP_TYPE_RESOURCE) +#elif defined(__WXGTK__) || \ + defined(__WXMOTIF__) || \ + defined(__WXX11__) || \ + defined(__WXMAC__) || \ + defined(__WXMGL__) || \ + defined(__WXDFB__) || \ + defined(__WXCOCOA__) + // Initialize from an included XPM + #define wxBITMAP(name) wxBitmap( (const char**) name##_xpm ) +#else // other platforms + #define wxBITMAP(name) wxBitmap(name##_xpm, wxBITMAP_TYPE_XPM) +#endif // platform + +// =========================================================================== +// classes +// =========================================================================== + +// --------------------------------------------------------------------------- +// wxSize +// --------------------------------------------------------------------------- + +class WXDLLEXPORT wxSize +{ +public: + // members are public for compatibility, don't use them directly. + int x, y; + + // constructors + wxSize() : x(0), y(0) { } + wxSize(int xx, int yy) : x(xx), y(yy) { } + + // no copy ctor or assignment operator - the defaults are ok + + bool operator==(const wxSize& sz) const { return x == sz.x && y == sz.y; } + bool operator!=(const wxSize& sz) const { return x != sz.x || y != sz.y; } + + wxSize operator+(const wxSize& sz) const { return wxSize(x + sz.x, y + sz.y); } + wxSize operator-(const wxSize& sz) const { return wxSize(x - sz.x, y - sz.y); } + wxSize operator/(int i) const { return wxSize(x / i, y / i); } + wxSize operator*(int i) const { return wxSize(x * i, y * i); } + + wxSize& operator+=(const wxSize& sz) { x += sz.x; y += sz.y; return *this; } + wxSize& operator-=(const wxSize& sz) { x -= sz.x; y -= sz.y; return *this; } + wxSize& operator/=(const int i) { x /= i; y /= i; return *this; } + wxSize& operator*=(const int i) { x *= i; y *= i; return *this; } + + void IncTo(const wxSize& sz) + { if ( sz.x > x ) x = sz.x; if ( sz.y > y ) y = sz.y; } + void DecTo(const wxSize& sz) + { if ( sz.x < x ) x = sz.x; if ( sz.y < y ) y = sz.y; } + + void IncBy(int dx, int dy) { x += dx; y += dy; } + void IncBy(const wxSize& sz) { IncBy(sz.x, sz.y); } + void IncBy(int d) { IncBy(d, d); } + + void DecBy(int dx, int dy) { IncBy(-dx, -dy); } + void DecBy(const wxSize& sz) { DecBy(sz.x, sz.y); } + void DecBy(int d) { DecBy(d, d); } + + + wxSize& Scale(float xscale, float yscale) + { x = (int)(x*xscale); y = (int)(y*yscale); return *this; } + + // accessors + void Set(int xx, int yy) { x = xx; y = yy; } + void SetWidth(int w) { x = w; } + void SetHeight(int h) { y = h; } + + int GetWidth() const { return x; } + int GetHeight() const { return y; } + + bool IsFullySpecified() const { return x != wxDefaultCoord && y != wxDefaultCoord; } + + // combine this size with the other one replacing the default (i.e. equal + // to wxDefaultCoord) components of this object with those of the other + void SetDefaults(const wxSize& size) + { + if ( x == wxDefaultCoord ) + x = size.x; + if ( y == wxDefaultCoord ) + y = size.y; + } + + // compatibility + int GetX() const { return x; } + int GetY() const { return y; } +}; + +// --------------------------------------------------------------------------- +// Point classes: with real or integer coordinates +// --------------------------------------------------------------------------- + +class WXDLLEXPORT wxRealPoint +{ +public: + double x; + double y; + + wxRealPoint() : x(0.0), y(0.0) { } + wxRealPoint(double xx, double yy) : x(xx), y(yy) { } + + wxRealPoint operator+(const wxRealPoint& pt) const { return wxRealPoint(x + pt.x, y + pt.y); } + wxRealPoint operator-(const wxRealPoint& pt) const { return wxRealPoint(x - pt.x, y - pt.y); } + + bool operator==(const wxRealPoint& pt) const + { + return wxIsSameDouble(x, pt.x) && wxIsSameDouble(y, pt.y); + } + bool operator!=(const wxRealPoint& pt) const { return !(*this == pt); } +}; + + +class WXDLLEXPORT wxPoint +{ +public: + int x, y; + + wxPoint() : x(0), y(0) { } + wxPoint(int xx, int yy) : x(xx), y(yy) { } + + // no copy ctor or assignment operator - the defaults are ok + + // comparison + bool operator==(const wxPoint& p) const { return x == p.x && y == p.y; } + bool operator!=(const wxPoint& p) const { return !(*this == p); } + + // arithmetic operations (component wise) + wxPoint operator+(const wxPoint& p) const { return wxPoint(x + p.x, y + p.y); } + wxPoint operator-(const wxPoint& p) const { return wxPoint(x - p.x, y - p.y); } + + wxPoint& operator+=(const wxPoint& p) { x += p.x; y += p.y; return *this; } + wxPoint& operator-=(const wxPoint& p) { x -= p.x; y -= p.y; return *this; } + + wxPoint& operator+=(const wxSize& s) { x += s.GetWidth(); y += s.GetHeight(); return *this; } + wxPoint& operator-=(const wxSize& s) { x -= s.GetWidth(); y -= s.GetHeight(); return *this; } + + wxPoint operator+(const wxSize& s) const { return wxPoint(x + s.GetWidth(), y + s.GetHeight()); } + wxPoint operator-(const wxSize& s) const { return wxPoint(x - s.GetWidth(), y - s.GetHeight()); } + + wxPoint operator-() const { return wxPoint(-x, -y); } +}; + +// --------------------------------------------------------------------------- +// wxRect +// --------------------------------------------------------------------------- + +class WXDLLEXPORT wxRect +{ +public: + wxRect() + : x(0), y(0), width(0), height(0) + { } + wxRect(int xx, int yy, int ww, int hh) + : x(xx), y(yy), width(ww), height(hh) + { } + wxRect(const wxPoint& topLeft, const wxPoint& bottomRight); + wxRect(const wxPoint& pt, const wxSize& size) + : x(pt.x), y(pt.y), width(size.x), height(size.y) + { } + wxRect(const wxSize& size) + : x(0), y(0), width(size.x), height(size.y) + { } + + // default copy ctor and assignment operators ok + + int GetX() const { return x; } + void SetX(int xx) { x = xx; } + + int GetY() const { return y; } + void SetY(int yy) { y = yy; } + + int GetWidth() const { return width; } + void SetWidth(int w) { width = w; } + + int GetHeight() const { return height; } + void SetHeight(int h) { height = h; } + + wxPoint GetPosition() const { return wxPoint(x, y); } + void SetPosition( const wxPoint &p ) { x = p.x; y = p.y; } + + wxSize GetSize() const { return wxSize(width, height); } + void SetSize( const wxSize &s ) { width = s.GetWidth(); height = s.GetHeight(); } + + bool IsEmpty() const { return (width <= 0) || (height <= 0); } + + int GetLeft() const { return x; } + int GetTop() const { return y; } + int GetBottom() const { return y + height - 1; } + int GetRight() const { return x + width - 1; } + + void SetLeft(int left) { x = left; } + void SetRight(int right) { width = right - x + 1; } + void SetTop(int top) { y = top; } + void SetBottom(int bottom) { height = bottom - y + 1; } + + wxPoint GetTopLeft() const { return GetPosition(); } + wxPoint GetLeftTop() const { return GetTopLeft(); } + void SetTopLeft(const wxPoint &p) { SetPosition(p); } + void SetLeftTop(const wxPoint &p) { SetTopLeft(p); } + + wxPoint GetBottomRight() const { return wxPoint(GetRight(), GetBottom()); } + wxPoint GetRightBottom() const { return GetBottomRight(); } + void SetBottomRight(const wxPoint &p) { SetRight(p.x); SetBottom(p.y); } + void SetRightBottom(const wxPoint &p) { SetBottomRight(p); } + + wxPoint GetTopRight() const { return wxPoint(GetRight(), GetTop()); } + wxPoint GetRightTop() const { return GetTopRight(); } + void SetTopRight(const wxPoint &p) { SetRight(p.x); SetTop(p.y); } + void SetRightTop(const wxPoint &p) { SetTopLeft(p); } + + wxPoint GetBottomLeft() const { return wxPoint(GetLeft(), GetBottom()); } + wxPoint GetLeftBottom() const { return GetBottomLeft(); } + void SetBottomLeft(const wxPoint &p) { SetLeft(p.x); SetBottom(p.y); } + void SetLeftBottom(const wxPoint &p) { SetBottomLeft(p); } + + // operations with rect + wxRect& Inflate(wxCoord dx, wxCoord dy); + wxRect& Inflate(const wxSize& d) { return Inflate(d.x, d.y); } + wxRect& Inflate(wxCoord d) { return Inflate(d, d); } + wxRect Inflate(wxCoord dx, wxCoord dy) const + { + wxRect r = *this; + r.Inflate(dx, dy); + return r; + } + + wxRect& Deflate(wxCoord dx, wxCoord dy) { return Inflate(-dx, -dy); } + wxRect& Deflate(const wxSize& d) { return Inflate(-d.x, -d.y); } + wxRect& Deflate(wxCoord d) { return Inflate(-d); } + wxRect Deflate(wxCoord dx, wxCoord dy) const + { + wxRect r = *this; + r.Deflate(dx, dy); + return r; + } + + void Offset(wxCoord dx, wxCoord dy) { x += dx; y += dy; } + void Offset(const wxPoint& pt) { Offset(pt.x, pt.y); } + + wxRect& Intersect(const wxRect& rect); + wxRect Intersect(const wxRect& rect) const + { + wxRect r = *this; + r.Intersect(rect); + return r; + } + + wxRect& Union(const wxRect& rect); + wxRect Union(const wxRect& rect) const + { + wxRect r = *this; + r.Union(rect); + return r; + } + + // compare rectangles + bool operator==(const wxRect& rect) const; + bool operator!=(const wxRect& rect) const { return !(*this == rect); } + + // return true if the point is (not strcitly) inside the rect + bool Contains(int x, int y) const; + bool Contains(const wxPoint& pt) const { return Contains(pt.x, pt.y); } + // return true if the rectangle is (not strcitly) inside the rect + bool Contains(const wxRect& rect) const; + +#if WXWIN_COMPATIBILITY_2_6 + // use Contains() instead + wxDEPRECATED( bool Inside(int x, int y) const ); + wxDEPRECATED( bool Inside(const wxPoint& pt) const ); + wxDEPRECATED( bool Inside(const wxRect& rect) const ); +#endif // WXWIN_COMPATIBILITY_2_6 + + // return true if the rectangles have a non empty intersection + bool Intersects(const wxRect& rect) const; + + + // these are like Union() but don't ignore empty rectangles + wxRect operator+(const wxRect& rect) const; + wxRect& operator+=(const wxRect& rect) + { + *this = *this + rect; + return *this; + } + + + // centre this rectangle in the given (usually, but not necessarily, + // larger) one + wxRect CentreIn(const wxRect& r, int dir = wxBOTH) const + { + return wxRect(dir & wxHORIZONTAL ? r.x + (r.width - width)/2 : x, + dir & wxVERTICAL ? r.y + (r.height - height)/2 : y, + width, height); + } + + wxRect CenterIn(const wxRect& r, int dir = wxBOTH) const + { + return CentreIn(r, dir); + } + +public: + int x, y, width, height; +}; + +#if WXWIN_COMPATIBILITY_2_6 +inline bool wxRect::Inside(int cx, int cy) const { return Contains(cx, cy); } +inline bool wxRect::Inside(const wxPoint& pt) const { return Contains(pt); } +inline bool wxRect::Inside(const wxRect& rect) const { return Contains(rect); } +#endif // WXWIN_COMPATIBILITY_2_6 + + +// --------------------------------------------------------------------------- +// Management of pens, brushes and fonts +// --------------------------------------------------------------------------- + +typedef wxInt8 wxDash; + +class WXDLLIMPEXP_CORE wxGDIObjListBase { +public: + wxGDIObjListBase(); + ~wxGDIObjListBase(); + +protected: + wxList list; +}; + +class WXDLLIMPEXP_CORE wxPenList: public wxGDIObjListBase +{ +public: + wxPen *FindOrCreatePen(const wxColour& colour, int width, int style); +#if WXWIN_COMPATIBILITY_2_6 + wxDEPRECATED( void AddPen(wxPen*) ); + wxDEPRECATED( void RemovePen(wxPen*) ); +#endif +}; + +class WXDLLIMPEXP_CORE wxBrushList: public wxGDIObjListBase +{ +public: + wxBrush *FindOrCreateBrush(const wxColour& colour, int style = wxSOLID); +#if WXWIN_COMPATIBILITY_2_6 + wxDEPRECATED( void AddBrush(wxBrush*) ); + wxDEPRECATED( void RemoveBrush(wxBrush*) ); +#endif +}; + +class WXDLLIMPEXP_CORE wxFontList: public wxGDIObjListBase +{ +public: + wxFont *FindOrCreateFont(int pointSize, int family, int style, int weight, + bool underline = false, + const wxString& face = wxEmptyString, + wxFontEncoding encoding = wxFONTENCODING_DEFAULT); +#if WXWIN_COMPATIBILITY_2_6 + wxDEPRECATED( void AddFont(wxFont*) ); + wxDEPRECATED( void RemoveFont(wxFont*) ); +#endif +}; + +WX_DECLARE_STRING_HASH_MAP(wxColour*, wxStringToColourHashMap); + +class WXDLLEXPORT wxColourDatabase +{ +public: + wxColourDatabase(); + ~wxColourDatabase(); + + // find colour by name or name for the given colour + wxColour Find(const wxString& name) const; + wxString FindName(const wxColour& colour) const; + + // add a new colour to the database + void AddColour(const wxString& name, const wxColour& colour); + +#if WXWIN_COMPATIBILITY_2_6 + // deprecated, use Find() instead + wxDEPRECATED( wxColour *FindColour(const wxString& name) ); +#endif // WXWIN_COMPATIBILITY_2_6 + + +#ifdef __WXPM__ + // PM keeps its own type of colour table + long* m_palTable; + size_t m_nSize; +#endif + +private: + // load the database with the built in colour values when called for the + // first time, do nothing after this + void Initialize(); + + wxStringToColourHashMap *m_map; +}; + +class WXDLLEXPORT wxResourceCache: public wxList +{ +public: + wxResourceCache() { } +#if !wxUSE_STL + wxResourceCache(const unsigned int keyType) : wxList(keyType) { } +#endif + virtual ~wxResourceCache(); +}; + +// --------------------------------------------------------------------------- +// global variables +// --------------------------------------------------------------------------- + +// Lists of GDI objects +extern WXDLLEXPORT_DATA(wxPenList*) wxThePenList; +extern WXDLLEXPORT_DATA(wxBrushList*) wxTheBrushList; +extern WXDLLEXPORT_DATA(wxFontList*) wxTheFontList; + +/* Stock objects + + wxStockGDI creates the stock GDI objects on demand. Pointers to the + created objects are stored in the ms_stockObject array, which is indexed + by the Item enum values. Platorm-specific fonts can be created by + implementing a derived class with an override for the GetFont function. + wxStockGDI operates as a singleton, accessed through the ms_instance + pointer. By default this pointer is set to an instance of wxStockGDI. + A derived class must arrange to set this pointer to an instance of itself. +*/ +class WXDLLIMPEXP_CORE wxStockGDI +{ +public: + enum Item { + BRUSH_BLACK, + BRUSH_BLUE, + BRUSH_CYAN, + BRUSH_GREEN, + BRUSH_GREY, + BRUSH_LIGHTGREY, + BRUSH_MEDIUMGREY, + BRUSH_RED, + BRUSH_TRANSPARENT, + BRUSH_WHITE, + COLOUR_BLACK, + COLOUR_BLUE, + COLOUR_CYAN, + COLOUR_GREEN, + COLOUR_LIGHTGREY, + COLOUR_RED, + COLOUR_WHITE, + CURSOR_CROSS, + CURSOR_HOURGLASS, + CURSOR_STANDARD, + FONT_ITALIC, + FONT_NORMAL, + FONT_SMALL, + FONT_SWISS, + PEN_BLACK, + PEN_BLACKDASHED, + PEN_CYAN, + PEN_GREEN, + PEN_GREY, + PEN_LIGHTGREY, + PEN_MEDIUMGREY, + PEN_RED, + PEN_TRANSPARENT, + PEN_WHITE, + ITEMCOUNT + }; + + wxStockGDI(); + virtual ~wxStockGDI(); + static void DeleteAll(); + + static wxStockGDI& instance() { return *ms_instance; } + + static const wxBrush* GetBrush(Item item); + static const wxColour* GetColour(Item item); + static const wxCursor* GetCursor(Item item); + // Can be overridden by platform-specific derived classes + virtual const wxFont* GetFont(Item item); + static const wxPen* GetPen(Item item); + +protected: + static wxStockGDI* ms_instance; + + static wxObject* ms_stockObject[ITEMCOUNT]; + + DECLARE_NO_COPY_CLASS(wxStockGDI) +}; + +#define wxITALIC_FONT wxStockGDI::instance().GetFont(wxStockGDI::FONT_ITALIC) +#define wxNORMAL_FONT wxStockGDI::instance().GetFont(wxStockGDI::FONT_NORMAL) +#define wxSMALL_FONT wxStockGDI::instance().GetFont(wxStockGDI::FONT_SMALL) +#define wxSWISS_FONT wxStockGDI::instance().GetFont(wxStockGDI::FONT_SWISS) + +#define wxBLACK_DASHED_PEN wxStockGDI::GetPen(wxStockGDI::PEN_BLACKDASHED) +#define wxBLACK_PEN wxStockGDI::GetPen(wxStockGDI::PEN_BLACK) +#define wxCYAN_PEN wxStockGDI::GetPen(wxStockGDI::PEN_CYAN) +#define wxGREEN_PEN wxStockGDI::GetPen(wxStockGDI::PEN_GREEN) +#define wxGREY_PEN wxStockGDI::GetPen(wxStockGDI::PEN_GREY) +#define wxLIGHT_GREY_PEN wxStockGDI::GetPen(wxStockGDI::PEN_LIGHTGREY) +#define wxMEDIUM_GREY_PEN wxStockGDI::GetPen(wxStockGDI::PEN_MEDIUMGREY) +#define wxRED_PEN wxStockGDI::GetPen(wxStockGDI::PEN_RED) +#define wxTRANSPARENT_PEN wxStockGDI::GetPen(wxStockGDI::PEN_TRANSPARENT) +#define wxWHITE_PEN wxStockGDI::GetPen(wxStockGDI::PEN_WHITE) + +#define wxBLACK_BRUSH wxStockGDI::GetBrush(wxStockGDI::BRUSH_BLACK) +#define wxBLUE_BRUSH wxStockGDI::GetBrush(wxStockGDI::BRUSH_BLUE) +#define wxCYAN_BRUSH wxStockGDI::GetBrush(wxStockGDI::BRUSH_CYAN) +#define wxGREEN_BRUSH wxStockGDI::GetBrush(wxStockGDI::BRUSH_GREEN) +#define wxGREY_BRUSH wxStockGDI::GetBrush(wxStockGDI::BRUSH_GREY) +#define wxLIGHT_GREY_BRUSH wxStockGDI::GetBrush(wxStockGDI::BRUSH_LIGHTGREY) +#define wxMEDIUM_GREY_BRUSH wxStockGDI::GetBrush(wxStockGDI::BRUSH_MEDIUMGREY) +#define wxRED_BRUSH wxStockGDI::GetBrush(wxStockGDI::BRUSH_RED) +#define wxTRANSPARENT_BRUSH wxStockGDI::GetBrush(wxStockGDI::BRUSH_TRANSPARENT) +#define wxWHITE_BRUSH wxStockGDI::GetBrush(wxStockGDI::BRUSH_WHITE) + +#define wxBLACK wxStockGDI::GetColour(wxStockGDI::COLOUR_BLACK) +#define wxBLUE wxStockGDI::GetColour(wxStockGDI::COLOUR_BLUE) +#define wxCYAN wxStockGDI::GetColour(wxStockGDI::COLOUR_CYAN) +#define wxGREEN wxStockGDI::GetColour(wxStockGDI::COLOUR_GREEN) +#define wxLIGHT_GREY wxStockGDI::GetColour(wxStockGDI::COLOUR_LIGHTGREY) +#define wxRED wxStockGDI::GetColour(wxStockGDI::COLOUR_RED) +#define wxWHITE wxStockGDI::GetColour(wxStockGDI::COLOUR_WHITE) + +#define wxCROSS_CURSOR wxStockGDI::GetCursor(wxStockGDI::CURSOR_CROSS) +#define wxHOURGLASS_CURSOR wxStockGDI::GetCursor(wxStockGDI::CURSOR_HOURGLASS) +#define wxSTANDARD_CURSOR wxStockGDI::GetCursor(wxStockGDI::CURSOR_STANDARD) + +// 'Null' objects +extern WXDLLEXPORT_DATA(wxBitmap) wxNullBitmap; +extern WXDLLEXPORT_DATA(wxIcon) wxNullIcon; +extern WXDLLEXPORT_DATA(wxCursor) wxNullCursor; +extern WXDLLEXPORT_DATA(wxPen) wxNullPen; +extern WXDLLEXPORT_DATA(wxBrush) wxNullBrush; +extern WXDLLEXPORT_DATA(wxPalette) wxNullPalette; +extern WXDLLEXPORT_DATA(wxFont) wxNullFont; +extern WXDLLEXPORT_DATA(wxColour) wxNullColour; + +extern WXDLLEXPORT_DATA(wxColourDatabase*) wxTheColourDatabase; + +extern WXDLLEXPORT_DATA(const wxChar) wxPanelNameStr[]; + +extern WXDLLEXPORT_DATA(const wxSize) wxDefaultSize; +extern WXDLLEXPORT_DATA(const wxPoint) wxDefaultPosition; + +// --------------------------------------------------------------------------- +// global functions +// --------------------------------------------------------------------------- + +// resource management +extern void WXDLLEXPORT wxInitializeStockLists(); +extern void WXDLLEXPORT wxDeleteStockLists(); + +// is the display colour (or monochrome)? +extern bool WXDLLEXPORT wxColourDisplay(); + +// Returns depth of screen +extern int WXDLLEXPORT wxDisplayDepth(); +#define wxGetDisplayDepth wxDisplayDepth + +// get the display size +extern void WXDLLEXPORT wxDisplaySize(int *width, int *height); +extern wxSize WXDLLEXPORT wxGetDisplaySize(); +extern void WXDLLEXPORT wxDisplaySizeMM(int *width, int *height); +extern wxSize WXDLLEXPORT wxGetDisplaySizeMM(); + +// Get position and size of the display workarea +extern void WXDLLEXPORT wxClientDisplayRect(int *x, int *y, int *width, int *height); +extern wxRect WXDLLEXPORT wxGetClientDisplayRect(); + +// set global cursor +extern void WXDLLEXPORT wxSetCursor(const wxCursor& cursor); + +#endif + // _WX_GDICMNH__ diff --git a/Externals/wxWidgets/include/wx/gdiobj.h b/Externals/wxWidgets/include/wx/gdiobj.h new file mode 100644 index 0000000000..b4dab27741 --- /dev/null +++ b/Externals/wxWidgets/include/wx/gdiobj.h @@ -0,0 +1,51 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gdiobj.h +// Purpose: wxGDIObject base header +// Author: Julian Smart +// Modified by: +// Created: +// Copyright: (c) Julian Smart +// RCS-ID: $Id: gdiobj.h 42211 2006-10-21 17:19:11Z SN $ +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GDIOBJ_H_BASE_ +#define _WX_GDIOBJ_H_BASE_ + +#include "wx/object.h" + +// ---------------------------------------------------------------------------- +// wxGDIRefData is the base class for wxXXXData structures which contain the +// real data for the GDI object and are shared among all wxWin objects sharing +// the same native GDI object +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxGDIRefData: public wxObjectRefData { }; + +// ---------------------------------------------------------------------------- +// wxGDIObject +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxGDIObject: public wxObject +{ +public: + bool IsNull() const { return m_refData == NULL; } + +#if defined(__WXMSW__) || defined(__WXPM__) || defined(__WXPALMOS__) + // Creates the resource + virtual bool RealizeResource() { return false; } + + // Frees the resource + virtual bool FreeResource(bool WXUNUSED(force) = false) { return false; } + + virtual bool IsFree() const { return false; } + + // Returns handle. + virtual WXHANDLE GetResourceHandle() const { return 0; } +#endif // defined(__WXMSW__) || defined(__WXPM__) + + DECLARE_DYNAMIC_CLASS(wxGDIObject) +}; + +#endif + // _WX_GDIOBJ_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/generic/aboutdlgg.h b/Externals/wxWidgets/include/wx/generic/aboutdlgg.h new file mode 100644 index 0000000000..a20e4acf0c --- /dev/null +++ b/Externals/wxWidgets/include/wx/generic/aboutdlgg.h @@ -0,0 +1,87 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/aboutdlgg.h +// Purpose: generic wxAboutBox() implementation +// Author: Vadim Zeitlin +// Created: 2006-10-07 +// RCS-ID: $Id: aboutdlgg.h 49804 2007-11-10 01:09:42Z VZ $ +// Copyright: (c) 2006 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GENERIC_ABOUTDLGG_H_ +#define _WX_GENERIC_ABOUTDLGG_H_ + +#include "wx/defs.h" + +#if wxUSE_ABOUTDLG + +#include "wx/dialog.h" + +class WXDLLIMPEXP_FWD_ADV wxAboutDialogInfo; +class WXDLLIMPEXP_FWD_CORE wxSizer; +class WXDLLIMPEXP_FWD_CORE wxSizerFlags; + +// ---------------------------------------------------------------------------- +// wxGenericAboutDialog: generic "About" dialog implementation +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxGenericAboutDialog : public wxDialog +{ +public: + // constructors and Create() method + // -------------------------------- + + // default ctor, you must use Create() to really initialize the dialog + wxGenericAboutDialog() { Init(); } + + // ctor which fully initializes the object + wxGenericAboutDialog(const wxAboutDialogInfo& info) + { + Init(); + + (void)Create(info); + } + + // this method must be called if and only if the default ctor was used + bool Create(const wxAboutDialogInfo& info); + +protected: + // this virtual method may be overridden to add some more controls to the + // dialog + // + // notice that for this to work you must call Create() from the derived + // class ctor and not use the base class ctor directly as otherwise the + // virtual function of the derived class wouldn't be called + virtual void DoAddCustomControls() { } + + // add arbitrary control to the text sizer contents with the specified + // flags + void AddControl(wxWindow *win, const wxSizerFlags& flags); + + // add arbitrary control to the text sizer contents and center it + void AddControl(wxWindow *win); + + // add the text, if it's not empty, to the text sizer contents + void AddText(const wxString& text); + +#if wxUSE_COLLPANE + // add a wxCollapsiblePane containing the given text + void AddCollapsiblePane(const wxString& title, const wxString& text); +#endif // wxUSE_COLLPANE + +private: + // common part of all ctors + void Init() { m_sizerText = NULL; } + + + wxSizer *m_sizerText; +}; + +// unlike wxAboutBox which can show either the native or generic about dialog, +// this function always shows the generic one +WXDLLIMPEXP_ADV void wxGenericAboutBox(const wxAboutDialogInfo& info); + +#endif // wxUSE_ABOUTDLG + +#endif // _WX_GENERIC_ABOUTDLGG_H_ + diff --git a/Externals/wxWidgets/include/wx/generic/accel.h b/Externals/wxWidgets/include/wx/generic/accel.h new file mode 100644 index 0000000000..2b8a8dde9a --- /dev/null +++ b/Externals/wxWidgets/include/wx/generic/accel.h @@ -0,0 +1,50 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/accel.h +// Purpose: wxAcceleratorTable class +// Author: Robert Roebling +// RCS-ID: $Id: accel.h 42752 2006-10-30 19:26:48Z VZ $ +// Copyright: (c) Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GENERIC_ACCEL_H_ +#define _WX_GENERIC_ACCEL_H_ + +class WXDLLEXPORT wxKeyEvent; + +// ---------------------------------------------------------------------------- +// wxAcceleratorTable +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxAcceleratorTable : public wxObject +{ +public: + wxAcceleratorTable(); + wxAcceleratorTable(int n, const wxAcceleratorEntry entries[]); + virtual ~wxAcceleratorTable(); + + bool Ok() const { return IsOk(); } + bool IsOk() const; + + void Add(const wxAcceleratorEntry& entry); + void Remove(const wxAcceleratorEntry& entry); + + // implementation + // -------------- + + wxMenuItem *GetMenuItem(const wxKeyEvent& event) const; + int GetCommand(const wxKeyEvent& event) const; + + const wxAcceleratorEntry *GetEntry(const wxKeyEvent& event) const; + +protected: + // ref counting code + virtual wxObjectRefData *CreateRefData() const; + virtual wxObjectRefData *CloneRefData(const wxObjectRefData *data) const; + +private: + DECLARE_DYNAMIC_CLASS(wxAcceleratorTable) +}; + +#endif // _WX_GENERIC_ACCEL_H_ + diff --git a/Externals/wxWidgets/include/wx/generic/animate.h b/Externals/wxWidgets/include/wx/generic/animate.h new file mode 100644 index 0000000000..5e1d2f8d23 --- /dev/null +++ b/Externals/wxWidgets/include/wx/generic/animate.h @@ -0,0 +1,173 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/animate.h +// Purpose: wxAnimation and wxAnimationCtrl +// Author: Julian Smart and Guillermo Rodriguez Garcia +// Modified by: Francesco Montorsi +// Created: 13/8/99 +// RCS-ID: $Id: animate.h 43898 2006-12-10 14:18:37Z VZ $ +// Copyright: (c) Julian Smart and Guillermo Rodriguez Garcia +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GENERIC_ANIMATEH__ +#define _WX_GENERIC_ANIMATEH__ + +#include "wx/bitmap.h" + +// ---------------------------------------------------------------------------- +// wxAnimation +// ---------------------------------------------------------------------------- + +WX_DECLARE_LIST_WITH_DECL(wxAnimationDecoder, wxAnimationDecoderList, class WXDLLIMPEXP_ADV); + +class WXDLLIMPEXP_ADV wxAnimation : public wxAnimationBase +{ +public: + virtual bool IsOk() const + { return m_refData != NULL; } + + virtual unsigned int GetFrameCount() const; + virtual int GetDelay(unsigned int i) const; + virtual wxImage GetFrame(unsigned int i) const; + virtual wxSize GetSize() const; + + virtual bool LoadFile(const wxString& filename, + wxAnimationType type = wxANIMATION_TYPE_ANY); + virtual bool Load(wxInputStream& stream, + wxAnimationType type = wxANIMATION_TYPE_ANY); + + // extended interface used by the generic implementation of wxAnimationCtrl + wxPoint GetFramePosition(unsigned int frame) const; + wxSize GetFrameSize(unsigned int frame) const; + wxAnimationDisposal GetDisposalMethod(unsigned int frame) const; + wxColour GetTransparentColour(unsigned int frame) const; + wxColour GetBackgroundColour() const; + +protected: + static wxAnimationDecoderList sm_handlers; + +public: + static inline wxAnimationDecoderList& GetHandlers() { return sm_handlers; } + static void AddHandler(wxAnimationDecoder *handler); + static void InsertHandler(wxAnimationDecoder *handler); + static const wxAnimationDecoder *FindHandler( wxAnimationType animType ); + + static void CleanUpHandlers(); + static void InitStandardHandlers(); + + DECLARE_DYNAMIC_CLASS(wxAnimation) +}; + + +// ---------------------------------------------------------------------------- +// wxAnimationCtrl +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxAnimationCtrl: public wxAnimationCtrlBase +{ +public: + wxAnimationCtrl() { Init(); } + wxAnimationCtrl(wxWindow *parent, + wxWindowID id, + const wxAnimation& anim = wxNullAnimation, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxAC_DEFAULT_STYLE, + const wxString& name = wxAnimationCtrlNameStr) + { + Init(); + + Create(parent, id, anim, pos, size, style, name); + } + + void Init(); + + bool Create(wxWindow *parent, wxWindowID id, + const wxAnimation& anim = wxNullAnimation, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxAC_DEFAULT_STYLE, + const wxString& name = wxAnimationCtrlNameStr); + + ~wxAnimationCtrl(); + +public: + virtual bool LoadFile(const wxString& filename, wxAnimationType type = wxANIMATION_TYPE_ANY); + + virtual void Stop(); + virtual bool Play() + { return Play(true /* looped */); } + virtual bool IsPlaying() const + { return m_isPlaying; } + + void SetAnimation(const wxAnimation &animation); + wxAnimation GetAnimation() const + { return m_animation; } + + virtual void SetInactiveBitmap(const wxBitmap &bmp); + + // override base class method + virtual bool SetBackgroundColour(const wxColour& col); + +public: // event handlers + + void OnPaint(wxPaintEvent& event); + void OnTimer(wxTimerEvent& event); + void OnSize(wxSizeEvent& event); + +public: // extended API specific to this implementation of wxAnimateCtrl + + // Specify whether the animation's background colour is to be shown (the default), + // or whether the window background should show through + void SetUseWindowBackgroundColour(bool useWinBackground = true) + { m_useWinBackgroundColour = useWinBackground; } + bool IsUsingWindowBackgroundColour() const + { return m_useWinBackgroundColour; } + + // This overload of Play() lets you specify if the animation must loop or not + bool Play(bool looped); + + // Draw the current frame of the animation into given DC. + // This is fast as current frame is always cached. + void DrawCurrentFrame(wxDC& dc); + + // Returns a wxBitmap with the current frame drawn in it + wxBitmap& GetBackingStore() + { return m_backingStore; } + +protected: // internal utilities + + // resize this control to fit m_animation + void FitToAnimation(); + + // Draw the background; use this when e.g. previous frame had wxANIM_TOBACKGROUND disposal. + void DisposeToBackground(); + void DisposeToBackground(wxDC& dc); + void DisposeToBackground(wxDC& dc, const wxPoint &pos, const wxSize &sz); + + void IncrementalUpdateBackingStore(); + bool RebuildBackingStoreUpToFrame(unsigned int); + void DrawFrame(wxDC &dc, unsigned int); + + virtual void DisplayStaticImage(); + virtual wxSize DoGetBestSize() const; + +protected: + unsigned int m_currentFrame; // Current frame + bool m_looped; // Looped, or not + wxTimer m_timer; // The timer + wxAnimation m_animation; // The animation + + bool m_isPlaying; // Is the animation playing? + bool m_useWinBackgroundColour; // Use animation bg colour or window bg colour? + + wxBitmap m_backingStore; // The frames are drawn here and then blitted + // on the screen + +private: + typedef wxAnimationCtrlBase base_type; + DECLARE_DYNAMIC_CLASS(wxAnimationCtrl) + DECLARE_EVENT_TABLE() +}; + +#endif // _WX_GENERIC_ANIMATEH__ diff --git a/Externals/wxWidgets/include/wx/generic/bmpcbox.h b/Externals/wxWidgets/include/wx/generic/bmpcbox.h new file mode 100644 index 0000000000..31f8b2e55d --- /dev/null +++ b/Externals/wxWidgets/include/wx/generic/bmpcbox.h @@ -0,0 +1,170 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/bmpcbox.h +// Purpose: wxBitmapComboBox +// Author: Jaakko Salli +// Modified by: +// Created: Aug-30-2006 +// RCS-ID: $Id: bmpcbox.h 42046 2006-10-16 09:30:01Z ABX $ +// Copyright: (c) Jaakko Salli +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GENERIC_BMPCBOX_H_ +#define _WX_GENERIC_BMPCBOX_H_ + + +#define wxGENERIC_BITMAPCOMBOBOX 1 + +#include "wx/odcombo.h" + +// ---------------------------------------------------------------------------- +// wxBitmapComboBox: a wxComboBox that allows images to be shown +// in front of string items. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxBitmapComboBox : public wxOwnerDrawnComboBox, + public wxBitmapComboBoxBase +{ +public: + + // ctors and such + wxBitmapComboBox() : wxOwnerDrawnComboBox(), wxBitmapComboBoxBase() + { + Init(); + } + + wxBitmapComboBox(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxString& value = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + int n = 0, + const wxString choices[] = NULL, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxBitmapComboBoxNameStr) + : wxOwnerDrawnComboBox(), + wxBitmapComboBoxBase() + { + Init(); + + (void)Create(parent, id, value, pos, size, n, + choices, style, validator, name); + } + + wxBitmapComboBox(wxWindow *parent, + wxWindowID id, + const wxString& value, + const wxPoint& pos, + const wxSize& size, + const wxArrayString& choices, + long style, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxBitmapComboBoxNameStr); + + bool Create(wxWindow *parent, + wxWindowID id, + const wxString& value, + const wxPoint& pos, + const wxSize& size, + int n, + const wxString choices[], + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxBitmapComboBoxNameStr); + + bool Create(wxWindow *parent, + wxWindowID id, + const wxString& value, + const wxPoint& pos, + const wxSize& size, + const wxArrayString& choices, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxBitmapComboBoxNameStr); + + virtual ~wxBitmapComboBox(); + + // Adds item with image to the end of the combo box. + int Append(const wxString& item, const wxBitmap& bitmap = wxNullBitmap) + { return DoAppendWithImage(item, bitmap); } + + int Append(const wxString& item, const wxBitmap& bitmap, void *clientData) + { int n = DoAppendWithImage(item, bitmap); SetClientData(n, clientData); return n; } + int Append(const wxString& item, const wxBitmap& bitmap, wxClientData *clientData) + { int n = DoAppendWithImage(item, bitmap); SetClientObject(n, clientData); return n; } + + // Returns size of image used in list. + virtual wxSize GetBitmapSize() const + { + return m_usedImgSize; + } + + // Returns the image of the item with the given index. + virtual wxBitmap GetItemBitmap(unsigned int n) const; + + // Inserts item with image into the list before pos. Not valid for wxCB_SORT or wxCB_SORT + // styles, use Append instead. + int Insert(const wxString& item, const wxBitmap& bitmap, unsigned int pos) + { return DoInsertWithImage(item, bitmap, pos); } + + int Insert(const wxString& item, const wxBitmap& bitmap, + unsigned int pos, void *clientData); + int Insert(const wxString& item, const wxBitmap& bitmap, + unsigned int pos, wxClientData *clientData); + + // Sets the image for the given item. + virtual void SetItemBitmap(unsigned int n, const wxBitmap& bitmap); + + virtual void Clear(); + virtual void Delete(unsigned int n); + +protected: + + virtual void OnDrawBackground(wxDC& dc, const wxRect& rect, int item, int flags) const; + virtual void OnDrawItem(wxDC& dc, const wxRect& rect, int item, int flags) const; + virtual wxCoord OnMeasureItem(size_t item) const; + virtual wxCoord OnMeasureItemWidth(size_t item) const; + + virtual int DoAppendWithImage(const wxString& item, const wxBitmap& bitmap); + virtual int DoInsertWithImage(const wxString& item, const wxBitmap& bitmap, + unsigned int pos); + + virtual int DoAppend(const wxString& item); + virtual int DoInsert(const wxString& item, unsigned int pos); + + virtual bool SetFont(const wxFont& font); + + virtual wxSize DoGetBestSize() const; + + // Event handlers + void OnSize(wxSizeEvent& event); + + // Recalculates amount of empty space needed in front of + // text in control itself. + void DetermineIndent(); + + bool OnAddBitmap(const wxBitmap& bitmap); + + // Adds image to position - called in Append/Insert before + // string is added. + bool DoInsertBitmap(const wxBitmap& image, unsigned int pos); + + + wxArrayPtrVoid m_bitmaps; // Images associated with items + wxSize m_usedImgSize; // Size of bitmaps + +private: + int m_imgAreaWidth; // Width and height of area next to text field + int m_fontHeight; + bool m_inResize; + + void Init(); + void PostCreate(); + + DECLARE_EVENT_TABLE() + + DECLARE_DYNAMIC_CLASS(wxBitmapComboBox) +}; + +#endif // _WX_GENERIC_BMPCBOX_H_ diff --git a/Externals/wxWidgets/include/wx/generic/busyinfo.h b/Externals/wxWidgets/include/wx/generic/busyinfo.h new file mode 100644 index 0000000000..b8fdd48663 --- /dev/null +++ b/Externals/wxWidgets/include/wx/generic/busyinfo.h @@ -0,0 +1,42 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/busyinfo.h +// Purpose: Information window (when app is busy) +// Author: Vaclav Slavik +// Copyright: (c) 1999 Vaclav Slavik +// RCS-ID: $Id: busyinfo.h 49804 2007-11-10 01:09:42Z VZ $ +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef __BUSYINFO_H__ +#define __BUSYINFO_H__ + +#include "wx/defs.h" + +#if wxUSE_BUSYINFO + +class WXDLLIMPEXP_FWD_CORE wxFrame; +class WXDLLIMPEXP_FWD_CORE wxWindow; + +//-------------------------------------------------------------------------------- +// wxBusyInfo +// Displays progress information +// Can be used in exactly same way as wxBusyCursor +//-------------------------------------------------------------------------------- + +class WXDLLEXPORT wxBusyInfo : public wxObject +{ +public: + wxBusyInfo(const wxString& message, wxWindow *parent = NULL); + + virtual ~wxBusyInfo(); + +private: + wxFrame *m_InfoFrame; + + DECLARE_NO_COPY_CLASS(wxBusyInfo) +}; + + +#endif // wxUSE_BUSYINFO + +#endif // __BUSYINFO_H__ diff --git a/Externals/wxWidgets/include/wx/generic/buttonbar.h b/Externals/wxWidgets/include/wx/generic/buttonbar.h new file mode 100644 index 0000000000..33741fc50e --- /dev/null +++ b/Externals/wxWidgets/include/wx/generic/buttonbar.h @@ -0,0 +1,123 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/buttonbar.h +// Purpose: wxButtonToolBar declaration +// Author: Julian Smart, after Robert Roebling, Vadim Zeitlin, SciTech +// Modified by: +// Created: 2006-04-13 +// Id: $Id: buttonbar.h 38714 2006-04-14 15:49:57Z JS $ +// Copyright: (c) Julian Smart, Robert Roebling, Vadim Zeitlin, +// SciTech Software, Inc. +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_BUTTONBAR_H_ +#define _WX_BUTTONBAR_H_ + +#include "wx/bmpbuttn.h" +#include "wx/toolbar.h" + +class WXDLLEXPORT wxButtonToolBarTool; + +// ---------------------------------------------------------------------------- +// wxButtonToolBar +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxButtonToolBar : public wxToolBarBase +{ +public: + // construction/destruction + wxButtonToolBar() { Init(); } + wxButtonToolBar(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxToolBarNameStr) + { + Init(); + + Create(parent, id, pos, size, style, name); + } + + bool Create( wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxToolBarNameStr ); + + virtual ~wxButtonToolBar(); + + virtual bool Realize(); + + virtual void SetToolShortHelp(int id, const wxString& helpString); + virtual wxToolBarToolBase *FindToolForPosition(wxCoord x, wxCoord y) const; + +protected: + // common part of all ctors + void Init(); + + // implement base class pure virtuals + virtual bool DoInsertTool(size_t pos, wxToolBarToolBase *tool); + virtual bool DoDeleteTool(size_t pos, wxToolBarToolBase *tool); + + virtual void DoEnableTool(wxToolBarToolBase *tool, bool enable); + virtual void DoToggleTool(wxToolBarToolBase *tool, bool toggle); + virtual void DoSetToggle(wxToolBarToolBase *tool, bool toggle); + + virtual wxToolBarToolBase *CreateTool(int id, + const wxString& label, + const wxBitmap& bmpNormal, + const wxBitmap& bmpDisabled, + wxItemKind kind, + wxObject *clientData, + const wxString& shortHelp, + const wxString& longHelp); + virtual wxToolBarToolBase *CreateTool(wxControl *control); + + virtual wxSize DoGetBestClientSize() const; + + // calculate layout + void DoLayout(); + + // get the bounding rect for the given tool + wxRect GetToolRect(wxToolBarToolBase *tool) const; + + // get the rect limits depending on the orientation: top/bottom for a + // vertical toolbar, left/right for a horizontal one + void GetRectLimits(const wxRect& rect, wxCoord *start, wxCoord *end) const; + + // receives button commands + void OnCommand(wxCommandEvent& event); + + // paints a border + void OnPaint(wxPaintEvent& event); + + // detects mouse clicks outside buttons + void OnLeftUp(wxMouseEvent& event); + +private: + // have we calculated the positions of our tools? + bool m_needsLayout; + + // the width of a separator + wxCoord m_widthSeparator; + + // the total size of all toolbar elements + wxCoord m_maxWidth, + m_maxHeight; + + // the height of a label + int m_labelHeight; + + // the space above the label + int m_labelMargin; + +private: + DECLARE_DYNAMIC_CLASS(wxButtonToolBar) + DECLARE_EVENT_TABLE() +}; + +#endif + // _WX_BUTTONBAR_H_ + diff --git a/Externals/wxWidgets/include/wx/generic/calctrl.h b/Externals/wxWidgets/include/wx/generic/calctrl.h new file mode 100644 index 0000000000..2b5e3aa58d --- /dev/null +++ b/Externals/wxWidgets/include/wx/generic/calctrl.h @@ -0,0 +1,324 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: generic/calctrl.h +// Purpose: generic implementation of date-picker control +// Author: Vadim Zeitlin +// Modified by: +// Created: 29.12.99 +// RCS-ID: $Id: calctrl.h 49804 2007-11-10 01:09:42Z VZ $ +// Copyright: (c) 1999 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GENERIC_CALCTRL_H +#define _WX_GENERIC_CALCTRL_H + +#include "wx/control.h" // the base class +#include "wx/dcclient.h" // for wxPaintDC + +class WXDLLIMPEXP_FWD_CORE wxComboBox; +class WXDLLIMPEXP_FWD_CORE wxStaticText; +class WXDLLIMPEXP_FWD_CORE wxSpinCtrl; + +#define wxCalendarNameStr _T("CalendarCtrl") + +// ---------------------------------------------------------------------------- +// wxCalendarCtrl: a control allowing the user to pick a date interactively +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxCalendarCtrl : public wxControl +{ +public: + // construction + wxCalendarCtrl() { Init(); } + wxCalendarCtrl(wxWindow *parent, + wxWindowID id, + const wxDateTime& date = wxDefaultDateTime, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxCAL_SHOW_HOLIDAYS | wxWANTS_CHARS, + const wxString& name = wxCalendarNameStr); + + bool Create(wxWindow *parent, + wxWindowID id, + const wxDateTime& date = wxDefaultDateTime, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxCAL_SHOW_HOLIDAYS | wxWANTS_CHARS, + const wxString& name = wxCalendarNameStr); + + virtual ~wxCalendarCtrl(); + + virtual bool Destroy(); + + // set/get the current date + // ------------------------ + + bool SetDate(const wxDateTime& date); // we need to be able to control if the event should be sent in SetDateAndNotify(...) + const wxDateTime& GetDate() const { return m_date; } + + // set/get the range in which selection can occur + // --------------------------------------------- + + bool SetLowerDateLimit(const wxDateTime& date = wxDefaultDateTime); + const wxDateTime& GetLowerDateLimit() const { return m_lowdate; } + bool SetUpperDateLimit(const wxDateTime& date = wxDefaultDateTime); + const wxDateTime& GetUpperDateLimit() const { return m_highdate; } + + bool SetDateRange(const wxDateTime& lowerdate = wxDefaultDateTime, const wxDateTime& upperdate = wxDefaultDateTime); + + // calendar mode + // ------------- + + // some calendar styles can't be changed after the control creation by + // just using SetWindowStyle() and Refresh() and the functions below + // should be used instead for them + + // corresponds to wxCAL_NO_YEAR_CHANGE bit + void EnableYearChange(bool enable = true); + + // corresponds to wxCAL_NO_MONTH_CHANGE bit + void EnableMonthChange(bool enable = true); + + // corresponds to wxCAL_SHOW_HOLIDAYS bit + void EnableHolidayDisplay(bool display = true); + + // customization + // ------------- + + // header colours are used for painting the weekdays at the top + void SetHeaderColours(const wxColour& colFg, const wxColour& colBg) + { + m_colHeaderFg = colFg; + m_colHeaderBg = colBg; + } + + const wxColour& GetHeaderColourFg() const { return m_colHeaderFg; } + const wxColour& GetHeaderColourBg() const { return m_colHeaderBg; } + + // highlight colour is used for the currently selected date + void SetHighlightColours(const wxColour& colFg, const wxColour& colBg) + { + m_colHighlightFg = colFg; + m_colHighlightBg = colBg; + } + + const wxColour& GetHighlightColourFg() const { return m_colHighlightFg; } + const wxColour& GetHighlightColourBg() const { return m_colHighlightBg; } + + // holiday colour is used for the holidays (if style & wxCAL_SHOW_HOLIDAYS) + void SetHolidayColours(const wxColour& colFg, const wxColour& colBg) + { + m_colHolidayFg = colFg; + m_colHolidayBg = colBg; + } + + const wxColour& GetHolidayColourFg() const { return m_colHolidayFg; } + const wxColour& GetHolidayColourBg() const { return m_colHolidayBg; } + + // an item without custom attributes is drawn with the default colours and + // font and without border, setting custom attributes allows to modify this + // + // the day parameter should be in 1..31 range, for days 29, 30, 31 the + // corresponding attribute is just unused if there is no such day in the + // current month + + wxCalendarDateAttr *GetAttr(size_t day) const + { + wxCHECK_MSG( day > 0 && day < 32, NULL, _T("invalid day") ); + + return m_attrs[day - 1]; + } + + void SetAttr(size_t day, wxCalendarDateAttr *attr) + { + wxCHECK_RET( day > 0 && day < 32, _T("invalid day") ); + + delete m_attrs[day - 1]; + m_attrs[day - 1] = attr; + } + + void SetHoliday(size_t day); + + void ResetAttr(size_t day) { SetAttr(day, (wxCalendarDateAttr *)NULL); } + + // returns one of wxCAL_HITTEST_XXX constants and fills either date or wd + // with the corresponding value (none for NOWHERE, the date for DAY and wd + // for HEADER) + wxCalendarHitTestResult HitTest(const wxPoint& pos, + wxDateTime *date = NULL, + wxDateTime::WeekDay *wd = NULL); + + // implementation only from now on + // ------------------------------- + + // forward these functions to all subcontrols + virtual bool Enable(bool enable = true); + virtual bool Show(bool show = true); + + virtual void SetWindowStyleFlag(long style); + + virtual wxVisualAttributes GetDefaultAttributes() const + { return GetClassDefaultAttributes(GetWindowVariant()); } + + static wxVisualAttributes + GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL); + + void OnSysColourChanged(wxSysColourChangedEvent& event); + +protected: + // override some base class virtuals + virtual wxSize DoGetBestSize() const; + virtual void DoGetPosition(int *x, int *y) const; + virtual void DoGetSize(int *width, int *height) const; + virtual void DoSetSize(int x, int y, int width, int height, int sizeFlags); + virtual void DoMoveWindow(int x, int y, int width, int height); + +private: + // common part of all ctors + void Init(); + + // startup colours and reinitialization after colour changes in system + void InitColours(); + + // event handlers + void OnPaint(wxPaintEvent& event); + void OnClick(wxMouseEvent& event); + void OnDClick(wxMouseEvent& event); + void OnChar(wxKeyEvent& event); + void OnMonthChange(wxCommandEvent& event); + void OnYearChange(wxCommandEvent& event); + void OnYearTextChange(wxCommandEvent& event); + + // (re)calc m_widthCol and m_heightRow + void RecalcGeometry(); + + // set the date and send the notification + void SetDateAndNotify(const wxDateTime& date); + + // get the week (row, in range 1..6) for the given date + size_t GetWeek(const wxDateTime& date) const; + + // get the date from which we start drawing days + wxDateTime GetStartDate() const; + + // is this date shown? + bool IsDateShown(const wxDateTime& date) const; + + // is this date in the given range? + bool IsDateInRange(const wxDateTime& date) const; + + // range helpers + bool ChangeYear(wxDateTime* target) const; + bool ChangeMonth(wxDateTime* target) const; + + // redraw the given date + void RefreshDate(const wxDateTime& date); + + // change the date inside the same month/year + void ChangeDay(const wxDateTime& date); + + // set the attributes for the holidays if needed + void SetHolidayAttrs(); + + // reset all holidays + void ResetHolidayAttrs(); + + // generate the given calendar event(s) + void GenerateEvent(wxEventType type) + { + wxCalendarEvent event(this, type); + (void)GetEventHandler()->ProcessEvent(event); + } + + void GenerateEvents(wxEventType type1, wxEventType type2) + { + GenerateEvent(type1); + GenerateEvent(type2); + } + + // do we allow changing the month/year? + bool AllowMonthChange() const + { + return (GetWindowStyle() & wxCAL_NO_MONTH_CHANGE) + != wxCAL_NO_MONTH_CHANGE; + } + bool AllowYearChange() const + { + return !(GetWindowStyle() & wxCAL_NO_YEAR_CHANGE); + } + + // show the correct controls + void ShowCurrentControls(); + + // create the month combo and year spin controls + void CreateMonthComboBox(); + void CreateYearSpinCtrl(); + +public: + // get the currently shown control for month/year + wxControl *GetMonthControl() const; + wxControl *GetYearControl() const; + +private: + // OnPaint helper-methods + + // Highlight the [fromdate : todate] range using pen and brush + void HighlightRange(wxPaintDC* dc, const wxDateTime& fromdate, const wxDateTime& todate, const wxPen* pen, const wxBrush* brush); + + // Get the "coordinates" for the date relative to the month currently displayed. + // using (day, week): upper left coord is (1, 1), lower right coord is (7, 6) + // if the date isn't visible (-1, -1) is put in (day, week) and false is returned + bool GetDateCoord(const wxDateTime& date, int *day, int *week) const; + + // Set the flag for SetDate(): otherwise it would overwrite the year + // typed in by the user + void SetUserChangedYear() { m_userChangedYear = true; } + + // the subcontrols + wxStaticText *m_staticMonth; + wxComboBox *m_comboMonth; + + wxStaticText *m_staticYear; + wxSpinCtrl *m_spinYear; + + // the current selection + wxDateTime m_date; + + // the date-range + wxDateTime m_lowdate; + wxDateTime m_highdate; + + // default attributes + wxColour m_colHighlightFg, + m_colHighlightBg, + m_colHolidayFg, + m_colHolidayBg, + m_colHeaderFg, + m_colHeaderBg, + m_colBackground, + m_colSorrounding; + + // the attributes for each of the month days + wxCalendarDateAttr *m_attrs[31]; + + // the width and height of one column/row in the calendar + wxCoord m_widthCol, + m_heightRow, + m_rowOffset; + + wxRect m_leftArrowRect, + m_rightArrowRect; + + // the week day names + wxString m_weekdays[7]; + + // true if SetDate() is being called as the result of changing the year in + // the year control + bool m_userChangedYear; + + DECLARE_DYNAMIC_CLASS(wxCalendarCtrl) + DECLARE_EVENT_TABLE() + DECLARE_NO_COPY_CLASS(wxCalendarCtrl) +}; + +#endif // _WX_GENERIC_CALCTRL_H diff --git a/Externals/wxWidgets/include/wx/generic/caret.h b/Externals/wxWidgets/include/wx/generic/caret.h new file mode 100644 index 0000000000..926f9d02a3 --- /dev/null +++ b/Externals/wxWidgets/include/wx/generic/caret.h @@ -0,0 +1,95 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: generic/caret.h +// Purpose: generic wxCaret class +// Author: Vadim Zeitlin (original code by Robert Roebling) +// Modified by: +// Created: 25.05.99 +// RCS-ID: $Id: caret.h 42397 2006-10-25 12:12:56Z VS $ +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CARET_H_ +#define _WX_CARET_H_ + +#include "wx/timer.h" +#include "wx/dc.h" +#include "wx/overlay.h" + +#ifdef wxHAS_NATIVE_OVERLAY + #define wxHAS_CARET_USING_OVERLAYS +#endif + +class WXDLLIMPEXP_CORE wxCaret; + +class WXDLLEXPORT wxCaretTimer : public wxTimer +{ +public: + wxCaretTimer(wxCaret *caret); + virtual void Notify(); + +private: + wxCaret *m_caret; +}; + +class WXDLLIMPEXP_CORE wxCaret : public wxCaretBase +{ +public: + // ctors + // ----- + // default - use Create() + wxCaret() : m_timer(this) { InitGeneric(); } + // creates a block caret associated with the given window + wxCaret(wxWindowBase *window, int width, int height) + : wxCaretBase(window, width, height), m_timer(this) { InitGeneric(); } + wxCaret(wxWindowBase *window, const wxSize& size) + : wxCaretBase(window, size), m_timer(this) { InitGeneric(); } + + virtual ~wxCaret(); + + // implementation + // -------------- + + // called by wxWindow (not using the event tables) + virtual void OnSetFocus(); + virtual void OnKillFocus(); + + // called by wxCaretTimer + void OnTimer(); + +protected: + virtual void DoShow(); + virtual void DoHide(); + virtual void DoMove(); + virtual void DoSize(); + + // blink the caret once + void Blink(); + + // refresh the caret + void Refresh(); + + // draw the caret on the given DC + void DoDraw(wxDC *dc); + +private: + // GTK specific initialization + void InitGeneric(); + +#ifdef wxHAS_CARET_USING_OVERLAYS + // the overlay for displaying the caret + wxOverlay m_overlay; +#else + // the bitmap holding the part of window hidden by the caret when it was + // at (m_xOld, m_yOld) + wxBitmap m_bmpUnderCaret; + int m_xOld, + m_yOld; +#endif + + wxCaretTimer m_timer; + bool m_blinkedOut, // true => caret hidden right now + m_hasFocus; // true => our window has focus +}; + +#endif // _WX_CARET_H_ diff --git a/Externals/wxWidgets/include/wx/generic/choicdgg.h b/Externals/wxWidgets/include/wx/generic/choicdgg.h new file mode 100644 index 0000000000..ebefcd81b8 --- /dev/null +++ b/Externals/wxWidgets/include/wx/generic/choicdgg.h @@ -0,0 +1,320 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/choicdgg.h +// Purpose: Generic choice dialogs +// Author: Julian Smart +// Modified by: 03.11.00: VZ to add wxArrayString and multiple sel functions +// Created: 01/02/97 +// RCS-ID: $Id: choicdgg.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GENERIC_CHOICDGG_H_ +#define _WX_GENERIC_CHOICDGG_H_ + +#include "wx/dynarray.h" +#include "wx/dialog.h" + +class WXDLLIMPEXP_FWD_CORE wxListBoxBase; + +// ---------------------------------------------------------------------------- +// some (ugly...) constants +// ---------------------------------------------------------------------------- + +#define wxCHOICE_HEIGHT 150 +#define wxCHOICE_WIDTH 200 + +#ifdef __WXWINCE__ +#define wxCHOICEDLG_STYLE \ + (wxDEFAULT_DIALOG_STYLE | wxOK | wxCANCEL | wxCENTRE) +#else +#define wxCHOICEDLG_STYLE \ + (wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER | wxOK | wxCANCEL | wxCENTRE) +#endif + +// ---------------------------------------------------------------------------- +// wxAnyChoiceDialog: a base class for dialogs containing a listbox +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxAnyChoiceDialog : public wxDialog +{ +public: + wxAnyChoiceDialog() { } + + wxAnyChoiceDialog(wxWindow *parent, + const wxString& message, + const wxString& caption, + int n, const wxString *choices, + long styleDlg = wxCHOICEDLG_STYLE, + const wxPoint& pos = wxDefaultPosition, + long styleLbox = wxLB_ALWAYS_SB) + { + (void)Create(parent, message, caption, n, choices, + styleDlg, pos, styleLbox); + } + wxAnyChoiceDialog(wxWindow *parent, + const wxString& message, + const wxString& caption, + const wxArrayString& choices, + long styleDlg = wxCHOICEDLG_STYLE, + const wxPoint& pos = wxDefaultPosition, + long styleLbox = wxLB_ALWAYS_SB) + { + (void)Create(parent, message, caption, choices, + styleDlg, pos, styleLbox); + } + + bool Create(wxWindow *parent, + const wxString& message, + const wxString& caption, + int n, const wxString *choices, + long styleDlg = wxCHOICEDLG_STYLE, + const wxPoint& pos = wxDefaultPosition, + long styleLbox = wxLB_ALWAYS_SB); + bool Create(wxWindow *parent, + const wxString& message, + const wxString& caption, + const wxArrayString& choices, + long styleDlg = wxCHOICEDLG_STYLE, + const wxPoint& pos = wxDefaultPosition, + long styleLbox = wxLB_ALWAYS_SB); + +protected: + wxListBoxBase *m_listbox; + + virtual wxListBoxBase *CreateList(int n, + const wxString *choices, + long styleLbox); + + DECLARE_NO_COPY_CLASS(wxAnyChoiceDialog) +}; + +// ---------------------------------------------------------------------------- +// wxSingleChoiceDialog: a dialog with single selection listbox +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxSingleChoiceDialog : public wxAnyChoiceDialog +{ +public: + wxSingleChoiceDialog() + { + m_selection = -1; + } + + wxSingleChoiceDialog(wxWindow *parent, + const wxString& message, + const wxString& caption, + int n, + const wxString *choices, + char **clientData = (char **)NULL, + long style = wxCHOICEDLG_STYLE, + const wxPoint& pos = wxDefaultPosition); + wxSingleChoiceDialog(wxWindow *parent, + const wxString& message, + const wxString& caption, + const wxArrayString& choices, + char **clientData = (char **)NULL, + long style = wxCHOICEDLG_STYLE, + const wxPoint& pos = wxDefaultPosition); + + bool Create(wxWindow *parent, + const wxString& message, + const wxString& caption, + int n, + const wxString *choices, + char **clientData = (char **)NULL, + long style = wxCHOICEDLG_STYLE, + const wxPoint& pos = wxDefaultPosition); + bool Create(wxWindow *parent, + const wxString& message, + const wxString& caption, + const wxArrayString& choices, + char **clientData = (char **)NULL, + long style = wxCHOICEDLG_STYLE, + const wxPoint& pos = wxDefaultPosition); + + void SetSelection(int sel); + int GetSelection() const { return m_selection; } + wxString GetStringSelection() const { return m_stringSelection; } + + // obsolete function (NB: no need to make it return wxChar, it's untyped) + char *GetSelectionClientData() const { return (char *)m_clientData; } + + // implementation from now on + void OnOK(wxCommandEvent& event); +#ifndef __SMARTPHONE__ + void OnListBoxDClick(wxCommandEvent& event); +#endif +#ifdef __WXWINCE__ + void OnJoystickButtonDown(wxJoystickEvent& event); +#endif + +protected: + int m_selection; + wxString m_stringSelection; + + void DoChoice(); + +private: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxSingleChoiceDialog) + DECLARE_EVENT_TABLE() +}; + +// ---------------------------------------------------------------------------- +// wxMultiChoiceDialog: a dialog with multi selection listbox +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxMultiChoiceDialog : public wxAnyChoiceDialog +{ +public: + wxMultiChoiceDialog() { } + + wxMultiChoiceDialog(wxWindow *parent, + const wxString& message, + const wxString& caption, + int n, + const wxString *choices, + long style = wxCHOICEDLG_STYLE, + const wxPoint& pos = wxDefaultPosition) + { + (void)Create(parent, message, caption, n, choices, style, pos); + } + wxMultiChoiceDialog(wxWindow *parent, + const wxString& message, + const wxString& caption, + const wxArrayString& choices, + long style = wxCHOICEDLG_STYLE, + const wxPoint& pos = wxDefaultPosition) + { + (void)Create(parent, message, caption, choices, style, pos); + } + + bool Create(wxWindow *parent, + const wxString& message, + const wxString& caption, + int n, + const wxString *choices, + long style = wxCHOICEDLG_STYLE, + const wxPoint& pos = wxDefaultPosition); + bool Create(wxWindow *parent, + const wxString& message, + const wxString& caption, + const wxArrayString& choices, + long style = wxCHOICEDLG_STYLE, + const wxPoint& pos = wxDefaultPosition); + + void SetSelections(const wxArrayInt& selections); + wxArrayInt GetSelections() const { return m_selections; } + + // implementation from now on + virtual bool TransferDataFromWindow(); + +protected: +#if wxUSE_CHECKLISTBOX + virtual wxListBoxBase *CreateList(int n, + const wxString *choices, + long styleLbox); +#endif // wxUSE_CHECKLISTBOX + + wxArrayInt m_selections; + +private: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxMultiChoiceDialog) +}; + +// ---------------------------------------------------------------------------- +// wrapper functions which can be used to get selection(s) from the user +// ---------------------------------------------------------------------------- + +// get the user selection as a string +WXDLLEXPORT wxString wxGetSingleChoice(const wxString& message, + const wxString& caption, + const wxArrayString& choices, + wxWindow *parent = NULL, + int x = wxDefaultCoord, + int y = wxDefaultCoord, + bool centre = true, + int width = wxCHOICE_WIDTH, + int height = wxCHOICE_HEIGHT); + +WXDLLEXPORT wxString wxGetSingleChoice(const wxString& message, + const wxString& caption, + int n, const wxString *choices, + wxWindow *parent = NULL, + int x = wxDefaultCoord, + int y = wxDefaultCoord, + bool centre = true, + int width = wxCHOICE_WIDTH, + int height = wxCHOICE_HEIGHT); + +// Same as above but gets position in list of strings, instead of string, +// or -1 if no selection +WXDLLEXPORT int wxGetSingleChoiceIndex(const wxString& message, + const wxString& caption, + const wxArrayString& choices, + wxWindow *parent = NULL, + int x = wxDefaultCoord, + int y = wxDefaultCoord, + bool centre = true, + int width = wxCHOICE_WIDTH, + int height = wxCHOICE_HEIGHT); + +WXDLLEXPORT int wxGetSingleChoiceIndex(const wxString& message, + const wxString& caption, + int n, const wxString *choices, + wxWindow *parent = NULL, + int x = wxDefaultCoord, + int y = wxDefaultCoord, + bool centre = true, + int width = wxCHOICE_WIDTH, + int height = wxCHOICE_HEIGHT); + +// Return client data instead or NULL if cancelled +WXDLLEXPORT void* wxGetSingleChoiceData(const wxString& message, + const wxString& caption, + const wxArrayString& choices, + void **client_data, + wxWindow *parent = NULL, + int x = wxDefaultCoord, + int y = wxDefaultCoord, + bool centre = true, + int width = wxCHOICE_WIDTH, + int height = wxCHOICE_HEIGHT); + +WXDLLEXPORT void* wxGetSingleChoiceData(const wxString& message, + const wxString& caption, + int n, const wxString *choices, + void **client_data, + wxWindow *parent = NULL, + int x = wxDefaultCoord, + int y = wxDefaultCoord, + bool centre = true, + int width = wxCHOICE_WIDTH, + int height = wxCHOICE_HEIGHT); + +// fill the array with the indices of the chosen items, it will be empty +// if no items were selected or Cancel was pressed - return the number of +// selections +WXDLLEXPORT size_t wxGetMultipleChoices(wxArrayInt& selections, + const wxString& message, + const wxString& caption, + int n, const wxString *choices, + wxWindow *parent = NULL, + int x = wxDefaultCoord, + int y = wxDefaultCoord, + bool centre = true, + int width = wxCHOICE_WIDTH, + int height = wxCHOICE_HEIGHT); + +WXDLLEXPORT size_t wxGetMultipleChoices(wxArrayInt& selections, + const wxString& message, + const wxString& caption, + const wxArrayString& choices, + wxWindow *parent = NULL, + int x = wxDefaultCoord, + int y = wxDefaultCoord, + bool centre = true, + int width = wxCHOICE_WIDTH, + int height = wxCHOICE_HEIGHT); + +#endif // _WX_GENERIC_CHOICDGG_H_ diff --git a/Externals/wxWidgets/include/wx/generic/clrpickerg.h b/Externals/wxWidgets/include/wx/generic/clrpickerg.h new file mode 100644 index 0000000000..36f05d51a4 --- /dev/null +++ b/Externals/wxWidgets/include/wx/generic/clrpickerg.h @@ -0,0 +1,88 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/clrpickerg.h +// Purpose: wxGenericColourButton header +// Author: Francesco Montorsi (based on Vadim Zeitlin's code) +// Modified by: +// Created: 14/4/2006 +// Copyright: (c) Vadim Zeitlin, Francesco Montorsi +// RCS-ID: $Id: clrpickerg.h 40322 2006-07-25 11:41:53Z ABX $ +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CLRPICKER_H_ +#define _WX_CLRPICKER_H_ + +#include "wx/button.h" +#include "wx/cmndata.h" + +//----------------------------------------------------------------------------- +// wxGenericColourButton: a button which brings up a wxColourDialog +//----------------------------------------------------------------------------- + +// show the colour in HTML form (#AABBCC) as colour button label +#define wxCLRBTN_SHOW_LABEL 100 + +// the default style +#define wxCLRBTN_DEFAULT_STYLE (wxCLRBTN_SHOW_LABEL) + + +class WXDLLIMPEXP_CORE wxGenericColourButton : public wxButton, + public wxColourPickerWidgetBase +{ +public: + wxGenericColourButton() {} + wxGenericColourButton(wxWindow *parent, + wxWindowID id, + const wxColour& col = *wxBLACK, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxCLRBTN_DEFAULT_STYLE, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxColourPickerWidgetNameStr) + { + Create(parent, id, col, pos, size, style, validator, name); + } + + virtual ~wxGenericColourButton() {} + + +public: // API extensions specific for wxGenericColourButton + + // user can override this to init colour data in a different way + virtual void InitColourData(); + + // returns the colour data shown in wxColourDialog + wxColourData *GetColourData() { return &ms_data; } + + +public: + + bool Create(wxWindow *parent, + wxWindowID id, + const wxColour& col = *wxBLACK, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxCLRBTN_DEFAULT_STYLE, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxColourPickerWidgetNameStr); + + void OnButtonClick(wxCommandEvent &); + + +protected: + + wxSize DoGetBestSize() const; + + void UpdateColour(); + + // the colour data shown in wxColourPickerCtrlGeneric + // controls. This member is static so that all colour pickers + // in the program share the same set of custom colours. + static wxColourData ms_data; + +private: + DECLARE_DYNAMIC_CLASS(wxGenericColourButton) +}; + + +#endif // _WX_CLRPICKER_H_ diff --git a/Externals/wxWidgets/include/wx/generic/collpaneg.h b/Externals/wxWidgets/include/wx/generic/collpaneg.h new file mode 100644 index 0000000000..b16b65948c --- /dev/null +++ b/Externals/wxWidgets/include/wx/generic/collpaneg.h @@ -0,0 +1,105 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/collpaneg.h +// Purpose: wxGenericCollapsiblePane +// Author: Francesco Montorsi +// Modified by: +// Created: 8/10/2006 +// RCS-ID: $Id: collpaneg.h 49804 2007-11-10 01:09:42Z VZ $ +// Copyright: (c) Francesco Montorsi +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_COLLAPSABLE_PANE_H_GENERIC_ +#define _WX_COLLAPSABLE_PANE_H_GENERIC_ + +// forward declared +class WXDLLIMPEXP_FWD_CORE wxButton; +class WXDLLIMPEXP_FWD_CORE wxStaticLine; + +// class name +extern WXDLLIMPEXP_DATA_CORE(const wxChar) wxCollapsiblePaneNameStr[]; + +// ---------------------------------------------------------------------------- +// wxGenericCollapsiblePane +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxGenericCollapsiblePane : public wxCollapsiblePaneBase +{ +public: + wxGenericCollapsiblePane() { Init(); } + + wxGenericCollapsiblePane(wxWindow *parent, + wxWindowID winid, + const wxString& label, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxCP_DEFAULT_STYLE, + const wxValidator& val = wxDefaultValidator, + const wxString& name = wxCollapsiblePaneNameStr) + { + Init(); + + Create(parent, winid, label, pos, size, style, val, name); + } + + void Init() + { + m_pButton = NULL; + m_pPane = NULL; + m_pStaticLine = NULL; + m_sz = NULL; + } + + ~wxGenericCollapsiblePane(); + + bool Create(wxWindow *parent, + wxWindowID winid, + const wxString& label, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxCP_DEFAULT_STYLE, + const wxValidator& val = wxDefaultValidator, + const wxString& name = wxCollapsiblePaneNameStr); + + // public wxCollapsiblePane API + virtual void Collapse(bool collapse = true); + virtual void SetLabel(const wxString &label); + + virtual bool IsCollapsed() const + { return m_pPane==NULL || !m_pPane->IsShown(); } + virtual wxWindow *GetPane() const + { return m_pPane; } + virtual wxString GetLabel() const + { return m_strLabel; } + + virtual bool Layout(); + + // implementation only, don't use + void OnStateChange(const wxSize& sizeNew); + +protected: + // overridden methods + virtual wxSize DoGetBestSize() const; + + wxString GetBtnLabel() const; + int GetBorder() const; + + // child controls + wxButton *m_pButton; + wxStaticLine *m_pStaticLine; + wxWindow *m_pPane; + wxSizer *m_sz; + + // the button label without ">>" or "<<" + wxString m_strLabel; + +private: + // event handlers + void OnButton(wxCommandEvent &ev); + void OnSize(wxSizeEvent &ev); + + DECLARE_DYNAMIC_CLASS(wxGenericCollapsiblePane) + DECLARE_EVENT_TABLE() +}; + +#endif // _WX_COLLAPSABLE_PANE_H_GENERIC_ diff --git a/Externals/wxWidgets/include/wx/generic/colour.h b/Externals/wxWidgets/include/wx/generic/colour.h new file mode 100644 index 0000000000..3ac7a8f430 --- /dev/null +++ b/Externals/wxWidgets/include/wx/generic/colour.h @@ -0,0 +1,75 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/colour.h +// Purpose: wxColour class +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: colour.h 41751 2006-10-08 21:56:55Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GENERIC_COLOUR_H_ +#define _WX_GENERIC_COLOUR_H_ + +#include "wx/object.h" + +// Colour +class WXDLLEXPORT wxColour: public wxColourBase +{ +public: + // constructors + // ------------ + + // default + wxColour(); + DEFINE_STD_WXCOLOUR_CONSTRUCTORS + + // copy ctors and assignment operators + wxColour(const wxColour& col); + wxColour& operator=(const wxColour& col); + + // dtor + virtual ~wxColour(); + + // accessors + bool Ok() const { return IsOk(); } + bool IsOk() const { return m_isInit; } + + unsigned char Red() const { return m_red; } + unsigned char Green() const { return m_green; } + unsigned char Blue() const { return m_blue; } + unsigned char Alpha() const { return m_alpha; } + + // comparison + bool operator==(const wxColour& colour) const + { + return (m_red == colour.m_red && + m_green == colour.m_green && + m_blue == colour.m_blue && + m_alpha == colour.m_alpha && + m_isInit == colour.m_isInit); + } + + bool operator!=(const wxColour& colour) const { return !(*this == colour); } + +protected: + + // Helper function + void Init(); + + virtual void + InitRGBA(unsigned char r, unsigned char g, unsigned char b, unsigned char a); + +private: + bool m_isInit; + unsigned char m_red; + unsigned char m_blue; + unsigned char m_green; + unsigned char m_alpha; + +private: + DECLARE_DYNAMIC_CLASS(wxColour) +}; + +#endif // _WX_GENERIC_COLOUR_H_ diff --git a/Externals/wxWidgets/include/wx/generic/colrdlgg.h b/Externals/wxWidgets/include/wx/generic/colrdlgg.h new file mode 100644 index 0000000000..5ae55b2c12 --- /dev/null +++ b/Externals/wxWidgets/include/wx/generic/colrdlgg.h @@ -0,0 +1,120 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/colrdlgg.h +// Purpose: wxGenericColourDialog +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: colrdlgg.h 37164 2006-01-26 17:20:50Z ABX $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef __COLORDLGH_G__ +#define __COLORDLGH_G__ + +#include "wx/defs.h" +#include "wx/gdicmn.h" +#include "wx/dialog.h" +#include "wx/cmndata.h" + +#define wxID_ADD_CUSTOM 3000 + +#if wxUSE_SLIDER + + #define wxID_RED_SLIDER 3001 + #define wxID_GREEN_SLIDER 3002 + #define wxID_BLUE_SLIDER 3003 + + class WXDLLEXPORT wxSlider; + +#endif // wxUSE_SLIDER + +class WXDLLEXPORT wxGenericColourDialog : public wxDialog +{ +public: + wxGenericColourDialog(); + wxGenericColourDialog(wxWindow *parent, + wxColourData *data = (wxColourData *) NULL); + virtual ~wxGenericColourDialog(); + + bool Create(wxWindow *parent, wxColourData *data = (wxColourData *) NULL); + + wxColourData &GetColourData() { return colourData; } + + virtual int ShowModal(); + + // Internal functions + void OnMouseEvent(wxMouseEvent& event); + void OnPaint(wxPaintEvent& event); + + virtual void CalculateMeasurements(); + virtual void CreateWidgets(); + virtual void InitializeColours(); + + virtual void PaintBasicColours(wxDC& dc); + virtual void PaintCustomColours(wxDC& dc); + virtual void PaintCustomColour(wxDC& dc); + virtual void PaintHighlight(wxDC& dc, bool draw); + + virtual void OnBasicColourClick(int which); + virtual void OnCustomColourClick(int which); + + void OnAddCustom(wxCommandEvent& event); + +#if wxUSE_SLIDER + void OnRedSlider(wxCommandEvent& event); + void OnGreenSlider(wxCommandEvent& event); + void OnBlueSlider(wxCommandEvent& event); +#endif // wxUSE_SLIDER + + void OnCloseWindow(wxCloseEvent& event); + +protected: + wxColourData colourData; + wxWindow *dialogParent; + + // Area reserved for grids of colours + wxRect standardColoursRect; + wxRect customColoursRect; + wxRect singleCustomColourRect; + + // Size of each colour rectangle + wxPoint smallRectangleSize; + + // For single customizable colour + wxPoint customRectangleSize; + + // Grid spacing (between rectangles) + int gridSpacing; + + // Section spacing (between left and right halves of dialog box) + int sectionSpacing; + + // 48 'standard' colours + wxColour standardColours[48]; + + // 16 'custom' colours + wxColour customColours[16]; + + // Which colour is selected? An index into one of the two areas. + int colourSelection; + int whichKind; // 1 for standard colours, 2 for custom colours, + +#if wxUSE_SLIDER + wxSlider *redSlider; + wxSlider *greenSlider; + wxSlider *blueSlider; +#endif // wxUSE_SLIDER + + int buttonY; + + int okButtonX; + int customButtonX; + + // static bool colourDialogCancelled; + + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS(wxGenericColourDialog) +}; + +#endif diff --git a/Externals/wxWidgets/include/wx/generic/combo.h b/Externals/wxWidgets/include/wx/generic/combo.h new file mode 100644 index 0000000000..27df371408 --- /dev/null +++ b/Externals/wxWidgets/include/wx/generic/combo.h @@ -0,0 +1,140 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/combo.h +// Purpose: Generic wxComboCtrl +// Author: Jaakko Salli +// Modified by: +// Created: Apr-30-2006 +// RCS-ID: $Id: combo.h 41835 2006-10-09 20:12:19Z RR $ +// Copyright: (c) Jaakko Salli +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GENERIC_COMBOCTRL_H_ +#define _WX_GENERIC_COMBOCTRL_H_ + +#if wxUSE_COMBOCTRL + +// Only define generic if native doesn't have all the features +#if !defined(wxCOMBOCONTROL_FULLY_FEATURED) + +// ---------------------------------------------------------------------------- +// Generic wxComboCtrl +// ---------------------------------------------------------------------------- + +#if defined(__WXUNIVERSAL__) + +// all actions of single line text controls are supported + +// popup/dismiss the choice window +#define wxACTION_COMBOBOX_POPUP _T("popup") +#define wxACTION_COMBOBOX_DISMISS _T("dismiss") + +#endif + +extern WXDLLIMPEXP_DATA_CORE(const wxChar) wxComboBoxNameStr[]; + +class WXDLLEXPORT wxGenericComboCtrl : public wxComboCtrlBase +{ +public: + // ctors and such + wxGenericComboCtrl() : wxComboCtrlBase() { Init(); } + + wxGenericComboCtrl(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxString& value = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxComboBoxNameStr) + : wxComboCtrlBase() + { + Init(); + + (void)Create(parent, id, value, pos, size, style, validator, name); + } + + bool Create(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxString& value = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxComboBoxNameStr); + + virtual ~wxGenericComboCtrl(); + + void SetCustomPaintWidth( int width ); + + virtual bool IsKeyPopupToggle(const wxKeyEvent& event) const; + + static int GetFeatures() { return wxComboCtrlFeatures::All; } + +#if defined(__WXUNIVERSAL__) + // we have our own input handler and our own actions + virtual bool PerformAction(const wxControlAction& action, + long numArg = 0l, + const wxString& strArg = wxEmptyString); +#endif + +protected: + + // Mandatory virtuals + virtual void OnResize(); + + // Event handlers + void OnPaintEvent( wxPaintEvent& event ); + void OnMouseEvent( wxMouseEvent& event ); + +private: + void Init(); + + DECLARE_EVENT_TABLE() + + DECLARE_DYNAMIC_CLASS(wxGenericComboCtrl) +}; + + +#ifndef _WX_COMBOCONTROL_H_ + +// If native wxComboCtrl was not defined, then prepare a simple +// front-end so that wxRTTI works as expected. + +class WXDLLEXPORT wxComboCtrl : public wxGenericComboCtrl +{ +public: + wxComboCtrl() : wxGenericComboCtrl() {} + + wxComboCtrl(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxString& value = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxComboBoxNameStr) + : wxGenericComboCtrl() + { + (void)Create(parent, id, value, pos, size, style, validator, name); + } + + virtual ~wxComboCtrl() {} + +protected: + +private: + DECLARE_DYNAMIC_CLASS(wxComboCtrl) +}; + +#endif // _WX_COMBOCONTROL_H_ + +#else + +#define wxGenericComboCtrl wxComboCtrl + +#endif // !defined(wxCOMBOCONTROL_FULLY_FEATURED) + +#endif // wxUSE_COMBOCTRL +#endif + // _WX_GENERIC_COMBOCTRL_H_ diff --git a/Externals/wxWidgets/include/wx/generic/dataview.h b/Externals/wxWidgets/include/wx/generic/dataview.h new file mode 100644 index 0000000000..db51530bb3 --- /dev/null +++ b/Externals/wxWidgets/include/wx/generic/dataview.h @@ -0,0 +1,311 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/dataview.h +// Purpose: wxDataViewCtrl generic implementation header +// Author: Robert Roebling +// Id: $Id: dataview.h 41659 2006-10-06 09:50:45Z RR $ +// Copyright: (c) 1998 Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef __GENERICDATAVIEWCTRLH__ +#define __GENERICDATAVIEWCTRLH__ + +#include "wx/defs.h" +#include "wx/object.h" +#include "wx/list.h" +#include "wx/control.h" +#include "wx/scrolwin.h" +#include "wx/icon.h" + +// --------------------------------------------------------- +// classes +// --------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxDataViewCtrl; +class WXDLLIMPEXP_ADV wxDataViewMainWindow; +class WXDLLIMPEXP_ADV wxDataViewHeaderWindow; + +// --------------------------------------------------------- +// wxDataViewRenderer +// --------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxDataViewRenderer: public wxDataViewRendererBase +{ +public: + wxDataViewRenderer( const wxString &varianttype, wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT ); + virtual ~wxDataViewRenderer(); + + virtual bool Render( wxRect cell, wxDC *dc, int state ) = 0; + virtual wxSize GetSize() = 0; + + virtual bool Activate( wxRect WXUNUSED(cell), + wxDataViewListModel *WXUNUSED(model), + unsigned int WXUNUSED(col), + unsigned int WXUNUSED(row) ) + { return false; } + + virtual bool LeftClick( wxPoint WXUNUSED(cursor), + wxRect WXUNUSED(cell), + wxDataViewListModel *WXUNUSED(model), + unsigned int WXUNUSED(col), + unsigned int WXUNUSED(row) ) + { return false; } + virtual bool RightClick( wxPoint WXUNUSED(cursor), + wxRect WXUNUSED(cell), + wxDataViewListModel *WXUNUSED(model), + unsigned int WXUNUSED(col), + unsigned int WXUNUSED(row) ) + { return false; } + virtual bool StartDrag( wxPoint WXUNUSED(cursor), + wxRect WXUNUSED(cell), + wxDataViewListModel *WXUNUSED(model), + unsigned int WXUNUSED(col), + unsigned int WXUNUSED(row) ) + { return false; } + + // Create DC on request + virtual wxDC *GetDC(); + +private: + wxDC *m_dc; + +protected: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewRenderer) +}; + +// --------------------------------------------------------- +// wxDataViewCustomRenderer +// --------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxDataViewCustomRenderer: public wxDataViewRenderer +{ +public: + wxDataViewCustomRenderer( const wxString &varianttype = wxT("string"), + wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT ); + +protected: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewCustomRenderer) +}; + +// --------------------------------------------------------- +// wxDataViewTextRenderer +// --------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxDataViewTextRenderer: public wxDataViewCustomRenderer +{ +public: + wxDataViewTextRenderer( const wxString &varianttype = wxT("string"), + wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT ); + + bool SetValue( const wxVariant &value ); + bool GetValue( wxVariant &value ); + + bool Render( wxRect cell, wxDC *dc, int state ); + wxSize GetSize(); + +private: + wxString m_text; + +protected: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewTextRenderer) +}; + +// --------------------------------------------------------- +// wxDataViewBitmapRenderer +// --------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxDataViewBitmapRenderer: public wxDataViewCustomRenderer +{ +public: + wxDataViewBitmapRenderer( const wxString &varianttype = wxT("wxBitmap"), + wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT ); + + bool SetValue( const wxVariant &value ); + bool GetValue( wxVariant &value ); + + bool Render( wxRect cell, wxDC *dc, int state ); + wxSize GetSize(); + +private: + wxIcon m_icon; + wxBitmap m_bitmap; + +protected: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewBitmapRenderer) +}; + +// --------------------------------------------------------- +// wxDataViewToggleRenderer +// --------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxDataViewToggleRenderer: public wxDataViewCustomRenderer +{ +public: + wxDataViewToggleRenderer( const wxString &varianttype = wxT("bool"), + wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT ); + + bool SetValue( const wxVariant &value ); + bool GetValue( wxVariant &value ); + + bool Render( wxRect cell, wxDC *dc, int state ); + bool Activate( wxRect cell, wxDataViewListModel *model, unsigned int col, unsigned int row ); + wxSize GetSize(); + +private: + bool m_toggle; + +protected: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewToggleRenderer) +}; + +// --------------------------------------------------------- +// wxDataViewProgressRenderer +// --------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxDataViewProgressRenderer: public wxDataViewCustomRenderer +{ +public: + wxDataViewProgressRenderer( const wxString &label = wxEmptyString, + const wxString &varianttype = wxT("long"), + wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT ); + virtual ~wxDataViewProgressRenderer(); + + bool SetValue( const wxVariant &value ); + + virtual bool Render( wxRect cell, wxDC *dc, int state ); + virtual wxSize GetSize(); + +private: + wxString m_label; + int m_value; + +protected: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewProgressRenderer) +}; + +// --------------------------------------------------------- +// wxDataViewDateRenderer +// --------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxDataViewDateRenderer: public wxDataViewCustomRenderer +{ +public: + wxDataViewDateRenderer( const wxString &varianttype = wxT("datetime"), + wxDataViewCellMode mode = wxDATAVIEW_CELL_ACTIVATABLE ); + + bool SetValue( const wxVariant &value ); + + virtual bool Render( wxRect cell, wxDC *dc, int state ); + virtual wxSize GetSize(); + virtual bool Activate( wxRect cell, + wxDataViewListModel *model, unsigned int col, unsigned int row ); + +private: + wxDateTime m_date; + +protected: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewDateRenderer) +}; + +// --------------------------------------------------------- +// wxDataViewColumn +// --------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxDataViewColumn: public wxDataViewColumnBase +{ +public: + wxDataViewColumn( const wxString &title, wxDataViewRenderer *renderer, unsigned int model_column, + int width = 80, int flags = wxDATAVIEW_COL_RESIZABLE ); + wxDataViewColumn( const wxBitmap &bitmap, wxDataViewRenderer *renderer, unsigned int model_column, + int width = 80, int flags = wxDATAVIEW_COL_RESIZABLE ); + virtual ~wxDataViewColumn(); + + virtual void SetTitle( const wxString &title ); + virtual void SetBitmap( const wxBitmap &bitmap ); + + virtual void SetAlignment( wxAlignment align ); + + virtual void SetSortable( bool sortable ); + virtual bool GetSortable(); + virtual void SetSortOrder( bool ascending ); + virtual bool IsSortOrderAscending(); + + virtual int GetWidth(); + +private: + int m_width; + int m_fixedWidth; + +protected: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewColumn) +}; + +// --------------------------------------------------------- +// wxDataViewCtrl +// --------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxDataViewCtrl: public wxDataViewCtrlBase, + public wxScrollHelperNative +{ +public: + wxDataViewCtrl() : wxScrollHelperNative(this) + { + Init(); + } + + wxDataViewCtrl( wxWindow *parent, wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = 0, + const wxValidator& validator = wxDefaultValidator ) + : wxScrollHelperNative(this) + { + Create(parent, id, pos, size, style, validator ); + } + + virtual ~wxDataViewCtrl(); + + void Init(); + + bool Create(wxWindow *parent, wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = 0, + const wxValidator& validator = wxDefaultValidator ); + + virtual bool AssociateModel( wxDataViewListModel *model ); + virtual bool AppendColumn( wxDataViewColumn *col ); + + virtual void SetSelection( int row ); // -1 for unselect + virtual void SetSelectionRange( unsigned int from, unsigned int to ); + virtual void SetSelections( const wxArrayInt& aSelections); + virtual void Unselect( unsigned int row ); + + virtual bool IsSelected( unsigned int row ) const; + virtual int GetSelection() const; + virtual int GetSelections(wxArrayInt& aSelections) const; + +private: + friend class wxDataViewMainWindow; + friend class wxDataViewHeaderWindow; + wxDataViewListModelNotifier *m_notifier; + wxDataViewMainWindow *m_clientArea; + wxDataViewHeaderWindow *m_headerArea; + +private: + void OnSize( wxSizeEvent &event ); + + // we need to return a special WM_GETDLGCODE value to process just the + // arrows but let the other navigation characters through +#ifdef __WXMSW__ + virtual WXLRESULT MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam); +#endif // __WXMSW__ + + WX_FORWARD_TO_SCROLL_HELPER() + +private: + DECLARE_DYNAMIC_CLASS(wxDataViewCtrl) + DECLARE_NO_COPY_CLASS(wxDataViewCtrl) + DECLARE_EVENT_TABLE() +}; + + +#endif // __GENERICDATAVIEWCTRLH__ diff --git a/Externals/wxWidgets/include/wx/generic/datectrl.h b/Externals/wxWidgets/include/wx/generic/datectrl.h new file mode 100644 index 0000000000..6fd107b19c --- /dev/null +++ b/Externals/wxWidgets/include/wx/generic/datectrl.h @@ -0,0 +1,91 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: generic/datectrl.h +// Purpose: generic wxDatePickerCtrl implementation +// Author: Andreas Pflug +// Modified by: +// Created: 2005-01-19 +// RCS-ID: $Id: datectrl.h 42539 2006-10-27 18:02:21Z RR $ +// Copyright: (c) 2005 Andreas Pflug +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GENERIC_DATECTRL_H_ +#define _WX_GENERIC_DATECTRL_H_ + +class WXDLLIMPEXP_ADV wxCalendarDateAttr; +class WXDLLIMPEXP_ADV wxCalendarCtrl; +class WXDLLIMPEXP_ADV wxCalendarEvent; +class WXDLLIMPEXP_ADV wxComboCtrl; +class WXDLLIMPEXP_ADV wxCalendarComboPopup; + +class WXDLLIMPEXP_ADV wxDatePickerCtrlGeneric : public wxDatePickerCtrlBase +{ +public: + // creating the control + wxDatePickerCtrlGeneric() { Init(); } + virtual ~wxDatePickerCtrlGeneric(); + wxDatePickerCtrlGeneric(wxWindow *parent, + wxWindowID id, + const wxDateTime& date = wxDefaultDateTime, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDP_DEFAULT | wxDP_SHOWCENTURY, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxDatePickerCtrlNameStr) + { + Init(); + + (void)Create(parent, id, date, pos, size, style, validator, name); + } + + bool Create(wxWindow *parent, + wxWindowID id, + const wxDateTime& date = wxDefaultDateTime, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDP_DEFAULT | wxDP_SHOWCENTURY, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxDatePickerCtrlNameStr); + + // wxDatePickerCtrl methods + void SetValue(const wxDateTime& date); + wxDateTime GetValue() const; + + bool GetRange(wxDateTime *dt1, wxDateTime *dt2) const; + void SetRange(const wxDateTime &dt1, const wxDateTime &dt2); + + bool SetDateRange(const wxDateTime& lowerdate = wxDefaultDateTime, + const wxDateTime& upperdate = wxDefaultDateTime); + + // extra methods available only in this (generic) implementation + bool SetFormat(const wxChar *fmt); + wxCalendarCtrl *GetCalendar() const { return m_cal; } + + + // implementation only from now on + // ------------------------------- + + // overridden base class methods + virtual bool Destroy(); + +protected: + virtual wxSize DoGetBestSize() const; + +private: + void Init(); + + void OnText(wxCommandEvent &event); + void OnSize(wxSizeEvent& event); + void OnFocus(wxFocusEvent& event); + + wxCalendarCtrl *m_cal; + wxComboCtrl* m_combo; + wxCalendarComboPopup* m_popup; + + + DECLARE_EVENT_TABLE() + DECLARE_NO_COPY_CLASS(wxDatePickerCtrlGeneric) +}; + +#endif // _WX_GENERIC_DATECTRL_H_ + diff --git a/Externals/wxWidgets/include/wx/generic/dcpsg.h b/Externals/wxWidgets/include/wx/generic/dcpsg.h new file mode 100644 index 0000000000..21e1b74910 --- /dev/null +++ b/Externals/wxWidgets/include/wx/generic/dcpsg.h @@ -0,0 +1,154 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/dcps.h +// Purpose: wxPostScriptDC class +// Author: Julian Smart and others +// Modified by: +// RCS-ID: $Id: dcpsg.h 41751 2006-10-08 21:56:55Z VZ $ +// Copyright: (c) Julian Smart and Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DCPSG_H_ +#define _WX_DCPSG_H_ + +#include "wx/defs.h" + +#if wxUSE_PRINTING_ARCHITECTURE + +#if wxUSE_POSTSCRIPT + +#include "wx/dc.h" +#include "wx/dialog.h" +#include "wx/module.h" +#include "wx/cmndata.h" + +extern WXDLLIMPEXP_DATA_CORE(int) wxPageNumber; + +//----------------------------------------------------------------------------- +// classes +//----------------------------------------------------------------------------- + +class wxPostScriptDC; + +//----------------------------------------------------------------------------- +// wxPostScriptDC +//----------------------------------------------------------------------------- + +class WXDLLEXPORT wxPostScriptDC: public wxDC +{ +public: + wxPostScriptDC(); + + // Recommended constructor + wxPostScriptDC(const wxPrintData& printData); + + // Recommended destructor :-) + virtual ~wxPostScriptDC(); + + virtual bool Ok() const { return IsOk(); } + virtual bool IsOk() const; + + bool CanDrawBitmap() const { return true; } + + void Clear(); + void SetFont( const wxFont& font ); + void SetPen( const wxPen& pen ); + void SetBrush( const wxBrush& brush ); + void SetLogicalFunction( int function ); + void SetBackground( const wxBrush& brush ); + + void DestroyClippingRegion(); + + bool StartDoc(const wxString& message); + void EndDoc(); + void StartPage(); + void EndPage(); + + wxCoord GetCharHeight() const; + wxCoord GetCharWidth() const; + bool CanGetTextExtent() const { return true; } + + // Resolution in pixels per logical inch + wxSize GetPPI() const; + + void SetAxisOrientation( bool xLeftRight, bool yBottomUp ); + void SetDeviceOrigin( wxCoord x, wxCoord y ); + + void SetBackgroundMode(int WXUNUSED(mode)) { } + void SetPalette(const wxPalette& WXUNUSED(palette)) { } + + wxPrintData& GetPrintData() { return m_printData; } + void SetPrintData(const wxPrintData& data) { m_printData = data; } + + virtual int GetDepth() const { return 24; } + + static void SetResolution(int ppi); + static int GetResolution(); + + void PsPrintf( const wxChar* fmt, ... ); + void PsPrint( const char* psdata ); + void PsPrint( int ch ); + +#if wxUSE_UNICODE + void PsPrint( const wxChar* psdata ) { PsPrint( wxConvUTF8.cWX2MB( psdata ) ); } +#endif + +private: + static float ms_PSScaleFactor; + +protected: + bool DoFloodFill(wxCoord x1, wxCoord y1, const wxColour &col, int style = wxFLOOD_SURFACE); + bool DoGetPixel(wxCoord x1, wxCoord y1, wxColour *col) const; + void DoDrawLine(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2); + void DoCrossHair(wxCoord x, wxCoord y) ; + void DoDrawArc(wxCoord x1,wxCoord y1,wxCoord x2,wxCoord y2,wxCoord xc,wxCoord yc); + void DoDrawEllipticArc(wxCoord x,wxCoord y,wxCoord w,wxCoord h,double sa,double ea); + void DoDrawPoint(wxCoord x, wxCoord y); + void DoDrawLines(int n, wxPoint points[], wxCoord xoffset = 0, wxCoord yoffset = 0); + void DoDrawPolygon(int n, wxPoint points[], wxCoord xoffset = 0, wxCoord yoffset = 0, int fillStyle = wxODDEVEN_RULE); + void DoDrawPolyPolygon(int n, int count[], wxPoint points[], wxCoord xoffset = 0, wxCoord yoffset = 0, int fillStyle = wxODDEVEN_RULE); + void DoDrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height); + void DoDrawRoundedRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height, double radius = 20); + void DoDrawEllipse(wxCoord x, wxCoord y, wxCoord width, wxCoord height); +#if wxUSE_SPLINES + void DoDrawSpline(wxList *points); +#endif // wxUSE_SPLINES + bool DoBlit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height, + wxDC *source, wxCoord xsrc, wxCoord ysrc, int rop = wxCOPY, bool useMask = false, + wxCoord xsrcMask = wxDefaultCoord, wxCoord ysrcMask = wxDefaultCoord); + void DoDrawIcon(const wxIcon& icon, wxCoord x, wxCoord y); + void DoDrawBitmap(const wxBitmap& bitmap, wxCoord x, wxCoord y, bool useMask = false); + void DoDrawText(const wxString& text, wxCoord x, wxCoord y); + void DoDrawRotatedText(const wxString& text, wxCoord x, wxCoord y, double angle); + void DoSetClippingRegion(wxCoord x, wxCoord y, wxCoord width, wxCoord height); + void DoSetClippingRegionAsRegion( const wxRegion &WXUNUSED(clip)) { } + void DoGetTextExtent(const wxString& string, wxCoord *x, wxCoord *y, + wxCoord *descent = NULL, + wxCoord *externalLeading = NULL, + wxFont *theFont = NULL) const; + void DoGetSize(int* width, int* height) const; + void DoGetSizeMM(int *width, int *height) const; + + FILE* m_pstream; // PostScript output stream + wxString m_title; + unsigned char m_currentRed; + unsigned char m_currentGreen; + unsigned char m_currentBlue; + int m_pageNumber; + bool m_clipping; + double m_underlinePosition; + double m_underlineThickness; + wxPrintData m_printData; + +private: + DECLARE_DYNAMIC_CLASS(wxPostScriptDC) +}; + +#endif + // wxUSE_POSTSCRIPT + +#endif + // wxUSE_PRINTING_ARCHITECTURE + +#endif + // _WX_DCPSG_H_ diff --git a/Externals/wxWidgets/include/wx/generic/dirctrlg.h b/Externals/wxWidgets/include/wx/generic/dirctrlg.h new file mode 100644 index 0000000000..3f24437676 --- /dev/null +++ b/Externals/wxWidgets/include/wx/generic/dirctrlg.h @@ -0,0 +1,295 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: dirctrlg.h +// Purpose: wxGenericDirCtrl class +// Builds on wxDirCtrl class written by Robert Roebling for the +// wxFile application, modified by Harm van der Heijden. +// Further modified for Windows. +// Author: Robert Roebling, Harm van der Heijden, Julian Smart et al +// Modified by: +// Created: 21/3/2000 +// RCS-ID: $Id: dirctrlg.h 49804 2007-11-10 01:09:42Z VZ $ +// Copyright: (c) Robert Roebling, Harm van der Heijden, Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DIRCTRL_H_ +#define _WX_DIRCTRL_H_ + +#if wxUSE_DIRDLG || wxUSE_FILEDLG + #include "wx/imaglist.h" +#endif + +#if wxUSE_DIRDLG + +#include "wx/treectrl.h" +#include "wx/dialog.h" +#include "wx/dirdlg.h" +#include "wx/choice.h" + +//----------------------------------------------------------------------------- +// classes +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_CORE wxTextCtrl; +class WXDLLIMPEXP_FWD_CORE wxImageList; +class WXDLLIMPEXP_FWD_BASE wxHashTable; + +//----------------------------------------------------------------------------- +// Extra styles for wxGenericDirCtrl +//----------------------------------------------------------------------------- + +enum +{ + // Only allow directory viewing/selection, no files + wxDIRCTRL_DIR_ONLY = 0x0010, + // When setting the default path, select the first file in the directory + wxDIRCTRL_SELECT_FIRST = 0x0020, + // Show the filter list + wxDIRCTRL_SHOW_FILTERS = 0x0040, + // Use 3D borders on internal controls + wxDIRCTRL_3D_INTERNAL = 0x0080, + // Editable labels + wxDIRCTRL_EDIT_LABELS = 0x0100 +}; + +//----------------------------------------------------------------------------- +// wxDirItemData +//----------------------------------------------------------------------------- + +class WXDLLEXPORT wxDirItemData : public wxTreeItemData +{ +public: + wxDirItemData(const wxString& path, const wxString& name, bool isDir); + virtual ~wxDirItemData(){} + void SetNewDirName(const wxString& path); + + bool HasSubDirs() const; + bool HasFiles(const wxString& spec = wxEmptyString) const; + + wxString m_path, m_name; + bool m_isHidden; + bool m_isExpanded; + bool m_isDir; +}; + +//----------------------------------------------------------------------------- +// wxDirCtrl +//----------------------------------------------------------------------------- + +class WXDLLEXPORT wxDirFilterListCtrl; + +class WXDLLEXPORT wxGenericDirCtrl: public wxControl +{ +public: + wxGenericDirCtrl(); + wxGenericDirCtrl(wxWindow *parent, const wxWindowID id = wxID_ANY, + const wxString &dir = wxDirDialogDefaultFolderStr, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDIRCTRL_3D_INTERNAL|wxSUNKEN_BORDER, + const wxString& filter = wxEmptyString, + int defaultFilter = 0, + const wxString& name = wxTreeCtrlNameStr ) + { + Init(); + Create(parent, id, dir, pos, size, style, filter, defaultFilter, name); + } + + bool Create(wxWindow *parent, const wxWindowID id = wxID_ANY, + const wxString &dir = wxDirDialogDefaultFolderStr, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDIRCTRL_3D_INTERNAL|wxSUNKEN_BORDER, + const wxString& filter = wxEmptyString, + int defaultFilter = 0, + const wxString& name = wxTreeCtrlNameStr ); + + virtual void Init(); + + virtual ~wxGenericDirCtrl(); + + void OnExpandItem(wxTreeEvent &event ); + void OnCollapseItem(wxTreeEvent &event ); + void OnBeginEditItem(wxTreeEvent &event ); + void OnEndEditItem(wxTreeEvent &event ); + void OnSize(wxSizeEvent &event ); + + // Try to expand as much of the given path as possible. + virtual bool ExpandPath(const wxString& path); + // collapse the path + virtual bool CollapsePath(const wxString& path); + + // Accessors + + virtual inline wxString GetDefaultPath() const { return m_defaultPath; } + virtual void SetDefaultPath(const wxString& path) { m_defaultPath = path; } + + // Get dir or filename + virtual wxString GetPath() const; + + // Get selected filename path only (else empty string). + // I.e. don't count a directory as a selection + virtual wxString GetFilePath() const; + virtual void SetPath(const wxString& path); + + virtual void ShowHidden( bool show ); + virtual bool GetShowHidden() { return m_showHidden; } + + virtual wxString GetFilter() const { return m_filter; } + virtual void SetFilter(const wxString& filter); + + virtual int GetFilterIndex() const { return m_currentFilter; } + virtual void SetFilterIndex(int n); + + virtual wxTreeItemId GetRootId() { return m_rootId; } + + virtual wxTreeCtrl* GetTreeCtrl() const { return m_treeCtrl; } + virtual wxDirFilterListCtrl* GetFilterListCtrl() const { return m_filterListCtrl; } + + // Helper + virtual void SetupSections(); + +#if WXWIN_COMPATIBILITY_2_4 + // Parse the filter into an array of filters and an array of descriptions + virtual int ParseFilter(const wxString& filterStr, wxArrayString& filters, wxArrayString& descriptions); +#endif // WXWIN_COMPATIBILITY_2_4 + + // Find the child that matches the first part of 'path'. + // E.g. if a child path is "/usr" and 'path' is "/usr/include" + // then the child for /usr is returned. + // If the path string has been used (we're at the leaf), done is set to true + virtual wxTreeItemId FindChild(wxTreeItemId parentId, const wxString& path, bool& done); + + // Resize the components of the control + virtual void DoResize(); + + // Collapse & expand the tree, thus re-creating it from scratch: + virtual void ReCreateTree(); + + // Collapse the entire tree + virtual void CollapseTree(); + +protected: + virtual void ExpandRoot(); + virtual void ExpandDir(wxTreeItemId parentId); + virtual void CollapseDir(wxTreeItemId parentId); + virtual const wxTreeItemId AddSection(const wxString& path, const wxString& name, int imageId = 0); + virtual wxTreeItemId AppendItem (const wxTreeItemId & parent, + const wxString & text, + int image = -1, int selectedImage = -1, + wxTreeItemData * data = NULL); + //void FindChildFiles(wxTreeItemId id, int dirFlags, wxArrayString& filenames); + virtual wxTreeCtrl* CreateTreeCtrl(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long treeStyle); + + // Extract description and actual filter from overall filter string + bool ExtractWildcard(const wxString& filterStr, int n, wxString& filter, wxString& description); + +private: + bool m_showHidden; + wxTreeItemId m_rootId; + wxString m_defaultPath; // Starting path + long m_styleEx; // Extended style + wxString m_filter; // Wildcards in same format as per wxFileDialog + int m_currentFilter; // The current filter index + wxString m_currentFilterStr; // Current filter string + wxTreeCtrl* m_treeCtrl; + wxDirFilterListCtrl* m_filterListCtrl; + +private: + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS(wxGenericDirCtrl) + DECLARE_NO_COPY_CLASS(wxGenericDirCtrl) +}; + +//----------------------------------------------------------------------------- +// wxDirFilterListCtrl +//----------------------------------------------------------------------------- + +class WXDLLEXPORT wxDirFilterListCtrl: public wxChoice +{ +public: + wxDirFilterListCtrl() { Init(); } + wxDirFilterListCtrl(wxGenericDirCtrl* parent, const wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0) + { + Init(); + Create(parent, id, pos, size, style); + } + + bool Create(wxGenericDirCtrl* parent, const wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0); + + void Init(); + + virtual ~wxDirFilterListCtrl() {} + + //// Operations + void FillFilterList(const wxString& filter, int defaultFilter); + + //// Events + void OnSelFilter(wxCommandEvent& event); + +protected: + wxGenericDirCtrl* m_dirCtrl; + + DECLARE_EVENT_TABLE() + DECLARE_CLASS(wxDirFilterListCtrl) + DECLARE_NO_COPY_CLASS(wxDirFilterListCtrl) +}; + +#if !defined(__WXMSW__) && !defined(__WXMAC__) && !defined(__WXPM__) + #define wxDirCtrl wxGenericDirCtrl +#endif + +// Symbols for accessing individual controls +#define wxID_TREECTRL 7000 +#define wxID_FILTERLISTCTRL 7001 + +#endif // wxUSE_DIRDLG + +//------------------------------------------------------------------------- +// wxFileIconsTable - use wxTheFileIconsTable which is created as necessary +//------------------------------------------------------------------------- + +#if wxUSE_DIRDLG || wxUSE_FILEDLG + +class WXDLLEXPORT wxFileIconsTable +{ +public: + wxFileIconsTable(); + ~wxFileIconsTable(); + + enum iconId_Type + { + folder, + folder_open, + computer, + drive, + cdrom, + floppy, + removeable, + file, + executable + }; + + int GetIconID(const wxString& extension, const wxString& mime = wxEmptyString); + wxImageList *GetSmallImageList(); + +protected: + void Create(); // create on first use + + wxImageList *m_smallImageList; + wxHashTable *m_HashTable; +}; + +// The global fileicons table +extern WXDLLEXPORT_DATA(wxFileIconsTable *) wxTheFileIconsTable; + +#endif // wxUSE_DIRDLG || wxUSE_FILEDLG + +#endif + // _WX_DIRCTRLG_H_ diff --git a/Externals/wxWidgets/include/wx/generic/dirdlgg.h b/Externals/wxWidgets/include/wx/generic/dirdlgg.h new file mode 100644 index 0000000000..6fb6a58739 --- /dev/null +++ b/Externals/wxWidgets/include/wx/generic/dirdlgg.h @@ -0,0 +1,89 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/dirdlgg.h +// Purpose: wxGenericDirCtrl class +// Builds on wxDirCtrl class written by Robert Roebling for the +// wxFile application, modified by Harm van der Heijden. +// Further modified for Windows. +// Author: Robert Roebling, Harm van der Heijden, Julian Smart et al +// Modified by: +// Created: 21/3/2000 +// RCS-ID: $Id: dirdlgg.h 39402 2006-05-28 23:32:12Z VZ $ +// Copyright: (c) Robert Roebling, Harm van der Heijden, Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DIRDLGG_H_ +#define _WX_DIRDLGG_H_ + +class WXDLLEXPORT wxGenericDirCtrl; +class WXDLLEXPORT wxTextCtrl; +class WXDLLEXPORT wxTreeEvent; + +// we may be included directly as well as from wx/dirdlg.h (FIXME) +extern WXDLLEXPORT_DATA(const wxChar) wxDirDialogNameStr[]; +extern WXDLLEXPORT_DATA(const wxChar) wxDirSelectorPromptStr[]; + +#ifndef wxDD_DEFAULT_STYLE +#ifdef __WXWINCE__ + #define wxDD_DEFAULT_STYLE wxDEFAULT_DIALOG_STYLE +#else + #define wxDD_DEFAULT_STYLE (wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER) +#endif +#endif + +#include "wx/dialog.h" + +//----------------------------------------------------------------------------- +// wxGenericDirDialog +//----------------------------------------------------------------------------- + +class WXDLLEXPORT wxGenericDirDialog : public wxDirDialogBase +{ +public: + wxGenericDirDialog() : wxDirDialogBase() { } + + wxGenericDirDialog(wxWindow* parent, + const wxString& title = wxDirSelectorPromptStr, + const wxString& defaultPath = wxEmptyString, + long style = wxDD_DEFAULT_STYLE, + const wxPoint& pos = wxDefaultPosition, + const wxSize& sz = wxDefaultSize,//Size(450, 550), + const wxString& name = wxDirDialogNameStr); + + bool Create(wxWindow* parent, + const wxString& title = wxDirSelectorPromptStr, + const wxString& defaultPath = wxEmptyString, + long style = wxDD_DEFAULT_STYLE, + const wxPoint& pos = wxDefaultPosition, + const wxSize& sz = wxDefaultSize,//Size(450, 550), + const wxString& name = wxDirDialogNameStr); + + //// Accessors + void SetPath(const wxString& path); + wxString GetPath() const; + + //// Overrides + virtual int ShowModal(); + virtual void EndModal(int retCode); + + // this one is specific to wxGenericDirDialog + wxTextCtrl* GetInputCtrl() const { return m_input; } + +protected: + //// Event handlers + void OnCloseWindow(wxCloseEvent& event); + void OnOK(wxCommandEvent& event); + void OnTreeSelected(wxTreeEvent &event); + void OnTreeKeyDown(wxTreeEvent &event); + void OnNew(wxCommandEvent& event); + void OnGoHome(wxCommandEvent& event); + void OnShowHidden(wxCommandEvent& event); + + wxGenericDirCtrl* m_dirCtrl; + wxTextCtrl* m_input; + + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS(wxGenericDirDialog) +}; + +#endif // _WX_DIRDLGG_H_ diff --git a/Externals/wxWidgets/include/wx/generic/dragimgg.h b/Externals/wxWidgets/include/wx/generic/dragimgg.h new file mode 100644 index 0000000000..79f2785ba1 --- /dev/null +++ b/Externals/wxWidgets/include/wx/generic/dragimgg.h @@ -0,0 +1,271 @@ +////////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/dragimgg.h +// Purpose: wxDragImage class: a kind of a cursor, that can cope +// with more sophisticated images +// Author: Julian Smart +// Modified by: +// Created: 29/2/2000 +// RCS-ID: $Id: dragimgg.h 42397 2006-10-25 12:12:56Z VS $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DRAGIMGG_H_ +#define _WX_DRAGIMGG_H_ + +#include "wx/bitmap.h" +#include "wx/icon.h" +#include "wx/cursor.h" +#include "wx/treectrl.h" +#include "wx/listctrl.h" +#include "wx/log.h" +#include "wx/overlay.h" + +/* + To use this class, create a wxDragImage when you start dragging, for example: + + void MyTreeCtrl::OnBeginDrag(wxTreeEvent& event) + { +#ifdef __WXMSW__ + ::UpdateWindow((HWND) GetHWND()); // We need to implement this in wxWidgets +#endif + + CaptureMouse(); + + m_dragImage = new wxDragImage(* this, itemId); + m_dragImage->BeginDrag(wxPoint(0, 0), this); + m_dragImage->Move(pt, this); + m_dragImage->Show(this); + ... + } + + In your OnMouseMove function, hide the image, do any display updating required, + then move and show the image again: + + void MyTreeCtrl::OnMouseMove(wxMouseEvent& event) + { + if (m_dragMode == MY_TREE_DRAG_NONE) + { + event.Skip(); + return; + } + + // Prevent screen corruption by hiding the image + if (m_dragImage) + m_dragImage->Hide(this); + + // Do some updating of the window, such as highlighting the drop target + ... + +#ifdef __WXMSW__ + if (updateWindow) + ::UpdateWindow((HWND) GetHWND()); +#endif + + // Move and show the image again + m_dragImage->Move(event.GetPosition(), this); + m_dragImage->Show(this); + } + + Eventually we end the drag and delete the drag image. + + void MyTreeCtrl::OnLeftUp(wxMouseEvent& event) + { + ... + + // End the drag and delete the drag image + if (m_dragImage) + { + m_dragImage->EndDrag(this); + delete m_dragImage; + m_dragImage = NULL; + } + ReleaseMouse(); + } +*/ + +/* + * wxGenericDragImage + */ + +class WXDLLEXPORT wxGenericDragImage: public wxObject +{ +public: + + // Ctors & dtor + //////////////////////////////////////////////////////////////////////////// + + wxGenericDragImage(const wxCursor& cursor = wxNullCursor) + { + Init(); + Create(cursor); + } + + wxGenericDragImage(const wxBitmap& image, const wxCursor& cursor = wxNullCursor) + { + Init(); + + Create(image, cursor); + } + + wxGenericDragImage(const wxIcon& image, const wxCursor& cursor = wxNullCursor) + { + Init(); + + Create(image, cursor); + } + + wxGenericDragImage(const wxString& str, const wxCursor& cursor = wxNullCursor) + { + Init(); + + Create(str, cursor); + } + +#if WXWIN_COMPATIBILITY_2_6 + // don't use in new code, use versions without hot spot parameter + wxDEPRECATED( wxGenericDragImage(const wxCursor& cursor, const wxPoint& cursorHotspot) ); + wxDEPRECATED( wxGenericDragImage(const wxBitmap& image, const wxCursor& cursor, const wxPoint& cursorHotspot) ); + wxDEPRECATED( wxGenericDragImage(const wxIcon& image, const wxCursor& cursor, const wxPoint& cursorHotspot) ); + wxDEPRECATED( wxGenericDragImage(const wxString& str, const wxCursor& cursor, const wxPoint& cursorHotspot) ); + wxDEPRECATED( bool Create(const wxCursor& cursor, const wxPoint& cursorHotspot) ); + wxDEPRECATED( bool Create(const wxBitmap& image, const wxCursor& cursor, const wxPoint& cursorHotspot) ); + wxDEPRECATED( bool Create(const wxIcon& image, const wxCursor& cursor, const wxPoint& cursorHotspot) ); + wxDEPRECATED( bool Create(const wxString& str, const wxCursor& cursor, const wxPoint& cursorHotspot) ); +#endif // WXWIN_COMPATIBILITY_2_6 + +#if wxUSE_TREECTRL + wxGenericDragImage(const wxTreeCtrl& treeCtrl, wxTreeItemId& id) + { + Init(); + + Create(treeCtrl, id); + } +#endif + +#if wxUSE_LISTCTRL + wxGenericDragImage(const wxListCtrl& listCtrl, long id) + { + Init(); + + Create(listCtrl, id); + } +#endif + + virtual ~wxGenericDragImage(); + + // Attributes + //////////////////////////////////////////////////////////////////////////// + + // For efficiency, tell wxGenericDragImage to use a bitmap that's already + // created (e.g. from last drag) + void SetBackingBitmap(wxBitmap* bitmap) { +#ifndef wxHAS_NATIVE_OVERLAY + m_pBackingBitmap = bitmap; +#endif + } + + // Operations + //////////////////////////////////////////////////////////////////////////// + + // Create a drag image with a virtual image (need to override DoDrawImage, GetImageRect) + bool Create(const wxCursor& cursor = wxNullCursor); + + // Create a drag image from a bitmap and optional cursor + bool Create(const wxBitmap& image, const wxCursor& cursor = wxNullCursor); + + // Create a drag image from an icon and optional cursor + bool Create(const wxIcon& image, const wxCursor& cursor = wxNullCursor); + + // Create a drag image from a string and optional cursor + bool Create(const wxString& str, const wxCursor& cursor = wxNullCursor); + +#if wxUSE_TREECTRL + // Create a drag image for the given tree control item + bool Create(const wxTreeCtrl& treeCtrl, wxTreeItemId& id); +#endif + +#if wxUSE_LISTCTRL + // Create a drag image for the given list control item + bool Create(const wxListCtrl& listCtrl, long id); +#endif + + // Begin drag. hotspot is the location of the drag position relative to the upper-left + // corner of the image. + bool BeginDrag(const wxPoint& hotspot, wxWindow* window, bool fullScreen = false, wxRect* rect = (wxRect*) NULL); + + // Begin drag. hotspot is the location of the drag position relative to the upper-left + // corner of the image. This is full screen only. fullScreenRect gives the + // position of the window on the screen, to restrict the drag to. + bool BeginDrag(const wxPoint& hotspot, wxWindow* window, wxWindow* fullScreenRect); + + // End drag + bool EndDrag(); + + // Move the image: call from OnMouseMove. Pt is in window client coordinates if window + // is non-NULL, or in screen coordinates if NULL. + bool Move(const wxPoint& pt); + + // Show the image + bool Show(); + + // Hide the image + bool Hide(); + + // Implementation + //////////////////////////////////////////////////////////////////////////// + + void Init(); + + // Override this if you are using a virtual image (drawing your own image) + virtual wxRect GetImageRect(const wxPoint& pos) const; + + // Override this if you are using a virtual image (drawing your own image) + virtual bool DoDrawImage(wxDC& dc, const wxPoint& pos) const; + + // Override this if you wish to draw the window contents to the backing bitmap + // yourself. This can be desirable if you wish to avoid flicker by not having to + // redraw the window itself before dragging in order to be graphic-minus-dragged-objects. + // Instead, paint the drag image's backing bitmap to be correct, and leave the window + // to be updated only when dragging the objects away (thus giving a smoother appearance). + virtual bool UpdateBackingFromWindow(wxDC& windowDC, wxMemoryDC& destDC, + const wxRect& sourceRect, const wxRect& destRect) const; + + // Erase and redraw simultaneously if possible + virtual bool RedrawImage(const wxPoint& oldPos, const wxPoint& newPos, bool eraseOld, bool drawNew); + +protected: + wxBitmap m_bitmap; + wxIcon m_icon; + wxCursor m_cursor; + wxCursor m_oldCursor; +// wxPoint m_hotspot; + wxPoint m_offset; // The hostpot value passed to BeginDrag + wxPoint m_position; + bool m_isDirty; + bool m_isShown; + wxWindow* m_window; + wxDC* m_windowDC; + +#ifdef wxHAS_NATIVE_OVERLAY + wxOverlay m_overlay; + wxDCOverlay* m_dcOverlay; +#else + // Stores the window contents while we're dragging the image around + wxBitmap m_backingBitmap; + wxBitmap* m_pBackingBitmap; // Pointer to existing backing bitmap + // (pass to wxGenericDragImage as an efficiency measure) + // A temporary bitmap for repairing/redrawing + wxBitmap m_repairBitmap; +#endif // !wxHAS_NATIVE_OVERLAY + + wxRect m_boundingRect; + bool m_fullScreen; + +private: + DECLARE_DYNAMIC_CLASS(wxGenericDragImage) + DECLARE_NO_COPY_CLASS(wxGenericDragImage) +}; + +#endif + // _WX_DRAGIMGG_H_ diff --git a/Externals/wxWidgets/include/wx/generic/fdrepdlg.h b/Externals/wxWidgets/include/wx/generic/fdrepdlg.h new file mode 100644 index 0000000000..e1bddf33c9 --- /dev/null +++ b/Externals/wxWidgets/include/wx/generic/fdrepdlg.h @@ -0,0 +1,71 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/fdrepdlg.h +// Purpose: wxGenericFindReplaceDialog class +// Author: Markus Greither +// Modified by: +// Created: 25/05/2001 +// RCS-ID: +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GENERIC_FDREPDLG_H_ +#define _WX_GENERIC_FDREPDLG_H_ + +class WXDLLEXPORT wxCheckBox; +class WXDLLEXPORT wxRadioBox; +class WXDLLEXPORT wxTextCtrl; + +// ---------------------------------------------------------------------------- +// wxGenericFindReplaceDialog: dialog for searching / replacing text +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxGenericFindReplaceDialog : public wxFindReplaceDialogBase +{ +public: + wxGenericFindReplaceDialog() { Init(); } + + wxGenericFindReplaceDialog(wxWindow *parent, + wxFindReplaceData *data, + const wxString& title, + int style = 0) + { + Init(); + + (void)Create(parent, data, title, style); + } + + bool Create(wxWindow *parent, + wxFindReplaceData *data, + const wxString& title, + int style = 0); + +protected: + void Init(); + + void SendEvent(const wxEventType& evtType); + + void OnFind(wxCommandEvent& event); + void OnReplace(wxCommandEvent& event); + void OnReplaceAll(wxCommandEvent& event); + void OnCancel(wxCommandEvent& event); + + void OnUpdateFindUI(wxUpdateUIEvent& event); + + void OnCloseWindow(wxCloseEvent& event); + + wxCheckBox *m_chkCase, + *m_chkWord; + + wxRadioBox *m_radioDir; + + wxTextCtrl *m_textFind, + *m_textRepl; + +private: + DECLARE_DYNAMIC_CLASS(wxGenericFindReplaceDialog) + + DECLARE_EVENT_TABLE() +}; + +#endif // _WX_GENERIC_FDREPDLG_H_ diff --git a/Externals/wxWidgets/include/wx/generic/filedlgg.h b/Externals/wxWidgets/include/wx/generic/filedlgg.h new file mode 100644 index 0000000000..eaf680b018 --- /dev/null +++ b/Externals/wxWidgets/include/wx/generic/filedlgg.h @@ -0,0 +1,307 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/filedlgg.h +// Purpose: wxGenericFileDialog +// Author: Robert Roebling +// Modified by: +// Created: 8/17/99 +// Copyright: (c) Robert Roebling +// RCS-ID: $Id: filedlgg.h 39631 2006-06-08 10:05:42Z RR $ +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_FILEDLGG_H_ +#define _WX_FILEDLGG_H_ + +#include "wx/listctrl.h" +#include "wx/datetime.h" +#include "wx/filefn.h" +#include "wx/filedlg.h" + +//----------------------------------------------------------------------------- +// classes +//----------------------------------------------------------------------------- + +class WXDLLEXPORT wxBitmapButton; +class WXDLLEXPORT wxCheckBox; +class WXDLLEXPORT wxChoice; +class WXDLLEXPORT wxFileData; +class WXDLLEXPORT wxFileCtrl; +class WXDLLEXPORT wxGenericFileDialog; +class WXDLLEXPORT wxListEvent; +class WXDLLEXPORT wxListItem; +class WXDLLEXPORT wxStaticText; +class WXDLLEXPORT wxTextCtrl; + +//------------------------------------------------------------------------- +// wxGenericFileDialog +//------------------------------------------------------------------------- + +class WXDLLEXPORT wxGenericFileDialog: public wxFileDialogBase +{ +public: + wxGenericFileDialog() : wxFileDialogBase() { Init(); } + + wxGenericFileDialog(wxWindow *parent, + const wxString& message = wxFileSelectorPromptStr, + const wxString& defaultDir = wxEmptyString, + const wxString& defaultFile = wxEmptyString, + const wxString& wildCard = wxFileSelectorDefaultWildcardStr, + long style = wxFD_DEFAULT_STYLE, + const wxPoint& pos = wxDefaultPosition, + const wxSize& sz = wxDefaultSize, + const wxString& name = wxFileDialogNameStr, + bool bypassGenericImpl = false ); + + bool Create( wxWindow *parent, + const wxString& message = wxFileSelectorPromptStr, + const wxString& defaultDir = wxEmptyString, + const wxString& defaultFile = wxEmptyString, + const wxString& wildCard = wxFileSelectorDefaultWildcardStr, + long style = wxFD_DEFAULT_STYLE, + const wxPoint& pos = wxDefaultPosition, + const wxSize& sz = wxDefaultSize, + const wxString& name = wxFileDialogNameStr, + bool bypassGenericImpl = false ); + + virtual ~wxGenericFileDialog(); + + virtual void SetMessage(const wxString& message) { SetTitle(message); } + virtual void SetPath(const wxString& path); + virtual void SetFilterIndex(int filterIndex); + virtual void SetWildcard(const wxString& wildCard); + + // for multiple file selection + virtual void GetPaths(wxArrayString& paths) const; + virtual void GetFilenames(wxArrayString& files) const; + + // implementation only from now on + // ------------------------------- + + virtual int ShowModal(); + virtual bool Show( bool show = true ); + + void OnSelected( wxListEvent &event ); + void OnActivated( wxListEvent &event ); + void OnList( wxCommandEvent &event ); + void OnReport( wxCommandEvent &event ); + void OnUp( wxCommandEvent &event ); + void OnHome( wxCommandEvent &event ); + void OnListOk( wxCommandEvent &event ); + void OnNew( wxCommandEvent &event ); + void OnChoiceFilter( wxCommandEvent &event ); + void OnTextEnter( wxCommandEvent &event ); + void OnTextChange( wxCommandEvent &event ); + void OnCheck( wxCommandEvent &event ); + + virtual void HandleAction( const wxString &fn ); + + virtual void UpdateControls(); + +private: + // Don't use this implementation at all :-) + bool m_bypassGenericImpl; + +protected: + // use the filter with the given index + void DoSetFilterIndex(int filterindex); + + wxString m_filterExtension; + wxChoice *m_choice; + wxTextCtrl *m_text; + wxFileCtrl *m_list; + wxCheckBox *m_check; + wxStaticText *m_static; + wxBitmapButton *m_upDirButton; + wxBitmapButton *m_newDirButton; + +private: + void Init(); + DECLARE_DYNAMIC_CLASS(wxGenericFileDialog) + DECLARE_EVENT_TABLE() + + // these variables are preserved between wxGenericFileDialog calls + static long ms_lastViewStyle; // list or report? + static bool ms_lastShowHidden; // did we show hidden files? +}; + +#ifdef wxUSE_GENERIC_FILEDIALOG + +class WXDLLEXPORT wxFileDialog: public wxGenericFileDialog +{ +public: + wxFileDialog() {} + + wxFileDialog(wxWindow *parent, + const wxString& message = wxFileSelectorPromptStr, + const wxString& defaultDir = wxEmptyString, + const wxString& defaultFile = wxEmptyString, + const wxString& wildCard = wxFileSelectorDefaultWildcardStr, + long style = 0, + const wxPoint& pos = wxDefaultPosition) + :wxGenericFileDialog(parent, message, defaultDir, defaultFile, wildCard, style, pos) + { + } + +private: + DECLARE_DYNAMIC_CLASS(wxFileDialog) +}; + +#endif // wxUSE_GENERIC_FILEDIALOG + +//----------------------------------------------------------------------------- +// wxFileData - a class to hold the file info for the wxFileCtrl +//----------------------------------------------------------------------------- + +class WXDLLEXPORT wxFileData +{ +public: + enum fileType + { + is_file = 0x0000, + is_dir = 0x0001, + is_link = 0x0002, + is_exe = 0x0004, + is_drive = 0x0008 + }; + + wxFileData() { Init(); } + // Full copy constructor + wxFileData( const wxFileData& fileData ) { Copy(fileData); } + // Create a filedata from this information + wxFileData( const wxString &filePath, const wxString &fileName, + fileType type, int image_id ); + + // make a full copy of the other wxFileData + void Copy( const wxFileData &other ); + + // (re)read the extra data about the file from the system + void ReadData(); + + // get the name of the file, dir, drive + wxString GetFileName() const { return m_fileName; } + // get the full path + name of the file, dir, path + wxString GetFilePath() const { return m_filePath; } + // Set the path + name and name of the item + void SetNewName( const wxString &filePath, const wxString &fileName ); + + // Get the size of the file in bytes + wxFileOffset GetSize() const { return m_size; } + // Get the type of file, either file extension or , , + wxString GetFileType() const; + // get the last modification time + wxDateTime GetDateTime() const { return m_dateTime; } + // Get the time as a formatted string + wxString GetModificationTime() const; + // in UNIX get rwx for file, in MSW get attributes ARHS + wxString GetPermissions() const { return m_permissions; } + // Get the id of the image used in a wxImageList + int GetImageId() const { return m_image; } + + bool IsFile() const { return !IsDir() && !IsLink() && !IsDrive(); } + bool IsDir() const { return (m_type & is_dir ) != 0; } + bool IsLink() const { return (m_type & is_link ) != 0; } + bool IsExe() const { return (m_type & is_exe ) != 0; } + bool IsDrive() const { return (m_type & is_drive) != 0; } + + // Get/Set the type of file, file/dir/drive/link + int GetType() const { return m_type; } + + // the wxFileCtrl fields in report view + enum fileListFieldType + { + FileList_Name, + FileList_Size, + FileList_Type, + FileList_Time, +#if defined(__UNIX__) || defined(__WIN32__) + FileList_Perm, +#endif // defined(__UNIX__) || defined(__WIN32__) + FileList_Max + }; + + // Get the entry for report view of wxFileCtrl + wxString GetEntry( fileListFieldType num ) const; + + // Get a string representation of the file info + wxString GetHint() const; + // initialize a wxListItem attributes + void MakeItem( wxListItem &item ); + + // operators + wxFileData& operator = (const wxFileData& fd) { Copy(fd); return *this; } + +protected: + wxString m_fileName; + wxString m_filePath; + wxFileOffset m_size; + wxDateTime m_dateTime; + wxString m_permissions; + int m_type; + int m_image; + +private: + void Init(); +}; + +//----------------------------------------------------------------------------- +// wxFileCtrl +//----------------------------------------------------------------------------- + +class WXDLLEXPORT wxFileCtrl : public wxListCtrl +{ +public: + wxFileCtrl(); + wxFileCtrl( wxWindow *win, + wxWindowID id, + const wxString &wild, + bool showHidden, + const wxPoint &pos = wxDefaultPosition, + const wxSize &size = wxDefaultSize, + long style = wxLC_LIST, + const wxValidator &validator = wxDefaultValidator, + const wxString &name = wxT("filelist") ); + virtual ~wxFileCtrl(); + + virtual void ChangeToListMode(); + virtual void ChangeToReportMode(); + virtual void ChangeToSmallIconMode(); + virtual void ShowHidden( bool show = true ); + bool GetShowHidden() const { return m_showHidden; } + + virtual long Add( wxFileData *fd, wxListItem &item ); + virtual void UpdateItem(const wxListItem &item); + virtual void UpdateFiles(); + virtual void MakeDir(); + virtual void GoToParentDir(); + virtual void GoToHomeDir(); + virtual void GoToDir( const wxString &dir ); + virtual void SetWild( const wxString &wild ); + wxString GetWild() const { return m_wild; } + wxString GetDir() const { return m_dirName; } + + void OnListDeleteItem( wxListEvent &event ); + void OnListDeleteAllItems( wxListEvent &event ); + void OnListEndLabelEdit( wxListEvent &event ); + void OnListColClick( wxListEvent &event ); + + virtual void SortItems(wxFileData::fileListFieldType field, bool foward); + bool GetSortDirection() const { return m_sort_foward; } + wxFileData::fileListFieldType GetSortField() const { return m_sort_field; } + +protected: + void FreeItemData(wxListItem& item); + void FreeAllItemsData(); + + wxString m_dirName; + bool m_showHidden; + wxString m_wild; + + bool m_sort_foward; + wxFileData::fileListFieldType m_sort_field; + +private: + DECLARE_DYNAMIC_CLASS(wxFileCtrl) + DECLARE_EVENT_TABLE() +}; + +#endif // _WX_FILEDLGG_H_ diff --git a/Externals/wxWidgets/include/wx/generic/filepickerg.h b/Externals/wxWidgets/include/wx/generic/filepickerg.h new file mode 100644 index 0000000000..769d20b4aa --- /dev/null +++ b/Externals/wxWidgets/include/wx/generic/filepickerg.h @@ -0,0 +1,213 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/filepickerg.h +// Purpose: wxGenericFileDirButton, wxGenericFileButton, wxGenericDirButton +// Author: Francesco Montorsi +// Modified by: +// Created: 14/4/2006 +// Copyright: (c) Francesco Montorsi +// RCS-ID: $Id: filepickerg.h 40100 2006-07-15 15:13:04Z VS $ +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_FILEDIRPICKER_H_ +#define _WX_FILEDIRPICKER_H_ + +#include "wx/button.h" +#include "wx/filedlg.h" +#include "wx/dirdlg.h" + + +extern WXDLLEXPORT_DATA(const wxEventType) wxEVT_COMMAND_DIRPICKER_CHANGED; +extern WXDLLEXPORT_DATA(const wxEventType) wxEVT_COMMAND_FILEPICKER_CHANGED; + + +//----------------------------------------------------------------------------- +// wxGenericFileDirButton: a button which brings up a wx{File|Dir}Dialog +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxGenericFileDirButton : public wxButton, + public wxFileDirPickerWidgetBase +{ +public: + wxGenericFileDirButton() { } + wxGenericFileDirButton(wxWindow *parent, + wxWindowID id, + const wxString& label = wxFilePickerWidgetLabel, + const wxString& path = wxEmptyString, + const wxString &message = wxFileSelectorPromptStr, + const wxString &wildcard = wxFileSelectorDefaultWildcardStr, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxFilePickerWidgetNameStr) + { + Create(parent, id, label, path, message, wildcard, + pos, size, style, validator, name); + } + + virtual ~wxGenericFileDirButton() {} + + virtual wxControl *AsControl() { return this; } + +public: // overrideable + + virtual wxDialog *CreateDialog() = 0; + + virtual wxWindow *GetDialogParent() + { return GetParent(); } + + virtual wxEventType GetEventType() const = 0; + +public: + + bool Create(wxWindow *parent, wxWindowID id, + const wxString& label = wxFilePickerWidgetLabel, + const wxString& path = wxEmptyString, + const wxString &message = wxFileSelectorPromptStr, + const wxString &wildcard = wxFileSelectorDefaultWildcardStr, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxFilePickerWidgetNameStr); + + // event handler for the click + void OnButtonClick(wxCommandEvent &); + +protected: + wxString m_message, m_wildcard; +}; + + +//----------------------------------------------------------------------------- +// wxGenericFileButton: a button which brings up a wxFileDialog +//----------------------------------------------------------------------------- + +#define wxFILEBTN_DEFAULT_STYLE (wxFLP_OPEN) + +class WXDLLIMPEXP_CORE wxGenericFileButton : public wxGenericFileDirButton +{ +public: + wxGenericFileButton() {} + wxGenericFileButton(wxWindow *parent, + wxWindowID id, + const wxString& label = wxFilePickerWidgetLabel, + const wxString& path = wxEmptyString, + const wxString &message = wxFileSelectorPromptStr, + const wxString &wildcard = wxFileSelectorDefaultWildcardStr, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxFILEBTN_DEFAULT_STYLE, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxFilePickerWidgetNameStr) + { + Create(parent, id, label, path, message, wildcard, + pos, size, style, validator, name); + } + +public: // overrideable + + virtual long GetDialogStyle() const + { + long filedlgstyle = 0; + + if (this->HasFlag(wxFLP_OPEN)) + filedlgstyle |= wxFD_OPEN; + if (this->HasFlag(wxFLP_SAVE)) + filedlgstyle |= wxFD_SAVE; + if (this->HasFlag(wxFLP_OVERWRITE_PROMPT)) + filedlgstyle |= wxFD_OVERWRITE_PROMPT; + if (this->HasFlag(wxFLP_FILE_MUST_EXIST)) + filedlgstyle |= wxFD_FILE_MUST_EXIST; + if (this->HasFlag(wxFLP_CHANGE_DIR)) + filedlgstyle |= wxFD_CHANGE_DIR; + + return filedlgstyle; + } + + virtual wxDialog *CreateDialog() + { + wxFileDialog *p = new wxFileDialog(GetDialogParent(), m_message, + wxEmptyString, wxEmptyString, + m_wildcard, GetDialogStyle()); + + // this sets both the default folder and the default file of the dialog + p->SetPath(m_path); + return p; + } + + wxEventType GetEventType() const + { return wxEVT_COMMAND_FILEPICKER_CHANGED; } + +protected: + void UpdateDialogPath(wxDialog *p) + { wxStaticCast(p, wxFileDialog)->SetPath(m_path); } + void UpdatePathFromDialog(wxDialog *p) + { m_path = wxStaticCast(p, wxFileDialog)->GetPath(); } + +private: + DECLARE_DYNAMIC_CLASS(wxGenericFileButton) +}; + + +//----------------------------------------------------------------------------- +// wxGenericDirButton: a button which brings up a wxDirDialog +//----------------------------------------------------------------------------- + +#define wxDIRBTN_DEFAULT_STYLE 0 + +class WXDLLIMPEXP_CORE wxGenericDirButton : public wxGenericFileDirButton +{ +public: + wxGenericDirButton() {} + wxGenericDirButton(wxWindow *parent, + wxWindowID id, + const wxString& label = wxDirPickerWidgetLabel, + const wxString& path = wxEmptyString, + const wxString &message = wxDirSelectorPromptStr, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDIRBTN_DEFAULT_STYLE, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxDirPickerWidgetNameStr) + { + Create(parent, id, label, path, message, wxEmptyString, + pos, size, style, validator, name); + } + +public: // overrideable + + virtual long GetDialogStyle() const + { + long dirdlgstyle = wxDD_DEFAULT_STYLE; + + if (this->HasFlag(wxDIRP_DIR_MUST_EXIST)) + dirdlgstyle |= wxDD_DIR_MUST_EXIST; + if (this->HasFlag(wxDIRP_CHANGE_DIR)) + dirdlgstyle |= wxDD_CHANGE_DIR; + + return dirdlgstyle; + } + + virtual wxDialog *CreateDialog() + { + return new wxDirDialog(GetDialogParent(), m_message, m_path, + GetDialogStyle()); + } + + wxEventType GetEventType() const + { return wxEVT_COMMAND_DIRPICKER_CHANGED; } + +protected: + void UpdateDialogPath(wxDialog *p) + { wxStaticCast(p, wxDirDialog)->SetPath(m_path); } + void UpdatePathFromDialog(wxDialog *p) + { m_path = wxStaticCast(p, wxDirDialog)->GetPath(); } + +private: + DECLARE_DYNAMIC_CLASS(wxGenericDirButton) +}; + + +#endif // _WX_FILEDIRPICKER_H_ diff --git a/Externals/wxWidgets/include/wx/generic/fontdlgg.h b/Externals/wxWidgets/include/wx/generic/fontdlgg.h new file mode 100644 index 0000000000..cd13b85322 --- /dev/null +++ b/Externals/wxWidgets/include/wx/generic/fontdlgg.h @@ -0,0 +1,120 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/fontdlgg.h +// Purpose: wxGenericFontDialog +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: fontdlgg.h 39286 2006-05-23 11:16:47Z JS $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GENERIC_FONTDLGG_H +#define _WX_GENERIC_FONTDLGG_H + +#include "wx/defs.h" +#include "wx/gdicmn.h" +#include "wx/font.h" +#include "wx/dialog.h" +#include "wx/cmndata.h" + +#ifdef __WXWINCE__ +#define USE_SPINCTRL_FOR_POINT_SIZE 1 +class WXDLLEXPORT wxSpinEvent; +#else +#define USE_SPINCTRL_FOR_POINT_SIZE 0 +#endif + +/* + * FONT DIALOG + */ + +class WXDLLEXPORT wxChoice; +class WXDLLEXPORT wxText; +class WXDLLEXPORT wxCheckBox; +class WXDLLEXPORT wxFontPreviewer; + +enum +{ + wxID_FONT_UNDERLINE = 3000, + wxID_FONT_STYLE, + wxID_FONT_WEIGHT, + wxID_FONT_FAMILY, + wxID_FONT_COLOUR, + wxID_FONT_SIZE +}; + +class WXDLLEXPORT wxGenericFontDialog : public wxFontDialogBase +{ +public: + wxGenericFontDialog() { Init(); } + wxGenericFontDialog(wxWindow *parent) + : wxFontDialogBase(parent) { Init(); } + wxGenericFontDialog(wxWindow *parent, const wxFontData& data) + : wxFontDialogBase(parent, data) { Init(); } + virtual ~wxGenericFontDialog(); + + virtual int ShowModal(); + +#if WXWIN_COMPATIBILITY_2_6 + // deprecated, for backwards compatibility only + wxDEPRECATED( wxGenericFontDialog(wxWindow *parent, const wxFontData *data) ); +#endif // WXWIN_COMPATIBILITY_2_6 + + // Internal functions + void OnCloseWindow(wxCloseEvent& event); + + virtual void CreateWidgets(); + virtual void InitializeFont(); + + void OnChangeFont(wxCommandEvent& event); + +#if USE_SPINCTRL_FOR_POINT_SIZE + void OnChangeSize(wxSpinEvent& event); +#endif + +protected: + + virtual bool DoCreate(wxWindow *parent); + +private: + + // common part of all ctors + void Init(); + + void DoChangeFont(); + + wxFont m_dialogFont; + + wxChoice *m_familyChoice; + wxChoice *m_styleChoice; + wxChoice *m_weightChoice; + wxChoice *m_colourChoice; + wxCheckBox *m_underLineCheckBox; + +#if !USE_SPINCTRL_FOR_POINT_SIZE + wxChoice *m_pointSizeChoice; +#endif + + wxFontPreviewer *m_previewer; + bool m_useEvents; + + // static bool fontDialogCancelled; + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS(wxGenericFontDialog) +}; + +WXDLLEXPORT const wxChar *wxFontFamilyIntToString(int family); +WXDLLEXPORT const wxChar *wxFontWeightIntToString(int weight); +WXDLLEXPORT const wxChar *wxFontStyleIntToString(int style); +WXDLLEXPORT int wxFontFamilyStringToInt(wxChar *family); +WXDLLEXPORT int wxFontWeightStringToInt(wxChar *weight); +WXDLLEXPORT int wxFontStyleStringToInt(wxChar *style); + +#if WXWIN_COMPATIBILITY_2_6 + // deprecated, for backwards compatibility only +inline wxGenericFontDialog::wxGenericFontDialog(wxWindow *parent, const wxFontData *data) + :wxFontDialogBase(parent) { Init(); InitFontData(data); Create(parent); } +#endif // WXWIN_COMPATIBILITY_2_6 + +#endif // _WX_GENERIC_FONTDLGG_H diff --git a/Externals/wxWidgets/include/wx/generic/fontpickerg.h b/Externals/wxWidgets/include/wx/generic/fontpickerg.h new file mode 100644 index 0000000000..cfa612aa97 --- /dev/null +++ b/Externals/wxWidgets/include/wx/generic/fontpickerg.h @@ -0,0 +1,82 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/fontpickerg.h +// Purpose: wxGenericFontButton header +// Author: Francesco Montorsi +// Modified by: +// Created: 14/4/2006 +// Copyright: (c) Francesco Montorsi +// RCS-ID: $Id: fontpickerg.h 42999 2006-11-03 21:54:13Z VZ $ +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_FONTPICKER_H_ +#define _WX_FONTPICKER_H_ + +#include "wx/button.h" +#include "wx/cmndata.h" + +//----------------------------------------------------------------------------- +// wxGenericFontButton: a button which brings up a wxColourDialog +//----------------------------------------------------------------------------- + +#define wxFONTBTN_DEFAULT_STYLE \ + (wxFNTP_FONTDESC_AS_LABEL | wxFNTP_USEFONT_FOR_LABEL) + +class WXDLLIMPEXP_CORE wxGenericFontButton : public wxButton, + public wxFontPickerWidgetBase +{ +public: + wxGenericFontButton() {} + wxGenericFontButton(wxWindow *parent, + wxWindowID id, + const wxFont &initial = wxNullFont, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxFONTBTN_DEFAULT_STYLE, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxFontPickerWidgetNameStr) + { + Create(parent, id, initial, pos, size, style, validator, name); + } + + virtual ~wxGenericFontButton() {} + + +public: // API extensions specific for wxGenericFontButton + + // user can override this to init font data in a different way + virtual void InitFontData(); + + // returns the font data shown in wxColourDialog + wxFontData *GetFontData() { return &ms_data; } + + +public: + + bool Create(wxWindow *parent, + wxWindowID id, + const wxFont &initial = *wxNORMAL_FONT, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxFONTBTN_DEFAULT_STYLE, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxFontPickerWidgetNameStr); + + void OnButtonClick(wxCommandEvent &); + + +protected: + + void UpdateFont(); + + // the colour data shown in wxColourPickerCtrlGeneric + // controls. This member is static so that all colour pickers + // in the program share the same set of custom colours. + static wxFontData ms_data; + +private: + DECLARE_DYNAMIC_CLASS(wxGenericFontButton) +}; + + +#endif // _WX_FONTPICKER_H_ diff --git a/Externals/wxWidgets/include/wx/generic/grid.h b/Externals/wxWidgets/include/wx/generic/grid.h new file mode 100644 index 0000000000..e55ed0aec0 --- /dev/null +++ b/Externals/wxWidgets/include/wx/generic/grid.h @@ -0,0 +1,2292 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/grid.h +// Purpose: wxGrid and related classes +// Author: Michael Bedward (based on code by Julian Smart, Robin Dunn) +// Modified by: Santiago Palacios +// Created: 1/08/1999 +// RCS-ID: $Id: grid.h 49804 2007-11-10 01:09:42Z VZ $ +// Copyright: (c) Michael Bedward +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GENERIC_GRID_H_ +#define _WX_GENERIC_GRID_H_ + +#include "wx/defs.h" + +#if wxUSE_GRID + +#include "wx/scrolwin.h" + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +extern WXDLLIMPEXP_DATA_ADV(const wxChar) wxGridNameStr[]; + +// Default parameters for wxGrid +// +#define WXGRID_DEFAULT_NUMBER_ROWS 10 +#define WXGRID_DEFAULT_NUMBER_COLS 10 +#if defined(__WXMSW__) || defined(__WXGTK20__) +#define WXGRID_DEFAULT_ROW_HEIGHT 25 +#else +#define WXGRID_DEFAULT_ROW_HEIGHT 30 +#endif // __WXMSW__ +#define WXGRID_DEFAULT_COL_WIDTH 80 +#define WXGRID_DEFAULT_COL_LABEL_HEIGHT 32 +#define WXGRID_DEFAULT_ROW_LABEL_WIDTH 82 +#define WXGRID_LABEL_EDGE_ZONE 2 +#define WXGRID_MIN_ROW_HEIGHT 15 +#define WXGRID_MIN_COL_WIDTH 15 +#define WXGRID_DEFAULT_SCROLLBAR_WIDTH 16 + +// type names for grid table values +#define wxGRID_VALUE_STRING _T("string") +#define wxGRID_VALUE_BOOL _T("bool") +#define wxGRID_VALUE_NUMBER _T("long") +#define wxGRID_VALUE_FLOAT _T("double") +#define wxGRID_VALUE_CHOICE _T("choice") + +#define wxGRID_VALUE_TEXT wxGRID_VALUE_STRING +#define wxGRID_VALUE_LONG wxGRID_VALUE_NUMBER + +// ---------------------------------------------------------------------------- +// forward declarations +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_ADV wxGrid; +class WXDLLIMPEXP_FWD_ADV wxGridCellAttr; +class WXDLLIMPEXP_FWD_ADV wxGridCellAttrProviderData; +class WXDLLIMPEXP_FWD_ADV wxGridColLabelWindow; +class WXDLLIMPEXP_FWD_ADV wxGridCornerLabelWindow; +class WXDLLIMPEXP_FWD_ADV wxGridRowLabelWindow; +class WXDLLIMPEXP_FWD_ADV wxGridWindow; +class WXDLLIMPEXP_FWD_ADV wxGridTypeRegistry; +class WXDLLIMPEXP_FWD_ADV wxGridSelection; + +class WXDLLIMPEXP_FWD_CORE wxCheckBox; +class WXDLLIMPEXP_FWD_CORE wxComboBox; +class WXDLLIMPEXP_FWD_CORE wxTextCtrl; +#if wxUSE_SPINCTRL +class WXDLLIMPEXP_FWD_CORE wxSpinCtrl; +#endif + +// ---------------------------------------------------------------------------- +// macros +// ---------------------------------------------------------------------------- + +#define wxSafeIncRef(p) if ( p ) (p)->IncRef() +#define wxSafeDecRef(p) if ( p ) (p)->DecRef() + +// ---------------------------------------------------------------------------- +// wxGridCellWorker: common base class for wxGridCellRenderer and +// wxGridCellEditor +// +// NB: this is more an implementation convenience than a design issue, so this +// class is not documented and is not public at all +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxGridCellWorker : public wxClientDataContainer +{ +public: + wxGridCellWorker() { m_nRef = 1; } + + // this class is ref counted: it is created with ref count of 1, so + // calling DecRef() once will delete it. Calling IncRef() allows to lock + // it until the matching DecRef() is called + void IncRef() { m_nRef++; } + void DecRef() { if ( --m_nRef == 0 ) delete this; } + + // interpret renderer parameters: arbitrary string whose interpretatin is + // left to the derived classes + virtual void SetParameters(const wxString& params); + +protected: + // virtual dtor for any base class - private because only DecRef() can + // delete us + virtual ~wxGridCellWorker(); + +private: + size_t m_nRef; + + // suppress the stupid gcc warning about the class having private dtor and + // no friends + friend class wxGridCellWorkerDummyFriend; +}; + +// ---------------------------------------------------------------------------- +// wxGridCellRenderer: this class is responsible for actually drawing the cell +// in the grid. You may pass it to the wxGridCellAttr (below) to change the +// format of one given cell or to wxGrid::SetDefaultRenderer() to change the +// view of all cells. This is an ABC, you will normally use one of the +// predefined derived classes or derive your own class from it. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxGridCellRenderer : public wxGridCellWorker +{ +public: + // draw the given cell on the provided DC inside the given rectangle + // using the style specified by the attribute and the default or selected + // state corresponding to the isSelected value. + // + // this pure virtual function has a default implementation which will + // prepare the DC using the given attribute: it will draw the rectangle + // with the bg colour from attr and set the text colour and font + virtual void Draw(wxGrid& grid, + wxGridCellAttr& attr, + wxDC& dc, + const wxRect& rect, + int row, int col, + bool isSelected) = 0; + + // get the preferred size of the cell for its contents + virtual wxSize GetBestSize(wxGrid& grid, + wxGridCellAttr& attr, + wxDC& dc, + int row, int col) = 0; + + // create a new object which is the copy of this one + virtual wxGridCellRenderer *Clone() const = 0; +}; + +// the default renderer for the cells containing string data +class WXDLLIMPEXP_ADV wxGridCellStringRenderer : public wxGridCellRenderer +{ +public: + // draw the string + virtual void Draw(wxGrid& grid, + wxGridCellAttr& attr, + wxDC& dc, + const wxRect& rect, + int row, int col, + bool isSelected); + + // return the string extent + virtual wxSize GetBestSize(wxGrid& grid, + wxGridCellAttr& attr, + wxDC& dc, + int row, int col); + + virtual wxGridCellRenderer *Clone() const + { return new wxGridCellStringRenderer; } + +protected: + // set the text colours before drawing + void SetTextColoursAndFont(const wxGrid& grid, + const wxGridCellAttr& attr, + wxDC& dc, + bool isSelected); + + // calc the string extent for given string/font + wxSize DoGetBestSize(const wxGridCellAttr& attr, + wxDC& dc, + const wxString& text); +}; + +// the default renderer for the cells containing numeric (long) data +class WXDLLIMPEXP_ADV wxGridCellNumberRenderer : public wxGridCellStringRenderer +{ +public: + // draw the string right aligned + virtual void Draw(wxGrid& grid, + wxGridCellAttr& attr, + wxDC& dc, + const wxRect& rect, + int row, int col, + bool isSelected); + + virtual wxSize GetBestSize(wxGrid& grid, + wxGridCellAttr& attr, + wxDC& dc, + int row, int col); + + virtual wxGridCellRenderer *Clone() const + { return new wxGridCellNumberRenderer; } + +protected: + wxString GetString(const wxGrid& grid, int row, int col); +}; + +class WXDLLIMPEXP_ADV wxGridCellFloatRenderer : public wxGridCellStringRenderer +{ +public: + wxGridCellFloatRenderer(int width = -1, int precision = -1); + + // get/change formatting parameters + int GetWidth() const { return m_width; } + void SetWidth(int width) { m_width = width; m_format.clear(); } + int GetPrecision() const { return m_precision; } + void SetPrecision(int precision) { m_precision = precision; m_format.clear(); } + + // draw the string right aligned with given width/precision + virtual void Draw(wxGrid& grid, + wxGridCellAttr& attr, + wxDC& dc, + const wxRect& rect, + int row, int col, + bool isSelected); + + virtual wxSize GetBestSize(wxGrid& grid, + wxGridCellAttr& attr, + wxDC& dc, + int row, int col); + + // parameters string format is "width[,precision]" + virtual void SetParameters(const wxString& params); + + virtual wxGridCellRenderer *Clone() const; + +protected: + wxString GetString(const wxGrid& grid, int row, int col); + +private: + // formatting parameters + int m_width, + m_precision; + + wxString m_format; +}; + +// renderer for boolean fields +class WXDLLIMPEXP_ADV wxGridCellBoolRenderer : public wxGridCellRenderer +{ +public: + // draw a check mark or nothing + virtual void Draw(wxGrid& grid, + wxGridCellAttr& attr, + wxDC& dc, + const wxRect& rect, + int row, int col, + bool isSelected); + + // return the checkmark size + virtual wxSize GetBestSize(wxGrid& grid, + wxGridCellAttr& attr, + wxDC& dc, + int row, int col); + + virtual wxGridCellRenderer *Clone() const + { return new wxGridCellBoolRenderer; } + +private: + static wxSize ms_sizeCheckMark; +}; + +// ---------------------------------------------------------------------------- +// wxGridCellEditor: This class is responsible for providing and manipulating +// the in-place edit controls for the grid. Instances of wxGridCellEditor +// (actually, instances of derived classes since it is an ABC) can be +// associated with the cell attributes for individual cells, rows, columns, or +// even for the entire grid. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxGridCellEditor : public wxGridCellWorker +{ +public: + wxGridCellEditor(); + + bool IsCreated() { return m_control != NULL; } + wxControl* GetControl() { return m_control; } + void SetControl(wxControl* control) { m_control = control; } + + wxGridCellAttr* GetCellAttr() { return m_attr; } + void SetCellAttr(wxGridCellAttr* attr) { m_attr = attr; } + + // Creates the actual edit control + virtual void Create(wxWindow* parent, + wxWindowID id, + wxEvtHandler* evtHandler) = 0; + + // Size and position the edit control + virtual void SetSize(const wxRect& rect); + + // Show or hide the edit control, use the specified attributes to set + // colours/fonts for it + virtual void Show(bool show, wxGridCellAttr *attr = (wxGridCellAttr *)NULL); + + // Draws the part of the cell not occupied by the control: the base class + // version just fills it with background colour from the attribute + virtual void PaintBackground(const wxRect& rectCell, wxGridCellAttr *attr); + + // Fetch the value from the table and prepare the edit control + // to begin editing. Set the focus to the edit control. + virtual void BeginEdit(int row, int col, wxGrid* grid) = 0; + + // Complete the editing of the current cell. Returns true if the value has + // changed. If necessary, the control may be destroyed. + virtual bool EndEdit(int row, int col, wxGrid* grid) = 0; + + // Reset the value in the control back to its starting value + virtual void Reset() = 0; + + // return true to allow the given key to start editing: the base class + // version only checks that the event has no modifiers. The derived + // classes are supposed to do "if ( base::IsAcceptedKey() && ... )" in + // their IsAcceptedKey() implementation, although, of course, it is not a + // mandatory requirment. + // + // NB: if the key is F2 (special), editing will always start and this + // method will not be called at all (but StartingKey() will) + virtual bool IsAcceptedKey(wxKeyEvent& event); + + // If the editor is enabled by pressing keys on the grid, this will be + // called to let the editor do something about that first key if desired + virtual void StartingKey(wxKeyEvent& event); + + // if the editor is enabled by clicking on the cell, this method will be + // called + virtual void StartingClick(); + + // Some types of controls on some platforms may need some help + // with the Return key. + virtual void HandleReturn(wxKeyEvent& event); + + // Final cleanup + virtual void Destroy(); + + // create a new object which is the copy of this one + virtual wxGridCellEditor *Clone() const = 0; + + // added GetValue so we can get the value which is in the control + virtual wxString GetValue() const = 0; + +protected: + // the dtor is private because only DecRef() can delete us + virtual ~wxGridCellEditor(); + + // the control we show on screen + wxControl* m_control; + + // a temporary pointer to the attribute being edited + wxGridCellAttr* m_attr; + + // if we change the colours/font of the control from the default ones, we + // must restore the default later and we save them here between calls to + // Show(true) and Show(false) + wxColour m_colFgOld, + m_colBgOld; + wxFont m_fontOld; + + // suppress the stupid gcc warning about the class having private dtor and + // no friends + friend class wxGridCellEditorDummyFriend; + + DECLARE_NO_COPY_CLASS(wxGridCellEditor) +}; + +#if wxUSE_TEXTCTRL + +// the editor for string/text data +class WXDLLIMPEXP_ADV wxGridCellTextEditor : public wxGridCellEditor +{ +public: + wxGridCellTextEditor(); + + virtual void Create(wxWindow* parent, + wxWindowID id, + wxEvtHandler* evtHandler); + virtual void SetSize(const wxRect& rect); + + virtual void PaintBackground(const wxRect& rectCell, wxGridCellAttr *attr); + + virtual bool IsAcceptedKey(wxKeyEvent& event); + virtual void BeginEdit(int row, int col, wxGrid* grid); + virtual bool EndEdit(int row, int col, wxGrid* grid); + + virtual void Reset(); + virtual void StartingKey(wxKeyEvent& event); + virtual void HandleReturn(wxKeyEvent& event); + + // parameters string format is "max_width" + virtual void SetParameters(const wxString& params); + + virtual wxGridCellEditor *Clone() const + { return new wxGridCellTextEditor; } + + // added GetValue so we can get the value which is in the control + virtual wxString GetValue() const; + +protected: + wxTextCtrl *Text() const { return (wxTextCtrl *)m_control; } + + // parts of our virtual functions reused by the derived classes + void DoBeginEdit(const wxString& startValue); + void DoReset(const wxString& startValue); + +private: + size_t m_maxChars; // max number of chars allowed + wxString m_startValue; + + DECLARE_NO_COPY_CLASS(wxGridCellTextEditor) +}; + +// the editor for numeric (long) data +class WXDLLIMPEXP_ADV wxGridCellNumberEditor : public wxGridCellTextEditor +{ +public: + // allows to specify the range - if min == max == -1, no range checking is + // done + wxGridCellNumberEditor(int min = -1, int max = -1); + + virtual void Create(wxWindow* parent, + wxWindowID id, + wxEvtHandler* evtHandler); + + virtual bool IsAcceptedKey(wxKeyEvent& event); + virtual void BeginEdit(int row, int col, wxGrid* grid); + virtual bool EndEdit(int row, int col, wxGrid* grid); + + virtual void Reset(); + virtual void StartingKey(wxKeyEvent& event); + + // parameters string format is "min,max" + virtual void SetParameters(const wxString& params); + + virtual wxGridCellEditor *Clone() const + { return new wxGridCellNumberEditor(m_min, m_max); } + + // added GetValue so we can get the value which is in the control + virtual wxString GetValue() const; + +protected: +#if wxUSE_SPINCTRL + wxSpinCtrl *Spin() const { return (wxSpinCtrl *)m_control; } +#endif + + // if HasRange(), we use wxSpinCtrl - otherwise wxTextCtrl + bool HasRange() const + { +#if wxUSE_SPINCTRL + return m_min != m_max; +#else + return false; +#endif + } + + // string representation of m_valueOld + wxString GetString() const + { return wxString::Format(_T("%ld"), m_valueOld); } + +private: + int m_min, + m_max; + + long m_valueOld; + + DECLARE_NO_COPY_CLASS(wxGridCellNumberEditor) +}; + +// the editor for floating point numbers (double) data +class WXDLLIMPEXP_ADV wxGridCellFloatEditor : public wxGridCellTextEditor +{ +public: + wxGridCellFloatEditor(int width = -1, int precision = -1); + + virtual void Create(wxWindow* parent, + wxWindowID id, + wxEvtHandler* evtHandler); + + virtual bool IsAcceptedKey(wxKeyEvent& event); + virtual void BeginEdit(int row, int col, wxGrid* grid); + virtual bool EndEdit(int row, int col, wxGrid* grid); + + virtual void Reset(); + virtual void StartingKey(wxKeyEvent& event); + + virtual wxGridCellEditor *Clone() const + { return new wxGridCellFloatEditor(m_width, m_precision); } + + // parameters string format is "width,precision" + virtual void SetParameters(const wxString& params); + +protected: + // string representation of m_valueOld + wxString GetString() const; + +private: + int m_width, + m_precision; + double m_valueOld; + + DECLARE_NO_COPY_CLASS(wxGridCellFloatEditor) +}; + +#endif // wxUSE_TEXTCTRL + +#if wxUSE_CHECKBOX + +// the editor for boolean data +class WXDLLIMPEXP_ADV wxGridCellBoolEditor : public wxGridCellEditor +{ +public: + wxGridCellBoolEditor() { } + + virtual void Create(wxWindow* parent, + wxWindowID id, + wxEvtHandler* evtHandler); + + virtual void SetSize(const wxRect& rect); + virtual void Show(bool show, wxGridCellAttr *attr = NULL); + + virtual bool IsAcceptedKey(wxKeyEvent& event); + virtual void BeginEdit(int row, int col, wxGrid* grid); + virtual bool EndEdit(int row, int col, wxGrid* grid); + + virtual void Reset(); + virtual void StartingClick(); + virtual void StartingKey(wxKeyEvent& event); + + virtual wxGridCellEditor *Clone() const + { return new wxGridCellBoolEditor; } + + // added GetValue so we can get the value which is in the control, see + // also UseStringValues() + virtual wxString GetValue() const; + + // set the string values returned by GetValue() for the true and false + // states, respectively + static void UseStringValues(const wxString& valueTrue = _T("1"), + const wxString& valueFalse = wxEmptyString); + + // return true if the given string is equal to the string representation of + // true value which we currently use + static bool IsTrueValue(const wxString& value); + +protected: + wxCheckBox *CBox() const { return (wxCheckBox *)m_control; } + +private: + bool m_startValue; + + static wxString ms_stringValues[2]; + + DECLARE_NO_COPY_CLASS(wxGridCellBoolEditor) +}; + +#endif // wxUSE_CHECKBOX + +#if wxUSE_COMBOBOX + +// the editor for string data allowing to choose from the list of strings +class WXDLLIMPEXP_ADV wxGridCellChoiceEditor : public wxGridCellEditor +{ +public: + // if !allowOthers, user can't type a string not in choices array + wxGridCellChoiceEditor(size_t count = 0, + const wxString choices[] = NULL, + bool allowOthers = false); + wxGridCellChoiceEditor(const wxArrayString& choices, + bool allowOthers = false); + + virtual void Create(wxWindow* parent, + wxWindowID id, + wxEvtHandler* evtHandler); + + virtual void PaintBackground(const wxRect& rectCell, wxGridCellAttr *attr); + + virtual void BeginEdit(int row, int col, wxGrid* grid); + virtual bool EndEdit(int row, int col, wxGrid* grid); + + virtual void Reset(); + + // parameters string format is "item1[,item2[...,itemN]]" + virtual void SetParameters(const wxString& params); + + virtual wxGridCellEditor *Clone() const; + + // added GetValue so we can get the value which is in the control + virtual wxString GetValue() const; + +protected: + wxComboBox *Combo() const { return (wxComboBox *)m_control; } + +// DJC - (MAPTEK) you at least need access to m_choices if you +// wish to override this class +protected: + wxString m_startValue; + wxArrayString m_choices; + bool m_allowOthers; + + DECLARE_NO_COPY_CLASS(wxGridCellChoiceEditor) +}; + +#endif // wxUSE_COMBOBOX + +// ---------------------------------------------------------------------------- +// wxGridCellAttr: this class can be used to alter the cells appearance in +// the grid by changing their colour/font/... from default. An object of this +// class may be returned by wxGridTable::GetAttr(). +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxGridCellAttr : public wxClientDataContainer +{ +public: + enum wxAttrKind + { + Any, + Default, + Cell, + Row, + Col, + Merged + }; + + // ctors + wxGridCellAttr(wxGridCellAttr *attrDefault = NULL) + { + Init(attrDefault); + + // MB: args used to be 0,0 here but wxALIGN_LEFT is 0 + SetAlignment(-1, -1); + } + + // VZ: considering the number of members wxGridCellAttr has now, this ctor + // seems to be pretty useless... may be we should just remove it? + wxGridCellAttr(const wxColour& colText, + const wxColour& colBack, + const wxFont& font, + int hAlign, + int vAlign) + : m_colText(colText), m_colBack(colBack), m_font(font) + { + Init(); + SetAlignment(hAlign, vAlign); + } + + // creates a new copy of this object + wxGridCellAttr *Clone() const; + void MergeWith(wxGridCellAttr *mergefrom); + + // this class is ref counted: it is created with ref count of 1, so + // calling DecRef() once will delete it. Calling IncRef() allows to lock + // it until the matching DecRef() is called + void IncRef() { m_nRef++; } + void DecRef() { if ( --m_nRef == 0 ) delete this; } + + // setters + void SetTextColour(const wxColour& colText) { m_colText = colText; } + void SetBackgroundColour(const wxColour& colBack) { m_colBack = colBack; } + void SetFont(const wxFont& font) { m_font = font; } + void SetAlignment(int hAlign, int vAlign) + { + m_hAlign = hAlign; + m_vAlign = vAlign; + } + void SetSize(int num_rows, int num_cols); + void SetOverflow(bool allow = true) + { m_overflow = allow ? Overflow : SingleCell; } + void SetReadOnly(bool isReadOnly = true) + { m_isReadOnly = isReadOnly ? ReadOnly : ReadWrite; } + + // takes ownership of the pointer + void SetRenderer(wxGridCellRenderer *renderer) + { wxSafeDecRef(m_renderer); m_renderer = renderer; } + void SetEditor(wxGridCellEditor* editor) + { wxSafeDecRef(m_editor); m_editor = editor; } + + void SetKind(wxAttrKind kind) { m_attrkind = kind; } + + // accessors + bool HasTextColour() const { return m_colText.Ok(); } + bool HasBackgroundColour() const { return m_colBack.Ok(); } + bool HasFont() const { return m_font.Ok(); } + bool HasAlignment() const { return (m_hAlign != -1 || m_vAlign != -1); } + bool HasRenderer() const { return m_renderer != NULL; } + bool HasEditor() const { return m_editor != NULL; } + bool HasReadWriteMode() const { return m_isReadOnly != Unset; } + bool HasOverflowMode() const { return m_overflow != UnsetOverflow; } + bool HasSize() const { return m_sizeRows != 1 || m_sizeCols != 1; } + + const wxColour& GetTextColour() const; + const wxColour& GetBackgroundColour() const; + const wxFont& GetFont() const; + void GetAlignment(int *hAlign, int *vAlign) const; + void GetSize(int *num_rows, int *num_cols) const; + bool GetOverflow() const + { return m_overflow != SingleCell; } + wxGridCellRenderer *GetRenderer(wxGrid* grid, int row, int col) const; + wxGridCellEditor *GetEditor(wxGrid* grid, int row, int col) const; + + bool IsReadOnly() const { return m_isReadOnly == wxGridCellAttr::ReadOnly; } + + wxAttrKind GetKind() { return m_attrkind; } + + void SetDefAttr(wxGridCellAttr* defAttr) { m_defGridAttr = defAttr; } + +protected: + // the dtor is private because only DecRef() can delete us + virtual ~wxGridCellAttr() + { + wxSafeDecRef(m_renderer); + wxSafeDecRef(m_editor); + } + +private: + enum wxAttrReadMode + { + Unset = -1, + ReadWrite, + ReadOnly + }; + + enum wxAttrOverflowMode + { + UnsetOverflow = -1, + Overflow, + SingleCell + }; + + // the common part of all ctors + void Init(wxGridCellAttr *attrDefault = NULL); + + + // the ref count - when it goes to 0, we die + size_t m_nRef; + + wxColour m_colText, + m_colBack; + wxFont m_font; + int m_hAlign, + m_vAlign; + int m_sizeRows, + m_sizeCols; + + wxAttrOverflowMode m_overflow; + + wxGridCellRenderer* m_renderer; + wxGridCellEditor* m_editor; + wxGridCellAttr* m_defGridAttr; + + wxAttrReadMode m_isReadOnly; + + wxAttrKind m_attrkind; + + // use Clone() instead + DECLARE_NO_COPY_CLASS(wxGridCellAttr) + + // suppress the stupid gcc warning about the class having private dtor and + // no friends + friend class wxGridCellAttrDummyFriend; +}; + +// ---------------------------------------------------------------------------- +// wxGridCellAttrProvider: class used by wxGridTableBase to retrieve/store the +// cell attributes. +// ---------------------------------------------------------------------------- + +// implementation note: we separate it from wxGridTableBase because we wish to +// avoid deriving a new table class if possible, and sometimes it will be +// enough to just derive another wxGridCellAttrProvider instead +// +// the default implementation is reasonably efficient for the generic case, +// but you might still wish to implement your own for some specific situations +// if you have performance problems with the stock one +class WXDLLIMPEXP_ADV wxGridCellAttrProvider : public wxClientDataContainer +{ +public: + wxGridCellAttrProvider(); + virtual ~wxGridCellAttrProvider(); + + // DecRef() must be called on the returned pointer + virtual wxGridCellAttr *GetAttr(int row, int col, + wxGridCellAttr::wxAttrKind kind ) const; + + // all these functions take ownership of the pointer, don't call DecRef() + // on it + virtual void SetAttr(wxGridCellAttr *attr, int row, int col); + virtual void SetRowAttr(wxGridCellAttr *attr, int row); + virtual void SetColAttr(wxGridCellAttr *attr, int col); + + // these functions must be called whenever some rows/cols are deleted + // because the internal data must be updated then + void UpdateAttrRows( size_t pos, int numRows ); + void UpdateAttrCols( size_t pos, int numCols ); + +private: + void InitData(); + + wxGridCellAttrProviderData *m_data; + + DECLARE_NO_COPY_CLASS(wxGridCellAttrProvider) +}; + +////////////////////////////////////////////////////////////////////// +// +// Grid table classes +// +////////////////////////////////////////////////////////////////////// + + +class WXDLLIMPEXP_ADV wxGridTableBase : public wxObject, public wxClientDataContainer +{ +public: + wxGridTableBase(); + virtual ~wxGridTableBase(); + + // You must override these functions in a derived table class + // + virtual int GetNumberRows() = 0; + virtual int GetNumberCols() = 0; + virtual bool IsEmptyCell( int row, int col ) = 0; + virtual wxString GetValue( int row, int col ) = 0; + virtual void SetValue( int row, int col, const wxString& value ) = 0; + + // Data type determination and value access + virtual wxString GetTypeName( int row, int col ); + virtual bool CanGetValueAs( int row, int col, const wxString& typeName ); + virtual bool CanSetValueAs( int row, int col, const wxString& typeName ); + + virtual long GetValueAsLong( int row, int col ); + virtual double GetValueAsDouble( int row, int col ); + virtual bool GetValueAsBool( int row, int col ); + + virtual void SetValueAsLong( int row, int col, long value ); + virtual void SetValueAsDouble( int row, int col, double value ); + virtual void SetValueAsBool( int row, int col, bool value ); + + // For user defined types + virtual void* GetValueAsCustom( int row, int col, const wxString& typeName ); + virtual void SetValueAsCustom( int row, int col, const wxString& typeName, void* value ); + + + // Overriding these is optional + // + virtual void SetView( wxGrid *grid ) { m_view = grid; } + virtual wxGrid * GetView() const { return m_view; } + + virtual void Clear() {} + virtual bool InsertRows( size_t pos = 0, size_t numRows = 1 ); + virtual bool AppendRows( size_t numRows = 1 ); + virtual bool DeleteRows( size_t pos = 0, size_t numRows = 1 ); + virtual bool InsertCols( size_t pos = 0, size_t numCols = 1 ); + virtual bool AppendCols( size_t numCols = 1 ); + virtual bool DeleteCols( size_t pos = 0, size_t numCols = 1 ); + + virtual wxString GetRowLabelValue( int row ); + virtual wxString GetColLabelValue( int col ); + virtual void SetRowLabelValue( int WXUNUSED(row), const wxString& ) {} + virtual void SetColLabelValue( int WXUNUSED(col), const wxString& ) {} + + // Attribute handling + // + + // give us the attr provider to use - we take ownership of the pointer + void SetAttrProvider(wxGridCellAttrProvider *attrProvider); + + // get the currently used attr provider (may be NULL) + wxGridCellAttrProvider *GetAttrProvider() const { return m_attrProvider; } + + // Does this table allow attributes? Default implementation creates + // a wxGridCellAttrProvider if necessary. + virtual bool CanHaveAttributes(); + + // by default forwarded to wxGridCellAttrProvider if any. May be + // overridden to handle attributes directly in the table. + virtual wxGridCellAttr *GetAttr( int row, int col, + wxGridCellAttr::wxAttrKind kind ); + + + // these functions take ownership of the pointer + virtual void SetAttr(wxGridCellAttr* attr, int row, int col); + virtual void SetRowAttr(wxGridCellAttr *attr, int row); + virtual void SetColAttr(wxGridCellAttr *attr, int col); + +private: + wxGrid * m_view; + wxGridCellAttrProvider *m_attrProvider; + + DECLARE_ABSTRACT_CLASS(wxGridTableBase) + DECLARE_NO_COPY_CLASS(wxGridTableBase) +}; + + +// ---------------------------------------------------------------------------- +// wxGridTableMessage +// ---------------------------------------------------------------------------- + +// IDs for messages sent from grid table to view +// +enum wxGridTableRequest +{ + wxGRIDTABLE_REQUEST_VIEW_GET_VALUES = 2000, + wxGRIDTABLE_REQUEST_VIEW_SEND_VALUES, + wxGRIDTABLE_NOTIFY_ROWS_INSERTED, + wxGRIDTABLE_NOTIFY_ROWS_APPENDED, + wxGRIDTABLE_NOTIFY_ROWS_DELETED, + wxGRIDTABLE_NOTIFY_COLS_INSERTED, + wxGRIDTABLE_NOTIFY_COLS_APPENDED, + wxGRIDTABLE_NOTIFY_COLS_DELETED +}; + +class WXDLLIMPEXP_ADV wxGridTableMessage +{ +public: + wxGridTableMessage(); + wxGridTableMessage( wxGridTableBase *table, int id, + int comInt1 = -1, + int comInt2 = -1 ); + + void SetTableObject( wxGridTableBase *table ) { m_table = table; } + wxGridTableBase * GetTableObject() const { return m_table; } + void SetId( int id ) { m_id = id; } + int GetId() { return m_id; } + void SetCommandInt( int comInt1 ) { m_comInt1 = comInt1; } + int GetCommandInt() { return m_comInt1; } + void SetCommandInt2( int comInt2 ) { m_comInt2 = comInt2; } + int GetCommandInt2() { return m_comInt2; } + +private: + wxGridTableBase *m_table; + int m_id; + int m_comInt1; + int m_comInt2; + + DECLARE_NO_COPY_CLASS(wxGridTableMessage) +}; + + + +// ------ wxGridStringArray +// A 2-dimensional array of strings for data values +// + +WX_DECLARE_OBJARRAY_WITH_DECL(wxArrayString, wxGridStringArray, + class WXDLLIMPEXP_ADV); + + + +// ------ wxGridStringTable +// +// Simplest type of data table for a grid for small tables of strings +// that are stored in memory +// + +class WXDLLIMPEXP_ADV wxGridStringTable : public wxGridTableBase +{ +public: + wxGridStringTable(); + wxGridStringTable( int numRows, int numCols ); + virtual ~wxGridStringTable(); + + // these are pure virtual in wxGridTableBase + // + int GetNumberRows(); + int GetNumberCols(); + wxString GetValue( int row, int col ); + void SetValue( int row, int col, const wxString& s ); + bool IsEmptyCell( int row, int col ); + + // overridden functions from wxGridTableBase + // + void Clear(); + bool InsertRows( size_t pos = 0, size_t numRows = 1 ); + bool AppendRows( size_t numRows = 1 ); + bool DeleteRows( size_t pos = 0, size_t numRows = 1 ); + bool InsertCols( size_t pos = 0, size_t numCols = 1 ); + bool AppendCols( size_t numCols = 1 ); + bool DeleteCols( size_t pos = 0, size_t numCols = 1 ); + + void SetRowLabelValue( int row, const wxString& ); + void SetColLabelValue( int col, const wxString& ); + wxString GetRowLabelValue( int row ); + wxString GetColLabelValue( int col ); + +private: + wxGridStringArray m_data; + + // These only get used if you set your own labels, otherwise the + // GetRow/ColLabelValue functions return wxGridTableBase defaults + // + wxArrayString m_rowLabels; + wxArrayString m_colLabels; + + DECLARE_DYNAMIC_CLASS_NO_COPY( wxGridStringTable ) +}; + + + +// ============================================================================ +// Grid view classes +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxGridCellCoords: location of a cell in the grid +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxGridCellCoords +{ +public: + wxGridCellCoords() { m_row = m_col = -1; } + wxGridCellCoords( int r, int c ) { m_row = r; m_col = c; } + + // default copy ctor is ok + + int GetRow() const { return m_row; } + void SetRow( int n ) { m_row = n; } + int GetCol() const { return m_col; } + void SetCol( int n ) { m_col = n; } + void Set( int row, int col ) { m_row = row; m_col = col; } + + wxGridCellCoords& operator=( const wxGridCellCoords& other ) + { + if ( &other != this ) + { + m_row=other.m_row; + m_col=other.m_col; + } + return *this; + } + + bool operator==( const wxGridCellCoords& other ) const + { + return (m_row == other.m_row && m_col == other.m_col); + } + + bool operator!=( const wxGridCellCoords& other ) const + { + return (m_row != other.m_row || m_col != other.m_col); + } + + bool operator!() const + { + return (m_row == -1 && m_col == -1 ); + } + +private: + int m_row; + int m_col; +}; + + +// For comparisons... +// +extern WXDLLIMPEXP_ADV wxGridCellCoords wxGridNoCellCoords; +extern WXDLLIMPEXP_ADV wxRect wxGridNoCellRect; + +// An array of cell coords... +// +WX_DECLARE_OBJARRAY_WITH_DECL(wxGridCellCoords, wxGridCellCoordsArray, + class WXDLLIMPEXP_ADV); + +// ---------------------------------------------------------------------------- +// wxGrid +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxGrid : public wxScrolledWindow +{ +public: + wxGrid() ; + + wxGrid( wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxWANTS_CHARS, + const wxString& name = wxGridNameStr ); + + bool Create( wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxWANTS_CHARS, + const wxString& name = wxGridNameStr ); + + virtual ~wxGrid(); + + enum wxGridSelectionModes {wxGridSelectCells, + wxGridSelectRows, + wxGridSelectColumns}; + + bool CreateGrid( int numRows, int numCols, + wxGrid::wxGridSelectionModes selmode = + wxGrid::wxGridSelectCells ); + + void SetSelectionMode(wxGrid::wxGridSelectionModes selmode); + wxGrid::wxGridSelectionModes GetSelectionMode() const; + + // ------ grid dimensions + // + int GetNumberRows() { return m_numRows; } + int GetNumberCols() { return m_numCols; } + + + // ------ display update functions + // + wxArrayInt CalcRowLabelsExposed( const wxRegion& reg ); + + wxArrayInt CalcColLabelsExposed( const wxRegion& reg ); + wxGridCellCoordsArray CalcCellsExposed( const wxRegion& reg ); + + + // ------ event handlers + // + void ProcessRowLabelMouseEvent( wxMouseEvent& event ); + void ProcessColLabelMouseEvent( wxMouseEvent& event ); + void ProcessCornerLabelMouseEvent( wxMouseEvent& event ); + void ProcessGridCellMouseEvent( wxMouseEvent& event ); + bool ProcessTableMessage( wxGridTableMessage& ); + + void DoEndDragResizeRow(); + void DoEndDragResizeCol(); + void DoEndDragMoveCol(); + + wxGridTableBase * GetTable() const { return m_table; } + bool SetTable( wxGridTableBase *table, bool takeOwnership = false, + wxGrid::wxGridSelectionModes selmode = + wxGrid::wxGridSelectCells ); + + void ClearGrid(); + bool InsertRows( int pos = 0, int numRows = 1, bool updateLabels = true ); + bool AppendRows( int numRows = 1, bool updateLabels = true ); + bool DeleteRows( int pos = 0, int numRows = 1, bool updateLabels = true ); + bool InsertCols( int pos = 0, int numCols = 1, bool updateLabels = true ); + bool AppendCols( int numCols = 1, bool updateLabels = true ); + bool DeleteCols( int pos = 0, int numCols = 1, bool updateLabels = true ); + + void DrawGridCellArea( wxDC& dc , const wxGridCellCoordsArray& cells ); + void DrawGridSpace( wxDC& dc ); + void DrawCellBorder( wxDC& dc, const wxGridCellCoords& ); + void DrawAllGridLines( wxDC& dc, const wxRegion & reg ); + void DrawCell( wxDC& dc, const wxGridCellCoords& ); + void DrawHighlight(wxDC& dc, const wxGridCellCoordsArray& cells); + + // this function is called when the current cell highlight must be redrawn + // and may be overridden by the user + virtual void DrawCellHighlight( wxDC& dc, const wxGridCellAttr *attr ); + + virtual void DrawRowLabels( wxDC& dc, const wxArrayInt& rows ); + virtual void DrawRowLabel( wxDC& dc, int row ); + + virtual void DrawColLabels( wxDC& dc, const wxArrayInt& cols ); + virtual void DrawColLabel( wxDC& dc, int col ); + + + // ------ Cell text drawing functions + // + void DrawTextRectangle( wxDC& dc, const wxString&, const wxRect&, + int horizontalAlignment = wxALIGN_LEFT, + int verticalAlignment = wxALIGN_TOP, + int textOrientation = wxHORIZONTAL ); + + void DrawTextRectangle( wxDC& dc, const wxArrayString& lines, const wxRect&, + int horizontalAlignment = wxALIGN_LEFT, + int verticalAlignment = wxALIGN_TOP, + int textOrientation = wxHORIZONTAL ); + + + // Split a string containing newline chararcters into an array of + // strings and return the number of lines + // + void StringToLines( const wxString& value, wxArrayString& lines ); + + void GetTextBoxSize( const wxDC& dc, + const wxArrayString& lines, + long *width, long *height ); + + + // ------ + // Code that does a lot of grid modification can be enclosed + // between BeginBatch() and EndBatch() calls to avoid screen + // flicker + // + void BeginBatch() { m_batchCount++; } + void EndBatch(); + + int GetBatchCount() { return m_batchCount; } + + virtual void Refresh(bool eraseb = true, + const wxRect* rect = (const wxRect *) NULL); + + // Use this, rather than wxWindow::Refresh(), to force an + // immediate repainting of the grid. Has no effect if you are + // already inside a BeginBatch / EndBatch block. + // + // This function is necessary because wxGrid has a minimal OnPaint() + // handler to reduce screen flicker. + // + void ForceRefresh(); + + + // ------ edit control functions + // + bool IsEditable() const { return m_editable; } + void EnableEditing( bool edit ); + + void EnableCellEditControl( bool enable = true ); + void DisableCellEditControl() { EnableCellEditControl(false); } + bool CanEnableCellControl() const; + bool IsCellEditControlEnabled() const; + bool IsCellEditControlShown() const; + + bool IsCurrentCellReadOnly() const; + + void ShowCellEditControl(); + void HideCellEditControl(); + void SaveEditControlValue(); + + + // ------ grid location functions + // Note that all of these functions work with the logical coordinates of + // grid cells and labels so you will need to convert from device + // coordinates for mouse events etc. + // + void XYToCell( int x, int y, wxGridCellCoords& ); + int YToRow( int y ); + int XToCol( int x, bool clipToMinMax = false ); + + int YToEdgeOfRow( int y ); + int XToEdgeOfCol( int x ); + + wxRect CellToRect( int row, int col ); + wxRect CellToRect( const wxGridCellCoords& coords ) + { return CellToRect( coords.GetRow(), coords.GetCol() ); } + + int GetGridCursorRow() { return m_currentCellCoords.GetRow(); } + int GetGridCursorCol() { return m_currentCellCoords.GetCol(); } + + // check to see if a cell is either wholly visible (the default arg) or + // at least partially visible in the grid window + // + bool IsVisible( int row, int col, bool wholeCellVisible = true ); + bool IsVisible( const wxGridCellCoords& coords, bool wholeCellVisible = true ) + { return IsVisible( coords.GetRow(), coords.GetCol(), wholeCellVisible ); } + void MakeCellVisible( int row, int col ); + void MakeCellVisible( const wxGridCellCoords& coords ) + { MakeCellVisible( coords.GetRow(), coords.GetCol() ); } + + + // ------ grid cursor movement functions + // + void SetGridCursor( int row, int col ) + { SetCurrentCell( wxGridCellCoords(row, col) ); } + + bool MoveCursorUp( bool expandSelection ); + bool MoveCursorDown( bool expandSelection ); + bool MoveCursorLeft( bool expandSelection ); + bool MoveCursorRight( bool expandSelection ); + bool MovePageDown(); + bool MovePageUp(); + bool MoveCursorUpBlock( bool expandSelection ); + bool MoveCursorDownBlock( bool expandSelection ); + bool MoveCursorLeftBlock( bool expandSelection ); + bool MoveCursorRightBlock( bool expandSelection ); + + + // ------ label and gridline formatting + // + int GetDefaultRowLabelSize() { return WXGRID_DEFAULT_ROW_LABEL_WIDTH; } + int GetRowLabelSize() { return m_rowLabelWidth; } + int GetDefaultColLabelSize() { return WXGRID_DEFAULT_COL_LABEL_HEIGHT; } + int GetColLabelSize() { return m_colLabelHeight; } + wxColour GetLabelBackgroundColour() { return m_labelBackgroundColour; } + wxColour GetLabelTextColour() { return m_labelTextColour; } + wxFont GetLabelFont() { return m_labelFont; } + void GetRowLabelAlignment( int *horiz, int *vert ); + void GetColLabelAlignment( int *horiz, int *vert ); + int GetColLabelTextOrientation(); + wxString GetRowLabelValue( int row ); + wxString GetColLabelValue( int col ); + wxColour GetGridLineColour() { return m_gridLineColour; } + + // these methods may be overridden to customize individual grid lines + // appearance + virtual wxPen GetDefaultGridLinePen(); + virtual wxPen GetRowGridLinePen(int row); + virtual wxPen GetColGridLinePen(int col); + wxColour GetCellHighlightColour() { return m_cellHighlightColour; } + int GetCellHighlightPenWidth() { return m_cellHighlightPenWidth; } + int GetCellHighlightROPenWidth() { return m_cellHighlightROPenWidth; } + + void SetRowLabelSize( int width ); + void SetColLabelSize( int height ); + void SetLabelBackgroundColour( const wxColour& ); + void SetLabelTextColour( const wxColour& ); + void SetLabelFont( const wxFont& ); + void SetRowLabelAlignment( int horiz, int vert ); + void SetColLabelAlignment( int horiz, int vert ); + void SetColLabelTextOrientation( int textOrientation ); + void SetRowLabelValue( int row, const wxString& ); + void SetColLabelValue( int col, const wxString& ); + void SetGridLineColour( const wxColour& ); + void SetCellHighlightColour( const wxColour& ); + void SetCellHighlightPenWidth(int width); + void SetCellHighlightROPenWidth(int width); + + void EnableDragRowSize( bool enable = true ); + void DisableDragRowSize() { EnableDragRowSize( false ); } + bool CanDragRowSize() { return m_canDragRowSize; } + void EnableDragColSize( bool enable = true ); + void DisableDragColSize() { EnableDragColSize( false ); } + bool CanDragColSize() { return m_canDragColSize; } + void EnableDragColMove( bool enable = true ); + void DisableDragColMove() { EnableDragColMove( false ); } + bool CanDragColMove() { return m_canDragColMove; } + void EnableDragGridSize(bool enable = true); + void DisableDragGridSize() { EnableDragGridSize(false); } + bool CanDragGridSize() { return m_canDragGridSize; } + + void EnableDragCell( bool enable = true ); + void DisableDragCell() { EnableDragCell( false ); } + bool CanDragCell() { return m_canDragCell; } + + // this sets the specified attribute for this cell or in this row/col + void SetAttr(int row, int col, wxGridCellAttr *attr); + void SetRowAttr(int row, wxGridCellAttr *attr); + void SetColAttr(int col, wxGridCellAttr *attr); + + // returns the attribute we may modify in place: a new one if this cell + // doesn't have any yet or the existing one if it does + // + // DecRef() must be called on the returned pointer, as usual + wxGridCellAttr *GetOrCreateCellAttr(int row, int col) const; + + + // shortcuts for setting the column parameters + + // set the format for the data in the column: default is string + void SetColFormatBool(int col); + void SetColFormatNumber(int col); + void SetColFormatFloat(int col, int width = -1, int precision = -1); + void SetColFormatCustom(int col, const wxString& typeName); + + void EnableGridLines( bool enable = true ); + bool GridLinesEnabled() { return m_gridLinesEnabled; } + + // ------ row and col formatting + // + int GetDefaultRowSize(); + int GetRowSize( int row ); + int GetDefaultColSize(); + int GetColSize( int col ); + wxColour GetDefaultCellBackgroundColour(); + wxColour GetCellBackgroundColour( int row, int col ); + wxColour GetDefaultCellTextColour(); + wxColour GetCellTextColour( int row, int col ); + wxFont GetDefaultCellFont(); + wxFont GetCellFont( int row, int col ); + void GetDefaultCellAlignment( int *horiz, int *vert ); + void GetCellAlignment( int row, int col, int *horiz, int *vert ); + bool GetDefaultCellOverflow(); + bool GetCellOverflow( int row, int col ); + void GetCellSize( int row, int col, int *num_rows, int *num_cols ); + + void SetDefaultRowSize( int height, bool resizeExistingRows = false ); + void SetRowSize( int row, int height ); + void SetDefaultColSize( int width, bool resizeExistingCols = false ); + + void SetColSize( int col, int width ); + + //Column positions + int GetColAt( int colPos ) const + { + if ( m_colAt.IsEmpty() ) + return colPos; + else + return m_colAt[colPos]; + } + + void SetColPos( int colID, int newPos ); + + int GetColPos( int colID ) const + { + if ( m_colAt.IsEmpty() ) + return colID; + else + { + for ( int i = 0; i < m_numCols; i++ ) + { + if ( m_colAt[i] == colID ) + return i; + } + } + + return -1; + } + + // automatically size the column or row to fit to its contents, if + // setAsMin is true, this optimal width will also be set as minimal width + // for this column + void AutoSizeColumn( int col, bool setAsMin = true ) + { AutoSizeColOrRow(col, setAsMin, true); } + void AutoSizeRow( int row, bool setAsMin = true ) + { AutoSizeColOrRow(row, setAsMin, false); } + + // auto size all columns (very ineffective for big grids!) + void AutoSizeColumns( bool setAsMin = true ) + { (void)SetOrCalcColumnSizes(false, setAsMin); } + + void AutoSizeRows( bool setAsMin = true ) + { (void)SetOrCalcRowSizes(false, setAsMin); } + + // auto size the grid, that is make the columns/rows of the "right" size + // and also set the grid size to just fit its contents + void AutoSize(); + + // autosize row height depending on label text + void AutoSizeRowLabelSize( int row ); + + // autosize column width depending on label text + void AutoSizeColLabelSize( int col ); + + // column won't be resized to be lesser width - this must be called during + // the grid creation because it won't resize the column if it's already + // narrower than the minimal width + void SetColMinimalWidth( int col, int width ); + void SetRowMinimalHeight( int row, int width ); + + /* These members can be used to query and modify the minimal + * acceptable size of grid rows and columns. Call this function in + * your code which creates the grid if you want to display cells + * with a size smaller than the default acceptable minimum size. + * Like the members SetColMinimalWidth and SetRowMinimalWidth, + * the existing rows or columns will not be checked/resized. + */ + void SetColMinimalAcceptableWidth( int width ); + void SetRowMinimalAcceptableHeight( int width ); + int GetColMinimalAcceptableWidth() const; + int GetRowMinimalAcceptableHeight() const; + + void SetDefaultCellBackgroundColour( const wxColour& ); + void SetCellBackgroundColour( int row, int col, const wxColour& ); + void SetDefaultCellTextColour( const wxColour& ); + + void SetCellTextColour( int row, int col, const wxColour& ); + void SetDefaultCellFont( const wxFont& ); + void SetCellFont( int row, int col, const wxFont& ); + void SetDefaultCellAlignment( int horiz, int vert ); + void SetCellAlignment( int row, int col, int horiz, int vert ); + void SetDefaultCellOverflow( bool allow ); + void SetCellOverflow( int row, int col, bool allow ); + void SetCellSize( int row, int col, int num_rows, int num_cols ); + + // takes ownership of the pointer + void SetDefaultRenderer(wxGridCellRenderer *renderer); + void SetCellRenderer(int row, int col, wxGridCellRenderer *renderer); + wxGridCellRenderer *GetDefaultRenderer() const; + wxGridCellRenderer* GetCellRenderer(int row, int col); + + // takes ownership of the pointer + void SetDefaultEditor(wxGridCellEditor *editor); + void SetCellEditor(int row, int col, wxGridCellEditor *editor); + wxGridCellEditor *GetDefaultEditor() const; + wxGridCellEditor* GetCellEditor(int row, int col); + + + + // ------ cell value accessors + // + wxString GetCellValue( int row, int col ) + { + if ( m_table ) + { + return m_table->GetValue( row, col ); + } + else + { + return wxEmptyString; + } + } + + wxString GetCellValue( const wxGridCellCoords& coords ) + { return GetCellValue( coords.GetRow(), coords.GetCol() ); } + + void SetCellValue( int row, int col, const wxString& s ); + void SetCellValue( const wxGridCellCoords& coords, const wxString& s ) + { SetCellValue( coords.GetRow(), coords.GetCol(), s ); } + + // returns true if the cell can't be edited + bool IsReadOnly(int row, int col) const; + + // make the cell editable/readonly + void SetReadOnly(int row, int col, bool isReadOnly = true); + + // ------ select blocks of cells + // + void SelectRow( int row, bool addToSelected = false ); + void SelectCol( int col, bool addToSelected = false ); + + void SelectBlock( int topRow, int leftCol, int bottomRow, int rightCol, + bool addToSelected = false ); + + void SelectBlock( const wxGridCellCoords& topLeft, + const wxGridCellCoords& bottomRight, + bool addToSelected = false ) + { SelectBlock( topLeft.GetRow(), topLeft.GetCol(), + bottomRight.GetRow(), bottomRight.GetCol(), + addToSelected ); } + + void SelectAll(); + + bool IsSelection(); + + // ------ deselect blocks or cells + // + void DeselectRow( int row ); + void DeselectCol( int col ); + void DeselectCell( int row, int col ); + + void ClearSelection(); + + bool IsInSelection( int row, int col ) const; + + bool IsInSelection( const wxGridCellCoords& coords ) const + { return IsInSelection( coords.GetRow(), coords.GetCol() ); } + + wxGridCellCoordsArray GetSelectedCells() const; + wxGridCellCoordsArray GetSelectionBlockTopLeft() const; + wxGridCellCoordsArray GetSelectionBlockBottomRight() const; + wxArrayInt GetSelectedRows() const; + wxArrayInt GetSelectedCols() const; + + // This function returns the rectangle that encloses the block of cells + // limited by TopLeft and BottomRight cell in device coords and clipped + // to the client size of the grid window. + // + wxRect BlockToDeviceRect( const wxGridCellCoords & topLeft, + const wxGridCellCoords & bottomRight ); + + // Access or update the selection fore/back colours + wxColour GetSelectionBackground() const + { return m_selectionBackground; } + wxColour GetSelectionForeground() const + { return m_selectionForeground; } + + void SetSelectionBackground(const wxColour& c) { m_selectionBackground = c; } + void SetSelectionForeground(const wxColour& c) { m_selectionForeground = c; } + + + // Methods for a registry for mapping data types to Renderers/Editors + void RegisterDataType(const wxString& typeName, + wxGridCellRenderer* renderer, + wxGridCellEditor* editor); + // DJC MAPTEK + virtual wxGridCellEditor* GetDefaultEditorForCell(int row, int col) const; + wxGridCellEditor* GetDefaultEditorForCell(const wxGridCellCoords& c) const + { return GetDefaultEditorForCell(c.GetRow(), c.GetCol()); } + virtual wxGridCellRenderer* GetDefaultRendererForCell(int row, int col) const; + virtual wxGridCellEditor* GetDefaultEditorForType(const wxString& typeName) const; + virtual wxGridCellRenderer* GetDefaultRendererForType(const wxString& typeName) const; + + // grid may occupy more space than needed for its rows/columns, this + // function allows to set how big this extra space is + void SetMargins(int extraWidth, int extraHeight) + { + m_extraWidth = extraWidth; + m_extraHeight = extraHeight; + + CalcDimensions(); + } + + // Accessors for component windows + wxWindow* GetGridWindow() { return (wxWindow*)m_gridWin; } + wxWindow* GetGridRowLabelWindow() { return (wxWindow*)m_rowLabelWin; } + wxWindow* GetGridColLabelWindow() { return (wxWindow*)m_colLabelWin; } + wxWindow* GetGridCornerLabelWindow() { return (wxWindow*)m_cornerLabelWin; } + + // Allow adjustment of scroll increment. The default is (15, 15). + void SetScrollLineX(int x) { m_scrollLineX = x; } + void SetScrollLineY(int y) { m_scrollLineY = y; } + int GetScrollLineX() const { return m_scrollLineX; } + int GetScrollLineY() const { return m_scrollLineY; } + + // Implementation + int GetScrollX(int x) const + { + return (x + GetScrollLineX() - 1) / GetScrollLineX(); + } + + int GetScrollY(int y) const + { + return (y + GetScrollLineY() - 1) / GetScrollLineY(); + } + + + // override some base class functions + virtual bool Enable(bool enable = true); + + + // ------ For compatibility with previous wxGrid only... + // + // ************************************************ + // ** Don't use these in new code because they ** + // ** are liable to disappear in a future ** + // ** revision ** + // ************************************************ + // + + wxGrid( wxWindow *parent, + int x, int y, int w = wxDefaultCoord, int h = wxDefaultCoord, + long style = wxWANTS_CHARS, + const wxString& name = wxPanelNameStr ) + : wxScrolledWindow( parent, wxID_ANY, wxPoint(x,y), wxSize(w,h), + (style|wxWANTS_CHARS), name ) + { + Create(); + } + + void SetCellValue( const wxString& val, int row, int col ) + { SetCellValue( row, col, val ); } + + void UpdateDimensions() + { CalcDimensions(); } + + int GetRows() { return GetNumberRows(); } + int GetCols() { return GetNumberCols(); } + int GetCursorRow() { return GetGridCursorRow(); } + int GetCursorColumn() { return GetGridCursorCol(); } + + int GetScrollPosX() { return 0; } + int GetScrollPosY() { return 0; } + + void SetScrollX( int WXUNUSED(x) ) { } + void SetScrollY( int WXUNUSED(y) ) { } + + void SetColumnWidth( int col, int width ) + { SetColSize( col, width ); } + + int GetColumnWidth( int col ) + { return GetColSize( col ); } + + void SetRowHeight( int row, int height ) + { SetRowSize( row, height ); } + + // GetRowHeight() is below + + int GetViewHeight() // returned num whole rows visible + { return 0; } + + int GetViewWidth() // returned num whole cols visible + { return 0; } + + void SetLabelSize( int orientation, int sz ) + { + if ( orientation == wxHORIZONTAL ) + SetColLabelSize( sz ); + else + SetRowLabelSize( sz ); + } + + int GetLabelSize( int orientation ) + { + if ( orientation == wxHORIZONTAL ) + return GetColLabelSize(); + else + return GetRowLabelSize(); + } + + void SetLabelAlignment( int orientation, int align ) + { + if ( orientation == wxHORIZONTAL ) + SetColLabelAlignment( align, -1 ); + else + SetRowLabelAlignment( align, -1 ); + } + + int GetLabelAlignment( int orientation, int WXUNUSED(align) ) + { + int h, v; + if ( orientation == wxHORIZONTAL ) + { + GetColLabelAlignment( &h, &v ); + return h; + } + else + { + GetRowLabelAlignment( &h, &v ); + return h; + } + } + + void SetLabelValue( int orientation, const wxString& val, int pos ) + { + if ( orientation == wxHORIZONTAL ) + SetColLabelValue( pos, val ); + else + SetRowLabelValue( pos, val ); + } + + wxString GetLabelValue( int orientation, int pos) + { + if ( orientation == wxHORIZONTAL ) + return GetColLabelValue( pos ); + else + return GetRowLabelValue( pos ); + } + + wxFont GetCellTextFont() const + { return m_defaultCellAttr->GetFont(); } + + wxFont GetCellTextFont(int WXUNUSED(row), int WXUNUSED(col)) const + { return m_defaultCellAttr->GetFont(); } + + void SetCellTextFont(const wxFont& fnt) + { SetDefaultCellFont( fnt ); } + + void SetCellTextFont(const wxFont& fnt, int row, int col) + { SetCellFont( row, col, fnt ); } + + void SetCellTextColour(const wxColour& val, int row, int col) + { SetCellTextColour( row, col, val ); } + + void SetCellTextColour(const wxColour& col) + { SetDefaultCellTextColour( col ); } + + void SetCellBackgroundColour(const wxColour& col) + { SetDefaultCellBackgroundColour( col ); } + + void SetCellBackgroundColour(const wxColour& colour, int row, int col) + { SetCellBackgroundColour( row, col, colour ); } + + bool GetEditable() { return IsEditable(); } + void SetEditable( bool edit = true ) { EnableEditing( edit ); } + bool GetEditInPlace() { return IsCellEditControlEnabled(); } + + void SetEditInPlace(bool WXUNUSED(edit) = true) { } + + void SetCellAlignment( int align, int row, int col) + { SetCellAlignment(row, col, align, wxALIGN_CENTER); } + void SetCellAlignment( int WXUNUSED(align) ) {} + void SetCellBitmap(wxBitmap *WXUNUSED(bitmap), int WXUNUSED(row), int WXUNUSED(col)) + { } + void SetDividerPen(const wxPen& WXUNUSED(pen)) { } + wxPen& GetDividerPen() const; + void OnActivate(bool WXUNUSED(active)) {} + + // ******** End of compatibility functions ********** + + + + // ------ control IDs + enum { wxGRID_CELLCTRL = 2000, + wxGRID_TOPCTRL }; + + // ------ control types + enum { wxGRID_TEXTCTRL = 2100, + wxGRID_CHECKBOX, + wxGRID_CHOICE, + wxGRID_COMBOBOX }; + + // overridden wxWindow methods + virtual void Fit(); + +protected: + virtual wxSize DoGetBestSize() const; + + bool m_created; + + wxGridWindow *m_gridWin; + wxGridRowLabelWindow *m_rowLabelWin; + wxGridColLabelWindow *m_colLabelWin; + wxGridCornerLabelWindow *m_cornerLabelWin; + + wxGridTableBase *m_table; + bool m_ownTable; + + int m_numRows; + int m_numCols; + + wxGridCellCoords m_currentCellCoords; + + wxGridCellCoords m_selectingTopLeft; + wxGridCellCoords m_selectingBottomRight; + wxGridCellCoords m_selectingKeyboard; + wxGridSelection *m_selection; + wxColour m_selectionBackground; + wxColour m_selectionForeground; + + // NB: *never* access m_row/col arrays directly because they are created + // on demand, *always* use accessor functions instead! + + // init the m_rowHeights/Bottoms arrays with default values + void InitRowHeights(); + + int m_defaultRowHeight; + int m_minAcceptableRowHeight; + wxArrayInt m_rowHeights; + wxArrayInt m_rowBottoms; + + // init the m_colWidths/Rights arrays + void InitColWidths(); + + int m_defaultColWidth; + int m_minAcceptableColWidth; + wxArrayInt m_colWidths; + wxArrayInt m_colRights; + + // get the col/row coords + int GetColWidth(int col) const; + int GetColLeft(int col) const; + int GetColRight(int col) const; + + // this function must be public for compatibility... +public: + int GetRowHeight(int row) const; +protected: + + int GetRowTop(int row) const; + int GetRowBottom(int row) const; + + int m_rowLabelWidth; + int m_colLabelHeight; + + // the size of the margin left to the right and bottom of the cell area + int m_extraWidth, + m_extraHeight; + + wxColour m_labelBackgroundColour; + wxColour m_labelTextColour; + wxFont m_labelFont; + + int m_rowLabelHorizAlign; + int m_rowLabelVertAlign; + int m_colLabelHorizAlign; + int m_colLabelVertAlign; + int m_colLabelTextOrientation; + + bool m_defaultRowLabelValues; + bool m_defaultColLabelValues; + + wxColour m_gridLineColour; + bool m_gridLinesEnabled; + wxColour m_cellHighlightColour; + int m_cellHighlightPenWidth; + int m_cellHighlightROPenWidth; + + + // common part of AutoSizeColumn/Row() and GetBestSize() + int SetOrCalcColumnSizes(bool calcOnly, bool setAsMin = true); + int SetOrCalcRowSizes(bool calcOnly, bool setAsMin = true); + + // common part of AutoSizeColumn/Row() + void AutoSizeColOrRow(int n, bool setAsMin, bool column /* or row? */); + + // if a column has a minimal width, it will be the value for it in this + // hash table + wxLongToLongHashMap m_colMinWidths, + m_rowMinHeights; + + // get the minimal width of the given column/row + int GetColMinimalWidth(int col) const; + int GetRowMinimalHeight(int col) const; + + // do we have some place to store attributes in? + bool CanHaveAttributes(); + + // cell attribute cache (currently we only cache 1, may be will do + // more/better later) + struct CachedAttr + { + int row, col; + wxGridCellAttr *attr; + } m_attrCache; + + // invalidates the attribute cache + void ClearAttrCache(); + + // adds an attribute to cache + void CacheAttr(int row, int col, wxGridCellAttr *attr) const; + + // looks for an attr in cache, returns true if found + bool LookupAttr(int row, int col, wxGridCellAttr **attr) const; + + // looks for the attr in cache, if not found asks the table and caches the + // result + wxGridCellAttr *GetCellAttr(int row, int col) const; + wxGridCellAttr *GetCellAttr(const wxGridCellCoords& coords ) + { return GetCellAttr( coords.GetRow(), coords.GetCol() ); } + + // the default cell attr object for cells that don't have their own + wxGridCellAttr* m_defaultCellAttr; + + + bool m_inOnKeyDown; + int m_batchCount; + + + wxGridTypeRegistry* m_typeRegistry; + + enum CursorMode + { + WXGRID_CURSOR_SELECT_CELL, + WXGRID_CURSOR_RESIZE_ROW, + WXGRID_CURSOR_RESIZE_COL, + WXGRID_CURSOR_SELECT_ROW, + WXGRID_CURSOR_SELECT_COL, + WXGRID_CURSOR_MOVE_COL + }; + + // this method not only sets m_cursorMode but also sets the correct cursor + // for the given mode and, if captureMouse is not false releases the mouse + // if it was captured and captures it if it must be captured + // + // for this to work, you should always use it and not set m_cursorMode + // directly! + void ChangeCursorMode(CursorMode mode, + wxWindow *win = (wxWindow *)NULL, + bool captureMouse = true); + + wxWindow *m_winCapture; // the window which captured the mouse + CursorMode m_cursorMode; + + //Column positions + wxArrayInt m_colAt; + int m_moveToCol; + + bool m_canDragRowSize; + bool m_canDragColSize; + bool m_canDragColMove; + bool m_canDragGridSize; + bool m_canDragCell; + int m_dragLastPos; + int m_dragRowOrCol; + bool m_isDragging; + wxPoint m_startDragPos; + + bool m_waitForSlowClick; + + wxGridCellCoords m_selectionStart; + + wxCursor m_rowResizeCursor; + wxCursor m_colResizeCursor; + + bool m_editable; // applies to whole grid + bool m_cellEditCtrlEnabled; // is in-place edit currently shown? + + int m_scrollLineX; // X scroll increment + int m_scrollLineY; // Y scroll increment + + void Create(); + void Init(); + void CalcDimensions(); + void CalcWindowSizes(); + bool Redimension( wxGridTableMessage& ); + + + int SendEvent( const wxEventType, int row, int col, wxMouseEvent& ); + int SendEvent( const wxEventType, int row, int col ); + int SendEvent( const wxEventType type) + { + return SendEvent(type, + m_currentCellCoords.GetRow(), + m_currentCellCoords.GetCol()); + } + + void OnPaint( wxPaintEvent& ); + void OnSize( wxSizeEvent& ); + void OnKeyDown( wxKeyEvent& ); + void OnKeyUp( wxKeyEvent& ); + void OnChar( wxKeyEvent& ); + void OnEraseBackground( wxEraseEvent& ); + + + void SetCurrentCell( const wxGridCellCoords& coords ); + void SetCurrentCell( int row, int col ) + { SetCurrentCell( wxGridCellCoords(row, col) ); } + + void HighlightBlock( int topRow, int leftCol, int bottomRow, int rightCol ); + + void HighlightBlock( const wxGridCellCoords& topLeft, + const wxGridCellCoords& bottomRight ) + { HighlightBlock( topLeft.GetRow(), topLeft.GetCol(), + bottomRight.GetRow(), bottomRight.GetCol() ); } + + // ------ functions to get/send data (see also public functions) + // + bool GetModelValues(); + bool SetModelValues(); + + friend class WXDLLIMPEXP_ADV wxGridSelection; + + DECLARE_DYNAMIC_CLASS( wxGrid ) + DECLARE_EVENT_TABLE() + DECLARE_NO_COPY_CLASS(wxGrid) +}; + + +// ---------------------------------------------------------------------------- +// Grid event class and event types +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxGridEvent : public wxNotifyEvent +{ +public: + wxGridEvent() + : wxNotifyEvent(), m_row(-1), m_col(-1), m_x(-1), m_y(-1), + m_selecting(0), m_control(0), m_meta(0), m_shift(0), m_alt(0) + { + } + + wxGridEvent(int id, wxEventType type, wxObject* obj, + int row=-1, int col=-1, int x=-1, int y=-1, bool sel = true, + bool control = false, bool shift = false, bool alt = false, bool meta = false); + + virtual int GetRow() { return m_row; } + virtual int GetCol() { return m_col; } + wxPoint GetPosition() { return wxPoint( m_x, m_y ); } + bool Selecting() { return m_selecting; } + bool ControlDown() { return m_control; } + bool MetaDown() { return m_meta; } + bool ShiftDown() { return m_shift; } + bool AltDown() { return m_alt; } + bool CmdDown() + { +#if defined(__WXMAC__) || defined(__WXCOCOA__) + return MetaDown(); +#else + return ControlDown(); +#endif + } + + virtual wxEvent *Clone() const { return new wxGridEvent(*this); } + +protected: + int m_row; + int m_col; + int m_x; + int m_y; + bool m_selecting; + bool m_control; + bool m_meta; + bool m_shift; + bool m_alt; + + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxGridEvent) +}; + +class WXDLLIMPEXP_ADV wxGridSizeEvent : public wxNotifyEvent +{ +public: + wxGridSizeEvent() + : wxNotifyEvent(), m_rowOrCol(-1), m_x(-1), m_y(-1), + m_control(0), m_meta(0), m_shift(0), m_alt(0) + { + } + + wxGridSizeEvent(int id, wxEventType type, wxObject* obj, + int rowOrCol=-1, int x=-1, int y=-1, + bool control = false, bool shift = false, bool alt = false, bool meta = false); + + int GetRowOrCol() { return m_rowOrCol; } + wxPoint GetPosition() { return wxPoint( m_x, m_y ); } + bool ControlDown() { return m_control; } + bool MetaDown() { return m_meta; } + bool ShiftDown() { return m_shift; } + bool AltDown() { return m_alt; } + bool CmdDown() + { +#if defined(__WXMAC__) || defined(__WXCOCOA__) + return MetaDown(); +#else + return ControlDown(); +#endif + } + + virtual wxEvent *Clone() const { return new wxGridSizeEvent(*this); } + +protected: + int m_rowOrCol; + int m_x; + int m_y; + bool m_control; + bool m_meta; + bool m_shift; + bool m_alt; + + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxGridSizeEvent) +}; + + +class WXDLLIMPEXP_ADV wxGridRangeSelectEvent : public wxNotifyEvent +{ +public: + wxGridRangeSelectEvent() + : wxNotifyEvent() + { + m_topLeft = wxGridNoCellCoords; + m_bottomRight = wxGridNoCellCoords; + m_selecting = false; + m_control = false; + m_meta = false; + m_shift = false; + m_alt = false; + } + + wxGridRangeSelectEvent(int id, wxEventType type, wxObject* obj, + const wxGridCellCoords& topLeft, + const wxGridCellCoords& bottomRight, + bool sel = true, + bool control = false, bool shift = false, + bool alt = false, bool meta = false); + + wxGridCellCoords GetTopLeftCoords() { return m_topLeft; } + wxGridCellCoords GetBottomRightCoords() { return m_bottomRight; } + int GetTopRow() { return m_topLeft.GetRow(); } + int GetBottomRow() { return m_bottomRight.GetRow(); } + int GetLeftCol() { return m_topLeft.GetCol(); } + int GetRightCol() { return m_bottomRight.GetCol(); } + bool Selecting() { return m_selecting; } + bool ControlDown() { return m_control; } + bool MetaDown() { return m_meta; } + bool ShiftDown() { return m_shift; } + bool AltDown() { return m_alt; } + bool CmdDown() + { +#if defined(__WXMAC__) || defined(__WXCOCOA__) + return MetaDown(); +#else + return ControlDown(); +#endif + } + + virtual wxEvent *Clone() const { return new wxGridRangeSelectEvent(*this); } + +protected: + wxGridCellCoords m_topLeft; + wxGridCellCoords m_bottomRight; + bool m_selecting; + bool m_control; + bool m_meta; + bool m_shift; + bool m_alt; + + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxGridRangeSelectEvent) +}; + + +class WXDLLIMPEXP_ADV wxGridEditorCreatedEvent : public wxCommandEvent { +public: + wxGridEditorCreatedEvent() + : wxCommandEvent() + { + m_row = 0; + m_col = 0; + m_ctrl = NULL; + } + + wxGridEditorCreatedEvent(int id, wxEventType type, wxObject* obj, + int row, int col, wxControl* ctrl); + + int GetRow() { return m_row; } + int GetCol() { return m_col; } + wxControl* GetControl() { return m_ctrl; } + void SetRow(int row) { m_row = row; } + void SetCol(int col) { m_col = col; } + void SetControl(wxControl* ctrl) { m_ctrl = ctrl; } + + virtual wxEvent *Clone() const { return new wxGridEditorCreatedEvent(*this); } + +private: + int m_row; + int m_col; + wxControl* m_ctrl; + + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxGridEditorCreatedEvent) +}; + + +BEGIN_DECLARE_EVENT_TYPES() + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_GRID_CELL_LEFT_CLICK, 1580) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_GRID_CELL_RIGHT_CLICK, 1581) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_GRID_CELL_LEFT_DCLICK, 1582) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_GRID_CELL_RIGHT_DCLICK, 1583) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_GRID_LABEL_LEFT_CLICK, 1584) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_GRID_LABEL_RIGHT_CLICK, 1585) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_GRID_LABEL_LEFT_DCLICK, 1586) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_GRID_LABEL_RIGHT_DCLICK, 1587) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_GRID_ROW_SIZE, 1588) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_GRID_COL_SIZE, 1589) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_GRID_RANGE_SELECT, 1590) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_GRID_CELL_CHANGE, 1591) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_GRID_SELECT_CELL, 1592) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_GRID_EDITOR_SHOWN, 1593) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_GRID_EDITOR_HIDDEN, 1594) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_GRID_EDITOR_CREATED, 1595) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_GRID_CELL_BEGIN_DRAG, 1596) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_GRID_COL_MOVE, 1597) +END_DECLARE_EVENT_TYPES() + + +typedef void (wxEvtHandler::*wxGridEventFunction)(wxGridEvent&); +typedef void (wxEvtHandler::*wxGridSizeEventFunction)(wxGridSizeEvent&); +typedef void (wxEvtHandler::*wxGridRangeSelectEventFunction)(wxGridRangeSelectEvent&); +typedef void (wxEvtHandler::*wxGridEditorCreatedEventFunction)(wxGridEditorCreatedEvent&); + +#define wxGridEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxGridEventFunction, &func) + +#define wxGridSizeEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxGridSizeEventFunction, &func) + +#define wxGridRangeSelectEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxGridRangeSelectEventFunction, &func) + +#define wxGridEditorCreatedEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxGridEditorCreatedEventFunction, &func) + +#define wx__DECLARE_GRIDEVT(evt, id, fn) \ + wx__DECLARE_EVT1(wxEVT_GRID_ ## evt, id, wxGridEventHandler(fn)) + +#define wx__DECLARE_GRIDSIZEEVT(evt, id, fn) \ + wx__DECLARE_EVT1(wxEVT_GRID_ ## evt, id, wxGridSizeEventHandler(fn)) + +#define wx__DECLARE_GRIDRANGESELEVT(evt, id, fn) \ + wx__DECLARE_EVT1(wxEVT_GRID_ ## evt, id, wxGridRangeSelectEventHandler(fn)) + +#define wx__DECLARE_GRIDEDITOREVT(evt, id, fn) \ + wx__DECLARE_EVT1(wxEVT_GRID_ ## evt, id, wxGridEditorCreatedEventHandler(fn)) + +#define EVT_GRID_CMD_CELL_LEFT_CLICK(id, fn) wx__DECLARE_GRIDEVT(CELL_LEFT_CLICK, id, fn) +#define EVT_GRID_CMD_CELL_RIGHT_CLICK(id, fn) wx__DECLARE_GRIDEVT(CELL_RIGHT_CLICK, id, fn) +#define EVT_GRID_CMD_CELL_LEFT_DCLICK(id, fn) wx__DECLARE_GRIDEVT(CELL_LEFT_DCLICK, id, fn) +#define EVT_GRID_CMD_CELL_RIGHT_DCLICK(id, fn) wx__DECLARE_GRIDEVT(CELL_RIGHT_DCLICK, id, fn) +#define EVT_GRID_CMD_LABEL_LEFT_CLICK(id, fn) wx__DECLARE_GRIDEVT(LABEL_LEFT_CLICK, id, fn) +#define EVT_GRID_CMD_LABEL_RIGHT_CLICK(id, fn) wx__DECLARE_GRIDEVT(LABEL_RIGHT_CLICK, id, fn) +#define EVT_GRID_CMD_LABEL_LEFT_DCLICK(id, fn) wx__DECLARE_GRIDEVT(LABEL_LEFT_DCLICK, id, fn) +#define EVT_GRID_CMD_LABEL_RIGHT_DCLICK(id, fn) wx__DECLARE_GRIDEVT(LABEL_RIGHT_DCLICK, id, fn) +#define EVT_GRID_CMD_ROW_SIZE(id, fn) wx__DECLARE_GRIDSIZEEVT(ROW_SIZE, id, fn) +#define EVT_GRID_CMD_COL_SIZE(id, fn) wx__DECLARE_GRIDSIZEEVT(COL_SIZE, id, fn) +#define EVT_GRID_CMD_COL_MOVE(id, fn) wx__DECLARE_GRIDSIZEEVT(COL_MOVE, id, fn) +#define EVT_GRID_CMD_RANGE_SELECT(id, fn) wx__DECLARE_GRIDRANGESELEVT(RANGE_SELECT, id, fn) +#define EVT_GRID_CMD_CELL_CHANGE(id, fn) wx__DECLARE_GRIDEVT(CELL_CHANGE, id, fn) +#define EVT_GRID_CMD_SELECT_CELL(id, fn) wx__DECLARE_GRIDEVT(SELECT_CELL, id, fn) +#define EVT_GRID_CMD_EDITOR_SHOWN(id, fn) wx__DECLARE_GRIDEVT(EDITOR_SHOWN, id, fn) +#define EVT_GRID_CMD_EDITOR_HIDDEN(id, fn) wx__DECLARE_GRIDEVT(EDITOR_HIDDEN, id, fn) +#define EVT_GRID_CMD_EDITOR_CREATED(id, fn) wx__DECLARE_GRIDEDITOREVT(EDITOR_CREATED, id, fn) +#define EVT_GRID_CMD_CELL_BEGIN_DRAG(id, fn) wx__DECLARE_GRIDEVT(CELL_BEGIN_DRAG, id, fn) + +// same as above but for any id (exists mainly for backwards compatibility but +// then it's also true that you rarely have multiple grid in the same window) +#define EVT_GRID_CELL_LEFT_CLICK(fn) EVT_GRID_CMD_CELL_LEFT_CLICK(wxID_ANY, fn) +#define EVT_GRID_CELL_RIGHT_CLICK(fn) EVT_GRID_CMD_CELL_RIGHT_CLICK(wxID_ANY, fn) +#define EVT_GRID_CELL_LEFT_DCLICK(fn) EVT_GRID_CMD_CELL_LEFT_DCLICK(wxID_ANY, fn) +#define EVT_GRID_CELL_RIGHT_DCLICK(fn) EVT_GRID_CMD_CELL_RIGHT_DCLICK(wxID_ANY, fn) +#define EVT_GRID_LABEL_LEFT_CLICK(fn) EVT_GRID_CMD_LABEL_LEFT_CLICK(wxID_ANY, fn) +#define EVT_GRID_LABEL_RIGHT_CLICK(fn) EVT_GRID_CMD_LABEL_RIGHT_CLICK(wxID_ANY, fn) +#define EVT_GRID_LABEL_LEFT_DCLICK(fn) EVT_GRID_CMD_LABEL_LEFT_DCLICK(wxID_ANY, fn) +#define EVT_GRID_LABEL_RIGHT_DCLICK(fn) EVT_GRID_CMD_LABEL_RIGHT_DCLICK(wxID_ANY, fn) +#define EVT_GRID_ROW_SIZE(fn) EVT_GRID_CMD_ROW_SIZE(wxID_ANY, fn) +#define EVT_GRID_COL_SIZE(fn) EVT_GRID_CMD_COL_SIZE(wxID_ANY, fn) +#define EVT_GRID_COL_MOVE(fn) EVT_GRID_CMD_COL_MOVE(wxID_ANY, fn) +#define EVT_GRID_RANGE_SELECT(fn) EVT_GRID_CMD_RANGE_SELECT(wxID_ANY, fn) +#define EVT_GRID_CELL_CHANGE(fn) EVT_GRID_CMD_CELL_CHANGE(wxID_ANY, fn) +#define EVT_GRID_SELECT_CELL(fn) EVT_GRID_CMD_SELECT_CELL(wxID_ANY, fn) +#define EVT_GRID_EDITOR_SHOWN(fn) EVT_GRID_CMD_EDITOR_SHOWN(wxID_ANY, fn) +#define EVT_GRID_EDITOR_HIDDEN(fn) EVT_GRID_CMD_EDITOR_HIDDEN(wxID_ANY, fn) +#define EVT_GRID_EDITOR_CREATED(fn) EVT_GRID_CMD_EDITOR_CREATED(wxID_ANY, fn) +#define EVT_GRID_CELL_BEGIN_DRAG(fn) EVT_GRID_CMD_CELL_BEGIN_DRAG(wxID_ANY, fn) + +#if 0 // TODO: implement these ? others ? + +extern const int wxEVT_GRID_CREATE_CELL; +extern const int wxEVT_GRID_CHANGE_LABELS; +extern const int wxEVT_GRID_CHANGE_SEL_LABEL; + +#define EVT_GRID_CREATE_CELL(fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_GRID_CREATE_CELL, wxID_ANY, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxGridEventFunction, &fn ), NULL ), +#define EVT_GRID_CHANGE_LABELS(fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_GRID_CHANGE_LABELS, wxID_ANY, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxGridEventFunction, &fn ), NULL ), +#define EVT_GRID_CHANGE_SEL_LABEL(fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_GRID_CHANGE_SEL_LABEL, wxID_ANY, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxGridEventFunction, &fn ), NULL ), + +#endif + +#endif // wxUSE_GRID +#endif // _WX_GENERIC_GRID_H_ diff --git a/Externals/wxWidgets/include/wx/generic/gridctrl.h b/Externals/wxWidgets/include/wx/generic/gridctrl.h new file mode 100644 index 0000000000..3f810a9ffe --- /dev/null +++ b/Externals/wxWidgets/include/wx/generic/gridctrl.h @@ -0,0 +1,158 @@ +/////////////////////////////////////////////////////////////////////////// +// Name: generic/gridctrl.h +// Purpose: wxGrid controls +// Author: Paul Gammans, Roger Gammans +// Modified by: +// Created: 11/04/2001 +// RCS-ID: $Id: gridctrl.h 48089 2007-08-15 11:46:57Z VZ $ +// Copyright: (c) The Computer Surgery (paul@compsurg.co.uk) +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GENERIC_GRIDCTRL_H_ +#define _WX_GENERIC_GRIDCTRL_H_ + +#include "wx/grid.h" + +#if wxUSE_GRID + +#define wxGRID_VALUE_CHOICEINT _T("choiceint") +#define wxGRID_VALUE_DATETIME _T("datetime") + +#if wxUSE_DATETIME + +#include "wx/datetime.h" + +// the default renderer for the cells containing Time and dates.. +class WXDLLIMPEXP_ADV wxGridCellDateTimeRenderer : public wxGridCellStringRenderer +{ +public: + wxGridCellDateTimeRenderer(const wxString& outformat = wxDefaultDateTimeFormat, + const wxString& informat = wxDefaultDateTimeFormat); + + // draw the string right aligned + virtual void Draw(wxGrid& grid, + wxGridCellAttr& attr, + wxDC& dc, + const wxRect& rect, + int row, int col, + bool isSelected); + + virtual wxSize GetBestSize(wxGrid& grid, + wxGridCellAttr& attr, + wxDC& dc, + int row, int col); + + virtual wxGridCellRenderer *Clone() const; + + // parameters string format is "width[,precision]" + virtual void SetParameters(const wxString& params); + +protected: + wxString GetString(const wxGrid& grid, int row, int col); + + wxString m_iformat; + wxString m_oformat; + wxDateTime m_dateDef; + wxDateTime::TimeZone m_tz; +}; + +#endif // wxUSE_DATETIME + +// the default renderer for the cells containing Time and dates.. +class WXDLLIMPEXP_ADV wxGridCellEnumRenderer : public wxGridCellStringRenderer +{ +public: + wxGridCellEnumRenderer( const wxString& choices = wxEmptyString ); + + // draw the string right aligned + virtual void Draw(wxGrid& grid, + wxGridCellAttr& attr, + wxDC& dc, + const wxRect& rect, + int row, int col, + bool isSelected); + + virtual wxSize GetBestSize(wxGrid& grid, + wxGridCellAttr& attr, + wxDC& dc, + int row, int col); + + virtual wxGridCellRenderer *Clone() const; + + // parameters string format is "item1[,item2[...,itemN]]" + virtual void SetParameters(const wxString& params); + +protected: + wxString GetString(const wxGrid& grid, int row, int col); + + wxArrayString m_choices; +}; + + +#if wxUSE_COMBOBOX + +class WXDLLIMPEXP_ADV wxGridCellEnumEditor : public wxGridCellChoiceEditor +{ +public: + wxGridCellEnumEditor( const wxString& choices = wxEmptyString ); + virtual ~wxGridCellEnumEditor() {} + + virtual wxGridCellEditor* Clone() const; + + virtual bool EndEdit(int row, int col, wxGrid* grid); + virtual void BeginEdit(int row, int col, wxGrid* grid); + +private: + long int m_startint; + + DECLARE_NO_COPY_CLASS(wxGridCellEnumEditor) +}; + +#endif // wxUSE_COMBOBOX + +class WXDLLIMPEXP_ADV wxGridCellAutoWrapStringEditor : public wxGridCellTextEditor +{ +public: + wxGridCellAutoWrapStringEditor() : wxGridCellTextEditor() { } + virtual void Create(wxWindow* parent, + wxWindowID id, + wxEvtHandler* evtHandler); + + virtual wxGridCellEditor *Clone() const + { return new wxGridCellAutoWrapStringEditor; } + + DECLARE_NO_COPY_CLASS(wxGridCellAutoWrapStringEditor) +}; + +class WXDLLIMPEXP_ADV wxGridCellAutoWrapStringRenderer : public wxGridCellStringRenderer +{ +public: + wxGridCellAutoWrapStringRenderer() : wxGridCellStringRenderer() { } + + virtual void Draw(wxGrid& grid, + wxGridCellAttr& attr, + wxDC& dc, + const wxRect& rect, + int row, int col, + bool isSelected); + + virtual wxSize GetBestSize(wxGrid& grid, + wxGridCellAttr& attr, + wxDC& dc, + int row, int col); + + virtual wxGridCellRenderer *Clone() const + { return new wxGridCellAutoWrapStringRenderer; } + +private: + wxArrayString GetTextLines( wxGrid& grid, + wxDC& dc, + const wxGridCellAttr& attr, + const wxRect& rect, + int row, int col); + +}; + +#endif // wxUSE_GRID +#endif // _WX_GENERIC_GRIDCTRL_H_ diff --git a/Externals/wxWidgets/include/wx/generic/gridsel.h b/Externals/wxWidgets/include/wx/generic/gridsel.h new file mode 100644 index 0000000000..9f6d9b29cd --- /dev/null +++ b/Externals/wxWidgets/include/wx/generic/gridsel.h @@ -0,0 +1,88 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/gridsel.h +// Purpose: wxGridSelection +// Author: Stefan Neis +// Modified by: +// Created: 20/02/2000 +// RCS-ID: $$ +// Copyright: (c) Stefan Neis +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GENERIC_GRIDSEL_H_ +#define _WX_GENERIC_GRIDSEL_H_ + +#include "wx/defs.h" + +#if wxUSE_GRID + +#include "wx/grid.h" + +class WXDLLIMPEXP_ADV wxGridSelection +{ +public: + wxGridSelection( wxGrid * grid, wxGrid::wxGridSelectionModes sel = + wxGrid::wxGridSelectCells ); + bool IsSelection(); + bool IsInSelection ( int row, int col ); + void SetSelectionMode(wxGrid::wxGridSelectionModes selmode); + wxGrid::wxGridSelectionModes GetSelectionMode() { return m_selectionMode; } + void SelectRow( int row, + bool ControlDown = false, bool ShiftDown = false, + bool AltDown = false, bool MetaDown = false ); + void SelectCol( int col, + bool ControlDown = false, bool ShiftDown = false, + bool AltDown = false, bool MetaDown = false ); + void SelectBlock( int topRow, int leftCol, + int bottomRow, int rightCol, + bool ControlDown = false, bool ShiftDown = false, + bool AltDown = false, bool MetaDown = false, + bool sendEvent = true ); + void SelectCell( int row, int col, + bool ControlDown = false, bool ShiftDown = false, + bool AltDown = false, bool MetaDown = false, + bool sendEvent = true ); + void ToggleCellSelection( int row, int col, + bool ControlDown = false, + bool ShiftDown = false, + bool AltDown = false, bool MetaDown = false ); + void ClearSelection(); + + void UpdateRows( size_t pos, int numRows ); + void UpdateCols( size_t pos, int numCols ); + +private: + int BlockContain( int topRow1, int leftCol1, + int bottomRow1, int rightCol1, + int topRow2, int leftCol2, + int bottomRow2, int rightCol2 ); + // returns 1, if Block1 contains Block2, + // -1, if Block2 contains Block1, + // 0, otherwise + + int BlockContainsCell( int topRow, int leftCol, + int bottomRow, int rightCol, + int row, int col ) + // returns 1, if Block contains Cell, + // 0, otherwise + { + return ( topRow <= row && row <= bottomRow && + leftCol <= col && col <= rightCol ); + } + + wxGridCellCoordsArray m_cellSelection; + wxGridCellCoordsArray m_blockSelectionTopLeft; + wxGridCellCoordsArray m_blockSelectionBottomRight; + wxArrayInt m_rowSelection; + wxArrayInt m_colSelection; + + wxGrid *m_grid; + wxGrid::wxGridSelectionModes m_selectionMode; + + friend class WXDLLIMPEXP_FWD_ADV wxGrid; + + DECLARE_NO_COPY_CLASS(wxGridSelection) +}; + +#endif // wxUSE_GRID +#endif // _WX_GENERIC_GRIDSEL_H_ diff --git a/Externals/wxWidgets/include/wx/generic/helpext.h b/Externals/wxWidgets/include/wx/generic/helpext.h new file mode 100644 index 0000000000..cf56646497 --- /dev/null +++ b/Externals/wxWidgets/include/wx/generic/helpext.h @@ -0,0 +1,166 @@ +/*-*- c++ -*-******************************************************** + * helpext.h - an external help controller for wxWidgets * + * * + * (C) 1998 by Karsten Ballüder (Ballueder@usa.net) * + * License: wxWindows licence * + * * + * $Id: helpext.h 41020 2006-09-05 20:47:48Z VZ $ + *******************************************************************/ + +#ifndef __WX_HELPEXT_H_ +#define __WX_HELPEXT_H_ + +#if wxUSE_HELP + +#include "wx/helpbase.h" + +/** + This class implements help via an external browser. + It requires the name of a directory containing the documentation + and a file mapping numerical Section numbers to relative URLS. + + The map file contains two or three fields per line: + numeric_id relative_URL [; comment/documentation] + + The numeric_id is the id used to look up the entry in + DisplaySection()/DisplayBlock(). The relative_URL is a filename of + an html file, relative to the help directory. The optional + comment/documentation field (after a ';') is used for keyword + searches, so some meaningful text here does not hurt. + If the documentation itself contains a ';', only the part before + that will be displayed in the listbox, but all of it used for search. + + Lines starting with ';' will be ignored. +*/ + +class WXDLLIMPEXP_ADV wxExtHelpController : public wxHelpControllerBase +{ +public: + wxExtHelpController(wxWindow* parentWindow = NULL); + virtual ~wxExtHelpController(); + + /** Tell it which browser to use. + The Netscape support will check whether Netscape is already + running (by looking at the .netscape/lock file in the user's + home directory) and tell it to load the page into the existing + window. + @param browsername The command to call a browser/html viewer. + @param isNetscape Set this to true if the browser is some variant of Netscape. + */ + void SetBrowser(const wxString& browsername = wxEmptyString, + bool isNetscape = false); + + // Set viewer: new name for SetBrowser + virtual void SetViewer(const wxString& viewer = wxEmptyString, + long flags = wxHELP_NETSCAPE); + + /** This must be called to tell the controller where to find the + documentation. + If a locale is set, look in file/localename, i.e. + If passed "/usr/local/myapp/help" and the current wxLocale is + set to be "de", then look in "/usr/local/myapp/help/de/" + first and fall back to "/usr/local/myapp/help" if that + doesn't exist. + + @param file - NOT a filename, but a directory name. + @return true on success + */ + virtual bool Initialize(const wxString& dir, int WXUNUSED(server)) + { return Initialize(dir); } + + /** This must be called to tell the controller where to find the + documentation. + If a locale is set, look in file/localename, i.e. + If passed "/usr/local/myapp/help" and the current wxLocale is + set to be "de", then look in "/usr/local/myapp/help/de/" + first and fall back to "/usr/local/myapp/help" if that + doesn't exist. + @param dir - directory name where to fine the help files + @return true on success + */ + virtual bool Initialize(const wxString& dir); + + /** If file is "", reloads file given in Initialize. + @file Name of help directory. + @return true on success + */ + virtual bool LoadFile(const wxString& file = wxEmptyString); + + /** Display list of all help entries. + @return true on success + */ + virtual bool DisplayContents(void); + /** Display help for id sectionNo. + @return true on success + */ + virtual bool DisplaySection(int sectionNo); + /** Display help for id sectionNo -- identical with DisplaySection(). + @return true on success + */ + virtual bool DisplaySection(const wxString& section); + /** Display help for URL (using DisplayHelp) or keyword (using KeywordSearch) + @return true on success + */ + virtual bool DisplayBlock(long blockNo); + /** Search comment/documentation fields in map file and present a + list to chose from. + @key k string to search for, empty string will list all entries + @return true on success + */ + virtual bool KeywordSearch(const wxString& k, + wxHelpSearchMode mode = wxHELP_SEARCH_ALL); + + /// does nothing + virtual bool Quit(void); + /// does nothing + virtual void OnQuit(void); + + /// Call the browser using a relative URL. + virtual bool DisplayHelp(const wxString &) ; + + /// Allows one to override the default settings for the help frame. + virtual void SetFrameParameters(const wxString& WXUNUSED(title), + const wxSize& WXUNUSED(size), + const wxPoint& WXUNUSED(pos) = wxDefaultPosition, + bool WXUNUSED(newFrameEachTime) = false) + { + // does nothing by default + } + /// Obtains the latest settings used by the help frame and the help + /// frame. + virtual wxFrame *GetFrameParameters(wxSize *WXUNUSED(size) = NULL, + wxPoint *WXUNUSED(pos) = NULL, + bool *WXUNUSED(newFrameEachTime) = NULL) + { + return (wxFrame*) NULL;// does nothing by default + } + +protected: + /// Filename of currently active map file. + wxString m_helpDir; + /// How many entries do we have in the map file? + int m_NumOfEntries; + /// A list containing all id,url,documentation triples. + wxList *m_MapList; + +private: + // parse a single line of the map file (called by LoadFile()) + // + // return true if the line was valid or false otherwise + bool ParseMapFileLine(const wxString& line); + + /// Deletes the list and all objects. + void DeleteList(void); + + + /// How to call the html viewer. + wxString m_BrowserName; + /// Is the viewer a variant of netscape? + bool m_BrowserIsNetscape; + + DECLARE_CLASS(wxExtHelpController) +}; + +#endif // wxUSE_HELP + +#endif // __WX_HELPEXT_H_ diff --git a/Externals/wxWidgets/include/wx/generic/icon.h b/Externals/wxWidgets/include/wx/generic/icon.h new file mode 100644 index 0000000000..ae8e5f9513 --- /dev/null +++ b/Externals/wxWidgets/include/wx/generic/icon.h @@ -0,0 +1,56 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/icon.h +// Purpose: wxIcon implementation for ports where it's same as wxBitmap +// Author: Julian Smart +// Modified by: +// Created: 17/09/98 +// RCS-ID: $Id: icon.h 42752 2006-10-30 19:26:48Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GENERIC_ICON_H_ +#define _WX_GENERIC_ICON_H_ + +#include "wx/bitmap.h" + +//----------------------------------------------------------------------------- +// wxIcon +//----------------------------------------------------------------------------- + +#ifndef wxICON_DEFAULT_BITMAP_TYPE +#define wxICON_DEFAULT_BITMAP_TYPE wxBITMAP_TYPE_XPM +#endif + +class WXDLLIMPEXP_CORE wxIcon: public wxBitmap +{ +public: + wxIcon(); + + wxIcon( const char **bits, int width=-1, int height=-1 ); + wxIcon( char **bits, int width=-1, int height=-1 ); + + // For compatibility with wxMSW where desired size is sometimes required to + // distinguish between multiple icons in a resource. + wxIcon( const wxString& filename, + wxBitmapType type = wxICON_DEFAULT_BITMAP_TYPE, + int WXUNUSED(desiredWidth)=-1, int WXUNUSED(desiredHeight)=-1 ) : + wxBitmap(filename, type) + { + } + + wxIcon(const wxIconLocation& loc) + : wxBitmap(loc.GetFileName(), wxBITMAP_TYPE_ANY) + { + } + + // create from bitmap (which should have a mask unless it's monochrome): + // there shouldn't be any implicit bitmap -> icon conversion (i.e. no + // ctors, assignment operators...), but it's ok to have such function + void CopyFromBitmap(const wxBitmap& bmp); + +private: + DECLARE_DYNAMIC_CLASS(wxIcon) +}; + +#endif // _WX_GENERIC_ICON_H_ diff --git a/Externals/wxWidgets/include/wx/generic/imaglist.h b/Externals/wxWidgets/include/wx/generic/imaglist.h new file mode 100644 index 0000000000..3b422dbf08 --- /dev/null +++ b/Externals/wxWidgets/include/wx/generic/imaglist.h @@ -0,0 +1,82 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/imaglist.h +// Purpose: +// Author: Robert Roebling +// Created: 01/02/97 +// Id: +// Copyright: (c) 1998 Robert Roebling and Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef __IMAGELISTH_G__ +#define __IMAGELISTH_G__ + +#include "wx/defs.h" +#include "wx/list.h" +#include "wx/icon.h" + +class WXDLLEXPORT wxDC; +class WXDLLEXPORT wxBitmap; +class WXDLLEXPORT wxColour; + + +class WXDLLEXPORT wxGenericImageList: public wxObject +{ +public: + wxGenericImageList() { m_width = m_height = 0; } + wxGenericImageList( int width, int height, bool mask = true, int initialCount = 1 ); + virtual ~wxGenericImageList(); + bool Create( int width, int height, bool mask = true, int initialCount = 1 ); + bool Create(); + + virtual int GetImageCount() const; + virtual bool GetSize( int index, int &width, int &height ) const; + + int Add( const wxBitmap& bitmap ); + int Add( const wxBitmap& bitmap, const wxBitmap& mask ); + int Add( const wxBitmap& bitmap, const wxColour& maskColour ); + wxBitmap GetBitmap(int index) const; + wxIcon GetIcon(int index) const; + bool Replace( int index, const wxBitmap &bitmap ); + bool Replace( int index, const wxBitmap &bitmap, const wxBitmap& mask ); + bool Remove( int index ); + bool RemoveAll(); + + virtual bool Draw(int index, wxDC& dc, int x, int y, + int flags = wxIMAGELIST_DRAW_NORMAL, + bool solidBackground = false); + + // Internal use only + const wxBitmap *GetBitmapPtr(int index) const; +private: + wxList m_images; + + int m_width; + int m_height; + + DECLARE_DYNAMIC_CLASS(wxGenericImageList) +}; + +#ifndef wxHAS_NATIVE_IMAGELIST + +/* + * wxImageList has to be a real class or we have problems with + * the run-time information. + */ + +class WXDLLEXPORT wxImageList: public wxGenericImageList +{ + DECLARE_DYNAMIC_CLASS(wxImageList) + +public: + wxImageList() {} + + wxImageList( int width, int height, bool mask = true, int initialCount = 1 ) + : wxGenericImageList(width, height, mask, initialCount) + { + } +}; +#endif // !wxHAS_NATIVE_IMAGELIST + +#endif // __IMAGELISTH_G__ + diff --git a/Externals/wxWidgets/include/wx/generic/laywin.h b/Externals/wxWidgets/include/wx/generic/laywin.h new file mode 100644 index 0000000000..9031174384 --- /dev/null +++ b/Externals/wxWidgets/include/wx/generic/laywin.h @@ -0,0 +1,222 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: laywin.h +// Purpose: Implements a simple layout algorithm, plus +// wxSashLayoutWindow which is an example of a window with +// layout-awareness (via event handlers). This is suited to +// IDE-style window layout. +// Author: Julian Smart +// Modified by: +// Created: 04/01/98 +// RCS-ID: $Id: laywin.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_LAYWIN_H_G_ +#define _WX_LAYWIN_H_G_ + +#if wxUSE_SASH + #include "wx/sashwin.h" +#endif // wxUSE_SASH + +#include "wx/event.h" + +BEGIN_DECLARE_EVENT_TYPES() + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_QUERY_LAYOUT_INFO, 1500) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_CALCULATE_LAYOUT, 1501) +END_DECLARE_EVENT_TYPES() + +enum wxLayoutOrientation +{ + wxLAYOUT_HORIZONTAL, + wxLAYOUT_VERTICAL +}; + +enum wxLayoutAlignment +{ + wxLAYOUT_NONE, + wxLAYOUT_TOP, + wxLAYOUT_LEFT, + wxLAYOUT_RIGHT, + wxLAYOUT_BOTTOM +}; + +// Not sure this is necessary +// Tell window which dimension we're sizing on +#define wxLAYOUT_LENGTH_Y 0x0008 +#define wxLAYOUT_LENGTH_X 0x0000 + +// Use most recently used length +#define wxLAYOUT_MRU_LENGTH 0x0010 + +// Only a query, so don't actually move it. +#define wxLAYOUT_QUERY 0x0100 + +/* + * This event is used to get information about window alignment, + * orientation and size. + */ + +class WXDLLIMPEXP_ADV wxQueryLayoutInfoEvent: public wxEvent +{ +public: + wxQueryLayoutInfoEvent(wxWindowID id = 0) + { + SetEventType(wxEVT_QUERY_LAYOUT_INFO); + m_requestedLength = 0; + m_flags = 0; + m_id = id; + m_alignment = wxLAYOUT_TOP; + m_orientation = wxLAYOUT_HORIZONTAL; + } + + // Read by the app + void SetRequestedLength(int length) { m_requestedLength = length; } + int GetRequestedLength() const { return m_requestedLength; } + + void SetFlags(int flags) { m_flags = flags; } + int GetFlags() const { return m_flags; } + + // Set by the app + void SetSize(const wxSize& size) { m_size = size; } + wxSize GetSize() const { return m_size; } + + void SetOrientation(wxLayoutOrientation orient) { m_orientation = orient; } + wxLayoutOrientation GetOrientation() const { return m_orientation; } + + void SetAlignment(wxLayoutAlignment align) { m_alignment = align; } + wxLayoutAlignment GetAlignment() const { return m_alignment; } + + virtual wxEvent *Clone() const { return new wxQueryLayoutInfoEvent(*this); } + +protected: + int m_flags; + int m_requestedLength; + wxSize m_size; + wxLayoutOrientation m_orientation; + wxLayoutAlignment m_alignment; + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxQueryLayoutInfoEvent) +}; + +typedef void (wxEvtHandler::*wxQueryLayoutInfoEventFunction)(wxQueryLayoutInfoEvent&); + +#define EVT_QUERY_LAYOUT_INFO(func) \ + DECLARE_EVENT_TABLE_ENTRY( wxEVT_QUERY_LAYOUT_INFO, wxID_ANY, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxQueryLayoutInfoEventFunction, & func ), NULL ), + +/* + * This event is used to take a bite out of the available client area. + */ + +class WXDLLIMPEXP_ADV wxCalculateLayoutEvent: public wxEvent +{ +public: + wxCalculateLayoutEvent(wxWindowID id = 0) + { + SetEventType(wxEVT_CALCULATE_LAYOUT); + m_flags = 0; + m_id = id; + } + + // Read by the app + void SetFlags(int flags) { m_flags = flags; } + int GetFlags() const { return m_flags; } + + // Set by the app + void SetRect(const wxRect& rect) { m_rect = rect; } + wxRect GetRect() const { return m_rect; } + + virtual wxEvent *Clone() const { return new wxCalculateLayoutEvent(*this); } + +protected: + int m_flags; + wxRect m_rect; + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxCalculateLayoutEvent) +}; + +typedef void (wxEvtHandler::*wxCalculateLayoutEventFunction)(wxCalculateLayoutEvent&); + +#define EVT_CALCULATE_LAYOUT(func) \ + DECLARE_EVENT_TABLE_ENTRY( wxEVT_CALCULATE_LAYOUT, wxID_ANY, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxCalculateLayoutEventFunction, & func ), NULL ), + +#if wxUSE_SASH + +// This is window that can remember alignment/orientation, does its own layout, +// and can provide sashes too. Useful for implementing docked windows with sashes in +// an IDE-style interface. +class WXDLLIMPEXP_ADV wxSashLayoutWindow: public wxSashWindow +{ +public: + wxSashLayoutWindow() + { + Init(); + } + + wxSashLayoutWindow(wxWindow *parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = wxSW_3D|wxCLIP_CHILDREN, const wxString& name = wxT("layoutWindow")) + { + Create(parent, id, pos, size, style, name); + } + + bool Create(wxWindow *parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = wxSW_3D|wxCLIP_CHILDREN, const wxString& name = wxT("layoutWindow")); + +// Accessors + inline wxLayoutAlignment GetAlignment() const { return m_alignment; } + inline wxLayoutOrientation GetOrientation() const { return m_orientation; } + + inline void SetAlignment(wxLayoutAlignment align) { m_alignment = align; } + inline void SetOrientation(wxLayoutOrientation orient) { m_orientation = orient; } + + // Give the window default dimensions + inline void SetDefaultSize(const wxSize& size) { m_defaultSize = size; } + +// Event handlers + // Called by layout algorithm to allow window to take a bit out of the + // client rectangle, and size itself if not in wxLAYOUT_QUERY mode. + void OnCalculateLayout(wxCalculateLayoutEvent& event); + + // Called by layout algorithm to retrieve information about the window. + void OnQueryLayoutInfo(wxQueryLayoutInfoEvent& event); + +private: + void Init(); + + wxLayoutAlignment m_alignment; + wxLayoutOrientation m_orientation; + wxSize m_defaultSize; + +private: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxSashLayoutWindow) + DECLARE_EVENT_TABLE() +}; + +#endif // wxUSE_SASH + +class WXDLLIMPEXP_FWD_CORE wxMDIParentFrame; +class WXDLLIMPEXP_FWD_CORE wxFrame; + +// This class implements the layout algorithm +class WXDLLIMPEXP_ADV wxLayoutAlgorithm: public wxObject +{ +public: + wxLayoutAlgorithm() {} + +#if wxUSE_MDI_ARCHITECTURE + // The MDI client window is sized to whatever's left over. + bool LayoutMDIFrame(wxMDIParentFrame* frame, wxRect* rect = (wxRect*) NULL); +#endif // wxUSE_MDI_ARCHITECTURE + + // mainWindow is sized to whatever's left over. This function for backward + // compatibility; use LayoutWindow. + bool LayoutFrame(wxFrame* frame, wxWindow* mainWindow = (wxWindow*) NULL); + + // mainWindow is sized to whatever's left over. + bool LayoutWindow(wxWindow* frame, wxWindow* mainWindow = (wxWindow*) NULL); +}; + +#endif + // _WX_LAYWIN_H_G_ diff --git a/Externals/wxWidgets/include/wx/generic/listctrl.h b/Externals/wxWidgets/include/wx/generic/listctrl.h new file mode 100644 index 0000000000..bb80211d26 --- /dev/null +++ b/Externals/wxWidgets/include/wx/generic/listctrl.h @@ -0,0 +1,281 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/listctrl.h +// Purpose: Generic list control +// Author: Robert Roebling +// Created: 01/02/97 +// RCS-ID: $Id: listctrl.h 46432 2007-06-13 03:46:20Z SC $ +// Copyright: (c) 1998 Robert Roebling and Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GENERIC_LISTCTRL_H_ +#define _WX_GENERIC_LISTCTRL_H_ + +#include "wx/textctrl.h" + +class WXDLLIMPEXP_CORE wxImageList; + +#if wxUSE_DRAG_AND_DROP +class WXDLLEXPORT wxDropTarget; +#endif + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + + +//----------------------------------------------------------------------------- +// internal classes +//----------------------------------------------------------------------------- + +class WXDLLEXPORT wxListHeaderWindow; +class WXDLLEXPORT wxListMainWindow; + +//----------------------------------------------------------------------------- +// wxListCtrl +//----------------------------------------------------------------------------- + +class WXDLLEXPORT wxGenericListCtrl: public wxControl +{ +public: + + wxGenericListCtrl(); + wxGenericListCtrl( wxWindow *parent, + wxWindowID winid = wxID_ANY, + const wxPoint &pos = wxDefaultPosition, + const wxSize &size = wxDefaultSize, + long style = wxLC_ICON, + const wxValidator& validator = wxDefaultValidator, + const wxString &name = wxListCtrlNameStr) + { + Create(parent, winid, pos, size, style, validator, name); + } + virtual ~wxGenericListCtrl(); + + bool Create( wxWindow *parent, + wxWindowID winid = wxID_ANY, + const wxPoint &pos = wxDefaultPosition, + const wxSize &size = wxDefaultSize, + long style = wxLC_ICON, + const wxValidator& validator = wxDefaultValidator, + const wxString &name = wxListCtrlNameStr); + + bool GetColumn( int col, wxListItem& item ) const; + bool SetColumn( int col, wxListItem& item ); + int GetColumnWidth( int col ) const; + bool SetColumnWidth( int col, int width); + int GetCountPerPage() const; // not the same in wxGLC as in Windows, I think + wxRect GetViewRect() const; + + bool GetItem( wxListItem& info ) const; + bool SetItem( wxListItem& info ) ; + long SetItem( long index, int col, const wxString& label, int imageId = -1 ); + int GetItemState( long item, long stateMask ) const; + bool SetItemState( long item, long state, long stateMask); + bool SetItemImage( long item, int image, int selImage = -1 ); + bool SetItemColumnImage( long item, long column, int image ); + wxString GetItemText( long item ) const; + void SetItemText( long item, const wxString& str ); + wxUIntPtr GetItemData( long item ) const; +#if wxABI_VERSION >= 20804 + bool SetItemPtrData(long item, wxUIntPtr data); +#endif // wxABI 2.8.4+ + bool SetItemData(long item, long data); + bool GetItemRect( long item, wxRect& rect, int code = wxLIST_RECT_BOUNDS ) const; + bool GetItemPosition( long item, wxPoint& pos ) const; + bool SetItemPosition( long item, const wxPoint& pos ); // not supported in wxGLC + int GetItemCount() const; + int GetColumnCount() const; + void SetItemSpacing( int spacing, bool isSmall = false ); + wxSize GetItemSpacing() const; + void SetItemTextColour( long item, const wxColour& col); + wxColour GetItemTextColour( long item ) const; + void SetItemBackgroundColour( long item, const wxColour &col); + wxColour GetItemBackgroundColour( long item ) const; + void SetItemFont( long item, const wxFont &f); + wxFont GetItemFont( long item ) const; + int GetSelectedItemCount() const; + wxColour GetTextColour() const; + void SetTextColour(const wxColour& col); + long GetTopItem() const; + + void SetSingleStyle( long style, bool add = true ) ; + void SetWindowStyleFlag( long style ); + void RecreateWindow() {} + long GetNextItem( long item, int geometry = wxLIST_NEXT_ALL, int state = wxLIST_STATE_DONTCARE ) const; + wxImageList *GetImageList( int which ) const; + void SetImageList( wxImageList *imageList, int which ); + void AssignImageList( wxImageList *imageList, int which ); + bool Arrange( int flag = wxLIST_ALIGN_DEFAULT ); // always wxLIST_ALIGN_LEFT in wxGLC + + void ClearAll(); + bool DeleteItem( long item ); + bool DeleteAllItems(); + bool DeleteAllColumns(); + bool DeleteColumn( int col ); + + void SetItemCount(long count); + + wxTextCtrl *EditLabel(long item, + wxClassInfo* textControlClass = CLASSINFO(wxTextCtrl)); + wxTextCtrl* GetEditControl() const; + void Edit( long item ) { EditLabel(item); } + + bool EnsureVisible( long item ); + long FindItem( long start, const wxString& str, bool partial = false ); + long FindItem( long start, wxUIntPtr data ); + long FindItem( long start, const wxPoint& pt, int direction ); // not supported in wxGLC + long HitTest( const wxPoint& point, int& flags, long *pSubItem = NULL ) const; + long InsertItem(wxListItem& info); + long InsertItem( long index, const wxString& label ); + long InsertItem( long index, int imageIndex ); + long InsertItem( long index, const wxString& label, int imageIndex ); + long InsertColumn( long col, wxListItem& info ); + long InsertColumn( long col, const wxString& heading, + int format = wxLIST_FORMAT_LEFT, int width = -1 ); + bool ScrollList( int dx, int dy ); + bool SortItems( wxListCtrlCompare fn, long data ); + bool Update( long item ); + // Must provide overload to avoid hiding it (and warnings about it) + virtual void Update() { wxControl::Update(); } + + // are we in report mode? + bool InReportView() const { return HasFlag(wxLC_REPORT); } + + // are we in virtual report mode? + bool IsVirtual() const { return HasFlag(wxLC_VIRTUAL); } + + // do we have a header window? + bool HasHeader() const + { return InReportView() && !HasFlag(wxLC_NO_HEADER); } + + // refresh items selectively (only useful for virtual list controls) + void RefreshItem(long item); + void RefreshItems(long itemFrom, long itemTo); + +#if WXWIN_COMPATIBILITY_2_6 + // obsolete, don't use + wxDEPRECATED( int GetItemSpacing( bool isSmall ) const ); +#endif // WXWIN_COMPATIBILITY_2_6 + + virtual wxVisualAttributes GetDefaultAttributes() const + { + return GetClassDefaultAttributes(GetWindowVariant()); + } + + static wxVisualAttributes + GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL); + + // implementation only from now on + // ------------------------------- + + void OnInternalIdle( ); + void OnSize( wxSizeEvent &event ); + + // We have to hand down a few functions + virtual void Refresh(bool eraseBackground = true, + const wxRect *rect = NULL); + + virtual void Freeze(); + virtual void Thaw(); + + virtual bool SetBackgroundColour( const wxColour &colour ); + virtual bool SetForegroundColour( const wxColour &colour ); + virtual wxColour GetBackgroundColour() const; + virtual wxColour GetForegroundColour() const; + virtual bool SetFont( const wxFont &font ); + virtual bool SetCursor( const wxCursor &cursor ); + + virtual int GetScrollPos(int orient) const; + virtual void SetScrollPos(int orient, int pos, bool refresh = true); + +#if wxUSE_DRAG_AND_DROP + virtual void SetDropTarget( wxDropTarget *dropTarget ); + virtual wxDropTarget *GetDropTarget() const; +#endif + + virtual bool ShouldInheritColours() const { return false; } + virtual void SetFocus(); + + // implementation + // -------------- + + wxImageList *m_imageListNormal; + wxImageList *m_imageListSmall; + wxImageList *m_imageListState; // what's that ? + bool m_ownsImageListNormal, + m_ownsImageListSmall, + m_ownsImageListState; + wxListHeaderWindow *m_headerWin; + wxListMainWindow *m_mainWin; + wxCoord m_headerHeight; + +protected: + virtual bool DoPopupMenu( wxMenu *menu, int x, int y ); + + // take into account the coordinates difference between the container + // window and the list control window itself here + virtual void DoClientToScreen( int *x, int *y ) const; + virtual void DoScreenToClient( int *x, int *y ) const; + + virtual wxSize DoGetBestSize() const; + + // return the text for the given column of the given item + virtual wxString OnGetItemText(long item, long column) const; + + // return the icon for the given item. In report view, OnGetItemImage will + // only be called for the first column. See OnGetItemColumnImage for + // details. + virtual int OnGetItemImage(long item) const; + + // return the icon for the given item and column. + virtual int OnGetItemColumnImage(long item, long column) const; + + // return the attribute for the item (may return NULL if none) + virtual wxListItemAttr *OnGetItemAttr(long item) const; + + // it calls our OnGetXXX() functions + friend class WXDLLEXPORT wxListMainWindow; + +private: + // create the header window + void CreateHeaderWindow(); + + // calculate and set height of the header + void CalculateAndSetHeaderHeight(); + + // reposition the header and the main window in the report view depending + // on whether it should be shown or not + void ResizeReportView(bool showHeader); + + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS(wxGenericListCtrl) +}; + +#if (!defined(__WXMSW__) || defined(__WXUNIVERSAL__)) && (!defined(__WXMAC__) || defined(__WXUNIVERSAL__)) +/* + * wxListCtrl has to be a real class or we have problems with + * the run-time information. + */ + +class WXDLLEXPORT wxListCtrl: public wxGenericListCtrl +{ + DECLARE_DYNAMIC_CLASS(wxListCtrl) + +public: + wxListCtrl() {} + + wxListCtrl(wxWindow *parent, wxWindowID winid = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxLC_ICON, + const wxValidator &validator = wxDefaultValidator, + const wxString &name = wxListCtrlNameStr) + : wxGenericListCtrl(parent, winid, pos, size, style, validator, name) + { + } + +}; +#endif // !__WXMSW__ || __WXUNIVERSAL__ + +#endif // _WX_GENERIC_LISTCTRL_H_ diff --git a/Externals/wxWidgets/include/wx/generic/logg.h b/Externals/wxWidgets/include/wx/generic/logg.h new file mode 100644 index 0000000000..240b30fbde --- /dev/null +++ b/Externals/wxWidgets/include/wx/generic/logg.h @@ -0,0 +1,129 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/logg.h +// Purpose: Assorted wxLogXXX functions, and wxLog (sink for logs) +// Author: Vadim Zeitlin +// Modified by: +// Created: 29/01/98 +// RCS-ID: $Id: logg.h 41020 2006-09-05 20:47:48Z VZ $ +// Copyright: (c) 1998 Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_LOGG_H_ +#define _WX_LOGG_H_ + +#if wxUSE_GUI + +// ---------------------------------------------------------------------------- +// the following log targets are only compiled in if the we're compiling the +// GUI part (andnot just the base one) of the library, they're implemented in +// src/generic/logg.cpp *and not src/common/log.cpp unlike all the rest) +// ---------------------------------------------------------------------------- + +#if wxUSE_TEXTCTRL + +// log everything to a text window (GUI only of course) +class WXDLLEXPORT wxLogTextCtrl : public wxLog +{ +public: + wxLogTextCtrl(wxTextCtrl *pTextCtrl); + +protected: + // implement sink function + virtual void DoLogString(const wxChar *szString, time_t t); + +private: + // the control we use + wxTextCtrl *m_pTextCtrl; + + DECLARE_NO_COPY_CLASS(wxLogTextCtrl) +}; + +#endif // wxUSE_TEXTCTRL + +// ---------------------------------------------------------------------------- +// GUI log target, the default one for wxWidgets programs +// ---------------------------------------------------------------------------- + +#if wxUSE_LOGGUI + +class WXDLLEXPORT wxLogGui : public wxLog +{ +public: + // ctor + wxLogGui(); + + // show all messages that were logged since the last Flush() + virtual void Flush(); + +protected: + virtual void DoLog(wxLogLevel level, const wxChar *szString, time_t t); + + // empty everything + void Clear(); + + wxArrayString m_aMessages; // the log message texts + wxArrayInt m_aSeverity; // one of wxLOG_XXX values + wxArrayLong m_aTimes; // the time of each message + bool m_bErrors, // do we have any errors? + m_bWarnings, // any warnings? + m_bHasMessages; // any messages at all? + +}; + +#endif // wxUSE_LOGGUI + +// ---------------------------------------------------------------------------- +// (background) log window: this class forwards all log messages to the log +// target which was active when it was instantiated, but also collects them +// to the log window. This window has it's own menu which allows the user to +// close it, clear the log contents or save it to the file. +// ---------------------------------------------------------------------------- + +#if wxUSE_LOGWINDOW + +class WXDLLEXPORT wxLogWindow : public wxLogPassThrough +{ +public: + wxLogWindow(wxWindow *pParent, // the parent frame (can be NULL) + const wxChar *szTitle, // the title of the frame + bool bShow = true, // show window immediately? + bool bPassToOld = true); // pass messages to the old target? + + virtual ~wxLogWindow(); + + // window operations + // show/hide the log window + void Show(bool bShow = true); + // retrieve the pointer to the frame + wxFrame *GetFrame() const; + + // overridables + // called immediately after the log frame creation allowing for + // any extra initializations + virtual void OnFrameCreate(wxFrame *frame); + // called if the user closes the window interactively, will not be + // called if it is destroyed for another reason (such as when program + // exits) - return true from here to allow the frame to close, false + // to prevent this from happening + virtual bool OnFrameClose(wxFrame *frame); + // called right before the log frame is going to be deleted: will + // always be called unlike OnFrameClose() + virtual void OnFrameDelete(wxFrame *frame); + +protected: + virtual void DoLog(wxLogLevel level, const wxChar *szString, time_t t); + virtual void DoLogString(const wxChar *szString, time_t t); + +private: + wxLogFrame *m_pLogFrame; // the log frame + + DECLARE_NO_COPY_CLASS(wxLogWindow) +}; + +#endif // wxUSE_LOGWINDOW + +#endif // wxUSE_GUI + +#endif // _WX_LOGG_H_ + diff --git a/Externals/wxWidgets/include/wx/generic/mask.h b/Externals/wxWidgets/include/wx/generic/mask.h new file mode 100644 index 0000000000..aaf96f952f --- /dev/null +++ b/Externals/wxWidgets/include/wx/generic/mask.h @@ -0,0 +1,54 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/mask.h +// Purpose: generic implementation of wxMask +// Author: Vadim Zeitlin +// Created: 2006-09-28 +// RCS-ID: $Id: mask.h 41495 2006-09-28 23:02:39Z VZ $ +// Copyright: (c) 2006 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GENERIC_MASKG_H_ +#define _WX_GENERIC_MASKG_H_ + +// ---------------------------------------------------------------------------- +// generic wxMask implementation +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxMask : public wxMaskBase +{ +public: + wxMask() { } + wxMask(const wxBitmap& bitmap, const wxColour& colour) + { + InitFromColour(bitmap, colour); + } + +#if wxUSE_PALETTE + wxMask(const wxBitmap& bitmap, int paletteIndex) + { + Create(bitmap, paletteIndex); + } +#endif // wxUSE_PALETTE + + wxMask(const wxBitmap& bitmap) + { + InitFromMonoBitmap(bitmap); + } + + // implementation-only from now on + wxBitmap GetBitmap() const { return m_bitmap; } + +private: + // implement wxMaskBase pure virtuals + virtual void FreeData(); + virtual bool InitFromColour(const wxBitmap& bitmap, const wxColour& colour); + virtual bool InitFromMonoBitmap(const wxBitmap& bitmap); + + wxBitmap m_bitmap; + + DECLARE_DYNAMIC_CLASS(wxMask) +}; + +#endif // _WX_GENERIC_MASKG_H_ + diff --git a/Externals/wxWidgets/include/wx/generic/mdig.h b/Externals/wxWidgets/include/wx/generic/mdig.h new file mode 100644 index 0000000000..77fb1cba80 --- /dev/null +++ b/Externals/wxWidgets/include/wx/generic/mdig.h @@ -0,0 +1,335 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/mdig.h +// Purpose: Generic MDI (Multiple Document Interface) classes +// Author: Hans Van Leemputten +// Modified by: +// Created: 29/07/2002 +// RCS-ID: $Id: mdig.h 41223 2006-09-14 17:36:18Z PC $ +// Copyright: (c) Hans Van Leemputten +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MDIG_H_ +#define _WX_MDIG_H_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/frame.h" +#include "wx/panel.h" +#include "wx/notebook.h" + +extern WXDLLEXPORT_DATA(const wxChar) wxStatusLineNameStr[]; + + +//----------------------------------------------------------------------------- +// classes +//----------------------------------------------------------------------------- + +class WXDLLEXPORT wxGenericMDIParentFrame; +class WXDLLEXPORT wxGenericMDIClientWindow; +class WXDLLEXPORT wxGenericMDIChildFrame; + +//----------------------------------------------------------------------------- +// wxGenericMDIParentFrame +//----------------------------------------------------------------------------- + +class WXDLLEXPORT wxGenericMDIParentFrame: public wxFrame +{ +public: + wxGenericMDIParentFrame(); + wxGenericMDIParentFrame(wxWindow *parent, + wxWindowID winid, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDEFAULT_FRAME_STYLE | wxVSCROLL | wxHSCROLL, + const wxString& name = wxFrameNameStr); + + virtual ~wxGenericMDIParentFrame(); + bool Create( wxWindow *parent, + wxWindowID winid, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDEFAULT_FRAME_STYLE | wxVSCROLL | wxHSCROLL, + const wxString& name = wxFrameNameStr ); + +#if wxUSE_MENUS + wxMenu* GetWindowMenu() const { return m_pWindowMenu; }; + void SetWindowMenu(wxMenu* pMenu); + + virtual void SetMenuBar(wxMenuBar *pMenuBar); +#endif // wxUSE_MENUS + + void SetChildMenuBar(wxGenericMDIChildFrame *pChild); + + virtual bool ProcessEvent(wxEvent& event); + + wxGenericMDIChildFrame *GetActiveChild() const; + inline void SetActiveChild(wxGenericMDIChildFrame* pChildFrame); + + wxGenericMDIClientWindow *GetClientWindow() const; + virtual wxGenericMDIClientWindow *OnCreateClient(); + + virtual void Cascade() { /* Has no effect */ } + virtual void Tile(wxOrientation WXUNUSED(orient) = wxHORIZONTAL) { } + virtual void ArrangeIcons() { /* Has no effect */ } + virtual void ActivateNext(); + virtual void ActivatePrevious(); + +protected: + wxGenericMDIClientWindow *m_pClientWindow; + wxGenericMDIChildFrame *m_pActiveChild; +#if wxUSE_MENUS + wxMenu *m_pWindowMenu; + wxMenuBar *m_pMyMenuBar; +#endif // wxUSE_MENUS + +protected: + void Init(); + +#if wxUSE_MENUS + void RemoveWindowMenu(wxMenuBar *pMenuBar); + void AddWindowMenu(wxMenuBar *pMenuBar); + + void DoHandleMenu(wxCommandEvent &event); +#endif // wxUSE_MENUS + + virtual void DoGetClientSize(int *width, int *height) const; + +private: + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS(wxGenericMDIParentFrame) +}; + +//----------------------------------------------------------------------------- +// wxGenericMDIChildFrame +//----------------------------------------------------------------------------- + +class WXDLLEXPORT wxGenericMDIChildFrame: public wxPanel +{ +public: + wxGenericMDIChildFrame(); + wxGenericMDIChildFrame( wxGenericMDIParentFrame *parent, + wxWindowID winid, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDEFAULT_FRAME_STYLE, + const wxString& name = wxFrameNameStr ); + + virtual ~wxGenericMDIChildFrame(); + bool Create( wxGenericMDIParentFrame *parent, + wxWindowID winid, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDEFAULT_FRAME_STYLE, + const wxString& name = wxFrameNameStr ); + +#if wxUSE_MENUS + virtual void SetMenuBar( wxMenuBar *menu_bar ); + virtual wxMenuBar *GetMenuBar() const; +#endif // wxUSE_MENUS + + virtual void SetTitle(const wxString& title); + virtual wxString GetTitle() const; + + virtual void Activate(); + +#if wxUSE_STATUSBAR + // no status bars + virtual wxStatusBar* CreateStatusBar( int WXUNUSED(number) = 1, + long WXUNUSED(style) = 1, + wxWindowID WXUNUSED(winid) = 1, + const wxString& WXUNUSED(name) = wxEmptyString) + { return (wxStatusBar*)NULL; } + + virtual wxStatusBar *GetStatusBar() const { return (wxStatusBar*)NULL; } + virtual void SetStatusText( const wxString &WXUNUSED(text), int WXUNUSED(number)=0 ) {} + virtual void SetStatusWidths( int WXUNUSED(n), const int WXUNUSED(widths_field)[] ) {} +#endif + + // no size hints + virtual void DoSetSizeHints( int WXUNUSED(minW), + int WXUNUSED(minH), + int WXUNUSED(maxW) = wxDefaultCoord, + int WXUNUSED(maxH) = wxDefaultCoord, + int WXUNUSED(incW) = wxDefaultCoord, + int WXUNUSED(incH) = wxDefaultCoord) {} + +#if wxUSE_TOOLBAR + // no toolbar bars + virtual wxToolBar* CreateToolBar( long WXUNUSED(style), + wxWindowID WXUNUSED(winid), + const wxString& WXUNUSED(name) ) + { return (wxToolBar*)NULL; } + virtual wxToolBar *GetToolBar() const { return (wxToolBar*)NULL; } +#endif + + // no icon + void SetIcon( const wxIcon& WXUNUSED(icon) ) { } + void SetIcons( const wxIconBundle& WXUNUSED(icons) ) { } + + // no maximize etc + virtual void Maximize( bool WXUNUSED(maximize) = true) { /* Has no effect */ } + virtual void Restore() { /* Has no effect */ } + virtual void Iconize(bool WXUNUSED(iconize) = true) { /* Has no effect */ } + virtual bool IsMaximized() const { return true; } + virtual bool IsIconized() const { return false; } + virtual bool ShowFullScreen(bool WXUNUSED(show), long WXUNUSED(style)) { return false; } + virtual bool IsFullScreen() const { return false; } + + virtual bool IsTopLevel() const { return false; } + + void OnMenuHighlight(wxMenuEvent& event); + void OnActivate(wxActivateEvent& event); + + // The next 2 are copied from top level... + void OnCloseWindow(wxCloseEvent& event); + void OnSize(wxSizeEvent& event); + + void SetMDIParentFrame(wxGenericMDIParentFrame* parentFrame); + wxGenericMDIParentFrame* GetMDIParentFrame() const; + +protected: + wxGenericMDIParentFrame *m_pMDIParentFrame; + wxRect m_MDIRect; + wxString m_Title; + +#if wxUSE_MENUS + wxMenuBar *m_pMenuBar; +#endif // wxUSE_MENUS + +protected: + void Init(); + + virtual void DoMoveWindow(int x, int y, int width, int height); + + // This function needs to be called when a size change is confirmed, + // we needed this function to prevent any body from the outside + // changing the panel... it messes the UI layout when we would allow it. + void ApplyMDIChildFrameRect(); + +private: + DECLARE_DYNAMIC_CLASS(wxGenericMDIChildFrame) + DECLARE_EVENT_TABLE() + + friend class wxGenericMDIClientWindow; +}; + +//----------------------------------------------------------------------------- +// wxGenericMDIClientWindow +//----------------------------------------------------------------------------- + +class WXDLLEXPORT wxGenericMDIClientWindow: public wxNotebook +{ +public: + wxGenericMDIClientWindow(); + wxGenericMDIClientWindow( wxGenericMDIParentFrame *parent, long style = 0 ); + virtual ~wxGenericMDIClientWindow(); + virtual bool CreateClient( wxGenericMDIParentFrame *parent, long style = wxVSCROLL | wxHSCROLL ); + + virtual int SetSelection(size_t nPage); + +protected: + void PageChanged(int OldSelection, int newSelection); + + void OnPageChanged(wxNotebookEvent& event); + void OnSize(wxSizeEvent& event); + +private: + DECLARE_DYNAMIC_CLASS(wxGenericMDIClientWindow) + DECLARE_EVENT_TABLE() +}; + + +/* + * Define normal wxMDI classes based on wxGenericMDI + */ + +#ifndef wxUSE_GENERIC_MDI_AS_NATIVE +#if defined(__WXUNIVERSAL__) || defined(__WXPM__) || defined(__WXCOCOA__) +#define wxUSE_GENERIC_MDI_AS_NATIVE 1 +#else +#define wxUSE_GENERIC_MDI_AS_NATIVE 0 +#endif +#endif // wxUSE_GENERIC_MDI_AS_NATIVE + +#if wxUSE_GENERIC_MDI_AS_NATIVE + +class wxMDIChildFrame ; + +//----------------------------------------------------------------------------- +// wxMDIParentFrame +//----------------------------------------------------------------------------- + +class WXDLLEXPORT wxMDIParentFrame: public wxGenericMDIParentFrame +{ +public: + wxMDIParentFrame() {} + wxMDIParentFrame(wxWindow *parent, + wxWindowID winid, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDEFAULT_FRAME_STYLE | wxVSCROLL | wxHSCROLL, + const wxString& name = wxFrameNameStr) + :wxGenericMDIParentFrame(parent, winid, title, pos, size, style, name) + { + } + + wxMDIChildFrame * GetActiveChild() const ; + + +private: + DECLARE_DYNAMIC_CLASS(wxMDIParentFrame) +}; + +//----------------------------------------------------------------------------- +// wxMDIChildFrame +//----------------------------------------------------------------------------- + +class WXDLLEXPORT wxMDIChildFrame: public wxGenericMDIChildFrame +{ +public: + wxMDIChildFrame() {} + + wxMDIChildFrame( wxGenericMDIParentFrame *parent, + wxWindowID winid, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDEFAULT_FRAME_STYLE, + const wxString& name = wxFrameNameStr ) + :wxGenericMDIChildFrame(parent, winid, title, pos, size, style, name) + { + } +private: + DECLARE_DYNAMIC_CLASS(wxMDIChildFrame) +}; + +//----------------------------------------------------------------------------- +// wxMDIClientWindow +//----------------------------------------------------------------------------- + +class WXDLLEXPORT wxMDIClientWindow: public wxGenericMDIClientWindow +{ +public: + wxMDIClientWindow() {} + + wxMDIClientWindow( wxGenericMDIParentFrame *parent, long style = 0 ) + :wxGenericMDIClientWindow(parent, style) + { + } + +private: + DECLARE_DYNAMIC_CLASS(wxMDIClientWindow) +}; + +#endif + +#endif + // _WX_MDIG_H_ diff --git a/Externals/wxWidgets/include/wx/generic/msgdlgg.h b/Externals/wxWidgets/include/wx/generic/msgdlgg.h new file mode 100644 index 0000000000..4776b106aa --- /dev/null +++ b/Externals/wxWidgets/include/wx/generic/msgdlgg.h @@ -0,0 +1,44 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/msgdlgg.h +// Purpose: Generic wxMessageDialog +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: msgdlgg.h 49765 2007-11-09 18:32:38Z DE $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef __MSGDLGH_G__ +#define __MSGDLGH_G__ + +#include "wx/defs.h" +#include "wx/dialog.h" + +// type is an 'or' (|) of wxOK, wxCANCEL, wxYES_NO +// Returns wxYES/NO/OK/CANCEL + +extern WXDLLEXPORT_DATA(const wxChar) wxMessageBoxCaptionStr[]; + +class WXDLLEXPORT wxGenericMessageDialog: public wxDialog, public wxMessageDialogBase +{ +DECLARE_DYNAMIC_CLASS(wxGenericMessageDialog) + +public: + wxGenericMessageDialog(wxWindow *parent, const wxString& message, + const wxString& caption = wxMessageBoxCaptionStr, + long style = wxOK|wxCENTRE, const wxPoint& pos = wxDefaultPosition); + + void OnYes(wxCommandEvent& event); + void OnNo(wxCommandEvent& event); + void OnCancel(wxCommandEvent& event); + +private: + DECLARE_EVENT_TABLE() +}; + +#if (!defined( __WXMSW__ ) && !defined( __WXMAC__) && !defined(__WXPM__) && !defined(__WXCOCOA__)) || defined(__WXUNIVERSAL__) +#define wxMessageDialog wxGenericMessageDialog +#endif + +#endif // __MSGDLGH_G__ diff --git a/Externals/wxWidgets/include/wx/generic/notebook.h b/Externals/wxWidgets/include/wx/generic/notebook.h new file mode 100644 index 0000000000..5b96a204bb --- /dev/null +++ b/Externals/wxWidgets/include/wx/generic/notebook.h @@ -0,0 +1,160 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: notebook.h +// Purpose: wxNotebook class (a.k.a. property sheet, tabbed dialog) +// Author: Julian Smart +// Modified by: +// RCS-ID: $Id: notebook.h 41738 2006-10-08 17:37:23Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_NOTEBOOK_H_ +#define _WX_NOTEBOOK_H_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- +#include "wx/event.h" +#include "wx/control.h" + +// ---------------------------------------------------------------------------- +// types +// ---------------------------------------------------------------------------- + +// fwd declarations +class WXDLLEXPORT wxImageList; +class WXDLLEXPORT wxWindow; +class WXDLLEXPORT wxTabView; + +// ---------------------------------------------------------------------------- +// wxNotebook +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxNotebook : public wxNotebookBase +{ +public: + // ctors + // ----- + // default for dynamic class + wxNotebook(); + // the same arguments as for wxControl (@@@ any special styles?) + wxNotebook(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxNotebookNameStr); + // Create() function + bool Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxNotebookNameStr); + // dtor + virtual ~wxNotebook(); + + // accessors + // --------- + // Find the position of the wxNotebookPage, -1 if not found. + int FindPagePosition(wxNotebookPage* page) const; + + // set the currently selected page, return the index of the previously + // selected one (or -1 on error) + // NB: this function will _not_ generate wxEVT_NOTEBOOK_PAGE_xxx events + int SetSelection(size_t nPage); + // cycle thru the tabs + // void AdvanceSelection(bool bForward = true); + // get the currently selected page + int GetSelection() const { return m_nSelection; } + + // changes selected page without sending events + int ChangeSelection(size_t nPage); + + // set/get the title of a page + bool SetPageText(size_t nPage, const wxString& strText); + wxString GetPageText(size_t nPage) const; + + // get the number of rows for a control with wxNB_MULTILINE style (not all + // versions support it - they will always return 1 then) + virtual int GetRowCount() const ; + + // sets/returns item's image index in the current image list + int GetPageImage(size_t nPage) const; + bool SetPageImage(size_t nPage, int nImage); + + // control the appearance of the notebook pages + // set the size (the same for all pages) + void SetPageSize(const wxSize& size); + // set the padding between tabs (in pixels) + void SetPadding(const wxSize& padding); + + // Sets the size of the tabs (assumes all tabs are the same size) + void SetTabSize(const wxSize& sz); + + // operations + // ---------- + // remove one page from the notebook, and delete the page. + bool DeletePage(size_t nPage); + bool DeletePage(wxNotebookPage* page); + // remove one page from the notebook, without deleting the page. + bool RemovePage(size_t nPage); + bool RemovePage(wxNotebookPage* page); + virtual wxWindow* DoRemovePage(size_t nPage); + + // remove all pages + bool DeleteAllPages(); + // the same as AddPage(), but adds it at the specified position + bool InsertPage(size_t nPage, + wxNotebookPage *pPage, + const wxString& strText, + bool bSelect = false, + int imageId = -1); + + // callbacks + // --------- + void OnSize(wxSizeEvent& event); + void OnInternalIdle(); + void OnSelChange(wxNotebookEvent& event); + void OnSetFocus(wxFocusEvent& event); + void OnNavigationKey(wxNavigationKeyEvent& event); + + // base class virtuals + // ------------------- + virtual void Command(wxCommandEvent& event); + virtual void SetConstraintSizes(bool recurse = true); + virtual bool DoPhase(int nPhase); + + virtual wxSize CalcSizeFromPage(const wxSize& sizePage) const; + + // Implementation + + // wxNotebook on Motif uses a generic wxTabView to implement itself. + wxTabView *GetTabView() const { return m_tabView; } + void SetTabView(wxTabView *v) { m_tabView = v; } + + void OnMouseEvent(wxMouseEvent& event); + void OnPaint(wxPaintEvent& event); + + virtual wxRect GetAvailableClientSize(); + + // Implementation: calculate the layout of the view rect + // and resize the children if required + bool RefreshLayout(bool force = true); + +protected: + // common part of all ctors + void Init(); + + // helper functions + void ChangePage(int nOldSel, int nSel); // change pages + + int m_nSelection; // the current selection (-1 if none) + + wxTabView* m_tabView; + + DECLARE_DYNAMIC_CLASS(wxNotebook) + DECLARE_EVENT_TABLE() +}; + +#endif // _WX_NOTEBOOK_H_ diff --git a/Externals/wxWidgets/include/wx/generic/numdlgg.h b/Externals/wxWidgets/include/wx/generic/numdlgg.h new file mode 100644 index 0000000000..cbebd0918d --- /dev/null +++ b/Externals/wxWidgets/include/wx/generic/numdlgg.h @@ -0,0 +1,79 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/numdlgg.h +// Purpose: wxNumberEntryDialog class +// Author: John Labenski +// Modified by: +// Created: 07.02.04 (extracted from textdlgg.cpp) +// RCS-ID: $Id: numdlgg.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef __NUMDLGH_G__ +#define __NUMDLGH_G__ + +#include "wx/defs.h" + +#if wxUSE_NUMBERDLG + +#include "wx/dialog.h" + +#if wxUSE_SPINCTRL + class WXDLLIMPEXP_FWD_CORE wxSpinCtrl; +#else + class WXDLLIMPEXP_FWD_CORE wxTextCtrl; +#endif // wxUSE_SPINCTRL + +// ---------------------------------------------------------------------------- +// wxNumberEntryDialog: a dialog with spin control, [ok] and [cancel] buttons +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxNumberEntryDialog : public wxDialog +{ +public: + wxNumberEntryDialog(wxWindow *parent, + const wxString& message, + const wxString& prompt, + const wxString& caption, + long value, long min, long max, + const wxPoint& pos = wxDefaultPosition); + + long GetValue() const { return m_value; } + + // implementation only + void OnOK(wxCommandEvent& event); + void OnCancel(wxCommandEvent& event); + +protected: + +#if wxUSE_SPINCTRL + wxSpinCtrl *m_spinctrl; +#else + wxTextCtrl *m_spinctrl; +#endif // wxUSE_SPINCTRL + + long m_value, m_min, m_max; + +private: + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS(wxNumberEntryDialog) + DECLARE_NO_COPY_CLASS(wxNumberEntryDialog) +}; + +// ---------------------------------------------------------------------------- +// function to get a number from user +// ---------------------------------------------------------------------------- + +long WXDLLEXPORT +wxGetNumberFromUser(const wxString& message, + const wxString& prompt, + const wxString& caption, + long value = 0, + long min = 0, + long max = 100, + wxWindow *parent = (wxWindow *)NULL, + const wxPoint& pos = wxDefaultPosition); + +#endif // wxUSE_NUMBERDLG + +#endif // __NUMDLGH_G__ diff --git a/Externals/wxWidgets/include/wx/generic/paletteg.h b/Externals/wxWidgets/include/wx/generic/paletteg.h new file mode 100644 index 0000000000..6dee36f75f --- /dev/null +++ b/Externals/wxWidgets/include/wx/generic/paletteg.h @@ -0,0 +1,49 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/paletteg.h +// Purpose: +// Author: Robert Roebling +// Created: 01/02/97 +// RCS-ID: $Id: paletteg.h 42752 2006-10-30 19:26:48Z VZ $ +// Copyright: (c) 1998 Robert Roebling and Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + + +#ifndef __WX_PALETTEG_H__ +#define __WX_PALETTEG_H__ + +#include "wx/defs.h" +#include "wx/object.h" +#include "wx/gdiobj.h" +#include "wx/gdicmn.h" + +//----------------------------------------------------------------------------- +// classes +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxPalette; + +//----------------------------------------------------------------------------- +// wxPalette +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxPalette: public wxPaletteBase +{ +public: + wxPalette(); + wxPalette( int n, const unsigned char *red, const unsigned char *green, const unsigned char *blue ); + virtual ~wxPalette(); + virtual bool Ok() const { return IsOk(); } + virtual bool IsOk() const; + + bool Create( int n, const unsigned char *red, const unsigned char *green, const unsigned char *blue); + int GetPixel( unsigned char red, unsigned char green, unsigned char blue ) const; + bool GetRGB( int pixel, unsigned char *red, unsigned char *green, unsigned char *blue ) const; + + virtual int GetColoursCount() const; + +private: + DECLARE_DYNAMIC_CLASS(wxPalette) +}; + +#endif // __WX_PALETTEG_H__ diff --git a/Externals/wxWidgets/include/wx/generic/panelg.h b/Externals/wxWidgets/include/wx/generic/panelg.h new file mode 100644 index 0000000000..264cfc61f1 --- /dev/null +++ b/Externals/wxWidgets/include/wx/generic/panelg.h @@ -0,0 +1,95 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/panelg.h +// Purpose: wxPanel: a container for child controls +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: panelg.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GENERIC_PANEL_H_ +#define _WX_GENERIC_PANEL_H_ + +// ---------------------------------------------------------------------------- +// headers and forward declarations +// ---------------------------------------------------------------------------- + +#include "wx/window.h" +#include "wx/containr.h" + +class WXDLLIMPEXP_FWD_CORE wxControlContainer; + +extern WXDLLEXPORT_DATA(const wxChar) wxPanelNameStr[]; + +// ---------------------------------------------------------------------------- +// wxPanel contains other controls and implements TAB traversal between them +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxPanel : public wxWindow +{ +public: + wxPanel() { Init(); } + + // Old-style constructor (no default values for coordinates to avoid + // ambiguity with the new one) + wxPanel(wxWindow *parent, + int x, int y, int width, int height, + long style = wxTAB_TRAVERSAL | wxNO_BORDER, + const wxString& name = wxPanelNameStr) + { + Init(); + + Create(parent, wxID_ANY, wxPoint(x, y), wxSize(width, height), style, name); + } + + // Constructor + wxPanel(wxWindow *parent, + wxWindowID winid = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxTAB_TRAVERSAL | wxNO_BORDER, + const wxString& name = wxPanelNameStr) + { + Init(); + + Create(parent, winid, pos, size, style, name); + } + + // Pseudo ctor + bool Create(wxWindow *parent, + wxWindowID winid = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxTAB_TRAVERSAL | wxNO_BORDER, + const wxString& name = wxPanelNameStr); + + virtual ~wxPanel(); + + // implementation from now on + // -------------------------- + + // calls layout for layout constraints and sizers + void OnSize(wxSizeEvent& event); + + virtual void InitDialog(); + +#ifdef __WXUNIVERSAL__ + virtual bool IsCanvasWindow() const { return true; } +#endif + + + WX_DECLARE_CONTROL_CONTAINER(); + +protected: + // common part of all ctors + void Init(); + +private: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxPanel) + DECLARE_EVENT_TABLE() +}; + +#endif + // _WX_GENERIC_PANEL_H_ diff --git a/Externals/wxWidgets/include/wx/generic/printps.h b/Externals/wxWidgets/include/wx/generic/printps.h new file mode 100644 index 0000000000..49cdda526e --- /dev/null +++ b/Externals/wxWidgets/include/wx/generic/printps.h @@ -0,0 +1,68 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: printps.h +// Purpose: wxPostScriptPrinter, wxPostScriptPrintPreview +// wxGenericPageSetupDialog +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: printps.h 35650 2005-09-23 12:56:45Z MR $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef __PRINTPSH__ +#define __PRINTPSH__ + +#include "wx/prntbase.h" + +#if wxUSE_PRINTING_ARCHITECTURE && wxUSE_POSTSCRIPT + +// ---------------------------------------------------------------------------- +// Represents the printer: manages printing a wxPrintout object +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxPostScriptPrinter : public wxPrinterBase +{ +public: + wxPostScriptPrinter(wxPrintDialogData *data = (wxPrintDialogData *) NULL); + virtual ~wxPostScriptPrinter(); + + virtual bool Print(wxWindow *parent, wxPrintout *printout, bool prompt = true); + virtual wxDC* PrintDialog(wxWindow *parent); + virtual bool Setup(wxWindow *parent); + +private: + DECLARE_DYNAMIC_CLASS(wxPostScriptPrinter) +}; + +// ---------------------------------------------------------------------------- +// wxPrintPreview: programmer creates an object of this class to preview a +// wxPrintout. +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxPostScriptPrintPreview : public wxPrintPreviewBase +{ +public: + wxPostScriptPrintPreview(wxPrintout *printout, + wxPrintout *printoutForPrinting = (wxPrintout *) NULL, + wxPrintDialogData *data = (wxPrintDialogData *) NULL); + wxPostScriptPrintPreview(wxPrintout *printout, + wxPrintout *printoutForPrinting, + wxPrintData *data); + + virtual ~wxPostScriptPrintPreview(); + + virtual bool Print(bool interactive); + virtual void DetermineScaling(); + +private: + void Init(wxPrintout *printout, wxPrintout *printoutForPrinting); + +private: + DECLARE_CLASS(wxPostScriptPrintPreview) +}; + +#endif + +#endif +// __PRINTPSH__ diff --git a/Externals/wxWidgets/include/wx/generic/prntdlgg.h b/Externals/wxWidgets/include/wx/generic/prntdlgg.h new file mode 100644 index 0000000000..ef57d47cc4 --- /dev/null +++ b/Externals/wxWidgets/include/wx/generic/prntdlgg.h @@ -0,0 +1,256 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: prntdlgg.h +// Purpose: wxGenericPrintDialog, wxGenericPrintSetupDialog, +// wxGenericPageSetupDialog +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: prntdlgg.h 49804 2007-11-10 01:09:42Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef __PRINTDLGH_G_ +#define __PRINTDLGH_G_ + +#include "wx/defs.h" + +#if wxUSE_PRINTING_ARCHITECTURE + +#include "wx/dialog.h" +#include "wx/cmndata.h" +#include "wx/prntbase.h" +#include "wx/printdlg.h" +#include "wx/listctrl.h" + +#if wxUSE_POSTSCRIPT + #include "wx/dcps.h" +#endif + +class WXDLLIMPEXP_FWD_CORE wxTextCtrl; +class WXDLLIMPEXP_FWD_CORE wxButton; +class WXDLLIMPEXP_FWD_CORE wxCheckBox; +class WXDLLIMPEXP_FWD_CORE wxComboBox; +class WXDLLIMPEXP_FWD_CORE wxStaticText; +class WXDLLIMPEXP_FWD_CORE wxRadioBox; +class WXDLLIMPEXP_FWD_CORE wxPageSetupData; + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// This is not clear why all these enums start with 10 or 30 but do not change it +// without good reason to avoid some subtle backwards compatibility breakage + +enum +{ + wxPRINTID_STATIC = 10, + wxPRINTID_RANGE, + wxPRINTID_FROM, + wxPRINTID_TO, + wxPRINTID_COPIES, + wxPRINTID_PRINTTOFILE, + wxPRINTID_SETUP +}; + +enum +{ + wxPRINTID_LEFTMARGIN = 30, + wxPRINTID_RIGHTMARGIN, + wxPRINTID_TOPMARGIN, + wxPRINTID_BOTTOMMARGIN +}; + +enum +{ + wxPRINTID_PRINTCOLOUR = 10, + wxPRINTID_ORIENTATION, + wxPRINTID_COMMAND, + wxPRINTID_OPTIONS, + wxPRINTID_PAPERSIZE, + wxPRINTID_PRINTER +}; + +#if wxUSE_POSTSCRIPT + +//---------------------------------------------------------------------------- +// wxPostScriptNativeData +//---------------------------------------------------------------------------- + +class WXDLLEXPORT wxPostScriptPrintNativeData: public wxPrintNativeDataBase +{ +public: + wxPostScriptPrintNativeData(); + virtual ~wxPostScriptPrintNativeData(); + + virtual bool TransferTo( wxPrintData &data ); + virtual bool TransferFrom( const wxPrintData &data ); + + virtual bool Ok() const { return IsOk(); } + virtual bool IsOk() const { return true; } + + const wxString& GetPrinterCommand() const { return m_printerCommand; } + const wxString& GetPrinterOptions() const { return m_printerOptions; } + const wxString& GetPreviewCommand() const { return m_previewCommand; } + const wxString& GetFontMetricPath() const { return m_afmPath; } + double GetPrinterScaleX() const { return m_printerScaleX; } + double GetPrinterScaleY() const { return m_printerScaleY; } + long GetPrinterTranslateX() const { return m_printerTranslateX; } + long GetPrinterTranslateY() const { return m_printerTranslateY; } + + void SetPrinterCommand(const wxString& command) { m_printerCommand = command; } + void SetPrinterOptions(const wxString& options) { m_printerOptions = options; } + void SetPreviewCommand(const wxString& command) { m_previewCommand = command; } + void SetFontMetricPath(const wxString& path) { m_afmPath = path; } + void SetPrinterScaleX(double x) { m_printerScaleX = x; } + void SetPrinterScaleY(double y) { m_printerScaleY = y; } + void SetPrinterScaling(double x, double y) { m_printerScaleX = x; m_printerScaleY = y; } + void SetPrinterTranslateX(long x) { m_printerTranslateX = x; } + void SetPrinterTranslateY(long y) { m_printerTranslateY = y; } + void SetPrinterTranslation(long x, long y) { m_printerTranslateX = x; m_printerTranslateY = y; } + +#if wxUSE_STREAMS + wxOutputStream *GetOutputStream() { return m_outputStream; } + void SetOutputStream( wxOutputStream *output ) { m_outputStream = output; } +#endif + +private: + wxString m_printerCommand; + wxString m_previewCommand; + wxString m_printerOptions; + wxString m_afmPath; + double m_printerScaleX; + double m_printerScaleY; + long m_printerTranslateX; + long m_printerTranslateY; +#if wxUSE_STREAMS + wxOutputStream *m_outputStream; +#endif + +private: + DECLARE_DYNAMIC_CLASS(wxPostScriptPrintNativeData) +}; + +// ---------------------------------------------------------------------------- +// Simulated Print and Print Setup dialogs for non-Windows platforms (and +// Windows using PostScript print/preview) +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxGenericPrintDialog : public wxPrintDialogBase +{ +public: + wxGenericPrintDialog(wxWindow *parent, + wxPrintDialogData* data = (wxPrintDialogData*)NULL); + wxGenericPrintDialog(wxWindow *parent, wxPrintData* data); + + virtual ~wxGenericPrintDialog(); + + void OnSetup(wxCommandEvent& event); + void OnRange(wxCommandEvent& event); + void OnOK(wxCommandEvent& event); + + virtual bool TransferDataFromWindow(); + virtual bool TransferDataToWindow(); + + virtual int ShowModal(); + + wxPrintData& GetPrintData() + { return m_printDialogData.GetPrintData(); } + + wxPrintDialogData& GetPrintDialogData() { return m_printDialogData; } + wxDC *GetPrintDC(); + +public: +// wxStaticText* m_printerMessage; + wxButton* m_setupButton; +// wxButton* m_helpButton; + wxRadioBox* m_rangeRadioBox; + wxTextCtrl* m_fromText; + wxTextCtrl* m_toText; + wxTextCtrl* m_noCopiesText; + wxCheckBox* m_printToFileCheckBox; +// wxCheckBox* m_collateCopiesCheckBox; + + wxPrintDialogData m_printDialogData; + +protected: + void Init(wxWindow *parent); + +private: + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS(wxGenericPrintDialog) +}; + +class WXDLLEXPORT wxGenericPrintSetupDialog : public wxDialog +{ +public: + // There are no configuration options for the dialog, so we + // just pass the wxPrintData object (no wxPrintSetupDialogData class needed) + wxGenericPrintSetupDialog(wxWindow *parent, wxPrintData* data); + virtual ~wxGenericPrintSetupDialog(); + + void Init(wxPrintData* data); + + void OnPrinter(wxListEvent& event); + + virtual bool TransferDataFromWindow(); + virtual bool TransferDataToWindow(); + + virtual wxComboBox *CreatePaperTypeChoice(); + +public: + wxListCtrl* m_printerListCtrl; + wxRadioBox* m_orientationRadioBox; + wxTextCtrl* m_printerCommandText; + wxTextCtrl* m_printerOptionsText; + wxCheckBox* m_colourCheckBox; + wxComboBox* m_paperTypeChoice; + + wxPrintData m_printData; + wxPrintData& GetPrintData() { return m_printData; } + + // After pressing OK, write data here. + wxPrintData* m_targetData; + +private: + DECLARE_EVENT_TABLE() + DECLARE_CLASS(wxGenericPrintSetupDialog) +}; +#endif + // wxUSE_POSTSCRIPT + +class WXDLLEXPORT wxGenericPageSetupDialog : public wxPageSetupDialogBase +{ +public: + wxGenericPageSetupDialog(wxWindow *parent = NULL, + wxPageSetupDialogData* data = NULL); + virtual ~wxGenericPageSetupDialog(); + + virtual bool TransferDataFromWindow(); + virtual bool TransferDataToWindow(); + + virtual wxPageSetupDialogData& GetPageSetupDialogData(); + + void OnPrinter(wxCommandEvent& event); + wxComboBox *CreatePaperTypeChoice(int* x, int* y); + +public: + wxButton* m_printerButton; + wxRadioBox* m_orientationRadioBox; + wxTextCtrl* m_marginLeftText; + wxTextCtrl* m_marginTopText; + wxTextCtrl* m_marginRightText; + wxTextCtrl* m_marginBottomText; + wxComboBox* m_paperTypeChoice; + + wxPageSetupDialogData m_pageData; + +private: + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS_NO_COPY(wxGenericPageSetupDialog) +}; + +#endif + +#endif +// __PRINTDLGH_G_ diff --git a/Externals/wxWidgets/include/wx/generic/progdlgg.h b/Externals/wxWidgets/include/wx/generic/progdlgg.h new file mode 100644 index 0000000000..c5bee103af --- /dev/null +++ b/Externals/wxWidgets/include/wx/generic/progdlgg.h @@ -0,0 +1,172 @@ +//////////////////////////////////////////////////// +// Name: progdlgg.h +// Purpose: wxProgressDialog class +// Author: Karsten Ballüder +// Modified by: +// Created: 09.05.1999 +// RCS-ID: $Id: progdlgg.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) Karsten Ballüder +// Licence: wxWindows licence +//////////////////////////////////////////////////// + +#ifndef __PROGDLGH_G__ +#define __PROGDLGH_G__ + +#include "wx/defs.h" +#include "wx/progdlg.h" + +#if wxUSE_PROGRESSDLG + +#include "wx/dialog.h" + +class WXDLLIMPEXP_FWD_CORE wxButton; +class WXDLLIMPEXP_FWD_CORE wxGauge; +class WXDLLIMPEXP_FWD_CORE wxStaticText; + +/* Progress dialog which shows a moving progress bar. + Taken from the Mahogany project.*/ + +class WXDLLEXPORT wxProgressDialog : public wxDialog +{ +DECLARE_DYNAMIC_CLASS(wxProgressDialog) +public: + /* Creates and displays dialog, disables event handling for other + frames or parent frame to avoid recursion problems. + @param title title for window + @param message message to display in window + @param maximum value for status bar, if <= 0, no bar is shown + @param parent window or NULL + @param style is the bit mask of wxPD_XXX constants from wx/defs.h + */ + wxProgressDialog(const wxString &title, wxString const &message, + int maximum = 100, + wxWindow *parent = NULL, + int style = wxPD_APP_MODAL | wxPD_AUTO_HIDE); + /* Destructor. + Re-enables event handling for other windows. + */ + virtual ~wxProgressDialog(); + + /* Update the status bar to the new value. + @param value new value + @param newmsg if used, new message to display + @returns true if ABORT button has not been pressed + */ + virtual bool Update(int value, const wxString& newmsg = wxEmptyString, bool *skip = NULL); + + /* Switches the dialog to use a gauge in indeterminate mode and calls + wxGauge::Pulse() to show to the user a bit of progress */ + virtual bool Pulse(const wxString& newmsg = wxEmptyString, bool *skip = NULL); + + // Must provide overload to avoid hiding it (and warnings about it) + virtual void Update() { wxDialog::Update(); } + + /* Can be called to continue after the cancel button has been pressed, but + the program decided to continue the operation (e.g., user didn't + confirm it) + */ + void Resume(); + + virtual bool Show( bool show = true ); + +protected: + // callback for optional abort button + void OnCancel(wxCommandEvent& event); + + // callback for optional skip button + void OnSkip(wxCommandEvent& event); + + // callback to disable "hard" window closing + void OnClose(wxCloseEvent& event); + + // must be called to reenable the other windows temporarily disabled while + // the dialog was shown + void ReenableOtherWindows(); + +private: + // create the label with given text and another one to show the time nearby + // as the next windows in the sizer, returns the created control + wxStaticText *CreateLabel(const wxString& text, wxSizer *sizer); + + // updates the label message + void UpdateMessage(const wxString &newmsg); + + // common part of Update() and Pulse(), returns true if not cancelled + bool DoAfterUpdate(bool *skip); + + // shortcuts for enabling buttons + void EnableClose(); + void EnableSkip(bool enable=true); + void EnableAbort(bool enable=true); + inline void DisableSkip() { EnableSkip(false); } + inline void DisableAbort() { EnableAbort(false); } + + // the status bar + wxGauge *m_gauge; + // the message displayed + wxStaticText *m_msg; + // displayed elapsed, estimated, remaining time + class wxStaticText *m_elapsed, + *m_estimated, + *m_remaining; + // time when the dialog was created + unsigned long m_timeStart; + // time when the dialog was closed or cancelled + unsigned long m_timeStop; + // time between the moment the dialog was closed/cancelled and resume + unsigned long m_break; + + // parent top level window (may be NULL) + wxWindow *m_parentTop; + + // continue processing or not (return value for Update()) + enum + { + Uncancelable = -1, // dialog can't be canceled + Canceled, // can be cancelled and, in fact, was + Continue, // can be cancelled but wasn't + Finished // finished, waiting to be removed from screen + } m_state; + + // skip some portion + bool m_skip; + +#if !defined(__SMARTPHONE__) + // the abort and skip buttons (or NULL if none) + wxButton *m_btnAbort; + wxButton *m_btnSkip; +#endif + + // the maximum value + int m_maximum; + + // saves the time when elapsed time was updated so there is only one + // update per second + unsigned long m_last_timeupdate; + // tells how often a change of the estimated time has to be confirmed + // before it is actually displayed - this reduces the frequence of updates + // of estimated and remaining time + const int m_delay; + // counts the confirmations + int m_ctdelay; + unsigned long m_display_estimated; + + bool m_hasAbortButton, + m_hasSkipButton; + +#if defined(__WXMSW__ ) || defined(__WXPM__) + // the factor we use to always keep the value in 16 bit range as the native + // control only supports ranges from 0 to 65,535 + size_t m_factor; +#endif // __WXMSW__ + + // for wxPD_APP_MODAL case + class WXDLLIMPEXP_FWD_CORE wxWindowDisabler *m_winDisabler; + + DECLARE_EVENT_TABLE() + DECLARE_NO_COPY_CLASS(wxProgressDialog) +}; + +#endif // wxUSE_PROGRESSDLG + +#endif // __PROGDLGH_G__ diff --git a/Externals/wxWidgets/include/wx/generic/propdlg.h b/Externals/wxWidgets/include/wx/generic/propdlg.h new file mode 100644 index 0000000000..1e8e6a9be5 --- /dev/null +++ b/Externals/wxWidgets/include/wx/generic/propdlg.h @@ -0,0 +1,163 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/propdlg.h +// Purpose: wxPropertySheetDialog +// Author: Julian Smart +// Modified by: +// Created: 2005-03-12 +// RCS-ID: $Id: propdlg.h 49804 2007-11-10 01:09:42Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_PROPDLG_H_ +#define _WX_PROPDLG_H_ + +#include "wx/defs.h" + +#if wxUSE_BOOKCTRL + +#include "wx/dialog.h" + +class WXDLLIMPEXP_FWD_CORE wxBookCtrlBase; + +//----------------------------------------------------------------------------- +// wxPropertySheetDialog +// A platform-independent properties dialog. +// +// * on PocketPC, a flat-look 'property sheet' notebook will be used, with +// no OK/Cancel/Help buttons +// * on other platforms, a normal notebook will be used, with standard buttons +// +// To use this class, call Create from your derived class. +// Then create pages and add to the book control. Finally call CreateButtons and +// LayoutDialog. +// +// For example: +// +// MyPropertySheetDialog::Create(...) +// { +// wxPropertySheetDialog::Create(...); +// +// // Add page +// wxPanel* panel = new wxPanel(GetBookCtrl(), ...); +// GetBookCtrl()->AddPage(panel, wxT("General")); +// +// CreateButtons(); +// LayoutDialog(); +// } +// +// Override CreateBookCtrl and AddBookCtrl to create and add a different +// kind of book control. +//----------------------------------------------------------------------------- + +// Use the platform default +#define wxPROPSHEET_DEFAULT 0x0001 + +// Use a notebook +#define wxPROPSHEET_NOTEBOOK 0x0002 + +// Use a toolbook +#define wxPROPSHEET_TOOLBOOK 0x0004 + +// Use a choicebook +#define wxPROPSHEET_CHOICEBOOK 0x0008 + +// Use a listbook +#define wxPROPSHEET_LISTBOOK 0x0010 + +// Use a wxButtonToolBar toolbook +#define wxPROPSHEET_BUTTONTOOLBOOK 0x0020 + +// Use a treebook +#define wxPROPSHEET_TREEBOOK 0x0040 + +// Shrink dialog to fit current page +#define wxPROPSHEET_SHRINKTOFIT 0x0100 + +class WXDLLIMPEXP_ADV wxPropertySheetDialog : public wxDialog +{ +public: + wxPropertySheetDialog() : wxDialog() { Init(); } + + wxPropertySheetDialog(wxWindow* parent, wxWindowID id, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& sz = wxDefaultSize, + long style = wxDEFAULT_DIALOG_STYLE, + const wxString& name = wxDialogNameStr) + { + Init(); + Create(parent, id, title, pos, sz, style, name); + } + + bool Create(wxWindow* parent, wxWindowID id, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& sz = wxDefaultSize, + long style = wxDEFAULT_DIALOG_STYLE, + const wxString& name = wxDialogNameStr); + +//// Accessors + + // Set and get the notebook + void SetBookCtrl(wxBookCtrlBase* book) { m_bookCtrl = book; } + wxBookCtrlBase* GetBookCtrl() const { return m_bookCtrl; } + + // Set and get the inner sizer + void SetInnerSize(wxSizer* sizer) { m_innerSizer = sizer; } + wxSizer* GetInnerSizer() const { return m_innerSizer ; } + + // Set and get the book style + void SetSheetStyle(long sheetStyle) { m_sheetStyle = sheetStyle; } + long GetSheetStyle() const { return m_sheetStyle ; } + + // Set and get the border around the whole dialog + void SetSheetOuterBorder(int border) { m_sheetOuterBorder = border; } + int GetSheetOuterBorder() const { return m_sheetOuterBorder ; } + + // Set and get the border around the book control only + void SetSheetInnerBorder(int border) { m_sheetInnerBorder = border; } + int GetSheetInnerBorder() const { return m_sheetInnerBorder ; } + +/// Operations + + // Creates the buttons (none on PocketPC) + virtual void CreateButtons(int flags = wxOK|wxCANCEL); + + // Lay out the dialog, to be called after pages have been created + virtual void LayoutDialog(int centreFlags = wxBOTH); + +/// Implementation + + // Creates the book control. If you want to use a different kind of + // control, override. + virtual wxBookCtrlBase* CreateBookCtrl(); + + // Adds the book control to the inner sizer. + virtual void AddBookCtrl(wxSizer* sizer); + + // Set the focus + void OnActivate(wxActivateEvent& event); + + // Resize dialog if necessary + void OnIdle(wxIdleEvent& event); + +private: + void Init(); + +protected: + wxBookCtrlBase* m_bookCtrl; + wxSizer* m_innerSizer; // sizer for extra space + long m_sheetStyle; + int m_sheetOuterBorder; + int m_sheetInnerBorder; + int m_selectedPage; + + DECLARE_DYNAMIC_CLASS(wxPropertySheetDialog) + DECLARE_EVENT_TABLE() +}; + +#endif // wxUSE_BOOKCTRL + +#endif // _WX_PROPDLG_H_ + diff --git a/Externals/wxWidgets/include/wx/generic/region.h b/Externals/wxWidgets/include/wx/generic/region.h new file mode 100644 index 0000000000..9c2a43eb37 --- /dev/null +++ b/Externals/wxWidgets/include/wx/generic/region.h @@ -0,0 +1,79 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/region.h +// Purpose: generic wxRegion class +// Author: David Elliott +// Modified by: +// Created: 2004/04/12 +// RCS-ID: $Id: region.h 41429 2006-09-25 11:47:23Z VZ $ +// Copyright: (c) 2004 David Elliott +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GENERIC_REGION_H__ +#define _WX_GENERIC_REGION_H__ + +class WXDLLEXPORT wxRegionGeneric : public wxRegionBase +{ +public: + wxRegionGeneric(wxCoord x, wxCoord y, wxCoord w, wxCoord h); + wxRegionGeneric(const wxPoint& topLeft, const wxPoint& bottomRight); + wxRegionGeneric(const wxRect& rect); + wxRegionGeneric(); + virtual ~wxRegionGeneric(); + + // wxRegionBase pure virtuals + virtual void Clear(); + virtual bool IsEmpty() const; + +protected: + virtual wxObjectRefData *CreateRefData() const; + virtual wxObjectRefData *CloneRefData(const wxObjectRefData *data) const; + + // wxRegionBase pure virtuals + virtual bool DoIsEqual(const wxRegion& region) const; + virtual bool DoGetBox(wxCoord& x, wxCoord& y, wxCoord& w, wxCoord& h) const; + virtual wxRegionContain DoContainsPoint(wxCoord x, wxCoord y) const; + virtual wxRegionContain DoContainsRect(const wxRect& rect) const; + + virtual bool DoOffset(wxCoord x, wxCoord y); + virtual bool DoUnionWithRect(const wxRect& rect); + virtual bool DoUnionWithRegion(const wxRegion& region); + virtual bool DoIntersect(const wxRegion& region); + virtual bool DoSubtract(const wxRegion& region); + virtual bool DoXor(const wxRegion& region); + + friend class WXDLLEXPORT wxRegionIteratorGeneric; +}; + +class WXDLLEXPORT wxRegionIteratorGeneric : public wxObject +{ +public: + wxRegionIteratorGeneric(); + wxRegionIteratorGeneric(const wxRegionGeneric& region); + wxRegionIteratorGeneric(const wxRegionIteratorGeneric& iterator); + virtual ~wxRegionIteratorGeneric(); + + wxRegionIteratorGeneric& operator=(const wxRegionIteratorGeneric& iterator); + + void Reset() { m_current = 0; } + void Reset(const wxRegionGeneric& region); + + operator bool () const { return HaveRects(); } + bool HaveRects() const; + + wxRegionIteratorGeneric& operator++(); + wxRegionIteratorGeneric operator++(int); + + long GetX() const; + long GetY() const; + long GetW() const; + long GetWidth() const { return GetW(); } + long GetH() const; + long GetHeight() const { return GetH(); } + wxRect GetRect() const; +private: + long m_current; + wxRegionGeneric m_region; +}; + +#endif // _WX_GENERIC_REGION_H__ diff --git a/Externals/wxWidgets/include/wx/generic/sashwin.h b/Externals/wxWidgets/include/wx/generic/sashwin.h new file mode 100644 index 0000000000..fa16a118db --- /dev/null +++ b/Externals/wxWidgets/include/wx/generic/sashwin.h @@ -0,0 +1,261 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: sashwin.h +// Purpose: wxSashWindow implementation. A sash window has an optional +// sash on each edge, allowing it to be dragged. An event +// is generated when the sash is released. +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: sashwin.h 41020 2006-09-05 20:47:48Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_SASHWIN_H_G_ +#define _WX_SASHWIN_H_G_ + +#if wxUSE_SASH + +#include "wx/defs.h" +#include "wx/window.h" +#include "wx/string.h" + +#define wxSASH_DRAG_NONE 0 +#define wxSASH_DRAG_DRAGGING 1 +#define wxSASH_DRAG_LEFT_DOWN 2 + +enum wxSashEdgePosition { + wxSASH_TOP = 0, + wxSASH_RIGHT, + wxSASH_BOTTOM, + wxSASH_LEFT, + wxSASH_NONE = 100 +}; + +/* + * wxSashEdge represents one of the four edges of a window. + */ + +class WXDLLIMPEXP_ADV wxSashEdge +{ +public: + wxSashEdge() + { m_show = false; +#if WXWIN_COMPATIBILITY_2_6 + m_border = false; +#endif + m_margin = 0; } + + bool m_show; // Is the sash showing? +#if WXWIN_COMPATIBILITY_2_6 + bool m_border; // Do we draw a border? +#endif + int m_margin; // The margin size +}; + +/* + * wxSashWindow flags + */ + +#define wxSW_NOBORDER 0x0000 +//#define wxSW_3D 0x0010 +#define wxSW_BORDER 0x0020 +#define wxSW_3DSASH 0x0040 +#define wxSW_3DBORDER 0x0080 +#define wxSW_3D (wxSW_3DSASH | wxSW_3DBORDER) + +/* + * wxSashWindow allows any of its edges to have a sash which can be dragged + * to resize the window. The actual content window will be created as a child + * of wxSashWindow. + */ + +class WXDLLIMPEXP_ADV wxSashWindow: public wxWindow +{ +public: + // Default constructor + wxSashWindow() + { + Init(); + } + + // Normal constructor + wxSashWindow(wxWindow *parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = wxSW_3D|wxCLIP_CHILDREN, const wxString& name = wxT("sashWindow")) + { + Init(); + Create(parent, id, pos, size, style, name); + } + + virtual ~wxSashWindow(); + + bool Create(wxWindow *parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = wxSW_3D|wxCLIP_CHILDREN, const wxString& name = wxT("sashWindow")); + + // Set whether there's a sash in this position + void SetSashVisible(wxSashEdgePosition edge, bool sash); + + // Get whether there's a sash in this position + bool GetSashVisible(wxSashEdgePosition edge) const { return m_sashes[edge].m_show; } + +#if WXWIN_COMPATIBILITY_2_6 + // Set whether there's a border in this position + // This value is unused in wxSashWindow. + void SetSashBorder(wxSashEdgePosition edge, bool border) { m_sashes[edge].m_border = border; } + + // Get whether there's a border in this position + // This value is unused in wxSashWindow. + bool HasBorder(wxSashEdgePosition edge) const { return m_sashes[edge].m_border; } +#endif + + // Get border size + int GetEdgeMargin(wxSashEdgePosition edge) const { return m_sashes[edge].m_margin; } + + // Sets the default sash border size + void SetDefaultBorderSize(int width) { m_borderSize = width; } + + // Gets the default sash border size + int GetDefaultBorderSize() const { return m_borderSize; } + + // Sets the addition border size between child and sash window + void SetExtraBorderSize(int width) { m_extraBorderSize = width; } + + // Gets the addition border size between child and sash window + int GetExtraBorderSize() const { return m_extraBorderSize; } + + virtual void SetMinimumSizeX(int min) { m_minimumPaneSizeX = min; } + virtual void SetMinimumSizeY(int min) { m_minimumPaneSizeY = min; } + virtual int GetMinimumSizeX() const { return m_minimumPaneSizeX; } + virtual int GetMinimumSizeY() const { return m_minimumPaneSizeY; } + + virtual void SetMaximumSizeX(int max) { m_maximumPaneSizeX = max; } + virtual void SetMaximumSizeY(int max) { m_maximumPaneSizeY = max; } + virtual int GetMaximumSizeX() const { return m_maximumPaneSizeX; } + virtual int GetMaximumSizeY() const { return m_maximumPaneSizeY; } + +//////////////////////////////////////////////////////////////////////////// +// Implementation + + // Paints the border and sash + void OnPaint(wxPaintEvent& event); + + // Handles mouse events + void OnMouseEvent(wxMouseEvent& ev); + + // Adjusts the panes + void OnSize(wxSizeEvent& event); + +#if defined(__WXMSW__) || defined(__WXMAC__) + // Handle cursor correctly + void OnSetCursor(wxSetCursorEvent& event); +#endif // wxMSW + + // Draws borders + void DrawBorders(wxDC& dc); + + // Draws the sashes + void DrawSash(wxSashEdgePosition edge, wxDC& dc); + + // Draws the sashes + void DrawSashes(wxDC& dc); + + // Draws the sash tracker (for whilst moving the sash) + void DrawSashTracker(wxSashEdgePosition edge, int x, int y); + + // Tests for x, y over sash + wxSashEdgePosition SashHitTest(int x, int y, int tolerance = 2); + + // Resizes subwindows + void SizeWindows(); + + // Initialize colours + void InitColours(); + +private: + void Init(); + + wxSashEdge m_sashes[4]; + int m_dragMode; + wxSashEdgePosition m_draggingEdge; + int m_oldX; + int m_oldY; + int m_borderSize; + int m_extraBorderSize; + int m_firstX; + int m_firstY; + int m_minimumPaneSizeX; + int m_minimumPaneSizeY; + int m_maximumPaneSizeX; + int m_maximumPaneSizeY; + wxCursor* m_sashCursorWE; + wxCursor* m_sashCursorNS; + wxColour m_lightShadowColour; + wxColour m_mediumShadowColour; + wxColour m_darkShadowColour; + wxColour m_hilightColour; + wxColour m_faceColour; + bool m_mouseCaptured; + wxCursor* m_currentCursor; + +private: + DECLARE_DYNAMIC_CLASS(wxSashWindow) + DECLARE_EVENT_TABLE() + DECLARE_NO_COPY_CLASS(wxSashWindow) +}; + +BEGIN_DECLARE_EVENT_TYPES() + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, + wxEVT_SASH_DRAGGED, wxEVT_FIRST + 1200) +END_DECLARE_EVENT_TYPES() + +enum wxSashDragStatus +{ + wxSASH_STATUS_OK, + wxSASH_STATUS_OUT_OF_RANGE +}; + +class WXDLLIMPEXP_ADV wxSashEvent: public wxCommandEvent +{ +public: + wxSashEvent(int id = 0, wxSashEdgePosition edge = wxSASH_NONE) + { + m_eventType = (wxEventType) wxEVT_SASH_DRAGGED; + m_id = id; + m_edge = edge; + } + + void SetEdge(wxSashEdgePosition edge) { m_edge = edge; } + wxSashEdgePosition GetEdge() const { return m_edge; } + + //// The rectangle formed by the drag operation + void SetDragRect(const wxRect& rect) { m_dragRect = rect; } + wxRect GetDragRect() const { return m_dragRect; } + + //// Whether the drag caused the rectangle to be reversed (e.g. + //// dragging the top below the bottom) + void SetDragStatus(wxSashDragStatus status) { m_dragStatus = status; } + wxSashDragStatus GetDragStatus() const { return m_dragStatus; } + +private: + wxSashEdgePosition m_edge; + wxRect m_dragRect; + wxSashDragStatus m_dragStatus; + +private: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxSashEvent) +}; + +typedef void (wxEvtHandler::*wxSashEventFunction)(wxSashEvent&); + +#define wxSashEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxSashEventFunction, &func) + +#define EVT_SASH_DRAGGED(id, fn) \ + wx__DECLARE_EVT1(wxEVT_SASH_DRAGGED, id, wxSashEventHandler(fn)) +#define EVT_SASH_DRAGGED_RANGE(id1, id2, fn) \ + wx__DECLARE_EVT2(wxEVT_SASH_DRAGGED, id1, id2, wxSashEventHandler(fn)) + +#endif // wxUSE_SASH + +#endif + // _WX_SASHWIN_H_G_ diff --git a/Externals/wxWidgets/include/wx/generic/scrolwin.h b/Externals/wxWidgets/include/wx/generic/scrolwin.h new file mode 100644 index 0000000000..b1cea5de76 --- /dev/null +++ b/Externals/wxWidgets/include/wx/generic/scrolwin.h @@ -0,0 +1,27 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/scrolwin.h +// Purpose: wxGenericScrolledWindow class +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: scrolwin.h 35875 2005-10-10 18:24:27Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GENERIC_SCROLLWIN_H_ +#define _WX_GENERIC_SCROLLWIN_H_ + +// ---------------------------------------------------------------------------- +// headers and constants +// ---------------------------------------------------------------------------- + +#include "wx/window.h" +#include "wx/panel.h" + +// ---------------------------------------------------------------------------- +// wxGenericScrolledWindow +// ---------------------------------------------------------------------------- + +#endif // _WX_GENERIC_SCROLLWIN_H_ + diff --git a/Externals/wxWidgets/include/wx/generic/spinctlg.h b/Externals/wxWidgets/include/wx/generic/spinctlg.h new file mode 100644 index 0000000000..17e381d6d3 --- /dev/null +++ b/Externals/wxWidgets/include/wx/generic/spinctlg.h @@ -0,0 +1,182 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/spinctlg.h +// Purpose: generic wxSpinCtrl class +// Author: Vadim Zeitlin +// Modified by: +// Created: 28.10.99 +// RCS-ID: $Id: spinctlg.h 35650 2005-09-23 12:56:45Z MR $ +// Copyright: (c) Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GENERIC_SPINCTRL_H_ +#define _WX_GENERIC_SPINCTRL_H_ + +// ---------------------------------------------------------------------------- +// wxSpinCtrl is a combination of wxSpinButton and wxTextCtrl, so if +// wxSpinButton is available, this is what we do - but if it isn't, we still +// define wxSpinCtrl class which then has the same appearance as wxTextCtrl but +// the different interface. This allows to write programs using wxSpinCtrl +// without tons of #ifdefs. +// ---------------------------------------------------------------------------- + +#if wxUSE_SPINBTN + +class WXDLLEXPORT wxSpinButton; +class WXDLLEXPORT wxTextCtrl; + +// ---------------------------------------------------------------------------- +// wxSpinCtrl is a combination of wxTextCtrl and wxSpinButton +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxSpinCtrl : public wxControl +{ +public: + wxSpinCtrl() { Init(); } + + wxSpinCtrl(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxString& value = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxSP_ARROW_KEYS, + int min = 0, int max = 100, int initial = 0, + const wxString& name = _T("wxSpinCtrl")) + { + Init(); + Create(parent, id, value, pos, size, style, min, max, initial, name); + } + + bool Create(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxString& value = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxSP_ARROW_KEYS, + int min = 0, int max = 100, int initial = 0, + const wxString& name = _T("wxSpinCtrl")); + + virtual ~wxSpinCtrl(); + + // operations + void SetValue(int val); + void SetValue(const wxString& text); + void SetRange(int min, int max); + void SetSelection(long from, long to); + + // accessors + int GetValue() const; + int GetMin() const; + int GetMax() const; + + // implementation from now on + + // forward these functions to all subcontrols + virtual bool Enable(bool enable = true); + virtual bool Show(bool show = true); + + // get the subcontrols + wxTextCtrl *GetText() const { return m_text; } + wxSpinButton *GetSpinButton() const { return m_btn; } + + // set the value of the text (only) + void SetTextValue(int val); + + // put the numeric value of the string in the text ctrl into val and return + // true or return false if the text ctrl doesn't contain a number or if the + // number is out of range + bool GetTextValue(int *val) const; + +protected: + // override the base class virtuals involved into geometry calculations + virtual wxSize DoGetBestSize() const; + virtual void DoMoveWindow(int x, int y, int width, int height); + + // common part of all ctors + void Init(); + +private: + // the subcontrols + wxTextCtrl *m_text; + wxSpinButton *m_btn; + +private: + DECLARE_DYNAMIC_CLASS(wxSpinCtrl) +}; + +#else // !wxUSE_SPINBTN + +// ---------------------------------------------------------------------------- +// wxSpinCtrl is just a text control +// ---------------------------------------------------------------------------- + +#include "wx/textctrl.h" + +class WXDLLEXPORT wxSpinCtrl : public wxTextCtrl +{ +public: + wxSpinCtrl() { Init(); } + + wxSpinCtrl(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxString& value = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxSP_ARROW_KEYS, + int min = 0, int max = 100, int initial = 0, + const wxString& name = _T("wxSpinCtrl")) + { + Create(parent, id, value, pos, size, style, min, max, initial, name); + } + + bool Create(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxString& value = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxSP_ARROW_KEYS, + int min = 0, int max = 100, int initial = 0, + const wxString& name = _T("wxSpinCtrl")) + { + SetRange(min, max); + + bool ok = wxTextCtrl::Create(parent, id, value, pos, size, style, + wxDefaultValidator, name); + SetValue(initial); + + return ok; + } + + // accessors + int GetValue(int WXUNUSED(dummy) = 1) const + { + int n; + if ( (wxSscanf(wxTextCtrl::GetValue(), wxT("%d"), &n) != 1) ) + n = INT_MIN; + + return n; + } + + int GetMin() const { return m_min; } + int GetMax() const { return m_max; } + + // operations + void SetValue(const wxString& value) { wxTextCtrl::SetValue(value); } + void SetValue(int val) { wxString s; s << val; wxTextCtrl::SetValue(s); } + void SetRange(int min, int max) { m_min = min; m_max = max; } + +protected: + // initialize m_min/max with the default values + void Init() { SetRange(0, 100); } + + int m_min; + int m_max; + +private: + DECLARE_DYNAMIC_CLASS(wxSpinCtrl) +}; + +#endif // wxUSE_SPINBTN/!wxUSE_SPINBTN + +#endif // _WX_GENERIC_SPINCTRL_H_ + diff --git a/Externals/wxWidgets/include/wx/generic/splash.h b/Externals/wxWidgets/include/wx/generic/splash.h new file mode 100644 index 0000000000..e7cf5cd22a --- /dev/null +++ b/Externals/wxWidgets/include/wx/generic/splash.h @@ -0,0 +1,92 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: splash.h +// Purpose: Splash screen class +// Author: Julian Smart +// Modified by: +// Created: 28/6/2000 +// RCS-ID: $Id: splash.h 41020 2006-09-05 20:47:48Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_SPLASH_H_ +#define _WX_SPLASH_H_ + +#include "wx/bitmap.h" +#include "wx/timer.h" +#include "wx/frame.h" + + +/* + * A window for displaying a splash screen + */ + +#define wxSPLASH_CENTRE_ON_PARENT 0x01 +#define wxSPLASH_CENTRE_ON_SCREEN 0x02 +#define wxSPLASH_NO_CENTRE 0x00 +#define wxSPLASH_TIMEOUT 0x04 +#define wxSPLASH_NO_TIMEOUT 0x00 + +class WXDLLIMPEXP_ADV wxSplashScreenWindow; + +/* + * wxSplashScreen + */ + +class WXDLLIMPEXP_ADV wxSplashScreen: public wxFrame +{ +public: + // for RTTI macros only + wxSplashScreen() {} + wxSplashScreen(const wxBitmap& bitmap, long splashStyle, int milliseconds, + wxWindow* parent, wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxSIMPLE_BORDER|wxFRAME_NO_TASKBAR|wxSTAY_ON_TOP); + virtual ~wxSplashScreen(); + + void OnCloseWindow(wxCloseEvent& event); + void OnNotify(wxTimerEvent& event); + + long GetSplashStyle() const { return m_splashStyle; } + wxSplashScreenWindow* GetSplashWindow() const { return m_window; } + int GetTimeout() const { return m_milliseconds; } + +protected: + wxSplashScreenWindow* m_window; + long m_splashStyle; + int m_milliseconds; + wxTimer m_timer; + + DECLARE_DYNAMIC_CLASS(wxSplashScreen) + DECLARE_EVENT_TABLE() + DECLARE_NO_COPY_CLASS(wxSplashScreen) +}; + +/* + * wxSplashScreenWindow + */ + +class WXDLLIMPEXP_ADV wxSplashScreenWindow: public wxWindow +{ +public: + wxSplashScreenWindow(const wxBitmap& bitmap, wxWindow* parent, wxWindowID id, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxNO_BORDER); + + void OnPaint(wxPaintEvent& event); + void OnEraseBackground(wxEraseEvent& event); + void OnMouseEvent(wxMouseEvent& event); + void OnChar(wxKeyEvent& event); + + void SetBitmap(const wxBitmap& bitmap) { m_bitmap = bitmap; } + wxBitmap& GetBitmap() { return m_bitmap; } + +protected: + wxBitmap m_bitmap; + + DECLARE_EVENT_TABLE() + DECLARE_NO_COPY_CLASS(wxSplashScreenWindow) +}; + + +#endif + // _WX_SPLASH_H_ diff --git a/Externals/wxWidgets/include/wx/generic/splitter.h b/Externals/wxWidgets/include/wx/generic/splitter.h new file mode 100644 index 0000000000..ebd34dfa59 --- /dev/null +++ b/Externals/wxWidgets/include/wx/generic/splitter.h @@ -0,0 +1,406 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/splitter.h +// Purpose: wxSplitterWindow class +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: splitter.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GENERIC_SPLITTER_H_ +#define _WX_GENERIC_SPLITTER_H_ + +#include "wx/window.h" // base class declaration +#include "wx/containr.h" // wxControlContainer + +class WXDLLEXPORT wxSplitterEvent; + +// --------------------------------------------------------------------------- +// splitter constants +// --------------------------------------------------------------------------- + +enum wxSplitMode +{ + wxSPLIT_HORIZONTAL = 1, + wxSPLIT_VERTICAL +}; + +enum +{ + wxSPLIT_DRAG_NONE, + wxSPLIT_DRAG_DRAGGING, + wxSPLIT_DRAG_LEFT_DOWN +}; + +// --------------------------------------------------------------------------- +// wxSplitterWindow maintains one or two panes, with +// an optional vertical or horizontal split which +// can be used with the mouse or programmatically. +// --------------------------------------------------------------------------- + +// TODO: +// 1) Perhaps make the borders sensitive to dragging in order to create a split. +// The MFC splitter window manages scrollbars as well so is able to +// put sash buttons on the scrollbars, but we probably don't want to go down +// this path. +// 2) for wxWidgets 2.0, we must find a way to set the WS_CLIPCHILDREN style +// to prevent flickering. (WS_CLIPCHILDREN doesn't work in all cases so can't be +// standard). + +class WXDLLEXPORT wxSplitterWindow: public wxWindow +{ +public: + +//////////////////////////////////////////////////////////////////////////// +// Public API + + // Default constructor + wxSplitterWindow() + { + Init(); + } + + // Normal constructor + wxSplitterWindow(wxWindow *parent, wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxSP_3D, + const wxString& name = wxT("splitter")) + { + Init(); + Create(parent, id, pos, size, style, name); + } + + virtual ~wxSplitterWindow(); + + bool Create(wxWindow *parent, wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxSP_3D, + const wxString& name = wxT("splitter")); + + // Gets the only or left/top pane + wxWindow *GetWindow1() const { return m_windowOne; } + + // Gets the right/bottom pane + wxWindow *GetWindow2() const { return m_windowTwo; } + + // Sets the split mode + void SetSplitMode(int mode) + { + wxASSERT_MSG( mode == wxSPLIT_VERTICAL || mode == wxSPLIT_HORIZONTAL, + _T("invalid split mode") ); + + m_splitMode = (wxSplitMode)mode; + } + + // Gets the split mode + wxSplitMode GetSplitMode() const { return m_splitMode; } + + // Initialize with one window + void Initialize(wxWindow *window); + + // Associates the given window with window 2, drawing the appropriate sash + // and changing the split mode. + // Does nothing and returns false if the window is already split. + // A sashPosition of 0 means choose a default sash position, + // negative sashPosition specifies the size of right/lower pane as it's + // absolute value rather than the size of left/upper pane. + virtual bool SplitVertically(wxWindow *window1, + wxWindow *window2, + int sashPosition = 0) + { return DoSplit(wxSPLIT_VERTICAL, window1, window2, sashPosition); } + virtual bool SplitHorizontally(wxWindow *window1, + wxWindow *window2, + int sashPosition = 0) + { return DoSplit(wxSPLIT_HORIZONTAL, window1, window2, sashPosition); } + + // Removes the specified (or second) window from the view + // Doesn't actually delete the window. + bool Unsplit(wxWindow *toRemove = (wxWindow *) NULL); + + // Replaces one of the windows with another one (neither old nor new + // parameter should be NULL) + bool ReplaceWindow(wxWindow *winOld, wxWindow *winNew); + + // Make sure the child window sizes are updated. This is useful + // for reducing flicker by updating the sizes before a + // window is shown, if you know the overall size is correct. + void UpdateSize(); + + // Is the window split? + bool IsSplit() const { return (m_windowTwo != NULL); } + + // Sets the sash size + void SetSashSize(int width) { m_sashSize = width; } + + // Sets the border size + void SetBorderSize(int WXUNUSED(width)) { } + + // Gets the sash size + int GetSashSize() const; + + // Gets the border size + int GetBorderSize() const; + + // Set the sash position + void SetSashPosition(int position, bool redraw = true); + + // Gets the sash position + int GetSashPosition() const { return m_sashPosition; } + + // Set the sash gravity + void SetSashGravity(double gravity); + + // Gets the sash gravity + double GetSashGravity() const { return m_sashGravity; } + + // If this is zero, we can remove panes by dragging the sash. + void SetMinimumPaneSize(int min); + int GetMinimumPaneSize() const { return m_minimumPaneSize; } + + // NB: the OnXXX() functions below are for backwards compatibility only, + // don't use them in new code but handle the events instead! + + // called when the sash position is about to change, may return a new value + // for the sash or -1 to prevent the change from happening at all + virtual int OnSashPositionChanging(int newSashPosition); + + // Called when the sash position is about to be changed, return + // false from here to prevent the change from taking place. + // Repositions sash to minimum position if pane would be too small. + // newSashPosition here is always positive or zero. + virtual bool OnSashPositionChange(int newSashPosition); + + // If the sash is moved to an extreme position, a subwindow + // is removed from the splitter window, and the app is + // notified. The app should delete or hide the window. + virtual void OnUnsplit(wxWindow *removed); + + // Called when the sash is double-clicked. + // The default behaviour is to remove the sash if the + // minimum pane size is zero. + virtual void OnDoubleClickSash(int x, int y); + +//////////////////////////////////////////////////////////////////////////// +// Implementation + + // Paints the border and sash + void OnPaint(wxPaintEvent& event); + + // Handles mouse events + void OnMouseEvent(wxMouseEvent& ev); + + // Adjusts the panes + void OnSize(wxSizeEvent& event); + + // In live mode, resize child windows in idle time + void OnInternalIdle(); + + // Draws the sash + virtual void DrawSash(wxDC& dc); + + // Draws the sash tracker (for whilst moving the sash) + virtual void DrawSashTracker(int x, int y); + + // Tests for x, y over sash + virtual bool SashHitTest(int x, int y, int tolerance = 5); + + // Resizes subwindows + virtual void SizeWindows(); + + void SetNeedUpdating(bool needUpdating) { m_needUpdating = needUpdating; } + bool GetNeedUpdating() const { return m_needUpdating ; } + +#ifdef __WXMAC__ + virtual bool MacClipGrandChildren() const { return true ; } +#endif + +protected: + // event handlers +#if defined(__WXMSW__) || defined(__WXMAC__) + void OnSetCursor(wxSetCursorEvent& event); +#endif // wxMSW + + // send the given event, return false if the event was processed and vetoed + // by the user code + bool DoSendEvent(wxSplitterEvent& event); + + // common part of all ctors + void Init(); + + // common part of SplitVertically() and SplitHorizontally() + bool DoSplit(wxSplitMode mode, + wxWindow *window1, wxWindow *window2, + int sashPosition); + + // adjusts sash position with respect to min. pane and window sizes + int AdjustSashPosition(int sashPos) const; + + // get either width or height depending on the split mode + int GetWindowSize() const; + + // convert the user specified sash position which may be > 0 (as is), < 0 + // (specifying the size of the right pane) or 0 (use default) to the real + // position to be passed to DoSetSashPosition() + int ConvertSashPosition(int sashPos) const; + + // set the real sash position, sashPos here must be positive + // + // returns true if the sash position has been changed, false otherwise + bool DoSetSashPosition(int sashPos); + + // set the sash position and send an event about it having been changed + void SetSashPositionAndNotify(int sashPos); + + // callbacks executed when we detect that the mouse has entered or left + // the sash + virtual void OnEnterSash(); + virtual void OnLeaveSash(); + + // set the cursor appropriate for the current split mode + void SetResizeCursor(); + + // redraw the splitter if its "hotness" changed if necessary + void RedrawIfHotSensitive(bool isHot); + + // return the best size of the splitter equal to best sizes of its + // subwindows + virtual wxSize DoGetBestSize() const; + + + wxSplitMode m_splitMode; + wxWindow* m_windowOne; + wxWindow* m_windowTwo; + int m_dragMode; + int m_oldX; + int m_oldY; + int m_sashPosition; // Number of pixels from left or top + double m_sashGravity; + int m_sashSize; + wxSize m_lastSize; + int m_requestedSashPosition; + int m_sashPositionCurrent; // while dragging + int m_firstX; + int m_firstY; + int m_minimumPaneSize; + wxCursor m_sashCursorWE; + wxCursor m_sashCursorNS; + wxPen *m_sashTrackerPen; + + // when in live mode, set this to true to resize children in idle + bool m_needUpdating:1; + bool m_permitUnsplitAlways:1; + bool m_isHot:1; + bool m_checkRequestedSashPosition:1; + +private: + WX_DECLARE_CONTROL_CONTAINER(); + + DECLARE_DYNAMIC_CLASS(wxSplitterWindow) + DECLARE_EVENT_TABLE() + DECLARE_NO_COPY_CLASS(wxSplitterWindow) +}; + +// ---------------------------------------------------------------------------- +// event class and macros +// ---------------------------------------------------------------------------- + +// we reuse the same class for all splitter event types because this is the +// usual wxWin convention, but the three event types have different kind of +// data associated with them, so the accessors can be only used if the real +// event type matches with the one for which the accessors make sense +class WXDLLEXPORT wxSplitterEvent : public wxNotifyEvent +{ +public: + wxSplitterEvent(wxEventType type = wxEVT_NULL, + wxSplitterWindow *splitter = (wxSplitterWindow *)NULL) + : wxNotifyEvent(type) + { + SetEventObject(splitter); + if (splitter) m_id = splitter->GetId(); + } + + // SASH_POS_CHANGED methods + + // setting the sash position to -1 prevents the change from taking place at + // all + void SetSashPosition(int pos) + { + wxASSERT( GetEventType() == wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGED + || GetEventType() == wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGING); + + m_data.pos = pos; + } + + int GetSashPosition() const + { + wxASSERT( GetEventType() == wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGED + || GetEventType() == wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGING); + + return m_data.pos; + } + + // UNSPLIT event methods + wxWindow *GetWindowBeingRemoved() const + { + wxASSERT( GetEventType() == wxEVT_COMMAND_SPLITTER_UNSPLIT ); + + return m_data.win; + } + + // DCLICK event methods + int GetX() const + { + wxASSERT( GetEventType() == wxEVT_COMMAND_SPLITTER_DOUBLECLICKED ); + + return m_data.pt.x; + } + + int GetY() const + { + wxASSERT( GetEventType() == wxEVT_COMMAND_SPLITTER_DOUBLECLICKED ); + + return m_data.pt.y; + } + +private: + friend class WXDLLIMPEXP_FWD_CORE wxSplitterWindow; + + // data for the different types of event + union + { + int pos; // position for SASH_POS_CHANGED event + wxWindow *win; // window being removed for UNSPLIT event + struct + { + int x, y; + } pt; // position of double click for DCLICK event + } m_data; + + DECLARE_DYNAMIC_CLASS_NO_COPY(wxSplitterEvent) +}; + +typedef void (wxEvtHandler::*wxSplitterEventFunction)(wxSplitterEvent&); + +#define wxSplitterEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxSplitterEventFunction, &func) + +#define wx__DECLARE_SPLITTEREVT(evt, id, fn) \ + wx__DECLARE_EVT1(wxEVT_COMMAND_SPLITTER_ ## evt, id, wxSplitterEventHandler(fn)) + +#define EVT_SPLITTER_SASH_POS_CHANGED(id, fn) \ + wx__DECLARE_SPLITTEREVT(SASH_POS_CHANGED, id, fn) + +#define EVT_SPLITTER_SASH_POS_CHANGING(id, fn) \ + wx__DECLARE_SPLITTEREVT(SASH_POS_CHANGING, id, fn) + +#define EVT_SPLITTER_DCLICK(id, fn) \ + wx__DECLARE_SPLITTEREVT(DOUBLECLICKED, id, fn) + +#define EVT_SPLITTER_UNSPLIT(id, fn) \ + wx__DECLARE_SPLITTEREVT(UNSPLIT, id, fn) + +#endif // _WX_GENERIC_SPLITTER_H_ diff --git a/Externals/wxWidgets/include/wx/generic/srchctlg.h b/Externals/wxWidgets/include/wx/generic/srchctlg.h new file mode 100644 index 0000000000..47285bbf54 --- /dev/null +++ b/Externals/wxWidgets/include/wx/generic/srchctlg.h @@ -0,0 +1,275 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/srchctlg.h +// Purpose: generic wxSearchCtrl class +// Author: Vince Harron +// Created: 2006-02-19 +// RCS-ID: $Id: srchctlg.h 45828 2007-05-05 14:51:51Z VZ $ +// Copyright: Vince Harron +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GENERIC_SEARCHCTRL_H_ +#define _WX_GENERIC_SEARCHCTRL_H_ + +#if wxUSE_SEARCHCTRL + +#include "wx/bitmap.h" + +class WXDLLEXPORT wxSearchButton; +class WXDLLEXPORT wxSearchTextCtrl; + +// ---------------------------------------------------------------------------- +// wxSearchCtrl is a combination of wxTextCtrl and wxSearchButton +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxSearchCtrl : public wxSearchCtrlBase +{ +public: + // creation + // -------- + + wxSearchCtrl(); + wxSearchCtrl(wxWindow *parent, wxWindowID id, + const wxString& value = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxSearchCtrlNameStr); + + virtual ~wxSearchCtrl(); + + bool Create(wxWindow *parent, wxWindowID id, + const wxString& value = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxSearchCtrlNameStr); + +#if wxUSE_MENUS + // get/set search button menu + // -------------------------- + virtual void SetMenu( wxMenu* menu ); + virtual wxMenu* GetMenu(); +#endif // wxUSE_MENUS + + // get/set search options + // ---------------------- + virtual void ShowSearchButton( bool show ); + virtual bool IsSearchButtonVisible() const; + + virtual void ShowCancelButton( bool show ); + virtual bool IsCancelButtonVisible() const; + +#if wxABI_VERSION >= 20802 + // TODO: In 2.9 these should probably be virtual, and declared in the base class... + void SetDescriptiveText(const wxString& text); + wxString GetDescriptiveText() const; +#endif + + // accessors + // --------- + + virtual wxString GetValue() const; + virtual void SetValue(const wxString& value); + + virtual wxString GetRange(long from, long to) const; + + virtual int GetLineLength(long lineNo) const; + virtual wxString GetLineText(long lineNo) const; + virtual int GetNumberOfLines() const; + + virtual bool IsModified() const; + virtual bool IsEditable() const; + + // more readable flag testing methods + virtual bool IsSingleLine() const; + virtual bool IsMultiLine() const; + + // If the return values from and to are the same, there is no selection. + virtual void GetSelection(long* from, long* to) const; + + virtual wxString GetStringSelection() const; + + // operations + // ---------- + + // editing + virtual void Clear(); + virtual void Replace(long from, long to, const wxString& value); + virtual void Remove(long from, long to); + + // load/save the controls contents from/to the file + virtual bool LoadFile(const wxString& file); + virtual bool SaveFile(const wxString& file = wxEmptyString); + + // sets/clears the dirty flag + virtual void MarkDirty(); + virtual void DiscardEdits(); + + // set the max number of characters which may be entered in a single line + // text control + virtual void SetMaxLength(unsigned long WXUNUSED(len)); + + // writing text inserts it at the current position, appending always + // inserts it at the end + virtual void WriteText(const wxString& text); + virtual void AppendText(const wxString& text); + + // insert the character which would have resulted from this key event, + // return true if anything has been inserted + virtual bool EmulateKeyPress(const wxKeyEvent& event); + + // text control under some platforms supports the text styles: these + // methods allow to apply the given text style to the given selection or to + // set/get the style which will be used for all appended text + virtual bool SetStyle(long start, long end, const wxTextAttr& style); + virtual bool GetStyle(long position, wxTextAttr& style); + virtual bool SetDefaultStyle(const wxTextAttr& style); + virtual const wxTextAttr& GetDefaultStyle() const; + + // translate between the position (which is just an index in the text ctrl + // considering all its contents as a single strings) and (x, y) coordinates + // which represent column and line. + virtual long XYToPosition(long x, long y) const; + virtual bool PositionToXY(long pos, long *x, long *y) const; + + virtual void ShowPosition(long pos); + + // find the character at position given in pixels + // + // NB: pt is in device coords (not adjusted for the client area origin nor + // scrolling) + virtual wxTextCtrlHitTestResult HitTest(const wxPoint& pt, long *pos) const; + virtual wxTextCtrlHitTestResult HitTest(const wxPoint& pt, + wxTextCoord *col, + wxTextCoord *row) const; + + // Clipboard operations + virtual void Copy(); + virtual void Cut(); + virtual void Paste(); + + virtual bool CanCopy() const; + virtual bool CanCut() const; + virtual bool CanPaste() const; + + // Undo/redo + virtual void Undo(); + virtual void Redo(); + + virtual bool CanUndo() const; + virtual bool CanRedo() const; + + // Insertion point + virtual void SetInsertionPoint(long pos); + virtual void SetInsertionPointEnd(); + virtual long GetInsertionPoint() const; + virtual wxTextPos GetLastPosition() const; + + virtual void SetSelection(long from, long to); + virtual void SelectAll(); + virtual void SetEditable(bool editable); + +#if 0 + + // override streambuf method +#if wxHAS_TEXT_WINDOW_STREAM + int overflow(int i); +#endif // wxHAS_TEXT_WINDOW_STREAM + + // stream-like insertion operators: these are always available, whether we + // were, or not, compiled with streambuf support + wxTextCtrl& operator<<(const wxString& s); + wxTextCtrl& operator<<(int i); + wxTextCtrl& operator<<(long i); + wxTextCtrl& operator<<(float f); + wxTextCtrl& operator<<(double d); + wxTextCtrl& operator<<(const wxChar c); +#endif + + // do the window-specific processing after processing the update event + virtual void DoUpdateWindowUI(wxUpdateUIEvent& event); + + virtual bool ShouldInheritColours() const; + + // wxWindow overrides + virtual bool SetFont(const wxFont& font); + + // search control generic only + void SetSearchBitmap( const wxBitmap& bitmap ); + void SetCancelBitmap( const wxBitmap& bitmap ); +#if wxUSE_MENUS + void SetSearchMenuBitmap( const wxBitmap& bitmap ); +#endif // wxUSE_MENUS + +protected: + virtual void DoSetValue(const wxString& value, int flags = 0); + + // override the base class virtuals involved into geometry calculations + virtual wxSize DoGetBestSize() const; + virtual void DoMoveWindow(int x, int y, int width, int height); + virtual void LayoutControls(int x, int y, int width, int height); + + virtual void RecalcBitmaps(); + + void Init(); + + virtual wxBitmap RenderSearchBitmap( int x, int y, bool renderDrop ); + virtual wxBitmap RenderCancelBitmap( int x, int y ); + + virtual void OnSearchButton( wxCommandEvent& event ); + + void OnSetFocus( wxFocusEvent& event ); + void OnSize( wxSizeEvent& event ); + + bool HasMenu() const + { +#if wxUSE_MENUS + return m_menu != NULL; +#else // !wxUSE_MENUS + return false; +#endif // wxUSE_MENUS/!wxUSE_MENUS + } + +private: + friend class wxSearchButton; + +#if wxUSE_MENUS + void PopupSearchMenu(); +#endif // wxUSE_MENUS + + // the subcontrols + wxSearchTextCtrl *m_text; + wxSearchButton *m_searchButton; + wxSearchButton *m_cancelButton; +#if wxUSE_MENUS + wxMenu *m_menu; +#endif // wxUSE_MENUS + + bool m_searchButtonVisible; + bool m_cancelButtonVisible; + + bool m_searchBitmapUser; + bool m_cancelBitmapUser; +#if wxUSE_MENUS + bool m_searchMenuBitmapUser; +#endif // wxUSE_MENUS + + wxBitmap m_searchBitmap; + wxBitmap m_cancelBitmap; +#if wxUSE_MENUS + wxBitmap m_searchMenuBitmap; +#endif // wxUSE_MENUS + +private: + DECLARE_DYNAMIC_CLASS(wxSearchCtrl) + + DECLARE_EVENT_TABLE() +}; + +#endif // wxUSE_SEARCHCTRL + +#endif // _WX_GENERIC_SEARCHCTRL_H_ + diff --git a/Externals/wxWidgets/include/wx/generic/statline.h b/Externals/wxWidgets/include/wx/generic/statline.h new file mode 100644 index 0000000000..4ad6f17fd8 --- /dev/null +++ b/Externals/wxWidgets/include/wx/generic/statline.h @@ -0,0 +1,62 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: generic/statline.h +// Purpose: a generic wxStaticLine class +// Author: Vadim Zeitlin +// Created: 28.06.99 +// Version: $Id: statline.h 43874 2006-12-09 14:52:59Z VZ $ +// Copyright: (c) 1998 Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GENERIC_STATLINE_H_ +#define _WX_GENERIC_STATLINE_H_ + +class wxStaticBox; + +// ---------------------------------------------------------------------------- +// wxStaticLine +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxStaticLine : public wxStaticLineBase +{ + DECLARE_DYNAMIC_CLASS(wxStaticLine) + +public: + // constructors and pseudo-constructors + wxStaticLine() { m_statbox = NULL; } + + wxStaticLine( wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxPoint &pos = wxDefaultPosition, + const wxSize &size = wxDefaultSize, + long style = wxLI_HORIZONTAL, + const wxString &name = wxStaticLineNameStr ) + { + Create(parent, id, pos, size, style, name); + } + + virtual ~wxStaticLine(); + + bool Create( wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxPoint &pos = wxDefaultPosition, + const wxSize &size = wxDefaultSize, + long style = wxLI_HORIZONTAL, + const wxString &name = wxStaticLineNameStr ); + + // it's necessary to override this wxWindow function because we + // will want to return the main widget for m_statbox + // + WXWidget GetMainWidget() const; + + // override wxWindow methods to make things work + virtual void DoSetSize(int x, int y, int width, int height, + int sizeFlags = wxSIZE_AUTO); + virtual void DoMoveWindow(int x, int y, int width, int height); +protected: + // we implement the static line using a static box + wxStaticBox *m_statbox; +}; + +#endif // _WX_GENERIC_STATLINE_H_ + diff --git a/Externals/wxWidgets/include/wx/generic/statusbr.h b/Externals/wxWidgets/include/wx/generic/statusbr.h new file mode 100644 index 0000000000..5934a94720 --- /dev/null +++ b/Externals/wxWidgets/include/wx/generic/statusbr.h @@ -0,0 +1,107 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/statusbr.h +// Purpose: wxStatusBarGeneric class +// Author: Julian Smart +// Modified by: VZ at 05.02.00 to derive from wxStatusBarBase +// Created: 01/02/97 +// RCS-ID: $Id: statusbr.h 41200 2006-09-13 19:10:31Z ABX $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GENERIC_STATUSBR_H_ +#define _WX_GENERIC_STATUSBR_H_ + +#include "wx/defs.h" + +#if wxUSE_STATUSBAR + +#include "wx/pen.h" +#include "wx/arrstr.h" + +class WXDLLEXPORT wxStatusBarGeneric : public wxStatusBarBase +{ +public: + wxStatusBarGeneric() { Init(); } + wxStatusBarGeneric(wxWindow *parent, + wxWindowID winid = wxID_ANY, + long style = wxST_SIZEGRIP, + const wxString& name = wxStatusBarNameStr) + { + Init(); + + Create(parent, winid, style, name); + } + + virtual ~wxStatusBarGeneric(); + + bool Create(wxWindow *parent, wxWindowID winid = wxID_ANY, + long style = wxST_SIZEGRIP, + const wxString& name = wxStatusBarNameStr); + + // Create status line + virtual void SetFieldsCount(int number = 1, + const int *widths = (const int *) NULL); + + // Set status line text + virtual void SetStatusText(const wxString& text, int number = 0); + virtual wxString GetStatusText(int number = 0) const; + + // Set status line widths + virtual void SetStatusWidths(int n, const int widths_field[]); + + // Get the position and size of the field's internal bounding rectangle + virtual bool GetFieldRect(int i, wxRect& rect) const; + + // sets the minimal vertical size of the status bar + virtual void SetMinHeight(int height); + + virtual int GetBorderX() const { return m_borderX; } + virtual int GetBorderY() const { return m_borderY; } + + //////////////////////////////////////////////////////////////////////// + // Implementation + + virtual void DrawFieldText(wxDC& dc, int i); + virtual void DrawField(wxDC& dc, int i); + + void SetBorderX(int x); + void SetBorderY(int y); + + void OnPaint(wxPaintEvent& event); + + void OnLeftDown(wxMouseEvent& event); + void OnRightDown(wxMouseEvent& event); + + virtual void InitColours(); + + // Responds to colour changes + void OnSysColourChanged(wxSysColourChangedEvent& event); + +protected: + // common part of all ctors + void Init(); + + wxArrayString m_statusStrings; + + // the last known width of the client rect (used to rebuild cache) + int m_lastClientWidth; + // the widths of the status bar panes in pixels + wxArrayInt m_widthsAbs; + + int m_borderX; + int m_borderY; + wxPen m_mediumShadowPen; + wxPen m_hilightPen; + + virtual wxSize DoGetBestSize() const; + +private: + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS_NO_COPY(wxStatusBarGeneric) +}; + +#endif // wxUSE_STATUSBAR + +#endif + // _WX_GENERIC_STATUSBR_H_ diff --git a/Externals/wxWidgets/include/wx/generic/tabg.h b/Externals/wxWidgets/include/wx/generic/tabg.h new file mode 100644 index 0000000000..c9e2f34dfe --- /dev/null +++ b/Externals/wxWidgets/include/wx/generic/tabg.h @@ -0,0 +1,363 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: tabg.h +// Purpose: Generic tabbed dialogs +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: tabg.h 41020 2006-09-05 20:47:48Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef __TABGH_G__ +#define __TABGH_G__ + +#define WXTAB_VERSION 1.1 + +#include "wx/hashmap.h" +#include "wx/string.h" +#include "wx/dialog.h" +#include "wx/panel.h" +#include "wx/list.h" + +class WXDLLEXPORT wxTabView; + +/* + * A wxTabControl is the internal and visual representation + * of the tab. + */ + +class WXDLLEXPORT wxTabControl: public wxObject +{ +DECLARE_DYNAMIC_CLASS(wxTabControl) +public: + wxTabControl(wxTabView *v = (wxTabView *) NULL); + virtual ~wxTabControl(void); + + virtual void OnDraw(wxDC& dc, bool lastInRow); + void SetLabel(const wxString& str) { m_controlLabel = str; } + wxString GetLabel(void) const { return m_controlLabel; } + + void SetFont(const wxFont& f) { m_labelFont = f; } + wxFont *GetFont(void) const { return (wxFont*) & m_labelFont; } + + void SetSelected(bool sel) { m_isSelected = sel; } + bool IsSelected(void) const { return m_isSelected; } + + void SetPosition(int x, int y) { m_offsetX = x; m_offsetY = y; } + void SetSize(int x, int y) { m_width = x; m_height = y; } + + void SetRowPosition(int r) { m_rowPosition = r; } + int GetRowPosition() const { return m_rowPosition; } + void SetColPosition(int c) { m_colPosition = c; } + int GetColPosition() const { return m_colPosition; } + + int GetX(void) const { return m_offsetX; } + int GetY(void) const { return m_offsetY; } + int GetWidth(void) const { return m_width; } + int GetHeight(void) const { return m_height; } + + int GetId(void) const { return m_id; } + void SetId(int i) { m_id = i; } + + virtual bool HitTest(int x, int y) const ; + +protected: + wxTabView* m_view; + wxString m_controlLabel; + bool m_isSelected; + wxFont m_labelFont; + int m_offsetX; // Offsets from top-left of tab view area (the area below the tabs) + int m_offsetY; + int m_width; + int m_height; + int m_id; + int m_rowPosition; // Position in row from 0 + int m_colPosition; // Position in col from 0 +}; + +/* + * Each wxTabLayer is a list of tabs. E.g. there + * are 3 layers in the MS Word Options dialog. + */ + +class WXDLLEXPORT wxTabLayer: public wxList +{ +}; + +/* + * The wxTabView controls and draws the tabbed object + */ + +WX_DECLARE_LIST(wxTabLayer, wxTabLayerList); + +#define wxTAB_STYLE_DRAW_BOX 1 // Draws 3D boxes round tab layers +#define wxTAB_STYLE_COLOUR_INTERIOR 2 // Colours interior of tabs, otherwise draws outline + +class WXDLLEXPORT wxTabView: public wxObject +{ +DECLARE_DYNAMIC_CLASS(wxTabView) +public: + wxTabView(long style = wxTAB_STYLE_DRAW_BOX | wxTAB_STYLE_COLOUR_INTERIOR); + virtual ~wxTabView(); + + inline int GetNumberOfLayers() const { return m_layers.GetCount(); } +#if WXWIN_COMPATIBILITY_2_4 + inline wxList& GetLayers() { return *(wxList *)&m_layers; } +#else + inline wxTabLayerList& GetLayers() { return m_layers; } +#endif + + inline void SetWindow(wxWindow* wnd) { m_window = wnd; } + inline wxWindow* GetWindow(void) const { return m_window; } + + // Automatically positions tabs + wxTabControl *AddTab(int id, const wxString& label, wxTabControl *existingTab = (wxTabControl *) NULL); + + // Remove the tab without deleting the window + bool RemoveTab(int id); + + void ClearTabs(bool deleteTabs = true); + + bool SetTabText(int id, const wxString& label); + wxString GetTabText(int id) const; + + // Layout tabs (optional, e.g. if resizing window) + void LayoutTabs(); + + // Draw all tabs + virtual void Draw(wxDC& dc); + + // Process mouse event, return false if we didn't process it + virtual bool OnEvent(wxMouseEvent& event); + + // Called when a tab is activated + virtual void OnTabActivate(int activateId, int deactivateId); + // Allows vetoing + virtual bool OnTabPreActivate(int WXUNUSED(activateId), int WXUNUSED(deactivateId) ) { return true; }; + + // Allows use of application-supplied wxTabControl classes. + virtual wxTabControl *OnCreateTabControl(void) { return new wxTabControl(this); } + + void SetHighlightColour(const wxColour& col); + void SetShadowColour(const wxColour& col); + void SetBackgroundColour(const wxColour& col); + inline void SetTextColour(const wxColour& col) { m_textColour = col; } + + inline wxColour GetHighlightColour(void) const { return m_highlightColour; } + inline wxColour GetShadowColour(void) const { return m_shadowColour; } + inline wxColour GetBackgroundColour(void) const { return m_backgroundColour; } + inline wxColour GetTextColour(void) const { return m_textColour; } + inline const wxPen *GetHighlightPen(void) const { return m_highlightPen; } + inline const wxPen *GetShadowPen(void) const { return m_shadowPen; } + inline const wxPen *GetBackgroundPen(void) const { return m_backgroundPen; } + inline const wxBrush *GetBackgroundBrush(void) const { return m_backgroundBrush; } + + inline void SetViewRect(const wxRect& rect) { m_tabViewRect = rect; } + inline wxRect GetViewRect(void) const { return m_tabViewRect; } + + // Calculate tab width to fit to view, and optionally adjust the view + // to fit the tabs exactly. + int CalculateTabWidth(int noTabs, bool adjustView = false); + + inline void SetTabStyle(long style) { m_tabStyle = style; } + inline long GetTabStyle(void) const { return m_tabStyle; } + + inline void SetTabSize(int w, int h) { m_tabWidth = w; m_tabHeight = h; } + inline int GetTabWidth(void) const { return m_tabWidth; } + inline int GetTabHeight(void) const { return m_tabHeight; } + inline void SetTabSelectionHeight(int h) { m_tabSelectionHeight = h; } + inline int GetTabSelectionHeight(void) const { return m_tabSelectionHeight; } + + // Returns the total height of the tabs component -- this may be several + // times the height of a tab, if there are several tab layers (rows). + int GetTotalTabHeight(); + + inline int GetTopMargin(void) const { return m_topMargin; } + inline void SetTopMargin(int margin) { m_topMargin = margin; } + + void SetTabSelection(int sel, bool activateTool = true); + inline int GetTabSelection() const { return m_tabSelection; } + + // Find tab control for id + wxTabControl *FindTabControlForId(int id) const ; + + // Find tab control for layer, position (starting from zero) + wxTabControl *FindTabControlForPosition(int layer, int position) const ; + + inline int GetHorizontalTabOffset() const { return m_tabHorizontalOffset; } + inline int GetHorizontalTabSpacing() const { return m_tabHorizontalSpacing; } + inline void SetHorizontalTabOffset(int sp) { m_tabHorizontalOffset = sp; } + inline void SetHorizontalTabSpacing(int sp) { m_tabHorizontalSpacing = sp; } + + inline void SetVerticalTabTextSpacing(int s) { m_tabVerticalTextSpacing = s; } + inline int GetVerticalTabTextSpacing() const { return m_tabVerticalTextSpacing; } + + inline wxFont *GetTabFont() const { return (wxFont*) & m_tabFont; } + inline void SetTabFont(const wxFont& f) { m_tabFont = f; } + + inline wxFont *GetSelectedTabFont() const { return (wxFont*) & m_tabSelectedFont; } + inline void SetSelectedTabFont(const wxFont& f) { m_tabSelectedFont = f; } + // Find the node and the column at which this control is positioned. + wxList::compatibility_iterator FindTabNodeAndColumn(wxTabControl *control, int *col) const ; + + // Do the necessary to change to this tab + virtual bool ChangeTab(wxTabControl *control); + + // Move the selected tab to the bottom layer, if necessary, + // without calling app activation code + bool MoveSelectionTab(wxTabControl *control); + + inline int GetNumberOfTabs() const { return m_noTabs; } + +protected: + // List of layers, from front to back. + wxTabLayerList m_layers; + + // Selected tab + int m_tabSelection; + + // Usual tab height + int m_tabHeight; + + // The height of the selected tab + int m_tabSelectionHeight; + + // Usual tab width + int m_tabWidth; + + // Space between tabs + int m_tabHorizontalSpacing; + + // Space between top of normal tab and text + int m_tabVerticalTextSpacing; + + // Horizontal offset of each tab row above the first + int m_tabHorizontalOffset; + + // The distance between the bottom of the first tab row + // and the top of the client area (i.e. the margin) + int m_topMargin; + + // The position and size of the view above which the tabs are placed. + // I.e., the internal client area of the sheet. + wxRect m_tabViewRect; + + // Bitlist of styles + long m_tabStyle; + + // Colours + wxColour m_highlightColour; + wxColour m_shadowColour; + wxColour m_backgroundColour; + wxColour m_textColour; + + // Pen and brush cache + const wxPen* m_highlightPen; + const wxPen* m_shadowPen; + const wxPen* m_backgroundPen; + const wxBrush* m_backgroundBrush; + + wxFont m_tabFont; + wxFont m_tabSelectedFont; + + int m_noTabs; + + wxWindow* m_window; +}; + +/* + * A dialog box class that is tab-friendly + */ + +class WXDLLEXPORT wxTabbedDialog : public wxDialog +{ + DECLARE_DYNAMIC_CLASS(wxTabbedDialog) + +public: + wxTabbedDialog(wxWindow *parent, + wxWindowID id, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long windowStyle = wxDEFAULT_DIALOG_STYLE, + const wxString& name = wxDialogNameStr); + virtual ~wxTabbedDialog(); + + wxTabView *GetTabView() const { return m_tabView; } + void SetTabView(wxTabView *v) { m_tabView = v; } + + void OnCloseWindow(wxCloseEvent& event); + void OnMouseEvent(wxMouseEvent& event); + void OnPaint(wxPaintEvent& event); + +protected: + wxTabView* m_tabView; + +private: + DECLARE_EVENT_TABLE() +}; + +/* + * A panel class that is tab-friendly + */ + +class WXDLLEXPORT wxTabbedPanel : public wxPanel +{ + DECLARE_DYNAMIC_CLASS(wxTabbedPanel) + +public: + wxTabbedPanel(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long windowStyle = 0, + const wxString& name = wxPanelNameStr); + virtual ~wxTabbedPanel(); + + wxTabView *GetTabView() const { return m_tabView; } + void SetTabView(wxTabView *v) { m_tabView = v; } + + void OnMouseEvent(wxMouseEvent& event); + void OnPaint(wxPaintEvent& event); + +protected: + wxTabView* m_tabView; + +private: + DECLARE_EVENT_TABLE() +}; + +WX_DECLARE_HASH_MAP(int, wxWindow*, wxIntegerHash, wxIntegerEqual, + wxIntToWindowHashMap); + +class WXDLLEXPORT wxPanelTabView : public wxTabView +{ + DECLARE_DYNAMIC_CLASS(wxPanelTabView) + +public: + wxPanelTabView(wxPanel *pan, long style = wxTAB_STYLE_DRAW_BOX | wxTAB_STYLE_COLOUR_INTERIOR); + virtual ~wxPanelTabView(void); + + // Called when a tab is activated + virtual void OnTabActivate(int activateId, int deactivateId); + + // Specific to this class + void AddTabWindow(int id, wxWindow *window); + wxWindow *GetTabWindow(int id) const ; + void ClearWindows(bool deleteWindows = true); + wxWindow *GetCurrentWindow() const { return m_currentWindow; } + + void ShowWindowForTab(int id); + // wxList& GetWindows() const { return (wxList&) m_tabWindows; } + +protected: + // List of panels, one for each tab. Indexed + // by tab ID. + wxIntToWindowHashMap m_tabWindows; + wxWindow* m_currentWindow; + wxPanel* m_panel; +}; + +#endif + diff --git a/Externals/wxWidgets/include/wx/generic/textdlgg.h b/Externals/wxWidgets/include/wx/generic/textdlgg.h new file mode 100644 index 0000000000..fab9a10120 --- /dev/null +++ b/Externals/wxWidgets/include/wx/generic/textdlgg.h @@ -0,0 +1,113 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: textdlgg.h +// Purpose: wxTextEntryDialog class +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: textdlgg.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef __TEXTDLGH_G__ +#define __TEXTDLGH_G__ + +#include "wx/defs.h" + +#if wxUSE_TEXTDLG + +#include "wx/dialog.h" + +#if wxUSE_VALIDATORS +#include "wx/valtext.h" +#endif + +class WXDLLIMPEXP_FWD_CORE wxTextCtrl; + +extern WXDLLEXPORT_DATA(const wxChar) wxGetTextFromUserPromptStr[]; +extern WXDLLEXPORT_DATA(const wxChar) wxGetPasswordFromUserPromptStr[]; + +#define wxTextEntryDialogStyle (wxOK | wxCANCEL | wxCENTRE | wxWS_EX_VALIDATE_RECURSIVELY) + +// ---------------------------------------------------------------------------- +// wxTextEntryDialog: a dialog with text control, [ok] and [cancel] buttons +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxTextEntryDialog : public wxDialog +{ +public: + wxTextEntryDialog(wxWindow *parent, + const wxString& message, + const wxString& caption = wxGetTextFromUserPromptStr, + const wxString& value = wxEmptyString, + long style = wxTextEntryDialogStyle, + const wxPoint& pos = wxDefaultPosition); + + void SetValue(const wxString& val); + wxString GetValue() const { return m_value; } + +#if wxUSE_VALIDATORS + void SetTextValidator( const wxTextValidator& validator ); + void SetTextValidator( long style = wxFILTER_NONE ); + wxTextValidator* GetTextValidator() { return (wxTextValidator*)m_textctrl->GetValidator(); } +#endif + // wxUSE_VALIDATORS + + // implementation only + void OnOK(wxCommandEvent& event); + +protected: + wxTextCtrl *m_textctrl; + wxString m_value; + long m_dialogStyle; + +private: + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS(wxTextEntryDialog) + DECLARE_NO_COPY_CLASS(wxTextEntryDialog) +}; + +// ---------------------------------------------------------------------------- +// wxPasswordEntryDialog: dialog with password control, [ok] and [cancel] +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxPasswordEntryDialog : public wxTextEntryDialog +{ +public: + wxPasswordEntryDialog(wxWindow *parent, + const wxString& message, + const wxString& caption = wxGetPasswordFromUserPromptStr, + const wxString& value = wxEmptyString, + long style = wxTextEntryDialogStyle, + const wxPoint& pos = wxDefaultPosition); +private: + DECLARE_DYNAMIC_CLASS(wxPasswordEntryDialog) + DECLARE_NO_COPY_CLASS(wxPasswordEntryDialog) +}; + +// ---------------------------------------------------------------------------- +// function to get a string from user +// ---------------------------------------------------------------------------- + +wxString WXDLLEXPORT +wxGetTextFromUser(const wxString& message, + const wxString& caption = wxGetTextFromUserPromptStr, + const wxString& default_value = wxEmptyString, + wxWindow *parent = (wxWindow *) NULL, + wxCoord x = wxDefaultCoord, + wxCoord y = wxDefaultCoord, + bool centre = true); + +wxString WXDLLEXPORT +wxGetPasswordFromUser(const wxString& message, + const wxString& caption = wxGetPasswordFromUserPromptStr, + const wxString& default_value = wxEmptyString, + wxWindow *parent = (wxWindow *) NULL, + wxCoord x = wxDefaultCoord, + wxCoord y = wxDefaultCoord, + bool centre = true); + +#endif + // wxUSE_TEXTDLG +#endif + // __TEXTDLGH_G__ diff --git a/Externals/wxWidgets/include/wx/generic/timer.h b/Externals/wxWidgets/include/wx/generic/timer.h new file mode 100644 index 0000000000..949b5af9ad --- /dev/null +++ b/Externals/wxWidgets/include/wx/generic/timer.h @@ -0,0 +1,45 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: timer.h +// Purpose: Generic implementation of wxTimer class +// Author: Vaclav Slavik +// Id: $Id: timer.h 41020 2006-09-05 20:47:48Z VZ $ +// Copyright: (c) Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + + +#ifndef __WX_TIMER_H__ +#define __WX_TIMER_H__ + +//----------------------------------------------------------------------------- +// wxTimer +//----------------------------------------------------------------------------- + +class wxTimerDesc; + +class WXDLLEXPORT wxTimer : public wxTimerBase +{ +public: + wxTimer() { Init(); } + wxTimer(wxEvtHandler *owner, int timerid = -1) : wxTimerBase(owner, timerid) + { Init(); } + virtual ~wxTimer(); + + virtual bool Start(int millisecs = -1, bool oneShot = false); + virtual void Stop(); + + virtual bool IsRunning() const; + + // implementation + static void NotifyTimers(); + +protected: + void Init(); + +private: + wxTimerDesc *m_desc; + + DECLARE_ABSTRACT_CLASS(wxTimer) +}; + +#endif // __WX_TIMER_H__ diff --git a/Externals/wxWidgets/include/wx/generic/treectlg.h b/Externals/wxWidgets/include/wx/generic/treectlg.h new file mode 100644 index 0000000000..818c8a31c5 --- /dev/null +++ b/Externals/wxWidgets/include/wx/generic/treectlg.h @@ -0,0 +1,383 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/treectlg.h +// Purpose: wxTreeCtrl class +// Author: Robert Roebling +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: treectlg.h 49804 2007-11-10 01:09:42Z VZ $ +// Copyright: (c) 1997,1998 Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _GENERIC_TREECTRL_H_ +#define _GENERIC_TREECTRL_H_ + +#if wxUSE_TREECTRL + +#include "wx/scrolwin.h" +#include "wx/pen.h" + +// ----------------------------------------------------------------------------- +// forward declaration +// ----------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_CORE wxGenericTreeItem; + +class WXDLLIMPEXP_FWD_CORE wxTreeItemData; + +class WXDLLIMPEXP_FWD_CORE wxTreeRenameTimer; +class WXDLLIMPEXP_FWD_CORE wxTreeFindTimer; +class WXDLLIMPEXP_FWD_CORE wxTreeTextCtrl; +class WXDLLIMPEXP_FWD_CORE wxTextCtrl; + +// ----------------------------------------------------------------------------- +// wxGenericTreeCtrl - the tree control +// ----------------------------------------------------------------------------- + +class WXDLLEXPORT wxGenericTreeCtrl : public wxTreeCtrlBase, + public wxScrollHelper +{ +public: + // creation + // -------- + + wxGenericTreeCtrl() : wxTreeCtrlBase(), wxScrollHelper(this) { Init(); } + + wxGenericTreeCtrl(wxWindow *parent, wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxTR_DEFAULT_STYLE, + const wxValidator &validator = wxDefaultValidator, + const wxString& name = wxTreeCtrlNameStr) + : wxTreeCtrlBase(), + wxScrollHelper(this) + { + Init(); + Create(parent, id, pos, size, style, validator, name); + } + + virtual ~wxGenericTreeCtrl(); + + bool Create(wxWindow *parent, wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxTR_DEFAULT_STYLE, + const wxValidator &validator = wxDefaultValidator, + const wxString& name = wxTreeCtrlNameStr); + + + // implement base class pure virtuals + // ---------------------------------- + + virtual unsigned int GetCount() const; + + virtual unsigned int GetIndent() const { return m_indent; } + virtual void SetIndent(unsigned int indent); + + + virtual void SetImageList(wxImageList *imageList); + virtual void SetStateImageList(wxImageList *imageList); + + virtual wxString GetItemText(const wxTreeItemId& item) const; + virtual int GetItemImage(const wxTreeItemId& item, + wxTreeItemIcon which = wxTreeItemIcon_Normal) const; + virtual wxTreeItemData *GetItemData(const wxTreeItemId& item) const; + virtual wxColour GetItemTextColour(const wxTreeItemId& item) const; + virtual wxColour GetItemBackgroundColour(const wxTreeItemId& item) const; + virtual wxFont GetItemFont(const wxTreeItemId& item) const; + + virtual void SetItemText(const wxTreeItemId& item, const wxString& text); + virtual void SetItemImage(const wxTreeItemId& item, + int image, + wxTreeItemIcon which = wxTreeItemIcon_Normal); + virtual void SetItemData(const wxTreeItemId& item, wxTreeItemData *data); + + virtual void SetItemHasChildren(const wxTreeItemId& item, bool has = true); + virtual void SetItemBold(const wxTreeItemId& item, bool bold = true); + virtual void SetItemDropHighlight(const wxTreeItemId& item, bool highlight = true); + virtual void SetItemTextColour(const wxTreeItemId& item, const wxColour& col); + virtual void SetItemBackgroundColour(const wxTreeItemId& item, const wxColour& col); + virtual void SetItemFont(const wxTreeItemId& item, const wxFont& font); + + virtual bool IsVisible(const wxTreeItemId& item) const; + virtual bool ItemHasChildren(const wxTreeItemId& item) const; + virtual bool IsExpanded(const wxTreeItemId& item) const; + virtual bool IsSelected(const wxTreeItemId& item) const; + virtual bool IsBold(const wxTreeItemId& item) const; + + virtual size_t GetChildrenCount(const wxTreeItemId& item, + bool recursively = true) const; + + // navigation + // ---------- + + virtual wxTreeItemId GetRootItem() const { return m_anchor; } + virtual wxTreeItemId GetSelection() const { return m_current; } + virtual size_t GetSelections(wxArrayTreeItemIds&) const; + + virtual wxTreeItemId GetItemParent(const wxTreeItemId& item) const; + virtual wxTreeItemId GetFirstChild(const wxTreeItemId& item, + wxTreeItemIdValue& cookie) const; + virtual wxTreeItemId GetNextChild(const wxTreeItemId& item, + wxTreeItemIdValue& cookie) const; + virtual wxTreeItemId GetLastChild(const wxTreeItemId& item) const; + virtual wxTreeItemId GetNextSibling(const wxTreeItemId& item) const; + virtual wxTreeItemId GetPrevSibling(const wxTreeItemId& item) const; + + virtual wxTreeItemId GetFirstVisibleItem() const; + virtual wxTreeItemId GetNextVisible(const wxTreeItemId& item) const; + virtual wxTreeItemId GetPrevVisible(const wxTreeItemId& item) const; + + + // operations + // ---------- + + virtual wxTreeItemId AddRoot(const wxString& text, + int image = -1, int selectedImage = -1, + wxTreeItemData *data = NULL); + + virtual void Delete(const wxTreeItemId& item); + virtual void DeleteChildren(const wxTreeItemId& item); + virtual void DeleteAllItems(); + + virtual void Expand(const wxTreeItemId& item); + virtual void Collapse(const wxTreeItemId& item); + virtual void CollapseAndReset(const wxTreeItemId& item); + virtual void Toggle(const wxTreeItemId& item); + + virtual void Unselect(); + virtual void UnselectAll(); + virtual void SelectItem(const wxTreeItemId& item, bool select = true); + + virtual void EnsureVisible(const wxTreeItemId& item); + virtual void ScrollTo(const wxTreeItemId& item); + + virtual wxTextCtrl *EditLabel(const wxTreeItemId& item, + wxClassInfo* textCtrlClass = CLASSINFO(wxTextCtrl)); + virtual wxTextCtrl *GetEditControl() const; + virtual void EndEditLabel(const wxTreeItemId& item, + bool discardChanges = false); + + virtual void SortChildren(const wxTreeItemId& item); + + // items geometry + // -------------- + + virtual bool GetBoundingRect(const wxTreeItemId& item, + wxRect& rect, + bool textOnly = false) const; + + + // this version specific methods + // ----------------------------- + + wxImageList *GetButtonsImageList() const { return m_imageListButtons; } + void SetButtonsImageList(wxImageList *imageList); + void AssignButtonsImageList(wxImageList *imageList); + + void SetDropEffectAboveItem( bool above = false ) { m_dropEffectAboveItem = above; } + bool GetDropEffectAboveItem() const { return m_dropEffectAboveItem; } + + wxTreeItemId GetNext(const wxTreeItemId& item) const; + +#if WXWIN_COMPATIBILITY_2_6 + // use EditLabel() instead + void Edit( const wxTreeItemId& item ) { EditLabel(item); } +#endif // WXWIN_COMPATIBILITY_2_6 + +#if WXWIN_COMPATIBILITY_2_4 + // deprecated functions: use Set/GetItemImage directly + wxDEPRECATED( int GetItemSelectedImage(const wxTreeItemId& item) const ); + wxDEPRECATED( void SetItemSelectedImage(const wxTreeItemId& item, int image) ); + + // use the versions taking wxTreeItemIdValue cookies (note that + // GetNextChild() is not inside wxDEPRECATED on purpose, as otherwise we + // get twice as many warnings without any added benefit: it is always used + // with GetFirstChild() anyhow) + wxDEPRECATED( wxTreeItemId GetFirstChild(const wxTreeItemId& item, + long& cookie) const ); + wxTreeItemId GetNextChild(const wxTreeItemId& item, + long& cookie) const; +#endif // WXWIN_COMPATIBILITY_2_4 + + // implementation only from now on + + // overridden base class virtuals + virtual bool SetBackgroundColour(const wxColour& colour); + virtual bool SetForegroundColour(const wxColour& colour); + + virtual void Freeze(); + virtual void Thaw(); + virtual void Refresh(bool eraseBackground = true, const wxRect *rect = NULL); + + virtual bool SetFont( const wxFont &font ); + virtual void SetWindowStyle(const long styles); + + // callbacks + void OnPaint( wxPaintEvent &event ); + void OnSetFocus( wxFocusEvent &event ); + void OnKillFocus( wxFocusEvent &event ); + void OnChar( wxKeyEvent &event ); + void OnMouse( wxMouseEvent &event ); + void OnGetToolTip( wxTreeEvent &event ); + void OnSize( wxSizeEvent &event ); + void OnInternalIdle( ); + + virtual wxVisualAttributes GetDefaultAttributes() const + { + return GetClassDefaultAttributes(GetWindowVariant()); + } + + static wxVisualAttributes + GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL); + + // implementation helpers + void AdjustMyScrollbars(); + + WX_FORWARD_TO_SCROLL_HELPER() + +protected: + friend class wxGenericTreeItem; + friend class wxTreeRenameTimer; + friend class wxTreeFindTimer; + friend class wxTreeTextCtrl; + + wxFont m_normalFont; + wxFont m_boldFont; + + wxGenericTreeItem *m_anchor; + wxGenericTreeItem *m_current, + *m_key_current, + // A hint to select a parent item after deleting a child + *m_select_me; + unsigned short m_indent; + int m_lineHeight; + wxPen m_dottedPen; + wxBrush *m_hilightBrush, + *m_hilightUnfocusedBrush; + bool m_hasFocus; + bool m_dirty; + bool m_ownsImageListButtons; + bool m_isDragging; // true between BEGIN/END drag events + bool m_lastOnSame; // last click on the same item as prev + wxImageList *m_imageListButtons; + + int m_freezeCount; + int m_dragCount; + wxPoint m_dragStart; + wxGenericTreeItem *m_dropTarget; + wxCursor m_oldCursor; // cursor is changed while dragging + wxGenericTreeItem *m_oldSelection; + wxGenericTreeItem *m_underMouse; // for visual effects + wxTreeTextCtrl *m_textCtrl; + + wxTimer *m_renameTimer; + + // incremental search data + wxString m_findPrefix; + wxTimer *m_findTimer; + + bool m_dropEffectAboveItem; + + // the common part of all ctors + void Init(); + + // misc helpers + void SendDeleteEvent(wxGenericTreeItem *itemBeingDeleted); + + void DrawBorder(const wxTreeItemId& item); + void DrawLine(const wxTreeItemId& item, bool below); + void DrawDropEffect(wxGenericTreeItem *item); + + void DoSelectItem(const wxTreeItemId& id, + bool unselect_others = true, + bool extended_select = false); + + virtual wxTreeItemId DoInsertItem(const wxTreeItemId& parent, + size_t previous, + const wxString& text, + int image, + int selectedImage, + wxTreeItemData *data); + virtual wxTreeItemId DoInsertAfter(const wxTreeItemId& parent, + const wxTreeItemId& idPrevious, + const wxString& text, + int image = -1, int selImage = -1, + wxTreeItemData *data = NULL); + virtual wxTreeItemId DoTreeHitTest(const wxPoint& point, int& flags) const; + + // called by wxTextTreeCtrl when it marks itself for deletion + void ResetTextControl(); + + // find the first item starting with the given prefix after the given item + wxTreeItemId FindItem(const wxTreeItemId& id, const wxString& prefix) const; + + bool HasButtons() const { return HasFlag(wxTR_HAS_BUTTONS); } + + void CalculateLineHeight(); + int GetLineHeight(wxGenericTreeItem *item) const; + void PaintLevel( wxGenericTreeItem *item, wxDC& dc, int level, int &y ); + void PaintItem( wxGenericTreeItem *item, wxDC& dc); + + void CalculateLevel( wxGenericTreeItem *item, wxDC &dc, int level, int &y ); + void CalculatePositions(); + void CalculateSize( wxGenericTreeItem *item, wxDC &dc ); + + void RefreshSubtree( wxGenericTreeItem *item ); + void RefreshLine( wxGenericTreeItem *item ); + + // redraw all selected items + void RefreshSelected(); + + // RefreshSelected() recursive helper + void RefreshSelectedUnder(wxGenericTreeItem *item); + + void OnRenameTimer(); + bool OnRenameAccept(wxGenericTreeItem *item, const wxString& value); + void OnRenameCancelled(wxGenericTreeItem *item); + + void FillArray(wxGenericTreeItem*, wxArrayTreeItemIds&) const; + void SelectItemRange( wxGenericTreeItem *item1, wxGenericTreeItem *item2 ); + bool TagAllChildrenUntilLast(wxGenericTreeItem *crt_item, wxGenericTreeItem *last_item, bool select); + bool TagNextChildren(wxGenericTreeItem *crt_item, wxGenericTreeItem *last_item, bool select); + void UnselectAllChildren( wxGenericTreeItem *item ); + void ChildrenClosing(wxGenericTreeItem* item); + + void DoDirtyProcessing(); + + virtual wxSize DoGetBestSize() const; + +private: + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS(wxGenericTreeCtrl) + DECLARE_NO_COPY_CLASS(wxGenericTreeCtrl) +}; + +#if !defined(__WXMSW__) || defined(__WXUNIVERSAL__) +/* + * wxTreeCtrl has to be a real class or we have problems with + * the run-time information. + */ + +class WXDLLEXPORT wxTreeCtrl: public wxGenericTreeCtrl +{ + DECLARE_DYNAMIC_CLASS(wxTreeCtrl) + +public: + wxTreeCtrl() {} + + wxTreeCtrl(wxWindow *parent, wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxTR_DEFAULT_STYLE, + const wxValidator &validator = wxDefaultValidator, + const wxString& name = wxTreeCtrlNameStr) + : wxGenericTreeCtrl(parent, id, pos, size, style, validator, name) + { + } +}; +#endif // !__WXMSW__ || __WXUNIVERSAL__ + +#endif // wxUSE_TREECTRL + +#endif // _GENERIC_TREECTRL_H_ diff --git a/Externals/wxWidgets/include/wx/generic/wizard.h b/Externals/wxWidgets/include/wx/generic/wizard.h new file mode 100644 index 0000000000..69e1f8050e --- /dev/null +++ b/Externals/wxWidgets/include/wx/generic/wizard.h @@ -0,0 +1,142 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/generic/wizard.h +// Purpose: declaration of generic wxWizard class +// Author: Vadim Zeitlin +// Modified by: Robert Vazan (sizers) +// Created: 28.09.99 +// RCS-ID: $Id: wizard.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) 1999 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GENERIC_WIZARD_H_ +#define _WX_GENERIC_WIZARD_H_ + +// ---------------------------------------------------------------------------- +// wxWizard +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_CORE wxButton; +class WXDLLIMPEXP_FWD_CORE wxStaticBitmap; +class WXDLLIMPEXP_FWD_ADV wxWizardEvent; +class WXDLLIMPEXP_FWD_CORE wxBoxSizer; +class WXDLLIMPEXP_FWD_ADV wxWizardSizer; + +class WXDLLIMPEXP_ADV wxWizard : public wxWizardBase +{ +public: + // ctor + wxWizard() { Init(); } + wxWizard(wxWindow *parent, + int id = wxID_ANY, + const wxString& title = wxEmptyString, + const wxBitmap& bitmap = wxNullBitmap, + const wxPoint& pos = wxDefaultPosition, + long style = wxDEFAULT_DIALOG_STYLE) + { + Init(); + Create(parent, id, title, bitmap, pos, style); + } + bool Create(wxWindow *parent, + int id = wxID_ANY, + const wxString& title = wxEmptyString, + const wxBitmap& bitmap = wxNullBitmap, + const wxPoint& pos = wxDefaultPosition, + long style = wxDEFAULT_DIALOG_STYLE); + void Init(); + +#if wxABI_VERSION >= 20804 + virtual ~wxWizard(); +#endif + + // implement base class pure virtuals + virtual bool RunWizard(wxWizardPage *firstPage); + virtual wxWizardPage *GetCurrentPage() const; + virtual void SetPageSize(const wxSize& size); + virtual wxSize GetPageSize() const; + virtual void FitToPage(const wxWizardPage *firstPage); + virtual wxSizer *GetPageAreaSizer() const; + virtual void SetBorder(int border); + + /// set/get bitmap +#if wxABI_VERSION >= 20805 + const wxBitmap& GetBitmap() const { return m_bitmap; } + void SetBitmap(const wxBitmap& bitmap); +#endif + + // implementation only from now on + // ------------------------------- + + // is the wizard running? + bool IsRunning() const { return m_page != NULL; } + + // show the prev/next page, but call TransferDataFromWindow on the current + // page first and return false without changing the page if + // TransferDataFromWindow() returns false - otherwise, returns true + bool ShowPage(wxWizardPage *page, bool goingForward = true); + + // do fill the dialog with controls + // this is app-overridable to, for example, set help and tooltip text + virtual void DoCreateControls(); + +protected: + // for compatibility only, doesn't do anything any more + void FinishLayout() { } + +private: + // was the dialog really created? + bool WasCreated() const { return m_btnPrev != NULL; } + + // event handlers + void OnCancel(wxCommandEvent& event); + void OnBackOrNext(wxCommandEvent& event); + void OnHelp(wxCommandEvent& event); + + void OnWizEvent(wxWizardEvent& event); + + void AddBitmapRow(wxBoxSizer *mainColumn); + void AddStaticLine(wxBoxSizer *mainColumn); + void AddBackNextPair(wxBoxSizer *buttonRow); + void AddButtonRow(wxBoxSizer *mainColumn); + + // the page size requested by user + wxSize m_sizePage; + + // the dialog position from the ctor + wxPoint m_posWizard; + + // wizard state + wxWizardPage *m_page; // the current page or NULL + wxBitmap m_bitmap; // the default bitmap to show + + // wizard controls + wxButton *m_btnPrev, // the "" or "Finish" button + wxStaticBitmap *m_statbmp; // the control for the bitmap + + // Border around page area sizer requested using SetBorder() + int m_border; + + // Whether RunWizard() was called + bool m_started; + + // Whether was modal (modeless has to be destroyed on finish or cancel) + bool m_wasModal; + + // True if pages are laid out using the sizer + bool m_usingSizer; + + // Page area sizer will be inserted here with padding + wxBoxSizer *m_sizerBmpAndPage; + + // Actual position and size of pages + wxWizardSizer *m_sizerPage; + + friend class wxWizardSizer; + + DECLARE_DYNAMIC_CLASS(wxWizard) + DECLARE_EVENT_TABLE() + DECLARE_NO_COPY_CLASS(wxWizard) +}; + +#endif // _WX_GENERIC_WIZARD_H_ diff --git a/Externals/wxWidgets/include/wx/geometry.h b/Externals/wxWidgets/include/wx/geometry.h new file mode 100644 index 0000000000..29af95f252 --- /dev/null +++ b/Externals/wxWidgets/include/wx/geometry.h @@ -0,0 +1,814 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/geometry.h +// Purpose: Common Geometry Classes +// Author: Stefan Csomor +// Modified by: +// Created: 08/05/99 +// RCS-ID: $Id: geometry.h 49294 2007-10-21 17:59:09Z SC $ +// Copyright: (c) 1999 Stefan Csomor +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GEOMETRY_H_ +#define _WX_GEOMETRY_H_ + +#include "wx/defs.h" + +#if wxUSE_GEOMETRY + +#include "wx/utils.h" +#include "wx/gdicmn.h" +#include "wx/math.h" + +class WXDLLIMPEXP_BASE wxDataInputStream; +class WXDLLIMPEXP_BASE wxDataOutputStream; + +// clipping from Cohen-Sutherland + +enum wxOutCode +{ + wxInside = 0x00 , + wxOutLeft = 0x01 , + wxOutRight = 0x02 , + wxOutTop = 0x08 , + wxOutBottom = 0x04 +}; + +class WXDLLEXPORT wxPoint2DInt +{ +public : + inline wxPoint2DInt(); + inline wxPoint2DInt( wxInt32 x , wxInt32 y ); + inline wxPoint2DInt( const wxPoint2DInt &pt ); + inline wxPoint2DInt( const wxPoint &pt ); + + // noops for this class, just return the coords + inline void GetFloor( wxInt32 *x , wxInt32 *y ) const; + inline void GetRounded( wxInt32 *x , wxInt32 *y ) const; + + inline wxDouble GetVectorLength() const; + wxDouble GetVectorAngle() const; + inline void SetVectorLength( wxDouble length ); + void SetVectorAngle( wxDouble degrees ); + void SetPolarCoordinates( wxInt32 angle , wxInt32 length ); + // set the vector length to 1.0, preserving the angle + inline void Normalize(); + + inline wxDouble GetDistance( const wxPoint2DInt &pt ) const; + inline wxDouble GetDistanceSquare( const wxPoint2DInt &pt ) const; + inline wxInt32 GetDotProduct( const wxPoint2DInt &vec ) const; + inline wxInt32 GetCrossProduct( const wxPoint2DInt &vec ) const; + + // the reflection of this point + inline wxPoint2DInt operator-(); + + inline wxPoint2DInt& operator=(const wxPoint2DInt& pt); + inline wxPoint2DInt& operator+=(const wxPoint2DInt& pt); + inline wxPoint2DInt& operator-=(const wxPoint2DInt& pt); + inline wxPoint2DInt& operator*=(const wxPoint2DInt& pt); + inline wxPoint2DInt& operator*=(wxDouble n); + inline wxPoint2DInt& operator*=(wxInt32 n); + inline wxPoint2DInt& operator/=(const wxPoint2DInt& pt); + inline wxPoint2DInt& operator/=(wxDouble n); + inline wxPoint2DInt& operator/=(wxInt32 n); + inline operator wxPoint() const; + inline bool operator==(const wxPoint2DInt& pt) const; + inline bool operator!=(const wxPoint2DInt& pt) const; + +#if wxUSE_STREAMS + void WriteTo( wxDataOutputStream &stream ) const; + void ReadFrom( wxDataInputStream &stream ); +#endif // wxUSE_STREAMS + + wxInt32 m_x; + wxInt32 m_y; +}; + +inline wxPoint2DInt operator+(const wxPoint2DInt& pt1 , const wxPoint2DInt& pt2); +inline wxPoint2DInt operator-(const wxPoint2DInt& pt1 , const wxPoint2DInt& pt2); +inline wxPoint2DInt operator*(const wxPoint2DInt& pt1 , const wxPoint2DInt& pt2); +inline wxPoint2DInt operator*(wxInt32 n , const wxPoint2DInt& pt); +inline wxPoint2DInt operator*(wxInt32 n , const wxPoint2DInt& pt); +inline wxPoint2DInt operator*(const wxPoint2DInt& pt , wxInt32 n); +inline wxPoint2DInt operator*(const wxPoint2DInt& pt , wxInt32 n); +inline wxPoint2DInt operator/(const wxPoint2DInt& pt1 , const wxPoint2DInt& pt2); +inline wxPoint2DInt operator/(const wxPoint2DInt& pt , wxInt32 n); +inline wxPoint2DInt operator/(const wxPoint2DInt& pt , wxInt32 n); + +inline wxPoint2DInt::wxPoint2DInt() +{ + m_x = 0; + m_y = 0; +} + +inline wxPoint2DInt::wxPoint2DInt( wxInt32 x , wxInt32 y ) +{ + m_x = x; + m_y = y; +} + +inline wxPoint2DInt::wxPoint2DInt( const wxPoint2DInt &pt ) +{ + m_x = pt.m_x; + m_y = pt.m_y; +} + +inline wxPoint2DInt::wxPoint2DInt( const wxPoint &pt ) +{ + m_x = pt.x; + m_y = pt.y; +} + +inline void wxPoint2DInt::GetFloor( wxInt32 *x , wxInt32 *y ) const +{ + if ( x ) + *x = m_x; + if ( y ) + *y = m_y; +} + +inline void wxPoint2DInt::GetRounded( wxInt32 *x , wxInt32 *y ) const +{ + GetFloor(x, y); +} + +inline wxDouble wxPoint2DInt::GetVectorLength() const +{ + // cast needed MIPSpro compiler under SGI + return sqrt( (double)(m_x)*(m_x) + (m_y)*(m_y) ); +} + +inline void wxPoint2DInt::SetVectorLength( wxDouble length ) +{ + wxDouble before = GetVectorLength(); + m_x = (wxInt32)(m_x * length / before); + m_y = (wxInt32)(m_y * length / before); +} + +inline void wxPoint2DInt::Normalize() +{ + SetVectorLength( 1 ); +} + +inline wxDouble wxPoint2DInt::GetDistance( const wxPoint2DInt &pt ) const +{ + return sqrt( GetDistanceSquare( pt ) ); +} + +inline wxDouble wxPoint2DInt::GetDistanceSquare( const wxPoint2DInt &pt ) const +{ + return ( (wxDouble)(pt.m_x-m_x)*(pt.m_x-m_x) + (wxDouble)(pt.m_y-m_y)*(pt.m_y-m_y) ); +} + +inline wxInt32 wxPoint2DInt::GetDotProduct( const wxPoint2DInt &vec ) const +{ + return ( m_x * vec.m_x + m_y * vec.m_y ); +} + +inline wxInt32 wxPoint2DInt::GetCrossProduct( const wxPoint2DInt &vec ) const +{ + return ( m_x * vec.m_y - vec.m_x * m_y ); +} + +inline wxPoint2DInt::operator wxPoint() const +{ + return wxPoint( m_x, m_y); +} + +inline wxPoint2DInt wxPoint2DInt::operator-() +{ + return wxPoint2DInt( -m_x, -m_y); +} + +inline wxPoint2DInt& wxPoint2DInt::operator=(const wxPoint2DInt& pt) +{ + m_x = pt.m_x; + m_y = pt.m_y; + return *this; +} + +inline wxPoint2DInt& wxPoint2DInt::operator+=(const wxPoint2DInt& pt) +{ + m_x = m_x + pt.m_x; + m_y = m_y + pt.m_y; + return *this; +} + +inline wxPoint2DInt& wxPoint2DInt::operator-=(const wxPoint2DInt& pt) +{ + m_x = m_x - pt.m_x; + m_y = m_y - pt.m_y; + return *this; +} + +inline wxPoint2DInt& wxPoint2DInt::operator*=(const wxPoint2DInt& pt) +{ + m_x = m_x + pt.m_x; + m_y = m_y + pt.m_y; + return *this; +} + +inline wxPoint2DInt& wxPoint2DInt::operator/=(const wxPoint2DInt& pt) +{ + m_x = m_x - pt.m_x; + m_y = m_y - pt.m_y; + return *this; +} + +inline bool wxPoint2DInt::operator==(const wxPoint2DInt& pt) const +{ + return m_x == pt.m_x && m_y == pt.m_y; +} + +inline bool wxPoint2DInt::operator!=(const wxPoint2DInt& pt) const +{ + return m_x != pt.m_x || m_y != pt.m_y; +} + +inline wxPoint2DInt operator+(const wxPoint2DInt& pt1 , const wxPoint2DInt& pt2) +{ + return wxPoint2DInt( pt1.m_x + pt2.m_x , pt1.m_y + pt2.m_y ); +} + +inline wxPoint2DInt operator-(const wxPoint2DInt& pt1 , const wxPoint2DInt& pt2) +{ + return wxPoint2DInt( pt1.m_x - pt2.m_x , pt1.m_y - pt2.m_y ); +} + + +inline wxPoint2DInt operator*(const wxPoint2DInt& pt1 , const wxPoint2DInt& pt2) +{ + return wxPoint2DInt( pt1.m_x * pt2.m_x , pt1.m_y * pt2.m_y ); +} + +inline wxPoint2DInt operator*(wxInt32 n , const wxPoint2DInt& pt) +{ + return wxPoint2DInt( pt.m_x * n , pt.m_y * n ); +} + +inline wxPoint2DInt operator*(wxDouble n , const wxPoint2DInt& pt) +{ + return wxPoint2DInt( (int) (pt.m_x * n) , (int) (pt.m_y * n) ); +} + +inline wxPoint2DInt operator*(const wxPoint2DInt& pt , wxInt32 n) +{ + return wxPoint2DInt( pt.m_x * n , pt.m_y * n ); +} + +inline wxPoint2DInt operator*(const wxPoint2DInt& pt , wxDouble n) +{ + return wxPoint2DInt( (int) (pt.m_x * n) , (int) (pt.m_y * n) ); +} + +inline wxPoint2DInt operator/(const wxPoint2DInt& pt1 , const wxPoint2DInt& pt2) +{ + return wxPoint2DInt( pt1.m_x / pt2.m_x , pt1.m_y / pt2.m_y ); +} + +inline wxPoint2DInt operator/(const wxPoint2DInt& pt , wxInt32 n) +{ + return wxPoint2DInt( pt.m_x / n , pt.m_y / n ); +} + +inline wxPoint2DInt operator/(const wxPoint2DInt& pt , wxDouble n) +{ + return wxPoint2DInt( (int) (pt.m_x / n) , (int) (pt.m_y / n) ); +} + +// wxPoint2Ds represent a point or a vector in a 2d coordinate system + +class WXDLLEXPORT wxPoint2DDouble +{ +public : + inline wxPoint2DDouble(); + inline wxPoint2DDouble( wxDouble x , wxDouble y ); + inline wxPoint2DDouble( const wxPoint2DDouble &pt ); + wxPoint2DDouble( const wxPoint2DInt &pt ) + { m_x = (wxDouble) pt.m_x ; m_y = (wxDouble) pt.m_y ; } + wxPoint2DDouble( const wxPoint &pt ) + { m_x = (wxDouble) pt.x ; m_y = (wxDouble) pt.y ; } + + // two different conversions to integers, floor and rounding + inline void GetFloor( wxInt32 *x , wxInt32 *y ) const; + inline void GetRounded( wxInt32 *x , wxInt32 *y ) const; + + inline wxDouble GetVectorLength() const; + wxDouble GetVectorAngle() const ; + void SetVectorLength( wxDouble length ); + void SetVectorAngle( wxDouble degrees ); + void SetPolarCoordinates( wxDouble angle , wxDouble length ); + // set the vector length to 1.0, preserving the angle + void Normalize(); + + inline wxDouble GetDistance( const wxPoint2DDouble &pt ) const; + inline wxDouble GetDistanceSquare( const wxPoint2DDouble &pt ) const; + inline wxDouble GetDotProduct( const wxPoint2DDouble &vec ) const; + inline wxDouble GetCrossProduct( const wxPoint2DDouble &vec ) const; + + // the reflection of this point + inline wxPoint2DDouble operator-(); + + inline wxPoint2DDouble& operator=(const wxPoint2DDouble& pt); + inline wxPoint2DDouble& operator+=(const wxPoint2DDouble& pt); + inline wxPoint2DDouble& operator-=(const wxPoint2DDouble& pt); + inline wxPoint2DDouble& operator*=(const wxPoint2DDouble& pt); + inline wxPoint2DDouble& operator*=(wxDouble n); + inline wxPoint2DDouble& operator*=(wxInt32 n); + inline wxPoint2DDouble& operator/=(const wxPoint2DDouble& pt); + inline wxPoint2DDouble& operator/=(wxDouble n); + inline wxPoint2DDouble& operator/=(wxInt32 n); + + inline bool operator==(const wxPoint2DDouble& pt) const; + inline bool operator!=(const wxPoint2DDouble& pt) const; + + wxDouble m_x; + wxDouble m_y; +}; + +inline wxPoint2DDouble operator+(const wxPoint2DDouble& pt1 , const wxPoint2DDouble& pt2); +inline wxPoint2DDouble operator-(const wxPoint2DDouble& pt1 , const wxPoint2DDouble& pt2); +inline wxPoint2DDouble operator*(const wxPoint2DDouble& pt1 , const wxPoint2DDouble& pt2); +inline wxPoint2DDouble operator*(wxDouble n , const wxPoint2DDouble& pt); +inline wxPoint2DDouble operator*(wxInt32 n , const wxPoint2DDouble& pt); +inline wxPoint2DDouble operator*(const wxPoint2DDouble& pt , wxDouble n); +inline wxPoint2DDouble operator*(const wxPoint2DDouble& pt , wxInt32 n); +inline wxPoint2DDouble operator/(const wxPoint2DDouble& pt1 , const wxPoint2DDouble& pt2); +inline wxPoint2DDouble operator/(const wxPoint2DDouble& pt , wxDouble n); +inline wxPoint2DDouble operator/(const wxPoint2DDouble& pt , wxInt32 n); + +inline wxPoint2DDouble::wxPoint2DDouble() +{ + m_x = 0.0; + m_y = 0.0; +} + +inline wxPoint2DDouble::wxPoint2DDouble( wxDouble x , wxDouble y ) +{ + m_x = x; + m_y = y; +} + +inline wxPoint2DDouble::wxPoint2DDouble( const wxPoint2DDouble &pt ) +{ + m_x = pt.m_x; + m_y = pt.m_y; +} + +inline void wxPoint2DDouble::GetFloor( wxInt32 *x , wxInt32 *y ) const +{ + *x = (wxInt32) floor( m_x ); + *y = (wxInt32) floor( m_y ); +} + +inline void wxPoint2DDouble::GetRounded( wxInt32 *x , wxInt32 *y ) const +{ + *x = (wxInt32) floor( m_x + 0.5 ); + *y = (wxInt32) floor( m_y + 0.5); +} + +inline wxDouble wxPoint2DDouble::GetVectorLength() const +{ + return sqrt( (m_x)*(m_x) + (m_y)*(m_y) ) ; +} + +inline void wxPoint2DDouble::SetVectorLength( wxDouble length ) +{ + wxDouble before = GetVectorLength() ; + m_x = (m_x * length / before) ; + m_y = (m_y * length / before) ; +} + +inline void wxPoint2DDouble::Normalize() +{ + SetVectorLength( 1 ); +} + +inline wxDouble wxPoint2DDouble::GetDistance( const wxPoint2DDouble &pt ) const +{ + return sqrt( GetDistanceSquare( pt ) ); +} + +inline wxDouble wxPoint2DDouble::GetDistanceSquare( const wxPoint2DDouble &pt ) const +{ + return ( (pt.m_x-m_x)*(pt.m_x-m_x) + (pt.m_y-m_y)*(pt.m_y-m_y) ); +} + +inline wxDouble wxPoint2DDouble::GetDotProduct( const wxPoint2DDouble &vec ) const +{ + return ( m_x * vec.m_x + m_y * vec.m_y ); +} + +inline wxDouble wxPoint2DDouble::GetCrossProduct( const wxPoint2DDouble &vec ) const +{ + return ( m_x * vec.m_y - vec.m_x * m_y ); +} + +inline wxPoint2DDouble wxPoint2DDouble::operator-() +{ + return wxPoint2DDouble( -m_x, -m_y); +} + +inline wxPoint2DDouble& wxPoint2DDouble::operator=(const wxPoint2DDouble& pt) +{ + m_x = pt.m_x; + m_y = pt.m_y; + return *this; +} + +inline wxPoint2DDouble& wxPoint2DDouble::operator+=(const wxPoint2DDouble& pt) +{ + m_x = m_x + pt.m_x; + m_y = m_y + pt.m_y; + return *this; +} + +inline wxPoint2DDouble& wxPoint2DDouble::operator-=(const wxPoint2DDouble& pt) +{ + m_x = m_x - pt.m_x; + m_y = m_y - pt.m_y; + return *this; +} + +inline wxPoint2DDouble& wxPoint2DDouble::operator*=(const wxPoint2DDouble& pt) +{ + m_x = m_x * pt.m_x; + m_y = m_y * pt.m_y; + return *this; +} + +inline wxPoint2DDouble& wxPoint2DDouble::operator/=(const wxPoint2DDouble& pt) +{ + m_x = m_x / pt.m_x; + m_y = m_y / pt.m_y; + return *this; +} + +inline bool wxPoint2DDouble::operator==(const wxPoint2DDouble& pt) const +{ + return wxIsSameDouble(m_x, pt.m_x) && wxIsSameDouble(m_y, pt.m_y); +} + +inline bool wxPoint2DDouble::operator!=(const wxPoint2DDouble& pt) const +{ + return !(*this == pt); +} + +inline wxPoint2DDouble operator+(const wxPoint2DDouble& pt1 , const wxPoint2DDouble& pt2) +{ + return wxPoint2DDouble( pt1.m_x + pt2.m_x , pt1.m_y + pt2.m_y ); +} + +inline wxPoint2DDouble operator-(const wxPoint2DDouble& pt1 , const wxPoint2DDouble& pt2) +{ + return wxPoint2DDouble( pt1.m_x - pt2.m_x , pt1.m_y - pt2.m_y ); +} + + +inline wxPoint2DDouble operator*(const wxPoint2DDouble& pt1 , const wxPoint2DDouble& pt2) +{ + return wxPoint2DDouble( pt1.m_x * pt2.m_x , pt1.m_y * pt2.m_y ); +} + +inline wxPoint2DDouble operator*(wxDouble n , const wxPoint2DDouble& pt) +{ + return wxPoint2DDouble( pt.m_x * n , pt.m_y * n ); +} + +inline wxPoint2DDouble operator*(wxInt32 n , const wxPoint2DDouble& pt) +{ + return wxPoint2DDouble( pt.m_x * n , pt.m_y * n ); +} + +inline wxPoint2DDouble operator*(const wxPoint2DDouble& pt , wxDouble n) +{ + return wxPoint2DDouble( pt.m_x * n , pt.m_y * n ); +} + +inline wxPoint2DDouble operator*(const wxPoint2DDouble& pt , wxInt32 n) +{ + return wxPoint2DDouble( pt.m_x * n , pt.m_y * n ); +} + +inline wxPoint2DDouble operator/(const wxPoint2DDouble& pt1 , const wxPoint2DDouble& pt2) +{ + return wxPoint2DDouble( pt1.m_x / pt2.m_x , pt1.m_y / pt2.m_y ); +} + +inline wxPoint2DDouble operator/(const wxPoint2DDouble& pt , wxDouble n) +{ + return wxPoint2DDouble( pt.m_x / n , pt.m_y / n ); +} + +inline wxPoint2DDouble operator/(const wxPoint2DDouble& pt , wxInt32 n) +{ + return wxPoint2DDouble( pt.m_x / n , pt.m_y / n ); +} + +// wxRect2Ds are a axis-aligned rectangles, each side of the rect is parallel to the x- or m_y- axis. The rectangle is either defined by the +// top left and bottom right corner, or by the top left corner and size. A point is contained within the rectangle if +// left <= x < right and top <= m_y < bottom , thus it is a half open interval. + +class WXDLLEXPORT wxRect2DDouble +{ +public: + wxRect2DDouble() + { m_x = m_y = m_width = m_height = 0; } + wxRect2DDouble(wxDouble x, wxDouble y, wxDouble w, wxDouble h) + { m_x = x; m_y = y; m_width = w; m_height = h; } +/* + wxRect2DDouble(const wxPoint2DDouble& topLeft, const wxPoint2DDouble& bottomRight); + wxRect2DDouble(const wxPoint2DDouble& pos, const wxSize& size); + wxRect2DDouble(const wxRect2DDouble& rect); +*/ + // single attribute accessors + + inline wxPoint2DDouble GetPosition() + { return wxPoint2DDouble(m_x, m_y); } + inline wxSize GetSize() + { return wxSize((int) m_width, (int) m_height); } + + // for the edge and corner accessors there are two setters conterparts, the Set.. functions keep the other corners at their + // position whenever sensible, the Move.. functions keep the size of the rect and move the other corners apropriately + + inline wxDouble GetLeft() const { return m_x; } + inline void SetLeft( wxDouble n ) { m_width += m_x - n; m_x = n; } + inline void MoveLeftTo( wxDouble n ) { m_x = n; } + inline wxDouble GetTop() const { return m_y; } + inline void SetTop( wxDouble n ) { m_height += m_y - n; m_y = n; } + inline void MoveTopTo( wxDouble n ) { m_y = n; } + inline wxDouble GetBottom() const { return m_y + m_height; } + inline void SetBottom( wxDouble n ) { m_height += n - (m_y+m_height);} + inline void MoveBottomTo( wxDouble n ) { m_y = n - m_height; } + inline wxDouble GetRight() const { return m_x + m_width; } + inline void SetRight( wxDouble n ) { m_width += n - (m_x+m_width) ; } + inline void MoveRightTo( wxDouble n ) { m_x = n - m_width; } + + inline wxPoint2DDouble GetLeftTop() const + { return wxPoint2DDouble( m_x , m_y ); } + inline void SetLeftTop( const wxPoint2DDouble &pt ) + { m_width += m_x - pt.m_x; m_height += m_y - pt.m_y; m_x = pt.m_x; m_y = pt.m_y; } + inline void MoveLeftTopTo( const wxPoint2DDouble &pt ) + { m_x = pt.m_x; m_y = pt.m_y; } + inline wxPoint2DDouble GetLeftBottom() const + { return wxPoint2DDouble( m_x , m_y + m_height ); } + inline void SetLeftBottom( const wxPoint2DDouble &pt ) + { m_width += m_x - pt.m_x; m_height += pt.m_y - (m_y+m_height) ; m_x = pt.m_x; } + inline void MoveLeftBottomTo( const wxPoint2DDouble &pt ) + { m_x = pt.m_x; m_y = pt.m_y - m_height; } + inline wxPoint2DDouble GetRightTop() const + { return wxPoint2DDouble( m_x+m_width , m_y ); } + inline void SetRightTop( const wxPoint2DDouble &pt ) + { m_width += pt.m_x - ( m_x + m_width ); m_height += m_y - pt.m_y; m_y = pt.m_y; } + inline void MoveRightTopTo( const wxPoint2DDouble &pt ) + { m_x = pt.m_x - m_width; m_y = pt.m_y; } + inline wxPoint2DDouble GetRightBottom() const + { return wxPoint2DDouble( m_x+m_width , m_y + m_height ); } + inline void SetRightBottom( const wxPoint2DDouble &pt ) + { m_width += pt.m_x - ( m_x + m_width ); m_height += pt.m_y - (m_y+m_height);} + inline void MoveRightBottomTo( const wxPoint2DDouble &pt ) + { m_x = pt.m_x - m_width; m_y = pt.m_y - m_height; } + inline wxPoint2DDouble GetCentre() const + { return wxPoint2DDouble( m_x+m_width/2 , m_y+m_height/2 ); } + inline void SetCentre( const wxPoint2DDouble &pt ) + { MoveCentreTo( pt ); } // since this is impossible without moving... + inline void MoveCentreTo( const wxPoint2DDouble &pt ) + { m_x += pt.m_x - (m_x+m_width/2) , m_y += pt.m_y -(m_y+m_height/2); } + inline wxOutCode GetOutCode( const wxPoint2DDouble &pt ) const + { return (wxOutCode) (( ( pt.m_x < m_x ) ? wxOutLeft : 0 ) + + ( ( pt.m_x > m_x + m_width ) ? wxOutRight : 0 ) + + ( ( pt.m_y < m_y ) ? wxOutTop : 0 ) + + ( ( pt.m_y > m_y + m_height ) ? wxOutBottom : 0 )); } + inline wxOutCode GetOutcode(const wxPoint2DDouble &pt) const + { return GetOutCode(pt) ; } + inline bool Contains( const wxPoint2DDouble &pt ) const + { return GetOutCode( pt ) == wxInside; } + inline bool Contains( const wxRect2DDouble &rect ) const + { return ( ( ( m_x <= rect.m_x ) && ( rect.m_x + rect.m_width <= m_x + m_width ) ) && + ( ( m_y <= rect.m_y ) && ( rect.m_y + rect.m_height <= m_y + m_height ) ) ); } + inline bool IsEmpty() const + { return m_width <= 0 || m_height <= 0; } + inline bool HaveEqualSize( const wxRect2DDouble &rect ) const + { return wxIsSameDouble(rect.m_width, m_width) && wxIsSameDouble(rect.m_height, m_height); } + + inline void Inset( wxDouble x , wxDouble y ) + { m_x += x; m_y += y; m_width -= 2 * x; m_height -= 2 * y; } + inline void Inset( wxDouble left , wxDouble top ,wxDouble right , wxDouble bottom ) + { m_x += left; m_y += top; m_width -= left + right; m_height -= top + bottom;} + inline void Offset( const wxPoint2DDouble &pt ) + { m_x += pt.m_x; m_y += pt.m_y; } + + void ConstrainTo( const wxRect2DDouble &rect ); + + inline wxPoint2DDouble Interpolate( wxInt32 widthfactor , wxInt32 heightfactor ) + { return wxPoint2DDouble( m_x + m_width * widthfactor , m_y + m_height * heightfactor ); } + + static void Intersect( const wxRect2DDouble &src1 , const wxRect2DDouble &src2 , wxRect2DDouble *dest ); + inline void Intersect( const wxRect2DDouble &otherRect ) + { Intersect( *this , otherRect , this ); } + inline wxRect2DDouble CreateIntersection( const wxRect2DDouble &otherRect ) const + { wxRect2DDouble result; Intersect( *this , otherRect , &result); return result; } + bool Intersects( const wxRect2DDouble &rect ) const; + + static void Union( const wxRect2DDouble &src1 , const wxRect2DDouble &src2 , wxRect2DDouble *dest ); + void Union( const wxRect2DDouble &otherRect ) + { Union( *this , otherRect , this ); } + void Union( const wxPoint2DDouble &pt ); + inline wxRect2DDouble CreateUnion( const wxRect2DDouble &otherRect ) const + { wxRect2DDouble result; Union( *this , otherRect , &result); return result; } + + inline void Scale( wxDouble f ) + { m_x *= f; m_y *= f; m_width *= f; m_height *= f;} + inline void Scale( wxInt32 num , wxInt32 denum ) + { m_x *= ((wxDouble)num)/((wxDouble)denum); m_y *= ((wxDouble)num)/((wxDouble)denum); + m_width *= ((wxDouble)num)/((wxDouble)denum); m_height *= ((wxDouble)num)/((wxDouble)denum);} + + wxRect2DDouble& operator = (const wxRect2DDouble& rect); + inline bool operator == (const wxRect2DDouble& rect) const + { return wxIsSameDouble(m_x, rect.m_x) && wxIsSameDouble(m_y, rect.m_y) && HaveEqualSize(rect); } + inline bool operator != (const wxRect2DDouble& rect) const + { return !(*this == rect); } + + wxDouble m_x; + wxDouble m_y; + wxDouble m_width; + wxDouble m_height; +}; + + +// wxRect2Ds are a axis-aligned rectangles, each side of the rect is parallel to the x- or m_y- axis. The rectangle is either defined by the +// top left and bottom right corner, or by the top left corner and size. A point is contained within the rectangle if +// left <= x < right and top <= m_y < bottom , thus it is a half open interval. + +class WXDLLEXPORT wxRect2DInt +{ +public: + wxRect2DInt() { m_x = m_y = m_width = m_height = 0; } + wxRect2DInt( const wxRect& r ) { m_x = r.x ; m_y = r.y ; m_width = r.width ; m_height = r.height ; } + wxRect2DInt(wxInt32 x, wxInt32 y, wxInt32 w, wxInt32 h) { m_x = x; m_y = y; m_width = w; m_height = h; } + wxRect2DInt(const wxPoint2DInt& topLeft, const wxPoint2DInt& bottomRight); + inline wxRect2DInt(const wxPoint2DInt& pos, const wxSize& size); + inline wxRect2DInt(const wxRect2DInt& rect); + + // single attribute accessors + + inline wxPoint2DInt GetPosition() { return wxPoint2DInt(m_x, m_y); } + inline wxSize GetSize() { return wxSize(m_width, m_height); } + + // for the edge and corner accessors there are two setters conterparts, the Set.. functions keep the other corners at their + // position whenever sensible, the Move.. functions keep the size of the rect and move the other corners apropriately + + inline wxInt32 GetLeft() const { return m_x; } + inline void SetLeft( wxInt32 n ) { m_width += m_x - n; m_x = n; } + inline void MoveLeftTo( wxInt32 n ) { m_x = n; } + inline wxInt32 GetTop() const { return m_y; } + inline void SetTop( wxInt32 n ) { m_height += m_y - n; m_y = n; } + inline void MoveTopTo( wxInt32 n ) { m_y = n; } + inline wxInt32 GetBottom() const { return m_y + m_height; } + inline void SetBottom( wxInt32 n ) { m_height += n - (m_y+m_height);} + inline void MoveBottomTo( wxInt32 n ) { m_y = n - m_height; } + inline wxInt32 GetRight() const { return m_x + m_width; } + inline void SetRight( wxInt32 n ) { m_width += n - (m_x+m_width) ; } + inline void MoveRightTo( wxInt32 n ) { m_x = n - m_width; } + + inline wxPoint2DInt GetLeftTop() const { return wxPoint2DInt( m_x , m_y ); } + inline void SetLeftTop( const wxPoint2DInt &pt ) { m_width += m_x - pt.m_x; m_height += m_y - pt.m_y; m_x = pt.m_x; m_y = pt.m_y; } + inline void MoveLeftTopTo( const wxPoint2DInt &pt ) { m_x = pt.m_x; m_y = pt.m_y; } + inline wxPoint2DInt GetLeftBottom() const { return wxPoint2DInt( m_x , m_y + m_height ); } + inline void SetLeftBottom( const wxPoint2DInt &pt ) { m_width += m_x - pt.m_x; m_height += pt.m_y - (m_y+m_height) ; m_x = pt.m_x; } + inline void MoveLeftBottomTo( const wxPoint2DInt &pt ) { m_x = pt.m_x; m_y = pt.m_y - m_height; } + inline wxPoint2DInt GetRightTop() const { return wxPoint2DInt( m_x+m_width , m_y ); } + inline void SetRightTop( const wxPoint2DInt &pt ) { m_width += pt.m_x - ( m_x + m_width ); m_height += m_y - pt.m_y; m_y = pt.m_y; } + inline void MoveRightTopTo( const wxPoint2DInt &pt ) { m_x = pt.m_x - m_width; m_y = pt.m_y; } + inline wxPoint2DInt GetRightBottom() const { return wxPoint2DInt( m_x+m_width , m_y + m_height ); } + inline void SetRightBottom( const wxPoint2DInt &pt ) { m_width += pt.m_x - ( m_x + m_width ); m_height += pt.m_y - (m_y+m_height);} + inline void MoveRightBottomTo( const wxPoint2DInt &pt ) { m_x = pt.m_x - m_width; m_y = pt.m_y - m_height; } + inline wxPoint2DInt GetCentre() const { return wxPoint2DInt( m_x+m_width/2 , m_y+m_height/2 ); } + inline void SetCentre( const wxPoint2DInt &pt ) { MoveCentreTo( pt ); } // since this is impossible without moving... + inline void MoveCentreTo( const wxPoint2DInt &pt ) { m_x += pt.m_x - (m_x+m_width/2) , m_y += pt.m_y -(m_y+m_height/2); } + inline wxOutCode GetOutCode( const wxPoint2DInt &pt ) const + { return (wxOutCode) (( ( pt.m_x < m_x ) ? wxOutLeft : 0 ) + + ( ( pt.m_x >= m_x + m_width ) ? wxOutRight : 0 ) + + ( ( pt.m_y < m_y ) ? wxOutTop : 0 ) + + ( ( pt.m_y >= m_y + m_height ) ? wxOutBottom : 0 )); } + inline wxOutCode GetOutcode( const wxPoint2DInt &pt ) const + { return GetOutCode( pt ) ; } + inline bool Contains( const wxPoint2DInt &pt ) const + { return GetOutCode( pt ) == wxInside; } + inline bool Contains( const wxRect2DInt &rect ) const + { return ( ( ( m_x <= rect.m_x ) && ( rect.m_x + rect.m_width <= m_x + m_width ) ) && + ( ( m_y <= rect.m_y ) && ( rect.m_y + rect.m_height <= m_y + m_height ) ) ); } + inline bool IsEmpty() const + { return ( m_width <= 0 || m_height <= 0 ); } + inline bool HaveEqualSize( const wxRect2DInt &rect ) const + { return ( rect.m_width == m_width && rect.m_height == m_height ); } + + inline void Inset( wxInt32 x , wxInt32 y ) { m_x += x; m_y += y; m_width -= 2 * x; m_height -= 2 * y; } + inline void Inset( wxInt32 left , wxInt32 top ,wxInt32 right , wxInt32 bottom ) + { m_x += left; m_y += top; m_width -= left + right; m_height -= top + bottom;} + inline void Offset( const wxPoint2DInt &pt ) { m_x += pt.m_x; m_y += pt.m_y; } + void ConstrainTo( const wxRect2DInt &rect ); + inline wxPoint2DInt Interpolate( wxInt32 widthfactor , wxInt32 heightfactor ) { return wxPoint2DInt( m_x + m_width * widthfactor , m_y + m_height * heightfactor ); } + + static void Intersect( const wxRect2DInt &src1 , const wxRect2DInt &src2 , wxRect2DInt *dest ); + inline void Intersect( const wxRect2DInt &otherRect ) { Intersect( *this , otherRect , this ); } + inline wxRect2DInt CreateIntersection( const wxRect2DInt &otherRect ) const { wxRect2DInt result; Intersect( *this , otherRect , &result); return result; } + bool Intersects( const wxRect2DInt &rect ) const; + + static void Union( const wxRect2DInt &src1 , const wxRect2DInt &src2 , wxRect2DInt *dest ); + void Union( const wxRect2DInt &otherRect ) { Union( *this , otherRect , this ); } + void Union( const wxPoint2DInt &pt ); + inline wxRect2DInt CreateUnion( const wxRect2DInt &otherRect ) const { wxRect2DInt result; Union( *this , otherRect , &result); return result; } + + inline void Scale( wxInt32 f ) { m_x *= f; m_y *= f; m_width *= f; m_height *= f;} + inline void Scale( wxInt32 num , wxInt32 denum ) + { m_x *= ((wxInt32)num)/((wxInt32)denum); m_y *= ((wxInt32)num)/((wxInt32)denum); + m_width *= ((wxInt32)num)/((wxInt32)denum); m_height *= ((wxInt32)num)/((wxInt32)denum);} + + wxRect2DInt& operator = (const wxRect2DInt& rect); + bool operator == (const wxRect2DInt& rect) const; + bool operator != (const wxRect2DInt& rect) const; + +#if wxUSE_STREAMS + void WriteTo( wxDataOutputStream &stream ) const; + void ReadFrom( wxDataInputStream &stream ); +#endif // wxUSE_STREAMS + + wxInt32 m_x; + wxInt32 m_y; + wxInt32 m_width; + wxInt32 m_height; +}; + +inline wxRect2DInt::wxRect2DInt( const wxRect2DInt &r ) +{ + m_x = r.m_x; + m_y = r.m_y; + m_width = r.m_width; + m_height = r.m_height; +} + +inline wxRect2DInt::wxRect2DInt( const wxPoint2DInt &a , const wxPoint2DInt &b) +{ + m_x = wxMin( a.m_x , b.m_x ); + m_y = wxMin( a.m_y , b.m_y ); + m_width = abs( a.m_x - b.m_x ); + m_height = abs( a.m_y - b.m_y ); +} + +inline wxRect2DInt::wxRect2DInt( const wxPoint2DInt& pos, const wxSize& size) +{ + m_x = pos.m_x; + m_y = pos.m_y; + m_width = size.x; + m_height = size.y; +} + +inline bool wxRect2DInt::operator == (const wxRect2DInt& rect) const +{ + return (m_x==rect.m_x && m_y==rect.m_y && + m_width==rect.m_width && m_height==rect.m_height); +} + +inline bool wxRect2DInt::operator != (const wxRect2DInt& rect) const +{ + return !(*this == rect); +} + +class wxTransform2D +{ +public : + virtual ~wxTransform2D() { } + virtual void Transform( wxPoint2DInt* pt )const = 0; + virtual void Transform( wxRect2DInt* r ) const; + virtual wxPoint2DInt Transform( const wxPoint2DInt &pt ) const; + virtual wxRect2DInt Transform( const wxRect2DInt &r ) const ; + + virtual void InverseTransform( wxPoint2DInt* pt ) const = 0; + virtual void InverseTransform( wxRect2DInt* r ) const ; + virtual wxPoint2DInt InverseTransform( const wxPoint2DInt &pt ) const ; + virtual wxRect2DInt InverseTransform( const wxRect2DInt &r ) const ; +}; + +inline void wxTransform2D::Transform( wxRect2DInt* r ) const + { wxPoint2DInt a = r->GetLeftTop() , b = r->GetRightBottom(); Transform( &a ); Transform( &b ); *r = wxRect2DInt( a , b ); } + +inline wxPoint2DInt wxTransform2D::Transform( const wxPoint2DInt &pt ) const + { wxPoint2DInt res = pt; Transform( &res ); return res; } + +inline wxRect2DInt wxTransform2D::Transform( const wxRect2DInt &r ) const + { wxRect2DInt res = r; Transform( &res ); return res; } + +inline void wxTransform2D::InverseTransform( wxRect2DInt* r ) const + { wxPoint2DInt a = r->GetLeftTop() , b = r->GetRightBottom(); InverseTransform( &a ); InverseTransform( &b ); *r = wxRect2DInt( a , b ); } + +inline wxPoint2DInt wxTransform2D::InverseTransform( const wxPoint2DInt &pt ) const + { wxPoint2DInt res = pt; InverseTransform( &res ); return res; } + +inline wxRect2DInt wxTransform2D::InverseTransform( const wxRect2DInt &r ) const + { wxRect2DInt res = r; InverseTransform( &res ); return res; } + + +#endif // wxUSE_GEOMETRY + +#endif // _WX_GEOMETRY_H_ diff --git a/Externals/wxWidgets/include/wx/gifdecod.h b/Externals/wxWidgets/include/wx/gifdecod.h new file mode 100644 index 0000000000..3ada1a19d8 --- /dev/null +++ b/Externals/wxWidgets/include/wx/gifdecod.h @@ -0,0 +1,110 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/gifdecod.h +// Purpose: wxGIFDecoder, GIF reader for wxImage and wxAnimation +// Author: Guillermo Rodriguez Garcia +// Version: 3.02 +// CVS-ID: $Id: gifdecod.h 45563 2007-04-21 18:17:50Z VZ $ +// Copyright: (c) 1999 Guillermo Rodriguez Garcia +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GIFDECOD_H_ +#define _WX_GIFDECOD_H_ + +#include "wx/defs.h" + +#if wxUSE_STREAMS && wxUSE_GIF + +#include "wx/stream.h" +#include "wx/image.h" +#include "wx/animdecod.h" +#include "wx/dynarray.h" + +// internal utility used to store a frame in 8bit-per-pixel format +class GIFImage; + + +// -------------------------------------------------------------------------- +// Constants +// -------------------------------------------------------------------------- + +// Error codes: +// Note that the error code wxGIF_TRUNCATED means that the image itself +// is most probably OK, but the decoder didn't reach the end of the data +// stream; this means that if it was not reading directly from file, +// the stream will not be correctly positioned. +// +enum wxGIFErrorCode +{ + wxGIF_OK = 0, // everything was OK + wxGIF_INVFORMAT, // error in GIF header + wxGIF_MEMERR, // error allocating memory + wxGIF_TRUNCATED // file appears to be truncated +}; + +// -------------------------------------------------------------------------- +// wxGIFDecoder class +// -------------------------------------------------------------------------- + +class WXDLLEXPORT wxGIFDecoder : public wxAnimationDecoder +{ +public: + // constructor, destructor, etc. + wxGIFDecoder(); + ~wxGIFDecoder(); + + // get data of current frame + unsigned char* GetData(unsigned int frame) const; + unsigned char* GetPalette(unsigned int frame) const; + unsigned int GetNcolours(unsigned int frame) const; + int GetTransparentColourIndex(unsigned int frame) const; + wxColour GetTransparentColour(unsigned int frame) const; + + virtual wxSize GetFrameSize(unsigned int frame) const; + virtual wxPoint GetFramePosition(unsigned int frame) const; + virtual wxAnimationDisposal GetDisposalMethod(unsigned int frame) const; + virtual long GetDelay(unsigned int frame) const; + + // GIFs can contain both static images and animations + bool IsAnimation() const + { return m_nFrames > 1; } + + // load function which returns more info than just Load(): + wxGIFErrorCode LoadGIF( wxInputStream& stream ); + + // free all internal frames + void Destroy(); + + // implementation of wxAnimationDecoder's pure virtuals + virtual bool CanRead( wxInputStream& stream ) const; + virtual bool Load( wxInputStream& stream ) + { return LoadGIF(stream) == wxGIF_OK; } + + bool ConvertToImage(unsigned int frame, wxImage *image) const; + + wxAnimationDecoder *Clone() const + { return new wxGIFDecoder; } + wxAnimationType GetType() const + { return wxANIMATION_TYPE_GIF; } + +private: + // array of all frames + wxArrayPtrVoid m_frames; + + // decoder state vars + int m_restbits; // remaining valid bits + unsigned int m_restbyte; // remaining bytes in this block + unsigned int m_lastbyte; // last byte read + unsigned char m_buffer[256]; // buffer for reading + unsigned char *m_bufp; // pointer to next byte in buffer + + int getcode(wxInputStream& stream, int bits, int abfin); + wxGIFErrorCode dgif(wxInputStream& stream, + GIFImage *img, int interl, int bits); + + DECLARE_NO_COPY_CLASS(wxGIFDecoder) +}; + +#endif // wxUSE_STREAM && wxUSE_GIF + +#endif // _WX_GIFDECOD_H_ diff --git a/Externals/wxWidgets/include/wx/glcanvas.h b/Externals/wxWidgets/include/wx/glcanvas.h new file mode 100644 index 0000000000..29d9074423 --- /dev/null +++ b/Externals/wxWidgets/include/wx/glcanvas.h @@ -0,0 +1,86 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/glcanvas.h +// Purpose: wxGLCanvas base header +// Author: Julian Smart +// Modified by: +// Created: +// Copyright: (c) Julian Smart +// RCS-ID: $Id: glcanvas.h 43623 2006-11-24 10:30:42Z MR $ +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GLCANVAS_H_BASE_ +#define _WX_GLCANVAS_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_GLCANVAS + +//--------------------------------------------------------------------------- +// Constants for attriblist +//--------------------------------------------------------------------------- + +// The generic GL implementation doesn't support most of these options, +// such as stereo, auxiliary buffers, alpha channel, and accum buffer. +// Other implementations may actually support them. + +enum +{ + WX_GL_RGBA=1, /* use true color palette */ + WX_GL_BUFFER_SIZE, /* bits for buffer if not WX_GL_RGBA */ + WX_GL_LEVEL, /* 0 for main buffer, >0 for overlay, <0 for underlay */ + WX_GL_DOUBLEBUFFER, /* use doublebuffer */ + WX_GL_STEREO, /* use stereoscopic display */ + WX_GL_AUX_BUFFERS, /* number of auxiliary buffers */ + WX_GL_MIN_RED, /* use red buffer with most bits (> MIN_RED bits) */ + WX_GL_MIN_GREEN, /* use green buffer with most bits (> MIN_GREEN bits) */ + WX_GL_MIN_BLUE, /* use blue buffer with most bits (> MIN_BLUE bits) */ + WX_GL_MIN_ALPHA, /* use alpha buffer with most bits (> MIN_ALPHA bits) */ + WX_GL_DEPTH_SIZE, /* bits for Z-buffer (0,16,32) */ + WX_GL_STENCIL_SIZE, /* bits for stencil buffer */ + WX_GL_MIN_ACCUM_RED, /* use red accum buffer with most bits (> MIN_ACCUM_RED bits) */ + WX_GL_MIN_ACCUM_GREEN, /* use green buffer with most bits (> MIN_ACCUM_GREEN bits) */ + WX_GL_MIN_ACCUM_BLUE, /* use blue buffer with most bits (> MIN_ACCUM_BLUE bits) */ + WX_GL_MIN_ACCUM_ALPHA /* use alpha buffer with most bits (> MIN_ACCUM_ALPHA bits) */ +}; + +#define wxGLCanvasName _T("GLCanvas") + +#if defined(__WXMSW__) +#include "wx/msw/glcanvas.h" +#elif defined(__WXMOTIF__) +#include "wx/x11/glcanvas.h" +#elif defined(__WXGTK20__) +#include "wx/gtk/glcanvas.h" +#elif defined(__WXGTK__) +#include "wx/gtk1/glcanvas.h" +#elif defined(__WXX11__) +#include "wx/x11/glcanvas.h" +#elif defined(__WXMAC__) +#include "wx/mac/glcanvas.h" +#elif defined(__WXCOCOA__) +#include "wx/cocoa/glcanvas.h" +#else +#error "wxGLCanvas not supported in this wxWidgets port" +#endif + +#include "wx/app.h" +class WXDLLIMPEXP_GL wxGLApp : public wxApp +{ +public: + wxGLApp() : wxApp() { } + virtual ~wxGLApp(); + + // use this in the constructor of the user-derived wxGLApp class to + // determine if an OpenGL rendering context with these attributes + // is available - returns true if so, false if not. + bool InitGLVisual(int *attribList); + +private: + DECLARE_DYNAMIC_CLASS(wxGLApp) +}; + +#endif + // wxUSE_GLCANVAS +#endif + // _WX_GLCANVAS_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/graphics.h b/Externals/wxWidgets/include/wx/graphics.h new file mode 100644 index 0000000000..efd6792c6c --- /dev/null +++ b/Externals/wxWidgets/include/wx/graphics.h @@ -0,0 +1,674 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/graphics.h +// Purpose: graphics context header +// Author: Stefan Csomor +// Modified by: +// Created: +// Copyright: (c) Stefan Csomor +// RCS-ID: $Id: graphics.h 49402 2007-10-24 14:48:10Z VZ $ +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GRAPHICS_H_ +#define _WX_GRAPHICS_H_ + +#if wxUSE_GRAPHICS_CONTEXT + +#include "wx/geometry.h" +#include "wx/dynarray.h" + +class WXDLLIMPEXP_CORE wxWindowDC; +class WXDLLIMPEXP_CORE wxMemoryDC; +class WXDLLIMPEXP_CORE wxGraphicsContext; +class WXDLLIMPEXP_CORE wxGraphicsPath; +class WXDLLIMPEXP_CORE wxGraphicsMatrix; +class WXDLLIMPEXP_CORE wxGraphicsFigure; +class WXDLLIMPEXP_CORE wxGraphicsRenderer; +class WXDLLIMPEXP_CORE wxGraphicsPen; +class WXDLLIMPEXP_CORE wxGraphicsBrush; +class WXDLLIMPEXP_CORE wxGraphicsFont; + +/* + * notes about the graphics context apis + * + * angles : are measured in radians, 0.0 being in direction of positiv x axis, PI/2 being + * in direction of positive y axis. + */ + +// Base class of all objects used for drawing in the new graphics API, the always point back to their +// originating rendering engine, there is no dynamic unloading of a renderer currently allowed, +// these references are not counted + +// +// The data used by objects like graphics pens etc is ref counted, in order to avoid unnecessary expensive +// duplication. Any operation on a shared instance that results in a modified state, uncouples this +// instance from the other instances that were shared - using copy on write semantics +// + +class WXDLLIMPEXP_CORE wxGraphicsObjectRefData : public wxObjectRefData +{ +public : + wxGraphicsObjectRefData( wxGraphicsRenderer* renderer ); + wxGraphicsObjectRefData( const wxGraphicsObjectRefData* data ); + wxGraphicsRenderer* GetRenderer() const ; + virtual wxGraphicsObjectRefData* Clone() const ; + +protected : + wxGraphicsRenderer* m_renderer; +} ; + +class WXDLLIMPEXP_CORE wxGraphicsObject : public wxObject +{ +public : + wxGraphicsObject() ; + wxGraphicsObject( wxGraphicsRenderer* renderer ) ; + virtual ~wxGraphicsObject() ; + + bool IsNull() const ; + + // returns the renderer that was used to create this instance, or NULL if it has not been initialized yet + wxGraphicsRenderer* GetRenderer() const ; + wxGraphicsObjectRefData* GetGraphicsData() const ; +protected : + virtual wxObjectRefData* CreateRefData() const; + virtual wxObjectRefData* CloneRefData(const wxObjectRefData* data) const; + + DECLARE_DYNAMIC_CLASS(wxGraphicsObject) +} ; + +class WXDLLIMPEXP_CORE wxGraphicsPen : public wxGraphicsObject +{ +public : + wxGraphicsPen() {} + virtual ~wxGraphicsPen() {} +private : + DECLARE_DYNAMIC_CLASS(wxGraphicsPen) +} ; + +extern WXDLLEXPORT_DATA(wxGraphicsPen) wxNullGraphicsPen; + +class WXDLLIMPEXP_CORE wxGraphicsBrush : public wxGraphicsObject +{ +public : + wxGraphicsBrush() {} + virtual ~wxGraphicsBrush() {} +private : + DECLARE_DYNAMIC_CLASS(wxGraphicsBrush) +} ; + +extern WXDLLEXPORT_DATA(wxGraphicsBrush) wxNullGraphicsBrush; + +class WXDLLIMPEXP_CORE wxGraphicsFont : public wxGraphicsObject +{ +public : + wxGraphicsFont() {} + virtual ~wxGraphicsFont() {} +private : + DECLARE_DYNAMIC_CLASS(wxGraphicsFont) +} ; + +extern WXDLLEXPORT_DATA(wxGraphicsFont) wxNullGraphicsFont; + + +class WXDLLIMPEXP_CORE wxGraphicsMatrixData : public wxGraphicsObjectRefData +{ +public : + wxGraphicsMatrixData( wxGraphicsRenderer* renderer) : + wxGraphicsObjectRefData(renderer) {} + + virtual ~wxGraphicsMatrixData() {} + + // concatenates the matrix + virtual void Concat( const wxGraphicsMatrixData *t ) = 0; + + // sets the matrix to the respective values + virtual void Set(wxDouble a=1.0, wxDouble b=0.0, wxDouble c=0.0, wxDouble d=1.0, + wxDouble tx=0.0, wxDouble ty=0.0) = 0; + + // gets the component valuess of the matrix + virtual void Get(wxDouble* a=NULL, wxDouble* b=NULL, wxDouble* c=NULL, + wxDouble* d=NULL, wxDouble* tx=NULL, wxDouble* ty=NULL) const = 0; + + // makes this the inverse matrix + virtual void Invert() = 0; + + // returns true if the elements of the transformation matrix are equal ? + virtual bool IsEqual( const wxGraphicsMatrixData* t) const = 0; + + // return true if this is the identity matrix + virtual bool IsIdentity() const = 0; + + // + // transformation + // + + // add the translation to this matrix + virtual void Translate( wxDouble dx , wxDouble dy ) = 0; + + // add the scale to this matrix + virtual void Scale( wxDouble xScale , wxDouble yScale ) = 0; + + // add the rotation to this matrix (radians) + virtual void Rotate( wxDouble angle ) = 0; + + // + // apply the transforms + // + + // applies that matrix to the point + virtual void TransformPoint( wxDouble *x, wxDouble *y ) const = 0; + + // applies the matrix except for translations + virtual void TransformDistance( wxDouble *dx, wxDouble *dy ) const =0; + + // returns the native representation + virtual void * GetNativeMatrix() const = 0; +} ; + +class WXDLLIMPEXP_CORE wxGraphicsMatrix : public wxGraphicsObject +{ +public : + wxGraphicsMatrix() {} + + virtual ~wxGraphicsMatrix() {} + + // concatenates the matrix + virtual void Concat( const wxGraphicsMatrix *t ); + void Concat( const wxGraphicsMatrix &t ) { Concat( &t ); } + + // sets the matrix to the respective values + virtual void Set(wxDouble a=1.0, wxDouble b=0.0, wxDouble c=0.0, wxDouble d=1.0, + wxDouble tx=0.0, wxDouble ty=0.0); + + // gets the component valuess of the matrix + virtual void Get(wxDouble* a=NULL, wxDouble* b=NULL, wxDouble* c=NULL, + wxDouble* d=NULL, wxDouble* tx=NULL, wxDouble* ty=NULL) const; + + // makes this the inverse matrix + virtual void Invert(); + + // returns true if the elements of the transformation matrix are equal ? + virtual bool IsEqual( const wxGraphicsMatrix* t) const; + bool IsEqual( const wxGraphicsMatrix& t) const { return IsEqual( &t ); } + + // return true if this is the identity matrix + virtual bool IsIdentity() const; + + // + // transformation + // + + // add the translation to this matrix + virtual void Translate( wxDouble dx , wxDouble dy ); + + // add the scale to this matrix + virtual void Scale( wxDouble xScale , wxDouble yScale ); + + // add the rotation to this matrix (radians) + virtual void Rotate( wxDouble angle ); + + // + // apply the transforms + // + + // applies that matrix to the point + virtual void TransformPoint( wxDouble *x, wxDouble *y ) const; + + // applies the matrix except for translations + virtual void TransformDistance( wxDouble *dx, wxDouble *dy ) const; + + // returns the native representation + virtual void * GetNativeMatrix() const; + + const wxGraphicsMatrixData* GetMatrixData() const + { return (const wxGraphicsMatrixData*) GetRefData(); } + wxGraphicsMatrixData* GetMatrixData() + { return (wxGraphicsMatrixData*) GetRefData(); } + +private : + DECLARE_DYNAMIC_CLASS(wxGraphicsMatrix) +} ; + +extern WXDLLEXPORT_DATA(wxGraphicsMatrix) wxNullGraphicsMatrix; + +class WXDLLIMPEXP_CORE wxGraphicsPathData : public wxGraphicsObjectRefData +{ +public : + wxGraphicsPathData(wxGraphicsRenderer* renderer) : wxGraphicsObjectRefData(renderer) {} + virtual ~wxGraphicsPathData() {} + + // + // These are the path primitives from which everything else can be constructed + // + + // begins a new subpath at (x,y) + virtual void MoveToPoint( wxDouble x, wxDouble y ) = 0; + + // adds a straight line from the current point to (x,y) + virtual void AddLineToPoint( wxDouble x, wxDouble y ) = 0; + + // adds a cubic Bezier curve from the current point, using two control points and an end point + virtual void AddCurveToPoint( wxDouble cx1, wxDouble cy1, wxDouble cx2, wxDouble cy2, wxDouble x, wxDouble y ) = 0; + + // adds another path + virtual void AddPath( const wxGraphicsPathData* path ) =0; + + // closes the current sub-path + virtual void CloseSubpath() = 0; + + // gets the last point of the current path, (0,0) if not yet set + virtual void GetCurrentPoint( wxDouble* x, wxDouble* y) const = 0; + + // adds an arc of a circle centering at (x,y) with radius (r) from startAngle to endAngle + virtual void AddArc( wxDouble x, wxDouble y, wxDouble r, wxDouble startAngle, wxDouble endAngle, bool clockwise ) = 0; + + // + // These are convenience functions which - if not available natively will be assembled + // using the primitives from above + // + + // adds a quadratic Bezier curve from the current point, using a control point and an end point + virtual void AddQuadCurveToPoint( wxDouble cx, wxDouble cy, wxDouble x, wxDouble y ); + + // appends a rectangle as a new closed subpath + virtual void AddRectangle( wxDouble x, wxDouble y, wxDouble w, wxDouble h ); + + // appends an ellipsis as a new closed subpath fitting the passed rectangle + virtual void AddCircle( wxDouble x, wxDouble y, wxDouble r ); + + // appends a an arc to two tangents connecting (current) to (x1,y1) and (x1,y1) to (x2,y2), also a straight line from (current) to (x1,y1) + virtual void AddArcToPoint( wxDouble x1, wxDouble y1 , wxDouble x2, wxDouble y2, wxDouble r ) ; + + // appends an ellipse + virtual void AddEllipse( wxDouble x, wxDouble y, wxDouble w, wxDouble h); + + // appends a rounded rectangle + virtual void AddRoundedRectangle( wxDouble x, wxDouble y, wxDouble w, wxDouble h, wxDouble radius); + + // returns the native path + virtual void * GetNativePath() const = 0; + + // give the native path returned by GetNativePath() back (there might be some deallocations necessary) + virtual void UnGetNativePath(void *p) const= 0; + + // transforms each point of this path by the matrix + virtual void Transform( const wxGraphicsMatrixData* matrix ) =0; + + // gets the bounding box enclosing all points (possibly including control points) + virtual void GetBox(wxDouble *x, wxDouble *y, wxDouble *w, wxDouble *h) const=0; + + virtual bool Contains( wxDouble x, wxDouble y, int fillStyle = wxODDEVEN_RULE) const=0; +}; + +class WXDLLIMPEXP_CORE wxGraphicsPath : public wxGraphicsObject +{ +public : + wxGraphicsPath() {} + virtual ~wxGraphicsPath() {} + + // + // These are the path primitives from which everything else can be constructed + // + + // begins a new subpath at (x,y) + virtual void MoveToPoint( wxDouble x, wxDouble y ); + void MoveToPoint( const wxPoint2DDouble& p); + + // adds a straight line from the current point to (x,y) + virtual void AddLineToPoint( wxDouble x, wxDouble y ); + void AddLineToPoint( const wxPoint2DDouble& p); + + // adds a cubic Bezier curve from the current point, using two control points and an end point + virtual void AddCurveToPoint( wxDouble cx1, wxDouble cy1, wxDouble cx2, wxDouble cy2, wxDouble x, wxDouble y ) ; + void AddCurveToPoint( const wxPoint2DDouble& c1, const wxPoint2DDouble& c2, const wxPoint2DDouble& e); + + // adds another path + virtual void AddPath( const wxGraphicsPath& path ); + + // closes the current sub-path + virtual void CloseSubpath() ; + + // gets the last point of the current path, (0,0) if not yet set + virtual void GetCurrentPoint( wxDouble* x, wxDouble* y) const; + wxPoint2DDouble GetCurrentPoint() const; + + // adds an arc of a circle centering at (x,y) with radius (r) from startAngle to endAngle + virtual void AddArc( wxDouble x, wxDouble y, wxDouble r, wxDouble startAngle, wxDouble endAngle, bool clockwise ) ; + void AddArc( const wxPoint2DDouble& c, wxDouble r, wxDouble startAngle, wxDouble endAngle, bool clockwise); + + // + // These are convenience functions which - if not available natively will be assembled + // using the primitives from above + // + + // adds a quadratic Bezier curve from the current point, using a control point and an end point + virtual void AddQuadCurveToPoint( wxDouble cx, wxDouble cy, wxDouble x, wxDouble y ); + + // appends a rectangle as a new closed subpath + virtual void AddRectangle( wxDouble x, wxDouble y, wxDouble w, wxDouble h ); + + // appends an ellipsis as a new closed subpath fitting the passed rectangle + virtual void AddCircle( wxDouble x, wxDouble y, wxDouble r ); + + // appends a an arc to two tangents connecting (current) to (x1,y1) and (x1,y1) to (x2,y2), also a straight line from (current) to (x1,y1) + virtual void AddArcToPoint( wxDouble x1, wxDouble y1 , wxDouble x2, wxDouble y2, wxDouble r ) ; + + // appends an ellipse + virtual void AddEllipse( wxDouble x, wxDouble y, wxDouble w, wxDouble h); + + // appends a rounded rectangle + virtual void AddRoundedRectangle( wxDouble x, wxDouble y, wxDouble w, wxDouble h, wxDouble radius); + + // returns the native path + virtual void * GetNativePath() const; + + // give the native path returned by GetNativePath() back (there might be some deallocations necessary) + virtual void UnGetNativePath(void *p)const; + + // transforms each point of this path by the matrix + virtual void Transform( const wxGraphicsMatrix& matrix ); + + // gets the bounding box enclosing all points (possibly including control points) + virtual void GetBox(wxDouble *x, wxDouble *y, wxDouble *w, wxDouble *h)const; + wxRect2DDouble GetBox()const; + + virtual bool Contains( wxDouble x, wxDouble y, int fillStyle = wxODDEVEN_RULE)const; + bool Contains( const wxPoint2DDouble& c, int fillStyle = wxODDEVEN_RULE)const; + + const wxGraphicsPathData* GetPathData() const + { return (const wxGraphicsPathData*) GetRefData(); } + wxGraphicsPathData* GetPathData() + { return (wxGraphicsPathData*) GetRefData(); } + +private : + DECLARE_DYNAMIC_CLASS(wxGraphicsPath) +} ; + +extern WXDLLEXPORT_DATA(wxGraphicsPath) wxNullGraphicsPath; + + +class WXDLLIMPEXP_CORE wxGraphicsContext : public wxGraphicsObject +{ +public: + wxGraphicsContext(wxGraphicsRenderer* renderer); + + virtual ~wxGraphicsContext(); + + static wxGraphicsContext* Create( const wxWindowDC& dc) ; + +#ifdef __WXMSW__ + static wxGraphicsContext * Create( const wxMemoryDC& dc) ; +#endif + + static wxGraphicsContext* CreateFromNative( void * context ) ; + + static wxGraphicsContext* CreateFromNativeWindow( void * window ) ; + + static wxGraphicsContext* Create( wxWindow* window ) ; + + // create a context that can be used for measuring texts only, no drawing allowed + static wxGraphicsContext * Create(); + + wxGraphicsPath CreatePath() const; + + virtual wxGraphicsPen CreatePen(const wxPen& pen) const; + + virtual wxGraphicsBrush CreateBrush(const wxBrush& brush ) const; + + // sets the brush to a linear gradient, starting at (x1,y1) with color c1 to (x2,y2) with color c2 + virtual wxGraphicsBrush CreateLinearGradientBrush( wxDouble x1, wxDouble y1, wxDouble x2, wxDouble y2, + const wxColour&c1, const wxColour&c2) const; + + // sets the brush to a radial gradient originating at (xo,yc) with color oColor and ends on a circle around (xc,yc) + // with radius r and color cColor + virtual wxGraphicsBrush CreateRadialGradientBrush( wxDouble xo, wxDouble yo, wxDouble xc, wxDouble yc, wxDouble radius, + const wxColour &oColor, const wxColour &cColor) const; + + // sets the font + virtual wxGraphicsFont CreateFont( const wxFont &font , const wxColour &col = *wxBLACK ) const; + + // create a 'native' matrix corresponding to these values + virtual wxGraphicsMatrix CreateMatrix( wxDouble a=1.0, wxDouble b=0.0, wxDouble c=0.0, wxDouble d=1.0, + wxDouble tx=0.0, wxDouble ty=0.0) const; + + // push the current state of the context, ie the transformation matrix on a stack + virtual void PushState() = 0; + + // pops a stored state from the stack + virtual void PopState() = 0; + + // clips drawings to the region intersected with the current clipping region + virtual void Clip( const wxRegion ®ion ) = 0; + + // clips drawings to the rect intersected with the current clipping region + virtual void Clip( wxDouble x, wxDouble y, wxDouble w, wxDouble h ) = 0; + + // resets the clipping to original extent + virtual void ResetClip() = 0 ; + + // returns the native context + virtual void * GetNativeContext() = 0; + + // returns the current logical function + virtual int GetLogicalFunction() const { return m_logicalFunction; } + + // sets the current logical function, returns true if it supported + virtual bool SetLogicalFunction(int function) ; + + // + // transformation : changes the current transformation matrix CTM of the context + // + + // translate + virtual void Translate( wxDouble dx , wxDouble dy ) = 0; + + // scale + virtual void Scale( wxDouble xScale , wxDouble yScale ) = 0; + + // rotate (radians) + virtual void Rotate( wxDouble angle ) = 0; + + // concatenates this transform with the current transform of this context + virtual void ConcatTransform( const wxGraphicsMatrix& matrix ) = 0; + + // sets the transform of this context + virtual void SetTransform( const wxGraphicsMatrix& matrix ) = 0; + + // gets the matrix of this context + virtual wxGraphicsMatrix GetTransform() const = 0; + // + // setting the paint + // + + // sets the pen + virtual void SetPen( const wxGraphicsPen& pen ); + + void SetPen( const wxPen& pen ); + + // sets the brush for filling + virtual void SetBrush( const wxGraphicsBrush& brush ); + + void SetBrush( const wxBrush& brush ); + + // sets the font + virtual void SetFont( const wxGraphicsFont& font ); + + void SetFont( const wxFont& font, const wxColour& colour ); + + + // strokes along a path with the current pen + virtual void StrokePath( const wxGraphicsPath& path ) = 0; + + // fills a path with the current brush + virtual void FillPath( const wxGraphicsPath& path, int fillStyle = wxODDEVEN_RULE ) = 0; + + // draws a path by first filling and then stroking + virtual void DrawPath( const wxGraphicsPath& path, int fillStyle = wxODDEVEN_RULE ); + + // + // text + // + + virtual void DrawText( const wxString &str, wxDouble x, wxDouble y ) = 0; + + virtual void DrawText( const wxString &str, wxDouble x, wxDouble y, wxDouble angle ); + + virtual void DrawText( const wxString &str, wxDouble x, wxDouble y, const wxGraphicsBrush& backgroundBrush ) ; + + virtual void DrawText( const wxString &str, wxDouble x, wxDouble y, wxDouble angle, const wxGraphicsBrush& backgroundBrush ); + + virtual void GetTextExtent( const wxString &text, wxDouble *width, wxDouble *height, + wxDouble *descent, wxDouble *externalLeading ) const = 0; + + virtual void GetPartialTextExtents(const wxString& text, wxArrayDouble& widths) const = 0; + + // + // image support + // + + virtual void DrawBitmap( const wxBitmap &bmp, wxDouble x, wxDouble y, wxDouble w, wxDouble h ) = 0; + + virtual void DrawIcon( const wxIcon &icon, wxDouble x, wxDouble y, wxDouble w, wxDouble h ) = 0; + + // + // convenience methods + // + + // strokes a single line + virtual void StrokeLine( wxDouble x1, wxDouble y1, wxDouble x2, wxDouble y2); + + // stroke lines connecting each of the points + virtual void StrokeLines( size_t n, const wxPoint2DDouble *points); + + // stroke disconnected lines from begin to end points + virtual void StrokeLines( size_t n, const wxPoint2DDouble *beginPoints, const wxPoint2DDouble *endPoints); + + // draws a polygon + virtual void DrawLines( size_t n, const wxPoint2DDouble *points, int fillStyle = wxODDEVEN_RULE ); + + // draws a polygon + virtual void DrawRectangle( wxDouble x, wxDouble y, wxDouble w, wxDouble h); + + // draws an ellipse + virtual void DrawEllipse( wxDouble x, wxDouble y, wxDouble w, wxDouble h); + + // draws a rounded rectangle + virtual void DrawRoundedRectangle( wxDouble x, wxDouble y, wxDouble w, wxDouble h, wxDouble radius); + + // wrappers using wxPoint2DDouble TODO + + // helper to determine if a 0.5 offset should be applied for the drawing operation + virtual bool ShouldOffset() const { return false; } + +protected : + + wxGraphicsPen m_pen; + wxGraphicsBrush m_brush; + wxGraphicsFont m_font; + int m_logicalFunction; + +private : + DECLARE_NO_COPY_CLASS(wxGraphicsContext) + DECLARE_ABSTRACT_CLASS(wxGraphicsContext) +}; + +#if 0 + +// +// A graphics figure allows to cache path, pen etc creations, also will be a basis for layering/grouping elements +// + +class WXDLLIMPEXP_CORE wxGraphicsFigure : public wxGraphicsObject +{ +public : + wxGraphicsFigure(wxGraphicsRenderer* renderer) ; + + virtual ~wxGraphicsFigure() ; + + void SetPath( wxGraphicsMatrix* matrix ); + + void SetMatrix( wxGraphicsPath* path); + + // draws this object on the context + virtual void Draw( wxGraphicsContext* cg ); + + // returns the path of this object + wxGraphicsPath* GetPath() { return m_path; } + + // returns the transformation matrix of this object, may be null if there is no transformation necessary + wxGraphicsMatrix* GetMatrix() { return m_matrix; } + +private : + wxGraphicsMatrix* m_matrix; + wxGraphicsPath* m_path; + + DECLARE_DYNAMIC_CLASS(wxGraphicsFigure) +} ; + +#endif + +// +// The graphics renderer is the instance corresponding to the rendering engine used, eg there is ONE core graphics renderer +// instance on OSX. This instance is pointed back to by all objects created by it. Therefore you can create eg additional +// paths at any point from a given matrix etc. +// + +class WXDLLIMPEXP_CORE wxGraphicsRenderer : public wxObject +{ +public : + wxGraphicsRenderer() {} + + virtual ~wxGraphicsRenderer() {} + + static wxGraphicsRenderer* GetDefaultRenderer(); + + // Context + + virtual wxGraphicsContext * CreateContext( const wxWindowDC& dc) = 0 ; +#ifdef __WXMSW__ + virtual wxGraphicsContext * CreateContext( const wxMemoryDC& dc) = 0 ; +#endif + virtual wxGraphicsContext * CreateContextFromNativeContext( void * context ) = 0; + + virtual wxGraphicsContext * CreateContextFromNativeWindow( void * window ) = 0; + + virtual wxGraphicsContext * CreateContext( wxWindow* window ) = 0; + + // create a context that can be used for measuring texts only, no drawing allowed + virtual wxGraphicsContext * CreateMeasuringContext() = 0; + + // Path + + virtual wxGraphicsPath CreatePath() = 0; + + // Matrix + + virtual wxGraphicsMatrix CreateMatrix( wxDouble a=1.0, wxDouble b=0.0, wxDouble c=0.0, wxDouble d=1.0, + wxDouble tx=0.0, wxDouble ty=0.0) = 0; + + // Paints + + virtual wxGraphicsPen CreatePen(const wxPen& pen) = 0 ; + + virtual wxGraphicsBrush CreateBrush(const wxBrush& brush ) = 0 ; + + // sets the brush to a linear gradient, starting at (x1,y1) with color c1 to (x2,y2) with color c2 + virtual wxGraphicsBrush CreateLinearGradientBrush( wxDouble x1, wxDouble y1, wxDouble x2, wxDouble y2, + const wxColour&c1, const wxColour&c2) = 0; + + // sets the brush to a radial gradient originating at (xo,yc) with color oColor and ends on a circle around (xc,yc) + // with radius r and color cColor + virtual wxGraphicsBrush CreateRadialGradientBrush( wxDouble xo, wxDouble yo, wxDouble xc, wxDouble yc, wxDouble radius, + const wxColour &oColor, const wxColour &cColor) = 0; + + // sets the font + virtual wxGraphicsFont CreateFont( const wxFont &font , const wxColour &col = *wxBLACK ) = 0; + +private : + DECLARE_NO_COPY_CLASS(wxGraphicsRenderer) + DECLARE_ABSTRACT_CLASS(wxGraphicsRenderer) +} ; + +#endif + +#endif // _WX_GRAPHICS_H_ diff --git a/Externals/wxWidgets/include/wx/grid.h b/Externals/wxWidgets/include/wx/grid.h new file mode 100644 index 0000000000..0a4ab11cd3 --- /dev/null +++ b/Externals/wxWidgets/include/wx/grid.h @@ -0,0 +1,18 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/grid.h +// Purpose: wxGrid base header +// Author: Julian Smart +// Modified by: +// Created: +// Copyright: (c) Julian Smart +// RCS-ID: $Id: grid.h 33948 2005-05-04 18:57:50Z JS $ +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GRID_H_BASE_ +#define _WX_GRID_H_BASE_ + +#include "wx/generic/grid.h" + +#endif + // _WX_GRID_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/gsocket.h b/Externals/wxWidgets/include/wx/gsocket.h new file mode 100644 index 0000000000..bd44b86e62 --- /dev/null +++ b/Externals/wxWidgets/include/wx/gsocket.h @@ -0,0 +1,184 @@ +/* ------------------------------------------------------------------------- + * Project: GSocket (Generic Socket) + * Name: gsocket.h + * Author: Guilhem Lavaux + * Guillermo Rodriguez Garcia (maintainer) + * Copyright: (c) Guilhem Lavaux + * Licence: wxWindows Licence + * Purpose: GSocket include file (system independent) + * CVSID: $Id: gsocket.h 33948 2005-05-04 18:57:50Z JS $ + * ------------------------------------------------------------------------- + */ + +#ifndef __GSOCKET_H +#define __GSOCKET_H + +#ifndef __GSOCKET_STANDALONE__ +#include "wx/defs.h" + +#include "wx/dlimpexp.h" /* for WXDLLIMPEXP_NET */ + +#endif + +#if wxUSE_SOCKETS || defined(__GSOCKET_STANDALONE__) + +#include + +/* + Including sys/types.h under cygwin results in the warnings about "fd_set + having been defined in sys/types.h" when winsock.h is included later and + doesn't seem to be necessary anyhow. It's not needed under Mac neither. + */ +#if !defined(__WXMAC__) && !defined(__CYGWIN__) && !defined(__WXWINCE__) +#include +#endif + +#ifdef __WXWINCE__ +#include +#endif + +class GSocket; + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct _GAddress GAddress; + +typedef enum { + GSOCK_NOFAMILY = 0, + GSOCK_INET, + GSOCK_INET6, + GSOCK_UNIX +} GAddressType; + +typedef enum { + GSOCK_STREAMED, + GSOCK_UNSTREAMED +} GSocketStream; + +typedef enum { + GSOCK_NOERROR = 0, + GSOCK_INVOP, + GSOCK_IOERR, + GSOCK_INVADDR, + GSOCK_INVSOCK, + GSOCK_NOHOST, + GSOCK_INVPORT, + GSOCK_WOULDBLOCK, + GSOCK_TIMEDOUT, + GSOCK_MEMERR, + GSOCK_OPTERR +} GSocketError; + +/* See below for an explanation on how events work. + */ +typedef enum { + GSOCK_INPUT = 0, + GSOCK_OUTPUT = 1, + GSOCK_CONNECTION = 2, + GSOCK_LOST = 3, + GSOCK_MAX_EVENT = 4 +} GSocketEvent; + +enum { + GSOCK_INPUT_FLAG = 1 << GSOCK_INPUT, + GSOCK_OUTPUT_FLAG = 1 << GSOCK_OUTPUT, + GSOCK_CONNECTION_FLAG = 1 << GSOCK_CONNECTION, + GSOCK_LOST_FLAG = 1 << GSOCK_LOST +}; + +typedef int GSocketEventFlags; + +typedef void (*GSocketCallback)(GSocket *socket, GSocketEvent event, + char *cdata); + + +/* Functions tables for internal use by GSocket code: */ + +/* Actually this is a misnomer now, but reusing this name means I don't + have to ifdef app traits or common socket code */ +class GSocketGUIFunctionsTable +{ +public: + // needed since this class declares virtual members + virtual ~GSocketGUIFunctionsTable() { } + virtual bool OnInit() = 0; + virtual void OnExit() = 0; + virtual bool CanUseEventLoop() = 0; + virtual bool Init_Socket(GSocket *socket) = 0; + virtual void Destroy_Socket(GSocket *socket) = 0; +#ifndef __WINDOWS__ + virtual void Install_Callback(GSocket *socket, GSocketEvent event) = 0; + virtual void Uninstall_Callback(GSocket *socket, GSocketEvent event) = 0; +#endif + virtual void Enable_Events(GSocket *socket) = 0; + virtual void Disable_Events(GSocket *socket) = 0; +}; + + +/* Global initializers */ + +/* Sets GUI functions callbacks. Must be called *before* GSocket_Init + if the app uses async sockets. */ +void GSocket_SetGUIFunctions(GSocketGUIFunctionsTable *guifunc); + +/* GSocket_Init() must be called at the beginning */ +int GSocket_Init(void); + +/* GSocket_Cleanup() must be called at the end */ +void GSocket_Cleanup(void); + + +/* Constructors / Destructors */ + +GSocket *GSocket_new(void); + + +/* GAddress */ + +GAddress *GAddress_new(void); +GAddress *GAddress_copy(GAddress *address); +void GAddress_destroy(GAddress *address); + +void GAddress_SetFamily(GAddress *address, GAddressType type); +GAddressType GAddress_GetFamily(GAddress *address); + +/* The use of any of the next functions will set the address family to + * the specific one. For example if you use GAddress_INET_SetHostName, + * address family will be implicitly set to AF_INET. + */ + +GSocketError GAddress_INET_SetHostName(GAddress *address, const char *hostname); +GSocketError GAddress_INET_SetAnyAddress(GAddress *address); +GSocketError GAddress_INET_SetHostAddress(GAddress *address, + unsigned long hostaddr); +GSocketError GAddress_INET_SetPortName(GAddress *address, const char *port, + const char *protocol); +GSocketError GAddress_INET_SetPort(GAddress *address, unsigned short port); + +GSocketError GAddress_INET_GetHostName(GAddress *address, char *hostname, + size_t sbuf); +unsigned long GAddress_INET_GetHostAddress(GAddress *address); +unsigned short GAddress_INET_GetPort(GAddress *address); + +/* TODO: Define specific parts (INET6, UNIX) */ + +GSocketError GAddress_UNIX_SetPath(GAddress *address, const char *path); +GSocketError GAddress_UNIX_GetPath(GAddress *address, char *path, size_t sbuf); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +# if defined(__WINDOWS__) +# include "wx/msw/gsockmsw.h" +# elif defined(__WXMAC__) && !defined(__DARWIN__) +# include "wx/mac/gsockmac.h" +# else +# include "wx/unix/gsockunx.h" +# endif + +#endif /* wxUSE_SOCKETS || defined(__GSOCKET_STANDALONE__) */ + +#endif /* __GSOCKET_H */ diff --git a/Externals/wxWidgets/include/wx/hash.h b/Externals/wxWidgets/include/wx/hash.h new file mode 100644 index 0000000000..f5cd926412 --- /dev/null +++ b/Externals/wxWidgets/include/wx/hash.h @@ -0,0 +1,630 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/hash.h +// Purpose: wxHashTable class +// Author: Julian Smart +// Modified by: VZ at 25.02.00: type safe hashes with WX_DECLARE_HASH() +// Created: 01/02/97 +// RCS-ID: $Id: hash.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_HASH_H__ +#define _WX_HASH_H__ + +#include "wx/defs.h" + +#if !wxUSE_STL && WXWIN_COMPATIBILITY_2_4 + #define wxUSE_OLD_HASH_TABLE 1 +#else + #define wxUSE_OLD_HASH_TABLE 0 +#endif + +#if !wxUSE_STL + #include "wx/object.h" +#else + class WXDLLIMPEXP_BASE wxObject; +#endif +#if wxUSE_OLD_HASH_TABLE + #include "wx/list.h" +#endif +#if WXWIN_COMPATIBILITY_2_4 + #include "wx/dynarray.h" +#endif + +// the default size of the hash +#define wxHASH_SIZE_DEFAULT (1000) + +/* + * A hash table is an array of user-definable size with lists + * of data items hanging off the array positions. Usually there'll + * be a hit, so no search is required; otherwise we'll have to run down + * the list to find the desired item. +*/ + +// ---------------------------------------------------------------------------- +// this is the base class for object hashes: hash tables which contain +// pointers to objects +// ---------------------------------------------------------------------------- + +#if wxUSE_OLD_HASH_TABLE + +class WXDLLIMPEXP_BASE wxHashTableBase : public wxObject +{ +public: + wxHashTableBase(); + + void Create(wxKeyType keyType = wxKEY_INTEGER, + size_t size = wxHASH_SIZE_DEFAULT); + void Destroy(); + + size_t GetSize() const { return m_hashSize; } + size_t GetCount() const { return m_count; } + + void DeleteContents(bool flag); + +protected: + // find the node for (key, value) + wxNodeBase *GetNode(long key, long value) const; + + // the array of lists in which we store the values for given key hash + wxListBase **m_hashTable; + + // the size of m_lists array + size_t m_hashSize; + + // the type of indexing we use + wxKeyType m_keyType; + + // the total number of elements in the hash + size_t m_count; + + // should we delete our data? + bool m_deleteContents; + +private: + // no copy ctor/assignment operator (yet) + DECLARE_NO_COPY_CLASS(wxHashTableBase) +}; + +#else // if !wxUSE_OLD_HASH_TABLE + +#if !defined(wxENUM_KEY_TYPE_DEFINED) +#define wxENUM_KEY_TYPE_DEFINED + +enum wxKeyType +{ + wxKEY_NONE, + wxKEY_INTEGER, + wxKEY_STRING +}; + +#endif + +union wxHashKeyValue +{ + long integer; + wxChar *string; +}; + +// for some compilers (AIX xlC), defining it as friend inside the class is not +// enough, so provide a real forward declaration +class WXDLLIMPEXP_FWD_BASE wxHashTableBase; + +class WXDLLIMPEXP_BASE wxHashTableBase_Node +{ + friend class WXDLLIMPEXP_FWD_BASE wxHashTableBase; + typedef class WXDLLIMPEXP_FWD_BASE wxHashTableBase_Node _Node; +public: + wxHashTableBase_Node( long key, void* value, + wxHashTableBase* table ); + wxHashTableBase_Node( const wxChar* key, void* value, + wxHashTableBase* table ); + ~wxHashTableBase_Node(); + + long GetKeyInteger() const { return m_key.integer; } + const wxChar* GetKeyString() const { return m_key.string; } + + void* GetData() const { return m_value; } + void SetData( void* data ) { m_value = data; } + +protected: + _Node* GetNext() const { return m_next; } + +protected: + // next node in the chain + wxHashTableBase_Node* m_next; + + // key + wxHashKeyValue m_key; + + // value + void* m_value; + + // pointer to the hash containing the node, used to remove the + // node from the hash when the user deletes the node iterating + // through it + // TODO: move it to wxHashTable_Node (only wxHashTable supports + // iteration) + wxHashTableBase* m_hashPtr; +}; + +class WXDLLIMPEXP_BASE wxHashTableBase +#if !wxUSE_STL + : public wxObject +#endif +{ + friend class WXDLLIMPEXP_FWD_BASE wxHashTableBase_Node; +public: + typedef wxHashTableBase_Node Node; + + wxHashTableBase(); + virtual ~wxHashTableBase() { } + + void Create( wxKeyType keyType = wxKEY_INTEGER, + size_t size = wxHASH_SIZE_DEFAULT ); + void Clear(); + void Destroy(); + + size_t GetSize() const { return m_size; } + size_t GetCount() const { return m_count; } + + void DeleteContents( bool flag ) { m_deleteContents = flag; } + + static long MakeKey(const wxChar *string); + +protected: + void DoPut( long key, long hash, void* data ); + void DoPut( const wxChar* key, long hash, void* data ); + void* DoGet( long key, long hash ) const; + void* DoGet( const wxChar* key, long hash ) const; + void* DoDelete( long key, long hash ); + void* DoDelete( const wxChar* key, long hash ); + +private: + // Remove the node from the hash, *only called from + // ~wxHashTable*_Node destructor + void DoRemoveNode( wxHashTableBase_Node* node ); + + // destroys data contained in the node if appropriate: + // deletes the key if it is a string and destrys + // the value if m_deleteContents is true + void DoDestroyNode( wxHashTableBase_Node* node ); + + // inserts a node in the table (at the end of the chain) + void DoInsertNode( size_t bucket, wxHashTableBase_Node* node ); + + // removes a node from the table (fiven a pointer to the previous + // but does not delete it (only deletes its contents) + void DoUnlinkNode( size_t bucket, wxHashTableBase_Node* node, + wxHashTableBase_Node* prev ); + + // unconditionally deletes node value (invoking the + // correct destructor) + virtual void DoDeleteContents( wxHashTableBase_Node* node ) = 0; + +protected: + // number of buckets + size_t m_size; + + // number of nodes (key/value pairs) + size_t m_count; + + // table + Node** m_table; + + // key typ (INTEGER/STRING) + wxKeyType m_keyType; + + // delete contents when hash is cleared + bool m_deleteContents; + +private: + DECLARE_NO_COPY_CLASS(wxHashTableBase) +}; + +#endif // wxUSE_OLD_HASH_TABLE + +#if !wxUSE_STL + +#if WXWIN_COMPATIBILITY_2_4 + +// ---------------------------------------------------------------------------- +// a hash table which stores longs +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxHashTableLong : public wxObject +{ +public: + wxHashTableLong(size_t size = wxHASH_SIZE_DEFAULT) + { Init(size); } + virtual ~wxHashTableLong(); + + void Create(size_t size = wxHASH_SIZE_DEFAULT); + void Destroy(); + + size_t GetSize() const { return m_hashSize; } + size_t GetCount() const { return m_count; } + + void Put(long key, long value); + long Get(long key) const; + long Delete(long key); + +protected: + void Init(size_t size); + +private: + wxArrayLong **m_values, + **m_keys; + + // the size of array above + size_t m_hashSize; + + // the total number of elements in the hash + size_t m_count; + + // not implemented yet + DECLARE_NO_COPY_CLASS(wxHashTableLong) +}; + +// ---------------------------------------------------------------------------- +// wxStringHashTable: a hash table which indexes strings with longs +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxStringHashTable : public wxObject +{ +public: + wxStringHashTable(size_t sizeTable = wxHASH_SIZE_DEFAULT); + virtual ~wxStringHashTable(); + + // add a string associated with this key to the table + void Put(long key, const wxString& value); + + // get the string from the key: if not found, an empty string is returned + // and the wasFound is set to false if not NULL + wxString Get(long key, bool *wasFound = NULL) const; + + // remove the item, returning true if the item was found and deleted + bool Delete(long key) const; + + // clean up + void Destroy(); + +private: + wxArrayLong **m_keys; + wxArrayString **m_values; + + // the size of array above + size_t m_hashSize; + + DECLARE_NO_COPY_CLASS(wxStringHashTable) +}; + +#endif // WXWIN_COMPATIBILITY_2_4 + +#endif // !wxUSE_STL + +// ---------------------------------------------------------------------------- +// for compatibility only +// ---------------------------------------------------------------------------- + +#if !wxUSE_OLD_HASH_TABLE + +class WXDLLIMPEXP_BASE wxHashTable_Node : public wxHashTableBase_Node +{ + friend class WXDLLIMPEXP_BASE wxHashTable; +public: + wxHashTable_Node( long key, void* value, + wxHashTableBase* table ) + : wxHashTableBase_Node( key, value, table ) { } + wxHashTable_Node( const wxChar* key, void* value, + wxHashTableBase* table ) + : wxHashTableBase_Node( key, value, table ) { } + + wxObject* GetData() const + { return (wxObject*)wxHashTableBase_Node::GetData(); } + void SetData( wxObject* data ) + { wxHashTableBase_Node::SetData( data ); } + + wxHashTable_Node* GetNext() const + { return (wxHashTable_Node*)wxHashTableBase_Node::GetNext(); } +}; + +// should inherit protectedly, but it is public for compatibility in +// order to publicly inherit from wxObject +class WXDLLIMPEXP_BASE wxHashTable : public wxHashTableBase +{ + typedef wxHashTableBase hash; +public: + typedef wxHashTable_Node Node; + typedef wxHashTable_Node* compatibility_iterator; +public: + wxHashTable( wxKeyType keyType = wxKEY_INTEGER, + size_t size = wxHASH_SIZE_DEFAULT ) + : wxHashTableBase() { Create( keyType, size ); BeginFind(); } + wxHashTable( const wxHashTable& table ); + + virtual ~wxHashTable() { Destroy(); } + + const wxHashTable& operator=( const wxHashTable& ); + + // key and value are the same + void Put(long value, wxObject *object) + { DoPut( value, value, object ); } + void Put(long lhash, long value, wxObject *object) + { DoPut( value, lhash, object ); } + void Put(const wxChar *value, wxObject *object) + { DoPut( value, MakeKey( value ), object ); } + void Put(long lhash, const wxChar *value, wxObject *object) + { DoPut( value, lhash, object ); } + + // key and value are the same + wxObject *Get(long value) const + { return (wxObject*)DoGet( value, value ); } + wxObject *Get(long lhash, long value) const + { return (wxObject*)DoGet( value, lhash ); } + wxObject *Get(const wxChar *value) const + { return (wxObject*)DoGet( value, MakeKey( value ) ); } + wxObject *Get(long lhash, const wxChar *value) const + { return (wxObject*)DoGet( value, lhash ); } + + // Deletes entry and returns data if found + wxObject *Delete(long key) + { return (wxObject*)DoDelete( key, key ); } + wxObject *Delete(long lhash, long key) + { return (wxObject*)DoDelete( key, lhash ); } + wxObject *Delete(const wxChar *key) + { return (wxObject*)DoDelete( key, MakeKey( key ) ); } + wxObject *Delete(long lhash, const wxChar *key) + { return (wxObject*)DoDelete( key, lhash ); } + + // Construct your own integer key from a string, e.g. in case + // you need to combine it with something + long MakeKey(const wxChar *string) const + { return wxHashTableBase::MakeKey(string); } + + // Way of iterating through whole hash table (e.g. to delete everything) + // Not necessary, of course, if you're only storing pointers to + // objects maintained separately + void BeginFind() { m_curr = NULL; m_currBucket = 0; } + Node* Next(); + + void Clear() { wxHashTableBase::Clear(); } + + size_t GetCount() const { return wxHashTableBase::GetCount(); } +protected: + // copy helper + void DoCopy( const wxHashTable& copy ); + + // searches the next node starting from bucket bucketStart and sets + // m_curr to it and m_currBucket to its bucket + void GetNextNode( size_t bucketStart ); +private: + virtual void DoDeleteContents( wxHashTableBase_Node* node ); + + // current node + Node* m_curr; + + // bucket the current node belongs to + size_t m_currBucket; +}; + +#else // if wxUSE_OLD_HASH_TABLE + +class WXDLLIMPEXP_BASE wxHashTable : public wxObject +{ +public: + typedef wxNode Node; + typedef wxNode* compatibility_iterator; + + int n; + int current_position; + wxNode *current_node; + + unsigned int key_type; + wxList **hash_table; + + wxHashTable(int the_key_type = wxKEY_INTEGER, + int size = wxHASH_SIZE_DEFAULT); + virtual ~wxHashTable(); + + // copy ctor and assignment operator + wxHashTable(const wxHashTable& table) : wxObject() + { DoCopy(table); } + wxHashTable& operator=(const wxHashTable& table) + { Clear(); DoCopy(table); return *this; } + + void DoCopy(const wxHashTable& table); + + void Destroy(); + + bool Create(int the_key_type = wxKEY_INTEGER, + int size = wxHASH_SIZE_DEFAULT); + + // Note that there are 2 forms of Put, Get. + // With a key and a value, the *value* will be checked + // when a collision is detected. Otherwise, if there are + // 2 items with a different value but the same key, + // we'll retrieve the WRONG ONE. So where possible, + // supply the required value along with the key. + // In fact, the value-only versions make a key, and still store + // the value. The use of an explicit key might be required + // e.g. when combining several values into one key. + // When doing that, it's highly likely we'll get a collision, + // e.g. 1 + 2 = 3, 2 + 1 = 3. + + // key and value are NOT necessarily the same + void Put(long key, long value, wxObject *object); + void Put(long key, const wxChar *value, wxObject *object); + + // key and value are the same + void Put(long value, wxObject *object); + void Put(const wxChar *value, wxObject *object); + + // key and value not the same + wxObject *Get(long key, long value) const; + wxObject *Get(long key, const wxChar *value) const; + + // key and value are the same + wxObject *Get(long value) const; + wxObject *Get(const wxChar *value) const; + + // Deletes entry and returns data if found + wxObject *Delete(long key); + wxObject *Delete(const wxChar *key); + + wxObject *Delete(long key, int value); + wxObject *Delete(long key, const wxChar *value); + + // Construct your own integer key from a string, e.g. in case + // you need to combine it with something + long MakeKey(const wxChar *string) const; + + // Way of iterating through whole hash table (e.g. to delete everything) + // Not necessary, of course, if you're only storing pointers to + // objects maintained separately + + void BeginFind(); + Node* Next(); + + void DeleteContents(bool flag); + void Clear(); + + // Returns number of nodes + size_t GetCount() const { return m_count; } + +private: + size_t m_count; // number of elements in the hashtable + bool m_deleteContents; + + DECLARE_DYNAMIC_CLASS(wxHashTable) +}; + +#endif // wxUSE_OLD_HASH_TABLE + +#if !wxUSE_OLD_HASH_TABLE + +// defines a new type safe hash table which stores the elements of type eltype +// in lists of class listclass +#define _WX_DECLARE_HASH(eltype, dummy, hashclass, classexp) \ + classexp hashclass : public wxHashTableBase \ + { \ + public: \ + hashclass(wxKeyType keyType = wxKEY_INTEGER, \ + size_t size = wxHASH_SIZE_DEFAULT) \ + : wxHashTableBase() { Create(keyType, size); } \ + \ + virtual ~hashclass() { Destroy(); } \ + \ + void Put(long key, eltype *data) { DoPut(key, key, (void*)data); } \ + void Put(long lhash, long key, eltype *data) \ + { DoPut(key, lhash, (void*)data); } \ + eltype *Get(long key) const { return (eltype*)DoGet(key, key); } \ + eltype *Get(long lhash, long key) const \ + { return (eltype*)DoGet(key, lhash); } \ + eltype *Delete(long key) { return (eltype*)DoDelete(key, key); } \ + eltype *Delete(long lhash, long key) \ + { return (eltype*)DoDelete(key, lhash); } \ + private: \ + virtual void DoDeleteContents( wxHashTableBase_Node* node ) \ + { delete (eltype*)node->GetData(); } \ + \ + DECLARE_NO_COPY_CLASS(hashclass) \ + } + +#else // if wxUSE_OLD_HASH_TABLE + +#define _WX_DECLARE_HASH(eltype, listclass, hashclass, classexp) \ + classexp hashclass : public wxHashTableBase \ + { \ + public: \ + hashclass(wxKeyType keyType = wxKEY_INTEGER, \ + size_t size = wxHASH_SIZE_DEFAULT) \ + { Create(keyType, size); } \ + \ + virtual ~hashclass() { Destroy(); } \ + \ + void Put(long key, long val, eltype *data) { DoPut(key, val, data); } \ + void Put(long key, eltype *data) { DoPut(key, key, data); } \ + \ + eltype *Get(long key, long value) const \ + { \ + wxNodeBase *node = GetNode(key, value); \ + return node ? ((listclass::Node *)node)->GetData() : (eltype *)0; \ + } \ + eltype *Get(long key) const { return Get(key, key); } \ + \ + eltype *Delete(long key, long value) \ + { \ + eltype *data; \ + \ + wxNodeBase *node = GetNode(key, value); \ + if ( node ) \ + { \ + data = ((listclass::Node *)node)->GetData(); \ + \ + delete node; \ + m_count--; \ + } \ + else \ + { \ + data = (eltype *)0; \ + } \ + \ + return data; \ + } \ + eltype *Delete(long key) { return Delete(key, key); } \ + \ + protected: \ + void DoPut(long key, long value, eltype *data) \ + { \ + size_t slot = (size_t)abs((int)(key % (long)m_hashSize)); \ + \ + if ( !m_hashTable[slot] ) \ + { \ + m_hashTable[slot] = new listclass(m_keyType); \ + if ( m_deleteContents ) \ + m_hashTable[slot]->DeleteContents(true); \ + } \ + \ + ((listclass *)m_hashTable[slot])->Append(value, data); \ + m_count++; \ + } \ + \ + DECLARE_NO_COPY_CLASS(hashclass) \ + } + +#endif // wxUSE_OLD_HASH_TABLE + +// this macro is to be used in the user code +#define WX_DECLARE_HASH(el, list, hash) \ + _WX_DECLARE_HASH(el, list, hash, class) + +// and this one does exactly the same thing but should be used inside the +// library +#define WX_DECLARE_EXPORTED_HASH(el, list, hash) \ + _WX_DECLARE_HASH(el, list, hash, class WXDLLEXPORT) + +#define WX_DECLARE_USER_EXPORTED_HASH(el, list, hash, usergoo) \ + _WX_DECLARE_HASH(el, list, hash, class usergoo) + +// delete all hash elements +// +// NB: the class declaration of the hash elements must be visible from the +// place where you use this macro, otherwise the proper destructor may not +// be called (a decent compiler should give a warning about it, but don't +// count on it)! +#define WX_CLEAR_HASH_TABLE(hash) \ + { \ + (hash).BeginFind(); \ + wxHashTable::compatibility_iterator it = (hash).Next(); \ + while( it ) \ + { \ + delete it->GetData(); \ + it = (hash).Next(); \ + } \ + (hash).Clear(); \ + } + +#endif + // _WX_HASH_H__ diff --git a/Externals/wxWidgets/include/wx/hashmap.h b/Externals/wxWidgets/include/wx/hashmap.h new file mode 100644 index 0000000000..0ac76c5658 --- /dev/null +++ b/Externals/wxWidgets/include/wx/hashmap.h @@ -0,0 +1,718 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/hashmap.h +// Purpose: wxHashMap class +// Author: Mattia Barbon +// Modified by: +// Created: 29/01/2002 +// RCS-ID: $Id: hashmap.h 45498 2007-04-16 13:03:05Z VZ $ +// Copyright: (c) Mattia Barbon +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_HASHMAP_H_ +#define _WX_HASHMAP_H_ + +#include "wx/string.h" + +#if (defined(HAVE_EXT_HASH_MAP) || defined(HAVE_HASH_MAP)) \ + && (defined(HAVE_GNU_CXX_HASH_MAP) || defined(HAVE_STD_HASH_MAP)) + #define HAVE_STL_HASH_MAP +#endif + +#if wxUSE_STL && defined(HAVE_STL_HASH_MAP) + +#if defined(HAVE_EXT_HASH_MAP) + #include +#elif defined(HAVE_HASH_MAP) + #include +#endif + +#if defined(HAVE_GNU_CXX_HASH_MAP) + #define WX_HASH_MAP_NAMESPACE __gnu_cxx +#elif defined(HAVE_STD_HASH_MAP) + #define WX_HASH_MAP_NAMESPACE std +#endif + +#define _WX_DECLARE_HASH_MAP( KEY_T, VALUE_T, HASH_T, KEY_EQ_T, CLASSNAME, CLASSEXP ) \ + typedef WX_HASH_MAP_NAMESPACE::hash_map< KEY_T, VALUE_T, HASH_T, KEY_EQ_T > CLASSNAME + +#else // !wxUSE_STL || !defined(HAVE_STL_HASH_MAP) + + +#ifdef __WXWINCE__ +typedef int ptrdiff_t; +#else +#include // for ptrdiff_t +#endif + +// private +struct WXDLLIMPEXP_BASE _wxHashTable_NodeBase +{ + _wxHashTable_NodeBase() : m_nxt(0) {} + + _wxHashTable_NodeBase* m_nxt; + +// Cannot do this: +// DECLARE_NO_COPY_CLASS(_wxHashTable_NodeBase) +// without rewriting the macros, which require a public copy constructor. +}; + +// private +class WXDLLIMPEXP_BASE _wxHashTableBase2 +{ +public: + typedef void (*NodeDtor)(_wxHashTable_NodeBase*); + typedef unsigned long (*BucketFromNode)(_wxHashTableBase2*,_wxHashTable_NodeBase*); + typedef _wxHashTable_NodeBase* (*ProcessNode)(_wxHashTable_NodeBase*); +protected: + static _wxHashTable_NodeBase* DummyProcessNode(_wxHashTable_NodeBase* node); + static void DeleteNodes( size_t buckets, _wxHashTable_NodeBase** table, + NodeDtor dtor ); + static _wxHashTable_NodeBase* GetFirstNode( size_t buckets, + _wxHashTable_NodeBase** table ) + { + for( size_t i = 0; i < buckets; ++i ) + if( table[i] ) + return table[i]; + return 0; + } + + // as static const unsigned prime_count = 31 but works with all compilers + enum { prime_count = 31 }; + static const unsigned long ms_primes[prime_count]; + + // returns the first prime in ms_primes greater than n + static unsigned long GetNextPrime( unsigned long n ); + + // returns the first prime in ms_primes smaller than n + // ( or ms_primes[0] if n is very small ) + static unsigned long GetPreviousPrime( unsigned long n ); + + static void CopyHashTable( _wxHashTable_NodeBase** srcTable, + size_t srcBuckets, _wxHashTableBase2* dst, + _wxHashTable_NodeBase** dstTable, + BucketFromNode func, ProcessNode proc ); + + static void** AllocTable( size_t sz ) + { + return (void **)calloc(sz, sizeof(void*)); + } + static void FreeTable(void *table) + { + free(table); + } +}; + +#define _WX_DECLARE_HASHTABLE( VALUE_T, KEY_T, HASH_T, KEY_EX_T, KEY_EQ_T, CLASSNAME, CLASSEXP, SHOULD_GROW, SHOULD_SHRINK ) \ +CLASSEXP CLASSNAME : protected _wxHashTableBase2 \ +{ \ +public: \ + typedef KEY_T key_type; \ + typedef VALUE_T value_type; \ + typedef HASH_T hasher; \ + typedef KEY_EQ_T key_equal; \ + \ + typedef size_t size_type; \ + typedef ptrdiff_t difference_type; \ + typedef value_type* pointer; \ + typedef const value_type* const_pointer; \ + typedef value_type& reference; \ + typedef const value_type& const_reference; \ + /* should these be protected? */ \ + typedef const KEY_T const_key_type; \ + typedef const VALUE_T const_mapped_type; \ +public: \ + struct Node; \ + typedef KEY_EX_T key_extractor; \ + typedef CLASSNAME Self; \ +protected: \ + Node** m_table; \ + size_t m_tableBuckets; \ + size_t m_items; \ + hasher m_hasher; \ + key_equal m_equals; \ + key_extractor m_getKey; \ +public: \ + struct Node:public _wxHashTable_NodeBase \ + { \ + public: \ + Node( const value_type& value ) \ + : m_value( value ) {} \ + Node* m_next() { return (Node*)this->m_nxt; } \ + \ + value_type m_value; \ + }; \ + \ + CLASSEXP Iterator; \ + friend CLASSEXP Iterator; \ +protected: \ + static void DeleteNode( _wxHashTable_NodeBase* node ) \ + { \ + delete (Node*)node; \ + } \ +public: \ + /* */ \ + /* forward iterator */ \ + /* */ \ + CLASSEXP Iterator \ + { \ + public: \ + Node* m_node; \ + Self* m_ht; \ + \ + Iterator() : m_node(0), m_ht(0) {} \ + Iterator( Node* node, const Self* ht ) \ + : m_node(node), m_ht((Self*)ht) {} \ + bool operator ==( const Iterator& it ) const \ + { return m_node == it.m_node; } \ + bool operator !=( const Iterator& it ) const \ + { return m_node != it.m_node; } \ + protected: \ + Node* GetNextNode() \ + { \ + size_type bucket = GetBucketForNode(m_ht,m_node); \ + for( size_type i = bucket + 1; i < m_ht->m_tableBuckets; ++i ) \ + { \ + if( m_ht->m_table[i] ) \ + return m_ht->m_table[i]; \ + } \ + return 0; \ + } \ + \ + void PlusPlus() \ + { \ + Node* next = m_node->m_next(); \ + m_node = next ? next : GetNextNode(); \ + } \ + }; \ + \ +public: \ + CLASSEXP iterator : public Iterator \ + { \ + public: \ + iterator() : Iterator() {} \ + iterator( Node* node, Self* ht ) : Iterator( node, ht ) {} \ + iterator& operator++() { PlusPlus(); return *this; } \ + iterator operator++(int) { iterator it=*this;PlusPlus();return it; } \ + reference operator *() const { return m_node->m_value; } \ + pointer operator ->() const { return &(m_node->m_value); } \ + }; \ + \ + CLASSEXP const_iterator : public Iterator \ + { \ + public: \ + const_iterator() : Iterator() {} \ + const_iterator(iterator i) : Iterator(i) {} \ + const_iterator( Node* node, const Self* ht ) \ + : Iterator( node, (Self*)ht ) {} \ + const_iterator& operator++() { PlusPlus();return *this; } \ + const_iterator operator++(int) { const_iterator it=*this;PlusPlus();return it; } \ + const_reference operator *() const { return m_node->m_value; } \ + const_pointer operator ->() const { return &(m_node->m_value); } \ + }; \ + \ + CLASSNAME( size_type sz = 10, const hasher& hfun = hasher(), \ + const key_equal& k_eq = key_equal(), \ + const key_extractor& k_ex = key_extractor() ) \ + : m_tableBuckets( GetNextPrime( (unsigned long) sz ) ), \ + m_items( 0 ), \ + m_hasher( hfun ), \ + m_equals( k_eq ), \ + m_getKey( k_ex ) \ + { \ + m_table = (Node**)AllocTable( m_tableBuckets ); \ + } \ + \ + CLASSNAME( const Self& ht ) \ + : m_table( 0 ), \ + m_tableBuckets( 0 ), \ + m_items( ht.m_items ), \ + m_hasher( ht.m_hasher ), \ + m_equals( ht.m_equals ), \ + m_getKey( ht.m_getKey ) \ + { \ + HashCopy( ht ); \ + } \ + \ + const Self& operator=( const Self& ht ) \ + { \ + clear(); \ + m_hasher = ht.m_hasher; \ + m_equals = ht.m_equals; \ + m_getKey = ht.m_getKey; \ + m_items = ht.m_items; \ + HashCopy( ht ); \ + return *this; \ + } \ + \ + ~CLASSNAME() \ + { \ + clear(); \ + \ + FreeTable(m_table); \ + } \ + \ + hasher hash_funct() { return m_hasher; } \ + key_equal key_eq() { return m_equals; } \ + \ + /* removes all elements from the hash table, but does not */ \ + /* shrink it ( perhaps it should ) */ \ + void clear() \ + { \ + DeleteNodes( m_tableBuckets, (_wxHashTable_NodeBase**)m_table, \ + DeleteNode ); \ + m_items = 0; \ + } \ + \ + size_type size() const { return m_items; } \ + size_type max_size() const { return size_type(-1); } \ + bool empty() const { return size() == 0; } \ + \ + const_iterator end() const { return const_iterator( 0, this ); } \ + iterator end() { return iterator( 0, this ); } \ + const_iterator begin() const \ + { return const_iterator( (Node*)GetFirstNode( m_tableBuckets, (_wxHashTable_NodeBase**)m_table ), this ); } \ + iterator begin() \ + { return iterator( (Node*)GetFirstNode( m_tableBuckets, (_wxHashTable_NodeBase**)m_table ), this ); } \ + \ + size_type erase( const const_key_type& key ) \ + { \ + Node** node = GetNodePtr( key ); \ + \ + if( !node ) \ + return 0; \ + \ + --m_items; \ + Node* temp = (*node)->m_next(); \ + delete *node; \ + (*node) = temp; \ + if( SHOULD_SHRINK( m_tableBuckets, m_items ) ) \ + ResizeTable( GetPreviousPrime( (unsigned long) m_tableBuckets ) - 1 ); \ + return 1; \ + } \ + \ +protected: \ + static size_type GetBucketForNode( Self* ht, Node* node ) \ + { \ + return ht->m_hasher( ht->m_getKey( node->m_value ) ) \ + % ht->m_tableBuckets; \ + } \ + static Node* CopyNode( Node* node ) { return new Node( *node ); } \ + \ + Node* GetOrCreateNode( const value_type& value, bool& created ) \ + { \ + const const_key_type& key = m_getKey( value ); \ + size_t bucket = m_hasher( key ) % m_tableBuckets; \ + Node* node = m_table[bucket]; \ + \ + while( node ) \ + { \ + if( m_equals( m_getKey( node->m_value ), key ) ) \ + { \ + created = false; \ + return node; \ + } \ + node = node->m_next(); \ + } \ + created = true; \ + return CreateNode( value, bucket); \ + }\ + Node * CreateNode( const value_type& value, size_t bucket ) \ + {\ + Node* node = new Node( value ); \ + node->m_nxt = m_table[bucket]; \ + m_table[bucket] = node; \ + \ + /* must be after the node is inserted */ \ + ++m_items; \ + if( SHOULD_GROW( m_tableBuckets, m_items ) ) \ + ResizeTable( m_tableBuckets ); \ + \ + return node; \ + } \ + void CreateNode( const value_type& value ) \ + {\ + CreateNode(value, m_hasher( m_getKey(value) ) % m_tableBuckets ); \ + }\ + \ + /* returns NULL if not found */ \ + Node** GetNodePtr( const const_key_type& key ) const \ + { \ + size_t bucket = m_hasher( key ) % m_tableBuckets; \ + Node** node = &m_table[bucket]; \ + \ + while( *node ) \ + { \ + if( m_equals( m_getKey( (*node)->m_value ), key ) ) \ + return node; \ + /* Tell the compiler to not do any strict-aliasing assumptions with a void cast? Can we make such a runtime guarantee? */ \ + node = (Node**)&(*node)->m_nxt; \ + } \ + \ + return NULL; \ + } \ + \ + /* returns NULL if not found */ \ + /* expressing it in terms of GetNodePtr is 5-8% slower :-( */ \ + Node* GetNode( const const_key_type& key ) const \ + { \ + size_t bucket = m_hasher( key ) % m_tableBuckets; \ + Node* node = m_table[bucket]; \ + \ + while( node ) \ + { \ + if( m_equals( m_getKey( node->m_value ), key ) ) \ + return node; \ + node = node->m_next(); \ + } \ + \ + return 0; \ + } \ + \ + void ResizeTable( size_t newSize ) \ + { \ + newSize = GetNextPrime( (unsigned long)newSize ); \ + Node** srcTable = m_table; \ + size_t srcBuckets = m_tableBuckets; \ + m_table = (Node**)AllocTable( newSize ); \ + m_tableBuckets = newSize; \ + \ + CopyHashTable( (_wxHashTable_NodeBase**)srcTable, srcBuckets, \ + this, (_wxHashTable_NodeBase**)m_table, \ + (BucketFromNode)GetBucketForNode,\ + (ProcessNode)&DummyProcessNode ); \ + FreeTable(srcTable); \ + } \ + \ + /* this must be called _after_ m_table has been cleaned */ \ + void HashCopy( const Self& ht ) \ + { \ + ResizeTable( ht.size() ); \ + CopyHashTable( (_wxHashTable_NodeBase**)ht.m_table, ht.m_tableBuckets,\ + (_wxHashTableBase2*)this, \ + (_wxHashTable_NodeBase**)m_table, \ + (BucketFromNode)GetBucketForNode, \ + (ProcessNode)CopyNode ); \ + } \ +}; + +// defines an STL-like pair class CLASSNAME storing two fields: first of type +// KEY_T and second of type VALUE_T +#define _WX_DECLARE_PAIR( KEY_T, VALUE_T, CLASSNAME, CLASSEXP ) \ +CLASSEXP CLASSNAME \ +{ \ +public: \ + typedef KEY_T t1; \ + typedef VALUE_T t2; \ + typedef const KEY_T const_t1; \ + typedef const VALUE_T const_t2; \ + \ + CLASSNAME( const const_t1& f, const const_t2& s ):first(t1(f)),second(t2(s)) {} \ + \ + t1 first; \ + t2 second; \ +}; + +// defines the class CLASSNAME returning the key part (of type KEY_T) from a +// pair of type PAIR_T +#define _WX_DECLARE_HASH_MAP_KEY_EX( KEY_T, PAIR_T, CLASSNAME, CLASSEXP ) \ +CLASSEXP CLASSNAME \ +{ \ + typedef KEY_T key_type; \ + typedef PAIR_T pair_type; \ + typedef const key_type const_key_type; \ + typedef const pair_type const_pair_type; \ + typedef const_key_type& const_key_reference; \ + typedef const_pair_type& const_pair_reference; \ +public: \ + CLASSNAME() { } \ + const_key_reference operator()( const_pair_reference pair ) const { return pair.first; }\ + \ + /* the dummy assignment operator is needed to suppress compiler */ \ + /* warnings from hash table class' operator=(): gcc complains about */ \ + /* "statement with no effect" without it */ \ + CLASSNAME& operator=(const CLASSNAME&) { return *this; } \ +}; + +// grow/shrink predicates +inline bool never_grow( size_t, size_t ) { return false; } +inline bool never_shrink( size_t, size_t ) { return false; } +inline bool grow_lf70( size_t buckets, size_t items ) +{ + return float(items)/float(buckets) >= 0.85; +} + +#endif // !wxUSE_STL || !defined(HAVE_STL_HASH_MAP) + +// ---------------------------------------------------------------------------- +// hashing and comparison functors +// ---------------------------------------------------------------------------- + +// NB: implementation detail: all of these classes must have dummy assignment +// operators to suppress warnings about "statement with no effect" from gcc +// in the hash table class assignment operator (where they're assigned) + +#if wxUSE_STL && defined(HAVE_STL_HASH_MAP) + +// integer types +class WXDLLIMPEXP_BASE wxIntegerHash +{ + WX_HASH_MAP_NAMESPACE::hash longHash; + WX_HASH_MAP_NAMESPACE::hash ulongHash; + WX_HASH_MAP_NAMESPACE::hash intHash; + WX_HASH_MAP_NAMESPACE::hash uintHash; + WX_HASH_MAP_NAMESPACE::hash shortHash; + WX_HASH_MAP_NAMESPACE::hash ushortHash; + +#if defined wxLongLong_t && !defined wxLongLongIsLong + // hash ought to work but doesn't on some compilers + #if (!defined SIZEOF_LONG_LONG && SIZEOF_LONG == 4) \ + || (defined SIZEOF_LONG_LONG && SIZEOF_LONG_LONG == SIZEOF_LONG * 2) + size_t longlongHash( wxLongLong_t x ) const + { + return longHash( wx_truncate_cast(long, x) ) ^ + longHash( wx_truncate_cast(long, x >> (sizeof(long) * 8)) ); + } + #elif defined SIZEOF_LONG_LONG && SIZEOF_LONG_LONG == SIZEOF_LONG + WX_HASH_MAP_NAMESPACE::hash longlongHash; + #else + WX_HASH_MAP_NAMESPACE::hash longlongHash; + #endif +#endif + +public: + wxIntegerHash() { } + size_t operator()( long x ) const { return longHash( x ); } + size_t operator()( unsigned long x ) const { return ulongHash( x ); } + size_t operator()( int x ) const { return intHash( x ); } + size_t operator()( unsigned int x ) const { return uintHash( x ); } + size_t operator()( short x ) const { return shortHash( x ); } + size_t operator()( unsigned short x ) const { return ushortHash( x ); } +#if defined wxLongLong_t && !defined wxLongLongIsLong + size_t operator()( wxLongLong_t x ) const { return longlongHash(x); } + size_t operator()( wxULongLong_t x ) const { return longlongHash(x); } +#endif + + wxIntegerHash& operator=(const wxIntegerHash&) { return *this; } +}; + +#else // !wxUSE_STL || !defined(HAVE_STL_HASH_MAP) + +// integer types +class WXDLLIMPEXP_BASE wxIntegerHash +{ +public: + wxIntegerHash() { } + unsigned long operator()( long x ) const { return (unsigned long)x; } + unsigned long operator()( unsigned long x ) const { return x; } + unsigned long operator()( int x ) const { return (unsigned long)x; } + unsigned long operator()( unsigned int x ) const { return x; } + unsigned long operator()( short x ) const { return (unsigned long)x; } + unsigned long operator()( unsigned short x ) const { return x; } +#if defined wxLongLong_t && !defined wxLongLongIsLong + wxULongLong_t operator()( wxLongLong_t x ) const { return wx_static_cast(wxULongLong_t, x); } + wxULongLong_t operator()( wxULongLong_t x ) const { return x; } +#endif + + wxIntegerHash& operator=(const wxIntegerHash&) { return *this; } +}; + +#endif // !wxUSE_STL || !defined(HAVE_STL_HASH_MAP) + +class WXDLLIMPEXP_BASE wxIntegerEqual +{ +public: + wxIntegerEqual() { } + bool operator()( long a, long b ) const { return a == b; } + bool operator()( unsigned long a, unsigned long b ) const { return a == b; } + bool operator()( int a, int b ) const { return a == b; } + bool operator()( unsigned int a, unsigned int b ) const { return a == b; } + bool operator()( short a, short b ) const { return a == b; } + bool operator()( unsigned short a, unsigned short b ) const { return a == b; } +#if defined wxLongLong_t && !defined wxLongLongIsLong + bool operator()( wxLongLong_t a, wxLongLong_t b ) const { return a == b; } + bool operator()( wxULongLong_t a, wxULongLong_t b ) const { return a == b; } +#endif + + wxIntegerEqual& operator=(const wxIntegerEqual&) { return *this; } +}; + +// pointers +class WXDLLIMPEXP_BASE wxPointerHash +{ +public: + wxPointerHash() { } + +#if wxUSE_STL && defined(HAVE_STL_HASH_MAP) + size_t operator()( const void* k ) const { return (size_t)k; } +#else + wxUIntPtr operator()( const void* k ) const { return wxPtrToUInt(k); } +#endif + + wxPointerHash& operator=(const wxPointerHash&) { return *this; } +}; + +class WXDLLIMPEXP_BASE wxPointerEqual +{ +public: + wxPointerEqual() { } + bool operator()( const void* a, const void* b ) const { return a == b; } + + wxPointerEqual& operator=(const wxPointerEqual&) { return *this; } +}; + +// wxString, char*, wxChar* +class WXDLLIMPEXP_BASE wxStringHash +{ +public: + wxStringHash() {} + unsigned long operator()( const wxString& x ) const + { return wxCharStringHash( x.c_str() ); } + unsigned long operator()( const wxChar* x ) const + { return wxCharStringHash( x ); } + static unsigned long wxCharStringHash( const wxChar* ); +#if wxUSE_UNICODE + unsigned long operator()( const char* x ) const + { return charStringHash( x ); } + static unsigned long charStringHash( const char* ); +#endif // wxUSE_UNICODE + + wxStringHash& operator=(const wxStringHash&) { return *this; } +}; + +class WXDLLIMPEXP_BASE wxStringEqual +{ +public: + wxStringEqual() {} + bool operator()( const wxString& a, const wxString& b ) const + { return a == b; } + bool operator()( const wxChar* a, const wxChar* b ) const + { return wxStrcmp( a, b ) == 0; } +#if wxUSE_UNICODE + bool operator()( const char* a, const char* b ) const + { return strcmp( a, b ) == 0; } +#endif // wxUSE_UNICODE + + wxStringEqual& operator=(const wxStringEqual&) { return *this; } +}; + +#if !wxUSE_STL || !defined(HAVE_STL_HASH_MAP) + +#define _WX_DECLARE_HASH_MAP( KEY_T, VALUE_T, HASH_T, KEY_EQ_T, CLASSNAME, CLASSEXP ) \ +_WX_DECLARE_PAIR( KEY_T, VALUE_T, CLASSNAME##_wxImplementation_Pair, CLASSEXP ) \ +_WX_DECLARE_HASH_MAP_KEY_EX( KEY_T, CLASSNAME##_wxImplementation_Pair, CLASSNAME##_wxImplementation_KeyEx, CLASSEXP ) \ +_WX_DECLARE_HASHTABLE( CLASSNAME##_wxImplementation_Pair, KEY_T, HASH_T, CLASSNAME##_wxImplementation_KeyEx, KEY_EQ_T, CLASSNAME##_wxImplementation_HashTable, CLASSEXP, grow_lf70, never_shrink ) \ +CLASSEXP CLASSNAME:public CLASSNAME##_wxImplementation_HashTable \ +{ \ +public: \ + typedef VALUE_T mapped_type; \ + _WX_DECLARE_PAIR( iterator, bool, Insert_Result, CLASSEXP ) \ + \ + wxEXPLICIT CLASSNAME( size_type hint = 100, hasher hf = hasher(), \ + key_equal eq = key_equal() ) \ + : CLASSNAME##_wxImplementation_HashTable( hint, hf, eq, \ + CLASSNAME##_wxImplementation_KeyEx() ) {} \ + \ + mapped_type& operator[]( const const_key_type& key ) \ + { \ + bool created; \ + return GetOrCreateNode( \ + CLASSNAME##_wxImplementation_Pair( key, mapped_type() ), \ + created)->m_value.second; \ + } \ + \ + const_iterator find( const const_key_type& key ) const \ + { \ + return const_iterator( GetNode( key ), this ); \ + } \ + \ + iterator find( const const_key_type& key ) \ + { \ + return iterator( GetNode( key ), this ); \ + } \ + \ + Insert_Result insert( const value_type& v ) \ + { \ + bool created; \ + Node *node = GetOrCreateNode( \ + CLASSNAME##_wxImplementation_Pair( v.first, v.second ), \ + created); \ + if ( !created ) \ + node->m_value.second = v.second; \ + return Insert_Result(iterator(node, this), created); \ + } \ + \ + size_type erase( const key_type& k ) \ + { return CLASSNAME##_wxImplementation_HashTable::erase( k ); } \ + void erase( const iterator& it ) { erase( it->first ); } \ + void erase( const const_iterator& it ) { erase( it->first ); } \ + \ + /* count() == 0 | 1 */ \ + size_type count( const const_key_type& key ) \ + { \ + /* explicit cast needed to suppress CodeWarrior warnings */ \ + return (size_type)(GetNode( key ) ? 1 : 0); \ + } \ +} + +#endif // !wxUSE_STL || !defined(HAVE_STL_HASH_MAP) + +// these macros are to be used in the user code +#define WX_DECLARE_HASH_MAP( KEY_T, VALUE_T, HASH_T, KEY_EQ_T, CLASSNAME) \ + _WX_DECLARE_HASH_MAP( KEY_T, VALUE_T, HASH_T, KEY_EQ_T, CLASSNAME, class ) + +#define WX_DECLARE_STRING_HASH_MAP( VALUE_T, CLASSNAME ) \ + _WX_DECLARE_HASH_MAP( wxString, VALUE_T, wxStringHash, wxStringEqual, \ + CLASSNAME, class ) + +#define WX_DECLARE_VOIDPTR_HASH_MAP( VALUE_T, CLASSNAME ) \ + _WX_DECLARE_HASH_MAP( void*, VALUE_T, wxPointerHash, wxPointerEqual, \ + CLASSNAME, class ) + +// and these do exactly the same thing but should be used inside the +// library +#define WX_DECLARE_HASH_MAP_WITH_DECL( KEY_T, VALUE_T, HASH_T, KEY_EQ_T, CLASSNAME, DECL) \ + _WX_DECLARE_HASH_MAP( KEY_T, VALUE_T, HASH_T, KEY_EQ_T, CLASSNAME, DECL ) + +#define WX_DECLARE_EXPORTED_HASH_MAP( KEY_T, VALUE_T, HASH_T, KEY_EQ_T, CLASSNAME) \ + WX_DECLARE_HASH_MAP_WITH_DECL( KEY_T, VALUE_T, HASH_T, KEY_EQ_T, \ + CLASSNAME, class WXDLLEXPORT ) + +#define WX_DECLARE_STRING_HASH_MAP_WITH_DECL( VALUE_T, CLASSNAME, DECL ) \ + _WX_DECLARE_HASH_MAP( wxString, VALUE_T, wxStringHash, wxStringEqual, \ + CLASSNAME, DECL ) + +#define WX_DECLARE_EXPORTED_STRING_HASH_MAP( VALUE_T, CLASSNAME ) \ + WX_DECLARE_STRING_HASH_MAP_WITH_DECL( VALUE_T, CLASSNAME, \ + class WXDLLEXPORT ) + +#define WX_DECLARE_VOIDPTR_HASH_MAP_WITH_DECL( VALUE_T, CLASSNAME, DECL ) \ + _WX_DECLARE_HASH_MAP( void*, VALUE_T, wxPointerHash, wxPointerEqual, \ + CLASSNAME, DECL ) + +#define WX_DECLARE_EXPORTED_VOIDPTR_HASH_MAP( VALUE_T, CLASSNAME ) \ + WX_DECLARE_VOIDPTR_HASH_MAP_WITH_DECL( VALUE_T, CLASSNAME, \ + class WXDLLEXPORT ) + +// delete all hash elements +// +// NB: the class declaration of the hash elements must be visible from the +// place where you use this macro, otherwise the proper destructor may not +// be called (a decent compiler should give a warning about it, but don't +// count on it)! +#define WX_CLEAR_HASH_MAP(type, hashmap) \ + { \ + type::iterator it, en; \ + for( it = (hashmap).begin(), en = (hashmap).end(); it != en; ++it ) \ + delete it->second; \ + (hashmap).clear(); \ + } + +//--------------------------------------------------------------------------- +// Declarations of common hashmap classes + +WX_DECLARE_HASH_MAP_WITH_DECL( long, long, wxIntegerHash, wxIntegerEqual, + wxLongToLongHashMap, class WXDLLIMPEXP_BASE ); + + +#endif // _WX_HASHMAP_H_ diff --git a/Externals/wxWidgets/include/wx/hashset.h b/Externals/wxWidgets/include/wx/hashset.h new file mode 100644 index 0000000000..9fba4c947c --- /dev/null +++ b/Externals/wxWidgets/include/wx/hashset.h @@ -0,0 +1,117 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/hashset.h +// Purpose: wxHashSet class +// Author: Mattia Barbon +// Modified by: +// Created: 11/08/2003 +// RCS-ID: $Id: hashset.h 49056 2007-10-05 22:42:35Z VS $ +// Copyright: (c) Mattia Barbon +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_HASHSET_H_ +#define _WX_HASHSET_H_ + +#include "wx/hashmap.h" + +#if wxUSE_STL && defined(HAVE_STL_HASH_MAP) + +#if defined(HAVE_EXT_HASH_MAP) + #include +#elif defined(HAVE_HASH_MAP) + #include +#endif + +#define _WX_DECLARE_HASH_SET( KEY_T, HASH_T, KEY_EQ_T, CLASSNAME, CLASSEXP )\ + typedef WX_HASH_MAP_NAMESPACE::hash_set< KEY_T, HASH_T, KEY_EQ_T > CLASSNAME + +#else // !wxUSE_STL || !defined(HAVE_STL_HASH_MAP) + +// this is a complex way of defining an easily inlineable identity function... +#define _WX_DECLARE_HASH_SET_KEY_EX( KEY_T, CLASSNAME, CLASSEXP ) \ +CLASSEXP CLASSNAME \ +{ \ + typedef KEY_T key_type; \ + typedef const key_type const_key_type; \ + typedef const_key_type& const_key_reference; \ +public: \ + CLASSNAME() { } \ + const_key_reference operator()( const_key_reference key ) const \ + { return key; } \ + \ + /* the dummy assignment operator is needed to suppress compiler */ \ + /* warnings from hash table class' operator=(): gcc complains about */ \ + /* "statement with no effect" without it */ \ + CLASSNAME& operator=(const CLASSNAME&) { return *this; } \ +}; + +#define _WX_DECLARE_HASH_SET( KEY_T, HASH_T, KEY_EQ_T, CLASSNAME, CLASSEXP )\ +_WX_DECLARE_HASH_SET_KEY_EX( KEY_T, CLASSNAME##_wxImplementation_KeyEx, CLASSEXP ) \ +_WX_DECLARE_HASHTABLE( KEY_T, KEY_T, HASH_T, CLASSNAME##_wxImplementation_KeyEx, KEY_EQ_T, CLASSNAME##_wxImplementation_HashTable, CLASSEXP, grow_lf70, never_shrink ) \ +CLASSEXP CLASSNAME:public CLASSNAME##_wxImplementation_HashTable \ +{ \ +public: \ + _WX_DECLARE_PAIR( iterator, bool, Insert_Result, CLASSEXP ) \ + \ + wxEXPLICIT CLASSNAME( size_type hint = 100, hasher hf = hasher(), \ + key_equal eq = key_equal() ) \ + : CLASSNAME##_wxImplementation_HashTable( hint, hf, eq, \ + CLASSNAME##_wxImplementation_KeyEx() ) {} \ + \ + Insert_Result insert( const key_type& key ) \ + { \ + bool created; \ + Node *node = GetOrCreateNode( key, created ); \ + return Insert_Result( iterator( node, this ), created ); \ + } \ + \ + const_iterator find( const const_key_type& key ) const \ + { \ + return const_iterator( GetNode( key ), this ); \ + } \ + \ + iterator find( const const_key_type& key ) \ + { \ + return iterator( GetNode( key ), this ); \ + } \ + \ + size_type erase( const key_type& k ) \ + { return CLASSNAME##_wxImplementation_HashTable::erase( k ); } \ + void erase( const iterator& it ) { erase( *it ); } \ + void erase( const const_iterator& it ) { erase( *it ); } \ + \ + /* count() == 0 | 1 */ \ + size_type count( const const_key_type& key ) \ + { return GetNode( key ) ? 1 : 0; } \ +} + +#endif // !wxUSE_STL || !defined(HAVE_STL_HASH_MAP) + +// these macros are to be used in the user code +#define WX_DECLARE_HASH_SET( KEY_T, HASH_T, KEY_EQ_T, CLASSNAME) \ + _WX_DECLARE_HASH_SET( KEY_T, HASH_T, KEY_EQ_T, CLASSNAME, class ) + +// and these do exactly the same thing but should be used inside the +// library +#define WX_DECLARE_HASH_SET_WITH_DECL( KEY_T, HASH_T, KEY_EQ_T, CLASSNAME, DECL) \ + _WX_DECLARE_HASH_SET( KEY_T, HASH_T, KEY_EQ_T, CLASSNAME, DECL ) + +#define WX_DECLARE_EXPORTED_HASH_SET( KEY_T, HASH_T, KEY_EQ_T, CLASSNAME) \ + WX_DECLARE_HASH_SET_WITH_DECL( KEY_T, HASH_T, KEY_EQ_T, \ + CLASSNAME, class WXDLLEXPORT ) + +// delete all hash elements +// +// NB: the class declaration of the hash elements must be visible from the +// place where you use this macro, otherwise the proper destructor may not +// be called (a decent compiler should give a warning about it, but don't +// count on it)! +#define WX_CLEAR_HASH_SET(type, hashset) \ + { \ + type::iterator it, en; \ + for( it = (hashset).begin(), en = (hashset).end(); it != en; ++it ) \ + delete *it; \ + (hashset).clear(); \ + } + +#endif // _WX_HASHSET_H_ diff --git a/Externals/wxWidgets/include/wx/help.h b/Externals/wxWidgets/include/wx/help.h new file mode 100644 index 0000000000..1cc09d42c1 --- /dev/null +++ b/Externals/wxWidgets/include/wx/help.h @@ -0,0 +1,48 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: help.h +// Purpose: wxHelpController base header +// Author: wxWidgets Team +// Modified by: +// Created: +// Copyright: (c) Julian Smart +// RCS-ID: $Id: help.h 33948 2005-05-04 18:57:50Z JS $ +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_HELP_H_BASE_ +#define _WX_HELP_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_HELP + +#include "wx/helpbase.h" + +#ifdef __WXWINCE__ + #include "wx/msw/wince/helpwce.h" + + #define wxHelpController wxWinceHelpController +#elif defined(__WXPALMOS__) + #include "wx/palmos/help.h" + + #define wxHelpController wxPalmHelpController +#elif defined(__WXMSW__) + #include "wx/msw/helpchm.h" + + #define wxHelpController wxCHMHelpController +#else // !MSW + +#if wxUSE_WXHTML_HELP + #include "wx/html/helpctrl.h" + #define wxHelpController wxHtmlHelpController +#else + #include "wx/generic/helpext.h" + #define wxHelpController wxExtHelpController +#endif + +#endif // MSW/!MSW + +#endif // wxUSE_HELP + +#endif + // _WX_HELP_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/helpbase.h b/Externals/wxWidgets/include/wx/helpbase.h new file mode 100644 index 0000000000..0ab778205a --- /dev/null +++ b/Externals/wxWidgets/include/wx/helpbase.h @@ -0,0 +1,106 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: helpbase.h +// Purpose: Help system base classes +// Author: Julian Smart +// Modified by: +// Created: 04/01/98 +// RCS-ID: $Id: helpbase.h 45498 2007-04-16 13:03:05Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_HELPBASEH__ +#define _WX_HELPBASEH__ + +#include "wx/defs.h" + +#if wxUSE_HELP + +#include "wx/object.h" +#include "wx/string.h" +#include "wx/gdicmn.h" +#include "wx/frame.h" + +// Flags for SetViewer +#define wxHELP_NETSCAPE 1 + +// Search modes: +enum wxHelpSearchMode +{ + wxHELP_SEARCH_INDEX, + wxHELP_SEARCH_ALL +}; + +// Defines the API for help controllers +class WXDLLEXPORT wxHelpControllerBase: public wxObject +{ +public: + inline wxHelpControllerBase(wxWindow* parentWindow = NULL) { m_parentWindow = parentWindow; } + inline ~wxHelpControllerBase() {} + + // Must call this to set the filename and server name. + // server is only required when implementing TCP/IP-based + // help controllers. + virtual bool Initialize(const wxString& WXUNUSED(file), int WXUNUSED(server) ) { return false; } + virtual bool Initialize(const wxString& WXUNUSED(file)) { return false; } + + // Set viewer: only relevant to some kinds of controller + virtual void SetViewer(const wxString& WXUNUSED(viewer), long WXUNUSED(flags) = 0) {} + + // If file is "", reloads file given in Initialize + virtual bool LoadFile(const wxString& file = wxEmptyString) = 0; + + // Displays the contents + virtual bool DisplayContents(void) = 0; + + // Display the given section + virtual bool DisplaySection(int sectionNo) = 0; + + // Display the section using a context id + virtual bool DisplayContextPopup(int WXUNUSED(contextId)) { return false; } + + // Display the text in a popup, if possible + virtual bool DisplayTextPopup(const wxString& WXUNUSED(text), const wxPoint& WXUNUSED(pos)) { return false; } + + // By default, uses KeywordSection to display a topic. Implementations + // may override this for more specific behaviour. + virtual bool DisplaySection(const wxString& section) { return KeywordSearch(section); } + virtual bool DisplayBlock(long blockNo) = 0; + virtual bool KeywordSearch(const wxString& k, + wxHelpSearchMode mode = wxHELP_SEARCH_ALL) = 0; + /// Allows one to override the default settings for the help frame. + virtual void SetFrameParameters(const wxString& WXUNUSED(title), + const wxSize& WXUNUSED(size), + const wxPoint& WXUNUSED(pos) = wxDefaultPosition, + bool WXUNUSED(newFrameEachTime) = false) + { + // does nothing by default + } + /// Obtains the latest settings used by the help frame and the help + /// frame. + virtual wxFrame *GetFrameParameters(wxSize *WXUNUSED(size) = NULL, + wxPoint *WXUNUSED(pos) = NULL, + bool *WXUNUSED(newFrameEachTime) = NULL) + { + return (wxFrame*) NULL; // does nothing by default + } + + virtual bool Quit() = 0; + virtual void OnQuit() {} + + /// Set the window that can optionally be used for the help window's parent. + virtual void SetParentWindow(wxWindow* win) { m_parentWindow = win; } + + /// Get the window that can optionally be used for the help window's parent. + virtual wxWindow* GetParentWindow() const { return m_parentWindow; } + +protected: + wxWindow* m_parentWindow; +private: + DECLARE_CLASS(wxHelpControllerBase) +}; + +#endif // wxUSE_HELP + +#endif +// _WX_HELPBASEH__ diff --git a/Externals/wxWidgets/include/wx/helphtml.h b/Externals/wxWidgets/include/wx/helphtml.h new file mode 100644 index 0000000000..8eb6c45f4c --- /dev/null +++ b/Externals/wxWidgets/include/wx/helphtml.h @@ -0,0 +1,20 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: helphtml.h +// Purpose: Includes wx/html/helpctrl.h, for wxHtmlHelpController. +// Author: Julian Smart +// Modified by: +// Created: 2003-05-24 +// RCS-ID: $Id: helphtml.h 27408 2004-05-23 20:53:33Z JS $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef __WX_HELPHTML_H_ +#define __WX_HELPHTML_H_ + +#if wxUSE_WXHTML_HELP +#include "wx/html/helpctrl.h" +#endif + +#endif // __WX_HELPHTML_H_ + diff --git a/Externals/wxWidgets/include/wx/helpwin.h b/Externals/wxWidgets/include/wx/helpwin.h new file mode 100644 index 0000000000..c211eb9b1b --- /dev/null +++ b/Externals/wxWidgets/include/wx/helpwin.h @@ -0,0 +1,22 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: helpwin.h +// Purpose: Includes Windows or OS/2 help +// Author: Julian Smart +// Modified by: +// Created: +// RCS-ID: $Id: helpwin.h 33948 2005-05-04 18:57:50Z JS $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_HELPWIN_H_BASE_ +#define _WX_HELPWIN_H_BASE_ + +#if defined(__WXMSW__) +#include "wx/msw/helpwin.h" +#elif defined(__WXPM__) +#include "wx/os2/helpwin.h" +#endif + +#endif + // _WX_HELPWIN_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/html/forcelnk.h b/Externals/wxWidgets/include/wx/html/forcelnk.h new file mode 100644 index 0000000000..7358268294 --- /dev/null +++ b/Externals/wxWidgets/include/wx/html/forcelnk.h @@ -0,0 +1,62 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: forcelnk.h +// Purpose: see bellow +// Author: Vaclav Slavik +// RCS-ID: $Id: forcelnk.h 35686 2005-09-25 18:46:14Z VZ $ +// Copyright: (c) Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +/* + +DESCRPITON: + +mod_*.cpp files contain handlers for tags. These files are modules - they contain +one wxTagModule class and it's OnInit() method is called from wxApp's init method. +The module is called even if you only link it into the executable, so everything +seems wonderful. + +The problem is that we have these modules in LIBRARY and mod_*.cpp files contain +no method nor class which is known out of the module. So the linker won't +link these .o/.obj files into executable because it detected that it is not used +by the program. + +To workaround this I introduced set of macros FORCE_LINK_ME and FORCE_LINK. These +macros are generic and are not limited to mod_*.cpp files. You may find them quite +useful somewhere else... + +How to use them: +let's suppose you want to always link file foo.cpp and that you have module +always.cpp that is certainly always linked (e.g. the one with main() function +or htmlwin.cpp in wxHtml library). + +Place FORCE_LINK_ME(foo) somewhere in foo.cpp and FORCE_LINK(foo) somewhere +in always.cpp +See mod_*.cpp and htmlwin.cpp for example :-) + +*/ + + +#ifndef _WX_FORCELNK_H_ +#define _WX_FORCELNK_H_ + +#include "wx/link.h" + +// compatibility defines +#define FORCE_LINK wxFORCE_LINK_MODULE +#define FORCE_LINK_ME wxFORCE_LINK_THIS_MODULE + +#define FORCE_WXHTML_MODULES() \ + FORCE_LINK(m_layout) \ + FORCE_LINK(m_fonts) \ + FORCE_LINK(m_image) \ + FORCE_LINK(m_list) \ + FORCE_LINK(m_dflist) \ + FORCE_LINK(m_pre) \ + FORCE_LINK(m_hline) \ + FORCE_LINK(m_links) \ + FORCE_LINK(m_tables) \ + FORCE_LINK(m_style) + + +#endif // _WX_FORCELNK_H_ diff --git a/Externals/wxWidgets/include/wx/html/helpctrl.h b/Externals/wxWidgets/include/wx/html/helpctrl.h new file mode 100644 index 0000000000..59ba39ed26 --- /dev/null +++ b/Externals/wxWidgets/include/wx/html/helpctrl.h @@ -0,0 +1,153 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: helpctrl.h +// Purpose: wxHtmlHelpController +// Notes: Based on htmlhelp.cpp, implementing a monolithic +// HTML Help controller class, by Vaclav Slavik +// Author: Harm van der Heijden and Vaclav Slavik +// RCS-ID: $Id: helpctrl.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) Harm van der Heijden and Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_HELPCTRL_H_ +#define _WX_HELPCTRL_H_ + +#include "wx/defs.h" + +#if wxUSE_WXHTML_HELP + +#include "wx/helpbase.h" +#include "wx/html/helpfrm.h" + +#define wxID_HTML_HELPFRAME (wxID_HIGHEST + 1) + +// This style indicates that the window is +// embedded in the application and must not be +// destroyed by the help controller. +#define wxHF_EMBEDDED 0x00008000 + +// Create a dialog for the help window. +#define wxHF_DIALOG 0x00010000 + +// Create a frame for the help window. +#define wxHF_FRAME 0x00020000 + +// Make the dialog modal when displaying help. +#define wxHF_MODAL 0x00040000 + +class WXDLLIMPEXP_FWD_HTML wxHtmlHelpDialog; +class WXDLLIMPEXP_FWD_HTML wxHtmlHelpWindow; +class WXDLLIMPEXP_FWD_HTML wxHtmlHelpFrame; +class WXDLLIMPEXP_FWD_HTML wxHtmlHelpDialog; + +class WXDLLIMPEXP_HTML wxHtmlHelpController : public wxHelpControllerBase // wxEvtHandler +{ + DECLARE_DYNAMIC_CLASS(wxHtmlHelpController) + +public: + wxHtmlHelpController(int style = wxHF_DEFAULT_STYLE, wxWindow* parentWindow = NULL); + virtual ~wxHtmlHelpController(); + + void SetTitleFormat(const wxString& format); + void SetTempDir(const wxString& path) { m_helpData.SetTempDir(path); } + bool AddBook(const wxString& book_url, bool show_wait_msg = false); + bool AddBook(const wxFileName& book_file, bool show_wait_msg = false); + + bool Display(const wxString& x); + bool Display(int id); + bool DisplayContents(); + bool DisplayIndex(); + bool KeywordSearch(const wxString& keyword, + wxHelpSearchMode mode = wxHELP_SEARCH_ALL); + + wxHtmlHelpWindow* GetHelpWindow() { return m_helpWindow; } + void SetHelpWindow(wxHtmlHelpWindow* helpWindow); + + wxHtmlHelpFrame* GetFrame() { return m_helpFrame; } + wxHtmlHelpDialog* GetDialog() { return m_helpDialog; } + + void UseConfig(wxConfigBase *config, const wxString& rootpath = wxEmptyString); + + // Assigns config object to the Ctrl. This config is then + // used in subsequent calls to Read/WriteCustomization of both help + // Ctrl and it's wxHtmlWindow + virtual void ReadCustomization(wxConfigBase *cfg, const wxString& path = wxEmptyString); + virtual void WriteCustomization(wxConfigBase *cfg, const wxString& path = wxEmptyString); + + //// Backward compatibility with wxHelpController API + + virtual bool Initialize(const wxString& file, int WXUNUSED(server) ) { return Initialize(file); } + virtual bool Initialize(const wxString& file); + virtual void SetViewer(const wxString& WXUNUSED(viewer), long WXUNUSED(flags) = 0) {} + virtual bool LoadFile(const wxString& file = wxT("")); + virtual bool DisplaySection(int sectionNo); + virtual bool DisplaySection(const wxString& section) { return Display(section); } + virtual bool DisplayBlock(long blockNo) { return DisplaySection(blockNo); } + virtual bool DisplayTextPopup(const wxString& text, const wxPoint& pos); + + virtual void SetFrameParameters(const wxString& title, + const wxSize& size, + const wxPoint& pos = wxDefaultPosition, + bool newFrameEachTime = false); + /// Obtains the latest settings used by the help frame and the help + /// frame. + virtual wxFrame *GetFrameParameters(wxSize *size = NULL, + wxPoint *pos = NULL, + bool *newFrameEachTime = NULL); + + // Get direct access to help data: + wxHtmlHelpData *GetHelpData() { return &m_helpData; } + + virtual bool Quit() ; + virtual void OnQuit() {} + + void OnCloseFrame(wxCloseEvent& evt); + + // Make the help controller's frame 'modal' if + // needed + void MakeModalIfNeeded(); + + // Find the top-most parent window + wxWindow* FindTopLevelWindow(); + +protected: + virtual wxWindow* CreateHelpWindow(); + virtual wxHtmlHelpFrame* CreateHelpFrame(wxHtmlHelpData *data); + virtual wxHtmlHelpDialog* CreateHelpDialog(wxHtmlHelpData *data); + virtual void DestroyHelpWindow(); + + wxHtmlHelpData m_helpData; + wxHtmlHelpWindow* m_helpWindow; + wxConfigBase * m_Config; + wxString m_ConfigRoot; + wxString m_titleFormat; + int m_FrameStyle; + wxHtmlHelpFrame* m_helpFrame; + wxHtmlHelpDialog* m_helpDialog; + + DECLARE_NO_COPY_CLASS(wxHtmlHelpController) +}; + +/* + * wxHtmlModalHelp + * A convenience class particularly for use on wxMac, + * where you can only show modal dialogs from a modal + * dialog. + * + * Use like this: + * + * wxHtmlModalHelp help(parent, filename, topic); + * + * If topic is empty, the help contents is displayed. + */ + +class WXDLLIMPEXP_HTML wxHtmlModalHelp +{ +public: + wxHtmlModalHelp(wxWindow* parent, const wxString& helpFile, const wxString& topic = wxEmptyString, + int style = wxHF_DEFAULT_STYLE | wxHF_DIALOG | wxHF_MODAL); +}; + +#endif // wxUSE_WXHTML_HELP + +#endif // _WX_HELPCTRL_H_ diff --git a/Externals/wxWidgets/include/wx/html/helpdata.h b/Externals/wxWidgets/include/wx/html/helpdata.h new file mode 100644 index 0000000000..1d7de2083f --- /dev/null +++ b/Externals/wxWidgets/include/wx/html/helpdata.h @@ -0,0 +1,266 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: helpdata.h +// Purpose: wxHtmlHelpData +// Notes: Based on htmlhelp.cpp, implementing a monolithic +// HTML Help controller class, by Vaclav Slavik +// Author: Harm van der Heijden and Vaclav Slavik +// RCS-ID: $Id: helpdata.h 41020 2006-09-05 20:47:48Z VZ $ +// Copyright: (c) Harm van der Heijden and Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_HELPDATA_H_ +#define _WX_HELPDATA_H_ + +#include "wx/defs.h" + +#if wxUSE_HTML + +#include "wx/object.h" +#include "wx/string.h" +#include "wx/filesys.h" +#include "wx/dynarray.h" +#include "wx/font.h" + +class WXDLLIMPEXP_HTML wxHtmlHelpData; + +//-------------------------------------------------------------------------------- +// helper classes & structs +//-------------------------------------------------------------------------------- + +class WXDLLIMPEXP_HTML wxHtmlBookRecord +{ +public: + wxHtmlBookRecord(const wxString& bookfile, const wxString& basepath, + const wxString& title, const wxString& start) + { + m_BookFile = bookfile; + m_BasePath = basepath; + m_Title = title; + m_Start = start; + // for debugging, give the contents index obvious default values + m_ContentsStart = m_ContentsEnd = -1; + } + wxString GetBookFile() const { return m_BookFile; } + wxString GetTitle() const { return m_Title; } + wxString GetStart() const { return m_Start; } + wxString GetBasePath() const { return m_BasePath; } + /* SetContentsRange: store in the bookrecord where in the index/contents lists the + * book's records are stored. This to facilitate searching in a specific book. + * This code will have to be revised when loading/removing books becomes dynamic. + * (as opposed to appending only) + * Note that storing index range is pointless, because the index is alphab. sorted. */ + void SetContentsRange(int start, int end) { m_ContentsStart = start; m_ContentsEnd = end; } + int GetContentsStart() const { return m_ContentsStart; } + int GetContentsEnd() const { return m_ContentsEnd; } + + void SetTitle(const wxString& title) { m_Title = title; } + void SetBasePath(const wxString& path) { m_BasePath = path; } + void SetStart(const wxString& start) { m_Start = start; } + + // returns full filename of page (which is part of the book), + // i.e. with book's basePath prepended. If page is already absolute + // path, basePath is _not_ prepended. + wxString GetFullPath(const wxString &page) const; + +protected: + wxString m_BookFile; + wxString m_BasePath; + wxString m_Title; + wxString m_Start; + int m_ContentsStart; + int m_ContentsEnd; +}; + + +WX_DECLARE_USER_EXPORTED_OBJARRAY(wxHtmlBookRecord, wxHtmlBookRecArray, + WXDLLIMPEXP_HTML); + +struct WXDLLIMPEXP_HTML wxHtmlHelpDataItem +{ + wxHtmlHelpDataItem() : level(0), parent(NULL), id(wxID_ANY), book(NULL) {} + + int level; + wxHtmlHelpDataItem *parent; + int id; + wxString name; + wxString page; + wxHtmlBookRecord *book; + + // returns full filename of m_Page, i.e. with book's basePath prepended + wxString GetFullPath() const { return book->GetFullPath(page); } + + // returns item indented with spaces if it has level>1: + wxString GetIndentedName() const; +}; + +WX_DECLARE_USER_EXPORTED_OBJARRAY(wxHtmlHelpDataItem, wxHtmlHelpDataItems, + WXDLLIMPEXP_HTML); + +#if WXWIN_COMPATIBILITY_2_4 +// old interface to contents and index: +struct wxHtmlContentsItem +{ + wxHtmlContentsItem(); + wxHtmlContentsItem(const wxHtmlHelpDataItem& d); + wxHtmlContentsItem& operator=(const wxHtmlContentsItem& d); + ~wxHtmlContentsItem(); + + int m_Level; + int m_ID; + wxChar *m_Name; + wxChar *m_Page; + wxHtmlBookRecord *m_Book; + + // returns full filename of m_Page, i.e. with book's basePath prepended + wxString GetFullPath() const { return m_Book->GetFullPath(m_Page); } + +private: + bool m_autofree; +}; +#endif + + +//------------------------------------------------------------------------------ +// wxHtmlSearchEngine +// This class takes input streams and scans them for occurence +// of keyword(s) +//------------------------------------------------------------------------------ + +class WXDLLIMPEXP_HTML wxHtmlSearchEngine : public wxObject +{ +public: + wxHtmlSearchEngine() : wxObject() {} + virtual ~wxHtmlSearchEngine() {} + + // Sets the keyword we will be searching for + virtual void LookFor(const wxString& keyword, bool case_sensitive, bool whole_words_only); + + // Scans the stream for the keyword. + // Returns true if the stream contains keyword, fALSE otherwise + virtual bool Scan(const wxFSFile& file); + +private: + wxString m_Keyword; + bool m_CaseSensitive; + bool m_WholeWords; + + DECLARE_NO_COPY_CLASS(wxHtmlSearchEngine) +}; + + +// State information of a search action. I'd have preferred to make this a +// nested class inside wxHtmlHelpData, but that's against coding standards :-( +// Never construct this class yourself, obtain a copy from +// wxHtmlHelpData::PrepareKeywordSearch(const wxString& key) +class WXDLLIMPEXP_HTML wxHtmlSearchStatus +{ +public: + // constructor; supply wxHtmlHelpData ptr, the keyword and (optionally) the + // title of the book to search. By default, all books are searched. + wxHtmlSearchStatus(wxHtmlHelpData* base, const wxString& keyword, + bool case_sensitive, bool whole_words_only, + const wxString& book = wxEmptyString); + bool Search(); // do the next iteration + bool IsActive() { return m_Active; } + int GetCurIndex() { return m_CurIndex; } + int GetMaxIndex() { return m_MaxIndex; } + const wxString& GetName() { return m_Name; } + + const wxHtmlHelpDataItem *GetCurItem() const { return m_CurItem; } +#if WXWIN_COMPATIBILITY_2_4 + wxDEPRECATED( wxHtmlContentsItem* GetContentsItem() ); +#endif + +private: + wxHtmlHelpData* m_Data; + wxHtmlSearchEngine m_Engine; + wxString m_Keyword, m_Name; + wxString m_LastPage; + wxHtmlHelpDataItem* m_CurItem; + bool m_Active; // search is not finished + int m_CurIndex; // where we are now + int m_MaxIndex; // number of files we search + // For progress bar: 100*curindex/maxindex = % complete + + DECLARE_NO_COPY_CLASS(wxHtmlSearchStatus) +}; + +class WXDLLIMPEXP_HTML wxHtmlHelpData : public wxObject +{ + DECLARE_DYNAMIC_CLASS(wxHtmlHelpData) + friend class wxHtmlSearchStatus; + +public: + wxHtmlHelpData(); + virtual ~wxHtmlHelpData(); + + // Sets directory where temporary files are stored. + // These temp files are index & contents file in binary (much faster to read) + // form. These files are NOT deleted on program's exit. + void SetTempDir(const wxString& path); + + // Adds new book. 'book' is location of .htb file (stands for "html book"). + // See documentation for details on its format. + // Returns success. + bool AddBook(const wxString& book); + bool AddBookParam(const wxFSFile& bookfile, + wxFontEncoding encoding, + const wxString& title, const wxString& contfile, + const wxString& indexfile = wxEmptyString, + const wxString& deftopic = wxEmptyString, + const wxString& path = wxEmptyString); + + // Some accessing stuff: + + // returns URL of page on basis of (file)name + wxString FindPageByName(const wxString& page); + // returns URL of page on basis of MS id + wxString FindPageById(int id); + + const wxHtmlBookRecArray& GetBookRecArray() const { return m_bookRecords; } + + const wxHtmlHelpDataItems& GetContentsArray() const { return m_contents; } + const wxHtmlHelpDataItems& GetIndexArray() const { return m_index; } + +#if WXWIN_COMPATIBILITY_2_4 + // deprecated interface, new interface is arrays-based (see above) + wxDEPRECATED( wxHtmlContentsItem* GetContents() ); + wxDEPRECATED( int GetContentsCnt() ); + wxDEPRECATED( wxHtmlContentsItem* GetIndex() ); + wxDEPRECATED( int GetIndexCnt() ); +#endif + +protected: + wxString m_tempPath; + + // each book has one record in this array: + wxHtmlBookRecArray m_bookRecords; + + wxHtmlHelpDataItems m_contents; // list of all available books and pages + wxHtmlHelpDataItems m_index; // list of index itesm + +#if WXWIN_COMPATIBILITY_2_4 + // deprecated data structures, set only if GetContents(), GetIndex() + // called + wxHtmlContentsItem* m_cacheContents; + wxHtmlContentsItem* m_cacheIndex; +private: + void CleanCompatibilityData(); +#endif + +protected: + // Imports .hhp files (MS HTML Help Workshop) + bool LoadMSProject(wxHtmlBookRecord *book, wxFileSystem& fsys, + const wxString& indexfile, const wxString& contentsfile); + // Reads binary book + bool LoadCachedBook(wxHtmlBookRecord *book, wxInputStream *f); + // Writes binary book + bool SaveCachedBook(wxHtmlBookRecord *book, wxOutputStream *f); + + DECLARE_NO_COPY_CLASS(wxHtmlHelpData) +}; + +#endif + +#endif diff --git a/Externals/wxWidgets/include/wx/html/helpdlg.h b/Externals/wxWidgets/include/wx/html/helpdlg.h new file mode 100644 index 0000000000..d63d31d1cc --- /dev/null +++ b/Externals/wxWidgets/include/wx/html/helpdlg.h @@ -0,0 +1,90 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/html/helpdlg.h +// Purpose: wxHtmlHelpDialog +// Notes: Based on htmlhelp.cpp, implementing a monolithic +// HTML Help controller class, by Vaclav Slavik +// Author: Harm van der Heijden, Vaclav Slavik, Julian Smart +// RCS-ID: $Id: helpdlg.h 49804 2007-11-10 01:09:42Z VZ $ +// Copyright: (c) Harm van der Heijden, Vaclav Slavik, Julian Smart +// Licence: wxWidgets licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_HELPDLG_H_ +#define _WX_HELPDLG_H_ + +#include "wx/defs.h" + +#if wxUSE_WXHTML_HELP + +#include "wx/html/helpdata.h" +#include "wx/window.h" +#include "wx/dialog.h" +#include "wx/frame.h" +#include "wx/config.h" +#include "wx/splitter.h" +#include "wx/notebook.h" +#include "wx/listbox.h" +#include "wx/choice.h" +#include "wx/combobox.h" +#include "wx/checkbox.h" +#include "wx/stattext.h" +#include "wx/html/htmlwin.h" +#include "wx/html/helpwnd.h" +#include "wx/html/htmprint.h" + +class WXDLLIMPEXP_FWD_HTML wxHtmlHelpController; +class WXDLLIMPEXP_FWD_HTML wxHtmlHelpWindow; + +class WXDLLIMPEXP_HTML wxHtmlHelpDialog : public wxDialog +{ + DECLARE_DYNAMIC_CLASS(wxHtmlHelpDialog) + +public: + wxHtmlHelpDialog(wxHtmlHelpData* data = NULL) { Init(data); } + wxHtmlHelpDialog(wxWindow* parent, wxWindowID wxWindowID, + const wxString& title = wxEmptyString, + int style = wxHF_DEFAULT_STYLE, wxHtmlHelpData* data = NULL); + virtual ~wxHtmlHelpDialog(); + + bool Create(wxWindow* parent, wxWindowID id, const wxString& title = wxEmptyString, + int style = wxHF_DEFAULT_STYLE); + + /// Returns the data associated with this dialog. + wxHtmlHelpData* GetData() { return m_Data; } + + /// Returns the controller that created this dialog. + wxHtmlHelpController* GetController() const { return m_helpController; } + + /// Sets the controller associated with this dialog. + void SetController(wxHtmlHelpController* controller) { m_helpController = controller; } + + /// Returns the help window. + wxHtmlHelpWindow* GetHelpWindow() const { return m_HtmlHelpWin; } + + // Sets format of title of the frame. Must contain exactly one "%s" + // (for title of displayed HTML page) + void SetTitleFormat(const wxString& format); + + // Override to add custom buttons to the toolbar + virtual void AddToolbarButtons(wxToolBar* WXUNUSED(toolBar), int WXUNUSED(style)) {} + +protected: + void Init(wxHtmlHelpData* data = NULL); + + void OnCloseWindow(wxCloseEvent& event); + +protected: + // Temporary pointer to pass to window + wxHtmlHelpData* m_Data; + wxString m_TitleFormat; // title of the help frame + wxHtmlHelpWindow *m_HtmlHelpWin; + wxHtmlHelpController* m_helpController; + + DECLARE_EVENT_TABLE() + DECLARE_NO_COPY_CLASS(wxHtmlHelpDialog) +}; + +#endif + // wxUSE_WXHTML_HELP + +#endif diff --git a/Externals/wxWidgets/include/wx/html/helpfrm.h b/Externals/wxWidgets/include/wx/html/helpfrm.h new file mode 100644 index 0000000000..81147ef327 --- /dev/null +++ b/Externals/wxWidgets/include/wx/html/helpfrm.h @@ -0,0 +1,147 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: helpfrm.h +// Purpose: wxHtmlHelpFrame +// Notes: Based on htmlhelp.cpp, implementing a monolithic +// HTML Help controller class, by Vaclav Slavik +// Author: Harm van der Heijden and Vaclav Slavik +// RCS-ID: $Id: helpfrm.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) Harm van der Heijden and Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_HELPFRM_H_ +#define _WX_HELPFRM_H_ + +#include "wx/defs.h" + +#if wxUSE_WXHTML_HELP + +#include "wx/helpbase.h" +#include "wx/html/helpdata.h" +#include "wx/window.h" +#include "wx/frame.h" +#include "wx/config.h" +#include "wx/splitter.h" +#include "wx/notebook.h" +#include "wx/listbox.h" +#include "wx/choice.h" +#include "wx/combobox.h" +#include "wx/checkbox.h" +#include "wx/stattext.h" +#include "wx/html/htmlwin.h" +#include "wx/html/helpwnd.h" +#include "wx/html/htmprint.h" + +class WXDLLIMPEXP_FWD_CORE wxButton; +class WXDLLIMPEXP_FWD_CORE wxTextCtrl; +class WXDLLIMPEXP_FWD_CORE wxTreeEvent; +class WXDLLIMPEXP_FWD_CORE wxTreeCtrl; + + +// style flags for the Help Frame +#define wxHF_TOOLBAR 0x0001 +#define wxHF_CONTENTS 0x0002 +#define wxHF_INDEX 0x0004 +#define wxHF_SEARCH 0x0008 +#define wxHF_BOOKMARKS 0x0010 +#define wxHF_OPEN_FILES 0x0020 +#define wxHF_PRINT 0x0040 +#define wxHF_FLAT_TOOLBAR 0x0080 +#define wxHF_MERGE_BOOKS 0x0100 +#define wxHF_ICONS_BOOK 0x0200 +#define wxHF_ICONS_BOOK_CHAPTER 0x0400 +#define wxHF_ICONS_FOLDER 0x0000 // this is 0 since it is default +#define wxHF_DEFAULT_STYLE (wxHF_TOOLBAR | wxHF_CONTENTS | \ + wxHF_INDEX | wxHF_SEARCH | \ + wxHF_BOOKMARKS | wxHF_PRINT) +//compatibility: +#define wxHF_OPENFILES wxHF_OPEN_FILES +#define wxHF_FLATTOOLBAR wxHF_FLAT_TOOLBAR +#define wxHF_DEFAULTSTYLE wxHF_DEFAULT_STYLE + +struct wxHtmlHelpMergedIndexItem; +class wxHtmlHelpMergedIndex; + +class WXDLLIMPEXP_FWD_CORE wxHelpControllerBase; +class WXDLLIMPEXP_FWD_HTML wxHtmlHelpController; +class WXDLLIMPEXP_FWD_CORE wxHtmlHelpWindow; + +class WXDLLIMPEXP_HTML wxHtmlHelpFrame : public wxFrame +{ + DECLARE_DYNAMIC_CLASS(wxHtmlHelpFrame) + +public: + wxHtmlHelpFrame(wxHtmlHelpData* data = NULL) { Init(data); } + wxHtmlHelpFrame(wxWindow* parent, wxWindowID wxWindowID, + const wxString& title = wxEmptyString, + int style = wxHF_DEFAULT_STYLE, wxHtmlHelpData* data = NULL, + wxConfigBase *config=NULL, const wxString& rootpath = wxEmptyString); + bool Create(wxWindow* parent, wxWindowID id, const wxString& title = wxEmptyString, + int style = wxHF_DEFAULT_STYLE, + wxConfigBase *config=NULL, const wxString& rootpath = wxEmptyString); + virtual ~wxHtmlHelpFrame(); + + /// Returns the data associated with the window. + wxHtmlHelpData* GetData() { return m_Data; } + + /// Returns the help controller associated with the window. + wxHtmlHelpController* GetController() const { return m_helpController; } + + /// Sets the help controller associated with the window. + void SetController(wxHtmlHelpController* controller) { m_helpController = controller; } + + /// Returns the help window. + wxHtmlHelpWindow* GetHelpWindow() const { return m_HtmlHelpWin; } + + // Sets format of title of the frame. Must contain exactly one "%s" + // (for title of displayed HTML page) + void SetTitleFormat(const wxString& format); + + // For compatibility + void UseConfig(wxConfigBase *config, const wxString& rootpath = wxEmptyString); + + // Make the help controller's frame 'modal' if + // needed + void AddGrabIfNeeded(); + + // Override to add custom buttons to the toolbar + virtual void AddToolbarButtons(wxToolBar* WXUNUSED(toolBar), int WXUNUSED(style)) {} + + // we don't want to prevent the app from closing just because a help window + // remains opened + virtual bool ShouldPreventAppExit() const { return false; } + +protected: + void Init(wxHtmlHelpData* data = NULL); + + void OnCloseWindow(wxCloseEvent& event); + void OnActivate(wxActivateEvent& event); + +#ifdef __WXMAC__ + void OnClose(wxCommandEvent& event); + void OnAbout(wxCommandEvent& event); +#endif + + // Images: + enum { + IMG_Book = 0, + IMG_Folder, + IMG_Page + }; + +protected: + wxHtmlHelpData* m_Data; + bool m_DataCreated; // m_Data created by frame, or supplied? + wxString m_TitleFormat; // title of the help frame + wxHtmlHelpWindow *m_HtmlHelpWin; + wxHtmlHelpController* m_helpController; + +private: + + DECLARE_EVENT_TABLE() + DECLARE_NO_COPY_CLASS(wxHtmlHelpFrame) +}; + +#endif // wxUSE_WXHTML_HELP + +#endif diff --git a/Externals/wxWidgets/include/wx/html/helpwnd.h b/Externals/wxWidgets/include/wx/html/helpwnd.h new file mode 100644 index 0000000000..d0b017920f --- /dev/null +++ b/Externals/wxWidgets/include/wx/html/helpwnd.h @@ -0,0 +1,300 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/html/helpwnd.h +// Purpose: wxHtmlHelpWindow +// Notes: Based on htmlhelp.cpp, implementing a monolithic +// HTML Help controller class, by Vaclav Slavik +// Author: Harm van der Heijden and Vaclav Slavik +// RCS-ID: $Id: helpwnd.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) Harm van der Heijden and Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_HELPWND_H_ +#define _WX_HELPWND_H_ + +#include "wx/defs.h" + +#if wxUSE_WXHTML_HELP + +#include "wx/helpbase.h" +#include "wx/html/helpdata.h" +#include "wx/window.h" +#include "wx/frame.h" +#include "wx/config.h" +#include "wx/splitter.h" +#include "wx/notebook.h" +#include "wx/listbox.h" +#include "wx/choice.h" +#include "wx/combobox.h" +#include "wx/checkbox.h" +#include "wx/stattext.h" +#include "wx/html/htmlwin.h" +#include "wx/html/htmprint.h" + +class WXDLLIMPEXP_FWD_CORE wxButton; +class WXDLLIMPEXP_FWD_CORE wxTextCtrl; +class WXDLLIMPEXP_FWD_CORE wxTreeEvent; +class WXDLLIMPEXP_FWD_CORE wxTreeCtrl; + +// style flags for the Help Frame +#define wxHF_TOOLBAR 0x0001 +#define wxHF_CONTENTS 0x0002 +#define wxHF_INDEX 0x0004 +#define wxHF_SEARCH 0x0008 +#define wxHF_BOOKMARKS 0x0010 +#define wxHF_OPEN_FILES 0x0020 +#define wxHF_PRINT 0x0040 +#define wxHF_FLAT_TOOLBAR 0x0080 +#define wxHF_MERGE_BOOKS 0x0100 +#define wxHF_ICONS_BOOK 0x0200 +#define wxHF_ICONS_BOOK_CHAPTER 0x0400 +#define wxHF_ICONS_FOLDER 0x0000 // this is 0 since it is default +#define wxHF_DEFAULT_STYLE (wxHF_TOOLBAR | wxHF_CONTENTS | \ + wxHF_INDEX | wxHF_SEARCH | \ + wxHF_BOOKMARKS | wxHF_PRINT) +//compatibility: +#define wxHF_OPENFILES wxHF_OPEN_FILES +#define wxHF_FLATTOOLBAR wxHF_FLAT_TOOLBAR +#define wxHF_DEFAULTSTYLE wxHF_DEFAULT_STYLE + +struct wxHtmlHelpFrameCfg +{ + int x, y, w, h; + long sashpos; + bool navig_on; +}; + +struct wxHtmlHelpMergedIndexItem; +class wxHtmlHelpMergedIndex; + +class WXDLLIMPEXP_FWD_CORE wxHelpControllerBase; +class WXDLLIMPEXP_FWD_HTML wxHtmlHelpController; + +/*! + * Help window + */ + +class WXDLLIMPEXP_HTML wxHtmlHelpWindow : public wxWindow +{ + DECLARE_DYNAMIC_CLASS(wxHtmlHelpWindow) + +public: + wxHtmlHelpWindow(wxHtmlHelpData* data = NULL) { Init(data); } + wxHtmlHelpWindow(wxWindow* parent, wxWindowID wxWindowID, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + int style = wxTAB_TRAVERSAL|wxNO_BORDER, + int helpStyle = wxHF_DEFAULT_STYLE, + wxHtmlHelpData* data = NULL); + bool Create(wxWindow* parent, wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + int style = wxTAB_TRAVERSAL|wxNO_BORDER, + int helpStyle = wxHF_DEFAULT_STYLE); + virtual ~wxHtmlHelpWindow(); + + wxHtmlHelpData* GetData() { return m_Data; } + wxHtmlHelpController* GetController() const { return m_helpController; } + void SetController(wxHtmlHelpController* controller); + + // Displays page x. If not found it will offect the user a choice of + // searching books. + // Looking for the page runs in these steps: + // 1. try to locate file named x (if x is for example "doc/howto.htm") + // 2. try to open starting page of book x + // 3. try to find x in contents (if x is for example "How To ...") + // 4. try to find x in index (if x is for example "How To ...") + bool Display(const wxString& x); + + // Alternative version that works with numeric ID. + // (uses extension to MS format, , see docs) + bool Display(const int id); + + // Displays help window and focuses contents. + bool DisplayContents(); + + // Displays help window and focuses index. + bool DisplayIndex(); + + // Searches for keyword. Returns true and display page if found, return + // false otherwise + // Syntax of keyword is Altavista-like: + // * words are separated by spaces + // (but "\"hello world\"" is only one world "hello world") + // * word may be pretended by + or - + // (+ : page must contain the word ; - : page can't contain the word) + // * if there is no + or - before the word, + is default + bool KeywordSearch(const wxString& keyword, + wxHelpSearchMode mode = wxHELP_SEARCH_ALL); + + void UseConfig(wxConfigBase *config, const wxString& rootpath = wxEmptyString) + { + m_Config = config; + m_ConfigRoot = rootpath; + ReadCustomization(config, rootpath); + } + + // Saves custom settings into cfg config. it will use the path 'path' + // if given, otherwise it will save info into currently selected path. + // saved values : things set by SetFonts, SetBorders. + void ReadCustomization(wxConfigBase *cfg, const wxString& path = wxEmptyString); + void WriteCustomization(wxConfigBase *cfg, const wxString& path = wxEmptyString); + + // call this to let wxHtmlHelpWindow know page changed + void NotifyPageChanged(); + + // Refreshes Contents and Index tabs + void RefreshLists(); + + // Gets the HTML window + wxHtmlWindow* GetHtmlWindow() const { return m_HtmlWin; } + + // Gets the splitter window + wxSplitterWindow* GetSplitterWindow() const { return m_Splitter; } + + // Gets the toolbar + wxToolBar* GetToolBar() const { return m_toolBar; } + + // Gets the configuration data + wxHtmlHelpFrameCfg& GetCfgData() { return m_Cfg; } + + // Gets the tree control + wxTreeCtrl *GetTreeCtrl() const { return m_ContentsBox; } + +protected: + void Init(wxHtmlHelpData* data = NULL); + + // Adds items to m_Contents tree control + void CreateContents(); + + // Adds items to m_IndexList + void CreateIndex(); + + // Add books to search choice panel + void CreateSearch(); + + // Updates "merged index" structure that combines indexes of all books + // into better searchable structure + void UpdateMergedIndex(); + + // Add custom buttons to toolbar + virtual void AddToolbarButtons(wxToolBar *toolBar, int style); + + // Displays options dialog (fonts etc.) + virtual void OptionsDialog(); + + void OnToolbar(wxCommandEvent& event); + void OnContentsSel(wxTreeEvent& event); + void OnIndexSel(wxCommandEvent& event); + void OnIndexFind(wxCommandEvent& event); + void OnIndexAll(wxCommandEvent& event); + void OnSearchSel(wxCommandEvent& event); + void OnSearch(wxCommandEvent& event); + void OnBookmarksSel(wxCommandEvent& event); + void OnSize(wxSizeEvent& event); + + // Images: + enum { + IMG_Book = 0, + IMG_Folder, + IMG_Page + }; + +protected: + wxHtmlHelpData* m_Data; + bool m_DataCreated; // m_Data created by frame, or supplied? + wxString m_TitleFormat; // title of the help frame + // below are various pointers to GUI components + wxHtmlWindow *m_HtmlWin; + wxSplitterWindow *m_Splitter; + wxPanel *m_NavigPan; + wxNotebook *m_NavigNotebook; + wxTreeCtrl *m_ContentsBox; + wxTextCtrl *m_IndexText; + wxButton *m_IndexButton; + wxButton *m_IndexButtonAll; + wxListBox *m_IndexList; + wxTextCtrl *m_SearchText; + wxButton *m_SearchButton; + wxListBox *m_SearchList; + wxChoice *m_SearchChoice; + wxStaticText *m_IndexCountInfo; + wxCheckBox *m_SearchCaseSensitive; + wxCheckBox *m_SearchWholeWords; + wxToolBar* m_toolBar; + + wxComboBox *m_Bookmarks; + wxArrayString m_BookmarksNames, m_BookmarksPages; + + wxHtmlHelpFrameCfg m_Cfg; + + wxConfigBase *m_Config; + wxString m_ConfigRoot; + + // pagenumbers of controls in notebook (usually 0,1,2) + int m_ContentsPage; + int m_IndexPage; + int m_SearchPage; + + // lists of available fonts (used in options dialog) + wxArrayString *m_NormalFonts, *m_FixedFonts; + int m_FontSize; // 0,1,2 = small,medium,big + wxString m_NormalFace, m_FixedFace; + + bool m_UpdateContents; + +#if wxUSE_PRINTING_ARCHITECTURE + wxHtmlEasyPrinting *m_Printer; +#endif + wxHashTable *m_PagesHash; + wxHtmlHelpController* m_helpController; + + int m_hfStyle; + +private: + void DoIndexFind(); + void DoIndexAll(); + void DisplayIndexItem(const wxHtmlHelpMergedIndexItem *it); + wxHtmlHelpMergedIndex *m_mergedIndex; + + DECLARE_EVENT_TABLE() + DECLARE_NO_COPY_CLASS(wxHtmlHelpWindow) +}; + +/*! + * Command IDs + */ + +enum +{ + //wxID_HTML_HELPFRAME = wxID_HIGHEST + 1, + wxID_HTML_PANEL = wxID_HIGHEST + 2, + wxID_HTML_BACK, + wxID_HTML_FORWARD, + wxID_HTML_UPNODE, + wxID_HTML_UP, + wxID_HTML_DOWN, + wxID_HTML_PRINT, + wxID_HTML_OPENFILE, + wxID_HTML_OPTIONS, + wxID_HTML_BOOKMARKSLIST, + wxID_HTML_BOOKMARKSADD, + wxID_HTML_BOOKMARKSREMOVE, + wxID_HTML_TREECTRL, + wxID_HTML_INDEXPAGE, + wxID_HTML_INDEXLIST, + wxID_HTML_INDEXTEXT, + wxID_HTML_INDEXBUTTON, + wxID_HTML_INDEXBUTTONALL, + wxID_HTML_NOTEBOOK, + wxID_HTML_SEARCHPAGE, + wxID_HTML_SEARCHTEXT, + wxID_HTML_SEARCHLIST, + wxID_HTML_SEARCHBUTTON, + wxID_HTML_SEARCHCHOICE, + wxID_HTML_COUNTINFO +}; + +#endif // wxUSE_WXHTML_HELP + +#endif diff --git a/Externals/wxWidgets/include/wx/html/htmlcell.h b/Externals/wxWidgets/include/wx/html/htmlcell.h new file mode 100644 index 0000000000..6d85443aa8 --- /dev/null +++ b/Externals/wxWidgets/include/wx/html/htmlcell.h @@ -0,0 +1,673 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: htmlcell.h +// Purpose: wxHtmlCell class is used by wxHtmlWindow/wxHtmlWinParser +// as a basic visual element of HTML page +// Author: Vaclav Slavik +// RCS-ID: $Id: htmlcell.h 41020 2006-09-05 20:47:48Z VZ $ +// Copyright: (c) 1999-2003 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_HTMLCELL_H_ +#define _WX_HTMLCELL_H_ + +#include "wx/defs.h" + +#if wxUSE_HTML + +#include "wx/html/htmltag.h" +#include "wx/html/htmldefs.h" +#include "wx/window.h" + + +class WXDLLIMPEXP_HTML wxHtmlWindowInterface; +class WXDLLIMPEXP_HTML wxHtmlLinkInfo; +class WXDLLIMPEXP_HTML wxHtmlCell; +class WXDLLIMPEXP_HTML wxHtmlContainerCell; + + +// wxHtmlSelection is data holder with information about text selection. +// Selection is defined by two positions (beginning and end of the selection) +// and two leaf(!) cells at these positions. +class WXDLLIMPEXP_HTML wxHtmlSelection +{ +public: + wxHtmlSelection() + : m_fromPos(wxDefaultPosition), m_toPos(wxDefaultPosition), + m_fromPrivPos(wxDefaultPosition), m_toPrivPos(wxDefaultPosition), + m_fromCell(NULL), m_toCell(NULL) {} + + void Set(const wxPoint& fromPos, const wxHtmlCell *fromCell, + const wxPoint& toPos, const wxHtmlCell *toCell); + void Set(const wxHtmlCell *fromCell, const wxHtmlCell *toCell); + + const wxHtmlCell *GetFromCell() const { return m_fromCell; } + const wxHtmlCell *GetToCell() const { return m_toCell; } + + // these values are in absolute coordinates: + const wxPoint& GetFromPos() const { return m_fromPos; } + const wxPoint& GetToPos() const { return m_toPos; } + + // these are From/ToCell's private data + const wxPoint& GetFromPrivPos() const { return m_fromPrivPos; } + const wxPoint& GetToPrivPos() const { return m_toPrivPos; } + void SetFromPrivPos(const wxPoint& pos) { m_fromPrivPos = pos; } + void SetToPrivPos(const wxPoint& pos) { m_toPrivPos = pos; } + void ClearPrivPos() { m_toPrivPos = m_fromPrivPos = wxDefaultPosition; } + + bool IsEmpty() const + { return m_fromPos == wxDefaultPosition && + m_toPos == wxDefaultPosition; } + +private: + wxPoint m_fromPos, m_toPos; + wxPoint m_fromPrivPos, m_toPrivPos; + const wxHtmlCell *m_fromCell, *m_toCell; +}; + + + +enum wxHtmlSelectionState +{ + wxHTML_SEL_OUT, // currently rendered cell is outside the selection + wxHTML_SEL_IN, // ... is inside selection + wxHTML_SEL_CHANGING // ... is the cell on which selection state changes +}; + +// Selection state is passed to wxHtmlCell::Draw so that it can render itself +// differently e.g. when inside text selection or outside it. +class WXDLLIMPEXP_HTML wxHtmlRenderingState +{ +public: + wxHtmlRenderingState() : m_selState(wxHTML_SEL_OUT) {} + + void SetSelectionState(wxHtmlSelectionState s) { m_selState = s; } + wxHtmlSelectionState GetSelectionState() const { return m_selState; } + + void SetFgColour(const wxColour& c) { m_fgColour = c; } + const wxColour& GetFgColour() const { return m_fgColour; } + void SetBgColour(const wxColour& c) { m_bgColour = c; } + const wxColour& GetBgColour() const { return m_bgColour; } + +private: + wxHtmlSelectionState m_selState; + wxColour m_fgColour, m_bgColour; +}; + + +// HTML rendering customization. This class is used when rendering wxHtmlCells +// as a callback: +class WXDLLIMPEXP_HTML wxHtmlRenderingStyle +{ +public: + virtual ~wxHtmlRenderingStyle() {} + virtual wxColour GetSelectedTextColour(const wxColour& clr) = 0; + virtual wxColour GetSelectedTextBgColour(const wxColour& clr) = 0; +}; + +// Standard style: +class WXDLLIMPEXP_HTML wxDefaultHtmlRenderingStyle : public wxHtmlRenderingStyle +{ +public: + virtual wxColour GetSelectedTextColour(const wxColour& clr); + virtual wxColour GetSelectedTextBgColour(const wxColour& clr); +}; + + +// Information given to cells when drawing them. Contains rendering state, +// selection information and rendering style object that can be used to +// customize the output. +class WXDLLIMPEXP_HTML wxHtmlRenderingInfo +{ +public: + wxHtmlRenderingInfo() : m_selection(NULL), m_style(NULL) {} + + void SetSelection(wxHtmlSelection *s) { m_selection = s; } + wxHtmlSelection *GetSelection() const { return m_selection; } + + void SetStyle(wxHtmlRenderingStyle *style) { m_style = style; } + wxHtmlRenderingStyle& GetStyle() { return *m_style; } + + wxHtmlRenderingState& GetState() { return m_state; } + +protected: + wxHtmlSelection *m_selection; + wxHtmlRenderingStyle *m_style; + wxHtmlRenderingState m_state; +}; + + +// Flags for wxHtmlCell::FindCellByPos +enum +{ + wxHTML_FIND_EXACT = 1, + wxHTML_FIND_NEAREST_BEFORE = 2, + wxHTML_FIND_NEAREST_AFTER = 4 +}; + + +// Superscript/subscript/normal script mode of a cell +enum wxHtmlScriptMode +{ + wxHTML_SCRIPT_NORMAL, + wxHTML_SCRIPT_SUB, + wxHTML_SCRIPT_SUP +}; + + +// --------------------------------------------------------------------------- +// wxHtmlCell +// Internal data structure. It represents fragments of parsed +// HTML page - a word, picture, table, horizontal line and so +// on. It is used by wxHtmlWindow to represent HTML page in +// memory. +// --------------------------------------------------------------------------- + + +class WXDLLIMPEXP_HTML wxHtmlCell : public wxObject +{ +public: + wxHtmlCell(); + virtual ~wxHtmlCell(); + + void SetParent(wxHtmlContainerCell *p) {m_Parent = p;} + wxHtmlContainerCell *GetParent() const {return m_Parent;} + + int GetPosX() const {return m_PosX;} + int GetPosY() const {return m_PosY;} + int GetWidth() const {return m_Width;} + + // Returns the maximum possible length of the cell. + // Call Layout at least once before using GetMaxTotalWidth() + virtual int GetMaxTotalWidth() const { return m_Width; } + + int GetHeight() const {return m_Height;} + int GetDescent() const {return m_Descent;} + + void SetScriptMode(wxHtmlScriptMode mode, long previousBase); + wxHtmlScriptMode GetScriptMode() const { return m_ScriptMode; } + long GetScriptBaseline() { return m_ScriptBaseline; } + + // Formatting cells are not visible on the screen, they only alter + // renderer's state. + bool IsFormattingCell() const { return m_Width == 0 && m_Height == 0; } + + const wxString& GetId() const { return m_id; } + void SetId(const wxString& id) { m_id = id; } + + // returns the link associated with this cell. The position is position + // within the cell so it varies from 0 to m_Width, from 0 to m_Height + virtual wxHtmlLinkInfo* GetLink(int WXUNUSED(x) = 0, + int WXUNUSED(y) = 0) const + { return m_Link; } + + // Returns cursor to be used when mouse is over the cell: + virtual wxCursor GetMouseCursor(wxHtmlWindowInterface *window) const; + +#if WXWIN_COMPATIBILITY_2_6 + // this was replaced by GetMouseCursor, don't use in new code! + virtual wxCursor GetCursor() const; +#endif + + // return next cell among parent's cells + wxHtmlCell *GetNext() const {return m_Next;} + // returns first child cell (if there are any, i.e. if this is container): + virtual wxHtmlCell* GetFirstChild() const { return NULL; } + + // members writing methods + virtual void SetPos(int x, int y) {m_PosX = x, m_PosY = y;} + void SetLink(const wxHtmlLinkInfo& link); + void SetNext(wxHtmlCell *cell) {m_Next = cell;} + + // 1. adjust cell's width according to the fact that maximal possible width + // is w. (this has sense when working with horizontal lines, tables + // etc.) + // 2. prepare layout (=fill-in m_PosX, m_PosY (and sometime m_Height) + // members) = place items to fit window, according to the width w + virtual void Layout(int w); + + // renders the cell + virtual void Draw(wxDC& WXUNUSED(dc), + int WXUNUSED(x), int WXUNUSED(y), + int WXUNUSED(view_y1), int WXUNUSED(view_y2), + wxHtmlRenderingInfo& WXUNUSED(info)) {} + + // proceed drawing actions in case the cell is not visible (scrolled out of + // screen). This is needed to change fonts, colors and so on. + virtual void DrawInvisible(wxDC& WXUNUSED(dc), + int WXUNUSED(x), int WXUNUSED(y), + wxHtmlRenderingInfo& WXUNUSED(info)) {} + + // This method returns pointer to the FIRST cell for that + // the condition + // is true. It first checks if the condition is true for this + // cell and then calls m_Next->Find(). (Note: it checks + // all subcells if the cell is container) + // Condition is unique condition identifier (see htmldefs.h) + // (user-defined condition IDs should start from 10000) + // and param is optional parameter + // Example : m_Cell->Find(wxHTML_COND_ISANCHOR, "news"); + // returns pointer to anchor news + virtual const wxHtmlCell* Find(int condition, const void* param) const; + + + // This function is called when mouse button is clicked over the cell. + // Returns true if a link is clicked, false otherwise. + // + // 'window' is pointer to wxHtmlWindowInterface of the window which + // generated the event. + // HINT: if this handling is not enough for you you should use + // wxHtmlWidgetCell + virtual bool ProcessMouseClick(wxHtmlWindowInterface *window, + const wxPoint& pos, + const wxMouseEvent& event); + +#if WXWIN_COMPATIBILITY_2_6 + // this was replaced by ProcessMouseClick, don't use in new code! + virtual void OnMouseClick(wxWindow *window, + int x, int y, const wxMouseEvent& event); +#endif + + // This method used to adjust pagebreak position. The parameter is variable + // that contains y-coordinate of page break (= horizontal line that should + // not be crossed by words, images etc.). If this cell cannot be divided + // into two pieces (each one on another page) then it moves the pagebreak + // few pixels up. + // + // Returned value : true if pagebreak was modified, false otherwise + // Usage : while (container->AdjustPagebreak(&p)) {} + virtual bool AdjustPagebreak(int *pagebreak, + wxArrayInt& known_pagebreaks) const; + + // Sets cell's behaviour on pagebreaks (see AdjustPagebreak). Default + // is true - the cell can be split on two pages + void SetCanLiveOnPagebreak(bool can) { m_CanLiveOnPagebreak = can; } + + // Can the line be broken before this cell? + virtual bool IsLinebreakAllowed() const + { return !IsFormattingCell(); } + + // Returns true for simple == terminal cells, i.e. not composite ones. + // This if for internal usage only and may disappear in future versions! + virtual bool IsTerminalCell() const { return true; } + + // Find a cell inside this cell positioned at the given coordinates + // (relative to this's positions). Returns NULL if no such cell exists. + // The flag can be used to specify whether to look for terminal or + // nonterminal cells or both. In either case, returned cell is deepest + // cell in cells tree that contains [x,y]. + virtual wxHtmlCell *FindCellByPos(wxCoord x, wxCoord y, + unsigned flags = wxHTML_FIND_EXACT) const; + + // Returns absolute position of the cell on HTML canvas. + // If rootCell is provided, then it's considered to be the root of the + // hierarchy and the returned value is relative to it. + wxPoint GetAbsPos(wxHtmlCell *rootCell = NULL) const; + + // Returns root cell of the hierarchy (i.e. grand-grand-...-parent that + // doesn't have a parent itself) + wxHtmlCell *GetRootCell() const; + + // Returns first (last) terminal cell inside this cell. It may return NULL, + // but it is rare -- only if there are no terminals in the tree. + virtual wxHtmlCell *GetFirstTerminal() const + { return wxConstCast(this, wxHtmlCell); } + virtual wxHtmlCell *GetLastTerminal() const + { return wxConstCast(this, wxHtmlCell); } + + // Returns cell's depth, i.e. how far under the root cell it is + // (if it is the root, depth is 0) + unsigned GetDepth() const; + + // Returns true if the cell appears before 'cell' in natural order of + // cells (= as they are read). If cell A is (grand)parent of cell B, + // then both A.IsBefore(B) and B.IsBefore(A) always return true. + bool IsBefore(wxHtmlCell *cell) const; + + // Converts the cell into text representation. If sel != NULL then + // only part of the cell inside the selection is converted. + virtual wxString ConvertToText(wxHtmlSelection *WXUNUSED(sel)) const + { return wxEmptyString; } + +protected: + // pointer to the next cell + wxHtmlCell *m_Next; + // pointer to parent cell + wxHtmlContainerCell *m_Parent; + + // dimensions of fragment (m_Descent is used to position text & images) + long m_Width, m_Height, m_Descent; + // position where the fragment is drawn: + long m_PosX, m_PosY; + + // superscript/subscript/normal: + wxHtmlScriptMode m_ScriptMode; + long m_ScriptBaseline; + + // destination address if this fragment is hypertext link, NULL otherwise + wxHtmlLinkInfo *m_Link; + // true if this cell can be placed on pagebreak, false otherwise + bool m_CanLiveOnPagebreak; + // unique identifier of the cell, generated from "id" property of tags + wxString m_id; + + DECLARE_ABSTRACT_CLASS(wxHtmlCell) + DECLARE_NO_COPY_CLASS(wxHtmlCell) +}; + + + + +// ---------------------------------------------------------------------------- +// Inherited cells: +// ---------------------------------------------------------------------------- + + +// ---------------------------------------------------------------------------- +// wxHtmlWordCell +// Single word in input stream. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_HTML wxHtmlWordCell : public wxHtmlCell +{ +public: + wxHtmlWordCell(const wxString& word, const wxDC& dc); + void Draw(wxDC& dc, int x, int y, int view_y1, int view_y2, + wxHtmlRenderingInfo& info); + virtual wxCursor GetMouseCursor(wxHtmlWindowInterface *window) const; + wxString ConvertToText(wxHtmlSelection *sel) const; + bool IsLinebreakAllowed() const { return m_allowLinebreak; } + + void SetPreviousWord(wxHtmlWordCell *cell); + +protected: + void SetSelectionPrivPos(const wxDC& dc, wxHtmlSelection *s) const; + void Split(const wxDC& dc, + const wxPoint& selFrom, const wxPoint& selTo, + unsigned& pos1, unsigned& pos2) const; + + wxString m_Word; + bool m_allowLinebreak; + + DECLARE_ABSTRACT_CLASS(wxHtmlWordCell) + DECLARE_NO_COPY_CLASS(wxHtmlWordCell) +}; + + + + + +// Container contains other cells, thus forming tree structure of rendering +// elements. Basic code of layout algorithm is contained in this class. +class WXDLLIMPEXP_HTML wxHtmlContainerCell : public wxHtmlCell +{ +public: + wxHtmlContainerCell(wxHtmlContainerCell *parent); + virtual ~wxHtmlContainerCell(); + + virtual void Layout(int w); + virtual void Draw(wxDC& dc, int x, int y, int view_y1, int view_y2, + wxHtmlRenderingInfo& info); + virtual void DrawInvisible(wxDC& dc, int x, int y, + wxHtmlRenderingInfo& info); +/* virtual bool AdjustPagebreak(int *pagebreak, int *known_pagebreaks = NULL, int number_of_pages = 0) const;*/ + virtual bool AdjustPagebreak(int *pagebreak, wxArrayInt& known_pagebreaks) const; + + // insert cell at the end of m_Cells list + void InsertCell(wxHtmlCell *cell); + + // sets horizontal/vertical alignment + void SetAlignHor(int al) {m_AlignHor = al; m_LastLayout = -1;} + int GetAlignHor() const {return m_AlignHor;} + void SetAlignVer(int al) {m_AlignVer = al; m_LastLayout = -1;} + int GetAlignVer() const {return m_AlignVer;} + + // sets left-border indentation. units is one of wxHTML_UNITS_* constants + // what is combination of wxHTML_INDENT_* + void SetIndent(int i, int what, int units = wxHTML_UNITS_PIXELS); + // returns the indentation. ind is one of wxHTML_INDENT_* constants + int GetIndent(int ind) const; + // returns type of value returned by GetIndent(ind) + int GetIndentUnits(int ind) const; + + // sets alignment info based on given tag's params + void SetAlign(const wxHtmlTag& tag); + // sets floating width adjustment + // (examples : 32 percent of parent container, + // -15 pixels percent (this means 100 % - 15 pixels) + void SetWidthFloat(int w, int units) {m_WidthFloat = w; m_WidthFloatUnits = units; m_LastLayout = -1;} + void SetWidthFloat(const wxHtmlTag& tag, double pixel_scale = 1.0); + // sets minimal height of this container. + void SetMinHeight(int h, int align = wxHTML_ALIGN_TOP) {m_MinHeight = h; m_MinHeightAlign = align; m_LastLayout = -1;} + + void SetBackgroundColour(const wxColour& clr) {m_UseBkColour = true; m_BkColour = clr;} + // returns background colour (of wxNullColour if none set), so that widgets can + // adapt to it: + wxColour GetBackgroundColour(); + void SetBorder(const wxColour& clr1, const wxColour& clr2) {m_UseBorder = true; m_BorderColour1 = clr1, m_BorderColour2 = clr2;} + virtual wxHtmlLinkInfo* GetLink(int x = 0, int y = 0) const; + virtual const wxHtmlCell* Find(int condition, const void* param) const; + +#if WXWIN_COMPATIBILITY_2_6 + // this was replaced by ProcessMouseClick, don't use in new code! + virtual void OnMouseClick(wxWindow *window, + int x, int y, const wxMouseEvent& event); +#endif + virtual bool ProcessMouseClick(wxHtmlWindowInterface *window, + const wxPoint& pos, + const wxMouseEvent& event); + + virtual wxHtmlCell* GetFirstChild() const { return m_Cells; } +#if WXWIN_COMPATIBILITY_2_4 + wxDEPRECATED( wxHtmlCell* GetFirstCell() const ); +#endif + // returns last child cell: + wxHtmlCell* GetLastChild() const { return m_LastCell; } + + // see comment in wxHtmlCell about this method + virtual bool IsTerminalCell() const { return false; } + + virtual wxHtmlCell *FindCellByPos(wxCoord x, wxCoord y, + unsigned flags = wxHTML_FIND_EXACT) const; + + virtual wxHtmlCell *GetFirstTerminal() const; + virtual wxHtmlCell *GetLastTerminal() const; + + + // Removes indentation on top or bottom of the container (i.e. above or + // below first/last terminal cell). For internal use only. + virtual void RemoveExtraSpacing(bool top, bool bottom); + + // Returns the maximum possible length of the container. + // Call Layout at least once before using GetMaxTotalWidth() + virtual int GetMaxTotalWidth() const { return m_MaxTotalWidth; } + +protected: + void UpdateRenderingStatePre(wxHtmlRenderingInfo& info, + wxHtmlCell *cell) const; + void UpdateRenderingStatePost(wxHtmlRenderingInfo& info, + wxHtmlCell *cell) const; + +protected: + int m_IndentLeft, m_IndentRight, m_IndentTop, m_IndentBottom; + // indentation of subcells. There is always m_Indent pixels + // big space between given border of the container and the subcells + // it m_Indent < 0 it is in PERCENTS, otherwise it is in pixels + int m_MinHeight, m_MinHeightAlign; + // minimal height. + wxHtmlCell *m_Cells, *m_LastCell; + // internal cells, m_Cells points to the first of them, m_LastCell to the last one. + // (LastCell is needed only to speed-up InsertCell) + int m_AlignHor, m_AlignVer; + // alignment horizontal and vertical (left, center, right) + int m_WidthFloat, m_WidthFloatUnits; + // width float is used in adjustWidth + bool m_UseBkColour; + wxColour m_BkColour; + // background color of this container + bool m_UseBorder; + wxColour m_BorderColour1, m_BorderColour2; + // borders color of this container + int m_LastLayout; + // if != -1 then call to Layout may be no-op + // if previous call to Layout has same argument + int m_MaxTotalWidth; + // Maximum possible length if ignoring line wrap + + + DECLARE_ABSTRACT_CLASS(wxHtmlContainerCell) + DECLARE_NO_COPY_CLASS(wxHtmlContainerCell) +}; + +#if WXWIN_COMPATIBILITY_2_4 +inline wxHtmlCell* wxHtmlContainerCell::GetFirstCell() const + { return GetFirstChild(); } +#endif + + + + +// --------------------------------------------------------------------------- +// wxHtmlColourCell +// Color changer. +// --------------------------------------------------------------------------- + +class WXDLLIMPEXP_HTML wxHtmlColourCell : public wxHtmlCell +{ +public: + wxHtmlColourCell(const wxColour& clr, int flags = wxHTML_CLR_FOREGROUND) : wxHtmlCell() {m_Colour = clr; m_Flags = flags;} + virtual void Draw(wxDC& dc, int x, int y, int view_y1, int view_y2, + wxHtmlRenderingInfo& info); + virtual void DrawInvisible(wxDC& dc, int x, int y, + wxHtmlRenderingInfo& info); + +protected: + wxColour m_Colour; + unsigned m_Flags; + + DECLARE_ABSTRACT_CLASS(wxHtmlColourCell) + DECLARE_NO_COPY_CLASS(wxHtmlColourCell) +}; + + + + +//-------------------------------------------------------------------------------- +// wxHtmlFontCell +// Sets actual font used for text rendering +//-------------------------------------------------------------------------------- + +class WXDLLIMPEXP_HTML wxHtmlFontCell : public wxHtmlCell +{ +public: + wxHtmlFontCell(wxFont *font) : wxHtmlCell() { m_Font = (*font); } + virtual void Draw(wxDC& dc, int x, int y, int view_y1, int view_y2, + wxHtmlRenderingInfo& info); + virtual void DrawInvisible(wxDC& dc, int x, int y, + wxHtmlRenderingInfo& info); + +protected: + wxFont m_Font; + + DECLARE_ABSTRACT_CLASS(wxHtmlFontCell) + DECLARE_NO_COPY_CLASS(wxHtmlFontCell) +}; + + + + + + +//-------------------------------------------------------------------------------- +// wxHtmlwidgetCell +// This cell is connected with wxWindow object +// You can use it to insert windows into HTML page +// (buttons, input boxes etc.) +//-------------------------------------------------------------------------------- + +class WXDLLIMPEXP_HTML wxHtmlWidgetCell : public wxHtmlCell +{ +public: + // !!! wnd must have correct parent! + // if w != 0 then the m_Wnd has 'floating' width - it adjust + // it's width according to parent container's width + // (w is percent of parent's width) + wxHtmlWidgetCell(wxWindow *wnd, int w = 0); + virtual ~wxHtmlWidgetCell() { m_Wnd->Destroy(); } + virtual void Draw(wxDC& dc, int x, int y, int view_y1, int view_y2, + wxHtmlRenderingInfo& info); + virtual void DrawInvisible(wxDC& dc, int x, int y, + wxHtmlRenderingInfo& info); + virtual void Layout(int w); + +protected: + wxWindow* m_Wnd; + int m_WidthFloat; + // width float is used in adjustWidth (it is in percents) + + DECLARE_ABSTRACT_CLASS(wxHtmlWidgetCell) + DECLARE_NO_COPY_CLASS(wxHtmlWidgetCell) +}; + + + +//-------------------------------------------------------------------------------- +// wxHtmlLinkInfo +// Internal data structure. It represents hypertext link +//-------------------------------------------------------------------------------- + +class WXDLLIMPEXP_HTML wxHtmlLinkInfo : public wxObject +{ +public: + wxHtmlLinkInfo() : wxObject() + { m_Href = m_Target = wxEmptyString; m_Event = NULL, m_Cell = NULL; } + wxHtmlLinkInfo(const wxString& href, const wxString& target = wxEmptyString) : wxObject() + { m_Href = href; m_Target = target; m_Event = NULL, m_Cell = NULL; } + wxHtmlLinkInfo(const wxHtmlLinkInfo& l) : wxObject() + { m_Href = l.m_Href, m_Target = l.m_Target, m_Event = l.m_Event; + m_Cell = l.m_Cell; } + wxHtmlLinkInfo& operator=(const wxHtmlLinkInfo& l) + { m_Href = l.m_Href, m_Target = l.m_Target, m_Event = l.m_Event; + m_Cell = l.m_Cell; return *this; } + + void SetEvent(const wxMouseEvent *e) { m_Event = e; } + void SetHtmlCell(const wxHtmlCell *e) { m_Cell = e; } + + wxString GetHref() const { return m_Href; } + wxString GetTarget() const { return m_Target; } + const wxMouseEvent* GetEvent() const { return m_Event; } + const wxHtmlCell* GetHtmlCell() const { return m_Cell; } + +private: + wxString m_Href, m_Target; + const wxMouseEvent *m_Event; + const wxHtmlCell *m_Cell; +}; + + + +// ---------------------------------------------------------------------------- +// wxHtmlTerminalCellsInterator +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_HTML wxHtmlTerminalCellsInterator +{ +public: + wxHtmlTerminalCellsInterator(const wxHtmlCell *from, const wxHtmlCell *to) + : m_to(to), m_pos(from) {} + + operator bool() const { return m_pos != NULL; } + const wxHtmlCell* operator++(); + const wxHtmlCell* operator->() const { return m_pos; } + const wxHtmlCell* operator*() const { return m_pos; } + +private: + const wxHtmlCell *m_to, *m_pos; +}; + + + +#endif // wxUSE_HTML + +#endif // _WX_HTMLCELL_H_ + diff --git a/Externals/wxWidgets/include/wx/html/htmldefs.h b/Externals/wxWidgets/include/wx/html/htmldefs.h new file mode 100644 index 0000000000..68a06074cd --- /dev/null +++ b/Externals/wxWidgets/include/wx/html/htmldefs.h @@ -0,0 +1,104 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: htmldefs.h +// Purpose: constants for wxhtml library +// Author: Vaclav Slavik +// RCS-ID: $Id: htmldefs.h 40823 2006-08-25 16:52:58Z VZ $ +// Copyright: (c) 1999 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + + +#ifndef _WX_HTMLDEFS_H_ +#define _WX_HTMLDEFS_H_ + +#include "wx/defs.h" + +#if wxUSE_HTML + +//-------------------------------------------------------------------------------- +// ALIGNMENTS +// Describes alignment of text etc. in containers +//-------------------------------------------------------------------------------- + +#define wxHTML_ALIGN_LEFT 0x0000 +#define wxHTML_ALIGN_RIGHT 0x0002 +#define wxHTML_ALIGN_JUSTIFY 0x0010 + +#define wxHTML_ALIGN_TOP 0x0004 +#define wxHTML_ALIGN_BOTTOM 0x0008 + +#define wxHTML_ALIGN_CENTER 0x0001 + + + +//-------------------------------------------------------------------------------- +// COLOR MODES +// Used by wxHtmlColourCell to determine clr of what is changing +//-------------------------------------------------------------------------------- + +#define wxHTML_CLR_FOREGROUND 0x0001 +#define wxHTML_CLR_BACKGROUND 0x0002 + + + +//-------------------------------------------------------------------------------- +// UNITS +// Used to specify units +//-------------------------------------------------------------------------------- + +#define wxHTML_UNITS_PIXELS 0x0001 +#define wxHTML_UNITS_PERCENT 0x0002 + + + +//-------------------------------------------------------------------------------- +// INDENTS +// Used to specify indetation relatives +//-------------------------------------------------------------------------------- + +#define wxHTML_INDENT_LEFT 0x0010 +#define wxHTML_INDENT_RIGHT 0x0020 +#define wxHTML_INDENT_TOP 0x0040 +#define wxHTML_INDENT_BOTTOM 0x0080 + +#define wxHTML_INDENT_HORIZONTAL (wxHTML_INDENT_LEFT | wxHTML_INDENT_RIGHT) +#define wxHTML_INDENT_VERTICAL (wxHTML_INDENT_TOP | wxHTML_INDENT_BOTTOM) +#define wxHTML_INDENT_ALL (wxHTML_INDENT_VERTICAL | wxHTML_INDENT_HORIZONTAL) + + + + +//-------------------------------------------------------------------------------- +// FIND CONDITIONS +// Identifiers of wxHtmlCell's Find() conditions +//-------------------------------------------------------------------------------- + +#define wxHTML_COND_ISANCHOR 1 + // Finds the anchor of 'param' name (pointer to wxString). + +#define wxHTML_COND_ISIMAGEMAP 2 + // Finds imagemap of 'param' name (pointer to wxString). + // (used exclusively by m_image.cpp) + +#define wxHTML_COND_USER 10000 + // User-defined conditions should start from this number + + +//-------------------------------------------------------------------------------- +// INTERNALS +// wxHTML internal constants +//-------------------------------------------------------------------------------- + + /* size of one scroll step of wxHtmlWindow in pixels */ +#define wxHTML_SCROLL_STEP 16 + + /* size of temporary buffer used during parsing */ +#define wxHTML_BUFLEN 1024 + + /* maximum number of pages printable via html printing */ +#define wxHTML_PRINT_MAX_PAGES 999 + +#endif // wxUSE_HTML + +#endif // _WX_HTMLDEFS_H_ + diff --git a/Externals/wxWidgets/include/wx/html/htmlfilt.h b/Externals/wxWidgets/include/wx/html/htmlfilt.h new file mode 100644 index 0000000000..b3eda9275f --- /dev/null +++ b/Externals/wxWidgets/include/wx/html/htmlfilt.h @@ -0,0 +1,82 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: htmlfilt.h +// Purpose: filters +// Author: Vaclav Slavik +// RCS-ID: $Id: htmlfilt.h 35650 2005-09-23 12:56:45Z MR $ +// Copyright: (c) 1999 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_HTMLFILT_H_ +#define _WX_HTMLFILT_H_ + +#include "wx/defs.h" + +#if wxUSE_HTML + +#include "wx/filesys.h" + + +//-------------------------------------------------------------------------------- +// wxHtmlFilter +// This class is input filter. It can "translate" files +// in non-HTML format to HTML format +// interface to access certain +// kinds of files (HTPP, FTP, local, tar.gz etc..) +//-------------------------------------------------------------------------------- + +class WXDLLIMPEXP_HTML wxHtmlFilter : public wxObject +{ + DECLARE_ABSTRACT_CLASS(wxHtmlFilter) + +public: + wxHtmlFilter() : wxObject() {} + virtual ~wxHtmlFilter() {} + + // returns true if this filter is able to open&read given file + virtual bool CanRead(const wxFSFile& file) const = 0; + + // Reads given file and returns HTML document. + // Returns empty string if opening failed + virtual wxString ReadFile(const wxFSFile& file) const = 0; +}; + + + +//-------------------------------------------------------------------------------- +// wxHtmlFilterPlainText +// This filter is used as default filter if no other can +// be used (= uknown type of file). It is used by +// wxHtmlWindow itself. +//-------------------------------------------------------------------------------- + + +class WXDLLIMPEXP_HTML wxHtmlFilterPlainText : public wxHtmlFilter +{ + DECLARE_DYNAMIC_CLASS(wxHtmlFilterPlainText) + +public: + virtual bool CanRead(const wxFSFile& file) const; + virtual wxString ReadFile(const wxFSFile& file) const; +}; + +//-------------------------------------------------------------------------------- +// wxHtmlFilterHTML +// filter for text/html +//-------------------------------------------------------------------------------- + +class wxHtmlFilterHTML : public wxHtmlFilter +{ + DECLARE_DYNAMIC_CLASS(wxHtmlFilterHTML) + + public: + virtual bool CanRead(const wxFSFile& file) const; + virtual wxString ReadFile(const wxFSFile& file) const; +}; + + + +#endif // wxUSE_HTML + +#endif // _WX_HTMLFILT_H_ + diff --git a/Externals/wxWidgets/include/wx/html/htmlpars.h b/Externals/wxWidgets/include/wx/html/htmlpars.h new file mode 100644 index 0000000000..ea71ffe06b --- /dev/null +++ b/Externals/wxWidgets/include/wx/html/htmlpars.h @@ -0,0 +1,283 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: htmlpars.h +// Purpose: wxHtmlParser class (generic parser) +// Author: Vaclav Slavik +// RCS-ID: $Id: htmlpars.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) 1999 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_HTMLPARS_H_ +#define _WX_HTMLPARS_H_ + +#include "wx/defs.h" +#if wxUSE_HTML + +#include "wx/html/htmltag.h" +#include "wx/filesys.h" +#include "wx/hash.h" +#include "wx/fontenc.h" + +class WXDLLIMPEXP_FWD_BASE wxMBConv; +class WXDLLIMPEXP_FWD_HTML wxHtmlParser; +class WXDLLIMPEXP_FWD_HTML wxHtmlTagHandler; +class WXDLLIMPEXP_FWD_HTML wxHtmlEntitiesParser; + +class wxHtmlTextPieces; +class wxHtmlParserState; + + +enum wxHtmlURLType +{ + wxHTML_URL_PAGE, + wxHTML_URL_IMAGE, + wxHTML_URL_OTHER +}; + +// This class handles generic parsing of HTML document : it scans +// the document and divides it into blocks of tags (where one block +// consists of starting and ending tag and of text between these +// 2 tags. +class WXDLLIMPEXP_HTML wxHtmlParser : public wxObject +{ + DECLARE_ABSTRACT_CLASS(wxHtmlParser) + +public: + wxHtmlParser(); + virtual ~wxHtmlParser(); + + // Sets the class which will be used for opening files + void SetFS(wxFileSystem *fs) { m_FS = fs; } + + wxFileSystem* GetFS() const { return m_FS; } + + // Opens file if the parser is allowed to open given URL (may be forbidden + // for security reasons) + virtual wxFSFile *OpenURL(wxHtmlURLType type, const wxString& url) const; + + // You can simply call this method when you need parsed output. + // This method does these things: + // 1. call InitParser(source); + // 2. call DoParsing(); + // 3. call GetProduct(); (its return value is then returned) + // 4. call DoneParser(); + wxObject* Parse(const wxString& source); + + // Sets the source. This must be called before running Parse() method. + virtual void InitParser(const wxString& source); + // This must be called after Parse(). + virtual void DoneParser(); + + // May be called during parsing to immediately return from Parse(). + virtual void StopParsing() { m_stopParsing = true; } + + // Parses the m_Source from begin_pos to end_pos-1. + // (in noparams version it parses whole m_Source) + void DoParsing(int begin_pos, int end_pos); + void DoParsing(); + + // Returns pointer to the tag at parser's current position + wxHtmlTag *GetCurrentTag() const { return m_CurTag; } + + // Returns product of parsing + // Returned value is result of parsing of the part. The type of this result + // depends on internal representation in derived parser + // (see wxHtmlWinParser for details). + virtual wxObject* GetProduct() = 0; + + // adds handler to the list & hash table of handlers. + virtual void AddTagHandler(wxHtmlTagHandler *handler); + + // Forces the handler to handle additional tags (not returned by GetSupportedTags). + // The handler should already be in use by this parser. + // Example: you want to parse following pseudo-html structure: + // + // + // + // + // This last it has different meaning, we don't want it to be parsed by myitems handler! + // handler can handle only 'myitems' (e.g. its GetSupportedTags returns "MYITEMS") + // you can call PushTagHandler(handler, "IT") when you find + // and call PopTagHandler() when you find + void PushTagHandler(wxHtmlTagHandler *handler, const wxString& tags); + + // Restores state before last call to PushTagHandler + void PopTagHandler(); + + wxString* GetSource() {return &m_Source;} + void SetSource(const wxString& src); + + // Sets HTML source and remembers current parser's state so that it can + // later be restored. This is useful for on-line modifications of + // HTML source (for example,
 handler replaces spaces with  
+    // and newlines with 
) + virtual void SetSourceAndSaveState(const wxString& src); + // Restores parser's state from stack or returns false if the stack is + // empty + virtual bool RestoreState(); + + // Returns HTML source inside the element (i.e. between the starting + // and ending tag) + wxString GetInnerSource(const wxHtmlTag& tag); + + // Parses HTML string 'markup' and extracts charset info from tag + // if present. Returns empty string if the tag is missing. + // For wxHTML's internal use. + static wxString ExtractCharsetInformation(const wxString& markup); + + // Returns entity parser object, used to substitute HTML &entities; + wxHtmlEntitiesParser *GetEntitiesParser() const { return m_entitiesParser; } + +protected: + // DOM structure + void CreateDOMTree(); + void DestroyDOMTree(); + void CreateDOMSubTree(wxHtmlTag *cur, + int begin_pos, int end_pos, + wxHtmlTagsCache *cache); + + // Adds text to the output. + // This is called from Parse() and must be overriden in derived classes. + // txt is not guaranteed to be only one word. It is largest continuous part of text + // (= not broken by tags) + // NOTE : using char* because of speed improvements + virtual void AddText(const wxChar* txt) = 0; + + // Adds tag and proceeds it. Parse() may (and usually is) called from this method. + // This is called from Parse() and may be overriden. + // Default behavior is that it looks for proper handler in m_Handlers. The tag is + // ignored if no hander is found. + // Derived class is *responsible* for filling in m_Handlers table. + virtual void AddTag(const wxHtmlTag& tag); + +protected: + // DOM tree: + wxHtmlTag *m_CurTag; + wxHtmlTag *m_Tags; + wxHtmlTextPieces *m_TextPieces; + size_t m_CurTextPiece; + + wxString m_Source; + + wxHtmlParserState *m_SavedStates; + + // handlers that handle particular tags. The table is accessed by + // key = tag's name. + // This attribute MUST be filled by derived class otherwise it would + // be empty and no tags would be recognized + // (see wxHtmlWinParser for details about filling it) + // m_HandlersHash is for random access based on knowledge of tag name (BR, P, etc.) + // it may (and often does) contain more references to one object + // m_HandlersList is list of all handlers and it is guaranteed to contain + // only one reference to each handler instance. + wxList m_HandlersList; + wxHashTable m_HandlersHash; + + DECLARE_NO_COPY_CLASS(wxHtmlParser) + + // class for opening files (file system) + wxFileSystem *m_FS; + // handlers stack used by PushTagHandler and PopTagHandler + wxList *m_HandlersStack; + + // entity parse + wxHtmlEntitiesParser *m_entitiesParser; + + // flag indicating that the parser should stop + bool m_stopParsing; +}; + + + +// This class (and derived classes) cooperates with wxHtmlParser. +// Each recognized tag is passed to handler which is capable +// of handling it. Each tag is handled in 3 steps: +// 1. Handler will modifies state of parser +// (using its public methods) +// 2. Parser parses source between starting and ending tag +// 3. Handler restores original state of the parser +class WXDLLIMPEXP_HTML wxHtmlTagHandler : public wxObject +{ + DECLARE_ABSTRACT_CLASS(wxHtmlTagHandler) + +public: + wxHtmlTagHandler() : wxObject () { m_Parser = NULL; } + + // Sets the parser. + // NOTE : each _instance_ of handler is guaranteed to be called + // only by one parser. This means you don't have to care about + // reentrancy. + virtual void SetParser(wxHtmlParser *parser) + { m_Parser = parser; } + + // Returns list of supported tags. The list is in uppercase and + // tags are delimited by ','. + // Example : "I,B,FONT,P" + // is capable of handling italic, bold, font and paragraph tags + virtual wxString GetSupportedTags() = 0; + + // This is hadling core method. It does all the Steps 1-3. + // To process step 2, you can call ParseInner() + // returned value : true if it called ParseInner(), + // false etherwise + virtual bool HandleTag(const wxHtmlTag& tag) = 0; + +protected: + // parses input between beginning and ending tag. + // m_Parser must be set. + void ParseInner(const wxHtmlTag& tag) + { m_Parser->DoParsing(tag.GetBeginPos(), tag.GetEndPos1()); } + + // Parses given source as if it was tag's inner code (see + // wxHtmlParser::GetInnerSource). Unlike ParseInner(), this method lets + // you specify the source code to parse. This is useful when you need to + // modify the inner text before parsing. + void ParseInnerSource(const wxString& source); + + wxHtmlParser *m_Parser; + + DECLARE_NO_COPY_CLASS(wxHtmlTagHandler) +}; + + +// This class is used to parse HTML entities in strings. It can handle +// both named entities and &#xxxx entries where xxxx is Unicode code. +class WXDLLIMPEXP_HTML wxHtmlEntitiesParser : public wxObject +{ + DECLARE_DYNAMIC_CLASS(wxHtmlEntitiesParser) + +public: + wxHtmlEntitiesParser(); + virtual ~wxHtmlEntitiesParser(); + + // Sets encoding of output string. + // Has no effect if wxUSE_WCHAR_T==0 or wxUSE_UNICODE==1 + void SetEncoding(wxFontEncoding encoding); + + // Parses entities in input and replaces them with respective characters + // (with respect to output encoding) + wxString Parse(const wxString& input); + + // Returns character for given entity or 0 if the enity is unknown + wxChar GetEntityChar(const wxString& entity); + + // Returns character that represents given Unicode code +#if wxUSE_UNICODE + wxChar GetCharForCode(unsigned code) { return (wxChar)code; } +#else + wxChar GetCharForCode(unsigned code); +#endif + +protected: +#if wxUSE_WCHAR_T && !wxUSE_UNICODE + wxMBConv *m_conv; + wxFontEncoding m_encoding; +#endif + + DECLARE_NO_COPY_CLASS(wxHtmlEntitiesParser) +}; + + +#endif + +#endif // _WX_HTMLPARS_H_ diff --git a/Externals/wxWidgets/include/wx/html/htmlproc.h b/Externals/wxWidgets/include/wx/html/htmlproc.h new file mode 100644 index 0000000000..006830d580 --- /dev/null +++ b/Externals/wxWidgets/include/wx/html/htmlproc.h @@ -0,0 +1,58 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: htmlprep.h +// Purpose: HTML processor +// Author: Vaclav Slavik +// RCS-ID: $Id: htmlproc.h 35650 2005-09-23 12:56:45Z MR $ +// Copyright: (c) 2001 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_HTMLPREP_H_ +#define _WX_HTMLPREP_H_ + +#include "wx/defs.h" + +#if wxUSE_HTML + +#include "wx/string.h" + +// Priority of preprocessor in the chain. The higher, the earlier it is used +enum +{ + wxHTML_PRIORITY_DONTCARE = 128, // if the order doesn't matter, use this + // priority + wxHTML_PRIORITY_SYSTEM = 256 // >=256 is only for wxHTML's internals +}; + +// Classes derived from this class serve as simple text processors for +// wxHtmlWindow. wxHtmlWindow runs HTML markup through all registered +// processors before displaying it, thus allowing for on-the-fly +// modifications of the markup. + +class WXDLLIMPEXP_HTML wxHtmlProcessor : public wxObject +{ + DECLARE_ABSTRACT_CLASS(wxHtmlProcessor) + +public: + wxHtmlProcessor() : wxObject(), m_enabled(true) {} + virtual ~wxHtmlProcessor() {} + + // Process input text and return processed result + virtual wxString Process(const wxString& text) const = 0; + + // Return priority value of this processor. The higher, the sooner + // is the processor applied to the text. + virtual int GetPriority() const { return wxHTML_PRIORITY_DONTCARE; } + + // Enable/disable the processor. wxHtmlWindow won't use a disabled + // processor even if it is in its processors queue. + virtual void Enable(bool enable = true) { m_enabled = enable; } + bool IsEnabled() const { return m_enabled; } + +protected: + bool m_enabled; +}; + +#endif // wxUSE_HTML + +#endif // _WX_HTMLPROC_H_ diff --git a/Externals/wxWidgets/include/wx/html/htmltag.h b/Externals/wxWidgets/include/wx/html/htmltag.h new file mode 100644 index 0000000000..7700c379ff --- /dev/null +++ b/Externals/wxWidgets/include/wx/html/htmltag.h @@ -0,0 +1,148 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: htmltag.h +// Purpose: wxHtmlTag class (represents single tag) +// Author: Vaclav Slavik +// RCS-ID: $Id: htmltag.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) 1999 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_HTMLTAG_H_ +#define _WX_HTMLTAG_H_ + +#include "wx/defs.h" + +#if wxUSE_HTML + +#include "wx/object.h" +#include "wx/arrstr.h" + +class WXDLLIMPEXP_FWD_CORE wxColour; +class WXDLLIMPEXP_FWD_HTML wxHtmlEntitiesParser; + +//----------------------------------------------------------------------------- +// wxHtmlTagsCache +// - internal wxHTML class, do not use! +//----------------------------------------------------------------------------- + +struct wxHtmlCacheItem; + +class WXDLLIMPEXP_HTML wxHtmlTagsCache : public wxObject +{ + DECLARE_DYNAMIC_CLASS(wxHtmlTagsCache) + +private: + wxHtmlCacheItem *m_Cache; + int m_CacheSize; + int m_CachePos; + +public: + wxHtmlTagsCache() : wxObject() {m_CacheSize = 0; m_Cache = NULL;} + wxHtmlTagsCache(const wxString& source); + virtual ~wxHtmlTagsCache() {free(m_Cache);} + + // Finds parameters for tag starting at at and fills the variables + void QueryTag(int at, int* end1, int* end2); + + DECLARE_NO_COPY_CLASS(wxHtmlTagsCache) +}; + + +//-------------------------------------------------------------------------------- +// wxHtmlTag +// This represents single tag. It is used as internal structure +// by wxHtmlParser. +//-------------------------------------------------------------------------------- + +class WXDLLIMPEXP_HTML wxHtmlTag : public wxObject +{ + DECLARE_CLASS(wxHtmlTag) + +protected: + // constructs wxHtmlTag object based on HTML tag. + // The tag begins (with '<' character) at position pos in source + // end_pos is position where parsing ends (usually end of document) + wxHtmlTag(wxHtmlTag *parent, + const wxString& source, int pos, int end_pos, + wxHtmlTagsCache *cache, + wxHtmlEntitiesParser *entParser); + friend class wxHtmlParser; +public: + virtual ~wxHtmlTag(); + + wxHtmlTag *GetParent() const {return m_Parent;} + wxHtmlTag *GetFirstSibling() const; + wxHtmlTag *GetLastSibling() const; + wxHtmlTag *GetChildren() const { return m_FirstChild; } + wxHtmlTag *GetPreviousSibling() const { return m_Prev; } + wxHtmlTag *GetNextSibling() const {return m_Next; } + // Return next tag, as if tree had been flattened + wxHtmlTag *GetNextTag() const; + + // Returns tag's name in uppercase. + inline wxString GetName() const {return m_Name;} + + // Returns true if the tag has given parameter. Parameter + // should always be in uppercase. + // Example : HasParam("SRC") returns true + bool HasParam(const wxString& par) const; + + // Returns value of the param. Value is in uppercase unless it is + // enclosed with " + // Example :

GetParam("ALIGN") returns (RIGHT) + //

GetParam("SRC") returns (WhaT.jpg) + // (or ("WhaT.jpg") if with_commas == true) + wxString GetParam(const wxString& par, bool with_commas = false) const; + + // Convenience functions: + bool GetParamAsColour(const wxString& par, wxColour *clr) const; + bool GetParamAsInt(const wxString& par, int *clr) const; + + // Scans param like scanf() functions family does. + // Example : ScanParam("COLOR", "\"#%X\"", &clr); + // This is always with with_commas=false + // Returns number of scanned values + // (like sscanf() does) + // NOTE: unlike scanf family, this function only accepts + // *one* parameter ! + int ScanParam(const wxString& par, const wxChar *format, void *param) const; + + // Returns string containing all params. + wxString GetAllParams() const; + + // return true if this there is matching ending tag + inline bool HasEnding() const {return m_End1 >= 0;} + + // returns beginning position of _internal_ block of text + // See explanation (returned value is marked with *): + // bla bla bla * bla bla intenal text bla bla + inline int GetBeginPos() const {return m_Begin;} + // returns ending position of _internal_ block of text. + // bla bla bla bla bla intenal text* bla bla + inline int GetEndPos1() const {return m_End1;} + // returns end position 2 : + // bla bla bla bla bla internal text* bla bla + inline int GetEndPos2() const {return m_End2;} + +private: + wxString m_Name; + int m_Begin, m_End1, m_End2; + wxArrayString m_ParamNames, m_ParamValues; + + // DOM tree relations: + wxHtmlTag *m_Next; + wxHtmlTag *m_Prev; + wxHtmlTag *m_FirstChild, *m_LastChild; + wxHtmlTag *m_Parent; + + DECLARE_NO_COPY_CLASS(wxHtmlTag) +}; + + + + + +#endif + +#endif // _WX_HTMLTAG_H_ + diff --git a/Externals/wxWidgets/include/wx/html/htmlwin.h b/Externals/wxWidgets/include/wx/html/htmlwin.h new file mode 100644 index 0000000000..644c53e3c3 --- /dev/null +++ b/Externals/wxWidgets/include/wx/html/htmlwin.h @@ -0,0 +1,651 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: htmlwin.h +// Purpose: wxHtmlWindow class for parsing & displaying HTML +// Author: Vaclav Slavik +// RCS-ID: $Id: htmlwin.h 43854 2006-12-07 08:56:57Z PC $ +// Copyright: (c) 1999 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_HTMLWIN_H_ +#define _WX_HTMLWIN_H_ + +#include "wx/defs.h" +#if wxUSE_HTML + +#include "wx/window.h" +#include "wx/scrolwin.h" +#include "wx/config.h" +#include "wx/stopwatch.h" +#include "wx/html/winpars.h" +#include "wx/html/htmlcell.h" +#include "wx/filesys.h" +#include "wx/html/htmlfilt.h" +#include "wx/filename.h" +#include "wx/bitmap.h" + +class wxHtmlProcessor; +class wxHtmlWinModule; +class wxHtmlHistoryArray; +class wxHtmlProcessorList; +class WXDLLIMPEXP_HTML wxHtmlWinAutoScrollTimer; +class WXDLLIMPEXP_HTML wxHtmlCellEvent; +class WXDLLIMPEXP_HTML wxHtmlLinkEvent; + + +// wxHtmlWindow flags: +#define wxHW_SCROLLBAR_NEVER 0x0002 +#define wxHW_SCROLLBAR_AUTO 0x0004 +#define wxHW_NO_SELECTION 0x0008 + +#define wxHW_DEFAULT_STYLE wxHW_SCROLLBAR_AUTO + +/// Enum for wxHtmlWindow::OnOpeningURL and wxHtmlWindowInterface::OnOpeningURL +enum wxHtmlOpeningStatus +{ + /// Open the requested URL + wxHTML_OPEN, + /// Do not open the URL + wxHTML_BLOCK, + /// Redirect to another URL (returned from OnOpeningURL) + wxHTML_REDIRECT +}; + +/** + Abstract interface to a HTML rendering window (such as wxHtmlWindow or + wxHtmlListBox) that is passed to wxHtmlWinParser. It encapsulates all + communication from the parser to the window. + */ +class WXDLLIMPEXP_HTML wxHtmlWindowInterface +{ +public: + /// Ctor + wxHtmlWindowInterface() {} + virtual ~wxHtmlWindowInterface() {} + + /** + Called by the parser to set window's title to given text. + */ + virtual void SetHTMLWindowTitle(const wxString& title) = 0; + + /** + Called when a link is clicked. + + @param link information about the clicked link + */ + virtual void OnHTMLLinkClicked(const wxHtmlLinkInfo& link) = 0; + + /** + Called when the parser needs to open another URL (e.g. an image). + + @param type Type of the URL request (e.g. image) + @param url URL the parser wants to open + @param redirect If the return value is wxHTML_REDIRECT, then the + URL to redirect to will be stored in this variable + (the pointer must never be NULL) + + @return indicator of how to treat the request + */ + virtual wxHtmlOpeningStatus OnHTMLOpeningURL(wxHtmlURLType type, + const wxString& url, + wxString *redirect) const = 0; + + /** + Converts coordinates @a pos relative to given @a cell to + physical coordinates in the window. + */ + virtual wxPoint HTMLCoordsToWindow(wxHtmlCell *cell, + const wxPoint& pos) const = 0; + + /// Returns the window used for rendering (may be NULL). + virtual wxWindow* GetHTMLWindow() = 0; + + /// Returns background colour to use by default. + virtual wxColour GetHTMLBackgroundColour() const = 0; + + /// Sets window's background to colour @a clr. + virtual void SetHTMLBackgroundColour(const wxColour& clr) = 0; + + /// Sets window's background to given bitmap. + virtual void SetHTMLBackgroundImage(const wxBitmap& bmpBg) = 0; + + /// Sets status bar text. + virtual void SetHTMLStatusText(const wxString& text) = 0; + + /// Type of mouse cursor + enum HTMLCursor + { + /// Standard mouse cursor (typically an arrow) + HTMLCursor_Default, + /// Cursor shown over links + HTMLCursor_Link, + /// Cursor shown over selectable text + HTMLCursor_Text + }; + + /** + Returns mouse cursor of given @a type. + */ + virtual wxCursor GetHTMLCursor(HTMLCursor type) const = 0; +}; + +/** + Helper class that implements part of mouse handling for wxHtmlWindow and + wxHtmlListBox. Cursor changes and clicking on links are handled, text + selection is not. + */ +class WXDLLIMPEXP_HTML wxHtmlWindowMouseHelper +{ +protected: + /** + Ctor. + + @param iface Interface to the owner window. + */ + wxHtmlWindowMouseHelper(wxHtmlWindowInterface *iface); + + /** + Virtual dtor. + + It is not really needed in this case but at leats it prevents gcc from + complaining about its absence. + */ + virtual ~wxHtmlWindowMouseHelper() { } + + /// Returns true if the mouse moved since the last call to HandleIdle + bool DidMouseMove() const { return m_tmpMouseMoved; } + + /// Call this from EVT_MOTION event handler + void HandleMouseMoved(); + + /** + Call this from EVT_LEFT_UP handler (or, alternatively, EVT_LEFT_DOWN). + + @param rootCell HTML cell inside which the click occured. This doesn't + have to be the leaf cell, it can be e.g. toplevel + container, but the mouse must be inside the container's + area, otherwise the event would be ignored. + @param pos Mouse position in coordinates relative to @a cell + @param event The event that triggered the call + */ + bool HandleMouseClick(wxHtmlCell *rootCell, + const wxPoint& pos, const wxMouseEvent& event); + + /** + Call this from OnInternalIdle of the HTML displaying window. Handles + mouse movements and must be used together with HandleMouseMoved. + + @param rootCell HTML cell inside which the click occured. This doesn't + have to be the leaf cell, it can be e.g. toplevel + container, but the mouse must be inside the container's + area, otherwise the event would be ignored. + @param pos Current mouse position in coordinates relative to + @a cell + */ + void HandleIdle(wxHtmlCell *rootCell, const wxPoint& pos); + + /** + Called by HandleIdle when the mouse hovers over a cell. Default + behaviour is to do nothing. + + @param cell the cell the mouse is over + @param x, y coordinates of mouse relative to the cell + */ + virtual void OnCellMouseHover(wxHtmlCell *cell, wxCoord x, wxCoord y); + + /** + Called by HandleMouseClick when the user clicks on a cell. + Default behavior is to call wxHtmlWindowInterface::OnLinkClicked() + if this cell corresponds to a hypertext link. + + @param cell the cell the mouse is over + @param x, y coordinates of mouse relative to the cell + @param event The event that triggered the call + + + @return true if a link was clicked, false otherwise. + */ + virtual bool OnCellClicked(wxHtmlCell *cell, + wxCoord x, wxCoord y, + const wxMouseEvent& event); + +protected: + // this flag indicates if the mouse moved (used by HandleIdle) + bool m_tmpMouseMoved; + // contains last link name + wxHtmlLinkInfo *m_tmpLastLink; + // contains the last (terminal) cell which contained the mouse + wxHtmlCell *m_tmpLastCell; + +private: + wxHtmlWindowInterface *m_interface; +}; + +// ---------------------------------------------------------------------------- +// wxHtmlWindow +// (This is probably the only class you will directly use.) +// Purpose of this class is to display HTML page (either local +// file or downloaded via HTTP protocol) in a window. Width of +// window is constant - given in constructor - virtual height +// is changed dynamicly depending on page size. Once the +// window is created you can set it's content by calling +// SetPage(text) or LoadPage(filename). +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_HTML wxHtmlWindow : public wxScrolledWindow, + public wxHtmlWindowInterface, + public wxHtmlWindowMouseHelper +{ + DECLARE_DYNAMIC_CLASS(wxHtmlWindow) + friend class wxHtmlWinModule; + +public: + wxHtmlWindow() : wxHtmlWindowMouseHelper(this) { Init(); } + wxHtmlWindow(wxWindow *parent, wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxHW_DEFAULT_STYLE, + const wxString& name = wxT("htmlWindow")) + : wxHtmlWindowMouseHelper(this) + { + Init(); + Create(parent, id, pos, size, style, name); + } + virtual ~wxHtmlWindow(); + + bool Create(wxWindow *parent, wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxHW_SCROLLBAR_AUTO, + const wxString& name = wxT("htmlWindow")); + + // Set HTML page and display it. !! source is HTML document itself, + // it is NOT address/filename of HTML document. If you want to + // specify document location, use LoadPage() istead + // Return value : false if an error occurred, true otherwise + virtual bool SetPage(const wxString& source); + + // Append to current page + bool AppendToPage(const wxString& source); + + // Load HTML page from given location. Location can be either + // a) /usr/wxGTK2/docs/html/wx.htm + // b) http://www.somewhere.uk/document.htm + // c) ftp://ftp.somesite.cz/pub/something.htm + // In case there is no prefix (http:,ftp:), the method + // will try to find it itself (1. local file, then http or ftp) + // After the page is loaded, the method calls SetPage() to display it. + // Note : you can also use path relative to previously loaded page + // Return value : same as SetPage + virtual bool LoadPage(const wxString& location); + + // Loads HTML page from file + bool LoadFile(const wxFileName& filename); + + // Returns full location of opened page + wxString GetOpenedPage() const {return m_OpenedPage;} + // Returns anchor within opened page + wxString GetOpenedAnchor() const {return m_OpenedAnchor;} + // Returns of opened page or empty string otherwise + wxString GetOpenedPageTitle() const {return m_OpenedPageTitle;} + + // Sets frame in which page title will be displayed. Format is format of + // frame title, e.g. "HtmlHelp : %s". It must contain exactly one %s + void SetRelatedFrame(wxFrame* frame, const wxString& format); + wxFrame* GetRelatedFrame() const {return m_RelatedFrame;} + +#if wxUSE_STATUSBAR + // After(!) calling SetRelatedFrame, this sets statusbar slot where messages + // will be displayed. Default is -1 = no messages. + void SetRelatedStatusBar(int bar); +#endif // wxUSE_STATUSBAR + + // Sets fonts to be used when displaying HTML page. + void SetFonts(const wxString& normal_face, const wxString& fixed_face, + const int *sizes = NULL); + + // Sets font sizes to be relative to the given size or the system + // default size; use either specified or default font + void SetStandardFonts(int size = -1, + const wxString& normal_face = wxEmptyString, + const wxString& fixed_face = wxEmptyString); + + // Sets space between text and window borders. + void SetBorders(int b) {m_Borders = b;} + + // Sets the bitmap to use for background (currnetly it will be tiled, + // when/if we have CSS support we could add other possibilities...) + void SetBackgroundImage(const wxBitmap& bmpBg) { m_bmpBg = bmpBg; } + + // Saves custom settings into cfg config. it will use the path 'path' + // if given, otherwise it will save info into currently selected path. + // saved values : things set by SetFonts, SetBorders. + virtual void ReadCustomization(wxConfigBase *cfg, wxString path = wxEmptyString); + // ... + virtual void WriteCustomization(wxConfigBase *cfg, wxString path = wxEmptyString); + + // Goes to previous/next page (in browsing history) + // Returns true if successful, false otherwise + bool HistoryBack(); + bool HistoryForward(); + bool HistoryCanBack(); + bool HistoryCanForward(); + // Resets history + void HistoryClear(); + + // Returns pointer to conteiners/cells structure. + // It should be used ONLY when printing + wxHtmlContainerCell* GetInternalRepresentation() const {return m_Cell;} + + // Adds input filter + static void AddFilter(wxHtmlFilter *filter); + + // Returns a pointer to the parser. + wxHtmlWinParser *GetParser() const { return m_Parser; } + + // Adds HTML processor to this instance of wxHtmlWindow: + void AddProcessor(wxHtmlProcessor *processor); + // Adds HTML processor to wxHtmlWindow class as whole: + static void AddGlobalProcessor(wxHtmlProcessor *processor); + + + // -- Callbacks -- + + // Sets the title of the window + // (depending on the information passed to SetRelatedFrame() method) + virtual void OnSetTitle(const wxString& title); + + // Called when user clicked on hypertext link. Default behavior is to + // call LoadPage(loc) + virtual void OnLinkClicked(const wxHtmlLinkInfo& link); + + // Called when wxHtmlWindow wants to fetch data from an URL (e.g. when + // loading a page or loading an image). The data are downloaded if and only if + // OnOpeningURL returns true. If OnOpeningURL returns wxHTML_REDIRECT, + // it must set *redirect to the new URL + virtual wxHtmlOpeningStatus OnOpeningURL(wxHtmlURLType WXUNUSED(type), + const wxString& WXUNUSED(url), + wxString *WXUNUSED(redirect)) const + { return wxHTML_OPEN; } + +#if wxUSE_CLIPBOARD + // Helper functions to select parts of page: + void SelectWord(const wxPoint& pos); + void SelectLine(const wxPoint& pos); + void SelectAll(); + + // Convert selection to text: + wxString SelectionToText() { return DoSelectionToText(m_selection); } + + // Converts current page to text: + wxString ToText(); +#endif // wxUSE_CLIPBOARD + + virtual void OnInternalIdle(); + + /// Returns standard HTML cursor as used by wxHtmlWindow + static wxCursor GetDefaultHTMLCursor(HTMLCursor type); + +protected: + void Init(); + + // Scrolls to anchor of this name. (Anchor is #news + // or #features etc. it is part of address sometimes: + // http://www.ms.mff.cuni.cz/~vsla8348/wxhtml/index.html#news) + // Return value : true if anchor exists, false otherwise + bool ScrollToAnchor(const wxString& anchor); + + // Prepares layout (= fill m_PosX, m_PosY for fragments) based on + // actual size of window. This method also setup scrollbars + void CreateLayout(); + + void OnEraseBackground(wxEraseEvent& event); + void OnPaint(wxPaintEvent& event); + void OnSize(wxSizeEvent& event); + void OnMouseMove(wxMouseEvent& event); + void OnMouseDown(wxMouseEvent& event); + void OnMouseUp(wxMouseEvent& event); +#if wxUSE_CLIPBOARD + void OnKeyUp(wxKeyEvent& event); + void OnDoubleClick(wxMouseEvent& event); + void OnCopy(wxCommandEvent& event); + void OnClipboardEvent(wxClipboardTextEvent& event); + void OnMouseEnter(wxMouseEvent& event); + void OnMouseLeave(wxMouseEvent& event); + void OnMouseCaptureLost(wxMouseCaptureLostEvent& event); +#endif // wxUSE_CLIPBOARD + + // Returns new filter (will be stored into m_DefaultFilter variable) + virtual wxHtmlFilter *GetDefaultFilter() {return new wxHtmlFilterPlainText;} + + // cleans static variables + static void CleanUpStatics(); + + // Returns true if text selection is enabled (wxClipboard must be available + // and wxHW_NO_SELECTION not used) + bool IsSelectionEnabled() const; + + enum ClipboardType + { + Primary, + Secondary + }; + + // Copies selection to clipboard if the clipboard support is available + // + // returns true if anything was copied to clipboard, false otherwise + bool CopySelection(ClipboardType t = Secondary); + +#if wxUSE_CLIPBOARD + // Automatic scrolling during selection: + void StopAutoScrolling(); +#endif // wxUSE_CLIPBOARD + + wxString DoSelectionToText(wxHtmlSelection *sel); + +public: + // wxHtmlWindowInterface methods: + virtual void SetHTMLWindowTitle(const wxString& title); + virtual void OnHTMLLinkClicked(const wxHtmlLinkInfo& link); + virtual wxHtmlOpeningStatus OnHTMLOpeningURL(wxHtmlURLType type, + const wxString& url, + wxString *redirect) const; + virtual wxPoint HTMLCoordsToWindow(wxHtmlCell *cell, + const wxPoint& pos) const; + virtual wxWindow* GetHTMLWindow(); + virtual wxColour GetHTMLBackgroundColour() const; + virtual void SetHTMLBackgroundColour(const wxColour& clr); + virtual void SetHTMLBackgroundImage(const wxBitmap& bmpBg); + virtual void SetHTMLStatusText(const wxString& text); + virtual wxCursor GetHTMLCursor(HTMLCursor type) const; + + // implementation of SetPage() + bool DoSetPage(const wxString& source); + +protected: + // This is pointer to the first cell in parsed data. (Note: the first cell + // is usually top one = all other cells are sub-cells of this one) + wxHtmlContainerCell *m_Cell; + // parser which is used to parse HTML input. + // Each wxHtmlWindow has it's own parser because sharing one global + // parser would be problematic (because of reentrancy) + wxHtmlWinParser *m_Parser; + // contains name of actualy opened page or empty string if no page opened + wxString m_OpenedPage; + // contains name of current anchor within m_OpenedPage + wxString m_OpenedAnchor; + // contains title of actualy opened page or empty string if no <TITLE> tag + wxString m_OpenedPageTitle; + // class for opening files (file system) + wxFileSystem* m_FS; + + wxFrame *m_RelatedFrame; + wxString m_TitleFormat; +#if wxUSE_STATUSBAR + // frame in which page title should be displayed & number of it's statusbar + // reserved for usage with this html window + int m_RelatedStatusBar; +#endif // wxUSE_STATUSBAR + + // borders (free space between text and window borders) + // defaults to 10 pixels. + int m_Borders; + + // current text selection or NULL + wxHtmlSelection *m_selection; + + // true if the user is dragging mouse to select text + bool m_makingSelection; + +#if wxUSE_CLIPBOARD + // time of the last doubleclick event, used to detect tripleclicks + // (tripleclicks are used to select whole line): + wxMilliClock_t m_lastDoubleClick; + + // helper class to automatically scroll the window if the user is selecting + // text and the mouse leaves wxHtmlWindow: + wxHtmlWinAutoScrollTimer *m_timerAutoScroll; +#endif // wxUSE_CLIPBOARD + +private: + // window content for double buffered rendering: + wxBitmap *m_backBuffer; + + // background image, may be invalid + wxBitmap m_bmpBg; + + // variables used when user is selecting text + wxPoint m_tmpSelFromPos; + wxHtmlCell *m_tmpSelFromCell; + + // if >0 contents of the window is not redrawn + // (in order to avoid ugly blinking) + int m_tmpCanDrawLocks; + + // list of HTML filters + static wxList m_Filters; + // this filter is used when no filter is able to read some file + static wxHtmlFilter *m_DefaultFilter; + + // html processors array: + wxHtmlProcessorList *m_Processors; + static wxHtmlProcessorList *m_GlobalProcessors; + + // browser history + wxHtmlHistoryArray *m_History; + int m_HistoryPos; + // if this FLAG is false, items are not added to history + bool m_HistoryOn; + + // a flag set if we need to erase background in OnPaint() (otherwise this + // is supposed to have been done in OnEraseBackground()) + bool m_eraseBgInOnPaint; + + // standard mouse cursors + static wxCursor *ms_cursorLink; + static wxCursor *ms_cursorText; + + DECLARE_EVENT_TABLE() + DECLARE_NO_COPY_CLASS(wxHtmlWindow) +}; + + + + +BEGIN_DECLARE_EVENT_TYPES() + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_HTML, + wxEVT_COMMAND_HTML_CELL_CLICKED, 1000) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_HTML, + wxEVT_COMMAND_HTML_CELL_HOVER, 1001) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_HTML, + wxEVT_COMMAND_HTML_LINK_CLICKED, 1002) +END_DECLARE_EVENT_TYPES() + + +/*! + * Html cell window event + */ + +class WXDLLIMPEXP_HTML wxHtmlCellEvent : public wxCommandEvent +{ +public: + wxHtmlCellEvent() {} + wxHtmlCellEvent(wxEventType commandType, int id, + wxHtmlCell *cell, const wxPoint &pt, + const wxMouseEvent &ev) + : wxCommandEvent(commandType, id) + { + m_cell = cell; + m_pt = pt; + m_mouseEvent = ev; + m_bLinkWasClicked = false; + } + + wxHtmlCell* GetCell() const { return m_cell; } + wxPoint GetPoint() const { return m_pt; } + wxMouseEvent GetMouseEvent() const { return m_mouseEvent; } + + void SetLinkClicked(bool linkclicked) { m_bLinkWasClicked=linkclicked; } + bool GetLinkClicked() const { return m_bLinkWasClicked; } + + // default copy ctor, assignment operator and dtor are ok + virtual wxEvent *Clone() const { return new wxHtmlCellEvent(*this); } + +private: + wxHtmlCell *m_cell; + wxMouseEvent m_mouseEvent; + wxPoint m_pt; + + bool m_bLinkWasClicked; + + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxHtmlCellEvent) +}; + + + +/*! + * Html link event + */ + +class WXDLLIMPEXP_HTML wxHtmlLinkEvent : public wxCommandEvent +{ +public: + wxHtmlLinkEvent() {} + wxHtmlLinkEvent(int id, const wxHtmlLinkInfo &linkinfo) + : wxCommandEvent(wxEVT_COMMAND_HTML_LINK_CLICKED, id) + { + m_linkInfo = linkinfo; + } + + const wxHtmlLinkInfo &GetLinkInfo() const { return m_linkInfo; } + + // default copy ctor, assignment operator and dtor are ok + virtual wxEvent *Clone() const { return new wxHtmlLinkEvent(*this); } + +private: + wxHtmlLinkInfo m_linkInfo; + + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxHtmlLinkEvent) +}; + + +typedef void (wxEvtHandler::*wxHtmlCellEventFunction)(wxHtmlCellEvent&); +typedef void (wxEvtHandler::*wxHtmlLinkEventFunction)(wxHtmlLinkEvent&); + +#define wxHtmlCellEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxHtmlCellEventFunction, &func) +#define wxHtmlLinkEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxHtmlLinkEventFunction, &func) + +#define EVT_HTML_CELL_CLICKED(id, fn) \ + wx__DECLARE_EVT1(wxEVT_COMMAND_HTML_CELL_CLICKED, id, wxHtmlCellEventHandler(fn)) +#define EVT_HTML_CELL_HOVER(id, fn) \ + wx__DECLARE_EVT1(wxEVT_COMMAND_HTML_CELL_HOVER, id, wxHtmlCellEventHandler(fn)) +#define EVT_HTML_LINK_CLICKED(id, fn) \ + wx__DECLARE_EVT1(wxEVT_COMMAND_HTML_LINK_CLICKED, id, wxHtmlLinkEventHandler(fn)) + + +#endif // wxUSE_HTML + +#endif // _WX_HTMLWIN_H_ + diff --git a/Externals/wxWidgets/include/wx/html/htmprint.h b/Externals/wxWidgets/include/wx/html/htmprint.h new file mode 100644 index 0000000000..ceb3fd9736 --- /dev/null +++ b/Externals/wxWidgets/include/wx/html/htmprint.h @@ -0,0 +1,298 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: htmprint.h +// Purpose: html printing classes +// Author: Vaclav Slavik +// Created: 25/09/99 +// RCS-ID: $Id: htmprint.h 47862 2007-08-03 08:50:49Z JS $ +// Copyright: (c) Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_HTMPRINT_H_ +#define _WX_HTMPRINT_H_ + +#include "wx/defs.h" + +#if wxUSE_HTML & wxUSE_PRINTING_ARCHITECTURE + +#include "wx/html/htmlcell.h" +#include "wx/html/winpars.h" +#include "wx/html/htmlfilt.h" + +#include "wx/print.h" +#include "wx/printdlg.h" + +#include <limits.h> // INT_MAX + +//-------------------------------------------------------------------------------- +// wxHtmlDCRenderer +// This class is capable of rendering HTML into specified +// portion of DC +//-------------------------------------------------------------------------------- + +class WXDLLIMPEXP_HTML wxHtmlDCRenderer : public wxObject +{ +public: + wxHtmlDCRenderer(); + virtual ~wxHtmlDCRenderer(); + + // Following 3 methods *must* be called before any call to Render: + + // Assign DC to this render + void SetDC(wxDC *dc, double pixel_scale = 1.0); + + // Sets size of output rectangle, in pixels. Note that you *can't* change + // width of the rectangle between calls to Render! (You can freely change height.) + void SetSize(int width, int height); + + // Sets the text to be displayed. + // Basepath is base directory (html string would be stored there if it was in + // file). It is used to determine path for loading images, for example. + // isdir is false if basepath is filename, true if it is directory name + // (see wxFileSystem for detailed explanation) + void SetHtmlText(const wxString& html, const wxString& basepath = wxEmptyString, bool isdir = true); + + // Sets fonts to be used when displaying HTML page. (if size null then default sizes used). + void SetFonts(const wxString& normal_face, const wxString& fixed_face, const int *sizes = NULL); + + // Sets font sizes to be relative to the given size or the system + // default size; use either specified or default font + void SetStandardFonts(int size = -1, + const wxString& normal_face = wxEmptyString, + const wxString& fixed_face = wxEmptyString); + + // [x,y] is position of upper-left corner of printing rectangle (see SetSize) + // from is y-coordinate of the very first visible cell + // to is y-coordinate of the next following page break, if any + // Returned value is y coordinate of first cell than didn't fit onto page. + // Use this value as 'from' in next call to Render in order to print multiple pages + // document + // If dont_render is TRUE then nothing is rendered into DC and it only counts + // pixels and return y coord of the next page + // + // known_pagebreaks and number_of_pages are used only when counting pages; + // otherwise, their default values should be used. Their purpose is to + // support pagebreaks using a subset of CSS2's <DIV>. The <DIV> handler + // needs to know what pagebreaks have already been set so that it doesn't + // set the same pagebreak twice. + // + // CAUTION! Render() changes DC's user scale and does NOT restore it! + int Render(int x, int y, wxArrayInt& known_pagebreaks, int from = 0, + int dont_render = FALSE, int to = INT_MAX); + + // returns total height of the html document + // (compare Render's return value with this) + int GetTotalHeight(); + +private: + wxDC *m_DC; + wxHtmlWinParser *m_Parser; + wxFileSystem *m_FS; + wxHtmlContainerCell *m_Cells; + int m_MaxWidth, m_Width, m_Height; + + DECLARE_NO_COPY_CLASS(wxHtmlDCRenderer) +}; + + + + + +enum { + wxPAGE_ODD, + wxPAGE_EVEN, + wxPAGE_ALL +}; + + + +//-------------------------------------------------------------------------------- +// wxHtmlPrintout +// This class is derived from standard wxWidgets printout class +// and is used to print HTML documents. +//-------------------------------------------------------------------------------- + + +class WXDLLIMPEXP_HTML wxHtmlPrintout : public wxPrintout +{ +public: + wxHtmlPrintout(const wxString& title = wxT("Printout")); + virtual ~wxHtmlPrintout(); + + void SetHtmlText(const wxString& html, const wxString &basepath = wxEmptyString, bool isdir = true); + // prepares the class for printing this html document. + // Must be called before using the class, in fact just after constructor + // + // basepath is base directory (html string would be stored there if it was in + // file). It is used to determine path for loading images, for example. + // isdir is false if basepath is filename, true if it is directory name + // (see wxFileSystem for detailed explanation) + + void SetHtmlFile(const wxString &htmlfile); + // same as SetHtmlText except that it takes regular file as the parameter + + void SetHeader(const wxString& header, int pg = wxPAGE_ALL); + void SetFooter(const wxString& footer, int pg = wxPAGE_ALL); + // sets header/footer for the document. The argument is interpreted as HTML document. + // You can use macros in it: + // @PAGENUM@ is replaced by page number + // @PAGESCNT@ is replaced by total number of pages + // + // pg is one of wxPAGE_ODD, wxPAGE_EVEN and wx_PAGE_ALL constants. + // You can set different header/footer for odd and even pages + + // Sets fonts to be used when displaying HTML page. (if size null then default sizes used). + void SetFonts(const wxString& normal_face, const wxString& fixed_face, const int *sizes = NULL); + + // Sets font sizes to be relative to the given size or the system + // default size; use either specified or default font + void SetStandardFonts(int size = -1, + const wxString& normal_face = wxEmptyString, + const wxString& fixed_face = wxEmptyString); + + void SetMargins(float top = 25.2, float bottom = 25.2, float left = 25.2, float right = 25.2, + float spaces = 5); + // sets margins in milimeters. Defaults to 1 inch for margins and 0.5cm for space + // between text and header and/or footer + + // wxPrintout stuff: + bool OnPrintPage(int page); + bool HasPage(int page); + void GetPageInfo(int *minPage, int *maxPage, int *selPageFrom, int *selPageTo); + bool OnBeginDocument(int startPage, int endPage); + void OnPreparePrinting(); + + // Adds input filter + static void AddFilter(wxHtmlFilter *filter); + + // Cleanup + static void CleanUpStatics(); + +private: + + void RenderPage(wxDC *dc, int page); + // renders one page into dc + wxString TranslateHeader(const wxString& instr, int page); + // substitute @PAGENUM@ and @PAGESCNT@ by real values + void CountPages(); + // counts pages and fills m_NumPages and m_PageBreaks + + +private: + int m_NumPages; + //int m_PageBreaks[wxHTML_PRINT_MAX_PAGES]; + wxArrayInt m_PageBreaks; + + wxString m_Document, m_BasePath; + bool m_BasePathIsDir; + wxString m_Headers[2], m_Footers[2]; + + int m_HeaderHeight, m_FooterHeight; + wxHtmlDCRenderer *m_Renderer, *m_RendererHdr; + float m_MarginTop, m_MarginBottom, m_MarginLeft, m_MarginRight, m_MarginSpace; + + // list of HTML filters + static wxList m_Filters; + + DECLARE_NO_COPY_CLASS(wxHtmlPrintout) +}; + + + + + +//-------------------------------------------------------------------------------- +// wxHtmlEasyPrinting +// This class provides very simple interface to printing +// architecture. It allows you to print HTML documents only +// with very few commands. +// +// Note : do not create this class on stack only. +// You should create an instance on app startup and +// use this instance for all printing. Why? The class +// stores page&printer settings in it. +//-------------------------------------------------------------------------------- + +class WXDLLIMPEXP_HTML wxHtmlEasyPrinting : public wxObject +{ +public: + wxHtmlEasyPrinting(const wxString& name = wxT("Printing"), wxWindow *parentWindow = NULL); + virtual ~wxHtmlEasyPrinting(); + + bool PreviewFile(const wxString &htmlfile); + bool PreviewText(const wxString &htmltext, const wxString& basepath = wxEmptyString); + // Preview file / html-text for printing + // (and offers printing) + // basepath is base directory for opening subsequent files (e.g. from <img> tag) + + bool PrintFile(const wxString &htmlfile); + bool PrintText(const wxString &htmltext, const wxString& basepath = wxEmptyString); + // Print file / html-text w/o preview + + void PageSetup(); + // pop up printer or page setup dialog + + void SetHeader(const wxString& header, int pg = wxPAGE_ALL); + void SetFooter(const wxString& footer, int pg = wxPAGE_ALL); + // sets header/footer for the document. The argument is interpreted as HTML document. + // You can use macros in it: + // @PAGENUM@ is replaced by page number + // @PAGESCNT@ is replaced by total number of pages + // + // pg is one of wxPAGE_ODD, wxPAGE_EVEN and wx_PAGE_ALL constants. + // You can set different header/footer for odd and even pages + + void SetFonts(const wxString& normal_face, const wxString& fixed_face, const int *sizes = 0); + // Sets fonts to be used when displaying HTML page. (if size null then default sizes used) + + // Sets font sizes to be relative to the given size or the system + // default size; use either specified or default font + void SetStandardFonts(int size = -1, + const wxString& normal_face = wxEmptyString, + const wxString& fixed_face = wxEmptyString); + + wxPrintData *GetPrintData(); + wxPageSetupDialogData *GetPageSetupData() {return m_PageSetupData;} + // return page setting data objects. + // (You can set their parameters.) + +#if wxABI_VERSION >= 20805 + wxWindow* GetParentWindow() const { return m_ParentWindow; } + // get the parent window + void SetParentWindow(wxWindow* window) { m_ParentWindow = window; } + // set the parent window +#endif + +protected: + virtual wxHtmlPrintout *CreatePrintout(); + virtual bool DoPreview(wxHtmlPrintout *printout1, wxHtmlPrintout *printout2); + virtual bool DoPrint(wxHtmlPrintout *printout); + +private: + wxPrintData *m_PrintData; + wxPageSetupDialogData *m_PageSetupData; + wxString m_Name; + int m_FontsSizesArr[7]; + int *m_FontsSizes; + wxString m_FontFaceFixed, m_FontFaceNormal; + + enum FontMode + { + FontMode_Explicit, + FontMode_Standard + }; + FontMode m_fontMode; + + wxString m_Headers[2], m_Footers[2]; + wxWindow *m_ParentWindow; + + DECLARE_NO_COPY_CLASS(wxHtmlEasyPrinting) +}; + + + + +#endif // wxUSE_HTML & wxUSE_PRINTING_ARCHITECTURE + +#endif // _WX_HTMPRINT_H_ + diff --git a/Externals/wxWidgets/include/wx/html/m_templ.h b/Externals/wxWidgets/include/wx/html/m_templ.h new file mode 100644 index 0000000000..9f5e616c84 --- /dev/null +++ b/Externals/wxWidgets/include/wx/html/m_templ.h @@ -0,0 +1,84 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: m_templ.h +// Purpose: Modules template file +// Author: Vaclav Slavik +// RCS-ID: $Id: m_templ.h 30098 2004-10-26 10:32:38Z VS $ +// Copyright: (c) Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +/* + +DESCRIPTION: +This is set of macros for easier writing of tag handlers. How to use it? +See mod_fonts.cpp for example... + +Attention! This is quite strange C++ bastard. Before using it, +I STRONGLY recommend reading and understanding these macros!! + +*/ + + +#ifndef _WX_M_TEMPL_H_ +#define _WX_M_TEMPL_H_ + +#include "wx/defs.h" + +#if wxUSE_HTML + +#include "wx/html/winpars.h" + +#define TAG_HANDLER_BEGIN(name,tags) \ + class wxHTML_Handler_##name : public wxHtmlWinTagHandler \ + { \ + public: \ + wxString GetSupportedTags() {return wxT(tags);} + + + +#define TAG_HANDLER_VARS \ + private: + +#define TAG_HANDLER_CONSTR(name) \ + public: \ + wxHTML_Handler_##name () : wxHtmlWinTagHandler() + + +#define TAG_HANDLER_PROC(varib) \ + public: \ + bool HandleTag(const wxHtmlTag& varib) + + + +#define TAG_HANDLER_END(name) \ + }; + + + + +#define TAGS_MODULE_BEGIN(name) \ + class wxHTML_Module##name : public wxHtmlTagsModule \ + { \ + DECLARE_DYNAMIC_CLASS(wxHTML_Module##name ) \ + public: \ + void FillHandlersTable(wxHtmlWinParser *parser) \ + { + + + + +#define TAGS_MODULE_ADD(handler) \ + parser->AddTagHandler(new wxHTML_Handler_##handler); + + + + +#define TAGS_MODULE_END(name) \ + } \ + }; \ + IMPLEMENT_DYNAMIC_CLASS(wxHTML_Module##name , wxHtmlTagsModule) + + + +#endif +#endif diff --git a/Externals/wxWidgets/include/wx/html/webkit.h b/Externals/wxWidgets/include/wx/html/webkit.h new file mode 100644 index 0000000000..247a68a97f --- /dev/null +++ b/Externals/wxWidgets/include/wx/html/webkit.h @@ -0,0 +1,202 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/html/webkit.h +// Purpose: wxWebKitCtrl - embeddable web kit control +// Author: Jethro Grassie / Kevin Ollivier +// Modified by: +// Created: 2004-4-16 +// RCS-ID: $Id: webkit.h 42107 2006-10-19 00:40:23Z KO $ +// Copyright: (c) Jethro Grassie / Kevin Ollivier +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_WEBKIT_H +#define _WX_WEBKIT_H + +#if wxUSE_WEBKIT + +#if !defined(__WXMAC__) && !defined(__WXCOCOA__) +#error "wxWebKitCtrl not implemented for this platform" +#endif + +#include "wx/control.h" + +// ---------------------------------------------------------------------------- +// Web Kit Control +// ---------------------------------------------------------------------------- + +class wxWebKitCtrl : public wxControl +{ +public: + DECLARE_DYNAMIC_CLASS(wxWebKitCtrl) + + wxWebKitCtrl() {}; + wxWebKitCtrl(wxWindow *parent, + wxWindowID winID, + const wxString& strURL, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxT("webkitctrl")) + { + Create(parent, winID, strURL, pos, size, style, validator, name); + }; + bool Create(wxWindow *parent, + wxWindowID winID, + const wxString& strURL, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxT("webkitctrl")); + virtual ~wxWebKitCtrl(); + + void LoadURL(const wxString &url); + + bool CanGoBack(); + bool CanGoForward(); + bool GoBack(); + bool GoForward(); + void Reload(); + void Stop(); + bool CanGetPageSource(); + wxString GetPageSource(); + void SetPageSource(const wxString& source, const wxString& baseUrl = wxEmptyString); + wxString GetPageURL(){ return m_currentURL; } + void SetPageTitle(const wxString& title) { m_pageTitle = title; } + wxString GetPageTitle(){ return m_pageTitle; } + + // since these worked in 2.6, add wrappers + void SetTitle(const wxString& title) { SetPageTitle(title); } + wxString GetTitle() { return GetPageTitle(); } + + wxString GetSelection(); + + bool CanIncreaseTextSize(); + void IncreaseTextSize(); + bool CanDecreaseTextSize(); + void DecreaseTextSize(); + + void Print(bool showPrompt=FALSE); + + void MakeEditable(bool enable=TRUE); + bool IsEditable(); + + wxString RunScript(const wxString& javascript); + + void SetScrollPos(int pos); + int GetScrollPos(); + + //we need to resize the webview when the control size changes + void OnSize(wxSizeEvent &event); + void OnMove(wxMoveEvent &event); + void OnMouseEvents(wxMouseEvent &event); +protected: + DECLARE_EVENT_TABLE() + void MacVisibilityChanged(); + +private: + wxWindow *m_parent; + wxWindowID m_windowID; + wxString m_currentURL; + wxString m_pageTitle; + + struct objc_object *m_webView; + + // we may use this later to setup our own mouse events, + // so leave it in for now. + void* m_webKitCtrlEventHandler; + //It should be WebView*, but WebView is an Objective-C class + //TODO: look into using DECLARE_WXCOCOA_OBJC_CLASS rather than this. +}; + +// ---------------------------------------------------------------------------- +// Web Kit Events +// ---------------------------------------------------------------------------- + +enum { + wxWEBKIT_STATE_START = 1, + wxWEBKIT_STATE_NEGOTIATING = 2, + wxWEBKIT_STATE_REDIRECTING = 4, + wxWEBKIT_STATE_TRANSFERRING = 8, + wxWEBKIT_STATE_STOP = 16, + wxWEBKIT_STATE_FAILED = 32 +}; + +enum { + wxWEBKIT_NAV_LINK_CLICKED = 1, + wxWEBKIT_NAV_BACK_NEXT = 2, + wxWEBKIT_NAV_FORM_SUBMITTED = 4, + wxWEBKIT_NAV_RELOAD = 8, + wxWEBKIT_NAV_FORM_RESUBMITTED = 16, + wxWEBKIT_NAV_OTHER = 32 + +}; + + + +class wxWebKitBeforeLoadEvent : public wxCommandEvent +{ + DECLARE_DYNAMIC_CLASS( wxWebKitBeforeLoadEvent ) + +public: + bool IsCancelled() { return m_cancelled; } + void Cancel(bool cancel = true) { m_cancelled = cancel; } + wxString GetURL() { return m_url; } + void SetURL(const wxString& url) { m_url = url; } + void SetNavigationType(int navType) { m_navType = navType; } + int GetNavigationType() { return m_navType; } + + wxWebKitBeforeLoadEvent( wxWindow* win = (wxWindow*) NULL ); + wxEvent *Clone(void) const { return new wxWebKitBeforeLoadEvent(*this); } + +protected: + bool m_cancelled; + wxString m_url; + int m_navType; +}; + +class wxWebKitStateChangedEvent : public wxCommandEvent +{ + DECLARE_DYNAMIC_CLASS( wxWebKitStateChangedEvent ) + +public: + int GetState() { return m_state; } + void SetState(const int state) { m_state = state; } + wxString GetURL() { return m_url; } + void SetURL(const wxString& url) { m_url = url; } + + wxWebKitStateChangedEvent( wxWindow* win = (wxWindow*) NULL ); + wxEvent *Clone(void) const { return new wxWebKitStateChangedEvent(*this); } + +protected: + int m_state; + wxString m_url; +}; + +typedef void (wxEvtHandler::*wxWebKitStateChangedEventFunction)(wxWebKitStateChangedEvent&); +typedef void (wxEvtHandler::*wxWebKitBeforeLoadEventFunction)(wxWebKitBeforeLoadEvent&); + +BEGIN_DECLARE_EVENT_TYPES() + DECLARE_LOCAL_EVENT_TYPE(wxEVT_WEBKIT_BEFORE_LOAD, wxID_ANY) + DECLARE_LOCAL_EVENT_TYPE(wxEVT_WEBKIT_STATE_CHANGED, wxID_ANY) +END_DECLARE_EVENT_TYPES() + +#define EVT_WEBKIT_STATE_CHANGED(func) \ + DECLARE_EVENT_TABLE_ENTRY( wxEVT_WEBKIT_STATE_CHANGED, \ + wxID_ANY, \ + wxID_ANY, \ + (wxObjectEventFunction) \ + (wxWebKitStateChangedEventFunction) & func, \ + (wxObject *) NULL ), + +#define EVT_WEBKIT_BEFORE_LOAD(func) \ + DECLARE_EVENT_TABLE_ENTRY( wxEVT_WEBKIT_BEFORE_LOAD, \ + wxID_ANY, \ + wxID_ANY, \ + (wxObjectEventFunction) \ + (wxWebKitBeforeLoadEventFunction) & func, \ + (wxObject *) NULL ), + +#endif // wxUSE_WEBKIT + +#endif + // _WX_WEBKIT_H_ diff --git a/Externals/wxWidgets/include/wx/html/winpars.h b/Externals/wxWidgets/include/wx/html/winpars.h new file mode 100644 index 0000000000..3c5dd032ee --- /dev/null +++ b/Externals/wxWidgets/include/wx/html/winpars.h @@ -0,0 +1,273 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: winpars.h +// Purpose: wxHtmlWinParser class (parser to be used with wxHtmlWindow) +// Author: Vaclav Slavik +// RCS-ID: $Id: winpars.h 45498 2007-04-16 13:03:05Z VZ $ +// Copyright: (c) 1999 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_WINPARS_H_ +#define _WX_WINPARS_H_ + +#include "wx/defs.h" +#if wxUSE_HTML + +#include "wx/module.h" +#include "wx/font.h" +#include "wx/html/htmlpars.h" +#include "wx/html/htmlcell.h" +#include "wx/encconv.h" + +class WXDLLIMPEXP_HTML wxHtmlWindow; +class WXDLLIMPEXP_HTML wxHtmlWindowInterface; +class WXDLLIMPEXP_HTML wxHtmlWinParser; +class WXDLLIMPEXP_HTML wxHtmlWinTagHandler; +class WXDLLIMPEXP_HTML wxHtmlTagsModule; + + +//-------------------------------------------------------------------------------- +// wxHtmlWinParser +// This class is derived from wxHtmlParser and its mail goal +// is to parse HTML input so that it can be displayed in +// wxHtmlWindow. It uses special wxHtmlWinTagHandler. +//-------------------------------------------------------------------------------- + +class WXDLLIMPEXP_HTML wxHtmlWinParser : public wxHtmlParser +{ + DECLARE_ABSTRACT_CLASS(wxHtmlWinParser) + friend class wxHtmlWindow; + +public: + wxHtmlWinParser(wxHtmlWindowInterface *wndIface = NULL); + + virtual ~wxHtmlWinParser(); + + virtual void InitParser(const wxString& source); + virtual void DoneParser(); + virtual wxObject* GetProduct(); + + virtual wxFSFile *OpenURL(wxHtmlURLType type, const wxString& url) const; + + // Set's the DC used for parsing. If SetDC() is not called, + // parsing won't proceed + virtual void SetDC(wxDC *dc, double pixel_scale = 1.0) + { m_DC = dc; m_PixelScale = pixel_scale; } + + wxDC *GetDC() {return m_DC;} + double GetPixelScale() {return m_PixelScale;} + int GetCharHeight() const {return m_CharHeight;} + int GetCharWidth() const {return m_CharWidth;} + + // NOTE : these functions do _not_ return _actual_ + // height/width. They return h/w of default font + // for this DC. If you want actual values, call + // GetDC()->GetChar...() + + // returns interface to the rendering window + wxHtmlWindowInterface *GetWindowInterface() {return m_windowInterface;} +#if WXWIN_COMPATIBILITY_2_6 + // deprecated, use GetWindowInterface()->GetHTMLWindow() instead + wxDEPRECATED( wxHtmlWindow *GetWindow() ); +#endif + + // Sets fonts to be used when displaying HTML page. (if size null then default sizes used). + void SetFonts(const wxString& normal_face, const wxString& fixed_face, const int *sizes = NULL); + + // Sets font sizes to be relative to the given size or the system + // default size; use either specified or default font + void SetStandardFonts(int size = -1, + const wxString& normal_face = wxEmptyString, + const wxString& fixed_face = wxEmptyString); + + // Adds tags module. see wxHtmlTagsModule for details. + static void AddModule(wxHtmlTagsModule *module); + + static void RemoveModule(wxHtmlTagsModule *module); + + // parsing-related methods. These methods are called by tag handlers: + + // Returns pointer to actual container. Common use in tag handler is : + // m_WParser->GetContainer()->InsertCell(new ...); + wxHtmlContainerCell *GetContainer() const {return m_Container;} + + // opens new container. This container is sub-container of opened + // container. Sets GetContainer to newly created container + // and returns it. + wxHtmlContainerCell *OpenContainer(); + + // works like OpenContainer except that new container is not created + // but c is used. You can use this to directly set actual container + wxHtmlContainerCell *SetContainer(wxHtmlContainerCell *c); + + // closes the container and sets actual Container to upper-level + // container + wxHtmlContainerCell *CloseContainer(); + + int GetFontSize() const {return m_FontSize;} + void SetFontSize(int s); + int GetFontBold() const {return m_FontBold;} + void SetFontBold(int x) {m_FontBold = x;} + int GetFontItalic() const {return m_FontItalic;} + void SetFontItalic(int x) {m_FontItalic = x;} + int GetFontUnderlined() const {return m_FontUnderlined;} + void SetFontUnderlined(int x) {m_FontUnderlined = x;} + int GetFontFixed() const {return m_FontFixed;} + void SetFontFixed(int x) {m_FontFixed = x;} + wxString GetFontFace() const {return GetFontFixed() ? m_FontFaceFixed : m_FontFaceNormal;} + void SetFontFace(const wxString& face); + + int GetAlign() const {return m_Align;} + void SetAlign(int a) {m_Align = a;} + + wxHtmlScriptMode GetScriptMode() const { return m_ScriptMode; } + void SetScriptMode(wxHtmlScriptMode mode) { m_ScriptMode = mode; } + long GetScriptBaseline() const { return m_ScriptBaseline; } + void SetScriptBaseline(long base) { m_ScriptBaseline = base; } + + const wxColour& GetLinkColor() const { return m_LinkColor; } + void SetLinkColor(const wxColour& clr) { m_LinkColor = clr; } + const wxColour& GetActualColor() const { return m_ActualColor; } + void SetActualColor(const wxColour& clr) { m_ActualColor = clr ;} + const wxHtmlLinkInfo& GetLink() const { return m_Link; } + void SetLink(const wxHtmlLinkInfo& link); + + // applies current parser state (link, sub/supscript, ...) to given cell + void ApplyStateToCell(wxHtmlCell *cell); + +#if !wxUSE_UNICODE + void SetInputEncoding(wxFontEncoding enc); + wxFontEncoding GetInputEncoding() const { return m_InputEnc; } + wxFontEncoding GetOutputEncoding() const { return m_OutputEnc; } + wxEncodingConverter *GetEncodingConverter() const { return m_EncConv; } +#endif + + // creates font depending on m_Font* members. + virtual wxFont* CreateCurrentFont(); + +protected: + virtual void AddText(const wxChar* txt); + +private: + void DoAddText(wxChar *temp, int& templen, wxChar nbsp); + + bool m_tmpLastWasSpace; + wxChar *m_tmpStrBuf; + size_t m_tmpStrBufSize; + // temporary variables used by AddText + wxHtmlWindowInterface *m_windowInterface; + // window we're parsing for + double m_PixelScale; + wxDC *m_DC; + // Device Context we're parsing for + static wxList m_Modules; + // list of tags modules (see wxHtmlTagsModule for details) + // This list is used to initialize m_Handlers member. + + wxHtmlContainerCell *m_Container; + // current container. See Open/CloseContainer for details. + + int m_FontBold, m_FontItalic, m_FontUnderlined, m_FontFixed; // this is not true,false but 1,0, we need it for indexing + int m_FontSize; /* -2 to +4, 0 is default */ + wxColour m_LinkColor; + wxColour m_ActualColor; + // basic font parameters. + wxHtmlLinkInfo m_Link; + // actual hypertext link or empty string + bool m_UseLink; + // true if m_Link is not empty + long m_CharHeight, m_CharWidth; + // average height of normal-sized text + int m_Align; + // actual alignment + wxHtmlScriptMode m_ScriptMode; + // current script mode (sub/sup/normal) + long m_ScriptBaseline; + // current sub/supscript base + + wxFont* m_FontsTable[2][2][2][2][7]; + wxString m_FontsFacesTable[2][2][2][2][7]; +#if !wxUSE_UNICODE + wxFontEncoding m_FontsEncTable[2][2][2][2][7]; +#endif + // table of loaded fonts. 1st four indexes are 0 or 1, depending on on/off + // state of these flags (from left to right): + // [bold][italic][underlined][fixed_size] + // last index is font size : from 0 to 6 (remapped from html sizes 1 to 7) + // Note : this table covers all possible combinations of fonts, but not + // all of them are used, so many items in table are usually NULL. + int m_FontsSizes[7]; + wxString m_FontFaceFixed, m_FontFaceNormal; + // html font sizes and faces of fixed and proportional fonts + +#if !wxUSE_UNICODE + wxFontEncoding m_InputEnc, m_OutputEnc; + // I/O font encodings + wxEncodingConverter *m_EncConv; +#endif + + wxHtmlWordCell *m_lastWordCell; + + DECLARE_NO_COPY_CLASS(wxHtmlWinParser) +}; + + + + + + +//----------------------------------------------------------------------------- +// wxHtmlWinTagHandler +// This is basicly wxHtmlTagHandler except +// it is extended with protected member m_Parser pointing to +// the wxHtmlWinParser object +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_HTML wxHtmlWinTagHandler : public wxHtmlTagHandler +{ + DECLARE_ABSTRACT_CLASS(wxHtmlWinTagHandler) + +public: + wxHtmlWinTagHandler() : wxHtmlTagHandler() {} + + virtual void SetParser(wxHtmlParser *parser) {wxHtmlTagHandler::SetParser(parser); m_WParser = (wxHtmlWinParser*) parser;} + +protected: + wxHtmlWinParser *m_WParser; // same as m_Parser, but overcasted + + DECLARE_NO_COPY_CLASS(wxHtmlWinTagHandler) +}; + + + + + + +//---------------------------------------------------------------------------- +// wxHtmlTagsModule +// This is basic of dynamic tag handlers binding. +// The class provides methods for filling parser's handlers +// hash table. +// (See documentation for details) +//---------------------------------------------------------------------------- + +class WXDLLIMPEXP_HTML wxHtmlTagsModule : public wxModule +{ + DECLARE_DYNAMIC_CLASS(wxHtmlTagsModule) + +public: + wxHtmlTagsModule() : wxModule() {} + + virtual bool OnInit(); + virtual void OnExit(); + + // This is called by wxHtmlWinParser. + // The method must simply call parser->AddTagHandler(new + // <handler_class_name>); for each handler + virtual void FillHandlersTable(wxHtmlWinParser * WXUNUSED(parser)) { } +}; + + +#endif + +#endif // _WX_WINPARS_H_ diff --git a/Externals/wxWidgets/include/wx/htmllbox.h b/Externals/wxWidgets/include/wx/htmllbox.h new file mode 100644 index 0000000000..aba0565561 --- /dev/null +++ b/Externals/wxWidgets/include/wx/htmllbox.h @@ -0,0 +1,325 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/htmllbox.h +// Purpose: wxHtmlListBox is a listbox whose items are wxHtmlCells +// Author: Vadim Zeitlin +// Modified by: +// Created: 31.05.03 +// RCS-ID: $Id: htmllbox.h 49804 2007-11-10 01:09:42Z VZ $ +// Copyright: (c) 2003 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_HTMLLBOX_H_ +#define _WX_HTMLLBOX_H_ + +#include "wx/vlbox.h" // base class +#include "wx/html/htmlwin.h" +#include "wx/ctrlsub.h" + +#if wxUSE_FILESYSTEM + #include "wx/filesys.h" +#endif // wxUSE_FILESYSTEM + +class WXDLLIMPEXP_FWD_HTML wxHtmlCell; +class WXDLLIMPEXP_FWD_HTML wxHtmlWinParser; +class WXDLLIMPEXP_FWD_HTML wxHtmlListBoxCache; +class WXDLLIMPEXP_FWD_HTML wxHtmlListBoxStyle; + +extern WXDLLIMPEXP_DATA_HTML(const wxChar) wxHtmlListBoxNameStr[]; +extern WXDLLIMPEXP_DATA_HTML(const wxChar) wxSimpleHtmlListBoxNameStr[]; + +// ---------------------------------------------------------------------------- +// wxHtmlListBox +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_HTML wxHtmlListBox : public wxVListBox, + public wxHtmlWindowInterface, + public wxHtmlWindowMouseHelper +{ + DECLARE_ABSTRACT_CLASS(wxHtmlListBox) +public: + // constructors and such + // --------------------- + + // default constructor, you must call Create() later + wxHtmlListBox(); + + // normal constructor which calls Create() internally + wxHtmlListBox(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxHtmlListBoxNameStr); + + // really creates the control and sets the initial number of items in it + // (which may be changed later with SetItemCount()) + // + // the only special style which may be specified here is wxLB_MULTIPLE + // + // returns true on success or false if the control couldn't be created + bool Create(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxHtmlListBoxNameStr); + + // destructor cleans up whatever resources we use + virtual ~wxHtmlListBox(); + + // override some base class virtuals + virtual void RefreshLine(size_t line); + virtual void RefreshLines(size_t from, size_t to); + virtual void RefreshAll(); + virtual void SetItemCount(size_t count); + +#if wxUSE_FILESYSTEM + // retrieve the file system used by the wxHtmlWinParser: if you use + // relative paths in your HTML, you should use its ChangePathTo() method + wxFileSystem& GetFileSystem() { return m_filesystem; } + const wxFileSystem& GetFileSystem() const { return m_filesystem; } +#endif // wxUSE_FILESYSTEM + + virtual void OnInternalIdle(); + +protected: + // this method must be implemented in the derived class and should return + // the body (i.e. without <html>) of the HTML for the given item + virtual wxString OnGetItem(size_t n) const = 0; + + // this function may be overridden to decorate HTML returned by OnGetItem() + virtual wxString OnGetItemMarkup(size_t n) const; + + + // this method allows to customize the selection appearance: it may be used + // to specify the colour of the text which normally has the given colour + // colFg when it is inside the selection + // + // by default, the original colour is not used at all and all text has the + // same (default for this system) colour inside selection + virtual wxColour GetSelectedTextColour(const wxColour& colFg) const; + + // this is the same as GetSelectedTextColour() but allows to customize the + // background colour -- this is even more rarely used as you can change it + // globally using SetSelectionBackground() + virtual wxColour GetSelectedTextBgColour(const wxColour& colBg) const; + + + // we implement both of these functions in terms of OnGetItem(), they are + // not supposed to be overridden by our descendants + virtual void OnDrawItem(wxDC& dc, const wxRect& rect, size_t n) const; + virtual wxCoord OnMeasureItem(size_t n) const; + + // This method may be overriden to handle clicking on a link in + // the listbox. By default, clicking links is ignored. + virtual void OnLinkClicked(size_t n, const wxHtmlLinkInfo& link); + + // event handlers + void OnSize(wxSizeEvent& event); + void OnMouseMove(wxMouseEvent& event); + void OnLeftDown(wxMouseEvent& event); + + + // common part of all ctors + void Init(); + + // ensure that the given item is cached + void CacheItem(size_t n) const; + +private: + // wxHtmlWindowInterface methods: + virtual void SetHTMLWindowTitle(const wxString& title); + virtual void OnHTMLLinkClicked(const wxHtmlLinkInfo& link); + virtual wxHtmlOpeningStatus OnHTMLOpeningURL(wxHtmlURLType type, + const wxString& url, + wxString *redirect) const; + virtual wxPoint HTMLCoordsToWindow(wxHtmlCell *cell, + const wxPoint& pos) const; + virtual wxWindow* GetHTMLWindow(); + virtual wxColour GetHTMLBackgroundColour() const; + virtual void SetHTMLBackgroundColour(const wxColour& clr); + virtual void SetHTMLBackgroundImage(const wxBitmap& bmpBg); + virtual void SetHTMLStatusText(const wxString& text); + virtual wxCursor GetHTMLCursor(HTMLCursor type) const; + + // returns index of item that contains given HTML cell + size_t GetItemForCell(const wxHtmlCell *cell) const; + + // return physical coordinates of root wxHtmlCell of n-th item + wxPoint GetRootCellCoords(size_t n) const; + + // Converts physical coordinates stored in @a pos into coordinates + // relative to the root cell of the item under mouse cursor, if any. If no + // cell is found under the cursor, returns false. Otherwise stores the new + // coordinates back into @a pos and pointer to the cell under cursor into + // @a cell and returns true. + bool PhysicalCoordsToCell(wxPoint& pos, wxHtmlCell*& cell) const; + + // The opposite of PhysicalCoordsToCell: converts coordinates relative to + // given cell to physical coordinates in the window + wxPoint CellCoordsToPhysical(const wxPoint& pos, wxHtmlCell *cell) const; + +private: + // this class caches the pre-parsed HTML to speed up display + wxHtmlListBoxCache *m_cache; + + // HTML parser we use + wxHtmlWinParser *m_htmlParser; + +#if wxUSE_FILESYSTEM + // file system used by m_htmlParser + wxFileSystem m_filesystem; +#endif // wxUSE_FILESYSTEM + + // rendering style for the parser which allows us to customize our colours + wxHtmlListBoxStyle *m_htmlRendStyle; + + + // it calls our GetSelectedTextColour() and GetSelectedTextBgColour() + friend class wxHtmlListBoxStyle; + friend class wxHtmlListBoxWinInterface; + + + DECLARE_EVENT_TABLE() + DECLARE_NO_COPY_CLASS(wxHtmlListBox) +}; + + +// ---------------------------------------------------------------------------- +// wxSimpleHtmlListBox +// ---------------------------------------------------------------------------- + +#define wxHLB_DEFAULT_STYLE wxBORDER_SUNKEN +#define wxHLB_MULTIPLE wxLB_MULTIPLE + +class WXDLLIMPEXP_HTML wxSimpleHtmlListBox : public wxHtmlListBox, + public wxItemContainer +{ +public: + // wxListbox-compatible constructors + // --------------------------------- + + wxSimpleHtmlListBox() { } + + wxSimpleHtmlListBox(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + int n = 0, const wxString choices[] = NULL, + long style = wxHLB_DEFAULT_STYLE, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxSimpleHtmlListBoxNameStr) + { + Create(parent, id, pos, size, n, choices, style, validator, name); + } + + wxSimpleHtmlListBox(wxWindow *parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + const wxArrayString& choices, + long style = wxHLB_DEFAULT_STYLE, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxSimpleHtmlListBoxNameStr) + { + Create(parent, id, pos, size, choices, style, validator, name); + } + + bool Create(wxWindow *parent, wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + int n = 0, const wxString choices[] = NULL, + long style = wxHLB_DEFAULT_STYLE, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxSimpleHtmlListBoxNameStr); + bool Create(wxWindow *parent, wxWindowID id, + const wxPoint& pos, + const wxSize& size, + const wxArrayString& choices, + long style = wxHLB_DEFAULT_STYLE, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxSimpleHtmlListBoxNameStr); + + virtual ~wxSimpleHtmlListBox(); + + // these must be overloaded otherwise the compiler will complain + // about wxItemContainerImmutable::[G|S]etSelection being pure virtuals... + void SetSelection(int n) + { wxVListBox::SetSelection(n); } + int GetSelection() const + { return wxVListBox::GetSelection(); } + + // see ctrlsub.h for more info about this: + wxCONTROL_ITEMCONTAINER_CLIENTDATAOBJECT_RECAST + + + // accessing strings + // ----------------- + + virtual unsigned int GetCount() const + { return m_items.GetCount(); } + + virtual wxString GetString(unsigned int n) const; + + // override default unoptimized wxItemContainer::GetStrings() function + wxArrayString GetStrings() const + { return m_items; } + + virtual void SetString(unsigned int n, const wxString& s); + + virtual void Clear(); + virtual void Delete(unsigned int n); + + // override default unoptimized wxItemContainer::Append() function + void Append(const wxArrayString& strings); + + // since we override one Append() overload, we need to overload all others too + int Append(const wxString& item) + { return wxItemContainer::Append(item); } + int Append(const wxString& item, void *clientData) + { return wxItemContainer::Append(item, clientData); } + int Append(const wxString& item, wxClientData *clientData) + { return wxItemContainer::Append(item, clientData); } + + +protected: + + virtual int DoAppend(const wxString& item); + virtual int DoInsert(const wxString& item, unsigned int pos); + + virtual void DoSetItemClientData(unsigned int n, void *clientData) + { m_HTMLclientData[n] = clientData; } + + virtual void *DoGetItemClientData(unsigned int n) const + { return m_HTMLclientData[n]; } + virtual void DoSetItemClientObject(unsigned int n, wxClientData *clientData) + { m_HTMLclientData[n] = (void *)clientData; } + virtual wxClientData *DoGetItemClientObject(unsigned int n) const + { return (wxClientData *)m_HTMLclientData[n]; } + + // calls wxHtmlListBox::SetItemCount() and RefreshAll() + void UpdateCount(); + + // overload these functions just to change their visibility: users of + // wxSimpleHtmlListBox shouldn't be allowed to call them directly! + virtual void SetItemCount(size_t count) + { wxHtmlListBox::SetItemCount(count); } + virtual void SetLineCount(size_t count) + { wxHtmlListBox::SetLineCount(count); } + + virtual wxString OnGetItem(size_t n) const + { return m_items[n]; } + + wxArrayString m_items; + wxArrayPtrVoid m_HTMLclientData; + + // Note: For the benefit of old compilers (like gcc-2.8) this should + // not be named m_clientdata as that clashes with the name of an + // anonymous struct member in wxEvtHandler, which we derive from. + + DECLARE_NO_COPY_CLASS(wxSimpleHtmlListBox) +}; + +#endif // _WX_HTMLLBOX_H_ + diff --git a/Externals/wxWidgets/include/wx/hyperlink.h b/Externals/wxWidgets/include/wx/hyperlink.h new file mode 100644 index 0000000000..a293c8ed87 --- /dev/null +++ b/Externals/wxWidgets/include/wx/hyperlink.h @@ -0,0 +1,231 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/hyperlink.h +// Purpose: Hyperlink control +// Author: David Norris <danorris@gmail.com>, Otto Wyss +// Modified by: Ryan Norton, Francesco Montorsi +// Created: 04/02/2005 +// RCS-ID: $Id: hyperlink.h 42409 2006-10-25 20:23:06Z RD $ +// Copyright: (c) 2005 David Norris +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_HYPERLINK_H__ +#define _WX_HYPERLINK_H__ + +#include "wx/defs.h" + +#if wxUSE_HYPERLINKCTRL + +#include "wx/control.h" + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +#define wxHL_CONTEXTMENU 0x0001 +#define wxHL_ALIGN_LEFT 0x0002 +#define wxHL_ALIGN_RIGHT 0x0004 +#define wxHL_ALIGN_CENTRE 0x0008 +#define wxHL_DEFAULT_STYLE (wxHL_CONTEXTMENU|wxNO_BORDER|wxHL_ALIGN_CENTRE) + +extern WXDLLIMPEXP_DATA_ADV(const wxChar) wxHyperlinkCtrlNameStr[]; + + +// ---------------------------------------------------------------------------- +// wxHyperlinkCtrl +// ---------------------------------------------------------------------------- + +// A static text control that emulates a hyperlink. The link is displayed +// in an appropriate text style, derived from the control's normal font. +// When the mouse rolls over the link, the cursor changes to a hand and the +// link's color changes to the active color. +// +// Clicking on the link does not launch a web browser; instead, a +// HyperlinkEvent is fired. The event propagates upward until it is caught, +// just like a wxCommandEvent. +// +// Use the EVT_HYPERLINK() to catch link events. +class WXDLLIMPEXP_ADV wxHyperlinkCtrl : public wxControl +{ +public: + // Default constructor (for two-step construction). + wxHyperlinkCtrl() { } + + // Constructor. + wxHyperlinkCtrl(wxWindow *parent, + wxWindowID id, + const wxString& label, const wxString& url, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxHL_DEFAULT_STYLE, + const wxString& name = wxHyperlinkCtrlNameStr) + { + (void)Create(parent, id, label, url, pos, size, style, name); + } + + // Creation function (for two-step construction). + bool Create(wxWindow *parent, + wxWindowID id, + const wxString& label, const wxString& url, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxHL_DEFAULT_STYLE, + const wxString& name = wxHyperlinkCtrlNameStr); + + + // get/set + wxColour GetHoverColour() const { return m_hoverColour; } + void SetHoverColour(const wxColour &colour) { m_hoverColour = colour; } + + wxColour GetNormalColour() const { return m_normalColour; } + void SetNormalColour(const wxColour &colour); + + wxColour GetVisitedColour() const { return m_visitedColour; } + void SetVisitedColour(const wxColour &colour); + + wxString GetURL() const { return m_url; } + void SetURL (const wxString &url) { m_url=url; } + + void SetVisited(bool visited = true) { m_visited=visited; } + bool GetVisited() const { return m_visited; } + + // NOTE: also wxWindow::Set/GetLabel, wxWindow::Set/GetBackgroundColour, + // wxWindow::Get/SetFont, wxWindow::Get/SetCursor are important ! + + +protected: + // event handlers + + // Renders the hyperlink. + void OnPaint(wxPaintEvent& event); + + // Returns the wxRect of the label of this hyperlink. + // This is different from the clientsize's rectangle when + // clientsize != bestsize and this rectangle is influenced + // by the alignment of the label (wxHL_ALIGN_*). + wxRect GetLabelRect() const; + + // If the click originates inside the bounding box of the label, + // a flag is set so that an event will be fired when the left + // button is released. + void OnLeftDown(wxMouseEvent& event); + + // If the click both originated and finished inside the bounding box + // of the label, a HyperlinkEvent is fired. + void OnLeftUp(wxMouseEvent& event); + void OnRightUp(wxMouseEvent& event); + + // Changes the cursor to a hand, if the mouse is inside the label's + // bounding box. + void OnMotion(wxMouseEvent& event); + + // Changes the cursor back to the default, if necessary. + void OnLeaveWindow(wxMouseEvent& event); + + // handles "Copy URL" menuitem + void OnPopUpCopy(wxCommandEvent& event); + + // Refreshes the control to update label's position if necessary + void OnSize(wxSizeEvent& event); + + + // overridden base class virtuals + + // Returns the best size for the window, which is the size needed + // to display the text label. + virtual wxSize DoGetBestSize() const; + + // creates a context menu with "Copy URL" menuitem + virtual void DoContextMenu(const wxPoint &); + +private: + // URL associated with the link. This is transmitted inside + // the HyperlinkEvent fired when the user clicks on the label. + wxString m_url; + + // Foreground colours for various link types. + // NOTE: wxWindow::m_backgroundColour is used for background, + // wxWindow::m_foregroundColour is used to render non-visited links + wxColour m_hoverColour; + wxColour m_normalColour; + wxColour m_visitedColour; + + // True if the mouse cursor is inside the label's bounding box. + bool m_rollover; + + // True if the link has been clicked before. + bool m_visited; + + // True if a click is in progress (left button down) and the click + // originated inside the label's bounding box. + bool m_clicking; + +private: + DECLARE_DYNAMIC_CLASS(wxHyperlinkCtrl) + DECLARE_EVENT_TABLE() +}; + + +// ---------------------------------------------------------------------------- +// wxHyperlinkEvent +// ---------------------------------------------------------------------------- + +// Declare an event identifier. +BEGIN_DECLARE_EVENT_TYPES() + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_COMMAND_HYPERLINK, 3700) +END_DECLARE_EVENT_TYPES() + +// +// An event fired when the user clicks on the label in a hyperlink control. +// See HyperlinkControl for details. +// +class WXDLLIMPEXP_ADV wxHyperlinkEvent : public wxCommandEvent +{ +public: + wxHyperlinkEvent() {} + wxHyperlinkEvent(wxObject *generator, wxWindowID id, const wxString& url) + : wxCommandEvent(wxEVT_COMMAND_HYPERLINK, id), + m_url(url) + { + SetEventObject(generator); + } + + // Returns the URL associated with the hyperlink control + // that the user clicked on. + wxString GetURL() const { return m_url; } + void SetURL(const wxString &url) { m_url=url; } + + // default copy ctor, assignment operator and dtor are ok + virtual wxEvent *Clone() const { return new wxHyperlinkEvent(*this); } + +private: + + // URL associated with the hyperlink control that the used clicked on. + wxString m_url; + + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxHyperlinkEvent) +}; + + +// ---------------------------------------------------------------------------- +// event types and macros +// ---------------------------------------------------------------------------- + +typedef void (wxEvtHandler::*wxHyperlinkEventFunction)(wxHyperlinkEvent&); + +#define wxHyperlinkEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxHyperlinkEventFunction, &func) + +#define EVT_HYPERLINK(id, fn) \ + wx__DECLARE_EVT1(wxEVT_COMMAND_HYPERLINK, id, wxHyperlinkEventHandler(fn)) + +#ifdef _WX_DEFINE_DATE_EVENTS_ + DEFINE_EVENT_TYPE(wxEVT_COMMAND_HYPERLINK) + + IMPLEMENT_DYNAMIC_CLASS(wxHyperlinkEvent, wxCommandEvent) +#endif + + +#endif // wxUSE_HYPERLINKCTRL + +#endif // _WX_HYPERLINK_H__ diff --git a/Externals/wxWidgets/include/wx/icon.h b/Externals/wxWidgets/include/wx/icon.h new file mode 100644 index 0000000000..8a73884ca7 --- /dev/null +++ b/Externals/wxWidgets/include/wx/icon.h @@ -0,0 +1,53 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/icon.h +// Purpose: wxIcon base header +// Author: Julian Smart +// Modified by: +// Created: +// Copyright: (c) Julian Smart +// RCS-ID: $Id: icon.h 41538 2006-09-30 20:45:15Z RR $ +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_ICON_H_BASE_ +#define _WX_ICON_H_BASE_ + +#include "wx/iconloc.h" + +#if defined(__WXPALMOS__) + #include "wx/generic/icon.h" +#elif defined(__WXMSW__) + #include "wx/msw/icon.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/icon.h" +#elif defined(__WXGTK20__) + #include "wx/generic/icon.h" +#elif defined(__WXGTK__) + #include "wx/generic/icon.h" +#elif defined(__WXX11__) + #include "wx/generic/icon.h" +#elif defined(__WXMGL__) + #define wxICON_DEFAULT_BITMAP_TYPE wxBITMAP_TYPE_ICO_RESOURCE + #include "wx/generic/icon.h" +#elif defined(__WXDFB__) + #include "wx/generic/icon.h" +#elif defined(__WXMAC__) + #include "wx/mac/icon.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/icon.h" +#elif defined(__WXPM__) + #include "wx/os2/icon.h" +#endif + +//----------------------------------------------------------------------------- +// wxVariant support +//----------------------------------------------------------------------------- + +#if wxUSE_VARIANT +#include "wx/variant.h" +DECLARE_VARIANT_OBJECT_EXPORTED(wxIcon,WXDLLEXPORT) +#endif + + +#endif + // _WX_ICON_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/iconbndl.h b/Externals/wxWidgets/include/wx/iconbndl.h new file mode 100644 index 0000000000..ced8dbba69 --- /dev/null +++ b/Externals/wxWidgets/include/wx/iconbndl.h @@ -0,0 +1,69 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/iconbndl.h +// Purpose: wxIconBundle +// Author: Mattia barbon +// Modified by: +// Created: 23.03.02 +// RCS-ID: $Id: iconbndl.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) Mattia Barbon +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_ICONBNDL_H_ +#define _WX_ICONBNDL_H_ + +#include "wx/dynarray.h" +// for wxSize +#include "wx/gdicmn.h" + +class WXDLLIMPEXP_FWD_CORE wxIcon; +class WXDLLIMPEXP_FWD_BASE wxString; + +WX_DECLARE_EXPORTED_OBJARRAY( wxIcon, wxIconArray ); + +// this class can't load bitmaps of type wxBITMAP_TYPE_ICO_RESOURCE, +// if you need them, you have to load them manually and call +// wxIconCollection::AddIcon +class WXDLLEXPORT wxIconBundle +{ +public: + // default constructor + wxIconBundle() : m_icons() {} + // initializes the bundle with the icon(s) found in the file + wxIconBundle( const wxString& file, long type ) : m_icons() + { AddIcon( file, type ); } + // initializes the bundle with a single icon + wxIconBundle( const wxIcon& icon ) : m_icons() + { AddIcon( icon ); } + + const wxIconBundle& operator =( const wxIconBundle& ic ); + wxIconBundle( const wxIconBundle& ic ) : m_icons() + { *this = ic; } + + ~wxIconBundle() { DeleteIcons(); } + + // adds all the icons contained in the file to the collection, + // if the collection already contains icons with the same + // width and height, they are replaced + void AddIcon( const wxString& file, long type ); + // adds the icon to the collection, if the collection already + // contains an icon with the same width and height, it is + // replaced + void AddIcon( const wxIcon& icon ); + + // returns the icon with the given size; if no such icon exists, + // returns the icon with size wxSYS_ICON_[XY]; if no such icon exists, + // returns the first icon in the bundle + const wxIcon& GetIcon( const wxSize& size ) const; + // equivalent to GetIcon( wxSize( size, size ) ) + const wxIcon& GetIcon( wxCoord size = wxDefaultCoord ) const + { return GetIcon( wxSize( size, size ) ); } +private: + // delete all icons + void DeleteIcons(); +public: + wxIconArray m_icons; +}; + +#endif + // _WX_ICONBNDL_H_ diff --git a/Externals/wxWidgets/include/wx/iconloc.h b/Externals/wxWidgets/include/wx/iconloc.h new file mode 100644 index 0000000000..e89d45d4ec --- /dev/null +++ b/Externals/wxWidgets/include/wx/iconloc.h @@ -0,0 +1,81 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/iconloc.h +// Purpose: declaration of wxIconLocation class +// Author: Vadim Zeitlin +// Modified by: +// Created: 21.06.2003 +// RCS-ID: $Id: iconloc.h 27408 2004-05-23 20:53:33Z JS $ +// Copyright: (c) 2003 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_ICONLOC_H_ +#define _WX_ICONLOC_H_ + +#include "wx/string.h" + +// ---------------------------------------------------------------------------- +// wxIconLocation: describes the location of an icon +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxIconLocationBase +{ +public: + // ctor takes the name of the file where the icon is + wxEXPLICIT wxIconLocationBase(const wxString& filename = wxEmptyString) + : m_filename(filename) { } + + // default copy ctor, assignment operator and dtor are ok + + + // returns true if this object is valid/initialized + bool IsOk() const { return !m_filename.empty(); } + + // set/get the icon file name + void SetFileName(const wxString& filename) { m_filename = filename; } + const wxString& GetFileName() const { return m_filename; } + +private: + wxString m_filename; +}; + +// under MSW the same file may contain several icons so we also store the +// index of the icon +#if defined(__WXMSW__) + +class WXDLLIMPEXP_BASE wxIconLocation : public wxIconLocationBase +{ +public: + // ctor takes the name of the file where the icon is and the icons index in + // the file + wxEXPLICIT wxIconLocation(const wxString& file = wxEmptyString, int num = 0); + + // set/get the icon index + void SetIndex(int num) { m_index = num; } + int GetIndex() const { return m_index; } + +private: + int m_index; +}; + +inline +wxIconLocation::wxIconLocation(const wxString& file, int num) + : wxIconLocationBase(file) +{ + SetIndex(num); +} + +#else // !MSW + +// must be a class because we forward declare it as class +class WXDLLIMPEXP_BASE wxIconLocation : public wxIconLocationBase +{ +public: + wxEXPLICIT wxIconLocation(const wxString& filename = wxEmptyString) + : wxIconLocationBase(filename) { } +}; + +#endif // platform + +#endif // _WX_ICONLOC_H_ + diff --git a/Externals/wxWidgets/include/wx/imagbmp.h b/Externals/wxWidgets/include/wx/imagbmp.h new file mode 100644 index 0000000000..b475b3aa00 --- /dev/null +++ b/Externals/wxWidgets/include/wx/imagbmp.h @@ -0,0 +1,165 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/imagbmp.h +// Purpose: wxImage BMP, ICO, CUR and ANI handlers +// Author: Robert Roebling, Chris Elliott +// RCS-ID: $Id: imagbmp.h 45498 2007-04-16 13:03:05Z VZ $ +// Copyright: (c) Robert Roebling, Chris Elliott +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_IMAGBMP_H_ +#define _WX_IMAGBMP_H_ + +#include "wx/image.h" + +// defines for saving the BMP file in different formats, Bits Per Pixel +// USE: wximage.SetOption( wxIMAGE_OPTION_BMP_FORMAT, wxBMP_xBPP ); +#define wxIMAGE_OPTION_BMP_FORMAT wxString(_T("wxBMP_FORMAT")) + +// These two options are filled in upon reading CUR file and can (should) be +// specified when saving a CUR file - they define the hotspot of the cursor: +#define wxIMAGE_OPTION_CUR_HOTSPOT_X wxT("HotSpotX") +#define wxIMAGE_OPTION_CUR_HOTSPOT_Y wxT("HotSpotY") + +#if WXWIN_COMPATIBILITY_2_4 + // Do not use these macros, they are deprecated + #define wxBMP_FORMAT wxIMAGE_OPTION_BMP_FORMAT + #define wxCUR_HOTSPOT_X wxIMAGE_OPTION_CUR_HOTSPOT_X + #define wxCUR_HOTSPOT_Y wxIMAGE_OPTION_CUR_HOTSPOT_Y +#endif + + +enum +{ + wxBMP_24BPP = 24, // default, do not need to set + //wxBMP_16BPP = 16, // wxQuantize can only do 236 colors? + wxBMP_8BPP = 8, // 8bpp, quantized colors + wxBMP_8BPP_GREY = 9, // 8bpp, rgb averaged to greys + wxBMP_8BPP_GRAY = wxBMP_8BPP_GREY, + wxBMP_8BPP_RED = 10, // 8bpp, red used as greyscale + wxBMP_8BPP_PALETTE = 11, // 8bpp, use the wxImage's palette + wxBMP_4BPP = 4, // 4bpp, quantized colors + wxBMP_1BPP = 1, // 1bpp, quantized "colors" + wxBMP_1BPP_BW = 2 // 1bpp, black & white from red +}; + +// ---------------------------------------------------------------------------- +// wxBMPHandler +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxBMPHandler : public wxImageHandler +{ +public: + wxBMPHandler() + { + m_name = _T("Windows bitmap file"); + m_extension = _T("bmp"); + m_type = wxBITMAP_TYPE_BMP; + m_mime = _T("image/x-bmp"); + } + +#if wxUSE_STREAMS + virtual bool SaveFile( wxImage *image, wxOutputStream& stream, bool verbose=true ); + virtual bool LoadFile( wxImage *image, wxInputStream& stream, bool verbose=true, int index=-1 ); + +protected: + virtual bool DoCanRead( wxInputStream& stream ); + bool SaveDib(wxImage *image, wxOutputStream& stream, bool verbose, + bool IsBmp, bool IsMask); + bool DoLoadDib(wxImage *image, int width, int height, int bpp, int ncolors, + int comp, wxFileOffset bmpOffset, wxInputStream& stream, + bool verbose, bool IsBmp, bool hasPalette); + bool LoadDib(wxImage *image, wxInputStream& stream, bool verbose, bool IsBmp); +#endif // wxUSE_STREAMS + +private: + DECLARE_DYNAMIC_CLASS(wxBMPHandler) +}; + +#if wxUSE_ICO_CUR +// ---------------------------------------------------------------------------- +// wxICOHandler +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxICOHandler : public wxBMPHandler +{ +public: + wxICOHandler() + { + m_name = _T("Windows icon file"); + m_extension = _T("ico"); + m_type = wxBITMAP_TYPE_ICO; + m_mime = _T("image/x-ico"); + } + +#if wxUSE_STREAMS + virtual bool SaveFile( wxImage *image, wxOutputStream& stream, bool verbose=true ); + virtual bool LoadFile( wxImage *image, wxInputStream& stream, bool verbose=true, int index=-1 ); + virtual bool DoLoadFile( wxImage *image, wxInputStream& stream, bool verbose, int index ); + virtual int GetImageCount( wxInputStream& stream ); +protected: + virtual bool DoCanRead( wxInputStream& stream ); +#endif // wxUSE_STREAMS + +private: + DECLARE_DYNAMIC_CLASS(wxICOHandler) +}; + + +// ---------------------------------------------------------------------------- +// wxCURHandler +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxCURHandler : public wxICOHandler +{ +public: + wxCURHandler() + { + m_name = _T("Windows cursor file"); + m_extension = _T("cur"); + m_type = wxBITMAP_TYPE_CUR; + m_mime = _T("image/x-cur"); + } + + // VS: This handler's meat is implemented inside wxICOHandler (the two + // formats are almost identical), but we hide this fact at + // the API level, since it is a mere implementation detail. + +protected: +#if wxUSE_STREAMS + virtual bool DoCanRead( wxInputStream& stream ); +#endif // wxUSE_STREAMS + +private: + DECLARE_DYNAMIC_CLASS(wxCURHandler) +}; +// ---------------------------------------------------------------------------- +// wxANIHandler +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxANIHandler : public wxCURHandler +{ +public: + wxANIHandler() + { + m_name = _T("Windows animated cursor file"); + m_extension = _T("ani"); + m_type = wxBITMAP_TYPE_ANI; + m_mime = _T("image/x-ani"); + } + + +#if wxUSE_STREAMS + virtual bool SaveFile( wxImage *WXUNUSED(image), wxOutputStream& WXUNUSED(stream), bool WXUNUSED(verbose=true) ){return false ;} + virtual bool LoadFile( wxImage *image, wxInputStream& stream, bool verbose=true, int index=-1 ); + virtual int GetImageCount( wxInputStream& stream ); +protected: + virtual bool DoCanRead( wxInputStream& stream ); +#endif // wxUSE_STREAMS + +private: + DECLARE_DYNAMIC_CLASS(wxANIHandler) +}; + +#endif // wxUSE_ICO_CUR +#endif // _WX_IMAGBMP_H_ diff --git a/Externals/wxWidgets/include/wx/image.h b/Externals/wxWidgets/include/wx/image.h new file mode 100644 index 0000000000..cce2d6c1e1 --- /dev/null +++ b/Externals/wxWidgets/include/wx/image.h @@ -0,0 +1,454 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/image.h +// Purpose: wxImage class +// Author: Robert Roebling +// RCS-ID: $Id: image.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_IMAGE_H_ +#define _WX_IMAGE_H_ + +#include "wx/defs.h" + +#if wxUSE_IMAGE + +#include "wx/object.h" +#include "wx/string.h" +#include "wx/gdicmn.h" +#include "wx/hashmap.h" + +#if wxUSE_STREAMS +# include "wx/stream.h" +#endif + +// on some systems (Unixware 7.x) index is defined as a macro in the headers +// which breaks the compilation below +#undef index + +#define wxIMAGE_OPTION_QUALITY wxString(_T("quality")) +#define wxIMAGE_OPTION_FILENAME wxString(_T("FileName")) + +#define wxIMAGE_OPTION_RESOLUTION wxString(_T("Resolution")) +#define wxIMAGE_OPTION_RESOLUTIONX wxString(_T("ResolutionX")) +#define wxIMAGE_OPTION_RESOLUTIONY wxString(_T("ResolutionY")) + +#define wxIMAGE_OPTION_RESOLUTIONUNIT wxString(_T("ResolutionUnit")) + +// constants used with wxIMAGE_OPTION_RESOLUTIONUNIT +enum +{ + wxIMAGE_RESOLUTION_INCHES = 1, + wxIMAGE_RESOLUTION_CM = 2 +}; + +// Constants for wxImage::Scale() for determining the level of quality +enum +{ + wxIMAGE_QUALITY_NORMAL = 0, + wxIMAGE_QUALITY_HIGH = 1 +}; + +// alpha channel values: fully transparent, default threshold separating +// transparent pixels from opaque for a few functions dealing with alpha and +// fully opaque +const unsigned char wxIMAGE_ALPHA_TRANSPARENT = 0; +const unsigned char wxIMAGE_ALPHA_THRESHOLD = 0x80; +const unsigned char wxIMAGE_ALPHA_OPAQUE = 0xff; + +//----------------------------------------------------------------------------- +// classes +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_CORE wxImageHandler; +class WXDLLIMPEXP_FWD_CORE wxImage; +class WXDLLIMPEXP_FWD_CORE wxPalette; + +//----------------------------------------------------------------------------- +// wxVariant support +//----------------------------------------------------------------------------- + +#if wxUSE_VARIANT +#include "wx/variant.h" +DECLARE_VARIANT_OBJECT_EXPORTED(wxImage,WXDLLEXPORT) +#endif + +//----------------------------------------------------------------------------- +// wxImageHandler +//----------------------------------------------------------------------------- + +class WXDLLEXPORT wxImageHandler: public wxObject +{ +public: + wxImageHandler() + : m_name(wxEmptyString), m_extension(wxEmptyString), m_mime(), m_type(0) + { } + +#if wxUSE_STREAMS + virtual bool LoadFile( wxImage *image, wxInputStream& stream, bool verbose=true, int index=-1 ); + virtual bool SaveFile( wxImage *image, wxOutputStream& stream, bool verbose=true ); + + virtual int GetImageCount( wxInputStream& stream ); + + bool CanRead( wxInputStream& stream ) { return CallDoCanRead(stream); } + bool CanRead( const wxString& name ); +#endif // wxUSE_STREAMS + + void SetName(const wxString& name) { m_name = name; } + void SetExtension(const wxString& ext) { m_extension = ext; } + void SetType(long type) { m_type = type; } + void SetMimeType(const wxString& type) { m_mime = type; } + const wxString& GetName() const { return m_name; } + const wxString& GetExtension() const { return m_extension; } + long GetType() const { return m_type; } + const wxString& GetMimeType() const { return m_mime; } + +protected: +#if wxUSE_STREAMS + virtual bool DoCanRead( wxInputStream& stream ) = 0; + + // save the stream position, call DoCanRead() and restore the position + bool CallDoCanRead(wxInputStream& stream); +#endif // wxUSE_STREAMS + + wxString m_name; + wxString m_extension; + wxString m_mime; + long m_type; + +private: + DECLARE_CLASS(wxImageHandler) +}; + +//----------------------------------------------------------------------------- +// wxImageHistogram +//----------------------------------------------------------------------------- + +class WXDLLEXPORT wxImageHistogramEntry +{ +public: + wxImageHistogramEntry() { index = value = 0; } + unsigned long index; + unsigned long value; +}; + +WX_DECLARE_EXPORTED_HASH_MAP(unsigned long, wxImageHistogramEntry, + wxIntegerHash, wxIntegerEqual, + wxImageHistogramBase); + +class WXDLLEXPORT wxImageHistogram : public wxImageHistogramBase +{ +public: + wxImageHistogram() : wxImageHistogramBase(256) { } + + // get the key in the histogram for the given RGB values + static unsigned long MakeKey(unsigned char r, + unsigned char g, + unsigned char b) + { + return (r << 16) | (g << 8) | b; + } + + // find first colour that is not used in the image and has higher + // RGB values than RGB(startR, startG, startB) + // + // returns true and puts this colour in r, g, b (each of which may be NULL) + // on success or returns false if there are no more free colours + bool FindFirstUnusedColour(unsigned char *r, + unsigned char *g, + unsigned char *b, + unsigned char startR = 1, + unsigned char startG = 0, + unsigned char startB = 0 ) const; +}; + +//----------------------------------------------------------------------------- +// wxImage +//----------------------------------------------------------------------------- + +class WXDLLEXPORT wxImage: public wxObject +{ +public: + // red, green and blue are 8 bit unsigned integers in the range of 0..255 + // We use the identifier RGBValue instead of RGB, since RGB is #defined + class RGBValue + { + public: + RGBValue(unsigned char r=0, unsigned char g=0, unsigned char b=0) + : red(r), green(g), blue(b) {} + unsigned char red; + unsigned char green; + unsigned char blue; + }; + + // hue, saturation and value are doubles in the range 0.0..1.0 + class HSVValue + { + public: + HSVValue(double h=0.0, double s=0.0, double v=0.0) + : hue(h), saturation(s), value(v) {} + double hue; + double saturation; + double value; + }; + + wxImage(){} + wxImage( int width, int height, bool clear = true ); + wxImage( int width, int height, unsigned char* data, bool static_data = false ); + wxImage( int width, int height, unsigned char* data, unsigned char* alpha, bool static_data = false ); + wxImage( const wxString& name, long type = wxBITMAP_TYPE_ANY, int index = -1 ); + wxImage( const wxString& name, const wxString& mimetype, int index = -1 ); + wxImage( const char* const* xpmData ); + +#if wxUSE_STREAMS + wxImage( wxInputStream& stream, long type = wxBITMAP_TYPE_ANY, int index = -1 ); + wxImage( wxInputStream& stream, const wxString& mimetype, int index = -1 ); +#endif // wxUSE_STREAMS + + bool Create( int width, int height, bool clear = true ); + bool Create( int width, int height, unsigned char* data, bool static_data = false ); + bool Create( int width, int height, unsigned char* data, unsigned char* alpha, bool static_data = false ); + bool Create( const char* const* xpmData ); +#ifdef __BORLANDC__ + // needed for Borland 5.5 + wxImage( char** xpmData ) { Create(wx_const_cast(const char* const*, xpmData)); } + bool Create( char** xpmData ) { return Create(wx_const_cast(const char* const*, xpmData)); } +#endif + void Destroy(); + + // creates an identical copy of the image (the = operator + // just raises the ref count) + wxImage Copy() const; + + // return the new image with size width*height + wxImage GetSubImage( const wxRect& rect) const; + + // Paste the image or part of this image into an image of the given size at the pos + // any newly exposed areas will be filled with the rgb colour + // by default if r = g = b = -1 then fill with this image's mask colour or find and + // set a suitable mask colour + wxImage Size( const wxSize& size, const wxPoint& pos, + int r = -1, int g = -1, int b = -1 ) const; + + // pastes image into this instance and takes care of + // the mask colour and out of bounds problems + void Paste( const wxImage &image, int x, int y ); + + // return the new image with size width*height + wxImage Scale( int width, int height, int quality = wxIMAGE_QUALITY_NORMAL ) const; + + // box averager and bicubic filters for up/down sampling + wxImage ResampleBox(int width, int height) const; + wxImage ResampleBicubic(int width, int height) const; + + // blur the image according to the specified pixel radius + wxImage Blur(int radius); + wxImage BlurHorizontal(int radius); + wxImage BlurVertical(int radius); + + wxImage ShrinkBy( int xFactor , int yFactor ) const ; + + // rescales the image in place + wxImage& Rescale( int width, int height, int quality = wxIMAGE_QUALITY_NORMAL ) { return *this = Scale(width, height, quality); } + + // resizes the image in place + wxImage& Resize( const wxSize& size, const wxPoint& pos, + int r = -1, int g = -1, int b = -1 ) { return *this = Size(size, pos, r, g, b); } + + // Rotates the image about the given point, 'angle' radians. + // Returns the rotated image, leaving this image intact. + wxImage Rotate(double angle, const wxPoint & centre_of_rotation, + bool interpolating = true, wxPoint * offset_after_rotation = (wxPoint*) NULL) const; + + wxImage Rotate90( bool clockwise = true ) const; + wxImage Mirror( bool horizontally = true ) const; + + // replace one colour with another + void Replace( unsigned char r1, unsigned char g1, unsigned char b1, + unsigned char r2, unsigned char g2, unsigned char b2 ); + + // Convert to greyscale image. Uses the luminance component (Y) of the image. + // The luma value (YUV) is calculated using (R * lr) + (G * lg) + (B * lb), defaults to ITU-T BT.601 + wxImage ConvertToGreyscale( double lr = 0.299, double lg = 0.587, double lb = 0.114 ) const; + + // convert to monochrome image (<r,g,b> will be replaced by white, + // everything else by black) + wxImage ConvertToMono( unsigned char r, unsigned char g, unsigned char b ) const; + + // these routines are slow but safe + void SetRGB( int x, int y, unsigned char r, unsigned char g, unsigned char b ); + void SetRGB( const wxRect& rect, unsigned char r, unsigned char g, unsigned char b ); + unsigned char GetRed( int x, int y ) const; + unsigned char GetGreen( int x, int y ) const; + unsigned char GetBlue( int x, int y ) const; + + void SetAlpha(int x, int y, unsigned char alpha); + unsigned char GetAlpha(int x, int y) const; + + // find first colour that is not used in the image and has higher + // RGB values than <startR,startG,startB> + bool FindFirstUnusedColour( unsigned char *r, unsigned char *g, unsigned char *b, + unsigned char startR = 1, unsigned char startG = 0, + unsigned char startB = 0 ) const; + // Set image's mask to the area of 'mask' that has <r,g,b> colour + bool SetMaskFromImage(const wxImage & mask, + unsigned char mr, unsigned char mg, unsigned char mb); + + // converts image's alpha channel to mask, if it has any, does nothing + // otherwise: + bool ConvertAlphaToMask(unsigned char threshold = wxIMAGE_ALPHA_THRESHOLD); + + // This method converts an image where the original alpha + // information is only available as a shades of a colour + // (actually shades of grey) typically when you draw anti- + // aliased text into a bitmap. The DC drawinf routines + // draw grey values on the black background although they + // actually mean to draw white with differnt alpha values. + // This method reverses it, assuming a black (!) background + // and white text (actually only the red channel is read). + // The method will then fill up the whole image with the + // colour given. + bool ConvertColourToAlpha( unsigned char r, unsigned char g, unsigned char b ); + + static bool CanRead( const wxString& name ); + static int GetImageCount( const wxString& name, long type = wxBITMAP_TYPE_ANY ); + virtual bool LoadFile( const wxString& name, long type = wxBITMAP_TYPE_ANY, int index = -1 ); + virtual bool LoadFile( const wxString& name, const wxString& mimetype, int index = -1 ); + +#if wxUSE_STREAMS + static bool CanRead( wxInputStream& stream ); + static int GetImageCount( wxInputStream& stream, long type = wxBITMAP_TYPE_ANY ); + virtual bool LoadFile( wxInputStream& stream, long type = wxBITMAP_TYPE_ANY, int index = -1 ); + virtual bool LoadFile( wxInputStream& stream, const wxString& mimetype, int index = -1 ); +#endif + + virtual bool SaveFile( const wxString& name ) const; + virtual bool SaveFile( const wxString& name, int type ) const; + virtual bool SaveFile( const wxString& name, const wxString& mimetype ) const; + +#if wxUSE_STREAMS + virtual bool SaveFile( wxOutputStream& stream, int type ) const; + virtual bool SaveFile( wxOutputStream& stream, const wxString& mimetype ) const; +#endif + + bool Ok() const { return IsOk(); } + bool IsOk() const; + int GetWidth() const; + int GetHeight() const; + + // these functions provide fastest access to wxImage data but should be + // used carefully as no checks are done + unsigned char *GetData() const; + void SetData( unsigned char *data, bool static_data=false ); + void SetData( unsigned char *data, int new_width, int new_height, bool static_data=false ); + + unsigned char *GetAlpha() const; // may return NULL! + bool HasAlpha() const { return GetAlpha() != NULL; } + void SetAlpha(unsigned char *alpha = NULL, bool static_data=false); + void InitAlpha(); + + // return true if this pixel is masked or has alpha less than specified + // threshold + bool IsTransparent(int x, int y, + unsigned char threshold = wxIMAGE_ALPHA_THRESHOLD) const; + + // Mask functions + void SetMaskColour( unsigned char r, unsigned char g, unsigned char b ); + // Get the current mask colour or find a suitable colour + // returns true if using current mask colour + bool GetOrFindMaskColour( unsigned char *r, unsigned char *g, unsigned char *b ) const; + unsigned char GetMaskRed() const; + unsigned char GetMaskGreen() const; + unsigned char GetMaskBlue() const; + void SetMask( bool mask = true ); + bool HasMask() const; + +#if wxUSE_PALETTE + // Palette functions + bool HasPalette() const; + const wxPalette& GetPalette() const; + void SetPalette(const wxPalette& palette); +#endif // wxUSE_PALETTE + + // Option functions (arbitrary name/value mapping) + void SetOption(const wxString& name, const wxString& value); + void SetOption(const wxString& name, int value); + wxString GetOption(const wxString& name) const; + int GetOptionInt(const wxString& name) const; + bool HasOption(const wxString& name) const; + + unsigned long CountColours( unsigned long stopafter = (unsigned long) -1 ) const; + + // Computes the histogram of the image and fills a hash table, indexed + // with integer keys built as 0xRRGGBB, containing wxImageHistogramEntry + // objects. Each of them contains an 'index' (useful to build a palette + // with the image colours) and a 'value', which is the number of pixels + // in the image with that colour. + // Returned value: # of entries in the histogram + unsigned long ComputeHistogram( wxImageHistogram &h ) const; + + // Rotates the hue of each pixel of the image. angle is a double in the range + // -1.0..1.0 where -1.0 is -360 degrees and 1.0 is 360 degrees + void RotateHue(double angle); + + static wxList& GetHandlers() { return sm_handlers; } + static void AddHandler( wxImageHandler *handler ); + static void InsertHandler( wxImageHandler *handler ); + static bool RemoveHandler( const wxString& name ); + static wxImageHandler *FindHandler( const wxString& name ); + static wxImageHandler *FindHandler( const wxString& extension, long imageType ); + static wxImageHandler *FindHandler( long imageType ); + static wxImageHandler *FindHandlerMime( const wxString& mimetype ); + + static wxString GetImageExtWildcard(); + + static void CleanUpHandlers(); + static void InitStandardHandlers(); + + static HSVValue RGBtoHSV(const RGBValue& rgb); + static RGBValue HSVtoRGB(const HSVValue& hsv); + + +protected: + static wxList sm_handlers; + + // return the index of the point with the given coordinates or -1 if the + // image is invalid of the coordinates are out of range + // + // note that index must be multiplied by 3 when using it with RGB array + long XYToIndex(int x, int y) const; + + virtual wxObjectRefData* CreateRefData() const; + virtual wxObjectRefData* CloneRefData(const wxObjectRefData* data) const; + +private: + friend class WXDLLIMPEXP_FWD_CORE wxImageHandler; + + DECLARE_DYNAMIC_CLASS(wxImage) +}; + + +extern void WXDLLEXPORT wxInitAllImageHandlers(); + +extern WXDLLEXPORT_DATA(wxImage) wxNullImage; + +//----------------------------------------------------------------------------- +// wxImage handlers +//----------------------------------------------------------------------------- + +#include "wx/imagbmp.h" +#include "wx/imagpng.h" +#include "wx/imaggif.h" +#include "wx/imagpcx.h" +#include "wx/imagjpeg.h" +#include "wx/imagtga.h" +#include "wx/imagtiff.h" +#include "wx/imagpnm.h" +#include "wx/imagxpm.h" +#include "wx/imagiff.h" + +#endif // wxUSE_IMAGE + +#endif + // _WX_IMAGE_H_ diff --git a/Externals/wxWidgets/include/wx/imaggif.h b/Externals/wxWidgets/include/wx/imaggif.h new file mode 100644 index 0000000000..21b58e6181 --- /dev/null +++ b/Externals/wxWidgets/include/wx/imaggif.h @@ -0,0 +1,48 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: imaggif.h +// Purpose: wxImage GIF handler +// Author: Vaclav Slavik & Guillermo Rodriguez Garcia +// RCS-ID: $Id: imaggif.h 37393 2006-02-08 21:47:09Z VZ $ +// Copyright: (c) Guillermo Rodriguez Garcia +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_IMAGGIF_H_ +#define _WX_IMAGGIF_H_ + +#include "wx/image.h" + + +//----------------------------------------------------------------------------- +// wxGIFHandler +//----------------------------------------------------------------------------- + +#if wxUSE_GIF + +class WXDLLEXPORT wxGIFHandler : public wxImageHandler +{ +public: + inline wxGIFHandler() + { + m_name = wxT("GIF file"); + m_extension = wxT("gif"); + m_type = wxBITMAP_TYPE_GIF; + m_mime = wxT("image/gif"); + } + +#if wxUSE_STREAMS + virtual bool LoadFile( wxImage *image, wxInputStream& stream, bool verbose=true, int index=-1 ); + virtual bool SaveFile( wxImage *image, wxOutputStream& stream, bool verbose=true ); +protected: + virtual bool DoCanRead( wxInputStream& stream ); +#endif + +private: + DECLARE_DYNAMIC_CLASS(wxGIFHandler) +}; +#endif + + +#endif + // _WX_IMAGGIF_H_ + diff --git a/Externals/wxWidgets/include/wx/imagiff.h b/Externals/wxWidgets/include/wx/imagiff.h new file mode 100644 index 0000000000..6b47da7352 --- /dev/null +++ b/Externals/wxWidgets/include/wx/imagiff.h @@ -0,0 +1,44 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: imagiff.h +// Purpose: wxImage handler for Amiga IFF images +// Author: Steffen Gutmann +// RCS-ID: $Id: imagiff.h 35650 2005-09-23 12:56:45Z MR $ +// Copyright: (c) Steffen Gutmann, 2002 +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_IMAGE_IFF_H_ +#define _WX_IMAGE_IFF_H_ + +#include "wx/image.h" + +//----------------------------------------------------------------------------- +// wxIFFHandler +//----------------------------------------------------------------------------- + +#if wxUSE_IMAGE && wxUSE_IFF + +class WXDLLEXPORT wxIFFHandler : public wxImageHandler +{ +public: + wxIFFHandler() + { + m_name = wxT("IFF file"); + m_extension = wxT("iff"); + m_type = wxBITMAP_TYPE_IFF; + m_mime = wxT("image/x-iff"); + } + +#if wxUSE_STREAMS + virtual bool LoadFile(wxImage *image, wxInputStream& stream, bool verbose=true, int index=-1); + virtual bool SaveFile(wxImage *image, wxOutputStream& stream, bool verbose=true); + virtual bool DoCanRead(wxInputStream& stream); +#endif + +private: + DECLARE_DYNAMIC_CLASS(wxIFFHandler) +}; + +#endif // wxUSE_IMAGE && wxUSE_IFF + +#endif // _WX_IMAGE_IFF_H_ diff --git a/Externals/wxWidgets/include/wx/imagjpeg.h b/Externals/wxWidgets/include/wx/imagjpeg.h new file mode 100644 index 0000000000..410b7cc932 --- /dev/null +++ b/Externals/wxWidgets/include/wx/imagjpeg.h @@ -0,0 +1,48 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: imagjpeg.h +// Purpose: wxImage JPEG handler +// Author: Vaclav Slavik +// RCS-ID: $Id: imagjpeg.h 37393 2006-02-08 21:47:09Z VZ $ +// Copyright: (c) Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_IMAGJPEG_H_ +#define _WX_IMAGJPEG_H_ + +#include "wx/defs.h" + +//----------------------------------------------------------------------------- +// wxJPEGHandler +//----------------------------------------------------------------------------- + +#if wxUSE_LIBJPEG + +#include "wx/image.h" + +class WXDLLEXPORT wxJPEGHandler: public wxImageHandler +{ +public: + inline wxJPEGHandler() + { + m_name = wxT("JPEG file"); + m_extension = wxT("jpg"); + m_type = wxBITMAP_TYPE_JPEG; + m_mime = wxT("image/jpeg"); + } + +#if wxUSE_STREAMS + virtual bool LoadFile( wxImage *image, wxInputStream& stream, bool verbose=true, int index=-1 ); + virtual bool SaveFile( wxImage *image, wxOutputStream& stream, bool verbose=true ); +protected: + virtual bool DoCanRead( wxInputStream& stream ); +#endif + +private: + DECLARE_DYNAMIC_CLASS(wxJPEGHandler) +}; + +#endif // wxUSE_LIBJPEG + +#endif // _WX_IMAGJPEG_H_ + diff --git a/Externals/wxWidgets/include/wx/imaglist.h b/Externals/wxWidgets/include/wx/imaglist.h new file mode 100644 index 0000000000..91cf8eac65 --- /dev/null +++ b/Externals/wxWidgets/include/wx/imaglist.h @@ -0,0 +1,55 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/imaglist.h +// Purpose: wxImageList base header +// Author: Julian Smart +// Modified by: +// Created: +// Copyright: (c) Julian Smart +// RCS-ID: $Id: imaglist.h 41288 2006-09-18 23:06:35Z VZ $ +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_IMAGLIST_H_BASE_ +#define _WX_IMAGLIST_H_BASE_ + +/* + * wxImageList is used for wxListCtrl, wxTreeCtrl. These controls refer to + * images for their items by an index into an image list. + * A wxImageList is capable of creating images with optional masks from + * a variety of sources - a single bitmap plus a colour to indicate the mask, + * two bitmaps, or an icon. + * + * Image lists can also create and draw images used for drag and drop functionality. + * This is not yet implemented in wxImageList. We need to discuss a generic API + * for doing drag and drop and see whether it ties in with the Win95 view of it. + * See below for candidate functions and an explanation of how they might be + * used. + */ + +// Flag values for Set/GetImageList +enum +{ + wxIMAGE_LIST_NORMAL, // Normal icons + wxIMAGE_LIST_SMALL, // Small icons + wxIMAGE_LIST_STATE // State icons: unimplemented (see WIN32 documentation) +}; + +// Flags for Draw +#define wxIMAGELIST_DRAW_NORMAL 0x0001 +#define wxIMAGELIST_DRAW_TRANSPARENT 0x0002 +#define wxIMAGELIST_DRAW_SELECTED 0x0004 +#define wxIMAGELIST_DRAW_FOCUSED 0x0008 + +#if defined(__WXMSW__) || defined(__WXMAC_CARBON__) + #define wxHAS_NATIVE_IMAGELIST +#endif + +#if !defined(wxHAS_NATIVE_IMAGELIST) + #include "wx/generic/imaglist.h" +#elif defined(__WXMSW__) + #include "wx/msw/imaglist.h" +#elif defined(__WXMAC_CARBON__) + #include "wx/mac/imaglist.h" +#endif + +#endif // _WX_IMAGLIST_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/imagpcx.h b/Externals/wxWidgets/include/wx/imagpcx.h new file mode 100644 index 0000000000..f56048f84f --- /dev/null +++ b/Externals/wxWidgets/include/wx/imagpcx.h @@ -0,0 +1,47 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: imagpcx.h +// Purpose: wxImage PCX handler +// Author: Guillermo Rodriguez Garcia <guille@iies.es> +// RCS-ID: $Id: imagpcx.h 37393 2006-02-08 21:47:09Z VZ $ +// Copyright: (c) 1999 Guillermo Rodriguez Garcia +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_IMAGPCX_H_ +#define _WX_IMAGPCX_H_ + +#include "wx/image.h" + + +//----------------------------------------------------------------------------- +// wxPCXHandler +//----------------------------------------------------------------------------- + +#if wxUSE_PCX +class WXDLLEXPORT wxPCXHandler : public wxImageHandler +{ +public: + inline wxPCXHandler() + { + m_name = wxT("PCX file"); + m_extension = wxT("pcx"); + m_type = wxBITMAP_TYPE_PCX; + m_mime = wxT("image/pcx"); + } + +#if wxUSE_STREAMS + virtual bool LoadFile( wxImage *image, wxInputStream& stream, bool verbose=true, int index=-1 ); + virtual bool SaveFile( wxImage *image, wxOutputStream& stream, bool verbose=true ); +protected: + virtual bool DoCanRead( wxInputStream& stream ); +#endif // wxUSE_STREAMS + +private: + DECLARE_DYNAMIC_CLASS(wxPCXHandler) +}; +#endif // wxUSE_PCX + + +#endif + // _WX_IMAGPCX_H_ + diff --git a/Externals/wxWidgets/include/wx/imagpng.h b/Externals/wxWidgets/include/wx/imagpng.h new file mode 100644 index 0000000000..daea3a26f5 --- /dev/null +++ b/Externals/wxWidgets/include/wx/imagpng.h @@ -0,0 +1,60 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: imagpng.h +// Purpose: wxImage PNG handler +// Author: Robert Roebling +// RCS-ID: $Id: imagpng.h 37393 2006-02-08 21:47:09Z VZ $ +// Copyright: (c) Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_IMAGPNG_H_ +#define _WX_IMAGPNG_H_ + +#include "wx/defs.h" + +//----------------------------------------------------------------------------- +// wxPNGHandler +//----------------------------------------------------------------------------- + +#if wxUSE_LIBPNG + +#include "wx/image.h" + +#define wxIMAGE_OPTION_PNG_FORMAT wxT("PngFormat") +#define wxIMAGE_OPTION_PNG_BITDEPTH wxT("PngBitDepth") + +enum +{ + wxPNG_TYPE_COLOUR = 0, + wxPNG_TYPE_GREY = 2, + wxPNG_TYPE_GREY_RED = 3 +}; + +class WXDLLEXPORT wxPNGHandler: public wxImageHandler +{ +public: + inline wxPNGHandler() + { + m_name = wxT("PNG file"); + m_extension = wxT("png"); + m_type = wxBITMAP_TYPE_PNG; + m_mime = wxT("image/png"); + } + +#if wxUSE_STREAMS + virtual bool LoadFile( wxImage *image, wxInputStream& stream, bool verbose=true, int index=-1 ); + virtual bool SaveFile( wxImage *image, wxOutputStream& stream, bool verbose=true ); +protected: + virtual bool DoCanRead( wxInputStream& stream ); +#endif + +private: + DECLARE_DYNAMIC_CLASS(wxPNGHandler) +}; + +#endif + // wxUSE_LIBPNG + +#endif + // _WX_IMAGPNG_H_ + diff --git a/Externals/wxWidgets/include/wx/imagpnm.h b/Externals/wxWidgets/include/wx/imagpnm.h new file mode 100644 index 0000000000..68b95efd93 --- /dev/null +++ b/Externals/wxWidgets/include/wx/imagpnm.h @@ -0,0 +1,46 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: imagpnm.h +// Purpose: wxImage PNM handler +// Author: Sylvain Bougnoux +// RCS-ID: $Id: imagpnm.h 37393 2006-02-08 21:47:09Z VZ $ +// Copyright: (c) Sylvain Bougnoux +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_IMAGPNM_H_ +#define _WX_IMAGPNM_H_ + +#include "wx/image.h" + +//----------------------------------------------------------------------------- +// wxPNMHandler +//----------------------------------------------------------------------------- + +#if wxUSE_PNM +class WXDLLEXPORT wxPNMHandler : public wxImageHandler +{ +public: + inline wxPNMHandler() + { + m_name = wxT("PNM file"); + m_extension = wxT("pnm"); + m_type = wxBITMAP_TYPE_PNM; + m_mime = wxT("image/pnm"); + } + +#if wxUSE_STREAMS + virtual bool LoadFile( wxImage *image, wxInputStream& stream, bool verbose=true, int index=-1 ); + virtual bool SaveFile( wxImage *image, wxOutputStream& stream, bool verbose=true ); +protected: + virtual bool DoCanRead( wxInputStream& stream ); +#endif + +private: + DECLARE_DYNAMIC_CLASS(wxPNMHandler) +}; +#endif + + +#endif + // _WX_IMAGPNM_H_ + diff --git a/Externals/wxWidgets/include/wx/imagtga.h b/Externals/wxWidgets/include/wx/imagtga.h new file mode 100644 index 0000000000..9b0a84187a --- /dev/null +++ b/Externals/wxWidgets/include/wx/imagtga.h @@ -0,0 +1,46 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/imagtga.h +// Purpose: wxImage TGA handler +// Author: Seth Jackson +// RCS-ID: $Id: imagtga.h 43843 2006-12-07 05:44:44Z PC $ +// Copyright: (c) 2005 Seth Jackson +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_IMAGTGA_H_ +#define _WX_IMAGTGA_H_ + +#include "wx/image.h" + +//----------------------------------------------------------------------------- +// wxTGAHandler +//----------------------------------------------------------------------------- + +#if wxUSE_TGA + +class WXDLLEXPORT wxTGAHandler : public wxImageHandler +{ +public: + wxTGAHandler() + { + m_name = wxT("TGA file"); + m_extension = wxT("tga"); + m_type = wxBITMAP_TYPE_TGA; + m_mime = wxT("image/tga"); + } + +#if wxUSE_STREAMS + virtual bool LoadFile(wxImage* image, wxInputStream& stream, + bool verbose = true, int index = -1); + virtual bool SaveFile(wxImage* image, wxOutputStream& stream, + bool verbose = true); +protected: + virtual bool DoCanRead(wxInputStream& stream); +#endif // wxUSE_STREAMS + + DECLARE_DYNAMIC_CLASS(wxTGAHandler) +}; + +#endif // wxUSE_TGA + +#endif // _WX_IMAGTGA_H_ diff --git a/Externals/wxWidgets/include/wx/imagtiff.h b/Externals/wxWidgets/include/wx/imagtiff.h new file mode 100644 index 0000000000..42ec8bf075 --- /dev/null +++ b/Externals/wxWidgets/include/wx/imagtiff.h @@ -0,0 +1,49 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: imagtiff.h +// Purpose: wxImage TIFF handler +// Author: Robert Roebling +// RCS-ID: $Id: imagtiff.h 37393 2006-02-08 21:47:09Z VZ $ +// Copyright: (c) Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_IMAGTIFF_H_ +#define _WX_IMAGTIFF_H_ + +#include "wx/defs.h" + +//----------------------------------------------------------------------------- +// wxTIFFHandler +//----------------------------------------------------------------------------- + +#if wxUSE_LIBTIFF + +#include "wx/image.h" + +// defines for wxImage::SetOption +#define wxIMAGE_OPTION_BITSPERSAMPLE wxString(_T("BitsPerSample")) +#define wxIMAGE_OPTION_SAMPLESPERPIXEL wxString(_T("SamplesPerPixel")) +#define wxIMAGE_OPTION_COMPRESSION wxString(_T("Compression")) +#define wxIMAGE_OPTION_IMAGEDESCRIPTOR wxString(_T("ImageDescriptor")) + +class WXDLLEXPORT wxTIFFHandler: public wxImageHandler +{ +public: + wxTIFFHandler(); + +#if wxUSE_STREAMS + virtual bool LoadFile( wxImage *image, wxInputStream& stream, bool verbose=true, int index=-1 ); + virtual bool SaveFile( wxImage *image, wxOutputStream& stream, bool verbose=true ); + virtual int GetImageCount( wxInputStream& stream ); +protected: + virtual bool DoCanRead( wxInputStream& stream ); +#endif + +private: + DECLARE_DYNAMIC_CLASS(wxTIFFHandler) +}; + +#endif // wxUSE_LIBTIFF + +#endif // _WX_IMAGTIFF_H_ + diff --git a/Externals/wxWidgets/include/wx/imagxpm.h b/Externals/wxWidgets/include/wx/imagxpm.h new file mode 100644 index 0000000000..4bff4894f4 --- /dev/null +++ b/Externals/wxWidgets/include/wx/imagxpm.h @@ -0,0 +1,45 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: imaggif.h +// Purpose: wxImage XPM handler +// Author: Vaclav Slavik +// RCS-ID: $Id: imagxpm.h 37393 2006-02-08 21:47:09Z VZ $ +// Copyright: (c) 2001 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_IMAGXPM_H_ +#define _WX_IMAGXPM_H_ + +#include "wx/image.h" + + +//----------------------------------------------------------------------------- +// wxXPMHandler +//----------------------------------------------------------------------------- + +class WXDLLEXPORT wxXPMHandler : public wxImageHandler +{ +public: + inline wxXPMHandler() + { + m_name = wxT("XPM file"); + m_extension = wxT("xpm"); + m_type = wxBITMAP_TYPE_XPM; + m_mime = wxT("image/xpm"); + } + +#if wxUSE_STREAMS + virtual bool LoadFile( wxImage *image, wxInputStream& stream, bool verbose=true, int index=-1 ); + virtual bool SaveFile( wxImage *image, wxOutputStream& stream, bool verbose=true ); +protected: + virtual bool DoCanRead( wxInputStream& stream ); +#endif + +private: + DECLARE_DYNAMIC_CLASS(wxXPMHandler) +}; + + +#endif + // _WX_IMAGXPM_H_ + diff --git a/Externals/wxWidgets/include/wx/init.h b/Externals/wxWidgets/include/wx/init.h new file mode 100644 index 0000000000..49e8b2300c --- /dev/null +++ b/Externals/wxWidgets/include/wx/init.h @@ -0,0 +1,95 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/init.h +// Purpose: wxWidgets initialization and finalization functions +// Author: Vadim Zeitlin +// Modified by: +// Created: 29.06.2003 +// RCS-ID: $Id: init.h 42109 2006-10-19 07:43:24Z MR $ +// Copyright: (c) 2003 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_INIT_H_ +#define _WX_INIT_H_ + +#include "wx/defs.h" +#include "wx/wxchar.h" + +// ---------------------------------------------------------------------------- +// wxEntry helper functions which allow to have more fine grained control +// ---------------------------------------------------------------------------- + +// do common initialization, return true if ok (in this case wxEntryCleanup +// must be called later), otherwise the program can't use wxWidgets at all +// +// this function also creates wxTheApp as a side effect, if IMPLEMENT_APP +// hadn't been used a dummy default application object is created +// +// note that the parameters may be modified, this is why we pass them by +// reference! +extern bool WXDLLIMPEXP_BASE wxEntryStart(int& argc, wxChar **argv); + +// free the resources allocated by the library in wxEntryStart() and shut it +// down (wxEntryStart() may be called again afterwards if necessary) +extern void WXDLLIMPEXP_BASE wxEntryCleanup(); + + +// ---------------------------------------------------------------------------- +// wxEntry: this function initializes the library, runs the main event loop +// and cleans it up +// ---------------------------------------------------------------------------- + +// note that other, platform-specific, overloads of wxEntry may exist as well +// but this one always exists under all platforms +// +// returns the program exit code +extern int WXDLLIMPEXP_BASE wxEntry(int& argc, wxChar **argv); + +// we overload wxEntry[Start]() to take "char **" pointers too +#if wxUSE_UNICODE + +extern bool WXDLLIMPEXP_BASE wxEntryStart(int& argc, char **argv); +extern int WXDLLIMPEXP_BASE wxEntry(int& argc, char **argv); + +#endif// wxUSE_UNICODE + +// ---------------------------------------------------------------------------- +// Using the library without (explicit) application object: you may avoid using +// DECLARE_APP and IMPLEMENT_APP macros and call the functions below instead at +// the program startup and termination +// ---------------------------------------------------------------------------- + +// initialize the library (may be called as many times as needed, but each +// call to wxInitialize() must be matched by wxUninitialize()) +extern bool WXDLLIMPEXP_BASE wxInitialize(int argc = 0, wxChar **argv = NULL); + +// clean up -- the library can't be used any more after the last call to +// wxUninitialize() +extern void WXDLLIMPEXP_BASE wxUninitialize(); + +// create an object of this class on stack to initialize/cleanup the library +// automatically +class WXDLLIMPEXP_BASE wxInitializer +{ +public: + // initialize the library + wxInitializer(int argc = 0, wxChar **argv = NULL) + { + m_ok = wxInitialize(argc, argv); + } + + // has the initialization been successful? (explicit test) + bool IsOk() const { return m_ok; } + + // has the initialization been successful? (implicit test) + operator bool() const { return m_ok; } + + // dtor only does clean up if we initialized the library properly + ~wxInitializer() { if ( m_ok ) wxUninitialize(); } + +private: + bool m_ok; +}; + +#endif // _WX_INIT_H_ + diff --git a/Externals/wxWidgets/include/wx/intl.h b/Externals/wxWidgets/include/wx/intl.h new file mode 100644 index 0000000000..457758d673 --- /dev/null +++ b/Externals/wxWidgets/include/wx/intl.h @@ -0,0 +1,619 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/intl.h +// Purpose: Internationalization and localisation for wxWidgets +// Author: Vadim Zeitlin +// Modified by: Michael N. Filippov <michael@idisys.iae.nsk.su> +// (2003/09/30 - plural forms support) +// Created: 29/01/98 +// RCS-ID: $Id: intl.h 45738 2007-05-01 21:10:46Z VS $ +// Copyright: (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_INTL_H_ +#define _WX_INTL_H_ + +#include "wx/defs.h" +#include "wx/string.h" + +// Make wxLayoutDirection enum available without need for wxUSE_INTL so wxWindow, wxApp +// and other classes are not distrubed by wxUSE_INTL + +enum wxLayoutDirection +{ + wxLayout_Default, + wxLayout_LeftToRight, + wxLayout_RightToLeft +}; + +#if wxUSE_INTL + +#include "wx/fontenc.h" + +// ============================================================================ +// global decls +// ============================================================================ + +// ---------------------------------------------------------------------------- +// macros +// ---------------------------------------------------------------------------- + +// gettext() style macros (notice that xgettext should be invoked with +// --keyword="_" --keyword="wxPLURAL:1,2" options +// to extract the strings from the sources) +#ifndef WXINTL_NO_GETTEXT_MACRO + #define _(s) wxGetTranslation(_T(s)) + #define wxPLURAL(sing, plur, n) wxGetTranslation(_T(sing), _T(plur), n) +#endif + +// another one which just marks the strings for extraction, but doesn't +// perform the translation (use -kwxTRANSLATE with xgettext!) +#define wxTRANSLATE(str) _T(str) + +// ---------------------------------------------------------------------------- +// forward decls +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxLocale; +class WXDLLIMPEXP_BASE wxLanguageInfoArray; +class wxMsgCatalog; + +// ============================================================================ +// locale support +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxLanguage: defines all supported languages +// ---------------------------------------------------------------------------- + +// --- --- --- generated code begins here --- --- --- + +// This enum is generated by misc/languages/genlang.py +// When making changes, please put them into misc/languages/langtabl.txt +enum wxLanguage +{ + // user's default/preffered language as got from OS: + wxLANGUAGE_DEFAULT, + // unknown language, if wxLocale::GetSystemLanguage fails: + wxLANGUAGE_UNKNOWN, + + wxLANGUAGE_ABKHAZIAN, + wxLANGUAGE_AFAR, + wxLANGUAGE_AFRIKAANS, + wxLANGUAGE_ALBANIAN, + wxLANGUAGE_AMHARIC, + wxLANGUAGE_ARABIC, + wxLANGUAGE_ARABIC_ALGERIA, + wxLANGUAGE_ARABIC_BAHRAIN, + wxLANGUAGE_ARABIC_EGYPT, + wxLANGUAGE_ARABIC_IRAQ, + wxLANGUAGE_ARABIC_JORDAN, + wxLANGUAGE_ARABIC_KUWAIT, + wxLANGUAGE_ARABIC_LEBANON, + wxLANGUAGE_ARABIC_LIBYA, + wxLANGUAGE_ARABIC_MOROCCO, + wxLANGUAGE_ARABIC_OMAN, + wxLANGUAGE_ARABIC_QATAR, + wxLANGUAGE_ARABIC_SAUDI_ARABIA, + wxLANGUAGE_ARABIC_SUDAN, + wxLANGUAGE_ARABIC_SYRIA, + wxLANGUAGE_ARABIC_TUNISIA, + wxLANGUAGE_ARABIC_UAE, + wxLANGUAGE_ARABIC_YEMEN, + wxLANGUAGE_ARMENIAN, + wxLANGUAGE_ASSAMESE, + wxLANGUAGE_AYMARA, + wxLANGUAGE_AZERI, + wxLANGUAGE_AZERI_CYRILLIC, + wxLANGUAGE_AZERI_LATIN, + wxLANGUAGE_BASHKIR, + wxLANGUAGE_BASQUE, + wxLANGUAGE_BELARUSIAN, + wxLANGUAGE_BENGALI, + wxLANGUAGE_BHUTANI, + wxLANGUAGE_BIHARI, + wxLANGUAGE_BISLAMA, + wxLANGUAGE_BRETON, + wxLANGUAGE_BULGARIAN, + wxLANGUAGE_BURMESE, + wxLANGUAGE_CAMBODIAN, + wxLANGUAGE_CATALAN, + wxLANGUAGE_CHINESE, + wxLANGUAGE_CHINESE_SIMPLIFIED, + wxLANGUAGE_CHINESE_TRADITIONAL, + wxLANGUAGE_CHINESE_HONGKONG, + wxLANGUAGE_CHINESE_MACAU, + wxLANGUAGE_CHINESE_SINGAPORE, + wxLANGUAGE_CHINESE_TAIWAN, + wxLANGUAGE_CORSICAN, + wxLANGUAGE_CROATIAN, + wxLANGUAGE_CZECH, + wxLANGUAGE_DANISH, + wxLANGUAGE_DUTCH, + wxLANGUAGE_DUTCH_BELGIAN, + wxLANGUAGE_ENGLISH, + wxLANGUAGE_ENGLISH_UK, + wxLANGUAGE_ENGLISH_US, + wxLANGUAGE_ENGLISH_AUSTRALIA, + wxLANGUAGE_ENGLISH_BELIZE, + wxLANGUAGE_ENGLISH_BOTSWANA, + wxLANGUAGE_ENGLISH_CANADA, + wxLANGUAGE_ENGLISH_CARIBBEAN, + wxLANGUAGE_ENGLISH_DENMARK, + wxLANGUAGE_ENGLISH_EIRE, + wxLANGUAGE_ENGLISH_JAMAICA, + wxLANGUAGE_ENGLISH_NEW_ZEALAND, + wxLANGUAGE_ENGLISH_PHILIPPINES, + wxLANGUAGE_ENGLISH_SOUTH_AFRICA, + wxLANGUAGE_ENGLISH_TRINIDAD, + wxLANGUAGE_ENGLISH_ZIMBABWE, + wxLANGUAGE_ESPERANTO, + wxLANGUAGE_ESTONIAN, + wxLANGUAGE_FAEROESE, + wxLANGUAGE_FARSI, + wxLANGUAGE_FIJI, + wxLANGUAGE_FINNISH, + wxLANGUAGE_FRENCH, + wxLANGUAGE_FRENCH_BELGIAN, + wxLANGUAGE_FRENCH_CANADIAN, + wxLANGUAGE_FRENCH_LUXEMBOURG, + wxLANGUAGE_FRENCH_MONACO, + wxLANGUAGE_FRENCH_SWISS, + wxLANGUAGE_FRISIAN, + wxLANGUAGE_GALICIAN, + wxLANGUAGE_GEORGIAN, + wxLANGUAGE_GERMAN, + wxLANGUAGE_GERMAN_AUSTRIAN, + wxLANGUAGE_GERMAN_BELGIUM, + wxLANGUAGE_GERMAN_LIECHTENSTEIN, + wxLANGUAGE_GERMAN_LUXEMBOURG, + wxLANGUAGE_GERMAN_SWISS, + wxLANGUAGE_GREEK, + wxLANGUAGE_GREENLANDIC, + wxLANGUAGE_GUARANI, + wxLANGUAGE_GUJARATI, + wxLANGUAGE_HAUSA, + wxLANGUAGE_HEBREW, + wxLANGUAGE_HINDI, + wxLANGUAGE_HUNGARIAN, + wxLANGUAGE_ICELANDIC, + wxLANGUAGE_INDONESIAN, + wxLANGUAGE_INTERLINGUA, + wxLANGUAGE_INTERLINGUE, + wxLANGUAGE_INUKTITUT, + wxLANGUAGE_INUPIAK, + wxLANGUAGE_IRISH, + wxLANGUAGE_ITALIAN, + wxLANGUAGE_ITALIAN_SWISS, + wxLANGUAGE_JAPANESE, + wxLANGUAGE_JAVANESE, + wxLANGUAGE_KANNADA, + wxLANGUAGE_KASHMIRI, + wxLANGUAGE_KASHMIRI_INDIA, + wxLANGUAGE_KAZAKH, + wxLANGUAGE_KERNEWEK, + wxLANGUAGE_KINYARWANDA, + wxLANGUAGE_KIRGHIZ, + wxLANGUAGE_KIRUNDI, + wxLANGUAGE_KONKANI, + wxLANGUAGE_KOREAN, + wxLANGUAGE_KURDISH, + wxLANGUAGE_LAOTHIAN, + wxLANGUAGE_LATIN, + wxLANGUAGE_LATVIAN, + wxLANGUAGE_LINGALA, + wxLANGUAGE_LITHUANIAN, + wxLANGUAGE_MACEDONIAN, + wxLANGUAGE_MALAGASY, + wxLANGUAGE_MALAY, + wxLANGUAGE_MALAYALAM, + wxLANGUAGE_MALAY_BRUNEI_DARUSSALAM, + wxLANGUAGE_MALAY_MALAYSIA, + wxLANGUAGE_MALTESE, + wxLANGUAGE_MANIPURI, + wxLANGUAGE_MAORI, + wxLANGUAGE_MARATHI, + wxLANGUAGE_MOLDAVIAN, + wxLANGUAGE_MONGOLIAN, + wxLANGUAGE_NAURU, + wxLANGUAGE_NEPALI, + wxLANGUAGE_NEPALI_INDIA, + wxLANGUAGE_NORWEGIAN_BOKMAL, + wxLANGUAGE_NORWEGIAN_NYNORSK, + wxLANGUAGE_OCCITAN, + wxLANGUAGE_ORIYA, + wxLANGUAGE_OROMO, + wxLANGUAGE_PASHTO, + wxLANGUAGE_POLISH, + wxLANGUAGE_PORTUGUESE, + wxLANGUAGE_PORTUGUESE_BRAZILIAN, + wxLANGUAGE_PUNJABI, + wxLANGUAGE_QUECHUA, + wxLANGUAGE_RHAETO_ROMANCE, + wxLANGUAGE_ROMANIAN, + wxLANGUAGE_RUSSIAN, + wxLANGUAGE_RUSSIAN_UKRAINE, + wxLANGUAGE_SAMOAN, + wxLANGUAGE_SANGHO, + wxLANGUAGE_SANSKRIT, + wxLANGUAGE_SCOTS_GAELIC, + wxLANGUAGE_SERBIAN, + wxLANGUAGE_SERBIAN_CYRILLIC, + wxLANGUAGE_SERBIAN_LATIN, + wxLANGUAGE_SERBO_CROATIAN, + wxLANGUAGE_SESOTHO, + wxLANGUAGE_SETSWANA, + wxLANGUAGE_SHONA, + wxLANGUAGE_SINDHI, + wxLANGUAGE_SINHALESE, + wxLANGUAGE_SISWATI, + wxLANGUAGE_SLOVAK, + wxLANGUAGE_SLOVENIAN, + wxLANGUAGE_SOMALI, + wxLANGUAGE_SPANISH, + wxLANGUAGE_SPANISH_ARGENTINA, + wxLANGUAGE_SPANISH_BOLIVIA, + wxLANGUAGE_SPANISH_CHILE, + wxLANGUAGE_SPANISH_COLOMBIA, + wxLANGUAGE_SPANISH_COSTA_RICA, + wxLANGUAGE_SPANISH_DOMINICAN_REPUBLIC, + wxLANGUAGE_SPANISH_ECUADOR, + wxLANGUAGE_SPANISH_EL_SALVADOR, + wxLANGUAGE_SPANISH_GUATEMALA, + wxLANGUAGE_SPANISH_HONDURAS, + wxLANGUAGE_SPANISH_MEXICAN, + wxLANGUAGE_SPANISH_MODERN, + wxLANGUAGE_SPANISH_NICARAGUA, + wxLANGUAGE_SPANISH_PANAMA, + wxLANGUAGE_SPANISH_PARAGUAY, + wxLANGUAGE_SPANISH_PERU, + wxLANGUAGE_SPANISH_PUERTO_RICO, + wxLANGUAGE_SPANISH_URUGUAY, + wxLANGUAGE_SPANISH_US, + wxLANGUAGE_SPANISH_VENEZUELA, + wxLANGUAGE_SUNDANESE, + wxLANGUAGE_SWAHILI, + wxLANGUAGE_SWEDISH, + wxLANGUAGE_SWEDISH_FINLAND, + wxLANGUAGE_TAGALOG, + wxLANGUAGE_TAJIK, + wxLANGUAGE_TAMIL, + wxLANGUAGE_TATAR, + wxLANGUAGE_TELUGU, + wxLANGUAGE_THAI, + wxLANGUAGE_TIBETAN, + wxLANGUAGE_TIGRINYA, + wxLANGUAGE_TONGA, + wxLANGUAGE_TSONGA, + wxLANGUAGE_TURKISH, + wxLANGUAGE_TURKMEN, + wxLANGUAGE_TWI, + wxLANGUAGE_UIGHUR, + wxLANGUAGE_UKRAINIAN, + wxLANGUAGE_URDU, + wxLANGUAGE_URDU_INDIA, + wxLANGUAGE_URDU_PAKISTAN, + wxLANGUAGE_UZBEK, + wxLANGUAGE_UZBEK_CYRILLIC, + wxLANGUAGE_UZBEK_LATIN, + wxLANGUAGE_VIETNAMESE, + wxLANGUAGE_VOLAPUK, + wxLANGUAGE_WELSH, + wxLANGUAGE_WOLOF, + wxLANGUAGE_XHOSA, + wxLANGUAGE_YIDDISH, + wxLANGUAGE_YORUBA, + wxLANGUAGE_ZHUANG, + wxLANGUAGE_ZULU, + + // for custom, user-defined languages: + wxLANGUAGE_USER_DEFINED +}; + +// --- --- --- generated code ends here --- --- --- + +// ---------------------------------------------------------------------------- +// wxLanguageInfo: encapsulates wxLanguage to OS native lang.desc. +// translation information +// ---------------------------------------------------------------------------- + +struct WXDLLIMPEXP_BASE wxLanguageInfo +{ + int Language; // wxLanguage id + wxString CanonicalName; // Canonical name, e.g. fr_FR +#ifdef __WIN32__ + wxUint32 WinLang, // Win32 language identifiers + WinSublang; +#endif // __WIN32__ + wxString Description; // human-readable name of the language + wxLayoutDirection LayoutDirection; +}; + +// ---------------------------------------------------------------------------- +// wxLocaleCategory: the category of locale settings +// ---------------------------------------------------------------------------- + +enum wxLocaleCategory +{ + // (any) numbers + wxLOCALE_CAT_NUMBER, + + // date/time + wxLOCALE_CAT_DATE, + + // monetary value + wxLOCALE_CAT_MONEY, + + wxLOCALE_CAT_MAX +}; + +// ---------------------------------------------------------------------------- +// wxLocaleInfo: the items understood by wxLocale::GetInfo() +// ---------------------------------------------------------------------------- + +enum wxLocaleInfo +{ + // the thounsands separator + wxLOCALE_THOUSANDS_SEP, + + // the character used as decimal point + wxLOCALE_DECIMAL_POINT + +}; + +// ---------------------------------------------------------------------------- +// wxLocale: encapsulates all language dependent settings, including current +// message catalogs, date, time and currency formats (TODO) &c +// ---------------------------------------------------------------------------- + +enum wxLocaleInitFlags +{ + wxLOCALE_LOAD_DEFAULT = 0x0001, // load wxwin.mo? + wxLOCALE_CONV_ENCODING = 0x0002 // convert encoding on the fly? +}; + +class WXDLLIMPEXP_BASE wxLocale +{ +public: + // ctor & dtor + // ----------- + + // call Init() if you use this ctor + wxLocale() { DoCommonInit(); } + + // the ctor has a side effect of changing current locale + wxLocale(const wxChar *szName, // name (for messages) + const wxChar *szShort = (const wxChar *) NULL, // dir prefix (for msg files) + const wxChar *szLocale = (const wxChar *) NULL, // locale (for setlocale) + bool bLoadDefault = true, // preload wxstd.mo? + bool bConvertEncoding = false) // convert Win<->Unix if necessary? + { + DoCommonInit(); + + Init(szName, szShort, szLocale, bLoadDefault, bConvertEncoding); + } + + wxLocale(int language, // wxLanguage id or custom language + int flags = wxLOCALE_LOAD_DEFAULT | wxLOCALE_CONV_ENCODING) + { + DoCommonInit(); + + Init(language, flags); + } + + // the same as a function (returns true on success) + bool Init(const wxChar *szName, + const wxChar *szShort = (const wxChar *) NULL, + const wxChar *szLocale = (const wxChar *) NULL, + bool bLoadDefault = true, + bool bConvertEncoding = false); + + // same as second ctor (returns true on success) + bool Init(int language = wxLANGUAGE_DEFAULT, + int flags = wxLOCALE_LOAD_DEFAULT | wxLOCALE_CONV_ENCODING); + + // restores old locale + virtual ~wxLocale(); + + // Try to get user's (or OS's) preferred language setting. + // Return wxLANGUAGE_UNKNOWN if language-guessing algorithm failed + static int GetSystemLanguage(); + + // get the encoding used by default for text on this system, returns + // wxFONTENCODING_SYSTEM if it couldn't be determined + static wxFontEncoding GetSystemEncoding(); + + // get the string describing the system encoding, return empty string if + // couldn't be determined + static wxString GetSystemEncodingName(); + + // get the values of the given locale-dependent datum: the current locale + // is used, the US default value is returned if everything else fails + static wxString GetInfo(wxLocaleInfo index, wxLocaleCategory cat); + + // return true if the locale was set successfully + bool IsOk() const { return m_pszOldLocale != NULL; } + + // returns locale name + const wxChar *GetLocale() const { return m_strLocale; } + + // return current locale wxLanguage value + int GetLanguage() const { return m_language; } + + // return locale name to be passed to setlocale() + wxString GetSysName() const; + + // return 'canonical' name, i.e. in the form of xx[_YY], where xx is + // language code according to ISO 639 and YY is country name + // as specified by ISO 3166. + wxString GetCanonicalName() const { return m_strShort; } + + // add a prefix to the catalog lookup path: the message catalog files will be + // looked up under prefix/<lang>/LC_MESSAGES, prefix/LC_MESSAGES and prefix + // (in this order). + // + // This only applies to subsequent invocations of AddCatalog()! + static void AddCatalogLookupPathPrefix(const wxString& prefix); + + // add a catalog: it's searched for in standard places (current directory + // first, system one after), but the you may prepend additional directories to + // the search path with AddCatalogLookupPathPrefix(). + // + // The loaded catalog will be used for message lookup by GetString(). + // + // Returns 'true' if it was successfully loaded + bool AddCatalog(const wxChar *szDomain); + bool AddCatalog(const wxChar *szDomain, + wxLanguage msgIdLanguage, const wxChar *msgIdCharset); + + // check if the given locale is provided by OS and C run time + static bool IsAvailable(int lang); + + // check if the given catalog is loaded + bool IsLoaded(const wxChar *szDomain) const; + + // Retrieve the language info struct for the given language + // + // Returns NULL if no info found, pointer must *not* be deleted by caller + static const wxLanguageInfo *GetLanguageInfo(int lang); + + // Returns language name in English or empty string if the language + // is not in database + static wxString GetLanguageName(int lang); + + // Find the language for the given locale string which may be either a + // canonical ISO 2 letter language code ("xx"), a language code followed by + // the country code ("xx_XX") or a Windows full language name ("Xxxxx...") + // + // Returns NULL if no info found, pointer must *not* be deleted by caller + static const wxLanguageInfo *FindLanguageInfo(const wxString& locale); + + // Add custom language to the list of known languages. + // Notes: 1) wxLanguageInfo contains platform-specific data + // 2) must be called before Init to have effect + static void AddLanguage(const wxLanguageInfo& info); + + // retrieve the translation for a string in all loaded domains unless + // the szDomain parameter is specified (and then only this domain is + // searched) + // n - additional parameter for PluralFormsParser + // + // return original string if translation is not available + // (in this case an error message is generated the first time + // a string is not found; use wxLogNull to suppress it) + // + // domains are searched in the last to first order, i.e. catalogs + // added later override those added before. + virtual const wxChar *GetString(const wxChar *szOrigString, + const wxChar *szDomain = NULL) const; + // plural form version of the same: + virtual const wxChar *GetString(const wxChar *szOrigString, + const wxChar *szOrigString2, + size_t n, + const wxChar *szDomain = NULL) const; + + // Returns the current short name for the locale + const wxString& GetName() const { return m_strShort; } + + // return the contents of .po file header + wxString GetHeaderValue( const wxChar* szHeader, + const wxChar* szDomain = NULL ) const; + + // These two methods are for internal use only. First one creates + // ms_languagesDB if it doesn't already exist, second one destroys + // it. + static void CreateLanguagesDB(); + static void DestroyLanguagesDB(); + +private: + // find catalog by name in a linked list, return NULL if !found + wxMsgCatalog *FindCatalog(const wxChar *szDomain) const; + + // copy default table of languages from global static array to + // m_langugagesInfo, called by InitLanguagesDB + static void InitLanguagesDB(); + + // initialize the member fields to default values + void DoCommonInit(); + + wxString m_strLocale, // this locale name + m_strShort; // short name for the locale + int m_language; // this locale wxLanguage value + + const wxChar *m_pszOldLocale; // previous locale from setlocale() + wxLocale *m_pOldLocale; // previous wxLocale + + wxMsgCatalog *m_pMsgCat; // pointer to linked list of catalogs + + bool m_bConvertEncoding; + + bool m_initialized; + + static wxLanguageInfoArray *ms_languagesDB; + + DECLARE_NO_COPY_CLASS(wxLocale) +}; + +// ---------------------------------------------------------------------------- +// global functions +// ---------------------------------------------------------------------------- + +// get the current locale object (note that it may be NULL!) +extern WXDLLIMPEXP_BASE wxLocale* wxGetLocale(); + +// get the translation of the string in the current locale +inline const wxChar * +wxGetTranslation(const wxChar *sz, const wxChar* domain = NULL) +{ + wxLocale *pLoc = wxGetLocale(); + if (pLoc) + return pLoc->GetString(sz, domain); + else + return sz; +} + +inline const wxChar * +wxGetTranslation(const wxChar *sz1, const wxChar *sz2, + size_t n, + const wxChar *domain = NULL) +{ + wxLocale *pLoc = wxGetLocale(); + if (pLoc) + return pLoc->GetString(sz1, sz2, n, domain); + else + return n == 1 ? sz1 : sz2; +} + +#else // !wxUSE_INTL + +// the macros should still be defined - otherwise compilation would fail + +#if !defined(WXINTL_NO_GETTEXT_MACRO) + #if !defined(_) + #define _(s) (_T(s)) + #endif + #define wxPLURAL(sing, plur, n) ((n) == 1 ? _T(sing) : _T(plur)) +#endif + +#define wxTRANSLATE(str) _T(str) + +inline const wxChar * +wxGetTranslation(const wxChar *sz, const wxChar * WXUNUSED(domain) = NULL) +{ + return sz; +} + +#endif // wxUSE_INTL/!wxUSE_INTL + +// define this one just in case it occurs somewhere (instead of preferred +// wxTRANSLATE) too +#if !defined(WXINTL_NO_GETTEXT_MACRO) + #if !defined(gettext_noop) + #define gettext_noop(str) _T(str) + #endif + #if !defined(N_) + #define N_(s) _T(s) + #endif +#endif + +#endif // _WX_INTL_H_ diff --git a/Externals/wxWidgets/include/wx/iosfwrap.h b/Externals/wxWidgets/include/wx/iosfwrap.h new file mode 100644 index 0000000000..0a68afcc26 --- /dev/null +++ b/Externals/wxWidgets/include/wx/iosfwrap.h @@ -0,0 +1,26 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/iosfwrap.h +// Purpose: includes the correct stream-related forward declarations +// Author: Jan van Dijk <jan@etpmod.phys.tue.nl> +// Modified by: +// Created: 18.12.2002 +// RCS-ID: $Id: iosfwrap.h 33555 2005-04-12 21:06:03Z ABX $ +// Copyright: wxWidgets team +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#if wxUSE_STD_IOSTREAM + +#if wxUSE_IOSTREAMH + // There is no pre-ANSI iosfwd header so we include the full declarations. +# include <iostream.h> +#else +# include <iosfwd> +#endif + +#ifdef __WXMSW__ +# include "wx/msw/winundef.h" +#endif + +#endif // wxUSE_STD_IOSTREAM + diff --git a/Externals/wxWidgets/include/wx/ioswrap.h b/Externals/wxWidgets/include/wx/ioswrap.h new file mode 100644 index 0000000000..19292af5dd --- /dev/null +++ b/Externals/wxWidgets/include/wx/ioswrap.h @@ -0,0 +1,26 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/ioswrap.h +// Purpose: includes the correct iostream headers for current compiler +// Author: Vadim Zeitlin +// Modified by: +// Created: 03.02.99 +// RCS-ID: $Id: ioswrap.h 33555 2005-04-12 21:06:03Z ABX $ +// Copyright: (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#if wxUSE_STD_IOSTREAM + +#if wxUSE_IOSTREAMH +# include <iostream.h> +#else +# include <iostream> +#endif + +#ifdef __WXMSW__ +# include "wx/msw/winundef.h" +#endif + +#endif + // wxUSE_STD_IOSTREAM + diff --git a/Externals/wxWidgets/include/wx/ipc.h b/Externals/wxWidgets/include/wx/ipc.h new file mode 100644 index 0000000000..2472fc43e7 --- /dev/null +++ b/Externals/wxWidgets/include/wx/ipc.h @@ -0,0 +1,45 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/ipc.h +// Purpose: wrapper around different wxIPC classes implementations +// Author: Vadim Zeitlin +// Modified by: +// Created: 15.04.02 +// RCS-ID: $Id: ipc.h 35698 2005-09-25 20:49:40Z MW $ +// Copyright: (c) 2002 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_IPC_H_ +#define _WX_IPC_H_ + +// Set wxUSE_DDE_FOR_IPC to 1 to use DDE for IPC under Windows. If it is set to +// 0, or if the platform is not Windows, use TCP/IP for IPC implementation + +#if !defined(wxUSE_DDE_FOR_IPC) + #ifdef __WXMSW__ + #define wxUSE_DDE_FOR_IPC 1 + #else + #define wxUSE_DDE_FOR_IPC 0 + #endif +#endif // !defined(wxUSE_DDE_FOR_IPC) + +#if !defined(__WINDOWS__) + #undef wxUSE_DDE_FOR_IPC + #define wxUSE_DDE_FOR_IPC 0 +#endif + +#if wxUSE_DDE_FOR_IPC + #define wxConnection wxDDEConnection + #define wxServer wxDDEServer + #define wxClient wxDDEClient + + #include "wx/dde.h" +#else // !wxUSE_DDE_FOR_IPC + #define wxConnection wxTCPConnection + #define wxServer wxTCPServer + #define wxClient wxTCPClient + + #include "wx/sckipc.h" +#endif // wxUSE_DDE_FOR_IPC/!wxUSE_DDE_FOR_IPC + +#endif // _WX_IPC_H_ diff --git a/Externals/wxWidgets/include/wx/ipcbase.h b/Externals/wxWidgets/include/wx/ipcbase.h new file mode 100644 index 0000000000..94f7265e6a --- /dev/null +++ b/Externals/wxWidgets/include/wx/ipcbase.h @@ -0,0 +1,163 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: ipcbase.h +// Purpose: Base classes for IPC +// Author: Julian Smart +// Modified by: +// Created: 4/1/98 +// RCS-ID: $Id: ipcbase.h 45498 2007-04-16 13:03:05Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_IPCBASEH__ +#define _WX_IPCBASEH__ + +#include "wx/defs.h" +#include "wx/object.h" +#include "wx/string.h" + +enum wxIPCFormat +{ + wxIPC_INVALID = 0, + wxIPC_TEXT = 1, /* CF_TEXT */ + wxIPC_BITMAP = 2, /* CF_BITMAP */ + wxIPC_METAFILE = 3, /* CF_METAFILEPICT */ + wxIPC_SYLK = 4, + wxIPC_DIF = 5, + wxIPC_TIFF = 6, + wxIPC_OEMTEXT = 7, /* CF_OEMTEXT */ + wxIPC_DIB = 8, /* CF_DIB */ + wxIPC_PALETTE = 9, + wxIPC_PENDATA = 10, + wxIPC_RIFF = 11, + wxIPC_WAVE = 12, + wxIPC_UNICODETEXT = 13, + wxIPC_ENHMETAFILE = 14, + wxIPC_FILENAME = 15, /* CF_HDROP */ + wxIPC_LOCALE = 16, + wxIPC_PRIVATE = 20 +}; + +class WXDLLIMPEXP_BASE wxServerBase; +class WXDLLIMPEXP_BASE wxClientBase; + +class WXDLLIMPEXP_BASE wxConnectionBase: public wxObject +{ + DECLARE_CLASS(wxConnectionBase) + +public: + wxConnectionBase(wxChar *buffer, int size); // use external buffer + wxConnectionBase(); // use internal, adaptive buffer + wxConnectionBase(const wxConnectionBase& copy); + virtual ~wxConnectionBase(void); + + void SetConnected( bool c ) { m_connected = c; } + bool GetConnected() { return m_connected; } + + // Calls that CLIENT can make + virtual bool Execute(const wxChar *data, int size = -1, wxIPCFormat format = wxIPC_TEXT ) = 0; + virtual bool Execute(const wxString& str) { return Execute(str, -1, wxIPC_TEXT); } + virtual wxChar *Request(const wxString& item, int *size = (int *) NULL, wxIPCFormat format = wxIPC_TEXT) = 0; + virtual bool Poke(const wxString& item, wxChar *data, int size = -1, wxIPCFormat format = wxIPC_TEXT) = 0; + virtual bool StartAdvise(const wxString& item) = 0; + virtual bool StopAdvise(const wxString& item) = 0; + + // Calls that SERVER can make + virtual bool Advise(const wxString& item, wxChar *data, int size = -1, wxIPCFormat format = wxIPC_TEXT) = 0; + + // Calls that both can make + virtual bool Disconnect(void) = 0; + + // Callbacks to SERVER - override at will + virtual bool OnExecute ( const wxString& WXUNUSED(topic), + wxChar *WXUNUSED(data), + int WXUNUSED(size), + wxIPCFormat WXUNUSED(format) ) + { return false; } + + virtual wxChar *OnRequest ( const wxString& WXUNUSED(topic), + const wxString& WXUNUSED(item), + int *WXUNUSED(size), + wxIPCFormat WXUNUSED(format) ) + { return (wxChar *) NULL; } + + virtual bool OnPoke ( const wxString& WXUNUSED(topic), + const wxString& WXUNUSED(item), + wxChar *WXUNUSED(data), + int WXUNUSED(size), + wxIPCFormat WXUNUSED(format) ) + { return false; } + + virtual bool OnStartAdvise ( const wxString& WXUNUSED(topic), + const wxString& WXUNUSED(item) ) + { return false; } + + virtual bool OnStopAdvise ( const wxString& WXUNUSED(topic), + const wxString& WXUNUSED(item) ) + { return false; } + + // Callbacks to CLIENT - override at will + virtual bool OnAdvise ( const wxString& WXUNUSED(topic), + const wxString& WXUNUSED(item), + wxChar *WXUNUSED(data), + int WXUNUSED(size), + wxIPCFormat WXUNUSED(format) ) + { return false; } + + // Callbacks to BOTH - override at will + // Default behaviour is to delete connection and return true + virtual bool OnDisconnect(void) = 0; + + // return a buffer at least this size, reallocating buffer if needed + // returns NULL if using an inadequate user buffer - it can't be resized + wxChar * GetBufferAtLeast( size_t bytes ); + +protected: + bool m_connected; +private: + wxChar * m_buffer; + size_t m_buffersize; + bool m_deletebufferwhendone; + + // can't use DECLARE_NO_COPY_CLASS(wxConnectionBase) because we already + // have copy ctor but still forbid the default assignment operator + wxConnectionBase& operator=(const wxConnectionBase&); +}; + + +class WXDLLIMPEXP_BASE wxServerBase: public wxObject +{ + DECLARE_CLASS(wxServerBase) + +public: + inline wxServerBase(void) {} + inline ~wxServerBase(void) {} + + // Returns false on error (e.g. port number is already in use) + virtual bool Create(const wxString& serverName) = 0; + + // Callbacks to SERVER - override at will + virtual wxConnectionBase *OnAcceptConnection(const wxString& topic) = 0; +}; + +class WXDLLIMPEXP_BASE wxClientBase: public wxObject +{ + DECLARE_CLASS(wxClientBase) + +public: + inline wxClientBase(void) {} + inline ~wxClientBase(void) {} + + virtual bool ValidHost(const wxString& host) = 0; + + // Call this to make a connection. Returns NULL if cannot. + virtual wxConnectionBase *MakeConnection(const wxString& host, + const wxString& server, + const wxString& topic) = 0; + + // Callbacks to CLIENT - override at will + virtual wxConnectionBase *OnMakeConnection(void) = 0; +}; + +#endif + // _WX_IPCBASEH__ diff --git a/Externals/wxWidgets/include/wx/isql.h b/Externals/wxWidgets/include/wx/isql.h new file mode 100644 index 0000000000..26f7824790 --- /dev/null +++ b/Externals/wxWidgets/include/wx/isql.h @@ -0,0 +1,248 @@ +/* + * isql.h + * + * $Id: isql.h 35518 2005-09-16 11:22:35Z JS $ + * + * iODBC defines + * + * The iODBC driver manager. + * + * Copyright (C) 1995 by Ke Jin <kejin@empress.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ +#ifndef _ISQL_H +#define _ISQL_H + +#if defined(WIN32) +#define SQL_API __stdcall + +#ifndef FAR +#define FAR +#endif + +#elif defined(__OS2__) +#define SQL_API _Optlink + +#ifndef FAR +#define FAR +#define EXPORT +#define CALLBACK +#endif + +#else +#define FAR +#define EXPORT +#define CALLBACK +#define SQL_API EXPORT CALLBACK + +#ifndef __EMX__ +typedef void *HWND; +#endif +#endif + +typedef void *SQLHWND; + +typedef unsigned char UCHAR; +typedef long int SDWORD; +typedef short int SWORD; +typedef unsigned long int UDWORD; +typedef unsigned short int UWORD; +typedef long SQLINTEGER; +typedef UDWORD SQLUINTEGER; + +typedef void FAR *PTR; +typedef void FAR *HENV; +typedef void FAR *HDBC; +typedef void FAR *HSTMT; + +typedef signed short RETCODE; +#define SQLRETURN RETCODE + + +#define ODBCVER 0x0250 + +#define SQL_MAX_MESSAGE_LENGTH 512 +#define SQL_MAX_DSN_LENGTH 32 + +/* + * Function return codes + */ +#define SQL_INVALID_HANDLE (-2) +#define SQL_ERROR (-1) +#define SQL_SUCCESS 0 +#define SQL_SUCCESS_WITH_INFO 1 +#define SQL_NO_DATA_FOUND 100 + +/* + * Standard SQL datatypes, using ANSI type numbering + */ +#define SQL_CHAR 1 +#define SQL_NUMERIC 2 +#define SQL_DECIMAL 3 +#define SQL_INTEGER 4 +#define SQL_SMALLINT 5 +#define SQL_FLOAT 6 +#define SQL_REAL 7 +#define SQL_DOUBLE 8 +#define SQL_VARCHAR 12 + +#define SQL_TYPE_MIN SQL_CHAR +#define SQL_TYPE_NULL 0 +#define SQL_TYPE_MAX SQL_VARCHAR + +/* + * C datatype to SQL datatype mapping + */ +#define SQL_C_CHAR SQL_CHAR +#define SQL_C_LONG SQL_INTEGER +#define SQL_C_SHORT SQL_SMALLINT +#define SQL_C_FLOAT SQL_REAL +#define SQL_C_DOUBLE SQL_DOUBLE +#define SQL_C_DEFAULT 99 + +/* + * NULL status constants. + */ +#define SQL_NO_NULLS 0 +#define SQL_NULLABLE 1 +#define SQL_NULLABLE_UNKNOWN 2 + +/* + * Special length values + */ +#define SQL_NULL_DATA (-1) +#define SQL_DATA_AT_EXEC (-2) +#define SQL_NTS (-3) + +/* + * SQLFreeStmt + */ +#define SQL_CLOSE 0 +#define SQL_DROP 1 +#define SQL_UNBIND 2 +#define SQL_RESET_PARAMS 3 + +/* + * SQLTransact + */ +#define SQL_COMMIT 0 +#define SQL_ROLLBACK 1 + +/* + * SQLColAttributes + */ +#define SQL_COLUMN_COUNT 0 +#define SQL_COLUMN_NAME 1 +#define SQL_COLUMN_TYPE 2 +#define SQL_COLUMN_LENGTH 3 +#define SQL_COLUMN_PRECISION 4 +#define SQL_COLUMN_SCALE 5 +#define SQL_COLUMN_DISPLAY_SIZE 6 +#define SQL_COLUMN_NULLABLE 7 +#define SQL_COLUMN_UNSIGNED 8 +#define SQL_COLUMN_MONEY 9 +#define SQL_COLUMN_UPDATABLE 10 +#define SQL_COLUMN_AUTO_INCREMENT 11 +#define SQL_COLUMN_CASE_SENSITIVE 12 +#define SQL_COLUMN_SEARCHABLE 13 +#define SQL_COLUMN_TYPE_NAME 14 +#define SQL_COLUMN_TABLE_NAME 15 +#define SQL_COLUMN_OWNER_NAME 16 +#define SQL_COLUMN_QUALIFIER_NAME 17 +#define SQL_COLUMN_LABEL 18 + +#define SQL_COLATT_OPT_MAX SQL_COLUMN_LABEL +#define SQL_COLATT_OPT_MIN SQL_COLUMN_COUNT +#define SQL_COLUMN_DRIVER_START 1000 + +/* + * SQLColAttributes : SQL_COLUMN_UPDATABLE + */ +#define SQL_ATTR_READONLY 0 +#define SQL_ATTR_WRITE 1 +#define SQL_ATTR_READWRITE_UNKNOWN 2 + +/* + * SQLColAttributes : SQL_COLUMN_SEARCHABLE + */ +#define SQL_UNSEARCHABLE 0 +#define SQL_LIKE_ONLY 1 +#define SQL_ALL_EXCEPT_LIKE 2 +#define SQL_SEARCHABLE 3 + +/* + * NULL Handles + */ +#define SQL_NULL_HENV 0 +#define SQL_NULL_HDBC 0 +#define SQL_NULL_HSTMT 0 + + +/* + * Function Prototypes + */ +#ifdef __cplusplus +extern "C" +{ +#endif + + RETCODE SQL_API SQLAllocConnect (HENV henv, HDBC FAR * phdbc); + RETCODE SQL_API SQLAllocEnv (HENV FAR * phenv); + RETCODE SQL_API SQLAllocStmt (HDBC hdbc, HSTMT FAR * phstmt); + RETCODE SQL_API SQLBindCol (HSTMT hstmt, UWORD icol, SWORD fCType, + PTR rgbValue, SDWORD cbValueMax, SDWORD FAR * pcbValue); + RETCODE SQL_API SQLCancel (HSTMT hstmt); + RETCODE SQL_API SQLColAttributes (HSTMT hstmt, UWORD icol, UWORD fDescType, + PTR rgbDesc, SWORD cbDescMax, SWORD FAR * pcbDesc, SDWORD FAR * pfDesc); + RETCODE SQL_API SQLConnect (HDBC hdbc, UCHAR FAR * szDSN, SWORD cbDSN, + UCHAR FAR * szUID, SWORD cbUID, UCHAR FAR * szAuthStr, SWORD cbAuthStr); + RETCODE SQL_API SQLDescribeCol (HSTMT hstmt, UWORD icol, + UCHAR FAR * szColName, SWORD cbColNameMax, SWORD FAR * pcbColName, + SWORD FAR * pfSqlType, UDWORD FAR * pcbColDef, SWORD FAR * pibScale, + SWORD FAR * pfNullable); + RETCODE SQL_API SQLDisconnect (HDBC hdbc); + RETCODE SQL_API SQLError (HENV henv, HDBC hdbc, HSTMT hstmt, + UCHAR FAR * szSqlState, SDWORD FAR * pfNativeError, UCHAR FAR * szErrorMsg, + SWORD cbErrorMsgMax, SWORD FAR * pcbErrorMsg); + RETCODE SQL_API SQLExecDirect (HSTMT hstmt, UCHAR FAR * szSqlStr, + SDWORD cbSqlStr); + RETCODE SQL_API SQLExecute (HSTMT hstmt); + RETCODE SQL_API SQLFetch (HSTMT hstmt); + RETCODE SQL_API SQLFreeConnect (HDBC hdbc); + RETCODE SQL_API SQLFreeEnv (HENV henv); + RETCODE SQL_API SQLFreeStmt (HSTMT hstmt, UWORD fOption); + RETCODE SQL_API SQLGetCursorName (HSTMT hstmt, UCHAR FAR * szCursor, + SWORD cbCursorMax, SWORD FAR * pcbCursor); + RETCODE SQL_API SQLNumResultCols (HSTMT hstmt, SWORD FAR * pccol); + RETCODE SQL_API SQLPrepare (HSTMT hstmt, UCHAR FAR * szSqlStr, + SDWORD cbSqlStr); + RETCODE SQL_API SQLRowCount (HSTMT hstmt, SDWORD FAR * pcrow); + RETCODE SQL_API SQLSetCursorName (HSTMT hstmt, UCHAR FAR * szCursor, + SWORD cbCursor); + RETCODE SQL_API SQLTransact (HENV henv, HDBC hdbc, UWORD fType); + +/* + * Deprecated ODBC 1.0 function - Use SQLBindParameter + */ + RETCODE SQL_API SQLSetParam (HSTMT hstmt, UWORD ipar, SWORD fCType, + SWORD fSqlType, UDWORD cbColDef, SWORD ibScale, PTR rgbValue, + SDWORD FAR * pcbValue); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Externals/wxWidgets/include/wx/isqlext.h b/Externals/wxWidgets/include/wx/isqlext.h new file mode 100644 index 0000000000..56dfbddbb0 --- /dev/null +++ b/Externals/wxWidgets/include/wx/isqlext.h @@ -0,0 +1,1178 @@ +/* + * + * isqlext.h + * + * $Id: isqlext.h 30070 2004-10-22 19:11:07Z KH $ + * + * iODBC defines (ext) + * + * The iODBC driver manager. + * + * Copyright (C) 1995 by Ke Jin <kejin@empress.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ +#ifndef _ISQLEXT_H +#define _ISQLEXT_H + +#include "wx/isql.h" + +/* + * Generic constants + */ +#define SQL_MAX_OPTION_STRING_LENGTH 256 + +/* + * Additional return codes + */ +#define SQL_STILL_EXECUTING 2 +#define SQL_NEED_DATA 99 + +/* + * SQL extended datatypes + */ +#define SQL_DATE 9 +#define SQL_TIME 10 +#define SQL_TIMESTAMP 11 +#define SQL_LONGVARCHAR (-1) +#define SQL_BINARY (-2) +#define SQL_VARBINARY (-3) +#define SQL_LONGVARBINARY (-4) +#define SQL_BIGINT (-5) +#define SQL_TINYINT (-6) +#define SQL_BIT (-7) + +#define SQL_INTERVAL_YEAR (-80) +#define SQL_INTERVAL_MONTH (-81) +#define SQL_INTERVAL_YEAR_TO_MONTH (-82) +#define SQL_INTERVAL_DAY (-83) +#define SQL_INTERVAL_HOUR (-84) +#define SQL_INTERVAL_MINUTE (-85) +#define SQL_INTERVAL_SECOND (-86) +#define SQL_INTERVAL_DAY_TO_HOUR (-87) +#define SQL_INTERVAL_DAY_TO_MINUTE (-88) +#define SQL_INTERVAL_DAY_TO_SECOND (-89) +#define SQL_INTERVAL_HOUR_TO_MINUTE (-90) +#define SQL_INTERVAL_HOUR_TO_SECOND (-91) +#define SQL_INTERVAL_MINUTE_TO_SECOND (-92) +#define SQL_UNICODE (-95) + +#define SQL_TYPE_DRIVER_START SQL_INTERVAL_YEAR +#define SQL_TYPE_DRIVER_END SQL_UNICODE + +#define SQL_SIGNED_OFFSET (-20) +#define SQL_UNSIGNED_OFFSET (-22) + +/* + * C datatype to SQL datatype mapping + */ +#define SQL_C_DATE SQL_DATE +#define SQL_C_TIME SQL_TIME +#define SQL_C_TIMESTAMP SQL_TIMESTAMP +#define SQL_C_BINARY SQL_BINARY +#define SQL_C_BIT SQL_BIT +#define SQL_C_TINYINT SQL_TINYINT +#define SQL_C_SLONG SQL_C_LONG+SQL_SIGNED_OFFSET +#define SQL_C_SSHORT SQL_C_SHORT+SQL_SIGNED_OFFSET +#define SQL_C_STINYINT SQL_TINYINT+SQL_SIGNED_OFFSET +#define SQL_C_ULONG SQL_C_LONG+SQL_UNSIGNED_OFFSET +#define SQL_C_USHORT SQL_C_SHORT+SQL_UNSIGNED_OFFSET +#define SQL_C_UTINYINT SQL_TINYINT+SQL_UNSIGNED_OFFSET +#define SQL_C_BOOKMARK SQL_C_ULONG + +/* + * Extended data types override sql.h defined + */ +#undef SQL_TYPE_MIN +#define SQL_TYPE_MIN SQL_BIT +#define SQL_ALL_TYPES 0 + +/* + * SQL portable types for C - DATE, TIME, TIMESTAMP + */ +typedef struct _DATE_STRUCT + { + SWORD year; + UWORD month; + UWORD day; + } +DATE_STRUCT; + +typedef struct _TIME_STRUCT + { + UWORD hour; + UWORD minute; + UWORD second; + } +TIME_STRUCT; + +typedef struct _TIMESTAMP_STRUCT + { + SWORD year; + UWORD month; + UWORD day; + UWORD hour; + UWORD minute; + UWORD second; + UDWORD fraction; + } +TIMESTAMP_STRUCT; + +typedef unsigned long int BOOKMARK; + +/* + * ---------------------------------------------------------------------- + * Level 1 Functions + * ---------------------------------------------------------------------- + */ + +/* + * SQLDriverConnect + */ +#define SQL_DRIVER_NOPROMPT 0 +#define SQL_DRIVER_COMPLETE 1 +#define SQL_DRIVER_PROMPT 2 +#define SQL_DRIVER_COMPLETE_REQUIRED 3 + +/* + * SQLGetData + */ +#define SQL_NO_TOTAL (-4) + +/* + * SQLBindParameter + */ +#define SQL_DEFAULT_PARAM (-5) +#define SQL_IGNORE (-6) +#define SQL_LEN_DATA_AT_EXEC_OFFSET (-100) +#define SQL_LEN_DATA_AT_EXEC(length) (-length+SQL_LEN_DATA_AT_EXEC_OFFSET) + +/* + * SQLGetFunctions + */ +#define SQL_API_SQLALLOCCONNECT 1 /* Core Functions */ +#define SQL_API_SQLALLOCENV 2 +#define SQL_API_SQLALLOCSTMT 3 +#define SQL_API_SQLBINDCOL 4 +#define SQL_API_SQLCANCEL 5 +#define SQL_API_SQLCOLATTRIBUTES 6 +#define SQL_API_SQLCONNECT 7 +#define SQL_API_SQLDESCRIBECOL 8 +#define SQL_API_SQLDISCONNECT 9 +#define SQL_API_SQLERROR 10 +#define SQL_API_SQLEXECDIRECT 11 +#define SQL_API_SQLEXECUTE 12 +#define SQL_API_SQLFETCH 13 +#define SQL_API_SQLFREECONNECT 14 +#define SQL_API_SQLFREEENV 15 +#define SQL_API_SQLFREESTMT 16 +#define SQL_API_SQLGETCURSORNAME 17 +#define SQL_API_SQLNUMRESULTCOLS 18 +#define SQL_API_SQLPREPARE 19 +#define SQL_API_SQLROWCOUNT 20 +#define SQL_API_SQLSETCURSORNAME 21 +#define SQL_API_SQLSETPARAM 22 +#define SQL_API_SQLTRANSACT 23 + +#define SQL_NUM_FUNCTIONS 23 + +#define SQL_EXT_API_START 40 + +#define SQL_API_SQLCOLUMNS 40 /* Level 1 Functions */ +#define SQL_API_SQLDRIVERCONNECT 41 +#define SQL_API_SQLGETCONNECTOPTION 42 +#define SQL_API_SQLGETDATA 43 +#define SQL_API_SQLGETFUNCTIONS 44 +#define SQL_API_SQLGETINFO 45 +#define SQL_API_SQLGETSTMTOPTION 46 +#define SQL_API_SQLGETTYPEINFO 47 +#define SQL_API_SQLPARAMDATA 48 +#define SQL_API_SQLPUTDATA 49 +#define SQL_API_SQLSETCONNECTOPTION 50 +#define SQL_API_SQLSETSTMTOPTION 51 +#define SQL_API_SQLSPECIALCOLUMNS 52 +#define SQL_API_SQLSTATISTICS 53 +#define SQL_API_SQLTABLES 54 + +#define SQL_API_SQLBROWSECONNECT 55 /* Level 2 Functions */ +#define SQL_API_SQLCOLUMNPRIVILEGES 56 +#define SQL_API_SQLDATASOURCES 57 +#define SQL_API_SQLDESCRIBEPARAM 58 +#define SQL_API_SQLEXTENDEDFETCH 59 +#define SQL_API_SQLFOREIGNKEYS 60 +#define SQL_API_SQLMORERESULTS 61 +#define SQL_API_SQLNATIVESQL 62 +#define SQL_API_SQLNUMPARAMS 63 +#define SQL_API_SQLPARAMOPTIONS 64 +#define SQL_API_SQLPRIMARYKEYS 65 +#define SQL_API_SQLPROCEDURECOLUMNS 66 +#define SQL_API_SQLPROCEDURES 67 +#define SQL_API_SQLSETPOS 68 +#define SQL_API_SQLSETSCROLLOPTIONS 69 +#define SQL_API_SQLTABLEPRIVILEGES 70 + +#define SQL_API_SQLDRIVERS 71 +#define SQL_API_SQLBINDPARAMETER 72 +#define SQL_EXT_API_LAST SQL_API_SQLBINDPARAMETER + +#define SQL_API_ALL_FUNCTIONS 0 + +#define SQL_NUM_EXTENSIONS (SQL_EXT_API_LAST-SQL_EXT_API_START+1) + +/* + * SQLGetInfo + */ +#define SQL_INFO_FIRST 0 +#define SQL_ACTIVE_CONNECTIONS 0 +#define SQL_ACTIVE_STATEMENTS 1 +#define SQL_DATA_SOURCE_NAME 2 +#define SQL_DRIVER_HDBC 3 +#define SQL_DRIVER_HENV 4 +#define SQL_DRIVER_HSTMT 5 +#define SQL_DRIVER_NAME 6 +#define SQL_DRIVER_VER 7 +#define SQL_FETCH_DIRECTION 8 +#define SQL_ODBC_API_CONFORMANCE 9 +#define SQL_ODBC_VER 10 +#define SQL_ROW_UPDATES 11 +#define SQL_ODBC_SAG_CLI_CONFORMANCE 12 +#define SQL_SERVER_NAME 13 +#define SQL_SEARCH_PATTERN_ESCAPE 14 +#define SQL_ODBC_SQL_CONFORMANCE 15 +#define SQL_DBMS_NAME 17 +#define SQL_DBMS_VER 18 +#define SQL_ACCESSIBLE_TABLES 19 +#define SQL_ACCESSIBLE_PROCEDURES 20 +#define SQL_PROCEDURES 21 +#define SQL_CONCAT_NULL_BEHAVIOR 22 +#define SQL_CURSOR_COMMIT_BEHAVIOR 23 +#define SQL_CURSOR_ROLLBACK_BEHAVIOR 24 +#define SQL_DATA_SOURCE_READ_ONLY 25 +#define SQL_DEFAULT_TXN_ISOLATION 26 +#define SQL_EXPRESSIONS_IN_ORDERBY 27 +#define SQL_IDENTIFIER_CASE 28 +#define SQL_IDENTIFIER_QUOTE_CHAR 29 +#define SQL_MAX_COLUMN_NAME_LEN 30 +#define SQL_MAX_CURSOR_NAME_LEN 31 +#define SQL_MAX_OWNER_NAME_LEN 32 +#define SQL_MAX_PROCEDURE_NAME_LEN 33 +#define SQL_MAX_QUALIFIER_NAME_LEN 34 +#define SQL_MAX_TABLE_NAME_LEN 35 +#define SQL_MULT_RESULT_SETS 36 +#define SQL_MULTIPLE_ACTIVE_TXN 37 +#define SQL_OUTER_JOINS 38 +#define SQL_OWNER_TERM 39 +#define SQL_PROCEDURE_TERM 40 +#define SQL_QUALIFIER_NAME_SEPARATOR 41 +#define SQL_QUALIFIER_TERM 42 +#define SQL_SCROLL_CONCURRENCY 43 +#define SQL_SCROLL_OPTIONS 44 +#define SQL_TABLE_TERM 45 +#define SQL_TXN_CAPABLE 46 +#define SQL_USER_NAME 47 +#define SQL_CONVERT_FUNCTIONS 48 +#define SQL_NUMERIC_FUNCTIONS 49 +#define SQL_STRING_FUNCTIONS 50 +#define SQL_SYSTEM_FUNCTIONS 51 +#define SQL_TIMEDATE_FUNCTIONS 52 +#define SQL_CONVERT_BIGINT 53 +#define SQL_CONVERT_BINARY 54 +#define SQL_CONVERT_BIT 55 +#define SQL_CONVERT_CHAR 56 +#define SQL_CONVERT_DATE 57 +#define SQL_CONVERT_DECIMAL 58 +#define SQL_CONVERT_DOUBLE 59 +#define SQL_CONVERT_FLOAT 60 +#define SQL_CONVERT_INTEGER 61 +#define SQL_CONVERT_LONGVARCHAR 62 +#define SQL_CONVERT_NUMERIC 63 +#define SQL_CONVERT_REAL 64 +#define SQL_CONVERT_SMALLINT 65 +#define SQL_CONVERT_TIME 66 +#define SQL_CONVERT_TIMESTAMP 67 +#define SQL_CONVERT_TINYINT 68 +#define SQL_CONVERT_VARBINARY 69 +#define SQL_CONVERT_VARCHAR 70 +#define SQL_CONVERT_LONGVARBINARY 71 +#define SQL_TXN_ISOLATION_OPTION 72 +#define SQL_ODBC_SQL_OPT_IEF 73 + +/* + * ODBC SDK 1.0 Additions + */ +#define SQL_CORRELATION_NAME 74 +#define SQL_NON_NULLABLE_COLUMNS 75 + +/* + * ODBC SDK 2.0 Additions + */ +#define SQL_DRIVER_HLIB 76 +#define SQL_DRIVER_ODBC_VER 77 +#define SQL_LOCK_TYPES 78 +#define SQL_POS_OPERATIONS 79 +#define SQL_POSITIONED_STATEMENTS 80 +#define SQL_GETDATA_EXTENSIONS 81 +#define SQL_BOOKMARK_PERSISTENCE 82 +#define SQL_STATIC_SENSITIVITY 83 +#define SQL_FILE_USAGE 84 +#define SQL_NULL_COLLATION 85 +#define SQL_ALTER_TABLE 86 +#define SQL_COLUMN_ALIAS 87 +#define SQL_GROUP_BY 88 +#define SQL_KEYWORDS 89 +#define SQL_ORDER_BY_COLUMNS_IN_SELECT 90 +#define SQL_OWNER_USAGE 91 +#define SQL_QUALIFIER_USAGE 92 +#define SQL_QUOTED_IDENTIFIER_CASE 93 +#define SQL_SPECIAL_CHARACTERS 94 +#define SQL_SUBQUERIES 95 +#define SQL_UNION 96 +#define SQL_MAX_COLUMNS_IN_GROUP_BY 97 +#define SQL_MAX_COLUMNS_IN_INDEX 98 +#define SQL_MAX_COLUMNS_IN_ORDER_BY 99 +#define SQL_MAX_COLUMNS_IN_SELECT 100 +#define SQL_MAX_COLUMNS_IN_TABLE 101 +#define SQL_MAX_INDEX_SIZE 102 +#define SQL_MAX_ROW_SIZE_INCLUDES_LONG 103 +#define SQL_MAX_ROW_SIZE 104 +#define SQL_MAX_STATEMENT_LEN 105 +#define SQL_MAX_TABLES_IN_SELECT 106 +#define SQL_MAX_USER_NAME_LEN 107 +#define SQL_MAX_CHAR_LITERAL_LEN 108 +#define SQL_TIMEDATE_ADD_INTERVALS 109 +#define SQL_TIMEDATE_DIFF_INTERVALS 110 +#define SQL_NEED_LONG_DATA_LEN 111 +#define SQL_MAX_BINARY_LITERAL_LEN 112 +#define SQL_LIKE_ESCAPE_CLAUSE 113 +#define SQL_QUALIFIER_LOCATION 114 + +/* + * ODBC SDK 2.01 Additions + */ +#define SQL_OJ_CAPABILITIES 65003 /* Temp value until ODBC 3.0 */ + +#define SQL_INFO_LAST SQL_QUALIFIER_LOCATION +#define SQL_INFO_DRIVER_START 1000 + + +/* + * SQL_CONVERT_* bitmask values + */ +#define SQL_CVT_CHAR 0x00000001L +#define SQL_CVT_NUMERIC 0x00000002L +#define SQL_CVT_DECIMAL 0x00000004L +#define SQL_CVT_INTEGER 0x00000008L +#define SQL_CVT_SMALLINT 0x00000010L +#define SQL_CVT_FLOAT 0x00000020L +#define SQL_CVT_REAL 0x00000040L +#define SQL_CVT_DOUBLE 0x00000080L +#define SQL_CVT_VARCHAR 0x00000100L +#define SQL_CVT_LONGVARCHAR 0x00000200L +#define SQL_CVT_BINARY 0x00000400L +#define SQL_CVT_VARBINARY 0x00000800L +#define SQL_CVT_BIT 0x00001000L +#define SQL_CVT_TINYINT 0x00002000L +#define SQL_CVT_BIGINT 0x00004000L +#define SQL_CVT_DATE 0x00008000L +#define SQL_CVT_TIME 0x00010000L +#define SQL_CVT_TIMESTAMP 0x00020000L +#define SQL_CVT_LONGVARBINARY 0x00040000L + +/* + * SQL_CONVERT_FUNCTIONS + */ +#define SQL_FN_CVT_CONVERT 0x00000001L + +/* + * SQL_STRING_FUNCTIONS + */ +#define SQL_FN_STR_CONCAT 0x00000001L +#define SQL_FN_STR_INSERT 0x00000002L +#define SQL_FN_STR_LEFT 0x00000004L +#define SQL_FN_STR_LTRIM 0x00000008L +#define SQL_FN_STR_LENGTH 0x00000010L +#define SQL_FN_STR_LOCATE 0x00000020L +#define SQL_FN_STR_LCASE 0x00000040L +#define SQL_FN_STR_REPEAT 0x00000080L +#define SQL_FN_STR_REPLACE 0x00000100L +#define SQL_FN_STR_RIGHT 0x00000200L +#define SQL_FN_STR_RTRIM 0x00000400L +#define SQL_FN_STR_SUBSTRING 0x00000800L +#define SQL_FN_STR_UCASE 0x00001000L +#define SQL_FN_STR_ASCII 0x00002000L +#define SQL_FN_STR_CHAR 0x00004000L +#define SQL_FN_STR_DIFFERENCE 0x00008000L +#define SQL_FN_STR_LOCATE_2 0x00010000L +#define SQL_FN_STR_SOUNDEX 0x00020000L +#define SQL_FN_STR_SPACE 0x00040000L + +/* + * SQL_NUMERIC_FUNCTIONS + */ +#define SQL_FN_NUM_ABS 0x00000001L +#define SQL_FN_NUM_ACOS 0x00000002L +#define SQL_FN_NUM_ASIN 0x00000004L +#define SQL_FN_NUM_ATAN 0x00000008L +#define SQL_FN_NUM_ATAN2 0x00000010L +#define SQL_FN_NUM_CEILING 0x00000020L +#define SQL_FN_NUM_COS 0x00000040L +#define SQL_FN_NUM_COT 0x00000080L +#define SQL_FN_NUM_EXP 0x00000100L +#define SQL_FN_NUM_FLOOR 0x00000200L +#define SQL_FN_NUM_LOG 0x00000400L +#define SQL_FN_NUM_MOD 0x00000800L +#define SQL_FN_NUM_SIGN 0x00001000L +#define SQL_FN_NUM_SIN 0x00002000L +#define SQL_FN_NUM_SQRT 0x00004000L +#define SQL_FN_NUM_TAN 0x00008000L +#define SQL_FN_NUM_PI 0x00010000L +#define SQL_FN_NUM_RAND 0x00020000L +#define SQL_FN_NUM_DEGREES 0x00040000L +#define SQL_FN_NUM_LOG10 0x00080000L +#define SQL_FN_NUM_POWER 0x00100000L +#define SQL_FN_NUM_RADIANS 0x00200000L +#define SQL_FN_NUM_ROUND 0x00400000L +#define SQL_FN_NUM_TRUNCATE 0x00800000L + +/* + * SQL_TIMEDATE_FUNCTIONS + */ +#define SQL_FN_TD_NOW 0x00000001L +#define SQL_FN_TD_CURDATE 0x00000002L +#define SQL_FN_TD_DAYOFMONTH 0x00000004L +#define SQL_FN_TD_DAYOFWEEK 0x00000008L +#define SQL_FN_TD_DAYOFYEAR 0x00000010L +#define SQL_FN_TD_MONTH 0x00000020L +#define SQL_FN_TD_QUARTER 0x00000040L +#define SQL_FN_TD_WEEK 0x00000080L +#define SQL_FN_TD_YEAR 0x00000100L +#define SQL_FN_TD_CURTIME 0x00000200L +#define SQL_FN_TD_HOUR 0x00000400L +#define SQL_FN_TD_MINUTE 0x00000800L +#define SQL_FN_TD_SECOND 0x00001000L +#define SQL_FN_TD_TIMESTAMPADD 0x00002000L +#define SQL_FN_TD_TIMESTAMPDIFF 0x00004000L +#define SQL_FN_TD_DAYNAME 0x00008000L +#define SQL_FN_TD_MONTHNAME 0x00010000L + +/* + * SQL_SYSTEM_FUNCTIONS + */ +#define SQL_FN_SYS_USERNAME 0x00000001L +#define SQL_FN_SYS_DBNAME 0x00000002L +#define SQL_FN_SYS_IFNULL 0x00000004L + +/* + * SQL_TIMEDATE_ADD_INTERVALS + * SQL_TIMEDATE_DIFF_INTERVALS + */ +#define SQL_FN_TSI_FRAC_SECOND 0x00000001L +#define SQL_FN_TSI_SECOND 0x00000002L +#define SQL_FN_TSI_MINUTE 0x00000004L +#define SQL_FN_TSI_HOUR 0x00000008L +#define SQL_FN_TSI_DAY 0x00000010L +#define SQL_FN_TSI_WEEK 0x00000020L +#define SQL_FN_TSI_MONTH 0x00000040L +#define SQL_FN_TSI_QUARTER 0x00000080L +#define SQL_FN_TSI_YEAR 0x00000100L + +/* + * SQL_ODBC_API_CONFORMANCE + */ +#define SQL_OAC_NONE 0x0000 +#define SQL_OAC_LEVEL1 0x0001 +#define SQL_OAC_LEVEL2 0x0002 + +/* + * SQL_ODBC_SAG_CLI_CONFORMANCE + */ +#define SQL_OSCC_NOT_COMPLIANT 0x0000 +#define SQL_OSCC_COMPLIANT 0x0001 + +/* + * SQL_ODBC_SQL_CONFORMANCE + */ +#define SQL_OSC_MINIMUM 0x0000 +#define SQL_OSC_CORE 0x0001 +#define SQL_OSC_EXTENDED 0x0002 + +/* + * SQL_CONCAT_NULL_BEHAVIOR + */ +#define SQL_CB_NULL 0x0000 +#define SQL_CB_NON_NULL 0x0001 + +/* + * SQL_CURSOR_COMMIT_BEHAVIOR + * SQL_CURSOR_ROLLBACK_BEHAVIOR + */ +#define SQL_CB_DELETE 0x0000 +#define SQL_CB_CLOSE 0x0001 +#define SQL_CB_PRESERVE 0x0002 + +/* + * SQL_IDENTIFIER_CASE + */ +#define SQL_IC_UPPER 0x0001 +#define SQL_IC_LOWER 0x0002 +#define SQL_IC_SENSITIVE 0x0003 +#define SQL_IC_MIXED 0x0004 + +/* + * SQL_TXN_CAPABLE + */ +#define SQL_TC_NONE 0x0000 +#define SQL_TC_DML 0x0001 +#define SQL_TC_ALL 0x0002 +#define SQL_TC_DDL_COMMIT 0x0003 +#define SQL_TC_DDL_IGNORE 0x0004 + +/* + * SQL_SCROLL_OPTIONS + */ +#define SQL_SO_FORWARD_ONLY 0x00000001L +#define SQL_SO_KEYSET_DRIVEN 0x00000002L +#define SQL_SO_DYNAMIC 0x00000004L +#define SQL_SO_MIXED 0x00000008L +#define SQL_SO_STATIC 0x00000010L + +/* + * SQL_SCROLL_CONCURRENCY + */ +#define SQL_SCCO_READ_ONLY 0x00000001L +#define SQL_SCCO_LOCK 0x00000002L +#define SQL_SCCO_OPT_ROWVER 0x00000004L +#define SQL_SCCO_OPT_VALUES 0x00000008L + +/* + * SQL_FETCH_DIRECTION + */ +#define SQL_FD_FETCH_NEXT 0x00000001L +#define SQL_FD_FETCH_FIRST 0x00000002L +#define SQL_FD_FETCH_LAST 0x00000004L +#define SQL_FD_FETCH_PRIOR 0x00000008L +#define SQL_FD_FETCH_ABSOLUTE 0x00000010L +#define SQL_FD_FETCH_RELATIVE 0x00000020L +#define SQL_FD_FETCH_RESUME 0x00000040L +#define SQL_FD_FETCH_BOOKMARK 0x00000080L + +/* + * SQL_TXN_ISOLATION_OPTION + */ +#define SQL_TXN_READ_UNCOMMITTED 0x00000001L +#define SQL_TXN_READ_COMMITTED 0x00000002L +#define SQL_TXN_REPEATABLE_READ 0x00000004L +#define SQL_TXN_SERIALIZABLE 0x00000008L +#define SQL_TXN_VERSIONING 0x00000010L + +/* + * SQL_CORRELATION_NAME + */ +#define SQL_CN_NONE 0x0000 +#define SQL_CN_DIFFERENT 0x0001 +#define SQL_CN_ANY 0x0002 + +/* + * SQL_NON_NULLABLE_COLUMNS + */ +#define SQL_NNC_NULL 0x0000 +#define SQL_NNC_NON_NULL 0x0001 + +/* + * SQL_NULL_COLLATION + */ +#define SQL_NC_HIGH 0x0000 +#define SQL_NC_LOW 0x0001 +#define SQL_NC_START 0x0002 +#define SQL_NC_END 0x0004 + +/* + * SQL_FILE_USAGE + */ +#define SQL_FILE_NOT_SUPPORTED 0x0000 +#define SQL_FILE_TABLE 0x0001 +#define SQL_FILE_QUALIFIER 0x0002 + +/* + * SQL_GETDATA_EXTENSIONS + */ +#define SQL_GD_ANY_COLUMN 0x00000001L +#define SQL_GD_ANY_ORDER 0x00000002L +#define SQL_GD_BLOCK 0x00000004L +#define SQL_GD_BOUND 0x00000008L + +/* + * SQL_ALTER_TABLE + */ +#define SQL_AT_ADD_COLUMN 0x00000001L +#define SQL_AT_DROP_COLUMN 0x00000002L + +/* + * SQL_POSITIONED_STATEMENTS + */ +#define SQL_PS_POSITIONED_DELETE 0x00000001L +#define SQL_PS_POSITIONED_UPDATE 0x00000002L +#define SQL_PS_SELECT_FOR_UPDATE 0x00000004L + +/* + * SQL_GROUP_BY + */ +#define SQL_GB_NOT_SUPPORTED 0x0000 +#define SQL_GB_GROUP_BY_EQUALS_SELECT 0x0001 +#define SQL_GB_GROUP_BY_CONTAINS_SELECT 0x0002 +#define SQL_GB_NO_RELATION 0x0003 + +/* + * SQL_OWNER_USAGE + */ +#define SQL_OU_DML_STATEMENTS 0x00000001L +#define SQL_OU_PROCEDURE_INVOCATION 0x00000002L +#define SQL_OU_TABLE_DEFINITION 0x00000004L +#define SQL_OU_INDEX_DEFINITION 0x00000008L +#define SQL_OU_PRIVILEGE_DEFINITION 0x00000010L + +/* + * SQL_QUALIFIER_USAGE + */ +#define SQL_QU_DML_STATEMENTS 0x00000001L +#define SQL_QU_PROCEDURE_INVOCATION 0x00000002L +#define SQL_QU_TABLE_DEFINITION 0x00000004L +#define SQL_QU_INDEX_DEFINITION 0x00000008L +#define SQL_QU_PRIVILEGE_DEFINITION 0x00000010L + +/* + * SQL_SUBQUERIES + */ +#define SQL_SQ_COMPARISON 0x00000001L +#define SQL_SQ_EXISTS 0x00000002L +#define SQL_SQ_IN 0x00000004L +#define SQL_SQ_QUANTIFIED 0x00000008L +#define SQL_SQ_CORRELATED_SUBQUERIES 0x00000010L + +/* + * SQL_UNION + */ +#define SQL_U_UNION 0x00000001L +#define SQL_U_UNION_ALL 0x00000002L + +/* + * SQL_BOOKMARK_PERSISTENCE + */ +#define SQL_BP_CLOSE 0x00000001L +#define SQL_BP_DELETE 0x00000002L +#define SQL_BP_DROP 0x00000004L +#define SQL_BP_TRANSACTION 0x00000008L +#define SQL_BP_UPDATE 0x00000010L +#define SQL_BP_OTHER_HSTMT 0x00000020L +#define SQL_BP_SCROLL 0x00000040L + +/* + * SQL_STATIC_SENSITIVITY + */ +#define SQL_SS_ADDITIONS 0x00000001L +#define SQL_SS_DELETIONS 0x00000002L +#define SQL_SS_UPDATES 0x00000004L + +/* + * SQL_LOCK_TYPES + */ +#define SQL_LCK_NO_CHANGE 0x00000001L +#define SQL_LCK_EXCLUSIVE 0x00000002L +#define SQL_LCK_UNLOCK 0x00000004L + +/* + * SQL_POS_OPERATIONS + */ +#define SQL_POS_POSITION 0x00000001L +#define SQL_POS_REFRESH 0x00000002L +#define SQL_POS_UPDATE 0x00000004L +#define SQL_POS_DELETE 0x00000008L +#define SQL_POS_ADD 0x00000010L + +/* + * SQL_QUALIFIER_LOCATION + */ +#define SQL_QL_START 0x0001L +#define SQL_QL_END 0x0002L + +/* + * SQL_OJ_CAPABILITIES + */ +#define SQL_OJ_LEFT 0x00000001L +#define SQL_OJ_RIGHT 0x00000002L +#define SQL_OJ_FULL 0x00000004L +#define SQL_OJ_NESTED 0x00000008L +#define SQL_OJ_NOT_ORDERED 0x00000010L +#define SQL_OJ_INNER 0x00000020L +#define SQL_OJ_ALL_COMPARISON_OPS 0x00000040L + +/* + * SQLGetStmtOption/SQLSetStmtOption + */ +#define SQL_QUERY_TIMEOUT 0 +#define SQL_MAX_ROWS 1 +#define SQL_NOSCAN 2 +#define SQL_MAX_LENGTH 3 +#define SQL_ASYNC_ENABLE 4 +#define SQL_BIND_TYPE 5 +#define SQL_CURSOR_TYPE 6 +#define SQL_CONCURRENCY 7 +#define SQL_KEYSET_SIZE 8 +#define SQL_ROWSET_SIZE 9 +#define SQL_SIMULATE_CURSOR 10 +#define SQL_RETRIEVE_DATA 11 +#define SQL_USE_BOOKMARKS 12 +#define SQL_GET_BOOKMARK 13 +#define SQL_ROW_NUMBER 14 + +#define SQL_STMT_OPT_MIN SQL_QUERY_TIMEOUT +#define SQL_STMT_OPT_MAX SQL_ROW_NUMBER + + +/* + * SQL_QUERY_TIMEOUT + */ +#define SQL_QUERY_TIMEOUT_DEFAULT 0UL + +/* + * SQL_MAX_ROWS + */ +#define SQL_MAX_ROWS_DEFAULT 0UL + +/* + * SQL_NOSCAN + */ +#define SQL_NOSCAN_OFF 0UL /* 1.0 FALSE */ +#define SQL_NOSCAN_ON 1UL /* 1.0 TRUE */ +#define SQL_NOSCAN_DEFAULT SQL_NOSCAN_OFF + +/* + * SQL_MAX_LENGTH + */ +#define SQL_MAX_LENGTH_DEFAULT 0UL + +/* + * SQL_ASYNC_ENABLE + */ +#define SQL_ASYNC_ENABLE_OFF 0UL +#define SQL_ASYNC_ENABLE_ON 1UL +#define SQL_ASYNC_ENABLE_DEFAULT SQL_ASYNC_ENABLE_OFF + +/* + * SQL_BIND_TYPE + */ +#define SQL_BIND_BY_COLUMN 0UL +#define SQL_BIND_TYPE_DEFAULT SQL_BIND_BY_COLUMN + +/* + * SQL_CONCURRENCY + */ +#define SQL_CONCUR_READ_ONLY 1 +#define SQL_CONCUR_LOCK 2 +#define SQL_CONCUR_ROWVER 3 +#define SQL_CONCUR_VALUES 4 +#define SQL_CONCUR_DEFAULT SQL_CONCUR_READ_ONLY + +/* + * SQL_CURSOR_TYPE + */ +#define SQL_CURSOR_FORWARD_ONLY 0UL +#define SQL_CURSOR_KEYSET_DRIVEN 1UL +#define SQL_CURSOR_DYNAMIC 2UL +#define SQL_CURSOR_STATIC 3UL +#define SQL_CURSOR_TYPE_DEFAULT SQL_CURSOR_FORWARD_ONLY + +/* + * SQL_ROWSET_SIZE + */ +#define SQL_ROWSET_SIZE_DEFAULT 1UL + +/* + * SQL_KEYSET_SIZE + */ +#define SQL_KEYSET_SIZE_DEFAULT 0UL + +/* + * SQL_SIMULATE_CURSOR + */ +#define SQL_SC_NON_UNIQUE 0UL +#define SQL_SC_TRY_UNIQUE 1UL +#define SQL_SC_UNIQUE 2UL + +/* + * SQL_RETRIEVE_DATA + */ +#define SQL_RD_OFF 0UL +#define SQL_RD_ON 1UL +#define SQL_RD_DEFAULT SQL_RD_ON + +/* + * SQL_USE_BOOKMARKS + */ +#define SQL_UB_OFF 0UL +#define SQL_UB_ON 1UL +#define SQL_UB_DEFAULT SQL_UB_OFF + +/* + * SQLSetConnectOption/SQLGetConnectOption + */ +#define SQL_ACCESS_MODE 101 +#define SQL_AUTOCOMMIT 102 +#define SQL_LOGIN_TIMEOUT 103 +#define SQL_OPT_TRACE 104 +#define SQL_OPT_TRACEFILE 105 +#define SQL_TRANSLATE_DLL 106 +#define SQL_TRANSLATE_OPTION 107 +#define SQL_TXN_ISOLATION 108 +#define SQL_CURRENT_QUALIFIER 109 +#define SQL_ODBC_CURSORS 110 +#define SQL_QUIET_MODE 111 +#define SQL_PACKET_SIZE 112 + +#define SQL_CONN_OPT_MIN SQL_ACCESS_MODE +#define SQL_CONN_OPT_MAX SQL_PACKET_SIZE +#define SQL_CONNECT_OPT_DRVR_START 1000 + + +/* + * SQL_ACCESS_MODE + */ +#define SQL_MODE_READ_WRITE 0UL +#define SQL_MODE_READ_ONLY 1UL +#define SQL_MODE_DEFAULT SQL_MODE_READ_WRITE + +/* + * SQL_AUTOCOMMIT + */ +#define SQL_AUTOCOMMIT_OFF 0UL +#define SQL_AUTOCOMMIT_ON 1UL +#define SQL_AUTOCOMMIT_DEFAULT SQL_AUTOCOMMIT_ON + +/* + * SQL_LOGIN_TIMEOUT + */ +#define SQL_LOGIN_TIMEOUT_DEFAULT 15UL + +/* + * SQL_OPT_TRACE + */ +#define SQL_OPT_TRACE_OFF 0UL +#define SQL_OPT_TRACE_ON 1UL +#define SQL_OPT_TRACE_DEFAULT SQL_OPT_TRACE_OFF +#define SQL_OPT_TRACE_FILE_DEFAULT "odbc.log" + +/* + * SQL_ODBC_CURSORS + */ +#define SQL_CUR_USE_IF_NEEDED 0UL +#define SQL_CUR_USE_ODBC 1UL +#define SQL_CUR_USE_DRIVER 2UL +#define SQL_CUR_DEFAULT SQL_CUR_USE_DRIVER + +/* + * SQLSpecialColumns - Column types and scopes + */ +#define SQL_BEST_ROWID 1 +#define SQL_ROWVER 2 + +#define SQL_SCOPE_CURROW 0 +#define SQL_SCOPE_TRANSACTION 1 +#define SQL_SCOPE_SESSION 2 + +/* + * SQLSetPos + */ +#define SQL_ENTIRE_ROWSET 0 + +/* + * SQLSetPos + */ +#define SQL_POSITION 0 +#define SQL_REFRESH 1 +#define SQL_UPDATE 2 +#define SQL_DELETE 3 +#define SQL_ADD 4 + +/* + * SQLSetPos + */ +#define SQL_LOCK_NO_CHANGE 0 +#define SQL_LOCK_EXCLUSIVE 1 +#define SQL_LOCK_UNLOCK 2 + +/* + * SQLSetPos + */ +#define SQL_POSITION_TO(hstmt,irow) \ + SQLSetPos(hstmt,irow,SQL_POSITION,SQL_LOCK_NO_CHANGE) +#define SQL_LOCK_RECORD(hstmt,irow,fLock) \ + SQLSetPos(hstmt,irow,SQL_POSITION,fLock) +#define SQL_REFRESH_RECORD(hstmt,irow,fLock) \ + SQLSetPos(hstmt,irow,SQL_REFRESH,fLock) +#define SQL_UPDATE_RECORD(hstmt,irow) \ + SQLSetPos(hstmt,irow,SQL_UPDATE,SQL_LOCK_NO_CHANGE) +#define SQL_DELETE_RECORD(hstmt,irow) \ + SQLSetPos(hstmt,irow,SQL_DELETE,SQL_LOCK_NO_CHANGE) +#define SQL_ADD_RECORD(hstmt,irow) \ + SQLSetPos(hstmt,irow,SQL_ADD,SQL_LOCK_NO_CHANGE) + +/* + * All the ODBC keywords + */ +#define SQL_ODBC_KEYWORDS \ +"ABSOLUTE,ACTION,ADA,ADD,ALL,ALLOCATE,ALTER,AND,ANY,ARE,AS,"\ +"ASC,ASSERTION,AT,AUTHORIZATION,AVG,"\ +"BEGIN,BETWEEN,BIT,BIT_LENGTH,BOTH,BY,CASCADE,CASCADED,CASE,CAST,CATALOG,"\ +"CHAR,CHAR_LENGTH,CHARACTER,CHARACTER_LENGTH,CHECK,CLOSE,COALESCE,"\ +"COBOL,COLLATE,COLLATION,COLUMN,COMMIT,CONNECT,CONNECTION,CONSTRAINT,"\ +"CONSTRAINTS,CONTINUE,CONVERT,CORRESPONDING,COUNT,CREATE,CROSS,CURRENT,"\ +"CURRENT_DATE,CURRENT_TIME,CURRENT_TIMESTAMP,CURRENT_USER,CURSOR,"\ +"DATE,DAY,DEALLOCATE,DEC,DECIMAL,DECLARE,DEFAULT,DEFERRABLE,"\ +"DEFERRED,DELETE,DESC,DESCRIBE,DESCRIPTOR,DIAGNOSTICS,DISCONNECT,"\ +"DISTINCT,DOMAIN,DOUBLE,DROP,"\ +"ELSE,END,END-EXEC,ESCAPE,EXCEPT,EXCEPTION,EXEC,EXECUTE,"\ +"EXISTS,EXTERNAL,EXTRACT,"\ +"FALSE,FETCH,FIRST,FLOAT,FOR,FOREIGN,FORTRAN,FOUND,FROM,FULL,"\ +"GET,GLOBAL,GO,GOTO,GRANT,GROUP,HAVING,HOUR,"\ +"IDENTITY,IMMEDIATE,IN,INCLUDE,INDEX,INDICATOR,INITIALLY,INNER,"\ +"INPUT,INSENSITIVE,INSERT,INTEGER,INTERSECT,INTERVAL,INTO,IS,ISOLATION,"\ +"JOIN,KEY,LANGUAGE,LAST,LEADING,LEFT,LEVEL,LIKE,LOCAL,LOWER,"\ +"MATCH,MAX,MIN,MINUTE,MODULE,MONTH,MUMPS,"\ +"NAMES,NATIONAL,NATURAL,NCHAR,NEXT,NO,NONE,NOT,NULL,NULLIF,NUMERIC,"\ +"OCTET_LENGTH,OF,ON,ONLY,OPEN,OPTION,OR,ORDER,OUTER,OUTPUT,OVERLAPS,"\ +"PAD,PARTIAL,PASCAL,PLI,POSITION,PRECISION,PREPARE,PRESERVE,"\ +"PRIMARY,PRIOR,PRIVILEGES,PROCEDURE,PUBLIC,"\ +"REFERENCES,RELATIVE,RESTRICT,REVOKE,RIGHT,ROLLBACK,ROWS,"\ +"SCHEMA,SCROLL,SECOND,SECTION,SELECT,SEQUENCE,SESSION,SESSION_USER,SET,SIZE,"\ +"SMALLINT,SOME,SPACE,SQL,SQLCA,SQLCODE,SQLERROR,SQLSTATE,SQLWARNING,"\ +"SUBSTRING,SUM,SYSTEM_USER,"\ +"TABLE,TEMPORARY,THEN,TIME,TIMESTAMP,TIMEZONE_HOUR,TIMEZONE_MINUTE,"\ +"TO,TRAILING,TRANSACTION,TRANSLATE,TRANSLATION,TRIM,TRUE,"\ +"UNION,UNIQUE,UNKNOWN,UPDATE,UPPER,USAGE,USER,USING,"\ +"VALUE,,VARCHAR,VARYING,VIEW,WHEN,WHENEVER,WHERE,WITH,WORK,YEAR" + +/* + * ---------------------------------------------------------------------- + * Level 2 Functions + * ---------------------------------------------------------------------- + */ + +/* + * SQLExtendedFetch - fFetchType + */ +#define SQL_FETCH_NEXT 1 +#define SQL_FETCH_FIRST 2 +#define SQL_FETCH_LAST 3 +#define SQL_FETCH_PRIOR 4 +#define SQL_FETCH_ABSOLUTE 5 +#define SQL_FETCH_RELATIVE 6 +#define SQL_FETCH_BOOKMARK 8 + +/* + * SQLExtendedFetch - rgfRowStatus + */ +#define SQL_ROW_SUCCESS 0 +#define SQL_ROW_DELETED 1 +#define SQL_ROW_UPDATED 2 +#define SQL_ROW_NOROW 3 +#define SQL_ROW_ADDED 4 +#define SQL_ROW_ERROR 5 + +/* + * SQLForeignKeys - UPDATE_RULE/DELETE_RULE + */ +#define SQL_CASCADE 0 +#define SQL_RESTRICT 1 +#define SQL_SET_NULL 2 + +/* + * SQLBindParameter - fParamType + * SQLProcedureColumns - COLUMN_TYPE + */ +#define SQL_PARAM_TYPE_UNKNOWN 0 +#define SQL_PARAM_INPUT 1 +#define SQL_PARAM_INPUT_OUTPUT 2 +#define SQL_RESULT_COL 3 +#define SQL_PARAM_OUTPUT 4 +#define SQL_RETURN_VALUE 5 + +/* + * SQLSetParam to SQLBindParameter conversion + */ +#define SQL_PARAM_TYPE_DEFAULT SQL_PARAM_INPUT_OUTPUT +#define SQL_SETPARAM_VALUE_MAX (-1L) + +/* + * SQLStatistics - fUnique + */ +#define SQL_INDEX_UNIQUE 0 +#define SQL_INDEX_ALL 1 + +/* + * SQLStatistics - fAccuracy + */ +#define SQL_QUICK 0 +#define SQL_ENSURE 1 + +/* + * SQLStatistics - TYPE + */ +#define SQL_TABLE_STAT 0 +#define SQL_INDEX_CLUSTERED 1 +#define SQL_INDEX_HASHED 2 +#define SQL_INDEX_OTHER 3 + +/* + * SQLProcedures - PROCEDURE_TYPE + */ +#define SQL_PT_UNKNOWN 0 +#define SQL_PT_PROCEDURE 1 +#define SQL_PT_FUNCTION 2 + +/* + * SQLSpecialColumns - PSEUDO_COLUMN + */ +#define SQL_PC_UNKNOWN 0 +#define SQL_PC_NOT_PSEUDO 1 +#define SQL_PC_PSEUDO 2 + +/* + * Deprecated defines from prior versions of ODBC + */ +#define SQL_DATABASE_NAME 16 +#define SQL_FD_FETCH_PREV SQL_FD_FETCH_PRIOR +#define SQL_FETCH_PREV SQL_FETCH_PRIOR +#define SQL_CONCUR_TIMESTAMP SQL_CONCUR_ROWVER +#define SQL_SCCO_OPT_TIMESTAMP SQL_SCCO_OPT_ROWVER +#define SQL_CC_DELETE SQL_CB_DELETE +#define SQL_CR_DELETE SQL_CB_DELETE +#define SQL_CC_CLOSE SQL_CB_CLOSE +#define SQL_CR_CLOSE SQL_CB_CLOSE +#define SQL_CC_PRESERVE SQL_CB_PRESERVE +#define SQL_CR_PRESERVE SQL_CB_PRESERVE +#define SQL_FETCH_RESUME 7 +#define SQL_SCROLL_FORWARD_ONLY 0L +#define SQL_SCROLL_KEYSET_DRIVEN (-1L) +#define SQL_SCROLL_DYNAMIC (-2L) +#define SQL_SCROLL_STATIC (-3L) +#define SQL_PC_NON_PSEUDO SQL_PC_NOT_PSEUDO + +#ifdef __cplusplus +extern "C" { +#endif +/* + * Level 1 function prototypes + */ +RETCODE SQL_API SQLColumns (HSTMT hstmt, UCHAR FAR * szTableQualifier, + SWORD cbTableQualifier, UCHAR FAR * szTableOwner, SWORD cbTableOwner, + UCHAR FAR * szTableName, SWORD cbTableName, UCHAR FAR * szColumnName, + SWORD cbColumnName); +/* glt - Changed HWND to SQLHWND to match MSW header typing */ +RETCODE SQL_API SQLDriverConnect (HDBC hdbc, SQLHWND hwnd, + UCHAR FAR * szConnStrIn, SWORD cbConnStrIn, UCHAR FAR * szConnStrOut, + SWORD cbConnStrOutMax, SWORD FAR * pcbConnStrOut, UWORD fDriverCompletion); +RETCODE SQL_API SQLGetConnectOption (HDBC hdbc, UWORD fOption, PTR pvParam); +RETCODE SQL_API SQLGetData (HSTMT hstmt, UWORD icol, SWORD fCType, + PTR rgbValue, SDWORD cbValueMax, SDWORD FAR * pcbValue); +RETCODE SQL_API SQLGetFunctions (HDBC hdbc, UWORD fFunction, + UWORD FAR * pfExists); +RETCODE SQL_API SQLGetInfo (HDBC hdbc, UWORD fInfoType, PTR rgbInfoValue, + SWORD cbInfoValueMax, SWORD FAR * pcbInfoValue); +RETCODE SQL_API SQLGetStmtOption (HSTMT hstmt, UWORD fOption, PTR pvParam); +RETCODE SQL_API SQLGetTypeInfo (HSTMT hstmt, SWORD fSqlType); +RETCODE SQL_API SQLParamData (HSTMT hstmt, PTR FAR * prgbValue); +RETCODE SQL_API SQLPutData (HSTMT hstmt, PTR rgbValue, SDWORD cbValue); +RETCODE SQL_API SQLSetConnectOption (HDBC hdbc, UWORD fOption, UDWORD vParam); +RETCODE SQL_API SQLSetStmtOption (HSTMT hstmt, UWORD fOption, UDWORD vParam); +RETCODE SQL_API SQLSpecialColumns (HSTMT hstmt, UWORD fColType, + UCHAR FAR * szTableQualifier, SWORD cbTableQualifier, + UCHAR FAR * szTableOwner, SWORD cbTableOwner, UCHAR FAR * szTableName, + SWORD cbTableName, UWORD fScope, UWORD fNullable); +RETCODE SQL_API SQLStatistics (HSTMT hstmt, UCHAR FAR * szTableQualifier, + SWORD cbTableQualifier, UCHAR FAR * szTableOwner, SWORD cbTableOwner, + UCHAR FAR * szTableName, SWORD cbTableName, UWORD fUnique, UWORD fAccuracy); +RETCODE SQL_API SQLTables (HSTMT hstmt, UCHAR FAR * szTableQualifier, + SWORD cbTableQualifier, UCHAR FAR * szTableOwner, SWORD cbTableOwner, + UCHAR FAR * szTableName, SWORD cbTableName, UCHAR FAR * szTableType, + SWORD cbTableType); + +/* + * Level 2 function prototypes + */ +RETCODE SQL_API SQLBrowseConnect (HDBC hdbc, + UCHAR FAR * szConnStrIn, SWORD cbConnStrIn, UCHAR FAR * szConnStrOut, + SWORD cbConnStrOutMax, SWORD FAR * pcbConnStrOut); +RETCODE SQL_API SQLColumnPrivileges (HSTMT hstmt, + UCHAR FAR * szTableQualifier, SWORD cbTableQualifier, + UCHAR FAR * szTableOwner, SWORD cbTableOwner, UCHAR FAR * szTableName, + SWORD cbTableName, UCHAR FAR * szColumnName, SWORD cbColumnName); +RETCODE SQL_API SQLDataSources (HENV henv, UWORD fDirection, + UCHAR FAR * szDSN, SWORD cbDSNMax, SWORD FAR * pcbDSN, + UCHAR FAR * szDescription, SWORD cbDescriptionMax, + SWORD FAR * pcbDescription); +RETCODE SQL_API SQLDescribeParam (HSTMT hstmt, UWORD ipar, + SWORD FAR * pfSqlType, UDWORD FAR * pcbColDef, SWORD FAR * pibScale, + SWORD FAR * pfNullable); +RETCODE SQL_API SQLExtendedFetch (HSTMT hstmt, UWORD fFetchType, SDWORD irow, + UDWORD FAR * pcrow, UWORD FAR * rgfRowStatus); +RETCODE SQL_API SQLForeignKeys (HSTMT hstmt, UCHAR FAR * szPkTableQualifier, + SWORD cbPkTableQualifier, UCHAR FAR * szPkTableOwner, SWORD cbPkTableOwner, + UCHAR FAR * szPkTableName, SWORD cbPkTableName, + UCHAR FAR * szFkTableQualifier, SWORD cbFkTableQualifier, + UCHAR FAR * szFkTableOwner, SWORD cbFkTableOwner, UCHAR FAR * szFkTableName, + SWORD cbFkTableName); +RETCODE SQL_API SQLMoreResults (HSTMT hstmt); +RETCODE SQL_API SQLNativeSql (HDBC hdbc, UCHAR FAR * szSqlStrIn, + SDWORD cbSqlStrIn, UCHAR FAR * szSqlStr, SDWORD cbSqlStrMax, + SDWORD FAR * pcbSqlStr); +RETCODE SQL_API SQLNumParams (HSTMT hstmt, SWORD FAR * pcpar); +RETCODE SQL_API SQLParamOptions (HSTMT hstmt, UDWORD crow, UDWORD FAR * pirow); +RETCODE SQL_API SQLPrimaryKeys (HSTMT hstmt, UCHAR FAR * szTableQualifier, + SWORD cbTableQualifier, UCHAR FAR * szTableOwner, SWORD cbTableOwner, + UCHAR FAR * szTableName, SWORD cbTableName); +RETCODE SQL_API SQLProcedureColumns (HSTMT hstmt, UCHAR FAR * szProcQualifier, + SWORD cbProcQualifier, UCHAR FAR * szProcOwner, SWORD cbProcOwner, + UCHAR FAR * szProcName, SWORD cbProcName, UCHAR FAR * szColumnName, + SWORD cbColumnName); +RETCODE SQL_API SQLProcedures (HSTMT hstmt, UCHAR FAR * szProcQualifier, + SWORD cbProcQualifier, UCHAR FAR * szProcOwner, SWORD cbProcOwner, + UCHAR FAR * szProcName, SWORD cbProcName); +RETCODE SQL_API SQLSetPos (HSTMT hstmt, UWORD irow, UWORD fOption, UWORD fLock); +RETCODE SQL_API SQLTablePrivileges (HSTMT hstmt, UCHAR FAR * szTableQualifier, + SWORD cbTableQualifier, UCHAR FAR * szTableOwner, SWORD cbTableOwner, + UCHAR FAR * szTableName, SWORD cbTableName); + +/* + * SDK 2.0 Additional function prototypes + */ +RETCODE SQL_API SQLDrivers (HENV henv, UWORD fDirection, + UCHAR FAR * szDriverDesc, SWORD cbDriverDescMax, SWORD FAR * pcbDriverDesc, + UCHAR FAR * szDriverAttributes, SWORD cbDrvrAttrMax, + SWORD FAR * pcbDrvrAttr); +RETCODE SQL_API SQLBindParameter (HSTMT hstmt, UWORD ipar, SWORD fParamType, + SWORD fCType, SWORD fSqlType, UDWORD cbColDef, SWORD ibScale, PTR rgbValue, + SDWORD cbValueMax, SDWORD FAR * pcbValue); + +/* + * Deprecated - use SQLSetStmtOptions + */ +RETCODE SQL_API SQLSetScrollOptions (HSTMT hstmt, UWORD fConcurrency, + SDWORD crowKeyset, UWORD crowRowset); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Externals/wxWidgets/include/wx/joystick.h b/Externals/wxWidgets/include/wx/joystick.h new file mode 100644 index 0000000000..d6666fa7cf --- /dev/null +++ b/Externals/wxWidgets/include/wx/joystick.h @@ -0,0 +1,38 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: joystick.h +// Purpose: wxJoystick base header +// Author: wxWidgets Team +// Modified by: +// Created: +// Copyright: (c) wxWidgets Team +// RCS-ID: $Id: joystick.h 32852 2005-03-16 16:18:31Z ABX $ +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_JOYSTICK_H_BASE_ +#define _WX_JOYSTICK_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_JOYSTICK + +#if defined(__WXMSW__) +#include "wx/msw/joystick.h" +#elif defined(__WXMOTIF__) +#include "wx/unix/joystick.h" +#elif defined(__WXGTK__) +#include "wx/unix/joystick.h" +#elif defined(__WXX11__) +#include "wx/unix/joystick.h" +#elif defined(__DARWIN__) +#include "wx/mac/corefoundation/joystick.h" +#elif defined(__WXMAC__) +#include "wx/mac/joystick.h" +#elif defined(__WXPM__) +#include "wx/os2/joystick.h" +#endif + +#endif // wxUSE_JOYSTICK + +#endif + // _WX_JOYSTICK_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/layout.h b/Externals/wxWidgets/include/wx/layout.h new file mode 100644 index 0000000000..4a6d82d7bc --- /dev/null +++ b/Externals/wxWidgets/include/wx/layout.h @@ -0,0 +1,191 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/layout.h +// Purpose: OBSOLETE layout constraint classes, use sizers instead +// Author: Julian Smart +// Modified by: +// Created: 29/01/98 +// RCS-ID: $Id: layout.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) 1998 Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_LAYOUT_H_ +#define _WX_LAYOUT_H_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/object.h" + +// X stupidly defines these in X.h +#ifdef Above + #undef Above +#endif +#ifdef Below + #undef Below +#endif + +#if wxUSE_CONSTRAINTS + +// ---------------------------------------------------------------------------- +// forward declrations +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_CORE wxWindowBase; +class WXDLLIMPEXP_FWD_CORE wxLayoutConstraints; + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +#define wxLAYOUT_DEFAULT_MARGIN 0 + +enum wxEdge +{ + wxLeft, wxTop, wxRight, wxBottom, wxWidth, wxHeight, + wxCentre, wxCenter = wxCentre, wxCentreX, wxCentreY +}; + +enum wxRelationship +{ + wxUnconstrained = 0, + wxAsIs, + wxPercentOf, + wxAbove, + wxBelow, + wxLeftOf, + wxRightOf, + wxSameAs, + wxAbsolute +}; + +// ---------------------------------------------------------------------------- +// wxIndividualLayoutConstraint: a constraint on window position +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxIndividualLayoutConstraint : public wxObject +{ +public: + wxIndividualLayoutConstraint(); + + // note that default copy ctor and assignment operators are ok + + virtual ~wxIndividualLayoutConstraint(){} + + void Set(wxRelationship rel, wxWindowBase *otherW, wxEdge otherE, int val = 0, int marg = wxLAYOUT_DEFAULT_MARGIN); + + // + // Sibling relationships + // + void LeftOf(wxWindowBase *sibling, int marg = wxLAYOUT_DEFAULT_MARGIN); + void RightOf(wxWindowBase *sibling, int marg = wxLAYOUT_DEFAULT_MARGIN); + void Above(wxWindowBase *sibling, int marg = wxLAYOUT_DEFAULT_MARGIN); + void Below(wxWindowBase *sibling, int marg = wxLAYOUT_DEFAULT_MARGIN); + + // + // 'Same edge' alignment + // + void SameAs(wxWindowBase *otherW, wxEdge edge, int marg = wxLAYOUT_DEFAULT_MARGIN); + + // The edge is a percentage of the other window's edge + void PercentOf(wxWindowBase *otherW, wxEdge wh, int per); + + // + // Edge has absolute value + // + void Absolute(int val); + + // + // Dimension is unconstrained + // + void Unconstrained() { relationship = wxUnconstrained; } + + // + // Dimension is 'as is' (use current size settings) + // + void AsIs() { relationship = wxAsIs; } + + // + // Accessors + // + wxWindowBase *GetOtherWindow() { return otherWin; } + wxEdge GetMyEdge() const { return myEdge; } + void SetEdge(wxEdge which) { myEdge = which; } + void SetValue(int v) { value = v; } + int GetMargin() { return margin; } + void SetMargin(int m) { margin = m; } + int GetValue() const { return value; } + int GetPercent() const { return percent; } + int GetOtherEdge() const { return otherEdge; } + bool GetDone() const { return done; } + void SetDone(bool d) { done = d; } + wxRelationship GetRelationship() { return relationship; } + void SetRelationship(wxRelationship r) { relationship = r; } + + // Reset constraint if it mentions otherWin + bool ResetIfWin(wxWindowBase *otherW); + + // Try to satisfy constraint + bool SatisfyConstraint(wxLayoutConstraints *constraints, wxWindowBase *win); + + // Get the value of this edge or dimension, or if this + // is not determinable, -1. + int GetEdge(wxEdge which, wxWindowBase *thisWin, wxWindowBase *other) const; + +protected: + // To be allowed to modify the internal variables + friend class wxIndividualLayoutConstraint_Serialize; + + // 'This' window is the parent or sibling of otherWin + wxWindowBase *otherWin; + + wxEdge myEdge; + wxRelationship relationship; + int margin; + int value; + int percent; + wxEdge otherEdge; + bool done; + + DECLARE_DYNAMIC_CLASS(wxIndividualLayoutConstraint) +}; + +// ---------------------------------------------------------------------------- +// wxLayoutConstraints: the complete set of constraints for a window +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxLayoutConstraints : public wxObject +{ +public: + // Edge constraints + wxIndividualLayoutConstraint left; + wxIndividualLayoutConstraint top; + wxIndividualLayoutConstraint right; + wxIndividualLayoutConstraint bottom; + // Size constraints + wxIndividualLayoutConstraint width; + wxIndividualLayoutConstraint height; + // Centre constraints + wxIndividualLayoutConstraint centreX; + wxIndividualLayoutConstraint centreY; + + wxLayoutConstraints(); + + // note that default copy ctor and assignment operators are ok + + virtual ~wxLayoutConstraints(){} + + bool SatisfyConstraints(wxWindowBase *win, int *noChanges); + bool AreSatisfied() const + { + return left.GetDone() && top.GetDone() && + width.GetDone() && height.GetDone(); + } + + DECLARE_DYNAMIC_CLASS(wxLayoutConstraints) +}; + +#endif // wxUSE_CONSTRAINTS + +#endif // _WX_LAYOUT_H_ diff --git a/Externals/wxWidgets/include/wx/laywin.h b/Externals/wxWidgets/include/wx/laywin.h new file mode 100644 index 0000000000..dc75b1b7de --- /dev/null +++ b/Externals/wxWidgets/include/wx/laywin.h @@ -0,0 +1,18 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/laywin.h +// Purpose: wxSashLayoutWindow base header +// Author: Julian Smart +// Modified by: +// Created: +// Copyright: (c) Julian Smart +// RCS-ID: $Id: laywin.h 33948 2005-05-04 18:57:50Z JS $ +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_LAYWIN_H_BASE_ +#define _WX_LAYWIN_H_BASE_ + +#include "wx/generic/laywin.h" + +#endif + // _WX_LAYWIN_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/link.h b/Externals/wxWidgets/include/wx/link.h new file mode 100644 index 0000000000..eaa503ed85 --- /dev/null +++ b/Externals/wxWidgets/include/wx/link.h @@ -0,0 +1,32 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/link.h +// Purpose: macros to force linking modules which might otherwise be +// discarded by the linker +// Author: Vaclav Slavik +// RCS-ID: $Id: link.h 35722 2005-09-26 12:29:25Z VZ $ +// Copyright: (c) Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_LINK_H_ +#define _WX_LINK_H_ + +// This must be part of the module you want to force: +#define wxFORCE_LINK_THIS_MODULE(module_name) \ + extern void _wx_link_dummy_func_##module_name (); \ + void _wx_link_dummy_func_##module_name () { } + + +// And this must be somewhere where it certainly will be linked: +#define wxFORCE_LINK_MODULE(module_name) \ + extern void _wx_link_dummy_func_##module_name (); \ + static struct wxForceLink##module_name \ + { \ + wxForceLink##module_name() \ + { \ + _wx_link_dummy_func_##module_name (); \ + } \ + } _wx_link_dummy_var_##module_name; + + +#endif // _WX_LINK_H_ diff --git a/Externals/wxWidgets/include/wx/list.h b/Externals/wxWidgets/include/wx/list.h new file mode 100644 index 0000000000..24d89a3471 --- /dev/null +++ b/Externals/wxWidgets/include/wx/list.h @@ -0,0 +1,1301 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/list.h +// Purpose: wxList, wxStringList classes +// Author: Julian Smart +// Modified by: VZ at 16/11/98: WX_DECLARE_LIST() and typesafe lists added +// Created: 29/01/98 +// RCS-ID: $Id: list.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) 1998 Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +/* + All this is quite ugly but serves two purposes: + 1. Be almost 100% compatible with old, untyped, wxList class + 2. Ensure compile-time type checking for the linked lists + + The idea is to have one base class (wxListBase) working with "void *" data, + but to hide these untyped functions - i.e. make them protected, so they + can only be used from derived classes which have inline member functions + working with right types. This achieves the 2nd goal. As for the first one, + we provide a special derivation of wxListBase called wxList which looks just + like the old class. +*/ + +#ifndef _WX_LISTH__ +#define _WX_LISTH__ + +// ----------------------------------------------------------------------------- +// headers +// ----------------------------------------------------------------------------- + +#include "wx/defs.h" +#include "wx/object.h" +#include "wx/string.h" + +#if wxUSE_STL + #include "wx/beforestd.h" + #include <algorithm> + #include <iterator> + #include <list> + #include "wx/afterstd.h" +#endif + +// ---------------------------------------------------------------------------- +// types +// ---------------------------------------------------------------------------- + +// type of compare function for list sort operation (as in 'qsort'): it should +// return a negative value, 0 or positive value if the first element is less +// than, equal or greater than the second + +extern "C" +{ +typedef int (* LINKAGEMODE wxSortCompareFunction)(const void *elem1, const void *elem2); +} + +class WXDLLIMPEXP_BASE wxObjectListNode; +typedef wxObjectListNode wxNode; + +// +typedef int (* LINKAGEMODE wxListIterateFunction)(void *current); + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +#if !defined(wxENUM_KEY_TYPE_DEFINED) +#define wxENUM_KEY_TYPE_DEFINED + +enum wxKeyType +{ + wxKEY_NONE, + wxKEY_INTEGER, + wxKEY_STRING +}; + +#endif + +#if wxUSE_STL + +#define wxLIST_COMPATIBILITY + +#define WX_DECLARE_LIST_3(elT, dummy1, liT, dummy2, decl) \ + WX_DECLARE_LIST_WITH_DECL(elT, liT, decl) +#define WX_DECLARE_LIST_PTR_3(elT, dummy1, liT, dummy2, decl) \ + WX_DECLARE_LIST_3(elT, dummy1, liT, dummy2, decl) + +#define WX_DECLARE_LIST_2(elT, liT, dummy, decl) \ + WX_DECLARE_LIST_WITH_DECL(elT, liT, decl) +#define WX_DECLARE_LIST_PTR_2(elT, liT, dummy, decl) \ + WX_DECLARE_LIST_2(elT, liT, dummy, decl) \ + +#define WX_DECLARE_LIST_WITH_DECL(elT, liT, decl) \ + WX_DECLARE_LIST_XO(elT*, liT, decl) + +#if !defined( __VISUALC__ ) + +template<class T> +class WXDLLIMPEXP_BASE wxList_SortFunction +{ +public: + wxList_SortFunction(wxSortCompareFunction f) : m_f(f) { } + bool operator()(const T& i1, const T& i2) + { return m_f((T*)&i1, (T*)&i2) < 0; } +private: + wxSortCompareFunction m_f; +}; + +#define WX_LIST_SORTFUNCTION( elT, f ) wxList_SortFunction<elT>(f) +#define VC6_WORKAROUND(elT, liT, decl) + +#else // if defined( __VISUALC__ ) + +#define WX_LIST_SORTFUNCTION( elT, f ) std::greater<elT>( f ) +#define VC6_WORKAROUND(elT, liT, decl) \ + decl liT; \ + \ + /* Workaround for broken VC6 STL incorrectly requires a std::greater<> */ \ + /* to be passed into std::list::sort() */ \ + template <> \ + struct std::greater<elT> \ + { \ + private: \ + wxSortCompareFunction m_CompFunc; \ + public: \ + greater( wxSortCompareFunction compfunc = NULL ) \ + : m_CompFunc( compfunc ) {} \ + bool operator()(const elT X, const elT Y) const \ + { \ + return m_CompFunc ? \ + ( m_CompFunc( X, Y ) < 0 ) : \ + ( X > Y ); \ + } \ + }; + +#endif // defined( __VISUALC__ ) + +/* + Note 1: the outer helper class _WX_LIST_HELPER_##liT below is a workaround + for mingw 3.2.3 compiler bug that prevents a static function of liT class + from being exported into dll. A minimal code snippet reproducing the bug: + + struct WXDLLEXPORT Foo + { + static void Bar(); + struct SomeInnerClass + { + friend class Foo; // comment this out to make it link + }; + ~Foo() + { + Bar(); + } + }; + + The program does not link under mingw_gcc 3.2.3 producing undefined + reference to Foo::Bar() function + + + Note 2: the EmptyList is needed to allow having a NULL pointer-like + invalid iterator. We used to use just an uninitialized iterator object + instead but this fails with some debug/checked versions of STL, notably the + glibc version activated with _GLIBCXX_DEBUG, so we need to have a separate + invalid iterator. + */ + +// the real wxList-class declaration +#define WX_DECLARE_LIST_XO(elT, liT, decl) \ + decl _WX_LIST_HELPER_##liT \ + { \ + typedef elT _WX_LIST_ITEM_TYPE_##liT; \ + public: \ + static void DeleteFunction( _WX_LIST_ITEM_TYPE_##liT X ); \ + }; \ + \ + VC6_WORKAROUND(elT, liT, decl) \ + decl liT : public std::list<elT> \ + { \ + private: \ + typedef std::list<elT> BaseListType; \ + static BaseListType EmptyList; \ + \ + bool m_destroy; \ + \ + public: \ + decl compatibility_iterator \ + { \ + private: \ + /* Workaround for broken VC6 nested class name resolution */ \ + typedef std::list<elT>::iterator iterator; \ + friend class liT; \ + \ + iterator m_iter; \ + liT * m_list; \ + \ + public: \ + compatibility_iterator() \ + : m_iter(EmptyList.end()), m_list( NULL ) {} \ + compatibility_iterator( liT* li, iterator i ) \ + : m_iter( i ), m_list( li ) {} \ + compatibility_iterator( const liT* li, iterator i ) \ + : m_iter( i ), m_list( const_cast< liT* >( li ) ) {} \ + \ + compatibility_iterator* operator->() { return this; } \ + const compatibility_iterator* operator->() const { return this; } \ + \ + bool operator==(const compatibility_iterator& i) const \ + { \ + wxASSERT_MSG( m_list && i.m_list, \ + _T("comparing invalid iterators is illegal") ); \ + return (m_list == i.m_list) && (m_iter == i.m_iter); \ + } \ + bool operator!=(const compatibility_iterator& i) const \ + { return !( operator==( i ) ); } \ + operator bool() const \ + { return m_list ? m_iter != m_list->end() : false; } \ + bool operator !() const \ + { return !( operator bool() ); } \ + \ + elT GetData() const \ + { return *m_iter; } \ + void SetData( elT e ) \ + { *m_iter = e; } \ + \ + compatibility_iterator GetNext() const \ + { \ + iterator i = m_iter; \ + return compatibility_iterator( m_list, ++i ); \ + } \ + compatibility_iterator GetPrevious() const \ + { \ + if ( m_iter == m_list->begin() ) \ + return compatibility_iterator(); \ + \ + iterator i = m_iter; \ + return compatibility_iterator( m_list, --i ); \ + } \ + int IndexOf() const \ + { \ + return *this ? std::distance( m_list->begin(), m_iter ) \ + : wxNOT_FOUND; \ + } \ + }; \ + public: \ + liT() : m_destroy( false ) {} \ + \ + compatibility_iterator Find( const elT e ) const \ + { \ + liT* _this = const_cast< liT* >( this ); \ + return compatibility_iterator( _this, \ + std::find( _this->begin(), _this->end(), e ) ); \ + } \ + \ + bool IsEmpty() const \ + { return empty(); } \ + size_t GetCount() const \ + { return size(); } \ + int Number() const \ + { return static_cast< int >( GetCount() ); } \ + \ + compatibility_iterator Item( size_t idx ) const \ + { \ + iterator i = const_cast< liT* >(this)->begin(); \ + std::advance( i, idx ); \ + return compatibility_iterator( this, i ); \ + } \ + elT operator[](size_t idx) const \ + { \ + return Item(idx).GetData(); \ + } \ + \ + compatibility_iterator GetFirst() const \ + { \ + return compatibility_iterator( this, \ + const_cast< liT* >(this)->begin() ); \ + } \ + compatibility_iterator GetLast() const \ + { \ + iterator i = const_cast< liT* >(this)->end(); \ + return compatibility_iterator( this, !empty() ? --i : i ); \ + } \ + compatibility_iterator Member( elT e ) const \ + { return Find( e ); } \ + compatibility_iterator Nth( int n ) const \ + { return Item( n ); } \ + int IndexOf( elT e ) const \ + { return Find( e ).IndexOf(); } \ + \ + compatibility_iterator Append( elT e ) \ + { \ + push_back( e ); \ + return GetLast(); \ + } \ + compatibility_iterator Insert( elT e ) \ + { \ + push_front( e ); \ + return compatibility_iterator( this, begin() ); \ + } \ + compatibility_iterator Insert( compatibility_iterator & i, elT e ) \ + { \ + return compatibility_iterator( this, insert( i.m_iter, e ) ); \ + } \ + compatibility_iterator Insert( size_t idx, elT e ) \ + { \ + return compatibility_iterator( this, \ + insert( Item( idx ).m_iter, e ) ); \ + } \ + \ + void DeleteContents( bool destroy ) \ + { m_destroy = destroy; } \ + bool GetDeleteContents() const \ + { return m_destroy; } \ + void Erase( const compatibility_iterator& i ) \ + { \ + if ( m_destroy ) \ + _WX_LIST_HELPER_##liT::DeleteFunction( i->GetData() ); \ + erase( i.m_iter ); \ + } \ + bool DeleteNode( const compatibility_iterator& i ) \ + { \ + if( i ) \ + { \ + Erase( i ); \ + return true; \ + } \ + return false; \ + } \ + bool DeleteObject( elT e ) \ + { \ + return DeleteNode( Find( e ) ); \ + } \ + void Clear() \ + { \ + if ( m_destroy ) \ + std::for_each( begin(), end(), \ + _WX_LIST_HELPER_##liT::DeleteFunction ); \ + clear(); \ + } \ + /* Workaround for broken VC6 std::list::sort() see above */ \ + void Sort( wxSortCompareFunction compfunc ) \ + { sort( WX_LIST_SORTFUNCTION( elT, compfunc ) ); } \ + ~liT() { Clear(); } \ + \ + /* It needs access to our EmptyList */ \ + friend decl compatibility_iterator; \ + } + +#define WX_DECLARE_LIST(elementtype, listname) \ + WX_DECLARE_LIST_WITH_DECL(elementtype, listname, class) +#define WX_DECLARE_LIST_PTR(elementtype, listname) \ + WX_DECLARE_LIST(elementtype, listname) + +#define WX_DECLARE_EXPORTED_LIST(elementtype, listname) \ + WX_DECLARE_LIST_WITH_DECL(elementtype, listname, class WXDLLEXPORT) +#define WX_DECLARE_EXPORTED_LIST_PTR(elementtype, listname) \ + WX_DECLARE_EXPORTED_LIST(elementtype, listname) + +#define WX_DECLARE_USER_EXPORTED_LIST(elementtype, listname, usergoo) \ + WX_DECLARE_LIST_WITH_DECL(elementtype, listname, class usergoo) +#define WX_DECLARE_USER_EXPORTED_LIST_PTR(elementtype, listname, usergoo) \ + WX_DECLARE_USER_EXPORTED_LIST(elementtype, listname, usergoo) + +// this macro must be inserted in your program after +// #include "wx/listimpl.cpp" +#define WX_DEFINE_LIST(name) "don't forget to include listimpl.cpp!" + +#define WX_DEFINE_EXPORTED_LIST(name) WX_DEFINE_LIST(name) +#define WX_DEFINE_USER_EXPORTED_LIST(name) WX_DEFINE_LIST(name) + +#else // if !wxUSE_STL + +// due to circular header dependencies this function has to be declared here +// (normally it's found in utils.h which includes itself list.h...) +#if WXWIN_COMPATIBILITY_2_4 +extern WXDLLIMPEXP_BASE wxChar* copystring(const wxChar *s); +#endif + +// undef it to get rid of old, deprecated functions +#define wxLIST_COMPATIBILITY + +// ----------------------------------------------------------------------------- +// key stuff: a list may be optionally keyed on integer or string key +// ----------------------------------------------------------------------------- + +union wxListKeyValue +{ + long integer; + wxChar *string; +}; + +// a struct which may contain both types of keys +// +// implementation note: on one hand, this class allows to have only one function +// for any keyed operation instead of 2 almost equivalent. OTOH, it's needed to +// resolve ambiguity which we would otherwise have with wxStringList::Find() and +// wxList::Find(const char *). +class WXDLLIMPEXP_BASE wxListKey +{ +public: + // implicit ctors + wxListKey() : m_keyType(wxKEY_NONE) + { } + wxListKey(long i) : m_keyType(wxKEY_INTEGER) + { m_key.integer = i; } + wxListKey(const wxChar *s) : m_keyType(wxKEY_STRING) + { m_key.string = wxStrdup(s); } + wxListKey(const wxString& s) : m_keyType(wxKEY_STRING) + { m_key.string = wxStrdup(s.c_str()); } + + // accessors + wxKeyType GetKeyType() const { return m_keyType; } + const wxChar *GetString() const + { wxASSERT( m_keyType == wxKEY_STRING ); return m_key.string; } + long GetNumber() const + { wxASSERT( m_keyType == wxKEY_INTEGER ); return m_key.integer; } + + // comparison + // Note: implementation moved to list.cpp to prevent BC++ inline + // expansion warning. + bool operator==(wxListKeyValue value) const ; + + // dtor + ~wxListKey() + { + if ( m_keyType == wxKEY_STRING ) + free(m_key.string); + } + +private: + wxKeyType m_keyType; + wxListKeyValue m_key; +}; + +// ----------------------------------------------------------------------------- +// wxNodeBase class is a (base for) node in a double linked list +// ----------------------------------------------------------------------------- + +extern WXDLLIMPEXP_DATA_BASE(wxListKey) wxDefaultListKey; + +class WXDLLIMPEXP_BASE wxListBase; + +class WXDLLIMPEXP_BASE wxNodeBase +{ +friend class wxListBase; +public: + // ctor + wxNodeBase(wxListBase *list = (wxListBase *)NULL, + wxNodeBase *previous = (wxNodeBase *)NULL, + wxNodeBase *next = (wxNodeBase *)NULL, + void *data = NULL, + const wxListKey& key = wxDefaultListKey); + + virtual ~wxNodeBase(); + + // FIXME no check is done that the list is really keyed on strings + const wxChar *GetKeyString() const { return m_key.string; } + long GetKeyInteger() const { return m_key.integer; } + + // Necessary for some existing code + void SetKeyString(wxChar* s) { m_key.string = s; } + void SetKeyInteger(long i) { m_key.integer = i; } + +#ifdef wxLIST_COMPATIBILITY + // compatibility methods, use Get* instead. + wxDEPRECATED( wxNode *Next() const ); + wxDEPRECATED( wxNode *Previous() const ); + wxDEPRECATED( wxObject *Data() const ); +#endif // wxLIST_COMPATIBILITY + +protected: + // all these are going to be "overloaded" in the derived classes + wxNodeBase *GetNext() const { return m_next; } + wxNodeBase *GetPrevious() const { return m_previous; } + + void *GetData() const { return m_data; } + void SetData(void *data) { m_data = data; } + + // get 0-based index of this node within the list or wxNOT_FOUND + int IndexOf() const; + + virtual void DeleteData() { } +public: + // for wxList::iterator + void** GetDataPtr() const { return &(((wxNodeBase*)this)->m_data); } +private: + // optional key stuff + wxListKeyValue m_key; + + void *m_data; // user data + wxNodeBase *m_next, // next and previous nodes in the list + *m_previous; + + wxListBase *m_list; // list we belong to + + DECLARE_NO_COPY_CLASS(wxNodeBase) +}; + +// ----------------------------------------------------------------------------- +// a double-linked list class +// ----------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxList; + +class WXDLLIMPEXP_BASE wxListBase : public wxObject +{ +friend class WXDLLIMPEXP_FWD_BASE wxNodeBase; // should be able to call DetachNode() +friend class wxHashTableBase; // should be able to call untyped Find() + +public: + // default ctor & dtor + wxListBase(wxKeyType keyType = wxKEY_NONE) + { Init(keyType); } + virtual ~wxListBase(); + + // accessors + // count of items in the list + size_t GetCount() const { return m_count; } + + // return true if this list is empty + bool IsEmpty() const { return m_count == 0; } + + // operations + + // delete all nodes + void Clear(); + + // instruct it to destroy user data when deleting nodes + void DeleteContents(bool destroy) { m_destroy = destroy; } + + // query if to delete + bool GetDeleteContents() const + { return m_destroy; } + + // get the keytype + wxKeyType GetKeyType() const + { return m_keyType; } + + // set the keytype (required by the serial code) + void SetKeyType(wxKeyType keyType) + { wxASSERT( m_count==0 ); m_keyType = keyType; } + +#ifdef wxLIST_COMPATIBILITY + // compatibility methods from old wxList + wxDEPRECATED( int Number() const ); // use GetCount instead. + wxDEPRECATED( wxNode *First() const ); // use GetFirst + wxDEPRECATED( wxNode *Last() const ); // use GetLast + wxDEPRECATED( wxNode *Nth(size_t n) const ); // use Item + + // kludge for typesafe list migration in core classes. + wxDEPRECATED( operator wxList&() const ); +#endif // wxLIST_COMPATIBILITY + +protected: + + // all methods here are "overloaded" in derived classes to provide compile + // time type checking + + // create a node for the list of this type + virtual wxNodeBase *CreateNode(wxNodeBase *prev, wxNodeBase *next, + void *data, + const wxListKey& key = wxDefaultListKey) = 0; + +// Can't access these from derived classes otherwise (bug in Salford C++?) +#ifdef __SALFORDC__ +public: +#endif + + // ctors + // from an array + wxListBase(size_t count, void *elements[]); + // from a sequence of objects + wxListBase(void *object, ... /* terminate with NULL */); + +protected: + void Assign(const wxListBase& list) + { Clear(); DoCopy(list); } + + // get list head/tail + wxNodeBase *GetFirst() const { return m_nodeFirst; } + wxNodeBase *GetLast() const { return m_nodeLast; } + + // by (0-based) index + wxNodeBase *Item(size_t index) const; + + // get the list item's data + void *operator[](size_t n) const + { + wxNodeBase *node = Item(n); + + return node ? node->GetData() : (wxNodeBase *)NULL; + } + + // operations + // append to end of list + wxNodeBase *Prepend(void *object) + { return (wxNodeBase *)wxListBase::Insert(object); } + // append to beginning of list + wxNodeBase *Append(void *object); + // insert a new item at the beginning of the list + wxNodeBase *Insert(void *object) { return Insert( (wxNodeBase*)NULL, object); } + // insert a new item at the given position + wxNodeBase *Insert(size_t pos, void *object) + { return pos == GetCount() ? Append(object) + : Insert(Item(pos), object); } + // insert before given node or at front of list if prev == NULL + wxNodeBase *Insert(wxNodeBase *prev, void *object); + + // keyed append + wxNodeBase *Append(long key, void *object); + wxNodeBase *Append(const wxChar *key, void *object); + + // removes node from the list but doesn't delete it (returns pointer + // to the node or NULL if it wasn't found in the list) + wxNodeBase *DetachNode(wxNodeBase *node); + // delete element from list, returns false if node not found + bool DeleteNode(wxNodeBase *node); + // finds object pointer and deletes node (and object if DeleteContents + // is on), returns false if object not found + bool DeleteObject(void *object); + + // search (all return NULL if item not found) + // by data + wxNodeBase *Find(const void *object) const; + + // by key + wxNodeBase *Find(const wxListKey& key) const; + + // get 0-based index of object or wxNOT_FOUND + int IndexOf( void *object ) const; + + // this function allows the sorting of arbitrary lists by giving + // a function to compare two list elements. The list is sorted in place. + void Sort(const wxSortCompareFunction compfunc); + + // functions for iterating over the list + void *FirstThat(wxListIterateFunction func); + void ForEach(wxListIterateFunction func); + void *LastThat(wxListIterateFunction func); + + // for STL interface, "last" points to one after the last node + // of the controlled sequence (NULL for the end of the list) + void Reverse(); + void DeleteNodes(wxNodeBase* first, wxNodeBase* last); +private: + + // common part of all ctors + void Init(wxKeyType keyType = wxKEY_NONE); + + // helpers + // common part of copy ctor and assignment operator + void DoCopy(const wxListBase& list); + // common part of all Append()s + wxNodeBase *AppendCommon(wxNodeBase *node); + // free node's data and node itself + void DoDeleteNode(wxNodeBase *node); + + size_t m_count; // number of elements in the list + bool m_destroy; // destroy user data when deleting list items? + wxNodeBase *m_nodeFirst, // pointers to the head and tail of the list + *m_nodeLast; + + wxKeyType m_keyType; // type of our keys (may be wxKEY_NONE) +}; + +// ----------------------------------------------------------------------------- +// macros for definition of "template" list type +// ----------------------------------------------------------------------------- + +// and now some heavy magic... + +// declare a list type named 'name' and containing elements of type 'T *' +// (as a by product of macro expansion you also get wx##name##Node +// wxNode-derived type) +// +// implementation details: +// 1. We define _WX_LIST_ITEM_TYPE_##name typedef to save in it the item type +// for the list of given type - this allows us to pass only the list name +// to WX_DEFINE_LIST() even if it needs both the name and the type +// +// 2. We redefine all non-type-safe wxList functions with type-safe versions +// which don't take any space (everything is inline), but bring compile +// time error checking. +// +// 3. The macro which is usually used (WX_DECLARE_LIST) is defined in terms of +// a more generic WX_DECLARE_LIST_2 macro which, in turn, uses the most +// generic WX_DECLARE_LIST_3 one. The last macro adds a sometimes +// interesting capability to store polymorphic objects in the list and is +// particularly useful with, for example, "wxWindow *" list where the +// wxWindowBase pointers are put into the list, but wxWindow pointers are +// retrieved from it. +// +// 4. final hack is that WX_DECLARE_LIST_3 is defined in terms of +// WX_DECLARE_LIST_4 to allow defining classes without operator->() as +// it results in compiler warnings when this operator doesn't make sense +// (i.e. stored elements are not pointers) + +// common part of WX_DECLARE_LIST_3 and WX_DECLARE_LIST_PTR_3 +#define WX_DECLARE_LIST_4(T, Tbase, name, nodetype, classexp, ptrop) \ + typedef int (*wxSortFuncFor_##name)(const T **, const T **); \ + \ + classexp nodetype : public wxNodeBase \ + { \ + public: \ + nodetype(wxListBase *list = (wxListBase *)NULL, \ + nodetype *previous = (nodetype *)NULL, \ + nodetype *next = (nodetype *)NULL, \ + T *data = (T *)NULL, \ + const wxListKey& key = wxDefaultListKey) \ + : wxNodeBase(list, previous, next, data, key) { } \ + \ + nodetype *GetNext() const \ + { return (nodetype *)wxNodeBase::GetNext(); } \ + nodetype *GetPrevious() const \ + { return (nodetype *)wxNodeBase::GetPrevious(); } \ + \ + T *GetData() const \ + { return (T *)wxNodeBase::GetData(); } \ + void SetData(T *data) \ + { wxNodeBase::SetData(data); } \ + \ + protected: \ + virtual void DeleteData(); \ + \ + DECLARE_NO_COPY_CLASS(nodetype) \ + }; \ + \ + classexp name : public wxListBase \ + { \ + public: \ + typedef nodetype Node; \ + classexp compatibility_iterator \ + { \ + public: \ + compatibility_iterator(Node *ptr = NULL) : m_ptr(ptr) { } \ + \ + Node *operator->() const { return m_ptr; } \ + operator Node *() const { return m_ptr; } \ + \ + private: \ + Node *m_ptr; \ + }; \ + \ + name(wxKeyType keyType = wxKEY_NONE) : wxListBase(keyType) \ + { } \ + name(const name& list) : wxListBase(list.GetKeyType()) \ + { Assign(list); } \ + name(size_t count, T *elements[]) \ + : wxListBase(count, (void **)elements) { } \ + \ + name& operator=(const name& list) \ + { Assign(list); return *this; } \ + \ + nodetype *GetFirst() const \ + { return (nodetype *)wxListBase::GetFirst(); } \ + nodetype *GetLast() const \ + { return (nodetype *)wxListBase::GetLast(); } \ + \ + nodetype *Item(size_t index) const \ + { return (nodetype *)wxListBase::Item(index); } \ + \ + T *operator[](size_t index) const \ + { \ + nodetype *node = Item(index); \ + return node ? (T*)(node->GetData()) : (T*)NULL; \ + } \ + \ + nodetype *Append(Tbase *object) \ + { return (nodetype *)wxListBase::Append(object); } \ + nodetype *Insert(Tbase *object) \ + { return (nodetype *)Insert((nodetype*)NULL, object); } \ + nodetype *Insert(size_t pos, Tbase *object) \ + { return (nodetype *)wxListBase::Insert(pos, object); } \ + nodetype *Insert(nodetype *prev, Tbase *object) \ + { return (nodetype *)wxListBase::Insert(prev, object); } \ + \ + nodetype *Append(long key, void *object) \ + { return (nodetype *)wxListBase::Append(key, object); } \ + nodetype *Append(const wxChar *key, void *object) \ + { return (nodetype *)wxListBase::Append(key, object); } \ + \ + nodetype *DetachNode(nodetype *node) \ + { return (nodetype *)wxListBase::DetachNode(node); } \ + bool DeleteNode(nodetype *node) \ + { return wxListBase::DeleteNode(node); } \ + bool DeleteObject(Tbase *object) \ + { return wxListBase::DeleteObject(object); } \ + void Erase(nodetype *it) \ + { DeleteNode(it); } \ + \ + nodetype *Find(const Tbase *object) const \ + { return (nodetype *)wxListBase::Find(object); } \ + \ + virtual nodetype *Find(const wxListKey& key) const \ + { return (nodetype *)wxListBase::Find(key); } \ + \ + int IndexOf(Tbase *object) const \ + { return wxListBase::IndexOf(object); } \ + \ + void Sort(wxSortCompareFunction func) \ + { wxListBase::Sort(func); } \ + void Sort(wxSortFuncFor_##name func) \ + { Sort((wxSortCompareFunction)func); } \ + \ + protected: \ + virtual wxNodeBase *CreateNode(wxNodeBase *prev, wxNodeBase *next, \ + void *data, \ + const wxListKey& key = wxDefaultListKey) \ + { \ + return new nodetype(this, \ + (nodetype *)prev, (nodetype *)next, \ + (T *)data, key); \ + } \ + /* STL interface */ \ + public: \ + typedef size_t size_type; \ + typedef int difference_type; \ + typedef T* value_type; \ + typedef Tbase* base_value_type; \ + typedef value_type& reference; \ + typedef const value_type& const_reference; \ + typedef base_value_type& base_reference; \ + typedef const base_value_type& const_base_reference; \ + \ + classexp iterator \ + { \ + typedef name list; \ + public: \ + typedef nodetype Node; \ + typedef iterator itor; \ + typedef T* value_type; \ + typedef value_type* ptr_type; \ + typedef value_type& reference; \ + \ + Node* m_node; \ + Node* m_init; \ + public: \ + typedef reference reference_type; \ + typedef ptr_type pointer_type; \ + \ + iterator(Node* node, Node* init) : m_node(node), m_init(init) {}\ + iterator() : m_node(NULL), m_init(NULL) { } \ + reference_type operator*() const \ + { return *(pointer_type)m_node->GetDataPtr(); } \ + ptrop \ + itor& operator++() { m_node = m_node->GetNext(); return *this; }\ + const itor operator++(int) \ + { itor tmp = *this; m_node = m_node->GetNext(); return tmp; }\ + itor& operator--() \ + { \ + m_node = m_node ? m_node->GetPrevious() : m_init; \ + return *this; \ + } \ + const itor operator--(int) \ + { \ + itor tmp = *this; \ + m_node = m_node ? m_node->GetPrevious() : m_init; \ + return tmp; \ + } \ + bool operator!=(const itor& it) const \ + { return it.m_node != m_node; } \ + bool operator==(const itor& it) const \ + { return it.m_node == m_node; } \ + }; \ + classexp const_iterator \ + { \ + typedef name list; \ + public: \ + typedef nodetype Node; \ + typedef T* value_type; \ + typedef const value_type& const_reference; \ + typedef const_iterator itor; \ + typedef value_type* ptr_type; \ + \ + Node* m_node; \ + Node* m_init; \ + public: \ + typedef const_reference reference_type; \ + typedef const ptr_type pointer_type; \ + \ + const_iterator(Node* node, Node* init) \ + : m_node(node), m_init(init) { } \ + const_iterator() : m_node(NULL), m_init(NULL) { } \ + const_iterator(const iterator& it) \ + : m_node(it.m_node), m_init(it.m_init) { } \ + reference_type operator*() const \ + { return *(pointer_type)m_node->GetDataPtr(); } \ + ptrop \ + itor& operator++() { m_node = m_node->GetNext(); return *this; }\ + const itor operator++(int) \ + { itor tmp = *this; m_node = m_node->GetNext(); return tmp; }\ + itor& operator--() \ + { \ + m_node = m_node ? m_node->GetPrevious() : m_init; \ + return *this; \ + } \ + const itor operator--(int) \ + { \ + itor tmp = *this; \ + m_node = m_node ? m_node->GetPrevious() : m_init; \ + return tmp; \ + } \ + bool operator!=(const itor& it) const \ + { return it.m_node != m_node; } \ + bool operator==(const itor& it) const \ + { return it.m_node == m_node; } \ + }; \ + classexp reverse_iterator \ + { \ + typedef name list; \ + public: \ + typedef nodetype Node; \ + typedef T* value_type; \ + typedef reverse_iterator itor; \ + typedef value_type* ptr_type; \ + typedef value_type& reference; \ + \ + Node* m_node; \ + Node* m_init; \ + public: \ + typedef reference reference_type; \ + typedef ptr_type pointer_type; \ + \ + reverse_iterator(Node* node, Node* init) \ + : m_node(node), m_init(init) { } \ + reverse_iterator() : m_node(NULL), m_init(NULL) { } \ + reference_type operator*() const \ + { return *(pointer_type)m_node->GetDataPtr(); } \ + ptrop \ + itor& operator++() \ + { m_node = m_node->GetPrevious(); return *this; } \ + const itor operator++(int) \ + { itor tmp = *this; m_node = m_node->GetPrevious(); return tmp; }\ + itor& operator--() \ + { m_node = m_node ? m_node->GetNext() : m_init; return *this; } \ + const itor operator--(int) \ + { \ + itor tmp = *this; \ + m_node = m_node ? m_node->GetNext() : m_init; \ + return tmp; \ + } \ + bool operator!=(const itor& it) const \ + { return it.m_node != m_node; } \ + bool operator==(const itor& it) const \ + { return it.m_node == m_node; } \ + }; \ + classexp const_reverse_iterator \ + { \ + typedef name list; \ + public: \ + typedef nodetype Node; \ + typedef T* value_type; \ + typedef const_reverse_iterator itor; \ + typedef value_type* ptr_type; \ + typedef const value_type& const_reference; \ + \ + Node* m_node; \ + Node* m_init; \ + public: \ + typedef const_reference reference_type; \ + typedef const ptr_type pointer_type; \ + \ + const_reverse_iterator(Node* node, Node* init) \ + : m_node(node), m_init(init) { } \ + const_reverse_iterator() : m_node(NULL), m_init(NULL) { } \ + const_reverse_iterator(const reverse_iterator& it) \ + : m_node(it.m_node), m_init(it.m_init) { } \ + reference_type operator*() const \ + { return *(pointer_type)m_node->GetDataPtr(); } \ + ptrop \ + itor& operator++() \ + { m_node = m_node->GetPrevious(); return *this; } \ + const itor operator++(int) \ + { itor tmp = *this; m_node = m_node->GetPrevious(); return tmp; }\ + itor& operator--() \ + { m_node = m_node ? m_node->GetNext() : m_init; return *this;}\ + const itor operator--(int) \ + { \ + itor tmp = *this; \ + m_node = m_node ? m_node->GetNext() : m_init; \ + return tmp; \ + } \ + bool operator!=(const itor& it) const \ + { return it.m_node != m_node; } \ + bool operator==(const itor& it) const \ + { return it.m_node == m_node; } \ + }; \ + \ + wxEXPLICIT name(size_type n, const_reference v = value_type()) \ + { assign(n, v); } \ + name(const const_iterator& first, const const_iterator& last) \ + { assign(first, last); } \ + iterator begin() { return iterator(GetFirst(), GetLast()); } \ + const_iterator begin() const \ + { return const_iterator(GetFirst(), GetLast()); } \ + iterator end() { return iterator(NULL, GetLast()); } \ + const_iterator end() const { return const_iterator(NULL, GetLast()); }\ + reverse_iterator rbegin() \ + { return reverse_iterator(GetLast(), GetFirst()); } \ + const_reverse_iterator rbegin() const \ + { return const_reverse_iterator(GetLast(), GetFirst()); } \ + reverse_iterator rend() { return reverse_iterator(NULL, GetFirst()); }\ + const_reverse_iterator rend() const \ + { return const_reverse_iterator(NULL, GetFirst()); } \ + void resize(size_type n, value_type v = value_type()) \ + { \ + while (n < size()) \ + pop_back(); \ + while (n > size()) \ + push_back(v); \ + } \ + size_type size() const { return GetCount(); } \ + size_type max_size() const { return INT_MAX; } \ + bool empty() const { return IsEmpty(); } \ + reference front() { return *begin(); } \ + const_reference front() const { return *begin(); } \ + reference back() { iterator tmp = end(); return *--tmp; } \ + const_reference back() const { const_iterator tmp = end(); return *--tmp; }\ + void push_front(const_reference v = value_type()) \ + { Insert(GetFirst(), (const_base_reference)v); } \ + void pop_front() { DeleteNode(GetFirst()); } \ + void push_back(const_reference v = value_type()) \ + { Append((const_base_reference)v); } \ + void pop_back() { DeleteNode(GetLast()); } \ + void assign(const_iterator first, const const_iterator& last) \ + { \ + clear(); \ + for(; first != last; ++first) \ + Append((const_base_reference)*first); \ + } \ + void assign(size_type n, const_reference v = value_type()) \ + { \ + clear(); \ + for(size_type i = 0; i < n; ++i) \ + Append((const_base_reference)v); \ + } \ + iterator insert(const iterator& it, const_reference v = value_type())\ + { \ + Insert(it.m_node, (const_base_reference)v); \ + return iterator(it.m_node->GetPrevious(), GetLast()); \ + } \ + void insert(const iterator& it, size_type n, const_reference v = value_type())\ + { \ + for(size_type i = 0; i < n; ++i) \ + Insert(it.m_node, (const_base_reference)v); \ + } \ + void insert(const iterator& it, const_iterator first, const const_iterator& last)\ + { \ + for(; first != last; ++first) \ + Insert(it.m_node, (const_base_reference)*first); \ + } \ + iterator erase(const iterator& it) \ + { \ + iterator next = iterator(it.m_node->GetNext(), GetLast()); \ + DeleteNode(it.m_node); return next; \ + } \ + iterator erase(const iterator& first, const iterator& last) \ + { \ + iterator next = last; ++next; \ + DeleteNodes(first.m_node, last.m_node); \ + return next; \ + } \ + void clear() { Clear(); } \ + void splice(const iterator& it, name& l, const iterator& first, const iterator& last)\ + { insert(it, first, last); l.erase(first, last); } \ + void splice(const iterator& it, name& l) \ + { splice(it, l, l.begin(), l.end() ); } \ + void splice(const iterator& it, name& l, const iterator& first) \ + { \ + iterator tmp = first; ++tmp; \ + if(it == first || it == tmp) return; \ + insert(it, *first); \ + l.erase(first); \ + } \ + void remove(const_reference v) \ + { DeleteObject((const_base_reference)v); } \ + void reverse() \ + { Reverse(); } \ + /* void swap(name& l) \ + { \ + { size_t t = m_count; m_count = l.m_count; l.m_count = t; } \ + { bool t = m_destroy; m_destroy = l.m_destroy; l.m_destroy = t; }\ + { wxNodeBase* t = m_nodeFirst; m_nodeFirst = l.m_nodeFirst; l.m_nodeFirst = t; }\ + { wxNodeBase* t = m_nodeLast; m_nodeLast = l.m_nodeLast; l.m_nodeLast = t; }\ + { wxKeyType t = m_keyType; m_keyType = l.m_keyType; l.m_keyType = t; }\ + } */ \ + } + +#define WX_LIST_PTROP \ + pointer_type operator->() const \ + { return (pointer_type)m_node->GetDataPtr(); } +#define WX_LIST_PTROP_NONE + +#define WX_DECLARE_LIST_3(T, Tbase, name, nodetype, classexp) \ + WX_DECLARE_LIST_4(T, Tbase, name, nodetype, classexp, WX_LIST_PTROP_NONE) +#define WX_DECLARE_LIST_PTR_3(T, Tbase, name, nodetype, classexp) \ + WX_DECLARE_LIST_4(T, Tbase, name, nodetype, classexp, WX_LIST_PTROP) + +#define WX_DECLARE_LIST_2(elementtype, listname, nodename, classexp) \ + WX_DECLARE_LIST_3(elementtype, elementtype, listname, nodename, classexp) +#define WX_DECLARE_LIST_PTR_2(elementtype, listname, nodename, classexp) \ + WX_DECLARE_LIST_PTR_3(elementtype, elementtype, listname, nodename, classexp) + +#define WX_DECLARE_LIST(elementtype, listname) \ + typedef elementtype _WX_LIST_ITEM_TYPE_##listname; \ + WX_DECLARE_LIST_2(elementtype, listname, wx##listname##Node, class) +#define WX_DECLARE_LIST_PTR(elementtype, listname) \ + typedef elementtype _WX_LIST_ITEM_TYPE_##listname; \ + WX_DECLARE_LIST_PTR_2(elementtype, listname, wx##listname##Node, class) + +#define WX_DECLARE_LIST_WITH_DECL(elementtype, listname, decl) \ + typedef elementtype _WX_LIST_ITEM_TYPE_##listname; \ + WX_DECLARE_LIST_2(elementtype, listname, wx##listname##Node, decl) + +#define WX_DECLARE_EXPORTED_LIST(elementtype, listname) \ + WX_DECLARE_LIST_WITH_DECL(elementtype, listname, class WXDLLEXPORT) + +#define WX_DECLARE_EXPORTED_LIST_PTR(elementtype, listname) \ + typedef elementtype _WX_LIST_ITEM_TYPE_##listname; \ + WX_DECLARE_LIST_PTR_2(elementtype, listname, wx##listname##Node, class WXDLLEXPORT) + +#define WX_DECLARE_USER_EXPORTED_LIST(elementtype, listname, usergoo) \ + typedef elementtype _WX_LIST_ITEM_TYPE_##listname; \ + WX_DECLARE_LIST_2(elementtype, listname, wx##listname##Node, class usergoo) +#define WX_DECLARE_USER_EXPORTED_LIST_PTR(elementtype, listname, usergoo) \ + typedef elementtype _WX_LIST_ITEM_TYPE_##listname; \ + WX_DECLARE_LIST_PTR_2(elementtype, listname, wx##listname##Node, class usergoo) + +// this macro must be inserted in your program after +// #include "wx/listimpl.cpp" +#define WX_DEFINE_LIST(name) "don't forget to include listimpl.cpp!" + +#define WX_DEFINE_EXPORTED_LIST(name) WX_DEFINE_LIST(name) +#define WX_DEFINE_USER_EXPORTED_LIST(name) WX_DEFINE_LIST(name) + +#endif // !wxUSE_STL + +// ============================================================================ +// now we can define classes 100% compatible with the old ones +// ============================================================================ + +// ---------------------------------------------------------------------------- +// commonly used list classes +// ---------------------------------------------------------------------------- + +#if defined(wxLIST_COMPATIBILITY) + +// inline compatibility functions + +#if !wxUSE_STL + +// ---------------------------------------------------------------------------- +// wxNodeBase deprecated methods +// ---------------------------------------------------------------------------- + +inline wxNode *wxNodeBase::Next() const { return (wxNode *)GetNext(); } +inline wxNode *wxNodeBase::Previous() const { return (wxNode *)GetPrevious(); } +inline wxObject *wxNodeBase::Data() const { return (wxObject *)GetData(); } + +// ---------------------------------------------------------------------------- +// wxListBase deprecated methods +// ---------------------------------------------------------------------------- + +inline int wxListBase::Number() const { return (int)GetCount(); } +inline wxNode *wxListBase::First() const { return (wxNode *)GetFirst(); } +inline wxNode *wxListBase::Last() const { return (wxNode *)GetLast(); } +inline wxNode *wxListBase::Nth(size_t n) const { return (wxNode *)Item(n); } +inline wxListBase::operator wxList&() const { return *(wxList*)this; } + +#endif + +// define this to make a lot of noise about use of the old wxList classes. +//#define wxWARN_COMPAT_LIST_USE + +// ---------------------------------------------------------------------------- +// wxList compatibility class: in fact, it's a list of wxObjects +// ---------------------------------------------------------------------------- + +WX_DECLARE_LIST_2(wxObject, wxObjectList, wxObjectListNode, + class WXDLLIMPEXP_BASE); + +class WXDLLIMPEXP_BASE wxList : public wxObjectList +{ +public: +#if defined(wxWARN_COMPAT_LIST_USE) && !wxUSE_STL + wxList() { }; + wxDEPRECATED( wxList(int key_type) ); +#elif !wxUSE_STL + wxList(int key_type = wxKEY_NONE); +#endif + + // this destructor is required for Darwin + ~wxList() { } + +#if !wxUSE_STL + wxList& operator=(const wxList& list) + { (void) wxListBase::operator=(list); return *this; } + + // compatibility methods + void Sort(wxSortCompareFunction compfunc) { wxListBase::Sort(compfunc); } +#endif + +#if wxUSE_STL +#else + wxNode *Member(wxObject *object) const { return (wxNode *)Find(object); } +#endif + +private: +#if !wxUSE_STL + DECLARE_DYNAMIC_CLASS(wxList) +#endif +}; + +#if !wxUSE_STL + +// ----------------------------------------------------------------------------- +// wxStringList class for compatibility with the old code +// ----------------------------------------------------------------------------- +WX_DECLARE_LIST_2(wxChar, wxStringListBase, wxStringListNode, class WXDLLIMPEXP_BASE); + +class WXDLLIMPEXP_BASE wxStringList : public wxStringListBase +{ +public: + // ctors and such + // default +#ifdef wxWARN_COMPAT_LIST_USE + wxStringList(); + wxDEPRECATED( wxStringList(const wxChar *first ...) ); +#else + wxStringList(); + wxStringList(const wxChar *first ...); +#endif + + // copying the string list: the strings are copied, too (extremely + // inefficient!) + wxStringList(const wxStringList& other) : wxStringListBase() { DeleteContents(true); DoCopy(other); } + wxStringList& operator=(const wxStringList& other) + { Clear(); DoCopy(other); return *this; } + + // operations + // makes a copy of the string + wxNode *Add(const wxChar *s); + + // Append to beginning of list + wxNode *Prepend(const wxChar *s); + + bool Delete(const wxChar *s); + + wxChar **ListToArray(bool new_copies = false) const; + bool Member(const wxChar *s) const; + + // alphabetic sort + void Sort(); + +private: + void DoCopy(const wxStringList&); // common part of copy ctor and operator= + + DECLARE_DYNAMIC_CLASS(wxStringList) +}; + +#else // if wxUSE_STL + +WX_DECLARE_LIST_XO(wxString, wxStringListBase, class WXDLLIMPEXP_BASE); + +class WXDLLIMPEXP_BASE wxStringList : public wxStringListBase +{ +public: + compatibility_iterator Append(wxChar* s) + { wxString tmp = s; delete[] s; return wxStringListBase::Append(tmp); } + compatibility_iterator Insert(wxChar* s) + { wxString tmp = s; delete[] s; return wxStringListBase::Insert(tmp); } + compatibility_iterator Insert(size_t pos, wxChar* s) + { + wxString tmp = s; + delete[] s; + return wxStringListBase::Insert(pos, tmp); + } + compatibility_iterator Add(const wxChar* s) + { push_back(s); return GetLast(); } + compatibility_iterator Prepend(const wxChar* s) + { push_front(s); return GetFirst(); } +}; + +#endif // wxUSE_STL + +#endif // wxLIST_COMPATIBILITY + +// delete all list elements +// +// NB: the class declaration of the list elements must be visible from the +// place where you use this macro, otherwise the proper destructor may not +// be called (a decent compiler should give a warning about it, but don't +// count on it)! +#define WX_CLEAR_LIST(type, list) \ + { \ + type::iterator it, en; \ + for( it = (list).begin(), en = (list).end(); it != en; ++it ) \ + delete *it; \ + (list).clear(); \ + } + +#endif // _WX_LISTH__ diff --git a/Externals/wxWidgets/include/wx/listbase.h b/Externals/wxWidgets/include/wx/listbase.h new file mode 100644 index 0000000000..1528647861 --- /dev/null +++ b/Externals/wxWidgets/include/wx/listbase.h @@ -0,0 +1,491 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/listbase.h +// Purpose: wxListCtrl class +// Author: Vadim Zeitlin +// Modified by: +// Created: 04.12.99 +// RCS-ID: $Id: listbase.h 46313 2007-06-03 22:38:28Z VZ $ +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_LISTBASE_H_BASE_ +#define _WX_LISTBASE_H_BASE_ + +#include "wx/colour.h" +#include "wx/font.h" +#include "wx/gdicmn.h" +#include "wx/event.h" + +// ---------------------------------------------------------------------------- +// types +// ---------------------------------------------------------------------------- + +// type of compare function for wxListCtrl sort operation +typedef int (wxCALLBACK *wxListCtrlCompare)(long item1, long item2, long sortData); + +// ---------------------------------------------------------------------------- +// wxListCtrl constants +// ---------------------------------------------------------------------------- + +// style flags +#define wxLC_VRULES 0x0001 +#define wxLC_HRULES 0x0002 + +#define wxLC_ICON 0x0004 +#define wxLC_SMALL_ICON 0x0008 +#define wxLC_LIST 0x0010 +#define wxLC_REPORT 0x0020 + +#define wxLC_ALIGN_TOP 0x0040 +#define wxLC_ALIGN_LEFT 0x0080 +#define wxLC_AUTOARRANGE 0x0100 +#define wxLC_VIRTUAL 0x0200 +#define wxLC_EDIT_LABELS 0x0400 +#define wxLC_NO_HEADER 0x0800 +#define wxLC_NO_SORT_HEADER 0x1000 +#define wxLC_SINGLE_SEL 0x2000 +#define wxLC_SORT_ASCENDING 0x4000 +#define wxLC_SORT_DESCENDING 0x8000 + +#define wxLC_MASK_TYPE (wxLC_ICON | wxLC_SMALL_ICON | wxLC_LIST | wxLC_REPORT) +#define wxLC_MASK_ALIGN (wxLC_ALIGN_TOP | wxLC_ALIGN_LEFT) +#define wxLC_MASK_SORT (wxLC_SORT_ASCENDING | wxLC_SORT_DESCENDING) + +// for compatibility only +#define wxLC_USER_TEXT wxLC_VIRTUAL + +// Omitted because +// (a) too much detail +// (b) not enough style flags +// (c) not implemented anyhow in the generic version +// +// #define wxLC_NO_SCROLL +// #define wxLC_NO_LABEL_WRAP +// #define wxLC_OWNERDRAW_FIXED +// #define wxLC_SHOW_SEL_ALWAYS + +// Mask flags to tell app/GUI what fields of wxListItem are valid +#define wxLIST_MASK_STATE 0x0001 +#define wxLIST_MASK_TEXT 0x0002 +#define wxLIST_MASK_IMAGE 0x0004 +#define wxLIST_MASK_DATA 0x0008 +#define wxLIST_SET_ITEM 0x0010 +#define wxLIST_MASK_WIDTH 0x0020 +#define wxLIST_MASK_FORMAT 0x0040 + +// State flags for indicating the state of an item +#define wxLIST_STATE_DONTCARE 0x0000 +#define wxLIST_STATE_DROPHILITED 0x0001 // MSW only +#define wxLIST_STATE_FOCUSED 0x0002 +#define wxLIST_STATE_SELECTED 0x0004 +#define wxLIST_STATE_CUT 0x0008 // MSW only +#define wxLIST_STATE_DISABLED 0x0010 // OS2 only +#define wxLIST_STATE_FILTERED 0x0020 // OS2 only +#define wxLIST_STATE_INUSE 0x0040 // OS2 only +#define wxLIST_STATE_PICKED 0x0080 // OS2 only +#define wxLIST_STATE_SOURCE 0x0100 // OS2 only + +// Hit test flags, used in HitTest +#define wxLIST_HITTEST_ABOVE 0x0001 // Above the client area. +#define wxLIST_HITTEST_BELOW 0x0002 // Below the client area. +#define wxLIST_HITTEST_NOWHERE 0x0004 // In the client area but below the last item. +#define wxLIST_HITTEST_ONITEMICON 0x0020 // On the bitmap associated with an item. +#define wxLIST_HITTEST_ONITEMLABEL 0x0080 // On the label (string) associated with an item. +#define wxLIST_HITTEST_ONITEMRIGHT 0x0100 // In the area to the right of an item. +#define wxLIST_HITTEST_ONITEMSTATEICON 0x0200 // On the state icon for a tree view item that is in a user-defined state. +#define wxLIST_HITTEST_TOLEFT 0x0400 // To the left of the client area. +#define wxLIST_HITTEST_TORIGHT 0x0800 // To the right of the client area. + +#define wxLIST_HITTEST_ONITEM (wxLIST_HITTEST_ONITEMICON | wxLIST_HITTEST_ONITEMLABEL | wxLIST_HITTEST_ONITEMSTATEICON) + +// GetSubItemRect constants +#define wxLIST_GETSUBITEMRECT_WHOLEITEM -1l + +// Flags for GetNextItem (MSW only except wxLIST_NEXT_ALL) +enum +{ + wxLIST_NEXT_ABOVE, // Searches for an item above the specified item + wxLIST_NEXT_ALL, // Searches for subsequent item by index + wxLIST_NEXT_BELOW, // Searches for an item below the specified item + wxLIST_NEXT_LEFT, // Searches for an item to the left of the specified item + wxLIST_NEXT_RIGHT // Searches for an item to the right of the specified item +}; + +// Alignment flags for Arrange (MSW only except wxLIST_ALIGN_LEFT) +enum +{ + wxLIST_ALIGN_DEFAULT, + wxLIST_ALIGN_LEFT, + wxLIST_ALIGN_TOP, + wxLIST_ALIGN_SNAP_TO_GRID +}; + +// Column format (MSW only except wxLIST_FORMAT_LEFT) +enum wxListColumnFormat +{ + wxLIST_FORMAT_LEFT, + wxLIST_FORMAT_RIGHT, + wxLIST_FORMAT_CENTRE, + wxLIST_FORMAT_CENTER = wxLIST_FORMAT_CENTRE +}; + +// Autosize values for SetColumnWidth +enum +{ + wxLIST_AUTOSIZE = -1, + wxLIST_AUTOSIZE_USEHEADER = -2 // partly supported by generic version +}; + +// Flag values for GetItemRect +enum +{ + wxLIST_RECT_BOUNDS, + wxLIST_RECT_ICON, + wxLIST_RECT_LABEL +}; + +// Flag values for FindItem (MSW only) +enum +{ + wxLIST_FIND_UP, + wxLIST_FIND_DOWN, + wxLIST_FIND_LEFT, + wxLIST_FIND_RIGHT +}; + +// ---------------------------------------------------------------------------- +// wxListItemAttr: a structure containing the visual attributes of an item +// ---------------------------------------------------------------------------- + +// TODO: this should be renamed to wxItemAttr or something general like this +// and used as base class for wxTextAttr which duplicates this class +// entirely currently +class WXDLLEXPORT wxListItemAttr +{ +public: + // ctors + wxListItemAttr() { } + wxListItemAttr(const wxColour& colText, + const wxColour& colBack, + const wxFont& font) + : m_colText(colText), m_colBack(colBack), m_font(font) + { + } + + // default copy ctor, assignment operator and dtor are ok + + + // setters + void SetTextColour(const wxColour& colText) { m_colText = colText; } + void SetBackgroundColour(const wxColour& colBack) { m_colBack = colBack; } + void SetFont(const wxFont& font) { m_font = font; } + + // accessors + bool HasTextColour() const { return m_colText.Ok(); } + bool HasBackgroundColour() const { return m_colBack.Ok(); } + bool HasFont() const { return m_font.Ok(); } + + const wxColour& GetTextColour() const { return m_colText; } + const wxColour& GetBackgroundColour() const { return m_colBack; } + const wxFont& GetFont() const { return m_font; } + + + // this is almost like assignment operator except it doesn't overwrite the + // fields unset in the source attribute + void AssignFrom(const wxListItemAttr& source) + { + if ( source.HasTextColour() ) + SetTextColour(source.GetTextColour()); + if ( source.HasBackgroundColour() ) + SetBackgroundColour(source.GetBackgroundColour()); + if ( source.HasFont() ) + SetFont(source.GetFont()); + } + +private: + wxColour m_colText, + m_colBack; + wxFont m_font; +}; + +// ---------------------------------------------------------------------------- +// wxListItem: the item or column info, used to exchange data with wxListCtrl +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxListItem : public wxObject +{ +public: + wxListItem() { Init(); m_attr = NULL; } + wxListItem(const wxListItem& item) + : wxObject(), + m_mask(item.m_mask), + m_itemId(item.m_itemId), + m_col(item.m_col), + m_state(item.m_state), + m_stateMask(item.m_stateMask), + m_text(item.m_text), + m_image(item.m_image), + m_data(item.m_data), + m_format(item.m_format), + m_width(item.m_width), + m_attr(NULL) + { + // copy list item attributes + if ( item.HasAttributes() ) + m_attr = new wxListItemAttr(*item.GetAttributes()); + } + virtual ~wxListItem() { delete m_attr; } + + // resetting + void Clear() { Init(); m_text.clear(); ClearAttributes(); } + void ClearAttributes() { if ( m_attr ) { delete m_attr; m_attr = NULL; } } + + // setters + void SetMask(long mask) + { m_mask = mask; } + void SetId(long id) + { m_itemId = id; } + void SetColumn(int col) + { m_col = col; } + void SetState(long state) + { m_mask |= wxLIST_MASK_STATE; m_state = state; m_stateMask |= state; } + void SetStateMask(long stateMask) + { m_stateMask = stateMask; } + void SetText(const wxString& text) + { m_mask |= wxLIST_MASK_TEXT; m_text = text; } + void SetImage(int image) + { m_mask |= wxLIST_MASK_IMAGE; m_image = image; } + void SetData(long data) + { m_mask |= wxLIST_MASK_DATA; m_data = data; } + void SetData(void *data) + { m_mask |= wxLIST_MASK_DATA; m_data = wxPtrToUInt(data); } + + void SetWidth(int width) + { m_mask |= wxLIST_MASK_WIDTH; m_width = width; } + void SetAlign(wxListColumnFormat align) + { m_mask |= wxLIST_MASK_FORMAT; m_format = align; } + + void SetTextColour(const wxColour& colText) + { Attributes().SetTextColour(colText); } + void SetBackgroundColour(const wxColour& colBack) + { Attributes().SetBackgroundColour(colBack); } + void SetFont(const wxFont& font) + { Attributes().SetFont(font); } + + // accessors + long GetMask() const { return m_mask; } + long GetId() const { return m_itemId; } + int GetColumn() const { return m_col; } + long GetState() const { return m_state & m_stateMask; } + const wxString& GetText() const { return m_text; } + int GetImage() const { return m_image; } + wxUIntPtr GetData() const { return m_data; } + + int GetWidth() const { return m_width; } + wxListColumnFormat GetAlign() const { return (wxListColumnFormat)m_format; } + + wxListItemAttr *GetAttributes() const { return m_attr; } + bool HasAttributes() const { return m_attr != NULL; } + + wxColour GetTextColour() const + { return HasAttributes() ? m_attr->GetTextColour() : wxNullColour; } + wxColour GetBackgroundColour() const + { return HasAttributes() ? m_attr->GetBackgroundColour() + : wxNullColour; } + wxFont GetFont() const + { return HasAttributes() ? m_attr->GetFont() : wxNullFont; } + + // this conversion is necessary to make old code using GetItem() to + // compile + operator long() const { return m_itemId; } + + // these members are public for compatibility + + long m_mask; // Indicates what fields are valid + long m_itemId; // The zero-based item position + int m_col; // Zero-based column, if in report mode + long m_state; // The state of the item + long m_stateMask;// Which flags of m_state are valid (uses same flags) + wxString m_text; // The label/header text + int m_image; // The zero-based index into an image list + wxUIntPtr m_data; // App-defined data + + // For columns only + int m_format; // left, right, centre + int m_width; // width of column + +#ifdef __WXPM__ + int m_miniImage; // handle to the mini image for OS/2 +#endif + +protected: + // creates m_attr if we don't have it yet + wxListItemAttr& Attributes() + { + if ( !m_attr ) + m_attr = new wxListItemAttr; + + return *m_attr; + } + + void Init() + { + m_mask = 0; + m_itemId = 0; + m_col = 0; + m_state = 0; + m_stateMask = 0; + m_image = -1; + m_data = 0; + + m_format = wxLIST_FORMAT_CENTRE; + m_width = 0; + } + + wxListItemAttr *m_attr; // optional pointer to the items style + +private: + // VZ: this is strange, we have a copy ctor but not operator=(), why? + wxListItem& operator=(const wxListItem& item); + + DECLARE_DYNAMIC_CLASS(wxListItem) +}; + +// ---------------------------------------------------------------------------- +// wxListEvent - the event class for the wxListCtrl notifications +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxListEvent : public wxNotifyEvent +{ +public: + wxListEvent(wxEventType commandType = wxEVT_NULL, int winid = 0) + : wxNotifyEvent(commandType, winid) + , m_code(0) + , m_oldItemIndex(0) + , m_itemIndex(0) + , m_col(0) + , m_pointDrag() + , m_item() + , m_editCancelled(false) + { } + + wxListEvent(const wxListEvent& event) + : wxNotifyEvent(event) + , m_code(event.m_code) + , m_oldItemIndex(event.m_oldItemIndex) + , m_itemIndex(event.m_itemIndex) + , m_col(event.m_col) + , m_pointDrag(event.m_pointDrag) + , m_item(event.m_item) + , m_editCancelled(event.m_editCancelled) + { } + + int GetKeyCode() const { return m_code; } + long GetIndex() const { return m_itemIndex; } + int GetColumn() const { return m_col; } + wxPoint GetPoint() const { return m_pointDrag; } + const wxString& GetLabel() const { return m_item.m_text; } + const wxString& GetText() const { return m_item.m_text; } + int GetImage() const { return m_item.m_image; } + long GetData() const { return wx_static_cast(long, m_item.m_data); } + long GetMask() const { return m_item.m_mask; } + const wxListItem& GetItem() const { return m_item; } + + // for wxEVT_COMMAND_LIST_CACHE_HINT only + long GetCacheFrom() const { return m_oldItemIndex; } + long GetCacheTo() const { return m_itemIndex; } + + // was label editing canceled? (for wxEVT_COMMAND_LIST_END_LABEL_EDIT only) + bool IsEditCancelled() const { return m_editCancelled; } + void SetEditCanceled(bool editCancelled) { m_editCancelled = editCancelled; } + + virtual wxEvent *Clone() const { return new wxListEvent(*this); } + +//protected: -- not for backwards compatibility + int m_code; + long m_oldItemIndex; // only for wxEVT_COMMAND_LIST_CACHE_HINT + long m_itemIndex; + int m_col; + wxPoint m_pointDrag; + + wxListItem m_item; + +protected: + bool m_editCancelled; + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxListEvent) +}; + +// ---------------------------------------------------------------------------- +// wxListCtrl event macros +// ---------------------------------------------------------------------------- + +BEGIN_DECLARE_EVENT_TYPES() + DECLARE_EVENT_TYPE(wxEVT_COMMAND_LIST_BEGIN_DRAG, 700) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_LIST_BEGIN_RDRAG, 701) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_LIST_BEGIN_LABEL_EDIT, 702) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_LIST_END_LABEL_EDIT, 703) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_LIST_DELETE_ITEM, 704) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_LIST_DELETE_ALL_ITEMS, 705) +#if WXWIN_COMPATIBILITY_2_4 + DECLARE_EVENT_TYPE(wxEVT_COMMAND_LIST_GET_INFO, 706) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_LIST_SET_INFO, 707) +#endif + DECLARE_EVENT_TYPE(wxEVT_COMMAND_LIST_ITEM_SELECTED, 708) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_LIST_ITEM_DESELECTED, 709) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_LIST_KEY_DOWN, 710) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_LIST_INSERT_ITEM, 711) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_LIST_COL_CLICK, 712) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_LIST_ITEM_RIGHT_CLICK, 713) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_LIST_ITEM_MIDDLE_CLICK, 714) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_LIST_ITEM_ACTIVATED, 715) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_LIST_CACHE_HINT, 716) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_LIST_COL_RIGHT_CLICK, 717) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_LIST_COL_BEGIN_DRAG, 718) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_LIST_COL_DRAGGING, 719) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_LIST_COL_END_DRAG, 720) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_LIST_ITEM_FOCUSED, 721) +END_DECLARE_EVENT_TYPES() + +typedef void (wxEvtHandler::*wxListEventFunction)(wxListEvent&); + +#define wxListEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxListEventFunction, &func) + +#define wx__DECLARE_LISTEVT(evt, id, fn) \ + wx__DECLARE_EVT1(wxEVT_COMMAND_LIST_ ## evt, id, wxListEventHandler(fn)) + +#define EVT_LIST_BEGIN_DRAG(id, fn) wx__DECLARE_LISTEVT(BEGIN_DRAG, id, fn) +#define EVT_LIST_BEGIN_RDRAG(id, fn) wx__DECLARE_LISTEVT(BEGIN_RDRAG, id, fn) +#define EVT_LIST_BEGIN_LABEL_EDIT(id, fn) wx__DECLARE_LISTEVT(BEGIN_LABEL_EDIT, id, fn) +#define EVT_LIST_END_LABEL_EDIT(id, fn) wx__DECLARE_LISTEVT(END_LABEL_EDIT, id, fn) +#define EVT_LIST_DELETE_ITEM(id, fn) wx__DECLARE_LISTEVT(DELETE_ITEM, id, fn) +#define EVT_LIST_DELETE_ALL_ITEMS(id, fn) wx__DECLARE_LISTEVT(DELETE_ALL_ITEMS, id, fn) +#define EVT_LIST_KEY_DOWN(id, fn) wx__DECLARE_LISTEVT(KEY_DOWN, id, fn) +#define EVT_LIST_INSERT_ITEM(id, fn) wx__DECLARE_LISTEVT(INSERT_ITEM, id, fn) + +#define EVT_LIST_COL_CLICK(id, fn) wx__DECLARE_LISTEVT(COL_CLICK, id, fn) +#define EVT_LIST_COL_RIGHT_CLICK(id, fn) wx__DECLARE_LISTEVT(COL_RIGHT_CLICK, id, fn) +#define EVT_LIST_COL_BEGIN_DRAG(id, fn) wx__DECLARE_LISTEVT(COL_BEGIN_DRAG, id, fn) +#define EVT_LIST_COL_DRAGGING(id, fn) wx__DECLARE_LISTEVT(COL_DRAGGING, id, fn) +#define EVT_LIST_COL_END_DRAG(id, fn) wx__DECLARE_LISTEVT(COL_END_DRAG, id, fn) + +#define EVT_LIST_ITEM_SELECTED(id, fn) wx__DECLARE_LISTEVT(ITEM_SELECTED, id, fn) +#define EVT_LIST_ITEM_DESELECTED(id, fn) wx__DECLARE_LISTEVT(ITEM_DESELECTED, id, fn) +#define EVT_LIST_ITEM_RIGHT_CLICK(id, fn) wx__DECLARE_LISTEVT(ITEM_RIGHT_CLICK, id, fn) +#define EVT_LIST_ITEM_MIDDLE_CLICK(id, fn) wx__DECLARE_LISTEVT(ITEM_MIDDLE_CLICK, id, fn) +#define EVT_LIST_ITEM_ACTIVATED(id, fn) wx__DECLARE_LISTEVT(ITEM_ACTIVATED, id, fn) +#define EVT_LIST_ITEM_FOCUSED(id, fn) wx__DECLARE_LISTEVT(ITEM_FOCUSED, id, fn) + +#define EVT_LIST_CACHE_HINT(id, fn) wx__DECLARE_LISTEVT(CACHE_HINT, id, fn) + + +#if WXWIN_COMPATIBILITY_2_4 +#define EVT_LIST_GET_INFO(id, fn) wx__DECLARE_LISTEVT(GET_INFO, id, fn) +#define EVT_LIST_SET_INFO(id, fn) wx__DECLARE_LISTEVT(SET_INFO, id, fn) +#endif + +#endif + // _WX_LISTCTRL_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/listbook.h b/Externals/wxWidgets/include/wx/listbook.h new file mode 100644 index 0000000000..b14ee4cdbc --- /dev/null +++ b/Externals/wxWidgets/include/wx/listbook.h @@ -0,0 +1,152 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/listbook.h +// Purpose: wxListbook: wxListCtrl and wxNotebook combination +// Author: Vadim Zeitlin +// Modified by: +// Created: 19.08.03 +// RCS-ID: $Id: listbook.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) 2003 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_LISTBOOK_H_ +#define _WX_LISTBOOK_H_ + +#include "wx/defs.h" + +#if wxUSE_LISTBOOK + +#include "wx/bookctrl.h" + +class WXDLLIMPEXP_FWD_CORE wxListView; +class WXDLLIMPEXP_FWD_CORE wxListEvent; + +extern WXDLLIMPEXP_CORE const wxEventType wxEVT_COMMAND_LISTBOOK_PAGE_CHANGED; +extern WXDLLIMPEXP_CORE const wxEventType wxEVT_COMMAND_LISTBOOK_PAGE_CHANGING; + +// wxListbook flags +#define wxLB_DEFAULT wxBK_DEFAULT +#define wxLB_TOP wxBK_TOP +#define wxLB_BOTTOM wxBK_BOTTOM +#define wxLB_LEFT wxBK_LEFT +#define wxLB_RIGHT wxBK_RIGHT +#define wxLB_ALIGN_MASK wxBK_ALIGN_MASK + +// ---------------------------------------------------------------------------- +// wxListbook +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxListbook : public wxBookCtrlBase +{ +public: + wxListbook() + { + Init(); + } + + wxListbook(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxEmptyString) + { + Init(); + + (void)Create(parent, id, pos, size, style, name); + } + + // quasi ctor + bool Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxEmptyString); + + + // overridden base class methods + virtual int GetSelection() const; + virtual bool SetPageText(size_t n, const wxString& strText); + virtual wxString GetPageText(size_t n) const; + virtual int GetPageImage(size_t n) const; + virtual bool SetPageImage(size_t n, int imageId); + virtual wxSize CalcSizeFromPage(const wxSize& sizePage) const; + virtual bool InsertPage(size_t n, + wxWindow *page, + const wxString& text, + bool bSelect = false, + int imageId = -1); + virtual int SetSelection(size_t n) { return DoSetSelection(n, SetSelection_SendEvent); } + virtual int ChangeSelection(size_t n) { return DoSetSelection(n); } + virtual int HitTest(const wxPoint& pt, long *flags = NULL) const; + virtual void SetImageList(wxImageList *imageList); + + virtual bool DeleteAllPages(); + + wxListView* GetListView() const { return (wxListView*)m_bookctrl; } + +protected: + virtual wxWindow *DoRemovePage(size_t page); + + // get the size which the list control should have + virtual wxSize GetControllerSize() const; + + void UpdateSelectedPage(size_t newsel); + + wxBookCtrlBaseEvent* CreatePageChangingEvent() const; + void MakeChangedEvent(wxBookCtrlBaseEvent &event); + + // event handlers + void OnListSelected(wxListEvent& event); + void OnSize(wxSizeEvent& event); + + // the currently selected page or wxNOT_FOUND if none + int m_selection; + +private: + // common part of all constructors + void Init(); + + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS_NO_COPY(wxListbook) +}; + +// ---------------------------------------------------------------------------- +// listbook event class and related stuff +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxListbookEvent : public wxBookCtrlBaseEvent +{ +public: + wxListbookEvent(wxEventType commandType = wxEVT_NULL, int id = 0, + int nSel = wxNOT_FOUND, int nOldSel = wxNOT_FOUND) + : wxBookCtrlBaseEvent(commandType, id, nSel, nOldSel) + { + } + + wxListbookEvent(const wxListbookEvent& event) + : wxBookCtrlBaseEvent(event) + { + } + + virtual wxEvent *Clone() const { return new wxListbookEvent(*this); } + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxListbookEvent) +}; + +typedef void (wxEvtHandler::*wxListbookEventFunction)(wxListbookEvent&); + +#define wxListbookEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxListbookEventFunction, &func) + +#define EVT_LISTBOOK_PAGE_CHANGED(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_COMMAND_LISTBOOK_PAGE_CHANGED, winid, wxListbookEventHandler(fn)) + +#define EVT_LISTBOOK_PAGE_CHANGING(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_COMMAND_LISTBOOK_PAGE_CHANGING, winid, wxListbookEventHandler(fn)) + +#endif // wxUSE_LISTBOOK + +#endif // _WX_LISTBOOK_H_ diff --git a/Externals/wxWidgets/include/wx/listbox.h b/Externals/wxWidgets/include/wx/listbox.h new file mode 100644 index 0000000000..a3b98fc481 --- /dev/null +++ b/Externals/wxWidgets/include/wx/listbox.h @@ -0,0 +1,166 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/listbox.h +// Purpose: wxListBox class interface +// Author: Vadim Zeitlin +// Modified by: +// Created: 22.10.99 +// RCS-ID: $Id: listbox.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_LISTBOX_H_BASE_ +#define _WX_LISTBOX_H_BASE_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/defs.h" + +#if wxUSE_LISTBOX + +#include "wx/ctrlsub.h" // base class + +// forward declarations are enough here +class WXDLLIMPEXP_FWD_BASE wxArrayInt; +class WXDLLIMPEXP_FWD_BASE wxArrayString; + +// ---------------------------------------------------------------------------- +// global data +// ---------------------------------------------------------------------------- + +extern WXDLLEXPORT_DATA(const wxChar) wxListBoxNameStr[]; + +// ---------------------------------------------------------------------------- +// wxListBox interface is defined by the class wxListBoxBase +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxListBoxBase : public wxControlWithItems +{ +public: + wxListBoxBase() { } + virtual ~wxListBoxBase(); + + // all generic methods are in wxControlWithItems, except for the following + // ones which are not yet implemented by wxChoice/wxComboBox + void Insert(const wxString& item, unsigned int pos) + { /* return*/ wxControlWithItems::Insert(item,pos); } + void Insert(const wxString& item, unsigned int pos, void *clientData) + { /* return*/ wxControlWithItems::Insert(item,pos,clientData); } + void Insert(const wxString& item, unsigned int pos, wxClientData *clientData) + { /* return*/ wxControlWithItems::Insert(item,pos,clientData); } + + void InsertItems(unsigned int nItems, const wxString *items, unsigned int pos); + void InsertItems(const wxArrayString& items, unsigned int pos) + { DoInsertItems(items, pos); } + + void Set(int n, const wxString* items, void **clientData = NULL); + void Set(const wxArrayString& items, void **clientData = NULL) + { DoSetItems(items, clientData); } + + // multiple selection logic + virtual bool IsSelected(int n) const = 0; + virtual void SetSelection(int n) { DoSetSelection(n, true); } + void SetSelection(int n, bool select) { DoSetSelection(n, select); } + void Deselect(int n) { DoSetSelection(n, false); } + void DeselectAll(int itemToLeaveSelected = -1); + + virtual bool SetStringSelection(const wxString& s, bool select); + virtual bool SetStringSelection(const wxString& s) + { + return SetStringSelection(s, true); + } + + // works for single as well as multiple selection listboxes (unlike + // GetSelection which only works for listboxes with single selection) + virtual int GetSelections(wxArrayInt& aSelections) const = 0; + + // set the specified item at the first visible item or scroll to max + // range. + void SetFirstItem(int n) { DoSetFirstItem(n); } + void SetFirstItem(const wxString& s); + + // ensures that the given item is visible scrolling the listbox if + // necessary + virtual void EnsureVisible(int n); + + // a combination of Append() and EnsureVisible(): appends the item to the + // listbox and ensures that it is visible i.e. not scrolled out of view + void AppendAndEnsureVisible(const wxString& s); + + // return true if the listbox allows multiple selection + bool HasMultipleSelection() const + { + return (m_windowStyle & wxLB_MULTIPLE) || + (m_windowStyle & wxLB_EXTENDED); + } + + // return true if this listbox is sorted + bool IsSorted() const { return (m_windowStyle & wxLB_SORT) != 0; } + + // emulate selecting or deselecting the item event.GetInt() (depending on + // event.GetExtraLong()) + void Command(wxCommandEvent& event); + + // returns the item number at a point or wxNOT_FOUND + int HitTest(const wxPoint& point) const { return DoListHitTest(point); } + +#if WXWIN_COMPATIBILITY_2_6 + // compatibility - these functions are deprecated, use the new ones + // instead + wxDEPRECATED( bool Selected(int n) const ); +#endif // WXWIN_COMPATIBILITY_2_6 + +protected: + // NB: due to wxGTK implementation details, DoInsert() is implemented + // using DoInsertItems() and not the other way round + virtual int DoInsert(const wxString& item, unsigned int pos) + { InsertItems(1, &item, pos); return pos; } + + // to be implemented in derived classes + virtual void DoInsertItems(const wxArrayString& items, unsigned int pos) = 0; + virtual void DoSetItems(const wxArrayString& items, void **clientData) = 0; + + virtual void DoSetFirstItem(int n) = 0; + + virtual void DoSetSelection(int n, bool select) = 0; + + // there is already wxWindow::DoHitTest() so call this one differently + virtual int DoListHitTest(const wxPoint& WXUNUSED(point)) const + { return wxNOT_FOUND; } + + + DECLARE_NO_COPY_CLASS(wxListBoxBase) +}; + +#if WXWIN_COMPATIBILITY_2_6 + inline bool wxListBoxBase::Selected(int n) const { return IsSelected(n); } +#endif // WXWIN_COMPATIBILITY_2_6 + +// ---------------------------------------------------------------------------- +// include the platform-specific class declaration +// ---------------------------------------------------------------------------- + +#if defined(__WXUNIVERSAL__) + #include "wx/univ/listbox.h" +#elif defined(__WXMSW__) + #include "wx/msw/listbox.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/listbox.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/listbox.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/listbox.h" +#elif defined(__WXMAC__) + #include "wx/mac/listbox.h" +#elif defined(__WXPM__) + #include "wx/os2/listbox.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/listbox.h" +#endif + +#endif // wxUSE_LISTBOX + +#endif + // _WX_LISTBOX_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/listctrl.h b/Externals/wxWidgets/include/wx/listctrl.h new file mode 100644 index 0000000000..efccc7300f --- /dev/null +++ b/Externals/wxWidgets/include/wx/listctrl.h @@ -0,0 +1,110 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/listctrl.h +// Purpose: wxListCtrl class +// Author: Vadim Zeitlin +// Modified by: +// Created: 04.12.99 +// RCS-ID: $Id: listctrl.h 46432 2007-06-13 03:46:20Z SC $ +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_LISTCTRL_H_BASE_ +#define _WX_LISTCTRL_H_BASE_ + +#include "wx/defs.h" // headers should include this before first wxUSE_XXX check + +#if wxUSE_LISTCTRL + +#include "wx/listbase.h" + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +extern WXDLLEXPORT_DATA(const wxChar) wxListCtrlNameStr[]; + +// ---------------------------------------------------------------------------- +// include the wxListCtrl class declaration +// ---------------------------------------------------------------------------- + +#if defined(__WIN32__) && !defined(__WXUNIVERSAL__) + #include "wx/msw/listctrl.h" +#elif defined(__WXMAC__) && !defined(__WXUNIVERSAL__) + #include "wx/mac/carbon/listctrl.h" +#else + #include "wx/generic/listctrl.h" +#endif + +// ---------------------------------------------------------------------------- +// wxListView: a class which provides a better API for list control +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxListView : public wxListCtrl +{ +public: + wxListView() { } + wxListView( wxWindow *parent, + wxWindowID winid = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxLC_REPORT, + const wxValidator& validator = wxDefaultValidator, + const wxString &name = wxListCtrlNameStr) + { + Create(parent, winid, pos, size, style, validator, name); + } + + // focus/selection stuff + // --------------------- + + // [de]select an item + void Select(long n, bool on = true) + { + SetItemState(n, on ? wxLIST_STATE_SELECTED : 0, wxLIST_STATE_SELECTED); + } + + // focus and show the given item + void Focus(long index) + { + SetItemState(index, wxLIST_STATE_FOCUSED, wxLIST_STATE_FOCUSED); + EnsureVisible(index); + } + + // get the currently focused item or -1 if none + long GetFocusedItem() const + { + return GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_FOCUSED); + } + + // get first and subsequent selected items, return -1 when no more + long GetNextSelected(long item) const + { return GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); } + long GetFirstSelected() const + { return GetNextSelected(-1); } + + // return true if the item is selected + bool IsSelected(long index) const + { return GetItemState(index, wxLIST_STATE_SELECTED) != 0; } + + // columns + // ------- + + void SetColumnImage(int col, int image) + { + wxListItem item; + item.SetMask(wxLIST_MASK_IMAGE); + item.SetImage(image); + SetColumn(col, item); + } + + void ClearColumnImage(int col) { SetColumnImage(col, -1); } + +private: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxListView) +}; + +#endif // wxUSE_LISTCTRL + +#endif + // _WX_LISTCTRL_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/listimpl.cpp b/Externals/wxWidgets/include/wx/listimpl.cpp new file mode 100644 index 0000000000..d05fda13ed --- /dev/null +++ b/Externals/wxWidgets/include/wx/listimpl.cpp @@ -0,0 +1,39 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: listimpl.cpp +// Purpose: second-part of macro based implementation of template lists +// Author: Vadim Zeitlin +// Modified by: +// Created: 16/11/98 +// RCS-ID: $Id: listimpl.cpp 38893 2006-04-24 17:59:10Z VZ $ +// Copyright: (c) 1998 Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#if wxUSE_STL + +#undef WX_DEFINE_LIST +#define WX_DEFINE_LIST(name) \ + void _WX_LIST_HELPER_##name::DeleteFunction( _WX_LIST_ITEM_TYPE_##name X )\ + { \ + delete X; \ + } \ + name::BaseListType name::EmptyList; + +#else // !wxUSE_STL + + #define _DEFINE_LIST(T, name) \ + void wx##name##Node::DeleteData() \ + { \ + delete (T *)GetData(); \ + } + + // redefine the macro so that now it will generate the class implementation + // old value would provoke a compile-time error if this file is not included + #undef WX_DEFINE_LIST + #define WX_DEFINE_LIST(name) _DEFINE_LIST(_WX_LIST_ITEM_TYPE_##name, name) + + // don't pollute preprocessor's name space + //#undef _DEFINE_LIST + +#endif // wxUSE_STL/!wxUSE_STL + diff --git a/Externals/wxWidgets/include/wx/log.h b/Externals/wxWidgets/include/wx/log.h new file mode 100644 index 0000000000..10d1990958 --- /dev/null +++ b/Externals/wxWidgets/include/wx/log.h @@ -0,0 +1,649 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/log.h +// Purpose: Assorted wxLogXXX functions, and wxLog (sink for logs) +// Author: Vadim Zeitlin +// Modified by: +// Created: 29/01/98 +// RCS-ID: $Id: log.h 49804 2007-11-10 01:09:42Z VZ $ +// Copyright: (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_LOG_H_ +#define _WX_LOG_H_ + +#include "wx/defs.h" + +// ---------------------------------------------------------------------------- +// common constants for use in wxUSE_LOG/!wxUSE_LOG +// ---------------------------------------------------------------------------- + +// the trace masks have been superceded by symbolic trace constants, they're +// for compatibility only andwill be removed soon - do NOT use them + +// meaning of different bits of the trace mask (which allows selectively +// enable/disable some trace messages) +#define wxTraceMemAlloc 0x0001 // trace memory allocation (new/delete) +#define wxTraceMessages 0x0002 // trace window messages/X callbacks +#define wxTraceResAlloc 0x0004 // trace GDI resource allocation +#define wxTraceRefCount 0x0008 // trace various ref counting operations + +#ifdef __WXMSW__ + #define wxTraceOleCalls 0x0100 // OLE interface calls +#endif + +// ---------------------------------------------------------------------------- +// types +// ---------------------------------------------------------------------------- + +// NB: these types are needed even if wxUSE_LOG == 0 +typedef unsigned long wxTraceMask; +typedef unsigned long wxLogLevel; + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/string.h" + +#if wxUSE_LOG + +#include "wx/arrstr.h" + +#ifndef __WXWINCE__ + #include <time.h> // for time_t +#endif + +#include "wx/dynarray.h" + +#ifndef wxUSE_LOG_DEBUG +# ifdef __WXDEBUG__ +# define wxUSE_LOG_DEBUG 1 +# else // !__WXDEBUG__ +# define wxUSE_LOG_DEBUG 0 +# endif +#endif + +// ---------------------------------------------------------------------------- +// forward declarations +// ---------------------------------------------------------------------------- + +#if wxUSE_GUI + class WXDLLIMPEXP_FWD_CORE wxTextCtrl; + class WXDLLIMPEXP_FWD_CORE wxLogFrame; + class WXDLLIMPEXP_FWD_CORE wxFrame; + class WXDLLIMPEXP_FWD_CORE wxWindow; +#endif // wxUSE_GUI + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// different standard log levels (you may also define your own) +enum +{ + wxLOG_FatalError, // program can't continue, abort immediately + wxLOG_Error, // a serious error, user must be informed about it + wxLOG_Warning, // user is normally informed about it but may be ignored + wxLOG_Message, // normal message (i.e. normal output of a non GUI app) + wxLOG_Status, // informational: might go to the status line of GUI app + wxLOG_Info, // informational message (a.k.a. 'Verbose') + wxLOG_Debug, // never shown to the user, disabled in release mode + wxLOG_Trace, // trace messages are also only enabled in debug mode + wxLOG_Progress, // used for progress indicator (not yet) + wxLOG_User = 100, // user defined levels start here + wxLOG_Max = 10000 +}; + +// symbolic trace masks - wxLogTrace("foo", "some trace message...") will be +// discarded unless the string "foo" has been added to the list of allowed +// ones with AddTraceMask() + +#define wxTRACE_MemAlloc wxT("memalloc") // trace memory allocation (new/delete) +#define wxTRACE_Messages wxT("messages") // trace window messages/X callbacks +#define wxTRACE_ResAlloc wxT("resalloc") // trace GDI resource allocation +#define wxTRACE_RefCount wxT("refcount") // trace various ref counting operations + +#ifdef __WXMSW__ + #define wxTRACE_OleCalls wxT("ole") // OLE interface calls +#endif + +#include "wx/iosfwrap.h" + +// ---------------------------------------------------------------------------- +// derive from this class to redirect (or suppress, or ...) log messages +// normally, only a single instance of this class exists but it's not enforced +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxLog +{ +public: + // ctor + wxLog(){} + + // these functions allow to completely disable all log messages + + // is logging disabled now? + static bool IsEnabled() { return ms_doLog; } + + // change the flag state, return the previous one + static bool EnableLogging(bool doIt = true) + { bool doLogOld = ms_doLog; ms_doLog = doIt; return doLogOld; } + + // static sink function - see DoLog() for function to overload in the + // derived classes + static void OnLog(wxLogLevel level, const wxChar *szString, time_t t); + + // message buffering + + // flush shows all messages if they're not logged immediately (FILE + // and iostream logs don't need it, but wxGuiLog does to avoid showing + // 17 modal dialogs one after another) + virtual void Flush(); + + // flush the active target if any + static void FlushActive() + { + if ( !ms_suspendCount ) + { + wxLog *log = GetActiveTarget(); + if ( log ) + log->Flush(); + } + } + + // only one sink is active at each moment + // get current log target, will call wxApp::CreateLogTarget() to + // create one if none exists + static wxLog *GetActiveTarget(); + + // change log target, pLogger may be NULL + static wxLog *SetActiveTarget(wxLog *pLogger); + + // suspend the message flushing of the main target until the next call + // to Resume() - this is mainly for internal use (to prevent wxYield() + // from flashing the messages) + static void Suspend() { ms_suspendCount++; } + + // must be called for each Suspend()! + static void Resume() { ms_suspendCount--; } + + // functions controlling the default wxLog behaviour + // verbose mode is activated by standard command-line '-verbose' + // option + static void SetVerbose(bool bVerbose = true) { ms_bVerbose = bVerbose; } + + // Set log level. Log messages with level > logLevel will not be logged. + static void SetLogLevel(wxLogLevel logLevel) { ms_logLevel = logLevel; } + +#if wxABI_VERSION >= 20805 /* 2.8.5+ only */ + // should GetActiveTarget() try to create a new log object if the + // current is NULL? + static void DontCreateOnDemand(); +#endif + + // Make GetActiveTarget() create a new log object again. + static void DoCreateOnDemand(); + + // log the count of repeating messages instead of logging the messages + // multiple times + static void SetRepetitionCounting(bool bRepetCounting = true) + { ms_bRepetCounting = bRepetCounting; } + + // gets duplicate counting status + static bool GetRepetitionCounting() { return ms_bRepetCounting; } + + // trace mask (see wxTraceXXX constants for details) + static void SetTraceMask(wxTraceMask ulMask) { ms_ulTraceMask = ulMask; } + + // add string trace mask + static void AddTraceMask(const wxString& str) + { ms_aTraceMasks.push_back(str); } + + // add string trace mask + static void RemoveTraceMask(const wxString& str); + + // remove all string trace masks + static void ClearTraceMasks(); + + // get string trace masks + static const wxArrayString &GetTraceMasks() { return ms_aTraceMasks; } + + // sets the timestamp string: this is used as strftime() format string + // for the log targets which add time stamps to the messages - set it + // to NULL to disable time stamping completely. + static void SetTimestamp(const wxChar *ts) { ms_timestamp = ts; } + + + // accessors + + // gets the verbose status + static bool GetVerbose() { return ms_bVerbose; } + + // get trace mask + static wxTraceMask GetTraceMask() { return ms_ulTraceMask; } + + // is this trace mask in the list? + static bool IsAllowedTraceMask(const wxChar *mask); + + // return the current loglevel limit + static wxLogLevel GetLogLevel() { return ms_logLevel; } + + // get the current timestamp format string (may be NULL) + static const wxChar *GetTimestamp() { return ms_timestamp; } + + + // helpers + + // put the time stamp into the string if ms_timestamp != NULL (don't + // change it otherwise) + static void TimeStamp(wxString *str); + + // make dtor virtual for all derived classes + virtual ~wxLog(); + + + // this method exists for backwards compatibility only, don't use + bool HasPendingMessages() const { return true; } + +#if WXWIN_COMPATIBILITY_2_6 + // this function doesn't do anything any more, don't call it + wxDEPRECATED( static wxChar *SetLogBuffer(wxChar *buf, size_t size = 0) ); +#endif + +protected: + // the logging functions that can be overriden + + // default DoLog() prepends the time stamp and a prefix corresponding + // to the message to szString and then passes it to DoLogString() + virtual void DoLog(wxLogLevel level, const wxChar *szString, time_t t); + + // default DoLogString does nothing but is not pure virtual because if + // you override DoLog() you might not need it at all + virtual void DoLogString(const wxChar *szString, time_t t); + + // log a line containing the number of times the previous message was + // repeated and returns this number (which can be 0) + static unsigned DoLogNumberOfRepeats(); + +private: + // static variables + // ---------------- + + // traditional behaviour or counting repetitions + static bool ms_bRepetCounting; + static wxString ms_prevString; // previous message that was logged + // how many times the previous message was logged + static unsigned ms_prevCounter; + static time_t ms_prevTimeStamp;// timestamp of the previous message + static wxLogLevel ms_prevLevel; // level of the previous message + + static wxLog *ms_pLogger; // currently active log sink + static bool ms_doLog; // false => all logging disabled + static bool ms_bAutoCreate; // create new log targets on demand? + static bool ms_bVerbose; // false => ignore LogInfo messages + + static wxLogLevel ms_logLevel; // limit logging to levels <= ms_logLevel + + static size_t ms_suspendCount; // if positive, logs are not flushed + + // format string for strftime(), if NULL, time stamping log messages is + // disabled + static const wxChar *ms_timestamp; + + static wxTraceMask ms_ulTraceMask; // controls wxLogTrace behaviour + static wxArrayString ms_aTraceMasks; // more powerful filter for wxLogTrace + + + // this is the replacement of DoLogNumberOfRepeats() (which has to be kept + // to avoid breaking ABI in this version) + unsigned LogLastRepetitionCountIfNeeded(); +}; + +// ---------------------------------------------------------------------------- +// "trivial" derivations of wxLog +// ---------------------------------------------------------------------------- + +// log everything to a buffer +class WXDLLIMPEXP_BASE wxLogBuffer : public wxLog +{ +public: + wxLogBuffer() { } + + // get the string contents with all messages logged + const wxString& GetBuffer() const { return m_str; } + + // show the buffer contents to the user in the best possible way (this uses + // wxMessageOutputMessageBox) and clear it + virtual void Flush(); + +protected: + virtual void DoLog(wxLogLevel level, const wxChar *szString, time_t t); + virtual void DoLogString(const wxChar *szString, time_t t); + +private: + wxString m_str; + + DECLARE_NO_COPY_CLASS(wxLogBuffer) +}; + + +// log everything to a "FILE *", stderr by default +class WXDLLIMPEXP_BASE wxLogStderr : public wxLog +{ +public: + // redirect log output to a FILE + wxLogStderr(FILE *fp = (FILE *) NULL); + +protected: + // implement sink function + virtual void DoLogString(const wxChar *szString, time_t t); + + FILE *m_fp; + + DECLARE_NO_COPY_CLASS(wxLogStderr) +}; + +#if wxUSE_STD_IOSTREAM + +// log everything to an "ostream", cerr by default +class WXDLLIMPEXP_BASE wxLogStream : public wxLog +{ +public: + // redirect log output to an ostream + wxLogStream(wxSTD ostream *ostr = (wxSTD ostream *) NULL); + +protected: + // implement sink function + virtual void DoLogString(const wxChar *szString, time_t t); + + // using ptr here to avoid including <iostream.h> from this file + wxSTD ostream *m_ostr; +}; + +#endif // wxUSE_STD_IOSTREAM + +// ---------------------------------------------------------------------------- +// /dev/null log target: suppress logging until this object goes out of scope +// ---------------------------------------------------------------------------- + +// example of usage: +/* + void Foo() + { + wxFile file; + + // wxFile.Open() normally complains if file can't be opened, we don't + // want it + wxLogNull logNo; + + if ( !file.Open("bar") ) + ... process error ourselves ... + + // ~wxLogNull called, old log sink restored + } + */ +class WXDLLIMPEXP_BASE wxLogNull +{ +public: + wxLogNull() : m_flagOld(wxLog::EnableLogging(false)) { } + ~wxLogNull() { (void)wxLog::EnableLogging(m_flagOld); } + +private: + bool m_flagOld; // the previous value of the wxLog::ms_doLog +}; + +// ---------------------------------------------------------------------------- +// chaining log target: installs itself as a log target and passes all +// messages to the real log target given to it in the ctor but also forwards +// them to the previously active one +// +// note that you don't have to call SetActiveTarget() with this class, it +// does it itself in its ctor +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxLogChain : public wxLog +{ +public: + wxLogChain(wxLog *logger); + virtual ~wxLogChain(); + + // change the new log target + void SetLog(wxLog *logger); + + // this can be used to temporarily disable (and then reenable) passing + // messages to the old logger (by default we do pass them) + void PassMessages(bool bDoPass) { m_bPassMessages = bDoPass; } + + // are we passing the messages to the previous log target? + bool IsPassingMessages() const { return m_bPassMessages; } + + // return the previous log target (may be NULL) + wxLog *GetOldLog() const { return m_logOld; } + + // override base class version to flush the old logger as well + virtual void Flush(); + + // call to avoid destroying the old log target +#if wxABI_VERSION >= 20805 /* 2.8.5+ only */ + void DetachOldLog() { m_logOld = NULL; } +#endif + +protected: + // pass the chain to the old logger if needed + virtual void DoLog(wxLogLevel level, const wxChar *szString, time_t t); + +private: + // the current log target + wxLog *m_logNew; + + // the previous log target + wxLog *m_logOld; + + // do we pass the messages to the old logger? + bool m_bPassMessages; + + DECLARE_NO_COPY_CLASS(wxLogChain) +}; + +// a chain log target which uses itself as the new logger +class WXDLLIMPEXP_BASE wxLogPassThrough : public wxLogChain +{ +public: + wxLogPassThrough(); + +private: + DECLARE_NO_COPY_CLASS(wxLogPassThrough) +}; + +#if wxUSE_GUI + // include GUI log targets: + #include "wx/generic/logg.h" +#endif // wxUSE_GUI + +// ============================================================================ +// global functions +// ============================================================================ + +// ---------------------------------------------------------------------------- +// Log functions should be used by application instead of stdio, iostream &c +// for log messages for easy redirection +// ---------------------------------------------------------------------------- + +// ---------------------------------------------------------------------------- +// get error code/error message from system in a portable way +// ---------------------------------------------------------------------------- + +// return the last system error code +WXDLLIMPEXP_BASE unsigned long wxSysErrorCode(); + +// return the error message for given (or last if 0) error code +WXDLLIMPEXP_BASE const wxChar* wxSysErrorMsg(unsigned long nErrCode = 0); + +// ---------------------------------------------------------------------------- +// define wxLog<level> +// ---------------------------------------------------------------------------- + +#define DECLARE_LOG_FUNCTION(level) \ +extern void WXDLLIMPEXP_BASE wxVLog##level(const wxChar *szFormat, \ + va_list argptr); \ +extern void WXDLLIMPEXP_BASE wxLog##level(const wxChar *szFormat, \ + ...) ATTRIBUTE_PRINTF_1 +#define DECLARE_LOG_FUNCTION2_EXP(level, argclass, arg, expdecl) \ +extern void expdecl wxVLog##level(argclass arg, \ + const wxChar *szFormat, \ + va_list argptr); \ +extern void expdecl wxLog##level(argclass arg, \ + const wxChar *szFormat, \ + ...) ATTRIBUTE_PRINTF_2 +#else // !wxUSE_LOG + +// log functions do nothing at all +#define DECLARE_LOG_FUNCTION(level) \ +inline void wxVLog##level(const wxChar *WXUNUSED(szFormat), \ + va_list WXUNUSED(argptr)) { } \ +inline void wxLog##level(const wxChar *WXUNUSED(szFormat), \ + ...) { } +#define DECLARE_LOG_FUNCTION2_EXP(level, argclass, arg, expdecl) \ +inline void wxVLog##level(argclass WXUNUSED(arg), \ + const wxChar *WXUNUSED(szFormat), \ + va_list WXUNUSED(argptr)) {} \ +inline void wxLog##level(argclass WXUNUSED(arg), \ + const wxChar *WXUNUSED(szFormat), \ + ...) { } + +// Empty Class to fake wxLogNull +class WXDLLIMPEXP_BASE wxLogNull +{ +public: + wxLogNull() { } +}; + +// Dummy macros to replace some functions. +#define wxSysErrorCode() (unsigned long)0 +#define wxSysErrorMsg( X ) (const wxChar*)NULL + +// Fake symbolic trace masks... for those that are used frequently +#define wxTRACE_OleCalls wxEmptyString // OLE interface calls + +#endif // wxUSE_LOG/!wxUSE_LOG + +#define DECLARE_LOG_FUNCTION2(level, argclass, arg) \ + DECLARE_LOG_FUNCTION2_EXP(level, argclass, arg, WXDLLIMPEXP_BASE) + + +// a generic function for all levels (level is passes as parameter) +DECLARE_LOG_FUNCTION2(Generic, wxLogLevel, level); + +// one function per each level +DECLARE_LOG_FUNCTION(FatalError); +DECLARE_LOG_FUNCTION(Error); +DECLARE_LOG_FUNCTION(Warning); +DECLARE_LOG_FUNCTION(Message); +DECLARE_LOG_FUNCTION(Info); +DECLARE_LOG_FUNCTION(Verbose); + +// this function sends the log message to the status line of the top level +// application frame, if any +DECLARE_LOG_FUNCTION(Status); + +#if wxUSE_GUI + // this one is the same as previous except that it allows to explicitly + class WXDLLIMPEXP_FWD_CORE wxFrame; + // specify the frame to which the output should go + DECLARE_LOG_FUNCTION2_EXP(Status, wxFrame *, pFrame, WXDLLIMPEXP_CORE); +#endif // wxUSE_GUI + +// additional one: as wxLogError, but also logs last system call error code +// and the corresponding error message if available +DECLARE_LOG_FUNCTION(SysError); + +// and another one which also takes the error code (for those broken APIs +// that don't set the errno (like registry APIs in Win32)) +DECLARE_LOG_FUNCTION2(SysError, long, lErrCode); + +// debug functions do nothing in release mode +#if wxUSE_LOG && wxUSE_LOG_DEBUG + DECLARE_LOG_FUNCTION(Debug); + + // there is no more unconditional LogTrace: it is not different from + // LogDebug and it creates overload ambiguities + //DECLARE_LOG_FUNCTION(Trace); + + // this version only logs the message if the mask had been added to the + // list of masks with AddTraceMask() + DECLARE_LOG_FUNCTION2(Trace, const wxChar *, mask); + + // and this one does nothing if all of level bits are not set in + // wxLog::GetActive()->GetTraceMask() -- it's deprecated in favour of + // string identifiers + DECLARE_LOG_FUNCTION2(Trace, wxTraceMask, mask); +#else //!debug || !wxUSE_LOG + // these functions do nothing in release builds, but don't define them as + // nothing as it could result in different code structure in debug and + // release and this could result in trouble when these macros are used + // inside if/else + // + // note that making wxVLogDebug/Trace() themselves (empty inline) functions + // is a bad idea as some compilers are stupid enough to not inline even + // empty functions if their parameters are complicated enough, but by + // defining them as an empty inline function we ensure that even dumbest + // compilers optimise them away + inline void wxLogNop() { } + + #define wxVLogDebug(fmt, valist) wxLogNop() + #define wxVLogTrace(mask, fmt, valist) wxLogNop() + + #ifdef HAVE_VARIADIC_MACROS + // unlike the inline functions below, this completely removes the + // wxLogXXX calls from the object file: + #define wxLogDebug(fmt, ...) wxLogNop() + #define wxLogTrace(mask, fmt, ...) wxLogNop() + #else // !HAVE_VARIADIC_MACROS + // note that leaving out "fmt" in the vararg functions provokes a warning + // from SGI CC: "the last argument of the varargs function is unnamed" + inline void wxLogDebug(const wxChar *fmt, ...) { wxUnusedVar(fmt); } + inline void wxLogTrace(wxTraceMask, const wxChar *fmt, ...) { wxUnusedVar(fmt); } + inline void wxLogTrace(const wxChar *, const wxChar *fmt, ...) { wxUnusedVar(fmt); } + #endif // HAVE_VARIADIC_MACROS/!HAVE_VARIADIC_MACROS +#endif // debug/!debug + +// wxLogFatalError helper: show the (fatal) error to the user in a safe way, +// i.e. without using wxMessageBox() for example because it could crash +void WXDLLIMPEXP_BASE +wxSafeShowMessage(const wxString& title, const wxString& text); + +// ---------------------------------------------------------------------------- +// debug only logging functions: use them with API name and error code +// ---------------------------------------------------------------------------- + +#ifdef __WXDEBUG__ + // make life easier for people using VC++ IDE: clicking on the message + // will take us immediately to the place of the failed API +#ifdef __VISUALC__ + #define wxLogApiError(api, rc) \ + wxLogDebug(wxT("%s(%d): '%s' failed with error 0x%08lx (%s)."), \ + __TFILE__, __LINE__, api, \ + (long)rc, wxSysErrorMsg(rc)) +#else // !VC++ + #define wxLogApiError(api, rc) \ + wxLogDebug(wxT("In file %s at line %d: '%s' failed with ") \ + wxT("error 0x%08lx (%s)."), \ + __TFILE__, __LINE__, api, \ + (long)rc, wxSysErrorMsg(rc)) +#endif // VC++/!VC++ + + #define wxLogLastError(api) wxLogApiError(api, wxSysErrorCode()) + +#else //!debug + #define wxLogApiError(api, err) wxLogNop() + #define wxLogLastError(api) wxLogNop() +#endif //debug/!debug + +// wxCocoa has additiional trace masks +#if defined(__WXCOCOA__) +#include "wx/cocoa/log.h" +#endif + +#endif // _WX_LOG_H_ + diff --git a/Externals/wxWidgets/include/wx/longlong.h b/Externals/wxWidgets/include/wx/longlong.h new file mode 100644 index 0000000000..e350bf67ee --- /dev/null +++ b/Externals/wxWidgets/include/wx/longlong.h @@ -0,0 +1,1080 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/longlong.h +// Purpose: declaration of wxLongLong class - best implementation of a 64 +// bit integer for the current platform. +// Author: Jeffrey C. Ollie <jeff@ollie.clive.ia.us>, Vadim Zeitlin +// Modified by: +// Created: 10.02.99 +// RCS-ID: $Id: longlong.h 40658 2006-08-18 15:27:30Z JS $ +// Copyright: (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_LONGLONG_H +#define _WX_LONGLONG_H + +#include "wx/defs.h" + +#if wxUSE_LONGLONG + +#include "wx/string.h" + +#include <limits.h> // for LONG_MAX + +// define this to compile wxLongLongWx in "test" mode: the results of all +// calculations will be compared with the real results taken from +// wxLongLongNative -- this is extremely useful to find the bugs in +// wxLongLongWx class! + +// #define wxLONGLONG_TEST_MODE + +#ifdef wxLONGLONG_TEST_MODE + #define wxUSE_LONGLONG_WX 1 + #define wxUSE_LONGLONG_NATIVE 1 +#endif // wxLONGLONG_TEST_MODE + +// ---------------------------------------------------------------------------- +// decide upon which class we will use +// ---------------------------------------------------------------------------- + +#ifndef wxLongLong_t + // both warning and pragma warning are not portable, but at least an + // unknown pragma should never be an error -- except that, actually, some + // broken compilers don't like it, so we have to disable it in this case + // <sigh> + #ifdef __GNUC__ + #warning "Your compiler does not appear to support 64 bit "\ + "integers, using emulation class instead.\n" \ + "Please report your compiler version to " \ + "wx-dev@lists.wxwidgets.org!" + #elif !(defined(__WATCOMC__) || defined(__VISAGECPP__)) + #pragma warning "Your compiler does not appear to support 64 bit "\ + "integers, using emulation class instead.\n" \ + "Please report your compiler version to " \ + "wx-dev@lists.wxwidgets.org!" + #endif + + #define wxUSE_LONGLONG_WX 1 +#endif // compiler + +// the user may predefine wxUSE_LONGLONG_NATIVE and/or wxUSE_LONGLONG_NATIVE +// to disable automatic testing (useful for the test program which defines +// both classes) but by default we only use one class +#if (defined(wxUSE_LONGLONG_WX) && wxUSE_LONGLONG_WX) || !defined(wxLongLong_t) + // don't use both classes unless wxUSE_LONGLONG_NATIVE was explicitly set: + // this is useful in test programs and only there + #ifndef wxUSE_LONGLONG_NATIVE + #define wxUSE_LONGLONG_NATIVE 0 + #endif + + class WXDLLIMPEXP_BASE wxLongLongWx; + class WXDLLIMPEXP_BASE wxULongLongWx; +#if defined(__VISUALC__) && !defined(__WIN32__) + #define wxLongLong wxLongLongWx + #define wxULongLong wxULongLongWx +#else + typedef wxLongLongWx wxLongLong; + typedef wxULongLongWx wxULongLong; +#endif + +#else + // if nothing is defined, use native implementation by default, of course + #ifndef wxUSE_LONGLONG_NATIVE + #define wxUSE_LONGLONG_NATIVE 1 + #endif +#endif + +#ifndef wxUSE_LONGLONG_WX + #define wxUSE_LONGLONG_WX 0 + class WXDLLIMPEXP_BASE wxLongLongNative; + class WXDLLIMPEXP_BASE wxULongLongNative; + typedef wxLongLongNative wxLongLong; + typedef wxULongLongNative wxULongLong; +#endif + +// NB: if both wxUSE_LONGLONG_WX and NATIVE are defined, the user code should +// typedef wxLongLong as it wants, we don't do it + +// ---------------------------------------------------------------------------- +// choose the appropriate class +// ---------------------------------------------------------------------------- + +// we use iostream for wxLongLong output +#include "wx/iosfwrap.h" + +#if wxUSE_LONGLONG_NATIVE + +class WXDLLIMPEXP_BASE wxLongLongNative +{ +public: + // ctors + // default ctor initializes to 0 + wxLongLongNative() : m_ll(0) { } + // from long long + wxLongLongNative(wxLongLong_t ll) : m_ll(ll) { } + // from 2 longs + wxLongLongNative(long hi, unsigned long lo) : m_ll(0) + { + // assign first to avoid precision loss! + m_ll = ((wxLongLong_t) hi) << 32; + m_ll |= (wxLongLong_t) lo; + } +#if wxUSE_LONGLONG_WX + wxLongLongNative(wxLongLongWx ll); +#endif + + // default copy ctor is ok + + // no dtor + + // assignment operators + // from native 64 bit integer +#ifndef wxLongLongIsLong + wxLongLongNative& operator=(wxLongLong_t ll) + { m_ll = ll; return *this; } + wxLongLongNative& operator=(wxULongLong_t ll) + { m_ll = ll; return *this; } +#endif // !wxLongLongNative + wxLongLongNative& operator=(const wxULongLongNative &ll); + wxLongLongNative& operator=(int l) + { m_ll = l; return *this; } + wxLongLongNative& operator=(long l) + { m_ll = l; return *this; } + wxLongLongNative& operator=(unsigned int l) + { m_ll = l; return *this; } + wxLongLongNative& operator=(unsigned long l) + { m_ll = l; return *this; } +#if wxUSE_LONGLONG_WX + wxLongLongNative& operator=(wxLongLongWx ll); + wxLongLongNative& operator=(const class wxULongLongWx &ll); +#endif + + + // from double: this one has an explicit name because otherwise we + // would have ambiguity with "ll = int" and also because we don't want + // to have implicit conversions between doubles and wxLongLongs + wxLongLongNative& Assign(double d) + { m_ll = (wxLongLong_t)d; return *this; } + + // assignment operators from wxLongLongNative is ok + + // accessors + // get high part + long GetHi() const + { return wx_truncate_cast(long, m_ll >> 32); } + // get low part + unsigned long GetLo() const + { return wx_truncate_cast(unsigned long, m_ll); } + + // get absolute value + wxLongLongNative Abs() const { return wxLongLongNative(*this).Abs(); } + wxLongLongNative& Abs() { if ( m_ll < 0 ) m_ll = -m_ll; return *this; } + + // convert to native long long + wxLongLong_t GetValue() const { return m_ll; } + + // convert to long with range checking in debug mode (only!) + long ToLong() const + { + wxASSERT_MSG( (m_ll >= LONG_MIN) && (m_ll <= LONG_MAX), + _T("wxLongLong to long conversion loss of precision") ); + + return wx_truncate_cast(long, m_ll); + } + + // convert to double + double ToDouble() const { return wx_truncate_cast(double, m_ll); } + + // don't provide implicit conversion to wxLongLong_t or we will have an + // ambiguity for all arithmetic operations + //operator wxLongLong_t() const { return m_ll; } + + // operations + // addition + wxLongLongNative operator+(const wxLongLongNative& ll) const + { return wxLongLongNative(m_ll + ll.m_ll); } + wxLongLongNative& operator+=(const wxLongLongNative& ll) + { m_ll += ll.m_ll; return *this; } + + wxLongLongNative operator+(const wxLongLong_t ll) const + { return wxLongLongNative(m_ll + ll); } + wxLongLongNative& operator+=(const wxLongLong_t ll) + { m_ll += ll; return *this; } + + // pre increment + wxLongLongNative& operator++() + { m_ll++; return *this; } + + // post increment + wxLongLongNative operator++(int) + { wxLongLongNative value(*this); m_ll++; return value; } + + // negation operator + wxLongLongNative operator-() const + { return wxLongLongNative(-m_ll); } + wxLongLongNative& Negate() { m_ll = -m_ll; return *this; } + + // subtraction + wxLongLongNative operator-(const wxLongLongNative& ll) const + { return wxLongLongNative(m_ll - ll.m_ll); } + wxLongLongNative& operator-=(const wxLongLongNative& ll) + { m_ll -= ll.m_ll; return *this; } + + wxLongLongNative operator-(const wxLongLong_t ll) const + { return wxLongLongNative(m_ll - ll); } + wxLongLongNative& operator-=(const wxLongLong_t ll) + { m_ll -= ll; return *this; } + + // pre decrement + wxLongLongNative& operator--() + { m_ll--; return *this; } + + // post decrement + wxLongLongNative operator--(int) + { wxLongLongNative value(*this); m_ll--; return value; } + + // shifts + // left shift + wxLongLongNative operator<<(int shift) const + { return wxLongLongNative(m_ll << shift); } + wxLongLongNative& operator<<=(int shift) + { m_ll <<= shift; return *this; } + + // right shift + wxLongLongNative operator>>(int shift) const + { return wxLongLongNative(m_ll >> shift); } + wxLongLongNative& operator>>=(int shift) + { m_ll >>= shift; return *this; } + + // bitwise operators + wxLongLongNative operator&(const wxLongLongNative& ll) const + { return wxLongLongNative(m_ll & ll.m_ll); } + wxLongLongNative& operator&=(const wxLongLongNative& ll) + { m_ll &= ll.m_ll; return *this; } + + wxLongLongNative operator|(const wxLongLongNative& ll) const + { return wxLongLongNative(m_ll | ll.m_ll); } + wxLongLongNative& operator|=(const wxLongLongNative& ll) + { m_ll |= ll.m_ll; return *this; } + + wxLongLongNative operator^(const wxLongLongNative& ll) const + { return wxLongLongNative(m_ll ^ ll.m_ll); } + wxLongLongNative& operator^=(const wxLongLongNative& ll) + { m_ll ^= ll.m_ll; return *this; } + + // multiplication/division + wxLongLongNative operator*(const wxLongLongNative& ll) const + { return wxLongLongNative(m_ll * ll.m_ll); } + wxLongLongNative operator*(long l) const + { return wxLongLongNative(m_ll * l); } + wxLongLongNative& operator*=(const wxLongLongNative& ll) + { m_ll *= ll.m_ll; return *this; } + wxLongLongNative& operator*=(long l) + { m_ll *= l; return *this; } + + wxLongLongNative operator/(const wxLongLongNative& ll) const + { return wxLongLongNative(m_ll / ll.m_ll); } + wxLongLongNative operator/(long l) const + { return wxLongLongNative(m_ll / l); } + wxLongLongNative& operator/=(const wxLongLongNative& ll) + { m_ll /= ll.m_ll; return *this; } + wxLongLongNative& operator/=(long l) + { m_ll /= l; return *this; } + + wxLongLongNative operator%(const wxLongLongNative& ll) const + { return wxLongLongNative(m_ll % ll.m_ll); } + wxLongLongNative operator%(long l) const + { return wxLongLongNative(m_ll % l); } + + // comparison + bool operator==(const wxLongLongNative& ll) const + { return m_ll == ll.m_ll; } + bool operator==(long l) const + { return m_ll == l; } + bool operator!=(const wxLongLongNative& ll) const + { return m_ll != ll.m_ll; } + bool operator!=(long l) const + { return m_ll != l; } + bool operator<(const wxLongLongNative& ll) const + { return m_ll < ll.m_ll; } + bool operator<(long l) const + { return m_ll < l; } + bool operator>(const wxLongLongNative& ll) const + { return m_ll > ll.m_ll; } + bool operator>(long l) const + { return m_ll > l; } + bool operator<=(const wxLongLongNative& ll) const + { return m_ll <= ll.m_ll; } + bool operator<=(long l) const + { return m_ll <= l; } + bool operator>=(const wxLongLongNative& ll) const + { return m_ll >= ll.m_ll; } + bool operator>=(long l) const + { return m_ll >= l; } + + // miscellaneous + + // return the string representation of this number + wxString ToString() const; + + // conversion to byte array: returns a pointer to static buffer! + void *asArray() const; + +#if wxUSE_STD_IOSTREAM + // input/output + friend WXDLLIMPEXP_BASE + wxSTD ostream& operator<<(wxSTD ostream&, const wxLongLongNative&); +#endif + + friend WXDLLIMPEXP_BASE + wxString& operator<<(wxString&, const wxLongLongNative&); + +#if wxUSE_STREAMS + friend WXDLLIMPEXP_BASE + class wxTextOutputStream& operator<<(class wxTextOutputStream&, const wxLongLongNative&); + friend WXDLLIMPEXP_BASE + class wxTextInputStream& operator>>(class wxTextInputStream&, wxLongLongNative&); +#endif + +private: + wxLongLong_t m_ll; +}; + + +class WXDLLIMPEXP_BASE wxULongLongNative +{ +public: + // ctors + // default ctor initializes to 0 + wxULongLongNative() : m_ll(0) { } + // from long long + wxULongLongNative(wxULongLong_t ll) : m_ll(ll) { } + // from 2 longs + wxULongLongNative(unsigned long hi, unsigned long lo) : m_ll(0) + { + // assign first to avoid precision loss! + m_ll = ((wxULongLong_t) hi) << 32; + m_ll |= (wxULongLong_t) lo; + } + +#if wxUSE_LONGLONG_WX + wxULongLongNative(const class wxULongLongWx &ll); +#endif + + // default copy ctor is ok + + // no dtor + + // assignment operators + // from native 64 bit integer +#ifndef wxLongLongIsLong + wxULongLongNative& operator=(wxULongLong_t ll) + { m_ll = ll; return *this; } + wxULongLongNative& operator=(wxLongLong_t ll) + { m_ll = ll; return *this; } +#endif // !wxLongLongNative + wxULongLongNative& operator=(int l) + { m_ll = l; return *this; } + wxULongLongNative& operator=(long l) + { m_ll = l; return *this; } + wxULongLongNative& operator=(unsigned int l) + { m_ll = l; return *this; } + wxULongLongNative& operator=(unsigned long l) + { m_ll = l; return *this; } + wxULongLongNative& operator=(const wxLongLongNative &ll) + { m_ll = ll.GetValue(); return *this; } +#if wxUSE_LONGLONG_WX + wxULongLongNative& operator=(wxLongLongWx ll); + wxULongLongNative& operator=(const class wxULongLongWx &ll); +#endif + + // assignment operators from wxULongLongNative is ok + + // accessors + // get high part + unsigned long GetHi() const + { return wx_truncate_cast(unsigned long, m_ll >> 32); } + // get low part + unsigned long GetLo() const + { return wx_truncate_cast(unsigned long, m_ll); } + + // convert to native ulong long + wxULongLong_t GetValue() const { return m_ll; } + + // convert to ulong with range checking in debug mode (only!) + unsigned long ToULong() const + { + wxASSERT_MSG( m_ll <= LONG_MAX, + _T("wxULongLong to long conversion loss of precision") ); + + return wx_truncate_cast(unsigned long, m_ll); + } + + // convert to double +#ifdef _MSC_VER + double ToDouble() const { return wx_truncate_cast(double, (__int64) m_ll); } +#else + double ToDouble() const { return wx_truncate_cast(double, m_ll); } +#endif + + // operations + // addition + wxULongLongNative operator+(const wxULongLongNative& ll) const + { return wxULongLongNative(m_ll + ll.m_ll); } + wxULongLongNative& operator+=(const wxULongLongNative& ll) + { m_ll += ll.m_ll; return *this; } + + wxULongLongNative operator+(const wxULongLong_t ll) const + { return wxULongLongNative(m_ll + ll); } + wxULongLongNative& operator+=(const wxULongLong_t ll) + { m_ll += ll; return *this; } + + // pre increment + wxULongLongNative& operator++() + { m_ll++; return *this; } + + // post increment + wxULongLongNative operator++(int) + { wxULongLongNative value(*this); m_ll++; return value; } + + // subtraction + wxULongLongNative operator-(const wxULongLongNative& ll) const + { return wxULongLongNative(m_ll - ll.m_ll); } + wxULongLongNative& operator-=(const wxULongLongNative& ll) + { m_ll -= ll.m_ll; return *this; } + + wxULongLongNative operator-(const wxULongLong_t ll) const + { return wxULongLongNative(m_ll - ll); } + wxULongLongNative& operator-=(const wxULongLong_t ll) + { m_ll -= ll; return *this; } + + // pre decrement + wxULongLongNative& operator--() + { m_ll--; return *this; } + + // post decrement + wxULongLongNative operator--(int) + { wxULongLongNative value(*this); m_ll--; return value; } + + // shifts + // left shift + wxULongLongNative operator<<(int shift) const + { return wxULongLongNative(m_ll << shift); } + wxULongLongNative& operator<<=(int shift) + { m_ll <<= shift; return *this; } + + // right shift + wxULongLongNative operator>>(int shift) const + { return wxULongLongNative(m_ll >> shift); } + wxULongLongNative& operator>>=(int shift) + { m_ll >>= shift; return *this; } + + // bitwise operators + wxULongLongNative operator&(const wxULongLongNative& ll) const + { return wxULongLongNative(m_ll & ll.m_ll); } + wxULongLongNative& operator&=(const wxULongLongNative& ll) + { m_ll &= ll.m_ll; return *this; } + + wxULongLongNative operator|(const wxULongLongNative& ll) const + { return wxULongLongNative(m_ll | ll.m_ll); } + wxULongLongNative& operator|=(const wxULongLongNative& ll) + { m_ll |= ll.m_ll; return *this; } + + wxULongLongNative operator^(const wxULongLongNative& ll) const + { return wxULongLongNative(m_ll ^ ll.m_ll); } + wxULongLongNative& operator^=(const wxULongLongNative& ll) + { m_ll ^= ll.m_ll; return *this; } + + // multiplication/division + wxULongLongNative operator*(const wxULongLongNative& ll) const + { return wxULongLongNative(m_ll * ll.m_ll); } + wxULongLongNative operator*(unsigned long l) const + { return wxULongLongNative(m_ll * l); } + wxULongLongNative& operator*=(const wxULongLongNative& ll) + { m_ll *= ll.m_ll; return *this; } + wxULongLongNative& operator*=(unsigned long l) + { m_ll *= l; return *this; } + + wxULongLongNative operator/(const wxULongLongNative& ll) const + { return wxULongLongNative(m_ll / ll.m_ll); } + wxULongLongNative operator/(unsigned long l) const + { return wxULongLongNative(m_ll / l); } + wxULongLongNative& operator/=(const wxULongLongNative& ll) + { m_ll /= ll.m_ll; return *this; } + wxULongLongNative& operator/=(unsigned long l) + { m_ll /= l; return *this; } + + wxULongLongNative operator%(const wxULongLongNative& ll) const + { return wxULongLongNative(m_ll % ll.m_ll); } + wxULongLongNative operator%(unsigned long l) const + { return wxULongLongNative(m_ll % l); } + + // comparison + bool operator==(const wxULongLongNative& ll) const + { return m_ll == ll.m_ll; } + bool operator==(unsigned long l) const + { return m_ll == l; } + bool operator!=(const wxULongLongNative& ll) const + { return m_ll != ll.m_ll; } + bool operator!=(unsigned long l) const + { return m_ll != l; } + bool operator<(const wxULongLongNative& ll) const + { return m_ll < ll.m_ll; } + bool operator<(unsigned long l) const + { return m_ll < l; } + bool operator>(const wxULongLongNative& ll) const + { return m_ll > ll.m_ll; } + bool operator>(unsigned long l) const + { return m_ll > l; } + bool operator<=(const wxULongLongNative& ll) const + { return m_ll <= ll.m_ll; } + bool operator<=(unsigned long l) const + { return m_ll <= l; } + bool operator>=(const wxULongLongNative& ll) const + { return m_ll >= ll.m_ll; } + bool operator>=(unsigned long l) const + { return m_ll >= l; } + + // miscellaneous + + // return the string representation of this number + wxString ToString() const; + + // conversion to byte array: returns a pointer to static buffer! + void *asArray() const; + +#if wxUSE_STD_IOSTREAM + // input/output + friend WXDLLIMPEXP_BASE + wxSTD ostream& operator<<(wxSTD ostream&, const wxULongLongNative&); +#endif + + friend WXDLLIMPEXP_BASE + wxString& operator<<(wxString&, const wxULongLongNative&); + +#if wxUSE_STREAMS + friend WXDLLIMPEXP_BASE + class wxTextOutputStream& operator<<(class wxTextOutputStream&, const wxULongLongNative&); + friend WXDLLIMPEXP_BASE + class wxTextInputStream& operator>>(class wxTextInputStream&, wxULongLongNative&); +#endif + +private: + wxULongLong_t m_ll; +}; + +inline +wxLongLongNative& wxLongLongNative::operator=(const wxULongLongNative &ll) +{ + m_ll = ll.GetValue(); + return *this; +} + +#endif // wxUSE_LONGLONG_NATIVE + +#if wxUSE_LONGLONG_WX + +class WXDLLIMPEXP_BASE wxLongLongWx +{ +public: + // ctors + // default ctor initializes to 0 + wxLongLongWx() + { + m_lo = m_hi = 0; + +#ifdef wxLONGLONG_TEST_MODE + m_ll = 0; + + Check(); +#endif // wxLONGLONG_TEST_MODE + } + // from long + wxLongLongWx(long l) { *this = l; } + // from 2 longs + wxLongLongWx(long hi, unsigned long lo) + { + m_hi = hi; + m_lo = lo; + +#ifdef wxLONGLONG_TEST_MODE + m_ll = hi; + m_ll <<= 32; + m_ll |= lo; + + Check(); +#endif // wxLONGLONG_TEST_MODE + } + + // default copy ctor is ok in both cases + + // no dtor + + // assignment operators + // from long + wxLongLongWx& operator=(long l) + { + m_lo = l; + m_hi = (l < 0 ? -1l : 0l); + +#ifdef wxLONGLONG_TEST_MODE + m_ll = l; + + Check(); +#endif // wxLONGLONG_TEST_MODE + + return *this; + } + // from int + wxLongLongWx& operator=(int l) + { + return operator=((long)l); + } + + wxLongLongWx& operator=(unsigned long l) + { + m_lo = l; + m_hi = 0; + +#ifdef wxLONGLONG_TEST_MODE + m_ll = l; + + Check(); +#endif // wxLONGLONG_TEST_MODE + + return *this; + } + + wxLongLongWx& operator=(unsigned int l) + { + return operator=((unsigned long)l); + } + + wxLongLongWx& operator=(const class wxULongLongWx &ll); + + // from double + wxLongLongWx& Assign(double d); + // can't have assignment operator from 2 longs + + // accessors + // get high part + long GetHi() const { return m_hi; } + // get low part + unsigned long GetLo() const { return m_lo; } + + // get absolute value + wxLongLongWx Abs() const { return wxLongLongWx(*this).Abs(); } + wxLongLongWx& Abs() + { + if ( m_hi < 0 ) + m_hi = -m_hi; + +#ifdef wxLONGLONG_TEST_MODE + if ( m_ll < 0 ) + m_ll = -m_ll; + + Check(); +#endif // wxLONGLONG_TEST_MODE + + return *this; + } + + // convert to long with range checking in debug mode (only!) + long ToLong() const + { + wxASSERT_MSG( (m_hi == 0l) || (m_hi == -1l), + _T("wxLongLong to long conversion loss of precision") ); + + return (long)m_lo; + } + + // convert to double + double ToDouble() const; + + // operations + // addition + wxLongLongWx operator+(const wxLongLongWx& ll) const; + wxLongLongWx& operator+=(const wxLongLongWx& ll); + wxLongLongWx operator+(long l) const; + wxLongLongWx& operator+=(long l); + + // pre increment operator + wxLongLongWx& operator++(); + + // post increment operator + wxLongLongWx& operator++(int) { return ++(*this); } + + // negation operator + wxLongLongWx operator-() const; + wxLongLongWx& Negate(); + + // subraction + wxLongLongWx operator-(const wxLongLongWx& ll) const; + wxLongLongWx& operator-=(const wxLongLongWx& ll); + + // pre decrement operator + wxLongLongWx& operator--(); + + // post decrement operator + wxLongLongWx& operator--(int) { return --(*this); } + + // shifts + // left shift + wxLongLongWx operator<<(int shift) const; + wxLongLongWx& operator<<=(int shift); + + // right shift + wxLongLongWx operator>>(int shift) const; + wxLongLongWx& operator>>=(int shift); + + // bitwise operators + wxLongLongWx operator&(const wxLongLongWx& ll) const; + wxLongLongWx& operator&=(const wxLongLongWx& ll); + wxLongLongWx operator|(const wxLongLongWx& ll) const; + wxLongLongWx& operator|=(const wxLongLongWx& ll); + wxLongLongWx operator^(const wxLongLongWx& ll) const; + wxLongLongWx& operator^=(const wxLongLongWx& ll); + wxLongLongWx operator~() const; + + // comparison + bool operator==(const wxLongLongWx& ll) const + { return m_lo == ll.m_lo && m_hi == ll.m_hi; } +#if wxUSE_LONGLONG_NATIVE + bool operator==(const wxLongLongNative& ll) const + { return m_lo == ll.GetLo() && m_hi == ll.GetHi(); } +#endif + bool operator!=(const wxLongLongWx& ll) const + { return !(*this == ll); } + bool operator<(const wxLongLongWx& ll) const; + bool operator>(const wxLongLongWx& ll) const; + bool operator<=(const wxLongLongWx& ll) const + { return *this < ll || *this == ll; } + bool operator>=(const wxLongLongWx& ll) const + { return *this > ll || *this == ll; } + + bool operator<(long l) const { return *this < wxLongLongWx(l); } + bool operator>(long l) const { return *this > wxLongLongWx(l); } + bool operator==(long l) const + { + return l >= 0 ? (m_hi == 0 && m_lo == (unsigned long)l) + : (m_hi == -1 && m_lo == (unsigned long)l); + } + + bool operator<=(long l) const { return *this < l || *this == l; } + bool operator>=(long l) const { return *this > l || *this == l; } + + // multiplication + wxLongLongWx operator*(const wxLongLongWx& ll) const; + wxLongLongWx& operator*=(const wxLongLongWx& ll); + + // division + wxLongLongWx operator/(const wxLongLongWx& ll) const; + wxLongLongWx& operator/=(const wxLongLongWx& ll); + + wxLongLongWx operator%(const wxLongLongWx& ll) const; + + void Divide(const wxLongLongWx& divisor, + wxLongLongWx& quotient, + wxLongLongWx& remainder) const; + + // input/output + + // return the string representation of this number + wxString ToString() const; + + void *asArray() const; + +#if wxUSE_STD_IOSTREAM + friend WXDLLIMPEXP_BASE + wxSTD ostream& operator<<(wxSTD ostream&, const wxLongLongWx&); +#endif // wxUSE_STD_IOSTREAM + + friend WXDLLIMPEXP_BASE + wxString& operator<<(wxString&, const wxLongLongWx&); + +#if wxUSE_STREAMS + friend WXDLLIMPEXP_BASE + class wxTextOutputStream& operator<<(class wxTextOutputStream&, const wxLongLongWx&); + friend WXDLLIMPEXP_BASE + class wxTextInputStream& operator>>(class wxTextInputStream&, wxLongLongWx&); +#endif + +private: + // long is at least 32 bits, so represent our 64bit number as 2 longs + + long m_hi; // signed bit is in the high part + unsigned long m_lo; + +#ifdef wxLONGLONG_TEST_MODE + void Check() + { + wxASSERT( (m_ll >> 32) == m_hi && (unsigned long)m_ll == m_lo ); + } + + wxLongLong_t m_ll; +#endif // wxLONGLONG_TEST_MODE +}; + + +class WXDLLIMPEXP_BASE wxULongLongWx +{ +public: + // ctors + // default ctor initializes to 0 + wxULongLongWx() + { + m_lo = m_hi = 0; + +#ifdef wxLONGLONG_TEST_MODE + m_ll = 0; + + Check(); +#endif // wxLONGLONG_TEST_MODE + } + // from ulong + wxULongLongWx(unsigned long l) { *this = l; } + // from 2 ulongs + wxULongLongWx(unsigned long hi, unsigned long lo) + { + m_hi = hi; + m_lo = lo; + +#ifdef wxLONGLONG_TEST_MODE + m_ll = hi; + m_ll <<= 32; + m_ll |= lo; + + Check(); +#endif // wxLONGLONG_TEST_MODE + } + + // from signed to unsigned + wxULongLongWx(wxLongLongWx ll) + { + wxASSERT(ll.GetHi() >= 0); + m_hi = (unsigned long)ll.GetHi(); + m_lo = ll.GetLo(); + } + + // default copy ctor is ok in both cases + + // no dtor + + // assignment operators + // from long + wxULongLongWx& operator=(unsigned long l) + { + m_lo = l; + m_hi = 0; + +#ifdef wxLONGLONG_TEST_MODE + m_ll = l; + + Check(); +#endif // wxLONGLONG_TEST_MODE + + return *this; + } + wxULongLongWx& operator=(long l) + { + m_lo = l; + m_hi = (unsigned long) ((l<0) ? -1l : 0); + +#ifdef wxLONGLONG_TEST_MODE + m_ll = (wxULongLong_t) (wxLongLong_t) l; + + Check(); +#endif // wxLONGLONG_TEST_MODE + + return *this; + } + wxULongLongWx& operator=(const class wxLongLongWx &ll) { + // Should we use an assert like it was before in the constructor? + // wxASSERT(ll.GetHi() >= 0); + m_hi = (unsigned long)ll.GetHi(); + m_lo = ll.GetLo(); + return *this; + } + + // can't have assignment operator from 2 longs + + // accessors + // get high part + unsigned long GetHi() const { return m_hi; } + // get low part + unsigned long GetLo() const { return m_lo; } + + // convert to long with range checking in debug mode (only!) + unsigned long ToULong() const + { + wxASSERT_MSG( m_hi == 0ul, + _T("wxULongLong to long conversion loss of precision") ); + + return (unsigned long)m_lo; + } + + // convert to double + double ToDouble() const; + + // operations + // addition + wxULongLongWx operator+(const wxULongLongWx& ll) const; + wxULongLongWx& operator+=(const wxULongLongWx& ll); + wxULongLongWx operator+(unsigned long l) const; + wxULongLongWx& operator+=(unsigned long l); + + // pre increment operator + wxULongLongWx& operator++(); + + // post increment operator + wxULongLongWx& operator++(int) { return ++(*this); } + + // subtraction + wxLongLongWx operator-(const wxULongLongWx& ll) const; + wxULongLongWx& operator-=(const wxULongLongWx& ll); + + // pre decrement operator + wxULongLongWx& operator--(); + + // post decrement operator + wxULongLongWx& operator--(int) { return --(*this); } + + // shifts + // left shift + wxULongLongWx operator<<(int shift) const; + wxULongLongWx& operator<<=(int shift); + + // right shift + wxULongLongWx operator>>(int shift) const; + wxULongLongWx& operator>>=(int shift); + + // bitwise operators + wxULongLongWx operator&(const wxULongLongWx& ll) const; + wxULongLongWx& operator&=(const wxULongLongWx& ll); + wxULongLongWx operator|(const wxULongLongWx& ll) const; + wxULongLongWx& operator|=(const wxULongLongWx& ll); + wxULongLongWx operator^(const wxULongLongWx& ll) const; + wxULongLongWx& operator^=(const wxULongLongWx& ll); + wxULongLongWx operator~() const; + + // comparison + bool operator==(const wxULongLongWx& ll) const + { return m_lo == ll.m_lo && m_hi == ll.m_hi; } + bool operator!=(const wxULongLongWx& ll) const + { return !(*this == ll); } + bool operator<(const wxULongLongWx& ll) const; + bool operator>(const wxULongLongWx& ll) const; + bool operator<=(const wxULongLongWx& ll) const + { return *this < ll || *this == ll; } + bool operator>=(const wxULongLongWx& ll) const + { return *this > ll || *this == ll; } + + bool operator<(unsigned long l) const { return *this < wxULongLongWx(l); } + bool operator>(unsigned long l) const { return *this > wxULongLongWx(l); } + bool operator==(unsigned long l) const + { + return (m_hi == 0 && m_lo == (unsigned long)l); + } + + bool operator<=(unsigned long l) const { return *this < l || *this == l; } + bool operator>=(unsigned long l) const { return *this > l || *this == l; } + + // multiplication + wxULongLongWx operator*(const wxULongLongWx& ll) const; + wxULongLongWx& operator*=(const wxULongLongWx& ll); + + // division + wxULongLongWx operator/(const wxULongLongWx& ll) const; + wxULongLongWx& operator/=(const wxULongLongWx& ll); + + wxULongLongWx operator%(const wxULongLongWx& ll) const; + + void Divide(const wxULongLongWx& divisor, + wxULongLongWx& quotient, + wxULongLongWx& remainder) const; + + // input/output + + // return the string representation of this number + wxString ToString() const; + + void *asArray() const; + +#if wxUSE_STD_IOSTREAM + friend WXDLLIMPEXP_BASE + wxSTD ostream& operator<<(wxSTD ostream&, const wxULongLongWx&); +#endif // wxUSE_STD_IOSTREAM + + friend WXDLLIMPEXP_BASE + wxString& operator<<(wxString&, const wxULongLongWx&); + +#if wxUSE_STREAMS + friend WXDLLIMPEXP_BASE + class wxTextOutputStream& operator<<(class wxTextOutputStream&, const wxULongLongWx&); + friend WXDLLIMPEXP_BASE + class wxTextInputStream& operator>>(class wxTextInputStream&, wxULongLongWx&); +#endif + +private: + // long is at least 32 bits, so represent our 64bit number as 2 longs + + unsigned long m_hi; + unsigned long m_lo; + +#ifdef wxLONGLONG_TEST_MODE + void Check() + { + wxASSERT( (m_ll >> 32) == m_hi && (unsigned long)m_ll == m_lo ); + } + + wxULongLong_t m_ll; +#endif // wxLONGLONG_TEST_MODE +}; + +#endif // wxUSE_LONGLONG_WX + +// ---------------------------------------------------------------------------- +// binary operators +// ---------------------------------------------------------------------------- + +inline bool operator<(long l, const wxLongLong& ll) { return ll > l; } +inline bool operator>(long l, const wxLongLong& ll) { return ll < l; } +inline bool operator<=(long l, const wxLongLong& ll) { return ll >= l; } +inline bool operator>=(long l, const wxLongLong& ll) { return ll <= l; } +inline bool operator==(long l, const wxLongLong& ll) { return ll == l; } +inline bool operator!=(long l, const wxLongLong& ll) { return ll != l; } + +inline wxLongLong operator+(long l, const wxLongLong& ll) { return ll + l; } +inline wxLongLong operator-(long l, const wxLongLong& ll) +{ + return wxLongLong(l) - ll; +} + +inline bool operator<(unsigned long l, const wxULongLong& ull) { return ull > l; } +inline bool operator>(unsigned long l, const wxULongLong& ull) { return ull < l; } +inline bool operator<=(unsigned long l, const wxULongLong& ull) { return ull >= l; } +inline bool operator>=(unsigned long l, const wxULongLong& ull) { return ull <= l; } +inline bool operator==(unsigned long l, const wxULongLong& ull) { return ull == l; } +inline bool operator!=(unsigned long l, const wxULongLong& ull) { return ull != l; } + +inline wxULongLong operator+(unsigned long l, const wxULongLong& ull) { return ull + l; } + +inline wxLongLong operator-(unsigned long l, const wxULongLong& ull) +{ + wxULongLong ret = wxULongLong(l) - ull; + return wxLongLong((long)ret.GetHi(),ret.GetLo()); +} + +#if wxUSE_LONGLONG_NATIVE && wxUSE_STREAMS + +WXDLLIMPEXP_BASE class wxTextOutputStream &operator<<(class wxTextOutputStream &stream, wxULongLong_t value); +WXDLLIMPEXP_BASE class wxTextOutputStream &operator<<(class wxTextOutputStream &stream, wxLongLong_t value); + +WXDLLIMPEXP_BASE class wxTextInputStream &operator>>(class wxTextInputStream &stream, wxULongLong_t &value); +WXDLLIMPEXP_BASE class wxTextInputStream &operator>>(class wxTextInputStream &stream, wxLongLong_t &value); + +#endif + +#endif // wxUSE_LONGLONG + +#endif // _WX_LONGLONG_H diff --git a/Externals/wxWidgets/include/wx/math.h b/Externals/wxWidgets/include/wx/math.h new file mode 100644 index 0000000000..b82cf305a3 --- /dev/null +++ b/Externals/wxWidgets/include/wx/math.h @@ -0,0 +1,140 @@ +/** +* Name: wx/math.h +* Purpose: Declarations/definitions of common math functions +* Author: John Labenski and others +* Modified by: +* Created: 02/02/03 +* RCS-ID: $Id: math.h 44690 2007-03-08 04:31:24Z PC $ +* Copyright: (c) John Labenski +* Licence: wxWindows licence +*/ + +/* THIS IS A C FILE, DON'T USE C++ FEATURES (IN PARTICULAR COMMENTS) IN IT */ + +#ifndef _WX_MATH_H_ +#define _WX_MATH_H_ + +#include "wx/defs.h" + +#include <math.h> + +#ifndef M_PI + #define M_PI 3.1415926535897932384626433832795 +#endif + +/* Scaling factors for various unit conversions */ +#ifndef METRIC_CONVERSION_CONSTANT + #define METRIC_CONVERSION_CONSTANT 0.0393700787 +#endif + +#ifndef mm2inches + #define mm2inches (METRIC_CONVERSION_CONSTANT) +#endif + +#ifndef inches2mm + #define inches2mm (1/(mm2inches)) +#endif + +#ifndef mm2twips + #define mm2twips (METRIC_CONVERSION_CONSTANT*1440) +#endif + +#ifndef twips2mm + #define twips2mm (1/(mm2twips)) +#endif + +#ifndef mm2pt + #define mm2pt (METRIC_CONVERSION_CONSTANT*72) +#endif + +#ifndef pt2mm + #define pt2mm (1/(mm2pt)) +#endif + + +/* unknown __VISAGECC__, __SYMANTECCC__ */ + +#if defined(__VISUALC__) || defined(__BORLANDC__) || defined(__WATCOMC__) + #include <float.h> + #define wxFinite(x) _finite(x) +#elif defined(__GNUG__)||defined(__GNUWIN32__)||defined(__DJGPP__)|| \ + defined(__SGI_CC__)||defined(__SUNCC__)||defined(__XLC__)|| \ + defined(__HPUX__)||defined(__MWERKS__) + #define wxFinite(x) finite(x) +#else + #define wxFinite(x) ((x) == (x)) +#endif + + +#if defined(__VISUALC__)||defined(__BORLAND__) + #define wxIsNaN(x) _isnan(x) +#elif defined(__GNUG__)||defined(__GNUWIN32__)||defined(__DJGPP__)|| \ + defined(__SGI_CC__)||defined(__SUNCC__)||defined(__XLC__)|| \ + defined(__HPUX__)||defined(__MWERKS__) + #define wxIsNaN(x) isnan(x) +#else + #define wxIsNaN(x) ((x) != (x)) +#endif + +#ifdef __cplusplus + + #ifdef __INTELC__ + + inline bool wxIsSameDouble(double x, double y) + { + // VZ: this warning, given for operators==() and !=() is not wrong, as == + // shouldn't be used with doubles, but we get too many of them and + // removing these operators is probably not a good idea + // + // Maybe we should alway compare doubles up to some "epsilon" precision + #pragma warning(push) + + // floating-point equality and inequality comparisons are unreliable + #pragma warning(disable: 1572) + + return x == y; + + #pragma warning(pop) + } + + #else /* !__INTELC__ */ + + inline bool wxIsSameDouble(double x, double y) { return x == y; } + + #endif /* __INTELC__/!__INTELC__ */ + + inline bool wxIsNullDouble(double x) { return wxIsSameDouble(x, 0.); } + + inline int wxRound(double x) + { + #if defined(HAVE_ROUND) + return int(round(x)); + #else + return (int)(x < 0 ? x - 0.5 : x + 0.5); + #endif + } +#endif /* __cplusplus */ + + +#if defined(__WXMSW__) && !defined(__WXWINCE__) + #define wxMulDivInt32( a , b , c ) ::MulDiv( a , b , c ) +#elif defined( __WXMAC__ ) + #define wxMulDivInt32( a , b , c ) ( (wxInt32) ( ( (wxInt64)(a) * (wxInt64)(b) ) / (wxInt64)(c) ) ) +#else + #define wxMulDivInt32( a , b , c ) ((wxInt32)((a)*(((wxDouble)b)/((wxDouble)c)))) +#endif + +#if wxUSE_APPLE_IEEE +#ifdef __cplusplus + extern "C" { +#endif + /* functions from common/extended.c */ + extern wxFloat64 ConvertFromIeeeExtended(const wxInt8 *bytes); + extern void ConvertToIeeeExtended(wxFloat64 num, wxInt8 *bytes); +#ifdef __cplusplus + } +#endif +#endif /* wxUSE_APPLE_IEEE */ + + +#endif /* _WX_MATH_H_ */ diff --git a/Externals/wxWidgets/include/wx/matrix.h b/Externals/wxWidgets/include/wx/matrix.h new file mode 100644 index 0000000000..11c688ba4d --- /dev/null +++ b/Externals/wxWidgets/include/wx/matrix.h @@ -0,0 +1,235 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/matrix.h +// Purpose: wxTransformMatrix class. NOT YET USED +// Author: Chris Breeze, Julian Smart +// Modified by: Klaas Holwerda +// Created: 01/02/97 +// RCS-ID: $Id: matrix.h 45498 2007-04-16 13:03:05Z VZ $ +// Copyright: (c) Julian Smart, Chris Breeze +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MATRIXH__ +#define _WX_MATRIXH__ + +//! headerfiles="matrix.h wx/object.h" +#include "wx/object.h" +#include "wx/math.h" + +//! codefiles="matrix.cpp" + +// A simple 3x3 matrix. This may be replaced by a more general matrix +// class some day. +// +// Note: this is intended to be used in wxDC at some point to replace +// the current system of scaling/translation. It is not yet used. + +//:definition +// A 3x3 matrix to do 2D transformations. +// It can be used to map data to window coordinates, +// and also for manipulating your own data. +// For example drawing a picture (composed of several primitives) +// at a certain coordinate and angle within another parent picture. +// At all times m_isIdentity is set if the matrix itself is an Identity matrix. +// It is used where possible to optimize calculations. +class WXDLLEXPORT wxTransformMatrix: public wxObject +{ +public: + wxTransformMatrix(void); + wxTransformMatrix(const wxTransformMatrix& mat); + + //get the value in the matrix at col,row + //rows are horizontal (second index of m_matrix member) + //columns are vertical (first index of m_matrix member) + double GetValue(int col, int row) const; + + //set the value in the matrix at col,row + //rows are horizontal (second index of m_matrix member) + //columns are vertical (first index of m_matrix member) + void SetValue(int col, int row, double value); + + void operator = (const wxTransformMatrix& mat); + bool operator == (const wxTransformMatrix& mat) const; + bool operator != (const wxTransformMatrix& mat) const; + + //multiply every element by t + wxTransformMatrix& operator*=(const double& t); + //divide every element by t + wxTransformMatrix& operator/=(const double& t); + //add matrix m to this t + wxTransformMatrix& operator+=(const wxTransformMatrix& m); + //subtract matrix m from this + wxTransformMatrix& operator-=(const wxTransformMatrix& m); + //multiply matrix m with this + wxTransformMatrix& operator*=(const wxTransformMatrix& m); + + // constant operators + + //multiply every element by t and return result + wxTransformMatrix operator*(const double& t) const; + //divide this matrix by t and return result + wxTransformMatrix operator/(const double& t) const; + //add matrix m to this and return result + wxTransformMatrix operator+(const wxTransformMatrix& m) const; + //subtract matrix m from this and return result + wxTransformMatrix operator-(const wxTransformMatrix& m) const; + //multiply this by matrix m and return result + wxTransformMatrix operator*(const wxTransformMatrix& m) const; + wxTransformMatrix operator-() const; + + //rows are horizontal (second index of m_matrix member) + //columns are vertical (first index of m_matrix member) + double& operator()(int col, int row); + + //rows are horizontal (second index of m_matrix member) + //columns are vertical (first index of m_matrix member) + double operator()(int col, int row) const; + + // Invert matrix + bool Invert(void); + + // Make into identity matrix + bool Identity(void); + + // Is the matrix the identity matrix? + // Only returns a flag, which is set whenever an operation + // is done. + inline bool IsIdentity(void) const { return m_isIdentity; } + + // This does an actual check. + inline bool IsIdentity1(void) const ; + + //Scale by scale (isotropic scaling i.e. the same in x and y): + //!ex: + //!code: | scale 0 0 | + //!code: matrix' = | 0 scale 0 | x matrix + //!code: | 0 0 scale | + bool Scale(double scale); + + //Scale with center point and x/y scale + // + //!ex: + //!code: | xs 0 xc(1-xs) | + //!code: matrix' = | 0 ys yc(1-ys) | x matrix + //!code: | 0 0 1 | + wxTransformMatrix& Scale(const double &xs, const double &ys,const double &xc, const double &yc); + + // mirror a matrix in x, y + //!ex: + //!code: | -1 0 0 | + //!code: matrix' = | 0 -1 0 | x matrix + //!code: | 0 0 1 | + wxTransformMatrix& Mirror(bool x=true, bool y=false); + // Translate by dx, dy: + //!ex: + //!code: | 1 0 dx | + //!code: matrix' = | 0 1 dy | x matrix + //!code: | 0 0 1 | + bool Translate(double x, double y); + + // Rotate clockwise by the given number of degrees: + //!ex: + //!code: | cos sin 0 | + //!code: matrix' = | -sin cos 0 | x matrix + //!code: | 0 0 1 | + bool Rotate(double angle); + + //Rotate counter clockwise with point of rotation + // + //!ex: + //!code: | cos(r) -sin(r) x(1-cos(r))+y(sin(r)| + //!code: matrix' = | sin(r) cos(r) y(1-cos(r))-x(sin(r)| x matrix + //!code: | 0 0 1 | + wxTransformMatrix& Rotate(const double &r, const double &x, const double &y); + + // Transform X value from logical to device + inline double TransformX(double x) const; + + // Transform Y value from logical to device + inline double TransformY(double y) const; + + // Transform a point from logical to device coordinates + bool TransformPoint(double x, double y, double& tx, double& ty) const; + + // Transform a point from device to logical coordinates. + // Example of use: + // wxTransformMatrix mat = dc.GetTransformation(); + // mat.Invert(); + // mat.InverseTransformPoint(x, y, x1, y1); + // OR (shorthand:) + // dc.LogicalToDevice(x, y, x1, y1); + // The latter is slightly less efficient if we're doing several + // conversions, since the matrix is inverted several times. + // N.B. 'this' matrix is the inverse at this point + bool InverseTransformPoint(double x, double y, double& tx, double& ty) const; + + double Get_scaleX(); + double Get_scaleY(); + double GetRotation(); + void SetRotation(double rotation); + + +public: + double m_matrix[3][3]; + bool m_isIdentity; +}; + + +/* +Chris Breeze reported, that +some functions of wxTransformMatrix cannot work because it is not +known if he matrix has been inverted. Be careful when using it. +*/ + +// Transform X value from logical to device +// warning: this function can only be used for this purpose +// because no rotation is involved when mapping logical to device coordinates +// mirror and scaling for x and y will be part of the matrix +// if you have a matrix that is rotated, eg a shape containing a matrix to place +// it in the logical coordinate system, use TransformPoint +inline double wxTransformMatrix::TransformX(double x) const +{ + //normally like this, but since no rotation is involved (only mirror and scale) + //we can do without Y -> m_matrix[1]{0] is -sin(rotation angle) and therefore zero + //(x * m_matrix[0][0] + y * m_matrix[1][0] + m_matrix[2][0])) + return (m_isIdentity ? x : (x * m_matrix[0][0] + m_matrix[2][0])); +} + +// Transform Y value from logical to device +// warning: this function can only be used for this purpose +// because no rotation is involved when mapping logical to device coordinates +// mirror and scaling for x and y will be part of the matrix +// if you have a matrix that is rotated, eg a shape containing a matrix to place +// it in the logical coordinate system, use TransformPoint +inline double wxTransformMatrix::TransformY(double y) const +{ + //normally like this, but since no rotation is involved (only mirror and scale) + //we can do without X -> m_matrix[0]{1] is sin(rotation angle) and therefore zero + //(x * m_matrix[0][1] + y * m_matrix[1][1] + m_matrix[2][1])) + return (m_isIdentity ? y : (y * m_matrix[1][1] + m_matrix[2][1])); +} + + +// Is the matrix the identity matrix? +// Each operation checks whether the result is still the identity matrix and sets a flag. +inline bool wxTransformMatrix::IsIdentity1(void) const +{ + return + ( wxIsSameDouble(m_matrix[0][0], 1.0) && + wxIsSameDouble(m_matrix[1][1], 1.0) && + wxIsSameDouble(m_matrix[2][2], 1.0) && + wxIsSameDouble(m_matrix[1][0], 0.0) && + wxIsSameDouble(m_matrix[2][0], 0.0) && + wxIsSameDouble(m_matrix[0][1], 0.0) && + wxIsSameDouble(m_matrix[2][1], 0.0) && + wxIsSameDouble(m_matrix[0][2], 0.0) && + wxIsSameDouble(m_matrix[1][2], 0.0) ); +} + +// Calculates the determinant of a 2 x 2 matrix +inline double wxCalculateDet(double a11, double a21, double a12, double a22) +{ + return a11 * a22 - a12 * a21; +} + +#endif // _WX_MATRIXH__ diff --git a/Externals/wxWidgets/include/wx/mdi.h b/Externals/wxWidgets/include/wx/mdi.h new file mode 100644 index 0000000000..7a9eeca596 --- /dev/null +++ b/Externals/wxWidgets/include/wx/mdi.h @@ -0,0 +1,40 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/mdi.h +// Purpose: wxMDI base header +// Author: Julian Smart +// Modified by: +// Created: +// Copyright: (c) Julian Smart +// RCS-ID: $Id: mdi.h 37066 2006-01-23 03:27:34Z MR $ +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MDI_H_BASE_ +#define _WX_MDI_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_MDI + +#if defined(__WXUNIVERSAL__) + #include "wx/generic/mdig.h" +#elif defined(__WXMSW__) + #include "wx/msw/mdi.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/mdi.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/mdi.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/mdi.h" +#elif defined(__WXMAC__) + #include "wx/mac/mdi.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/mdi.h" +#elif defined(__WXPM__) + #include "wx/generic/mdig.h" +#endif + +#endif // wxUSE_MDI + +#endif + // _WX_MDI_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/mediactrl.h b/Externals/wxWidgets/include/wx/mediactrl.h new file mode 100644 index 0000000000..e558bd3151 --- /dev/null +++ b/Externals/wxWidgets/include/wx/mediactrl.h @@ -0,0 +1,422 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/mediactrl.h +// Purpose: wxMediaCtrl class +// Author: Ryan Norton <wxprojects@comcast.net> +// Modified by: +// Created: 11/07/04 +// RCS-ID: $Id: mediactrl.h 41020 2006-09-05 20:47:48Z VZ $ +// Copyright: (c) Ryan Norton +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// Definitions +// ============================================================================ + +// ---------------------------------------------------------------------------- +// Header guard +// ---------------------------------------------------------------------------- +#ifndef _WX_MEDIACTRL_H_ +#define _WX_MEDIACTRL_H_ + +// ---------------------------------------------------------------------------- +// Pre-compiled header stuff +// ---------------------------------------------------------------------------- + +#include "wx/defs.h" + +// ---------------------------------------------------------------------------- +// Compilation guard +// ---------------------------------------------------------------------------- + +#if wxUSE_MEDIACTRL + +// ---------------------------------------------------------------------------- +// Includes +// ---------------------------------------------------------------------------- + +#include "wx/control.h" +#include "wx/uri.h" + +// ============================================================================ +// Declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// +// Enumerations +// +// ---------------------------------------------------------------------------- + +enum wxMediaState +{ + wxMEDIASTATE_STOPPED, + wxMEDIASTATE_PAUSED, + wxMEDIASTATE_PLAYING +}; + +enum wxMediaCtrlPlayerControls +{ + wxMEDIACTRLPLAYERCONTROLS_NONE = 0, + //Step controls like fastfoward, step one frame etc. + wxMEDIACTRLPLAYERCONTROLS_STEP = 1 << 0, + //Volume controls like the speaker icon, volume slider, etc. + wxMEDIACTRLPLAYERCONTROLS_VOLUME = 1 << 1, + wxMEDIACTRLPLAYERCONTROLS_DEFAULT = + wxMEDIACTRLPLAYERCONTROLS_STEP | + wxMEDIACTRLPLAYERCONTROLS_VOLUME +}; + +#define wxMEDIABACKEND_DIRECTSHOW wxT("wxAMMediaBackend") +#define wxMEDIABACKEND_MCI wxT("wxMCIMediaBackend") +#define wxMEDIABACKEND_QUICKTIME wxT("wxQTMediaBackend") +#define wxMEDIABACKEND_GSTREAMER wxT("wxGStreamerMediaBackend") +#define wxMEDIABACKEND_REALPLAYER wxT("wxRealPlayerMediaBackend") +#define wxMEDIABACKEND_WMP10 wxT("wxWMP10MediaBackend") + +// ---------------------------------------------------------------------------- +// +// wxMediaEvent +// +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_MEDIA wxMediaEvent : public wxNotifyEvent +{ +public: + // ------------------------------------------------------------------------ + // wxMediaEvent Constructor + // + // Normal constructor, much the same as wxNotifyEvent + // ------------------------------------------------------------------------ + wxMediaEvent(wxEventType commandType = wxEVT_NULL, int winid = 0) + : wxNotifyEvent(commandType, winid) + { } + + // ------------------------------------------------------------------------ + // wxMediaEvent Copy Constructor + // + // Normal copy constructor, much the same as wxNotifyEvent + // ------------------------------------------------------------------------ + wxMediaEvent(const wxMediaEvent &clone) + : wxNotifyEvent(clone) + { } + + // ------------------------------------------------------------------------ + // wxMediaEvent::Clone + // + // Allocates a copy of this object. + // Required for wxEvtHandler::AddPendingEvent + // ------------------------------------------------------------------------ + virtual wxEvent *Clone() const + { return new wxMediaEvent(*this); } + + + // Put this class on wxWidget's RTTI table + DECLARE_DYNAMIC_CLASS(wxMediaEvent) +}; + +// ---------------------------------------------------------------------------- +// +// wxMediaCtrl +// +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_MEDIA wxMediaCtrl : public wxControl +{ +public: + wxMediaCtrl() : m_imp(NULL), m_bLoaded(false) + { } + + wxMediaCtrl(wxWindow* parent, wxWindowID winid, + const wxString& fileName = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& szBackend = wxEmptyString, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxT("mediaCtrl")) + : m_imp(NULL), m_bLoaded(false) + { Create(parent, winid, fileName, pos, size, style, + szBackend, validator, name); } + + wxMediaCtrl(wxWindow* parent, wxWindowID winid, + const wxURI& location, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& szBackend = wxEmptyString, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxT("mediaCtrl")) + : m_imp(NULL), m_bLoaded(false) + { Create(parent, winid, location, pos, size, style, + szBackend, validator, name); } + + virtual ~wxMediaCtrl(); + + bool Create(wxWindow* parent, wxWindowID winid, + const wxString& fileName = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& szBackend = wxEmptyString, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxT("mediaCtrl")); + + bool Create(wxWindow* parent, wxWindowID winid, + const wxURI& location, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& szBackend = wxEmptyString, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxT("mediaCtrl")); + + bool DoCreate(wxClassInfo* instance, + wxWindow* parent, wxWindowID winid, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxT("mediaCtrl")); + + bool Play(); + bool Pause(); + bool Stop(); + + bool Load(const wxString& fileName); + + wxMediaState GetState(); + + wxFileOffset Seek(wxFileOffset where, wxSeekMode mode = wxFromStart); + wxFileOffset Tell(); //FIXME: This should be const + wxFileOffset Length(); //FIXME: This should be const + +#if wxABI_VERSION >= 20601 /* 2.6.1+ only */ + double GetPlaybackRate(); //All but MCI & GStreamer + bool SetPlaybackRate(double dRate); //All but MCI & GStreamer +#endif + +#if wxABI_VERSION >= 20602 /* 2.6.2+ only */ + bool Load(const wxURI& location); + bool Load(const wxURI& location, const wxURI& proxy); + + wxFileOffset GetDownloadProgress(); // DirectShow only + wxFileOffset GetDownloadTotal(); // DirectShow only + + double GetVolume(); + bool SetVolume(double dVolume); + + bool ShowPlayerControls( + wxMediaCtrlPlayerControls flags = wxMEDIACTRLPLAYERCONTROLS_DEFAULT); + + //helpers for the wxPython people + bool LoadURI(const wxString& fileName) + { return Load(wxURI(fileName)); } + bool LoadURIWithProxy(const wxString& fileName, const wxString& proxy) + { return Load(wxURI(fileName), wxURI(proxy)); } +#endif + +protected: + static wxClassInfo* NextBackend(); + + void OnMediaFinished(wxMediaEvent& evt); + virtual void DoMoveWindow(int x, int y, int w, int h); + wxSize DoGetBestSize() const; + + //FIXME: This is nasty... find a better way to work around + //inheritance issues +#if defined(__WXMAC__) + virtual void MacVisibilityChanged(); +#endif +#if defined(__WXMAC__) || defined(__WXCOCOA__) + friend class wxQTMediaBackend; +#endif + class wxMediaBackend* m_imp; + bool m_bLoaded; + + DECLARE_DYNAMIC_CLASS(wxMediaCtrl) +}; + +// ---------------------------------------------------------------------------- +// +// wxMediaBackend +// +// Derive from this and use standard wxWidgets RTTI +// (DECLARE_DYNAMIC_CLASS and IMPLEMENT_CLASS) to make a backend +// for wxMediaCtrl. Backends are searched alphabetically - +// the one with the earliest letter is tried first. +// +// Note that this is currently not API or ABI compatable - +// so statically link or make the client compile on-site. +// +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_MEDIA wxMediaBackend : public wxObject +{ +public: + wxMediaBackend() + { } + + virtual ~wxMediaBackend(); + + virtual bool CreateControl(wxControl* WXUNUSED(ctrl), + wxWindow* WXUNUSED(parent), + wxWindowID WXUNUSED(winid), + const wxPoint& WXUNUSED(pos), + const wxSize& WXUNUSED(size), + long WXUNUSED(style), + const wxValidator& WXUNUSED(validator), + const wxString& WXUNUSED(name)) + { return false; } + + virtual bool Play() + { return false; } + virtual bool Pause() + { return false; } + virtual bool Stop() + { return false; } + + virtual bool Load(const wxString& WXUNUSED(fileName)) + { return false; } + virtual bool Load(const wxURI& WXUNUSED(location)) + { return false; } + + virtual bool SetPosition(wxLongLong WXUNUSED(where)) + { return 0; } + virtual wxLongLong GetPosition() + { return 0; } + virtual wxLongLong GetDuration() + { return 0; } + + virtual void Move(int WXUNUSED(x), int WXUNUSED(y), + int WXUNUSED(w), int WXUNUSED(h)) + { } + virtual wxSize GetVideoSize() const + { return wxSize(0,0); } + + virtual double GetPlaybackRate() + { return 0.0; } + virtual bool SetPlaybackRate(double WXUNUSED(dRate)) + { return false; } + + virtual wxMediaState GetState() + { return wxMEDIASTATE_STOPPED; } + + virtual double GetVolume() + { return 0.0; } + virtual bool SetVolume(double WXUNUSED(dVolume)) + { return false; } + + virtual bool Load(const wxURI& WXUNUSED(location), + const wxURI& WXUNUSED(proxy)) + { return false; } + + virtual bool ShowPlayerControls( + wxMediaCtrlPlayerControls WXUNUSED(flags)) + { return false; } + virtual bool IsInterfaceShown() + { return false; } + + virtual wxLongLong GetDownloadProgress() + { return 0; } + virtual wxLongLong GetDownloadTotal() + { return 0; } + + virtual void MacVisibilityChanged() + { } + virtual void RESERVED9() {} + + DECLARE_DYNAMIC_CLASS(wxMediaBackend) +}; + + +//Event ID to give to our events +#define wxMEDIA_FINISHED_ID 13000 +#define wxMEDIA_STOP_ID 13001 + +//Define our event types - we need to call DEFINE_EVENT_TYPE(EVT) later +DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_MEDIA, wxEVT_MEDIA_FINISHED, wxMEDIA_FINISHED_ID) +DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_MEDIA, wxEVT_MEDIA_STOP, wxMEDIA_STOP_ID) + +//Function type(s) our events need +typedef void (wxEvtHandler::*wxMediaEventFunction)(wxMediaEvent&); + +#define wxMediaEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxMediaEventFunction, &func) + +//Macro for usage with message maps +#define EVT_MEDIA_FINISHED(winid, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_MEDIA_FINISHED, winid, wxID_ANY, wxMediaEventHandler(fn), (wxObject *) NULL ), +#define EVT_MEDIA_STOP(winid, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_MEDIA_STOP, winid, wxID_ANY, wxMediaEventHandler(fn), (wxObject *) NULL ), + +#if wxABI_VERSION >= 20602 /* 2.6.2+ only */ +# define wxMEDIA_LOADED_ID 13002 + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_MEDIA, wxEVT_MEDIA_LOADED, wxMEDIA_LOADED_ID) +# define EVT_MEDIA_LOADED(winid, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_MEDIA_LOADED, winid, wxID_ANY, wxMediaEventHandler(fn), (wxObject *) NULL ), +#endif + +#if wxABI_VERSION >= 20603 /* 2.6.3+ only */ +# define wxMEDIA_STATECHANGED_ID 13003 +# define wxMEDIA_PLAY_ID 13004 +# define wxMEDIA_PAUSE_ID 13005 + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_MEDIA, wxEVT_MEDIA_STATECHANGED, wxMEDIA_STATECHANGED_ID) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_MEDIA, wxEVT_MEDIA_PLAY, wxMEDIA_PLAY_ID) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_MEDIA, wxEVT_MEDIA_PAUSE, wxMEDIA_PAUSE_ID) +# define EVT_MEDIA_STATECHANGED(winid, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_MEDIA_STATECHANGED, winid, wxID_ANY, wxMediaEventHandler(fn), (wxObject *) NULL ), +# define EVT_MEDIA_PLAY(winid, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_MEDIA_PLAY, winid, wxID_ANY, wxMediaEventHandler(fn), (wxObject *) NULL ), +# define EVT_MEDIA_PAUSE(winid, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_MEDIA_PAUSE, winid, wxID_ANY, wxMediaEventHandler(fn), (wxObject *) NULL ), +#endif + +// ---------------------------------------------------------------------------- +// common backend base class used by many other backends +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_MEDIA wxMediaBackendCommonBase : public wxMediaBackend +{ +public: + // add a pending wxMediaEvent of the given type + void QueueEvent(wxEventType evtType); + + // notify that the movie playback is finished + void QueueFinishEvent() + { +#if wxABI_VERSION >= 20603 /* 2.6.3+ only */ + QueueEvent(wxEVT_MEDIA_STATECHANGED); +#endif + QueueEvent(wxEVT_MEDIA_FINISHED); + } + + // send the stop event and return true if it hasn't been vetoed + bool SendStopEvent(); + + // Queue pause event + void QueuePlayEvent(); + + // Queue pause event + void QueuePauseEvent(); + + // Queue stop event (no veto) + void QueueStopEvent(); + +protected: + // call this when the movie size has changed but not because it has just + // been loaded (in this case, call NotifyMovieLoaded() below) + void NotifyMovieSizeChanged(); + + // call this when the movie is fully loaded + void NotifyMovieLoaded(); + + + wxMediaCtrl *m_ctrl; // parent control +}; + +// ---------------------------------------------------------------------------- +// End compilation gaurd +// ---------------------------------------------------------------------------- +#endif // wxUSE_MEDIACTRL + +// ---------------------------------------------------------------------------- +// End header guard and header itself +// ---------------------------------------------------------------------------- +#endif // _WX_MEDIACTRL_H_ + + diff --git a/Externals/wxWidgets/include/wx/memconf.h b/Externals/wxWidgets/include/wx/memconf.h new file mode 100644 index 0000000000..9508b1fef9 --- /dev/null +++ b/Externals/wxWidgets/include/wx/memconf.h @@ -0,0 +1,54 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/memconf.h +// Purpose: wxMemoryConfig class: a wxConfigBase implementation which only +// stores the settings in memory (thus they are lost when the +// program terminates) +// Author: Vadim Zeitlin +// Modified by: +// Created: 22.01.00 +// RCS-ID: $Id: memconf.h 35650 2005-09-23 12:56:45Z MR $ +// Copyright: (c) 2000 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +/* + * NB: I don't see how this class may possibly be useful to the application + * program (as the settings are lost on program termination), but it is + * handy to have it inside wxWidgets. So for now let's say that this class + * is private and should only be used by wxWidgets itself - this might + * change in the future. + */ + +#ifndef _WX_MEMCONF_H_ +#define _WX_MEMCONF_H_ + +#if wxUSE_CONFIG + +#include "wx/fileconf.h" // the base class + +// ---------------------------------------------------------------------------- +// wxMemoryConfig: a config class which stores settings in non-persistent way +// ---------------------------------------------------------------------------- + +// notice that we inherit from wxFileConfig which already stores its data in +// memory and just disable file reading/writing - this is probably not optimal +// and might be changed in future as well (this class will always deriev from +// wxConfigBase though) +class wxMemoryConfig : public wxFileConfig +{ +public: + // default (and only) ctor + wxMemoryConfig() : wxFileConfig(wxEmptyString, // default app name + wxEmptyString, // default vendor name + wxEmptyString, // no local config file + wxEmptyString, // no system config file + 0) // don't use any files + { + } + + DECLARE_NO_COPY_CLASS(wxMemoryConfig) +}; + +#endif // wxUSE_CONFIG + +#endif // _WX_MEMCONF_H_ diff --git a/Externals/wxWidgets/include/wx/memory.h b/Externals/wxWidgets/include/wx/memory.h new file mode 100644 index 0000000000..e4594f66e3 --- /dev/null +++ b/Externals/wxWidgets/include/wx/memory.h @@ -0,0 +1,373 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/memory.h +// Purpose: Memory operations +// Author: Arthur Seaton, Julian Smart +// Modified by: +// Created: 29/01/98 +// RCS-ID: $Id: memory.h 39634 2006-06-08 12:51:01Z ABX $ +// Copyright: (c) 1998 Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MEMORYH__ +#define _WX_MEMORYH__ + +#include "wx/defs.h" +#include "wx/string.h" +#include "wx/msgout.h" + +/* + The macro which will be expanded to include the file and line number + info, or to be a straight call to the new operator. +*/ + +#if (defined(__WXDEBUG__) && wxUSE_MEMORY_TRACING) || wxUSE_DEBUG_CONTEXT + +#include <stddef.h> + +#ifdef __WXDEBUG__ + +WXDLLIMPEXP_BASE void * wxDebugAlloc(size_t size, wxChar * fileName, int lineNum, bool isObject, bool isVect = false); +WXDLLIMPEXP_BASE void wxDebugFree(void * buf, bool isVect = false); + +//********************************************************************************** +/* + The global operator new used for everything apart from getting + dynamic storage within this function itself. +*/ + +// We'll only do malloc and free for the moment: leave the interesting +// stuff for the wxObject versions. + + +#if wxUSE_GLOBAL_MEMORY_OPERATORS + +// Undefine temporarily (new is #defined in object.h) because we want to +// declare some new operators. +#ifdef new + #undef new +#endif + +#if defined(__SUNCC__) + #define wxUSE_ARRAY_MEMORY_OPERATORS 0 +#elif !( defined (__VISUALC__) && (__VISUALC__ <= 1020) ) || defined( __MWERKS__) + #define wxUSE_ARRAY_MEMORY_OPERATORS 1 +#elif defined (__SGI_CC_) + // only supported by -n32 compilers + #ifndef __EDG_ABI_COMPATIBILITY_VERSION + #define wxUSE_ARRAY_MEMORY_OPERATORS 0 + #endif +#elif !( defined (__VISUALC__) && (__VISUALC__ <= 1020) ) || defined( __MWERKS__) + #define wxUSE_ARRAY_MEMORY_OPERATORS 1 +#else + // ::operator new[] is a recent C++ feature, so assume it's not supported + #define wxUSE_ARRAY_MEMORY_OPERATORS 0 +#endif + +// devik 2000-8-29: All new/delete ops are now inline because they can't +// be marked as dllexport/dllimport. It then leads to weird bugs when +// used on MSW as DLL +#if defined(__WXMSW__) && (defined(WXUSINGDLL) || defined(WXMAKINGDLL_BASE)) +inline void * operator new (size_t size, wxChar * fileName, int lineNum) +{ + return wxDebugAlloc(size, fileName, lineNum, false, false); +} + +inline void * operator new (size_t size) +{ + return wxDebugAlloc(size, NULL, 0, false); +} + +inline void operator delete (void * buf) +{ + wxDebugFree(buf, false); +} + +#if wxUSE_ARRAY_MEMORY_OPERATORS +inline void * operator new[] (size_t size) +{ + return wxDebugAlloc(size, NULL, 0, false, true); +} + +inline void * operator new[] (size_t size, wxChar * fileName, int lineNum) +{ + return wxDebugAlloc(size, fileName, lineNum, false, true); +} + +inline void operator delete[] (void * buf) +{ + wxDebugFree(buf, true); +} +#endif // wxUSE_ARRAY_MEMORY_OPERATORS + +#else + +void * operator new (size_t size, wxChar * fileName, int lineNum); + +void * operator new (size_t size); + +void operator delete (void * buf); + +#if wxUSE_ARRAY_MEMORY_OPERATORS +void * operator new[] (size_t size); + +void * operator new[] (size_t size, wxChar * fileName, int lineNum); + +void operator delete[] (void * buf); +#endif // wxUSE_ARRAY_MEMORY_OPERATORS +#endif // defined(__WXMSW__) && (defined(WXUSINGDLL) || defined(WXMAKINGDLL_BASE)) + +// VC++ 6.0 and MWERKS +#if ( defined(__VISUALC__) && (__VISUALC__ >= 1200) ) || defined(__MWERKS__) +inline void operator delete(void* pData, wxChar* /* fileName */, int /* lineNum */) +{ + wxDebugFree(pData, false); +} +inline void operator delete[](void* pData, wxChar* /* fileName */, int /* lineNum */) +{ + wxDebugFree(pData, true); +} +#endif // __VISUALC__>=1200 +#endif // wxUSE_GLOBAL_MEMORY_OPERATORS +#endif // __WXDEBUG__ + +//********************************************************************************** + +typedef unsigned int wxMarkerType; + +/* + Define the struct which will be placed at the start of all dynamically + allocated memory. +*/ + +class WXDLLIMPEXP_BASE wxMemStruct { + +friend class WXDLLIMPEXP_BASE wxDebugContext; // access to the m_next pointer for list traversal. + +public: +public: + int AssertList (); + + size_t RequestSize () { return m_reqSize; } + wxMarkerType Marker () { return m_firstMarker; } + + // When an object is deleted we set the id slot to a specific value. + inline void SetDeleted (); + inline int IsDeleted (); + + int Append (); + int Unlink (); + + // Used to determine if the object is really a wxMemStruct. + // Not a foolproof test by any means, but better than none I hope! + int AssertIt (); + + // Do all validation on a node. + int ValidateNode (); + + // Check the integrity of a node and of the list, node by node. + int CheckBlock (); + int CheckAllPrevious (); + + // Print a single node. + void PrintNode (); + + // Called when the memory linking functions get an error. + void ErrorMsg (const char *); + void ErrorMsg (); + + inline void *GetActualData(void) const { return m_actualData; } + + void Dump(void); + +public: + // Check for underwriting. There are 2 of these checks. This one + // inside the struct and another right after the struct. + wxMarkerType m_firstMarker; + + // File name and line number are from cpp. + wxChar* m_fileName; + int m_lineNum; + + // The amount of memory requested by the caller. + size_t m_reqSize; + + // Used to try to verify that we really are dealing with an object + // of the required class. Can be 1 of 2 values these indicating a valid + // wxMemStruct object, or a deleted wxMemStruct object. + wxMarkerType m_id; + + wxMemStruct * m_prev; + wxMemStruct * m_next; + + void * m_actualData; + bool m_isObject; +}; + + +typedef void (wxMemStruct::*PmSFV) (); + + +/* + Debugging class. This will only have a single instance, but it's + a reasonable way to keep everything together and to make this + available for change if needed by someone else. + A lot of this stuff would be better off within the wxMemStruct class, but + it's stuff which we need to access at times when there is no wxMemStruct + object so we use this class instead. Think of it as a collection of + globals which have to do with the wxMemStruct class. +*/ + +class WXDLLIMPEXP_BASE wxDebugContext { + +protected: + // Used to set alignment for markers. + static size_t CalcAlignment (); + + // Returns the amount of padding needed after something of the given + // size. This is so that when we cast pointers backwards and forwards + // the pointer value will be valid for a wxMarkerType. + static size_t GetPadding (const size_t size) ; + + // Traverse the list. + static void TraverseList (PmSFV, wxMemStruct *from = NULL); + + static int debugLevel; + static bool debugOn; + + static int m_balign; // byte alignment + static int m_balignmask; // mask for performing byte alignment +public: + // Set a checkpoint to dump only the memory from + // a given point + static wxMemStruct *checkPoint; + + wxDebugContext(void); + ~wxDebugContext(void); + + static int GetLevel(void) { return debugLevel; } + static void SetLevel(int level) { debugLevel = level; } + + static bool GetDebugMode(void) { return debugOn; } + static void SetDebugMode(bool flag) { debugOn = flag; } + + static void SetCheckpoint(bool all = false); + static wxMemStruct *GetCheckpoint(void) { return checkPoint; } + + // Calculated from the request size and any padding needed + // before the final marker. + static size_t PaddedSize (const size_t reqSize); + + // Calc the total amount of space we need from the system + // to satisfy a caller request. This includes all padding. + static size_t TotSize (const size_t reqSize); + + // Return valid pointers to offsets within the allocated memory. + static char * StructPos (const char * buf); + static char * MidMarkerPos (const char * buf); + static char * CallerMemPos (const char * buf); + static char * EndMarkerPos (const char * buf, const size_t size); + + // Given a pointer to the start of the caller requested area + // return a pointer to the start of the entire alloc\'d buffer. + static char * StartPos (const char * caller); + + // Access to the list. + static wxMemStruct * GetHead () { return m_head; } + static wxMemStruct * GetTail () { return m_tail; } + + // Set the list sentinals. + static wxMemStruct * SetHead (wxMemStruct * st) { return (m_head = st); } + static wxMemStruct * SetTail (wxMemStruct * st) { return (m_tail = st); } + + // If this is set then every new operation checks the validity + // of the all previous nodes in the list. + static bool GetCheckPrevious () { return m_checkPrevious; } + static void SetCheckPrevious (bool value) { m_checkPrevious = value; } + + // Checks all nodes, or all nodes if checkAll is true + static int Check(bool checkAll = false); + + // Print out the list of wxMemStruct nodes. + static bool PrintList(void); + + // Dump objects + static bool Dump(void); + + // Print statistics + static bool PrintStatistics(bool detailed = true); + + // Print out the classes in the application. + static bool PrintClasses(void); + + // Count the number of non-wxDebugContext-related objects + // that are outstanding + static int CountObjectsLeft(bool sinceCheckpoint = false); + + // This function is used to output the dump + static void OutputDumpLine(const wxChar *szFormat, ...); + +private: + // Store these here to allow access to the list without + // needing to have a wxMemStruct object. + static wxMemStruct* m_head; + static wxMemStruct* m_tail; + + // Set to false if we're not checking all previous nodes when + // we do a new. Set to true when we are. + static bool m_checkPrevious; +}; + +// Final cleanup (e.g. deleting the log object and doing memory leak checking) +// will be delayed until all wxDebugContextDumpDelayCounter objects have been +// destructed. Adding one wxDebugContextDumpDelayCounter per file will delay +// memory leak checking until after destructing all global objects. +class WXDLLIMPEXP_BASE wxDebugContextDumpDelayCounter +{ +public: + wxDebugContextDumpDelayCounter() { + sm_count++; + } + + ~wxDebugContextDumpDelayCounter() { + sm_count--; + if(!sm_count) DoDump(); + } +private: + void DoDump(); + static int sm_count; +}; + +// make leak dump after all globals have been destructed +static wxDebugContextDumpDelayCounter wxDebugContextDumpDelayCounter_File; +#define WXDEBUG_DUMPDELAYCOUNTER \ + static wxDebugContextDumpDelayCounter wxDebugContextDumpDelayCounter_Extra; + +// Output a debug message, in a system dependent fashion. +void WXDLLIMPEXP_BASE wxTrace(const wxChar *fmt ...) ATTRIBUTE_PRINTF_1; +void WXDLLIMPEXP_BASE wxTraceLevel(int level, const wxChar *fmt ...) ATTRIBUTE_PRINTF_2; + +#define WXTRACE wxTrace +#define WXTRACELEVEL wxTraceLevel + +#else // (defined(__WXDEBUG__) && wxUSE_MEMORY_TRACING) || wxUSE_DEBUG_CONTEXT + +#define WXDEBUG_DUMPDELAYCOUNTER + +// Borland C++ Builder 6 seems to have troubles with inline functions (see bug +// 819700) +#if 0 + inline void wxTrace(const wxChar *WXUNUSED(fmt)) {} + inline void wxTraceLevel(int WXUNUSED(level), const wxChar *WXUNUSED(fmt)) {} +#else + #define wxTrace(fmt) + #define wxTraceLevel(l, fmt) +#endif + +#define WXTRACE true ? (void)0 : wxTrace +#define WXTRACELEVEL true ? (void)0 : wxTraceLevel + +#endif // (defined(__WXDEBUG__) && wxUSE_MEMORY_TRACING) || wxUSE_DEBUG_CONTEXT + +#endif + // _WX_MEMORYH__ diff --git a/Externals/wxWidgets/include/wx/memtext.h b/Externals/wxWidgets/include/wx/memtext.h new file mode 100644 index 0000000000..16706092ac --- /dev/null +++ b/Externals/wxWidgets/include/wx/memtext.h @@ -0,0 +1,54 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/memtext.h +// Purpose: wxMemoryText allows to use wxTextBuffer without a file +// Created: 14.11.01 +// Author: Morten Hanssen +// Copyright: (c) 2001 Morten Hanssen +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MEMTEXT_H +#define _WX_MEMTEXT_H + +#include "wx/defs.h" + +// there is no separate setting for wxMemoryText, it's smallish anyhow +#if wxUSE_TEXTBUFFER + +// ---------------------------------------------------------------------------- +// wxMemoryText +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxMemoryText : public wxTextBuffer +{ +public: + // Constructors. + wxMemoryText() { } + wxMemoryText(const wxString& name) : wxTextBuffer(name) { } + +protected: + virtual bool OnExists() const + { return false; } + + virtual bool OnOpen(const wxString & WXUNUSED(strBufferName), + wxTextBufferOpenMode WXUNUSED(OpenMode)) + { return true; } + + virtual bool OnClose() + { return true; } + + virtual bool OnRead(const wxMBConv& WXUNUSED(conv)) + { return true; } + + virtual bool OnWrite(wxTextFileType WXUNUSED(typeNew), + const wxMBConv& WXUNUSED(conv) = wxConvUTF8) + { return true; } + +private: + DECLARE_NO_COPY_CLASS(wxMemoryText) +}; + +#endif // wxUSE_TEXTBUFFER + +#endif // _WX_MEMTEXT_H + diff --git a/Externals/wxWidgets/include/wx/menu.h b/Externals/wxWidgets/include/wx/menu.h new file mode 100644 index 0000000000..dad76c795e --- /dev/null +++ b/Externals/wxWidgets/include/wx/menu.h @@ -0,0 +1,555 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/menu.h +// Purpose: wxMenu and wxMenuBar classes +// Author: Vadim Zeitlin +// Modified by: +// Created: 26.10.99 +// RCS-ID: $Id: menu.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MENU_H_BASE_ +#define _WX_MENU_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_MENUS + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/list.h" // for "template" list classes +#include "wx/window.h" // base class for wxMenuBar + +// also include this one to ensure compatibility with old code which only +// included wx/menu.h +#include "wx/menuitem.h" + +class WXDLLIMPEXP_FWD_CORE wxMenu; +class WXDLLIMPEXP_FWD_CORE wxMenuBarBase; +class WXDLLIMPEXP_FWD_CORE wxMenuBar; +class WXDLLIMPEXP_FWD_CORE wxMenuItem; + +// pseudo template list classes +WX_DECLARE_EXPORTED_LIST(wxMenu, wxMenuList); +WX_DECLARE_EXPORTED_LIST(wxMenuItem, wxMenuItemList); + +// ---------------------------------------------------------------------------- +// wxMenu +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxMenuBase : public wxEvtHandler +{ +public: + // create a menu + static wxMenu *New(const wxString& title = wxEmptyString, long style = 0); + + // ctors + wxMenuBase(const wxString& title, long style = 0) : m_title(title) + { Init(style); } + wxMenuBase(long style = 0) + { Init(style); } + + // dtor deletes all the menu items we own + virtual ~wxMenuBase(); + + // menu construction + // ----------------- + + // append any kind of item (normal/check/radio/separator) + wxMenuItem* Append(int itemid, + const wxString& text = wxEmptyString, + const wxString& help = wxEmptyString, + wxItemKind kind = wxITEM_NORMAL) + { + return DoAppend(wxMenuItem::New((wxMenu *)this, itemid, text, help, kind)); + } + + // append a separator to the menu + wxMenuItem* AppendSeparator() { return Append(wxID_SEPARATOR, wxEmptyString); } + + // append a check item + wxMenuItem* AppendCheckItem(int itemid, + const wxString& text, + const wxString& help = wxEmptyString) + { + return Append(itemid, text, help, wxITEM_CHECK); + } + + // append a radio item + wxMenuItem* AppendRadioItem(int itemid, + const wxString& text, + const wxString& help = wxEmptyString) + { + return Append(itemid, text, help, wxITEM_RADIO); + } + + // append a submenu + wxMenuItem* AppendSubMenu(wxMenu *submenu, + const wxString& text, + const wxString& help = wxEmptyString) + { + return DoAppend(wxMenuItem::New((wxMenu *)this, wxID_ANY, text, help, + wxITEM_NORMAL, submenu)); + } + + // the most generic form of Append() - append anything + wxMenuItem* Append(wxMenuItem *item) { return DoAppend(item); } + + // insert a break in the menu (only works when appending the items, not + // inserting them) + virtual void Break() { } + + // insert an item before given position + wxMenuItem* Insert(size_t pos, wxMenuItem *item); + + // insert an item before given position + wxMenuItem* Insert(size_t pos, + int itemid, + const wxString& text = wxEmptyString, + const wxString& help = wxEmptyString, + wxItemKind kind = wxITEM_NORMAL) + { + return Insert(pos, wxMenuItem::New((wxMenu *)this, itemid, text, help, kind)); + } + + // insert a separator + wxMenuItem* InsertSeparator(size_t pos) + { + return Insert(pos, wxMenuItem::New((wxMenu *)this, wxID_SEPARATOR)); + } + + // insert a check item + wxMenuItem* InsertCheckItem(size_t pos, + int itemid, + const wxString& text, + const wxString& help = wxEmptyString) + { + return Insert(pos, itemid, text, help, wxITEM_CHECK); + } + + // insert a radio item + wxMenuItem* InsertRadioItem(size_t pos, + int itemid, + const wxString& text, + const wxString& help = wxEmptyString) + { + return Insert(pos, itemid, text, help, wxITEM_RADIO); + } + + // insert a submenu + wxMenuItem* Insert(size_t pos, + int itemid, + const wxString& text, + wxMenu *submenu, + const wxString& help = wxEmptyString) + { + return Insert(pos, wxMenuItem::New((wxMenu *)this, itemid, text, help, + wxITEM_NORMAL, submenu)); + } + + // prepend an item to the menu + wxMenuItem* Prepend(wxMenuItem *item) + { + return Insert(0u, item); + } + + // prepend any item to the menu + wxMenuItem* Prepend(int itemid, + const wxString& text = wxEmptyString, + const wxString& help = wxEmptyString, + wxItemKind kind = wxITEM_NORMAL) + { + return Insert(0u, itemid, text, help, kind); + } + + // prepend a separator + wxMenuItem* PrependSeparator() + { + return InsertSeparator(0u); + } + + // prepend a check item + wxMenuItem* PrependCheckItem(int itemid, + const wxString& text, + const wxString& help = wxEmptyString) + { + return InsertCheckItem(0u, itemid, text, help); + } + + // prepend a radio item + wxMenuItem* PrependRadioItem(int itemid, + const wxString& text, + const wxString& help = wxEmptyString) + { + return InsertRadioItem(0u, itemid, text, help); + } + + // prepend a submenu + wxMenuItem* Prepend(int itemid, + const wxString& text, + wxMenu *submenu, + const wxString& help = wxEmptyString) + { + return Insert(0u, itemid, text, submenu, help); + } + + // detach an item from the menu, but don't delete it so that it can be + // added back later (but if it's not, the caller is responsible for + // deleting it!) + wxMenuItem *Remove(int itemid) { return Remove(FindChildItem(itemid)); } + wxMenuItem *Remove(wxMenuItem *item); + + // delete an item from the menu (submenus are not destroyed by this + // function, see Destroy) + bool Delete(int itemid) { return Delete(FindChildItem(itemid)); } + bool Delete(wxMenuItem *item); + + // delete the item from menu and destroy it (if it's a submenu) + bool Destroy(int itemid) { return Destroy(FindChildItem(itemid)); } + bool Destroy(wxMenuItem *item); + + // menu items access + // ----------------- + + // get the items + size_t GetMenuItemCount() const { return m_items.GetCount(); } + + const wxMenuItemList& GetMenuItems() const { return m_items; } + wxMenuItemList& GetMenuItems() { return m_items; } + + // search + virtual int FindItem(const wxString& item) const; + wxMenuItem* FindItem(int itemid, wxMenu **menu = NULL) const; + + // find by position + wxMenuItem* FindItemByPosition(size_t position) const; + + // get/set items attributes + void Enable(int itemid, bool enable); + bool IsEnabled(int itemid) const; + + void Check(int itemid, bool check); + bool IsChecked(int itemid) const; + + void SetLabel(int itemid, const wxString& label); + wxString GetLabel(int itemid) const; + + virtual void SetHelpString(int itemid, const wxString& helpString); + virtual wxString GetHelpString(int itemid) const; + + // misc accessors + // -------------- + + // the title + virtual void SetTitle(const wxString& title) { m_title = title; } + const wxString GetTitle() const { return m_title; } + + // event handler + void SetEventHandler(wxEvtHandler *handler) { m_eventHandler = handler; } + wxEvtHandler *GetEventHandler() const { return m_eventHandler; } + + // invoking window + void SetInvokingWindow(wxWindow *win) { m_invokingWindow = win; } + wxWindow *GetInvokingWindow() const { return m_invokingWindow; } + + // style + long GetStyle() const { return m_style; } + + // implementation helpers + // ---------------------- + + // Updates the UI for a menu and all submenus recursively. source is the + // object that has the update event handlers defined for it. If NULL, the + // menu or associated window will be used. + void UpdateUI(wxEvtHandler* source = (wxEvtHandler*)NULL); + + // get the menu bar this menu is attached to (may be NULL, always NULL for + // popup menus). Traverse up the menu hierarchy to find it. + wxMenuBar *GetMenuBar() const; + + // called when the menu is attached/detached to/from a menu bar + virtual void Attach(wxMenuBarBase *menubar); + virtual void Detach(); + + // is the menu attached to a menu bar (or is it a popup one)? + bool IsAttached() const { return GetMenuBar() != NULL; } + + // set/get the parent of this menu + void SetParent(wxMenu *parent) { m_menuParent = parent; } + wxMenu *GetParent() const { return m_menuParent; } + + // implementation only from now on + // ------------------------------- + + // unlike FindItem(), this function doesn't recurse but only looks through + // our direct children and also may return the index of the found child if + // pos != NULL + wxMenuItem *FindChildItem(int itemid, size_t *pos = NULL) const; + + // called to generate a wxCommandEvent, return true if it was processed, + // false otherwise + // + // the checked parameter may have boolean value or -1 for uncheckable items + bool SendEvent(int itemid, int checked = -1); + + // compatibility: these functions are deprecated, use the new ones instead + // ----------------------------------------------------------------------- + + // use the versions taking wxItem_XXX now instead, they're more readable + // and allow adding the radio items as well + void Append(int itemid, + const wxString& text, + const wxString& help, + bool isCheckable) + { + Append(itemid, text, help, isCheckable ? wxITEM_CHECK : wxITEM_NORMAL); + } + + // use more readable and not requiring unused itemid AppendSubMenu() instead + wxMenuItem* Append(int itemid, + const wxString& text, + wxMenu *submenu, + const wxString& help = wxEmptyString) + { + return DoAppend(wxMenuItem::New((wxMenu *)this, itemid, text, help, + wxITEM_NORMAL, submenu)); + } + + void Insert(size_t pos, + int itemid, + const wxString& text, + const wxString& help, + bool isCheckable) + { + Insert(pos, itemid, text, help, isCheckable ? wxITEM_CHECK : wxITEM_NORMAL); + } + + void Prepend(int itemid, + const wxString& text, + const wxString& help, + bool isCheckable) + { + Insert(0u, itemid, text, help, isCheckable); + } + + static void LockAccels(bool locked) + { + ms_locked = locked; + } + +protected: + // virtuals to override in derived classes + // --------------------------------------- + + virtual wxMenuItem* DoAppend(wxMenuItem *item); + virtual wxMenuItem* DoInsert(size_t pos, wxMenuItem *item); + + virtual wxMenuItem *DoRemove(wxMenuItem *item); + virtual bool DoDelete(wxMenuItem *item); + virtual bool DoDestroy(wxMenuItem *item); + + // helpers + // ------- + + // common part of all ctors + void Init(long style); + + // associate the submenu with this menu + void AddSubMenu(wxMenu *submenu); + + wxMenuBar *m_menuBar; // menubar we belong to or NULL + wxMenu *m_menuParent; // parent menu or NULL + + wxString m_title; // the menu title or label + wxMenuItemList m_items; // the list of menu items + + wxWindow *m_invokingWindow; // for popup menus + + long m_style; // combination of wxMENU_XXX flags + + wxEvtHandler *m_eventHandler; // a pluggable in event handler + + static bool ms_locked; + + DECLARE_NO_COPY_CLASS(wxMenuBase) + +public: + +#if wxABI_VERSION >= 20805 + // Returns the stripped label + wxString GetLabelText(int itemid) const { return wxMenuItem::GetLabelFromText(GetLabel(itemid)); } +#endif + +}; + +// ---------------------------------------------------------------------------- +// wxMenuBar +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxMenuBarBase : public wxWindow +{ +public: + // default ctor + wxMenuBarBase(); + + // dtor will delete all menus we own + virtual ~wxMenuBarBase(); + + // menu bar construction + // --------------------- + + // append a menu to the end of menubar, return true if ok + virtual bool Append(wxMenu *menu, const wxString& title); + + // insert a menu before the given position into the menubar, return true + // if inserted ok + virtual bool Insert(size_t pos, wxMenu *menu, const wxString& title); + + // menu bar items access + // --------------------- + + // get the number of menus in the menu bar + size_t GetMenuCount() const { return m_menus.GetCount(); } + + // get the menu at given position + wxMenu *GetMenu(size_t pos) const; + + // replace the menu at given position with another one, returns the + // previous menu (which should be deleted by the caller) + virtual wxMenu *Replace(size_t pos, wxMenu *menu, const wxString& title); + + // delete the menu at given position from the menu bar, return the pointer + // to the menu (which should be deleted by the caller) + virtual wxMenu *Remove(size_t pos); + + // enable or disable a submenu + virtual void EnableTop(size_t pos, bool enable) = 0; + + // is the menu enabled? + virtual bool IsEnabledTop(size_t WXUNUSED(pos)) const { return true; } + + // get or change the label of the menu at given position + virtual void SetLabelTop(size_t pos, const wxString& label) = 0; + virtual wxString GetLabelTop(size_t pos) const = 0; + + // item search + // ----------- + + // by menu and item names, returns wxNOT_FOUND if not found or id of the + // found item + virtual int FindMenuItem(const wxString& menu, const wxString& item) const; + + // find item by id (in any menu), returns NULL if not found + // + // if menu is !NULL, it will be filled with wxMenu this item belongs to + virtual wxMenuItem* FindItem(int itemid, wxMenu **menu = NULL) const; + + // find menu by its caption, return wxNOT_FOUND on failure + int FindMenu(const wxString& title) const; + + // item access + // ----------- + + // all these functions just use FindItem() and then call an appropriate + // method on it + // + // NB: under MSW, these methods can only be used after the menubar had + // been attached to the frame + + void Enable(int itemid, bool enable); + void Check(int itemid, bool check); + bool IsChecked(int itemid) const; + bool IsEnabled(int itemid) const; + virtual bool IsEnabled() const { return wxWindow::IsEnabled(); } + + void SetLabel(int itemid, const wxString &label); + wxString GetLabel(int itemid) const; + + void SetHelpString(int itemid, const wxString& helpString); + wxString GetHelpString(int itemid) const; + + // implementation helpers + + // get the frame we are attached to (may return NULL) + wxFrame *GetFrame() const { return m_menuBarFrame; } + + // returns true if we're attached to a frame + bool IsAttached() const { return GetFrame() != NULL; } + + // associate the menubar with the frame + virtual void Attach(wxFrame *frame); + + // called before deleting the menubar normally + virtual void Detach(); + + // need to override these ones to avoid virtual function hiding + virtual bool Enable(bool enable = true) { return wxWindow::Enable(enable); } + virtual void SetLabel(const wxString& s) { wxWindow::SetLabel(s); } + virtual wxString GetLabel() const { return wxWindow::GetLabel(); } + + // don't want menu bars to accept the focus by tabbing to them + virtual bool AcceptsFocusFromKeyboard() const { return false; } + + // update all menu item states in all menus + virtual void UpdateMenus(); + +protected: + // the list of all our menus + wxMenuList m_menus; + + // the frame we are attached to (may be NULL) + wxFrame *m_menuBarFrame; + + DECLARE_NO_COPY_CLASS(wxMenuBarBase) + +public: + +#if wxABI_VERSION >= 20805 + // Replacement for SetLabelTop + void SetMenuLabel(size_t pos, const wxString& label) { SetLabelTop(pos, label); } + + // Gets the original label at the top-level of the menubar + // Implemented per port, since we can't have virtual functions in the stable branch. + // wxString GetMenuLabel(size_t pos) const; + + // Get the text only, from the label at the top-level of the menubar + wxString GetMenuLabelText(size_t pos) const; +#endif + +}; + +// ---------------------------------------------------------------------------- +// include the real class declaration +// ---------------------------------------------------------------------------- + +#ifdef wxUSE_BASE_CLASSES_ONLY + #define wxMenuItem wxMenuItemBase +#else // !wxUSE_BASE_CLASSES_ONLY +#if defined(__WXUNIVERSAL__) + #include "wx/univ/menu.h" +#elif defined(__WXPALMOS__) + #include "wx/palmos/menu.h" +#elif defined(__WXMSW__) + #include "wx/msw/menu.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/menu.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/menu.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/menu.h" +#elif defined(__WXMAC__) + #include "wx/mac/menu.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/menu.h" +#elif defined(__WXPM__) + #include "wx/os2/menu.h" +#endif +#endif // wxUSE_BASE_CLASSES_ONLY/!wxUSE_BASE_CLASSES_ONLY + +#endif // wxUSE_MENUS + +#endif + // _WX_MENU_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/menuitem.h b/Externals/wxWidgets/include/wx/menuitem.h new file mode 100644 index 0000000000..2a55e582bd --- /dev/null +++ b/Externals/wxWidgets/include/wx/menuitem.h @@ -0,0 +1,203 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/menuitem.h +// Purpose: wxMenuItem class +// Author: Vadim Zeitlin +// Modified by: +// Created: 25.10.99 +// RCS-ID: $Id: menuitem.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) 1999 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MENUITEM_H_BASE_ +#define _WX_MENUITEM_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_MENUS + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/object.h" // base class + +// ---------------------------------------------------------------------------- +// forward declarations +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_CORE wxAcceleratorEntry; +class WXDLLIMPEXP_FWD_CORE wxMenuItem; +class WXDLLIMPEXP_FWD_CORE wxMenu; + +// ---------------------------------------------------------------------------- +// wxMenuItem is an item in the menu which may be either a normal item, a sub +// menu or a separator +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxMenuItemBase : public wxObject +{ +public: + // creation + static wxMenuItem *New(wxMenu *parentMenu = (wxMenu *)NULL, + int itemid = wxID_SEPARATOR, + const wxString& text = wxEmptyString, + const wxString& help = wxEmptyString, + wxItemKind kind = wxITEM_NORMAL, + wxMenu *subMenu = (wxMenu *)NULL); + + // destruction: wxMenuItem will delete its submenu + virtual ~wxMenuItemBase(); + + // the menu we're in + wxMenu *GetMenu() const { return m_parentMenu; } + void SetMenu(wxMenu* menu) { m_parentMenu = menu; } + + // get/set id + void SetId(int itemid) { m_id = itemid; } + int GetId() const { return m_id; } + bool IsSeparator() const { return m_id == wxID_SEPARATOR; } + + // the item's text (or name) + // + // NB: the item's text includes the accelerators and mnemonics info (if + // any), i.e. it may contain '&' or '_' or "\t..." and thus is + // different from the item's label which only contains the text shown + // in the menu + virtual void SetText(const wxString& str); + + wxString GetLabel() const { return GetLabelFromText(m_text); } + const wxString& GetText() const { return m_text; } + + // get the label from text (implemented in platform-specific code) + static wxString GetLabelFromText(const wxString& text); + + // what kind of menu item we are + wxItemKind GetKind() const { return m_kind; } + void SetKind(wxItemKind kind) { m_kind = kind; } + + virtual void SetCheckable(bool checkable) { m_kind = checkable ? wxITEM_CHECK : wxITEM_NORMAL; } + bool IsCheckable() const + { return m_kind == wxITEM_CHECK || m_kind == wxITEM_RADIO; } + + bool IsSubMenu() const { return m_subMenu != NULL; } + void SetSubMenu(wxMenu *menu) { m_subMenu = menu; } + wxMenu *GetSubMenu() const { return m_subMenu; } + + // state + virtual void Enable(bool enable = true) { m_isEnabled = enable; } + virtual bool IsEnabled() const { return m_isEnabled; } + + virtual void Check(bool check = true) { m_isChecked = check; } + virtual bool IsChecked() const { return m_isChecked; } + void Toggle() { Check(!m_isChecked); } + + // help string (displayed in the status bar by default) + void SetHelp(const wxString& str); + const wxString& GetHelp() const { return m_help; } + +#if wxUSE_ACCEL + // extract the accelerator from the given menu string, return NULL if none + // found + static wxAcceleratorEntry *GetAccelFromString(const wxString& label); + + // get our accelerator or NULL (caller must delete the pointer) + virtual wxAcceleratorEntry *GetAccel() const; + + // set the accel for this item - this may also be done indirectly with + // SetText() + virtual void SetAccel(wxAcceleratorEntry *accel); +#endif // wxUSE_ACCEL + + // compatibility only, use new functions in the new code + void SetName(const wxString& str) { SetText(str); } + const wxString& GetName() const { return GetText(); } + + static wxMenuItem *New(wxMenu *parentMenu, + int itemid, + const wxString& text, + const wxString& help, + bool isCheckable, + wxMenu *subMenu = (wxMenu *)NULL) + { + return New(parentMenu, itemid, text, help, + isCheckable ? wxITEM_CHECK : wxITEM_NORMAL, subMenu); + } + +protected: + int m_id; // numeric id of the item >= 0 or wxID_ANY or wxID_SEPARATOR + wxMenu *m_parentMenu, // the menu we belong to + *m_subMenu; // our sub menu or NULL + wxString m_text, // label of the item + m_help; // the help string for the item + wxItemKind m_kind; // separator/normal/check/radio item? + bool m_isChecked; // is checked? + bool m_isEnabled; // is enabled? + + // this ctor is for the derived classes only, we're never created directly + wxMenuItemBase(wxMenu *parentMenu = (wxMenu *)NULL, + int itemid = wxID_SEPARATOR, + const wxString& text = wxEmptyString, + const wxString& help = wxEmptyString, + wxItemKind kind = wxITEM_NORMAL, + wxMenu *subMenu = (wxMenu *)NULL); + +private: + // and, if we have one ctor, compiler won't generate a default copy one, so + // declare them ourselves - but don't implement as they shouldn't be used + wxMenuItemBase(const wxMenuItemBase& item); + wxMenuItemBase& operator=(const wxMenuItemBase& item); + +public: + +#if wxABI_VERSION >= 20805 + // Sets the label. This function replaces SetText. + void SetItemLabel(const wxString& str) { SetText(str); } + + // return the item label including any mnemonics and accelerators. + // This used to be called GetText. + // We can't implement this in the base class (no new virtuals in stable branch) + // wxString GetItemLabel() const; + + // return just the text of the item label, without any mnemonics + // This used to be called GetLabel. + wxString GetItemLabelText() const { return GetLabelText(m_text); } + + // return just the text part of the given label. In 2.9 and up, this is implemented in + // platform-specific code, but is now implemented in terms of GetLabelFromText. + static wxString GetLabelText(const wxString& label); +#endif +}; + +// ---------------------------------------------------------------------------- +// include the real class declaration +// ---------------------------------------------------------------------------- + +#ifdef wxUSE_BASE_CLASSES_ONLY + #define wxMenuItem wxMenuItemBase +#else // !wxUSE_BASE_CLASSES_ONLY +#if defined(__WXUNIVERSAL__) + #include "wx/univ/menuitem.h" +#elif defined(__WXPALMOS__) + #include "wx/palmos/menuitem.h" +#elif defined(__WXMSW__) + #include "wx/msw/menuitem.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/menuitem.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/menuitem.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/menuitem.h" +#elif defined(__WXMAC__) + #include "wx/mac/menuitem.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/menuitem.h" +#elif defined(__WXPM__) + #include "wx/os2/menuitem.h" +#endif +#endif // wxUSE_BASE_CLASSES_ONLY/!wxUSE_BASE_CLASSES_ONLY + +#endif // wxUSE_MENUS + +#endif + // _WX_MENUITEM_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/metafile.h b/Externals/wxWidgets/include/wx/metafile.h new file mode 100644 index 0000000000..7d92ab0f38 --- /dev/null +++ b/Externals/wxWidgets/include/wx/metafile.h @@ -0,0 +1,62 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/metafile.h +// Purpose: wxMetaFile class declaration +// Author: wxWidgets team +// Modified by: +// Created: 13.01.00 +// RCS-ID: $Id: metafile.h 39841 2006-06-26 14:37:34Z VZ $ +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_METAFILE_H_BASE_ +#define _WX_METAFILE_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_METAFILE + +// provide synonyms for all metafile classes +#define wxMetaFile wxMetafile +#define wxMetaFileDC wxMetafileDC +#define wxMetaFileDataObject wxMetafileDataObject + +#define wxMakeMetaFilePlaceable wxMakeMetafilePlaceable + +#if defined(__WXMSW__) + #if wxUSE_ENH_METAFILE + #if defined(__WXPALMOS__) + #include "wx/palmos/enhmeta.h" + #else + #include "wx/msw/enhmeta.h" + #endif + + #if wxUSE_WIN_METAFILES_ALWAYS + // use normal metafiles as well + #include "wx/msw/metafile.h" + #else // also map all metafile classes to enh metafile + typedef wxEnhMetaFile wxMetafile; + typedef wxEnhMetaFileDC wxMetafileDC; + #if wxUSE_DRAG_AND_DROP + typedef wxEnhMetaFileDataObject wxMetafileDataObject; + #endif + + // this flag will be set if wxMetafile class is wxEnhMetaFile + #define wxMETAFILE_IS_ENH + #endif // wxUSE_WIN_METAFILES_ALWAYS + #else // !wxUSE_ENH_METAFILE + #if defined(__WXPALMOS__) + #include "wx/palmos/metafile.h" + #else + #include "wx/msw/metafile.h" + #endif + #endif +#elif defined(__WXPM__) + #include "wx/os2/metafile.h" +#elif defined(__WXMAC__) + #include "wx/mac/metafile.h" +#endif + +#endif // wxUSE_METAFILE + +#endif // _WX_METAFILE_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/mimetype.h b/Externals/wxWidgets/include/wx/mimetype.h new file mode 100644 index 0000000000..20f2e1a72d --- /dev/null +++ b/Externals/wxWidgets/include/wx/mimetype.h @@ -0,0 +1,453 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/mimetype.h +// Purpose: classes and functions to manage MIME types +// Author: Vadim Zeitlin +// Modified by: +// Chris Elliott (biol75@york.ac.uk) 5 Dec 00: write support for Win32 +// Created: 23.09.98 +// RCS-ID: $Id: mimetype.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> +// Licence: wxWindows licence (part of wxExtra library) +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MIMETYPE_H_ +#define _WX_MIMETYPE_H_ + +// ---------------------------------------------------------------------------- +// headers and such +// ---------------------------------------------------------------------------- + +#include "wx/defs.h" + +#if wxUSE_MIMETYPE + +// the things we really need +#include "wx/string.h" +#include "wx/dynarray.h" +#include "wx/arrstr.h" + +// fwd decls +class WXDLLIMPEXP_FWD_BASE wxIconLocation; +class WXDLLIMPEXP_FWD_BASE wxFileTypeImpl; +class WXDLLIMPEXP_FWD_BASE wxMimeTypesManagerImpl; + +// these constants define the MIME informations source under UNIX and are used +// by wxMimeTypesManager::Initialize() +enum wxMailcapStyle +{ + wxMAILCAP_STANDARD = 1, + wxMAILCAP_NETSCAPE = 2, + wxMAILCAP_KDE = 4, + wxMAILCAP_GNOME = 8, + + wxMAILCAP_ALL = 15 +}; + +/* + TODO: would it be more convenient to have this class? + +class WXDLLIMPEXP_BASE wxMimeType : public wxString +{ +public: + // all string ctors here + + wxString GetType() const { return BeforeFirst(_T('/')); } + wxString GetSubType() const { return AfterFirst(_T('/')); } + + void SetSubType(const wxString& subtype) + { + *this = GetType() + _T('/') + subtype; + } + + bool Matches(const wxMimeType& wildcard) + { + // implement using wxMimeTypesManager::IsOfType() + } +}; + +*/ + +// wxMimeTypeCommands stores the verbs defined for the given MIME type with +// their values +class WXDLLIMPEXP_BASE wxMimeTypeCommands +{ +public: + wxMimeTypeCommands() {} + + wxMimeTypeCommands(const wxArrayString& verbs, + const wxArrayString& commands) + : m_verbs(verbs), + m_commands(commands) + { + } + + // add a new verb with the command or replace the old value + void AddOrReplaceVerb(const wxString& verb, const wxString& cmd); + void Add(const wxString& s) + { + m_verbs.Add(s.BeforeFirst(wxT('='))); + m_commands.Add(s.AfterFirst(wxT('='))); + } + + // access the commands + size_t GetCount() const { return m_verbs.GetCount(); } + const wxString& GetVerb(size_t n) const { return m_verbs[n]; } + const wxString& GetCmd(size_t n) const { return m_commands[n]; } + + bool HasVerb(const wxString& verb) const + { return m_verbs.Index(verb) != wxNOT_FOUND; } + + // returns empty string and wxNOT_FOUND in idx if no such verb + wxString GetCommandForVerb(const wxString& verb, size_t *idx = NULL) const; + + // get a "verb=command" string + wxString GetVerbCmd(size_t n) const; + +private: + wxArrayString m_verbs; + wxArrayString m_commands; +}; + +// ---------------------------------------------------------------------------- +// wxFileTypeInfo: static container of information accessed via wxFileType. +// +// This class is used with wxMimeTypesManager::AddFallbacks() and Associate() +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxFileTypeInfo +{ +public: + // ctors + // a normal item + wxFileTypeInfo(const wxChar *mimeType, + const wxChar *openCmd, + const wxChar *printCmd, + const wxChar *desc, + // the other parameters form a NULL terminated list of + // extensions + ...); + + // the array elements correspond to the parameters of the ctor above in + // the same order + wxFileTypeInfo(const wxArrayString& sArray); + + // invalid item - use this to terminate the array passed to + // wxMimeTypesManager::AddFallbacks + wxFileTypeInfo() { } + + // test if this object can be used + bool IsValid() const { return !m_mimeType.empty(); } + + // setters + // set the icon info + void SetIcon(const wxString& iconFile, int iconIndex = 0) + { + m_iconFile = iconFile; + m_iconIndex = iconIndex; + } + // set the short desc + void SetShortDesc(const wxString& shortDesc) { m_shortDesc = shortDesc; } + + // accessors + // get the MIME type + const wxString& GetMimeType() const { return m_mimeType; } + // get the open command + const wxString& GetOpenCommand() const { return m_openCmd; } + // get the print command + const wxString& GetPrintCommand() const { return m_printCmd; } + // get the short description (only used under Win32 so far) + const wxString& GetShortDesc() const { return m_shortDesc; } + // get the long, user visible description + const wxString& GetDescription() const { return m_desc; } + // get the array of all extensions + const wxArrayString& GetExtensions() const { return m_exts; } + size_t GetExtensionsCount() const {return m_exts.GetCount(); } + // get the icon info + const wxString& GetIconFile() const { return m_iconFile; } + int GetIconIndex() const { return m_iconIndex; } + +private: + wxString m_mimeType, // the MIME type in "type/subtype" form + m_openCmd, // command to use for opening the file (%s allowed) + m_printCmd, // command to use for printing the file (%s allowed) + m_shortDesc, // a short string used in the registry + m_desc; // a free form description of this file type + + // icon stuff + wxString m_iconFile; // the file containing the icon + int m_iconIndex; // icon index in this file + + wxArrayString m_exts; // the extensions which are mapped on this filetype + + +#if 0 // TODO + // the additional (except "open" and "print") command names and values + wxArrayString m_commandNames, + m_commandValues; +#endif // 0 +}; + +WX_DECLARE_USER_EXPORTED_OBJARRAY(wxFileTypeInfo, wxArrayFileTypeInfo, + WXDLLIMPEXP_BASE); + +// ---------------------------------------------------------------------------- +// wxFileType: gives access to all information about the files of given type. +// +// This class holds information about a given "file type". File type is the +// same as MIME type under Unix, but under Windows it corresponds more to an +// extension than to MIME type (in fact, several extensions may correspond to a +// file type). This object may be created in many different ways and depending +// on how it was created some fields may be unknown so the return value of all +// the accessors *must* be checked! +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxFileType +{ +friend class WXDLLIMPEXP_BASE wxMimeTypesManagerImpl; // it has access to m_impl + +public: + // An object of this class must be passed to Get{Open|Print}Command. The + // default implementation is trivial and doesn't know anything at all about + // parameters, only filename and MIME type are used (so it's probably ok for + // Windows where %{param} is not used anyhow) + class MessageParameters + { + public: + // ctors + MessageParameters() { } + MessageParameters(const wxString& filename, + const wxString& mimetype = wxEmptyString) + : m_filename(filename), m_mimetype(mimetype) { } + + // accessors (called by GetOpenCommand) + // filename + const wxString& GetFileName() const { return m_filename; } + // mime type + const wxString& GetMimeType() const { return m_mimetype; } + + // override this function in derived class + virtual wxString GetParamValue(const wxString& WXUNUSED(name)) const + { return wxEmptyString; } + + // virtual dtor as in any base class + virtual ~MessageParameters() { } + + protected: + wxString m_filename, m_mimetype; + }; + + // ctor from static data + wxFileType(const wxFileTypeInfo& ftInfo); + + // accessors: all of them return true if the corresponding information + // could be retrieved/found, false otherwise (and in this case all [out] + // parameters are unchanged) + // return the MIME type for this file type + bool GetMimeType(wxString *mimeType) const; + bool GetMimeTypes(wxArrayString& mimeTypes) const; + // fill passed in array with all extensions associated with this file + // type + bool GetExtensions(wxArrayString& extensions); + // get the icon corresponding to this file type and of the given size + bool GetIcon(wxIconLocation *iconloc) const; + bool GetIcon(wxIconLocation *iconloc, + const MessageParameters& params) const; + // get a brief file type description ("*.txt" => "text document") + bool GetDescription(wxString *desc) const; + + // get the command to be used to open/print the given file. + // get the command to execute the file of given type + bool GetOpenCommand(wxString *openCmd, + const MessageParameters& params) const; + // a simpler to use version of GetOpenCommand() -- it only takes the + // filename and returns an empty string on failure + wxString GetOpenCommand(const wxString& filename) const; + // get the command to print the file of given type + bool GetPrintCommand(wxString *printCmd, + const MessageParameters& params) const; + + + // return the number of commands defined for this file type, 0 if none + size_t GetAllCommands(wxArrayString *verbs, wxArrayString *commands, + const wxFileType::MessageParameters& params) const; + + // set an arbitrary command, ask confirmation if it already exists and + // overwriteprompt is true + bool SetCommand(const wxString& cmd, const wxString& verb, + bool overwriteprompt = true); + + bool SetDefaultIcon(const wxString& cmd = wxEmptyString, int index = 0); + + + // remove the association for this filetype from the system MIME database: + // notice that it will only work if the association is defined in the user + // file/registry part, we will never modify the system-wide settings + bool Unassociate(); + + // operations + // expand a string in the format of GetOpenCommand (which may contain + // '%s' and '%t' format specificators for the file name and mime type + // and %{param} constructions). + static wxString ExpandCommand(const wxString& command, + const MessageParameters& params); + + // dtor (not virtual, shouldn't be derived from) + ~wxFileType(); + +private: + // default ctor is private because the user code never creates us + wxFileType(); + + // no copy ctor/assignment operator + wxFileType(const wxFileType&); + wxFileType& operator=(const wxFileType&); + + // the static container of wxFileType data: if it's not NULL, it means that + // this object is used as fallback only + const wxFileTypeInfo *m_info; + + // the object which implements the real stuff like reading and writing + // to/from system MIME database + wxFileTypeImpl *m_impl; +}; + +//---------------------------------------------------------------------------- +// wxMimeTypesManagerFactory +//---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxMimeTypesManagerFactory +{ +public: + wxMimeTypesManagerFactory() {} + virtual ~wxMimeTypesManagerFactory() {} + + virtual wxMimeTypesManagerImpl *CreateMimeTypesManagerImpl(); + + static void Set( wxMimeTypesManagerFactory *factory ); + static wxMimeTypesManagerFactory *Get(); + +private: + static wxMimeTypesManagerFactory *m_factory; +}; + +// ---------------------------------------------------------------------------- +// wxMimeTypesManager: interface to system MIME database. +// +// This class accesses the information about all known MIME types and allows +// the application to retrieve information (including how to handle data of +// given type) about them. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxMimeTypesManager +{ +public: + // static helper functions + // ----------------------- + + // check if the given MIME type is the same as the other one: the + // second argument may contain wildcards ('*'), but not the first. If + // the types are equal or if the mimeType matches wildcard the function + // returns true, otherwise it returns false + static bool IsOfType(const wxString& mimeType, const wxString& wildcard); + + // ctor + wxMimeTypesManager(); + + // NB: the following 2 functions are for Unix only and don't do anything + // elsewhere + + // loads data from standard files according to the mailcap styles + // specified: this is a bitwise OR of wxMailcapStyle values + // + // use the extraDir parameter if you want to look for files in another + // directory + void Initialize(int mailcapStyle = wxMAILCAP_ALL, + const wxString& extraDir = wxEmptyString); + + // and this function clears all the data from the manager + void ClearData(); + + // Database lookup: all functions return a pointer to wxFileType object + // whose methods may be used to query it for the information you're + // interested in. If the return value is !NULL, caller is responsible for + // deleting it. + // get file type from file extension + wxFileType *GetFileTypeFromExtension(const wxString& ext); + // get file type from MIME type (in format <category>/<format>) + wxFileType *GetFileTypeFromMimeType(const wxString& mimeType); + + // other operations: return true if there were no errors or false if there + // were some unrecognized entries (the good entries are always read anyhow) + // + // FIXME: These ought to be private ?? + + // read in additional file (the standard ones are read automatically) + // in mailcap format (see mimetype.cpp for description) + // + // 'fallback' parameter may be set to true to avoid overriding the + // settings from other, previously parsed, files by this one: normally, + // the files read most recently would override the older files, but with + // fallback == true this won't happen + + bool ReadMailcap(const wxString& filename, bool fallback = false); + // read in additional file in mime.types format + bool ReadMimeTypes(const wxString& filename); + + // enumerate all known MIME types + // + // returns the number of retrieved file types + size_t EnumAllFileTypes(wxArrayString& mimetypes); + + // these functions can be used to provide default values for some of the + // MIME types inside the program itself (you may also use + // ReadMailcap(filenameWithDefaultTypes, true /* use as fallback */) to + // achieve the same goal, but this requires having this info in a file). + // + // The filetypes array should be terminated by either NULL entry or an + // invalid wxFileTypeInfo (i.e. the one created with default ctor) + void AddFallbacks(const wxFileTypeInfo *filetypes); + void AddFallback(const wxFileTypeInfo& ft) { m_fallbacks.Add(ft); } + + // create or remove associations + + // create a new association using the fields of wxFileTypeInfo (at least + // the MIME type and the extension should be set) + // if the other fields are empty, the existing values should be left alone + wxFileType *Associate(const wxFileTypeInfo& ftInfo); + + // undo Associate() + bool Unassociate(wxFileType *ft) ; + + // dtor (not virtual, shouldn't be derived from) + ~wxMimeTypesManager(); + +private: + // no copy ctor/assignment operator + wxMimeTypesManager(const wxMimeTypesManager&); + wxMimeTypesManager& operator=(const wxMimeTypesManager&); + + // the fallback info which is used if the information is not found in the + // real system database + wxArrayFileTypeInfo m_fallbacks; + + // the object working with the system MIME database + wxMimeTypesManagerImpl *m_impl; + + // if m_impl is NULL, create one + void EnsureImpl(); + + friend class wxMimeTypeCmnModule; +}; + + +// ---------------------------------------------------------------------------- +// global variables +// ---------------------------------------------------------------------------- + +// the default mime manager for wxWidgets programs +extern WXDLLIMPEXP_DATA_BASE(wxMimeTypesManager *) wxTheMimeTypesManager; + +#endif // wxUSE_MIMETYPE + +#endif + //_WX_MIMETYPE_H_ diff --git a/Externals/wxWidgets/include/wx/minifram.h b/Externals/wxWidgets/include/wx/minifram.h new file mode 100644 index 0000000000..50df6006a1 --- /dev/null +++ b/Externals/wxWidgets/include/wx/minifram.h @@ -0,0 +1,43 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/minifram.h +// Purpose: wxMiniFrame base header +// Author: Julian Smart +// Modified by: +// Created: +// Copyright: (c) Julian Smart +// RCS-ID: $Id: minifram.h 49299 2007-10-21 18:07:29Z PC $ +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MINIFRAM_H_BASE_ +#define _WX_MINIFRAM_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_MINIFRAME + +#if defined(__WXPALMOS__) +#include "wx/palmos/minifram.h" +#elif defined(__WXMSW__) +#include "wx/msw/minifram.h" +#elif defined(__WXMOTIF__) +#include "wx/motif/minifram.h" +#elif defined(__WXGTK20__) +#include "wx/gtk/minifram.h" +#elif defined(__WXGTK__) +#include "wx/gtk1/minifram.h" +#elif defined(__WXX11__) +#include "wx/x11/minifram.h" +#elif defined(__WXMAC__) +#include "wx/mac/minifram.h" +#elif defined(__WXPM__) +#include "wx/os2/minifram.h" +#else +// TODO: it seems that wxMiniFrame could be just defined here generically +// instead of having all the above port-specific headers +#include "wx/frame.h" +typedef wxFrame wxMiniFrame; +#endif + +#endif // wxUSE_MINIFRAME +#endif // _WX_MINIFRAM_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/module.h b/Externals/wxWidgets/include/wx/module.h new file mode 100644 index 0000000000..dfff0ba0e7 --- /dev/null +++ b/Externals/wxWidgets/include/wx/module.h @@ -0,0 +1,103 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/module.h +// Purpose: Modules handling +// Author: Wolfram Gloger/adapted by Guilhem Lavaux +// Modified by: +// Created: 04/11/98 +// RCS-ID: $Id: module.h 40943 2006-08-31 19:31:43Z ABX $ +// Copyright: (c) Wolfram Gloger and Guilhem Lavaux +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MODULE_H_ +#define _WX_MODULE_H_ + +#include "wx/object.h" +#include "wx/list.h" +#include "wx/dynarray.h" + +// declare a linked list of modules +class WXDLLIMPEXP_BASE wxModule; +WX_DECLARE_USER_EXPORTED_LIST(wxModule, wxModuleList, WXDLLIMPEXP_BASE); + +// and an array of class info objects +WX_DEFINE_USER_EXPORTED_ARRAY_PTR(wxClassInfo *, wxArrayClassInfo, + class WXDLLIMPEXP_BASE); + + +// declaring a class derived from wxModule will automatically create an +// instance of this class on program startup, call its OnInit() method and call +// OnExit() on program termination (but only if OnInit() succeeded) +class WXDLLIMPEXP_BASE wxModule : public wxObject +{ +public: + wxModule() {} + virtual ~wxModule() {} + + // if module init routine returns false the application + // will fail to startup + + bool Init() { return OnInit(); } + void Exit() { OnExit(); } + + // Override both of these + + // called on program startup + + virtual bool OnInit() = 0; + + // called just before program termination, but only if OnInit() + // succeeded + + virtual void OnExit() = 0; + + static void RegisterModule(wxModule *module); + static void RegisterModules(); + static bool InitializeModules(); + static void CleanUpModules() { DoCleanUpModules(m_modules); } + + // used by wxObjectLoader when unloading shared libs's + + static void UnregisterModule(wxModule *module); + +protected: + static wxModuleList m_modules; + + // the function to call from constructor of a deriving class add module + // dependency which will be initialized before the module and unloaded + // after that + void AddDependency(wxClassInfo *dep) + { + wxCHECK_RET( dep, _T("NULL module dependency") ); + + m_dependencies.Add(dep); + } + +private: + // initialize module and Append it to initializedModules list recursively + // calling itself to satisfy module dependencies if needed + static bool + DoInitializeModule(wxModule *module, wxModuleList &initializedModules); + + // cleanup the modules in the specified list (which may not contain all + // modules if we're called during initialization because not all modules + // could be initialized) and also empty m_modules itself + static void DoCleanUpModules(const wxModuleList& modules); + + + // module dependencies: contains + wxArrayClassInfo m_dependencies; + + // used internally while initiliazing/cleaning up modules + enum + { + State_Registered, // module registered but not initialized yet + State_Initializing, // we're initializing this module but not done yet + State_Initialized // module initialized successfully + } m_state; + + + DECLARE_CLASS(wxModule) +}; + +#endif // _WX_MODULE_H_ diff --git a/Externals/wxWidgets/include/wx/msdos/apptrait.h b/Externals/wxWidgets/include/wx/msdos/apptrait.h new file mode 100644 index 0000000000..4201970852 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msdos/apptrait.h @@ -0,0 +1,27 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/msdos/apptrait.h +// Author: Michael Wetherell +// RCS-ID: $Id: apptrait.h 40807 2006-08-24 21:18:18Z MW $ +// Copyright: (c) 2006 Michael Wetherell +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MSDOS_APPTRAIT_H_ +#define _WX_MSDOS_APPTRAIT_H_ + +class wxConsoleAppTraits : public wxConsoleAppTraitsBase +{ +public: +}; + +#if wxUSE_GUI + +class wxGUIAppTraits : public wxGUIAppTraitsBase +{ +public: + virtual wxPortId GetToolkitVersion(int *majVer, int *minVer) const; +}; + +#endif // wxUSE_GUI + +#endif // _WX_MSDOS_APPTRAIT_H_ diff --git a/Externals/wxWidgets/include/wx/msdos/mimetype.h b/Externals/wxWidgets/include/wx/msdos/mimetype.h new file mode 100644 index 0000000000..5e6b29e4b8 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msdos/mimetype.h @@ -0,0 +1,115 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msdos/mimetype.h +// Purpose: classes and functions to manage MIME types +// Author: Vadim Zeitlin +// Modified by: +// Created: 23.09.98 +// RCS-ID: $Id: mimetype.h 39763 2006-06-16 09:31:12Z ABX $ +// Copyright: (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> +// Licence: wxWindows licence (part of wxExtra library) +///////////////////////////////////////////////////////////////////////////// + +#ifndef _MIMETYPE_IMPL_H +#define _MIMETYPE_IMPL_H + +#include "wx/defs.h" +#include "wx/mimetype.h" + + +class wxMimeTypesManagerImpl +{ +public : + wxMimeTypesManagerImpl() { } + + // load all data into memory - done when it is needed for the first time + void Initialize(int mailcapStyles = wxMAILCAP_STANDARD, + const wxString& extraDir = wxEmptyString); + + // and delete the data here + void ClearData(); + + // implement containing class functions + wxFileType *GetFileTypeFromExtension(const wxString& ext); + wxFileType *GetOrAllocateFileTypeFromExtension(const wxString& ext) ; + wxFileType *GetFileTypeFromMimeType(const wxString& mimeType); + + size_t EnumAllFileTypes(wxArrayString& mimetypes); + + // this are NOPs under MacOS + bool ReadMailcap(const wxString& WXUNUSED(filename), bool WXUNUSED(fallback) = TRUE) { return TRUE; } + bool ReadMimeTypes(const wxString& WXUNUSED(filename)) { return TRUE; } + + void AddFallback(const wxFileTypeInfo& ft) { m_fallbacks.Add(ft); } + + // create a new filetype association + wxFileType *Associate(const wxFileTypeInfo& ftInfo); + // remove association + bool Unassociate(wxFileType *ft); + + // create a new filetype with the given name and extension + wxFileType *CreateFileType(const wxString& filetype, const wxString& ext); + +private: + wxArrayFileTypeInfo m_fallbacks; +}; + +class wxFileTypeImpl +{ +public: + // initialization functions + // this is used to construct a list of mimetypes which match; + // if built with GetFileTypeFromMimetype index 0 has the exact match and + // index 1 the type / * match + // if built with GetFileTypeFromExtension, index 0 has the mimetype for + // the first extension found, index 1 for the second and so on + + void Init(wxMimeTypesManagerImpl *manager, size_t index) + { m_manager = manager; m_index.Add(index); } + + // initialize us with our file type name + void SetFileType(const wxString& strFileType) + { m_strFileType = strFileType; } + void SetExt(const wxString& ext) + { m_ext = ext; } + + // implement accessor functions + bool GetExtensions(wxArrayString& extensions); + bool GetMimeType(wxString *mimeType) const; + bool GetMimeTypes(wxArrayString& mimeTypes) const; + bool GetIcon(wxIconLocation *iconLoc) const; + bool GetDescription(wxString *desc) const; + bool GetOpenCommand(wxString *openCmd, + const wxFileType::MessageParameters&) const + { return GetCommand(openCmd, "open"); } + bool GetPrintCommand(wxString *printCmd, + const wxFileType::MessageParameters&) const + { return GetCommand(printCmd, "print"); } + + size_t GetAllCommands(wxArrayString * verbs, wxArrayString * commands, + const wxFileType::MessageParameters& params) const; + + // remove the record for this file type + // probably a mistake to come here, use wxMimeTypesManager.Unassociate (ft) instead + bool Unassociate(wxFileType *ft) + { + return m_manager->Unassociate(ft); + } + + // set an arbitrary command, ask confirmation if it already exists and + // overwriteprompt is TRUE + bool SetCommand(const wxString& cmd, const wxString& verb, bool overwriteprompt = TRUE); + bool SetDefaultIcon(const wxString& strIcon = wxEmptyString, int index = 0); + + private: + // helper function + bool GetCommand(wxString *command, const char *verb) const; + + wxMimeTypesManagerImpl *m_manager; + wxArrayInt m_index; // in the wxMimeTypesManagerImpl arrays + wxString m_strFileType, m_ext; +}; + +#endif + //_MIMETYPE_H + +/* vi: set cin tw=80 ts=4 sw=4: */ diff --git a/Externals/wxWidgets/include/wx/msgdlg.h b/Externals/wxWidgets/include/wx/msgdlg.h new file mode 100644 index 0000000000..242de6623b --- /dev/null +++ b/Externals/wxWidgets/include/wx/msgdlg.h @@ -0,0 +1,79 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msgdlgg.h +// Purpose: common header and base class for wxMessageDialog +// Author: Julian Smart +// Modified by: +// Created: +// RCS-ID: $Id: msgdlg.h 49765 2007-11-09 18:32:38Z DE $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MSGDLG_H_BASE_ +#define _WX_MSGDLG_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_MSGDLG + +class WXDLLEXPORT wxMessageDialogBase +{ +protected: + // common validation of wxMessageDialog style + void SetMessageDialogStyle(long style) + { + wxASSERT_MSG( ((style & wxYES_NO) == wxYES_NO) || ((style & wxYES_NO) == 0), + _T("wxYES and wxNO may only be used together in wxMessageDialog") ); + + wxASSERT_MSG( (style & wxID_OK) != wxID_OK, + _T("wxMessageBox: Did you mean wxOK (and not wxID_OK)?") ); + + m_dialogStyle = style; + } + inline long GetMessageDialogStyle() const + { + return m_dialogStyle; + } + +private: + long m_dialogStyle; +}; + +#if defined(__WX_COMPILING_MSGDLGG_CPP__) +#include "wx/generic/msgdlgg.h" +#elif defined(__WXUNIVERSAL__) || defined(__WXGPE__) +#include "wx/generic/msgdlgg.h" +#elif defined(__WXPALMOS__) +#include "wx/palmos/msgdlg.h" +#elif defined(__WXMSW__) +#include "wx/msw/msgdlg.h" +#elif defined(__WXMOTIF__) +#include "wx/motif/msgdlg.h" +#elif defined(__WXGTK20__) +#include "wx/gtk/msgdlg.h" +#elif defined(__WXGTK__) +#include "wx/generic/msgdlgg.h" +#elif defined(__WXGTK__) +#include "wx/generic/msgdlgg.h" +#elif defined(__WXMAC__) +#include "wx/mac/msgdlg.h" +#elif defined(__WXCOCOA__) +#include "wx/cocoa/msgdlg.h" +#elif defined(__WXPM__) +#include "wx/os2/msgdlg.h" +#endif + +// ---------------------------------------------------------------------------- +// wxMessageBox: the simplest way to use wxMessageDialog +// ---------------------------------------------------------------------------- + +int WXDLLEXPORT wxMessageBox(const wxString& message, + const wxString& caption = wxMessageBoxCaptionStr, + long style = wxOK | wxCENTRE, + wxWindow *parent = NULL, + int x = wxDefaultCoord, int y = wxDefaultCoord); + +#endif // wxUSE_MSGDLG + +#endif + // _WX_MSGDLG_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/msgout.h b/Externals/wxWidgets/include/wx/msgout.h new file mode 100644 index 0000000000..63803bfa32 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msgout.h @@ -0,0 +1,113 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/msgout.h +// Purpose: wxMessageOutput class. Shows a message to the user +// Author: Mattia Barbon +// Modified by: +// Created: 17.07.02 +// RCS-ID: $Id: msgout.h 35690 2005-09-25 20:23:30Z VZ $ +// Copyright: (c) Mattia Barbon +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MSGOUT_H_ +#define _WX_MSGOUT_H_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/defs.h" +#include "wx/wxchar.h" + +// ---------------------------------------------------------------------------- +// wxMessageOutput is a class abstracting formatted output target, i.e. +// something you can printf() to +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxMessageOutput +{ +public: + virtual ~wxMessageOutput() { } + + // show a message to the user + virtual void Printf(const wxChar* format, ...) ATTRIBUTE_PRINTF_2 = 0; + + // gets the current wxMessageOutput object (may be NULL during + // initialization or shutdown) + static wxMessageOutput* Get(); + + // sets the global wxMessageOutput instance; returns the previous one + static wxMessageOutput* Set(wxMessageOutput* msgout); + +private: + static wxMessageOutput* ms_msgOut; +}; + +// ---------------------------------------------------------------------------- +// implementation showing the message to the user in "best" possible way: uses +// native message box if available (currently only under Windows) and stderr +// otherwise; unlike wxMessageOutputMessageBox this class is always safe to use +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxMessageOutputBest : public wxMessageOutput +{ +public: + wxMessageOutputBest() { } + + virtual void Printf(const wxChar* format, ...) ATTRIBUTE_PRINTF_2; +}; + +// ---------------------------------------------------------------------------- +// implementation which sends output to stderr +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxMessageOutputStderr : public wxMessageOutput +{ +public: + wxMessageOutputStderr() { } + + virtual void Printf(const wxChar* format, ...) ATTRIBUTE_PRINTF_2; +}; + +// ---------------------------------------------------------------------------- +// implementation which shows output in a message box +// ---------------------------------------------------------------------------- + +#if wxUSE_GUI + +class WXDLLIMPEXP_CORE wxMessageOutputMessageBox : public wxMessageOutput +{ +public: + wxMessageOutputMessageBox() { } + + virtual void Printf(const wxChar* format, ...) ATTRIBUTE_PRINTF_2; +}; + +#endif // wxUSE_GUI + +// ---------------------------------------------------------------------------- +// implementation using the native way of outputting debug messages +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxMessageOutputDebug : public wxMessageOutput +{ +public: + wxMessageOutputDebug() { } + + virtual void Printf(const wxChar* format, ...) ATTRIBUTE_PRINTF_2; +}; + +// ---------------------------------------------------------------------------- +// implementation using wxLog (mainly for backwards compatibility) +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxMessageOutputLog : public wxMessageOutput +{ +public: + wxMessageOutputLog() { } + + virtual void Printf(const wxChar* format, ...) ATTRIBUTE_PRINTF_2; +}; + +#endif + // _WX_MSGOUT_H_ diff --git a/Externals/wxWidgets/include/wx/mstream.h b/Externals/wxWidgets/include/wx/mstream.h new file mode 100644 index 0000000000..c7bc315373 --- /dev/null +++ b/Externals/wxWidgets/include/wx/mstream.h @@ -0,0 +1,92 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/mstream.h +// Purpose: Memory stream classes +// Author: Guilhem Lavaux +// Modified by: +// Created: 11/07/98 +// RCS-ID: $Id: mstream.h 38717 2006-04-14 17:01:16Z ABX $ +// Copyright: (c) Guilhem Lavaux +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_WXMMSTREAM_H__ +#define _WX_WXMMSTREAM_H__ + +#include "wx/defs.h" + +#if wxUSE_STREAMS + +#include "wx/stream.h" + +class WXDLLIMPEXP_BASE wxMemoryOutputStream; + +class WXDLLIMPEXP_BASE wxMemoryInputStream : public wxInputStream +{ +public: + wxMemoryInputStream(const void *data, size_t length); + wxMemoryInputStream(const wxMemoryOutputStream& stream); + virtual ~wxMemoryInputStream(); + virtual wxFileOffset GetLength() const { return m_length; } + virtual bool IsSeekable() const { return true; } + + char Peek(); + + wxStreamBuffer *GetInputStreamBuffer() const { return m_i_streambuf; } + +#if WXWIN_COMPATIBILITY_2_6 + // deprecated, compatibility only + wxDEPRECATED( wxStreamBuffer *InputStreamBuffer() const ); +#endif // WXWIN_COMPATIBILITY_2_6 + +protected: + wxStreamBuffer *m_i_streambuf; + + size_t OnSysRead(void *buffer, size_t nbytes); + wxFileOffset OnSysSeek(wxFileOffset pos, wxSeekMode mode); + wxFileOffset OnSysTell() const; + +private: + size_t m_length; + + DECLARE_NO_COPY_CLASS(wxMemoryInputStream) +}; + +class WXDLLIMPEXP_BASE wxMemoryOutputStream : public wxOutputStream +{ +public: + // if data is !NULL it must be allocated with malloc() + wxMemoryOutputStream(void *data = NULL, size_t length = 0); + virtual ~wxMemoryOutputStream(); + virtual wxFileOffset GetLength() const { return m_o_streambuf->GetLastAccess(); } + virtual bool IsSeekable() const { return true; } + + size_t CopyTo(void *buffer, size_t len) const; + + wxStreamBuffer *GetOutputStreamBuffer() const { return m_o_streambuf; } + +#if WXWIN_COMPATIBILITY_2_6 + // deprecated, compatibility only + wxDEPRECATED( wxStreamBuffer *OutputStreamBuffer() const ); +#endif // WXWIN_COMPATIBILITY_2_6 + +protected: + wxStreamBuffer *m_o_streambuf; + +protected: + size_t OnSysWrite(const void *buffer, size_t nbytes); + wxFileOffset OnSysSeek(wxFileOffset pos, wxSeekMode mode); + wxFileOffset OnSysTell() const; + + DECLARE_NO_COPY_CLASS(wxMemoryOutputStream) +}; + +#if WXWIN_COMPATIBILITY_2_6 + inline wxStreamBuffer *wxMemoryInputStream::InputStreamBuffer() const { return m_i_streambuf; } + inline wxStreamBuffer *wxMemoryOutputStream::OutputStreamBuffer() const { return m_o_streambuf; } +#endif // WXWIN_COMPATIBILITY_2_6 + +#endif + // wxUSE_STREAMS + +#endif + // _WX_WXMMSTREAM_H__ diff --git a/Externals/wxWidgets/include/wx/msw/accel.h b/Externals/wxWidgets/include/wx/msw/accel.h new file mode 100644 index 0000000000..7911ec88c3 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/accel.h @@ -0,0 +1,46 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/accel.h +// Purpose: wxAcceleratorTable class +// Author: Julian Smart +// Modified by: +// Created: 31/7/98 +// RCS-ID: $Id: accel.h 42752 2006-10-30 19:26:48Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_ACCEL_H_ +#define _WX_ACCEL_H_ + +class WXDLLIMPEXP_CORE wxWindow; + +// ---------------------------------------------------------------------------- +// the accel table has all accelerators for a given window or menu +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxAcceleratorTable : public wxObject +{ +public: + // default ctor + wxAcceleratorTable() { } + + // load from .rc resource (Windows specific) + wxAcceleratorTable(const wxString& resource); + + // initialize from array + wxAcceleratorTable(int n, const wxAcceleratorEntry entries[]); + + bool Ok() const { return IsOk(); } + bool IsOk() const; + void SetHACCEL(WXHACCEL hAccel); + WXHACCEL GetHACCEL() const; + + // translate the accelerator, return true if done + bool Translate(wxWindow *window, WXMSG *msg) const; + +private: + DECLARE_DYNAMIC_CLASS(wxAcceleratorTable) +}; + +#endif + // _WX_ACCEL_H_ diff --git a/Externals/wxWidgets/include/wx/msw/amd64.manifest b/Externals/wxWidgets/include/wx/msw/amd64.manifest new file mode 100644 index 0000000000..3e2d475715 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/amd64.manifest @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> +<assemblyIdentity + version="0.64.1.0" + processorArchitecture="amd64" + name="Controls" + type="win32" +/> +<description>wxWindows application</description> +<dependency> + <dependentAssembly> + <assemblyIdentity + type="win32" + name="Microsoft.Windows.Common-Controls" + version="6.0.0.0" + processorArchitecture="amd64" + publicKeyToken="6595b64144ccf1df" + language="*" + /> + </dependentAssembly> +</dependency> +</assembly> diff --git a/Externals/wxWidgets/include/wx/msw/app.h b/Externals/wxWidgets/include/wx/msw/app.h new file mode 100644 index 0000000000..8d3c7343ad --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/app.h @@ -0,0 +1,122 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: app.h +// Purpose: wxApp class +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: app.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_APP_H_ +#define _WX_APP_H_ + +#include "wx/event.h" +#include "wx/icon.h" + +class WXDLLIMPEXP_FWD_CORE wxFrame; +class WXDLLIMPEXP_FWD_CORE wxWindow; +class WXDLLIMPEXP_FWD_CORE wxApp; +class WXDLLIMPEXP_FWD_CORE wxKeyEvent; +class WXDLLIMPEXP_FWD_BASE wxLog; + +// Represents the application. Derive OnInit and declare +// a new App object to start application +class WXDLLEXPORT wxApp : public wxAppBase +{ + DECLARE_DYNAMIC_CLASS(wxApp) + +public: + wxApp(); + virtual ~wxApp(); + + // override base class (pure) virtuals + virtual bool Initialize(int& argc, wxChar **argv); + virtual void CleanUp(); + + virtual bool Yield(bool onlyIfNeeded = false); + virtual void WakeUpIdle(); + + virtual void SetPrintMode(int mode) { m_printMode = mode; } + virtual int GetPrintMode() const { return m_printMode; } + + // implementation only + void OnIdle(wxIdleEvent& event); + void OnEndSession(wxCloseEvent& event); + void OnQueryEndSession(wxCloseEvent& event); + +#if wxUSE_EXCEPTIONS + virtual bool OnExceptionInMainLoop(); +#endif // wxUSE_EXCEPTIONS + + // deprecated functions, use wxEventLoop directly instead +#if WXWIN_COMPATIBILITY_2_4 + wxDEPRECATED( void DoMessage(WXMSG *pMsg) ); + wxDEPRECATED( bool DoMessage() ); + wxDEPRECATED( bool ProcessMessage(WXMSG* pMsg) ); +#endif // WXWIN_COMPATIBILITY_2_4 + +protected: + int m_printMode; // wxPRINT_WINDOWS, wxPRINT_POSTSCRIPT + +public: + // Implementation + static bool RegisterWindowClasses(); + static bool UnregisterWindowClasses(); + +#if wxUSE_RICHEDIT + // initialize the richedit DLL of (at least) given version, return true if + // ok (Win95 has version 1, Win98/NT4 has 1 and 2, W2K has 3) + static bool InitRichEdit(int version = 2); +#endif // wxUSE_RICHEDIT + + // returns 400, 470, 471 for comctl32.dll 4.00, 4.70, 4.71 or 0 if it + // wasn't found at all + static int GetComCtl32Version(); + + // the SW_XXX value to be used for the frames opened by the application + // (currently seems unused which is a bug -- TODO) + static int m_nCmdShow; + +protected: + DECLARE_EVENT_TABLE() + DECLARE_NO_COPY_CLASS(wxApp) +}; + +// ---------------------------------------------------------------------------- +// MSW-specific wxEntry() overload and IMPLEMENT_WXWIN_MAIN definition +// ---------------------------------------------------------------------------- + +// we need HINSTANCE declaration to define WinMain() +#include "wx/msw/wrapwin.h" + +#ifndef SW_SHOWNORMAL + #define SW_SHOWNORMAL 1 +#endif + +// WinMain() is always ANSI, even in Unicode build, under normal Windows +// but is always Unicode under CE +#ifdef __WXWINCE__ + typedef wchar_t *wxCmdLineArgType; +#else + typedef char *wxCmdLineArgType; +#endif + +extern int WXDLLEXPORT +wxEntry(HINSTANCE hInstance, + HINSTANCE hPrevInstance = NULL, + wxCmdLineArgType pCmdLine = NULL, + int nCmdShow = SW_SHOWNORMAL); + +#define IMPLEMENT_WXWIN_MAIN \ + extern "C" int WINAPI WinMain(HINSTANCE hInstance, \ + HINSTANCE hPrevInstance, \ + wxCmdLineArgType lpCmdLine, \ + int nCmdShow) \ + { \ + return wxEntry(hInstance, hPrevInstance, lpCmdLine, nCmdShow); \ + } + +#endif // _WX_APP_H_ + diff --git a/Externals/wxWidgets/include/wx/msw/apptbase.h b/Externals/wxWidgets/include/wx/msw/apptbase.h new file mode 100644 index 0000000000..efab1ed336 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/apptbase.h @@ -0,0 +1,46 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/apptbase.h +// Purpose: declaration of wxAppTraits for MSW +// Author: Vadim Zeitlin +// Modified by: +// Created: 22.06.2003 +// RCS-ID: $Id: apptbase.h 40599 2006-08-13 21:00:32Z VZ $ +// Copyright: (c) 2003 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MSW_APPTBASE_H_ +#define _WX_MSW_APPTBASE_H_ + +// ---------------------------------------------------------------------------- +// wxAppTraits: the MSW version adds extra hooks needed by MSW-only code +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxAppTraits : public wxAppTraitsBase +{ +public: + // wxExecute() support methods + // --------------------------- + + // called before starting to wait for the child termination, may return + // some opaque data which will be passed later to AfterChildWaitLoop() + virtual void *BeforeChildWaitLoop() = 0; + + // process pending Windows messages, even in console app + virtual void AlwaysYield() = 0; + + // called after starting to wait for the child termination, the parameter + // is the return value of BeforeChildWaitLoop() + virtual void AfterChildWaitLoop(void *data) = 0; + + + // wxThread helpers + // ---------------- + + // process a message while waiting for a(nother) thread, should return + // false if and only if we have to exit the application + virtual bool DoMessageFromThreadWait() = 0; +}; + +#endif // _WX_MSW_APPTBASE_H_ + diff --git a/Externals/wxWidgets/include/wx/msw/apptrait.h b/Externals/wxWidgets/include/wx/msw/apptrait.h new file mode 100644 index 0000000000..6b094ce294 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/apptrait.h @@ -0,0 +1,45 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/apptrait.h +// Purpose: class implementing wxAppTraits for MSW +// Author: Vadim Zeitlin +// Modified by: +// Created: 21.06.2003 +// RCS-ID: $Id: apptrait.h 40599 2006-08-13 21:00:32Z VZ $ +// Copyright: (c) 2003 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MSW_APPTRAIT_H_ +#define _WX_MSW_APPTRAIT_H_ + +// ---------------------------------------------------------------------------- +// wxGUI/ConsoleAppTraits: must derive from wxAppTraits, not wxAppTraitsBase +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxConsoleAppTraits : public wxConsoleAppTraitsBase +{ +public: + virtual void *BeforeChildWaitLoop(); + virtual void AlwaysYield(); + virtual void AfterChildWaitLoop(void *data); + + virtual bool DoMessageFromThreadWait(); +}; + +#if wxUSE_GUI + +class WXDLLIMPEXP_CORE wxGUIAppTraits : public wxGUIAppTraitsBase +{ +public: + virtual void *BeforeChildWaitLoop(); + virtual void AlwaysYield(); + virtual void AfterChildWaitLoop(void *data); + + virtual bool DoMessageFromThreadWait(); + virtual wxPortId GetToolkitVersion(int *majVer, int *minVer) const; +}; + +#endif // wxUSE_GUI + +#endif // _WX_MSW_APPTRAIT_H_ + diff --git a/Externals/wxWidgets/include/wx/msw/bitmap.h b/Externals/wxWidgets/include/wx/msw/bitmap.h new file mode 100644 index 0000000000..4e71852a56 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/bitmap.h @@ -0,0 +1,282 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/bitmap.h +// Purpose: wxBitmap class +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: bitmap.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_BITMAP_H_ +#define _WX_BITMAP_H_ + +#include "wx/msw/gdiimage.h" +#include "wx/palette.h" + +class WXDLLIMPEXP_FWD_CORE wxBitmap; +class WXDLLIMPEXP_FWD_CORE wxBitmapHandler; +class WXDLLIMPEXP_FWD_CORE wxBitmapRefData; +class WXDLLIMPEXP_FWD_CORE wxControl; +class WXDLLIMPEXP_FWD_CORE wxCursor; +class WXDLLIMPEXP_FWD_CORE wxDC; +#if wxUSE_WXDIB +class WXDLLIMPEXP_FWD_CORE wxDIB; +#endif +class WXDLLIMPEXP_FWD_CORE wxIcon; +class WXDLLIMPEXP_FWD_CORE wxImage; +class WXDLLIMPEXP_FWD_CORE wxMask; +class WXDLLIMPEXP_FWD_CORE wxPalette; +class WXDLLIMPEXP_FWD_CORE wxPixelDataBase; + +// ---------------------------------------------------------------------------- +// wxBitmap: a mono or colour bitmap +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxBitmap : public wxGDIImage +{ +public: + // default ctor creates an invalid bitmap, you must Create() it later + wxBitmap() { } + + // Initialize with raw data + wxBitmap(const char bits[], int width, int height, int depth = 1); + + // Initialize with XPM data + wxBitmap(const char* const* data); +#ifdef wxNEEDS_CHARPP + wxBitmap(char** data) + { + *this = wxBitmap(wx_const_cast(const char* const*, data)); + } +#endif + + // Load a file or resource + wxBitmap(const wxString& name, wxBitmapType type = wxBITMAP_TYPE_BMP_RESOURCE); + + // New constructor for generalised creation from data + wxBitmap(const void* data, long type, int width, int height, int depth = 1); + + // Create a new, uninitialized bitmap of the given size and depth (if it + // is omitted, will create a bitmap compatible with the display) + // + // NB: this ctor will create a DIB for 24 and 32bpp bitmaps, use ctor + // taking a DC argument if you want to force using DDB in this case + wxBitmap(int width, int height, int depth = -1); + + // Create a bitmap compatible with the given DC + wxBitmap(int width, int height, const wxDC& dc); + +#if wxUSE_IMAGE + // Convert from wxImage + wxBitmap(const wxImage& image, int depth = -1) + { (void)CreateFromImage(image, depth); } + + // Create a DDB compatible with the given DC from wxImage + wxBitmap(const wxImage& image, const wxDC& dc) + { (void)CreateFromImage(image, dc); } +#endif // wxUSE_IMAGE + + // we must have this, otherwise icons are silently copied into bitmaps using + // the copy ctor but the resulting bitmap is invalid! + wxBitmap(const wxIcon& icon) { CopyFromIcon(icon); } + + wxBitmap& operator=(const wxIcon& icon) + { + (void)CopyFromIcon(icon); + + return *this; + } + + wxBitmap& operator=(const wxCursor& cursor) + { + (void)CopyFromCursor(cursor); + + return *this; + } + + virtual ~wxBitmap(); + +#if wxUSE_IMAGE + wxImage ConvertToImage() const; +#endif // wxUSE_IMAGE + + // get the given part of bitmap + wxBitmap GetSubBitmap( const wxRect& rect ) const; + + // NB: This should not be called from user code. It is for wx internal + // use only. + wxBitmap GetSubBitmapOfHDC( const wxRect& rect, WXHDC hdc ) const; + + // copies the contents and mask of the given (colour) icon to the bitmap + bool CopyFromIcon(const wxIcon& icon); + + // copies the contents and mask of the given cursor to the bitmap + bool CopyFromCursor(const wxCursor& cursor); + +#if wxUSE_WXDIB + // copies from a device independent bitmap + bool CopyFromDIB(const wxDIB& dib); +#endif + + virtual bool Create(int width, int height, int depth = -1); + virtual bool Create(int width, int height, const wxDC& dc); + virtual bool Create(const void* data, long type, int width, int height, int depth = 1); + virtual bool LoadFile(const wxString& name, long type = wxBITMAP_TYPE_BMP_RESOURCE); + virtual bool SaveFile(const wxString& name, int type, const wxPalette *cmap = NULL); + + wxBitmapRefData *GetBitmapData() const + { return (wxBitmapRefData *)m_refData; } + + // raw bitmap access support functions + void *GetRawData(wxPixelDataBase& data, int bpp); + void UngetRawData(wxPixelDataBase& data); + +#if wxUSE_PALETTE + wxPalette* GetPalette() const; + void SetPalette(const wxPalette& palette); +#endif // wxUSE_PALETTE + + wxMask *GetMask() const; + wxBitmap GetMaskBitmap() const; + void SetMask(wxMask *mask); + + // these functions are internal and shouldn't be used, they risk to + // disappear in the future + bool HasAlpha() const; + void UseAlpha(); + +#if WXWIN_COMPATIBILITY_2_4 + // these functions do nothing and are only there for backwards + // compatibility + wxDEPRECATED( int GetQuality() const ); + wxDEPRECATED( void SetQuality(int quality) ); +#endif // WXWIN_COMPATIBILITY_2_4 + + // implementation only from now on + // ------------------------------- + +public: + void SetHBITMAP(WXHBITMAP bmp) { SetHandle((WXHANDLE)bmp); } + WXHBITMAP GetHBITMAP() const { return (WXHBITMAP)GetHandle(); } + +#ifdef __WXDEBUG__ + void SetSelectedInto(wxDC *dc); + wxDC *GetSelectedInto() const; +#endif // __WXDEBUG__ + +protected: + virtual wxGDIImageRefData *CreateData() const; + virtual wxObjectRefData *CloneRefData(const wxObjectRefData *data) const; + + // creates an uninitialized bitmap, called from Create()s above + bool DoCreate(int w, int h, int depth, WXHDC hdc); + +#if wxUSE_IMAGE + // creates the bitmap from wxImage, supposed to be called from ctor + bool CreateFromImage(const wxImage& image, int depth); + + // creates a DDB from wxImage, supposed to be called from ctor + bool CreateFromImage(const wxImage& image, const wxDC& dc); + + // common part of the 2 methods above (hdc may be 0) + bool CreateFromImage(const wxImage& image, int depth, WXHDC hdc); +#endif // wxUSE_IMAGE + +private: + // common part of CopyFromIcon/CopyFromCursor for Win32 + bool CopyFromIconOrCursor(const wxGDIImage& icon); + + + DECLARE_DYNAMIC_CLASS(wxBitmap) +}; + +// ---------------------------------------------------------------------------- +// wxMask: a mono bitmap used for drawing bitmaps transparently. +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxMask : public wxObject +{ +public: + wxMask(); + + // Copy constructor + wxMask(const wxMask &mask); + + // Construct a mask from a bitmap and a colour indicating the transparent + // area + wxMask(const wxBitmap& bitmap, const wxColour& colour); + + // Construct a mask from a bitmap and a palette index indicating the + // transparent area + wxMask(const wxBitmap& bitmap, int paletteIndex); + + // Construct a mask from a mono bitmap (copies the bitmap). + wxMask(const wxBitmap& bitmap); + + // construct a mask from the givne bitmap handle + wxMask(WXHBITMAP hbmp) { m_maskBitmap = hbmp; } + + virtual ~wxMask(); + + bool Create(const wxBitmap& bitmap, const wxColour& colour); + bool Create(const wxBitmap& bitmap, int paletteIndex); + bool Create(const wxBitmap& bitmap); + + // Implementation + WXHBITMAP GetMaskBitmap() const { return m_maskBitmap; } + void SetMaskBitmap(WXHBITMAP bmp) { m_maskBitmap = bmp; } + +protected: + WXHBITMAP m_maskBitmap; + + DECLARE_DYNAMIC_CLASS(wxMask) +}; + +// ---------------------------------------------------------------------------- +// wxBitmapHandler is a class which knows how to load/save bitmaps to/from file +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxBitmapHandler : public wxGDIImageHandler +{ +public: + wxBitmapHandler() { } + wxBitmapHandler(const wxString& name, const wxString& ext, long type) + : wxGDIImageHandler(name, ext, type) + { + } + + // keep wxBitmapHandler derived from wxGDIImageHandler compatible with the + // old class which worked only with bitmaps + virtual bool Create(wxBitmap *bitmap, + const void* data, + long flags, + int width, int height, int depth = 1); + virtual bool LoadFile(wxBitmap *bitmap, + const wxString& name, + long flags, + int desiredWidth, int desiredHeight); + virtual bool SaveFile(wxBitmap *bitmap, + const wxString& name, + int type, + const wxPalette *palette = NULL); + + virtual bool Create(wxGDIImage *image, + const void* data, + long flags, + int width, int height, int depth = 1); + virtual bool Load(wxGDIImage *image, + const wxString& name, + long flags, + int desiredWidth, int desiredHeight); + virtual bool Save(wxGDIImage *image, + const wxString& name, + int type); + +private: + DECLARE_DYNAMIC_CLASS(wxBitmapHandler) +}; + +#endif + // _WX_BITMAP_H_ diff --git a/Externals/wxWidgets/include/wx/msw/blank.cur b/Externals/wxWidgets/include/wx/msw/blank.cur new file mode 100644 index 0000000000..048f06b4ae Binary files /dev/null and b/Externals/wxWidgets/include/wx/msw/blank.cur differ diff --git a/Externals/wxWidgets/include/wx/msw/bmpbuttn.h b/Externals/wxWidgets/include/wx/msw/bmpbuttn.h new file mode 100644 index 0000000000..a9173613b8 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/bmpbuttn.h @@ -0,0 +1,73 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/bmpbuttn.h +// Purpose: wxBitmapButton class +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: bmpbuttn.h 36078 2005-11-03 19:38:20Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_BMPBUTTN_H_ +#define _WX_BMPBUTTN_H_ + +#include "wx/button.h" +#include "wx/bitmap.h" +#include "wx/brush.h" + +class WXDLLEXPORT wxBitmapButton : public wxBitmapButtonBase +{ +public: + wxBitmapButton() { } + + wxBitmapButton(wxWindow *parent, + wxWindowID id, + const wxBitmap& bitmap, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxBU_AUTODRAW, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxButtonNameStr) + { + Create(parent, id, bitmap, pos, size, style, validator, name); + } + + bool Create(wxWindow *parent, + wxWindowID id, + const wxBitmap& bitmap, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxBU_AUTODRAW, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxButtonNameStr); + + // Implementation + virtual bool SetBackgroundColour(const wxColour& colour); + virtual void SetDefault(); + virtual bool MSWOnDraw(WXDRAWITEMSTRUCT *item); + virtual void DrawFace( WXHDC dc, int left, int top, int right, int bottom, bool sel ); + virtual void DrawButtonFocus( WXHDC dc, int left, int top, int right, int bottom, bool sel ); + virtual void DrawButtonDisable( WXHDC dc, int left, int top, int right, int bottom, bool with_marg ); + +protected: + // reimplement some base class virtuals + virtual wxSize DoGetBestSize() const; + virtual void OnSetBitmap(); + + // invalidate m_brushDisabled when system colours change + void OnSysColourChanged(wxSysColourChangedEvent& event); + + // change the currently bitmap if we have a hover one + void OnMouseEnterOrLeave(wxMouseEvent& event); + + + // the brush we use to draw disabled buttons + wxBrush m_brushDisabled; + + + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS_NO_COPY(wxBitmapButton) +}; + +#endif // _WX_BMPBUTTN_H_ diff --git a/Externals/wxWidgets/include/wx/msw/brush.h b/Externals/wxWidgets/include/wx/msw/brush.h new file mode 100644 index 0000000000..0c48447aab --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/brush.h @@ -0,0 +1,60 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/brush.h +// Purpose: wxBrush class +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: brush.h 41751 2006-10-08 21:56:55Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_BRUSH_H_ +#define _WX_BRUSH_H_ + +#include "wx/gdicmn.h" +#include "wx/gdiobj.h" +#include "wx/bitmap.h" + +class WXDLLEXPORT wxBrush; + +// ---------------------------------------------------------------------------- +// wxBrush +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxBrush : public wxBrushBase +{ +public: + wxBrush(); + wxBrush(const wxColour& col, int style = wxSOLID); + wxBrush(const wxBitmap& stipple); + virtual ~wxBrush(); + + virtual void SetColour(const wxColour& col); + virtual void SetColour(unsigned char r, unsigned char g, unsigned char b); + virtual void SetStyle(int style); + virtual void SetStipple(const wxBitmap& stipple); + + bool operator==(const wxBrush& brush) const; + bool operator!=(const wxBrush& brush) const { return !(*this == brush); } + + wxColour GetColour() const; + virtual int GetStyle() const; + wxBitmap *GetStipple() const; + + bool Ok() const { return IsOk(); } + bool IsOk() const { return m_refData != NULL; } + + // return the HBRUSH for this brush + virtual WXHANDLE GetResourceHandle() const; + +protected: + virtual wxObjectRefData *CreateRefData() const; + virtual wxObjectRefData *CloneRefData(const wxObjectRefData *data) const; + +private: + DECLARE_DYNAMIC_CLASS(wxBrush) +}; + +#endif + // _WX_BRUSH_H_ diff --git a/Externals/wxWidgets/include/wx/msw/bullseye.cur b/Externals/wxWidgets/include/wx/msw/bullseye.cur new file mode 100644 index 0000000000..42a1b9cd76 Binary files /dev/null and b/Externals/wxWidgets/include/wx/msw/bullseye.cur differ diff --git a/Externals/wxWidgets/include/wx/msw/button.h b/Externals/wxWidgets/include/wx/msw/button.h new file mode 100644 index 0000000000..e36e44ff6a --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/button.h @@ -0,0 +1,82 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/button.h +// Purpose: wxButton class +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: button.h 37393 2006-02-08 21:47:09Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_BUTTON_H_ +#define _WX_BUTTON_H_ + +// ---------------------------------------------------------------------------- +// Pushbutton +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxButton : public wxButtonBase +{ +public: + wxButton() { } + wxButton(wxWindow *parent, + wxWindowID id, + const wxString& label = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxButtonNameStr) + { + Create(parent, id, label, pos, size, style, validator, name); + } + + bool Create(wxWindow *parent, + wxWindowID id, + const wxString& label = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxButtonNameStr); + + virtual ~wxButton(); + + virtual void SetDefault(); + + // implementation from now on + virtual void Command(wxCommandEvent& event); + virtual WXLRESULT MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam); + virtual bool MSWCommand(WXUINT param, WXWORD id); + + // coloured buttons support + virtual bool SetBackgroundColour(const wxColour &colour); + virtual bool SetForegroundColour(const wxColour &colour); + + virtual bool MSWOnDraw(WXDRAWITEMSTRUCT *item); + virtual WXDWORD MSWGetStyle(long style, WXDWORD *exstyle) const; + +private: + void MakeOwnerDrawn(); + +protected: + // send a notification event, return true if processed + bool SendClickEvent(); + + // default button handling + void SetTmpDefault(); + void UnsetTmpDefault(); + + // set or unset BS_DEFPUSHBUTTON style + static void SetDefaultStyle(wxButton *btn, bool on); + + // usually overridden base class virtuals + virtual wxSize DoGetBestSize() const; + +private: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxButton) +}; + +#endif + // _WX_BUTTON_H_ diff --git a/Externals/wxWidgets/include/wx/msw/caret.h b/Externals/wxWidgets/include/wx/msw/caret.h new file mode 100644 index 0000000000..90b0d29cc6 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/caret.h @@ -0,0 +1,64 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: msw/caret.h +// Purpose: wxCaret class - the MSW implementation of wxCaret +// Author: Vadim Zeitlin +// Modified by: +// Created: 23.05.99 +// RCS-ID: $Id: caret.h 35650 2005-09-23 12:56:45Z MR $ +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CARET_H_ +#define _WX_CARET_H_ + +class WXDLLEXPORT wxCaret : public wxCaretBase +{ +public: + wxCaret() { Init(); } + // create the caret of given (in pixels) width and height and associate + // with the given window + wxCaret(wxWindow *window, int width, int height) + { + Init(); + + (void)Create(window, width, height); + } + // same as above + wxCaret(wxWindowBase *window, const wxSize& size) + { + Init(); + + (void)Create(window, size); + } + + // process wxWindow notifications + virtual void OnSetFocus(); + virtual void OnKillFocus(); + +protected: + void Init() + { + wxCaretBase::Init(); + + m_hasCaret = false; + } + + // override base class virtuals + virtual void DoMove(); + virtual void DoShow(); + virtual void DoHide(); + virtual void DoSize(); + + // helper function which creates the system caret + bool MSWCreateCaret(); + +private: + bool m_hasCaret; + + DECLARE_NO_COPY_CLASS(wxCaret) +}; + +#endif // _WX_CARET_H_ + + diff --git a/Externals/wxWidgets/include/wx/msw/cdrom.ico b/Externals/wxWidgets/include/wx/msw/cdrom.ico new file mode 100644 index 0000000000..f3fa3a9576 Binary files /dev/null and b/Externals/wxWidgets/include/wx/msw/cdrom.ico differ diff --git a/Externals/wxWidgets/include/wx/msw/checkbox.h b/Externals/wxWidgets/include/wx/msw/checkbox.h new file mode 100644 index 0000000000..6f5605571e --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/checkbox.h @@ -0,0 +1,86 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/checkbox.h +// Purpose: wxCheckBox class +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: checkbox.h 37393 2006-02-08 21:47:09Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CHECKBOX_H_ +#define _WX_CHECKBOX_H_ + +// Checkbox item (single checkbox) +class WXDLLEXPORT wxCheckBox : public wxCheckBoxBase +{ +public: + wxCheckBox() { } + wxCheckBox(wxWindow *parent, + wxWindowID id, + const wxString& label, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxCheckBoxNameStr) + { + Create(parent, id, label, pos, size, style, validator, name); + } + + bool Create(wxWindow *parent, + wxWindowID id, + const wxString& label, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxCheckBoxNameStr); + + virtual void SetValue(bool value); + virtual bool GetValue() const; + + // override some base class virtuals + virtual bool MSWCommand(WXUINT param, WXWORD id); + virtual void Command(wxCommandEvent& event); + virtual bool SetForegroundColour(const wxColour& colour); + virtual bool MSWOnDraw(WXDRAWITEMSTRUCT *item); + +protected: + virtual wxSize DoGetBestSize() const; + + virtual void DoSet3StateValue(wxCheckBoxState value); + virtual wxCheckBoxState DoGet3StateValue() const; + + // make the checkbox owner drawn or reset it to normal style + void MakeOwnerDrawn(bool ownerDrawn); + + // return true if this checkbox is owner drawn + bool IsOwnerDrawn() const; + +private: + // common part of all ctors + void Init(); + + // event handlers used by owner-drawn checkbox + void OnMouseEnterOrLeave(wxMouseEvent& event); + void OnMouseLeft(wxMouseEvent& event); + void OnFocus(wxFocusEvent& event); + + + // current state of the checkbox + wxCheckBoxState m_state; + + // true if the checkbox is currently pressed + bool m_isPressed; + + // true if mouse is currently over the control + bool m_isHot; + + + DECLARE_DYNAMIC_CLASS_NO_COPY(wxCheckBox) +}; + +#endif + // _WX_CHECKBOX_H_ diff --git a/Externals/wxWidgets/include/wx/msw/checklst.h b/Externals/wxWidgets/include/wx/msw/checklst.h new file mode 100644 index 0000000000..5f12727815 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/checklst.h @@ -0,0 +1,96 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/checklst.h +// Purpose: wxCheckListBox class - a listbox with checkable items +// Author: Vadim Zeitlin +// Modified by: +// Created: 16.11.97 +// RCS-ID: $Id: checklst.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef __CHECKLST__H_ +#define __CHECKLST__H_ + +#if !wxUSE_OWNER_DRAWN + #error "wxCheckListBox class requires owner-drawn functionality." +#endif + +class WXDLLIMPEXP_FWD_CORE wxOwnerDrawn; +class WXDLLIMPEXP_FWD_CORE wxCheckListBoxItem; // fwd decl, defined in checklst.cpp + +class WXDLLEXPORT wxCheckListBox : public wxCheckListBoxBase +{ +public: + // ctors + wxCheckListBox(); + wxCheckListBox(wxWindow *parent, wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + int nStrings = 0, + const wxString choices[] = NULL, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxListBoxNameStr); + wxCheckListBox(wxWindow *parent, wxWindowID id, + const wxPoint& pos, + const wxSize& size, + const wxArrayString& choices, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxListBoxNameStr); + + bool Create(wxWindow *parent, wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + int n = 0, const wxString choices[] = NULL, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxListBoxNameStr); + bool Create(wxWindow *parent, wxWindowID id, + const wxPoint& pos, + const wxSize& size, + const wxArrayString& choices, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxListBoxNameStr); + + // override base class virtuals + virtual void Delete(unsigned int n); + + virtual bool SetFont( const wxFont &font ); + + // items may be checked + virtual bool IsChecked(unsigned int uiIndex) const; + virtual void Check(unsigned int uiIndex, bool bCheck = true); + + // return the index of the item at this position or wxNOT_FOUND + int HitTest(const wxPoint& pt) const { return DoHitTestItem(pt.x, pt.y); } + int HitTest(wxCoord x, wxCoord y) const { return DoHitTestItem(x, y); } + + // accessors + size_t GetItemHeight() const { return m_nItemHeight; } + + // we create our items ourselves and they have non-standard size, + // so we need to override these functions + virtual wxOwnerDrawn *CreateLboxItem(size_t n); + virtual bool MSWOnMeasure(WXMEASUREITEMSTRUCT *item); + +protected: + // this can't be called DoHitTest() because wxWindow already has this method + int DoHitTestItem(wxCoord x, wxCoord y) const; + + // pressing space or clicking the check box toggles the item + void OnKeyDown(wxKeyEvent& event); + void OnLeftClick(wxMouseEvent& event); + + wxSize DoGetBestSize() const; + +private: + size_t m_nItemHeight; // height of checklistbox items (the same for all) + + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS_NO_COPY(wxCheckListBox) +}; + +#endif //_CHECKLST_H diff --git a/Externals/wxWidgets/include/wx/msw/child.ico b/Externals/wxWidgets/include/wx/msw/child.ico new file mode 100644 index 0000000000..435cca2471 Binary files /dev/null and b/Externals/wxWidgets/include/wx/msw/child.ico differ diff --git a/Externals/wxWidgets/include/wx/msw/chkconf.h b/Externals/wxWidgets/include/wx/msw/chkconf.h new file mode 100644 index 0000000000..022ca20ddb --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/chkconf.h @@ -0,0 +1,387 @@ +/* + * Name: wx/msw/chkconf.h + * Purpose: Compiler-specific configuration checking + * Author: Julian Smart + * Modified by: + * Created: 01/02/97 + * RCS-ID: $Id: chkconf.h 44436 2007-02-10 02:06:54Z RD $ + * Copyright: (c) Julian Smart + * Licence: wxWindows licence + */ + +/* THIS IS A C FILE, DON'T USE C++ FEATURES (IN PARTICULAR COMMENTS) IN IT */ + +#ifndef _WX_MSW_CHKCONF_H_ +#define _WX_MSW_CHKCONF_H_ + +/* ensure that MSW-specific settings are defined */ +#ifndef wxUSE_DC_CACHEING +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_DC_CACHEING must be defined" +# else +# define wxUSE_DC_CACHEING 1 +# endif +#endif /* wxUSE_DC_CACHEING */ + + +/* + * disable the settings which don't work for some compilers + */ + +/* + * If using PostScript-in-MSW in Univ, must enable PostScript + */ +#if defined(__WXUNIVERSAL__) && wxUSE_POSTSCRIPT_ARCHITECTURE_IN_MSW && !wxUSE_POSTSCRIPT +# undef wxUSE_POSTSCRIPT +# define wxUSE_POSTSCRIPT 1 +#endif + +#ifndef wxUSE_NORLANDER_HEADERS +# if ( wxCHECK_WATCOM_VERSION(1,0) || defined(__WINE__) ) || \ + ((defined(__MINGW32__) || defined(__CYGWIN__)) && ((__GNUC__>2) ||((__GNUC__==2) && (__GNUC_MINOR__>=95)))) +# define wxUSE_NORLANDER_HEADERS 1 +# else +# define wxUSE_NORLANDER_HEADERS 0 +# endif +#endif + +/* + * We don't want to give an error if wxUSE_UNICODE_MSLU is enabled but + * wxUSE_UNICODE is not as this would make it impossible to simply set the + * former in wx/setup.h as then the library wouldn't compile in non-Unicode + * configurations, so instead simply unset it silently when it doesn't make + * sense. + */ +#if wxUSE_UNICODE_MSLU && !wxUSE_UNICODE +# undef wxUSE_UNICODE_MSLU +# define wxUSE_UNICODE_MSLU 0 +#endif + +/* + * Don't use MSLU if compiling with Wine + */ + +#if wxUSE_UNICODE_MSLU && defined(__WINE__) +# undef wxUSE_UNICODE_MSLU +# define wxUSE_UNICODE_MSLU 0 +#endif + +/* + * All of the settings below require SEH support (__try/__catch) and can't work + * without it. + */ +#if !defined(_MSC_VER) && \ + (!defined(__BORLANDC__) || __BORLANDC__ < 0x0550) +# undef wxUSE_ON_FATAL_EXCEPTION +# define wxUSE_ON_FATAL_EXCEPTION 0 + +# undef wxUSE_CRASHREPORT +# define wxUSE_CRASHREPORT 0 + +# undef wxUSE_STACKWALKER +# define wxUSE_STACKWALKER 0 +#endif /* compiler doesn't support SEH */ + +/* wxUSE_DEBUG_NEW_ALWAYS doesn't work with CodeWarrior */ +#if defined(__MWERKS__) +# undef wxUSE_DEBUG_NEW_ALWAYS +# define wxUSE_DEBUG_NEW_ALWAYS 0 +#endif + +#if defined(__GNUWIN32__) + /* These don't work as expected for mingw32 and cygwin32 */ +# undef wxUSE_MEMORY_TRACING +# define wxUSE_MEMORY_TRACING 0 + +# undef wxUSE_GLOBAL_MEMORY_OPERATORS +# define wxUSE_GLOBAL_MEMORY_OPERATORS 0 + +# undef wxUSE_DEBUG_NEW_ALWAYS +# define wxUSE_DEBUG_NEW_ALWAYS 0 + +/* some Cygwin versions don't have wcslen */ +# if defined(__CYGWIN__) || defined(__CYGWIN32__) +# if ! ((__GNUC__>2) ||((__GNUC__==2) && (__GNUC_MINOR__>=95))) +# undef wxUSE_WCHAR_T +# define wxUSE_WCHAR_T 0 +# endif +#endif + +#endif /* __GNUWIN32__ */ + +/* wxUSE_MFC is not defined when using configure as it doesn't make sense for + gcc or mingw32 anyhow */ +#ifndef wxUSE_MFC + #define wxUSE_MFC 0 +#endif /* !defined(wxUSE_MFC) */ + +/* MFC duplicates these operators */ +#if wxUSE_MFC +# undef wxUSE_GLOBAL_MEMORY_OPERATORS +# define wxUSE_GLOBAL_MEMORY_OPERATORS 0 + +# undef wxUSE_DEBUG_NEW_ALWAYS +# define wxUSE_DEBUG_NEW_ALWAYS 0 +#endif /* wxUSE_MFC */ + +#if (defined(__GNUWIN32__) && !wxUSE_NORLANDER_HEADERS) + /* GnuWin32 doesn't have appropriate headers for e.g. IUnknown. */ +# undef wxUSE_DRAG_AND_DROP +# define wxUSE_DRAG_AND_DROP 0 +#endif + +#if !wxUSE_OWNER_DRAWN && !defined(__WXUNIVERSAL__) +# undef wxUSE_CHECKLISTBOX +# define wxUSE_CHECKLISTBOX 0 +#endif + +#if wxUSE_SPINCTRL +# if !wxUSE_SPINBTN +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxSpinCtrl requires wxSpinButton on MSW" +# else +# undef wxUSE_SPINBTN +# define wxUSE_SPINBTN 1 +# endif +# endif +#endif + +/* + Win64-specific checks. + */ +#ifdef __WIN64__ +# if wxUSE_STACKWALKER + /* this is not currently supported under Win64, volunteers needed to + make it work */ +# undef wxUSE_STACKWALKER +# define wxUSE_STACKWALKER 0 + +# undef wxUSE_CRASHREPORT +# define wxUSE_CRASHREPORT 0 +# endif +#endif /* __WIN64__ */ + + +/* + Compiler-specific checks. + */ +#if defined(__BORLANDC__) && (__BORLANDC__ < 0x500) + /* BC++ 4.0 can't compile JPEG library */ +# undef wxUSE_LIBJPEG +# define wxUSE_LIBJPEG 0 +#endif + +/* wxUSE_DEBUG_NEW_ALWAYS = 1 not compatible with BC++ in DLL mode */ +#if defined(__BORLANDC__) && (defined(WXMAKINGDLL) || defined(WXUSINGDLL)) +# undef wxUSE_DEBUG_NEW_ALWAYS +# define wxUSE_DEBUG_NEW_ALWAYS 0 +#endif + +/* DMC++ doesn't have definitions for date picker control, so use generic control + */ +#ifdef __DMC__ +# if wxUSE_DATEPICKCTRL +# undef wxUSE_DATEPICKCTRL_GENERIC +# undef wxUSE_DATEPICKCTRL +# endif +# define wxUSE_DATEPICKCTRL 0 +# define wxUSE_DATEPICKCTRL_GENERIC 1 +#endif + + +/* check that MSW-specific options are defined too */ +#ifndef wxUSE_ACTIVEX +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_ACTIVEX must be defined." +# else +# define wxUSE_ACTIVEX 0 +# endif +#endif /* !defined(wxUSE_ACTIVEX) */ + +#ifndef wxUSE_DIALUP_MANAGER +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_DIALUP_MANAGER must be defined." +# else +# define wxUSE_DIALUP_MANAGER 0 +# endif +#endif /* !defined(wxUSE_DIALUP_MANAGER) */ + +#ifndef wxUSE_MS_HTML_HELP +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_MS_HTML_HELP must be defined." +# else +# define wxUSE_MS_HTML_HELP 0 +# endif +#endif /* !defined(wxUSE_MS_HTML_HELP) */ + +#ifndef wxUSE_OLE +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_OLE must be defined." +# else +# define wxUSE_OLE 0 +# endif +#endif /* !defined(wxUSE_OLE) */ + +#ifndef wxUSE_OLE_AUTOMATION +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_OLE_AUTOMATION must be defined." +# else +# define wxUSE_OLE_AUTOMATION 0 +# endif +#endif /* !defined(wxUSE_OLE_AUTOMATION) */ + +#ifndef wxUSE_UNICODE_MSLU +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_UNICODE_MSLU must be defined." +# else +# define wxUSE_UNICODE_MSLU 0 +# endif +#endif /* wxUSE_UNICODE_MSLU */ + +#ifndef wxUSE_UXTHEME +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_UXTHEME must be defined." +# else +# define wxUSE_UXTHEME 0 +# endif +#endif /* wxUSE_UXTHEME */ + +#ifndef wxUSE_UXTHEME_AUTO +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_UXTHEME_AUTO must be defined." +# else +# define wxUSE_UXTHEME_AUTO 0 +# endif +#endif /* wxUSE_UXTHEME_AUTO */ + + +/* + un/redefine the options which we can't compile (after checking that they're + defined + */ +#ifdef __WINE__ + /* apparently it doesn't compile under Wine, remove it/when it does */ + #if wxUSE_ACTIVEX + #undef wxUSE_ACTIVEX + #define wxUSE_ACTIVEX 0 + #endif // wxUSE_ACTIVEX +#endif // __WINE__ + + +/* check settings consistency for MSW-specific ones */ +#if !wxUSE_VARIANT +# if wxUSE_ACTIVEX +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxActiveXContainer requires wxVariant" +# else +# undef wxUSE_ACTIVEX +# define wxUSE_ACTIVEX 0 +# endif +# endif + +# if wxUSE_OLE_AUTOMATION +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxAutomationObject requires wxVariant" +# else +# undef wxUSE_OLE_AUTOMATION +# define wxUSE_OLE_AUTOMATION 0 +# endif +# endif +#endif /* !wxUSE_VARIANT */ + +#if !wxUSE_DYNAMIC_LOADER +# if wxUSE_MS_HTML_HELP +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_MS_HTML_HELP requires wxUSE_DYNAMIC_LOADER." +# else +# undef wxUSE_MS_HTML_HELP +# define wxUSE_MS_HTML_HELP 0 +# endif +# endif +# if wxUSE_DIALUP_MANAGER +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_DIALUP_MANAGER requires wxUSE_DYNAMIC_LOADER." +# else +# undef wxUSE_DIALUP_MANAGER +# define wxUSE_DIALUP_MANAGER 0 +# endif +# endif +#endif /* !wxUSE_DYNAMIC_LOADER */ + +#if !wxUSE_DYNLIB_CLASS +# if wxUSE_UXTHEME +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_UXTHEME requires wxUSE_DYNLIB_CLASS" +# else +# undef wxUSE_UXTHEME +# define wxUSE_UXTHEME 0 +# endif +# endif +# if wxUSE_MEDIACTRL +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_MEDIACTRL requires wxUSE_DYNLIB_CLASS" +# else +# undef wxUSE_MEDIACTRL +# define wxUSE_MEDIACTRL 0 +# endif +# endif +# if wxUSE_INKEDIT +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_INKEDIT requires wxUSE_DYNLIB_CLASS" +# else +# undef wxUSE_INKEDIT +# define wxUSE_INKEDIT 0 +# endif +# endif +#endif /* !wxUSE_DYNLIB_CLASS */ + +#if !wxUSE_OLE +# if wxUSE_ACTIVEX +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxActiveXContainer requires wxUSE_OLE" +# else +# undef wxUSE_ACTIVEX +# define wxUSE_ACTIVEX 0 +# endif +# endif + +# if wxUSE_DATAOBJ +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_DATAOBJ requires wxUSE_OLE" +# else +# undef wxUSE_DATAOBJ +# define wxUSE_DATAOBJ 0 +# endif +# endif + +# if wxUSE_OLE_AUTOMATION +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxAutomationObject requires wxUSE_OLE" +# else +# undef wxUSE_OLE_AUTOMATION +# define wxUSE_OLE_AUTOMATION 0 +# endif +# endif +#endif /* !wxUSE_OLE */ + +#if !wxUSE_ACTIVEX +# if wxUSE_MEDIACTRL +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxMediaCtl requires wxActiveXContainer" +# else +# undef wxUSE_MEDIACTRL +# define wxUSE_MEDIACTRL 0 +# endif +# endif +#endif /* !wxUSE_ACTIVEX */ + +#if defined(_MSC_VER) && _MSC_VER <= 1200 && wxUSE_GRAPHICS_CONTEXT +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxGraphicsContext needs MSVC 7 or newer" +# else +# undef wxUSE_GRAPHICS_CONTEXT +# define wxUSE_GRAPHICS_CONTEXT 0 +# endif +#endif + +#endif /* _WX_MSW_CHKCONF_H_ */ diff --git a/Externals/wxWidgets/include/wx/msw/choice.h b/Externals/wxWidgets/include/wx/msw/choice.h new file mode 100644 index 0000000000..5467b0a0fb --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/choice.h @@ -0,0 +1,133 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/choice.h +// Purpose: wxChoice class +// Author: Julian Smart +// Modified by: Vadim Zeitlin to derive from wxChoiceBase +// Created: 01/02/97 +// RCS-ID: $Id: choice.h 38319 2006-03-23 22:05:23Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CHOICE_H_ +#define _WX_CHOICE_H_ + +// ---------------------------------------------------------------------------- +// Choice item +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxChoice : public wxChoiceBase +{ +public: + // ctors + wxChoice() { Init(); } + virtual ~wxChoice(); + + wxChoice(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + int n = 0, const wxString choices[] = NULL, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxChoiceNameStr) + { + Init(); + Create(parent, id, pos, size, n, choices, style, validator, name); + } + + wxChoice(wxWindow *parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + const wxArrayString& choices, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxChoiceNameStr) + { + Init(); + Create(parent, id, pos, size, choices, style, validator, name); + } + + bool Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + int n = 0, const wxString choices[] = NULL, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxChoiceNameStr); + bool Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + const wxArrayString& choices, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxChoiceNameStr); + + virtual void Delete(unsigned int n); + virtual void Clear(); + + virtual unsigned int GetCount() const; + virtual int GetSelection() const; + virtual int GetCurrentSelection() const; + virtual void SetSelection(int n); + + virtual int FindString(const wxString& s, bool bCase = false) const; + virtual wxString GetString(unsigned int n) const; + virtual void SetString(unsigned int n, const wxString& s); + + // MSW only + virtual bool MSWCommand(WXUINT param, WXWORD id); + WXLRESULT MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam); + virtual WXHBRUSH MSWControlColor(WXHDC hDC, WXHWND hWnd); + virtual bool MSWShouldPreProcessMessage(WXMSG *pMsg); + virtual WXDWORD MSWGetStyle(long style, WXDWORD *exstyle) const; + +protected: + // common part of all ctors + void Init() { m_lastAcceptedSelection = wxID_NONE; } + + virtual int DoAppend(const wxString& item); + virtual int DoInsert(const wxString& item, unsigned int pos); + virtual void DoMoveWindow(int x, int y, int width, int height); + virtual void DoSetItemClientData(unsigned int n, void* clientData); + virtual void* DoGetItemClientData(unsigned int n) const; + virtual void DoSetItemClientObject(unsigned int n, wxClientData* clientData); + virtual wxClientData* DoGetItemClientObject(unsigned int n) const; + + // MSW implementation + virtual wxSize DoGetBestSize() const; + virtual void DoGetSize(int *w, int *h) const; + virtual void DoSetSize(int x, int y, + int width, int height, + int sizeFlags = wxSIZE_AUTO); + + // update the height of the drop down list to fit the number of items we + // have (without changing the visible height) + void UpdateVisibleHeight(); + + // create and initialize the control + bool CreateAndInit(wxWindow *parent, wxWindowID id, + const wxPoint& pos, + const wxSize& size, + int n, const wxString choices[], + long style, + const wxValidator& validator, + const wxString& name); + + // free all memory we have (used by Clear() and dtor) + void Free(); + + + // last "completed" selection, i.e. not the transient one while the user is + // browsing the popup list: this is only used when != wxID_NONE which is + // the case while the drop down is opened + int m_lastAcceptedSelection; + + + DECLARE_DYNAMIC_CLASS_NO_COPY(wxChoice) +}; + +#endif // _WX_CHOICE_H_ diff --git a/Externals/wxWidgets/include/wx/msw/clipbrd.h b/Externals/wxWidgets/include/wx/msw/clipbrd.h new file mode 100644 index 0000000000..a8cf81c3c7 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/clipbrd.h @@ -0,0 +1,98 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/clipbrd.h +// Purpose: wxClipboad class and clipboard functions for MSW +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: clipbrd.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CLIPBRD_H_ +#define _WX_CLIPBRD_H_ + +#if wxUSE_CLIPBOARD + +#include "wx/list.h" +#include "wx/module.h" +#include "wx/dataobj.h" // for wxDataFormat + +// These functions superceded by wxClipboard, but retained in order to +// implement wxClipboard, and for compatibility. + +// open/close the clipboard +WXDLLEXPORT bool wxOpenClipboard(); +WXDLLEXPORT bool wxIsClipboardOpened(); +#define wxClipboardOpen wxIsClipboardOpened +WXDLLEXPORT bool wxCloseClipboard(); + +// get/set data +WXDLLEXPORT bool wxEmptyClipboard(); +WXDLLEXPORT bool wxSetClipboardData(wxDataFormat dataFormat, + const void *data, + int width = 0, int height = 0); +WXDLLEXPORT void* wxGetClipboardData(wxDataFormat dataFormat, + long *len = NULL); + +// clipboard formats +WXDLLEXPORT bool wxIsClipboardFormatAvailable(wxDataFormat dataFormat); +WXDLLEXPORT wxDataFormat wxEnumClipboardFormats(wxDataFormat dataFormat); +WXDLLEXPORT int wxRegisterClipboardFormat(wxChar *formatName); +WXDLLEXPORT bool wxGetClipboardFormatName(wxDataFormat dataFormat, + wxChar *formatName, + int maxCount); + +//----------------------------------------------------------------------------- +// wxClipboard +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_CORE wxDataObject; +class WXDLLEXPORT wxClipboard : public wxClipboardBase +{ + DECLARE_DYNAMIC_CLASS(wxClipboard) + +public: + wxClipboard(); + virtual ~wxClipboard(); + + // open the clipboard before SetData() and GetData() + virtual bool Open(); + + // close the clipboard after SetData() and GetData() + virtual void Close(); + + // query whether the clipboard is opened + virtual bool IsOpened() const; + + // set the clipboard data. all other formats will be deleted. + virtual bool SetData( wxDataObject *data ); + + // add to the clipboard data. + virtual bool AddData( wxDataObject *data ); + + // ask if data in correct format is available + virtual bool IsSupported( const wxDataFormat& format ); + + // fill data with data on the clipboard (if available) + virtual bool GetData( wxDataObject& data ); + + // clears wxTheClipboard and the system's clipboard if possible + virtual void Clear(); + + // flushes the clipboard: this means that the data which is currently on + // clipboard will stay available even after the application exits (possibly + // eating memory), otherwise the clipboard will be emptied on exit + virtual bool Flush(); + + // X11 has two clipboards which get selected by this call. Empty on MSW. + void UsePrimarySelection( bool WXUNUSED(primary) = false ) { } + +private: + IDataObject *m_lastDataObject; + bool m_isOpened; +}; + +#endif // wxUSE_CLIPBOARD +#endif + // _WX_CLIPBRD_H_ diff --git a/Externals/wxWidgets/include/wx/msw/colordlg.h b/Externals/wxWidgets/include/wx/msw/colordlg.h new file mode 100644 index 0000000000..fa09134734 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/colordlg.h @@ -0,0 +1,56 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/colordlg.h +// Purpose: wxColourDialog class +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: colordlg.h 37393 2006-02-08 21:47:09Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_COLORDLG_H_ +#define _WX_COLORDLG_H_ + +#include "wx/defs.h" +#include "wx/dialog.h" +#include "wx/cmndata.h" + +// ---------------------------------------------------------------------------- +// wxColourDialog: dialog for choosing a colours +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxColourDialog : public wxDialog +{ +public: + wxColourDialog(); + wxColourDialog(wxWindow *parent, wxColourData *data = NULL); + + bool Create(wxWindow *parent, wxColourData *data = NULL); + + wxColourData& GetColourData() { return m_colourData; } + + // override some base class virtuals + virtual void SetTitle(const wxString& title); + virtual wxString GetTitle() const; + + virtual int ShowModal(); + +protected: + virtual void DoGetPosition( int *x, int *y ) const; + virtual void DoGetSize(int *width, int *height) const; + virtual void DoGetClientSize(int *width, int *height) const; + virtual void DoSetSize(int x, int y, + int width, int height, + int sizeFlags = wxSIZE_AUTO); + + wxColourData m_colourData; + wxString m_title; + + wxPoint m_pos; + + DECLARE_DYNAMIC_CLASS_NO_COPY(wxColourDialog) +}; + +#endif + // _WX_COLORDLG_H_ diff --git a/Externals/wxWidgets/include/wx/msw/colour.h b/Externals/wxWidgets/include/wx/msw/colour.h new file mode 100644 index 0000000000..1b7ce074da --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/colour.h @@ -0,0 +1,84 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/colour.h +// Purpose: wxColour class +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: colour.h 45498 2007-04-16 13:03:05Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_COLOUR_H_ +#define _WX_COLOUR_H_ + +#include "wx/object.h" + +// ---------------------------------------------------------------------------- +// Colour +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxColour : public wxColourBase +{ +public: + // constructors + // ------------ + + // default + wxColour() { Init(); } + DEFINE_STD_WXCOLOUR_CONSTRUCTORS + + + // dtor + virtual ~wxColour(); + + + // accessors + // --------- + + bool Ok() const { return IsOk(); } + bool IsOk() const { return m_isInit; } + + unsigned char Red() const { return m_red; } + unsigned char Green() const { return m_green; } + unsigned char Blue() const { return m_blue; } + unsigned char Alpha() const { return m_alpha ; } + + // comparison + bool operator==(const wxColour& colour) const + { + return m_isInit == colour.m_isInit + && m_red == colour.m_red + && m_green == colour.m_green + && m_blue == colour.m_blue + && m_alpha == colour.m_alpha; + } + + bool operator != (const wxColour& colour) const { return !(*this == colour); } + + WXCOLORREF GetPixel() const { return m_pixel; } + + +public: + WXCOLORREF m_pixel; + +protected: + // Helper function + void Init(); + + virtual void + InitRGBA(unsigned char r, unsigned char g, unsigned char b, unsigned char a); + +private: + bool m_isInit; + unsigned char m_red; + unsigned char m_blue; + unsigned char m_green; + unsigned char m_alpha; + +private: + DECLARE_DYNAMIC_CLASS(wxColour) +}; + +#endif + // _WX_COLOUR_H_ diff --git a/Externals/wxWidgets/include/wx/msw/colours.bmp b/Externals/wxWidgets/include/wx/msw/colours.bmp new file mode 100644 index 0000000000..7d391ad144 Binary files /dev/null and b/Externals/wxWidgets/include/wx/msw/colours.bmp differ diff --git a/Externals/wxWidgets/include/wx/msw/combo.h b/Externals/wxWidgets/include/wx/msw/combo.h new file mode 100644 index 0000000000..0cd58b32d9 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/combo.h @@ -0,0 +1,111 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/combo.h +// Purpose: wxComboCtrl class +// Author: Jaakko Salli +// Modified by: +// Created: Apr-30-2006 +// RCS-ID: $Id: combo.h 43881 2006-12-09 19:48:21Z PC $ +// Copyright: (c) Jaakko Salli +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_COMBOCONTROL_H_ +#define _WX_COMBOCONTROL_H_ + +// NB: Definition of _WX_COMBOCONTROL_H_ is used in wx/generic/combo.h to +// determine whether there is native wxComboCtrl, so make sure you +// use it in all native wxComboCtrls. + +#if wxUSE_COMBOCTRL + +#if !defined(__WXWINCE__) && wxUSE_TIMER + #include "wx/timer.h" + #define wxUSE_COMBOCTRL_POPUP_ANIMATION 1 +#else + #define wxUSE_COMBOCTRL_POPUP_ANIMATION 0 +#endif + + +// ---------------------------------------------------------------------------- +// Native wxComboCtrl +// ---------------------------------------------------------------------------- + +// Define this only if native implementation includes all features +#define wxCOMBOCONTROL_FULLY_FEATURED + +extern WXDLLIMPEXP_DATA_CORE(const wxChar) wxComboBoxNameStr[]; + +class WXDLLEXPORT wxComboCtrl : public wxComboCtrlBase +{ +public: + // ctors and such + wxComboCtrl() : wxComboCtrlBase() { Init(); } + + wxComboCtrl(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxString& value = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxComboBoxNameStr) + : wxComboCtrlBase() + { + Init(); + + (void)Create(parent, id, value, pos, size, style, validator, name); + } + + bool Create(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxString& value = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxComboBoxNameStr); + + virtual ~wxComboCtrl(); + + virtual void PrepareBackground( wxDC& dc, const wxRect& rect, int flags ) const; + virtual bool IsKeyPopupToggle(const wxKeyEvent& event) const; + + static int GetFeatures() { return wxComboCtrlFeatures::All; } + +#if wxUSE_COMBOCTRL_POPUP_ANIMATION + void OnTimerEvent( wxTimerEvent& event ); +protected: + virtual bool AnimateShow( const wxRect& rect, int flags ); +#endif + +protected: + + // customization + virtual void OnResize(); + virtual wxCoord GetNativeTextIndent() const; + virtual void OnThemeChange(); + + // event handlers + void OnPaintEvent( wxPaintEvent& event ); + void OnMouseEvent( wxMouseEvent& event ); + +private: + void Init(); + +#if wxUSE_COMBOCTRL_POPUP_ANIMATION + // Popup animation related + wxLongLong m_animStart; + wxTimer m_animTimer; + wxRect m_animRect; + int m_animFlags; +#endif + + DECLARE_EVENT_TABLE() + + DECLARE_DYNAMIC_CLASS(wxComboCtrl) +}; + + +#endif // wxUSE_COMBOCTRL +#endif + // _WX_COMBOCONTROL_H_ diff --git a/Externals/wxWidgets/include/wx/msw/combobox.h b/Externals/wxWidgets/include/wx/msw/combobox.h new file mode 100644 index 0000000000..5d4d7761fb --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/combobox.h @@ -0,0 +1,138 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/combobox.h +// Purpose: wxComboBox class +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: combobox.h 45818 2007-05-05 13:15:47Z RR $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_COMBOBOX_H_ +#define _WX_COMBOBOX_H_ + +#include "wx/choice.h" + +#if wxUSE_COMBOBOX + +// ---------------------------------------------------------------------------- +// Combobox control +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxComboBox: public wxChoice +{ +public: + wxComboBox() { } + + wxComboBox(wxWindow *parent, wxWindowID id, + const wxString& value = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + int n = 0, const wxString choices[] = NULL, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxComboBoxNameStr) + { + Create(parent, id, value, pos, size, n, choices, style, validator, name); + } + wxComboBox(wxWindow *parent, wxWindowID id, + const wxString& value, + const wxPoint& pos, + const wxSize& size, + const wxArrayString& choices, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxComboBoxNameStr) + { + Create(parent, id, value, pos, size, choices, style, validator, name); + } + + bool Create(wxWindow *parent, + wxWindowID id, + const wxString& value = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + int n = 0, + const wxString choices[] = NULL, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxComboBoxNameStr); + bool Create(wxWindow *parent, + wxWindowID id, + const wxString& value, + const wxPoint& pos, + const wxSize& size, + const wxArrayString& choices, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxComboBoxNameStr); + + // List functions: see wxChoice + + // Text field functions + virtual wxString GetValue() const; + virtual void SetValue(const wxString& value); + + // Clipboard operations + virtual void Copy(); + virtual void Cut(); + virtual void Paste(); + virtual bool CanCopy() const; + virtual bool CanCut() const; + virtual bool CanPaste() const; + virtual void SetInsertionPoint(long pos); + virtual void SetInsertionPointEnd(); + virtual long GetInsertionPoint() const; + virtual wxTextPos GetLastPosition() const; + virtual void Replace(long from, long to, const wxString& value); + virtual void Remove(long from, long to); + virtual void SetSelection(int n) { wxChoice::SetSelection(n); } + virtual void SetSelection(long from, long to); + virtual int GetSelection() const { return wxChoice::GetSelection(); } + virtual void GetSelection(long* from, long* to) const; + virtual void SetEditable(bool editable); + + virtual void Undo(); + virtual void Redo(); + virtual bool CanUndo() const; + virtual bool CanRedo() const; + virtual void SelectAll(); + virtual bool IsEditable() const; + virtual bool HasSelection() const; + + // implementation only from now on + virtual bool MSWCommand(WXUINT param, WXWORD id); + bool MSWProcessEditMsg(WXUINT msg, WXWPARAM wParam, WXLPARAM lParam); + virtual WXLRESULT MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam); + bool MSWShouldPreProcessMessage(WXMSG *pMsg); + + WXHWND GetEditHWND() const; + + // Standard event handling + void OnCut(wxCommandEvent& event); + void OnCopy(wxCommandEvent& event); + void OnPaste(wxCommandEvent& event); + void OnUndo(wxCommandEvent& event); + void OnRedo(wxCommandEvent& event); + void OnDelete(wxCommandEvent& event); + void OnSelectAll(wxCommandEvent& event); + + void OnUpdateCut(wxUpdateUIEvent& event); + void OnUpdateCopy(wxUpdateUIEvent& event); + void OnUpdatePaste(wxUpdateUIEvent& event); + void OnUpdateUndo(wxUpdateUIEvent& event); + void OnUpdateRedo(wxUpdateUIEvent& event); + void OnUpdateDelete(wxUpdateUIEvent& event); + void OnUpdateSelectAll(wxUpdateUIEvent& event); + + virtual WXDWORD MSWGetStyle(long style, WXDWORD *exstyle) const; + +private: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxComboBox) + DECLARE_EVENT_TABLE() +}; + +#endif // wxUSE_COMBOBOX +#endif + // _WX_COMBOBOX_H_ diff --git a/Externals/wxWidgets/include/wx/msw/computer.ico b/Externals/wxWidgets/include/wx/msw/computer.ico new file mode 100644 index 0000000000..f36237bdb9 Binary files /dev/null and b/Externals/wxWidgets/include/wx/msw/computer.ico differ diff --git a/Externals/wxWidgets/include/wx/msw/control.h b/Externals/wxWidgets/include/wx/msw/control.h new file mode 100644 index 0000000000..c70454cbc7 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/control.h @@ -0,0 +1,141 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/control.h +// Purpose: wxControl class +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: control.h 45498 2007-04-16 13:03:05Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CONTROL_H_ +#define _WX_CONTROL_H_ + +#include "wx/dynarray.h" + +// General item class +class WXDLLEXPORT wxControl : public wxControlBase +{ +public: + wxControl() { } + + wxControl(wxWindow *parent, wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxControlNameStr) + { + Create(parent, id, pos, size, style, validator, name); + } + + bool Create(wxWindow *parent, wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxControlNameStr); + + virtual ~wxControl(); + + // Simulates an event + virtual void Command(wxCommandEvent& event) { ProcessCommand(event); } + + + // implementation from now on + // -------------------------- + + virtual wxVisualAttributes GetDefaultAttributes() const + { + return GetClassDefaultAttributes(GetWindowVariant()); + } + + static wxVisualAttributes + GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL); + + // Calls the callback and appropriate event handlers + bool ProcessCommand(wxCommandEvent& event); + + // MSW-specific + virtual bool MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result); + + // For ownerdraw items + virtual bool MSWOnDraw(WXDRAWITEMSTRUCT *WXUNUSED(item)) { return false; } + virtual bool MSWOnMeasure(WXMEASUREITEMSTRUCT *WXUNUSED(item)) { return false; } + + const wxArrayLong& GetSubcontrols() const { return m_subControls; } + + // default handling of WM_CTLCOLORxxx: this is public so that wxWindow + // could call it + virtual WXHBRUSH MSWControlColor(WXHDC pDC, WXHWND hWnd); + + // default style for the control include WS_TABSTOP if it AcceptsFocus() + virtual WXDWORD MSWGetStyle(long style, WXDWORD *exstyle) const; + +protected: + // choose the default border for this window + virtual wxBorder GetDefaultBorder() const; + + // return default best size (doesn't really make any sense, override this) + virtual wxSize DoGetBestSize() const; + + // This is a helper for all wxControls made with UPDOWN native control. + // In wxMSW it was only wxSpinCtrl derived from wxSpinButton but in + // WinCE of Smartphones this happens also for native wxTextCtrl, + // wxChoice and others. + virtual wxSize GetBestSpinnerSize(const bool is_vertical) const; + + // create the control of the given Windows class: this is typically called + // from Create() method of the derived class passing its label, pos and + // size parameter (style parameter is not needed because m_windowStyle is + // supposed to had been already set and so is used instead when this + // function is called) + bool MSWCreateControl(const wxChar *classname, + const wxString& label, + const wxPoint& pos, + const wxSize& size); + + // NB: the method below is deprecated now, with MSWGetStyle() the method + // above should be used instead! Once all the controls are updated to + // implement MSWGetStyle() this version will disappear. + // + // create the control of the given class with the given style (combination + // of WS_XXX flags, i.e. Windows style, not wxWidgets one), returns + // false if creation failed + // + // All parameters except classname and style are optional, if the + // size/position are not given, they should be set later with SetSize() + // and, label (the title of the window), of course, is left empty. The + // extended style is determined from the style and the app 3D settings + // automatically if it's not specified explicitly. + bool MSWCreateControl(const wxChar *classname, + WXDWORD style, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + const wxString& label = wxEmptyString, + WXDWORD exstyle = (WXDWORD)-1); + + // call this from the derived class MSWControlColor() if you want to show + // the control greyed out (and opaque) + WXHBRUSH MSWControlColorDisabled(WXHDC pDC); + + // common part of the 3 functions above: pass wxNullColour to use the + // appropriate background colour (meaning ours or our parents) or a fixed + // one + virtual WXHBRUSH DoMSWControlColor(WXHDC pDC, wxColour colBg, WXHWND hWnd); + + // this is a helper for the derived class GetClassDefaultAttributes() + // implementation: it returns the right colours for the classes which + // contain something else (e.g. wxListBox, wxTextCtrl, ...) instead of + // being simple controls (such as wxButton, wxCheckBox, ...) + static wxVisualAttributes + GetCompositeControlsDefaultAttributes(wxWindowVariant variant); + + // for controls like radiobuttons which are really composite this array + // holds the ids (not HWNDs!) of the sub controls + wxArrayLong m_subControls; + +private: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxControl) +}; + +#endif // _WX_CONTROL_H_ diff --git a/Externals/wxWidgets/include/wx/msw/crashrpt.h b/Externals/wxWidgets/include/wx/msw/crashrpt.h new file mode 100644 index 0000000000..3933a387d4 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/crashrpt.h @@ -0,0 +1,120 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/crashrpt.h +// Purpose: helpers for the structured exception handling (SEH) under Win32 +// Author: Vadim Zeitlin +// Modified by: +// Created: 13.07.2003 +// RCS-ID: $Id: crashrpt.h 34436 2005-05-31 09:20:43Z JS $ +// Copyright: (c) 2003 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MSW_CRASHRPT_H_ +#define _WX_MSW_CRASHRPT_H_ + +#include "wx/defs.h" + +#if wxUSE_CRASHREPORT + +struct _EXCEPTION_POINTERS; + +// ---------------------------------------------------------------------------- +// crash report generation flags +// ---------------------------------------------------------------------------- + +enum +{ + // we always report where the crash occurred + wxCRASH_REPORT_LOCATION = 0, + + // if this flag is given, the call stack is dumped + // + // this results in dump/crash report as small as possible, this is the + // default flag + wxCRASH_REPORT_STACK = 1, + + // if this flag is given, the values of the local variables are dumped + // + // note that with the current implementation it requires dumping the full + // process address space and so this will result in huge dump file and will + // take some time to generate + // + // it's probably not a good idea to use this by default, start with default + // mini dump and ask your users to set WX_CRASH_FLAGS environment variable + // to 2 or 4 if you need more information in the dump + wxCRASH_REPORT_LOCALS = 2, + + // if this flag is given, the values of all global variables are dumped + // + // this creates a much larger mini dump than just wxCRASH_REPORT_STACK but + // still much smaller than wxCRASH_REPORT_LOCALS one + wxCRASH_REPORT_GLOBALS = 4, + + // default is to create the smallest possible crash report + wxCRASH_REPORT_DEFAULT = wxCRASH_REPORT_LOCATION | wxCRASH_REPORT_STACK +}; + +// ---------------------------------------------------------------------------- +// wxCrashContext: information about the crash context +// ---------------------------------------------------------------------------- + +struct WXDLLIMPEXP_BASE wxCrashContext +{ + // initialize this object with the given information or from the current + // global exception info which is only valid inside wxApp::OnFatalException + wxCrashContext(_EXCEPTION_POINTERS *ep = NULL); + + // get the name for this exception code + wxString GetExceptionString() const; + + + // exception code + size_t code; + + // exception address + void *addr; + + // machine-specific registers vaues + struct + { +#ifdef __INTEL__ + wxInt32 eax, ebx, ecx, edx, esi, edi, + ebp, esp, eip, + cs, ds, es, fs, gs, ss, + flags; +#endif // __INTEL__ + } regs; +}; + +// ---------------------------------------------------------------------------- +// wxCrashReport: this class is used to create crash reports +// ---------------------------------------------------------------------------- + +struct WXDLLIMPEXP_BASE wxCrashReport +{ + // set the name of the file to which the report is written, it is + // constructed from the .exe name by default + static void SetFileName(const wxChar *filename); + + // return the current file name + static const wxChar *GetFileName(); + + // write the exception report to the file, return true if it could be done + // or false otherwise + // + // if ep pointer is NULL, the global exception info which is valid only + // inside wxApp::OnFatalException() is used + static bool Generate(int flags = wxCRASH_REPORT_DEFAULT, + _EXCEPTION_POINTERS *ep = NULL); + + + // generate a crash report from outside of wxApp::OnFatalException(), this + // can be used to take "snapshots" of the program in wxApp::OnAssert() for + // example + static bool GenerateNow(int flags = wxCRASH_REPORT_DEFAULT); +}; + +#endif // wxUSE_CRASHREPORT + +#endif // _WX_MSW_CRASHRPT_H_ + diff --git a/Externals/wxWidgets/include/wx/msw/cross.cur b/Externals/wxWidgets/include/wx/msw/cross.cur new file mode 100644 index 0000000000..5b8f4632f9 Binary files /dev/null and b/Externals/wxWidgets/include/wx/msw/cross.cur differ diff --git a/Externals/wxWidgets/include/wx/msw/csquery.bmp b/Externals/wxWidgets/include/wx/msw/csquery.bmp new file mode 100644 index 0000000000..4e7bcdc30b Binary files /dev/null and b/Externals/wxWidgets/include/wx/msw/csquery.bmp differ diff --git a/Externals/wxWidgets/include/wx/msw/cursor.h b/Externals/wxWidgets/include/wx/msw/cursor.h new file mode 100644 index 0000000000..3cf280d435 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/cursor.h @@ -0,0 +1,47 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/cursor.h +// Purpose: wxCursor class +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: cursor.h 49804 2007-11-10 01:09:42Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CURSOR_H_ +#define _WX_CURSOR_H_ + +#include "wx/msw/gdiimage.h" + +class WXDLLIMPEXP_FWD_CORE wxImage; + +// Cursor +class WXDLLEXPORT wxCursor : public wxGDIImage +{ +public: + // constructors + wxCursor(); + wxCursor(const wxImage& image); + wxCursor(const char bits[], int width, int height, + int hotSpotX = -1, int hotSpotY = -1, + const char maskBits[] = NULL); + wxCursor(const wxString& name, + long flags = wxBITMAP_TYPE_CUR_RESOURCE, + int hotSpotX = 0, int hotSpotY = 0); + wxCursor(int idCursor); + virtual ~wxCursor(); + + // implementation only + void SetHCURSOR(WXHCURSOR cursor) { SetHandle((WXHANDLE)cursor); } + WXHCURSOR GetHCURSOR() const { return (WXHCURSOR)GetHandle(); } + +protected: + virtual wxGDIImageRefData *CreateData() const; + +private: + DECLARE_DYNAMIC_CLASS(wxCursor) +}; + +#endif + // _WX_CURSOR_H_ diff --git a/Externals/wxWidgets/include/wx/msw/datectrl.h b/Externals/wxWidgets/include/wx/msw/datectrl.h new file mode 100644 index 0000000000..a814135b4a --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/datectrl.h @@ -0,0 +1,70 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/datectrl.h +// Purpose: wxDatePickerCtrl for Windows +// Author: Vadim Zeitlin +// Modified by: +// Created: 2005-01-09 +// RCS-ID: $Id: datectrl.h 42207 2006-10-21 16:29:33Z VZ $ +// Copyright: (c) 2005 Vadim Zeitlin <vadim@wxwindows.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MSW_DATECTRL_H_ +#define _WX_MSW_DATECTRL_H_ + +// ---------------------------------------------------------------------------- +// wxDatePickerCtrl +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxDatePickerCtrl : public wxDatePickerCtrlBase +{ +public: + // ctors + wxDatePickerCtrl() { } + + wxDatePickerCtrl(wxWindow *parent, + wxWindowID id, + const wxDateTime& dt = wxDefaultDateTime, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDP_DEFAULT | wxDP_SHOWCENTURY, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxDatePickerCtrlNameStr) + { + Create(parent, id, dt, pos, size, style, validator, name); + } + + bool Create(wxWindow *parent, + wxWindowID id, + const wxDateTime& dt = wxDefaultDateTime, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDP_DEFAULT | wxDP_SHOWCENTURY, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxDatePickerCtrlNameStr); + + // set/get the date + virtual void SetValue(const wxDateTime& dt); + virtual wxDateTime GetValue() const; + + // set/get the allowed valid range for the dates, if either/both of them + // are invalid, there is no corresponding limit and if neither is set + // GetRange() returns false + virtual void SetRange(const wxDateTime& dt1, const wxDateTime& dt2); + virtual bool GetRange(wxDateTime *dt1, wxDateTime *dt2) const; + + virtual WXDWORD MSWGetStyle(long style, WXDWORD *exstyle) const; + + virtual bool MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result); + +protected: + virtual wxSize DoGetBestSize() const; + + // the date currently shown by the control, may be invalid + wxDateTime m_date; + + + DECLARE_DYNAMIC_CLASS_NO_COPY(wxDatePickerCtrl) +}; + +#endif // _WX_MSW_DATECTRL_H_ diff --git a/Externals/wxWidgets/include/wx/msw/dc.h b/Externals/wxWidgets/include/wx/msw/dc.h new file mode 100644 index 0000000000..97b1444fcf --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/dc.h @@ -0,0 +1,345 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/dc.h +// Purpose: wxDC class +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: dc.h 42612 2006-10-29 10:46:49Z SC $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MSW_DC_H_ +#define _WX_MSW_DC_H_ + +#include "wx/defs.h" + +// --------------------------------------------------------------------------- +// macros +// --------------------------------------------------------------------------- + +#if wxUSE_DC_CACHEING +/* + * Cached blitting, maintaining a cache + * of bitmaps required for transparent blitting + * instead of constant creation/deletion + */ + +class wxDCCacheEntry: public wxObject +{ +public: + wxDCCacheEntry(WXHBITMAP hBitmap, int w, int h, int depth); + wxDCCacheEntry(WXHDC hDC, int depth); + virtual ~wxDCCacheEntry(); + + WXHBITMAP m_bitmap; + WXHDC m_dc; + int m_width; + int m_height; + int m_depth; +}; +#endif + +// this is an ABC: use one of the derived classes to create a DC associated +// with a window, screen, printer and so on +class WXDLLEXPORT wxDC : public wxDCBase +{ +public: + wxDC(WXHDC hDC) { Init(); m_hDC = hDC; } + virtual ~wxDC(); + + // implement base class pure virtuals + // ---------------------------------- + + virtual void Clear(); + + virtual bool StartDoc(const wxString& message); + virtual void EndDoc(); + + virtual void StartPage(); + virtual void EndPage(); + + virtual void SetFont(const wxFont& font); + virtual void SetPen(const wxPen& pen); + virtual void SetBrush(const wxBrush& brush); + virtual void SetBackground(const wxBrush& brush); + virtual void SetBackgroundMode(int mode); +#if wxUSE_PALETTE + virtual void SetPalette(const wxPalette& palette); +#endif // wxUSE_PALETTE + + virtual void DestroyClippingRegion(); + + virtual wxCoord GetCharHeight() const; + virtual wxCoord GetCharWidth() const; + + virtual bool CanDrawBitmap() const; + virtual bool CanGetTextExtent() const; + virtual int GetDepth() const; + virtual wxSize GetPPI() const; + + virtual void SetMapMode(int mode); + virtual void SetUserScale(double x, double y); + virtual void SetSystemScale(double x, double y); + virtual void SetLogicalScale(double x, double y); + virtual void SetLogicalOrigin(wxCoord x, wxCoord y); + virtual void SetDeviceOrigin(wxCoord x, wxCoord y); + virtual void SetAxisOrientation(bool xLeftRight, bool yBottomUp); + virtual void SetLogicalFunction(int function); + + // implementation from now on + // -------------------------- + + virtual void SetRop(WXHDC cdc); + virtual void SelectOldObjects(WXHDC dc); + + wxWindow *GetWindow() const { return m_canvas; } + void SetWindow(wxWindow *win) + { + m_canvas = win; + +#if wxUSE_PALETTE + // if we have palettes use the correct one for this window + InitializePalette(); +#endif // wxUSE_PALETTE + } + + WXHDC GetHDC() const { return m_hDC; } + void SetHDC(WXHDC dc, bool bOwnsDC = false) + { + m_hDC = dc; + m_bOwnsDC = bOwnsDC; + + // we might have a pre existing clipping region, make sure that we + // return it if asked -- but avoid calling ::GetClipBox() right now as + // it could be unnecessary wasteful + m_clipping = true; + m_clipX1 = + m_clipX2 = 0; + } + + const wxBitmap& GetSelectedBitmap() const { return m_selectedBitmap; } + wxBitmap& GetSelectedBitmap() { return m_selectedBitmap; } + + // update the internal clip box variables + void UpdateClipBox(); + +#if wxUSE_DC_CACHEING + static wxDCCacheEntry* FindBitmapInCache(WXHDC hDC, int w, int h); + static wxDCCacheEntry* FindDCInCache(wxDCCacheEntry* notThis, WXHDC hDC); + + static void AddToBitmapCache(wxDCCacheEntry* entry); + static void AddToDCCache(wxDCCacheEntry* entry); + static void ClearCache(); +#endif + + // RTL related functions + // --------------------- + + // get or change the layout direction (LTR or RTL) for this dc, + // wxLayout_Default is returned if layout direction is not supported + virtual wxLayoutDirection GetLayoutDirection() const; + virtual void SetLayoutDirection(wxLayoutDirection dir); + +protected: + void Init() + { + m_canvas = NULL; + m_bOwnsDC = false; + m_hDC = NULL; + + m_oldBitmap = NULL; + m_oldPen = NULL; + m_oldBrush = NULL; + m_oldFont = NULL; + +#if wxUSE_PALETTE + m_oldPalette = NULL; +#endif // wxUSE_PALETTE + } + + // create an uninitialized DC: this should be only used by the derived + // classes + wxDC() { Init(); } + + virtual void DoGetTextExtent(const wxString& string, + wxCoord *x, wxCoord *y, + wxCoord *descent = NULL, + wxCoord *externalLeading = NULL, + wxFont *theFont = NULL) const; + virtual bool DoGetPartialTextExtents(const wxString& text, wxArrayInt& widths) const; + + virtual bool DoFloodFill(wxCoord x, wxCoord y, const wxColour& col, + int style = wxFLOOD_SURFACE); + + virtual void DoGradientFillLinear(const wxRect& rect, + const wxColour& initialColour, + const wxColour& destColour, + wxDirection nDirection = wxEAST); + + virtual bool DoGetPixel(wxCoord x, wxCoord y, wxColour *col) const; + + virtual void DoDrawPoint(wxCoord x, wxCoord y); + virtual void DoDrawLine(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2); + + virtual void DoDrawArc(wxCoord x1, wxCoord y1, + wxCoord x2, wxCoord y2, + wxCoord xc, wxCoord yc); + virtual void DoDrawCheckMark(wxCoord x, wxCoord y, + wxCoord width, wxCoord height); + virtual void DoDrawEllipticArc(wxCoord x, wxCoord y, wxCoord w, wxCoord h, + double sa, double ea); + + virtual void DoDrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height); + virtual void DoDrawRoundedRectangle(wxCoord x, wxCoord y, + wxCoord width, wxCoord height, + double radius); + virtual void DoDrawEllipse(wxCoord x, wxCoord y, wxCoord width, wxCoord height); + +#if wxUSE_SPLINES + virtual void DoDrawSpline(wxList *points); +#endif + + virtual void DoCrossHair(wxCoord x, wxCoord y); + + virtual void DoDrawIcon(const wxIcon& icon, wxCoord x, wxCoord y); + virtual void DoDrawBitmap(const wxBitmap &bmp, wxCoord x, wxCoord y, + bool useMask = false); + + virtual void DoDrawText(const wxString& text, wxCoord x, wxCoord y); + virtual void DoDrawRotatedText(const wxString& text, wxCoord x, wxCoord y, + double angle); + + virtual bool DoBlit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height, + wxDC *source, wxCoord xsrc, wxCoord ysrc, + int rop = wxCOPY, bool useMask = false, wxCoord xsrcMask = wxDefaultCoord, wxCoord ysrcMask = wxDefaultCoord); + + // this is gnarly - we can't even call this function DoSetClippingRegion() + // because of virtual function hiding + virtual void DoSetClippingRegionAsRegion(const wxRegion& region); + virtual void DoSetClippingRegion(wxCoord x, wxCoord y, + wxCoord width, wxCoord height); + virtual void DoGetClippingBox(wxCoord *x, wxCoord *y, + wxCoord *w, wxCoord *h) const; + + virtual void DoGetSizeMM(int* width, int* height) const; + + virtual void DoDrawLines(int n, wxPoint points[], + wxCoord xoffset, wxCoord yoffset); + virtual void DoDrawPolygon(int n, wxPoint points[], + wxCoord xoffset, wxCoord yoffset, + int fillStyle = wxODDEVEN_RULE); + virtual void DoDrawPolyPolygon(int n, int count[], wxPoint points[], + wxCoord xoffset, wxCoord yoffset, + int fillStyle = wxODDEVEN_RULE); + virtual wxBitmap DoGetAsBitmap(const wxRect *subrect) const + { return subrect == NULL ? GetSelectedBitmap() : GetSelectedBitmap().GetSubBitmap(*subrect); } + + +#if wxUSE_PALETTE + // MSW specific, select a logical palette into the HDC + // (tell windows to translate pixel from other palettes to our custom one + // and vice versa) + // Realize tells it to also reset the system palette to this one. + void DoSelectPalette(bool realize = false); + + // Find out what palette our parent window has, then select it into the dc + void InitializePalette(); +#endif // wxUSE_PALETTE + + // common part of DoDrawText() and DoDrawRotatedText() + void DrawAnyText(const wxString& text, wxCoord x, wxCoord y); + + // common part of DoSetClippingRegion() and DoSetClippingRegionAsRegion() + void SetClippingHrgn(WXHRGN hrgn); + + // implementation of DoGetSize() for wxScreen/PrinterDC: this simply + // returns the size of the entire device this DC is associated with + // + // notice that we intentionally put it in a separate function instead of + // DoGetSize() itself because we want it to remain pure virtual both + // because each derived class should take care to define it as needed (this + // implementation is not at all always appropriate) and because we want + // wxDC to be an ABC to prevent it from being created directly + void GetDeviceSize(int *width, int *height) const; + + + // MSW-specific member variables + // ----------------------------- + + // the window associated with this DC (may be NULL) + wxWindow *m_canvas; + + wxBitmap m_selectedBitmap; + + // TRUE => DeleteDC() in dtor, FALSE => only ReleaseDC() it + bool m_bOwnsDC:1; + + // our HDC + WXHDC m_hDC; + + // Store all old GDI objects when do a SelectObject, so we can select them + // back in (this unselecting user's objects) so we can safely delete the + // DC. + WXHBITMAP m_oldBitmap; + WXHPEN m_oldPen; + WXHBRUSH m_oldBrush; + WXHFONT m_oldFont; + +#if wxUSE_PALETTE + WXHPALETTE m_oldPalette; +#endif // wxUSE_PALETTE + +#if wxUSE_DC_CACHEING + static wxList sm_bitmapCache; + static wxList sm_dcCache; +#endif + + DECLARE_DYNAMIC_CLASS(wxDC) + DECLARE_NO_COPY_CLASS(wxDC) +}; + +// ---------------------------------------------------------------------------- +// wxDCTemp: a wxDC which doesn't free the given HDC (used by wxWidgets +// only/mainly) +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxDCTemp : public wxDC +{ +public: + // construct a temporary DC with the specified HDC and size (it should be + // specified whenever we know it for this HDC) + wxDCTemp(WXHDC hdc, const wxSize& size = wxDefaultSize) + : wxDC(hdc), + m_size(size) + { + } + + virtual ~wxDCTemp() + { + // prevent base class dtor from freeing it + SetHDC((WXHDC)NULL); + } + +protected: + virtual void DoGetSize(int *w, int *h) const + { + wxASSERT_MSG( m_size.IsFullySpecified(), + _T("size of this DC hadn't been set and is unknown") ); + + if ( w ) + *w = m_size.x; + if ( h ) + *h = m_size.y; + } + +private: + // size of this DC must be explicitly set by SetSize() as we have no way to + // find it ourselves + const wxSize m_size; + + DECLARE_NO_COPY_CLASS(wxDCTemp) +}; + +#endif // _WX_MSW_DC_H_ + diff --git a/Externals/wxWidgets/include/wx/msw/dcclient.h b/Externals/wxWidgets/include/wx/msw/dcclient.h new file mode 100644 index 0000000000..a4b87b2d82 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/dcclient.h @@ -0,0 +1,118 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: dcclient.h +// Purpose: wxClientDC class +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: dcclient.h 35650 2005-09-23 12:56:45Z MR $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DCCLIENT_H_ +#define _WX_DCCLIENT_H_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/dc.h" +#include "wx/dynarray.h" + +// ---------------------------------------------------------------------------- +// array types +// ---------------------------------------------------------------------------- + +// this one if used by wxPaintDC only +struct WXDLLEXPORT wxPaintDCInfo; + +WX_DECLARE_EXPORTED_OBJARRAY(wxPaintDCInfo, wxArrayDCInfo); + +// ---------------------------------------------------------------------------- +// DC classes +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxWindowDC : public wxDC +{ +public: + // default ctor + wxWindowDC(); + + // Create a DC corresponding to the whole window + wxWindowDC(wxWindow *win); + +protected: + // initialize the newly created DC + void InitDC(); + + // override some base class virtuals + virtual void DoGetSize(int *width, int *height) const; + +private: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxWindowDC) +}; + +class WXDLLEXPORT wxClientDC : public wxWindowDC +{ +public: + // default ctor + wxClientDC(); + + // Create a DC corresponding to the client area of the window + wxClientDC(wxWindow *win); + + virtual ~wxClientDC(); + +protected: + void InitDC(); + + // override some base class virtuals + virtual void DoGetSize(int *width, int *height) const; + +private: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxClientDC) +}; + +class WXDLLEXPORT wxPaintDC : public wxClientDC +{ +public: + wxPaintDC(); + + // Create a DC corresponding for painting the window in OnPaint() + wxPaintDC(wxWindow *win); + + virtual ~wxPaintDC(); + + // find the entry for this DC in the cache (keyed by the window) + static WXHDC FindDCInCache(wxWindow* win); + +protected: + static wxArrayDCInfo ms_cache; + + // find the entry for this DC in the cache (keyed by the window) + wxPaintDCInfo *FindInCache(size_t *index = NULL) const; + +private: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxPaintDC) +}; + +/* + * wxPaintDCEx + * This class is used when an application sends an HDC with the WM_PAINT + * message. It is used in HandlePaint and need not be used by an application. + */ + +class WXDLLEXPORT wxPaintDCEx : public wxPaintDC +{ +public: + wxPaintDCEx(wxWindow *canvas, WXHDC dc); + virtual ~wxPaintDCEx(); +private: + int saveState; + + DECLARE_CLASS(wxPaintDCEx) + DECLARE_NO_COPY_CLASS(wxPaintDCEx) +}; + +#endif + // _WX_DCCLIENT_H_ diff --git a/Externals/wxWidgets/include/wx/msw/dcmemory.h b/Externals/wxWidgets/include/wx/msw/dcmemory.h new file mode 100644 index 0000000000..fced2bc4f5 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/dcmemory.h @@ -0,0 +1,45 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/dcmemory.h +// Purpose: wxMemoryDC class +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: dcmemory.h 48236 2007-08-20 23:43:32Z KO $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DCMEMORY_H_ +#define _WX_DCMEMORY_H_ + +#include "wx/dcclient.h" + +class WXDLLEXPORT wxMemoryDC : public wxDC, public wxMemoryDCBase +{ +public: + wxMemoryDC() { CreateCompatible(NULL); Init(); } + wxMemoryDC(wxBitmap& bitmap) { CreateCompatible(NULL); Init(); SelectObject(bitmap); } + wxMemoryDC(wxDC *dc); // Create compatible DC + + +protected: + // override some base class virtuals + virtual void DoDrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height); + virtual void DoGetSize(int* width, int* height) const; + virtual void DoSelect(const wxBitmap& bitmap); + + virtual wxBitmap DoGetAsBitmap(const wxRect* subrect) const + { return subrect == NULL ? GetSelectedBitmap() : GetSelectedBitmap().GetSubBitmapOfHDC(*subrect, GetHDC() );} + + // create DC compatible with the given one or screen if dc == NULL + bool CreateCompatible(wxDC *dc); + + // initialize the newly created DC + void Init(); + +private: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxMemoryDC) +}; + +#endif + // _WX_DCMEMORY_H_ diff --git a/Externals/wxWidgets/include/wx/msw/dcprint.h b/Externals/wxWidgets/include/wx/msw/dcprint.h new file mode 100644 index 0000000000..948b52e454 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/dcprint.h @@ -0,0 +1,70 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/dcprint.h +// Purpose: wxPrinterDC class +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: dcprint.h 42522 2006-10-27 13:07:40Z JS $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MSW_DCPRINT_H_ +#define _WX_MSW_DCPRINT_H_ + +#if wxUSE_PRINTING_ARCHITECTURE + +#include "wx/dc.h" +#include "wx/cmndata.h" + +class WXDLLEXPORT wxPrinterDC : public wxDC +{ +public: + // Create a printer DC (obsolete function: use wxPrintData version now) + wxPrinterDC(const wxString& driver, const wxString& device, const wxString& output, bool interactive = true, int orientation = wxPORTRAIT); + + // Create from print data + wxPrinterDC(const wxPrintData& data); + + wxPrinterDC(WXHDC theDC); + + // override some base class virtuals + virtual bool StartDoc(const wxString& message); + virtual void EndDoc(); + virtual void StartPage(); + virtual void EndPage(); + + wxRect GetPaperRect(); + +protected: + virtual void DoDrawBitmap(const wxBitmap &bmp, wxCoord x, wxCoord y, + bool useMask = false); + virtual bool DoBlit(wxCoord xdest, wxCoord ydest, + wxCoord width, wxCoord height, + wxDC *source, wxCoord xsrc, wxCoord ysrc, + int rop = wxCOPY, bool useMask = false, wxCoord xsrcMask = wxDefaultCoord, wxCoord ysrcMask = wxDefaultCoord); + virtual void DoGetSize(int *w, int *h) const + { + GetDeviceSize(w, h); + } + + + // init the dc + void Init(); + + wxPrintData m_printData; + +private: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxPrinterDC) +}; + +// Gets an HDC for the default printer configuration +// WXHDC WXDLLEXPORT wxGetPrinterDC(int orientation); + +// Gets an HDC for the specified printer configuration +WXHDC WXDLLEXPORT wxGetPrinterDC(const wxPrintData& data); + +#endif // wxUSE_PRINTING_ARCHITECTURE + +#endif // _WX_MSW_DCPRINT_H_ + diff --git a/Externals/wxWidgets/include/wx/msw/dcscreen.h b/Externals/wxWidgets/include/wx/msw/dcscreen.h new file mode 100644 index 0000000000..89c83ae7f9 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/dcscreen.h @@ -0,0 +1,40 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/dcscreen.h +// Purpose: wxScreenDC class +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: dcscreen.h 36565 2005-12-25 12:52:53Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MSW_DCSCREEN_H_ +#define _WX_MSW_DCSCREEN_H_ + +#include "wx/dc.h" + +class WXDLLEXPORT wxScreenDC : public wxDC +{ +public: + // Create a DC representing the whole screen + wxScreenDC(); + + // Compatibility with X's requirements for drawing on top of all windows: + // they don't do anything under MSW + static bool StartDrawingOnTop(wxWindow* WXUNUSED(window)) { return true; } + static bool StartDrawingOnTop(wxRect* WXUNUSED(rect) = NULL) { return true; } + static bool EndDrawingOnTop() { return true; } + +protected: + virtual void DoGetSize(int *w, int *h) const + { + GetDeviceSize(w, h); + } + +private: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxScreenDC) +}; + +#endif // _WX_MSW_DCSCREEN_H_ + diff --git a/Externals/wxWidgets/include/wx/msw/dde.h b/Externals/wxWidgets/include/wx/msw/dde.h new file mode 100644 index 0000000000..283a557215 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/dde.h @@ -0,0 +1,144 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: dde.h +// Purpose: DDE class +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: dde.h 41020 2006-09-05 20:47:48Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DDE_H_ +#define _WX_DDE_H_ + +#include "wx/ipcbase.h" + +/* + * Mini-DDE implementation + + Most transactions involve a topic name and an item name (choose these + as befits your application). + + A client can: + + - ask the server to execute commands (data) associated with a topic + - request data from server by topic and item + - poke data into the server + - ask the server to start an advice loop on topic/item + - ask the server to stop an advice loop + + A server can: + + - respond to execute, request, poke and advice start/stop + - send advise data to client + + Note that this limits the server in the ways it can send data to the + client, i.e. it can't send unsolicited information. + * + */ + +class WXDLLIMPEXP_BASE wxDDEServer; +class WXDLLIMPEXP_BASE wxDDEClient; + +class WXDLLIMPEXP_BASE wxDDEConnection: public wxConnectionBase +{ + DECLARE_DYNAMIC_CLASS(wxDDEConnection) +public: + wxDDEConnection(wxChar *buffer, int size); // use external buffer + wxDDEConnection(); // use internal buffer + virtual ~wxDDEConnection(void); + + // Calls that CLIENT can make + virtual bool Execute(const wxChar *data, int size = -1, wxIPCFormat format = wxIPC_TEXT); + virtual bool Execute(const wxString& str) { return Execute(str, -1, wxIPC_TEXT); } + virtual wxChar *Request(const wxString& item, int *size = NULL, wxIPCFormat format = wxIPC_TEXT); + virtual bool Poke(const wxString& item, wxChar *data, int size = -1, wxIPCFormat format = wxIPC_TEXT); + virtual bool StartAdvise(const wxString& item); + virtual bool StopAdvise(const wxString& item); + + // Calls that SERVER can make + virtual bool Advise(const wxString& item, wxChar *data, int size = -1, wxIPCFormat format = wxIPC_TEXT); + + // Calls that both can make + virtual bool Disconnect(void); + + // Default behaviour is to delete connection and return true + virtual bool OnDisconnect(void); + + public: + wxString m_topicName; + wxDDEServer* m_server; + wxDDEClient* m_client; + + WXHCONV m_hConv; + wxChar* m_sendingData; + int m_dataSize; + wxIPCFormat m_dataType; + + DECLARE_NO_COPY_CLASS(wxDDEConnection) +}; + +class WXDLLIMPEXP_BASE wxDDEServer: public wxServerBase +{ + DECLARE_DYNAMIC_CLASS(wxDDEServer) + public: + + wxDDEServer(void); + virtual ~wxDDEServer(void); + bool Create(const wxString& server_name); // Returns false if can't create server (e.g. port + // number is already in use) + virtual wxConnectionBase *OnAcceptConnection(const wxString& topic); + + //////////////////////////////////////////////////////////// + // Implementation + + // Find/delete wxDDEConnection corresponding to the HCONV + wxDDEConnection *FindConnection(WXHCONV conv); + bool DeleteConnection(WXHCONV conv); + inline wxString& GetServiceName(void) const { return (wxString&) m_serviceName; } + inline wxDDEConnectionList& GetConnections(void) const + { + return (wxDDEConnectionList&) m_connections; + } + +protected: + int m_lastError; + wxString m_serviceName; + wxDDEConnectionList m_connections; +}; + +class WXDLLIMPEXP_BASE wxDDEClient: public wxClientBase +{ + DECLARE_DYNAMIC_CLASS(wxDDEClient) + public: + wxDDEClient(void); + virtual ~wxDDEClient(void); + bool ValidHost(const wxString& host); + virtual wxConnectionBase *MakeConnection(const wxString& host, const wxString& server, const wxString& topic); + // Call this to make a connection. + // Returns NULL if cannot. + virtual wxConnectionBase *OnMakeConnection(void); // Tailor this to return own connection. + + //////////////////////////////////////////////////////////// + // Implementation + + // Find/delete wxDDEConnection corresponding to the HCONV + wxDDEConnection *FindConnection(WXHCONV conv); + bool DeleteConnection(WXHCONV conv); + + inline wxDDEConnectionList& GetConnections(void) const + { + return (wxDDEConnectionList&) m_connections; + } + +protected: + int m_lastError; + wxDDEConnectionList m_connections; +}; + +void WXDLLIMPEXP_BASE wxDDEInitialize(); +void WXDLLIMPEXP_BASE wxDDECleanUp(); + +#endif + // _WX_DDE_H_ diff --git a/Externals/wxWidgets/include/wx/msw/debughlp.h b/Externals/wxWidgets/include/wx/msw/debughlp.h new file mode 100644 index 0000000000..65ca85d82c --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/debughlp.h @@ -0,0 +1,228 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/wrapdbgh.h +// Purpose: wraps dbghelp.h standard file +// Author: Vadim Zeitlin +// Modified by: +// Created: 2005-01-08 (extracted from msw/crashrpt.cpp) +// RCS-ID: $Id: debughlp.h 31443 2005-01-18 10:10:23Z ABX $ +// Copyright: (c) 2003-2005 Vadim Zeitlin <vadim@wxwindows.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MSW_DEBUGHLPH_H_ +#define _WX_MSW_DEBUGHLPH_H_ + +#include "wx/dynlib.h" + +#include "wx/msw/wrapwin.h" +#ifndef __WXWINCE__ +#include <imagehlp.h> +#endif // __WXWINCE__ +#include "wx/msw/private.h" + +// we need to determine whether we have the declarations for the function in +// debughlp.dll version 5.81 (at least) and we check for DBHLPAPI to test this +// +// reasons: +// - VC6 version of imagehlp.h doesn't define it +// - VC7 one does +// - testing for compiler version doesn't work as you can install and use +// the new SDK headers with VC6 +// +// in any case, the user may override by defining wxUSE_DBGHELP himself +#ifndef wxUSE_DBGHELP + #ifdef DBHLPAPI + #define wxUSE_DBGHELP 1 + #else + #define wxUSE_DBGHELP 0 + #endif +#endif + +#if wxUSE_DBGHELP + +// ---------------------------------------------------------------------------- +// wxDbgHelpDLL: dynamically load dbghelp.dll functions +// ---------------------------------------------------------------------------- + +// wrapper for some functions from dbghelp.dll +// +// MT note: this class is not MT safe and should be only used from a single +// thread at a time (this is so because dbghelp.dll is not MT-safe +// itself anyhow) +class wxDbgHelpDLL +{ +public: + // some useful constants not present in debughlp.h (stolen from DIA SDK) + enum BasicType + { + BASICTYPE_NOTYPE = 0, + BASICTYPE_VOID = 1, + BASICTYPE_CHAR = 2, + BASICTYPE_WCHAR = 3, + BASICTYPE_INT = 6, + BASICTYPE_UINT = 7, + BASICTYPE_FLOAT = 8, + BASICTYPE_BCD = 9, + BASICTYPE_BOOL = 10, + BASICTYPE_LONG = 13, + BASICTYPE_ULONG = 14, + BASICTYPE_CURRENCY = 25, + BASICTYPE_DATE = 26, + BASICTYPE_VARIANT = 27, + BASICTYPE_COMPLEX = 28, + BASICTYPE_BIT = 29, + BASICTYPE_BSTR = 30, + BASICTYPE_HRESULT = 31, + BASICTYPE_MAX + }; + + enum SymbolTag + { + SYMBOL_TAG_NULL, + SYMBOL_TAG_EXE, + SYMBOL_TAG_COMPILAND, + SYMBOL_TAG_COMPILAND_DETAILS, + SYMBOL_TAG_COMPILAND_ENV, + SYMBOL_TAG_FUNCTION, + SYMBOL_TAG_BLOCK, + SYMBOL_TAG_DATA, + SYMBOL_TAG_ANNOTATION, + SYMBOL_TAG_LABEL, + SYMBOL_TAG_PUBLIC_SYMBOL, + SYMBOL_TAG_UDT, + SYMBOL_TAG_ENUM, + SYMBOL_TAG_FUNCTION_TYPE, + SYMBOL_TAG_POINTER_TYPE, + SYMBOL_TAG_ARRAY_TYPE, + SYMBOL_TAG_BASE_TYPE, + SYMBOL_TAG_TYPEDEF, + SYMBOL_TAG_BASE_CLASS, + SYMBOL_TAG_FRIEND, + SYMBOL_TAG_FUNCTION_ARG_TYPE, + SYMBOL_TAG_FUNC_DEBUG_START, + SYMBOL_TAG_FUNC_DEBUG_END, + SYMBOL_TAG_USING_NAMESPACE, + SYMBOL_TAG_VTABLE_SHAPE, + SYMBOL_TAG_VTABLE, + SYMBOL_TAG_CUSTOM, + SYMBOL_TAG_THUNK, + SYMBOL_TAG_CUSTOM_TYPE, + SYMBOL_TAG_MANAGED_TYPE, + SYMBOL_TAG_DIMENSION, + SYMBOL_TAG_MAX + }; + + enum DataKind + { + DATA_UNKNOWN, + DATA_LOCAL, + DATA_STATIC_LOCAL, + DATA_PARAM, + DATA_OBJECT_PTR, // "this" pointer + DATA_FILE_STATIC, + DATA_GLOBAL, + DATA_MEMBER, + DATA_STATIC_MEMBER, + DATA_CONSTANT, + DATA_MAX + }; + + enum UdtKind + { + UDT_STRUCT, + UDT_CLASS, + UDT_UNION, + UDT_MAX + }; + + + // function types + typedef DWORD (WINAPI *SymGetOptions_t)(); + typedef DWORD (WINAPI *SymSetOptions_t)(DWORD); + typedef BOOL (WINAPI *SymInitialize_t)(HANDLE, LPSTR, BOOL); + typedef BOOL (WINAPI *StackWalk_t)(DWORD, HANDLE, HANDLE, LPSTACKFRAME, + LPVOID, PREAD_PROCESS_MEMORY_ROUTINE, + PFUNCTION_TABLE_ACCESS_ROUTINE, + PGET_MODULE_BASE_ROUTINE, + PTRANSLATE_ADDRESS_ROUTINE); + typedef BOOL (WINAPI *SymFromAddr_t)(HANDLE, DWORD64, PDWORD64, PSYMBOL_INFO); + typedef LPVOID (WINAPI *SymFunctionTableAccess_t)(HANDLE, DWORD); + typedef DWORD (WINAPI *SymGetModuleBase_t)(HANDLE, DWORD); + typedef BOOL (WINAPI *SymGetLineFromAddr_t)(HANDLE, DWORD, + PDWORD, PIMAGEHLP_LINE); + typedef BOOL (WINAPI *SymSetContext_t)(HANDLE, PIMAGEHLP_STACK_FRAME, + PIMAGEHLP_CONTEXT); + typedef BOOL (WINAPI *SymEnumSymbols_t)(HANDLE, ULONG64, PCSTR, + PSYM_ENUMERATESYMBOLS_CALLBACK, PVOID); + typedef BOOL (WINAPI *SymGetTypeInfo_t)(HANDLE, DWORD64, ULONG, + IMAGEHLP_SYMBOL_TYPE_INFO, PVOID); + typedef BOOL (WINAPI *SymCleanup_t)(HANDLE); + typedef BOOL (WINAPI *EnumerateLoadedModules_t)(HANDLE, PENUMLOADED_MODULES_CALLBACK, PVOID); + typedef BOOL (WINAPI *MiniDumpWriteDump_t)(HANDLE, DWORD, HANDLE, + MINIDUMP_TYPE, + CONST PMINIDUMP_EXCEPTION_INFORMATION, + CONST PMINIDUMP_USER_STREAM_INFORMATION, + CONST PMINIDUMP_CALLBACK_INFORMATION); + + #define wxDO_FOR_ALL_SYM_FUNCS(what) \ + what(SymGetOptions); \ + what(SymSetOptions); \ + what(SymInitialize); \ + what(StackWalk); \ + what(SymFromAddr); \ + what(SymFunctionTableAccess); \ + what(SymGetModuleBase); \ + what(SymGetLineFromAddr); \ + what(SymSetContext); \ + what(SymEnumSymbols); \ + what(SymGetTypeInfo); \ + what(SymCleanup); \ + what(EnumerateLoadedModules); \ + what(MiniDumpWriteDump) + + #define wxDECLARE_SYM_FUNCTION(func) static func ## _t func + + wxDO_FOR_ALL_SYM_FUNCS(wxDECLARE_SYM_FUNCTION); + + #undef wxDECLARE_SYM_FUNCTION + + // load all functions from DLL, return true if ok + static bool Init(); + + // return the string with the error message explaining why Init() failed + static const wxString& GetErrorMessage(); + + // log error returned by the given function to debug output + static void LogError(const wxChar *func); + + // return textual representation of the value of given symbol + static wxString DumpSymbol(PSYMBOL_INFO pSymInfo, void *pVariable); + + // return the name of the symbol with given type index + static wxString GetSymbolName(PSYMBOL_INFO pSymInfo); + +private: + // dereference the given symbol, i.e. return symbol which is not a + // pointer/reference any more + // + // if ppData != NULL, dereference the pointer as many times as we + // dereferenced the symbol + // + // return the tag of the dereferenced symbol + static SymbolTag DereferenceSymbol(PSYMBOL_INFO pSymInfo, void **ppData); + + static wxString DumpField(PSYMBOL_INFO pSymInfo, + void *pVariable, + unsigned level); + + static wxString DumpBaseType(BasicType bt, DWORD64 length, void *pVariable); + + static wxString DumpUDT(PSYMBOL_INFO pSymInfo, + void *pVariable, + unsigned level = 0); +}; + +#endif // wxUSE_DBGHELP + +#endif // _WX_MSW_DEBUGHLPH_H_ + diff --git a/Externals/wxWidgets/include/wx/msw/dialog.h b/Externals/wxWidgets/include/wx/msw/dialog.h new file mode 100644 index 0000000000..bb408bf12b --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/dialog.h @@ -0,0 +1,140 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/dialog.h +// Purpose: wxDialog class +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: dialog.h 40687 2006-08-19 22:56:11Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DIALOG_H_ +#define _WX_DIALOG_H_ + +#include "wx/panel.h" + +extern WXDLLEXPORT_DATA(const wxChar) wxDialogNameStr[]; + +class WXDLLEXPORT wxDialogModalData; + +#if wxUSE_TOOLBAR && (defined(__SMARTPHONE__) || defined(__POCKETPC__)) +class WXDLLEXPORT wxToolBar; +extern WXDLLEXPORT_DATA(const wxChar) wxToolBarNameStr[]; +#endif + +// Dialog boxes +class WXDLLEXPORT wxDialog : public wxDialogBase +{ +public: + wxDialog() { Init(); } + + // full ctor + wxDialog(wxWindow *parent, wxWindowID id, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDEFAULT_DIALOG_STYLE, + const wxString& name = wxDialogNameStr) + { + Init(); + + (void)Create(parent, id, title, pos, size, style, name); + } + + bool Create(wxWindow *parent, wxWindowID id, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDEFAULT_DIALOG_STYLE, + const wxString& name = wxDialogNameStr); + + virtual ~wxDialog(); + + // return true if we're showing the dialog modally + virtual bool IsModal() const { return m_modalData != NULL; } + + // show the dialog modally and return the value passed to EndModal() + virtual int ShowModal(); + + // may be called to terminate the dialog with the given return code + virtual void EndModal(int retCode); + + + // we treat dialog toolbars specially under Windows CE +#if wxUSE_TOOLBAR && defined(__POCKETPC__) + // create main toolbar by calling OnCreateToolBar() + virtual wxToolBar* CreateToolBar(long style = -1, + wxWindowID winid = wxID_ANY, + const wxString& name = wxToolBarNameStr); + // return a new toolbar + virtual wxToolBar *OnCreateToolBar(long style, + wxWindowID winid, + const wxString& name ); + + // get the main toolbar + wxToolBar *GetToolBar() const { return m_dialogToolBar; } +#endif // wxUSE_TOOLBAR && __POCKETPC__ + + + // implementation only from now on + // ------------------------------- + + // override some base class virtuals + virtual bool Show(bool show = true); + + virtual void Raise(); + +#ifdef __POCKETPC__ + // Responds to the OK button in a PocketPC titlebar. This + // can be overridden, or you can change the id used for + // sending the event with SetAffirmativeId. Returns false + // if the event was not processed. + virtual bool DoOK(); +#endif + + // Windows callbacks + WXLRESULT MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam); + +#if WXWIN_COMPATIBILITY_2_6 + // use the other ctor + wxDEPRECATED( wxDialog(wxWindow *parent, + const wxString& title, bool modal, + int x = wxDefaultCoord, int y = wxDefaultCoord, int width = 500, int height = 500, + long style = wxDEFAULT_DIALOG_STYLE, + const wxString& name = wxDialogNameStr) ); + + // just call Show() or ShowModal() + wxDEPRECATED( void SetModal(bool flag) ); + + // use IsModal() + wxDEPRECATED( bool IsModalShowing() const ); +#endif // WXWIN_COMPATIBILITY_2_6 + +protected: + // find the window to use as parent for this dialog if none has been + // specified explicitly by the user + // + // may return NULL + wxWindow *FindSuitableParent() const; + + // common part of all ctors + void Init(); + +private: + wxWindow* m_oldFocus; + bool m_endModalCalled; // allow for closing within InitDialog + +#if wxUSE_TOOLBAR && defined(__POCKETPC__) + wxToolBar* m_dialogToolBar; +#endif + + // this pointer is non-NULL only while the modal event loop is running + wxDialogModalData *m_modalData; + + DECLARE_DYNAMIC_CLASS(wxDialog) + DECLARE_NO_COPY_CLASS(wxDialog) +}; + +#endif + // _WX_DIALOG_H_ diff --git a/Externals/wxWidgets/include/wx/msw/dib.h b/Externals/wxWidgets/include/wx/msw/dib.h new file mode 100644 index 0000000000..71ae02bb75 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/dib.h @@ -0,0 +1,255 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/dib.h +// Purpose: wxDIB class representing Win32 device independent bitmaps +// Author: Vadim Zeitlin +// Modified by: +// Created: 03.03.03 (replaces the old file with the same name) +// RCS-ID: $Id: dib.h 49804 2007-11-10 01:09:42Z VZ $ +// Copyright: (c) 1997-2003 wxWidgets team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MSW_DIB_H_ +#define _WX_MSW_DIB_H_ + +class WXDLLIMPEXP_FWD_CORE wxBitmap; +class WXDLLIMPEXP_FWD_CORE wxPalette; + +#include "wx/msw/private.h" + +#if wxUSE_WXDIB + +// ---------------------------------------------------------------------------- +// wxDIB: represents a DIB section +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxDIB +{ +public: + // ctors and such + // -------------- + + // create an uninitialized DIB with the given width, height and depth (only + // 24 and 32 bpp DIBs are currently supported) + // + // after using this ctor, GetData() and GetHandle() may be used if IsOk() + // returns true + wxDIB(int width, int height, int depth) + { Init(); (void)Create(width, height, depth); } + + // create a DIB from the DDB + wxDIB(const wxBitmap& bmp) + { Init(); (void)Create(bmp); } + + // create a DIB from the Windows DDB + wxDIB(HBITMAP hbmp) + { Init(); (void)Create(hbmp); } + + // load a DIB from file (any depth is supoprted here unlike above) + // + // as above, use IsOk() to see if the bitmap was loaded successfully + wxDIB(const wxString& filename) + { Init(); (void)Load(filename); } + + // same as the corresponding ctors but with return value + bool Create(int width, int height, int depth); + bool Create(const wxBitmap& bmp); + bool Create(HBITMAP hbmp); + bool Load(const wxString& filename); + + // dtor is not virtual, this class is not meant to be used polymorphically + ~wxDIB(); + + + // operations + // ---------- + +#ifndef __WXWINCE__ + // create a bitmap compatible with the given HDC (or screen by default) and + // return its handle, the caller is responsible for freeing it (using + // DeleteObject()) + HBITMAP CreateDDB(HDC hdc = 0) const; +#endif // !__WXWINCE__ + + // get the handle from the DIB and reset it, i.e. this object won't destroy + // the DIB after this (but the caller should do it) + HBITMAP Detach() { HBITMAP hbmp = m_handle; m_handle = 0; return hbmp; } + +#if wxUSE_PALETTE + // create a palette for this DIB (always a trivial/default one for 24bpp) + wxPalette *CreatePalette() const; +#endif // wxUSE_PALETTE + + // save the DIB as a .BMP file to the file with the given name + bool Save(const wxString& filename); + + + // accessors + // --------- + + // return true if DIB was successfully created, false otherwise + bool IsOk() const { return m_handle != 0; } + + // get the bitmap size + wxSize GetSize() const { DoGetObject(); return wxSize(m_width, m_height); } + int GetWidth() const { DoGetObject(); return m_width; } + int GetHeight() const { DoGetObject(); return m_height; } + + // get the number of bits per pixel, or depth + int GetDepth() const { DoGetObject(); return m_depth; } + + // get the DIB handle + HBITMAP GetHandle() const { return m_handle; } + + // get raw pointer to bitmap bits, you should know what you do if you + // decide to use it + unsigned char *GetData() const + { DoGetObject(); return (unsigned char *)m_data; } + + + // HBITMAP conversion + // ------------------ + + // these functions are only used by wxWidgets internally right now, please + // don't use them directly if possible as they're subject to change + +#ifndef __WXWINCE__ + // creates a DDB compatible with the given (or screen) DC from either + // a plain DIB or a DIB section (in which case the last parameter must be + // non NULL) + static HBITMAP ConvertToBitmap(const BITMAPINFO *pbi, + HDC hdc = 0, + void *bits = NULL); + + // create a plain DIB (not a DIB section) from a DDB, the caller is + // responsable for freeing it using ::GlobalFree() + static HGLOBAL ConvertFromBitmap(HBITMAP hbmp); + + // creates a DIB from the given DDB or calculates the space needed by it: + // if pbi is NULL, only the space is calculated, otherwise pbi is supposed + // to point at BITMAPINFO of the correct size which is filled by this + // function (this overload is needed for wxBitmapDataObject code in + // src/msw/ole/dataobj.cpp) + static size_t ConvertFromBitmap(BITMAPINFO *pbi, HBITMAP hbmp); +#endif // __WXWINCE__ + + + // wxImage conversion + // ------------------ + +#if wxUSE_IMAGE + // create a DIB from the given image, the DIB will be either 24 or 32 (if + // the image has alpha channel) bpp + wxDIB(const wxImage& image) { Init(); (void)Create(image); } + + // same as the above ctor but with the return code + bool Create(const wxImage& image); + + // create wxImage having the same data as this DIB + wxImage ConvertToImage() const; +#endif // wxUSE_IMAGE + + + // helper functions + // ---------------- + + // return the size of one line in a DIB with given width and depth: the + // point here is that as the scan lines need to be DWORD aligned so we may + // need to add some padding + static unsigned long GetLineSize(int width, int depth) + { + return ((width*depth + 31) & ~31) >> 3; + } + +private: + // common part of all ctors + void Init(); + + // free resources + void Free(); + + // initialize the contents from the provided DDB (Create() must have been + // already called) + bool CopyFromDDB(HBITMAP hbmp); + + + // the DIB section handle, 0 if invalid + HBITMAP m_handle; + + // NB: we could store only m_handle and not any of the other fields as + // we may always retrieve them from it using ::GetObject(), but we + // decide to still store them for efficiency concerns -- however if we + // don't have them from the very beginning (e.g. DIB constructed from a + // bitmap), we only retrieve them when necessary and so these fields + // should *never* be accessed directly, even from inside wxDIB code + + // function which must be called before accessing any members and which + // gets their values from m_handle, if not done yet + void DoGetObject() const; + + // pointer to DIB bits, may be NULL + void *m_data; + + // size and depth of the image + int m_width, + m_height, + m_depth; + + // in some cases we could be using a handle which we didn't create and in + // this case we shouldn't free it neither -- this flag tell us if this is + // the case + bool m_ownsHandle; + + // if true, we have alpha, if false we don't (note that we can still have + // m_depth == 32 but the last component is then simply padding and not + // alpha) + bool m_hasAlpha; + + + // DIBs can't be copied + wxDIB(const wxDIB&); + wxDIB& operator=(const wxDIB&); +}; + +// ---------------------------------------------------------------------------- +// inline functions implementation +// ---------------------------------------------------------------------------- + +inline +void wxDIB::Init() +{ + m_handle = 0; + m_ownsHandle = true; + m_hasAlpha = false; + + m_data = NULL; + + m_width = + m_height = + m_depth = 0; +} + +inline +void wxDIB::Free() +{ + if ( m_handle && m_ownsHandle ) + { + if ( !::DeleteObject(m_handle) ) + { + wxLogLastError(wxT("DeleteObject(hDIB)")); + } + + Init(); + } +} + +inline wxDIB::~wxDIB() +{ + Free(); +} + +#endif + // wxUSE_WXDIB + +#endif // _WX_MSW_DIB_H_ + diff --git a/Externals/wxWidgets/include/wx/msw/dirdlg.h b/Externals/wxWidgets/include/wx/msw/dirdlg.h new file mode 100644 index 0000000000..8e27d57e3e --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/dirdlg.h @@ -0,0 +1,35 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/dirdlg.h +// Purpose: wxDirDialog class +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: dirdlg.h 38956 2006-04-30 09:44:29Z RR $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DIRDLG_H_ +#define _WX_DIRDLG_H_ + +class WXDLLEXPORT wxDirDialog : public wxDirDialogBase +{ +public: + wxDirDialog(wxWindow *parent, + const wxString& message = wxDirSelectorPromptStr, + const wxString& defaultPath = wxEmptyString, + long style = wxDD_DEFAULT_STYLE, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + const wxString& name = wxDirDialogNameStr); + + void SetPath(const wxString& path); + + virtual int ShowModal(); + +private: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxDirDialog) +}; + +#endif + // _WX_DIRDLG_H_ diff --git a/Externals/wxWidgets/include/wx/msw/dragimag.h b/Externals/wxWidgets/include/wx/msw/dragimag.h new file mode 100644 index 0000000000..ce944200ef --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/dragimag.h @@ -0,0 +1,274 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/dragimag.h +// Purpose: wxDragImage class: a kind of a cursor, that can cope +// with more sophisticated images +// Author: Julian Smart +// Modified by: +// Created: 08/04/99 +// RCS-ID: $Id: dragimag.h 45845 2007-05-05 19:00:35Z PC $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_DRAGIMAG_H_ +#define _WX_DRAGIMAG_H_ + +#if wxUSE_DRAGIMAGE + +#include "wx/bitmap.h" +#include "wx/icon.h" +#include "wx/cursor.h" +#include "wx/treectrl.h" +#include "wx/listctrl.h" + +// If 1, use a simple wxCursor instead of ImageList_SetDragCursorImage +#define wxUSE_SIMPLER_DRAGIMAGE 0 + +/* + To use this class, create a wxDragImage when you start dragging, for example: + + void MyTreeCtrl::OnBeginDrag(wxTreeEvent& event) + { +#ifdef __WXMSW__ + ::UpdateWindow((HWND) GetHWND()); // We need to implement this in wxWidgets +#endif + + CaptureMouse(); + + m_dragImage = new wxDragImage(* this, itemId); + m_dragImage->BeginDrag(wxPoint(0, 0), this); + m_dragImage->Move(pt, this); + m_dragImage->Show(this); + ... + } + + In your OnMouseMove function, hide the image, do any display updating required, + then move and show the image again: + + void MyTreeCtrl::OnMouseMove(wxMouseEvent& event) + { + if (m_dragMode == MY_TREE_DRAG_NONE) + { + event.Skip(); + return; + } + + // Prevent screen corruption by hiding the image + if (m_dragImage) + m_dragImage->Hide(this); + + // Do some updating of the window, such as highlighting the drop target + ... + +#ifdef __WXMSW__ + if (updateWindow) + ::UpdateWindow((HWND) GetHWND()); +#endif + + // Move and show the image again + m_dragImage->Move(event.GetPosition(), this); + m_dragImage->Show(this); + } + + Eventually we end the drag and delete the drag image. + + void MyTreeCtrl::OnLeftUp(wxMouseEvent& event) + { + ... + + // End the drag and delete the drag image + if (m_dragImage) + { + m_dragImage->EndDrag(this); + delete m_dragImage; + m_dragImage = NULL; + } + ReleaseMouse(); + } +*/ + +/* + Notes for Unix version: + Can we simply use cursors instead, creating a cursor dynamically, setting it into the window + in BeginDrag, and restoring the old cursor in EndDrag? + For a really bog-standard implementation, we could simply use a normal dragging cursor + and ignore the image. +*/ + +/* + * wxDragImage + */ + +class WXDLLEXPORT wxDragImage: public wxObject +{ +public: + + // Ctors & dtor + //////////////////////////////////////////////////////////////////////////// + + wxDragImage(); + wxDragImage(const wxBitmap& image, const wxCursor& cursor = wxNullCursor) + { + Init(); + + Create(image, cursor); + } + + // Deprecated form of the above + wxDragImage(const wxBitmap& image, const wxCursor& cursor, const wxPoint& cursorHotspot) + { + Init(); + + Create(image, cursor, cursorHotspot); + } + + wxDragImage(const wxIcon& image, const wxCursor& cursor = wxNullCursor) + { + Init(); + + Create(image, cursor); + } + + // Deprecated form of the above + wxDragImage(const wxIcon& image, const wxCursor& cursor, const wxPoint& cursorHotspot) + { + Init(); + + Create(image, cursor, cursorHotspot); + } + + wxDragImage(const wxString& str, const wxCursor& cursor = wxNullCursor) + { + Init(); + + Create(str, cursor); + } + + // Deprecated form of the above + wxDragImage(const wxString& str, const wxCursor& cursor, const wxPoint& cursorHotspot) + { + Init(); + + Create(str, cursor, cursorHotspot); + } + +#if wxUSE_TREECTRL + wxDragImage(const wxTreeCtrl& treeCtrl, wxTreeItemId& id) + { + Init(); + + Create(treeCtrl, id); + } +#endif + +#if wxUSE_LISTCTRL + wxDragImage(const wxListCtrl& listCtrl, long id) + { + Init(); + + Create(listCtrl, id); + } +#endif + + virtual ~wxDragImage(); + + // Attributes + //////////////////////////////////////////////////////////////////////////// + + // Operations + //////////////////////////////////////////////////////////////////////////// + + // Create a drag image from a bitmap and optional cursor + bool Create(const wxBitmap& image, const wxCursor& cursor = wxNullCursor); + bool Create(const wxBitmap& image, const wxCursor& cursor, const wxPoint& WXUNUSED(cursorHotspot)) + { + wxLogDebug(wxT("wxDragImage::Create: use of a cursor hotspot is now deprecated. Please omit this argument.")); + return Create(image, cursor); + } + + // Create a drag image from an icon and optional cursor + bool Create(const wxIcon& image, const wxCursor& cursor = wxNullCursor); + bool Create(const wxIcon& image, const wxCursor& cursor, const wxPoint& WXUNUSED(cursorHotspot)) + { + wxLogDebug(wxT("wxDragImage::Create: use of a cursor hotspot is now deprecated. Please omit this argument.")); + return Create(image, cursor); + } + + // Create a drag image from a string and optional cursor + bool Create(const wxString& str, const wxCursor& cursor = wxNullCursor); + bool Create(const wxString& str, const wxCursor& cursor, const wxPoint& WXUNUSED(cursorHotspot)) + { + wxLogDebug(wxT("wxDragImage::Create: use of a cursor hotspot is now deprecated. Please omit this argument.")); + return Create(str, cursor); + } + +#if wxUSE_TREECTRL + // Create a drag image for the given tree control item + bool Create(const wxTreeCtrl& treeCtrl, wxTreeItemId& id); +#endif + +#if wxUSE_LISTCTRL + // Create a drag image for the given list control item + bool Create(const wxListCtrl& listCtrl, long id); +#endif + + // Begin drag. hotspot is the location of the drag position relative to the upper-left + // corner of the image. + bool BeginDrag(const wxPoint& hotspot, wxWindow* window, bool fullScreen = false, wxRect* rect = (wxRect*) NULL); + + // Begin drag. hotspot is the location of the drag position relative to the upper-left + // corner of the image. This is full screen only. fullScreenRect gives the + // position of the window on the screen, to restrict the drag to. + bool BeginDrag(const wxPoint& hotspot, wxWindow* window, wxWindow* fullScreenRect); + + // End drag + bool EndDrag(); + + // Move the image: call from OnMouseMove. Pt is in window client coordinates if window + // is non-NULL, or in screen coordinates if NULL. + bool Move(const wxPoint& pt); + + // Show the image + bool Show(); + + // Hide the image + bool Hide(); + + // Implementation + //////////////////////////////////////////////////////////////////////////// + + // Initialize variables + void Init(); + + // Returns the native image list handle + WXHIMAGELIST GetHIMAGELIST() const { return m_hImageList; } + +#if !wxUSE_SIMPLER_DRAGIMAGE + // Returns the native image list handle for the cursor + WXHIMAGELIST GetCursorHIMAGELIST() const { return m_hCursorImageList; } +#endif + +protected: + WXHIMAGELIST m_hImageList; + +#if wxUSE_SIMPLER_DRAGIMAGE + wxCursor m_oldCursor; +#else + WXHIMAGELIST m_hCursorImageList; +#endif + + wxCursor m_cursor; +// wxPoint m_cursorHotspot; // Obsolete + wxPoint m_position; + wxWindow* m_window; + wxRect m_boundingRect; + bool m_fullScreen; + +private: + DECLARE_DYNAMIC_CLASS(wxDragImage) + DECLARE_NO_COPY_CLASS(wxDragImage) +}; + +#endif // wxUSE_DRAGIMAGE +#endif + // _WX_DRAGIMAG_H_ diff --git a/Externals/wxWidgets/include/wx/msw/drive.ico b/Externals/wxWidgets/include/wx/msw/drive.ico new file mode 100644 index 0000000000..cac90115fe Binary files /dev/null and b/Externals/wxWidgets/include/wx/msw/drive.ico differ diff --git a/Externals/wxWidgets/include/wx/msw/enhmeta.h b/Externals/wxWidgets/include/wx/msw/enhmeta.h new file mode 100644 index 0000000000..e5be570a28 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/enhmeta.h @@ -0,0 +1,184 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/enhmeta.h +// Purpose: wxEnhMetaFile class for Win32 +// Author: Vadim Zeitlin +// Modified by: +// Created: 13.01.00 +// RCS-ID: $Id: enhmeta.h 41751 2006-10-08 21:56:55Z VZ $ +// Copyright: (c) 2000 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MSW_ENHMETA_H_ +#define _WX_MSW_ENHMETA_H_ + +#include "wx/dc.h" + +#if wxUSE_DRAG_AND_DROP + #include "wx/dataobj.h" +#endif + +// ---------------------------------------------------------------------------- +// wxEnhMetaFile: encapsulation of Win32 HENHMETAFILE +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxEnhMetaFile : public wxObject +{ +public: + wxEnhMetaFile(const wxString& file = wxEmptyString) : m_filename(file) + { Init(); } + wxEnhMetaFile(const wxEnhMetaFile& metafile) : wxObject() + { Init(); Assign(metafile); } + wxEnhMetaFile& operator=(const wxEnhMetaFile& metafile) + { Free(); Assign(metafile); return *this; } + + virtual ~wxEnhMetaFile() + { Free(); } + + // display the picture stored in the metafile on the given DC + bool Play(wxDC *dc, wxRect *rectBound = (wxRect *)NULL); + + // accessors + bool Ok() const { return IsOk(); } + bool IsOk() const { return m_hMF != 0; } + + wxSize GetSize() const; + int GetWidth() const { return GetSize().x; } + int GetHeight() const { return GetSize().y; } + + const wxString& GetFileName() const { return m_filename; } + + // copy the metafile to the clipboard: the width and height parameters are + // for backwards compatibility (with wxMetaFile) only, they are ignored by + // this method + bool SetClipboard(int width = 0, int height = 0); + + // implementation + WXHANDLE GetHENHMETAFILE() const { return m_hMF; } + void SetHENHMETAFILE(WXHANDLE hMF) { Free(); m_hMF = hMF; } + +protected: + void Init(); + void Free(); + void Assign(const wxEnhMetaFile& mf); + +private: + wxString m_filename; + WXHANDLE m_hMF; + + DECLARE_DYNAMIC_CLASS(wxEnhMetaFile) +}; + +// ---------------------------------------------------------------------------- +// wxEnhMetaFileDC: allows to create a wxEnhMetaFile +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxEnhMetaFileDC : public wxDC +{ +public: + // the ctor parameters specify the filename (empty for memory metafiles), + // the metafile picture size and the optional description/comment + wxEnhMetaFileDC(const wxString& filename = wxEmptyString, + int width = 0, int height = 0, + const wxString& description = wxEmptyString); + + virtual ~wxEnhMetaFileDC(); + + // obtain a pointer to the new metafile (caller should delete it) + wxEnhMetaFile *Close(); + +protected: + virtual void DoGetSize(int *width, int *height) const; + +private: + // size passed to ctor and returned by DoGetSize() + int m_width, + m_height; + + DECLARE_DYNAMIC_CLASS_NO_COPY(wxEnhMetaFileDC) +}; + +#if wxUSE_DRAG_AND_DROP + +// ---------------------------------------------------------------------------- +// wxEnhMetaFileDataObject is a specialization of wxDataObject for enh metafile +// ---------------------------------------------------------------------------- + +// notice that we want to support both CF_METAFILEPICT and CF_ENHMETAFILE and +// so we derive from wxDataObject and not from wxDataObjectSimple +class WXDLLEXPORT wxEnhMetaFileDataObject : public wxDataObject +{ +public: + // ctors + wxEnhMetaFileDataObject() { } + wxEnhMetaFileDataObject(const wxEnhMetaFile& metafile) + : m_metafile(metafile) { } + + // virtual functions which you may override if you want to provide data on + // demand only - otherwise, the trivial default versions will be used + virtual void SetMetafile(const wxEnhMetaFile& metafile) + { m_metafile = metafile; } + virtual wxEnhMetaFile GetMetafile() const + { return m_metafile; } + + // implement base class pure virtuals + virtual wxDataFormat GetPreferredFormat(Direction dir) const; + virtual size_t GetFormatCount(Direction dir) const; + virtual void GetAllFormats(wxDataFormat *formats, Direction dir) const; + virtual size_t GetDataSize(const wxDataFormat& format) const; + virtual bool GetDataHere(const wxDataFormat& format, void *buf) const; + virtual bool SetData(const wxDataFormat& format, size_t len, + const void *buf); + +protected: + wxEnhMetaFile m_metafile; + + DECLARE_NO_COPY_CLASS(wxEnhMetaFileDataObject) +}; + + +// ---------------------------------------------------------------------------- +// wxEnhMetaFileSimpleDataObject does derive from wxDataObjectSimple which +// makes it more convenient to use (it can be used with wxDataObjectComposite) +// at the price of not supoprting any more CF_METAFILEPICT but only +// CF_ENHMETAFILE +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxEnhMetaFileSimpleDataObject : public wxDataObjectSimple +{ +public: + // ctors + wxEnhMetaFileSimpleDataObject() : wxDataObjectSimple(wxDF_ENHMETAFILE) { } + wxEnhMetaFileSimpleDataObject(const wxEnhMetaFile& metafile) + : wxDataObjectSimple(wxDF_ENHMETAFILE), m_metafile(metafile) { } + + // virtual functions which you may override if you want to provide data on + // demand only - otherwise, the trivial default versions will be used + virtual void SetEnhMetafile(const wxEnhMetaFile& metafile) + { m_metafile = metafile; } + virtual wxEnhMetaFile GetEnhMetafile() const + { return m_metafile; } + + // implement base class pure virtuals + virtual size_t GetDataSize() const; + virtual bool GetDataHere(void *buf) const; + virtual bool SetData(size_t len, const void *buf); + + virtual size_t GetDataSize(const wxDataFormat& WXUNUSED(format)) const + { return GetDataSize(); } + virtual bool GetDataHere(const wxDataFormat& WXUNUSED(format), + void *buf) const + { return GetDataHere(buf); } + virtual bool SetData(const wxDataFormat& WXUNUSED(format), + size_t len, const void *buf) + { return SetData(len, buf); } + +protected: + wxEnhMetaFile m_metafile; + + DECLARE_NO_COPY_CLASS(wxEnhMetaFileSimpleDataObject) +}; + +#endif // wxUSE_DRAG_AND_DROP + +#endif // _WX_MSW_ENHMETA_H_ diff --git a/Externals/wxWidgets/include/wx/msw/evtloop.h b/Externals/wxWidgets/include/wx/msw/evtloop.h new file mode 100644 index 0000000000..d6f4312ac3 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/evtloop.h @@ -0,0 +1,69 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/evtloop.h +// Purpose: wxEventLoop class for MSW +// Author: Vadim Zeitlin +// Modified by: +// Created: 2004-07-31 +// RCS-ID: $Id: evtloop.h 36881 2006-01-15 10:13:40Z ABX $ +// Copyright: (c) 2003-2004 Vadim Zeitlin <vadim@wxwindows.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MSW_EVTLOOP_H_ +#define _WX_MSW_EVTLOOP_H_ + +#include "wx/window.h" + +// ---------------------------------------------------------------------------- +// wxEventLoop +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxEventLoop : public wxEventLoopManual +{ +public: + wxEventLoop(); + + // implement base class pure virtuals + virtual bool Pending() const; + virtual bool Dispatch(); + + // MSW-specific methods + // -------------------- + + // preprocess a message, return true if processed (i.e. no further + // dispatching required) + virtual bool PreProcessMessage(WXMSG *msg); + + // process a single message + virtual void ProcessMessage(WXMSG *msg); + + // set the critical window: this is the window such that all the events + // except those to this window (and its children) stop to be processed + // (typical examples: assert or crash report dialog) + // + // calling this function with NULL argument restores the normal event + // handling + static void SetCriticalWindow(wxWindowMSW *win) { ms_winCritical = win; } + + // return true if there is no critical window or if this window is [a child + // of] the critical one + static bool AllowProcessing(wxWindowMSW *win) + { + return !ms_winCritical || IsChildOfCriticalWindow(win); + } + +protected: + // override/implement base class virtuals + virtual void WakeUp(); + virtual void OnNextIteration(); + + // check if the given window is a child of ms_winCritical (which must be + // non NULL) + static bool IsChildOfCriticalWindow(wxWindowMSW *win); + + + // critical window or NULL + static wxWindowMSW *ms_winCritical; +}; + +#endif // _WX_MSW_EVTLOOP_H_ diff --git a/Externals/wxWidgets/include/wx/msw/fdrepdlg.h b/Externals/wxWidgets/include/wx/msw/fdrepdlg.h new file mode 100644 index 0000000000..1e534ae85d --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/fdrepdlg.h @@ -0,0 +1,62 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/fdrepdlg.h +// Purpose: wxFindReplaceDialog class +// Author: Markus Greither +// Modified by: 31.07.01: VZ: integrated into wxWidgets +// Created: 23/03/2001 +// RCS-ID: +// Copyright: (c) Markus Greither +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MSW_FDREPDLG_H_ +#define _WX_MSW_FDREPDLG_H_ + +// ---------------------------------------------------------------------------- +// wxFindReplaceDialog: dialog for searching / replacing text +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxFindReplaceDialog : public wxFindReplaceDialogBase +{ +public: + // ctors and such + wxFindReplaceDialog() { Init(); } + wxFindReplaceDialog(wxWindow *parent, + wxFindReplaceData *data, + const wxString &title, + int style = 0); + + bool Create(wxWindow *parent, + wxFindReplaceData *data, + const wxString &title, + int style = 0); + + virtual ~wxFindReplaceDialog(); + + // implementation only from now on + + wxFindReplaceDialogImpl *GetImpl() const { return m_impl; } + + // override some base class virtuals + virtual bool Show(bool show = true); + virtual void SetTitle( const wxString& title); + virtual wxString GetTitle() const; + +protected: + virtual void DoGetSize(int *width, int *height) const; + virtual void DoGetClientSize(int *width, int *height) const; + virtual void DoSetSize(int x, int y, + int width, int height, + int sizeFlags = wxSIZE_AUTO); + + void Init(); + + wxString m_title; + + wxFindReplaceDialogImpl *m_impl; + + DECLARE_DYNAMIC_CLASS(wxFindReplaceDialog) + DECLARE_NO_COPY_CLASS(wxFindReplaceDialog) +}; + +#endif // _WX_MSW_FDREPDLG_H_ diff --git a/Externals/wxWidgets/include/wx/msw/file1.ico b/Externals/wxWidgets/include/wx/msw/file1.ico new file mode 100644 index 0000000000..f0a80d32b4 Binary files /dev/null and b/Externals/wxWidgets/include/wx/msw/file1.ico differ diff --git a/Externals/wxWidgets/include/wx/msw/filedlg.h b/Externals/wxWidgets/include/wx/msw/filedlg.h new file mode 100644 index 0000000000..4608a2ed94 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/filedlg.h @@ -0,0 +1,55 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/filedlg.h +// Purpose: wxFileDialog class +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: filedlg.h 39402 2006-05-28 23:32:12Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_FILEDLG_H_ +#define _WX_FILEDLG_H_ + +//------------------------------------------------------------------------- +// wxFileDialog +//------------------------------------------------------------------------- + +class WXDLLEXPORT wxFileDialog: public wxFileDialogBase +{ +public: + wxFileDialog(wxWindow *parent, + const wxString& message = wxFileSelectorPromptStr, + const wxString& defaultDir = wxEmptyString, + const wxString& defaultFile = wxEmptyString, + const wxString& wildCard = wxFileSelectorDefaultWildcardStr, + long style = wxFD_DEFAULT_STYLE, + const wxPoint& pos = wxDefaultPosition, + const wxSize& sz = wxDefaultSize, + const wxString& name = wxFileDialogNameStr); + + virtual void SetPath(const wxString& path); + virtual void GetPaths(wxArrayString& paths) const; + virtual void GetFilenames(wxArrayString& files) const; + + virtual int ShowModal(); + +protected: + +#if !(defined(__SMARTPHONE__) && defined(__WXWINCE__)) + virtual void DoMoveWindow(int x, int y, int width, int height); + virtual void DoGetSize( int *width, int *height ) const; + virtual void DoGetPosition( int *x, int *y ) const; +#endif // !(__SMARTPHONE__ && __WXWINCE__) + +private: + wxArrayString m_fileNames; + bool m_bMovedWindow; + + DECLARE_DYNAMIC_CLASS(wxFileDialog) + DECLARE_NO_COPY_CLASS(wxFileDialog) +}; + +#endif // _WX_FILEDLG_H_ + diff --git a/Externals/wxWidgets/include/wx/msw/floppy.ico b/Externals/wxWidgets/include/wx/msw/floppy.ico new file mode 100644 index 0000000000..4453a7512c Binary files /dev/null and b/Externals/wxWidgets/include/wx/msw/floppy.ico differ diff --git a/Externals/wxWidgets/include/wx/msw/folder1.ico b/Externals/wxWidgets/include/wx/msw/folder1.ico new file mode 100644 index 0000000000..2994019d4c Binary files /dev/null and b/Externals/wxWidgets/include/wx/msw/folder1.ico differ diff --git a/Externals/wxWidgets/include/wx/msw/folder2.ico b/Externals/wxWidgets/include/wx/msw/folder2.ico new file mode 100644 index 0000000000..9a595b9fea Binary files /dev/null and b/Externals/wxWidgets/include/wx/msw/folder2.ico differ diff --git a/Externals/wxWidgets/include/wx/msw/font.h b/Externals/wxWidgets/include/wx/msw/font.h new file mode 100644 index 0000000000..925355dfb0 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/font.h @@ -0,0 +1,148 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/font.h +// Purpose: wxFont class +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: font.h 39411 2006-05-29 00:03:36Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_FONT_H_ +#define _WX_FONT_H_ + +#include "wx/gdicmn.h" + +// ---------------------------------------------------------------------------- +// wxFont +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxFont : public wxFontBase +{ +public: + // ctors and such + wxFont() { } + + wxFont(int size, + int family, + int style, + int weight, + bool underlined = false, + const wxString& face = wxEmptyString, + wxFontEncoding encoding = wxFONTENCODING_DEFAULT) + { + (void)Create(size, family, style, weight, underlined, face, encoding); + } + + wxFont(const wxSize& pixelSize, + int family, + int style, + int weight, + bool underlined = false, + const wxString& face = wxEmptyString, + wxFontEncoding encoding = wxFONTENCODING_DEFAULT) + { + (void)Create(pixelSize, family, style, weight, + underlined, face, encoding); + } + + wxFont(const wxNativeFontInfo& info, WXHFONT hFont = 0) + { + Create(info, hFont); + } + + wxFont(const wxString& fontDesc); + + bool Create(int size, + int family, + int style, + int weight, + bool underlined = false, + const wxString& face = wxEmptyString, + wxFontEncoding encoding = wxFONTENCODING_DEFAULT) + { + return DoCreate(size, wxDefaultSize, false, family, style, + weight, underlined, face, encoding); + } + + bool Create(const wxSize& pixelSize, + int family, + int style, + int weight, + bool underlined = false, + const wxString& face = wxEmptyString, + wxFontEncoding encoding = wxFONTENCODING_DEFAULT) + { + return DoCreate(-1, pixelSize, true, family, style, + weight, underlined, face, encoding); + } + + bool Create(const wxNativeFontInfo& info, WXHFONT hFont = 0); + + virtual ~wxFont(); + + // wxFontBase overridden functions + virtual wxString GetNativeFontInfoDesc() const; + virtual wxString GetNativeFontInfoUserDesc() const; + + // implement base class pure virtuals + virtual int GetPointSize() const; + virtual wxSize GetPixelSize() const; + virtual bool IsUsingSizeInPixels() const; + virtual int GetFamily() const; + virtual int GetStyle() const; + virtual int GetWeight() const; + virtual bool GetUnderlined() const; + virtual wxString GetFaceName() const; + virtual wxFontEncoding GetEncoding() const; + virtual const wxNativeFontInfo *GetNativeFontInfo() const; + + virtual void SetPointSize(int pointSize); + virtual void SetPixelSize(const wxSize& pixelSize); + virtual void SetFamily(int family); + virtual void SetStyle(int style); + virtual void SetWeight(int weight); + virtual bool SetFaceName(const wxString& faceName); + virtual void SetUnderlined(bool underlined); + virtual void SetEncoding(wxFontEncoding encoding); + + virtual bool IsFixedWidth() const; + + // implementation only from now on + // ------------------------------- + + virtual bool IsFree() const; + virtual bool RealizeResource(); + virtual WXHANDLE GetResourceHandle() const; + virtual bool FreeResource(bool force = false); + + // for consistency with other wxMSW classes + WXHFONT GetHFONT() const; + + /* + virtual bool UseResource(); + virtual bool ReleaseResource(); + */ + +protected: + // real font creation function, used in all cases + bool DoCreate(int size, + const wxSize& pixelSize, + bool sizeUsingPixels, + int family, + int style, + int weight, + bool underlined = false, + const wxString& face = wxEmptyString, + wxFontEncoding encoding = wxFONTENCODING_DEFAULT); + + virtual void DoSetNativeFontInfo(const wxNativeFontInfo& info); + + void Unshare(); + +private: + DECLARE_DYNAMIC_CLASS(wxFont) +}; + +#endif // _WX_FONT_H_ diff --git a/Externals/wxWidgets/include/wx/msw/fontdlg.h b/Externals/wxWidgets/include/wx/msw/fontdlg.h new file mode 100644 index 0000000000..f3c3562d33 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/fontdlg.h @@ -0,0 +1,46 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/fontdlg.h +// Purpose: wxFontDialog class +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: fontdlg.h 38448 2006-03-30 14:04:17Z ABX $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MSW_FONTDLG_H_ +#define _WX_MSW_FONTDLG_H_ + +// ---------------------------------------------------------------------------- +// wxFontDialog +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxFontDialog : public wxFontDialogBase +{ +public: + wxFontDialog() : wxFontDialogBase() { /* must be Create()d later */ } + wxFontDialog(wxWindow *parent) + : wxFontDialogBase(parent) { Create(parent); } + wxFontDialog(wxWindow *parent, const wxFontData& data) + : wxFontDialogBase(parent, data) { Create(parent, data); } + + virtual int ShowModal(); + +#if WXWIN_COMPATIBILITY_2_6 + // deprecated interface, don't use + wxDEPRECATED( wxFontDialog(wxWindow *parent, const wxFontData *data) ); +#endif // WXWIN_COMPATIBILITY_2_6 + +protected: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxFontDialog) +}; + +#if WXWIN_COMPATIBILITY_2_6 + // deprecated interface, don't use +inline wxFontDialog::wxFontDialog(wxWindow *parent, const wxFontData *data) + : wxFontDialogBase(parent) { InitFontData(data); Create(parent); } +#endif // WXWIN_COMPATIBILITY_2_6 + +#endif + // _WX_MSW_FONTDLG_H_ diff --git a/Externals/wxWidgets/include/wx/msw/fontenum.h b/Externals/wxWidgets/include/wx/msw/fontenum.h new file mode 100644 index 0000000000..797c58b999 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/fontenum.h @@ -0,0 +1,40 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/fontenum.h +// Purpose: wxFontEnumerator class for Windows +// Author: Julian Smart +// Modified by: +// Created: 04/01/98 +// RCS-ID: $Id: fontenum.h 39461 2006-05-29 21:12:51Z ABX $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_FONTENUM_MSW_H_ +#define _WX_FONTENUM_MSW_H_ + +/* + * wxFontEnumerator: for gathering font information + */ + +class wxFontEnumerator: public wxObject +{ +DECLARE_CLASS(wxFontEnumerator) +public: + wxFontEnumerator() {} + + // Enumerate the fonts. + bool Enumerate(); + + // Stop enumeration if false is returned. + // By default, the enumerator stores the facenames in a list for + // retrieval via GetFacenames(). + virtual bool OnFont(const wxFont& font); + + // Return the list of facenames. + wxStringList& GetFacenames() { return (wxStringList&) m_faceNames; } +protected: + wxStringList m_faceNames; +}; + +#endif + // _WX_FONTENUM_MSW_H_ diff --git a/Externals/wxWidgets/include/wx/msw/frame.h b/Externals/wxWidgets/include/wx/msw/frame.h new file mode 100644 index 0000000000..dc3a58be51 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/frame.h @@ -0,0 +1,172 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/frame.h +// Purpose: wxFrame class +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: frame.h 45498 2007-04-16 13:03:05Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_FRAME_H_ +#define _WX_FRAME_H_ + +class WXDLLEXPORT wxFrame : public wxFrameBase +{ +public: + // construction + wxFrame() { Init(); } + wxFrame(wxWindow *parent, + wxWindowID id, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDEFAULT_FRAME_STYLE, + const wxString& name = wxFrameNameStr) + { + Init(); + + Create(parent, id, title, pos, size, style, name); + } + + bool Create(wxWindow *parent, + wxWindowID id, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDEFAULT_FRAME_STYLE, + const wxString& name = wxFrameNameStr); + + virtual ~wxFrame(); + + // implement base class pure virtuals + virtual bool ShowFullScreen(bool show, long style = wxFULLSCREEN_ALL); + virtual void Raise(); + + // implementation only from now on + // ------------------------------- + + // event handlers + void OnSysColourChanged(wxSysColourChangedEvent& event); + + // Toolbar +#if wxUSE_TOOLBAR + virtual wxToolBar* CreateToolBar(long style = -1, + wxWindowID id = wxID_ANY, + const wxString& name = wxToolBarNameStr); +#endif // wxUSE_TOOLBAR + + // Status bar +#if wxUSE_STATUSBAR + virtual wxStatusBar* OnCreateStatusBar(int number = 1, + long style = wxST_SIZEGRIP, + wxWindowID id = 0, + const wxString& name = wxStatusLineNameStr); + + // Hint to tell framework which status bar to use: the default is to use + // native one for the platforms which support it (Win32), the generic one + // otherwise + + // TODO: should this go into a wxFrameworkSettings class perhaps? + static void UseNativeStatusBar(bool useNative) + { m_useNativeStatusBar = useNative; } + static bool UsesNativeStatusBar() + { return m_useNativeStatusBar; } +#endif // wxUSE_STATUSBAR + +#if wxUSE_MENUS + WXHMENU GetWinMenu() const { return m_hMenu; } +#endif // wxUSE_MENUS + + // event handlers + bool HandlePaint(); + bool HandleSize(int x, int y, WXUINT flag); + bool HandleCommand(WXWORD id, WXWORD cmd, WXHWND control); + bool HandleMenuSelect(WXWORD nItem, WXWORD nFlags, WXHMENU hMenu); + bool HandleMenuLoop(const wxEventType& evtType, WXWORD isPopup); + + // tooltip management +#if wxUSE_TOOLTIPS + WXHWND GetToolTipCtrl() const { return m_hwndToolTip; } + void SetToolTipCtrl(WXHWND hwndTT) { m_hwndToolTip = hwndTT; } +#endif // tooltips + + // a MSW only function which sends a size event to the window using its + // current size - this has an effect of refreshing the window layout + virtual void SendSizeEvent(); + + virtual wxPoint GetClientAreaOrigin() const; + + // override base class version to add menu bar accel processing + virtual bool MSWTranslateMessage(WXMSG *msg) + { + return MSWDoTranslateMessage(this, msg); + } + + // window proc for the frames + virtual WXLRESULT MSWWindowProc(WXUINT message, + WXWPARAM wParam, + WXLPARAM lParam); + +protected: + // common part of all ctors + void Init(); + + // override base class virtuals + virtual void DoGetClientSize(int *width, int *height) const; + virtual void DoSetClientSize(int width, int height); + +#if wxUSE_MENUS_NATIVE + // perform MSW-specific action when menubar is changed + virtual void AttachMenuBar(wxMenuBar *menubar); + + // a plug in for MDI frame classes which need to do something special when + // the menubar is set + virtual void InternalSetMenuBar(); +#endif // wxUSE_MENUS_NATIVE + + // propagate our state change to all child frames + void IconizeChildFrames(bool bIconize); + + // the real implementation of MSWTranslateMessage(), also used by + // wxMDIChildFrame + bool MSWDoTranslateMessage(wxFrame *frame, WXMSG *msg); + + // handle WM_INITMENUPOPUP message to generate wxEVT_MENU_OPEN + bool HandleInitMenuPopup(WXHMENU hMenu); + + virtual bool IsMDIChild() const { return false; } + + // get default (wxWidgets) icon for the frame + virtual WXHICON GetDefaultIcon() const; + +#if wxUSE_TOOLBAR + virtual void PositionToolBar(); +#endif // wxUSE_TOOLBAR + +#if wxUSE_STATUSBAR + virtual void PositionStatusBar(); + + static bool m_useNativeStatusBar; +#endif // wxUSE_STATUSBAR + +#if wxUSE_MENUS + // frame menu, NULL if none + WXHMENU m_hMenu; +#endif // wxUSE_MENUS + +private: +#if wxUSE_TOOLTIPS + WXHWND m_hwndToolTip; +#endif // tooltips + + // used by IconizeChildFrames(), see comments there + bool m_wasMinimized; + + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS_NO_COPY(wxFrame) +}; + +#endif + // _WX_FRAME_H_ diff --git a/Externals/wxWidgets/include/wx/msw/gauge95.h b/Externals/wxWidgets/include/wx/msw/gauge95.h new file mode 100644 index 0000000000..edc0bfb50b --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/gauge95.h @@ -0,0 +1,70 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: gauge95.h +// Purpose: wxGauge95 class +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: gauge95.h 43881 2006-12-09 19:48:21Z PC $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _GAUGE95_H_ +#define _GAUGE95_H_ + +#if wxUSE_GAUGE + +extern WXDLLEXPORT_DATA(const wxChar) wxGaugeNameStr[]; + +// Group box +class WXDLLEXPORT wxGauge95 : public wxGaugeBase +{ +public: + wxGauge95() { } + + wxGauge95(wxWindow *parent, + wxWindowID id, + int range, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxGA_HORIZONTAL, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxGaugeNameStr) + { + (void)Create(parent, id, range, pos, size, style, validator, name); + } + + bool Create(wxWindow *parent, + wxWindowID id, + int range, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxGA_HORIZONTAL, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxGaugeNameStr); + + // set gauge range/value + virtual void SetRange(int range); + virtual void SetValue(int pos); + + // overriden base class virtuals + virtual bool SetForegroundColour(const wxColour& col); + virtual bool SetBackgroundColour(const wxColour& col); + + + void SetIndeterminateMode(); + void SetDeterminateMode(); + void Pulse(); + + WXDWORD MSWGetStyle(long style, WXDWORD *exstyle) const; + +protected: + virtual wxSize DoGetBestSize() const; + + DECLARE_DYNAMIC_CLASS_NO_COPY(wxGauge95) +}; + +#endif // wxUSE_GAUGE + +#endif + // _GAUGEMSW_H_ diff --git a/Externals/wxWidgets/include/wx/msw/gccpriv.h b/Externals/wxWidgets/include/wx/msw/gccpriv.h new file mode 100644 index 0000000000..f2d40f293c --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/gccpriv.h @@ -0,0 +1,127 @@ +/* + Name: wx/msw/gccpriv.h + Purpose: MinGW/Cygwin definitions + Author: Vadim Zeitlin + Modified by: + Created: + RCS-ID: $Id: gccpriv.h 36155 2005-11-10 16:16:05Z ABX $ + Copyright: (c) Vadim Zeitlin + Licence: wxWindows Licence +*/ + +/* THIS IS A C FILE, DON'T USE C++ FEATURES (IN PARTICULAR COMMENTS) IN IT */ + +#ifndef _WX_MSW_GCCPRIV_H_ +#define _WX_MSW_GCCPRIV_H_ + +#if defined(__MINGW32__) && !defined(__GNUWIN32__) + #define __GNUWIN32__ +#endif + +#if defined(__MINGW32__) && ( ( __GNUC__ > 2 ) || ( ( __GNUC__ == 2 ) && ( __GNUC_MINOR__ >= 95 ) ) ) + #include <_mingw.h> +#endif + +#if defined( __MINGW32__ ) && !defined(__WINE__) && !defined( HAVE_W32API_H ) + #if __MINGW32_MAJOR_VERSION >= 1 + #define HAVE_W32API_H + #endif +#elif defined( __CYGWIN__ ) && !defined( HAVE_W32API_H ) + #if ( __GNUC__ > 2 ) + #define HAVE_W32API_H + #endif +#endif + +#if wxCHECK_WATCOM_VERSION(1,0) + #define HAVE_W32API_H +#endif + +/* check for MinGW/Cygwin w32api version ( releases >= 0.5, only ) */ +#if defined( HAVE_W32API_H ) +#include <w32api.h> +#endif + +/* Watcom can't handle defined(xxx) here: */ +#if defined(__W32API_MAJOR_VERSION) && defined(__W32API_MINOR_VERSION) + #define wxCHECK_W32API_VERSION( major, minor ) \ + ( ( ( __W32API_MAJOR_VERSION > (major) ) \ + || ( __W32API_MAJOR_VERSION == (major) && __W32API_MINOR_VERSION >= (minor) ) ) ) +#else + #define wxCHECK_W32API_VERSION( major, minor ) (0) +#endif + +/* Cygwin / Mingw32 with gcc >= 2.95 use new windows headers which + are more ms-like (header author is Anders Norlander, hence the name) */ +#if (defined(__MINGW32__) || defined(__CYGWIN__) || defined(__WINE__)) && ((__GNUC__>2) || ((__GNUC__==2) && (__GNUC_MINOR__>=95))) + #ifndef wxUSE_NORLANDER_HEADERS + #define wxUSE_NORLANDER_HEADERS 1 + #endif +#else + #ifndef wxUSE_NORLANDER_HEADERS + #define wxUSE_NORLANDER_HEADERS 0 + #endif +#endif + +/* "old" GNUWIN32 is the one without Norlander's headers: it lacks the + standard Win32 headers and we define the used stuff ourselves for it + in wx/msw/gnuwin32/extra.h */ +#if defined(__GNUC__) && !wxUSE_NORLANDER_HEADERS + #define __GNUWIN32_OLD__ +#endif + +/* Cygwin 1.0 */ +#if defined(__CYGWIN__) && ((__GNUC__==2) && (__GNUC_MINOR__==9)) + #define __CYGWIN10__ +#endif + +/* Check for Mingw runtime version: */ +#if defined(__MINGW32_MAJOR_VERSION) && defined(__MINGW32_MINOR_VERSION) + #define wxCHECK_MINGW32_VERSION( major, minor ) \ + ( ( ( __MINGW32_MAJOR_VERSION > (major) ) \ + || ( __MINGW32_MAJOR_VERSION == (major) && __MINGW32_MINOR_VERSION >= (minor) ) ) ) +#else + #define wxCHECK_MINGW32_VERSION( major, minor ) (0) +#endif + +/* Mingw runtime 1.0-20010604 has some missing _tXXXX functions, + so let's define them ourselves: */ +#if defined(__GNUWIN32__) && wxCHECK_W32API_VERSION( 1, 0 ) \ + && !wxCHECK_W32API_VERSION( 1, 1 ) + #ifndef _tsetlocale + #if wxUSE_UNICODE + #define _tsetlocale _wsetlocale + #else + #define _tsetlocale setlocale + #endif + #endif + #ifndef _tgetenv + #if wxUSE_UNICODE + #define _tgetenv _wgetenv + #else + #define _tgetenv getenv + #endif + #endif + #ifndef _tfopen + #if wxUSE_UNICODE + #define _tfopen _wfopen + #else + #define _tfopen fopen + #endif + #endif +#endif + +/* current (= before mingw-runtime 3.3) mingw32 headers forget to + define _puttchar, this will probably be fixed in the next versions but + for now do it ourselves + */ +#if defined( __MINGW32__ ) && \ + !wxCHECK_MINGW32_VERSION(3,3) && !defined( _puttchar ) + #ifdef wxUSE_UNICODE + #define _puttchar putwchar + #else + #define _puttchar puttchar + #endif +#endif + +#endif + /* _WX_MSW_GCCPRIV_H_ */ diff --git a/Externals/wxWidgets/include/wx/msw/gdiimage.h b/Externals/wxWidgets/include/wx/msw/gdiimage.h new file mode 100644 index 0000000000..5cf494351e --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/gdiimage.h @@ -0,0 +1,189 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: include/wx/msw/gdiimage.h +// Purpose: wxGDIImage class: base class for wxBitmap, wxIcon, wxCursor +// under MSW +// Author: Vadim Zeitlin +// Modified by: +// Created: 20.11.99 +// RCS-ID: $Id: gdiimage.h 41751 2006-10-08 21:56:55Z VZ $ +// Copyright: (c) 1999 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// NB: this is a private header, it is not intended to be directly included by +// user code (but may be included from other, public, wxWin headers + +#ifndef _WX_MSW_GDIIMAGE_H_ +#define _WX_MSW_GDIIMAGE_H_ + +#include "wx/gdiobj.h" // base class +#include "wx/gdicmn.h" // wxBITMAP_TYPE_INVALID +#include "wx/list.h" + +class WXDLLEXPORT wxGDIImageRefData; +class WXDLLEXPORT wxGDIImageHandler; +class WXDLLEXPORT wxGDIImage; + +WX_DECLARE_EXPORTED_LIST(wxGDIImageHandler, wxGDIImageHandlerList); + +// ---------------------------------------------------------------------------- +// wxGDIImageRefData: common data fields for all derived classes +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxGDIImageRefData : public wxGDIRefData +{ +public: + wxGDIImageRefData() + { + m_width = m_height = m_depth = 0; + + m_handle = 0; + } + + wxGDIImageRefData(const wxGDIImageRefData& data) : wxGDIRefData(data) + { + m_width = data.m_width; + m_height = data.m_height; + m_depth = data.m_depth; + + // can't copy handles like this, derived class copy ctor must do it! + m_handle = NULL; + } + + // accessors + bool IsOk() const { return m_handle != 0; } + + void SetSize(int w, int h) { m_width = w; m_height = h; } + + // free the ressources we allocated + virtual void Free() = 0; + + // for compatibility, the member fields are public + + // the size of the image + int m_width, m_height; + + // the depth of the image + int m_depth; + + // the handle to it + union + { + WXHANDLE m_handle; // for untyped access + WXHBITMAP m_hBitmap; + WXHICON m_hIcon; + WXHCURSOR m_hCursor; + }; +}; + +// ---------------------------------------------------------------------------- +// wxGDIImageHandler: a class which knows how to load/save wxGDIImages. +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxGDIImageHandler : public wxObject +{ +public: + // ctor + wxGDIImageHandler() { m_type = wxBITMAP_TYPE_INVALID; } + wxGDIImageHandler(const wxString& name, + const wxString& ext, + long type) + : m_name(name), m_extension(ext) + { + m_type = type; + } + + // accessors + void SetName(const wxString& name) { m_name = name; } + void SetExtension(const wxString& ext) { m_extension = ext; } + void SetType(long type) { m_type = type; } + + const wxString& GetName() const { return m_name; } + const wxString& GetExtension() const { return m_extension; } + long GetType() const { return m_type; } + + // real handler operations: to implement in derived classes + virtual bool Create(wxGDIImage *image, + const void* data, + long flags, + int width, int height, int depth = 1) = 0; + virtual bool Load(wxGDIImage *image, + const wxString& name, + long flags, + int desiredWidth, int desiredHeight) = 0; + virtual bool Save(wxGDIImage *image, + const wxString& name, + int type) = 0; + +protected: + wxString m_name; + wxString m_extension; + long m_type; +}; + +// ---------------------------------------------------------------------------- +// wxGDIImage: this class supports GDI image handlers which may be registered +// dynamically and will be used for loading/saving the images in the specified +// format. It also falls back to wxImage if no appropriate image is found. +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxGDIImage : public wxGDIObject +{ +public: + // handlers list interface + static wxGDIImageHandlerList& GetHandlers() { return ms_handlers; } + + static void AddHandler(wxGDIImageHandler *handler); + static void InsertHandler(wxGDIImageHandler *handler); + static bool RemoveHandler(const wxString& name); + + static wxGDIImageHandler *FindHandler(const wxString& name); + static wxGDIImageHandler *FindHandler(const wxString& extension, long type); + static wxGDIImageHandler *FindHandler(long type); + + static void InitStandardHandlers(); + static void CleanUpHandlers(); + + // access to the ref data casted to the right type + wxGDIImageRefData *GetGDIImageData() const + { return (wxGDIImageRefData *)m_refData; } + + // accessors + WXHANDLE GetHandle() const + { return IsNull() ? 0 : GetGDIImageData()->m_handle; } + void SetHandle(WXHANDLE handle) + { AllocExclusive(); GetGDIImageData()->m_handle = handle; } + + bool Ok() const { return IsOk(); } + bool IsOk() const { return GetHandle() != 0; } + + int GetWidth() const { return IsNull() ? 0 : GetGDIImageData()->m_width; } + int GetHeight() const { return IsNull() ? 0 : GetGDIImageData()->m_height; } + int GetDepth() const { return IsNull() ? 0 : GetGDIImageData()->m_depth; } + + void SetWidth(int w) { AllocExclusive(); GetGDIImageData()->m_width = w; } + void SetHeight(int h) { AllocExclusive(); GetGDIImageData()->m_height = h; } + void SetDepth(int d) { AllocExclusive(); GetGDIImageData()->m_depth = d; } + + void SetSize(int w, int h) + { + AllocExclusive(); + GetGDIImageData()->SetSize(w, h); + } + void SetSize(const wxSize& size) { SetSize(size.x, size.y); } + + // forward some of base class virtuals to wxGDIImageRefData + bool FreeResource(bool force = false); + virtual WXHANDLE GetResourceHandle() const; + +protected: + // create the data for the derived class here + virtual wxGDIImageRefData *CreateData() const = 0; + + // implement the wxObject method in terms of our, more specific, one + virtual wxObjectRefData *CreateRefData() const { return CreateData(); } + + static wxGDIImageHandlerList ms_handlers; +}; + +#endif // _WX_MSW_GDIIMAGE_H_ diff --git a/Externals/wxWidgets/include/wx/msw/genrcdefs.h b/Externals/wxWidgets/include/wx/msw/genrcdefs.h new file mode 100644 index 0000000000..d96634cfe6 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/genrcdefs.h @@ -0,0 +1,43 @@ +/* + * Name: wx/msw/genrcdefs.h + * Purpose: Emit preprocessor symbols into rcdefs.h for resource compiler + * Author: Mike Wetherell + * RCS-ID: $Id: genrcdefs.h 36133 2005-11-08 22:49:46Z MW $ + * Copyright: (c) 2005 Mike Wetherell + * Licence: wxWindows licence + */ + +#define EMIT(line) line + +EMIT(#ifndef _WX_RCDEFS_H) +EMIT(#define _WX_RCDEFS_H) + +#ifdef _MSC_FULL_VER +EMIT(#define WX_MSC_FULL_VER _MSC_FULL_VER) +#endif + +#ifdef _M_AMD64 +EMIT(#define WX_CPU_AMD64) +#endif + +#ifdef _M_ARM +EMIT(#define WX_CPU_ARM) +#endif + +#ifdef _M_IA64 +EMIT(#define WX_CPU_IA64) +#endif + +#if defined _M_IX86 || defined _X86_ +EMIT(#define WX_CPU_X86) +#endif + +#ifdef _M_PPC +EMIT(#define WX_CPU_PPC) +#endif + +#ifdef _M_SH +EMIT(#define WX_CPU_SH) +#endif + +EMIT(#endif) diff --git a/Externals/wxWidgets/include/wx/msw/glcanvas.h b/Externals/wxWidgets/include/wx/msw/glcanvas.h new file mode 100644 index 0000000000..2396360adf --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/glcanvas.h @@ -0,0 +1,128 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/glcanvas.h +// Purpose: wxGLCanvas, for using OpenGL with wxWidgets under Windows +// Author: Julian Smart +// Modified by: +// Created: 04/01/98 +// RCS-ID: $Id: glcanvas.h 43097 2006-11-06 00:57:46Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GLCANVAS_H_ +#define _WX_GLCANVAS_H_ + +#include "wx/palette.h" +#include "wx/scrolwin.h" + +#include "wx/msw/wrapwin.h" + +#include <GL/gl.h> + +class WXDLLIMPEXP_GL wxGLCanvas; /* forward reference */ + +class WXDLLIMPEXP_GL wxGLContext: public wxObject +{ +public: + wxGLContext(wxGLCanvas *win, const wxGLContext* other=NULL /* for sharing display lists */ ); + virtual ~wxGLContext(); + + void SetCurrent(const wxGLCanvas& win) const; + inline HGLRC GetGLRC() const { return m_glContext; } + +protected: + HGLRC m_glContext; + +private: + DECLARE_CLASS(wxGLContext) +}; + +class WXDLLIMPEXP_GL wxGLCanvas: public wxWindow +{ +public: + // This ctor is identical to the next, except for the fact that it + // doesn't create an implicit wxGLContext. + // The attribList parameter has been moved to avoid overload clashes. + wxGLCanvas(wxWindow *parent, wxWindowID id = wxID_ANY, + int* attribList = 0, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = 0, + const wxString& name = wxGLCanvasName, + const wxPalette& palette = wxNullPalette); + + wxGLCanvas(wxWindow *parent, wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = 0, + const wxString& name = wxGLCanvasName, int *attribList = 0, + const wxPalette& palette = wxNullPalette); + + wxGLCanvas(wxWindow *parent, + const wxGLContext *shared, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxGLCanvasName, + int *attribList = (int *) NULL, + const wxPalette& palette = wxNullPalette); + + wxGLCanvas(wxWindow *parent, + const wxGLCanvas *shared, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxGLCanvasName, + int *attribList = 0, + const wxPalette& palette = wxNullPalette); + + virtual ~wxGLCanvas(); + + // Replaces wxWindow::Create functionality, since + // we need to use a different window class + bool Create(wxWindow *parent, wxWindowID id, + const wxPoint& pos, const wxSize& size, + long style, const wxString& name); + + void SetCurrent(const wxGLContext& RC) const; + void SetCurrent(); + +#ifdef __WXUNIVERSAL__ + virtual bool SetCurrent(bool doit) { return wxWindow::SetCurrent(doit); }; +#endif + + void SetColour(const wxChar *colour); + + void SwapBuffers(); + + void OnSize(wxSizeEvent& event); + + void OnQueryNewPalette(wxQueryNewPaletteEvent& event); + + void OnPaletteChanged(wxPaletteChangedEvent& event); + + inline wxGLContext* GetContext() const { return m_glContext; } + + inline WXHDC GetHDC() const { return m_hDC; } + + void SetupPixelFormat(int *attribList = (int *) NULL); + + void SetupPalette(const wxPalette& palette); + + wxPalette CreateDefaultPalette(); + + inline wxPalette* GetPalette() const { return (wxPalette *) &m_palette; } + +protected: + wxGLContext* m_glContext; // this is typedef-ed ptr, in fact + wxPalette m_palette; + WXHDC m_hDC; + +private: + DECLARE_EVENT_TABLE() + DECLARE_CLASS(wxGLCanvas) +}; + +#endif + // _WX_GLCANVAS_H_ + diff --git a/Externals/wxWidgets/include/wx/msw/gsockmsw.h b/Externals/wxWidgets/include/wx/msw/gsockmsw.h new file mode 100644 index 0000000000..d030726922 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/gsockmsw.h @@ -0,0 +1,145 @@ +/* ------------------------------------------------------------------------- + * Project: GSocket (Generic Socket) for WX + * Name: gsockmsw.h + * Copyright: (c) Guilhem Lavaux + * Licence: wxWindows Licence + * Purpose: GSocket MSW header + * CVSID: $Id: gsockmsw.h 33948 2005-05-04 18:57:50Z JS $ + * ------------------------------------------------------------------------- + */ + +#ifndef __GSOCK_MSW_H +#define __GSOCK_MSW_H + +#ifndef __GSOCKET_STANDALONE__ +#include "wx/setup.h" +#endif + +#if wxUSE_SOCKETS || defined(__GSOCKET_STANDALONE__) + +#ifndef __GSOCKET_STANDALONE__ +#include "wx/gsocket.h" +#else +#include "gsocket.h" +#endif + +#include "wx/msw/wrapwin.h" + +#if defined(__CYGWIN__) + //CYGWIN gives annoying warning about runtime stuff if we don't do this +# define USE_SYS_TYPES_FD_SET +# include <sys/types.h> +#endif + +#if defined(__WXWINCE__) || defined(__CYGWIN__) +#include <winsock.h> +#endif + +class GSocketGUIFunctionsTableConcrete: public GSocketGUIFunctionsTable +{ +public: + virtual bool OnInit(); + virtual void OnExit(); + virtual bool CanUseEventLoop(); + virtual bool Init_Socket(GSocket *socket); + virtual void Destroy_Socket(GSocket *socket); + virtual void Enable_Events(GSocket *socket); + virtual void Disable_Events(GSocket *socket); +}; + +/* Definition of GSocket */ +class GSocket +{ +public: + GSocket(); + ~GSocket(); + bool IsOk() { return m_ok; } + void Close(); + void Shutdown(); + GSocketError SetLocal(GAddress *address); + GSocketError SetPeer(GAddress *address); + GAddress *GetLocal(); + GAddress *GetPeer(); + GSocketError SetServer(); + GSocket *WaitConnection(); + bool SetReusable(); + GSocketError Connect(GSocketStream stream); + GSocketError SetNonOriented(); + int Read(char *buffer, int size); + int Write(const char *buffer, int size); + GSocketEventFlags Select(GSocketEventFlags flags); + void SetNonBlocking(bool non_block); + void SetTimeout(unsigned long millis); + GSocketError WXDLLIMPEXP_NET GetError(); + void SetCallback(GSocketEventFlags flags, + GSocketCallback callback, char *cdata); + void UnsetCallback(GSocketEventFlags flags); + GSocketError GetSockOpt(int level, int optname, + void *optval, int *optlen); + GSocketError SetSockOpt(int level, int optname, + const void *optval, int optlen); +protected: + GSocketError Input_Timeout(); + GSocketError Output_Timeout(); + GSocketError Connect_Timeout(); + int Recv_Stream(char *buffer, int size); + int Recv_Dgram(char *buffer, int size); + int Send_Stream(const char *buffer, int size); + int Send_Dgram(const char *buffer, int size); + bool m_ok; + +/* TODO: Make these protected */ +public: + SOCKET m_fd; + GAddress *m_local; + GAddress *m_peer; + GSocketError m_error; + + /* Attributes */ + bool m_non_blocking; + bool m_server; + bool m_stream; + bool m_establishing; + bool m_reusable; + struct timeval m_timeout; + + /* Callbacks */ + GSocketEventFlags m_detected; + GSocketCallback m_cbacks[GSOCK_MAX_EVENT]; + char *m_data[GSOCK_MAX_EVENT]; + int m_msgnumber; +}; + +#ifdef __cplusplus +extern "C" { +#endif + +/* Definition of GAddress */ +struct _GAddress +{ + struct sockaddr *m_addr; + size_t m_len; + + GAddressType m_family; + int m_realfamily; + + GSocketError m_error; +}; + + +/* GAddress */ + +GSocketError _GAddress_translate_from(GAddress *address, + struct sockaddr *addr, int len); +GSocketError _GAddress_translate_to (GAddress *address, + struct sockaddr **addr, int *len); +GSocketError _GAddress_Init_INET(GAddress *address); +GSocketError _GAddress_Init_UNIX(GAddress *address); + +#ifdef __cplusplus +} +#endif + +#endif /* wxUSE_SOCKETS || defined(__GSOCKET_STANDALONE__) */ + +#endif /* __GSOCK_MSW_H */ diff --git a/Externals/wxWidgets/include/wx/msw/hand.cur b/Externals/wxWidgets/include/wx/msw/hand.cur new file mode 100644 index 0000000000..e5a1fe7c2f Binary files /dev/null and b/Externals/wxWidgets/include/wx/msw/hand.cur differ diff --git a/Externals/wxWidgets/include/wx/msw/helpbest.h b/Externals/wxWidgets/include/wx/msw/helpbest.h new file mode 100644 index 0000000000..2a9282dffb --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/helpbest.h @@ -0,0 +1,129 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/helpbest.h +// Purpose: Tries to load MS HTML Help, falls back to wxHTML upon failure +// Author: Mattia Barbon +// Modified by: +// Created: 02/04/2001 +// RCS-ID: $Id: helpbest.h 39440 2006-05-29 14:51:42Z VZ $ +// Copyright: (c) Mattia Barbon +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_HELPBEST_H_ +#define _WX_HELPBEST_H_ + +#if wxUSE_HELP && wxUSE_MS_HTML_HELP \ + && wxUSE_WXHTML_HELP && !defined(__WXUNIVERSAL__) + +#include "wx/helpbase.h" +#include "wx/html/helpfrm.h" // for wxHF_DEFAULT_STYLE + +class WXDLLIMPEXP_HTML wxBestHelpController: public wxHelpControllerBase +{ +public: + wxBestHelpController(wxWindow* parentWindow = NULL, + int style = wxHF_DEFAULT_STYLE) + : wxHelpControllerBase(parentWindow), + m_helpControllerType(wxUseNone), + m_helpController(NULL), + m_style(style) + { + } + + virtual ~wxBestHelpController() { delete m_helpController; } + + // Must call this to set the filename + virtual bool Initialize(const wxString& file); + virtual bool Initialize(const wxString& file, int WXUNUSED(server) ) { return Initialize( file ); } + + // If file is "", reloads file given in Initialize + virtual bool LoadFile(const wxString& file = wxEmptyString) + { + return m_helpController->LoadFile( GetValidFilename( file ) ); + } + + virtual bool DisplayContents() + { + return m_helpController->DisplayContents(); + } + + virtual bool DisplaySection(int sectionNo) + { + return m_helpController->DisplaySection( sectionNo ); + } + + virtual bool DisplaySection(const wxString& section) + { + return m_helpController->DisplaySection( section ); + } + + virtual bool DisplayBlock(long blockNo) + { + return m_helpController->DisplayBlock( blockNo ); + } + + virtual bool DisplayContextPopup(int contextId) + { + return m_helpController->DisplayContextPopup( contextId ); + } + + virtual bool DisplayTextPopup(const wxString& text, const wxPoint& pos) + { + return m_helpController->DisplayTextPopup( text, pos ); + } + + virtual bool KeywordSearch(const wxString& k, + wxHelpSearchMode mode = wxHELP_SEARCH_ALL) + { + return m_helpController->KeywordSearch( k, mode ); + } + + virtual bool Quit() + { + return m_helpController->Quit(); + } + + // Allows one to override the default settings for the help frame. + virtual void SetFrameParameters(const wxString& title, + const wxSize& size, + const wxPoint& pos = wxDefaultPosition, + bool newFrameEachTime = false) + { + m_helpController->SetFrameParameters( title, size, pos, + newFrameEachTime ); + } + + // Obtains the latest settings used by the help frame and the help frame. + virtual wxFrame *GetFrameParameters(wxSize *size = NULL, + wxPoint *pos = NULL, + bool *newFrameEachTime = NULL) + { + return m_helpController->GetFrameParameters( size, pos, + newFrameEachTime ); + } + + /// Set the window that can optionally be used for the help window's parent. + virtual void SetParentWindow(wxWindow* win) { m_helpController->SetParentWindow(win); } + + /// Get the window that can optionally be used for the help window's parent. + virtual wxWindow* GetParentWindow() const { return m_helpController->GetParentWindow(); } + +protected: + // Append/change extension if necessary. + wxString GetValidFilename(const wxString& file) const; + +protected: + enum HelpControllerType { wxUseNone, wxUseHtmlHelp, wxUseChmHelp }; + + HelpControllerType m_helpControllerType; + wxHelpControllerBase* m_helpController; + int m_style; + + DECLARE_DYNAMIC_CLASS(wxBestHelpController) + DECLARE_NO_COPY_CLASS(wxBestHelpController) +}; + +#endif // wxUSE_HELP && wxUSE_MS_HTML_HELP && wxUSE_WXHTML_HELP + +#endif + // _WX_HELPBEST_H_ diff --git a/Externals/wxWidgets/include/wx/msw/helpchm.h b/Externals/wxWidgets/include/wx/msw/helpchm.h new file mode 100644 index 0000000000..a6c3e84407 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/helpchm.h @@ -0,0 +1,60 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: helpchm.h +// Purpose: Help system: MS HTML Help implementation +// Author: Julian Smart +// Modified by: +// Created: 16/04/2000 +// RCS-ID: $Id: helpchm.h 39725 2006-06-14 17:46:51Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_HELPCHM_H_ +#define _WX_HELPCHM_H_ + +#if wxUSE_MS_HTML_HELP + +#include "wx/helpbase.h" + +class WXDLLEXPORT wxCHMHelpController : public wxHelpControllerBase +{ +public: + wxCHMHelpController(wxWindow* parentWindow = NULL): wxHelpControllerBase(parentWindow) { } + + // Must call this to set the filename + virtual bool Initialize(const wxString& file); + virtual bool Initialize(const wxString& file, int WXUNUSED(server) ) { return Initialize( file ); } + + // If file is "", reloads file given in Initialize + virtual bool LoadFile(const wxString& file = wxEmptyString); + virtual bool DisplayContents(); + virtual bool DisplaySection(int sectionNo); + virtual bool DisplaySection(const wxString& section); + virtual bool DisplayBlock(long blockNo); + virtual bool DisplayContextPopup(int contextId); + virtual bool DisplayTextPopup(const wxString& text, const wxPoint& pos); + virtual bool KeywordSearch(const wxString& k, + wxHelpSearchMode mode = wxHELP_SEARCH_ALL); + virtual bool Quit(); + + wxString GetHelpFile() const { return m_helpFile; } + + // helper of DisplayTextPopup(), also used in wxSimpleHelpProvider::ShowHelp + static bool ShowContextHelpPopup(const wxString& text, + const wxPoint& pos, + wxWindow *window); + +protected: + // Append extension if necessary. + wxString GetValidFilename(const wxString& file) const; + +protected: + wxString m_helpFile; + + DECLARE_CLASS(wxCHMHelpController) +}; + +#endif // wxUSE_MS_HTML_HELP + +#endif +// _WX_HELPCHM_H_ diff --git a/Externals/wxWidgets/include/wx/msw/helpwin.h b/Externals/wxWidgets/include/wx/msw/helpwin.h new file mode 100644 index 0000000000..e563c8e9cf --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/helpwin.h @@ -0,0 +1,56 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: helpwin.h +// Purpose: Help system: WinHelp implementation +// Author: Julian Smart +// Modified by: +// Created: 04/01/98 +// RCS-ID: $Id: helpwin.h 41020 2006-09-05 20:47:48Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_HELPWIN_H_ +#define _WX_HELPWIN_H_ + +#include "wx/wx.h" + +#if wxUSE_HELP + +#include "wx/helpbase.h" + +class WXDLLEXPORT wxWinHelpController: public wxHelpControllerBase +{ + DECLARE_CLASS(wxWinHelpController) + +public: + wxWinHelpController(wxWindow* parentWindow = NULL): wxHelpControllerBase(parentWindow) {} + virtual ~wxWinHelpController() {} + + // Must call this to set the filename + virtual bool Initialize(const wxString& file); + virtual bool Initialize(const wxString& file, int WXUNUSED(server) ) { return Initialize( file ); } + + // If file is "", reloads file given in Initialize + virtual bool LoadFile(const wxString& file = wxEmptyString); + virtual bool DisplayContents(); + virtual bool DisplaySection(int sectionNo); + virtual bool DisplaySection(const wxString& section) { return KeywordSearch(section); } + virtual bool DisplayBlock(long blockNo); + virtual bool DisplayContextPopup(int contextId); + virtual bool KeywordSearch(const wxString& k, + wxHelpSearchMode mode = wxHELP_SEARCH_ALL); + virtual bool Quit(); + + inline wxString GetHelpFile() const { return m_helpFile; } + +protected: + // Append extension if necessary. + wxString GetValidFilename(const wxString& file) const; + +private: + wxString m_helpFile; +}; + +#endif // wxUSE_HELP +#endif +// _WX_HELPWIN_H_ diff --git a/Externals/wxWidgets/include/wx/msw/htmlhelp.h b/Externals/wxWidgets/include/wx/msw/htmlhelp.h new file mode 100644 index 0000000000..960ee155c7 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/htmlhelp.h @@ -0,0 +1,465 @@ +/* + * wx/msw/htmlhelp.h + * Copyright 2004 Jacek Caban + * + * Originally written for the Wine project, and issued under + * the wxWindows License by kind permission of the author. + * + * License: wxWindows License + */ + +#ifndef __HTMLHELP_H__ +#define __HTMLHELP_H__ + +#define HH_DISPLAY_TOPIC 0x00 +#define HH_HELP_FINDER 0x00 +#define HH_DISPLAY_TOC 0x01 +#define HH_DISPLAY_INDEX 0x02 +#define HH_DISPLAY_SEARCH 0x03 +#define HH_SET_WIN_TYPE 0x04 +#define HH_GET_WIN_TYPE 0x05 +#define HH_GET_WIN_HANDLE 0x06 +#define HH_ENUM_INFO_TYPE 0x07 +#define HH_SET_INFO_TYPE 0x08 +#define HH_SYNC 0x09 +#define HH_RESERVED1 0x0A +#define HH_RESERVED2 0x0B +#define HH_RESERVED3 0x0C +#define HH_KEYWORD_LOOKUP 0x0D +#define HH_DISPLAY_TEXT_POPUP 0x0E +#define HH_HELP_CONTEXT 0x0F +#define HH_TP_HELP_CONTEXTMENU 0x10 +#define HH_TP_HELP_WM_HELP 0x11 +#define HH_CLOSE_ALL 0x12 +#define HH_ALINK_LOOKUP 0x13 +#define HH_GET_LAST_ERROR 0x14 +#define HH_ENUM_CATEGORY 0x15 +#define HH_ENUM_CATEGORY_IT 0x16 +#define HH_RESET_IT_FILTER 0x17 +#define HH_SET_INCLUSIVE_FILTER 0x18 +#define HH_SET_EXCLUSIVE_FILTER 0x19 +#define HH_INITIALIZE 0x1C +#define HH_UNINITIALIZE 0x1D +#define HH_PRETRANSLATEMESSAGE 0xFD +#define HH_SET_GLOBAL_PROPERTY 0xFC + +#define HHWIN_PROP_TAB_AUTOHIDESHOW 0x00000001 +#define HHWIN_PROP_ONTOP 0x00000002 +#define HHWIN_PROP_NOTITLEBAR 0x00000004 +#define HHWIN_PROP_NODEF_STYLES 0x00000008 +#define HHWIN_PROP_NODEF_EXSTYLES 0x00000010 +#define HHWIN_PROP_TRI_PANE 0x00000020 +#define HHWIN_PROP_NOTB_TEXT 0x00000040 +#define HHWIN_PROP_POST_QUIT 0x00000080 +#define HHWIN_PROP_AUTO_SYNC 0x00000100 +#define HHWIN_PROP_TRACKING 0x00000200 +#define HHWIN_PROP_TAB_SEARCH 0x00000400 +#define HHWIN_PROP_TAB_HISTORY 0x00000800 +#define HHWIN_PROP_TAB_FAVORITES 0x00001000 +#define HHWIN_PROP_CHANGE_TITLE 0x00002000 +#define HHWIN_PROP_NAV_ONLY_WIN 0x00004000 +#define HHWIN_PROP_NO_TOOLBAR 0x00008000 +#define HHWIN_PROP_MENU 0x00010000 +#define HHWIN_PROP_TAB_ADVSEARCH 0x00020000 +#define HHWIN_PROP_USER_POS 0x00040000 +#define HHWIN_PROP_TAB_CUSTOM1 0x00080000 +#define HHWIN_PROP_TAB_CUSTOM2 0x00100000 +#define HHWIN_PROP_TAB_CUSTOM3 0x00200000 +#define HHWIN_PROP_TAB_CUSTOM4 0x00400000 +#define HHWIN_PROP_TAB_CUSTOM5 0x00800000 +#define HHWIN_PROP_TAB_CUSTOM6 0x01000000 +#define HHWIN_PROP_TAB_CUSTOM7 0x02000000 +#define HHWIN_PROP_TAB_CUSTOM8 0x04000000 +#define HHWIN_PROP_TAB_CUSTOM9 0x08000000 +#define HHWIN_TB_MARGIN 0x10000000 + +#define HHWIN_PARAM_PROPERTIES 0x00000002 +#define HHWIN_PARAM_STYLES 0x00000004 +#define HHWIN_PARAM_EXSTYLES 0x00000008 +#define HHWIN_PARAM_RECT 0x00000010 +#define HHWIN_PARAM_NAV_WIDTH 0x00000020 +#define HHWIN_PARAM_SHOWSTATE 0x00000040 +#define HHWIN_PARAM_INFOTYPES 0x00000080 +#define HHWIN_PARAM_TB_FLAGS 0x00000100 +#define HHWIN_PARAM_EXPANSION 0x00000200 +#define HHWIN_PARAM_TABPOS 0x00000400 +#define HHWIN_PARAM_TABORDER 0x00000800 +#define HHWIN_PARAM_HISTORY_COUNT 0x00001000 +#define HHWIN_PARAM_CUR_TAB 0x00002000 + +#define HHWIN_BUTTON_EXPAND 0x00000002 +#define HHWIN_BUTTON_BACK 0x00000004 +#define HHWIN_BUTTON_FORWARD 0x00000008 +#define HHWIN_BUTTON_STOP 0x00000010 +#define HHWIN_BUTTON_REFRESH 0x00000020 +#define HHWIN_BUTTON_HOME 0x00000040 +#define HHWIN_BUTTON_BROWSE_FWD 0x00000080 +#define HHWIN_BUTTON_BROWSE_BCK 0x00000100 +#define HHWIN_BUTTON_NOTES 0x00000200 +#define HHWIN_BUTTON_CONTENTS 0x00000400 +#define HHWIN_BUTTON_SYNC 0x00000800 +#define HHWIN_BUTTON_OPTIONS 0x00001000 +#define HHWIN_BUTTON_PRINT 0x00002000 +#define HHWIN_BUTTON_INDEX 0x00004000 +#define HHWIN_BUTTON_SEARCH 0x00008000 +#define HHWIN_BUTTON_HISTORY 0x00010000 +#define HHWIN_BUTTON_FAVORITES 0x00020000 +#define HHWIN_BUTTON_JUMP1 0x00040000 +#define HHWIN_BUTTON_JUMP2 0x00080000 +#define HHWIN_BUTTON_ZOOM 0x00100000 +#define HHWIN_BUTTON_TOC_NEXT 0x00200000 +#define HHWIN_BUTTON_TOC_PREV 0x00400000 + +#define HHWIN_DEF_BUTTONS \ + (HHWIN_BUTTON_EXPAND | HHWIN_BUTTON_BACK | HHWIN_BUTTON_OPTIONS | HHWIN_BUTTON_PRINT) + +#define IDTB_EXPAND 200 +#define IDTB_CONTRACT 201 +#define IDTB_STOP 202 +#define IDTB_REFRESH 203 +#define IDTB_BACK 204 +#define IDTB_HOME 205 +#define IDTB_SYNC 206 +#define IDTB_PRINT 207 +#define IDTB_OPTIONS 208 +#define IDTB_FORWARD 209 +#define IDTB_NOTES 210 +#define IDTB_BROWSE_FWD 211 +#define IDTB_BROWSE_BACK 212 +#define IDTB_CONTENTS 213 +#define IDTB_INDEX 214 +#define IDTB_SEARCH 215 +#define IDTB_HISTORY 216 +#define IDTB_FAVORITES 217 +#define IDTB_JUMP1 218 +#define IDTB_JUMP2 219 +#define IDTB_CUSTOMIZE 221 +#define IDTB_ZOOM 222 +#define IDTB_TOC_NEXT 223 +#define IDTB_TOC_PREV 224 + +#define HHN_FIRST (0U-860U) +#define HHN_LAST (0U-879U) +#define HHN_NAVCOMPLETE HHN_FIRST +#define HHN_TRACK (HHN_FIRST-1) +#define HHN_WINDOW_CREATE (HHN_FIRST-2) + + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct tagHH_NOTIFY { + NMHDR hdr; + PCSTR pszurl; +} HH_NOTIFY; + +typedef struct tagHH_POPUPA { + int cbStruct; + HINSTANCE hinst; + UINT idString; + LPCSTR pszText; + POINT pt; + COLORREF clrForeground; + COLORREF clrBackground; + RECT rcMargins; + LPCSTR pszFont; +} HH_POPUPA; + +typedef struct tagHH_POPUPW { + int cbStruct; + HINSTANCE hinst; + UINT idString; + LPCWSTR pszText; + POINT pt; + COLORREF clrForeground; + COLORREF clrBackground; + RECT rcMargins; + LPCWSTR pszFont; +} HH_POPUPW; + +#ifdef _UNICODE +typedef HH_POPUPW HH_POPUP; +#else +typedef HH_POPUPA HH_POPUP; +#endif + +typedef struct tagHH_ALINKA { + int cbStruct; + BOOL fReserved; + LPCSTR pszKeywords; + LPCSTR pszUrl; + LPCSTR pszMsgText; + LPCSTR pszMsgTitle; + LPCSTR pszWindow; + BOOL fIndexOnFail; +} HH_ALINKA; + +typedef struct tagHH_ALINKW { + int cbStruct; + BOOL fReserved; + LPCWSTR pszKeywords; + LPCWSTR pszUrl; + LPCWSTR pszMsgText; + LPCWSTR pszMsgTitle; + LPCWSTR pszWindow; + BOOL fIndexOnFail; +} HH_ALINKW; + +#ifdef _UNICODE +typedef HH_ALINKW HH_ALINK; +typedef HH_ALINKW HH_AKLINK; +#else +typedef HH_ALINKA HH_ALINK; +typedef HH_ALINKA HH_AKLINK; +#endif + +enum { + HHWIN_NAVTYPE_TOC, + HHWIN_NAVTYPE_INDEX, + HHWIN_NAVTYPE_SEARCH, + HHWIN_NAVTYPE_FAVORITES, + HHWIN_NAVTYPE_HISTORY, + HHWIN_NAVTYPE_AUTHOR, + HHWIN_NAVTYPE_CUSTOM_FIRST = 11 +}; + +enum { + IT_INCLUSIVE, + IT_EXCLUSIVE, + IT_HIDDEN +}; + +typedef struct tagHH_ENUM_IT { + int cbStruct; + int iType; + LPCSTR pszCatName; + LPCSTR pszITName; + LPCSTR pszITDescription; +} HH_ENUM_IT, *PHH_ENUM_IT; + +typedef struct tagHH_ENUM_CAT { + int cbStruct; + LPCSTR pszCatName; + LPCSTR pszCatDescription; +} HH_ENUM_CAT, *PHH_ENUM_CAT; + +typedef struct tagHH_SET_INFOTYPE { + int cbStruct; + LPCSTR pszCatName; + LPCSTR pszInfoTypeName; +} HH_SET_INFOTYPE; + +typedef DWORD HH_INFOTYPE, *PHH_INFOTYPE; + +enum { + HHWIN_NAVTAB_TOP, + HHWIN_NAVTAB_LEFT, + HHWIN_NAVTAB_BOTTOM +}; + +#define HH_MAX_TABS 19 + +enum { + HH_TAB_CONTENTS, + HH_TAB_INDEX, + HH_TAB_SEARCH, + HH_TAB_FAVORITES, + HH_TAB_HISTORY, + HH_TAB_AUTHOR, + HH_TAB_CUSTOM_FIRST = 11, + HH_TAB_CUSTOM_LAST = HH_MAX_TABS +}; + +#define HH_MAX_TABS_CUSTOM (HH_TAB_CUSTOM_LAST-HH_TAB_CUSTOM_FIRST+1) +#define HH_FTS_DEFAULT_PROXIMITY -1 + +typedef struct tagHH_FTS_QUERYA { + int cbStruct; + BOOL fUniCodeStrings; + LPCSTR pszSearchQuery; + LONG iProximity; + BOOL fStemmedSearch; + BOOL fTitleOnly; + BOOL fExecute; + LPCSTR pszWindow; +} HH_FTS_QUERYA; + +typedef struct tagHH_FTS_QUERYW { + int cbStruct; + BOOL fUniCodeStrings; + LPCWSTR pszSearchQuery; + LONG iProximity; + BOOL fStemmedSearch; + BOOL fTitleOnly; + BOOL fExecute; + LPCWSTR pszWindow; +} HH_FTS_QUERYW; + +#ifdef _UNICODE +typedef HH_FTS_QUERYW HH_FTS_QUERY; +#else +typedef HH_FTS_QUERYA HH_FTS_QUERY; +#endif + +typedef struct tagHH_WINTYPEA { + int cbStruct; + BOOL fUniCodeStrings; + LPCSTR pszType; + DWORD fsValidMembers; + DWORD fsWinProperties; + LPCSTR pszCaption; + DWORD dwStyles; + DWORD dwExStyles; + RECT rcWindowPos; + int nShowState; + HWND hwndHelp; + HWND hwndCaller; + PHH_INFOTYPE paInfoTypes; + HWND hwndToolBar; + HWND hwndNavigation; + HWND hwndHTML; + int iNavWidth; + RECT rcHTML; + LPCSTR pszToc; + LPCSTR pszIndex; + LPCSTR pszFile; + LPCSTR pszHome; + DWORD fsToolBarFlags; + BOOL fNotExpanded; + int curNavType; + int tabpos; + int idNotify; + BYTE tabOrder[HH_MAX_TABS+1]; + int cHistory; + LPCSTR pszJump1; + LPCSTR pszJump2; + LPCSTR pszUrlJump1; + LPCSTR pszUrlJump2; + RECT rcMinSize; + int cbInfoTypes; + LPCSTR pszCustomTabs; +} HH_WINTYPEA, *PHH_WINTYPEA; + +typedef struct tagHH_WINTYPEW { + int cbStruct; + BOOL fUniCodeStrings; + LPCWSTR pszType; + DWORD fsValidMembers; + DWORD fsWinProperties; + LPCWSTR pszCaption; + DWORD dwStyles; + DWORD dwExStyles; + RECT rcWindowPos; + int nShowState; + HWND hwndHelp; + HWND hwndCaller; + PHH_INFOTYPE paInfoTypes; + HWND hwndToolBar; + HWND hwndNavigation; + HWND hwndHTML; + int iNavWidth; + RECT rcHTML; + LPCWSTR pszToc; + LPCWSTR pszIndex; + LPCWSTR pszFile; + LPCWSTR pszHome; + DWORD fsToolBarFlags; + BOOL fNotExpanded; + int curNavType; + int tabpos; + int idNotify; + BYTE tabOrder[HH_MAX_TABS+1]; + int cHistory; + LPCWSTR pszJump1; + LPCWSTR pszJump2; + LPCWSTR pszUrlJump1; + LPCWSTR pszUrlJump2; + RECT rcMinSize; + int cbInfoTypes; + LPCWSTR pszCustomTabs; +} HH_WINTYPEW, *PHH_WINTYPEW; + +#ifdef _UNICODE +typedef HH_WINTYPEW HH_WINTYPE; +#else +typedef HH_WINTYPEA HH_WINTYPE; +#endif + +enum { + HHACT_TAB_CONTENTS, + HHACT_TAB_INDEX, + HHACT_TAB_SEARCH, + HHACT_TAB_HISTORY, + HHACT_TAB_FAVORITES, + HHACT_EXPAND, + HHACT_CONTRACT, + HHACT_BACK, + HHACT_FORWARD, + HHACT_STOP, + HHACT_REFRESH, + HHACT_HOME, + HHACT_SYNC, + HHACT_OPTIONS, + HHACT_PRINT, + HHACT_HIGHLIGHT, + HHACT_CUSTOMIZE, + HHACT_JUMP1, + HHACT_JUMP2, + HHACT_ZOOM, + HHACT_TOC_NEXT, + HHACT_TOC_PREV, + HHACT_NOTES, + HHACT_LAST_ENUM +}; + +typedef struct tagHH_NTRACKA { + NMHDR hdr; + PCSTR pszCurUrl; + int idAction; + PHH_WINTYPEA phhWinType; +} HH_NTRACKA; + +typedef struct tagHH_NTRACKW { + NMHDR hdr; + PCSTR pszCurUrl; + int idAction; + PHH_WINTYPEW phhWinType; +} HH_NTRACKW; + +#ifdef _UNICODE +typedef HH_NTRACKW HH_NTRACK; +#else +typedef HH_NTRACKA HH_NTRACK; +#endif + +HWND WINAPI HtmlHelpA(HWND,LPCSTR,UINT,DWORD); +HWND WINAPI HtmlHelpA(HWND,LPCSTR,UINT,DWORD); +#define HtmlHelp WINELIB_NAME_AW(HtmlHelp) + +#define ATOM_HTMLHELP_API_ANSI (LPTSTR)14 +#define ATOM_HTMLHELP_API_UNICODE (LPTSTR)15 + +typedef enum tagHH_GPROPID { + HH_GPROPID_SINGLETHREAD = 1, + HH_GPROPID_TOOLBAR_MARGIN = 2, + HH_GPROPID_UI_LANGUAGE = 3, + HH_GPROPID_CURRENT_SUBSET = 4, + HH_GPROPID_CONTENT_LANGUAGE = 5 +} HH_GPROPID; + +#ifdef __WIDL_OAIDL_H + +typedef struct tagHH_GLOBAL_PROPERTY +{ + HH_GPROPID id; + VARIANT var; +} HH_GLOBAL_PROPERTY ; + +#endif /* __WIDL_OAIDL_H */ + +#ifdef __cplusplus +} +#endif + +#endif /* __HTMLHELP_H__ */ diff --git a/Externals/wxWidgets/include/wx/msw/ia64.manifest b/Externals/wxWidgets/include/wx/msw/ia64.manifest new file mode 100644 index 0000000000..4d00130f6d --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/ia64.manifest @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> +<assemblyIdentity + version="0.64.1.0" + processorArchitecture="IA64" + name="Controls" + type="win32" +/> +<description>wxWindows application</description> +<dependency> + <dependentAssembly> + <assemblyIdentity + type="win32" + name="Microsoft.Windows.Common-Controls" + version="6.0.0.0" + processorArchitecture="IA64" + publicKeyToken="6595b64144ccf1df" + language="*" + /> + </dependentAssembly> +</dependency> +</assembly> diff --git a/Externals/wxWidgets/include/wx/msw/icon.h b/Externals/wxWidgets/include/wx/msw/icon.h new file mode 100644 index 0000000000..d716a26a5a --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/icon.h @@ -0,0 +1,95 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/icon.h +// Purpose: wxIcon class +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: icon.h 42752 2006-10-30 19:26:48Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_ICON_H_ +#define _WX_ICON_H_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/msw/gdiimage.h" + +// --------------------------------------------------------------------------- +// icon data +// --------------------------------------------------------------------------- + +// notice that although wxIconRefData inherits from wxBitmapRefData, it is not +// a valid wxBitmapRefData +class WXDLLEXPORT wxIconRefData : public wxGDIImageRefData +{ +public: + wxIconRefData() { } + virtual ~wxIconRefData() { Free(); } + + virtual void Free(); +}; + +// --------------------------------------------------------------------------- +// Icon +// --------------------------------------------------------------------------- + +class WXDLLEXPORT wxIcon : public wxGDIImage +{ +public: + // ctors + // default + wxIcon() { } + + // from raw data + wxIcon(const char bits[], int width, int height); + + // from XPM data + wxIcon(const char **data) { CreateIconFromXpm(data); } + + wxIcon(char **data) { CreateIconFromXpm((const char **)data); } + + // from resource/file + wxIcon(const wxString& name, + long type = wxBITMAP_TYPE_ICO_RESOURCE, + int desiredWidth = -1, int desiredHeight = -1); + + wxIcon(const wxIconLocation& loc); + + virtual ~wxIcon(); + + virtual bool LoadFile(const wxString& name, + long type = wxBITMAP_TYPE_ICO_RESOURCE, + int desiredWidth = -1, int desiredHeight = -1); + + // implementation only from now on + wxIconRefData *GetIconData() const { return (wxIconRefData *)m_refData; } + + void SetHICON(WXHICON icon) { SetHandle((WXHANDLE)icon); } + WXHICON GetHICON() const { return (WXHICON)GetHandle(); } + + // create from bitmap (which should have a mask unless it's monochrome): + // there shouldn't be any implicit bitmap -> icon conversion (i.e. no + // ctors, assignment operators...), but it's ok to have such function + void CopyFromBitmap(const wxBitmap& bmp); + +protected: + virtual wxGDIImageRefData *CreateData() const + { + return new wxIconRefData; + } + + virtual wxObjectRefData *CloneRefData(const wxObjectRefData *data) const; + + // create from XPM data + void CreateIconFromXpm(const char **data); + +private: + DECLARE_DYNAMIC_CLASS(wxIcon) +}; + +#endif + // _WX_ICON_H_ diff --git a/Externals/wxWidgets/include/wx/msw/imaglist.h b/Externals/wxWidgets/include/wx/msw/imaglist.h new file mode 100644 index 0000000000..b31c73539d --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/imaglist.h @@ -0,0 +1,206 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/imaglist.h +// Purpose: wxImageList class +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: imaglist.h 41271 2006-09-18 04:41:09Z KO $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_IMAGLIST_H_ +#define _WX_IMAGLIST_H_ + +#include "wx/bitmap.h" + +// Eventually we'll make this a reference-counted wxGDIObject. For +// now, the app must take care of ownership issues. That is, the +// image lists must be explicitly deleted after the control(s) that uses them +// is (are) deleted, or when the app exits. +class WXDLLEXPORT wxImageList : public wxObject +{ +public: + /* + * Public interface + */ + + wxImageList(); + + // Creates an image list. + // Specify the width and height of the images in the list, + // whether there are masks associated with them (e.g. if creating images + // from icons), and the initial size of the list. + wxImageList(int width, int height, bool mask = true, int initialCount = 1) + { + Create(width, height, mask, initialCount); + } + virtual ~wxImageList(); + + + // Attributes + //////////////////////////////////////////////////////////////////////////// + + // Returns the number of images in the image list. + int GetImageCount() const; + + // Returns the size (same for all images) of the images in the list + bool GetSize(int index, int &width, int &height) const; + + // Operations + //////////////////////////////////////////////////////////////////////////// + + // Creates an image list + // width, height specify the size of the images in the list (all the same). + // mask specifies whether the images have masks or not. + // initialNumber is the initial number of images to reserve. + bool Create(int width, int height, bool mask = true, int initialNumber = 1); + + // Adds a bitmap, and optionally a mask bitmap. + // Note that wxImageList creates *new* bitmaps, so you may delete + // 'bitmap' and 'mask' after calling Add. + int Add(const wxBitmap& bitmap, const wxBitmap& mask = wxNullBitmap); + + // Adds a bitmap, using the specified colour to create the mask bitmap + // Note that wxImageList creates *new* bitmaps, so you may delete + // 'bitmap' after calling Add. + int Add(const wxBitmap& bitmap, const wxColour& maskColour); + + // Adds a bitmap and mask from an icon. + int Add(const wxIcon& icon); + + // Replaces a bitmap, optionally passing a mask bitmap. + // Note that wxImageList creates new bitmaps, so you may delete + // 'bitmap' and 'mask' after calling Replace. + bool Replace(int index, const wxBitmap& bitmap, const wxBitmap& mask = wxNullBitmap); + +/* Not supported by Win95 + // Replacing a bitmap, using the specified colour to create the mask bitmap + // Note that wxImageList creates new bitmaps, so you may delete + // 'bitmap'. + bool Replace(int index, const wxBitmap& bitmap, const wxColour& maskColour); +*/ + + // Replaces a bitmap and mask from an icon. + // You can delete 'icon' after calling Replace. + bool Replace(int index, const wxIcon& icon); + + // Removes the image at the given index. + bool Remove(int index); + + // Remove all images + bool RemoveAll(); + + // Draws the given image on a dc at the specified position. + // If 'solidBackground' is true, Draw sets the image list background + // colour to the background colour of the wxDC, to speed up + // drawing by eliminating masked drawing where possible. + bool Draw(int index, wxDC& dc, int x, int y, + int flags = wxIMAGELIST_DRAW_NORMAL, + bool solidBackground = false); + + // Get a bitmap + wxBitmap GetBitmap(int index) const; + + // Get an icon + wxIcon GetIcon(int index) const; + + // TODO: miscellaneous functionality +/* + wxIcon *MakeIcon(int index); + bool SetOverlayImage(int index, int overlayMask); + +*/ + + // TODO: Drag-and-drop related functionality. + +#if 0 + // Creates a new drag image by combining the given image (typically a mouse cursor image) + // with the current drag image. + bool SetDragCursorImage(int index, const wxPoint& hotSpot); + + // If successful, returns a pointer to the temporary image list that is used for dragging; + // otherwise, NULL. + // dragPos: receives the current drag position. + // hotSpot: receives the offset of the drag image relative to the drag position. + static wxImageList *GetDragImageList(wxPoint& dragPos, wxPoint& hotSpot); + + // Call this function to begin dragging an image. This function creates a temporary image list + // that is used for dragging. The image combines the specified image and its mask with the + // current cursor. In response to subsequent mouse move messages, you can move the drag image + // by using the DragMove member function. To end the drag operation, you can use the EndDrag + // member function. + bool BeginDrag(int index, const wxPoint& hotSpot); + + // Ends a drag operation. + bool EndDrag(); + + // Call this function to move the image that is being dragged during a drag-and-drop operation. + // This function is typically called in response to a mouse move message. To begin a drag + // operation, use the BeginDrag member function. + static bool DragMove(const wxPoint& point); + + // During a drag operation, locks updates to the window specified by lockWindow and displays + // the drag image at the position specified by point. + // The coordinates are relative to the window's upper left corner, so you must compensate + // for the widths of window elements, such as the border, title bar, and menu bar, when + // specifying the coordinates. + // If lockWindow is NULL, this function draws the image in the display context associated + // with the desktop window, and coordinates are relative to the upper left corner of the screen. + // This function locks all other updates to the given window during the drag operation. + // If you need to do any drawing during a drag operation, such as highlighting the target + // of a drag-and-drop operation, you can temporarily hide the dragged image by using the + // wxImageList::DragLeave function. + + // lockWindow: pointer to the window that owns the drag image. + // point: position at which to display the drag image. Coordinates are relative to the + // upper left corner of the window (not the client area). + + static bool DragEnter( wxWindow *lockWindow, const wxPoint& point ); + + // Unlocks the window specified by pWndLock and hides the drag image, allowing the + // window to be updated. + static bool DragLeave( wxWindow *lockWindow ); + + /* Here's roughly how you'd use these functions if implemented in this Win95-like way: + + 1) Starting to drag: + + wxImageList *dragImageList = new wxImageList(16, 16, true); + dragImageList->Add(myDragImage); // Provide an image to combine with the current cursor + dragImageList->BeginDrag(0, wxPoint(0, 0)); + wxShowCursor(false); // wxShowCursor not yet implemented in wxWin + myWindow->CaptureMouse(); + + 2) Dragging: + + // Called within mouse move event. Could also use dragImageList instead of assuming + // these are static functions. + // These two functions could possibly be combined into one, since DragEnter is + // a bit obscure. + wxImageList::DragMove(wxPoint(x, y)); // x, y are current cursor position + wxImageList::DragEnter(NULL, wxPoint(x, y)); // NULL assumes dragging across whole screen + + 3) Finishing dragging: + + dragImageList->EndDrag(); + myWindow->ReleaseMouse(); + wxShowCursor(true); +*/ + +#endif + + // Implementation + //////////////////////////////////////////////////////////////////////////// + + // Returns the native image list handle + WXHIMAGELIST GetHIMAGELIST() const { return m_hImageList; } + +protected: + WXHIMAGELIST m_hImageList; + + DECLARE_DYNAMIC_CLASS(wxImageList) +}; + +#endif + // _WX_IMAGLIST_H_ diff --git a/Externals/wxWidgets/include/wx/msw/iniconf.h b/Externals/wxWidgets/include/wx/msw/iniconf.h new file mode 100644 index 0000000000..504d21c716 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/iniconf.h @@ -0,0 +1,95 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: include/wx/msw/iniconf.h +// Purpose: INI-file based wxConfigBase implementation +// Author: Vadim Zeitlin +// Modified by: +// Created: 27.07.98 +// RCS-ID: $Id: iniconf.h 28931 2004-08-27 18:59:37Z ABX $ +// Copyright: (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _INICONF_H +#define _INICONF_H + +// ---------------------------------------------------------------------------- +// wxIniConfig is a wxConfig implementation which uses MS Windows INI files to +// store the data. Because INI files don't really support arbitrary nesting of +// groups, we do the following: +// (1) in win.ini file we store all entries in the [vendor] section and +// the value group1/group2/key is mapped to the value group1_group2_key +// in this section, i.e. all path separators are replaced with underscore +// (2) in appname.ini file we map group1/group2/group3/key to the entry +// group2_group3_key in [group1] +// +// Of course, it might lead to indesirable results if '_' is also used in key +// names (i.e. group/key is the same as group_key) and also GetPath() result +// may be not what you would expect it to be. +// +// Another limitation: the keys and section names are never case-sensitive +// which might differ from wxFileConfig it it was compiled with +// wxCONFIG_CASE_SENSITIVE option. +// ---------------------------------------------------------------------------- + +// for this class, "local" file is the file appname.ini and the global file +// is the [vendor] subsection of win.ini (default for "vendor" is to be the +// same as appname). The file name (strAppName parameter) may, in fact, +// contain the full path to the file. If it doesn't, the file is searched for +// in the Windows directory. +class WXDLLEXPORT wxIniConfig : public wxConfigBase +{ +public: + // ctor & dtor + // if strAppName doesn't contain the extension and is not an absolute path, + // ".ini" is appended to it. if strVendor is empty, it's taken to be the + // same as strAppName. + wxIniConfig(const wxString& strAppName = wxEmptyString, const wxString& strVendor = wxEmptyString, + const wxString& localFilename = wxEmptyString, const wxString& globalFilename = wxEmptyString, long style = wxCONFIG_USE_LOCAL_FILE); + virtual ~wxIniConfig(); + + // implement inherited pure virtual functions + virtual void SetPath(const wxString& strPath); + virtual const wxString& GetPath() const; + + virtual bool GetFirstGroup(wxString& str, long& lIndex) const; + virtual bool GetNextGroup (wxString& str, long& lIndex) const; + virtual bool GetFirstEntry(wxString& str, long& lIndex) const; + virtual bool GetNextEntry (wxString& str, long& lIndex) const; + + virtual size_t GetNumberOfEntries(bool bRecursive = false) const; + virtual size_t GetNumberOfGroups(bool bRecursive = false) const; + + virtual bool HasGroup(const wxString& strName) const; + virtual bool HasEntry(const wxString& strName) const; + + // return true if the current group is empty + bool IsEmpty() const; + + virtual bool Flush(bool bCurrentOnly = false); + + virtual bool RenameEntry(const wxString& oldName, const wxString& newName); + virtual bool RenameGroup(const wxString& oldName, const wxString& newName); + + virtual bool DeleteEntry(const wxString& Key, bool bGroupIfEmptyAlso = true); + virtual bool DeleteGroup(const wxString& szKey); + virtual bool DeleteAll(); + +protected: + // read/write + bool DoReadString(const wxString& key, wxString *pStr) const; + bool DoReadLong(const wxString& key, long *plResult) const; + + bool DoWriteString(const wxString& key, const wxString& szValue); + bool DoWriteLong(const wxString& key, long lValue); + +private: + // helpers + wxString GetPrivateKeyName(const wxString& szKey) const; + wxString GetKeyName(const wxString& szKey) const; + + wxString m_strLocalFilename; // name of the private INI file + wxString m_strGroup, // current group in appname.ini file + m_strPath; // the rest of the path (no trailing '_'!) +}; + +#endif //_INICONF_H diff --git a/Externals/wxWidgets/include/wx/msw/joystick.h b/Externals/wxWidgets/include/wx/msw/joystick.h new file mode 100644 index 0000000000..a52541b085 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/joystick.h @@ -0,0 +1,90 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: joystick.h +// Purpose: wxJoystick class +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: joystick.h 35650 2005-09-23 12:56:45Z MR $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_JOYSTICK_H_ +#define _WX_JOYSTICK_H_ + +#include "wx/event.h" + +class WXDLLIMPEXP_ADV wxJoystick: public wxObject +{ + DECLARE_DYNAMIC_CLASS(wxJoystick) + public: + /* + * Public interface + */ + + wxJoystick(int joystick = wxJOYSTICK1); + + // Attributes + //////////////////////////////////////////////////////////////////////////// + + wxPoint GetPosition(void) const; + int GetZPosition(void) const; + int GetButtonState(void) const; + int GetPOVPosition(void) const; + int GetPOVCTSPosition(void) const; + int GetRudderPosition(void) const; + int GetUPosition(void) const; + int GetVPosition(void) const; + int GetMovementThreshold(void) const; + void SetMovementThreshold(int threshold) ; + + // Capabilities + //////////////////////////////////////////////////////////////////////////// + + static int GetNumberJoysticks(void); + + bool IsOk(void) const; // Checks that the joystick is functioning + int GetManufacturerId(void) const ; + int GetProductId(void) const ; + wxString GetProductName(void) const ; + int GetXMin(void) const; + int GetYMin(void) const; + int GetZMin(void) const; + int GetXMax(void) const; + int GetYMax(void) const; + int GetZMax(void) const; + int GetNumberButtons(void) const; + int GetNumberAxes(void) const; + int GetMaxButtons(void) const; + int GetMaxAxes(void) const; + int GetPollingMin(void) const; + int GetPollingMax(void) const; + int GetRudderMin(void) const; + int GetRudderMax(void) const; + int GetUMin(void) const; + int GetUMax(void) const; + int GetVMin(void) const; + int GetVMax(void) const; + + bool HasRudder(void) const; + bool HasZ(void) const; + bool HasU(void) const; + bool HasV(void) const; + bool HasPOV(void) const; + bool HasPOV4Dir(void) const; + bool HasPOVCTS(void) const; + + // Operations + //////////////////////////////////////////////////////////////////////////// + + // pollingFreq = 0 means that movement events are sent when above the threshold. + // If pollingFreq > 0, events are received every this many milliseconds. + bool SetCapture(wxWindow* win, int pollingFreq = 0); + bool ReleaseCapture(void); + +protected: + int m_joystick; +}; + +#endif + // _WX_JOYSTICK_H_ diff --git a/Externals/wxWidgets/include/wx/msw/libraries.h b/Externals/wxWidgets/include/wx/msw/libraries.h new file mode 100644 index 0000000000..efd7389e00 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/libraries.h @@ -0,0 +1,27 @@ +/* + * Name: wx/msw/libraries.h + * Purpose: Pragmas for linking libs conditionally + * Author: Michael Wetherell + * Modified by: + * RCS-ID: $Id: libraries.h 37045 2006-01-21 22:50:46Z MW $ + * Copyright: (c) 2005 Michael Wetherell + * Licence: wxWindows licence + */ + +#ifndef _WX_MSW_LIBRARIES_H_ +#define _WX_MSW_LIBRARIES_H_ + +/* + * Notes: + * + * In general the preferred place to add libs is in the bakefiles. This file + * can be used where libs must be added conditionally, for those compilers that + * support a way to do that. + */ + +/* VC++ 5 didn't include oleacc.lib, though it came with the PSDK */ +#if defined __VISUALC__ && (wxUSE_ACCESSIBILITY || __VISUALC__ >= 1200) +#pragma comment(lib, "oleacc") +#endif + +#endif /* _WX_MSW_LIBRARIES_H_ */ diff --git a/Externals/wxWidgets/include/wx/msw/listbox.h b/Externals/wxWidgets/include/wx/msw/listbox.h new file mode 100644 index 0000000000..f086d36d79 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/listbox.h @@ -0,0 +1,168 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/listbox.h +// Purpose: wxListBox class +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: listbox.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_LISTBOX_H_ +#define _WX_LISTBOX_H_ + +#if wxUSE_LISTBOX + +// ---------------------------------------------------------------------------- +// simple types +// ---------------------------------------------------------------------------- + +#if wxUSE_OWNER_DRAWN + class WXDLLIMPEXP_FWD_CORE wxOwnerDrawn; + + // define the array of list box items + #include "wx/dynarray.h" + + WX_DEFINE_EXPORTED_ARRAY_PTR(wxOwnerDrawn *, wxListBoxItemsArray); +#endif // wxUSE_OWNER_DRAWN + +// forward decl for GetSelections() +class WXDLLIMPEXP_FWD_BASE wxArrayInt; + +// ---------------------------------------------------------------------------- +// List box control +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxListBox : public wxListBoxBase +{ +public: + // ctors and such + wxListBox(); + wxListBox(wxWindow *parent, wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + int n = 0, const wxString choices[] = NULL, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxListBoxNameStr) + { + Create(parent, id, pos, size, n, choices, style, validator, name); + } + wxListBox(wxWindow *parent, wxWindowID id, + const wxPoint& pos, + const wxSize& size, + const wxArrayString& choices, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxListBoxNameStr) + { + Create(parent, id, pos, size, choices, style, validator, name); + } + + bool Create(wxWindow *parent, wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + int n = 0, const wxString choices[] = NULL, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxListBoxNameStr); + bool Create(wxWindow *parent, wxWindowID id, + const wxPoint& pos, + const wxSize& size, + const wxArrayString& choices, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxListBoxNameStr); + + virtual ~wxListBox(); + + // implement base class pure virtuals + virtual void Clear(); + virtual void Delete(unsigned int n); + + virtual unsigned int GetCount() const; + virtual wxString GetString(unsigned int n) const; + virtual void SetString(unsigned int n, const wxString& s); + virtual int FindString(const wxString& s, bool bCase = false) const; + + virtual bool IsSelected(int n) const; + virtual int GetSelection() const; + virtual int GetSelections(wxArrayInt& aSelections) const; + + // wxCheckListBox support +#if wxUSE_OWNER_DRAWN + bool MSWOnMeasure(WXMEASUREITEMSTRUCT *item); + bool MSWOnDraw(WXDRAWITEMSTRUCT *item); + + // plug-in for derived classes + virtual wxOwnerDrawn *CreateLboxItem(size_t n); + + // allows to get the item and use SetXXX functions to set it's appearance + wxOwnerDrawn *GetItem(size_t n) const { return m_aItems[n]; } + + // get the index of the given item + int GetItemIndex(wxOwnerDrawn *item) const { return m_aItems.Index(item); } +#endif // wxUSE_OWNER_DRAWN + + // Windows-specific code to update the horizontal extent of the listbox, if + // necessary. If s is non-empty, the horizontal extent is increased to the + // length of this string if it's currently too short, otherwise the maximum + // extent of all strings is used. In any case calls InvalidateBestSize() + virtual void SetHorizontalExtent(const wxString& s = wxEmptyString); + + // Windows callbacks + bool MSWCommand(WXUINT param, WXWORD id); + WXDWORD MSWGetStyle(long style, WXDWORD *exstyle) const; + + // under XP when using "transition effect for menus and tooltips" if we + // return true for WM_PRINTCLIENT here then it causes noticable slowdown + virtual bool MSWShouldPropagatePrintChild() + { + return false; + } + + virtual wxVisualAttributes GetDefaultAttributes() const + { + return GetClassDefaultAttributes(GetWindowVariant()); + } + + static wxVisualAttributes + GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL) + { + return GetCompositeControlsDefaultAttributes(variant); + } + +protected: + virtual void DoSetSelection(int n, bool select); + virtual int DoAppend(const wxString& item); + virtual void DoInsertItems(const wxArrayString& items, unsigned int pos); + virtual void DoSetItems(const wxArrayString& items, void **clientData); + virtual void DoSetFirstItem(int n); + virtual void DoSetItemClientData(unsigned int n, void* clientData); + virtual void* DoGetItemClientData(unsigned int n) const; + virtual void DoSetItemClientObject(unsigned int n, wxClientData* clientData); + virtual wxClientData* DoGetItemClientObject(unsigned int n) const; + virtual int DoListHitTest(const wxPoint& point) const; + + // free memory (common part of Clear() and dtor) + void Free(); + + unsigned int m_noItems; + int m_selected; + + virtual wxSize DoGetBestSize() const; + +#if wxUSE_OWNER_DRAWN + // control items + wxListBoxItemsArray m_aItems; +#endif + +private: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxListBox) +}; + +#endif // wxUSE_LISTBOX + +#endif + // _WX_LISTBOX_H_ diff --git a/Externals/wxWidgets/include/wx/msw/listctrl.h b/Externals/wxWidgets/include/wx/msw/listctrl.h new file mode 100644 index 0000000000..5f432ba1f3 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/listctrl.h @@ -0,0 +1,440 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/listctrl.h +// Purpose: wxListCtrl class +// Author: Julian Smart +// Modified by: Agron Selimaj +// Created: 01/02/97 +// RCS-ID: $Id: listctrl.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_LISTCTRL_H_ +#define _WX_LISTCTRL_H_ + +#include "wx/textctrl.h" + +class WXDLLIMPEXP_FWD_CORE wxImageList; + +/* + The wxListCtrl can show lists of items in four different modes: + wxLC_LIST: multicolumn list view, with optional small icons (icons could be + optional for some platforms). Columns are computed automatically, + i.e. you don't set columns as in wxLC_REPORT. In other words, + the list wraps, unlike a wxListBox. + wxLC_REPORT: single or multicolumn report view (with optional header) + wxLC_ICON: large icon view, with optional labels + wxLC_SMALL_ICON: small icon view, with optional labels + + You can change the style dynamically, either with SetSingleStyle or + SetWindowStyleFlag. + + Further window styles: + + wxLC_ALIGN_TOP icons align to the top (default) + wxLC_ALIGN_LEFT icons align to the left + wxLC_AUTOARRANGE icons arrange themselves + wxLC_USER_TEXT the app provides label text on demand, except for column headers + wxLC_EDIT_LABELS labels are editable: app will be notified. + wxLC_NO_HEADER no header in report mode + wxLC_NO_SORT_HEADER can't click on header + wxLC_SINGLE_SEL single selection + wxLC_SORT_ASCENDING sort ascending (must still supply a comparison callback in SortItems) + wxLC_SORT_DESCENDING sort descending (ditto) + + Items are referred to by their index (position in the list starting from zero). + + Label text is supplied via insertion/setting functions and is stored by the + control, unless the wxLC_USER_TEXT style has been specified, in which case + the app will be notified when text is required (see sample). + + Images are dealt with by (optionally) associating 3 image lists with the control. + Zero-based indexes into these image lists indicate which image is to be used for + which item. Each image in an image list can contain a mask, and can be made out + of either a bitmap, two bitmaps or an icon. See ImagList.h for more details. + + Notifications are passed via the wxWidgets 2.0 event system, or using virtual + functions in wxWidgets 1.66. + + See the sample wxListCtrl app for API usage. + + TODO: + - addition of further convenience functions + to avoid use of wxListItem in some functions + - state/overlay images: probably not needed. + - in Win95, you can be called back to supply other information + besides text, such as state information. This saves no memory + and is probably superfluous to requirements. + - testing of whole API, extending current sample. + + + */ + +class WXDLLEXPORT wxListCtrl: public wxControl +{ +public: + /* + * Public interface + */ + + wxListCtrl() { Init(); } + + wxListCtrl(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxLC_ICON, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxListCtrlNameStr) + { + Init(); + + Create(parent, id, pos, size, style, validator, name); + } + + virtual ~wxListCtrl(); + + bool Create(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxLC_ICON, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxListCtrlNameStr); + + + // Attributes + //////////////////////////////////////////////////////////////////////////// + + // Set the control colours + bool SetForegroundColour(const wxColour& col); + bool SetBackgroundColour(const wxColour& col); + + // Gets information about this column + bool GetColumn(int col, wxListItem& item) const; + + // Sets information about this column + bool SetColumn(int col, const wxListItem& item) ; + + // Gets the column width + int GetColumnWidth(int col) const; + + // Sets the column width + bool SetColumnWidth(int col, int width) ; + + // Gets the number of items that can fit vertically in the + // visible area of the list control (list or report view) + // or the total number of items in the list control (icon + // or small icon view) + int GetCountPerPage() const; + + // return the total area occupied by all the items (icon/small icon only) + wxRect GetViewRect() const; + + // Gets the edit control for editing labels. + wxTextCtrl* GetEditControl() const; + + // Gets information about the item + bool GetItem(wxListItem& info) const ; + + // Sets information about the item + bool SetItem(wxListItem& info) ; + + // Sets a string field at a particular column + long SetItem(long index, int col, const wxString& label, int imageId = -1); + + // Gets the item state + int GetItemState(long item, long stateMask) const ; + + // Sets the item state + bool SetItemState(long item, long state, long stateMask) ; + + // Sets the item image + bool SetItemImage(long item, int image, int selImage = -1) ; + bool SetItemColumnImage(long item, long column, int image); + + // Gets the item text + wxString GetItemText(long item) const ; + + // Sets the item text + void SetItemText(long item, const wxString& str) ; + + // Gets the item data + wxUIntPtr GetItemData(long item) const ; + + // Sets the item data +#if wxABI_VERSION >= 20804 + bool SetItemPtrData(long item, wxUIntPtr data); +#endif // wxABI 2.8.4+ + bool SetItemData(long item, long data); + + // Gets the item rectangle + bool GetItemRect(long item, wxRect& rect, int code = wxLIST_RECT_BOUNDS) const ; + + // Gets the subitem rectangle in report mode + bool GetSubItemRect(long item, long subItem, wxRect& rect, int code = wxLIST_RECT_BOUNDS) const ; + + // Gets the item position + bool GetItemPosition(long item, wxPoint& pos) const ; + + // Sets the item position + bool SetItemPosition(long item, const wxPoint& pos) ; + + // Gets the number of items in the list control + int GetItemCount() const; + + // Gets the number of columns in the list control + int GetColumnCount() const { return m_colCount; } + + // get the horizontal and vertical components of the item spacing + wxSize GetItemSpacing() const; + + // Foreground colour of an item. + void SetItemTextColour( long item, const wxColour& col); + wxColour GetItemTextColour( long item ) const; + + // Background colour of an item. + void SetItemBackgroundColour( long item, const wxColour &col); + wxColour GetItemBackgroundColour( long item ) const; + + // Font of an item. + void SetItemFont( long item, const wxFont &f); + wxFont GetItemFont( long item ) const; + + // Gets the number of selected items in the list control + int GetSelectedItemCount() const; + + // Gets the text colour of the listview + wxColour GetTextColour() const; + + // Sets the text colour of the listview + void SetTextColour(const wxColour& col); + + // Gets the index of the topmost visible item when in + // list or report view + long GetTopItem() const ; + + // Add or remove a single window style + void SetSingleStyle(long style, bool add = true) ; + + // Set the whole window style + void SetWindowStyleFlag(long style) ; + + // Searches for an item, starting from 'item'. + // item can be -1 to find the first item that matches the + // specified flags. + // Returns the item or -1 if unsuccessful. + long GetNextItem(long item, int geometry = wxLIST_NEXT_ALL, int state = wxLIST_STATE_DONTCARE) const ; + + // Gets one of the three image lists + wxImageList *GetImageList(int which) const ; + + // Sets the image list + // N.B. There's a quirk in the Win95 list view implementation. + // If in wxLC_LIST mode, it'll *still* display images by the labels if + // there's a small-icon image list set for the control - even though you + // haven't specified wxLIST_MASK_IMAGE when inserting. + // So you have to set a NULL small-icon image list to be sure that + // the wxLC_LIST mode works without icons. Of course, you may want icons... + void SetImageList(wxImageList *imageList, int which) ; + void AssignImageList(wxImageList *imageList, int which) ; + + // are we in report mode? + bool InReportView() const { return HasFlag(wxLC_REPORT); } + + // are we in virtual report mode? + bool IsVirtual() const { return HasFlag(wxLC_VIRTUAL); } + + // refresh items selectively (only useful for virtual list controls) + void RefreshItem(long item); + void RefreshItems(long itemFrom, long itemTo); + + // Operations + //////////////////////////////////////////////////////////////////////////// + + // Arranges the items + bool Arrange(int flag = wxLIST_ALIGN_DEFAULT); + + // Deletes an item + bool DeleteItem(long item); + + // Deletes all items + bool DeleteAllItems() ; + + // Deletes a column + bool DeleteColumn(int col); + + // Deletes all columns + bool DeleteAllColumns(); + + // Clears items, and columns if there are any. + void ClearAll(); + + // Edit the label + wxTextCtrl* EditLabel(long item, wxClassInfo* textControlClass = CLASSINFO(wxTextCtrl)); + + // End label editing, optionally cancelling the edit + bool EndEditLabel(bool cancel); + + // Ensures this item is visible + bool EnsureVisible(long item) ; + + // Find an item whose label matches this string, starting from the item after 'start' + // or the beginning if 'start' is -1. + long FindItem(long start, const wxString& str, bool partial = false); + + // Find an item whose data matches this data, starting from the item after 'start' + // or the beginning if 'start' is -1. + long FindItem(long start, wxUIntPtr data); + + // Find an item nearest this position in the specified direction, starting from + // the item after 'start' or the beginning if 'start' is -1. + long FindItem(long start, const wxPoint& pt, int direction); + + // Determines which item (if any) is at the specified point, + // giving details in 'flags' (see wxLIST_HITTEST_... flags above) + // Request the subitem number as well at the given coordinate. + long HitTest(const wxPoint& point, int& flags, long* ptrSubItem = NULL) const; + + // Inserts an item, returning the index of the new item if successful, + // -1 otherwise. + long InsertItem(const wxListItem& info); + + // Insert a string item + long InsertItem(long index, const wxString& label); + + // Insert an image item + long InsertItem(long index, int imageIndex); + + // Insert an image/string item + long InsertItem(long index, const wxString& label, int imageIndex); + + // For list view mode (only), inserts a column. + long InsertColumn(long col, const wxListItem& info); + + long InsertColumn(long col, + const wxString& heading, + int format = wxLIST_FORMAT_LEFT, + int width = -1); + + // set the number of items in a virtual list control + void SetItemCount(long count); + + // Scrolls the list control. If in icon, small icon or report view mode, + // x specifies the number of pixels to scroll. If in list view mode, x + // specifies the number of columns to scroll. + // If in icon, small icon or list view mode, y specifies the number of pixels + // to scroll. If in report view mode, y specifies the number of lines to scroll. + bool ScrollList(int dx, int dy); + + // Sort items. + + // fn is a function which takes 3 long arguments: item1, item2, data. + // item1 is the long data associated with a first item (NOT the index). + // item2 is the long data associated with a second item (NOT the index). + // data is the same value as passed to SortItems. + // The return value is a negative number if the first item should precede the second + // item, a positive number of the second item should precede the first, + // or zero if the two items are equivalent. + + // data is arbitrary data to be passed to the sort function. + bool SortItems(wxListCtrlCompare fn, long data); + + // IMPLEMENTATION + virtual bool MSWCommand(WXUINT param, WXWORD id); + virtual bool MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result); + virtual bool MSWShouldPreProcessMessage(WXMSG* msg); + virtual bool MSWDrawSubItem(wxPaintDC& rPainDC, int tem, int subitem); + + // bring the control in sync with current m_windowStyle value + void UpdateStyle(); + + // Event handlers + //////////////////////////////////////////////////////////////////////////// + // Necessary for drawing hrules and vrules, if specified + void OnPaint(wxPaintEvent& event); + + + virtual bool ShouldInheritColours() const { return false; } + + virtual wxVisualAttributes GetDefaultAttributes() const + { + return GetClassDefaultAttributes(GetWindowVariant()); + } + + static wxVisualAttributes + GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL); + + +#if WXWIN_COMPATIBILITY_2_6 + // obsolete stuff, for compatibility only -- don't use + wxDEPRECATED( int GetItemSpacing(bool isSmall) const); +#endif // WXWIN_COMPATIBILITY_2_6 + + // convert our styles to Windows + virtual WXDWORD MSWGetStyle(long style, WXDWORD *exstyle) const; + + // special Windows message handling + virtual WXLRESULT MSWWindowProc(WXUINT nMsg, + WXWPARAM wParam, + WXLPARAM lParam); + +protected: + // common part of all ctors + void Init(); + + // free memory taken by all internal data + void FreeAllInternalData(); + + // get the item attribute, either by quering it for virtual control, or by + // returning the one previously set using setter methods for a normal one + wxListItemAttr *DoGetItemAttr(long item) const; + + + wxTextCtrl* m_textCtrl; // The control used for editing a label + wxImageList * m_imageListNormal; // The image list for normal icons + wxImageList * m_imageListSmall; // The image list for small icons + wxImageList * m_imageListState; // The image list state icons (not implemented yet) + bool m_ownsImageListNormal, + m_ownsImageListSmall, + m_ownsImageListState; + + int m_colCount; // Windows doesn't have GetColumnCount so must + // keep track of inserted/deleted columns + long m_count; // Keep track of item count to save calls to + // ListView_GetItemCount + bool m_ignoreChangeMessages; + + // true if we have any internal data (user data & attributes) + bool m_AnyInternalData; + + // true if we have any items with custom attributes + bool m_hasAnyAttr; + + // these functions are only used for virtual list view controls, i.e. the + // ones with wxLC_VIRTUAL style + + // return the text for the given column of the given item + virtual wxString OnGetItemText(long item, long column) const; + + // return the icon for the given item. In report view, OnGetItemImage will + // only be called for the first column. See OnGetItemColumnImage for + // details. + virtual int OnGetItemImage(long item) const; + + // return the icon for the given item and column. + virtual int OnGetItemColumnImage(long item, long column) const; + + // return the attribute for the item (may return NULL if none) + virtual wxListItemAttr *OnGetItemAttr(long item) const; + +private: + // process NM_CUSTOMDRAW notification message + WXLPARAM OnCustomDraw(WXLPARAM lParam); + + DECLARE_DYNAMIC_CLASS(wxListCtrl) + DECLARE_EVENT_TABLE() + DECLARE_NO_COPY_CLASS(wxListCtrl) +}; + +#endif // _WX_LISTCTRL_H_ diff --git a/Externals/wxWidgets/include/wx/msw/magnif1.cur b/Externals/wxWidgets/include/wx/msw/magnif1.cur new file mode 100644 index 0000000000..15d1a77a49 Binary files /dev/null and b/Externals/wxWidgets/include/wx/msw/magnif1.cur differ diff --git a/Externals/wxWidgets/include/wx/msw/mdi.h b/Externals/wxWidgets/include/wx/msw/mdi.h new file mode 100644 index 0000000000..20b54ca697 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/mdi.h @@ -0,0 +1,238 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/mdi.h +// Purpose: MDI (Multiple Document Interface) classes +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: mdi.h 45498 2007-04-16 13:03:05Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MDI_H_ +#define _WX_MDI_H_ + +#include "wx/frame.h" + +extern WXDLLEXPORT_DATA(const wxChar) wxStatusLineNameStr[]; + +class WXDLLEXPORT wxMDIClientWindow; +class WXDLLEXPORT wxMDIChildFrame; + +// --------------------------------------------------------------------------- +// wxMDIParentFrame +// --------------------------------------------------------------------------- + +class WXDLLEXPORT wxMDIParentFrame : public wxFrame +{ +public: + wxMDIParentFrame(); + wxMDIParentFrame(wxWindow *parent, + wxWindowID id, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDEFAULT_FRAME_STYLE | wxVSCROLL | wxHSCROLL, + const wxString& name = wxFrameNameStr) + { + Create(parent, id, title, pos, size, style, name); + } + + virtual ~wxMDIParentFrame(); + + bool Create(wxWindow *parent, + wxWindowID id, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDEFAULT_FRAME_STYLE | wxVSCROLL | wxHSCROLL, + const wxString& name = wxFrameNameStr); + + // accessors + // --------- + + // Get the active MDI child window (Windows only) + wxMDIChildFrame *GetActiveChild() const; + + // Get the client window + wxMDIClientWindow *GetClientWindow() const { return m_clientWindow; } + + // Create the client window class (don't Create the window, + // just return a new class) + virtual wxMDIClientWindow *OnCreateClient(void); + + // MDI windows menu + wxMenu* GetWindowMenu() const { return m_windowMenu; } + void SetWindowMenu(wxMenu* menu) ; + virtual void DoMenuUpdates(wxMenu* menu = NULL); + + // MDI operations + // -------------- + virtual void Cascade(); + virtual void Tile(wxOrientation orient = wxHORIZONTAL); + virtual void ArrangeIcons(); + virtual void ActivateNext(); + virtual void ActivatePrevious(); + + // handlers + // -------- + + // Responds to colour changes + void OnSysColourChanged(wxSysColourChangedEvent& event); + + void OnSize(wxSizeEvent& event); + void OnIconized(wxIconizeEvent& event); + + bool HandleActivate(int state, bool minimized, WXHWND activate); + bool HandleCommand(WXWORD id, WXWORD cmd, WXHWND control); + + // override window proc for MDI-specific message processing + virtual WXLRESULT MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam); + + virtual WXLRESULT MSWDefWindowProc(WXUINT, WXWPARAM, WXLPARAM); + virtual bool MSWTranslateMessage(WXMSG* msg); + +protected: +#if wxUSE_MENUS_NATIVE + virtual void InternalSetMenuBar(); +#endif // wxUSE_MENUS_NATIVE + + virtual WXHICON GetDefaultIcon() const; + + // set the size of the MDI client window to match the frame size + void UpdateClientSize(); + + + wxMDIClientWindow * m_clientWindow; + wxMDIChildFrame * m_currentChild; + wxMenu* m_windowMenu; + + // true if MDI Frame is intercepting commands, not child + bool m_parentFrameActive; + +private: + friend class WXDLLEXPORT wxMDIChildFrame; + + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS(wxMDIParentFrame) + DECLARE_NO_COPY_CLASS(wxMDIParentFrame) +}; + +// --------------------------------------------------------------------------- +// wxMDIChildFrame +// --------------------------------------------------------------------------- + +class WXDLLEXPORT wxMDIChildFrame : public wxFrame +{ +public: + wxMDIChildFrame() { Init(); } + wxMDIChildFrame(wxMDIParentFrame *parent, + wxWindowID id, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDEFAULT_FRAME_STYLE, + const wxString& name = wxFrameNameStr) + { + Init(); + + Create(parent, id, title, pos, size, style, name); + } + + virtual ~wxMDIChildFrame(); + + bool Create(wxMDIParentFrame *parent, + wxWindowID id, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDEFAULT_FRAME_STYLE, + const wxString& name = wxFrameNameStr); + + virtual bool IsTopLevel() const { return false; } + + // MDI operations + virtual void Maximize(bool maximize = true); + virtual void Restore(); + virtual void Activate(); + + // Implementation only from now on + // ------------------------------- + + // Handlers + bool HandleMDIActivate(long bActivate, WXHWND, WXHWND); + bool HandleWindowPosChanging(void *lpPos); + bool HandleCommand(WXWORD id, WXWORD cmd, WXHWND control); + bool HandleGetMinMaxInfo(void *mmInfo); + + virtual WXLRESULT MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam); + virtual WXLRESULT MSWDefWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam); + virtual bool MSWTranslateMessage(WXMSG *msg); + + virtual void MSWDestroyWindow(); + + bool ResetWindowStyle(void *vrect); + + void OnIdle(wxIdleEvent& event); + + virtual bool Show(bool show = true); + +protected: + virtual void DoGetScreenPosition(int *x, int *y) const; + virtual void DoGetPosition(int *x, int *y) const; + virtual void DoSetClientSize(int width, int height); + virtual void InternalSetMenuBar(); + virtual bool IsMDIChild() const { return true; } + virtual void DetachMenuBar(); + + virtual WXHICON GetDefaultIcon() const; + + // common part of all ctors + void Init(); + +private: + bool m_needsInitialShow; // Show must be called in idle time after Creation + bool m_needsResize; // flag which tells us to artificially resize the frame + + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS_NO_COPY(wxMDIChildFrame) +}; + +// --------------------------------------------------------------------------- +// wxMDIClientWindow +// --------------------------------------------------------------------------- + +class WXDLLEXPORT wxMDIClientWindow : public wxWindow +{ +public: + wxMDIClientWindow() { Init(); } + wxMDIClientWindow(wxMDIParentFrame *parent, long style = 0) + { + Init(); + + CreateClient(parent, style); + } + + // Note: this is virtual, to allow overridden behaviour. + virtual bool CreateClient(wxMDIParentFrame *parent, + long style = wxVSCROLL | wxHSCROLL); + + // Explicitly call default scroll behaviour + void OnScroll(wxScrollEvent& event); + +protected: + virtual void DoSetSize(int x, int y, + int width, int height, + int sizeFlags = wxSIZE_AUTO); + + void Init() { m_scrollX = m_scrollY = 0; } + + int m_scrollX, m_scrollY; + +private: + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS_NO_COPY(wxMDIClientWindow) +}; + +#endif + // _WX_MDI_H_ diff --git a/Externals/wxWidgets/include/wx/msw/mdi.ico b/Externals/wxWidgets/include/wx/msw/mdi.ico new file mode 100644 index 0000000000..435cca2471 Binary files /dev/null and b/Externals/wxWidgets/include/wx/msw/mdi.ico differ diff --git a/Externals/wxWidgets/include/wx/msw/menu.h b/Externals/wxWidgets/include/wx/msw/menu.h new file mode 100644 index 0000000000..b25f77d5db --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/menu.h @@ -0,0 +1,241 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/menu.h +// Purpose: wxMenu, wxMenuBar classes +// Author: Julian Smart +// Modified by: Vadim Zeitlin (wxMenuItem is now in separate file) +// Created: 01/02/97 +// RCS-ID: $Id: menu.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MENU_H_ +#define _WX_MENU_H_ + +#if wxUSE_ACCEL + #include "wx/accel.h" + #include "wx/dynarray.h" + + WX_DEFINE_EXPORTED_ARRAY_PTR(wxAcceleratorEntry *, wxAcceleratorArray); +#endif // wxUSE_ACCEL + +class WXDLLIMPEXP_FWD_CORE wxFrame; + +#if defined(__WXWINCE__) && wxUSE_TOOLBAR +class WXDLLIMPEXP_FWD_CORE wxToolBar; +#endif + + +// Not using a combined wxToolBar/wxMenuBar? then use +// a commandbar in WinCE .NET to implement the +// menubar, since there is no ::SetMenu function. +#if defined(__WXWINCE__) +# if ((_WIN32_WCE >= 400) && !defined(__POCKETPC__) && !defined(__SMARTPHONE__)) || \ + defined(__HANDHELDPC__) +# define WINCE_WITH_COMMANDBAR +# else +# define WINCE_WITHOUT_COMMANDBAR +# endif +#endif + + +#include "wx/arrstr.h" + +// ---------------------------------------------------------------------------- +// Menu +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxMenu : public wxMenuBase +{ +public: + // ctors & dtor + wxMenu(const wxString& title, long style = 0) + : wxMenuBase(title, style) { Init(); } + + wxMenu(long style = 0) : wxMenuBase(style) { Init(); } + + virtual ~wxMenu(); + + virtual void Break(); + + virtual void SetTitle(const wxString& title); + + // implementation only from now on + // ------------------------------- + + virtual void Attach(wxMenuBarBase *menubar); + + bool MSWCommand(WXUINT param, WXWORD id); + + // semi-private accessors + // get the window which contains this menu + wxWindow *GetWindow() const; + // get the menu handle + WXHMENU GetHMenu() const { return m_hMenu; } + +#if wxUSE_ACCEL + // called by wxMenuBar to build its accel table from the accels of all menus + bool HasAccels() const { return !m_accels.IsEmpty(); } + size_t GetAccelCount() const { return m_accels.GetCount(); } + size_t CopyAccels(wxAcceleratorEntry *accels) const; + + // called by wxMenuItem when its accels changes + void UpdateAccel(wxMenuItem *item); + + // helper used by wxMenu itself (returns the index in m_accels) + int FindAccel(int id) const; +#endif // wxUSE_ACCEL + +protected: + virtual wxMenuItem* DoAppend(wxMenuItem *item); + virtual wxMenuItem* DoInsert(size_t pos, wxMenuItem *item); + virtual wxMenuItem* DoRemove(wxMenuItem *item); + +private: + // common part of all ctors + void Init(); + + // common part of Append/Insert (behaves as Append is pos == (size_t)-1) + bool DoInsertOrAppend(wxMenuItem *item, size_t pos = (size_t)-1); + + // terminate the current radio group, if any + void EndRadioGroup(); + + // if true, insert a breal before appending the next item + bool m_doBreak; + + // the position of the first item in the current radio group or -1 + int m_startRadioGroup; + + // the menu handle of this menu + WXHMENU m_hMenu; + +#if wxUSE_ACCEL + // the accelerators for our menu items + wxAcceleratorArray m_accels; +#endif // wxUSE_ACCEL + + DECLARE_DYNAMIC_CLASS_NO_COPY(wxMenu) +}; + +// ---------------------------------------------------------------------------- +// Menu Bar (a la Windows) +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxMenuInfo : public wxObject +{ +public : + wxMenuInfo() { m_menu = NULL; } + virtual ~wxMenuInfo() { } + + void Create( wxMenu *menu , const wxString &title ) + { m_menu = menu; m_title = title; } + wxMenu* GetMenu() const { return m_menu; } + wxString GetTitle() const { return m_title; } +private : + wxMenu *m_menu; + wxString m_title; + + DECLARE_DYNAMIC_CLASS(wxMenuInfo) +}; + +WX_DECLARE_EXPORTED_LIST(wxMenuInfo, wxMenuInfoList ); + +class WXDLLEXPORT wxMenuBar : public wxMenuBarBase +{ +public: + // ctors & dtor + // default constructor + wxMenuBar(); + // unused under MSW + wxMenuBar(long style); + // menubar takes ownership of the menus arrays but copies the titles + wxMenuBar(size_t n, wxMenu *menus[], const wxString titles[], long style = 0); + virtual ~wxMenuBar(); + + // menubar construction + bool Append( wxMenuInfo *info ) { return Append( info->GetMenu() , info->GetTitle() ); } + const wxMenuInfoList& GetMenuInfos() const; + + virtual bool Append( wxMenu *menu, const wxString &title ); + virtual bool Insert(size_t pos, wxMenu *menu, const wxString& title); + virtual wxMenu *Replace(size_t pos, wxMenu *menu, const wxString& title); + virtual wxMenu *Remove(size_t pos); + + virtual void EnableTop( size_t pos, bool flag ); + virtual void SetLabelTop( size_t pos, const wxString& label ); + virtual wxString GetLabelTop( size_t pos ) const; + + // implementation from now on + WXHMENU Create(); + virtual void Detach(); + virtual void Attach(wxFrame *frame); + +#if defined(__WXWINCE__) && wxUSE_TOOLBAR + // Under WinCE, a menubar is owned by the frame's toolbar + void SetToolBar(wxToolBar* toolBar) { m_toolBar = toolBar; } + wxToolBar* GetToolBar() const { return m_toolBar; } +#endif + +#ifdef WINCE_WITH_COMMANDBAR + WXHWND GetCommandBar() const { return m_commandBar; } + bool AddAdornments(long style); +#endif + +#if wxUSE_ACCEL + // get the accel table for all the menus + const wxAcceleratorTable& GetAccelTable() const { return m_accelTable; } + + // update the accel table (must be called after adding/deleting a menu) + void RebuildAccelTable(); +#endif // wxUSE_ACCEL + + // get the menu handle + WXHMENU GetHMenu() const { return m_hMenu; } + + // if the menubar is modified, the display is not updated automatically, + // call this function to update it (m_menuBarFrame should be !NULL) + void Refresh(); + + // To avoid compile warning + void Refresh( bool eraseBackground, + const wxRect *rect = (const wxRect *) NULL ) { wxWindow::Refresh(eraseBackground, rect); } + +protected: + // common part of all ctors + void Init(); + + wxArrayString m_titles; + wxMenuInfoList m_menuInfos; + + WXHMENU m_hMenu; + + // Return the MSW position for a wxMenu which is sometimes different from + // the wxWidgets position. + int MSWPositionForWxMenu(wxMenu *menu, int wxpos); +#if wxUSE_ACCEL + // the accelerator table for all accelerators in all our menus + wxAcceleratorTable m_accelTable; +#endif // wxUSE_ACCEL + +#if defined(__WXWINCE__) && wxUSE_TOOLBAR + wxToolBar* m_toolBar; +#endif + +#ifdef WINCE_WITH_COMMANDBAR + WXHWND m_commandBar; + bool m_adornmentsAdded; +#endif + +private: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxMenuBar) + +public: + +#if wxABI_VERSION >= 20805 + // Gets the original label at the top-level of the menubar + wxString GetMenuLabel(size_t pos) const; +#endif +}; + +#endif // _WX_MENU_H_ diff --git a/Externals/wxWidgets/include/wx/msw/menuitem.h b/Externals/wxWidgets/include/wx/msw/menuitem.h new file mode 100644 index 0000000000..641365848a --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/menuitem.h @@ -0,0 +1,100 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: menuitem.h +// Purpose: wxMenuItem class +// Author: Vadim Zeitlin +// Modified by: +// Created: 11.11.97 +// RCS-ID: $Id: menuitem.h 48053 2007-08-13 17:07:01Z JS $ +// Copyright: (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _MENUITEM_H +#define _MENUITEM_H + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#if wxUSE_OWNER_DRAWN + #include "wx/ownerdrw.h" // base class +#endif + +// ---------------------------------------------------------------------------- +// wxMenuItem: an item in the menu, optionally implements owner-drawn behaviour +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxMenuItem : public wxMenuItemBase +#if wxUSE_OWNER_DRAWN + , public wxOwnerDrawn +#endif +{ +public: + // ctor & dtor + wxMenuItem(wxMenu *parentMenu = (wxMenu *)NULL, + int id = wxID_SEPARATOR, + const wxString& name = wxEmptyString, + const wxString& help = wxEmptyString, + wxItemKind kind = wxITEM_NORMAL, + wxMenu *subMenu = (wxMenu *)NULL); + virtual ~wxMenuItem(); + + // override base class virtuals + virtual void SetText(const wxString& strName); + virtual void SetCheckable(bool checkable); + + virtual void Enable(bool bDoEnable = true); + virtual void Check(bool bDoCheck = true); + virtual bool IsChecked() const; + + // unfortunately needed to resolve ambiguity between + // wxMenuItemBase::IsCheckable() and wxOwnerDrawn::IsCheckable() + bool IsCheckable() const { return wxMenuItemBase::IsCheckable(); } + + // the id for a popup menu is really its menu handle (as required by + // ::AppendMenu() API), so this function will return either the id or the + // menu handle depending on what we're + int GetRealId() const; + + // mark item as belonging to the given radio group + void SetAsRadioGroupStart(); + void SetRadioGroupStart(int start); + void SetRadioGroupEnd(int end); + + // compatibility only, don't use in new code + wxMenuItem(wxMenu *parentMenu, + int id, + const wxString& text, + const wxString& help, + bool isCheckable, + wxMenu *subMenu = (wxMenu *)NULL); + +private: + // common part of all ctors + void Init(); + + // the positions of the first and last items of the radio group this item + // belongs to or -1: start is the radio group start and is valid for all + // but first radio group items (m_isRadioGroupStart == false), end is valid + // only for the first one + union + { + int start; + int end; + } m_radioGroup; + + // does this item start a radio group? + bool m_isRadioGroupStart; + + DECLARE_DYNAMIC_CLASS_NO_COPY(wxMenuItem) + +public: + +#if wxABI_VERSION >= 20805 + // return the item label including any mnemonics and accelerators. + // This used to be called GetText. + wxString GetItemLabel() const { return GetText(); } +#endif +}; + +#endif //_MENUITEM_H diff --git a/Externals/wxWidgets/include/wx/msw/metafile.h b/Externals/wxWidgets/include/wx/msw/metafile.h new file mode 100644 index 0000000000..35d6f793f4 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/metafile.h @@ -0,0 +1,171 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/metafile.h +// Purpose: wxMetaFile, wxMetaFileDC and wxMetaFileDataObject classes +// Author: Julian Smart +// Modified by: VZ 07.01.00: implemented wxMetaFileDataObject +// Created: 01/02/97 +// RCS-ID: $Id: metafile.h 46103 2007-05-18 15:14:44Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_METAFIILE_H_ +#define _WX_METAFIILE_H_ + +#include "wx/dc.h" +#include "wx/gdiobj.h" + +#if wxUSE_DRAG_AND_DROP + #include "wx/dataobj.h" +#endif + +// ---------------------------------------------------------------------------- +// Metafile and metafile device context classes +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxMetafile; + +class WXDLLEXPORT wxMetafileRefData: public wxGDIRefData +{ + friend class WXDLLEXPORT wxMetafile; +public: + wxMetafileRefData(); + virtual ~wxMetafileRefData(); + +public: + WXHANDLE m_metafile; + int m_windowsMappingMode; + int m_width, m_height; +}; + +#define M_METAFILEDATA ((wxMetafileRefData *)m_refData) + +class WXDLLEXPORT wxMetafile: public wxGDIObject +{ +public: + wxMetafile(const wxString& file = wxEmptyString); + virtual ~wxMetafile(); + + // After this is called, the metafile cannot be used for anything + // since it is now owned by the clipboard. + virtual bool SetClipboard(int width = 0, int height = 0); + + virtual bool Play(wxDC *dc); + bool Ok() const { return IsOk(); } + bool IsOk() const { return (M_METAFILEDATA && (M_METAFILEDATA->m_metafile != 0)); }; + + // set/get the size of metafile for clipboard operations + wxSize GetSize() const { return wxSize(GetWidth(), GetHeight()); } + int GetWidth() const { return M_METAFILEDATA->m_width; } + int GetHeight() const { return M_METAFILEDATA->m_height; } + + void SetWidth(int width) { M_METAFILEDATA->m_width = width; } + void SetHeight(int height) { M_METAFILEDATA->m_height = height; } + + // Implementation + WXHANDLE GetHMETAFILE() const { return M_METAFILEDATA->m_metafile; } + void SetHMETAFILE(WXHANDLE mf) ; + int GetWindowsMappingMode() const { return M_METAFILEDATA->m_windowsMappingMode; } + void SetWindowsMappingMode(int mm); + +private: + DECLARE_DYNAMIC_CLASS(wxMetafile) +}; + +class WXDLLEXPORT wxMetafileDC: public wxDC +{ +public: + // Don't supply origin and extent + // Supply them to wxMakeMetaFilePlaceable instead. + wxMetafileDC(const wxString& file = wxEmptyString); + + // Supply origin and extent (recommended). + // Then don't need to supply them to wxMakeMetaFilePlaceable. + wxMetafileDC(const wxString& file, int xext, int yext, int xorg, int yorg); + + virtual ~wxMetafileDC(); + + // Should be called at end of drawing + virtual wxMetafile *Close(); + virtual void SetMapMode(int mode); + +#if wxABI_VERSION >= 20805 + virtual void DoGetTextExtent(const wxString& string, + wxCoord *x, wxCoord *y, + wxCoord *descent = NULL, + wxCoord *externalLeading = NULL, + const wxFont *theFont = NULL) const; +#endif // wx ABI 2.8.5+ + + // this method shouldn't have been defined here (DoGetTextExtent() is the + // correct one) but keep it to avoid breaking binary backwards + // compatibility + virtual void GetTextExtent(const wxString& string, long *x, long *y, + long *descent = NULL, long *externalLeading = NULL, + wxFont *theFont = NULL, bool use16bit = false) const; + + // Implementation + wxMetafile *GetMetaFile() const { return m_metaFile; } + void SetMetaFile(wxMetafile *mf) { m_metaFile = mf; } + int GetWindowsMappingMode() const { return m_windowsMappingMode; } + void SetWindowsMappingMode(int mm) { m_windowsMappingMode = mm; } + +protected: + virtual void DoGetSize(int *width, int *height) const; + + int m_windowsMappingMode; + wxMetafile* m_metaFile; + +private: + DECLARE_DYNAMIC_CLASS(wxMetafileDC) +}; + +/* + * Pass filename of existing non-placeable metafile, and bounding box. + * Adds a placeable metafile header, sets the mapping mode to anisotropic, + * and sets the window origin and extent to mimic the wxMM_TEXT mapping mode. + * + */ + +// No origin or extent +bool WXDLLEXPORT wxMakeMetafilePlaceable(const wxString& filename, float scale = 1.0); + +// Optional origin and extent +bool WXDLLEXPORT wxMakeMetaFilePlaceable(const wxString& filename, int x1, int y1, int x2, int y2, float scale = 1.0, bool useOriginAndExtent = true); + +// ---------------------------------------------------------------------------- +// wxMetafileDataObject is a specialization of wxDataObject for metafile data +// ---------------------------------------------------------------------------- + +#if wxUSE_DRAG_AND_DROP + +class WXDLLEXPORT wxMetafileDataObject : public wxDataObjectSimple +{ +public: + // ctors + wxMetafileDataObject() : wxDataObjectSimple(wxDF_METAFILE) + { } + wxMetafileDataObject(const wxMetafile& metafile) + : wxDataObjectSimple(wxDF_METAFILE), m_metafile(metafile) { } + + // virtual functions which you may override if you want to provide data on + // demand only - otherwise, the trivial default versions will be used + virtual void SetMetafile(const wxMetafile& metafile) + { m_metafile = metafile; } + virtual wxMetafile GetMetafile() const + { return m_metafile; } + + // implement base class pure virtuals + virtual size_t GetDataSize() const; + virtual bool GetDataHere(void *buf) const; + virtual bool SetData(size_t len, const void *buf); + +protected: + wxMetafile m_metafile; +}; + +#endif // wxUSE_DRAG_AND_DROP + +#endif + // _WX_METAFIILE_H_ + diff --git a/Externals/wxWidgets/include/wx/msw/microwin.h b/Externals/wxWidgets/include/wx/msw/microwin.h new file mode 100644 index 0000000000..ef077b13ad --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/microwin.h @@ -0,0 +1,235 @@ +/* +///////////////////////////////////////////////////////////////////////////// +// Name: microwin.h +// Purpose: Extra implementation for MicroWindows +// Author: Julian Smart +// Created: 2001-05-31 +// RCS-ID: $Id: microwin.h 35650 2005-09-23 12:56:45Z MR $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// +*/ + +#ifndef _WX_MICROWIN_H_ +#define _WX_MICROWIN_H_ + +/* Implemented by microwin.cpp */ + +#ifdef __cplusplus +extern "C" { +#endif + +BOOL SetCursorPos(int x, int y); + +HCURSOR SetCursor(HCURSOR hCursor); + +/* Implemented with wrong number of args by MicroWindows */ +/* so we need to use a different name */ +int GetScrollPosWX (HWND hWnd, int iSBar); + +BOOL ScrollWindow(HWND, int xAmount, int yAmount, + CONST RECT* lpRect, CONST RECT* lpClipRect); + +HWND WindowFromPoint(POINT pt); +SHORT GetKeyState(int nVirtKey); +HWND SetParent(HWND hWndChild, HWND hWndNewParent); +VOID DragAcceptFiles(HWND, BOOL); +BOOL IsDialogMessage(HWND hWnd, MSG* msg); +DWORD GetMessagePos(VOID); +BOOL IsIconic(HWND hWnd); +int SetMapMode(HDC hDC, int mode); +int GetMapMode(HDC hDC); +HCURSOR LoadCursor(HINSTANCE hInst, int cursor); +DWORD GetModuleFileName(HINSTANCE hInst, LPSTR name, DWORD sz); +VOID DestroyIcon(HICON hIcon); +COLORREF GetTextColor(HDC hdc); +COLORREF GetBkColor(HDC hdc); +HPALETTE SelectPalette(HDC hdc, HPALETTE hPalette, BOOL b); +BOOL IntersectClipRect(HDC hdc, int x, int y, + int w, int h); +BOOL GetClipBox(HDC hdc, RECT* rect); +BOOL DrawIconEx(HDC hdc, int x, int y, HICON hIcon, int w, int h, UINT istepIfAniCur, HBRUSH hbrFlickerFreeDraw, UINT diFlags); +BOOL SetViewportExtEx(HDC hdc, int x, int y, LPSIZE lpSize); +BOOL SetViewportOrgEx(HDC hdc, int x, int y, LPPOINT lpPoint); +BOOL SetWindowExtEx(HDC hdc, int x, int y, LPSIZE lpSize); +BOOL SetWindowOrgEx(HDC hdc, int x, int y, LPPOINT lpSize); +BOOL ExtFloodFill(HDC hdc, int x, int y, COLORREF col, UINT flags); +int SetPolyFillMode(HDC hdc, int mode); +BOOL RoundRect(HDC hdc, int left, int top, int right, int bottom, int r1, int r2); +BOOL MaskBlt(HDC hdc, int x, int y, int w, int h, + HDC hDCSource, int xSrc, int ySrc, HBITMAP hBitmapMask, int xMask, int yMask, DWORD rop); +UINT RealizePalette(HDC hDC); +BOOL SetBrushOrgEx(HDC hdc, int xOrigin, int yOrigin, LPPOINT lpPoint); +int GetObject(HGDIOBJ hObj, int sz, LPVOID logObj); + +/* For some reason these aren't defined in the headers */ +BOOL EnableScrollBar (HWND hWnd, int iSBar, BOOL bEnable) ; +BOOL GetScrollPos (HWND hWnd, int iSBar, int* pPos); +BOOL GetScrollRange (HWND hWnd, int iSBar, int* pMinPos, int* pMaxPos); +BOOL SetScrollPos (HWND hWnd, int iSBar, int iNewPos); +BOOL SetScrollRange (HWND hWnd, int iSBar, int iMinPos, int iMaxPos); +BOOL SetScrollInfo (HWND hWnd, int iSBar, + LPCSCROLLINFO lpsi, BOOL fRedraw); +BOOL GetScrollInfo(HWND hWnd, int iSBar, LPSCROLLINFO lpsi); +BOOL ShowScrollBar (HWND hWnd, int iSBar, BOOL bShow); +HBITMAP WINAPI +CreateBitmap( int width, int height, int nPlanes, int bPP, LPCVOID lpData); + +#ifdef __cplusplus +} +#endif + +/* + * Key State Masks for Mouse Messages + */ +#ifndef MK_LBUTTON +#define MK_LBUTTON 0x0001 +#define MK_RBUTTON 0x0002 +#define MK_SHIFT 0x0004 +#define MK_CONTROL 0x0008 +#define MK_MBUTTON 0x0010 +#endif + +/* + * DrawIcon flags + */ + +#ifndef DI_MASK +#define DI_MASK 0x0001 +#define DI_IMAGE 0x0002 +#define DI_NORMAL 0x0003 +#define DI_COMPAT 0x0004 +#define DI_DEFAULTSIZE 0x0008 +#endif + +/* TODO: May have to fake these message */ +#ifndef WM_INITDIALOG +#define WM_INITDIALOG 0x0110 +#endif +#ifndef WM_QUERYENDSESSION +#define WM_QUERYENDSESSION 0x0011 +#endif +#ifndef WM_ENDSESSION +#define WM_ENDSESSION 0x0016 +#endif +#ifndef WM_SETCURSOR +#define WM_SETCURSOR 0x0020 +#endif +#ifndef WM_GETMINMAXINFO +#define WM_GETMINMAXINFO 0x0024 +typedef struct tagMINMAXINFO { + POINT ptReserved; + POINT ptMaxSize; + POINT ptMaxPosition; + POINT ptMinTrackSize; + POINT ptMaxTrackSize; +} MINMAXINFO, *PMINMAXINFO, *LPMINMAXINFO; + +#endif +#ifndef WM_SYSCOMMAND +#define WM_SYSCOMMAND 0x0112 +#endif +#ifndef WM_SYSCOLORCHANGE +#define WM_SYSCOLORCHANGE 0x0015 +#endif +#ifndef WM_QUERYNEWPALETTE +#define WM_QUERYNEWPALETTE 0x030F +#endif +#ifndef WM_PALETTEISCHANGING +#define WM_PALETTEISCHANGING 0x0310 +#endif +#ifndef WM_PALETTECHANGED +#define WM_PALETTECHANGED 0x0311 +#endif +#ifndef WM_NOTIFY +#define WM_NOTIFY 0x004E +#endif +#ifndef WM_DROPFILES +#define WM_DROPFILES 0x0233 +#endif + +#ifndef PALETTERGB +#define PALETTERGB RGB +#endif + +#ifndef MM_TEXT +#define MM_TEXT 1 +#define MM_LOMETRIC 2 +#define MM_HIMETRIC 3 +#define MM_LOENGLISH 4 +#define MM_HIENGLISH 5 +#define MM_TWIPS 6 +#define MM_ISOTROPIC 7 +#define MM_ANISOTROPIC 8 +#endif + +#ifndef SC_MAXIMIZE +#define SC_MINIMIZE 0xF020 +#define SC_MAXIMIZE 0xF030 +#endif + +// TODO: all of them +#ifndef IDC_ARROW +#define IDC_ARROW 1 +#endif + +/* + * Standard Cursor IDs + */ +#ifndef MAKEINTRESOURCE +#define MAKEINTRESOURCE(r) r +#endif + +#ifndef IDC_ARROW +#define IDC_ARROW MAKEINTRESOURCE(32512) +#define IDC_IBEAM MAKEINTRESOURCE(32513) +#define IDC_WAIT MAKEINTRESOURCE(32514) +#define IDC_CROSS MAKEINTRESOURCE(32515) +#define IDC_UPARROW MAKEINTRESOURCE(32516) +#define IDC_SIZE MAKEINTRESOURCE(32640) /* OBSOLETE: use IDC_SIZEALL */ +#define IDC_ICON MAKEINTRESOURCE(32641) /* OBSOLETE: use IDC_ARROW */ +#define IDC_SIZENWSE MAKEINTRESOURCE(32642) +#define IDC_SIZENESW MAKEINTRESOURCE(32643) +#define IDC_SIZEWE MAKEINTRESOURCE(32644) +#define IDC_SIZENS MAKEINTRESOURCE(32645) +#define IDC_SIZEALL MAKEINTRESOURCE(32646) +#define IDC_NO MAKEINTRESOURCE(32648) /* not in win3.1 */ +#if(WINVER >= 0x0500) +#define IDC_HAND MAKEINTRESOURCE(32649) +#endif /* WINVER >= 0x0500 */ +#define IDC_APPSTARTING MAKEINTRESOURCE(32650) /* not in win3.1 */ +#if(WINVER >= 0x0400) +#define IDC_HELP MAKEINTRESOURCE(32651) +#endif /* WINVER >= 0x0400 */ +#endif + +/* ExtFloodFill style flags */ +#define FLOODFILLBORDER 0 +#define FLOODFILLSURFACE 1 + +/* PolyFill() Modes */ +#define ALTERNATE 1 +#define WINDING 2 +#define POLYFILL_LAST 2 + +/* Quaternary raster codes */ +#define MAKEROP4(fore,back) (DWORD)((((back) << 8) & 0xFF000000) | (fore)) + +/* Device Parameters for GetDeviceCaps() */ +#define DRIVERVERSION 0 /* Device driver version */ +#define TECHNOLOGY 2 /* Device classification */ +#define HORZSIZE 4 /* Horizontal size in millimeters */ +#define VERTSIZE 6 /* Vertical size in millimeters */ + +/* Ternary raster operations */ +/* Now defined by MicroWindows */ +#if 0 +#define DSTINVERT (DWORD)0x00550009 /* dest = (NOT dest) */ +#define WHITENESS (DWORD)0x00FF0062 /* dest = WHITE */ +#define SRCERASE (DWORD)0x00440328 /* dest = source AND (NOT dest ) */ +#define MERGEPAINT (DWORD)0x00BB0226 /* dest = (NOT source) OR dest */ +#define SRCPAINT (DWORD)0x00EE0086 /* dest = source OR dest */ +#define NOTSRCCOPY (DWORD)0x00330008 /* dest = (NOT source) */ +#endif + +#endif /* _WX_MICROWIN_H_ */ diff --git a/Externals/wxWidgets/include/wx/msw/mimetype.h b/Externals/wxWidgets/include/wx/msw/mimetype.h new file mode 100644 index 0000000000..9052d07dcb --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/mimetype.h @@ -0,0 +1,122 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/mimetype.h +// Purpose: classes and functions to manage MIME types +// Author: Vadim Zeitlin +// Modified by: +// Created: 23.09.98 +// RCS-ID: $Id: mimetype.h 35650 2005-09-23 12:56:45Z MR $ +// Copyright: (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> +// Licence: wxWindows licence (part of wxExtra library) +///////////////////////////////////////////////////////////////////////////// + +#ifndef _MIMETYPE_IMPL_H +#define _MIMETYPE_IMPL_H + +#include "wx/defs.h" + +#if wxUSE_MIMETYPE + +#include "wx/mimetype.h" + +// ---------------------------------------------------------------------------- +// wxFileTypeImpl is the MSW version of wxFileType, this is a private class +// and is never used directly by the application +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxFileTypeImpl +{ +public: + // ctor + wxFileTypeImpl() { } + + // one of these Init() function must be called (ctor can't take any + // arguments because it's common) + + // initialize us with our file type name and extension - in this case + // we will read all other data from the registry + void Init(const wxString& strFileType, const wxString& ext); + + // implement accessor functions + bool GetExtensions(wxArrayString& extensions); + bool GetMimeType(wxString *mimeType) const; + bool GetMimeTypes(wxArrayString& mimeTypes) const; + bool GetIcon(wxIconLocation *iconLoc) const; + bool GetDescription(wxString *desc) const; + bool GetOpenCommand(wxString *openCmd, + const wxFileType::MessageParameters& params) const; + bool GetPrintCommand(wxString *printCmd, + const wxFileType::MessageParameters& params) const; + + size_t GetAllCommands(wxArrayString * verbs, wxArrayString * commands, + const wxFileType::MessageParameters& params) const; + + bool Unassociate(); + + // set an arbitrary command, ask confirmation if it already exists and + // overwriteprompt is true + bool SetCommand(const wxString& cmd, + const wxString& verb, + bool overwriteprompt = true); + + bool SetDefaultIcon(const wxString& cmd = wxEmptyString, int index = 0); + + // this is called by Associate + bool SetDescription (const wxString& desc); + +private: + // helper function: reads the command corresponding to the specified verb + // from the registry (returns an empty string if not found) + wxString GetCommand(const wxChar *verb) const; + + // get the registry path for the given verb + wxString GetVerbPath(const wxString& verb) const; + + // check that the registry key for our extension exists, create it if it + // doesn't, return false if this failed + bool EnsureExtKeyExists(); + + wxString m_strFileType, // may be empty + m_ext; + + // these methods are not publicly accessible (as wxMimeTypesManager + // doesn't know about them), and should only be called by Unassociate + + bool RemoveOpenCommand(); + bool RemoveCommand(const wxString& verb); + bool RemoveMimeType(); + bool RemoveDefaultIcon(); + bool RemoveDescription(); +}; + +class WXDLLIMPEXP_BASE wxMimeTypesManagerImpl +{ +public: + // nothing to do here, we don't load any data but just go and fetch it from + // the registry when asked for + wxMimeTypesManagerImpl() { } + + // implement containing class functions + wxFileType *GetFileTypeFromExtension(const wxString& ext); + wxFileType *GetOrAllocateFileTypeFromExtension(const wxString& ext); + wxFileType *GetFileTypeFromMimeType(const wxString& mimeType); + + size_t EnumAllFileTypes(wxArrayString& mimetypes); + + // this are NOPs under Windows + bool ReadMailcap(const wxString& WXUNUSED(filename), bool WXUNUSED(fallback) = true) + { return true; } + bool ReadMimeTypes(const wxString& WXUNUSED(filename)) + { return true; } + + // create a new filetype association + wxFileType *Associate(const wxFileTypeInfo& ftInfo); + + // create a new filetype with the given name and extension + wxFileType *CreateFileType(const wxString& filetype, const wxString& ext); +}; + +#endif // wxUSE_MIMETYPE + +#endif + //_MIMETYPE_IMPL_H + diff --git a/Externals/wxWidgets/include/wx/msw/minifram.h b/Externals/wxWidgets/include/wx/msw/minifram.h new file mode 100644 index 0000000000..d2e23d9cf7 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/minifram.h @@ -0,0 +1,52 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/minifram.h +// Purpose: wxMiniFrame class +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: minifram.h 35650 2005-09-23 12:56:45Z MR $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MINIFRAM_H_ +#define _WX_MINIFRAM_H_ + +#include "wx/frame.h" + +class WXDLLEXPORT wxMiniFrame : public wxFrame +{ +public: + wxMiniFrame() { } + + bool Create(wxWindow *parent, + wxWindowID id, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxCAPTION | wxCLIP_CHILDREN | wxRESIZE_BORDER, + const wxString& name = wxFrameNameStr) + { + return wxFrame::Create(parent, id, title, pos, size, + style | + wxFRAME_TOOL_WINDOW | + (parent ? wxFRAME_FLOAT_ON_PARENT : 0), name); + } + + wxMiniFrame(wxWindow *parent, + wxWindowID id, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxCAPTION | wxCLIP_CHILDREN | wxRESIZE_BORDER, + const wxString& name = wxFrameNameStr) + { + Create(parent, id, title, pos, size, style, name); + } + +protected: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxMiniFrame) +}; + +#endif + // _WX_MINIFRAM_H_ diff --git a/Externals/wxWidgets/include/wx/msw/missing.h b/Externals/wxWidgets/include/wx/msw/missing.h new file mode 100644 index 0000000000..c84134bdf6 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/missing.h @@ -0,0 +1,495 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/missing.h +// Purpose: Declarations for parts of the Win32 SDK that are missing in +// the versions that come with some compilers +// Created: 2002/04/23 +// RCS-ID: $Id: missing.h 48436 2007-08-28 19:26:16Z JS $ +// Copyright: (c) 2002 Mattia Barbon +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MISSING_H_ +#define _WX_MISSING_H_ + +/* + * The following are required for VC++ 6. + */ + +// Needed by cursor.cpp +#ifndef IDC_HAND + #define IDC_HAND MAKEINTRESOURCE(32649) +#endif + +// Needed by strconv.cpp +#ifndef WC_NO_BEST_FIT_CHARS + #define WC_NO_BEST_FIT_CHARS 0x400 +#endif + +#ifndef WM_CONTEXTMENU + #define WM_CONTEXTMENU 0x007B +#endif + +// Needed by toplevel.cpp +#ifndef WM_UPDATEUISTATE + #define WM_UPDATEUISTATE 0x0128 +#endif + +#ifndef WM_CHANGEUISTATE + #define WM_CHANGEUISTATE 0x0127 +#endif + +#ifndef WM_PRINTCLIENT + #define WM_PRINTCLIENT 0x318 +#endif + +// Needed by toplevel.cpp +#ifndef UIS_SET + #define UIS_SET 1 + #define UIS_CLEAR 2 + #define UIS_INITIALIZE 3 +#endif + +#ifndef UISF_HIDEFOCUS + #define UISF_HIDEFOCUS 1 +#endif + +#ifndef UISF_HIDEACCEL + #define UISF_HIDEACCEL 2 +#endif + +#ifndef OFN_EXPLORER + #define OFN_EXPLORER 0x00080000 +#endif + +#ifndef OFN_ENABLESIZING + #define OFN_ENABLESIZING 0x00800000 +#endif + +// Needed by window.cpp +#if wxUSE_MOUSEWHEEL + #ifndef WM_MOUSEWHEEL + #define WM_MOUSEWHEEL 0x020A + #endif + #ifndef WHEEL_DELTA + #define WHEEL_DELTA 120 + #endif + #ifndef SPI_GETWHEELSCROLLLINES + #define SPI_GETWHEELSCROLLLINES 104 + #endif +#endif // wxUSE_MOUSEWHEEL + +// Needed by window.cpp +#ifndef VK_OEM_1 + #define VK_OEM_1 0xBA + #define VK_OEM_2 0xBF + #define VK_OEM_3 0xC0 + #define VK_OEM_4 0xDB + #define VK_OEM_5 0xDC + #define VK_OEM_6 0xDD + #define VK_OEM_7 0xDE +#endif + +#ifndef VK_OEM_COMMA + #define VK_OEM_PLUS 0xBB + #define VK_OEM_COMMA 0xBC + #define VK_OEM_MINUS 0xBD + #define VK_OEM_PERIOD 0xBE +#endif + +#ifndef SM_TABLETPC + #define SM_TABLETPC 86 +#endif + +#ifndef INKEDIT_CLASS +# define INKEDIT_CLASSW L"INKEDIT" +# ifdef UNICODE +# define INKEDIT_CLASS INKEDIT_CLASSW +# else +# define INKEDIT_CLASS "INKEDIT" +# endif +#endif + +#ifndef EM_SETINKINSERTMODE +# define EM_SETINKINSERTMODE (WM_USER + 0x0204) +#endif + +#ifndef EM_SETUSEMOUSEFORINPUT +#define EM_SETUSEMOUSEFORINPUT (WM_USER + 0x224) +#endif + +#ifndef TPM_RECURSE +#define TPM_RECURSE 1 +#endif + + +#ifndef WS_EX_LAYOUTRTL +#define WS_EX_LAYOUTRTL 0x00400000 +#endif + +#ifndef WS_EX_COMPOSITED +#define WS_EX_COMPOSITED 0x02000000L +#endif + +#ifndef WS_EX_LAYERED +#define WS_EX_LAYERED 0x00080000 +#endif + +#ifndef LWA_ALPHA +#define LWA_ALPHA 2 +#endif + +#if defined __VISUALC__ && __VISUALC__ <= 1200 && !defined MIIM_BITMAP +#define MIIM_STRING 0x00000040 +#define MIIM_BITMAP 0x00000080 +#define MIIM_FTYPE 0x00000100 +#define HBMMENU_CALLBACK ((HBITMAP) -1) +typedef struct tagMENUINFO +{ + DWORD cbSize; + DWORD fMask; + DWORD dwStyle; + UINT cyMax; + HBRUSH hbrBack; + DWORD dwContextHelpID; + DWORD dwMenuData; +} MENUINFO, FAR *LPMENUINFO; +struct wxMENUITEMINFO_ +{ + UINT cbSize; + UINT fMask; + UINT fType; + UINT fState; + UINT wID; + HMENU hSubMenu; + HBITMAP hbmpChecked; + HBITMAP hbmpUnchecked; + DWORD dwItemData; + LPTSTR dwTypeData; + UINT cch; + HBITMAP hbmpItem; +}; +#else +#define wxMENUITEMINFO_ MENUITEMINFO +#endif + +/* + * The following are required for VC++ 5 when the PSDK is not available. + */ + +#if defined __VISUALC__ && __VISUALC__ <= 1100 + +#ifndef VER_NT_WORKSTATION + +typedef struct _OSVERSIONINFOEXA { + DWORD dwOSVersionInfoSize; + DWORD dwMajorVersion; + DWORD dwMinorVersion; + DWORD dwBuildNumber; + DWORD dwPlatformId; + CHAR szCSDVersion[128]; + WORD wServicePackMajor; + WORD wServicePackMinor; + WORD wSuiteMask; + BYTE wProductType; + BYTE wReserved; +} OSVERSIONINFOEXA, *POSVERSIONINFOEXA, *LPOSVERSIONINFOEXA; +typedef struct _OSVERSIONINFOEXW { + DWORD dwOSVersionInfoSize; + DWORD dwMajorVersion; + DWORD dwMinorVersion; + DWORD dwBuildNumber; + DWORD dwPlatformId; + WCHAR szCSDVersion[128]; + WORD wServicePackMajor; + WORD wServicePackMinor; + WORD wSuiteMask; + BYTE wProductType; + BYTE wReserved; +} OSVERSIONINFOEXW, *POSVERSIONINFOEXW, *LPOSVERSIONINFOEXW; + +#ifdef UNICODE +typedef OSVERSIONINFOW OSVERSIONINFO,*POSVERSIONINFO,*LPOSVERSIONINFO; +typedef OSVERSIONINFOEXW OSVERSIONINFOEX,*POSVERSIONINFOEX,*LPOSVERSIONINFOEX; +#else +typedef OSVERSIONINFOA OSVERSIONINFO,*POSVERSIONINFO,*LPOSVERSIONINFO; +typedef OSVERSIONINFOEXA OSVERSIONINFOEX,*POSVERSIONINFOEX,*LPOSVERSIONINFOEX; +#endif + +#endif // defined VER_NT_WORKSTATION + +#ifndef CP_SYMBOL + #define CP_SYMBOL 42 +#endif + +// NMLVCUSTOMDRAW originally didn't have the iSubItem member. It was added +// with IE4, as was IPN_FIRST which is used as a test :-(. +// +#ifndef IPN_FIRST + +typedef struct wxtagNMLVCUSTOMDRAW_ { + NMCUSTOMDRAW nmcd; + COLORREF clrText; + COLORREF clrTextBk; + int iSubItem; +} wxNMLVCUSTOMDRAW_, *wxLPNMLVCUSTOMDRAW_; + +#define NMLVCUSTOMDRAW wxNMLVCUSTOMDRAW_ +#define LPNMLVCUSTOMDRAW wxLPNMLVCUSTOMDRAW_ + +#endif // defined IPN_FIRST + +#endif // defined __VISUALC__ && __VISUALC__ <= 1100 + +// ---------------------------------------------------------------------------- +// ListView common control +// Needed by listctrl.cpp +// ---------------------------------------------------------------------------- + +#ifndef LVS_EX_FULLROWSELECT + #define LVS_EX_FULLROWSELECT 0x00000020 +#endif + +#ifndef LVS_EX_LABELTIP + #define LVS_EX_LABELTIP 0x00004000 +#endif + +#ifndef LVS_EX_SUBITEMIMAGES + #define LVS_EX_SUBITEMIMAGES 0x00000002 +#endif + +#ifndef HDN_GETDISPINFOW + #define HDN_GETDISPINFOW (HDN_FIRST-29) +#endif + + /* + * In addition to the above, the following are required for several compilers. + */ + +#if !defined(CCS_VERT) +#define CCS_VERT 0x00000080L +#endif + +#if !defined(CCS_RIGHT) +#define CCS_RIGHT (CCS_VERT|CCS_BOTTOM) +#endif + +#if !defined(TB_SETDISABLEDIMAGELIST) + #define TB_SETDISABLEDIMAGELIST (WM_USER + 54) +#endif // !defined(TB_SETDISABLEDIMAGELIST) + +#ifndef CFM_BACKCOLOR + #define CFM_BACKCOLOR 0x04000000 +#endif + +#ifndef HANGUL_CHARSET + #define HANGUL_CHARSET 129 +#endif + +#ifndef CCM_SETUNICODEFORMAT + #define CCM_SETUNICODEFORMAT 8197 +#endif + +// ---------------------------------------------------------------------------- +// Tree control +// ---------------------------------------------------------------------------- + +#ifndef TV_FIRST + #define TV_FIRST 0x1100 +#endif + +#ifndef TVS_FULLROWSELECT + #define TVS_FULLROWSELECT 0x1000 +#endif + +#ifndef TVM_SETBKCOLOR + #define TVM_SETBKCOLOR (TV_FIRST + 29) + #define TVM_SETTEXTCOLOR (TV_FIRST + 30) +#endif + + /* + * The following are required for BC++ 5.5 (none at present.) + */ + + /* + * The following are specifically required for Digital Mars C++ + */ + +#ifdef __DMC__ + +typedef struct _OSVERSIONINFOEX { + DWORD dwOSVersionInfoSize; + DWORD dwMajorVersion; + DWORD dwMinorVersion; + DWORD dwBuildNumber; + DWORD dwPlatformId; + TCHAR szCSDVersion[ 128 ]; + WORD wServicePackMajor; + WORD wServicePackMinor; + WORD wSuiteMask; + BYTE wProductType; + BYTE wReserved; +} OSVERSIONINFOEX; + +#ifndef _TrackMouseEvent + #define _TrackMouseEvent TrackMouseEvent +#endif + +#ifndef LVM_SETEXTENDEDLISTVIEWSTYLE + #define LVM_SETEXTENDEDLISTVIEWSTYLE (0x1000 + 54) +#endif + +#ifndef LVM_GETSUBITEMRECT + #define LVM_GETSUBITEMRECT (0x1000 + 56) +#endif + +#ifndef LVCF_IMAGE + #define LVCF_IMAGE 0x0010 +#endif + +#ifndef Header_GetItemRect + #define Header_GetItemRect(w,i,r) \ + (BOOL)SendMessage((w),HDM_GETITEMRECT,(WPARAM)(i),(LPARAM)(r)) +#endif + +#ifndef HDM_GETITEMRECT + #define HDM_GETITEMRECT (HDM_FIRST+7) +#endif + +#ifndef ListView_GetHeader + #define ListView_GetHeader(w) (HWND)SendMessage((w),LVM_GETHEADER,0,0) +#endif + +#ifndef ListView_GetSubItemRect + #define ListView_GetSubItemRect(w, i, s, c, p) (HWND)SendMessage(w,LVM_GETSUBITEMRECT,i, ((p) ? ((((LPRECT)(p))->top = s), (((LPRECT)(p))->left = c), (LPARAM)(p)) : (LPARAM)(LPRECT)NULL)) +#endif + +#ifndef LVM_GETHEADER + #define LVM_GETHEADER (LVM_FIRST+31) +#endif + +#ifndef LVSICF_NOSCROLL + #define LVSICF_NOINVALIDATEALL 0x0001 + #define LVSICF_NOSCROLL 0x0002 +#endif + +#ifndef CP_SYMBOL + #define CP_SYMBOL 42 +#endif + +// ---------------------------------------------------------------------------- +// wxDisplay +// ---------------------------------------------------------------------------- + +// The windows headers with Digital Mars lack some typedefs. +// typedef them as my_XXX and then #define to rename to XXX in case +// a newer version of Digital Mars fixes the headers +// (or up to date PSDK is in use with older version) +// also we use any required definition (MONITOR_DEFAULTTONULL) to recognize +// whether whole missing block needs to be included + +#ifndef MONITOR_DEFAULTTONULL + + #define HMONITOR_DECLARED + DECLARE_HANDLE(HMONITOR); + typedef BOOL(CALLBACK* my_MONITORENUMPROC)(HMONITOR,HDC,LPRECT,LPARAM); + #define MONITORENUMPROC my_MONITORENUMPROC + typedef struct my_tagMONITORINFO { + DWORD cbSize; + RECT rcMonitor; + RECT rcWork; + DWORD dwFlags; + } my_MONITORINFO,*my_LPMONITORINFO; + #define MONITORINFO my_MONITORINFO + #define LPMONITORINFO my_LPMONITORINFO + + typedef struct my_MONITORINFOEX : public my_tagMONITORINFO + { + TCHAR szDevice[CCHDEVICENAME]; + } my_MONITORINFOEX, *my_LPMONITORINFOEX; + #define MONITORINFOEX my_MONITORINFOEX + #define LPMONITORINFOEX my_LPMONITORINFOEX + + #ifndef MONITOR_DEFAULTTONULL + #define MONITOR_DEFAULTTONULL 0 + #endif // MONITOR_DEFAULTTONULL + + #ifndef MONITORINFOF_PRIMARY + #define MONITORINFOF_PRIMARY 1 + #endif // MONITORINFOF_PRIMARY + + #ifndef DDENUM_ATTACHEDSECONDARYDEVICES + #define DDENUM_ATTACHEDSECONDARYDEVICES 1 + #endif + +#endif // MONITOR_DEFAULTTONULL + +// ---------------------------------------------------------------------------- +// Tree control +// ---------------------------------------------------------------------------- + +#ifndef TVIS_FOCUSED + #define TVIS_FOCUSED 0x0001 +#endif + +#ifndef TVS_CHECKBOXES + #define TVS_CHECKBOXES 0x0100 +#endif + +#ifndef TVITEM + #define TVITEM TV_ITEM +#endif + +#endif + // DMC++ + + /* + * The following are specifically required for OpenWatcom C++ (none at present) + */ + +#if defined(__WATCOMC__) +#endif + + /* + * The following are specifically required for MinGW (none at present) + */ + +#if defined (__MINGW32__) + +#if !wxCHECK_W32API_VERSION(3,1) + +#include <windows.h> +#include "wx/msw/winundef.h" + +typedef struct +{ + RECT rgrc[3]; + WINDOWPOS *lppos; +} NCCALCSIZE_PARAMS, *LPNCCALCSIZE_PARAMS; + +#endif + +#endif + + /* + * In addition to the declarations for VC++, the following are required for WinCE + */ + +#ifdef __WXWINCE__ + #include "wx/msw/wince/missing.h" +#endif + + /* + * The following are specifically required for Wine + */ + +#ifdef __WINE__ + #ifndef ENUM_CURRENT_SETTINGS + #define ENUM_CURRENT_SETTINGS ((DWORD)-1) + #endif + #ifndef BROADCAST_QUERY_DENY + #define BROADCAST_QUERY_DENY 1112363332 + #endif +#endif // defined __WINE__ + +#endif + // _WX_MISSING_H_ diff --git a/Externals/wxWidgets/include/wx/msw/msgdlg.h b/Externals/wxWidgets/include/wx/msw/msgdlg.h new file mode 100644 index 0000000000..690678b8d9 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/msgdlg.h @@ -0,0 +1,42 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/msgdlg.h +// Purpose: wxMessageDialog class +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: msgdlg.h 37164 2006-01-26 17:20:50Z ABX $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MSGBOXDLG_H_ +#define _WX_MSGBOXDLG_H_ + +#include "wx/defs.h" +#include "wx/dialog.h" + +/* + * Message box dialog + */ + +extern WXDLLEXPORT_DATA(const wxChar) wxMessageBoxCaptionStr[]; + +class WXDLLEXPORT wxMessageDialog: public wxDialog, public wxMessageDialogBase +{ +DECLARE_DYNAMIC_CLASS(wxMessageDialog) +protected: + wxString m_caption; + wxString m_message; + wxWindow * m_parent; +public: + wxMessageDialog(wxWindow *parent, const wxString& message, const wxString& caption = wxMessageBoxCaptionStr, + long style = wxOK|wxCENTRE, const wxPoint& pos = wxDefaultPosition); + + int ShowModal(void); + + DECLARE_NO_COPY_CLASS(wxMessageDialog) +}; + + +#endif + // _WX_MSGBOXDLG_H_ diff --git a/Externals/wxWidgets/include/wx/msw/mslu.h b/Externals/wxWidgets/include/wx/msw/mslu.h new file mode 100644 index 0000000000..83f4060d7a --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/mslu.h @@ -0,0 +1,23 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/mslu.h +// Purpose: MSLU-related declarations +// Author: Vaclav Slavik +// Modified by: Vadim Zeitlin to move out various functions to other files +// to fix header inter-dependencies +// Created: 2002/02/17 +// RCS-ID: $Id: mslu.h 42462 2006-10-26 19:06:51Z VZ $ +// Copyright: (c) 2002 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MSLU_H_ +#define _WX_MSLU_H_ + +#include "wx/defs.h" + +// Returns true if we are running under Unicode emulation in Win9x environment. +// Workaround hacks take effect only if this condition is met +// (NB: this function is needed even if !wxUSE_UNICODE_MSLU) +WXDLLIMPEXP_BASE bool wxUsingUnicowsDll(); + +#endif // _WX_MSLU_H_ diff --git a/Externals/wxWidgets/include/wx/msw/msvcrt.h b/Externals/wxWidgets/include/wx/msw/msvcrt.h new file mode 100644 index 0000000000..15c4dfbde4 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/msvcrt.h @@ -0,0 +1,69 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/msvcrt.h +// Purpose: macros to use some non-standard features of MS Visual C++ +// C run-time library +// Author: Vadim Zeitlin +// Modified by: +// Created: 31.01.1999 +// RCS-ID: $Id: msvcrt.h 42363 2006-10-24 23:19:12Z VZ $ +// Copyright: (c) Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// the goal of this file is to define wxCrtSetDbgFlag() macro which may be +// used like this: +// wxCrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF); +// to turn on memory leak checks for programs compiled with Microsoft Visual +// C++ (5.0+). The macro will expand to nothing under other compilers. + +#ifndef _MSW_MSVCRT_H_ +#define _MSW_MSVCRT_H_ + +// use debug CRT functions for memory leak detections in VC++ 5.0+ in debug +// builds +#undef wxUSE_VC_CRTDBG +#if defined(__WXDEBUG__) && defined(__VISUALC__) && (__VISUALC__ >= 1000) \ + && !defined(UNDER_CE) + // it doesn't combine well with wxWin own memory debugging methods + #if !wxUSE_GLOBAL_MEMORY_OPERATORS && !wxUSE_MEMORY_TRACING && !defined(__NO_VC_CRTDBG__) + #define wxUSE_VC_CRTDBG + #endif +#endif + +#ifdef wxUSE_VC_CRTDBG + // VC++ uses this macro as debug/release mode indicator + #ifndef _DEBUG + #define _DEBUG + #endif + + // Need to undef new if including crtdbg.h which may redefine new itself + #ifdef new + #undef new + #endif + + #include <stdlib.h> + #ifndef _CRTBLD + // Need when builded with pure MS SDK + #define _CRTBLD + #endif + + #include <crtdbg.h> + + #undef WXDEBUG_NEW + #define WXDEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__) + + // this define works around a bug with inline declarations of new, see + // + // http://support.microsoft.com/support/kb/articles/Q140/8/58.asp + // + // for the details + #define new WXDEBUG_NEW + + #define wxCrtSetDbgFlag(flag) \ + _CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | (flag)) +#else // !using VC CRT + #define wxCrtSetDbgFlag(flag) +#endif // wxUSE_VC_CRTDBG + +#endif // _MSW_MSVCRT_H_ + diff --git a/Externals/wxWidgets/include/wx/msw/notebook.h b/Externals/wxWidgets/include/wx/msw/notebook.h new file mode 100644 index 0000000000..5832c2d0e2 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/notebook.h @@ -0,0 +1,254 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/notebook.h +// Purpose: MSW/GTK compatible notebook (a.k.a. property sheet) +// Author: Robert Roebling +// Modified by: Vadim Zeitlin for Windows version +// RCS-ID: $Id: notebook.h 41797 2006-10-09 12:10:01Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _NOTEBOOK_H +#define _NOTEBOOK_H + +#if wxUSE_NOTEBOOK + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/control.h" + +// ---------------------------------------------------------------------------- +// wxNotebook +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxNotebookPageInfo : public wxObject +{ +public : + wxNotebookPageInfo() { m_page = NULL; m_imageId = -1; m_selected = false; } + virtual ~wxNotebookPageInfo() { } + + void Create(wxNotebookPage *page, + const wxString& text, + bool selected, + int imageId) + { + m_page = page; + m_text = text; + m_selected = selected; + m_imageId = imageId; + } + + wxNotebookPage* GetPage() const { return m_page; } + wxString GetText() const { return m_text; } + bool GetSelected() const { return m_selected; } + int GetImageId() const { return m_imageId; } + +private: + wxNotebookPage *m_page; + wxString m_text; + bool m_selected; + int m_imageId; + + DECLARE_DYNAMIC_CLASS(wxNotebookPageInfo) +}; + + +WX_DECLARE_EXPORTED_LIST(wxNotebookPageInfo, wxNotebookPageInfoList ); + +class WXDLLEXPORT wxNotebook : public wxNotebookBase +{ +public: + // ctors + // ----- + // default for dynamic class + wxNotebook(); + // the same arguments as for wxControl (@@@ any special styles?) + wxNotebook(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxNotebookNameStr); + // Create() function + bool Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxNotebookNameStr); + virtual ~wxNotebook(); + + // accessors + // --------- + // get number of pages in the dialog + virtual size_t GetPageCount() const; + + // set the currently selected page, return the index of the previously + // selected one (or -1 on error) + // NB: this function will _not_ generate wxEVT_NOTEBOOK_PAGE_xxx events + int SetSelection(size_t nPage); + // get the currently selected page + int GetSelection() const { return m_nSelection; } + + // changes selected page without sending events + int ChangeSelection(size_t nPage); + + // set/get the title of a page + bool SetPageText(size_t nPage, const wxString& strText); + wxString GetPageText(size_t nPage) const; + + // image list stuff: each page may have an image associated with it. All + // the images belong to an image list, so you have to + // 1) create an image list + // 2) associate it with the notebook + // 3) set for each page it's image + // associate image list with a control + void SetImageList(wxImageList* imageList); + + // sets/returns item's image index in the current image list + int GetPageImage(size_t nPage) const; + bool SetPageImage(size_t nPage, int nImage); + + // currently it's always 1 because wxGTK doesn't support multi-row + // tab controls + int GetRowCount() const; + + // control the appearance of the notebook pages + // set the size (the same for all pages) + void SetPageSize(const wxSize& size); + // set the padding between tabs (in pixels) + void SetPadding(const wxSize& padding); + + // operations + // ---------- + // remove all pages + bool DeleteAllPages(); + + // inserts a new page to the notebook (it will be deleted ny the notebook, + // don't delete it yourself). If bSelect, this page becomes active. + bool InsertPage(size_t nPage, + wxNotebookPage *pPage, + const wxString& strText, + bool bSelect = false, + int imageId = -1); + + void AddPageInfo( wxNotebookPageInfo* info ) { AddPage( info->GetPage() , info->GetText() , info->GetSelected() , info->GetImageId() ); } + const wxNotebookPageInfoList& GetPageInfos() const; + + // Windows-only at present. Also, you must use the wxNB_FIXEDWIDTH + // style. + void SetTabSize(const wxSize& sz); + + // hit test + virtual int HitTest(const wxPoint& pt, long *flags = NULL) const; + + // calculate the size of the notebook from the size of its page + virtual wxSize CalcSizeFromPage(const wxSize& sizePage) const; + + // callbacks + // --------- + void OnSize(wxSizeEvent& event); + void OnSelChange(wxNotebookEvent& event); + void OnNavigationKey(wxNavigationKeyEvent& event); + + // base class virtuals + // ------------------- + + virtual bool MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result); + virtual bool MSWOnScroll(int orientation, WXWORD nSBCode, + WXWORD pos, WXHWND control); + +#if wxUSE_CONSTRAINTS + virtual void SetConstraintSizes(bool recurse = true); + virtual bool DoPhase(int nPhase); +#endif // wxUSE_CONSTRAINTS + + // Attempts to get colour for UX theme page background + wxColour GetThemeBackgroundColour() const; + + // implementation only + // ------------------- + +#if wxUSE_UXTHEME + virtual bool SetBackgroundColour(const wxColour& colour) + { + if ( !wxNotebookBase::SetBackgroundColour(colour) ) + return false; + + UpdateBgBrush(); + + return true; + } + + // return the themed brush for painting our children + virtual WXHBRUSH MSWGetBgBrushForChild(WXHDC hDC, WXHWND hWnd); + + // draw child background + virtual bool MSWPrintChild(WXHDC hDC, wxWindow *win); +#endif // wxUSE_UXTHEME + + // translate wxWin styles to the Windows ones + virtual WXDWORD MSWGetStyle(long flags, WXDWORD *exstyle = NULL) const; + +protected: + // common part of all ctors + void Init(); + + // hides the currently shown page and shows the given one (if not -1) and + // updates m_nSelection accordingly + void UpdateSelection(int selNew); + + // remove one page from the notebook, without deleting + virtual wxNotebookPage *DoRemovePage(size_t nPage); + + // get the page rectangle for the current notebook size + // + // returns empty rectangle if an error occurs, do test for it + wxRect GetPageSize() const; + + // set the size of the given page to fit in the notebook + void AdjustPageSize(wxNotebookPage *page); + +#if wxUSE_UXTHEME + // gets the bitmap of notebook background and returns a brush from it + WXHBRUSH QueryBgBitmap(); + + // creates the brush to be used for drawing the tab control background + void UpdateBgBrush(); + + // common part of QueryBgBitmap() and MSWPrintChild() + // + // if child == NULL, draw background for the entire notebook itself + bool DoDrawBackground(WXHDC hDC, wxWindow *child = NULL); +#endif // wxUSE_UXTHEME + + // these function are only used for reducing flicker on notebook resize and + // we don't need to do this for WinCE +#ifndef __WXWINCE__ + void OnEraseBackground(wxEraseEvent& event); + void OnPaint(wxPaintEvent& event); + + // true if we have already subclassed our updown control + bool m_hasSubclassedUpdown; +#endif // __WXWINCE__ + + // the current selection (-1 if none) + int m_nSelection; + + wxNotebookPageInfoList m_pageInfos; + +#if wxUSE_UXTHEME + // background brush used to paint the tab control + WXHBRUSH m_hbrBackground; +#endif // wxUSE_UXTHEME + + + DECLARE_DYNAMIC_CLASS_NO_COPY(wxNotebook) + DECLARE_EVENT_TABLE() +}; + +#endif // wxUSE_NOTEBOOK + +#endif // _NOTEBOOK_H diff --git a/Externals/wxWidgets/include/wx/msw/ole/access.h b/Externals/wxWidgets/include/wx/msw/ole/access.h new file mode 100644 index 0000000000..5f3e28b007 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/ole/access.h @@ -0,0 +1,68 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: ole/access.h +// Purpose: declaration of the wxAccessible class +// Author: Julian Smart +// Modified by: +// Created: 2003-02-12 +// RCS-ID: $Id: access.h 35650 2005-09-23 12:56:45Z MR $ +// Copyright: (c) 2003 Julian Smart +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_ACCESS_H_ +#define _WX_ACCESS_H_ + +#if wxUSE_ACCESSIBILITY + +// ---------------------------------------------------------------------------- +// forward declarations +// ---------------------------------------------------------------------------- + +class wxIAccessible; +class WXDLLEXPORT wxWindow; + +// ---------------------------------------------------------------------------- +// macros +// ---------------------------------------------------------------------------- + +// ---------------------------------------------------------------------------- +// wxAccessible implements accessibility behaviour. +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxAccessible : public wxAccessibleBase +{ +public: + wxAccessible(wxWindow *win = NULL); + virtual ~wxAccessible(); + +// Overridables + +// Accessors + + // Returns the wxIAccessible pointer + wxIAccessible* GetIAccessible() { return m_pIAccessible; } + + // Returns the IAccessible standard interface pointer + void* GetIAccessibleStd() ; + +// Operations + + // Sends an event when something changes in an accessible object. + static void NotifyEvent(int eventType, wxWindow* window, wxAccObject objectType, + int objectId); + +protected: + void Init(); + +private: + wxIAccessible * m_pIAccessible; // the pointer to COM interface + void* m_pIAccessibleStd; // the pointer to the standard COM interface, + // for default processing + + DECLARE_NO_COPY_CLASS(wxAccessible) +}; + +#endif //wxUSE_ACCESSIBILITY + +#endif //_WX_ACCESS_H_ + diff --git a/Externals/wxWidgets/include/wx/msw/ole/activex.h b/Externals/wxWidgets/include/wx/msw/ole/activex.h new file mode 100644 index 0000000000..20de45c2dd --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/ole/activex.h @@ -0,0 +1,221 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/ole/activex.h +// Purpose: wxActiveXContainer class +// Author: Ryan Norton <wxprojects@comcast.net> +// Modified by: +// Created: 8/18/05 +// RCS-ID: $Id: activex.h 41793 2006-10-09 09:32:08Z ABX $ +// Copyright: (c) Ryan Norton +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// Definitions +// ============================================================================ + +#ifndef _WX_MSW_OLE_ACTIVEXCONTAINER_H_ +#define _WX_MSW_OLE_ACTIVEXCONTAINER_H_ + +#if wxUSE_ACTIVEX + +//--------------------------------------------------------------------------- +// wx includes +//--------------------------------------------------------------------------- + +#include "wx/msw/ole/oleutils.h" // wxBasicString &c +#include "wx/msw/ole/uuid.h" +#include "wx/window.h" +#include "wx/variant.h" + +//--------------------------------------------------------------------------- +// MSW COM includes +//--------------------------------------------------------------------------- +#include <oleidl.h> +#include <olectl.h> + +#if !defined(__WXWINCE__) || defined(__WINCE_STANDARDSDK__) +#include <exdisp.h> +#endif + +#include <docobj.h> + +#ifndef STDMETHOD + #define STDMETHOD(funcname) virtual HRESULT wxSTDCALL funcname +#endif + +// +// These defines are from another ole header - but its not in the +// latest sdk. Also the ifndef DISPID_READYSTATE is here because at +// least on my machine with the latest sdk olectl.h defines these 3 +// +#ifndef DISPID_READYSTATE + #define DISPID_READYSTATE (-525) + #define DISPID_READYSTATECHANGE (-609) + #define DISPID_AMBIENT_TRANSFERPRIORITY (-728) +#endif + +#define DISPID_AMBIENT_OFFLINEIFNOTCONNECTED (-5501) +#define DISPID_AMBIENT_SILENT (-5502) + +#ifndef DISPID_AMBIENT_CODEPAGE + #define DISPID_AMBIENT_CODEPAGE (-725) + #define DISPID_AMBIENT_CHARSET (-727) +#endif + + +//--------------------------------------------------------------------------- +// +// wxActiveXContainer +// +//--------------------------------------------------------------------------- + +#define WX_DECLARE_AUTOOLE(wxAutoOleInterface, I) \ +class wxAutoOleInterface \ +{ \ + protected: \ + I *m_interface; \ +\ + public: \ + explicit wxAutoOleInterface(I *pInterface = NULL) : m_interface(pInterface) {} \ + wxAutoOleInterface(REFIID riid, IUnknown *pUnk) : m_interface(NULL) \ + { QueryInterface(riid, pUnk); } \ + wxAutoOleInterface(REFIID riid, IDispatch *pDispatch) : m_interface(NULL) \ + { QueryInterface(riid, pDispatch); } \ + wxAutoOleInterface(REFCLSID clsid, REFIID riid) : m_interface(NULL)\ + { CreateInstance(clsid, riid); }\ + wxAutoOleInterface(const wxAutoOleInterface& ti) : m_interface(NULL)\ + { operator = (ti); }\ +\ + wxAutoOleInterface& operator = (const wxAutoOleInterface& ti)\ + {\ + if (ti.m_interface)\ + ti.m_interface->AddRef();\ + Free();\ + m_interface = ti.m_interface;\ + return *this;\ + }\ +\ + wxAutoOleInterface& operator = (I *&ti)\ + {\ + Free();\ + m_interface = ti;\ + return *this;\ + }\ +\ + ~wxAutoOleInterface() { Free(); }\ +\ + inline void Free()\ + {\ + if (m_interface)\ + m_interface->Release();\ + m_interface = NULL;\ + }\ +\ + HRESULT QueryInterface(REFIID riid, IUnknown *pUnk)\ + {\ + Free();\ + wxASSERT(pUnk != NULL);\ + return pUnk->QueryInterface(riid, (void **) &m_interface);\ + }\ +\ + HRESULT CreateInstance(REFCLSID clsid, REFIID riid)\ + {\ + Free();\ + return CoCreateInstance(clsid, NULL, CLSCTX_ALL, riid, (void **) &m_interface);\ + }\ +\ + inline operator I *() const {return m_interface;}\ + inline I* operator ->() {return m_interface;}\ + inline I** GetRef() {return &m_interface;}\ + inline bool Ok() const { return IsOk(); }\ + inline bool IsOk() const {return m_interface != NULL;}\ +}; + +WX_DECLARE_AUTOOLE(wxAutoIDispatch, IDispatch) +WX_DECLARE_AUTOOLE(wxAutoIOleClientSite, IOleClientSite) +WX_DECLARE_AUTOOLE(wxAutoIUnknown, IUnknown) +WX_DECLARE_AUTOOLE(wxAutoIOleObject, IOleObject) +WX_DECLARE_AUTOOLE(wxAutoIOleInPlaceObject, IOleInPlaceObject) +WX_DECLARE_AUTOOLE(wxAutoIOleInPlaceActiveObject, IOleInPlaceActiveObject) +WX_DECLARE_AUTOOLE(wxAutoIOleDocumentView, IOleDocumentView) +WX_DECLARE_AUTOOLE(wxAutoIViewObject, IViewObject) + +class wxActiveXContainer : public wxWindow +{ +public: + wxActiveXContainer(wxWindow * parent, REFIID iid, IUnknown* pUnk); + virtual ~wxActiveXContainer(); + + void OnSize(wxSizeEvent&); + void OnPaint(wxPaintEvent&); + void OnSetFocus(wxFocusEvent&); + void OnKillFocus(wxFocusEvent&); + +protected: + friend class FrameSite; + friend class wxActiveXEvents; + + wxAutoIDispatch m_Dispatch; + wxAutoIOleClientSite m_clientSite; + wxAutoIUnknown m_ActiveX; + wxAutoIOleObject m_oleObject; + wxAutoIOleInPlaceObject m_oleInPlaceObject; + wxAutoIOleInPlaceActiveObject m_oleInPlaceActiveObject; + wxAutoIOleDocumentView m_docView; + wxAutoIViewObject m_viewObject; + HWND m_oleObjectHWND; + bool m_bAmbientUserMode; + DWORD m_docAdviseCookie; + wxWindow* m_realparent; + + void CreateActiveX(REFIID, IUnknown*); +}; + + +// Events +class wxActiveXEvent : public wxCommandEvent +{ +private: + friend class wxActiveXEvents; + wxVariant m_params; + DISPID m_dispid; + +public: + virtual wxEvent *Clone() const + { return new wxActiveXEvent(*this); } + + size_t ParamCount() const + { return m_params.GetCount(); } + + wxString ParamType(size_t idx) const + { + wxASSERT(idx < m_params.GetCount()); + return m_params[idx].GetType(); + } + + wxString ParamName(size_t idx) const + { + wxASSERT(idx < m_params.GetCount()); + return m_params[idx].GetName(); + } + + wxVariant& operator[] (size_t idx) + { + wxASSERT(idx < ParamCount()); + return m_params[idx]; + } + + DISPID GetDispatchId() const + { return m_dispid; } +}; + +#define wxACTIVEX_ID 14001 +DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_MEDIA, wxEVT_ACTIVEX, wxACTIVEX_ID) +typedef void (wxEvtHandler::*wxActiveXEventFunction)(wxActiveXEvent&); +#define EVT_ACTIVEX(id, fn) DECLARE_EVENT_TABLE_ENTRY(wxEVT_ACTIVEX, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxActiveXEventFunction) & fn, (wxObject *) NULL ), +#define wxActiveXEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxActiveXEventFunction, &func) + +#endif // wxUSE_ACTIVEX + +#endif // _WX_MSW_OLE_ACTIVEXCONTAINER_H_ diff --git a/Externals/wxWidgets/include/wx/msw/ole/automtn.h b/Externals/wxWidgets/include/wx/msw/ole/automtn.h new file mode 100644 index 0000000000..9dd1e37630 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/ole/automtn.h @@ -0,0 +1,101 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: automtn.h +// Purpose: OLE automation utilities +// Author: Julian Smart +// Modified by: +// Created: 11/6/98 +// RCS-ID: $Id: automtn.h 45498 2007-04-16 13:03:05Z VZ $ +// Copyright: (c) 1998, Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_AUTOMTN_H_ +#define _WX_AUTOMTN_H_ + +#include "wx/defs.h" + +#if wxUSE_OLE_AUTOMATION + +#include "wx/object.h" +#include "wx/variant.h" + +typedef void WXIDISPATCH; +typedef unsigned short* WXBSTR; + +#ifdef GetObject +#undef GetObject +#endif + +/* + * wxAutomationObject + * Wraps up an IDispatch pointer and invocation; does variant conversion. + */ + +class WXDLLEXPORT wxAutomationObject: public wxObject +{ +public: + wxAutomationObject(WXIDISPATCH* dispatchPtr = NULL); + virtual ~wxAutomationObject(); + + // Set/get dispatch pointer + inline void SetDispatchPtr(WXIDISPATCH* dispatchPtr) { m_dispatchPtr = dispatchPtr; } + inline WXIDISPATCH* GetDispatchPtr() const { return m_dispatchPtr; } + + // Get a dispatch pointer from the current object associated + // with a class id, such as "Excel.Application" + bool GetInstance(const wxString& classId) const; + + // Get a dispatch pointer from a new instance of the the class + bool CreateInstance(const wxString& classId) const; + + // Low-level invocation function. Pass either an array of variants, + // or an array of pointers to variants. + bool Invoke(const wxString& member, int action, + wxVariant& retValue, int noArgs, wxVariant args[], const wxVariant* ptrArgs[] = 0) const; + + // Invoke a member function + wxVariant CallMethod(const wxString& method, int noArgs, wxVariant args[]); + wxVariant CallMethodArray(const wxString& method, int noArgs, const wxVariant **args); + + // Convenience function + wxVariant CallMethod(const wxString& method, + const wxVariant& arg1 = wxNullVariant, const wxVariant& arg2 = wxNullVariant, + const wxVariant& arg3 = wxNullVariant, const wxVariant& arg4 = wxNullVariant, + const wxVariant& arg5 = wxNullVariant, const wxVariant& arg6 = wxNullVariant); + + // Get/Put property + wxVariant GetProperty(const wxString& property, int noArgs = 0, wxVariant args[] = (wxVariant*) NULL) const; + wxVariant GetPropertyArray(const wxString& property, int noArgs, const wxVariant **args) const; + wxVariant GetProperty(const wxString& property, + const wxVariant& arg1, const wxVariant& arg2 = wxNullVariant, + const wxVariant& arg3 = wxNullVariant, const wxVariant& arg4 = wxNullVariant, + const wxVariant& arg5 = wxNullVariant, const wxVariant& arg6 = wxNullVariant); + + bool PutPropertyArray(const wxString& property, int noArgs, const wxVariant **args); + bool PutProperty(const wxString& property, int noArgs, wxVariant args[]) ; + bool PutProperty(const wxString& property, + const wxVariant& arg1, const wxVariant& arg2 = wxNullVariant, + const wxVariant& arg3 = wxNullVariant, const wxVariant& arg4 = wxNullVariant, + const wxVariant& arg5 = wxNullVariant, const wxVariant& arg6 = wxNullVariant); + + // Uses DISPATCH_PROPERTYGET + // and returns a dispatch pointer. The calling code should call Release + // on the pointer, though this could be implicit by constructing an wxAutomationObject + // with it and letting the destructor call Release. + WXIDISPATCH* GetDispatchProperty(const wxString& property, int noArgs, wxVariant args[]) const; + WXIDISPATCH* GetDispatchProperty(const wxString& property, int noArgs, const wxVariant **args) const; + + // A way of initialising another wxAutomationObject with a dispatch object, + // without having to deal with nasty IDispatch pointers. + bool GetObject(wxAutomationObject& obj, const wxString& property, int noArgs = 0, wxVariant args[] = (wxVariant*) NULL) const; + bool GetObject(wxAutomationObject& obj, const wxString& property, int noArgs, const wxVariant **args) const; + +public: + WXIDISPATCH* m_dispatchPtr; + + DECLARE_NO_COPY_CLASS(wxAutomationObject) +}; + +#endif // wxUSE_OLE_AUTOMATION + +#endif // _WX_AUTOMTN_H_ diff --git a/Externals/wxWidgets/include/wx/msw/ole/dataform.h b/Externals/wxWidgets/include/wx/msw/ole/dataform.h new file mode 100644 index 0000000000..f94c87f86a --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/ole/dataform.h @@ -0,0 +1,68 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: msw/ole/dataform.h +// Purpose: declaration of the wxDataFormat class +// Author: Vadim Zeitlin +// Modified by: +// Created: 19.10.99 (extracted from msw/ole/dataobj.h) +// RCS-ID: $Id: dataform.h 28812 2004-08-16 12:45:46Z ABX $ +// Copyright: (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MSW_OLE_DATAFORM_H +#define _WX_MSW_OLE_DATAFORM_H + +// ---------------------------------------------------------------------------- +// wxDataFormat identifies the single format of data +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxDataFormat +{ +public: + // the clipboard formats under Win32 are WORD's + typedef unsigned short NativeFormat; + + wxDataFormat(NativeFormat format = wxDF_INVALID) { m_format = format; } + wxDataFormat(const wxChar *format) { SetId(format); } + + wxDataFormat& operator=(NativeFormat format) + { m_format = format; return *this; } + wxDataFormat& operator=(const wxDataFormat& format) + { m_format = format.m_format; return *this; } + + // default copy ctor/assignment operators ok + + // comparison (must have both versions) + bool operator==(wxDataFormatId format) const + { return m_format == (NativeFormat)format; } + bool operator!=(wxDataFormatId format) const + { return m_format != (NativeFormat)format; } + bool operator==(const wxDataFormat& format) const + { return m_format == format.m_format; } + bool operator!=(const wxDataFormat& format) const + { return m_format != format.m_format; } + + // explicit and implicit conversions to NativeFormat which is one of + // standard data types (implicit conversion is useful for preserving the + // compatibility with old code) + NativeFormat GetFormatId() const { return m_format; } + operator NativeFormat() const { return m_format; } + + // this works with standard as well as custom ids + void SetType(NativeFormat format) { m_format = format; } + NativeFormat GetType() const { return m_format; } + + // string ids are used for custom types - this SetId() must be used for + // application-specific formats + wxString GetId() const; + void SetId(const wxChar *format); + + // returns true if the format is one of those defined in wxDataFormatId + bool IsStandard() const { return m_format > 0 && m_format < wxDF_PRIVATE; } + +private: + NativeFormat m_format; +}; + +#endif // _WX_MSW_OLE_DATAFORM_H + diff --git a/Externals/wxWidgets/include/wx/msw/ole/dataobj.h b/Externals/wxWidgets/include/wx/msw/ole/dataobj.h new file mode 100644 index 0000000000..71cd445536 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/ole/dataobj.h @@ -0,0 +1,79 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: msw/ole/dataobj.h +// Purpose: declaration of the wxDataObject class +// Author: Vadim Zeitlin +// Modified by: +// Created: 10.05.98 +// RCS-ID: $Id: dataobj.h 37406 2006-02-09 03:45:14Z VZ $ +// Copyright: (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MSW_OLE_DATAOBJ_H +#define _WX_MSW_OLE_DATAOBJ_H + +// ---------------------------------------------------------------------------- +// forward declarations +// ---------------------------------------------------------------------------- + +struct IDataObject; + +// ---------------------------------------------------------------------------- +// wxDataObject is a "smart" and polymorphic piece of data. +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxDataObject : public wxDataObjectBase +{ +public: + // ctor & dtor + wxDataObject(); + virtual ~wxDataObject(); + + // retrieve IDataObject interface (for other OLE related classes) + IDataObject *GetInterface() const { return m_pIDataObject; } + + // tell the object that it should be now owned by IDataObject - i.e. when + // it is deleted, it should delete us as well + void SetAutoDelete(); + + // return true if we support this format in "Get" direction + bool IsSupportedFormat(const wxDataFormat& format) const + { return wxDataObjectBase::IsSupported(format, Get); } + + // if this method returns false, this wxDataObject will be copied to + // the clipboard with its size prepended to it, which is compatible with + // older wx versions + // + // if returns true, then this wxDataObject will be copied to the clipboard + // without any additional information and ::HeapSize() function will be used + // to get the size of that data + virtual bool NeedsVerbatimData(const wxDataFormat& WXUNUSED(format)) const + { + // return false from here only for compatibility with earlier wx versions + return true; + } + + // function to return symbolic name of clipboard format (for debug messages) +#ifdef __WXDEBUG__ + static const wxChar *GetFormatName(wxDataFormat format); + + #define wxGetFormatName(format) wxDataObject::GetFormatName(format) +#else // !Debug + #define wxGetFormatName(format) _T("") +#endif // Debug/!Debug + // they need to be accessed from wxIDataObject, so made them public, + // or wxIDataObject friend +public: + virtual const void* GetSizeFromBuffer( const void* buffer, size_t* size, + const wxDataFormat& format ); + virtual void* SetSizeInBuffer( void* buffer, size_t size, + const wxDataFormat& format ); + virtual size_t GetBufferOffset( const wxDataFormat& format ); + +private: + IDataObject *m_pIDataObject; // pointer to the COM interface + + DECLARE_NO_COPY_CLASS(wxDataObject) +}; + +#endif //_WX_MSW_OLE_DATAOBJ_H diff --git a/Externals/wxWidgets/include/wx/msw/ole/dataobj2.h b/Externals/wxWidgets/include/wx/msw/ole/dataobj2.h new file mode 100644 index 0000000000..dc1954d0b3 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/ole/dataobj2.h @@ -0,0 +1,146 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/ole/dataobj2.h +// Purpose: second part of platform specific wxDataObject header - +// declarations of predefined wxDataObjectSimple-derived classes +// Author: Vadim Zeitlin +// Modified by: +// Created: 21.10.99 +// RCS-ID: $Id: dataobj2.h 40772 2006-08-23 13:38:45Z VZ $ +// Copyright: (c) 1999 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MSW_OLE_DATAOBJ2_H +#define _WX_MSW_OLE_DATAOBJ2_H + +// ---------------------------------------------------------------------------- +// wxBitmapDataObject is a specialization of wxDataObject for bitmap data +// +// NB: in fact, under MSW we support CF_DIB (and not CF_BITMAP) clipboard +// format and we also provide wxBitmapDataObject2 for CF_BITMAP (which is +// rarely used). This is ugly, but I haven't found a solution for it yet. +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxBitmapDataObject : public wxBitmapDataObjectBase +{ +public: + // ctors + wxBitmapDataObject(const wxBitmap& bitmap = wxNullBitmap) + : wxBitmapDataObjectBase(bitmap) + { + SetFormat(wxDF_DIB); + + m_data = NULL; + } + + // implement base class pure virtuals + virtual size_t GetDataSize() const; + virtual bool GetDataHere(void *buf) const; + virtual bool SetData(size_t len, const void *buf); + + virtual size_t GetDataSize(const wxDataFormat& WXUNUSED(format)) const + { return GetDataSize(); } + virtual bool GetDataHere(const wxDataFormat& WXUNUSED(format), + void *buf) const + { return GetDataHere(buf); } + virtual bool SetData(const wxDataFormat& WXUNUSED(format), + size_t len, const void *buf) + { return SetData(len, buf); } + +private: + // the DIB data + void /* BITMAPINFO */ *m_data; + + DECLARE_NO_COPY_CLASS(wxBitmapDataObject) +}; + +// ---------------------------------------------------------------------------- +// wxBitmapDataObject2 - a data object for CF_BITMAP +// +// FIXME did I already mention it was ugly? +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxBitmapDataObject2 : public wxBitmapDataObjectBase +{ +public: + // ctors + wxBitmapDataObject2(const wxBitmap& bitmap = wxNullBitmap) + : wxBitmapDataObjectBase(bitmap) + { + } + + // implement base class pure virtuals + virtual size_t GetDataSize() const; + virtual bool GetDataHere(void *buf) const; + virtual bool SetData(size_t len, const void *buf); + + virtual size_t GetDataSize(const wxDataFormat& WXUNUSED(format)) const + { return GetDataSize(); } + virtual bool GetDataHere(const wxDataFormat& WXUNUSED(format), + void *buf) const + { return GetDataHere(buf); } + virtual bool SetData(const wxDataFormat& WXUNUSED(format), + size_t len, const void *buf) + { return SetData(len, buf); } + +private: + DECLARE_NO_COPY_CLASS(wxBitmapDataObject2) +}; + +// ---------------------------------------------------------------------------- +// wxFileDataObject - data object for CF_HDROP +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxFileDataObject : public wxFileDataObjectBase +{ +public: + wxFileDataObject() { } + + // implement base class pure virtuals + virtual bool SetData(size_t len, const void *buf); + virtual size_t GetDataSize() const; + virtual bool GetDataHere(void *pData) const; + virtual void AddFile(const wxString& file); + + virtual size_t GetDataSize(const wxDataFormat& WXUNUSED(format)) const + { return GetDataSize(); } + virtual bool GetDataHere(const wxDataFormat& WXUNUSED(format), + void *buf) const + { return GetDataHere(buf); } + virtual bool SetData(const wxDataFormat& WXUNUSED(format), + size_t len, const void *buf) + { return SetData(len, buf); } + +private: + DECLARE_NO_COPY_CLASS(wxFileDataObject) +}; + +// ---------------------------------------------------------------------------- +// wxURLDataObject: data object for URLs +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxURLDataObject : public wxDataObjectComposite +{ +public: + // initialize with URL in ctor or use SetURL later + wxURLDataObject(const wxString& url = wxEmptyString); + + // return the URL as string + wxString GetURL() const; + + // Set a string as the URL in the data object + void SetURL(const wxString& url); + + // override to set m_textFormat + virtual bool SetData(const wxDataFormat& format, + size_t len, + const void *buf); + +private: + // last data object we got data in + wxDataObjectSimple *m_dataObjectLast; + + DECLARE_NO_COPY_CLASS(wxURLDataObject) +}; + +#endif // _WX_MSW_OLE_DATAOBJ2_H diff --git a/Externals/wxWidgets/include/wx/msw/ole/dropsrc.h b/Externals/wxWidgets/include/wx/msw/ole/dropsrc.h new file mode 100644 index 0000000000..8646558f92 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/ole/dropsrc.h @@ -0,0 +1,79 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: ole/dropsrc.h +// Purpose: declaration of the wxDropSource class +// Author: Vadim Zeitlin +// Modified by: +// Created: 06.03.98 +// RCS-ID: $Id: dropsrc.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_OLEDROPSRC_H +#define _WX_OLEDROPSRC_H + +#if wxUSE_DRAG_AND_DROP + +// ---------------------------------------------------------------------------- +// forward declarations +// ---------------------------------------------------------------------------- + +class wxIDropSource; +class WXDLLIMPEXP_FWD_CORE wxDataObject; +class WXDLLIMPEXP_FWD_CORE wxWindow; + +// ---------------------------------------------------------------------------- +// macros +// ---------------------------------------------------------------------------- + +// this macro may be used instead for wxDropSource ctor arguments: it will use +// the cursor 'name' from the resources under MSW, but will expand to +// something else under GTK. If you don't use it, you will have to use #ifdef +// in the application code. +#define wxDROP_ICON(name) wxCursor(_T(#name)) + +// ---------------------------------------------------------------------------- +// wxDropSource is used to start the drag-&-drop operation on associated +// wxDataObject object. It's responsible for giving UI feedback while dragging. +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxDropSource : public wxDropSourceBase +{ +public: + // ctors: if you use default ctor you must call SetData() later! + // + // NB: the "wxWindow *win" parameter is unused and is here only for wxGTK + // compatibility, as well as both icon parameters + wxDropSource(wxWindow *win = NULL, + const wxCursor &cursorCopy = wxNullCursor, + const wxCursor &cursorMove = wxNullCursor, + const wxCursor &cursorStop = wxNullCursor); + wxDropSource(wxDataObject& data, + wxWindow *win = NULL, + const wxCursor &cursorCopy = wxNullCursor, + const wxCursor &cursorMove = wxNullCursor, + const wxCursor &cursorStop = wxNullCursor); + + virtual ~wxDropSource(); + + // do it (call this in response to a mouse button press, for example) + // params: if bAllowMove is false, data can be only copied + virtual wxDragResult DoDragDrop(int flags = wxDrag_CopyOnly); + + // overridable: you may give some custom UI feedback during d&d operation + // in this function (it's called on each mouse move, so it shouldn't be + // too slow). Just return false if you want default feedback. + virtual bool GiveFeedback(wxDragResult effect); + +protected: + void Init(); + +private: + wxIDropSource *m_pIDropSource; // the pointer to COM interface + + DECLARE_NO_COPY_CLASS(wxDropSource) +}; + +#endif //wxUSE_DRAG_AND_DROP + +#endif //_WX_OLEDROPSRC_H diff --git a/Externals/wxWidgets/include/wx/msw/ole/droptgt.h b/Externals/wxWidgets/include/wx/msw/ole/droptgt.h new file mode 100644 index 0000000000..a1d44a0efc --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/ole/droptgt.h @@ -0,0 +1,72 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: ole/droptgt.h +// Purpose: declaration of the wxDropTarget class +// Author: Vadim Zeitlin +// Modified by: +// Created: 06.03.98 +// RCS-ID: $Id: droptgt.h 35650 2005-09-23 12:56:45Z MR $ +// Copyright: (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_OLEDROPTGT_H +#define _WX_OLEDROPTGT_H + +#if wxUSE_DRAG_AND_DROP + +// ---------------------------------------------------------------------------- +// forward declarations +// ---------------------------------------------------------------------------- + +class wxIDropTarget; +struct IDataObject; + +// ---------------------------------------------------------------------------- +// An instance of the class wxDropTarget may be associated with any wxWindow +// derived object via SetDropTarget() function. If this is done, the virtual +// methods of wxDropTarget are called when something is dropped on the window. +// +// Note that wxDropTarget is an abstract base class (ABC) and you should derive +// your own class from it implementing pure virtual function in order to use it +// (all of them, including protected ones which are called by the class itself) +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxDropTarget : public wxDropTargetBase +{ +public: + // ctor & dtor + wxDropTarget(wxDataObject *dataObject = NULL); + virtual ~wxDropTarget(); + + // normally called by wxWindow on window creation/destruction, but might be + // called `manually' as well. Register() returns true on success. + bool Register(WXHWND hwnd); + void Revoke(WXHWND hwnd); + + // provide default implementation for base class pure virtuals + virtual bool OnDrop(wxCoord x, wxCoord y); + virtual bool GetData(); + + // implementation only from now on + // ------------------------------- + + // do we accept this kind of data? + bool IsAcceptedData(IDataObject *pIDataSource) const; + + // give us the data source from IDropTarget::Drop() - this is later used by + // GetData() when it's called from inside OnData() + void SetDataSource(IDataObject *pIDataSource); + +private: + // helper used by IsAcceptedData() and GetData() + wxDataFormat GetSupportedFormat(IDataObject *pIDataSource) const; + + wxIDropTarget *m_pIDropTarget; // the pointer to our COM interface + IDataObject *m_pIDataSource; // the pointer to the source data object + + DECLARE_NO_COPY_CLASS(wxDropTarget) +}; + +#endif //wxUSE_DRAG_AND_DROP + +#endif //_WX_OLEDROPTGT_H diff --git a/Externals/wxWidgets/include/wx/msw/ole/oleutils.h b/Externals/wxWidgets/include/wx/msw/ole/oleutils.h new file mode 100644 index 0000000000..635c11b19c --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/ole/oleutils.h @@ -0,0 +1,256 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: oleutils.h +// Purpose: OLE helper routines, OLE debugging support &c +// Author: Vadim Zeitlin +// Modified by: +// Created: 19.02.1998 +// RCS-ID: $Id: oleutils.h 49804 2007-11-10 01:09:42Z VZ $ +// Copyright: (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_OLEUTILS_H +#define _WX_OLEUTILS_H + +#include "wx/defs.h" + +#if wxUSE_OLE + +// ole2.h includes windows.h, so include wrapwin.h first +#include "wx/msw/wrapwin.h" +// get IUnknown, REFIID &c +#include <ole2.h> +#include "wx/intl.h" +#include "wx/log.h" + +// ============================================================================ +// General purpose functions and macros +// ============================================================================ + +// ---------------------------------------------------------------------------- +// initialize/cleanup OLE +// ---------------------------------------------------------------------------- + +// call OleInitialize() or CoInitialize[Ex]() depending on the platform +// +// return true if ok, false otherwise +inline bool wxOleInitialize() +{ + // we need to initialize OLE library +#ifdef __WXWINCE__ + if ( FAILED(::CoInitializeEx(NULL, COINIT_MULTITHREADED)) ) +#else + if ( FAILED(::OleInitialize(NULL)) ) +#endif + { + wxLogError(_("Cannot initialize OLE")); + + return false; + } + + return true; +} + +inline void wxOleUninitialize() +{ +#ifdef __WXWINCE__ + ::CoUninitialize(); +#else + ::OleUninitialize(); +#endif +} + +// ---------------------------------------------------------------------------- +// misc helper functions/macros +// ---------------------------------------------------------------------------- + +// release the interface pointer (if !NULL) +inline void ReleaseInterface(IUnknown *pIUnk) +{ + if ( pIUnk != NULL ) + pIUnk->Release(); +} + +// release the interface pointer (if !NULL) and make it NULL +#define RELEASE_AND_NULL(p) if ( (p) != NULL ) { p->Release(); p = NULL; }; + +// return true if the iid is in the array +extern bool IsIidFromList(REFIID riid, const IID *aIids[], size_t nCount); + +// ============================================================================ +// IUnknown implementation helpers +// ============================================================================ + +/* + The most dumb implementation of IUnknown methods. We don't support + aggregation nor containment, but for 99% of cases this simple + implementation is quite enough. + + Usage is trivial: here is all you should have + 1) DECLARE_IUNKNOWN_METHODS in your (IUnknown derived!) class declaration + 2) BEGIN/END_IID_TABLE with ADD_IID in between for all interfaces you + support (at least all for which you intent to return 'this' from QI, + i.e. you should derive from IFoo if you have ADD_IID(Foo)) somewhere else + 3) IMPLEMENT_IUNKNOWN_METHODS somewhere also + + These macros are quite simple: AddRef and Release are trivial and QI does + lookup in a static member array of IIDs and returns 'this' if it founds + the requested interface in it or E_NOINTERFACE if not. + */ + +/* + wxAutoULong: this class is used for automatically initalising m_cRef to 0 +*/ +class wxAutoULong +{ +public: + wxAutoULong(ULONG value = 0) : m_Value(value) { } + + operator ULONG&() { return m_Value; } + ULONG& operator=(ULONG value) { m_Value = value; return m_Value; } + + wxAutoULong& operator++() { ++m_Value; return *this; } + const wxAutoULong operator++( int ) { wxAutoULong temp = *this; ++m_Value; return temp; } + + wxAutoULong& operator--() { --m_Value; return *this; } + const wxAutoULong operator--( int ) { wxAutoULong temp = *this; --m_Value; return temp; } + +private: + ULONG m_Value; +}; + +// declare the methods and the member variable containing reference count +// you must also define the ms_aIids array somewhere with BEGIN_IID_TABLE +// and friends (see below) + +#define DECLARE_IUNKNOWN_METHODS \ + public: \ + STDMETHODIMP QueryInterface(REFIID, void **); \ + STDMETHODIMP_(ULONG) AddRef(); \ + STDMETHODIMP_(ULONG) Release(); \ + private: \ + static const IID *ms_aIids[]; \ + wxAutoULong m_cRef + +// macros for declaring supported interfaces +// NB: you should write ADD_INTERFACE(Foo) and not ADD_INTERFACE(IID_IFoo)! +#define BEGIN_IID_TABLE(cname) const IID *cname::ms_aIids[] = { +#define ADD_IID(iid) &IID_I##iid, +#define END_IID_TABLE } + +// implementation is as straightforward as possible +// Parameter: classname - the name of the class +#define IMPLEMENT_IUNKNOWN_METHODS(classname) \ + STDMETHODIMP classname::QueryInterface(REFIID riid, void **ppv) \ + { \ + wxLogQueryInterface(_T(#classname), riid); \ + \ + if ( IsIidFromList(riid, ms_aIids, WXSIZEOF(ms_aIids)) ) { \ + *ppv = this; \ + AddRef(); \ + \ + return S_OK; \ + } \ + else { \ + *ppv = NULL; \ + \ + return (HRESULT) E_NOINTERFACE; \ + } \ + } \ + \ + STDMETHODIMP_(ULONG) classname::AddRef() \ + { \ + wxLogAddRef(_T(#classname), m_cRef); \ + \ + return ++m_cRef; \ + } \ + \ + STDMETHODIMP_(ULONG) classname::Release() \ + { \ + wxLogRelease(_T(#classname), m_cRef); \ + \ + if ( --m_cRef == wxAutoULong(0) ) { \ + delete this; \ + return 0; \ + } \ + else \ + return m_cRef; \ + } + +// ============================================================================ +// Debugging support +// ============================================================================ + +// VZ: I don't know it's not done for compilers other than VC++ but I leave it +// as is. Please note, though, that tracing OLE interface calls may be +// incredibly useful when debugging OLE programs. +#if defined(__WXDEBUG__) && ( ( defined(__VISUALC__) && (__VISUALC__ >= 1000) ) || defined(__MWERKS__) ) +// ---------------------------------------------------------------------------- +// All OLE specific log functions have DebugTrace level (as LogTrace) +// ---------------------------------------------------------------------------- + +// tries to translate riid into a symbolic name, if possible +void wxLogQueryInterface(const wxChar *szInterface, REFIID riid); + +// these functions print out the new value of reference counter +void wxLogAddRef (const wxChar *szInterface, ULONG cRef); +void wxLogRelease(const wxChar *szInterface, ULONG cRef); + +#else //!__WXDEBUG__ + #define wxLogQueryInterface(szInterface, riid) + #define wxLogAddRef(szInterface, cRef) + #define wxLogRelease(szInterface, cRef) +#endif //__WXDEBUG__ + +// wrapper around BSTR type (by Vadim Zeitlin) + +class WXDLLEXPORT wxBasicString +{ +public: + // ctors & dtor + wxBasicString(const char *sz); + wxBasicString(const wxString& str); + ~wxBasicString(); + + void Init(const char* sz); + + // accessors + // just get the string + operator BSTR() const { return m_wzBuf; } + // retrieve a copy of our string - caller must SysFreeString() it later! + BSTR Get() const { return SysAllocString(m_wzBuf); } + +private: + // @@@ not implemented (but should be) + wxBasicString(const wxBasicString&); + wxBasicString& operator=(const wxBasicString&); + + OLECHAR *m_wzBuf; // actual string +}; + +#if wxUSE_VARIANT +// Convert variants +class WXDLLIMPEXP_FWD_BASE wxVariant; + +WXDLLEXPORT bool wxConvertVariantToOle(const wxVariant& variant, VARIANTARG& oleVariant); +WXDLLEXPORT bool wxConvertOleToVariant(const VARIANTARG& oleVariant, wxVariant& variant); +#endif // wxUSE_VARIANT + +// Convert string to Unicode +WXDLLEXPORT BSTR wxConvertStringToOle(const wxString& str); + +// Convert string from BSTR to wxString +WXDLLEXPORT wxString wxConvertStringFromOle(BSTR bStr); + +#else // !wxUSE_OLE + +// ---------------------------------------------------------------------------- +// stub functions to avoid #if wxUSE_OLE in the main code +// ---------------------------------------------------------------------------- + +inline bool wxOleInitialize() { return false; } +inline void wxOleUninitialize() { } + +#endif // wxUSE_OLE/!wxUSE_OLE + +#endif //_WX_OLEUTILS_H diff --git a/Externals/wxWidgets/include/wx/msw/ole/uuid.h b/Externals/wxWidgets/include/wx/msw/ole/uuid.h new file mode 100644 index 0000000000..7323dc18e3 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/ole/uuid.h @@ -0,0 +1,86 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: ole/uuid.h +// Purpose: encapsulates an UUID with some added helper functions +// Author: Vadim Zeitlin +// Modified by: +// Created: 11.07.97 +// RCS-ID: $Id: uuid.h 35650 2005-09-23 12:56:45Z MR $ +// Copyright: (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> +// Licence: wxWindows licence +// +// Notes: you should link your project with RPCRT4.LIB! +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_OLEUUID_H +#define _WX_OLEUUID_H + +#include "wx/wxchar.h" +// ------------------------------------------------------------------ +// UUID (Universally Unique IDentifier) definition +// ------------------------------------------------------------------ + +// ----- taken from RPC.H +#ifndef UUID_DEFINED // in some cases RPC.H will be already + #ifdef __WIN32__ // included, so avoid redefinition + typedef struct + { + unsigned long Data1; + unsigned short Data2; + unsigned short Data3; + unsigned char Data4[8]; + } UUID; // UUID = GUID = CLSID = LIBID = IID + #endif // WIN32 +#endif // UUID_DEFINED + +#ifndef GUID_DEFINED + typedef UUID GUID; + #define UUID_DEFINED // prevent redefinition +#endif // GUID_DEFINED + +typedef unsigned char uchar; + +// ------------------------------------------------------------------ +// a class to store UUID and it's string representation +// ------------------------------------------------------------------ + +// uses RPC functions to create/convert Universally Unique Identifiers +class WXDLLEXPORT Uuid +{ +private: + UUID m_uuid; + wxUChar *m_pszUuid; // this string is alloc'd and freed by RPC + wxChar *m_pszCForm; // this string is allocated in Set/Create + + void UuidToCForm(); + + // function used to set initial state by all ctors + void Init() { m_pszUuid = NULL; m_pszCForm = NULL; } + +public: + // ctors & dtor + Uuid() { Init(); } + Uuid(const wxChar *pc) { Init(); Set(pc); } + Uuid(const UUID &uuid) { Init(); Set(uuid); } + ~Uuid(); + + // copy ctor and assignment operator needed for this class + Uuid(const Uuid& uuid); + Uuid& operator=(const Uuid& uuid); + + // create a brand new UUID + void Create(); + + // set value of UUID + bool Set(const wxChar *pc); // from a string, returns true if ok + void Set(const UUID& uuid); // from another UUID (never fails) + + // accessors + operator const UUID*() const { return &m_uuid; } + operator const wxChar*() const { return (wxChar *)(m_pszUuid); } + + // return string representation of the UUID in the C form + // (as in DEFINE_GUID macro) + const wxChar *CForm() const { return m_pszCForm; } +}; + +#endif //_WX_OLEUUID_H diff --git a/Externals/wxWidgets/include/wx/msw/palette.h b/Externals/wxWidgets/include/wx/msw/palette.h new file mode 100644 index 0000000000..0aa36ea24a --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/palette.h @@ -0,0 +1,58 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/palette.h +// Purpose: wxPalette class +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: palette.h 42752 2006-10-30 19:26:48Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_PALETTE_H_ +#define _WX_PALETTE_H_ + +#include "wx/gdiobj.h" + +class WXDLLEXPORT wxPalette; + +class WXDLLEXPORT wxPaletteRefData: public wxGDIRefData +{ + friend class WXDLLEXPORT wxPalette; +public: + wxPaletteRefData(void); + virtual ~wxPaletteRefData(void); +protected: + WXHPALETTE m_hPalette; +}; + +#define M_PALETTEDATA ((wxPaletteRefData *)m_refData) + +class WXDLLEXPORT wxPalette: public wxPaletteBase +{ +public: + wxPalette(); + wxPalette(int n, const unsigned char *red, const unsigned char *green, const unsigned char *blue); + virtual ~wxPalette(void); + bool Create(int n, const unsigned char *red, const unsigned char *green, const unsigned char *blue); + + int GetPixel(unsigned char red, unsigned char green, unsigned char blue) const; + bool GetRGB(int pixel, unsigned char *red, unsigned char *green, unsigned char *blue) const; + + virtual int GetColoursCount() const; + + virtual bool Ok() const { return IsOk(); } + virtual bool IsOk(void) const { return (m_refData != NULL) ; } + + virtual bool FreeResource(bool force = false); + + // implemetation + inline WXHPALETTE GetHPALETTE(void) const { return (M_PALETTEDATA ? M_PALETTEDATA->m_hPalette : 0); } + void SetHPALETTE(WXHPALETTE pal); + +private: + DECLARE_DYNAMIC_CLASS(wxPalette) +}; + +#endif + // _WX_PALETTE_H_ diff --git a/Externals/wxWidgets/include/wx/msw/pbrush.cur b/Externals/wxWidgets/include/wx/msw/pbrush.cur new file mode 100644 index 0000000000..299016a315 Binary files /dev/null and b/Externals/wxWidgets/include/wx/msw/pbrush.cur differ diff --git a/Externals/wxWidgets/include/wx/msw/pen.h b/Externals/wxWidgets/include/wx/msw/pen.h new file mode 100644 index 0000000000..c9804c7a83 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/pen.h @@ -0,0 +1,132 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/pen.h +// Purpose: wxPen class +// Author: Julian Smart +// Modified by: Vadim Zeitlin: fixed operator=(), ==(), !=() +// Created: 01/02/97 +// RCS-ID: $Id: pen.h 45498 2007-04-16 13:03:05Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_PEN_H_ +#define _WX_PEN_H_ + +#include "wx/gdiobj.h" +#include "wx/bitmap.h" +#include "wx/colour.h" + +typedef WXDWORD wxMSWDash; + +class WXDLLEXPORT wxPen; + +// VZ: this class should be made private +class WXDLLEXPORT wxPenRefData : public wxGDIRefData +{ +public: + wxPenRefData(); + wxPenRefData(const wxPenRefData& data); + virtual ~wxPenRefData(); + + bool operator==(const wxPenRefData& data) const + { + // we intentionally don't compare m_hPen fields here + return m_style == data.m_style && + m_width == data.m_width && + m_join == data.m_join && + m_cap == data.m_cap && + m_colour == data.m_colour && + (m_style != wxSTIPPLE || m_stipple.IsSameAs(data.m_stipple)) && + (m_style != wxUSER_DASH || + (m_nbDash == data.m_nbDash && + memcmp(m_dash, data.m_dash, m_nbDash*sizeof(wxDash)) == 0)); + } + +protected: + int m_width; + int m_style; + int m_join; + int m_cap; + wxBitmap m_stipple; + int m_nbDash; + wxDash * m_dash; + wxColour m_colour; + WXHPEN m_hPen; + +private: + friend class WXDLLEXPORT wxPen; + + // Cannot use + // DECLARE_NO_COPY_CLASS(wxPenRefData) + // because copy constructor is explicitly declared above; + // but no copy assignment operator is defined, so declare + // it private to prevent the compiler from defining it: + wxPenRefData& operator=(const wxPenRefData&); +}; + +#define M_PENDATA ((wxPenRefData *)m_refData) +#define wxPENDATA(x) ((wxPenRefData *)(x).m_refData) + +// ---------------------------------------------------------------------------- +// Pen +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxPen : public wxGDIObject +{ +public: + wxPen(); + wxPen(const wxColour& col, int width = 1, int style = wxSOLID); + wxPen(const wxBitmap& stipple, int width); + virtual ~wxPen(); + + bool operator==(const wxPen& pen) const + { + const wxPenRefData *penData = (wxPenRefData *)pen.m_refData; + + // an invalid pen is only equal to another invalid pen + return m_refData ? penData && *M_PENDATA == *penData : !penData; + } + + bool operator!=(const wxPen& pen) const { return !(*this == pen); } + + virtual bool Ok() const { return IsOk(); } + virtual bool IsOk() const { return (m_refData != NULL); } + + // Override in order to recreate the pen + void SetColour(const wxColour& col); + void SetColour(unsigned char r, unsigned char g, unsigned char b); + + void SetWidth(int width); + void SetStyle(int style); + void SetStipple(const wxBitmap& stipple); + void SetDashes(int nb_dashes, const wxDash *dash); + void SetJoin(int join); + void SetCap(int cap); + + wxColour& GetColour() const { return (M_PENDATA ? M_PENDATA->m_colour : wxNullColour); } + int GetWidth() const { return (M_PENDATA ? M_PENDATA->m_width : 0); } + int GetStyle() const { return (M_PENDATA ? M_PENDATA->m_style : 0); } + int GetJoin() const { return (M_PENDATA ? M_PENDATA->m_join : 0); } + int GetCap() const { return (M_PENDATA ? M_PENDATA->m_cap : 0); } + int GetDashes(wxDash **ptr) const + { + *ptr = (M_PENDATA ? (wxDash*)M_PENDATA->m_dash : (wxDash*) NULL); + return (M_PENDATA ? M_PENDATA->m_nbDash : 0); + } + wxDash* GetDash() const { return (M_PENDATA ? (wxDash*)M_PENDATA->m_dash : (wxDash*)NULL); } + inline int GetDashCount() const { return (M_PENDATA ? M_PENDATA->m_nbDash : 0); } + + inline wxBitmap *GetStipple() const { return (M_PENDATA ? (& M_PENDATA->m_stipple) : (wxBitmap*) NULL); } + + // Internal + bool RealizeResource(); + bool FreeResource(bool force = false); + WXHANDLE GetResourceHandle() const; + bool IsFree() const; + void Unshare(); + +private: + DECLARE_DYNAMIC_CLASS(wxPen) +}; + +#endif // _WX_PEN_H_ diff --git a/Externals/wxWidgets/include/wx/msw/pencil.cur b/Externals/wxWidgets/include/wx/msw/pencil.cur new file mode 100644 index 0000000000..afa760257c Binary files /dev/null and b/Externals/wxWidgets/include/wx/msw/pencil.cur differ diff --git a/Externals/wxWidgets/include/wx/msw/pntleft.cur b/Externals/wxWidgets/include/wx/msw/pntleft.cur new file mode 100644 index 0000000000..e7192aab6d Binary files /dev/null and b/Externals/wxWidgets/include/wx/msw/pntleft.cur differ diff --git a/Externals/wxWidgets/include/wx/msw/pntright.cur b/Externals/wxWidgets/include/wx/msw/pntright.cur new file mode 100644 index 0000000000..565447b03c Binary files /dev/null and b/Externals/wxWidgets/include/wx/msw/pntright.cur differ diff --git a/Externals/wxWidgets/include/wx/msw/popupwin.h b/Externals/wxWidgets/include/wx/msw/popupwin.h new file mode 100644 index 0000000000..56f63fef4f --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/popupwin.h @@ -0,0 +1,45 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/popupwin.h +// Purpose: wxPopupWindow class for wxMSW +// Author: Vadim Zeitlin +// Modified by: +// Created: 06.01.01 +// RCS-ID: $Id: popupwin.h 37393 2006-02-08 21:47:09Z VZ $ +// Copyright: (c) 2001 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MSW_POPUPWIN_H_ +#define _WX_MSW_POPUPWIN_H_ + +// ---------------------------------------------------------------------------- +// wxPopupWindow +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxPopupWindow : public wxPopupWindowBase +{ +public: + wxPopupWindow() { } + + wxPopupWindow(wxWindow *parent, int flags = wxBORDER_NONE) + { (void)Create(parent, flags); } + + bool Create(wxWindow *parent, int flags = wxBORDER_NONE); + + virtual bool Show(bool show = true); + + // return the style to be used for the popup windows + virtual WXDWORD MSWGetStyle(long flags, WXDWORD *exstyle) const; + + // get the HWND to be used as parent of this window with CreateWindow() + virtual WXHWND MSWGetParent() const; + +protected: + // popups handle the position like wxTopLevelWindow, not wxWindow + virtual void DoGetPosition(int *x, int *y) const; + + DECLARE_DYNAMIC_CLASS_NO_COPY(wxPopupWindow) +}; + +#endif // _WX_MSW_POPUPWIN_H_ + diff --git a/Externals/wxWidgets/include/wx/msw/printdlg.h b/Externals/wxWidgets/include/wx/msw/printdlg.h new file mode 100644 index 0000000000..25b21a50f4 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/printdlg.h @@ -0,0 +1,124 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: printdlg.h +// Purpose: wxPrintDialog, wxPageSetupDialog classes +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: printdlg.h 49804 2007-11-10 01:09:42Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_PRINTDLG_H_ +#define _WX_PRINTDLG_H_ + +#if wxUSE_PRINTING_ARCHITECTURE + +#include "wx/dialog.h" +#include "wx/cmndata.h" +#include "wx/prntbase.h" +#include "wx/printdlg.h" + +class WXDLLIMPEXP_FWD_CORE wxDC; + +//---------------------------------------------------------------------------- +// wxWindowsPrintNativeData +//---------------------------------------------------------------------------- + +class WXDLLEXPORT wxWindowsPrintNativeData: public wxPrintNativeDataBase +{ +public: + wxWindowsPrintNativeData(); + virtual ~wxWindowsPrintNativeData(); + + virtual bool TransferTo( wxPrintData &data ); + virtual bool TransferFrom( const wxPrintData &data ); + + virtual bool Ok() const { return IsOk(); } + virtual bool IsOk() const; + + void* GetDevMode() const { return m_devMode; } + void SetDevMode(void* data) { m_devMode = data; } + void* GetDevNames() const { return m_devNames; } + void SetDevNames(void* data) { m_devNames = data; } + +private: + void* m_devMode; + void* m_devNames; + + short m_customWindowsPaperId; + +private: + DECLARE_DYNAMIC_CLASS(wxWindowsPrintNativeData) +}; + +// --------------------------------------------------------------------------- +// wxWindowsPrintDialog: the MSW dialog for printing +// --------------------------------------------------------------------------- + +class WXDLLEXPORT wxWindowsPrintDialog : public wxPrintDialogBase +{ +public: + wxWindowsPrintDialog(wxWindow *parent, wxPrintDialogData* data = NULL); + wxWindowsPrintDialog(wxWindow *parent, wxPrintData* data); + virtual ~wxWindowsPrintDialog(); + + bool Create(wxWindow *parent, wxPrintDialogData* data = NULL); + virtual int ShowModal(); + + wxPrintDialogData& GetPrintDialogData() { return m_printDialogData; } + wxPrintData& GetPrintData() { return m_printDialogData.GetPrintData(); } + + virtual wxDC *GetPrintDC(); + +private: + wxPrintDialogData m_printDialogData; + wxPrinterDC* m_printerDC; + bool m_destroyDC; + wxWindow* m_dialogParent; + +private: + bool ConvertToNative( wxPrintDialogData &data ); + bool ConvertFromNative( wxPrintDialogData &data ); + + // holds MSW handle + void* m_printDlg; + +private: + DECLARE_NO_COPY_CLASS(wxWindowsPrintDialog) + DECLARE_CLASS(wxWindowsPrintDialog) +}; + +// --------------------------------------------------------------------------- +// wxWindowsPageSetupDialog: the MSW page setup dialog +// --------------------------------------------------------------------------- + +class WXDLLEXPORT wxWindowsPageSetupDialog: public wxPageSetupDialogBase +{ +public: + wxWindowsPageSetupDialog(); + wxWindowsPageSetupDialog(wxWindow *parent, wxPageSetupDialogData *data = NULL); + virtual ~wxWindowsPageSetupDialog(); + + bool Create(wxWindow *parent, wxPageSetupDialogData *data = NULL); + virtual int ShowModal(); + bool ConvertToNative( wxPageSetupDialogData &data ); + bool ConvertFromNative( wxPageSetupDialogData &data ); + + virtual wxPageSetupData& GetPageSetupDialogData() { return m_pageSetupData; } + +private: + wxPageSetupDialogData m_pageSetupData; + wxWindow* m_dialogParent; + + // holds MSW handle + void* m_pageDlg; + +private: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxWindowsPageSetupDialog) +}; + +#endif // wxUSE_PRINTING_ARCHITECTURE + +#endif + // _WX_PRINTDLG_H_ diff --git a/Externals/wxWidgets/include/wx/msw/printwin.h b/Externals/wxWidgets/include/wx/msw/printwin.h new file mode 100644 index 0000000000..4240682a6b --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/printwin.h @@ -0,0 +1,66 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: printwin.h +// Purpose: wxWindowsPrinter, wxWindowsPrintPreview classes +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: printwin.h 42522 2006-10-27 13:07:40Z JS $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_PRINTWIN_H_ +#define _WX_PRINTWIN_H_ + +#include "wx/prntbase.h" + +// --------------------------------------------------------------------------- +// Represents the printer: manages printing a wxPrintout object +// --------------------------------------------------------------------------- + +class WXDLLEXPORT wxWindowsPrinter : public wxPrinterBase +{ + DECLARE_DYNAMIC_CLASS(wxWindowsPrinter) + +public: + wxWindowsPrinter(wxPrintDialogData *data = NULL); + virtual ~wxWindowsPrinter(); + + virtual bool Print(wxWindow *parent, + wxPrintout *printout, + bool prompt = true); + + virtual wxDC *PrintDialog(wxWindow *parent); + virtual bool Setup(wxWindow *parent); + +private: + WXFARPROC m_lpAbortProc; + + DECLARE_NO_COPY_CLASS(wxWindowsPrinter) +}; + +// --------------------------------------------------------------------------- +// wxPrintPreview: programmer creates an object of this class to preview a +// wxPrintout. +// --------------------------------------------------------------------------- + +class WXDLLEXPORT wxWindowsPrintPreview : public wxPrintPreviewBase +{ +public: + wxWindowsPrintPreview(wxPrintout *printout, + wxPrintout *printoutForPrinting = NULL, + wxPrintDialogData *data = NULL); + wxWindowsPrintPreview(wxPrintout *printout, + wxPrintout *printoutForPrinting, + wxPrintData *data); + virtual ~wxWindowsPrintPreview(); + + virtual bool Print(bool interactive); + virtual void DetermineScaling(); + +private: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxWindowsPrintPreview) +}; + +#endif +// _WX_PRINTWIN_H_ diff --git a/Externals/wxWidgets/include/wx/msw/private.h b/Externals/wxWidgets/include/wx/msw/private.h new file mode 100644 index 0000000000..330450db30 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/private.h @@ -0,0 +1,953 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/private.h +// Purpose: Private declarations: as this header is only included by +// wxWidgets itself, it may contain identifiers which don't start +// with "wx". +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: private.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_PRIVATE_H_ +#define _WX_PRIVATE_H_ + +#include "wx/msw/wrapwin.h" + +#ifdef __WXMICROWIN__ + // Extra prototypes and symbols not defined by MicroWindows + #include "wx/msw/microwin.h" +#endif + +#include "wx/log.h" + +class WXDLLIMPEXP_FWD_CORE wxFont; +class WXDLLIMPEXP_FWD_CORE wxWindow; +class WXDLLIMPEXP_FWD_CORE wxWindowBase; + +// --------------------------------------------------------------------------- +// private constants +// --------------------------------------------------------------------------- + +// 260 was taken from windef.h +#ifndef MAX_PATH + #define MAX_PATH 260 +#endif + +// --------------------------------------------------------------------------- +// standard icons from the resources +// --------------------------------------------------------------------------- + +#if wxUSE_GUI + +extern WXDLLEXPORT_DATA(HICON) wxSTD_FRAME_ICON; +extern WXDLLEXPORT_DATA(HICON) wxSTD_MDIPARENTFRAME_ICON; +extern WXDLLEXPORT_DATA(HICON) wxSTD_MDICHILDFRAME_ICON; +extern WXDLLEXPORT_DATA(HICON) wxDEFAULT_FRAME_ICON; +extern WXDLLEXPORT_DATA(HICON) wxDEFAULT_MDIPARENTFRAME_ICON; +extern WXDLLEXPORT_DATA(HICON) wxDEFAULT_MDICHILDFRAME_ICON; +extern WXDLLEXPORT_DATA(HFONT) wxSTATUS_LINE_FONT; + +#endif // wxUSE_GUI + +// --------------------------------------------------------------------------- +// global data +// --------------------------------------------------------------------------- + +extern WXDLLIMPEXP_DATA_BASE(HINSTANCE) wxhInstance; + +// --------------------------------------------------------------------------- +// define things missing from some compilers' headers +// --------------------------------------------------------------------------- + +#if defined(__WXWINCE__) || (defined(__GNUWIN32__) && !wxUSE_NORLANDER_HEADERS) +#ifndef ZeroMemory + inline void ZeroMemory(void *buf, size_t len) { memset(buf, 0, len); } +#endif +#endif // old mingw32 + +// this defines a CASTWNDPROC macro which casts a pointer to the type of a +// window proc +#if defined(STRICT) || defined(__GNUC__) + typedef WNDPROC WndProcCast; +#else + typedef FARPROC WndProcCast; +#endif + + +#define CASTWNDPROC (WndProcCast) + + + +// --------------------------------------------------------------------------- +// some stuff for old Windows versions (FIXME: what does it do here??) +// --------------------------------------------------------------------------- + +#if !defined(APIENTRY) // NT defines APIENTRY, 3.x not + #define APIENTRY FAR PASCAL +#endif + +#ifdef __WIN32__ + #define _EXPORT +#else + #define _EXPORT _export +#endif + +#ifndef __WIN32__ + typedef signed short int SHORT; +#endif + +#if !defined(__WIN32__) // 3.x uses FARPROC for dialogs +#ifndef STRICT + #define DLGPROC FARPROC +#endif +#endif + +/* + * Decide what window classes we're going to use + * for this combination of CTl3D/FAFA settings + */ + +#define STATIC_CLASS wxT("STATIC") +#define STATIC_FLAGS (SS_LEFT|WS_CHILD|WS_VISIBLE) +#define CHECK_CLASS wxT("BUTTON") +#define CHECK_FLAGS (BS_AUTOCHECKBOX|WS_TABSTOP|WS_CHILD) +#define CHECK_IS_FAFA FALSE +#define RADIO_CLASS wxT("BUTTON") +#define RADIO_FLAGS (BS_AUTORADIOBUTTON|WS_CHILD|WS_VISIBLE) +#define RADIO_SIZE 20 +#define RADIO_IS_FAFA FALSE +#define PURE_WINDOWS +#define GROUP_CLASS wxT("BUTTON") +#define GROUP_FLAGS (BS_GROUPBOX|WS_CHILD|WS_VISIBLE) + +/* +#define BITCHECK_FLAGS (FB_BITMAP|FC_BUTTONDRAW|FC_DEFAULT|WS_VISIBLE) +#define BITRADIO_FLAGS (FC_BUTTONDRAW|FB_BITMAP|FC_RADIO|WS_CHILD|WS_VISIBLE) +*/ + +// --------------------------------------------------------------------------- +// misc macros +// --------------------------------------------------------------------------- + +#define MEANING_CHARACTER '0' +#define DEFAULT_ITEM_WIDTH 100 +#define DEFAULT_ITEM_HEIGHT 80 + +// Scale font to get edit control height +//#define EDIT_HEIGHT_FROM_CHAR_HEIGHT(cy) (3*(cy)/2) +#define EDIT_HEIGHT_FROM_CHAR_HEIGHT(cy) (cy+8) + +// Generic subclass proc, for panel item moving/sizing and intercept +// EDIT control VK_RETURN messages +extern LONG APIENTRY _EXPORT + wxSubclassedGenericControlProc(WXHWND hWnd, WXUINT message, WXWPARAM wParam, WXLPARAM lParam); + +// --------------------------------------------------------------------------- +// useful macros and functions +// --------------------------------------------------------------------------- + +// a wrapper macro for ZeroMemory() +#if defined(__WIN32__) && !defined(__WXMICROWIN__) +#define wxZeroMemory(obj) ::ZeroMemory(&obj, sizeof(obj)) +#else +#define wxZeroMemory(obj) memset((void*) & obj, 0, sizeof(obj)) +#endif + +// This one is a macro so that it can be tested with #ifdef, it will be +// undefined if it cannot be implemented for a given compiler. +// Vc++, bcc, dmc, ow, mingw, codewarrior (and rsxnt) have _get_osfhandle. +// Cygwin has get_osfhandle. Others are currently unknown, e.g. Salford, +// Intel, Visual Age. +#if defined(__WXWINCE__) + #define wxGetOSFHandle(fd) ((HANDLE)fd) + #define wxOpenOSFHandle(h, flags) ((int)wxPtrToUInt(h)) +#elif defined(__CYGWIN__) + #define wxGetOSFHandle(fd) ((HANDLE)get_osfhandle(fd)) +#elif defined(__VISUALC__) \ + || defined(__BORLANDC__) \ + || defined(__DMC__) \ + || defined(__WATCOMC__) \ + || defined(__MINGW32__) \ + || (defined(__MWERKS__) && defined(__MSL__)) + #define wxGetOSFHandle(fd) ((HANDLE)_get_osfhandle(fd)) + #define wxOpenOSFHandle(h, flags) (_open_osfhandle(wxPtrToUInt(h), flags)) + #define wx_fdopen _fdopen +#endif + +// close the handle in the class dtor +class AutoHANDLE +{ +public: + wxEXPLICIT AutoHANDLE(HANDLE handle) : m_handle(handle) { } + + bool IsOk() const { return m_handle != INVALID_HANDLE_VALUE; } + operator HANDLE() const { return m_handle; } + + ~AutoHANDLE() { if ( IsOk() ) ::CloseHandle(m_handle); } + +protected: + HANDLE m_handle; +}; + +// a template to make initializing Windows styructs less painful: it zeroes all +// the struct fields and also sets cbSize member to the correct value (and so +// can be only used with structures which have this member...) +template <class T> +struct WinStruct : public T +{ + WinStruct() + { + ::ZeroMemory(this, sizeof(T)); + + // explicit qualification is required here for this to be valid C++ + this->cbSize = sizeof(T); + } +}; + + +#if wxUSE_GUI + +#include "wx/gdicmn.h" +#include "wx/colour.h" + +// make conversion from wxColour and COLORREF a bit less painful +inline COLORREF wxColourToRGB(const wxColour& c) +{ + return RGB(c.Red(), c.Green(), c.Blue()); +} + +inline COLORREF wxColourToPalRGB(const wxColour& c) +{ + return PALETTERGB(c.Red(), c.Green(), c.Blue()); +} + +inline wxColour wxRGBToColour(COLORREF rgb) +{ + return wxColour(GetRValue(rgb), GetGValue(rgb), GetBValue(rgb)); +} + +inline void wxRGBToColour(wxColour& c, COLORREF rgb) +{ + c.Set(GetRValue(rgb), GetGValue(rgb), GetBValue(rgb)); +} + +// get the standard colour map for some standard colours - see comment in this +// function to understand why is it needed and when should it be used +// +// it returns a wxCOLORMAP (can't use COLORMAP itself here as comctl32.dll +// might be not included/available) array of size wxSTD_COLOUR_MAX +// +// NB: if you change these colours, update wxBITMAP_STD_COLOURS in the +// resources as well: it must have the same number of pixels! +enum wxSTD_COLOUR +{ + wxSTD_COL_BTNTEXT, + wxSTD_COL_BTNSHADOW, + wxSTD_COL_BTNFACE, + wxSTD_COL_BTNHIGHLIGHT, + wxSTD_COL_MAX +}; + +struct WXDLLEXPORT wxCOLORMAP +{ + COLORREF from, to; +}; + +// this function is implemented in src/msw/window.cpp +extern wxCOLORMAP *wxGetStdColourMap(); + +// create a wxRect from Windows RECT +inline wxRect wxRectFromRECT(const RECT& rc) +{ + return wxRect(rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top); +} + +// copy Windows RECT to our wxRect +inline void wxCopyRECTToRect(const RECT& rc, wxRect& rect) +{ + rect = wxRectFromRECT(rc); +} + +// and vice versa +inline void wxCopyRectToRECT(const wxRect& rect, RECT& rc) +{ + // note that we don't use wxRect::GetRight() as it is one of compared to + // wxRectFromRECT() above + rc.top = rect.y; + rc.left = rect.x; + rc.right = rect.x + rect.width; + rc.bottom = rect.y + rect.height; +} + +// translations between HIMETRIC units (which OLE likes) and pixels (which are +// liked by all the others) - implemented in msw/utilsexc.cpp +extern void HIMETRICToPixel(LONG *x, LONG *y); +extern void PixelToHIMETRIC(LONG *x, LONG *y); + +// Windows convention of the mask is opposed to the wxWidgets one, so we need +// to invert the mask each time we pass one/get one to/from Windows +extern HBITMAP wxInvertMask(HBITMAP hbmpMask, int w = 0, int h = 0); + +// Creates an icon or cursor depending from a bitmap +// +// The bitmap must be valid and it should have a mask. If it doesn't, a default +// mask is created using light grey as the transparent colour. +extern HICON wxBitmapToHICON(const wxBitmap& bmp); + +// Same requirments as above apply and the bitmap must also have the correct +// size. +extern +HCURSOR wxBitmapToHCURSOR(const wxBitmap& bmp, int hotSpotX, int hotSpotY); + +// get (x, y) from DWORD - notice that HI/LOWORD can *not* be used because they +// will fail on system with multiple monitors where the coords may be negative +// +// these macros are standard now (Win98) but some older headers don't have them +#ifndef GET_X_LPARAM + #define GET_X_LPARAM(lp) ((int)(short)LOWORD(lp)) + #define GET_Y_LPARAM(lp) ((int)(short)HIWORD(lp)) +#endif // GET_X_LPARAM + +// get the current state of SHIFT/CTRL keys +inline bool wxIsShiftDown() +{ +// return (::GetKeyState(VK_SHIFT) & 0x100) != 0; + // Returns different negative values on WinME and WinNT, + // so simply test for negative value. + return ::GetKeyState(VK_SHIFT) < 0; +} + +inline bool wxIsCtrlDown() +{ +// return (::GetKeyState(VK_CONTROL) & 0x100) != 0; + // Returns different negative values on WinME and WinNT, + // so simply test for negative value. + return ::GetKeyState(VK_CONTROL) < 0; +} + +// wrapper around GetWindowRect() and GetClientRect() APIs doing error checking +// for Win32 +inline RECT wxGetWindowRect(HWND hwnd) +{ + RECT rect; + + if ( !::GetWindowRect(hwnd, &rect) ) + wxLogLastError(_T("GetWindowRect")); + + return rect; +} + +inline RECT wxGetClientRect(HWND hwnd) +{ + RECT rect; + + if ( !::GetClientRect(hwnd, &rect) ) + wxLogLastError(_T("GetClientRect")); + + return rect; +} + +// --------------------------------------------------------------------------- +// small helper classes +// --------------------------------------------------------------------------- + +// create an instance of this class and use it as the HDC for screen, will +// automatically release the DC going out of scope +class ScreenHDC +{ +public: + ScreenHDC() { m_hdc = ::GetDC(NULL); } + ~ScreenHDC() { ::ReleaseDC(NULL, m_hdc); } + + operator HDC() const { return m_hdc; } + +private: + HDC m_hdc; + + DECLARE_NO_COPY_CLASS(ScreenHDC) +}; + +// the same as ScreenHDC but for window DCs +class WindowHDC +{ +public: + WindowHDC(HWND hwnd) { m_hdc = ::GetDC(m_hwnd = hwnd); } + ~WindowHDC() { ::ReleaseDC(m_hwnd, m_hdc); } + + operator HDC() const { return m_hdc; } + +private: + HWND m_hwnd; + HDC m_hdc; + + DECLARE_NO_COPY_CLASS(WindowHDC) +}; + +// the same as ScreenHDC but for memory DCs: creates the HDC compatible with +// the given one (screen by default) in ctor and destroys it in dtor +class MemoryHDC +{ +public: + MemoryHDC(HDC hdc = 0) { m_hdc = ::CreateCompatibleDC(hdc); } + ~MemoryHDC() { ::DeleteDC(m_hdc); } + + operator HDC() const { return m_hdc; } + +private: + HDC m_hdc; + + DECLARE_NO_COPY_CLASS(MemoryHDC) +}; + +// a class which selects a GDI object into a DC in its ctor and deselects in +// dtor +class SelectInHDC +{ +private: + void DoInit(HGDIOBJ hgdiobj) { m_hgdiobj = ::SelectObject(m_hdc, hgdiobj); } + +public: + SelectInHDC() : m_hdc(NULL) { } + SelectInHDC(HDC hdc, HGDIOBJ hgdiobj) : m_hdc(hdc) { DoInit(hgdiobj); } + + void Init(HDC hdc, HGDIOBJ hgdiobj) + { + wxASSERT_MSG( !m_hdc, _T("initializing twice?") ); + + m_hdc = hdc; + + DoInit(hgdiobj); + } + + ~SelectInHDC() { if ( m_hdc ) ::SelectObject(m_hdc, m_hgdiobj); } + + // return true if the object was successfully selected + operator bool() const { return m_hgdiobj != 0; } + +private: + HDC m_hdc; + HGDIOBJ m_hgdiobj; + + DECLARE_NO_COPY_CLASS(SelectInHDC) +}; + +// a class which cleans up any GDI object +class AutoGDIObject +{ +protected: + AutoGDIObject() { m_gdiobj = NULL; } + AutoGDIObject(HGDIOBJ gdiobj) : m_gdiobj(gdiobj) { } + ~AutoGDIObject() { if ( m_gdiobj ) ::DeleteObject(m_gdiobj); } + + void InitGdiobj(HGDIOBJ gdiobj) + { + wxASSERT_MSG( !m_gdiobj, _T("initializing twice?") ); + + m_gdiobj = gdiobj; + } + + HGDIOBJ GetObject() const { return m_gdiobj; } + +private: + HGDIOBJ m_gdiobj; +}; + +// TODO: all this asks for using a AutoHandler<T, CreateFunc> template... + +// a class for temporary brushes +class AutoHBRUSH : private AutoGDIObject +{ +public: + AutoHBRUSH(COLORREF col) + : AutoGDIObject(::CreateSolidBrush(col)) { } + + operator HBRUSH() const { return (HBRUSH)GetObject(); } +}; + +// a class for temporary fonts +class AutoHFONT : private AutoGDIObject +{ +private: +public: + AutoHFONT() + : AutoGDIObject() { } + + AutoHFONT(const LOGFONT& lf) + : AutoGDIObject(::CreateFontIndirect(&lf)) { } + + void Init(const LOGFONT& lf) { InitGdiobj(::CreateFontIndirect(&lf)); } + + operator HFONT() const { return (HFONT)GetObject(); } +}; + +// a class for temporary pens +class AutoHPEN : private AutoGDIObject +{ +public: + AutoHPEN(COLORREF col) + : AutoGDIObject(::CreatePen(PS_SOLID, 0, col)) { } + + operator HPEN() const { return (HPEN)GetObject(); } +}; + +// classes for temporary bitmaps +class AutoHBITMAP : private AutoGDIObject +{ +public: + AutoHBITMAP(HBITMAP hbmp) : AutoGDIObject(hbmp) { } + + operator HBITMAP() const { return (HBITMAP)GetObject(); } +}; + +class CompatibleBitmap : public AutoHBITMAP +{ +public: + CompatibleBitmap(HDC hdc, int w, int h) + : AutoHBITMAP(::CreateCompatibleBitmap(hdc, w, h)) + { + } +}; + +class MonoBitmap : public AutoHBITMAP +{ +public: + MonoBitmap(int w, int h) + : AutoHBITMAP(::CreateBitmap(w, h, 1, 1, 0)) + { + } +}; + +// class automatically destroys the region object +class AutoHRGN : private AutoGDIObject +{ +public: + AutoHRGN(HRGN hrgn) : AutoGDIObject(hrgn) { } + + operator HRGN() const { return (HRGN)GetObject(); } +}; + +// class sets the specified clipping region during its life time +class HDCClipper +{ +public: + HDCClipper(HDC hdc, HRGN hrgn) + : m_hdc(hdc) + { + if ( !::SelectClipRgn(hdc, hrgn) ) + wxLogLastError(_T("SelectClipRgn")); + } + + ~HDCClipper() + { + ::SelectClipRgn(m_hdc, NULL); + } + +private: + HDC m_hdc; + + DECLARE_NO_COPY_CLASS(HDCClipper) +}; + +// set the given map mode for the life time of this object +// +// NB: SetMapMode() is not supported by CE so we also define a helper macro +// to avoid using it there +#ifdef __WXWINCE__ + #define wxCHANGE_HDC_MAP_MODE(hdc, mm) +#else // !__WXWINCE__ + class HDCMapModeChanger + { + public: + HDCMapModeChanger(HDC hdc, int mm) + : m_hdc(hdc) + { + m_modeOld = ::SetMapMode(hdc, mm); + if ( !m_modeOld ) + wxLogLastError(_T("SelectClipRgn")); + } + + ~HDCMapModeChanger() + { + if ( m_modeOld ) + ::SetMapMode(m_hdc, m_modeOld); + } + + private: + HDC m_hdc; + int m_modeOld; + + DECLARE_NO_COPY_CLASS(HDCMapModeChanger) + }; + + #define wxCHANGE_HDC_MAP_MODE(hdc, mm) \ + HDCMapModeChanger wxMAKE_UNIQUE_NAME(wxHDCMapModeChanger)(hdc, mm) +#endif // __WXWINCE__/!__WXWINCE__ + +// smart buffeer using GlobalAlloc/GlobalFree() +class GlobalPtr +{ +public: + // allocates a block of given size + GlobalPtr(size_t size, unsigned flags = GMEM_MOVEABLE) + { + m_hGlobal = ::GlobalAlloc(flags, size); + if ( !m_hGlobal ) + wxLogLastError(_T("GlobalAlloc")); + } + + ~GlobalPtr() + { + if ( m_hGlobal && ::GlobalFree(m_hGlobal) ) + wxLogLastError(_T("GlobalFree")); + } + + // implicit conversion + operator HGLOBAL() const { return m_hGlobal; } + +private: + HGLOBAL m_hGlobal; + + DECLARE_NO_COPY_CLASS(GlobalPtr) +}; + +// when working with global pointers (which is unfortunately still necessary +// sometimes, e.g. for clipboard) it is important to unlock them exactly as +// many times as we lock them which just asks for using a "smart lock" class +class GlobalPtrLock +{ +public: + GlobalPtrLock(HGLOBAL hGlobal) : m_hGlobal(hGlobal) + { + m_ptr = GlobalLock(hGlobal); + if ( !m_ptr ) + wxLogLastError(_T("GlobalLock")); + } + + ~GlobalPtrLock() + { + if ( !GlobalUnlock(m_hGlobal) ) + { +#ifdef __WXDEBUG__ + // this might happen simply because the block became unlocked + DWORD dwLastError = ::GetLastError(); + if ( dwLastError != NO_ERROR ) + { + wxLogApiError(_T("GlobalUnlock"), dwLastError); + } +#endif // __WXDEBUG__ + } + } + + operator void *() const { return m_ptr; } + +private: + HGLOBAL m_hGlobal; + void *m_ptr; + + DECLARE_NO_COPY_CLASS(GlobalPtrLock) +}; + +// register the class when it is first needed and unregister it in dtor +class ClassRegistrar +{ +public: + // ctor doesn't register the class, call Initialize() for this + ClassRegistrar() { m_registered = -1; } + + // return true if the class is already registered + bool IsInitialized() const { return m_registered != -1; } + + // return true if the class had been already registered + bool IsRegistered() const { return m_registered == 1; } + + // try to register the class if not done yet, return true on success + bool Register(const WNDCLASS& wc) + { + // we should only be called if we hadn't been initialized yet + wxASSERT_MSG( m_registered == -1, + _T("calling ClassRegistrar::Register() twice?") ); + + m_registered = ::RegisterClass(&wc) ? 1 : 0; + if ( !IsRegistered() ) + { + wxLogLastError(_T("RegisterClassEx()")); + } + else + { + m_clsname = wc.lpszClassName; + } + + return m_registered == 1; + } + + // get the name of the registered class (returns empty string if not + // registered) + const wxString& GetName() const { return m_clsname; } + + // unregister the class if it had been registered + ~ClassRegistrar() + { + if ( IsRegistered() ) + { + if ( !::UnregisterClass(m_clsname, wxhInstance) ) + { + wxLogLastError(_T("UnregisterClass")); + } + } + } + +private: + // initial value is -1 which means that we hadn't tried registering the + // class yet, it becomes true or false (1 or 0) when Initialize() is called + int m_registered; + + // the name of the class, only non empty if it had been registered + wxString m_clsname; +}; + +// --------------------------------------------------------------------------- +// macros to make casting between WXFOO and FOO a bit easier: the GetFoo() +// returns Foo cast to the Windows type for oruselves, while GetFooOf() takes +// an argument which should be a pointer or reference to the object of the +// corresponding class (this depends on the macro) +// --------------------------------------------------------------------------- + +#define GetHwnd() ((HWND)GetHWND()) +#define GetHwndOf(win) ((HWND)((win)->GetHWND())) +// old name +#define GetWinHwnd GetHwndOf + +#define GetHdc() ((HDC)GetHDC()) +#define GetHdcOf(dc) ((HDC)(dc).GetHDC()) + +#define GetHbitmap() ((HBITMAP)GetHBITMAP()) +#define GetHbitmapOf(bmp) ((HBITMAP)(bmp).GetHBITMAP()) + +#define GetHicon() ((HICON)GetHICON()) +#define GetHiconOf(icon) ((HICON)(icon).GetHICON()) + +#define GetHaccel() ((HACCEL)GetHACCEL()) +#define GetHaccelOf(table) ((HACCEL)((table).GetHACCEL())) + +#define GetHbrush() ((HBRUSH)GetResourceHandle()) +#define GetHbrushOf(brush) ((HBRUSH)(brush).GetResourceHandle()) + +#define GetHmenu() ((HMENU)GetHMenu()) +#define GetHmenuOf(menu) ((HMENU)menu->GetHMenu()) + +#define GetHcursor() ((HCURSOR)GetHCURSOR()) +#define GetHcursorOf(cursor) ((HCURSOR)(cursor).GetHCURSOR()) + +#define GetHfont() ((HFONT)GetHFONT()) +#define GetHfontOf(font) ((HFONT)(font).GetHFONT()) + +#define GetHimagelist() ((HIMAGELIST)GetHIMAGELIST()) +#define GetHimagelistOf(imgl) ((HIMAGELIST)imgl->GetHIMAGELIST()) + +#define GetHpalette() ((HPALETTE)GetHPALETTE()) +#define GetHpaletteOf(pal) ((HPALETTE)(pal).GetHPALETTE()) + +#define GetHpen() ((HPEN)GetResourceHandle()) +#define GetHpenOf(pen) ((HPEN)(pen).GetResourceHandle()) + +#define GetHrgn() ((HRGN)GetHRGN()) +#define GetHrgnOf(rgn) ((HRGN)(rgn).GetHRGN()) + +#endif // wxUSE_GUI + +// --------------------------------------------------------------------------- +// global functions +// --------------------------------------------------------------------------- + +extern "C" +{ + WXDLLIMPEXP_BASE HINSTANCE wxGetInstance(); +} + +WXDLLIMPEXP_BASE void wxSetInstance(HINSTANCE hInst); + +// return the full path of the given module +inline wxString wxGetFullModuleName(HMODULE hmod) +{ + wxString fullname; + if ( !::GetModuleFileName + ( + hmod, + wxStringBuffer(fullname, MAX_PATH), + MAX_PATH + ) ) + { + wxLogLastError(_T("GetModuleFileName")); + } + + return fullname; +} + +// return the full path of the program file +inline wxString wxGetFullModuleName() +{ + return wxGetFullModuleName((HMODULE)wxGetInstance()); +} + +// return the run-time version of the OS in a format similar to +// WINVER/_WIN32_WINNT compile-time macros: +// +// 0x0300 Windows NT 3.51 +// 0x0400 Windows 95, NT4 +// 0x0410 Windows 98 +// 0x0500 Windows ME, 2000 +// 0x0501 Windows XP +// 0x0502 Windows 2003 +// 0x0600 Longhorn +// +// for the other Windows versions 0 is currently returned +enum wxWinVersion +{ + wxWinVersion_Unknown = 0, + + wxWinVersion_3 = 0x0300, + wxWinVersion_NT3 = wxWinVersion_3, + + wxWinVersion_4 = 0x0400, + wxWinVersion_95 = wxWinVersion_4, + wxWinVersion_NT4 = wxWinVersion_4, + wxWinVersion_98 = 0x0410, + + wxWinVersion_5 = 0x0500, + wxWinVersion_ME = wxWinVersion_5, + wxWinVersion_NT5 = wxWinVersion_5, + wxWinVersion_2000 = wxWinVersion_5, + wxWinVersion_XP = 0x0501, + wxWinVersion_2003 = 0x0502, + + wxWinVersion_6 = 0x0600, + wxWinVersion_NT6 = 0x0600 +}; + +WXDLLIMPEXP_BASE wxWinVersion wxGetWinVersion(); + +#if wxUSE_GUI + +// cursor stuff +extern HCURSOR wxGetCurrentBusyCursor(); // from msw/utils.cpp +extern const wxCursor *wxGetGlobalCursor(); // from msw/cursor.cpp + +WXDLLEXPORT void wxGetCharSize(WXHWND wnd, int *x, int *y, const wxFont& the_font); +WXDLLEXPORT void wxFillLogFont(LOGFONT *logFont, const wxFont *font); +WXDLLEXPORT wxFont wxCreateFontFromLogFont(const LOGFONT *logFont); +WXDLLEXPORT wxFontEncoding wxGetFontEncFromCharSet(int charset); + +WXDLLEXPORT void wxSliderEvent(WXHWND control, WXWORD wParam, WXWORD pos); +WXDLLEXPORT void wxScrollBarEvent(WXHWND hbar, WXWORD wParam, WXWORD pos); + +// Find maximum size of window/rectangle +extern WXDLLEXPORT void wxFindMaxSize(WXHWND hwnd, RECT *rect); + +// Safely get the window text (i.e. without using fixed size buffer) +extern WXDLLEXPORT wxString wxGetWindowText(WXHWND hWnd); + +// get the window class name +extern WXDLLEXPORT wxString wxGetWindowClass(WXHWND hWnd); + +// get the window id (should be unsigned, hence this is not wxWindowID which +// is, for mainly historical reasons, signed) +extern WXDLLEXPORT WXWORD wxGetWindowId(WXHWND hWnd); + +// check if hWnd's WNDPROC is wndProc. Return true if yes, false if they are +// different +extern WXDLLEXPORT bool wxCheckWindowWndProc(WXHWND hWnd, WXFARPROC wndProc); + +// Does this window style specify any border? +inline bool wxStyleHasBorder(long style) +{ + return (style & (wxSIMPLE_BORDER | wxRAISED_BORDER | + wxSUNKEN_BORDER | wxDOUBLE_BORDER)) != 0; +} + +// ---------------------------------------------------------------------------- +// functions mapping HWND to wxWindow +// ---------------------------------------------------------------------------- + +// this function simply checks whether the given hWnd corresponds to a wxWindow +// and returns either that window if it does or NULL otherwise +extern WXDLLEXPORT wxWindow* wxFindWinFromHandle(WXHWND hWnd); + +// find the window for HWND which is part of some wxWindow, i.e. unlike +// wxFindWinFromHandle() above it will also work for "sub controls" of a +// wxWindow. +// +// returns the wxWindow corresponding to the given HWND or NULL. +extern WXDLLEXPORT wxWindow *wxGetWindowFromHWND(WXHWND hwnd); + +// Get the size of an icon +extern WXDLLEXPORT wxSize wxGetHiconSize(HICON hicon); + +// Lines are drawn differently for WinCE and regular WIN32 +WXDLLEXPORT void wxDrawLine(HDC hdc, int x1, int y1, int x2, int y2); + +// fill the client rect of the given window on the provided dc using this brush +inline void wxFillRect(HWND hwnd, HDC hdc, HBRUSH hbr) +{ + RECT rc; + ::GetClientRect(hwnd, &rc); + ::FillRect(hdc, &rc, hbr); +} + +// ---------------------------------------------------------------------------- +// 32/64 bit helpers +// ---------------------------------------------------------------------------- + +#ifdef __WIN64__ + +inline void *wxGetWindowProc(HWND hwnd) +{ + return (void *)::GetWindowLongPtr(hwnd, GWLP_WNDPROC); +} + +inline void *wxGetWindowUserData(HWND hwnd) +{ + return (void *)::GetWindowLongPtr(hwnd, GWLP_USERDATA); +} + +inline WNDPROC wxSetWindowProc(HWND hwnd, WNDPROC func) +{ + return (WNDPROC)::SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR)func); +} + +inline void *wxSetWindowUserData(HWND hwnd, void *data) +{ + return (void *)::SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)data); +} + +#else // __WIN32__ + +// note that the casts to LONG_PTR here are required even on 32-bit machines +// for the 64-bit warning mode of later versions of MSVC (C4311/4312) +inline WNDPROC wxGetWindowProc(HWND hwnd) +{ + return (WNDPROC)(LONG_PTR)::GetWindowLong(hwnd, GWL_WNDPROC); +} + +inline void *wxGetWindowUserData(HWND hwnd) +{ + return (void *)(LONG_PTR)::GetWindowLong(hwnd, GWL_USERDATA); +} + +inline WNDPROC wxSetWindowProc(HWND hwnd, WNDPROC func) +{ + return (WNDPROC)(LONG_PTR)::SetWindowLong(hwnd, GWL_WNDPROC, (LONG_PTR)func); +} + +inline void *wxSetWindowUserData(HWND hwnd, void *data) +{ + return (void *)(LONG_PTR)::SetWindowLong(hwnd, GWL_USERDATA, (LONG_PTR)data); +} + +#endif // __WIN64__/__WIN32__ + +#endif // wxUSE_GUI + +#endif // _WX_PRIVATE_H_ diff --git a/Externals/wxWidgets/include/wx/msw/question.ico b/Externals/wxWidgets/include/wx/msw/question.ico new file mode 100644 index 0000000000..b34c3b81d1 Binary files /dev/null and b/Externals/wxWidgets/include/wx/msw/question.ico differ diff --git a/Externals/wxWidgets/include/wx/msw/radiobox.h b/Externals/wxWidgets/include/wx/msw/radiobox.h new file mode 100644 index 0000000000..c056ed61c1 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/radiobox.h @@ -0,0 +1,173 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/radiobox.h +// Purpose: wxRadioBox class +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: radiobox.h 43881 2006-12-09 19:48:21Z PC $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_RADIOBOX_H_ +#define _WX_RADIOBOX_H_ + +#include "wx/statbox.h" + +class WXDLLEXPORT wxSubwindows; + +// ---------------------------------------------------------------------------- +// wxRadioBox +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxRadioBox : public wxStaticBox, public wxRadioBoxBase +{ +public: + wxRadioBox() { Init(); } + + wxRadioBox(wxWindow *parent, + wxWindowID id, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + int n = 0, const wxString choices[] = NULL, + int majorDim = 0, + long style = wxRA_HORIZONTAL, + const wxValidator& val = wxDefaultValidator, + const wxString& name = wxRadioBoxNameStr) + { + Init(); + + (void)Create(parent, id, title, pos, size, n, choices, majorDim, + style, val, name); + } + + wxRadioBox(wxWindow *parent, + wxWindowID id, + const wxString& title, + const wxPoint& pos, + const wxSize& size, + const wxArrayString& choices, + int majorDim = 0, + long style = wxRA_HORIZONTAL, + const wxValidator& val = wxDefaultValidator, + const wxString& name = wxRadioBoxNameStr) + { + Init(); + + (void)Create(parent, id, title, pos, size, choices, majorDim, + style, val, name); + } + + virtual ~wxRadioBox(); + + bool Create(wxWindow *parent, + wxWindowID id, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + int n = 0, const wxString choices[] = NULL, + int majorDim = 0, + long style = wxRA_HORIZONTAL, + const wxValidator& val = wxDefaultValidator, + const wxString& name = wxRadioBoxNameStr); + bool Create(wxWindow *parent, + wxWindowID id, + const wxString& title, + const wxPoint& pos, + const wxSize& size, + const wxArrayString& choices, + int majorDim = 0, + long style = wxRA_HORIZONTAL, + const wxValidator& val = wxDefaultValidator, + const wxString& name = wxRadioBoxNameStr); + + // implement the radiobox interface + virtual void SetSelection(int n); + virtual int GetSelection() const { return m_selectedButton; } + virtual unsigned int GetCount() const; + virtual wxString GetString(unsigned int n) const; + virtual void SetString(unsigned int n, const wxString& label); + virtual bool Enable(unsigned int n, bool enable = true); + virtual bool Show(unsigned int n, bool show = true); + virtual bool IsItemEnabled(unsigned int n) const; + virtual bool IsItemShown(unsigned int n) const; + virtual int GetItemFromPoint(const wxPoint& pt) const; + + // override some base class methods + virtual bool Show(bool show = true); + virtual bool Enable(bool enable = true); + virtual void SetFocus(); + virtual bool SetFont(const wxFont& font); + virtual bool ContainsHWND(WXHWND hWnd) const; +#if wxUSE_TOOLTIPS + virtual bool HasToolTips() const; +#endif // wxUSE_TOOLTIPS +#if wxUSE_HELP + // override virtual function with a platform-independent implementation + virtual wxString GetHelpTextAtPoint(const wxPoint & pt, wxHelpEvent::Origin origin) const + { + return wxRadioBoxBase::DoGetHelpTextAtPoint( this, pt, origin ); + } +#endif // wxUSE_HELP + + // we inherit a version always returning false from wxStaticBox, override + // it to behave normally + virtual bool AcceptsFocus() const { return wxControl::AcceptsFocus(); } + + void SetLabelFont(const wxFont& WXUNUSED(font)) {} + void SetButtonFont(const wxFont& font) { SetFont(font); } + + // implementation only from now on + // ------------------------------- + + virtual bool MSWCommand(WXUINT param, WXWORD id); + void Command(wxCommandEvent& event); + + void SendNotificationEvent(); + +protected: + // common part of all ctors + void Init(); + + // subclass one radio button + void SubclassRadioButton(WXHWND hWndBtn); + + // get the max size of radio buttons + wxSize GetMaxButtonSize() const; + + // get the total size occupied by the radio box buttons + wxSize GetTotalButtonSize(const wxSize& sizeBtn) const; + + virtual void DoSetSize(int x, int y, + int width, int height, + int sizeFlags = wxSIZE_AUTO); + virtual wxSize DoGetBestSize() const; + +#if wxUSE_TOOLTIPS + virtual void DoSetItemToolTip(unsigned int n, wxToolTip * tooltip); +#endif + +#ifndef __WXWINCE__ + virtual WXHRGN MSWGetRegionWithoutChildren(); +#endif // __WXWINCE__ + + + // the buttons we contain + wxSubwindows *m_radioButtons; + + // array of widths and heights of the buttons, may be wxDefaultCoord if the + // corresponding quantity should be computed + int *m_radioWidth; + int *m_radioHeight; + + // currently selected button or wxNOT_FOUND if none + int m_selectedButton; + +private: + DECLARE_DYNAMIC_CLASS(wxRadioBox) + DECLARE_NO_COPY_CLASS(wxRadioBox) +}; + +#endif + // _WX_RADIOBOX_H_ diff --git a/Externals/wxWidgets/include/wx/msw/radiobut.h b/Externals/wxWidgets/include/wx/msw/radiobut.h new file mode 100644 index 0000000000..6e48bf3f37 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/radiobut.h @@ -0,0 +1,70 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: radiobut.h +// Purpose: wxRadioButton class +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: radiobut.h 41144 2006-09-10 23:08:13Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_RADIOBUT_H_ +#define _WX_RADIOBUT_H_ + +class WXDLLEXPORT wxRadioButton: public wxControl +{ +public: + // ctors and creation functions + wxRadioButton() { Init(); } + + wxRadioButton(wxWindow *parent, + wxWindowID id, + const wxString& label, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxRadioButtonNameStr) + { + Init(); + + Create(parent, id, label, pos, size, style, validator, name); + } + + bool Create(wxWindow *parent, + wxWindowID id, + const wxString& label, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxRadioButtonNameStr); + + // implement the radio button interface + virtual void SetValue(bool value); + virtual bool GetValue() const; + + // implementation only from now on + virtual bool MSWCommand(WXUINT param, WXWORD id); + virtual void Command(wxCommandEvent& event); + virtual bool HasTransparentBackground() { return true; } + + virtual WXDWORD MSWGetStyle(long style, WXDWORD *exstyle) const; + +protected: + virtual wxSize DoGetBestSize() const; + +private: + // common part of all ctors + void Init(); + + // we need to store the state internally as the result of GetValue() + // sometimes gets out of sync in WM_COMMAND handler + bool m_isChecked; + + DECLARE_DYNAMIC_CLASS_NO_COPY(wxRadioButton) +}; + +#endif + // _WX_RADIOBUT_H_ diff --git a/Externals/wxWidgets/include/wx/msw/rcdefs.h b/Externals/wxWidgets/include/wx/msw/rcdefs.h new file mode 100644 index 0000000000..f1b9aa465d --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/rcdefs.h @@ -0,0 +1,15 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/rcdefs.h +// Purpose: Fallback for the generated rcdefs.h under the lib directory +// Author: Mike Wetherell +// RCS-ID: $Id: rcdefs.h 36133 2005-11-08 22:49:46Z MW $ +// Copyright: (c) 2005 Mike Wetherell +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_RCDEFS_H +#define _WX_RCDEFS_H + +#define WX_CPU_X86 + +#endif diff --git a/Externals/wxWidgets/include/wx/msw/regconf.h b/Externals/wxWidgets/include/wx/msw/regconf.h new file mode 100644 index 0000000000..a352a249a3 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/regconf.h @@ -0,0 +1,110 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: msw/regconf.h +// Purpose: Registry based implementation of wxConfigBase +// Author: Vadim Zeitlin +// Modified by: +// Created: 27.04.98 +// RCS-ID: $Id: regconf.h 35650 2005-09-23 12:56:45Z MR $ +// Copyright: (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _REGCONF_H +#define _REGCONF_H + +#ifndef _REGISTRY_H + #include "wx/msw/registry.h" +#endif + +#include "wx/object.h" +#include "wx/confbase.h" + +// ---------------------------------------------------------------------------- +// wxRegConfig +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxRegConfig : public wxConfigBase +{ +public: + // ctor & dtor + // will store data in HKLM\appName and HKCU\appName + wxRegConfig(const wxString& appName = wxEmptyString, + const wxString& vendorName = wxEmptyString, + const wxString& localFilename = wxEmptyString, + const wxString& globalFilename = wxEmptyString, + long style = wxCONFIG_USE_GLOBAL_FILE); + + // dtor will save unsaved data + virtual ~wxRegConfig(){} + + // implement inherited pure virtual functions + // ------------------------------------------ + + // path management + virtual void SetPath(const wxString& strPath); + virtual const wxString& GetPath() const { return m_strPath; } + + // entry/subgroup info + // enumerate all of them + virtual bool GetFirstGroup(wxString& str, long& lIndex) const; + virtual bool GetNextGroup (wxString& str, long& lIndex) const; + virtual bool GetFirstEntry(wxString& str, long& lIndex) const; + virtual bool GetNextEntry (wxString& str, long& lIndex) const; + + // tests for existence + virtual bool HasGroup(const wxString& strName) const; + virtual bool HasEntry(const wxString& strName) const; + virtual EntryType GetEntryType(const wxString& name) const; + + // get number of entries/subgroups in the current group, with or without + // it's subgroups + virtual size_t GetNumberOfEntries(bool bRecursive = false) const; + virtual size_t GetNumberOfGroups(bool bRecursive = false) const; + + virtual bool Flush(bool WXUNUSED(bCurrentOnly) = false) { return true; } + + // rename + virtual bool RenameEntry(const wxString& oldName, const wxString& newName); + virtual bool RenameGroup(const wxString& oldName, const wxString& newName); + + // delete + virtual bool DeleteEntry(const wxString& key, bool bGroupIfEmptyAlso = true); + virtual bool DeleteGroup(const wxString& key); + virtual bool DeleteAll(); + +protected: + // opens the local key creating it if necessary and returns it + wxRegKey& LocalKey() const // must be const to be callable from const funcs + { + wxRegConfig* self = wxConstCast(this, wxRegConfig); + + if ( !m_keyLocal.IsOpened() ) + { + // create on demand + self->m_keyLocal.Create(); + } + + return self->m_keyLocal; + } + + // implement read/write methods + virtual bool DoReadString(const wxString& key, wxString *pStr) const; + virtual bool DoReadLong(const wxString& key, long *plResult) const; + + virtual bool DoWriteString(const wxString& key, const wxString& szValue); + virtual bool DoWriteLong(const wxString& key, long lValue); + +private: + // no copy ctor/assignment operator + wxRegConfig(const wxRegConfig&); + wxRegConfig& operator=(const wxRegConfig&); + + // these keys are opened during all lifetime of wxRegConfig object + wxRegKey m_keyLocalRoot, m_keyLocal, + m_keyGlobalRoot, m_keyGlobal; + + // current path (not '/' terminated) + wxString m_strPath; +}; + +#endif //_REGCONF_H diff --git a/Externals/wxWidgets/include/wx/msw/region.h b/Externals/wxWidgets/include/wx/msw/region.h new file mode 100644 index 0000000000..9fe434391f --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/region.h @@ -0,0 +1,102 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/region.h +// Purpose: wxRegion class +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: region.h 41429 2006-09-25 11:47:23Z VZ $ +// Copyright: (c) 1997-2002 wxWidgets team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MSW_REGION_H_ +#define _WX_MSW_REGION_H_ + +class WXDLLEXPORT wxRegion : public wxRegionWithCombine +{ +public: + wxRegion(); + wxRegion(wxCoord x, wxCoord y, wxCoord w, wxCoord h); + wxRegion(const wxPoint& topLeft, const wxPoint& bottomRight); + wxRegion(const wxRect& rect); + wxRegion(WXHRGN hRegion); // Hangs on to this region + wxRegion(size_t n, const wxPoint *points, int fillStyle = wxODDEVEN_RULE ); + wxRegion( const wxBitmap& bmp) + { + Union(bmp); + } + wxRegion( const wxBitmap& bmp, + const wxColour& transColour, int tolerance = 0) + { + Union(bmp, transColour, tolerance); + } + + virtual ~wxRegion(); + + // wxRegionBase methods + virtual void Clear(); + virtual bool IsEmpty() const; + + // Get internal region handle + WXHRGN GetHRGN() const; + +protected: + virtual wxObjectRefData *CreateRefData() const; + virtual wxObjectRefData *CloneRefData(const wxObjectRefData *data) const; + + virtual bool DoIsEqual(const wxRegion& region) const; + virtual bool DoGetBox(wxCoord& x, wxCoord& y, wxCoord& w, wxCoord& h) const; + virtual wxRegionContain DoContainsPoint(wxCoord x, wxCoord y) const; + virtual wxRegionContain DoContainsRect(const wxRect& rect) const; + + virtual bool DoOffset(wxCoord x, wxCoord y); + virtual bool DoCombine(const wxRegion& region, wxRegionOp op); + + friend class WXDLLEXPORT wxRegionIterator; + + DECLARE_DYNAMIC_CLASS(wxRegion) +}; + +class WXDLLEXPORT wxRegionIterator : public wxObject +{ +public: + wxRegionIterator() { Init(); } + wxRegionIterator(const wxRegion& region); + wxRegionIterator(const wxRegionIterator& ri) : wxObject(ri) { Init(); *this = ri; } + + wxRegionIterator& operator=(const wxRegionIterator& ri); + + virtual ~wxRegionIterator(); + + void Reset() { m_current = 0; } + void Reset(const wxRegion& region); + + bool HaveRects() const { return (m_current < m_numRects); } + + operator bool () const { return HaveRects(); } + + wxRegionIterator& operator++(); + wxRegionIterator operator++(int); + + wxCoord GetX() const; + wxCoord GetY() const; + wxCoord GetW() const; + wxCoord GetWidth() const { return GetW(); } + wxCoord GetH() const; + wxCoord GetHeight() const { return GetH(); } + + wxRect GetRect() const { return wxRect(GetX(), GetY(), GetW(), GetH()); } + +private: + // common part of all ctors + void Init(); + + long m_current; + long m_numRects; + wxRegion m_region; + wxRect* m_rects; + + DECLARE_DYNAMIC_CLASS(wxRegionIterator) +}; + +#endif // _WX_MSW_REGION_H_ diff --git a/Externals/wxWidgets/include/wx/msw/registry.h b/Externals/wxWidgets/include/wx/msw/registry.h new file mode 100644 index 0000000000..04758d2804 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/registry.h @@ -0,0 +1,247 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/registry.h +// Purpose: Registry classes and functions +// Author: Vadim Zeitlin +// Modified by: +// Created: 03.04.1998 +// RCS-ID: $Id: registry.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MSW_REGISTRY_H_ +#define _WX_MSW_REGISTRY_H_ + +class WXDLLIMPEXP_FWD_BASE wxOutputStream; + +// ---------------------------------------------------------------------------- +// class wxRegKey encapsulates window HKEY handle +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxRegKey +{ +public: + // NB: do _not_ change the values of elements in these enumerations! + + // registry value types (with comments from winnt.h) + enum ValueType + { + Type_None, // No value type + Type_String, // Unicode nul terminated string + Type_Expand_String, // Unicode nul terminated string + // (with environment variable references) + Type_Binary, // Free form binary + Type_Dword, // 32-bit number + Type_Dword_little_endian // 32-bit number + = Type_Dword, // (same as Type_DWORD) + Type_Dword_big_endian, // 32-bit number + Type_Link, // Symbolic Link (unicode) + Type_Multi_String, // Multiple Unicode strings + Type_Resource_list, // Resource list in the resource map + Type_Full_resource_descriptor, // Resource list in the hardware description + Type_Resource_requirements_list // ??? + }; + + // predefined registry keys + enum StdKey + { + HKCR, // classes root + HKCU, // current user + HKLM, // local machine + HKUSR, // users + HKPD, // performance data (WinNT/2K only) + HKCC, // current config + HKDD, // dynamic data (Win95/98 only) + HKMAX + }; + + // access mode for the key + enum AccessMode + { + Read, // read-only + Write // read and write + }; + + // information about standard (predefined) registry keys + // number of standard keys + static const size_t nStdKeys; + // get the name of a standard key + static const wxChar *GetStdKeyName(size_t key); + // get the short name of a standard key + static const wxChar *GetStdKeyShortName(size_t key); + // get StdKey from root HKEY + static StdKey GetStdKeyFromHkey(WXHKEY hkey); + + // extacts the std key prefix from the string (return value) and + // leaves only the part after it (i.e. modifies the string passed!) + static StdKey ExtractKeyName(wxString& str); + + // ctors + // root key is set to HKCR (the only root key under Win16) + wxRegKey(); + // strKey is the full name of the key (i.e. starting with HKEY_xxx...) + wxRegKey(const wxString& strKey); + // strKey is the name of key under (standard key) keyParent + wxRegKey(StdKey keyParent, const wxString& strKey); + // strKey is the name of key under (previously created) keyParent + wxRegKey(const wxRegKey& keyParent, const wxString& strKey); + // dtor closes the key + ~wxRegKey(); + + // change key (closes the previously opened key if any) + // the name is absolute, i.e. should start with HKEY_xxx + void SetName(const wxString& strKey); + // the name is relative to the parent key + void SetName(StdKey keyParent, const wxString& strKey); + // the name is relative to the parent key + void SetName(const wxRegKey& keyParent, const wxString& strKey); + // hKey should be opened and will be closed in wxRegKey dtor + void SetHkey(WXHKEY hKey); + + // get infomation about the key + // get the (full) key name. Abbreviate std root keys if bShortPrefix. + wxString GetName(bool bShortPrefix = true) const; + // return true if the key exists + bool Exists() const; + // get the info about key (any number of these pointers may be NULL) + bool GetKeyInfo(size_t *pnSubKeys, // number of subkeys + size_t *pnMaxKeyLen, // max len of subkey name + size_t *pnValues, // number of values + size_t *pnMaxValueLen) const; + // return true if the key is opened + bool IsOpened() const { return m_hKey != 0; } + // for "if ( !key ) wxLogError(...)" kind of expressions + operator bool() const { return m_dwLastError == 0; } + + // operations on the key itself + // explicitly open the key (will be automatically done by all functions + // which need the key to be opened if the key is not opened yet) + bool Open(AccessMode mode = Write); + // create the key: will fail if the key already exists and !bOkIfExists + bool Create(bool bOkIfExists = true); + // rename a value from old name to new one + bool RenameValue(const wxChar *szValueOld, const wxChar *szValueNew); + // rename the key + bool Rename(const wxChar *szNewName); + // copy value to another key possibly changing its name (by default it will + // remain the same) + bool CopyValue(const wxChar *szValue, wxRegKey& keyDst, + const wxChar *szNewName = NULL); + // copy the entire contents of the key recursively to another location + bool Copy(const wxChar *szNewName); + // same as Copy() but using a key and not the name + bool Copy(wxRegKey& keyDst); + // close the key (will be automatically done in dtor) + bool Close(); + + // deleting keys/values + // deletes this key and all of it's subkeys/values + bool DeleteSelf(); + // deletes the subkey with all of it's subkeys/values recursively + bool DeleteKey(const wxChar *szKey); + // deletes the named value (may be NULL to remove the default value) + bool DeleteValue(const wxChar *szValue); + + // access to values and subkeys + // get value type + ValueType GetValueType(const wxChar *szValue) const; + // returns true if the value contains a number (else it's some string) + bool IsNumericValue(const wxChar *szValue) const; + + // assignment operators set the default value of the key + wxRegKey& operator=(const wxString& strValue) + { SetValue(NULL, strValue); return *this; } + wxRegKey& operator=(long lValue) + { SetValue(NULL, lValue); return *this; } + + // query the default value of the key: implicitly or explicitly + wxString QueryDefaultValue() const; + operator wxString() const { return QueryDefaultValue(); } + + // named values + + // set the string value + bool SetValue(const wxChar *szValue, const wxString& strValue); + // retrieve the string value + bool QueryValue(const wxChar *szValue, wxString& strValue) const + { return QueryValue(szValue, strValue, false); } + // retrieve raw string value + bool QueryRawValue(const wxChar *szValue, wxString& strValue) const + { return QueryValue(szValue, strValue, true); } + // retrieve either raw or expanded string value + bool QueryValue(const wxChar *szValue, wxString& strValue, bool raw) const; + + // set the numeric value + bool SetValue(const wxChar *szValue, long lValue); + // return the numeric value + bool QueryValue(const wxChar *szValue, long *plValue) const; + // set the binary value + bool SetValue(const wxChar *szValue, const wxMemoryBuffer& buf); + // return the binary value + bool QueryValue(const wxChar *szValue, wxMemoryBuffer& buf) const; + + // query existence of a key/value + // return true if value exists + bool HasValue(const wxChar *szKey) const; + // return true if given subkey exists + bool HasSubKey(const wxChar *szKey) const; + // return true if any subkeys exist + bool HasSubkeys() const; + // return true if any values exist + bool HasValues() const; + // return true if the key is empty (nothing under this key) + bool IsEmpty() const { return !HasSubkeys() && !HasValues(); } + + // enumerate values and subkeys + bool GetFirstValue(wxString& strValueName, long& lIndex); + bool GetNextValue (wxString& strValueName, long& lIndex) const; + + bool GetFirstKey (wxString& strKeyName , long& lIndex); + bool GetNextKey (wxString& strKeyName , long& lIndex) const; + + // export the contents of this key and all its subkeys to the given file + // (which won't be overwritten, it's an error if it already exists) + // + // note that we export the key in REGEDIT4 format, not RegSaveKey() binary + // format nor newer REGEDIT5 one + bool Export(const wxString& filename) const; + + // same as above but write to the given (opened) stream + bool Export(wxOutputStream& ostr) const; + + + // for wxRegConfig usage only: preallocate some memory for the name + void ReserveMemoryForName(size_t bytes) { m_strKey.reserve(bytes); } + +private: + // common part of all ctors + void Init() + { + m_hKey = (WXHKEY) NULL; + m_dwLastError = 0; + } + + // recursive helper for Export() + bool DoExport(wxOutputStream& ostr) const; + + // export a single value + bool DoExportValue(wxOutputStream& ostr, const wxString& name) const; + + // return the text representation (in REGEDIT4 format) of the value with the + // given name + wxString FormatValue(const wxString& name) const; + + + WXHKEY m_hKey, // our handle + m_hRootKey; // handle of the top key (i.e. StdKey) + wxString m_strKey; // key name (relative to m_hRootKey) + + AccessMode m_mode; // valid only if key is opened + long m_dwLastError; // last error (0 if none) + + + DECLARE_NO_COPY_CLASS(wxRegKey) +}; + +#endif // _WX_MSW_REGISTRY_H_ + diff --git a/Externals/wxWidgets/include/wx/msw/removble.ico b/Externals/wxWidgets/include/wx/msw/removble.ico new file mode 100644 index 0000000000..f218a894c2 Binary files /dev/null and b/Externals/wxWidgets/include/wx/msw/removble.ico differ diff --git a/Externals/wxWidgets/include/wx/msw/rightarr.cur b/Externals/wxWidgets/include/wx/msw/rightarr.cur new file mode 100644 index 0000000000..c54c3ac4b0 Binary files /dev/null and b/Externals/wxWidgets/include/wx/msw/rightarr.cur differ diff --git a/Externals/wxWidgets/include/wx/msw/roller.cur b/Externals/wxWidgets/include/wx/msw/roller.cur new file mode 100644 index 0000000000..118c37fa43 Binary files /dev/null and b/Externals/wxWidgets/include/wx/msw/roller.cur differ diff --git a/Externals/wxWidgets/include/wx/msw/scrolbar.h b/Externals/wxWidgets/include/wx/msw/scrolbar.h new file mode 100644 index 0000000000..bfe86c6a80 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/scrolbar.h @@ -0,0 +1,72 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: scrollbar.h +// Purpose: wxScrollBar class +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: scrolbar.h 41020 2006-09-05 20:47:48Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_SCROLBAR_H_ +#define _WX_SCROLBAR_H_ + +// Scrollbar item +class WXDLLEXPORT wxScrollBar: public wxScrollBarBase +{ +public: + wxScrollBar() { m_pageSize = 0; m_viewSize = 0; m_objectSize = 0; } + virtual ~wxScrollBar(); + + wxScrollBar(wxWindow *parent, wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxSB_HORIZONTAL, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxScrollBarNameStr) + { + Create(parent, id, pos, size, style, validator, name); + } + bool Create(wxWindow *parent, wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxSB_HORIZONTAL, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxScrollBarNameStr); + + int GetThumbPosition() const ; + int GetThumbSize() const { return m_pageSize; } + int GetPageSize() const { return m_viewSize; } + int GetRange() const { return m_objectSize; } + + virtual void SetThumbPosition(int viewStart); + virtual void SetScrollbar(int position, int thumbSize, int range, int pageSize, + bool refresh = true); + + // needed for RTTI + void SetThumbSize( int s ) { SetScrollbar( GetThumbPosition() , s , GetRange() , GetPageSize() , true ) ; } + void SetPageSize( int s ) { SetScrollbar( GetThumbPosition() , GetThumbSize() , GetRange() , s , true ) ; } + void SetRange( int s ) { SetScrollbar( GetThumbPosition() , GetThumbSize() , s , GetPageSize() , true ) ; } + + void Command(wxCommandEvent& event); + virtual bool MSWOnScroll(int orientation, WXWORD wParam, + WXWORD pos, WXHWND control); + + // override wxControl version to not use solid background here + virtual WXHBRUSH MSWControlColor(WXHDC pDC, WXHWND hWnd); + + virtual WXDWORD MSWGetStyle(long style, WXDWORD *exstyle) const; + +protected: + virtual wxSize DoGetBestSize() const; + + int m_pageSize; + int m_viewSize; + int m_objectSize; + + DECLARE_DYNAMIC_CLASS_NO_COPY(wxScrollBar) +}; + +#endif + // _WX_SCROLBAR_H_ diff --git a/Externals/wxWidgets/include/wx/msw/seh.h b/Externals/wxWidgets/include/wx/msw/seh.h new file mode 100644 index 0000000000..23053fab09 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/seh.h @@ -0,0 +1,74 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/seh.h +// Purpose: declarations for SEH (structured exceptions handling) support +// Author: Vadim Zeitlin +// Created: 2006-04-26 +// RCS-ID: $Id: seh.h 44451 2007-02-11 02:17:28Z VZ $ +// Copyright: (c) 2006 Vadim Zeitlin <vadim@wxwindows.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MSW_SEH_H_ +#define _WX_MSW_SEH_H_ + +#if wxUSE_ON_FATAL_EXCEPTION + + // the exception handler which should be called from the exception filter + // + // it calsl wxApp::OnFatalException() if possible + extern unsigned long wxGlobalSEHandler(EXCEPTION_POINTERS *pExcPtrs); + + // helper macro for wxSEH_HANDLE +#if defined(__BORLANDC__) || (defined(__VISUALC__) && (__VISUALC__ <= 1200)) + // some compilers don't understand that this code is unreachable and warn + // about no value being returned from the function without it, so calm them + // down + #define wxSEH_DUMMY_RETURN(rc) return rc; +#else + #define wxSEH_DUMMY_RETURN(rc) +#endif + + // macros which allow to avoid many #if wxUSE_ON_FATAL_EXCEPTION in the code + // which uses them + #define wxSEH_TRY __try + #define wxSEH_IGNORE __except ( EXCEPTION_EXECUTE_HANDLER ) { } + #define wxSEH_HANDLE(rc) \ + __except ( wxGlobalSEHandler(GetExceptionInformation()) ) \ + { \ + /* use the same exit code as abort() */ \ + ::ExitProcess(3); \ + \ + wxSEH_DUMMY_RETURN(rc) \ + } + +#else // wxUSE_ON_FATAL_EXCEPTION + #define wxSEH_TRY + #define wxSEH_IGNORE + #define wxSEH_HANDLE(rc) +#endif // wxUSE_ON_FATAL_EXCEPTION + +#if wxUSE_ON_FATAL_EXCEPTION && defined(__VISUALC__) && !defined(__WXWINCE__) + #include <eh.h> + + // C++ exception to structured exceptions translator: we need it in order + // to prevent VC++ from "helpfully" translating structured exceptions (such + // as division by 0 or access violation) to C++ pseudo-exceptions + extern void wxSETranslator(unsigned int code, EXCEPTION_POINTERS *ep); + + // up to VC 7.1 this warning ("calling _set_se_translator() requires /EHa") + // is harmless and it's easier to suppress it than use different makefiles + // for VC5 and 6 (which don't support /EHa at all) and VC7 (which does + // accept it but it seems to change nothing for it anyhow) + #if __VISUALC__ <= 1310 + #pragma warning(disable: 4535) + #endif + + // note that the SE translator must be called wxSETranslator! + #define DisableAutomaticSETranslator() _set_se_translator(wxSETranslator) +#else // !__VISUALC__ + // the other compilers do nothing as stupid by default so nothing to do for + // them + #define DisableAutomaticSETranslator() +#endif // __VISUALC__/!__VISUALC__ + +#endif // _WX_MSW_SEH_H_ diff --git a/Externals/wxWidgets/include/wx/msw/setup.h b/Externals/wxWidgets/include/wx/msw/setup.h new file mode 100644 index 0000000000..f3f674416d --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/setup.h @@ -0,0 +1,1349 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/setup.h +// Purpose: Configuration for the library +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: setup0.h 43908 2006-12-11 06:19:27Z RD $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_SETUP_H_ +#define _WX_SETUP_H_ + +/* --- start common options --- */ +// ---------------------------------------------------------------------------- +// global settings +// ---------------------------------------------------------------------------- + +// define this to 0 when building wxBase library - this can also be done from +// makefile/project file overriding the value here +#ifndef wxUSE_GUI + #define wxUSE_GUI 1 +#endif // wxUSE_GUI + +// ---------------------------------------------------------------------------- +// compatibility settings +// ---------------------------------------------------------------------------- + +// This setting determines the compatibility with 2.4 API: set it to 1 to +// enable it but please consider updating your code instead. +// +// Default is 0 +// +// Recommended setting: 0 (please update your code) +#define WXWIN_COMPATIBILITY_2_4 0 + +// This setting determines the compatibility with 2.6 API: set it to 0 to +// flag all cases of using deprecated functions. +// +// Default is 1 but please try building your code with 0 as the default will +// change to 0 in the next version and the deprecated functions will disappear +// in the version after it completely. +// +// Recommended setting: 0 (please update your code) +#define WXWIN_COMPATIBILITY_2_6 1 + +// MSW-only: Set to 0 for accurate dialog units, else 1 for old behaviour when +// default system font is used for wxWindow::GetCharWidth/Height() instead of +// the current font. +// +// Default is 0 +// +// Recommended setting: 0 +#define wxDIALOG_UNIT_COMPATIBILITY 0 + +// ---------------------------------------------------------------------------- +// debugging settings +// ---------------------------------------------------------------------------- + +// Generic comment about debugging settings: they are very useful if you don't +// use any other memory leak detection tools such as Purify/BoundsChecker, but +// are probably redundant otherwise. Also, Visual C++ CRT has the same features +// as wxWidgets memory debugging subsystem built in since version 5.0 and you +// may prefer to use it instead of built in memory debugging code because it is +// faster and more fool proof. +// +// Using VC++ CRT memory debugging is enabled by default in debug mode +// (__WXDEBUG__) if wxUSE_GLOBAL_MEMORY_OPERATORS is *not* enabled (i.e. is 0) +// and if __NO_VC_CRTDBG__ is not defined. + +// If 1, enables wxDebugContext, for writing error messages to file, etc. If +// __WXDEBUG__ is not defined, will still use the normal memory operators. +// +// Default is 0 +// +// Recommended setting: 0 +#define wxUSE_DEBUG_CONTEXT 0 + +// If 1, enables debugging versions of wxObject::new and wxObject::delete *IF* +// __WXDEBUG__ is also defined. +// +// WARNING: this code may not work with all architectures, especially if +// alignment is an issue. This switch is currently ignored for mingw / cygwin +// +// Default is 0 +// +// Recommended setting: 1 if you are not using a memory debugging tool, else 0 +#define wxUSE_MEMORY_TRACING 0 + +// In debug mode, cause new and delete to be redefined globally. +// If this causes problems (e.g. link errors which is a common problem +// especially if you use another library which also redefines the global new +// and delete), set this to 0. +// This switch is currently ignored for mingw / cygwin +// +// Default is 0 +// +// Recommended setting: 0 +#define wxUSE_GLOBAL_MEMORY_OPERATORS 0 + +// In debug mode, causes new to be defined to be WXDEBUG_NEW (see object.h). If +// this causes problems (e.g. link errors), set this to 0. You may need to set +// this to 0 if using templates (at least for VC++). This switch is currently +// ignored for mingw / cygwin / CodeWarrior +// +// Default is 0 +// +// Recommended setting: 0 +#define wxUSE_DEBUG_NEW_ALWAYS 0 + +// wxHandleFatalExceptions() may be used to catch the program faults at run +// time and, instead of terminating the program with a usual GPF message box, +// call the user-defined wxApp::OnFatalException() function. If you set +// wxUSE_ON_FATAL_EXCEPTION to 0, wxHandleFatalExceptions() will not work. +// +// This setting is for Win32 only and can only be enabled if your compiler +// supports Win32 structured exception handling (currently only VC++ does) +// +// Default is 1 +// +// Recommended setting: 1 if your compiler supports it. +#define wxUSE_ON_FATAL_EXCEPTION 1 + +// Set this to 1 to be able to generate a human-readable (unlike +// machine-readable minidump created by wxCrashReport::Generate()) stack back +// trace when your program crashes using wxStackWalker +// +// Default is 1 if supported by the compiler. +// +// Recommended setting: 1, set to 0 if your programs never crash +#define wxUSE_STACKWALKER 1 + +// Set this to 1 to compile in wxDebugReport class which allows you to create +// and optionally upload to your web site a debug report consisting of back +// trace of the crash (if wxUSE_STACKWALKER == 1) and other information. +// +// Default is 1 if supported by the compiler. +// +// Recommended setting: 1, it is compiled into a separate library so there +// is no overhead if you don't use it +#define wxUSE_DEBUGREPORT 1 + +// ---------------------------------------------------------------------------- +// Unicode support +// ---------------------------------------------------------------------------- + +// Set wxUSE_UNICODE to 1 to compile wxWidgets in Unicode mode: wxChar will be +// defined as wchar_t, wxString will use Unicode internally. If you set this +// to 1, you must use wxT() macro for all literal strings in the program. +// +// Unicode is currently only fully supported under Windows NT/2000/XP +// (Windows 9x doesn't support it and the programs compiled in Unicode mode +// will not run under 9x -- but see wxUSE_UNICODE_MSLU below). +// +// Default is 0 +// +// Recommended setting: 0 (unless you only plan to use Windows NT/2000/XP) +#ifndef wxUSE_UNICODE + #define wxUSE_UNICODE 0 +#endif + +// Setting wxUSE_WCHAR_T to 1 gives you some degree of Unicode support without +// compiling the program in Unicode mode. More precisely, it will be possible +// to construct wxString from a wide (Unicode) string and convert any wxString +// to Unicode. +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_WCHAR_T 1 + +// ---------------------------------------------------------------------------- +// global features +// ---------------------------------------------------------------------------- + +// Compile library in exception-safe mode? If set to 1, the library will try to +// behave correctly in presence of exceptions (even though it still will not +// use the exceptions itself) and notify the user code about any unhandled +// exceptions. If set to 0, propagation of the exceptions through the library +// code will lead to undefined behaviour -- but the code itself will be +// slightly smaller and faster. +// +// Note that like wxUSE_THREADS this option is automatically set to 0 if +// wxNO_EXCEPTIONS is defined. +// +// Default is 1 +// +// Recommended setting: depends on whether you intend to use C++ exceptions +// in your own code (1 if you do, 0 if you don't) +#define wxUSE_EXCEPTIONS 1 + +// Set wxUSE_EXTENDED_RTTI to 1 to use extended RTTI +// +// Default is 0 +// +// Recommended setting: 0 (this is still work in progress...) +#define wxUSE_EXTENDED_RTTI 0 + +// Set wxUSE_STL to 1 to derive wxList(Foo) and wxArray(Foo) from +// std::list<Foo*> and std::vector<Foo*>, with a compatibility interface, +// and for wxHashMap to be implemented with templates. +// +// Default is 0 +// +// Recommended setting: YMMV +#define wxUSE_STL 0 + +// Support for message/error logging. This includes wxLogXXX() functions and +// wxLog and derived classes. Don't set this to 0 unless you really know what +// you are doing. +// +// Default is 1 +// +// Recommended setting: 1 (always) +#define wxUSE_LOG 1 + +// Recommended setting: 1 +#define wxUSE_LOGWINDOW 1 + +// Recommended setting: 1 +#define wxUSE_LOGGUI 1 + +// Recommended setting: 1 +#define wxUSE_LOG_DIALOG 1 + +// Support for command line parsing using wxCmdLineParser class. +// +// Default is 1 +// +// Recommended setting: 1 (can be set to 0 if you don't use the cmd line) +#define wxUSE_CMDLINE_PARSER 1 + +// Support for multithreaded applications: if 1, compile in thread classes +// (thread.h) and make the library a bit more thread safe. Although thread +// support is quite stable by now, you may still consider recompiling the +// library without it if you have no use for it - this will result in a +// somewhat smaller and faster operation. +// +// Notice that if wxNO_THREADS is defined, wxUSE_THREADS is automatically reset +// to 0 in wx/chkconf.h, so, for example, if you set USE_THREADS to 0 in +// build/msw/config.* file this value will have no effect. +// +// Default is 1 +// +// Recommended setting: 0 unless you do plan to develop MT applications +#define wxUSE_THREADS 1 + +// If enabled, compiles wxWidgets streams classes +// +// wx stream classes are used for image IO, process IO redirection, network +// protocols implementation and much more and so disabling this results in a +// lot of other functionality being lost. +// +// Default is 1 +// +// Recommended setting: 1 as setting it to 0 disables many other things +#define wxUSE_STREAMS 1 + +// Use standard C++ streams if 1 instead of wx streams in some places. If +// disabled (default), wx streams are used everywhere and wxWidgets doesn't +// depend on the standard streams library. +// +// Notice that enabling this does not replace wx streams with std streams +// everywhere, in a lot of places wx streams are used no matter what. +// +// Default is 0 +// +// Recommended setting: 1 if you use the standard streams anyhow and so +// dependency on the standard streams library is not a +// problem +#define wxUSE_STD_IOSTREAM 0 + +// Enable conversion to standard C++ string if 1. +// +// Default is 1 for most compilers. +// +// Currently the Digital Mars and Watcom compilers come without standard C++ +// library headers by default, wxUSE_STD_STRING can be set to 1 if you do have +// them (e.g. from STLPort). +// +// VC++ 5.0 does include standard C++ library header, however they produce +// many warnings that can't be turned off when compiled at warning level 4. +#if defined(__DMC__) || defined(__WATCOMC__) \ + || (defined(_MSC_VER) && _MSC_VER < 1200) + #define wxUSE_STD_STRING 0 +#else + #define wxUSE_STD_STRING 1 +#endif + +// Support for positional parameters (e.g. %1$d, %2$s ...) in wxVsnprintf. +// Note that if the system's implementation does not support positional +// parameters, setting this to 1 forces the use of the wxWidgets implementation +// of wxVsnprintf. The standard vsnprintf() supports positional parameters on +// many Unix systems but usually doesn't under Windows. +// +// Positional parameters are very useful when translating a program since using +// them in formatting strings allow translators to correctly reorder the +// translated sentences. +// +// Default is 1 +// +// Recommended setting: 1 if you want to support multiple languages +#define wxUSE_PRINTF_POS_PARAMS 1 + +// ---------------------------------------------------------------------------- +// non GUI features selection +// ---------------------------------------------------------------------------- + +// Set wxUSE_LONGLONG to 1 to compile the wxLongLong class. This is a 64 bit +// integer which is implemented in terms of native 64 bit integers if any or +// uses emulation otherwise. +// +// This class is required by wxDateTime and so you should enable it if you want +// to use wxDateTime. For most modern platforms, it will use the native 64 bit +// integers in which case (almost) all of its functions are inline and it +// almost does not take any space, so there should be no reason to switch it +// off. +// +// Recommended setting: 1 +#define wxUSE_LONGLONG 1 + +// Set wxUSE_(F)FILE to 1 to compile wx(F)File classes. wxFile uses low level +// POSIX functions for file access, wxFFile uses ANSI C stdio.h functions. +// +// Default is 1 +// +// Recommended setting: 1 (wxFile is highly recommended as it is required by +// i18n code, wxFileConfig and others) +#define wxUSE_FILE 1 +#define wxUSE_FFILE 1 + +// Use wxFSVolume class providing access to the configured/active mount points +// +// Default is 1 +// +// Recommended setting: 1 (but may be safely disabled if you don't use it) +#define wxUSE_FSVOLUME 1 + +// Use wxStandardPaths class which allows to retrieve some standard locations +// in the file system +// +// Default is 1 +// +// Recommended setting: 1 (may be disabled to save space, but not much) +#define wxUSE_STDPATHS 1 + +// use wxTextBuffer class: required by wxTextFile +#define wxUSE_TEXTBUFFER 1 + +// use wxTextFile class: requires wxFile and wxTextBuffer, required by +// wxFileConfig +#define wxUSE_TEXTFILE 1 + +// i18n support: _() macro, wxLocale class. Requires wxTextFile. +#define wxUSE_INTL 1 + +// Set wxUSE_DATETIME to 1 to compile the wxDateTime and related classes which +// allow to manipulate dates, times and time intervals. wxDateTime replaces the +// old wxTime and wxDate classes which are still provided for backwards +// compatibility (and implemented in terms of wxDateTime). +// +// Note that this class is relatively new and is still officially in alpha +// stage because some features are not yet (fully) implemented. It is already +// quite useful though and should only be disabled if you are aiming at +// absolutely minimal version of the library. +// +// Requires: wxUSE_LONGLONG +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_DATETIME 1 + +// Set wxUSE_TIMER to 1 to compile wxTimer class +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_TIMER 1 + +// Use wxStopWatch clas. +// +// Default is 1 +// +// Recommended setting: 1 (needed by wxSocket) +#define wxUSE_STOPWATCH 1 + +// Setting wxUSE_CONFIG to 1 enables the use of wxConfig and related classes +// which allow the application to store its settings in the persistent +// storage. Setting this to 1 will also enable on-demand creation of the +// global config object in wxApp. +// +// See also wxUSE_CONFIG_NATIVE below. +// +// Recommended setting: 1 +#define wxUSE_CONFIG 1 + +// If wxUSE_CONFIG is 1, you may choose to use either the native config +// classes under Windows (using .INI files under Win16 and the registry under +// Win32) or the portable text file format used by the config classes under +// Unix. +// +// Default is 1 to use native classes. Note that you may still use +// wxFileConfig even if you set this to 1 - just the config object created by +// default for the applications needs will be a wxRegConfig or wxIniConfig and +// not wxFileConfig. +// +// Recommended setting: 1 +#define wxUSE_CONFIG_NATIVE 1 + +// If wxUSE_DIALUP_MANAGER is 1, compile in wxDialUpManager class which allows +// to connect/disconnect from the network and be notified whenever the dial-up +// network connection is established/terminated. Requires wxUSE_DYNAMIC_LOADER. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_DIALUP_MANAGER 1 + +// Compile in classes for run-time DLL loading and function calling. +// Required by wxUSE_DIALUP_MANAGER. +// +// This setting is for Win32 only +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_DYNLIB_CLASS 1 + +// experimental, don't use for now +#define wxUSE_DYNAMIC_LOADER 1 + +// Set to 1 to use socket classes +#define wxUSE_SOCKETS 1 + +// Set to 1 to enable virtual file systems (required by wxHTML) +#define wxUSE_FILESYSTEM 1 + +// Set to 1 to enable virtual ZIP filesystem (requires wxUSE_FILESYSTEM) +#define wxUSE_FS_ZIP 1 + +// Set to 1 to enable virtual archive filesystem (requires wxUSE_FILESYSTEM) +#define wxUSE_FS_ARCHIVE 1 + +// Set to 1 to enable virtual Internet filesystem (requires wxUSE_FILESYSTEM) +#define wxUSE_FS_INET 1 + +// wxArchive classes for accessing archives such as zip and tar +#define wxUSE_ARCHIVE_STREAMS 1 + +// Set to 1 to compile wxZipInput/OutputStream classes. +#define wxUSE_ZIPSTREAM 1 + +// Set to 1 to compile wxTarInput/OutputStream classes. +#define wxUSE_TARSTREAM 1 + +// Set to 1 to compile wxZlibInput/OutputStream classes. Also required by +// wxUSE_LIBPNG +#define wxUSE_ZLIB 1 + +// If enabled, the code written by Apple will be used to write, in a portable +// way, float on the disk. See extended.c for the license which is different +// from wxWidgets one. +// +// Default is 1. +// +// Recommended setting: 1 unless you don't like the license terms (unlikely) +#define wxUSE_APPLE_IEEE 1 + +// Joystick support class +#define wxUSE_JOYSTICK 1 + +// wxFontMapper class +#define wxUSE_FONTMAP 1 + +// wxMimeTypesManager class +#define wxUSE_MIMETYPE 1 + +// wxProtocol and related classes: if you want to use either of wxFTP, wxHTTP +// or wxURL you need to set this to 1. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_PROTOCOL 1 + +// The settings for the individual URL schemes +#define wxUSE_PROTOCOL_FILE 1 +#define wxUSE_PROTOCOL_FTP 1 +#define wxUSE_PROTOCOL_HTTP 1 + +// Define this to use wxURL class. +#define wxUSE_URL 1 + +// Define this to use native platform url and protocol support. +// Currently valid only for MS-Windows. +// Note: if you set this to 1, you can open ftp/http/gopher sites +// and obtain a valid input stream for these sites +// even when you set wxUSE_PROTOCOL_FTP/HTTP to 0. +// Doing so reduces the code size. +// +// This code is experimental and subject to change. +#define wxUSE_URL_NATIVE 0 + +// Support for wxVariant class used in several places throughout the library, +// notably in wxDataViewCtrl API. +// +// Default is 1. +// +// Recommended setting: 1 unless you want to reduce the library size as much as +// possible in which case setting this to 0 can gain up to 100KB. +#define wxUSE_VARIANT 1 + +// Support for regular expression matching via wxRegEx class: enable this to +// use POSIX regular expressions in your code. You need to compile regex +// library from src/regex to use it under Windows. +// +// Default is 0 +// +// Recommended setting: 1 if your compiler supports it, if it doesn't please +// contribute us a makefile for src/regex for it +#define wxUSE_REGEX 1 + +// wxSystemOptions class +#define wxUSE_SYSTEM_OPTIONS 1 + +// wxSound class +#define wxUSE_SOUND 1 + +// Use wxMediaCtrl +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_MEDIACTRL 1 + +// Use GStreamer for Unix (req a lot of dependancies) +// +// Default is 0 +// +// Recommended setting: 1 (wxMediaCtrl won't work by default without it) +#define wxUSE_GSTREAMER 0 + +// Use wxWidget's XRC XML-based resource system. Recommended. +// +// Default is 1 +// +// Recommended setting: 1 (requires wxUSE_XML) +#define wxUSE_XRC 1 + +// XML parsing classes. Note that their API will change in the future, so +// using wxXmlDocument and wxXmlNode in your app is not recommended. +// +// Default is the same as wxUSE_XRC, i.e. 1 by default. +// +// Recommended setting: 1 (required by XRC) +#define wxUSE_XML wxUSE_XRC + +// Use wxWidget's AUI docking system +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_AUI 1 + + +// Enable the new wxGraphicsPath and wxGraphicsContext classes for an advanced +// 2D drawing API. (Still somewhat experimental) +// +// Please note that on Windows you will need to link with gdiplus.lib (use +// USE_GDIPLUS=1 for makefile builds) and distribute gdiplus.dll with your +// application if you want it to be runnable on pre-XP systems. +// +// Default is 0 +// +// Recommended setting: 1 +#ifndef wxUSE_GRAPHICS_CONTEXT +#define wxUSE_GRAPHICS_CONTEXT 0 +#endif + +// ---------------------------------------------------------------------------- +// Individual GUI controls +// ---------------------------------------------------------------------------- + +// You must set wxUSE_CONTROLS to 1 if you are using any controls at all +// (without it, wxControl class is not compiled) +// +// Default is 1 +// +// Recommended setting: 1 (don't change except for very special programs) +#define wxUSE_CONTROLS 1 + +// wxPopupWindow class is a top level transient window. It is currently used +// to implement wxTipWindow +// +// Default is 1 +// +// Recommended setting: 1 (may be set to 0 if you don't wxUSE_TIPWINDOW) +#define wxUSE_POPUPWIN 1 + +// wxTipWindow allows to implement the custom tooltips, it is used by the +// context help classes. Requires wxUSE_POPUPWIN. +// +// Default is 1 +// +// Recommended setting: 1 (may be set to 0) +#define wxUSE_TIPWINDOW 1 + +// Each of the settings below corresponds to one wxWidgets control. They are +// all switched on by default but may be disabled if you are sure that your +// program (including any standard dialogs it can show!) doesn't need them and +// if you desperately want to save some space. If you use any of these you must +// set wxUSE_CONTROLS as well. +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_ANIMATIONCTRL 1 // wxAnimationCtrl +#define wxUSE_BUTTON 1 // wxButton +#define wxUSE_BMPBUTTON 1 // wxBitmapButton +#define wxUSE_CALENDARCTRL 1 // wxCalendarCtrl +#define wxUSE_CHECKBOX 1 // wxCheckBox +#define wxUSE_CHECKLISTBOX 1 // wxCheckListBox (requires wxUSE_OWNER_DRAWN) +#define wxUSE_CHOICE 1 // wxChoice +#define wxUSE_COLLPANE 1 // wxCollapsiblePane +#define wxUSE_COLOURPICKERCTRL 1 // wxColourPickerCtrl +#define wxUSE_COMBOBOX 1 // wxComboBox +#define wxUSE_DATAVIEWCTRL 1 // wxDataViewCtrl +#define wxUSE_DATEPICKCTRL 1 // wxDatePickerCtrl +#define wxUSE_DIRPICKERCTRL 1 // wxDirPickerCtrl +#define wxUSE_FILEPICKERCTRL 1 // wxFilePickerCtrl +#define wxUSE_FONTPICKERCTRL 1 // wxFontPickerCtrl +#define wxUSE_GAUGE 1 // wxGauge +#define wxUSE_HYPERLINKCTRL 1 // wxHyperlinkCtrl +#define wxUSE_LISTBOX 1 // wxListBox +#define wxUSE_LISTCTRL 1 // wxListCtrl +#define wxUSE_RADIOBOX 1 // wxRadioBox +#define wxUSE_RADIOBTN 1 // wxRadioButton +#define wxUSE_SCROLLBAR 1 // wxScrollBar +#define wxUSE_SEARCHCTRL 1 // wxSearchCtrl +#define wxUSE_SLIDER 1 // wxSlider +#define wxUSE_SPINBTN 1 // wxSpinButton +#define wxUSE_SPINCTRL 1 // wxSpinCtrl +#define wxUSE_STATBOX 1 // wxStaticBox +#define wxUSE_STATLINE 1 // wxStaticLine +#define wxUSE_STATTEXT 1 // wxStaticText +#define wxUSE_STATBMP 1 // wxStaticBitmap +#define wxUSE_TEXTCTRL 1 // wxTextCtrl +#define wxUSE_TOGGLEBTN 1 // requires wxButton +#define wxUSE_TREECTRL 1 // wxTreeCtrl + +// Use a status bar class? Depending on the value of wxUSE_NATIVE_STATUSBAR +// below either wxStatusBar95 or a generic wxStatusBar will be used. +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_STATUSBAR 1 + +// Two status bar implementations are available under Win32: the generic one +// or the wrapper around native control. For native look and feel the native +// version should be used. +// +// Default is 1 for the platforms where native status bar is supported. +// +// Recommended setting: 1 (there is no advantage in using the generic one) +#define wxUSE_NATIVE_STATUSBAR 1 + +// wxToolBar related settings: if wxUSE_TOOLBAR is 0, don't compile any toolbar +// classes at all. Otherwise, use the native toolbar class unless +// wxUSE_TOOLBAR_NATIVE is 0. +// +// Default is 1 for all settings. +// +// Recommended setting: 1 for wxUSE_TOOLBAR and wxUSE_TOOLBAR_NATIVE. +#define wxUSE_TOOLBAR 1 +#define wxUSE_TOOLBAR_NATIVE 1 + +// wxNotebook is a control with several "tabs" located on one of its sides. It +// may be used to logically organise the data presented to the user instead of +// putting everything in one huge dialog. It replaces wxTabControl and related +// classes of wxWin 1.6x. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_NOTEBOOK 1 + +// wxListbook control is similar to wxNotebook but uses wxListCtrl instead of +// the tabs +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_LISTBOOK 1 + +// wxChoicebook control is similar to wxNotebook but uses wxChoice instead of +// the tabs +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_CHOICEBOOK 1 + +// wxTreebook control is similar to wxNotebook but uses wxTreeCtrl instead of +// the tabs +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_TREEBOOK 1 + +// wxToolbook control is similar to wxNotebook but uses wxToolBar instead of +// tabs +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_TOOLBOOK 1 + +// wxTabDialog is a generic version of wxNotebook but it is incompatible with +// the new class. It shouldn't be used in new code. +// +// Default is 0. +// +// Recommended setting: 0 (use wxNotebook) +#define wxUSE_TAB_DIALOG 0 + +// wxGrid class +// +// Default is 1, set to 0 to cut down compilation time and binaries size if you +// don't use it. +// +// Recommended setting: 1 +// +#define wxUSE_GRID 1 + +// wxMiniFrame class: a frame with narrow title bar +// +// Default is 1. +// +// Recommended setting: 1 (it doesn't cost almost anything) +#define wxUSE_MINIFRAME 1 + +// wxComboCtrl and related classes: combobox with custom popup window and +// not necessarily a listbox. +// +// Default is 1. +// +// Recommended setting: 1 but can be safely set to 0 except for wxUniv where it +// it used by wxComboBox +#define wxUSE_COMBOCTRL 1 + +// wxOwnerDrawnComboBox is a custom combobox allowing to paint the combobox +// items. +// +// Default is 1. +// +// Recommended setting: 1 but can be safely set to 0, except where it is +// needed as a base class for generic wxBitmapComboBox. +#define wxUSE_ODCOMBOBOX 1 + +// wxBitmapComboBox is a combobox that can have images in front of text items. +// +// Default is 1. +// +// Recommended setting: 1 but can be safely set to 0 +#define wxUSE_BITMAPCOMBOBOX 1 + +// ---------------------------------------------------------------------------- +// Miscellaneous GUI stuff +// ---------------------------------------------------------------------------- + +// wxAcceleratorTable/Entry classes and support for them in wxMenu(Bar) +#define wxUSE_ACCEL 1 + +// Hotkey support (currently Windows only) +#define wxUSE_HOTKEY 1 + +// Use wxCaret: a class implementing a "cursor" in a text control (called caret +// under Windows). +// +// Default is 1. +// +// Recommended setting: 1 (can be safely set to 0, not used by the library) +#define wxUSE_CARET 1 + +// Use wxDisplay class: it allows enumerating all displays on a system and +// their geometries as well as finding the display on which the given point or +// window lies. +// +// Default is 1. +// +// Recommended setting: 1 if you need it, can be safely set to 0 otherwise +#define wxUSE_DISPLAY 1 + +// Miscellaneous geometry code: needed for Canvas library +#define wxUSE_GEOMETRY 1 + +// Use wxImageList. This class is needed by wxNotebook, wxTreeCtrl and +// wxListCtrl. +// +// Default is 1. +// +// Recommended setting: 1 (set it to 0 if you don't use any of the controls +// enumerated above, then this class is mostly useless too) +#define wxUSE_IMAGLIST 1 + +// Use wxMenu, wxMenuBar, wxMenuItem. +// +// Default is 1. +// +// Recommended setting: 1 (can't be disabled under MSW) +#define wxUSE_MENUS 1 + +// Use wxSashWindow class. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_SASH 1 + +// Use wxSplitterWindow class. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_SPLITTER 1 + +// Use wxToolTip and wxWindow::Set/GetToolTip() methods. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_TOOLTIPS 1 + +// wxValidator class and related methods +#define wxUSE_VALIDATORS 1 + +// ---------------------------------------------------------------------------- +// common dialogs +// ---------------------------------------------------------------------------- + +// On rare occasions (e.g. using DJGPP) may want to omit common dialogs (e.g. +// file selector, printer dialog). Switching this off also switches off the +// printing architecture and interactive wxPrinterDC. +// +// Default is 1 +// +// Recommended setting: 1 (unless it really doesn't work) +#define wxUSE_COMMON_DIALOGS 1 + +// wxBusyInfo displays window with message when app is busy. Works in same way +// as wxBusyCursor +#define wxUSE_BUSYINFO 1 + +// Use single/multiple choice dialogs. +// +// Default is 1 +// +// Recommended setting: 1 (used in the library itself) +#define wxUSE_CHOICEDLG 1 + +// Use colour picker dialog +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_COLOURDLG 1 + +// wxDirDlg class for getting a directory name from user +#define wxUSE_DIRDLG 1 + +// TODO: setting to choose the generic or native one + +// Use file open/save dialogs. +// +// Default is 1 +// +// Recommended setting: 1 (used in many places in the library itself) +#define wxUSE_FILEDLG 1 + +// Use find/replace dialogs. +// +// Default is 1 +// +// Recommended setting: 1 (but may be safely set to 0) +#define wxUSE_FINDREPLDLG 1 + +// Use font picker dialog +// +// Default is 1 +// +// Recommended setting: 1 (used in the library itself) +#define wxUSE_FONTDLG 1 + +// Use wxMessageDialog and wxMessageBox. +// +// Default is 1 +// +// Recommended setting: 1 (used in the library itself) +#define wxUSE_MSGDLG 1 + +// progress dialog class for lengthy operations +#define wxUSE_PROGRESSDLG 1 + +// support for startup tips (wxShowTip &c) +#define wxUSE_STARTUP_TIPS 1 + +// text entry dialog and wxGetTextFromUser function +#define wxUSE_TEXTDLG 1 + +// number entry dialog +#define wxUSE_NUMBERDLG 1 + +// splash screen class +#define wxUSE_SPLASH 1 + +// wizards +#define wxUSE_WIZARDDLG 1 + +// Compile in wxAboutBox() function showing the standard "About" dialog. +// +// Default is 1 +// +// Recommended setting: 1 but can be set to 0 to save some space if you don't +// use this function +#define wxUSE_ABOUTDLG 1 + +// ---------------------------------------------------------------------------- +// Metafiles support +// ---------------------------------------------------------------------------- + +// Windows supports the graphics format known as metafile which is, though not +// portable, is widely used under Windows and so is supported by wxWin (under +// Windows only, of course). Win16 (Win3.1) used the so-called "Window +// MetaFiles" or WMFs which were replaced with "Enhanced MetaFiles" or EMFs in +// Win32 (Win9x, NT, 2000). Both of these are supported in wxWin and, by +// default, WMFs will be used under Win16 and EMFs under Win32. This may be +// changed by setting wxUSE_WIN_METAFILES_ALWAYS to 1 and/or setting +// wxUSE_ENH_METAFILE to 0. You may also set wxUSE_METAFILE to 0 to not compile +// in any metafile related classes at all. +// +// Default is 1 for wxUSE_ENH_METAFILE and 0 for wxUSE_WIN_METAFILES_ALWAYS. +// +// Recommended setting: default or 0 for everything for portable programs. +#define wxUSE_METAFILE 1 +#define wxUSE_ENH_METAFILE 1 +#define wxUSE_WIN_METAFILES_ALWAYS 0 + +// ---------------------------------------------------------------------------- +// Big GUI components +// ---------------------------------------------------------------------------- + +// Set to 0 to disable MDI support. +// +// Requires wxUSE_NOTEBOOK under platforms other than MSW. +// +// Default is 1. +// +// Recommended setting: 1, can be safely set to 0. +#define wxUSE_MDI 1 + +// Set to 0 to disable document/view architecture +#define wxUSE_DOC_VIEW_ARCHITECTURE 1 + +// Set to 0 to disable MDI document/view architecture +// +// Requires wxUSE_MDI && wxUSE_DOC_VIEW_ARCHITECTURE +#define wxUSE_MDI_ARCHITECTURE 1 + +// Set to 0 to disable print/preview architecture code +#define wxUSE_PRINTING_ARCHITECTURE 1 + +// wxHTML sublibrary allows to display HTML in wxWindow programs and much, +// much more. +// +// Default is 1. +// +// Recommended setting: 1 (wxHTML is great!), set to 0 if you want compile a +// smaller library. +#define wxUSE_HTML 1 + +// Setting wxUSE_GLCANVAS to 1 enables OpenGL support. You need to have OpenGL +// headers and libraries to be able to compile the library with wxUSE_GLCANVAS +// set to 1. Note that for some compilers (notably Microsoft Visual C++) you +// will need to manually add opengl32.lib and glu32.lib to the list of +// libraries linked with your program if you use OpenGL. +// +// Default is 0. +// +// Recommended setting: 1 if you intend to use OpenGL, 0 otherwise +#define wxUSE_GLCANVAS 1 + +// wxRichTextCtrl allows editing of styled text. +// +// Default is 1. +// +// Recommended setting: 1, set to 0 if you want compile a +// smaller library. +#define wxUSE_RICHTEXT 1 + +// ---------------------------------------------------------------------------- +// Data transfer +// ---------------------------------------------------------------------------- + +// Use wxClipboard class for clipboard copy/paste. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_CLIPBOARD 1 + +// Use wxDataObject and related classes. Needed for clipboard and OLE drag and +// drop +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_DATAOBJ 1 + +// Use wxDropTarget and wxDropSource classes for drag and drop (this is +// different from "built in" drag and drop in wxTreeCtrl which is always +// available). Requires wxUSE_DATAOBJ. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_DRAG_AND_DROP 1 + +// Use wxAccessible for enhanced and customisable accessibility. +// Depends on wxUSE_OLE. +// +// Default is 0. +// +// Recommended setting (at present): 0 +#define wxUSE_ACCESSIBILITY 0 + +// ---------------------------------------------------------------------------- +// miscellaneous settings +// ---------------------------------------------------------------------------- + +// wxSingleInstanceChecker class allows to verify at startup if another program +// instance is running (it is only available under Win32) +// +// Default is 1 +// +// Recommended setting: 1 (the class is tiny, disabling it won't save much +// space) +#define wxUSE_SNGLINST_CHECKER 1 + +#define wxUSE_DRAGIMAGE 1 + +#define wxUSE_IPC 1 + // 0 for no interprocess comms +#define wxUSE_HELP 1 + // 0 for no help facility + +// Should we use MS HTML help for wxHelpController? If disabled, neither +// wxCHMHelpController nor wxBestHelpController are available. +// +// Default is 1 under MSW, 0 is always used for the other platforms. +// +// Recommended setting: 1, only set to 0 if you have trouble compiling +// wxCHMHelpController (could be a problem with really ancient compilers) +#define wxUSE_MS_HTML_HELP 1 + + +// Use wxHTML-based help controller? +#define wxUSE_WXHTML_HELP 1 + +#define wxUSE_RESOURCES 1 + // 0 for no wxGetResource/wxWriteResource +#define wxUSE_CONSTRAINTS 1 + // 0 for no window layout constraint system + +#define wxUSE_SPLINES 1 + // 0 for no splines + +#define wxUSE_MOUSEWHEEL 1 + // Include mouse wheel support + +// ---------------------------------------------------------------------------- +// postscript support settings +// ---------------------------------------------------------------------------- + +// Set to 1 for PostScript device context. +#define wxUSE_POSTSCRIPT 0 + +// Set to 1 to use font metric files in GetTextExtent +#define wxUSE_AFM_FOR_POSTSCRIPT 1 + +// ---------------------------------------------------------------------------- +// database classes +// ---------------------------------------------------------------------------- + +// Define 1 to use ODBC classes +#define wxUSE_ODBC 1 + +// For backward compatibility reasons, this parameter now only controls the +// default scrolling method used by cursors. This default behavior can be +// overriden by setting the second param of wxDB::wxDbGetConnection() or +// wxDb() constructor to indicate whether the connection (and any wxDbTable()s +// that use the connection) should support forward only scrolling of cursors, +// or both forward and backward support for backward scrolling cursors is +// dependent on the data source as well as the ODBC driver being used. +#define wxODBC_FWD_ONLY_CURSORS 1 + +// Default is 0. Set to 1 to use the deprecated classes, enum types, function, +// member variables. With a setting of 1, full backward compatibility with the +// 2.0.x release is possible. It is STRONGLY recommended that this be set to 0, +// as future development will be done only on the non-deprecated +// functions/classes/member variables/etc. +#define wxODBC_BACKWARD_COMPATABILITY 0 + +// ---------------------------------------------------------------------------- +// other compiler (mis)features +// ---------------------------------------------------------------------------- + +// Set this to 0 if your compiler can't cope with omission of prototype +// parameters. +// +// Default is 1. +// +// Recommended setting: 1 (should never need to set this to 0) +#define REMOVE_UNUSED_ARG 1 + +// VC++ 4.2 and above allows <iostream> and <iostream.h> but you can't mix +// them. Set to 1 for <iostream.h>, 0 for <iostream>. Note that VC++ 7.1 +// and later doesn't support wxUSE_IOSTREAMH == 1 and so <iostream> will be +// used anyhow. +// +// Default is 1. +// +// Recommended setting: whatever your compiler likes more +#define wxUSE_IOSTREAMH 1 + +// ---------------------------------------------------------------------------- +// image format support +// ---------------------------------------------------------------------------- + +// wxImage supports many different image formats which can be configured at +// compile-time. BMP is always supported, others are optional and can be safely +// disabled if you don't plan to use images in such format sometimes saving +// substantial amount of code in the final library. +// +// Some formats require an extra library which is included in wxWin sources +// which is mentioned if it is the case. + +// Set to 1 for wxImage support (recommended). +#define wxUSE_IMAGE 1 + +// Set to 1 for PNG format support (requires libpng). Also requires wxUSE_ZLIB. +#define wxUSE_LIBPNG 1 + +// Set to 1 for JPEG format support (requires libjpeg) +#define wxUSE_LIBJPEG 1 + +// Set to 1 for TIFF format support (requires libtiff) +#define wxUSE_LIBTIFF 1 + +// Set to 1 for TGA format support (loading only) +#define wxUSE_TGA 1 + +// Set to 1 for GIF format support +#define wxUSE_GIF 1 + +// Set to 1 for PNM format support +#define wxUSE_PNM 1 + +// Set to 1 for PCX format support +#define wxUSE_PCX 1 + +// Set to 1 for IFF format support (Amiga format) +#define wxUSE_IFF 0 + +// Set to 1 for XPM format support +#define wxUSE_XPM 1 + +// Set to 1 for MS Icons and Cursors format support +#define wxUSE_ICO_CUR 1 + +// Set to 1 to compile in wxPalette class +#define wxUSE_PALETTE 1 + +// ---------------------------------------------------------------------------- +// wxUniversal-only options +// ---------------------------------------------------------------------------- + +// Set to 1 to enable compilation of all themes, this is the default +#define wxUSE_ALL_THEMES 1 + +// Set to 1 to enable the compilation of individual theme if wxUSE_ALL_THEMES +// is unset, if it is set these options are not used; notice that metal theme +// uses Win32 one +#define wxUSE_THEME_GTK 0 +#define wxUSE_THEME_METAL 0 +#define wxUSE_THEME_MONO 0 +#define wxUSE_THEME_WIN32 0 + + +/* --- end common options --- */ + +// ---------------------------------------------------------------------------- +// Windows-only settings +// ---------------------------------------------------------------------------- + +// Set wxUSE_UNICODE_MSLU to 1 if you're compiling wxWidgets in Unicode mode +// and want to run your programs under Windows 9x and not only NT/2000/XP. +// This setting enables use of unicows.dll from MSLU (MS Layer for Unicode, see +// http://www.microsoft.com/globaldev/handson/dev/mslu_announce.mspx). Note +// that you will have to modify the makefiles to include unicows.lib import +// library as the first library (see installation instructions in install.txt +// to learn how to do it when building the library or samples). +// +// If your compiler doesn't have unicows.lib, you can get a version of it at +// http://libunicows.sourceforge.net +// +// Default is 0 +// +// Recommended setting: 0 (1 if you want to deploy Unicode apps on 9x systems) +#ifndef wxUSE_UNICODE_MSLU + #define wxUSE_UNICODE_MSLU 0 +#endif + +// Set this to 1 if you want to use wxWidgets and MFC in the same program. This +// will override some other settings (see below) +// +// Default is 0. +// +// Recommended setting: 0 unless you really have to use MFC +#define wxUSE_MFC 0 + +// Set this to 1 for generic OLE support: this is required for drag-and-drop, +// clipboard, OLE Automation. Only set it to 0 if your compiler is very old and +// can't compile/doesn't have the OLE headers. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_OLE 1 + +// Set this to 1 to enable wxAutomationObject class. +// +// Default is 1. +// +// Recommended setting: 1 if you need to control other applications via OLE +// Automation, can be safely set to 0 otherwise +#define wxUSE_OLE_AUTOMATION 1 + +// Set this to 1 to enable wxActiveXContainer class allowing to embed OLE +// controls in wx. +// +// Default is 1. +// +// Recommended setting: 1, required by wxMediaCtrl +#define wxUSE_ACTIVEX 1 + +// wxDC cacheing implementation +#define wxUSE_DC_CACHEING 1 + +// Set this to 1 to enable the use of DIB's for wxBitmap to support +// bitmaps > 16MB on Win95/98/Me. Set to 0 to use DDB's only. +#define wxUSE_DIB_FOR_BITMAP 0 + +// Set this to 1 to enable wxDIB class used internally for manipulating +// wxBitmao data. +// +// Default is 1, set it to 0 only if you don't use wxImage neither +// +// Recommended setting: 1 (without it conversion to/from wxImage won't work) +#define wxUSE_WXDIB 1 + +// Set to 0 to disable PostScript print/preview architecture code under Windows +// (just use Windows printing). +#define wxUSE_POSTSCRIPT_ARCHITECTURE_IN_MSW 1 + +// Set this to 1 to use RICHEDIT controls for wxTextCtrl with style wxTE_RICH +// which allows to put more than ~32Kb of text in it even under Win9x (NT +// doesn't have such limitation). +// +// Default is 1 for compilers which support it +// +// Recommended setting: 1, only set it to 0 if your compiler doesn't have +// or can't compile <richedit.h> +#define wxUSE_RICHEDIT 1 + +// Set this to 1 to use extra features of richedit v2 and later controls +// +// Default is 1 for compilers which support it +// +// Recommended setting: 1 +#define wxUSE_RICHEDIT2 1 + +// Set this to 1 to enable support for the owner-drawn menu and listboxes. This +// is required by wxUSE_CHECKLISTBOX. +// +// Default is 1. +// +// Recommended setting: 1, set to 0 for a small library size reduction +#define wxUSE_OWNER_DRAWN 1 + +// Set to 1 to compile MS Windows XP theme engine support +#define wxUSE_UXTHEME 1 + +// Set to 1 to auto-adapt to MS Windows XP themes where possible +// (notably, wxNotebook pages) +#define wxUSE_UXTHEME_AUTO 1 + +// Set to 1 to use InkEdit control (Tablet PC), if available +#define wxUSE_INKEDIT 1 + +// ---------------------------------------------------------------------------- +// Generic versions of native controls +// ---------------------------------------------------------------------------- + +// Set this to 1 to be able to use wxDatePickerCtrlGeneric in addition to the +// native wxDatePickerCtrl +// +// Default is 0. +// +// Recommended setting: 0, this is mainly used for testing +#define wxUSE_DATEPICKCTRL_GENERIC 0 + +// ---------------------------------------------------------------------------- +// Crash debugging helpers +// ---------------------------------------------------------------------------- + +// Set this to 1 to be able to use wxCrashReport::Generate() to create mini +// dumps of your program when it crashes (or at any other moment) +// +// Default is 1 if supported by the compiler (VC++ and recent BC++ only). +// +// Recommended setting: 1, set to 0 if your programs never crash +#define wxUSE_CRASHREPORT 1 + +// ---------------------------------------------------------------------------- +// obsolete settings +// ---------------------------------------------------------------------------- + +// NB: all settings in this section are obsolete and should not be used/changed +// at all, they will disappear + +// Define 1 to use bitmap messages. +#define wxUSE_BITMAP_MESSAGE 1 + +#endif // _WX_SETUP_H_ + diff --git a/Externals/wxWidgets/include/wx/msw/setup0.h b/Externals/wxWidgets/include/wx/msw/setup0.h new file mode 100644 index 0000000000..01a64ef193 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/setup0.h @@ -0,0 +1,1349 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/setup.h +// Purpose: Configuration for the library +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: setup0.h 43908 2006-12-11 06:19:27Z RD $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_SETUP_H_ +#define _WX_SETUP_H_ + +/* --- start common options --- */ +// ---------------------------------------------------------------------------- +// global settings +// ---------------------------------------------------------------------------- + +// define this to 0 when building wxBase library - this can also be done from +// makefile/project file overriding the value here +#ifndef wxUSE_GUI + #define wxUSE_GUI 1 +#endif // wxUSE_GUI + +// ---------------------------------------------------------------------------- +// compatibility settings +// ---------------------------------------------------------------------------- + +// This setting determines the compatibility with 2.4 API: set it to 1 to +// enable it but please consider updating your code instead. +// +// Default is 0 +// +// Recommended setting: 0 (please update your code) +#define WXWIN_COMPATIBILITY_2_4 0 + +// This setting determines the compatibility with 2.6 API: set it to 0 to +// flag all cases of using deprecated functions. +// +// Default is 1 but please try building your code with 0 as the default will +// change to 0 in the next version and the deprecated functions will disappear +// in the version after it completely. +// +// Recommended setting: 0 (please update your code) +#define WXWIN_COMPATIBILITY_2_6 1 + +// MSW-only: Set to 0 for accurate dialog units, else 1 for old behaviour when +// default system font is used for wxWindow::GetCharWidth/Height() instead of +// the current font. +// +// Default is 0 +// +// Recommended setting: 0 +#define wxDIALOG_UNIT_COMPATIBILITY 0 + +// ---------------------------------------------------------------------------- +// debugging settings +// ---------------------------------------------------------------------------- + +// Generic comment about debugging settings: they are very useful if you don't +// use any other memory leak detection tools such as Purify/BoundsChecker, but +// are probably redundant otherwise. Also, Visual C++ CRT has the same features +// as wxWidgets memory debugging subsystem built in since version 5.0 and you +// may prefer to use it instead of built in memory debugging code because it is +// faster and more fool proof. +// +// Using VC++ CRT memory debugging is enabled by default in debug mode +// (__WXDEBUG__) if wxUSE_GLOBAL_MEMORY_OPERATORS is *not* enabled (i.e. is 0) +// and if __NO_VC_CRTDBG__ is not defined. + +// If 1, enables wxDebugContext, for writing error messages to file, etc. If +// __WXDEBUG__ is not defined, will still use the normal memory operators. +// +// Default is 0 +// +// Recommended setting: 0 +#define wxUSE_DEBUG_CONTEXT 0 + +// If 1, enables debugging versions of wxObject::new and wxObject::delete *IF* +// __WXDEBUG__ is also defined. +// +// WARNING: this code may not work with all architectures, especially if +// alignment is an issue. This switch is currently ignored for mingw / cygwin +// +// Default is 0 +// +// Recommended setting: 1 if you are not using a memory debugging tool, else 0 +#define wxUSE_MEMORY_TRACING 0 + +// In debug mode, cause new and delete to be redefined globally. +// If this causes problems (e.g. link errors which is a common problem +// especially if you use another library which also redefines the global new +// and delete), set this to 0. +// This switch is currently ignored for mingw / cygwin +// +// Default is 0 +// +// Recommended setting: 0 +#define wxUSE_GLOBAL_MEMORY_OPERATORS 0 + +// In debug mode, causes new to be defined to be WXDEBUG_NEW (see object.h). If +// this causes problems (e.g. link errors), set this to 0. You may need to set +// this to 0 if using templates (at least for VC++). This switch is currently +// ignored for mingw / cygwin / CodeWarrior +// +// Default is 0 +// +// Recommended setting: 0 +#define wxUSE_DEBUG_NEW_ALWAYS 0 + +// wxHandleFatalExceptions() may be used to catch the program faults at run +// time and, instead of terminating the program with a usual GPF message box, +// call the user-defined wxApp::OnFatalException() function. If you set +// wxUSE_ON_FATAL_EXCEPTION to 0, wxHandleFatalExceptions() will not work. +// +// This setting is for Win32 only and can only be enabled if your compiler +// supports Win32 structured exception handling (currently only VC++ does) +// +// Default is 1 +// +// Recommended setting: 1 if your compiler supports it. +#define wxUSE_ON_FATAL_EXCEPTION 1 + +// Set this to 1 to be able to generate a human-readable (unlike +// machine-readable minidump created by wxCrashReport::Generate()) stack back +// trace when your program crashes using wxStackWalker +// +// Default is 1 if supported by the compiler. +// +// Recommended setting: 1, set to 0 if your programs never crash +#define wxUSE_STACKWALKER 1 + +// Set this to 1 to compile in wxDebugReport class which allows you to create +// and optionally upload to your web site a debug report consisting of back +// trace of the crash (if wxUSE_STACKWALKER == 1) and other information. +// +// Default is 1 if supported by the compiler. +// +// Recommended setting: 1, it is compiled into a separate library so there +// is no overhead if you don't use it +#define wxUSE_DEBUGREPORT 1 + +// ---------------------------------------------------------------------------- +// Unicode support +// ---------------------------------------------------------------------------- + +// Set wxUSE_UNICODE to 1 to compile wxWidgets in Unicode mode: wxChar will be +// defined as wchar_t, wxString will use Unicode internally. If you set this +// to 1, you must use wxT() macro for all literal strings in the program. +// +// Unicode is currently only fully supported under Windows NT/2000/XP +// (Windows 9x doesn't support it and the programs compiled in Unicode mode +// will not run under 9x -- but see wxUSE_UNICODE_MSLU below). +// +// Default is 0 +// +// Recommended setting: 0 (unless you only plan to use Windows NT/2000/XP) +#ifndef wxUSE_UNICODE + #define wxUSE_UNICODE 0 +#endif + +// Setting wxUSE_WCHAR_T to 1 gives you some degree of Unicode support without +// compiling the program in Unicode mode. More precisely, it will be possible +// to construct wxString from a wide (Unicode) string and convert any wxString +// to Unicode. +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_WCHAR_T 1 + +// ---------------------------------------------------------------------------- +// global features +// ---------------------------------------------------------------------------- + +// Compile library in exception-safe mode? If set to 1, the library will try to +// behave correctly in presence of exceptions (even though it still will not +// use the exceptions itself) and notify the user code about any unhandled +// exceptions. If set to 0, propagation of the exceptions through the library +// code will lead to undefined behaviour -- but the code itself will be +// slightly smaller and faster. +// +// Note that like wxUSE_THREADS this option is automatically set to 0 if +// wxNO_EXCEPTIONS is defined. +// +// Default is 1 +// +// Recommended setting: depends on whether you intend to use C++ exceptions +// in your own code (1 if you do, 0 if you don't) +#define wxUSE_EXCEPTIONS 1 + +// Set wxUSE_EXTENDED_RTTI to 1 to use extended RTTI +// +// Default is 0 +// +// Recommended setting: 0 (this is still work in progress...) +#define wxUSE_EXTENDED_RTTI 0 + +// Set wxUSE_STL to 1 to derive wxList(Foo) and wxArray(Foo) from +// std::list<Foo*> and std::vector<Foo*>, with a compatibility interface, +// and for wxHashMap to be implemented with templates. +// +// Default is 0 +// +// Recommended setting: YMMV +#define wxUSE_STL 0 + +// Support for message/error logging. This includes wxLogXXX() functions and +// wxLog and derived classes. Don't set this to 0 unless you really know what +// you are doing. +// +// Default is 1 +// +// Recommended setting: 1 (always) +#define wxUSE_LOG 1 + +// Recommended setting: 1 +#define wxUSE_LOGWINDOW 1 + +// Recommended setting: 1 +#define wxUSE_LOGGUI 1 + +// Recommended setting: 1 +#define wxUSE_LOG_DIALOG 1 + +// Support for command line parsing using wxCmdLineParser class. +// +// Default is 1 +// +// Recommended setting: 1 (can be set to 0 if you don't use the cmd line) +#define wxUSE_CMDLINE_PARSER 1 + +// Support for multithreaded applications: if 1, compile in thread classes +// (thread.h) and make the library a bit more thread safe. Although thread +// support is quite stable by now, you may still consider recompiling the +// library without it if you have no use for it - this will result in a +// somewhat smaller and faster operation. +// +// Notice that if wxNO_THREADS is defined, wxUSE_THREADS is automatically reset +// to 0 in wx/chkconf.h, so, for example, if you set USE_THREADS to 0 in +// build/msw/config.* file this value will have no effect. +// +// Default is 1 +// +// Recommended setting: 0 unless you do plan to develop MT applications +#define wxUSE_THREADS 1 + +// If enabled, compiles wxWidgets streams classes +// +// wx stream classes are used for image IO, process IO redirection, network +// protocols implementation and much more and so disabling this results in a +// lot of other functionality being lost. +// +// Default is 1 +// +// Recommended setting: 1 as setting it to 0 disables many other things +#define wxUSE_STREAMS 1 + +// Use standard C++ streams if 1 instead of wx streams in some places. If +// disabled (default), wx streams are used everywhere and wxWidgets doesn't +// depend on the standard streams library. +// +// Notice that enabling this does not replace wx streams with std streams +// everywhere, in a lot of places wx streams are used no matter what. +// +// Default is 0 +// +// Recommended setting: 1 if you use the standard streams anyhow and so +// dependency on the standard streams library is not a +// problem +#define wxUSE_STD_IOSTREAM 0 + +// Enable conversion to standard C++ string if 1. +// +// Default is 1 for most compilers. +// +// Currently the Digital Mars and Watcom compilers come without standard C++ +// library headers by default, wxUSE_STD_STRING can be set to 1 if you do have +// them (e.g. from STLPort). +// +// VC++ 5.0 does include standard C++ library header, however they produce +// many warnings that can't be turned off when compiled at warning level 4. +#if defined(__DMC__) || defined(__WATCOMC__) \ + || (defined(_MSC_VER) && _MSC_VER < 1200) + #define wxUSE_STD_STRING 0 +#else + #define wxUSE_STD_STRING 1 +#endif + +// Support for positional parameters (e.g. %1$d, %2$s ...) in wxVsnprintf. +// Note that if the system's implementation does not support positional +// parameters, setting this to 1 forces the use of the wxWidgets implementation +// of wxVsnprintf. The standard vsnprintf() supports positional parameters on +// many Unix systems but usually doesn't under Windows. +// +// Positional parameters are very useful when translating a program since using +// them in formatting strings allow translators to correctly reorder the +// translated sentences. +// +// Default is 1 +// +// Recommended setting: 1 if you want to support multiple languages +#define wxUSE_PRINTF_POS_PARAMS 1 + +// ---------------------------------------------------------------------------- +// non GUI features selection +// ---------------------------------------------------------------------------- + +// Set wxUSE_LONGLONG to 1 to compile the wxLongLong class. This is a 64 bit +// integer which is implemented in terms of native 64 bit integers if any or +// uses emulation otherwise. +// +// This class is required by wxDateTime and so you should enable it if you want +// to use wxDateTime. For most modern platforms, it will use the native 64 bit +// integers in which case (almost) all of its functions are inline and it +// almost does not take any space, so there should be no reason to switch it +// off. +// +// Recommended setting: 1 +#define wxUSE_LONGLONG 1 + +// Set wxUSE_(F)FILE to 1 to compile wx(F)File classes. wxFile uses low level +// POSIX functions for file access, wxFFile uses ANSI C stdio.h functions. +// +// Default is 1 +// +// Recommended setting: 1 (wxFile is highly recommended as it is required by +// i18n code, wxFileConfig and others) +#define wxUSE_FILE 1 +#define wxUSE_FFILE 1 + +// Use wxFSVolume class providing access to the configured/active mount points +// +// Default is 1 +// +// Recommended setting: 1 (but may be safely disabled if you don't use it) +#define wxUSE_FSVOLUME 1 + +// Use wxStandardPaths class which allows to retrieve some standard locations +// in the file system +// +// Default is 1 +// +// Recommended setting: 1 (may be disabled to save space, but not much) +#define wxUSE_STDPATHS 1 + +// use wxTextBuffer class: required by wxTextFile +#define wxUSE_TEXTBUFFER 1 + +// use wxTextFile class: requires wxFile and wxTextBuffer, required by +// wxFileConfig +#define wxUSE_TEXTFILE 1 + +// i18n support: _() macro, wxLocale class. Requires wxTextFile. +#define wxUSE_INTL 1 + +// Set wxUSE_DATETIME to 1 to compile the wxDateTime and related classes which +// allow to manipulate dates, times and time intervals. wxDateTime replaces the +// old wxTime and wxDate classes which are still provided for backwards +// compatibility (and implemented in terms of wxDateTime). +// +// Note that this class is relatively new and is still officially in alpha +// stage because some features are not yet (fully) implemented. It is already +// quite useful though and should only be disabled if you are aiming at +// absolutely minimal version of the library. +// +// Requires: wxUSE_LONGLONG +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_DATETIME 1 + +// Set wxUSE_TIMER to 1 to compile wxTimer class +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_TIMER 1 + +// Use wxStopWatch clas. +// +// Default is 1 +// +// Recommended setting: 1 (needed by wxSocket) +#define wxUSE_STOPWATCH 1 + +// Setting wxUSE_CONFIG to 1 enables the use of wxConfig and related classes +// which allow the application to store its settings in the persistent +// storage. Setting this to 1 will also enable on-demand creation of the +// global config object in wxApp. +// +// See also wxUSE_CONFIG_NATIVE below. +// +// Recommended setting: 1 +#define wxUSE_CONFIG 1 + +// If wxUSE_CONFIG is 1, you may choose to use either the native config +// classes under Windows (using .INI files under Win16 and the registry under +// Win32) or the portable text file format used by the config classes under +// Unix. +// +// Default is 1 to use native classes. Note that you may still use +// wxFileConfig even if you set this to 1 - just the config object created by +// default for the applications needs will be a wxRegConfig or wxIniConfig and +// not wxFileConfig. +// +// Recommended setting: 1 +#define wxUSE_CONFIG_NATIVE 1 + +// If wxUSE_DIALUP_MANAGER is 1, compile in wxDialUpManager class which allows +// to connect/disconnect from the network and be notified whenever the dial-up +// network connection is established/terminated. Requires wxUSE_DYNAMIC_LOADER. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_DIALUP_MANAGER 1 + +// Compile in classes for run-time DLL loading and function calling. +// Required by wxUSE_DIALUP_MANAGER. +// +// This setting is for Win32 only +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_DYNLIB_CLASS 1 + +// experimental, don't use for now +#define wxUSE_DYNAMIC_LOADER 1 + +// Set to 1 to use socket classes +#define wxUSE_SOCKETS 1 + +// Set to 1 to enable virtual file systems (required by wxHTML) +#define wxUSE_FILESYSTEM 1 + +// Set to 1 to enable virtual ZIP filesystem (requires wxUSE_FILESYSTEM) +#define wxUSE_FS_ZIP 1 + +// Set to 1 to enable virtual archive filesystem (requires wxUSE_FILESYSTEM) +#define wxUSE_FS_ARCHIVE 1 + +// Set to 1 to enable virtual Internet filesystem (requires wxUSE_FILESYSTEM) +#define wxUSE_FS_INET 1 + +// wxArchive classes for accessing archives such as zip and tar +#define wxUSE_ARCHIVE_STREAMS 1 + +// Set to 1 to compile wxZipInput/OutputStream classes. +#define wxUSE_ZIPSTREAM 1 + +// Set to 1 to compile wxTarInput/OutputStream classes. +#define wxUSE_TARSTREAM 1 + +// Set to 1 to compile wxZlibInput/OutputStream classes. Also required by +// wxUSE_LIBPNG +#define wxUSE_ZLIB 1 + +// If enabled, the code written by Apple will be used to write, in a portable +// way, float on the disk. See extended.c for the license which is different +// from wxWidgets one. +// +// Default is 1. +// +// Recommended setting: 1 unless you don't like the license terms (unlikely) +#define wxUSE_APPLE_IEEE 1 + +// Joystick support class +#define wxUSE_JOYSTICK 1 + +// wxFontMapper class +#define wxUSE_FONTMAP 1 + +// wxMimeTypesManager class +#define wxUSE_MIMETYPE 1 + +// wxProtocol and related classes: if you want to use either of wxFTP, wxHTTP +// or wxURL you need to set this to 1. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_PROTOCOL 1 + +// The settings for the individual URL schemes +#define wxUSE_PROTOCOL_FILE 1 +#define wxUSE_PROTOCOL_FTP 1 +#define wxUSE_PROTOCOL_HTTP 1 + +// Define this to use wxURL class. +#define wxUSE_URL 1 + +// Define this to use native platform url and protocol support. +// Currently valid only for MS-Windows. +// Note: if you set this to 1, you can open ftp/http/gopher sites +// and obtain a valid input stream for these sites +// even when you set wxUSE_PROTOCOL_FTP/HTTP to 0. +// Doing so reduces the code size. +// +// This code is experimental and subject to change. +#define wxUSE_URL_NATIVE 0 + +// Support for wxVariant class used in several places throughout the library, +// notably in wxDataViewCtrl API. +// +// Default is 1. +// +// Recommended setting: 1 unless you want to reduce the library size as much as +// possible in which case setting this to 0 can gain up to 100KB. +#define wxUSE_VARIANT 1 + +// Support for regular expression matching via wxRegEx class: enable this to +// use POSIX regular expressions in your code. You need to compile regex +// library from src/regex to use it under Windows. +// +// Default is 0 +// +// Recommended setting: 1 if your compiler supports it, if it doesn't please +// contribute us a makefile for src/regex for it +#define wxUSE_REGEX 1 + +// wxSystemOptions class +#define wxUSE_SYSTEM_OPTIONS 1 + +// wxSound class +#define wxUSE_SOUND 1 + +// Use wxMediaCtrl +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_MEDIACTRL 1 + +// Use GStreamer for Unix (req a lot of dependancies) +// +// Default is 0 +// +// Recommended setting: 1 (wxMediaCtrl won't work by default without it) +#define wxUSE_GSTREAMER 0 + +// Use wxWidget's XRC XML-based resource system. Recommended. +// +// Default is 1 +// +// Recommended setting: 1 (requires wxUSE_XML) +#define wxUSE_XRC 1 + +// XML parsing classes. Note that their API will change in the future, so +// using wxXmlDocument and wxXmlNode in your app is not recommended. +// +// Default is the same as wxUSE_XRC, i.e. 1 by default. +// +// Recommended setting: 1 (required by XRC) +#define wxUSE_XML wxUSE_XRC + +// Use wxWidget's AUI docking system +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_AUI 1 + + +// Enable the new wxGraphicsPath and wxGraphicsContext classes for an advanced +// 2D drawing API. (Still somewhat experimental) +// +// Please note that on Windows you will need to link with gdiplus.lib (use +// USE_GDIPLUS=1 for makefile builds) and distribute gdiplus.dll with your +// application if you want it to be runnable on pre-XP systems. +// +// Default is 0 +// +// Recommended setting: 1 +#ifndef wxUSE_GRAPHICS_CONTEXT +#define wxUSE_GRAPHICS_CONTEXT 0 +#endif + +// ---------------------------------------------------------------------------- +// Individual GUI controls +// ---------------------------------------------------------------------------- + +// You must set wxUSE_CONTROLS to 1 if you are using any controls at all +// (without it, wxControl class is not compiled) +// +// Default is 1 +// +// Recommended setting: 1 (don't change except for very special programs) +#define wxUSE_CONTROLS 1 + +// wxPopupWindow class is a top level transient window. It is currently used +// to implement wxTipWindow +// +// Default is 1 +// +// Recommended setting: 1 (may be set to 0 if you don't wxUSE_TIPWINDOW) +#define wxUSE_POPUPWIN 1 + +// wxTipWindow allows to implement the custom tooltips, it is used by the +// context help classes. Requires wxUSE_POPUPWIN. +// +// Default is 1 +// +// Recommended setting: 1 (may be set to 0) +#define wxUSE_TIPWINDOW 1 + +// Each of the settings below corresponds to one wxWidgets control. They are +// all switched on by default but may be disabled if you are sure that your +// program (including any standard dialogs it can show!) doesn't need them and +// if you desperately want to save some space. If you use any of these you must +// set wxUSE_CONTROLS as well. +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_ANIMATIONCTRL 1 // wxAnimationCtrl +#define wxUSE_BUTTON 1 // wxButton +#define wxUSE_BMPBUTTON 1 // wxBitmapButton +#define wxUSE_CALENDARCTRL 1 // wxCalendarCtrl +#define wxUSE_CHECKBOX 1 // wxCheckBox +#define wxUSE_CHECKLISTBOX 1 // wxCheckListBox (requires wxUSE_OWNER_DRAWN) +#define wxUSE_CHOICE 1 // wxChoice +#define wxUSE_COLLPANE 1 // wxCollapsiblePane +#define wxUSE_COLOURPICKERCTRL 1 // wxColourPickerCtrl +#define wxUSE_COMBOBOX 1 // wxComboBox +#define wxUSE_DATAVIEWCTRL 1 // wxDataViewCtrl +#define wxUSE_DATEPICKCTRL 1 // wxDatePickerCtrl +#define wxUSE_DIRPICKERCTRL 1 // wxDirPickerCtrl +#define wxUSE_FILEPICKERCTRL 1 // wxFilePickerCtrl +#define wxUSE_FONTPICKERCTRL 1 // wxFontPickerCtrl +#define wxUSE_GAUGE 1 // wxGauge +#define wxUSE_HYPERLINKCTRL 1 // wxHyperlinkCtrl +#define wxUSE_LISTBOX 1 // wxListBox +#define wxUSE_LISTCTRL 1 // wxListCtrl +#define wxUSE_RADIOBOX 1 // wxRadioBox +#define wxUSE_RADIOBTN 1 // wxRadioButton +#define wxUSE_SCROLLBAR 1 // wxScrollBar +#define wxUSE_SEARCHCTRL 1 // wxSearchCtrl +#define wxUSE_SLIDER 1 // wxSlider +#define wxUSE_SPINBTN 1 // wxSpinButton +#define wxUSE_SPINCTRL 1 // wxSpinCtrl +#define wxUSE_STATBOX 1 // wxStaticBox +#define wxUSE_STATLINE 1 // wxStaticLine +#define wxUSE_STATTEXT 1 // wxStaticText +#define wxUSE_STATBMP 1 // wxStaticBitmap +#define wxUSE_TEXTCTRL 1 // wxTextCtrl +#define wxUSE_TOGGLEBTN 1 // requires wxButton +#define wxUSE_TREECTRL 1 // wxTreeCtrl + +// Use a status bar class? Depending on the value of wxUSE_NATIVE_STATUSBAR +// below either wxStatusBar95 or a generic wxStatusBar will be used. +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_STATUSBAR 1 + +// Two status bar implementations are available under Win32: the generic one +// or the wrapper around native control. For native look and feel the native +// version should be used. +// +// Default is 1 for the platforms where native status bar is supported. +// +// Recommended setting: 1 (there is no advantage in using the generic one) +#define wxUSE_NATIVE_STATUSBAR 1 + +// wxToolBar related settings: if wxUSE_TOOLBAR is 0, don't compile any toolbar +// classes at all. Otherwise, use the native toolbar class unless +// wxUSE_TOOLBAR_NATIVE is 0. +// +// Default is 1 for all settings. +// +// Recommended setting: 1 for wxUSE_TOOLBAR and wxUSE_TOOLBAR_NATIVE. +#define wxUSE_TOOLBAR 1 +#define wxUSE_TOOLBAR_NATIVE 1 + +// wxNotebook is a control with several "tabs" located on one of its sides. It +// may be used to logically organise the data presented to the user instead of +// putting everything in one huge dialog. It replaces wxTabControl and related +// classes of wxWin 1.6x. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_NOTEBOOK 1 + +// wxListbook control is similar to wxNotebook but uses wxListCtrl instead of +// the tabs +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_LISTBOOK 1 + +// wxChoicebook control is similar to wxNotebook but uses wxChoice instead of +// the tabs +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_CHOICEBOOK 1 + +// wxTreebook control is similar to wxNotebook but uses wxTreeCtrl instead of +// the tabs +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_TREEBOOK 1 + +// wxToolbook control is similar to wxNotebook but uses wxToolBar instead of +// tabs +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_TOOLBOOK 1 + +// wxTabDialog is a generic version of wxNotebook but it is incompatible with +// the new class. It shouldn't be used in new code. +// +// Default is 0. +// +// Recommended setting: 0 (use wxNotebook) +#define wxUSE_TAB_DIALOG 0 + +// wxGrid class +// +// Default is 1, set to 0 to cut down compilation time and binaries size if you +// don't use it. +// +// Recommended setting: 1 +// +#define wxUSE_GRID 1 + +// wxMiniFrame class: a frame with narrow title bar +// +// Default is 1. +// +// Recommended setting: 1 (it doesn't cost almost anything) +#define wxUSE_MINIFRAME 1 + +// wxComboCtrl and related classes: combobox with custom popup window and +// not necessarily a listbox. +// +// Default is 1. +// +// Recommended setting: 1 but can be safely set to 0 except for wxUniv where it +// it used by wxComboBox +#define wxUSE_COMBOCTRL 1 + +// wxOwnerDrawnComboBox is a custom combobox allowing to paint the combobox +// items. +// +// Default is 1. +// +// Recommended setting: 1 but can be safely set to 0, except where it is +// needed as a base class for generic wxBitmapComboBox. +#define wxUSE_ODCOMBOBOX 1 + +// wxBitmapComboBox is a combobox that can have images in front of text items. +// +// Default is 1. +// +// Recommended setting: 1 but can be safely set to 0 +#define wxUSE_BITMAPCOMBOBOX 1 + +// ---------------------------------------------------------------------------- +// Miscellaneous GUI stuff +// ---------------------------------------------------------------------------- + +// wxAcceleratorTable/Entry classes and support for them in wxMenu(Bar) +#define wxUSE_ACCEL 1 + +// Hotkey support (currently Windows only) +#define wxUSE_HOTKEY 1 + +// Use wxCaret: a class implementing a "cursor" in a text control (called caret +// under Windows). +// +// Default is 1. +// +// Recommended setting: 1 (can be safely set to 0, not used by the library) +#define wxUSE_CARET 1 + +// Use wxDisplay class: it allows enumerating all displays on a system and +// their geometries as well as finding the display on which the given point or +// window lies. +// +// Default is 1. +// +// Recommended setting: 1 if you need it, can be safely set to 0 otherwise +#define wxUSE_DISPLAY 1 + +// Miscellaneous geometry code: needed for Canvas library +#define wxUSE_GEOMETRY 1 + +// Use wxImageList. This class is needed by wxNotebook, wxTreeCtrl and +// wxListCtrl. +// +// Default is 1. +// +// Recommended setting: 1 (set it to 0 if you don't use any of the controls +// enumerated above, then this class is mostly useless too) +#define wxUSE_IMAGLIST 1 + +// Use wxMenu, wxMenuBar, wxMenuItem. +// +// Default is 1. +// +// Recommended setting: 1 (can't be disabled under MSW) +#define wxUSE_MENUS 1 + +// Use wxSashWindow class. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_SASH 1 + +// Use wxSplitterWindow class. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_SPLITTER 1 + +// Use wxToolTip and wxWindow::Set/GetToolTip() methods. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_TOOLTIPS 1 + +// wxValidator class and related methods +#define wxUSE_VALIDATORS 1 + +// ---------------------------------------------------------------------------- +// common dialogs +// ---------------------------------------------------------------------------- + +// On rare occasions (e.g. using DJGPP) may want to omit common dialogs (e.g. +// file selector, printer dialog). Switching this off also switches off the +// printing architecture and interactive wxPrinterDC. +// +// Default is 1 +// +// Recommended setting: 1 (unless it really doesn't work) +#define wxUSE_COMMON_DIALOGS 1 + +// wxBusyInfo displays window with message when app is busy. Works in same way +// as wxBusyCursor +#define wxUSE_BUSYINFO 1 + +// Use single/multiple choice dialogs. +// +// Default is 1 +// +// Recommended setting: 1 (used in the library itself) +#define wxUSE_CHOICEDLG 1 + +// Use colour picker dialog +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_COLOURDLG 1 + +// wxDirDlg class for getting a directory name from user +#define wxUSE_DIRDLG 1 + +// TODO: setting to choose the generic or native one + +// Use file open/save dialogs. +// +// Default is 1 +// +// Recommended setting: 1 (used in many places in the library itself) +#define wxUSE_FILEDLG 1 + +// Use find/replace dialogs. +// +// Default is 1 +// +// Recommended setting: 1 (but may be safely set to 0) +#define wxUSE_FINDREPLDLG 1 + +// Use font picker dialog +// +// Default is 1 +// +// Recommended setting: 1 (used in the library itself) +#define wxUSE_FONTDLG 1 + +// Use wxMessageDialog and wxMessageBox. +// +// Default is 1 +// +// Recommended setting: 1 (used in the library itself) +#define wxUSE_MSGDLG 1 + +// progress dialog class for lengthy operations +#define wxUSE_PROGRESSDLG 1 + +// support for startup tips (wxShowTip &c) +#define wxUSE_STARTUP_TIPS 1 + +// text entry dialog and wxGetTextFromUser function +#define wxUSE_TEXTDLG 1 + +// number entry dialog +#define wxUSE_NUMBERDLG 1 + +// splash screen class +#define wxUSE_SPLASH 1 + +// wizards +#define wxUSE_WIZARDDLG 1 + +// Compile in wxAboutBox() function showing the standard "About" dialog. +// +// Default is 1 +// +// Recommended setting: 1 but can be set to 0 to save some space if you don't +// use this function +#define wxUSE_ABOUTDLG 1 + +// ---------------------------------------------------------------------------- +// Metafiles support +// ---------------------------------------------------------------------------- + +// Windows supports the graphics format known as metafile which is, though not +// portable, is widely used under Windows and so is supported by wxWin (under +// Windows only, of course). Win16 (Win3.1) used the so-called "Window +// MetaFiles" or WMFs which were replaced with "Enhanced MetaFiles" or EMFs in +// Win32 (Win9x, NT, 2000). Both of these are supported in wxWin and, by +// default, WMFs will be used under Win16 and EMFs under Win32. This may be +// changed by setting wxUSE_WIN_METAFILES_ALWAYS to 1 and/or setting +// wxUSE_ENH_METAFILE to 0. You may also set wxUSE_METAFILE to 0 to not compile +// in any metafile related classes at all. +// +// Default is 1 for wxUSE_ENH_METAFILE and 0 for wxUSE_WIN_METAFILES_ALWAYS. +// +// Recommended setting: default or 0 for everything for portable programs. +#define wxUSE_METAFILE 1 +#define wxUSE_ENH_METAFILE 1 +#define wxUSE_WIN_METAFILES_ALWAYS 0 + +// ---------------------------------------------------------------------------- +// Big GUI components +// ---------------------------------------------------------------------------- + +// Set to 0 to disable MDI support. +// +// Requires wxUSE_NOTEBOOK under platforms other than MSW. +// +// Default is 1. +// +// Recommended setting: 1, can be safely set to 0. +#define wxUSE_MDI 1 + +// Set to 0 to disable document/view architecture +#define wxUSE_DOC_VIEW_ARCHITECTURE 1 + +// Set to 0 to disable MDI document/view architecture +// +// Requires wxUSE_MDI && wxUSE_DOC_VIEW_ARCHITECTURE +#define wxUSE_MDI_ARCHITECTURE 1 + +// Set to 0 to disable print/preview architecture code +#define wxUSE_PRINTING_ARCHITECTURE 1 + +// wxHTML sublibrary allows to display HTML in wxWindow programs and much, +// much more. +// +// Default is 1. +// +// Recommended setting: 1 (wxHTML is great!), set to 0 if you want compile a +// smaller library. +#define wxUSE_HTML 1 + +// Setting wxUSE_GLCANVAS to 1 enables OpenGL support. You need to have OpenGL +// headers and libraries to be able to compile the library with wxUSE_GLCANVAS +// set to 1. Note that for some compilers (notably Microsoft Visual C++) you +// will need to manually add opengl32.lib and glu32.lib to the list of +// libraries linked with your program if you use OpenGL. +// +// Default is 0. +// +// Recommended setting: 1 if you intend to use OpenGL, 0 otherwise +#define wxUSE_GLCANVAS 0 + +// wxRichTextCtrl allows editing of styled text. +// +// Default is 1. +// +// Recommended setting: 1, set to 0 if you want compile a +// smaller library. +#define wxUSE_RICHTEXT 1 + +// ---------------------------------------------------------------------------- +// Data transfer +// ---------------------------------------------------------------------------- + +// Use wxClipboard class for clipboard copy/paste. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_CLIPBOARD 1 + +// Use wxDataObject and related classes. Needed for clipboard and OLE drag and +// drop +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_DATAOBJ 1 + +// Use wxDropTarget and wxDropSource classes for drag and drop (this is +// different from "built in" drag and drop in wxTreeCtrl which is always +// available). Requires wxUSE_DATAOBJ. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_DRAG_AND_DROP 1 + +// Use wxAccessible for enhanced and customisable accessibility. +// Depends on wxUSE_OLE. +// +// Default is 0. +// +// Recommended setting (at present): 0 +#define wxUSE_ACCESSIBILITY 0 + +// ---------------------------------------------------------------------------- +// miscellaneous settings +// ---------------------------------------------------------------------------- + +// wxSingleInstanceChecker class allows to verify at startup if another program +// instance is running (it is only available under Win32) +// +// Default is 1 +// +// Recommended setting: 1 (the class is tiny, disabling it won't save much +// space) +#define wxUSE_SNGLINST_CHECKER 1 + +#define wxUSE_DRAGIMAGE 1 + +#define wxUSE_IPC 1 + // 0 for no interprocess comms +#define wxUSE_HELP 1 + // 0 for no help facility + +// Should we use MS HTML help for wxHelpController? If disabled, neither +// wxCHMHelpController nor wxBestHelpController are available. +// +// Default is 1 under MSW, 0 is always used for the other platforms. +// +// Recommended setting: 1, only set to 0 if you have trouble compiling +// wxCHMHelpController (could be a problem with really ancient compilers) +#define wxUSE_MS_HTML_HELP 1 + + +// Use wxHTML-based help controller? +#define wxUSE_WXHTML_HELP 1 + +#define wxUSE_RESOURCES 0 + // 0 for no wxGetResource/wxWriteResource +#define wxUSE_CONSTRAINTS 1 + // 0 for no window layout constraint system + +#define wxUSE_SPLINES 1 + // 0 for no splines + +#define wxUSE_MOUSEWHEEL 1 + // Include mouse wheel support + +// ---------------------------------------------------------------------------- +// postscript support settings +// ---------------------------------------------------------------------------- + +// Set to 1 for PostScript device context. +#define wxUSE_POSTSCRIPT 0 + +// Set to 1 to use font metric files in GetTextExtent +#define wxUSE_AFM_FOR_POSTSCRIPT 1 + +// ---------------------------------------------------------------------------- +// database classes +// ---------------------------------------------------------------------------- + +// Define 1 to use ODBC classes +#define wxUSE_ODBC 0 + +// For backward compatibility reasons, this parameter now only controls the +// default scrolling method used by cursors. This default behavior can be +// overriden by setting the second param of wxDB::wxDbGetConnection() or +// wxDb() constructor to indicate whether the connection (and any wxDbTable()s +// that use the connection) should support forward only scrolling of cursors, +// or both forward and backward support for backward scrolling cursors is +// dependent on the data source as well as the ODBC driver being used. +#define wxODBC_FWD_ONLY_CURSORS 1 + +// Default is 0. Set to 1 to use the deprecated classes, enum types, function, +// member variables. With a setting of 1, full backward compatibility with the +// 2.0.x release is possible. It is STRONGLY recommended that this be set to 0, +// as future development will be done only on the non-deprecated +// functions/classes/member variables/etc. +#define wxODBC_BACKWARD_COMPATABILITY 0 + +// ---------------------------------------------------------------------------- +// other compiler (mis)features +// ---------------------------------------------------------------------------- + +// Set this to 0 if your compiler can't cope with omission of prototype +// parameters. +// +// Default is 1. +// +// Recommended setting: 1 (should never need to set this to 0) +#define REMOVE_UNUSED_ARG 1 + +// VC++ 4.2 and above allows <iostream> and <iostream.h> but you can't mix +// them. Set to 1 for <iostream.h>, 0 for <iostream>. Note that VC++ 7.1 +// and later doesn't support wxUSE_IOSTREAMH == 1 and so <iostream> will be +// used anyhow. +// +// Default is 1. +// +// Recommended setting: whatever your compiler likes more +#define wxUSE_IOSTREAMH 1 + +// ---------------------------------------------------------------------------- +// image format support +// ---------------------------------------------------------------------------- + +// wxImage supports many different image formats which can be configured at +// compile-time. BMP is always supported, others are optional and can be safely +// disabled if you don't plan to use images in such format sometimes saving +// substantial amount of code in the final library. +// +// Some formats require an extra library which is included in wxWin sources +// which is mentioned if it is the case. + +// Set to 1 for wxImage support (recommended). +#define wxUSE_IMAGE 1 + +// Set to 1 for PNG format support (requires libpng). Also requires wxUSE_ZLIB. +#define wxUSE_LIBPNG 1 + +// Set to 1 for JPEG format support (requires libjpeg) +#define wxUSE_LIBJPEG 1 + +// Set to 1 for TIFF format support (requires libtiff) +#define wxUSE_LIBTIFF 1 + +// Set to 1 for TGA format support (loading only) +#define wxUSE_TGA 1 + +// Set to 1 for GIF format support +#define wxUSE_GIF 1 + +// Set to 1 for PNM format support +#define wxUSE_PNM 1 + +// Set to 1 for PCX format support +#define wxUSE_PCX 1 + +// Set to 1 for IFF format support (Amiga format) +#define wxUSE_IFF 0 + +// Set to 1 for XPM format support +#define wxUSE_XPM 1 + +// Set to 1 for MS Icons and Cursors format support +#define wxUSE_ICO_CUR 1 + +// Set to 1 to compile in wxPalette class +#define wxUSE_PALETTE 1 + +// ---------------------------------------------------------------------------- +// wxUniversal-only options +// ---------------------------------------------------------------------------- + +// Set to 1 to enable compilation of all themes, this is the default +#define wxUSE_ALL_THEMES 1 + +// Set to 1 to enable the compilation of individual theme if wxUSE_ALL_THEMES +// is unset, if it is set these options are not used; notice that metal theme +// uses Win32 one +#define wxUSE_THEME_GTK 0 +#define wxUSE_THEME_METAL 0 +#define wxUSE_THEME_MONO 0 +#define wxUSE_THEME_WIN32 0 + + +/* --- end common options --- */ + +// ---------------------------------------------------------------------------- +// Windows-only settings +// ---------------------------------------------------------------------------- + +// Set wxUSE_UNICODE_MSLU to 1 if you're compiling wxWidgets in Unicode mode +// and want to run your programs under Windows 9x and not only NT/2000/XP. +// This setting enables use of unicows.dll from MSLU (MS Layer for Unicode, see +// http://www.microsoft.com/globaldev/handson/dev/mslu_announce.mspx). Note +// that you will have to modify the makefiles to include unicows.lib import +// library as the first library (see installation instructions in install.txt +// to learn how to do it when building the library or samples). +// +// If your compiler doesn't have unicows.lib, you can get a version of it at +// http://libunicows.sourceforge.net +// +// Default is 0 +// +// Recommended setting: 0 (1 if you want to deploy Unicode apps on 9x systems) +#ifndef wxUSE_UNICODE_MSLU + #define wxUSE_UNICODE_MSLU 0 +#endif + +// Set this to 1 if you want to use wxWidgets and MFC in the same program. This +// will override some other settings (see below) +// +// Default is 0. +// +// Recommended setting: 0 unless you really have to use MFC +#define wxUSE_MFC 0 + +// Set this to 1 for generic OLE support: this is required for drag-and-drop, +// clipboard, OLE Automation. Only set it to 0 if your compiler is very old and +// can't compile/doesn't have the OLE headers. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_OLE 1 + +// Set this to 1 to enable wxAutomationObject class. +// +// Default is 1. +// +// Recommended setting: 1 if you need to control other applications via OLE +// Automation, can be safely set to 0 otherwise +#define wxUSE_OLE_AUTOMATION 1 + +// Set this to 1 to enable wxActiveXContainer class allowing to embed OLE +// controls in wx. +// +// Default is 1. +// +// Recommended setting: 1, required by wxMediaCtrl +#define wxUSE_ACTIVEX 1 + +// wxDC cacheing implementation +#define wxUSE_DC_CACHEING 1 + +// Set this to 1 to enable the use of DIB's for wxBitmap to support +// bitmaps > 16MB on Win95/98/Me. Set to 0 to use DDB's only. +#define wxUSE_DIB_FOR_BITMAP 0 + +// Set this to 1 to enable wxDIB class used internally for manipulating +// wxBitmao data. +// +// Default is 1, set it to 0 only if you don't use wxImage neither +// +// Recommended setting: 1 (without it conversion to/from wxImage won't work) +#define wxUSE_WXDIB 1 + +// Set to 0 to disable PostScript print/preview architecture code under Windows +// (just use Windows printing). +#define wxUSE_POSTSCRIPT_ARCHITECTURE_IN_MSW 1 + +// Set this to 1 to use RICHEDIT controls for wxTextCtrl with style wxTE_RICH +// which allows to put more than ~32Kb of text in it even under Win9x (NT +// doesn't have such limitation). +// +// Default is 1 for compilers which support it +// +// Recommended setting: 1, only set it to 0 if your compiler doesn't have +// or can't compile <richedit.h> +#define wxUSE_RICHEDIT 1 + +// Set this to 1 to use extra features of richedit v2 and later controls +// +// Default is 1 for compilers which support it +// +// Recommended setting: 1 +#define wxUSE_RICHEDIT2 1 + +// Set this to 1 to enable support for the owner-drawn menu and listboxes. This +// is required by wxUSE_CHECKLISTBOX. +// +// Default is 1. +// +// Recommended setting: 1, set to 0 for a small library size reduction +#define wxUSE_OWNER_DRAWN 1 + +// Set to 1 to compile MS Windows XP theme engine support +#define wxUSE_UXTHEME 1 + +// Set to 1 to auto-adapt to MS Windows XP themes where possible +// (notably, wxNotebook pages) +#define wxUSE_UXTHEME_AUTO 1 + +// Set to 1 to use InkEdit control (Tablet PC), if available +#define wxUSE_INKEDIT 0 + +// ---------------------------------------------------------------------------- +// Generic versions of native controls +// ---------------------------------------------------------------------------- + +// Set this to 1 to be able to use wxDatePickerCtrlGeneric in addition to the +// native wxDatePickerCtrl +// +// Default is 0. +// +// Recommended setting: 0, this is mainly used for testing +#define wxUSE_DATEPICKCTRL_GENERIC 0 + +// ---------------------------------------------------------------------------- +// Crash debugging helpers +// ---------------------------------------------------------------------------- + +// Set this to 1 to be able to use wxCrashReport::Generate() to create mini +// dumps of your program when it crashes (or at any other moment) +// +// Default is 1 if supported by the compiler (VC++ and recent BC++ only). +// +// Recommended setting: 1, set to 0 if your programs never crash +#define wxUSE_CRASHREPORT 1 + +// ---------------------------------------------------------------------------- +// obsolete settings +// ---------------------------------------------------------------------------- + +// NB: all settings in this section are obsolete and should not be used/changed +// at all, they will disappear + +// Define 1 to use bitmap messages. +#define wxUSE_BITMAP_MESSAGE 1 + +#endif // _WX_SETUP_H_ + diff --git a/Externals/wxWidgets/include/wx/msw/setup_microwin.h b/Externals/wxWidgets/include/wx/msw/setup_microwin.h new file mode 100644 index 0000000000..fe95d6833e --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/setup_microwin.h @@ -0,0 +1,1179 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/setup.h +// Purpose: Configuration for the library +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: setup_microwin.h 40766 2006-08-23 09:54:29Z VS $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_SETUP_H_ +#define _WX_SETUP_H_ + +// ---------------------------------------------------------------------------- +// global settings +// ---------------------------------------------------------------------------- + +//#define WXWIN_OS_DESCRIPTION wxT("MicroWindows") + +// define this to 0 when building wxBase library - this can also be done from +// makefile/project file overriding the value here +#ifndef wxUSE_GUI + #define wxUSE_GUI 1 +#endif // wxUSE_GUI + +// ---------------------------------------------------------------------------- +// compatibility settings +// ---------------------------------------------------------------------------- + +// This setting determines the compatibility with 2.4 API: set it to 1 to +// enable it but please consider updating your code instead. +// +// Default is 0 +// +// Recommended setting: 0 (please update your code) +#define WXWIN_COMPATIBILITY_2_4 0 + +// This setting determines the compatibility with 2.6 API: set it to 0 to +// flag all cases of using deprecated functions. +// +// Default is 1 but please try building your code with 0 as the default will +// change to 0 in the next version and the deprecated functions will disappear +// in the version after it completely. +// +// Recommended setting: 0 (please update your code) +#define WXWIN_COMPATIBILITY_2_6 1 + +// Set to 0 for accurate dialog units, else 1 to be as per 2.1.16 and before. +// If migrating between versions, your dialogs may seem to shrink. +// +// Default is 1 +// +// Recommended setting: 0 (the new calculations are more correct!) +#define wxDIALOG_UNIT_COMPATIBILITY 1 + +// ---------------------------------------------------------------------------- +// debugging settings +// ---------------------------------------------------------------------------- + +// Generic comment about debugging settings: they are very useful if you don't +// use any other memory leak detection tools such as Purify/BoundsChecker, but +// are probably redundant otherwise. Also, Visual C++ CRT has the same features +// as wxWidgets memory debugging subsystem built in since version 5.0 and you +// may prefer to use it instead of built in memory debugging code because it is +// faster and more fool proof. +// +// Using VC++ CRT memory debugging is enabled by default in debug mode +// (__WXDEBUG__) if wxUSE_GLOBAL_MEMORY_OPERATORS is *not* enabled (i.e. is 0) +// and if __NO_VC_CRTDBG__ is not defined. + +// If 1, enables wxDebugContext, for writing error messages to file, etc. If +// __WXDEBUG__ is not defined, will still use normal memory operators. It's +// recommended to set this to 1, since you may well need to output an error log +// in a production version (or non-debugging beta). +// +// Default is 1. +// +// Recommended setting: 1 but see comment above +#define wxUSE_DEBUG_CONTEXT 1 + +// If 1, enables debugging versions of wxObject::new and wxObject::delete *IF* +// __WXDEBUG__ is also defined. +// +// WARNING: this code may not work with all architectures, especially if +// alignment is an issue. This switch is currently ignored for mingw / cygwin +// +// Default is 1 +// +// Recommended setting: 1 but see comment in the beginning of this section +#define wxUSE_MEMORY_TRACING 0 + +// In debug mode, cause new and delete to be redefined globally. +// If this causes problems (e.g. link errors), set this to 0. +// This switch is currently ignored for mingw / cygwin +// +// Default is 1 +// +// Recommended setting: 1 but see comment in the beginning of this section +#define wxUSE_GLOBAL_MEMORY_OPERATORS 0 + +// In debug mode, causes new to be defined to be WXDEBUG_NEW (see object.h). If +// this causes problems (e.g. link errors), set this to 0. You may need to set +// this to 0 if using templates (at least for VC++). This switch is currently +// ignored for mingw / cygwin +// +// Default is 1 +// +// Recommended setting: 1 but see comment in the beginning of this section +#define wxUSE_DEBUG_NEW_ALWAYS 0 + +// wxHandleFatalExceptions() may be used to catch the program faults at run +// time and, instead of terminating the program with a usual GPF message box, +// call the user-defined wxApp::OnFatalException() function. If you set +// wxUSE_ON_FATAL_EXCEPTION to 0, wxHandleFatalExceptions() will not work. +// +// This setting is for Win32 only and can only be enabled if your compiler +// supports Win32 structured exception handling (currently only VC++ does) +// +// Default is 1 +// +// Recommended setting: 1 if your compiler supports it. +#ifdef _MSC_VER + #define wxUSE_ON_FATAL_EXCEPTION 1 +#else + #define wxUSE_ON_FATAL_EXCEPTION 0 +#endif + +// ---------------------------------------------------------------------------- +// Unicode support +// ---------------------------------------------------------------------------- + +// Set wxUSE_UNICODE to 1 to compile wxWidgets in Unicode mode: wxChar will be +// defined as wchar_t, wxString will use Unicode internally. If you set this +// to 1, you must use wxT() macro for all literal strings in the program. +// +// Unicode is currently only fully supported under Windows NT/2000 (Windows 9x +// doesn't support it and the programs compiled in Unicode mode will not run +// under 9x). +// +// Default is 0 +// +// Recommended setting: 0 (unless you only plan to use Windows NT/2000) +#define wxUSE_UNICODE 0 + +// Set wxUSE_UNICODE_MSLU to 1 if you want to compile wxWidgets in Unicode mode +// and be able to run compiled apps under Windows 9x as well as NT/2000/XP. This +// setting enables use of unicows.dll from MSLU (MS Layer for Unicode, see +// http://www.microsoft.com/globaldev/Articles/mslu_announce.asp). Note that you +// will have to modify the makefiles to include unicows.lib import library as the first +// library. +// +// Default is 0 +// +// Recommended setting: 0 +#define wxUSE_UNICODE_MSLU 0 + +// Setting wxUSE_WCHAR_T to 1 gives you some degree of Unicode support without +// compiling the program in Unicode mode. More precisely, it will be possible +// to construct wxString from a wide (Unicode) string and convert any wxString +// to Unicode. +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_WCHAR_T 0 + +// ---------------------------------------------------------------------------- +// global features +// ---------------------------------------------------------------------------- + +// Support for message/error logging. This includes wxLogXXX() functions and +// wxLog and derived classes. Don't set this to 0 unless you really know what +// you are doing. +// +// Default is 1 +// +// Recommended setting: 1 (always) +#define wxUSE_LOG 1 + +// Support for command line parsing using wxCmdLineParser class. +// +// Default is 1 +// +// Recommended setting: 1 (can be set to 0 if you don't use the cmd line) +#define wxUSE_CMDLINE_PARSER 1 + +// Recommended setting: 1 +#define wxUSE_LOGWINDOW 1 + +// Recommended setting: 1 +#define wxUSE_LOGGUI 1 + +// Recommended setting: 1 +#define wxUSE_LOG_DIALOG 0 + +// Support for multithreaded applications: if 1, compile in thread classes +// (thread.h) and make the library a bit more thread safe. Although thread +// support is quite stable by now, you may still consider recompiling the +// library without it if you have no use for it - this will result in a +// somewhat smaller and faster operation. +// +// This is ignored under Win16, threads are only supported under Win32. +// +// Default is 1 +// +// Recommended setting: 0 unless you do plan to develop MT applications +#define wxUSE_THREADS 0 + +// If enabled (1), compiles wxWidgets streams classes +#define wxUSE_STREAMS 1 + +// Use standard C++ streams if 1. If 0, use wxWin streams implementation. +#define wxUSE_STD_IOSTREAM 0 + +// Use serialization (requires utils/serialize) +#define wxUSE_SERIAL 0 + +// ---------------------------------------------------------------------------- +// non GUI features selection +// ---------------------------------------------------------------------------- + +// Set wxUSE_LONGLONG to 1 to compile the wxLongLong class. This is a 64 bit +// integer which is implemented in terms of native 64 bit integers if any or +// uses emulation otherwise. +// +// This class is required by wxDateTime and so you should enable it if you want +// to use wxDateTime. For most modern platforms, it will use the native 64 bit +// integers in which case (almost) all of its functions are inline and it +// almost does not take any space, so there should be no reason to switch it +// off. +// +// Recommended setting: 1 +#define wxUSE_LONGLONG 1 + +// Set wxUSE_(F)FILE to 1 to compile wx(F)File classes. wxFile uses low level +// POSIX functions for file access, wxFFile uses ANSI C stdio.h functions. +// +// Default is 1 +// +// Recommended setting: 1 (wxFile is highly recommended as it is required by +// i18n code, wxFileConfig and others) +#define wxUSE_FILE 1 +#define wxUSE_FFILE 1 + +// use wxTextBuffer class: required by wxTextFile +#define wxUSE_TEXTBUFFER 1 + +// use wxTextFile class: requires wxFile and wxTextBuffer, required by +// wxFileConfig +#define wxUSE_TEXTFILE 1 + +// i18n support: _() macro, wxLocale class. Requires wxTextFile. +#define wxUSE_INTL 1 + +// Set wxUSE_DATETIME to 1 to compile the wxDateTime and related classes which +// allow to manipulate dates, times and time intervals. wxDateTime replaces the +// old wxTime and wxDate classes which are still provided for backwards +// compatibility (and implemented in terms of wxDateTime). +// +// Note that this class is relatively new and is still officially in alpha +// stage because some features are not yet (fully) implemented. It is already +// quite useful though and should only be disabled if you are aiming at +// absolutely minimal version of the library. +// +// Requires: wxUSE_LONGLONG +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_DATETIME 1 + +// Set wxUSE_TIMER to 1 to compile wxTimer class +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_TIMER 1 + +// Use wxStopWatch clas. +// +// Default is 1 +// +// Recommended setting: 1 (needed by wxSocket) +#define wxUSE_STOPWATCH 1 + +// Setting wxUSE_CONFIG to 1 enables the use of wxConfig and related classes +// which allow the application to store its settings in the persistent +// storage. Setting this to 1 will also enable on-demand creation of the +// global config object in wxApp. +// +// See also wxUSE_CONFIG_NATIVE below. +// +// Recommended setting: 1 +#define wxUSE_CONFIG 1 + +// If wxUSE_CONFIG is 1, you may choose to use either the native config +// classes under Windows (using .INI files under Win16 and the registry under +// Win32) or the portable text file format used by the config classes under +// Unix. +// +// Default is 1 to use native classes. Note that you may still use +// wxFileConfig even if you set this to 1 - just the config object created by +// default for the applications needs will be a wxRegConfig or wxIniConfig and +// not wxFileConfig. +// +// Recommended setting: 1 +#define wxUSE_CONFIG_NATIVE 0 + +// If wxUSE_DIALUP_MANAGER is 1, compile in wxDialUpManager class which allows +// to connect/disconnect from the network and be notified whenever the dial-up +// network connection is established/terminated. Requires wxUSE_DYNLIB_CLASS. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_DIALUP_MANAGER 0 + +// Compile in wxLibrary class for run-time DLL loading and function calling. +// Required by wxUSE_DIALUP_MANAGER. +// +// This setting is for Win32 only +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_DYNAMIC_LOADER 0 + +#define wxUSE_DYNLIB_CLASS 0 + +// Set to 1 to use socket classes +#define wxUSE_SOCKETS 0 + +// Set to 1 to enable virtual file systems (required by wxHTML) +#define wxUSE_FILESYSTEM 0 + +// Set to 1 to enable virtual ZIP filesystem (requires wxUSE_FILESYSTEM) +#define wxUSE_FS_ZIP 0 + +// Set to 1 to enable virtual Internet filesystem (requires wxUSE_FILESYSTEM) +#define wxUSE_FS_INET 0 + +// Set to 1 to compile wxZipInput/OutputStream classes. +#define wxUSE_ZIPSTREAM 0 + +// Set to 1 to compile wxZlibInput/OutputStream classes. Also required by +// wxUSE_LIBPNG. +#define wxUSE_ZLIB 0 + +// If enabled, the code written by Apple will be used to write, in a portable +// way, float on the disk. See extended.c for the license which is different +// from wxWidgets one. +// +// Default is 1. +// +// Recommended setting: 1 unless you don't like the license terms (unlikely) +#define wxUSE_APPLE_IEEE 1 + +// Joystick support class +#define wxUSE_JOYSTICK 1 + +// wxFontMapper class +#define wxUSE_FONTMAP 1 + +// wxMimeTypesManager class +#define wxUSE_MIMETYPE 0 + +// wxSystemOptions class +#define wxUSE_SYSTEM_OPTIONS 1 + +// Support for regular expression matching via wxRegEx class: enable this to +// use POSIX regular expressions in your code. You need to compile regex +// library from src/regex to use it under Windows. +// +// Default is 0 +// +// Recommended setting: 1 if your compiler supports it, if it doesn't please +// contribute us a makefile for src/regex for it +#define wxUSE_REGEX 0 + +// wxSound class +#define wxUSE_SOUND 0 + +// Use wxMediaCtrl +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_MEDIACTRL 1 + +// Use QuickTime +// +// Default is 0 +// +// Recommended setting: 1 if you have the QT SDK installed and you need it, else 0 +#define wxUSE_QUICKTIME 0 + +// Use DirectShow +// +// Default is 0 +// +// Recommended setting: 1 if the DirectX 7 SDK is installed (highly recommended), else 0 +#define wxUSE_DIRECTSHOW 1 + +// Use wxWidget's XRC XML-based resource system. Recommended. +// +// Default is 1 +// +// Recommended setting: 1 (requires wxUSE_XML) +#define wxUSE_XRC 1 + +// XML parsing classes. Note that their API will change in the future, so +// using wxXmlDocument and wxXmlNode in your app is not recommended. +// +// Default is 1 +// +// Recommended setting: 1 (required by XRC) +#if wxUSE_XRC +# define wxUSE_XML 1 +#else +# define wxUSE_XML 0 +#endif + +// ---------------------------------------------------------------------------- +// Individual GUI controls +// ---------------------------------------------------------------------------- + +// You must set wxUSE_CONTROLS to 1 if you are using any controls at all +// (without it, wxControl class is not compiled) +// +// Default is 1 +// +// Recommended setting: 1 (don't change except for very special programs) +#define wxUSE_CONTROLS 1 + +// wxPopupWindow class is not used currently by wxMSW +// +// Default is 0 +// +// Recommended setting: 0 +#define wxUSE_POPUPWIN 1 + +// wxTipWindow allows to implement the custom tooltips, it is used by the +// context help classes. Requires wxUSE_POPUPWIN. +// +// Default is 1 +// +// Recommended setting: 1 (may be set to 0) +#define wxUSE_TIPWINDOW 1 + +// Each of the settings below corresponds to one wxWidgets control. They are +// all switched on by default but may be disabled if you are sure that your +// program (including any standard dialogs it can show!) doesn't need them and +// if you desperately want to save some space. If you use any of these you must +// set wxUSE_CONTROLS as well. +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_BUTTON 1 // wxButton +#define wxUSE_BMPBUTTON 1 // wxBitmapButton +#define wxUSE_CALENDARCTRL 0 // wxCalendarCtrl +#define wxUSE_CHECKBOX 1 // wxCheckBox +#define wxUSE_CHECKLISTBOX 1 // wxCheckListBox (requires wxUSE_OWNER_DRAWN) +#define wxUSE_CHOICE 1 // wxChoice +#define wxUSE_COMBOBOX 1 // wxComboBox +#define wxUSE_GAUGE 1 // wxGauge +#define wxUSE_LISTBOX 1 // wxListBox +#define wxUSE_LISTCTRL 0 // wxListCtrl +#define wxUSE_RADIOBOX 1 // wxRadioBox +#define wxUSE_RADIOBTN 1 // wxRadioButton +#define wxUSE_SCROLLBAR 1 // wxScrollBar +#define wxUSE_SLIDER 1 // wxSlider +#define wxUSE_SPINBTN 1 // wxSpinButton +#define wxUSE_SPINCTRL 1 // wxSpinCtrl +#define wxUSE_STATBOX 1 // wxStaticBox +#define wxUSE_STATLINE 1 // wxStaticLine +#define wxUSE_STATTEXT 1 // wxStaticText +#define wxUSE_STATBMP 1 // wxStaticBitmap +#define wxUSE_TEXTCTRL 1 // wxTextCtrl +#define wxUSE_TOGGLEBTN 0 // requires wxButton +#define wxUSE_TREECTRL 0 // wxTreeCtrl + +// Use a status bar class? Depending on the value of wxUSE_NATIVE_STATUSBAR +// below either wxStatusBar95 or a generic wxStatusBar will be used. +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_STATUSBAR 1 + +// Two status bar implementations are available under Win32: the generic one +// or the wrapper around native control. For native look and feel the native +// version should be used. +// +// Default is 1. +// +// Recommended setting: 1 (there is no advantage in using the generic one) +#define wxUSE_NATIVE_STATUSBAR 0 + +// wxToolBar related settings: if wxUSE_TOOLBAR is 0, don't compile any toolbar +// classes at all. Otherwise, use the native toolbar class unless +// wxUSE_TOOLBAR_NATIVE is 0. +// +// Default is 1 for all settings. +// +// Recommended setting: 1 for wxUSE_TOOLBAR and wxUSE_TOOLBAR_NATIVE. +#define wxUSE_TOOLBAR 0 +#define wxUSE_TOOLBAR_NATIVE 0 + +// wxNotebook is a control with several "tabs" located on one of its sides. It +// may be used ot logically organise the data presented to the user instead of +// putting everything in one huge dialog. It replaces wxTabControl and related +// classes of wxWin 1.6x. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_NOTEBOOK 1 + +// wxTabDialog is a generic version of wxNotebook but it is incompatible with +// the new class. It shouldn't be used in new code. +// +// Default is 0. +// +// Recommended setting: 0 (use wxNotebook) +#define wxUSE_TAB_DIALOG 0 + +// wxGrid class +// Default is 1 +// +#define wxUSE_GRID 0 + +// wxProperty[Value/Form/List] classes, used by Dialog Editor +#define wxUSE_PROPSHEET 0 + +// ---------------------------------------------------------------------------- +// Miscellaneous GUI stuff +// ---------------------------------------------------------------------------- + +// wxAcceleratorTable/Entry classes and support for them in wxMenu(Bar) +#define wxUSE_ACCEL 0 + +// Use wxCaret: a class implementing a "cursor" in a text control (called caret +// under Windows). +// +// Default is 1. +// +// Recommended setting: 1 (can be safely set to 0, not used by the library) +#define wxUSE_CARET 1 + +// Miscellaneous geometry code: needed for Canvas library +#define wxUSE_GEOMETRY 1 + +// Use wxImageList. This class is needed by wxNotebook, wxTreeCtrl and +// wxListCtrl. +// +// Default is 1. +// +// Recommended setting: 1 (set it to 0 if you don't use any of the controls +// enumerated above, then this class is mostly useless too) +#define wxUSE_IMAGLIST 1 + +// Use wxMenu, wxMenuBar, wxMenuItem. +// +// Default is 1. +// +// Recommended setting: 1 (can't be disabled under MSW) +#define wxUSE_MENUS 1 + +// Use wxSashWindow class. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_SASH 1 + +// Use wxSplitterWindow class. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_SPLITTER 1 + +// Use wxToolTip and wxWindow::Set/GetToolTip() methods. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_TOOLTIPS 0 + +// wxValidator class and related methods +#define wxUSE_VALIDATORS 0 + +// wxDC cacheing implementation +#define wxUSE_DC_CACHEING 0 + +// ---------------------------------------------------------------------------- +// common dialogs +// ---------------------------------------------------------------------------- + +// On rare occasions (e.g. using DJGPP) may want to omit common dialogs (e.g. +// file selector, printer dialog). Switching this off also switches off the +// printing architecture and interactive wxPrinterDC. +// +// Default is 1 +// +// Recommended setting: 1 (unless it really doesn't work) +#define wxUSE_COMMON_DIALOGS 1 + +// wxBusyInfo displays window with message when app is busy. Works in same way +// as wxBusyCursor +#define wxUSE_BUSYINFO 0 + +// Use single/multiple choice dialogs. +// +// Default is 1 +// +// Recommended setting: 1 (used in the library itself) +#define wxUSE_CHOICEDLG 1 + +// Use colour picker dialog +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_COLOURDLG 0 + +// wxDirDlg class for getting a directory name from user +#define wxUSE_DIRDLG 0 + +// TODO: setting to choose the generic or native one + +// Use file open/save dialogs. +// +// Default is 1 +// +// Recommended setting: 1 (used in many places in the library itself) +#define wxUSE_FILEDLG 0 + +// Use find/replace dialogs. +// +// Default is 1 +// +// Recommended setting: 1 (but may be safely set to 0) +#define wxUSE_FINDREPLDLG 0 + +// Use font picker dialog +// +// Default is 1 +// +// Recommended setting: 1 (used in the library itself) +#define wxUSE_FONTDLG 0 + +// Use wxMessageDialog and wxMessageBox. +// +// Default is 1 +// +// Recommended setting: 1 (used in the library itself) +#define wxUSE_MSGDLG 1 + +// progress dialog class for lengthy operations +#define wxUSE_PROGRESSDLG 0 + +// support for startup tips (wxShowTip &c) +#define wxUSE_STARTUP_TIPS 0 + +// text entry dialog and wxGetTextFromUser function +#define wxUSE_TEXTDLG 0 + +// number entry dialog +#define wxUSE_NUMBERDLG 0 + +// splash screen class +#define wxUSE_SPLASH 0 + +// wizards +#define wxUSE_WIZARDDLG 0 + +// ---------------------------------------------------------------------------- +// Metafiles support +// ---------------------------------------------------------------------------- + +// Windows supports the graphics format known as metafile which is, though not +// portable, is widely used under Windows and so is supported by wxWin (under +// Windows only, of course). Win16 (Win3.1) used the so-called "Window +// MetaFiles" or WMFs which were replaced with "Enhanced MetaFiles" or EMFs in +// Win32 (Win9x, NT, 2000). Both of these are supported in wxWin and, by +// default, WMFs will be used under Win16 and EMFs under Win32. This may be +// changed by setting wxUSE_WIN_METAFILES_ALWAYS to 1 and/or setting +// wxUSE_ENH_METAFILE to 0. You may also set wxUSE_METAFILE to 0 to not compile +// in any metafile related classes at all. +// +// Default is 1 for wxUSE_ENH_METAFILE and 0 for wxUSE_WIN_METAFILES_ALWAYS. +// +// Recommended setting: default or 0 for everything for portable programs. +#define wxUSE_METAFILE 0 +#define wxUSE_ENH_METAFILE 0 +#define wxUSE_WIN_METAFILES_ALWAYS 0 + +// ---------------------------------------------------------------------------- +// Big GUI components +// ---------------------------------------------------------------------------- + +// Set to 0 to disable document/view architecture +#define wxUSE_DOC_VIEW_ARCHITECTURE 0 + +// Set to 0 to disable MDI document/view architecture +#define wxUSE_MDI_ARCHITECTURE 0 + +// Set to 0 to disable print/preview architecture code +#define wxUSE_PRINTING_ARCHITECTURE 0 + +// wxHTML sublibrary allows to display HTML in wxWindow programs and much, +// much more. +// +// Default is 1. +// +// Recommended setting: 1 (wxHTML is great!), set to 0 if you want compile a +// smaller library. +#define wxUSE_HTML 0 + +// OpenGL canvas +#define wxUSE_GLCANVAS 0 + +// wxTreeLayout class +#define wxUSE_TREELAYOUT 0 + +// ---------------------------------------------------------------------------- +// Data transfer +// ---------------------------------------------------------------------------- + +// Use wxClipboard class for clipboard copy/paste. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_CLIPBOARD 0 + +// Use wxDataObject and related classes. Needed for clipboard and OLE drag and +// drop +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_DATAOBJ 0 + +// Use wxDropTarget and wxDropSource classes for drag and drop (this is +// different from "built in" drag and drop in wxTreeCtrl which is always +// available). Requires wxUSE_DATAOBJ. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_DRAG_AND_DROP 0 + +// ---------------------------------------------------------------------------- +// miscellaneous settings +// ---------------------------------------------------------------------------- + +// wxSingleInstanceChecker class allows to verify at startup if another program +// instance is running (it is only available under Win32) +// +// Default is 1 +// +// Recommended setting: 1 (the class is tiny, disabling it won't save much +// space) +#define wxUSE_SNGLINST_CHECKER 0 + +#define wxUSE_DRAGIMAGE 0 + +#define wxUSE_IPC 0 + // 0 for no interprocess comms +#define wxUSE_HELP 0 + // 0 for no help facility +#define wxUSE_MS_HTML_HELP 0 + // 0 for no MS HTML Help + +// Use wxHTML-based help controller? +#define wxUSE_WXHTML_HELP 0 + +#define wxUSE_RESOURCES 0 + // 0 for no wxGetResource/wxWriteResource +#define wxUSE_CONSTRAINTS 1 + // 0 for no window layout constraint system + +#define wxUSE_SPLINES 1 + // 0 for no splines + +#define wxUSE_XPM_IN_MSW 1 + // 0 for no XPM support in wxBitmap. + // Default is 1, as XPM is now fully + // supported this makes easier the issue + // of portable icons and bitmaps. + +#define wxUSE_IMAGE_LOADING_IN_MSW 0 + // Use dynamic DIB loading/saving code in utils/dib under MSW. +#define wxUSE_RESOURCE_LOADING_IN_MSW 0 + // Use dynamic icon/cursor loading/saving code + // under MSW. +#define wxUSE_WX_RESOURCES 0 + // Use .wxr resource mechanism (requires PrologIO library) + +#define wxUSE_MOUSEWHEEL 0 + // Include mouse wheel support + +// ---------------------------------------------------------------------------- +// postscript support settings +// ---------------------------------------------------------------------------- + +// Set to 1 for PostScript device context. +#define wxUSE_POSTSCRIPT 0 + +// Set to 1 to use font metric files in GetTextExtent +#define wxUSE_AFM_FOR_POSTSCRIPT 0 + +// ---------------------------------------------------------------------------- +// database classes +// ---------------------------------------------------------------------------- + +// Define 1 to use ODBC classes +#define wxUSE_ODBC 0 + +// For backward compatibility reasons, this parameter now only controls the +// default scrolling method used by cursors. This default behavior can be +// overriden by setting the second param of wxDB::wxDbGetConnection() or +// wxDb() constructor to indicate whether the connection (and any wxDbTable()s +// that use the connection) should support forward only scrolling of cursors, +// or both forward and backward support for backward scrolling cursors is +// dependent on the data source as well as the ODBC driver being used. +#define wxODBC_FWD_ONLY_CURSORS 1 + +// Default is 0. Set to 1 to use the deprecated classes, enum types, function, +// member variables. With a setting of 1, full backward compatibility with the +// 2.0.x release is possible. It is STRONGLY recommended that this be set to 0, +// as future development will be done only on the non-deprecated +// functions/classes/member variables/etc. +#define wxODBC_BACKWARD_COMPATABILITY 0 + +// ---------------------------------------------------------------------------- +// other compiler (mis)features +// ---------------------------------------------------------------------------- + +// Set this to 0 if your compiler can't cope with omission of prototype +// parameters. +// +// Default is 1. +// +// Recommended setting: 1 (should never need to set this to 0) +#define REMOVE_UNUSED_ARG 1 + +// VC++ 4.2 and above allows <iostream> and <iostream.h> but you can't mix +// them. Set to 1 for <iostream.h>, 0 for <iostream> +// +// Default is 1. +// +// Recommended setting: whatever your compiler likes more +#define wxUSE_IOSTREAMH 1 + +// ---------------------------------------------------------------------------- +// image format support +// ---------------------------------------------------------------------------- + +// wxImage supports many different image formats which can be configured at +// compile-time. BMP is always supported, others are optional and can be safely +// disabled if you don't plan to use images in such format sometimes saving +// substantial amount of code in the final library. +// +// Some formats require an extra library which is included in wxWin sources +// which is mentioned if it is the case. + +// Set to 1 for wxImage support (recommended). +#define wxUSE_IMAGE 1 + +// Set to 1 for PNG format support (requires libpng). Also requires wxUSE_ZLIB. +#define wxUSE_LIBPNG 0 + +// Set to 1 for JPEG format support (requires libjpeg) +#define wxUSE_LIBJPEG 0 + +// Set to 1 for TIFF format support (requires libtiff) +#define wxUSE_LIBTIFF 0 + +// Set to 1 for GIF format support +#define wxUSE_GIF 0 + +// Set to 1 for PNM format support +#define wxUSE_PNM 0 + +// Set to 1 for PCX format support +#define wxUSE_PCX 0 + +// Set to 1 for IFF format support +#define wxUSE_IFF 0 + +// Set to 1 for XPM format support +#define wxUSE_XPM 1 + +// Set to 1 for MS Icons and Cursors format support +#define wxUSE_ICO_CUR 1 + +// Set to 1 to compile in wxPalette class +#define wxUSE_PALETTE 1 + +// ---------------------------------------------------------------------------- +// Windows-only settings +// ---------------------------------------------------------------------------- + +// Set this to 1 if you want to use wxWidgets and MFC in the same program. This +// will override some other settings (see below) +// +// Default is 0. +// +// Recommended setting: 0 unless you really have to use MFC +#define wxUSE_MFC 0 + +// Set this to 1 for generic OLE support: this is required for drag-and-drop, +// clipboard, OLE Automation. Only set it to 0 if your compiler is very old and +// can't compile/doesn't have the OLE headers. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_OLE 0 + +// Set this to 1 to use Microsoft CTL3D library for "3D-look" under Win16 or NT +// 3.x. This setting is ignored under Win9x and NT 4.0+. +// +// Default is 0 for (most) Win32 (systems), 1 for Win16 +// +// Recommended setting: same as default +#if defined(__WIN95__) +#define wxUSE_CTL3D 0 +#else +#define wxUSE_CTL3D 1 +#endif + +// Set to 0 to disable PostScript print/preview architecture code under Windows +// (just use Windows printing). +#define wxUSE_POSTSCRIPT_ARCHITECTURE_IN_MSW 0 + +// Set this to 1 to use RICHEDIT controls for wxTextCtrl with style wxTE_RICH +// which allows to put more than ~32Kb of text in it even under Win9x (NT +// doesn't have such limitation). +// +// Default is 1 for compilers which support it +// +// Recommended setting: 1, only set it to 0 if your compiler doesn't have +// or can't compile <richedit.h> +#if defined(__WIN95__) && !defined(__WINE__) && !defined(__GNUWIN32_OLD__) +#define wxUSE_RICHEDIT 1 + +// TODO: This should be ifdef'ed for any compilers that don't support +// RichEdit 2.0 but do have RichEdit 1.0... +#define wxUSE_RICHEDIT2 1 + +#else +#define wxUSE_RICHEDIT 0 +#define wxUSE_RICHEDIT2 0 +#endif + +// Set this to 1 to enable support for the owner-drawn menu and listboxes. This +// is required by wxUSE_CHECKLISTBOX. +// +// Default is 1. +// +// Recommended setting: 1, set to 0 for a small library size reduction +#define wxUSE_OWNER_DRAWN 0 + +// ---------------------------------------------------------------------------- +// obsolete settings +// ---------------------------------------------------------------------------- + +// NB: all settings in this section are obsolete and should not be used/changed +// at all, they will disappear + +// Define 1 to use bitmap messages. +#define wxUSE_BITMAP_MESSAGE 1 + +// If 1, enables provision of run-time type information. +// NOW MANDATORY: don't change. +#define wxUSE_DYNAMIC_CLASSES 1 + +// ---------------------------------------------------------------------------- +// disable the settings which don't work for some compilers +// ---------------------------------------------------------------------------- + +#ifndef wxUSE_NORLANDER_HEADERS +#if (defined(__MINGW32__) || defined(__CYGWIN__)) && ((__GNUC__>2) ||((__GNUC__==2) && (__GNUC_MINOR__>=95))) +# define wxUSE_NORLANDER_HEADERS 1 +#else +# define wxUSE_NORLANDER_HEADERS 0 +#endif +#endif + +#if defined(__GNUWIN32__) +// These don't work as expected for mingw32 and cygwin32 +#undef wxUSE_MEMORY_TRACING +#define wxUSE_MEMORY_TRACING 0 + +#undef wxUSE_GLOBAL_MEMORY_OPERATORS +#define wxUSE_GLOBAL_MEMORY_OPERATORS 0 + +#undef wxUSE_DEBUG_NEW_ALWAYS +#define wxUSE_DEBUG_NEW_ALWAYS 0 + +// Cygwin betas don't have wcslen +#if defined(__CYGWIN__) || defined(__CYGWIN32__) +# if ! ((__GNUC__>2) ||((__GNUC__==2) && (__GNUC_MINOR__>=95))) +# undef wxUSE_WCHAR_T +# define wxUSE_WCHAR_T 0 +# endif +#endif + +#endif // __GNUWIN32__ + +// MFC duplicates these operators +#if wxUSE_MFC +#undef wxUSE_GLOBAL_MEMORY_OPERATORS +#define wxUSE_GLOBAL_MEMORY_OPERATORS 0 + +#undef wxUSE_DEBUG_NEW_ALWAYS +#define wxUSE_DEBUG_NEW_ALWAYS 0 +#endif // wxUSE_MFC + +#if (!defined(WIN32) && !defined(__WIN32__)) || (defined(__GNUWIN32__) && !wxUSE_NORLANDER_HEADERS) +// Can't use OLE drag and drop in Windows 3.1 because we don't know how +// to implement UUIDs +// GnuWin32 doesn't have appropriate headers for e.g. IUnknown. +#undef wxUSE_DRAG_AND_DROP +#define wxUSE_DRAG_AND_DROP 0 +#endif + +// Only WIN32 supports wxStatusBar95 +#if !defined(__WIN32__) && wxUSE_NATIVE_STATUSBAR +#undef wxUSE_NATIVE_STATUSBAR +#define wxUSE_NATIVE_STATUSBAR 0 +#endif + +#if !wxUSE_OWNER_DRAWN +#undef wxUSE_CHECKLISTBOX +#define wxUSE_CHECKLISTBOX 0 +#endif + +// Salford C++ doesn't like some of the memory operator definitions +#ifdef __SALFORDC__ +#undef wxUSE_MEMORY_TRACING +#define wxUSE_MEMORY_TRACING 0 + +#undef wxUSE_GLOBAL_MEMORY_OPERATORS +#define wxUSE_GLOBAL_MEMORY_OPERATORS 0 + +#undef wxUSE_DEBUG_NEW_ALWAYS +#define wxUSE_DEBUG_NEW_ALWAYS 0 + +#undef wxUSE_THREADS +#define wxUSE_THREADS 0 + +#undef wxUSE_OWNER_DRAWN +#define wxUSE_OWNER_DRAWN 0 +#endif // __SALFORDC__ + +// BC++/Win16 can't cope with the amount of data in resource.cpp +#if defined(__WIN16__) && defined(__BORLANDC__) +#undef wxUSE_WX_RESOURCES +#define wxUSE_WX_RESOURCES 0 + +#undef wxUSE_ODBC +#define wxUSE_ODBC 0 + +#undef wxUSE_NEW_GRID +#define wxUSE_NEW_GRID 0 +#endif + +#if defined(__BORLANDC__) && (__BORLANDC__ < 0x500) +// BC++ 4.0 can't compile JPEG library +#undef wxUSE_LIBJPEG +#define wxUSE_LIBJPEG 0 +#endif + +// wxUSE_DEBUG_NEW_ALWAYS = 1 not compatible with BC++ in DLL mode +#if defined(__BORLANDC__) && (defined(WXMAKINGDLL) || defined(WXUSINGDLL)) +#undef wxUSE_DEBUG_NEW_ALWAYS +#define wxUSE_DEBUG_NEW_ALWAYS 0 +#endif + +#if defined(__WXMSW__) && defined(__WATCOMC__) +/* +#undef wxUSE_GLCANVAS +#define wxUSE_GLCANVAS 0 +*/ + +#undef wxUSE_WCHAR_T +#define wxUSE_WCHAR_T 0 +#endif + +#if defined(__WXMSW__) && !defined(__WIN32__) + +#undef wxUSE_SOCKETS +#define wxUSE_SOCKETS 0 + +#undef wxUSE_THREADS +#define wxUSE_THREADS 0 + +#undef wxUSE_TOOLTIPS +#define wxUSE_TOOLTIPS 0 + +#undef wxUSE_SPINCTRL +#define wxUSE_SPINCTRL 0 + +#undef wxUSE_SPINBTN +#define wxUSE_SPINBTN 0 + +#undef wxUSE_LIBPNG +#define wxUSE_LIBPNG 0 + +#undef wxUSE_LIBJPEG +#define wxUSE_LIBJPEG 0 + +#undef wxUSE_LIBTIFF +#define wxUSE_LIBTIFF 0 + +#undef wxUSE_GIF +#define wxUSE_GIF 0 + +#undef wxUSE_PNM +#define wxUSE_PNM 0 + +#undef wxUSE_PCX +#define wxUSE_PCX 0 + +#undef wxUSE_GLCANVAS +#define wxUSE_GLCANVAS 0 + +#undef wxUSE_MS_HTML_HELP +#define wxUSE_MS_HTML_HELP 0 + +#undef wxUSE_WCHAR_T +#define wxUSE_WCHAR_T 0 + +#endif // Win16 + +// ---------------------------------------------------------------------------- +// undef the things which don't make sense for wxBase build +// ---------------------------------------------------------------------------- + +#if !wxUSE_GUI + +#undef wxUSE_HTML +#define wxUSE_HTML 0 + +#endif // !wxUSE_GUI + +// ---------------------------------------------------------------------------- +// check the settings consistency: do it here to abort compilation immediately +// and not almost in the very end when the relevant file fails to compile and +// you need to modify setup.h and rebuild everything +// ---------------------------------------------------------------------------- + +#if wxUSE_DATETIME && !wxUSE_LONGLONG + #error wxDateTime requires wxLongLong +#endif + +#if wxUSE_TEXTFILE && !wxUSE_FILE + #error You cannot compile wxTextFile without wxFile +#endif + +#if wxUSE_FILESYSTEM && !wxUSE_STREAMS + #error You cannot compile virtual file systems without wxUSE_STREAMS +#endif + +#if wxUSE_HTML && !wxUSE_FILESYSTEM + #error You cannot compile wxHTML without virtual file systems +#endif + +// add more tests here... + +#endif + // _WX_SETUP_H_ diff --git a/Externals/wxWidgets/include/wx/msw/slider95.h b/Externals/wxWidgets/include/wx/msw/slider95.h new file mode 100644 index 0000000000..0233a560f0 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/slider95.h @@ -0,0 +1,137 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/slider95.h +// Purpose: wxSlider class, using the Win95 (and later) trackbar control +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: slider95.h 37393 2006-02-08 21:47:09Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_SLIDER95_H_ +#define _WX_SLIDER95_H_ + +class WXDLLEXPORT wxSubwindows; + +// Slider +class WXDLLEXPORT wxSlider : public wxSliderBase +{ +public: + wxSlider() { Init(); } + + wxSlider(wxWindow *parent, + wxWindowID id, + int value, + int minValue, + int maxValue, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxSL_HORIZONTAL, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxSliderNameStr) + { + Init(); + + (void)Create(parent, id, value, minValue, maxValue, + pos, size, style, validator, name); + } + + bool Create(wxWindow *parent, + wxWindowID id, + int value, + int minValue, int maxValue, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxSL_HORIZONTAL, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxSliderNameStr); + + virtual ~wxSlider(); + + // slider methods + virtual int GetValue() const; + virtual void SetValue(int); + + void SetRange(int minValue, int maxValue); + + int GetMin() const { return m_rangeMin; } + int GetMax() const { return m_rangeMax; } + + // Win32-specific slider methods + void SetTickFreq(int n, int pos); + int GetTickFreq() const { return m_tickFreq; } + void SetPageSize(int pageSize); + int GetPageSize() const; + void ClearSel(); + void ClearTicks(); + void SetLineSize(int lineSize); + int GetLineSize() const; + int GetSelEnd() const; + int GetSelStart() const; + void SetSelection(int minPos, int maxPos); + void SetThumbLength(int len); + int GetThumbLength() const; + void SetTick(int tickPos); + + // implementation only from now on + WXHWND GetStaticMin() const; + WXHWND GetStaticMax() const; + WXHWND GetEditValue() const; + virtual bool ContainsHWND(WXHWND hWnd) const; + + // we should let background show through the slider (and its labels) + virtual bool HasTransparentBackground() { return true; } + + + void Command(wxCommandEvent& event); + virtual bool MSWOnScroll(int orientation, WXWORD wParam, + WXWORD pos, WXHWND control); + + virtual bool Show(bool show = true); + virtual bool Enable(bool show = true); + virtual bool SetFont(const wxFont& font); + + virtual WXDWORD MSWGetStyle(long flags, WXDWORD *exstyle = NULL) const; + +protected: + // common part of all ctors + void Init(); + + // format an integer value as string + static wxString Format(int n) { return wxString::Format(_T("%d"), n); } + + // get the boundig box for the slider and possible labels + wxRect GetBoundingBox() const; + + // get the height and, if the pointer is not NULL, width of our labels + int GetLabelsSize(int *width = NULL) const; + + + // overridden base class virtuals + virtual void DoGetPosition(int *x, int *y) const; + virtual void DoGetSize(int *width, int *height) const; + virtual void DoMoveWindow(int x, int y, int width, int height); + virtual wxSize DoGetBestSize() const; + + virtual wxBorder GetDefaultBorder() const { return wxBORDER_NONE; } + + + // the labels windows, if any + wxSubwindows *m_labels; + + int m_rangeMin; + int m_rangeMax; + int m_pageSize; + int m_lineSize; + int m_tickFreq; + + // flag needed to detect whether we're getting THUMBRELEASE event because + // of dragging the thumb or scrolling the mouse wheel + bool m_isDragging; + + DECLARE_DYNAMIC_CLASS_NO_COPY(wxSlider) +}; + +#endif // _WX_SLIDER95_H_ + diff --git a/Externals/wxWidgets/include/wx/msw/sound.h b/Externals/wxWidgets/include/wx/msw/sound.h new file mode 100644 index 0000000000..f0ef42cae7 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/sound.h @@ -0,0 +1,52 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/sound.h +// Purpose: wxSound class +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: sound.h 35650 2005-09-23 12:56:45Z MR $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_SOUND_H_ +#define _WX_SOUND_H_ + +#if wxUSE_SOUND + +class WXDLLIMPEXP_ADV wxSound : public wxSoundBase +{ +public: + wxSound(); + wxSound(const wxString& fileName, bool isResource = false); + wxSound(int size, const wxByte* data); + virtual ~wxSound(); + + // Create from resource or file + bool Create(const wxString& fileName, bool isResource = false); + + // Create from data + bool Create(int size, const wxByte* data); + + bool IsOk() const { return m_data != NULL; } + + static void Stop(); + +protected: + void Init() { m_data = NULL; } + bool CheckCreatedOk(); + void Free(); + + virtual bool DoPlay(unsigned flags) const; + +private: + // data of this object + class wxSoundData *m_data; + + DECLARE_NO_COPY_CLASS(wxSound) +}; + +#endif // wxUSE_SOUND + +#endif // _WX_SOUND_H_ + diff --git a/Externals/wxWidgets/include/wx/msw/spinbutt.h b/Externals/wxWidgets/include/wx/msw/spinbutt.h new file mode 100644 index 0000000000..dcfb0a3706 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/spinbutt.h @@ -0,0 +1,72 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/univ/spinbutt.h +// Purpose: wxSpinButton class +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: spinbutt.h 41316 2006-09-20 14:15:14Z RR $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_SPINBUTT_H_ +#define _WX_SPINBUTT_H_ + +#include "wx/control.h" +#include "wx/event.h" + +#if wxUSE_SPINBTN + +class WXDLLEXPORT wxSpinButton : public wxSpinButtonBase +{ +public: + // construction + wxSpinButton() { } + + wxSpinButton(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxSP_VERTICAL | wxSP_ARROW_KEYS, + const wxString& name = wxSPIN_BUTTON_NAME) + { + Create(parent, id, pos, size, style, name); + } + + virtual ~wxSpinButton(); + + bool Create(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxSP_VERTICAL | wxSP_ARROW_KEYS, + const wxString& name = wxSPIN_BUTTON_NAME); + + + // accessors + virtual int GetValue() const; + virtual void SetValue(int val); + virtual void SetRange(int minVal, int maxVal); + + // implementation + virtual bool MSWCommand(WXUINT param, WXWORD id); + virtual bool MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result); + virtual bool MSWOnScroll(int orientation, WXWORD wParam, + WXWORD pos, WXHWND control); + + // a wxSpinButton can't do anything useful with focus, only wxSpinCtrl can + virtual bool AcceptsFocus() const { return false; } + +protected: + virtual wxSize DoGetBestSize() const; + + // ensure that the control displays a value in the current range + virtual void NormalizeValue(); + +private: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxSpinButton) +}; + +#endif // wxUSE_SPINBTN + +#endif // _WX_SPINBUTT_H_ diff --git a/Externals/wxWidgets/include/wx/msw/spinctrl.h b/Externals/wxWidgets/include/wx/msw/spinctrl.h new file mode 100644 index 0000000000..df84d154ea --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/spinctrl.h @@ -0,0 +1,136 @@ +//////////////////////////////////////////////////////////////////////////// +// Name: msw/spinctrl.h +// Purpose: wxSpinCtrl class declaration for Win32 +// Author: Vadim Zeitlin +// Modified by: +// Created: 22.07.99 +// RCS-ID: $Id: spinctrl.h 44196 2007-01-11 01:59:42Z VZ $ +// Copyright: (c) Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MSW_SPINCTRL_H_ +#define _WX_MSW_SPINCTRL_H_ + +#include "wx/spinbutt.h" // the base class + +#if wxUSE_SPINCTRL + +#include "wx/dynarray.h" + +class WXDLLEXPORT wxSpinCtrl; +WX_DEFINE_EXPORTED_ARRAY_PTR(wxSpinCtrl *, wxArraySpins); + +// ---------------------------------------------------------------------------- +// Under Win32, wxSpinCtrl is a wxSpinButton with a buddy (as MSDN docs call +// it) text window whose contents is automatically updated when the spin +// control is clicked. +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxSpinCtrl : public wxSpinButton +{ +public: + wxSpinCtrl() { } + + wxSpinCtrl(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxString& value = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxSP_ARROW_KEYS, + int min = 0, int max = 100, int initial = 0, + const wxString& name = _T("wxSpinCtrl")) + { + Create(parent, id, value, pos, size, style, min, max, initial, name); + } + + bool Create(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxString& value = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxSP_ARROW_KEYS, + int min = 0, int max = 100, int initial = 0, + const wxString& name = _T("wxSpinCtrl")); + + // a wxTextCtrl-like method (but we can't have GetValue returning wxString + // because the base class already has one returning int!) + void SetValue(const wxString& text); + + // another wxTextCtrl-like method + void SetSelection(long from, long to); + + // implementation only from now on + // ------------------------------- + + virtual ~wxSpinCtrl(); + + virtual void SetValue(int val); + virtual int GetValue() const; + virtual bool SetFont(const wxFont &font); + virtual void SetFocus(); + + virtual bool Enable(bool enable = true); + virtual bool Show(bool show = true); + + // wxSpinButton doesn't accept focus, but we do + virtual bool AcceptsFocus() const { return wxWindow::AcceptsFocus(); } + + // for internal use only + + // get the subclassed window proc of the buddy text + WXFARPROC GetBuddyWndProc() const { return m_wndProcBuddy; } + + // return the spinctrl object whose buddy is the given window or NULL + static wxSpinCtrl *GetSpinForTextCtrl(WXHWND hwndBuddy); + + // process a WM_COMMAND generated by the buddy text control + bool ProcessTextCommand(WXWORD cmd, WXWORD id); + +protected: + virtual void DoGetPosition(int *x, int *y) const; + virtual void DoMoveWindow(int x, int y, int width, int height); + virtual wxSize DoGetBestSize() const; + virtual void DoGetSize(int *width, int *height) const; +#if wxUSE_TOOLTIPS + virtual void DoSetToolTip( wxToolTip *tip ); +#endif // wxUSE_TOOLTIPS + + // the handler for wxSpinButton events + void OnSpinChange(wxSpinEvent& event); + + // handle processing of special keys + void OnChar(wxKeyEvent& event); + void OnSetFocus(wxFocusEvent& event); + void OnKillFocus(wxFocusEvent& event); + + // generate spin control update event with the given value + void SendSpinUpdate(int value); + + // called to ensure that the value is in the correct range + virtual void NormalizeValue(); + + + // the value of the control before the latest change (which might not have + // changed anything in fact -- this is why we need this field) + int m_oldValue; + + // the data for the "buddy" text ctrl + WXHWND m_hwndBuddy; + WXFARPROC m_wndProcBuddy; + + // all existing wxSpinCtrls - this allows to find the one corresponding to + // the given buddy window in GetSpinForTextCtrl() + static wxArraySpins ms_allSpins; + +private: + DECLARE_DYNAMIC_CLASS(wxSpinCtrl) + DECLARE_EVENT_TABLE() + DECLARE_NO_COPY_CLASS(wxSpinCtrl) +}; + +#endif // wxUSE_SPINCTRL + +#endif // _WX_MSW_SPINCTRL_H_ + + diff --git a/Externals/wxWidgets/include/wx/msw/stackwalk.h b/Externals/wxWidgets/include/wx/msw/stackwalk.h new file mode 100644 index 0000000000..2aeba90c59 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/stackwalk.h @@ -0,0 +1,103 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/stackwalk.h +// Purpose: wxStackWalker for MSW +// Author: Vadim Zeitlin +// Modified by: +// Created: 2005-01-08 +// RCS-ID: $Id: stackwalk.h 43346 2006-11-12 14:33:03Z RR $ +// Copyright: (c) 2005 Vadim Zeitlin <vadim@wxwindows.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MSW_STACKWALK_H_ +#define _WX_MSW_STACKWALK_H_ + +#include "wx/arrstr.h" + +// these structs are declared in windows headers +struct _CONTEXT; +struct _EXCEPTION_POINTERS; + +// and these in dbghelp.h +struct _SYMBOL_INFO; + +// ---------------------------------------------------------------------------- +// wxStackFrame +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxStackFrame : public wxStackFrameBase +{ +private: + wxStackFrame *ConstCast() const + { return wx_const_cast(wxStackFrame *, this); } + + size_t DoGetParamCount() const { return m_paramTypes.GetCount(); } + +public: + wxStackFrame(size_t level, void *address, size_t addrFrame) + : wxStackFrameBase(level, address) + { + m_hasName = + m_hasLocation = false; + + m_addrFrame = addrFrame; + } + + virtual size_t GetParamCount() const + { + ConstCast()->OnGetParam(); + return DoGetParamCount(); + } + + virtual bool + GetParam(size_t n, wxString *type, wxString *name, wxString *value) const; + + // callback used by OnGetParam(), don't call directly + void OnParam(_SYMBOL_INFO *pSymInfo); + +protected: + virtual void OnGetName(); + virtual void OnGetLocation(); + + void OnGetParam(); + + + // helper for debug API: it wants to have addresses as DWORDs + size_t GetSymAddr() const + { + return wx_reinterpret_cast(size_t, m_address); + } + +private: + bool m_hasName, + m_hasLocation; + + size_t m_addrFrame; + + wxArrayString m_paramTypes, + m_paramNames, + m_paramValues; +}; + +// ---------------------------------------------------------------------------- +// wxStackWalker +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxStackWalker : public wxStackWalkerBase +{ +public: + // we don't use ctor argument, it is for compatibility with Unix version + // only + wxStackWalker(const char * WXUNUSED(argv0) = NULL) { } + + virtual void Walk(size_t skip = 1, size_t maxDepth = 200); + virtual void WalkFromException(); + + + // enumerate stack frames from the given context + void WalkFrom(const _CONTEXT *ctx, size_t skip = 1); + void WalkFrom(const _EXCEPTION_POINTERS *ep, size_t skip = 1); +}; + +#endif // _WX_MSW_STACKWALK_H_ + diff --git a/Externals/wxWidgets/include/wx/msw/statbmp.h b/Externals/wxWidgets/include/wx/msw/statbmp.h new file mode 100644 index 0000000000..4e4ea9371f --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/statbmp.h @@ -0,0 +1,84 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/statbmp.h +// Purpose: wxStaticBitmap class for wxMSW +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: statbmp.h 37393 2006-02-08 21:47:09Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_STATBMP_H_ +#define _WX_STATBMP_H_ + +#include "wx/control.h" +#include "wx/icon.h" +#include "wx/bitmap.h" + +extern WXDLLEXPORT_DATA(const wxChar) wxStaticBitmapNameStr[]; + +// a control showing an icon or a bitmap +class WXDLLEXPORT wxStaticBitmap : public wxStaticBitmapBase +{ +public: + wxStaticBitmap() { Init(); } + + wxStaticBitmap(wxWindow *parent, + wxWindowID id, + const wxGDIImage& label, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxStaticBitmapNameStr) + { + Init(); + + Create(parent, id, label, pos, size, style, name); + } + + bool Create(wxWindow *parent, + wxWindowID id, + const wxGDIImage& label, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxStaticBitmapNameStr); + + virtual ~wxStaticBitmap() { Free(); } + + virtual void SetIcon(const wxIcon& icon) { SetImage(&icon); } + virtual void SetBitmap(const wxBitmap& bitmap) { SetImage(&bitmap); } + virtual wxBitmap GetBitmap() const; + virtual wxIcon GetIcon() const; + + virtual WXDWORD MSWGetStyle(long style, WXDWORD *exstyle) const; + +protected: + virtual wxBorder GetDefaultBorder() const; + virtual wxSize DoGetBestSize() const; + + // ctor/dtor helpers + void Init() { m_isIcon = true; m_image = NULL; m_currentHandle = 0; } + void Free(); + + // true if icon/bitmap is valid + bool ImageIsOk() const; + + void SetImage(const wxGDIImage* image); + void SetImageNoCopy( wxGDIImage* image ); + + // we can have either an icon or a bitmap + bool m_isIcon; + wxGDIImage *m_image; + + // handle used in last call to STM_SETIMAGE + WXHANDLE m_currentHandle; + +private: + DECLARE_DYNAMIC_CLASS(wxStaticBitmap) + DECLARE_NO_COPY_CLASS(wxStaticBitmap) +}; + +#endif + // _WX_STATBMP_H_ diff --git a/Externals/wxWidgets/include/wx/msw/statbox.h b/Externals/wxWidgets/include/wx/msw/statbox.h new file mode 100644 index 0000000000..99604516db --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/statbox.h @@ -0,0 +1,73 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/statbox.h +// Purpose: wxStaticBox class +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: statbox.h 37393 2006-02-08 21:47:09Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MSW_STATBOX_H_ +#define _WX_MSW_STATBOX_H_ + +// Group box +class WXDLLEXPORT wxStaticBox : public wxStaticBoxBase +{ +public: + wxStaticBox() { } + + wxStaticBox(wxWindow *parent, wxWindowID id, + const wxString& label, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxStaticBoxNameStr) + { + Create(parent, id, label, pos, size, style, name); + } + + bool Create(wxWindow *parent, wxWindowID id, + const wxString& label, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxStaticBoxNameStr); + + /// Implementation only + virtual void GetBordersForSizer(int *borderTop, int *borderOther) const; + + virtual WXDWORD MSWGetStyle(long style, WXDWORD *exstyle) const; + +protected: + virtual wxSize DoGetBestSize() const; + + // choose the default border for this window + virtual wxBorder GetDefaultBorder() const; + +#ifndef __WXWINCE__ +public: + virtual WXLRESULT MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam); + +protected: + // return the region with all the windows inside this static box excluded + virtual WXHRGN MSWGetRegionWithoutChildren(); + + // remove the parts which are painted by static box itself from the given + // region which is embedded in a rectangle (0, 0)-(w, h) + virtual void MSWGetRegionWithoutSelf(WXHRGN hrgn, int w, int h); + + // paint the given rectangle with our background brush/colour + virtual void PaintBackground(wxDC& dc, const struct tagRECT& rc); + // paint the foreground of the static box + virtual void PaintForeground(wxDC& dc, const struct tagRECT& rc); + + void OnPaint(wxPaintEvent& event); +#endif // !__WXWINCE__ + + DECLARE_DYNAMIC_CLASS_NO_COPY(wxStaticBox) +}; + +#endif // _WX_MSW_STATBOX_H_ + diff --git a/Externals/wxWidgets/include/wx/msw/statbr95.h b/Externals/wxWidgets/include/wx/msw/statbr95.h new file mode 100644 index 0000000000..3b7002d6f5 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/statbr95.h @@ -0,0 +1,76 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: msw/statbr95.h +// Purpose: native implementation of wxStatusBar +// Author: Vadim Zeitlin +// Modified by: +// Created: 04.04.98 +// RCS-ID: $Id: statbr95.h 41035 2006-09-06 17:36:22Z PC $ +// Copyright: (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _STATBR95_H +#define _STATBR95_H + +#if wxUSE_NATIVE_STATUSBAR + +class WXDLLEXPORT wxStatusBar95 : public wxStatusBarBase +{ +public: + // ctors and such + wxStatusBar95(); + wxStatusBar95(wxWindow *parent, + wxWindowID id = wxID_ANY, + long style = wxST_SIZEGRIP, + const wxString& name = wxStatusBarNameStr) + { + (void)Create(parent, id, style, name); + } + + bool Create(wxWindow *parent, + wxWindowID id = wxID_ANY, + long style = wxST_SIZEGRIP, + const wxString& name = wxStatusBarNameStr); + + virtual ~wxStatusBar95(); + + // a status line can have several (<256) fields numbered from 0 + virtual void SetFieldsCount(int number = 1, const int *widths = NULL); + + // each field of status line has it's own text + virtual void SetStatusText(const wxString& text, int number = 0); + virtual wxString GetStatusText(int number = 0) const; + + // set status line fields' widths + virtual void SetStatusWidths(int n, const int widths_field[]); + + // set status line fields' styles + virtual void SetStatusStyles(int n, const int styles[]); + + // sets the minimal vertical size of the status bar + virtual void SetMinHeight(int height); + + // get the position and size of the field's internal bounding rectangle + virtual bool GetFieldRect(int i, wxRect& rect) const; + + // get the border size + virtual int GetBorderX() const; + virtual int GetBorderY() const; + + virtual WXLRESULT MSWWindowProc(WXUINT nMsg, + WXWPARAM wParam, + WXLPARAM lParam); +protected: + void CopyFieldsWidth(const int widths[]); + void SetFieldsWidth(); + + // override base class virtual + void DoMoveWindow(int x, int y, int width, int height); + +private: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxStatusBar95) +}; + +#endif // wxUSE_NATIVE_STATUSBAR + +#endif diff --git a/Externals/wxWidgets/include/wx/msw/statline.h b/Externals/wxWidgets/include/wx/msw/statline.h new file mode 100644 index 0000000000..7b7edf9306 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/statline.h @@ -0,0 +1,52 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: msw/statline.h +// Purpose: MSW version of wxStaticLine class +// Author: Vadim Zeitlin +// Created: 28.06.99 +// Version: $Id: statline.h 43874 2006-12-09 14:52:59Z VZ $ +// Copyright: (c) 1998 Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MSW_STATLINE_H_ +#define _WX_MSW_STATLINE_H_ + +// ---------------------------------------------------------------------------- +// wxStaticLine +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxStaticLine : public wxStaticLineBase +{ +public: + // constructors and pseudo-constructors + wxStaticLine() { } + + wxStaticLine( wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxLI_HORIZONTAL, + const wxString &name = wxStaticLineNameStr ) + { + Create(parent, id, pos, size, style, name); + } + + bool Create( wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxLI_HORIZONTAL, + const wxString &name = wxStaticLineNameStr ); + + // overriden base class virtuals + virtual bool AcceptsFocus() const { return false; } + + // usually overridden base class virtuals + virtual WXDWORD MSWGetStyle(long style, WXDWORD *exstyle) const; + + DECLARE_DYNAMIC_CLASS_NO_COPY(wxStaticLine) +}; + +#endif // _WX_MSW_STATLINE_H_ + + diff --git a/Externals/wxWidgets/include/wx/msw/stattext.h b/Externals/wxWidgets/include/wx/msw/stattext.h new file mode 100644 index 0000000000..2338315cbf --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/stattext.h @@ -0,0 +1,56 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/stattext.h +// Purpose: wxStaticText class +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: stattext.h 37393 2006-02-08 21:47:09Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_STATTEXT_H_ +#define _WX_STATTEXT_H_ + +class WXDLLEXPORT wxStaticText : public wxStaticTextBase +{ +public: + wxStaticText() { } + + wxStaticText(wxWindow *parent, + wxWindowID id, + const wxString& label, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxStaticTextNameStr) + { + Create(parent, id, label, pos, size, style, name); + } + + bool Create(wxWindow *parent, + wxWindowID id, + const wxString& label, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxStaticTextNameStr); + + // override some methods to resize the window properly + virtual void SetLabel(const wxString& label); + virtual bool SetFont( const wxFont &font ); + + virtual WXDWORD MSWGetStyle(long flags, WXDWORD *exstyle = NULL) const; + +protected: + // implement/override some base class virtuals + virtual wxBorder GetDefaultBorder() const; + virtual void DoSetSize(int x, int y, int w, int h, + int sizeFlags = wxSIZE_AUTO); + virtual wxSize DoGetBestSize() const; + + DECLARE_DYNAMIC_CLASS_NO_COPY(wxStaticText) +}; + +#endif + // _WX_STATTEXT_H_ diff --git a/Externals/wxWidgets/include/wx/msw/std.ico b/Externals/wxWidgets/include/wx/msw/std.ico new file mode 100644 index 0000000000..435cca2471 Binary files /dev/null and b/Externals/wxWidgets/include/wx/msw/std.ico differ diff --git a/Externals/wxWidgets/include/wx/msw/stdpaths.h b/Externals/wxWidgets/include/wx/msw/stdpaths.h new file mode 100644 index 0000000000..55f8f2d98f --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/stdpaths.h @@ -0,0 +1,53 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/stdpaths.h +// Purpose: wxStandardPaths for Win32 +// Author: Vadim Zeitlin +// Modified by: +// Created: 2004-10-19 +// RCS-ID: $Id: stdpaths.h 43340 2006-11-12 12:58:10Z RR $ +// Copyright: (c) 2004 Vadim Zeitlin <vadim@wxwindows.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MSW_STDPATHS_H_ +#define _WX_MSW_STDPATHS_H_ + +// ---------------------------------------------------------------------------- +// wxStandardPaths +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxStandardPaths : public wxStandardPathsBase +{ +public: + // implement base class pure virtuals + virtual wxString GetExecutablePath() const; + virtual wxString GetConfigDir() const; + virtual wxString GetUserConfigDir() const; + virtual wxString GetDataDir() const; + virtual wxString GetUserDataDir() const; + virtual wxString GetUserLocalDataDir() const; + virtual wxString GetPluginsDir() const; + virtual wxString GetDocumentsDir() const; + +protected: + // get the path corresponding to the given standard CSIDL_XXX constant + static wxString DoGetDirectory(int csidl); + + // return the directory of the application itself + static wxString GetAppDir(); +}; + +// ---------------------------------------------------------------------------- +// wxStandardPathsWin16: this class is for internal use only +// ---------------------------------------------------------------------------- + +// override config file locations to be compatible with the values used by +// wxFileConfig (dating from Win16 days which explains the class name) +class WXDLLIMPEXP_BASE wxStandardPathsWin16 : public wxStandardPaths +{ +public: + virtual wxString GetConfigDir() const; + virtual wxString GetUserConfigDir() const; +}; + +#endif // _WX_MSW_STDPATHS_H_ diff --git a/Externals/wxWidgets/include/wx/msw/subwin.h b/Externals/wxWidgets/include/wx/msw/subwin.h new file mode 100644 index 0000000000..75f8dad6d0 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/subwin.h @@ -0,0 +1,195 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/subwin.h +// Purpose: helper for implementing the controls with subwindows +// Author: Vadim Zeitlin +// Modified by: +// Created: 2004-12-11 +// RCS-ID: $Id: subwin.h 30981 2004-12-13 01:02:32Z VZ $ +// Copyright: (c) 2004 Vadim Zeitlin <vadim@wxwindows.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MSW_SUBWIN_H_ +#define _WX_MSW_SUBWIN_H_ + +#include "wx/msw/private.h" + +// ---------------------------------------------------------------------------- +// wxSubwindows contains all HWNDs making part of a single wx control +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxSubwindows +{ +public: + // the number of subwindows can be specified either as parameter to ctor or + // later in Create() + wxSubwindows(size_t n = 0) { Init(); if ( n ) Create(n); } + + // allocate enough space for the given number of windows + void Create(size_t n) + { + wxASSERT_MSG( !m_hwnds, _T("Create() called twice?") ); + + m_count = n; + m_hwnds = (HWND *)calloc(n, sizeof(HWND)); + } + + // non-virtual dtor, this class is not supposed to be used polymorphically + ~wxSubwindows() + { + for ( size_t n = 0; n < m_count; n++ ) + { + ::DestroyWindow(m_hwnds[n]); + } + + free(m_hwnds); + } + + // get the number of subwindows + size_t GetCount() const { return m_count; } + + // access a given window + HWND& Get(size_t n) + { + wxASSERT_MSG( n < m_count, _T("subwindow index out of range") ); + + return m_hwnds[n]; + } + + HWND& operator[](size_t n) { return Get(n); } + HWND operator[](size_t n) const + { + return wx_const_cast(wxSubwindows *, this)->Get(n); + } + + // check if we have this window + bool HasWindow(HWND hwnd) + { + for ( size_t n = 0; n < m_count; n++ ) + { + if ( m_hwnds[n] == hwnd ) + return true; + } + + return false; + } + + + // methods which are forwarded to all subwindows + // --------------------------------------------- + + // show/hide everything + void Show(bool show) + { + int sw = show ? SW_SHOW : SW_HIDE; + for ( size_t n = 0; n < m_count; n++ ) + { + ::ShowWindow(m_hwnds[n], sw); + } + } + + // enable/disable everything + void Enable(bool enable) + { + for ( size_t n = 0; n < m_count; n++ ) + { + ::EnableWindow(m_hwnds[n], enable); + } + } + + // set font for all windows + void SetFont(const wxFont& font) + { + HFONT hfont = GetHfontOf(font); + wxCHECK_RET( hfont, _T("invalid font") ); + + for ( size_t n = 0; n < m_count; n++ ) + { + ::SendMessage(m_hwnds[n], WM_SETFONT, (WPARAM)hfont, 0); + + // otherwise the window might not be redrawn correctly + ::InvalidateRect(m_hwnds[n], NULL, FALSE /* don't erase bg */); + } + } + + // find the bounding box for all windows + wxRect GetBoundingBox() const + { + wxRect r; + for ( size_t n = 0; n < m_count; n++ ) + { + RECT rc; + ::GetWindowRect(m_hwnds[n], &rc); + + r.Union(wxRectFromRECT(rc)); + } + + return r; + } + +private: + void Init() + { + m_count = 0; + m_hwnds = NULL; + } + + // number of elements in m_hwnds array + size_t m_count; + + // the HWNDs we contain + HWND *m_hwnds; + + + DECLARE_NO_COPY_CLASS(wxSubwindows) +}; + +// convenient macro to forward a few methods which are usually propagated to +// subwindows to a wxSubwindows object +// +// parameters should be: +// - cname the name of the class implementing these methods +// - base the name of its base class +// - subwins the name of the member variable of type wxSubwindows * +#define WX_FORWARD_STD_METHODS_TO_SUBWINDOWS(cname, base, subwins) \ + bool cname::ContainsHWND(WXHWND hWnd) const \ + { \ + return subwins && subwins->HasWindow((HWND)hWnd); \ + } \ + \ + bool cname::Show(bool show) \ + { \ + if ( !base::Show(show) ) \ + return false; \ + \ + if ( subwins ) \ + subwins->Show(show); \ + \ + return true; \ + } \ + \ + bool cname::Enable(bool enable) \ + { \ + if ( !base::Enable(enable) ) \ + return false; \ + \ + if ( subwins ) \ + subwins->Enable(enable); \ + \ + return true; \ + } \ + \ + bool cname::SetFont(const wxFont& font) \ + { \ + if ( !base::SetFont(font) ) \ + return false; \ + \ + if ( subwins ) \ + subwins->SetFont(font); \ + \ + return true; \ + } + + +#endif // _WX_MSW_SUBWIN_H_ + diff --git a/Externals/wxWidgets/include/wx/msw/tabctrl.h b/Externals/wxWidgets/include/wx/msw/tabctrl.h new file mode 100644 index 0000000000..23df097c59 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/tabctrl.h @@ -0,0 +1,160 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: tabctrl.h +// Purpose: wxTabCtrl class +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: tabctrl.h 41020 2006-09-05 20:47:48Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_TABCTRL_H_ +#define _WX_TABCTRL_H_ + +class WXDLLIMPEXP_CORE wxImageList; + +// extern WXDLLEXPORT_DATA(const wxChar) wxToolBarNameStr[]; + +/* + * Flags returned by HitTest + */ + +#define wxTAB_HITTEST_NOWHERE 1 +#define wxTAB_HITTEST_ONICON 2 +#define wxTAB_HITTEST_ONLABEL 4 +#define wxTAB_HITTEST_ONITEM 6 + +class WXDLLEXPORT wxTabCtrl: public wxControl +{ + DECLARE_DYNAMIC_CLASS(wxTabCtrl) + public: + /* + * Public interface + */ + + wxTabCtrl(); + + inline wxTabCtrl(wxWindow *parent, wxWindowID id, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, + long style = 0, const wxString& name = wxT("tabCtrl")) + { + Create(parent, id, pos, size, style, name); + } + virtual ~wxTabCtrl(); + +// Accessors + + // Get the selection + int GetSelection() const; + + // Get the tab with the current keyboard focus + int GetCurFocus() const; + + // Get the associated image list + wxImageList* GetImageList() const; + + // Get the number of items + int GetItemCount() const; + + // Get the rect corresponding to the tab + bool GetItemRect(int item, wxRect& rect) const; + + // Get the number of rows + int GetRowCount() const; + + // Get the item text + wxString GetItemText(int item) const ; + + // Get the item image + int GetItemImage(int item) const; + + // Get the item data + void* GetItemData(int item) const; + + // Set the selection + int SetSelection(int item); + + // Set the image list + void SetImageList(wxImageList* imageList); + + // Set the text for an item + bool SetItemText(int item, const wxString& text); + + // Set the image for an item + bool SetItemImage(int item, int image); + + // Set the data for an item + bool SetItemData(int item, void* data); + + // Set the size for a fixed-width tab control + void SetItemSize(const wxSize& size); + + // Set the padding between tabs + void SetPadding(const wxSize& padding); + +// Operations + + bool Create(wxWindow *parent, wxWindowID id, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, + long style = 0, const wxString& name = wxT("tabCtrl")); + + // Delete all items + bool DeleteAllItems(); + + // Delete an item + bool DeleteItem(int item); + + // Hit test + int HitTest(const wxPoint& pt, long& flags); + + // Insert an item + bool InsertItem(int item, const wxString& text, int imageId = -1, void* data = NULL); + + // Implementation + + virtual bool MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result); + + // Responds to colour changes + void OnSysColourChanged(wxSysColourChangedEvent& event); + +protected: + wxImageList* m_imageList; + +DECLARE_EVENT_TABLE() + DECLARE_NO_COPY_CLASS(wxTabCtrl) +}; + +class WXDLLEXPORT wxTabEvent : public wxNotifyEvent +{ +public: + wxTabEvent(wxEventType commandType = wxEVT_NULL, int id = 0, + int nSel = -1, int nOldSel = -1) + : wxNotifyEvent(commandType, id) + { + m_nSel = nSel; + m_nOldSel = nOldSel; + } + + // accessors + // the currently selected page (-1 if none) + int GetSelection() const { return m_nSel; } + void SetSelection(int nSel) { m_nSel = nSel; } + // the page that was selected before the change (-1 if none) + int GetOldSelection() const { return m_nOldSel; } + void SetOldSelection(int nOldSel) { m_nOldSel = nOldSel; } + +private: + int m_nSel, // currently selected page + m_nOldSel; // previously selected page + + DECLARE_DYNAMIC_CLASS_NO_COPY(wxTabEvent) +}; + +typedef void (wxEvtHandler::*wxTabEventFunction)(wxTabEvent&); + +#define EVT_TAB_SEL_CHANGED(id, fn) DECLARE_EVENT_TABLE_ENTRY(wxEVT_COMMAND_TAB_SEL_CHANGED, \ + id, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxTabEventFunction, & fn ), NULL), +#define EVT_TAB_SEL_CHANGING(id, fn) DECLARE_EVENT_TABLE_ENTRY(wxEVT_COMMAND_TAB_SEL_CHANGING, \ + id, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxTabEventFunction, & fn ), NULL), + +#endif + // _WX_TABCTRL_H_ diff --git a/Externals/wxWidgets/include/wx/msw/taskbar.h b/Externals/wxWidgets/include/wx/msw/taskbar.h new file mode 100644 index 0000000000..b6e64580b2 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/taskbar.h @@ -0,0 +1,82 @@ +///////////////////////////////////////////////////////////////////////// +// File: wx/msw/taskbar.h +// Purpose: Defines wxTaskBarIcon class for manipulating icons on the +// Windows task bar. +// Author: Julian Smart +// Modified by: Vaclav Slavik +// Created: 24/3/98 +// RCS-ID: $Id: taskbar.h 35650 2005-09-23 12:56:45Z MR $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////// + +#ifndef _TASKBAR_H_ +#define _TASKBAR_H_ + +#include "wx/icon.h" + +// private helper class: +class WXDLLIMPEXP_ADV wxTaskBarIconWindow; + +class WXDLLIMPEXP_ADV wxTaskBarIcon: public wxTaskBarIconBase +{ + DECLARE_DYNAMIC_CLASS_NO_COPY(wxTaskBarIcon) +public: + wxTaskBarIcon(); + virtual ~wxTaskBarIcon(); + +// Accessors + inline bool IsOk() const { return true; } + inline bool IsIconInstalled() const { return m_iconAdded; } + +// Operations + bool SetIcon(const wxIcon& icon, const wxString& tooltip = wxEmptyString); + bool RemoveIcon(void); + bool PopupMenu(wxMenu *menu); //, int x, int y); + +#if WXWIN_COMPATIBILITY_2_4 + wxDEPRECATED( bool IsOK() const ); + +// Overridables + virtual void OnMouseMove(wxEvent&); + virtual void OnLButtonDown(wxEvent&); + virtual void OnLButtonUp(wxEvent&); + virtual void OnRButtonDown(wxEvent&); + virtual void OnRButtonUp(wxEvent&); + virtual void OnLButtonDClick(wxEvent&); + virtual void OnRButtonDClick(wxEvent&); +#endif + +// Implementation +protected: + friend class wxTaskBarIconWindow; + long WindowProc(unsigned int msg, unsigned int wParam, long lParam); + void RegisterWindowMessages(); + +// Data members +protected: + wxTaskBarIconWindow *m_win; + bool m_iconAdded; + wxIcon m_icon; + wxString m_strTooltip; + +#if WXWIN_COMPATIBILITY_2_4 + // non-virtual default event handlers to forward events to the virtuals + void _OnMouseMove(wxTaskBarIconEvent&); + void _OnLButtonDown(wxTaskBarIconEvent&); + void _OnLButtonUp(wxTaskBarIconEvent&); + void _OnRButtonDown(wxTaskBarIconEvent&); + void _OnRButtonUp(wxTaskBarIconEvent&); + void _OnLButtonDClick(wxTaskBarIconEvent&); + void _OnRButtonDClick(wxTaskBarIconEvent&); + + DECLARE_EVENT_TABLE() +#endif +}; + +#if WXWIN_COMPATIBILITY_2_4 +inline bool wxTaskBarIcon::IsOK() const { return IsOk(); } +#endif + +#endif + // _TASKBAR_H_ diff --git a/Externals/wxWidgets/include/wx/msw/tbar95.h b/Externals/wxWidgets/include/wx/msw/tbar95.h new file mode 100644 index 0000000000..441e878b57 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/tbar95.h @@ -0,0 +1,153 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/tbar95.h +// Purpose: wxToolBar (Windows 95 toolbar) class +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: tbar95.h 44317 2007-01-25 23:35:07Z RD $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MSW_TBAR95_H_ +#define _WX_MSW_TBAR95_H_ + +#if wxUSE_TOOLBAR + +#include "wx/dynarray.h" +#include "wx/imaglist.h" + +class WXDLLEXPORT wxToolBar : public wxToolBarBase +{ +public: + // ctors and dtor + wxToolBar() { Init(); } + + wxToolBar(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxNO_BORDER | wxTB_HORIZONTAL, + const wxString& name = wxToolBarNameStr) + { + Init(); + + Create(parent, id, pos, size, style, name); + } + + bool Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxNO_BORDER | wxTB_HORIZONTAL, + const wxString& name = wxToolBarNameStr); + + virtual ~wxToolBar(); + + // override/implement base class virtuals + virtual wxToolBarToolBase *FindToolForPosition(wxCoord x, wxCoord y) const; + + virtual bool Realize(); + + virtual void SetToolBitmapSize(const wxSize& size); + virtual wxSize GetToolSize() const; + + virtual void SetRows(int nRows); + +#if wxABI_VERSION >= 20802 + // TODO: In 2.9 these should probably be virtual, and declared in the base class... + void SetToolNormalBitmap(int id, const wxBitmap& bitmap); + void SetToolDisabledBitmap(int id, const wxBitmap& bitmap); +#endif + + // implementation only from now on + // ------------------------------- + + virtual void SetWindowStyleFlag(long style); + + virtual bool MSWCommand(WXUINT param, WXWORD id); + virtual bool MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result); + + void OnMouseEvent(wxMouseEvent& event); + void OnSysColourChanged(wxSysColourChangedEvent& event); + void OnEraseBackground(wxEraseEvent& event); + + void SetFocus() {} + + static WXHBITMAP MapBitmap(WXHBITMAP bitmap, int width, int height); + + // override WndProc mainly to process WM_SIZE + virtual WXLRESULT MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam); + + virtual WXDWORD MSWGetStyle(long style, WXDWORD *exstyle) const; + +protected: + // common part of all ctors + void Init(); + + // create the native toolbar control + bool MSWCreateToolbar(const wxPoint& pos, const wxSize& size); + + // recreate the control completely + void Recreate(); + + // implement base class pure virtuals + virtual bool DoInsertTool(size_t pos, wxToolBarToolBase *tool); + virtual bool DoDeleteTool(size_t pos, wxToolBarToolBase *tool); + + virtual void DoEnableTool(wxToolBarToolBase *tool, bool enable); + virtual void DoToggleTool(wxToolBarToolBase *tool, bool toggle); + virtual void DoSetToggle(wxToolBarToolBase *tool, bool toggle); + + virtual wxToolBarToolBase *CreateTool(int id, + const wxString& label, + const wxBitmap& bmpNormal, + const wxBitmap& bmpDisabled, + wxItemKind kind, + wxObject *clientData, + const wxString& shortHelp, + const wxString& longHelp); + virtual wxToolBarToolBase *CreateTool(wxControl *control); + + // return the appropriate size and flags for the toolbar control + virtual wxSize DoGetBestSize() const; + + // handlers for various events + bool HandleSize(WXWPARAM wParam, WXLPARAM lParam); + bool HandlePaint(WXWPARAM wParam, WXLPARAM lParam); + void HandleMouseMove(WXWPARAM wParam, WXLPARAM lParam); + + // should be called whenever the toolbar size changes + void UpdateSize(); + + // create m_disabledImgList (but doesn't fill it), set it to NULL if it is + // unneeded + void CreateDisabledImageList(); + + // get the Windows toolbar style of this control + long GetMSWToolbarStyle() const; + + + // the big bitmap containing all bitmaps of the toolbar buttons + WXHBITMAP m_hBitmap; + + // the image list with disabled images, may be NULL if we use + // system-provided versions of them + wxImageList *m_disabledImgList; + + // the total number of toolbar elements + size_t m_nButtons; + + // the tool the cursor is in + wxToolBarToolBase *m_pInTool; + +private: + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS(wxToolBar) + DECLARE_NO_COPY_CLASS(wxToolBar) +}; + +#endif // wxUSE_TOOLBAR + +#endif // _WX_MSW_TBAR95_H_ + diff --git a/Externals/wxWidgets/include/wx/msw/textctrl.h b/Externals/wxWidgets/include/wx/msw/textctrl.h new file mode 100644 index 0000000000..557016426b --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/textctrl.h @@ -0,0 +1,289 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/textctrl.h +// Purpose: wxTextCtrl class +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: textctrl.h 44182 2007-01-09 21:26:53Z JS $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_TEXTCTRL_H_ +#define _WX_TEXTCTRL_H_ + +class WXDLLEXPORT wxTextCtrl : public wxTextCtrlBase +{ +public: + // creation + // -------- + + wxTextCtrl() { Init(); } + wxTextCtrl(wxWindow *parent, wxWindowID id, + const wxString& value = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxTextCtrlNameStr) + { + Init(); + + Create(parent, id, value, pos, size, style, validator, name); + } + virtual ~wxTextCtrl(); + + bool Create(wxWindow *parent, wxWindowID id, + const wxString& value = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxTextCtrlNameStr); + + // implement base class pure virtuals + // ---------------------------------- + + virtual wxString GetValue() const; + virtual bool IsEmpty() const; + + virtual wxString GetRange(long from, long to) const; + + virtual int GetLineLength(long lineNo) const; + virtual wxString GetLineText(long lineNo) const; + virtual int GetNumberOfLines() const; + + virtual bool IsModified() const; + virtual bool IsEditable() const; + + virtual void GetSelection(long* from, long* to) const; + + // operations + // ---------- + + // editing + virtual void Clear(); + virtual void Replace(long from, long to, const wxString& value); + virtual void Remove(long from, long to); + + // load the control's contents from the file + virtual bool DoLoadFile(const wxString& file, int fileType); + + // clears the dirty flag + virtual void MarkDirty(); + virtual void DiscardEdits(); + + virtual void SetMaxLength(unsigned long len); + + // writing text inserts it at the current position, appending always + // inserts it at the end + virtual void WriteText(const wxString& text); + virtual void AppendText(const wxString& text); + +#ifdef __WIN32__ + virtual bool EmulateKeyPress(const wxKeyEvent& event); +#endif // __WIN32__ + +#if wxUSE_RICHEDIT + // apply text attribute to the range of text (only works with richedit + // controls) + virtual bool SetStyle(long start, long end, const wxTextAttr& style); + virtual bool SetDefaultStyle(const wxTextAttr& style); + virtual bool GetStyle(long position, wxTextAttr& style); +#endif // wxUSE_RICHEDIT + + // translate between the position (which is just an index in the text ctrl + // considering all its contents as a single strings) and (x, y) coordinates + // which represent column and line. + virtual long XYToPosition(long x, long y) const; + virtual bool PositionToXY(long pos, long *x, long *y) const; + + virtual void ShowPosition(long pos); + virtual wxTextCtrlHitTestResult HitTest(const wxPoint& pt, long *pos) const; + virtual wxTextCtrlHitTestResult HitTest(const wxPoint& pt, + wxTextCoord *col, + wxTextCoord *row) const + { + return wxTextCtrlBase::HitTest(pt, col, row); + } + + // Clipboard operations + virtual void Copy(); + virtual void Cut(); + virtual void Paste(); + + virtual bool CanCopy() const; + virtual bool CanCut() const; + virtual bool CanPaste() const; + + // Undo/redo + virtual void Undo(); + virtual void Redo(); + + virtual bool CanUndo() const; + virtual bool CanRedo() const; + + // Insertion point + virtual void SetInsertionPoint(long pos); + virtual void SetInsertionPointEnd(); + virtual long GetInsertionPoint() const; + virtual wxTextPos GetLastPosition() const; + + virtual void SetSelection(long from, long to); + virtual void SetEditable(bool editable); + + // Caret handling (Windows only) + + bool ShowNativeCaret(bool show = true); + bool HideNativeCaret() { return ShowNativeCaret(false); } + + // Implementation from now on + // -------------------------- + + virtual void SetWindowStyleFlag(long style); + + virtual void Command(wxCommandEvent& event); + virtual bool MSWCommand(WXUINT param, WXWORD id); + virtual WXHBRUSH MSWControlColor(WXHDC hDC, WXHWND hWnd); + +#if wxUSE_RICHEDIT + virtual bool MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result); + + int GetRichVersion() const { return m_verRichEdit; } + bool IsRich() const { return m_verRichEdit != 0; } + + // rich edit controls are not compatible with normal ones and wem ust set + // the colours for them otherwise + virtual bool SetBackgroundColour(const wxColour& colour); + virtual bool SetForegroundColour(const wxColour& colour); +#else + bool IsRich() const { return false; } +#endif // wxUSE_RICHEDIT + +#if wxUSE_INKEDIT && wxUSE_RICHEDIT + bool IsInkEdit() const { return m_isInkEdit != 0; } +#else + bool IsInkEdit() const { return false; } +#endif + + virtual void AdoptAttributesFromHWND(); + + virtual bool AcceptsFocus() const; + + // callbacks + void OnDropFiles(wxDropFilesEvent& event); + void OnChar(wxKeyEvent& event); // Process 'enter' if required + + void OnCut(wxCommandEvent& event); + void OnCopy(wxCommandEvent& event); + void OnPaste(wxCommandEvent& event); + void OnUndo(wxCommandEvent& event); + void OnRedo(wxCommandEvent& event); + void OnDelete(wxCommandEvent& event); + void OnSelectAll(wxCommandEvent& event); + + void OnUpdateCut(wxUpdateUIEvent& event); + void OnUpdateCopy(wxUpdateUIEvent& event); + void OnUpdatePaste(wxUpdateUIEvent& event); + void OnUpdateUndo(wxUpdateUIEvent& event); + void OnUpdateRedo(wxUpdateUIEvent& event); + void OnUpdateDelete(wxUpdateUIEvent& event); + void OnUpdateSelectAll(wxUpdateUIEvent& event); + + // Show a context menu for Rich Edit controls (the standard + // EDIT control has one already) + void OnContextMenu(wxContextMenuEvent& event); + + // be sure the caret remains invisible if the user + // called HideNativeCaret() before + void OnSetFocus(wxFocusEvent& event); + + // intercept WM_GETDLGCODE + virtual WXLRESULT MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam); + + virtual bool MSWShouldPreProcessMessage(WXMSG* pMsg); + virtual WXDWORD MSWGetStyle(long style, WXDWORD *exstyle) const; + virtual wxVisualAttributes GetDefaultAttributes() const; + +protected: + // common part of all ctors + void Init(); + + // creates the control of appropriate class (plain or rich edit) with the + // styles corresponding to m_windowStyle + // + // this is used by ctor/Create() and when we need to recreate the control + // later + bool MSWCreateText(const wxString& value, + const wxPoint& pos, + const wxSize& size); + + virtual void DoSetValue(const wxString &value, int flags = 0); + + // return true if this control has a user-set limit on amount of text (i.e. + // the limit is due to a previous call to SetMaxLength() and not built in) + bool HasSpaceLimit(unsigned int *len) const; + + // call this to increase the size limit (will do nothing if the current + // limit is big enough) + // + // returns true if we increased the limit to allow entering more text, + // false if we hit the limit set by SetMaxLength() and so didn't change it + bool AdjustSpaceLimit(); + +#if wxUSE_RICHEDIT && (!wxUSE_UNICODE || wxUSE_UNICODE_MSLU) + // replace the selection or the entire control contents with the given text + // in the specified encoding + bool StreamIn(const wxString& value, wxFontEncoding encoding, bool selOnly); + + // get the contents of the control out as text in the given encoding + wxString StreamOut(wxFontEncoding encoding, bool selOnly = false) const; +#endif // wxUSE_RICHEDIT + + // replace the contents of the selection or of the entire control with the + // given text + void DoWriteText(const wxString& text, + int flags = SetValue_SendEvent | SetValue_SelectionOnly); + + // set the selection possibly without scrolling the caret into view + void DoSetSelection(long from, long to, bool scrollCaret = true); + + // return true if there is a non empty selection in the control + bool HasSelection() const; + + // get the length of the line containing the character at the given + // position + long GetLengthOfLineContainingPos(long pos) const; + + // send TEXT_UPDATED event, return true if it was handled, false otherwise + bool SendUpdateEvent(); + + virtual wxSize DoGetBestSize() const; + +#if wxUSE_RICHEDIT + // we're using RICHEDIT (and not simple EDIT) control if this field is not + // 0, it also gives the version of the RICHEDIT control being used (1, 2 or + // 3 so far) + int m_verRichEdit; +#endif // wxUSE_RICHEDIT + + // number of EN_UPDATE events sent by Windows when we change the controls + // text ourselves: we want this to be exactly 1 + int m_updatesCount; + +private: + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS_NO_COPY(wxTextCtrl) + + wxMenu* m_privateContextMenu; + + bool m_isNativeCaretShown; + +#if wxUSE_INKEDIT && wxUSE_RICHEDIT + int m_isInkEdit; +#endif + +}; + +#endif + // _WX_TEXTCTRL_H_ diff --git a/Externals/wxWidgets/include/wx/msw/tglbtn.h b/Externals/wxWidgets/include/wx/msw/tglbtn.h new file mode 100644 index 0000000000..ae45202c2d --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/tglbtn.h @@ -0,0 +1,60 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/tglbtn.h +// Purpose: Declaration of the wxToggleButton class, which implements a +// toggle button under wxMSW. +// Author: John Norris, minor changes by Axel Schlueter +// Modified by: +// Created: 08.02.01 +// RCS-ID: $Id: tglbtn.h 37393 2006-02-08 21:47:09Z VZ $ +// Copyright: (c) 2000 Johnny C. Norris II +// License: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_TOGGLEBUTTON_H_ +#define _WX_TOGGLEBUTTON_H_ + +extern WXDLLEXPORT_DATA(const wxChar) wxCheckBoxNameStr[]; + +// Checkbox item (single checkbox) +class WXDLLEXPORT wxToggleButton : public wxControl +{ +public: + wxToggleButton() {} + wxToggleButton(wxWindow *parent, + wxWindowID id, + const wxString& label, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxCheckBoxNameStr) + { + Create(parent, id, label, pos, size, style, validator, name); + } + + bool Create(wxWindow *parent, + wxWindowID id, + const wxString& label, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxCheckBoxNameStr); + + virtual void SetValue(bool value); + virtual bool GetValue() const ; + + virtual bool MSWCommand(WXUINT param, WXWORD id); + virtual void Command(wxCommandEvent& event); + virtual WXDWORD MSWGetStyle(long flags, WXDWORD *exstyle = NULL) const; + +protected: + virtual wxSize DoGetBestSize() const; + virtual wxBorder GetDefaultBorder() const; + +private: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxToggleButton) +}; + +#endif // _WX_TOGGLEBUTTON_H_ + diff --git a/Externals/wxWidgets/include/wx/msw/timer.h b/Externals/wxWidgets/include/wx/msw/timer.h new file mode 100644 index 0000000000..297293dc2f --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/timer.h @@ -0,0 +1,40 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: timer.h +// Purpose: wxTimer class +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: timer.h 41020 2006-09-05 20:47:48Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_TIMER_H_ +#define _WX_TIMER_H_ + +class WXDLLEXPORT wxTimer : public wxTimerBase +{ +friend void wxProcessTimer(wxTimer& timer); + +public: + wxTimer() { Init(); } + wxTimer(wxEvtHandler *owner, int id = wxID_ANY) : wxTimerBase(owner, id) + { Init(); } + virtual ~wxTimer(); + + virtual bool Start(int milliseconds = -1, bool oneShot = false); + virtual void Stop(); + + virtual bool IsRunning() const { return m_id != 0; } + +protected: + void Init(); + + unsigned long m_id; + +private: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxTimer) +}; + +#endif + // _WX_TIMERH_ diff --git a/Externals/wxWidgets/include/wx/msw/tooltip.h b/Externals/wxWidgets/include/wx/msw/tooltip.h new file mode 100644 index 0000000000..3e623a39a6 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/tooltip.h @@ -0,0 +1,71 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/tooltip.h +// Purpose: wxToolTip class - tooltip control +// Author: Vadim Zeitlin +// Modified by: +// Created: 31.01.99 +// RCS-ID: $Id: tooltip.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) 1999 Robert Roebling, Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MSW_TOOLTIP_H_ +#define _WX_MSW_TOOLTIP_H_ + +#include "wx/object.h" + +class WXDLLIMPEXP_FWD_CORE wxWindow; + +class WXDLLEXPORT wxToolTip : public wxObject +{ +public: + // ctor & dtor + wxToolTip(const wxString &tip); + virtual ~wxToolTip(); + + // accessors + // tip text + void SetTip(const wxString& tip); + const wxString& GetTip() const { return m_text; } + + // the window we're associated with + void SetWindow(wxWindow *win); + wxWindow *GetWindow() const { return m_window; } + + // controlling tooltip behaviour: globally change tooltip parameters + // enable or disable the tooltips globally + static void Enable(bool flag); + // set the delay after which the tooltip appears + static void SetDelay(long milliseconds); + + // implementation only from now on + // ------------------------------- + + // should be called in responde to WM_MOUSEMOVE + static void RelayEvent(WXMSG *msg); + + // add a window to the tooltip control + void Add(WXHWND hwnd); + + // remove any tooltip from the window + static void Remove(WXHWND hwnd); + +private: + // the one and only one tooltip control we use - never access it directly + // but use GetToolTipCtrl() which will create it when needed + static WXHWND ms_hwndTT; + + // create the tooltip ctrl if it doesn't exist yet and return its HWND + static WXHWND GetToolTipCtrl(); + + // remove this tooltip from the tooltip control + void Remove(); + + wxString m_text; // tooltip text + wxWindow *m_window; // window we're associated with + + DECLARE_ABSTRACT_CLASS(wxToolTip) + DECLARE_NO_COPY_CLASS(wxToolTip) +}; + +#endif // _WX_MSW_TOOLTIP_H_ diff --git a/Externals/wxWidgets/include/wx/msw/toplevel.h b/Externals/wxWidgets/include/wx/msw/toplevel.h new file mode 100644 index 0000000000..cd51a22aad --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/toplevel.h @@ -0,0 +1,192 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/toplevel.h +// Purpose: wxTopLevelWindowMSW is the MSW implementation of wxTLW +// Author: Vadim Zeitlin +// Modified by: +// Created: 20.09.01 +// RCS-ID: $Id: toplevel.h 42541 2006-10-27 20:05:47Z RR $ +// Copyright: (c) 2001 SciTech Software, Inc. (www.scitechsoft.com) +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MSW_TOPLEVEL_H_ +#define _WX_MSW_TOPLEVEL_H_ + +// ---------------------------------------------------------------------------- +// wxTopLevelWindowMSW +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxTopLevelWindowMSW : public wxTopLevelWindowBase +{ +public: + // constructors and such + wxTopLevelWindowMSW() { Init(); } + + wxTopLevelWindowMSW(wxWindow *parent, + wxWindowID id, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDEFAULT_FRAME_STYLE, + const wxString& name = wxFrameNameStr) + { + Init(); + + (void)Create(parent, id, title, pos, size, style, name); + } + + bool Create(wxWindow *parent, + wxWindowID id, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDEFAULT_FRAME_STYLE, + const wxString& name = wxFrameNameStr); + + virtual ~wxTopLevelWindowMSW(); + + // implement base class pure virtuals + virtual void SetTitle( const wxString& title); + virtual wxString GetTitle() const; + virtual void Maximize(bool maximize = true); + virtual bool IsMaximized() const; + virtual void Iconize(bool iconize = true); + virtual bool IsIconized() const; + virtual void SetIcon(const wxIcon& icon); + virtual void SetIcons(const wxIconBundle& icons ); + virtual void Restore(); + + virtual void SetLayoutDirection(wxLayoutDirection dir); + +#ifndef __WXWINCE__ + virtual bool SetShape(const wxRegion& region); +#endif // __WXWINCE__ + virtual void RequestUserAttention(int flags = wxUSER_ATTENTION_INFO); + + virtual bool Show(bool show = true); + + virtual bool ShowFullScreen(bool show, long style = wxFULLSCREEN_ALL); + virtual bool IsFullScreen() const { return m_fsIsShowing; } + + // wxMSW only: EnableCloseButton(false) may be used to remove the "Close" + // button from the title bar + virtual bool EnableCloseButton(bool enable = true); + + // Set window transparency if the platform supports it + virtual bool SetTransparent(wxByte alpha); + virtual bool CanSetTransparent(); + + + // implementation from now on + // -------------------------- + + // event handlers + void OnActivate(wxActivateEvent& event); + + // called by wxWindow whenever it gets focus + void SetLastFocus(wxWindow *win) { m_winLastFocused = win; } + wxWindow *GetLastFocus() const { return m_winLastFocused; } + +#if defined(__SMARTPHONE__) && defined(__WXWINCE__) + virtual void SetLeftMenu(int id = wxID_ANY, const wxString& label = wxEmptyString, wxMenu *subMenu = NULL); + virtual void SetRightMenu(int id = wxID_ANY, const wxString& label = wxEmptyString, wxMenu *subMenu = NULL); + bool HandleCommand(WXWORD id, WXWORD cmd, WXHWND control); + virtual bool MSWShouldPreProcessMessage(WXMSG* pMsg); +#endif // __SMARTPHONE__ && __WXWINCE__ + +#if defined(__SMARTPHONE__) || defined(__POCKETPC__) + // Soft Input Panel (SIP) change notification + virtual bool HandleSettingChange(WXWPARAM wParam, WXLPARAM lParam); +#endif + + // translate wxWidgets flags to Windows ones + virtual WXDWORD MSWGetStyle(long flags, WXDWORD *exstyle) const; + + // choose the right parent to use with CreateWindow() + virtual WXHWND MSWGetParent() const; + + // window proc for the frames + WXLRESULT MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam); + +protected: + // common part of all ctors + void Init(); + + // create a new frame, return false if it couldn't be created + bool CreateFrame(const wxString& title, + const wxPoint& pos, + const wxSize& size); + + // create a new dialog using the given dialog template from resources, + // return false if it couldn't be created + bool CreateDialog(const void *dlgTemplate, + const wxString& title, + const wxPoint& pos, + const wxSize& size); + + // common part of Iconize(), Maximize() and Restore() + void DoShowWindow(int nShowCmd); + + // is the window currently iconized? + bool m_iconized; + + // should the frame be maximized when it will be shown? set by Maximize() + // when it is called while the frame is hidden + bool m_maximizeOnShow; + + // Data to save/restore when calling ShowFullScreen + long m_fsStyle; // Passed to ShowFullScreen + wxRect m_fsOldSize; + long m_fsOldWindowStyle; + bool m_fsIsMaximized; + bool m_fsIsShowing; + + // the last focused child: we restore focus to it on activation + wxWindow *m_winLastFocused; + +#if defined(__SMARTPHONE__) && defined(__WXWINCE__) + class ButtonMenu + { + public: + ButtonMenu(); + ~ButtonMenu(); + + void SetButton(int id = wxID_ANY, + const wxString& label = wxEmptyString, + wxMenu *subMenu = NULL); + + bool IsAssigned() const {return m_assigned;} + bool IsMenu() const {return m_menu!=NULL;} + + int GetId() const {return m_id;} + wxMenu* GetMenu() const {return m_menu;} + wxString GetLabel() {return m_label;} + + static wxMenu *DuplicateMenu(wxMenu *menu); + + protected: + int m_id; + wxString m_label; + wxMenu *m_menu; + bool m_assigned; + }; + + ButtonMenu m_LeftButton; + ButtonMenu m_RightButton; + HWND m_MenuBarHWND; + + void ReloadButton(ButtonMenu& button, UINT menuID); + void ReloadAllButtons(); +#endif // __SMARTPHONE__ && __WXWINCE__ + +private: + +#if defined(__SMARTPHONE__) || defined(__POCKETPC__) + void* m_activateInfo; +#endif + + DECLARE_EVENT_TABLE() + DECLARE_NO_COPY_CLASS(wxTopLevelWindowMSW) +}; + +#endif // _WX_MSW_TOPLEVEL_H_ diff --git a/Externals/wxWidgets/include/wx/msw/treectrl.h b/Externals/wxWidgets/include/wx/msw/treectrl.h new file mode 100644 index 0000000000..d3a6a2e35b --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/treectrl.h @@ -0,0 +1,315 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/treectrl.h +// Purpose: wxTreeCtrl class +// Author: Julian Smart +// Modified by: Vadim Zeitlin to be less MSW-specific on 10/10/98 +// Created: 01/02/97 +// RCS-ID: $Id: treectrl.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MSW_TREECTRL_H_ +#define _WX_MSW_TREECTRL_H_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#if wxUSE_TREECTRL + +#include "wx/textctrl.h" +#include "wx/dynarray.h" +#include "wx/treebase.h" +#include "wx/hashmap.h" + +#ifdef __GNUWIN32__ + // Cygwin windows.h defines these identifiers + #undef GetFirstChild + #undef GetNextSibling +#endif // Cygwin + +// fwd decl +class WXDLLIMPEXP_FWD_CORE wxImageList; +class WXDLLIMPEXP_FWD_CORE wxDragImage; +struct WXDLLIMPEXP_FWD_CORE wxTreeViewItem; + +#if WXWIN_COMPATIBILITY_2_6 + // NB: all the following flags are for compatbility only and will be removed in the + // next versions + // flags for deprecated InsertItem() variant (their values are the same as of + // TVI_FIRST and TVI_LAST) + #define wxTREE_INSERT_FIRST 0xFFFF0001 + #define wxTREE_INSERT_LAST 0xFFFF0002 +#endif + +// hash storing attributes for our items +WX_DECLARE_EXPORTED_VOIDPTR_HASH_MAP(wxTreeItemAttr *, wxMapTreeAttr); + +// ---------------------------------------------------------------------------- +// wxTreeCtrl +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxTreeCtrl : public wxTreeCtrlBase +{ +public: + // creation + // -------- + wxTreeCtrl() { Init(); } + + wxTreeCtrl(wxWindow *parent, wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxTR_HAS_BUTTONS | wxTR_LINES_AT_ROOT, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxTreeCtrlNameStr) + { + Create(parent, id, pos, size, style, validator, name); + } + + virtual ~wxTreeCtrl(); + + bool Create(wxWindow *parent, wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxTR_HAS_BUTTONS | wxTR_LINES_AT_ROOT, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxTreeCtrlNameStr); + + // implement base class pure virtuals + // ---------------------------------- + + virtual unsigned int GetCount() const; + + virtual unsigned int GetIndent() const; + virtual void SetIndent(unsigned int indent); + + virtual void SetImageList(wxImageList *imageList); + virtual void SetStateImageList(wxImageList *imageList); + + virtual wxString GetItemText(const wxTreeItemId& item) const; + virtual int GetItemImage(const wxTreeItemId& item, + wxTreeItemIcon which = wxTreeItemIcon_Normal) const; + virtual wxTreeItemData *GetItemData(const wxTreeItemId& item) const; + virtual wxColour GetItemTextColour(const wxTreeItemId& item) const; + virtual wxColour GetItemBackgroundColour(const wxTreeItemId& item) const; + virtual wxFont GetItemFont(const wxTreeItemId& item) const; + + virtual void SetItemText(const wxTreeItemId& item, const wxString& text); + virtual void SetItemImage(const wxTreeItemId& item, int image, + wxTreeItemIcon which = wxTreeItemIcon_Normal); + virtual void SetItemData(const wxTreeItemId& item, wxTreeItemData *data); + virtual void SetItemHasChildren(const wxTreeItemId& item, bool has = true); + virtual void SetItemBold(const wxTreeItemId& item, bool bold = true); + virtual void SetItemDropHighlight(const wxTreeItemId& item, + bool highlight = true); + virtual void SetItemTextColour(const wxTreeItemId& item, + const wxColour& col); + virtual void SetItemBackgroundColour(const wxTreeItemId& item, + const wxColour& col); + virtual void SetItemFont(const wxTreeItemId& item, const wxFont& font); + + // item status inquiries + // --------------------- + + virtual bool IsVisible(const wxTreeItemId& item) const; + virtual bool ItemHasChildren(const wxTreeItemId& item) const; + virtual bool IsExpanded(const wxTreeItemId& item) const; + virtual bool IsSelected(const wxTreeItemId& item) const; + virtual bool IsBold(const wxTreeItemId& item) const; + + virtual size_t GetChildrenCount(const wxTreeItemId& item, + bool recursively = true) const; + + // navigation + // ---------- + + virtual wxTreeItemId GetRootItem() const; + virtual wxTreeItemId GetSelection() const; + virtual size_t GetSelections(wxArrayTreeItemIds& selections) const; + + virtual wxTreeItemId GetItemParent(const wxTreeItemId& item) const; + virtual wxTreeItemId GetFirstChild(const wxTreeItemId& item, + wxTreeItemIdValue& cookie) const; + virtual wxTreeItemId GetNextChild(const wxTreeItemId& item, + wxTreeItemIdValue& cookie) const; + virtual wxTreeItemId GetLastChild(const wxTreeItemId& item) const; + + virtual wxTreeItemId GetNextSibling(const wxTreeItemId& item) const; + virtual wxTreeItemId GetPrevSibling(const wxTreeItemId& item) const; + + virtual wxTreeItemId GetFirstVisibleItem() const; + virtual wxTreeItemId GetNextVisible(const wxTreeItemId& item) const; + virtual wxTreeItemId GetPrevVisible(const wxTreeItemId& item) const; + + // operations + // ---------- + + virtual wxTreeItemId AddRoot(const wxString& text, + int image = -1, int selectedImage = -1, + wxTreeItemData *data = NULL); + + virtual void Delete(const wxTreeItemId& item); + virtual void DeleteChildren(const wxTreeItemId& item); + virtual void DeleteAllItems(); + + virtual void Expand(const wxTreeItemId& item); + virtual void Collapse(const wxTreeItemId& item); + virtual void CollapseAndReset(const wxTreeItemId& item); + virtual void Toggle(const wxTreeItemId& item); + + virtual void Unselect(); + virtual void UnselectAll(); + virtual void SelectItem(const wxTreeItemId& item, bool select = true); + + virtual void EnsureVisible(const wxTreeItemId& item); + virtual void ScrollTo(const wxTreeItemId& item); + + virtual wxTextCtrl *EditLabel(const wxTreeItemId& item, + wxClassInfo* textCtrlClass = CLASSINFO(wxTextCtrl)); + virtual wxTextCtrl *GetEditControl() const; + virtual void EndEditLabel(const wxTreeItemId& WXUNUSED(item), + bool discardChanges = false) + { + DoEndEditLabel(discardChanges); + } + + virtual void SortChildren(const wxTreeItemId& item); + + virtual bool GetBoundingRect(const wxTreeItemId& item, + wxRect& rect, + bool textOnly = false) const; + + // deprecated + // ---------- + +#if WXWIN_COMPATIBILITY_2_4 + // these methods are deprecated and will be removed in future versions of + // wxWidgets, they're here for compatibility only, don't use them in new + // code (the comments indicate why these methods are now useless and how to + // replace them) + + // use Expand, Collapse, CollapseAndReset or Toggle + wxDEPRECATED( void ExpandItem(const wxTreeItemId& item, int action) ); + + // use Set/GetImageList and Set/GetStateImageList + // Use base class GetImageList() + wxDEPRECATED( void SetImageList(wxImageList *imageList, int) ); + + // use Set/GetItemImage directly + wxDEPRECATED( int GetItemSelectedImage(const wxTreeItemId& item) const ); + wxDEPRECATED( void SetItemSelectedImage(const wxTreeItemId& item, int image) ); + + // use the versions taking wxTreeItemIdValue cookies + wxDEPRECATED( wxTreeItemId GetFirstChild(const wxTreeItemId& item, + long& cookie) const ); + wxDEPRECATED( wxTreeItemId GetNextChild(const wxTreeItemId& item, + long& cookie) const ); +#endif // WXWIN_COMPATIBILITY_2_4 + + + // implementation + // -------------- + + virtual wxVisualAttributes GetDefaultAttributes() const + { + return GetClassDefaultAttributes(GetWindowVariant()); + } + + static wxVisualAttributes + GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL); + + + virtual WXLRESULT MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam); + virtual WXLRESULT MSWDefWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam); + virtual bool MSWCommand(WXUINT param, WXWORD id); + virtual bool MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result); + virtual bool MSWShouldPreProcessMessage(WXMSG* msg); + + // override some base class virtuals + virtual bool SetBackgroundColour(const wxColour &colour); + virtual bool SetForegroundColour(const wxColour &colour); + + // get/set the check state for the item (only for wxTR_MULTIPLE) + bool IsItemChecked(const wxTreeItemId& item) const; + void SetItemCheck(const wxTreeItemId& item, bool check = true); + + // set/get the item state.image (state == -1 means cycle to the next one) + void SetState(const wxTreeItemId& node, int state); + int GetState(const wxTreeItemId& node); + +protected: + // SetImageList helper + void SetAnyImageList(wxImageList *imageList, int which); + + // refresh a single item + void RefreshItem(const wxTreeItemId& item); + + // end edit label + void DoEndEditLabel(bool discardChanges = false); + + virtual wxTreeItemId DoInsertItem(const wxTreeItemId& parent, + size_t pos, + const wxString& text, + int image, int selectedImage, + wxTreeItemData *data); + virtual wxTreeItemId DoInsertAfter(const wxTreeItemId& parent, + const wxTreeItemId& idPrevious, + const wxString& text, + int image = -1, int selImage = -1, + wxTreeItemData *data = NULL); + virtual wxTreeItemId DoTreeHitTest(const wxPoint& point, int& flags) const; + + // obtain the user data for the lParam member of TV_ITEM + class wxTreeItemParam *GetItemParam(const wxTreeItemId& item) const; + + + // data used only while editing the item label: + wxTextCtrl *m_textCtrl; // text control in which it is edited + wxTreeItemId m_idEdited; // the item being edited + +private: + // the common part of all ctors + void Init(); + + // helper functions + bool DoGetItem(wxTreeViewItem *tvItem) const; + void DoSetItem(wxTreeViewItem *tvItem); + + void DoExpand(const wxTreeItemId& item, int flag); + + void DeleteTextCtrl(); + + // return true if the item is the hidden root one (i.e. it's the root item + // and the tree has wxTR_HIDE_ROOT style) + bool IsHiddenRoot(const wxTreeItemId& item) const; + + + // the hash storing the items attributes (indexed by item ids) + wxMapTreeAttr m_attrs; + + // true if the hash above is not empty + bool m_hasAnyAttr; + +#if wxUSE_DRAGIMAGE + // used for dragging + wxDragImage *m_dragImage; +#endif + + // Virtual root item, if wxTR_HIDE_ROOT is set. + void* m_pVirtualRoot; + + // the starting item for selection with Shift + wxTreeItemId m_htSelStart, m_htClickedItem; + wxPoint m_ptClick; + + friend class wxTreeItemIndirectData; + friend class wxTreeSortHelper; + + DECLARE_DYNAMIC_CLASS(wxTreeCtrl) + DECLARE_NO_COPY_CLASS(wxTreeCtrl) +}; + +#endif // wxUSE_TREECTRL + +#endif // _WX_MSW_TREECTRL_H_ diff --git a/Externals/wxWidgets/include/wx/msw/uxtheme.h b/Externals/wxWidgets/include/wx/msw/uxtheme.h new file mode 100644 index 0000000000..23e745fc9e --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/uxtheme.h @@ -0,0 +1,230 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: include/wx/msw/uxtheme.h +// Purpose: wxUxThemeEngine class: support for XP themes +// Author: John Platts, Vadim Zeitlin +// Modified by: +// Created: 2003 +// RCS-ID: $Id: uxtheme.h 42725 2006-10-30 15:37:42Z VZ $ +// Copyright: (c) 2003 John Platts, Vadim Zeitlin +// License: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UXTHEME_H_ +#define _WX_UXTHEME_H_ + +#include "wx/defs.h" + +#include "wx/msw/private.h" // we use GetHwndOf() +#include "wx/msw/uxthemep.h" + +typedef HTHEME (__stdcall *PFNWXUOPENTHEMEDATA)(HWND, const wchar_t *); +typedef HRESULT (__stdcall *PFNWXUCLOSETHEMEDATA)(HTHEME); +typedef HRESULT (__stdcall *PFNWXUDRAWTHEMEBACKGROUND)(HTHEME, HDC, int, int, const RECT *, const RECT *); +typedef HRESULT (__stdcall *PFNWXUDRAWTHEMETEXT)(HTHEME, HDC, int, int, const wchar_t *, int, DWORD, DWORD, const RECT *); +typedef HRESULT (__stdcall *PFNWXUGETTHEMEBACKGROUNDCONTENTRECT)(HTHEME, HDC, int, int, const RECT *, RECT *); +typedef HRESULT (__stdcall *PFNWXUGETTHEMEBACKGROUNDEXTENT)(HTHEME, HDC, int, int, const RECT *, RECT *); +typedef HRESULT (__stdcall *PFNWXUGETTHEMEPARTSIZE)(HTHEME, HDC, int, int, const RECT *, /* enum */ THEMESIZE, SIZE *); +typedef HRESULT (__stdcall *PFNWXUGETTHEMETEXTEXTENT)(HTHEME, HDC, int, int, const wchar_t *, int, DWORD, const RECT *, RECT *); +typedef HRESULT (__stdcall *PFNWXUGETTHEMETEXTMETRICS)(HTHEME, HDC, int, int, TEXTMETRIC*); +typedef HRESULT (__stdcall *PFNWXUGETTHEMEBACKGROUNDREGION)(HTHEME, HDC, int, int, const RECT *, HRGN *); +typedef HRESULT (__stdcall *PFNWXUHITTESTTHEMEBACKGROUND)(HTHEME, HDC, int, int, DWORD, const RECT *, HRGN, POINT, unsigned short *); +typedef HRESULT (__stdcall *PFNWXUDRAWTHEMEEDGE)(HTHEME, HDC, int, int, const RECT *, unsigned int, unsigned int, RECT *); +typedef HRESULT (__stdcall *PFNWXUDRAWTHEMEICON)(HTHEME, HDC, int, int, const RECT *, HIMAGELIST, int); +typedef BOOL (__stdcall *PFNWXUISTHEMEPARTDEFINED)(HTHEME, int, int); +typedef BOOL (__stdcall *PFNWXUISTHEMEBACKGROUNDPARTIALLYTRANSPARENT)(HTHEME, int, int); +typedef HRESULT (__stdcall *PFNWXUGETTHEMECOLOR)(HTHEME, int, int, int, COLORREF*); +typedef HRESULT (__stdcall *PFNWXUGETTHEMEMETRIC)(HTHEME, HDC, int, int, int, int *); +typedef HRESULT (__stdcall *PFNWXUGETTHEMESTRING)(HTHEME, int, int, int, wchar_t *, int); +typedef HRESULT (__stdcall *PFNWXUGETTHEMEBOOL)(HTHEME, int, int, int, BOOL *); +typedef HRESULT (__stdcall *PFNWXUGETTHEMEINT)(HTHEME, int, int, int, int *); +typedef HRESULT (__stdcall *PFNWXUGETTHEMEENUMVALUE)(HTHEME, int, int, int, int *); +typedef HRESULT (__stdcall *PFNWXUGETTHEMEPOSITION)(HTHEME, int, int, int, POINT *); +typedef HRESULT (__stdcall *PFNWXUGETTHEMEFONT)(HTHEME, HDC, int, int, int, LOGFONT *); +typedef HRESULT (__stdcall *PFNWXUGETTHEMERECT)(HTHEME, int, int, int, RECT *); +typedef HRESULT (__stdcall *PFNWXUGETTHEMEMARGINS)(HTHEME, HDC, int, int, int, RECT *, MARGINS *); +typedef HRESULT (__stdcall *PFNWXUGETTHEMEINTLIST)(HTHEME, int, int, int, INTLIST*); +typedef HRESULT (__stdcall *PFNWXUGETTHEMEPROPERTYORIGIN)(HTHEME, int, int, int, /* enum */ PROPERTYORIGIN *); +typedef HRESULT (__stdcall *PFNWXUSETWINDOWTHEME)(HWND, const wchar_t*, const wchar_t *); +typedef HRESULT (__stdcall *PFNWXUGETTHEMEFILENAME)(HTHEME, int, int, int, wchar_t *, int); +typedef COLORREF(__stdcall *PFNWXUGETTHEMESYSCOLOR)(HTHEME, int); +typedef HBRUSH (__stdcall *PFNWXUGETTHEMESYSCOLORBRUSH)(HTHEME, int); +typedef BOOL (__stdcall *PFNWXUGETTHEMESYSBOOL)(HTHEME, int); +typedef int (__stdcall *PFNWXUGETTHEMESYSSIZE)(HTHEME, int); +typedef HRESULT (__stdcall *PFNWXUGETTHEMESYSFONT)(HTHEME, int, LOGFONT *); +typedef HRESULT (__stdcall *PFNWXUGETTHEMESYSSTRING)(HTHEME, int, wchar_t *, int); +typedef HRESULT (__stdcall *PFNWXUGETTHEMESYSINT)(HTHEME, int, int *); +typedef BOOL (__stdcall *PFNWXUISTHEMEACTIVE)(); +typedef BOOL (__stdcall *PFNWXUISAPPTHEMED)(); +typedef HTHEME (__stdcall *PFNWXUGETWINDOWTHEME)(HWND); +typedef HRESULT (__stdcall *PFNWXUENABLETHEMEDIALOGTEXTURE)(HWND, DWORD); +typedef BOOL (__stdcall *PFNWXUISTHEMEDIALOGTEXTUREENABLED)(HWND); +typedef DWORD (__stdcall *PFNWXUGETTHEMEAPPPROPERTIES)(); +typedef void (__stdcall *PFNWXUSETTHEMEAPPPROPERTIES)(DWORD); +typedef HRESULT (__stdcall *PFNWXUGETCURRENTTHEMENAME)(wchar_t *, int, wchar_t *, int, wchar_t *, int); +typedef HRESULT (__stdcall *PFNWXUGETTHEMEDOCUMENTATIONPROPERTY)(const wchar_t *, const wchar_t *, wchar_t *, int); +typedef HRESULT (__stdcall *PFNWXUDRAWTHEMEPARENTBACKGROUND)(HWND, HDC, RECT *); +typedef HRESULT (__stdcall *PFNWXUENABLETHEMING)(BOOL); + +// ---------------------------------------------------------------------------- +// wxUxThemeEngine: provides all theme functions from uxtheme.dll +// ---------------------------------------------------------------------------- + +// we always define this class, even if wxUSE_UXTHEME == 0, but we just make it +// empty in this case -- this allows to use it elsewhere without any #ifdefs +#if wxUSE_UXTHEME + #include "wx/dynlib.h" + + #define wxUX_THEME_DECLARE(type, func) type func; +#else + #define wxUX_THEME_DECLARE(type, func) type func(...) { return 0; } +#endif + +class WXDLLEXPORT wxUxThemeEngine +{ +public: + // get the theme engine or NULL if themes are not available + static wxUxThemeEngine *Get(); + + // get the theme enging or NULL if themes are not available or not used for + // this application + static wxUxThemeEngine *GetIfActive(); + + // all uxtheme.dll functions + wxUX_THEME_DECLARE(PFNWXUOPENTHEMEDATA, OpenThemeData) + wxUX_THEME_DECLARE(PFNWXUCLOSETHEMEDATA, CloseThemeData) + wxUX_THEME_DECLARE(PFNWXUDRAWTHEMEBACKGROUND, DrawThemeBackground) + wxUX_THEME_DECLARE(PFNWXUDRAWTHEMETEXT, DrawThemeText) + wxUX_THEME_DECLARE(PFNWXUGETTHEMEBACKGROUNDCONTENTRECT, GetThemeBackgroundContentRect) + wxUX_THEME_DECLARE(PFNWXUGETTHEMEBACKGROUNDEXTENT, GetThemeBackgroundExtent) + wxUX_THEME_DECLARE(PFNWXUGETTHEMEPARTSIZE, GetThemePartSize) + wxUX_THEME_DECLARE(PFNWXUGETTHEMETEXTEXTENT, GetThemeTextExtent) + wxUX_THEME_DECLARE(PFNWXUGETTHEMETEXTMETRICS, GetThemeTextMetrics) + wxUX_THEME_DECLARE(PFNWXUGETTHEMEBACKGROUNDREGION, GetThemeBackgroundRegion) + wxUX_THEME_DECLARE(PFNWXUHITTESTTHEMEBACKGROUND, HitTestThemeBackground) + wxUX_THEME_DECLARE(PFNWXUDRAWTHEMEEDGE, DrawThemeEdge) + wxUX_THEME_DECLARE(PFNWXUDRAWTHEMEICON, DrawThemeIcon) + wxUX_THEME_DECLARE(PFNWXUISTHEMEPARTDEFINED, IsThemePartDefined) + wxUX_THEME_DECLARE(PFNWXUISTHEMEBACKGROUNDPARTIALLYTRANSPARENT, IsThemeBackgroundPartiallyTransparent) + wxUX_THEME_DECLARE(PFNWXUGETTHEMECOLOR, GetThemeColor) + wxUX_THEME_DECLARE(PFNWXUGETTHEMEMETRIC, GetThemeMetric) + wxUX_THEME_DECLARE(PFNWXUGETTHEMESTRING, GetThemeString) + wxUX_THEME_DECLARE(PFNWXUGETTHEMEBOOL, GetThemeBool) + wxUX_THEME_DECLARE(PFNWXUGETTHEMEINT, GetThemeInt) + wxUX_THEME_DECLARE(PFNWXUGETTHEMEENUMVALUE, GetThemeEnumValue) + wxUX_THEME_DECLARE(PFNWXUGETTHEMEPOSITION, GetThemePosition) + wxUX_THEME_DECLARE(PFNWXUGETTHEMEFONT, GetThemeFont) + wxUX_THEME_DECLARE(PFNWXUGETTHEMERECT, GetThemeRect) + wxUX_THEME_DECLARE(PFNWXUGETTHEMEMARGINS, GetThemeMargins) + wxUX_THEME_DECLARE(PFNWXUGETTHEMEINTLIST, GetThemeIntList) + wxUX_THEME_DECLARE(PFNWXUGETTHEMEPROPERTYORIGIN, GetThemePropertyOrigin) + wxUX_THEME_DECLARE(PFNWXUSETWINDOWTHEME, SetWindowTheme) + wxUX_THEME_DECLARE(PFNWXUGETTHEMEFILENAME, GetThemeFilename) + wxUX_THEME_DECLARE(PFNWXUGETTHEMESYSCOLOR, GetThemeSysColor) + wxUX_THEME_DECLARE(PFNWXUGETTHEMESYSCOLORBRUSH, GetThemeSysColorBrush) + wxUX_THEME_DECLARE(PFNWXUGETTHEMESYSBOOL, GetThemeSysBool) + wxUX_THEME_DECLARE(PFNWXUGETTHEMESYSSIZE, GetThemeSysSize) + wxUX_THEME_DECLARE(PFNWXUGETTHEMESYSFONT, GetThemeSysFont) + wxUX_THEME_DECLARE(PFNWXUGETTHEMESYSSTRING, GetThemeSysString) + wxUX_THEME_DECLARE(PFNWXUGETTHEMESYSINT, GetThemeSysInt) + wxUX_THEME_DECLARE(PFNWXUISTHEMEACTIVE, IsThemeActive) + wxUX_THEME_DECLARE(PFNWXUISAPPTHEMED, IsAppThemed) + wxUX_THEME_DECLARE(PFNWXUGETWINDOWTHEME, GetWindowTheme) + wxUX_THEME_DECLARE(PFNWXUENABLETHEMEDIALOGTEXTURE, EnableThemeDialogTexture) + wxUX_THEME_DECLARE(PFNWXUISTHEMEDIALOGTEXTUREENABLED, IsThemeDialogTextureEnabled) + wxUX_THEME_DECLARE(PFNWXUGETTHEMEAPPPROPERTIES, GetThemeAppProperties) + wxUX_THEME_DECLARE(PFNWXUSETTHEMEAPPPROPERTIES, SetThemeAppProperties) + wxUX_THEME_DECLARE(PFNWXUGETCURRENTTHEMENAME, GetCurrentThemeName) + wxUX_THEME_DECLARE(PFNWXUGETTHEMEDOCUMENTATIONPROPERTY, GetThemeDocumentationProperty) + wxUX_THEME_DECLARE(PFNWXUDRAWTHEMEPARENTBACKGROUND, DrawThemeParentBackground) + wxUX_THEME_DECLARE(PFNWXUENABLETHEMING, EnableTheming) + +private: + // construcor is private as only Get() can create us and is also trivial as + // everything really happens in Initialize() + wxUxThemeEngine() { } + + // destructor is private as only Get() and wxUxThemeModule delete us, it is + // not virtual as we're not supposed to be derived from + ~wxUxThemeEngine() { } + +#if wxUSE_UXTHEME + // initialize the theme engine: load the DLL, resolve the functions + // + // return true if we can be used, false if themes are not available + bool Initialize(); + + + // uxtheme.dll + wxDynamicLibrary m_dllUxTheme; + + + // the one and only theme engine, initially NULL + static wxUxThemeEngine *ms_themeEngine; + + // this is a bool which initially has the value -1 meaning "unknown" + static int ms_isThemeEngineAvailable; + + // it must be able to delete us + friend class wxUxThemeModule; +#endif // wxUSE_UXTHEME + + DECLARE_NO_COPY_CLASS(wxUxThemeEngine) +}; + +#if wxUSE_UXTHEME + +/* static */ inline wxUxThemeEngine *wxUxThemeEngine::GetIfActive() +{ + wxUxThemeEngine *engine = Get(); + return engine && engine->IsAppThemed() && engine->IsThemeActive() + ? engine + : NULL; +} + +#else // !wxUSE_UXTHEME + +/* static */ inline wxUxThemeEngine *wxUxThemeEngine::Get() +{ + return NULL; +} + +/* static */ inline wxUxThemeEngine *wxUxThemeEngine::GetIfActive() +{ + return NULL; +} + +#endif // wxUSE_UXTHEME/!wxUSE_UXTHEME + +// ---------------------------------------------------------------------------- +// wxUxThemeHandle: encapsulates ::Open/CloseThemeData() +// ---------------------------------------------------------------------------- + +class wxUxThemeHandle +{ +public: + wxUxThemeHandle(const wxWindow *win, const wchar_t *classes) + { + wxUxThemeEngine *engine = wxUxThemeEngine::Get(); + + m_hTheme = engine ? (HTHEME)engine->OpenThemeData(GetHwndOf(win), classes) + : NULL; + } + + operator HTHEME() const { return m_hTheme; } + + ~wxUxThemeHandle() + { + if ( m_hTheme ) + { + wxUxThemeEngine::Get()->CloseThemeData(m_hTheme); + } + } + +private: + HTHEME m_hTheme; + + DECLARE_NO_COPY_CLASS(wxUxThemeHandle) +}; + +#endif // _WX_UXTHEME_H_ + diff --git a/Externals/wxWidgets/include/wx/msw/uxthemep.h b/Externals/wxWidgets/include/wx/msw/uxthemep.h new file mode 100644 index 0000000000..bc2fda91d4 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/uxthemep.h @@ -0,0 +1,169 @@ +/* + * Win32 5.1 theme definitions + * + * Copyright (C) 2003 Kevin Koltzau + * + * Originally written for the Wine project, and issued under + * the wxWindows License by kind permission of the author. + * + * License: wxWindows License + */ + +#ifndef __WINE_UXTHEME_H +#define __WINE_UXTHEME_H + +#include "wx/msw/wrapcctl.h" + +typedef HANDLE HTHEME; + +HRESULT WINAPI CloseThemeData(HTHEME hTheme); +HRESULT WINAPI DrawThemeBackground(HTHEME,HDC,int,int,const RECT*,const RECT*); + +#define DTBG_CLIPRECT 0x00000001 +#define DTBG_DRAWSOLID 0x00000002 +#define DTBG_OMITBORDER 0x00000004 +#define DTBG_OMITCONTENT 0x00000008 +#define DTBG_COMPUTINGREGION 0x00000010 +#define DTBG_MIRRORDC 0x00000020 + +typedef struct _DTBGOPTS { + DWORD dwSize; + DWORD dwFlags; + RECT rcClip; +} DTBGOPTS, *PDTBGOPTS; + +HRESULT WINAPI DrawThemeBackgroundEx(HTHEME,HDC,int,int,const RECT*, + const DTBGOPTS*); +HRESULT WINAPI DrawThemeEdge(HTHEME,HDC,int,int,const RECT*,UINT,UINT, + RECT*); +HRESULT WINAPI DrawThemeIcon(HTHEME,HDC,int,int,const RECT*,HIMAGELIST,int); +HRESULT WINAPI DrawThemeParentBackground(HWND,HDC,RECT*); + +#define DTT_GRAYED 0x1 + +HRESULT WINAPI DrawThemeText(HTHEME,HDC,int,int,LPCWSTR,int,DWORD,DWORD, + const RECT*); + +#define ETDT_DISABLE 0x00000001 +#define ETDT_ENABLE 0x00000002 +#define ETDT_USETABTEXTURE 0x00000004 +#define ETDT_ENABLETAB (ETDT_ENABLE|ETDT_USETABTEXTURE) + +HRESULT WINAPI EnableThemeDialogTexture(HWND,DWORD); +HRESULT WINAPI EnableTheming(BOOL); +HRESULT WINAPI GetCurrentThemeName(LPWSTR,int,LPWSTR,int,LPWSTR,int); + +#define STAP_ALLOW_NONCLIENT (1<<0) +#define STAP_ALLOW_CONTROLS (1<<1) +#define STAP_ALLOW_WEBCONTENT (1<<2) + +DWORD WINAPI GetThemeAppProperties(void); +HRESULT WINAPI GetThemeBackgroundContentRect(HTHEME,HDC,int,int, + const RECT*,RECT*); +HRESULT WINAPI GetThemeBackgroundExtent(HTHEME,HDC,int,int,const RECT*,RECT*); +HRESULT WINAPI GetThemeBackgroundRegion(HTHEME,HDC,int,int,const RECT*,HRGN*); +HRESULT WINAPI GetThemeBool(HTHEME,int,int,int,BOOL*); +HRESULT WINAPI GetThemeColor(HTHEME,int,int,int,COLORREF*); + +#if defined(__GNUC__) +# define SZ_THDOCPROP_DISPLAYNAME (const WCHAR []){ 'D','i','s','p','l','a','y','N','a','m','e',0 } +# define SZ_THDOCPROP_CANONICALNAME (const WCHAR []){ 'T','h','e','m','e','N','a','m','e',0 } +# define SZ_THDOCPROP_TOOLTIP (const WCHAR []){ 'T','o','o','l','T','i','p',0 } +# define SZ_THDOCPROP_AUTHOR (const WCHAR []){ 'a','u','t','h','o','r',0 } +#else /* lif defined(_MSC_VER) */ +# define SZ_THDOCPROP_DISPLAYNAME L"DisplayName" +# define SZ_THDOCPROP_CANONICALNAME L"ThemeName" +# define SZ_THDOCPROP_TOOLTIP L"ToolTip" +# define SZ_THDOCPROP_AUTHOR L"author" +/* +#else +static const WCHAR SZ_THDOCPROP_DISPLAYNAME[] = { 'D','i','s','p','l','a','y','N','a','m','e',0 }; +static const WCHAR SZ_THDOCPROP_CANONICALNAME[] = { 'T','h','e','m','e','N','a','m','e',0 }; +static const WCHAR SZ_THDOCPROP_TOOLTIP[] = { 'T','o','o','l','T','i','p',0 }; +static const WCHAR SZ_THDOCPROP_AUTHOR[] = { 'a','u','t','h','o','r',0 }; +*/ +#endif + +HRESULT WINAPI GetThemeDocumentationProperty(LPCWSTR,LPCWSTR,LPWSTR,int); +HRESULT WINAPI GetThemeEnumValue(HTHEME,int,int,int,int*); +HRESULT WINAPI GetThemeFilename(HTHEME,int,int,int,LPWSTR,int); +HRESULT WINAPI GetThemeFont(HTHEME,HDC,int,int,int,LOGFONTW*); +HRESULT WINAPI GetThemeInt(HTHEME,int,int,int,int*); + +#define MAX_INTLIST_COUNT 10 +typedef struct _INTLIST { + int iValueCount; + int iValues[MAX_INTLIST_COUNT]; +} INTLIST, *PINTLIST; + +HRESULT WINAPI GetThemeIntList(HTHEME,int,int,int,INTLIST*); + +typedef struct _MARGINS { + int cxLeftWidth; + int cxRightWidth; + int cyTopHeight; + int cyBottomHeight; +} MARGINS, *PMARGINS; + +HRESULT WINAPI GetThemeMargins(HTHEME,HDC,int,int,int,RECT*,MARGINS*); +HRESULT WINAPI GetThemeMetric(HTHEME,HDC,int,int,int,int*); + +typedef enum { + TS_MIN, + TS_TRUE, + TS_DRAW +} THEMESIZE; + +HRESULT WINAPI GetThemePartSize(HTHEME,HDC,int,int,RECT*,THEMESIZE,SIZE*); +HRESULT WINAPI GetThemePosition(HTHEME,int,int,int,POINT*); + +typedef enum { + PO_STATE, + PO_PART, + PO_CLASS, + PO_GLOBAL, + PO_NOTFOUND +} PROPERTYORIGIN; + +HRESULT WINAPI GetThemePropertyOrigin(HTHEME,int,int,int,PROPERTYORIGIN*); +HRESULT WINAPI GetThemeRect(HTHEME,int,int,int,RECT*); +HRESULT WINAPI GetThemeString(HTHEME,int,int,int,LPWSTR,int); +BOOL WINAPI GetThemeSysBool(HTHEME,int); +COLORREF WINAPI GetThemeSysColor(HTHEME,int); +HBRUSH WINAPI GetThemeSysColorBrush(HTHEME,int); +HRESULT WINAPI GetThemeSysFont(HTHEME,int,LOGFONTW*); +HRESULT WINAPI GetThemeSysInt(HTHEME,int,int*); +int WINAPI GetThemeSysSize(HTHEME,int); +HRESULT WINAPI GetThemeSysString(HTHEME,int,LPWSTR,int); +HRESULT WINAPI GetThemeTextExtent(HTHEME,HDC,int,int,LPCWSTR,int,DWORD, + const RECT*,RECT*); +HRESULT WINAPI GetThemeTextMetrics(HTHEME,HDC,int,int,TEXTMETRICW*); +HTHEME WINAPI GetWindowTheme(HWND); + +#define HTTB_BACKGROUNDSEG 0x0000 +#define HTTB_FIXEDBORDER 0x0002 +#define HTTB_CAPTION 0x0004 +#define HTTB_RESIZINGBORDER_LEFT 0x0010 +#define HTTB_RESIZINGBORDER_TOP 0x0020 +#define HTTB_RESIZINGBORDER_RIGHT 0x0040 +#define HTTB_RESIZINGBORDER_BOTTOM 0x0080 +#define HTTB_RESIZINGBORDER \ + (HTTB_RESIZINGBORDER_LEFT|HTTB_RESIZINGBORDER_TOP|\ + HTTB_RESIZINGBORDER_RIGHT|HTTB_RESIZINGBORDER_BOTTOM) +#define HTTB_SIZINGTEMPLATE 0x0100 +#define HTTB_SYSTEMSIZINGMARGINS 0x0200 + +HRESULT WINAPI HitTestThemeBackground(HTHEME,HDC,int,int,DWORD,const RECT*, + HRGN,POINT,WORD*); +BOOL WINAPI IsAppThemed(void); +BOOL WINAPI IsThemeActive(void); +BOOL WINAPI IsThemeBackgroundPartiallyTransparent(HTHEME,int,int); +BOOL WINAPI IsThemeDialogTextureEnabled(void); +BOOL WINAPI IsThemePartDefined(HTHEME,int,int); +HTHEME WINAPI OpenThemeData(HWND,LPCWSTR); +void WINAPI SetThemeAppProperties(DWORD); +HRESULT WINAPI SetWindowTheme(HWND,LPCWSTR,LPCWSTR); + + +#endif + diff --git a/Externals/wxWidgets/include/wx/msw/wince/checklst.h b/Externals/wxWidgets/include/wx/msw/wince/checklst.h new file mode 100644 index 0000000000..39f8c5e698 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/wince/checklst.h @@ -0,0 +1,95 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/wince/checklst.h +// Purpose: wxCheckListBox class - a listbox with checkable items +// Author: Wlodzimierz ABX Skiba +// Modified by: +// Created: 30.10.2005 +// RCS-ID: $Id: checklst.h 38319 2006-03-23 22:05:23Z VZ $ +// Copyright: (c) Wlodzimierz Skiba +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef __CHECKLSTCE__H_ +#define __CHECKLSTCE__H_ + +class WXDLLEXPORT wxCheckListBox : public wxCheckListBoxBase +{ +public: + // ctors + wxCheckListBox(); + wxCheckListBox(wxWindow *parent, wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + int nStrings = 0, + const wxString choices[] = NULL, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxListBoxNameStr); + wxCheckListBox(wxWindow *parent, wxWindowID id, + const wxPoint& pos, + const wxSize& size, + const wxArrayString& choices, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxListBoxNameStr); + virtual ~wxCheckListBox(); + + bool Create(wxWindow *parent, wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + int n = 0, const wxString choices[] = NULL, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxListBoxNameStr); + bool Create(wxWindow *parent, wxWindowID id, + const wxPoint& pos, + const wxSize& size, + const wxArrayString& choices, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxListBoxNameStr); + + // override base class virtuals + virtual void Delete(unsigned int n); + + // items may be checked + virtual bool IsChecked(unsigned int uiIndex) const; + virtual void Check(unsigned int uiIndex, bool bCheck = true); + + // public interface derived from wxListBox and lower classes + virtual void Clear(); + virtual unsigned int GetCount() const; + virtual int GetSelection() const; + virtual int GetSelections(wxArrayInt& aSelections) const; + virtual wxString GetString(unsigned int n) const; + virtual bool IsSelected(int n) const; + virtual void SetString(unsigned int n, const wxString& s); + + // Implementation + virtual bool MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result); +protected: + + void OnSize(wxSizeEvent& event); + + // protected interface derived from wxListBox and lower classes + virtual int DoAppend(const wxString& item); + virtual void* DoGetItemClientData(unsigned int n) const; + virtual wxClientData* DoGetItemClientObject(unsigned int n) const; + virtual void DoInsertItems(const wxArrayString& items, unsigned int pos); + virtual void DoSetFirstItem(int n); + virtual void DoSetItemClientData(unsigned int n, void* clientData); + virtual void DoSetItemClientObject(unsigned int n, wxClientData* clientData); + virtual void DoSetItems(const wxArrayString& items, void **clientData); + virtual void DoSetSelection(int n, bool select); + // convert our styles to Windows + virtual WXDWORD MSWGetStyle(long style, WXDWORD *exstyle) const; + +private: + + wxArrayPtrVoid m_itemsClientData; + + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS_NO_COPY(wxCheckListBox) +}; + +#endif //_CHECKLSTCE_H diff --git a/Externals/wxWidgets/include/wx/msw/wince/chkconf.h b/Externals/wxWidgets/include/wx/msw/wince/chkconf.h new file mode 100644 index 0000000000..c15a77fa06 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/wince/chkconf.h @@ -0,0 +1,90 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/wince/chkconf.h +// Purpose: WinCE-specific configuration options checks +// Author: Vadim Zeitlin +// Modified by: +// Created: 2005-03-07 +// RCS-ID: $Id: chkconf.h 40023 2006-07-06 07:07:52Z ABX $ +// Copyright: (c) 2005 Vadim Zeitlin <vadim@wxwindows.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MSW_WINCE_CHKCONF_H_ +#define _WX_MSW_WINCE_CHKCONF_H_ + +// Standard SDK lacks a few things, forcefully disable them +#ifdef WCE_PLATFORM_STANDARDSDK + // no shell functions support + #undef wxUSE_STDPATHS + #define wxUSE_STDPATHS 0 +#endif // WCE_PLATFORM_STANDARDSDK + +#if _WIN32_WCE < 400 + // not enough API and lack of ddraw.h + #undef wxUSE_DISPLAY + #define wxUSE_DISPLAY 0 +#endif + +// DDE doesn't exist under WinCE and wxIPC is DDE-based under MSW +#undef wxUSE_IPC +#define wxUSE_IPC 0 + +// metafiles are not supported neither +#undef wxUSE_ENH_METAFILE +#define wxUSE_ENH_METAFILE 0 + +#undef wxUSE_METAFILE +#define wxUSE_METAFILE 0 + +// eVC doesn't support SEH +#undef wxUSE_ON_FATAL_EXCEPTION +#define wxUSE_ON_FATAL_EXCEPTION 0 + +#undef wxUSE_WXHTML_HELP +#define wxUSE_WXHTML_HELP 0 + +// libtiff and regex apparently don't compile with eVC (to check with eVC4?) +// and they're disabled for WinCE in build/bakefiles/{tiff|regex}.bkl so can't +// be enabled here +#undef wxUSE_LIBTIFF +#define wxUSE_LIBTIFF 0 + +#undef wxUSE_REGEX +#define wxUSE_REGEX 0 + +#undef wxUSE_DEBUGREPORT +#define wxUSE_DEBUGREPORT 0 + +// other MSW settings not supported by CE +#undef wxUSE_RICHEDIT +#define wxUSE_RICHEDIT 0 +#undef wxUSE_RICHEDIT2 +#define wxUSE_RICHEDIT2 0 + +#undef wxUSE_UXTHEME +#define wxUSE_UXTHEME 0 +#undef wxUSE_UXTHEME_AUTO +#define wxUSE_UXTHEME_AUTO 0 + +#undef wxUSE_UNICODE_MSLU +#define wxUSE_UNICODE_MSLU 0 + + +// Disable features which don't make sense for MS Smartphones +// (due to pointer device usage, limited controls or dialogs, file system) +#if defined(__SMARTPHONE__) + #undef wxUSE_LISTBOOK + #define wxUSE_LISTBOOK 0 + + #undef wxUSE_NOTEBOOK + #define wxUSE_NOTEBOOK 0 + + #undef wxUSE_STATUSBAR + #define wxUSE_STATUSBAR 0 + + #undef wxUSE_COLOURPICKERCTRL + #define wxUSE_COLOURPICKERCTRL 0 +#endif // __SMARTPHONE__ + +#endif // _WX_MSW_WINCE_CHKCONF_H_ + diff --git a/Externals/wxWidgets/include/wx/msw/wince/choicece.h b/Externals/wxWidgets/include/wx/msw/wince/choicece.h new file mode 100644 index 0000000000..c77f751720 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/wince/choicece.h @@ -0,0 +1,142 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/wince/choicece.h +// Purpose: wxChoice implementation for smart phones driven by WinCE +// Author: Wlodzimierz ABX Skiba +// Modified by: +// Created: 29.07.2004 +// RCS-ID: $Id: choicece.h 38319 2006-03-23 22:05:23Z VZ $ +// Copyright: (c) Wlodzimierz Skiba +// License: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CHOICECE_H_BASE_ +#define _WX_CHOICECE_H_BASE_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/defs.h" + +#if wxUSE_CHOICE + +#include "wx/dynarray.h" + +class WXDLLEXPORT wxChoice; +WX_DEFINE_EXPORTED_ARRAY_PTR(wxChoice *, wxArrayChoiceSpins); + +// ---------------------------------------------------------------------------- +// Choice item +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxChoice : public wxChoiceBase +{ +public: + // ctors + wxChoice() { } + virtual ~wxChoice(); + + wxChoice(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + int n = 0, const wxString choices[] = NULL, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxChoiceNameStr) + { + Create(parent, id, pos, size, n, choices, style, validator, name); + } + wxChoice(wxWindow *parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + const wxArrayString& choices, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxChoiceNameStr) + { + Create(parent, id, pos, size, choices, style, validator, name); + } + + bool Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + int n = 0, const wxString choices[] = NULL, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxChoiceNameStr); + + bool Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + const wxArrayString& choices, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxChoiceNameStr); + + // implement base class pure virtuals + virtual int DoAppend(const wxString& item); + virtual int DoInsert(const wxString& item, unsigned int pos); + virtual void Delete(unsigned int n); + virtual void Clear() ; + + virtual unsigned int GetCount() const; + virtual int GetSelection() const; + virtual void SetSelection(int n); + + virtual int FindString(const wxString& s, bool bCase = false) const; + virtual wxString GetString(unsigned int n) const; + virtual void SetString(unsigned int n, const wxString& s); + + // get the subclassed window proc of the buddy list of choices + WXFARPROC GetBuddyWndProc() const { return m_wndProcBuddy; } + + // return the choice object whose buddy is the given window or NULL + static wxChoice *GetChoiceForListBox(WXHWND hwndBuddy); + + virtual bool MSWCommand(WXUINT param, WXWORD id); + +protected: + virtual void DoSetItemClientData(unsigned int n, void* clientData); + virtual void* DoGetItemClientData(unsigned int n) const; + virtual void DoSetItemClientObject(unsigned int n, wxClientData* clientData); + virtual wxClientData* DoGetItemClientObject(unsigned int n) const; + + // MSW implementation + virtual void DoGetPosition(int *x, int *y) const; + virtual void DoMoveWindow(int x, int y, int width, int height); + virtual wxSize DoGetBestSize() const; + virtual void DoGetSize(int *width, int *height) const; + + virtual WXDWORD MSWGetStyle(long style, WXDWORD *exstyle) const; + + // create and initialize the control + bool CreateAndInit(wxWindow *parent, wxWindowID id, + const wxPoint& pos, + const wxSize& size, + int n, const wxString choices[], + long style, + const wxValidator& validator, + const wxString& name); + + // free all memory we have (used by Clear() and dtor) + void Free(); + + // the data for the "buddy" list + WXHWND m_hwndBuddy; + WXFARPROC m_wndProcBuddy; + + // all existing wxChoice - this allows to find the one corresponding to + // the given buddy window in GetSpinChoiceCtrl() + static wxArrayChoiceSpins ms_allChoiceSpins; + +private: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxChoice) +}; + +#endif // wxUSE_CHOICE + +#endif // _WX_CHOICECE_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/msw/wince/helpwce.h b/Externals/wxWidgets/include/wx/msw/wince/helpwce.h new file mode 100644 index 0000000000..db1e967d53 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/wince/helpwce.h @@ -0,0 +1,58 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/wince/helpwce.h +// Purpose: Help system: Windows CE help implementation +// Author: Julian Smart +// Modified by: +// Created: 2003-07-12 +// RCS-ID: $Id: helpwce.h 36026 2005-10-27 21:00:26Z JS $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_HELPWCE_H_ +#define _WX_HELPWCE_H_ + +#if wxUSE_HELP + +#include "wx/helpbase.h" + +class WXDLLEXPORT wxWinceHelpController : public wxHelpControllerBase +{ +public: + wxWinceHelpController(wxWindow* parentWindow = NULL): wxHelpControllerBase(parentWindow) {} + virtual ~wxWinceHelpController() {} + + // Must call this to set the filename + virtual bool Initialize(const wxString& file); + + // If file is "", reloads file given in Initialize + virtual bool LoadFile(const wxString& file = wxEmptyString); + virtual bool DisplayContents(); + virtual bool DisplaySection(int sectionNo); + virtual bool DisplaySection(const wxString& section); + virtual bool DisplayBlock(long blockNo); + virtual bool DisplayContextPopup(int contextId); + virtual bool DisplayTextPopup(const wxString& text, const wxPoint& pos); + virtual bool KeywordSearch(const wxString& k, + wxHelpSearchMode mode = wxHELP_SEARCH_ALL); + virtual bool Quit(); + + wxString GetHelpFile() const { return m_helpFile; } + +protected: + // Append extension if necessary. + wxString GetValidFilename(const wxString& file) const; + + // View topic, or just the HTML file + bool ViewURL(const wxString& topic = wxEmptyString); + +private: + wxString m_helpFile; + + DECLARE_CLASS(wxWinceHelpController) +}; + +#endif // wxUSE_MS_HTML_HELP + +#endif +// _WX_HELPWCE_H_ diff --git a/Externals/wxWidgets/include/wx/msw/wince/libraries.h b/Externals/wxWidgets/include/wx/msw/wince/libraries.h new file mode 100644 index 0000000000..055b628adb --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/wince/libraries.h @@ -0,0 +1,59 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/wince/libraries.h +// Purpose: VC++ pragmas for linking against SDK libs +// Author: Vaclav Slavik +// Modified by: +// Created: 2004-04-11 +// RCS-ID: $Id: libraries.h 38141 2006-03-16 11:03:26Z JS $ +// Copyright: (c) 2004 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_LIBRARIES_H_ +#define _WX_LIBRARIES_H_ + +// NB: According to Microsoft, it is up to the OEM to decide whether +// some of libraries will be included in the system or not. For example, +// MS' STANDARDSDK does not include cyshell.lib and aygshell.lib, while +// Pocket PC 2003 SDK does. We depend on some symbols that are in these +// libraries in some SDKs and in different libs in others. Fortunately we +// can detect what SDK is used in C++ code, so we take advantage of +// VC++'s #pragma to link against the libraries conditionally, instead of +// including libraries in project files. + +#if defined(__VISUALC__) && defined(__WXWINCE__) + +#if (_WIN32_WCE >= 400) || defined(__POCKETPC__) + // No commdlg.lib in Mobile 5.0 Smartphone +#if !(defined(__SMARTPHONE__) && _WIN32_WCE >= 1200) + #pragma comment(lib,"commdlg.lib") +#endif +#endif + +#if (_WIN32_WCE >= 400) && !defined(wxNO_RTTI) + #pragma comment(lib,"ccrtrtti.lib") +#endif + +#if defined(__WINCE_STANDARDSDK__) + // DoDragDrop: + #pragma comment(lib,"olece400.lib") +#elif defined(__POCKETPC__) + // PocketPC build: + // DoDragDrop: + #pragma comment(lib,"ceshell.lib") + + #pragma comment(lib,"aygshell.lib") +#elif defined(__HANDHELDPC__) + // Handheld PC builds. Maybe WindowsCE.NET 4.X needs another symbol. + #pragma comment(lib,"ceshell.lib") +#elif defined(__SMARTPHONE__) + // Smartphone build: + #pragma comment(lib,"ceshell.lib") + #pragma comment(lib,"aygshell.lib") +#else + #error "Unknown SDK, please fill-in missing pieces" +#endif + +#endif // __VISUALC__ && __WXWINCE__ + +#endif // _WX_LIBRARIES_H_ diff --git a/Externals/wxWidgets/include/wx/msw/wince/missing.h b/Externals/wxWidgets/include/wx/msw/wince/missing.h new file mode 100644 index 0000000000..d9de8566a4 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/wince/missing.h @@ -0,0 +1,140 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wince/missing.h +// Purpose: Missing things in WinCE +// Author: Marco Cavallini +// Modified by: +// Created: 16/11/2002 +// RCS-ID: +// Copyright: (c) KOAN SAS ( www.koansoftware.com ) +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CE_MISSING_H_ +#define _WX_CE_MISSING_H_ + +#include "wx/msw/private.h" +#include "shellapi.h" + +inline BOOL IsIconic( HWND WXUNUSED(hWnd) ) +{ + // Probably not right... +#if 0 + long style = GetWindowLong(hWnd, GWL_STYLE); + return ((style & WS_MINIMIZE) == 0); +#endif + return FALSE; +} + +#ifdef __POCKETPC__ +#define SM_CXCURSOR 13 +#define SM_CYCURSOR 14 +#endif + +// Missing from eVC 4 for some reason +#ifndef I_IMAGENONE +#define I_IMAGENONE (-2) +#endif + +#ifndef TBSTYLE_NO_DROPDOWN_ARROW +#define TBSTYLE_NO_DROPDOWN_ARROW 0x0080 +#endif + +#ifndef SHCMBM_GETMENU +#define SHCMBM_GETMENU (WM_USER + 402) +#endif + +#ifndef SHCMBM_SETSUBMENU +#define SHCMBM_SETSUBMENU (WM_USER + 400) // wparam == id of button, lParam == hmenu, return is old hmenu +#endif + +#ifndef SHCMBM_GETSUBMENU +#define SHCMBM_GETSUBMENU (WM_USER + 401) // lParam == ID +#endif + +#ifndef LVS_EX_FULLROWSELECT + #define LVS_EX_FULLROWSELECT 0x00000020 +#endif + +#ifndef TVS_FULLROWSELECT + #define TVS_FULLROWSELECT 0x1000 +#endif + +#ifndef TVM_SETBKCOLOR + #define TVM_SETBKCOLOR (TV_FIRST + 29) + #define TVM_SETTEXTCOLOR (TV_FIRST + 30) +#endif + +// Used in msgdlg.cpp, evtloop.cpp +#ifndef MB_TASKMODAL +#define MB_TASKMODAL 0x2000 +#endif + +#ifndef HGDI_ERROR +#define HGDI_ERROR ((HANDLE)(0xFFFFFFFFL)) +#endif + +// some windows styles don't exist in CE SDK, replace them with closest +// equivalents +#ifndef WS_THICKFRAME + #define WS_THICKFRAME WS_BORDER +#endif + +#ifndef WS_MINIMIZE + #define WS_MINIMIZE 0 +#endif + +#ifndef WS_MAXIMIZE + #define WS_MAXIMIZE 0 +#endif + + +// global memory functions don't exist under CE (good riddance, of course, but +// the existing code still uses them in some places, so make it compile) +// +// update: they're defined in eVC 4 inside "#ifdef UNDER_CE" block +#ifndef UNDER_CE + #define GlobalAlloc LocalAlloc + #define GlobalFree LocalFree + #define GlobalSize LocalSize + #define GPTR LPTR + #define GHND LPTR + #define GMEM_MOVEABLE 0 + #define GMEM_SHARE 0 +#endif // !UNDER_CE + +// WinCE RTL doesn't implement bsearch() used in encconv.cpp +extern "C" void * +bsearch(const void *key, const void *base, size_t num, size_t size, + int (wxCMPFUNC_CONV *cmp)(const void *, const void *)); + +#define O_RDONLY 0x0000 /* open for reading only */ +#define O_WRONLY 0x0001 /* open for writing only */ +#define O_RDWR 0x0002 /* open for reading and writing */ +#define O_APPEND 0x0008 /* writes done at eof */ + +#define O_CREAT 0x0100 /* create and open file */ +#define O_TRUNC 0x0200 /* open and truncate */ +#define O_EXCL 0x0400 /* open only if file doesn't already exist */ + +#define O_TEXT 0x4000 /* file mode is text (translated) */ +#define O_BINARY 0x8000 /* file mode is binary (untranslated) */ + +#ifndef SS_SUNKEN + #define SS_SUNKEN 0x00001000L +#endif + +// unsupported flags for WINDOWPOS structure +#ifndef SWP_NOCOPYBITS + #define SWP_NOCOPYBITS 0 +#endif + +#ifndef SWP_NOOWNERZORDER + #define SWP_NOOWNERZORDER 0 +#endif + +#ifndef SWP_NOSENDCHANGING + #define SWP_NOSENDCHANGING 0 +#endif + +#endif // _WX_CE_MISSING_H_ + diff --git a/Externals/wxWidgets/include/wx/msw/wince/net.h b/Externals/wxWidgets/include/wx/msw/wince/net.h new file mode 100644 index 0000000000..9342e513d5 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/wince/net.h @@ -0,0 +1,20 @@ +// Copyright 1998, Ben Goetter. All rights reserved. + +/* + patch holes in winsock + + WCE 2.0 lacks many of the 'database' winsock routines. + Stub just enough them for ss.dll. + + getprotobynumber + getservbyport + getservbyname + +*/ + +struct servent * WINSOCKAPI getservbyport(int port, const char * proto) ; + +struct servent * WINSOCKAPI getservbyname(const char * name, + const char * proto) ; +struct protoent * WINSOCKAPI getprotobynumber(int proto) ; + diff --git a/Externals/wxWidgets/include/wx/msw/wince/resources.h b/Externals/wxWidgets/include/wx/msw/wince/resources.h new file mode 100644 index 0000000000..4fdccd1cdf --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/wince/resources.h @@ -0,0 +1,25 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/wince/resources.h +// Purpose: identifiers shared between resource compiler and eVC +// Author: Wlodzimierz ABX Skiba +// Modified by: +// Created: 01.05.2004 +// RCS-ID: $Id: resources.h 27829 2004-06-16 06:17:27Z ABX $ +// Copyright: (c) Wlodzimierz Skiba +// License: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#define IDM_LEFT 40001 +#define IDM_RIGHT 40002 +#define IDM_ITEM 40003 + +#define IDS_EMPTY 40010 + +#define IDR_POPUP_1 40020 +#define IDR_POPUP_2 40021 + +#define IDR_MENUBAR_ONE_BUTTON 40030 +#define IDR_MENUBAR_LEFT_MENU 40031 +#define IDR_MENUBAR_RIGHT_MENU 40032 +#define IDR_MENUBAR_BOTH_MENUS 40033 + diff --git a/Externals/wxWidgets/include/wx/msw/wince/setup.h b/Externals/wxWidgets/include/wx/msw/wince/setup.h new file mode 100644 index 0000000000..c84e6e97ae --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/wince/setup.h @@ -0,0 +1,1295 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/wince/setup.h +// Purpose: Configuration for the library +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: setup.h 43908 2006-12-11 06:19:27Z RD $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_SETUP_H_ +#define _WX_SETUP_H_ + +/* --- start common options --- */ +// ---------------------------------------------------------------------------- +// global settings +// ---------------------------------------------------------------------------- + +// define this to 0 when building wxBase library - this can also be done from +// makefile/project file overriding the value here +#ifndef wxUSE_GUI + #define wxUSE_GUI 1 +#endif // wxUSE_GUI + +// ---------------------------------------------------------------------------- +// compatibility settings +// ---------------------------------------------------------------------------- + +// This setting determines the compatibility with 2.4 API: set it to 1 to +// enable it but please consider updating your code instead. +// +// Default is 0 +// +// Recommended setting: 0 (please update your code) +#define WXWIN_COMPATIBILITY_2_4 0 + +// This setting determines the compatibility with 2.6 API: set it to 0 to +// flag all cases of using deprecated functions. +// +// Default is 1 but please try building your code with 0 as the default will +// change to 0 in the next version and the deprecated functions will disappear +// in the version after it completely. +// +// Recommended setting: 0 (please update your code) +#define WXWIN_COMPATIBILITY_2_6 1 + +// MSW-only: Set to 0 for accurate dialog units, else 1 for old behaviour when +// default system font is used for wxWindow::GetCharWidth/Height() instead of +// the current font. +// +// Default is 0 +// +// Recommended setting: 0 +#define wxDIALOG_UNIT_COMPATIBILITY 0 + +// ---------------------------------------------------------------------------- +// debugging settings +// ---------------------------------------------------------------------------- + +// Generic comment about debugging settings: they are very useful if you don't +// use any other memory leak detection tools such as Purify/BoundsChecker, but +// are probably redundant otherwise. Also, Visual C++ CRT has the same features +// as wxWidgets memory debugging subsystem built in since version 5.0 and you +// may prefer to use it instead of built in memory debugging code because it is +// faster and more fool proof. +// +// Using VC++ CRT memory debugging is enabled by default in debug mode +// (__WXDEBUG__) if wxUSE_GLOBAL_MEMORY_OPERATORS is *not* enabled (i.e. is 0) +// and if __NO_VC_CRTDBG__ is not defined. + +// If 1, enables wxDebugContext, for writing error messages to file, etc. If +// __WXDEBUG__ is not defined, will still use the normal memory operators. +// +// Default is 0 +// +// Recommended setting: 0 +#define wxUSE_DEBUG_CONTEXT 0 + +// If 1, enables debugging versions of wxObject::new and wxObject::delete *IF* +// __WXDEBUG__ is also defined. +// +// WARNING: this code may not work with all architectures, especially if +// alignment is an issue. This switch is currently ignored for mingw / cygwin +// +// Default is 0 +// +// Recommended setting: 1 if you are not using a memory debugging tool, else 0 +#define wxUSE_MEMORY_TRACING 0 + +// In debug mode, cause new and delete to be redefined globally. +// If this causes problems (e.g. link errors which is a common problem +// especially if you use another library which also redefines the global new +// and delete), set this to 0. +// This switch is currently ignored for mingw / cygwin +// +// Default is 0 +// +// Recommended setting: 0 +#define wxUSE_GLOBAL_MEMORY_OPERATORS 0 + +// In debug mode, causes new to be defined to be WXDEBUG_NEW (see object.h). If +// this causes problems (e.g. link errors), set this to 0. You may need to set +// this to 0 if using templates (at least for VC++). This switch is currently +// ignored for mingw / cygwin / CodeWarrior +// +// Default is 0 +// +// Recommended setting: 0 +#define wxUSE_DEBUG_NEW_ALWAYS 0 + +// wxHandleFatalExceptions() may be used to catch the program faults at run +// time and, instead of terminating the program with a usual GPF message box, +// call the user-defined wxApp::OnFatalException() function. If you set +// wxUSE_ON_FATAL_EXCEPTION to 0, wxHandleFatalExceptions() will not work. +// +// This setting is for Win32 only and can only be enabled if your compiler +// supports Win32 structured exception handling (currently only VC++ does) +// +// Default is 1 +// +// Recommended setting: 1 if your compiler supports it. +#define wxUSE_ON_FATAL_EXCEPTION 1 + +// Set this to 1 to be able to generate a human-readable (unlike +// machine-readable minidump created by wxCrashReport::Generate()) stack back +// trace when your program crashes using wxStackWalker +// +// Default is 1 if supported by the compiler. +// +// Recommended setting: 1, set to 0 if your programs never crash +#define wxUSE_STACKWALKER 1 + +// Set this to 1 to compile in wxDebugReport class which allows you to create +// and optionally upload to your web site a debug report consisting of back +// trace of the crash (if wxUSE_STACKWALKER == 1) and other information. +// +// Default is 1 if supported by the compiler. +// +// Recommended setting: 1, it is compiled into a separate library so there +// is no overhead if you don't use it +#define wxUSE_DEBUGREPORT 1 + +// ---------------------------------------------------------------------------- +// Unicode support +// ---------------------------------------------------------------------------- + +// Set wxUSE_UNICODE to 1 to compile wxWidgets in Unicode mode: wxChar will be +// defined as wchar_t, wxString will use Unicode internally. If you set this +// to 1, you must use wxT() macro for all literal strings in the program. +// +// Unicode is currently only fully supported under Windows NT/2000/XP +// (Windows 9x doesn't support it and the programs compiled in Unicode mode +// will not run under 9x -- but see wxUSE_UNICODE_MSLU below). +// +// Default is 0 +// +// Recommended setting: 0 (unless you only plan to use Windows NT/2000/XP) +#ifndef wxUSE_UNICODE + #define wxUSE_UNICODE 0 +#endif + +// Setting wxUSE_WCHAR_T to 1 gives you some degree of Unicode support without +// compiling the program in Unicode mode. More precisely, it will be possible +// to construct wxString from a wide (Unicode) string and convert any wxString +// to Unicode. +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_WCHAR_T 1 + +// ---------------------------------------------------------------------------- +// global features +// ---------------------------------------------------------------------------- + +// Compile library in exception-safe mode? If set to 1, the library will try to +// behave correctly in presence of exceptions (even though it still will not +// use the exceptions itself) and notify the user code about any unhandled +// exceptions. If set to 0, propagation of the exceptions through the library +// code will lead to undefined behaviour -- but the code itself will be +// slightly smaller and faster. +// +// Note that like wxUSE_THREADS this option is automatically set to 0 if +// wxNO_EXCEPTIONS is defined. +// +// Default is 1 +// +// Recommended setting: depends on whether you intend to use C++ exceptions +// in your own code (1 if you do, 0 if you don't) +#define wxUSE_EXCEPTIONS 1 + +// Set wxUSE_EXTENDED_RTTI to 1 to use extended RTTI +// +// Default is 0 +// +// Recommended setting: 0 (this is still work in progress...) +#define wxUSE_EXTENDED_RTTI 0 + +// Set wxUSE_STL to 1 to derive wxList(Foo) and wxArray(Foo) from +// std::list<Foo*> and std::vector<Foo*>, with a compatibility interface, +// and for wxHashMap to be implemented with templates. +// +// Default is 0 +// +// Recommended setting: YMMV +#define wxUSE_STL 0 + +// Support for message/error logging. This includes wxLogXXX() functions and +// wxLog and derived classes. Don't set this to 0 unless you really know what +// you are doing. +// +// Default is 1 +// +// Recommended setting: 1 (always) +#define wxUSE_LOG 1 + +// Recommended setting: 1 +#define wxUSE_LOGWINDOW 1 + +// Recommended setting: 1 +#define wxUSE_LOGGUI 1 + +// Recommended setting: 1 +#define wxUSE_LOG_DIALOG 1 + +// Support for command line parsing using wxCmdLineParser class. +// +// Default is 1 +// +// Recommended setting: 1 (can be set to 0 if you don't use the cmd line) +#define wxUSE_CMDLINE_PARSER 1 + +// Support for multithreaded applications: if 1, compile in thread classes +// (thread.h) and make the library a bit more thread safe. Although thread +// support is quite stable by now, you may still consider recompiling the +// library without it if you have no use for it - this will result in a +// somewhat smaller and faster operation. +// +// Notice that if wxNO_THREADS is defined, wxUSE_THREADS is automatically reset +// to 0 in wx/chkconf.h, so, for example, if you set USE_THREADS to 0 in +// build/msw/config.* file this value will have no effect. +// +// Default is 1 +// +// Recommended setting: 0 unless you do plan to develop MT applications +#define wxUSE_THREADS 1 + +// If enabled, compiles wxWidgets streams classes +// +// wx stream classes are used for image IO, process IO redirection, network +// protocols implementation and much more and so disabling this results in a +// lot of other functionality being lost. +// +// Default is 1 +// +// Recommended setting: 1 as setting it to 0 disables many other things +#define wxUSE_STREAMS 1 + +// Use standard C++ streams if 1 instead of wx streams in some places. If +// disabled (default), wx streams are used everywhere and wxWidgets doesn't +// depend on the standard streams library. +// +// Notice that enabling this does not replace wx streams with std streams +// everywhere, in a lot of places wx streams are used no matter what. +// +// Default is 0 +// +// Recommended setting: 1 if you use the standard streams anyhow and so +// dependency on the standard streams library is not a +// problem +#define wxUSE_STD_IOSTREAM 0 + +// Enable conversion to standard C++ string if 1. +// +// Default is 1 for most compilers. +// +// Currently the Digital Mars and Watcom compilers come without standard C++ +// library headers by default, wxUSE_STD_STRING can be set to 1 if you do have +// them (e.g. from STLPort). +// +// VC++ 5.0 does include standard C++ library header, however they produce +// many warnings that can't be turned off when compiled at warning level 4. +#if defined(__DMC__) || defined(__WATCOMC__) \ + || (defined(_MSC_VER) && _MSC_VER < 1200) + #define wxUSE_STD_STRING 0 +#else + #define wxUSE_STD_STRING 1 +#endif + +// Support for positional parameters (e.g. %1$d, %2$s ...) in wxVsnprintf. +// Note that if the system's implementation does not support positional +// parameters, setting this to 1 forces the use of the wxWidgets implementation +// of wxVsnprintf. The standard vsnprintf() supports positional parameters on +// many Unix systems but usually doesn't under Windows. +// +// Positional parameters are very useful when translating a program since using +// them in formatting strings allow translators to correctly reorder the +// translated sentences. +// +// Default is 1 +// +// Recommended setting: 1 if you want to support multiple languages +#define wxUSE_PRINTF_POS_PARAMS 1 + +// ---------------------------------------------------------------------------- +// non GUI features selection +// ---------------------------------------------------------------------------- + +// Set wxUSE_LONGLONG to 1 to compile the wxLongLong class. This is a 64 bit +// integer which is implemented in terms of native 64 bit integers if any or +// uses emulation otherwise. +// +// This class is required by wxDateTime and so you should enable it if you want +// to use wxDateTime. For most modern platforms, it will use the native 64 bit +// integers in which case (almost) all of its functions are inline and it +// almost does not take any space, so there should be no reason to switch it +// off. +// +// Recommended setting: 1 +#define wxUSE_LONGLONG 1 + +// Set wxUSE_(F)FILE to 1 to compile wx(F)File classes. wxFile uses low level +// POSIX functions for file access, wxFFile uses ANSI C stdio.h functions. +// +// Default is 1 +// +// Recommended setting: 1 (wxFile is highly recommended as it is required by +// i18n code, wxFileConfig and others) +#define wxUSE_FILE 1 +#define wxUSE_FFILE 1 + +// Use wxFSVolume class providing access to the configured/active mount points +// +// Default is 1 +// +// Recommended setting: 1 (but may be safely disabled if you don't use it) +#define wxUSE_FSVOLUME 1 + +// Use wxStandardPaths class which allows to retrieve some standard locations +// in the file system +// +// Default is 1 +// +// Recommended setting: 1 (may be disabled to save space, but not much) +#define wxUSE_STDPATHS 1 + +// use wxTextBuffer class: required by wxTextFile +#define wxUSE_TEXTBUFFER 1 + +// use wxTextFile class: requires wxFile and wxTextBuffer, required by +// wxFileConfig +#define wxUSE_TEXTFILE 1 + +// i18n support: _() macro, wxLocale class. Requires wxTextFile. +#define wxUSE_INTL 1 + +// Set wxUSE_DATETIME to 1 to compile the wxDateTime and related classes which +// allow to manipulate dates, times and time intervals. wxDateTime replaces the +// old wxTime and wxDate classes which are still provided for backwards +// compatibility (and implemented in terms of wxDateTime). +// +// Note that this class is relatively new and is still officially in alpha +// stage because some features are not yet (fully) implemented. It is already +// quite useful though and should only be disabled if you are aiming at +// absolutely minimal version of the library. +// +// Requires: wxUSE_LONGLONG +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_DATETIME 1 + +// Set wxUSE_TIMER to 1 to compile wxTimer class +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_TIMER 1 + +// Use wxStopWatch clas. +// +// Default is 1 +// +// Recommended setting: 1 (needed by wxSocket) +#define wxUSE_STOPWATCH 1 + +// Setting wxUSE_CONFIG to 1 enables the use of wxConfig and related classes +// which allow the application to store its settings in the persistent +// storage. Setting this to 1 will also enable on-demand creation of the +// global config object in wxApp. +// +// See also wxUSE_CONFIG_NATIVE below. +// +// Recommended setting: 1 +#define wxUSE_CONFIG 1 + +// If wxUSE_CONFIG is 1, you may choose to use either the native config +// classes under Windows (using .INI files under Win16 and the registry under +// Win32) or the portable text file format used by the config classes under +// Unix. +// +// Default is 1 to use native classes. Note that you may still use +// wxFileConfig even if you set this to 1 - just the config object created by +// default for the applications needs will be a wxRegConfig or wxIniConfig and +// not wxFileConfig. +// +// Recommended setting: 1 +#define wxUSE_CONFIG_NATIVE 1 + +// If wxUSE_DIALUP_MANAGER is 1, compile in wxDialUpManager class which allows +// to connect/disconnect from the network and be notified whenever the dial-up +// network connection is established/terminated. Requires wxUSE_DYNAMIC_LOADER. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_DIALUP_MANAGER 1 + +// Compile in classes for run-time DLL loading and function calling. +// Required by wxUSE_DIALUP_MANAGER. +// +// This setting is for Win32 only +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_DYNLIB_CLASS 1 + +// experimental, don't use for now +#define wxUSE_DYNAMIC_LOADER 1 + +// Set to 1 to use socket classes +#define wxUSE_SOCKETS 1 + +// Set to 1 to enable virtual file systems (required by wxHTML) +#define wxUSE_FILESYSTEM 1 + +// Set to 1 to enable virtual ZIP filesystem (requires wxUSE_FILESYSTEM) +#define wxUSE_FS_ZIP 1 + +// Set to 1 to enable virtual archive filesystem (requires wxUSE_FILESYSTEM) +#define wxUSE_FS_ARCHIVE 1 + +// Set to 1 to enable virtual Internet filesystem (requires wxUSE_FILESYSTEM) +#define wxUSE_FS_INET 1 + +// wxArchive classes for accessing archives such as zip and tar +#define wxUSE_ARCHIVE_STREAMS 1 + +// Set to 1 to compile wxZipInput/OutputStream classes. +#define wxUSE_ZIPSTREAM 1 + +// Set to 1 to compile wxTarInput/OutputStream classes. +#define wxUSE_TARSTREAM 1 + +// Set to 1 to compile wxZlibInput/OutputStream classes. Also required by +// wxUSE_LIBPNG +#define wxUSE_ZLIB 1 + +// If enabled, the code written by Apple will be used to write, in a portable +// way, float on the disk. See extended.c for the license which is different +// from wxWidgets one. +// +// Default is 1. +// +// Recommended setting: 1 unless you don't like the license terms (unlikely) +#define wxUSE_APPLE_IEEE 1 + +// Joystick support class +#define wxUSE_JOYSTICK 1 + +// wxFontMapper class +#define wxUSE_FONTMAP 1 + +// wxMimeTypesManager class +#define wxUSE_MIMETYPE 1 + +// wxProtocol and related classes: if you want to use either of wxFTP, wxHTTP +// or wxURL you need to set this to 1. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_PROTOCOL 1 + +// The settings for the individual URL schemes +#define wxUSE_PROTOCOL_FILE 1 +#define wxUSE_PROTOCOL_FTP 1 +#define wxUSE_PROTOCOL_HTTP 1 + +// Define this to use wxURL class. +#define wxUSE_URL 1 + +// Define this to use native platform url and protocol support. +// Currently valid only for MS-Windows. +// Note: if you set this to 1, you can open ftp/http/gopher sites +// and obtain a valid input stream for these sites +// even when you set wxUSE_PROTOCOL_FTP/HTTP to 0. +// Doing so reduces the code size. +// +// This code is experimental and subject to change. +#define wxUSE_URL_NATIVE 0 + +// Support for wxVariant class used in several places throughout the library, +// notably in wxDataViewCtrl API. +// +// Default is 1. +// +// Recommended setting: 1 unless you want to reduce the library size as much as +// possible in which case setting this to 0 can gain up to 100KB. +#define wxUSE_VARIANT 1 + +// Support for regular expression matching via wxRegEx class: enable this to +// use POSIX regular expressions in your code. You need to compile regex +// library from src/regex to use it under Windows. +// +// Default is 0 +// +// Recommended setting: 1 if your compiler supports it, if it doesn't please +// contribute us a makefile for src/regex for it +#define wxUSE_REGEX 1 + +// wxSystemOptions class +#define wxUSE_SYSTEM_OPTIONS 1 + +// wxSound class +#define wxUSE_SOUND 1 + +// Use wxMediaCtrl +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_MEDIACTRL 1 + +// Use GStreamer for Unix (req a lot of dependancies) +// +// Default is 0 +// +// Recommended setting: 1 (wxMediaCtrl won't work by default without it) +#define wxUSE_GSTREAMER 0 + +// Use wxWidget's XRC XML-based resource system. Recommended. +// +// Default is 1 +// +// Recommended setting: 1 (requires wxUSE_XML) +#define wxUSE_XRC 1 + +// XML parsing classes. Note that their API will change in the future, so +// using wxXmlDocument and wxXmlNode in your app is not recommended. +// +// Default is the same as wxUSE_XRC, i.e. 1 by default. +// +// Recommended setting: 1 (required by XRC) +#define wxUSE_XML wxUSE_XRC + +// Use wxWidget's AUI docking system +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_AUI 1 + + +// Enable the new wxGraphicsPath and wxGraphicsContext classes for an advanced +// 2D drawing API. (Still somewhat experimental) +// +// Please note that on Windows you will need to link with gdiplus.lib (use +// USE_GDIPLUS=1 for makefile builds) and distribute gdiplus.dll with your +// application if you want it to be runnable on pre-XP systems. +// +// Default is 0 +// +// Recommended setting: 1 +#ifndef wxUSE_GRAPHICS_CONTEXT +#define wxUSE_GRAPHICS_CONTEXT 0 +#endif + +// ---------------------------------------------------------------------------- +// Individual GUI controls +// ---------------------------------------------------------------------------- + +// You must set wxUSE_CONTROLS to 1 if you are using any controls at all +// (without it, wxControl class is not compiled) +// +// Default is 1 +// +// Recommended setting: 1 (don't change except for very special programs) +#define wxUSE_CONTROLS 1 + +// wxPopupWindow class is a top level transient window. It is currently used +// to implement wxTipWindow +// +// Default is 1 +// +// Recommended setting: 1 (may be set to 0 if you don't wxUSE_TIPWINDOW) +#define wxUSE_POPUPWIN 1 + +// wxTipWindow allows to implement the custom tooltips, it is used by the +// context help classes. Requires wxUSE_POPUPWIN. +// +// Default is 1 +// +// Recommended setting: 1 (may be set to 0) +#define wxUSE_TIPWINDOW 1 + +// Each of the settings below corresponds to one wxWidgets control. They are +// all switched on by default but may be disabled if you are sure that your +// program (including any standard dialogs it can show!) doesn't need them and +// if you desperately want to save some space. If you use any of these you must +// set wxUSE_CONTROLS as well. +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_ANIMATIONCTRL 1 // wxAnimationCtrl +#define wxUSE_BUTTON 1 // wxButton +#define wxUSE_BMPBUTTON 1 // wxBitmapButton +#define wxUSE_CALENDARCTRL 1 // wxCalendarCtrl +#define wxUSE_CHECKBOX 1 // wxCheckBox +#define wxUSE_CHECKLISTBOX 1 // wxCheckListBox (requires wxUSE_OWNER_DRAWN) +#define wxUSE_CHOICE 1 // wxChoice +#define wxUSE_COLLPANE 1 // wxCollapsiblePane +#define wxUSE_COLOURPICKERCTRL 1 // wxColourPickerCtrl +#define wxUSE_COMBOBOX 1 // wxComboBox +#define wxUSE_DATAVIEWCTRL 1 // wxDataViewCtrl +#define wxUSE_DATEPICKCTRL 1 // wxDatePickerCtrl +#define wxUSE_DIRPICKERCTRL 1 // wxDirPickerCtrl +#define wxUSE_FILEPICKERCTRL 1 // wxFilePickerCtrl +#define wxUSE_FONTPICKERCTRL 1 // wxFontPickerCtrl +#define wxUSE_GAUGE 1 // wxGauge +#define wxUSE_HYPERLINKCTRL 1 // wxHyperlinkCtrl +#define wxUSE_LISTBOX 1 // wxListBox +#define wxUSE_LISTCTRL 1 // wxListCtrl +#define wxUSE_RADIOBOX 1 // wxRadioBox +#define wxUSE_RADIOBTN 1 // wxRadioButton +#define wxUSE_SCROLLBAR 1 // wxScrollBar +#define wxUSE_SEARCHCTRL 1 // wxSearchCtrl +#define wxUSE_SLIDER 1 // wxSlider +#define wxUSE_SPINBTN 1 // wxSpinButton +#define wxUSE_SPINCTRL 1 // wxSpinCtrl +#define wxUSE_STATBOX 1 // wxStaticBox +#define wxUSE_STATLINE 1 // wxStaticLine +#define wxUSE_STATTEXT 1 // wxStaticText +#define wxUSE_STATBMP 1 // wxStaticBitmap +#define wxUSE_TEXTCTRL 1 // wxTextCtrl +#define wxUSE_TOGGLEBTN 1 // requires wxButton +#define wxUSE_TREECTRL 1 // wxTreeCtrl + +// Use a status bar class? Depending on the value of wxUSE_NATIVE_STATUSBAR +// below either wxStatusBar95 or a generic wxStatusBar will be used. +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_STATUSBAR 1 + +// Two status bar implementations are available under Win32: the generic one +// or the wrapper around native control. For native look and feel the native +// version should be used. +// +// Default is 1 for the platforms where native status bar is supported. +// +// Recommended setting: 1 (there is no advantage in using the generic one) +#define wxUSE_NATIVE_STATUSBAR 1 + +// wxToolBar related settings: if wxUSE_TOOLBAR is 0, don't compile any toolbar +// classes at all. Otherwise, use the native toolbar class unless +// wxUSE_TOOLBAR_NATIVE is 0. +// +// Default is 1 for all settings. +// +// Recommended setting: 1 for wxUSE_TOOLBAR and wxUSE_TOOLBAR_NATIVE. +#define wxUSE_TOOLBAR 1 +#define wxUSE_TOOLBAR_NATIVE 1 + +// wxNotebook is a control with several "tabs" located on one of its sides. It +// may be used to logically organise the data presented to the user instead of +// putting everything in one huge dialog. It replaces wxTabControl and related +// classes of wxWin 1.6x. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_NOTEBOOK 1 + +// wxListbook control is similar to wxNotebook but uses wxListCtrl instead of +// the tabs +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_LISTBOOK 1 + +// wxChoicebook control is similar to wxNotebook but uses wxChoice instead of +// the tabs +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_CHOICEBOOK 1 + +// wxTreebook control is similar to wxNotebook but uses wxTreeCtrl instead of +// the tabs +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_TREEBOOK 1 + +// wxToolbook control is similar to wxNotebook but uses wxToolBar instead of +// tabs +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_TOOLBOOK 1 + +// wxTabDialog is a generic version of wxNotebook but it is incompatible with +// the new class. It shouldn't be used in new code. +// +// Default is 0. +// +// Recommended setting: 0 (use wxNotebook) +#define wxUSE_TAB_DIALOG 0 + +// wxGrid class +// +// Default is 1, set to 0 to cut down compilation time and binaries size if you +// don't use it. +// +// Recommended setting: 1 +// +#define wxUSE_GRID 1 + +// wxMiniFrame class: a frame with narrow title bar +// +// Default is 1. +// +// Recommended setting: 1 (it doesn't cost almost anything) +#define wxUSE_MINIFRAME 1 + +// wxComboCtrl and related classes: combobox with custom popup window and +// not necessarily a listbox. +// +// Default is 1. +// +// Recommended setting: 1 but can be safely set to 0 except for wxUniv where it +// it used by wxComboBox +#define wxUSE_COMBOCTRL 1 + +// wxOwnerDrawnComboBox is a custom combobox allowing to paint the combobox +// items. +// +// Default is 1. +// +// Recommended setting: 1 but can be safely set to 0, except where it is +// needed as a base class for generic wxBitmapComboBox. +#define wxUSE_ODCOMBOBOX 1 + +// wxBitmapComboBox is a combobox that can have images in front of text items. +// +// Default is 1. +// +// Recommended setting: 1 but can be safely set to 0 +#define wxUSE_BITMAPCOMBOBOX 1 + +// ---------------------------------------------------------------------------- +// Miscellaneous GUI stuff +// ---------------------------------------------------------------------------- + +// wxAcceleratorTable/Entry classes and support for them in wxMenu(Bar) +#define wxUSE_ACCEL 1 + +// Hotkey support (currently Windows only) +#define wxUSE_HOTKEY 1 + +// Use wxCaret: a class implementing a "cursor" in a text control (called caret +// under Windows). +// +// Default is 1. +// +// Recommended setting: 1 (can be safely set to 0, not used by the library) +#define wxUSE_CARET 1 + +// Use wxDisplay class: it allows enumerating all displays on a system and +// their geometries as well as finding the display on which the given point or +// window lies. +// +// Default is 1. +// +// Recommended setting: 1 if you need it, can be safely set to 0 otherwise +#define wxUSE_DISPLAY 1 + +// Miscellaneous geometry code: needed for Canvas library +#define wxUSE_GEOMETRY 1 + +// Use wxImageList. This class is needed by wxNotebook, wxTreeCtrl and +// wxListCtrl. +// +// Default is 1. +// +// Recommended setting: 1 (set it to 0 if you don't use any of the controls +// enumerated above, then this class is mostly useless too) +#define wxUSE_IMAGLIST 1 + +// Use wxMenu, wxMenuBar, wxMenuItem. +// +// Default is 1. +// +// Recommended setting: 1 (can't be disabled under MSW) +#define wxUSE_MENUS 1 + +// Use wxSashWindow class. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_SASH 1 + +// Use wxSplitterWindow class. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_SPLITTER 1 + +// Use wxToolTip and wxWindow::Set/GetToolTip() methods. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_TOOLTIPS 1 + +// wxValidator class and related methods +#define wxUSE_VALIDATORS 1 + +// ---------------------------------------------------------------------------- +// common dialogs +// ---------------------------------------------------------------------------- + +// On rare occasions (e.g. using DJGPP) may want to omit common dialogs (e.g. +// file selector, printer dialog). Switching this off also switches off the +// printing architecture and interactive wxPrinterDC. +// +// Default is 1 +// +// Recommended setting: 1 (unless it really doesn't work) +#define wxUSE_COMMON_DIALOGS 1 + +// wxBusyInfo displays window with message when app is busy. Works in same way +// as wxBusyCursor +#define wxUSE_BUSYINFO 1 + +// Use single/multiple choice dialogs. +// +// Default is 1 +// +// Recommended setting: 1 (used in the library itself) +#define wxUSE_CHOICEDLG 1 + +// Use colour picker dialog +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_COLOURDLG 1 + +// wxDirDlg class for getting a directory name from user +#define wxUSE_DIRDLG 1 + +// TODO: setting to choose the generic or native one + +// Use file open/save dialogs. +// +// Default is 1 +// +// Recommended setting: 1 (used in many places in the library itself) +#define wxUSE_FILEDLG 1 + +// Use find/replace dialogs. +// +// Default is 1 +// +// Recommended setting: 1 (but may be safely set to 0) +#define wxUSE_FINDREPLDLG 1 + +// Use font picker dialog +// +// Default is 1 +// +// Recommended setting: 1 (used in the library itself) +#define wxUSE_FONTDLG 1 + +// Use wxMessageDialog and wxMessageBox. +// +// Default is 1 +// +// Recommended setting: 1 (used in the library itself) +#define wxUSE_MSGDLG 1 + +// progress dialog class for lengthy operations +#define wxUSE_PROGRESSDLG 1 + +// support for startup tips (wxShowTip &c) +#define wxUSE_STARTUP_TIPS 1 + +// text entry dialog and wxGetTextFromUser function +#define wxUSE_TEXTDLG 1 + +// number entry dialog +#define wxUSE_NUMBERDLG 1 + +// splash screen class +#define wxUSE_SPLASH 1 + +// wizards +#define wxUSE_WIZARDDLG 1 + +// Compile in wxAboutBox() function showing the standard "About" dialog. +// +// Default is 1 +// +// Recommended setting: 1 but can be set to 0 to save some space if you don't +// use this function +#define wxUSE_ABOUTDLG 1 + +// ---------------------------------------------------------------------------- +// Metafiles support +// ---------------------------------------------------------------------------- + +// Windows supports the graphics format known as metafile which is, though not +// portable, is widely used under Windows and so is supported by wxWin (under +// Windows only, of course). Win16 (Win3.1) used the so-called "Window +// MetaFiles" or WMFs which were replaced with "Enhanced MetaFiles" or EMFs in +// Win32 (Win9x, NT, 2000). Both of these are supported in wxWin and, by +// default, WMFs will be used under Win16 and EMFs under Win32. This may be +// changed by setting wxUSE_WIN_METAFILES_ALWAYS to 1 and/or setting +// wxUSE_ENH_METAFILE to 0. You may also set wxUSE_METAFILE to 0 to not compile +// in any metafile related classes at all. +// +// Default is 1 for wxUSE_ENH_METAFILE and 0 for wxUSE_WIN_METAFILES_ALWAYS. +// +// Recommended setting: default or 0 for everything for portable programs. +#define wxUSE_METAFILE 1 +#define wxUSE_ENH_METAFILE 1 +#define wxUSE_WIN_METAFILES_ALWAYS 0 + +// ---------------------------------------------------------------------------- +// Big GUI components +// ---------------------------------------------------------------------------- + +// Set to 0 to disable MDI support. +// +// Requires wxUSE_NOTEBOOK under platforms other than MSW. +// +// Default is 1. +// +// Recommended setting: 1, can be safely set to 0. +#define wxUSE_MDI 1 + +// Set to 0 to disable document/view architecture +#define wxUSE_DOC_VIEW_ARCHITECTURE 1 + +// Set to 0 to disable MDI document/view architecture +// +// Requires wxUSE_MDI && wxUSE_DOC_VIEW_ARCHITECTURE +#define wxUSE_MDI_ARCHITECTURE 1 + +// Set to 0 to disable print/preview architecture code +#define wxUSE_PRINTING_ARCHITECTURE 1 + +// wxHTML sublibrary allows to display HTML in wxWindow programs and much, +// much more. +// +// Default is 1. +// +// Recommended setting: 1 (wxHTML is great!), set to 0 if you want compile a +// smaller library. +#define wxUSE_HTML 1 + +// Setting wxUSE_GLCANVAS to 1 enables OpenGL support. You need to have OpenGL +// headers and libraries to be able to compile the library with wxUSE_GLCANVAS +// set to 1. Note that for some compilers (notably Microsoft Visual C++) you +// will need to manually add opengl32.lib and glu32.lib to the list of +// libraries linked with your program if you use OpenGL. +// +// Default is 0. +// +// Recommended setting: 1 if you intend to use OpenGL, 0 otherwise +#define wxUSE_GLCANVAS 0 + +// wxRichTextCtrl allows editing of styled text. +// +// Default is 1. +// +// Recommended setting: 1, set to 0 if you want compile a +// smaller library. +#define wxUSE_RICHTEXT 1 + +// ---------------------------------------------------------------------------- +// Data transfer +// ---------------------------------------------------------------------------- + +// Use wxClipboard class for clipboard copy/paste. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_CLIPBOARD 1 + +// Use wxDataObject and related classes. Needed for clipboard and OLE drag and +// drop +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_DATAOBJ 1 + +// Use wxDropTarget and wxDropSource classes for drag and drop (this is +// different from "built in" drag and drop in wxTreeCtrl which is always +// available). Requires wxUSE_DATAOBJ. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_DRAG_AND_DROP 1 + +// Use wxAccessible for enhanced and customisable accessibility. +// Depends on wxUSE_OLE. +// +// Default is 0. +// +// Recommended setting (at present): 0 +#define wxUSE_ACCESSIBILITY 0 + +// ---------------------------------------------------------------------------- +// miscellaneous settings +// ---------------------------------------------------------------------------- + +// wxSingleInstanceChecker class allows to verify at startup if another program +// instance is running (it is only available under Win32) +// +// Default is 1 +// +// Recommended setting: 1 (the class is tiny, disabling it won't save much +// space) +#define wxUSE_SNGLINST_CHECKER 1 + +#define wxUSE_DRAGIMAGE 1 + +#define wxUSE_IPC 1 + // 0 for no interprocess comms +#define wxUSE_HELP 1 + // 0 for no help facility + +// Should we use MS HTML help for wxHelpController? If disabled, neither +// wxCHMHelpController nor wxBestHelpController are available. +// +// Default is 1 under MSW, 0 is always used for the other platforms. +// +// Recommended setting: 1, only set to 0 if you have trouble compiling +// wxCHMHelpController (could be a problem with really ancient compilers) +#define wxUSE_MS_HTML_HELP 1 + + +// Use wxHTML-based help controller? +#define wxUSE_WXHTML_HELP 1 + +#define wxUSE_RESOURCES 0 + // 0 for no wxGetResource/wxWriteResource +#define wxUSE_CONSTRAINTS 1 + // 0 for no window layout constraint system + +#define wxUSE_SPLINES 1 + // 0 for no splines + +#define wxUSE_MOUSEWHEEL 1 + // Include mouse wheel support + +// ---------------------------------------------------------------------------- +// postscript support settings +// ---------------------------------------------------------------------------- + +// Set to 1 for PostScript device context. +#define wxUSE_POSTSCRIPT 0 + +// Set to 1 to use font metric files in GetTextExtent +#define wxUSE_AFM_FOR_POSTSCRIPT 1 + +// ---------------------------------------------------------------------------- +// database classes +// ---------------------------------------------------------------------------- + +// Define 1 to use ODBC classes +#define wxUSE_ODBC 0 + +// For backward compatibility reasons, this parameter now only controls the +// default scrolling method used by cursors. This default behavior can be +// overriden by setting the second param of wxDB::wxDbGetConnection() or +// wxDb() constructor to indicate whether the connection (and any wxDbTable()s +// that use the connection) should support forward only scrolling of cursors, +// or both forward and backward support for backward scrolling cursors is +// dependent on the data source as well as the ODBC driver being used. +#define wxODBC_FWD_ONLY_CURSORS 1 + +// Default is 0. Set to 1 to use the deprecated classes, enum types, function, +// member variables. With a setting of 1, full backward compatibility with the +// 2.0.x release is possible. It is STRONGLY recommended that this be set to 0, +// as future development will be done only on the non-deprecated +// functions/classes/member variables/etc. +#define wxODBC_BACKWARD_COMPATABILITY 0 + +// ---------------------------------------------------------------------------- +// other compiler (mis)features +// ---------------------------------------------------------------------------- + +// Set this to 0 if your compiler can't cope with omission of prototype +// parameters. +// +// Default is 1. +// +// Recommended setting: 1 (should never need to set this to 0) +#define REMOVE_UNUSED_ARG 1 + +// VC++ 4.2 and above allows <iostream> and <iostream.h> but you can't mix +// them. Set to 1 for <iostream.h>, 0 for <iostream>. Note that VC++ 7.1 +// and later doesn't support wxUSE_IOSTREAMH == 1 and so <iostream> will be +// used anyhow. +// +// Default is 1. +// +// Recommended setting: whatever your compiler likes more +#define wxUSE_IOSTREAMH 1 + +// ---------------------------------------------------------------------------- +// image format support +// ---------------------------------------------------------------------------- + +// wxImage supports many different image formats which can be configured at +// compile-time. BMP is always supported, others are optional and can be safely +// disabled if you don't plan to use images in such format sometimes saving +// substantial amount of code in the final library. +// +// Some formats require an extra library which is included in wxWin sources +// which is mentioned if it is the case. + +// Set to 1 for wxImage support (recommended). +#define wxUSE_IMAGE 1 + +// Set to 1 for PNG format support (requires libpng). Also requires wxUSE_ZLIB. +#define wxUSE_LIBPNG 1 + +// Set to 1 for JPEG format support (requires libjpeg) +#define wxUSE_LIBJPEG 1 + +// Set to 1 for TIFF format support (requires libtiff) +#define wxUSE_LIBTIFF 1 + +// Set to 1 for TGA format support (loading only) +#define wxUSE_TGA 1 + +// Set to 1 for GIF format support +#define wxUSE_GIF 1 + +// Set to 1 for PNM format support +#define wxUSE_PNM 1 + +// Set to 1 for PCX format support +#define wxUSE_PCX 1 + +// Set to 1 for IFF format support (Amiga format) +#define wxUSE_IFF 0 + +// Set to 1 for XPM format support +#define wxUSE_XPM 1 + +// Set to 1 for MS Icons and Cursors format support +#define wxUSE_ICO_CUR 1 + +// Set to 1 to compile in wxPalette class +#define wxUSE_PALETTE 1 + +// ---------------------------------------------------------------------------- +// wxUniversal-only options +// ---------------------------------------------------------------------------- + +// Set to 1 to enable compilation of all themes, this is the default +#define wxUSE_ALL_THEMES 1 + +// Set to 1 to enable the compilation of individual theme if wxUSE_ALL_THEMES +// is unset, if it is set these options are not used; notice that metal theme +// uses Win32 one +#define wxUSE_THEME_GTK 0 +#define wxUSE_THEME_METAL 0 +#define wxUSE_THEME_MONO 0 +#define wxUSE_THEME_WIN32 0 + + +/* --- end common options --- */ + +// ---------------------------------------------------------------------------- +// general Windows-specific stuff +// ---------------------------------------------------------------------------- + +// Set this to 1 for generic OLE support: this is required for drag-and-drop, +// clipboard, OLE Automation. Only set it to 0 if your compiler is very old and +// can't compile/doesn't have the OLE headers. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_OLE 1 + +// Set this to 1 to enable wxDIB (don't change unless you have reason to) +#define wxUSE_WXDIB 1 + +// ---------------------------------------------------------------------------- +// Windows CE specific stuff +// ---------------------------------------------------------------------------- + +// list of things which don't make sense under Windows CE in alphabetical order +// (please keep it!) +// +// NB: stuff which doesn't work at all under CE is forcefully disabled in +// wx/msw/wince/chkconf.h + +// Windows CE doesn't use RAS so wxDialUpManager doesn't work under it +#undef wxUSE_DIALUP_MANAGER +#define wxUSE_DIALUP_MANAGER 0 + +#undef wxUSE_DRAG_AND_DROP +#define wxUSE_DRAG_AND_DROP 0 + +#undef wxUSE_FSVOLUME +#define wxUSE_FSVOLUME 0 + +// MDI is not supported under CE +#undef wxUSE_MDI +#define wxUSE_MDI 0 + +#undef wxUSE_MDI_ARCHITECTURE +#define wxUSE_MDI_ARCHITECTURE 0 + +// there is no difference between frame and mini frame decorations under CE +#undef wxUSE_MINIFRAME +#define wxUSE_MINIFRAME 0 + +// no CHM support under CE +#undef wxUSE_MS_HTML_HELP +#define wxUSE_MS_HTML_HELP 0 + +// ??? +#undef wxUSE_OWNER_DRAWN +#define wxUSE_OWNER_DRAWN 0 + +// there is usually no printer attached to a PDA... +#undef wxUSE_PRINTING_ARCHITECTURE +#define wxUSE_PRINTING_ARCHITECTURE 0 + +// doesn't make much sense in absence of mouse... +#undef wxUSE_TOOLTIPS +#define wxUSE_TOOLTIPS 0 + +// Do use commdlg.h +#undef wxUSE_COMMON_DIALOGS +#define wxUSE_COMMON_DIALOGS 1 + +// don't use wxRichTextCtrl on WinCE yet, it's not ready, plus it's +// probably overkill for a WinCE environment. +#undef wxUSE_RICHTEXT +#define wxUSE_RICHTEXT 0 + +// ---------------------------------------------------------------------------- +// Crash debugging helpers +// ---------------------------------------------------------------------------- + +// Set this to 1 to be able to use wxCrashReport::Generate() to create mini +// dumps of your program when it crashes (or at any other moment) +// +// Default is 1 if supported by the compiler (VC++ and recent BC++ only). +// +// Recommended setting: 1, set to 0 if your programs never crash +#define wxUSE_CRASHREPORT 0 + +// ---------------------------------------------------------------------------- +// obsolete MSW settings, don't change +// ---------------------------------------------------------------------------- + +#define wxUSE_POSTSCRIPT_ARCHITECTURE_IN_MSW 0 + +#endif // _WX_SETUP_H_ diff --git a/Externals/wxWidgets/include/wx/msw/wince/smartphone.rc b/Externals/wxWidgets/include/wx/msw/wince/smartphone.rc new file mode 100644 index 0000000000..2be02497d3 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/wince/smartphone.rc @@ -0,0 +1,67 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/wince/smartphone.h +// Purpose: resources for MS Smartphone build +// Author: Wlodzimierz ABX Skiba +// Modified by: +// Created: 01.05.2004 +// RCS-ID: $Id: smartphone.rc 30036 2004-10-20 15:14:46Z VZ $ +// Copyright: (c) Wlodzimierz Skiba +// License: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#include <aygshell.h> + +#include "wx/msw/wince/resources.h" + +STRINGTABLE +BEGIN + IDS_EMPTY "" +END + +IDR_POPUP_1 MENU +BEGIN + POPUP "" + BEGIN + MENUITEM "M", IDM_ITEM + END +END + +IDR_POPUP_2 MENU +BEGIN + POPUP "" + BEGIN + MENUITEM "M", IDM_ITEM + END + POPUP "" + BEGIN + MENUITEM "M", IDM_ITEM + END +END + +IDR_MENUBAR_ONE_BUTTON RCDATA +BEGIN + 0,2, + I_IMAGENONE, IDM_LEFT, TBSTATE_ENABLED, TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE, IDS_EMPTY, 0, NOMENU, + I_IMAGENONE, IDM_RIGHT, TBSTATE_ENABLED, TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE, IDS_EMPTY, 0, NOMENU, +END + +IDR_MENUBAR_LEFT_MENU RCDATA +BEGIN + IDR_POPUP_1,1, + I_IMAGENONE, IDM_LEFT, TBSTATE_ENABLED, TBSTYLE_DROPDOWN | TBSTYLE_AUTOSIZE, IDS_EMPTY, 0, 0, +END + +IDR_MENUBAR_RIGHT_MENU RCDATA +BEGIN + IDR_POPUP_1,2, + I_IMAGENONE, IDM_LEFT, TBSTATE_ENABLED, TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE, IDS_EMPTY, 0, NOMENU, + I_IMAGENONE, IDM_RIGHT, TBSTATE_ENABLED, TBSTYLE_DROPDOWN | TBSTYLE_AUTOSIZE, IDS_EMPTY, 0, 0, +END + +IDR_MENUBAR_BOTH_MENUS RCDATA +BEGIN + IDR_POPUP_2,2, + I_IMAGENONE, IDM_LEFT, TBSTATE_ENABLED, TBSTYLE_DROPDOWN | TBSTYLE_AUTOSIZE, IDS_EMPTY, 0, 0, + I_IMAGENONE, IDM_RIGHT, TBSTATE_ENABLED, TBSTYLE_DROPDOWN | TBSTYLE_AUTOSIZE, IDS_EMPTY, 0, 1, +END + diff --git a/Externals/wxWidgets/include/wx/msw/wince/tbarwce.h b/Externals/wxWidgets/include/wx/msw/wince/tbarwce.h new file mode 100644 index 0000000000..9b3ab5f833 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/wince/tbarwce.h @@ -0,0 +1,168 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/wince/tbarwce.h +// Purpose: Windows CE wxToolBar class +// Author: Julian Smart +// Modified by: +// Created: 2003-07-12 +// RCS-ID: $Id: tbarwce.h 35650 2005-09-23 12:56:45Z MR $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_BARWCE_H_ +#define _WX_BARWCE_H_ + +#if wxUSE_TOOLBAR + +#include "wx/dynarray.h" + +// Smartphones don't have toolbars, so use a dummy class +#ifdef __SMARTPHONE__ + +class WXDLLEXPORT wxToolBar : public wxToolBarBase +{ +public: + // ctors and dtor + wxToolBar() { } + + wxToolBar(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxNO_BORDER | wxTB_HORIZONTAL, + const wxString& name = wxToolBarNameStr) + { + Create(parent, id, pos, size, style, name); + } + + bool Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxNO_BORDER | wxTB_HORIZONTAL, + const wxString& name = wxToolBarNameStr); + + // override/implement base class virtuals + virtual wxToolBarToolBase *FindToolForPosition(wxCoord x, wxCoord y) const; + virtual bool Realize() { return true; } + +protected: + // implement base class pure virtuals + virtual bool DoInsertTool(size_t pos, wxToolBarToolBase *tool); + virtual bool DoDeleteTool(size_t pos, wxToolBarToolBase *tool); + + virtual void DoEnableTool(wxToolBarToolBase *tool, bool enable); + virtual void DoToggleTool(wxToolBarToolBase *tool, bool toggle); + virtual void DoSetToggle(wxToolBarToolBase *tool, bool toggle); + + virtual wxToolBarToolBase *CreateTool(int id, + const wxString& label, + const wxBitmap& bmpNormal, + const wxBitmap& bmpDisabled, + wxItemKind kind, + wxObject *clientData, + const wxString& shortHelp, + const wxString& longHelp); + virtual wxToolBarToolBase *CreateTool(wxControl *control); + +private: + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS(wxToolBar) + DECLARE_NO_COPY_CLASS(wxToolBar) +}; + +#else + +// For __POCKETPC__ + +#include "wx/msw/tbar95.h" + +class WXDLLEXPORT wxToolMenuBar : public wxToolBar +{ +public: + // ctors and dtor + wxToolMenuBar() { Init(); } + + wxToolMenuBar(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxNO_BORDER | wxTB_HORIZONTAL, + const wxString& name = wxToolBarNameStr, + wxMenuBar* menuBar = NULL) + { + Init(); + + Create(parent, id, pos, size, style, name, menuBar); + } + + bool Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxNO_BORDER | wxTB_HORIZONTAL, + const wxString& name = wxToolBarNameStr, + wxMenuBar* menuBar = NULL); + + virtual ~wxToolMenuBar(); + + // override/implement base class virtuals + virtual bool Realize(); + + // implementation only from now on + // ------------------------------- + + // Override in order to bypass wxToolBar's overridden function + virtual WXLRESULT MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam); + + virtual bool MSWCommand(WXUINT param, WXWORD id); + + // Return HMENU for the menu associated with the commandbar + WXHMENU GetHMenu(); + + // Set the wxMenuBar associated with this commandbar + void SetMenuBar(wxMenuBar* menuBar) { m_menuBar = menuBar; } + + // Returns the wxMenuBar associated with this commandbar + wxMenuBar* GetMenuBar() const { return m_menuBar; } + +protected: + // common part of all ctors + void Init(); + + // create the native toolbar control + bool MSWCreateToolbar(const wxPoint& pos, const wxSize& size, wxMenuBar* menuBar); + + // recreate the control completely + void Recreate(); + + // implement base class pure virtuals + virtual bool DoInsertTool(size_t pos, wxToolBarToolBase *tool); + virtual bool DoDeleteTool(size_t pos, wxToolBarToolBase *tool); + + virtual wxToolBarToolBase *CreateTool(int id, + const wxString& label, + const wxBitmap& bmpNormal, + const wxBitmap& bmpDisabled, + wxItemKind kind, + wxObject *clientData, + const wxString& shortHelp, + const wxString& longHelp); + virtual wxToolBarToolBase *CreateTool(wxControl *control); + + // The menubar associated with this toolbar + wxMenuBar* m_menuBar; + +private: + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS(wxToolMenuBar) + DECLARE_NO_COPY_CLASS(wxToolMenuBar) +}; + +#endif + // __SMARTPHONE__ + +#endif // wxUSE_TOOLBAR + +#endif + // _WX_BARWCE_H_ diff --git a/Externals/wxWidgets/include/wx/msw/wince/textctrlce.h b/Externals/wxWidgets/include/wx/msw/wince/textctrlce.h new file mode 100644 index 0000000000..3961010e2f --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/wince/textctrlce.h @@ -0,0 +1,236 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/wince/textctrlce.h +// Purpose: wxTextCtrl implementation for smart phones driven by WinCE +// Author: Wlodzimierz ABX Skiba +// Modified by: +// Created: 30.08.2004 +// RCS-ID: $Id: textctrlce.h 41739 2006-10-08 17:46:12Z VZ $ +// Copyright: (c) Wlodzimierz Skiba +// License: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_TEXTCTRLCE_H_ +#define _WX_TEXTCTRLCE_H_ + +#include "wx/dynarray.h" + +class WXDLLEXPORT wxTextCtrl; +WX_DEFINE_EXPORTED_ARRAY_PTR(wxTextCtrl *, wxArrayTextSpins); + +class WXDLLEXPORT wxTextCtrl : public wxTextCtrlBase +{ +public: + // creation + // -------- + + wxTextCtrl() { Init(); } + wxTextCtrl(wxWindow *parent, wxWindowID id, + const wxString& value = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxTextCtrlNameStr) + { + Init(); + + Create(parent, id, value, pos, size, style, validator, name); + } + virtual ~wxTextCtrl(); + + bool Create(wxWindow *parent, wxWindowID id, + const wxString& value = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxTextCtrlNameStr); + + // implement base class pure virtuals + // ---------------------------------- + + virtual wxString GetValue() const; + virtual void SetValue(const wxString& value) { DoSetValue(value, SetValue_SendEvent); } + + virtual void ChangeValue(const wxString &value) { DoSetValue(value); } + + virtual wxString GetRange(long from, long to) const; + + virtual int GetLineLength(long lineNo) const; + virtual wxString GetLineText(long lineNo) const; + virtual int GetNumberOfLines() const; + + virtual bool IsModified() const; + virtual bool IsEditable() const; + + virtual void GetSelection(long* from, long* to) const; + + // operations + // ---------- + + // editing + virtual void Clear(); + virtual void Replace(long from, long to, const wxString& value); + virtual void Remove(long from, long to); + + // load the controls contents from the file + virtual bool LoadFile(const wxString& file); + + // clears the dirty flag + virtual void MarkDirty(); + virtual void DiscardEdits(); + + virtual void SetMaxLength(unsigned long len); + + // writing text inserts it at the current position, appending always + // inserts it at the end + virtual void WriteText(const wxString& text); + virtual void AppendText(const wxString& text); + + // translate between the position (which is just an index in the text ctrl + // considering all its contents as a single strings) and (x, y) coordinates + // which represent column and line. + virtual long XYToPosition(long x, long y) const; + virtual bool PositionToXY(long pos, long *x, long *y) const; + + virtual void ShowPosition(long pos); + virtual wxTextCtrlHitTestResult HitTest(const wxPoint& pt, long *pos) const; + virtual wxTextCtrlHitTestResult HitTest(const wxPoint& pt, + wxTextCoord *col, + wxTextCoord *row) const + { + return wxTextCtrlBase::HitTest(pt, col, row); + } + + // Clipboard operations + virtual void Copy(); + virtual void Cut(); + virtual void Paste(); + + virtual bool CanCopy() const; + virtual bool CanCut() const; + virtual bool CanPaste() const; + + // Undo/redo + virtual void Undo(); + virtual void Redo(); + + virtual bool CanUndo() const; + virtual bool CanRedo() const; + + // Insertion point + virtual void SetInsertionPoint(long pos); + virtual void SetInsertionPointEnd(); + virtual long GetInsertionPoint() const; + virtual wxTextPos GetLastPosition() const; + + virtual void SetSelection(long from, long to); + virtual void SetEditable(bool editable); + + // Caret handling (Windows only) + + bool ShowNativeCaret(bool show = true); + bool HideNativeCaret() { return ShowNativeCaret(false); } + + // Implementation from now on + // -------------------------- + + virtual void Command(wxCommandEvent& event); + virtual bool MSWCommand(WXUINT param, WXWORD id); + + virtual void AdoptAttributesFromHWND(); + + virtual bool AcceptsFocus() const; + + // callbacks + void OnDropFiles(wxDropFilesEvent& event); + void OnChar(wxKeyEvent& event); // Process 'enter' if required + + void OnCut(wxCommandEvent& event); + void OnCopy(wxCommandEvent& event); + void OnPaste(wxCommandEvent& event); + void OnUndo(wxCommandEvent& event); + void OnRedo(wxCommandEvent& event); + void OnDelete(wxCommandEvent& event); + void OnSelectAll(wxCommandEvent& event); + + void OnUpdateCut(wxUpdateUIEvent& event); + void OnUpdateCopy(wxUpdateUIEvent& event); + void OnUpdatePaste(wxUpdateUIEvent& event); + void OnUpdateUndo(wxUpdateUIEvent& event); + void OnUpdateRedo(wxUpdateUIEvent& event); + void OnUpdateDelete(wxUpdateUIEvent& event); + void OnUpdateSelectAll(wxUpdateUIEvent& event); + + // Show a context menu for Rich Edit controls (the standard + // EDIT control has one already) + void OnRightClick(wxMouseEvent& event); + + // be sure the caret remains invisible if the user + // called HideNativeCaret() before + void OnSetFocus(wxFocusEvent& event); + + // get the subclassed window proc of the buddy + WXFARPROC GetBuddyWndProc() const { return m_wndProcBuddy; } + + // intercept WM_GETDLGCODE + virtual WXLRESULT MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam); + +protected: + // common part of all ctors + void Init(); + + // call this to increase the size limit (will do nothing if the current + // limit is big enough) + // + // returns true if we increased the limit to allow entering more text, + // false if we hit the limit set by SetMaxLength() and so didn't change it + bool AdjustSpaceLimit(); + + void DoSetValue(const wxString &value, int flags = 0); + + // replace the contents of the selection or of the entire control with the + // given text + void DoWriteText(const wxString& text, int flags = SetValue_SelectionOnly); + + // set the selection possibly without scrolling the caret into view + void DoSetSelection(long from, long to, bool scrollCaret = true); + + // return true if there is a non empty selection in the control + bool HasSelection() const; + + // get the length of the line containing the character at the given + // position + long GetLengthOfLineContainingPos(long pos) const; + + // send TEXT_UPDATED event, return true if it was handled, false otherwise + bool SendUpdateEvent(); + + // override some base class virtuals + virtual void DoMoveWindow(int x, int y, int width, int height); + virtual wxSize DoGetBestSize() const; + + virtual WXDWORD MSWGetStyle(long style, WXDWORD *exstyle) const; + + // if true, SendUpdateEvent() will eat the next event (see comments in the + // code as to why this is needed) + bool m_suppressNextUpdate; + + // all existing wxTextCtrl - this allows to find the one corresponding to + // the given buddy window in GetSpinTextCtrl() + static wxArrayTextSpins ms_allTextSpins; + +protected: + + // the data for the "buddy" list + WXHWND m_hwndBuddy; + WXFARPROC m_wndProcBuddy; + +private: + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS_NO_COPY(wxTextCtrl) + + bool m_isNativeCaretShown; +}; + +#endif // _WX_TEXTCTRLCE_H_ diff --git a/Externals/wxWidgets/include/wx/msw/wince/time.h b/Externals/wxWidgets/include/wx/msw/wince/time.h new file mode 100644 index 0000000000..4eafc18986 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/wince/time.h @@ -0,0 +1,53 @@ + +/* + * time.h + * Missing time functions and structures for use under WinCE + */ + +#ifndef _WX_MSW_WINCE_TIME_H_ +#define _WX_MSW_WINCE_TIME_H_ + +#ifndef _TM_DEFINED + +#define _TM_DEFINED + +struct tm { + int tm_sec; /* seconds after the minute - [0,59] */ + int tm_min; /* minutes after the hour - [0,59] */ + int tm_hour; /* hours since midnight - [0,23] */ + int tm_mday; /* day of the month - [1,31] */ + int tm_mon; /* months since January - [0,11] */ + int tm_year; /* years since 1900 */ + int tm_wday; /* days since Sunday - [0,6] */ + int tm_yday; /* days since January 1 - [0,365] */ + int tm_isdst; /* daylight savings time flag */ + }; + +extern "C" +{ + +time_t __cdecl time(time_t *); + +time_t __cdecl mktime(struct tm *); + +// VC8 CRT provides the other functions +#if !defined(__VISUALC__) || (__VISUALC__ < 1400) + +struct tm * __cdecl localtime(const time_t *); + +struct tm * __cdecl gmtime(const time_t *); + +#define _tcsftime wcsftime + +size_t __cdecl wcsftime(wchar_t *, size_t, const wchar_t *, const struct tm *); + +extern long timezone; + +#endif // !VC8 + +} + +#endif // !_TM_DEFINED + +#endif // _WX_MSW_WINCE_TIME_H_ + diff --git a/Externals/wxWidgets/include/wx/msw/wince/wince.rc b/Externals/wxWidgets/include/wx/msw/wince/wince.rc new file mode 100644 index 0000000000..1c2e85ffe5 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/wince/wince.rc @@ -0,0 +1,26 @@ +#include <commctrl.h> + +#ifdef WIN32_PLATFORM_WFSP + #include "wx/msw/wince/smartphone.rc" +#else + +// Dummy menubar/toolbar for WinCE + +5000 RCDATA DISCARDABLE +BEGIN + // Popup menu name + 5000, + // Count of items to put on the menu + 0 +END + +5000 MENU DISCARDABLE +BEGIN + POPUP "Dummy" + BEGIN + MENUITEM "Dummy" 99 + END +END + +#endif + diff --git a/Externals/wxWidgets/include/wx/msw/window.h b/Externals/wxWidgets/include/wx/msw/window.h new file mode 100644 index 0000000000..b981f2f504 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/window.h @@ -0,0 +1,597 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/window.h +// Purpose: wxWindowMSW class +// Author: Julian Smart +// Modified by: Vadim Zeitlin on 13.05.99: complete refont of message handling, +// elimination of Default(), ... +// Created: 01/02/97 +// RCS-ID: $Id: window.h 47962 2007-08-08 12:38:13Z JS $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_WINDOW_H_ +#define _WX_WINDOW_H_ + +// --------------------------------------------------------------------------- +// constants +// --------------------------------------------------------------------------- + +#if WXWIN_COMPATIBILITY_2_4 +// they're unused by wxWidgets... +enum +{ + wxKEY_SHIFT = 1, + wxKEY_CTRL = 2 +}; +#endif + +// --------------------------------------------------------------------------- +// wxWindow declaration for MSW +// --------------------------------------------------------------------------- + +class WXDLLEXPORT wxWindowMSW : public wxWindowBase +{ + friend class wxSpinCtrl; + friend class wxSlider; + friend class wxRadioBox; +#if defined __VISUALC__ && __VISUALC__ <= 1200 + friend class wxWindowMSW; +#endif +public: + wxWindowMSW() { Init(); } + + wxWindowMSW(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxPanelNameStr) + { + Init(); + Create(parent, id, pos, size, style, name); + } + + virtual ~wxWindowMSW(); + + bool Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxPanelNameStr); + + // implement base class pure virtuals + virtual void SetLabel(const wxString& label); + virtual wxString GetLabel() const; + + virtual void Raise(); + virtual void Lower(); + + virtual bool Show( bool show = true ); + virtual bool Enable( bool enable = true ); + + virtual void SetFocus(); + virtual void SetFocusFromKbd(); + + virtual bool Reparent(wxWindowBase *newParent); + + virtual void WarpPointer(int x, int y); + + virtual void Refresh( bool eraseBackground = true, + const wxRect *rect = (const wxRect *) NULL ); + virtual void Update(); + virtual void Freeze(); + virtual void Thaw(); + virtual bool IsFrozen() const { return m_frozenness > 0; } + + virtual void SetWindowStyleFlag(long style); + virtual void SetExtraStyle(long exStyle); + virtual bool SetCursor( const wxCursor &cursor ); + virtual bool SetFont( const wxFont &font ); + + virtual int GetCharHeight() const; + virtual int GetCharWidth() const; + virtual void GetTextExtent(const wxString& string, + int *x, int *y, + int *descent = (int *) NULL, + int *externalLeading = (int *) NULL, + const wxFont *theFont = (const wxFont *) NULL) + const; + + virtual void SetScrollbar( int orient, int pos, int thumbVisible, + int range, bool refresh = true ); + virtual void SetScrollPos( int orient, int pos, bool refresh = true ); + virtual int GetScrollPos( int orient ) const; + virtual int GetScrollThumb( int orient ) const; + virtual int GetScrollRange( int orient ) const; + virtual void ScrollWindow( int dx, int dy, + const wxRect* rect = (wxRect *) NULL ); + + virtual bool ScrollLines(int lines); + virtual bool ScrollPages(int pages); + + virtual void SetLayoutDirection(wxLayoutDirection dir); + virtual wxLayoutDirection GetLayoutDirection() const; + virtual wxCoord AdjustForLayoutDirection(wxCoord x, + wxCoord width, + wxCoord widthTotal) const; + +#if wxUSE_DRAG_AND_DROP + virtual void SetDropTarget( wxDropTarget *dropTarget ); +#endif // wxUSE_DRAG_AND_DROP + + // Accept files for dragging + virtual void DragAcceptFiles(bool accept); + +#if WXWIN_COMPATIBILITY_2_4 + wxDEPRECATED( bool GetUseCtl3D() const ); + wxDEPRECATED( bool GetTransparentBackground() const ); + wxDEPRECATED( void SetTransparent(bool t = true) ); +#endif // WXWIN_COMPATIBILITY_2_4 + +#ifndef __WXUNIVERSAL__ + // Native resource loading (implemented in src/msw/nativdlg.cpp) + // FIXME: should they really be all virtual? + virtual bool LoadNativeDialog(wxWindow* parent, wxWindowID& id); + virtual bool LoadNativeDialog(wxWindow* parent, const wxString& name); + wxWindow* GetWindowChild1(wxWindowID id); + wxWindow* GetWindowChild(wxWindowID id); +#endif // __WXUNIVERSAL__ + +#if wxUSE_HOTKEY + // install and deinstall a system wide hotkey + virtual bool RegisterHotKey(int hotkeyId, int modifiers, int keycode); + virtual bool UnregisterHotKey(int hotkeyId); +#endif // wxUSE_HOTKEY + +#ifdef __POCKETPC__ + bool IsContextMenuEnabled() const { return m_contextMenuEnabled; } + void EnableContextMenu(bool enable = true) { m_contextMenuEnabled = enable; } +#endif + + // window handle stuff + // ------------------- + + WXHWND GetHWND() const { return m_hWnd; } + void SetHWND(WXHWND hWnd) { m_hWnd = hWnd; } + virtual WXWidget GetHandle() const { return GetHWND(); } + + void AssociateHandle(WXWidget handle); + void DissociateHandle(); + + // does this window have deferred position and/or size? + bool IsSizeDeferred() const; + + + // implementation from now on + // ========================== + + // event handlers + // -------------- + + void OnPaint(wxPaintEvent& event); + void OnEraseBackground(wxEraseEvent& event); +#ifdef __WXWINCE__ + void OnInitDialog(wxInitDialogEvent& event); +#endif + +public: + // Windows subclassing + void SubclassWin(WXHWND hWnd); + void UnsubclassWin(); + + WXFARPROC MSWGetOldWndProc() const { return m_oldWndProc; } + void MSWSetOldWndProc(WXFARPROC proc) { m_oldWndProc = proc; } + + // return true if the window is of a standard (i.e. not wxWidgets') class + // + // to understand why does it work, look at SubclassWin() code and comments + bool IsOfStandardClass() const { return m_oldWndProc != NULL; } + + wxWindow *FindItem(long id) const; + wxWindow *FindItemByHWND(WXHWND hWnd, bool controlOnly = false) const; + + // MSW only: true if this control is part of the main control + virtual bool ContainsHWND(WXHWND WXUNUSED(hWnd)) const { return false; } + +#if wxUSE_TOOLTIPS + // MSW only: true if this window or any of its children have a tooltip + virtual bool HasToolTips() const { return GetToolTip() != NULL; } +#endif // wxUSE_TOOLTIPS + + // translate wxWidgets style flags for this control into the Windows style + // and optional extended style for the corresponding native control + // + // this is the function that should be overridden in the derived classes, + // but you will mostly use MSWGetCreateWindowFlags() below + virtual WXDWORD MSWGetStyle(long flags, WXDWORD *exstyle = NULL) const ; + + // get the MSW window flags corresponding to wxWidgets ones + // + // the functions returns the flags (WS_XXX) directly and puts the ext + // (WS_EX_XXX) flags into the provided pointer if not NULL + WXDWORD MSWGetCreateWindowFlags(WXDWORD *exflags = NULL) const + { return MSWGetStyle(GetWindowStyle(), exflags); } + + // update the real underlying window style flags to correspond to the + // current wxWindow object style (safe to call even if window isn't fully + // created yet) + void MSWUpdateStyle(long flagsOld, long exflagsOld); + +#if wxABI_VERSION >= 20805 + // Helper for getting an appropriate theme style for the application. Unnecessary in + // 2.9 and above. + wxBorder GetThemedBorderStyle() const; +#endif + + // translate wxWidgets coords into Windows ones suitable to be passed to + // ::CreateWindow() + // + // returns true if non default coords are returned, false otherwise + bool MSWGetCreateWindowCoords(const wxPoint& pos, + const wxSize& size, + int& x, int& y, + int& w, int& h) const; + + // get the HWND to be used as parent of this window with CreateWindow() + virtual WXHWND MSWGetParent() const; + + // creates the window of specified Windows class with given style, extended + // style, title and geometry (default values + // + // returns true if the window has been created, false if creation failed + bool MSWCreate(const wxChar *wclass, + const wxChar *title = NULL, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + WXDWORD style = 0, + WXDWORD exendedStyle = 0); + + virtual bool MSWCommand(WXUINT param, WXWORD id); + +#ifndef __WXUNIVERSAL__ + // Create an appropriate wxWindow from a HWND + virtual wxWindow* CreateWindowFromHWND(wxWindow* parent, WXHWND hWnd); + + // Make sure the window style reflects the HWND style (roughly) + virtual void AdoptAttributesFromHWND(); +#endif // __WXUNIVERSAL__ + + // Setup background and foreground colours correctly + virtual void SetupColours(); + + // ------------------------------------------------------------------------ + // helpers for message handlers: these perform the same function as the + // message crackers from <windowsx.h> - they unpack WPARAM and LPARAM into + // the correct parameters + // ------------------------------------------------------------------------ + + void UnpackCommand(WXWPARAM wParam, WXLPARAM lParam, + WXWORD *id, WXHWND *hwnd, WXWORD *cmd); + void UnpackActivate(WXWPARAM wParam, WXLPARAM lParam, + WXWORD *state, WXWORD *minimized, WXHWND *hwnd); + void UnpackScroll(WXWPARAM wParam, WXLPARAM lParam, + WXWORD *code, WXWORD *pos, WXHWND *hwnd); + void UnpackCtlColor(WXWPARAM wParam, WXLPARAM lParam, + WXHDC *hdc, WXHWND *hwnd); + void UnpackMenuSelect(WXWPARAM wParam, WXLPARAM lParam, + WXWORD *item, WXWORD *flags, WXHMENU *hmenu); + + // ------------------------------------------------------------------------ + // internal handlers for MSW messages: all handlers return a boolean value: + // true means that the handler processed the event and false that it didn't + // ------------------------------------------------------------------------ + + // there are several cases where we have virtual functions for Windows + // message processing: this is because these messages often require to be + // processed in a different manner in the derived classes. For all other + // messages, however, we do *not* have corresponding MSWOnXXX() function + // and if the derived class wants to process them, it should override + // MSWWindowProc() directly. + + // scroll event (both horizontal and vertical) + virtual bool MSWOnScroll(int orientation, WXWORD nSBCode, + WXWORD pos, WXHWND control); + + // child control notifications + virtual bool MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result); + + // owner-drawn controls need to process these messages + virtual bool MSWOnDrawItem(int id, WXDRAWITEMSTRUCT *item); + virtual bool MSWOnMeasureItem(int id, WXMEASUREITEMSTRUCT *item); + + // the rest are not virtual + bool HandleCreate(WXLPCREATESTRUCT cs, bool *mayCreate); + bool HandleInitDialog(WXHWND hWndFocus); + bool HandleDestroy(); + + bool HandlePaint(); + bool HandlePrintClient(WXHDC hDC); + bool HandleEraseBkgnd(WXHDC hDC); + + bool HandleMinimize(); + bool HandleMaximize(); + bool HandleSize(int x, int y, WXUINT flag); + bool HandleSizing(wxRect& rect); + bool HandleGetMinMaxInfo(void *mmInfo); + + bool HandleShow(bool show, int status); + bool HandleActivate(int flag, bool minimized, WXHWND activate); + + bool HandleCommand(WXWORD id, WXWORD cmd, WXHWND control); + + bool HandleCtlColor(WXHBRUSH *hBrush, WXHDC hdc, WXHWND hWnd); + + bool HandlePaletteChanged(WXHWND hWndPalChange); + bool HandleQueryNewPalette(); + bool HandleSysColorChange(); + bool HandleDisplayChange(); + bool HandleCaptureChanged(WXHWND gainedCapture); + virtual bool HandleSettingChange(WXWPARAM wParam, WXLPARAM lParam); + + bool HandleQueryEndSession(long logOff, bool *mayEnd); + bool HandleEndSession(bool endSession, long logOff); + + bool HandleSetFocus(WXHWND wnd); + bool HandleKillFocus(WXHWND wnd); + + bool HandleDropFiles(WXWPARAM wParam); + + bool HandleMouseEvent(WXUINT msg, int x, int y, WXUINT flags); + bool HandleMouseMove(int x, int y, WXUINT flags); + bool HandleMouseWheel(WXWPARAM wParam, WXLPARAM lParam); + + bool HandleChar(WXWPARAM wParam, WXLPARAM lParam, bool isASCII = false); + bool HandleKeyDown(WXWPARAM wParam, WXLPARAM lParam); + bool HandleKeyUp(WXWPARAM wParam, WXLPARAM lParam); +#if wxUSE_ACCEL + bool HandleHotKey(WXWPARAM wParam, WXLPARAM lParam); +#endif +#ifdef __WIN32__ + int HandleMenuChar(int chAccel, WXLPARAM lParam); +#endif + // Create and process a clipboard event specified by type. + bool HandleClipboardEvent( WXUINT nMsg ); + + bool HandleQueryDragIcon(WXHICON *hIcon); + + bool HandleSetCursor(WXHWND hWnd, short nHitTest, int mouseMsg); + + bool HandlePower(WXWPARAM wParam, WXLPARAM lParam, bool *vetoed); + + + // Window procedure + virtual WXLRESULT MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam); + + // Calls an appropriate default window procedure + virtual WXLRESULT MSWDefWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam); + + // message processing helpers + + // return false if the message shouldn't be translated/preprocessed but + // dispatched normally + virtual bool MSWShouldPreProcessMessage(WXMSG* pMsg); + + // return true if the message was preprocessed and shouldn't be dispatched + virtual bool MSWProcessMessage(WXMSG* pMsg); + + // return true if the message was translated and shouldn't be dispatched + virtual bool MSWTranslateMessage(WXMSG* pMsg); + + // called when the window is about to be destroyed + virtual void MSWDestroyWindow(); + + + // this function should return the brush to paint the children controls + // background or 0 if this window doesn't impose any particular background + // on its children + // + // the base class version returns a solid brush if we have a non default + // background colour or 0 otherwise + virtual WXHBRUSH MSWGetBgBrushForChild(WXHDC hDC, WXHWND hWnd); + + // return the background brush to use for painting the given window by + // quering the parent windows via their MSWGetBgBrushForChild() recursively + // + // hWndToPaint is normally NULL meaning this window itself, but it can also + // be a child of this window which is used by the static box and could be + // potentially useful for other transparent controls + WXHBRUSH MSWGetBgBrush(WXHDC hDC, WXHWND hWndToPaint = NULL); + + // gives the parent the possibility to draw its children background, e.g. + // this is used by wxNotebook to do it using DrawThemeBackground() + // + // return true if background was drawn, false otherwise + virtual bool MSWPrintChild(WXHDC WXUNUSED(hDC), wxWindow * WXUNUSED(child)) + { + return false; + } + + // some controls (e.g. wxListBox) need to set the return value themselves + // + // return true to let parent handle it if we don't, false otherwise + virtual bool MSWShouldPropagatePrintChild() + { + return true; + } + + + // Responds to colour changes: passes event on to children. + void OnSysColourChanged(wxSysColourChangedEvent& event); + + // initialize various fields of wxMouseEvent (common part of MSWOnMouseXXX) + void InitMouseEvent(wxMouseEvent& event, int x, int y, WXUINT flags); + + // check if mouse is in the window + bool IsMouseInWindow() const; + + // check if a native double-buffering applies for this window + virtual bool IsDoubleBuffered() const; + + // synthesize a wxEVT_LEAVE_WINDOW event and set m_mouseInWindow to false + void GenerateMouseLeave(); + + // virtual function for implementing internal idle + // behaviour + virtual void OnInternalIdle(); + +protected: + +#if wxUSE_MENUS_NATIVE + virtual bool DoPopupMenu( wxMenu *menu, int x, int y ); +#endif // wxUSE_MENUS_NATIVE + + // the window handle + WXHWND m_hWnd; + + // the old window proc (we subclass all windows) + WXFARPROC m_oldWndProc; + + // additional (MSW specific) flags + bool m_mouseInWindow:1; + bool m_lastKeydownProcessed:1; + + // the size of one page for scrolling + int m_xThumbSize; + int m_yThumbSize; + + // implement the base class pure virtuals + virtual void DoClientToScreen( int *x, int *y ) const; + virtual void DoScreenToClient( int *x, int *y ) const; + virtual void DoGetPosition( int *x, int *y ) const; + virtual void DoGetSize( int *width, int *height ) const; + virtual void DoGetClientSize( int *width, int *height ) const; + virtual void DoSetSize(int x, int y, + int width, int height, + int sizeFlags = wxSIZE_AUTO); + virtual void DoSetClientSize(int width, int height); + + virtual void DoCaptureMouse(); + virtual void DoReleaseMouse(); + + // this simply moves/resizes the given HWND which is supposed to be our + // sibling (this is useful for controls which are composite at MSW level + // and for which DoMoveWindow() is not enough) + // + // returns true if the window move was deferred, false if it was moved + // immediately (no error return) + bool DoMoveSibling(WXHWND hwnd, int x, int y, int width, int height); + + // move the window to the specified location and resize it: this is called + // from both DoSetSize() and DoSetClientSize() and would usually just call + // ::MoveWindow() except for composite controls which will want to arrange + // themselves inside the given rectangle + virtual void DoMoveWindow(int x, int y, int width, int height); + +#if wxUSE_TOOLTIPS + virtual void DoSetToolTip( wxToolTip *tip ); + + // process TTN_NEEDTEXT message properly (i.e. fixing the bugs in + // comctl32.dll in our code -- see the function body for more info) + bool HandleTooltipNotify(WXUINT code, + WXLPARAM lParam, + const wxString& ttip); +#endif // wxUSE_TOOLTIPS + + // the helper functions used by HandleChar/KeyXXX methods + wxKeyEvent CreateKeyEvent(wxEventType evType, int id, + WXLPARAM lParam = 0, WXWPARAM wParam = 0) const; + + + // default OnEraseBackground() implementation, return true if we did erase + // the background, false otherwise (i.e. the system should erase it) + bool DoEraseBackground(WXHDC hDC); + + // generate WM_CHANGEUISTATE if it's needed for the OS we're running under + // + // action should be one of the UIS_XXX constants + // state should be one or more of the UISF_XXX constants + // if action == UIS_INITIALIZE then it doesn't seem to matter what we use + // for state as the system will decide for us what needs to be set + void MSWUpdateUIState(int action, int state = 0); + +private: + // common part of all ctors + void Init(); + + // the (non-virtual) handlers for the events + bool HandleMove(int x, int y); + bool HandleMoving(wxRect& rect); + bool HandleJoystickEvent(WXUINT msg, int x, int y, WXUINT flags); + bool HandleNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result); + + // list of disabled children before last call to our Disable() + wxWindowList *m_childrenDisabled; + + // number of calls to Freeze() minus number of calls to Thaw() + unsigned int m_frozenness; + + // current defer window position operation handle (may be NULL) + WXHANDLE m_hDWP; + +protected: + // When deferred positioning is done these hold the pending changes, and + // are used for the default values if another size/pos changes is done on + // this window before the group of deferred changes is completed. + wxPoint m_pendingPosition; + wxSize m_pendingSize; + +private: +#ifdef __POCKETPC__ + bool m_contextMenuEnabled; +#endif + + DECLARE_DYNAMIC_CLASS(wxWindowMSW) + DECLARE_NO_COPY_CLASS(wxWindowMSW) + DECLARE_EVENT_TABLE() +}; + +// ---------------------------------------------------------------------------- +// inline functions +// ---------------------------------------------------------------------------- + +#if WXWIN_COMPATIBILITY_2_4 + +inline bool wxWindowMSW::GetUseCtl3D() const { return false; } +inline bool wxWindowMSW::GetTransparentBackground() const { return false; } +inline void wxWindowMSW::SetTransparent(bool WXUNUSED(t)) { } + +#endif // WXWIN_COMPATIBILITY_2_4 + +// --------------------------------------------------------------------------- +// global functions +// --------------------------------------------------------------------------- + +// kbd code translation +WXDLLEXPORT int wxCharCodeMSWToWX(int keySym, WXLPARAM lParam = 0); +WXDLLEXPORT WXWORD wxCharCodeWXToMSW(int id, bool *IsVirtual = NULL); + +// window creation helper class: before creating a new HWND, instantiate an +// object of this class on stack - this allows to process the messages sent to +// the window even before CreateWindow() returns +class wxWindowCreationHook +{ +public: + wxWindowCreationHook(wxWindowMSW *winBeingCreated); + ~wxWindowCreationHook(); +}; + +// ---------------------------------------------------------------------------- +// global objects +// ---------------------------------------------------------------------------- + +// notice that this hash must be defined after wxWindow declaration as it +// needs to "see" its dtor and not just forward declaration +#include "wx/hash.h" + +// pseudo-template HWND <-> wxWindow hash table +#if WXWIN_COMPATIBILITY_2_4 +WX_DECLARE_HASH(wxWindow, wxWindowList, wxWinHashTable); +#else +WX_DECLARE_HASH(wxWindowMSW, wxWindowList, wxWinHashTable); +#endif + +extern wxWinHashTable *wxWinHandleHash; + +#endif // _WX_WINDOW_H_ diff --git a/Externals/wxWidgets/include/wx/msw/winundef.h b/Externals/wxWidgets/include/wx/msw/winundef.h new file mode 100644 index 0000000000..b8acb68b72 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/winundef.h @@ -0,0 +1,490 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: winundef.h +// Purpose: undefine the common symbols #define'd by <windows.h> +// Author: Vadim Zeitlin +// Modified by: +// Created: 16.05.99 +// RCS-ID: $Id: winundef.h 36044 2005-10-31 19:35:41Z VZ $ +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +/* THIS SHOULD NOT BE USED since you might include it once e.g. in window.h, + * then again _AFTER_ you've included windows.h, in which case it won't work + * a 2nd time -- JACS +#ifndef _WX_WINUNDEF_H_ +#define _WX_WINUNDEF_H_ + */ + +// ---------------------------------------------------------------------------- +// windows.h #defines the following identifiers which are also used in wxWin so +// we replace these symbols with the corresponding inline functions and +// undefine the macro. +// +// This looks quite ugly here but allows us to write clear (and correct!) code +// elsewhere because the functions, unlike the macros, respect the scope. +// ---------------------------------------------------------------------------- + +// CreateDialog + +#if defined(CreateDialog) + #undef CreateDialog + + inline HWND CreateDialog(HINSTANCE hInstance, + LPCTSTR pTemplate, + HWND hwndParent, + DLGPROC pDlgProc) + { + #ifdef _UNICODE + return CreateDialogW(hInstance, pTemplate, hwndParent, pDlgProc); + #else + return CreateDialogA(hInstance, pTemplate, hwndParent, pDlgProc); + #endif + } +#endif + +// CreateFont + +#ifdef CreateFont + #undef CreateFont + + inline HFONT CreateFont(int height, + int width, + int escapement, + int orientation, + int weight, + DWORD italic, + DWORD underline, + DWORD strikeout, + DWORD charset, + DWORD outprecision, + DWORD clipprecision, + DWORD quality, + DWORD family, + LPCTSTR facename) + { + #ifdef _UNICODE + return CreateFontW(height, width, escapement, orientation, + weight, italic, underline, strikeout, charset, + outprecision, clipprecision, quality, + family, facename); + #else + return CreateFontA(height, width, escapement, orientation, + weight, italic, underline, strikeout, charset, + outprecision, clipprecision, quality, + family, facename); + #endif + } +#endif // CreateFont + +// CreateWindow + +#if defined(CreateWindow) + #undef CreateWindow + + inline HWND CreateWindow(LPCTSTR lpClassName, + LPCTSTR lpWndClass, + DWORD dwStyle, + int x, int y, int w, int h, + HWND hWndParent, + HMENU hMenu, + HINSTANCE hInstance, + LPVOID lpParam) + { + #ifdef _UNICODE + return CreateWindowW(lpClassName, lpWndClass, dwStyle, x, y, w, h, + hWndParent, hMenu, hInstance, lpParam); + #else + return CreateWindowA(lpClassName, lpWndClass, dwStyle, x, y, w, h, + hWndParent, hMenu, hInstance, lpParam); + #endif + } +#endif + +// LoadMenu + +#ifdef LoadMenu + #undef LoadMenu + + inline HMENU LoadMenu(HINSTANCE instance, LPCTSTR name) + { + #ifdef _UNICODE + return LoadMenuW(instance, name); + #else + return LoadMenuA(instance, name); + #endif + } +#endif + +// FindText + +#ifdef FindText + #undef FindText + + inline HWND APIENTRY FindText(LPFINDREPLACE lpfindreplace) + { + #ifdef UNICODE + return FindTextW(lpfindreplace); + #else + return FindTextA(lpfindreplace); + #endif // !UNICODE + } +#endif + +// GetCharWidth + +#ifdef GetCharWidth + #undef GetCharWidth + inline BOOL GetCharWidth(HDC dc, UINT first, UINT last, LPINT buffer) + { + #ifdef _UNICODE + return GetCharWidthW(dc, first, last, buffer); + #else + return GetCharWidthA(dc, first, last, buffer); + #endif + } +#endif + +// FindWindow + +#ifdef FindWindow + #undef FindWindow + #ifdef _UNICODE + inline HWND FindWindow(LPCWSTR classname, LPCWSTR windowname) + { + return FindWindowW(classname, windowname); + } + #else + inline HWND FindWindow(LPCSTR classname, LPCSTR windowname) + { + return FindWindowA(classname, windowname); + } + #endif +#endif + +// PlaySound + +#ifdef PlaySound + #undef PlaySound + #ifdef _UNICODE + inline BOOL PlaySound(LPCWSTR pszSound, HMODULE hMod, DWORD fdwSound) + { + return PlaySoundW(pszSound, hMod, fdwSound); + } + #else + inline BOOL PlaySound(LPCSTR pszSound, HMODULE hMod, DWORD fdwSound) + { + return PlaySoundA(pszSound, hMod, fdwSound); + } + #endif +#endif + +// GetClassName + +#ifdef GetClassName + #undef GetClassName + #ifdef _UNICODE + inline int GetClassName(HWND h, LPWSTR classname, int maxcount) + { + return GetClassNameW(h, classname, maxcount); + } + #else + inline int GetClassName(HWND h, LPSTR classname, int maxcount) + { + return GetClassNameA(h, classname, maxcount); + } + #endif +#endif + +// GetClassInfo + +#ifdef GetClassInfo + #undef GetClassInfo + #ifdef _UNICODE + inline BOOL GetClassInfo(HINSTANCE h, LPCWSTR name, LPWNDCLASSW winclass) + { + return GetClassInfoW(h, name, winclass); + } + #else + inline BOOL GetClassInfo(HINSTANCE h, LPCSTR name, LPWNDCLASSA winclass) + { + return GetClassInfoA(h, name, winclass); + } + #endif +#endif + +// LoadAccelerators + +#ifdef LoadAccelerators + #undef LoadAccelerators + #ifdef _UNICODE + inline HACCEL LoadAccelerators(HINSTANCE h, LPCWSTR name) + { + return LoadAcceleratorsW(h, name); + } + #else + inline HACCEL LoadAccelerators(HINSTANCE h, LPCSTR name) + { + return LoadAcceleratorsA(h, name); + } + #endif +#endif + +// DrawText + +#ifdef DrawText + #undef DrawText + #ifdef _UNICODE + inline int DrawText(HDC h, LPCWSTR str, int count, LPRECT rect, UINT format) + { + return DrawTextW(h, str, count, rect, format); + } + #else + inline int DrawText(HDC h, LPCSTR str, int count, LPRECT rect, UINT format) + { + return DrawTextA(h, str, count, rect, format); + } + #endif +#endif + + +/* + When this file is included, sometimes the wxCHECK_W32API_VERSION macro + is undefined. With for example CodeWarrior this gives problems with + the following code: + #if 0 && wxCHECK_W32API_VERSION( 0, 5 ) + Because CodeWarrior does macro expansion before test evaluation. + We define wxCHECK_W32API_VERSION here if it's undefined. +*/ +#if !defined(__GNUG__) && !defined(wxCHECK_W32API_VERSION) + #define wxCHECK_W32API_VERSION(maj, min) (0) +#endif + +// StartDoc + +#ifdef StartDoc + #undef StartDoc + #if defined( __GNUG__ ) && !wxCHECK_W32API_VERSION( 0, 5 ) + #define DOCINFOW DOCINFO + #define DOCINFOA DOCINFO + #endif + #ifdef _UNICODE + inline int StartDoc(HDC h, CONST DOCINFOW* info) + { + return StartDocW(h, (DOCINFOW*) info); + } + #else + inline int StartDoc(HDC h, CONST DOCINFOA* info) + { + return StartDocA(h, (DOCINFOA*) info); + } + #endif +#endif + +// GetObject + +#ifdef GetObject + #undef GetObject + inline int GetObject(HGDIOBJ h, int i, LPVOID buffer) + { + #ifdef _UNICODE + return GetObjectW(h, i, buffer); + #else + return GetObjectA(h, i, buffer); + #endif + } +#endif + +// GetMessage + +#ifdef GetMessage + #undef GetMessage + inline int GetMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax) + { + #ifdef _UNICODE + return GetMessageW(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); + #else + return GetMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); + #endif + } +#endif + +// LoadIcon +#ifdef LoadIcon + #undef LoadIcon + inline HICON LoadIcon(HINSTANCE hInstance, LPCTSTR lpIconName) + { + #ifdef _UNICODE + return LoadIconW(hInstance, lpIconName); + #else // ANSI + return LoadIconA(hInstance, lpIconName); + #endif // Unicode/ANSI + } +#endif // LoadIcon + +// LoadBitmap +#ifdef LoadBitmap + #undef LoadBitmap + inline HBITMAP LoadBitmap(HINSTANCE hInstance, LPCTSTR lpBitmapName) + { + #ifdef _UNICODE + return LoadBitmapW(hInstance, lpBitmapName); + #else // ANSI + return LoadBitmapA(hInstance, lpBitmapName); + #endif // Unicode/ANSI + } +#endif // LoadBitmap + +// LoadLibrary + +#ifdef LoadLibrary + #undef LoadLibrary + #ifdef _UNICODE + inline HINSTANCE LoadLibrary(LPCWSTR lpLibFileName) + { + return LoadLibraryW(lpLibFileName); + } + #else + inline HINSTANCE LoadLibrary(LPCSTR lpLibFileName) + { + return LoadLibraryA(lpLibFileName); + } + #endif +#endif + +// FindResource +#ifdef FindResource + #undef FindResource + #ifdef _UNICODE + inline HRSRC FindResource(HMODULE hModule, LPCWSTR lpName, LPCWSTR lpType) + { + return FindResourceW(hModule, lpName, lpType); + } + #else + inline HRSRC FindResource(HMODULE hModule, LPCSTR lpName, LPCSTR lpType) + { + return FindResourceA(hModule, lpName, lpType); + } + #endif +#endif + +// IsMaximized + +#ifdef IsMaximized + #undef IsMaximized + inline BOOL IsMaximized(HWND WXUNUSED_IN_WINCE(hwnd)) + { +#ifdef __WXWINCE__ + return FALSE; +#else + return IsZoomed(hwnd); +#endif + } +#endif + +// GetFirstChild + +#ifdef GetFirstChild + #undef GetFirstChild + inline HWND GetFirstChild(HWND WXUNUSED_IN_WINCE(hwnd)) + { +#ifdef __WXWINCE__ + return 0; +#else + return GetTopWindow(hwnd); +#endif + } +#endif + +// GetFirstSibling + +#ifdef GetFirstSibling + #undef GetFirstSibling + inline HWND GetFirstSibling(HWND hwnd) + { + return GetWindow(hwnd,GW_HWNDFIRST); + } +#endif + +// GetLastSibling + +#ifdef GetLastSibling + #undef GetLastSibling + inline HWND GetLastSibling(HWND hwnd) + { + return GetWindow(hwnd,GW_HWNDLAST); + } +#endif + +// GetPrevSibling + +#ifdef GetPrevSibling + #undef GetPrevSibling + inline HWND GetPrevSibling(HWND hwnd) + { + return GetWindow(hwnd,GW_HWNDPREV); + } +#endif + +// GetNextSibling + +#ifdef GetNextSibling + #undef GetNextSibling + inline HWND GetNextSibling(HWND hwnd) + { + return GetWindow(hwnd,GW_HWNDNEXT); + } +#endif + +// For WINE + +#if defined(GetWindowStyle) + #undef GetWindowStyle +#endif + +// For ming and cygwin + +// GetFirstChild +#ifdef GetFirstChild + #undef GetFirstChild + inline HWND GetFirstChild(HWND h) + { + return GetTopWindow(h); + } +#endif + + +// GetNextSibling +#ifdef GetNextSibling + #undef GetNextSibling + inline HWND GetNextSibling(HWND h) + { + return GetWindow(h, GW_HWNDNEXT); + } +#endif + + +#ifdef Yield + #undef Yield +#endif + + +#if defined(__WXWINCE__) && defined(DrawIcon) //#ifdef DrawIcon + #undef DrawIcon + inline BOOL DrawIcon(HDC hdc, int x, int y, HICON hicon) + { + return DrawIconEx(hdc,x,y,hicon,0,0,0,NULL, DI_NORMAL) ; + } +#endif + + +// GetWindowProc +//ifdef GetWindowProc +// #undef GetWindowProc +//endif +//ifdef GetNextChild +// #undef GetNextChild +//endif + +// #endif // _WX_WINUNDEF_H_ + diff --git a/Externals/wxWidgets/include/wx/msw/wrapcctl.h b/Externals/wxWidgets/include/wx/msw/wrapcctl.h new file mode 100644 index 0000000000..eaa68be044 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/wrapcctl.h @@ -0,0 +1,62 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/wrapcctl.h +// Purpose: Wrapper for the standard <commctrl.h> header +// Author: Vadim Zeitlin +// Modified by: +// Created: 03.08.2003 +// RCS-ID: $Id: wrapcctl.h 41054 2006-09-07 19:01:45Z ABX $ +// Copyright: (c) 2003 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MSW_WRAPCCTL_H_ +#define _WX_MSW_WRAPCCTL_H_ + +// define _WIN32_IE to a high value because we always check for the version +// of installed DLLs at runtime anyway (see wxApp::GetComCtl32Version()) unless +// the user really doesn't want it and had defined it to a (presumably lower) +// value +// +// just for the reference, here is the table showing what the different value +// of _WIN32_IE correspond to: +// +// 0x0200 for comctl32.dll 4.00 shipped with Win95/NT 4.0 +// 0x0300 4.70 IE 3.x +// 0x0400 4.71 IE 4.0 +// 0x0401 4.72 IE 4.01 and Win98 +// 0x0500 5.80 IE 5.x +// 0x0500 5.81 Win2k/ME +// 0x0600 6.00 WinXP + +#ifndef _WIN32_IE + // use maximal set of features by default, we check for them during + // run-time anyhow + #define _WIN32_IE 0x0600 +#endif // !defined(_WIN32_IE) + +#include "wx/msw/wrapwin.h" + +#include <commctrl.h> + +// define things which might be missing from our commctrl.h +#include "wx/msw/missing.h" + +// Set Unicode format for a common control +inline void wxSetCCUnicodeFormat(HWND WXUNUSED_IN_WINCE(hwnd)) +{ +#ifndef __WXWINCE__ + ::SendMessage(hwnd, CCM_SETUNICODEFORMAT, wxUSE_UNICODE, 0); +#else // !__WXWINCE__ + // here it should be already in Unicode anyhow +#endif // __WXWINCE__/!__WXWINCE__ +} + +#if wxUSE_GUI +// Return the default font for the common controls +// +// this is implemented in msw/settings.cpp +class wxFont; +extern wxFont wxGetCCDefaultFont(); +#endif + +#endif // _WX_MSW_WRAPCCTL_H_ diff --git a/Externals/wxWidgets/include/wx/msw/wrapcdlg.h b/Externals/wxWidgets/include/wx/msw/wrapcdlg.h new file mode 100644 index 0000000000..9075152919 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/wrapcdlg.h @@ -0,0 +1,28 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/wrapcdlg.h +// Purpose: Wrapper for the standard <commdlg.h> header +// Author: Wlodzimierz ABX Skiba +// Modified by: +// Created: 22.03.2005 +// RCS-ID: $Id: wrapcdlg.h 43151 2006-11-07 09:08:33Z JS $ +// Copyright: (c) 2005 Wlodzimierz Skiba +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MSW_WRAPCDLG_H_ +#define _WX_MSW_WRAPCDLG_H_ + +#include "wx/defs.h" + +#include "wx/msw/wrapwin.h" +#include "wx/msw/private.h" +#include "wx/msw/missing.h" + +#if wxUSE_COMMON_DIALOGS && !defined(__SMARTPHONE__) && !defined(__WXMICROWIN__) + #include <commdlg.h> +#endif + +#include "wx/msw/winundef.h" + +#endif // _WX_MSW_WRAPCDLG_H_ + diff --git a/Externals/wxWidgets/include/wx/msw/wrapshl.h b/Externals/wxWidgets/include/wx/msw/wrapshl.h new file mode 100644 index 0000000000..282a81c015 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/wrapshl.h @@ -0,0 +1,90 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/wrapshl.h +// Purpose: wrapper class for stuff from shell32.dll +// Author: Vadim Zeitlin +// Modified by: +// Created: 2004-10-19 +// RCS-ID: $Id: wrapshl.h 40367 2006-07-29 19:19:50Z VZ $ +// Copyright: (c) 2004 Vadim Zeitlin <vadim@wxwindows.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MSW_WRAPSHL_H_ +#define _WX_MSW_WRAPSHL_H_ + +#ifdef __WXWINCE__ + #include <winreg.h> + #include <objbase.h> + #include <shlguid.h> +#endif + +#include <shlobj.h> + +#include "wx/msw/winundef.h" + +// ---------------------------------------------------------------------------- +// wxItemIdList implements RAII on top of ITEMIDLIST +// ---------------------------------------------------------------------------- + +class wxItemIdList +{ +public: + // ctor takes ownership of the item and will free it + wxItemIdList(LPITEMIDLIST pidl) + { + m_pidl = pidl; + } + + static void Free(LPITEMIDLIST pidl) + { + if ( pidl ) + { + LPMALLOC pMalloc; + SHGetMalloc(&pMalloc); + if ( pMalloc ) + { + pMalloc->Free(pidl); + pMalloc->Release(); + } + else + { + wxLogLastError(wxT("SHGetMalloc")); + } + } + } + + ~wxItemIdList() + { + Free(m_pidl); + } + + // implicit conversion to LPITEMIDLIST + operator LPITEMIDLIST() const { return m_pidl; } + + // get the corresponding path, returns empty string on error + wxString GetPath() const + { + wxString path; + if ( !SHGetPathFromIDList(m_pidl, wxStringBuffer(path, MAX_PATH)) ) + { + wxLogLastError(_T("SHGetPathFromIDList")); + } + + return path; + } + +private: + LPITEMIDLIST m_pidl; + + DECLARE_NO_COPY_CLASS(wxItemIdList) +}; + +// enable autocompleting filenames in the text control with given HWND +// +// this only works on systems with shlwapi.dll 5.0 or later +// +// implemented in src/msw/utilsgui.cpp +extern bool wxEnableFileNameAutoComplete(HWND hwnd); + +#endif // _WX_MSW_WRAPSHL_H_ + diff --git a/Externals/wxWidgets/include/wx/msw/wrapwin.h b/Externals/wxWidgets/include/wx/msw/wrapwin.h new file mode 100644 index 0000000000..b7cb64ae9e --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/wrapwin.h @@ -0,0 +1,99 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: msw/wrapwin.h +// Purpose: Wrapper around <windows.h>, to be included instead of it +// Author: Vaclav Slavik +// Created: 2003/07/22 +// RCS-ID: $Id: wrapwin.h 42462 2006-10-26 19:06:51Z VZ $ +// Copyright: (c) 2003 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_WRAPWIN_H_ +#define _WX_WRAPWIN_H_ + +#include "wx/platform.h" + +// strict type checking to detect conversion from HFOO to HBAR at compile-time +#ifndef STRICT + #define STRICT 1 +#endif + +// this macro tells windows.h to not define min() and max() as macros: we need +// this as otherwise they conflict with standard C++ functions +#ifndef NOMINMAX + #define NOMINMAX +#endif // NOMINMAX + + +// before including windows.h, define version macros at (currently) maximal +// values because we do all our checks at run-time anyhow +#ifndef WINVER + // the only exception to the above is MSVC 6 which has a time bomb in its + // headers: they warn against using them with WINVER >= 0x0500 as they + // contain only part of the declarations and they're not always correct, so + // don't define WINVER for it at all as this allows everything to work as + // expected both with standard VC6 headers (which define WINVER as 0x0400 + // by default) and headers from a newer SDK (which may define it as 0x0500) + #if !defined(__VISUALC__) || (__VISUALC__ >= 1300) + #define WINVER 0x0600 + #endif +#endif + +#ifndef _WIN32_WINNT + #define _WIN32_WINNT 0x0600 +#endif + +/* Deal with clash with __WINDOWS__ include guard */ +#if defined(__WXWINCE__) && defined(__WINDOWS__) +#undef __WINDOWS__ +#endif + +#include <windows.h> + +#if defined(__WXWINCE__) && !defined(__WINDOWS__) +#define __WINDOWS__ +#endif + +// #undef the macros defined in winsows.h which conflict with code elsewhere +#include "wx/msw/winundef.h" + +// Types DWORD_PTR, ULONG_PTR and so on are used for 64-bit compatability +// in the WINAPI SDK (they are an integral type that is the size of a +// pointer) on MSVC 7 and later. However, they are not available in older +// Platform SDKs, and since they are typedefs and not #defines we simply +// overwrite them if there is a chance that they're not defined +#if !defined(_MSC_VER) || (_MSC_VER < 1300) + #define UINT_PTR unsigned int + #define LONG_PTR long + #define ULONG_PTR unsigned long + #define DWORD_PTR unsigned long +#endif // !defined(_MSC_VER) || _MSC_VER < 1300 + +// ---------------------------------------------------------------------------- +// Fix the functions wrongly implemented in unicows.dll +// ---------------------------------------------------------------------------- + +#if wxUSE_UNICODE_MSLU + +#if wxUSE_GUI + +WXDLLEXPORT int wxMSLU_DrawStateW(WXHDC dc, WXHBRUSH br, WXFARPROC outputFunc, + WXLPARAM lData, WXWPARAM wData, + int x, int y, int cx, int cy, + unsigned int flags); +#define DrawStateW(dc, br, func, ld, wd, x, y, cx, cy, flags) \ + wxMSLU_DrawStateW((WXHDC)dc,(WXHBRUSH)br,(WXFARPROC)func, \ + ld, wd, x, y, cx, cy, flags) + +WXDLLEXPORT int wxMSLU_GetOpenFileNameW(void *ofn); +#define GetOpenFileNameW(ofn) wxMSLU_GetOpenFileNameW((void*)ofn) + +WXDLLEXPORT int wxMSLU_GetSaveFileNameW(void *ofn); +#define GetSaveFileNameW(ofn) wxMSLU_GetSaveFileNameW((void*)ofn) + +#endif // wxUSE_GUI + +#endif // wxUSE_UNICODE_MSLU + +#endif // _WX_WRAPWIN_H_ + diff --git a/Externals/wxWidgets/include/wx/msw/wx.manifest b/Externals/wxWidgets/include/wx/msw/wx.manifest new file mode 100644 index 0000000000..0d0bf1f16b --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/wx.manifest @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> +<assemblyIdentity + version="0.64.1.0" + processorArchitecture="x86" + name="Controls" + type="win32" +/> +<description>wxWindows application</description> +<dependency> + <dependentAssembly> + <assemblyIdentity + type="win32" + name="Microsoft.Windows.Common-Controls" + version="6.0.0.0" + processorArchitecture="X86" + publicKeyToken="6595b64144ccf1df" + language="*" + /> + </dependentAssembly> +</dependency> +</assembly> diff --git a/Externals/wxWidgets/include/wx/msw/wx.rc b/Externals/wxWidgets/include/wx/msw/wx.rc new file mode 100644 index 0000000000..da8cfe8e05 --- /dev/null +++ b/Externals/wxWidgets/include/wx/msw/wx.rc @@ -0,0 +1,119 @@ +///////////////////////////////////////////////////////////////////////////// +// File: wx.rc +// Purpose: wxWindows resource definitions. ALWAYS include +// this in your application resource file. +// Author: Julian Smart +// Modified by: +// Created: +// Copyright: (c) Julian Smart +// RCS-ID: $Id: wx.rc 43491 2006-11-18 16:46:59Z VZ $ +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#if defined(__MWERKS__) +#include <winresrc.h> +#else +#include <windows.h> +#endif + +#if defined(_WIN32_WCE) + #include "wx/msw/wince/wince.rc" +#endif + +#include "wx/msw/rcdefs.h" + +////////////////////////////////////////////////////////////////////////////// +// +// This is the MDI Window menu +// + +wxWindowMenu MENU DISCARDABLE +BEGIN + POPUP "&Window" + BEGIN + MENUITEM "&Cascade", 4002 + MENUITEM "Tile &Horizontally", 4001 + MENUITEM "Tile &Vertically", 4005 + MENUITEM "", -1 + MENUITEM "&Arrange Icons", 4003 + MENUITEM "&Next", 4004 + END +END + +////////////////////////////////////////////////////////////////////////////// +// +// Standard wxWindows Cursors +// + +WXCURSOR_HAND CURSOR DISCARDABLE "wx/msw/hand.cur" +WXCURSOR_BULLSEYE CURSOR DISCARDABLE "wx/msw/bullseye.cur" +WXCURSOR_PENCIL CURSOR DISCARDABLE "wx/msw/pencil.cur" +WXCURSOR_MAGNIFIER CURSOR DISCARDABLE "wx/msw/magnif1.cur" +WXCURSOR_ROLLER CURSOR DISCARDABLE "wx/msw/roller.cur" +WXCURSOR_PBRUSH CURSOR DISCARDABLE "wx/msw/pbrush.cur" +WXCURSOR_PLEFT CURSOR DISCARDABLE "wx/msw/pntleft.cur" +WXCURSOR_PRIGHT CURSOR DISCARDABLE "wx/msw/pntright.cur" +WXCURSOR_BLANK CURSOR DISCARDABLE "wx/msw/blank.cur" +WXCURSOR_RIGHT_ARROW CURSOR DISCARDABLE "wx/msw/rightarr.cur" +WXCURSOR_CROSS CURSOR DISCARDABLE "wx/msw/cross.cur" + + +////////////////////////////////////////////////////////////////////////////// +// +// Default Icons +// + +// First wx icon in alphabetical order, so it will be used by Explorer if the +// application doesn't have any icons of its own +wxICON_AAA ICON "wx/msw/std.ico" + +//wxDEFAULT_FRAME ICON "wx/msw/std.ico" +//wxDEFAULT_MDIPARENTFRAME ICON "wx/msw/mdi.ico" +//wxDEFAULT_MDICHILDFRAME ICON "wx/msw/child.ico" + +// Standard small icons +wxICON_SMALL_CLOSED_FOLDER ICON "wx/msw/folder1.ico" +wxICON_SMALL_OPEN_FOLDER ICON "wx/msw/folder2.ico" +wxICON_SMALL_FILE ICON "wx/msw/file1.ico" +wxICON_SMALL_COMPUTER ICON "wx/msw/computer.ico" +wxICON_SMALL_DRIVE ICON "wx/msw/drive.ico" +wxICON_SMALL_CDROM ICON "wx/msw/cdrom.ico" +wxICON_SMALL_FLOPPY ICON "wx/msw/floppy.ico" +wxICON_SMALL_REMOVEABLE ICON "wx/msw/removble.ico" + +////////////////////////////////////////////////////////////////////////////// +// +// Bitmaps +// + +// For wxContextHelpButton +csquery BITMAP "wx/msw/csquery.bmp" + +// For obtaining the RGB values of standard colours +wxBITMAP_STD_COLOURS BITMAP "wx/msw/colours.bmp" + +////////////////////////////////////////////////////////////////////////////// +// +// Manifest file for Windows XP +// + +#if !defined(wxUSE_NO_MANIFEST) || (wxUSE_NO_MANIFEST == 0) +#if !defined(WX_MSC_FULL_VER) || WX_MSC_FULL_VER < 140040130 + +// see "about isolated applications" topic in MSDN +#ifdef ISOLATION_AWARE_ENABLED +#define wxMANIFEST_ID 2 +#else +#define wxMANIFEST_ID 1 +#endif + +#if defined(WX_CPU_AMD64) +wxMANIFEST_ID 24 "wx/msw/amd64.manifest" +#elif defined(WX_CPU_IA64) +wxMANIFEST_ID 24 "wx/msw/ia64.manifest" +#elif defined(WX_CPU_X86) +wxMANIFEST_ID 24 "wx/msw/wx.manifest" +#endif + +#endif // !defined(WX_MSC_FULL_VER) || WX_MSC_FULL_VER < 140040130 +#endif // !defined(wxUSE_NO_MANIFEST) || (wxUSE_NO_MANIFEST == 0) diff --git a/Externals/wxWidgets/include/wx/notebook.h b/Externals/wxWidgets/include/wx/notebook.h new file mode 100644 index 0000000000..db1dc13616 --- /dev/null +++ b/Externals/wxWidgets/include/wx/notebook.h @@ -0,0 +1,183 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/notebook.h +// Purpose: wxNotebook interface +// Author: Vadim Zeitlin +// Modified by: +// Created: 01.02.01 +// RCS-ID: $Id: notebook.h 42152 2006-10-20 09:16:41Z VZ $ +// Copyright: (c) 1996-2000 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_NOTEBOOK_H_BASE_ +#define _WX_NOTEBOOK_H_BASE_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/defs.h" + +#if wxUSE_NOTEBOOK + +#include "wx/bookctrl.h" + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// wxNotebook hit results, use wxBK_HITTEST so other book controls can share them +// if wxUSE_NOTEBOOK is disabled +enum +{ + wxNB_HITTEST_NOWHERE = wxBK_HITTEST_NOWHERE, + wxNB_HITTEST_ONICON = wxBK_HITTEST_ONICON, + wxNB_HITTEST_ONLABEL = wxBK_HITTEST_ONLABEL, + wxNB_HITTEST_ONITEM = wxBK_HITTEST_ONITEM, + wxNB_HITTEST_ONPAGE = wxBK_HITTEST_ONPAGE +}; + +// wxNotebook flags + +// use common book wxBK_* flags for describing alignment +#define wxNB_DEFAULT wxBK_DEFAULT +#define wxNB_TOP wxBK_TOP +#define wxNB_BOTTOM wxBK_BOTTOM +#define wxNB_LEFT wxBK_LEFT +#define wxNB_RIGHT wxBK_RIGHT + +#define wxNB_FIXEDWIDTH 0x0100 +#define wxNB_MULTILINE 0x0200 +#define wxNB_NOPAGETHEME 0x0400 +#define wxNB_FLAT 0x0800 + + +typedef wxWindow wxNotebookPage; // so far, any window can be a page + +extern WXDLLEXPORT_DATA(const wxChar) wxNotebookNameStr[]; + +#if WXWIN_COMPATIBILITY_2_4 + #define wxNOTEBOOK_NAME wxNotebookNameStr +#endif + +// ---------------------------------------------------------------------------- +// wxNotebookBase: define wxNotebook interface +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxNotebookBase : public wxBookCtrlBase +{ +public: + // ctors + // ----- + + wxNotebookBase() { } + + wxNotebookBase(wxWindow *parent, + wxWindowID winid, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxNotebookNameStr) ; + + // wxNotebook-specific additions to wxBookCtrlBase interface + // --------------------------------------------------------- + + // get the number of rows for a control with wxNB_MULTILINE style (not all + // versions support it - they will always return 1 then) + virtual int GetRowCount() const { return 1; } + + // set the padding between tabs (in pixels) + virtual void SetPadding(const wxSize& padding) = 0; + + // set the size of the tabs for wxNB_FIXEDWIDTH controls + virtual void SetTabSize(const wxSize& sz) = 0; + + + + // implement some base class functions + virtual wxSize CalcSizeFromPage(const wxSize& sizePage) const; + + // On platforms that support it, get the theme page background colour, else invalid colour + virtual wxColour GetThemeBackgroundColour() const { return wxNullColour; } + + + // send wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING/ED events + + // returns false if the change to nPage is vetoed by the program + bool SendPageChangingEvent(int nPage); + + // sends the event about page change from old to new (or GetSelection() if + // new is -1) + void SendPageChangedEvent(int nPageOld, int nPageNew = -1); + + +protected: + DECLARE_NO_COPY_CLASS(wxNotebookBase) +}; + +// ---------------------------------------------------------------------------- +// notebook event class and related stuff +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxNotebookEvent : public wxBookCtrlBaseEvent +{ +public: + wxNotebookEvent(wxEventType commandType = wxEVT_NULL, int winid = 0, + int nSel = -1, int nOldSel = -1) + : wxBookCtrlBaseEvent(commandType, winid, nSel, nOldSel) + { + } + + wxNotebookEvent(const wxNotebookEvent& event) + : wxBookCtrlBaseEvent(event) + { + } + + virtual wxEvent *Clone() const { return new wxNotebookEvent(*this); } + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxNotebookEvent) +}; + +BEGIN_DECLARE_EVENT_TYPES() + DECLARE_EVENT_TYPE(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED, 802) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING, 803) +END_DECLARE_EVENT_TYPES() + +typedef void (wxEvtHandler::*wxNotebookEventFunction)(wxNotebookEvent&); + +#define wxNotebookEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxNotebookEventFunction, &func) + +#define EVT_NOTEBOOK_PAGE_CHANGED(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED, winid, wxNotebookEventHandler(fn)) + +#define EVT_NOTEBOOK_PAGE_CHANGING(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING, winid, wxNotebookEventHandler(fn)) + +// ---------------------------------------------------------------------------- +// wxNotebook class itself +// ---------------------------------------------------------------------------- + +#if defined(__WXUNIVERSAL__) + #include "wx/univ/notebook.h" +#elif defined(__WXMSW__) + #include "wx/msw/notebook.h" +#elif defined(__WXMOTIF__) + #include "wx/generic/notebook.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/notebook.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/notebook.h" +#elif defined(__WXMAC__) + #include "wx/mac/notebook.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/notebook.h" +#elif defined(__WXPM__) + #include "wx/os2/notebook.h" +#endif + +#endif // wxUSE_NOTEBOOK + +#endif + // _WX_NOTEBOOK_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/numdlg.h b/Externals/wxWidgets/include/wx/numdlg.h new file mode 100644 index 0000000000..741bc72fa5 --- /dev/null +++ b/Externals/wxWidgets/include/wx/numdlg.h @@ -0,0 +1,23 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/numdlg.h +// Purpose: wxNumberEntryDialog class +// Author: John Labenski +// Modified by: +// Created: 07.02.04 (extracted from wx/textdlg.h) +// RCS-ID: $Id: numdlg.h 37157 2006-01-26 15:33:27Z ABX $ +// Copyright: (c) John Labenski +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_NUMDLGDLG_H_BASE_ +#define _WX_NUMDLGDLG_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_NUMBERDLG + +#include "wx/generic/numdlgg.h" + +#endif // wxUSE_NUMBERDLG + +#endif // _WX_NUMDLGDLG_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/object.h b/Externals/wxWidgets/include/wx/object.h new file mode 100644 index 0000000000..93d0aebd52 --- /dev/null +++ b/Externals/wxWidgets/include/wx/object.h @@ -0,0 +1,569 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/object.h +// Purpose: wxObject class, plus run-time type information macros +// Author: Julian Smart +// Modified by: Ron Lee +// Created: 01/02/97 +// RCS-ID: $Id: object.h 42776 2006-10-30 22:03:53Z VZ $ +// Copyright: (c) 1997 Julian Smart +// (c) 2001 Ron Lee <ron@debian.org> +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_OBJECTH__ +#define _WX_OBJECTH__ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/memory.h" + +class WXDLLIMPEXP_BASE wxObject; + +#ifndef wxUSE_EXTENDED_RTTI +#define wxUSE_EXTENDED_RTTI 0 +#endif + +#if wxUSE_EXTENDED_RTTI +#include "wx/xti.h" +#else + +// ---------------------------------------------------------------------------- +// conditional compilation +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxClassInfo; +class WXDLLIMPEXP_BASE wxHashTable; +class WXDLLIMPEXP_BASE wxObjectRefData; + +// ---------------------------------------------------------------------------- +// wxClassInfo +// ---------------------------------------------------------------------------- + +typedef wxObject *(*wxObjectConstructorFn)(void); + +class WXDLLIMPEXP_BASE wxClassInfo +{ +public: + wxClassInfo( const wxChar *className, + const wxClassInfo *baseInfo1, + const wxClassInfo *baseInfo2, + int size, + wxObjectConstructorFn ctor ) + : m_className(className) + , m_objectSize(size) + , m_objectConstructor(ctor) + , m_baseInfo1(baseInfo1) + , m_baseInfo2(baseInfo2) + , m_next(sm_first) + { + sm_first = this; + Register(); + } + + ~wxClassInfo(); + + wxObject *CreateObject() const + { return m_objectConstructor ? (*m_objectConstructor)() : 0; } + bool IsDynamic() const { return (NULL != m_objectConstructor); } + + const wxChar *GetClassName() const { return m_className; } + const wxChar *GetBaseClassName1() const + { return m_baseInfo1 ? m_baseInfo1->GetClassName() : NULL; } + const wxChar *GetBaseClassName2() const + { return m_baseInfo2 ? m_baseInfo2->GetClassName() : NULL; } + const wxClassInfo *GetBaseClass1() const { return m_baseInfo1; } + const wxClassInfo *GetBaseClass2() const { return m_baseInfo2; } + int GetSize() const { return m_objectSize; } + + wxObjectConstructorFn GetConstructor() const + { return m_objectConstructor; } + static const wxClassInfo *GetFirst() { return sm_first; } + const wxClassInfo *GetNext() const { return m_next; } + static wxClassInfo *FindClass(const wxChar *className); + + // Climb upwards through inheritance hierarchy. + // Dual inheritance is catered for. + + bool IsKindOf(const wxClassInfo *info) const + { + return info != 0 && + ( info == this || + ( m_baseInfo1 && m_baseInfo1->IsKindOf(info) ) || + ( m_baseInfo2 && m_baseInfo2->IsKindOf(info) ) ); + } + +#if WXWIN_COMPATIBILITY_2_4 + // Initializes parent pointers and hash table for fast searching. + wxDEPRECATED( static void InitializeClasses() ); + // Cleans up hash table used for fast searching. + wxDEPRECATED( static void CleanUpClasses() ); +#endif + +public: + const wxChar *m_className; + int m_objectSize; + wxObjectConstructorFn m_objectConstructor; + + // Pointers to base wxClassInfos: set in InitializeClasses + + const wxClassInfo *m_baseInfo1; + const wxClassInfo *m_baseInfo2; + + // class info object live in a linked list: + // pointers to its head and the next element in it + + static wxClassInfo *sm_first; + wxClassInfo *m_next; + + // FIXME: this should be private (currently used directly by way too + // many clients) + static wxHashTable *sm_classTable; + +private: + // InitializeClasses() helper + static wxClassInfo *GetBaseByName(const wxChar *name); + + DECLARE_NO_COPY_CLASS(wxClassInfo) + +protected: + // registers the class + void Register(); + void Unregister(); +}; + +WXDLLIMPEXP_BASE wxObject *wxCreateDynamicObject(const wxChar *name); + +#if WXWIN_COMPATIBILITY_2_4 +inline void wxClassInfo::InitializeClasses() {} +inline void wxClassInfo::CleanUpClasses() {} +#endif + +// ---------------------------------------------------------------------------- +// Dynamic class macros +// ---------------------------------------------------------------------------- + +#define DECLARE_ABSTRACT_CLASS(name) \ + public: \ + static wxClassInfo ms_classInfo; \ + virtual wxClassInfo *GetClassInfo() const; + +#define DECLARE_DYNAMIC_CLASS_NO_ASSIGN(name) \ + DECLARE_NO_ASSIGN_CLASS(name) \ + DECLARE_DYNAMIC_CLASS(name) + +#define DECLARE_DYNAMIC_CLASS_NO_COPY(name) \ + DECLARE_NO_COPY_CLASS(name) \ + DECLARE_DYNAMIC_CLASS(name) + +#define DECLARE_DYNAMIC_CLASS(name) \ + DECLARE_ABSTRACT_CLASS(name) \ + static wxObject* wxCreateObject(); + +#define DECLARE_CLASS(name) DECLARE_DYNAMIC_CLASS(name) + + +// common part of the macros below +#define wxIMPLEMENT_CLASS_COMMON(name, basename, baseclsinfo2, func) \ + wxClassInfo name::ms_classInfo(wxT(#name), \ + &basename::ms_classInfo, \ + baseclsinfo2, \ + (int) sizeof(name), \ + (wxObjectConstructorFn) func); \ + \ + wxClassInfo *name::GetClassInfo() const \ + { return &name::ms_classInfo; } + +#define wxIMPLEMENT_CLASS_COMMON1(name, basename, func) \ + wxIMPLEMENT_CLASS_COMMON(name, basename, NULL, func) + +#define wxIMPLEMENT_CLASS_COMMON2(name, basename1, basename2, func) \ + wxIMPLEMENT_CLASS_COMMON(name, basename1, &basename2::ms_classInfo, func) + +// ----------------------------------- +// for concrete classes +// ----------------------------------- + + // Single inheritance with one base class +#define IMPLEMENT_DYNAMIC_CLASS(name, basename) \ + wxIMPLEMENT_CLASS_COMMON1(name, basename, name::wxCreateObject) \ + wxObject* name::wxCreateObject() \ + { return new name; } + + // Multiple inheritance with two base classes +#define IMPLEMENT_DYNAMIC_CLASS2(name, basename1, basename2) \ + wxIMPLEMENT_CLASS_COMMON2(name, basename1, basename2, \ + name::wxCreateObject) \ + wxObject* name::wxCreateObject() \ + { return new name; } + +// ----------------------------------- +// for abstract classes +// ----------------------------------- + + // Single inheritance with one base class + +#define IMPLEMENT_ABSTRACT_CLASS(name, basename) \ + wxIMPLEMENT_CLASS_COMMON1(name, basename, NULL) + + // Multiple inheritance with two base classes + +#define IMPLEMENT_ABSTRACT_CLASS2(name, basename1, basename2) \ + wxIMPLEMENT_CLASS_COMMON2(name, basename1, basename2, NULL) + +#define IMPLEMENT_CLASS IMPLEMENT_ABSTRACT_CLASS +#define IMPLEMENT_CLASS2 IMPLEMENT_ABSTRACT_CLASS2 + +#endif // !wxUSE_EXTENDED_RTTI + + +// ----------------------------------- +// for pluggable classes +// ----------------------------------- + + // NOTE: this should probably be the very first statement + // in the class declaration so wxPluginSentinel is + // the first member initialised and the last destroyed. + +// _DECLARE_DL_SENTINEL(name) wxPluginSentinel m_pluginsentinel; + +#if wxUSE_NESTED_CLASSES + +#define _DECLARE_DL_SENTINEL(name, exportdecl) \ +class exportdecl name##PluginSentinel { \ +private: \ + static const wxString sm_className; \ +public: \ + name##PluginSentinel(); \ + ~name##PluginSentinel(); \ +}; \ +name##PluginSentinel m_pluginsentinel; + +#define _IMPLEMENT_DL_SENTINEL(name) \ + const wxString name::name##PluginSentinel::sm_className(#name); \ + name::name##PluginSentinel::name##PluginSentinel() { \ + wxPluginLibrary *e = (wxPluginLibrary*) wxPluginLibrary::ms_classes.Get(#name); \ + if( e != 0 ) { e->RefObj(); } \ + } \ + name::name##PluginSentinel::~name##PluginSentinel() { \ + wxPluginLibrary *e = (wxPluginLibrary*) wxPluginLibrary::ms_classes.Get(#name); \ + if( e != 0 ) { e->UnrefObj(); } \ + } +#else + +#define _DECLARE_DL_SENTINEL(name) +#define _IMPLEMENT_DL_SENTINEL(name) + +#endif // wxUSE_NESTED_CLASSES + +#define DECLARE_PLUGGABLE_CLASS(name) \ + DECLARE_DYNAMIC_CLASS(name) _DECLARE_DL_SENTINEL(name, WXDLLEXPORT) +#define DECLARE_ABSTRACT_PLUGGABLE_CLASS(name) \ + DECLARE_ABSTRACT_CLASS(name) _DECLARE_DL_SENTINEL(name, WXDLLEXPORT) + +#define DECLARE_USER_EXPORTED_PLUGGABLE_CLASS(name, usergoo) \ + DECLARE_DYNAMIC_CLASS(name) _DECLARE_DL_SENTINEL(name, usergoo) +#define DECLARE_USER_EXPORTED_ABSTRACT_PLUGGABLE_CLASS(name, usergoo) \ + DECLARE_ABSTRACT_CLASS(name) _DECLARE_DL_SENTINEL(name, usergoo) + +#define IMPLEMENT_PLUGGABLE_CLASS(name, basename) \ + IMPLEMENT_DYNAMIC_CLASS(name, basename) _IMPLEMENT_DL_SENTINEL(name) +#define IMPLEMENT_PLUGGABLE_CLASS2(name, basename1, basename2) \ + IMPLEMENT_DYNAMIC_CLASS2(name, basename1, basename2) _IMPLEMENT_DL_SENTINEL(name) +#define IMPLEMENT_ABSTRACT_PLUGGABLE_CLASS(name, basename) \ + IMPLEMENT_ABSTRACT_CLASS(name, basename) _IMPLEMENT_DL_SENTINEL(name) +#define IMPLEMENT_ABSTRACT_PLUGGABLE_CLASS2(name, basename1, basename2) \ + IMPLEMENT_ABSTRACT_CLASS2(name, basename1, basename2) _IMPLEMENT_DL_SENTINEL(name) + +#define IMPLEMENT_USER_EXPORTED_PLUGGABLE_CLASS(name, basename) \ + IMPLEMENT_PLUGGABLE_CLASS(name, basename) +#define IMPLEMENT_USER_EXPORTED_PLUGGABLE_CLASS2(name, basename1, basename2) \ + IMPLEMENT_PLUGGABLE_CLASS2(name, basename1, basename2) +#define IMPLEMENT_USER_EXPORTED_ABSTRACT_PLUGGABLE_CLASS(name, basename) \ + IMPLEMENT_ABSTRACT_PLUGGABLE_CLASS(name, basename) +#define IMPLEMENT_USER_EXPORTED_ABSTRACT_PLUGGABLE_CLASS2(name, basename1, basename2) \ + IMPLEMENT_ABSTRACT_PLUGGABLE_CLASS2(name, basename1, basename2) + +#define CLASSINFO(name) (&name::ms_classInfo) + +#define wxIS_KIND_OF(obj, className) obj->IsKindOf(&className::ms_classInfo) + +// Just seems a bit nicer-looking (pretend it's not a macro) +#define wxIsKindOf(obj, className) obj->IsKindOf(&className::ms_classInfo) + +// this cast does some more checks at compile time as it uses static_cast +// internally +// +// note that it still has different semantics from dynamic_cast<> and so can't +// be replaced by it as long as there are any compilers not supporting it +#define wxDynamicCast(obj, className) \ + ((className *) wxCheckDynamicCast( \ + wx_const_cast(wxObject *, wx_static_cast(const wxObject *, \ + wx_const_cast(className *, wx_static_cast(const className *, obj)))), \ + &className::ms_classInfo)) + +// The 'this' pointer is always true, so use this version +// to cast the this pointer and avoid compiler warnings. +#define wxDynamicCastThis(className) \ + (IsKindOf(&className::ms_classInfo) ? (className *)(this) : (className *)0) + +#ifdef __WXDEBUG__ +inline void* wxCheckCast(void *ptr) +{ + wxASSERT_MSG( ptr, _T("wxStaticCast() used incorrectly") ); + return ptr; +} +#define wxStaticCast(obj, className) \ + ((className *)wxCheckCast(wxDynamicCast(obj, className))) + +#else // !__WXDEBUG__ +#define wxStaticCast(obj, className) \ + wx_const_cast(className *, wx_static_cast(const className *, obj)) + +#endif // __WXDEBUG__ + +// ---------------------------------------------------------------------------- +// set up memory debugging macros +// ---------------------------------------------------------------------------- + +/* + Which new/delete operator variants do we want? + + _WX_WANT_NEW_SIZET_WXCHAR_INT = void *operator new (size_t size, wxChar *fileName = 0, int lineNum = 0) + _WX_WANT_DELETE_VOID = void operator delete (void * buf) + _WX_WANT_DELETE_VOID_CONSTCHAR_SIZET = void operator delete (void *buf, const char *_fname, size_t _line) + _WX_WANT_DELETE_VOID_WXCHAR_INT = void operator delete(void *buf, wxChar*, int) + _WX_WANT_ARRAY_NEW_SIZET_WXCHAR_INT = void *operator new[] (size_t size, wxChar *fileName , int lineNum = 0) + _WX_WANT_ARRAY_DELETE_VOID = void operator delete[] (void *buf) + _WX_WANT_ARRAY_DELETE_VOID_WXCHAR_INT = void operator delete[] (void* buf, wxChar*, int ) +*/ + +#if defined(__WXDEBUG__) && wxUSE_MEMORY_TRACING + +// All compilers get this one +#define _WX_WANT_NEW_SIZET_WXCHAR_INT + +// Everyone except Visage gets the next one +#ifndef __VISAGECPP__ + #define _WX_WANT_DELETE_VOID +#endif + +// Only visage gets this one under the correct circumstances +#if defined(__VISAGECPP__) && __DEBUG_ALLOC__ + #define _WX_WANT_DELETE_VOID_CONSTCHAR_SIZET +#endif + +// Only VC++ 6 and CodeWarrior get overloaded delete that matches new +#if (defined(__VISUALC__) && (__VISUALC__ >= 1200)) || \ + (defined(__MWERKS__) && (__MWERKS__ >= 0x2400)) + #define _WX_WANT_DELETE_VOID_WXCHAR_INT +#endif + +// Now see who (if anyone) gets the array memory operators +#if wxUSE_ARRAY_MEMORY_OPERATORS + + // Everyone except Visual C++ (cause problems for VC++ - crashes) + #if !defined(__VISUALC__) + #define _WX_WANT_ARRAY_NEW_SIZET_WXCHAR_INT + #endif + + // Everyone except Visual C++ (cause problems for VC++ - crashes) + #if !defined(__VISUALC__) + #define _WX_WANT_ARRAY_DELETE_VOID + #endif + + // Only CodeWarrior 6 or higher + #if defined(__MWERKS__) && (__MWERKS__ >= 0x2400) + #define _WX_WANT_ARRAY_DELETE_VOID_WXCHAR_INT + #endif + +#endif // wxUSE_ARRAY_MEMORY_OPERATORS + +#endif // __WXDEBUG__ && wxUSE_MEMORY_TRACING + +// ---------------------------------------------------------------------------- +// wxObjectRefData: ref counted data meant to be stored in wxObject +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxObjectRefData +{ + friend class WXDLLIMPEXP_BASE wxObject; + +public: + wxObjectRefData() : m_count(1) { } + virtual ~wxObjectRefData() { } + + int GetRefCount() const { return m_count; } + +private: + int m_count; +}; + +// ---------------------------------------------------------------------------- +// wxObject: the root class of wxWidgets object hierarchy +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxObject +{ + DECLARE_ABSTRACT_CLASS(wxObject) + +public: + wxObject() { m_refData = NULL; } + virtual ~wxObject() { UnRef(); } + + wxObject(const wxObject& other) + { + m_refData = other.m_refData; + if (m_refData) + m_refData->m_count++; + } + + wxObject& operator=(const wxObject& other) + { + if ( this != &other ) + { + Ref(other); + } + return *this; + } + + bool IsKindOf(wxClassInfo *info) const; + + + // Turn on the correct set of new and delete operators + +#ifdef _WX_WANT_NEW_SIZET_WXCHAR_INT + void *operator new ( size_t size, const wxChar *fileName = NULL, int lineNum = 0 ); +#endif + +#ifdef _WX_WANT_DELETE_VOID + void operator delete ( void * buf ); +#endif + +#ifdef _WX_WANT_DELETE_VOID_CONSTCHAR_SIZET + void operator delete ( void *buf, const char *_fname, size_t _line ); +#endif + +#ifdef _WX_WANT_DELETE_VOID_WXCHAR_INT + void operator delete ( void *buf, const wxChar*, int ); +#endif + +#ifdef _WX_WANT_ARRAY_NEW_SIZET_WXCHAR_INT + void *operator new[] ( size_t size, const wxChar *fileName = NULL, int lineNum = 0 ); +#endif + +#ifdef _WX_WANT_ARRAY_DELETE_VOID + void operator delete[] ( void *buf ); +#endif + +#ifdef _WX_WANT_ARRAY_DELETE_VOID_WXCHAR_INT + void operator delete[] (void* buf, const wxChar*, int ); +#endif + + // ref counted data handling methods + + // get/set + wxObjectRefData *GetRefData() const { return m_refData; } + void SetRefData(wxObjectRefData *data) { m_refData = data; } + + // make a 'clone' of the object + void Ref(const wxObject& clone); + + // destroy a reference + void UnRef(); + + // Make sure this object has only one reference + void UnShare() { AllocExclusive(); } + + // check if this object references the same data as the other one + bool IsSameAs(const wxObject& o) const { return m_refData == o.m_refData; } + +protected: + // ensure that our data is not shared with anybody else: if we have no + // data, it is created using CreateRefData() below, if we have shared data + // it is copied using CloneRefData(), otherwise nothing is done + void AllocExclusive(); + + // both methods must be implemented if AllocExclusive() is used, not pure + // virtual only because of the backwards compatibility reasons + + // create a new m_refData + virtual wxObjectRefData *CreateRefData() const; + + // create a new m_refData initialized with the given one + virtual wxObjectRefData *CloneRefData(const wxObjectRefData *data) const; + + wxObjectRefData *m_refData; +}; + +inline wxObject *wxCheckDynamicCast(wxObject *obj, wxClassInfo *classInfo) +{ + return obj && obj->GetClassInfo()->IsKindOf(classInfo) ? obj : NULL; +} + +#if wxUSE_EXTENDED_RTTI +class WXDLLIMPEXP_BASE wxDynamicObject : public wxObject +{ + friend class WXDLLIMPEXP_BASE wxDynamicClassInfo ; +public: + // instantiates this object with an instance of its superclass + wxDynamicObject(wxObject* superClassInstance, const wxDynamicClassInfo *info) ; + virtual ~wxDynamicObject(); + + void SetProperty (const wxChar *propertyName, const wxxVariant &value); + wxxVariant GetProperty (const wxChar *propertyName) const ; + + // get the runtime identity of this object + wxClassInfo *GetClassInfo() const + { +#ifdef _MSC_VER + return (wxClassInfo*) m_classInfo; +#else + return wx_const_cast(wxClassInfo *, m_classInfo); +#endif + } + + wxObject* GetSuperClassInstance() const + { + return m_superClassInstance ; + } +private : + // removes an existing runtime-property + void RemoveProperty( const wxChar *propertyName ) ; + + // renames an existing runtime-property + void RenameProperty( const wxChar *oldPropertyName , const wxChar *newPropertyName ) ; + + wxObject *m_superClassInstance ; + const wxDynamicClassInfo *m_classInfo; + struct wxDynamicObjectInternal; + wxDynamicObjectInternal *m_data; +}; +#endif + +// ---------------------------------------------------------------------------- +// more debugging macros +// ---------------------------------------------------------------------------- + +// Redefine new to be the debugging version. This doesn't work with all +// compilers, in which case you need to use WXDEBUG_NEW explicitly if you wish +// to use the debugging version. + +#ifdef __WXDEBUG__ + #define WXDEBUG_NEW new(__TFILE__,__LINE__) + + #if wxUSE_DEBUG_NEW_ALWAYS + #if wxUSE_GLOBAL_MEMORY_OPERATORS + #define new WXDEBUG_NEW + #elif defined(__VISUALC__) + // Including this file redefines new and allows leak reports to + // contain line numbers + #include "wx/msw/msvcrt.h" + #endif + #endif // wxUSE_DEBUG_NEW_ALWAYS +#else // !__WXDEBUG__ + #define WXDEBUG_NEW new +#endif // __WXDEBUG__/!__WXDEBUG__ + +#endif // _WX_OBJECTH__ diff --git a/Externals/wxWidgets/include/wx/odcombo.h b/Externals/wxWidgets/include/wx/odcombo.h new file mode 100644 index 0000000000..14e137939c --- /dev/null +++ b/Externals/wxWidgets/include/wx/odcombo.h @@ -0,0 +1,386 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/odcombo.h +// Purpose: wxOwnerDrawnComboBox and wxVListBoxPopup +// Author: Jaakko Salli +// Modified by: +// Created: Apr-30-2006 +// RCS-ID: $Id: odcombo.h 41305 2006-09-19 17:16:50Z RR $ +// Copyright: (c) Jaakko Salli +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_ODCOMBO_H_ +#define _WX_ODCOMBO_H_ + +#include "wx/defs.h" + +#if wxUSE_ODCOMBOBOX + +#include "wx/combo.h" +#include "wx/ctrlsub.h" +#include "wx/vlbox.h" +#include "wx/timer.h" + + +// +// New window styles for wxOwnerDrawnComboBox +// +enum +{ + // Double-clicking cycles item if wxCB_READONLY is also used. + wxODCB_DCLICK_CYCLES = wxCC_SPECIAL_DCLICK, + + // If used, control itself is not custom paint using callback. + // Even if this is not used, writable combo is never custom paint + // until SetCustomPaintWidth is called + wxODCB_STD_CONTROL_PAINT = 0x1000 +}; + + +// +// Callback flags (see wxOwnerDrawnComboBox::OnDrawItem) +// +enum +{ + // when set, we are painting the selected item in control, + // not in the popup + wxODCB_PAINTING_CONTROL = 0x0001, + + + // when set, we are painting an item which should have + // focus rectangle painted in the background. Text colour + // and clipping region are then appropriately set in + // the default OnDrawBackground implementation. + wxODCB_PAINTING_SELECTED = 0x0002 +}; + + +// ---------------------------------------------------------------------------- +// wxVListBoxComboPopup is a wxVListBox customized to act as a popup control. +// +// Notes: +// wxOwnerDrawnComboBox uses this as its popup. However, it always derives +// from native wxComboCtrl. If you need to use this popup with +// wxGenericComboControl, then remember that vast majority of item manipulation +// functionality is implemented in the wxVListBoxComboPopup class itself. +// +// ---------------------------------------------------------------------------- + + +class WXDLLIMPEXP_ADV wxVListBoxComboPopup : public wxVListBox, + public wxComboPopup +{ + friend class wxOwnerDrawnComboBox; +public: + + // init and dtor + wxVListBoxComboPopup() : wxVListBox(), wxComboPopup() { } + virtual ~wxVListBoxComboPopup(); + + // required virtuals + virtual void Init(); + virtual bool Create(wxWindow* parent); + virtual wxWindow *GetControl() { return this; } + virtual void SetStringValue( const wxString& value ); + virtual wxString GetStringValue() const; + + // more customization + virtual void OnPopup(); + virtual wxSize GetAdjustedSize( int minWidth, int prefHeight, int maxHeight ); + virtual void PaintComboControl( wxDC& dc, const wxRect& rect ); + virtual void OnComboKeyEvent( wxKeyEvent& event ); + virtual void OnComboDoubleClick(); + virtual bool LazyCreate(); + + // Item management + void SetSelection( int item ); + void Insert( const wxString& item, int pos ); + int Append(const wxString& item); + void Clear(); + void Delete( unsigned int item ); + void SetItemClientData(unsigned int n, void* clientData, wxClientDataType clientDataItemsType); + void *GetItemClientData(unsigned int n) const; + void SetString( int item, const wxString& str ); + wxString GetString( int item ) const; + unsigned int GetCount() const; + int FindString(const wxString& s, bool bCase = false) const; + int GetSelection() const; + + //void Populate( int n, const wxString choices[] ); + void Populate( const wxArrayString& choices ); + void ClearClientDatas(); + + // helpers + int GetItemAtPosition( const wxPoint& pos ) { return HitTest(pos); } + wxCoord GetTotalHeight() const { return EstimateTotalHeight(); } + wxCoord GetLineHeight(int line) const { return OnGetLineHeight(line); } + +protected: + + // Called by OnComboDoubleClick and OnComboKeyEvent + bool HandleKey( int keycode, bool saturate, wxChar unicode = 0 ); + + // sends combobox select event from the parent combo control + void SendComboBoxEvent( int selection ); + + // gets value, sends event and dismisses + void DismissWithEvent(); + + // OnMeasureItemWidth will be called on next GetAdjustedSize. + void ItemWidthChanged(unsigned int item) + { + m_widths[item] = -1; + m_widthsDirty = true; + } + + // Callbacks for drawing and measuring items. Override in a derived class for + // owner-drawnness. Font, background and text colour have been prepared according + // to selection, focus and such. + // + // item: item index to be drawn, may be wxNOT_FOUND when painting combo control itself + // and there is no valid selection + // flags: wxODCB_PAINTING_CONTROL is set if painting to combo control instead of list + // NOTE: If wxVListBoxComboPopup is used with wxComboCtrl class not derived from + // wxOwnerDrawnComboBox, this method must be overridden. + virtual void OnDrawItem( wxDC& dc, const wxRect& rect, int item, int flags ) const; + + // This is same as in wxVListBox + virtual wxCoord OnMeasureItem( size_t item ) const; + + // Return item width, or -1 for calculating from text extent (default) + virtual wxCoord OnMeasureItemWidth( size_t item ) const; + + // Draw item and combo control background. Flags are same as with OnDrawItem. + // NB: Can't use name OnDrawBackground because of virtual function hiding warnings. + virtual void OnDrawBg(wxDC& dc, const wxRect& rect, int item, int flags) const; + + // Additional wxVListBox implementation (no need to override in derived classes) + virtual void OnDrawItem(wxDC& dc, const wxRect& rect, size_t n) const; + void OnDrawBackground(wxDC& dc, const wxRect& rect, size_t n) const; + + // filter mouse move events happening outside the list box + // move selection with cursor + void OnMouseMove(wxMouseEvent& event); + void OnMouseWheel(wxMouseEvent& event); + void OnKey(wxKeyEvent& event); + void OnLeftClick(wxMouseEvent& event); + + // Return the widest item width (recalculating it if necessary) + int GetWidestItemWidth() { CalcWidths(); return m_widestWidth; } + + // Return the index of the widest item (recalculating it if necessary) + int GetWidestItem() { CalcWidths(); return m_widestItem; } + + // Stop partial completion (when some other event occurs) + void StopPartialCompletion(); + + wxArrayString m_strings; + wxArrayPtrVoid m_clientDatas; + + wxFont m_useFont; + + //wxString m_stringValue; // displayed text (may be different than m_strings[m_value]) + int m_value; // selection + int m_itemHover; // on which item the cursor is + int m_itemHeight; // default item height (calculate from font size + // and used in the absence of callback) + wxClientDataType m_clientDataItemsType; + +private: + + // Cached item widths (in pixels). + wxArrayInt m_widths; + + // Width of currently widest item. + int m_widestWidth; + + // Index of currently widest item. + int m_widestItem; + + // Measure some items in next GetAdjustedSize? + bool m_widthsDirty; + + // Find widest item in next GetAdjustedSize? + bool m_findWidest; + + // has the mouse been released on this control? + bool m_clicked; + + // Recalculate widths if they are dirty + void CalcWidths(); + + // Partial completion string + wxString m_partialCompletionString; + +#if wxUSE_TIMER + // Partial completion timer + wxTimer m_partialCompletionTimer; +#endif // wxUSE_TIMER + + DECLARE_EVENT_TABLE() +}; + + +// ---------------------------------------------------------------------------- +// wxOwnerDrawnComboBox: a generic wxComboBox that allows custom paint items +// in addition to many other types of customization already allowed by +// the wxComboCtrl. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxOwnerDrawnComboBox : public wxComboCtrl, + public wxItemContainer +{ + //friend class wxComboPopupWindow; + friend class wxVListBoxComboPopup; +public: + + // ctors and such + wxOwnerDrawnComboBox() : wxComboCtrl() { Init(); } + + wxOwnerDrawnComboBox(wxWindow *parent, + wxWindowID id, + const wxString& value, + const wxPoint& pos, + const wxSize& size, + int n, + const wxString choices[], + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxComboBoxNameStr) + : wxComboCtrl() + { + Init(); + + (void)Create(parent, id, value, pos, size, n, + choices, style, validator, name); + } + + bool Create(wxWindow *parent, + wxWindowID id, + const wxString& value = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxComboBoxNameStr); + + wxOwnerDrawnComboBox(wxWindow *parent, + wxWindowID id, + const wxString& value, + const wxPoint& pos, + const wxSize& size, + const wxArrayString& choices, + long style, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxComboBoxNameStr); + + bool Create(wxWindow *parent, + wxWindowID id, + const wxString& value, + const wxPoint& pos, + const wxSize& size, + int n, + const wxString choices[], + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxComboBoxNameStr); + + bool Create(wxWindow *parent, + wxWindowID id, + const wxString& value, + const wxPoint& pos, + const wxSize& size, + const wxArrayString& choices, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxComboBoxNameStr); + + virtual ~wxOwnerDrawnComboBox(); + + // Prevent app from using wxComboPopup + void SetPopupControl(wxVListBoxComboPopup* popup) + { + DoSetPopupControl(popup); + } + + // wxControlWithItems methods + virtual void Clear(); + virtual void Delete(unsigned int n); + virtual unsigned int GetCount() const; + virtual wxString GetString(unsigned int n) const; + virtual void SetString(unsigned int n, const wxString& s); + virtual int FindString(const wxString& s, bool bCase = false) const; + virtual void Select(int n); + virtual int GetSelection() const; + virtual void SetSelection(int n) { Select(n); } + + + // Prevent a method from being hidden + virtual void SetSelection(long from, long to) + { + wxComboCtrl::SetSelection(from,to); + } + + // Return the widest item width (recalculating it if necessary) + virtual int GetWidestItemWidth() { EnsurePopupControl(); return GetVListBoxComboPopup()->GetWidestItemWidth(); } + + // Return the index of the widest item (recalculating it if necessary) + virtual int GetWidestItem() { EnsurePopupControl(); return GetVListBoxComboPopup()->GetWidestItem(); } + + wxCONTROL_ITEMCONTAINER_CLIENTDATAOBJECT_RECAST + +protected: + + // Callback for drawing. Font, background and text colour have been + // prepared according to selection, focus and such. + // item: item index to be drawn, may be wxNOT_FOUND when painting combo control itself + // and there is no valid selection + // flags: wxODCB_PAINTING_CONTROL is set if painting to combo control instead of list + virtual void OnDrawItem( wxDC& dc, const wxRect& rect, int item, int flags ) const; + + // Callback for item height, or -1 for default + virtual wxCoord OnMeasureItem( size_t item ) const; + + // Callback for item width, or -1 for default/undetermined + virtual wxCoord OnMeasureItemWidth( size_t item ) const; + + // Callback for background drawing. Flags are same as with + // OnDrawItem. + virtual void OnDrawBackground( wxDC& dc, const wxRect& rect, int item, int flags ) const; + + // NULL popup can be used to indicate default interface + virtual void DoSetPopupControl(wxComboPopup* popup); + + // clears all allocated client datas + void ClearClientDatas(); + + wxVListBoxComboPopup* GetVListBoxComboPopup() const + { + return (wxVListBoxComboPopup*) m_popupInterface; + } + + virtual int DoAppend(const wxString& item); + virtual int DoInsert(const wxString& item, unsigned int pos); + virtual void DoSetItemClientData(unsigned int n, void* clientData); + virtual void* DoGetItemClientData(unsigned int n) const; + virtual void DoSetItemClientObject(unsigned int n, wxClientData* clientData); + virtual wxClientData* DoGetItemClientObject(unsigned int n) const; + + // temporary storage for the initial choices + //const wxString* m_baseChoices; + //int m_baseChoicesCount; + wxArrayString m_initChs; + +private: + void Init(); + + DECLARE_EVENT_TABLE() + + DECLARE_DYNAMIC_CLASS(wxOwnerDrawnComboBox) +}; + + +#endif // wxUSE_ODCOMBOBOX + +#endif + // _WX_ODCOMBO_H_ diff --git a/Externals/wxWidgets/include/wx/overlay.h b/Externals/wxWidgets/include/wx/overlay.h new file mode 100644 index 0000000000..eabdef6489 --- /dev/null +++ b/Externals/wxWidgets/include/wx/overlay.h @@ -0,0 +1,97 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/overlay.h +// Purpose: wxOverlay class +// Author: Stefan Csomor +// Modified by: +// Created: 2006-10-20 +// RCS-ID: $Id: overlay.h 49804 2007-11-10 01:09:42Z VZ $ +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_OVERLAY_H_ +#define _WX_OVERLAY_H_ + +#include "wx/defs.h" + +#if defined(wxMAC_USE_CORE_GRAPHICS) && wxMAC_USE_CORE_GRAPHICS + #define wxHAS_NATIVE_OVERLAY 1 +#elif defined(__WXDFB__) + #define wxHAS_NATIVE_OVERLAY 1 +#else + // don't define wxHAS_NATIVE_OVERLAY +#endif + +// ---------------------------------------------------------------------------- +// creates an overlay over an existing window, allowing for manipulations like +// rubberbanding etc. This API is not stable yet, not to be used outside wx +// internal code +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_CORE wxOverlayImpl; +class WXDLLIMPEXP_FWD_CORE wxWindowDC; + +class WXDLLEXPORT wxOverlay +{ +public: + wxOverlay(); + ~wxOverlay(); + + // clears the overlay without restoring the former state + // to be done eg when the window content has been changed and repainted + void Reset(); + + // returns (port-specific) implementation of the overlay + wxOverlayImpl *GetImpl() { return m_impl; } + +private: + friend class WXDLLEXPORT wxDCOverlay; + + // returns true if it has been setup + bool IsOk(); + + void Init(wxWindowDC* dc, int x , int y , int width , int height); + + void BeginDrawing(wxWindowDC* dc); + + void EndDrawing(wxWindowDC* dc); + + void Clear(wxWindowDC* dc); + + wxOverlayImpl* m_impl; + + bool m_inDrawing; + + + DECLARE_NO_COPY_CLASS(wxOverlay) +}; + + +class WXDLLEXPORT wxDCOverlay +{ +public: + // connects this overlay to the corresponding drawing dc, if the overlay is + // not initialized yet this call will do so + wxDCOverlay(wxOverlay &overlay, wxWindowDC *dc, int x , int y , int width , int height); + + // convenience wrapper that behaves the same using the entire area of the dc + wxDCOverlay(wxOverlay &overlay, wxWindowDC *dc); + + // removes the connection between the overlay and the dc + virtual ~wxDCOverlay(); + + // clears the layer, restoring the state at the last init + void Clear(); + +private: + void Init(wxWindowDC *dc, int x , int y , int width , int height); + + wxOverlay& m_overlay; + + wxWindowDC* m_dc; + + + DECLARE_NO_COPY_CLASS(wxDCOverlay) +}; + +#endif // _WX_OVERLAY_H_ diff --git a/Externals/wxWidgets/include/wx/ownerdrw.h b/Externals/wxWidgets/include/wx/ownerdrw.h new file mode 100644 index 0000000000..81f6e544f8 --- /dev/null +++ b/Externals/wxWidgets/include/wx/ownerdrw.h @@ -0,0 +1,174 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: ownerdrw.h +// Purpose: interface for owner-drawn GUI elements +// Author: Vadim Zeitlin +// Modified by: +// Created: 11.11.97 +// RCS-ID: $Id: ownerdrw.h 35695 2005-09-25 20:43:35Z VZ $ +// Copyright: (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _OWNERDRW_H +#define _OWNERDRW_H + +#include "wx/defs.h" + +#if wxUSE_OWNER_DRAWN + +#include "wx/bitmap.h" +#include "wx/colour.h" +#include "wx/font.h" + +// ---------------------------------------------------------------------------- +// wxOwnerDrawn - a mix-in base class, derive from it to implement owner-drawn +// behaviour +// +// wxOwnerDrawn supports drawing of an item with non standard font, color and +// also supports 3 bitmaps: either a checked/unchecked bitmap for a checkable +// element or one unchangeable bitmap otherwise. +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxOwnerDrawn +{ +public: + // ctor & dtor + wxOwnerDrawn(const wxString& str = wxEmptyString, + bool bCheckable = false, + bool bMenuItem = false); // FIXME kludge for colors + virtual ~wxOwnerDrawn(); + + // fix appearance + void SetFont(const wxFont& font) + { m_font = font; m_bOwnerDrawn = true; } + + wxFont& GetFont() const { return (wxFont &)m_font; } + + void SetTextColour(const wxColour& colText) + { m_colText = colText; m_bOwnerDrawn = true; } + + wxColour& GetTextColour() const { return (wxColour&) m_colText; } + + void SetBackgroundColour(const wxColour& colBack) + { m_colBack = colBack; m_bOwnerDrawn = true; } + + wxColour& GetBackgroundColour() const + { return (wxColour&) m_colBack ; } + + void SetBitmaps(const wxBitmap& bmpChecked, + const wxBitmap& bmpUnchecked = wxNullBitmap) + { m_bmpChecked = bmpChecked; + m_bmpUnchecked = bmpUnchecked; + m_bOwnerDrawn = true; } + + void SetBitmap(const wxBitmap& bmpChecked) + { m_bmpChecked = bmpChecked; + m_bOwnerDrawn = true; } + + void SetDisabledBitmap( const wxBitmap& bmpDisabled ) + { m_bmpDisabled = bmpDisabled; + m_bOwnerDrawn = true; } + + const wxBitmap& GetBitmap(bool bChecked = true) const + { return (bChecked ? m_bmpChecked : m_bmpUnchecked); } + + const wxBitmap& GetDisabledBitmap() const + { return m_bmpDisabled; } + + // the height of the menu checkmark (or bitmap) is determined by the font + // for the current item, but the width should be always the same (for the + // items to be aligned), so by default it's taken to be the same as for + // the last item (and default width for the first one). + // + // NB: default is too small for bitmaps, but ok for checkmarks. + void SetMarginWidth(int nWidth) + { + ms_nLastMarginWidth = m_nMarginWidth = (size_t) nWidth; + if ( ((size_t) nWidth) != ms_nDefaultMarginWidth ) + m_bOwnerDrawn = true; + } + + int GetMarginWidth() const { return (int) m_nMarginWidth; } + static int GetDefaultMarginWidth() { return (int) ms_nDefaultMarginWidth; } + + // accessors + void SetName(const wxString& strName) { m_strName = strName; } + const wxString& GetName() const { return m_strName; } + void SetCheckable(bool checkable) { m_bCheckable = checkable; } + bool IsCheckable() const { return m_bCheckable; } + + // this is for menu items only: accel string is drawn right aligned after the + // menu item if not empty + void SetAccelString(const wxString& strAccel) { m_strAccel = strAccel; } + + // this function might seem strange, but if it returns false it means that + // no non-standard attribute are set, so there is no need for this control + // to be owner-drawn. Moreover, you can force owner-drawn to false if you + // want to change, say, the color for the item but only if it is owner-drawn + // (see wxMenuItem::wxMenuItem for example) + bool IsOwnerDrawn() const { return m_bOwnerDrawn; } + + // switch on/off owner-drawing the item + void SetOwnerDrawn(bool ownerDrawn = true) { m_bOwnerDrawn = ownerDrawn; } + void ResetOwnerDrawn() { m_bOwnerDrawn = false; } + +public: + // constants used in OnDrawItem + // (they have the same values as corresponding Win32 constants) + enum wxODAction + { + wxODDrawAll = 0x0001, // redraw entire control + wxODSelectChanged = 0x0002, // selection changed (see Status.Select) + wxODFocusChanged = 0x0004 // keyboard focus changed (see Status.Focus) + }; + + enum wxODStatus + { + wxODSelected = 0x0001, // control is currently selected + wxODGrayed = 0x0002, // item is to be grayed + wxODDisabled = 0x0004, // item is to be drawn as disabled + wxODChecked = 0x0008, // item is to be checked + wxODHasFocus = 0x0010, // item has the keyboard focus + wxODDefault = 0x0020, // item is the default item + wxODHidePrefix= 0x0100 // hide keyboard cues (w2k and xp only) + }; + + // virtual functions to implement drawing (return true if processed) + virtual bool OnMeasureItem(size_t *pwidth, size_t *pheight); + virtual bool OnDrawItem(wxDC& dc, const wxRect& rc, wxODAction act, wxODStatus stat); + +protected: + // return true if this is a menu item + bool IsMenuItem() const; + + // get the font to use, whether m_font is set or not + wxFont GetFontToUse() const; + + + wxString m_strName, // label for a manu item + m_strAccel; // the accel string ("Ctrl-F17") if any + +private: + static size_t ms_nDefaultMarginWidth; // menu check mark width + static size_t ms_nLastMarginWidth; // handy for aligning all items + + bool m_bCheckable, // used only for menu or check listbox items + m_bOwnerDrawn, // true if something is non standard + m_isMenuItem; // true if this is a menu item + + wxFont m_font; // font to use for drawing + wxColour m_colText, // color ----"---"---"---- + m_colBack; // background color + wxBitmap m_bmpChecked, // bitmap to put near the item + m_bmpUnchecked, // (checked is used also for 'uncheckable' items) + m_bmpDisabled; + + size_t m_nHeight, // font height + m_nMinHeight, // minimum height, as determined by user's system settings + m_nMarginWidth; // space occupied by bitmap to the left of the item +}; + +#endif // wxUSE_OWNER_DRAWN + +#endif + // _OWNERDRW_H diff --git a/Externals/wxWidgets/include/wx/palette.h b/Externals/wxWidgets/include/wx/palette.h new file mode 100644 index 0000000000..f81135365c --- /dev/null +++ b/Externals/wxWidgets/include/wx/palette.h @@ -0,0 +1,59 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/palette.h +// Purpose: Common header and base class for wxPalette +// Author: Julian Smart +// Modified by: +// Created: +// RCS-ID: $Id: palette.h 41751 2006-10-08 21:56:55Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_PALETTE_H_BASE_ +#define _WX_PALETTE_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_PALETTE + +#include "wx/object.h" +#include "wx/gdiobj.h" + +// wxPaletteBase +class WXDLLEXPORT wxPaletteBase: public wxGDIObject +{ +public: + virtual ~wxPaletteBase() { } + + virtual bool Ok() const { return IsOk(); } + virtual bool IsOk() const = 0; + virtual int GetColoursCount() const { wxFAIL_MSG( _T("not implemented") ); return 0; } +}; + +#if defined(__WXPALMOS__) + #include "wx/palmos/palette.h" +#elif defined(__WXMSW__) + #include "wx/msw/palette.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/palette.h" +#elif defined(__WXGTK__) || defined(__WXCOCOA__) + #include "wx/generic/paletteg.h" +#elif defined(__WXX11__) + #include "wx/x11/palette.h" +#elif defined(__WXMGL__) + #include "wx/mgl/palette.h" +#elif defined(__WXMAC__) + #include "wx/mac/palette.h" +#elif defined(__WXPM__) + #include "wx/os2/palette.h" +#endif + +#if WXWIN_COMPATIBILITY_2_4 + #define wxColorMap wxPalette + #define wxColourMap wxPalette +#endif + +#endif // wxUSE_PALETTE + +#endif + // _WX_PALETTE_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/panel.h b/Externals/wxWidgets/include/wx/panel.h new file mode 100644 index 0000000000..260e2b972b --- /dev/null +++ b/Externals/wxWidgets/include/wx/panel.h @@ -0,0 +1,18 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/panel.h +// Purpose: Base header for wxPanel +// Author: Julian Smart +// Modified by: +// Created: +// RCS-ID: $Id: panel.h 33948 2005-05-04 18:57:50Z JS $ +// Copyright: (c) Julian Smart +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_PANEL_H_BASE_ +#define _WX_PANEL_H_BASE_ + +#include "wx/generic/panelg.h" + +#endif + // _WX_PANELH_BASE_ diff --git a/Externals/wxWidgets/include/wx/paper.h b/Externals/wxWidgets/include/wx/paper.h new file mode 100644 index 0000000000..b4c7be4376 --- /dev/null +++ b/Externals/wxWidgets/include/wx/paper.h @@ -0,0 +1,122 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: paper.h +// Purpose: Paper database types and classes +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: paper.h 36973 2006-01-18 16:45:41Z JS $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_PAPERH__ +#define _WX_PAPERH__ + +#include "wx/defs.h" +#include "wx/event.h" +#include "wx/cmndata.h" +#include "wx/intl.h" +#include "wx/hashmap.h" + +/* + * Paper type: see defs.h for wxPaperSize enum. + * A wxPrintPaperType can have an id and a name, or just a name and wxPAPER_NONE, + * so you can add further paper types without needing new ids. + */ + +#ifdef __WXMSW__ +#define WXADDPAPER(paperId, platformId, name, w, h) AddPaperType(paperId, platformId, name, w, h) +#else +#define WXADDPAPER(paperId, platformId, name, w, h) AddPaperType(paperId, 0, name, w, h) +#endif + +class WXDLLEXPORT wxPrintPaperType: public wxObject +{ +public: + wxPrintPaperType(); + + // platformId is a platform-specific id, such as in Windows, DMPAPER_... + wxPrintPaperType(wxPaperSize paperId, int platformId, const wxString& name, int w, int h); + + inline wxString GetName() const { return wxGetTranslation(m_paperName); } + inline wxPaperSize GetId() const { return m_paperId; } + inline int GetPlatformId() const { return m_platformId; } + + // Get width and height in tenths of a millimetre + inline int GetWidth() const { return m_width; } + inline int GetHeight() const { return m_height; } + + // Get size in tenths of a millimetre + inline wxSize GetSize() const { return wxSize(m_width, m_height); } + + // Get size in a millimetres + inline wxSize GetSizeMM() const { return wxSize(m_width/10, m_height/10); } + + // Get width and height in device units (1/72th of an inch) + wxSize GetSizeDeviceUnits() const ; + +public: + wxPaperSize m_paperId; + int m_platformId; + int m_width; // In tenths of a millimetre + int m_height; // In tenths of a millimetre + wxString m_paperName; + +private: + DECLARE_DYNAMIC_CLASS(wxPrintPaperType) +}; + +WX_DECLARE_STRING_HASH_MAP(wxPrintPaperType*, wxStringToPrintPaperTypeHashMap); + +class WXDLLEXPORT wxPrintPaperTypeList; + +class WXDLLEXPORT wxPrintPaperDatabase +{ +public: + wxPrintPaperDatabase(); + ~wxPrintPaperDatabase(); + + void CreateDatabase(); + void ClearDatabase(); + + void AddPaperType(wxPaperSize paperId, const wxString& name, int w, int h); + void AddPaperType(wxPaperSize paperId, int platformId, const wxString& name, int w, int h); + + // Find by name + wxPrintPaperType *FindPaperType(const wxString& name); + + // Find by size id + wxPrintPaperType *FindPaperType(wxPaperSize id); + + // Find by platform id + wxPrintPaperType *FindPaperTypeByPlatformId(int id); + + // Find by size + wxPrintPaperType *FindPaperType(const wxSize& size); + + // Convert name to size id + wxPaperSize ConvertNameToId(const wxString& name); + + // Convert size id to name + wxString ConvertIdToName(wxPaperSize paperId); + + // Get the paper size + wxSize GetSize(wxPaperSize paperId); + + // Get the paper size + wxPaperSize GetSize(const wxSize& size); + + // + wxPrintPaperType* Item(size_t index) const; + size_t GetCount() const; +private: + wxStringToPrintPaperTypeHashMap* m_map; + wxPrintPaperTypeList* m_list; + // DECLARE_DYNAMIC_CLASS(wxPrintPaperDatabase) +}; + +extern WXDLLEXPORT_DATA(wxPrintPaperDatabase*) wxThePrintPaperDatabase; + + +#endif + // _WX_PAPERH__ diff --git a/Externals/wxWidgets/include/wx/pen.h b/Externals/wxWidgets/include/wx/pen.h new file mode 100644 index 0000000000..cd28212f56 --- /dev/null +++ b/Externals/wxWidgets/include/wx/pen.h @@ -0,0 +1,40 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/pen.h +// Purpose: Base header for wxPen +// Author: Julian Smart +// Modified by: +// Created: +// RCS-ID: $Id: pen.h 40865 2006-08-27 09:42:42Z VS $ +// Copyright: (c) Julian Smart +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_PEN_H_BASE_ +#define _WX_PEN_H_BASE_ + +#include "wx/defs.h" + +#if defined(__WXPALMOS__) +#include "wx/palmos/pen.h" +#elif defined(__WXMSW__) +#include "wx/msw/pen.h" +#elif defined(__WXMOTIF__) || defined(__WXX11__) +#include "wx/x11/pen.h" +#elif defined(__WXGTK20__) +#include "wx/gtk/pen.h" +#elif defined(__WXGTK__) +#include "wx/gtk1/pen.h" +#elif defined(__WXMGL__) +#include "wx/mgl/pen.h" +#elif defined(__WXDFB__) +#include "wx/dfb/pen.h" +#elif defined(__WXMAC__) +#include "wx/mac/pen.h" +#elif defined(__WXCOCOA__) +#include "wx/cocoa/pen.h" +#elif defined(__WXPM__) +#include "wx/os2/pen.h" +#endif + +#endif + // _WX_PEN_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/pickerbase.h b/Externals/wxWidgets/include/wx/pickerbase.h new file mode 100644 index 0000000000..da79f2deaf --- /dev/null +++ b/Externals/wxWidgets/include/wx/pickerbase.h @@ -0,0 +1,189 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/pickerbase.h +// Purpose: wxPickerBase definition +// Author: Francesco Montorsi (based on Vadim Zeitlin's code) +// Modified by: +// Created: 14/4/2006 +// Copyright: (c) Vadim Zeitlin, Francesco Montorsi +// RCS-ID: $Id: pickerbase.h 49804 2007-11-10 01:09:42Z VZ $ +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_PICKERBASE_H_BASE_ +#define _WX_PICKERBASE_H_BASE_ + +#include "wx/control.h" +#include "wx/sizer.h" +#include "wx/containr.h" + +class WXDLLIMPEXP_FWD_CORE wxTextCtrl; +class WXDLLIMPEXP_FWD_CORE wxToolTip; + +extern WXDLLEXPORT_DATA(const wxChar) wxButtonNameStr[]; + +// ---------------------------------------------------------------------------- +// wxPickerBase is the base class for the picker controls which support +// a wxPB_USE_TEXTCTRL style; i.e. for those pickers which can use an auxiliary +// text control next to the 'real' picker. +// +// The wxTextPickerHelper class manages enabled/disabled state of the text control, +// its sizing and positioning. +// ---------------------------------------------------------------------------- + +#define wxPB_USE_TEXTCTRL 0x0002 + +class WXDLLIMPEXP_CORE wxPickerBase : public wxControl +{ +public: + // ctor: text is the associated text control + wxPickerBase() : m_text(NULL), m_picker(NULL), m_sizer(NULL) + { m_container.SetContainerWindow(this); } + virtual ~wxPickerBase() {} + + + // if present, intercepts wxPB_USE_TEXTCTRL style and creates the text control + // The 3rd argument is the initial wxString to display in the text control + bool CreateBase(wxWindow *parent, + wxWindowID id, + const wxString& text = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxButtonNameStr); + +public: // public API + + // margin between the text control and the picker + void SetInternalMargin(int newmargin) + { GetTextCtrlItem()->SetBorder(newmargin); m_sizer->Layout(); } + int GetInternalMargin() const + { return GetTextCtrlItem()->GetBorder(); } + + // proportion of the text control + void SetTextCtrlProportion(int prop) + { GetTextCtrlItem()->SetProportion(prop); m_sizer->Layout(); } + int GetTextCtrlProportion() const + { return GetTextCtrlItem()->GetProportion(); } + + // proportion of the picker control + void SetPickerCtrlProportion(int prop) + { GetPickerCtrlItem()->SetProportion(prop); m_sizer->Layout(); } + int GetPickerCtrlProportion() const + { return GetPickerCtrlItem()->GetProportion(); } + + bool IsTextCtrlGrowable() const + { return (GetTextCtrlItem()->GetFlag() & wxGROW) != 0; } + void SetTextCtrlGrowable(bool grow = true) + { + int f = GetDefaultTextCtrlFlag(); + if ( grow ) + f |= wxGROW; + else + f &= ~wxGROW; + + GetTextCtrlItem()->SetFlag(f); + } + + bool IsPickerCtrlGrowable() const + { return (GetPickerCtrlItem()->GetFlag() & wxGROW) != 0; } + void SetPickerCtrlGrowable(bool grow = true) + { + int f = GetDefaultPickerCtrlFlag(); + if ( grow ) + f |= wxGROW; + else + f &= ~wxGROW; + + GetPickerCtrlItem()->SetFlag(f); + } + + bool HasTextCtrl() const + { return m_text != NULL; } + wxTextCtrl *GetTextCtrl() + { return m_text; } + wxControl *GetPickerCtrl() + { return m_picker; } + + // methods that derived class must/may override + virtual void UpdatePickerFromTextCtrl() = 0; + virtual void UpdateTextCtrlFromPicker() = 0; + +protected: + // overridden base class methods +#if wxUSE_TOOLTIPS + virtual void DoSetToolTip(wxToolTip *tip); +#endif // wxUSE_TOOLTIPS + + + // event handlers + void OnTextCtrlDelete(wxWindowDestroyEvent &); + void OnTextCtrlUpdate(wxCommandEvent &); + void OnTextCtrlKillFocus(wxFocusEvent &); + + void OnSize(wxSizeEvent &); + + // returns the set of styles for the attached wxTextCtrl + // from given wxPickerBase's styles + virtual long GetTextCtrlStyle(long style) const + { return (style & wxWINDOW_STYLE_MASK); } + + // returns the set of styles for the m_picker + virtual long GetPickerStyle(long style) const + { return (style & wxWINDOW_STYLE_MASK); } + + + wxSizerItem *GetPickerCtrlItem() const + { + if (this->HasTextCtrl()) + return m_sizer->GetItem((size_t)1); + return m_sizer->GetItem((size_t)0); + } + + wxSizerItem *GetTextCtrlItem() const + { + wxASSERT(this->HasTextCtrl()); + return m_sizer->GetItem((size_t)0); + } + + int GetDefaultPickerCtrlFlag() const + { + // on macintosh, without additional borders + // there's not enough space for focus rect + return wxALIGN_CENTER_VERTICAL|wxGROW +#ifdef __WXMAC__ + | wxTOP | wxRIGHT | wxBOTTOM +#endif + ; + } + + int GetDefaultTextCtrlFlag() const + { + // on macintosh, without wxALL there's not enough space for focus rect + return wxALIGN_CENTER_VERTICAL +#ifdef __WXMAC__ + | wxALL +#else + | wxRIGHT +#endif + ; + } + + void PostCreation(); + +protected: + wxTextCtrl *m_text; // can be NULL + wxControl *m_picker; + wxBoxSizer *m_sizer; + +private: + DECLARE_ABSTRACT_CLASS(wxPickerBase) + DECLARE_EVENT_TABLE() + + // This class must be something just like a panel... + WX_DECLARE_CONTROL_CONTAINER(); +}; + + +#endif + // _WX_PICKERBASE_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/platform.h b/Externals/wxWidgets/include/wx/platform.h new file mode 100644 index 0000000000..361248cc1f --- /dev/null +++ b/Externals/wxWidgets/include/wx/platform.h @@ -0,0 +1,636 @@ +/** +* Name: wx/platform.h +* Purpose: define the OS and compiler identification macros +* Author: Vadim Zeitlin +* Modified by: +* Created: 29.10.01 (extracted from wx/defs.h) +* RCS-ID: $Id: platform.h 49409 2007-10-24 21:43:36Z DE $ +* Copyright: (c) 1997-2001 Vadim Zeitlin +* Licence: wxWindows licence +*/ + +/* THIS IS A C FILE, DON'T USE C++ FEATURES (IN PARTICULAR COMMENTS) IN IT */ + +#ifndef _WX_PLATFORM_H_ +#define _WX_PLATFORM_H_ + + +/* + Codewarrior doesn't define any Windows symbols until some headers + are included +*/ +#ifdef __MWERKS__ +# include <stddef.h> +#endif + +/* + WXMAC variants + __WXMAC_CLASSIC__ means ppc non-carbon builds, __WXMAC_CARBON__ means + carbon API available (mach or cfm builds) , __WXMAC_OSX__ means mach-o + builds, running under 10.2 + only +*/ +#ifdef __WXMAC__ +# if defined(__MACH__) +# define __WXMAC_OSX__ +# define __WXMAC_CARBON__ +# include <AvailabilityMacros.h> +# ifndef MAC_OS_X_VERSION_10_4 +# define MAC_OS_X_VERSION_10_4 1040 +# endif +# ifndef MAC_OS_X_VERSION_10_5 +# define MAC_OS_X_VERSION_10_5 1050 +# endif +# ifdef __WXMAC_XCODE__ +# include <unistd.h> +# include "wx/mac/carbon/config_xcode.h" +# endif +# else +# if TARGET_CARBON +# define __WXMAC_CARBON__ +# else +# define __WXMAC_CLASSIC__ +# endif +# endif +#endif + +/* + __WXOSX__ is a common define to wxMac (Carbon) and wxCocoa ports under OS X. + */ +#if defined(__WXMAC_OSX__) || defined(__WXCOCOA__) +# define __WXOSX__ +#endif + +/* + first define Windows symbols if they're not defined on the command line: we + can autodetect everything we need if _WIN32 is defined + */ +#if defined(__CYGWIN__) && defined(__WINDOWS__) +# ifndef __WXMSW__ +# define __WXMSW__ +# endif + +# ifndef _WIN32 +# define _WIN32 +# endif + +# ifndef WIN32 +# define WIN32 +# endif +#endif + +#if defined(__PALMOS__) +# if __PALMOS__ == 0x06000000 +# define __WXPALMOS6__ +# endif +# if __PALMOS__ == 0x05000000 +# define __WXPALMOS5__ +# endif +# ifndef __WXPALMOS__ +# define __WXPALMOS__ +# endif +# ifdef __WXMSW__ +# undef __WXMSW__ +# endif +# ifdef __WINDOWS__ +# undef __WINDOWS__ +# endif +# ifdef __WIN32__ +# undef __WIN32__ +# endif +# ifdef WIN32 +# undef WIN32 +# endif +# ifdef _WIN32 +# undef _WIN32 +# endif +#endif + +#if defined(_WIN64) +# ifndef _WIN32 + /* + a lot of code (mistakenly) uses #ifdef _WIN32 to either test for + Windows or to test for !__WIN16__, so we must define _WIN32 for + Win64 as well to ensure that the existing code continues to work. + */ +# define _WIN32 +# endif /* !_WIN32 */ + +# ifndef __WIN64__ +# define __WIN64__ +# endif /* !__WIN64__ */ +#endif /* _WIN64 */ + +#if (defined(_WIN32) || defined(WIN32) || defined(__NT__) || defined(__WXWINCE__)) \ + && !defined(__WXMOTIF__) && !defined(__WXGTK__) && !defined(__WXX11__) +# ifndef __WXMSW__ +# define __WXMSW__ +# endif + +# ifndef __WIN32__ +# define __WIN32__ +# endif +#endif /* Win32 */ + +#if defined(__WXMSW__) || defined(__WIN32__) +# if !defined(__WINDOWS__) +# define __WINDOWS__ +# endif +#endif + +/* detect MS SmartPhone */ +#if defined( WIN32_PLATFORM_WFSP ) +# ifndef __SMARTPHONE__ +# define __SMARTPHONE__ +# endif +# ifndef __WXWINCE__ +# define __WXWINCE__ +# endif +#endif + +/* detect PocketPC */ +#if defined( WIN32_PLATFORM_PSPC ) +# ifndef __POCKETPC__ +# define __POCKETPC__ +# endif +# ifndef __WXWINCE__ +# define __WXWINCE__ +# endif +#endif + +/* detect Standard WinCE SDK */ +#if defined( WCE_PLATFORM_STANDARDSDK ) +# ifndef __WINCE_STANDARDSDK__ +# define __WINCE_STANDARDSDK__ +# endif +# ifndef __WXWINCE__ +# define __WXWINCE__ +# endif +#endif + +#if defined(_WIN32_WCE) && !defined(WIN32_PLATFORM_WFSP) && !defined(WIN32_PLATFORM_PSPC) +# if (_WIN32_WCE >= 400) +# ifndef __WINCE_NET__ +# define __WINCE_NET__ +# endif +# elif (_WIN32_WCE >= 200) +# ifndef __HANDHELDPC__ +# define __HANDHELDPC__ +# endif +# endif +# ifndef __WXWINCE__ +# define __WXWINCE__ +# endif +#endif + +#if defined(__POCKETPC__) || defined(__SMARTPHONE__) || defined(__WXGPE__) +# define __WXHANDHELD__ +#endif + +/* + Include wx/setup.h for the Unix platform defines generated by configure and + the library compilation options + + Note that it must be included before defining hardware symbols below as they + could be already defined by configure + */ +#include "wx/setup.h" + +/* + Hardware platform detection. + + VC++ defines _M_xxx symbols. + */ +#if defined(_M_IX86) || defined(i386) || defined(__i386) || defined(__i386__) + #ifndef __INTEL__ + #define __INTEL__ + #endif +#endif /* x86 */ + +#if defined(_M_IA64) + #ifndef __IA64__ + #define __IA64__ + #endif +#endif /* ia64 */ + +#if defined(_M_MPPC) || defined(__PPC__) || defined(__ppc__) + #ifndef __POWERPC__ + #define __POWERPC__ + #endif +#endif /* alpha */ + +#if defined(_M_ALPHA) || defined(__AXP__) + #ifndef __ALPHA__ + #define __ALPHA__ + #endif +#endif /* alpha */ + + +/* + adjust the Unicode setting: wxUSE_UNICODE should be defined as 0 or 1 + and is used by wxWidgets, _UNICODE and/or UNICODE may be defined or used by + the system headers so bring these settings in sync + */ + +/* set wxUSE_UNICODE to 1 if UNICODE or _UNICODE is defined */ +#if defined(_UNICODE) || defined(UNICODE) +# undef wxUSE_UNICODE +# define wxUSE_UNICODE 1 +#else /* !UNICODE */ +# ifndef wxUSE_UNICODE +# define wxUSE_UNICODE 0 +# endif +#endif /* UNICODE/!UNICODE */ + +/* and vice versa: define UNICODE and _UNICODE if wxUSE_UNICODE is 1 */ +#if wxUSE_UNICODE +# ifndef _UNICODE +# define _UNICODE +# endif +# ifndef UNICODE +# define UNICODE +# endif +#endif /* wxUSE_UNICODE */ + +#if defined( __MWERKS__ ) && !defined(__INTEL__) +/* otherwise MSL headers bring in WIN32 dependant APIs */ +#undef UNICODE +#endif + + +/* + This macro can be used to test the Open Watcom version. +*/ +#ifndef __WATCOMC__ +# define wxWATCOM_VERSION(major,minor) 0 +# define wxCHECK_WATCOM_VERSION(major,minor) 0 +# define wxONLY_WATCOM_EARLIER_THAN(major,minor) 0 +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# error "Only Open Watcom is supported in this release" +#else +# define wxWATCOM_VERSION(major,minor) ( major * 100 + minor * 10 + 1100 ) +# define wxCHECK_WATCOM_VERSION(major,minor) ( __WATCOMC__ >= wxWATCOM_VERSION(major,minor) ) +# define wxONLY_WATCOM_EARLIER_THAN(major,minor) ( __WATCOMC__ < wxWATCOM_VERSION(major,minor) ) +#endif + +/* + check the consistency of the settings in setup.h: note that this must be + done after setting wxUSE_UNICODE correctly as it is used in wx/chkconf.h + */ +#include "wx/chkconf.h" + + +/* + some compilers don't support iostream.h any longer, while some of theme + are not updated with <iostream> yet, so override the users setting here + in such case. + */ +#if defined(_MSC_VER) && (_MSC_VER >= 1310) +# undef wxUSE_IOSTREAMH +# define wxUSE_IOSTREAMH 0 +#elif defined(__DMC__) || defined(__WATCOMC__) +# undef wxUSE_IOSTREAMH +# define wxUSE_IOSTREAMH 1 +#elif defined(__MINGW32__) +# undef wxUSE_IOSTREAMH +# define wxUSE_IOSTREAMH 0 +#endif /* compilers with/without iostream.h */ + +/* + old C++ headers (like <iostream.h>) declare classes in the global namespace + while the new, standard ones (like <iostream>) do it in std:: namespace, + unless it's an old gcc version. + + using this macro allows constuctions like "wxSTD iostream" to work in + either case + */ +#if !wxUSE_IOSTREAMH && (!defined(__GNUC__) || ( __GNUC__ > 2 ) || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95)) +# define wxSTD std:: +#else +# define wxSTD +#endif + +/* + OS: first of all, test for MS-DOS platform. We must do this before testing + for Unix, because DJGPP compiler defines __unix__ under MS-DOS + */ +#if defined(__GO32__) || defined(__DJGPP__) || defined(__DOS__) +# ifndef __DOS__ +# define __DOS__ +# endif + /* size_t is the same as unsigned int for Watcom 11 compiler, */ + /* so define it if it hadn't been done by configure yet */ +# if !defined(wxSIZE_T_IS_UINT) && !defined(wxSIZE_T_IS_ULONG) +# ifdef __WATCOMC__ +# define wxSIZE_T_IS_UINT +# endif +# ifdef __DJGPP__ +# define wxSIZE_T_IS_ULONG +# endif +# endif + +/* + OS: then test for generic Unix defines, then for particular flavours and + finally for Unix-like systems + Mac OS X matches this case (__MACH__), prior Mac OS do not. + */ +#elif defined(__UNIX__) || defined(__unix) || defined(__unix__) || \ + defined(____SVR4____) || defined(__LINUX__) || defined(__sgi) || \ + defined(__hpux) || defined(sun) || defined(__SUN__) || defined(_AIX) || \ + defined(__EMX__) || defined(__VMS) || defined(__BEOS__) || defined(__MACH__) + +# define __UNIX_LIKE__ + + /* Helps SGI compilation, apparently */ +# ifdef __SGI__ +# ifdef __GNUG__ +# define __need_wchar_t +# else /* !gcc */ + /* + Note I use the term __SGI_CC__ for both cc and CC, its not a good + idea to mix gcc and cc/CC, the name mangling is different + */ +# define __SGI_CC__ +# endif /* gcc/!gcc */ + + /* system headers use this symbol and not __cplusplus in some places */ +# ifndef _LANGUAGE_C_PLUS_PLUS +# define _LANGUAGE_C_PLUS_PLUS +# endif +# endif /* SGI */ + +# if defined(sun) || defined(__SUN__) +# ifndef __GNUG__ +# ifndef __SUNCC__ +# define __SUNCC__ +# endif /* Sun CC */ +# endif +# endif /* Sun */ + +# ifdef __EMX__ +# define OS2EMX_PLAIN_CHAR +# endif + + /* define __HPUX__ for HP-UX where standard macro is __hpux */ +# if defined(__hpux) && !defined(__HPUX__) +# define __HPUX__ +# endif /* HP-UX */ + +# if defined(__CYGWIN__) || defined(__WINE__) +# if !defined(wxSIZE_T_IS_UINT) +# define wxSIZE_T_IS_UINT +# endif +# endif + + /* All of these should already be defined by including configure- + generated setup.h but we wish to support Xcode compilation without + requiring the user to define these himself. + */ +# if defined(__APPLE__) && defined(__MACH__) +# ifndef __UNIX__ +# define __UNIX__ 1 +# endif +# ifndef __BSD__ +# define __BSD__ 1 +# endif + /* __DARWIN__ is our own define to mean OS X or pure Darwin */ +# ifndef __DARWIN__ +# define __DARWIN__ 1 +# endif + /* NOTE: TARGET_CARBON is actually a 0/1 and must be 1 for OS X */ +# ifndef TARGET_CARBON +# define TARGET_CARBON 1 +# endif + /* OS X uses unsigned long size_t for both ILP32 and LP64 modes. */ +# if !defined(wxSIZE_T_IS_UINT) && !defined(wxSIZE_T_IS_ULONG) +# define wxSIZE_T_IS_ULONG +# endif +# endif + +/* + OS: Classic Mac OS + */ +#elif defined(applec) || \ + defined(THINK_C) || \ + (defined(__MWERKS__) && !defined(__INTEL__)) + /* MacOS */ +# if !defined(wxSIZE_T_IS_UINT) && !defined(wxSIZE_T_IS_ULONG) +# define wxSIZE_T_IS_ULONG +# endif + +/* + OS: OS/2 + */ +#elif defined(__OS2__) + + /* wxOS2 vs. non wxOS2 ports on OS2 platform */ +# if !defined(__WXMOTIF__) && !defined(__WXGTK__) && !defined(__WXX11__) +# ifndef __WXPM__ +# define __WXPM__ +# endif +# endif + +# if defined(__IBMCPP__) +# define __VISAGEAVER__ __IBMCPP__ +# endif + + /* Place other OS/2 compiler environment defines here */ +# if defined(__VISAGECPP__) + /* VisualAge is the only thing that understands _Optlink */ +# define LINKAGEMODE _Optlink +# endif +# define wxSIZE_T_IS_UINT + +/* + OS: Palm OS + */ +#elif defined(__PALMOS__) +# ifdef __WIN32__ +# error "__WIN32__ should not be defined for PalmOS" +# endif +# ifdef __WINDOWS__ +# error "__WINDOWS__ should not be defined for PalmOS" +# endif +# ifdef __WXMSW__ +# error "__WXMSW__ should not be defined for PalmOS" +# endif + +/* + OS: Otherwise it must be Windows + */ +#else /* Windows */ +# ifndef __WINDOWS__ +# define __WINDOWS__ +# endif /* Windows */ + + /* to be changed for Win64! */ +# ifndef __WIN32__ +# error "__WIN32__ should be defined for Win32 and Win64, Win16 is not supported" +# endif + + /* + define another standard symbol for Microsoft Visual C++: the standard + one (_MSC_VER) is also defined by Metrowerks compiler + */ +# if defined(_MSC_VER) && !defined(__MWERKS__) +# define __VISUALC__ _MSC_VER +# elif defined(__BCPLUSPLUS__) && !defined(__BORLANDC__) +# define __BORLANDC__ +# elif defined(__WATCOMC__) +# elif defined(__SC__) +# define __SYMANTECC__ +# endif /* compiler */ + + /* size_t is the same as unsigned int for all Windows compilers we know, */ + /* so define it if it hadn't been done by configure yet */ +# if !defined(wxSIZE_T_IS_UINT) && !defined(wxSIZE_T_IS_ULONG) +# define wxSIZE_T_IS_UINT +# endif +#endif /* OS */ + +/* + if we're on a Unix system but didn't use configure (so that setup.h didn't + define __UNIX__), do define __UNIX__ now + */ +#if !defined(__UNIX__) && defined(__UNIX_LIKE__) +# define __UNIX__ +#endif /* Unix */ + +#if defined(__WXMOTIF__) || defined(__WXX11__) +# define __X__ +#endif + +#ifdef __SC__ +# ifdef __DMC__ +# define __DIGITALMARS__ +# else +# define __SYMANTEC__ +# endif +#endif + +#ifdef __INTEL_COMPILER +# define __INTELC__ +#endif + +/* + We get "Large Files (ILP32) not supported in strict ANSI mode." #error + from HP-UX standard headers when compiling with g++ without this: + */ +#if defined(__HPUX__) && !defined(__STDC_EXT__) +# define __STDC_EXT__ 1 +#endif + +/* Force linking against required libraries under Windows: */ +#ifdef __WXWINCE__ +# include "wx/msw/wince/libraries.h" +#elif defined __WINDOWS__ +# include "wx/msw/libraries.h" +#endif + +/* + This macro can be used to test the gcc version and can be used like this: + +# if wxCHECK_GCC_VERSION(3, 1) + ... we have gcc 3.1 or later ... +# else + ... no gcc at all or gcc < 3.1 ... +# endif +*/ +#if defined(__GNUC__) && defined(__GNUC_MINOR__) + #define wxCHECK_GCC_VERSION( major, minor ) \ + ( ( __GNUC__ > (major) ) \ + || ( __GNUC__ == (major) && __GNUC_MINOR__ >= (minor) ) ) +#else + #define wxCHECK_GCC_VERSION( major, minor ) 0 +#endif + +#if defined(__BORLANDC__) || (defined(__GNUC__) && __GNUC__ < 3) +#define wxNEEDS_CHARPP +#endif + +/* + This macro can be used to check that the version of mingw32 compiler is + at least maj.min + */ +#if ( defined( __GNUWIN32__ ) || defined( __MINGW32__ ) || \ + ( defined( __CYGWIN__ ) && defined( __WINDOWS__ ) ) || \ + wxCHECK_WATCOM_VERSION(1,0) ) && \ + !defined(__DOS__) && \ + !defined(__WXPM__) && \ + !defined(__WXMOTIF__) && \ + !defined(__WXGTK__) && \ + !defined(__WXX11__) && \ + !defined(__WXPALMOS__) +# include "wx/msw/gccpriv.h" +#else +# undef wxCHECK_W32API_VERSION +# define wxCHECK_W32API_VERSION(maj, min) (0) +#endif + +#if defined (__WXMSW__) +# if !defined(__WATCOMC__) +# define wxHAVE_RAW_BITMAP +# endif +#endif + +/* + Handle Darwin gcc universal compilation. Don't do this in an Apple- + specific case since no sane compiler should be defining either + __BIG_ENDIAN__ or __LITTLE_ENDIAN__ unless it really is generating + code that will be hosted on a machine with the appropriate endianness. + If a compiler defines neither, assume the user or configure set + WORDS_BIGENDIAN appropriately. + */ +#if defined(__BIG_ENDIAN__) +# undef WORDS_BIGENDIAN +# define WORDS_BIGENDIAN 1 +#elif defined(__LITTLE_ENDIAN__) +# undef WORDS_BIGENDIAN +#elif defined(__WXMAC__) && !defined(WORDS_BIGENDIAN) +/* According to Stefan even ancient Mac compilers defined __BIG_ENDIAN__ */ +# warning "Compiling wxMac with probably wrong endianness" +#endif + +/* Choose which method we will use for updating menus + * - in OnIdle, or when we receive a wxEVT_MENU_OPEN event. + * Presently, only Windows and GTK+ support wxEVT_MENU_OPEN. + */ +#ifndef wxUSE_IDLEMENUUPDATES +# if (defined(__WXMSW__) || defined(__WXGTK__)) && !defined(__WXUNIVERSAL__) +# define wxUSE_IDLEMENUUPDATES 0 +# else +# define wxUSE_IDLEMENUUPDATES 1 +# endif +#endif + +/* + * Define symbols that are not yet in + * configure or possibly some setup.h files. + * They will need to be added. + */ + +#ifndef wxUSE_FILECONFIG +# if wxUSE_CONFIG +# define wxUSE_FILECONFIG 1 +# else +# define wxUSE_FILECONFIG 0 +# endif +#endif + +#ifndef wxUSE_HOTKEY +# define wxUSE_HOTKEY 0 +#endif + +#if !defined(wxUSE_WXDIB) && defined(__WXMSW__) +# define wxUSE_WXDIB 1 +#endif + +/* + We need AvailabilityMacros.h for ifdefing out things that don't exist on + OSX 10.2 and lower + FIXME: We need a better way to detect for 10.3 then including a system header +*/ +#ifdef __DARWIN__ + #include <AvailabilityMacros.h> +#endif + +#endif /* _WX_PLATFORM_H_ */ diff --git a/Externals/wxWidgets/include/wx/platinfo.h b/Externals/wxWidgets/include/wx/platinfo.h new file mode 100644 index 0000000000..d9382dd2ea --- /dev/null +++ b/Externals/wxWidgets/include/wx/platinfo.h @@ -0,0 +1,313 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/platinfo.h +// Purpose: declaration of the wxPlatformInfo class +// Author: Francesco Montorsi +// Modified by: +// Created: 07.07.2006 (based on wxToolkitInfo) +// RCS-ID: $Id: platinfo.h 41807 2006-10-09 15:58:56Z VZ $ +// Copyright: (c) 2006 Francesco Montorsi +// License: wxWindows license +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_PLATINFO_H_ +#define _WX_PLATINFO_H_ + +#include "wx/string.h" + +// ---------------------------------------------------------------------------- +// wxPlatformInfo +// ---------------------------------------------------------------------------- + +// VERY IMPORTANT: when changing these enum values, also change the relative +// string tables in src/common/platinfo.cpp + + +// families & sub-families of operating systems +enum wxOperatingSystemId +{ + wxOS_UNKNOWN = 0, // returned on error + + wxOS_MAC_OS = 1 << 0, // Apple Mac OS 8/9/X with Mac paths + wxOS_MAC_OSX_DARWIN = 1 << 1, // Apple Mac OS X with Unix paths + wxOS_MAC = wxOS_MAC_OS|wxOS_MAC_OSX_DARWIN, + + wxOS_WINDOWS_9X = 1 << 2, // Windows 9x family (95/98/ME) + wxOS_WINDOWS_NT = 1 << 3, // Windows NT family (NT/2000/XP) + wxOS_WINDOWS_MICRO = 1 << 4, // MicroWindows + wxOS_WINDOWS_CE = 1 << 5, // Windows CE (Window Mobile) + wxOS_WINDOWS = wxOS_WINDOWS_9X | + wxOS_WINDOWS_NT | + wxOS_WINDOWS_MICRO | + wxOS_WINDOWS_CE, + + wxOS_UNIX_LINUX = 1 << 6, // Linux + wxOS_UNIX_FREEBSD = 1 << 7, // FreeBSD + wxOS_UNIX_OPENBSD = 1 << 8, // OpenBSD + wxOS_UNIX_NETBSD = 1 << 9, // NetBSD + wxOS_UNIX_SOLARIS = 1 << 10, // SunOS + wxOS_UNIX_AIX = 1 << 11, // AIX + wxOS_UNIX_HPUX = 1 << 12, // HP/UX + wxOS_UNIX = wxOS_UNIX_LINUX | + wxOS_UNIX_FREEBSD | + wxOS_UNIX_OPENBSD | + wxOS_UNIX_NETBSD | + wxOS_UNIX_SOLARIS | + wxOS_UNIX_AIX | + wxOS_UNIX_HPUX, + + // 1<<13 and 1<<14 available for other Unix flavours + + wxOS_DOS = 1 << 15, // Microsoft DOS + wxOS_OS2 = 1 << 16 // OS/2 +}; + +// list of wxWidgets ports - some of them can be used with more than +// a single toolkit. +enum wxPortId +{ + wxPORT_UNKNOWN = 0, // returned on error + + wxPORT_BASE = 1 << 0, // wxBase, no native toolkit used + + wxPORT_MSW = 1 << 1, // wxMSW, native toolkit is Windows API + wxPORT_MOTIF = 1 << 2, // wxMotif, using [Open]Motif or Lesstif + wxPORT_GTK = 1 << 3, // wxGTK, using GTK+ 1.x, 2.x, GPE or Maemo + wxPORT_MGL = 1 << 4, // wxMGL, using wxUniversal + wxPORT_X11 = 1 << 5, // wxX11, using wxUniversal + wxPORT_PM = 1 << 6, // wxOS2, using OS/2 Presentation Manager + wxPORT_OS2 = wxPORT_PM, // wxOS2, using OS/2 Presentation Manager + wxPORT_MAC = 1 << 7, // wxMac, using Carbon or Classic Mac API + wxPORT_COCOA = 1 << 8, // wxCocoa, using Cocoa NextStep/Mac API + wxPORT_WINCE = 1 << 9, // wxWinCE, toolkit is WinCE SDK API + wxPORT_PALMOS = 1 << 10, // wxPalmOS, toolkit is PalmOS API + wxPORT_DFB = 1 << 11 // wxDFB, using wxUniversal +}; + +// architecture of the operating system +// (regardless of the build environment of wxWidgets library - see +// wxIsPlatform64bit documentation for more info) +enum wxArchitecture +{ + wxARCH_INVALID = -1, // returned on error + + wxARCH_32, // 32 bit + wxARCH_64, + + wxARCH_MAX +}; + + +// endian-ness of the machine +enum wxEndianness +{ + wxENDIAN_INVALID = -1, // returned on error + + wxENDIAN_BIG, // 4321 + wxENDIAN_LITTLE, // 1234 + wxENDIAN_PDP, // 3412 + + wxENDIAN_MAX +}; + +// Information about the toolkit that the app is running under and some basic +// platform and architecture info +class WXDLLIMPEXP_BASE wxPlatformInfo +{ +public: + wxPlatformInfo(); + wxPlatformInfo(wxPortId pid, + int tkMajor = -1, int tkMinor = -1, + wxOperatingSystemId id = wxOS_UNKNOWN, + int osMajor = -1, int osMinor = -1, + wxArchitecture arch = wxARCH_INVALID, + wxEndianness endian = wxENDIAN_INVALID, + bool usingUniversal = false); + + // default copy ctor, assignment operator and dtor are ok + + bool operator==(const wxPlatformInfo &t) const; + + bool operator!=(const wxPlatformInfo &t) const + { return !(*this == t); } + + // Gets a wxPlatformInfo already initialized with the values for + // the currently running platform. + static const wxPlatformInfo& Get(); + + + + // string -> enum conversions + // --------------------------------- + + static wxOperatingSystemId GetOperatingSystemId(const wxString &name); + static wxPortId GetPortId(const wxString &portname); + + static wxArchitecture GetArch(const wxString &arch); + static wxEndianness GetEndianness(const wxString &end); + + // enum -> string conversions + // --------------------------------- + + static wxString GetOperatingSystemFamilyName(wxOperatingSystemId os); + static wxString GetOperatingSystemIdName(wxOperatingSystemId os); + static wxString GetPortIdName(wxPortId port, bool usingUniversal); + static wxString GetPortIdShortName(wxPortId port, bool usingUniversal); + + static wxString GetArchName(wxArchitecture arch); + static wxString GetEndiannessName(wxEndianness end); + + // getters + // ----------------- + + int GetOSMajorVersion() const + { return m_osVersionMajor; } + int GetOSMinorVersion() const + { return m_osVersionMinor; } + + // return true if the OS version >= major.minor + bool CheckOSVersion(int major, int minor) const + { + return DoCheckVersion(GetOSMajorVersion(), + GetOSMinorVersion(), + major, + minor); + } + + int GetToolkitMajorVersion() const + { return m_tkVersionMajor; } + int GetToolkitMinorVersion() const + { return m_tkVersionMinor; } + + bool CheckToolkitVersion(int major, int minor) const + { + return DoCheckVersion(GetToolkitMajorVersion(), + GetToolkitMinorVersion(), + major, + minor); + } + + bool IsUsingUniversalWidgets() const + { return m_usingUniversal; } + + wxOperatingSystemId GetOperatingSystemId() const + { return m_os; } + wxPortId GetPortId() const + { return m_port; } + wxArchitecture GetArchitecture() const + { return m_arch; } + wxEndianness GetEndianness() const + { return m_endian; } + + + // string getters + // ----------------- + + wxString GetOperatingSystemFamilyName() const + { return GetOperatingSystemFamilyName(m_os); } + wxString GetOperatingSystemIdName() const + { return GetOperatingSystemIdName(m_os); } + wxString GetPortIdName() const + { return GetPortIdName(m_port, m_usingUniversal); } + wxString GetPortIdShortName() const + { return GetPortIdShortName(m_port, m_usingUniversal); } + wxString GetArchName() const + { return GetArchName(m_arch); } + wxString GetEndiannessName() const + { return GetEndiannessName(m_endian); } + + // setters + // ----------------- + + void SetOSVersion(int major, int minor) + { m_osVersionMajor=major; m_osVersionMinor=minor; } + void SetToolkitVersion(int major, int minor) + { m_tkVersionMajor=major; m_tkVersionMinor=minor; } + + void SetOperatingSystemId(wxOperatingSystemId n) + { m_os = n; } + void SetPortId(wxPortId n) + { m_port = n; } + void SetArchitecture(wxArchitecture n) + { m_arch = n; } + void SetEndianness(wxEndianness n) + { m_endian = n; } + + // miscellaneous + // ----------------- + + bool IsOk() const + { + return m_osVersionMajor != -1 && m_osVersionMinor != -1 && + m_os != wxOS_UNKNOWN && + m_tkVersionMajor != -1 && m_tkVersionMinor != -1 && + m_port != wxPORT_UNKNOWN && + m_arch != wxARCH_INVALID && m_endian != wxENDIAN_INVALID; + } + + +protected: + static bool DoCheckVersion(int majorCur, int minorCur, int major, int minor) + { + return majorCur > major || (majorCur == major && minorCur >= minor); + } + + void InitForCurrentPlatform(); + + + // OS stuff + // ----------------- + + // Version of the OS; valid if m_os != wxOS_UNKNOWN + // (-1 means not initialized yet). + int m_osVersionMajor, + m_osVersionMinor; + + // Operating system ID. + wxOperatingSystemId m_os; + + + // toolkit + // ----------------- + + // Version of the underlying toolkit + // (-1 means not initialized yet; zero means no toolkit). + int m_tkVersionMajor, m_tkVersionMinor; + + // name of the wxWidgets port + wxPortId m_port; + + // is using wxUniversal widgets? + bool m_usingUniversal; + + + // others + // ----------------- + + // architecture of the OS + wxArchitecture m_arch; + + // endianness of the machine + wxEndianness m_endian; +}; + + +#if WXWIN_COMPATIBILITY_2_6 + #define wxUNKNOWN_PLATFORM wxOS_UNKNOWN + #define wxUnix wxOS_UNIX + #define wxWin95 wxOS_WINDOWS_9X + #define wxWIN95 wxOS_WINDOWS_9X + #define wxWINDOWS_NT wxOS_WINDOWS_NT + #define wxMSW wxOS_WINDOWS + #define wxWinCE wxOS_WINDOWS_CE + #define wxWIN32S wxOS_WINDOWS_9X + + #define wxPalmOS wxPORT_PALMOS + #define wxOS2 wxPORT_OS2 + #define wxMGL wxPORT_MGL + #define wxCocoa wxPORT_MAC + #define wxMac wxPORT_MAC + #define wxMotif wxPORT_MOTIF + #define wxGTK wxPORT_GTK +#endif // WXWIN_COMPATIBILITY_2_6 + +#endif // _WX_PLATINFO_H_ diff --git a/Externals/wxWidgets/include/wx/popupwin.h b/Externals/wxWidgets/include/wx/popupwin.h new file mode 100644 index 0000000000..2680d9e2a0 --- /dev/null +++ b/Externals/wxWidgets/include/wx/popupwin.h @@ -0,0 +1,192 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/popupwin.h +// Purpose: wxPopupWindow interface declaration +// Author: Vadim Zeitlin +// Modified by: +// Created: 06.01.01 +// RCS-ID: $Id: popupwin.h 49642 2007-11-05 16:54:48Z SC $ +// Copyright: (c) 2001 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> +// License: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_POPUPWIN_H_BASE_ +#define _WX_POPUPWIN_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_POPUPWIN + +#include "wx/window.h" + +// ---------------------------------------------------------------------------- +// wxPopupWindow: a special kind of top level window used for popup menus, +// combobox popups and such. +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxPopupWindowBase : public wxWindow +{ +public: + wxPopupWindowBase() { } + virtual ~wxPopupWindowBase(); + + // create the popup window + // + // style may only contain border flags + bool Create(wxWindow *parent, int style = wxBORDER_NONE); + + // move the popup window to the right position, i.e. such that it is + // entirely visible + // + // the popup is positioned at ptOrigin + size if it opens below and to the + // right (default), at ptOrigin - sizePopup if it opens above and to the + // left &c + // + // the point must be given in screen coordinates! + virtual void Position(const wxPoint& ptOrigin, + const wxSize& size); + + virtual bool IsTopLevel() const { return true; } + + DECLARE_NO_COPY_CLASS(wxPopupWindowBase) +}; + + +// include the real class declaration +#if defined(__WXMSW__) + #include "wx/msw/popupwin.h" +#elif defined(__WXPM__) + #include "wx/os2/popupwin.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/popupwin.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/popupwin.h" +#elif defined(__WXX11__) + #include "wx/x11/popupwin.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/popupwin.h" +#elif defined(__WXMGL__) + #include "wx/mgl/popupwin.h" +#elif defined(__WXMAC__) + #include "wx/mac/popupwin.h" +#else + #error "wxPopupWindow is not supported under this platform." +#endif + +// ---------------------------------------------------------------------------- +// wxPopupTransientWindow: a wxPopupWindow which disappears automatically +// when the user clicks mouse outside it or if it loses focus in any other way +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxPopupWindowHandler; +class WXDLLEXPORT wxPopupFocusHandler; + +class WXDLLEXPORT wxPopupTransientWindow : public wxPopupWindow +{ +public: + // ctors + wxPopupTransientWindow() { Init(); } + wxPopupTransientWindow(wxWindow *parent, int style = wxBORDER_NONE); + + virtual ~wxPopupTransientWindow(); + + // popup the window (this will show it too) and keep focus at winFocus + // (or itself if it's NULL), dismiss the popup if we lose focus + virtual void Popup(wxWindow *focus = NULL); + + // hide the window + virtual void Dismiss(); + + // can the window be dismissed now? + // + // VZ: where is this used?? + virtual bool CanDismiss() + { return true; } + + // called when a mouse is pressed while the popup is shown: return true + // from here to prevent its normal processing by the popup (which consists + // in dismissing it if the mouse is cilcked outside it) + virtual bool ProcessLeftDown(wxMouseEvent& event); + + // Overridden to grab the input on some plaforms + virtual bool Show( bool show = true ); + +protected: + // common part of all ctors + void Init(); + + // this is called when the popup is disappeared because of anything + // else but direct call to Dismiss() + virtual void OnDismiss(); + + // dismiss and notify the derived class + void DismissAndNotify(); + + // remove our event handlers + void PopHandlers(); + + // get alerted when child gets deleted from under us + void OnDestroy(wxWindowDestroyEvent& event); + +#if defined( __WXMSW__ ) || defined( __WXMAC__ ) + // check if the mouse needs captured or released + void OnIdle(wxIdleEvent& event); +#endif + + // the child of this popup if any + wxWindow *m_child; + + // the window which has the focus while we're shown + wxWindow *m_focus; + + // these classes may call our DismissAndNotify() + friend class wxPopupWindowHandler; + friend class wxPopupFocusHandler; + + // the handlers we created, may be NULL (if not, must be deleted) + wxPopupWindowHandler *m_handlerPopup; + wxPopupFocusHandler *m_handlerFocus; + + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS(wxPopupTransientWindow) + DECLARE_NO_COPY_CLASS(wxPopupTransientWindow) +}; + +#if wxUSE_COMBOBOX && defined(__WXUNIVERSAL__) + +// ---------------------------------------------------------------------------- +// wxPopupComboWindow: wxPopupTransientWindow used by wxComboBox +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxComboBox; +class WXDLLEXPORT wxComboCtrl; + +class WXDLLEXPORT wxPopupComboWindow : public wxPopupTransientWindow +{ +public: + wxPopupComboWindow() { m_combo = NULL; } + wxPopupComboWindow(wxComboCtrl *parent); + + bool Create(wxComboCtrl *parent); + + // position the window correctly relatively to the combo + void PositionNearCombo(); + +protected: + // notify the combo here + virtual void OnDismiss(); + + // forward the key presses to the combobox + void OnKeyDown(wxKeyEvent& event); + + // the parent combobox + wxComboCtrl *m_combo; + + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS(wxPopupComboWindow) +}; + +#endif // wxUSE_COMBOBOX && defined(__WXUNIVERSAL__) + +#endif // wxUSE_POPUPWIN + +#endif // _WX_POPUPWIN_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/power.h b/Externals/wxWidgets/include/wx/power.h new file mode 100644 index 0000000000..66492cb558 --- /dev/null +++ b/Externals/wxWidgets/include/wx/power.h @@ -0,0 +1,111 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/power.h +// Purpose: functions and classes for system power management +// Author: Vadim Zeitlin +// Modified by: +// Created: 2006-05-27 +// RCS-ID: $Id: power.h 48811 2007-09-19 23:11:28Z RD $ +// Copyright: (c) 2006 Vadim Zeitlin <vadim@wxwindows.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_POWER_H_ +#define _WX_POWER_H_ + +#include "wx/event.h" + +// ---------------------------------------------------------------------------- +// power management constants +// ---------------------------------------------------------------------------- + +enum wxPowerType +{ + wxPOWER_SOCKET, + wxPOWER_BATTERY, + wxPOWER_UNKNOWN +}; + +enum wxBatteryState +{ + wxBATTERY_NORMAL_STATE, // system is fully usable + wxBATTERY_LOW_STATE, // start to worry + wxBATTERY_CRITICAL_STATE, // save quickly + wxBATTERY_SHUTDOWN_STATE, // too late + wxBATTERY_UNKNOWN_STATE +}; + +// ---------------------------------------------------------------------------- +// wxPowerEvent is generated when the system online status changes +// ---------------------------------------------------------------------------- + +// currently the power events are only available under Windows, to avoid +// compiling in the code for handling them which is never going to be invoked +// under the other platforms, we define wxHAS_POWER_EVENTS symbol if this event +// is available, it should be used to guard all code using wxPowerEvent +#ifdef __WXMSW__ + +#define wxHAS_POWER_EVENTS + +class WXDLLIMPEXP_BASE wxPowerEvent : public wxEvent +{ +public: + wxPowerEvent(wxEventType evtType) : wxEvent(wxID_NONE, evtType) + { + m_veto = false; + } + + // Veto the operation (only makes sense with EVT_POWER_SUSPENDING) + void Veto() { m_veto = true; } + + bool IsVetoed() const { return m_veto; } + + + // default copy ctor, assignment operator and dtor are ok + + virtual wxEvent *Clone() const { return new wxPowerEvent(*this); } + +private: + bool m_veto; + +#if wxABI_VERSION >= 20806 + DECLARE_ABSTRACT_CLASS(wxPowerEvent) +#endif +}; + +BEGIN_DECLARE_EVENT_TYPES() + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_BASE, wxEVT_POWER_SUSPENDING, 406) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_BASE, wxEVT_POWER_SUSPENDED, 407) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_BASE, wxEVT_POWER_SUSPEND_CANCEL, 408) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_BASE, wxEVT_POWER_RESUME, 444) +END_DECLARE_EVENT_TYPES() + +typedef void (wxEvtHandler::*wxPowerEventFunction)(wxPowerEvent&); + +#define wxPowerEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction) \ + wxStaticCastEvent(wxPowerEventFunction, &func) + +#define EVT_POWER_SUSPENDING(func) \ + wx__DECLARE_EVT0(wxEVT_POWER_SUSPENDING, wxPowerEventHandler(func)) +#define EVT_POWER_SUSPENDED(func) \ + wx__DECLARE_EVT0(wxEVT_POWER_SUSPENDED, wxPowerEventHandler(func)) +#define EVT_POWER_SUSPEND_CANCEL(func) \ + wx__DECLARE_EVT0(wxEVT_POWER_SUSPEND_CANCEL, wxPowerEventHandler(func)) +#define EVT_POWER_RESUME(func) \ + wx__DECLARE_EVT0(wxEVT_POWER_RESUME, wxPowerEventHandler(func)) + +#else // no support for power events + #undef wxHAS_POWER_EVENTS +#endif // support for power events/no support + +// ---------------------------------------------------------------------------- +// power management functions +// ---------------------------------------------------------------------------- + +// return the current system power state: online or offline +WXDLLIMPEXP_BASE wxPowerType wxGetPowerType(); + +// return approximate battery state +WXDLLIMPEXP_BASE wxBatteryState wxGetBatteryState(); + +#endif // _WX_POWER_H_ diff --git a/Externals/wxWidgets/include/wx/print.h b/Externals/wxWidgets/include/wx/print.h new file mode 100644 index 0000000000..e4cf1e2e74 --- /dev/null +++ b/Externals/wxWidgets/include/wx/print.h @@ -0,0 +1,39 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/print.h +// Purpose: Base header for printer classes +// Author: Julian Smart +// Modified by: +// Created: +// RCS-ID: $Id: print.h 41240 2006-09-15 16:45:48Z PC $ +// Copyright: (c) Julian Smart +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_PRINT_H_BASE_ +#define _WX_PRINT_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_PRINTING_ARCHITECTURE + +#if defined(__WXMSW__) && !defined(__WXUNIVERSAL__) + +#include "wx/msw/printwin.h" + +#elif defined(__WXMAC__) + +#include "wx/mac/printmac.h" + +#elif defined(__WXPM__) + +#include "wx/os2/printos2.h" + +#else + +#include "wx/generic/printps.h" + +#endif + +#endif // wxUSE_PRINTING_ARCHITECTURE +#endif + // _WX_PRINT_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/printdlg.h b/Externals/wxWidgets/include/wx/printdlg.h new file mode 100644 index 0000000000..4c98d251de --- /dev/null +++ b/Externals/wxWidgets/include/wx/printdlg.h @@ -0,0 +1,122 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/printdlg.h +// Purpose: Base header and class for print dialogs +// Author: Julian Smart +// Modified by: +// Created: +// RCS-ID: $Id: printdlg.h 41020 2006-09-05 20:47:48Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_PRINTDLG_H_BASE_ +#define _WX_PRINTDLG_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_PRINTING_ARCHITECTURE + +#include "wx/event.h" +#include "wx/dialog.h" +#include "wx/intl.h" +#include "wx/cmndata.h" + + +// --------------------------------------------------------------------------- +// wxPrintDialogBase: interface for the dialog for printing +// --------------------------------------------------------------------------- + +class WXDLLEXPORT wxPrintDialogBase : public wxDialog +{ +public: + wxPrintDialogBase() { } + wxPrintDialogBase(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxString &title = wxEmptyString, + const wxPoint &pos = wxDefaultPosition, + const wxSize &size = wxDefaultSize, + long style = wxDEFAULT_DIALOG_STYLE); + + virtual wxPrintDialogData& GetPrintDialogData() = 0; + virtual wxPrintData& GetPrintData() = 0; + virtual wxDC *GetPrintDC() = 0; + +private: + DECLARE_ABSTRACT_CLASS(wxPrintDialogBase) + DECLARE_NO_COPY_CLASS(wxPrintDialogBase) +}; + +// --------------------------------------------------------------------------- +// wxPrintDialog: the dialog for printing. +// --------------------------------------------------------------------------- + +class WXDLLEXPORT wxPrintDialog : public wxObject +{ +public: + wxPrintDialog(wxWindow *parent, wxPrintDialogData* data = NULL); + wxPrintDialog(wxWindow *parent, wxPrintData* data); + virtual ~wxPrintDialog(); + + virtual int ShowModal(); + + virtual wxPrintDialogData& GetPrintDialogData(); + virtual wxPrintData& GetPrintData(); + virtual wxDC *GetPrintDC(); + +private: + wxPrintDialogBase *m_pimpl; + +private: + DECLARE_DYNAMIC_CLASS(wxPrintDialog) + DECLARE_NO_COPY_CLASS(wxPrintDialog) +}; + +// --------------------------------------------------------------------------- +// wxPageSetupDialogBase: interface for the page setup dialog +// --------------------------------------------------------------------------- + +class WXDLLEXPORT wxPageSetupDialogBase: public wxDialog +{ +public: + wxPageSetupDialogBase() { } + wxPageSetupDialogBase(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxString &title = wxEmptyString, + const wxPoint &pos = wxDefaultPosition, + const wxSize &size = wxDefaultSize, + long style = wxDEFAULT_DIALOG_STYLE); + + virtual wxPageSetupDialogData& GetPageSetupDialogData() = 0; + +private: + DECLARE_ABSTRACT_CLASS(wxPageSetupDialogBase) + DECLARE_NO_COPY_CLASS(wxPageSetupDialogBase) +}; + +// --------------------------------------------------------------------------- +// wxPageSetupDialog: the page setup dialog +// --------------------------------------------------------------------------- + +class WXDLLEXPORT wxPageSetupDialog: public wxObject +{ +public: + wxPageSetupDialog(wxWindow *parent, wxPageSetupDialogData *data = NULL); + virtual ~wxPageSetupDialog(); + + int ShowModal(); + wxPageSetupDialogData& GetPageSetupDialogData(); + // old name + wxPageSetupDialogData& GetPageSetupData(); + +private: + wxPageSetupDialogBase *m_pimpl; + +private: + DECLARE_DYNAMIC_CLASS(wxPageSetupDialog) + DECLARE_NO_COPY_CLASS(wxPageSetupDialog) +}; + +#endif + +#endif + // _WX_PRINTDLG_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/private/browserhack28.h b/Externals/wxWidgets/include/wx/private/browserhack28.h new file mode 100644 index 0000000000..28d6da71bc --- /dev/null +++ b/Externals/wxWidgets/include/wx/private/browserhack28.h @@ -0,0 +1,20 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/private/browserhack28.h +// Purpose: Allows GUI library to override base wxLaunchDefaultBrowser. +// Author: David Elliott +// Modified by: +// Created: 2007-08-19 +// RCS-ID: $Id: browserhack28.h 48184 2007-08-19 19:22:09Z DE $ +// Copyright: (c) David Elliott +// Licence: wxWidgets licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_PRIVATE_BROWSERHACK28_H_ +#define _WX_PRIVATE_BROWSERHACK28_H_ + +typedef bool (*wxLaunchDefaultBrowserImpl_t)(const wxString& url, int flags); + +// Function the GUI library can call to provide a better implementation +WXDLLIMPEXP_BASE void wxSetLaunchDefaultBrowserImpl(wxLaunchDefaultBrowserImpl_t newImpl); + +#endif //ndef _WX_PRIVATE_BROWSERHACK28_H_ diff --git a/Externals/wxWidgets/include/wx/private/fileback.h b/Externals/wxWidgets/include/wx/private/fileback.h new file mode 100644 index 0000000000..5b2a86842f --- /dev/null +++ b/Externals/wxWidgets/include/wx/private/fileback.h @@ -0,0 +1,83 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: include/wx/private/fileback.h +// Purpose: Back an input stream with memory or a file +// Author: Mike Wetherell +// RCS-ID: $Id: fileback.h 42651 2006-10-29 20:06:45Z MW $ +// Copyright: (c) 2006 Mike Wetherell +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_FILEBACK_H__ +#define _WX_FILEBACK_H__ + +#include "wx/defs.h" + +#if wxUSE_FILESYSTEM + +#include "wx/stream.h" + +// ---------------------------------------------------------------------------- +// Backs an input stream with memory or a file to make it seekable. +// +// One or more wxBackedInputStreams can be used to read it's data. The data is +// reference counted, so stays alive until the last wxBackingFile or +// wxBackedInputStream using it is destroyed. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxBackingFile +{ +public: + enum { DefaultBufSize = 16384 }; + + // Takes ownership of stream. If the stream is smaller than bufsize, the + // backing file is never created and the backing is done with memory. + wxBackingFile(wxInputStream *stream, + size_t bufsize = DefaultBufSize, + const wxString& prefix = _T("wxbf")); + + wxBackingFile() : m_impl(NULL) { } + ~wxBackingFile(); + + wxBackingFile(const wxBackingFile& backer); + wxBackingFile& operator=(const wxBackingFile& backer); + + operator bool() const { return m_impl != NULL; } + +private: + class wxBackingFileImpl *m_impl; + friend class wxBackedInputStream; +}; + +// ---------------------------------------------------------------------------- +// An input stream to read from a wxBackingFile. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxBackedInputStream : public wxInputStream +{ +public: + wxBackedInputStream(const wxBackingFile& backer); + + // If the length of the backer's parent stream is unknown then GetLength() + // returns wxInvalidOffset until the parent has been read to the end. + wxFileOffset GetLength() const; + + // Returns the length, reading the parent stream to the end if necessary. + wxFileOffset FindLength() const; + + bool IsSeekable() const { return true; } + +protected: + size_t OnSysRead(void *buffer, size_t size); + wxFileOffset OnSysSeek(wxFileOffset pos, wxSeekMode mode); + wxFileOffset OnSysTell() const; + +private: + wxBackingFile m_backer; + wxFileOffset m_pos; + + DECLARE_NO_COPY_CLASS(wxBackedInputStream) +}; + +#endif // wxUSE_FILESYSTEM + +#endif // _WX_FILEBACK_H__ diff --git a/Externals/wxWidgets/include/wx/private/filename.h b/Externals/wxWidgets/include/wx/private/filename.h new file mode 100644 index 0000000000..f25e33c8b6 --- /dev/null +++ b/Externals/wxWidgets/include/wx/private/filename.h @@ -0,0 +1,56 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: include/wx/private/filename.h +// Purpose: Internal declarations for src/common/filename.cpp +// Author: Mike Wetherell +// Modified by: +// Created: 2006-10-22 +// RCS-ID: $Id: filename.h 42277 2006-10-23 13:10:12Z MW $ +// Copyright: (c) 2006 Mike Wetherell +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_PRIVATE_FILENAME_H_ +#define _WX_PRIVATE_FILENAME_H_ + +#include "wx/file.h" +#include "wx/ffile.h" + +// Self deleting temp files aren't supported on all platforms. Therefore +// rather than let these be in the API, they can be used internally to +// implement classes (e.g. wxTempFileStream), that will do the clean up when +// the OS doesn't support it. + +// Same usage as wxFileName::CreateTempFileName() with the extra parameter +// deleteOnClose. *deleteOnClose true on entry requests a file created with a +// delete on close flag, on exit the value of *deleteOnClose indicates whether +// available. + +#if wxUSE_FILE +wxString wxCreateTempFileName(const wxString& prefix, + wxFile *fileTemp, + bool *deleteOnClose = NULL); +#endif + +#if wxUSE_FFILE +wxString wxCreateTempFileName(const wxString& prefix, + wxFFile *fileTemp, + bool *deleteOnClose = NULL); +#endif + +// Returns an open temp file, if possible either an unlinked open file or one +// that will delete on close. Only returns the filename if neither was +// possible, so that the caller can delete the file when done. + +#if wxUSE_FILE +bool wxCreateTempFile(const wxString& prefix, + wxFile *fileTemp, + wxString *name); +#endif + +#if wxUSE_FFILE +bool wxCreateTempFile(const wxString& prefix, + wxFFile *fileTemp, + wxString *name); +#endif + +#endif // _WX_PRIVATE_FILENAME_H_ diff --git a/Externals/wxWidgets/include/wx/private/fontmgr.h b/Externals/wxWidgets/include/wx/private/fontmgr.h new file mode 100644 index 0000000000..70a42780d6 --- /dev/null +++ b/Externals/wxWidgets/include/wx/private/fontmgr.h @@ -0,0 +1,255 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/private/fontmgr.h +// Purpose: font management for ports that don't have their own +// Author: Vaclav Slavik +// Created: 2006-11-18 +// RCS-ID: $Id: fontmgr.h 43855 2006-12-07 08:57:44Z PC $ +// Copyright: (c) 2001-2002 SciTech Software, Inc. (www.scitechsoft.com) +// (c) 2006 REA Elektronik GmbH +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_PRIVATE_FONTMGR_H_ +#define _WX_PRIVATE_FONTMGR_H_ + +#include "wx/list.h" +#include "wx/fontutil.h" + +class wxFontsManager; +class wxFontInstance; +class wxFontInstanceList; +class wxFontFace; +class wxFontBundle; +class wxFontBundleHash; +class wxFontMgrFontRefData; + +WX_DECLARE_LIST(wxFontBundle, wxFontBundleList); + +/** + This class represents single font face with set parameters (point size, + antialiasing). + */ +class wxFontInstanceBase +{ +protected: + wxFontInstanceBase(float ptSize, bool aa) : m_ptSize(ptSize), m_aa(aa) {} + virtual ~wxFontInstanceBase() {} + +public: + float GetPointSize() const { return m_ptSize; } + bool IsAntiAliased() const { return m_aa; } + +protected: + float m_ptSize; + bool m_aa; +}; + + +/// This class represents loaded font face (bundle+weight+italics). +class wxFontFaceBase +{ +protected: + /// Ctor. Creates object with reference count = 0, Acquire() must be + /// called after the object is created. + wxFontFaceBase(); + virtual ~wxFontFaceBase(); + +public: + /// Increases reference count of the face + virtual void Acquire(); + + /** + Decreases reference count of the face. Call this when you no longer + use the object returned by wxFontBundle. Note that this doesn't destroy + the object, but only optionally shuts it down, so it's possible to + call Acquire() and Release() more than once. + */ + virtual void Release(); + + /** + Returns instance of the font at given size. + + @param ptSize point size of the font to create; note that this is + a float and not integer, it should be wxFont's point + size multipled by wxDC's scale factor + @param aa should the font be antialiased? + */ + virtual wxFontInstance *GetFontInstance(float ptSize, bool aa); + +protected: + /// Called to create a new instance of the font by GetFontInstance() if + /// it wasn't found it cache. + virtual wxFontInstance *CreateFontInstance(float ptSize, bool aa) = 0; + +protected: + unsigned m_refCnt; + wxFontInstanceList *m_instances; +}; + +/** + This class represents font bundle. Font bundle is set of faces that have + the same name, but differ in weight and italics. + */ +class wxFontBundleBase +{ +public: + wxFontBundleBase(); + virtual ~wxFontBundleBase(); + + /// Returns name of the bundle + virtual wxString GetName() const = 0; + + /// Returns true if the font is fixe-width + virtual bool IsFixed() const = 0; + + /// Type of faces in the bundle + enum FaceType + { + // NB: values of these constants are set so that it's possible to + // make OR-combinations of them and still get valid enum element + FaceType_Regular = 0, + FaceType_Italic = 1, + FaceType_Bold = 2, + FaceType_BoldItalic = FaceType_Italic | FaceType_Bold, + + FaceType_Max + }; + + /// Returns true if the given face is available + bool HasFace(FaceType type) const { return m_faces[type] != NULL; } + + /** + Returns font face object that can be used to render font of given type. + + Note that this method can only be called if HasFace(type) returns true. + + Acquire() was called on the returned object, you must call Release() + when you stop using it. + */ + wxFontFace *GetFace(FaceType type) const; + + /** + Returns font face object that can be used to render given font. + + Acquire() was called on the returned object, you must call Release() + when you stop using it. + */ + wxFontFace *GetFaceForFont(const wxFontMgrFontRefData& font) const; + +protected: + wxFontFace *m_faces[FaceType_Max]; +}; + + +/** + Base class for wxFontsManager class, which manages the list of all + available fonts and their loaded instances. + */ +class wxFontsManagerBase +{ +protected: + wxFontsManagerBase(); + virtual ~wxFontsManagerBase(); + +public: + /// Returns the font manager singleton, creating it if it doesn't exist + static wxFontsManager *Get(); + + /// Called by wxApp to shut down the manager + static void CleanUp(); + + /// Returns list of all available font bundles + const wxFontBundleList& GetBundles() const { return *m_list; } + + /** + Returns object representing font bundle with the given name. + + The returned object is owned by wxFontsManager, you must not delete it. + */ + wxFontBundle *GetBundle(const wxString& name) const; + + /** + Returns object representing font bundle that can be used to render + given font. + + The returned object is owned by wxFontsManager, you must not delete it. + */ + wxFontBundle *GetBundleForFont(const wxFontMgrFontRefData& font) const; + + /// This method must be called by derived + void AddBundle(wxFontBundle *bundle); + + /// Returns default facename for given wxFont family + virtual wxString GetDefaultFacename(wxFontFamily family) const = 0; + +private: + wxFontBundleHash *m_hash; + wxFontBundleList *m_list; + +protected: + static wxFontsManager *ms_instance; +}; + + + +#if defined(__WXMGL__) + #include "wx/mgl/private/fontmgr.h" +#elif defined(__WXDFB__) + #include "wx/dfb/private/fontmgr.h" +#endif + + + +/// wxFontMgrFontRefData implementation using wxFontsManager classes +class wxFontMgrFontRefData : public wxObjectRefData +{ +public: + wxFontMgrFontRefData(int size = wxDEFAULT, + int family = wxDEFAULT, + int style = wxDEFAULT, + int weight = wxDEFAULT, + bool underlined = false, + const wxString& faceName = wxEmptyString, + wxFontEncoding encoding = wxFONTENCODING_DEFAULT); + wxFontMgrFontRefData(const wxFontMgrFontRefData& data); + ~wxFontMgrFontRefData(); + + wxFontBundle *GetFontBundle() const; + wxFontInstance *GetFontInstance(float scale, bool antialiased) const; + + bool IsFixedWidth() const { return GetFontBundle()->IsFixed(); } + + const wxNativeFontInfo *GetNativeFontInfo() const { return &m_info; } + + int GetPointSize() const { return m_info.pointSize; } + wxString GetFaceName() const { return m_info.faceName; } + int GetFamily() const { return m_info.family; } + int GetStyle() const { return m_info.style; } + int GetWeight() const { return m_info.weight; } + bool GetUnderlined() const { return m_info.underlined; } + wxFontEncoding GetEncoding() const { return m_info.encoding; } + + void SetPointSize(int pointSize); + void SetFamily(int family); + void SetStyle(int style); + void SetWeight(int weight); + void SetFaceName(const wxString& faceName); + void SetUnderlined(bool underlined); + void SetEncoding(wxFontEncoding encoding); + + // Unofficial API, don't use + void SetNoAntiAliasing(bool no); + bool GetNoAntiAliasing() const { return m_noAA; } + +private: + void EnsureValidFont(); + + wxNativeFontInfo m_info; + bool m_noAA; + + wxFontFace *m_fontFace; + wxFontBundle *m_fontBundle; + bool m_fontValid; +}; + +#endif // _WX_PRIVATE_FONTMGR_H_ diff --git a/Externals/wxWidgets/include/wx/private/overlay.h b/Externals/wxWidgets/include/wx/private/overlay.h new file mode 100644 index 0000000000..08dfaad9e7 --- /dev/null +++ b/Externals/wxWidgets/include/wx/private/overlay.h @@ -0,0 +1,72 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/private/overlay.h +// Purpose: wxOverlayImpl declaration +// Author: Stefan Csomor +// Modified by: +// Created: 2006-10-20 +// RCS-ID: $Id: overlay.h 42397 2006-10-25 12:12:56Z VS $ +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_PRIVATE_OVERLAY_H_ +#define _WX_PRIVATE_OVERLAY_H_ + +#include "wx/overlay.h" + +#ifdef wxHAS_NATIVE_OVERLAY + +#if defined(__WXMAC__) + #include "wx/mac/carbon/private/overlay.h" +#elif defined(__WXDFB__) + #include "wx/dfb/private/overlay.h" +#else + #error "unknown native wxOverlay implementation" +#endif + +#else // !wxHAS_NATIVE_OVERLAY + +#include "wx/bitmap.h" + +class WXDLLIMPEXP_CORE wxWindow; + +// generic implementation of wxOverlay +class wxOverlayImpl +{ +public: + wxOverlayImpl(); + ~wxOverlayImpl(); + + + // clears the overlay without restoring the former state + // to be done eg when the window content has been changed and repainted + void Reset(); + + // returns true if it has been setup + bool IsOk(); + + void Init(wxWindowDC* dc, int x , int y , int width , int height); + + void BeginDrawing(wxWindowDC* dc); + + void EndDrawing(wxWindowDC* dc); + + void Clear(wxWindowDC* dc); + +private: + wxBitmap m_bmpSaved ; + int m_x ; + int m_y ; + int m_width ; + int m_height ; +// this is to enable wxMOTIF and UNIV to compile.... +// currently (10 oct 06) we don't use m_window +// ce - how do we fix this +#if defined(__WXGTK__) || defined(__WXMSW__) + wxWindow* m_window ; +#endif +} ; + +#endif // wxHAS_NATIVE_OVERLAY/!wxHAS_NATIVE_OVERLAY + +#endif // _WX_PRIVATE_OVERLAY_H_ diff --git a/Externals/wxWidgets/include/wx/private/socketevtdispatch.h b/Externals/wxWidgets/include/wx/private/socketevtdispatch.h new file mode 100644 index 0000000000..8d83f120af --- /dev/null +++ b/Externals/wxWidgets/include/wx/private/socketevtdispatch.h @@ -0,0 +1,67 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/private/socketevtdispatch.h +// Purpose: wxSocketEventDispatcher class +// Authors: Angel Vidal +// Modified by: +// Created: August 2006 +// Copyright: (c) Angel Vidal +// RCS-ID: $Id: socketevtdispatch.h 43976 2006-12-14 14:13:57Z VS $ +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_PRIVATE_SOCKETEVTDISPATCH_H_ +#define _WX_PRIVATE_SOCKETEVTDISPATCH_H_ + +#include "wx/defs.h" + +#if wxUSE_SOCKETS + +#include "wx/hash.h" + +// forward declarations +class wxSocketEventDispatcherEntry; +class GSocket; + +enum wxSocketEventDispatcherType +{ + wxSocketEventDispatcherInput, + wxSocketEventDispatcherOutput +}; + +class WXDLLIMPEXP_CORE wxSocketEventDispatcher : public wxHashTable +{ +protected: + wxSocketEventDispatcher() : wxHashTable(wxKEY_INTEGER) {} + +public: + // returns instance of the table + static wxSocketEventDispatcher& Get(); + + virtual ~wxSocketEventDispatcher() + { + WX_CLEAR_HASH_TABLE(*this) + } + + void RegisterCallback(int fd, wxSocketEventDispatcherType socketType, + GSocket* socket); + + void UnregisterCallback(int fd, wxSocketEventDispatcherType socketType); + + void RunLoop(int timeout = 0); + +private: + void AddEvents(fd_set* readset, fd_set* writeset); + + int FillSets(fd_set* readset, fd_set* writeset); + + wxSocketEventDispatcherEntry* FindEntry(int fd); + +private: + static wxSocketEventDispatcher *ms_instance; + + friend class wxSocketEventDispatcherModule; +}; + +#endif // wxUSE_SOCKETS + +#endif // _WX_PRIVATE_SOCKETEVTDISPATCH_H_ diff --git a/Externals/wxWidgets/include/wx/prntbase.h b/Externals/wxWidgets/include/wx/prntbase.h new file mode 100644 index 0000000000..9f8809e76f --- /dev/null +++ b/Externals/wxWidgets/include/wx/prntbase.h @@ -0,0 +1,661 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/prntbase.h +// Purpose: Base classes for printing framework +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: prntbase.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_PRNTBASEH__ +#define _WX_PRNTBASEH__ + +#include "wx/defs.h" + +#if wxUSE_PRINTING_ARCHITECTURE + +#include "wx/event.h" +#include "wx/cmndata.h" +#include "wx/panel.h" +#include "wx/scrolwin.h" +#include "wx/dialog.h" +#include "wx/frame.h" + +class WXDLLIMPEXP_FWD_CORE wxDC; +class WXDLLIMPEXP_FWD_CORE wxButton; +class WXDLLIMPEXP_FWD_CORE wxChoice; +class WXDLLIMPEXP_FWD_CORE wxPrintout; +class WXDLLIMPEXP_FWD_CORE wxPrinterBase; +class WXDLLIMPEXP_FWD_CORE wxPrintDialogBase; +class WXDLLIMPEXP_FWD_CORE wxPrintDialog; +class WXDLLIMPEXP_FWD_CORE wxPageSetupDialogBase; +class WXDLLIMPEXP_FWD_CORE wxPageSetupDialog; +class WXDLLIMPEXP_FWD_CORE wxPrintPreviewBase; +class WXDLLIMPEXP_FWD_CORE wxPreviewCanvas; +class WXDLLIMPEXP_FWD_CORE wxPreviewControlBar; +class WXDLLIMPEXP_FWD_CORE wxPreviewFrame; +class WXDLLIMPEXP_FWD_CORE wxPrintFactory; +class WXDLLIMPEXP_FWD_CORE wxPrintNativeDataBase; + +//---------------------------------------------------------------------------- +// error consts +//---------------------------------------------------------------------------- + +enum wxPrinterError +{ + wxPRINTER_NO_ERROR = 0, + wxPRINTER_CANCELLED, + wxPRINTER_ERROR +}; + +//---------------------------------------------------------------------------- +// wxPrintFactory +//---------------------------------------------------------------------------- + +class WXDLLEXPORT wxPrintFactory +{ +public: + wxPrintFactory() {} + virtual ~wxPrintFactory() {} + + virtual wxPrinterBase *CreatePrinter( wxPrintDialogData* data ) = 0; + + virtual wxPrintPreviewBase *CreatePrintPreview( wxPrintout *preview, + wxPrintout *printout = NULL, + wxPrintDialogData *data = NULL ) = 0; + virtual wxPrintPreviewBase *CreatePrintPreview( wxPrintout *preview, + wxPrintout *printout, + wxPrintData *data ) = 0; + + virtual wxPrintDialogBase *CreatePrintDialog( wxWindow *parent, + wxPrintDialogData *data = NULL ) = 0; + virtual wxPrintDialogBase *CreatePrintDialog( wxWindow *parent, + wxPrintData *data ) = 0; + + virtual wxPageSetupDialogBase *CreatePageSetupDialog( wxWindow *parent, + wxPageSetupDialogData * data = NULL ) = 0; + + virtual wxDC* CreatePrinterDC( const wxPrintData& data ) = 0; + + // What to do and what to show in the wxPrintDialog + // a) Use the generic print setup dialog or a native one? + virtual bool HasPrintSetupDialog() = 0; + virtual wxDialog *CreatePrintSetupDialog( wxWindow *parent, wxPrintData *data ) = 0; + // b) Provide the "print to file" option ourselves or via print setup? + virtual bool HasOwnPrintToFile() = 0; + // c) Show current printer + virtual bool HasPrinterLine() = 0; + virtual wxString CreatePrinterLine() = 0; + // d) Show Status line for current printer? + virtual bool HasStatusLine() = 0; + virtual wxString CreateStatusLine() = 0; + + + virtual wxPrintNativeDataBase *CreatePrintNativeData() = 0; + + static void SetPrintFactory( wxPrintFactory *factory ); + static wxPrintFactory *GetFactory(); +private: + static wxPrintFactory *m_factory; +}; + +class WXDLLEXPORT wxNativePrintFactory: public wxPrintFactory +{ +public: + virtual wxPrinterBase *CreatePrinter( wxPrintDialogData *data ); + + virtual wxPrintPreviewBase *CreatePrintPreview( wxPrintout *preview, + wxPrintout *printout = NULL, + wxPrintDialogData *data = NULL ); + virtual wxPrintPreviewBase *CreatePrintPreview( wxPrintout *preview, + wxPrintout *printout, + wxPrintData *data ); + + virtual wxPrintDialogBase *CreatePrintDialog( wxWindow *parent, + wxPrintDialogData *data = NULL ); + virtual wxPrintDialogBase *CreatePrintDialog( wxWindow *parent, + wxPrintData *data ); + + virtual wxPageSetupDialogBase *CreatePageSetupDialog( wxWindow *parent, + wxPageSetupDialogData * data = NULL ); + + virtual wxDC* CreatePrinterDC( const wxPrintData& data ); + + virtual bool HasPrintSetupDialog(); + virtual wxDialog *CreatePrintSetupDialog( wxWindow *parent, wxPrintData *data ); + virtual bool HasOwnPrintToFile(); + virtual bool HasPrinterLine(); + virtual wxString CreatePrinterLine(); + virtual bool HasStatusLine(); + virtual wxString CreateStatusLine(); + + virtual wxPrintNativeDataBase *CreatePrintNativeData(); +}; + +//---------------------------------------------------------------------------- +// wxPrintNativeDataBase +//---------------------------------------------------------------------------- + +class WXDLLEXPORT wxPrintNativeDataBase: public wxObject +{ +public: + wxPrintNativeDataBase(); + virtual ~wxPrintNativeDataBase() {} + + virtual bool TransferTo( wxPrintData &data ) = 0; + virtual bool TransferFrom( const wxPrintData &data ) = 0; + + virtual bool Ok() const { return IsOk(); } + virtual bool IsOk() const = 0; + + int m_ref; + +private: + DECLARE_CLASS(wxPrintNativeDataBase) + DECLARE_NO_COPY_CLASS(wxPrintNativeDataBase) +}; + +//---------------------------------------------------------------------------- +// wxPrinterBase +//---------------------------------------------------------------------------- + +/* + * Represents the printer: manages printing a wxPrintout object + */ + +class WXDLLEXPORT wxPrinterBase: public wxObject +{ +public: + wxPrinterBase(wxPrintDialogData *data = (wxPrintDialogData *) NULL); + virtual ~wxPrinterBase(); + + virtual wxWindow *CreateAbortWindow(wxWindow *parent, wxPrintout *printout); + virtual void ReportError(wxWindow *parent, wxPrintout *printout, const wxString& message); + + virtual wxPrintDialogData& GetPrintDialogData() const; + bool GetAbort() const { return sm_abortIt; } + + static wxPrinterError GetLastError() { return sm_lastError; } + + /////////////////////////////////////////////////////////////////////////// + // OVERRIDES + + virtual bool Setup(wxWindow *parent) = 0; + virtual bool Print(wxWindow *parent, wxPrintout *printout, bool prompt = true) = 0; + virtual wxDC* PrintDialog(wxWindow *parent) = 0; + +protected: + wxPrintDialogData m_printDialogData; + wxPrintout* m_currentPrintout; + + static wxPrinterError sm_lastError; + +public: + static wxWindow* sm_abortWindow; + static bool sm_abortIt; + +private: + DECLARE_CLASS(wxPrinterBase) + DECLARE_NO_COPY_CLASS(wxPrinterBase) +}; + +//---------------------------------------------------------------------------- +// wxPrinter +//---------------------------------------------------------------------------- + +class WXDLLEXPORT wxPrinter: public wxPrinterBase +{ +public: + wxPrinter(wxPrintDialogData *data = (wxPrintDialogData *) NULL); + virtual ~wxPrinter(); + + virtual wxWindow *CreateAbortWindow(wxWindow *parent, wxPrintout *printout); + virtual void ReportError(wxWindow *parent, wxPrintout *printout, const wxString& message); + + virtual bool Setup(wxWindow *parent); + virtual bool Print(wxWindow *parent, wxPrintout *printout, bool prompt = true); + virtual wxDC* PrintDialog(wxWindow *parent); + + virtual wxPrintDialogData& GetPrintDialogData() const; + +protected: + wxPrinterBase *m_pimpl; + +private: + DECLARE_CLASS(wxPrinter) + DECLARE_NO_COPY_CLASS(wxPrinter) +}; + +//---------------------------------------------------------------------------- +// wxPrintout +//---------------------------------------------------------------------------- + +/* + * Represents an object via which a document may be printed. + * The programmer derives from this, overrides (at least) OnPrintPage, + * and passes it to a wxPrinter object for printing, or a wxPrintPreview + * object for previewing. + */ + +class WXDLLEXPORT wxPrintout: public wxObject +{ +public: + wxPrintout(const wxString& title = wxT("Printout")); + virtual ~wxPrintout(); + + virtual bool OnBeginDocument(int startPage, int endPage); + virtual void OnEndDocument(); + virtual void OnBeginPrinting(); + virtual void OnEndPrinting(); + + // Guaranteed to be before any other functions are called + virtual void OnPreparePrinting() { } + + virtual bool HasPage(int page); + virtual bool OnPrintPage(int page) = 0; + virtual void GetPageInfo(int *minPage, int *maxPage, int *pageFrom, int *pageTo); + + virtual wxString GetTitle() const { return m_printoutTitle; } + + wxDC *GetDC() const { return m_printoutDC; } + void SetDC(wxDC *dc) { m_printoutDC = dc; } + + void FitThisSizeToPaper(const wxSize& imageSize); + void FitThisSizeToPage(const wxSize& imageSize); + void FitThisSizeToPageMargins(const wxSize& imageSize, const wxPageSetupDialogData& pageSetupData); + void MapScreenSizeToPaper(); + void MapScreenSizeToPage(); + void MapScreenSizeToPageMargins(const wxPageSetupDialogData& pageSetupData); + void MapScreenSizeToDevice(); + + wxRect GetLogicalPaperRect() const; + wxRect GetLogicalPageRect() const; + wxRect GetLogicalPageMarginsRect(const wxPageSetupDialogData& pageSetupData) const; + + void SetLogicalOrigin(wxCoord x, wxCoord y); + void OffsetLogicalOrigin(wxCoord xoff, wxCoord yoff); + + void SetPageSizePixels(int w, int h) { m_pageWidthPixels = w; m_pageHeightPixels = h; } + void GetPageSizePixels(int *w, int *h) const { *w = m_pageWidthPixels; *h = m_pageHeightPixels; } + void SetPageSizeMM(int w, int h) { m_pageWidthMM = w; m_pageHeightMM = h; } + void GetPageSizeMM(int *w, int *h) const { *w = m_pageWidthMM; *h = m_pageHeightMM; } + + void SetPPIScreen(int x, int y) { m_PPIScreenX = x; m_PPIScreenY = y; } + void GetPPIScreen(int *x, int *y) const { *x = m_PPIScreenX; *y = m_PPIScreenY; } + void SetPPIPrinter(int x, int y) { m_PPIPrinterX = x; m_PPIPrinterY = y; } + void GetPPIPrinter(int *x, int *y) const { *x = m_PPIPrinterX; *y = m_PPIPrinterY; } + + void SetPaperRectPixels(const wxRect& paperRectPixels) { m_paperRectPixels = paperRectPixels; } + wxRect GetPaperRectPixels() const { return m_paperRectPixels; } + + virtual bool IsPreview() const { return m_isPreview; } + + virtual void SetIsPreview(bool p) { m_isPreview = p; } + +private: + wxString m_printoutTitle; + wxDC* m_printoutDC; + + int m_pageWidthPixels; + int m_pageHeightPixels; + + int m_pageWidthMM; + int m_pageHeightMM; + + int m_PPIScreenX; + int m_PPIScreenY; + int m_PPIPrinterX; + int m_PPIPrinterY; + + wxRect m_paperRectPixels; + + bool m_isPreview; + +private: + DECLARE_ABSTRACT_CLASS(wxPrintout) + DECLARE_NO_COPY_CLASS(wxPrintout) +}; + +//---------------------------------------------------------------------------- +// wxPreviewCanvas +//---------------------------------------------------------------------------- + +/* + * Canvas upon which a preview is drawn. + */ + +class WXDLLEXPORT wxPreviewCanvas: public wxScrolledWindow +{ +public: + wxPreviewCanvas(wxPrintPreviewBase *preview, + wxWindow *parent, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxT("canvas")); + virtual ~wxPreviewCanvas(); + + void OnPaint(wxPaintEvent& event); + void OnChar(wxKeyEvent &event); + // Responds to colour changes + void OnSysColourChanged(wxSysColourChangedEvent& event); + +private: +#if wxUSE_MOUSEWHEEL + void OnMouseWheel(wxMouseEvent& event); +#endif // wxUSE_MOUSEWHEEL + + wxPrintPreviewBase* m_printPreview; + + DECLARE_CLASS(wxPreviewCanvas) + DECLARE_EVENT_TABLE() + DECLARE_NO_COPY_CLASS(wxPreviewCanvas) +}; + +//---------------------------------------------------------------------------- +// wxPreviewFrame +//---------------------------------------------------------------------------- + +/* + * Default frame for showing preview. + */ + +class WXDLLEXPORT wxPreviewFrame: public wxFrame +{ +public: + wxPreviewFrame(wxPrintPreviewBase *preview, + wxWindow *parent, + const wxString& title = wxT("Print Preview"), + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDEFAULT_FRAME_STYLE, + const wxString& name = wxT("frame")); + virtual ~wxPreviewFrame(); + + void OnCloseWindow(wxCloseEvent& event); + virtual void Initialize(); + virtual void CreateCanvas(); + virtual void CreateControlBar(); + + inline wxPreviewControlBar* GetControlBar() const { return m_controlBar; } + +protected: + wxPreviewCanvas* m_previewCanvas; + wxPreviewControlBar* m_controlBar; + wxPrintPreviewBase* m_printPreview; + wxWindowDisabler* m_windowDisabler; + +private: + DECLARE_CLASS(wxPreviewFrame) + DECLARE_EVENT_TABLE() + DECLARE_NO_COPY_CLASS(wxPreviewFrame) +}; + +//---------------------------------------------------------------------------- +// wxPreviewControlBar +//---------------------------------------------------------------------------- + +/* + * A panel with buttons for controlling a print preview. + * The programmer may wish to use other means for controlling + * the print preview. + */ + +#define wxPREVIEW_PRINT 1 +#define wxPREVIEW_PREVIOUS 2 +#define wxPREVIEW_NEXT 4 +#define wxPREVIEW_ZOOM 8 +#define wxPREVIEW_FIRST 16 +#define wxPREVIEW_LAST 32 +#define wxPREVIEW_GOTO 64 + +#define wxPREVIEW_DEFAULT (wxPREVIEW_PREVIOUS|wxPREVIEW_NEXT|wxPREVIEW_ZOOM\ + |wxPREVIEW_FIRST|wxPREVIEW_GOTO|wxPREVIEW_LAST) + +// Ids for controls +#define wxID_PREVIEW_CLOSE 1 +#define wxID_PREVIEW_NEXT 2 +#define wxID_PREVIEW_PREVIOUS 3 +#define wxID_PREVIEW_PRINT 4 +#define wxID_PREVIEW_ZOOM 5 +#define wxID_PREVIEW_FIRST 6 +#define wxID_PREVIEW_LAST 7 +#define wxID_PREVIEW_GOTO 8 + +class WXDLLEXPORT wxPreviewControlBar: public wxPanel +{ + DECLARE_CLASS(wxPreviewControlBar) + +public: + wxPreviewControlBar(wxPrintPreviewBase *preview, + long buttons, + wxWindow *parent, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxTAB_TRAVERSAL, + const wxString& name = wxT("panel")); + virtual ~wxPreviewControlBar(); + + virtual void CreateButtons(); + virtual void SetZoomControl(int zoom); + virtual int GetZoomControl(); + virtual wxPrintPreviewBase *GetPrintPreview() const + { return m_printPreview; } + + void OnWindowClose(wxCommandEvent& event); + void OnNext(); + void OnPrevious(); + void OnFirst(); + void OnLast(); + void OnGoto(); + void OnPrint(); + void OnPrintButton(wxCommandEvent& WXUNUSED(event)) { OnPrint(); } + void OnNextButton(wxCommandEvent & WXUNUSED(event)) { OnNext(); } + void OnPreviousButton(wxCommandEvent & WXUNUSED(event)) { OnPrevious(); } + void OnFirstButton(wxCommandEvent & WXUNUSED(event)) { OnFirst(); } + void OnLastButton(wxCommandEvent & WXUNUSED(event)) { OnLast(); } + void OnGotoButton(wxCommandEvent & WXUNUSED(event)) { OnGoto(); } + void OnZoom(wxCommandEvent& event); + void OnPaint(wxPaintEvent& event); + +protected: + wxPrintPreviewBase* m_printPreview; + wxButton* m_closeButton; + wxButton* m_nextPageButton; + wxButton* m_previousPageButton; + wxButton* m_printButton; + wxChoice* m_zoomControl; + wxButton* m_firstPageButton; + wxButton* m_lastPageButton; + wxButton* m_gotoPageButton; + long m_buttonFlags; + +private: + DECLARE_EVENT_TABLE() + DECLARE_NO_COPY_CLASS(wxPreviewControlBar) +}; + +//---------------------------------------------------------------------------- +// wxPrintPreviewBase +//---------------------------------------------------------------------------- + +/* + * Programmer creates an object of this class to preview a wxPrintout. + */ + +class WXDLLEXPORT wxPrintPreviewBase: public wxObject +{ +public: + wxPrintPreviewBase(wxPrintout *printout, + wxPrintout *printoutForPrinting = (wxPrintout *) NULL, + wxPrintDialogData *data = (wxPrintDialogData *) NULL); + wxPrintPreviewBase(wxPrintout *printout, + wxPrintout *printoutForPrinting, + wxPrintData *data); + virtual ~wxPrintPreviewBase(); + + virtual bool SetCurrentPage(int pageNum); + virtual int GetCurrentPage() const; + + virtual void SetPrintout(wxPrintout *printout); + virtual wxPrintout *GetPrintout() const; + virtual wxPrintout *GetPrintoutForPrinting() const; + + virtual void SetFrame(wxFrame *frame); + virtual void SetCanvas(wxPreviewCanvas *canvas); + + virtual wxFrame *GetFrame() const; + virtual wxPreviewCanvas *GetCanvas() const; + + // This is a helper routine, used by the next 4 routines. + + virtual void CalcRects(wxPreviewCanvas *canvas, wxRect& printableAreaRect, wxRect& paperRect); + + // The preview canvas should call this from OnPaint + virtual bool PaintPage(wxPreviewCanvas *canvas, wxDC& dc); + + // This draws a blank page onto the preview canvas + virtual bool DrawBlankPage(wxPreviewCanvas *canvas, wxDC& dc); + + // Adjusts the scrollbars for the current scale + virtual void AdjustScrollbars(wxPreviewCanvas *canvas); + + // This is called by wxPrintPreview to render a page into a wxMemoryDC. + virtual bool RenderPage(int pageNum); + + + virtual void SetZoom(int percent); + virtual int GetZoom() const; + + virtual wxPrintDialogData& GetPrintDialogData(); + + virtual int GetMaxPage() const; + virtual int GetMinPage() const; + + virtual bool Ok() const { return IsOk(); } + virtual bool IsOk() const; + virtual void SetOk(bool ok); + + /////////////////////////////////////////////////////////////////////////// + // OVERRIDES + + // If we own a wxPrintout that can be used for printing, this + // will invoke the actual printing procedure. Called + // by the wxPreviewControlBar. + virtual bool Print(bool interactive) = 0; + + // Calculate scaling that needs to be done to get roughly + // the right scaling for the screen pretending to be + // the currently selected printer. + virtual void DetermineScaling() = 0; + +protected: + wxPrintDialogData m_printDialogData; + wxPreviewCanvas* m_previewCanvas; + wxFrame* m_previewFrame; + wxBitmap* m_previewBitmap; + wxPrintout* m_previewPrintout; + wxPrintout* m_printPrintout; + int m_currentPage; + int m_currentZoom; + float m_previewScaleX; + float m_previewScaleY; + int m_topMargin; + int m_leftMargin; + int m_pageWidth; + int m_pageHeight; + int m_minPage; + int m_maxPage; + + bool m_isOk; + bool m_printingPrepared; // Called OnPreparePrinting? + +private: + void Init(wxPrintout *printout, wxPrintout *printoutForPrinting); + + DECLARE_NO_COPY_CLASS(wxPrintPreviewBase) + DECLARE_CLASS(wxPrintPreviewBase) +}; + +//---------------------------------------------------------------------------- +// wxPrintPreview +//---------------------------------------------------------------------------- + +class WXDLLEXPORT wxPrintPreview: public wxPrintPreviewBase +{ +public: + wxPrintPreview(wxPrintout *printout, + wxPrintout *printoutForPrinting = (wxPrintout *) NULL, + wxPrintDialogData *data = (wxPrintDialogData *) NULL); + wxPrintPreview(wxPrintout *printout, + wxPrintout *printoutForPrinting, + wxPrintData *data); + virtual ~wxPrintPreview(); + + virtual bool SetCurrentPage(int pageNum); + virtual int GetCurrentPage() const; + virtual void SetPrintout(wxPrintout *printout); + virtual wxPrintout *GetPrintout() const; + virtual wxPrintout *GetPrintoutForPrinting() const; + virtual void SetFrame(wxFrame *frame); + virtual void SetCanvas(wxPreviewCanvas *canvas); + + virtual wxFrame *GetFrame() const; + virtual wxPreviewCanvas *GetCanvas() const; + virtual bool PaintPage(wxPreviewCanvas *canvas, wxDC& dc); + virtual bool DrawBlankPage(wxPreviewCanvas *canvas, wxDC& dc); + virtual void AdjustScrollbars(wxPreviewCanvas *canvas); + virtual bool RenderPage(int pageNum); + virtual void SetZoom(int percent); + virtual int GetZoom() const; + + virtual bool Print(bool interactive); + virtual void DetermineScaling(); + + virtual wxPrintDialogData& GetPrintDialogData(); + + virtual int GetMaxPage() const; + virtual int GetMinPage() const; + + virtual bool Ok() const { return IsOk(); } + virtual bool IsOk() const; + virtual void SetOk(bool ok); + +private: + wxPrintPreviewBase *m_pimpl; + +private: + DECLARE_CLASS(wxPrintPreview) + DECLARE_NO_COPY_CLASS(wxPrintPreview) +}; + +//---------------------------------------------------------------------------- +// wxPrintAbortDialog +//---------------------------------------------------------------------------- + +class WXDLLEXPORT wxPrintAbortDialog: public wxDialog +{ +public: + wxPrintAbortDialog(wxWindow *parent, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxT("dialog")) + : wxDialog(parent, wxID_ANY, title, pos, size, style, name) + { + } + + void OnCancel(wxCommandEvent& event); + +private: + DECLARE_EVENT_TABLE() + DECLARE_NO_COPY_CLASS(wxPrintAbortDialog) +}; + +#endif // wxUSE_PRINTING_ARCHITECTURE + +#endif + // _WX_PRNTBASEH__ diff --git a/Externals/wxWidgets/include/wx/process.h b/Externals/wxWidgets/include/wx/process.h new file mode 100644 index 0000000000..2c2f6185ed --- /dev/null +++ b/Externals/wxWidgets/include/wx/process.h @@ -0,0 +1,172 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/process.h +// Purpose: wxProcess class +// Author: Guilhem Lavaux +// Modified by: Vadim Zeitlin to check error codes, added Detach() method +// Created: 24/06/98 +// RCS-ID: $Id: process.h 42713 2006-10-30 11:56:12Z ABX $ +// Copyright: (c) 1998 Guilhem Lavaux +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_PROCESSH__ +#define _WX_PROCESSH__ + +#include "wx/event.h" + +#if wxUSE_STREAMS + #include "wx/stream.h" +#endif + +#include "wx/utils.h" // for wxSignal + +// the wxProcess creation flags +enum +{ + // no redirection + wxPROCESS_DEFAULT = 0, + + // redirect the IO of the child process + wxPROCESS_REDIRECT = 1 +}; + +// ---------------------------------------------------------------------------- +// A wxProcess object should be passed to wxExecute - than its OnTerminate() +// function will be called when the process terminates. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxProcess : public wxEvtHandler +{ +public: + // kill the process with the given PID + static wxKillError Kill(int pid, wxSignal sig = wxSIGTERM, int flags = wxKILL_NOCHILDREN); + + // test if the given process exists + static bool Exists(int pid); + + // this function replaces the standard popen() one: it launches a process + // asynchronously and allows the caller to get the streams connected to its + // std{in|out|err} + // + // on error NULL is returned, in any case the process object will be + // deleted automatically when the process terminates and should *not* be + // deleted by the caller + static wxProcess *Open(const wxString& cmd, int flags = wxEXEC_ASYNC); + + + // ctors + wxProcess(wxEvtHandler *parent = (wxEvtHandler *) NULL, int nId = wxID_ANY) + { Init(parent, nId, wxPROCESS_DEFAULT); } + + wxProcess(int flags) { Init(NULL, wxID_ANY, flags); } + + virtual ~wxProcess(); + + // get the process ID of the process executed by Open() + long GetPid() const { return m_pid; } + + // may be overridden to be notified about process termination + virtual void OnTerminate(int pid, int status); + + // call this before passing the object to wxExecute() to redirect the + // launched process stdin/stdout, then use GetInputStream() and + // GetOutputStream() to get access to them + void Redirect() { m_redirect = true; } + bool IsRedirected() const { return m_redirect; } + + // detach from the parent - should be called by the parent if it's deleted + // before the process it started terminates + void Detach(); + +#if wxUSE_STREAMS + // Pipe handling + wxInputStream *GetInputStream() const { return m_inputStream; } + wxInputStream *GetErrorStream() const { return m_errorStream; } + wxOutputStream *GetOutputStream() const { return m_outputStream; } + + // close the output stream indicating that nothing more will be written + void CloseOutput() { delete m_outputStream; m_outputStream = NULL; } + + // return true if the child process stdout is not closed + bool IsInputOpened() const; + + // return true if any input is available on the child process stdout/err + bool IsInputAvailable() const; + bool IsErrorAvailable() const; + + // implementation only (for wxExecute) + // + // NB: the streams passed here should correspond to the child process + // stdout, stdin and stderr and here the normal naming convention is + // used unlike elsewhere in this class + void SetPipeStreams(wxInputStream *outStream, + wxOutputStream *inStream, + wxInputStream *errStream); +#endif // wxUSE_STREAMS + +protected: + void Init(wxEvtHandler *parent, int id, int flags); + void SetPid(long pid) { m_pid = pid; } + + int m_id; + long m_pid; + +#if wxUSE_STREAMS + // these streams are connected to stdout, stderr and stdin of the child + // process respectively (yes, m_inputStream corresponds to stdout -- very + // confusing but too late to change now) + wxInputStream *m_inputStream, + *m_errorStream; + wxOutputStream *m_outputStream; +#endif // wxUSE_STREAMS + + bool m_redirect; + + DECLARE_DYNAMIC_CLASS(wxProcess) + DECLARE_NO_COPY_CLASS(wxProcess) +}; + +// ---------------------------------------------------------------------------- +// wxProcess events +// ---------------------------------------------------------------------------- + +BEGIN_DECLARE_EVENT_TYPES() + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_BASE, wxEVT_END_PROCESS, 440) +END_DECLARE_EVENT_TYPES() + +class WXDLLIMPEXP_BASE wxProcessEvent : public wxEvent +{ +public: + wxProcessEvent(int nId = 0, int pid = 0, int exitcode = 0) : wxEvent(nId) + { + m_eventType = wxEVT_END_PROCESS; + m_pid = pid; + m_exitcode = exitcode; + } + + // accessors + // PID of process which terminated + int GetPid() { return m_pid; } + + // the exit code + int GetExitCode() { return m_exitcode; } + + // implement the base class pure virtual + virtual wxEvent *Clone() const { return new wxProcessEvent(*this); } + +public: + int m_pid, + m_exitcode; + + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxProcessEvent) +}; + +typedef void (wxEvtHandler::*wxProcessEventFunction)(wxProcessEvent&); + +#define wxProcessEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxProcessEventFunction, &func) + +#define EVT_END_PROCESS(id, func) \ + wx__DECLARE_EVT1(wxEVT_END_PROCESS, id, wxProcessEventHandler(func)) + +#endif // _WX_PROCESSH__ diff --git a/Externals/wxWidgets/include/wx/progdlg.h b/Externals/wxWidgets/include/wx/progdlg.h new file mode 100644 index 0000000000..196192bce2 --- /dev/null +++ b/Externals/wxWidgets/include/wx/progdlg.h @@ -0,0 +1,36 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/progdlg.h +// Purpose: Base header for wxProgressDialog +// Author: Julian Smart +// Modified by: +// Created: +// RCS-ID: $Id: progdlg.h 41089 2006-09-09 13:36:54Z RR $ +// Copyright: (c) Julian Smart +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_PROGDLG_H_BASE_ +#define _WX_PROGDLG_H_BASE_ + +#include "wx/defs.h" + +/* + * wxProgressDialog flags + */ +#define wxPD_CAN_ABORT 0x0001 +#define wxPD_APP_MODAL 0x0002 +#define wxPD_AUTO_HIDE 0x0004 +#define wxPD_ELAPSED_TIME 0x0008 +#define wxPD_ESTIMATED_TIME 0x0010 +#define wxPD_SMOOTH 0x0020 +#define wxPD_REMAINING_TIME 0x0040 +#define wxPD_CAN_SKIP 0x0080 + + +#ifdef __WXPALMOS__ + #include "wx/palmos/progdlg.h" +#else + #include "wx/generic/progdlgg.h" +#endif + +#endif // _WX_PROGDLG_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/propdlg.h b/Externals/wxWidgets/include/wx/propdlg.h new file mode 100644 index 0000000000..34396e26e3 --- /dev/null +++ b/Externals/wxWidgets/include/wx/propdlg.h @@ -0,0 +1,19 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/propdlg.h +// Purpose: wxPropertySheetDialog base header +// Author: Julian Smart +// Modified by: +// Created: +// RCS-ID: $Id: propdlg.h 33948 2005-05-04 18:57:50Z JS $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_PROPDLG_H_BASE_ +#define _WX_PROPDLG_H_BASE_ + +#include "wx/generic/propdlg.h" + +#endif + // _WX_PROPDLG_H_BASE_ + diff --git a/Externals/wxWidgets/include/wx/protocol/file.h b/Externals/wxWidgets/include/wx/protocol/file.h new file mode 100644 index 0000000000..250e03b008 --- /dev/null +++ b/Externals/wxWidgets/include/wx/protocol/file.h @@ -0,0 +1,37 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: file.h +// Purpose: File protocol +// Author: Guilhem Lavaux +// Modified by: +// Created: 1997 +// RCS-ID: $Id: file.h 43836 2006-12-06 19:20:40Z VZ $ +// Copyright: (c) 1997, 1998 Guilhem Lavaux +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef __WX_PROTO_FILE_H__ +#define __WX_PROTO_FILE_H__ + +#include "wx/defs.h" + +#if wxUSE_PROTOCOL_FILE + +#include "wx/protocol/protocol.h" + +class WXDLLIMPEXP_NET wxFileProto: public wxProtocol { + DECLARE_DYNAMIC_CLASS_NO_COPY(wxFileProto) + DECLARE_PROTOCOL(wxFileProto) +protected: + wxProtocolError m_error; +public: + wxFileProto(); + virtual ~wxFileProto(); + + wxProtocolError GetError() { return m_error; } + bool Abort() { return TRUE; } + wxInputStream *GetInputStream(const wxString& path); +}; + +#endif // wxUSE_PROTOCOL_FILE + +#endif // __WX_PROTO_FILE_H__ diff --git a/Externals/wxWidgets/include/wx/protocol/ftp.h b/Externals/wxWidgets/include/wx/protocol/ftp.h new file mode 100644 index 0000000000..f3f8a3b544 --- /dev/null +++ b/Externals/wxWidgets/include/wx/protocol/ftp.h @@ -0,0 +1,182 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: ftp.h +// Purpose: FTP protocol +// Author: Vadim Zeitlin +// Modified by: Mark Johnson, wxWindows@mj10777.de +// 20000917 : RmDir, GetLastResult, GetList +// Created: 07/07/1997 +// RCS-ID: $Id: ftp.h 45498 2007-04-16 13:03:05Z VZ $ +// Copyright: (c) 1997, 1998 Guilhem Lavaux +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef __WX_FTP_H__ +#define __WX_FTP_H__ + +#include "wx/defs.h" + +#if wxUSE_PROTOCOL_FTP + +#include "wx/sckaddr.h" +#include "wx/protocol/protocol.h" +#include "wx/url.h" + +class WXDLLIMPEXP_NET wxFTP : public wxProtocol +{ +public: + enum TransferMode + { + NONE, // not set by user explicitly + ASCII, + BINARY + }; + + wxFTP(); + virtual ~wxFTP(); + + // Connecting and disconnecting + void SetUser(const wxString& user) { m_user = user; } + void SetPassword(const wxString& passwd) { m_passwd = passwd; } + + bool Connect(wxSockAddress& addr, bool wait = true); + bool Connect(const wxString& host); + + // disconnect + virtual bool Close(); + + // Parameters set up + + // set transfer mode now + void SetPassive(bool pasv) { m_bPassive = pasv; } + void SetDefaultTimeout(wxUint32 Value); + bool SetBinary() { return SetTransferMode(BINARY); } + bool SetAscii() { return SetTransferMode(ASCII); } + bool SetTransferMode(TransferMode mode); + + // Generic FTP interface + + // the error code + virtual wxProtocolError GetError() { return m_lastError; } + + // the last FTP server reply + const wxString& GetLastResult() { return m_lastResult; } + + // send any FTP command (should be full FTP command line but without + // trailing "\r\n") and return its return code + char SendCommand(const wxString& command); + + // check that the command returned the given code + bool CheckCommand(const wxString& command, char expectedReturn) + { + return SendCommand(command) == expectedReturn; + } + + // Filesystem commands + bool ChDir(const wxString& dir); + bool MkDir(const wxString& dir); + bool RmDir(const wxString& dir); + wxString Pwd(); + bool Rename(const wxString& src, const wxString& dst); + bool RmFile(const wxString& path); + + // Get the size of a file in the current dir. + // this function tries its best to deliver the size in bytes using BINARY + // (the SIZE command reports different sizes depending on whether + // type is set to ASCII or BINARY) + // returns -1 if file is non-existant or size could not be found + int GetFileSize(const wxString& fileName); + + // Check to see if a file exists in the current dir + bool FileExists(const wxString& fileName); + + // Download methods + bool Abort(); + + virtual wxInputStream *GetInputStream(const wxString& path); + virtual wxOutputStream *GetOutputStream(const wxString& path); + + // Directory listing + + // get the list of full filenames, the format is fixed: one file name per + // line + bool GetFilesList(wxArrayString& files, + const wxString& wildcard = wxEmptyString) + { + return GetList(files, wildcard, false); + } + + // get a directory list in server dependent format - this can be shown + // directly to the user + bool GetDirList(wxArrayString& files, + const wxString& wildcard = wxEmptyString) + { + return GetList(files, wildcard, true); + } + + // equivalent to either GetFilesList() (default) or GetDirList() + bool GetList(wxArrayString& files, + const wxString& wildcard = wxEmptyString, + bool details = false); + +protected: + // this executes a simple ftp command with the given argument and returns + // true if it its return code starts with '2' + bool DoSimpleCommand(const wxChar *command, + const wxString& arg = wxEmptyString); + + // get the server reply, return the first character of the reply code, + // '1'..'5' for normal FTP replies, 0 (*not* '0') if an error occurred + char GetResult(); + + // check that the result is equal to expected value + bool CheckResult(char ch) { return GetResult() == ch; } + + // return the socket to be used, Passive/Active versions are used only by + // GetPort() + wxSocketBase *GetPort(); + wxSocketBase *GetPassivePort(); + wxSocketBase *GetActivePort(); + + // helper for GetPort() + wxString GetPortCmdArgument(const wxIPV4address& Local, const wxIPV4address& New); + + // accept connection from server in active mode, returns the same socket as + // passed in in passive mode + wxSocketBase *AcceptIfActive(wxSocketBase *sock); + + + wxString m_user, + m_passwd; + + wxString m_lastResult; + wxProtocolError m_lastError; + + // true if there is an FTP transfer going on + bool m_streaming; + + // although this should be set to ASCII by default according to STD9, + // we will use BINARY transfer mode by default for backwards compatibility + TransferMode m_currentTransfermode; + + friend class wxInputFTPStream; + friend class wxOutputFTPStream; + + bool m_bPassive; + wxUint32 m_uiDefaultTimeout; + + // following is true when a read or write times out, we then assume + // the connection is dead and abort. we avoid additional delays this way + bool m_bEncounteredError; + + + DECLARE_DYNAMIC_CLASS_NO_COPY(wxFTP) + DECLARE_PROTOCOL(wxFTP) +}; + +// the trace mask used by assorted wxLogTrace() in ftp code, do +// wxLog::AddTraceMask(FTP_TRACE_MASK) to see them in output +#define FTP_TRACE_MASK _T("ftp") + +#endif // wxUSE_PROTOCOL_FTP + +#endif // __WX_FTP_H__ diff --git a/Externals/wxWidgets/include/wx/protocol/http.h b/Externals/wxWidgets/include/wx/protocol/http.h new file mode 100644 index 0000000000..29d61dcd78 --- /dev/null +++ b/Externals/wxWidgets/include/wx/protocol/http.h @@ -0,0 +1,91 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: http.h +// Purpose: HTTP protocol +// Author: Guilhem Lavaux +// Modified by: Simo Virokannas (authentication, Dec 2005) +// Created: August 1997 +// RCS-ID: $Id: http.h 41020 2006-09-05 20:47:48Z VZ $ +// Copyright: (c) 1997, 1998 Guilhem Lavaux +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// +#ifndef _WX_HTTP_H +#define _WX_HTTP_H + +#include "wx/defs.h" + +#if wxUSE_PROTOCOL_HTTP + +#include "wx/hashmap.h" +#include "wx/protocol/protocol.h" + +WX_DECLARE_STRING_HASH_MAP_WITH_DECL( wxString, wxStringToStringHashMap, + class WXDLLIMPEXP_NET ); + +class WXDLLIMPEXP_NET wxHTTP : public wxProtocol +{ +public: + wxHTTP(); + virtual ~wxHTTP(); + + virtual bool Connect(const wxString& host, unsigned short port); + virtual bool Connect(const wxString& host) { return Connect(host, 0); } + virtual bool Connect(wxSockAddress& addr, bool wait); + bool Abort(); + wxInputStream *GetInputStream(const wxString& path); + inline wxProtocolError GetError() { return m_perr; } + wxString GetContentType(); + + void SetHeader(const wxString& header, const wxString& h_data); + wxString GetHeader(const wxString& header) const; + void SetPostBuffer(const wxString& post_buf); + + void SetProxyMode(bool on); + + int GetResponse() { return m_http_response; } + + virtual void SetUser(const wxString& user) { m_username = user; } + virtual void SetPassword(const wxString& passwd ) { m_password = passwd; } + +protected: + enum wxHTTP_Req + { + wxHTTP_GET, + wxHTTP_POST, + wxHTTP_HEAD + }; + + typedef wxStringToStringHashMap::iterator wxHeaderIterator; + typedef wxStringToStringHashMap::const_iterator wxHeaderConstIterator; + + bool BuildRequest(const wxString& path, wxHTTP_Req req); + void SendHeaders(); + bool ParseHeaders(); + + wxString GenerateAuthString(const wxString& user, const wxString& pass) const; + + // find the header in m_headers + wxHeaderIterator FindHeader(const wxString& header); + wxHeaderConstIterator FindHeader(const wxString& header) const; + + // deletes the header value strings + void ClearHeaders(); + + wxProtocolError m_perr; + wxStringToStringHashMap m_headers; + bool m_read, + m_proxy_mode; + wxSockAddress *m_addr; + wxString m_post_buf; + int m_http_response; + wxString m_username; + wxString m_password; + + DECLARE_DYNAMIC_CLASS(wxHTTP) + DECLARE_PROTOCOL(wxHTTP) + DECLARE_NO_COPY_CLASS(wxHTTP) +}; + +#endif // wxUSE_PROTOCOL_HTTP + +#endif // _WX_HTTP_H + diff --git a/Externals/wxWidgets/include/wx/protocol/protocol.h b/Externals/wxWidgets/include/wx/protocol/protocol.h new file mode 100644 index 0000000000..8000616683 --- /dev/null +++ b/Externals/wxWidgets/include/wx/protocol/protocol.h @@ -0,0 +1,131 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/protocol/protocol.h +// Purpose: Protocol base class +// Author: Guilhem Lavaux +// Modified by: +// Created: 10/07/1997 +// RCS-ID: $Id: protocol.h 35650 2005-09-23 12:56:45Z MR $ +// Copyright: (c) 1997, 1998 Guilhem Lavaux +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_PROTOCOL_PROTOCOL_H +#define _WX_PROTOCOL_PROTOCOL_H + +#include "wx/defs.h" + +#if wxUSE_PROTOCOL + +#include "wx/object.h" +#include "wx/string.h" +#include "wx/stream.h" + +#if wxUSE_SOCKETS + #include "wx/socket.h" +#endif + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +typedef enum +{ + wxPROTO_NOERR = 0, + wxPROTO_NETERR, + wxPROTO_PROTERR, + wxPROTO_CONNERR, + wxPROTO_INVVAL, + wxPROTO_NOHNDLR, + wxPROTO_NOFILE, + wxPROTO_ABRT, + wxPROTO_RCNCT, + wxPROTO_STREAMING +} wxProtocolError; + +// ---------------------------------------------------------------------------- +// wxProtocol: abstract base class for all protocols +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_NET wxProtocol +#if wxUSE_SOCKETS + : public wxSocketClient +#else + : public wxObject +#endif +{ +public: + wxProtocol(); + +#if wxUSE_SOCKETS + bool Reconnect(); + virtual bool Connect( const wxString& WXUNUSED(host) ) { return FALSE; } + virtual bool Connect( wxSockAddress& addr, bool WXUNUSED(wait) = TRUE) { return wxSocketClient::Connect(addr); } + + // read a '\r\n' terminated line from the given socket and put it in + // result (without the terminators) + static wxProtocolError ReadLine(wxSocketBase *socket, wxString& result); + + // read a line from this socket - this one can be overridden in the + // derived classes if different line termination convention is to be used + virtual wxProtocolError ReadLine(wxString& result); +#endif // wxUSE_SOCKETS + + virtual bool Abort() = 0; + virtual wxInputStream *GetInputStream(const wxString& path) = 0; + virtual wxProtocolError GetError() = 0; + virtual wxString GetContentType() { return wxEmptyString; } + virtual void SetUser(const wxString& WXUNUSED(user)) {} + virtual void SetPassword(const wxString& WXUNUSED(passwd) ) {} + +private: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxProtocol) +}; + +#if wxUSE_SOCKETS +wxProtocolError WXDLLIMPEXP_NET GetLine(wxSocketBase *sock, wxString& result); +#endif + +// ---------------------------------------------------------------------------- +// macros for protocol classes +// ---------------------------------------------------------------------------- + +#define DECLARE_PROTOCOL(class) \ +public: \ + static wxProtoInfo g_proto_##class; + +#define IMPLEMENT_PROTOCOL(class, name, serv, host) \ +wxProtoInfo class::g_proto_##class(name, serv, host, CLASSINFO(class)); \ +bool wxProtocolUse##class = TRUE; + +#define USE_PROTOCOL(class) \ + extern bool wxProtocolUse##class ; \ + static struct wxProtocolUserFor##class \ + { \ + wxProtocolUserFor##class() { wxProtocolUse##class = TRUE; } \ + } wxProtocolDoUse##class; + +class WXDLLIMPEXP_NET wxProtoInfo : public wxObject +{ +public: + wxProtoInfo(const wxChar *name, + const wxChar *serv_name, + const bool need_host1, + wxClassInfo *info); + +protected: + wxProtoInfo *next; + wxString m_protoname; + wxString prefix; + wxString m_servname; + wxClassInfo *m_cinfo; + bool m_needhost; + + friend class wxURL; + + DECLARE_DYNAMIC_CLASS(wxProtoInfo) + DECLARE_NO_COPY_CLASS(wxProtoInfo) +}; + +#endif // wxUSE_PROTOCOL + +#endif // _WX_PROTOCOL_PROTOCOL_H diff --git a/Externals/wxWidgets/include/wx/ptr_scpd.h b/Externals/wxWidgets/include/wx/ptr_scpd.h new file mode 100644 index 0000000000..19c6588b7e --- /dev/null +++ b/Externals/wxWidgets/include/wx/ptr_scpd.h @@ -0,0 +1,222 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/ptr_scpd.h +// Purpose: scoped smart pointer class +// Author: Jesse Lovelace <jllovela@eos.ncsu.edu> +// Modified by: +// Created: 06/01/02 +// RCS-ID: $Id: ptr_scpd.h 35688 2005-09-25 19:59:19Z VZ $ +// Copyright: (c) Jesse Lovelace and original Boost authors (see below) +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// This class closely follows the implementation of the boost +// library scoped_ptr and is an adaption for c++ macro's in +// the wxWidgets project. The original authors of the boost +// scoped_ptr are given below with their respective copyrights. + +// (C) Copyright Greg Colvin and Beman Dawes 1998, 1999. +// Copyright (c) 2001, 2002 Peter Dimov +// +// Permission to copy, use, modify, sell and distribute this software +// is granted provided this copyright notice appears in all copies. +// This software is provided "as is" without express or implied +// warranty, and with no claim as to its suitability for any purpose. +// +// See http://www.boost.org/libs/smart_ptr/scoped_ptr.htm for documentation. +// + +#ifndef __WX_SCOPED_POINTER__ +#define __WX_SCOPED_POINTER__ + +#include "wx/defs.h" + +/* + checked deleters are used to make sure that the type being deleted is really + a complete type.: otherwise sizeof() would result in a compile-time error + + do { ... } while ( 0 ) construct is used to have an anonymous scope + (otherwise we could have name clashes between different "complete"s) but + still force a semicolon after the macro +*/ + +#ifdef __WATCOMC__ + #define wxFOR_ONCE(name) for(int name=0; name<1; name++) + #define wxPRE_NO_WARNING_SCOPE(name) wxFOR_ONCE(wxMAKE_UNIQUE_NAME(name)) + #define wxPOST_NO_WARNING_SCOPE(name) +#else + #define wxPRE_NO_WARNING_SCOPE(name) do + #define wxPOST_NO_WARNING_SCOPE(name) while ( wxFalse ) +#endif + +#define wxCHECKED_DELETE(ptr) \ + wxPRE_NO_WARNING_SCOPE(scope_var1) \ + { \ + typedef char complete[sizeof(*ptr)]; \ + delete ptr; \ + } wxPOST_NO_WARNING_SCOPE(scope_var1) + +#define wxCHECKED_DELETE_ARRAY(ptr) \ + wxPRE_NO_WARNING_SCOPE(scope_var2) \ + { \ + typedef char complete[sizeof(*ptr)]; \ + delete [] ptr; \ + } wxPOST_NO_WARNING_SCOPE(scope_var2) + +/* These scoped pointers are *not* assignable and cannot be used + within a container. Look for wxDECLARE_SHARED_PTR for this + functionality. + + In addition, the type being used *must* be complete at the time + that wxDEFINE_SCOPED_* is called or a compiler error will result. + This is because the class checks for the completeness of the type + being used. +*/ + + +#define wxDECLARE_SCOPED_PTR(T, name) \ +class name \ +{ \ +private: \ + T * m_ptr; \ + \ + name(name const &); \ + name & operator=(name const &); \ + \ +public: \ + wxEXPLICIT name(T * ptr = NULL) \ + : m_ptr(ptr) { } \ + \ + ~name(); \ + \ + void reset(T * ptr = NULL) \ + { \ + if (m_ptr != ptr) \ + { \ + delete m_ptr; \ + m_ptr = ptr; \ + } \ + } \ + \ + T *release() \ + { \ + T *ptr = m_ptr; \ + m_ptr = NULL; \ + return ptr; \ + } \ + \ + T & operator*() const \ + { \ + wxASSERT(m_ptr != NULL); \ + return *m_ptr; \ + } \ + \ + T * operator->() const \ + { \ + wxASSERT(m_ptr != NULL); \ + return m_ptr; \ + } \ + \ + T * get() const \ + { \ + return m_ptr; \ + } \ + \ + void swap(name & ot) \ + { \ + T * tmp = ot.m_ptr; \ + ot.m_ptr = m_ptr; \ + m_ptr = tmp; \ + } \ +}; + +#define wxDEFINE_SCOPED_PTR(T, name)\ +name::~name() \ +{ \ + wxCHECKED_DELETE(m_ptr); \ +} + +// this macro can be used for the most common case when you want to declare and +// define the scoped pointer at the same time and want to use the standard +// naming convention: auto pointer to Foo is called FooPtr +#define wxDEFINE_SCOPED_PTR_TYPE(T) \ + wxDECLARE_SCOPED_PTR(T, T ## Ptr) \ + wxDEFINE_SCOPED_PTR(T, T ## Ptr) + +// the same but for arrays instead of simple pointers +#define wxDECLARE_SCOPED_ARRAY(T, name)\ +class name \ +{ \ +private: \ + T * m_ptr; \ + name(name const &); \ + name & operator=(name const &); \ + \ +public: \ + wxEXPLICIT name(T * p = NULL) : m_ptr(p) \ + {} \ + \ + ~name(); \ + void reset(T * p = NULL); \ + \ + T & operator[](long int i) const\ + { \ + wxASSERT(m_ptr != NULL); \ + wxASSERT(i >= 0); \ + return m_ptr[i]; \ + } \ + \ + T * get() const \ + { \ + return m_ptr; \ + } \ + \ + void swap(name & ot) \ + { \ + T * tmp = ot.m_ptr; \ + ot.m_ptr = m_ptr; \ + m_ptr = tmp; \ + } \ +}; + +#define wxDEFINE_SCOPED_ARRAY(T, name) \ +name::~name() \ +{ \ + wxCHECKED_DELETE_ARRAY(m_ptr); \ +} \ +void name::reset(T * p){ \ + if (m_ptr != p) \ + { \ + wxCHECKED_DELETE_ARRAY(m_ptr); \ + m_ptr = p; \ + } \ +} + +// ---------------------------------------------------------------------------- +// "Tied" scoped pointer: same as normal one but also sets the value of +// some other variable to the pointer value +// ---------------------------------------------------------------------------- + +#define wxDEFINE_TIED_SCOPED_PTR_TYPE(T) \ + wxDEFINE_SCOPED_PTR_TYPE(T) \ + class T ## TiedPtr : public T ## Ptr \ + { \ + public: \ + T ## TiedPtr(T **pp, T *p) \ + : T ## Ptr(p), m_pp(pp) \ + { \ + m_pOld = *pp; \ + *pp = p; \ + } \ + \ + ~ T ## TiedPtr() \ + { \ + *m_pp = m_pOld; \ + } \ + \ + private: \ + T **m_pp; \ + T *m_pOld; \ + }; + +#endif // __WX_SCOPED_POINTER__ + diff --git a/Externals/wxWidgets/include/wx/quantize.h b/Externals/wxWidgets/include/wx/quantize.h new file mode 100644 index 0000000000..dd43f7a056 --- /dev/null +++ b/Externals/wxWidgets/include/wx/quantize.h @@ -0,0 +1,76 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/quantize.h +// Purpose: wxQuantizer class +// Author: Julian Smart +// Modified by: +// Created: 22/6/2000 +// RCS-ID: $Id: quantize.h 49804 2007-11-10 01:09:42Z VZ $ +// Copyright: (c) Julian Smart +// Licence: +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_QUANTIZE_H_ +#define _WX_QUANTIZE_H_ + +#include "wx/object.h" + +/* + * From jquant2.c + * + * Copyright (C) 1991-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + */ + +class WXDLLIMPEXP_FWD_CORE wxImage; +class WXDLLIMPEXP_FWD_CORE wxPalette; + +/* + * wxQuantize + * Based on the JPEG quantization code. Reduces the number of colours in a wxImage. + */ + +#define wxQUANTIZE_INCLUDE_WINDOWS_COLOURS 0x01 +#define wxQUANTIZE_RETURN_8BIT_DATA 0x02 +#define wxQUANTIZE_FILL_DESTINATION_IMAGE 0x04 + +class WXDLLEXPORT wxQuantize: public wxObject +{ +public: +DECLARE_DYNAMIC_CLASS(wxQuantize) + +//// Constructor + + wxQuantize() {} + virtual ~wxQuantize() {} + +//// Operations + + // Reduce the colours in the source image and put the result into the + // destination image. Both images may be the same, to overwrite the source image. + // Specify an optional palette pointer to receive the resulting palette. + // This palette may be passed to ConvertImageToBitmap, for example. + // If you pass a palette pointer, you must free the palette yourself. + + static bool Quantize(const wxImage& src, wxImage& dest, wxPalette** pPalette, int desiredNoColours = 236, + unsigned char** eightBitData = 0, int flags = wxQUANTIZE_INCLUDE_WINDOWS_COLOURS|wxQUANTIZE_FILL_DESTINATION_IMAGE|wxQUANTIZE_RETURN_8BIT_DATA); + + // This version sets a palette in the destination image so you don't + // have to manage it yourself. + + static bool Quantize(const wxImage& src, wxImage& dest, int desiredNoColours = 236, + unsigned char** eightBitData = 0, int flags = wxQUANTIZE_INCLUDE_WINDOWS_COLOURS|wxQUANTIZE_FILL_DESTINATION_IMAGE|wxQUANTIZE_RETURN_8BIT_DATA); + +//// Helpers + + // Converts input bitmap(s) into 8bit representation with custom palette + + // in_rows and out_rows are arrays [0..h-1] of pointer to rows + // (in_rows contains w * 3 bytes per row, out_rows w bytes per row) + // fills out_rows with indexes into palette (which is also stored into palette variable) + static void DoQuantize(unsigned w, unsigned h, unsigned char **in_rows, unsigned char **out_rows, unsigned char *palette, int desiredNoColours); + +}; + +#endif + // _WX_QUANTIZE_H_ diff --git a/Externals/wxWidgets/include/wx/radiobox.h b/Externals/wxWidgets/include/wx/radiobox.h new file mode 100644 index 0000000000..141a9cfad9 --- /dev/null +++ b/Externals/wxWidgets/include/wx/radiobox.h @@ -0,0 +1,180 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/radiobox.h +// Purpose: wxRadioBox declaration +// Author: Vadim Zeitlin +// Modified by: +// Created: 10.09.00 +// RCS-ID: $Id: radiobox.h 42862 2006-10-31 16:39:07Z VZ $ +// Copyright: (c) Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_RADIOBOX_H_BASE_ +#define _WX_RADIOBOX_H_BASE_ + +#if wxUSE_RADIOBOX + +#include "wx/ctrlsub.h" + +#if wxUSE_TOOLTIPS + +#include "wx/dynarray.h" + +class WXDLLEXPORT wxToolTip; + +WX_DEFINE_EXPORTED_ARRAY_PTR(wxToolTip *, wxToolTipArray); + +#endif // wxUSE_TOOLTIPS + +extern WXDLLEXPORT_DATA(const wxChar) wxRadioBoxNameStr[]; + +// ---------------------------------------------------------------------------- +// wxRadioBoxBase is not a normal base class, but rather a mix-in because the +// real wxRadioBox derives from different classes on different platforms: for +// example, it is a wxStaticBox in wxUniv and wxMSW but not in other ports +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxRadioBoxBase : public wxItemContainerImmutable +{ +public: + virtual ~wxRadioBoxBase(); + + // change/query the individual radio button state + virtual bool Enable(unsigned int n, bool enable = true) = 0; + virtual bool Show(unsigned int n, bool show = true) = 0; + virtual bool IsItemEnabled(unsigned int n) const = 0; + virtual bool IsItemShown(unsigned int n) const = 0; + + // return number of columns/rows in this radiobox + unsigned int GetColumnCount() const { return m_numCols; } + unsigned int GetRowCount() const { return m_numRows; } + + // return the item above/below/to the left/right of the given one + int GetNextItem(int item, wxDirection dir, long style) const; + +#if wxUSE_TOOLTIPS + // set the tooltip text for a radio item, empty string unsets any tooltip + void SetItemToolTip(unsigned int item, const wxString& text); + + // get the individual items tooltip; returns NULL if none + wxToolTip *GetItemToolTip(unsigned int item) const + { return m_itemsTooltips ? (*m_itemsTooltips)[item] : NULL; } +#endif // wxUSE_TOOLTIPS + +#if wxUSE_HELP + // set helptext for a particular item, pass an empty string to erase it + void SetItemHelpText(unsigned int n, const wxString& helpText); + + // retrieve helptext for a particular item, empty string means no help text + wxString GetItemHelpText(unsigned int n) const; +#else // wxUSE_HELP + // just silently ignore the help text, it's better than requiring using + // conditional compilation in all code using this function + void SetItemHelpText(unsigned int WXUNUSED(n), + const wxString& WXUNUSED(helpText)) + { + } +#endif // wxUSE_HELP + + // returns the radio item at the given position or wxNOT_FOUND if none + // (currently implemented only under MSW and GTK) + virtual int GetItemFromPoint(const wxPoint& WXUNUSED(pt)) const + { + return wxNOT_FOUND; + } + + + // deprecated functions + // -------------------- + +#if WXWIN_COMPATIBILITY_2_4 + wxDEPRECATED( int GetNumberOfRowsOrCols() const ); + wxDEPRECATED( void SetNumberOfRowsOrCols(int n) ); +#endif // WXWIN_COMPATIBILITY_2_4 + +protected: + wxRadioBoxBase() + { + m_numCols = + m_numRows = + m_majorDim = 0; + +#if wxUSE_TOOLTIPS + m_itemsTooltips = NULL; +#endif // wxUSE_TOOLTIPS + } + + // return the number of items in major direction (which depends on whether + // we have wxRA_SPECIFY_COLS or wxRA_SPECIFY_ROWS style) + unsigned int GetMajorDim() const { return m_majorDim; } + + // sets m_majorDim and also updates m_numCols/Rows + // + // the style parameter should be the style of the radiobox itself + void SetMajorDim(unsigned int majorDim, long style); + +#if wxUSE_TOOLTIPS + // called from SetItemToolTip() to really set the tooltip for the specified + // item in the box (or, if tooltip is NULL, to remove any existing one). + // + // NB: this function should really be pure virtual but to avoid breaking + // the build of the ports for which it's not implemented yet we provide + // an empty stub in the base class for now + virtual void DoSetItemToolTip(unsigned int item, wxToolTip *tooltip); + + // returns true if we have any item tooltips + bool HasItemToolTips() const { return m_itemsTooltips != NULL; } +#endif // wxUSE_TOOLTIPS + +#if wxUSE_HELP + // Retrieve help text for an item: this is a helper for the implementation + // of wxWindow::GetHelpTextAtPoint() in the real radiobox class + wxString DoGetHelpTextAtPoint(const wxWindow *derived, + const wxPoint& pt, + wxHelpEvent::Origin origin) const; +#endif // wxUSE_HELP + +private: + // the number of elements in major dimension (i.e. number of columns if + // wxRA_SPECIFY_COLS or the number of rows if wxRA_SPECIFY_ROWS) and also + // the number of rows/columns calculated from it + unsigned int m_majorDim, + m_numCols, + m_numRows; + +#if wxUSE_TOOLTIPS + // array of tooltips for the individual items + // + // this array is initially NULL and initialized on first use + wxToolTipArray *m_itemsTooltips; +#endif + +#if wxUSE_HELP + // help text associated with a particular item or empty string if none + wxArrayString m_itemsHelpTexts; +#endif // wxUSE_HELP +}; + +#if defined(__WXUNIVERSAL__) + #include "wx/univ/radiobox.h" +#elif defined(__WXMSW__) + #include "wx/msw/radiobox.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/radiobox.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/radiobox.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/radiobox.h" +#elif defined(__WXMAC__) + #include "wx/mac/radiobox.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/radiobox.h" +#elif defined(__WXPM__) + #include "wx/os2/radiobox.h" +#elif defined(__WXPALMOS__) + #include "wx/palmos/radiobox.h" +#endif + +#endif // wxUSE_RADIOBOX + +#endif // _WX_RADIOBOX_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/radiobut.h b/Externals/wxWidgets/include/wx/radiobut.h new file mode 100644 index 0000000000..2543ea8dc8 --- /dev/null +++ b/Externals/wxWidgets/include/wx/radiobut.h @@ -0,0 +1,61 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/radiobut.h +// Purpose: wxRadioButton declaration +// Author: Vadim Zeitlin +// Modified by: +// Created: 07.09.00 +// RCS-ID: $Id: radiobut.h 37066 2006-01-23 03:27:34Z MR $ +// Copyright: (c) Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_RADIOBUT_H_BASE_ +#define _WX_RADIOBUT_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_RADIOBTN + +/* + There is no wxRadioButtonBase class as wxRadioButton interface is the same + as wxCheckBox(Base), but under some platforms wxRadioButton really + derives from wxCheckBox and on the others it doesn't. + + The pseudo-declaration of wxRadioButtonBase would look like this: + + class wxRadioButtonBase : public ... + { + public: + virtual void SetValue(bool value); + virtual bool GetValue() const; + }; + */ + +#include "wx/control.h" + +extern WXDLLEXPORT_DATA(const wxChar) wxRadioButtonNameStr[]; + +#if defined(__WXUNIVERSAL__) + #include "wx/univ/radiobut.h" +#elif defined(__WXMSW__) + #include "wx/msw/radiobut.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/radiobut.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/radiobut.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/radiobut.h" +#elif defined(__WXMAC__) + #include "wx/mac/radiobut.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/radiobut.h" +#elif defined(__WXPM__) + #include "wx/os2/radiobut.h" +#elif defined(__WXPALMOS__) + #include "wx/palmos/radiobut.h" +#endif + +#endif // wxUSE_RADIOBTN + +#endif + // _WX_RADIOBUT_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/rawbmp.h b/Externals/wxWidgets/include/wx/rawbmp.h new file mode 100644 index 0000000000..c46028526f --- /dev/null +++ b/Externals/wxWidgets/include/wx/rawbmp.h @@ -0,0 +1,713 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/rawbmp.h +// Purpose: macros for fast, raw bitmap data access +// Author: Eric Kidd, Vadim Zeitlin +// Modified by: +// Created: 10.03.03 +// RCS-ID: $Id: rawbmp.h 41661 2006-10-06 16:34:45Z PC $ +// Copyright: (c) 2002 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_RAWBMP_H_BASE_ +#define _WX_RAWBMP_H_BASE_ + +#include "wx/image.h" + +// ---------------------------------------------------------------------------- +// Abstract Pixel API +// +// We need to access our raw bitmap data (1) portably and (2) efficiently. +// We do this using a two-dimensional "iteration" interface. Performance +// is extremely important here: these functions will be called hundreds +// of thousands of times in a row, and even small inefficiencies will +// make applications seem slow. +// +// We can't always rely on inline functions, because not all compilers actually +// bother to inline them unless we crank the optimization levels way up. +// Therefore, we also provide macros to wring maximum speed out of compiler +// unconditionally (e.g. even in debug builds). Of course, if the performance +// isn't absolutely crucial for you you shouldn't be using them but the inline +// functions instead. +// ---------------------------------------------------------------------------- + +/* + Usage example: + + typedef wxPixelData<wxBitmap, wxNativePixelFormat> PixelData; + + wxBitmap bmp; + PixelData data(bmp); + if ( !data ) + { + ... raw access to bitmap data unavailable, do something else ... + return; + } + + if ( data.GetWidth() < 20 || data.GetHeight() < 20 ) + { + ... complain: the bitmap it too small ... + return; + } + + PixelData::Iterator p(data); + + // we draw a (10, 10)-(20, 20) rect manually using the given r, g, b + p.Offset(data, 10, 10); + + for ( int y = 0; y < 10; ++y ) + { + PixelData::Iterator rowStart = p; + + for ( int x = 0; x < 10; ++x, ++p ) + { + p.Red() = r; + p.Green() = g; + p.Blue() = b; + } + + p = rowStart; + p.OffsetY(data, 1); + } + */ + +/* + Note: we do not use WXDLLEXPORT with classes in this file because VC++ has + problems with exporting inner class defined inside a specialization of a + template class from a DLL. Besides, as all the methods are inline it's not + really necessary to put them in DLL at all. + */ + +// ---------------------------------------------------------------------------- +// wxPixelFormat +// ---------------------------------------------------------------------------- + +/* + wxPixelFormat is a template class describing the bitmap data format. It + contains the constants describing the format of pixel data, but does not + describe how the entire bitmap is stored (i.e. top-to-bottom, + bottom-to-top, ...). It is also a "traits"-like class, i.e. it only + contains some constants and maybe static methods but nothing more, so it + can be safely used without incurring any overhead as all accesses to it are + done at compile-time. + + Current limitations: we don't support RAGABA and ARAGAB formats supported + by Mac OS X. If there is sufficient interest, these classes could be + extended to deal with them. Neither do we support alpha channel having + different representation from the RGB ones (happens under QNX/Photon I + think), but again this could be achieved with some small extra effort. + + Template parameters are: + - type of a single pixel component + - size of the single pixel in bits + - indices of red, green and blue pixel components inside the pixel + - index of the alpha component or -1 if none + - type which can contain the full pixel value (all channels) + */ + +template <class Channel, + size_t Bpp, int R, int G, int B, int A = -1, + class Pixel = wxUint32> + +struct wxPixelFormat +{ + // iterator over pixels is usually of type "ChannelType *" + typedef Channel ChannelType; + + // the type which may hold the entire pixel value + typedef Pixel PixelType; + + // NB: using static ints initialized inside the class declaration is not + // portable as it doesn't work with VC++ 6, so we must use enums + + // size of one pixel in bits + enum { BitsPerPixel = Bpp }; + + // size of one pixel in ChannelType units (usually bytes) + enum { SizePixel = Bpp / (8 * sizeof(Channel)) }; + + // the channels indices inside the pixel + enum + { + RED = R, + GREEN = G, + BLUE = B, + ALPHA = A + }; + + // true if we have an alpha channel (together with the other channels, this + // doesn't cover the case of wxImage which stores alpha separately) + enum { HasAlpha = A != -1 }; +}; + +// some "predefined" pixel formats +// ------------------------------- + +// wxImage format is common to all platforms +typedef wxPixelFormat<unsigned char, 24, 0, 1, 2> wxImagePixelFormat; + +// the (most common) native bitmap format without alpha support +#if defined(__WXMSW__) + // under MSW the RGB components are reversed, they're in BGR order + typedef wxPixelFormat<unsigned char, 24, 2, 1, 0> wxNativePixelFormat; + + #define wxPIXEL_FORMAT_ALPHA 3 +#elif defined(__WXMAC__) + // under Mac, first component is unused but still present, hence we use + // 32bpp, not 24 + typedef wxPixelFormat<unsigned char, 32, 1, 2, 3> wxNativePixelFormat; + + #define wxPIXEL_FORMAT_ALPHA 0 +#elif defined(__WXCOCOA__) + // Cocoa is standard RGB or RGBA (normally it is RGBA) + typedef wxPixelFormat<unsigned char, 24, 0, 1, 2> wxNativePixelFormat; + + #define wxPIXEL_FORMAT_ALPHA 3 +#elif defined(__WXGTK__) + // Under GTK+ 2.X we use GdkPixbuf, which is standard RGB or RGBA + typedef wxPixelFormat<unsigned char, 24, 0, 1, 2> wxNativePixelFormat; + + #define wxPIXEL_FORMAT_ALPHA 3 +#endif + +// the (most common) native format for bitmaps with alpha channel +#ifdef wxPIXEL_FORMAT_ALPHA + typedef wxPixelFormat<unsigned char, 32, + wxNativePixelFormat::RED, + wxNativePixelFormat::GREEN, + wxNativePixelFormat::BLUE, + wxPIXEL_FORMAT_ALPHA> wxAlphaPixelFormat; +#endif // wxPIXEL_FORMAT_ALPHA + +// we also define the (default/best) pixel format for the given class: this is +// used as default value for the pixel format in wxPixelIterator template +template <class T> struct wxPixelFormatFor; + +#if wxUSE_IMAGE +// wxPixelFormatFor is only defined for wxImage, attempt to use it with other +// classes (wxBitmap...) will result in compile errors which is exactly what we +// want +template <> +struct wxPixelFormatFor<wxImage> +{ + typedef wxImagePixelFormat Format; +}; +#endif //wxUSE_IMAGE + +// ---------------------------------------------------------------------------- +// wxPixelData +// ---------------------------------------------------------------------------- + +/* + wxPixelDataBase is just a helper for wxPixelData: it contains things common + to both wxImage and wxBitmap specializations. + */ +class wxPixelDataBase +{ +public: + // origin of the rectangular region we represent + wxPoint GetOrigin() const { return m_ptOrigin; } + + // width and height of the region we represent + int GetWidth() const { return m_width; } + int GetHeight() const { return m_height; } + + wxSize GetSize() const { return wxSize(m_width, m_height); } + + // the distance between two rows + int GetRowStride() const { return m_stride; } + +// private: -- see comment in the beginning of the file + + // the origin of this image inside the bigger bitmap (usually (0, 0)) + wxPoint m_ptOrigin; + + // the size of the image we address, in pixels + int m_width, + m_height; + + // this parameter is the offset of the start of the (N+1)st row from the + // Nth one and can be different from m_bypp*width in some cases: + // a) the most usual one is to force 32/64 bit alignment of rows + // b) another one is for bottom-to-top images where it's negative + // c) finally, it could conceivably be 0 for the images with all + // lines being identical + int m_stride; + +protected: + // ctor is protected because this class is only meant to be used as the + // base class by wxPixelData + wxPixelDataBase() + { + m_width = + m_height = + m_stride = 0; + } +}; + +/* + wxPixelData represents the entire bitmap data, i.e. unlike + wxPixelFormat (which it uses) it also stores the global bitmap + characteristics such as its size, inter-row separation and so on. + + Because of this it can be used to move the pixel iterators (which don't + have enough information about the bitmap themselves). This may seem a bit + unnatural but must be done in this way to keep the iterator objects as + small as possible for maximum efficiency as otherwise they wouldn't be put + into the CPU registers by the compiler any more. + + Implementation note: we use the standard workaround for lack of partial + template specialization support in VC (both 6 and 7): instead of partly + specializing the class Foo<T, U> for some T we introduce FooOut<T> and + FooIn<U> nested in it, make Foo<T, U> equivalent to FooOut<T>::FooIn<U> and + fully specialize FooOut. + + Also note that this class doesn't have any default definition because we + can't really do anything without knowing the exact image class. We do + provide wxPixelDataBase to make it simpler to write new wxPixelData + specializations. + */ + +// we need to define this skeleton template to mollify VC++ +template <class Image> +struct wxPixelDataOut +{ + template <class PixelFormat> + class wxPixelDataIn + { + public: + class Iterator { }; + }; +}; + +#if wxUSE_IMAGE +// wxPixelData specialization for wxImage: this is the simplest case as we +// don't have to care about different pixel formats here +template <> +struct wxPixelDataOut<wxImage> +{ + // NB: this is a template class even though it doesn't use its template + // parameter because otherwise wxPixelData couldn't compile + template <class dummyPixelFormat> + class wxPixelDataIn : public wxPixelDataBase + { + public: + // the type of the class we're working with + typedef wxImage ImageType; + + // the iterator which should be used for working with data in this + // format + class Iterator + { + public: + // the pixel format we use + typedef wxImagePixelFormat PixelFormat; + + // the type of the pixel components + typedef typename dummyPixelFormat::ChannelType ChannelType; + + // the pixel data we're working with + typedef + wxPixelDataOut<wxImage>::wxPixelDataIn<PixelFormat> PixelData; + + // go back to (0, 0) + void Reset(const PixelData& data) + { + *this = data.GetPixels(); + } + + // creates the iterator pointing to the beginning of data + Iterator(PixelData& data) + { + Reset(data); + } + + // creates the iterator initially pointing to the image origin + Iterator(const wxImage& image) + { + m_pRGB = image.GetData(); + + if ( image.HasAlpha() ) + { + m_pAlpha = image.GetAlpha(); + } + else // alpha is not used at all + { + m_pAlpha = NULL; + } + } + + // true if the iterator is valid + bool IsOk() const { return m_pRGB != NULL; } + + + // navigation + // ---------- + + // advance the iterator to the next pixel, prefix version + Iterator& operator++() + { + m_pRGB += PixelFormat::SizePixel; + if ( m_pAlpha ) + ++m_pAlpha; + + return *this; + } + + // postfix (hence less efficient -- don't use it unless you + // absolutely must) version + Iterator operator++(int) + { + Iterator p(*this); + ++*this; + return p; + } + + // move x pixels to the right and y down + // + // note that the rows don't wrap! + void Offset(const PixelData& data, int x, int y) + { + m_pRGB += data.GetRowStride()*y + PixelFormat::SizePixel*x; + if ( m_pAlpha ) + m_pAlpha += data.GetWidth() + x; + } + + // move x pixels to the right (again, no row wrapping) + void OffsetX(const PixelData& WXUNUSED(data), int x) + { + m_pRGB += PixelFormat::SizePixel*x; + if ( m_pAlpha ) + m_pAlpha += x; + } + + // move y rows to the bottom + void OffsetY(const PixelData& data, int y) + { + m_pRGB += data.GetRowStride()*y; + if ( m_pAlpha ) + m_pAlpha += data.GetWidth(); + } + + // go to the given position + void MoveTo(const PixelData& data, int x, int y) + { + Reset(data); + Offset(data, x, y); + } + + + // data access + // ----------- + + // access to invidividual colour components + ChannelType& Red() { return m_pRGB[PixelFormat::RED]; } + ChannelType& Green() { return m_pRGB[PixelFormat::GREEN]; } + ChannelType& Blue() { return m_pRGB[PixelFormat::BLUE]; } + ChannelType& Alpha() { return *m_pAlpha; } + + // private: -- see comment in the beginning of the file + + // pointer into RGB buffer + unsigned char *m_pRGB; + + // pointer into alpha buffer or NULL if alpha isn't used + unsigned char *m_pAlpha; + }; + + // initializes us with the data of the given image + wxPixelDataIn(ImageType& image) : m_image(image), m_pixels(image) + { + m_width = image.GetWidth(); + m_height = image.GetHeight(); + m_stride = Iterator::SizePixel * m_width; + } + + // initializes us with the given region of the specified image + wxPixelDataIn(ImageType& image, + const wxPoint& pt, + const wxSize& sz) : m_image(image), m_pixels(image) + { + m_stride = Iterator::SizePixel * m_width; + + InitRect(pt, sz); + } + + // initializes us with the given region of the specified image + wxPixelDataIn(ImageType& image, + const wxRect& rect) : m_image(image), m_pixels(image) + { + m_stride = Iterator::SizePixel * m_width; + + InitRect(rect.GetPosition(), rect.GetSize()); + } + + // we evaluate to true only if we could get access to bitmap data + // successfully + operator bool() const { return m_pixels.IsOk(); } + + // get the iterator pointing to the origin + Iterator GetPixels() const { return m_pixels; } + + private: + void InitRect(const wxPoint& pt, const wxSize& sz) + { + m_width = sz.x; + m_height = sz.y; + + m_ptOrigin = pt; + m_pixels.Offset(*this, pt.x, pt.y); + } + + // the image we're working with + ImageType& m_image; + + // the iterator pointing to the image origin + Iterator m_pixels; + }; +}; +#endif //wxUSE_IMAGE + +#if wxUSE_GUI +// wxPixelData specialization for wxBitmap: here things are more interesting as +// we also have to support different pixel formats +template <> +struct wxPixelDataOut<wxBitmap> +{ + template <class Format> + class wxPixelDataIn : public wxPixelDataBase + { + public: + // the type of the class we're working with + typedef wxBitmap ImageType; + + class Iterator + { + public: + // the pixel format we use + typedef Format PixelFormat; + + // the type of the pixel components + typedef typename PixelFormat::ChannelType ChannelType; + + // the pixel data we're working with + typedef wxPixelDataOut<wxBitmap>::wxPixelDataIn<Format> PixelData; + + + // go back to (0, 0) + void Reset(const PixelData& data) + { + *this = data.GetPixels(); + } + + // initializes the iterator to point to the origin of the given + // pixel data + Iterator(PixelData& data) + { + Reset(data); + } + + // initializes the iterator to point to the origin of the given + // bitmap + Iterator(wxBitmap& bmp, PixelData& data) + { + // using cast here is ugly but it should be safe as + // GetRawData() real return type should be consistent with + // BitsPerPixel (which is in turn defined by ChannelType) and + // this is the only thing we can do without making GetRawData() + // a template function which is undesirable + m_ptr = (ChannelType *) + bmp.GetRawData(data, PixelFormat::BitsPerPixel); + } + + // default constructor + Iterator() + { + m_ptr = NULL; + } + + // return true if this iterator is valid + bool IsOk() const { return m_ptr != NULL; } + + + // navigation + // ---------- + + // advance the iterator to the next pixel, prefix version + Iterator& operator++() + { + m_ptr += PixelFormat::SizePixel; + + return *this; + } + + // postfix (hence less efficient -- don't use it unless you + // absolutely must) version + Iterator operator++(int) + { + Iterator p(*this); + ++*this; + return p; + } + + // move x pixels to the right and y down + // + // note that the rows don't wrap! + void Offset(const PixelData& data, int x, int y) + { + m_ptr += data.GetRowStride()*y + PixelFormat::SizePixel*x; + } + + // move x pixels to the right (again, no row wrapping) + void OffsetX(const PixelData& WXUNUSED(data), int x) + { + m_ptr += PixelFormat::SizePixel*x; + } + + // move y rows to the bottom + void OffsetY(const PixelData& data, int y) + { + m_ptr += data.GetRowStride()*y; + } + + // go to the given position + void MoveTo(const PixelData& data, int x, int y) + { + Reset(data); + Offset(data, x, y); + } + + + // data access + // ----------- + + // access to invidividual colour components + ChannelType& Red() { return m_ptr[PixelFormat::RED]; } + ChannelType& Green() { return m_ptr[PixelFormat::GREEN]; } + ChannelType& Blue() { return m_ptr[PixelFormat::BLUE]; } + ChannelType& Alpha() { return m_ptr[PixelFormat::ALPHA]; } + + // address the pixel contents directly + // + // warning: the format is platform dependent + typename PixelFormat::PixelType& Data() + { return *(typename PixelFormat::PixelType *)m_ptr; } + + // private: -- see comment in the beginning of the file + + // for efficiency reasons this class should not have any other + // fields, otherwise it won't be put into a CPU register (as it + // should inside the inner loops) by some compilers, notably gcc + ChannelType *m_ptr; + }; + + // ctor associates this pointer with a bitmap and locks the bitmap for + // raw access, it will be unlocked only by our dtor and so these + // objects should normally be only created on the stack, i.e. have + // limited life-time + wxPixelDataIn(wxBitmap& bmp) : m_bmp(bmp), m_pixels(bmp, *this) + { + } + + wxPixelDataIn(wxBitmap& bmp, const wxRect& rect) + : m_bmp(bmp), m_pixels(bmp, *this) + { + InitRect(rect.GetPosition(), rect.GetSize()); + } + + wxPixelDataIn(wxBitmap& bmp, const wxPoint& pt, const wxSize& sz) + : m_bmp(bmp), m_pixels(bmp, *this) + { + InitRect(pt, sz); + } + + // we evaluate to true only if we could get access to bitmap data + // successfully + operator bool() const { return m_pixels.IsOk(); } + + // get the iterator pointing to the origin + Iterator GetPixels() const { return m_pixels; } + + // dtor unlocks the bitmap + ~wxPixelDataIn() + { + m_bmp.UngetRawData(*this); + } + + // call this to indicate that we should use the alpha channel + void UseAlpha() { m_bmp.UseAlpha(); } + + // private: -- see comment in the beginning of the file + + // the bitmap we're associated with + wxBitmap m_bmp; + + // the iterator pointing to the image origin + Iterator m_pixels; + + private: + void InitRect(const wxPoint& pt, const wxSize& sz) + { + m_pixels.Offset(*this, pt.x, pt.y); + + m_ptOrigin = pt; + m_width = sz.x; + m_height = sz.y; + } + }; +}; +#endif //wxUSE_GUI + +template <class Image, class PixelFormat = wxPixelFormatFor<Image> > +class wxPixelData : + public wxPixelDataOut<Image>::template wxPixelDataIn<PixelFormat> +{ +public: + typedef + typename wxPixelDataOut<Image>::template wxPixelDataIn<PixelFormat> + Base; + + wxPixelData(Image& image) : Base(image) { } + + wxPixelData(Image& i, const wxRect& rect) : Base(i, rect) { } + + wxPixelData(Image& i, const wxPoint& pt, const wxSize& sz) + : Base(i, pt, sz) + { + } +}; + + +// some "predefined" pixel data classes +#if wxUSE_IMAGE +typedef wxPixelData<wxImage> wxImagePixelData; +#endif //wxUSE_IMAGE +#if wxUSE_GUI +typedef wxPixelData<wxBitmap, wxNativePixelFormat> wxNativePixelData; +typedef wxPixelData<wxBitmap, wxAlphaPixelFormat> wxAlphaPixelData; + +#endif //wxUSE_GUI + +// ---------------------------------------------------------------------------- +// wxPixelIterator +// ---------------------------------------------------------------------------- + +/* + wxPixel::Iterator represents something which points to the pixel data and + allows us to iterate over it. In the simplest case of wxBitmap it is, + indeed, just a pointer, but it can be something more complicated and, + moreover, you are free to specialize it for other image classes and bitmap + formats. + + Note that although it would have been much more intuitive to have a real + class here instead of what we have now, this class would need two template + parameters, and this can't be done because we'd need compiler support for + partial template specialization then and neither VC6 nor VC7 provide it. + */ +template < class Image, class PixelFormat = wxPixelFormatFor<Image> > +struct wxPixelIterator : public wxPixelData<Image, PixelFormat>::Iterator +{ +}; + +#endif // _WX_RAWBMP_H_BASE_ + diff --git a/Externals/wxWidgets/include/wx/recguard.h b/Externals/wxWidgets/include/wx/recguard.h new file mode 100644 index 0000000000..fb206b823d --- /dev/null +++ b/Externals/wxWidgets/include/wx/recguard.h @@ -0,0 +1,53 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/recguard.h +// Purpose: declaration and implementation of wxRecursionGuard class +// Author: Vadim Zeitlin +// Modified by: +// Created: 14.08.2003 +// RCS-ID: $Id: recguard.h 29243 2004-09-21 18:15:59Z ABX $ +// Copyright: (c) 2003 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_RECGUARD_H_ +#define _WX_RECGUARD_H_ + +#include "wx/defs.h" + +// ---------------------------------------------------------------------------- +// wxRecursionGuardFlag is used with wxRecursionGuard +// ---------------------------------------------------------------------------- + +typedef int wxRecursionGuardFlag; + +// ---------------------------------------------------------------------------- +// wxRecursionGuard is the simplest way to protect a function from reentrancy +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxRecursionGuard +{ +public: + wxRecursionGuard(wxRecursionGuardFlag& flag) + : m_flag(flag) + { + m_isInside = flag++ != 0; + } + + ~wxRecursionGuard() + { + wxASSERT_MSG( m_flag > 0, _T("unbalanced wxRecursionGuards!?") ); + + m_flag--; + } + + bool IsInside() const { return m_isInside; } + +private: + wxRecursionGuardFlag& m_flag; + + // true if the flag had been already set when we were created + bool m_isInside; +}; + +#endif // _WX_RECGUARD_H_ + diff --git a/Externals/wxWidgets/include/wx/regex.h b/Externals/wxWidgets/include/wx/regex.h new file mode 100644 index 0000000000..87650fad87 --- /dev/null +++ b/Externals/wxWidgets/include/wx/regex.h @@ -0,0 +1,166 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/regex.h +// Purpose: regular expression matching +// Author: Karsten Ballüder +// Modified by: VZ at 13.07.01 (integrated to wxWin) +// Created: 05.02.2000 +// RCS-ID: $Id: regex.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) 2000 Karsten Ballüder <ballueder@gmx.net> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_REGEX_H_ +#define _WX_REGEX_H_ + +#include "wx/defs.h" + +#if wxUSE_REGEX + +class WXDLLIMPEXP_FWD_BASE wxString; + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// flags for regex compilation: these can be used with Compile() +enum +{ + // use extended regex syntax + wxRE_EXTENDED = 0, + + // use advanced RE syntax (built-in regex only) +#ifdef wxHAS_REGEX_ADVANCED + wxRE_ADVANCED = 1, +#endif + + // use basic RE syntax + wxRE_BASIC = 2, + + // ignore case in match + wxRE_ICASE = 4, + + // only check match, don't set back references + wxRE_NOSUB = 8, + + // if not set, treat '\n' as an ordinary character, otherwise it is + // special: it is not matched by '.' and '^' and '$' always match + // after/before it regardless of the setting of wxRE_NOT[BE]OL + wxRE_NEWLINE = 16, + + // default flags + wxRE_DEFAULT = wxRE_EXTENDED +}; + +// flags for regex matching: these can be used with Matches() +// +// these flags are mainly useful when doing several matches in a long string, +// they can be used to prevent erroneous matches for '^' and '$' +enum +{ + // '^' doesn't match at the start of line + wxRE_NOTBOL = 32, + + // '$' doesn't match at the end of line + wxRE_NOTEOL = 64 +}; + +// ---------------------------------------------------------------------------- +// wxRegEx: a regular expression +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxRegExImpl; + +class WXDLLIMPEXP_BASE wxRegEx +{ +public: + // default ctor: use Compile() later + wxRegEx() { Init(); } + + // create and compile + wxRegEx(const wxString& expr, int flags = wxRE_DEFAULT) + { + Init(); + (void)Compile(expr, flags); + } + + // return true if this is a valid compiled regular expression + bool IsValid() const { return m_impl != NULL; } + + // compile the string into regular expression, return true if ok or false + // if string has a syntax error + bool Compile(const wxString& pattern, int flags = wxRE_DEFAULT); + + // matches the precompiled regular expression against a string, return + // true if matches and false otherwise + // + // flags may be combination of wxRE_NOTBOL and wxRE_NOTEOL + // len may be the length of text (ignored by most system regex libs) + // + // may only be called after successful call to Compile() + bool Matches(const wxChar *text, int flags = 0) const; + bool Matches(const wxChar *text, int flags, size_t len) const; + bool Matches(const wxString& text, int flags = 0) const + { return Matches(text.c_str(), flags, text.length()); } + + // get the start index and the length of the match of the expression + // (index 0) or a bracketed subexpression (index != 0) + // + // may only be called after successful call to Matches() + // + // return false if no match or on error + bool GetMatch(size_t *start, size_t *len, size_t index = 0) const; + + // return the part of string corresponding to the match, empty string is + // returned if match failed + // + // may only be called after successful call to Matches() + wxString GetMatch(const wxString& text, size_t index = 0) const; + + // return the size of the array of matches, i.e. the number of bracketed + // subexpressions plus one for the expression itself, or 0 on error. + // + // may only be called after successful call to Compile() + size_t GetMatchCount() const; + + // replaces the current regular expression in the string pointed to by + // pattern, with the text in replacement and return number of matches + // replaced (maybe 0 if none found) or -1 on error + // + // the replacement text may contain backreferences (\number) which will be + // replaced with the value of the corresponding subexpression in the + // pattern match + // + // maxMatches may be used to limit the number of replacements made, setting + // it to 1, for example, will only replace first occurence (if any) of the + // pattern in the text while default value of 0 means replace all + int Replace(wxString *text, const wxString& replacement, + size_t maxMatches = 0) const; + + // replace the first occurence + int ReplaceFirst(wxString *text, const wxString& replacement) const + { return Replace(text, replacement, 1); } + + // replace all occurences: this is actually a synonym for Replace() + int ReplaceAll(wxString *text, const wxString& replacement) const + { return Replace(text, replacement, 0); } + + // dtor not virtual, don't derive from this class + ~wxRegEx(); + +private: + // common part of all ctors + void Init(); + + // the real guts of this class + wxRegExImpl *m_impl; + + // as long as the class wxRegExImpl is not ref-counted, + // instances of the handle wxRegEx must not be copied. + wxRegEx(const wxRegEx&); + wxRegEx &operator=(const wxRegEx&); +}; + +#endif // wxUSE_REGEX + +#endif // _WX_REGEX_H_ + diff --git a/Externals/wxWidgets/include/wx/region.h b/Externals/wxWidgets/include/wx/region.h new file mode 100644 index 0000000000..2bbaed5e00 --- /dev/null +++ b/Externals/wxWidgets/include/wx/region.h @@ -0,0 +1,300 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/region.h +// Purpose: Base header for wxRegion +// Author: Julian Smart +// Modified by: +// Created: +// RCS-ID: $Id: region.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_REGION_H_BASE_ +#define _WX_REGION_H_BASE_ + +#include "wx/gdiobj.h" +#include "wx/gdicmn.h" + +class WXDLLIMPEXP_FWD_CORE wxBitmap; +class WXDLLIMPEXP_FWD_CORE wxColour; +class WXDLLIMPEXP_FWD_CORE wxRegion; + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// result of wxRegion::Contains() call +enum wxRegionContain +{ + wxOutRegion = 0, + wxPartRegion = 1, + wxInRegion = 2 +}; + +// these constants are used with wxRegion::Combine() in the ports which have +// this method +enum wxRegionOp +{ + // Creates the intersection of the two combined regions. + wxRGN_AND, + + // Creates a copy of the region + wxRGN_COPY, + + // Combines the parts of first region that are not in the second one + wxRGN_DIFF, + + // Creates the union of two combined regions. + wxRGN_OR, + + // Creates the union of two regions except for any overlapping areas. + wxRGN_XOR +}; + +// ---------------------------------------------------------------------------- +// wxRegionBase defines wxRegion API +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxRegionBase : public wxGDIObject +{ +public: + // ctors + // ----- + + // none are defined here but the following should be available: +#if 0 + wxRegion(); + wxRegion(wxCoord x, wxCoord y, wxCoord w, wxCoord h); + wxRegion(const wxPoint& topLeft, const wxPoint& bottomRight); + wxRegion(const wxRect& rect); + wxRegion(size_t n, const wxPoint *points, int fillStyle = wxODDEVEN_RULE); + wxRegion(const wxBitmap& bmp); + wxRegion(const wxBitmap& bmp, const wxColour& transp, int tolerance = 0); +#endif // 0 + + // operators + // --------- + + bool operator==(const wxRegion& region) const { return IsEqual(region); } + bool operator!=(const wxRegion& region) const { return !(*this == region); } + + + // accessors + // --------- + + bool Ok() const { return IsOk(); } + bool IsOk() const { return m_refData != NULL; } + + // Is region empty? + virtual bool IsEmpty() const = 0; + bool Empty() const { return IsEmpty(); } + + // Is region equal (i.e. covers the same area as another one)? + bool IsEqual(const wxRegion& region) const; + + // Get the bounding box + bool GetBox(wxCoord& x, wxCoord& y, wxCoord& w, wxCoord& h) const + { return DoGetBox(x, y, w, h); } + wxRect GetBox() const + { + wxCoord x, y, w, h; + return DoGetBox(x, y, w, h) ? wxRect(x, y, w, h) : wxRect(); + } + + // Test if the given point or rectangle is inside this region + wxRegionContain Contains(wxCoord x, wxCoord y) const + { return DoContainsPoint(x, y); } + wxRegionContain Contains(const wxPoint& pt) const + { return DoContainsPoint(pt.x, pt.y); } + wxRegionContain Contains(wxCoord x, wxCoord y, wxCoord w, wxCoord h) const + { return DoContainsRect(wxRect(x, y, w, h)); } + wxRegionContain Contains(const wxRect& rect) const + { return DoContainsRect(rect); } + + + // operations + // ---------- + + virtual void Clear() = 0; + + // Move the region + bool Offset(wxCoord x, wxCoord y) + { return DoOffset(x, y); } + bool Offset(const wxPoint& pt) + { return DoOffset(pt.x, pt.y); } + + // Union rectangle or region with this region. + bool Union(wxCoord x, wxCoord y, wxCoord w, wxCoord h) + { return DoUnionWithRect(wxRect(x, y, w, h)); } + bool Union(const wxRect& rect) + { return DoUnionWithRect(rect); } + bool Union(const wxRegion& region) + { return DoUnionWithRegion(region); } + +#if wxUSE_IMAGE + // Use the non-transparent pixels of a wxBitmap for the region to combine + // with this region. First version takes transparency from bitmap's mask, + // second lets the user specify the colour to be treated as transparent + // along with an optional tolerance value. + // NOTE: implemented in common/rgncmn.cpp + bool Union(const wxBitmap& bmp); + bool Union(const wxBitmap& bmp, const wxColour& transp, int tolerance = 0); +#endif // wxUSE_IMAGE + + // Intersect rectangle or region with this one. + bool Intersect(wxCoord x, wxCoord y, wxCoord w, wxCoord h); + bool Intersect(const wxRect& rect); + bool Intersect(const wxRegion& region) + { return DoIntersect(region); } + + // Subtract rectangle or region from this: + // Combines the parts of 'this' that are not part of the second region. + bool Subtract(wxCoord x, wxCoord y, wxCoord w, wxCoord h); + bool Subtract(const wxRect& rect); + bool Subtract(const wxRegion& region) + { return DoSubtract(region); } + + // XOR: the union of two combined regions except for any overlapping areas. + bool Xor(wxCoord x, wxCoord y, wxCoord w, wxCoord h); + bool Xor(const wxRect& rect); + bool Xor(const wxRegion& region) + { return DoXor(region); } + + + // Convert the region to a B&W bitmap with the white pixels being inside + // the region. + wxBitmap ConvertToBitmap() const; + +protected: + virtual bool DoIsEqual(const wxRegion& region) const = 0; + virtual bool DoGetBox(wxCoord& x, wxCoord& y, wxCoord& w, wxCoord& h) const = 0; + virtual wxRegionContain DoContainsPoint(wxCoord x, wxCoord y) const = 0; + virtual wxRegionContain DoContainsRect(const wxRect& rect) const = 0; + + virtual bool DoOffset(wxCoord x, wxCoord y) = 0; + + virtual bool DoUnionWithRect(const wxRect& rect) = 0; + virtual bool DoUnionWithRegion(const wxRegion& region) = 0; + + virtual bool DoIntersect(const wxRegion& region) = 0; + virtual bool DoSubtract(const wxRegion& region) = 0; + virtual bool DoXor(const wxRegion& region) = 0; +}; + +// some ports implement a generic Combine() function while others only +// implement individual wxRegion operations, factor out the common code for the +// ports with Combine() in this class +#if defined(__WXPALMOS__) || \ + defined(__WXMSW__) || \ + defined(__WXMAC__) || \ + defined(__WXPM__) + +#define wxHAS_REGION_COMBINE + +class WXDLLEXPORT wxRegionWithCombine : public wxRegionBase +{ +public: + // these methods are not part of public API as they're not implemented on + // all ports + bool Combine(wxCoord x, wxCoord y, wxCoord w, wxCoord h, wxRegionOp op); + bool Combine(const wxRect& rect, wxRegionOp op); + bool Combine(const wxRegion& region, wxRegionOp op) + { return DoCombine(region, op); } + + +protected: + // the real Combine() method, to be defined in the derived class + virtual bool DoCombine(const wxRegion& region, wxRegionOp op) = 0; + + // implement some wxRegionBase pure virtuals in terms of Combine() + virtual bool DoUnionWithRect(const wxRect& rect); + virtual bool DoUnionWithRegion(const wxRegion& region); + virtual bool DoIntersect(const wxRegion& region); + virtual bool DoSubtract(const wxRegion& region); + virtual bool DoXor(const wxRegion& region); +}; + +#endif // ports with wxRegion::Combine() + +#if defined(__WXPALMOS__) + #include "wx/palmos/region.h" +#elif defined(__WXMSW__) + #include "wx/msw/region.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/region.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/region.h" +#elif defined(__WXMOTIF__) || defined(__WXX11__) + #include "wx/x11/region.h" +#elif defined(__WXMGL__) + #include "wx/mgl/region.h" +#elif defined(__WXDFB__) + #include "wx/dfb/region.h" +#elif defined(__WXMAC__) + #include "wx/mac/region.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/region.h" +#elif defined(__WXPM__) + #include "wx/os2/region.h" +#endif + +// ---------------------------------------------------------------------------- +// inline functions implementation +// ---------------------------------------------------------------------------- + +// NB: these functions couldn't be defined in the class declaration as they use +// wxRegion and so can be only defined after including the header declaring +// the real class + +inline bool wxRegionBase::Intersect(const wxRect& rect) +{ + return DoIntersect(wxRegion(rect)); +} + +inline bool wxRegionBase::Subtract(const wxRect& rect) +{ + return DoSubtract(wxRegion(rect)); +} + +inline bool wxRegionBase::Xor(const wxRect& rect) +{ + return DoXor(wxRegion(rect)); +} + +// ...and these functions are here because they call the ones above, and its +// not really proper to call an inline function before its defined inline. + +inline bool wxRegionBase::Intersect(wxCoord x, wxCoord y, wxCoord w, wxCoord h) +{ + return Intersect(wxRect(x, y, w, h)); +} + +inline bool wxRegionBase::Subtract(wxCoord x, wxCoord y, wxCoord w, wxCoord h) +{ + return Subtract(wxRect(x, y, w, h)); +} + +inline bool wxRegionBase::Xor(wxCoord x, wxCoord y, wxCoord w, wxCoord h) +{ + return Xor(wxRect(x, y, w, h)); +} + +#ifdef wxHAS_REGION_COMBINE + +inline bool wxRegionWithCombine::Combine(wxCoord x, + wxCoord y, + wxCoord w, + wxCoord h, + wxRegionOp op) +{ + return DoCombine(wxRegion(x, y, w, h), op); +} + +inline bool wxRegionWithCombine::Combine(const wxRect& rect, wxRegionOp op) +{ + return DoCombine(wxRegion(rect), op); +} + +#endif // wxHAS_REGION_COMBINE + +#endif // _WX_REGION_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/renderer.h b/Externals/wxWidgets/include/wx/renderer.h new file mode 100644 index 0000000000..122c91845e --- /dev/null +++ b/Externals/wxWidgets/include/wx/renderer.h @@ -0,0 +1,409 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/renderer.h +// Purpose: wxRendererNative class declaration +// Author: Vadim Zeitlin +// Modified by: +// Created: 20.07.2003 +// RCS-ID: $Id: renderer.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) 2003 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +/* + Renderers are used in wxWidgets for two similar but different things: + (a) wxUniversal uses them to draw everything, i.e. all the control + (b) all the native ports use them to draw generic controls only + + wxUniversal needs more functionality than what is included in the base class + as it needs to draw stuff like scrollbars which are never going to be + generic. So we put the bare minimum needed by the native ports here and the + full wxRenderer class is declared in wx/univ/renderer.h and is only used by + wxUniveral (although note that native ports can load wxRenderer objects from + theme DLLs and use them as wxRendererNative ones, of course). + */ + +#ifndef _WX_RENDERER_H_ +#define _WX_RENDERER_H_ + +class WXDLLIMPEXP_FWD_CORE wxDC; +class WXDLLIMPEXP_FWD_CORE wxWindow; + +#include "wx/gdicmn.h" // for wxPoint +#include "wx/colour.h" +#include "wx/font.h" +#include "wx/bitmap.h" +#include "wx/string.h" + +// some platforms have their own renderers, others use the generic one +#if defined(__WXMSW__) || defined(__WXMAC__) || defined(__WXGTK__) + #define wxHAS_NATIVE_RENDERER +#else + #undef wxHAS_NATIVE_RENDERER +#endif + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// control state flags used in wxRenderer and wxColourScheme +enum +{ + wxCONTROL_DISABLED = 0x00000001, // control is disabled + wxCONTROL_FOCUSED = 0x00000002, // currently has keyboard focus + wxCONTROL_PRESSED = 0x00000004, // (button) is pressed + wxCONTROL_SPECIAL = 0x00000008, // control-specific bit: + wxCONTROL_ISDEFAULT = wxCONTROL_SPECIAL, // only for the buttons + wxCONTROL_ISSUBMENU = wxCONTROL_SPECIAL, // only for the menu items + wxCONTROL_EXPANDED = wxCONTROL_SPECIAL, // only for the tree items + wxCONTROL_SIZEGRIP = wxCONTROL_SPECIAL, // only for the status bar panes + wxCONTROL_CURRENT = 0x00000010, // mouse is currently over the control + wxCONTROL_SELECTED = 0x00000020, // selected item in e.g. listbox + wxCONTROL_CHECKED = 0x00000040, // (check/radio button) is checked + wxCONTROL_CHECKABLE = 0x00000080, // (menu) item can be checked + wxCONTROL_UNDETERMINED = wxCONTROL_CHECKABLE, // (check) undetermined state + + wxCONTROL_FLAGS_MASK = 0x000000ff, + + // this is a pseudo flag not used directly by wxRenderer but rather by some + // controls internally + wxCONTROL_DIRTY = 0x80000000 +}; + +// ---------------------------------------------------------------------------- +// helper structs +// ---------------------------------------------------------------------------- + +// wxSplitterWindow parameters +struct WXDLLEXPORT wxSplitterRenderParams +{ + // the only way to initialize this struct is by using this ctor + wxSplitterRenderParams(wxCoord widthSash_, wxCoord border_, bool isSens_) + : widthSash(widthSash_), border(border_), isHotSensitive(isSens_) + { + } + + // the width of the splitter sash + const wxCoord widthSash; + + // the width of the border of the splitter window + const wxCoord border; + + // true if the splitter changes its appearance when the mouse is over it + const bool isHotSensitive; +}; + + +// extra optional parameters for DrawHeaderButton +struct WXDLLEXPORT wxHeaderButtonParams +{ + wxHeaderButtonParams() + : m_labelAlignment(wxALIGN_LEFT) + { } + + wxColour m_arrowColour; + wxColour m_selectionColour; + wxString m_labelText; + wxFont m_labelFont; + wxColour m_labelColour; + wxBitmap m_labelBitmap; + int m_labelAlignment; +}; + +enum wxHeaderSortIconType { + wxHDR_SORT_ICON_NONE, // Header button has no sort arrow + wxHDR_SORT_ICON_UP, // Header button an an up sort arrow icon + wxHDR_SORT_ICON_DOWN // Header button an a down sort arrow icon +}; + + +// wxRendererNative interface version +struct WXDLLEXPORT wxRendererVersion +{ + wxRendererVersion(int version_, int age_) : version(version_), age(age_) { } + + // default copy ctor, assignment operator and dtor are ok + + // the current version and age of wxRendererNative interface: different + // versions are incompatible (in both ways) while the ages inside the same + // version are upwards compatible, i.e. the version of the renderer must + // match the version of the main program exactly while the age may be + // highergreater or equal to it + // + // NB: don't forget to increment age after adding any new virtual function! + enum + { + Current_Version = 1, + Current_Age = 5 + }; + + + // check if the given version is compatible with the current one + static bool IsCompatible(const wxRendererVersion& ver) + { + return ver.version == Current_Version && ver.age >= Current_Age; + } + + const int version; + const int age; +}; + +// ---------------------------------------------------------------------------- +// wxRendererNative: abstracts drawing methods needed by the native controls +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxRendererNative +{ +public: + // drawing functions + // ----------------- + + // draw the header control button (used by wxListCtrl) Returns optimal + // width for the label contents. + virtual int DrawHeaderButton(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags = 0, + wxHeaderSortIconType sortArrow = wxHDR_SORT_ICON_NONE, + wxHeaderButtonParams* params=NULL) = 0; + + + // Draw the contents of a header control button (label, sort arrows, etc.) + // Normally only called by DrawHeaderButton. + virtual int DrawHeaderButtonContents(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags = 0, + wxHeaderSortIconType sortArrow = wxHDR_SORT_ICON_NONE, + wxHeaderButtonParams* params=NULL) = 0; + + // Returns the default height of a header button, either a fixed platform + // height if available, or a generic height based on the window's font. + virtual int GetHeaderButtonHeight(wxWindow *win) = 0; + + + // draw the expanded/collapsed icon for a tree control item + virtual void DrawTreeItemButton(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags = 0) = 0; + + // draw the border for sash window: this border must be such that the sash + // drawn by DrawSash() blends into it well + virtual void DrawSplitterBorder(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags = 0) = 0; + + // draw a (vertical) sash + virtual void DrawSplitterSash(wxWindow *win, + wxDC& dc, + const wxSize& size, + wxCoord position, + wxOrientation orient, + int flags = 0) = 0; + + // draw a combobox dropdown button + // + // flags may use wxCONTROL_PRESSED and wxCONTROL_CURRENT + virtual void DrawComboBoxDropButton(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags = 0) = 0; + + // draw a dropdown arrow + // + // flags may use wxCONTROL_PRESSED and wxCONTROL_CURRENT + virtual void DrawDropArrow(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags = 0) = 0; + + // draw check button + // + // flags may use wxCONTROL_CHECKED, wxCONTROL_UNDETERMINED and wxCONTROL_CURRENT + virtual void DrawCheckBox(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags = 0) = 0; + + // draw blank button + // + // flags may use wxCONTROL_PRESSED, wxCONTROL_CURRENT and wxCONTROL_ISDEFAULT + virtual void DrawPushButton(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags = 0) = 0; + + // draw rectangle indicating that an item in e.g. a list control + // has been selected or focused + // + // flags may use + // wxCONTROL_SELECTED (item is selected, e.g. draw background) + // wxCONTROL_CURRENT (item is the current item, e.g. dotted border) + // wxCONTROL_FOCUSED (the whole control has focus, e.g. blue background vs. grey otherwise) + virtual void DrawItemSelectionRect(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags = 0) = 0; + + // geometry functions + // ------------------ + + // get the splitter parameters: the x field of the returned point is the + // sash width and the y field is the border width + virtual wxSplitterRenderParams GetSplitterParams(const wxWindow *win) = 0; + + + // pseudo constructors + // ------------------- + + // return the currently used renderer + static wxRendererNative& Get(); + + // return the generic implementation of the renderer + static wxRendererNative& GetGeneric(); + + // return the default (native) implementation for this platform + static wxRendererNative& GetDefault(); + + + // changing the global renderer + // ---------------------------- + +#if wxUSE_DYNLIB_CLASS + // load the renderer from the specified DLL, the returned pointer must be + // deleted by caller if not NULL when it is not used any more + static wxRendererNative *Load(const wxString& name); +#endif // wxUSE_DYNLIB_CLASS + + // set the renderer to use, passing NULL reverts to using the default + // renderer + // + // return the previous renderer used with Set() or NULL if none + static wxRendererNative *Set(wxRendererNative *renderer); + + + // miscellaneous stuff + // ------------------- + + // this function is used for version checking: Load() refuses to load any + // DLLs implementing an older or incompatible version; it should be + // implemented simply by returning wxRendererVersion::Current_XXX values + virtual wxRendererVersion GetVersion() const = 0; + + // virtual dtor for any base class + virtual ~wxRendererNative(); +}; + +// ---------------------------------------------------------------------------- +// wxDelegateRendererNative: allows reuse of renderers code +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxDelegateRendererNative : public wxRendererNative +{ +public: + wxDelegateRendererNative() + : m_rendererNative(GetGeneric()) { } + + wxDelegateRendererNative(wxRendererNative& rendererNative) + : m_rendererNative(rendererNative) { } + + + virtual int DrawHeaderButton(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags = 0, + wxHeaderSortIconType sortArrow = wxHDR_SORT_ICON_NONE, + wxHeaderButtonParams* params = NULL) + { return m_rendererNative.DrawHeaderButton(win, dc, rect, flags, sortArrow, params); } + + virtual int DrawHeaderButtonContents(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags = 0, + wxHeaderSortIconType sortArrow = wxHDR_SORT_ICON_NONE, + wxHeaderButtonParams* params = NULL) + { return m_rendererNative.DrawHeaderButtonContents(win, dc, rect, flags, sortArrow, params); } + + virtual int GetHeaderButtonHeight(wxWindow *win) + { return m_rendererNative.GetHeaderButtonHeight(win); } + + virtual void DrawTreeItemButton(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags = 0) + { m_rendererNative.DrawTreeItemButton(win, dc, rect, flags); } + + virtual void DrawSplitterBorder(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags = 0) + { m_rendererNative.DrawSplitterBorder(win, dc, rect, flags); } + + virtual void DrawSplitterSash(wxWindow *win, + wxDC& dc, + const wxSize& size, + wxCoord position, + wxOrientation orient, + int flags = 0) + { m_rendererNative.DrawSplitterSash(win, dc, size, + position, orient, flags); } + + virtual void DrawComboBoxDropButton(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags = 0) + { m_rendererNative.DrawComboBoxDropButton(win, dc, rect, flags); } + + virtual void DrawDropArrow(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags = 0) + { m_rendererNative.DrawDropArrow(win, dc, rect, flags); } + + virtual void DrawCheckBox(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags = 0 ) + { m_rendererNative.DrawCheckBox( win, dc, rect, flags ); } + + virtual void DrawPushButton(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags = 0 ) + { m_rendererNative.DrawPushButton( win, dc, rect, flags ); } + + virtual void DrawItemSelectionRect(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags = 0 ) + { m_rendererNative.DrawItemSelectionRect( win, dc, rect, flags ); } + + virtual wxSplitterRenderParams GetSplitterParams(const wxWindow *win) + { return m_rendererNative.GetSplitterParams(win); } + + virtual wxRendererVersion GetVersion() const + { return m_rendererNative.GetVersion(); } + +protected: + wxRendererNative& m_rendererNative; + + DECLARE_NO_COPY_CLASS(wxDelegateRendererNative) +}; + +// ---------------------------------------------------------------------------- +// inline functions implementation +// ---------------------------------------------------------------------------- + +#ifndef wxHAS_NATIVE_RENDERER + +// default native renderer is the generic one then +/* static */ inline +wxRendererNative& wxRendererNative::GetDefault() +{ + return GetGeneric(); +} + +#endif // !wxHAS_NATIVE_RENDERER + +#endif // _WX_RENDERER_H_ diff --git a/Externals/wxWidgets/include/wx/richtext/richtextbuffer.h b/Externals/wxWidgets/include/wx/richtext/richtextbuffer.h new file mode 100644 index 0000000000..e912ca2a28 --- /dev/null +++ b/Externals/wxWidgets/include/wx/richtext/richtextbuffer.h @@ -0,0 +1,2353 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/richtext/richtextbuffer.h +// Purpose: Buffer for wxRichTextCtrl +// Author: Julian Smart +// Modified by: +// Created: 2005-09-30 +// RCS-ID: $Id: richtextbuffer.h 44399 2007-02-07 12:24:17Z JS $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_RICHTEXTBUFFER_H_ +#define _WX_RICHTEXTBUFFER_H_ + +/* + + Data structures + =============== + + Data is represented by a hierarchy of objects, all derived from + wxRichTextObject. + + The top of the hierarchy is the buffer, a kind of wxRichTextParagraphLayoutBox. + These boxes will allow flexible placement of text boxes on a page, but + for now there is a single box representing the document, and this box is + a wxRichTextParagraphLayoutBox which contains further wxRichTextParagraph + objects, each of which can include text and images. + + Each object maintains a range (start and end position) measured + from the start of the main parent box. + A paragraph object knows its range, and a text fragment knows its range + too. So, a character or image in a page has a position relative to the + start of the document, and a character in an embedded text box has + a position relative to that text box. For now, we will not be dealing with + embedded objects but it's something to bear in mind for later. + + Note that internally, a range (5,5) represents a range of one character. + In the public wx[Rich]TextCtrl API, this would be passed to e.g. SetSelection + as (5,6). A paragraph with one character might have an internal range of (0, 1) + since the end of the paragraph takes up one position. + + Layout + ====== + + When Layout is called on an object, it is given a size which the object + must limit itself to, or one or more flexible directions (vertical + or horizontal). So for example a centered paragraph is given the page + width to play with (minus any margins), but can extend indefinitely + in the vertical direction. The implementation of Layout can then + cache the calculated size and position within the parent. + + */ + +/*! + * Includes + */ + +#include "wx/defs.h" + +#if wxUSE_RICHTEXT + +#include "wx/list.h" +#include "wx/textctrl.h" +#include "wx/bitmap.h" +#include "wx/image.h" +#include "wx/cmdproc.h" +#include "wx/txtstrm.h" + +#if wxUSE_DATAOBJ +#include "wx/dataobj.h" +#endif + +/*! + * Special characters + */ + +extern WXDLLIMPEXP_RICHTEXT const wxChar wxRichTextLineBreakChar; + +/*! + * File types + */ + +#define wxRICHTEXT_TYPE_ANY 0 +#define wxRICHTEXT_TYPE_TEXT 1 +#define wxRICHTEXT_TYPE_XML 2 +#define wxRICHTEXT_TYPE_HTML 3 +#define wxRICHTEXT_TYPE_RTF 4 +#define wxRICHTEXT_TYPE_PDF 5 + +/*! + * Forward declarations + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextCtrl; +class WXDLLIMPEXP_RICHTEXT wxRichTextObject; +class WXDLLIMPEXP_RICHTEXT wxRichTextCacheObject; +class WXDLLIMPEXP_RICHTEXT wxRichTextObjectList; +class WXDLLIMPEXP_RICHTEXT wxRichTextLine; +class WXDLLIMPEXP_RICHTEXT wxRichTextParagraph; +class WXDLLIMPEXP_RICHTEXT wxRichTextFileHandler; +class WXDLLIMPEXP_RICHTEXT wxRichTextStyleSheet; +class WXDLLIMPEXP_RICHTEXT wxTextAttrEx; +class WXDLLIMPEXP_RICHTEXT wxRichTextListStyleDefinition; +class WXDLLIMPEXP_RICHTEXT wxRichTextEvent; +class WXDLLIMPEXP_RICHTEXT wxRichTextRenderer; +class WXDLLIMPEXP_RICHTEXT wxRichTextBuffer; + +/*! + * Flags determining the available space, passed to Layout + */ + +#define wxRICHTEXT_FIXED_WIDTH 0x01 +#define wxRICHTEXT_FIXED_HEIGHT 0x02 +#define wxRICHTEXT_VARIABLE_WIDTH 0x04 +#define wxRICHTEXT_VARIABLE_HEIGHT 0x08 + +// Only lay out the part of the buffer that lies within +// the rect passed to Layout. +#define wxRICHTEXT_LAYOUT_SPECIFIED_RECT 0x10 + +/*! + * Flags to pass to Draw + */ + +// Ignore paragraph cache optimization, e.g. for printing purposes +// where one line may be drawn higher (on the next page) compared +// with the previous line +#define wxRICHTEXT_DRAW_IGNORE_CACHE 0x01 + +/*! + * Flags returned from hit-testing + */ + +// The point was not on this object +#define wxRICHTEXT_HITTEST_NONE 0x01 +// The point was before the position returned from HitTest +#define wxRICHTEXT_HITTEST_BEFORE 0x02 +// The point was after the position returned from HitTest +#define wxRICHTEXT_HITTEST_AFTER 0x04 +// The point was on the position returned from HitTest +#define wxRICHTEXT_HITTEST_ON 0x08 +// The point was on space outside content +#define wxRICHTEXT_HITTEST_OUTSIDE 0x10 + +/*! + * Flags for GetRangeSize + */ + +#define wxRICHTEXT_FORMATTED 0x01 +#define wxRICHTEXT_UNFORMATTED 0x02 + +/*! + * Flags for SetStyle/SetListStyle + */ + +#define wxRICHTEXT_SETSTYLE_NONE 0x00 + +// Specifies that this operation should be undoable +#define wxRICHTEXT_SETSTYLE_WITH_UNDO 0x01 + +// Specifies that the style should not be applied if the +// combined style at this point is already the style in question. +#define wxRICHTEXT_SETSTYLE_OPTIMIZE 0x02 + +// Specifies that the style should only be applied to paragraphs, +// and not the content. This allows content styling to be +// preserved independently from that of e.g. a named paragraph style. +#define wxRICHTEXT_SETSTYLE_PARAGRAPHS_ONLY 0x04 + +// Specifies that the style should only be applied to characters, +// and not the paragraph. This allows content styling to be +// preserved independently from that of e.g. a named paragraph style. +#define wxRICHTEXT_SETSTYLE_CHARACTERS_ONLY 0x08 + +// For SetListStyle only: specifies starting from the given number, otherwise +// deduces number from existing attributes +#define wxRICHTEXT_SETSTYLE_RENUMBER 0x10 + +// For SetListStyle only: specifies the list level for all paragraphs, otherwise +// the current indentation will be used +#define wxRICHTEXT_SETSTYLE_SPECIFY_LEVEL 0x20 + +// Resets the existing style before applying the new style +#define wxRICHTEXT_SETSTYLE_RESET 0x40 + +// Removes the given style instead of applying it +#define wxRICHTEXT_SETSTYLE_REMOVE 0x80 + +/*! + * Flags for text insertion + */ + +#define wxRICHTEXT_INSERT_NONE 0x00 +#define wxRICHTEXT_INSERT_WITH_PREVIOUS_PARAGRAPH_STYLE 0x01 + +/*! + * Extra formatting flags not in wxTextAttr + */ + +#define wxTEXT_ATTR_PARA_SPACING_AFTER 0x00000800 +#define wxTEXT_ATTR_PARA_SPACING_BEFORE 0x00001000 +#define wxTEXT_ATTR_LINE_SPACING 0x00002000 +#define wxTEXT_ATTR_CHARACTER_STYLE_NAME 0x00004000 +#define wxTEXT_ATTR_PARAGRAPH_STYLE_NAME 0x00008000 +#define wxTEXT_ATTR_LIST_STYLE_NAME 0x00010000 +#define wxTEXT_ATTR_BULLET_STYLE 0x00020000 +#define wxTEXT_ATTR_BULLET_NUMBER 0x00040000 +#define wxTEXT_ATTR_BULLET_TEXT 0x00080000 +#define wxTEXT_ATTR_BULLET_NAME 0x00100000 +#define wxTEXT_ATTR_URL 0x00200000 +#define wxTEXT_ATTR_PAGE_BREAK 0x00400000 +#define wxTEXT_ATTR_EFFECTS 0x00800000 +#define wxTEXT_ATTR_OUTLINE_LEVEL 0x01000000 + +/*! + * Styles for wxTextAttrEx::SetBulletStyle + */ + +#define wxTEXT_ATTR_BULLET_STYLE_NONE 0x00000000 +#define wxTEXT_ATTR_BULLET_STYLE_ARABIC 0x00000001 +#define wxTEXT_ATTR_BULLET_STYLE_LETTERS_UPPER 0x00000002 +#define wxTEXT_ATTR_BULLET_STYLE_LETTERS_LOWER 0x00000004 +#define wxTEXT_ATTR_BULLET_STYLE_ROMAN_UPPER 0x00000008 +#define wxTEXT_ATTR_BULLET_STYLE_ROMAN_LOWER 0x00000010 +#define wxTEXT_ATTR_BULLET_STYLE_SYMBOL 0x00000020 +#define wxTEXT_ATTR_BULLET_STYLE_BITMAP 0x00000040 +#define wxTEXT_ATTR_BULLET_STYLE_PARENTHESES 0x00000080 +#define wxTEXT_ATTR_BULLET_STYLE_PERIOD 0x00000100 +#define wxTEXT_ATTR_BULLET_STYLE_STANDARD 0x00000200 +#define wxTEXT_ATTR_BULLET_STYLE_RIGHT_PARENTHESIS 0x00000400 +#define wxTEXT_ATTR_BULLET_STYLE_OUTLINE 0x00000800 + +#define wxTEXT_ATTR_BULLET_STYLE_ALIGN_LEFT 0x00000000 +#define wxTEXT_ATTR_BULLET_STYLE_ALIGN_RIGHT 0x00001000 +#define wxTEXT_ATTR_BULLET_STYLE_ALIGN_CENTRE 0x00002000 + +/*! + * Styles for wxTextAttrEx::SetTextEffects + */ + +#define wxTEXT_ATTR_EFFECT_NONE 0x00000000 +#define wxTEXT_ATTR_EFFECT_CAPITALS 0x00000001 +#define wxTEXT_ATTR_EFFECT_SMALL_CAPITALS 0x00000002 +#define wxTEXT_ATTR_EFFECT_STRIKETHROUGH 0x00000004 +#define wxTEXT_ATTR_EFFECT_DOUBLE_STRIKETHROUGH 0x00000008 +#define wxTEXT_ATTR_EFFECT_SHADOW 0x00000010 +#define wxTEXT_ATTR_EFFECT_EMBOSS 0x00000020 +#define wxTEXT_ATTR_EFFECT_OUTLINE 0x00000040 +#define wxTEXT_ATTR_EFFECT_ENGRAVE 0x00000080 +#define wxTEXT_ATTR_EFFECT_SUPERSCRIPT 0x00000100 +#define wxTEXT_ATTR_EFFECT_SUBSCRIPT 0x00000200 + +/*! + * Line spacing values + */ + +#define wxTEXT_ATTR_LINE_SPACING_NORMAL 10 +#define wxTEXT_ATTR_LINE_SPACING_HALF 15 +#define wxTEXT_ATTR_LINE_SPACING_TWICE 20 + +/*! + * Character and paragraph combined styles + */ + +#define wxTEXT_ATTR_CHARACTER (wxTEXT_ATTR_FONT|wxTEXT_ATTR_EFFECTS|wxTEXT_ATTR_BACKGROUND_COLOUR|wxTEXT_ATTR_TEXT_COLOUR|wxTEXT_ATTR_CHARACTER_STYLE_NAME|wxTEXT_ATTR_URL) + +#define wxTEXT_ATTR_PARAGRAPH (wxTEXT_ATTR_ALIGNMENT|wxTEXT_ATTR_LEFT_INDENT|wxTEXT_ATTR_RIGHT_INDENT|wxTEXT_ATTR_TABS|\ + wxTEXT_ATTR_PARA_SPACING_BEFORE|wxTEXT_ATTR_PARA_SPACING_AFTER|wxTEXT_ATTR_LINE_SPACING|\ + wxTEXT_ATTR_BULLET_STYLE|wxTEXT_ATTR_BULLET_NUMBER|wxTEXT_ATTR_BULLET_TEXT|wxTEXT_ATTR_BULLET_NAME|\ + wxTEXT_ATTR_PARAGRAPH_STYLE_NAME|wxTEXT_ATTR_LIST_STYLE_NAME|wxTEXT_ATTR_OUTLINE_LEVEL) + +#define wxTEXT_ATTR_ALL (wxTEXT_ATTR_CHARACTER|wxTEXT_ATTR_PARAGRAPH) + +/*! + * wxRichTextRange class declaration + * This stores beginning and end positions for a range of data. + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextRange +{ +public: +// Constructors + + wxRichTextRange() { m_start = 0; m_end = 0; } + wxRichTextRange(long start, long end) { m_start = start; m_end = end; } + wxRichTextRange(const wxRichTextRange& range) { m_start = range.m_start; m_end = range.m_end; } + ~wxRichTextRange() {} + + void operator =(const wxRichTextRange& range) { m_start = range.m_start; m_end = range.m_end; } + bool operator ==(const wxRichTextRange& range) const { return (m_start == range.m_start && m_end == range.m_end); } + bool operator !=(const wxRichTextRange& range) const { return (m_start != range.m_start && m_end != range.m_end); } + wxRichTextRange operator -(const wxRichTextRange& range) const { return wxRichTextRange(m_start - range.m_start, m_end - range.m_end); } + wxRichTextRange operator +(const wxRichTextRange& range) const { return wxRichTextRange(m_start + range.m_start, m_end + range.m_end); } + + void SetRange(long start, long end) { m_start = start; m_end = end; } + + void SetStart(long start) { m_start = start; } + long GetStart() const { return m_start; } + + void SetEnd(long end) { m_end = end; } + long GetEnd() const { return m_end; } + + /// Returns true if this range is completely outside 'range' + bool IsOutside(const wxRichTextRange& range) const { return range.m_start > m_end || range.m_end < m_start; } + + /// Returns true if this range is completely within 'range' + bool IsWithin(const wxRichTextRange& range) const { return m_start >= range.m_start && m_end <= range.m_end; } + + /// Returns true if the given position is within this range. Allow + /// for the possibility of an empty range - assume the position + /// is within this empty range. NO, I think we should not match with an empty range. + // bool Contains(long pos) const { return pos >= m_start && (pos <= m_end || GetLength() == 0); } + bool Contains(long pos) const { return pos >= m_start && pos <= m_end ; } + + /// Limit this range to be within 'range' + bool LimitTo(const wxRichTextRange& range) ; + + /// Gets the length of the range + long GetLength() const { return m_end - m_start + 1; } + + /// Swaps the start and end + void Swap() { long tmp = m_start; m_start = m_end; m_end = tmp; } + + /// Convert to internal form: (n, n) is the range of a single character. + wxRichTextRange ToInternal() const { return wxRichTextRange(m_start, m_end-1); } + + /// Convert from internal to public API form: (n, n+1) is the range of a single character. + wxRichTextRange FromInternal() const { return wxRichTextRange(m_start, m_end+1); } + +protected: + long m_start; + long m_end; +}; + +#define wxRICHTEXT_ALL wxRichTextRange(-2, -2) +#define wxRICHTEXT_NONE wxRichTextRange(-1, -1) + +/*! + * wxTextAttrEx is an extended version of wxTextAttr with more paragraph attributes. + */ + +class WXDLLIMPEXP_RICHTEXT wxTextAttrEx: public wxTextAttr +{ +public: + // ctors + wxTextAttrEx(const wxTextAttrEx& attr); + wxTextAttrEx(const wxTextAttr& attr) { Init(); (*this) = attr; } + wxTextAttrEx() { Init(); } + + // Initialise this object + void Init(); + + // Copy + void Copy(const wxTextAttrEx& attr); + + // Assignment from a wxTextAttrEx object + void operator= (const wxTextAttrEx& attr); + + // Assignment from a wxTextAttr object + void operator= (const wxTextAttr& attr); + + // Equality test + bool operator== (const wxTextAttrEx& attr) const; + + // setters + void SetCharacterStyleName(const wxString& name) { m_characterStyleName = name; SetFlags(GetFlags() | wxTEXT_ATTR_CHARACTER_STYLE_NAME); } + void SetParagraphStyleName(const wxString& name) { m_paragraphStyleName = name; SetFlags(GetFlags() | wxTEXT_ATTR_PARAGRAPH_STYLE_NAME); } + void SetListStyleName(const wxString& name) { m_listStyleName = name; SetFlags(GetFlags() | wxTEXT_ATTR_LIST_STYLE_NAME); } + void SetParagraphSpacingAfter(int spacing) { m_paragraphSpacingAfter = spacing; SetFlags(GetFlags() | wxTEXT_ATTR_PARA_SPACING_AFTER); } + void SetParagraphSpacingBefore(int spacing) { m_paragraphSpacingBefore = spacing; SetFlags(GetFlags() | wxTEXT_ATTR_PARA_SPACING_BEFORE); } + void SetLineSpacing(int spacing) { m_lineSpacing = spacing; SetFlags(GetFlags() | wxTEXT_ATTR_LINE_SPACING); } + void SetBulletStyle(int style) { m_bulletStyle = style; SetFlags(GetFlags() | wxTEXT_ATTR_BULLET_STYLE); } + void SetBulletNumber(int n) { m_bulletNumber = n; SetFlags(GetFlags() | wxTEXT_ATTR_BULLET_NUMBER); } + void SetBulletText(const wxString& text) { m_bulletText = text; SetFlags(GetFlags() | wxTEXT_ATTR_BULLET_TEXT); } + void SetBulletName(const wxString& name) { m_bulletName = name; SetFlags(GetFlags() | wxTEXT_ATTR_BULLET_NAME); } + void SetBulletFont(const wxString& bulletFont) { m_bulletFont = bulletFont; } + void SetURL(const wxString& url) { m_urlTarget = url; SetFlags(GetFlags() | wxTEXT_ATTR_URL); } + void SetPageBreak(bool pageBreak = true) { SetFlags(pageBreak ? (GetFlags() | wxTEXT_ATTR_PAGE_BREAK) : (GetFlags() & ~wxTEXT_ATTR_PAGE_BREAK)); } + void SetTextEffects(int effects) { m_textEffects = effects; SetFlags(GetFlags() | wxTEXT_ATTR_EFFECTS); } + void SetTextEffectFlags(int effects) { m_textEffectFlags = effects; } + void SetOutlineLevel(int level) { m_outlineLevel = level; SetFlags(GetFlags() | wxTEXT_ATTR_OUTLINE_LEVEL); } + + const wxString& GetCharacterStyleName() const { return m_characterStyleName; } + const wxString& GetParagraphStyleName() const { return m_paragraphStyleName; } + const wxString& GetListStyleName() const { return m_listStyleName; } + int GetParagraphSpacingAfter() const { return m_paragraphSpacingAfter; } + int GetParagraphSpacingBefore() const { return m_paragraphSpacingBefore; } + int GetLineSpacing() const { return m_lineSpacing; } + int GetBulletStyle() const { return m_bulletStyle; } + int GetBulletNumber() const { return m_bulletNumber; } + const wxString& GetBulletText() const { return m_bulletText; } + const wxString& GetBulletName() const { return m_bulletName; } + const wxString& GetBulletFont() const { return m_bulletFont; } + const wxString& GetURL() const { return m_urlTarget; } + int GetTextEffects() const { return m_textEffects; } + int GetTextEffectFlags() const { return m_textEffectFlags; } + int GetOutlineLevel() const { return m_outlineLevel; } + + bool HasFontWeight() const { return (GetFlags() & wxTEXT_ATTR_FONT_WEIGHT) != 0; } + bool HasFontSize() const { return (GetFlags() & wxTEXT_ATTR_FONT_SIZE) != 0; } + bool HasFontItalic() const { return (GetFlags() & wxTEXT_ATTR_FONT_ITALIC) != 0; } + bool HasFontUnderlined() const { return (GetFlags() & wxTEXT_ATTR_FONT_UNDERLINE) != 0; } + bool HasFontFaceName() const { return (GetFlags() & wxTEXT_ATTR_FONT_FACE) != 0; } + + bool HasParagraphSpacingAfter() const { return HasFlag(wxTEXT_ATTR_PARA_SPACING_AFTER); } + bool HasParagraphSpacingBefore() const { return HasFlag(wxTEXT_ATTR_PARA_SPACING_BEFORE); } + bool HasLineSpacing() const { return HasFlag(wxTEXT_ATTR_LINE_SPACING); } + bool HasCharacterStyleName() const { return HasFlag(wxTEXT_ATTR_CHARACTER_STYLE_NAME) && !m_characterStyleName.IsEmpty(); } + bool HasParagraphStyleName() const { return HasFlag(wxTEXT_ATTR_PARAGRAPH_STYLE_NAME) && !m_paragraphStyleName.IsEmpty(); } + bool HasListStyleName() const { return HasFlag(wxTEXT_ATTR_LIST_STYLE_NAME) || !m_listStyleName.IsEmpty(); } + bool HasBulletStyle() const { return HasFlag(wxTEXT_ATTR_BULLET_STYLE); } + bool HasBulletNumber() const { return HasFlag(wxTEXT_ATTR_BULLET_NUMBER); } + bool HasBulletText() const { return HasFlag(wxTEXT_ATTR_BULLET_TEXT); } + bool HasBulletName() const { return HasFlag(wxTEXT_ATTR_BULLET_NAME); } + bool HasURL() const { return HasFlag(wxTEXT_ATTR_URL); } + bool HasPageBreak() const { return HasFlag(wxTEXT_ATTR_PAGE_BREAK); } + bool HasTextEffects() const { return HasFlag(wxTEXT_ATTR_EFFECTS); } + bool HasTextEffect(int effect) const { return HasFlag(wxTEXT_ATTR_EFFECTS) && ((GetTextEffectFlags() & effect) != 0); } + bool HasOutlineLevel() const { return HasFlag(wxTEXT_ATTR_OUTLINE_LEVEL); } + + // Is this a character style? + bool IsCharacterStyle() const { return (0 != (GetFlags() & wxTEXT_ATTR_CHARACTER)); } + bool IsParagraphStyle() const { return (0 != (GetFlags() & wxTEXT_ATTR_PARAGRAPH)); } + + // returns false if we have any attributes set, true otherwise + bool IsDefault() const + { + return (GetFlags() == 0); + } + + // return the attribute having the valid font and colours: it uses the + // attributes set in attr and falls back first to attrDefault and then to + // the text control font/colours for those attributes which are not set + static wxTextAttrEx CombineEx(const wxTextAttrEx& attr, + const wxTextAttrEx& attrDef, + const wxTextCtrlBase *text); + +private: + // Paragraph styles + int m_paragraphSpacingAfter; + int m_paragraphSpacingBefore; + int m_lineSpacing; + int m_bulletStyle; + int m_bulletNumber; + int m_textEffects; + int m_textEffectFlags; + int m_outlineLevel; + wxString m_bulletText; + wxString m_bulletFont; + wxString m_bulletName; + wxString m_urlTarget; + + // Character style + wxString m_characterStyleName; + + // Paragraph style + wxString m_paragraphStyleName; + + // List style + wxString m_listStyleName; +}; + +/*! + * wxRichTextAttr stores attributes without a wxFont object, so is a much more + * efficient way to query styles. + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextAttr +{ +public: + // ctors + wxRichTextAttr(const wxTextAttrEx& attr); + wxRichTextAttr(const wxRichTextAttr& attr); + wxRichTextAttr() { Init(); } + wxRichTextAttr(const wxColour& colText, + const wxColour& colBack = wxNullColour, + wxTextAttrAlignment alignment = wxTEXT_ALIGNMENT_DEFAULT); + + // Initialise this object. + void Init(); + + // Copy + void Copy(const wxRichTextAttr& attr); + + // Assignment from a wxRichTextAttr object. + void operator= (const wxRichTextAttr& attr); + + // Assignment from a wxTextAttrEx object. + void operator= (const wxTextAttrEx& attr); + + // Equality test + bool operator== (const wxRichTextAttr& attr) const; + + // Making a wxTextAttrEx object. + operator wxTextAttrEx () const ; + + // Create font from font attributes. + wxFont CreateFont() const; + + // Get attributes from font. + bool GetFontAttributes(const wxFont& font); + + // setters + void SetTextColour(const wxColour& colText) { m_colText = colText; m_flags |= wxTEXT_ATTR_TEXT_COLOUR; } + void SetBackgroundColour(const wxColour& colBack) { m_colBack = colBack; m_flags |= wxTEXT_ATTR_BACKGROUND_COLOUR; } + void SetAlignment(wxTextAttrAlignment alignment) { m_textAlignment = alignment; m_flags |= wxTEXT_ATTR_ALIGNMENT; } + void SetTabs(const wxArrayInt& tabs) { m_tabs = tabs; m_flags |= wxTEXT_ATTR_TABS; } + void SetLeftIndent(int indent, int subIndent = 0) { m_leftIndent = indent; m_leftSubIndent = subIndent; m_flags |= wxTEXT_ATTR_LEFT_INDENT; } + void SetRightIndent(int indent) { m_rightIndent = indent; m_flags |= wxTEXT_ATTR_RIGHT_INDENT; } + + void SetFontSize(int pointSize) { m_fontSize = pointSize; m_flags |= wxTEXT_ATTR_FONT_SIZE; } + void SetFontStyle(int fontStyle) { m_fontStyle = fontStyle; m_flags |= wxTEXT_ATTR_FONT_ITALIC; } + void SetFontWeight(int fontWeight) { m_fontWeight = fontWeight; m_flags |= wxTEXT_ATTR_FONT_WEIGHT; } + void SetFontFaceName(const wxString& faceName) { m_fontFaceName = faceName; m_flags |= wxTEXT_ATTR_FONT_FACE; } + void SetFontUnderlined(bool underlined) { m_fontUnderlined = underlined; m_flags |= wxTEXT_ATTR_FONT_UNDERLINE; } + + void SetFlags(long flags) { m_flags = flags; } + + void SetCharacterStyleName(const wxString& name) { m_characterStyleName = name; m_flags |= wxTEXT_ATTR_CHARACTER_STYLE_NAME; } + void SetParagraphStyleName(const wxString& name) { m_paragraphStyleName = name; m_flags |= wxTEXT_ATTR_PARAGRAPH_STYLE_NAME; } + void SetListStyleName(const wxString& name) { m_listStyleName = name; SetFlags(GetFlags() | wxTEXT_ATTR_LIST_STYLE_NAME); } + void SetParagraphSpacingAfter(int spacing) { m_paragraphSpacingAfter = spacing; m_flags |= wxTEXT_ATTR_PARA_SPACING_AFTER; } + void SetParagraphSpacingBefore(int spacing) { m_paragraphSpacingBefore = spacing; m_flags |= wxTEXT_ATTR_PARA_SPACING_BEFORE; } + void SetLineSpacing(int spacing) { m_lineSpacing = spacing; m_flags |= wxTEXT_ATTR_LINE_SPACING; } + void SetBulletStyle(int style) { m_bulletStyle = style; m_flags |= wxTEXT_ATTR_BULLET_STYLE; } + void SetBulletNumber(int n) { m_bulletNumber = n; m_flags |= wxTEXT_ATTR_BULLET_NUMBER; } + void SetBulletText(const wxString& text) { m_bulletText = text; m_flags |= wxTEXT_ATTR_BULLET_TEXT; } + void SetBulletFont(const wxString& bulletFont) { m_bulletFont = bulletFont; } + void SetBulletName(const wxString& name) { m_bulletName = name; m_flags |= wxTEXT_ATTR_BULLET_NAME; } + void SetURL(const wxString& url) { m_urlTarget = url; m_flags |= wxTEXT_ATTR_URL; } + void SetPageBreak(bool pageBreak = true) { SetFlags(pageBreak ? (GetFlags() | wxTEXT_ATTR_PAGE_BREAK) : (GetFlags() & ~wxTEXT_ATTR_PAGE_BREAK)); } + void SetTextEffects(int effects) { m_textEffects = effects; SetFlags(GetFlags() | wxTEXT_ATTR_EFFECTS); } + void SetTextEffectFlags(int effects) { m_textEffectFlags = effects; } + void SetOutlineLevel(int level) { m_outlineLevel = level; SetFlags(GetFlags() | wxTEXT_ATTR_OUTLINE_LEVEL); } + + const wxColour& GetTextColour() const { return m_colText; } + const wxColour& GetBackgroundColour() const { return m_colBack; } + wxTextAttrAlignment GetAlignment() const { return m_textAlignment; } + const wxArrayInt& GetTabs() const { return m_tabs; } + long GetLeftIndent() const { return m_leftIndent; } + long GetLeftSubIndent() const { return m_leftSubIndent; } + long GetRightIndent() const { return m_rightIndent; } + long GetFlags() const { return m_flags; } + + int GetFontSize() const { return m_fontSize; } + int GetFontStyle() const { return m_fontStyle; } + int GetFontWeight() const { return m_fontWeight; } + bool GetFontUnderlined() const { return m_fontUnderlined; } + const wxString& GetFontFaceName() const { return m_fontFaceName; } + + const wxString& GetCharacterStyleName() const { return m_characterStyleName; } + const wxString& GetParagraphStyleName() const { return m_paragraphStyleName; } + const wxString& GetListStyleName() const { return m_listStyleName; } + int GetParagraphSpacingAfter() const { return m_paragraphSpacingAfter; } + int GetParagraphSpacingBefore() const { return m_paragraphSpacingBefore; } + int GetLineSpacing() const { return m_lineSpacing; } + int GetBulletStyle() const { return m_bulletStyle; } + int GetBulletNumber() const { return m_bulletNumber; } + const wxString& GetBulletText() const { return m_bulletText; } + const wxString& GetBulletFont() const { return m_bulletFont; } + const wxString& GetBulletName() const { return m_bulletName; } + const wxString& GetURL() const { return m_urlTarget; } + int GetTextEffects() const { return m_textEffects; } + int GetTextEffectFlags() const { return m_textEffectFlags; } + int GetOutlineLevel() const { return m_outlineLevel; } + + // accessors + bool HasTextColour() const { return m_colText.Ok() && HasFlag(wxTEXT_ATTR_TEXT_COLOUR) ; } + bool HasBackgroundColour() const { return m_colBack.Ok() && HasFlag(wxTEXT_ATTR_BACKGROUND_COLOUR) ; } + bool HasAlignment() const { return (m_textAlignment != wxTEXT_ALIGNMENT_DEFAULT) || ((m_flags & wxTEXT_ATTR_ALIGNMENT) != 0) ; } + bool HasTabs() const { return (m_flags & wxTEXT_ATTR_TABS) != 0 ; } + bool HasLeftIndent() const { return (m_flags & wxTEXT_ATTR_LEFT_INDENT) != 0 ; } + bool HasRightIndent() const { return (m_flags & wxTEXT_ATTR_RIGHT_INDENT) != 0 ; } + bool HasFontWeight() const { return (m_flags & wxTEXT_ATTR_FONT_WEIGHT) != 0; } + bool HasFontSize() const { return (m_flags & wxTEXT_ATTR_FONT_SIZE) != 0; } + bool HasFontItalic() const { return (m_flags & wxTEXT_ATTR_FONT_ITALIC) != 0; } + bool HasFontUnderlined() const { return (m_flags & wxTEXT_ATTR_FONT_UNDERLINE) != 0; } + bool HasFontFaceName() const { return (m_flags & wxTEXT_ATTR_FONT_FACE) != 0; } + bool HasFont() const { return (m_flags & (wxTEXT_ATTR_FONT)) != 0; } + + bool HasParagraphSpacingAfter() const { return (m_flags & wxTEXT_ATTR_PARA_SPACING_AFTER) != 0; } + bool HasParagraphSpacingBefore() const { return (m_flags & wxTEXT_ATTR_PARA_SPACING_BEFORE) != 0; } + bool HasLineSpacing() const { return (m_flags & wxTEXT_ATTR_LINE_SPACING) != 0; } + bool HasCharacterStyleName() const { return (m_flags & wxTEXT_ATTR_CHARACTER_STYLE_NAME) != 0 && !m_characterStyleName.IsEmpty(); } + bool HasParagraphStyleName() const { return (m_flags & wxTEXT_ATTR_PARAGRAPH_STYLE_NAME) != 0 && !m_paragraphStyleName.IsEmpty(); } + bool HasListStyleName() const { return HasFlag(wxTEXT_ATTR_LIST_STYLE_NAME) || !m_listStyleName.IsEmpty(); } + bool HasBulletStyle() const { return (m_flags & wxTEXT_ATTR_BULLET_STYLE) != 0; } + bool HasBulletNumber() const { return (m_flags & wxTEXT_ATTR_BULLET_NUMBER) != 0; } + bool HasBulletText() const { return (m_flags & wxTEXT_ATTR_BULLET_TEXT) != 0; } + bool HasBulletName() const { return (m_flags & wxTEXT_ATTR_BULLET_NAME) != 0; } + bool HasURL() const { return HasFlag(wxTEXT_ATTR_URL); } + bool HasPageBreak() const { return HasFlag(wxTEXT_ATTR_PAGE_BREAK); } + bool HasTextEffects() const { return HasFlag(wxTEXT_ATTR_EFFECTS); } + bool HasTextEffect(int effect) const { return HasFlag(wxTEXT_ATTR_EFFECTS) && ((GetTextEffectFlags() & effect) != 0); } + bool HasOutlineLevel() const { return HasFlag(wxTEXT_ATTR_OUTLINE_LEVEL); } + + bool HasFlag(long flag) const { return (m_flags & flag) != 0; } + + // Is this a character style? + bool IsCharacterStyle() const { return (0 != (GetFlags() & wxTEXT_ATTR_CHARACTER)); } + bool IsParagraphStyle() const { return (0 != (GetFlags() & wxTEXT_ATTR_PARAGRAPH)); } + + // returns false if we have any attributes set, true otherwise + bool IsDefault() const + { + return GetFlags() == 0; + } + + // Merges the given attributes. Does not affect 'this'. If compareWith + // is non-NULL, then it will be used to mask out those attributes that are the same in style + // and compareWith, for situations where we don't want to explicitly set inherited attributes. + bool Apply(const wxRichTextAttr& style, const wxRichTextAttr* compareWith = NULL); + + // Merges the given attributes and returns the result. Does not affect 'this'. If compareWith + // is non-NULL, then it will be used to mask out those attributes that are the same in style + // and compareWith, for situations where we don't want to explicitly set inherited attributes. + wxRichTextAttr Combine(const wxRichTextAttr& style, const wxRichTextAttr* compareWith = NULL) const; + +private: + long m_flags; + + // Paragraph styles + wxArrayInt m_tabs; // array of int: tab stops in 1/10 mm + int m_leftIndent; // left indent in 1/10 mm + int m_leftSubIndent; // left indent for all but the first + // line in a paragraph relative to the + // first line, in 1/10 mm + int m_rightIndent; // right indent in 1/10 mm + wxTextAttrAlignment m_textAlignment; + + int m_paragraphSpacingAfter; + int m_paragraphSpacingBefore; + int m_lineSpacing; + int m_bulletStyle; + int m_bulletNumber; + int m_textEffects; + int m_textEffectFlags; + int m_outlineLevel; + wxString m_bulletText; + wxString m_bulletFont; + wxString m_bulletName; + wxString m_urlTarget; + + // Character styles + wxColour m_colText, + m_colBack; + int m_fontSize; + int m_fontStyle; + int m_fontWeight; + bool m_fontUnderlined; + wxString m_fontFaceName; + + // Character style + wxString m_characterStyleName; + + // Paragraph style + wxString m_paragraphStyleName; + + // List style + wxString m_listStyleName; +}; + +/*! + * wxRichTextObject class declaration + * This is the base for drawable objects. + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextObject: public wxObject +{ + DECLARE_CLASS(wxRichTextObject) +public: +// Constructors + + wxRichTextObject(wxRichTextObject* parent = NULL); + virtual ~wxRichTextObject(); + +// Overrideables + + /// Draw the item, within the given range. Some objects may ignore the range (for + /// example paragraphs) while others must obey it (lines, to implement wrapping) + virtual bool Draw(wxDC& dc, const wxRichTextRange& range, const wxRichTextRange& selectionRange, const wxRect& rect, int descent, int style) = 0; + + /// Lay the item out at the specified position with the given size constraint. + /// Layout must set the cached size. + virtual bool Layout(wxDC& dc, const wxRect& rect, int style) = 0; + + /// Hit-testing: returns a flag indicating hit test details, plus + /// information about position + virtual int HitTest(wxDC& WXUNUSED(dc), const wxPoint& WXUNUSED(pt), long& WXUNUSED(textPosition)) { return false; } + + /// Finds the absolute position and row height for the given character position + virtual bool FindPosition(wxDC& WXUNUSED(dc), long WXUNUSED(index), wxPoint& WXUNUSED(pt), int* WXUNUSED(height), bool WXUNUSED(forceLineStart)) { return false; } + + /// Get the best size, i.e. the ideal starting size for this object irrespective + /// of available space. For a short text string, it will be the size that exactly encloses + /// the text. For a longer string, it might use the parent width for example. + virtual wxSize GetBestSize() const { return m_size; } + + /// Get the object size for the given range. Returns false if the range + /// is invalid for this object. + virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, int flags, wxPoint position = wxPoint(0,0)) const = 0; + + /// Do a split, returning an object containing the second part, and setting + /// the first part in 'this'. + virtual wxRichTextObject* DoSplit(long WXUNUSED(pos)) { return NULL; } + + /// Calculate range. By default, guess that the object is 1 unit long. + virtual void CalculateRange(long start, long& end) { end = start ; m_range.SetRange(start, end); } + + /// Delete range + virtual bool DeleteRange(const wxRichTextRange& WXUNUSED(range)) { return false; } + + /// Returns true if the object is empty + virtual bool IsEmpty() const { return false; } + + /// Get any text in this object for the given range + virtual wxString GetTextForRange(const wxRichTextRange& WXUNUSED(range)) const { return wxEmptyString; } + + /// Returns true if this object can merge itself with the given one. + virtual bool CanMerge(wxRichTextObject* WXUNUSED(object)) const { return false; } + + /// Returns true if this object merged itself with the given one. + /// The calling code will then delete the given object. + virtual bool Merge(wxRichTextObject* WXUNUSED(object)) { return false; } + + /// Dump to output stream for debugging + virtual void Dump(wxTextOutputStream& stream); + +// Accessors + + /// Get/set the cached object size as calculated by Layout. + virtual wxSize GetCachedSize() const { return m_size; } + virtual void SetCachedSize(const wxSize& sz) { m_size = sz; } + + /// Get/set the object position + virtual wxPoint GetPosition() const { return m_pos; } + virtual void SetPosition(const wxPoint& pos) { m_pos = pos; } + + /// Get the rectangle enclosing the object + virtual wxRect GetRect() const { return wxRect(GetPosition(), GetCachedSize()); } + + /// Set the range + void SetRange(const wxRichTextRange& range) { m_range = range; } + + /// Get the range + const wxRichTextRange& GetRange() const { return m_range; } + wxRichTextRange& GetRange() { return m_range; } + + /// Get/set dirty flag (whether the object needs Layout to be called) + virtual bool GetDirty() const { return m_dirty; } + virtual void SetDirty(bool dirty) { m_dirty = dirty; } + + /// Is this composite? + virtual bool IsComposite() const { return false; } + + /// Get/set the parent. + virtual wxRichTextObject* GetParent() const { return m_parent; } + virtual void SetParent(wxRichTextObject* parent) { m_parent = parent; } + + /// Set the margin around the object + virtual void SetMargins(int margin); + virtual void SetMargins(int leftMargin, int rightMargin, int topMargin, int bottomMargin); + virtual int GetLeftMargin() const { return m_leftMargin; } + virtual int GetRightMargin() const { return m_rightMargin; } + virtual int GetTopMargin() const { return m_topMargin; } + virtual int GetBottomMargin() const { return m_bottomMargin; } + + /// Set attributes object + void SetAttributes(const wxTextAttrEx& attr) { m_attributes = attr; } + const wxTextAttrEx& GetAttributes() const { return m_attributes; } + wxTextAttrEx& GetAttributes() { return m_attributes; } + + /// Set/get stored descent + void SetDescent(int descent) { m_descent = descent; } + int GetDescent() const { return m_descent; } + + /// Gets the containing buffer + wxRichTextBuffer* GetBuffer() const; + +// Operations + + /// Clone the object + virtual wxRichTextObject* Clone() const { return NULL; } + + /// Copy + void Copy(const wxRichTextObject& obj); + + /// Reference-counting allows us to use the same object in multiple + /// lists (not yet used) + void Reference() { m_refCount ++; } + void Dereference(); + + /// Convert units in tenths of a millimetre to device units + int ConvertTenthsMMToPixels(wxDC& dc, int units); + static int ConvertTenthsMMToPixels(int ppi, int units); + +protected: + wxSize m_size; + wxPoint m_pos; + int m_descent; // Descent for this object (if any) + bool m_dirty; + int m_refCount; + wxRichTextObject* m_parent; + + /// The range of this object (start position to end position) + wxRichTextRange m_range; + + /// Margins + int m_leftMargin; + int m_rightMargin; + int m_topMargin; + int m_bottomMargin; + + /// Attributes + wxTextAttrEx m_attributes; +}; + +WX_DECLARE_LIST_WITH_DECL( wxRichTextObject, wxRichTextObjectList, class WXDLLIMPEXP_RICHTEXT ); + +/*! + * wxRichTextCompositeObject class declaration + * Objects of this class can contain other objects. + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextCompositeObject: public wxRichTextObject +{ + DECLARE_CLASS(wxRichTextCompositeObject) +public: +// Constructors + + wxRichTextCompositeObject(wxRichTextObject* parent = NULL); + virtual ~wxRichTextCompositeObject(); + +// Overrideables + + /// Hit-testing: returns a flag indicating hit test details, plus + /// information about position + virtual int HitTest(wxDC& dc, const wxPoint& pt, long& textPosition); + + /// Finds the absolute position and row height for the given character position + virtual bool FindPosition(wxDC& dc, long index, wxPoint& pt, int* height, bool forceLineStart); + + /// Calculate range + virtual void CalculateRange(long start, long& end); + + /// Delete range + virtual bool DeleteRange(const wxRichTextRange& range); + + /// Get any text in this object for the given range + virtual wxString GetTextForRange(const wxRichTextRange& range) const; + + /// Dump to output stream for debugging + virtual void Dump(wxTextOutputStream& stream); + +// Accessors + + /// Get the children + wxRichTextObjectList& GetChildren() { return m_children; } + const wxRichTextObjectList& GetChildren() const { return m_children; } + + /// Get the child count + size_t GetChildCount() const ; + + /// Get the nth child + wxRichTextObject* GetChild(size_t n) const ; + + /// Get/set dirty flag + virtual bool GetDirty() const { return m_dirty; } + virtual void SetDirty(bool dirty) { m_dirty = dirty; } + + /// Is this composite? + virtual bool IsComposite() const { return true; } + + /// Returns true if the buffer is empty + virtual bool IsEmpty() const { return GetChildCount() == 0; } + +// Operations + + /// Copy + void Copy(const wxRichTextCompositeObject& obj); + + /// Assignment + void operator= (const wxRichTextCompositeObject& obj) { Copy(obj); } + + /// Append a child, returning the position + size_t AppendChild(wxRichTextObject* child) ; + + /// Insert the child in front of the given object, or at the beginning + bool InsertChild(wxRichTextObject* child, wxRichTextObject* inFrontOf) ; + + /// Delete the child + bool RemoveChild(wxRichTextObject* child, bool deleteChild = false) ; + + /// Delete all children + bool DeleteChildren() ; + + /// Recursively merge all pieces that can be merged. + bool Defragment(); + +protected: + wxRichTextObjectList m_children; +}; + +/*! + * wxRichTextBox class declaration + * This defines a 2D space to lay out objects + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextBox: public wxRichTextCompositeObject +{ + DECLARE_DYNAMIC_CLASS(wxRichTextBox) +public: +// Constructors + + wxRichTextBox(wxRichTextObject* parent = NULL); + wxRichTextBox(const wxRichTextBox& obj): wxRichTextCompositeObject() { Copy(obj); } + +// Overrideables + + /// Draw the item + virtual bool Draw(wxDC& dc, const wxRichTextRange& range, const wxRichTextRange& selectionRange, const wxRect& rect, int descent, int style); + + /// Lay the item out + virtual bool Layout(wxDC& dc, const wxRect& rect, int style); + + /// Get/set the object size for the given range. Returns false if the range + /// is invalid for this object. + virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, int flags, wxPoint position = wxPoint(0,0)) const; + +// Accessors + +// Operations + + /// Clone + virtual wxRichTextObject* Clone() const { return new wxRichTextBox(*this); } + + /// Copy + void Copy(const wxRichTextBox& obj); + +protected: +}; + +/*! + * wxRichTextParagraphBox class declaration + * This box knows how to lay out paragraphs. + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextParagraphLayoutBox: public wxRichTextBox +{ + DECLARE_DYNAMIC_CLASS(wxRichTextParagraphLayoutBox) +public: +// Constructors + + wxRichTextParagraphLayoutBox(wxRichTextObject* parent = NULL); + wxRichTextParagraphLayoutBox(const wxRichTextParagraphLayoutBox& obj): wxRichTextBox() { Init(); Copy(obj); } + +// Overrideables + + /// Draw the item + virtual bool Draw(wxDC& dc, const wxRichTextRange& range, const wxRichTextRange& selectionRange, const wxRect& rect, int descent, int style); + + /// Lay the item out + virtual bool Layout(wxDC& dc, const wxRect& rect, int style); + + /// Get/set the object size for the given range. Returns false if the range + /// is invalid for this object. + virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, int flags, wxPoint position = wxPoint(0,0)) const; + + /// Delete range + virtual bool DeleteRange(const wxRichTextRange& range); + + /// Get any text in this object for the given range + virtual wxString GetTextForRange(const wxRichTextRange& range) const; + +// Accessors + + /// Associate a control with the buffer, for operations that for example require refreshing the window. + void SetRichTextCtrl(wxRichTextCtrl* ctrl) { m_ctrl = ctrl; } + + /// Get the associated control. + wxRichTextCtrl* GetRichTextCtrl() const { return m_ctrl; } + + /// Get/set whether the last paragraph is partial or complete + void SetPartialParagraph(bool partialPara) { m_partialParagraph = partialPara; } + bool GetPartialParagraph() const { return m_partialParagraph; } + + /// If this is a buffer, returns the current style sheet. The base layout box + /// class doesn't have an associated style sheet. + virtual wxRichTextStyleSheet* GetStyleSheet() const { return NULL; } + +// Operations + + /// Initialize the object. + void Init(); + + /// Clear all children + virtual void Clear(); + + /// Clear and initialize with one blank paragraph + virtual void Reset(); + + /// Convenience function to add a paragraph of text + virtual wxRichTextRange AddParagraph(const wxString& text, wxTextAttrEx* paraStyle = NULL); + + /// Convenience function to add an image + virtual wxRichTextRange AddImage(const wxImage& image, wxTextAttrEx* paraStyle = NULL); + + /// Adds multiple paragraphs, based on newlines. + virtual wxRichTextRange AddParagraphs(const wxString& text, wxTextAttrEx* paraStyle = NULL); + + /// Get the line at the given position. If caretPosition is true, the position is + /// a caret position, which is normally a smaller number. + virtual wxRichTextLine* GetLineAtPosition(long pos, bool caretPosition = false) const; + + /// Get the line at the given y pixel position, or the last line. + virtual wxRichTextLine* GetLineAtYPosition(int y) const; + + /// Get the paragraph at the given character or caret position + virtual wxRichTextParagraph* GetParagraphAtPosition(long pos, bool caretPosition = false) const; + + /// Get the line size at the given position + virtual wxSize GetLineSizeAtPosition(long pos, bool caretPosition = false) const; + + /// Given a position, get the number of the visible line (potentially many to a paragraph), + /// starting from zero at the start of the buffer. We also have to pass a bool (startOfLine) + /// that indicates whether the caret is being shown at the end of the previous line or at the start + /// of the next, since the caret can be shown at 2 visible positions for the same underlying + /// position. + virtual long GetVisibleLineNumber(long pos, bool caretPosition = false, bool startOfLine = false) const; + + /// Given a line number, get the corresponding wxRichTextLine object. + virtual wxRichTextLine* GetLineForVisibleLineNumber(long lineNumber) const; + + /// Get the leaf object in a paragraph at this position. + /// Given a line number, get the corresponding wxRichTextLine object. + virtual wxRichTextObject* GetLeafObjectAtPosition(long position) const; + + /// Get the paragraph by number + virtual wxRichTextParagraph* GetParagraphAtLine(long paragraphNumber) const; + + /// Get the paragraph for a given line + virtual wxRichTextParagraph* GetParagraphForLine(wxRichTextLine* line) const; + + /// Get the length of the paragraph + virtual int GetParagraphLength(long paragraphNumber) const; + + /// Get the number of paragraphs + virtual int GetParagraphCount() const { return GetChildCount(); } + + /// Get the number of visible lines + virtual int GetLineCount() const; + + /// Get the text of the paragraph + virtual wxString GetParagraphText(long paragraphNumber) const; + + /// Convert zero-based line column and paragraph number to a position. + virtual long XYToPosition(long x, long y) const; + + /// Convert zero-based position to line column and paragraph number + virtual bool PositionToXY(long pos, long* x, long* y) const; + + /// Set text attributes: character and/or paragraph styles. + virtual bool SetStyle(const wxRichTextRange& range, const wxRichTextAttr& style, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO); + virtual bool SetStyle(const wxRichTextRange& range, const wxTextAttrEx& style, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO); + + /// Get the conbined text attributes for this position. + virtual bool GetStyle(long position, wxTextAttrEx& style); + virtual bool GetStyle(long position, wxRichTextAttr& style); + + /// Get the content (uncombined) attributes for this position. + virtual bool GetUncombinedStyle(long position, wxTextAttrEx& style); + virtual bool GetUncombinedStyle(long position, wxRichTextAttr& style); + + /// Implementation helper for GetStyle. If combineStyles is true, combine base, paragraph and + /// context attributes. + virtual bool DoGetStyle(long position, wxTextAttrEx& style, bool combineStyles = true); + + /// Get the combined style for a range - if any attribute is different within the range, + /// that attribute is not present within the flags + virtual bool GetStyleForRange(const wxRichTextRange& range, wxTextAttrEx& style); + + /// Combines 'style' with 'currentStyle' for the purpose of summarising the attributes of a range of + /// content. + bool CollectStyle(wxTextAttrEx& currentStyle, const wxTextAttrEx& style, long& multipleStyleAttributes, int& multipleTextEffectAttributes); + + /// Set list style + virtual bool SetListStyle(const wxRichTextRange& range, wxRichTextListStyleDefinition* def, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO, int startFrom = 1, int specifiedLevel = -1); + virtual bool SetListStyle(const wxRichTextRange& range, const wxString& defName, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO, int startFrom = 1, int specifiedLevel = -1); + + /// Clear list for given range + virtual bool ClearListStyle(const wxRichTextRange& range, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO); + + /// Number/renumber any list elements in the given range. + /// def/defName can be NULL/empty to indicate that the existing list style should be used. + virtual bool NumberList(const wxRichTextRange& range, wxRichTextListStyleDefinition* def = NULL, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO, int startFrom = 1, int specifiedLevel = -1); + virtual bool NumberList(const wxRichTextRange& range, const wxString& defName, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO, int startFrom = 1, int specifiedLevel = -1); + + /// Promote the list items within the given range. promoteBy can be a positive or negative number, e.g. 1 or -1 + /// def/defName can be NULL/empty to indicate that the existing list style should be used. + virtual bool PromoteList(int promoteBy, const wxRichTextRange& range, wxRichTextListStyleDefinition* def = NULL, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO, int specifiedLevel = -1); + virtual bool PromoteList(int promoteBy, const wxRichTextRange& range, const wxString& defName, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO, int specifiedLevel = -1); + + /// Helper for NumberList and PromoteList, that does renumbering and promotion simultaneously + /// def/defName can be NULL/empty to indicate that the existing list style should be used. + virtual bool DoNumberList(const wxRichTextRange& range, const wxRichTextRange& promotionRange, int promoteBy, wxRichTextListStyleDefinition* def, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO, int startFrom = 1, int specifiedLevel = -1); + + /// Fills in the attributes for numbering a paragraph after previousParagraph. + virtual bool FindNextParagraphNumber(wxRichTextParagraph* previousParagraph, wxRichTextAttr& attr) const; + + /// Test if this whole range has character attributes of the specified kind. If any + /// of the attributes are different within the range, the test fails. You + /// can use this to implement, for example, bold button updating. style must have + /// flags indicating which attributes are of interest. + virtual bool HasCharacterAttributes(const wxRichTextRange& range, const wxTextAttrEx& style) const; + virtual bool HasCharacterAttributes(const wxRichTextRange& range, const wxRichTextAttr& style) const; + + /// Test if this whole range has paragraph attributes of the specified kind. If any + /// of the attributes are different within the range, the test fails. You + /// can use this to implement, for example, centering button updating. style must have + /// flags indicating which attributes are of interest. + virtual bool HasParagraphAttributes(const wxRichTextRange& range, const wxTextAttrEx& style) const; + virtual bool HasParagraphAttributes(const wxRichTextRange& range, const wxRichTextAttr& style) const; + + /// Clone + virtual wxRichTextObject* Clone() const { return new wxRichTextParagraphLayoutBox(*this); } + + /// Insert fragment into this box at the given position. If partialParagraph is true, + /// it is assumed that the last (or only) paragraph is just a piece of data with no paragraph + /// marker. + virtual bool InsertFragment(long position, wxRichTextParagraphLayoutBox& fragment); + + /// Make a copy of the fragment corresponding to the given range, putting it in 'fragment'. + virtual bool CopyFragment(const wxRichTextRange& range, wxRichTextParagraphLayoutBox& fragment); + + /// Apply the style sheet to the buffer, for example if the styles have changed. + virtual bool ApplyStyleSheet(wxRichTextStyleSheet* styleSheet); + + /// Copy + void Copy(const wxRichTextParagraphLayoutBox& obj); + + /// Assignment + void operator= (const wxRichTextParagraphLayoutBox& obj) { Copy(obj); } + + /// Calculate ranges + virtual void UpdateRanges() { long end; CalculateRange(0, end); } + + /// Get all the text + virtual wxString GetText() const; + + /// Set default style for new content. Setting it to a default attribute + /// makes new content take on the 'basic' style. + virtual bool SetDefaultStyle(const wxTextAttrEx& style); + + /// Get default style + virtual const wxTextAttrEx& GetDefaultStyle() const { return m_defaultAttributes; } + + /// Set basic (overall) style + virtual void SetBasicStyle(const wxTextAttrEx& style) { m_attributes = style; } + virtual void SetBasicStyle(const wxRichTextAttr& style) { m_attributes = style; } + + /// Get basic (overall) style + virtual const wxTextAttrEx& GetBasicStyle() const { return m_attributes; } + + /// Invalidate the buffer. With no argument, invalidates whole buffer. + void Invalidate(const wxRichTextRange& invalidRange = wxRICHTEXT_ALL); + + /// Get invalid range, rounding to entire paragraphs if argument is true. + wxRichTextRange GetInvalidRange(bool wholeParagraphs = false) const; + +protected: + wxRichTextCtrl* m_ctrl; + wxTextAttrEx m_defaultAttributes; + + /// The invalidated range that will need full layout + wxRichTextRange m_invalidRange; + + // Is the last paragraph partial or complete? + bool m_partialParagraph; +}; + +/*! + * wxRichTextLine class declaration + * This object represents a line in a paragraph, and stores + * offsets from the start of the paragraph representing the + * start and end positions of the line. + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextLine +{ +public: +// Constructors + + wxRichTextLine(wxRichTextParagraph* parent); + wxRichTextLine(const wxRichTextLine& obj) { Init( NULL); Copy(obj); } + virtual ~wxRichTextLine() {} + +// Overrideables + +// Accessors + + /// Set the range + void SetRange(const wxRichTextRange& range) { m_range = range; } + void SetRange(long from, long to) { m_range = wxRichTextRange(from, to); } + + /// Get the parent paragraph + wxRichTextParagraph* GetParent() { return m_parent; } + + /// Get the range + const wxRichTextRange& GetRange() const { return m_range; } + wxRichTextRange& GetRange() { return m_range; } + + /// Get the absolute range + wxRichTextRange GetAbsoluteRange() const; + + /// Get/set the line size as calculated by Layout. + virtual wxSize GetSize() const { return m_size; } + virtual void SetSize(const wxSize& sz) { m_size = sz; } + + /// Get/set the object position relative to the parent + virtual wxPoint GetPosition() const { return m_pos; } + virtual void SetPosition(const wxPoint& pos) { m_pos = pos; } + + /// Get the absolute object position + virtual wxPoint GetAbsolutePosition() const; + + /// Get the rectangle enclosing the line + virtual wxRect GetRect() const { return wxRect(GetAbsolutePosition(), GetSize()); } + + /// Set/get stored descent + void SetDescent(int descent) { m_descent = descent; } + int GetDescent() const { return m_descent; } + +// Operations + + /// Initialisation + void Init(wxRichTextParagraph* parent); + + /// Copy + void Copy(const wxRichTextLine& obj); + + /// Clone + virtual wxRichTextLine* Clone() const { return new wxRichTextLine(*this); } + +protected: + + /// The range of the line (start position to end position) + /// This is relative to the parent paragraph. + wxRichTextRange m_range; + + /// Size and position measured relative to top of paragraph + wxPoint m_pos; + wxSize m_size; + + /// Maximum descent for this line (location of text baseline) + int m_descent; + + // The parent object + wxRichTextParagraph* m_parent; +}; + +WX_DECLARE_LIST_WITH_DECL( wxRichTextLine, wxRichTextLineList , class WXDLLIMPEXP_RICHTEXT ); + +/*! + * wxRichTextParagraph class declaration + * This object represents a single paragraph (or in a straight text editor, a line). + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextParagraph: public wxRichTextBox +{ + DECLARE_DYNAMIC_CLASS(wxRichTextParagraph) +public: +// Constructors + + wxRichTextParagraph(wxRichTextObject* parent = NULL, wxTextAttrEx* style = NULL); + wxRichTextParagraph(const wxString& text, wxRichTextObject* parent = NULL, wxTextAttrEx* paraStyle = NULL, wxTextAttrEx* charStyle = NULL); + virtual ~wxRichTextParagraph(); + wxRichTextParagraph(const wxRichTextParagraph& obj): wxRichTextBox() { Copy(obj); } + +// Overrideables + + /// Draw the item + virtual bool Draw(wxDC& dc, const wxRichTextRange& range, const wxRichTextRange& selectionRange, const wxRect& rect, int descent, int style); + + /// Lay the item out + virtual bool Layout(wxDC& dc, const wxRect& rect, int style); + + /// Get/set the object size for the given range. Returns false if the range + /// is invalid for this object. + virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, int flags, wxPoint position = wxPoint(0,0)) const; + + /// Finds the absolute position and row height for the given character position + virtual bool FindPosition(wxDC& dc, long index, wxPoint& pt, int* height, bool forceLineStart); + + /// Hit-testing: returns a flag indicating hit test details, plus + /// information about position + virtual int HitTest(wxDC& dc, const wxPoint& pt, long& textPosition); + + /// Calculate range + virtual void CalculateRange(long start, long& end); + +// Accessors + + /// Get the cached lines + wxRichTextLineList& GetLines() { return m_cachedLines; } + +// Operations + + /// Copy + void Copy(const wxRichTextParagraph& obj); + + /// Clone + virtual wxRichTextObject* Clone() const { return new wxRichTextParagraph(*this); } + + /// Clear the cached lines + void ClearLines(); + +// Implementation + + /// Apply paragraph styles such as centering to the wrapped lines + virtual void ApplyParagraphStyle(const wxTextAttrEx& attr, const wxRect& rect); + + /// Insert text at the given position + virtual bool InsertText(long pos, const wxString& text); + + /// Split an object at this position if necessary, and return + /// the previous object, or NULL if inserting at beginning. + virtual wxRichTextObject* SplitAt(long pos, wxRichTextObject** previousObject = NULL); + + /// Move content to a list from this point + virtual void MoveToList(wxRichTextObject* obj, wxList& list); + + /// Add content back from list + virtual void MoveFromList(wxList& list); + + /// Get the plain text searching from the start or end of the range. + /// The resulting string may be shorter than the range given. + bool GetContiguousPlainText(wxString& text, const wxRichTextRange& range, bool fromStart = true); + + /// Find a suitable wrap position. wrapPosition is the last position in the line to the left + /// of the split. + bool FindWrapPosition(const wxRichTextRange& range, wxDC& dc, int availableSpace, long& wrapPosition); + + /// Find the object at the given position + wxRichTextObject* FindObjectAtPosition(long position); + + /// Get the bullet text for this paragraph. + wxString GetBulletText(); + + /// Allocate or reuse a line object + wxRichTextLine* AllocateLine(int pos); + + /// Clear remaining unused line objects, if any + bool ClearUnusedLines(int lineCount); + + /// Get combined attributes of the base style, paragraph style and character style. We use this to dynamically + /// retrieve the actual style. + wxTextAttrEx GetCombinedAttributes(const wxTextAttrEx& contentStyle) const; + + /// Get combined attributes of the base style and paragraph style. + wxTextAttrEx GetCombinedAttributes() const; + + /// Get the first position from pos that has a line break character. + long GetFirstLineBreakPosition(long pos); + + /// Create default tabstop array + static void InitDefaultTabs(); + + /// Clear default tabstop array + static void ClearDefaultTabs(); + + /// Get default tabstop array + static const wxArrayInt& GetDefaultTabs() { return sm_defaultTabs; } + +protected: + /// The lines that make up the wrapped paragraph + wxRichTextLineList m_cachedLines; + + /// Default tabstops + static wxArrayInt sm_defaultTabs; +}; + +/*! + * wxRichTextPlainText class declaration + * This object represents a single piece of text. + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextPlainText: public wxRichTextObject +{ + DECLARE_DYNAMIC_CLASS(wxRichTextPlainText) +public: +// Constructors + + wxRichTextPlainText(const wxString& text = wxEmptyString, wxRichTextObject* parent = NULL, wxTextAttrEx* style = NULL); + wxRichTextPlainText(const wxRichTextPlainText& obj): wxRichTextObject() { Copy(obj); } + +// Overrideables + + /// Draw the item + virtual bool Draw(wxDC& dc, const wxRichTextRange& range, const wxRichTextRange& selectionRange, const wxRect& rect, int descent, int style); + + /// Lay the item out + virtual bool Layout(wxDC& dc, const wxRect& rect, int style); + + /// Get/set the object size for the given range. Returns false if the range + /// is invalid for this object. + virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, int flags, wxPoint position/* = wxPoint(0,0)*/) const; + + /// Get any text in this object for the given range + virtual wxString GetTextForRange(const wxRichTextRange& range) const; + + /// Do a split, returning an object containing the second part, and setting + /// the first part in 'this'. + virtual wxRichTextObject* DoSplit(long pos); + + /// Calculate range + virtual void CalculateRange(long start, long& end); + + /// Delete range + virtual bool DeleteRange(const wxRichTextRange& range); + + /// Returns true if the object is empty + virtual bool IsEmpty() const { return m_text.empty(); } + + /// Returns true if this object can merge itself with the given one. + virtual bool CanMerge(wxRichTextObject* object) const; + + /// Returns true if this object merged itself with the given one. + /// The calling code will then delete the given object. + virtual bool Merge(wxRichTextObject* object); + + /// Dump to output stream for debugging + virtual void Dump(wxTextOutputStream& stream); + + /// Get the first position from pos that has a line break character. + long GetFirstLineBreakPosition(long pos); + +// Accessors + + /// Get the text + const wxString& GetText() const { return m_text; } + + /// Set the text + void SetText(const wxString& text) { m_text = text; } + +// Operations + + /// Copy + void Copy(const wxRichTextPlainText& obj); + + /// Clone + virtual wxRichTextObject* Clone() const { return new wxRichTextPlainText(*this); } +private: + bool DrawTabbedString(wxDC& dc, const wxTextAttrEx& attr, const wxRect& rect, wxString& str, wxCoord& x, wxCoord& y, bool selected); + +protected: + wxString m_text; +}; + +/*! + * wxRichTextImageBlock stores information about an image, in binary in-memory form + */ + +class WXDLLIMPEXP_BASE wxDataInputStream; +class WXDLLIMPEXP_BASE wxDataOutputStream; + +class WXDLLIMPEXP_RICHTEXT wxRichTextImageBlock: public wxObject +{ +public: + wxRichTextImageBlock(); + wxRichTextImageBlock(const wxRichTextImageBlock& block); + virtual ~wxRichTextImageBlock(); + + void Init(); + void Clear(); + + // Load the original image into a memory block. + // If the image is not a JPEG, we must convert it into a JPEG + // to conserve space. + // If it's not a JPEG we can make use of 'image', already scaled, so we don't have to + // load the image a 2nd time. + virtual bool MakeImageBlock(const wxString& filename, int imageType, wxImage& image, bool convertToJPEG = true); + + // Make an image block from the wxImage in the given + // format. + virtual bool MakeImageBlock(wxImage& image, int imageType, int quality = 80); + + // Write to a file + bool Write(const wxString& filename); + + // Write data in hex to a stream + bool WriteHex(wxOutputStream& stream); + + // Read data in hex from a stream + bool ReadHex(wxInputStream& stream, int length, int imageType); + + // Copy from 'block' + void Copy(const wxRichTextImageBlock& block); + + // Load a wxImage from the block + bool Load(wxImage& image); + +//// Operators + void operator=(const wxRichTextImageBlock& block); + +//// Accessors + + unsigned char* GetData() const { return m_data; } + size_t GetDataSize() const { return m_dataSize; } + int GetImageType() const { return m_imageType; } + + void SetData(unsigned char* image) { m_data = image; } + void SetDataSize(size_t size) { m_dataSize = size; } + void SetImageType(int imageType) { m_imageType = imageType; } + + bool Ok() const { return IsOk(); } + bool IsOk() const { return GetData() != NULL; } + + // Gets the extension for the block's type + wxString GetExtension() const; + +/// Implementation + + // Allocate and read from stream as a block of memory + static unsigned char* ReadBlock(wxInputStream& stream, size_t size); + static unsigned char* ReadBlock(const wxString& filename, size_t size); + + // Write memory block to stream + static bool WriteBlock(wxOutputStream& stream, unsigned char* block, size_t size); + + // Write memory block to file + static bool WriteBlock(const wxString& filename, unsigned char* block, size_t size); + +protected: + // Size in bytes of the image stored. + // This is in the raw, original form such as a JPEG file. + unsigned char* m_data; + size_t m_dataSize; + int m_imageType; // wxWin type id +}; + + +/*! + * wxRichTextImage class declaration + * This object represents an image. + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextImage: public wxRichTextObject +{ + DECLARE_DYNAMIC_CLASS(wxRichTextImage) +public: +// Constructors + + wxRichTextImage(wxRichTextObject* parent = NULL): wxRichTextObject(parent) { } + wxRichTextImage(const wxImage& image, wxRichTextObject* parent = NULL, wxTextAttrEx* charStyle = NULL); + wxRichTextImage(const wxRichTextImageBlock& imageBlock, wxRichTextObject* parent = NULL, wxTextAttrEx* charStyle = NULL); + wxRichTextImage(const wxRichTextImage& obj): wxRichTextObject() { Copy(obj); } + +// Overrideables + + /// Draw the item + virtual bool Draw(wxDC& dc, const wxRichTextRange& range, const wxRichTextRange& selectionRange, const wxRect& rect, int descent, int style); + + /// Lay the item out + virtual bool Layout(wxDC& dc, const wxRect& rect, int style); + + /// Get the object size for the given range. Returns false if the range + /// is invalid for this object. + virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, int flags, wxPoint position = wxPoint(0,0)) const; + + /// Returns true if the object is empty + virtual bool IsEmpty() const { return !m_image.Ok(); } + +// Accessors + + /// Get the image + const wxImage& GetImage() const { return m_image; } + + /// Set the image + void SetImage(const wxImage& image) { m_image = image; } + + /// Get the image block containing the raw data + wxRichTextImageBlock& GetImageBlock() { return m_imageBlock; } + +// Operations + + /// Copy + void Copy(const wxRichTextImage& obj); + + /// Clone + virtual wxRichTextObject* Clone() const { return new wxRichTextImage(*this); } + + /// Load wxImage from the block + virtual bool LoadFromBlock(); + + /// Make block from the wxImage + virtual bool MakeBlock(); + +protected: + // TODO: reduce the multiple representations of data + wxImage m_image; + wxBitmap m_bitmap; + wxRichTextImageBlock m_imageBlock; +}; + + +/*! + * wxRichTextBuffer class declaration + * This is a kind of box, used to represent the whole buffer + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextCommand; +class WXDLLIMPEXP_RICHTEXT wxRichTextAction; + +class WXDLLIMPEXP_RICHTEXT wxRichTextBuffer: public wxRichTextParagraphLayoutBox +{ + DECLARE_DYNAMIC_CLASS(wxRichTextBuffer) +public: +// Constructors + + wxRichTextBuffer() { Init(); } + wxRichTextBuffer(const wxRichTextBuffer& obj): wxRichTextParagraphLayoutBox() { Init(); Copy(obj); } + virtual ~wxRichTextBuffer() ; + +// Accessors + + /// Gets the command processor + wxCommandProcessor* GetCommandProcessor() const { return m_commandProcessor; } + + /// Set style sheet, if any. + void SetStyleSheet(wxRichTextStyleSheet* styleSheet) { m_styleSheet = styleSheet; } + virtual wxRichTextStyleSheet* GetStyleSheet() const { return m_styleSheet; } + + /// Set style sheet and notify of the change + bool SetStyleSheetAndNotify(wxRichTextStyleSheet* sheet); + + /// Push style sheet to top of stack + bool PushStyleSheet(wxRichTextStyleSheet* styleSheet); + + /// Pop style sheet from top of stack + wxRichTextStyleSheet* PopStyleSheet(); + +// Operations + + /// Initialisation + void Init(); + + /// Clears the buffer, adds an empty paragraph, and clears the command processor. + virtual void ResetAndClearCommands(); + + /// Load a file + virtual bool LoadFile(const wxString& filename, int type = wxRICHTEXT_TYPE_ANY); + + /// Save a file + virtual bool SaveFile(const wxString& filename, int type = wxRICHTEXT_TYPE_ANY); + + /// Load from a stream + virtual bool LoadFile(wxInputStream& stream, int type = wxRICHTEXT_TYPE_ANY); + + /// Save to a stream + virtual bool SaveFile(wxOutputStream& stream, int type = wxRICHTEXT_TYPE_ANY); + + /// Set the handler flags, controlling loading and saving + void SetHandlerFlags(int flags) { m_handlerFlags = flags; } + + /// Get the handler flags, controlling loading and saving + int GetHandlerFlags() const { return m_handlerFlags; } + + /// Convenience function to add a paragraph of text + virtual wxRichTextRange AddParagraph(const wxString& text, wxTextAttrEx* paraStyle = NULL) { Modify(); return wxRichTextParagraphLayoutBox::AddParagraph(text, paraStyle); } + + /// Begin collapsing undo/redo commands. Note that this may not work properly + /// if combining commands that delete or insert content, changing ranges for + /// subsequent actions. + virtual bool BeginBatchUndo(const wxString& cmdName); + + /// End collapsing undo/redo commands + virtual bool EndBatchUndo(); + + /// Collapsing commands? + virtual bool BatchingUndo() const { return m_batchedCommandDepth > 0; } + + /// Submit immediately, or delay according to whether collapsing is on + virtual bool SubmitAction(wxRichTextAction* action); + + /// Get collapsed command + virtual wxRichTextCommand* GetBatchedCommand() const { return m_batchedCommand; } + + /// Begin suppressing undo/redo commands. The way undo is suppressed may be implemented + /// differently by each command. If not dealt with by a command implementation, then + /// it will be implemented automatically by not storing the command in the undo history + /// when the action is submitted to the command processor. + virtual bool BeginSuppressUndo(); + + /// End suppressing undo/redo commands. + virtual bool EndSuppressUndo(); + + /// Collapsing commands? + virtual bool SuppressingUndo() const { return m_suppressUndo > 0; } + + /// Copy the range to the clipboard + virtual bool CopyToClipboard(const wxRichTextRange& range); + + /// Paste the clipboard content to the buffer + virtual bool PasteFromClipboard(long position); + + /// Can we paste from the clipboard? + virtual bool CanPasteFromClipboard() const; + + /// Begin using a style + virtual bool BeginStyle(const wxTextAttrEx& style); + + /// End the style + virtual bool EndStyle(); + + /// End all styles + virtual bool EndAllStyles(); + + /// Clear the style stack + virtual void ClearStyleStack(); + + /// Get the size of the style stack, for example to check correct nesting + virtual size_t GetStyleStackSize() const { return m_attributeStack.GetCount(); } + + /// Begin using bold + bool BeginBold(); + + /// End using bold + bool EndBold() { return EndStyle(); } + + /// Begin using italic + bool BeginItalic(); + + /// End using italic + bool EndItalic() { return EndStyle(); } + + /// Begin using underline + bool BeginUnderline(); + + /// End using underline + bool EndUnderline() { return EndStyle(); } + + /// Begin using point size + bool BeginFontSize(int pointSize); + + /// End using point size + bool EndFontSize() { return EndStyle(); } + + /// Begin using this font + bool BeginFont(const wxFont& font); + + /// End using a font + bool EndFont() { return EndStyle(); } + + /// Begin using this colour + bool BeginTextColour(const wxColour& colour); + + /// End using a colour + bool EndTextColour() { return EndStyle(); } + + /// Begin using alignment + bool BeginAlignment(wxTextAttrAlignment alignment); + + /// End alignment + bool EndAlignment() { return EndStyle(); } + + /// Begin left indent + bool BeginLeftIndent(int leftIndent, int leftSubIndent = 0); + + /// End left indent + bool EndLeftIndent() { return EndStyle(); } + + /// Begin right indent + bool BeginRightIndent(int rightIndent); + + /// End right indent + bool EndRightIndent() { return EndStyle(); } + + /// Begin paragraph spacing + bool BeginParagraphSpacing(int before, int after); + + /// End paragraph spacing + bool EndParagraphSpacing() { return EndStyle(); } + + /// Begin line spacing + bool BeginLineSpacing(int lineSpacing); + + /// End line spacing + bool EndLineSpacing() { return EndStyle(); } + + /// Begin numbered bullet + bool BeginNumberedBullet(int bulletNumber, int leftIndent, int leftSubIndent, int bulletStyle = wxTEXT_ATTR_BULLET_STYLE_ARABIC|wxTEXT_ATTR_BULLET_STYLE_PERIOD); + + /// End numbered bullet + bool EndNumberedBullet() { return EndStyle(); } + + /// Begin symbol bullet + bool BeginSymbolBullet(const wxString& symbol, int leftIndent, int leftSubIndent, int bulletStyle = wxTEXT_ATTR_BULLET_STYLE_SYMBOL); + + /// End symbol bullet + bool EndSymbolBullet() { return EndStyle(); } + + /// Begin standard bullet + bool BeginStandardBullet(const wxString& bulletName, int leftIndent, int leftSubIndent, int bulletStyle = wxTEXT_ATTR_BULLET_STYLE_STANDARD); + + /// End standard bullet + bool EndStandardBullet() { return EndStyle(); } + + /// Begin named character style + bool BeginCharacterStyle(const wxString& characterStyle); + + /// End named character style + bool EndCharacterStyle() { return EndStyle(); } + + /// Begin named paragraph style + bool BeginParagraphStyle(const wxString& paragraphStyle); + + /// End named character style + bool EndParagraphStyle() { return EndStyle(); } + + /// Begin named list style + bool BeginListStyle(const wxString& listStyle, int level = 1, int number = 1); + + /// End named character style + bool EndListStyle() { return EndStyle(); } + + /// Begin URL + bool BeginURL(const wxString& url, const wxString& characterStyle = wxEmptyString); + + /// End URL + bool EndURL() { return EndStyle(); } + +// Event handling + + /// Add an event handler + bool AddEventHandler(wxEvtHandler* handler); + + /// Remove an event handler + bool RemoveEventHandler(wxEvtHandler* handler, bool deleteHandler = false); + + /// Clear event handlers + void ClearEventHandlers(); + + /// Send event to event handlers. If sendToAll is true, will send to all event handlers, + /// otherwise will stop at the first successful one. + bool SendEvent(wxEvent& event, bool sendToAll = true); + +// Implementation + + /// Copy + void Copy(const wxRichTextBuffer& obj); + + /// Clone + virtual wxRichTextObject* Clone() const { return new wxRichTextBuffer(*this); } + + /// Submit command to insert paragraphs + bool InsertParagraphsWithUndo(long pos, const wxRichTextParagraphLayoutBox& paragraphs, wxRichTextCtrl* ctrl, int flags = 0); + + /// Submit command to insert the given text + bool InsertTextWithUndo(long pos, const wxString& text, wxRichTextCtrl* ctrl, int flags = 0); + + /// Submit command to insert a newline + bool InsertNewlineWithUndo(long pos, wxRichTextCtrl* ctrl, int flags = 0); + + /// Submit command to insert the given image + bool InsertImageWithUndo(long pos, const wxRichTextImageBlock& imageBlock, wxRichTextCtrl* ctrl, int flags = 0); + + /// Submit command to delete this range + bool DeleteRangeWithUndo(const wxRichTextRange& range, wxRichTextCtrl* ctrl); + + /// Mark modified + void Modify(bool modify = true) { m_modified = modify; } + bool IsModified() const { return m_modified; } + + /// Get the style that is appropriate for a new paragraph at this position. + /// If the previous paragraph has a paragraph style name, look up the next-paragraph + /// style. + wxRichTextAttr GetStyleForNewParagraph(long pos, bool caretPosition = false, bool lookUpNewParaStyle=false) const; + + /// Dumps contents of buffer for debugging purposes + virtual void Dump(); + virtual void Dump(wxTextOutputStream& stream) { wxRichTextParagraphLayoutBox::Dump(stream); } + + /// Returns the file handlers + static wxList& GetHandlers() { return sm_handlers; } + + /// Adds a handler to the end + static void AddHandler(wxRichTextFileHandler *handler); + + /// Inserts a handler at the front + static void InsertHandler(wxRichTextFileHandler *handler); + + /// Removes a handler + static bool RemoveHandler(const wxString& name); + + /// Finds a handler by name + static wxRichTextFileHandler *FindHandler(const wxString& name); + + /// Finds a handler by extension and type + static wxRichTextFileHandler *FindHandler(const wxString& extension, int imageType); + + /// Finds a handler by filename or, if supplied, type + static wxRichTextFileHandler *FindHandlerFilenameOrType(const wxString& filename, int imageType); + + /// Finds a handler by type + static wxRichTextFileHandler *FindHandler(int imageType); + + /// Gets a wildcard incorporating all visible handlers. If 'types' is present, + /// will be filled with the file type corresponding to each filter. This can be + /// used to determine the type to pass to LoadFile given a selected filter. + static wxString GetExtWildcard(bool combine = false, bool save = false, wxArrayInt* types = NULL); + + /// Clean up handlers + static void CleanUpHandlers(); + + /// Initialise the standard handlers + static void InitStandardHandlers(); + + /// Get renderer + static wxRichTextRenderer* GetRenderer() { return sm_renderer; } + + /// Set renderer, deleting old one + static void SetRenderer(wxRichTextRenderer* renderer); + + /// Minimum margin between bullet and paragraph in 10ths of a mm + static int GetBulletRightMargin() { return sm_bulletRightMargin; } + static void SetBulletRightMargin(int margin) { sm_bulletRightMargin = margin; } + + /// Factor to multiply by character height to get a reasonable bullet size + static float GetBulletProportion() { return sm_bulletProportion; } + static void SetBulletProportion(float prop) { sm_bulletProportion = prop; } + + /// Scale factor for calculating dimensions + double GetScale() const { return m_scale; } + void SetScale(double scale) { m_scale = scale; } + +protected: + + /// Command processor + wxCommandProcessor* m_commandProcessor; + + /// Has been modified? + bool m_modified; + + /// Collapsed command stack + int m_batchedCommandDepth; + + /// Name for collapsed command + wxString m_batchedCommandsName; + + /// Current collapsed command accumulating actions + wxRichTextCommand* m_batchedCommand; + + /// Whether to suppress undo + int m_suppressUndo; + + /// Style sheet, if any + wxRichTextStyleSheet* m_styleSheet; + + /// List of event handlers that will be notified of events + wxList m_eventHandlers; + + /// Stack of attributes for convenience functions + wxList m_attributeStack; + + /// Flags to be passed to handlers + int m_handlerFlags; + + /// File handlers + static wxList sm_handlers; + + /// Renderer + static wxRichTextRenderer* sm_renderer; + + /// Minimum margin between bullet and paragraph in 10ths of a mm + static int sm_bulletRightMargin; + + /// Factor to multiply by character height to get a reasonable bullet size + static float sm_bulletProportion; + + /// Scaling factor in use: needed to calculate correct dimensions when printing + double m_scale; +}; + +/*! + * The command identifiers + * + */ + +enum wxRichTextCommandId +{ + wxRICHTEXT_INSERT, + wxRICHTEXT_DELETE, + wxRICHTEXT_CHANGE_STYLE +}; + +/*! + * Command classes for undo/redo + * + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextAction; +class WXDLLIMPEXP_RICHTEXT wxRichTextCommand: public wxCommand +{ +public: + // Ctor for one action + wxRichTextCommand(const wxString& name, wxRichTextCommandId id, wxRichTextBuffer* buffer, + wxRichTextCtrl* ctrl, bool ignoreFirstTime = false); + + // Ctor for multiple actions + wxRichTextCommand(const wxString& name); + + virtual ~wxRichTextCommand(); + + bool Do(); + bool Undo(); + + void AddAction(wxRichTextAction* action); + void ClearActions(); + + wxList& GetActions() { return m_actions; } + +protected: + + wxList m_actions; +}; + +/*! + * wxRichTextAction class declaration + * There can be more than one action in a command. + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextAction: public wxObject +{ +public: + wxRichTextAction(wxRichTextCommand* cmd, const wxString& name, wxRichTextCommandId id, wxRichTextBuffer* buffer, + wxRichTextCtrl* ctrl, bool ignoreFirstTime = false); + + virtual ~wxRichTextAction(); + + bool Do(); + bool Undo(); + + /// Update the control appearance + void UpdateAppearance(long caretPosition, bool sendUpdateEvent = false, + wxArrayInt* optimizationLineCharPositions = NULL, wxArrayInt* optimizationLineYPositions = NULL); + + /// Replace the buffer paragraphs with the given fragment. + void ApplyParagraphs(const wxRichTextParagraphLayoutBox& fragment); + + /// Get the fragments + wxRichTextParagraphLayoutBox& GetNewParagraphs() { return m_newParagraphs; } + wxRichTextParagraphLayoutBox& GetOldParagraphs() { return m_oldParagraphs; } + + /// Set/get the position used for e.g. insertion + void SetPosition(long pos) { m_position = pos; } + long GetPosition() const { return m_position; } + + /// Set/get the range for e.g. deletion + void SetRange(const wxRichTextRange& range) { m_range = range; } + const wxRichTextRange& GetRange() const { return m_range; } + + /// Get name + const wxString& GetName() const { return m_name; } + +protected: + // Action name + wxString m_name; + + // Buffer + wxRichTextBuffer* m_buffer; + + // Control + wxRichTextCtrl* m_ctrl; + + // Stores the new paragraphs + wxRichTextParagraphLayoutBox m_newParagraphs; + + // Stores the old paragraphs + wxRichTextParagraphLayoutBox m_oldParagraphs; + + // The affected range + wxRichTextRange m_range; + + // The insertion point for this command + long m_position; + + // Ignore 1st 'Do' operation because we already did it + bool m_ignoreThis; + + // The command identifier + wxRichTextCommandId m_cmdId; +}; + +/*! + * Handler flags + */ + +// Include style sheet when loading and saving +#define wxRICHTEXT_HANDLER_INCLUDE_STYLESHEET 0x0001 + +// Save images to memory file system in HTML handler +#define wxRICHTEXT_HANDLER_SAVE_IMAGES_TO_MEMORY 0x0010 + +// Save images to files in HTML handler +#define wxRICHTEXT_HANDLER_SAVE_IMAGES_TO_FILES 0x0020 + +// Save images as inline base64 data in HTML handler +#define wxRICHTEXT_HANDLER_SAVE_IMAGES_TO_BASE64 0x0040 + +// Don't write header and footer (or BODY), so we can include the fragment +// in a larger document +#define wxRICHTEXT_HANDLER_NO_HEADER_FOOTER 0x0080 + +/*! + * wxRichTextFileHandler + * Base class for file handlers + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextFileHandler: public wxObject +{ + DECLARE_CLASS(wxRichTextFileHandler) +public: + wxRichTextFileHandler(const wxString& name = wxEmptyString, const wxString& ext = wxEmptyString, int type = 0) + : m_name(name), m_extension(ext), m_type(type), m_flags(0), m_visible(true) + { } + +#if wxUSE_STREAMS + bool LoadFile(wxRichTextBuffer *buffer, wxInputStream& stream) + { return DoLoadFile(buffer, stream); } + bool SaveFile(wxRichTextBuffer *buffer, wxOutputStream& stream) + { return DoSaveFile(buffer, stream); } +#endif + + bool LoadFile(wxRichTextBuffer *buffer, const wxString& filename); + bool SaveFile(wxRichTextBuffer *buffer, const wxString& filename); + + /// Can we handle this filename (if using files)? By default, checks the extension. + virtual bool CanHandle(const wxString& filename) const; + + /// Can we save using this handler? + virtual bool CanSave() const { return false; } + + /// Can we load using this handler? + virtual bool CanLoad() const { return false; } + + /// Should this handler be visible to the user? + virtual bool IsVisible() const { return m_visible; } + virtual void SetVisible(bool visible) { m_visible = visible; } + + /// The name of the nandler + void SetName(const wxString& name) { m_name = name; } + wxString GetName() const { return m_name; } + + /// The default extension to recognise + void SetExtension(const wxString& ext) { m_extension = ext; } + wxString GetExtension() const { return m_extension; } + + /// The handler type + void SetType(int type) { m_type = type; } + int GetType() const { return m_type; } + + /// Flags controlling how loading and saving is done + void SetFlags(int flags) { m_flags = flags; } + int GetFlags() const { return m_flags; } + + /// Encoding to use when saving a file. If empty, a suitable encoding is chosen + void SetEncoding(const wxString& encoding) { m_encoding = encoding; } + const wxString& GetEncoding() const { return m_encoding; } + +protected: + +#if wxUSE_STREAMS + virtual bool DoLoadFile(wxRichTextBuffer *buffer, wxInputStream& stream) = 0; + virtual bool DoSaveFile(wxRichTextBuffer *buffer, wxOutputStream& stream) = 0; +#endif + + wxString m_name; + wxString m_encoding; + wxString m_extension; + int m_type; + int m_flags; + bool m_visible; +}; + +/*! + * wxRichTextPlainTextHandler + * Plain text handler + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextPlainTextHandler: public wxRichTextFileHandler +{ + DECLARE_CLASS(wxRichTextPlainTextHandler) +public: + wxRichTextPlainTextHandler(const wxString& name = wxT("Text"), const wxString& ext = wxT("txt"), int type = wxRICHTEXT_TYPE_TEXT) + : wxRichTextFileHandler(name, ext, type) + { } + + /// Can we save using this handler? + virtual bool CanSave() const { return true; } + + /// Can we load using this handler? + virtual bool CanLoad() const { return true; } + +protected: + +#if wxUSE_STREAMS + virtual bool DoLoadFile(wxRichTextBuffer *buffer, wxInputStream& stream); + virtual bool DoSaveFile(wxRichTextBuffer *buffer, wxOutputStream& stream); +#endif + +}; + +#if wxUSE_DATAOBJ + +/*! + * The data object for a wxRichTextBuffer + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextBufferDataObject: public wxDataObjectSimple +{ +public: + // ctor doesn't copy the pointer, so it shouldn't go away while this object + // is alive + wxRichTextBufferDataObject(wxRichTextBuffer* richTextBuffer = (wxRichTextBuffer*) NULL); + virtual ~wxRichTextBufferDataObject(); + + // after a call to this function, the buffer is owned by the caller and it + // is responsible for deleting it + wxRichTextBuffer* GetRichTextBuffer(); + + // Returns the id for the new data format + static const wxChar* GetRichTextBufferFormatId() { return ms_richTextBufferFormatId; } + + // base class pure virtuals + + virtual wxDataFormat GetPreferredFormat(Direction dir) const; + virtual size_t GetDataSize() const; + virtual bool GetDataHere(void *pBuf) const; + virtual bool SetData(size_t len, const void *buf); + + // prevent warnings + + virtual size_t GetDataSize(const wxDataFormat&) const { return GetDataSize(); } + virtual bool GetDataHere(const wxDataFormat&, void *buf) const { return GetDataHere(buf); } + virtual bool SetData(const wxDataFormat&, size_t len, const void *buf) { return SetData(len, buf); } + +private: + wxDataFormat m_formatRichTextBuffer; // our custom format + wxRichTextBuffer* m_richTextBuffer; // our data + static const wxChar* ms_richTextBufferFormatId; // our format id +}; + +#endif + +/*! + * wxRichTextRenderer isolates common drawing functionality + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextRenderer: public wxObject +{ +public: + wxRichTextRenderer() {} + virtual ~wxRichTextRenderer() {} + + /// Draw a standard bullet, as specified by the value of GetBulletName + virtual bool DrawStandardBullet(wxRichTextParagraph* paragraph, wxDC& dc, const wxTextAttrEx& attr, const wxRect& rect) = 0; + + /// Draw a bullet that can be described by text, such as numbered or symbol bullets + virtual bool DrawTextBullet(wxRichTextParagraph* paragraph, wxDC& dc, const wxTextAttrEx& attr, const wxRect& rect, const wxString& text) = 0; + + /// Draw a bitmap bullet, where the bullet bitmap is specified by the value of GetBulletName + virtual bool DrawBitmapBullet(wxRichTextParagraph* paragraph, wxDC& dc, const wxTextAttrEx& attr, const wxRect& rect) = 0; + + /// Enumerate the standard bullet names currently supported + virtual bool EnumerateStandardBulletNames(wxArrayString& bulletNames) = 0; +}; + +/*! + * wxRichTextStdRenderer: standard renderer + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextStdRenderer: public wxRichTextRenderer +{ +public: + wxRichTextStdRenderer() {} + + /// Draw a standard bullet, as specified by the value of GetBulletName + virtual bool DrawStandardBullet(wxRichTextParagraph* paragraph, wxDC& dc, const wxTextAttrEx& attr, const wxRect& rect); + + /// Draw a bullet that can be described by text, such as numbered or symbol bullets + virtual bool DrawTextBullet(wxRichTextParagraph* paragraph, wxDC& dc, const wxTextAttrEx& attr, const wxRect& rect, const wxString& text); + + /// Draw a bitmap bullet, where the bullet bitmap is specified by the value of GetBulletName + virtual bool DrawBitmapBullet(wxRichTextParagraph* paragraph, wxDC& dc, const wxTextAttrEx& attr, const wxRect& rect); + + /// Enumerate the standard bullet names currently supported + virtual bool EnumerateStandardBulletNames(wxArrayString& bulletNames); +}; + +/*! + * Utilities + * + */ + +inline bool wxRichTextHasStyle(int flags, int style) +{ + return ((flags & style) == style); +} + +/// Compare two attribute objects +WXDLLIMPEXP_RICHTEXT bool wxTextAttrEq(const wxTextAttrEx& attr1, const wxTextAttrEx& attr2); +WXDLLIMPEXP_RICHTEXT bool wxTextAttrEq(const wxTextAttr& attr1, const wxRichTextAttr& attr2); + +/// Compare two attribute objects, but take into account the flags +/// specifying attributes of interest. +WXDLLIMPEXP_RICHTEXT bool wxTextAttrEqPartial(const wxTextAttrEx& attr1, const wxTextAttrEx& attr2, int flags); +WXDLLIMPEXP_RICHTEXT bool wxTextAttrEqPartial(const wxTextAttrEx& attr1, const wxRichTextAttr& attr2, int flags); + +/// Apply one style to another +WXDLLIMPEXP_RICHTEXT bool wxRichTextApplyStyle(wxTextAttrEx& destStyle, const wxTextAttrEx& style); +WXDLLIMPEXP_RICHTEXT bool wxRichTextApplyStyle(wxRichTextAttr& destStyle, const wxTextAttrEx& style); +WXDLLIMPEXP_RICHTEXT bool wxRichTextApplyStyle(wxTextAttrEx& destStyle, const wxRichTextAttr& style, wxRichTextAttr* compareWith = NULL); +WXDLLIMPEXP_RICHTEXT bool wxRichTextApplyStyle(wxRichTextAttr& destStyle, const wxRichTextAttr& style, wxRichTextAttr* compareWith = NULL); + +// Remove attributes +WXDLLIMPEXP_RICHTEXT bool wxRichTextRemoveStyle(wxTextAttrEx& destStyle, const wxRichTextAttr& style); + +/// Combine two bitlists +WXDLLIMPEXP_RICHTEXT bool wxRichTextCombineBitlists(int& valueA, int valueB, int& flagsA, int flagsB); + +/// Compare two bitlists +WXDLLIMPEXP_RICHTEXT bool wxRichTextBitlistsEqPartial(int valueA, int valueB, int flags); + +/// Split into paragraph and character styles +WXDLLIMPEXP_RICHTEXT bool wxRichTextSplitParaCharStyles(const wxTextAttrEx& style, wxTextAttrEx& parStyle, wxTextAttrEx& charStyle); + +/// Compare tabs +WXDLLIMPEXP_RICHTEXT bool wxRichTextTabsEq(const wxArrayInt& tabs1, const wxArrayInt& tabs2); + +/// Set the font without changing the font attributes +WXDLLIMPEXP_RICHTEXT void wxSetFontPreservingStyles(wxTextAttr& attr, const wxFont& font); + +/// Convert a decimal to Roman numerals +WXDLLIMPEXP_RICHTEXT wxString wxRichTextDecimalToRoman(long n); + +WXDLLIMPEXP_RICHTEXT void wxRichTextModuleInit(); + +#endif + // wxUSE_RICHTEXT + +#endif + // _WX_RICHTEXTBUFFER_H_ + diff --git a/Externals/wxWidgets/include/wx/richtext/richtextbulletspage.h b/Externals/wxWidgets/include/wx/richtext/richtextbulletspage.h new file mode 100644 index 0000000000..1e64530ebb --- /dev/null +++ b/Externals/wxWidgets/include/wx/richtext/richtextbulletspage.h @@ -0,0 +1,222 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/richtext/richtextbulletspage.h +// Purpose: +// Author: Julian Smart +// Modified by: +// Created: 10/4/2006 10:32:31 AM +// RCS-ID: $Id: richtextbulletspage.h 42678 2006-10-29 22:01:06Z JS $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _RICHTEXTBULLETSPAGE_H_ +#define _RICHTEXTBULLETSPAGE_H_ + +/*! + * Includes + */ + +////@begin includes +#include "wx/statline.h" +#include "wx/spinctrl.h" +////@end includes + +/*! + * Forward declarations + */ + +////@begin forward declarations +class wxSpinCtrl; +class wxRichTextCtrl; +////@end forward declarations + +/*! + * Control identifiers + */ + +////@begin control identifiers +#define SYMBOL_WXRICHTEXTBULLETSPAGE_STYLE wxRESIZE_BORDER|wxTAB_TRAVERSAL +#define SYMBOL_WXRICHTEXTBULLETSPAGE_TITLE _("wxRichTextBulletsPage") +#define SYMBOL_WXRICHTEXTBULLETSPAGE_IDNAME ID_RICHTEXTBULLETSPAGE +#define SYMBOL_WXRICHTEXTBULLETSPAGE_SIZE wxSize(400, 300) +#define SYMBOL_WXRICHTEXTBULLETSPAGE_POSITION wxDefaultPosition +////@end control identifiers + +/*! + * wxRichTextBulletsPage class declaration + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextBulletsPage: public wxPanel +{ + DECLARE_DYNAMIC_CLASS( wxRichTextBulletsPage ) + DECLARE_EVENT_TABLE() + +public: + /// Constructors + wxRichTextBulletsPage( ); + wxRichTextBulletsPage( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = SYMBOL_WXRICHTEXTBULLETSPAGE_POSITION, const wxSize& size = SYMBOL_WXRICHTEXTBULLETSPAGE_SIZE, long style = SYMBOL_WXRICHTEXTBULLETSPAGE_STYLE ); + + /// Creation + bool Create( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = SYMBOL_WXRICHTEXTBULLETSPAGE_POSITION, const wxSize& size = SYMBOL_WXRICHTEXTBULLETSPAGE_SIZE, long style = SYMBOL_WXRICHTEXTBULLETSPAGE_STYLE ); + + /// Initialise members + void Init(); + + /// Creates the controls and sizers + void CreateControls(); + + /// Updates the bullets preview + void UpdatePreview(); + + /// Transfer data from/to window + virtual bool TransferDataFromWindow(); + virtual bool TransferDataToWindow(); + + /// Gets the attributes associated with the main formatting dialog + wxTextAttrEx* GetAttributes(); + + /// Update for symbol-related controls + void OnSymbolUpdate( wxUpdateUIEvent& event ); + + /// Update for number-related controls + void OnNumberUpdate( wxUpdateUIEvent& event ); + + /// Update for standard bullet-related controls + void OnStandardBulletUpdate( wxUpdateUIEvent& event ); + +////@begin wxRichTextBulletsPage event handler declarations + + /// wxEVT_COMMAND_LISTBOX_SELECTED event handler for ID_RICHTEXTBULLETSPAGE_STYLELISTBOX + void OnStylelistboxSelected( wxCommandEvent& event ); + + /// wxEVT_COMMAND_CHECKBOX_CLICKED event handler for ID_RICHTEXTBULLETSPAGE_PERIODCTRL + void OnPeriodctrlClick( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTBULLETSPAGE_PERIODCTRL + void OnPeriodctrlUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_COMMAND_CHECKBOX_CLICKED event handler for ID_RICHTEXTBULLETSPAGE_PARENTHESESCTRL + void OnParenthesesctrlClick( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTBULLETSPAGE_PARENTHESESCTRL + void OnParenthesesctrlUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_COMMAND_CHECKBOX_CLICKED event handler for ID_RICHTEXTBULLETSPAGE_RIGHTPARENTHESISCTRL + void OnRightParenthesisCtrlClick( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTBULLETSPAGE_RIGHTPARENTHESISCTRL + void OnRightParenthesisCtrlUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_COMMAND_COMBOBOX_SELECTED event handler for ID_RICHTEXTBULLETSPAGE_BULLETALIGNMENTCTRL + void OnBulletAlignmentCtrlSelected( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTBULLETSPAGE_SYMBOLSTATIC + void OnSymbolstaticUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_COMMAND_COMBOBOX_SELECTED event handler for ID_RICHTEXTBULLETSPAGE_SYMBOLCTRL + void OnSymbolctrlSelected( wxCommandEvent& event ); + + /// wxEVT_COMMAND_TEXT_UPDATED event handler for ID_RICHTEXTBULLETSPAGE_SYMBOLCTRL + void OnSymbolctrlUpdated( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTBULLETSPAGE_SYMBOLCTRL + void OnSymbolctrlUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_RICHTEXTBULLETSPAGE_CHOOSE_SYMBOL + void OnChooseSymbolClick( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTBULLETSPAGE_CHOOSE_SYMBOL + void OnChooseSymbolUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_COMMAND_COMBOBOX_SELECTED event handler for ID_RICHTEXTBULLETSPAGE_SYMBOLFONTCTRL + void OnSymbolfontctrlSelected( wxCommandEvent& event ); + + /// wxEVT_COMMAND_TEXT_UPDATED event handler for ID_RICHTEXTBULLETSPAGE_SYMBOLFONTCTRL + void OnSymbolfontctrlUpdated( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTBULLETSPAGE_SYMBOLFONTCTRL + void OnSymbolfontctrlUIUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTBULLETSPAGE_NAMESTATIC + void OnNamestaticUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_COMMAND_COMBOBOX_SELECTED event handler for ID_RICHTEXTBULLETSPAGE_NAMECTRL + void OnNamectrlSelected( wxCommandEvent& event ); + + /// wxEVT_COMMAND_TEXT_UPDATED event handler for ID_RICHTEXTBULLETSPAGE_NAMECTRL + void OnNamectrlUpdated( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTBULLETSPAGE_NAMECTRL + void OnNamectrlUIUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTBULLETSPAGE_NUMBERSTATIC + void OnNumberstaticUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_COMMAND_SPINCTRL_UPDATED event handler for ID_RICHTEXTBULLETSPAGE_NUMBERCTRL + void OnNumberctrlUpdated( wxSpinEvent& event ); + + /// wxEVT_SCROLL_LINEUP event handler for ID_RICHTEXTBULLETSPAGE_NUMBERCTRL + void OnNumberctrlUp( wxSpinEvent& event ); + + /// wxEVT_SCROLL_LINEDOWN event handler for ID_RICHTEXTBULLETSPAGE_NUMBERCTRL + void OnNumberctrlDown( wxSpinEvent& event ); + + /// wxEVT_COMMAND_TEXT_UPDATED event handler for ID_RICHTEXTBULLETSPAGE_NUMBERCTRL + void OnNumberctrlTextUpdated( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTBULLETSPAGE_NUMBERCTRL + void OnNumberctrlUpdate( wxUpdateUIEvent& event ); + +////@end wxRichTextBulletsPage event handler declarations + +////@begin wxRichTextBulletsPage member function declarations + + /// Retrieves bitmap resources + wxBitmap GetBitmapResource( const wxString& name ); + + /// Retrieves icon resources + wxIcon GetIconResource( const wxString& name ); +////@end wxRichTextBulletsPage member function declarations + + /// Should we show tooltips? + static bool ShowToolTips(); + +////@begin wxRichTextBulletsPage member variables + wxListBox* m_styleListBox; + wxCheckBox* m_periodCtrl; + wxCheckBox* m_parenthesesCtrl; + wxCheckBox* m_rightParenthesisCtrl; + wxComboBox* m_bulletAlignmentCtrl; + wxComboBox* m_symbolCtrl; + wxComboBox* m_symbolFontCtrl; + wxComboBox* m_bulletNameCtrl; + wxSpinCtrl* m_numberCtrl; + wxRichTextCtrl* m_previewCtrl; + /// Control identifiers + enum { + ID_RICHTEXTBULLETSPAGE = 10300, + ID_RICHTEXTBULLETSPAGE_STYLELISTBOX = 10305, + ID_RICHTEXTBULLETSPAGE_PERIODCTRL = 10313, + ID_RICHTEXTBULLETSPAGE_PARENTHESESCTRL = 10311, + ID_RICHTEXTBULLETSPAGE_RIGHTPARENTHESISCTRL = 10306, + ID_RICHTEXTBULLETSPAGE_BULLETALIGNMENTCTRL = 10315, + ID_RICHTEXTBULLETSPAGE_SYMBOLSTATIC = 10301, + ID_RICHTEXTBULLETSPAGE_SYMBOLCTRL = 10307, + ID_RICHTEXTBULLETSPAGE_CHOOSE_SYMBOL = 10308, + ID_RICHTEXTBULLETSPAGE_SYMBOLFONTCTRL = 10309, + ID_RICHTEXTBULLETSPAGE_NAMESTATIC = 10303, + ID_RICHTEXTBULLETSPAGE_NAMECTRL = 10304, + ID_RICHTEXTBULLETSPAGE_NUMBERSTATIC = 10302, + ID_RICHTEXTBULLETSPAGE_NUMBERCTRL = 10310, + ID_RICHTEXTBULLETSPAGE_PREVIEW_CTRL = 10314 + }; +////@end wxRichTextBulletsPage member variables + + bool m_hasBulletStyle; + bool m_hasBulletNumber; + bool m_hasBulletSymbol; + bool m_dontUpdate; +}; + +#endif + // _RICHTEXTBULLETSPAGE_H_ diff --git a/Externals/wxWidgets/include/wx/richtext/richtextctrl.h b/Externals/wxWidgets/include/wx/richtext/richtextctrl.h new file mode 100644 index 0000000000..decbca2496 --- /dev/null +++ b/Externals/wxWidgets/include/wx/richtext/richtextctrl.h @@ -0,0 +1,954 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/richtext/richtextctrl.h +// Purpose: A rich edit control +// Author: Julian Smart +// Modified by: +// Created: 2005-09-30 +// RCS-ID: $Id: richtextctrl.h 49804 2007-11-10 01:09:42Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_RICHTEXTCTRL_H_ +#define _WX_RICHTEXTCTRL_H_ + +#include "wx/richtext/richtextbuffer.h" + +#if wxUSE_RICHTEXT + +#include "wx/scrolwin.h" +#include "wx/caret.h" + +#include "wx/textctrl.h" + +#if !defined(__WXGTK__) && !defined(__WXMAC__) +#define wxRICHTEXT_BUFFERED_PAINTING 1 +#else +#define wxRICHTEXT_BUFFERED_PAINTING 0 +#endif + +class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextStyleDefinition; + +/*! + * Styles and flags + */ + +/* Styles + */ + +#define wxRE_READONLY 0x0010 +#define wxRE_MULTILINE 0x0020 + +/* Flags + */ + +#define wxRICHTEXT_SHIFT_DOWN 0x01 +#define wxRICHTEXT_CTRL_DOWN 0x02 +#define wxRICHTEXT_ALT_DOWN 0x04 + +/* Defaults + */ + +#define wxRICHTEXT_DEFAULT_OVERALL_SIZE wxSize(-1, -1) +#define wxRICHTEXT_DEFAULT_IMAGE_SIZE wxSize(80, 80) +#define wxRICHTEXT_DEFAULT_SPACING 3 +#define wxRICHTEXT_DEFAULT_MARGIN 3 +#define wxRICHTEXT_DEFAULT_UNFOCUSSED_BACKGROUND wxColour(175, 175, 175) +#define wxRICHTEXT_DEFAULT_FOCUSSED_BACKGROUND wxColour(140, 140, 140) +#define wxRICHTEXT_DEFAULT_UNSELECTED_BACKGROUND wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE) +#define wxRICHTEXT_DEFAULT_TYPE_COLOUR wxColour(0, 0, 200) +#define wxRICHTEXT_DEFAULT_FOCUS_RECT_COLOUR wxColour(100, 80, 80) +#define wxRICHTEXT_DEFAULT_CARET_WIDTH 2 +// Minimum buffer size before delayed layout kicks in +#define wxRICHTEXT_DEFAULT_DELAYED_LAYOUT_THRESHOLD 20000 +// Milliseconds before layout occurs after resize +#define wxRICHTEXT_DEFAULT_LAYOUT_INTERVAL 50 + +/*! + * Forward declarations + */ + +/*! + * wxRichTextItem class declaration + */ + +// Drawing styles/states +#define wxRICHTEXT_SELECTED 0x01 +#define wxRICHTEXT_TAGGED 0x02 +// The control is focussed +#define wxRICHTEXT_FOCUSSED 0x04 +// The item itself has the focus +#define wxRICHTEXT_IS_FOCUS 0x08 + +/*! + * wxRichTextCtrl class declaration + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextCtrl : public wxTextCtrlBase, + public wxScrollHelper +{ + DECLARE_CLASS( wxRichTextCtrl ) + DECLARE_EVENT_TABLE() + +public: +// Constructors + + wxRichTextCtrl( ); + wxRichTextCtrl( wxWindow* parent, wxWindowID id = -1, const wxString& value = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, + long style = wxRE_MULTILINE, const wxValidator& validator = wxDefaultValidator, const wxString& name = wxTextCtrlNameStr); + + virtual ~wxRichTextCtrl( ); + +// Operations + + /// Creation + bool Create( wxWindow* parent, wxWindowID id = -1, const wxString& value = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, + long style = wxRE_MULTILINE, const wxValidator& validator = wxDefaultValidator, const wxString& name = wxTextCtrlNameStr ); + + /// Member initialisation + void Init(); + +///// wxTextCtrl compatibility + +// Accessors + + virtual wxString GetValue() const; + + virtual wxString GetRange(long from, long to) const; + + virtual int GetLineLength(long lineNo) const ; + virtual wxString GetLineText(long lineNo) const ; + virtual int GetNumberOfLines() const ; + + virtual bool IsModified() const ; + virtual bool IsEditable() const ; + + // more readable flag testing methods + bool IsSingleLine() const { return !HasFlag(wxRE_MULTILINE); } + bool IsMultiLine() const { return !IsSingleLine(); } + + // If the return values from and to are the same, there is no selection. + virtual void GetSelection(long* from, long* to) const; + + virtual wxString GetStringSelection() const; + + /// Get filename + wxString GetFilename() const { return m_filename; } + + /// Set filename + void SetFilename(const wxString& filename) { m_filename = filename; } + + /// Set the threshold in character positions for doing layout optimization during sizing + void SetDelayedLayoutThreshold(long threshold) { m_delayedLayoutThreshold = threshold; } + + /// Get the threshold in character positions for doing layout optimization during sizing + long GetDelayedLayoutThreshold() const { return m_delayedLayoutThreshold; } + +// Operations + + // editing + virtual void Clear(); + virtual void Replace(long from, long to, const wxString& value); + virtual void Remove(long from, long to); + + // load/save the controls contents from/to the file + virtual bool DoLoadFile(const wxString& file, int fileType); + virtual bool DoSaveFile(const wxString& file = wxEmptyString, int fileType = wxRICHTEXT_TYPE_ANY); + + /// Set the handler flags, controlling loading and saving + void SetHandlerFlags(int flags) { GetBuffer().SetHandlerFlags(flags); } + + /// Get the handler flags, controlling loading and saving + int GetHandlerFlags() const { return GetBuffer().GetHandlerFlags(); } + + // sets/clears the dirty flag + virtual void MarkDirty(); + virtual void DiscardEdits(); + + // set the max number of characters which may be entered in a single line + // text control + virtual void SetMaxLength(unsigned long WXUNUSED(len)) { } + + // writing text inserts it at the current position, appending always + // inserts it at the end + virtual void WriteText(const wxString& text); + virtual void AppendText(const wxString& text); + + // text control under some platforms supports the text styles: these + // methods allow to apply the given text style to the given selection or to + // set/get the style which will be used for all appended text + virtual bool SetStyle(long start, long end, const wxTextAttr& style); + virtual bool SetStyle(long start, long end, const wxTextAttrEx& style); + virtual bool SetStyle(const wxRichTextRange& range, const wxRichTextAttr& style); + virtual bool GetStyle(long position, wxTextAttr& style); + virtual bool GetStyle(long position, wxTextAttrEx& style); + virtual bool GetStyle(long position, wxRichTextAttr& style); + + // get the common set of styles for the range + virtual bool GetStyleForRange(const wxRichTextRange& range, wxRichTextAttr& style); + virtual bool GetStyleForRange(const wxRichTextRange& range, wxTextAttrEx& style); + + // extended style setting operation with flags including: + // wxRICHTEXT_SETSTYLE_WITH_UNDO, wxRICHTEXT_SETSTYLE_OPTIMIZE, wxRICHTEXT_SETSTYLE_PARAGRAPHS_ONLY, wxRICHTEXT_SETSTYLE_CHARACTERS_ONLY + // see richtextbuffer.h for more details. + virtual bool SetStyleEx(long start, long end, const wxTextAttrEx& style, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO); + virtual bool SetStyleEx(const wxRichTextRange& range, const wxTextAttrEx& style, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO); + virtual bool SetStyleEx(const wxRichTextRange& range, const wxRichTextAttr& style, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO); + + /// Get the content (uncombined) attributes for this position. + virtual bool GetUncombinedStyle(long position, wxTextAttr& style); + virtual bool GetUncombinedStyle(long position, wxTextAttrEx& style); + virtual bool GetUncombinedStyle(long position, wxRichTextAttr& style); + + virtual bool SetDefaultStyle(const wxTextAttrEx& style); + virtual bool SetDefaultStyle(const wxTextAttr& style); + + // TODO: change to GetDefaultStyle if we merge wxTextAttr and wxTextAttrEx + virtual const wxTextAttrEx& GetDefaultStyleEx() const; + virtual const wxTextAttr& GetDefaultStyle() const; + + /// Set list style + virtual bool SetListStyle(const wxRichTextRange& range, wxRichTextListStyleDefinition* def, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO, int startFrom = 1, int specifiedLevel = -1); + virtual bool SetListStyle(const wxRichTextRange& range, const wxString& defName, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO, int startFrom = 1, int specifiedLevel = -1); + + /// Clear list for given range + virtual bool ClearListStyle(const wxRichTextRange& range, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO); + + /// Number/renumber any list elements in the given range + /// def/defName can be NULL/empty to indicate that the existing list style should be used. + virtual bool NumberList(const wxRichTextRange& range, wxRichTextListStyleDefinition* def = NULL, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO, int startFrom = 1, int specifiedLevel = -1); + virtual bool NumberList(const wxRichTextRange& range, const wxString& defName, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO, int startFrom = 1, int specifiedLevel = -1); + + /// Promote the list items within the given range. promoteBy can be a positive or negative number, e.g. 1 or -1 + /// def/defName can be NULL/empty to indicate that the existing list style should be used. + virtual bool PromoteList(int promoteBy, const wxRichTextRange& range, wxRichTextListStyleDefinition* def = NULL, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO, int specifiedLevel = -1); + virtual bool PromoteList(int promoteBy, const wxRichTextRange& range, const wxString& defName, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO, int specifiedLevel = -1); + + /// Deletes the content in the given range + virtual bool Delete(const wxRichTextRange& range); + + // translate between the position (which is just an index in the text ctrl + // considering all its contents as a single strings) and (x, y) coordinates + // which represent column and line. + virtual long XYToPosition(long x, long y) const; + virtual bool PositionToXY(long pos, long *x, long *y) const; + + virtual void ShowPosition(long pos); + + // find the character at position given in pixels + // + // NB: pt is in device coords (not adjusted for the client area origin nor + // scrolling) + virtual wxTextCtrlHitTestResult HitTest(const wxPoint& pt, long *pos) const; + virtual wxTextCtrlHitTestResult HitTest(const wxPoint& pt, + wxTextCoord *col, + wxTextCoord *row) const; + + // Clipboard operations + virtual void Copy(); + virtual void Cut(); + virtual void Paste(); + virtual void DeleteSelection(); + + virtual bool CanCopy() const; + virtual bool CanCut() const; + virtual bool CanPaste() const; + virtual bool CanDeleteSelection() const; + + // Undo/redo + virtual void Undo(); + virtual void Redo(); + + virtual bool CanUndo() const; + virtual bool CanRedo() const; + + // Insertion point + virtual void SetInsertionPoint(long pos); + virtual void SetInsertionPointEnd(); + virtual long GetInsertionPoint() const; + virtual wxTextPos GetLastPosition() const; + + virtual void SetSelection(long from, long to); + virtual void SelectAll(); + virtual void SetEditable(bool editable); + + /// Call Freeze to prevent refresh + virtual void Freeze(); + + /// Call Thaw to refresh + virtual void Thaw(); + + /// Call Thaw to refresh + virtual bool IsFrozen() const { return m_freezeCount > 0; } + + virtual bool HasSelection() const; + +///// Functionality specific to wxRichTextCtrl + + /// Write an image at the current insertion point. Supply optional type to use + /// for internal and file storage of the raw data. + virtual bool WriteImage(const wxImage& image, int bitmapType = wxBITMAP_TYPE_PNG); + + /// Write a bitmap at the current insertion point. Supply optional type to use + /// for internal and file storage of the raw data. + virtual bool WriteImage(const wxBitmap& bitmap, int bitmapType = wxBITMAP_TYPE_PNG); + + /// Load an image from file and write at the current insertion point. + virtual bool WriteImage(const wxString& filename, int bitmapType); + + /// Write an image block at the current insertion point. + virtual bool WriteImage(const wxRichTextImageBlock& imageBlock); + + /// Insert a newline (actually paragraph) at the current insertion point. + virtual bool Newline(); + + /// Insert a line break at the current insertion point. + virtual bool LineBreak(); + + /// Set basic (overall) style + virtual void SetBasicStyle(const wxTextAttrEx& style) { GetBuffer().SetBasicStyle(style); } + virtual void SetBasicStyle(const wxRichTextAttr& style) { GetBuffer().SetBasicStyle(style); } + + /// Get basic (overall) style + virtual const wxTextAttrEx& GetBasicStyle() const { return GetBuffer().GetBasicStyle(); } + + /// Begin using a style + virtual bool BeginStyle(const wxTextAttrEx& style) { return GetBuffer().BeginStyle(style); } + + /// End the style + virtual bool EndStyle() { return GetBuffer().EndStyle(); } + + /// End all styles + virtual bool EndAllStyles() { return GetBuffer().EndAllStyles(); } + + /// Begin using bold + bool BeginBold() { return GetBuffer().BeginBold(); } + + /// End using bold + bool EndBold() { return GetBuffer().EndBold(); } + + /// Begin using italic + bool BeginItalic() { return GetBuffer().BeginItalic(); } + + /// End using italic + bool EndItalic() { return GetBuffer().EndItalic(); } + + /// Begin using underline + bool BeginUnderline() { return GetBuffer().BeginUnderline(); } + + /// End using underline + bool EndUnderline() { return GetBuffer().EndUnderline(); } + + /// Begin using point size + bool BeginFontSize(int pointSize) { return GetBuffer().BeginFontSize(pointSize); } + + /// End using point size + bool EndFontSize() { return GetBuffer().EndFontSize(); } + + /// Begin using this font + bool BeginFont(const wxFont& font) { return GetBuffer().BeginFont(font); } + + /// End using a font + bool EndFont() { return GetBuffer().EndFont(); } + + /// Begin using this colour + bool BeginTextColour(const wxColour& colour) { return GetBuffer().BeginTextColour(colour); } + + /// End using a colour + bool EndTextColour() { return GetBuffer().EndTextColour(); } + + /// Begin using alignment + bool BeginAlignment(wxTextAttrAlignment alignment) { return GetBuffer().BeginAlignment(alignment); } + + /// End alignment + bool EndAlignment() { return GetBuffer().EndAlignment(); } + + /// Begin left indent + bool BeginLeftIndent(int leftIndent, int leftSubIndent = 0) { return GetBuffer().BeginLeftIndent(leftIndent, leftSubIndent); } + + /// End left indent + bool EndLeftIndent() { return GetBuffer().EndLeftIndent(); } + + /// Begin right indent + bool BeginRightIndent(int rightIndent) { return GetBuffer().BeginRightIndent(rightIndent); } + + /// End right indent + bool EndRightIndent() { return GetBuffer().EndRightIndent(); } + + /// Begin paragraph spacing + bool BeginParagraphSpacing(int before, int after) { return GetBuffer().BeginParagraphSpacing(before, after); } + + /// End paragraph spacing + bool EndParagraphSpacing() { return GetBuffer().EndParagraphSpacing(); } + + /// Begin line spacing + bool BeginLineSpacing(int lineSpacing) { return GetBuffer().BeginLineSpacing(lineSpacing); } + + /// End line spacing + bool EndLineSpacing() { return GetBuffer().EndLineSpacing(); } + + /// Begin numbered bullet + bool BeginNumberedBullet(int bulletNumber, int leftIndent, int leftSubIndent, int bulletStyle = wxTEXT_ATTR_BULLET_STYLE_ARABIC|wxTEXT_ATTR_BULLET_STYLE_PERIOD) + { return GetBuffer().BeginNumberedBullet(bulletNumber, leftIndent, leftSubIndent, bulletStyle); } + + /// End numbered bullet + bool EndNumberedBullet() { return GetBuffer().EndNumberedBullet(); } + + /// Begin symbol bullet + bool BeginSymbolBullet(const wxString& symbol, int leftIndent, int leftSubIndent, int bulletStyle = wxTEXT_ATTR_BULLET_STYLE_SYMBOL) + { return GetBuffer().BeginSymbolBullet(symbol, leftIndent, leftSubIndent, bulletStyle); } + + /// End symbol bullet + bool EndSymbolBullet() { return GetBuffer().EndSymbolBullet(); } + + /// Begin standard bullet + bool BeginStandardBullet(const wxString& bulletName, int leftIndent, int leftSubIndent, int bulletStyle = wxTEXT_ATTR_BULLET_STYLE_STANDARD) + { return GetBuffer().BeginStandardBullet(bulletName, leftIndent, leftSubIndent, bulletStyle); } + + /// End standard bullet + bool EndStandardBullet() { return GetBuffer().EndStandardBullet(); } + + /// Begin named character style + bool BeginCharacterStyle(const wxString& characterStyle) { return GetBuffer().BeginCharacterStyle(characterStyle); } + + /// End named character style + bool EndCharacterStyle() { return GetBuffer().EndCharacterStyle(); } + + /// Begin named paragraph style + bool BeginParagraphStyle(const wxString& paragraphStyle) { return GetBuffer().BeginParagraphStyle(paragraphStyle); } + + /// End named character style + bool EndParagraphStyle() { return GetBuffer().EndParagraphStyle(); } + + /// Begin named list style + bool BeginListStyle(const wxString& listStyle, int level = 1, int number = 1) { return GetBuffer().BeginListStyle(listStyle, level, number); } + + /// End named character style + bool EndListStyle() { return GetBuffer().EndListStyle(); } + + /// Begin URL + bool BeginURL(const wxString& url, const wxString& characterStyle = wxEmptyString) { return GetBuffer().BeginURL(url, characterStyle); } + + /// End URL + bool EndURL() { return GetBuffer().EndURL(); } + + /// Sets the default style to the style under the cursor + bool SetDefaultStyleToCursorStyle(); + + /// Clear the selection + virtual void SelectNone(); + + /// Select the word at the given character position + virtual bool SelectWord(long position); + + /// Get/set the selection range in character positions. -1, -1 means no selection. + /// The range is in API convention, i.e. a single character selection is denoted + /// by (n, n+1) + wxRichTextRange GetSelectionRange() const; + void SetSelectionRange(const wxRichTextRange& range); + + /// Get/set the selection range in character positions. -1, -1 means no selection. + /// The range is in internal format, i.e. a single character selection is denoted + /// by (n, n) + const wxRichTextRange& GetInternalSelectionRange() const { return m_selectionRange; } + void SetInternalSelectionRange(const wxRichTextRange& range) { m_selectionRange = range; } + + /// Add a new paragraph of text to the end of the buffer + virtual wxRichTextRange AddParagraph(const wxString& text); + + /// Add an image + virtual wxRichTextRange AddImage(const wxImage& image); + + /// Layout the buffer: which we must do before certain operations, such as + /// setting the caret position. + virtual bool LayoutContent(bool onlyVisibleRect = false); + + /// Move the caret to the given character position + virtual bool MoveCaret(long pos, bool showAtLineStart = false); + + /// Move right + virtual bool MoveRight(int noPositions = 1, int flags = 0); + + /// Move left + virtual bool MoveLeft(int noPositions = 1, int flags = 0); + + /// Move up + virtual bool MoveUp(int noLines = 1, int flags = 0); + + /// Move up + virtual bool MoveDown(int noLines = 1, int flags = 0); + + /// Move to the end of the line + virtual bool MoveToLineEnd(int flags = 0); + + /// Move to the start of the line + virtual bool MoveToLineStart(int flags = 0); + + /// Move to the end of the paragraph + virtual bool MoveToParagraphEnd(int flags = 0); + + /// Move to the start of the paragraph + virtual bool MoveToParagraphStart(int flags = 0); + + /// Move to the start of the buffer + virtual bool MoveHome(int flags = 0); + + /// Move to the end of the buffer + virtual bool MoveEnd(int flags = 0); + + /// Move n pages up + virtual bool PageUp(int noPages = 1, int flags = 0); + + /// Move n pages down + virtual bool PageDown(int noPages = 1, int flags = 0); + + /// Move n words left + virtual bool WordLeft(int noPages = 1, int flags = 0); + + /// Move n words right + virtual bool WordRight(int noPages = 1, int flags = 0); + + /// Returns the buffer associated with the control. + wxRichTextBuffer& GetBuffer() { return m_buffer; } + const wxRichTextBuffer& GetBuffer() const { return m_buffer; } + + /// Start batching undo history for commands. + virtual bool BeginBatchUndo(const wxString& cmdName) { return m_buffer.BeginBatchUndo(cmdName); } + + /// End batching undo history for commands. + virtual bool EndBatchUndo() { return m_buffer.EndBatchUndo(); } + + /// Are we batching undo history for commands? + virtual bool BatchingUndo() const { return m_buffer.BatchingUndo(); } + + /// Start suppressing undo history for commands. + virtual bool BeginSuppressUndo() { return m_buffer.BeginSuppressUndo(); } + + /// End suppressing undo history for commands. + virtual bool EndSuppressUndo() { return m_buffer.EndSuppressUndo(); } + + /// Are we suppressing undo history for commands? + virtual bool SuppressingUndo() const { return m_buffer.SuppressingUndo(); } + + /// Test if this whole range has character attributes of the specified kind. If any + /// of the attributes are different within the range, the test fails. You + /// can use this to implement, for example, bold button updating. style must have + /// flags indicating which attributes are of interest. + virtual bool HasCharacterAttributes(const wxRichTextRange& range, const wxTextAttrEx& style) const + { + return GetBuffer().HasCharacterAttributes(range.ToInternal(), style); + } + virtual bool HasCharacterAttributes(const wxRichTextRange& range, const wxRichTextAttr& style) const + { + return GetBuffer().HasCharacterAttributes(range.ToInternal(), style); + } + + /// Test if this whole range has paragraph attributes of the specified kind. If any + /// of the attributes are different within the range, the test fails. You + /// can use this to implement, for example, centering button updating. style must have + /// flags indicating which attributes are of interest. + virtual bool HasParagraphAttributes(const wxRichTextRange& range, const wxTextAttrEx& style) const + { + return GetBuffer().HasParagraphAttributes(range.ToInternal(), style); + } + virtual bool HasParagraphAttributes(const wxRichTextRange& range, const wxRichTextAttr& style) const + { + return GetBuffer().HasParagraphAttributes(range.ToInternal(), style); + } + + /// Is all of the selection bold? + virtual bool IsSelectionBold(); + + /// Is all of the selection italics? + virtual bool IsSelectionItalics(); + + /// Is all of the selection underlined? + virtual bool IsSelectionUnderlined(); + + /// Is all of the selection aligned according to the specified flag? + virtual bool IsSelectionAligned(wxTextAttrAlignment alignment); + + /// Apply bold to the selection + virtual bool ApplyBoldToSelection(); + + /// Apply italic to the selection + virtual bool ApplyItalicToSelection(); + + /// Apply underline to the selection + virtual bool ApplyUnderlineToSelection(); + + /// Apply alignment to the selection + virtual bool ApplyAlignmentToSelection(wxTextAttrAlignment alignment); + + /// Apply a named style to the selection + virtual bool ApplyStyle(wxRichTextStyleDefinition* def); + + /// Set style sheet, if any + void SetStyleSheet(wxRichTextStyleSheet* styleSheet) { GetBuffer().SetStyleSheet(styleSheet); } + wxRichTextStyleSheet* GetStyleSheet() const { return GetBuffer().GetStyleSheet(); } + + /// Push style sheet to top of stack + bool PushStyleSheet(wxRichTextStyleSheet* styleSheet) { return GetBuffer().PushStyleSheet(styleSheet); } + + /// Pop style sheet from top of stack + wxRichTextStyleSheet* PopStyleSheet() { return GetBuffer().PopStyleSheet(); } + + /// Apply the style sheet to the buffer, for example if the styles have changed. + bool ApplyStyleSheet(wxRichTextStyleSheet* styleSheet = NULL); + +// Command handlers + + void Command(wxCommandEvent& event); + void OnDropFiles(wxDropFilesEvent& event); + void OnCaptureLost(wxMouseCaptureLostEvent& event); + + void OnCut(wxCommandEvent& event); + void OnCopy(wxCommandEvent& event); + void OnPaste(wxCommandEvent& event); + void OnUndo(wxCommandEvent& event); + void OnRedo(wxCommandEvent& event); + void OnSelectAll(wxCommandEvent& event); + void OnClear(wxCommandEvent& event); + + void OnUpdateCut(wxUpdateUIEvent& event); + void OnUpdateCopy(wxUpdateUIEvent& event); + void OnUpdatePaste(wxUpdateUIEvent& event); + void OnUpdateUndo(wxUpdateUIEvent& event); + void OnUpdateRedo(wxUpdateUIEvent& event); + void OnUpdateSelectAll(wxUpdateUIEvent& event); + void OnUpdateClear(wxUpdateUIEvent& event); + + // Show a context menu for Rich Edit controls (the standard + // EDIT control has one already) + void OnContextMenu(wxContextMenuEvent& event); + +// Event handlers + + /// Painting + void OnPaint(wxPaintEvent& event); + void OnEraseBackground(wxEraseEvent& event); + + /// Left-click + void OnLeftClick(wxMouseEvent& event); + + /// Left-up + void OnLeftUp(wxMouseEvent& event); + + /// Motion + void OnMoveMouse(wxMouseEvent& event); + + /// Left-double-click + void OnLeftDClick(wxMouseEvent& event); + + /// Middle-click + void OnMiddleClick(wxMouseEvent& event); + + /// Right-click + void OnRightClick(wxMouseEvent& event); + + /// Key press + void OnChar(wxKeyEvent& event); + + /// Sizing + void OnSize(wxSizeEvent& event); + + /// Setting/losing focus + void OnSetFocus(wxFocusEvent& event); + void OnKillFocus(wxFocusEvent& event); + + /// Idle-time processing + void OnIdle(wxIdleEvent& event); + + /// Scrolling + void OnScroll(wxScrollWinEvent& event); + + /// Set font, and also default attributes + virtual bool SetFont(const wxFont& font); + + /// Set up scrollbars, e.g. after a resize + virtual void SetupScrollbars(bool atTop = false); + + /// Keyboard navigation + virtual bool KeyboardNavigate(int keyCode, int flags); + + /// Paint the background + virtual void PaintBackground(wxDC& dc); + +#if wxRICHTEXT_BUFFERED_PAINTING + /// Recreate buffer bitmap if necessary + virtual bool RecreateBuffer(const wxSize& size = wxDefaultSize); +#endif + + /// Set the selection + virtual void DoSetSelection(long from, long to, bool scrollCaret = true); + + /// Write text + virtual void DoWriteText(const wxString& value, int flags = 0); + + /// Should we inherit colours? + virtual bool ShouldInheritColours() const { return false; } + + /// Position the caret + virtual void PositionCaret(); + + /// Extend the selection, returning true if the selection was + /// changed. Selections are in caret positions. + virtual bool ExtendSelection(long oldPosition, long newPosition, int flags); + + /// Scroll into view. This takes a _caret_ position. + virtual bool ScrollIntoView(long position, int keyCode); + + /// The caret position is the character position just before the caret. + /// A value of -1 means the caret is at the start of the buffer. + void SetCaretPosition(long position, bool showAtLineStart = false) ; + long GetCaretPosition() const { return m_caretPosition; } + + /// The adjusted caret position is the character position adjusted to take + /// into account whether we're at the start of a paragraph, in which case + /// style information should be taken from the next position, not current one. + long GetAdjustedCaretPosition(long caretPos) const; + + /// Move caret one visual step forward: this may mean setting a flag + /// and keeping the same position if we're going from the end of one line + /// to the start of the next, which may be the exact same caret position. + void MoveCaretForward(long oldPosition) ; + + /// Move caret one visual step forward: this may mean setting a flag + /// and keeping the same position if we're going from the end of one line + /// to the start of the next, which may be the exact same caret position. + void MoveCaretBack(long oldPosition) ; + + /// Get the caret height and position for the given character position + bool GetCaretPositionForIndex(long position, wxRect& rect); + + /// Gets the line for the visible caret position. If the caret is + /// shown at the very end of the line, it means the next character is actually + /// on the following line. So let's get the line we're expecting to find + /// if this is the case. + wxRichTextLine* GetVisibleLineForCaretPosition(long caretPosition) const; + + /// Gets the command processor + wxCommandProcessor* GetCommandProcessor() const { return GetBuffer().GetCommandProcessor(); } + + /// Delete content if there is a selection, e.g. when pressing a key. + /// Returns the new caret position in newPos, or leaves it if there + /// was no action. + bool DeleteSelectedContent(long* newPos= NULL); + + /// Transform logical to physical + wxPoint GetPhysicalPoint(const wxPoint& ptLogical) const; + + /// Transform physical to logical + wxPoint GetLogicalPoint(const wxPoint& ptPhysical) const; + + /// Finds the caret position for the next word. Direction + /// is 1 (forward) or -1 (backwards). + virtual long FindNextWordPosition(int direction = 1) const; + + /// Is the given position visible on the screen? + bool IsPositionVisible(long pos) const; + + /// Returns the first visible position in the current view + long GetFirstVisiblePosition() const; + + /// Returns the caret position since the default formatting was changed. As + /// soon as this position changes, we no longer reflect the default style + /// in the UI. A value of -2 means that we should only reflect the style of the + /// content under the caret. + long GetCaretPositionForDefaultStyle() const { return m_caretPositionForDefaultStyle; } + + /// Set the caret position for the default style that the user is selecting. + void SetCaretPositionForDefaultStyle(long pos) { m_caretPositionForDefaultStyle = pos; } + + /// Should the UI reflect the default style chosen by the user, rather than the style under + /// the caret? + bool IsDefaultStyleShowing() const { return m_caretPositionForDefaultStyle != -2; } + + /// Convenience function that tells the control to start reflecting the default + /// style, since the user is changing it. + void SetAndShowDefaultStyle(const wxRichTextAttr& attr) + { + SetDefaultStyle(attr); + SetCaretPositionForDefaultStyle(GetCaretPosition()); + } + + /// Get the first visible point in the window + wxPoint GetFirstVisiblePoint() const; + +// Implementation + + /// Font names take a long time to retrieve, so cache them (on demand) + static const wxArrayString& GetAvailableFontNames(); + static void ClearAvailableFontNames(); + + WX_FORWARD_TO_SCROLL_HELPER() + +// Overrides +protected: + + virtual wxSize DoGetBestSize() const ; + + virtual void DoSetValue(const wxString& value, int flags = 0); + + +// Data members +private: + + /// Allows nested Freeze/Thaw + int m_freezeCount; + +#if wxRICHTEXT_BUFFERED_PAINTING + /// Buffer bitmap + wxBitmap m_bufferBitmap; +#endif + + /// Text buffer + wxRichTextBuffer m_buffer; + + wxMenu* m_contextMenu; + + /// Caret position (1 less than the character position, so -1 is the + /// first caret position). + long m_caretPosition; + + /// Caret position when the default formatting has been changed. As + /// soon as this position changes, we no longer reflect the default style + /// in the UI. + long m_caretPositionForDefaultStyle; + + /// Selection range in character positions. -2, -2 means no selection. + wxRichTextRange m_selectionRange; + + /// Anchor so we know how to extend the selection + /// It's a caret position since it's between two characters. + long m_selectionAnchor; + + /// Are we editable? + bool m_editable; + + /// Are we showing the caret position at the start of a line + /// instead of at the end of the previous one? + bool m_caretAtLineStart; + + /// Are we dragging a selection? + bool m_dragging; + + /// Start position for drag + wxPoint m_dragStart; + + /// Do we need full layout in idle? + bool m_fullLayoutRequired; + wxLongLong m_fullLayoutTime; + long m_fullLayoutSavedPosition; + + /// Threshold for doing delayed layout + long m_delayedLayoutThreshold; + + /// Cursors + wxCursor m_textCursor; + wxCursor m_urlCursor; + + static wxArrayString sm_availableFontNames; +}; + +/*! + * wxRichTextEvent - the event class for wxRichTextCtrl notifications + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextEvent : public wxNotifyEvent +{ +public: + wxRichTextEvent(wxEventType commandType = wxEVT_NULL, int winid = 0) + : wxNotifyEvent(commandType, winid), + m_flags(0), m_position(-1), m_oldStyleSheet(NULL), m_newStyleSheet(NULL), + m_char((wxChar) 0) + { } + + wxRichTextEvent(const wxRichTextEvent& event) + : wxNotifyEvent(event), + m_flags(event.m_flags), m_position(-1), + m_oldStyleSheet(event.m_oldStyleSheet), m_newStyleSheet(event.m_newStyleSheet), + m_char((wxChar) 0) + { } + + long GetPosition() const { return m_position; } + void SetPosition(long pos) { m_position = pos; } + + int GetFlags() const { return m_flags; } + void SetFlags(int flags) { m_flags = flags; } + + wxRichTextStyleSheet* GetOldStyleSheet() const { return m_oldStyleSheet; } + void SetOldStyleSheet(wxRichTextStyleSheet* sheet) { m_oldStyleSheet = sheet; } + + wxRichTextStyleSheet* GetNewStyleSheet() const { return m_newStyleSheet; } + void SetNewStyleSheet(wxRichTextStyleSheet* sheet) { m_newStyleSheet = sheet; } + + const wxRichTextRange& GetRange() const { return m_range; } + void SetRange(const wxRichTextRange& range) { m_range = range; } + + wxChar GetCharacter() const { return m_char; } + void SetCharacter(wxChar ch) { m_char = ch; } + + virtual wxEvent *Clone() const { return new wxRichTextEvent(*this); } + +protected: + int m_flags; + long m_position; + wxRichTextStyleSheet* m_oldStyleSheet; + wxRichTextStyleSheet* m_newStyleSheet; + wxRichTextRange m_range; + wxChar m_char; + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxRichTextEvent) +}; + +/*! + * wxRichTextCtrl event macros + */ + +BEGIN_DECLARE_EVENT_TYPES() + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_RICHTEXT, wxEVT_COMMAND_RICHTEXT_LEFT_CLICK, 2602) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_RICHTEXT, wxEVT_COMMAND_RICHTEXT_RIGHT_CLICK, 2603) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_RICHTEXT, wxEVT_COMMAND_RICHTEXT_MIDDLE_CLICK, 2604) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_RICHTEXT, wxEVT_COMMAND_RICHTEXT_LEFT_DCLICK, 2605) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_RICHTEXT, wxEVT_COMMAND_RICHTEXT_RETURN, 2606) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_RICHTEXT, wxEVT_COMMAND_RICHTEXT_CHARACTER, 2607) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_RICHTEXT, wxEVT_COMMAND_RICHTEXT_DELETE, 2608) + + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_RICHTEXT, wxEVT_COMMAND_RICHTEXT_STYLESHEET_CHANGING, 2609) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_RICHTEXT, wxEVT_COMMAND_RICHTEXT_STYLESHEET_CHANGED, 2610) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_RICHTEXT, wxEVT_COMMAND_RICHTEXT_STYLESHEET_REPLACING, 2611) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_RICHTEXT, wxEVT_COMMAND_RICHTEXT_STYLESHEET_REPLACED, 2612) + + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_RICHTEXT, wxEVT_COMMAND_RICHTEXT_CONTENT_INSERTED, 2613) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_RICHTEXT, wxEVT_COMMAND_RICHTEXT_CONTENT_DELETED, 2614) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_RICHTEXT, wxEVT_COMMAND_RICHTEXT_STYLE_CHANGED, 2615) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_RICHTEXT, wxEVT_COMMAND_RICHTEXT_SELECTION_CHANGED, 2616) +END_DECLARE_EVENT_TYPES() + +typedef void (wxEvtHandler::*wxRichTextEventFunction)(wxRichTextEvent&); + +#define EVT_RICHTEXT_LEFT_CLICK(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_RICHTEXT_LEFT_CLICK, id, -1, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxRichTextEventFunction, & fn ), NULL ), +#define EVT_RICHTEXT_RIGHT_CLICK(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_RICHTEXT_RIGHT_CLICK, id, -1, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxRichTextEventFunction, & fn ), NULL ), +#define EVT_RICHTEXT_MIDDLE_CLICK(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_RICHTEXT_MIDDLE_CLICK, id, -1, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxRichTextEventFunction, & fn ), NULL ), +#define EVT_RICHTEXT_LEFT_DCLICK(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_RICHTEXT_LEFT_DCLICK, id, -1, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxRichTextEventFunction, & fn ), NULL ), +#define EVT_RICHTEXT_RETURN(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_RICHTEXT_RETURN, id, -1, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxRichTextEventFunction, & fn ), NULL ), +#define EVT_RICHTEXT_CHARACTER(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_RICHTEXT_CHARACTER, id, -1, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxRichTextEventFunction, & fn ), NULL ), +#define EVT_RICHTEXT_DELETE(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_RICHTEXT_DELETE, id, -1, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxRichTextEventFunction, & fn ), NULL ), + +#define EVT_RICHTEXT_STYLESHEET_CHANGING(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_RICHTEXT_STYLESHEET_CHANGING, id, -1, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxRichTextEventFunction, & fn ), NULL ), +#define EVT_RICHTEXT_STYLESHEET_CHANGED(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_RICHTEXT_STYLESHEET_CHANGED, id, -1, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxRichTextEventFunction, & fn ), NULL ), +#define EVT_RICHTEXT_STYLESHEET_REPLACING(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_RICHTEXT_STYLESHEET_REPLACING, id, -1, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxRichTextEventFunction, & fn ), NULL ), +#define EVT_RICHTEXT_STYLESHEET_REPLACED(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_RICHTEXT_STYLESHEET_REPLACED, id, -1, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxRichTextEventFunction, & fn ), NULL ), + +#define EVT_RICHTEXT_CONTENT_INSERTED(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_RICHTEXT_CONTENT_INSERTED, id, -1, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxRichTextEventFunction, & fn ), NULL ), +#define EVT_RICHTEXT_CONTENT_DELETED(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_RICHTEXT_CONTENT_DELETED, id, -1, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxRichTextEventFunction, & fn ), NULL ), +#define EVT_RICHTEXT_STYLE_CHANGED(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_RICHTEXT_STYLE_CHANGED, id, -1, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxRichTextEventFunction, & fn ), NULL ), +#define EVT_RICHTEXT_SELECTION_CHANGED(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_RICHTEXT_SELECTION_CHANGED, id, -1, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxRichTextEventFunction, & fn ), NULL ), + +#endif + // wxUSE_RICHTEXT + +#endif + // _WX_RICHTEXTCTRL_H_ diff --git a/Externals/wxWidgets/include/wx/richtext/richtextfontpage.h b/Externals/wxWidgets/include/wx/richtext/richtextfontpage.h new file mode 100644 index 0000000000..7ecce8f361 --- /dev/null +++ b/Externals/wxWidgets/include/wx/richtext/richtextfontpage.h @@ -0,0 +1,154 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/richtext/richeditfontpage.h +// Purpose: Font page for wxRichTextFormattingDialog +// Author: Julian Smart +// Modified by: +// Created: 2006-10-02 +// RCS-ID: $Id: richtextfontpage.h 43197 2006-11-08 14:05:50Z JS $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _RICHTEXTFONTPAGE_H_ +#define _RICHTEXTFONTPAGE_H_ + +/*! + * Includes + */ + +////@begin includes +////@end includes + +/*! + * Forward declarations + */ + +////@begin forward declarations +class wxRichTextFontListBox; +class wxRichTextColourSwatchCtrl; +class wxRichTextFontPreviewCtrl; +////@end forward declarations + +/*! + * Control identifiers + */ + +////@begin control identifiers +#define SYMBOL_WXRICHTEXTFONTPAGE_STYLE wxRESIZE_BORDER|wxTAB_TRAVERSAL +#define SYMBOL_WXRICHTEXTFONTPAGE_TITLE _("wxRichTextFontPage") +#define SYMBOL_WXRICHTEXTFONTPAGE_IDNAME ID_RICHTEXTFONTPAGE +#define SYMBOL_WXRICHTEXTFONTPAGE_SIZE wxSize(400, 300) +#define SYMBOL_WXRICHTEXTFONTPAGE_POSITION wxDefaultPosition +////@end control identifiers + +/*! + * wxRichTextFontPage class declaration + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextFontPage: public wxPanel +{ + DECLARE_DYNAMIC_CLASS( wxRichTextFontPage ) + DECLARE_EVENT_TABLE() + +public: + /// Constructors + wxRichTextFontPage( ); + wxRichTextFontPage( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = SYMBOL_WXRICHTEXTFONTPAGE_POSITION, const wxSize& size = SYMBOL_WXRICHTEXTFONTPAGE_SIZE, long style = SYMBOL_WXRICHTEXTFONTPAGE_STYLE ); + + /// Initialise members + void Init(); + + /// Creation + bool Create( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = SYMBOL_WXRICHTEXTFONTPAGE_POSITION, const wxSize& size = SYMBOL_WXRICHTEXTFONTPAGE_SIZE, long style = SYMBOL_WXRICHTEXTFONTPAGE_STYLE ); + + /// Creates the controls and sizers + void CreateControls(); + + /// Transfer data from/to window + virtual bool TransferDataFromWindow(); + virtual bool TransferDataToWindow(); + + /// Updates the font preview + void UpdatePreview(); + + void OnFaceListBoxSelected( wxCommandEvent& event ); + void OnColourClicked( wxCommandEvent& event ); + + /// Gets the attributes associated with the main formatting dialog + wxTextAttrEx* GetAttributes(); + +////@begin wxRichTextFontPage event handler declarations + + /// wxEVT_COMMAND_TEXT_UPDATED event handler for ID_RICHTEXTFONTPAGE_FACETEXTCTRL + void OnFaceTextCtrlUpdated( wxCommandEvent& event ); + + /// wxEVT_COMMAND_TEXT_UPDATED event handler for ID_RICHTEXTFONTPAGE_SIZETEXTCTRL + void OnSizeTextCtrlUpdated( wxCommandEvent& event ); + + /// wxEVT_COMMAND_LISTBOX_SELECTED event handler for ID_RICHTEXTFONTPAGE_SIZELISTBOX + void OnSizeListBoxSelected( wxCommandEvent& event ); + + /// wxEVT_COMMAND_COMBOBOX_SELECTED event handler for ID_RICHTEXTFONTPAGE_STYLECTRL + void OnStyleCtrlSelected( wxCommandEvent& event ); + + /// wxEVT_COMMAND_COMBOBOX_SELECTED event handler for ID_RICHTEXTFONTPAGE_WEIGHTCTRL + void OnWeightCtrlSelected( wxCommandEvent& event ); + + /// wxEVT_COMMAND_COMBOBOX_SELECTED event handler for ID_RICHTEXTFONTPAGE_UNDERLINING_CTRL + void OnUnderliningCtrlSelected( wxCommandEvent& event ); + + /// wxEVT_COMMAND_CHECKBOX_CLICKED event handler for ID_RICHTEXTFONTPAGE_STRIKETHROUGHCTRL + void OnStrikethroughctrlClick( wxCommandEvent& event ); + + /// wxEVT_COMMAND_CHECKBOX_CLICKED event handler for ID_RICHTEXTFONTPAGE_CAPSCTRL + void OnCapsctrlClick( wxCommandEvent& event ); + +////@end wxRichTextFontPage event handler declarations + +////@begin wxRichTextFontPage member function declarations + + /// Retrieves bitmap resources + wxBitmap GetBitmapResource( const wxString& name ); + + /// Retrieves icon resources + wxIcon GetIconResource( const wxString& name ); +////@end wxRichTextFontPage member function declarations + + /// Should we show tooltips? + static bool ShowToolTips(); + +////@begin wxRichTextFontPage member variables + wxTextCtrl* m_faceTextCtrl; + wxRichTextFontListBox* m_faceListBox; + wxTextCtrl* m_sizeTextCtrl; + wxListBox* m_sizeListBox; + wxComboBox* m_styleCtrl; + wxComboBox* m_weightCtrl; + wxComboBox* m_underliningCtrl; + wxRichTextColourSwatchCtrl* m_colourCtrl; + wxCheckBox* m_strikethroughCtrl; + wxCheckBox* m_capitalsCtrl; + wxRichTextFontPreviewCtrl* m_previewCtrl; + /// Control identifiers + enum { + ID_RICHTEXTFONTPAGE = 10000, + ID_RICHTEXTFONTPAGE_FACETEXTCTRL = 10001, + ID_RICHTEXTFONTPAGE_FACELISTBOX = 10002, + ID_RICHTEXTFONTPAGE_SIZETEXTCTRL = 10005, + ID_RICHTEXTFONTPAGE_SIZELISTBOX = 10006, + ID_RICHTEXTFONTPAGE_STYLECTRL = 10007, + ID_RICHTEXTFONTPAGE_WEIGHTCTRL = 10004, + ID_RICHTEXTFONTPAGE_UNDERLINING_CTRL = 10008, + ID_RICHTEXTFONTPAGE_COLOURCTRL = 10009, + ID_RICHTEXTFONTPAGE_STRIKETHROUGHCTRL = 10010, + ID_RICHTEXTFONTPAGE_CAPSCTRL = 10011, + ID_RICHTEXTFONTPAGE_PREVIEWCTRL = 10003 + }; +////@end wxRichTextFontPage member variables + + bool m_dontUpdate; + bool m_colourPresent; +}; + +#endif + // _RICHTEXTFONTPAGE_H_ diff --git a/Externals/wxWidgets/include/wx/richtext/richtextformatdlg.h b/Externals/wxWidgets/include/wx/richtext/richtextformatdlg.h new file mode 100644 index 0000000000..928470a40b --- /dev/null +++ b/Externals/wxWidgets/include/wx/richtext/richtextformatdlg.h @@ -0,0 +1,327 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/richtext/richtextformatdlg.h +// Purpose: Formatting dialog for wxRichTextCtrl +// Author: Julian Smart +// Modified by: +// Created: 2006-10-01 +// RCS-ID: $Id: richtextformatdlg.h 49946 2007-11-14 14:22:56Z JS $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_RICHTEXTFORMATDLG_H_ +#define _WX_RICHTEXTFORMATDLG_H_ + +/*! + * Includes + */ + +#include "wx/defs.h" + +#if wxUSE_RICHTEXT + +#include "wx/propdlg.h" +#include "wx/bookctrl.h" + +#if wxUSE_HTML +#include "wx/htmllbox.h" +#endif + +#include "wx/richtext/richtextbuffer.h" +#include "wx/richtext/richtextstyles.h" + +class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextFormattingDialog; +class WXDLLIMPEXP_FWD_CORE wxImageList; + +/*! + * Flags determining the pages and buttons to be created in the dialog + */ + +#define wxRICHTEXT_FORMAT_STYLE_EDITOR 0x0001 +#define wxRICHTEXT_FORMAT_FONT 0x0002 +#define wxRICHTEXT_FORMAT_TABS 0x0004 +#define wxRICHTEXT_FORMAT_BULLETS 0x0008 +#define wxRICHTEXT_FORMAT_INDENTS_SPACING 0x0010 +#define wxRICHTEXT_FORMAT_LIST_STYLE 0x0020 + +#define wxRICHTEXT_FORMAT_HELP_BUTTON 0x0100 + +/*! + * Indices for bullet styles in list control + */ + +enum { + wxRICHTEXT_BULLETINDEX_NONE = 0, + wxRICHTEXT_BULLETINDEX_ARABIC, + wxRICHTEXT_BULLETINDEX_UPPER_CASE, + wxRICHTEXT_BULLETINDEX_LOWER_CASE, + wxRICHTEXT_BULLETINDEX_UPPER_CASE_ROMAN, + wxRICHTEXT_BULLETINDEX_LOWER_CASE_ROMAN, + wxRICHTEXT_BULLETINDEX_OUTLINE, + wxRICHTEXT_BULLETINDEX_SYMBOL, + wxRICHTEXT_BULLETINDEX_BITMAP, + wxRICHTEXT_BULLETINDEX_STANDARD +}; + +/*! + * Shorthand for common combinations of pages + */ + +#define wxRICHTEXT_FORMAT_PARAGRAPH (wxRICHTEXT_FORMAT_INDENTS_SPACING | wxRICHTEXT_FORMAT_BULLETS | wxRICHTEXT_FORMAT_TABS | wxRICHTEXT_FORMAT_FONT) +#define wxRICHTEXT_FORMAT_CHARACTER (wxRICHTEXT_FORMAT_FONT) +#define wxRICHTEXT_FORMAT_STYLE (wxRICHTEXT_FORMAT_PARAGRAPH | wxRICHTEXT_FORMAT_STYLE_EDITOR) + +/*! + * Factory for formatting dialog + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextFormattingDialogFactory: public wxObject +{ +public: + wxRichTextFormattingDialogFactory() {} + virtual ~wxRichTextFormattingDialogFactory() {} + +// Overrideables + + /// Create all pages, under the dialog's book control, also calling AddPage + virtual bool CreatePages(long pages, wxRichTextFormattingDialog* dialog); + + /// Create a page, given a page identifier + virtual wxPanel* CreatePage(int page, wxString& title, wxRichTextFormattingDialog* dialog); + + /// Enumerate all available page identifiers + virtual int GetPageId(int i) const; + + /// Get the number of available page identifiers + virtual int GetPageIdCount() const; + + /// Get the image index for the given page identifier + virtual int GetPageImage(int WXUNUSED(id)) const { return -1; } + + /// Invoke help for the dialog + virtual bool ShowHelp(int WXUNUSED(page), wxRichTextFormattingDialog* WXUNUSED(dialog)) { return false; } + + /// Set the sheet style, called at the start of wxRichTextFormattingDialog::Create + virtual bool SetSheetStyle(wxRichTextFormattingDialog* dialog); + + /// Create the main dialog buttons + virtual bool CreateButtons(wxRichTextFormattingDialog* dialog); +}; + +/*! + * Formatting dialog for a wxRichTextCtrl + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextFormattingDialog: public wxPropertySheetDialog +{ +DECLARE_CLASS(wxRichTextFormattingDialog) +public: + wxRichTextFormattingDialog() { Init(); } + + wxRichTextFormattingDialog(long flags, wxWindow* parent, const wxString& title = wxGetTranslation(wxT("Formatting")), wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, const wxSize& sz = wxDefaultSize, + long style = wxDEFAULT_DIALOG_STYLE) + { + Init(); + Create(flags, parent, title, id, pos, sz, style); + } + + ~wxRichTextFormattingDialog(); + + void Init(); + + bool Create(long flags, wxWindow* parent, const wxString& title = wxGetTranslation(wxT("Formatting")), wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, const wxSize& sz = wxDefaultSize, + long style = wxDEFAULT_DIALOG_STYLE); + + /// Get attributes from the given range + virtual bool GetStyle(wxRichTextCtrl* ctrl, const wxRichTextRange& range); + + /// Set the attributes and optionally update the display + virtual bool SetStyle(const wxTextAttrEx& style, bool update = true); + + /// Set the style definition and optionally update the display + virtual bool SetStyleDefinition(const wxRichTextStyleDefinition& styleDef, wxRichTextStyleSheet* sheet, bool update = true); + + /// Get the style definition, if any + virtual wxRichTextStyleDefinition* GetStyleDefinition() const { return m_styleDefinition; } + + /// Get the style sheet, if any + virtual wxRichTextStyleSheet* GetStyleSheet() const { return m_styleSheet; } + + /// Update the display + virtual bool UpdateDisplay(); + + /// Apply attributes to the given range + virtual bool ApplyStyle(wxRichTextCtrl* ctrl, const wxRichTextRange& range, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO|wxRICHTEXT_SETSTYLE_OPTIMIZE); + + /// Gets and sets the attributes + const wxTextAttrEx& GetAttributes() const { return m_attributes; } + wxTextAttrEx& GetAttributes() { return m_attributes; } + void SetAttributes(const wxTextAttrEx& attr) { m_attributes = attr; } + + /// Transfers the data and from to the window + virtual bool TransferDataToWindow(); + virtual bool TransferDataFromWindow(); + + /// Apply the styles when a different tab is selected, so the previews are + /// up to date + void OnTabChanged(wxBookCtrlEvent& event); + + /// Respond to help command + void OnHelp(wxCommandEvent& event); + + /// Set/get image list + void SetImageList(wxImageList* imageList) { m_imageList = imageList; } + wxImageList* GetImageList() const { return m_imageList; } + + /// Get/set formatting factory object + static void SetFormattingDialogFactory(wxRichTextFormattingDialogFactory* factory); + static wxRichTextFormattingDialogFactory* GetFormattingDialogFactory() { return ms_FormattingDialogFactory; } + + /// Helper for pages to get the top-level dialog + static wxRichTextFormattingDialog* GetDialog(wxWindow* win); + + /// Helper for pages to get the attributes + static wxTextAttrEx* GetDialogAttributes(wxWindow* win); + + /// Helper for pages to get the style + static wxRichTextStyleDefinition* GetDialogStyleDefinition(wxWindow* win); + + /// Should we show tooltips? + static bool ShowToolTips() { return sm_showToolTips; } + + /// Determines whether tooltips will be shown + static void SetShowToolTips(bool show) { sm_showToolTips = show; } + + /// Map book control page index to our page id + void AddPageId(int id) { m_pageIds.Add(id); } + +protected: + + wxImageList* m_imageList; + wxTextAttrEx m_attributes; + wxRichTextStyleDefinition* m_styleDefinition; + wxRichTextStyleSheet* m_styleSheet; + wxArrayInt m_pageIds; // mapping of book control indexes to page ids + + static wxRichTextFormattingDialogFactory* ms_FormattingDialogFactory; + static bool sm_showToolTips; + +DECLARE_EVENT_TABLE() +}; + +//----------------------------------------------------------------------------- +// helper class - wxRichTextFontPreviewCtrl +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_RICHTEXT wxRichTextFontPreviewCtrl : public wxWindow +{ +public: + wxRichTextFontPreviewCtrl(wxWindow *parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& sz = wxDefaultSize, long style = 0) + { + if ((style & wxBORDER_MASK) == wxBORDER_DEFAULT) +#ifdef __WXMSW__ + style |= GetThemedBorderStyle(); +#else + style |= wxBORDER_SUNKEN; +#endif + wxWindow::Create(parent, id, pos, sz, style); + + SetBackgroundColour(*wxWHITE); + m_textEffects = 0; + } + + void SetTextEffects(int effects) { m_textEffects = effects; } + int GetTextEffects() const { return m_textEffects; } + +private: + int m_textEffects; + + void OnPaint(wxPaintEvent& event); + DECLARE_EVENT_TABLE() +}; + +/* + * A control for displaying a small preview of a colour or bitmap + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextColourSwatchCtrl: public wxControl +{ + DECLARE_CLASS(wxRichTextColourSwatchCtrl) +public: + wxRichTextColourSwatchCtrl(wxWindow* parent, wxWindowID id, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = 0); + ~wxRichTextColourSwatchCtrl(); + + void OnMouseEvent(wxMouseEvent& event); + + void SetColour(const wxColour& colour) { m_colour = colour; SetBackgroundColour(m_colour); } + + wxColour& GetColour() { return m_colour; } + + virtual wxSize DoGetBestSize() const { return GetSize(); } + +protected: + wxColour m_colour; + +DECLARE_EVENT_TABLE() +}; + +/*! + * wxRichTextFontListBox class declaration + * A listbox to display fonts. + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextFontListBox: public wxHtmlListBox +{ + DECLARE_CLASS(wxRichTextFontListBox) + DECLARE_EVENT_TABLE() + +public: + wxRichTextFontListBox() + { + Init(); + } + wxRichTextFontListBox(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = 0); + virtual ~wxRichTextFontListBox(); + + void Init() + { + } + + bool Create(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = 0); + + /// Creates a suitable HTML fragment for a font + wxString CreateHTML(const wxString& facename) const; + + /// Get font name for index + wxString GetFaceName(size_t i) const ; + + /// Set selection for string, returning the index. + int SetFaceNameSelection(const wxString& name); + + /// Updates the font list + void UpdateFonts(); + + /// Does this face name exist? + bool HasFaceName(const wxString& faceName) const { return m_faceNames.Index(faceName) != wxNOT_FOUND; } + + /// Returns the array of face names + const wxArrayString& GetFaceNames() const { return m_faceNames; } + +protected: + /// Returns the HTML for this item + virtual wxString OnGetItem(size_t n) const; + +private: + + wxArrayString m_faceNames; +}; + +#endif + // wxUSE_RICHTEXT + +#endif + // _WX_RICHTEXTFORMATDLG_H_ diff --git a/Externals/wxWidgets/include/wx/richtext/richtexthtml.h b/Externals/wxWidgets/include/wx/richtext/richtexthtml.h new file mode 100644 index 0000000000..7025e751aa --- /dev/null +++ b/Externals/wxWidgets/include/wx/richtext/richtexthtml.h @@ -0,0 +1,145 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/richtext/richtexthtml.h +// Purpose: HTML I/O for wxRichTextCtrl +// Author: Julian Smart +// Modified by: +// Created: 2005-09-30 +// RCS-ID: $Id: richtexthtml.h 43599 2006-07-25 06:50:19Z ABX $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_RICHTEXTHTML_H_ +#define _WX_RICHTEXTHTML_H_ + +/*! + * Includes + */ + +#include "wx/richtext/richtextbuffer.h" + +/*! + * wxRichTextHTMLHandler + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextHTMLHandler: public wxRichTextFileHandler +{ + DECLARE_CLASS(wxRichTextHTMLHandler) +public: + wxRichTextHTMLHandler(const wxString& name = wxT("HTML"), const wxString& ext = wxT("html"), int type = wxRICHTEXT_TYPE_HTML); + + /// Can we save using this handler? + virtual bool CanSave() const { return true; } + + /// Can we load using this handler? + virtual bool CanLoad() const { return false; } + + /// Can we handle this filename (if using files)? By default, checks the extension. + virtual bool CanHandle(const wxString& filename) const; + +// Accessors and operations unique to this handler + + /// Set and get the list of image locations generated by the last operation + void SetTemporaryImageLocations(const wxArrayString& locations) { m_imageLocations = locations; } + const wxArrayString& GetTemporaryImageLocations() const { return m_imageLocations; } + + /// Clear the image locations generated by the last operation + void ClearTemporaryImageLocations() { m_imageLocations.Clear(); } + + /// Delete the in-memory or temporary files generated by the last operation + bool DeleteTemporaryImages(); + + /// Delete the in-memory or temporary files generated by the last operation. This is a static + /// function that can be used to delete the saved locations from an earlier operation, + /// for example after the user has viewed the HTML file. + static bool DeleteTemporaryImages(int flags, const wxArrayString& imageLocations); + + /// Reset the file counter, in case, for example, the same names are required each time + static void SetFileCounter(int counter) { sm_fileCounter = counter; } + + /// Set and get the directory for storing temporary files. If empty, the system + /// temporary directory will be used. + void SetTempDir(const wxString& tempDir) { m_tempDir = tempDir; } + const wxString& GetTempDir() const { return m_tempDir; } + + /// Set and get mapping from point size to HTML font size. There should be 7 elements, + /// one for each HTML font size, each element specifying the maximum point size for that + /// HTML font size. E.g. 8, 10, 13, 17, 22, 29, 100 + void SetFontSizeMapping(const wxArrayInt& fontSizeMapping) { m_fontSizeMapping = fontSizeMapping; } + wxArrayInt GetFontSizeMapping() const { return m_fontSizeMapping; } + +protected: + +// Implementation + +#if wxUSE_STREAMS + virtual bool DoLoadFile(wxRichTextBuffer *buffer, wxInputStream& stream); + virtual bool DoSaveFile(wxRichTextBuffer *buffer, wxOutputStream& stream); + + /// Output character formatting + void BeginCharacterFormatting(const wxTextAttrEx& currentStyle, const wxTextAttrEx& thisStyle, const wxTextAttrEx& paraStyle, wxTextOutputStream& stream ); + void EndCharacterFormatting(const wxTextAttrEx& currentStyle, const wxTextAttrEx& thisStyle, const wxTextAttrEx& paraStyle, wxTextOutputStream& stream ); + + /// Output paragraph formatting + void BeginParagraphFormatting(const wxTextAttrEx& currentStyle, const wxTextAttrEx& thisStyle, wxTextOutputStream& stream); + void EndParagraphFormatting(const wxTextAttrEx& currentStyle, const wxTextAttrEx& thisStyle, wxTextOutputStream& stream); + + /// Output font tag + void OutputFont(const wxTextAttrEx& style, wxTextOutputStream& stream); + + /// Closes lists to level (-1 means close all) + void CloseLists(int level, wxTextOutputStream& str); + + /// Writes an image to its base64 equivalent, or to the memory filesystem, or to a file + void WriteImage(wxRichTextImage* image, wxOutputStream& stream); + + /// Converts from pt to size property compatible height + long PtToSize(long size); + + /// Typical base64 encoder + wxChar* b64enc(unsigned char* input, size_t in_len); + + /// Gets the mime type of the given wxBITMAP_TYPE + const wxChar* GetMimeType(int imageType); + + /// Gets the html equivalent of the specified value + wxString GetAlignment(const wxTextAttrEx& thisStyle); + + /// Generates   array for indentations + wxString SymbolicIndent(long indent); + + /// Finds the html equivalent of the specified bullet + int TypeOfList(const wxTextAttrEx& thisStyle, wxString& tag); +#endif + +// Data members + + wxRichTextBuffer* m_buffer; + + /// Indentation values of the table tags + wxArrayInt m_indents; + + /// Stack of list types: 0 = ol, 1 = ul + wxArrayInt m_listTypes; + + /// Is there any opened font tag? + bool m_font; + + /// Are we in a table? + bool m_inTable; + + /// A list of the image files or in-memory images created by the last operation. + wxArrayString m_imageLocations; + + /// A location for the temporary files + wxString m_tempDir; + + /// A mapping from point size to HTML font size + wxArrayInt m_fontSizeMapping; + + /// A counter for generating filenames + static int sm_fileCounter; +}; + +#endif + // _WX_RICHTEXTXML_H_ diff --git a/Externals/wxWidgets/include/wx/richtext/richtextindentspage.h b/Externals/wxWidgets/include/wx/richtext/richtextindentspage.h new file mode 100644 index 0000000000..edb95f67ce --- /dev/null +++ b/Externals/wxWidgets/include/wx/richtext/richtextindentspage.h @@ -0,0 +1,165 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/richtext/richtextindentspage.h +// Purpose: +// Author: Julian Smart +// Modified by: +// Created: 10/3/2006 2:28:21 PM +// RCS-ID: $Id: richtextindentspage.h 43277 2006-11-10 15:48:46Z JS $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _RICHTEXTINDENTSPAGE_H_ +#define _RICHTEXTINDENTSPAGE_H_ + +/*! + * Includes + */ + +////@begin includes +#include "wx/statline.h" +////@end includes + +/*! + * Forward declarations + */ + +////@begin forward declarations +class wxRichTextCtrl; +////@end forward declarations + +/*! + * Control identifiers + */ + +////@begin control identifiers +#define SYMBOL_WXRICHTEXTINDENTSSPACINGPAGE_STYLE wxRESIZE_BORDER|wxTAB_TRAVERSAL +#define SYMBOL_WXRICHTEXTINDENTSSPACINGPAGE_TITLE _("wxRichTextFontPage") +#define SYMBOL_WXRICHTEXTINDENTSSPACINGPAGE_IDNAME ID_RICHTEXTINDENTSSPACINGPAGE +#define SYMBOL_WXRICHTEXTINDENTSSPACINGPAGE_SIZE wxSize(400, 300) +#define SYMBOL_WXRICHTEXTINDENTSSPACINGPAGE_POSITION wxDefaultPosition +////@end control identifiers + +/*! + * wxRichTextIndentsSpacingPage class declaration + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextIndentsSpacingPage: public wxPanel +{ + DECLARE_DYNAMIC_CLASS( wxRichTextIndentsSpacingPage ) + DECLARE_EVENT_TABLE() + +public: + /// Constructors + wxRichTextIndentsSpacingPage( ); + wxRichTextIndentsSpacingPage( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = SYMBOL_WXRICHTEXTINDENTSSPACINGPAGE_POSITION, const wxSize& size = SYMBOL_WXRICHTEXTINDENTSSPACINGPAGE_SIZE, long style = SYMBOL_WXRICHTEXTINDENTSSPACINGPAGE_STYLE ); + + /// Creation + bool Create( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = SYMBOL_WXRICHTEXTINDENTSSPACINGPAGE_POSITION, const wxSize& size = SYMBOL_WXRICHTEXTINDENTSSPACINGPAGE_SIZE, long style = SYMBOL_WXRICHTEXTINDENTSSPACINGPAGE_STYLE ); + + /// Initialise members + void Init(); + + /// Creates the controls and sizers + void CreateControls(); + + /// Transfer data from/to window + virtual bool TransferDataFromWindow(); + virtual bool TransferDataToWindow(); + + /// Updates the paragraph preview + void UpdatePreview(); + + /// Gets the attributes associated with the main formatting dialog + wxTextAttrEx* GetAttributes(); + +////@begin wxRichTextIndentsSpacingPage event handler declarations + + /// wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for ID_RICHTEXTINDENTSSPACINGPAGE_ALIGNMENT_LEFT + void OnAlignmentLeftSelected( wxCommandEvent& event ); + + /// wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for ID_RICHTEXTINDENTSSPACINGPAGE_ALIGNMENT_RIGHT + void OnAlignmentRightSelected( wxCommandEvent& event ); + + /// wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for ID_RICHTEXTINDENTSSPACINGPAGE_ALIGNMENT_JUSTIFIED + void OnAlignmentJustifiedSelected( wxCommandEvent& event ); + + /// wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for ID_RICHTEXTINDENTSSPACINGPAGE_ALIGNMENT_CENTRED + void OnAlignmentCentredSelected( wxCommandEvent& event ); + + /// wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for ID_RICHTEXTINDENTSSPACINGPAGE_ALIGNMENT_INDETERMINATE + void OnAlignmentIndeterminateSelected( wxCommandEvent& event ); + + /// wxEVT_COMMAND_TEXT_UPDATED event handler for ID_RICHTEXTINDENTSSPACINGPAGE_INDENT_LEFT + void OnIndentLeftUpdated( wxCommandEvent& event ); + + /// wxEVT_COMMAND_TEXT_UPDATED event handler for ID_RICHTEXTINDENTSSPACINGPAGE_INDENT_LEFT_FIRST + void OnIndentLeftFirstUpdated( wxCommandEvent& event ); + + /// wxEVT_COMMAND_TEXT_UPDATED event handler for ID_RICHTEXTINDENTSSPACINGPAGE_INDENT_RIGHT + void OnIndentRightUpdated( wxCommandEvent& event ); + + /// wxEVT_COMMAND_COMBOBOX_SELECTED event handler for ID_RICHTEXTINDENTSSPACINGPAGE_OUTLINELEVEL + void OnRichtextOutlinelevelSelected( wxCommandEvent& event ); + + /// wxEVT_COMMAND_TEXT_UPDATED event handler for ID_RICHTEXTINDENTSSPACINGPAGE_SPACING_BEFORE + void OnSpacingBeforeUpdated( wxCommandEvent& event ); + + /// wxEVT_COMMAND_TEXT_UPDATED event handler for ID_RICHTEXTINDENTSSPACINGPAGE_SPACING_AFTER + void OnSpacingAfterUpdated( wxCommandEvent& event ); + + /// wxEVT_COMMAND_COMBOBOX_SELECTED event handler for ID_RICHTEXTINDENTSSPACINGPAGE_SPACING_LINE + void OnSpacingLineSelected( wxCommandEvent& event ); + +////@end wxRichTextIndentsSpacingPage event handler declarations + +////@begin wxRichTextIndentsSpacingPage member function declarations + + /// Retrieves bitmap resources + wxBitmap GetBitmapResource( const wxString& name ); + + /// Retrieves icon resources + wxIcon GetIconResource( const wxString& name ); +////@end wxRichTextIndentsSpacingPage member function declarations + + /// Should we show tooltips? + static bool ShowToolTips(); + +////@begin wxRichTextIndentsSpacingPage member variables + wxRadioButton* m_alignmentLeft; + wxRadioButton* m_alignmentRight; + wxRadioButton* m_alignmentJustified; + wxRadioButton* m_alignmentCentred; + wxRadioButton* m_alignmentIndeterminate; + wxTextCtrl* m_indentLeft; + wxTextCtrl* m_indentLeftFirst; + wxTextCtrl* m_indentRight; + wxComboBox* m_outlineLevelCtrl; + wxTextCtrl* m_spacingBefore; + wxTextCtrl* m_spacingAfter; + wxComboBox* m_spacingLine; + wxRichTextCtrl* m_previewCtrl; + /// Control identifiers + enum { + ID_RICHTEXTINDENTSSPACINGPAGE = 10100, + ID_RICHTEXTINDENTSSPACINGPAGE_ALIGNMENT_LEFT = 10102, + ID_RICHTEXTINDENTSSPACINGPAGE_ALIGNMENT_RIGHT = 10110, + ID_RICHTEXTINDENTSSPACINGPAGE_ALIGNMENT_JUSTIFIED = 10111, + ID_RICHTEXTINDENTSSPACINGPAGE_ALIGNMENT_CENTRED = 10112, + ID_RICHTEXTINDENTSSPACINGPAGE_ALIGNMENT_INDETERMINATE = 10101, + ID_RICHTEXTINDENTSSPACINGPAGE_INDENT_LEFT = 10103, + ID_RICHTEXTINDENTSSPACINGPAGE_INDENT_LEFT_FIRST = 10104, + ID_RICHTEXTINDENTSSPACINGPAGE_INDENT_RIGHT = 10113, + ID_RICHTEXTINDENTSSPACINGPAGE_OUTLINELEVEL = 10105, + ID_RICHTEXTINDENTSSPACINGPAGE_SPACING_BEFORE = 10114, + ID_RICHTEXTINDENTSSPACINGPAGE_SPACING_AFTER = 10116, + ID_RICHTEXTINDENTSSPACINGPAGE_SPACING_LINE = 10115, + ID_RICHTEXTINDENTSSPACINGPAGE_PREVIEW_CTRL = 10109 + }; +////@end wxRichTextIndentsSpacingPage member variables + + bool m_dontUpdate; +}; + +#endif + // _RICHTEXTINDENTSPAGE_H_ diff --git a/Externals/wxWidgets/include/wx/richtext/richtextliststylepage.h b/Externals/wxWidgets/include/wx/richtext/richtextliststylepage.h new file mode 100644 index 0000000000..21451d0e3f --- /dev/null +++ b/Externals/wxWidgets/include/wx/richtext/richtextliststylepage.h @@ -0,0 +1,276 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/richtext/richtextliststylepage.h +// Purpose: +// Author: Julian Smart +// Modified by: +// Created: 10/18/2006 11:36:37 AM +// RCS-ID: $Id: richtextliststylepage.h 42678 2006-10-29 22:01:06Z JS $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _RICHTEXTLISTSTYLEPAGE_H_ +#define _RICHTEXTLISTSTYLEPAGE_H_ + +/*! + * Includes + */ + +////@begin includes +#include "wx/spinctrl.h" +#include "wx/notebook.h" +#include "wx/statline.h" +////@end includes + +/*! + * Control identifiers + */ + +////@begin control identifiers +#define SYMBOL_WXRICHTEXTLISTSTYLEPAGE_STYLE wxRESIZE_BORDER|wxTAB_TRAVERSAL +#define SYMBOL_WXRICHTEXTLISTSTYLEPAGE_TITLE _("wxRichTextListStylePage") +#define SYMBOL_WXRICHTEXTLISTSTYLEPAGE_IDNAME ID_RICHTEXTLISTSTYLEPAGE +#define SYMBOL_WXRICHTEXTLISTSTYLEPAGE_SIZE wxSize(400, 300) +#define SYMBOL_WXRICHTEXTLISTSTYLEPAGE_POSITION wxDefaultPosition +////@end control identifiers + +/*! + * wxRichTextListStylePage class declaration + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextListStylePage: public wxPanel +{ + DECLARE_DYNAMIC_CLASS( wxRichTextListStylePage ) + DECLARE_EVENT_TABLE() + +public: + /// Constructors + wxRichTextListStylePage( ); + wxRichTextListStylePage( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = SYMBOL_WXRICHTEXTLISTSTYLEPAGE_POSITION, const wxSize& size = SYMBOL_WXRICHTEXTLISTSTYLEPAGE_SIZE, long style = SYMBOL_WXRICHTEXTLISTSTYLEPAGE_STYLE ); + + /// Creation + bool Create( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = SYMBOL_WXRICHTEXTLISTSTYLEPAGE_POSITION, const wxSize& size = SYMBOL_WXRICHTEXTLISTSTYLEPAGE_SIZE, long style = SYMBOL_WXRICHTEXTLISTSTYLEPAGE_STYLE ); + + /// Initialises member variables + void Init(); + + /// Creates the controls and sizers + void CreateControls(); + + /// Updates the bullets preview + void UpdatePreview(); + + /// Transfer data from/to window + virtual bool TransferDataFromWindow(); + virtual bool TransferDataToWindow(); + + /// Get attributes for selected level + wxRichTextAttr* GetAttributesForSelection(); + + /// Update for symbol-related controls + void OnSymbolUpdate( wxUpdateUIEvent& event ); + + /// Update for number-related controls + void OnNumberUpdate( wxUpdateUIEvent& event ); + + /// Update for standard bullet-related controls + void OnStandardBulletUpdate( wxUpdateUIEvent& event ); + + /// Just transfer to the window + void DoTransferDataToWindow(); + + /// Transfer from the window and preview + void TransferAndPreview(); + +////@begin wxRichTextListStylePage event handler declarations + + /// wxEVT_COMMAND_SPINCTRL_UPDATED event handler for ID_RICHTEXTLISTSTYLEPAGE_LEVEL + void OnLevelUpdated( wxSpinEvent& event ); + + /// wxEVT_SCROLL_LINEUP event handler for ID_RICHTEXTLISTSTYLEPAGE_LEVEL + void OnLevelUp( wxSpinEvent& event ); + + /// wxEVT_SCROLL_LINEDOWN event handler for ID_RICHTEXTLISTSTYLEPAGE_LEVEL + void OnLevelDown( wxSpinEvent& event ); + + /// wxEVT_COMMAND_TEXT_UPDATED event handler for ID_RICHTEXTLISTSTYLEPAGE_LEVEL + void OnLevelTextUpdated( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTLISTSTYLEPAGE_LEVEL + void OnLevelUIUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_RICHTEXTLISTSTYLEPAGE_CHOOSE_FONT + void OnChooseFontClick( wxCommandEvent& event ); + + /// wxEVT_COMMAND_LISTBOX_SELECTED event handler for ID_RICHTEXTLISTSTYLEPAGE_STYLELISTBOX + void OnStylelistboxSelected( wxCommandEvent& event ); + + /// wxEVT_COMMAND_CHECKBOX_CLICKED event handler for ID_RICHTEXTLISTSTYLEPAGE_PERIODCTRL + void OnPeriodctrlClick( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTLISTSTYLEPAGE_PERIODCTRL + void OnPeriodctrlUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_COMMAND_CHECKBOX_CLICKED event handler for ID_RICHTEXTLISTSTYLEPAGE_PARENTHESESCTRL + void OnParenthesesctrlClick( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTLISTSTYLEPAGE_PARENTHESESCTRL + void OnParenthesesctrlUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_COMMAND_CHECKBOX_CLICKED event handler for ID_RICHTEXTLISTSTYLEPAGE_RIGHTPARENTHESISCTRL + void OnRightParenthesisCtrlClick( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTLISTSTYLEPAGE_RIGHTPARENTHESISCTRL + void OnRightParenthesisCtrlUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_COMMAND_COMBOBOX_SELECTED event handler for ID_RICHTEXTLISTSTYLEPAGE_BULLETALIGNMENTCTRL + void OnBulletAlignmentCtrlSelected( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTLISTSTYLEPAGE_SYMBOLSTATIC + void OnSymbolstaticUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_COMMAND_COMBOBOX_SELECTED event handler for ID_RICHTEXTLISTSTYLEPAGE_SYMBOLCTRL + void OnSymbolctrlSelected( wxCommandEvent& event ); + + /// wxEVT_COMMAND_TEXT_UPDATED event handler for ID_RICHTEXTLISTSTYLEPAGE_SYMBOLCTRL + void OnSymbolctrlUpdated( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTLISTSTYLEPAGE_SYMBOLCTRL + void OnSymbolctrlUIUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_RICHTEXTLISTSTYLEPAGE_CHOOSE_SYMBOL + void OnChooseSymbolClick( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTLISTSTYLEPAGE_CHOOSE_SYMBOL + void OnChooseSymbolUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_COMMAND_COMBOBOX_SELECTED event handler for ID_RICHTEXTLISTSTYLEPAGE_SYMBOLFONTCTRL + void OnSymbolfontctrlSelected( wxCommandEvent& event ); + + /// wxEVT_COMMAND_TEXT_UPDATED event handler for ID_RICHTEXTLISTSTYLEPAGE_SYMBOLFONTCTRL + void OnSymbolfontctrlUpdated( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTLISTSTYLEPAGE_SYMBOLFONTCTRL + void OnSymbolfontctrlUIUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTLISTSTYLEPAGE_NAMESTATIC + void OnNamestaticUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_COMMAND_COMBOBOX_SELECTED event handler for ID_RICHTEXTLISTSTYLEPAGE_NAMECTRL + void OnNamectrlSelected( wxCommandEvent& event ); + + /// wxEVT_COMMAND_TEXT_UPDATED event handler for ID_RICHTEXTLISTSTYLEPAGE_NAMECTRL + void OnNamectrlUpdated( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTLISTSTYLEPAGE_NAMECTRL + void OnNamectrlUIUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for ID_RICHTEXTLISTSTYLEPAGE_ALIGNLEFT + void OnRichtextliststylepageAlignleftSelected( wxCommandEvent& event ); + + /// wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for ID_RICHTEXTLISTSTYLEPAGE_ALIGNRIGHT + void OnRichtextliststylepageAlignrightSelected( wxCommandEvent& event ); + + /// wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for ID_RICHTEXTLISTSTYLEPAGE_JUSTIFIED + void OnRichtextliststylepageJustifiedSelected( wxCommandEvent& event ); + + /// wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for ID_RICHTEXTLISTSTYLEPAGE_CENTERED + void OnRichtextliststylepageCenteredSelected( wxCommandEvent& event ); + + /// wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for ID_RICHTEXTLISTSTYLEPAGE_ALIGNINDETERMINATE + void OnRichtextliststylepageAlignindeterminateSelected( wxCommandEvent& event ); + + /// wxEVT_COMMAND_TEXT_UPDATED event handler for ID_RICHTEXTLISTSTYLEPAGE_INDENTLEFT + void OnIndentLeftUpdated( wxCommandEvent& event ); + + /// wxEVT_COMMAND_TEXT_UPDATED event handler for ID_RICHTEXTLISTSTYLEPAGE_INDENTFIRSTLINE + void OnIndentFirstLineUpdated( wxCommandEvent& event ); + + /// wxEVT_COMMAND_TEXT_UPDATED event handler for ID_RICHTEXTLISTSTYLEPAGE_INDENTRIGHT + void OnIndentRightUpdated( wxCommandEvent& event ); + + /// wxEVT_COMMAND_TEXT_UPDATED event handler for ID_RICHTEXTLISTSTYLEPAGE_SPACINGBEFORE + void OnSpacingBeforeUpdated( wxCommandEvent& event ); + + /// wxEVT_COMMAND_TEXT_UPDATED event handler for ID_RICHTEXTLISTSTYLEPAGE_SPACINGAFTER + void OnSpacingAfterUpdated( wxCommandEvent& event ); + + /// wxEVT_COMMAND_COMBOBOX_SELECTED event handler for ID_RICHTEXTLISTSTYLEPAGE_LINESPACING + void OnLineSpacingSelected( wxCommandEvent& event ); + +////@end wxRichTextListStylePage event handler declarations + +////@begin wxRichTextListStylePage member function declarations + + /// Retrieves bitmap resources + wxBitmap GetBitmapResource( const wxString& name ); + + /// Retrieves icon resources + wxIcon GetIconResource( const wxString& name ); +////@end wxRichTextListStylePage member function declarations + + /// Should we show tooltips? + static bool ShowToolTips(); + +////@begin wxRichTextListStylePage member variables + wxSpinCtrl* m_levelCtrl; + wxListBox* m_styleListBox; + wxCheckBox* m_periodCtrl; + wxCheckBox* m_parenthesesCtrl; + wxCheckBox* m_rightParenthesisCtrl; + wxComboBox* m_bulletAlignmentCtrl; + wxComboBox* m_symbolCtrl; + wxComboBox* m_symbolFontCtrl; + wxComboBox* m_bulletNameCtrl; + wxRadioButton* m_alignmentLeft; + wxRadioButton* m_alignmentRight; + wxRadioButton* m_alignmentJustified; + wxRadioButton* m_alignmentCentred; + wxRadioButton* m_alignmentIndeterminate; + wxTextCtrl* m_indentLeft; + wxTextCtrl* m_indentLeftFirst; + wxTextCtrl* m_indentRight; + wxTextCtrl* m_spacingBefore; + wxTextCtrl* m_spacingAfter; + wxComboBox* m_spacingLine; + wxRichTextCtrl* m_previewCtrl; + /// Control identifiers + enum { + ID_RICHTEXTLISTSTYLEPAGE = 10616, + ID_RICHTEXTLISTSTYLEPAGE_LEVEL = 10617, + ID_RICHTEXTLISTSTYLEPAGE_CHOOSE_FONT = 10604, + ID_RICHTEXTLISTSTYLEPAGE_NOTEBOOK = 10618, + ID_RICHTEXTLISTSTYLEPAGE_BULLETS = 10619, + ID_RICHTEXTLISTSTYLEPAGE_STYLELISTBOX = 10620, + ID_RICHTEXTLISTSTYLEPAGE_PERIODCTRL = 10627, + ID_RICHTEXTLISTSTYLEPAGE_PARENTHESESCTRL = 10626, + ID_RICHTEXTLISTSTYLEPAGE_RIGHTPARENTHESISCTRL = 10602, + ID_RICHTEXTLISTSTYLEPAGE_BULLETALIGNMENTCTRL = 10603, + ID_RICHTEXTLISTSTYLEPAGE_SYMBOLSTATIC = 10621, + ID_RICHTEXTLISTSTYLEPAGE_SYMBOLCTRL = 10622, + ID_RICHTEXTLISTSTYLEPAGE_CHOOSE_SYMBOL = 10623, + ID_RICHTEXTLISTSTYLEPAGE_SYMBOLFONTCTRL = 10625, + ID_RICHTEXTLISTSTYLEPAGE_NAMESTATIC = 10600, + ID_RICHTEXTLISTSTYLEPAGE_NAMECTRL = 10601, + ID_RICHTEXTLISTSTYLEPAGE_SPACING = 10628, + ID_RICHTEXTLISTSTYLEPAGE_ALIGNLEFT = 10629, + ID_RICHTEXTLISTSTYLEPAGE_ALIGNRIGHT = 10630, + ID_RICHTEXTLISTSTYLEPAGE_JUSTIFIED = 10631, + ID_RICHTEXTLISTSTYLEPAGE_CENTERED = 10632, + ID_RICHTEXTLISTSTYLEPAGE_ALIGNINDETERMINATE = 10633, + ID_RICHTEXTLISTSTYLEPAGE_INDENTLEFT = 10634, + ID_RICHTEXTLISTSTYLEPAGE_INDENTFIRSTLINE = 10635, + ID_RICHTEXTLISTSTYLEPAGE_INDENTRIGHT = 10636, + ID_RICHTEXTLISTSTYLEPAGE_SPACINGBEFORE = 10637, + ID_RICHTEXTLISTSTYLEPAGE_SPACINGAFTER = 10638, + ID_RICHTEXTLISTSTYLEPAGE_LINESPACING = 10639, + ID_RICHTEXTLISTSTYLEPAGE_RICHTEXTCTRL = 10640 + }; +////@end wxRichTextListStylePage member variables + + bool m_dontUpdate; + int m_currentLevel; +}; + +#endif + // _RICHTEXTLISTSTYLEPAGE_H_ diff --git a/Externals/wxWidgets/include/wx/richtext/richtextprint.h b/Externals/wxWidgets/include/wx/richtext/richtextprint.h new file mode 100644 index 0000000000..4cf0dbaf52 --- /dev/null +++ b/Externals/wxWidgets/include/wx/richtext/richtextprint.h @@ -0,0 +1,247 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/richtext/richtextprint.h +// Purpose: Rich text printing classes +// Author: Julian Smart +// Created: 2006-10-23 +// RCS-ID: $Id: richtextprint.h 43603 2006-11-22 17:11:53Z JS $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_RICHTEXTPRINT_H_ +#define _WX_RICHTEXTPRINT_H_ + +#include "wx/defs.h" + +#if wxUSE_RICHTEXT & wxUSE_PRINTING_ARCHITECTURE + +#include "wx/richtext/richtextbuffer.h" + +#include "wx/print.h" +#include "wx/printdlg.h" + +#define wxRICHTEXT_PRINT_MAX_PAGES 99999 + +// Header/footer page identifiers +enum wxRichTextOddEvenPage { + wxRICHTEXT_PAGE_ODD, + wxRICHTEXT_PAGE_EVEN, + wxRICHTEXT_PAGE_ALL +}; + +// Header/footer text locations +enum wxRichTextPageLocation { + wxRICHTEXT_PAGE_LEFT, + wxRICHTEXT_PAGE_CENTRE, + wxRICHTEXT_PAGE_RIGHT +}; + +/*! + * Header/footer data + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextHeaderFooterData: public wxObject +{ +public: + wxRichTextHeaderFooterData() { Init(); } + wxRichTextHeaderFooterData(const wxRichTextHeaderFooterData& data): wxObject() { Copy(data); } + + /// Initialise + void Init() { m_headerMargin = 20; m_footerMargin = 20; m_showOnFirstPage = true; } + + /// Copy + void Copy(const wxRichTextHeaderFooterData& data); + + /// Assignment + void operator= (const wxRichTextHeaderFooterData& data) { Copy(data); } + + /// Set/get header text, e.g. wxRICHTEXT_PAGE_ODD, wxRICHTEXT_PAGE_LEFT + void SetHeaderText(const wxString& text, wxRichTextOddEvenPage page = wxRICHTEXT_PAGE_ALL, wxRichTextPageLocation location = wxRICHTEXT_PAGE_CENTRE); + wxString GetHeaderText(wxRichTextOddEvenPage page = wxRICHTEXT_PAGE_EVEN, wxRichTextPageLocation location = wxRICHTEXT_PAGE_CENTRE) const; + + /// Set/get footer text, e.g. wxRICHTEXT_PAGE_ODD, wxRICHTEXT_PAGE_LEFT + void SetFooterText(const wxString& text, wxRichTextOddEvenPage page = wxRICHTEXT_PAGE_ALL, wxRichTextPageLocation location = wxRICHTEXT_PAGE_CENTRE); + wxString GetFooterText(wxRichTextOddEvenPage page = wxRICHTEXT_PAGE_EVEN, wxRichTextPageLocation location = wxRICHTEXT_PAGE_CENTRE) const; + + /// Set/get text + void SetText(const wxString& text, int headerFooter, wxRichTextOddEvenPage page, wxRichTextPageLocation location); + wxString GetText(int headerFooter, wxRichTextOddEvenPage page, wxRichTextPageLocation location) const; + + /// Set/get margins between text and header or footer, in tenths of a millimeter + void SetMargins(int headerMargin, int footerMargin) { m_headerMargin = headerMargin; m_footerMargin = footerMargin; } + int GetHeaderMargin() const { return m_headerMargin; } + int GetFooterMargin() const { return m_footerMargin; } + + /// Set/get whether to show header or footer on first page + void SetShowOnFirstPage(bool showOnFirstPage) { m_showOnFirstPage = showOnFirstPage; } + bool GetShowOnFirstPage() const { return m_showOnFirstPage; } + + /// Clear all text + void Clear(); + + /// Set/get font + void SetFont(const wxFont& font) { m_font = font; } + const wxFont& GetFont() const { return m_font; } + + /// Set/get colour + void SetTextColour(const wxColour& col) { m_colour = col; } + const wxColour& GetTextColour() const { return m_colour; } + + DECLARE_CLASS(wxRichTextHeaderFooterData) + +private: + + // Strings for left, centre, right, top, bottom, odd, even + wxString m_text[12]; + wxFont m_font; + wxColour m_colour; + int m_headerMargin; + int m_footerMargin; + bool m_showOnFirstPage; +}; + +/*! + * wxRichTextPrintout + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextPrintout : public wxPrintout +{ +public: + wxRichTextPrintout(const wxString& title = wxT("Printout")); + virtual ~wxRichTextPrintout(); + + /// The buffer to print + void SetRichTextBuffer(wxRichTextBuffer* buffer) { m_richTextBuffer = buffer; } + wxRichTextBuffer* GetRichTextBuffer() const { return m_richTextBuffer; } + + /// Set/get header/footer data + void SetHeaderFooterData(const wxRichTextHeaderFooterData& data) { m_headerFooterData = data; } + const wxRichTextHeaderFooterData& GetHeaderFooterData() const { return m_headerFooterData; } + + /// Sets margins in 10ths of millimetre. Defaults to 1 inch for margins. + void SetMargins(int top = 252, int bottom = 252, int left = 252, int right = 252); + + /// Calculate scaling and rectangles, setting the device context scaling + void CalculateScaling(wxDC* dc, wxRect& textRect, wxRect& headerRect, wxRect& footerRect); + + // wxPrintout virtual functions + virtual bool OnPrintPage(int page); + virtual bool HasPage(int page); + virtual void GetPageInfo(int *minPage, int *maxPage, int *selPageFrom, int *selPageTo); + virtual bool OnBeginDocument(int startPage, int endPage); + virtual void OnPreparePrinting(); + +private: + + /// Renders one page into dc + void RenderPage(wxDC *dc, int page); + + /// Substitute keywords + static bool SubstituteKeywords(wxString& str, const wxString& title, int pageNum, int pageCount); + +private: + + wxRichTextBuffer* m_richTextBuffer; + int m_numPages; + wxArrayInt m_pageBreaksStart; + wxArrayInt m_pageBreaksEnd; + int m_marginLeft, m_marginTop, m_marginRight, m_marginBottom; + + wxRichTextHeaderFooterData m_headerFooterData; + + DECLARE_NO_COPY_CLASS(wxRichTextPrintout) +}; + +/* + *! wxRichTextPrinting + * A simple interface to perform wxRichTextBuffer printing. + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextPrinting : public wxObject +{ +public: + wxRichTextPrinting(const wxString& name = wxT("Printing"), wxWindow *parentWindow = NULL); + virtual ~wxRichTextPrinting(); + + /// Preview the file or buffer + bool PreviewFile(const wxString& richTextFile); + bool PreviewBuffer(const wxRichTextBuffer& buffer); + + /// Print the file or buffer + bool PrintFile(const wxString& richTextFile); + bool PrintBuffer(const wxRichTextBuffer& buffer); + + /// Shows page setup dialog + void PageSetup(); + + /// Set/get header/footer data + void SetHeaderFooterData(const wxRichTextHeaderFooterData& data) { m_headerFooterData = data; } + const wxRichTextHeaderFooterData& GetHeaderFooterData() const { return m_headerFooterData; } + + /// Set/get header text, e.g. wxRICHTEXT_PAGE_ODD, wxRICHTEXT_PAGE_LEFT + void SetHeaderText(const wxString& text, wxRichTextOddEvenPage page = wxRICHTEXT_PAGE_ALL, wxRichTextPageLocation location = wxRICHTEXT_PAGE_CENTRE); + wxString GetHeaderText(wxRichTextOddEvenPage page = wxRICHTEXT_PAGE_EVEN, wxRichTextPageLocation location = wxRICHTEXT_PAGE_CENTRE) const; + + /// Set/get footer text, e.g. wxRICHTEXT_PAGE_ODD, wxRICHTEXT_PAGE_LEFT + void SetFooterText(const wxString& text, wxRichTextOddEvenPage page = wxRICHTEXT_PAGE_ALL, wxRichTextPageLocation location = wxRICHTEXT_PAGE_CENTRE); + wxString GetFooterText(wxRichTextOddEvenPage page = wxRICHTEXT_PAGE_EVEN, wxRichTextPageLocation location = wxRICHTEXT_PAGE_CENTRE) const; + + /// Show header/footer on first page, or not + void SetShowOnFirstPage(bool show) { m_headerFooterData.SetShowOnFirstPage(show); } + + /// Set the font + void SetHeaderFooterFont(const wxFont& font) { m_headerFooterData.SetFont(font); } + + /// Set the colour + void SetHeaderFooterTextColour(const wxColour& font) { m_headerFooterData.SetTextColour(font); } + + /// Get print and page setup data + wxPrintData *GetPrintData(); + wxPageSetupDialogData *GetPageSetupData() { return m_pageSetupData; } + + /// Set print and page setup data + void SetPrintData(const wxPrintData& printData); + void SetPageSetupData(const wxPageSetupData& pageSetupData); + + /// Set the rich text buffer pointer, deleting the existing object if present + void SetRichTextBufferPreview(wxRichTextBuffer* buf); + wxRichTextBuffer* GetRichTextBufferPreview() const { return m_richTextBufferPreview; } + + void SetRichTextBufferPrinting(wxRichTextBuffer* buf); + wxRichTextBuffer* GetRichTextBufferPrinting() const { return m_richTextBufferPrinting; } + + /// Set/get the parent window + void SetParentWindow(wxWindow* parent) { m_parentWindow = parent; } + wxWindow* GetParentWindow() const { return m_parentWindow; } + + /// Set/get the title + void SetTitle(const wxString& title) { m_title = title; } + const wxString& GetTitle() const { return m_title; } + + /// Set/get the preview rect + void SetPreviewRect(const wxRect& rect) { m_previewRect = rect; } + const wxRect& GetPreviewRect() const { return m_previewRect; } + +protected: + virtual wxRichTextPrintout *CreatePrintout(); + virtual bool DoPreview(wxRichTextPrintout *printout1, wxRichTextPrintout *printout2); + virtual bool DoPrint(wxRichTextPrintout *printout); + +private: + wxPrintData* m_printData; + wxPageSetupDialogData* m_pageSetupData; + + wxRichTextHeaderFooterData m_headerFooterData; + wxString m_title; + wxWindow* m_parentWindow; + wxRichTextBuffer* m_richTextBufferPreview; + wxRichTextBuffer* m_richTextBufferPrinting; + wxRect m_previewRect; + + DECLARE_NO_COPY_CLASS(wxRichTextPrinting) +}; + +#endif // wxUSE_RICHTEXT & wxUSE_PRINTING_ARCHITECTURE + +#endif // _WX_RICHTEXTPRINT_H_ + diff --git a/Externals/wxWidgets/include/wx/richtext/richtextstyledlg.h b/Externals/wxWidgets/include/wx/richtext/richtextstyledlg.h new file mode 100644 index 0000000000..1315c90311 --- /dev/null +++ b/Externals/wxWidgets/include/wx/richtext/richtextstyledlg.h @@ -0,0 +1,238 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/richtext/richtextstyledlg.h +// Purpose: +// Author: Julian Smart +// Modified by: +// Created: 10/5/2006 12:05:31 PM +// RCS-ID: $Id: richtextstyledlg.h 49398 2007-10-24 14:20:43Z JS $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _RICHTEXTSTYLEDLG_H_ +#define _RICHTEXTSTYLEDLG_H_ + +/*! + * Includes + */ + +////@begin includes +////@end includes + +#include "wx/richtext/richtextbuffer.h" +#include "wx/richtext/richtextstyles.h" +#include "wx/richtext/richtextctrl.h" + +/*! + * Forward declarations + */ + +////@begin forward declarations +class wxBoxSizer; +class wxRichTextStyleListCtrl; +class wxRichTextCtrl; +////@end forward declarations + +/*! + * Control identifiers + */ + +////@begin control identifiers +#define SYMBOL_WXRICHTEXTSTYLEORGANISERDIALOG_STYLE wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER|wxSYSTEM_MENU|wxCLOSE_BOX +#define SYMBOL_WXRICHTEXTSTYLEORGANISERDIALOG_TITLE _("Style Organiser") +#define SYMBOL_WXRICHTEXTSTYLEORGANISERDIALOG_IDNAME ID_RICHTEXTSTYLEORGANISERDIALOG +#define SYMBOL_WXRICHTEXTSTYLEORGANISERDIALOG_SIZE wxSize(400, 300) +#define SYMBOL_WXRICHTEXTSTYLEORGANISERDIALOG_POSITION wxDefaultPosition +////@end control identifiers + +/*! + * Flags for specifying permitted operations + */ + +#define wxRICHTEXT_ORGANISER_DELETE_STYLES 0x0001 +#define wxRICHTEXT_ORGANISER_CREATE_STYLES 0x0002 +#define wxRICHTEXT_ORGANISER_APPLY_STYLES 0x0004 +#define wxRICHTEXT_ORGANISER_EDIT_STYLES 0x0008 +#define wxRICHTEXT_ORGANISER_RENAME_STYLES 0x0010 +#define wxRICHTEXT_ORGANISER_OK_CANCEL 0x0020 +#define wxRICHTEXT_ORGANISER_RENUMBER 0x0040 + +// The permitted style types to show +#define wxRICHTEXT_ORGANISER_SHOW_CHARACTER 0x0100 +#define wxRICHTEXT_ORGANISER_SHOW_PARAGRAPH 0x0200 +#define wxRICHTEXT_ORGANISER_SHOW_LIST 0x0400 +#define wxRICHTEXT_ORGANISER_SHOW_ALL 0x0800 + +// Common combinations +#define wxRICHTEXT_ORGANISER_ORGANISE (wxRICHTEXT_ORGANISER_SHOW_ALL|wxRICHTEXT_ORGANISER_DELETE_STYLES|wxRICHTEXT_ORGANISER_CREATE_STYLES|wxRICHTEXT_ORGANISER_APPLY_STYLES|wxRICHTEXT_ORGANISER_EDIT_STYLES|wxRICHTEXT_ORGANISER_RENAME_STYLES) +#define wxRICHTEXT_ORGANISER_BROWSE (wxRICHTEXT_ORGANISER_SHOW_ALL|wxRICHTEXT_ORGANISER_OK_CANCEL) +#define wxRICHTEXT_ORGANISER_BROWSE_NUMBERING (wxRICHTEXT_ORGANISER_SHOW_LIST|wxRICHTEXT_ORGANISER_OK_CANCEL|wxRICHTEXT_ORGANISER_RENUMBER) + +/*! + * wxRichTextStyleOrganiserDialog class declaration + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextStyleOrganiserDialog: public wxDialog +{ + DECLARE_DYNAMIC_CLASS( wxRichTextStyleOrganiserDialog ) + DECLARE_EVENT_TABLE() + +public: + /// Constructors + wxRichTextStyleOrganiserDialog( ); + wxRichTextStyleOrganiserDialog( int flags, wxRichTextStyleSheet* sheet, wxRichTextCtrl* ctrl, wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& caption = SYMBOL_WXRICHTEXTSTYLEORGANISERDIALOG_TITLE, const wxPoint& pos = SYMBOL_WXRICHTEXTSTYLEORGANISERDIALOG_POSITION, const wxSize& size = SYMBOL_WXRICHTEXTSTYLEORGANISERDIALOG_SIZE, long style = SYMBOL_WXRICHTEXTSTYLEORGANISERDIALOG_STYLE ); + + /// Creation + bool Create( int flags, wxRichTextStyleSheet* sheet, wxRichTextCtrl* ctrl, wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& caption = SYMBOL_WXRICHTEXTSTYLEORGANISERDIALOG_TITLE, const wxPoint& pos = SYMBOL_WXRICHTEXTSTYLEORGANISERDIALOG_POSITION, const wxSize& size = SYMBOL_WXRICHTEXTSTYLEORGANISERDIALOG_SIZE, long style = SYMBOL_WXRICHTEXTSTYLEORGANISERDIALOG_STYLE ); + + /// Creates the controls and sizers + void CreateControls(); + + /// Initialise member variables + void Init(); + + /// Transfer data from/to window + virtual bool TransferDataFromWindow(); + virtual bool TransferDataToWindow(); + + /// Set/get style sheet + void SetStyleSheet(wxRichTextStyleSheet* sheet) { m_richTextStyleSheet = sheet; } + wxRichTextStyleSheet* GetStyleSheet() const { return m_richTextStyleSheet; } + + /// Set/get control + void SetRichTextCtrl(wxRichTextCtrl* ctrl) { m_richTextCtrl = ctrl; } + wxRichTextCtrl* GetRichTextCtrl() const { return m_richTextCtrl; } + + /// Set/get flags + void SetFlags(int flags) { m_flags = flags; } + int GetFlags() const { return m_flags; } + + /// Show preview for given or selected preview + void ShowPreview(int sel = -1); + + /// Clears the preview + void ClearPreview(); + + /// List selection + void OnListSelection(wxCommandEvent& event); + + /// Get/set restart numbering boolean + bool GetRestartNumbering() const { return m_restartNumbering; } + void SetRestartNumbering(bool restartNumbering) { m_restartNumbering = restartNumbering; } + + /// Get selected style name or definition + wxString GetSelectedStyle() const; + wxRichTextStyleDefinition* GetSelectedStyleDefinition() const; + + /// Apply the style + bool ApplyStyle(wxRichTextCtrl* ctrl = NULL); + + /// Should we show tooltips? + static bool ShowToolTips() { return sm_showToolTips; } + + /// Determines whether tooltips will be shown + static void SetShowToolTips(bool show) { sm_showToolTips = show; } + +////@begin wxRichTextStyleOrganiserDialog event handler declarations + + /// wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_RICHTEXTSTYLEORGANISERDIALOG_NEW_CHAR + void OnNewCharClick( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTSTYLEORGANISERDIALOG_NEW_CHAR + void OnNewCharUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_RICHTEXTSTYLEORGANISERDIALOG_NEW_PARA + void OnNewParaClick( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTSTYLEORGANISERDIALOG_NEW_PARA + void OnNewParaUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_RICHTEXTSTYLEORGANISERDIALOG_NEW_LIST + void OnNewListClick( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTSTYLEORGANISERDIALOG_NEW_LIST + void OnNewListUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_RICHTEXTSTYLEORGANISERDIALOG_APPLY + void OnApplyClick( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTSTYLEORGANISERDIALOG_APPLY + void OnApplyUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_RICHTEXTSTYLEORGANISERDIALOG_RENAME + void OnRenameClick( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTSTYLEORGANISERDIALOG_RENAME + void OnRenameUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_RICHTEXTSTYLEORGANISERDIALOG_EDIT + void OnEditClick( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTSTYLEORGANISERDIALOG_EDIT + void OnEditUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_RICHTEXTSTYLEORGANISERDIALOG_DELETE + void OnDeleteClick( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTSTYLEORGANISERDIALOG_DELETE + void OnDeleteUpdate( wxUpdateUIEvent& event ); + +////@end wxRichTextStyleOrganiserDialog event handler declarations + +////@begin wxRichTextStyleOrganiserDialog member function declarations + + /// Retrieves bitmap resources + wxBitmap GetBitmapResource( const wxString& name ); + + /// Retrieves icon resources + wxIcon GetIconResource( const wxString& name ); +////@end wxRichTextStyleOrganiserDialog member function declarations + +////@begin wxRichTextStyleOrganiserDialog member variables + wxBoxSizer* m_innerSizer; + wxBoxSizer* m_buttonSizerParent; + wxRichTextStyleListCtrl* m_stylesListBox; + wxRichTextCtrl* m_previewCtrl; + wxBoxSizer* m_buttonSizer; + wxButton* m_newCharacter; + wxButton* m_newParagraph; + wxButton* m_newList; + wxButton* m_applyStyle; + wxButton* m_renameStyle; + wxButton* m_editStyle; + wxButton* m_deleteStyle; + wxButton* m_closeButton; + wxBoxSizer* m_bottomButtonSizer; + wxCheckBox* m_restartNumberingCtrl; + wxButton* m_okButton; + wxButton* m_cancelButton; + /// Control identifiers + enum { + ID_RICHTEXTSTYLEORGANISERDIALOG = 10500, + ID_RICHTEXTSTYLEORGANISERDIALOG_STYLES = 10501, + ID_RICHTEXTSTYLEORGANISERDIALOG_CURRENT_STYLE = 10510, + ID_RICHTEXTSTYLEORGANISERDIALOG_PREVIEW = 10509, + ID_RICHTEXTSTYLEORGANISERDIALOG_NEW_CHAR = 10504, + ID_RICHTEXTSTYLEORGANISERDIALOG_NEW_PARA = 10505, + ID_RICHTEXTSTYLEORGANISERDIALOG_NEW_LIST = 10508, + ID_RICHTEXTSTYLEORGANISERDIALOG_APPLY = 10503, + ID_RICHTEXTSTYLEORGANISERDIALOG_RENAME = 10502, + ID_RICHTEXTSTYLEORGANISERDIALOG_EDIT = 10506, + ID_RICHTEXTSTYLEORGANISERDIALOG_DELETE = 10507, + ID_RICHTEXTSTYLEORGANISERDIALOG_RESTART_NUMBERING = 10511 + }; +////@end wxRichTextStyleOrganiserDialog member variables + +private: + + wxRichTextCtrl* m_richTextCtrl; + wxRichTextStyleSheet* m_richTextStyleSheet; + + bool m_dontUpdate; + int m_flags; + static bool sm_showToolTips; + bool m_restartNumbering; +}; + +#endif + // _RICHTEXTSTYLEDLG_H_ diff --git a/Externals/wxWidgets/include/wx/richtext/richtextstylepage.h b/Externals/wxWidgets/include/wx/richtext/richtextstylepage.h new file mode 100644 index 0000000000..64f2d66390 --- /dev/null +++ b/Externals/wxWidgets/include/wx/richtext/richtextstylepage.h @@ -0,0 +1,91 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/richtext/richtextstylepage.h +// Purpose: +// Author: Julian Smart +// Modified by: +// Created: 10/5/2006 11:34:55 AM +// RCS-ID: $Id: richtextstylepage.h 42678 2006-10-29 22:01:06Z JS $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _RICHTEXTSTYLEPAGE_H_ +#define _RICHTEXTSTYLEPAGE_H_ + +/*! + * Control identifiers + */ + +////@begin control identifiers +#define SYMBOL_WXRICHTEXTSTYLEPAGE_STYLE wxRESIZE_BORDER|wxTAB_TRAVERSAL +#define SYMBOL_WXRICHTEXTSTYLEPAGE_TITLE _("wxRichTextStylePage") +#define SYMBOL_WXRICHTEXTSTYLEPAGE_IDNAME ID_RICHTEXTSTYLEPAGE +#define SYMBOL_WXRICHTEXTSTYLEPAGE_SIZE wxSize(400, 300) +#define SYMBOL_WXRICHTEXTSTYLEPAGE_POSITION wxDefaultPosition +////@end control identifiers + +/*! + * wxRichTextStylePage class declaration + */ + +class wxRichTextStylePage: public wxPanel +{ + DECLARE_DYNAMIC_CLASS( wxRichTextStylePage ) + DECLARE_EVENT_TABLE() + +public: + /// Constructors + wxRichTextStylePage( ); + wxRichTextStylePage( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = SYMBOL_WXRICHTEXTSTYLEPAGE_POSITION, const wxSize& size = SYMBOL_WXRICHTEXTSTYLEPAGE_SIZE, long style = SYMBOL_WXRICHTEXTSTYLEPAGE_STYLE ); + + /// Creation + bool Create( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = SYMBOL_WXRICHTEXTSTYLEPAGE_POSITION, const wxSize& size = SYMBOL_WXRICHTEXTSTYLEPAGE_SIZE, long style = SYMBOL_WXRICHTEXTSTYLEPAGE_STYLE ); + + /// Initialise members + void Init(); + + /// Creates the controls and sizers + void CreateControls(); + + /// Transfer data from/to window + virtual bool TransferDataFromWindow(); + virtual bool TransferDataToWindow(); + + /// Gets the attributes associated with the main formatting dialog + wxTextAttrEx* GetAttributes(); + +////@begin wxRichTextStylePage event handler declarations + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTSTYLEPAGE_NEXT_STYLE + void OnNextStyleUpdate( wxUpdateUIEvent& event ); + +////@end wxRichTextStylePage event handler declarations + +////@begin wxRichTextStylePage member function declarations + + /// Retrieves bitmap resources + wxBitmap GetBitmapResource( const wxString& name ); + + /// Retrieves icon resources + wxIcon GetIconResource( const wxString& name ); +////@end wxRichTextStylePage member function declarations + + /// Should we show tooltips? + static bool ShowToolTips(); + +////@begin wxRichTextStylePage member variables + wxTextCtrl* m_styleName; + wxComboBox* m_basedOn; + wxComboBox* m_nextStyle; + /// Control identifiers + enum { + ID_RICHTEXTSTYLEPAGE = 10403, + ID_RICHTEXTSTYLEPAGE_STYLE_NAME = 10404, + ID_RICHTEXTSTYLEPAGE_BASED_ON = 10405, + ID_RICHTEXTSTYLEPAGE_NEXT_STYLE = 10406 + }; +////@end wxRichTextStylePage member variables +}; + +#endif + // _RICHTEXTSTYLEPAGE_H_ diff --git a/Externals/wxWidgets/include/wx/richtext/richtextstyles.h b/Externals/wxWidgets/include/wx/richtext/richtextstyles.h new file mode 100644 index 0000000000..328813dc86 --- /dev/null +++ b/Externals/wxWidgets/include/wx/richtext/richtextstyles.h @@ -0,0 +1,683 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/richtext/richtextstyles.h +// Purpose: Style management for wxRichTextCtrl +// Author: Julian Smart +// Modified by: +// Created: 2005-09-30 +// RCS-ID: $Id: richtextstyles.h 49804 2007-11-10 01:09:42Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_RICHTEXTSTYLES_H_ +#define _WX_RICHTEXTSTYLES_H_ + +/*! + * Includes + */ + +#include "wx/defs.h" + +#if wxUSE_RICHTEXT + +#include "wx/richtext/richtextbuffer.h" + +#if wxUSE_HTML +#include "wx/htmllbox.h" +#endif + +#if wxUSE_COMBOCTRL +#include "wx/combo.h" +#endif + +#include "wx/choice.h" + +/*! + * Forward declarations + */ + +class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextCtrl; +class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextBuffer; + +/*! + * wxRichTextStyleDefinition class declaration + * A base class for paragraph and character styles. + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextStyleDefinition: public wxObject +{ + DECLARE_CLASS(wxRichTextStyleDefinition) +public: + + /// Copy constructors + wxRichTextStyleDefinition(const wxRichTextStyleDefinition& def) + : wxObject() + { + Init(); + Copy(def); + } + + /// Default constructor + wxRichTextStyleDefinition(const wxString& name = wxEmptyString) { Init(); m_name = name; } + + /// Destructor + virtual ~wxRichTextStyleDefinition() {} + + /// Initialises members + void Init() {} + + /// Copies from def + void Copy(const wxRichTextStyleDefinition& def); + + /// Equality test + bool Eq(const wxRichTextStyleDefinition& def) const; + + /// Assignment operator + void operator =(const wxRichTextStyleDefinition& def) { Copy(def); } + + /// Equality operator + bool operator ==(const wxRichTextStyleDefinition& def) const { return Eq(def); } + + /// Override to clone the object + virtual wxRichTextStyleDefinition* Clone() const = 0; + + /// Sets and gets the name of the style + void SetName(const wxString& name) { m_name = name; } + const wxString& GetName() const { return m_name; } + + /// Sets and gets the style description + void SetDescription(const wxString& descr) { m_description = descr; } + const wxString& GetDescription() const { return m_description; } + + /// Sets and gets the name of the style that this style is based on + void SetBaseStyle(const wxString& name) { m_baseStyle = name; } + const wxString& GetBaseStyle() const { return m_baseStyle; } + + /// Sets and gets the style + void SetStyle(const wxRichTextAttr& style) { m_style = style; } + const wxRichTextAttr& GetStyle() const { return m_style; } + wxRichTextAttr& GetStyle() { return m_style; } + + /// Gets the style combined with the base style + virtual wxRichTextAttr GetStyleMergedWithBase(const wxRichTextStyleSheet* sheet) const; + +protected: + wxString m_name; + wxString m_baseStyle; + wxString m_description; + wxRichTextAttr m_style; +}; + +/*! + * wxRichTextCharacterStyleDefinition class declaration + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextCharacterStyleDefinition: public wxRichTextStyleDefinition +{ + DECLARE_DYNAMIC_CLASS(wxRichTextCharacterStyleDefinition) +public: + + /// Copy constructor + wxRichTextCharacterStyleDefinition(const wxRichTextCharacterStyleDefinition& def): wxRichTextStyleDefinition(def) {} + + /// Default constructor + wxRichTextCharacterStyleDefinition(const wxString& name = wxEmptyString): + wxRichTextStyleDefinition(name) {} + + /// Destructor + virtual ~wxRichTextCharacterStyleDefinition() {} + + /// Clones the object + virtual wxRichTextStyleDefinition* Clone() const { return new wxRichTextCharacterStyleDefinition(*this); } + +protected: +}; + +/*! + * wxRichTextParagraphStyleDefinition class declaration + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextParagraphStyleDefinition: public wxRichTextStyleDefinition +{ + DECLARE_DYNAMIC_CLASS(wxRichTextParagraphStyleDefinition) +public: + + /// Copy constructor + wxRichTextParagraphStyleDefinition(const wxRichTextParagraphStyleDefinition& def): wxRichTextStyleDefinition(def) { m_nextStyle = def.m_nextStyle; } + + /// Default constructor + wxRichTextParagraphStyleDefinition(const wxString& name = wxEmptyString): + wxRichTextStyleDefinition(name) {} + + // Destructor + virtual ~wxRichTextParagraphStyleDefinition() {} + + /// Sets and gets the next style + void SetNextStyle(const wxString& name) { m_nextStyle = name; } + const wxString& GetNextStyle() const { return m_nextStyle; } + + /// Copies from def + void Copy(const wxRichTextParagraphStyleDefinition& def); + + /// Assignment operator + void operator =(const wxRichTextParagraphStyleDefinition& def) { Copy(def); } + + /// Equality operator + bool operator ==(const wxRichTextParagraphStyleDefinition& def) const; + + /// Clones the object + virtual wxRichTextStyleDefinition* Clone() const { return new wxRichTextParagraphStyleDefinition(*this); } + +protected: + + /// The next style to use when adding a paragraph after this style. + wxString m_nextStyle; +}; + +/*! + * wxRichTextListStyleDefinition class declaration + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextListStyleDefinition: public wxRichTextParagraphStyleDefinition +{ + DECLARE_DYNAMIC_CLASS(wxRichTextListStyleDefinition) +public: + + /// Copy constructor + wxRichTextListStyleDefinition(const wxRichTextListStyleDefinition& def): wxRichTextParagraphStyleDefinition(def) { Init(); Copy(def); } + + /// Default constructor + wxRichTextListStyleDefinition(const wxString& name = wxEmptyString): + wxRichTextParagraphStyleDefinition(name) { Init(); } + + /// Destructor + virtual ~wxRichTextListStyleDefinition() {} + + /// Copies from def + void Copy(const wxRichTextListStyleDefinition& def); + + /// Assignment operator + void operator =(const wxRichTextListStyleDefinition& def) { Copy(def); } + + /// Equality operator + bool operator ==(const wxRichTextListStyleDefinition& def) const; + + /// Clones the object + virtual wxRichTextStyleDefinition* Clone() const { return new wxRichTextListStyleDefinition(*this); } + + /// Sets/gets the attributes for the given level + void SetLevelAttributes(int i, const wxRichTextAttr& attr); + wxRichTextAttr* GetLevelAttributes(int i); + const wxRichTextAttr* GetLevelAttributes(int i) const; + + /// Convenience function for setting the major attributes for a list level specification + void SetAttributes(int i, int leftIndent, int leftSubIndent, int bulletStyle, const wxString& bulletSymbol = wxEmptyString); + + /// Finds the level corresponding to the given indentation + int FindLevelForIndent(int indent) const; + + /// Combine the base and list style with a paragraph style, using the given indent (from which + /// an appropriate level is found) + wxRichTextAttr CombineWithParagraphStyle(int indent, const wxRichTextAttr& paraStyle, wxRichTextStyleSheet* styleSheet = NULL); + + /// Combine the base and list style, using the given indent (from which + /// an appropriate level is found) + wxRichTextAttr GetCombinedStyle(int indent, wxRichTextStyleSheet* styleSheet = NULL); + + /// Combine the base and list style, using the given level from which + /// an appropriate level is found) + wxRichTextAttr GetCombinedStyleForLevel(int level, wxRichTextStyleSheet* styleSheet = NULL); + + /// Gets the number of available levels + int GetLevelCount() const { return 10; } + + /// Is this a numbered list? + bool IsNumbered(int i) const; + +protected: + + /// The styles for each level (up to 10) + wxRichTextAttr m_levelStyles[10]; +}; + +/*! + * The style sheet + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextStyleSheet: public wxObject +{ + DECLARE_CLASS( wxRichTextStyleSheet ) + +public: + /// Constructors + wxRichTextStyleSheet(const wxRichTextStyleSheet& sheet) + : wxObject() + { + Init(); + Copy(sheet); + } + wxRichTextStyleSheet() { Init(); } + virtual ~wxRichTextStyleSheet(); + + /// Initialisation + void Init(); + + /// Copy + void Copy(const wxRichTextStyleSheet& sheet); + + /// Assignment + void operator=(const wxRichTextStyleSheet& sheet) { Copy(sheet); } + + /// Equality + bool operator==(const wxRichTextStyleSheet& sheet) const; + + /// Add a definition to the character style list + bool AddCharacterStyle(wxRichTextCharacterStyleDefinition* def); + + /// Add a definition to the paragraph style list + bool AddParagraphStyle(wxRichTextParagraphStyleDefinition* def); + + /// Add a definition to the list style list + bool AddListStyle(wxRichTextListStyleDefinition* def); + + /// Add a definition to the appropriate style list + bool AddStyle(wxRichTextStyleDefinition* def); + + /// Remove a character style + bool RemoveCharacterStyle(wxRichTextStyleDefinition* def, bool deleteStyle = false) { return RemoveStyle(m_characterStyleDefinitions, def, deleteStyle); } + + /// Remove a paragraph style + bool RemoveParagraphStyle(wxRichTextStyleDefinition* def, bool deleteStyle = false) { return RemoveStyle(m_paragraphStyleDefinitions, def, deleteStyle); } + + /// Remove a list style + bool RemoveListStyle(wxRichTextStyleDefinition* def, bool deleteStyle = false) { return RemoveStyle(m_listStyleDefinitions, def, deleteStyle); } + + /// Remove a style + bool RemoveStyle(wxRichTextStyleDefinition* def, bool deleteStyle = false); + + /// Find a character definition by name + wxRichTextCharacterStyleDefinition* FindCharacterStyle(const wxString& name, bool recurse = true) const { return (wxRichTextCharacterStyleDefinition*) FindStyle(m_characterStyleDefinitions, name, recurse); } + + /// Find a paragraph definition by name + wxRichTextParagraphStyleDefinition* FindParagraphStyle(const wxString& name, bool recurse = true) const { return (wxRichTextParagraphStyleDefinition*) FindStyle(m_paragraphStyleDefinitions, name, recurse); } + + /// Find a list definition by name + wxRichTextListStyleDefinition* FindListStyle(const wxString& name, bool recurse = true) const { return (wxRichTextListStyleDefinition*) FindStyle(m_listStyleDefinitions, name, recurse); } + + /// Find any definition by name + wxRichTextStyleDefinition* FindStyle(const wxString& name, bool recurse = true) const; + + /// Return the number of character styles + size_t GetCharacterStyleCount() const { return m_characterStyleDefinitions.GetCount(); } + + /// Return the number of paragraph styles + size_t GetParagraphStyleCount() const { return m_paragraphStyleDefinitions.GetCount(); } + + /// Return the number of list styles + size_t GetListStyleCount() const { return m_listStyleDefinitions.GetCount(); } + + /// Return the nth character style + wxRichTextCharacterStyleDefinition* GetCharacterStyle(size_t n) const { return (wxRichTextCharacterStyleDefinition*) m_characterStyleDefinitions.Item(n)->GetData(); } + + /// Return the nth paragraph style + wxRichTextParagraphStyleDefinition* GetParagraphStyle(size_t n) const { return (wxRichTextParagraphStyleDefinition*) m_paragraphStyleDefinitions.Item(n)->GetData(); } + + /// Return the nth list style + wxRichTextListStyleDefinition* GetListStyle(size_t n) const { return (wxRichTextListStyleDefinition*) m_listStyleDefinitions.Item(n)->GetData(); } + + /// Delete all styles + void DeleteStyles(); + + /// Insert into list of style sheets + bool InsertSheet(wxRichTextStyleSheet* before); + + /// Append to list of style sheets + bool AppendSheet(wxRichTextStyleSheet* after); + + /// Unlink from the list of style sheets + void Unlink(); + + /// Get/set next sheet + wxRichTextStyleSheet* GetNextSheet() const { return m_nextSheet; } + void SetNextSheet(wxRichTextStyleSheet* sheet) { m_nextSheet = sheet; } + + /// Get/set previous sheet + wxRichTextStyleSheet* GetPreviousSheet() const { return m_previousSheet; } + void SetPreviousSheet(wxRichTextStyleSheet* sheet) { m_previousSheet = sheet; } + + /// Sets and gets the name of the style sheet + void SetName(const wxString& name) { m_name = name; } + const wxString& GetName() const { return m_name; } + + /// Sets and gets the style description + void SetDescription(const wxString& descr) { m_description = descr; } + const wxString& GetDescription() const { return m_description; } + +/// Implementation + + /// Add a definition to one of the style lists + bool AddStyle(wxList& list, wxRichTextStyleDefinition* def); + + /// Remove a style + bool RemoveStyle(wxList& list, wxRichTextStyleDefinition* def, bool deleteStyle); + + /// Find a definition by name + wxRichTextStyleDefinition* FindStyle(const wxList& list, const wxString& name, bool recurse = true) const; + +protected: + + wxString m_description; + wxString m_name; + + wxList m_characterStyleDefinitions; + wxList m_paragraphStyleDefinitions; + wxList m_listStyleDefinitions; + + wxRichTextStyleSheet* m_previousSheet; + wxRichTextStyleSheet* m_nextSheet; +}; + +#if wxUSE_HTML +/*! + * wxRichTextStyleListBox class declaration + * A listbox to display styles. + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextStyleListBox: public wxHtmlListBox +{ + DECLARE_CLASS(wxRichTextStyleListBox) + DECLARE_EVENT_TABLE() + +public: + /// Which type of style definition is currently showing? + enum wxRichTextStyleType + { + wxRICHTEXT_STYLE_ALL, + wxRICHTEXT_STYLE_PARAGRAPH, + wxRICHTEXT_STYLE_CHARACTER, + wxRICHTEXT_STYLE_LIST + }; + + wxRichTextStyleListBox() + { + Init(); + } + wxRichTextStyleListBox(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = 0); + virtual ~wxRichTextStyleListBox(); + + void Init() + { + m_styleSheet = NULL; + m_richTextCtrl = NULL; + m_applyOnSelection = false; + m_styleType = wxRICHTEXT_STYLE_PARAGRAPH; + m_autoSetSelection = true; + } + + bool Create(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = 0); + + /// Creates a suitable HTML fragment for a definition + wxString CreateHTML(wxRichTextStyleDefinition* def) const; + + /// Associates the control with a style sheet + void SetStyleSheet(wxRichTextStyleSheet* styleSheet) { m_styleSheet = styleSheet; } + wxRichTextStyleSheet* GetStyleSheet() const { return m_styleSheet; } + + /// Associates the control with a wxRichTextCtrl + void SetRichTextCtrl(wxRichTextCtrl* ctrl) { m_richTextCtrl = ctrl; } + wxRichTextCtrl* GetRichTextCtrl() const { return m_richTextCtrl; } + + /// Get style for index + wxRichTextStyleDefinition* GetStyle(size_t i) const ; + + /// Get index for style name + int GetIndexForStyle(const wxString& name) const ; + + /// Set selection for string, returning the index. + int SetStyleSelection(const wxString& name); + + /// Updates the list + void UpdateStyles(); + + /// Apply the style + void ApplyStyle(int i); + + /// Left click + void OnLeftDown(wxMouseEvent& event); + + /// Left double-click + void OnLeftDoubleClick(wxMouseEvent& event); + + /// Auto-select from style under caret in idle time + void OnIdle(wxIdleEvent& event); + + /// Convert units in tends of a millimetre to device units + int ConvertTenthsMMToPixels(wxDC& dc, int units) const; + + /// Can we set the selection based on the editor caret position? + /// Need to override this if being used in a combobox popup + virtual bool CanAutoSetSelection() { return m_autoSetSelection; } + virtual void SetAutoSetSelection(bool autoSet) { m_autoSetSelection = autoSet; } + + /// Set whether the style should be applied as soon as the item is selected (the default) + void SetApplyOnSelection(bool applyOnSel) { m_applyOnSelection = applyOnSel; } + bool GetApplyOnSelection() const { return m_applyOnSelection; } + + /// Set the style type to display + void SetStyleType(wxRichTextStyleType styleType) { m_styleType = styleType; UpdateStyles(); } + wxRichTextStyleType GetStyleType() const { return m_styleType; } + + /// Helper for listbox and combo control + static wxString GetStyleToShowInIdleTime(wxRichTextCtrl* ctrl, wxRichTextStyleType styleType); + +protected: + /// Returns the HTML for this item + virtual wxString OnGetItem(size_t n) const; + +private: + + wxRichTextStyleSheet* m_styleSheet; + wxRichTextCtrl* m_richTextCtrl; + bool m_applyOnSelection; // if true, applies style on selection + wxRichTextStyleType m_styleType; // style type to display + bool m_autoSetSelection; + wxArrayString m_styleNames; +}; + +/*! + * wxRichTextStyleListCtrl class declaration + * This is a container for the list control plus a combobox to switch between + * style types. + */ + +#define wxRICHTEXTSTYLELIST_HIDE_TYPE_SELECTOR 0x1000 + +class WXDLLIMPEXP_RICHTEXT wxRichTextStyleListCtrl: public wxControl +{ + DECLARE_CLASS(wxRichTextStyleListCtrl) + DECLARE_EVENT_TABLE() + +public: + + /// Constructors + wxRichTextStyleListCtrl() + { + Init(); + } + + wxRichTextStyleListCtrl(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = 0); + + /// Constructors + virtual ~wxRichTextStyleListCtrl(); + + /// Member initialisation + void Init() + { + m_styleListBox = NULL; + m_styleChoice = NULL; + m_dontUpdate = false; + } + + /// Creates the windows + bool Create(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = 0); + + /// Updates the style list box + void UpdateStyles(); + + /// Associates the control with a style sheet + void SetStyleSheet(wxRichTextStyleSheet* styleSheet); + wxRichTextStyleSheet* GetStyleSheet() const; + + /// Associates the control with a wxRichTextCtrl + void SetRichTextCtrl(wxRichTextCtrl* ctrl); + wxRichTextCtrl* GetRichTextCtrl() const; + + /// Set/get the style type to display + void SetStyleType(wxRichTextStyleListBox::wxRichTextStyleType styleType); + wxRichTextStyleListBox::wxRichTextStyleType GetStyleType() const; + + /// Get the choice index for style type + int StyleTypeToIndex(wxRichTextStyleListBox::wxRichTextStyleType styleType); + + /// Get the style type for choice index + wxRichTextStyleListBox::wxRichTextStyleType StyleIndexToType(int i); + + /// Get the listbox + wxRichTextStyleListBox* GetStyleListBox() const { return m_styleListBox; } + + /// Get the choice + wxChoice* GetStyleChoice() const { return m_styleChoice; } + + /// React to style type choice + void OnChooseType(wxCommandEvent& event); + + /// Lay out the controls + void OnSize(wxSizeEvent& event); + +private: + + wxRichTextStyleListBox* m_styleListBox; + wxChoice* m_styleChoice; + bool m_dontUpdate; +}; + +#if wxUSE_COMBOCTRL + +/*! + * Style drop-down for a wxComboCtrl + */ + +class wxRichTextStyleComboPopup : public wxRichTextStyleListBox, public wxComboPopup +{ +public: + virtual void Init() + { + m_itemHere = -1; // hot item in list + m_value = -1; + } + + virtual bool Create( wxWindow* parent ) + { + return wxRichTextStyleListBox::Create(parent, wxID_ANY, + wxPoint(0,0), wxDefaultSize, + wxSIMPLE_BORDER); + } + + virtual wxWindow *GetControl() { return this; } + + virtual void SetStringValue( const wxString& s ); + + virtual wxString GetStringValue() const; + + /// Can we set the selection based on the editor caret position? + // virtual bool CanAutoSetSelection() { return ((m_combo == NULL) || !m_combo->IsPopupShown()); } + virtual bool CanAutoSetSelection() { return false; } + + // + // Popup event handlers + // + + // Mouse hot-tracking + void OnMouseMove(wxMouseEvent& event); + + // On mouse left, set the value and close the popup + void OnMouseClick(wxMouseEvent& WXUNUSED(event)); + +protected: + + int m_itemHere; // hot item in popup + int m_value; + +private: + DECLARE_EVENT_TABLE() +}; + +/*! + * wxRichTextStyleComboCtrl + * A combo for applying styles. + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextStyleComboCtrl: public wxComboCtrl +{ + DECLARE_CLASS(wxRichTextStyleComboCtrl) + DECLARE_EVENT_TABLE() + +public: + wxRichTextStyleComboCtrl() + { + Init(); + } + + wxRichTextStyleComboCtrl(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = wxCB_READONLY) + { + Init(); + Create(parent, id, pos, size, style); + } + + virtual ~wxRichTextStyleComboCtrl() {} + + void Init() + { + m_stylePopup = NULL; + } + + bool Create(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = 0); + + /// Updates the list + void UpdateStyles() { m_stylePopup->UpdateStyles(); } + + /// Associates the control with a style sheet + void SetStyleSheet(wxRichTextStyleSheet* styleSheet) { m_stylePopup->SetStyleSheet(styleSheet); } + wxRichTextStyleSheet* GetStyleSheet() const { return m_stylePopup->GetStyleSheet(); } + + /// Associates the control with a wxRichTextCtrl + void SetRichTextCtrl(wxRichTextCtrl* ctrl) { m_stylePopup->SetRichTextCtrl(ctrl); } + wxRichTextCtrl* GetRichTextCtrl() const { return m_stylePopup->GetRichTextCtrl(); } + + /// Gets the style popup + wxRichTextStyleComboPopup* GetStylePopup() const { return m_stylePopup; } + + /// Auto-select from style under caret in idle time + void OnIdle(wxIdleEvent& event); + +protected: + wxRichTextStyleComboPopup* m_stylePopup; +}; + +#endif + // wxUSE_COMBOCTRL + +#endif + // wxUSE_HTML + +#endif + // wxUSE_RICHTEXT + +#endif + // _WX_RICHTEXTSTYLES_H_ diff --git a/Externals/wxWidgets/include/wx/richtext/richtextsymboldlg.h b/Externals/wxWidgets/include/wx/richtext/richtextsymboldlg.h new file mode 100644 index 0000000000..a995422f68 --- /dev/null +++ b/Externals/wxWidgets/include/wx/richtext/richtextsymboldlg.h @@ -0,0 +1,369 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/richtext/richtextsymboldlg.h +// Purpose: +// Author: Julian Smart +// Modified by: +// Created: 10/5/2006 3:11:58 PM +// RCS-ID: $Id: richtextsymboldlg.h 49960 2007-11-15 08:03:59Z JS $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _RICHTEXTSYMBOLDLG_H_ +#define _RICHTEXTSYMBOLDLG_H_ + +/*! + * Includes + */ + +#include "wx/dialog.h" +#include "wx/vscroll.h" +#include "wx/combobox.h" +#include "wx/stattext.h" +#include "wx/textctrl.h" + +/*! + * Forward declarations + */ + +////@begin forward declarations +class wxSymbolListCtrl; +////@end forward declarations + +// __UNICODE__ is a symbol used by DialogBlocks-generated code. +#ifndef __UNICODE__ +#if wxUSE_UNICODE +#define __UNICODE__ +#endif +#endif + +/*! + * Symbols + */ + +#define SYMBOL_WXSYMBOLPICKERDIALOG_STYLE (wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER|wxCLOSE_BOX) +#define SYMBOL_WXSYMBOLPICKERDIALOG_TITLE _("Symbols") +#define SYMBOL_WXSYMBOLPICKERDIALOG_IDNAME ID_SYMBOLPICKERDIALOG +#define SYMBOL_WXSYMBOLPICKERDIALOG_SIZE wxSize(400, 300) +#define SYMBOL_WXSYMBOLPICKERDIALOG_POSITION wxDefaultPosition + +/*! + * wxSymbolPickerDialog class declaration + */ + +class WXDLLIMPEXP_RICHTEXT wxSymbolPickerDialog: public wxDialog +{ + DECLARE_DYNAMIC_CLASS( wxSymbolPickerDialog ) + DECLARE_EVENT_TABLE() + +public: + /// Constructors + wxSymbolPickerDialog( ); + wxSymbolPickerDialog( const wxString& symbol, const wxString& fontName, const wxString& normalTextFont, + wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& caption = SYMBOL_WXSYMBOLPICKERDIALOG_TITLE, const wxPoint& pos = SYMBOL_WXSYMBOLPICKERDIALOG_POSITION, const wxSize& size = SYMBOL_WXSYMBOLPICKERDIALOG_SIZE, long style = SYMBOL_WXSYMBOLPICKERDIALOG_STYLE ); + + /// Creation + bool Create( const wxString& symbol, const wxString& fontName, const wxString& normalTextFont, + wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& caption = SYMBOL_WXSYMBOLPICKERDIALOG_TITLE, const wxPoint& pos = SYMBOL_WXSYMBOLPICKERDIALOG_POSITION, const wxSize& size = SYMBOL_WXSYMBOLPICKERDIALOG_SIZE, long style = SYMBOL_WXSYMBOLPICKERDIALOG_STYLE ); + + /// Initialises members variables + void Init(); + + /// Creates the controls and sizers + void CreateControls(); + + /// Update the display + void UpdateSymbolDisplay(bool updateSymbolList = true, bool showAtSubset = true); + + /// Respond to symbol selection + void OnSymbolSelected( wxCommandEvent& event ); + + /// Set Unicode mode + void SetUnicodeMode(bool unicodeMode); + + /// Show at the current subset selection + void ShowAtSubset(); + + /// Get the selected symbol character + int GetSymbolChar() const; + + /// Is there a selection? + bool HasSelection() const { return !m_symbol.IsEmpty(); } + + /// Specifying normal text? + bool UseNormalFont() const { return m_fontName.IsEmpty(); } + + /// Should we show tooltips? + static bool ShowToolTips() { return sm_showToolTips; } + + /// Determines whether tooltips will be shown + static void SetShowToolTips(bool show) { sm_showToolTips = show; } + + /// Data transfer + virtual bool TransferDataToWindow(); + +////@begin wxSymbolPickerDialog event handler declarations + + /// wxEVT_COMMAND_COMBOBOX_SELECTED event handler for ID_SYMBOLPICKERDIALOG_FONT + void OnFontCtrlSelected( wxCommandEvent& event ); + +#if defined(__UNICODE__) + /// wxEVT_COMMAND_COMBOBOX_SELECTED event handler for ID_SYMBOLPICKERDIALOG_SUBSET + void OnSubsetSelected( wxCommandEvent& event ); + +#endif +#if defined(__UNICODE__) + /// wxEVT_COMMAND_COMBOBOX_SELECTED event handler for ID_SYMBOLPICKERDIALOG_FROM + void OnFromUnicodeSelected( wxCommandEvent& event ); + +#endif +#if defined(__WXMSW__) || defined(__WXGTK__) || defined(__WXPM__) || defined(__WXMGL__) || defined(__WXMOTIF__) || defined(__WXCOCOA__) || defined(__WXX11__) || defined(__WXPALMOS__) + /// wxEVT_UPDATE_UI event handler for wxID_OK + void OnOkUpdate( wxUpdateUIEvent& event ); + +#endif +#if defined(__WXMAC__) + /// wxEVT_UPDATE_UI event handler for wxID_OK + void OnOkUpdate( wxUpdateUIEvent& event ); + +#endif +////@end wxSymbolPickerDialog event handler declarations + +////@begin wxSymbolPickerDialog member function declarations + + wxString GetFontName() const { return m_fontName ; } + void SetFontName(wxString value) { m_fontName = value ; } + + wxString GetSymbol() const { return m_symbol ; } + void SetSymbol(wxString value) { m_symbol = value ; } + + bool GetFromUnicode() const { return m_fromUnicode ; } + void SetFromUnicode(bool value) { m_fromUnicode = value ; } + + wxString GetNormalTextFontName() const { return m_normalTextFontName ; } + void SetNormalTextFontName(wxString value) { m_normalTextFontName = value ; } + + /// Retrieves bitmap resources + wxBitmap GetBitmapResource( const wxString& name ); + + /// Retrieves icon resources + wxIcon GetIconResource( const wxString& name ); +////@end wxSymbolPickerDialog member function declarations + +////@begin wxSymbolPickerDialog member variables + wxComboBox* m_fontCtrl; +#if defined(__UNICODE__) + wxComboBox* m_subsetCtrl; +#endif + wxSymbolListCtrl* m_symbolsCtrl; + wxStaticText* m_symbolStaticCtrl; + wxTextCtrl* m_characterCodeCtrl; +#if defined(__UNICODE__) + wxComboBox* m_fromUnicodeCtrl; +#endif + wxString m_fontName; + wxString m_symbol; + bool m_fromUnicode; + wxString m_normalTextFontName; + /// Control identifiers + enum { + ID_SYMBOLPICKERDIALOG = 10600, + ID_SYMBOLPICKERDIALOG_FONT = 10602, + ID_SYMBOLPICKERDIALOG_SUBSET = 10605, + ID_SYMBOLPICKERDIALOG_LISTCTRL = 10608, + ID_SYMBOLPICKERDIALOG_CHARACTERCODE = 10601, + ID_SYMBOLPICKERDIALOG_FROM = 10603 + }; +////@end wxSymbolPickerDialog member variables + + bool m_dontUpdate; + static bool sm_showToolTips; +}; + +/*! + * The scrolling symbol list. + */ + +class WXDLLIMPEXP_RICHTEXT wxSymbolListCtrl : public wxVScrolledWindow +{ +public: + // constructors and such + // --------------------- + + // default constructor, you must call Create() later + wxSymbolListCtrl() { Init(); } + + // normal constructor which calls Create() internally + wxSymbolListCtrl(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxPanelNameStr) + { + Init(); + + (void)Create(parent, id, pos, size, style, name); + } + + // really creates the control and sets the initial number of items in it + // (which may be changed later with SetItemCount()) + // + // returns true on success or false if the control couldn't be created + bool Create(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxPanelNameStr); + + // dtor does some internal cleanup + virtual ~wxSymbolListCtrl(); + + + // accessors + // --------- + + // set the current font + virtual bool SetFont(const wxFont& font); + + // set Unicode/ASCII mode + void SetUnicodeMode(bool unicodeMode); + + // get the index of the currently selected item or wxNOT_FOUND if there is no selection + int GetSelection() const; + + // is this item selected? + bool IsSelected(int item) const; + + // is this item the current one? + bool IsCurrentItem(int item) const { return item == m_current; } + + // get the margins around each cell + wxPoint GetMargins() const { return m_ptMargins; } + + // get the background colour of selected cells + const wxColour& GetSelectionBackground() const { return m_colBgSel; } + + // operations + // ---------- + + // set the selection to the specified item, if it is wxNOT_FOUND the + // selection is unset + void SetSelection(int selection); + + // make this item visible + void EnsureVisible(int item); + + // set the margins: horizontal margin is the distance between the window + // border and the item contents while vertical margin is half of the + // distance between items + // + // by default both margins are 0 + void SetMargins(const wxPoint& pt); + void SetMargins(wxCoord x, wxCoord y) { SetMargins(wxPoint(x, y)); } + + // set the cell size + void SetCellSize(const wxSize& sz) { m_cellSize = sz; } + const wxSize& GetCellSize() const { return m_cellSize; } + + // change the background colour of the selected cells + void SetSelectionBackground(const wxColour& col); + + virtual wxVisualAttributes GetDefaultAttributes() const + { + return GetClassDefaultAttributes(GetWindowVariant()); + } + + static wxVisualAttributes + GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL); + + // Get min/max symbol values + int GetMinSymbolValue() const { return m_minSymbolValue; } + int GetMaxSymbolValue() const { return m_maxSymbolValue; } + + // Respond to size change + void OnSize(wxSizeEvent& event); + +protected: + + // draws a line of symbols + virtual void OnDrawItem(wxDC& dc, const wxRect& rect, size_t n) const; + + // gets the line height + virtual wxCoord OnGetLineHeight(size_t line) const; + + // event handlers + void OnPaint(wxPaintEvent& event); + void OnKeyDown(wxKeyEvent& event); + void OnLeftDown(wxMouseEvent& event); + void OnLeftDClick(wxMouseEvent& event); + + // common part of all ctors + void Init(); + + // send the wxEVT_COMMAND_LISTBOX_SELECTED event + void SendSelectedEvent(); + + // change the current item (in single selection listbox it also implicitly + // changes the selection); current may be wxNOT_FOUND in which case there + // will be no current item any more + // + // return true if the current item changed, false otherwise + bool DoSetCurrent(int current); + + // flags for DoHandleItemClick + enum + { + ItemClick_Shift = 1, // item shift-clicked + ItemClick_Ctrl = 2, // ctrl + ItemClick_Kbd = 4 // item selected from keyboard + }; + + // common part of keyboard and mouse handling processing code + void DoHandleItemClick(int item, int flags); + + // calculate line number from symbol value + int SymbolValueToLineNumber(int item); + + // initialise control from current min/max values + void SetupCtrl(bool scrollToSelection = true); + + // hit testing + int HitTest(const wxPoint& pt); + +private: + // the current item or wxNOT_FOUND + int m_current; + + // margins + wxPoint m_ptMargins; + + // the selection bg colour + wxColour m_colBgSel; + + // double buffer + wxBitmap* m_doubleBuffer; + + // cell size + wxSize m_cellSize; + + // minimum and maximum symbol value + int m_minSymbolValue; + + // minimum and maximum symbol value + int m_maxSymbolValue; + + // number of items per line + int m_symbolsPerLine; + + // Unicode/ASCII mode + bool m_unicodeMode; + + DECLARE_EVENT_TABLE() + DECLARE_NO_COPY_CLASS(wxSymbolListCtrl) + DECLARE_ABSTRACT_CLASS(wxSymbolListCtrl) +}; + +#endif + // _RICHTEXTSYMBOLDLG_H_ diff --git a/Externals/wxWidgets/include/wx/richtext/richtexttabspage.h b/Externals/wxWidgets/include/wx/richtext/richtexttabspage.h new file mode 100644 index 0000000000..abe0f9497d --- /dev/null +++ b/Externals/wxWidgets/include/wx/richtext/richtexttabspage.h @@ -0,0 +1,129 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/richtext/richtexttabspage.h +// Purpose: +// Author: Julian Smart +// Modified by: +// Created: 10/4/2006 8:03:20 AM +// RCS-ID: $Id: richtexttabspage.h 42678 2006-10-29 22:01:06Z JS $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _RICHTEXTTABSPAGE_H_ +#define _RICHTEXTTABSPAGE_H_ + +/*! + * Includes + */ + +////@begin includes +////@end includes + +/*! + * Forward declarations + */ + +////@begin forward declarations +////@end forward declarations + +/*! + * Control identifiers + */ + +////@begin control identifiers +#define SYMBOL_WXRICHTEXTTABSPAGE_STYLE wxRESIZE_BORDER|wxTAB_TRAVERSAL +#define SYMBOL_WXRICHTEXTTABSPAGE_TITLE _("wxRichTextFontPage") +#define SYMBOL_WXRICHTEXTTABSPAGE_IDNAME ID_RICHTEXTTABSPAGE +#define SYMBOL_WXRICHTEXTTABSPAGE_SIZE wxSize(400, 300) +#define SYMBOL_WXRICHTEXTTABSPAGE_POSITION wxDefaultPosition +////@end control identifiers + +/*! + * wxRichTextTabsPage class declaration + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextTabsPage: public wxPanel +{ + DECLARE_DYNAMIC_CLASS( wxRichTextTabsPage ) + DECLARE_EVENT_TABLE() + +public: + /// Constructors + wxRichTextTabsPage( ); + wxRichTextTabsPage( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = SYMBOL_WXRICHTEXTTABSPAGE_POSITION, const wxSize& size = SYMBOL_WXRICHTEXTTABSPAGE_SIZE, long style = SYMBOL_WXRICHTEXTTABSPAGE_STYLE ); + + /// Creation + bool Create( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = SYMBOL_WXRICHTEXTTABSPAGE_POSITION, const wxSize& size = SYMBOL_WXRICHTEXTTABSPAGE_SIZE, long style = SYMBOL_WXRICHTEXTTABSPAGE_STYLE ); + + /// Creates the controls and sizers + void CreateControls(); + + /// Initialise members + void Init(); + + /// Transfer data from/to window + virtual bool TransferDataFromWindow(); + virtual bool TransferDataToWindow(); + + /// Sorts the tab array + virtual void SortTabs(); + + /// Gets the attributes associated with the main formatting dialog + wxTextAttrEx* GetAttributes(); + +////@begin wxRichTextTabsPage event handler declarations + + /// wxEVT_COMMAND_LISTBOX_SELECTED event handler for ID_RICHTEXTTABSPAGE_TABLIST + void OnTablistSelected( wxCommandEvent& event ); + + /// wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_RICHTEXTTABSPAGE_NEW_TAB + void OnNewTabClick( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTTABSPAGE_NEW_TAB + void OnNewTabUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_RICHTEXTTABSPAGE_DELETE_TAB + void OnDeleteTabClick( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTTABSPAGE_DELETE_TAB + void OnDeleteTabUpdate( wxUpdateUIEvent& event ); + + /// wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_RICHTEXTTABSPAGE_DELETE_ALL_TABS + void OnDeleteAllTabsClick( wxCommandEvent& event ); + + /// wxEVT_UPDATE_UI event handler for ID_RICHTEXTTABSPAGE_DELETE_ALL_TABS + void OnDeleteAllTabsUpdate( wxUpdateUIEvent& event ); + +////@end wxRichTextTabsPage event handler declarations + +////@begin wxRichTextTabsPage member function declarations + + /// Retrieves bitmap resources + wxBitmap GetBitmapResource( const wxString& name ); + + /// Retrieves icon resources + wxIcon GetIconResource( const wxString& name ); +////@end wxRichTextTabsPage member function declarations + + /// Should we show tooltips? + static bool ShowToolTips(); + +////@begin wxRichTextTabsPage member variables + wxTextCtrl* m_tabEditCtrl; + wxListBox* m_tabListCtrl; + /// Control identifiers + enum { + ID_RICHTEXTTABSPAGE = 10200, + ID_RICHTEXTTABSPAGE_TABEDIT = 10213, + ID_RICHTEXTTABSPAGE_TABLIST = 10214, + ID_RICHTEXTTABSPAGE_NEW_TAB = 10201, + ID_RICHTEXTTABSPAGE_DELETE_TAB = 10202, + ID_RICHTEXTTABSPAGE_DELETE_ALL_TABS = 10203 + }; +////@end wxRichTextTabsPage member variables + + bool m_tabsPresent; +}; + +#endif + // _RICHTEXTTABSPAGE_H_ diff --git a/Externals/wxWidgets/include/wx/richtext/richtextxml.h b/Externals/wxWidgets/include/wx/richtext/richtextxml.h new file mode 100644 index 0000000000..621305fc21 --- /dev/null +++ b/Externals/wxWidgets/include/wx/richtext/richtextxml.h @@ -0,0 +1,79 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/richtext/richeditxml.h +// Purpose: XML and HTML I/O for wxRichTextCtrl +// Author: Julian Smart +// Modified by: +// Created: 2005-09-30 +// RCS-ID: $Id: richtextxml.h 42431 2006-10-26 06:32:47Z JS $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_RICHTEXTXML_H_ +#define _WX_RICHTEXTXML_H_ + +/*! + * Includes + */ + +#include "wx/richtext/richtextbuffer.h" +#include "wx/richtext/richtextstyles.h" + +#if wxUSE_RICHTEXT && wxUSE_XML + +/*! + * wxRichTextXMLHandler + */ + +class WXDLLIMPEXP_XML wxXmlNode; + +class WXDLLIMPEXP_RICHTEXT wxRichTextXMLHandler: public wxRichTextFileHandler +{ + DECLARE_CLASS(wxRichTextXMLHandler) +public: + wxRichTextXMLHandler(const wxString& name = wxT("XML"), const wxString& ext = wxT("xml"), int type = wxRICHTEXT_TYPE_XML) + : wxRichTextFileHandler(name, ext, type) + { } + +#if wxUSE_STREAMS + /// Recursively export an object + bool ExportXML(wxOutputStream& stream, wxMBConv* convMem, wxMBConv* convFile, wxRichTextObject& obj, int level); + bool ExportStyleDefinition(wxOutputStream& stream, wxMBConv* convMem, wxMBConv* convFile, wxRichTextStyleDefinition* def, int level); + + /// Recursively import an object + bool ImportXML(wxRichTextBuffer* buffer, wxXmlNode* node); + bool ImportStyleDefinition(wxRichTextStyleSheet* sheet, wxXmlNode* node); + + /// Create style parameters + wxString CreateStyle(const wxTextAttrEx& attr, bool isPara = false); + + /// Get style parameters + bool GetStyle(wxTextAttrEx& attr, wxXmlNode* node, bool isPara = false); +#endif + + /// Can we save using this handler? + virtual bool CanSave() const { return true; } + + /// Can we load using this handler? + virtual bool CanLoad() const { return true; } + +// Implementation + + bool HasParam(wxXmlNode* node, const wxString& param); + wxXmlNode *GetParamNode(wxXmlNode* node, const wxString& param); + wxString GetNodeContent(wxXmlNode *node); + wxString GetParamValue(wxXmlNode *node, const wxString& param); + wxString GetText(wxXmlNode *node, const wxString& param = wxEmptyString, bool translate = false); + +protected: +#if wxUSE_STREAMS + virtual bool DoLoadFile(wxRichTextBuffer *buffer, wxInputStream& stream); + virtual bool DoSaveFile(wxRichTextBuffer *buffer, wxOutputStream& stream); +#endif +}; + +#endif + // wxUSE_RICHTEXT && wxUSE_XML + +#endif + // _WX_RICHTEXTXML_H_ diff --git a/Externals/wxWidgets/include/wx/sashwin.h b/Externals/wxWidgets/include/wx/sashwin.h new file mode 100644 index 0000000000..53a26a390d --- /dev/null +++ b/Externals/wxWidgets/include/wx/sashwin.h @@ -0,0 +1,18 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/sashwin.h +// Purpose: Base header for wxSashWindow +// Author: Julian Smart +// Modified by: +// Created: +// RCS-ID: $Id: sashwin.h 33948 2005-05-04 18:57:50Z JS $ +// Copyright: (c) Julian Smart +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_SASHWIN_H_BASE_ +#define _WX_SASHWIN_H_BASE_ + +#include "wx/generic/sashwin.h" + +#endif + // _WX_SASHWIN_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/sckaddr.h b/Externals/wxWidgets/include/wx/sckaddr.h new file mode 100644 index 0000000000..66b7ff20b4 --- /dev/null +++ b/Externals/wxWidgets/include/wx/sckaddr.h @@ -0,0 +1,193 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: sckaddr.h +// Purpose: Network address classes +// Author: Guilhem Lavaux +// Modified by: +// Created: 26/04/1997 +// RCS-ID: $Id: sckaddr.h 35665 2005-09-24 21:43:15Z VZ $ +// Copyright: (c) 1997, 1998 Guilhem Lavaux +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_NETWORK_ADDRESS_H +#define _WX_NETWORK_ADDRESS_H + +#include "wx/defs.h" + +#if wxUSE_SOCKETS + +#include "wx/string.h" +#include "wx/gsocket.h" + + +class WXDLLIMPEXP_NET wxSockAddress : public wxObject { + DECLARE_ABSTRACT_CLASS(wxSockAddress) +public: + typedef enum { IPV4=1, IPV6=2, UNIX=3 } Addr; + + wxSockAddress(); + wxSockAddress(const wxSockAddress& other); + virtual ~wxSockAddress(); + + wxSockAddress& operator=(const wxSockAddress& other); + + virtual void Clear(); + virtual int Type() = 0; + + GAddress *GetAddress() const { return m_address; } + void SetAddress(GAddress *address); + + // we need to be able to create copies of the addresses polymorphically (i.e. + // without knowing the exact address class) + virtual wxSockAddress *Clone() const = 0; + +protected: + GAddress *m_address; + +private: + void Init(); +}; + +// Interface to an IP address (either IPV4 or IPV6) +class WXDLLIMPEXP_NET wxIPaddress : public wxSockAddress { + DECLARE_ABSTRACT_CLASS(wxIPaddress) +public: + wxIPaddress(); + wxIPaddress(const wxIPaddress& other); + virtual ~wxIPaddress(); + + virtual bool Hostname(const wxString& name) = 0; + virtual bool Service(const wxString& name) = 0; + virtual bool Service(unsigned short port) = 0; + + virtual bool LocalHost() = 0; + virtual bool IsLocalHost() const = 0; + + virtual bool AnyAddress() = 0; + + virtual wxString IPAddress() const = 0; + + virtual wxString Hostname() const = 0; + virtual unsigned short Service() const = 0; +}; + +class WXDLLIMPEXP_NET wxIPV4address : public wxIPaddress { + DECLARE_DYNAMIC_CLASS(wxIPV4address) +public: + wxIPV4address(); + wxIPV4address(const wxIPV4address& other); + virtual ~wxIPV4address(); + + // IPV4 name formats + // + // hostname + // dot format a.b.c.d + virtual bool Hostname(const wxString& name); + bool Hostname(unsigned long addr); + virtual bool Service(const wxString& name); + virtual bool Service(unsigned short port); + + // localhost (127.0.0.1) + virtual bool LocalHost(); + virtual bool IsLocalHost() const; + + // any (0.0.0.0) + virtual bool AnyAddress(); + + virtual wxString Hostname() const; + wxString OrigHostname() { return m_origHostname; } + virtual unsigned short Service() const; + + // a.b.c.d + virtual wxString IPAddress() const; + + virtual int Type() { return wxSockAddress::IPV4; } + virtual wxSockAddress *Clone() const; + + bool operator==(const wxIPV4address& addr) const; + +private: + wxString m_origHostname; +}; + + +// the IPv6 code probably doesn't work, untested -- set to 1 at your own risk +#ifndef wxUSE_IPV6 + #define wxUSE_IPV6 0 +#endif + +#if wxUSE_IPV6 + +// Experimental Only: +// +// IPV6 has not yet been implemented in socket layer +class WXDLLIMPEXP_NET wxIPV6address : public wxIPaddress { + DECLARE_DYNAMIC_CLASS(wxIPV6address) +private: + struct sockaddr_in6 *m_addr; +public: + wxIPV6address(); + wxIPV6address(const wxIPV6address& other); + virtual ~wxIPV6address(); + + // IPV6 name formats + // + // hostname + // 3ffe:ffff:0100:f101:0210:a4ff:fee3:9566 + // compact (base85) Itu&-ZQ82s>J%s99FJXT + // compressed format ::1 + // ipv4 mapped ::ffff:1.2.3.4 + virtual bool Hostname(const wxString& name); + + bool Hostname(unsigned char addr[16]); + virtual bool Service(const wxString& name); + virtual bool Service(unsigned short port); + + // localhost (0000:0000:0000:0000:0000:0000:0000:0001 (::1)) + virtual bool LocalHost(); + virtual bool IsLocalHost() const; + + // any (0000:0000:0000:0000:0000:0000:0000:0000 (::)) + virtual bool AnyAddress(); + + // 3ffe:ffff:0100:f101:0210:a4ff:fee3:9566 + virtual wxString IPAddress() const; + + virtual wxString Hostname() const; + virtual unsigned short Service() const; + + virtual int Type() { return wxSockAddress::IPV6; } + virtual wxSockAddress *Clone() const { return new wxIPV6address(*this); } +}; + +#endif // wxUSE_IPV6 + +#if defined(__UNIX__) && !defined(__WINE__) && (!defined(__WXMAC__) || defined(__DARWIN__)) && !defined(__WXMSW__) +#include <sys/socket.h> +#ifndef __VMS__ +# include <sys/un.h> +#endif + +class WXDLLIMPEXP_NET wxUNIXaddress : public wxSockAddress { + DECLARE_DYNAMIC_CLASS(wxUNIXaddress) +private: + struct sockaddr_un *m_addr; +public: + wxUNIXaddress(); + wxUNIXaddress(const wxUNIXaddress& other); + virtual ~wxUNIXaddress(); + + void Filename(const wxString& name); + wxString Filename(); + + virtual int Type() { return wxSockAddress::UNIX; } + virtual wxSockAddress *Clone() const { return new wxUNIXaddress(*this); } +}; +#endif + // __UNIX__ + +#endif + // wxUSE_SOCKETS + +#endif + // _WX_NETWORK_ADDRESS_H diff --git a/Externals/wxWidgets/include/wx/sckipc.h b/Externals/wxWidgets/include/wx/sckipc.h new file mode 100644 index 0000000000..6ff0bb01c7 --- /dev/null +++ b/Externals/wxWidgets/include/wx/sckipc.h @@ -0,0 +1,150 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: sckipc.h +// Purpose: Interprocess communication implementation (wxSocket version) +// Author: Julian Smart +// Modified by: Guilhem Lavaux (big rewrite) May 1997, 1998 +// Guillermo Rodriguez (updated for wxSocket v2) Jan 2000 +// (callbacks deprecated) Mar 2000 +// Created: 1993 +// RCS-ID: $Id: sckipc.h 36183 2005-11-15 18:05:48Z VZ $ +// Copyright: (c) Julian Smart 1993 +// (c) Guilhem Lavaux 1997, 1998 +// (c) 2000 Guillermo Rodriguez <guille@iies.es> +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_SCKIPC_H +#define _WX_SCKIPC_H + +#include "wx/defs.h" + +#if wxUSE_SOCKETS && wxUSE_IPC + +#include "wx/ipcbase.h" +#include "wx/socket.h" +#include "wx/sckstrm.h" +#include "wx/datstrm.h" + +/* + * Mini-DDE implementation + + Most transactions involve a topic name and an item name (choose these + as befits your application). + + A client can: + + - ask the server to execute commands (data) associated with a topic + - request data from server by topic and item + - poke data into the server + - ask the server to start an advice loop on topic/item + - ask the server to stop an advice loop + + A server can: + + - respond to execute, request, poke and advice start/stop + - send advise data to client + + Note that this limits the server in the ways it can send data to the + client, i.e. it can't send unsolicited information. + * + */ + +class WXDLLIMPEXP_NET wxTCPServer; +class WXDLLIMPEXP_NET wxTCPClient; + +class WXDLLIMPEXP_NET wxTCPConnection: public wxConnectionBase +{ + DECLARE_DYNAMIC_CLASS(wxTCPConnection) + +public: + wxTCPConnection(wxChar *buffer, int size); + wxTCPConnection(); + virtual ~wxTCPConnection(); + + // Calls that CLIENT can make + virtual bool Execute(const wxChar *data, int size = -1, wxIPCFormat format = wxIPC_TEXT); + virtual wxChar *Request(const wxString& item, int *size = NULL, wxIPCFormat format = wxIPC_TEXT); + virtual bool Poke(const wxString& item, wxChar *data, int size = -1, wxIPCFormat format = wxIPC_TEXT); + virtual bool StartAdvise(const wxString& item); + virtual bool StopAdvise(const wxString& item); + + // Calls that SERVER can make + virtual bool Advise(const wxString& item, wxChar *data, int size = -1, wxIPCFormat format = wxIPC_TEXT); + + // Calls that both can make + virtual bool Disconnect(void); + + // Callbacks to BOTH - override at will + // Default behaviour is to delete connection and return true + virtual bool OnDisconnect(void) { delete this; return true; } + + // To enable the compressor (NOTE: not implemented!) + void Compress(bool on); + + // unhide the Execute overload from wxConnectionBase + virtual bool Execute(const wxString& str) + { return Execute(str, -1, wxIPC_TEXT); } + +protected: + wxSocketBase *m_sock; + wxSocketStream *m_sockstrm; + wxDataInputStream *m_codeci; + wxDataOutputStream *m_codeco; + wxString m_topic; + + friend class wxTCPServer; + friend class wxTCPClient; + friend class wxTCPEventHandler; + + DECLARE_NO_COPY_CLASS(wxTCPConnection) +}; + +class WXDLLIMPEXP_NET wxTCPServer: public wxServerBase +{ +public: + wxTCPConnection *topLevelConnection; + + wxTCPServer(); + virtual ~wxTCPServer(); + + // Returns false on error (e.g. port number is already in use) + virtual bool Create(const wxString& serverName); + + // Callbacks to SERVER - override at will + virtual wxConnectionBase *OnAcceptConnection(const wxString& topic); + +protected: + wxSocketServer *m_server; + +#ifdef __UNIX_LIKE__ + // the name of the file associated to the Unix domain socket, may be empty + wxString m_filename; +#endif // __UNIX_LIKE__ + + DECLARE_NO_COPY_CLASS(wxTCPServer) + DECLARE_DYNAMIC_CLASS(wxTCPServer) +}; + +class WXDLLIMPEXP_NET wxTCPClient: public wxClientBase +{ +public: + wxTCPClient(); + virtual ~wxTCPClient(); + + virtual bool ValidHost(const wxString& host); + + // Call this to make a connection. Returns NULL if cannot. + virtual wxConnectionBase *MakeConnection(const wxString& host, + const wxString& server, + const wxString& topic); + + // Callbacks to CLIENT - override at will + virtual wxConnectionBase *OnMakeConnection(); + +private: + DECLARE_DYNAMIC_CLASS(wxTCPClient) +}; + +#endif // wxUSE_SOCKETS && wxUSE_IPC + +#endif // _WX_SCKIPC_H diff --git a/Externals/wxWidgets/include/wx/sckstrm.h b/Externals/wxWidgets/include/wx/sckstrm.h new file mode 100644 index 0000000000..d85b1c1e2f --- /dev/null +++ b/Externals/wxWidgets/include/wx/sckstrm.h @@ -0,0 +1,72 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: sckstrm.h +// Purpose: wxSocket*Stream +// Author: Guilhem Lavaux +// Modified by: +// Created: 17/07/97 +// RCS-ID: $Id: sckstrm.h 41020 2006-09-05 20:47:48Z VZ $ +// Copyright: (c) +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// +#ifndef __SCK_STREAM_H__ +#define __SCK_STREAM_H__ + +#include "wx/stream.h" + +#if wxUSE_SOCKETS && wxUSE_STREAMS + +#include "wx/socket.h" + +class WXDLLIMPEXP_NET wxSocketOutputStream : public wxOutputStream +{ + public: + wxSocketOutputStream(wxSocketBase& s); + virtual ~wxSocketOutputStream(); + + wxFileOffset SeekO( wxFileOffset WXUNUSED(pos), wxSeekMode WXUNUSED(mode) ) + { return -1; } + wxFileOffset TellO() const + { return -1; } + + protected: + wxSocketBase *m_o_socket; + + size_t OnSysWrite(const void *buffer, size_t bufsize); + + DECLARE_NO_COPY_CLASS(wxSocketOutputStream) +}; + +class WXDLLIMPEXP_NET wxSocketInputStream : public wxInputStream +{ + public: + wxSocketInputStream(wxSocketBase& s); + virtual ~wxSocketInputStream(); + + wxFileOffset SeekI( wxFileOffset WXUNUSED(pos), wxSeekMode WXUNUSED(mode) ) + { return -1; } + wxFileOffset TellI() const + { return -1; } + + protected: + wxSocketBase *m_i_socket; + + size_t OnSysRead(void *buffer, size_t bufsize); + + DECLARE_NO_COPY_CLASS(wxSocketInputStream) +}; + +class WXDLLIMPEXP_NET wxSocketStream : public wxSocketInputStream, + public wxSocketOutputStream +{ + public: + wxSocketStream(wxSocketBase& s); + virtual ~wxSocketStream(); + + DECLARE_NO_COPY_CLASS(wxSocketStream) +}; + +#endif + // wxUSE_SOCKETS && wxUSE_STREAMS + +#endif + // __SCK_STREAM_H__ diff --git a/Externals/wxWidgets/include/wx/scopeguard.h b/Externals/wxWidgets/include/wx/scopeguard.h new file mode 100644 index 0000000000..2517e86e4a --- /dev/null +++ b/Externals/wxWidgets/include/wx/scopeguard.h @@ -0,0 +1,373 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/scopeguard.h +// Purpose: declares wxwxScopeGuard and related macros +// Author: Vadim Zeitlin +// Modified by: +// Created: 03.07.2003 +// RCS-ID: $Id: scopeguard.h 44111 2007-01-07 13:28:16Z SN $ +// Copyright: (c) 2003 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +/* + Acknowledgements: this header is heavily based on (well, almost the exact + copy of) ScopeGuard.h by Andrei Alexandrescu and Petru Marginean published + in December 2000 issue of C/C++ Users Journal. + http://www.cuj.com/documents/cujcexp1812alexandr/ + */ + +#ifndef _WX_SCOPEGUARD_H_ +#define _WX_SCOPEGUARD_H_ + +#include "wx/defs.h" + +#include "wx/except.h" + +// ---------------------------------------------------------------------------- +// helpers +// ---------------------------------------------------------------------------- + +#ifdef __WATCOMC__ + +// WATCOM-FIXME: C++ of Open Watcom 1.3 doesn't like OnScopeExit() created +// through template so it must be workarounded with dedicated inlined macro. +// For compatibility with Watcom compilers wxPrivate::OnScopeExit must be +// replaced with wxPrivateOnScopeExit but in user code (for everyone who +// doesn't care about OW compatibility) wxPrivate::OnScopeExit still works. + +#define wxPrivateOnScopeExit(guard) \ + { \ + if ( !(guard).WasDismissed() ) \ + { \ + wxTRY \ + { \ + (guard).Execute(); \ + } \ + wxCATCH_ALL(;) \ + } \ + } + +#define wxPrivateUse(n) wxUnusedVar(n) + +#else + +#if !defined(__GNUC__) || wxCHECK_GCC_VERSION(2, 95) +// namespace support was first implemented in gcc-2.95, +// so avoid using it for older versions. +namespace wxPrivate +{ +#else +#define wxPrivate +#endif + // in the original implementation this was a member template function of + // ScopeGuardImplBase but gcc 2.8 which is still used for OS/2 doesn't + // support member templates and so we must make it global + template <class ScopeGuardImpl> + void OnScopeExit(ScopeGuardImpl& guard) + { + if ( !guard.WasDismissed() ) + { + // we're called from ScopeGuardImpl dtor and so we must not throw + wxTRY + { + guard.Execute(); + } + wxCATCH_ALL(;) // do nothing, just eat the exception + } + } + + // just to avoid the warning about unused variables + template <class T> + void Use(const T& WXUNUSED(t)) + { + } +#if !defined(__GNUC__) || wxCHECK_GCC_VERSION(2, 95) +} // namespace wxPrivate +#endif + +#define wxPrivateOnScopeExit(n) wxPrivate::OnScopeExit(n) +#define wxPrivateUse(n) wxPrivate::Use(n) + +#endif + +// ============================================================================ +// wxScopeGuard for functions and functors +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxScopeGuardImplBase: used by wxScopeGuardImpl[0..N] below +// ---------------------------------------------------------------------------- + +class wxScopeGuardImplBase +{ +public: + wxScopeGuardImplBase() : m_wasDismissed(false) { } + + void Dismiss() const { m_wasDismissed = true; } + + // for OnScopeExit() only (we can't make it friend, unfortunately)! + bool WasDismissed() const { return m_wasDismissed; } + +protected: + ~wxScopeGuardImplBase() { } + + wxScopeGuardImplBase(const wxScopeGuardImplBase& other) + : m_wasDismissed(other.m_wasDismissed) + { + other.Dismiss(); + } + + // must be mutable for copy ctor to work + mutable bool m_wasDismissed; + +private: + wxScopeGuardImplBase& operator=(const wxScopeGuardImplBase&); +}; + +// ---------------------------------------------------------------------------- +// wxScopeGuardImpl0: scope guard for actions without parameters +// ---------------------------------------------------------------------------- + +template <class F> +class wxScopeGuardImpl0 : public wxScopeGuardImplBase +{ +public: + static wxScopeGuardImpl0<F> MakeGuard(F fun) + { + return wxScopeGuardImpl0<F>(fun); + } + + ~wxScopeGuardImpl0() { wxPrivateOnScopeExit(*this); } + + void Execute() { m_fun(); } + +protected: + wxScopeGuardImpl0(F fun) : m_fun(fun) { } + + F m_fun; + + wxScopeGuardImpl0& operator=(const wxScopeGuardImpl0&); +}; + +template <class F> +inline wxScopeGuardImpl0<F> wxMakeGuard(F fun) +{ + return wxScopeGuardImpl0<F>::MakeGuard(fun); +} + +// ---------------------------------------------------------------------------- +// wxScopeGuardImpl1: scope guard for actions with 1 parameter +// ---------------------------------------------------------------------------- + +template <class F, class P1> +class wxScopeGuardImpl1 : public wxScopeGuardImplBase +{ +public: + static wxScopeGuardImpl1<F, P1> MakeGuard(F fun, P1 p1) + { + return wxScopeGuardImpl1<F, P1>(fun, p1); + } + + ~wxScopeGuardImpl1() { wxPrivateOnScopeExit(* this); } + + void Execute() { m_fun(m_p1); } + +protected: + wxScopeGuardImpl1(F fun, P1 p1) : m_fun(fun), m_p1(p1) { } + + F m_fun; + const P1 m_p1; + + wxScopeGuardImpl1& operator=(const wxScopeGuardImpl1&); +}; + +template <class F, class P1> +inline wxScopeGuardImpl1<F, P1> wxMakeGuard(F fun, P1 p1) +{ + return wxScopeGuardImpl1<F, P1>::MakeGuard(fun, p1); +} + +// ---------------------------------------------------------------------------- +// wxScopeGuardImpl2: scope guard for actions with 2 parameters +// ---------------------------------------------------------------------------- + +template <class F, class P1, class P2> +class wxScopeGuardImpl2 : public wxScopeGuardImplBase +{ +public: + static wxScopeGuardImpl2<F, P1, P2> MakeGuard(F fun, P1 p1, P2 p2) + { + return wxScopeGuardImpl2<F, P1, P2>(fun, p1, p2); + } + + ~wxScopeGuardImpl2() { wxPrivateOnScopeExit(*this); } + + void Execute() { m_fun(m_p1, m_p2); } + +protected: + wxScopeGuardImpl2(F fun, P1 p1, P2 p2) : m_fun(fun), m_p1(p1), m_p2(p2) { } + + F m_fun; + const P1 m_p1; + const P2 m_p2; + + wxScopeGuardImpl2& operator=(const wxScopeGuardImpl2&); +}; + +template <class F, class P1, class P2> +inline wxScopeGuardImpl2<F, P1, P2> wxMakeGuard(F fun, P1 p1, P2 p2) +{ + return wxScopeGuardImpl2<F, P1, P2>::MakeGuard(fun, p1, p2); +} + +// ============================================================================ +// wxScopeGuards for object methods +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxObjScopeGuardImpl0 +// ---------------------------------------------------------------------------- + +template <class Obj, class MemFun> +class wxObjScopeGuardImpl0 : public wxScopeGuardImplBase +{ +public: + static wxObjScopeGuardImpl0<Obj, MemFun> + MakeObjGuard(Obj& obj, MemFun memFun) + { + return wxObjScopeGuardImpl0<Obj, MemFun>(obj, memFun); + } + + ~wxObjScopeGuardImpl0() { wxPrivateOnScopeExit(*this); } + + void Execute() { (m_obj.*m_memfun)(); } + +protected: + wxObjScopeGuardImpl0(Obj& obj, MemFun memFun) + : m_obj(obj), m_memfun(memFun) { } + + Obj& m_obj; + MemFun m_memfun; +}; + +template <class Obj, class MemFun> +inline wxObjScopeGuardImpl0<Obj, MemFun> wxMakeObjGuard(Obj& obj, MemFun memFun) +{ + return wxObjScopeGuardImpl0<Obj, MemFun>::MakeObjGuard(obj, memFun); +} + +template <class Obj, class MemFun, class P1> +class wxObjScopeGuardImpl1 : public wxScopeGuardImplBase +{ +public: + static wxObjScopeGuardImpl1<Obj, MemFun, P1> + MakeObjGuard(Obj& obj, MemFun memFun, P1 p1) + { + return wxObjScopeGuardImpl1<Obj, MemFun, P1>(obj, memFun, p1); + } + + ~wxObjScopeGuardImpl1() { wxPrivateOnScopeExit(*this); } + + void Execute() { (m_obj.*m_memfun)(m_p1); } + +protected: + wxObjScopeGuardImpl1(Obj& obj, MemFun memFun, P1 p1) + : m_obj(obj), m_memfun(memFun), m_p1(p1) { } + + Obj& m_obj; + MemFun m_memfun; + const P1 m_p1; +}; + +template <class Obj, class MemFun, class P1> +inline wxObjScopeGuardImpl1<Obj, MemFun, P1> +wxMakeObjGuard(Obj& obj, MemFun memFun, P1 p1) +{ + return wxObjScopeGuardImpl1<Obj, MemFun, P1>::MakeObjGuard(obj, memFun, p1); +} + +template <class Obj, class MemFun, class P1, class P2> +class wxObjScopeGuardImpl2 : public wxScopeGuardImplBase +{ +public: + static wxObjScopeGuardImpl2<Obj, MemFun, P1, P2> + MakeObjGuard(Obj& obj, MemFun memFun, P1 p1, P2 p2) + { + return wxObjScopeGuardImpl2<Obj, MemFun, P1, P2>(obj, memFun, p1, p2); + } + + ~wxObjScopeGuardImpl2() { wxPrivateOnScopeExit(*this); } + + void Execute() { (m_obj.*m_memfun)(m_p1, m_p2); } + +protected: + wxObjScopeGuardImpl2(Obj& obj, MemFun memFun, P1 p1, P2 p2) + : m_obj(obj), m_memfun(memFun), m_p1(p1), m_p2(p2) { } + + Obj& m_obj; + MemFun m_memfun; + const P1 m_p1; + const P2 m_p2; +}; + +template <class Obj, class MemFun, class P1, class P2> +inline wxObjScopeGuardImpl2<Obj, MemFun, P1, P2> +wxMakeObjGuard(Obj& obj, MemFun memFun, P1 p1, P2 p2) +{ + return wxObjScopeGuardImpl2<Obj, MemFun, P1, P2>:: + MakeObjGuard(obj, memFun, p1, p2); +} + +// ============================================================================ +// public stuff +// ============================================================================ + +// wxScopeGuard is just a reference, see the explanation in CUJ article +typedef const wxScopeGuardImplBase& wxScopeGuard; + +// when an unnamed scope guard is needed, the macros below may be used +// +// NB: the original code has a single (and much nicer) ON_BLOCK_EXIT macro +// but this results in compiler warnings about unused variables and I +// didn't find a way to work around this other than by having different +// macros with different names + +#define wxGuardName wxMAKE_UNIQUE_NAME(scopeGuard) + +#define wxON_BLOCK_EXIT0_IMPL(n, f) \ + wxScopeGuard n = wxMakeGuard(f); \ + wxPrivateUse(n) +#define wxON_BLOCK_EXIT0(f) \ + wxON_BLOCK_EXIT0_IMPL(wxGuardName, f) + +#define wxON_BLOCK_EXIT_OBJ0_IMPL(n, o, m) \ + wxScopeGuard n = wxMakeObjGuard(o, m); \ + wxPrivateUse(n) +#define wxON_BLOCK_EXIT_OBJ0(o, m) \ + wxON_BLOCK_EXIT_OBJ0_IMPL(wxGuardName, o, &m) + +#define wxON_BLOCK_EXIT1_IMPL(n, f, p1) \ + wxScopeGuard n = wxMakeGuard(f, p1); \ + wxPrivateUse(n) +#define wxON_BLOCK_EXIT1(f, p1) \ + wxON_BLOCK_EXIT1_IMPL(wxGuardName, f, p1) + +#define wxON_BLOCK_EXIT_OBJ1_IMPL(n, o, m, p1) \ + wxScopeGuard n = wxMakeObjGuard(o, m, p1); \ + wxPrivateUse(n) +#define wxON_BLOCK_EXIT_OBJ1(o, m, p1) \ + wxON_BLOCK_EXIT_OBJ1_IMPL(wxGuardName, o, &m, p1) + +#define wxON_BLOCK_EXIT2_IMPL(n, f, p1, p2) \ + wxScopeGuard n = wxMakeGuard(f, p1, p2); \ + wxPrivateUse(n) +#define wxON_BLOCK_EXIT2(f, p1, p2) \ + wxON_BLOCK_EXIT2_IMPL(wxGuardName, f, p1, p2) + +#define wxON_BLOCK_EXIT_OBJ2_IMPL(n, o, m, p1, p2) \ + wxScopeGuard n = wxMakeObjGuard(o, m, p1, p2); \ + wxPrivateUse(n) +#define wxON_BLOCK_EXIT_OBJ2(o, m, p1, p2) \ + wxON_BLOCK_EXIT_OBJ2_IMPL(wxGuardName, o, &m, p1, p2) + +#endif // _WX_SCOPEGUARD_H_ diff --git a/Externals/wxWidgets/include/wx/scrolbar.h b/Externals/wxWidgets/include/wx/scrolbar.h new file mode 100644 index 0000000000..97dab1af92 --- /dev/null +++ b/Externals/wxWidgets/include/wx/scrolbar.h @@ -0,0 +1,80 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: scrolbar.h +// Purpose: wxScrollBar base header +// Author: Julian Smart +// Modified by: +// Created: +// Copyright: (c) Julian Smart +// RCS-ID: $Id: scrolbar.h 37066 2006-01-23 03:27:34Z MR $ +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_SCROLBAR_H_BASE_ +#define _WX_SCROLBAR_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_SCROLLBAR + +#include "wx/control.h" + +extern WXDLLEXPORT_DATA(const wxChar) wxScrollBarNameStr[]; + +// ---------------------------------------------------------------------------- +// wxScrollBar: a scroll bar control +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxScrollBarBase : public wxControl +{ +public: + wxScrollBarBase() { } + + // scrollbar construction + bool Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxSB_HORIZONTAL, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxScrollBarNameStr); + + // accessors + virtual int GetThumbPosition() const = 0; + virtual int GetThumbSize() const = 0; + virtual int GetPageSize() const = 0; + virtual int GetRange() const = 0; + + bool IsVertical() const { return (m_windowStyle & wxVERTICAL) != 0; } + + // operations + virtual void SetThumbPosition(int viewStart) = 0; + virtual void SetScrollbar(int position, int thumbSize, + int range, int pageSize, + bool refresh = true) = 0; + +private: + DECLARE_NO_COPY_CLASS(wxScrollBarBase) +}; + +#if defined(__WXUNIVERSAL__) + #include "wx/univ/scrolbar.h" +#elif defined(__WXMSW__) + #include "wx/msw/scrolbar.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/scrolbar.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/scrolbar.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/scrolbar.h" +#elif defined(__WXMAC__) + #include "wx/mac/scrolbar.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/scrolbar.h" +#elif defined(__WXPM__) + #include "wx/os2/scrolbar.h" +#endif + +#endif // wxUSE_SCROLLBAR + +#endif + // _WX_SCROLBAR_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/scrolwin.h b/Externals/wxWidgets/include/wx/scrolwin.h new file mode 100644 index 0000000000..46269c8723 --- /dev/null +++ b/Externals/wxWidgets/include/wx/scrolwin.h @@ -0,0 +1,310 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: include/wx/scrolwin.h +// Purpose: wxScrolledWindow, wxScrolledControl and wxScrollHelper +// Author: Vadim Zeitlin +// Modified by: +// Created: 30.08.00 +// RCS-ID: $Id: scrolwin.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) 2000 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_SCROLWIN_H_BASE_ +#define _WX_SCROLWIN_H_BASE_ + +#include "wx/panel.h" + +class WXDLLIMPEXP_FWD_CORE wxScrollHelperEvtHandler; +class WXDLLIMPEXP_FWD_CORE wxTimer; + +// default scrolled window style: scroll in both directions +#define wxScrolledWindowStyle (wxHSCROLL | wxVSCROLL) + +// ---------------------------------------------------------------------------- +// The hierarchy of scrolling classes is a bit complicated because we want to +// put as much functionality as possible in a mix-in class not deriving from +// wxWindow so that other classes could derive from the same base class on all +// platforms irrespectively of whether they are native controls (and hence +// don't use our scrolling) or not. +// +// So we have +// +// wxScrollHelper +// | +// | +// \|/ +// wxWindow wxScrollHelperNative +// | \ / / +// | \ / / +// | _| |_ / +// | wxScrolledWindow / +// | / +// \|/ / +// wxControl / +// \ / +// \ / +// _| |_ +// wxScrolledControl +// +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxScrollHelper +{ +public: + // ctor must be given the associated window + wxScrollHelper(wxWindow *winToScroll); + virtual ~wxScrollHelper(); + + // configure the scrolling + virtual void SetScrollbars(int pixelsPerUnitX, int pixelsPerUnitY, + int noUnitsX, int noUnitsY, + int xPos = 0, int yPos = 0, + bool noRefresh = false ); + + // scroll to the given (in logical coords) position + virtual void Scroll(int x, int y); + + // get/set the page size for this orientation (wxVERTICAL/wxHORIZONTAL) + int GetScrollPageSize(int orient) const; + void SetScrollPageSize(int orient, int pageSize); + + // get the number of lines the window can scroll, + // returns 0 if no scrollbars are there. + int GetScrollLines( int orient ) const; + + // Set the x, y scrolling increments. + void SetScrollRate( int xstep, int ystep ); + + // get the size of one logical unit in physical ones + virtual void GetScrollPixelsPerUnit(int *pixelsPerUnitX, + int *pixelsPerUnitY) const; + + // Enable/disable Windows scrolling in either direction. If true, wxWidgets + // scrolls the canvas and only a bit of the canvas is invalidated; no + // Clear() is necessary. If false, the whole canvas is invalidated and a + // Clear() is necessary. Disable for when the scroll increment is used to + // actually scroll a non-constant distance + virtual void EnableScrolling(bool x_scrolling, bool y_scrolling); + + // Get the view start + virtual void GetViewStart(int *x, int *y) const; + + // Set the scale factor, used in PrepareDC + void SetScale(double xs, double ys) { m_scaleX = xs; m_scaleY = ys; } + double GetScaleX() const { return m_scaleX; } + double GetScaleY() const { return m_scaleY; } + + // translate between scrolled and unscrolled coordinates + void CalcScrolledPosition(int x, int y, int *xx, int *yy) const + { DoCalcScrolledPosition(x, y, xx, yy); } + wxPoint CalcScrolledPosition(const wxPoint& pt) const + { + wxPoint p2; + DoCalcScrolledPosition(pt.x, pt.y, &p2.x, &p2.y); + return p2; + } + + void CalcUnscrolledPosition(int x, int y, int *xx, int *yy) const + { DoCalcUnscrolledPosition(x, y, xx, yy); } + wxPoint CalcUnscrolledPosition(const wxPoint& pt) const + { + wxPoint p2; + DoCalcUnscrolledPosition(pt.x, pt.y, &p2.x, &p2.y); + return p2; + } + + virtual void DoCalcScrolledPosition(int x, int y, int *xx, int *yy) const; + virtual void DoCalcUnscrolledPosition(int x, int y, int *xx, int *yy) const; + + // Adjust the scrollbars + virtual void AdjustScrollbars(void); + + // Calculate scroll increment + virtual int CalcScrollInc(wxScrollWinEvent& event); + + // Normally the wxScrolledWindow will scroll itself, but in some rare + // occasions you might want it to scroll [part of] another window (e.g. a + // child of it in order to scroll only a portion the area between the + // scrollbars (spreadsheet: only cell area will move). + virtual void SetTargetWindow(wxWindow *target); + virtual wxWindow *GetTargetWindow() const; + + void SetTargetRect(const wxRect& rect) { m_rectToScroll = rect; } + wxRect GetTargetRect() const { return m_rectToScroll; } + + // Override this function to draw the graphic (or just process EVT_PAINT) + virtual void OnDraw(wxDC& WXUNUSED(dc)) { } + + // change the DC origin according to the scroll position. + virtual void DoPrepareDC(wxDC& dc); + + // are we generating the autoscroll events? + bool IsAutoScrolling() const { return m_timerAutoScroll != NULL; } + + // stop generating the scroll events when mouse is held outside the window + void StopAutoScrolling(); + + // this method can be overridden in a derived class to forbid sending the + // auto scroll events - note that unlike StopAutoScrolling() it doesn't + // stop the timer, so it will be called repeatedly and will typically + // return different values depending on the current mouse position + // + // the base class version just returns true + virtual bool SendAutoScrollEvents(wxScrollWinEvent& event) const; + + // the methods to be called from the window event handlers + void HandleOnScroll(wxScrollWinEvent& event); + void HandleOnSize(wxSizeEvent& event); + void HandleOnPaint(wxPaintEvent& event); + void HandleOnChar(wxKeyEvent& event); + void HandleOnMouseEnter(wxMouseEvent& event); + void HandleOnMouseLeave(wxMouseEvent& event); +#if wxUSE_MOUSEWHEEL + void HandleOnMouseWheel(wxMouseEvent& event); +#endif // wxUSE_MOUSEWHEEL + + // FIXME: this is needed for now for wxPlot compilation, should be removed + // once it is fixed! + void OnScroll(wxScrollWinEvent& event) { HandleOnScroll(event); } + +protected: + // get pointer to our scroll rect if we use it or NULL + const wxRect *GetScrollRect() const + { + return m_rectToScroll.width != 0 ? &m_rectToScroll : NULL; + } + + // get the size of the target window + wxSize GetTargetSize() const + { + return m_rectToScroll.width != 0 ? m_rectToScroll.GetSize() + : m_targetWindow->GetClientSize(); + } + + void GetTargetSize(int *w, int *h) const + { + wxSize size = GetTargetSize(); + if ( w ) + *w = size.x; + if ( h ) + *h = size.y; + } + + // implementations of various wxWindow virtual methods which should be + // forwarded to us (this can be done by WX_FORWARD_TO_SCROLL_HELPER()) + bool ScrollLayout(); + void ScrollDoSetVirtualSize(int x, int y); + wxSize ScrollGetBestVirtualSize() const; + wxSize ScrollGetWindowSizeForVirtualSize(const wxSize& size) const; + + // change just the target window (unlike SetWindow which changes m_win as + // well) + void DoSetTargetWindow(wxWindow *target); + + // delete the event handler we installed + void DeleteEvtHandler(); + + + double m_scaleX; + double m_scaleY; + + wxWindow *m_win, + *m_targetWindow; + + wxRect m_rectToScroll; + + wxTimer *m_timerAutoScroll; + + int m_xScrollPixelsPerLine; + int m_yScrollPixelsPerLine; + int m_xScrollPosition; + int m_yScrollPosition; + int m_xScrollLines; + int m_yScrollLines; + int m_xScrollLinesPerPage; + int m_yScrollLinesPerPage; + + bool m_xScrollingEnabled; + bool m_yScrollingEnabled; + +#if wxUSE_MOUSEWHEEL + int m_wheelRotation; +#endif // wxUSE_MOUSEWHEEL + + wxScrollHelperEvtHandler *m_handler; + + DECLARE_NO_COPY_CLASS(wxScrollHelper) +}; + +// this macro can be used in a wxScrollHelper-derived class to forward wxWindow +// methods to corresponding wxScrollHelper methods +#define WX_FORWARD_TO_SCROLL_HELPER() \ +public: \ + virtual void PrepareDC(wxDC& dc) { DoPrepareDC(dc); } \ + virtual bool Layout() { return ScrollLayout(); } \ + virtual void DoSetVirtualSize(int x, int y) \ + { ScrollDoSetVirtualSize(x, y); } \ + virtual wxSize GetBestVirtualSize() const \ + { return ScrollGetBestVirtualSize(); } \ +protected: \ + virtual wxSize GetWindowSizeForVirtualSize(const wxSize& size) const \ + { return ScrollGetWindowSizeForVirtualSize(size); } + +// include the declaration of wxScrollHelperNative if needed +#if defined(__WXGTK20__) && !defined(__WXUNIVERSAL__) + #include "wx/gtk/scrolwin.h" +#elif defined(__WXGTK__) && !defined(__WXUNIVERSAL__) + #include "wx/gtk1/scrolwin.h" +#else + typedef wxScrollHelper wxScrollHelperNative; +#endif + +// ---------------------------------------------------------------------------- +// wxScrolledWindow: a wxWindow which knows how to scroll +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxScrolledWindow : public wxPanel, + public wxScrollHelperNative +{ +public: + wxScrolledWindow() : wxScrollHelperNative(this) { } + wxScrolledWindow(wxWindow *parent, + wxWindowID winid = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxScrolledWindowStyle, + const wxString& name = wxPanelNameStr) + : wxScrollHelperNative(this) + { + Create(parent, winid, pos, size, style, name); + } + + virtual ~wxScrolledWindow(); + + bool Create(wxWindow *parent, + wxWindowID winid, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxScrolledWindowStyle, + const wxString& name = wxPanelNameStr); + + // we need to return a special WM_GETDLGCODE value to process just the + // arrows but let the other navigation characters through +#ifdef __WXMSW__ + virtual WXLRESULT MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam); +#endif // __WXMSW__ + + WX_FORWARD_TO_SCROLL_HELPER() + +protected: + // this is needed for wxEVT_PAINT processing hack described in + // wxScrollHelperEvtHandler::ProcessEvent() + void OnPaint(wxPaintEvent& event); + +private: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxScrolledWindow) + DECLARE_EVENT_TABLE() +}; + +#endif // _WX_SCROLWIN_H_BASE_ + diff --git a/Externals/wxWidgets/include/wx/selstore.h b/Externals/wxWidgets/include/wx/selstore.h new file mode 100644 index 0000000000..7a7c61f99b --- /dev/null +++ b/Externals/wxWidgets/include/wx/selstore.h @@ -0,0 +1,104 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/selstore.h +// Purpose: wxSelectionStore stores selected items in a control +// Author: Vadim Zeitlin +// Modified by: +// Created: 08.06.03 (extracted from src/generic/listctrl.cpp) +// RCS-ID: $Id: selstore.h 29257 2004-09-22 14:38:52Z ABX $ +// Copyright: (c) 2000-2003 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_SELSTORE_H_ +#define _WX_SELSTORE_H_ + +#include "wx/dynarray.h" + +// ---------------------------------------------------------------------------- +// wxSelectedIndices is just a sorted array of indices +// ---------------------------------------------------------------------------- + +inline int CMPFUNC_CONV wxSizeTCmpFn(size_t n1, size_t n2) +{ + return (int)(n1 - n2); +} + +WX_DEFINE_SORTED_EXPORTED_ARRAY_CMP_SIZE_T(size_t, + wxSizeTCmpFn, + wxSelectedIndices); + +// ---------------------------------------------------------------------------- +// wxSelectionStore is used to store the selected items in the virtual +// controls, i.e. it is well suited for storing even when the control contains +// a huge (practically infinite) number of items. +// +// Of course, internally it still has to store the selected items somehow (as +// an array currently) but the advantage is that it can handle the selection +// of all items (common operation) efficiently and that it could be made even +// smarter in the future (e.g. store the selections as an array of ranges + +// individual items) without changing its API. +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxSelectionStore +{ +public: + wxSelectionStore() : m_itemsSel(wxSizeTCmpFn) { Init(); } + + // set the total number of items we handle + void SetItemCount(size_t count) { m_count = count; } + + // special case of SetItemCount(0) + void Clear() { m_itemsSel.Clear(); m_count = 0; m_defaultState = false; } + + // must be called when a new item is inserted/added + void OnItemAdd(size_t WXUNUSED(item)) { wxFAIL_MSG( _T("TODO") ); } + + // must be called when an item is deleted + void OnItemDelete(size_t item); + + // select one item, use SelectRange() insted if possible! + // + // returns true if the items selection really changed + bool SelectItem(size_t item, bool select = true); + + // select the range of items + // + // return true and fill the itemsChanged array with the indices of items + // which have changed state if "few" of them did, otherwise return false + // (meaning that too many items changed state to bother counting them + // individually) + bool SelectRange(size_t itemFrom, size_t itemTo, + bool select = true, + wxArrayInt *itemsChanged = NULL); + + // return true if the given item is selected + bool IsSelected(size_t item) const; + + // return the total number of selected items + size_t GetSelectedCount() const + { + return m_defaultState ? m_count - m_itemsSel.GetCount() + : m_itemsSel.GetCount(); + } + +private: + // (re)init + void Init() { m_defaultState = false; } + + // the total number of items we handle + size_t m_count; + + // the default state: normally, false (i.e. off) but maybe set to true if + // there are more selected items than non selected ones - this allows to + // handle selection of all items efficiently + bool m_defaultState; + + // the array of items whose selection state is different from default + wxSelectedIndices m_itemsSel; + + DECLARE_NO_COPY_CLASS(wxSelectionStore) +}; + + +#endif // _WX_SELSTORE_H_ + diff --git a/Externals/wxWidgets/include/wx/settings.h b/Externals/wxWidgets/include/wx/settings.h new file mode 100644 index 0000000000..33277ff575 --- /dev/null +++ b/Externals/wxWidgets/include/wx/settings.h @@ -0,0 +1,212 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/settings.h +// Purpose: wxSystemSettings class +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: settings.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_SETTINGS_H_BASE_ +#define _WX_SETTINGS_H_BASE_ + +#include "wx/colour.h" +#include "wx/font.h" + +class WXDLLIMPEXP_FWD_CORE wxWindow; + +// possible values for wxSystemSettings::GetFont() parameter +// +// NB: wxMSW assumes that they have the same values as the parameters of +// Windows GetStockObject() API, don't change the values! +enum wxSystemFont +{ + wxSYS_OEM_FIXED_FONT = 10, + wxSYS_ANSI_FIXED_FONT, + wxSYS_ANSI_VAR_FONT, + wxSYS_SYSTEM_FONT, + wxSYS_DEVICE_DEFAULT_FONT, + wxSYS_DEFAULT_PALETTE, + wxSYS_SYSTEM_FIXED_FONT, + wxSYS_DEFAULT_GUI_FONT, + + // this was just a temporary aberration, do not use it any more + wxSYS_ICONTITLE_FONT = wxSYS_DEFAULT_GUI_FONT +}; + +// possible values for wxSystemSettings::GetColour() parameter +// +// NB: wxMSW assumes that they have the same values as the parameters of +// Windows GetSysColor() API, don't change the values! +enum wxSystemColour +{ + wxSYS_COLOUR_SCROLLBAR, + wxSYS_COLOUR_BACKGROUND, + wxSYS_COLOUR_DESKTOP = wxSYS_COLOUR_BACKGROUND, + wxSYS_COLOUR_ACTIVECAPTION, + wxSYS_COLOUR_INACTIVECAPTION, + wxSYS_COLOUR_MENU, + wxSYS_COLOUR_WINDOW, + wxSYS_COLOUR_WINDOWFRAME, + wxSYS_COLOUR_MENUTEXT, + wxSYS_COLOUR_WINDOWTEXT, + wxSYS_COLOUR_CAPTIONTEXT, + wxSYS_COLOUR_ACTIVEBORDER, + wxSYS_COLOUR_INACTIVEBORDER, + wxSYS_COLOUR_APPWORKSPACE, + wxSYS_COLOUR_HIGHLIGHT, + wxSYS_COLOUR_HIGHLIGHTTEXT, + wxSYS_COLOUR_BTNFACE, + wxSYS_COLOUR_3DFACE = wxSYS_COLOUR_BTNFACE, + wxSYS_COLOUR_BTNSHADOW, + wxSYS_COLOUR_3DSHADOW = wxSYS_COLOUR_BTNSHADOW, + wxSYS_COLOUR_GRAYTEXT, + wxSYS_COLOUR_BTNTEXT, + wxSYS_COLOUR_INACTIVECAPTIONTEXT, + wxSYS_COLOUR_BTNHIGHLIGHT, + wxSYS_COLOUR_BTNHILIGHT = wxSYS_COLOUR_BTNHIGHLIGHT, + wxSYS_COLOUR_3DHIGHLIGHT = wxSYS_COLOUR_BTNHIGHLIGHT, + wxSYS_COLOUR_3DHILIGHT = wxSYS_COLOUR_BTNHIGHLIGHT, + wxSYS_COLOUR_3DDKSHADOW, + wxSYS_COLOUR_3DLIGHT, + wxSYS_COLOUR_INFOTEXT, + wxSYS_COLOUR_INFOBK, + wxSYS_COLOUR_LISTBOX, + wxSYS_COLOUR_HOTLIGHT, + wxSYS_COLOUR_GRADIENTACTIVECAPTION, + wxSYS_COLOUR_GRADIENTINACTIVECAPTION, + wxSYS_COLOUR_MENUHILIGHT, + wxSYS_COLOUR_MENUBAR, + + wxSYS_COLOUR_MAX +}; + +// possible values for wxSystemSettings::GetMetric() index parameter +// +// NB: update the conversion table in msw/settings.cpp if you change the values +// of the elements of this enum +enum wxSystemMetric +{ + wxSYS_MOUSE_BUTTONS = 1, + wxSYS_BORDER_X, + wxSYS_BORDER_Y, + wxSYS_CURSOR_X, + wxSYS_CURSOR_Y, + wxSYS_DCLICK_X, + wxSYS_DCLICK_Y, + wxSYS_DRAG_X, + wxSYS_DRAG_Y, + wxSYS_EDGE_X, + wxSYS_EDGE_Y, + wxSYS_HSCROLL_ARROW_X, + wxSYS_HSCROLL_ARROW_Y, + wxSYS_HTHUMB_X, + wxSYS_ICON_X, + wxSYS_ICON_Y, + wxSYS_ICONSPACING_X, + wxSYS_ICONSPACING_Y, + wxSYS_WINDOWMIN_X, + wxSYS_WINDOWMIN_Y, + wxSYS_SCREEN_X, + wxSYS_SCREEN_Y, + wxSYS_FRAMESIZE_X, + wxSYS_FRAMESIZE_Y, + wxSYS_SMALLICON_X, + wxSYS_SMALLICON_Y, + wxSYS_HSCROLL_Y, + wxSYS_VSCROLL_X, + wxSYS_VSCROLL_ARROW_X, + wxSYS_VSCROLL_ARROW_Y, + wxSYS_VTHUMB_Y, + wxSYS_CAPTION_Y, + wxSYS_MENU_Y, + wxSYS_NETWORK_PRESENT, + wxSYS_PENWINDOWS_PRESENT, + wxSYS_SHOW_SOUNDS, + wxSYS_SWAP_BUTTONS +}; + +// possible values for wxSystemSettings::HasFeature() parameter +enum wxSystemFeature +{ + wxSYS_CAN_DRAW_FRAME_DECORATIONS = 1, + wxSYS_CAN_ICONIZE_FRAME, + wxSYS_TABLET_PRESENT +}; + +// values for different screen designs +enum wxSystemScreenType +{ + wxSYS_SCREEN_NONE = 0, // not yet defined + + wxSYS_SCREEN_TINY, // < + wxSYS_SCREEN_PDA, // >= 320x240 + wxSYS_SCREEN_SMALL, // >= 640x480 + wxSYS_SCREEN_DESKTOP // >= 800x600 +}; + +// ---------------------------------------------------------------------------- +// wxSystemSettingsNative: defines the API for wxSystemSettings class +// ---------------------------------------------------------------------------- + +// this is a namespace rather than a class: it has only non virtual static +// functions +// +// also note that the methods are implemented in the platform-specific source +// files (i.e. this is not a real base class as we can't override its virtual +// functions because it doesn't have any) + +class WXDLLEXPORT wxSystemSettingsNative +{ +public: + // get a standard system colour + static wxColour GetColour(wxSystemColour index); + + // get a standard system font + static wxFont GetFont(wxSystemFont index); + + // get a system-dependent metric + static int GetMetric(wxSystemMetric index, wxWindow * win = NULL); + + // return true if the port has certain feature + static bool HasFeature(wxSystemFeature index); +}; + +// ---------------------------------------------------------------------------- +// include the declaration of the real platform-dependent class +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxSystemSettings : public wxSystemSettingsNative +{ +public: +#ifdef __WXUNIVERSAL__ + // in wxUniversal we want to use the theme standard colours instead of the + // system ones, otherwise wxSystemSettings is just the same as + // wxSystemSettingsNative + static wxColour GetColour(wxSystemColour index); +#endif // __WXUNIVERSAL__ + + // Get system screen design (desktop, pda, ..) used for + // laying out various dialogs. + static wxSystemScreenType GetScreenType(); + + // Override default. + static void SetScreenType( wxSystemScreenType screen ); + + // Value + static wxSystemScreenType ms_screen; + +#if WXWIN_COMPATIBILITY_2_4 + // the backwards compatible versions of wxSystemSettingsNative functions, + // don't use these methods in the new code! + wxDEPRECATED(static wxColour GetSystemColour(int index)); + wxDEPRECATED(static wxFont GetSystemFont(int index)); + wxDEPRECATED(static int GetSystemMetric(int index)); +#endif +}; + +#endif + // _WX_SETTINGS_H_BASE_ + diff --git a/Externals/wxWidgets/include/wx/setup.h b/Externals/wxWidgets/include/wx/setup.h new file mode 100644 index 0000000000..fdbdd16d62 --- /dev/null +++ b/Externals/wxWidgets/include/wx/setup.h @@ -0,0 +1,1349 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/setup.h +// Purpose: Configuration for the library +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: setup0.h 43908 2006-12-11 06:19:27Z RD $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_SETUP_H_ +#define _WX_SETUP_H_ + +/* --- start common options --- */ +// ---------------------------------------------------------------------------- +// global settings +// ---------------------------------------------------------------------------- + +// define this to 0 when building wxBase library - this can also be done from +// makefile/project file overriding the value here +#ifndef wxUSE_GUI + #define wxUSE_GUI 1 +#endif // wxUSE_GUI + +// ---------------------------------------------------------------------------- +// compatibility settings +// ---------------------------------------------------------------------------- + +// This setting determines the compatibility with 2.4 API: set it to 1 to +// enable it but please consider updating your code instead. +// +// Default is 0 +// +// Recommended setting: 0 (please update your code) +#define WXWIN_COMPATIBILITY_2_4 0 + +// This setting determines the compatibility with 2.6 API: set it to 0 to +// flag all cases of using deprecated functions. +// +// Default is 1 but please try building your code with 0 as the default will +// change to 0 in the next version and the deprecated functions will disappear +// in the version after it completely. +// +// Recommended setting: 0 (please update your code) +#define WXWIN_COMPATIBILITY_2_6 1 + +// MSW-only: Set to 0 for accurate dialog units, else 1 for old behaviour when +// default system font is used for wxWindow::GetCharWidth/Height() instead of +// the current font. +// +// Default is 0 +// +// Recommended setting: 0 +#define wxDIALOG_UNIT_COMPATIBILITY 0 + +// ---------------------------------------------------------------------------- +// debugging settings +// ---------------------------------------------------------------------------- + +// Generic comment about debugging settings: they are very useful if you don't +// use any other memory leak detection tools such as Purify/BoundsChecker, but +// are probably redundant otherwise. Also, Visual C++ CRT has the same features +// as wxWidgets memory debugging subsystem built in since version 5.0 and you +// may prefer to use it instead of built in memory debugging code because it is +// faster and more fool proof. +// +// Using VC++ CRT memory debugging is enabled by default in debug mode +// (__WXDEBUG__) if wxUSE_GLOBAL_MEMORY_OPERATORS is *not* enabled (i.e. is 0) +// and if __NO_VC_CRTDBG__ is not defined. + +// If 1, enables wxDebugContext, for writing error messages to file, etc. If +// __WXDEBUG__ is not defined, will still use the normal memory operators. +// +// Default is 0 +// +// Recommended setting: 0 +#define wxUSE_DEBUG_CONTEXT 0 + +// If 1, enables debugging versions of wxObject::new and wxObject::delete *IF* +// __WXDEBUG__ is also defined. +// +// WARNING: this code may not work with all architectures, especially if +// alignment is an issue. This switch is currently ignored for mingw / cygwin +// +// Default is 0 +// +// Recommended setting: 1 if you are not using a memory debugging tool, else 0 +#define wxUSE_MEMORY_TRACING 0 + +// In debug mode, cause new and delete to be redefined globally. +// If this causes problems (e.g. link errors which is a common problem +// especially if you use another library which also redefines the global new +// and delete), set this to 0. +// This switch is currently ignored for mingw / cygwin +// +// Default is 0 +// +// Recommended setting: 0 +#define wxUSE_GLOBAL_MEMORY_OPERATORS 0 + +// In debug mode, causes new to be defined to be WXDEBUG_NEW (see object.h). If +// this causes problems (e.g. link errors), set this to 0. You may need to set +// this to 0 if using templates (at least for VC++). This switch is currently +// ignored for mingw / cygwin / CodeWarrior +// +// Default is 0 +// +// Recommended setting: 0 +#define wxUSE_DEBUG_NEW_ALWAYS 0 + +// wxHandleFatalExceptions() may be used to catch the program faults at run +// time and, instead of terminating the program with a usual GPF message box, +// call the user-defined wxApp::OnFatalException() function. If you set +// wxUSE_ON_FATAL_EXCEPTION to 0, wxHandleFatalExceptions() will not work. +// +// This setting is for Win32 only and can only be enabled if your compiler +// supports Win32 structured exception handling (currently only VC++ does) +// +// Default is 1 +// +// Recommended setting: 1 if your compiler supports it. +#define wxUSE_ON_FATAL_EXCEPTION 1 + +// Set this to 1 to be able to generate a human-readable (unlike +// machine-readable minidump created by wxCrashReport::Generate()) stack back +// trace when your program crashes using wxStackWalker +// +// Default is 1 if supported by the compiler. +// +// Recommended setting: 1, set to 0 if your programs never crash +#define wxUSE_STACKWALKER 1 + +// Set this to 1 to compile in wxDebugReport class which allows you to create +// and optionally upload to your web site a debug report consisting of back +// trace of the crash (if wxUSE_STACKWALKER == 1) and other information. +// +// Default is 1 if supported by the compiler. +// +// Recommended setting: 1, it is compiled into a separate library so there +// is no overhead if you don't use it +#define wxUSE_DEBUGREPORT 1 + +// ---------------------------------------------------------------------------- +// Unicode support +// ---------------------------------------------------------------------------- + +// Set wxUSE_UNICODE to 1 to compile wxWidgets in Unicode mode: wxChar will be +// defined as wchar_t, wxString will use Unicode internally. If you set this +// to 1, you must use wxT() macro for all literal strings in the program. +// +// Unicode is currently only fully supported under Windows NT/2000/XP +// (Windows 9x doesn't support it and the programs compiled in Unicode mode +// will not run under 9x -- but see wxUSE_UNICODE_MSLU below). +// +// Default is 0 +// +// Recommended setting: 0 (unless you only plan to use Windows NT/2000/XP) +#ifndef wxUSE_UNICODE + #define wxUSE_UNICODE 0 +#endif + +// Setting wxUSE_WCHAR_T to 1 gives you some degree of Unicode support without +// compiling the program in Unicode mode. More precisely, it will be possible +// to construct wxString from a wide (Unicode) string and convert any wxString +// to Unicode. +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_WCHAR_T 1 + +// ---------------------------------------------------------------------------- +// global features +// ---------------------------------------------------------------------------- + +// Compile library in exception-safe mode? If set to 1, the library will try to +// behave correctly in presence of exceptions (even though it still will not +// use the exceptions itself) and notify the user code about any unhandled +// exceptions. If set to 0, propagation of the exceptions through the library +// code will lead to undefined behaviour -- but the code itself will be +// slightly smaller and faster. +// +// Note that like wxUSE_THREADS this option is automatically set to 0 if +// wxNO_EXCEPTIONS is defined. +// +// Default is 1 +// +// Recommended setting: depends on whether you intend to use C++ exceptions +// in your own code (1 if you do, 0 if you don't) +#define wxUSE_EXCEPTIONS 1 + +// Set wxUSE_EXTENDED_RTTI to 1 to use extended RTTI +// +// Default is 0 +// +// Recommended setting: 0 (this is still work in progress...) +#define wxUSE_EXTENDED_RTTI 0 + +// Set wxUSE_STL to 1 to derive wxList(Foo) and wxArray(Foo) from +// std::list<Foo*> and std::vector<Foo*>, with a compatibility interface, +// and for wxHashMap to be implemented with templates. +// +// Default is 0 +// +// Recommended setting: YMMV +#define wxUSE_STL 0 + +// Support for message/error logging. This includes wxLogXXX() functions and +// wxLog and derived classes. Don't set this to 0 unless you really know what +// you are doing. +// +// Default is 1 +// +// Recommended setting: 1 (always) +#define wxUSE_LOG 1 + +// Recommended setting: 1 +#define wxUSE_LOGWINDOW 1 + +// Recommended setting: 1 +#define wxUSE_LOGGUI 1 + +// Recommended setting: 1 +#define wxUSE_LOG_DIALOG 1 + +// Support for command line parsing using wxCmdLineParser class. +// +// Default is 1 +// +// Recommended setting: 1 (can be set to 0 if you don't use the cmd line) +#define wxUSE_CMDLINE_PARSER 1 + +// Support for multithreaded applications: if 1, compile in thread classes +// (thread.h) and make the library a bit more thread safe. Although thread +// support is quite stable by now, you may still consider recompiling the +// library without it if you have no use for it - this will result in a +// somewhat smaller and faster operation. +// +// Notice that if wxNO_THREADS is defined, wxUSE_THREADS is automatically reset +// to 0 in wx/chkconf.h, so, for example, if you set USE_THREADS to 0 in +// build/msw/config.* file this value will have no effect. +// +// Default is 1 +// +// Recommended setting: 0 unless you do plan to develop MT applications +#define wxUSE_THREADS 1 + +// If enabled, compiles wxWidgets streams classes +// +// wx stream classes are used for image IO, process IO redirection, network +// protocols implementation and much more and so disabling this results in a +// lot of other functionality being lost. +// +// Default is 1 +// +// Recommended setting: 1 as setting it to 0 disables many other things +#define wxUSE_STREAMS 1 + +// Use standard C++ streams if 1 instead of wx streams in some places. If +// disabled (default), wx streams are used everywhere and wxWidgets doesn't +// depend on the standard streams library. +// +// Notice that enabling this does not replace wx streams with std streams +// everywhere, in a lot of places wx streams are used no matter what. +// +// Default is 0 +// +// Recommended setting: 1 if you use the standard streams anyhow and so +// dependency on the standard streams library is not a +// problem +#define wxUSE_STD_IOSTREAM 0 + +// Enable conversion to standard C++ string if 1. +// +// Default is 1 for most compilers. +// +// Currently the Digital Mars and Watcom compilers come without standard C++ +// library headers by default, wxUSE_STD_STRING can be set to 1 if you do have +// them (e.g. from STLPort). +// +// VC++ 5.0 does include standard C++ library header, however they produce +// many warnings that can't be turned off when compiled at warning level 4. +#if defined(__DMC__) || defined(__WATCOMC__) \ + || (defined(_MSC_VER) && _MSC_VER < 1200) + #define wxUSE_STD_STRING 0 +#else + #define wxUSE_STD_STRING 1 +#endif + +// Support for positional parameters (e.g. %1$d, %2$s ...) in wxVsnprintf. +// Note that if the system's implementation does not support positional +// parameters, setting this to 1 forces the use of the wxWidgets implementation +// of wxVsnprintf. The standard vsnprintf() supports positional parameters on +// many Unix systems but usually doesn't under Windows. +// +// Positional parameters are very useful when translating a program since using +// them in formatting strings allow translators to correctly reorder the +// translated sentences. +// +// Default is 1 +// +// Recommended setting: 1 if you want to support multiple languages +#define wxUSE_PRINTF_POS_PARAMS 1 + +// ---------------------------------------------------------------------------- +// non GUI features selection +// ---------------------------------------------------------------------------- + +// Set wxUSE_LONGLONG to 1 to compile the wxLongLong class. This is a 64 bit +// integer which is implemented in terms of native 64 bit integers if any or +// uses emulation otherwise. +// +// This class is required by wxDateTime and so you should enable it if you want +// to use wxDateTime. For most modern platforms, it will use the native 64 bit +// integers in which case (almost) all of its functions are inline and it +// almost does not take any space, so there should be no reason to switch it +// off. +// +// Recommended setting: 1 +#define wxUSE_LONGLONG 1 + +// Set wxUSE_(F)FILE to 1 to compile wx(F)File classes. wxFile uses low level +// POSIX functions for file access, wxFFile uses ANSI C stdio.h functions. +// +// Default is 1 +// +// Recommended setting: 1 (wxFile is highly recommended as it is required by +// i18n code, wxFileConfig and others) +#define wxUSE_FILE 1 +#define wxUSE_FFILE 1 + +// Use wxFSVolume class providing access to the configured/active mount points +// +// Default is 1 +// +// Recommended setting: 1 (but may be safely disabled if you don't use it) +#define wxUSE_FSVOLUME 1 + +// Use wxStandardPaths class which allows to retrieve some standard locations +// in the file system +// +// Default is 1 +// +// Recommended setting: 1 (may be disabled to save space, but not much) +#define wxUSE_STDPATHS 1 + +// use wxTextBuffer class: required by wxTextFile +#define wxUSE_TEXTBUFFER 1 + +// use wxTextFile class: requires wxFile and wxTextBuffer, required by +// wxFileConfig +#define wxUSE_TEXTFILE 1 + +// i18n support: _() macro, wxLocale class. Requires wxTextFile. +#define wxUSE_INTL 1 + +// Set wxUSE_DATETIME to 1 to compile the wxDateTime and related classes which +// allow to manipulate dates, times and time intervals. wxDateTime replaces the +// old wxTime and wxDate classes which are still provided for backwards +// compatibility (and implemented in terms of wxDateTime). +// +// Note that this class is relatively new and is still officially in alpha +// stage because some features are not yet (fully) implemented. It is already +// quite useful though and should only be disabled if you are aiming at +// absolutely minimal version of the library. +// +// Requires: wxUSE_LONGLONG +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_DATETIME 1 + +// Set wxUSE_TIMER to 1 to compile wxTimer class +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_TIMER 1 + +// Use wxStopWatch clas. +// +// Default is 1 +// +// Recommended setting: 1 (needed by wxSocket) +#define wxUSE_STOPWATCH 1 + +// Setting wxUSE_CONFIG to 1 enables the use of wxConfig and related classes +// which allow the application to store its settings in the persistent +// storage. Setting this to 1 will also enable on-demand creation of the +// global config object in wxApp. +// +// See also wxUSE_CONFIG_NATIVE below. +// +// Recommended setting: 1 +#define wxUSE_CONFIG 1 + +// If wxUSE_CONFIG is 1, you may choose to use either the native config +// classes under Windows (using .INI files under Win16 and the registry under +// Win32) or the portable text file format used by the config classes under +// Unix. +// +// Default is 1 to use native classes. Note that you may still use +// wxFileConfig even if you set this to 1 - just the config object created by +// default for the applications needs will be a wxRegConfig or wxIniConfig and +// not wxFileConfig. +// +// Recommended setting: 1 +#define wxUSE_CONFIG_NATIVE 1 + +// If wxUSE_DIALUP_MANAGER is 1, compile in wxDialUpManager class which allows +// to connect/disconnect from the network and be notified whenever the dial-up +// network connection is established/terminated. Requires wxUSE_DYNAMIC_LOADER. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_DIALUP_MANAGER 0 + +// Compile in classes for run-time DLL loading and function calling. +// Required by wxUSE_DIALUP_MANAGER. +// +// This setting is for Win32 only +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_DYNLIB_CLASS 1 + +// experimental, don't use for now +#define wxUSE_DYNAMIC_LOADER 1 + +// Set to 1 to use socket classes +#define wxUSE_SOCKETS 1 + +// Set to 1 to enable virtual file systems (required by wxHTML) +#define wxUSE_FILESYSTEM 1 + +// Set to 1 to enable virtual ZIP filesystem (requires wxUSE_FILESYSTEM) +#define wxUSE_FS_ZIP 1 + +// Set to 1 to enable virtual archive filesystem (requires wxUSE_FILESYSTEM) +#define wxUSE_FS_ARCHIVE 1 + +// Set to 1 to enable virtual Internet filesystem (requires wxUSE_FILESYSTEM) +#define wxUSE_FS_INET 1 + +// wxArchive classes for accessing archives such as zip and tar +#define wxUSE_ARCHIVE_STREAMS 1 + +// Set to 1 to compile wxZipInput/OutputStream classes. +#define wxUSE_ZIPSTREAM 1 + +// Set to 1 to compile wxTarInput/OutputStream classes. +#define wxUSE_TARSTREAM 1 + +// Set to 1 to compile wxZlibInput/OutputStream classes. Also required by +// wxUSE_LIBPNG +#define wxUSE_ZLIB 1 + +// If enabled, the code written by Apple will be used to write, in a portable +// way, float on the disk. See extended.c for the license which is different +// from wxWidgets one. +// +// Default is 1. +// +// Recommended setting: 1 unless you don't like the license terms (unlikely) +#define wxUSE_APPLE_IEEE 1 + +// Joystick support class +#define wxUSE_JOYSTICK 1 + +// wxFontMapper class +#define wxUSE_FONTMAP 1 + +// wxMimeTypesManager class +#define wxUSE_MIMETYPE 1 + +// wxProtocol and related classes: if you want to use either of wxFTP, wxHTTP +// or wxURL you need to set this to 1. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_PROTOCOL 1 + +// The settings for the individual URL schemes +#define wxUSE_PROTOCOL_FILE 1 +#define wxUSE_PROTOCOL_FTP 1 +#define wxUSE_PROTOCOL_HTTP 1 + +// Define this to use wxURL class. +#define wxUSE_URL 1 + +// Define this to use native platform url and protocol support. +// Currently valid only for MS-Windows. +// Note: if you set this to 1, you can open ftp/http/gopher sites +// and obtain a valid input stream for these sites +// even when you set wxUSE_PROTOCOL_FTP/HTTP to 0. +// Doing so reduces the code size. +// +// This code is experimental and subject to change. +#define wxUSE_URL_NATIVE 0 + +// Support for wxVariant class used in several places throughout the library, +// notably in wxDataViewCtrl API. +// +// Default is 1. +// +// Recommended setting: 1 unless you want to reduce the library size as much as +// possible in which case setting this to 0 can gain up to 100KB. +#define wxUSE_VARIANT 1 + +// Support for regular expression matching via wxRegEx class: enable this to +// use POSIX regular expressions in your code. You need to compile regex +// library from src/regex to use it under Windows. +// +// Default is 0 +// +// Recommended setting: 1 if your compiler supports it, if it doesn't please +// contribute us a makefile for src/regex for it +#define wxUSE_REGEX 0 + +// wxSystemOptions class +#define wxUSE_SYSTEM_OPTIONS 1 + +// wxSound class +#define wxUSE_SOUND 1 + +// Use wxMediaCtrl +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_MEDIACTRL 1 + +// Use GStreamer for Unix (req a lot of dependancies) +// +// Default is 0 +// +// Recommended setting: 1 (wxMediaCtrl won't work by default without it) +#define wxUSE_GSTREAMER 0 + +// Use wxWidget's XRC XML-based resource system. Recommended. +// +// Default is 1 +// +// Recommended setting: 1 (requires wxUSE_XML) +#define wxUSE_XRC 1 + +// XML parsing classes. Note that their API will change in the future, so +// using wxXmlDocument and wxXmlNode in your app is not recommended. +// +// Default is the same as wxUSE_XRC, i.e. 1 by default. +// +// Recommended setting: 1 (required by XRC) +#define wxUSE_XML wxUSE_XRC + +// Use wxWidget's AUI docking system +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_AUI 1 + + +// Enable the new wxGraphicsPath and wxGraphicsContext classes for an advanced +// 2D drawing API. (Still somewhat experimental) +// +// Please note that on Windows you will need to link with gdiplus.lib (use +// USE_GDIPLUS=1 for makefile builds) and distribute gdiplus.dll with your +// application if you want it to be runnable on pre-XP systems. +// +// Default is 0 +// +// Recommended setting: 1 +#ifndef wxUSE_GRAPHICS_CONTEXT +#define wxUSE_GRAPHICS_CONTEXT 0 +#endif + +// ---------------------------------------------------------------------------- +// Individual GUI controls +// ---------------------------------------------------------------------------- + +// You must set wxUSE_CONTROLS to 1 if you are using any controls at all +// (without it, wxControl class is not compiled) +// +// Default is 1 +// +// Recommended setting: 1 (don't change except for very special programs) +#define wxUSE_CONTROLS 1 + +// wxPopupWindow class is a top level transient window. It is currently used +// to implement wxTipWindow +// +// Default is 1 +// +// Recommended setting: 1 (may be set to 0 if you don't wxUSE_TIPWINDOW) +#define wxUSE_POPUPWIN 1 + +// wxTipWindow allows to implement the custom tooltips, it is used by the +// context help classes. Requires wxUSE_POPUPWIN. +// +// Default is 1 +// +// Recommended setting: 1 (may be set to 0) +#define wxUSE_TIPWINDOW 1 + +// Each of the settings below corresponds to one wxWidgets control. They are +// all switched on by default but may be disabled if you are sure that your +// program (including any standard dialogs it can show!) doesn't need them and +// if you desperately want to save some space. If you use any of these you must +// set wxUSE_CONTROLS as well. +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_ANIMATIONCTRL 1 // wxAnimationCtrl +#define wxUSE_BUTTON 1 // wxButton +#define wxUSE_BMPBUTTON 1 // wxBitmapButton +#define wxUSE_CALENDARCTRL 1 // wxCalendarCtrl +#define wxUSE_CHECKBOX 1 // wxCheckBox +#define wxUSE_CHECKLISTBOX 1 // wxCheckListBox (requires wxUSE_OWNER_DRAWN) +#define wxUSE_CHOICE 1 // wxChoice +#define wxUSE_COLLPANE 1 // wxCollapsiblePane +#define wxUSE_COLOURPICKERCTRL 1 // wxColourPickerCtrl +#define wxUSE_COMBOBOX 1 // wxComboBox +#define wxUSE_DATAVIEWCTRL 1 // wxDataViewCtrl +#define wxUSE_DATEPICKCTRL 1 // wxDatePickerCtrl +#define wxUSE_DIRPICKERCTRL 1 // wxDirPickerCtrl +#define wxUSE_FILEPICKERCTRL 1 // wxFilePickerCtrl +#define wxUSE_FONTPICKERCTRL 1 // wxFontPickerCtrl +#define wxUSE_GAUGE 1 // wxGauge +#define wxUSE_HYPERLINKCTRL 1 // wxHyperlinkCtrl +#define wxUSE_LISTBOX 1 // wxListBox +#define wxUSE_LISTCTRL 1 // wxListCtrl +#define wxUSE_RADIOBOX 1 // wxRadioBox +#define wxUSE_RADIOBTN 1 // wxRadioButton +#define wxUSE_SCROLLBAR 1 // wxScrollBar +#define wxUSE_SEARCHCTRL 1 // wxSearchCtrl +#define wxUSE_SLIDER 1 // wxSlider +#define wxUSE_SPINBTN 1 // wxSpinButton +#define wxUSE_SPINCTRL 1 // wxSpinCtrl +#define wxUSE_STATBOX 1 // wxStaticBox +#define wxUSE_STATLINE 1 // wxStaticLine +#define wxUSE_STATTEXT 1 // wxStaticText +#define wxUSE_STATBMP 1 // wxStaticBitmap +#define wxUSE_TEXTCTRL 1 // wxTextCtrl +#define wxUSE_TOGGLEBTN 1 // requires wxButton +#define wxUSE_TREECTRL 1 // wxTreeCtrl + +// Use a status bar class? Depending on the value of wxUSE_NATIVE_STATUSBAR +// below either wxStatusBar95 or a generic wxStatusBar will be used. +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_STATUSBAR 1 + +// Two status bar implementations are available under Win32: the generic one +// or the wrapper around native control. For native look and feel the native +// version should be used. +// +// Default is 1 for the platforms where native status bar is supported. +// +// Recommended setting: 1 (there is no advantage in using the generic one) +#define wxUSE_NATIVE_STATUSBAR 1 + +// wxToolBar related settings: if wxUSE_TOOLBAR is 0, don't compile any toolbar +// classes at all. Otherwise, use the native toolbar class unless +// wxUSE_TOOLBAR_NATIVE is 0. +// +// Default is 1 for all settings. +// +// Recommended setting: 1 for wxUSE_TOOLBAR and wxUSE_TOOLBAR_NATIVE. +#define wxUSE_TOOLBAR 1 +#define wxUSE_TOOLBAR_NATIVE 1 + +// wxNotebook is a control with several "tabs" located on one of its sides. It +// may be used to logically organise the data presented to the user instead of +// putting everything in one huge dialog. It replaces wxTabControl and related +// classes of wxWin 1.6x. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_NOTEBOOK 1 + +// wxListbook control is similar to wxNotebook but uses wxListCtrl instead of +// the tabs +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_LISTBOOK 1 + +// wxChoicebook control is similar to wxNotebook but uses wxChoice instead of +// the tabs +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_CHOICEBOOK 1 + +// wxTreebook control is similar to wxNotebook but uses wxTreeCtrl instead of +// the tabs +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_TREEBOOK 1 + +// wxToolbook control is similar to wxNotebook but uses wxToolBar instead of +// tabs +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_TOOLBOOK 1 + +// wxTabDialog is a generic version of wxNotebook but it is incompatible with +// the new class. It shouldn't be used in new code. +// +// Default is 0. +// +// Recommended setting: 0 (use wxNotebook) +#define wxUSE_TAB_DIALOG 0 + +// wxGrid class +// +// Default is 1, set to 0 to cut down compilation time and binaries size if you +// don't use it. +// +// Recommended setting: 1 +// +#define wxUSE_GRID 1 + +// wxMiniFrame class: a frame with narrow title bar +// +// Default is 1. +// +// Recommended setting: 1 (it doesn't cost almost anything) +#define wxUSE_MINIFRAME 1 + +// wxComboCtrl and related classes: combobox with custom popup window and +// not necessarily a listbox. +// +// Default is 1. +// +// Recommended setting: 1 but can be safely set to 0 except for wxUniv where it +// it used by wxComboBox +#define wxUSE_COMBOCTRL 1 + +// wxOwnerDrawnComboBox is a custom combobox allowing to paint the combobox +// items. +// +// Default is 1. +// +// Recommended setting: 1 but can be safely set to 0, except where it is +// needed as a base class for generic wxBitmapComboBox. +#define wxUSE_ODCOMBOBOX 1 + +// wxBitmapComboBox is a combobox that can have images in front of text items. +// +// Default is 1. +// +// Recommended setting: 1 but can be safely set to 0 +#define wxUSE_BITMAPCOMBOBOX 1 + +// ---------------------------------------------------------------------------- +// Miscellaneous GUI stuff +// ---------------------------------------------------------------------------- + +// wxAcceleratorTable/Entry classes and support for them in wxMenu(Bar) +#define wxUSE_ACCEL 1 + +// Hotkey support (currently Windows only) +#define wxUSE_HOTKEY 1 + +// Use wxCaret: a class implementing a "cursor" in a text control (called caret +// under Windows). +// +// Default is 1. +// +// Recommended setting: 1 (can be safely set to 0, not used by the library) +#define wxUSE_CARET 1 + +// Use wxDisplay class: it allows enumerating all displays on a system and +// their geometries as well as finding the display on which the given point or +// window lies. +// +// Default is 1. +// +// Recommended setting: 1 if you need it, can be safely set to 0 otherwise +#define wxUSE_DISPLAY 0 + +// Miscellaneous geometry code: needed for Canvas library +#define wxUSE_GEOMETRY 1 + +// Use wxImageList. This class is needed by wxNotebook, wxTreeCtrl and +// wxListCtrl. +// +// Default is 1. +// +// Recommended setting: 1 (set it to 0 if you don't use any of the controls +// enumerated above, then this class is mostly useless too) +#define wxUSE_IMAGLIST 1 + +// Use wxMenu, wxMenuBar, wxMenuItem. +// +// Default is 1. +// +// Recommended setting: 1 (can't be disabled under MSW) +#define wxUSE_MENUS 1 + +// Use wxSashWindow class. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_SASH 0 + +// Use wxSplitterWindow class. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_SPLITTER 0 + +// Use wxToolTip and wxWindow::Set/GetToolTip() methods. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_TOOLTIPS 1 + +// wxValidator class and related methods +#define wxUSE_VALIDATORS 1 + +// ---------------------------------------------------------------------------- +// common dialogs +// ---------------------------------------------------------------------------- + +// On rare occasions (e.g. using DJGPP) may want to omit common dialogs (e.g. +// file selector, printer dialog). Switching this off also switches off the +// printing architecture and interactive wxPrinterDC. +// +// Default is 1 +// +// Recommended setting: 1 (unless it really doesn't work) +#define wxUSE_COMMON_DIALOGS 1 + +// wxBusyInfo displays window with message when app is busy. Works in same way +// as wxBusyCursor +#define wxUSE_BUSYINFO 1 + +// Use single/multiple choice dialogs. +// +// Default is 1 +// +// Recommended setting: 1 (used in the library itself) +#define wxUSE_CHOICEDLG 1 + +// Use colour picker dialog +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_COLOURDLG 1 + +// wxDirDlg class for getting a directory name from user +#define wxUSE_DIRDLG 1 + +// TODO: setting to choose the generic or native one + +// Use file open/save dialogs. +// +// Default is 1 +// +// Recommended setting: 1 (used in many places in the library itself) +#define wxUSE_FILEDLG 1 + +// Use find/replace dialogs. +// +// Default is 1 +// +// Recommended setting: 1 (but may be safely set to 0) +#define wxUSE_FINDREPLDLG 0 + +// Use font picker dialog +// +// Default is 1 +// +// Recommended setting: 1 (used in the library itself) +#define wxUSE_FONTDLG 1 + +// Use wxMessageDialog and wxMessageBox. +// +// Default is 1 +// +// Recommended setting: 1 (used in the library itself) +#define wxUSE_MSGDLG 1 + +// progress dialog class for lengthy operations +#define wxUSE_PROGRESSDLG 1 + +// support for startup tips (wxShowTip &c) +#define wxUSE_STARTUP_TIPS 1 + +// text entry dialog and wxGetTextFromUser function +#define wxUSE_TEXTDLG 1 + +// number entry dialog +#define wxUSE_NUMBERDLG 0 + +// splash screen class +#define wxUSE_SPLASH 1 + +// wizards +#define wxUSE_WIZARDDLG 0 + +// Compile in wxAboutBox() function showing the standard "About" dialog. +// +// Default is 1 +// +// Recommended setting: 1 but can be set to 0 to save some space if you don't +// use this function +#define wxUSE_ABOUTDLG 1 + +// ---------------------------------------------------------------------------- +// Metafiles support +// ---------------------------------------------------------------------------- + +// Windows supports the graphics format known as metafile which is, though not +// portable, is widely used under Windows and so is supported by wxWin (under +// Windows only, of course). Win16 (Win3.1) used the so-called "Window +// MetaFiles" or WMFs which were replaced with "Enhanced MetaFiles" or EMFs in +// Win32 (Win9x, NT, 2000). Both of these are supported in wxWin and, by +// default, WMFs will be used under Win16 and EMFs under Win32. This may be +// changed by setting wxUSE_WIN_METAFILES_ALWAYS to 1 and/or setting +// wxUSE_ENH_METAFILE to 0. You may also set wxUSE_METAFILE to 0 to not compile +// in any metafile related classes at all. +// +// Default is 1 for wxUSE_ENH_METAFILE and 0 for wxUSE_WIN_METAFILES_ALWAYS. +// +// Recommended setting: default or 0 for everything for portable programs. +#define wxUSE_METAFILE 1 +#define wxUSE_ENH_METAFILE 1 +#define wxUSE_WIN_METAFILES_ALWAYS 0 + +// ---------------------------------------------------------------------------- +// Big GUI components +// ---------------------------------------------------------------------------- + +// Set to 0 to disable MDI support. +// +// Requires wxUSE_NOTEBOOK under platforms other than MSW. +// +// Default is 1. +// +// Recommended setting: 1, can be safely set to 0. +#define wxUSE_MDI 0 + +// Set to 0 to disable document/view architecture +#define wxUSE_DOC_VIEW_ARCHITECTURE 0 + +// Set to 0 to disable MDI document/view architecture +// +// Requires wxUSE_MDI && wxUSE_DOC_VIEW_ARCHITECTURE +#define wxUSE_MDI_ARCHITECTURE 0 + +// Set to 0 to disable print/preview architecture code +#define wxUSE_PRINTING_ARCHITECTURE 0 + +// wxHTML sublibrary allows to display HTML in wxWindow programs and much, +// much more. +// +// Default is 1. +// +// Recommended setting: 1 (wxHTML is great!), set to 0 if you want compile a +// smaller library. +#define wxUSE_HTML 1 + +// Setting wxUSE_GLCANVAS to 1 enables OpenGL support. You need to have OpenGL +// headers and libraries to be able to compile the library with wxUSE_GLCANVAS +// set to 1. Note that for some compilers (notably Microsoft Visual C++) you +// will need to manually add opengl32.lib and glu32.lib to the list of +// libraries linked with your program if you use OpenGL. +// +// Default is 0. +// +// Recommended setting: 1 if you intend to use OpenGL, 0 otherwise +#define wxUSE_GLCANVAS 0 + +// wxRichTextCtrl allows editing of styled text. +// +// Default is 1. +// +// Recommended setting: 1, set to 0 if you want compile a +// smaller library. +#define wxUSE_RICHTEXT 0 + +// ---------------------------------------------------------------------------- +// Data transfer +// ---------------------------------------------------------------------------- + +// Use wxClipboard class for clipboard copy/paste. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_CLIPBOARD 0 + +// Use wxDataObject and related classes. Needed for clipboard and OLE drag and +// drop +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_DATAOBJ 1 + +// Use wxDropTarget and wxDropSource classes for drag and drop (this is +// different from "built in" drag and drop in wxTreeCtrl which is always +// available). Requires wxUSE_DATAOBJ. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_DRAG_AND_DROP 1 + +// Use wxAccessible for enhanced and customisable accessibility. +// Depends on wxUSE_OLE. +// +// Default is 0. +// +// Recommended setting (at present): 0 +#define wxUSE_ACCESSIBILITY 0 + +// ---------------------------------------------------------------------------- +// miscellaneous settings +// ---------------------------------------------------------------------------- + +// wxSingleInstanceChecker class allows to verify at startup if another program +// instance is running (it is only available under Win32) +// +// Default is 1 +// +// Recommended setting: 1 (the class is tiny, disabling it won't save much +// space) +#define wxUSE_SNGLINST_CHECKER 0 + +#define wxUSE_DRAGIMAGE 1 + +#define wxUSE_IPC 0 + // 0 for no interprocess comms +#define wxUSE_HELP 1 + // 0 for no help facility + +// Should we use MS HTML help for wxHelpController? If disabled, neither +// wxCHMHelpController nor wxBestHelpController are available. +// +// Default is 1 under MSW, 0 is always used for the other platforms. +// +// Recommended setting: 1, only set to 0 if you have trouble compiling +// wxCHMHelpController (could be a problem with really ancient compilers) +#define wxUSE_MS_HTML_HELP 1 + + +// Use wxHTML-based help controller? +#define wxUSE_WXHTML_HELP 1 + +#define wxUSE_RESOURCES 1 + // 0 for no wxGetResource/wxWriteResource +#define wxUSE_CONSTRAINTS 1 + // 0 for no window layout constraint system + +#define wxUSE_SPLINES 1 + // 0 for no splines + +#define wxUSE_MOUSEWHEEL 1 + // Include mouse wheel support + +// ---------------------------------------------------------------------------- +// postscript support settings +// ---------------------------------------------------------------------------- + +// Set to 1 for PostScript device context. +#define wxUSE_POSTSCRIPT 0 + +// Set to 1 to use font metric files in GetTextExtent +#define wxUSE_AFM_FOR_POSTSCRIPT 0 + +// ---------------------------------------------------------------------------- +// database classes +// ---------------------------------------------------------------------------- + +// Define 1 to use ODBC classes +#define wxUSE_ODBC 0 + +// For backward compatibility reasons, this parameter now only controls the +// default scrolling method used by cursors. This default behavior can be +// overriden by setting the second param of wxDB::wxDbGetConnection() or +// wxDb() constructor to indicate whether the connection (and any wxDbTable()s +// that use the connection) should support forward only scrolling of cursors, +// or both forward and backward support for backward scrolling cursors is +// dependent on the data source as well as the ODBC driver being used. +#define wxODBC_FWD_ONLY_CURSORS 0 + +// Default is 0. Set to 1 to use the deprecated classes, enum types, function, +// member variables. With a setting of 1, full backward compatibility with the +// 2.0.x release is possible. It is STRONGLY recommended that this be set to 0, +// as future development will be done only on the non-deprecated +// functions/classes/member variables/etc. +#define wxODBC_BACKWARD_COMPATABILITY 0 + +// ---------------------------------------------------------------------------- +// other compiler (mis)features +// ---------------------------------------------------------------------------- + +// Set this to 0 if your compiler can't cope with omission of prototype +// parameters. +// +// Default is 1. +// +// Recommended setting: 1 (should never need to set this to 0) +#define REMOVE_UNUSED_ARG 1 + +// VC++ 4.2 and above allows <iostream> and <iostream.h> but you can't mix +// them. Set to 1 for <iostream.h>, 0 for <iostream>. Note that VC++ 7.1 +// and later doesn't support wxUSE_IOSTREAMH == 1 and so <iostream> will be +// used anyhow. +// +// Default is 1. +// +// Recommended setting: whatever your compiler likes more +#define wxUSE_IOSTREAMH 1 + +// ---------------------------------------------------------------------------- +// image format support +// ---------------------------------------------------------------------------- + +// wxImage supports many different image formats which can be configured at +// compile-time. BMP is always supported, others are optional and can be safely +// disabled if you don't plan to use images in such format sometimes saving +// substantial amount of code in the final library. +// +// Some formats require an extra library which is included in wxWin sources +// which is mentioned if it is the case. + +// Set to 1 for wxImage support (recommended). +#define wxUSE_IMAGE 1 + +// Set to 1 for PNG format support (requires libpng). Also requires wxUSE_ZLIB. +#define wxUSE_LIBPNG 1 + +// Set to 1 for JPEG format support (requires libjpeg) +#define wxUSE_LIBJPEG 0 + +// Set to 1 for TIFF format support (requires libtiff) +#define wxUSE_LIBTIFF 0 + +// Set to 1 for TGA format support (loading only) +#define wxUSE_TGA 1 + +// Set to 1 for GIF format support +#define wxUSE_GIF 0 + +// Set to 1 for PNM format support +#define wxUSE_PNM 0 + +// Set to 1 for PCX format support +#define wxUSE_PCX 0 + +// Set to 1 for IFF format support (Amiga format) +#define wxUSE_IFF 0 + +// Set to 1 for XPM format support +#define wxUSE_XPM 1 + +// Set to 1 for MS Icons and Cursors format support +#define wxUSE_ICO_CUR 1 + +// Set to 1 to compile in wxPalette class +#define wxUSE_PALETTE 1 + +// ---------------------------------------------------------------------------- +// wxUniversal-only options +// ---------------------------------------------------------------------------- + +// Set to 1 to enable compilation of all themes, this is the default +#define wxUSE_ALL_THEMES 1 + +// Set to 1 to enable the compilation of individual theme if wxUSE_ALL_THEMES +// is unset, if it is set these options are not used; notice that metal theme +// uses Win32 one +#define wxUSE_THEME_GTK 0 +#define wxUSE_THEME_METAL 0 +#define wxUSE_THEME_MONO 0 +#define wxUSE_THEME_WIN32 0 + + +/* --- end common options --- */ + +// ---------------------------------------------------------------------------- +// Windows-only settings +// ---------------------------------------------------------------------------- + +// Set wxUSE_UNICODE_MSLU to 1 if you're compiling wxWidgets in Unicode mode +// and want to run your programs under Windows 9x and not only NT/2000/XP. +// This setting enables use of unicows.dll from MSLU (MS Layer for Unicode, see +// http://www.microsoft.com/globaldev/handson/dev/mslu_announce.mspx). Note +// that you will have to modify the makefiles to include unicows.lib import +// library as the first library (see installation instructions in install.txt +// to learn how to do it when building the library or samples). +// +// If your compiler doesn't have unicows.lib, you can get a version of it at +// http://libunicows.sourceforge.net +// +// Default is 0 +// +// Recommended setting: 0 (1 if you want to deploy Unicode apps on 9x systems) +#ifndef wxUSE_UNICODE_MSLU + #define wxUSE_UNICODE_MSLU 0 +#endif + +// Set this to 1 if you want to use wxWidgets and MFC in the same program. This +// will override some other settings (see below) +// +// Default is 0. +// +// Recommended setting: 0 unless you really have to use MFC +#define wxUSE_MFC 0 + +// Set this to 1 for generic OLE support: this is required for drag-and-drop, +// clipboard, OLE Automation. Only set it to 0 if your compiler is very old and +// can't compile/doesn't have the OLE headers. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_OLE 1 + +// Set this to 1 to enable wxAutomationObject class. +// +// Default is 1. +// +// Recommended setting: 1 if you need to control other applications via OLE +// Automation, can be safely set to 0 otherwise +#define wxUSE_OLE_AUTOMATION 0 + +// Set this to 1 to enable wxActiveXContainer class allowing to embed OLE +// controls in wx. +// +// Default is 1. +// +// Recommended setting: 1, required by wxMediaCtrl +#define wxUSE_ACTIVEX 0 + +// wxDC cacheing implementation +#define wxUSE_DC_CACHEING 1 + +// Set this to 1 to enable the use of DIB's for wxBitmap to support +// bitmaps > 16MB on Win95/98/Me. Set to 0 to use DDB's only. +#define wxUSE_DIB_FOR_BITMAP 0 + +// Set this to 1 to enable wxDIB class used internally for manipulating +// wxBitmao data. +// +// Default is 1, set it to 0 only if you don't use wxImage neither +// +// Recommended setting: 1 (without it conversion to/from wxImage won't work) +#define wxUSE_WXDIB 1 + +// Set to 0 to disable PostScript print/preview architecture code under Windows +// (just use Windows printing). +#define wxUSE_POSTSCRIPT_ARCHITECTURE_IN_MSW 0 + +// Set this to 1 to use RICHEDIT controls for wxTextCtrl with style wxTE_RICH +// which allows to put more than ~32Kb of text in it even under Win9x (NT +// doesn't have such limitation). +// +// Default is 1 for compilers which support it +// +// Recommended setting: 1, only set it to 0 if your compiler doesn't have +// or can't compile <richedit.h> +#define wxUSE_RICHEDIT 0 + +// Set this to 1 to use extra features of richedit v2 and later controls +// +// Default is 1 for compilers which support it +// +// Recommended setting: 1 +#define wxUSE_RICHEDIT2 0 + +// Set this to 1 to enable support for the owner-drawn menu and listboxes. This +// is required by wxUSE_CHECKLISTBOX. +// +// Default is 1. +// +// Recommended setting: 1, set to 0 for a small library size reduction +#define wxUSE_OWNER_DRAWN 1 + +// Set to 1 to compile MS Windows XP theme engine support +#define wxUSE_UXTHEME 1 + +// Set to 1 to auto-adapt to MS Windows XP themes where possible +// (notably, wxNotebook pages) +#define wxUSE_UXTHEME_AUTO 1 + +// Set to 1 to use InkEdit control (Tablet PC), if available +#define wxUSE_INKEDIT 1 + +// ---------------------------------------------------------------------------- +// Generic versions of native controls +// ---------------------------------------------------------------------------- + +// Set this to 1 to be able to use wxDatePickerCtrlGeneric in addition to the +// native wxDatePickerCtrl +// +// Default is 0. +// +// Recommended setting: 0, this is mainly used for testing +#define wxUSE_DATEPICKCTRL_GENERIC 0 + +// ---------------------------------------------------------------------------- +// Crash debugging helpers +// ---------------------------------------------------------------------------- + +// Set this to 1 to be able to use wxCrashReport::Generate() to create mini +// dumps of your program when it crashes (or at any other moment) +// +// Default is 1 if supported by the compiler (VC++ and recent BC++ only). +// +// Recommended setting: 1, set to 0 if your programs never crash +#define wxUSE_CRASHREPORT 1 + +// ---------------------------------------------------------------------------- +// obsolete settings +// ---------------------------------------------------------------------------- + +// NB: all settings in this section are obsolete and should not be used/changed +// at all, they will disappear + +// Define 1 to use bitmap messages. +#define wxUSE_BITMAP_MESSAGE 1 + +#endif // _WX_SETUP_H_ + diff --git a/Externals/wxWidgets/include/wx/setup_inc.h b/Externals/wxWidgets/include/wx/setup_inc.h new file mode 100644 index 0000000000..ba10f4c32c --- /dev/null +++ b/Externals/wxWidgets/include/wx/setup_inc.h @@ -0,0 +1,1198 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/setup_inc.h +// Purpose: setup.h settings +// Author: Vadim Zeitlin +// Modified by: +// Created: +// RCS-ID: $Id: setup_inc.h 43908 2006-12-11 06:19:27Z RD $ +// Copyright: (c) Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ---------------------------------------------------------------------------- +// global settings +// ---------------------------------------------------------------------------- + +// define this to 0 when building wxBase library - this can also be done from +// makefile/project file overriding the value here +#ifndef wxUSE_GUI + #define wxUSE_GUI 1 +#endif // wxUSE_GUI + +// ---------------------------------------------------------------------------- +// compatibility settings +// ---------------------------------------------------------------------------- + +// This setting determines the compatibility with 2.4 API: set it to 1 to +// enable it but please consider updating your code instead. +// +// Default is 0 +// +// Recommended setting: 0 (please update your code) +#define WXWIN_COMPATIBILITY_2_4 0 + +// This setting determines the compatibility with 2.6 API: set it to 0 to +// flag all cases of using deprecated functions. +// +// Default is 1 but please try building your code with 0 as the default will +// change to 0 in the next version and the deprecated functions will disappear +// in the version after it completely. +// +// Recommended setting: 0 (please update your code) +#define WXWIN_COMPATIBILITY_2_6 1 + +// MSW-only: Set to 0 for accurate dialog units, else 1 for old behaviour when +// default system font is used for wxWindow::GetCharWidth/Height() instead of +// the current font. +// +// Default is 0 +// +// Recommended setting: 0 +#define wxDIALOG_UNIT_COMPATIBILITY 0 + +// ---------------------------------------------------------------------------- +// debugging settings +// ---------------------------------------------------------------------------- + +// Generic comment about debugging settings: they are very useful if you don't +// use any other memory leak detection tools such as Purify/BoundsChecker, but +// are probably redundant otherwise. Also, Visual C++ CRT has the same features +// as wxWidgets memory debugging subsystem built in since version 5.0 and you +// may prefer to use it instead of built in memory debugging code because it is +// faster and more fool proof. +// +// Using VC++ CRT memory debugging is enabled by default in debug mode +// (__WXDEBUG__) if wxUSE_GLOBAL_MEMORY_OPERATORS is *not* enabled (i.e. is 0) +// and if __NO_VC_CRTDBG__ is not defined. + +// If 1, enables wxDebugContext, for writing error messages to file, etc. If +// __WXDEBUG__ is not defined, will still use the normal memory operators. +// +// Default is 0 +// +// Recommended setting: 0 +#define wxUSE_DEBUG_CONTEXT 0 + +// If 1, enables debugging versions of wxObject::new and wxObject::delete *IF* +// __WXDEBUG__ is also defined. +// +// WARNING: this code may not work with all architectures, especially if +// alignment is an issue. This switch is currently ignored for mingw / cygwin +// +// Default is 0 +// +// Recommended setting: 1 if you are not using a memory debugging tool, else 0 +#define wxUSE_MEMORY_TRACING 0 + +// In debug mode, cause new and delete to be redefined globally. +// If this causes problems (e.g. link errors which is a common problem +// especially if you use another library which also redefines the global new +// and delete), set this to 0. +// This switch is currently ignored for mingw / cygwin +// +// Default is 0 +// +// Recommended setting: 0 +#define wxUSE_GLOBAL_MEMORY_OPERATORS 0 + +// In debug mode, causes new to be defined to be WXDEBUG_NEW (see object.h). If +// this causes problems (e.g. link errors), set this to 0. You may need to set +// this to 0 if using templates (at least for VC++). This switch is currently +// ignored for mingw / cygwin / CodeWarrior +// +// Default is 0 +// +// Recommended setting: 0 +#define wxUSE_DEBUG_NEW_ALWAYS 0 + +// wxHandleFatalExceptions() may be used to catch the program faults at run +// time and, instead of terminating the program with a usual GPF message box, +// call the user-defined wxApp::OnFatalException() function. If you set +// wxUSE_ON_FATAL_EXCEPTION to 0, wxHandleFatalExceptions() will not work. +// +// This setting is for Win32 only and can only be enabled if your compiler +// supports Win32 structured exception handling (currently only VC++ does) +// +// Default is 1 +// +// Recommended setting: 1 if your compiler supports it. +#define wxUSE_ON_FATAL_EXCEPTION 1 + +// Set this to 1 to be able to generate a human-readable (unlike +// machine-readable minidump created by wxCrashReport::Generate()) stack back +// trace when your program crashes using wxStackWalker +// +// Default is 1 if supported by the compiler. +// +// Recommended setting: 1, set to 0 if your programs never crash +#define wxUSE_STACKWALKER 1 + +// Set this to 1 to compile in wxDebugReport class which allows you to create +// and optionally upload to your web site a debug report consisting of back +// trace of the crash (if wxUSE_STACKWALKER == 1) and other information. +// +// Default is 1 if supported by the compiler. +// +// Recommended setting: 1, it is compiled into a separate library so there +// is no overhead if you don't use it +#define wxUSE_DEBUGREPORT 1 + +// ---------------------------------------------------------------------------- +// Unicode support +// ---------------------------------------------------------------------------- + +// Set wxUSE_UNICODE to 1 to compile wxWidgets in Unicode mode: wxChar will be +// defined as wchar_t, wxString will use Unicode internally. If you set this +// to 1, you must use wxT() macro for all literal strings in the program. +// +// Unicode is currently only fully supported under Windows NT/2000/XP +// (Windows 9x doesn't support it and the programs compiled in Unicode mode +// will not run under 9x -- but see wxUSE_UNICODE_MSLU below). +// +// Default is 0 +// +// Recommended setting: 0 (unless you only plan to use Windows NT/2000/XP) +#ifndef wxUSE_UNICODE + #define wxUSE_UNICODE 0 +#endif + +// Setting wxUSE_WCHAR_T to 1 gives you some degree of Unicode support without +// compiling the program in Unicode mode. More precisely, it will be possible +// to construct wxString from a wide (Unicode) string and convert any wxString +// to Unicode. +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_WCHAR_T 1 + +// ---------------------------------------------------------------------------- +// global features +// ---------------------------------------------------------------------------- + +// Compile library in exception-safe mode? If set to 1, the library will try to +// behave correctly in presence of exceptions (even though it still will not +// use the exceptions itself) and notify the user code about any unhandled +// exceptions. If set to 0, propagation of the exceptions through the library +// code will lead to undefined behaviour -- but the code itself will be +// slightly smaller and faster. +// +// Note that like wxUSE_THREADS this option is automatically set to 0 if +// wxNO_EXCEPTIONS is defined. +// +// Default is 1 +// +// Recommended setting: depends on whether you intend to use C++ exceptions +// in your own code (1 if you do, 0 if you don't) +#define wxUSE_EXCEPTIONS 1 + +// Set wxUSE_EXTENDED_RTTI to 1 to use extended RTTI +// +// Default is 0 +// +// Recommended setting: 0 (this is still work in progress...) +#define wxUSE_EXTENDED_RTTI 0 + +// Set wxUSE_STL to 1 to derive wxList(Foo) and wxArray(Foo) from +// std::list<Foo*> and std::vector<Foo*>, with a compatibility interface, +// and for wxHashMap to be implemented with templates. +// +// Default is 0 +// +// Recommended setting: YMMV +#define wxUSE_STL 0 + +// Support for message/error logging. This includes wxLogXXX() functions and +// wxLog and derived classes. Don't set this to 0 unless you really know what +// you are doing. +// +// Default is 1 +// +// Recommended setting: 1 (always) +#define wxUSE_LOG 1 + +// Recommended setting: 1 +#define wxUSE_LOGWINDOW 1 + +// Recommended setting: 1 +#define wxUSE_LOGGUI 1 + +// Recommended setting: 1 +#define wxUSE_LOG_DIALOG 1 + +// Support for command line parsing using wxCmdLineParser class. +// +// Default is 1 +// +// Recommended setting: 1 (can be set to 0 if you don't use the cmd line) +#define wxUSE_CMDLINE_PARSER 1 + +// Support for multithreaded applications: if 1, compile in thread classes +// (thread.h) and make the library a bit more thread safe. Although thread +// support is quite stable by now, you may still consider recompiling the +// library without it if you have no use for it - this will result in a +// somewhat smaller and faster operation. +// +// Notice that if wxNO_THREADS is defined, wxUSE_THREADS is automatically reset +// to 0 in wx/chkconf.h, so, for example, if you set USE_THREADS to 0 in +// build/msw/config.* file this value will have no effect. +// +// Default is 1 +// +// Recommended setting: 0 unless you do plan to develop MT applications +#define wxUSE_THREADS 1 + +// If enabled, compiles wxWidgets streams classes +// +// wx stream classes are used for image IO, process IO redirection, network +// protocols implementation and much more and so disabling this results in a +// lot of other functionality being lost. +// +// Default is 1 +// +// Recommended setting: 1 as setting it to 0 disables many other things +#define wxUSE_STREAMS 1 + +// Use standard C++ streams if 1 instead of wx streams in some places. If +// disabled (default), wx streams are used everywhere and wxWidgets doesn't +// depend on the standard streams library. +// +// Notice that enabling this does not replace wx streams with std streams +// everywhere, in a lot of places wx streams are used no matter what. +// +// Default is 0 +// +// Recommended setting: 1 if you use the standard streams anyhow and so +// dependency on the standard streams library is not a +// problem +#define wxUSE_STD_IOSTREAM 0 + +// Enable conversion to standard C++ string if 1. +// +// Default is 1 for most compilers. +// +// Currently the Digital Mars and Watcom compilers come without standard C++ +// library headers by default, wxUSE_STD_STRING can be set to 1 if you do have +// them (e.g. from STLPort). +// +// VC++ 5.0 does include standard C++ library header, however they produce +// many warnings that can't be turned off when compiled at warning level 4. +#if defined(__DMC__) || defined(__WATCOMC__) \ + || (defined(_MSC_VER) && _MSC_VER < 1200) + #define wxUSE_STD_STRING 0 +#else + #define wxUSE_STD_STRING 1 +#endif + +// Support for positional parameters (e.g. %1$d, %2$s ...) in wxVsnprintf. +// Note that if the system's implementation does not support positional +// parameters, setting this to 1 forces the use of the wxWidgets implementation +// of wxVsnprintf. The standard vsnprintf() supports positional parameters on +// many Unix systems but usually doesn't under Windows. +// +// Positional parameters are very useful when translating a program since using +// them in formatting strings allow translators to correctly reorder the +// translated sentences. +// +// Default is 1 +// +// Recommended setting: 1 if you want to support multiple languages +#define wxUSE_PRINTF_POS_PARAMS 1 + +// ---------------------------------------------------------------------------- +// non GUI features selection +// ---------------------------------------------------------------------------- + +// Set wxUSE_LONGLONG to 1 to compile the wxLongLong class. This is a 64 bit +// integer which is implemented in terms of native 64 bit integers if any or +// uses emulation otherwise. +// +// This class is required by wxDateTime and so you should enable it if you want +// to use wxDateTime. For most modern platforms, it will use the native 64 bit +// integers in which case (almost) all of its functions are inline and it +// almost does not take any space, so there should be no reason to switch it +// off. +// +// Recommended setting: 1 +#define wxUSE_LONGLONG 1 + +// Set wxUSE_(F)FILE to 1 to compile wx(F)File classes. wxFile uses low level +// POSIX functions for file access, wxFFile uses ANSI C stdio.h functions. +// +// Default is 1 +// +// Recommended setting: 1 (wxFile is highly recommended as it is required by +// i18n code, wxFileConfig and others) +#define wxUSE_FILE 1 +#define wxUSE_FFILE 1 + +// Use wxFSVolume class providing access to the configured/active mount points +// +// Default is 1 +// +// Recommended setting: 1 (but may be safely disabled if you don't use it) +#define wxUSE_FSVOLUME 1 + +// Use wxStandardPaths class which allows to retrieve some standard locations +// in the file system +// +// Default is 1 +// +// Recommended setting: 1 (may be disabled to save space, but not much) +#define wxUSE_STDPATHS 1 + +// use wxTextBuffer class: required by wxTextFile +#define wxUSE_TEXTBUFFER 1 + +// use wxTextFile class: requires wxFile and wxTextBuffer, required by +// wxFileConfig +#define wxUSE_TEXTFILE 1 + +// i18n support: _() macro, wxLocale class. Requires wxTextFile. +#define wxUSE_INTL 1 + +// Set wxUSE_DATETIME to 1 to compile the wxDateTime and related classes which +// allow to manipulate dates, times and time intervals. wxDateTime replaces the +// old wxTime and wxDate classes which are still provided for backwards +// compatibility (and implemented in terms of wxDateTime). +// +// Note that this class is relatively new and is still officially in alpha +// stage because some features are not yet (fully) implemented. It is already +// quite useful though and should only be disabled if you are aiming at +// absolutely minimal version of the library. +// +// Requires: wxUSE_LONGLONG +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_DATETIME 1 + +// Set wxUSE_TIMER to 1 to compile wxTimer class +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_TIMER 1 + +// Use wxStopWatch clas. +// +// Default is 1 +// +// Recommended setting: 1 (needed by wxSocket) +#define wxUSE_STOPWATCH 1 + +// Setting wxUSE_CONFIG to 1 enables the use of wxConfig and related classes +// which allow the application to store its settings in the persistent +// storage. Setting this to 1 will also enable on-demand creation of the +// global config object in wxApp. +// +// See also wxUSE_CONFIG_NATIVE below. +// +// Recommended setting: 1 +#define wxUSE_CONFIG 1 + +// If wxUSE_CONFIG is 1, you may choose to use either the native config +// classes under Windows (using .INI files under Win16 and the registry under +// Win32) or the portable text file format used by the config classes under +// Unix. +// +// Default is 1 to use native classes. Note that you may still use +// wxFileConfig even if you set this to 1 - just the config object created by +// default for the applications needs will be a wxRegConfig or wxIniConfig and +// not wxFileConfig. +// +// Recommended setting: 1 +#define wxUSE_CONFIG_NATIVE 1 + +// If wxUSE_DIALUP_MANAGER is 1, compile in wxDialUpManager class which allows +// to connect/disconnect from the network and be notified whenever the dial-up +// network connection is established/terminated. Requires wxUSE_DYNAMIC_LOADER. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_DIALUP_MANAGER 1 + +// Compile in classes for run-time DLL loading and function calling. +// Required by wxUSE_DIALUP_MANAGER. +// +// This setting is for Win32 only +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_DYNLIB_CLASS 1 + +// experimental, don't use for now +#define wxUSE_DYNAMIC_LOADER 1 + +// Set to 1 to use socket classes +#define wxUSE_SOCKETS 1 + +// Set to 1 to enable virtual file systems (required by wxHTML) +#define wxUSE_FILESYSTEM 1 + +// Set to 1 to enable virtual ZIP filesystem (requires wxUSE_FILESYSTEM) +#define wxUSE_FS_ZIP 1 + +// Set to 1 to enable virtual archive filesystem (requires wxUSE_FILESYSTEM) +#define wxUSE_FS_ARCHIVE 1 + +// Set to 1 to enable virtual Internet filesystem (requires wxUSE_FILESYSTEM) +#define wxUSE_FS_INET 1 + +// wxArchive classes for accessing archives such as zip and tar +#define wxUSE_ARCHIVE_STREAMS 1 + +// Set to 1 to compile wxZipInput/OutputStream classes. +#define wxUSE_ZIPSTREAM 1 + +// Set to 1 to compile wxTarInput/OutputStream classes. +#define wxUSE_TARSTREAM 1 + +// Set to 1 to compile wxZlibInput/OutputStream classes. Also required by +// wxUSE_LIBPNG +#define wxUSE_ZLIB 1 + +// If enabled, the code written by Apple will be used to write, in a portable +// way, float on the disk. See extended.c for the license which is different +// from wxWidgets one. +// +// Default is 1. +// +// Recommended setting: 1 unless you don't like the license terms (unlikely) +#define wxUSE_APPLE_IEEE 1 + +// Joystick support class +#define wxUSE_JOYSTICK 1 + +// wxFontMapper class +#define wxUSE_FONTMAP 1 + +// wxMimeTypesManager class +#define wxUSE_MIMETYPE 1 + +// wxProtocol and related classes: if you want to use either of wxFTP, wxHTTP +// or wxURL you need to set this to 1. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_PROTOCOL 1 + +// The settings for the individual URL schemes +#define wxUSE_PROTOCOL_FILE 1 +#define wxUSE_PROTOCOL_FTP 1 +#define wxUSE_PROTOCOL_HTTP 1 + +// Define this to use wxURL class. +#define wxUSE_URL 1 + +// Define this to use native platform url and protocol support. +// Currently valid only for MS-Windows. +// Note: if you set this to 1, you can open ftp/http/gopher sites +// and obtain a valid input stream for these sites +// even when you set wxUSE_PROTOCOL_FTP/HTTP to 0. +// Doing so reduces the code size. +// +// This code is experimental and subject to change. +#define wxUSE_URL_NATIVE 0 + +// Support for wxVariant class used in several places throughout the library, +// notably in wxDataViewCtrl API. +// +// Default is 1. +// +// Recommended setting: 1 unless you want to reduce the library size as much as +// possible in which case setting this to 0 can gain up to 100KB. +#define wxUSE_VARIANT 1 + +// Support for regular expression matching via wxRegEx class: enable this to +// use POSIX regular expressions in your code. You need to compile regex +// library from src/regex to use it under Windows. +// +// Default is 0 +// +// Recommended setting: 1 if your compiler supports it, if it doesn't please +// contribute us a makefile for src/regex for it +#define wxUSE_REGEX 1 + +// wxSystemOptions class +#define wxUSE_SYSTEM_OPTIONS 1 + +// wxSound class +#define wxUSE_SOUND 1 + +// Use wxMediaCtrl +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_MEDIACTRL 1 + +// Use GStreamer for Unix (req a lot of dependancies) +// +// Default is 0 +// +// Recommended setting: 1 (wxMediaCtrl won't work by default without it) +#define wxUSE_GSTREAMER 0 + +// Use wxWidget's XRC XML-based resource system. Recommended. +// +// Default is 1 +// +// Recommended setting: 1 (requires wxUSE_XML) +#define wxUSE_XRC 1 + +// XML parsing classes. Note that their API will change in the future, so +// using wxXmlDocument and wxXmlNode in your app is not recommended. +// +// Default is the same as wxUSE_XRC, i.e. 1 by default. +// +// Recommended setting: 1 (required by XRC) +#define wxUSE_XML wxUSE_XRC + +// Use wxWidget's AUI docking system +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_AUI 1 + + +// Enable the new wxGraphicsPath and wxGraphicsContext classes for an advanced +// 2D drawing API. (Still somewhat experimental) +// +// Please note that on Windows you will need to link with gdiplus.lib (use +// USE_GDIPLUS=1 for makefile builds) and distribute gdiplus.dll with your +// application if you want it to be runnable on pre-XP systems. +// +// Default is 0 +// +// Recommended setting: 1 +#ifndef wxUSE_GRAPHICS_CONTEXT +#define wxUSE_GRAPHICS_CONTEXT 0 +#endif + +// ---------------------------------------------------------------------------- +// Individual GUI controls +// ---------------------------------------------------------------------------- + +// You must set wxUSE_CONTROLS to 1 if you are using any controls at all +// (without it, wxControl class is not compiled) +// +// Default is 1 +// +// Recommended setting: 1 (don't change except for very special programs) +#define wxUSE_CONTROLS 1 + +// wxPopupWindow class is a top level transient window. It is currently used +// to implement wxTipWindow +// +// Default is 1 +// +// Recommended setting: 1 (may be set to 0 if you don't wxUSE_TIPWINDOW) +#define wxUSE_POPUPWIN 1 + +// wxTipWindow allows to implement the custom tooltips, it is used by the +// context help classes. Requires wxUSE_POPUPWIN. +// +// Default is 1 +// +// Recommended setting: 1 (may be set to 0) +#define wxUSE_TIPWINDOW 1 + +// Each of the settings below corresponds to one wxWidgets control. They are +// all switched on by default but may be disabled if you are sure that your +// program (including any standard dialogs it can show!) doesn't need them and +// if you desperately want to save some space. If you use any of these you must +// set wxUSE_CONTROLS as well. +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_ANIMATIONCTRL 1 // wxAnimationCtrl +#define wxUSE_BUTTON 1 // wxButton +#define wxUSE_BMPBUTTON 1 // wxBitmapButton +#define wxUSE_CALENDARCTRL 1 // wxCalendarCtrl +#define wxUSE_CHECKBOX 1 // wxCheckBox +#define wxUSE_CHECKLISTBOX 1 // wxCheckListBox (requires wxUSE_OWNER_DRAWN) +#define wxUSE_CHOICE 1 // wxChoice +#define wxUSE_COLLPANE 1 // wxCollapsiblePane +#define wxUSE_COLOURPICKERCTRL 1 // wxColourPickerCtrl +#define wxUSE_COMBOBOX 1 // wxComboBox +#define wxUSE_DATAVIEWCTRL 1 // wxDataViewCtrl +#define wxUSE_DATEPICKCTRL 1 // wxDatePickerCtrl +#define wxUSE_DIRPICKERCTRL 1 // wxDirPickerCtrl +#define wxUSE_FILEPICKERCTRL 1 // wxFilePickerCtrl +#define wxUSE_FONTPICKERCTRL 1 // wxFontPickerCtrl +#define wxUSE_GAUGE 1 // wxGauge +#define wxUSE_HYPERLINKCTRL 1 // wxHyperlinkCtrl +#define wxUSE_LISTBOX 1 // wxListBox +#define wxUSE_LISTCTRL 1 // wxListCtrl +#define wxUSE_RADIOBOX 1 // wxRadioBox +#define wxUSE_RADIOBTN 1 // wxRadioButton +#define wxUSE_SCROLLBAR 1 // wxScrollBar +#define wxUSE_SEARCHCTRL 1 // wxSearchCtrl +#define wxUSE_SLIDER 1 // wxSlider +#define wxUSE_SPINBTN 1 // wxSpinButton +#define wxUSE_SPINCTRL 1 // wxSpinCtrl +#define wxUSE_STATBOX 1 // wxStaticBox +#define wxUSE_STATLINE 1 // wxStaticLine +#define wxUSE_STATTEXT 1 // wxStaticText +#define wxUSE_STATBMP 1 // wxStaticBitmap +#define wxUSE_TEXTCTRL 1 // wxTextCtrl +#define wxUSE_TOGGLEBTN 1 // requires wxButton +#define wxUSE_TREECTRL 1 // wxTreeCtrl + +// Use a status bar class? Depending on the value of wxUSE_NATIVE_STATUSBAR +// below either wxStatusBar95 or a generic wxStatusBar will be used. +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_STATUSBAR 1 + +// Two status bar implementations are available under Win32: the generic one +// or the wrapper around native control. For native look and feel the native +// version should be used. +// +// Default is 1 for the platforms where native status bar is supported. +// +// Recommended setting: 1 (there is no advantage in using the generic one) +#define wxUSE_NATIVE_STATUSBAR 1 + +// wxToolBar related settings: if wxUSE_TOOLBAR is 0, don't compile any toolbar +// classes at all. Otherwise, use the native toolbar class unless +// wxUSE_TOOLBAR_NATIVE is 0. +// +// Default is 1 for all settings. +// +// Recommended setting: 1 for wxUSE_TOOLBAR and wxUSE_TOOLBAR_NATIVE. +#define wxUSE_TOOLBAR 1 +#define wxUSE_TOOLBAR_NATIVE 1 + +// wxNotebook is a control with several "tabs" located on one of its sides. It +// may be used to logically organise the data presented to the user instead of +// putting everything in one huge dialog. It replaces wxTabControl and related +// classes of wxWin 1.6x. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_NOTEBOOK 1 + +// wxListbook control is similar to wxNotebook but uses wxListCtrl instead of +// the tabs +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_LISTBOOK 1 + +// wxChoicebook control is similar to wxNotebook but uses wxChoice instead of +// the tabs +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_CHOICEBOOK 1 + +// wxTreebook control is similar to wxNotebook but uses wxTreeCtrl instead of +// the tabs +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_TREEBOOK 1 + +// wxToolbook control is similar to wxNotebook but uses wxToolBar instead of +// tabs +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_TOOLBOOK 1 + +// wxTabDialog is a generic version of wxNotebook but it is incompatible with +// the new class. It shouldn't be used in new code. +// +// Default is 0. +// +// Recommended setting: 0 (use wxNotebook) +#define wxUSE_TAB_DIALOG 0 + +// wxGrid class +// +// Default is 1, set to 0 to cut down compilation time and binaries size if you +// don't use it. +// +// Recommended setting: 1 +// +#define wxUSE_GRID 1 + +// wxMiniFrame class: a frame with narrow title bar +// +// Default is 1. +// +// Recommended setting: 1 (it doesn't cost almost anything) +#define wxUSE_MINIFRAME 1 + +// wxComboCtrl and related classes: combobox with custom popup window and +// not necessarily a listbox. +// +// Default is 1. +// +// Recommended setting: 1 but can be safely set to 0 except for wxUniv where it +// it used by wxComboBox +#define wxUSE_COMBOCTRL 1 + +// wxOwnerDrawnComboBox is a custom combobox allowing to paint the combobox +// items. +// +// Default is 1. +// +// Recommended setting: 1 but can be safely set to 0, except where it is +// needed as a base class for generic wxBitmapComboBox. +#define wxUSE_ODCOMBOBOX 1 + +// wxBitmapComboBox is a combobox that can have images in front of text items. +// +// Default is 1. +// +// Recommended setting: 1 but can be safely set to 0 +#define wxUSE_BITMAPCOMBOBOX 1 + +// ---------------------------------------------------------------------------- +// Miscellaneous GUI stuff +// ---------------------------------------------------------------------------- + +// wxAcceleratorTable/Entry classes and support for them in wxMenu(Bar) +#define wxUSE_ACCEL 1 + +// Hotkey support (currently Windows only) +#define wxUSE_HOTKEY 1 + +// Use wxCaret: a class implementing a "cursor" in a text control (called caret +// under Windows). +// +// Default is 1. +// +// Recommended setting: 1 (can be safely set to 0, not used by the library) +#define wxUSE_CARET 1 + +// Use wxDisplay class: it allows enumerating all displays on a system and +// their geometries as well as finding the display on which the given point or +// window lies. +// +// Default is 1. +// +// Recommended setting: 1 if you need it, can be safely set to 0 otherwise +#define wxUSE_DISPLAY 1 + +// Miscellaneous geometry code: needed for Canvas library +#define wxUSE_GEOMETRY 1 + +// Use wxImageList. This class is needed by wxNotebook, wxTreeCtrl and +// wxListCtrl. +// +// Default is 1. +// +// Recommended setting: 1 (set it to 0 if you don't use any of the controls +// enumerated above, then this class is mostly useless too) +#define wxUSE_IMAGLIST 1 + +// Use wxMenu, wxMenuBar, wxMenuItem. +// +// Default is 1. +// +// Recommended setting: 1 (can't be disabled under MSW) +#define wxUSE_MENUS 1 + +// Use wxSashWindow class. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_SASH 1 + +// Use wxSplitterWindow class. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_SPLITTER 1 + +// Use wxToolTip and wxWindow::Set/GetToolTip() methods. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_TOOLTIPS 1 + +// wxValidator class and related methods +#define wxUSE_VALIDATORS 1 + +// ---------------------------------------------------------------------------- +// common dialogs +// ---------------------------------------------------------------------------- + +// On rare occasions (e.g. using DJGPP) may want to omit common dialogs (e.g. +// file selector, printer dialog). Switching this off also switches off the +// printing architecture and interactive wxPrinterDC. +// +// Default is 1 +// +// Recommended setting: 1 (unless it really doesn't work) +#define wxUSE_COMMON_DIALOGS 1 + +// wxBusyInfo displays window with message when app is busy. Works in same way +// as wxBusyCursor +#define wxUSE_BUSYINFO 1 + +// Use single/multiple choice dialogs. +// +// Default is 1 +// +// Recommended setting: 1 (used in the library itself) +#define wxUSE_CHOICEDLG 1 + +// Use colour picker dialog +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_COLOURDLG 1 + +// wxDirDlg class for getting a directory name from user +#define wxUSE_DIRDLG 1 + +// TODO: setting to choose the generic or native one + +// Use file open/save dialogs. +// +// Default is 1 +// +// Recommended setting: 1 (used in many places in the library itself) +#define wxUSE_FILEDLG 1 + +// Use find/replace dialogs. +// +// Default is 1 +// +// Recommended setting: 1 (but may be safely set to 0) +#define wxUSE_FINDREPLDLG 1 + +// Use font picker dialog +// +// Default is 1 +// +// Recommended setting: 1 (used in the library itself) +#define wxUSE_FONTDLG 1 + +// Use wxMessageDialog and wxMessageBox. +// +// Default is 1 +// +// Recommended setting: 1 (used in the library itself) +#define wxUSE_MSGDLG 1 + +// progress dialog class for lengthy operations +#define wxUSE_PROGRESSDLG 1 + +// support for startup tips (wxShowTip &c) +#define wxUSE_STARTUP_TIPS 1 + +// text entry dialog and wxGetTextFromUser function +#define wxUSE_TEXTDLG 1 + +// number entry dialog +#define wxUSE_NUMBERDLG 1 + +// splash screen class +#define wxUSE_SPLASH 1 + +// wizards +#define wxUSE_WIZARDDLG 1 + +// Compile in wxAboutBox() function showing the standard "About" dialog. +// +// Default is 1 +// +// Recommended setting: 1 but can be set to 0 to save some space if you don't +// use this function +#define wxUSE_ABOUTDLG 1 + +// ---------------------------------------------------------------------------- +// Metafiles support +// ---------------------------------------------------------------------------- + +// Windows supports the graphics format known as metafile which is, though not +// portable, is widely used under Windows and so is supported by wxWin (under +// Windows only, of course). Win16 (Win3.1) used the so-called "Window +// MetaFiles" or WMFs which were replaced with "Enhanced MetaFiles" or EMFs in +// Win32 (Win9x, NT, 2000). Both of these are supported in wxWin and, by +// default, WMFs will be used under Win16 and EMFs under Win32. This may be +// changed by setting wxUSE_WIN_METAFILES_ALWAYS to 1 and/or setting +// wxUSE_ENH_METAFILE to 0. You may also set wxUSE_METAFILE to 0 to not compile +// in any metafile related classes at all. +// +// Default is 1 for wxUSE_ENH_METAFILE and 0 for wxUSE_WIN_METAFILES_ALWAYS. +// +// Recommended setting: default or 0 for everything for portable programs. +#define wxUSE_METAFILE 1 +#define wxUSE_ENH_METAFILE 1 +#define wxUSE_WIN_METAFILES_ALWAYS 0 + +// ---------------------------------------------------------------------------- +// Big GUI components +// ---------------------------------------------------------------------------- + +// Set to 0 to disable MDI support. +// +// Requires wxUSE_NOTEBOOK under platforms other than MSW. +// +// Default is 1. +// +// Recommended setting: 1, can be safely set to 0. +#define wxUSE_MDI 1 + +// Set to 0 to disable document/view architecture +#define wxUSE_DOC_VIEW_ARCHITECTURE 1 + +// Set to 0 to disable MDI document/view architecture +// +// Requires wxUSE_MDI && wxUSE_DOC_VIEW_ARCHITECTURE +#define wxUSE_MDI_ARCHITECTURE 1 + +// Set to 0 to disable print/preview architecture code +#define wxUSE_PRINTING_ARCHITECTURE 1 + +// wxHTML sublibrary allows to display HTML in wxWindow programs and much, +// much more. +// +// Default is 1. +// +// Recommended setting: 1 (wxHTML is great!), set to 0 if you want compile a +// smaller library. +#define wxUSE_HTML 1 + +// Setting wxUSE_GLCANVAS to 1 enables OpenGL support. You need to have OpenGL +// headers and libraries to be able to compile the library with wxUSE_GLCANVAS +// set to 1. Note that for some compilers (notably Microsoft Visual C++) you +// will need to manually add opengl32.lib and glu32.lib to the list of +// libraries linked with your program if you use OpenGL. +// +// Default is 0. +// +// Recommended setting: 1 if you intend to use OpenGL, 0 otherwise +#define wxUSE_GLCANVAS 0 + +// wxRichTextCtrl allows editing of styled text. +// +// Default is 1. +// +// Recommended setting: 1, set to 0 if you want compile a +// smaller library. +#define wxUSE_RICHTEXT 1 + +// ---------------------------------------------------------------------------- +// Data transfer +// ---------------------------------------------------------------------------- + +// Use wxClipboard class for clipboard copy/paste. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_CLIPBOARD 1 + +// Use wxDataObject and related classes. Needed for clipboard and OLE drag and +// drop +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_DATAOBJ 1 + +// Use wxDropTarget and wxDropSource classes for drag and drop (this is +// different from "built in" drag and drop in wxTreeCtrl which is always +// available). Requires wxUSE_DATAOBJ. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_DRAG_AND_DROP 1 + +// Use wxAccessible for enhanced and customisable accessibility. +// Depends on wxUSE_OLE. +// +// Default is 0. +// +// Recommended setting (at present): 0 +#define wxUSE_ACCESSIBILITY 0 + +// ---------------------------------------------------------------------------- +// miscellaneous settings +// ---------------------------------------------------------------------------- + +// wxSingleInstanceChecker class allows to verify at startup if another program +// instance is running (it is only available under Win32) +// +// Default is 1 +// +// Recommended setting: 1 (the class is tiny, disabling it won't save much +// space) +#define wxUSE_SNGLINST_CHECKER 1 + +#define wxUSE_DRAGIMAGE 1 + +#define wxUSE_IPC 1 + // 0 for no interprocess comms +#define wxUSE_HELP 1 + // 0 for no help facility + +// Should we use MS HTML help for wxHelpController? If disabled, neither +// wxCHMHelpController nor wxBestHelpController are available. +// +// Default is 1 under MSW, 0 is always used for the other platforms. +// +// Recommended setting: 1, only set to 0 if you have trouble compiling +// wxCHMHelpController (could be a problem with really ancient compilers) +#define wxUSE_MS_HTML_HELP 1 + + +// Use wxHTML-based help controller? +#define wxUSE_WXHTML_HELP 1 + +#define wxUSE_RESOURCES 0 + // 0 for no wxGetResource/wxWriteResource +#define wxUSE_CONSTRAINTS 1 + // 0 for no window layout constraint system + +#define wxUSE_SPLINES 1 + // 0 for no splines + +#define wxUSE_MOUSEWHEEL 1 + // Include mouse wheel support + +// ---------------------------------------------------------------------------- +// postscript support settings +// ---------------------------------------------------------------------------- + +// Set to 1 for PostScript device context. +#define wxUSE_POSTSCRIPT 0 + +// Set to 1 to use font metric files in GetTextExtent +#define wxUSE_AFM_FOR_POSTSCRIPT 1 + +// ---------------------------------------------------------------------------- +// database classes +// ---------------------------------------------------------------------------- + +// Define 1 to use ODBC classes +#define wxUSE_ODBC 0 + +// For backward compatibility reasons, this parameter now only controls the +// default scrolling method used by cursors. This default behavior can be +// overriden by setting the second param of wxDB::wxDbGetConnection() or +// wxDb() constructor to indicate whether the connection (and any wxDbTable()s +// that use the connection) should support forward only scrolling of cursors, +// or both forward and backward support for backward scrolling cursors is +// dependent on the data source as well as the ODBC driver being used. +#define wxODBC_FWD_ONLY_CURSORS 1 + +// Default is 0. Set to 1 to use the deprecated classes, enum types, function, +// member variables. With a setting of 1, full backward compatibility with the +// 2.0.x release is possible. It is STRONGLY recommended that this be set to 0, +// as future development will be done only on the non-deprecated +// functions/classes/member variables/etc. +#define wxODBC_BACKWARD_COMPATABILITY 0 + +// ---------------------------------------------------------------------------- +// other compiler (mis)features +// ---------------------------------------------------------------------------- + +// Set this to 0 if your compiler can't cope with omission of prototype +// parameters. +// +// Default is 1. +// +// Recommended setting: 1 (should never need to set this to 0) +#define REMOVE_UNUSED_ARG 1 + +// VC++ 4.2 and above allows <iostream> and <iostream.h> but you can't mix +// them. Set to 1 for <iostream.h>, 0 for <iostream>. Note that VC++ 7.1 +// and later doesn't support wxUSE_IOSTREAMH == 1 and so <iostream> will be +// used anyhow. +// +// Default is 1. +// +// Recommended setting: whatever your compiler likes more +#define wxUSE_IOSTREAMH 1 + +// ---------------------------------------------------------------------------- +// image format support +// ---------------------------------------------------------------------------- + +// wxImage supports many different image formats which can be configured at +// compile-time. BMP is always supported, others are optional and can be safely +// disabled if you don't plan to use images in such format sometimes saving +// substantial amount of code in the final library. +// +// Some formats require an extra library which is included in wxWin sources +// which is mentioned if it is the case. + +// Set to 1 for wxImage support (recommended). +#define wxUSE_IMAGE 1 + +// Set to 1 for PNG format support (requires libpng). Also requires wxUSE_ZLIB. +#define wxUSE_LIBPNG 1 + +// Set to 1 for JPEG format support (requires libjpeg) +#define wxUSE_LIBJPEG 1 + +// Set to 1 for TIFF format support (requires libtiff) +#define wxUSE_LIBTIFF 1 + +// Set to 1 for TGA format support (loading only) +#define wxUSE_TGA 1 + +// Set to 1 for GIF format support +#define wxUSE_GIF 1 + +// Set to 1 for PNM format support +#define wxUSE_PNM 1 + +// Set to 1 for PCX format support +#define wxUSE_PCX 1 + +// Set to 1 for IFF format support (Amiga format) +#define wxUSE_IFF 0 + +// Set to 1 for XPM format support +#define wxUSE_XPM 1 + +// Set to 1 for MS Icons and Cursors format support +#define wxUSE_ICO_CUR 1 + +// Set to 1 to compile in wxPalette class +#define wxUSE_PALETTE 1 + +// ---------------------------------------------------------------------------- +// wxUniversal-only options +// ---------------------------------------------------------------------------- + +// Set to 1 to enable compilation of all themes, this is the default +#define wxUSE_ALL_THEMES 1 + +// Set to 1 to enable the compilation of individual theme if wxUSE_ALL_THEMES +// is unset, if it is set these options are not used; notice that metal theme +// uses Win32 one +#define wxUSE_THEME_GTK 0 +#define wxUSE_THEME_METAL 0 +#define wxUSE_THEME_MONO 0 +#define wxUSE_THEME_WIN32 0 + + diff --git a/Externals/wxWidgets/include/wx/setup_redirect.h b/Externals/wxWidgets/include/wx/setup_redirect.h new file mode 100644 index 0000000000..5d7be0fcbc --- /dev/null +++ b/Externals/wxWidgets/include/wx/setup_redirect.h @@ -0,0 +1,18 @@ +/* + * wx/setup.h + * + * This file should not normally be used, except where makefiles + * have not yet been adjusted to take into account of the new scheme + * whereby a setup.h is created under the lib directory. + * + * Copyright: (c) Vadim Zeitlin + * RCS-ID: $Id: setup_redirect.h 33948 2005-05-04 18:57:50Z JS $ + * Licence: wxWindows Licence + */ + +#ifdef __WXMSW__ +#include "wx/msw/setup.h" +#else +#error Please adjust your include path to pick up the wx/setup.h file under lib first. +#endif + diff --git a/Externals/wxWidgets/include/wx/sizer.h b/Externals/wxWidgets/include/wx/sizer.h new file mode 100644 index 0000000000..3cb78b9c1e --- /dev/null +++ b/Externals/wxWidgets/include/wx/sizer.h @@ -0,0 +1,1073 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/sizer.h +// Purpose: provide wxSizer class for layout +// Author: Robert Roebling and Robin Dunn +// Modified by: Ron Lee, Vadim Zeitlin (wxSizerFlags) +// Created: +// RCS-ID: $Id: sizer.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) Robin Dunn, Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef __WXSIZER_H__ +#define __WXSIZER_H__ + +#include "wx/defs.h" + +#include "wx/window.h" + +//--------------------------------------------------------------------------- +// classes +//--------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_CORE wxButton; +class WXDLLIMPEXP_FWD_CORE wxBoxSizer; +class WXDLLIMPEXP_FWD_CORE wxSizerItem; +class WXDLLIMPEXP_FWD_CORE wxSizer; + +#ifndef wxUSE_BORDER_BY_DEFAULT + #ifdef __SMARTPHONE__ + // no borders by default on limited size screen + #define wxUSE_BORDER_BY_DEFAULT 0 + #else + #define wxUSE_BORDER_BY_DEFAULT 1 + #endif +#endif + +// ---------------------------------------------------------------------------- +// wxSizerFlags: flags used for an item in the sizer +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxSizerFlags +{ +public: + // construct the flags object initialized with the given proportion (0 by + // default) + wxSizerFlags(int proportion = 0) : m_proportion(proportion) + { + m_flags = 0; + m_borderInPixels = 0; + } + + // setters for all sizer flags, they all return the object itself so that + // calls to them can be chained + + wxSizerFlags& Proportion(int proportion) + { + m_proportion = proportion; + return *this; + } + + wxSizerFlags& Align(int alignment) // combination of wxAlignment values + { + m_flags &= ~wxALIGN_MASK; + m_flags |= alignment; + + return *this; + } + + wxSizerFlags& Expand() + { + m_flags |= wxEXPAND; + return *this; + } + + // some shortcuts for Align() + wxSizerFlags& Centre() { return Align(wxCENTRE); } + wxSizerFlags& Center() { return Centre(); } + wxSizerFlags& Left() { return Align(wxALIGN_LEFT); } + wxSizerFlags& Right() { return Align(wxALIGN_RIGHT); } + +#if wxABI_VERSION >= 20802 + wxSizerFlags& Top() { return Align(wxALIGN_TOP); } + wxSizerFlags& Bottom() { return Align(wxALIGN_BOTTOM); } +#endif // wxABI 2.8.2+ + + // default border size used by Border() below + static int GetDefaultBorder() + { +#if wxUSE_BORDER_BY_DEFAULT + // FIXME: default border size shouldn't be hardcoded and at the very + // least they should depend on the current font size + return 5; +#else + return 0; +#endif + } + + + wxSizerFlags& Border(int direction, int borderInPixels) + { + m_flags &= ~wxALL; + m_flags |= direction; + + m_borderInPixels = borderInPixels; + + return *this; + } + + wxSizerFlags& Border(int direction = wxALL) + { +#if wxUSE_BORDER_BY_DEFAULT + return Border(direction, GetDefaultBorder()); +#else + // no borders by default on limited size screen + wxUnusedVar(direction); + + return *this; +#endif + } + + wxSizerFlags& DoubleBorder(int direction = wxALL) + { +#if wxUSE_BORDER_BY_DEFAULT + return Border(direction, 2*GetDefaultBorder()); +#else + wxUnusedVar(direction); + + return *this; +#endif + } + + wxSizerFlags& TripleBorder(int direction = wxALL) + { +#if wxUSE_BORDER_BY_DEFAULT + return Border(direction, 3*GetDefaultBorder()); +#else + wxUnusedVar(direction); + + return *this; +#endif + } + + wxSizerFlags& HorzBorder() + { +#if wxUSE_BORDER_BY_DEFAULT + return Border(wxLEFT | wxRIGHT, GetDefaultBorder()); +#else + return *this; +#endif + } + + wxSizerFlags& DoubleHorzBorder() + { +#if wxUSE_BORDER_BY_DEFAULT + return Border(wxLEFT | wxRIGHT, 2*GetDefaultBorder()); +#else + return *this; +#endif + } + +#if wxABI_VERSION >= 20802 + // setters for the others flags + wxSizerFlags& Shaped() + { + m_flags |= wxSHAPED; + + return *this; + } + + wxSizerFlags& FixedMinSize() + { + m_flags |= wxFIXED_MINSIZE; + + return *this; + } +#endif // wx 2.8.2+ + + // accessors for wxSizer only + int GetProportion() const { return m_proportion; } + int GetFlags() const { return m_flags; } + int GetBorderInPixels() const { return m_borderInPixels; } + +private: + int m_proportion; + int m_flags; + int m_borderInPixels; +}; + + +// ---------------------------------------------------------------------------- +// wxSizerSpacer: used by wxSizerItem to represent a spacer +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxSizerSpacer +{ +public: + wxSizerSpacer(const wxSize& size) : m_size(size), m_isShown(true) { } + + void SetSize(const wxSize& size) { m_size = size; } + const wxSize& GetSize() const { return m_size; } + + void Show(bool show) { m_isShown = show; } + bool IsShown() const { return m_isShown; } + +private: + // the size, in pixel + wxSize m_size; + + // is the spacer currently shown? + bool m_isShown; +}; + +// ---------------------------------------------------------------------------- +// wxSizerItem +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxSizerItem : public wxObject +{ +public: + // window + wxSizerItem( wxWindow *window, + int proportion, + int flag, + int border, + wxObject* userData ); + + // window with flags + wxSizerItem(wxWindow *window, const wxSizerFlags& flags) + { + Init(flags); + + SetWindow(window); + } + + // subsizer + wxSizerItem( wxSizer *sizer, + int proportion, + int flag, + int border, + wxObject* userData ); + + // sizer with flags + wxSizerItem(wxSizer *sizer, const wxSizerFlags& flags) + { + Init(flags); + + SetSizer(sizer); + } + + // spacer + wxSizerItem( int width, + int height, + int proportion, + int flag, + int border, + wxObject* userData); + + // spacer with flags + wxSizerItem(int width, int height, const wxSizerFlags& flags) + { + Init(flags); + + SetSpacer(width, height); + } + + wxSizerItem(); + virtual ~wxSizerItem(); + + virtual void DeleteWindows(); + + // Enable deleting the SizerItem without destroying the contained sizer. + void DetachSizer() { m_sizer = NULL; } + + virtual wxSize GetSize() const; + virtual wxSize CalcMin(); + virtual void SetDimension( const wxPoint& pos, const wxSize& size ); + + wxSize GetMinSize() const + { return m_minSize; } + wxSize GetMinSizeWithBorder() const; + + void SetMinSize(const wxSize& size) + { + if ( IsWindow() ) + m_window->SetMinSize(size); + m_minSize = size; + } + void SetMinSize( int x, int y ) + { SetMinSize(wxSize(x, y)); } + void SetInitSize( int x, int y ) + { SetMinSize(wxSize(x, y)); } + + // if either of dimensions is zero, ratio is assumed to be 1 + // to avoid "divide by zero" errors + void SetRatio(int width, int height) + { m_ratio = (width && height) ? ((float) width / (float) height) : 1; } + void SetRatio(const wxSize& size) + { SetRatio(size.x, size.y); } + void SetRatio(float ratio) + { m_ratio = ratio; } + float GetRatio() const + { return m_ratio; } + + virtual wxRect GetRect() { return m_rect; } + + bool IsWindow() const { return m_kind == Item_Window; } + bool IsSizer() const { return m_kind == Item_Sizer; } + bool IsSpacer() const { return m_kind == Item_Spacer; } + +#if WXWIN_COMPATIBILITY_2_6 + // Deprecated in 2.6, use {G,S}etProportion instead. + wxDEPRECATED( void SetOption( int option ) ); + wxDEPRECATED( int GetOption() const ); +#endif // WXWIN_COMPATIBILITY_2_6 + + void SetProportion( int proportion ) + { m_proportion = proportion; } + int GetProportion() const + { return m_proportion; } + void SetFlag( int flag ) + { m_flag = flag; } + int GetFlag() const + { return m_flag; } + void SetBorder( int border ) + { m_border = border; } + int GetBorder() const + { return m_border; } + + wxWindow *GetWindow() const + { return m_kind == Item_Window ? m_window : NULL; } + wxSizer *GetSizer() const + { return m_kind == Item_Sizer ? m_sizer : NULL; } + wxSize GetSpacer() const; + + // this function behaves obviously for the windows and spacers but for the + // sizers it returns true if any sizer element is shown and only returns + // false if all of them are hidden + bool IsShown() const; + void Show(bool show); + + void SetUserData(wxObject* userData) + { delete m_userData; m_userData = userData; } + wxObject* GetUserData() const + { return m_userData; } + wxPoint GetPosition() const + { return m_pos; } + + + // these functions do not free old sizer/spacer + void SetWindow(wxWindow *window); + void SetSizer(wxSizer *sizer); + void SetSpacer(const wxSize& size); + void SetSpacer(int width, int height) { SetSpacer(wxSize(width, height)); } + +protected: + // common part of several ctors + void Init() { m_userData = NULL; } + + // common part of ctors taking wxSizerFlags + void Init(const wxSizerFlags& flags); + + + // discriminated union: depending on m_kind one of the fields is valid + enum + { + Item_None, + Item_Window, + Item_Sizer, + Item_Spacer, + Item_Max + } m_kind; + union + { + wxWindow *m_window; + wxSizer *m_sizer; + wxSizerSpacer *m_spacer; + }; + + wxPoint m_pos; + wxSize m_minSize; + int m_proportion; + int m_border; + int m_flag; + + // on screen rectangle of this item (not including borders) + wxRect m_rect; + + // Aspect ratio can always be calculated from m_size, + // but this would cause precision loss when the window + // is shrunk. It is safer to preserve the initial value. + float m_ratio; + + wxObject *m_userData; + +private: + DECLARE_CLASS(wxSizerItem) + DECLARE_NO_COPY_CLASS(wxSizerItem) +}; + +WX_DECLARE_EXPORTED_LIST( wxSizerItem, wxSizerItemList ); + + +//--------------------------------------------------------------------------- +// wxSizer +//--------------------------------------------------------------------------- + +class WXDLLEXPORT wxSizer: public wxObject, public wxClientDataContainer +{ +public: + wxSizer() { m_containingWindow = NULL; } + virtual ~wxSizer(); + + // methods for adding elements to the sizer: there are Add/Insert/Prepend + // overloads for each of window/sizer/spacer/wxSizerItem + wxSizerItem* Add(wxWindow *window, + int proportion = 0, + int flag = 0, + int border = 0, + wxObject* userData = NULL); + wxSizerItem* Add(wxSizer *sizer, + int proportion = 0, + int flag = 0, + int border = 0, + wxObject* userData = NULL); + wxSizerItem* Add(int width, + int height, + int proportion = 0, + int flag = 0, + int border = 0, + wxObject* userData = NULL); + wxSizerItem* Add( wxWindow *window, const wxSizerFlags& flags); + wxSizerItem* Add( wxSizer *sizer, const wxSizerFlags& flags); + wxSizerItem* Add( wxSizerItem *item); + + wxSizerItem* AddSpacer(int size); + wxSizerItem* AddStretchSpacer(int prop = 1); + + wxSizerItem* Insert(size_t index, + wxWindow *window, + int proportion = 0, + int flag = 0, + int border = 0, + wxObject* userData = NULL); + wxSizerItem* Insert(size_t index, + wxSizer *sizer, + int proportion = 0, + int flag = 0, + int border = 0, + wxObject* userData = NULL); + wxSizerItem* Insert(size_t index, + int width, + int height, + int proportion = 0, + int flag = 0, + int border = 0, + wxObject* userData = NULL); + wxSizerItem* Insert(size_t index, + wxWindow *window, + const wxSizerFlags& flags); + wxSizerItem* Insert(size_t index, + wxSizer *sizer, + const wxSizerFlags& flags); + virtual wxSizerItem* Insert( size_t index, wxSizerItem *item); + + wxSizerItem* InsertSpacer(size_t index, int size); + wxSizerItem* InsertStretchSpacer(size_t index, int prop = 1); + + wxSizerItem* Prepend(wxWindow *window, + int proportion = 0, + int flag = 0, + int border = 0, + wxObject* userData = NULL); + wxSizerItem* Prepend(wxSizer *sizer, + int proportion = 0, + int flag = 0, + int border = 0, + wxObject* userData = NULL); + wxSizerItem* Prepend(int width, + int height, + int proportion = 0, + int flag = 0, + int border = 0, + wxObject* userData = NULL); + wxSizerItem* Prepend(wxWindow *window, const wxSizerFlags& flags); + wxSizerItem* Prepend(wxSizer *sizer, const wxSizerFlags& flags); + wxSizerItem* Prepend(wxSizerItem *item); + + wxSizerItem* PrependSpacer(int size); + wxSizerItem* PrependStretchSpacer(int prop = 1); + + // set (or possibly unset if window is NULL) or get the window this sizer + // is used in + void SetContainingWindow(wxWindow *window); + wxWindow *GetContainingWindow() const { return m_containingWindow; } + +#if WXWIN_COMPATIBILITY_2_6 + // Deprecated in 2.6 since historically it does not delete the window, + // use Detach instead. + wxDEPRECATED( virtual bool Remove( wxWindow *window ) ); +#endif // WXWIN_COMPATIBILITY_2_6 + + virtual bool Remove( wxSizer *sizer ); + virtual bool Remove( int index ); + + virtual bool Detach( wxWindow *window ); + virtual bool Detach( wxSizer *sizer ); + virtual bool Detach( int index ); + + virtual bool Replace( wxWindow *oldwin, wxWindow *newwin, bool recursive = false ); + virtual bool Replace( wxSizer *oldsz, wxSizer *newsz, bool recursive = false ); + virtual bool Replace( size_t index, wxSizerItem *newitem ); + + virtual void Clear( bool delete_windows = false ); + virtual void DeleteWindows(); + + void SetMinSize( int width, int height ) + { DoSetMinSize( width, height ); } + void SetMinSize( const wxSize& size ) + { DoSetMinSize( size.x, size.y ); } + + // Searches recursively + bool SetItemMinSize( wxWindow *window, int width, int height ) + { return DoSetItemMinSize( window, width, height ); } + bool SetItemMinSize( wxWindow *window, const wxSize& size ) + { return DoSetItemMinSize( window, size.x, size.y ); } + + // Searches recursively + bool SetItemMinSize( wxSizer *sizer, int width, int height ) + { return DoSetItemMinSize( sizer, width, height ); } + bool SetItemMinSize( wxSizer *sizer, const wxSize& size ) + { return DoSetItemMinSize( sizer, size.x, size.y ); } + + bool SetItemMinSize( size_t index, int width, int height ) + { return DoSetItemMinSize( index, width, height ); } + bool SetItemMinSize( size_t index, const wxSize& size ) + { return DoSetItemMinSize( index, size.x, size.y ); } + + wxSize GetSize() const + { return m_size; } + wxPoint GetPosition() const + { return m_position; } + + // Calculate the minimal size or return m_minSize if bigger. + wxSize GetMinSize(); + + virtual void RecalcSizes() = 0; + virtual wxSize CalcMin() = 0; + + virtual void Layout(); + + wxSize Fit( wxWindow *window ); + void FitInside( wxWindow *window ); + void SetSizeHints( wxWindow *window ); + void SetVirtualSizeHints( wxWindow *window ); + + wxSizerItemList& GetChildren() + { return m_children; } + + void SetDimension( int x, int y, int width, int height ); + + wxSizerItem* GetItem( wxWindow *window, bool recursive = false ); + wxSizerItem* GetItem( wxSizer *sizer, bool recursive = false ); + wxSizerItem* GetItem( size_t index ); + + // Manage whether individual scene items are considered + // in the layout calculations or not. + bool Show( wxWindow *window, bool show = true, bool recursive = false ); + bool Show( wxSizer *sizer, bool show = true, bool recursive = false ); + bool Show( size_t index, bool show = true ); + + bool Hide( wxSizer *sizer, bool recursive = false ) + { return Show( sizer, false, recursive ); } + bool Hide( wxWindow *window, bool recursive = false ) + { return Show( window, false, recursive ); } + bool Hide( size_t index ) + { return Show( index, false ); } + + bool IsShown( wxWindow *window ) const; + bool IsShown( wxSizer *sizer ) const; + bool IsShown( size_t index ) const; + + // Recursively call wxWindow::Show () on all sizer items. + virtual void ShowItems (bool show); + + void Show(bool show) { ShowItems(show); } + +protected: + wxSize m_size; + wxSize m_minSize; + wxPoint m_position; + wxSizerItemList m_children; + + // the window this sizer is used in, can be NULL + wxWindow *m_containingWindow; + + wxSize GetMaxWindowSize( wxWindow *window ) const; + wxSize GetMinWindowSize( wxWindow *window ); + wxSize GetMaxClientSize( wxWindow *window ) const; + wxSize GetMinClientSize( wxWindow *window ); + wxSize VirtualFitSize( wxWindow *window ); + + virtual void DoSetMinSize( int width, int height ); + virtual bool DoSetItemMinSize( wxWindow *window, int width, int height ); + virtual bool DoSetItemMinSize( wxSizer *sizer, int width, int height ); + virtual bool DoSetItemMinSize( size_t index, int width, int height ); + +private: + DECLARE_CLASS(wxSizer) +}; + +//--------------------------------------------------------------------------- +// wxGridSizer +//--------------------------------------------------------------------------- + +class WXDLLEXPORT wxGridSizer: public wxSizer +{ +public: + wxGridSizer( int rows, int cols, int vgap, int hgap ); + wxGridSizer( int cols, int vgap = 0, int hgap = 0 ); + + virtual void RecalcSizes(); + virtual wxSize CalcMin(); + + void SetCols( int cols ) { m_cols = cols; } + void SetRows( int rows ) { m_rows = rows; } + void SetVGap( int gap ) { m_vgap = gap; } + void SetHGap( int gap ) { m_hgap = gap; } + int GetCols() const { return m_cols; } + int GetRows() const { return m_rows; } + int GetVGap() const { return m_vgap; } + int GetHGap() const { return m_hgap; } + +protected: + int m_rows; + int m_cols; + int m_vgap; + int m_hgap; + + // return the number of total items and the number of columns and rows + int CalcRowsCols(int& rows, int& cols) const; + + void SetItemBounds( wxSizerItem *item, int x, int y, int w, int h ); + +private: + DECLARE_CLASS(wxGridSizer) +}; + +//--------------------------------------------------------------------------- +// wxFlexGridSizer +//--------------------------------------------------------------------------- + +// the bevaiour for resizing wxFlexGridSizer cells in the "non-flexible" +// direction +enum wxFlexSizerGrowMode +{ + // don't resize the cells in non-flexible direction at all + wxFLEX_GROWMODE_NONE, + + // uniformly resize only the specified ones (default) + wxFLEX_GROWMODE_SPECIFIED, + + // uniformly resize all cells + wxFLEX_GROWMODE_ALL +}; + +class WXDLLEXPORT wxFlexGridSizer: public wxGridSizer +{ +public: + // ctors/dtor + wxFlexGridSizer( int rows, int cols, int vgap, int hgap ); + wxFlexGridSizer( int cols, int vgap = 0, int hgap = 0 ); + virtual ~wxFlexGridSizer(); + + + // set the rows/columns which will grow (the others will remain of the + // constant initial size) + void AddGrowableRow( size_t idx, int proportion = 0 ); + void RemoveGrowableRow( size_t idx ); + void AddGrowableCol( size_t idx, int proportion = 0 ); + void RemoveGrowableCol( size_t idx ); + + + // the sizer cells may grow in both directions, not grow at all or only + // grow in one direction but not the other + + // the direction may be wxVERTICAL, wxHORIZONTAL or wxBOTH (default) + void SetFlexibleDirection(int direction) { m_flexDirection = direction; } + int GetFlexibleDirection() const { return m_flexDirection; } + + // note that the grow mode only applies to the direction which is not + // flexible + void SetNonFlexibleGrowMode(wxFlexSizerGrowMode mode) { m_growMode = mode; } + wxFlexSizerGrowMode GetNonFlexibleGrowMode() const { return m_growMode; } + + // Read-only access to the row heights and col widths arrays + const wxArrayInt& GetRowHeights() const { return m_rowHeights; } + const wxArrayInt& GetColWidths() const { return m_colWidths; } + + // implementation + virtual void RecalcSizes(); + virtual wxSize CalcMin(); + +protected: + void AdjustForFlexDirection(); + void AdjustForGrowables(const wxSize& sz, const wxSize& minsz, + int nrows, int ncols); + + // the heights/widths of all rows/columns + wxArrayInt m_rowHeights, + m_colWidths; + + // indices of the growable columns and rows + wxArrayInt m_growableRows, + m_growableCols; + + // proportion values of the corresponding growable rows and columns + wxArrayInt m_growableRowsProportions, + m_growableColsProportions; + + // parameters describing whether the growable cells should be resized in + // both directions or only one + int m_flexDirection; + wxFlexSizerGrowMode m_growMode; + + // saves CalcMin result to optimize RecalcSizes + wxSize m_calculatedMinSize; + +private: + DECLARE_CLASS(wxFlexGridSizer) + DECLARE_NO_COPY_CLASS(wxFlexGridSizer) +}; + +//--------------------------------------------------------------------------- +// wxBoxSizer +//--------------------------------------------------------------------------- + +class WXDLLEXPORT wxBoxSizer: public wxSizer +{ +public: + wxBoxSizer( int orient ); + + void RecalcSizes(); + wxSize CalcMin(); + + int GetOrientation() const + { return m_orient; } + + void SetOrientation(int orient) + { m_orient = orient; } + +protected: + int m_orient; + int m_stretchable; + int m_minWidth; + int m_minHeight; + int m_fixedWidth; + int m_fixedHeight; + +private: + DECLARE_CLASS(wxBoxSizer) +}; + +//--------------------------------------------------------------------------- +// wxStaticBoxSizer +//--------------------------------------------------------------------------- + +#if wxUSE_STATBOX + +class WXDLLIMPEXP_FWD_CORE wxStaticBox; + +class WXDLLEXPORT wxStaticBoxSizer: public wxBoxSizer +{ +public: + wxStaticBoxSizer(wxStaticBox *box, int orient); + wxStaticBoxSizer(int orient, wxWindow *win, const wxString& label = wxEmptyString); + virtual ~wxStaticBoxSizer(); + + void RecalcSizes(); + wxSize CalcMin(); + + wxStaticBox *GetStaticBox() const + { return m_staticBox; } + + // override to hide/show the static box as well + virtual void ShowItems (bool show); + + virtual bool Detach( wxWindow *window ); + virtual bool Detach( wxSizer *sizer ) { return wxBoxSizer::Detach(sizer); } + virtual bool Detach( int index ) { return wxBoxSizer::Detach(index); } + +protected: + wxStaticBox *m_staticBox; + +private: + DECLARE_CLASS(wxStaticBoxSizer) + DECLARE_NO_COPY_CLASS(wxStaticBoxSizer) +}; + +#endif // wxUSE_STATBOX + +#if wxUSE_BUTTON + +class WXDLLEXPORT wxStdDialogButtonSizer: public wxBoxSizer +{ +public: + // Constructor just creates a new wxBoxSizer, not much else. + // Box sizer orientation is automatically determined here: + // vertical for PDAs, horizontal for everything else? + wxStdDialogButtonSizer(); + + // Checks button ID against system IDs and sets one of the pointers below + // to this button. Does not do any sizer-related things here. + void AddButton(wxButton *button); + + // Use these if no standard ID can/should be used + void SetAffirmativeButton( wxButton *button ); + void SetNegativeButton( wxButton *button ); + void SetCancelButton( wxButton *button ); + + // All platform-specific code here, checks which buttons exist and add + // them to the sizer accordingly. + // Note - one potential hack on Mac we could use here, + // if m_buttonAffirmative is wxID_SAVE then ensure wxID_SAVE + // is set to _("Save") and m_buttonNegative is set to _("Don't Save") + // I wouldn't add any other hacks like that into here, + // but this one I can see being useful. + void Realize(); + + wxButton *GetAffirmativeButton() const { return m_buttonAffirmative; } + wxButton *GetApplyButton() const { return m_buttonApply; } + wxButton *GetNegativeButton() const { return m_buttonNegative; } + wxButton *GetCancelButton() const { return m_buttonCancel; } + wxButton *GetHelpButton() const { return m_buttonHelp; } + +protected: + wxButton *m_buttonAffirmative; // wxID_OK, wxID_YES, wxID_SAVE go here + wxButton *m_buttonApply; + wxButton *m_buttonNegative; // wxID_NO + wxButton *m_buttonCancel; + wxButton *m_buttonHelp; + +private: + DECLARE_CLASS(wxStdDialogButtonSizer) + DECLARE_NO_COPY_CLASS(wxStdDialogButtonSizer) +}; + +#endif // wxUSE_BUTTON + +#if WXWIN_COMPATIBILITY_2_4 +// NB: wxBookCtrlSizer and wxNotebookSizer are deprecated, they +// don't do anything. wxBookCtrlBase::DoGetBestSize does the job now. + +// ---------------------------------------------------------------------------- +// wxBookCtrlSizer +// ---------------------------------------------------------------------------- + +#if wxUSE_BOOKCTRL + +// this sizer works with wxNotebook/wxListbook/... and sizes the control to +// fit its pages +class WXDLLEXPORT wxBookCtrlBase; + +class WXDLLEXPORT wxBookCtrlSizer : public wxSizer +{ +public: +#if WXWIN_COMPATIBILITY_2_6 + wxDEPRECATED( wxBookCtrlSizer(wxBookCtrlBase *bookctrl) ); +#endif // WXWIN_COMPATIBILITY_2_6 + + wxBookCtrlBase *GetControl() const { return m_bookctrl; } + + virtual void RecalcSizes(); + virtual wxSize CalcMin(); + +protected: + // this protected ctor lets us mark the real one above as deprecated + // and still have warning-free build of the library itself: + wxBookCtrlSizer() {} + + wxBookCtrlBase *m_bookctrl; + +private: + DECLARE_CLASS(wxBookCtrlSizer) + DECLARE_NO_COPY_CLASS(wxBookCtrlSizer) +}; + + +#if wxUSE_NOTEBOOK + +// before wxBookCtrlBase we only had wxNotebookSizer, keep it for backwards +// compatibility +class WXDLLEXPORT wxNotebook; + +class WXDLLEXPORT wxNotebookSizer : public wxBookCtrlSizer +{ +public: +#if WXWIN_COMPATIBILITY_2_6 + wxDEPRECATED( wxNotebookSizer(wxNotebook *nb) ); +#endif // WXWIN_COMPATIBILITY_2_6 + + wxNotebook *GetNotebook() const { return (wxNotebook *)m_bookctrl; } + +private: + DECLARE_CLASS(wxNotebookSizer) + DECLARE_NO_COPY_CLASS(wxNotebookSizer) +}; + +#endif // wxUSE_NOTEBOOK + +#endif // wxUSE_BOOKCTRL + +#endif // WXWIN_COMPATIBILITY_2_4 + +// ---------------------------------------------------------------------------- +// inline functions implementation +// ---------------------------------------------------------------------------- + +inline wxSizerItem* +wxSizer::Add( wxSizerItem *item ) +{ + return Insert( m_children.GetCount(), item ); +} + +inline wxSizerItem* +wxSizer::Add( wxWindow *window, int proportion, int flag, int border, wxObject* userData ) +{ + return Add( new wxSizerItem( window, proportion, flag, border, userData ) ); +} + +inline wxSizerItem* +wxSizer::Add( wxSizer *sizer, int proportion, int flag, int border, wxObject* userData ) +{ + return Add( new wxSizerItem( sizer, proportion, flag, border, userData ) ); +} + +inline wxSizerItem* +wxSizer::Add( int width, int height, int proportion, int flag, int border, wxObject* userData ) +{ + return Add( new wxSizerItem( width, height, proportion, flag, border, userData ) ); +} + +inline wxSizerItem* +wxSizer::Add( wxWindow *window, const wxSizerFlags& flags ) +{ + return Add( new wxSizerItem(window, flags) ); +} + +inline wxSizerItem* +wxSizer::Add( wxSizer *sizer, const wxSizerFlags& flags ) +{ + return Add( new wxSizerItem(sizer, flags) ); +} + +inline wxSizerItem* +wxSizer::AddSpacer(int size) +{ + return Add(size, size); +} + +inline wxSizerItem* +wxSizer::AddStretchSpacer(int prop) +{ + return Add(0, 0, prop); +} + +inline wxSizerItem* +wxSizer::Prepend( wxSizerItem *item ) +{ + return Insert( 0, item ); +} + +inline wxSizerItem* +wxSizer::Prepend( wxWindow *window, int proportion, int flag, int border, wxObject* userData ) +{ + return Prepend( new wxSizerItem( window, proportion, flag, border, userData ) ); +} + +inline wxSizerItem* +wxSizer::Prepend( wxSizer *sizer, int proportion, int flag, int border, wxObject* userData ) +{ + return Prepend( new wxSizerItem( sizer, proportion, flag, border, userData ) ); +} + +inline wxSizerItem* +wxSizer::Prepend( int width, int height, int proportion, int flag, int border, wxObject* userData ) +{ + return Prepend( new wxSizerItem( width, height, proportion, flag, border, userData ) ); +} + +inline wxSizerItem* +wxSizer::PrependSpacer(int size) +{ + return Prepend(size, size); +} + +inline wxSizerItem* +wxSizer::PrependStretchSpacer(int prop) +{ + return Prepend(0, 0, prop); +} + +inline wxSizerItem* +wxSizer::Prepend( wxWindow *window, const wxSizerFlags& flags ) +{ + return Prepend( new wxSizerItem(window, flags) ); +} + +inline wxSizerItem* +wxSizer::Prepend( wxSizer *sizer, const wxSizerFlags& flags ) +{ + return Prepend( new wxSizerItem(sizer, flags) ); +} + +inline wxSizerItem* +wxSizer::Insert( size_t index, + wxWindow *window, + int proportion, + int flag, + int border, + wxObject* userData ) +{ + return Insert( index, new wxSizerItem( window, proportion, flag, border, userData ) ); +} + +inline wxSizerItem* +wxSizer::Insert( size_t index, + wxSizer *sizer, + int proportion, + int flag, + int border, + wxObject* userData ) +{ + return Insert( index, new wxSizerItem( sizer, proportion, flag, border, userData ) ); +} + +inline wxSizerItem* +wxSizer::Insert( size_t index, + int width, + int height, + int proportion, + int flag, + int border, + wxObject* userData ) +{ + return Insert( index, new wxSizerItem( width, height, proportion, flag, border, userData ) ); +} + +inline wxSizerItem* +wxSizer::Insert( size_t index, wxWindow *window, const wxSizerFlags& flags ) +{ + return Insert( index, new wxSizerItem(window, flags) ); +} + +inline wxSizerItem* +wxSizer::Insert( size_t index, wxSizer *sizer, const wxSizerFlags& flags ) +{ + return Insert( index, new wxSizerItem(sizer, flags) ); +} + +inline wxSizerItem* +wxSizer::InsertSpacer(size_t index, int size) +{ + return Insert(index, size, size); +} + +inline wxSizerItem* +wxSizer::InsertStretchSpacer(size_t index, int prop) +{ + return Insert(index, 0, 0, prop); +} + + +#endif // __WXSIZER_H__ diff --git a/Externals/wxWidgets/include/wx/slider.h b/Externals/wxWidgets/include/wx/slider.h new file mode 100644 index 0000000000..77fcef2532 --- /dev/null +++ b/Externals/wxWidgets/include/wx/slider.h @@ -0,0 +1,151 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/slider.h +// Purpose: wxSlider interface +// Author: Vadim Zeitlin +// Modified by: +// Created: 09.02.01 +// RCS-ID: $Id: slider.h 38717 2006-04-14 17:01:16Z ABX $ +// Copyright: (c) 1996-2001 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_SLIDER_H_BASE_ +#define _WX_SLIDER_H_BASE_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/defs.h" + +#if wxUSE_SLIDER + +#include "wx/control.h" + +// ---------------------------------------------------------------------------- +// wxSlider flags +// ---------------------------------------------------------------------------- + +#define wxSL_HORIZONTAL wxHORIZONTAL /* 0x0004 */ +#define wxSL_VERTICAL wxVERTICAL /* 0x0008 */ + +#define wxSL_TICKS 0x0010 +#define wxSL_AUTOTICKS wxSL_TICKS // we don't support manual ticks +#define wxSL_LABELS 0x0020 +#define wxSL_LEFT 0x0040 +#define wxSL_TOP 0x0080 +#define wxSL_RIGHT 0x0100 +#define wxSL_BOTTOM 0x0200 +#define wxSL_BOTH 0x0400 +#define wxSL_SELRANGE 0x0800 +#define wxSL_INVERSE 0x1000 + +#if WXWIN_COMPATIBILITY_2_6 + // obsolete + #define wxSL_NOTIFY_DRAG 0x0000 +#endif // WXWIN_COMPATIBILITY_2_6 + +extern WXDLLEXPORT_DATA(const wxChar) wxSliderNameStr[]; + +// ---------------------------------------------------------------------------- +// wxSliderBase: define wxSlider interface +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxSliderBase : public wxControl +{ +public: + /* the ctor of the derived class should have the following form: + + wxSlider(wxWindow *parent, + wxWindowID id, + int value, int minValue, int maxValue, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxSL_HORIZONTAL, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxSliderNameStr); + */ + wxSliderBase() { } + + // get/set the current slider value (should be in range) + virtual int GetValue() const = 0; + virtual void SetValue(int value) = 0; + + // retrieve/change the range + virtual void SetRange(int minValue, int maxValue) = 0; + virtual int GetMin() const = 0; + virtual int GetMax() const = 0; + void SetMin( int minValue ) { SetRange( minValue , GetMax() ) ; } + void SetMax( int maxValue ) { SetRange( GetMin() , maxValue ) ; } + + // the line/page size is the increment by which the slider moves when + // cursor arrow key/page up or down are pressed (clicking the mouse is like + // pressing PageUp/Down) and are by default set to 1 and 1/10 of the range + virtual void SetLineSize(int lineSize) = 0; + virtual void SetPageSize(int pageSize) = 0; + virtual int GetLineSize() const = 0; + virtual int GetPageSize() const = 0; + + // these methods get/set the length of the slider pointer in pixels + virtual void SetThumbLength(int lenPixels) = 0; + virtual int GetThumbLength() const = 0; + + // warning: most of subsequent methods are currently only implemented in + // wxMSW under Win95 and are silently ignored on other platforms + + virtual void SetTickFreq(int WXUNUSED(n), int WXUNUSED(pos)) { } + virtual int GetTickFreq() const { return 0; } + virtual void ClearTicks() { } + virtual void SetTick(int WXUNUSED(tickPos)) { } + + virtual void ClearSel() { } + virtual int GetSelEnd() const { return GetMin(); } + virtual int GetSelStart() const { return GetMax(); } + virtual void SetSelection(int WXUNUSED(min), int WXUNUSED(max)) { } + +protected: + + // adjust value according to wxSL_INVERSE style + virtual int ValueInvertOrNot(int value) const + { + if (HasFlag(wxSL_INVERSE)) + return (GetMax() + GetMin()) - value; + else + return value; + } + +private: + DECLARE_NO_COPY_CLASS(wxSliderBase) +}; + +// ---------------------------------------------------------------------------- +// include the real class declaration +// ---------------------------------------------------------------------------- + +#if defined(__WXUNIVERSAL__) + #include "wx/univ/slider.h" +#elif defined(__WXMSW__) + #include "wx/msw/slider95.h" + #if WXWIN_COMPATIBILITY_2_4 + #define wxSlider95 wxSlider + #endif +#elif defined(__WXMOTIF__) + #include "wx/motif/slider.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/slider.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/slider.h" +#elif defined(__WXMAC__) + #include "wx/mac/slider.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/slider.h" +#elif defined(__WXPM__) + #include "wx/os2/slider.h" +#elif defined(__WXPALMOS__) + #include "wx/palmos/slider.h" +#endif + +#endif // wxUSE_SLIDER + +#endif + // _WX_SLIDER_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/snglinst.h b/Externals/wxWidgets/include/wx/snglinst.h new file mode 100644 index 0000000000..50a856332c --- /dev/null +++ b/Externals/wxWidgets/include/wx/snglinst.h @@ -0,0 +1,65 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/snglinst.h +// Purpose: wxSingleInstanceChecker can be used to restrict the number of +// simultaneously running copies of a program to one +// Author: Vadim Zeitlin +// Modified by: +// Created: 08.06.01 +// RCS-ID: $Id: snglinst.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) 2001 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_SNGLINST_H_ +#define _WX_SNGLINST_H_ + +#if wxUSE_SNGLINST_CHECKER + +// ---------------------------------------------------------------------------- +// wxSingleInstanceChecker +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxSingleInstanceChecker +{ +public: + // default ctor, use Create() after it + wxSingleInstanceChecker() { Init(); } + + // like Create() but no error checking (dangerous!) + wxSingleInstanceChecker(const wxString& name, + const wxString& path = wxEmptyString) + { + Init(); + Create(name, path); + } + + // name must be given and be as unique as possible, it is used as the mutex + // name under Win32 and the lock file name under Unix - + // wxTheApp->GetAppName() may be a good value for this parameter + // + // path is optional and is ignored under Win32 and used as the directory to + // create the lock file in under Unix (default is wxGetHomeDir()) + // + // returns false if initialization failed, it doesn't mean that another + // instance is running - use IsAnotherRunning() to check it + bool Create(const wxString& name, const wxString& path = wxEmptyString); + + // is another copy of this program already running? + bool IsAnotherRunning() const; + + // dtor is not virtual, this class is not meant to be used polymorphically + ~wxSingleInstanceChecker(); + +private: + // common part of all ctors + void Init() { m_impl = NULL; } + + // the implementation details (platform specific) + class WXDLLIMPEXP_FWD_BASE wxSingleInstanceCheckerImpl *m_impl; + + DECLARE_NO_COPY_CLASS(wxSingleInstanceChecker) +}; + +#endif // wxUSE_SNGLINST_CHECKER + +#endif // _WX_SNGLINST_H_ diff --git a/Externals/wxWidgets/include/wx/socket.h b/Externals/wxWidgets/include/wx/socket.h new file mode 100644 index 0000000000..c31db2a064 --- /dev/null +++ b/Externals/wxWidgets/include/wx/socket.h @@ -0,0 +1,335 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: socket.h +// Purpose: Socket handling classes +// Authors: Guilhem Lavaux, Guillermo Rodriguez Garcia +// Modified by: +// Created: April 1997 +// RCS-ID: $Id: socket.h 45498 2007-04-16 13:03:05Z VZ $ +// Copyright: (c) Guilhem Lavaux +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_SOCKET_H_ +#define _WX_SOCKET_H_ + +#include "wx/defs.h" + +#if wxUSE_SOCKETS + +// --------------------------------------------------------------------------- +// wxSocket headers +// --------------------------------------------------------------------------- + +#include "wx/event.h" +#include "wx/sckaddr.h" +#include "wx/gsocket.h" +#include "wx/list.h" + +// ------------------------------------------------------------------------ +// Types and constants +// ------------------------------------------------------------------------ + +enum wxSocketNotify +{ + wxSOCKET_INPUT = GSOCK_INPUT, + wxSOCKET_OUTPUT = GSOCK_OUTPUT, + wxSOCKET_CONNECTION = GSOCK_CONNECTION, + wxSOCKET_LOST = GSOCK_LOST +}; + +enum +{ + wxSOCKET_INPUT_FLAG = GSOCK_INPUT_FLAG, + wxSOCKET_OUTPUT_FLAG = GSOCK_OUTPUT_FLAG, + wxSOCKET_CONNECTION_FLAG = GSOCK_CONNECTION_FLAG, + wxSOCKET_LOST_FLAG = GSOCK_LOST_FLAG +}; + +typedef GSocketEventFlags wxSocketEventFlags; + +enum wxSocketError +{ + // from GSocket + wxSOCKET_NOERROR = GSOCK_NOERROR, + wxSOCKET_INVOP = GSOCK_INVOP, + wxSOCKET_IOERR = GSOCK_IOERR, + wxSOCKET_INVADDR = GSOCK_INVADDR, + wxSOCKET_INVSOCK = GSOCK_INVSOCK, + wxSOCKET_NOHOST = GSOCK_NOHOST, + wxSOCKET_INVPORT = GSOCK_INVPORT, + wxSOCKET_WOULDBLOCK = GSOCK_WOULDBLOCK, + wxSOCKET_TIMEDOUT = GSOCK_TIMEDOUT, + wxSOCKET_MEMERR = GSOCK_MEMERR, + + // wxSocket-specific (not yet implemented) + wxSOCKET_DUMMY +}; + +enum +{ + wxSOCKET_NONE = 0, + wxSOCKET_NOWAIT = 1, + wxSOCKET_WAITALL = 2, + wxSOCKET_BLOCK = 4, + wxSOCKET_REUSEADDR = 8 +}; + +enum wxSocketType +{ + wxSOCKET_UNINIT, + wxSOCKET_CLIENT, + wxSOCKET_SERVER, + wxSOCKET_BASE, + wxSOCKET_DATAGRAM +}; + +typedef int wxSocketFlags; + + + +// -------------------------------------------------------------------------- +// wxSocketBase +// -------------------------------------------------------------------------- + +class WXDLLIMPEXP_NET wxSocketBase : public wxObject +{ + DECLARE_CLASS(wxSocketBase) + +public: + + // Public interface + // ---------------- + + // ctors and dtors + wxSocketBase(); + wxSocketBase(wxSocketFlags flags, wxSocketType type); + virtual ~wxSocketBase(); + void Init(); + bool Destroy(); + + // state + inline bool Ok() const { return IsOk(); } + inline bool IsOk() const { return (m_socket != NULL); } + inline bool Error() const { return m_error; } + inline bool IsConnected() const { return m_connected; } + inline bool IsData() { return WaitForRead(0, 0); } + inline bool IsDisconnected() const { return !IsConnected(); } + inline wxUint32 LastCount() const { return m_lcount; } + inline wxSocketError LastError() const { return (wxSocketError)m_socket->GetError(); } + void SaveState(); + void RestoreState(); + + // addresses + virtual bool GetLocal(wxSockAddress& addr_man) const; + virtual bool GetPeer(wxSockAddress& addr_man) const; + virtual bool SetLocal(wxIPV4address& local); + + // base IO + virtual bool Close(); + wxSocketBase& Discard(); + wxSocketBase& Peek(void* buffer, wxUint32 nbytes); + wxSocketBase& Read(void* buffer, wxUint32 nbytes); + wxSocketBase& ReadMsg(void *buffer, wxUint32 nbytes); + wxSocketBase& Unread(const void *buffer, wxUint32 nbytes); + wxSocketBase& Write(const void *buffer, wxUint32 nbytes); + wxSocketBase& WriteMsg(const void *buffer, wxUint32 nbytes); + + void InterruptWait() { m_interrupt = true; } + bool Wait(long seconds = -1, long milliseconds = 0); + bool WaitForRead(long seconds = -1, long milliseconds = 0); + bool WaitForWrite(long seconds = -1, long milliseconds = 0); + bool WaitForLost(long seconds = -1, long milliseconds = 0); + + inline wxSocketFlags GetFlags() const { return m_flags; } + void SetFlags(wxSocketFlags flags); + void SetTimeout(long seconds); + + bool GetOption(int level, int optname, void *optval, int *optlen); + bool SetOption(int level, int optname, const void *optval, int optlen); + inline wxUint32 GetLastIOSize() const { return m_lcount; } + + // event handling + void *GetClientData() const { return m_clientData; } + void SetClientData(void *data) { m_clientData = data; } + void SetEventHandler(wxEvtHandler& handler, int id = wxID_ANY); + void SetNotify(wxSocketEventFlags flags); + void Notify(bool notify); + + // initialize/shutdown the sockets (usually called automatically) + static bool IsInitialized(); + static bool Initialize(); + static void Shutdown(); + + + // Implementation from now on + // -------------------------- + + // do not use, should be private (called from GSocket) + void OnRequest(wxSocketNotify notify); + + // do not use, not documented nor supported + inline bool IsNoWait() const { return ((m_flags & wxSOCKET_NOWAIT) != 0); } + inline wxSocketType GetType() const { return m_type; } + +private: + friend class wxSocketClient; + friend class wxSocketServer; + friend class wxDatagramSocket; + + // low level IO + wxUint32 _Read(void* buffer, wxUint32 nbytes); + wxUint32 _Write(const void *buffer, wxUint32 nbytes); + bool _Wait(long seconds, long milliseconds, wxSocketEventFlags flags); + + // pushback buffer + void Pushback(const void *buffer, wxUint32 size); + wxUint32 GetPushback(void *buffer, wxUint32 size, bool peek); + +private: + // socket + GSocket *m_socket; // GSocket + wxSocketType m_type; // wxSocket type + + // state + wxSocketFlags m_flags; // wxSocket flags + bool m_connected; // connected? + bool m_establishing; // establishing connection? + bool m_reading; // busy reading? + bool m_writing; // busy writing? + bool m_error; // did last IO call fail? + wxSocketError m_lasterror; // last error (not cleared on success) + wxUint32 m_lcount; // last IO transaction size + unsigned long m_timeout; // IO timeout value + wxList m_states; // stack of states + bool m_interrupt; // interrupt ongoing wait operations? + bool m_beingDeleted; // marked for delayed deletion? + wxIPV4address m_localAddress; // bind to local address? + + // pushback buffer + void *m_unread; // pushback buffer + wxUint32 m_unrd_size; // pushback buffer size + wxUint32 m_unrd_cur; // pushback pointer (index into buffer) + + // events + int m_id; // socket id + wxEvtHandler *m_handler; // event handler + void *m_clientData; // client data for events + bool m_notify; // notify events to users? + wxSocketEventFlags m_eventmask; // which events to notify? + + // the initialization count, GSocket is initialized if > 0 + static size_t m_countInit; + + DECLARE_NO_COPY_CLASS(wxSocketBase) +}; + + +// -------------------------------------------------------------------------- +// wxSocketServer +// -------------------------------------------------------------------------- + +class WXDLLIMPEXP_NET wxSocketServer : public wxSocketBase +{ + DECLARE_CLASS(wxSocketServer) + +public: + wxSocketServer(const wxSockAddress& addr, wxSocketFlags flags = wxSOCKET_NONE); + + wxSocketBase* Accept(bool wait = true); + bool AcceptWith(wxSocketBase& socket, bool wait = true); + + bool WaitForAccept(long seconds = -1, long milliseconds = 0); + + DECLARE_NO_COPY_CLASS(wxSocketServer) +}; + + +// -------------------------------------------------------------------------- +// wxSocketClient +// -------------------------------------------------------------------------- + +class WXDLLIMPEXP_NET wxSocketClient : public wxSocketBase +{ + DECLARE_CLASS(wxSocketClient) + +public: + wxSocketClient(wxSocketFlags flags = wxSOCKET_NONE); + virtual ~wxSocketClient(); + + virtual bool Connect(wxSockAddress& addr, bool wait = true); + bool Connect(wxSockAddress& addr, wxSockAddress& local, bool wait = true); + + bool WaitOnConnect(long seconds = -1, long milliseconds = 0); + +private: + virtual bool DoConnect(wxSockAddress& addr, wxSockAddress* local, bool wait = true); + + DECLARE_NO_COPY_CLASS(wxSocketClient) +}; + + +// -------------------------------------------------------------------------- +// wxDatagramSocket +// -------------------------------------------------------------------------- + +// WARNING: still in alpha stage + +class WXDLLIMPEXP_NET wxDatagramSocket : public wxSocketBase +{ + DECLARE_CLASS(wxDatagramSocket) + +public: + wxDatagramSocket(const wxSockAddress& addr, wxSocketFlags flags = wxSOCKET_NONE); + + wxDatagramSocket& RecvFrom( wxSockAddress& addr, + void* buf, + wxUint32 nBytes ); + wxDatagramSocket& SendTo( const wxSockAddress& addr, + const void* buf, + wxUint32 nBytes ); + +/* TODO: + bool Connect(wxSockAddress& addr); +*/ + DECLARE_NO_COPY_CLASS(wxDatagramSocket) +}; + + +// -------------------------------------------------------------------------- +// wxSocketEvent +// -------------------------------------------------------------------------- + +class WXDLLIMPEXP_NET wxSocketEvent : public wxEvent +{ +public: + wxSocketEvent(int id = 0) + : wxEvent(id, wxEVT_SOCKET) + { + } + + wxSocketNotify GetSocketEvent() const { return m_event; } + wxSocketBase *GetSocket() const { return (wxSocketBase *) GetEventObject(); } + void *GetClientData() const { return m_clientData; } + + virtual wxEvent *Clone() const { return new wxSocketEvent(*this); } + +public: + wxSocketNotify m_event; + void *m_clientData; + + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxSocketEvent) +}; + + +typedef void (wxEvtHandler::*wxSocketEventFunction)(wxSocketEvent&); + +#define wxSocketEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxSocketEventFunction, &func) + +#define EVT_SOCKET(id, func) \ + wx__DECLARE_EVT1(wxEVT_SOCKET, id, wxSocketEventHandler(func)) + +#endif // wxUSE_SOCKETS + +#endif // _WX_SOCKET_H_ + diff --git a/Externals/wxWidgets/include/wx/sound.h b/Externals/wxWidgets/include/wx/sound.h new file mode 100644 index 0000000000..4204b633c6 --- /dev/null +++ b/Externals/wxWidgets/include/wx/sound.h @@ -0,0 +1,98 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/sound.h +// Purpose: wxSoundBase class +// Author: Vaclav Slavik +// Modified by: +// Created: 2004/02/01 +// RCS-ID: $Id: sound.h 35650 2005-09-23 12:56:45Z MR $ +// Copyright: (c) 2004, Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_SOUND_H_BASE_ +#define _WX_SOUND_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_SOUND + +#include "wx/object.h" + +// ---------------------------------------------------------------------------- +// wxSoundBase: common wxSound code and interface +// ---------------------------------------------------------------------------- + +// Flags for wxSound::Play + +// NB: We can't use enum because there would be ambiguity between the +// two Play() prototypes when called without explicit parameters +// if WXWIN_COMPATIBILITY_2_4. +// We can't use enum with some compilers either, because they +// keep reporting nonexistent ambiguities between +// Play(unsigned) and static Play(const wxString&, unsigned). +#define wxSOUND_SYNC ((unsigned)0) +#define wxSOUND_ASYNC ((unsigned)1) +#define wxSOUND_LOOP ((unsigned)2) + +// Base class for wxSound implementations +class WXDLLIMPEXP_ADV wxSoundBase : public wxObject +{ +public: + // Play the sound: + bool Play(unsigned flags = wxSOUND_ASYNC) const + { + wxASSERT_MSG( (flags & wxSOUND_LOOP) == 0 || + (flags & wxSOUND_ASYNC) != 0, + _T("sound can only be looped asynchronously") ); + return DoPlay(flags); + } +#if WXWIN_COMPATIBILITY_2_4 + wxDEPRECATED( bool Play(bool async, bool looped = false) const ); +#endif + + // Plays sound from filename: + static bool Play(const wxString& filename, unsigned flags = wxSOUND_ASYNC); + +protected: + virtual bool DoPlay(unsigned flags) const = 0; +}; + +// ---------------------------------------------------------------------------- +// wxSound class implementation +// ---------------------------------------------------------------------------- + +#if defined(__WXMSW__) + #include "wx/msw/sound.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/sound.h" +#elif defined(__WXMAC__) + #include "wx/mac/sound.h" +#elif defined(__WXPM__) + #include "wx/os2/sound.h" +#elif defined(__UNIX__) + #include "wx/unix/sound.h" +#endif + +// ---------------------------------------------------------------------------- +// wxSoundBase methods +// ---------------------------------------------------------------------------- + +inline bool wxSoundBase::Play(const wxString& filename, unsigned flags) +{ + wxSound snd(filename); + return snd.IsOk() ? snd.Play(flags) : false; +} + +#if WXWIN_COMPATIBILITY_2_4 +inline bool wxSoundBase::Play(bool async, bool looped) const +{ + unsigned flags = 0; + if (async) flags |= wxSOUND_ASYNC; + if (looped) flags |= wxSOUND_LOOP | wxSOUND_ASYNC; + return DoPlay(flags); +} +#endif + +#endif // wxUSE_SOUND + +#endif // _WX_SOUND_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/spinbutt.h b/Externals/wxWidgets/include/wx/spinbutt.h new file mode 100644 index 0000000000..ad4753c359 --- /dev/null +++ b/Externals/wxWidgets/include/wx/spinbutt.h @@ -0,0 +1,129 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/spinbutt.h +// Purpose: wxSpinButtonBase class +// Author: Julian Smart, Vadim Zeitlin +// Modified by: +// Created: 23.07.99 +// RCS-ID: $Id: spinbutt.h 37066 2006-01-23 03:27:34Z MR $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_SPINBUTT_H_BASE_ +#define _WX_SPINBUTT_H_BASE_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/defs.h" + +#if wxUSE_SPINBTN + +#include "wx/control.h" +#include "wx/event.h" + +#define wxSPIN_BUTTON_NAME _T("wxSpinButton") + +// ---------------------------------------------------------------------------- +// The wxSpinButton is like a small scrollbar than is often placed next +// to a text control. +// +// Styles: +// wxSP_HORIZONTAL: horizontal spin button +// wxSP_VERTICAL: vertical spin button (the default) +// wxSP_ARROW_KEYS: arrow keys increment/decrement value +// wxSP_WRAP: value wraps at either end +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxSpinButtonBase : public wxControl +{ +public: + // ctor initializes the range with the default (0..100) values + wxSpinButtonBase() { m_min = 0; m_max = 100; } + + // accessors + virtual int GetValue() const = 0; + virtual int GetMin() const { return m_min; } + virtual int GetMax() const { return m_max; } + + // operations + virtual void SetValue(int val) = 0; + virtual void SetMin(int minVal) { SetRange ( minVal , m_max ) ; } + virtual void SetMax(int maxVal) { SetRange ( m_min , maxVal ) ; } + virtual void SetRange(int minVal, int maxVal) + { + m_min = minVal; + m_max = maxVal; + } + + // is this spin button vertically oriented? + bool IsVertical() const { return (m_windowStyle & wxSP_VERTICAL) != 0; } + +protected: + // the range value + int m_min; + int m_max; + + DECLARE_NO_COPY_CLASS(wxSpinButtonBase) +}; + +// ---------------------------------------------------------------------------- +// include the declaration of the real class +// ---------------------------------------------------------------------------- + +#if defined(__WXUNIVERSAL__) + #include "wx/univ/spinbutt.h" +#elif defined(__WXMSW__) + #include "wx/msw/spinbutt.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/spinbutt.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/spinbutt.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/spinbutt.h" +#elif defined(__WXMAC__) + #include "wx/mac/spinbutt.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/spinbutt.h" +#elif defined(__WXPM__) + #include "wx/os2/spinbutt.h" +#endif + +// ---------------------------------------------------------------------------- +// the wxSpinButton event +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxSpinEvent : public wxNotifyEvent +{ +public: + wxSpinEvent(wxEventType commandType = wxEVT_NULL, int winid = 0) + : wxNotifyEvent(commandType, winid) + { + } + + // get the current value of the control + int GetPosition() const { return m_commandInt; } + void SetPosition(int pos) { m_commandInt = pos; } + +private: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxSpinEvent) +}; + +typedef void (wxEvtHandler::*wxSpinEventFunction)(wxSpinEvent&); + +#define wxSpinEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxSpinEventFunction, &func) + +// macros for handling spin events +#define EVT_SPIN_UP(winid, func) \ + wx__DECLARE_EVT1(wxEVT_SCROLL_LINEUP, winid, wxSpinEventHandler(func)) +#define EVT_SPIN_DOWN(winid, func) \ + wx__DECLARE_EVT1(wxEVT_SCROLL_LINEDOWN, winid, wxSpinEventHandler(func)) +#define EVT_SPIN(winid, func) \ + wx__DECLARE_EVT1(wxEVT_SCROLL_THUMBTRACK, winid, wxSpinEventHandler(func)) + +#endif // wxUSE_SPINBTN + +#endif + // _WX_SPINBUTT_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/spinctrl.h b/Externals/wxWidgets/include/wx/spinctrl.h new file mode 100644 index 0000000000..e27c1892df --- /dev/null +++ b/Externals/wxWidgets/include/wx/spinctrl.h @@ -0,0 +1,83 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: spinctrl.h +// Purpose: wxSpinCtrlBase class +// Author: Vadim Zeitlin +// Modified by: +// Created: 22.07.99 +// RCS-ID: $Id: spinctrl.h 37066 2006-01-23 03:27:34Z MR $ +// Copyright: (c) Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_SPINCTRL_H_ +#define _WX_SPINCTRL_H_ + +#include "wx/defs.h" + +#if wxUSE_SPINCTRL + +#include "wx/spinbutt.h" // should make wxSpinEvent visible to the app + +// ---------------------------------------------------------------------------- +// a spin ctrl is a text control with a spin button which is usually used to +// prompt the user for a numeric input +// ---------------------------------------------------------------------------- + +/* there is no generic base class for this control because it's imlpemented + very differently under MSW and other platforms + +class WXDLLEXPORT wxSpinCtrlBase : public wxControl +{ +public: + wxSpinCtrlBase() { Init(); } + + // accessors + virtual int GetValue() const = 0; + virtual int GetMin() const { return m_min; } + virtual int GetMax() const { return m_max; } + + // operations + virtual void SetValue(const wxString& value) = 0; + virtual void SetValue(int val) = 0; + virtual void SetRange(int minVal, int maxVal) = 0; + + // as the wxTextCtrl method + virtual void SetSelection(long from, long to) = 0; + +protected: + // initialize m_min/max with the default values + void Init() { m_min = 0; m_max = 100; } + + int m_min; + int m_max; +}; +*/ + +// ---------------------------------------------------------------------------- +// include the platform-dependent class implementation +// ---------------------------------------------------------------------------- + +#if defined(__WXUNIVERSAL__) + #include "wx/generic/spinctlg.h" +#elif defined(__WXMSW__) + #include "wx/msw/spinctrl.h" +#elif defined(__WXPM__) + #include "wx/os2/spinctrl.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/spinctrl.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/spinctrl.h" +#elif defined(__WXMOTIF__) + #include "wx/generic/spinctlg.h" +#elif defined(__WXMAC__) + #include "wx/mac/spinctrl.h" +#elif defined(__WXCOCOA__) + #include "wx/generic/spinctlg.h" +#endif // platform + +#define EVT_SPINCTRL(id, fn) \ + wx__DECLARE_EVT1(wxEVT_COMMAND_SPINCTRL_UPDATED, id, wxSpinEventHandler(fn)) + +#endif // wxUSE_SPINCTRL + +#endif // _WX_SPINCTRL_H_ diff --git a/Externals/wxWidgets/include/wx/splash.h b/Externals/wxWidgets/include/wx/splash.h new file mode 100644 index 0000000000..d68694f957 --- /dev/null +++ b/Externals/wxWidgets/include/wx/splash.h @@ -0,0 +1,18 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/splash.h +// Purpose: Base header for wxSplashScreen +// Author: Julian Smart +// Modified by: +// Created: +// RCS-ID: $Id: splash.h 33948 2005-05-04 18:57:50Z JS $ +// Copyright: (c) Julian Smart +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_SPLASH_H_BASE_ +#define _WX_SPLASH_H_BASE_ + +#include "wx/generic/splash.h" + +#endif + // _WX_SPLASH_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/splitter.h b/Externals/wxWidgets/include/wx/splitter.h new file mode 100644 index 0000000000..fb96799f1b --- /dev/null +++ b/Externals/wxWidgets/include/wx/splitter.h @@ -0,0 +1,47 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/splitter.h +// Purpose: Base header for wxSplitterWindow +// Author: Julian Smart +// Modified by: +// Created: +// RCS-ID: $Id: splitter.h 38717 2006-04-14 17:01:16Z ABX $ +// Copyright: (c) Julian Smart +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_SPLITTER_H_BASE_ +#define _WX_SPLITTER_H_BASE_ + +#include "wx/event.h" + +// ---------------------------------------------------------------------------- +// wxSplitterWindow flags +// ---------------------------------------------------------------------------- + +#define wxSP_NOBORDER 0x0000 +#define wxSP_NOSASH 0x0010 +#define wxSP_PERMIT_UNSPLIT 0x0040 +#define wxSP_LIVE_UPDATE 0x0080 +#define wxSP_3DSASH 0x0100 +#define wxSP_3DBORDER 0x0200 +#define wxSP_NO_XP_THEME 0x0400 +#define wxSP_BORDER wxSP_3DBORDER +#define wxSP_3D (wxSP_3DBORDER | wxSP_3DSASH) + +#if WXWIN_COMPATIBILITY_2_6 + // obsolete styles, don't do anything + #define wxSP_SASH_AQUA 0 + #define wxSP_FULLSASH 0 +#endif // WXWIN_COMPATIBILITY_2_6 + +BEGIN_DECLARE_EVENT_TYPES() + DECLARE_EVENT_TYPE(wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGED, 850) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGING, 851) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_SPLITTER_DOUBLECLICKED, 852) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_SPLITTER_UNSPLIT, 853) +END_DECLARE_EVENT_TYPES() + +#include "wx/generic/splitter.h" + +#endif + // _WX_SPLITTER_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/srchctrl.h b/Externals/wxWidgets/include/wx/srchctrl.h new file mode 100644 index 0000000000..af831bd0b7 --- /dev/null +++ b/Externals/wxWidgets/include/wx/srchctrl.h @@ -0,0 +1,91 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: srchctrl.h +// Purpose: wxSearchCtrlBase class +// Author: Vince Harron +// Created: 2006-02-18 +// RCS-ID: $Id: srchctrl.h 45828 2007-05-05 14:51:51Z VZ $ +// Copyright: (c) Vince Harron +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_SEARCHCTRL_H_BASE_ +#define _WX_SEARCHCTRL_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_SEARCHCTRL + +#include "wx/textctrl.h" + +#if !defined(__WXUNIVERSAL__) && defined(__WXMAC__) && defined(__WXMAC_OSX__) \ + && (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_3) + // search control was introduced in Mac OS X 10.3 Panther + #define wxUSE_NATIVE_SEARCH_CONTROL 1 + + #define wxSearchCtrlBaseBaseClass wxTextCtrl +#else + // no native version, use the generic one + #define wxUSE_NATIVE_SEARCH_CONTROL 0 + + #define wxSearchCtrlBaseBaseClass wxTextCtrlBase +#endif + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +extern WXDLLEXPORT_DATA(const wxChar) wxSearchCtrlNameStr[]; + +BEGIN_DECLARE_EVENT_TYPES() + DECLARE_EVENT_TYPE(wxEVT_COMMAND_SEARCHCTRL_CANCEL_BTN, 1119) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_SEARCHCTRL_SEARCH_BTN, 1120) +END_DECLARE_EVENT_TYPES() + +// ---------------------------------------------------------------------------- +// a search ctrl is a text control with a search button and a cancel button +// it is based on the MacOSX 10.3 control HISearchFieldCreate +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxSearchCtrlBase : public wxSearchCtrlBaseBaseClass +{ +public: + wxSearchCtrlBase() { } + virtual ~wxSearchCtrlBase() { } + + // search control +#if wxUSE_MENUS + virtual void SetMenu(wxMenu *menu) = 0; + virtual wxMenu *GetMenu() = 0; +#endif // wxUSE_MENUS + + // get/set options + virtual void ShowSearchButton( bool show ) = 0; + virtual bool IsSearchButtonVisible() const = 0; + + virtual void ShowCancelButton( bool show ) = 0; + virtual bool IsCancelButtonVisible() const = 0; +}; + + +// include the platform-dependent class implementation +#if wxUSE_NATIVE_SEARCH_CONTROL + #if defined(__WXMAC__) + #include "wx/mac/srchctrl.h" + #endif +#else + #include "wx/generic/srchctlg.h" +#endif + +// ---------------------------------------------------------------------------- +// macros for handling search events +// ---------------------------------------------------------------------------- + +#define EVT_SEARCHCTRL_CANCEL_BTN(id, fn) \ + wx__DECLARE_EVT1(wxEVT_COMMAND_SEARCHCTRL_CANCEL_BTN, id, wxCommandEventHandler(fn)) + +#define EVT_SEARCHCTRL_SEARCH_BTN(id, fn) \ + wx__DECLARE_EVT1(wxEVT_COMMAND_SEARCHCTRL_SEARCH_BTN, id, wxCommandEventHandler(fn)) + +#endif // wxUSE_SEARCHCTRL + +#endif // _WX_SEARCHCTRL_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/sstream.h b/Externals/wxWidgets/include/wx/sstream.h new file mode 100644 index 0000000000..febf2cf0de --- /dev/null +++ b/Externals/wxWidgets/include/wx/sstream.h @@ -0,0 +1,103 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/sstream.h +// Purpose: string-based streams +// Author: Vadim Zeitlin +// Modified by: +// Created: 2004-09-19 +// RCS-ID: $Id: sstream.h 45732 2007-05-01 13:52:19Z VZ $ +// Copyright: (c) 2004 Vadim Zeitlin <vadim@wxwindows.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_SSTREAM_H_ +#define _WX_SSTREAM_H_ + +#include "wx/stream.h" + +#if wxUSE_STREAMS + +// ---------------------------------------------------------------------------- +// wxStringInputStream is a stream reading from the given (fixed size) string +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxStringInputStream : public wxInputStream +{ +public: + // ctor associates the stream with the given string which makes a copy of + // it + wxStringInputStream(const wxString& s); + virtual ~wxStringInputStream(); + + virtual wxFileOffset GetLength() const; + +protected: + virtual wxFileOffset OnSysSeek(wxFileOffset ofs, wxSeekMode mode); + virtual wxFileOffset OnSysTell() const; + virtual size_t OnSysRead(void *buffer, size_t size); + +private: + // the string that was passed in the ctor + wxString m_str; + + // the buffer we're reading from + char* m_buf; + + // length of the buffer we're reading from + size_t m_len; + + // position in the stream in bytes, *not* in chars + size_t m_pos; + + DECLARE_NO_COPY_CLASS(wxStringInputStream) +}; + +// ---------------------------------------------------------------------------- +// wxStringOutputStream writes data to the given string, expanding it as needed +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxStringOutputStream : public wxOutputStream +{ +public: + // The stream will write data either to the provided string or to an + // internal string which can be retrieved using GetString() + wxStringOutputStream(wxString *pString = NULL) + { + m_str = pString ? pString : &m_strInternal; + m_pos = m_str->length() / sizeof(wxChar); + } + +#if wxABI_VERSION >= 20804 && wxUSE_UNICODE + virtual ~wxStringOutputStream(); +#endif // wx 2.8.4+ + + // get the string containing current output + const wxString& GetString() const { return *m_str; } + +protected: + virtual wxFileOffset OnSysTell() const; + virtual size_t OnSysWrite(const void *buffer, size_t size); + +private: + // internal string, not used if caller provided his own string + wxString m_strInternal; + + // pointer given by the caller or just pointer to m_strInternal + wxString *m_str; + + // position in the stream in bytes, *not* in chars + size_t m_pos; + +#if wxUSE_WCHAR_T + // string encoding converter (UTF8 is the standard) + wxMBConvUTF8 m_conv; +#else + wxMBConv m_conv; +#endif + + DECLARE_NO_COPY_CLASS(wxStringOutputStream) +}; + +#endif // wxUSE_STREAMS + +#endif // _WX_SSTREAM_H_ + diff --git a/Externals/wxWidgets/include/wx/stack.h b/Externals/wxWidgets/include/wx/stack.h new file mode 100644 index 0000000000..e58c0675d2 --- /dev/null +++ b/Externals/wxWidgets/include/wx/stack.h @@ -0,0 +1,44 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/stack.h +// Purpose: STL stack clone +// Author: Lindsay Mathieson +// Modified by: +// Created: 30.07.2001 +// Copyright: (c) 2001 Lindsay Mathieson <lindsay@mathieson.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_STACK_H_ +#define _WX_STACK_H_ + +#include "wx/vector.h" + +#define WX_DECLARE_STACK(obj, cls)\ +class cls : public wxVectorBase\ +{\ + WX_DECLARE_VECTORBASE(obj, cls);\ +public:\ + void push(const obj& o)\ + {\ + bool rc = Alloc(size() + 1);\ + wxASSERT(rc);\ + Append(new obj(o));\ + };\ +\ + void pop()\ + {\ + RemoveAt(size() - 1);\ + };\ +\ + obj& top()\ + {\ + return *(obj *) GetItem(size() - 1);\ + };\ + const obj& top() const\ + {\ + return *(obj *) GetItem(size() - 1);\ + };\ +} + +#endif // _WX_STACK_H_ + diff --git a/Externals/wxWidgets/include/wx/stackwalk.h b/Externals/wxWidgets/include/wx/stackwalk.h new file mode 100644 index 0000000000..e051c71f1f --- /dev/null +++ b/Externals/wxWidgets/include/wx/stackwalk.h @@ -0,0 +1,156 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/wx/stackwalk.h +// Purpose: wxStackWalker and related classes, common part +// Author: Vadim Zeitlin +// Modified by: +// Created: 2005-01-07 +// RCS-ID: $Id: stackwalk.h 43346 2006-11-12 14:33:03Z RR $ +// Copyright: (c) 2004 Vadim Zeitlin <vadim@wxwindows.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_STACKWALK_H_ +#define _WX_STACKWALK_H_ + +#include "wx/defs.h" + +#if wxUSE_STACKWALKER + +class WXDLLIMPEXP_BASE wxStackFrame; + +// ---------------------------------------------------------------------------- +// wxStackFrame: a single stack level +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxStackFrameBase +{ +private: + // put this inline function here so that it is defined before use + wxStackFrameBase *ConstCast() const + { return wx_const_cast(wxStackFrameBase *, this); } + +public: + wxStackFrameBase(size_t level, void *address = NULL) + { + m_level = level; + + m_line = + m_offset = 0; + + m_address = address; + } + + // get the level of this frame (deepest/innermost one is 0) + size_t GetLevel() const { return m_level; } + + // return the address of this frame + void *GetAddress() const { return m_address; } + + + // return the unmangled (if possible) name of the function containing this + // frame + wxString GetName() const { ConstCast()->OnGetName(); return m_name; } + + // return the instruction pointer offset from the start of the function + size_t GetOffset() const { ConstCast()->OnGetName(); return m_offset; } + + // get the module this function belongs to (not always available) + wxString GetModule() const { ConstCast()->OnGetName(); return m_module; } + + + // return true if we have the filename and line number for this frame + bool HasSourceLocation() const { return !GetFileName().empty(); } + + // return the name of the file containing this frame, empty if + // unavailable (typically because debug info is missing) + wxString GetFileName() const + { ConstCast()->OnGetLocation(); return m_filename; } + + // return the line number of this frame, 0 if unavailable + size_t GetLine() const { ConstCast()->OnGetLocation(); return m_line; } + + + // return the number of parameters of this function (may return 0 if we + // can't retrieve the parameters info even although the function does have + // parameters) + virtual size_t GetParamCount() const { return 0; } + + // get the name, type and value (in text form) of the given parameter + // + // any pointer may be NULL + // + // return true if at least some values could be retrieved + virtual bool GetParam(size_t WXUNUSED(n), + wxString * WXUNUSED(type), + wxString * WXUNUSED(name), + wxString * WXUNUSED(value)) const + { + return false; + } + + + // although this class is not supposed to be used polymorphically, give it + // a virtual dtor to silence compiler warnings + virtual ~wxStackFrameBase() { } + +protected: + // hooks for derived classes to initialize some fields on demand + virtual void OnGetName() { } + virtual void OnGetLocation() { } + + + // fields are protected, not private, so that OnGetXXX() could modify them + // directly + size_t m_level; + + wxString m_name, + m_module, + m_filename; + + size_t m_line; + + void *m_address; + size_t m_offset; +}; + +// ---------------------------------------------------------------------------- +// wxStackWalker: class for enumerating stack frames +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxStackWalkerBase +{ +public: + // ctor does nothing, use Walk() to walk the stack + wxStackWalkerBase() { } + + // dtor does nothing neither but should be virtual + virtual ~wxStackWalkerBase() { } + + // enumerate stack frames from the current location, skipping the initial + // number of them (this can be useful when Walk() is called from some known + // location and you don't want to see the first few frames anyhow; also + // notice that Walk() frame itself is not included if skip >= 1) + virtual void Walk(size_t skip = 1, size_t maxDepth = 200) = 0; + + // enumerate stack frames from the location of uncaught exception + // + // this version can only be called from wxApp::OnFatalException() + virtual void WalkFromException() = 0; + +protected: + // this function must be overrided to process the given frame + virtual void OnStackFrame(const wxStackFrame& frame) = 0; +}; + +#ifdef __WXMSW__ + #include "wx/msw/stackwalk.h" +#elif defined(__UNIX__) + #include "wx/unix/stackwalk.h" +#else + #error "wxStackWalker is not supported, set wxUSE_STACKWALKER to 0" +#endif + +#endif // wxUSE_STACKWALKER + +#endif // _WX_STACKWALK_H_ + diff --git a/Externals/wxWidgets/include/wx/statbmp.h b/Externals/wxWidgets/include/wx/statbmp.h new file mode 100644 index 0000000000..e32c0cca76 --- /dev/null +++ b/Externals/wxWidgets/include/wx/statbmp.h @@ -0,0 +1,74 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/statbmp.h +// Purpose: wxStaticBitmap class interface +// Author: Vadim Zeitlin +// Modified by: +// Created: 25.08.00 +// RCS-ID: $Id: statbmp.h 37066 2006-01-23 03:27:34Z MR $ +// Copyright: (c) 2000 Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_STATBMP_H_BASE_ +#define _WX_STATBMP_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_STATBMP + +#include "wx/control.h" +#include "wx/bitmap.h" +#include "wx/icon.h" + +extern WXDLLEXPORT_DATA(const wxChar) wxStaticBitmapNameStr[]; + +// a control showing an icon or a bitmap +class WXDLLEXPORT wxStaticBitmapBase : public wxControl +{ +public: + wxStaticBitmapBase() { } + virtual ~wxStaticBitmapBase(); + + // our interface + virtual void SetIcon(const wxIcon& icon) = 0; + virtual void SetBitmap(const wxBitmap& bitmap) = 0; + virtual wxBitmap GetBitmap() const = 0; + virtual wxIcon GetIcon() const /* = 0 -- should be pure virtual */ + { + // stub it out here for now as not all ports implement it (but they + // should) + return wxIcon(); + } + + // overriden base class virtuals + virtual bool AcceptsFocus() const { return false; } + virtual bool HasTransparentBackground() { return true; } + +protected: + virtual wxSize DoGetBestSize() const; + + DECLARE_NO_COPY_CLASS(wxStaticBitmapBase) +}; + +#if defined(__WXUNIVERSAL__) + #include "wx/univ/statbmp.h" +#elif defined(__WXMSW__) + #include "wx/msw/statbmp.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/statbmp.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/statbmp.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/statbmp.h" +#elif defined(__WXMAC__) + #include "wx/mac/statbmp.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/statbmp.h" +#elif defined(__WXPM__) + #include "wx/os2/statbmp.h" +#endif + +#endif // wxUSE_STATBMP + +#endif + // _WX_STATBMP_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/statbox.h b/Externals/wxWidgets/include/wx/statbox.h new file mode 100644 index 0000000000..182881c936 --- /dev/null +++ b/Externals/wxWidgets/include/wx/statbox.h @@ -0,0 +1,74 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: statbox.h +// Purpose: wxStaticBox base header +// Author: Julian Smart +// Modified by: +// Created: +// Copyright: (c) Julian Smart +// RCS-ID: $Id: statbox.h 37066 2006-01-23 03:27:34Z MR $ +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_STATBOX_H_BASE_ +#define _WX_STATBOX_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_STATBOX + +#include "wx/control.h" + +extern WXDLLEXPORT_DATA(const wxChar) wxStaticBoxNameStr[]; + +// ---------------------------------------------------------------------------- +// wxStaticBox: a grouping box with a label +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxStaticBoxBase : public wxControl +{ +public: + wxStaticBoxBase() { } + + // overriden base class virtuals + virtual bool AcceptsFocus() const { return false; } + virtual bool HasTransparentBackground() { return true; } + + // implementation only: this is used by wxStaticBoxSizer to account for the + // need for extra space taken by the static box + // + // the top border is the margin at the top (where the title is), + // borderOther is the margin on all other sides + virtual void GetBordersForSizer(int *borderTop, int *borderOther) const + { + const int BORDER = 5; // FIXME: hardcoded value + + *borderTop = GetLabel().empty() ? BORDER : GetCharHeight(); + *borderOther = BORDER; + } + +private: + DECLARE_NO_COPY_CLASS(wxStaticBoxBase) +}; + +#if defined(__WXUNIVERSAL__) + #include "wx/univ/statbox.h" +#elif defined(__WXMSW__) + #include "wx/msw/statbox.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/statbox.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/statbox.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/statbox.h" +#elif defined(__WXMAC__) + #include "wx/mac/statbox.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/statbox.h" +#elif defined(__WXPM__) + #include "wx/os2/statbox.h" +#endif + +#endif // wxUSE_STATBOX + +#endif + // _WX_STATBOX_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/statline.h b/Externals/wxWidgets/include/wx/statline.h new file mode 100644 index 0000000000..eac9078f4a --- /dev/null +++ b/Externals/wxWidgets/include/wx/statline.h @@ -0,0 +1,103 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/statline.h +// Purpose: wxStaticLine class interface +// Author: Vadim Zeitlin +// Created: 28.06.99 +// Version: $Id: statline.h 43874 2006-12-09 14:52:59Z VZ $ +// Copyright: (c) 1999 Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_STATLINE_H_BASE_ +#define _WX_STATLINE_H_BASE_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// this defines wxUSE_STATLINE +#include "wx/defs.h" + +#if wxUSE_STATLINE + +// the base class declaration +#include "wx/control.h" + +// ---------------------------------------------------------------------------- +// global variables +// ---------------------------------------------------------------------------- + +// the default name for objects of class wxStaticLine +extern WXDLLEXPORT_DATA(const wxChar) wxStaticLineNameStr[]; + +// ---------------------------------------------------------------------------- +// wxStaticLine - a line in a dialog +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxStaticLineBase : public wxControl +{ +public: + // constructor + wxStaticLineBase() { } + + // is the line vertical? + bool IsVertical() const { return (GetWindowStyle() & wxLI_VERTICAL) != 0; } + + // get the default size for the "lesser" dimension of the static line + static int GetDefaultSize() { return 2; } + + // overriden base class virtuals + virtual bool AcceptsFocus() const { return false; } + +protected: + // set the right size for the right dimension + wxSize AdjustSize(const wxSize& size) const + { + wxSize sizeReal(size); + if ( IsVertical() ) + { + if ( size.x == wxDefaultCoord ) + sizeReal.x = GetDefaultSize(); + } + else + { + if ( size.y == wxDefaultCoord ) + sizeReal.y = GetDefaultSize(); + } + + return sizeReal; + } + + virtual wxSize DoGetBestSize() const + { + return AdjustSize(wxDefaultSize); + } + + DECLARE_NO_COPY_CLASS(wxStaticLineBase) +}; + +// ---------------------------------------------------------------------------- +// now include the actual class declaration +// ---------------------------------------------------------------------------- + +#if defined(__WXUNIVERSAL__) + #include "wx/univ/statline.h" +#elif defined(__WXMSW__) + #include "wx/msw/statline.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/statline.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/statline.h" +#elif defined(__WXPM__) + #include "wx/os2/statline.h" +#elif defined(__WXMAC__) + #include "wx/mac/statline.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/statline.h" +#else // use generic implementation for all other platforms + #include "wx/generic/statline.h" +#endif + +#endif // wxUSE_STATLINE + +#endif // _WX_STATLINE_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/stattext.h b/Externals/wxWidgets/include/wx/stattext.h new file mode 100644 index 0000000000..99862b22ee --- /dev/null +++ b/Externals/wxWidgets/include/wx/stattext.h @@ -0,0 +1,69 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: stattext.h +// Purpose: wxStaticText base header +// Author: Julian Smart +// Modified by: +// Created: +// Copyright: (c) Julian Smart +// RCS-ID: $Id: stattext.h 37066 2006-01-23 03:27:34Z MR $ +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_STATTEXT_H_BASE_ +#define _WX_STATTEXT_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_STATTEXT + +#include "wx/control.h" + +extern WXDLLEXPORT_DATA(const wxChar) wxStaticTextNameStr[]; + +class WXDLLEXPORT wxStaticTextBase : public wxControl +{ +public: + wxStaticTextBase() { } + + // in wxGTK wxStaticText doesn't derive from wxStaticTextBase so we have to + // declare this function directly in gtk header +#if !defined(__WXGTK__) || defined(__WXUNIVERSAL__) + // wrap the text of the control so that no line is longer than the given + // width (if possible: this function won't break words) + // + // NB: implemented in dlgcmn.cpp for now + void Wrap(int width); +#endif // ! native __WXGTK__ + + // overriden base virtuals + virtual bool AcceptsFocus() const { return false; } + virtual bool HasTransparentBackground() { return true; } + +private: + DECLARE_NO_COPY_CLASS(wxStaticTextBase) +}; + +#if defined(__WXUNIVERSAL__) + #include "wx/univ/stattext.h" +#elif defined(__WXMSW__) + #include "wx/msw/stattext.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/stattext.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/stattext.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/stattext.h" +#elif defined(__WXMAC__) + #include "wx/mac/stattext.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/stattext.h" +#elif defined(__WXPM__) + #include "wx/os2/stattext.h" +#elif defined(__WXPALMOS__) + #include "wx/palmos/stattext.h" +#endif + +#endif // wxUSE_STATTEXT + +#endif + // _WX_STATTEXT_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/statusbr.h b/Externals/wxWidgets/include/wx/statusbr.h new file mode 100644 index 0000000000..5a19e7503e --- /dev/null +++ b/Externals/wxWidgets/include/wx/statusbr.h @@ -0,0 +1,174 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/statusbr.h +// Purpose: wxStatusBar class interface +// Author: Vadim Zeitlin +// Modified by: +// Created: 05.02.00 +// RCS-ID: $Id: statusbr.h 41035 2006-09-06 17:36:22Z PC $ +// Copyright: (c) Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_STATUSBR_H_BASE_ +#define _WX_STATUSBR_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_STATUSBAR + +#include "wx/window.h" +#include "wx/list.h" +#include "wx/dynarray.h" + +extern WXDLLIMPEXP_DATA_CORE(const wxChar) wxStatusBarNameStr[]; + +WX_DECLARE_LIST(wxString, wxListString); + +// ---------------------------------------------------------------------------- +// wxStatusBar constants +// ---------------------------------------------------------------------------- + +// style flags for fields +#define wxSB_NORMAL 0x0000 +#define wxSB_FLAT 0x0001 +#define wxSB_RAISED 0x0002 + +// ---------------------------------------------------------------------------- +// wxStatusBar: a window near the bottom of the frame used for status info +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxStatusBarBase : public wxWindow +{ +public: + wxStatusBarBase(); + + virtual ~wxStatusBarBase(); + + // field count + // ----------- + + // set the number of fields and call SetStatusWidths(widths) if widths are + // given + virtual void SetFieldsCount(int number = 1, const int *widths = NULL); + int GetFieldsCount() const { return m_nFields; } + + // field text + // ---------- + + virtual void SetStatusText(const wxString& text, int number = 0) = 0; + virtual wxString GetStatusText(int number = 0) const = 0; + + void PushStatusText(const wxString& text, int number = 0); + void PopStatusText(int number = 0); + + // fields widths + // ------------- + + // set status field widths as absolute numbers: positive widths mean that + // the field has the specified absolute width, negative widths are + // interpreted as the sizer options, i.e. the extra space (total space + // minus the sum of fixed width fields) is divided between the fields with + // negative width according to the abs value of the width (field with width + // -2 grows twice as much as one with width -1 &c) + virtual void SetStatusWidths(int n, const int widths[]); + + // field styles + // ------------ + + // Set the field style. Use either wxSB_NORMAL (default) for a standard 3D + // border around a field, wxSB_FLAT for no border around a field, so that it + // appears flat or wxSB_POPOUT to make the field appear raised. + // Setting field styles only works on wxMSW + virtual void SetStatusStyles(int n, const int styles[]); + + // geometry + // -------- + + // Get the position and size of the field's internal bounding rectangle + virtual bool GetFieldRect(int i, wxRect& rect) const = 0; + + // sets the minimal vertical size of the status bar + virtual void SetMinHeight(int height) = 0; + + // get the dimensions of the horizontal and vertical borders + virtual int GetBorderX() const = 0; + virtual int GetBorderY() const = 0; + + // don't want status bars to accept the focus at all + virtual bool AcceptsFocus() const { return false; } + +protected: + // set the widths array to NULL + void InitWidths(); + + // free the status widths arrays + void FreeWidths(); + + // reset the widths + void ReinitWidths() { FreeWidths(); InitWidths(); } + + // same, for field styles + void InitStyles(); + void FreeStyles(); + void ReinitStyles() { FreeStyles(); InitStyles(); } + + // same, for text stacks + void InitStacks(); + void FreeStacks(); + void ReinitStacks() { FreeStacks(); InitStacks(); } + + // calculate the real field widths for the given total available size + wxArrayInt CalculateAbsWidths(wxCoord widthTotal) const; + + // use these functions to access the stacks of field strings + wxListString *GetStatusStack(int i) const; + wxListString *GetOrCreateStatusStack(int i); + + // the current number of fields + int m_nFields; + + // the widths of the fields in pixels if !NULL, all fields have the same + // width otherwise + int *m_statusWidths; + + // the styles of the fields + int *m_statusStyles; + + // stacks of previous values for PushStatusText/PopStatusText + // this is created on demand, use GetStatusStack/GetOrCreateStatusStack + wxListString **m_statusTextStacks; + + DECLARE_NO_COPY_CLASS(wxStatusBarBase) +}; + +// ---------------------------------------------------------------------------- +// include the actual wxStatusBar class declaration +// ---------------------------------------------------------------------------- + +#if defined(__WXUNIVERSAL__) + #define wxStatusBarUniv wxStatusBar + + #include "wx/univ/statusbr.h" +#elif defined(__WXPALMOS__) + #define wxStatusBarPalm wxStatusBar + + #include "wx/palmos/statusbr.h" +#elif defined(__WIN32__) && wxUSE_NATIVE_STATUSBAR + #define wxStatusBar95 wxStatusBar + + #include "wx/msw/statbr95.h" +#elif defined(__WXMAC__) + #define wxStatusBarMac wxStatusBar + + #include "wx/generic/statusbr.h" + #include "wx/mac/statusbr.h" +#else + #define wxStatusBarGeneric wxStatusBar + + #include "wx/generic/statusbr.h" +#endif + +#endif // wxUSE_STATUSBAR + +#endif + // _WX_STATUSBR_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/stdpaths.h b/Externals/wxWidgets/include/wx/stdpaths.h new file mode 100644 index 0000000000..beb8b13b7a --- /dev/null +++ b/Externals/wxWidgets/include/wx/stdpaths.h @@ -0,0 +1,179 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/stdpaths.h +// Purpose: declaration of wxStandardPaths class +// Author: Vadim Zeitlin +// Modified by: +// Created: 2004-10-17 +// RCS-ID: $Id: stdpaths.h 43340 2006-11-12 12:58:10Z RR $ +// Copyright: (c) 2004 Vadim Zeitlin <vadim@wxwindows.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_STDPATHS_H_ +#define _WX_STDPATHS_H_ + +#include "wx/defs.h" + +#if wxUSE_STDPATHS + +#include "wx/string.h" +#include "wx/filefn.h" + +// ---------------------------------------------------------------------------- +// wxStandardPaths returns the standard locations in the file system +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxStandardPathsBase +{ +public: + // possible resources categorires + enum ResourceCat + { + // no special category + ResourceCat_None, + + // message catalog resources + ResourceCat_Messages, + + // end of enum marker + ResourceCat_Max + }; + + + // return the global standard paths object + static wxStandardPathsBase& Get(); + + // return the path (directory+filename) of the running executable or + // wxEmptyString if it couldn't be determined. + // The path is returned as an absolute path whenever possible. + // Default implementation only try to use wxApp->argv[0]. + virtual wxString GetExecutablePath() const; + + // return the directory with system config files: + // /etc under Unix, c:\Documents and Settings\All Users\Application Data + // under Windows, /Library/Preferences for Mac + virtual wxString GetConfigDir() const = 0; + + // return the directory for the user config files: + // $HOME under Unix, c:\Documents and Settings\username under Windows, + // ~/Library/Preferences under Mac + // + // only use this if you have a single file to put there, otherwise + // GetUserDataDir() is more appropriate + virtual wxString GetUserConfigDir() const = 0; + + // return the location of the applications global, i.e. not user-specific, + // data files + // + // prefix/share/appname under Unix, c:\Program Files\appname under Windows, + // appname.app/Contents/SharedSupport app bundle directory under Mac + virtual wxString GetDataDir() const = 0; + + // return the location for application data files which are host-specific + // + // same as GetDataDir() except under Unix where it is /etc/appname + virtual wxString GetLocalDataDir() const; + + // return the directory for the user-dependent application data files + // + // $HOME/.appname under Unix, + // c:\Documents and Settings\username\Application Data\appname under Windows + // and ~/Library/Application Support/appname under Mac + virtual wxString GetUserDataDir() const = 0; + + // return the directory for user data files which shouldn't be shared with + // the other machines + // + // same as GetUserDataDir() for all platforms except Windows where it is + // the "Local Settings\Application Data\appname" directory + virtual wxString GetUserLocalDataDir() const; + + // return the directory where the loadable modules (plugins) live + // + // prefix/lib/appname under Unix, program directory under Windows and + // Contents/Plugins app bundle subdirectory under Mac + virtual wxString GetPluginsDir() const = 0; + + // get resources directory: resources are auxiliary files used by the + // application and include things like image and sound files + // + // same as GetDataDir() for all platforms except Mac where it returns + // Contents/Resources subdirectory of the app bundle + virtual wxString GetResourcesDir() const { return GetDataDir(); } + + // get localized resources directory containing the resource files of the + // specified category for the given language + // + // in general this is just GetResourcesDir()/lang under Windows and Unix + // and GetResourcesDir()/lang.lproj under Mac but is something quite + // different under Unix for message catalog category (namely the standard + // prefix/share/locale/lang/LC_MESSAGES) + virtual wxString + GetLocalizedResourcesDir(const wxChar *lang, + ResourceCat WXUNUSED(category) + = ResourceCat_None) const + { + return GetResourcesDir() + wxFILE_SEP_PATH + lang; + } + + // return the "Documents" directory for the current user + // + // C:\Documents and Settings\username\Documents under Windows, + // $HOME under Unix and ~/Documents under Mac + virtual wxString GetDocumentsDir() const; + + // return the temporary directory for the current user + virtual wxString GetTempDir() const; + + + // virtual dtor for the base class + virtual ~wxStandardPathsBase(); + +protected: + // append "/appname" suffix if the app name is set (doesn't append the + // slash if dir already ends with a slash or dot) + static wxString AppendAppName(const wxString& dir); +}; + +#if defined(__WXMSW__) + #include "wx/msw/stdpaths.h" +// We want CoreFoundation paths on both CarbonLib and Darwin (for all ports) +#elif defined(__WXMAC__) || defined(__DARWIN__) + #include "wx/mac/corefoundation/stdpaths.h" +#elif defined(__OS2__) + #include "wx/os2/stdpaths.h" +#elif defined(__UNIX__) + #include "wx/unix/stdpaths.h" +#elif defined(__PALMOS__) + #include "wx/palmos/stdpaths.h" +#else + +// ---------------------------------------------------------------------------- +// Minimal generic implementation +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxStandardPaths : public wxStandardPathsBase +{ +public: + void SetInstallPrefix(const wxString& prefix) { m_prefix = prefix; } + wxString GetInstallPrefix() const { return m_prefix; } + + virtual wxString GetExecutablePath() const { return m_prefix; } + virtual wxString GetConfigDir() const { return m_prefix; } + virtual wxString GetUserConfigDir() const { return m_prefix; } + virtual wxString GetDataDir() const { return m_prefix; } + virtual wxString GetLocalDataDir() const { return m_prefix; } + virtual wxString GetUserDataDir() const { return m_prefix; } + virtual wxString GetPluginsDir() const { return m_prefix; } + virtual wxString GetDocumentsDir() const { return m_prefix; } + +private: + wxString m_prefix; +}; + +#endif + +#endif // wxUSE_STDPATHS + +#endif // _WX_STDPATHS_H_ + diff --git a/Externals/wxWidgets/include/wx/stockitem.h b/Externals/wxWidgets/include/wx/stockitem.h new file mode 100644 index 0000000000..31ac5213af --- /dev/null +++ b/Externals/wxWidgets/include/wx/stockitem.h @@ -0,0 +1,73 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/stockitem.h +// Purpose: stock items helpers (privateh header) +// Author: Vaclav Slavik +// Modified by: +// Created: 2004-08-15 +// RCS-ID: $Id: stockitem.h 42935 2006-11-02 09:51:49Z JS $ +// Copyright: (c) Vaclav Slavik, 2004 +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_STOCKITEM_H_ +#define _WX_STOCKITEM_H_ + +#include "wx/defs.h" +#include "wx/wxchar.h" +#include "wx/string.h" +#include "wx/accel.h" + +// ---------------------------------------------------------------------------- +// Helper functions for stock items handling: +// ---------------------------------------------------------------------------- + +// Returns true if the ID is in the list of recognized stock actions +WXDLLEXPORT bool wxIsStockID(wxWindowID id); + +// Returns true of the label is empty or label of a stock button with +// given ID +WXDLLEXPORT bool wxIsStockLabel(wxWindowID id, const wxString& label); + +enum wxStockLabelQueryFlag +{ + wxSTOCK_NOFLAGS = 0, + + wxSTOCK_WITH_MNEMONIC = 1, + wxSTOCK_WITH_ACCELERATOR = 2 +}; + +// Returns label that should be used for given stock UI element (e.g. "&OK" +// for wxSTOCK_OK); if wxSTOCK_WITH_MNEMONIC is given, the & character +// is included; if wxSTOCK_WITH_ACCELERATOR is given, the stock accelerator +// for given ID is concatenated to the label using \t as separator +WXDLLEXPORT wxString wxGetStockLabel(wxWindowID id, + long flags = wxSTOCK_WITH_MNEMONIC); + +#if wxUSE_ACCEL + + // Returns the accelerator that should be used for given stock UI element + // (e.g. "Ctrl+x" for wxSTOCK_EXIT) + WXDLLEXPORT wxAcceleratorEntry wxGetStockAccelerator(wxWindowID id); + +#endif + +// wxStockHelpStringClient conceptually works like wxArtClient: it gives a hint to +// wxGetStockHelpString() about the context where the help string is to be used +enum wxStockHelpStringClient +{ + wxSTOCK_MENU // help string to use for menu items +}; + +// Returns an help string for the given stock UI element and for the given "context". +WXDLLEXPORT wxString wxGetStockHelpString(wxWindowID id, + wxStockHelpStringClient client = wxSTOCK_MENU); + + +#ifdef __WXGTK20__ + +// Translates stock ID to GTK+'s stock item string indentifier: +WXDLLEXPORT const char *wxGetStockGtkID(wxWindowID id); + +#endif + +#endif // _WX_STOCKITEM_H_ diff --git a/Externals/wxWidgets/include/wx/stopwatch.h b/Externals/wxWidgets/include/wx/stopwatch.h new file mode 100644 index 0000000000..13bab5d3b8 --- /dev/null +++ b/Externals/wxWidgets/include/wx/stopwatch.h @@ -0,0 +1,102 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/stopwatch.h +// Purpose: wxStopWatch and global time-related functions +// Author: Julian Smart (wxTimer), Sylvain Bougnoux (wxStopWatch) +// Created: 26.06.03 (extracted from wx/timer.h) +// RCS-ID: $Id: stopwatch.h 40624 2006-08-16 12:17:05Z MW $ +// Copyright: (c) 1998-2003 Julian Smart, Sylvain Bougnoux +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_STOPWATCH_H_ +#define _WX_STOPWATCH_H_ + +#include "wx/defs.h" +#include "wx/longlong.h" + +// ---------------------------------------------------------------------------- +// wxStopWatch: measure time intervals with up to 1ms resolution +// ---------------------------------------------------------------------------- + +#if wxUSE_STOPWATCH + +class WXDLLIMPEXP_BASE wxStopWatch +{ +public: + // ctor starts the stop watch + wxStopWatch() { m_pauseCount = 0; Start(); } + + // start the stop watch at the moment t0 + void Start(long t0 = 0); + + // pause the stop watch + void Pause() + { + if ( m_pauseCount++ == 0 ) + m_pause = GetElapsedTime(); + } + + // resume it + void Resume() + { + wxASSERT_MSG( m_pauseCount > 0, + _T("Resuming stop watch which is not paused") ); + + if ( --m_pauseCount == 0 ) + Start(m_pause); + } + + // get elapsed time since the last Start() in milliseconds + long Time() const; + +protected: + // returns the elapsed time since t0 + long GetElapsedTime() const; + +private: + // the time of the last Start() + wxLongLong m_t0; + + // the time of the last Pause() (only valid if m_pauseCount > 0) + long m_pause; + + // if > 0, the stop watch is paused, otherwise it is running + int m_pauseCount; +}; + +#endif // wxUSE_STOPWATCH + +#if wxUSE_LONGLONG && WXWIN_COMPATIBILITY_2_6 + + // Starts a global timer + // -- DEPRECATED: use wxStopWatch instead + wxDEPRECATED( void WXDLLIMPEXP_BASE wxStartTimer() ); + + // Gets elapsed milliseconds since last wxStartTimer or wxGetElapsedTime + // -- DEPRECATED: use wxStopWatch instead + wxDEPRECATED( long WXDLLIMPEXP_BASE wxGetElapsedTime(bool resetTimer = true) ); + +#endif // wxUSE_LONGLONG && WXWIN_COMPATIBILITY_2_6 + +// ---------------------------------------------------------------------------- +// global time functions +// ---------------------------------------------------------------------------- + +// Get number of seconds since local time 00:00:00 Jan 1st 1970. +extern long WXDLLIMPEXP_BASE wxGetLocalTime(); + +// Get number of seconds since GMT 00:00:00, Jan 1st 1970. +extern long WXDLLIMPEXP_BASE wxGetUTCTime(); + +#if wxUSE_LONGLONG + typedef wxLongLong wxMilliClock_t; +#else + typedef double wxMilliClock_t; +#endif // wxUSE_LONGLONG + +// Get number of milliseconds since local time 00:00:00 Jan 1st 1970 +extern wxMilliClock_t WXDLLIMPEXP_BASE wxGetLocalTimeMillis(); + +#define wxGetCurrentTime() wxGetLocalTime() + +#endif // _WX_STOPWATCH_H_ diff --git a/Externals/wxWidgets/include/wx/strconv.h b/Externals/wxWidgets/include/wx/strconv.h new file mode 100644 index 0000000000..7d167fab73 --- /dev/null +++ b/Externals/wxWidgets/include/wx/strconv.h @@ -0,0 +1,553 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: strconv.h +// Purpose: conversion routines for char sets any Unicode +// Author: Ove Kaaven, Robert Roebling, Vadim Zeitlin +// Modified by: +// Created: 29/01/98 +// RCS-ID: $Id: strconv.h 45893 2007-05-08 20:05:16Z VZ $ +// Copyright: (c) 1998 Ove Kaaven, Robert Roebling +// (c) 1998-2006 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_STRCONV_H_ +#define _WX_STRCONV_H_ + +#include "wx/defs.h" +#include "wx/wxchar.h" +#include "wx/buffer.h" + +#ifdef __DIGITALMARS__ +#include "typeinfo.h" +#endif + +#if defined(__VISAGECPP__) && __IBMCPP__ >= 400 +# undef __BSEXCPT__ +#endif + +#include <stdlib.h> + +#if wxUSE_WCHAR_T + +// the error value returned by wxMBConv methods +#define wxCONV_FAILED ((size_t)-1) + +// the default value for some length parameters meaning that the string is +// NUL-terminated +#define wxNO_LEN ((size_t)-1) + +// ---------------------------------------------------------------------------- +// wxMBConv (abstract base class for conversions) +// ---------------------------------------------------------------------------- + +// When deriving a new class from wxMBConv you must reimplement ToWChar() and +// FromWChar() methods which are not pure virtual only for historical reasons, +// don't let the fact that the existing classes implement MB2WC/WC2MB() instead +// confuse you. +// +// You also have to implement Clone() to allow copying the conversions +// polymorphically. +// +// And you might need to override GetMBNulLen() as well. +class WXDLLIMPEXP_BASE wxMBConv +{ +public: + // The functions doing actual conversion from/to narrow to/from wide + // character strings. + // + // On success, the return value is the length (i.e. the number of + // characters, not bytes) of the converted string including any trailing + // L'\0' or (possibly multiple) '\0'(s). If the conversion fails or if + // there is not enough space for everything, including the trailing NUL + // character(s), in the output buffer, wxCONV_FAILED is returned. + // + // In the special case when dstLen is 0 (outputBuf may be NULL then) the + // return value is the length of the needed buffer but nothing happens + // otherwise. If srcLen is wxNO_LEN, the entire string, up to and + // including the trailing NUL(s), is converted, otherwise exactly srcLen + // bytes are. + // + // Typical usage: + // + // size_t dstLen = conv.ToWChar(NULL, 0, src); + // if ( dstLen != wxCONV_FAILED ) + // ... handle error ... + // wchar_t *wbuf = new wchar_t[dstLen]; + // conv.ToWChar(wbuf, dstLen, src); + // + virtual size_t ToWChar(wchar_t *dst, size_t dstLen, + const char *src, size_t srcLen = wxNO_LEN) const; + + virtual size_t FromWChar(char *dst, size_t dstLen, + const wchar_t *src, size_t srcLen = wxNO_LEN) const; + + + // Convenience functions for translating NUL-terminated strings: returns + // the buffer containing the converted string or NULL pointer if the + // conversion failed. + const wxWCharBuffer cMB2WC(const char *in) const; + const wxCharBuffer cWC2MB(const wchar_t *in) const; + + // Convenience functions for converting strings which may contain embedded + // NULs and don't have to be NUL-terminated. + // + // inLen is the length of the buffer including trailing NUL if any: if the + // last 4 bytes of the buffer are all NULs, these functions are more + // efficient as they avoid copying the string, but otherwise a copy is made + // internally which could be quite bad for (very) long strings. + // + // outLen receives, if not NULL, the length of the converted string or 0 if + // the conversion failed (returning 0 and not -1 in this case makes it + // difficult to distinguish between failed conversion and empty input but + // this is done for backwards compatibility) + const wxWCharBuffer + cMB2WC(const char *in, size_t inLen, size_t *outLen) const; + const wxCharBuffer + cWC2MB(const wchar_t *in, size_t inLen, size_t *outLen) const; + + // convenience functions for converting MB or WC to/from wxWin default +#if wxUSE_UNICODE + const wxWCharBuffer cMB2WX(const char *psz) const { return cMB2WC(psz); } + const wxCharBuffer cWX2MB(const wchar_t *psz) const { return cWC2MB(psz); } + const wchar_t* cWC2WX(const wchar_t *psz) const { return psz; } + const wchar_t* cWX2WC(const wchar_t *psz) const { return psz; } +#else // ANSI + const char* cMB2WX(const char *psz) const { return psz; } + const char* cWX2MB(const char *psz) const { return psz; } + const wxCharBuffer cWC2WX(const wchar_t *psz) const { return cWC2MB(psz); } + const wxWCharBuffer cWX2WC(const char *psz) const { return cMB2WC(psz); } +#endif // Unicode/ANSI + + // this function is used in the implementation of cMB2WC() to distinguish + // between the following cases: + // + // a) var width encoding with strings terminated by a single NUL + // (usual multibyte encodings): return 1 in this case + // b) fixed width encoding with 2 bytes/char and so terminated by + // 2 NULs (UTF-16/UCS-2 and variants): return 2 in this case + // c) fixed width encoding with 4 bytes/char and so terminated by + // 4 NULs (UTF-32/UCS-4 and variants): return 4 in this case + // + // anything else is not supported currently and -1 should be returned + virtual size_t GetMBNulLen() const { return 1; } + + // return the maximal value currently returned by GetMBNulLen() for any + // encoding + static size_t GetMaxMBNulLen() { return 4 /* for UTF-32 */; } + + + // The old conversion functions. The existing classes currently mostly + // implement these ones but we're in transition to using To/FromWChar() + // instead and any new classes should implement just the new functions. + // For now, however, we provide default implementation of To/FromWChar() in + // this base class in terms of MB2WC/WC2MB() to avoid having to rewrite all + // the conversions at once. + // + // On success, the return value is the length (i.e. the number of + // characters, not bytes) not counting the trailing NUL(s) of the converted + // string. On failure, (size_t)-1 is returned. In the special case when + // outputBuf is NULL the return value is the same one but nothing is + // written to the buffer. + // + // Note that outLen is the length of the output buffer, not the length of + // the input (which is always supposed to be terminated by one or more + // NULs, as appropriate for the encoding)! + virtual size_t MB2WC(wchar_t *out, const char *in, size_t outLen) const; + virtual size_t WC2MB(char *out, const wchar_t *in, size_t outLen) const; + + + // make a heap-allocated copy of this object + virtual wxMBConv *Clone() const = 0; + + // virtual dtor for any base class + virtual ~wxMBConv(); +}; + +// ---------------------------------------------------------------------------- +// wxMBConvLibc uses standard mbstowcs() and wcstombs() functions for +// conversion (hence it depends on the current locale) +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxMBConvLibc : public wxMBConv +{ +public: + virtual size_t MB2WC(wchar_t *outputBuf, const char *psz, size_t outputSize) const; + virtual size_t WC2MB(char *outputBuf, const wchar_t *psz, size_t outputSize) const; + + virtual wxMBConv *Clone() const { return new wxMBConvLibc; } +}; + +#ifdef __UNIX__ + +// ---------------------------------------------------------------------------- +// wxConvBrokenFileNames is made for Unix in Unicode mode when +// files are accidentally written in an encoding which is not +// the system encoding. Typically, the system encoding will be +// UTF8 but there might be files stored in ISO8859-1 on disk. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxConvBrokenFileNames : public wxMBConv +{ +public: + wxConvBrokenFileNames(const wxChar *charset); + wxConvBrokenFileNames(const wxConvBrokenFileNames& conv) + : wxMBConv(), + m_conv(conv.m_conv ? conv.m_conv->Clone() : NULL) + { + } + virtual ~wxConvBrokenFileNames() { delete m_conv; } + + virtual size_t MB2WC(wchar_t *out, const char *in, size_t outLen) const + { + return m_conv->MB2WC(out, in, outLen); + } + + virtual size_t WC2MB(char *out, const wchar_t *in, size_t outLen) const + { + return m_conv->WC2MB(out, in, outLen); + } + + virtual size_t GetMBNulLen() const + { + // cast needed to call a private function + return m_conv->GetMBNulLen(); + } + + virtual wxMBConv *Clone() const { return new wxConvBrokenFileNames(*this); } + +private: + // the conversion object we forward to + wxMBConv *m_conv; + + DECLARE_NO_ASSIGN_CLASS(wxConvBrokenFileNames) +}; + +#endif // __UNIX__ + +// ---------------------------------------------------------------------------- +// wxMBConvUTF7 (for conversion using UTF7 encoding) +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxMBConvUTF7 : public wxMBConv +{ +public: + virtual size_t MB2WC(wchar_t *outputBuf, const char *psz, size_t outputSize) const; + virtual size_t WC2MB(char *outputBuf, const wchar_t *psz, size_t outputSize) const; + + virtual wxMBConv *Clone() const { return new wxMBConvUTF7; } +}; + +// ---------------------------------------------------------------------------- +// wxMBConvUTF8 (for conversion using UTF8 encoding) +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxMBConvUTF8 : public wxMBConv +{ +public: + enum + { + MAP_INVALID_UTF8_NOT = 0, + MAP_INVALID_UTF8_TO_PUA = 1, + MAP_INVALID_UTF8_TO_OCTAL = 2 + }; + + wxMBConvUTF8(int options = MAP_INVALID_UTF8_NOT) : m_options(options) { } + virtual size_t MB2WC(wchar_t *outputBuf, const char *psz, size_t outputSize) const; + virtual size_t WC2MB(char *outputBuf, const wchar_t *psz, size_t outputSize) const; + + virtual wxMBConv *Clone() const { return new wxMBConvUTF8(m_options); } + +private: + int m_options; +}; + +// ---------------------------------------------------------------------------- +// wxMBConvUTF16Base: for both LE and BE variants +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxMBConvUTF16Base : public wxMBConv +{ +public: + enum { BYTES_PER_CHAR = 2 }; + + virtual size_t GetMBNulLen() const { return BYTES_PER_CHAR; } + +protected: + // return the length of the buffer using srcLen if it's not wxNO_LEN and + // computing the length ourselves if it is; also checks that the length is + // even if specified as we need an entire number of UTF-16 characters and + // returns wxNO_LEN which indicates error if it is odd + static size_t GetLength(const char *src, size_t srcLen); +}; + +// ---------------------------------------------------------------------------- +// wxMBConvUTF16LE (for conversion using UTF16 Little Endian encoding) +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxMBConvUTF16LE : public wxMBConvUTF16Base +{ +public: + virtual size_t ToWChar(wchar_t *dst, size_t dstLen, + const char *src, size_t srcLen = wxNO_LEN) const; + virtual size_t FromWChar(char *dst, size_t dstLen, + const wchar_t *src, size_t srcLen = wxNO_LEN) const; + virtual wxMBConv *Clone() const { return new wxMBConvUTF16LE; } +}; + +// ---------------------------------------------------------------------------- +// wxMBConvUTF16BE (for conversion using UTF16 Big Endian encoding) +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxMBConvUTF16BE : public wxMBConvUTF16Base +{ +public: + virtual size_t ToWChar(wchar_t *dst, size_t dstLen, + const char *src, size_t srcLen = wxNO_LEN) const; + virtual size_t FromWChar(char *dst, size_t dstLen, + const wchar_t *src, size_t srcLen = wxNO_LEN) const; + virtual wxMBConv *Clone() const { return new wxMBConvUTF16BE; } +}; + +// ---------------------------------------------------------------------------- +// wxMBConvUTF32Base: base class for both LE and BE variants +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxMBConvUTF32Base : public wxMBConv +{ +public: + enum { BYTES_PER_CHAR = 4 }; + + virtual size_t GetMBNulLen() const { return BYTES_PER_CHAR; } + +protected: + // this is similar to wxMBConvUTF16Base method with the same name except + // that, of course, it verifies that length is divisible by 4 if given and + // not by 2 + static size_t GetLength(const char *src, size_t srcLen); +}; + +// ---------------------------------------------------------------------------- +// wxMBConvUTF32LE (for conversion using UTF32 Little Endian encoding) +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxMBConvUTF32LE : public wxMBConvUTF32Base +{ +public: + virtual size_t ToWChar(wchar_t *dst, size_t dstLen, + const char *src, size_t srcLen = wxNO_LEN) const; + virtual size_t FromWChar(char *dst, size_t dstLen, + const wchar_t *src, size_t srcLen = wxNO_LEN) const; + virtual wxMBConv *Clone() const { return new wxMBConvUTF32LE; } +}; + +// ---------------------------------------------------------------------------- +// wxMBConvUTF32BE (for conversion using UTF32 Big Endian encoding) +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxMBConvUTF32BE : public wxMBConvUTF32Base +{ +public: + virtual size_t ToWChar(wchar_t *dst, size_t dstLen, + const char *src, size_t srcLen = wxNO_LEN) const; + virtual size_t FromWChar(char *dst, size_t dstLen, + const wchar_t *src, size_t srcLen = wxNO_LEN) const; + virtual wxMBConv *Clone() const { return new wxMBConvUTF32BE; } +}; + +// ---------------------------------------------------------------------------- +// wxCSConv (for conversion based on loadable char sets) +// ---------------------------------------------------------------------------- + +#include "wx/fontenc.h" + +class WXDLLIMPEXP_BASE wxCSConv : public wxMBConv +{ +public: + // we can be created either from charset name or from an encoding constant + // but we can't have both at once + wxCSConv(const wxChar *charset); + wxCSConv(wxFontEncoding encoding); + + wxCSConv(const wxCSConv& conv); + virtual ~wxCSConv(); + + wxCSConv& operator=(const wxCSConv& conv); + + virtual size_t ToWChar(wchar_t *dst, size_t dstLen, + const char *src, size_t srcLen = wxNO_LEN) const; + virtual size_t FromWChar(char *dst, size_t dstLen, + const wchar_t *src, size_t srcLen = wxNO_LEN) const; + virtual size_t MB2WC(wchar_t *outputBuf, const char *psz, size_t outputSize) const; + virtual size_t WC2MB(char *outputBuf, const wchar_t *psz, size_t outputSize) const; + virtual size_t GetMBNulLen() const; + + virtual wxMBConv *Clone() const { return new wxCSConv(*this); } + + void Clear(); + +#if wxABI_VERSION >= 20802 + // return true if the conversion could be initilized successfully + bool IsOk() const; +#endif // wx 2.8.2+ + +private: + // common part of all ctors + void Init(); + + // creates m_convReal if necessary + void CreateConvIfNeeded() const; + + // do create m_convReal (unconditionally) + wxMBConv *DoCreate() const; + + // set the name (may be only called when m_name == NULL), makes copy of + // charset string + void SetName(const wxChar *charset); + + + // note that we can't use wxString here because of compilation + // dependencies: we're included from wx/string.h + wxChar *m_name; + wxFontEncoding m_encoding; + + // use CreateConvIfNeeded() before accessing m_convReal! + wxMBConv *m_convReal; + bool m_deferred; +}; + + +// ---------------------------------------------------------------------------- +// declare predefined conversion objects +// ---------------------------------------------------------------------------- + +// conversion to be used with all standard functions affected by locale, e.g. +// strtol(), strftime(), ... +extern WXDLLIMPEXP_DATA_BASE(wxMBConv&) wxConvLibc; + +// conversion ISO-8859-1/UTF-7/UTF-8 <-> wchar_t +extern WXDLLIMPEXP_DATA_BASE(wxCSConv&) wxConvISO8859_1; +extern WXDLLIMPEXP_DATA_BASE(wxMBConvUTF7&) wxConvUTF7; +extern WXDLLIMPEXP_DATA_BASE(wxMBConvUTF8&) wxConvUTF8; + +// conversion used for the file names on the systems where they're not Unicode +// (basically anything except Windows) +// +// this is used by all file functions, can be changed by the application +// +// by default UTF-8 under Mac OS X and wxConvLibc elsewhere (but it's not used +// under Windows normally) +extern WXDLLIMPEXP_DATA_BASE(wxMBConv *) wxConvFileName; + +// backwards compatible define +#define wxConvFile (*wxConvFileName) + +// the current conversion object, may be set to any conversion, is used by +// default in a couple of places inside wx (initially same as wxConvLibc) +extern WXDLLIMPEXP_DATA_BASE(wxMBConv *) wxConvCurrent; + +// the conversion corresponding to the current locale +extern WXDLLIMPEXP_DATA_BASE(wxCSConv&) wxConvLocal; + +// the conversion corresponding to the encoding of the standard UI elements +// +// by default this is the same as wxConvLocal but may be changed if the program +// needs to use a fixed encoding +extern WXDLLIMPEXP_DATA_BASE(wxMBConv *) wxConvUI; + +// ---------------------------------------------------------------------------- +// endianness-dependent conversions +// ---------------------------------------------------------------------------- + +#ifdef WORDS_BIGENDIAN + typedef wxMBConvUTF16BE wxMBConvUTF16; + typedef wxMBConvUTF32BE wxMBConvUTF32; +#else + typedef wxMBConvUTF16LE wxMBConvUTF16; + typedef wxMBConvUTF32LE wxMBConvUTF32; +#endif + +// ---------------------------------------------------------------------------- +// filename conversion macros +// ---------------------------------------------------------------------------- + +// filenames are multibyte on Unix and widechar on Windows +#if defined(__UNIX__) || defined(__WXMAC__) + #define wxMBFILES 1 +#else + #define wxMBFILES 0 +#endif + +#if wxMBFILES && wxUSE_UNICODE + #define wxFNCONV(name) wxConvFileName->cWX2MB(name) + #define wxFNSTRINGCAST wxMBSTRINGCAST +#else +#if defined( __WXOSX__ ) && wxMBFILES + #define wxFNCONV(name) wxConvFileName->cWC2MB( wxConvLocal.cWX2WC(name) ) +#else + #define wxFNCONV(name) name +#endif + #define wxFNSTRINGCAST WXSTRINGCAST +#endif + +#else // !wxUSE_WCHAR_T + +// ---------------------------------------------------------------------------- +// stand-ins in absence of wchar_t +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxMBConv +{ +public: + const char* cMB2WX(const char *psz) const { return psz; } + const char* cWX2MB(const char *psz) const { return psz; } + wxMBConv *Clone() const { return NULL; } +}; + +#define wxConvFile wxConvLocal +#define wxConvUI wxConvCurrent + +typedef wxMBConv wxCSConv; + +extern WXDLLIMPEXP_DATA_BASE(wxMBConv) wxConvLibc, + wxConvLocal, + wxConvISO8859_1, + wxConvUTF8; +extern WXDLLIMPEXP_DATA_BASE(wxMBConv *) wxConvCurrent; + +#define wxFNCONV(name) name +#define wxFNSTRINGCAST WXSTRINGCAST + +#endif // wxUSE_WCHAR_T/!wxUSE_WCHAR_T + +// ---------------------------------------------------------------------------- +// macros for the most common conversions +// ---------------------------------------------------------------------------- + +#if wxUSE_UNICODE + #define wxConvertWX2MB(s) wxConvCurrent->cWX2MB(s) + #define wxConvertMB2WX(s) wxConvCurrent->cMB2WX(s) + +#if wxABI_VERSION >= 20802 + // these functions should be used when the conversions really, really have + // to succeed (usually because we pass their results to a standard C + // function which would crash if we passed NULL to it), so these functions + // always return a valid pointer if their argument is non-NULL + + // this function safety is achieved by trying wxConvLibc first, wxConvUTF8 + // next if it fails and, finally, wxConvISO8859_1 which always succeeds + extern WXDLLIMPEXP_BASE wxWCharBuffer wxSafeConvertMB2WX(const char *s); + + // this function uses wxConvLibc and wxConvUTF8(MAP_INVALID_UTF8_TO_OCTAL) + // if it fails + extern WXDLLIMPEXP_BASE wxCharBuffer wxSafeConvertWX2MB(const wchar_t *ws); +#endif // wxABI 2.8.2+ +#else // ANSI + // no conversions to do + #define wxConvertWX2MB(s) (s) + #define wxConvertMB2WX(s) (s) + #define wxSafeConvertMB2WX(s) (s) + #define wxSafeConvertWX2MB(s) (s) +#endif // Unicode/ANSI + +#endif // _WX_STRCONV_H_ + diff --git a/Externals/wxWidgets/include/wx/stream.h b/Externals/wxWidgets/include/wx/stream.h new file mode 100644 index 0000000000..dea2085305 --- /dev/null +++ b/Externals/wxWidgets/include/wx/stream.h @@ -0,0 +1,609 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/stream.h +// Purpose: stream classes +// Author: Guilhem Lavaux, Guillermo Rodriguez Garcia, Vadim Zeitlin +// Modified by: +// Created: 11/07/98 +// RCS-ID: $Id: stream.h 42623 2006-10-29 17:00:07Z MW $ +// Copyright: (c) Guilhem Lavaux +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_WXSTREAM_H__ +#define _WX_WXSTREAM_H__ + +#include "wx/defs.h" + +#if wxUSE_STREAMS + +#include <stdio.h> +#include "wx/object.h" +#include "wx/string.h" +#include "wx/filefn.h" // for wxFileOffset, wxInvalidOffset and wxSeekMode + +class WXDLLIMPEXP_BASE wxStreamBase; +class WXDLLIMPEXP_BASE wxInputStream; +class WXDLLIMPEXP_BASE wxOutputStream; + +typedef wxInputStream& (*__wxInputManip)(wxInputStream&); +typedef wxOutputStream& (*__wxOutputManip)(wxOutputStream&); + +WXDLLIMPEXP_BASE wxOutputStream& wxEndL(wxOutputStream& o_stream); + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +enum wxStreamError +{ + wxSTREAM_NO_ERROR = 0, // stream is in good state + wxSTREAM_EOF, // EOF reached in Read() or similar + wxSTREAM_WRITE_ERROR, // generic write error + wxSTREAM_READ_ERROR // generic read error +}; + +const int wxEOF = -1; + +// ============================================================================ +// base stream classes: wxInputStream and wxOutputStream +// ============================================================================ + +// --------------------------------------------------------------------------- +// wxStreamBase: common (but non virtual!) base for all stream classes +// --------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxStreamBase +{ +public: + wxStreamBase(); + virtual ~wxStreamBase(); + + // error testing + wxStreamError GetLastError() const { return m_lasterror; } + virtual bool IsOk() const { return GetLastError() == wxSTREAM_NO_ERROR; } + bool operator!() const { return !IsOk(); } + + // reset the stream state + void Reset() { m_lasterror = wxSTREAM_NO_ERROR; } + + // this doesn't make sense for all streams, always test its return value + virtual size_t GetSize() const; + virtual wxFileOffset GetLength() const { return wxInvalidOffset; } + + // returns true if the streams supports seeking to arbitrary offsets + virtual bool IsSeekable() const { return false; } + +protected: + virtual wxFileOffset OnSysSeek(wxFileOffset seek, wxSeekMode mode); + virtual wxFileOffset OnSysTell() const; + + size_t m_lastcount; + wxStreamError m_lasterror; + + friend class wxStreamBuffer; + + DECLARE_NO_COPY_CLASS(wxStreamBase) +}; + +// ---------------------------------------------------------------------------- +// wxInputStream: base class for the input streams +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxInputStream : public wxStreamBase +{ +public: + // ctor and dtor, nothing exciting + wxInputStream(); + virtual ~wxInputStream(); + + + // IO functions + // ------------ + + // return a character from the stream without removing it, i.e. it will + // still be returned by the next call to GetC() + // + // blocks until something appears in the stream if necessary, if nothing + // ever does (i.e. EOF) LastRead() will return 0 (and the return value is + // undefined), otherwise 1 + virtual char Peek(); + + // return one byte from the stream, blocking until it appears if + // necessary + // + // on success returns a value between 0 - 255, or wxEOF on EOF or error. + int GetC(); + + // read at most the given number of bytes from the stream + // + // there are 2 possible situations here: either there is nothing at all in + // the stream right now in which case Read() blocks until something appears + // (use CanRead() to avoid this) or there is already some data available in + // the stream and then Read() doesn't block but returns just the data it + // can read without waiting for more + // + // in any case, if there are not enough bytes in the stream right now, + // LastRead() value will be less than size but greater than 0. If it is 0, + // it means that EOF has been reached. + virtual wxInputStream& Read(void *buffer, size_t size); + + // copy the entire contents of this stream into streamOut, stopping only + // when EOF is reached or an error occurs + wxInputStream& Read(wxOutputStream& streamOut); + + + // status functions + // ---------------- + + // returns the number of bytes read by the last call to Read(), GetC() or + // Peek() + // + // this should be used to discover whether that call succeeded in reading + // all the requested data or not + virtual size_t LastRead() const { return wxStreamBase::m_lastcount; } + + // returns true if some data is available in the stream right now, so that + // calling Read() wouldn't block + virtual bool CanRead() const; + + // is the stream at EOF? + // + // note that this cannot be really implemented for all streams and + // CanRead() is more reliable than Eof() + virtual bool Eof() const; + + + // write back buffer + // ----------------- + + // put back the specified number of bytes into the stream, they will be + // fetched by the next call to the read functions + // + // returns the number of bytes really stuffed back + size_t Ungetch(const void *buffer, size_t size); + + // put back the specified character in the stream + // + // returns true if ok, false on error + bool Ungetch(char c); + + + // position functions + // ------------------ + + // move the stream pointer to the given position (if the stream supports + // it) + // + // returns wxInvalidOffset on error + virtual wxFileOffset SeekI(wxFileOffset pos, wxSeekMode mode = wxFromStart); + + // return the current position of the stream pointer or wxInvalidOffset + virtual wxFileOffset TellI() const; + + + // stream-like operators + // --------------------- + + wxInputStream& operator>>(wxOutputStream& out) { return Read(out); } + wxInputStream& operator>>(__wxInputManip func) { return func(*this); } + +protected: + // do read up to size bytes of data into the provided buffer + // + // this method should return 0 if EOF has been reached or an error occurred + // (m_lasterror should be set accordingly as well) or the number of bytes + // read + virtual size_t OnSysRead(void *buffer, size_t size) = 0; + + // write-back buffer support + // ------------------------- + + // return the pointer to a buffer big enough to hold sizeNeeded bytes + char *AllocSpaceWBack(size_t sizeNeeded); + + // read up to size data from the write back buffer, return the number of + // bytes read + size_t GetWBack(void *buf, size_t size); + + // write back buffer or NULL if none + char *m_wback; + + // the size of the buffer + size_t m_wbacksize; + + // the current position in the buffer + size_t m_wbackcur; + + friend class wxStreamBuffer; + + DECLARE_NO_COPY_CLASS(wxInputStream) +}; + +// ---------------------------------------------------------------------------- +// wxOutputStream: base for the output streams +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxOutputStream : public wxStreamBase +{ +public: + wxOutputStream(); + virtual ~wxOutputStream(); + + void PutC(char c); + virtual wxOutputStream& Write(const void *buffer, size_t size); + wxOutputStream& Write(wxInputStream& stream_in); + + virtual wxFileOffset SeekO(wxFileOffset pos, wxSeekMode mode = wxFromStart); + virtual wxFileOffset TellO() const; + + virtual size_t LastWrite() const { return wxStreamBase::m_lastcount; } + + virtual void Sync(); + virtual bool Close() { return true; } + + wxOutputStream& operator<<(wxInputStream& out) { return Write(out); } + wxOutputStream& operator<<( __wxOutputManip func) { return func(*this); } + +protected: + // to be implemented in the derived classes (it should have been pure + // virtual) + virtual size_t OnSysWrite(const void *buffer, size_t bufsize); + + friend class wxStreamBuffer; + + DECLARE_NO_COPY_CLASS(wxOutputStream) +}; + +// ============================================================================ +// helper stream classes +// ============================================================================ + +// --------------------------------------------------------------------------- +// A stream for measuring streamed output +// --------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxCountingOutputStream : public wxOutputStream +{ +public: + wxCountingOutputStream(); + + wxFileOffset GetLength() const; + bool Ok() const { return IsOk(); } + bool IsOk() const { return true; } + +protected: + virtual size_t OnSysWrite(const void *buffer, size_t size); + virtual wxFileOffset OnSysSeek(wxFileOffset pos, wxSeekMode mode); + virtual wxFileOffset OnSysTell() const; + + size_t m_currentPos; + + DECLARE_NO_COPY_CLASS(wxCountingOutputStream) +}; + +// --------------------------------------------------------------------------- +// "Filter" streams +// --------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxFilterInputStream : public wxInputStream +{ +public: + wxFilterInputStream(); + wxFilterInputStream(wxInputStream& stream); + wxFilterInputStream(wxInputStream *stream); + virtual ~wxFilterInputStream(); + + char Peek() { return m_parent_i_stream->Peek(); } + + wxFileOffset GetLength() const { return m_parent_i_stream->GetLength(); } + + wxInputStream *GetFilterInputStream() const { return m_parent_i_stream; } + +protected: + wxInputStream *m_parent_i_stream; + bool m_owns; + + DECLARE_NO_COPY_CLASS(wxFilterInputStream) +}; + +class WXDLLIMPEXP_BASE wxFilterOutputStream : public wxOutputStream +{ +public: + wxFilterOutputStream(); + wxFilterOutputStream(wxOutputStream& stream); + wxFilterOutputStream(wxOutputStream *stream); + virtual ~wxFilterOutputStream(); + + wxFileOffset GetLength() const { return m_parent_o_stream->GetLength(); } + + wxOutputStream *GetFilterOutputStream() const { return m_parent_o_stream; } + + bool Close(); + +protected: + wxOutputStream *m_parent_o_stream; + bool m_owns; + + DECLARE_NO_COPY_CLASS(wxFilterOutputStream) +}; + +enum wxStreamProtocolType +{ + wxSTREAM_PROTOCOL, // wxFileSystem protocol (should be only one) + wxSTREAM_MIMETYPE, // MIME types the stream handles + wxSTREAM_ENCODING, // The HTTP Content-Encodings the stream handles + wxSTREAM_FILEEXT // File extensions the stream handles +}; + +void WXDLLIMPEXP_BASE wxUseFilterClasses(); + +class WXDLLIMPEXP_BASE wxFilterClassFactoryBase : public wxObject +{ +public: + virtual ~wxFilterClassFactoryBase() { } + + wxString GetProtocol() const { return wxString(*GetProtocols()); } + wxString PopExtension(const wxString& location) const; + + virtual const wxChar * const *GetProtocols(wxStreamProtocolType type + = wxSTREAM_PROTOCOL) const = 0; + + bool CanHandle(const wxChar *protocol, + wxStreamProtocolType type + = wxSTREAM_PROTOCOL) const; + +protected: + wxString::size_type FindExtension(const wxChar *location) const; + + DECLARE_ABSTRACT_CLASS(wxFilterClassFactoryBase) +}; + +class WXDLLIMPEXP_BASE wxFilterClassFactory : public wxFilterClassFactoryBase +{ +public: + virtual ~wxFilterClassFactory() { } + + virtual wxFilterInputStream *NewStream(wxInputStream& stream) const = 0; + virtual wxFilterOutputStream *NewStream(wxOutputStream& stream) const = 0; + virtual wxFilterInputStream *NewStream(wxInputStream *stream) const = 0; + virtual wxFilterOutputStream *NewStream(wxOutputStream *stream) const = 0; + + static const wxFilterClassFactory *Find(const wxChar *protocol, + wxStreamProtocolType type + = wxSTREAM_PROTOCOL); + + static const wxFilterClassFactory *GetFirst(); + const wxFilterClassFactory *GetNext() const { return m_next; } + + void PushFront() { Remove(); m_next = sm_first; sm_first = this; } + void Remove(); + +protected: + wxFilterClassFactory() : m_next(this) { } + + wxFilterClassFactory& operator=(const wxFilterClassFactory&) + { return *this; } + +private: + static wxFilterClassFactory *sm_first; + wxFilterClassFactory *m_next; + + DECLARE_ABSTRACT_CLASS(wxFilterClassFactory) +}; + +// ============================================================================ +// buffered streams +// ============================================================================ + +// --------------------------------------------------------------------------- +// Stream buffer: this class can be derived from and passed to +// wxBufferedStreams to implement custom buffering +// --------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxStreamBuffer +{ +public: + enum BufMode + { + read, + write, + read_write + }; + + wxStreamBuffer(wxStreamBase& stream, BufMode mode); + wxStreamBuffer(const wxStreamBuffer& buf); + virtual ~wxStreamBuffer(); + + // Filtered IO + virtual size_t Read(void *buffer, size_t size); + size_t Read(wxStreamBuffer *buf); + virtual size_t Write(const void *buffer, size_t size); + size_t Write(wxStreamBuffer *buf); + + virtual char Peek(); + virtual char GetChar(); + virtual void PutChar(char c); + virtual wxFileOffset Tell() const; + virtual wxFileOffset Seek(wxFileOffset pos, wxSeekMode mode); + + // Buffer control + void ResetBuffer(); + + // NB: the buffer must always be allocated with malloc() if takeOwn is + // true as it will be deallocated by free() + void SetBufferIO(void *start, void *end, bool takeOwnership = false); + void SetBufferIO(void *start, size_t len, bool takeOwnership = false); + void SetBufferIO(size_t bufsize); + void *GetBufferStart() const { return m_buffer_start; } + void *GetBufferEnd() const { return m_buffer_end; } + void *GetBufferPos() const { return m_buffer_pos; } + size_t GetBufferSize() const { return m_buffer_size; } + size_t GetIntPosition() const { return m_buffer_pos - m_buffer_start; } + void SetIntPosition(size_t pos) { m_buffer_pos = m_buffer_start + pos; } + size_t GetLastAccess() const { return m_buffer_end - m_buffer_start; } + size_t GetBytesLeft() const { return m_buffer_end - m_buffer_pos; } + + void Fixed(bool fixed) { m_fixed = fixed; } + void Flushable(bool f) { m_flushable = f; } + + bool FlushBuffer(); + bool FillBuffer(); + size_t GetDataLeft(); + + // misc accessors + wxStreamBase *GetStream() const { return m_stream; } + bool HasBuffer() const { return m_buffer_size != 0; } + + bool IsFixed() const { return m_fixed; } + bool IsFlushable() const { return m_flushable; } + + // only for input/output buffers respectively, returns NULL otherwise + wxInputStream *GetInputStream() const; + wxOutputStream *GetOutputStream() const; + +#if WXWIN_COMPATIBILITY_2_6 + // deprecated, for compatibility only + wxDEPRECATED( wxStreamBase *Stream() ); +#endif // WXWIN_COMPATIBILITY_2_6 + + // this constructs a dummy wxStreamBuffer, used by (and exists for) + // wxMemoryStreams only, don't use! + wxStreamBuffer(BufMode mode); + +protected: + void GetFromBuffer(void *buffer, size_t size); + void PutToBuffer(const void *buffer, size_t size); + + // set the last error to the specified value if we didn't have it before + void SetError(wxStreamError err); + + // common part of several ctors + void Init(); + + // init buffer variables to be empty + void InitBuffer(); + + // free the buffer (always safe to call) + void FreeBuffer(); + + // the buffer itself: the pointers to its start and end and the current + // position in the buffer + char *m_buffer_start, + *m_buffer_end, + *m_buffer_pos; + + // the buffer size + // FIXME: isn't it the same as m_buffer_end - m_buffer_start? (VZ) + size_t m_buffer_size; + + // the stream we're associated with + wxStreamBase *m_stream; + + // its mode + BufMode m_mode; + + // flags + bool m_destroybuf, // deallocate buffer? + m_fixed, + m_flushable; + +private: +// Cannot use +// DECLARE_NO_COPY_CLASS(wxStreamBuffer) +// because copy constructor is explicitly declared above; +// but no copy assignment operator is defined, so declare +// it private to prevent the compiler from defining it: + wxStreamBuffer& operator=(const wxStreamBuffer&); +}; + +// --------------------------------------------------------------------------- +// wxBufferedInputStream +// --------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxBufferedInputStream : public wxFilterInputStream +{ +public: + // if a non NULL buffer is given to the stream, it will be deleted by it + wxBufferedInputStream(wxInputStream& stream, + wxStreamBuffer *buffer = NULL); + virtual ~wxBufferedInputStream(); + + char Peek(); + wxInputStream& Read(void *buffer, size_t size); + + // Position functions + wxFileOffset SeekI(wxFileOffset pos, wxSeekMode mode = wxFromStart); + wxFileOffset TellI() const; + bool IsSeekable() const { return m_parent_i_stream->IsSeekable(); } + + // the buffer given to the stream will be deleted by it + void SetInputStreamBuffer(wxStreamBuffer *buffer); + wxStreamBuffer *GetInputStreamBuffer() const { return m_i_streambuf; } + +#if WXWIN_COMPATIBILITY_2_6 + // deprecated, for compatibility only + wxDEPRECATED( wxStreamBuffer *InputStreamBuffer() const ); +#endif // WXWIN_COMPATIBILITY_2_6 + +protected: + virtual size_t OnSysRead(void *buffer, size_t bufsize); + virtual wxFileOffset OnSysSeek(wxFileOffset seek, wxSeekMode mode); + virtual wxFileOffset OnSysTell() const; + + wxStreamBuffer *m_i_streambuf; + + DECLARE_NO_COPY_CLASS(wxBufferedInputStream) +}; + +// ---------------------------------------------------------------------------- +// wxBufferedOutputStream +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxBufferedOutputStream : public wxFilterOutputStream +{ +public: + // if a non NULL buffer is given to the stream, it will be deleted by it + wxBufferedOutputStream(wxOutputStream& stream, + wxStreamBuffer *buffer = NULL); + virtual ~wxBufferedOutputStream(); + + wxOutputStream& Write(const void *buffer, size_t size); + + // Position functions + wxFileOffset SeekO(wxFileOffset pos, wxSeekMode mode = wxFromStart); + wxFileOffset TellO() const; + bool IsSeekable() const { return m_parent_o_stream->IsSeekable(); } + + void Sync(); + bool Close(); + + wxFileOffset GetLength() const; + + // the buffer given to the stream will be deleted by it + void SetOutputStreamBuffer(wxStreamBuffer *buffer); + wxStreamBuffer *GetOutputStreamBuffer() const { return m_o_streambuf; } + +#if WXWIN_COMPATIBILITY_2_6 + // deprecated, for compatibility only + wxDEPRECATED( wxStreamBuffer *OutputStreamBuffer() const ); +#endif // WXWIN_COMPATIBILITY_2_6 + +protected: + virtual size_t OnSysWrite(const void *buffer, size_t bufsize); + virtual wxFileOffset OnSysSeek(wxFileOffset seek, wxSeekMode mode); + virtual wxFileOffset OnSysTell() const; + + wxStreamBuffer *m_o_streambuf; + + DECLARE_NO_COPY_CLASS(wxBufferedOutputStream) +}; + +#if WXWIN_COMPATIBILITY_2_6 + inline wxStreamBase *wxStreamBuffer::Stream() { return m_stream; } + inline wxStreamBuffer *wxBufferedInputStream::InputStreamBuffer() const { return m_i_streambuf; } + inline wxStreamBuffer *wxBufferedOutputStream::OutputStreamBuffer() const { return m_o_streambuf; } +#endif // WXWIN_COMPATIBILITY_2_6 + +#endif // wxUSE_STREAMS + +#endif // _WX_WXSTREAM_H__ diff --git a/Externals/wxWidgets/include/wx/string.h b/Externals/wxWidgets/include/wx/string.h new file mode 100644 index 0000000000..fa3d9c5a86 --- /dev/null +++ b/Externals/wxWidgets/include/wx/string.h @@ -0,0 +1,1653 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/string.h +// Purpose: wxString and wxArrayString classes +// Author: Vadim Zeitlin +// Modified by: +// Created: 29/01/98 +// RCS-ID: $Id: string.h 45861 2007-05-06 12:57:43Z VS $ +// Copyright: (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +/* + Efficient string class [more or less] compatible with MFC CString, + wxWidgets version 1 wxString and std::string and some handy functions + missing from string.h. +*/ + +#ifndef _WX_WXSTRINGH__ +#define _WX_WXSTRINGH__ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/defs.h" // everybody should include this + +#if defined(__WXMAC__) || defined(__VISAGECPP__) + #include <ctype.h> +#endif + +#if defined(__VISAGECPP__) && __IBMCPP__ >= 400 + // problem in VACPP V4 with including stdlib.h multiple times + // strconv includes it anyway +# include <stdio.h> +# include <string.h> +# include <stdarg.h> +# include <limits.h> +#else +# include <string.h> +# include <stdio.h> +# include <stdarg.h> +# include <limits.h> +# include <stdlib.h> +#endif + +#ifdef HAVE_STRCASECMP_IN_STRINGS_H + #include <strings.h> // for strcasecmp() +#endif // HAVE_STRCASECMP_IN_STRINGS_H + +#ifdef __WXPALMOS__ + #include <StringMgr.h> +#endif + +#include "wx/wxchar.h" // for wxChar +#include "wx/buffer.h" // for wxCharBuffer +#include "wx/strconv.h" // for wxConvertXXX() macros and wxMBConv classes + +class WXDLLIMPEXP_BASE wxString; + +// --------------------------------------------------------------------------- +// macros +// --------------------------------------------------------------------------- + +// casts [unfortunately!] needed to call some broken functions which require +// "char *" instead of "const char *" +#define WXSTRINGCAST (wxChar *)(const wxChar *) +#define wxCSTRINGCAST (wxChar *)(const wxChar *) +#define wxMBSTRINGCAST (char *)(const char *) +#define wxWCSTRINGCAST (wchar_t *)(const wchar_t *) + +// implementation only +#define wxASSERT_VALID_INDEX(i) \ + wxASSERT_MSG( (size_t)(i) <= length(), _T("invalid index in wxString") ) + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +#if WXWIN_COMPATIBILITY_2_6 + +// deprecated in favour of wxString::npos, don't use in new code +// +// maximum possible length for a string means "take all string" everywhere +#define wxSTRING_MAXLEN wxStringBase::npos + +#endif // WXWIN_COMPATIBILITY_2_6 + +// ---------------------------------------------------------------------------- +// global data +// ---------------------------------------------------------------------------- + +// global pointer to empty string +extern WXDLLIMPEXP_DATA_BASE(const wxChar*) wxEmptyString; + +// --------------------------------------------------------------------------- +// global functions complementing standard C string library replacements for +// strlen() and portable strcasecmp() +//--------------------------------------------------------------------------- + +// Use wxXXX() functions from wxchar.h instead! These functions are for +// backwards compatibility only. + +// checks whether the passed in pointer is NULL and if the string is empty +inline bool IsEmpty(const char *p) { return (!p || !*p); } + +// safe version of strlen() (returns 0 if passed NULL pointer) +inline size_t Strlen(const char *psz) + { return psz ? strlen(psz) : 0; } + +// portable strcasecmp/_stricmp +inline int Stricmp(const char *psz1, const char *psz2) +{ +#if defined(__VISUALC__) && defined(__WXWINCE__) + register char c1, c2; + do { + c1 = tolower(*psz1++); + c2 = tolower(*psz2++); + } while ( c1 && (c1 == c2) ); + + return c1 - c2; +#elif defined(__VISUALC__) || ( defined(__MWERKS__) && defined(__INTEL__) ) + return _stricmp(psz1, psz2); +#elif defined(__SC__) + return _stricmp(psz1, psz2); +#elif defined(__SALFORDC__) + return stricmp(psz1, psz2); +#elif defined(__BORLANDC__) + return stricmp(psz1, psz2); +#elif defined(__WATCOMC__) + return stricmp(psz1, psz2); +#elif defined(__DJGPP__) + return stricmp(psz1, psz2); +#elif defined(__EMX__) + return stricmp(psz1, psz2); +#elif defined(__WXPM__) + return stricmp(psz1, psz2); +#elif defined(__WXPALMOS__) || \ + defined(HAVE_STRCASECMP_IN_STRING_H) || \ + defined(HAVE_STRCASECMP_IN_STRINGS_H) || \ + defined(__GNUWIN32__) + return strcasecmp(psz1, psz2); +#elif defined(__MWERKS__) && !defined(__INTEL__) + register char c1, c2; + do { + c1 = tolower(*psz1++); + c2 = tolower(*psz2++); + } while ( c1 && (c1 == c2) ); + + return c1 - c2; +#else + // almost all compilers/libraries provide this function (unfortunately under + // different names), that's why we don't implement our own which will surely + // be more efficient than this code (uncomment to use): + /* + register char c1, c2; + do { + c1 = tolower(*psz1++); + c2 = tolower(*psz2++); + } while ( c1 && (c1 == c2) ); + + return c1 - c2; + */ + + #error "Please define string case-insensitive compare for your OS/compiler" +#endif // OS/compiler +} + +// ---------------------------------------------------------------------------- +// deal with STL/non-STL/non-STL-but-wxUSE_STD_STRING +// ---------------------------------------------------------------------------- + +// in both cases we need to define wxStdString +#if wxUSE_STL || wxUSE_STD_STRING + +#include "wx/beforestd.h" +#include <string> +#include "wx/afterstd.h" + +#if wxUSE_UNICODE + #ifdef HAVE_STD_WSTRING + typedef std::wstring wxStdString; + #else + typedef std::basic_string<wxChar> wxStdString; + #endif +#else + typedef std::string wxStdString; +#endif + +#endif // need <string> + +#if wxUSE_STL + + // we don't need an extra ctor from std::string when copy ctor already does + // the work + #undef wxUSE_STD_STRING + #define wxUSE_STD_STRING 0 + + #if (defined(__GNUG__) && (__GNUG__ < 3)) || \ + (defined(_MSC_VER) && (_MSC_VER <= 1200)) + #define wxSTRING_BASE_HASNT_CLEAR + #endif + + typedef wxStdString wxStringBase; +#else // if !wxUSE_STL + +#if !defined(HAVE_STD_STRING_COMPARE) && \ + (!defined(__WX_SETUP_H__) || wxUSE_STL == 0) + #define HAVE_STD_STRING_COMPARE +#endif + +// --------------------------------------------------------------------------- +// string data prepended with some housekeeping info (used by wxString class), +// is never used directly (but had to be put here to allow inlining) +// --------------------------------------------------------------------------- + +struct WXDLLIMPEXP_BASE wxStringData +{ + int nRefs; // reference count + size_t nDataLength, // actual string length + nAllocLength; // allocated memory size + + // mimics declaration 'wxChar data[nAllocLength]' + wxChar* data() const { return (wxChar*)(this + 1); } + + // empty string has a special ref count so it's never deleted + bool IsEmpty() const { return (nRefs == -1); } + bool IsShared() const { return (nRefs > 1); } + + // lock/unlock + void Lock() { if ( !IsEmpty() ) nRefs++; } + + // VC++ will refuse to inline Unlock but profiling shows that it is wrong +#if defined(__VISUALC__) && (__VISUALC__ >= 1200) + __forceinline +#endif + // VC++ free must take place in same DLL as allocation when using non dll + // run-time library (e.g. Multithreaded instead of Multithreaded DLL) +#if defined(__VISUALC__) && defined(_MT) && !defined(_DLL) + void Unlock() { if ( !IsEmpty() && --nRefs == 0) Free(); } + // we must not inline deallocation since allocation is not inlined + void Free(); +#else + void Unlock() { if ( !IsEmpty() && --nRefs == 0) free(this); } +#endif + + // if we had taken control over string memory (GetWriteBuf), it's + // intentionally put in invalid state + void Validate(bool b) { nRefs = (b ? 1 : 0); } + bool IsValid() const { return (nRefs != 0); } +}; + +class WXDLLIMPEXP_BASE wxStringBase +{ +#if !wxUSE_STL +friend class WXDLLIMPEXP_BASE wxArrayString; +#endif +public : + // an 'invalid' value for string index, moved to this place due to a CW bug + static const size_t npos; +protected: + // points to data preceded by wxStringData structure with ref count info + wxChar *m_pchData; + + // accessor to string data + wxStringData* GetStringData() const { return (wxStringData*)m_pchData - 1; } + + // string (re)initialization functions + // initializes the string to the empty value (must be called only from + // ctors, use Reinit() otherwise) + void Init() { m_pchData = (wxChar *)wxEmptyString; } + // initializes the string with (a part of) C-string + void InitWith(const wxChar *psz, size_t nPos = 0, size_t nLen = npos); + // as Init, but also frees old data + void Reinit() { GetStringData()->Unlock(); Init(); } + + // memory allocation + // allocates memory for string of length nLen + bool AllocBuffer(size_t nLen); + // copies data to another string + bool AllocCopy(wxString&, int, int) const; + // effectively copies data to string + bool AssignCopy(size_t, const wxChar *); + + // append a (sub)string + bool ConcatSelf(size_t nLen, const wxChar *src, size_t nMaxLen); + bool ConcatSelf(size_t nLen, const wxChar *src) + { return ConcatSelf(nLen, src, nLen); } + + // functions called before writing to the string: they copy it if there + // are other references to our data (should be the only owner when writing) + bool CopyBeforeWrite(); + bool AllocBeforeWrite(size_t); + + // compatibility with wxString + bool Alloc(size_t nLen); +public: + // standard types + typedef wxChar value_type; + typedef wxChar char_type; + typedef size_t size_type; + typedef value_type& reference; + typedef const value_type& const_reference; + typedef value_type* pointer; + typedef const value_type* const_pointer; + typedef value_type *iterator; + typedef const value_type *const_iterator; + +#define wxSTRING_REVERSE_ITERATOR(name, const_or_not) \ + class name \ + { \ + public: \ + typedef wxChar value_type; \ + typedef const_or_not value_type& reference; \ + typedef const_or_not value_type *pointer; \ + typedef const_or_not value_type *iterator_type; \ + \ + name(iterator_type i) : m_cur(i) { } \ + name(const name& ri) : m_cur(ri.m_cur) { } \ + \ + iterator_type base() const { return m_cur; } \ + \ + reference operator*() const { return *(m_cur - 1); } \ + \ + name& operator++() { --m_cur; return *this; } \ + name operator++(int) { name tmp = *this; --m_cur; return tmp; } \ + name& operator--() { ++m_cur; return *this; } \ + name operator--(int) { name tmp = *this; ++m_cur; return tmp; } \ + \ + bool operator==(name ri) const { return m_cur == ri.m_cur; } \ + bool operator!=(name ri) const { return !(*this == ri); } \ + \ + private: \ + iterator_type m_cur; \ + } + + wxSTRING_REVERSE_ITERATOR(const_reverse_iterator, const); + + #define wxSTRING_CONST + wxSTRING_REVERSE_ITERATOR(reverse_iterator, wxSTRING_CONST); + #undef wxSTRING_CONST + + #undef wxSTRING_REVERSE_ITERATOR + + + // constructors and destructor + // ctor for an empty string + wxStringBase() { Init(); } + // copy ctor + wxStringBase(const wxStringBase& stringSrc) + { + wxASSERT_MSG( stringSrc.GetStringData()->IsValid(), + _T("did you forget to call UngetWriteBuf()?") ); + + if ( stringSrc.empty() ) { + // nothing to do for an empty string + Init(); + } + else { + m_pchData = stringSrc.m_pchData; // share same data + GetStringData()->Lock(); // => one more copy + } + } + // string containing nRepeat copies of ch + wxStringBase(size_type nRepeat, wxChar ch); + // ctor takes first nLength characters from C string + // (default value of npos means take all the string) + wxStringBase(const wxChar *psz) + { InitWith(psz, 0, npos); } + wxStringBase(const wxChar *psz, size_t nLength) + { InitWith(psz, 0, nLength); } + wxStringBase(const wxChar *psz, + const wxMBConv& WXUNUSED(conv), + size_t nLength = npos) + { InitWith(psz, 0, nLength); } + // take nLen chars starting at nPos + wxStringBase(const wxStringBase& str, size_t nPos, size_t nLen) + { + wxASSERT_MSG( str.GetStringData()->IsValid(), + _T("did you forget to call UngetWriteBuf()?") ); + Init(); + size_t strLen = str.length() - nPos; nLen = strLen < nLen ? strLen : nLen; + InitWith(str.c_str(), nPos, nLen); + } + // take all characters from pStart to pEnd + wxStringBase(const void *pStart, const void *pEnd); + + // dtor is not virtual, this class must not be inherited from! + ~wxStringBase() + { +#if defined(__VISUALC__) && (__VISUALC__ >= 1200) + //RN - according to the above VC++ does indeed inline this, + //even though it spits out two warnings + #pragma warning (disable:4714) +#endif + + GetStringData()->Unlock(); + } + +#if defined(__VISUALC__) && (__VISUALC__ >= 1200) + //re-enable inlining warning + #pragma warning (default:4714) +#endif + // overloaded assignment + // from another wxString + wxStringBase& operator=(const wxStringBase& stringSrc); + // from a character + wxStringBase& operator=(wxChar ch); + // from a C string + wxStringBase& operator=(const wxChar *psz); + + // return the length of the string + size_type length() const { return GetStringData()->nDataLength; } + // return the length of the string + size_type size() const { return length(); } + // return the maximum size of the string + size_type max_size() const { return npos; } + // resize the string, filling the space with c if c != 0 + void resize(size_t nSize, wxChar ch = wxT('\0')); + // delete the contents of the string + void clear() { erase(0, npos); } + // returns true if the string is empty + bool empty() const { return length() == 0; } + // inform string about planned change in size + void reserve(size_t sz) { Alloc(sz); } + size_type capacity() const { return GetStringData()->nAllocLength; } + + // lib.string.access + // return the character at position n + value_type at(size_type n) const + { wxASSERT_VALID_INDEX( n ); return m_pchData[n]; } + // returns the writable character at position n + reference at(size_type n) + { wxASSERT_VALID_INDEX( n ); CopyBeforeWrite(); return m_pchData[n]; } + + // lib.string.modifiers + // append elements str[pos], ..., str[pos+n] + wxStringBase& append(const wxStringBase& str, size_t pos, size_t n) + { + wxASSERT(pos <= str.length()); + ConcatSelf(n, str.c_str() + pos, str.length() - pos); + return *this; + } + // append a string + wxStringBase& append(const wxStringBase& str) + { ConcatSelf(str.length(), str.c_str()); return *this; } + // append first n (or all if n == npos) characters of sz + wxStringBase& append(const wxChar *sz) + { ConcatSelf(wxStrlen(sz), sz); return *this; } + wxStringBase& append(const wxChar *sz, size_t n) + { ConcatSelf(n, sz); return *this; } + // append n copies of ch + wxStringBase& append(size_t n, wxChar ch); + // append from first to last + wxStringBase& append(const_iterator first, const_iterator last) + { ConcatSelf(last - first, first); return *this; } + + // same as `this_string = str' + wxStringBase& assign(const wxStringBase& str) + { return *this = str; } + // same as ` = str[pos..pos + n] + wxStringBase& assign(const wxStringBase& str, size_t pos, size_t n) + { clear(); return append(str, pos, n); } + // same as `= first n (or all if n == npos) characters of sz' + wxStringBase& assign(const wxChar *sz) + { clear(); return append(sz, wxStrlen(sz)); } + wxStringBase& assign(const wxChar *sz, size_t n) + { clear(); return append(sz, n); } + // same as `= n copies of ch' + wxStringBase& assign(size_t n, wxChar ch) + { clear(); return append(n, ch); } + // assign from first to last + wxStringBase& assign(const_iterator first, const_iterator last) + { clear(); return append(first, last); } + + // first valid index position + const_iterator begin() const { return m_pchData; } + iterator begin(); + // position one after the last valid one + const_iterator end() const { return m_pchData + length(); } + iterator end(); + + // first element of the reversed string + const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); } + reverse_iterator rbegin() { return reverse_iterator(end()); } + // one beyond the end of the reversed string + const_reverse_iterator rend() const { return const_reverse_iterator(begin()); } + reverse_iterator rend() { return reverse_iterator(begin()); } + + // insert another string + wxStringBase& insert(size_t nPos, const wxStringBase& str) + { + wxASSERT( str.GetStringData()->IsValid() ); + return insert(nPos, str.c_str(), str.length()); + } + // insert n chars of str starting at nStart (in str) + wxStringBase& insert(size_t nPos, const wxStringBase& str, size_t nStart, size_t n) + { + wxASSERT( str.GetStringData()->IsValid() ); + wxASSERT( nStart < str.length() ); + size_t strLen = str.length() - nStart; + n = strLen < n ? strLen : n; + return insert(nPos, str.c_str() + nStart, n); + } + // insert first n (or all if n == npos) characters of sz + wxStringBase& insert(size_t nPos, const wxChar *sz, size_t n = npos); + // insert n copies of ch + wxStringBase& insert(size_t nPos, size_t n, wxChar ch) + { return insert(nPos, wxStringBase(n, ch)); } + iterator insert(iterator it, wxChar ch) + { size_t idx = it - begin(); insert(idx, 1, ch); return begin() + idx; } + void insert(iterator it, const_iterator first, const_iterator last) + { insert(it - begin(), first, last - first); } + void insert(iterator it, size_type n, wxChar ch) + { insert(it - begin(), n, ch); } + + // delete characters from nStart to nStart + nLen + wxStringBase& erase(size_type pos = 0, size_type n = npos); + iterator erase(iterator first, iterator last) + { + size_t idx = first - begin(); + erase(idx, last - first); + return begin() + idx; + } + iterator erase(iterator first); + + // explicit conversion to C string (use this with printf()!) + const wxChar* c_str() const { return m_pchData; } + const wxChar* data() const { return m_pchData; } + + // replaces the substring of length nLen starting at nStart + wxStringBase& replace(size_t nStart, size_t nLen, const wxChar* sz); + // replaces the substring of length nLen starting at nStart + wxStringBase& replace(size_t nStart, size_t nLen, const wxStringBase& str) + { return replace(nStart, nLen, str.c_str()); } + // replaces the substring with nCount copies of ch + wxStringBase& replace(size_t nStart, size_t nLen, size_t nCount, wxChar ch); + // replaces a substring with another substring + wxStringBase& replace(size_t nStart, size_t nLen, + const wxStringBase& str, size_t nStart2, size_t nLen2); + // replaces the substring with first nCount chars of sz + wxStringBase& replace(size_t nStart, size_t nLen, + const wxChar* sz, size_t nCount); + wxStringBase& replace(iterator first, iterator last, const_pointer s) + { return replace(first - begin(), last - first, s); } + wxStringBase& replace(iterator first, iterator last, const_pointer s, + size_type n) + { return replace(first - begin(), last - first, s, n); } + wxStringBase& replace(iterator first, iterator last, const wxStringBase& s) + { return replace(first - begin(), last - first, s); } + wxStringBase& replace(iterator first, iterator last, size_type n, wxChar c) + { return replace(first - begin(), last - first, n, c); } + wxStringBase& replace(iterator first, iterator last, + const_iterator first1, const_iterator last1) + { return replace(first - begin(), last - first, first1, last1 - first1); } + + // swap two strings + void swap(wxStringBase& str); + + // All find() functions take the nStart argument which specifies the + // position to start the search on, the default value is 0. All functions + // return npos if there were no match. + + // find a substring + size_t find(const wxStringBase& str, size_t nStart = 0) const; + + // find first n characters of sz + size_t find(const wxChar* sz, size_t nStart = 0, size_t n = npos) const; + + // find the first occurence of character ch after nStart + size_t find(wxChar ch, size_t nStart = 0) const; + + // rfind() family is exactly like find() but works right to left + + // as find, but from the end + size_t rfind(const wxStringBase& str, size_t nStart = npos) const; + + // as find, but from the end + size_t rfind(const wxChar* sz, size_t nStart = npos, + size_t n = npos) const; + // as find, but from the end + size_t rfind(wxChar ch, size_t nStart = npos) const; + + // find first/last occurence of any character in the set + + // as strpbrk() but starts at nStart, returns npos if not found + size_t find_first_of(const wxStringBase& str, size_t nStart = 0) const + { return find_first_of(str.c_str(), nStart); } + // same as above + size_t find_first_of(const wxChar* sz, size_t nStart = 0) const; + size_t find_first_of(const wxChar* sz, size_t nStart, size_t n) const; + // same as find(char, size_t) + size_t find_first_of(wxChar c, size_t nStart = 0) const + { return find(c, nStart); } + // find the last (starting from nStart) char from str in this string + size_t find_last_of (const wxStringBase& str, size_t nStart = npos) const + { return find_last_of(str.c_str(), nStart); } + // same as above + size_t find_last_of (const wxChar* sz, size_t nStart = npos) const; + size_t find_last_of(const wxChar* sz, size_t nStart, size_t n) const; + // same as above + size_t find_last_of(wxChar c, size_t nStart = npos) const + { return rfind(c, nStart); } + + // find first/last occurence of any character not in the set + + // as strspn() (starting from nStart), returns npos on failure + size_t find_first_not_of(const wxStringBase& str, size_t nStart = 0) const + { return find_first_not_of(str.c_str(), nStart); } + // same as above + size_t find_first_not_of(const wxChar* sz, size_t nStart = 0) const; + size_t find_first_not_of(const wxChar* sz, size_t nStart, size_t n) const; + // same as above + size_t find_first_not_of(wxChar ch, size_t nStart = 0) const; + // as strcspn() + size_t find_last_not_of(const wxStringBase& str, size_t nStart = npos) const + { return find_last_not_of(str.c_str(), nStart); } + // same as above + size_t find_last_not_of(const wxChar* sz, size_t nStart = npos) const; + size_t find_last_not_of(const wxChar* sz, size_t nStart, size_t n) const; + // same as above + size_t find_last_not_of(wxChar ch, size_t nStart = npos) const; + + // All compare functions return -1, 0 or 1 if the [sub]string is less, + // equal or greater than the compare() argument. + + // comparison with another string + int compare(const wxStringBase& str) const; + // comparison with a substring + int compare(size_t nStart, size_t nLen, const wxStringBase& str) const; + // comparison of 2 substrings + int compare(size_t nStart, size_t nLen, + const wxStringBase& str, size_t nStart2, size_t nLen2) const; + // comparison with a c string + int compare(const wxChar* sz) const; + // substring comparison with first nCount characters of sz + int compare(size_t nStart, size_t nLen, + const wxChar* sz, size_t nCount = npos) const; + + size_type copy(wxChar* s, size_type n, size_type pos = 0); + + // substring extraction + wxStringBase substr(size_t nStart = 0, size_t nLen = npos) const; + + // string += string + wxStringBase& operator+=(const wxStringBase& s) { return append(s); } + // string += C string + wxStringBase& operator+=(const wxChar *psz) { return append(psz); } + // string += char + wxStringBase& operator+=(wxChar ch) { return append(1, ch); } +}; + +#endif // !wxUSE_STL + +// ---------------------------------------------------------------------------- +// wxString: string class trying to be compatible with std::string, MFC +// CString and wxWindows 1.x wxString all at once +// --------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxString : public wxStringBase +{ +#if !wxUSE_STL +friend class WXDLLIMPEXP_BASE wxArrayString; +#endif + + // NB: special care was taken in arranging the member functions in such order + // that all inline functions can be effectively inlined, verify that all + // performance critical functions are still inlined if you change order! +private: + // if we hadn't made these operators private, it would be possible to + // compile "wxString s; s = 17;" without any warnings as 17 is implicitly + // converted to char in C and we do have operator=(char) + // + // NB: we don't need other versions (short/long and unsigned) as attempt + // to assign another numeric type to wxString will now result in + // ambiguity between operator=(char) and operator=(int) + wxString& operator=(int); + + // these methods are not implemented - there is _no_ conversion from int to + // string, you're doing something wrong if the compiler wants to call it! + // + // try `s << i' or `s.Printf("%d", i)' instead + wxString(int); + +public: + // constructors and destructor + // ctor for an empty string + wxString() : wxStringBase() { } + // copy ctor + wxString(const wxStringBase& stringSrc) : wxStringBase(stringSrc) { } + wxString(const wxString& stringSrc) : wxStringBase(stringSrc) { } + // string containing nRepeat copies of ch + wxString(wxChar ch, size_t nRepeat = 1) + : wxStringBase(nRepeat, ch) { } + wxString(size_t nRepeat, wxChar ch) + : wxStringBase(nRepeat, ch) { } + // ctor takes first nLength characters from C string + // (default value of npos means take all the string) + wxString(const wxChar *psz) + : wxStringBase(psz ? psz : wxT("")) { } + wxString(const wxChar *psz, size_t nLength) + : wxStringBase(psz, nLength) { } + wxString(const wxChar *psz, + const wxMBConv& WXUNUSED(conv), + size_t nLength = npos) + : wxStringBase(psz, nLength == npos ? wxStrlen(psz) : nLength) { } + + // even if we're not built with wxUSE_STL == 1 it is very convenient to allow + // implicit conversions from std::string to wxString as this allows to use + // the same strings in non-GUI and GUI code, however we don't want to + // unconditionally add this ctor as it would make wx lib dependent on + // libstdc++ on some Linux versions which is bad, so instead we ask the + // client code to define this wxUSE_STD_STRING symbol if they need it +#if wxUSE_STD_STRING + wxString(const wxStdString& s) + : wxStringBase(s.c_str()) { } +#endif // wxUSE_STD_STRING + +#if wxUSE_UNICODE + // from multibyte string + wxString(const char *psz, const wxMBConv& conv, size_t nLength = npos); + // from wxWCharBuffer (i.e. return from wxGetString) + wxString(const wxWCharBuffer& psz) : wxStringBase(psz.data()) { } +#else // ANSI + // from C string (for compilers using unsigned char) + wxString(const unsigned char* psz) + : wxStringBase((const char*)psz) { } + // from part of C string (for compilers using unsigned char) + wxString(const unsigned char* psz, size_t nLength) + : wxStringBase((const char*)psz, nLength) { } + +#if wxUSE_WCHAR_T + // from wide (Unicode) string + wxString(const wchar_t *pwz, + const wxMBConv& conv = wxConvLibc, + size_t nLength = npos); +#endif // !wxUSE_WCHAR_T + + // from wxCharBuffer + wxString(const wxCharBuffer& psz) + : wxStringBase(psz) { } +#endif // Unicode/ANSI + + // generic attributes & operations + // as standard strlen() + size_t Len() const { return length(); } + // string contains any characters? + bool IsEmpty() const { return empty(); } + // empty string is "false", so !str will return true + bool operator!() const { return empty(); } + // truncate the string to given length + wxString& Truncate(size_t uiLen); + // empty string contents + void Empty() + { + Truncate(0); + + wxASSERT_MSG( empty(), _T("string not empty after call to Empty()?") ); + } + // empty the string and free memory + void Clear() + { + wxString tmp(wxEmptyString); + swap(tmp); + } + + // contents test + // Is an ascii value + bool IsAscii() const; + // Is a number + bool IsNumber() const; + // Is a word + bool IsWord() const; + + // data access (all indexes are 0 based) + // read access + wxChar GetChar(size_t n) const + { return at(n); } + // read/write access + wxChar& GetWritableChar(size_t n) + { return at(n); } + // write access + void SetChar(size_t n, wxChar ch) + { at(n) = ch; } + + // get last character + wxChar Last() const + { + wxASSERT_MSG( !empty(), _T("wxString: index out of bounds") ); + + return at(length() - 1); + } + + // get writable last character + wxChar& Last() + { + wxASSERT_MSG( !empty(), _T("wxString: index out of bounds") ); + return at(length() - 1); + } + + /* + Note that we we must define all of the overloads below to avoid + ambiguity when using str[0]. Also note that for a conforming compiler we + don't need const version of operatorp[] at all as indexed access to + const string is provided by implicit conversion to "const wxChar *" + below and defining them would only result in ambiguities, but some other + compilers refuse to compile "str[0]" without them. + */ + +#if defined(__BORLANDC__) || defined(__WATCOMC__) || defined(__MWERKS__) + wxChar operator[](int n) const + { return wxStringBase::at(n); } + wxChar operator[](size_type n) const + { return wxStringBase::at(n); } +#ifndef wxSIZE_T_IS_UINT + wxChar operator[](unsigned int n) const + { return wxStringBase::at(n); } +#endif // size_t != unsigned int +#endif // broken compiler + + + // operator versions of GetWriteableChar() + wxChar& operator[](int n) + { return wxStringBase::at(n); } + wxChar& operator[](size_type n) + { return wxStringBase::at(n); } +#ifndef wxSIZE_T_IS_UINT + wxChar& operator[](unsigned int n) + { return wxStringBase::at(n); } +#endif // size_t != unsigned int + + // implicit conversion to C string + operator const wxChar*() const { return c_str(); } + + // identical to c_str(), for wxWin 1.6x compatibility + const wxChar* wx_str() const { return c_str(); } + // identical to c_str(), for MFC compatibility + const wxChar* GetData() const { return c_str(); } + +#if wxABI_VERSION >= 20804 + // conversion to *non-const* multibyte or widestring buffer; modifying + // returned buffer won't affect the string, these methods are only useful + // for passing values to const-incorrect functions + wxWritableCharBuffer char_str(const wxMBConv& conv = wxConvLibc) const + { return mb_str(conv); } +#if wxUSE_WCHAR_T + wxWritableWCharBuffer wchar_str() const { return wc_str(wxConvLibc); } +#endif +#endif // wxABI_VERSION >= 20804 + + // conversion to/from plain (i.e. 7 bit) ASCII: this is useful for + // converting numbers or strings which are certain not to contain special + // chars (typically system functions, X atoms, environment variables etc.) + // + // the behaviour of these functions with the strings containing anything + // else than 7 bit ASCII characters is undefined, use at your own risk. +#if wxUSE_UNICODE + static wxString FromAscii(const char *ascii); // string + static wxString FromAscii(const char ascii); // char + const wxCharBuffer ToAscii() const; +#else // ANSI + static wxString FromAscii(const char *ascii) { return wxString( ascii ); } + static wxString FromAscii(const char ascii) { return wxString( ascii ); } + const char *ToAscii() const { return c_str(); } +#endif // Unicode/!Unicode + +#if wxABI_VERSION >= 20804 + // conversion to/from UTF-8: +#if wxUSE_UNICODE + static wxString FromUTF8(const char *utf8) + { return wxString(utf8, wxConvUTF8); } + static wxString FromUTF8(const char *utf8, size_t len) + { return wxString(utf8, wxConvUTF8, len); } + const wxCharBuffer utf8_str() const { return mb_str(wxConvUTF8); } + const wxCharBuffer ToUTF8() const { return utf8_str(); } +#elif wxUSE_WCHAR_T // ANSI + static wxString FromUTF8(const char *utf8) + { return wxString(wxConvUTF8.cMB2WC(utf8)); } + static wxString FromUTF8(const char *utf8, size_t len) + { + size_t wlen; + wxWCharBuffer buf(wxConvUTF8.cMB2WC(utf8, len == npos ? wxNO_LEN : len, &wlen)); + return wxString(buf.data(), wxConvLibc, wlen); + } + const wxCharBuffer utf8_str() const + { return wxConvUTF8.cWC2MB(wc_str(wxConvLibc)); } + const wxCharBuffer ToUTF8() const { return utf8_str(); } +#endif // Unicode/ANSI +#endif // wxABI_VERSION >= 20804 + +#if wxABI_VERSION >= 20804 + // functions for storing binary data in wxString: +#if wxUSE_UNICODE + static wxString From8BitData(const char *data, size_t len) + { return wxString(data, wxConvISO8859_1, len); } + // version for NUL-terminated data: + static wxString From8BitData(const char *data) + { return wxString(data, wxConvISO8859_1); } + const wxCharBuffer To8BitData() const { return mb_str(wxConvISO8859_1); } +#else // ANSI + static wxString From8BitData(const char *data, size_t len) + { return wxString(data, len); } + // version for NUL-terminated data: + static wxString From8BitData(const char *data) + { return wxString(data); } + const char *To8BitData() const { return c_str(); } +#endif // Unicode/ANSI +#endif // wxABI_VERSION >= 20804 + + // conversions with (possible) format conversions: have to return a + // buffer with temporary data + // + // the functions defined (in either Unicode or ANSI) mode are mb_str() to + // return an ANSI (multibyte) string, wc_str() to return a wide string and + // fn_str() to return a string which should be used with the OS APIs + // accepting the file names. The return value is always the same, but the + // type differs because a function may either return pointer to the buffer + // directly or have to use intermediate buffer for translation. +#if wxUSE_UNICODE + const wxCharBuffer mb_str(const wxMBConv& conv = wxConvLibc) const; + + const wxWX2MBbuf mbc_str() const { return mb_str(*wxConvCurrent); } + + const wxChar* wc_str() const { return c_str(); } + + // for compatibility with !wxUSE_UNICODE version + const wxChar* wc_str(const wxMBConv& WXUNUSED(conv)) const { return c_str(); } + +#if wxMBFILES + const wxCharBuffer fn_str() const { return mb_str(wxConvFile); } +#else // !wxMBFILES + const wxChar* fn_str() const { return c_str(); } +#endif // wxMBFILES/!wxMBFILES +#else // ANSI + const wxChar* mb_str() const { return c_str(); } + + // for compatibility with wxUSE_UNICODE version + const wxChar* mb_str(const wxMBConv& WXUNUSED(conv)) const { return c_str(); } + + const wxWX2MBbuf mbc_str() const { return mb_str(); } + +#if wxUSE_WCHAR_T + const wxWCharBuffer wc_str(const wxMBConv& conv) const; +#endif // wxUSE_WCHAR_T +#ifdef __WXOSX__ + const wxCharBuffer fn_str() const { return wxConvFile.cWC2WX( wc_str( wxConvLocal ) ); } +#else + const wxChar* fn_str() const { return c_str(); } +#endif +#endif // Unicode/ANSI + + // overloaded assignment + // from another wxString + wxString& operator=(const wxStringBase& stringSrc) + { return (wxString&)wxStringBase::operator=(stringSrc); } + // from a character + wxString& operator=(wxChar ch) + { return (wxString&)wxStringBase::operator=(ch); } + // from a C string - STL probably will crash on NULL, + // so we need to compensate in that case +#if wxUSE_STL + wxString& operator=(const wxChar *psz) + { if(psz) wxStringBase::operator=(psz); else Clear(); return *this; } +#else + wxString& operator=(const wxChar *psz) + { return (wxString&)wxStringBase::operator=(psz); } +#endif + +#if wxUSE_UNICODE + // from wxWCharBuffer + wxString& operator=(const wxWCharBuffer& psz) + { (void) operator=((const wchar_t *)psz); return *this; } +#else // ANSI + // from another kind of C string + wxString& operator=(const unsigned char* psz); +#if wxUSE_WCHAR_T + // from a wide string + wxString& operator=(const wchar_t *pwz); +#endif + // from wxCharBuffer + wxString& operator=(const wxCharBuffer& psz) + { (void) operator=((const char *)psz); return *this; } +#endif // Unicode/ANSI + + // string concatenation + // in place concatenation + /* + Concatenate and return the result. Note that the left to right + associativity of << allows to write things like "str << str1 << str2 + << ..." (unlike with +=) + */ + // string += string + wxString& operator<<(const wxString& s) + { +#if !wxUSE_STL + wxASSERT_MSG( s.GetStringData()->IsValid(), + _T("did you forget to call UngetWriteBuf()?") ); +#endif + + append(s); + return *this; + } + // string += C string + wxString& operator<<(const wxChar *psz) + { append(psz); return *this; } + // string += char + wxString& operator<<(wxChar ch) { append(1, ch); return *this; } + + // string += buffer (i.e. from wxGetString) +#if wxUSE_UNICODE + wxString& operator<<(const wxWCharBuffer& s) + { (void)operator<<((const wchar_t *)s); return *this; } + void operator+=(const wxWCharBuffer& s) + { (void)operator<<((const wchar_t *)s); } +#else // !wxUSE_UNICODE + wxString& operator<<(const wxCharBuffer& s) + { (void)operator<<((const char *)s); return *this; } + void operator+=(const wxCharBuffer& s) + { (void)operator<<((const char *)s); } +#endif // wxUSE_UNICODE/!wxUSE_UNICODE + + // string += C string + wxString& Append(const wxString& s) + { + // test for empty() to share the string if possible + if ( empty() ) + *this = s; + else + append(s); + return *this; + } + wxString& Append(const wxChar* psz) + { append(psz); return *this; } + // append count copies of given character + wxString& Append(wxChar ch, size_t count = 1u) + { append(count, ch); return *this; } + wxString& Append(const wxChar* psz, size_t nLen) + { append(psz, nLen); return *this; } + + // prepend a string, return the string itself + wxString& Prepend(const wxString& str) + { *this = str + *this; return *this; } + + // non-destructive concatenation + // two strings + friend wxString WXDLLIMPEXP_BASE operator+(const wxString& string1, + const wxString& string2); + // string with a single char + friend wxString WXDLLIMPEXP_BASE operator+(const wxString& string, wxChar ch); + // char with a string + friend wxString WXDLLIMPEXP_BASE operator+(wxChar ch, const wxString& string); + // string with C string + friend wxString WXDLLIMPEXP_BASE operator+(const wxString& string, + const wxChar *psz); + // C string with string + friend wxString WXDLLIMPEXP_BASE operator+(const wxChar *psz, + const wxString& string); + + // stream-like functions + // insert an int into string + wxString& operator<<(int i) + { return (*this) << Format(_T("%d"), i); } + // insert an unsigned int into string + wxString& operator<<(unsigned int ui) + { return (*this) << Format(_T("%u"), ui); } + // insert a long into string + wxString& operator<<(long l) + { return (*this) << Format(_T("%ld"), l); } + // insert an unsigned long into string + wxString& operator<<(unsigned long ul) + { return (*this) << Format(_T("%lu"), ul); } +#if defined wxLongLong_t && !defined wxLongLongIsLong + // insert a long long if they exist and aren't longs + wxString& operator<<(wxLongLong_t ll) + { + const wxChar *fmt = _T("%") wxLongLongFmtSpec _T("d"); + return (*this) << Format(fmt, ll); + } + // insert an unsigned long long + wxString& operator<<(wxULongLong_t ull) + { + const wxChar *fmt = _T("%") wxLongLongFmtSpec _T("u"); + return (*this) << Format(fmt , ull); + } +#endif + // insert a float into string + wxString& operator<<(float f) + { return (*this) << Format(_T("%f"), f); } + // insert a double into string + wxString& operator<<(double d) + { return (*this) << Format(_T("%g"), d); } + + // string comparison + // case-sensitive comparison (returns a value < 0, = 0 or > 0) + int Cmp(const wxChar *psz) const; + int Cmp(const wxString& s) const; + // same as Cmp() but not case-sensitive + int CmpNoCase(const wxChar *psz) const; + int CmpNoCase(const wxString& s) const; + // test for the string equality, either considering case or not + // (if compareWithCase then the case matters) + bool IsSameAs(const wxChar *psz, bool compareWithCase = true) const + { return (compareWithCase ? Cmp(psz) : CmpNoCase(psz)) == 0; } + // comparison with a single character: returns true if equal + bool IsSameAs(wxChar c, bool compareWithCase = true) const + { + return (length() == 1) && (compareWithCase ? GetChar(0u) == c + : wxToupper(GetChar(0u)) == wxToupper(c)); + } + + // simple sub-string extraction + // return substring starting at nFirst of length nCount (or till the end + // if nCount = default value) + wxString Mid(size_t nFirst, size_t nCount = npos) const; + + // operator version of Mid() + wxString operator()(size_t start, size_t len) const + { return Mid(start, len); } + + // check if the string starts with the given prefix and return the rest + // of the string in the provided pointer if it is not NULL; otherwise + // return false + bool StartsWith(const wxChar *prefix, wxString *rest = NULL) const; + // check if the string ends with the given suffix and return the + // beginning of the string before the suffix in the provided pointer if + // it is not NULL; otherwise return false + bool EndsWith(const wxChar *suffix, wxString *rest = NULL) const; + + // get first nCount characters + wxString Left(size_t nCount) const; + // get last nCount characters + wxString Right(size_t nCount) const; + // get all characters before the first occurance of ch + // (returns the whole string if ch not found) + wxString BeforeFirst(wxChar ch) const; + // get all characters before the last occurence of ch + // (returns empty string if ch not found) + wxString BeforeLast(wxChar ch) const; + // get all characters after the first occurence of ch + // (returns empty string if ch not found) + wxString AfterFirst(wxChar ch) const; + // get all characters after the last occurence of ch + // (returns the whole string if ch not found) + wxString AfterLast(wxChar ch) const; + + // for compatibility only, use more explicitly named functions above + wxString Before(wxChar ch) const { return BeforeLast(ch); } + wxString After(wxChar ch) const { return AfterFirst(ch); } + + // case conversion + // convert to upper case in place, return the string itself + wxString& MakeUpper(); + // convert to upper case, return the copy of the string + // Here's something to remember: BC++ doesn't like returns in inlines. + wxString Upper() const ; + // convert to lower case in place, return the string itself + wxString& MakeLower(); + // convert to lower case, return the copy of the string + wxString Lower() const ; + + // trimming/padding whitespace (either side) and truncating + // remove spaces from left or from right (default) side + wxString& Trim(bool bFromRight = true); + // add nCount copies chPad in the beginning or at the end (default) + wxString& Pad(size_t nCount, wxChar chPad = wxT(' '), bool bFromRight = true); + + // searching and replacing + // searching (return starting index, or -1 if not found) + int Find(wxChar ch, bool bFromEnd = false) const; // like strchr/strrchr + // searching (return starting index, or -1 if not found) + int Find(const wxChar *pszSub) const; // like strstr + // replace first (or all of bReplaceAll) occurences of substring with + // another string, returns the number of replacements made + size_t Replace(const wxChar *szOld, + const wxChar *szNew, + bool bReplaceAll = true); + + // check if the string contents matches a mask containing '*' and '?' + bool Matches(const wxChar *szMask) const; + + // conversion to numbers: all functions return true only if the whole + // string is a number and put the value of this number into the pointer + // provided, the base is the numeric base in which the conversion should be + // done and must be comprised between 2 and 36 or be 0 in which case the + // standard C rules apply (leading '0' => octal, "0x" => hex) + // convert to a signed integer + bool ToLong(long *val, int base = 10) const; + // convert to an unsigned integer + bool ToULong(unsigned long *val, int base = 10) const; + // convert to wxLongLong +#if defined(wxLongLong_t) + bool ToLongLong(wxLongLong_t *val, int base = 10) const; + // convert to wxULongLong + bool ToULongLong(wxULongLong_t *val, int base = 10) const; +#endif // wxLongLong_t + // convert to a double + bool ToDouble(double *val) const; + + + + // formatted input/output + // as sprintf(), returns the number of characters written or < 0 on error + // (take 'this' into account in attribute parameter count) + int Printf(const wxChar *pszFormat, ...) ATTRIBUTE_PRINTF_2; + // as vprintf(), returns the number of characters written or < 0 on error + int PrintfV(const wxChar* pszFormat, va_list argptr); + + // returns the string containing the result of Printf() to it + static wxString Format(const wxChar *pszFormat, ...) ATTRIBUTE_PRINTF_1; + // the same as above, but takes a va_list + static wxString FormatV(const wxChar *pszFormat, va_list argptr); + + // raw access to string memory + // ensure that string has space for at least nLen characters + // only works if the data of this string is not shared + bool Alloc(size_t nLen) { reserve(nLen); /*return capacity() >= nLen;*/ return true; } + // minimize the string's memory + // only works if the data of this string is not shared + bool Shrink(); +#if !wxUSE_STL + // get writable buffer of at least nLen bytes. Unget() *must* be called + // a.s.a.p. to put string back in a reasonable state! + wxChar *GetWriteBuf(size_t nLen); + // call this immediately after GetWriteBuf() has been used + void UngetWriteBuf(); + void UngetWriteBuf(size_t nLen); +#endif + + // wxWidgets version 1 compatibility functions + + // use Mid() + wxString SubString(size_t from, size_t to) const + { return Mid(from, (to - from + 1)); } + // values for second parameter of CompareTo function + enum caseCompare {exact, ignoreCase}; + // values for first parameter of Strip function + enum stripType {leading = 0x1, trailing = 0x2, both = 0x3}; + + // use Printf() + // (take 'this' into account in attribute parameter count) + int sprintf(const wxChar *pszFormat, ...) ATTRIBUTE_PRINTF_2; + + // use Cmp() + inline int CompareTo(const wxChar* psz, caseCompare cmp = exact) const + { return cmp == exact ? Cmp(psz) : CmpNoCase(psz); } + + // use Len + size_t Length() const { return length(); } + // Count the number of characters + int Freq(wxChar ch) const; + // use MakeLower + void LowerCase() { MakeLower(); } + // use MakeUpper + void UpperCase() { MakeUpper(); } + // use Trim except that it doesn't change this string + wxString Strip(stripType w = trailing) const; + + // use Find (more general variants not yet supported) + size_t Index(const wxChar* psz) const { return Find(psz); } + size_t Index(wxChar ch) const { return Find(ch); } + // use Truncate + wxString& Remove(size_t pos) { return Truncate(pos); } + wxString& RemoveLast(size_t n = 1) { return Truncate(length() - n); } + + wxString& Remove(size_t nStart, size_t nLen) + { return (wxString&)erase( nStart, nLen ); } + + // use Find() + int First( const wxChar ch ) const { return Find(ch); } + int First( const wxChar* psz ) const { return Find(psz); } + int First( const wxString &str ) const { return Find(str); } + int Last( const wxChar ch ) const { return Find(ch, true); } + bool Contains(const wxString& str) const { return Find(str) != wxNOT_FOUND; } + + // use empty() + bool IsNull() const { return empty(); } + + // std::string compatibility functions + + // take nLen chars starting at nPos + wxString(const wxString& str, size_t nPos, size_t nLen) + : wxStringBase(str, nPos, nLen) { } + // take all characters from pStart to pEnd + wxString(const void *pStart, const void *pEnd) + : wxStringBase((const wxChar*)pStart, (const wxChar*)pEnd) { } +#if wxUSE_STL + wxString(const_iterator first, const_iterator last) + : wxStringBase(first, last) { } +#endif + + // lib.string.modifiers + // append elements str[pos], ..., str[pos+n] + wxString& append(const wxString& str, size_t pos, size_t n) + { return (wxString&)wxStringBase::append(str, pos, n); } + // append a string + wxString& append(const wxString& str) + { return (wxString&)wxStringBase::append(str); } + // append first n (or all if n == npos) characters of sz + wxString& append(const wxChar *sz) + { return (wxString&)wxStringBase::append(sz); } + wxString& append(const wxChar *sz, size_t n) + { return (wxString&)wxStringBase::append(sz, n); } + // append n copies of ch + wxString& append(size_t n, wxChar ch) + { return (wxString&)wxStringBase::append(n, ch); } + // append from first to last + wxString& append(const_iterator first, const_iterator last) + { return (wxString&)wxStringBase::append(first, last); } + + // same as `this_string = str' + wxString& assign(const wxString& str) + { return (wxString&)wxStringBase::assign(str); } + // same as ` = str[pos..pos + n] + wxString& assign(const wxString& str, size_t pos, size_t n) + { return (wxString&)wxStringBase::assign(str, pos, n); } + // same as `= first n (or all if n == npos) characters of sz' + wxString& assign(const wxChar *sz) + { return (wxString&)wxStringBase::assign(sz); } + wxString& assign(const wxChar *sz, size_t n) + { return (wxString&)wxStringBase::assign(sz, n); } + // same as `= n copies of ch' + wxString& assign(size_t n, wxChar ch) + { return (wxString&)wxStringBase::assign(n, ch); } + // assign from first to last + wxString& assign(const_iterator first, const_iterator last) + { return (wxString&)wxStringBase::assign(first, last); } + + // string comparison +#if !defined(HAVE_STD_STRING_COMPARE) + int compare(const wxStringBase& str) const; + // comparison with a substring + int compare(size_t nStart, size_t nLen, const wxStringBase& str) const; + // comparison of 2 substrings + int compare(size_t nStart, size_t nLen, + const wxStringBase& str, size_t nStart2, size_t nLen2) const; + // just like strcmp() + int compare(const wxChar* sz) const; + // substring comparison with first nCount characters of sz + int compare(size_t nStart, size_t nLen, + const wxChar* sz, size_t nCount = npos) const; +#endif // !defined HAVE_STD_STRING_COMPARE + + // insert another string + wxString& insert(size_t nPos, const wxString& str) + { return (wxString&)wxStringBase::insert(nPos, str); } + // insert n chars of str starting at nStart (in str) + wxString& insert(size_t nPos, const wxString& str, size_t nStart, size_t n) + { return (wxString&)wxStringBase::insert(nPos, str, nStart, n); } + // insert first n (or all if n == npos) characters of sz + wxString& insert(size_t nPos, const wxChar *sz) + { return (wxString&)wxStringBase::insert(nPos, sz); } + wxString& insert(size_t nPos, const wxChar *sz, size_t n) + { return (wxString&)wxStringBase::insert(nPos, sz, n); } + // insert n copies of ch + wxString& insert(size_t nPos, size_t n, wxChar ch) + { return (wxString&)wxStringBase::insert(nPos, n, ch); } + iterator insert(iterator it, wxChar ch) + { return wxStringBase::insert(it, ch); } + void insert(iterator it, const_iterator first, const_iterator last) + { wxStringBase::insert(it, first, last); } + void insert(iterator it, size_type n, wxChar ch) + { wxStringBase::insert(it, n, ch); } + + // delete characters from nStart to nStart + nLen + wxString& erase(size_type pos = 0, size_type n = npos) + { return (wxString&)wxStringBase::erase(pos, n); } + iterator erase(iterator first, iterator last) + { return wxStringBase::erase(first, last); } + iterator erase(iterator first) + { return wxStringBase::erase(first); } + +#ifdef wxSTRING_BASE_HASNT_CLEAR + void clear() { erase(); } +#endif + + // replaces the substring of length nLen starting at nStart + wxString& replace(size_t nStart, size_t nLen, const wxChar* sz) + { return (wxString&)wxStringBase::replace(nStart, nLen, sz); } + // replaces the substring of length nLen starting at nStart + wxString& replace(size_t nStart, size_t nLen, const wxString& str) + { return (wxString&)wxStringBase::replace(nStart, nLen, str); } + // replaces the substring with nCount copies of ch + wxString& replace(size_t nStart, size_t nLen, size_t nCount, wxChar ch) + { return (wxString&)wxStringBase::replace(nStart, nLen, nCount, ch); } + // replaces a substring with another substring + wxString& replace(size_t nStart, size_t nLen, + const wxString& str, size_t nStart2, size_t nLen2) + { return (wxString&)wxStringBase::replace(nStart, nLen, str, + nStart2, nLen2); } + // replaces the substring with first nCount chars of sz + wxString& replace(size_t nStart, size_t nLen, + const wxChar* sz, size_t nCount) + { return (wxString&)wxStringBase::replace(nStart, nLen, sz, nCount); } + wxString& replace(iterator first, iterator last, const_pointer s) + { return (wxString&)wxStringBase::replace(first, last, s); } + wxString& replace(iterator first, iterator last, const_pointer s, + size_type n) + { return (wxString&)wxStringBase::replace(first, last, s, n); } + wxString& replace(iterator first, iterator last, const wxString& s) + { return (wxString&)wxStringBase::replace(first, last, s); } + wxString& replace(iterator first, iterator last, size_type n, wxChar c) + { return (wxString&)wxStringBase::replace(first, last, n, c); } + wxString& replace(iterator first, iterator last, + const_iterator first1, const_iterator last1) + { return (wxString&)wxStringBase::replace(first, last, first1, last1); } + + // string += string + wxString& operator+=(const wxString& s) + { return (wxString&)wxStringBase::operator+=(s); } + // string += C string + wxString& operator+=(const wxChar *psz) + { return (wxString&)wxStringBase::operator+=(psz); } + // string += char + wxString& operator+=(wxChar ch) + { return (wxString&)wxStringBase::operator+=(ch); } +}; + +// notice that even though for many compilers the friend declarations above are +// enough, from the point of view of C++ standard we must have the declarations +// here as friend ones are not injected in the enclosing namespace and without +// them the code fails to compile with conforming compilers such as xlC or g++4 +wxString WXDLLIMPEXP_BASE operator+(const wxString& string1, const wxString& string2); +wxString WXDLLIMPEXP_BASE operator+(const wxString& string, wxChar ch); +wxString WXDLLIMPEXP_BASE operator+(wxChar ch, const wxString& string); +wxString WXDLLIMPEXP_BASE operator+(const wxString& string, const wxChar *psz); +wxString WXDLLIMPEXP_BASE operator+(const wxChar *psz, const wxString& string); + + +// define wxArrayString, for compatibility +#if WXWIN_COMPATIBILITY_2_4 && !wxUSE_STL + #include "wx/arrstr.h" +#endif + +#if wxUSE_STL + // return an empty wxString (not very useful with wxUSE_STL == 1) + inline const wxString wxGetEmptyString() { return wxString(); } +#else // !wxUSE_STL + // return an empty wxString (more efficient than wxString() here) + inline const wxString& wxGetEmptyString() + { + return *(wxString *)&wxEmptyString; + } +#endif // wxUSE_STL/!wxUSE_STL + +// ---------------------------------------------------------------------------- +// wxStringBuffer: a tiny class allowing to get a writable pointer into string +// ---------------------------------------------------------------------------- + +#if wxUSE_STL + +class WXDLLIMPEXP_BASE wxStringBuffer +{ +public: + wxStringBuffer(wxString& str, size_t lenWanted = 1024) + : m_str(str), m_buf(lenWanted) + { } + + ~wxStringBuffer() { m_str.assign(m_buf.data(), wxStrlen(m_buf.data())); } + + operator wxChar*() { return m_buf.data(); } + +private: + wxString& m_str; +#if wxUSE_UNICODE + wxWCharBuffer m_buf; +#else + wxCharBuffer m_buf; +#endif + + DECLARE_NO_COPY_CLASS(wxStringBuffer) +}; + +class WXDLLIMPEXP_BASE wxStringBufferLength +{ +public: + wxStringBufferLength(wxString& str, size_t lenWanted = 1024) + : m_str(str), m_buf(lenWanted), m_len(0), m_lenSet(false) + { } + + ~wxStringBufferLength() + { + wxASSERT(m_lenSet); + m_str.assign(m_buf.data(), m_len); + } + + operator wxChar*() { return m_buf.data(); } + void SetLength(size_t length) { m_len = length; m_lenSet = true; } + +private: + wxString& m_str; +#if wxUSE_UNICODE + wxWCharBuffer m_buf; +#else + wxCharBuffer m_buf; +#endif + size_t m_len; + bool m_lenSet; + + DECLARE_NO_COPY_CLASS(wxStringBufferLength) +}; + +#else // if !wxUSE_STL + +class WXDLLIMPEXP_BASE wxStringBuffer +{ +public: + wxStringBuffer(wxString& str, size_t lenWanted = 1024) + : m_str(str), m_buf(NULL) + { m_buf = m_str.GetWriteBuf(lenWanted); } + + ~wxStringBuffer() { m_str.UngetWriteBuf(); } + + operator wxChar*() const { return m_buf; } + +private: + wxString& m_str; + wxChar *m_buf; + + DECLARE_NO_COPY_CLASS(wxStringBuffer) +}; + +class WXDLLIMPEXP_BASE wxStringBufferLength +{ +public: + wxStringBufferLength(wxString& str, size_t lenWanted = 1024) + : m_str(str), m_buf(NULL), m_len(0), m_lenSet(false) + { + m_buf = m_str.GetWriteBuf(lenWanted); + wxASSERT(m_buf != NULL); + } + + ~wxStringBufferLength() + { + wxASSERT(m_lenSet); + m_str.UngetWriteBuf(m_len); + } + + operator wxChar*() const { return m_buf; } + void SetLength(size_t length) { m_len = length; m_lenSet = true; } + +private: + wxString& m_str; + wxChar *m_buf; + size_t m_len; + bool m_lenSet; + + DECLARE_NO_COPY_CLASS(wxStringBufferLength) +}; + +#endif // !wxUSE_STL + +// --------------------------------------------------------------------------- +// wxString comparison functions: operator versions are always case sensitive +// --------------------------------------------------------------------------- + +// note that when wxUSE_STL == 1 the comparison operators taking std::string +// are used and defining them also for wxString would only result in +// compilation ambiguities when comparing std::string and wxString +#if !wxUSE_STL + +inline bool operator==(const wxString& s1, const wxString& s2) + { return (s1.Len() == s2.Len()) && (s1.Cmp(s2) == 0); } +inline bool operator==(const wxString& s1, const wxChar * s2) + { return s1.Cmp(s2) == 0; } +inline bool operator==(const wxChar * s1, const wxString& s2) + { return s2.Cmp(s1) == 0; } +inline bool operator!=(const wxString& s1, const wxString& s2) + { return (s1.Len() != s2.Len()) || (s1.Cmp(s2) != 0); } +inline bool operator!=(const wxString& s1, const wxChar * s2) + { return s1.Cmp(s2) != 0; } +inline bool operator!=(const wxChar * s1, const wxString& s2) + { return s2.Cmp(s1) != 0; } +inline bool operator< (const wxString& s1, const wxString& s2) + { return s1.Cmp(s2) < 0; } +inline bool operator< (const wxString& s1, const wxChar * s2) + { return s1.Cmp(s2) < 0; } +inline bool operator< (const wxChar * s1, const wxString& s2) + { return s2.Cmp(s1) > 0; } +inline bool operator> (const wxString& s1, const wxString& s2) + { return s1.Cmp(s2) > 0; } +inline bool operator> (const wxString& s1, const wxChar * s2) + { return s1.Cmp(s2) > 0; } +inline bool operator> (const wxChar * s1, const wxString& s2) + { return s2.Cmp(s1) < 0; } +inline bool operator<=(const wxString& s1, const wxString& s2) + { return s1.Cmp(s2) <= 0; } +inline bool operator<=(const wxString& s1, const wxChar * s2) + { return s1.Cmp(s2) <= 0; } +inline bool operator<=(const wxChar * s1, const wxString& s2) + { return s2.Cmp(s1) >= 0; } +inline bool operator>=(const wxString& s1, const wxString& s2) + { return s1.Cmp(s2) >= 0; } +inline bool operator>=(const wxString& s1, const wxChar * s2) + { return s1.Cmp(s2) >= 0; } +inline bool operator>=(const wxChar * s1, const wxString& s2) + { return s2.Cmp(s1) <= 0; } + +#if wxUSE_UNICODE +inline bool operator==(const wxString& s1, const wxWCharBuffer& s2) + { return (s1.Cmp((const wchar_t *)s2) == 0); } +inline bool operator==(const wxWCharBuffer& s1, const wxString& s2) + { return (s2.Cmp((const wchar_t *)s1) == 0); } +inline bool operator!=(const wxString& s1, const wxWCharBuffer& s2) + { return (s1.Cmp((const wchar_t *)s2) != 0); } +inline bool operator!=(const wxWCharBuffer& s1, const wxString& s2) + { return (s2.Cmp((const wchar_t *)s1) != 0); } +#else // !wxUSE_UNICODE +inline bool operator==(const wxString& s1, const wxCharBuffer& s2) + { return (s1.Cmp((const char *)s2) == 0); } +inline bool operator==(const wxCharBuffer& s1, const wxString& s2) + { return (s2.Cmp((const char *)s1) == 0); } +inline bool operator!=(const wxString& s1, const wxCharBuffer& s2) + { return (s1.Cmp((const char *)s2) != 0); } +inline bool operator!=(const wxCharBuffer& s1, const wxString& s2) + { return (s2.Cmp((const char *)s1) != 0); } +#endif // wxUSE_UNICODE/!wxUSE_UNICODE + +#if wxUSE_UNICODE +inline wxString operator+(const wxString& string, const wxWCharBuffer& buf) + { return string + (const wchar_t *)buf; } +inline wxString operator+(const wxWCharBuffer& buf, const wxString& string) + { return (const wchar_t *)buf + string; } +#else // !wxUSE_UNICODE +inline wxString operator+(const wxString& string, const wxCharBuffer& buf) + { return string + (const char *)buf; } +inline wxString operator+(const wxCharBuffer& buf, const wxString& string) + { return (const char *)buf + string; } +#endif // wxUSE_UNICODE/!wxUSE_UNICODE + +#endif // !wxUSE_STL + +// comparison with char (those are not defined by std::[w]string and so should +// be always available) +inline bool operator==(wxChar c, const wxString& s) { return s.IsSameAs(c); } +inline bool operator==(const wxString& s, wxChar c) { return s.IsSameAs(c); } +inline bool operator!=(wxChar c, const wxString& s) { return !s.IsSameAs(c); } +inline bool operator!=(const wxString& s, wxChar c) { return !s.IsSameAs(c); } + +// --------------------------------------------------------------------------- +// Implementation only from here until the end of file +// --------------------------------------------------------------------------- + +// don't pollute the library user's name space +#undef wxASSERT_VALID_INDEX + +#if wxUSE_STD_IOSTREAM + +#include "wx/iosfwrap.h" + +WXDLLIMPEXP_BASE wxSTD ostream& operator<<(wxSTD ostream&, const wxString&); + +#endif // wxSTD_STRING_COMPATIBILITY + +#endif // _WX_WXSTRINGH__ diff --git a/Externals/wxWidgets/include/wx/sysopt.h b/Externals/wxWidgets/include/wx/sysopt.h new file mode 100644 index 0000000000..5c79a5478e --- /dev/null +++ b/Externals/wxWidgets/include/wx/sysopt.h @@ -0,0 +1,71 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: sysopt.h +// Purpose: wxSystemOptions +// Author: Julian Smart +// Modified by: +// Created: 2001-07-10 +// RCS-ID: $Id: sysopt.h 33004 2005-03-23 20:48:50Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_SYSOPT_H_ +#define _WX_SYSOPT_H_ + +#include "wx/object.h" + +// ---------------------------------------------------------------------------- +// Enables an application to influence the wxWidgets implementation +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxSystemOptions : public wxObject +{ +public: + wxSystemOptions() { } + + // User-customizable hints to wxWidgets or associated libraries + // These could also be used to influence GetSystem... calls, indeed + // to implement SetSystemColour/Font/Metric + +#if wxUSE_SYSTEM_OPTIONS + static void SetOption(const wxString& name, const wxString& value); + static void SetOption(const wxString& name, int value); +#endif // wxUSE_SYSTEM_OPTIONS + static wxString GetOption(const wxString& name); + static int GetOptionInt(const wxString& name); + static bool HasOption(const wxString& name); + + static bool IsFalse(const wxString& name) + { + return HasOption(name) && GetOptionInt(name) == 0; + } +}; + +#if !wxUSE_SYSTEM_OPTIONS + +// define inline stubs for accessors to make it possible to use wxSystemOptions +// in the library itself without checking for wxUSE_SYSTEM_OPTIONS all the time + +/* static */ inline +wxString wxSystemOptions::GetOption(const wxString& WXUNUSED(name)) +{ + return wxEmptyString; +} + +/* static */ inline +int wxSystemOptions::GetOptionInt(const wxString& WXUNUSED(name)) +{ + return 0; +} + +/* static */ inline +bool wxSystemOptions::HasOption(const wxString& WXUNUSED(name)) +{ + return false; +} + +#endif // !wxUSE_SYSTEM_OPTIONS + +#endif + // _WX_SYSOPT_H_ + diff --git a/Externals/wxWidgets/include/wx/tab.h b/Externals/wxWidgets/include/wx/tab.h new file mode 100644 index 0000000000..630d982e81 --- /dev/null +++ b/Externals/wxWidgets/include/wx/tab.h @@ -0,0 +1,22 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/tab.h +// Purpose: Generic tab class base header +// Author: Julian Smart +// Modified by: +// Created: +// Copyright: (c) Julian Smart +// RCS-ID: $Id: tab.h 37400 2006-02-09 00:28:34Z VZ $ +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_TAB_H_BASE_ +#define _WX_TAB_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_TAB_DIALOG +#include "wx/generic/tabg.h" +#endif + +#endif + // _WX_TAB_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/tabctrl.h b/Externals/wxWidgets/include/wx/tabctrl.h new file mode 100644 index 0000000000..56e22c22ac --- /dev/null +++ b/Externals/wxWidgets/include/wx/tabctrl.h @@ -0,0 +1,34 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/tabctrl.h +// Purpose: wxTabCtrl base header +// Author: Julian Smart +// Modified by: +// Created: +// Copyright: (c) Julian Smart +// RCS-ID: $Id: tabctrl.h 38943 2006-04-28 10:14:27Z ABX $ +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_TABCTRL_H_BASE_ +#define _WX_TABCTRL_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_TAB_DIALOG + +BEGIN_DECLARE_EVENT_TYPES() + DECLARE_EVENT_TYPE(wxEVT_COMMAND_TAB_SEL_CHANGED, 800) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_TAB_SEL_CHANGING, 801) +END_DECLARE_EVENT_TYPES() + +#if defined(__WXMSW__) + #include "wx/msw/tabctrl.h" +#elif defined(__WXMAC__) + #include "wx/mac/tabctrl.h" +#elif defined(__WXPM__) + #include "wx/os2/tabctrl.h" +#endif + +#endif // wxUSE_TAB_DIALOG +#endif + // _WX_TABCTRL_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/tarstrm.h b/Externals/wxWidgets/include/wx/tarstrm.h new file mode 100644 index 0000000000..c18400225f --- /dev/null +++ b/Externals/wxWidgets/include/wx/tarstrm.h @@ -0,0 +1,352 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/tarstrm.h +// Purpose: Streams for Tar files +// Author: Mike Wetherell +// RCS-ID: $Id: tarstrm.h 43887 2006-12-09 22:28:11Z MW $ +// Copyright: (c) 2004 Mike Wetherell +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_WXTARSTREAM_H__ +#define _WX_WXTARSTREAM_H__ + +#include "wx/defs.h" + +#if wxUSE_TARSTREAM + +#include "wx/archive.h" +#include "wx/hashmap.h" + + +///////////////////////////////////////////////////////////////////////////// +// Constants + +// TypeFlag values +enum { + wxTAR_REGTYPE = '0', // regular file + wxTAR_LNKTYPE = '1', // hard link + wxTAR_SYMTYPE = '2', // symbolic link + wxTAR_CHRTYPE = '3', // character special + wxTAR_BLKTYPE = '4', // block special + wxTAR_DIRTYPE = '5', // directory + wxTAR_FIFOTYPE = '6', // named pipe + wxTAR_CONTTYPE = '7' // contiguous file +}; + +// Archive Formats (use wxTAR_PAX, it's backward compatible) +enum wxTarFormat +{ + wxTAR_USTAR, // POSIX.1-1990 tar format + wxTAR_PAX // POSIX.1-2001 tar format +}; + + +///////////////////////////////////////////////////////////////////////////// +// wxTarNotifier + +class WXDLLIMPEXP_BASE wxTarNotifier +{ +public: + virtual ~wxTarNotifier() { } + + virtual void OnEntryUpdated(class wxTarEntry& entry) = 0; +}; + + +///////////////////////////////////////////////////////////////////////////// +// Tar Entry - hold the meta data for a file in the tar + +class WXDLLIMPEXP_BASE wxTarEntry : public wxArchiveEntry +{ +public: + wxTarEntry(const wxString& name = wxEmptyString, + const wxDateTime& dt = wxDateTime::Now(), + wxFileOffset size = wxInvalidOffset); + virtual ~wxTarEntry(); + + wxTarEntry(const wxTarEntry& entry); + wxTarEntry& operator=(const wxTarEntry& entry); + + // Get accessors + wxString GetName(wxPathFormat format = wxPATH_NATIVE) const; + wxString GetInternalName() const { return m_Name; } + wxPathFormat GetInternalFormat() const { return wxPATH_UNIX; } + int GetMode() const; + int GetUserId() const { return m_UserId; } + int GetGroupId() const { return m_GroupId; } + wxFileOffset GetSize() const { return m_Size; } + wxFileOffset GetOffset() const { return m_Offset; } + wxDateTime GetDateTime() const { return m_ModifyTime; } + wxDateTime GetAccessTime() const { return m_AccessTime; } + wxDateTime GetCreateTime() const { return m_CreateTime; } + int GetTypeFlag() const { return m_TypeFlag; } + wxString GetLinkName() const { return m_LinkName; } + wxString GetUserName() const { return m_UserName; } + wxString GetGroupName() const { return m_GroupName; } + int GetDevMajor() const { return m_DevMajor; } + int GetDevMinor() const { return m_DevMinor; } + + // is accessors + bool IsDir() const; + bool IsReadOnly() const { return !(m_Mode & 0222); } + + // set accessors + void SetName(const wxString& name, wxPathFormat format = wxPATH_NATIVE); + void SetUserId(int id) { m_UserId = id; } + void SetGroupId(int id) { m_GroupId = id; } + void SetMode(int mode); + void SetSize(wxFileOffset size) { m_Size = size; } + void SetDateTime(const wxDateTime& dt) { m_ModifyTime = dt; } + void SetAccessTime(const wxDateTime& dt) { m_AccessTime = dt; } + void SetCreateTime(const wxDateTime& dt) { m_CreateTime = dt; } + void SetTypeFlag(int type) { m_TypeFlag = type; } + void SetLinkName(const wxString& link) { m_LinkName = link; } + void SetUserName(const wxString& user) { m_UserName = user; } + void SetGroupName(const wxString& group) { m_GroupName = group; } + void SetDevMajor(int dev) { m_DevMajor = dev; } + void SetDevMinor(int dev) { m_DevMinor = dev; } + + // set is accessors + void SetIsDir(bool isDir = true); + void SetIsReadOnly(bool isReadOnly = true); + + static wxString GetInternalName(const wxString& name, + wxPathFormat format = wxPATH_NATIVE, + bool *pIsDir = NULL); + + wxTarEntry *Clone() const { return new wxTarEntry(*this); } + + void SetNotifier(wxTarNotifier& WXUNUSED(notifier)) { } + +private: + void SetOffset(wxFileOffset offset) { m_Offset = offset; } + + virtual wxArchiveEntry* DoClone() const { return Clone(); } + + wxString m_Name; + int m_Mode; + bool m_IsModeSet; + int m_UserId; + int m_GroupId; + wxFileOffset m_Size; + wxFileOffset m_Offset; + wxDateTime m_ModifyTime; + wxDateTime m_AccessTime; + wxDateTime m_CreateTime; + int m_TypeFlag; + wxString m_LinkName; + wxString m_UserName; + wxString m_GroupName; + int m_DevMajor; + int m_DevMinor; + + friend class wxTarInputStream; + + DECLARE_DYNAMIC_CLASS(wxTarEntry) +}; + + +///////////////////////////////////////////////////////////////////////////// +// wxTarInputStream + +WX_DECLARE_STRING_HASH_MAP(wxString, wxTarHeaderRecords); + +class WXDLLIMPEXP_BASE wxTarInputStream : public wxArchiveInputStream +{ +public: + typedef wxTarEntry entry_type; + + wxTarInputStream(wxInputStream& stream, wxMBConv& conv = wxConvLocal); + wxTarInputStream(wxInputStream *stream, wxMBConv& conv = wxConvLocal); + virtual ~wxTarInputStream(); + + bool OpenEntry(wxTarEntry& entry); + bool CloseEntry(); + + wxTarEntry *GetNextEntry(); + + wxFileOffset GetLength() const { return m_size; } + bool IsSeekable() const { return m_parent_i_stream->IsSeekable(); } + +protected: + size_t OnSysRead(void *buffer, size_t size); + wxFileOffset OnSysTell() const { return m_pos; } + wxFileOffset OnSysSeek(wxFileOffset seek, wxSeekMode mode); + +private: + void Init(); + + wxArchiveEntry *DoGetNextEntry() { return GetNextEntry(); } + bool OpenEntry(wxArchiveEntry& entry); + bool IsOpened() const { return m_pos != wxInvalidOffset; } + + wxStreamError ReadHeaders(); + bool ReadExtendedHeader(wxTarHeaderRecords*& recs); + + wxString GetExtendedHeader(const wxString& key) const; + wxString GetHeaderPath() const; + wxFileOffset GetHeaderNumber(int id) const; + wxString GetHeaderString(int id) const; + wxDateTime GetHeaderDate(const wxString& key) const; + + wxFileOffset m_pos; // position within the current entry + wxFileOffset m_offset; // offset to the start of the entry's data + wxFileOffset m_size; // size of the current entry's data + + int m_sumType; + int m_tarType; + class wxTarHeaderBlock *m_hdr; + wxTarHeaderRecords *m_HeaderRecs; + wxTarHeaderRecords *m_GlobalHeaderRecs; + + DECLARE_NO_COPY_CLASS(wxTarInputStream) +}; + + +///////////////////////////////////////////////////////////////////////////// +// wxTarOutputStream + +class WXDLLIMPEXP_BASE wxTarOutputStream : public wxArchiveOutputStream +{ +public: + wxTarOutputStream(wxOutputStream& stream, + wxTarFormat format = wxTAR_PAX, + wxMBConv& conv = wxConvLocal); + wxTarOutputStream(wxOutputStream *stream, + wxTarFormat format = wxTAR_PAX, + wxMBConv& conv = wxConvLocal); + virtual ~wxTarOutputStream(); + + bool PutNextEntry(wxTarEntry *entry); + + bool PutNextEntry(const wxString& name, + const wxDateTime& dt = wxDateTime::Now(), + wxFileOffset size = wxInvalidOffset); + + bool PutNextDirEntry(const wxString& name, + const wxDateTime& dt = wxDateTime::Now()); + + bool CopyEntry(wxTarEntry *entry, wxTarInputStream& inputStream); + bool CopyArchiveMetaData(wxTarInputStream& WXUNUSED(s)) { return true; } + + void Sync(); + bool CloseEntry(); + bool Close(); + + bool IsSeekable() const { return m_parent_o_stream->IsSeekable(); } + + void SetBlockingFactor(int factor) { m_BlockingFactor = factor; } + int GetBlockingFactor() const { return m_BlockingFactor; } + +protected: + size_t OnSysWrite(const void *buffer, size_t size); + wxFileOffset OnSysTell() const { return m_pos; } + wxFileOffset OnSysSeek(wxFileOffset pos, wxSeekMode mode); + +private: + void Init(wxTarFormat format); + + bool PutNextEntry(wxArchiveEntry *entry); + bool CopyEntry(wxArchiveEntry *entry, wxArchiveInputStream& stream); + bool CopyArchiveMetaData(wxArchiveInputStream& WXUNUSED(s)) { return true; } + bool IsOpened() const { return m_pos != wxInvalidOffset; } + + bool WriteHeaders(wxTarEntry& entry); + bool ModifyHeader(); + wxString PaxHeaderPath(const wxString& format, const wxString& path); + + void SetExtendedHeader(const wxString& key, const wxString& value); + void SetHeaderPath(const wxString& name); + bool SetHeaderNumber(int id, wxFileOffset n); + void SetHeaderString(int id, const wxString& str); + void SetHeaderDate(const wxString& key, const wxDateTime& datetime); + + wxFileOffset m_pos; // position within the current entry + wxFileOffset m_maxpos; // max pos written + wxFileOffset m_size; // expected entry size + + wxFileOffset m_headpos; // offset within the file to the entry's header + wxFileOffset m_datapos; // offset within the file to the entry's data + + wxFileOffset m_tarstart;// offset within the file to the tar + wxFileOffset m_tarsize; // size of tar so far + + bool m_pax; + int m_BlockingFactor; + wxUint32 m_chksum; + bool m_large; + class wxTarHeaderBlock *m_hdr; + class wxTarHeaderBlock *m_hdr2; + char *m_extendedHdr; + size_t m_extendedSize; + wxString m_badfit; + + DECLARE_NO_COPY_CLASS(wxTarOutputStream) +}; + + +///////////////////////////////////////////////////////////////////////////// +// Iterators + +#if wxUSE_STL || defined WX_TEST_ARCHIVE_ITERATOR +typedef wxArchiveIterator<wxTarInputStream> wxTarIter; +typedef wxArchiveIterator<wxTarInputStream, + std::pair<wxString, wxTarEntry*> > wxTarPairIter; +#endif + + +///////////////////////////////////////////////////////////////////////////// +// wxTarClassFactory + +class WXDLLIMPEXP_BASE wxTarClassFactory : public wxArchiveClassFactory +{ +public: + typedef wxTarEntry entry_type; + typedef wxTarInputStream instream_type; + typedef wxTarOutputStream outstream_type; + typedef wxTarNotifier notifier_type; +#if wxUSE_STL || defined WX_TEST_ARCHIVE_ITERATOR + typedef wxTarIter iter_type; + typedef wxTarPairIter pairiter_type; +#endif + + wxTarClassFactory(); + + wxTarEntry *NewEntry() const + { return new wxTarEntry; } + wxTarInputStream *NewStream(wxInputStream& stream) const + { return new wxTarInputStream(stream, GetConv()); } + wxTarOutputStream *NewStream(wxOutputStream& stream) const + { return new wxTarOutputStream(stream, wxTAR_PAX, GetConv()); } + wxTarInputStream *NewStream(wxInputStream *stream) const + { return new wxTarInputStream(stream, GetConv()); } + wxTarOutputStream *NewStream(wxOutputStream *stream) const + { return new wxTarOutputStream(stream, wxTAR_PAX, GetConv()); } + + wxString GetInternalName(const wxString& name, + wxPathFormat format = wxPATH_NATIVE) const + { return wxTarEntry::GetInternalName(name, format); } + + const wxChar * const *GetProtocols(wxStreamProtocolType type + = wxSTREAM_PROTOCOL) const; + +protected: + wxArchiveEntry *DoNewEntry() const + { return NewEntry(); } + wxArchiveInputStream *DoNewStream(wxInputStream& stream) const + { return NewStream(stream); } + wxArchiveOutputStream *DoNewStream(wxOutputStream& stream) const + { return NewStream(stream); } + wxArchiveInputStream *DoNewStream(wxInputStream *stream) const + { return NewStream(stream); } + wxArchiveOutputStream *DoNewStream(wxOutputStream *stream) const + { return NewStream(stream); } + +private: + DECLARE_DYNAMIC_CLASS(wxTarClassFactory) +}; + + +#endif // wxUSE_TARSTREAM + +#endif // _WX_WXTARSTREAM_H__ diff --git a/Externals/wxWidgets/include/wx/taskbar.h b/Externals/wxWidgets/include/wx/taskbar.h new file mode 100644 index 0000000000..3a204df112 --- /dev/null +++ b/Externals/wxWidgets/include/wx/taskbar.h @@ -0,0 +1,124 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/taskbar.h +// Purpose: wxTaskBarIcon base header and class +// Author: Julian Smart +// Modified by: +// Created: +// Copyright: (c) Julian Smart +// RCS-ID: $Id: taskbar.h 44138 2007-01-07 19:44:14Z VZ $ +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_TASKBAR_H_BASE_ +#define _WX_TASKBAR_H_BASE_ + +#include "wx/defs.h" + +#ifdef wxHAS_TASK_BAR_ICON + +#include "wx/event.h" + +class WXDLLIMPEXP_ADV wxTaskBarIconEvent; + +// ---------------------------------------------------------------------------- +// wxTaskBarIconBase: define wxTaskBarIcon interface +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxTaskBarIconBase : public wxEvtHandler +{ +public: + wxTaskBarIconBase() { } + + // Operations: + virtual bool SetIcon(const wxIcon& icon, + const wxString& tooltip = wxEmptyString) = 0; + virtual bool RemoveIcon() = 0; + virtual bool PopupMenu(wxMenu *menu) = 0; + +protected: + // creates menu to be displayed when user clicks on the icon + virtual wxMenu *CreatePopupMenu() { return NULL; } + +private: + // default events handling, calls CreatePopupMenu: + void OnRightButtonDown(wxTaskBarIconEvent& event); + + DECLARE_EVENT_TABLE() + DECLARE_NO_COPY_CLASS(wxTaskBarIconBase) +}; + + +// ---------------------------------------------------------------------------- +// now include the actual class declaration +// ---------------------------------------------------------------------------- + +#if defined(__WXPALMOS__) + #include "wx/palmos/taskbar.h" +#elif defined(__WXMSW__) + #include "wx/msw/taskbar.h" +#elif defined(__WXGTK__) || defined(__WXX11__) || defined(__WXMOTIF__) + #include "wx/unix/taskbarx11.h" +#elif defined (__WXMAC__) && defined(__WXMAC_OSX__) + #include "wx/mac/taskbarosx.h" +#elif defined (__WXCOCOA__) + #include "wx/cocoa/taskbar.h" +#endif + +// ---------------------------------------------------------------------------- +// wxTaskBarIcon events +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxTaskBarIconEvent : public wxEvent +{ +public: + wxTaskBarIconEvent(wxEventType evtType, wxTaskBarIcon *tbIcon) + : wxEvent(wxID_ANY, evtType) + { + SetEventObject(tbIcon); + } + + virtual wxEvent *Clone() const { return new wxTaskBarIconEvent(*this); } + +private: + DECLARE_NO_ASSIGN_CLASS(wxTaskBarIconEvent) +}; + +typedef void (wxEvtHandler::*wxTaskBarIconEventFunction)(wxTaskBarIconEvent&); + +BEGIN_DECLARE_EVENT_TYPES() + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV,wxEVT_TASKBAR_MOVE,1550) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV,wxEVT_TASKBAR_LEFT_DOWN,1551) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV,wxEVT_TASKBAR_LEFT_UP,1552) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV,wxEVT_TASKBAR_RIGHT_DOWN,1553) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV,wxEVT_TASKBAR_RIGHT_UP,1554) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV,wxEVT_TASKBAR_LEFT_DCLICK,1555) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV,wxEVT_TASKBAR_RIGHT_DCLICK,1556) +END_DECLARE_EVENT_TYPES() + +#define wxTaskBarIconEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxTaskBarIconEventFunction, &func) + +#define wx__DECLARE_TASKBAREVT(evt, fn) \ + wx__DECLARE_EVT0(wxEVT_TASKBAR_ ## evt, wxTaskBarIconEventHandler(fn)) + +#define EVT_TASKBAR_MOVE(fn) wx__DECLARE_TASKBAREVT(MOVE, fn) +#define EVT_TASKBAR_LEFT_DOWN(fn) wx__DECLARE_TASKBAREVT(LEFT_DOWN, fn) +#define EVT_TASKBAR_LEFT_UP(fn) wx__DECLARE_TASKBAREVT(LEFT_UP, fn) +#define EVT_TASKBAR_RIGHT_DOWN(fn) wx__DECLARE_TASKBAREVT(RIGHT_DOWN, fn) +#define EVT_TASKBAR_RIGHT_UP(fn) wx__DECLARE_TASKBAREVT(RIGHT_UP, fn) +#define EVT_TASKBAR_LEFT_DCLICK(fn) wx__DECLARE_TASKBAREVT(LEFT_DCLICK, fn) +#define EVT_TASKBAR_RIGHT_DCLICK(fn) wx__DECLARE_TASKBAREVT(RIGHT_DCLICK, fn) + +// taskbar menu is shown on right button press under all platforms except MSW +// where it's shown on right button release, using this event type and macro +// allows to write code which works correctly on all platforms +#ifdef __WXMSW__ + #define wxEVT_TASKBAR_CLICK wxEVT_TASKBAR_RIGHT_UP +#else + #define wxEVT_TASKBAR_CLICK wxEVT_TASKBAR_RIGHT_DOWN +#endif +#define EVT_TASKBAR_CLICK(fn) wx__DECLARE_TASKBAREVT(CLICK, fn) + +#endif // wxHAS_TASK_BAR_ICON + +#endif // _WX_TASKBAR_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/tbarbase.h b/Externals/wxWidgets/include/wx/tbarbase.h new file mode 100644 index 0000000000..ea6cdbf773 --- /dev/null +++ b/Externals/wxWidgets/include/wx/tbarbase.h @@ -0,0 +1,607 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/tbarbase.h +// Purpose: Base class for toolbar classes +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: tbarbase.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_TBARBASE_H_ +#define _WX_TBARBASE_H_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/defs.h" + +#if wxUSE_TOOLBAR + +#include "wx/bitmap.h" +#include "wx/list.h" +#include "wx/control.h" + +class WXDLLIMPEXP_FWD_CORE wxToolBarBase; +class WXDLLIMPEXP_FWD_CORE wxToolBarToolBase; +class WXDLLIMPEXP_FWD_CORE wxImage; + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +extern WXDLLEXPORT_DATA(const wxChar) wxToolBarNameStr[]; +extern WXDLLEXPORT_DATA(const wxSize) wxDefaultSize; +extern WXDLLEXPORT_DATA(const wxPoint) wxDefaultPosition; + +enum wxToolBarToolStyle +{ + wxTOOL_STYLE_BUTTON = 1, + wxTOOL_STYLE_SEPARATOR = 2, + wxTOOL_STYLE_CONTROL +}; + +// ---------------------------------------------------------------------------- +// wxToolBarTool is a toolbar element. +// +// It has a unique id (except for the separators which always have id wxID_ANY), the +// style (telling whether it is a normal button, separator or a control), the +// state (toggled or not, enabled or not) and short and long help strings. The +// default implementations use the short help string for the tooltip text which +// is popped up when the mouse pointer enters the tool and the long help string +// for the applications status bar. +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxToolBarToolBase : public wxObject +{ +public: + // ctors & dtor + // ------------ + + wxToolBarToolBase(wxToolBarBase *tbar = (wxToolBarBase *)NULL, + int toolid = wxID_SEPARATOR, + const wxString& label = wxEmptyString, + const wxBitmap& bmpNormal = wxNullBitmap, + const wxBitmap& bmpDisabled = wxNullBitmap, + wxItemKind kind = wxITEM_NORMAL, + wxObject *clientData = (wxObject *) NULL, + const wxString& shortHelpString = wxEmptyString, + const wxString& longHelpString = wxEmptyString) + : m_label(label), + m_shortHelpString(shortHelpString), + m_longHelpString(longHelpString) + { + m_tbar = tbar; + m_id = toolid; + if (m_id == wxID_ANY) + m_id = wxNewId(); + m_clientData = clientData; + + m_bmpNormal = bmpNormal; + m_bmpDisabled = bmpDisabled; + + m_kind = kind; + + m_enabled = true; + m_toggled = false; + + m_toolStyle = toolid == wxID_SEPARATOR ? wxTOOL_STYLE_SEPARATOR + : wxTOOL_STYLE_BUTTON; + } + + wxToolBarToolBase(wxToolBarBase *tbar, wxControl *control) + { + m_tbar = tbar; + m_control = control; + m_id = control->GetId(); + + m_kind = wxITEM_MAX; // invalid value + + m_enabled = true; + m_toggled = false; + + m_toolStyle = wxTOOL_STYLE_CONTROL; + } + + virtual ~wxToolBarToolBase(){} + + // accessors + // --------- + + // general + int GetId() const { return m_id; } + + wxControl *GetControl() const + { + wxASSERT_MSG( IsControl(), _T("this toolbar tool is not a control") ); + + return m_control; + } + + wxToolBarBase *GetToolBar() const { return m_tbar; } + + // style + bool IsButton() const { return m_toolStyle == wxTOOL_STYLE_BUTTON; } + bool IsControl() const { return m_toolStyle == wxTOOL_STYLE_CONTROL; } + bool IsSeparator() const { return m_toolStyle == wxTOOL_STYLE_SEPARATOR; } + int GetStyle() const { return m_toolStyle; } + wxItemKind GetKind() const + { + wxASSERT_MSG( IsButton(), _T("only makes sense for buttons") ); + + return m_kind; + } + + // state + bool IsEnabled() const { return m_enabled; } + bool IsToggled() const { return m_toggled; } + bool CanBeToggled() const + { return m_kind == wxITEM_CHECK || m_kind == wxITEM_RADIO; } + + // attributes + const wxBitmap& GetNormalBitmap() const { return m_bmpNormal; } + const wxBitmap& GetDisabledBitmap() const { return m_bmpDisabled; } + + const wxBitmap& GetBitmap() const + { return IsEnabled() ? GetNormalBitmap() : GetDisabledBitmap(); } + + const wxString& GetLabel() const { return m_label; } + + const wxString& GetShortHelp() const { return m_shortHelpString; } + const wxString& GetLongHelp() const { return m_longHelpString; } + + wxObject *GetClientData() const + { + if ( m_toolStyle == wxTOOL_STYLE_CONTROL ) + { + return (wxObject*)m_control->GetClientData(); + } + else + { + return m_clientData; + } + } + + // modifiers: return true if the state really changed + bool Enable(bool enable); + bool Toggle(bool toggle); + bool SetToggle(bool toggle); + bool SetShortHelp(const wxString& help); + bool SetLongHelp(const wxString& help); + + void Toggle() { Toggle(!IsToggled()); } + + void SetNormalBitmap(const wxBitmap& bmp) { m_bmpNormal = bmp; } + void SetDisabledBitmap(const wxBitmap& bmp) { m_bmpDisabled = bmp; } + + virtual void SetLabel(const wxString& label) { m_label = label; } + + void SetClientData(wxObject *clientData) + { + if ( m_toolStyle == wxTOOL_STYLE_CONTROL ) + { + m_control->SetClientData(clientData); + } + else + { + m_clientData = clientData; + } + } + + // add tool to/remove it from a toolbar + virtual void Detach() { m_tbar = (wxToolBarBase *)NULL; } + virtual void Attach(wxToolBarBase *tbar) { m_tbar = tbar; } + +protected: + wxToolBarBase *m_tbar; // the toolbar to which we belong (may be NULL) + + // tool parameters + int m_toolStyle; // see enum wxToolBarToolStyle + int m_id; // the tool id, wxID_SEPARATOR for separator + wxItemKind m_kind; // for normal buttons may be wxITEM_NORMAL/CHECK/RADIO + + // as controls have their own client data, no need to waste memory + union + { + wxObject *m_clientData; + wxControl *m_control; + }; + + // tool state + bool m_toggled; + bool m_enabled; + + // normal and disabled bitmaps for the tool, both can be invalid + wxBitmap m_bmpNormal; + wxBitmap m_bmpDisabled; + + // the button label + wxString m_label; + + // short and long help strings + wxString m_shortHelpString; + wxString m_longHelpString; + + DECLARE_DYNAMIC_CLASS_NO_COPY(wxToolBarToolBase) +}; + +// a list of toolbar tools +WX_DECLARE_EXPORTED_LIST(wxToolBarToolBase, wxToolBarToolsList); + +// ---------------------------------------------------------------------------- +// the base class for all toolbars +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxToolBarBase : public wxControl +{ +public: + wxToolBarBase(); + virtual ~wxToolBarBase(); + + // toolbar construction + // -------------------- + + // the full AddTool() function + // + // If bmpDisabled is wxNullBitmap, a shadowed version of the normal bitmap + // is created and used as the disabled image. + wxToolBarToolBase *AddTool(int toolid, + const wxString& label, + const wxBitmap& bitmap, + const wxBitmap& bmpDisabled, + wxItemKind kind = wxITEM_NORMAL, + const wxString& shortHelp = wxEmptyString, + const wxString& longHelp = wxEmptyString, + wxObject *data = NULL) + { + return DoAddTool(toolid, label, bitmap, bmpDisabled, kind, + shortHelp, longHelp, data); + } + + // the most common AddTool() version + wxToolBarToolBase *AddTool(int toolid, + const wxString& label, + const wxBitmap& bitmap, + const wxString& shortHelp = wxEmptyString, + wxItemKind kind = wxITEM_NORMAL) + { + return AddTool(toolid, label, bitmap, wxNullBitmap, kind, shortHelp); + } + + // add a check tool, i.e. a tool which can be toggled + wxToolBarToolBase *AddCheckTool(int toolid, + const wxString& label, + const wxBitmap& bitmap, + const wxBitmap& bmpDisabled = wxNullBitmap, + const wxString& shortHelp = wxEmptyString, + const wxString& longHelp = wxEmptyString, + wxObject *data = NULL) + { + return AddTool(toolid, label, bitmap, bmpDisabled, wxITEM_CHECK, + shortHelp, longHelp, data); + } + + // add a radio tool, i.e. a tool which can be toggled and releases any + // other toggled radio tools in the same group when it happens + wxToolBarToolBase *AddRadioTool(int toolid, + const wxString& label, + const wxBitmap& bitmap, + const wxBitmap& bmpDisabled = wxNullBitmap, + const wxString& shortHelp = wxEmptyString, + const wxString& longHelp = wxEmptyString, + wxObject *data = NULL) + { + return AddTool(toolid, label, bitmap, bmpDisabled, wxITEM_RADIO, + shortHelp, longHelp, data); + } + + + // insert the new tool at the given position, if pos == GetToolsCount(), it + // is equivalent to AddTool() + virtual wxToolBarToolBase *InsertTool + ( + size_t pos, + int toolid, + const wxString& label, + const wxBitmap& bitmap, + const wxBitmap& bmpDisabled = wxNullBitmap, + wxItemKind kind = wxITEM_NORMAL, + const wxString& shortHelp = wxEmptyString, + const wxString& longHelp = wxEmptyString, + wxObject *clientData = NULL + ); + + virtual wxToolBarToolBase *AddTool (wxToolBarToolBase *tool); + virtual wxToolBarToolBase *InsertTool (size_t pos, wxToolBarToolBase *tool); + + // add an arbitrary control to the toolbar (notice that + // the control will be deleted by the toolbar and that it will also adjust + // its position/size) + // + // NB: the control should have toolbar as its parent + virtual wxToolBarToolBase *AddControl(wxControl *control); + virtual wxToolBarToolBase *InsertControl(size_t pos, wxControl *control); + + // get the control with the given id or return NULL + virtual wxControl *FindControl( int toolid ); + + // add a separator to the toolbar + virtual wxToolBarToolBase *AddSeparator(); + virtual wxToolBarToolBase *InsertSeparator(size_t pos); + + // remove the tool from the toolbar: the caller is responsible for actually + // deleting the pointer + virtual wxToolBarToolBase *RemoveTool(int toolid); + + // delete tool either by index or by position + virtual bool DeleteToolByPos(size_t pos); + virtual bool DeleteTool(int toolid); + + // delete all tools + virtual void ClearTools(); + + // must be called after all buttons have been created to finish toolbar + // initialisation + virtual bool Realize(); + + // tools state + // ----------- + + virtual void EnableTool(int toolid, bool enable); + virtual void ToggleTool(int toolid, bool toggle); + + // Set this to be togglable (or not) + virtual void SetToggle(int toolid, bool toggle); + + // set/get tools client data (not for controls) + virtual wxObject *GetToolClientData(int toolid) const; + virtual void SetToolClientData(int toolid, wxObject *clientData); + + // returns tool pos, or wxNOT_FOUND if tool isn't found + virtual int GetToolPos(int id) const; + + // return true if the tool is toggled + virtual bool GetToolState(int toolid) const; + + virtual bool GetToolEnabled(int toolid) const; + + virtual void SetToolShortHelp(int toolid, const wxString& helpString); + virtual wxString GetToolShortHelp(int toolid) const; + virtual void SetToolLongHelp(int toolid, const wxString& helpString); + virtual wxString GetToolLongHelp(int toolid) const; + + // margins/packing/separation + // -------------------------- + + virtual void SetMargins(int x, int y); + void SetMargins(const wxSize& size) + { SetMargins((int) size.x, (int) size.y); } + virtual void SetToolPacking(int packing) + { m_toolPacking = packing; } + virtual void SetToolSeparation(int separation) + { m_toolSeparation = separation; } + + virtual wxSize GetToolMargins() const { return wxSize(m_xMargin, m_yMargin); } + virtual int GetToolPacking() const { return m_toolPacking; } + virtual int GetToolSeparation() const { return m_toolSeparation; } + + // toolbar geometry + // ---------------- + + // set the number of toolbar rows + virtual void SetRows(int nRows); + + // the toolbar can wrap - limit the number of columns or rows it may take + void SetMaxRowsCols(int rows, int cols) + { m_maxRows = rows; m_maxCols = cols; } + int GetMaxRows() const { return m_maxRows; } + int GetMaxCols() const { return m_maxCols; } + + // get/set the size of the bitmaps used by the toolbar: should be called + // before adding any tools to the toolbar + virtual void SetToolBitmapSize(const wxSize& size) + { m_defaultWidth = size.x; m_defaultHeight = size.y; } + virtual wxSize GetToolBitmapSize() const + { return wxSize(m_defaultWidth, m_defaultHeight); } + + // the button size in some implementations is bigger than the bitmap size: + // get the total button size (by default the same as bitmap size) + virtual wxSize GetToolSize() const + { return GetToolBitmapSize(); } + + // returns a (non separator) tool containing the point (x, y) or NULL if + // there is no tool at this point (corrdinates are client) + virtual wxToolBarToolBase *FindToolForPosition(wxCoord x, + wxCoord y) const = 0; + + // find the tool by id + wxToolBarToolBase *FindById(int toolid) const; + + // return true if this is a vertical toolbar, otherwise false + bool IsVertical() const { return HasFlag(wxTB_LEFT | wxTB_RIGHT); } + + + // the old versions of the various methods kept for compatibility + // don't use in the new code! + // -------------------------------------------------------------- + + wxToolBarToolBase *AddTool(int toolid, + const wxBitmap& bitmap, + const wxBitmap& bmpDisabled, + bool toggle = false, + wxObject *clientData = NULL, + const wxString& shortHelpString = wxEmptyString, + const wxString& longHelpString = wxEmptyString) + { + return AddTool(toolid, wxEmptyString, + bitmap, bmpDisabled, + toggle ? wxITEM_CHECK : wxITEM_NORMAL, + shortHelpString, longHelpString, clientData); + } + + wxToolBarToolBase *AddTool(int toolid, + const wxBitmap& bitmap, + const wxString& shortHelpString = wxEmptyString, + const wxString& longHelpString = wxEmptyString) + { + return AddTool(toolid, wxEmptyString, + bitmap, wxNullBitmap, wxITEM_NORMAL, + shortHelpString, longHelpString, NULL); + } + + wxToolBarToolBase *AddTool(int toolid, + const wxBitmap& bitmap, + const wxBitmap& bmpDisabled, + bool toggle, + wxCoord xPos, + wxCoord yPos = wxDefaultCoord, + wxObject *clientData = NULL, + const wxString& shortHelp = wxEmptyString, + const wxString& longHelp = wxEmptyString) + { + return DoAddTool(toolid, wxEmptyString, bitmap, bmpDisabled, + toggle ? wxITEM_CHECK : wxITEM_NORMAL, + shortHelp, longHelp, clientData, xPos, yPos); + } + + wxToolBarToolBase *InsertTool(size_t pos, + int toolid, + const wxBitmap& bitmap, + const wxBitmap& bmpDisabled = wxNullBitmap, + bool toggle = false, + wxObject *clientData = NULL, + const wxString& shortHelp = wxEmptyString, + const wxString& longHelp = wxEmptyString) + { + return InsertTool(pos, toolid, wxEmptyString, bitmap, bmpDisabled, + toggle ? wxITEM_CHECK : wxITEM_NORMAL, + shortHelp, longHelp, clientData); + } + + // event handlers + // -------------- + + // NB: these functions are deprecated, use EVT_TOOL_XXX() instead! + + // Only allow toggle if returns true. Call when left button up. + virtual bool OnLeftClick(int toolid, bool toggleDown); + + // Call when right button down. + virtual void OnRightClick(int toolid, long x, long y); + + // Called when the mouse cursor enters a tool bitmap. + // Argument is wxID_ANY if mouse is exiting the toolbar. + virtual void OnMouseEnter(int toolid); + + // more deprecated functions + // ------------------------- + + // use GetToolMargins() instead + wxSize GetMargins() const { return GetToolMargins(); } + + // implementation only from now on + // ------------------------------- + + size_t GetToolsCount() const { return m_tools.GetCount(); } + + // Do the toolbar button updates (check for EVT_UPDATE_UI handlers) + virtual void UpdateWindowUI(long flags = wxUPDATE_UI_NONE) ; + + // don't want toolbars to accept the focus + virtual bool AcceptsFocus() const { return false; } + +protected: + // to implement in derived classes + // ------------------------------- + + // create a new toolbar tool and add it to the toolbar, this is typically + // implemented by just calling InsertTool() + virtual wxToolBarToolBase *DoAddTool + ( + int toolid, + const wxString& label, + const wxBitmap& bitmap, + const wxBitmap& bmpDisabled, + wxItemKind kind, + const wxString& shortHelp = wxEmptyString, + const wxString& longHelp = wxEmptyString, + wxObject *clientData = NULL, + wxCoord xPos = wxDefaultCoord, + wxCoord yPos = wxDefaultCoord + ); + + // the tool is not yet inserted into m_tools list when this function is + // called and will only be added to it if this function succeeds + virtual bool DoInsertTool(size_t pos, wxToolBarToolBase *tool) = 0; + + // the tool is still in m_tools list when this function is called, it will + // only be deleted from it if it succeeds + virtual bool DoDeleteTool(size_t pos, wxToolBarToolBase *tool) = 0; + + // called when the tools enabled flag changes + virtual void DoEnableTool(wxToolBarToolBase *tool, bool enable) = 0; + + // called when the tool is toggled + virtual void DoToggleTool(wxToolBarToolBase *tool, bool toggle) = 0; + + // called when the tools "can be toggled" flag changes + virtual void DoSetToggle(wxToolBarToolBase *tool, bool toggle) = 0; + + // the functions to create toolbar tools + virtual wxToolBarToolBase *CreateTool(int toolid, + const wxString& label, + const wxBitmap& bmpNormal, + const wxBitmap& bmpDisabled, + wxItemKind kind, + wxObject *clientData, + const wxString& shortHelp, + const wxString& longHelp) = 0; + + virtual wxToolBarToolBase *CreateTool(wxControl *control) = 0; + + // helper functions + // ---------------- + + // call this from derived class ctor/Create() to ensure that we have either + // wxTB_HORIZONTAL or wxTB_VERTICAL style, there is a lot of existing code + // which randomly checks either one or the other of them and gets confused + // if neither is set (and making one of them 0 is not an option neither as + // then the existing tests would break down) + void FixupStyle(); + + // un-toggle all buttons in the same radio group + void UnToggleRadioGroup(wxToolBarToolBase *tool); + + // the list of all our tools + wxToolBarToolsList m_tools; + + // the offset of the first tool + int m_xMargin; + int m_yMargin; + + // the maximum number of toolbar rows/columns + int m_maxRows; + int m_maxCols; + + // the tool packing and separation + int m_toolPacking, + m_toolSeparation; + + // the size of the toolbar bitmaps + wxCoord m_defaultWidth, m_defaultHeight; + +private: + DECLARE_EVENT_TABLE() + DECLARE_NO_COPY_CLASS(wxToolBarBase) +}; + +// Helper function for creating the image for disabled buttons +bool wxCreateGreyedImage(const wxImage& in, wxImage& out) ; + +#endif // wxUSE_TOOLBAR + +#endif + // _WX_TBARBASE_H_ + diff --git a/Externals/wxWidgets/include/wx/textbuf.h b/Externals/wxWidgets/include/wx/textbuf.h new file mode 100644 index 0000000000..845439e3d9 --- /dev/null +++ b/Externals/wxWidgets/include/wx/textbuf.h @@ -0,0 +1,208 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/textbuf.h +// Purpose: class wxTextBuffer to work with text buffers of _small_ size +// (buffer is fully loaded in memory) and which understands CR/LF +// differences between platforms. +// Created: 14.11.01 +// Author: Morten Hanssen, Vadim Zeitlin +// Copyright: (c) 1998-2001 Morten Hanssen, Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_TEXTBUFFER_H +#define _WX_TEXTBUFFER_H + +#include "wx/defs.h" +#include "wx/arrstr.h" +#include "wx/convauto.h" + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// the line termination type (kept wxTextFileType name for compability) +enum wxTextFileType +{ + wxTextFileType_None, // incomplete (the last line of the file only) + wxTextFileType_Unix, // line is terminated with 'LF' = 0xA = 10 = '\n' + wxTextFileType_Dos, // 'CR' 'LF' + wxTextFileType_Mac, // 'CR' = 0xD = 13 = '\r' + wxTextFileType_Os2 // 'CR' 'LF' +}; + +#include "wx/string.h" + +#if wxUSE_TEXTBUFFER + +#include "wx/dynarray.h" + +// ---------------------------------------------------------------------------- +// wxTextBuffer +// ---------------------------------------------------------------------------- + +WX_DEFINE_USER_EXPORTED_ARRAY_INT(wxTextFileType, + wxArrayLinesType, + class WXDLLIMPEXP_BASE); + +#endif // wxUSE_TEXTBUFFER + +class WXDLLIMPEXP_BASE wxTextBuffer +{ +public: + // constants and static functions + // default type for current platform (determined at compile time) + static const wxTextFileType typeDefault; + + // this function returns a string which is identical to "text" passed in + // except that the line terminator characters are changed to correspond the + // given type. Called with the default argument, the function translates + // the string to the native format (Unix for Unix, DOS for Windows, ...). + static wxString Translate(const wxString& text, + wxTextFileType type = typeDefault); + + // get the buffer termination string + static const wxChar *GetEOL(wxTextFileType type = typeDefault); + + // the static methods of this class are compiled in even when + // !wxUSE_TEXTBUFFER because they are used by the library itself, but the + // rest can be left out +#if wxUSE_TEXTBUFFER + + // buffer operations + // ----------------- + + // buffer exists? + bool Exists() const; + + // create the buffer if it doesn't already exist + bool Create(); + + // same as Create() but with (another) buffer name + bool Create(const wxString& strBufferName); + + // Open() also loads buffer in memory on success + bool Open(const wxMBConv& conv = wxConvAuto()); + + // same as Open() but with (another) buffer name + bool Open(const wxString& strBufferName, const wxMBConv& conv = wxConvAuto()); + + // closes the buffer and frees memory, losing all changes + bool Close(); + + // is buffer currently opened? + bool IsOpened() const { return m_isOpened; } + + // accessors + // --------- + + // get the number of lines in the buffer + size_t GetLineCount() const { return m_aLines.size(); } + + // the returned line may be modified (but don't add CR/LF at the end!) + wxString& GetLine(size_t n) const { return (wxString&)m_aLines[n]; } + wxString& operator[](size_t n) const { return (wxString&)m_aLines[n]; } + + // the current line has meaning only when you're using + // GetFirstLine()/GetNextLine() functions, it doesn't get updated when + // you're using "direct access" i.e. GetLine() + size_t GetCurrentLine() const { return m_nCurLine; } + void GoToLine(size_t n) { m_nCurLine = n; } + bool Eof() const { return m_nCurLine == m_aLines.size(); } + + // these methods allow more "iterator-like" traversal of the list of + // lines, i.e. you may write something like: + // for ( str = GetFirstLine(); !Eof(); str = GetNextLine() ) { ... } + + // NB: const is commented out because not all compilers understand + // 'mutable' keyword yet (m_nCurLine should be mutable) + wxString& GetFirstLine() /* const */ + { return m_aLines.empty() ? ms_eof : m_aLines[m_nCurLine = 0]; } + wxString& GetNextLine() /* const */ + { return ++m_nCurLine == m_aLines.size() ? ms_eof + : m_aLines[m_nCurLine]; } + wxString& GetPrevLine() /* const */ + { wxASSERT(m_nCurLine > 0); return m_aLines[--m_nCurLine]; } + wxString& GetLastLine() /* const */ + { m_nCurLine = m_aLines.size() - 1; return m_aLines.Last(); } + + // get the type of the line (see also GetEOL) + wxTextFileType GetLineType(size_t n) const { return m_aTypes[n]; } + + // guess the type of buffer + wxTextFileType GuessType() const; + + // get the name of the buffer + const wxChar *GetName() const { return m_strBufferName.c_str(); } + + // add/remove lines + // ---------------- + + // add a line to the end + void AddLine(const wxString& str, wxTextFileType type = typeDefault) + { m_aLines.push_back(str); m_aTypes.push_back(type); } + // insert a line before the line number n + void InsertLine(const wxString& str, + size_t n, + wxTextFileType type = typeDefault) + { + m_aLines.insert(m_aLines.begin() + n, str); + m_aTypes.insert(m_aTypes.begin()+n, type); + } + + // delete one line + void RemoveLine(size_t n) + { + m_aLines.erase(m_aLines.begin() + n); + m_aTypes.erase(m_aTypes.begin() + n); + } + + // remove all lines + void Clear() { m_aLines.clear(); m_aTypes.clear(); m_nCurLine = 0; } + + // change the buffer (default argument means "don't change type") + // possibly in another format + bool Write(wxTextFileType typeNew = wxTextFileType_None, + const wxMBConv& conv = wxConvAuto()); + + // dtor + virtual ~wxTextBuffer(); + +protected: + // ctors + // ----- + + // default ctor, use Open(string) + wxTextBuffer() { m_isOpened = false; } + + // ctor from filename + wxTextBuffer(const wxString& strBufferName); + + enum wxTextBufferOpenMode { ReadAccess, WriteAccess }; + + // Must implement these in derived classes. + virtual bool OnExists() const = 0; + virtual bool OnOpen(const wxString &strBufferName, + wxTextBufferOpenMode openmode) = 0; + virtual bool OnClose() = 0; + virtual bool OnRead(const wxMBConv& conv) = 0; + virtual bool OnWrite(wxTextFileType typeNew, const wxMBConv& conv) = 0; + + static wxString ms_eof; // dummy string returned at EOF + wxString m_strBufferName; // name of the buffer + +private: + wxArrayLinesType m_aTypes; // type of each line + wxArrayString m_aLines; // lines of file + + size_t m_nCurLine; // number of current line in the buffer + + bool m_isOpened; // was the buffer successfully opened the last time? +#endif // wxUSE_TEXTBUFFER + + // copy ctor/assignment operator not implemented + wxTextBuffer(const wxTextBuffer&); + wxTextBuffer& operator=(const wxTextBuffer&); +}; + +#endif // _WX_TEXTBUFFER_H + diff --git a/Externals/wxWidgets/include/wx/textctrl.h b/Externals/wxWidgets/include/wx/textctrl.h new file mode 100644 index 0000000000..59572d3d50 --- /dev/null +++ b/Externals/wxWidgets/include/wx/textctrl.h @@ -0,0 +1,601 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/textctrl.h +// Purpose: wxTextCtrlBase class - the interface of wxTextCtrl +// Author: Vadim Zeitlin +// Modified by: +// Created: 13.07.99 +// RCS-ID: $Id: textctrl.h 41754 2006-10-08 22:40:14Z VZ $ +// Copyright: (c) Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_TEXTCTRL_H_BASE_ +#define _WX_TEXTCTRL_H_BASE_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/defs.h" + +#if wxUSE_TEXTCTRL + +#include "wx/control.h" // the base class +#include "wx/dynarray.h" // wxArrayInt +#include "wx/gdicmn.h" // wxPoint + +// Open Watcom 1.3 does allow only ios::rdbuf() while +// we want something with streambuf parameter +// Also, can't use streambuf if making or using a DLL :-( + +#if defined(__WATCOMC__) || \ + defined(__MWERKS__) || \ + (defined(__WINDOWS__) && (defined(WXUSINGDLL) || defined(WXMAKINGDLL))) + #define wxHAS_TEXT_WINDOW_STREAM 0 +#elif wxUSE_STD_IOSTREAM + #include "wx/ioswrap.h" + #define wxHAS_TEXT_WINDOW_STREAM 1 +#else + #define wxHAS_TEXT_WINDOW_STREAM 0 +#endif + +#if WXWIN_COMPATIBILITY_2_4 && !wxHAS_TEXT_WINDOW_STREAM + // define old flag if one could use it somewhere + #define NO_TEXT_WINDOW_STREAM +#endif + +class WXDLLEXPORT wxTextCtrl; +class WXDLLEXPORT wxTextCtrlBase; + +// ---------------------------------------------------------------------------- +// wxTextCtrl types +// ---------------------------------------------------------------------------- + +// wxTextPos is the position in the text +typedef long wxTextPos; + +// wxTextCoord is the line or row number (which should have been unsigned but +// is long for backwards compatibility) +typedef long wxTextCoord; + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +extern WXDLLEXPORT_DATA(const wxChar) wxTextCtrlNameStr[]; + +// this is intentionally not enum to avoid warning fixes with +// typecasting from enum type to wxTextCoord +const wxTextCoord wxOutOfRangeTextCoord = -1; +const wxTextCoord wxInvalidTextCoord = -2; + +// ---------------------------------------------------------------------------- +// wxTextCtrl style flags +// ---------------------------------------------------------------------------- + +#define wxTE_NO_VSCROLL 0x0002 +#define wxTE_AUTO_SCROLL 0x0008 + +#define wxTE_READONLY 0x0010 +#define wxTE_MULTILINE 0x0020 +#define wxTE_PROCESS_TAB 0x0040 + +// alignment flags +#define wxTE_LEFT 0x0000 // 0x0000 +#define wxTE_CENTER wxALIGN_CENTER_HORIZONTAL // 0x0100 +#define wxTE_RIGHT wxALIGN_RIGHT // 0x0200 +#define wxTE_CENTRE wxTE_CENTER + +// this style means to use RICHEDIT control and does something only under wxMSW +// and Win32 and is silently ignored under all other platforms +#define wxTE_RICH 0x0080 + +#define wxTE_PROCESS_ENTER 0x0400 +#define wxTE_PASSWORD 0x0800 + +// automatically detect the URLs and generate the events when mouse is +// moved/clicked over an URL +// +// this is for Win32 richedit and wxGTK2 multiline controls only so far +#define wxTE_AUTO_URL 0x1000 + +// by default, the Windows text control doesn't show the selection when it +// doesn't have focus - use this style to force it to always show it +#define wxTE_NOHIDESEL 0x2000 + +// use wxHSCROLL to not wrap text at all, wxTE_CHARWRAP to wrap it at any +// position and wxTE_WORDWRAP to wrap at words boundary +// +// if no wrapping style is given at all, the control wraps at word boundary +#define wxTE_DONTWRAP wxHSCROLL +#define wxTE_CHARWRAP 0x4000 // wrap at any position +#define wxTE_WORDWRAP 0x0001 // wrap only at words boundaries +#define wxTE_BESTWRAP 0x0000 // this is the default + +#if WXWIN_COMPATIBILITY_2_6 + // obsolete synonym + #define wxTE_LINEWRAP wxTE_CHARWRAP +#endif // WXWIN_COMPATIBILITY_2_6 + +// force using RichEdit version 2.0 or 3.0 instead of 1.0 (default) for +// wxTE_RICH controls - can be used together with or instead of wxTE_RICH +#define wxTE_RICH2 0x8000 + +// reuse wxTE_RICH2's value for CAPEDIT control on Windows CE +#if defined(__SMARTPHONE__) || defined(__POCKETPC__) +#define wxTE_CAPITALIZE wxTE_RICH2 +#else +#define wxTE_CAPITALIZE 0 +#endif + +// ---------------------------------------------------------------------------- +// wxTextCtrl file types +// ---------------------------------------------------------------------------- + +#define wxTEXT_TYPE_ANY 0 + +// ---------------------------------------------------------------------------- +// wxTextCtrl::HitTest return values +// ---------------------------------------------------------------------------- + +// the point asked is ... +enum wxTextCtrlHitTestResult +{ + wxTE_HT_UNKNOWN = -2, // this means HitTest() is simply not implemented + wxTE_HT_BEFORE, // either to the left or upper + wxTE_HT_ON_TEXT, // directly on + wxTE_HT_BELOW, // below [the last line] + wxTE_HT_BEYOND // after [the end of line] +}; +// ... the character returned + +// ---------------------------------------------------------------------------- +// Types for wxTextAttr +// ---------------------------------------------------------------------------- + +// Alignment + +enum wxTextAttrAlignment +{ + wxTEXT_ALIGNMENT_DEFAULT, + wxTEXT_ALIGNMENT_LEFT, + wxTEXT_ALIGNMENT_CENTRE, + wxTEXT_ALIGNMENT_CENTER = wxTEXT_ALIGNMENT_CENTRE, + wxTEXT_ALIGNMENT_RIGHT, + wxTEXT_ALIGNMENT_JUSTIFIED +}; + +// Flags to indicate which attributes are being applied + +#define wxTEXT_ATTR_TEXT_COLOUR 0x0001 +#define wxTEXT_ATTR_BACKGROUND_COLOUR 0x0002 +#define wxTEXT_ATTR_FONT_FACE 0x0004 +#define wxTEXT_ATTR_FONT_SIZE 0x0008 +#define wxTEXT_ATTR_FONT_WEIGHT 0x0010 +#define wxTEXT_ATTR_FONT_ITALIC 0x0020 +#define wxTEXT_ATTR_FONT_UNDERLINE 0x0040 +#define wxTEXT_ATTR_FONT \ + ( wxTEXT_ATTR_FONT_FACE | wxTEXT_ATTR_FONT_SIZE | wxTEXT_ATTR_FONT_WEIGHT | \ + wxTEXT_ATTR_FONT_ITALIC | wxTEXT_ATTR_FONT_UNDERLINE ) +#define wxTEXT_ATTR_ALIGNMENT 0x0080 +#define wxTEXT_ATTR_LEFT_INDENT 0x0100 +#define wxTEXT_ATTR_RIGHT_INDENT 0x0200 +#define wxTEXT_ATTR_TABS 0x0400 + +// ---------------------------------------------------------------------------- +// wxTextAttr: a structure containing the visual attributes of a text +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxTextAttr +{ +public: + // ctors + wxTextAttr() { Init(); } + wxTextAttr(const wxColour& colText, + const wxColour& colBack = wxNullColour, + const wxFont& font = wxNullFont, + wxTextAttrAlignment alignment = wxTEXT_ALIGNMENT_DEFAULT); + + // operations + void Init(); + + // merges the attributes of the base and the overlay objects and returns + // the result; the parameter attributes take precedence + // + // WARNING: the order of arguments is the opposite of Combine() + static wxTextAttr Merge(const wxTextAttr& base, const wxTextAttr& overlay) + { + return Combine(overlay, base, NULL); + } + + // merges the attributes of this object and overlay + void Merge(const wxTextAttr& overlay) + { + *this = Merge(*this, overlay); + } + + + // operators + void operator= (const wxTextAttr& attr); + + // setters + void SetTextColour(const wxColour& colText) { m_colText = colText; m_flags |= wxTEXT_ATTR_TEXT_COLOUR; } + void SetBackgroundColour(const wxColour& colBack) { m_colBack = colBack; m_flags |= wxTEXT_ATTR_BACKGROUND_COLOUR; } + void SetFont(const wxFont& font, long flags = wxTEXT_ATTR_FONT) { m_font = font; m_flags |= flags; } + void SetAlignment(wxTextAttrAlignment alignment) { m_textAlignment = alignment; m_flags |= wxTEXT_ATTR_ALIGNMENT; } + void SetTabs(const wxArrayInt& tabs) { m_tabs = tabs; m_flags |= wxTEXT_ATTR_TABS; } + void SetLeftIndent(int indent, int subIndent = 0) { m_leftIndent = indent; m_leftSubIndent = subIndent; m_flags |= wxTEXT_ATTR_LEFT_INDENT; } + void SetRightIndent(int indent) { m_rightIndent = indent; m_flags |= wxTEXT_ATTR_RIGHT_INDENT; } + void SetFlags(long flags) { m_flags = flags; } + + // accessors + bool HasTextColour() const { return m_colText.Ok() && HasFlag(wxTEXT_ATTR_TEXT_COLOUR) ; } + bool HasBackgroundColour() const { return m_colBack.Ok() && HasFlag(wxTEXT_ATTR_BACKGROUND_COLOUR) ; } + bool HasFont() const { return m_font.Ok() && HasFlag(wxTEXT_ATTR_FONT) ; } + bool HasAlignment() const { return (m_textAlignment != wxTEXT_ALIGNMENT_DEFAULT) || ((m_flags & wxTEXT_ATTR_ALIGNMENT) != 0) ; } + bool HasTabs() const { return (m_flags & wxTEXT_ATTR_TABS) != 0 ; } + bool HasLeftIndent() const { return (m_flags & wxTEXT_ATTR_LEFT_INDENT) != 0 ; } + bool HasRightIndent() const { return (m_flags & wxTEXT_ATTR_RIGHT_INDENT) != 0 ; } + bool HasFlag(long flag) const { return (m_flags & flag) != 0; } + + const wxColour& GetTextColour() const { return m_colText; } + const wxColour& GetBackgroundColour() const { return m_colBack; } + const wxFont& GetFont() const { return m_font; } + wxTextAttrAlignment GetAlignment() const { return m_textAlignment; } + const wxArrayInt& GetTabs() const { return m_tabs; } + long GetLeftIndent() const { return m_leftIndent; } + long GetLeftSubIndent() const { return m_leftSubIndent; } + long GetRightIndent() const { return m_rightIndent; } + long GetFlags() const { return m_flags; } + + // returns false if we have any attributes set, true otherwise + bool IsDefault() const + { + return !HasTextColour() && !HasBackgroundColour() && !HasFont() && !HasAlignment() && + !HasTabs() && !HasLeftIndent() && !HasRightIndent() ; + } + + // return the attribute having the valid font and colours: it uses the + // attributes set in attr and falls back first to attrDefault and then to + // the text control font/colours for those attributes which are not set + static wxTextAttr Combine(const wxTextAttr& attr, + const wxTextAttr& attrDef, + const wxTextCtrlBase *text); + +private: + long m_flags; + wxColour m_colText, + m_colBack; + wxFont m_font; + wxTextAttrAlignment m_textAlignment; + wxArrayInt m_tabs; // array of int: tab stops in 1/10 mm + int m_leftIndent; // left indent in 1/10 mm + int m_leftSubIndent; // left indent for all but the first + // line in a paragraph relative to the + // first line, in 1/10 mm + int m_rightIndent; // right indent in 1/10 mm +}; + +// ---------------------------------------------------------------------------- +// wxTextCtrl: a single or multiple line text zone where user can enter and +// edit text +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxTextCtrlBase : public wxControl +#if wxHAS_TEXT_WINDOW_STREAM + , public wxSTD streambuf +#endif + +{ +public: + // creation + // -------- + + wxTextCtrlBase(){} + virtual ~wxTextCtrlBase(){} + + // accessors + // --------- + + virtual wxString GetValue() const = 0; + virtual bool IsEmpty() const { return GetValue().empty(); } + + virtual void SetValue(const wxString& value) + { DoSetValue(value, SetValue_SendEvent); } + virtual void ChangeValue(const wxString& value) + { DoSetValue(value); } + + virtual wxString GetRange(long from, long to) const; + + virtual int GetLineLength(long lineNo) const = 0; + virtual wxString GetLineText(long lineNo) const = 0; + virtual int GetNumberOfLines() const = 0; + + virtual bool IsModified() const = 0; + virtual bool IsEditable() const = 0; + + // more readable flag testing methods + bool IsSingleLine() const { return !HasFlag(wxTE_MULTILINE); } + bool IsMultiLine() const { return !IsSingleLine(); } + + // If the return values from and to are the same, there is no selection. + virtual void GetSelection(long* from, long* to) const = 0; + + virtual wxString GetStringSelection() const; + + // operations + // ---------- + + // editing + virtual void Clear() = 0; + virtual void Replace(long from, long to, const wxString& value) = 0; + virtual void Remove(long from, long to) = 0; + + // load/save the control's contents from/to a file + bool LoadFile(const wxString& file, int fileType = wxTEXT_TYPE_ANY) { return DoLoadFile(file, fileType); } + bool SaveFile(const wxString& file = wxEmptyString, int fileType = wxTEXT_TYPE_ANY); + + // implementation for loading/saving + virtual bool DoLoadFile(const wxString& file, int fileType); + virtual bool DoSaveFile(const wxString& file, int fileType); + + // sets/clears the dirty flag + virtual void MarkDirty() = 0; + virtual void DiscardEdits() = 0; + void SetModified(bool modified) + { + if ( modified ) + MarkDirty(); + else + DiscardEdits(); + } + + // set the max number of characters which may be entered in a single line + // text control + virtual void SetMaxLength(unsigned long WXUNUSED(len)) { } + + // writing text inserts it at the current position, appending always + // inserts it at the end + virtual void WriteText(const wxString& text) = 0; + virtual void AppendText(const wxString& text) = 0; + + // insert the character which would have resulted from this key event, + // return true if anything has been inserted + virtual bool EmulateKeyPress(const wxKeyEvent& event); + + // text control under some platforms supports the text styles: these + // methods allow to apply the given text style to the given selection or to + // set/get the style which will be used for all appended text + virtual bool SetStyle(long start, long end, const wxTextAttr& style); + virtual bool GetStyle(long position, wxTextAttr& style); + virtual bool SetDefaultStyle(const wxTextAttr& style); + virtual const wxTextAttr& GetDefaultStyle() const; + + // translate between the position (which is just an index in the text ctrl + // considering all its contents as a single strings) and (x, y) coordinates + // which represent column and line. + virtual long XYToPosition(long x, long y) const = 0; + virtual bool PositionToXY(long pos, long *x, long *y) const = 0; + + virtual void ShowPosition(long pos) = 0; + + // find the character at position given in pixels + // + // NB: pt is in device coords (not adjusted for the client area origin nor + // scrolling) + virtual wxTextCtrlHitTestResult HitTest(const wxPoint& pt, long *pos) const; + virtual wxTextCtrlHitTestResult HitTest(const wxPoint& pt, + wxTextCoord *col, + wxTextCoord *row) const; + + // Clipboard operations + virtual void Copy() = 0; + virtual void Cut() = 0; + virtual void Paste() = 0; + + virtual bool CanCopy() const; + virtual bool CanCut() const; + virtual bool CanPaste() const; + + // Undo/redo + virtual void Undo() = 0; + virtual void Redo() = 0; + + virtual bool CanUndo() const = 0; + virtual bool CanRedo() const = 0; + + // Insertion point + virtual void SetInsertionPoint(long pos) = 0; + virtual void SetInsertionPointEnd() = 0; + virtual long GetInsertionPoint() const = 0; + virtual wxTextPos GetLastPosition() const = 0; + + virtual void SetSelection(long from, long to) = 0; + virtual void SelectAll(); + virtual void SetEditable(bool editable) = 0; + + // stream-like insertion operators: these are always available, whether we + // were, or not, compiled with streambuf support + wxTextCtrl& operator<<(const wxString& s); + wxTextCtrl& operator<<(int i); + wxTextCtrl& operator<<(long i); + wxTextCtrl& operator<<(float f); + wxTextCtrl& operator<<(double d); + wxTextCtrl& operator<<(const wxChar c); + + // generate the wxEVT_COMMAND_TEXT_UPDATED event, like SetValue() does + void SendTextUpdatedEvent(); + + // do the window-specific processing after processing the update event + virtual void DoUpdateWindowUI(wxUpdateUIEvent& event); + + virtual bool ShouldInheritColours() const { return false; } + +protected: + // override streambuf method +#if wxHAS_TEXT_WINDOW_STREAM + int overflow(int i); +#endif // wxHAS_TEXT_WINDOW_STREAM + + // flags for DoSetValue(): common part of SetValue() and ChangeValue() and + // also used to implement WriteText() in wxMSW + enum + { + SetValue_SendEvent = 1, + SetValue_SelectionOnly = 2 + }; + + virtual void DoSetValue(const wxString& value, int flags = 0) = 0; + + + // the name of the last file loaded with LoadFile() which will be used by + // SaveFile() by default + wxString m_filename; + + // the text style which will be used for any new text added to the control + wxTextAttr m_defaultStyle; + + DECLARE_NO_COPY_CLASS(wxTextCtrlBase) + DECLARE_ABSTRACT_CLASS(wxTextCtrlBase) +}; + +// ---------------------------------------------------------------------------- +// include the platform-dependent class definition +// ---------------------------------------------------------------------------- + +#if defined(__WXX11__) + #include "wx/x11/textctrl.h" +#elif defined(__WXUNIVERSAL__) + #include "wx/univ/textctrl.h" +#elif defined(__SMARTPHONE__) && defined(__WXWINCE__) + #include "wx/msw/wince/textctrlce.h" +#elif defined(__WXMSW__) + #include "wx/msw/textctrl.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/textctrl.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/textctrl.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/textctrl.h" +#elif defined(__WXMAC__) + #include "wx/mac/textctrl.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/textctrl.h" +#elif defined(__WXPM__) + #include "wx/os2/textctrl.h" +#endif + +// ---------------------------------------------------------------------------- +// wxTextCtrl events +// ---------------------------------------------------------------------------- + +#if !WXWIN_COMPATIBILITY_EVENT_TYPES + +BEGIN_DECLARE_EVENT_TYPES() + DECLARE_EVENT_TYPE(wxEVT_COMMAND_TEXT_UPDATED, 7) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_TEXT_ENTER, 8) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_TEXT_URL, 13) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_TEXT_MAXLEN, 14) +END_DECLARE_EVENT_TYPES() + +#endif // !WXWIN_COMPATIBILITY_EVENT_TYPES + +class WXDLLEXPORT wxTextUrlEvent : public wxCommandEvent +{ +public: + wxTextUrlEvent(int winid, const wxMouseEvent& evtMouse, + long start, long end) + : wxCommandEvent(wxEVT_COMMAND_TEXT_URL, winid) + , m_evtMouse(evtMouse), m_start(start), m_end(end) + { } + + // get the mouse event which happend over the URL + const wxMouseEvent& GetMouseEvent() const { return m_evtMouse; } + + // get the start of the URL + long GetURLStart() const { return m_start; } + + // get the end of the URL + long GetURLEnd() const { return m_end; } + +protected: + // the corresponding mouse event + wxMouseEvent m_evtMouse; + + // the start and end indices of the URL in the text control + long m_start, + m_end; + +private: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxTextUrlEvent) + +public: + // for wxWin RTTI only, don't use + wxTextUrlEvent() : m_evtMouse(), m_start(0), m_end(0) { } +}; + +typedef void (wxEvtHandler::*wxTextUrlEventFunction)(wxTextUrlEvent&); + +#define wxTextEventHandler(func) wxCommandEventHandler(func) +#define wxTextUrlEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxTextUrlEventFunction, &func) + +#define wx__DECLARE_TEXTEVT(evt, id, fn) \ + wx__DECLARE_EVT1(wxEVT_COMMAND_TEXT_ ## evt, id, wxTextEventHandler(fn)) + +#define wx__DECLARE_TEXTURLEVT(evt, id, fn) \ + wx__DECLARE_EVT1(wxEVT_COMMAND_TEXT_ ## evt, id, wxTextUrlEventHandler(fn)) + +#define EVT_TEXT(id, fn) wx__DECLARE_TEXTEVT(UPDATED, id, fn) +#define EVT_TEXT_ENTER(id, fn) wx__DECLARE_TEXTEVT(ENTER, id, fn) +#define EVT_TEXT_URL(id, fn) wx__DECLARE_TEXTURLEVT(URL, id, fn) +#define EVT_TEXT_MAXLEN(id, fn) wx__DECLARE_TEXTEVT(MAXLEN, id, fn) + +#if wxHAS_TEXT_WINDOW_STREAM + +// ---------------------------------------------------------------------------- +// wxStreamToTextRedirector: this class redirects all data sent to the given +// C++ stream to the wxTextCtrl given to its ctor during its lifetime. +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxStreamToTextRedirector +{ +private: + void Init(wxTextCtrl *text) + { + m_sbufOld = m_ostr.rdbuf(); + m_ostr.rdbuf(text); + } + +public: + wxStreamToTextRedirector(wxTextCtrl *text) + : m_ostr(wxSTD cout) + { + Init(text); + } + + wxStreamToTextRedirector(wxTextCtrl *text, wxSTD ostream *ostr) + : m_ostr(*ostr) + { + Init(text); + } + + ~wxStreamToTextRedirector() + { + m_ostr.rdbuf(m_sbufOld); + } + +private: + // the stream we're redirecting + wxSTD ostream& m_ostr; + + // the old streambuf (before we changed it) + wxSTD streambuf *m_sbufOld; +}; + +#endif // wxHAS_TEXT_WINDOW_STREAM + +#endif // wxUSE_TEXTCTRL + +#endif + // _WX_TEXTCTRL_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/textdlg.h b/Externals/wxWidgets/include/wx/textdlg.h new file mode 100644 index 0000000000..787233d4f0 --- /dev/null +++ b/Externals/wxWidgets/include/wx/textdlg.h @@ -0,0 +1,23 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: textdlg.h +// Purpose: wxTextEntryDialog class +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: textdlg.h 27408 2004-05-23 20:53:33Z JS $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_TEXTDLG_H_BASE_ +#define _WX_TEXTDLG_H_BASE_ + +#include "wx/generic/textdlgg.h" + +#if WXWIN_COMPATIBILITY_2_4 + // for wxGetNumberFromUser() + #include "wx/numdlg.h" +#endif // WXWIN_COMPATIBILITY_2_4 + +#endif // _WX_TEXTDLG_H_BASE_ + diff --git a/Externals/wxWidgets/include/wx/textfile.h b/Externals/wxWidgets/include/wx/textfile.h new file mode 100644 index 0000000000..5d9bcdb4af --- /dev/null +++ b/Externals/wxWidgets/include/wx/textfile.h @@ -0,0 +1,62 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/textfile.h +// Purpose: class wxTextFile to work with text files of _small_ size +// (file is fully loaded in memory) and which understands CR/LF +// differences between platforms. +// Author: Vadim Zeitlin +// Modified by: +// Created: 03.04.98 +// RCS-ID: $Id: textfile.h 38570 2006-04-05 14:37:47Z VZ $ +// Copyright: (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_TEXTFILE_H +#define _WX_TEXTFILE_H + +#include "wx/defs.h" + +#include "wx/textbuf.h" + +#if wxUSE_TEXTFILE + +#include "wx/file.h" + +// ---------------------------------------------------------------------------- +// wxTextFile +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxTextFile : public wxTextBuffer +{ +public: + // constructors + wxTextFile() { } + wxTextFile(const wxString& strFileName); + +protected: + // implement the base class pure virtuals + virtual bool OnExists() const; + virtual bool OnOpen(const wxString &strBufferName, + wxTextBufferOpenMode OpenMode); + virtual bool OnClose(); + virtual bool OnRead(const wxMBConv& conv); + virtual bool OnWrite(wxTextFileType typeNew, const wxMBConv& conv); + +private: + + wxFile m_file; + + DECLARE_NO_COPY_CLASS(wxTextFile) +}; + +#else // !wxUSE_TEXTFILE + +// old code relies on the static methods of wxTextFile being always available +// and they still are available in wxTextBuffer (even if !wxUSE_TEXTBUFFER), so +// make it possible to use them in a backwards compatible way +typedef wxTextBuffer wxTextFile; + +#endif // wxUSE_TEXTFILE/!wxUSE_TEXTFILE + +#endif // _WX_TEXTFILE_H + diff --git a/Externals/wxWidgets/include/wx/tglbtn.h b/Externals/wxWidgets/include/wx/tglbtn.h new file mode 100644 index 0000000000..c20b9e4a00 --- /dev/null +++ b/Externals/wxWidgets/include/wx/tglbtn.h @@ -0,0 +1,51 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/tglbtn.h +// Purpose: This dummy header includes the proper header file for the +// system we're compiling under. +// Author: John Norris, minor changes by Axel Schlueter +// Modified by: +// Created: 08.02.01 +// RCS-ID: $Id: tglbtn.h 39293 2006-05-23 17:53:50Z JS $ +// Copyright: (c) 2000 Johnny C. Norris II +// License: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_TOGGLEBUTTON_H_BASE_ +#define _WX_TOGGLEBUTTON_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_TOGGLEBTN + +#include "wx/event.h" +#include "wx/control.h" // base class + +BEGIN_DECLARE_EVENT_TYPES() + DECLARE_EVENT_TYPE(wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, 19) +END_DECLARE_EVENT_TYPES() + +#define EVT_TOGGLEBUTTON(id, fn) \ + wx__DECLARE_EVT1(wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, id, wxCommandEventHandler(fn)) + +#if defined(__WXUNIVERSAL__) + #include "wx/univ/tglbtn.h" +#elif defined(__WXMSW__) + #include "wx/msw/tglbtn.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/tglbtn.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/tglbtn.h" +# elif defined(__WXMOTIF__) + #include "wx/motif/tglbtn.h" +#elif defined(__WXMAC__) + #include "wx/mac/tglbtn.h" +#elif defined(__WXPALMOS__) + #include "wx/palmos/tglbtn.h" +#elif defined(__WXPM__) + #include "wx/os2/tglbtn.h" +#endif + +#endif // wxUSE_TOGGLEBTN + +#endif // _WX_TOGGLEBUTTON_H_BASE_ + diff --git a/Externals/wxWidgets/include/wx/thread.h b/Externals/wxWidgets/include/wx/thread.h new file mode 100644 index 0000000000..6e60aee444 --- /dev/null +++ b/Externals/wxWidgets/include/wx/thread.h @@ -0,0 +1,761 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/thread.h +// Purpose: Thread API +// Author: Guilhem Lavaux +// Modified by: Vadim Zeitlin (modifications partly inspired by omnithreads +// package from Olivetti & Oracle Research Laboratory) +// Created: 04/13/98 +// RCS-ID: $Id: thread.h 38717 2006-04-14 17:01:16Z ABX $ +// Copyright: (c) Guilhem Lavaux +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_THREAD_H_ +#define _WX_THREAD_H_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// get the value of wxUSE_THREADS configuration flag +#include "wx/defs.h" + +#if wxUSE_THREADS + +// Windows headers define it +#ifdef Yield + #undef Yield +#endif + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +enum wxMutexError +{ + wxMUTEX_NO_ERROR = 0, // operation completed successfully + wxMUTEX_INVALID, // mutex hasn't been initialized + wxMUTEX_DEAD_LOCK, // mutex is already locked by the calling thread + wxMUTEX_BUSY, // mutex is already locked by another thread + wxMUTEX_UNLOCKED, // attempt to unlock a mutex which is not locked + wxMUTEX_MISC_ERROR // any other error +}; + +enum wxCondError +{ + wxCOND_NO_ERROR = 0, + wxCOND_INVALID, + wxCOND_TIMEOUT, // WaitTimeout() has timed out + wxCOND_MISC_ERROR +}; + +enum wxSemaError +{ + wxSEMA_NO_ERROR = 0, + wxSEMA_INVALID, // semaphore hasn't been initialized successfully + wxSEMA_BUSY, // returned by TryWait() if Wait() would block + wxSEMA_TIMEOUT, // returned by WaitTimeout() + wxSEMA_OVERFLOW, // Post() would increase counter past the max + wxSEMA_MISC_ERROR +}; + +enum wxThreadError +{ + wxTHREAD_NO_ERROR = 0, // No error + wxTHREAD_NO_RESOURCE, // No resource left to create a new thread + wxTHREAD_RUNNING, // The thread is already running + wxTHREAD_NOT_RUNNING, // The thread isn't running + wxTHREAD_KILLED, // Thread we waited for had to be killed + wxTHREAD_MISC_ERROR // Some other error +}; + +enum wxThreadKind +{ + wxTHREAD_DETACHED, + wxTHREAD_JOINABLE +}; + +// defines the interval of priority +enum +{ + WXTHREAD_MIN_PRIORITY = 0u, + WXTHREAD_DEFAULT_PRIORITY = 50u, + WXTHREAD_MAX_PRIORITY = 100u +}; + +// There are 2 types of mutexes: normal mutexes and recursive ones. The attempt +// to lock a normal mutex by a thread which already owns it results in +// undefined behaviour (it always works under Windows, it will almost always +// result in a deadlock under Unix). Locking a recursive mutex in such +// situation always succeeds and it must be unlocked as many times as it has +// been locked. +// +// However recursive mutexes have several important drawbacks: first, in the +// POSIX implementation, they're less efficient. Second, and more importantly, +// they CAN NOT BE USED WITH CONDITION VARIABLES under Unix! Using them with +// wxCondition will work under Windows and some Unices (notably Linux) but will +// deadlock under other Unix versions (e.g. Solaris). As it might be difficult +// to ensure that a recursive mutex is not used with wxCondition, it is a good +// idea to avoid using recursive mutexes at all. Also, the last problem with +// them is that some (older) Unix versions don't support this at all -- which +// results in a configure warning when building and a deadlock when using them. +enum wxMutexType +{ + // normal mutex: try to always use this one + wxMUTEX_DEFAULT, + + // recursive mutex: don't use these ones with wxCondition + wxMUTEX_RECURSIVE +}; + +// forward declarations +class WXDLLIMPEXP_BASE wxThreadHelper; +class WXDLLIMPEXP_BASE wxConditionInternal; +class WXDLLIMPEXP_BASE wxMutexInternal; +class WXDLLIMPEXP_BASE wxSemaphoreInternal; +class WXDLLIMPEXP_BASE wxThreadInternal; + +// ---------------------------------------------------------------------------- +// A mutex object is a synchronization object whose state is set to signaled +// when it is not owned by any thread, and nonsignaled when it is owned. Its +// name comes from its usefulness in coordinating mutually-exclusive access to +// a shared resource. Only one thread at a time can own a mutex object. +// ---------------------------------------------------------------------------- + +// you should consider wxMutexLocker whenever possible instead of directly +// working with wxMutex class - it is safer +class WXDLLIMPEXP_BASE wxMutex +{ +public: + // constructor & destructor + // ------------------------ + + // create either default (always safe) or recursive mutex + wxMutex(wxMutexType mutexType = wxMUTEX_DEFAULT); + + // destroys the mutex kernel object + ~wxMutex(); + + // test if the mutex has been created successfully + bool IsOk() const; + + // mutex operations + // ---------------- + + // Lock the mutex, blocking on it until it is unlocked by the other thread. + // The result of locking a mutex already locked by the current thread + // depend on the mutex type. + // + // The caller must call Unlock() later if Lock() returned wxMUTEX_NO_ERROR. + wxMutexError Lock(); + + // Try to lock the mutex: if it is currently locked, return immediately + // with an error. Otherwise the caller must call Unlock(). + wxMutexError TryLock(); + + // Unlock the mutex. It is an error to unlock an already unlocked mutex + wxMutexError Unlock(); + +protected: + wxMutexInternal *m_internal; + + friend class wxConditionInternal; + + DECLARE_NO_COPY_CLASS(wxMutex) +}; + +// a helper class which locks the mutex in the ctor and unlocks it in the dtor: +// this ensures that mutex is always unlocked, even if the function returns or +// throws an exception before it reaches the end +class WXDLLIMPEXP_BASE wxMutexLocker +{ +public: + // lock the mutex in the ctor + wxMutexLocker(wxMutex& mutex) + : m_isOk(false), m_mutex(mutex) + { m_isOk = ( m_mutex.Lock() == wxMUTEX_NO_ERROR ); } + + // returns true if mutex was successfully locked in ctor + bool IsOk() const + { return m_isOk; } + + // unlock the mutex in dtor + ~wxMutexLocker() + { if ( IsOk() ) m_mutex.Unlock(); } + +private: + // no assignment operator nor copy ctor + wxMutexLocker(const wxMutexLocker&); + wxMutexLocker& operator=(const wxMutexLocker&); + + bool m_isOk; + wxMutex& m_mutex; +}; + +// ---------------------------------------------------------------------------- +// Critical section: this is the same as mutex but is only visible to the +// threads of the same process. For the platforms which don't have native +// support for critical sections, they're implemented entirely in terms of +// mutexes. +// +// NB: wxCriticalSection object does not allocate any memory in its ctor +// which makes it possible to have static globals of this class +// ---------------------------------------------------------------------------- + +// in order to avoid any overhead under platforms where critical sections are +// just mutexes make all wxCriticalSection class functions inline +#if !defined(__WXMSW__) && !defined(__WXMAC__) + #define wxCRITSECT_IS_MUTEX 1 + + #define wxCRITSECT_INLINE inline +#else // MSW + #define wxCRITSECT_IS_MUTEX 0 + + #define wxCRITSECT_INLINE +#endif // MSW/!MSW + +// you should consider wxCriticalSectionLocker whenever possible instead of +// directly working with wxCriticalSection class - it is safer +class WXDLLIMPEXP_BASE wxCriticalSection +{ +public: + // ctor & dtor + wxCRITSECT_INLINE wxCriticalSection(); + wxCRITSECT_INLINE ~wxCriticalSection(); + + // enter the section (the same as locking a mutex) + wxCRITSECT_INLINE void Enter(); + + // leave the critical section (same as unlocking a mutex) + wxCRITSECT_INLINE void Leave(); + +private: +#if wxCRITSECT_IS_MUTEX + wxMutex m_mutex; +#elif defined(__WXMSW__) + // we can't allocate any memory in the ctor, so use placement new - + // unfortunately, we have to hardcode the sizeof() here because we can't + // include windows.h from this public header and we also have to use the + // union to force the correct (i.e. maximal) alignment + // + // if CRITICAL_SECTION size changes in Windows, you'll get an assert from + // thread.cpp and will need to increase the buffer size + // + // finally, we need this typedef instead of declaring m_buffer directly + // because otherwise the assert mentioned above wouldn't compile with some + // compilers (notably CodeWarrior 8) +#ifdef __WIN64__ + typedef char wxCritSectBuffer[40]; +#else // __WIN32__ + typedef char wxCritSectBuffer[24]; +#endif + union + { + unsigned long m_dummy1; + void *m_dummy2; + + wxCritSectBuffer m_buffer; + }; +#elif defined(__WXMAC__) + void *m_critRegion ; +#endif // Unix&OS2/Win32 + + DECLARE_NO_COPY_CLASS(wxCriticalSection) +}; + +#if wxCRITSECT_IS_MUTEX + // implement wxCriticalSection using mutexes + inline wxCriticalSection::wxCriticalSection() { } + inline wxCriticalSection::~wxCriticalSection() { } + + inline void wxCriticalSection::Enter() { (void)m_mutex.Lock(); } + inline void wxCriticalSection::Leave() { (void)m_mutex.Unlock(); } +#endif // wxCRITSECT_IS_MUTEX + +#undef wxCRITSECT_INLINE +#undef wxCRITSECT_IS_MUTEX + +// wxCriticalSectionLocker is the same to critical sections as wxMutexLocker is +// to mutexes +class WXDLLIMPEXP_BASE wxCriticalSectionLocker +{ +public: + wxCriticalSectionLocker(wxCriticalSection& cs) + : m_critsect(cs) + { + m_critsect.Enter(); + } + + ~wxCriticalSectionLocker() + { + m_critsect.Leave(); + } + +private: + wxCriticalSection& m_critsect; + + DECLARE_NO_COPY_CLASS(wxCriticalSectionLocker) +}; + +// ---------------------------------------------------------------------------- +// wxCondition models a POSIX condition variable which allows one (or more) +// thread(s) to wait until some condition is fulfilled +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxCondition +{ +public: + // Each wxCondition object is associated with a (single) wxMutex object. + // The mutex object MUST be locked before calling Wait() + wxCondition(wxMutex& mutex); + + // dtor is not virtual, don't use this class polymorphically + ~wxCondition(); + + // return true if the condition has been created successfully + bool IsOk() const; + + // NB: the associated mutex MUST be locked beforehand by the calling thread + // + // it atomically releases the lock on the associated mutex + // and starts waiting to be woken up by a Signal()/Broadcast() + // once its signaled, then it will wait until it can reacquire + // the lock on the associated mutex object, before returning. + wxCondError Wait(); + + // exactly as Wait() except that it may also return if the specified + // timeout elapses even if the condition hasn't been signalled: in this + // case, the return value is false, otherwise (i.e. in case of a normal + // return) it is true + // + // the timeout parameter specifies an interval that needs to be waited for + // in milliseconds + wxCondError WaitTimeout(unsigned long milliseconds); + + // NB: the associated mutex may or may not be locked by the calling thread + // + // this method unblocks one thread if any are blocking on the condition. + // if no thread is blocking in Wait(), then the signal is NOT remembered + // The thread which was blocking on Wait() will then reacquire the lock + // on the associated mutex object before returning + wxCondError Signal(); + + // NB: the associated mutex may or may not be locked by the calling thread + // + // this method unblocks all threads if any are blocking on the condition. + // if no thread is blocking in Wait(), then the signal is NOT remembered + // The threads which were blocking on Wait() will then reacquire the lock + // on the associated mutex object before returning. + wxCondError Broadcast(); + + +#if WXWIN_COMPATIBILITY_2_6 + // deprecated version, don't use + wxDEPRECATED( bool Wait(unsigned long milliseconds) ); +#endif // WXWIN_COMPATIBILITY_2_6 + +private: + wxConditionInternal *m_internal; + + DECLARE_NO_COPY_CLASS(wxCondition) +}; + +#if WXWIN_COMPATIBILITY_2_6 + inline bool wxCondition::Wait(unsigned long milliseconds) + { return WaitTimeout(milliseconds) == wxCOND_NO_ERROR; } +#endif // WXWIN_COMPATIBILITY_2_6 + +// ---------------------------------------------------------------------------- +// wxSemaphore: a counter limiting the number of threads concurrently accessing +// a shared resource +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxSemaphore +{ +public: + // specifying a maxcount of 0 actually makes wxSemaphore behave as if there + // is no upper limit, if maxcount is 1 the semaphore behaves as a mutex + wxSemaphore( int initialcount = 0, int maxcount = 0 ); + + // dtor is not virtual, don't use this class polymorphically + ~wxSemaphore(); + + // return true if the semaphore has been created successfully + bool IsOk() const; + + // wait indefinitely, until the semaphore count goes beyond 0 + // and then decrement it and return (this method might have been called + // Acquire()) + wxSemaError Wait(); + + // same as Wait(), but does not block, returns wxSEMA_NO_ERROR if + // successful and wxSEMA_BUSY if the count is currently zero + wxSemaError TryWait(); + + // same as Wait(), but as a timeout limit, returns wxSEMA_NO_ERROR if the + // semaphore was acquired and wxSEMA_TIMEOUT if the timeout has elapsed + wxSemaError WaitTimeout(unsigned long milliseconds); + + // increments the semaphore count and signals one of the waiting threads + wxSemaError Post(); + +private: + wxSemaphoreInternal *m_internal; + + DECLARE_NO_COPY_CLASS(wxSemaphore) +}; + +// ---------------------------------------------------------------------------- +// wxThread: class encapsulating a thread of execution +// ---------------------------------------------------------------------------- + +// there are two different kinds of threads: joinable and detached (default) +// ones. Only joinable threads can return a return code and only detached +// threads auto-delete themselves - the user should delete the joinable +// threads manually. + +// NB: in the function descriptions the words "this thread" mean the thread +// created by the wxThread object while "main thread" is the thread created +// during the process initialization (a.k.a. the GUI thread) + +// On VMS thread pointers are 64 bits (also needed for other systems??? +#ifdef __VMS + typedef unsigned long long wxThreadIdType; +#else + typedef unsigned long wxThreadIdType; +#endif + +class WXDLLIMPEXP_BASE wxThread +{ +public: + // the return type for the thread function + typedef void *ExitCode; + + // static functions + // Returns the wxThread object for the calling thread. NULL is returned + // if the caller is the main thread (but it's recommended to use + // IsMain() and only call This() for threads other than the main one + // because NULL is also returned on error). If the thread wasn't + // created with wxThread class, the returned value is undefined. + static wxThread *This(); + + // Returns true if current thread is the main thread. + static bool IsMain(); + + // Release the rest of our time slice letting the other threads run + static void Yield(); + + // Sleep during the specified period of time in milliseconds + // + // NB: at least under MSW worker threads can not call ::wxSleep()! + static void Sleep(unsigned long milliseconds); + + // get the number of system CPUs - useful with SetConcurrency() + // (the "best" value for it is usually number of CPUs + 1) + // + // Returns -1 if unknown, number of CPUs otherwise + static int GetCPUCount(); + + // Get the platform specific thread ID and return as a long. This + // can be used to uniquely identify threads, even if they are not + // wxThreads. This is used by wxPython. + static wxThreadIdType GetCurrentId(); + + // sets the concurrency level: this is, roughly, the number of threads + // the system tries to schedule to run in parallel. 0 means the + // default value (usually acceptable, but may not yield the best + // performance for this process) + // + // Returns true on success, false otherwise (if not implemented, for + // example) + static bool SetConcurrency(size_t level); + + // constructor only creates the C++ thread object and doesn't create (or + // start) the real thread + wxThread(wxThreadKind kind = wxTHREAD_DETACHED); + + // functions that change the thread state: all these can only be called + // from _another_ thread (typically the thread that created this one, e.g. + // the main thread), not from the thread itself + + // create a new thread and optionally set the stack size on + // platforms that support that - call Run() to start it + // (special cased for watcom which won't accept 0 default) + + wxThreadError Create(unsigned int stackSize = 0); + + // starts execution of the thread - from the moment Run() is called + // the execution of wxThread::Entry() may start at any moment, caller + // shouldn't suppose that it starts after (or before) Run() returns. + wxThreadError Run(); + + // stops the thread if it's running and deletes the wxThread object if + // this is a detached thread freeing its memory - otherwise (for + // joinable threads) you still need to delete wxThread object + // yourself. + // + // this function only works if the thread calls TestDestroy() + // periodically - the thread will only be deleted the next time it + // does it! + // + // will fill the rc pointer with the thread exit code if it's !NULL + wxThreadError Delete(ExitCode *rc = (ExitCode *)NULL); + + // waits for a joinable thread to finish and returns its exit code + // + // Returns (ExitCode)-1 on error (for example, if the thread is not + // joinable) + ExitCode Wait(); + + // kills the thread without giving it any chance to clean up - should + // not be used under normal circumstances, use Delete() instead. + // It is a dangerous function that should only be used in the most + // extreme cases! + // + // The wxThread object is deleted by Kill() if the thread is + // detachable, but you still have to delete it manually for joinable + // threads. + wxThreadError Kill(); + + // pause a running thread: as Delete(), this only works if the thread + // calls TestDestroy() regularly + wxThreadError Pause(); + + // resume a paused thread + wxThreadError Resume(); + + // priority + // Sets the priority to "prio": see WXTHREAD_XXX_PRIORITY constants + // + // NB: the priority can only be set before the thread is created + void SetPriority(unsigned int prio); + + // Get the current priority. + unsigned int GetPriority() const; + + // thread status inquiries + // Returns true if the thread is alive: i.e. running or suspended + bool IsAlive() const; + // Returns true if the thread is running (not paused, not killed). + bool IsRunning() const; + // Returns true if the thread is suspended + bool IsPaused() const; + + // is the thread of detached kind? + bool IsDetached() const { return m_isDetached; } + + // Get the thread ID - a platform dependent number which uniquely + // identifies a thread inside a process + wxThreadIdType GetId() const; + + // called when the thread exits - in the context of this thread + // + // NB: this function will not be called if the thread is Kill()ed + virtual void OnExit() { } + + // Returns true if the thread was asked to terminate: this function should + // be called by the thread from time to time, otherwise the main thread + // will be left forever in Delete()! + virtual bool TestDestroy(); + + // dtor is public, but the detached threads should never be deleted - use + // Delete() instead (or leave the thread terminate by itself) + virtual ~wxThread(); + +protected: + // exits from the current thread - can be called only from this thread + void Exit(ExitCode exitcode = 0); + + // entry point for the thread - called by Run() and executes in the context + // of this thread. + virtual void *Entry() = 0; + +private: + // no copy ctor/assignment operator + wxThread(const wxThread&); + wxThread& operator=(const wxThread&); + + friend class wxThreadInternal; + + // the (platform-dependent) thread class implementation + wxThreadInternal *m_internal; + + // protects access to any methods of wxThreadInternal object + wxCriticalSection m_critsect; + + // true if the thread is detached, false if it is joinable + bool m_isDetached; +}; + +// wxThreadHelperThread class +// -------------------------- + +class WXDLLIMPEXP_BASE wxThreadHelperThread : public wxThread +{ +public: + // constructor only creates the C++ thread object and doesn't create (or + // start) the real thread + wxThreadHelperThread(wxThreadHelper& owner) + : wxThread(wxTHREAD_JOINABLE), m_owner(owner) + { } + +protected: + // entry point for the thread -- calls Entry() in owner. + virtual void *Entry(); + +private: + // the owner of the thread + wxThreadHelper& m_owner; + + // no copy ctor/assignment operator + wxThreadHelperThread(const wxThreadHelperThread&); + wxThreadHelperThread& operator=(const wxThreadHelperThread&); +}; + +// ---------------------------------------------------------------------------- +// wxThreadHelper: this class implements the threading logic to run a +// background task in another object (such as a window). It is a mix-in: just +// derive from it to implement a threading background task in your class. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxThreadHelper +{ +private: + void KillThread() + { + if ( m_thread ) + { + m_thread->Kill(); + delete m_thread; + } + } + +public: + // constructor only initializes m_thread to NULL + wxThreadHelper() : m_thread(NULL) { } + + // destructor deletes m_thread + virtual ~wxThreadHelper() { KillThread(); } + + // create a new thread (and optionally set the stack size on platforms that + // support/need that), call Run() to start it + wxThreadError Create(unsigned int stackSize = 0) + { + KillThread(); + + m_thread = new wxThreadHelperThread(*this); + + return m_thread->Create(stackSize); + } + + // entry point for the thread - called by Run() and executes in the context + // of this thread. + virtual void *Entry() = 0; + + // returns a pointer to the thread which can be used to call Run() + wxThread *GetThread() const { return m_thread; } + +protected: + wxThread *m_thread; +}; + +// call Entry() in owner, put it down here to avoid circular declarations +inline void *wxThreadHelperThread::Entry() +{ + return m_owner.Entry(); +} + +// ---------------------------------------------------------------------------- +// Automatic initialization +// ---------------------------------------------------------------------------- + +// GUI mutex handling. +void WXDLLIMPEXP_BASE wxMutexGuiEnter(); +void WXDLLIMPEXP_BASE wxMutexGuiLeave(); + +// macros for entering/leaving critical sections which may be used without +// having to take them inside "#if wxUSE_THREADS" +#define wxENTER_CRIT_SECT(cs) (cs).Enter() +#define wxLEAVE_CRIT_SECT(cs) (cs).Leave() +#define wxCRIT_SECT_DECLARE(cs) static wxCriticalSection cs +#define wxCRIT_SECT_DECLARE_MEMBER(cs) wxCriticalSection cs +#define wxCRIT_SECT_LOCKER(name, cs) wxCriticalSectionLocker name(cs) + +// function for checking if we're in the main thread which may be used whether +// wxUSE_THREADS is 0 or 1 +inline bool wxIsMainThread() { return wxThread::IsMain(); } + +#else // !wxUSE_THREADS + +// no thread support +inline void WXDLLIMPEXP_BASE wxMutexGuiEnter() { } +inline void WXDLLIMPEXP_BASE wxMutexGuiLeave() { } + +// macros for entering/leaving critical sections which may be used without +// having to take them inside "#if wxUSE_THREADS" +#define wxENTER_CRIT_SECT(cs) +#define wxLEAVE_CRIT_SECT(cs) +#define wxCRIT_SECT_DECLARE(cs) +#define wxCRIT_SECT_DECLARE_MEMBER(cs) +#define wxCRIT_SECT_LOCKER(name, cs) + +// if there is only one thread, it is always the main one +inline bool wxIsMainThread() { return true; } + +#endif // wxUSE_THREADS/!wxUSE_THREADS + +// mark part of code as being a critical section: this macro declares a +// critical section with the given name and enters it immediately and leaves +// it at the end of the current scope +// +// example: +// +// int Count() +// { +// static int s_counter = 0; +// +// wxCRITICAL_SECTION(counter); +// +// return ++s_counter; +// } +// +// this function is MT-safe in presence of the threads but there is no +// overhead when the library is compiled without threads +#define wxCRITICAL_SECTION(name) \ + wxCRIT_SECT_DECLARE(s_cs##name); \ + wxCRIT_SECT_LOCKER(cs##name##Locker, s_cs##name) + +// automatically lock GUI mutex in ctor and unlock it in dtor +class WXDLLIMPEXP_BASE wxMutexGuiLocker +{ +public: + wxMutexGuiLocker() { wxMutexGuiEnter(); } + ~wxMutexGuiLocker() { wxMutexGuiLeave(); } +}; + +// ----------------------------------------------------------------------------- +// implementation only until the end of file +// ----------------------------------------------------------------------------- + +#if wxUSE_THREADS + +#if defined(__WXMSW__) || defined(__WXMAC__) || defined(__OS2__) || defined(__EMX__) + // unlock GUI if there are threads waiting for and lock it back when + // there are no more of them - should be called periodically by the main + // thread + extern void WXDLLIMPEXP_BASE wxMutexGuiLeaveOrEnter(); + + // returns true if the main thread has GUI lock + extern bool WXDLLIMPEXP_BASE wxGuiOwnedByMainThread(); + + // wakes up the main thread if it's sleeping inside ::GetMessage() + extern void WXDLLIMPEXP_BASE wxWakeUpMainThread(); + + // return true if the main thread is waiting for some other to terminate: + // wxApp then should block all "dangerous" messages + extern bool WXDLLIMPEXP_BASE wxIsWaitingForThread(); +#endif // MSW, Mac, OS/2 + +#endif // wxUSE_THREADS + +#endif // _WX_THREAD_H_ diff --git a/Externals/wxWidgets/include/wx/thrimpl.cpp b/Externals/wxWidgets/include/wx/thrimpl.cpp new file mode 100644 index 0000000000..5034b1ea73 --- /dev/null +++ b/Externals/wxWidgets/include/wx/thrimpl.cpp @@ -0,0 +1,330 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: include/wx/thrimpl.cpp +// Purpose: common part of wxThread Implementations +// Author: Vadim Zeitlin +// Modified by: +// Created: 04.06.02 (extracted from src/*/thread.cpp files) +// RCS-ID: $Id: thrimpl.cpp 42206 2006-10-21 16:06:11Z VZ $ +// Copyright: (c) Vadim Zeitlin (2002) +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// this file is supposed to be included only by the various thread.cpp + +// ---------------------------------------------------------------------------- +// wxMutex +// ---------------------------------------------------------------------------- + +wxMutex::wxMutex(wxMutexType mutexType) +{ + m_internal = new wxMutexInternal(mutexType); + + if ( !m_internal->IsOk() ) + { + delete m_internal; + m_internal = NULL; + } +} + +wxMutex::~wxMutex() +{ + delete m_internal; +} + +bool wxMutex::IsOk() const +{ + return m_internal != NULL; +} + +wxMutexError wxMutex::Lock() +{ + wxCHECK_MSG( m_internal, wxMUTEX_INVALID, + _T("wxMutex::Lock(): not initialized") ); + + return m_internal->Lock(); +} + +wxMutexError wxMutex::TryLock() +{ + wxCHECK_MSG( m_internal, wxMUTEX_INVALID, + _T("wxMutex::TryLock(): not initialized") ); + + return m_internal->TryLock(); +} + +wxMutexError wxMutex::Unlock() +{ + wxCHECK_MSG( m_internal, wxMUTEX_INVALID, + _T("wxMutex::Unlock(): not initialized") ); + + return m_internal->Unlock(); +} + +// -------------------------------------------------------------------------- +// wxConditionInternal +// -------------------------------------------------------------------------- + +// Win32 and OS/2 don't have explicit support for the POSIX condition +// variables and their events/event semaphores have quite different semantics, +// so we reimplement the conditions from scratch using the mutexes and +// semaphores +#if defined(__WXMSW__) || defined(__OS2__) || defined(__EMX__) + +class wxConditionInternal +{ +public: + wxConditionInternal(wxMutex& mutex); + + bool IsOk() const { return m_mutex.IsOk() && m_semaphore.IsOk(); } + + wxCondError Wait(); + wxCondError WaitTimeout(unsigned long milliseconds); + + wxCondError Signal(); + wxCondError Broadcast(); + +private: + // the number of threads currently waiting for this condition + LONG m_numWaiters; + + // the critical section protecting m_numWaiters + wxCriticalSection m_csWaiters; + + wxMutex& m_mutex; + wxSemaphore m_semaphore; + + DECLARE_NO_COPY_CLASS(wxConditionInternal) +}; + +wxConditionInternal::wxConditionInternal(wxMutex& mutex) + : m_mutex(mutex) +{ + // another thread can't access it until we return from ctor, so no need to + // protect access to m_numWaiters here + m_numWaiters = 0; +} + +wxCondError wxConditionInternal::Wait() +{ + // increment the number of waiters + { + wxCriticalSectionLocker lock(m_csWaiters); + m_numWaiters++; + } + + m_mutex.Unlock(); + + // a potential race condition can occur here + // + // after a thread increments m_numWaiters, and unlocks the mutex and before + // the semaphore.Wait() is called, if another thread can cause a signal to + // be generated + // + // this race condition is handled by using a semaphore and incrementing the + // semaphore only if m_numWaiters is greater that zero since the semaphore, + // can 'remember' signals the race condition will not occur + + // wait ( if necessary ) and decrement semaphore + wxSemaError err = m_semaphore.Wait(); + m_mutex.Lock(); + + if ( err == wxSEMA_NO_ERROR ) + return wxCOND_NO_ERROR; + else if ( err == wxSEMA_TIMEOUT ) + return wxCOND_TIMEOUT; + else + return wxCOND_MISC_ERROR; +} + +wxCondError wxConditionInternal::WaitTimeout(unsigned long milliseconds) +{ + { + wxCriticalSectionLocker lock(m_csWaiters); + m_numWaiters++; + } + + m_mutex.Unlock(); + + // a race condition can occur at this point in the code + // + // please see the comments in Wait(), for details + + wxSemaError err = m_semaphore.WaitTimeout(milliseconds); + + if ( err == wxSEMA_TIMEOUT ) + { + // another potential race condition exists here it is caused when a + // 'waiting' thread times out, and returns from WaitForSingleObject, + // but has not yet decremented m_numWaiters + // + // at this point if another thread calls signal() then the semaphore + // will be incremented, but the waiting thread will miss it. + // + // to handle this particular case, the waiting thread calls + // WaitForSingleObject again with a timeout of 0, after locking + // m_csWaiters. This call does not block because of the zero + // timeout, but will allow the waiting thread to catch the missed + // signals. + wxCriticalSectionLocker lock(m_csWaiters); + + wxSemaError err2 = m_semaphore.WaitTimeout(0); + + if ( err2 != wxSEMA_NO_ERROR ) + { + m_numWaiters--; + } + } + + m_mutex.Lock(); + + return err == wxSEMA_NO_ERROR ? wxCOND_NO_ERROR + : err == wxSEMA_TIMEOUT ? wxCOND_TIMEOUT + : wxCOND_MISC_ERROR; +} + +wxCondError wxConditionInternal::Signal() +{ + wxCriticalSectionLocker lock(m_csWaiters); + + if ( m_numWaiters > 0 ) + { + // increment the semaphore by 1 + if ( m_semaphore.Post() != wxSEMA_NO_ERROR ) + return wxCOND_MISC_ERROR; + + m_numWaiters--; + } + + return wxCOND_NO_ERROR; +} + +wxCondError wxConditionInternal::Broadcast() +{ + wxCriticalSectionLocker lock(m_csWaiters); + + while ( m_numWaiters > 0 ) + { + if ( m_semaphore.Post() != wxSEMA_NO_ERROR ) + return wxCOND_MISC_ERROR; + + m_numWaiters--; + } + + return wxCOND_NO_ERROR; +} + +#endif // MSW or OS2 + +// ---------------------------------------------------------------------------- +// wxCondition +// ---------------------------------------------------------------------------- + +wxCondition::wxCondition(wxMutex& mutex) +{ + m_internal = new wxConditionInternal(mutex); + + if ( !m_internal->IsOk() ) + { + delete m_internal; + m_internal = NULL; + } +} + +wxCondition::~wxCondition() +{ + delete m_internal; +} + +bool wxCondition::IsOk() const +{ + return m_internal != NULL; +} + +wxCondError wxCondition::Wait() +{ + wxCHECK_MSG( m_internal, wxCOND_INVALID, + _T("wxCondition::Wait(): not initialized") ); + + return m_internal->Wait(); +} + +wxCondError wxCondition::WaitTimeout(unsigned long milliseconds) +{ + wxCHECK_MSG( m_internal, wxCOND_INVALID, + _T("wxCondition::Wait(): not initialized") ); + + return m_internal->WaitTimeout(milliseconds); +} + +wxCondError wxCondition::Signal() +{ + wxCHECK_MSG( m_internal, wxCOND_INVALID, + _T("wxCondition::Signal(): not initialized") ); + + return m_internal->Signal(); +} + +wxCondError wxCondition::Broadcast() +{ + wxCHECK_MSG( m_internal, wxCOND_INVALID, + _T("wxCondition::Broadcast(): not initialized") ); + + return m_internal->Broadcast(); +} + +// -------------------------------------------------------------------------- +// wxSemaphore +// -------------------------------------------------------------------------- + +wxSemaphore::wxSemaphore(int initialcount, int maxcount) +{ + m_internal = new wxSemaphoreInternal( initialcount, maxcount ); + if ( !m_internal->IsOk() ) + { + delete m_internal; + m_internal = NULL; + } +} + +wxSemaphore::~wxSemaphore() +{ + delete m_internal; +} + +bool wxSemaphore::IsOk() const +{ + return m_internal != NULL; +} + +wxSemaError wxSemaphore::Wait() +{ + wxCHECK_MSG( m_internal, wxSEMA_INVALID, + _T("wxSemaphore::Wait(): not initialized") ); + + return m_internal->Wait(); +} + +wxSemaError wxSemaphore::TryWait() +{ + wxCHECK_MSG( m_internal, wxSEMA_INVALID, + _T("wxSemaphore::TryWait(): not initialized") ); + + return m_internal->TryWait(); +} + +wxSemaError wxSemaphore::WaitTimeout(unsigned long milliseconds) +{ + wxCHECK_MSG( m_internal, wxSEMA_INVALID, + _T("wxSemaphore::WaitTimeout(): not initialized") ); + + return m_internal->WaitTimeout(milliseconds); +} + +wxSemaError wxSemaphore::Post() +{ + wxCHECK_MSG( m_internal, wxSEMA_INVALID, + _T("wxSemaphore::Post(): not initialized") ); + + return m_internal->Post(); +} + diff --git a/Externals/wxWidgets/include/wx/timer.h b/Externals/wxWidgets/include/wx/timer.h new file mode 100644 index 0000000000..f81cd3860b --- /dev/null +++ b/Externals/wxWidgets/include/wx/timer.h @@ -0,0 +1,201 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/timer.h +// Purpose: wxTimer, wxStopWatch and global time-related functions +// Author: Julian Smart +// Modified by: Vadim Zeitlin (wxTimerBase) +// Guillermo Rodriguez (global clean up) +// Created: 04/01/98 +// RCS-ID: $Id: timer.h 44244 2007-01-18 17:00:52Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_TIMER_H_BASE_ +#define _WX_TIMER_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_GUI && wxUSE_TIMER + +#include "wx/object.h" +#include "wx/longlong.h" +#include "wx/event.h" +#include "wx/stopwatch.h" // for backwards compatibility +#include "wx/window.h" // only for NewControlId() + + +// more readable flags for Start(): + +// generate notifications periodically until the timer is stopped (default) +#define wxTIMER_CONTINUOUS false + +// only send the notification once and then stop the timer +#define wxTIMER_ONE_SHOT true + +// the interface of wxTimer class +class WXDLLEXPORT wxTimerBase : public wxEvtHandler +{ +public: + // ctors and initializers + // ---------------------- + + // default: if you don't call SetOwner(), your only chance to get timer + // notifications is to override Notify() in the derived class + wxTimerBase() + { Init(); SetOwner(this); } + + // ctor which allows to avoid having to override Notify() in the derived + // class: the owner will get timer notifications which can be handled with + // EVT_TIMER + wxTimerBase(wxEvtHandler *owner, int timerid = wxID_ANY) + { Init(); SetOwner(owner, timerid); } + + // same as ctor above + void SetOwner(wxEvtHandler *owner, int timerid = wxID_ANY) + { + m_owner = owner; + m_idTimer = timerid == wxID_ANY ? wxWindow::NewControlId() : timerid; + } + + wxEvtHandler *GetOwner() const { return m_owner; } + + virtual ~wxTimerBase(); + + // working with the timer + // ---------------------- + + // start the timer: if milliseconds == -1, use the same value as for the + // last Start() + // + // it is now valid to call Start() multiple times: this just restarts the + // timer if it is already running + virtual bool Start(int milliseconds = -1, bool oneShot = false); + + // stop the timer + virtual void Stop() = 0; + + // override this in your wxTimer-derived class if you want to process timer + // messages in it, use non default ctor or SetOwner() otherwise + virtual void Notify(); + + // getting info + // ------------ + + // return true if the timer is running + virtual bool IsRunning() const = 0; + + // return the timer ID + int GetId() const { return m_idTimer; } + + // get the (last) timer interval in milliseconds + int GetInterval() const { return m_milli; } + + // return true if the timer is one shot + bool IsOneShot() const { return m_oneShot; } + +protected: + // common part of all ctors + void Init() + { m_owner = NULL; m_idTimer = wxID_ANY; m_milli = 0; m_oneShot = false; } + + wxEvtHandler *m_owner; + int m_idTimer; + int m_milli; // the timer interval + bool m_oneShot; // true if one shot + + DECLARE_NO_COPY_CLASS(wxTimerBase) +}; + +// ---------------------------------------------------------------------------- +// wxTimer itself +// ---------------------------------------------------------------------------- + +#if defined(__WXMSW__) + #include "wx/msw/timer.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/timer.h" +#elif defined(__WXGTK20__) + #include "wx/gtk/timer.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/timer.h" +#elif defined(__WXX11__) || defined(__WXMGL__) || defined(__WXDFB__) + #include "wx/generic/timer.h" +#elif defined (__WXCOCOA__) + #include "wx/cocoa/timer.h" +#elif defined(__WXMAC__) + #include "wx/mac/timer.h" +#elif defined(__WXPM__) + #include "wx/os2/timer.h" +#endif + +// ---------------------------------------------------------------------------- +// wxTimerRunner: starts the timer in its ctor, stops in the dtor +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxTimerRunner +{ +public: + wxTimerRunner(wxTimer& timer) : m_timer(timer) { } + wxTimerRunner(wxTimer& timer, int milli, bool oneShot = false) + : m_timer(timer) + { + m_timer.Start(milli, oneShot); + } + + void Start(int milli, bool oneShot = false) + { + m_timer.Start(milli, oneShot); + } + + ~wxTimerRunner() + { + if ( m_timer.IsRunning() ) + { + m_timer.Stop(); + } + } + +private: + wxTimer& m_timer; + + DECLARE_NO_COPY_CLASS(wxTimerRunner) +}; + +// ---------------------------------------------------------------------------- +// wxTimerEvent +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxTimerEvent : public wxEvent +{ +public: + wxTimerEvent(int timerid = 0, int interval = 0) : wxEvent(timerid) + { + m_eventType = wxEVT_TIMER; + + m_interval = interval; + } + + // accessors + int GetInterval() const { return m_interval; } + + // implement the base class pure virtual + virtual wxEvent *Clone() const { return new wxTimerEvent(*this); } + +private: + int m_interval; + + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxTimerEvent) +}; + +typedef void (wxEvtHandler::*wxTimerEventFunction)(wxTimerEvent&); + +#define wxTimerEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxTimerEventFunction, &func) + +#define EVT_TIMER(timerid, func) \ + wx__DECLARE_EVT1(wxEVT_TIMER, timerid, wxTimerEventHandler(func)) + +#endif // wxUSE_GUI && wxUSE_TIMER + +#endif + // _WX_TIMER_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/tipdlg.h b/Externals/wxWidgets/include/wx/tipdlg.h new file mode 100644 index 0000000000..88f8905bd8 --- /dev/null +++ b/Externals/wxWidgets/include/wx/tipdlg.h @@ -0,0 +1,84 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: tipdlg.h +// Purpose: declaration of wxTipDialog +// Author: Vadim Zeitlin +// Modified by: +// Created: 28.06.99 +// RCS-ID: $Id: tipdlg.h 35650 2005-09-23 12:56:45Z MR $ +// Copyright: (c) Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_TIPDLG_H_ +#define _WX_TIPDLG_H_ + +// ---------------------------------------------------------------------------- +// headers which we must include here +// ---------------------------------------------------------------------------- + +#include "wx/defs.h" + +#if wxUSE_STARTUP_TIPS + +#include "wx/textfile.h" + +// ---------------------------------------------------------------------------- +// wxTipProvider - a class which is used by wxTipDialog to get the text of the +// tips +// ---------------------------------------------------------------------------- + +// the abstract base class: it provides the tips, i.e. implements the GetTip() +// function which returns the new tip each time it's called. To support this, +// wxTipProvider evidently needs some internal state which is the tip "index" +// and which should be saved/restored by the program to not always show one and +// the same tip (of course, you may use random starting position as well...) +class WXDLLIMPEXP_ADV wxTipProvider +{ +public: + wxTipProvider(size_t currentTip) { m_currentTip = currentTip; } + + // get the current tip and update the internal state to return the next tip + // when called for the next time + virtual wxString GetTip() = 0; + + // get the current tip "index" (or whatever allows the tip provider to know + // from where to start the next time) + size_t GetCurrentTip() const { return m_currentTip; } + + // Allows any user-derived class to optionally override this function to + // modify the tip as soon as it is read. If return wxEmptyString, then + // the tip is skipped, and the next one is read. + virtual wxString PreprocessTip(const wxString& tip) { return tip; } + + // virtual dtor for the base class + virtual ~wxTipProvider() { } + +protected: + size_t m_currentTip; +}; + +// a function which returns an implementation of wxTipProvider using the +// specified text file as the source of tips (each line is a tip). +// +// NB: the caller is responsible for deleting the pointer! +WXDLLIMPEXP_ADV wxTipProvider *wxCreateFileTipProvider(const wxString& filename, + size_t currentTip); + +// ---------------------------------------------------------------------------- +// wxTipDialog +// ---------------------------------------------------------------------------- + +// A dialog which shows a "tip" - a short and helpful messages describing to +// the user some program characteristic. Many programs show the tips at +// startup, so the dialog has "Show tips on startup" checkbox which allows to +// the user to disable this (however, it's the program which should show, or +// not, the dialog on startup depending on its value, not this class). +// +// The function returns true if this checkbox is checked, false otherwise. +WXDLLIMPEXP_ADV bool wxShowTip(wxWindow *parent, + wxTipProvider *tipProvider, + bool showAtStartup = true); + +#endif // wxUSE_STARTUP_TIPS + +#endif // _WX_TIPDLG_H_ diff --git a/Externals/wxWidgets/include/wx/tipwin.h b/Externals/wxWidgets/include/wx/tipwin.h new file mode 100644 index 0000000000..0bf3db8dc0 --- /dev/null +++ b/Externals/wxWidgets/include/wx/tipwin.h @@ -0,0 +1,98 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/tipwin.h +// Purpose: wxTipWindow is a window like the one typically used for +// showing the tooltips +// Author: Vadim Zeitlin +// Modified by: +// Created: 10.09.00 +// RCS-ID: $Id: tipwin.h 35650 2005-09-23 12:56:45Z MR $ +// Copyright: (c) 2000 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_TIPWIN_H_ +#define _WX_TIPWIN_H_ + +#if wxUSE_TIPWINDOW + +#if wxUSE_POPUPWIN + #include "wx/popupwin.h" + + #define wxTipWindowBase wxPopupTransientWindow +#else + #include "wx/frame.h" + + #define wxTipWindowBase wxFrame +#endif +#include "wx/arrstr.h" + +class WXDLLEXPORT wxTipWindowView; + +// ---------------------------------------------------------------------------- +// wxTipWindow +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxTipWindow : public wxTipWindowBase +{ +public: + // the mandatory ctor parameters are: the parent window and the text to + // show + // + // optionally you may also specify the length at which the lines are going + // to be broken in rows (100 pixels by default) + // + // windowPtr and rectBound are just passed to SetTipWindowPtr() and + // SetBoundingRect() - see below + wxTipWindow(wxWindow *parent, + const wxString& text, + wxCoord maxLength = 100, + wxTipWindow** windowPtr = NULL, + wxRect *rectBound = NULL); + + virtual ~wxTipWindow(); + + // If windowPtr is not NULL the given address will be NULLed when the + // window has closed + void SetTipWindowPtr(wxTipWindow** windowPtr) { m_windowPtr = windowPtr; } + + // If rectBound is not NULL, the window will disappear automatically when + // the mouse leave the specified rect: note that rectBound should be in the + // screen coordinates! + void SetBoundingRect(const wxRect& rectBound); + + // Hide and destroy the window + void Close(); + +protected: + // called by wxTipWindowView only + bool CheckMouseInBounds(const wxPoint& pos); + + // event handlers + void OnMouseClick(wxMouseEvent& event); + +#if !wxUSE_POPUPWIN + void OnActivate(wxActivateEvent& event); + void OnKillFocus(wxFocusEvent& event); +#else // wxUSE_POPUPWIN + virtual void OnDismiss(); +#endif // wxUSE_POPUPWIN/!wxUSE_POPUPWIN + +private: + wxArrayString m_textLines; + wxCoord m_heightLine; + + wxTipWindowView *m_view; + + wxTipWindow** m_windowPtr; + wxRect m_rectBound; + + DECLARE_EVENT_TABLE() + + friend class wxTipWindowView; + + DECLARE_NO_COPY_CLASS(wxTipWindow) +}; + +#endif // wxUSE_TIPWINDOW + +#endif // _WX_TIPWIN_H_ diff --git a/Externals/wxWidgets/include/wx/tokenzr.h b/Externals/wxWidgets/include/wx/tokenzr.h new file mode 100644 index 0000000000..3b884f8a7a --- /dev/null +++ b/Externals/wxWidgets/include/wx/tokenzr.h @@ -0,0 +1,135 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/tokenzr.h +// Purpose: String tokenizer - a C++ replacement for strtok(3) +// Author: Guilhem Lavaux +// Modified by: (or rather rewritten by) Vadim Zeitlin +// Created: 04/22/98 +// RCS-ID: $Id: tokenzr.h 36741 2006-01-06 21:41:54Z VZ $ +// Copyright: (c) Guilhem Lavaux +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_TOKENZRH +#define _WX_TOKENZRH + +#include "wx/object.h" +#include "wx/string.h" +#include "wx/arrstr.h" + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// default: delimiters are usual white space characters +#define wxDEFAULT_DELIMITERS (_T(" \t\r\n")) + +// wxStringTokenizer mode flags which determine its behaviour +enum wxStringTokenizerMode +{ + wxTOKEN_INVALID = -1, // set by def ctor until SetString() is called + wxTOKEN_DEFAULT, // strtok() for whitespace delims, RET_EMPTY else + wxTOKEN_RET_EMPTY, // return empty token in the middle of the string + wxTOKEN_RET_EMPTY_ALL, // return trailing empty tokens too + wxTOKEN_RET_DELIMS, // return the delim with token (implies RET_EMPTY) + wxTOKEN_STRTOK // behave exactly like strtok(3) +}; + +// ---------------------------------------------------------------------------- +// wxStringTokenizer: replaces infamous strtok() and has some other features +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxStringTokenizer : public wxObject +{ +public: + // ctors and initializers + // default ctor, call SetString() later + wxStringTokenizer() { m_mode = wxTOKEN_INVALID; } + // ctor which gives us the string + wxStringTokenizer(const wxString& str, + const wxString& delims = wxDEFAULT_DELIMITERS, + wxStringTokenizerMode mode = wxTOKEN_DEFAULT); + + // args are same as for the non default ctor above + void SetString(const wxString& str, + const wxString& delims = wxDEFAULT_DELIMITERS, + wxStringTokenizerMode mode = wxTOKEN_DEFAULT); + + // reinitialize the tokenizer with the same delimiters/mode + void Reinit(const wxString& str); + + // tokens access + // return the number of remaining tokens + size_t CountTokens() const; + // did we reach the end of the string? + bool HasMoreTokens() const; + // get the next token, will return empty string if !HasMoreTokens() + wxString GetNextToken(); + // get the delimiter which terminated the token last retrieved by + // GetNextToken() or NUL if there had been no tokens yet or the last + // one wasn't terminated (but ran to the end of the string) + wxChar GetLastDelimiter() const { return m_lastDelim; } + + // get current tokenizer state + // returns the part of the string which remains to tokenize (*not* the + // initial string) + wxString GetString() const { return m_string.substr(m_pos); } + + // returns the current position (i.e. one index after the last + // returned token or 0 if GetNextToken() has never been called) in the + // original string + size_t GetPosition() const { return m_pos; } + + // misc + // get the current mode - can be different from the one passed to the + // ctor if it was wxTOKEN_DEFAULT + wxStringTokenizerMode GetMode() const { return m_mode; } + // do we return empty tokens? + bool AllowEmpty() const { return m_mode != wxTOKEN_STRTOK; } + + + // backwards compatibility section from now on + // ------------------------------------------- + + // for compatibility only, use GetNextToken() instead + wxString NextToken() { return GetNextToken(); } + + // compatibility only, don't use + void SetString(const wxString& to_tokenize, + const wxString& delims, + bool WXUNUSED(ret_delim)) + { + SetString(to_tokenize, delims, wxTOKEN_RET_DELIMS); + } + + wxStringTokenizer(const wxString& to_tokenize, + const wxString& delims, + bool ret_delim) + { + SetString(to_tokenize, delims, ret_delim); + } + +protected: + bool IsOk() const { return m_mode != wxTOKEN_INVALID; } + + wxString m_string, // the string we tokenize + m_delims; // all possible delimiters + + size_t m_pos; // the current position in m_string + + wxStringTokenizerMode m_mode; // see wxTOKEN_XXX values + + wxChar m_lastDelim; // delimiter after last token or '\0' +}; + +// ---------------------------------------------------------------------------- +// convenience function which returns all tokens at once +// ---------------------------------------------------------------------------- + +// the function takes the same parameters as wxStringTokenizer ctor and returns +// the array containing all tokens +wxArrayString WXDLLIMPEXP_BASE +wxStringTokenize(const wxString& str, + const wxString& delims = wxDEFAULT_DELIMITERS, + wxStringTokenizerMode mode = wxTOKEN_DEFAULT); + +#endif // _WX_TOKENZRH diff --git a/Externals/wxWidgets/include/wx/toolbar.h b/Externals/wxWidgets/include/wx/toolbar.h new file mode 100644 index 0000000000..a64868e48b --- /dev/null +++ b/Externals/wxWidgets/include/wx/toolbar.h @@ -0,0 +1,93 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/toolbar.h +// Purpose: wxToolBar interface declaration +// Author: Vadim Zeitlin +// Modified by: +// Created: 20.11.99 +// RCS-ID: $Id: toolbar.h 42645 2006-10-29 19:12:52Z VZ $ +// Copyright: (c) Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_TOOLBAR_H_BASE_ +#define _WX_TOOLBAR_H_BASE_ + +#include "wx/defs.h" + +// ---------------------------------------------------------------------------- +// wxToolBar style flags +// ---------------------------------------------------------------------------- + +enum +{ + // lay out the toolbar horizontally + wxTB_HORIZONTAL = wxHORIZONTAL, // == 0x0004 + wxTB_TOP = wxTB_HORIZONTAL, + + // lay out the toolbar vertically + wxTB_VERTICAL = wxVERTICAL, // == 0x0008 + wxTB_LEFT = wxTB_VERTICAL, + + // show 3D buttons (wxToolBarSimple only) + wxTB_3DBUTTONS = 0x0010, + + // "flat" buttons (Win32/GTK only) + wxTB_FLAT = 0x0020, + + // dockable toolbar (GTK only) + wxTB_DOCKABLE = 0x0040, + + // don't show the icons (they're shown by default) + wxTB_NOICONS = 0x0080, + + // show the text (not shown by default) + wxTB_TEXT = 0x0100, + + // don't show the divider between toolbar and the window (Win32 only) + wxTB_NODIVIDER = 0x0200, + + // no automatic alignment (Win32 only, useless) + wxTB_NOALIGN = 0x0400, + + // show the text and the icons alongside, not vertically stacked (Win32/GTK) + wxTB_HORZ_LAYOUT = 0x0800, + wxTB_HORZ_TEXT = wxTB_HORZ_LAYOUT | wxTB_TEXT, + + // don't show the toolbar short help tooltips + wxTB_NO_TOOLTIPS = 0x1000, + + // lay out toolbar at the bottom of the window + wxTB_BOTTOM = 0x2000, + + // lay out toolbar at the right edge of the window + wxTB_RIGHT = 0x4000 +}; + +#if wxUSE_TOOLBAR + #include "wx/tbarbase.h" // the base class for all toolbars + + #if defined(__WXUNIVERSAL__) + #include "wx/univ/toolbar.h" + #elif defined(__WXPALMOS__) + #include "wx/palmos/toolbar.h" + #elif defined(__WXMSW__) && (!defined(_WIN32_WCE) || (_WIN32_WCE >= 400 && !defined(__POCKETPC__) && !defined(__SMARTPHONE__))) + #include "wx/msw/tbar95.h" + #elif defined(__WXWINCE__) + #include "wx/msw/wince/tbarwce.h" + #elif defined(__WXMOTIF__) + #include "wx/motif/toolbar.h" + #elif defined(__WXGTK20__) + #include "wx/gtk/tbargtk.h" + #elif defined(__WXGTK__) + #include "wx/gtk1/tbargtk.h" + #elif defined(__WXMAC__) + #include "wx/mac/toolbar.h" + #elif defined(__WXCOCOA__) + #include "wx/cocoa/toolbar.h" + #elif defined(__WXPM__) + #include "wx/os2/toolbar.h" + #endif +#endif // wxUSE_TOOLBAR + +#endif + // _WX_TOOLBAR_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/toolbook.h b/Externals/wxWidgets/include/wx/toolbook.h new file mode 100644 index 0000000000..695ffa8835 --- /dev/null +++ b/Externals/wxWidgets/include/wx/toolbook.h @@ -0,0 +1,163 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/toolbook.h +// Purpose: wxToolbook: wxToolBar and wxNotebook combination +// Author: Julian Smart +// Modified by: +// Created: 2006-01-29 +// RCS-ID: $Id: toolbook.h 49804 2007-11-10 01:09:42Z VZ $ +// Copyright: (c) 2006 Julian Smart +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_TOOLBOOK_H_ +#define _WX_TOOLBOOK_H_ + +#include "wx/defs.h" + +#if wxUSE_TOOLBOOK + +#include "wx/bookctrl.h" + +class WXDLLIMPEXP_FWD_CORE wxToolBarBase; +class WXDLLIMPEXP_FWD_CORE wxCommandEvent; + +extern WXDLLIMPEXP_CORE const wxEventType wxEVT_COMMAND_TOOLBOOK_PAGE_CHANGED; +extern WXDLLIMPEXP_CORE const wxEventType wxEVT_COMMAND_TOOLBOOK_PAGE_CHANGING; + + +// Use wxButtonToolBar +#define wxBK_BUTTONBAR 0x0100 + +// ---------------------------------------------------------------------------- +// wxToolbook +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxToolbook : public wxBookCtrlBase +{ +public: + wxToolbook() + { + Init(); + } + + wxToolbook(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxEmptyString) + { + Init(); + + (void)Create(parent, id, pos, size, style, name); + } + + // quasi ctor + bool Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxEmptyString); + + + // implement base class virtuals + virtual int GetSelection() const; + virtual bool SetPageText(size_t n, const wxString& strText); + virtual wxString GetPageText(size_t n) const; + virtual int GetPageImage(size_t n) const; + virtual bool SetPageImage(size_t n, int imageId); + virtual wxSize CalcSizeFromPage(const wxSize& sizePage) const; + virtual bool InsertPage(size_t n, + wxWindow *page, + const wxString& text, + bool bSelect = false, + int imageId = -1); + virtual int SetSelection(size_t n) { return DoSetSelection(n, SetSelection_SendEvent); } + virtual int ChangeSelection(size_t n) { return DoSetSelection(n); } + virtual void SetImageList(wxImageList *imageList); + + virtual bool DeleteAllPages(); + virtual int HitTest(const wxPoint& pt, long *flags = NULL) const; + + + // methods which are not part of base wxBookctrl API + + // get the underlying toolbar + wxToolBarBase* GetToolBar() const { return (wxToolBarBase*)m_bookctrl; } + + // must be called in OnIdle or by application to realize the toolbar and + // select the initial page. + void Realize(); + +protected: + virtual wxWindow *DoRemovePage(size_t page); + + // get the size which the list control should have + virtual wxSize GetControllerSize() const; + + // event handlers + void OnToolSelected(wxCommandEvent& event); + void OnSize(wxSizeEvent& event); + void OnIdle(wxIdleEvent& event); + + void UpdateSelectedPage(size_t newsel); + + wxBookCtrlBaseEvent* CreatePageChangingEvent() const; + void MakeChangedEvent(wxBookCtrlBaseEvent &event); + + // the currently selected page or wxNOT_FOUND if none + int m_selection; + + // whether the toolbar needs to be realized + bool m_needsRealizing; + + // maximum bitmap size + wxSize m_maxBitmapSize; + +private: + // common part of all constructors + void Init(); + + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS_NO_COPY(wxToolbook) +}; + +// ---------------------------------------------------------------------------- +// listbook event class and related stuff +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxToolbookEvent : public wxBookCtrlBaseEvent +{ +public: + wxToolbookEvent(wxEventType commandType = wxEVT_NULL, int id = 0, + int nSel = wxNOT_FOUND, int nOldSel = wxNOT_FOUND) + : wxBookCtrlBaseEvent(commandType, id, nSel, nOldSel) + { + } + + wxToolbookEvent(const wxToolbookEvent& event) + : wxBookCtrlBaseEvent(event) + { + } + + virtual wxEvent *Clone() const { return new wxToolbookEvent(*this); } + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxToolbookEvent) +}; + +typedef void (wxEvtHandler::*wxToolbookEventFunction)(wxToolbookEvent&); + +#define wxToolbookEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxToolbookEventFunction, &func) + +#define EVT_TOOLBOOK_PAGE_CHANGED(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_COMMAND_TOOLBOOK_PAGE_CHANGED, winid, wxToolbookEventHandler(fn)) + +#define EVT_TOOLBOOK_PAGE_CHANGING(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_COMMAND_TOOLBOOK_PAGE_CHANGING, winid, wxToolbookEventHandler(fn)) + +#endif // wxUSE_TOOLBOOK + +#endif // _WX_TOOLBOOK_H_ diff --git a/Externals/wxWidgets/include/wx/tooltip.h b/Externals/wxWidgets/include/wx/tooltip.h new file mode 100644 index 0000000000..af29741f45 --- /dev/null +++ b/Externals/wxWidgets/include/wx/tooltip.h @@ -0,0 +1,39 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: tooltip.h +// Purpose: wxToolTip base header +// Author: Robert Roebling +// Modified by: +// Created: +// Copyright: (c) Robert Roebling +// RCS-ID: $Id: tooltip.h 37066 2006-01-23 03:27:34Z MR $ +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_TOOLTIP_H_BASE_ +#define _WX_TOOLTIP_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_TOOLTIPS + +#if defined(__WXMSW__) +#include "wx/msw/tooltip.h" +#elif defined(__WXMOTIF__) +// #include "wx/motif/tooltip.h" +#elif defined(__WXGTK20__) +#include "wx/gtk/tooltip.h" +#elif defined(__WXGTK__) +#include "wx/gtk1/tooltip.h" +#elif defined(__WXMAC__) +#include "wx/mac/tooltip.h" +#elif defined(__WXCOCOA__) +#include "wx/cocoa/tooltip.h" +#elif defined(__WXPM__) +#include "wx/os2/tooltip.h" +#endif + +#endif + // wxUSE_TOOLTIPS + +#endif + // _WX_TOOLTIP_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/toplevel.h b/Externals/wxWidgets/include/wx/toplevel.h new file mode 100644 index 0000000000..0b6831357f --- /dev/null +++ b/Externals/wxWidgets/include/wx/toplevel.h @@ -0,0 +1,375 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/toplevel.h +// Purpose: declares wxTopLevelWindow class, the base class for all +// top level windows (such as frames and dialogs) +// Author: Vadim Zeitlin, Vaclav Slavik +// Modified by: +// Created: 06.08.01 +// RCS-ID: $Id: toplevel.h 43843 2006-12-07 05:44:44Z PC $ +// Copyright: (c) 2001 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> +// Vaclav Slavik <vaclav@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_TOPLEVEL_BASE_H_ +#define _WX_TOPLEVEL_BASE_H_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/window.h" +#include "wx/iconbndl.h" + +// the default names for various classes +extern WXDLLEXPORT_DATA(const wxChar) wxFrameNameStr[]; + +class WXDLLEXPORT wxTopLevelWindowBase; + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// style common to both wxFrame and wxDialog +#define wxSTAY_ON_TOP 0x8000 +#define wxICONIZE 0x4000 +#define wxMINIMIZE wxICONIZE +#define wxMAXIMIZE 0x2000 +#define wxCLOSE_BOX 0x1000 + +#define wxSYSTEM_MENU 0x0800 +#define wxMINIMIZE_BOX 0x0400 +#define wxMAXIMIZE_BOX 0x0200 +#define wxTINY_CAPTION_HORIZ 0x0100 +#define wxTINY_CAPTION_VERT 0x0080 +#define wxRESIZE_BORDER 0x0040 + +#if WXWIN_COMPATIBILITY_2_6 + + // deprecated versions defined for compatibility reasons + #define wxRESIZE_BOX wxMAXIMIZE_BOX + #define wxTHICK_FRAME wxRESIZE_BORDER + + // obsolete styles, unused any more + #define wxDIALOG_MODAL 0 + #define wxDIALOG_MODELESS 0 + #define wxNO_3D 0 + #define wxUSER_COLOURS 0 + +#endif // WXWIN_COMPATIBILITY_2_6 + +// default style +// +// under Windows CE (at least when compiling with eVC 4) we should create +// top level windows without any styles at all for them to appear +// "correctly", i.e. as full screen windows with a "hide" button (same as +// "close" but round instead of squared and just hides the applications +// instead of closing it) in the title bar +#if defined(__WXWINCE__) + #if defined(__SMARTPHONE__) + #define wxDEFAULT_FRAME_STYLE (wxMAXIMIZE) + #elif defined(__WINCE_STANDARDSDK__) + #define wxDEFAULT_FRAME_STYLE (wxMAXIMIZE|wxCLOSE_BOX) + #else + #define wxDEFAULT_FRAME_STYLE (wxNO_BORDER) + #endif +#else // !__WXWINCE__ + #define wxDEFAULT_FRAME_STYLE \ + (wxSYSTEM_MENU | \ + wxRESIZE_BORDER | \ + wxMINIMIZE_BOX | \ + wxMAXIMIZE_BOX | \ + wxCLOSE_BOX | \ + wxCAPTION | \ + wxCLIP_CHILDREN) +#endif + + +// Dialogs are created in a special way +#define wxTOPLEVEL_EX_DIALOG 0x00000008 + +// Styles for ShowFullScreen +// (note that wxTopLevelWindow only handles wxFULLSCREEN_NOBORDER and +// wxFULLSCREEN_NOCAPTION; the rest is handled by wxTopLevelWindow) +enum +{ + wxFULLSCREEN_NOMENUBAR = 0x0001, + wxFULLSCREEN_NOTOOLBAR = 0x0002, + wxFULLSCREEN_NOSTATUSBAR = 0x0004, + wxFULLSCREEN_NOBORDER = 0x0008, + wxFULLSCREEN_NOCAPTION = 0x0010, + + wxFULLSCREEN_ALL = wxFULLSCREEN_NOMENUBAR | wxFULLSCREEN_NOTOOLBAR | + wxFULLSCREEN_NOSTATUSBAR | wxFULLSCREEN_NOBORDER | + wxFULLSCREEN_NOCAPTION +}; + +// Styles for RequestUserAttention +enum +{ + wxUSER_ATTENTION_INFO = 1, + wxUSER_ATTENTION_ERROR = 2 +}; + +// ---------------------------------------------------------------------------- +// wxTopLevelWindow: a top level (as opposed to child) window +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxTopLevelWindowBase : public wxWindow +{ +public: + // construction + wxTopLevelWindowBase(); + virtual ~wxTopLevelWindowBase(); + + // top level wnd state + // -------------------- + + // maximize = true => maximize, otherwise - restore + virtual void Maximize(bool maximize = true) = 0; + + // undo Maximize() or Iconize() + virtual void Restore() = 0; + + // iconize = true => iconize, otherwise - restore + virtual void Iconize(bool iconize = true) = 0; + + // return true if the frame is maximized + virtual bool IsMaximized() const = 0; + + // return true if the frame is always maximized + // due to native guidelines or current policy + virtual bool IsAlwaysMaximized() const; + + // return true if the frame is iconized + virtual bool IsIconized() const = 0; + + // get the frame icon + const wxIcon& GetIcon() const { return m_icons.GetIcon( -1 ); } + + // get the frame icons + const wxIconBundle& GetIcons() const { return m_icons; } + + // set the frame icon + virtual void SetIcon(const wxIcon& icon) { m_icons = wxIconBundle( icon ); } + + // set the frame icons + virtual void SetIcons(const wxIconBundle& icons ) { m_icons = icons; } + + // maximize the window to cover entire screen + virtual bool ShowFullScreen(bool show, long style = wxFULLSCREEN_ALL) = 0; + + // return true if the frame is in fullscreen mode + virtual bool IsFullScreen() const = 0; + + // the title of the top level window: the text which the + // window shows usually at the top of the frame/dialog in dedicated bar + virtual void SetTitle(const wxString& title) = 0; + virtual wxString GetTitle() const = 0; + + // enable/disable close button [x] + virtual bool EnableCloseButton(bool WXUNUSED(enable) ) { return false; } + + // Set the shape of the window to the given region. + // Returns true if the platform supports this feature (and the + // operation is successful.) + virtual bool SetShape(const wxRegion& WXUNUSED(region)) { return false; } + + // Attracts the users attention to this window if the application is + // inactive (should be called when a background event occurs) + virtual void RequestUserAttention(int flags = wxUSER_ATTENTION_INFO); + + // Is this the active frame (highlighted in the taskbar)? + virtual bool IsActive() { return wxGetTopLevelParent(FindFocus()) == this; } + + // this function may be overridden to return false to allow closing the + // application even when this top level window is still open + // + // notice that the window is still closed prior to the application exit and + // so it can still veto it even if it returns false from here + virtual bool ShouldPreventAppExit() const { return true; } + + +#if defined(__SMARTPHONE__) + virtual void SetLeftMenu(int id = wxID_ANY, const wxString& label = wxEmptyString, wxMenu *subMenu = NULL) = 0; + virtual void SetRightMenu(int id = wxID_ANY, const wxString& label = wxEmptyString, wxMenu *subMenu = NULL) = 0; +#endif // __SMARTPHONE__ + + // centre the window on screen: this is just a shortcut + void CentreOnScreen(int dir = wxBOTH) { DoCentre(dir | wxCENTRE_ON_SCREEN); } + void CenterOnScreen(int dir = wxBOTH) { CentreOnScreen(dir); } + + + // default item access: we have a permanent default item which is the one + // set by the user code but we may also have a temporary default item which + // would be chosen if the user pressed "Enter" now but the default action + // reverts to the "permanent" default as soon as this temporary default + // item loses focus + + // used to reset default if pointing to removed child + virtual void RemoveChild(wxWindowBase *child); + + // get the default item, temporary or permanent + wxWindow *GetDefaultItem() const + { return m_winTmpDefault ? m_winTmpDefault : m_winDefault; } + + // set the permanent default item, return the old default + wxWindow *SetDefaultItem(wxWindow *win) + { wxWindow *old = GetDefaultItem(); m_winDefault = win; return old; } + + // return the temporary default item, can be NULL + wxWindow *GetTmpDefaultItem() const { return m_winTmpDefault; } + + // set a temporary default item, SetTmpDefaultItem(NULL) should be called + // soon after a call to SetTmpDefaultItem(window), return the old default + wxWindow *SetTmpDefaultItem(wxWindow *win) + { wxWindow *old = GetDefaultItem(); m_winTmpDefault = win; return old; } + + + // implementation only from now on + // ------------------------------- + + // override some base class virtuals + virtual bool Destroy(); + virtual bool IsTopLevel() const { return true; } + virtual bool IsVisible() const { return IsShown(); } + + // event handlers + void OnCloseWindow(wxCloseEvent& event); + void OnSize(wxSizeEvent& WXUNUSED(event)) { DoLayout(); } + + // Get rect to be used to center top-level children + virtual void GetRectForTopLevelChildren(int *x, int *y, int *w, int *h); + + // this should go away, but for now it's called from docview.cpp, + // so should be there for all platforms + void OnActivate(wxActivateEvent &WXUNUSED(event)) { } + + // do the window-specific processing after processing the update event + virtual void DoUpdateWindowUI(wxUpdateUIEvent& event) ; + + // a different API for SetSizeHints + virtual void SetMinSize(const wxSize& minSize); + virtual void SetMaxSize(const wxSize& maxSize); + + // set size hints for "window manager" + virtual void DoSetSizeHints( int minW, int minH, + int maxW = wxDefaultCoord, int maxH = wxDefaultCoord, + int incW = wxDefaultCoord, int incH = wxDefaultCoord ); + +protected: + // the frame client to screen translation should take account of the + // toolbar which may shift the origin of the client area + virtual void DoClientToScreen(int *x, int *y) const; + virtual void DoScreenToClient(int *x, int *y) const; + + // add support for wxCENTRE_ON_SCREEN + virtual void DoCentre(int dir); + + // no need to do client to screen translation to get our position in screen + // coordinates: this is already the case + virtual void DoGetScreenPosition(int *x, int *y) const + { + DoGetPosition(x, y); + } + + // test whether this window makes part of the frame + // (menubar, toolbar and statusbar are excluded from automatic layout) + virtual bool IsOneOfBars(const wxWindow *WXUNUSED(win)) const + { return false; } + + // check if we should exit the program after deleting this window + bool IsLastBeforeExit() const; + + // send the iconize event, return true if processed + bool SendIconizeEvent(bool iconized = true); + + // do TLW-specific layout: we resize our unique child to fill the entire + // client area + void DoLayout(); + + // Get the default size for the new window if no explicit size given. If + // there are better default sizes then these can be changed, just as long + // as they are not too small for TLWs (and not larger than screen). + static wxSize GetDefaultSize(); + static int WidthDefault(int w) { return w == wxDefaultCoord ? GetDefaultSize().x : w; } + static int HeightDefault(int h) { return h == wxDefaultCoord ? GetDefaultSize().y : h; } + + // the frame icon + wxIconBundle m_icons; + + // a default window (usually a button) or NULL + wxWindow *m_winDefault; + + // a temporary override of m_winDefault, use the latter if NULL + wxWindow *m_winTmpDefault; + + DECLARE_NO_COPY_CLASS(wxTopLevelWindowBase) + DECLARE_EVENT_TABLE() +}; + + +// include the real class declaration +#if defined(__WXPALMOS__) + #include "wx/palmos/toplevel.h" + #define wxTopLevelWindowNative wxTopLevelWindowPalm +#elif defined(__WXMSW__) + #include "wx/msw/toplevel.h" + #define wxTopLevelWindowNative wxTopLevelWindowMSW +#elif defined(__WXGTK20__) + #include "wx/gtk/toplevel.h" + #define wxTopLevelWindowNative wxTopLevelWindowGTK +#elif defined(__WXGTK__) + #include "wx/gtk1/toplevel.h" + #define wxTopLevelWindowNative wxTopLevelWindowGTK +#elif defined(__WXX11__) + #include "wx/x11/toplevel.h" + #define wxTopLevelWindowNative wxTopLevelWindowX11 +#elif defined(__WXMGL__) + #include "wx/mgl/toplevel.h" + #define wxTopLevelWindowNative wxTopLevelWindowMGL +#elif defined(__WXDFB__) + #include "wx/dfb/toplevel.h" + #define wxTopLevelWindowNative wxTopLevelWindowDFB +#elif defined(__WXMAC__) + #include "wx/mac/toplevel.h" + #define wxTopLevelWindowNative wxTopLevelWindowMac +#elif defined(__WXCOCOA__) + #include "wx/cocoa/toplevel.h" + #define wxTopLevelWindowNative wxTopLevelWindowCocoa +#elif defined(__WXPM__) + #include "wx/os2/toplevel.h" + #define wxTopLevelWindowNative wxTopLevelWindowOS2 +#elif defined(__WXMOTIF__) + #include "wx/motif/toplevel.h" + #define wxTopLevelWindowNative wxTopLevelWindowMotif +#endif + +#ifdef __WXUNIVERSAL__ + #include "wx/univ/toplevel.h" +#else // !__WXUNIVERSAL__ + #ifdef wxTopLevelWindowNative + class WXDLLEXPORT wxTopLevelWindow : public wxTopLevelWindowNative + { + public: + // construction + wxTopLevelWindow() { Init(); } + wxTopLevelWindow(wxWindow *parent, + wxWindowID winid, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDEFAULT_FRAME_STYLE, + const wxString& name = wxFrameNameStr) + { + Init(); + Create(parent, winid, title, pos, size, style, name); + } + + DECLARE_DYNAMIC_CLASS_NO_COPY(wxTopLevelWindow) + }; + #endif // wxTopLevelWindowNative +#endif // __WXUNIVERSAL__/!__WXUNIVERSAL__ + + +#endif // _WX_TOPLEVEL_BASE_H_ diff --git a/Externals/wxWidgets/include/wx/treebase.h b/Externals/wxWidgets/include/wx/treebase.h new file mode 100644 index 0000000000..2a9771831b --- /dev/null +++ b/Externals/wxWidgets/include/wx/treebase.h @@ -0,0 +1,426 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/treebase.h +// Purpose: wxTreeCtrl base classes and types +// Author: Julian Smart et al +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: treebase.h 39857 2006-06-27 21:21:36Z RD $ +// Copyright: (c) 1997,1998 Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_TREEBASE_H_ +#define _WX_TREEBASE_H_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/defs.h" + +#if wxUSE_TREECTRL + +#include "wx/window.h" // for wxClientData +#include "wx/event.h" +#include "wx/dynarray.h" + +#if WXWIN_COMPATIBILITY_2_6 + +// flags for deprecated `Expand(int action)', will be removed in next versions +enum +{ + wxTREE_EXPAND_EXPAND, + wxTREE_EXPAND_COLLAPSE, + wxTREE_EXPAND_COLLAPSE_RESET, + wxTREE_EXPAND_TOGGLE +}; + +#endif // WXWIN_COMPATIBILITY_2_6 + +// ---------------------------------------------------------------------------- +// wxTreeItemId identifies an element of the tree. In this implementation, it's +// just a trivial wrapper around Win32 HTREEITEM or a pointer to some private +// data structure in the generic version. It's opaque for the application and +// the only method which can be used by user code is IsOk(). +// ---------------------------------------------------------------------------- + +// Using this typedef removes an ambiguity when calling Remove() +typedef void *wxTreeItemIdValue; + +class WXDLLEXPORT wxTreeItemId +{ + friend bool operator==(const wxTreeItemId&, const wxTreeItemId&); +public: + // ctors + // 0 is invalid value for HTREEITEM + wxTreeItemId() { m_pItem = 0; } + + // construct wxTreeItemId from the native item id + wxTreeItemId(void *pItem) { m_pItem = pItem; } + + // default copy ctor/assignment operator are ok for us + + // accessors + // is this a valid tree item? + bool IsOk() const { return m_pItem != 0; } + // return true if this item is not valid + bool operator!() const { return !IsOk(); } + + // operations + // invalidate the item + void Unset() { m_pItem = 0; } + +#if WXWIN_COMPATIBILITY_2_4 + // deprecated: only for compatibility, don't work on 64 bit archs + wxTreeItemId(long item) { m_pItem = wxUIntToPtr(item); } + operator long() const { return (long)wxPtrToUInt(m_pItem); } +#else // !WXWIN_COMPATIBILITY_2_4 + operator bool() const { return IsOk(); } +#endif // WXWIN_COMPATIBILITY_2_4/!WXWIN_COMPATIBILITY_2_4 + + wxTreeItemIdValue m_pItem; +}; + +inline bool operator==(const wxTreeItemId& i1, const wxTreeItemId& i2) +{ + return i1.m_pItem == i2.m_pItem; +} + +inline bool operator!=(const wxTreeItemId& i1, const wxTreeItemId& i2) +{ + return i1.m_pItem != i2.m_pItem; +} + +// ---------------------------------------------------------------------------- +// wxTreeItemData is some (arbitrary) user class associated with some item. The +// main advantage of having this class (compared to old untyped interface) is +// that wxTreeItemData's are destroyed automatically by the tree and, as this +// class has virtual dtor, it means that the memory will be automatically +// freed. OTOH, we don't just use wxObject instead of wxTreeItemData because +// the size of this class is critical: in any real application, each tree leaf +// will have wxTreeItemData associated with it and number of leaves may be +// quite big. +// +// Because the objects of this class are deleted by the tree, they should +// always be allocated on the heap! +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxTreeItemData: public wxClientData +{ +friend class WXDLLEXPORT wxTreeCtrl; +friend class WXDLLEXPORT wxGenericTreeCtrl; +public: + // creation/destruction + // -------------------- + // default ctor + wxTreeItemData() { } + + // default copy ctor/assignment operator are ok + + // accessor: get the item associated with us + const wxTreeItemId& GetId() const { return m_pItem; } + void SetId(const wxTreeItemId& id) { m_pItem = id; } + +protected: + wxTreeItemId m_pItem; +}; + +WX_DEFINE_EXPORTED_ARRAY_PTR(wxTreeItemIdValue, wxArrayTreeItemIdsBase); + +// this is a wrapper around the array class defined above which allow to wok +// with vaue of natural wxTreeItemId type instead of using wxTreeItemIdValue +// and does it without any loss of efficiency +class WXDLLEXPORT wxArrayTreeItemIds : public wxArrayTreeItemIdsBase +{ +public: + void Add(const wxTreeItemId& id) + { wxArrayTreeItemIdsBase::Add(id.m_pItem); } + void Insert(const wxTreeItemId& id, size_t pos) + { wxArrayTreeItemIdsBase::Insert(id.m_pItem, pos); } + wxTreeItemId Item(size_t i) const + { return wxTreeItemId(wxArrayTreeItemIdsBase::Item(i)); } + wxTreeItemId operator[](size_t i) const { return Item(i); } +}; + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// enum for different images associated with a treectrl item +enum wxTreeItemIcon +{ + wxTreeItemIcon_Normal, // not selected, not expanded + wxTreeItemIcon_Selected, // selected, not expanded + wxTreeItemIcon_Expanded, // not selected, expanded + wxTreeItemIcon_SelectedExpanded, // selected, expanded + wxTreeItemIcon_Max +}; + +// ---------------------------------------------------------------------------- +// wxTreeCtrl flags +// ---------------------------------------------------------------------------- + +#define wxTR_NO_BUTTONS 0x0000 // for convenience +#define wxTR_HAS_BUTTONS 0x0001 // draw collapsed/expanded btns +#define wxTR_NO_LINES 0x0004 // don't draw lines at all +#define wxTR_LINES_AT_ROOT 0x0008 // connect top-level nodes +#define wxTR_TWIST_BUTTONS 0x0010 // still used by wxTreeListCtrl + +#define wxTR_SINGLE 0x0000 // for convenience +#define wxTR_MULTIPLE 0x0020 // can select multiple items +#define wxTR_EXTENDED 0x0040 // TODO: allow extended selection +#define wxTR_HAS_VARIABLE_ROW_HEIGHT 0x0080 // what it says + +#define wxTR_EDIT_LABELS 0x0200 // can edit item labels +#define wxTR_ROW_LINES 0x0400 // put border around items +#define wxTR_HIDE_ROOT 0x0800 // don't display root node + +#define wxTR_FULL_ROW_HIGHLIGHT 0x2000 // highlight full horz space + +#ifdef __WXGTK20__ +#define wxTR_DEFAULT_STYLE (wxTR_HAS_BUTTONS | wxTR_NO_LINES) +#else +#define wxTR_DEFAULT_STYLE (wxTR_HAS_BUTTONS | wxTR_LINES_AT_ROOT) +#endif + +#if WXWIN_COMPATIBILITY_2_6 +// deprecated, don't use +#define wxTR_MAC_BUTTONS 0 +#define wxTR_AQUA_BUTTONS 0 +#endif // WXWIN_COMPATIBILITY_2_6 + + +// values for the `flags' parameter of wxTreeCtrl::HitTest() which determine +// where exactly the specified point is situated: + +static const int wxTREE_HITTEST_ABOVE = 0x0001; +static const int wxTREE_HITTEST_BELOW = 0x0002; +static const int wxTREE_HITTEST_NOWHERE = 0x0004; + // on the button associated with an item. +static const int wxTREE_HITTEST_ONITEMBUTTON = 0x0008; + // on the bitmap associated with an item. +static const int wxTREE_HITTEST_ONITEMICON = 0x0010; + // on the indent associated with an item. +static const int wxTREE_HITTEST_ONITEMINDENT = 0x0020; + // on the label (string) associated with an item. +static const int wxTREE_HITTEST_ONITEMLABEL = 0x0040; + // on the right of the label associated with an item. +static const int wxTREE_HITTEST_ONITEMRIGHT = 0x0080; + // on the label (string) associated with an item. +static const int wxTREE_HITTEST_ONITEMSTATEICON = 0x0100; + // on the left of the wxTreeCtrl. +static const int wxTREE_HITTEST_TOLEFT = 0x0200; + // on the right of the wxTreeCtrl. +static const int wxTREE_HITTEST_TORIGHT = 0x0400; + // on the upper part (first half) of the item. +static const int wxTREE_HITTEST_ONITEMUPPERPART = 0x0800; + // on the lower part (second half) of the item. +static const int wxTREE_HITTEST_ONITEMLOWERPART = 0x1000; + + // anywhere on the item +static const int wxTREE_HITTEST_ONITEM = wxTREE_HITTEST_ONITEMICON | + wxTREE_HITTEST_ONITEMLABEL; + +// tree ctrl default name +extern WXDLLEXPORT_DATA(const wxChar) wxTreeCtrlNameStr[]; + +// ---------------------------------------------------------------------------- +// wxTreeItemAttr: a structure containing the visual attributes of an item +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxTreeItemAttr +{ +public: + // ctors + wxTreeItemAttr() { } + wxTreeItemAttr(const wxColour& colText, + const wxColour& colBack, + const wxFont& font) + : m_colText(colText), m_colBack(colBack), m_font(font) { } + + // setters + void SetTextColour(const wxColour& colText) { m_colText = colText; } + void SetBackgroundColour(const wxColour& colBack) { m_colBack = colBack; } + void SetFont(const wxFont& font) { m_font = font; } + + // accessors + bool HasTextColour() const { return m_colText.Ok(); } + bool HasBackgroundColour() const { return m_colBack.Ok(); } + bool HasFont() const { return m_font.Ok(); } + + const wxColour& GetTextColour() const { return m_colText; } + const wxColour& GetBackgroundColour() const { return m_colBack; } + const wxFont& GetFont() const { return m_font; } + +private: + wxColour m_colText, + m_colBack; + wxFont m_font; +}; + +// ---------------------------------------------------------------------------- +// wxTreeEvent is a special class for all events associated with tree controls +// +// NB: note that not all accessors make sense for all events, see the event +// descriptions below +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxTreeCtrlBase; + +class WXDLLEXPORT wxTreeEvent : public wxNotifyEvent +{ +public: + wxTreeEvent(wxEventType commandType, + wxTreeCtrlBase *tree, + const wxTreeItemId &item = wxTreeItemId()); + wxTreeEvent(wxEventType commandType = wxEVT_NULL, int id = 0); + wxTreeEvent(const wxTreeEvent& event); + + virtual wxEvent *Clone() const { return new wxTreeEvent(*this); } + + // accessors + // get the item on which the operation was performed or the newly + // selected item for wxEVT_COMMAND_TREE_SEL_CHANGED/ING events + wxTreeItemId GetItem() const { return m_item; } + void SetItem(const wxTreeItemId& item) { m_item = item; } + + // for wxEVT_COMMAND_TREE_SEL_CHANGED/ING events, get the previously + // selected item + wxTreeItemId GetOldItem() const { return m_itemOld; } + void SetOldItem(const wxTreeItemId& item) { m_itemOld = item; } + + // the point where the mouse was when the drag operation started (for + // wxEVT_COMMAND_TREE_BEGIN_(R)DRAG events only) or click position + wxPoint GetPoint() const { return m_pointDrag; } + void SetPoint(const wxPoint& pt) { m_pointDrag = pt; } + + // keyboard data (for wxEVT_COMMAND_TREE_KEY_DOWN only) + const wxKeyEvent& GetKeyEvent() const { return m_evtKey; } + int GetKeyCode() const { return m_evtKey.GetKeyCode(); } + void SetKeyEvent(const wxKeyEvent& evt) { m_evtKey = evt; } + + // label (for EVT_TREE_{BEGIN|END}_LABEL_EDIT only) + const wxString& GetLabel() const { return m_label; } + void SetLabel(const wxString& label) { m_label = label; } + + // edit cancel flag (for EVT_TREE_{BEGIN|END}_LABEL_EDIT only) + bool IsEditCancelled() const { return m_editCancelled; } + void SetEditCanceled(bool editCancelled) { m_editCancelled = editCancelled; } + + // Set the tooltip for the item (for EVT\_TREE\_ITEM\_GETTOOLTIP events) + void SetToolTip(const wxString& toolTip) { m_label = toolTip; } + wxString GetToolTip() { return m_label; } + +private: + // not all of the members are used (or initialized) for all events + wxKeyEvent m_evtKey; + wxTreeItemId m_item, + m_itemOld; + wxPoint m_pointDrag; + wxString m_label; + bool m_editCancelled; + + friend class WXDLLEXPORT wxTreeCtrl; + friend class WXDLLEXPORT wxGenericTreeCtrl; + + DECLARE_DYNAMIC_CLASS(wxTreeEvent) +}; + +typedef void (wxEvtHandler::*wxTreeEventFunction)(wxTreeEvent&); + +// ---------------------------------------------------------------------------- +// tree control events and macros for handling them +// ---------------------------------------------------------------------------- + +BEGIN_DECLARE_EVENT_TYPES() + DECLARE_EVENT_TYPE(wxEVT_COMMAND_TREE_BEGIN_DRAG, 600) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_TREE_BEGIN_RDRAG, 601) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_TREE_BEGIN_LABEL_EDIT, 602) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_TREE_END_LABEL_EDIT, 603) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_TREE_DELETE_ITEM, 604) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_TREE_GET_INFO, 605) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_TREE_SET_INFO, 606) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_TREE_ITEM_EXPANDED, 607) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_TREE_ITEM_EXPANDING, 608) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_TREE_ITEM_COLLAPSED, 609) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_TREE_ITEM_COLLAPSING, 610) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_TREE_SEL_CHANGED, 611) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_TREE_SEL_CHANGING, 612) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_TREE_KEY_DOWN, 613) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_TREE_ITEM_ACTIVATED, 614) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_TREE_ITEM_RIGHT_CLICK, 615) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_TREE_ITEM_MIDDLE_CLICK, 616) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_TREE_END_DRAG, 617) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_TREE_STATE_IMAGE_CLICK, 618) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_TREE_ITEM_GETTOOLTIP, 619) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_TREE_ITEM_MENU, 620) +END_DECLARE_EVENT_TYPES() + +#define wxTreeEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxTreeEventFunction, &func) + +#define wx__DECLARE_TREEEVT(evt, id, fn) \ + wx__DECLARE_EVT1(wxEVT_COMMAND_TREE_ ## evt, id, wxTreeEventHandler(fn)) + +// GetItem() returns the item being dragged, GetPoint() the mouse coords +// +// if you call event.Allow(), the drag operation will start and a +// EVT_TREE_END_DRAG event will be sent when the drag is over. +#define EVT_TREE_BEGIN_DRAG(id, fn) wx__DECLARE_TREEEVT(BEGIN_DRAG, id, fn) +#define EVT_TREE_BEGIN_RDRAG(id, fn) wx__DECLARE_TREEEVT(BEGIN_RDRAG, id, fn) + +// GetItem() is the item on which the drop occurred (if any) and GetPoint() the +// current mouse coords +#define EVT_TREE_END_DRAG(id, fn) wx__DECLARE_TREEEVT(END_DRAG, id, fn) + +// GetItem() returns the itme whose label is being edited, GetLabel() returns +// the current item label for BEGIN and the would be new one for END. +// +// Vetoing BEGIN event means that label editing won't happen at all, +// vetoing END means that the new value is discarded and the old one kept +#define EVT_TREE_BEGIN_LABEL_EDIT(id, fn) wx__DECLARE_TREEEVT(BEGIN_LABEL_EDIT, id, fn) +#define EVT_TREE_END_LABEL_EDIT(id, fn) wx__DECLARE_TREEEVT(END_LABEL_EDIT, id, fn) + +// provide/update information about GetItem() item +#define EVT_TREE_GET_INFO(id, fn) wx__DECLARE_TREEEVT(GET_INFO, id, fn) +#define EVT_TREE_SET_INFO(id, fn) wx__DECLARE_TREEEVT(SET_INFO, id, fn) + +// GetItem() is the item being expanded/collapsed, the "ING" versions can use +#define EVT_TREE_ITEM_EXPANDED(id, fn) wx__DECLARE_TREEEVT(ITEM_EXPANDED, id, fn) +#define EVT_TREE_ITEM_EXPANDING(id, fn) wx__DECLARE_TREEEVT(ITEM_EXPANDING, id, fn) +#define EVT_TREE_ITEM_COLLAPSED(id, fn) wx__DECLARE_TREEEVT(ITEM_COLLAPSED, id, fn) +#define EVT_TREE_ITEM_COLLAPSING(id, fn) wx__DECLARE_TREEEVT(ITEM_COLLAPSING, id, fn) + +// GetOldItem() is the item which had the selection previously, GetItem() is +// the item which acquires selection +#define EVT_TREE_SEL_CHANGED(id, fn) wx__DECLARE_TREEEVT(SEL_CHANGED, id, fn) +#define EVT_TREE_SEL_CHANGING(id, fn) wx__DECLARE_TREEEVT(SEL_CHANGING, id, fn) + +// GetKeyCode() returns the key code +// NB: this is the only message for which GetItem() is invalid (you may get the +// item from GetSelection()) +#define EVT_TREE_KEY_DOWN(id, fn) wx__DECLARE_TREEEVT(KEY_DOWN, id, fn) + +// GetItem() returns the item being deleted, the associated data (if any) will +// be deleted just after the return of this event handler (if any) +#define EVT_TREE_DELETE_ITEM(id, fn) wx__DECLARE_TREEEVT(DELETE_ITEM, id, fn) + +// GetItem() returns the item that was activated (double click, enter, space) +#define EVT_TREE_ITEM_ACTIVATED(id, fn) wx__DECLARE_TREEEVT(ITEM_ACTIVATED, id, fn) + +// GetItem() returns the item for which the context menu shall be shown +#define EVT_TREE_ITEM_MENU(id, fn) wx__DECLARE_TREEEVT(ITEM_MENU, id, fn) + +// GetItem() returns the item that was clicked on +#define EVT_TREE_ITEM_RIGHT_CLICK(id, fn) wx__DECLARE_TREEEVT(ITEM_RIGHT_CLICK, id, fn) +#define EVT_TREE_ITEM_MIDDLE_CLICK(id, fn) wx__DECLARE_TREEEVT(ITEM_MIDDLE_CLICK, id, fn) + +// GetItem() returns the item whose state image was clicked on +#define EVT_TREE_STATE_IMAGE_CLICK(id, fn) wx__DECLARE_TREEEVT(STATE_IMAGE_CLICK, id, fn) + +// GetItem() is the item for which the tooltip is being requested +#define EVT_TREE_ITEM_GETTOOLTIP(id, fn) wx__DECLARE_TREEEVT(ITEM_GETTOOLTIP, id, fn) + +#endif // wxUSE_TREECTRL + +#endif // _WX_TREEBASE_H_ diff --git a/Externals/wxWidgets/include/wx/treebook.h b/Externals/wxWidgets/include/wx/treebook.h new file mode 100644 index 0000000000..dba6363521 --- /dev/null +++ b/Externals/wxWidgets/include/wx/treebook.h @@ -0,0 +1,283 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/treebook.h +// Purpose: wxTreebook: wxNotebook-like control presenting pages in a tree +// Author: Evgeniy Tarassov, Vadim Zeitlin +// Modified by: +// Created: 2005-09-15 +// RCS-ID: $Id: treebook.h 49804 2007-11-10 01:09:42Z VZ $ +// Copyright: (c) 2005 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_TREEBOOK_H_ +#define _WX_TREEBOOK_H_ + +#include "wx/defs.h" + +#if wxUSE_TREEBOOK + +#include "wx/bookctrl.h" +#include "wx/treectrl.h" // for wxArrayTreeItemIds +#include "wx/containr.h" + +typedef wxWindow wxTreebookPage; + +class WXDLLIMPEXP_FWD_CORE wxTreeEvent; + +// ---------------------------------------------------------------------------- +// wxTreebook +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxTreebook : public wxBookCtrlBase +{ +public: + // Constructors and such + // --------------------- + + // Default ctor doesn't create the control, use Create() afterwards + wxTreebook() + { + Init(); + } + + // This ctor creates the tree book control + wxTreebook(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxBK_DEFAULT, + const wxString& name = wxEmptyString) + { + Init(); + + (void)Create(parent, id, pos, size, style, name); + } + + // Really creates the control + bool Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxBK_DEFAULT, + const wxString& name = wxEmptyString); + + + // Page insertion operations + // ------------------------- + + // Notice that page pointer may be NULL in which case the next non NULL + // page (usually the first child page of a node) is shown when this page is + // selected + + // Inserts a new page just before the page indicated by page. + // The new page is placed on the same level as page. + virtual bool InsertPage(size_t pos, + wxWindow *page, + const wxString& text, + bool bSelect = false, + int imageId = wxNOT_FOUND); + + // Inserts a new sub-page to the end of children of the page at given pos. + virtual bool InsertSubPage(size_t pos, + wxWindow *page, + const wxString& text, + bool bSelect = false, + int imageId = wxNOT_FOUND); + + // Adds a new page at top level after all other pages. + virtual bool AddPage(wxWindow *page, + const wxString& text, + bool bSelect = false, + int imageId = wxNOT_FOUND); + + // Adds a new child-page to the last top-level page inserted. + // Useful when constructing 1 level tree structure. + virtual bool AddSubPage(wxWindow *page, + const wxString& text, + bool bSelect = false, + int imageId = wxNOT_FOUND); + + // Deletes the page and ALL its children. Could trigger page selection + // change in a case when selected page is removed. In that case its parent + // is selected (or the next page if no parent). + virtual bool DeletePage(size_t pos); + + + // Tree operations + // --------------- + + // Gets the page node state -- node is expanded or collapsed + virtual bool IsNodeExpanded(size_t pos) const; + + // Expands or collapses the page node. Returns the previous state. + // May generate page changing events (if selected page + // is under the collapsed branch, then parent is autoselected). + virtual bool ExpandNode(size_t pos, bool expand = true); + + // shortcut for ExpandNode(pos, false) + bool CollapseNode(size_t pos) { return ExpandNode(pos, false); } + + // get the parent page or wxNOT_FOUND if this is a top level page + int GetPageParent(size_t pos) const; + + // the tree control we use for showing the pages index tree + wxTreeCtrl* GetTreeCtrl() const { return (wxTreeCtrl*)m_bookctrl; } + + + // Standard operations inherited from wxBookCtrlBase + // ------------------------------------------------- + + virtual int GetSelection() const; + virtual bool SetPageText(size_t n, const wxString& strText); + virtual wxString GetPageText(size_t n) const; + virtual int GetPageImage(size_t n) const; + virtual bool SetPageImage(size_t n, int imageId); + virtual wxSize CalcSizeFromPage(const wxSize& sizePage) const; + virtual int SetSelection(size_t n) { return DoSetSelection(n, SetSelection_SendEvent); } + virtual int ChangeSelection(size_t n) { return DoSetSelection(n); } + virtual int HitTest(const wxPoint& pt, long *flags = NULL) const; + virtual void SetImageList(wxImageList *imageList); + virtual void AssignImageList(wxImageList *imageList); + virtual bool DeleteAllPages(); + +protected: + // Implementation of a page removal. See DeletPage for comments. + wxTreebookPage *DoRemovePage(size_t pos); + + // This subclass of wxBookCtrlBase accepts NULL page pointers (empty pages) + virtual bool AllowNullPage() const { return true; } + + // event handlers + void OnTreeSelectionChange(wxTreeEvent& event); + void OnTreeNodeExpandedCollapsed(wxTreeEvent& event); + + // array of page ids and page windows + wxArrayTreeItemIds m_treeIds; + + // the currently selected page or wxNOT_FOUND if none + int m_selection; + + // in the situation when m_selection page is not wxNOT_FOUND but page is + // NULL this is the first (sub)child that has a non-NULL page + int m_actualSelection; + +private: + // common part of all constructors + void Init(); + + // The real implementations of page insertion functions + // ------------------------------------------------------ + // All DoInsert/Add(Sub)Page functions add the page into : + // - the base class + // - the tree control + // - update the index/TreeItemId corespondance array + bool DoInsertPage(size_t pos, + wxWindow *page, + const wxString& text, + bool bSelect = false, + int imageId = wxNOT_FOUND); + bool DoInsertSubPage(size_t pos, + wxWindow *page, + const wxString& text, + bool bSelect = false, + int imageId = wxNOT_FOUND); + bool DoAddSubPage(wxWindow *page, + const wxString& text, + bool bSelect = false, + int imageId = wxNOT_FOUND); + + // Sets selection in the tree control and updates the page being shown. + int DoSetSelection(size_t pos, int flags = 0); + + // Returns currently shown page. In a case when selected the node + // has empty (NULL) page finds first (sub)child with not-empty page. + wxTreebookPage *DoGetCurrentPage() const; + + // Does the selection update. Called from page insertion functions + // to update selection if the selected page was pushed by the newly inserted + void DoUpdateSelection(bool bSelect, int page); + + + // Operations on the internal private members of the class + // ------------------------------------------------------- + // Returns the page TreeItemId for the page. + // Or, if the page index is incorrect, a fake one (fakePage.IsOk() == false) + wxTreeItemId DoInternalGetPage(size_t pos) const; + + // Linear search for a page with the id specified. If no page + // found wxNOT_FOUND is returned. The function is used when we catch an event + // from m_tree (wxTreeCtrl) component. + int DoInternalFindPageById(wxTreeItemId page) const; + + // Updates page and wxTreeItemId correspondance. + void DoInternalAddPage(size_t newPos, wxWindow *page, wxTreeItemId pageId); + + // Removes the page from internal structure. + void DoInternalRemovePage(size_t pos) + { DoInternalRemovePageRange(pos, 0); } + + // Removes the page and all its children designated by subCount + // from internal structures of the control. + void DoInternalRemovePageRange(size_t pos, size_t subCount); + + // Returns internal number of pages which can be different from + // GetPageCount() while performing a page insertion or removal. + size_t DoInternalGetPageCount() const { return m_treeIds.Count(); } + + + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS_NO_COPY(wxTreebook) + WX_DECLARE_CONTROL_CONTAINER(); +}; + + +// ---------------------------------------------------------------------------- +// treebook event class and related stuff +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxTreebookEvent : public wxBookCtrlBaseEvent +{ +public: + wxTreebookEvent(wxEventType commandType = wxEVT_NULL, int id = 0, + int nSel = wxNOT_FOUND, int nOldSel = wxNOT_FOUND) + : wxBookCtrlBaseEvent(commandType, id, nSel, nOldSel) + { + } + + wxTreebookEvent(const wxTreebookEvent& event) + : wxBookCtrlBaseEvent(event) + { + } + + virtual wxEvent *Clone() const { return new wxTreebookEvent(*this); } + +private: + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxTreebookEvent) +}; + +extern WXDLLIMPEXP_CORE const wxEventType wxEVT_COMMAND_TREEBOOK_PAGE_CHANGED; +extern WXDLLIMPEXP_CORE const wxEventType wxEVT_COMMAND_TREEBOOK_PAGE_CHANGING; +extern WXDLLIMPEXP_CORE const wxEventType wxEVT_COMMAND_TREEBOOK_NODE_COLLAPSED; +extern WXDLLIMPEXP_CORE const wxEventType wxEVT_COMMAND_TREEBOOK_NODE_EXPANDED; + +typedef void (wxEvtHandler::*wxTreebookEventFunction)(wxTreebookEvent&); + +#define wxTreebookEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxTreebookEventFunction, &func) + +#define EVT_TREEBOOK_PAGE_CHANGED(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_COMMAND_TREEBOOK_PAGE_CHANGED, winid, wxTreebookEventHandler(fn)) + +#define EVT_TREEBOOK_PAGE_CHANGING(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_COMMAND_TREEBOOK_PAGE_CHANGING, winid, wxTreebookEventHandler(fn)) + +#define EVT_TREEBOOK_NODE_COLLAPSED(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_COMMAND_TREEBOOK_NODE_COLLAPSED, winid, wxTreebookEventHandler(fn)) + +#define EVT_TREEBOOK_NODE_EXPANDED(winid, fn) \ + wx__DECLARE_EVT1(wxEVT_COMMAND_TREEBOOK_NODE_EXPANDED, winid, wxTreebookEventHandler(fn)) + + +#endif // wxUSE_TREEBOOK + +#endif // _WX_TREEBOOK_H_ diff --git a/Externals/wxWidgets/include/wx/treectrl.h b/Externals/wxWidgets/include/wx/treectrl.h new file mode 100644 index 0000000000..2b919cbd54 --- /dev/null +++ b/Externals/wxWidgets/include/wx/treectrl.h @@ -0,0 +1,459 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/treectrl.h +// Purpose: wxTreeCtrl base header +// Author: Karsten Ballueder +// Modified by: +// Created: +// Copyright: (c) Karsten Ballueder +// RCS-ID: $Id: treectrl.h 49563 2007-10-31 20:46:21Z VZ $ +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_TREECTRL_H_BASE_ +#define _WX_TREECTRL_H_BASE_ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/defs.h" + +#if wxUSE_TREECTRL + +#include "wx/control.h" +#include "wx/treebase.h" +#include "wx/textctrl.h" // wxTextCtrl::ms_classinfo used through CLASSINFO macro + +class WXDLLIMPEXP_FWD_CORE wxImageList; + +// ---------------------------------------------------------------------------- +// wxTreeCtrlBase +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxTreeCtrlBase : public wxControl +{ +public: + wxTreeCtrlBase() + { + m_imageListNormal = + m_imageListState = NULL; + m_ownsImageListNormal = + m_ownsImageListState = false; + + // arbitrary default + m_spacing = 18; + + // quick DoGetBestSize calculation + m_quickBestSize = true; + } + + virtual ~wxTreeCtrlBase(); + + // accessors + // --------- + + // get the total number of items in the control + virtual unsigned int GetCount() const = 0; + + // indent is the number of pixels the children are indented relative to + // the parents position. SetIndent() also redraws the control + // immediately. + virtual unsigned int GetIndent() const = 0; + virtual void SetIndent(unsigned int indent) = 0; + + // spacing is the number of pixels between the start and the Text + // (has no effect under wxMSW) + unsigned int GetSpacing() const { return m_spacing; } + void SetSpacing(unsigned int spacing) { m_spacing = spacing; } + + // image list: these functions allow to associate an image list with + // the control and retrieve it. Note that the control does _not_ delete + // the associated image list when it's deleted in order to allow image + // lists to be shared between different controls. + // + // The normal image list is for the icons which correspond to the + // normal tree item state (whether it is selected or not). + // Additionally, the application might choose to show a state icon + // which corresponds to an app-defined item state (for example, + // checked/unchecked) which are taken from the state image list. + wxImageList *GetImageList() const { return m_imageListNormal; } + wxImageList *GetStateImageList() const { return m_imageListState; } + + virtual void SetImageList(wxImageList *imageList) = 0; + virtual void SetStateImageList(wxImageList *imageList) = 0; + void AssignImageList(wxImageList *imageList) + { + SetImageList(imageList); + m_ownsImageListNormal = true; + } + void AssignStateImageList(wxImageList *imageList) + { + SetStateImageList(imageList); + m_ownsImageListState = true; + } + + + // Functions to work with tree ctrl items. Unfortunately, they can _not_ be + // member functions of wxTreeItem because they must know the tree the item + // belongs to for Windows implementation and storing the pointer to + // wxTreeCtrl in each wxTreeItem is just too much waste. + + // accessors + // --------- + + // retrieve items label + virtual wxString GetItemText(const wxTreeItemId& item) const = 0; + // get one of the images associated with the item (normal by default) + virtual int GetItemImage(const wxTreeItemId& item, + wxTreeItemIcon which = wxTreeItemIcon_Normal) const = 0; + // get the data associated with the item + virtual wxTreeItemData *GetItemData(const wxTreeItemId& item) const = 0; + + // get the item's text colour + virtual wxColour GetItemTextColour(const wxTreeItemId& item) const = 0; + + // get the item's background colour + virtual wxColour GetItemBackgroundColour(const wxTreeItemId& item) const = 0; + + // get the item's font + virtual wxFont GetItemFont(const wxTreeItemId& item) const = 0; + + // modifiers + // --------- + + // set items label + virtual void SetItemText(const wxTreeItemId& item, const wxString& text) = 0; + // get one of the images associated with the item (normal by default) + virtual void SetItemImage(const wxTreeItemId& item, + int image, + wxTreeItemIcon which = wxTreeItemIcon_Normal) = 0; + // associate some data with the item + virtual void SetItemData(const wxTreeItemId& item, wxTreeItemData *data) = 0; + + // force appearance of [+] button near the item. This is useful to + // allow the user to expand the items which don't have any children now + // - but instead add them only when needed, thus minimizing memory + // usage and loading time. + virtual void SetItemHasChildren(const wxTreeItemId& item, + bool has = true) = 0; + + // the item will be shown in bold + virtual void SetItemBold(const wxTreeItemId& item, bool bold = true) = 0; + + // the item will be shown with a drop highlight + virtual void SetItemDropHighlight(const wxTreeItemId& item, + bool highlight = true) = 0; + + // set the items text colour + virtual void SetItemTextColour(const wxTreeItemId& item, + const wxColour& col) = 0; + + // set the items background colour + virtual void SetItemBackgroundColour(const wxTreeItemId& item, + const wxColour& col) = 0; + + // set the items font (should be of the same height for all items) + virtual void SetItemFont(const wxTreeItemId& item, + const wxFont& font) = 0; + + // item status inquiries + // --------------------- + + // is the item visible (it might be outside the view or not expanded)? + virtual bool IsVisible(const wxTreeItemId& item) const = 0; + // does the item has any children? + virtual bool ItemHasChildren(const wxTreeItemId& item) const = 0; + // same as above + bool HasChildren(const wxTreeItemId& item) const + { return ItemHasChildren(item); } + // is the item expanded (only makes sense if HasChildren())? + virtual bool IsExpanded(const wxTreeItemId& item) const = 0; + // is this item currently selected (the same as has focus)? + virtual bool IsSelected(const wxTreeItemId& item) const = 0; + // is item text in bold font? + virtual bool IsBold(const wxTreeItemId& item) const = 0; +#if wxABI_VERSION >= 20801 + // is the control empty? + bool IsEmpty() const; +#endif // wxABI 2.8.1+ + + + // number of children + // ------------------ + + // if 'recursively' is false, only immediate children count, otherwise + // the returned number is the number of all items in this branch + virtual size_t GetChildrenCount(const wxTreeItemId& item, + bool recursively = true) const = 0; + + // navigation + // ---------- + + // wxTreeItemId.IsOk() will return false if there is no such item + + // get the root tree item + virtual wxTreeItemId GetRootItem() const = 0; + + // get the item currently selected (may return NULL if no selection) + virtual wxTreeItemId GetSelection() const = 0; + + // get the items currently selected, return the number of such item + // + // NB: this operation is expensive and can take a long time for a + // control with a lot of items (~ O(number of items)). + virtual size_t GetSelections(wxArrayTreeItemIds& selections) const = 0; + + // get the parent of this item (may return NULL if root) + virtual wxTreeItemId GetItemParent(const wxTreeItemId& item) const = 0; + + // for this enumeration function you must pass in a "cookie" parameter + // which is opaque for the application but is necessary for the library + // to make these functions reentrant (i.e. allow more than one + // enumeration on one and the same object simultaneously). Of course, + // the "cookie" passed to GetFirstChild() and GetNextChild() should be + // the same! + + // get the first child of this item + virtual wxTreeItemId GetFirstChild(const wxTreeItemId& item, + wxTreeItemIdValue& cookie) const = 0; + // get the next child + virtual wxTreeItemId GetNextChild(const wxTreeItemId& item, + wxTreeItemIdValue& cookie) const = 0; + // get the last child of this item - this method doesn't use cookies + virtual wxTreeItemId GetLastChild(const wxTreeItemId& item) const = 0; + + // get the next sibling of this item + virtual wxTreeItemId GetNextSibling(const wxTreeItemId& item) const = 0; + // get the previous sibling + virtual wxTreeItemId GetPrevSibling(const wxTreeItemId& item) const = 0; + + // get first visible item + virtual wxTreeItemId GetFirstVisibleItem() const = 0; + // get the next visible item: item must be visible itself! + // see IsVisible() and wxTreeCtrl::GetFirstVisibleItem() + virtual wxTreeItemId GetNextVisible(const wxTreeItemId& item) const = 0; + // get the previous visible item: item must be visible itself! + virtual wxTreeItemId GetPrevVisible(const wxTreeItemId& item) const = 0; + + // operations + // ---------- + + // add the root node to the tree + virtual wxTreeItemId AddRoot(const wxString& text, + int image = -1, int selImage = -1, + wxTreeItemData *data = NULL) = 0; + + // insert a new item in as the first child of the parent + wxTreeItemId PrependItem(const wxTreeItemId& parent, + const wxString& text, + int image = -1, int selImage = -1, + wxTreeItemData *data = NULL) + { + return DoInsertItem(parent, 0u, text, image, selImage, data); + } + + // insert a new item after a given one + wxTreeItemId InsertItem(const wxTreeItemId& parent, + const wxTreeItemId& idPrevious, + const wxString& text, + int image = -1, int selImage = -1, + wxTreeItemData *data = NULL) + { + return DoInsertAfter(parent, idPrevious, text, image, selImage, data); + } + + // insert a new item before the one with the given index + wxTreeItemId InsertItem(const wxTreeItemId& parent, + size_t pos, + const wxString& text, + int image = -1, int selImage = -1, + wxTreeItemData *data = NULL) + { + return DoInsertItem(parent, pos, text, image, selImage, data); + } + + // insert a new item in as the last child of the parent + wxTreeItemId AppendItem(const wxTreeItemId& parent, + const wxString& text, + int image = -1, int selImage = -1, + wxTreeItemData *data = NULL) + { + return DoInsertItem(parent, (size_t)-1, text, image, selImage, data); + } + + // delete this item and associated data if any + virtual void Delete(const wxTreeItemId& item) = 0; + // delete all children (but don't delete the item itself) + // NB: this won't send wxEVT_COMMAND_TREE_ITEM_DELETED events + virtual void DeleteChildren(const wxTreeItemId& item) = 0; + // delete all items from the tree + // NB: this won't send wxEVT_COMMAND_TREE_ITEM_DELETED events + virtual void DeleteAllItems() = 0; + + // expand this item + virtual void Expand(const wxTreeItemId& item) = 0; + // expand the item and all its childs and thats childs + void ExpandAllChildren(const wxTreeItemId& item); + // expand all items + void ExpandAll(); + // collapse the item without removing its children + virtual void Collapse(const wxTreeItemId& item) = 0; +#if wxABI_VERSION >= 20801 + // collapse the item and all its childs and thats childs + void CollapseAllChildren(const wxTreeItemId& item); + // collapse all items + void CollapseAll(); +#endif // wxABI 2.8.1+ + // collapse the item and remove all children + virtual void CollapseAndReset(const wxTreeItemId& item) = 0; + // toggles the current state + virtual void Toggle(const wxTreeItemId& item) = 0; + + // remove the selection from currently selected item (if any) + virtual void Unselect() = 0; + // unselect all items (only makes sense for multiple selection control) + virtual void UnselectAll() = 0; + // select this item + virtual void SelectItem(const wxTreeItemId& item, bool select = true) = 0; + // unselect this item + void UnselectItem(const wxTreeItemId& item) { SelectItem(item, false); } + // toggle item selection + void ToggleItemSelection(const wxTreeItemId& item) + { + SelectItem(item, !IsSelected(item)); + } + + // make sure this item is visible (expanding the parent item and/or + // scrolling to this item if necessary) + virtual void EnsureVisible(const wxTreeItemId& item) = 0; + // scroll to this item (but don't expand its parent) + virtual void ScrollTo(const wxTreeItemId& item) = 0; + + // start editing the item label: this (temporarily) replaces the item + // with a one line edit control. The item will be selected if it hadn't + // been before. textCtrlClass parameter allows you to create an edit + // control of arbitrary user-defined class deriving from wxTextCtrl. + virtual wxTextCtrl *EditLabel(const wxTreeItemId& item, + wxClassInfo* textCtrlClass = CLASSINFO(wxTextCtrl)) = 0; + // returns the same pointer as StartEdit() if the item is being edited, + // NULL otherwise (it's assumed that no more than one item may be + // edited simultaneously) + virtual wxTextCtrl *GetEditControl() const = 0; + // end editing and accept or discard the changes to item label + virtual void EndEditLabel(const wxTreeItemId& item, + bool discardChanges = false) = 0; + + // sorting + // ------- + + // this function is called to compare 2 items and should return -1, 0 + // or +1 if the first item is less than, equal to or greater than the + // second one. The base class version performs alphabetic comparaison + // of item labels (GetText) + virtual int OnCompareItems(const wxTreeItemId& item1, + const wxTreeItemId& item2) + { + return wxStrcmp(GetItemText(item1), GetItemText(item2)); + } + + // sort the children of this item using OnCompareItems + // + // NB: this function is not reentrant and not MT-safe (FIXME)! + virtual void SortChildren(const wxTreeItemId& item) = 0; + + // items geometry + // -------------- + + // determine to which item (if any) belongs the given point (the + // coordinates specified are relative to the client area of tree ctrl) + // and, in the second variant, fill the flags parameter with a bitmask + // of wxTREE_HITTEST_xxx constants. + wxTreeItemId HitTest(const wxPoint& point) const + { int dummy; return DoTreeHitTest(point, dummy); } + wxTreeItemId HitTest(const wxPoint& point, int& flags) const + { return DoTreeHitTest(point, flags); } + + // get the bounding rectangle of the item (or of its label only) + virtual bool GetBoundingRect(const wxTreeItemId& item, + wxRect& rect, + bool textOnly = false) const = 0; + + + // implementation + // -------------- + + virtual bool ShouldInheritColours() const { return false; } + + // hint whether to calculate best size quickly or accurately + void SetQuickBestSize(bool q) { m_quickBestSize = q; } + bool GetQuickBestSize() const { return m_quickBestSize; } + +protected: + virtual wxSize DoGetBestSize() const; + + // common part of Append/Prepend/InsertItem() + // + // pos is the position at which to insert the item or (size_t)-1 to append + // it to the end + virtual wxTreeItemId DoInsertItem(const wxTreeItemId& parent, + size_t pos, + const wxString& text, + int image, int selImage, + wxTreeItemData *data) = 0; + + // and this function implements overloaded InsertItem() taking wxTreeItemId + // (it can't be called InsertItem() as we'd have virtual function hiding + // problem in derived classes then) + virtual wxTreeItemId DoInsertAfter(const wxTreeItemId& parent, + const wxTreeItemId& idPrevious, + const wxString& text, + int image = -1, int selImage = -1, + wxTreeItemData *data = NULL) = 0; + + // real HitTest() implementation: again, can't be called just HitTest() + // because it's overloaded and so the non-virtual overload would be hidden + // (and can't be called DoHitTest() because this is already in wxWindow) + virtual wxTreeItemId DoTreeHitTest(const wxPoint& point, + int& flags) const = 0; + + + wxImageList *m_imageListNormal, // images for tree elements + *m_imageListState; // special images for app defined states + bool m_ownsImageListNormal, + m_ownsImageListState; + + // spacing between left border and the text + unsigned int m_spacing; + + // whether full or quick calculation is done in DoGetBestSize + bool m_quickBestSize; + + + DECLARE_NO_COPY_CLASS(wxTreeCtrlBase) +}; + +// ---------------------------------------------------------------------------- +// include the platform-dependent wxTreeCtrl class +// ---------------------------------------------------------------------------- + +#if defined(__WXUNIVERSAL__) + #include "wx/generic/treectlg.h" +#elif defined(__WXPALMOS__) + #include "wx/palmos/treectrl.h" +#elif defined(__WXMSW__) + #include "wx/msw/treectrl.h" +#elif defined(__WXMOTIF__) + #include "wx/generic/treectlg.h" +#elif defined(__WXGTK__) + #include "wx/generic/treectlg.h" +#elif defined(__WXMAC__) + #include "wx/generic/treectlg.h" +#elif defined(__WXCOCOA__) + #include "wx/generic/treectlg.h" +#elif defined(__WXPM__) + #include "wx/generic/treectlg.h" +#endif + +#endif // wxUSE_TREECTRL + +#endif // _WX_TREECTRL_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/txtstrm.h b/Externals/wxWidgets/include/wx/txtstrm.h new file mode 100644 index 0000000000..1054811009 --- /dev/null +++ b/Externals/wxWidgets/include/wx/txtstrm.h @@ -0,0 +1,160 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/txtstrm.h +// Purpose: Text stream classes +// Author: Guilhem Lavaux +// Modified by: +// Created: 28/06/1998 +// RCS-ID: $Id: txtstrm.h 38717 2006-04-14 17:01:16Z ABX $ +// Copyright: (c) Guilhem Lavaux +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_TXTSTREAM_H_ +#define _WX_TXTSTREAM_H_ + +#include "wx/stream.h" +#include "wx/convauto.h" + +#if wxUSE_STREAMS + +class WXDLLIMPEXP_BASE wxTextInputStream; +class WXDLLIMPEXP_BASE wxTextOutputStream; + +typedef wxTextInputStream& (*__wxTextInputManip)(wxTextInputStream&); +typedef wxTextOutputStream& (*__wxTextOutputManip)(wxTextOutputStream&); + +WXDLLIMPEXP_BASE wxTextOutputStream &endl( wxTextOutputStream &stream ); + + +#define wxEOT wxT('\4') // the End-Of-Text control code (used only inside wxTextInputStream) + +// If you're scanning through a file using wxTextInputStream, you should check for EOF _before_ +// reading the next item (word / number), because otherwise the last item may get lost. +// You should however be prepared to receive an empty item (empty string / zero number) at the +// end of file, especially on Windows systems. This is unavoidable because most (but not all) files end +// with whitespace (i.e. usually a newline). +class WXDLLIMPEXP_BASE wxTextInputStream +{ +public: +#if wxUSE_UNICODE + wxTextInputStream(wxInputStream& s, + const wxString &sep=wxT(" \t"), + const wxMBConv& conv = wxConvAuto()); +#else + wxTextInputStream(wxInputStream& s, const wxString &sep=wxT(" \t")); +#endif + ~wxTextInputStream(); + + wxUint32 Read32(int base = 10); // base may be between 2 and 36, inclusive, or the special 0 (= C format) + wxUint16 Read16(int base = 10); + wxUint8 Read8(int base = 10); + wxInt32 Read32S(int base = 10); + wxInt16 Read16S(int base = 10); + wxInt8 Read8S(int base = 10); + double ReadDouble(); + wxString ReadLine(); + wxString ReadWord(); + wxChar GetChar() { wxChar c = NextChar(); return (wxChar)(c != wxEOT ? c : 0); } + + wxString GetStringSeparators() const { return m_separators; } + void SetStringSeparators(const wxString &c) { m_separators = c; } + + // Operators + wxTextInputStream& operator>>(wxString& word); + wxTextInputStream& operator>>(char& c); +#if wxUSE_UNICODE && wxWCHAR_T_IS_REAL_TYPE + wxTextInputStream& operator>>(wchar_t& wc); +#endif // wxUSE_UNICODE + wxTextInputStream& operator>>(wxInt16& i); + wxTextInputStream& operator>>(wxInt32& i); + wxTextInputStream& operator>>(wxUint16& i); + wxTextInputStream& operator>>(wxUint32& i); + wxTextInputStream& operator>>(double& i); + wxTextInputStream& operator>>(float& f); + + wxTextInputStream& operator>>( __wxTextInputManip func) { return func(*this); } + +#if WXWIN_COMPATIBILITY_2_6 + wxDEPRECATED( wxString ReadString() ); // use ReadLine or ReadWord instead +#endif // WXWIN_COMPATIBILITY_2_6 + +protected: + wxInputStream &m_input; + wxString m_separators; + char m_lastBytes[10]; // stores the bytes that were read for the last character + +#if wxUSE_UNICODE + wxMBConv *m_conv; +#endif + + bool EatEOL(const wxChar &c); + void UngetLast(); // should be used instead of wxInputStream::Ungetch() because of Unicode issues + // returns EOT (\4) if there is a stream error, or end of file + wxChar NextChar(); // this should be used instead of GetC() because of Unicode issues + wxChar NextNonSeparators(); + + DECLARE_NO_COPY_CLASS(wxTextInputStream) +}; + +typedef enum +{ + wxEOL_NATIVE, + wxEOL_UNIX, + wxEOL_MAC, + wxEOL_DOS +} wxEOL; + +class WXDLLIMPEXP_BASE wxTextOutputStream +{ +public: +#if wxUSE_UNICODE + wxTextOutputStream(wxOutputStream& s, + wxEOL mode = wxEOL_NATIVE, + const wxMBConv& conv = wxConvAuto()); +#else + wxTextOutputStream(wxOutputStream& s, wxEOL mode = wxEOL_NATIVE); +#endif + virtual ~wxTextOutputStream(); + + void SetMode( wxEOL mode = wxEOL_NATIVE ); + wxEOL GetMode() { return m_mode; } + + void Write32(wxUint32 i); + void Write16(wxUint16 i); + void Write8(wxUint8 i); + virtual void WriteDouble(double d); + virtual void WriteString(const wxString& string); + + wxTextOutputStream& PutChar(wxChar c); + + wxTextOutputStream& operator<<(const wxChar *string); + wxTextOutputStream& operator<<(const wxString& string); + wxTextOutputStream& operator<<(char c); +#if wxUSE_UNICODE && wxWCHAR_T_IS_REAL_TYPE + wxTextOutputStream& operator<<(wchar_t wc); +#endif // wxUSE_UNICODE + wxTextOutputStream& operator<<(wxInt16 c); + wxTextOutputStream& operator<<(wxInt32 c); + wxTextOutputStream& operator<<(wxUint16 c); + wxTextOutputStream& operator<<(wxUint32 c); + wxTextOutputStream& operator<<(double f); + wxTextOutputStream& operator<<(float f); + + wxTextOutputStream& operator<<( __wxTextOutputManip func) { return func(*this); } + +protected: + wxOutputStream &m_output; + wxEOL m_mode; + +#if wxUSE_UNICODE + wxMBConv *m_conv; +#endif + + DECLARE_NO_COPY_CLASS(wxTextOutputStream) +}; + +#endif + // wxUSE_STREAMS + +#endif + // _WX_DATSTREAM_H_ diff --git a/Externals/wxWidgets/include/wx/types.h b/Externals/wxWidgets/include/wx/types.h new file mode 100644 index 0000000000..6876168eec --- /dev/null +++ b/Externals/wxWidgets/include/wx/types.h @@ -0,0 +1,93 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: types.h +// Purpose: Type identifiers, used by resource system +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: types.h 35650 2005-09-23 12:56:45Z MR $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_TYPESH__ +#define _WX_TYPESH__ + +// Types of objects +#define wxTYPE_ANY 0 +#define wxTYPE_OBJECT wxTYPE_ANY +#define wxTYPE_WINDOW 1 +#define wxTYPE_DIALOG_BOX 2 +#define wxTYPE_ITEM 3 +#define wxTYPE_PANEL 4 +#define wxTYPE_CANVAS 5 +#define wxTYPE_TEXT_WINDOW 6 +#define wxTYPE_FRAME 7 + +#define wxTYPE_BUTTON 8 +#define wxTYPE_TEXT 9 +#define wxTYPE_MESSAGE 10 +#define wxTYPE_CHOICE 11 +#define wxTYPE_LIST_BOX 12 +#define wxTYPE_SLIDER 13 +#define wxTYPE_CHECK_BOX 14 +#define wxTYPE_MENU 15 +#define wxTYPE_MENU_BAR 16 +#define wxTYPE_MULTI_TEXT 17 +#define wxTYPE_RADIO_BOX 18 +#define wxTYPE_GROUP_BOX 19 +#define wxTYPE_GAUGE 20 +#define wxTYPE_SCROLL_BAR 21 +#define wxTYPE_VIRT_LIST_BOX 22 +#define wxTYPE_COMBO_BOX 23 +#define wxTYPE_RADIO_BUTTON 24 + +#define wxTYPE_EVENT 25 +#define wxTYPE_DC 26 +#define wxTYPE_DC_CANVAS 27 +#define wxTYPE_DC_POSTSCRIPT 28 +#define wxTYPE_DC_PRINTER 29 +#define wxTYPE_DC_METAFILE 30 +#define wxTYPE_DC_MEMORY 31 +#define wxTYPE_MOUSE_EVENT 32 +#define wxTYPE_KEY_EVENT 33 +#define wxTYPE_COMMAND_EVENT 34 +#define wxTYPE_DC_PANEL 35 + +#define wxTYPE_PEN 40 +#define wxTYPE_BRUSH 41 +#define wxTYPE_FONT 42 +#define wxTYPE_ICON 42 +#define wxTYPE_BITMAP 43 +#define wxTYPE_METAFILE 44 +#define wxTYPE_TIMER 45 +#define wxTYPE_COLOUR 46 +#define wxTYPE_COLOURMAP 47 +#define wxTYPE_CURSOR 48 + +#define wxTYPE_DDE_CLIENT 60 +#define wxTYPE_DDE_SERVER 61 +#define wxTYPE_DDE_CONNECTION 62 + +#define wxTYPE_HELP_INSTANCE 63 + +#define wxTYPE_LIST 70 +#define wxTYPE_STRING_LIST 71 +#define wxTYPE_HASH_TABLE 72 +#define wxTYPE_NODE 73 +#define wxTYPE_APP 74 +#define wxTYPE_DATE 75 + +#define wxTYPE_ENHANCED_DIALOG 80 +#define wxTYPE_TOOLBAR 81 +#define wxTYPE_BUTTONBAR 82 + +#define wxTYPE_DATABASE 90 +#define wxTYPE_QUERY_FIELD 91 +#define wxTYPE_QUERY_COL 92 +#define wxTYPE_RECORDSET 93 + +#define wxTYPE_USER 500 + +#endif + // _WX_TYPESH__ + diff --git a/Externals/wxWidgets/include/wx/univ/app.h b/Externals/wxWidgets/include/wx/univ/app.h new file mode 100644 index 0000000000..fbd3c86d6e --- /dev/null +++ b/Externals/wxWidgets/include/wx/univ/app.h @@ -0,0 +1,21 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/univ/app.h +// Purpose: wxUniversalApp class extends wxApp for wxUniv port +// Author: Vadim Zeitlin +// Modified by: +// Created: 06.08.00 +// RCS-ID: $Id: app.h 27408 2004-05-23 20:53:33Z JS $ +// Copyright: (c) 2000 SciTech Software, Inc. (www.scitechsoft.com) +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIX_APP_H_ +#define _WX_UNIX_APP_H_ + +class WXDLLEXPORT wxUniversalApp : public wxApp +{ +public: +}; + +#endif // _WX_UNIX_APP_H_ + diff --git a/Externals/wxWidgets/include/wx/univ/bmpbuttn.h b/Externals/wxWidgets/include/wx/univ/bmpbuttn.h new file mode 100644 index 0000000000..e96e9e60f0 --- /dev/null +++ b/Externals/wxWidgets/include/wx/univ/bmpbuttn.h @@ -0,0 +1,72 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/univ/bmpbuttn.h +// Purpose: wxBitmapButton class for wxUniversal +// Author: Vadim Zeitlin +// Modified by: +// Created: 25.08.00 +// RCS-ID: $Id: bmpbuttn.h 35650 2005-09-23 12:56:45Z MR $ +// Copyright: (c) Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIV_BMPBUTTN_H_ +#define _WX_UNIV_BMPBUTTN_H_ + +class WXDLLEXPORT wxBitmapButton : public wxBitmapButtonBase +{ +public: + wxBitmapButton() { } + + wxBitmapButton(wxWindow *parent, + wxWindowID id, + const wxBitmap& bitmap, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxButtonNameStr) + { + Create(parent, id, bitmap, pos, size, style, validator, name); + } + + bool Create(wxWindow *parent, + wxWindowID id, + const wxBitmap& bitmap, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxButtonNameStr); + + virtual void SetMargins(int x, int y) + { + SetImageMargins(x, y); + + wxBitmapButtonBase::SetMargins(x, y); + } + + virtual bool Enable(bool enable = true); + + virtual bool SetCurrent(bool doit = true); + + virtual void Press(); + virtual void Release(); + +protected: + void OnSetFocus(wxFocusEvent& event); + void OnKillFocus(wxFocusEvent& event); + + // called when one of the bitmap is changed by user + virtual void OnSetBitmap(); + + // set bitmap to the given one if it's ok or to m_bmpNormal and return + // true if the bitmap really changed + bool ChangeBitmap(const wxBitmap& bmp); + +private: + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS(wxBitmapButton) +}; + +#endif // _WX_UNIV_BMPBUTTN_H_ + diff --git a/Externals/wxWidgets/include/wx/univ/button.h b/Externals/wxWidgets/include/wx/univ/button.h new file mode 100644 index 0000000000..2347364888 --- /dev/null +++ b/Externals/wxWidgets/include/wx/univ/button.h @@ -0,0 +1,139 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/univ/button.h +// Purpose: wxButton for wxUniversal +// Author: Vadim Zeitlin +// Modified by: +// Created: 15.08.00 +// RCS-ID: $Id: button.h 41227 2006-09-14 19:36:47Z VZ $ +// Copyright: (c) 2000 SciTech Software, Inc. (www.scitechsoft.com) +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIV_BUTTON_H_ +#define _WX_UNIV_BUTTON_H_ + +class WXDLLEXPORT wxInputHandler; + +#include "wx/bitmap.h" + +// ---------------------------------------------------------------------------- +// the actions supported by this control +// ---------------------------------------------------------------------------- + +#define wxACTION_BUTTON_TOGGLE _T("toggle") // press/release the button +#define wxACTION_BUTTON_PRESS _T("press") // press the button +#define wxACTION_BUTTON_RELEASE _T("release") // release the button +#define wxACTION_BUTTON_CLICK _T("click") // generate button click event + +// ---------------------------------------------------------------------------- +// wxButton: a push button +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxButton : public wxButtonBase +{ +public: + wxButton() { Init(); } + wxButton(wxWindow *parent, + wxWindowID id, + const wxBitmap& bitmap, + const wxString& label = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxButtonNameStr) + { + Init(); + + Create(parent, id, bitmap, label, pos, size, style, validator, name); + } + + wxButton(wxWindow *parent, + wxWindowID id, + const wxString& label = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxButtonNameStr) + { + Init(); + + Create(parent, id, label, pos, size, style, validator, name); + } + + bool Create(wxWindow *parent, + wxWindowID id, + const wxString& label = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxButtonNameStr) + { + return Create(parent, id, wxNullBitmap, label, + pos, size, style, validator, name); + } + + bool Create(wxWindow *parent, + wxWindowID id, + const wxBitmap& bitmap, + const wxString& label = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxButtonNameStr); + + virtual ~wxButton(); + + virtual void SetImageLabel(const wxBitmap& bitmap); + virtual void SetImageMargins(wxCoord x, wxCoord y); + virtual void SetDefault(); + + virtual bool IsPressed() const { return m_isPressed; } + virtual bool IsDefault() const { return m_isDefault; } + + // wxButton actions + virtual void Toggle(); + virtual void Press(); + virtual void Release(); + virtual void Click(); + + virtual bool PerformAction(const wxControlAction& action, + long numArg = -1, + const wxString& strArg = wxEmptyString); + + virtual bool CanBeHighlighted() const { return true; } + + static wxInputHandler *GetStdInputHandler(wxInputHandler *handlerDef); + virtual wxInputHandler *DoGetStdInputHandler(wxInputHandler *handlerDef) + { + return GetStdInputHandler(handlerDef); + } + + +protected: + virtual wxSize DoGetBestClientSize() const; + + virtual bool DoDrawBackground(wxDC& dc); + virtual void DoDraw(wxControlRenderer *renderer); + + // common part of all ctors + void Init(); + + // current state + bool m_isPressed, + m_isDefault; + + // the (optional) image to show and the margins around it + wxBitmap m_bitmap; + wxCoord m_marginBmpX, + m_marginBmpY; + +private: + DECLARE_DYNAMIC_CLASS(wxButton) +}; + +#endif // _WX_UNIV_BUTTON_H_ + diff --git a/Externals/wxWidgets/include/wx/univ/checkbox.h b/Externals/wxWidgets/include/wx/univ/checkbox.h new file mode 100644 index 0000000000..682e1968f3 --- /dev/null +++ b/Externals/wxWidgets/include/wx/univ/checkbox.h @@ -0,0 +1,150 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/univ/checkbox.h +// Purpose: wxCheckBox declaration +// Author: Vadim Zeitlin +// Modified by: +// Created: 07.09.00 +// RCS-ID: $Id: checkbox.h 41227 2006-09-14 19:36:47Z VZ $ +// Copyright: (c) 2000 SciTech Software, Inc. (www.scitechsoft.com) +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIV_CHECKBOX_H_ +#define _WX_UNIV_CHECKBOX_H_ + +#include "wx/button.h" // for wxStdButtonInputHandler + +// ---------------------------------------------------------------------------- +// the actions supported by wxCheckBox +// ---------------------------------------------------------------------------- + +#define wxACTION_CHECKBOX_CHECK _T("check") // SetValue(true) +#define wxACTION_CHECKBOX_CLEAR _T("clear") // SetValue(false) +#define wxACTION_CHECKBOX_TOGGLE _T("toggle") // toggle the check state + +// additionally it accepts wxACTION_BUTTON_PRESS and RELEASE + +// ---------------------------------------------------------------------------- +// wxCheckBox +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxCheckBox : public wxCheckBoxBase +{ +public: + // checkbox constants + enum State + { + State_Normal, + State_Pressed, + State_Disabled, + State_Current, + State_Max + }; + + enum Status + { + Status_Checked, + Status_Unchecked, + Status_3rdState, + Status_Max + }; + + // constructors + wxCheckBox() { Init(); } + + wxCheckBox(wxWindow *parent, + wxWindowID id, + const wxString& label, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxCheckBoxNameStr) + { + Init(); + + Create(parent, id, label, pos, size, style, validator, name); + } + + bool Create(wxWindow *parent, + wxWindowID id, + const wxString& label, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxCheckBoxNameStr); + + // implement the checkbox interface + virtual void SetValue(bool value); + virtual bool GetValue() const; + + // set/get the bitmaps to use for the checkbox indicator + void SetBitmap(const wxBitmap& bmp, State state, Status status); + virtual wxBitmap GetBitmap(State state, Status status) const; + + // wxCheckBox actions + void Toggle(); + virtual void Press(); + virtual void Release(); + virtual void ChangeValue(bool value); + + // overridden base class virtuals + virtual bool IsPressed() const { return m_isPressed; } + + virtual bool PerformAction(const wxControlAction& action, + long numArg = -1, + const wxString& strArg = wxEmptyString); + + virtual bool CanBeHighlighted() const { return true; } + virtual wxInputHandler *CreateStdInputHandler(wxInputHandler *handlerDef); + virtual wxInputHandler *DoGetStdInputHandler(wxInputHandler *handlerDef) + { + return CreateStdInputHandler(handlerDef); + } + +protected: + virtual void DoSet3StateValue(wxCheckBoxState WXUNUSED(state)); + virtual wxCheckBoxState DoGet3StateValue() const; + + virtual void DoDraw(wxControlRenderer *renderer); + virtual wxSize DoGetBestClientSize() const; + + // get the size of the bitmap using either the current one or the default + // one (query renderer then) + virtual wxSize GetBitmapSize() const; + + // common part of all ctors + void Init(); + + // send command event notifying about the checkbox state change + virtual void SendEvent(); + + // called when the checkbox becomes checked - radio button hook + virtual void OnCheck(); + + // get the state corresponding to the flags (combination of wxCONTROL_XXX) + wxCheckBox::State GetState(int flags) const; + + // directly access the bitmaps array without trying to find a valid bitmap + // to use as GetBitmap() does + wxBitmap DoGetBitmap(State state, Status status) const + { return m_bitmaps[state][status]; } + + // get the current status + Status GetStatus() const { return m_status; } + +private: + // the current check status + Status m_status; + + // the bitmaps to use for the different states + wxBitmap m_bitmaps[State_Max][Status_Max]; + + // is the checkbox currently pressed? + bool m_isPressed; + + DECLARE_DYNAMIC_CLASS(wxCheckBox) +}; + +#endif // _WX_UNIV_CHECKBOX_H_ diff --git a/Externals/wxWidgets/include/wx/univ/checklst.h b/Externals/wxWidgets/include/wx/univ/checklst.h new file mode 100644 index 0000000000..67343c8ec2 --- /dev/null +++ b/Externals/wxWidgets/include/wx/univ/checklst.h @@ -0,0 +1,114 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/univ/checklst.h +// Purpose: wxCheckListBox class for wxUniversal +// Author: Vadim Zeitlin +// Modified by: +// Created: 12.09.00 +// RCS-ID: $Id: checklst.h 41227 2006-09-14 19:36:47Z VZ $ +// Copyright: (c) Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIV_CHECKLST_H_ +#define _WX_UNIV_CHECKLST_H_ + +// ---------------------------------------------------------------------------- +// actions +// ---------------------------------------------------------------------------- + +#define wxACTION_CHECKLISTBOX_TOGGLE _T("toggle") + +// ---------------------------------------------------------------------------- +// wxCheckListBox +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxCheckListBox : public wxCheckListBoxBase +{ +public: + // ctors + wxCheckListBox() { Init(); } + + wxCheckListBox(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + int nStrings = 0, + const wxString choices[] = NULL, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxListBoxNameStr) + { + Init(); + + Create(parent, id, pos, size, nStrings, choices, style, validator, name); + } + wxCheckListBox(wxWindow *parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + const wxArrayString& choices, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxListBoxNameStr); + + bool Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + int nStrings = 0, + const wxString choices[] = (const wxString *) NULL, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxListBoxNameStr); + bool Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + const wxArrayString& choices, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxListBoxNameStr); + + // implement check list box methods + virtual bool IsChecked(unsigned int item) const; + virtual void Check(unsigned int item, bool check = true); + + // and input handling + virtual bool PerformAction(const wxControlAction& action, + long numArg = -1l, + const wxString& strArg = wxEmptyString); + + static wxInputHandler *GetStdInputHandler(wxInputHandler *handlerDef); + virtual wxInputHandler *DoGetStdInputHandler(wxInputHandler *handlerDef) + { + return GetStdInputHandler(handlerDef); + } + + // override all methods which add/delete items to update m_checks array as + // well + virtual void Delete(unsigned int n); + +protected: + virtual int DoAppend(const wxString& item); + virtual void DoInsertItems(const wxArrayString& items, unsigned int pos); + virtual void DoSetItems(const wxArrayString& items, void **clientData); + virtual void DoClear(); + + // draw the check items instead of the usual ones + virtual void DoDrawRange(wxControlRenderer *renderer, + int itemFirst, int itemLast); + + // take them also into account for size calculation + virtual wxSize DoGetBestClientSize() const; + + // common part of all ctors + void Init(); + +private: + // the array containing the checked status of the items + wxArrayInt m_checks; + + DECLARE_DYNAMIC_CLASS(wxCheckListBox) +}; + +#endif // _WX_UNIV_CHECKLST_H_ diff --git a/Externals/wxWidgets/include/wx/univ/chkconf.h b/Externals/wxWidgets/include/wx/univ/chkconf.h new file mode 100644 index 0000000000..6a4e2e7208 --- /dev/null +++ b/Externals/wxWidgets/include/wx/univ/chkconf.h @@ -0,0 +1,117 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/univ/chkconf.h +// Purpose: wxUniversal-specific configuration options checks +// Author: Vadim Zeitlin +// Created: 2006-09-28 (extracted from wx/chkconf.h) +// RCS-ID: $Id: chkconf.h 41494 2006-09-28 22:55:28Z VZ $ +// Copyright: (c) 2006 Vadim Zeitlin <vadim@wxwindows.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIV_CHKCONF_H_ +#define _WX_UNIV_CHKCONF_H_ + +#if (wxUSE_COMBOBOX || wxUSE_MENUS) && !wxUSE_POPUPWIN +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_POPUPWIN must be defined to use comboboxes/menus" +# else +# undef wxUSE_POPUPWIN +# define wxUSE_POPUPWIN 1 +# endif +#endif + +#if wxUSE_COMBOBOX +# if !wxUSE_LISTBOX +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxComboBox requires wxListBox in wxUniversal" +# else +# undef wxUSE_LISTBOX +# define wxUSE_LISTBOX 1 +# endif +# endif +#endif /* wxUSE_COMBOBOX */ + +#if wxUSE_RADIOBTN +# if !wxUSE_CHECKBOX +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_RADIOBTN requires wxUSE_CHECKBOX in wxUniversal" +# else +# undef wxUSE_CHECKBOX +# define wxUSE_CHECKBOX 1 +# endif +# endif +#endif /* wxUSE_RADIOBTN */ + +#if wxUSE_TEXTCTRL +# if !wxUSE_CARET +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxTextCtrl requires wxCaret in wxUniversal" +# else +# undef wxUSE_CARET +# define wxUSE_CARET 1 +# endif +# endif /* wxUSE_CARET */ + +# if !wxUSE_SCROLLBAR +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxTextCtrl requires wxScrollBar in wxUniversal" +# else +# undef wxUSE_SCROLLBAR +# define wxUSE_SCROLLBAR 1 +# endif +# endif /* wxUSE_SCROLLBAR */ +#endif /* wxUSE_TEXTCTRL */ + + +/* Themes checks */ +#ifndef wxUSE_ALL_THEMES +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_ALL_THEMES must be defined" +# else +# define wxUSE_ALL_THEMES 1 +# endif +#endif /* wxUSE_ALL_THEMES */ + +#ifndef wxUSE_THEME_GTK +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_THEME_GTK must be defined" +# else +# define wxUSE_THEME_GTK 1 +# endif +#endif /* wxUSE_THEME_GTK */ + +#ifndef wxUSE_THEME_METAL +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_THEME_METAL must be defined" +# else +# define wxUSE_THEME_METAL 1 +# endif +#endif /* wxUSE_THEME_METAL */ + +#ifndef wxUSE_THEME_MONO +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_THEME_MONO must be defined" +# else +# define wxUSE_THEME_MONO 1 +# endif +#endif /* wxUSE_THEME_MONO */ + +#ifndef wxUSE_THEME_WIN32 +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_THEME_WIN32 must be defined" +# else +# define wxUSE_THEME_WIN32 1 +# endif +#endif /* wxUSE_THEME_WIN32 */ + +#if !wxUSE_ALL_THEMES && wxUSE_THEME_METAL && !wxUSE_THEME_WIN32 +# ifdef wxABORT_ON_CONFIG_ERROR +# error "Metal theme requires Win32 one" +# else +# undef wxUSE_THEME_WIN32 +# define wxUSE_THEME_WIN32 1 +# endif +#endif /* wxUSE_THEME_METAL && !wxUSE_THEME_WIN32 */ + +#endif /* _WX_UNIV_CHKCONF_H_ */ + diff --git a/Externals/wxWidgets/include/wx/univ/choice.h b/Externals/wxWidgets/include/wx/univ/choice.h new file mode 100644 index 0000000000..86627889e2 --- /dev/null +++ b/Externals/wxWidgets/include/wx/univ/choice.h @@ -0,0 +1,64 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/univ/choice.h +// Purpose: the universal choice +// Author: Vadim Zeitlin +// Modified by: +// Created: 30.08.00 +// RCS-ID: $Id: choice.h 35650 2005-09-23 12:56:45Z MR $ +// Copyright: (c) 2000 SciTech Software, Inc. (www.scitechsoft.com) +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIV_CHOICE_H_ +#define _WX_UNIV_CHOICE_H_ + +#include "wx/combobox.h" + +// VS: This is only a *temporary* implementation, real wxChoice should not +// derive from wxComboBox and may have different l&f +class WXDLLEXPORT wxChoice : public wxComboBox +{ +public: + wxChoice() {} + wxChoice(wxWindow *parent, wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + int n = 0, const wxString choices[] = (const wxString *) NULL, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxChoiceNameStr) + { + Create(parent, id, pos, size, n, choices, style, validator, name); + } + wxChoice(wxWindow *parent, wxWindowID id, + const wxPoint& pos, + const wxSize& size, + const wxArrayString& choices, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxChoiceNameStr); + + bool Create(wxWindow *parent, wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + int n = 0, const wxString choices[] = (wxString *) NULL, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxChoiceNameStr); + bool Create(wxWindow *parent, wxWindowID id, + const wxPoint& pos, + const wxSize& size, + const wxArrayString& choices, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxChoiceNameStr); + +private: + void OnComboBox(wxCommandEvent &event); + + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS(wxChoice) +}; + + +#endif // _WX_UNIV_CHOICE_H_ diff --git a/Externals/wxWidgets/include/wx/univ/colschem.h b/Externals/wxWidgets/include/wx/univ/colschem.h new file mode 100644 index 0000000000..2a566dcdbe --- /dev/null +++ b/Externals/wxWidgets/include/wx/univ/colschem.h @@ -0,0 +1,103 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/univ/colschem.h +// Purpose: wxColourScheme class provides the colours to use for drawing +// Author: Vadim Zeitlin +// Modified by: +// Created: 19.08.00 +// RCS-ID: $Id: colschem.h 44058 2006-12-24 19:06:39Z VS $ +// Copyright: (c) 2000 SciTech Software, Inc. (www.scitechsoft.com) +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIV_COLSCHEM_H_ +#define _WX_UNIV_COLSCHEM_H_ + +class WXDLLEXPORT wxWindow; + +#include "wx/colour.h" +#include "wx/checkbox.h" + +// ---------------------------------------------------------------------------- +// wxColourScheme +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxColourScheme +{ +public: + // the standard colours + enum StdColour + { + // the background colour for a window + WINDOW, + + // the different background and text colours for the control + CONTROL, + CONTROL_PRESSED, + CONTROL_CURRENT, + + // the label text for the normal and the disabled state + CONTROL_TEXT, + CONTROL_TEXT_DISABLED, + CONTROL_TEXT_DISABLED_SHADOW, + + // the scrollbar background colour for the normal and pressed states + SCROLLBAR, + SCROLLBAR_PRESSED, + + // the background and text colour for the highlighted item + HIGHLIGHT, + HIGHLIGHT_TEXT, + + // these colours are used for drawing the shadows of 3D objects + SHADOW_DARK, + SHADOW_HIGHLIGHT, + SHADOW_IN, + SHADOW_OUT, + + // the titlebar background colours for the normal and focused states + TITLEBAR, + TITLEBAR_ACTIVE, + + // the titlebar text colours + TITLEBAR_TEXT, + TITLEBAR_ACTIVE_TEXT, + + // the default gauge fill colour + GAUGE, + + // desktop background colour (only used by framebuffer ports) + DESKTOP, + + // wxFrame's background colour + FRAME, + + MAX + }; + + // get a standard colour + virtual wxColour Get(StdColour col) const = 0; + + // get the background colour for the given window + virtual wxColour GetBackground(wxWindow *win) const = 0; + + // virtual dtor for any base class + virtual ~wxColourScheme(); +}; + +// some people just can't spell it correctly :-) +typedef wxColourScheme wxColorScheme; + +// ---------------------------------------------------------------------------- +// macros +// ---------------------------------------------------------------------------- + +// retrieve the default colour from the theme or the given scheme +#define wxSCHEME_COLOUR(scheme, what) scheme->Get(wxColorScheme::what) +#define wxTHEME_COLOUR(what) \ + wxSCHEME_COLOUR(wxTheme::Get()->GetColourScheme(), what) + +// get the background colour for the window in the current theme +#define wxTHEME_BG_COLOUR(win) \ + wxTheme::Get()->GetColourScheme()->GetBackground(win) + +#endif // _WX_UNIV_COLSCHEM_H_ diff --git a/Externals/wxWidgets/include/wx/univ/combobox.h b/Externals/wxWidgets/include/wx/univ/combobox.h new file mode 100644 index 0000000000..97864b1805 --- /dev/null +++ b/Externals/wxWidgets/include/wx/univ/combobox.h @@ -0,0 +1,167 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/univ/combobox.h +// Purpose: the universal combobox +// Author: Vadim Zeitlin +// Modified by: +// Created: 30.08.00 +// RCS-ID: $Id: combobox.h 41227 2006-09-14 19:36:47Z VZ $ +// Copyright: (c) 2000 SciTech Software, Inc. (www.scitechsoft.com) +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + + +#ifndef _WX_UNIV_COMBOBOX_H_ +#define _WX_UNIV_COMBOBOX_H_ + +#include "wx/combo.h" + +class WXDLLEXPORT wxListBox; + +// ---------------------------------------------------------------------------- +// NB: some actions supported by this control are in wx/generic/combo.h +// ---------------------------------------------------------------------------- + +// choose the next/prev/specified (by numArg) item +#define wxACTION_COMBOBOX_SELECT_NEXT _T("next") +#define wxACTION_COMBOBOX_SELECT_PREV _T("prev") +#define wxACTION_COMBOBOX_SELECT _T("select") + + +// ---------------------------------------------------------------------------- +// wxComboBox: a combination of text control and a listbox +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxComboBox : public wxComboCtrl, public wxComboBoxBase +{ +public: + // ctors and such + wxComboBox() { Init(); } + + wxComboBox(wxWindow *parent, + wxWindowID id, + const wxString& value = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + int n = 0, + const wxString choices[] = (const wxString *) NULL, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxComboBoxNameStr) + { + Init(); + + (void)Create(parent, id, value, pos, size, n, choices, + style, validator, name); + } + wxComboBox(wxWindow *parent, + wxWindowID id, + const wxString& value, + const wxPoint& pos, + const wxSize& size, + const wxArrayString& choices, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxComboBoxNameStr); + + bool Create(wxWindow *parent, + wxWindowID id, + const wxString& value = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + int n = 0, + const wxString choices[] = (const wxString *) NULL, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxComboBoxNameStr); + bool Create(wxWindow *parent, + wxWindowID id, + const wxString& value, + const wxPoint& pos, + const wxSize& size, + const wxArrayString& choices, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxComboBoxNameStr); + + virtual ~wxComboBox(); + + // the wxUniversal-specific methods + // -------------------------------- + + // implement the combobox interface + + // wxTextCtrl methods + virtual wxString GetValue() const; + virtual void SetValue(const wxString& value); + virtual void Copy(); + virtual void Cut(); + virtual void Paste(); + virtual void SetInsertionPoint(long pos); + virtual void SetInsertionPointEnd(); + virtual long GetInsertionPoint() const; + virtual wxTextPos GetLastPosition() const; + virtual void Replace(long from, long to, const wxString& value); + virtual void Remove(long from, long to); + virtual void SetSelection(long from, long to); + virtual void SetEditable(bool editable); + virtual bool IsEditable() const; + + virtual void Undo(); + virtual void Redo(); + virtual void SelectAll(); + + virtual bool CanCopy() const; + virtual bool CanCut() const; + virtual bool CanPaste() const; + virtual bool CanUndo() const; + virtual bool CanRedo() const; + + // wxControlWithItems methods + virtual void Clear(); + virtual void Delete(unsigned int n); + virtual unsigned int GetCount() const; + virtual wxString GetString(unsigned int n) const; + virtual void SetString(unsigned int n, const wxString& s); + virtual int FindString(const wxString& s, bool bCase = false) const; + virtual void SetSelection(int n); + virtual int GetSelection() const; + + wxCONTROL_ITEMCONTAINER_CLIENTDATAOBJECT_RECAST + + // we have our own input handler and our own actions + // (but wxComboCtrl already handled Popup/Dismiss) + /* + virtual bool PerformAction(const wxControlAction& action, + long numArg = 0l, + const wxString& strArg = wxEmptyString); + */ + + static wxInputHandler *GetStdInputHandler(wxInputHandler *handlerDef); + virtual wxInputHandler *DoGetStdInputHandler(wxInputHandler *handlerDef) + { + return GetStdInputHandler(handlerDef); + } + +protected: + virtual int DoAppend(const wxString& item); + virtual int DoInsert(const wxString& item, unsigned int pos); + virtual void DoSetItemClientData(unsigned int n, void* clientData); + virtual void* DoGetItemClientData(unsigned int n) const; + virtual void DoSetItemClientObject(unsigned int n, wxClientData* clientData); + virtual wxClientData* DoGetItemClientObject(unsigned int n) const; + + // common part of all ctors + void Init(); + + // get the associated listbox + wxListBox *GetLBox() const { return m_lbox; } + +private: + // the popup listbox + wxListBox *m_lbox; + + //DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS(wxComboBox) +}; + +#endif // _WX_UNIV_COMBOBOX_H_ diff --git a/Externals/wxWidgets/include/wx/univ/control.h b/Externals/wxWidgets/include/wx/univ/control.h new file mode 100644 index 0000000000..9cc4c0c5ae --- /dev/null +++ b/Externals/wxWidgets/include/wx/univ/control.h @@ -0,0 +1,102 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/univ/control.h +// Purpose: universal wxControl: adds handling of mnemonics +// Author: Vadim Zeitlin +// Modified by: +// Created: 14.08.00 +// RCS-ID: $Id: control.h 35650 2005-09-23 12:56:45Z MR $ +// Copyright: (c) 2000 SciTech Software, Inc. (www.scitechsoft.com) +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIV_CONTROL_H_ +#define _WX_UNIV_CONTROL_H_ + +class WXDLLEXPORT wxControlRenderer; +class WXDLLEXPORT wxInputHandler; +class WXDLLEXPORT wxRenderer; + +// we must include it as most/all control classes derive their handlers from +// it +#include "wx/univ/inphand.h" + +#include "wx/univ/inpcons.h" + +// ---------------------------------------------------------------------------- +// wxControlAction: the action is currently just a string which identifies it, +// later it might become an atom (i.e. an opaque handler to string). +// ---------------------------------------------------------------------------- + +typedef wxString wxControlAction; + +// the list of actions which apply to all controls (other actions are defined +// in the controls headers) + +#define wxACTION_NONE _T("") // no action to perform + +// ---------------------------------------------------------------------------- +// wxControl: the base class for all GUI controls +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxControl : public wxControlBase, public wxInputConsumer +{ +public: + wxControl() { Init(); } + + wxControl(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxControlNameStr) + { + Init(); + + Create(parent, id, pos, size, style, validator, name); + } + + bool Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxControlNameStr); + + // this function will filter out '&' characters and will put the + // accelerator char (the one immediately after '&') into m_chAccel + virtual void SetLabel(const wxString &label); + virtual wxString GetLabel() const; + + // wxUniversal-specific methods + + // return the accel index in the string or -1 if none and puts the modified + // string intosecond parameter if non NULL + static int FindAccelIndex(const wxString& label, + wxString *labelOnly = NULL); + + // return the index of the accel char in the label or -1 if none + int GetAccelIndex() const { return m_indexAccel; } + + // return the accel char itself or 0 if none + wxChar GetAccelChar() const + { + return m_indexAccel == -1 ? _T('\0') : m_label[m_indexAccel]; + } + + virtual wxWindow *GetInputWindow() const { return (wxWindow*)this; } + +protected: + // common part of all ctors + void Init(); + +private: + // label and accel info + wxString m_label; + int m_indexAccel; + + DECLARE_DYNAMIC_CLASS(wxControl) + DECLARE_EVENT_TABLE() + WX_DECLARE_INPUT_CONSUMER() +}; + +#endif // _WX_UNIV_CONTROL_H_ diff --git a/Externals/wxWidgets/include/wx/univ/dialog.h b/Externals/wxWidgets/include/wx/univ/dialog.h new file mode 100644 index 0000000000..e4b71b9ae8 --- /dev/null +++ b/Externals/wxWidgets/include/wx/univ/dialog.h @@ -0,0 +1,88 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: dialog.h +// Purpose: wxDialog class +// Author: Vaclav Slavik +// Created: 2001/09/16 +// RCS-ID: $Id: dialog.h 36891 2006-01-16 14:59:55Z MR $ +// Copyright: (c) 2001 SciTech Software, Inc. (www.scitechsoft.com) +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIV_DIALOG_H_ +#define _WX_UNIV_DIALOG_H_ + +extern WXDLLEXPORT_DATA(const wxChar) wxDialogNameStr[]; +class WXDLLEXPORT wxWindowDisabler; +class WXDLLEXPORT wxEventLoop; + +// Dialog boxes +class WXDLLEXPORT wxDialog : public wxDialogBase +{ +public: + wxDialog() { Init(); } + + // Constructor with no modal flag - the new convention. + wxDialog(wxWindow *parent, wxWindowID id, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDEFAULT_DIALOG_STYLE, + const wxString& name = wxDialogNameStr) + { + Init(); + Create(parent, id, title, pos, size, style, name); + } + + bool Create(wxWindow *parent, wxWindowID id, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDEFAULT_DIALOG_STYLE, + const wxString& name = wxDialogNameStr); + + virtual ~wxDialog(); + + // is the dialog in modal state right now? + virtual bool IsModal() const; + + // For now, same as Show(true) but returns return code + virtual int ShowModal(); + + // may be called to terminate the dialog with the given return code + virtual void EndModal(int retCode); + + // returns true if we're in a modal loop + bool IsModalShowing() const; + + virtual bool Show(bool show = true); + + // implementation only from now on + // ------------------------------- + + // event handlers + void OnCloseWindow(wxCloseEvent& event); + void OnOK(wxCommandEvent& event); + void OnApply(wxCommandEvent& event); + void OnCancel(wxCommandEvent& event); + +protected: + // common part of all ctors + void Init(); + +private: + // while we are showing a modal dialog we disable the other windows using + // this object + wxWindowDisabler *m_windowDisabler; + + // modal dialog runs its own event loop + wxEventLoop *m_eventLoop; + + // is modal right now? + bool m_isShowingModal; + + DECLARE_DYNAMIC_CLASS(wxDialog) + DECLARE_EVENT_TABLE() +}; + +#endif + // _WX_UNIV_DIALOG_H_ diff --git a/Externals/wxWidgets/include/wx/univ/frame.h b/Externals/wxWidgets/include/wx/univ/frame.h new file mode 100644 index 0000000000..41c226786d --- /dev/null +++ b/Externals/wxWidgets/include/wx/univ/frame.h @@ -0,0 +1,92 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/univ/frame.h +// Purpose: wxFrame class for wxUniversal +// Author: Vadim Zeitlin +// Modified by: +// Created: 19.05.01 +// RCS-ID: $Id: frame.h 42664 2006-10-29 20:39:31Z VZ $ +// Copyright: (c) 2001 SciTech Software, Inc. (www.scitechsoft.com) +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIV_FRAME_H_ +#define _WX_UNIV_FRAME_H_ + +// ---------------------------------------------------------------------------- +// wxFrame +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxFrame : public wxFrameBase +{ +public: + wxFrame() {} + wxFrame(wxWindow *parent, + wxWindowID id, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDEFAULT_FRAME_STYLE, + const wxString& name = wxFrameNameStr) + { + Create(parent, id, title, pos, size, style, name); + } + + bool Create(wxWindow *parent, + wxWindowID id, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDEFAULT_FRAME_STYLE, + const wxString& name = wxFrameNameStr); + + virtual wxPoint GetClientAreaOrigin() const; + virtual bool Enable(bool enable = true); + +#if wxUSE_STATUSBAR + virtual wxStatusBar* CreateStatusBar(int number = 1, + long style = wxST_SIZEGRIP, + wxWindowID id = 0, + const wxString& name = wxStatusLineNameStr); +#endif // wxUSE_STATUSBAR + +#if wxUSE_TOOLBAR + // create main toolbar bycalling OnCreateToolBar() + virtual wxToolBar* CreateToolBar(long style = -1, + wxWindowID id = wxID_ANY, + const wxString& name = wxToolBarNameStr); +#endif // wxUSE_TOOLBAR + + virtual wxSize GetMinSize() const; + + // sends wxSizeEvent to itself (used after attaching xxxBar) + virtual void SendSizeEvent(); + +protected: + void OnSize(wxSizeEvent& event); + void OnSysColourChanged(wxSysColourChangedEvent& event); + + virtual void DoGetClientSize(int *width, int *height) const; + virtual void DoSetClientSize(int width, int height); + +#if wxUSE_MENUS + // override to update menu bar position when the frame size changes + virtual void PositionMenuBar(); + virtual void DetachMenuBar(); + virtual void AttachMenuBar(wxMenuBar *menubar); +#endif // wxUSE_MENUS + +#if wxUSE_STATUSBAR + // override to update statusbar position when the frame size changes + virtual void PositionStatusBar(); +#endif // wxUSE_MENUS + +protected: +#if wxUSE_TOOLBAR + virtual void PositionToolBar(); +#endif // wxUSE_TOOLBAR + + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS(wxFrame) +}; + +#endif // _WX_UNIV_FRAME_H_ diff --git a/Externals/wxWidgets/include/wx/univ/gauge.h b/Externals/wxWidgets/include/wx/univ/gauge.h new file mode 100644 index 0000000000..0b69e2661d --- /dev/null +++ b/Externals/wxWidgets/include/wx/univ/gauge.h @@ -0,0 +1,75 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/univ/gauge.h +// Purpose: wxUniversal wxGauge declaration +// Author: Vadim Zeitlin +// Modified by: +// Created: 20.02.01 +// RCS-ID: $Id: gauge.h 35698 2005-09-25 20:49:40Z MW $ +// Copyright: (c) 2001 SciTech Software, Inc. (www.scitechsoft.com) +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIV_GAUGE_H_ +#define _WX_UNIV_GAUGE_H_ + +// ---------------------------------------------------------------------------- +// wxGauge: a progress bar +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxGauge : public wxGaugeBase +{ +public: + wxGauge() { Init(); } + + wxGauge(wxWindow *parent, + wxWindowID id, + int range, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxGA_HORIZONTAL, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxGaugeNameStr) + { + Init(); + + (void)Create(parent, id, range, pos, size, style, validator, name); + } + + bool Create(wxWindow *parent, + wxWindowID id, + int range, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxGA_HORIZONTAL, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxGaugeNameStr); + + // implement base class virtuals + virtual void SetRange(int range); + virtual void SetValue(int pos); + + // wxUniv-specific methods + + // is it a smooth progress bar or a discrete one? + bool IsSmooth() const { return (GetWindowStyle() & wxGA_SMOOTH) != 0; } + + // is it a vertica; progress bar or a horizontal one? + bool IsVertical() const { return (GetWindowStyle() & wxGA_VERTICAL) != 0; } + +protected: + // common part of all ctors + void Init(); + + // return the def border for a progress bar + virtual wxBorder GetDefaultBorder() const; + + // return the default size + virtual wxSize DoGetBestClientSize() const; + + // draw the control + virtual void DoDraw(wxControlRenderer *renderer); + + DECLARE_DYNAMIC_CLASS(wxGauge) +}; + +#endif // _WX_UNIV_GAUGE_H_ diff --git a/Externals/wxWidgets/include/wx/univ/inpcons.h b/Externals/wxWidgets/include/wx/univ/inpcons.h new file mode 100644 index 0000000000..757bad5274 --- /dev/null +++ b/Externals/wxWidgets/include/wx/univ/inpcons.h @@ -0,0 +1,153 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/univ/inpcons.h +// Purpose: wxInputConsumer: mix-in class for input handling +// Author: Vadim Zeitlin +// Modified by: +// Created: 14.08.00 +// RCS-ID: $Id: inpcons.h 41227 2006-09-14 19:36:47Z VZ $ +// Copyright: (c) 2000 SciTech Software, Inc. (www.scitechsoft.com) +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIV_INPCONS_H_ +#define _WX_UNIV_INPCONS_H_ + +class WXDLLEXPORT wxInputHandler; +class WXDLLEXPORT wxWindow; + +#include "wx/object.h" +#include "wx/event.h" + +// ---------------------------------------------------------------------------- +// wxControlAction: the action is currently just a string which identifies it, +// later it might become an atom (i.e. an opaque handler to string). +// ---------------------------------------------------------------------------- + +typedef wxString wxControlAction; + +// the list of actions which apply to all controls (other actions are defined +// in the controls headers) + +#define wxACTION_NONE _T("") // no action to perform + +// ---------------------------------------------------------------------------- +// wxInputConsumer: mix-in class for handling wxControlActions (used by +// wxControl and wxTopLevelWindow). +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxInputConsumer +{ +public: + wxInputConsumer() { m_inputHandler = NULL; } + virtual ~wxInputConsumer() { } + + // get the input handler + wxInputHandler *GetInputHandler() const { return m_inputHandler; } + + // perform a control-dependent action: an action may have an optional + // numeric and another (also optional) string argument whose interpretation + // depends on the action + // + // NB: we might use ellipsis in PerformAction() declaration but this + // wouldn't be more efficient than always passing 2 unused parameters + // but would be more difficult. Another solution would be to have + // several overloaded versions but this will expose the problem of + // virtual function hiding we don't have here. + virtual bool PerformAction(const wxControlAction& action, + long numArg = -1l, + const wxString& strArg = wxEmptyString); + + // get the window to work with (usually the class wxInputConsumer was mixed into) + virtual wxWindow *GetInputWindow() const = 0; + + // this function must be implemented in any classes process input (i.e. not + // static controls) to create the standard input handler for the concrete + // class deriving from this mix-in + // + // the parameter is the default input handler which should receive all + // unprocessed input (i.e. typically handlerDef is passed to + // wxStdInputHandler ctor) or it may be NULL + // + // the returned pointer will not be deleted by caller so it must either + // point to a static object or be deleted on program termination + virtual wxInputHandler *DoGetStdInputHandler(wxInputHandler *handlerDef); + + +protected: + // event handlers + void OnMouse(wxMouseEvent& event); + void OnKeyDown(wxKeyEvent& event); + void OnKeyUp(wxKeyEvent& event); + void OnFocus(wxFocusEvent& event); + void OnActivate(wxActivateEvent& event); + + // create input handler by name, fall back to GetStdInputHandler() if + // the current theme doesn't define any specific handler of this type + void CreateInputHandler(const wxString& inphandler); + +private: + // the input processor (we never delete it) + wxInputHandler *m_inputHandler; +}; + + +// ---------------------------------------------------------------------------- +// macros which must be used by the classes derived from wxInputConsumer mix-in +// ---------------------------------------------------------------------------- + +// declare the methods to be forwarded +#define WX_DECLARE_INPUT_CONSUMER() \ +private: \ + void OnMouse(wxMouseEvent& event); \ + void OnKeyDown(wxKeyEvent& event); \ + void OnKeyUp(wxKeyEvent& event); \ + void OnFocus(wxFocusEvent& event); \ +public: /* because of docview :-( */ \ + void OnActivate(wxActivateEvent& event); \ +private: + +// implement the event table entries for wxControlContainer +#define WX_EVENT_TABLE_INPUT_CONSUMER(classname) \ + EVT_KEY_DOWN(classname::OnKeyDown) \ + EVT_KEY_UP(classname::OnKeyUp) \ + EVT_MOUSE_EVENTS(classname::OnMouse) \ + EVT_SET_FOCUS(classname::OnFocus) \ + EVT_KILL_FOCUS(classname::OnFocus) \ + EVT_ACTIVATE(classname::OnActivate) + +// Forward event handlers to wxInputConsumer +// +// (We can't use them directly, because wxIC has virtual methods, which forces +// the compiler to include (at least) two vtables into wxControl, one for the +// wxWindow-wxControlBase-wxControl branch and one for the wxIC mix-in. +// Consequently, the "this" pointer has different value when in wxControl's +// and wxIC's method, even though the instance stays same. This doesn't matter +// so far as member pointers aren't used, but that's not wxControl's case. +// When we add an event table entry (= use a member pointer) pointing to +// wxIC's OnXXX method, GCC compiles code that executes wxIC::OnXXX with the +// version of "this" that belongs to wxControl, not wxIC! In our particular +// case, the effect is that m_handler is NULL (probably same memory +// area as the_other_vtable's_this->m_refObj) and input handling doesn't work.) +#define WX_FORWARD_TO_INPUT_CONSUMER(classname) \ + void classname::OnMouse(wxMouseEvent& event) \ + { \ + wxInputConsumer::OnMouse(event); \ + } \ + void classname::OnKeyDown(wxKeyEvent& event) \ + { \ + wxInputConsumer::OnKeyDown(event); \ + } \ + void classname::OnKeyUp(wxKeyEvent& event) \ + { \ + wxInputConsumer::OnKeyUp(event); \ + } \ + void classname::OnFocus(wxFocusEvent& event) \ + { \ + wxInputConsumer::OnFocus(event); \ + } \ + void classname::OnActivate(wxActivateEvent& event) \ + { \ + wxInputConsumer::OnActivate(event); \ + } + +#endif // _WX_UNIV_INPCONS_H_ diff --git a/Externals/wxWidgets/include/wx/univ/inphand.h b/Externals/wxWidgets/include/wx/univ/inphand.h new file mode 100644 index 0000000000..1b3eda04d6 --- /dev/null +++ b/Externals/wxWidgets/include/wx/univ/inphand.h @@ -0,0 +1,116 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/univ/inphand.h +// Purpose: wxInputHandler class maps the keyboard and mouse events to the +// actions which then are performed by the control +// Author: Vadim Zeitlin +// Modified by: +// Created: 18.08.00 +// RCS-ID: $Id: inphand.h 35650 2005-09-23 12:56:45Z MR $ +// Copyright: (c) 2000 SciTech Software, Inc. (www.scitechsoft.com) +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIV_INPHAND_H_ +#define _WX_UNIV_INPHAND_H_ + +#include "wx/univ/inpcons.h" // for wxControlAction(s) + +// ---------------------------------------------------------------------------- +// types of the standard input handlers which can be passed to +// wxTheme::GetInputHandler() +// ---------------------------------------------------------------------------- + +#define wxINP_HANDLER_DEFAULT _T("") +#define wxINP_HANDLER_BUTTON _T("button") +#define wxINP_HANDLER_CHECKBOX _T("checkbox") +#define wxINP_HANDLER_CHECKLISTBOX _T("checklistbox") +#define wxINP_HANDLER_COMBOBOX _T("combobox") +#define wxINP_HANDLER_LISTBOX _T("listbox") +#define wxINP_HANDLER_NOTEBOOK _T("notebook") +#define wxINP_HANDLER_RADIOBTN _T("radiobtn") +#define wxINP_HANDLER_SCROLLBAR _T("scrollbar") +#define wxINP_HANDLER_SLIDER _T("slider") +#define wxINP_HANDLER_SPINBTN _T("spinbtn") +#define wxINP_HANDLER_STATUSBAR _T("statusbar") +#define wxINP_HANDLER_TEXTCTRL _T("textctrl") +#define wxINP_HANDLER_TOOLBAR _T("toolbar") +#define wxINP_HANDLER_TOPLEVEL _T("toplevel") + +// ---------------------------------------------------------------------------- +// wxInputHandler: maps the events to the actions +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxInputHandler : public wxObject +{ +public: + // map a keyboard event to one or more actions (pressed == true if the key + // was pressed, false if released), returns true if something was done + virtual bool HandleKey(wxInputConsumer *consumer, + const wxKeyEvent& event, + bool pressed) = 0; + + // map a mouse (click) event to one or more actions + virtual bool HandleMouse(wxInputConsumer *consumer, + const wxMouseEvent& event) = 0; + + // handle mouse movement (or enter/leave) event: it is separated from + // HandleMouse() for convenience as many controls don't care about mouse + // movements at all + virtual bool HandleMouseMove(wxInputConsumer *consumer, + const wxMouseEvent& event); + + // do something with focus set/kill event: this is different from + // HandleMouseMove() as the mouse maybe over the control without it having + // focus + // + // return true to refresh the control, false otherwise + virtual bool HandleFocus(wxInputConsumer *consumer, const wxFocusEvent& event); + + // react to the app getting/losing activation + // + // return true to refresh the control, false otherwise + virtual bool HandleActivation(wxInputConsumer *consumer, bool activated); + + // virtual dtor for any base class + virtual ~wxInputHandler(); +}; + +// ---------------------------------------------------------------------------- +// wxStdInputHandler is just a base class for all other "standard" handlers +// and also provides the way to chain input handlers together +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxStdInputHandler : public wxInputHandler +{ +public: + wxStdInputHandler(wxInputHandler *handler) : m_handler(handler) { } + + virtual bool HandleKey(wxInputConsumer *consumer, + const wxKeyEvent& event, + bool pressed) + { + return m_handler ? m_handler->HandleKey(consumer, event, pressed) + : false; + } + + virtual bool HandleMouse(wxInputConsumer *consumer, + const wxMouseEvent& event) + { + return m_handler ? m_handler->HandleMouse(consumer, event) : false; + } + + virtual bool HandleMouseMove(wxInputConsumer *consumer, const wxMouseEvent& event) + { + return m_handler ? m_handler->HandleMouseMove(consumer, event) : false; + } + + virtual bool HandleFocus(wxInputConsumer *consumer, const wxFocusEvent& event) + { + return m_handler ? m_handler->HandleFocus(consumer, event) : false; + } + +private: + wxInputHandler *m_handler; +}; + +#endif // _WX_UNIV_INPHAND_H_ diff --git a/Externals/wxWidgets/include/wx/univ/listbox.h b/Externals/wxWidgets/include/wx/univ/listbox.h new file mode 100644 index 0000000000..cc7bc5890b --- /dev/null +++ b/Externals/wxWidgets/include/wx/univ/listbox.h @@ -0,0 +1,300 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/univ/listbox.h +// Purpose: the universal listbox +// Author: Vadim Zeitlin +// Modified by: +// Created: 30.08.00 +// RCS-ID: $Id: listbox.h 41227 2006-09-14 19:36:47Z VZ $ +// Copyright: (c) 2000 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIV_LISTBOX_H_ +#define _WX_UNIV_LISTBOX_H_ + +#include "wx/scrolwin.h" // for wxScrollHelper +#include "wx/dynarray.h" +#include "wx/arrstr.h" + +// ---------------------------------------------------------------------------- +// the actions supported by this control +// ---------------------------------------------------------------------------- + +// change the current item +#define wxACTION_LISTBOX_SETFOCUS _T("setfocus") // select the item +#define wxACTION_LISTBOX_MOVEDOWN _T("down") // select item below +#define wxACTION_LISTBOX_MOVEUP _T("up") // select item above +#define wxACTION_LISTBOX_PAGEDOWN _T("pagedown") // go page down +#define wxACTION_LISTBOX_PAGEUP _T("pageup") // go page up +#define wxACTION_LISTBOX_START _T("start") // go to first item +#define wxACTION_LISTBOX_END _T("end") // go to last item +#define wxACTION_LISTBOX_FIND _T("find") // find item by 1st letter + +// do something with the current item +#define wxACTION_LISTBOX_ACTIVATE _T("activate") // activate (choose) +#define wxACTION_LISTBOX_TOGGLE _T("toggle") // togglee selected state +#define wxACTION_LISTBOX_SELECT _T("select") // sel this, unsel others +#define wxACTION_LISTBOX_SELECTADD _T("selectadd") // add to selection +#define wxACTION_LISTBOX_UNSELECT _T("unselect") // unselect +#define wxACTION_LISTBOX_ANCHOR _T("selanchor") // anchor selection + +// do something with the selection globally (not for single selection ones) +#define wxACTION_LISTBOX_SELECTALL _T("selectall") // select all items +#define wxACTION_LISTBOX_UNSELECTALL _T("unselectall") // unselect all items +#define wxACTION_LISTBOX_SELTOGGLE _T("togglesel") // invert the selection +#define wxACTION_LISTBOX_EXTENDSEL _T("extend") // extend to item + +// ---------------------------------------------------------------------------- +// wxListBox: a list of selectable items +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxListBox : public wxListBoxBase, public wxScrollHelper +{ +public: + // ctors and such + wxListBox() : wxScrollHelper(this) { Init(); } + wxListBox(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + int n = 0, const wxString choices[] = (const wxString *) NULL, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxListBoxNameStr ) + : wxScrollHelper(this) + { + Init(); + + Create(parent, id, pos, size, n, choices, style, validator, name); + } + wxListBox(wxWindow *parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + const wxArrayString& choices, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxListBoxNameStr ); + + virtual ~wxListBox(); + + bool Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + int n = 0, const wxString choices[] = (const wxString *) NULL, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxListBoxNameStr); + bool Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + const wxArrayString& choices, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxListBoxNameStr); + + // implement the listbox interface defined by wxListBoxBase + virtual void Clear(); + virtual void Delete(unsigned int n); + + virtual unsigned int GetCount() const + { return (unsigned int)m_strings->GetCount(); } + virtual wxString GetString(unsigned int n) const + { return m_strings->Item(n); } + virtual void SetString(unsigned int n, const wxString& s); + virtual int FindString(const wxString& s, bool bCase = false) const + { return m_strings->Index(s, bCase); } + + virtual bool IsSelected(int n) const + { return m_selections.Index(n) != wxNOT_FOUND; } + virtual int GetSelection() const; + virtual int GetSelections(wxArrayInt& aSelections) const; + +protected: + virtual void DoSetSelection(int n, bool select); + virtual int DoAppendOnly(const wxString& item); + virtual int DoAppend(const wxString& item); + virtual void DoInsertItems(const wxArrayString& items, unsigned int pos); + virtual void DoSetItems(const wxArrayString& items, void **clientData); + + virtual void DoSetFirstItem(int n); + + virtual void DoSetItemClientData(unsigned int n, void* clientData); + virtual void* DoGetItemClientData(unsigned int n) const; + virtual void DoSetItemClientObject(unsigned int n, wxClientData* clientData); + virtual wxClientData* DoGetItemClientObject(unsigned int n) const; + +public: + // override some more base class methods + virtual bool SetFont(const wxFont& font); + + // the wxUniversal-specific methods + // -------------------------------- + + // the current item is the same as the selected one for wxLB_SINGLE + // listboxes but for the other ones it is just the focused item which may + // be selected or not + int GetCurrentItem() const { return m_current; } + void SetCurrentItem(int n); + + // select the item which is diff items below the current one + void ChangeCurrent(int diff); + + // activate (i.e. send a LISTBOX_DOUBLECLICKED message) the specified or + // current (if -1) item + void Activate(int item = -1); + + // select or unselect the specified or current (if -1) item + void DoSelect(int item = -1, bool sel = true); + + // more readable wrapper + void DoUnselect(int item) { DoSelect(item, false); } + + // select an item and send a notification about it + void SelectAndNotify(int item); + + // ensure that the given item is visible by scrolling it into view + virtual void EnsureVisible(int n); + + // find the first item [strictly] after the current one which starts with + // the given string and make it the current one, return true if the current + // item changed + bool FindItem(const wxString& prefix, bool strictlyAfter = false); + bool FindNextItem(const wxString& prefix) { return FindItem(prefix, true); } + + // extend the selection to span the range from the anchor (see below) to + // the specified or current item + void ExtendSelection(int itemTo = -1); + + // make this item the new selection anchor: extending selection with + // ExtendSelection() will work with it + void AnchorSelection(int itemFrom) { m_selAnchor = itemFrom; } + + // get, calculating it if necessary, the number of items per page, the + // height of each line and the max width of an item + int GetItemsPerPage() const; + wxCoord GetLineHeight() const; + wxCoord GetMaxWidth() const; + + // override the wxControl virtual methods + virtual bool PerformAction(const wxControlAction& action, + long numArg = 0l, + const wxString& strArg = wxEmptyString); + + static wxInputHandler *GetStdInputHandler(wxInputHandler *handlerDef); + virtual wxInputHandler *DoGetStdInputHandler(wxInputHandler *handlerDef) + { + return GetStdInputHandler(handlerDef); + } + + // idle processing + virtual void OnInternalIdle(); + +protected: + // geometry + virtual wxSize DoGetBestClientSize() const; + virtual void DoSetSize(int x, int y, + int width, int height, + int sizeFlags = wxSIZE_AUTO); + + virtual void DoDraw(wxControlRenderer *renderer); + virtual wxBorder GetDefaultBorder() const; + + // common part of all ctors + void Init(); + + // event handlers + void OnSize(wxSizeEvent& event); + + // common part of Clear() and DoSetItems(): clears everything + virtual void DoClear(); + + // refresh the given item(s) or everything + void RefreshItems(int from, int count); + void RefreshItem(int n); + void RefreshFromItemToEnd(int n); + void RefreshAll(); + + // send an event of the given type (using m_current by default) + bool SendEvent(wxEventType type, int item = -1); + + // calculate the number of items per page using our current size + void CalcItemsPerPage(); + + // can/should we have a horz scrollbar? + bool HasHorzScrollbar() const + { return (m_windowStyle & wxLB_HSCROLL) != 0; } + + // redraw the items in the given range only: called from DoDraw() + virtual void DoDrawRange(wxControlRenderer *renderer, + int itemFirst, int itemLast); + + // update the scrollbars and then ensure that the item is visible + void DoEnsureVisible(int n); + + // mark horz scrollbar for updating + void RefreshHorzScrollbar(); + + // update (show/hide/adjust) the scrollbars + void UpdateScrollbars(); + + // refresh the items specified by m_updateCount and m_updateFrom + void UpdateItems(); + + // the array containing all items (it is sorted if the listbox has + // wxLB_SORT style) + wxArrayString* m_strings; + + // this array contains the indices of the selected items (for the single + // selection listboxes only the first element of it is used and contains + // the current selection) + wxArrayInt m_selections; + + // and this one the client data (either void or wxClientData) + wxArrayPtrVoid m_itemsClientData; + + // the current item + int m_current; + +private: + // the range of elements which must be updated: if m_updateCount is 0 no + // update is needed, if it is -1 everything must be updated, otherwise + // m_updateCount items starting from m_updateFrom have to be redrawn + int m_updateFrom, + m_updateCount; + + // the height of one line in the listbox (all lines have the same height) + wxCoord m_lineHeight; + + // the maximal width of a listbox item and the item which has it + wxCoord m_maxWidth; + int m_maxWidthItem; + + // the extents of horz and vert scrollbars + int m_scrollRangeX, + m_scrollRangeY; + + // the number of items per page + size_t m_itemsPerPage; + + // if the number of items has changed we may need to show/hide the + // scrollbar + bool m_updateScrollbarX, m_updateScrollbarY, + m_showScrollbarX, m_showScrollbarY; + + // if the current item has changed, we might need to scroll if it went out + // of the window + bool m_currentChanged; + + // the anchor from which the selection is extended for the listboxes with + // wxLB_EXTENDED style - this is set to the last item which was selected + // by not extending the selection but by choosing it directly + int m_selAnchor; + + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS(wxListBox) +}; + +#endif // _WX_UNIV_LISTBOX_H_ diff --git a/Externals/wxWidgets/include/wx/univ/menu.h b/Externals/wxWidgets/include/wx/univ/menu.h new file mode 100644 index 0000000000..440a873b22 --- /dev/null +++ b/Externals/wxWidgets/include/wx/univ/menu.h @@ -0,0 +1,282 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/univ/menu.h +// Purpose: wxMenu and wxMenuBar classes for wxUniversal +// Author: Vadim Zeitlin +// Modified by: +// Created: 05.05.01 +// RCS-ID: $Id: menu.h 48053 2007-08-13 17:07:01Z JS $ +// Copyright: (c) 2001 SciTech Software, Inc. (www.scitechsoft.com) +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIV_MENU_H_ +#define _WX_UNIV_MENU_H_ + +#if wxUSE_ACCEL + #include "wx/accel.h" +#endif // wxUSE_ACCEL + +#include "wx/dynarray.h" + +// fwd declarations +class WXDLLEXPORT wxMenuInfo; +WX_DECLARE_EXPORTED_OBJARRAY(wxMenuInfo, wxMenuInfoArray); + +class WXDLLEXPORT wxMenuGeometryInfo; +class WXDLLEXPORT wxPopupMenuWindow; +class WXDLLEXPORT wxRenderer; + +// ---------------------------------------------------------------------------- +// wxMenu +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxMenu : public wxMenuBase +{ +public: + // ctors and dtor + wxMenu(const wxString& title, long style = 0) + : wxMenuBase(title, style) { Init(); } + + wxMenu(long style = 0) : wxMenuBase(style) { Init(); } + + virtual ~wxMenu(); + + // called by wxMenuItem when an item of this menu changes + void RefreshItem(wxMenuItem *item); + + // does the menu have any items? + bool IsEmpty() const { return !GetMenuItems().GetFirst(); } + + // show this menu at the given position (in screen coords) and optionally + // select its first item + void Popup(const wxPoint& pos, const wxSize& size, + bool selectFirst = true); + + // dismiss the menu + void Dismiss(); + + // override the base class methods to connect/disconnect event handlers + virtual void Attach(wxMenuBarBase *menubar); + virtual void Detach(); + + // implementation only from here + + // do as if this item were clicked, return true if the resulting event was + // processed, false otherwise + bool ClickItem(wxMenuItem *item); + + // process the key event, return true if done + bool ProcessKeyDown(int key); + +#if wxUSE_ACCEL + // find the item for the given accel and generate an event if found + bool ProcessAccelEvent(const wxKeyEvent& event); +#endif // wxUSE_ACCEL + +protected: + // implement base class virtuals + virtual wxMenuItem* DoAppend(wxMenuItem *item); + virtual wxMenuItem* DoInsert(size_t pos, wxMenuItem *item); + virtual wxMenuItem* DoRemove(wxMenuItem *item); + + // common part of DoAppend and DoInsert + void OnItemAdded(wxMenuItem *item); + + // called by wxPopupMenuWindow when the window is hidden + void OnDismiss(bool dismissParent); + + // return true if the menu is currently shown on screen + bool IsShown() const; + + // get the menu geometry info + const wxMenuGeometryInfo& GetGeometryInfo() const; + + // forget old menu geometry info + void InvalidateGeometryInfo(); + + // return either the menubar or the invoking window, normally never NULL + wxWindow *GetRootWindow() const; + + // get the renderer we use for drawing: either the one of the menu bar or + // the one of the window if we're a popup menu + wxRenderer *GetRenderer() const; + +#if wxUSE_ACCEL + // add/remove accel for the given menu item + void AddAccelFor(wxMenuItem *item); + void RemoveAccelFor(wxMenuItem *item); +#endif // wxUSE_ACCEL + +private: + // common part of all ctors + void Init(); + + // terminate the current radio group, if any + void EndRadioGroup(); + + // the exact menu geometry is defined by a struct derived from this one + // which is opaque and defined by the renderer + wxMenuGeometryInfo *m_geometry; + + // the menu shown on screen or NULL if not currently shown + wxPopupMenuWindow *m_popupMenu; + +#if wxUSE_ACCEL + // the accel table for this menu + wxAcceleratorTable m_accelTable; +#endif // wxUSE_ACCEL + + // the position of the first item in the current radio group or -1 + int m_startRadioGroup; + + // it calls out OnDismiss() + friend class wxPopupMenuWindow; + DECLARE_DYNAMIC_CLASS(wxMenu) +}; + +// ---------------------------------------------------------------------------- +// wxMenuBar +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxMenuBar : public wxMenuBarBase +{ +public: + // ctors and dtor + wxMenuBar(long WXUNUSED(style) = 0) { Init(); } + wxMenuBar(size_t n, wxMenu *menus[], const wxString titles[], long style = 0); + virtual ~wxMenuBar(); + + // implement base class virtuals + virtual bool Append( wxMenu *menu, const wxString &title ); + virtual bool Insert(size_t pos, wxMenu *menu, const wxString& title); + virtual wxMenu *Replace(size_t pos, wxMenu *menu, const wxString& title); + virtual wxMenu *Remove(size_t pos); + + virtual void EnableTop(size_t pos, bool enable); + virtual bool IsEnabledTop(size_t pos) const; + + virtual void SetLabelTop(size_t pos, const wxString& label); + virtual wxString GetLabelTop(size_t pos) const; + + virtual void Attach(wxFrame *frame); + virtual void Detach(); + + // get the next item for the givan accel letter (used by wxFrame), return + // -1 if none + // + // if unique is not NULL, filled with true if there is only one item with + // this accel, false if two or more + int FindNextItemForAccel(int idxStart, + int keycode, + bool *unique = NULL) const; + + // called by wxFrame to set focus to or open the given menu + void SelectMenu(size_t pos); + void PopupMenu(size_t pos); + +#if wxUSE_ACCEL + // find the item for the given accel and generate an event if found + bool ProcessAccelEvent(const wxKeyEvent& event); +#endif // wxUSE_ACCEL + + // called by wxMenu when it is dismissed + void OnDismissMenu(bool dismissMenuBar = false); + +protected: + // common part of all ctors + void Init(); + + // event handlers + void OnLeftDown(wxMouseEvent& event); + void OnMouseMove(wxMouseEvent& event); + void OnKeyDown(wxKeyEvent& event); + void OnKillFocus(wxFocusEvent& event); + + // process the mouse move event, return true if we did, false to continue + // processing as usual + // + // the coordinates are client coordinates of menubar, convert if necessary + bool ProcessMouseEvent(const wxPoint& pt); + + // called when the menu bar loses mouse capture - it is not hidden unlike + // menus, but it doesn't have modal status any longer + void OnDismiss(); + + // draw the menubar + virtual void DoDraw(wxControlRenderer *renderer); + + // menubar geometry + virtual wxSize DoGetBestClientSize() const; + + // has the menubar been created already? + bool IsCreated() const { return m_frameLast != NULL; } + + // "fast" version of GetMenuCount() + size_t GetCount() const { return m_menuInfos.GetCount(); } + + // get the (total) width of the specified menu + wxCoord GetItemWidth(size_t pos) const; + + // get the rect of the item + wxRect GetItemRect(size_t pos) const; + + // get the menu from the given point or -1 if none + int GetMenuFromPoint(const wxPoint& pos) const; + + // refresh the given item + void RefreshItem(size_t pos); + + // refresh all items after this one (including it) + void RefreshAllItemsAfter(size_t pos); + + // hide the currently shown menu and show this one + void DoSelectMenu(size_t pos); + + // popup the currently selected menu + void PopupCurrentMenu(bool selectFirst = true); + + // hide the currently selected menu + void DismissMenu(); + + // do we show a menu currently? + bool IsShowingMenu() const { return m_menuShown != 0; } + + // we don't want to have focus except while selecting from menu + void GiveAwayFocus(); + + // Release the mouse capture if we have it + bool ReleaseMouseCapture(); + + // the array containing extra menu info we need + wxMenuInfoArray m_menuInfos; + + // the current item (only used when menubar has focus) + int m_current; + +private: + // the last frame to which we were attached, NULL initially + wxFrame *m_frameLast; + + // the currently shown menu or NULL + wxMenu *m_menuShown; + + // should be showing the menu? this is subtly different from m_menuShown != + // NULL as the menu which should be shown may be disabled in which case we + // don't show it - but will do as soon as the focus shifts to another menu + bool m_shouldShowMenu; + + // it calls out ProcessMouseEvent() + friend class wxPopupMenuWindow; + + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS(wxMenuBar) + +public: + +#if wxABI_VERSION >= 20805 + // Gets the original label at the top-level of the menubar + wxString GetMenuLabel(size_t pos) const; +#endif +}; + +#endif // _WX_UNIV_MENU_H_ diff --git a/Externals/wxWidgets/include/wx/univ/menuitem.h b/Externals/wxWidgets/include/wx/univ/menuitem.h new file mode 100644 index 0000000000..c37c902e2d --- /dev/null +++ b/Externals/wxWidgets/include/wx/univ/menuitem.h @@ -0,0 +1,135 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/univ/menuitem.h +// Purpose: wxMenuItem class for wxUniversal +// Author: Vadim Zeitlin +// Modified by: +// Created: 05.05.01 +// RCS-ID: $Id: menuitem.h 48053 2007-08-13 17:07:01Z JS $ +// Copyright: (c) 2001 SciTech Software, Inc. (www.scitechsoft.com) +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIV_MENUITEM_H_ +#define _WX_UNIV_MENUITEM_H_ + +// ---------------------------------------------------------------------------- +// wxMenuItem implements wxMenuItemBase +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxMenuItem : public wxMenuItemBase +{ +public: + // ctor & dtor + wxMenuItem(wxMenu *parentMenu = (wxMenu *)NULL, + int id = wxID_SEPARATOR, + const wxString& name = wxEmptyString, + const wxString& help = wxEmptyString, + wxItemKind kind = wxITEM_NORMAL, + wxMenu *subMenu = (wxMenu *)NULL); + virtual ~wxMenuItem(); + + // override base class virtuals to update the item appearance on screen + virtual void SetText(const wxString& text); + virtual void SetCheckable(bool checkable); + + virtual void Enable(bool enable = true); + virtual void Check(bool check = true); + + // we add some extra functions which are also available under MSW from + // wxOwnerDrawn class - they will be moved to wxMenuItemBase later + // hopefully + void SetBitmaps(const wxBitmap& bmpChecked, + const wxBitmap& bmpUnchecked = wxNullBitmap); + void SetBitmap(const wxBitmap& bmp) { SetBitmaps(bmp); } + const wxBitmap& GetBitmap(bool checked = true) const + { return checked ? m_bmpChecked : m_bmpUnchecked; } + + void SetDisabledBitmap( const wxBitmap& bmpDisabled ) + { m_bmpDisabled = bmpDisabled; } + const wxBitmap& GetDisabledBitmap() const + { return m_bmpDisabled; } + + // mark item as belonging to the given radio group + void SetAsRadioGroupStart(); + void SetRadioGroupStart(int start); + void SetRadioGroupEnd(int end); + + // wxUniv-specific methods for implementation only starting from here + + // get the accel index of our label or -1 if none + int GetAccelIndex() const { return m_indexAccel; } + + // get the accel string (displayed to the right of the label) + const wxString& GetAccelString() const { return m_strAccel; } + + // set/get the y coord and the height of this item: note that it must be + // set first and retrieved later, the item doesn't calculate it itself + void SetGeometry(wxCoord y, wxCoord height) + { + m_posY = y; + m_height = height; + } + + wxCoord GetPosition() const + { + wxASSERT_MSG( m_posY != wxDefaultCoord, _T("must call SetHeight first!") ); + + return m_posY; + } + + wxCoord GetHeight() const + { + wxASSERT_MSG( m_height != wxDefaultCoord, _T("must call SetHeight first!") ); + + return m_height; + } + +protected: + // notify the menu about the change in this item + inline void NotifyMenu(); + + // set the accel index and string from text + void UpdateAccelInfo(); + + // the bitmaps (may be invalid, then they're not used) + wxBitmap m_bmpChecked, + m_bmpUnchecked, + m_bmpDisabled; + + // the positions of the first and last items of the radio group this item + // belongs to or -1: start is the radio group start and is valid for all + // but first radio group items (m_isRadioGroupStart == false), end is valid + // only for the first one + union + { + int start; + int end; + } m_radioGroup; + + // does this item start a radio group? + bool m_isRadioGroupStart; + + // the position of the accelerator in our label, -1 if none + int m_indexAccel; + + // the accel string (i.e. "Ctrl-Q" or "Alt-F1") + wxString m_strAccel; + + // the position and height of the displayed item + wxCoord m_posY, + m_height; + +private: + DECLARE_DYNAMIC_CLASS(wxMenuItem) + +public: + +#if wxABI_VERSION >= 20805 + // return the item label including any mnemonics and accelerators. + // This used to be called GetText. + wxString GetItemLabel() const { return GetText(); } +#endif +}; + +#endif // _WX_UNIV_MENUITEM_H_ + diff --git a/Externals/wxWidgets/include/wx/univ/notebook.h b/Externals/wxWidgets/include/wx/univ/notebook.h new file mode 100644 index 0000000000..b87de872e0 --- /dev/null +++ b/Externals/wxWidgets/include/wx/univ/notebook.h @@ -0,0 +1,257 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/univ/notebook.h +// Purpose: universal version of wxNotebook +// Author: Vadim Zeitlin +// Modified by: +// Created: 01.02.01 +// RCS-ID: $Id: notebook.h 41738 2006-10-08 17:37:23Z VZ $ +// Copyright: (c) 2001 SciTech Software, Inc. (www.scitechsoft.com) +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIV_NOTEBOOK_H_ +#define _WX_UNIV_NOTEBOOK_H_ + +#include "wx/arrstr.h" + +class WXDLLEXPORT wxSpinButton; + +// ---------------------------------------------------------------------------- +// the actions supported by this control +// ---------------------------------------------------------------------------- + +// change the page: to the next/previous/given one +#define wxACTION_NOTEBOOK_NEXT _T("nexttab") +#define wxACTION_NOTEBOOK_PREV _T("prevtab") +#define wxACTION_NOTEBOOK_GOTO _T("gototab") + +// ---------------------------------------------------------------------------- +// wxNotebook +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxNotebook : public wxNotebookBase +{ +public: + // ctors and such + // -------------- + + wxNotebook() { Init(); } + + wxNotebook(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxNotebookNameStr) + { + Init(); + + (void)Create(parent, id, pos, size, style, name); + } + + // quasi ctor + bool Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxNotebookNameStr); + + // dtor + virtual ~wxNotebook(); + + // implement wxNotebookBase pure virtuals + // -------------------------------------- + + virtual int SetSelection(size_t nPage) { return DoSetSelection(nPage, SetSelection_SendEvent); } + virtual int GetSelection() const { return (int) m_sel; } + + // changes selected page without sending events + int ChangeSelection(size_t nPage) { return DoSetSelection(nPage); } + + virtual bool SetPageText(size_t nPage, const wxString& strText); + virtual wxString GetPageText(size_t nPage) const; + + virtual int GetPageImage(size_t nPage) const; + virtual bool SetPageImage(size_t nPage, int nImage); + + virtual void SetPageSize(const wxSize& size); + virtual void SetPadding(const wxSize& padding); + virtual void SetTabSize(const wxSize& sz); + + virtual wxSize CalcSizeFromPage(const wxSize& sizePage) const; + + virtual bool DeleteAllPages(); + + virtual bool InsertPage(size_t nPage, + wxNotebookPage *pPage, + const wxString& strText, + bool bSelect = false, + int imageId = -1); + + // style tests + // ----------- + + // return true if all tabs have the same width + bool FixedSizeTabs() const { return HasFlag(wxNB_FIXEDWIDTH); } + + // return wxTOP/wxBOTTOM/wxRIGHT/wxLEFT + wxDirection GetTabOrientation() const; + + // return true if the notebook has tabs at the sidesand not at the top (or + // bottom) as usual + bool IsVertical() const; + + // hit testing + // ----------- + + virtual int HitTest(const wxPoint& pt, long *flags = NULL) const; + + // input handling + // -------------- + + virtual bool PerformAction(const wxControlAction& action, + long numArg = 0l, + const wxString& strArg = wxEmptyString); + + static wxInputHandler *GetStdInputHandler(wxInputHandler *handlerDef); + virtual wxInputHandler *DoGetStdInputHandler(wxInputHandler *handlerDef) + { + return GetStdInputHandler(handlerDef); + } + + // refresh the currently selected tab + void RefreshCurrent(); + +protected: + virtual wxNotebookPage *DoRemovePage(size_t nPage); + + // drawing + virtual void DoDraw(wxControlRenderer *renderer); + void DoDrawTab(wxDC& dc, const wxRect& rect, size_t n); + + // resizing + virtual wxSize DoGetBestClientSize() const; + virtual void DoMoveWindow(int x, int y, int width, int height); + virtual void DoSetSize(int x, int y, + int width, int height, + int sizeFlags = wxSIZE_AUTO); + + int DoSetSelection(size_t nPage, int flags = 0); + + // common part of all ctors + void Init(); + + // resize the tab to fit its title (and icon if any) + void ResizeTab(int page); + + // recalculate the geometry of the notebook completely + void Relayout(); + + // is the spin button currently shown? + bool HasSpinBtn() const; + + // calculate last (fully) visible tab: updates m_lastVisible + void CalcLastVisibleTab(); + + // show or hide the spin control for tabs scrolling depending on whether it + // is needed or not + void UpdateSpinBtn(); + + // position the spin button + void PositionSpinBtn(); + + // refresh the given tab only + void RefreshTab(int page, bool forceSelected = false); + + // refresh all tabs + void RefreshAllTabs(); + + // get the tab rect (inefficient, don't use this in a loop) + wxRect GetTabRect(int page) const; + + // get the rectangle containing all tabs + wxRect GetAllTabsRect() const; + + // get the part occupied by the tabs - slightly smaller than + // GetAllTabsRect() because the tabs may be indented from it + wxRect GetTabsPart() const; + + // calculate the tab size (without padding) + wxSize CalcTabSize(int page) const; + + // get the (cached) size of a tab + void GetTabSize(int page, wxCoord *w, wxCoord *h) const; + + // get the (cached) width of the tab + wxCoord GetTabWidth(int page) const + { return FixedSizeTabs() ? m_widthMax : m_widths[page]; } + + // return true if the tab has an associated image + bool HasImage(int page) const + { return m_imageList && m_images[page] != -1; } + + // get the part of the notebook reserved for the pages (slightly larger + // than GetPageRect() as we draw a border and leave marginin between) + wxRect GetPagePart() const; + + // get the page rect in our client coords + wxRect GetPageRect() const; + + // get our client size from the page size + wxSize GetSizeForPage(const wxSize& size) const; + + // scroll the tabs so that the first page shown becomes the given one + void ScrollTo(int page); + + // scroll the tabs so that the first page shown becomes the given one + void ScrollLastTo(int page); + + // the pages titles + wxArrayString m_titles; + + // the current selection + size_t m_sel; + + // the spin button to change the pages + wxSpinButton *m_spinbtn; + + // the offset of the first page shown (may be changed with m_spinbtn) + wxCoord m_offset; + + // the first and last currently visible tabs: the name is not completely + // accurate as m_lastVisible is, in fact, the first tab which is *not* + // visible: so the visible tabs are those with indexes such that + // m_firstVisible <= n < m_lastVisible + size_t m_firstVisible, + m_lastVisible; + + // the last fully visible item, usually just m_lastVisible - 1 but may be + // different from it + size_t m_lastFullyVisible; + + // the height of tabs in a normal notebook or the width of tabs in a + // notebook with tabs on a side + wxCoord m_heightTab; + + // the biggest height (or width) of a notebook tab (used only if + // FixedSizeTabs()) or -1 if not calculated yet + wxCoord m_widthMax; + + // the cached widths (or heights) of tabs + wxArrayInt m_widths; + + // the icon indices + wxArrayInt m_images; + + // the accel indexes for labels + wxArrayInt m_accels; + + // the padding + wxSize m_sizePad; + + DECLARE_DYNAMIC_CLASS(wxNotebook) +}; + +#endif // _WX_UNIV_NOTEBOOK_H_ + diff --git a/Externals/wxWidgets/include/wx/univ/radiobox.h b/Externals/wxWidgets/include/wx/univ/radiobox.h new file mode 100644 index 0000000000..b2108af322 --- /dev/null +++ b/Externals/wxWidgets/include/wx/univ/radiobox.h @@ -0,0 +1,151 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/univ/radiobox.h +// Purpose: wxRadioBox declaration +// Author: Vadim Zeitlin +// Modified by: +// Created: 11.09.00 +// RCS-ID: $Id: radiobox.h 38319 2006-03-23 22:05:23Z VZ $ +// Copyright: (c) 2000 SciTech Software, Inc. (www.scitechsoft.com) +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIV_RADIOBOX_H_ +#define _WX_UNIV_RADIOBOX_H_ + +class WXDLLEXPORT wxRadioButton; + +#include "wx/statbox.h" +#include "wx/dynarray.h" + +WX_DEFINE_EXPORTED_ARRAY_PTR(wxRadioButton *, wxArrayRadioButtons); + +// ---------------------------------------------------------------------------- +// wxRadioBox: a box full of radio buttons +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxRadioBox : public wxStaticBox, + public wxRadioBoxBase +{ +public: + // wxRadioBox construction + wxRadioBox() { Init(); } + + wxRadioBox(wxWindow *parent, + wxWindowID id, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + int n = 0, const wxString *choices = NULL, + int majorDim = 0, + long style = wxRA_SPECIFY_COLS, + const wxValidator& val = wxDefaultValidator, + const wxString& name = wxRadioBoxNameStr) + { + Init(); + + (void)Create(parent, id, title, pos, size, n, choices, + majorDim, style, val, name); + } + wxRadioBox(wxWindow *parent, + wxWindowID id, + const wxString& title, + const wxPoint& pos, + const wxSize& size, + const wxArrayString& choices, + int majorDim = 0, + long style = wxRA_SPECIFY_COLS, + const wxValidator& val = wxDefaultValidator, + const wxString& name = wxRadioBoxNameStr); + + bool Create(wxWindow *parent, + wxWindowID id, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + int n = 0, const wxString *choices = NULL, + int majorDim = 0, + long style = wxRA_SPECIFY_COLS, + const wxValidator& val = wxDefaultValidator, + const wxString& name = wxRadioBoxNameStr); + bool Create(wxWindow *parent, + wxWindowID id, + const wxString& title, + const wxPoint& pos, + const wxSize& size, + const wxArrayString& choices, + int majorDim = 0, + long style = wxRA_SPECIFY_COLS, + const wxValidator& val = wxDefaultValidator, + const wxString& name = wxRadioBoxNameStr); + + virtual ~wxRadioBox(); + + // implement wxRadioBox interface + virtual void SetSelection(int n); + virtual int GetSelection() const; + + virtual unsigned int GetCount() const + { return (unsigned int)m_buttons.GetCount(); } + + virtual wxString GetString(unsigned int n) const; + virtual void SetString(unsigned int n, const wxString& label); + + virtual bool Enable(unsigned int n, bool enable = true); + virtual bool Show(unsigned int n, bool show = true); + + virtual bool IsItemEnabled(unsigned int n) const; + virtual bool IsItemShown(unsigned int n) const; + + // we also override the wxControl methods to avoid virtual function hiding + virtual bool Enable(bool enable = true); + virtual bool Show(bool show = true); + virtual wxString GetLabel() const; + virtual void SetLabel(const wxString& label); + + // we inherit a version always returning false from wxStaticBox, override + // it to behave normally + virtual bool AcceptsFocus() const { return wxControl::AcceptsFocus(); } + +#if wxUSE_TOOLTIPS + virtual void DoSetToolTip( wxToolTip *tip ); +#endif // wxUSE_TOOLTIPS + + // wxUniversal-only methods + + // another Append() version + void Append(int n, const wxString *choices); + + // implementation only: called by wxRadioHookHandler + void OnRadioButton(wxEvent& event); + bool OnKeyDown(wxKeyEvent& event); + +protected: + // override the base class methods dealing with window positioning/sizing + // as we must move/size the buttons as well + virtual void DoMoveWindow(int x, int y, int width, int height); + virtual wxSize DoGetBestClientSize() const; + + // generate a radiobutton click event for the current item + void SendRadioEvent(); + + // common part of all ctors + void Init(); + + // calculate the max size of all buttons + wxSize GetMaxButtonSize() const; + + // the currently selected radio button or -1 + int m_selection; + + // all radio buttons + wxArrayRadioButtons m_buttons; + + // the event handler which is used to translate radiobutton events into + // radiobox one + wxEvtHandler *m_evtRadioHook; + +private: + DECLARE_DYNAMIC_CLASS(wxRadioBox) +}; + +#endif // _WX_UNIV_RADIOBOX_H_ diff --git a/Externals/wxWidgets/include/wx/univ/radiobut.h b/Externals/wxWidgets/include/wx/univ/radiobut.h new file mode 100644 index 0000000000..f814986a4f --- /dev/null +++ b/Externals/wxWidgets/include/wx/univ/radiobut.h @@ -0,0 +1,76 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/univ/radiobut.h +// Purpose: wxRadioButton declaration +// Author: Vadim Zeitlin +// Modified by: +// Created: 10.09.00 +// RCS-ID: $Id: radiobut.h 35650 2005-09-23 12:56:45Z MR $ +// Copyright: (c) 2000 SciTech Software, Inc. (www.scitechsoft.com) +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIV_RADIOBUT_H_ +#define _WX_UNIV_RADIOBUT_H_ + +#include "wx/checkbox.h" + +// ---------------------------------------------------------------------------- +// wxRadioButton +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxRadioButton : public wxCheckBox +{ +public: + // constructors + wxRadioButton() { Init(); } + + wxRadioButton(wxWindow *parent, + wxWindowID id, + const wxString& label, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxRadioButtonNameStr) + { + Init(); + + Create(parent, id, label, pos, size, style, validator, name); + } + + bool Create(wxWindow *parent, + wxWindowID id, + const wxString& label, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxRadioButtonNameStr); + + // override some base class methods + virtual void ChangeValue(bool value); + +protected: + // implement our own drawing + virtual void DoDraw(wxControlRenderer *renderer); + + // we use the radio button bitmaps for size calculation + virtual wxSize GetBitmapSize() const; + + // the radio button can only be cleared using this method, not + // ChangeValue() above - and it is protected as it can only be called by + // another radiobutton + void ClearValue(); + + // called when the radio button becomes checked: we clear all the buttons + // in the same group with us here + virtual void OnCheck(); + + // send event about radio button selection + virtual void SendEvent(); + +private: + DECLARE_DYNAMIC_CLASS(wxRadioButton) +}; + +#endif // _WX_UNIV_RADIOBUT_H_ diff --git a/Externals/wxWidgets/include/wx/univ/renderer.h b/Externals/wxWidgets/include/wx/univ/renderer.h new file mode 100644 index 0000000000..59626bf847 --- /dev/null +++ b/Externals/wxWidgets/include/wx/univ/renderer.h @@ -0,0 +1,932 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/univ/renderer.h +// Purpose: wxRenderer class declaration +// Author: Vadim Zeitlin +// Modified by: +// Created: 06.08.00 +// RCS-ID: $Id: renderer.h 43726 2006-11-30 23:44:55Z RD $ +// Copyright: (c) 2000 SciTech Software, Inc. (www.scitechsoft.com) +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIV_RENDERER_H_ +#define _WX_UNIV_RENDERER_H_ + +/* + wxRenderer class is used to draw all wxWidgets controls. This is an ABC and + the look of the application is determined by the concrete derivation of + wxRenderer used in the program. + + It also contains a few static methods which may be used by the concrete + renderers and provide the functionality which is often similar or identical + in all renderers (using inheritance here would be more restrictive as the + given concrete renderer may need an arbitrary subset of the base class + methods). + + Finally note that wxRenderer supersedes wxRendererNative in wxUniv build and + includes the latters functionality (which it may delegate to the generic + implementation of the latter or reimplement itself). + */ + +#include "wx/renderer.h" + +class WXDLLEXPORT wxWindow; +class WXDLLEXPORT wxDC; +class WXDLLEXPORT wxCheckListBox; + +#if wxUSE_LISTBOX + class WXDLLEXPORT wxListBox; +#endif // wxUSE_LISTBOX + +#if wxUSE_MENUS + class WXDLLEXPORT wxMenu; + class WXDLLEXPORT wxMenuGeometryInfo; +#endif // wxUSE_MENUS + +class WXDLLEXPORT wxScrollBar; + +#if wxUSE_TEXTCTRL + class WXDLLEXPORT wxTextCtrl; +#endif + +#if wxUSE_GAUGE + class WXDLLEXPORT wxGauge; +#endif // wxUSE_GAUGE + +#include "wx/string.h" +#include "wx/gdicmn.h" +#include "wx/icon.h" + +// helper class used by wxMenu-related functions +class WXDLLEXPORT wxMenuGeometryInfo +{ +public: + // get the total size of the menu + virtual wxSize GetSize() const = 0; + + virtual ~wxMenuGeometryInfo(); +}; + +// ---------------------------------------------------------------------------- +// wxRenderer: abstract renderers interface +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxRenderer : public wxDelegateRendererNative +{ +public: + // drawing functions + // ----------------- + + // draw the controls background + virtual void DrawBackground(wxDC& dc, + const wxColour& col, + const wxRect& rect, + int flags, + wxWindow *window = NULL) = 0; + + // draw the button surface + virtual void DrawButtonSurface(wxDC& dc, + const wxColour& col, + const wxRect& rect, + int flags) = 0; + + + // draw the focus rectangle around the label contained in the given rect + // + // only wxCONTROL_SELECTED makes sense in flags here + virtual void DrawFocusRect(wxDC& dc, const wxRect& rect, int flags = 0) = 0; + + // draw the label inside the given rectangle with the specified alignment + // and optionally emphasize the character with the given index + virtual void DrawLabel(wxDC& dc, + const wxString& label, + const wxRect& rect, + int flags = 0, + int alignment = wxALIGN_LEFT | wxALIGN_TOP, + int indexAccel = -1, + wxRect *rectBounds = NULL) = 0; + + // same but also draw a bitmap if it is valid + virtual void DrawButtonLabel(wxDC& dc, + const wxString& label, + const wxBitmap& image, + const wxRect& rect, + int flags = 0, + int alignment = wxALIGN_LEFT | wxALIGN_TOP, + int indexAccel = -1, + wxRect *rectBounds = NULL) = 0; + + + // draw the border and optionally return the rectangle containing the + // region inside the border + virtual void DrawBorder(wxDC& dc, + wxBorder border, + const wxRect& rect, + int flags = 0, + wxRect *rectIn = (wxRect *)NULL) = 0; + + // draw text control border (I hate to have a separate method for this but + // it is needed to accommodate GTK+) + virtual void DrawTextBorder(wxDC& dc, + wxBorder border, + const wxRect& rect, + int flags = 0, + wxRect *rectIn = (wxRect *)NULL) = 0; + + // draw push button border and return the rectangle left for the label + virtual void DrawButtonBorder(wxDC& dc, + const wxRect& rect, + int flags = 0, + wxRect *rectIn = (wxRect *)NULL) = 0; + + // draw a horizontal line + virtual void DrawHorizontalLine(wxDC& dc, + wxCoord y, wxCoord x1, wxCoord x2) = 0; + + // draw a vertical line + virtual void DrawVerticalLine(wxDC& dc, + wxCoord x, wxCoord y1, wxCoord y2) = 0; + + // draw a frame with the label (horizontal alignment can be specified) + virtual void DrawFrame(wxDC& dc, + const wxString& label, + const wxRect& rect, + int flags = 0, + int alignment = wxALIGN_LEFT, + int indexAccel = -1) = 0; + + // draw an arrow in the given direction + virtual void DrawArrow(wxDC& dc, + wxDirection dir, + const wxRect& rect, + int flags = 0) = 0; + + // draw a scrollbar arrow (may be the same as arrow but may be not) + virtual void DrawScrollbarArrow(wxDC& dc, + wxDirection dir, + const wxRect& rect, + int flags = 0) = 0; + + // draw the scrollbar thumb + virtual void DrawScrollbarThumb(wxDC& dc, + wxOrientation orient, + const wxRect& rect, + int flags = 0) = 0; + + // draw a (part of) scrollbar shaft + virtual void DrawScrollbarShaft(wxDC& dc, + wxOrientation orient, + const wxRect& rect, + int flags = 0) = 0; + + // draw the rectangle in the corner between two scrollbars + virtual void DrawScrollCorner(wxDC& dc, + const wxRect& rect) = 0; + + // draw an item of a wxListBox + virtual void DrawItem(wxDC& dc, + const wxString& label, + const wxRect& rect, + int flags = 0) = 0; + + // draw an item of a wxCheckListBox + virtual void DrawCheckItem(wxDC& dc, + const wxString& label, + const wxBitmap& bitmap, + const wxRect& rect, + int flags = 0) = 0; + + // draw a checkbutton (bitmap may be invalid to use default one) + virtual void DrawCheckButton(wxDC& dc, + const wxString& label, + const wxBitmap& bitmap, + const wxRect& rect, + int flags = 0, + wxAlignment align = wxALIGN_LEFT, + int indexAccel = -1) = 0; + + // draw a radio button + virtual void DrawRadioButton(wxDC& dc, + const wxString& label, + const wxBitmap& bitmap, + const wxRect& rect, + int flags = 0, + wxAlignment align = wxALIGN_LEFT, + int indexAccel = -1) = 0; + +#if wxUSE_TOOLBAR + // draw a toolbar button (label may be empty, bitmap may be invalid, if + // both conditions are true this function draws a separator) + virtual void DrawToolBarButton(wxDC& dc, + const wxString& label, + const wxBitmap& bitmap, + const wxRect& rect, + int flags = 0, + long style = 0, + int tbarStyle = 0) = 0; +#endif // wxUSE_TOOLBAR + +#if wxUSE_TEXTCTRL + // draw a (part of) line in the text control + virtual void DrawTextLine(wxDC& dc, + const wxString& text, + const wxRect& rect, + int selStart = -1, + int selEnd = -1, + int flags = 0) = 0; + + // draw a line wrap indicator + virtual void DrawLineWrapMark(wxDC& dc, const wxRect& rect) = 0; +#endif // wxUSE_TEXTCTRL + +#if wxUSE_NOTEBOOK + // draw a notebook tab + virtual void DrawTab(wxDC& dc, + const wxRect& rect, + wxDirection dir, + const wxString& label, + const wxBitmap& bitmap = wxNullBitmap, + int flags = 0, + int indexAccel = -1) = 0; +#endif // wxUSE_NOTEBOOK + +#if wxUSE_SLIDER + + // draw the slider shaft + virtual void DrawSliderShaft(wxDC& dc, + const wxRect& rect, + int lenThumb, + wxOrientation orient, + int flags = 0, + long style = 0, + wxRect *rectShaft = NULL) = 0; + + // draw the slider thumb + virtual void DrawSliderThumb(wxDC& dc, + const wxRect& rect, + wxOrientation orient, + int flags = 0, + long style = 0) = 0; + + // draw the slider ticks + virtual void DrawSliderTicks(wxDC& dc, + const wxRect& rect, + int lenThumb, + wxOrientation orient, + int start, + int end, + int step = 1, + int flags = 0, + long style = 0) = 0; +#endif // wxUSE_SLIDER + +#if wxUSE_MENUS + // draw a menu bar item + virtual void DrawMenuBarItem(wxDC& dc, + const wxRect& rect, + const wxString& label, + int flags = 0, + int indexAccel = -1) = 0; + + // draw a menu item (also used for submenus if flags has ISSUBMENU flag) + // + // the geometryInfo is calculated by GetMenuGeometry() function from below + virtual void DrawMenuItem(wxDC& dc, + wxCoord y, + const wxMenuGeometryInfo& geometryInfo, + const wxString& label, + const wxString& accel, + const wxBitmap& bitmap = wxNullBitmap, + int flags = 0, + int indexAccel = -1) = 0; + + // draw a menu bar separator + virtual void DrawMenuSeparator(wxDC& dc, + wxCoord y, + const wxMenuGeometryInfo& geomInfo) = 0; +#endif // wxUSE_MENUS + +#if wxUSE_STATUSBAR + // draw a status bar field: wxCONTROL_ISDEFAULT bit in the flags is + // interpreted specially and means "draw the status bar grip" here + virtual void DrawStatusField(wxDC& dc, + const wxRect& rect, + const wxString& label, + int flags = 0, int style = 0) = 0; +#endif // wxUSE_STATUSBAR + + // draw complete frame/dialog titlebar + virtual void DrawFrameTitleBar(wxDC& dc, + const wxRect& rect, + const wxString& title, + const wxIcon& icon, + int flags, + int specialButton = 0, + int specialButtonFlags = 0) = 0; + + // draw frame borders + virtual void DrawFrameBorder(wxDC& dc, + const wxRect& rect, + int flags) = 0; + + // draw frame titlebar background + virtual void DrawFrameBackground(wxDC& dc, + const wxRect& rect, + int flags) = 0; + + // draw frame title + virtual void DrawFrameTitle(wxDC& dc, + const wxRect& rect, + const wxString& title, + int flags) = 0; + + // draw frame icon + virtual void DrawFrameIcon(wxDC& dc, + const wxRect& rect, + const wxIcon& icon, + int flags) = 0; + + // draw frame buttons + virtual void DrawFrameButton(wxDC& dc, + wxCoord x, wxCoord y, + int button, + int flags = 0) = 0; + + // misc functions + // -------------- + +#if wxUSE_COMBOBOX + // return the bitmaps to use for combobox button + virtual void GetComboBitmaps(wxBitmap *bmpNormal, + wxBitmap *bmpFocus, + wxBitmap *bmpPressed, + wxBitmap *bmpDisabled) = 0; +#endif // wxUSE_COMBOBOX + + // geometry functions + // ------------------ + + // get the dimensions of the border: rect.x/y contain the width/height of + // the left/top side, width/heigh - of the right/bottom one + virtual wxRect GetBorderDimensions(wxBorder border) const = 0; + + // the scrollbars may be drawn either inside the window border or outside + // it - this function is used to decide how to draw them + virtual bool AreScrollbarsInsideBorder() const = 0; + + // adjust the size of the control of the given class: for most controls, + // this just takes into account the border, but for some (buttons, for + // example) it is more complicated - the result being, in any case, that + // the control looks "nice" if it uses the adjusted rectangle + virtual void AdjustSize(wxSize *size, const wxWindow *window) = 0; + +#if wxUSE_SCROLLBAR + // get the size of a scrollbar arrow + virtual wxSize GetScrollbarArrowSize() const = 0; +#endif // wxUSE_SCROLLBAR + + // get the height of a listbox item from the base font height + virtual wxCoord GetListboxItemHeight(wxCoord fontHeight) = 0; + + // get the size of a checkbox/radio button bitmap + virtual wxSize GetCheckBitmapSize() const = 0; + virtual wxSize GetRadioBitmapSize() const = 0; + virtual wxCoord GetCheckItemMargin() const = 0; + +#if wxUSE_TOOLBAR + // get the standard size of a toolbar button and also return the size of + // a toolbar separator in the provided pointer + virtual wxSize GetToolBarButtonSize(wxCoord *separator) const = 0; + + // get the margins between/around the toolbar buttons + virtual wxSize GetToolBarMargin() const = 0; +#endif // wxUSE_TOOLBAR + +#if wxUSE_TEXTCTRL + // convert between text rectangle and client rectangle for text controls: + // the former is typicall smaller to leave margins around text + virtual wxRect GetTextTotalArea(const wxTextCtrl *text, + const wxRect& rectText) const = 0; + + // extra space is for line indicators + virtual wxRect GetTextClientArea(const wxTextCtrl *text, + const wxRect& rectTotal, + wxCoord *extraSpaceBeyond) const = 0; +#endif // wxUSE_TEXTCTRL + +#if wxUSE_NOTEBOOK + // get the overhang of a selected tab + virtual wxSize GetTabIndent() const = 0; + + // get the padding around the text in a tab + virtual wxSize GetTabPadding() const = 0; +#endif // wxUSE_NOTEBOOK + +#if wxUSE_SLIDER + // get the default size of the slider in lesser dimension (i.e. height of a + // horizontal slider or width of a vertical one) + virtual wxCoord GetSliderDim() const = 0; + + // get the length of the slider ticks displayed along side slider + virtual wxCoord GetSliderTickLen() const = 0; + + // get the slider shaft rect from the total slider rect + virtual wxRect GetSliderShaftRect(const wxRect& rect, + int lenThumb, + wxOrientation orient, + long style = 0) const = 0; + + // get the size of the slider thumb for the given total slider rect + virtual wxSize GetSliderThumbSize(const wxRect& rect, + int lenThumb, + wxOrientation orient) const = 0; +#endif // wxUSE_SLIDER + + // get the size of one progress bar step (in horz and vertical directions) + virtual wxSize GetProgressBarStep() const = 0; + +#if wxUSE_MENUS + // get the size of rectangle to use in the menubar for the given text rect + virtual wxSize GetMenuBarItemSize(const wxSize& sizeText) const = 0; + + // get the struct storing all layout info needed to draw all menu items + // (this can't be calculated for each item separately as they should be + // aligned) + // + // the returned pointer must be deleted by the caller + virtual wxMenuGeometryInfo *GetMenuGeometry(wxWindow *win, + const wxMenu& menu) const = 0; +#endif // wxUSE_MENUS + +#if wxUSE_STATUSBAR + // get the borders around the status bar fields (x and y fields of the + // return value) + virtual wxSize GetStatusBarBorders() const = 0; + + // get the border between the status bar fields + virtual wxCoord GetStatusBarBorderBetweenFields() const = 0; + + // get the mergin between a field and its border + virtual wxSize GetStatusBarFieldMargins() const = 0; +#endif // wxUSE_STATUSBAR + + // get client area rectangle of top level window (i.e. subtract + // decorations from given rectangle) + virtual wxRect GetFrameClientArea(const wxRect& rect, int flags) const = 0; + + // get size of whole top level window, given size of its client area size + virtual wxSize GetFrameTotalSize(const wxSize& clientSize, int flags) const = 0; + + // get the minimal size of top level window + virtual wxSize GetFrameMinSize(int flags) const = 0; + + // get titlebar icon size + virtual wxSize GetFrameIconSize() const = 0; + + // returns one of wxHT_TOPLEVEL_XXX constants + virtual int HitTestFrame(const wxRect& rect, + const wxPoint& pt, + int flags = 0) const = 0; + + // virtual dtor for any base class + virtual ~wxRenderer(); +}; + +// ---------------------------------------------------------------------------- +// wxDelegateRenderer: it is impossible to inherit from any of standard +// renderers as their declarations are in private code, but you can use this +// class to override only some of the Draw() functions - all the other ones +// will be left to the original renderer +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxDelegateRenderer : public wxRenderer +{ +public: + wxDelegateRenderer(wxRenderer *renderer) : m_renderer(renderer) { } + + virtual void DrawBackground(wxDC& dc, + const wxColour& col, + const wxRect& rect, + int flags, + wxWindow *window = NULL ) + { m_renderer->DrawBackground(dc, col, rect, flags, window ); } + virtual void DrawButtonSurface(wxDC& dc, + const wxColour& col, + const wxRect& rect, + int flags) + { m_renderer->DrawButtonSurface(dc, col, rect, flags); } + virtual void DrawFocusRect(wxDC& dc, const wxRect& rect, int flags = 0) + { m_renderer->DrawFocusRect(dc, rect, flags); } + virtual void DrawLabel(wxDC& dc, + const wxString& label, + const wxRect& rect, + int flags = 0, + int align = wxALIGN_LEFT | wxALIGN_TOP, + int indexAccel = -1, + wxRect *rectBounds = NULL) + { m_renderer->DrawLabel(dc, label, rect, + flags, align, indexAccel, rectBounds); } + virtual void DrawButtonLabel(wxDC& dc, + const wxString& label, + const wxBitmap& image, + const wxRect& rect, + int flags = 0, + int align = wxALIGN_LEFT | wxALIGN_TOP, + int indexAccel = -1, + wxRect *rectBounds = NULL) + { m_renderer->DrawButtonLabel(dc, label, image, rect, + flags, align, indexAccel, rectBounds); } + virtual void DrawBorder(wxDC& dc, + wxBorder border, + const wxRect& rect, + int flags = 0, + wxRect *rectIn = (wxRect *)NULL) + { m_renderer->DrawBorder(dc, border, rect, flags, rectIn); } + virtual void DrawTextBorder(wxDC& dc, + wxBorder border, + const wxRect& rect, + int flags = 0, + wxRect *rectIn = (wxRect *)NULL) + { m_renderer->DrawTextBorder(dc, border, rect, flags, rectIn); } + virtual void DrawButtonBorder(wxDC& dc, + const wxRect& rect, + int flags = 0, + wxRect *rectIn = (wxRect *)NULL) + { m_renderer->DrawButtonBorder(dc, rect, flags, rectIn); } + virtual void DrawFrame(wxDC& dc, + const wxString& label, + const wxRect& rect, + int flags = 0, + int align = wxALIGN_LEFT, + int indexAccel = -1) + { m_renderer->DrawFrame(dc, label, rect, flags, align, indexAccel); } + virtual void DrawHorizontalLine(wxDC& dc, + wxCoord y, wxCoord x1, wxCoord x2) + { m_renderer->DrawHorizontalLine(dc, y, x1, x2); } + virtual void DrawVerticalLine(wxDC& dc, + wxCoord x, wxCoord y1, wxCoord y2) + { m_renderer->DrawVerticalLine(dc, x, y1, y2); } + virtual void DrawArrow(wxDC& dc, + wxDirection dir, + const wxRect& rect, + int flags = 0) + { m_renderer->DrawArrow(dc, dir, rect, flags); } + virtual void DrawScrollbarArrow(wxDC& dc, + wxDirection dir, + const wxRect& rect, + int flags = 0) + { m_renderer->DrawScrollbarArrow(dc, dir, rect, flags); } + virtual void DrawScrollbarThumb(wxDC& dc, + wxOrientation orient, + const wxRect& rect, + int flags = 0) + { m_renderer->DrawScrollbarThumb(dc, orient, rect, flags); } + virtual void DrawScrollbarShaft(wxDC& dc, + wxOrientation orient, + const wxRect& rect, + int flags = 0) + { m_renderer->DrawScrollbarShaft(dc, orient, rect, flags); } + virtual void DrawScrollCorner(wxDC& dc, + const wxRect& rect) + { m_renderer->DrawScrollCorner(dc, rect); } + virtual void DrawItem(wxDC& dc, + const wxString& label, + const wxRect& rect, + int flags = 0) + { m_renderer->DrawItem(dc, label, rect, flags); } + virtual void DrawCheckItem(wxDC& dc, + const wxString& label, + const wxBitmap& bitmap, + const wxRect& rect, + int flags = 0) + { m_renderer->DrawCheckItem(dc, label, bitmap, rect, flags); } + virtual void DrawCheckButton(wxDC& dc, + const wxString& label, + const wxBitmap& bitmap, + const wxRect& rect, + int flags = 0, + wxAlignment align = wxALIGN_LEFT, + int indexAccel = -1) + { m_renderer->DrawCheckButton(dc, label, bitmap, rect, + flags, align, indexAccel); } + virtual void DrawRadioButton(wxDC& dc, + const wxString& label, + const wxBitmap& bitmap, + const wxRect& rect, + int flags = 0, + wxAlignment align = wxALIGN_LEFT, + int indexAccel = -1) + { m_renderer->DrawRadioButton(dc, label, bitmap, rect, + flags, align, indexAccel); } +#if wxUSE_TOOLBAR + virtual void DrawToolBarButton(wxDC& dc, + const wxString& label, + const wxBitmap& bitmap, + const wxRect& rect, + int flags = 0, + long style = 0, + int tbarStyle = 0) + { m_renderer->DrawToolBarButton(dc, label, bitmap, rect, flags, style, tbarStyle); } +#endif // wxUSE_TOOLBAR + +#if wxUSE_TEXTCTRL + virtual void DrawTextLine(wxDC& dc, + const wxString& text, + const wxRect& rect, + int selStart = -1, + int selEnd = -1, + int flags = 0) + { m_renderer->DrawTextLine(dc, text, rect, selStart, selEnd, flags); } + virtual void DrawLineWrapMark(wxDC& dc, const wxRect& rect) + { m_renderer->DrawLineWrapMark(dc, rect); } +#endif // wxUSE_TEXTCTRL + +#if wxUSE_NOTEBOOK + virtual void DrawTab(wxDC& dc, + const wxRect& rect, + wxDirection dir, + const wxString& label, + const wxBitmap& bitmap = wxNullBitmap, + int flags = 0, + int accel = -1) + { m_renderer->DrawTab(dc, rect, dir, label, bitmap, flags, accel); } +#endif // wxUSE_NOTEBOOK + +#if wxUSE_SLIDER + + virtual void DrawSliderShaft(wxDC& dc, + const wxRect& rect, + int lenThumb, + wxOrientation orient, + int flags = 0, + long style = 0, + wxRect *rectShaft = NULL) + { m_renderer->DrawSliderShaft(dc, rect, lenThumb, orient, flags, style, rectShaft); } + virtual void DrawSliderThumb(wxDC& dc, + const wxRect& rect, + wxOrientation orient, + int flags = 0, + long style = 0) + { m_renderer->DrawSliderThumb(dc, rect, orient, flags, style); } + virtual void DrawSliderTicks(wxDC& dc, + const wxRect& rect, + int lenThumb, + wxOrientation orient, + int start, + int end, + int WXUNUSED(step) = 1, + int flags = 0, + long style = 0) + { m_renderer->DrawSliderTicks(dc, rect, lenThumb, orient, + start, end, start, flags, style); } +#endif // wxUSE_SLIDER + +#if wxUSE_MENUS + virtual void DrawMenuBarItem(wxDC& dc, + const wxRect& rect, + const wxString& label, + int flags = 0, + int indexAccel = -1) + { m_renderer->DrawMenuBarItem(dc, rect, label, flags, indexAccel); } + virtual void DrawMenuItem(wxDC& dc, + wxCoord y, + const wxMenuGeometryInfo& gi, + const wxString& label, + const wxString& accel, + const wxBitmap& bitmap = wxNullBitmap, + int flags = 0, + int indexAccel = -1) + { m_renderer->DrawMenuItem(dc, y, gi, label, accel, + bitmap, flags, indexAccel); } + virtual void DrawMenuSeparator(wxDC& dc, + wxCoord y, + const wxMenuGeometryInfo& geomInfo) + { m_renderer->DrawMenuSeparator(dc, y, geomInfo); } +#endif // wxUSE_MENUS + +#if wxUSE_STATUSBAR + virtual void DrawStatusField(wxDC& dc, + const wxRect& rect, + const wxString& label, + int flags = 0, int style = 0) + { m_renderer->DrawStatusField(dc, rect, label, flags, style); } +#endif // wxUSE_STATUSBAR + + virtual void DrawFrameTitleBar(wxDC& dc, + const wxRect& rect, + const wxString& title, + const wxIcon& icon, + int flags, + int specialButton = 0, + int specialButtonFlag = 0) + { m_renderer->DrawFrameTitleBar(dc, rect, title, icon, flags, + specialButton, specialButtonFlag); } + virtual void DrawFrameBorder(wxDC& dc, + const wxRect& rect, + int flags) + { m_renderer->DrawFrameBorder(dc, rect, flags); } + virtual void DrawFrameBackground(wxDC& dc, + const wxRect& rect, + int flags) + { m_renderer->DrawFrameBackground(dc, rect, flags); } + virtual void DrawFrameTitle(wxDC& dc, + const wxRect& rect, + const wxString& title, + int flags) + { m_renderer->DrawFrameTitle(dc, rect, title, flags); } + virtual void DrawFrameIcon(wxDC& dc, + const wxRect& rect, + const wxIcon& icon, + int flags) + { m_renderer->DrawFrameIcon(dc, rect, icon, flags); } + virtual void DrawFrameButton(wxDC& dc, + wxCoord x, wxCoord y, + int button, + int flags = 0) + { m_renderer->DrawFrameButton(dc, x, y, button, flags); } + +#if wxUSE_COMBOBOX + virtual void GetComboBitmaps(wxBitmap *bmpNormal, + wxBitmap *bmpFocus, + wxBitmap *bmpPressed, + wxBitmap *bmpDisabled) + { m_renderer->GetComboBitmaps(bmpNormal, bmpFocus, + bmpPressed, bmpDisabled); } +#endif // wxUSE_COMBOBOX + + virtual void AdjustSize(wxSize *size, const wxWindow *window) + { m_renderer->AdjustSize(size, window); } + virtual wxRect GetBorderDimensions(wxBorder border) const + { return m_renderer->GetBorderDimensions(border); } + virtual bool AreScrollbarsInsideBorder() const + { return m_renderer->AreScrollbarsInsideBorder(); } + +#if wxUSE_SCROLLBAR + virtual wxSize GetScrollbarArrowSize() const + { return m_renderer->GetScrollbarArrowSize(); } +#endif // wxUSE_SCROLLBAR + + virtual wxCoord GetListboxItemHeight(wxCoord fontHeight) + { return m_renderer->GetListboxItemHeight(fontHeight); } + virtual wxSize GetCheckBitmapSize() const + { return m_renderer->GetCheckBitmapSize(); } + virtual wxSize GetRadioBitmapSize() const + { return m_renderer->GetRadioBitmapSize(); } + virtual wxCoord GetCheckItemMargin() const + { return m_renderer->GetCheckItemMargin(); } + +#if wxUSE_TOOLBAR + virtual wxSize GetToolBarButtonSize(wxCoord *separator) const + { return m_renderer->GetToolBarButtonSize(separator); } + virtual wxSize GetToolBarMargin() const + { return m_renderer->GetToolBarMargin(); } +#endif // wxUSE_TOOLBAR + +#if wxUSE_TEXTCTRL + virtual wxRect GetTextTotalArea(const wxTextCtrl *text, + const wxRect& rect) const + { return m_renderer->GetTextTotalArea(text, rect); } + virtual wxRect GetTextClientArea(const wxTextCtrl *text, + const wxRect& rect, + wxCoord *extraSpaceBeyond) const + { return m_renderer->GetTextClientArea(text, rect, extraSpaceBeyond); } +#endif // wxUSE_TEXTCTRL + +#if wxUSE_NOTEBOOK + virtual wxSize GetTabIndent() const { return m_renderer->GetTabIndent(); } + virtual wxSize GetTabPadding() const { return m_renderer->GetTabPadding(); } +#endif // wxUSE_NOTEBOOK + +#if wxUSE_SLIDER + virtual wxCoord GetSliderDim() const + { return m_renderer->GetSliderDim(); } + virtual wxCoord GetSliderTickLen() const + { return m_renderer->GetSliderTickLen(); } + + virtual wxRect GetSliderShaftRect(const wxRect& rect, + int lenThumb, + wxOrientation orient, + long style = 0) const + { return m_renderer->GetSliderShaftRect(rect, lenThumb, orient, style); } + virtual wxSize GetSliderThumbSize(const wxRect& rect, + int lenThumb, + wxOrientation orient) const + { return m_renderer->GetSliderThumbSize(rect, lenThumb, orient); } +#endif // wxUSE_SLIDER + + virtual wxSize GetProgressBarStep() const + { return m_renderer->GetProgressBarStep(); } + +#if wxUSE_MENUS + virtual wxSize GetMenuBarItemSize(const wxSize& sizeText) const + { return m_renderer->GetMenuBarItemSize(sizeText); } + virtual wxMenuGeometryInfo *GetMenuGeometry(wxWindow *win, + const wxMenu& menu) const + { return m_renderer->GetMenuGeometry(win, menu); } +#endif // wxUSE_MENUS + +#if wxUSE_STATUSBAR + virtual wxSize GetStatusBarBorders() const + { return m_renderer->GetStatusBarBorders(); } + virtual wxCoord GetStatusBarBorderBetweenFields() const + { return m_renderer->GetStatusBarBorderBetweenFields(); } + virtual wxSize GetStatusBarFieldMargins() const + { return m_renderer->GetStatusBarFieldMargins(); } +#endif // wxUSE_STATUSBAR + + virtual wxRect GetFrameClientArea(const wxRect& rect, int flags) const + { return m_renderer->GetFrameClientArea(rect, flags); } + virtual wxSize GetFrameTotalSize(const wxSize& clientSize, int flags) const + { return m_renderer->GetFrameTotalSize(clientSize, flags); } + virtual wxSize GetFrameMinSize(int flags) const + { return m_renderer->GetFrameMinSize(flags); } + virtual wxSize GetFrameIconSize() const + { return m_renderer->GetFrameIconSize(); } + virtual int HitTestFrame(const wxRect& rect, + const wxPoint& pt, + int flags) const + { return m_renderer->HitTestFrame(rect, pt, flags); } + + virtual int DrawHeaderButton(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags = 0, + wxHeaderSortIconType sortIcon = wxHDR_SORT_ICON_NONE, + wxHeaderButtonParams* params = NULL) + { return m_renderer->DrawHeaderButton(win, dc, rect, flags, sortIcon, params); } + virtual void DrawTreeItemButton(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags = 0) + { m_renderer->DrawTreeItemButton(win, dc, rect, flags); } + +protected: + wxRenderer *m_renderer; +}; + +// ---------------------------------------------------------------------------- +// wxControlRenderer: wraps the wxRenderer functions in a form easy to use from +// OnPaint() +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxControlRenderer +{ +public: + // create a renderer for this dc with this "fundamental" renderer + wxControlRenderer(wxWindow *control, wxDC& dc, wxRenderer *renderer); + + // operations + void DrawLabel(const wxBitmap& bitmap = wxNullBitmap, + wxCoord marginX = 0, wxCoord marginY = 0); +#if wxUSE_LISTBOX + void DrawItems(const wxListBox *listbox, + size_t itemFirst, size_t itemLast); +#endif // wxUSE_LISTBOX +#if wxUSE_CHECKLISTBOX + void DrawCheckItems(const wxCheckListBox *listbox, + size_t itemFirst, size_t itemLast); +#endif // wxUSE_CHECKLISTBOX + void DrawButtonBorder(); + // the line must be either horizontal or vertical + void DrawLine(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2); + void DrawFrame(); + void DrawBitmap(const wxBitmap& bitmap); + void DrawBackgroundBitmap(); + void DrawScrollbar(const wxScrollBar *scrollbar, int thumbPosOld); +#if wxUSE_GAUGE + void DrawProgressBar(const wxGauge *gauge); +#endif // wxUSE_GAUGE + + // accessors + wxWindow *GetWindow() const { return m_window; } + wxRenderer *GetRenderer() const { return m_renderer; } + + wxDC& GetDC() { return m_dc; } + + const wxRect& GetRect() const { return m_rect; } + wxRect& GetRect() { return m_rect; } + + // static helpers + static void DrawBitmap(wxDC &dc, + const wxBitmap& bitmap, + const wxRect& rect, + int alignment = wxALIGN_CENTRE | + wxALIGN_CENTRE_VERTICAL, + wxStretch stretch = wxSTRETCH_NOT); + +private: + +#if wxUSE_LISTBOX + // common part of DrawItems() and DrawCheckItems() + void DoDrawItems(const wxListBox *listbox, + size_t itemFirst, size_t itemLast, + bool isCheckLbox = false); +#endif // wxUSE_LISTBOX + + wxWindow *m_window; + wxRenderer *m_renderer; + wxDC& m_dc; + wxRect m_rect; +}; + +#endif // _WX_UNIV_RENDERER_H_ diff --git a/Externals/wxWidgets/include/wx/univ/scrarrow.h b/Externals/wxWidgets/include/wx/univ/scrarrow.h new file mode 100644 index 0000000000..67e95cf560 --- /dev/null +++ b/Externals/wxWidgets/include/wx/univ/scrarrow.h @@ -0,0 +1,112 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/univ/scrarrow.h +// Purpose: wxScrollArrows class +// Author: Vadim Zeitlin +// Modified by: +// Created: 22.01.01 +// RCS-ID: $Id: scrarrow.h 42715 2006-10-30 12:24:13Z VS $ +// Copyright: (c) 2001 SciTech Software, Inc. (www.scitechsoft.com) +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIV_SCRARROW_H_ +#define _WX_UNIV_SCRARROW_H_ + +// ---------------------------------------------------------------------------- +// wxScrollArrows is not a control but just a class containing the common +// functionality of scroll arrows, whether part of scrollbars, spin ctrls or +// anything else. +// +// To customize its behaviour, wxScrollArrows doesn't use any virtual methods +// but instead a callback pointer to a wxControlWithArrows object which is used +// for all control-dependent stuff. Thus, to use wxScrollArrows, you just need +// to derive from the wxControlWithArrows interface and implement its methods. +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxControlWithArrows; +class WXDLLEXPORT wxDC; +class WXDLLEXPORT wxMouseEvent; +class WXDLLEXPORT wxRect; +class WXDLLEXPORT wxRenderer; + +// ---------------------------------------------------------------------------- +// wxScrollArrows: an abstraction of scrollbar arrow +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxScrollArrows +{ +public: + enum Arrow + { + Arrow_None = -1, + Arrow_First, // left or top + Arrow_Second, // right or bottom + Arrow_Max + }; + + // ctor requires a back pointer to wxControlWithArrows + wxScrollArrows(wxControlWithArrows *control); + + // draws the arrow on the given DC in the given rectangle, uses + // wxControlWithArrows::GetArrowState() to get its current state + void DrawArrow(Arrow arrow, wxDC& dc, const wxRect& rect, + bool scrollbarLike = false) const; + + // process a mouse move, enter or leave event, possibly calling + // wxControlWithArrows::SetArrowState() if + // wxControlWithArrows::HitTestArrow() says that the mouse has left/entered + // an arrow + bool HandleMouseMove(const wxMouseEvent& event) const; + + // process a mouse click event + bool HandleMouse(const wxMouseEvent& event) const; + + // dtor + ~wxScrollArrows(); + +private: + // set or clear the wxCONTROL_CURRENT flag for the arrow + void UpdateCurrentFlag(Arrow arrow, Arrow arrowCur) const; + + // the main control + wxControlWithArrows *m_control; + + // the data for the mouse capture + struct wxScrollArrowCaptureData *m_captureData; +}; + +// ---------------------------------------------------------------------------- +// wxControlWithArrows: interface implemented by controls using wxScrollArrows +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxControlWithArrows +{ +public: + virtual ~wxControlWithArrows() {} + + // get the renderer to use for drawing the arrows + virtual wxRenderer *GetRenderer() const = 0; + + // get the controls window (used for mouse capturing) + virtual wxWindow *GetWindow() = 0; + + // get the orientation of the arrows (vertical or horizontal) + virtual bool IsVertical() const = 0; + + // get the state of this arrow as combination of wxCONTROL_XXX flags + virtual int GetArrowState(wxScrollArrows::Arrow arrow) const = 0; + + // set or clear the specified flag in the arrow state: this function is + // responsible for refreshing the control + virtual void SetArrowFlag(wxScrollArrows::Arrow arrow, + int flag, bool set = true) = 0; + + // hit testing: return on which arrow the point is (or Arrow_None) + virtual wxScrollArrows::Arrow HitTestArrow(const wxPoint& pt) const = 0; + + // called when the arrow is pressed, return true to continue scrolling and + // false to stop it + virtual bool OnArrow(wxScrollArrows::Arrow arrow) = 0; +}; + +#endif // _WX_UNIV_SCRARROW_H_ diff --git a/Externals/wxWidgets/include/wx/univ/scrolbar.h b/Externals/wxWidgets/include/wx/univ/scrolbar.h new file mode 100644 index 0000000000..43b1872efa --- /dev/null +++ b/Externals/wxWidgets/include/wx/univ/scrolbar.h @@ -0,0 +1,283 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/univ/scrolbar.h +// Purpose: wxScrollBar for wxUniversal +// Author: Vadim Zeitlin +// Modified by: +// Created: 20.08.00 +// RCS-ID: $Id: scrolbar.h 42716 2006-10-30 12:33:25Z VS $ +// Copyright: (c) 2000 SciTech Software, Inc. (www.scitechsoft.com) +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIV_SCROLBAR_H_ +#define _WX_UNIV_SCROLBAR_H_ + +class WXDLLEXPORT wxScrollTimer; + +#include "wx/univ/scrarrow.h" +#include "wx/renderer.h" + +// ---------------------------------------------------------------------------- +// the actions supported by this control +// ---------------------------------------------------------------------------- + +// scroll the bar +#define wxACTION_SCROLL_START _T("start") // to the beginning +#define wxACTION_SCROLL_END _T("end") // to the end +#define wxACTION_SCROLL_LINE_UP _T("lineup") // one line up/left +#define wxACTION_SCROLL_PAGE_UP _T("pageup") // one page up/left +#define wxACTION_SCROLL_LINE_DOWN _T("linedown") // one line down/right +#define wxACTION_SCROLL_PAGE_DOWN _T("pagedown") // one page down/right + +// the scrollbar thumb may be dragged +#define wxACTION_SCROLL_THUMB_DRAG _T("thumbdrag") +#define wxACTION_SCROLL_THUMB_MOVE _T("thumbmove") +#define wxACTION_SCROLL_THUMB_RELEASE _T("thumbrelease") + +// ---------------------------------------------------------------------------- +// wxScrollBar +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxScrollBar : public wxScrollBarBase, + public wxControlWithArrows +{ +public: + // scrollbar elements: they correspond to wxHT_SCROLLBAR_XXX constants but + // start from 0 which allows to use them as array indices + enum Element + { + Element_Arrow_Line_1, + Element_Arrow_Line_2, + Element_Arrow_Page_1, + Element_Arrow_Page_2, + Element_Thumb, + Element_Bar_1, + Element_Bar_2, + Element_Max + }; + + wxScrollBar(); + wxScrollBar(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxSB_HORIZONTAL, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxScrollBarNameStr); + + bool Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxSB_HORIZONTAL, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxScrollBarNameStr); + + virtual ~wxScrollBar(); + + // implement base class pure virtuals + virtual int GetThumbPosition() const; + virtual int GetThumbSize() const; + virtual int GetPageSize() const; + virtual int GetRange() const; + + virtual void SetThumbPosition(int thumbPos); + virtual void SetScrollbar(int position, int thumbSize, + int range, int pageSize, + bool refresh = true); + + // wxScrollBar actions + void ScrollToStart(); + void ScrollToEnd(); + bool ScrollLines(int nLines); + bool ScrollPages(int nPages); + + virtual bool PerformAction(const wxControlAction& action, + long numArg = 0, + const wxString& strArg = wxEmptyString); + + static wxInputHandler *GetStdInputHandler(wxInputHandler *handlerDef); + virtual wxInputHandler *DoGetStdInputHandler(wxInputHandler *handlerDef) + { + return GetStdInputHandler(handlerDef); + } + + // scrollbars around a normal window should not receive the focus + virtual bool AcceptsFocus() const; + + // wxScrollBar sub elements state (combination of wxCONTROL_XXX) + void SetState(Element which, int flags); + int GetState(Element which) const; + + // implement wxControlWithArrows methods + virtual wxRenderer *GetRenderer() const { return m_renderer; } + virtual wxWindow *GetWindow() { return this; } + virtual bool IsVertical() const { return wxScrollBarBase::IsVertical(); } + virtual int GetArrowState(wxScrollArrows::Arrow arrow) const; + virtual void SetArrowFlag(wxScrollArrows::Arrow arrow, int flag, bool set); + virtual bool OnArrow(wxScrollArrows::Arrow arrow); + virtual wxScrollArrows::Arrow HitTestArrow(const wxPoint& pt) const; + + // for wxControlRenderer::DrawScrollbar() only + const wxScrollArrows& GetArrows() const { return m_arrows; } + + // returns one of wxHT_SCROLLBAR_XXX constants + wxHitTest HitTestBar(const wxPoint& pt) const; + + // idle processing + virtual void OnInternalIdle(); + +protected: + virtual wxSize DoGetBestClientSize() const; + virtual void DoDraw(wxControlRenderer *renderer); + virtual wxBorder GetDefaultBorder() const { return wxBORDER_NONE; } + + // forces update of thumb's visual appearence (does nothing if m_dirty=false) + void UpdateThumb(); + + // SetThumbPosition() helper + void DoSetThumb(int thumbPos); + + // common part of all ctors + void Init(); + + // is this scrollbar attached to a window or a standalone control? + bool IsStandalone() const; + + // scrollbar geometry methods: + + // gets the bounding box for a scrollbar element for the given (by default + // - current) thumb position + wxRect GetScrollbarRect(wxScrollBar::Element elem, int thumbPos = -1) const; + + // returns the size of the scrollbar shaft excluding the arrows + wxCoord GetScrollbarSize() const; + + // translate the scrollbar position (in logical units) into physical + // coordinate (in pixels) and the other way round + wxCoord ScrollbarToPixel(int thumbPos = -1); + int PixelToScrollbar(wxCoord coord); + + // return the starting and ending positions, in pixels, of the thumb of a + // scrollbar with the given logical position, thumb size and range and the + // given physical length + static void GetScrollBarThumbSize(wxCoord length, + int thumbPos, + int thumbSize, + int range, + wxCoord *thumbStart, + wxCoord *thumbEnd); + +private: + // total range of the scrollbar in logical units + int m_range; + + // the current and previous (after last refresh - this is used for + // repainting optimisation) size of the thumb in logical units (from 0 to + // m_range) and its position (from 0 to m_range - m_thumbSize) + int m_thumbSize, + m_thumbPos, + m_thumbPosOld; + + // the page size, i.e. the number of lines by which to scroll when page + // up/down action is performed + int m_pageSize; + + // the state of the sub elements + int m_elementsState[Element_Max]; + + // the dirty flag: if set, scrollbar must be updated + bool m_dirty; + + // the object handling the arrows + wxScrollArrows m_arrows; + + friend WXDLLEXPORT class wxControlRenderer; // for geometry methods + friend class wxStdScrollBarInputHandler; // for geometry methods + + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS(wxScrollBar) +}; + +// ---------------------------------------------------------------------------- +// Standard scrollbar input handler which can be used as a base class +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxStdScrollBarInputHandler : public wxStdInputHandler +{ +public: + // constructor takes a renderer (used for scrollbar hit testing) and the + // base handler to which all unhandled events are forwarded + wxStdScrollBarInputHandler(wxRenderer *renderer, + wxInputHandler *inphand); + + virtual bool HandleKey(wxInputConsumer *consumer, + const wxKeyEvent& event, + bool pressed); + virtual bool HandleMouse(wxInputConsumer *consumer, + const wxMouseEvent& event); + virtual bool HandleMouseMove(wxInputConsumer *consumer, const wxMouseEvent& event); + + virtual ~wxStdScrollBarInputHandler(); + + // this method is called by wxScrollBarTimer only and may be overridden + // + // return true to continue scrolling, false to stop the timer + virtual bool OnScrollTimer(wxScrollBar *scrollbar, + const wxControlAction& action); + +protected: + // return true if the mouse button can be used to activate scrollbar, false + // if not (any button under GTK+ unlike left button only which is default) + virtual bool IsAllowedButton(int button) const + { return button == wxMOUSE_BTN_LEFT; } + + // set or clear the specified flag on the scrollbar element corresponding + // to m_htLast + void SetElementState(wxScrollBar *scrollbar, int flag, bool doIt); + + // [un]highlight the scrollbar element corresponding to m_htLast + virtual void Highlight(wxScrollBar *scrollbar, bool doIt) + { SetElementState(scrollbar, wxCONTROL_CURRENT, doIt); } + + // [un]press the scrollbar element corresponding to m_htLast + virtual void Press(wxScrollBar *scrollbar, bool doIt) + { SetElementState(scrollbar, wxCONTROL_PRESSED, doIt); } + + // stop scrolling because we reached the end point + void StopScrolling(wxScrollBar *scrollbar); + + // get the mouse coordinates in the scrollbar direction from the event + wxCoord GetMouseCoord(const wxScrollBar *scrollbar, + const wxMouseEvent& event) const; + + // generate a "thumb move" action for this mouse event + void HandleThumbMove(wxScrollBar *scrollbar, const wxMouseEvent& event); + + + // the window (scrollbar) which has capture or NULL and the flag telling if + // the mouse is inside the element which captured it or not + wxWindow *m_winCapture; + bool m_winHasMouse; + int m_btnCapture; // the mouse button which has captured mouse + + // the position where we started scrolling by page + wxPoint m_ptStartScrolling; + + // one of wxHT_SCROLLBAR_XXX value: where has the mouse been last time? + wxHitTest m_htLast; + + // the renderer (we use it only for hit testing) + wxRenderer *m_renderer; + + // the offset of the top/left of the scrollbar relative to the mouse to + // keep during the thumb drag + int m_ofsMouse; + + // the timer for generating scroll events when the mouse stays pressed on + // a scrollbar + wxScrollTimer *m_timerScroll; +}; + +#endif // _WX_UNIV_SCROLBAR_H_ + diff --git a/Externals/wxWidgets/include/wx/univ/scrthumb.h b/Externals/wxWidgets/include/wx/univ/scrthumb.h new file mode 100644 index 0000000000..6bb4d2627c --- /dev/null +++ b/Externals/wxWidgets/include/wx/univ/scrthumb.h @@ -0,0 +1,140 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/univ/scrthumb.h +// Purpose: wxScrollThumb class +// Author: Vadim Zeitlin +// Modified by: +// Created: 12.02.01 +// RCS-ID: $Id: scrthumb.h 37168 2006-01-26 19:35:32Z ABX $ +// Copyright: (c) 2001 SciTech Software, Inc. (www.scitechsoft.com) +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIV_SCRTHUMB_H_ +#define _WX_UNIV_SCRTHUMB_H_ + +// ---------------------------------------------------------------------------- +// wxScrollThumb is not a control but just a class containing the common +// functionality of scroll thumb such as used by scrollbars, sliders and maybe +// other (user) controls +// +// This class is similar to wxScrollThumb. +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxControlWithThumb; +class WXDLLEXPORT wxMouseEvent; +class WXDLLEXPORT wxRect; +class WXDLLEXPORT wxScrollTimer; + +#include "wx/timer.h" + +// ---------------------------------------------------------------------------- +// wxScrollThumb: an abstraction of scrollbar thumb +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxScrollThumb +{ +public: + enum Shaft + { + Shaft_None = -1, + Shaft_Above, // or to the left of the thumb + Shaft_Below, // or to the right of the thumb + Shaft_Thumb, // on the thumb + Shaft_Max + }; + + // ctor requires a back pointer to wxControlWithThumb + wxScrollThumb(wxControlWithThumb *control); + + // process a mouse click: will capture the mouse if the button was pressed + // on either the thumb (start dragging it then) or the shaft (start + // scrolling) + bool HandleMouse(const wxMouseEvent& event) const; + + // process a mouse move + bool HandleMouseMove(const wxMouseEvent& event) const; + + // dtor + ~wxScrollThumb(); + +private: + // do we have the mouse capture? + bool HasCapture() const { return m_captureData != NULL; } + + // get the coord of this event in the direction we're interested in (y for + // vertical shaft or x for horizontal ones) + wxCoord GetMouseCoord(const wxMouseEvent& event) const; + + // get the position of the thumb corresponding to the current mouse + // position (can only be called while we're dragging the thumb!) + int GetThumbPos(const wxMouseEvent& event) const; + + // the main control + wxControlWithThumb *m_control; + + // the part of it where the mouse currently is + Shaft m_shaftPart; + + // the data for the mouse capture + struct WXDLLEXPORT wxScrollThumbCaptureData *m_captureData; +}; + +// ---------------------------------------------------------------------------- +// wxControlWithThumb: interface implemented by controls using wxScrollThumb +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxControlWithThumb +{ +public: + virtual ~wxControlWithThumb() {} + + // simple accessors + // ---------------- + + // get the controls window (used for mouse capturing) + virtual wxWindow *GetWindow() = 0; + + // get the orientation of the shaft (vertical or horizontal) + virtual bool IsVertical() const = 0; + + // geometry functions + // ------------------ + + // hit testing: return part of the shaft the point is in (or Shaft_None) + virtual wxScrollThumb::Shaft HitTest(const wxPoint& pt) const = 0; + + // get the current position in pixels of the thumb + virtual wxCoord ThumbPosToPixel() const = 0; + + // transform from pixel offset to the thumb logical position + virtual int PixelToThumbPos(wxCoord x) const = 0; + + // callbacks + // --------- + + // set or clear the specified flag in the arrow state: this function is + // responsible for refreshing the control + virtual void SetShaftPartState(wxScrollThumb::Shaft shaftPart, + int flag, + bool set = true) = 0; + + // called when the user starts dragging the thumb + virtual void OnThumbDragStart(int pos) = 0; + + // called while the user drags the thumb + virtual void OnThumbDrag(int pos) = 0; + + // called when the user stops dragging the thumb + virtual void OnThumbDragEnd(int pos) = 0; + + // called before starting to call OnPageScroll() - gives the control the + // possibility to remember its current state + virtual void OnPageScrollStart() = 0; + + // called while the user keeps the mouse pressed above/below the thumb, + // return true to continue scrollign and false to stop it (e.g. because the + // scrollbar has reached the top/bottom) + virtual bool OnPageScroll(int pageInc) = 0; +}; + +#endif // _WX_UNIV_SCRTHUMB_H_ diff --git a/Externals/wxWidgets/include/wx/univ/scrtimer.h b/Externals/wxWidgets/include/wx/univ/scrtimer.h new file mode 100644 index 0000000000..bb16f465b9 --- /dev/null +++ b/Externals/wxWidgets/include/wx/univ/scrtimer.h @@ -0,0 +1,51 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/univ/scrtimer.h +// Purpose: wxScrollTimer: small helper class for wxScrollArrow/Thumb +// Author: Vadim Zeitlin +// Modified by: +// Created: 18.02.01 +// RCS-ID: $Id: scrtimer.h 39633 2006-06-08 11:25:30Z ABX $ +// Copyright: (c) 2001 SciTech Software, Inc. (www.scitechsoft.com) +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIV_SCRTIMER_H +#define _WX_UNIV_SCRTIMER_H + +// NB: this class is implemented in scrolbar.cpp + +#include "wx/defs.h" + +#if wxUSE_TIMER + +#include "wx/timer.h" + +// ---------------------------------------------------------------------------- +// wxScrollTimer: the timer used when the arrow or scrollbar shaft is kept +// pressed +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxScrollTimer : public wxTimer +{ +public: + // default ctor + wxScrollTimer(); + + // start generating the events + void StartAutoScroll(); + + // the base class method + virtual void Notify(); + +protected: + // to implement in derived classes: perform the scroll action and return + // true to continue scrolling or false to stop + virtual bool DoNotify() = 0; + + // should we skip the next timer event? + bool m_skipNext; +}; + +#endif // wxUSE_TIMER + +#endif // _WX_UNIV_SCRTIMER_H diff --git a/Externals/wxWidgets/include/wx/univ/setup.h b/Externals/wxWidgets/include/wx/univ/setup.h new file mode 100644 index 0000000000..39b9cba8d5 --- /dev/null +++ b/Externals/wxWidgets/include/wx/univ/setup.h @@ -0,0 +1,1328 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/univ/setup.h +// Purpose: configuration settings for wxUniversal/MSW +// Author: Vadim Zeitlin +// Modified by: +// Created: 14.08.00 +// RCS-ID: $Id: setup0.h 49997 2007-11-16 16:14:49Z CE $ +// Copyright: (c) 2000 SciTech Software, Inc. (www.scitechsoft.com) +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIV_SETUP_H_ +#define _WX_UNIV_SETUP_H_ + +// ---------------------------------------------------------------------------- +// global settings +// ---------------------------------------------------------------------------- + +// define this to 0 when building wxBase library - this can also be done from +// makefile/project file overriding the value here +#ifndef wxUSE_GUI + #define wxUSE_GUI 1 +#endif // wxUSE_GUI + +// ---------------------------------------------------------------------------- +// compatibility settings +// ---------------------------------------------------------------------------- + +// This setting determines the compatibility with 2.4 API: set it to 1 to +// enable it +// +// Default is 0. +// +// Recommended setting: 0 (please update your code instead!) +#define WXWIN_COMPATIBILITY_2_4 0 + +// This setting determines the compatibility with 2.6 API: set it to 0 to +// flag all cases of using deprecated functions. +// +// Default is 1 but please try building your code with 0 as the default will +// change to 0 in the next version and the deprecated functions will disappear +// in the version after it completely. +// +// Recommended setting: 0 (please update your code) +#define WXWIN_COMPATIBILITY_2_6 1 + +// Set to 0 for accurate dialog units, else 1 to be as per 2.1.16 and before. +// If migrating between versions, your dialogs may seem to shrink. +// +// Default is 1 +// +// Recommended setting: 0 (the new calculations are more correct!) +#define wxDIALOG_UNIT_COMPATIBILITY 0 + +// ---------------------------------------------------------------------------- +// debugging settings +// ---------------------------------------------------------------------------- + +// Generic comment about debugging settings: they are very useful if you don't +// use any other memory leak detection tools such as Purify/BoundsChecker, but +// are probably redundant otherwise. Also, Visual C++ CRT has the same features +// as wxWidgets memory debugging subsystem built in since version 5.0 and you +// may prefer to use it instead of built in memory debugging code because it is +// faster and more fool proof. +// +// Using VC++ CRT memory debugging is enabled by default in debug mode +// (__WXDEBUG__) if wxUSE_GLOBAL_MEMORY_OPERATORS is *not* enabled (i.e. is 0) +// and if __NO_VC_CRTDBG__ is not defined. + +// If 1, enables wxDebugContext, for writing error messages to file, etc. If +// __WXDEBUG__ is not defined, will still use the normal memory operators. +// +// Default is 0 +// +// Recommended setting: 0 +#ifdef __MWERKS__ + #define wxUSE_DEBUG_CONTEXT 1 +#else + #define wxUSE_DEBUG_CONTEXT 0 +#endif + +// If 1, enables debugging versions of wxObject::new and wxObject::delete *IF* +// __WXDEBUG__ is also defined. +// +// WARNING: this code may not work with all architectures, especially if +// alignment is an issue. This switch is currently ignored for mingw / cygwin +// +// Default is 0 +// +// Recommended setting: 1 if you are not using a memory debugging tool, else 0 +#define wxUSE_MEMORY_TRACING 0 + +// In debug mode, cause new and delete to be redefined globally. +// If this causes problems (e.g. link errors which is a common problem +// especially if you use another library which also redefines the global new +// and delete), set this to 0. +// This switch is currently ignored for mingw / cygwin +// +// Default is 0 +// +// Recommended setting: 0 +#define wxUSE_GLOBAL_MEMORY_OPERATORS 0 + +// In debug mode, causes new to be defined to be WXDEBUG_NEW (see object.h). If +// this causes problems (e.g. link errors), set this to 0. You may need to set +// this to 0 if using templates (at least for VC++). This switch is currently +// ignored for mingw / cygwin / CodeWarrior +// +// Default is 0 +// +// Recommended setting: 0 +#define wxUSE_DEBUG_NEW_ALWAYS 0 + +// wxHandleFatalExceptions() may be used to catch the program faults at run +// time and, instead of terminating the program with a usual GPF message box, +// call the user-defined wxApp::OnFatalException() function. If you set +// wxUSE_ON_FATAL_EXCEPTION to 0, wxHandleFatalExceptions() will not work. +// +// This setting is for Win32 only and can only be enabled if your compiler +// supports Win32 structured exception handling (currently only VC++ does) +// +// Default is 1 +// +// Recommended setting: 1 if your compiler supports it. +#ifdef _MSC_VER + #define wxUSE_ON_FATAL_EXCEPTION 1 +#else + #define wxUSE_ON_FATAL_EXCEPTION 0 +#endif + +// ---------------------------------------------------------------------------- +// Unicode support +// ---------------------------------------------------------------------------- + +// Set wxUSE_UNICODE to 1 to compile wxWidgets in Unicode mode: wxChar will be +// defined as wchar_t, wxString will use Unicode internally. If you set this +// to 1, you must use wxT() macro for all literal strings in the program. +// +// Unicode is currently only fully supported under Windows NT/2000/XP (Windows 9x +// doesn't support it and the programs compiled in Unicode mode will not run +// under 9x). +// +// Default is 0 +// +// Recommended setting: 0 (unless you only plan to use Windows NT/2000/XP) +#ifndef wxUSE_UNICODE + #define wxUSE_UNICODE 0 +#endif + +// Set wxUSE_UNICODE_MSLU to 1 if you want to compile wxWidgets in Unicode mode +// and be able to run compiled apps under Windows 9x as well as NT/2000/XP. This +// setting enables use of unicows.dll from MSLU (MS Layer for Unicode, see +// http://www.microsoft.com/globaldev/Articles/mslu_announce.asp). Note that you +// will have to modify the makefiles to include unicows.lib import library as the first +// library (if you use MSVC, you can run the makefile with "nmake MSLU=1 UNICODE=1" +// command). +// +// If your compiler doesn't have unicows.lib, you can get a version of it at +// http://libunicows.sourceforge.net +// +// Default is 0 +// +// Recommended setting: 0 +#define wxUSE_UNICODE_MSLU 0 + +// Setting wxUSE_WCHAR_T to 1 gives you some degree of Unicode support without +// compiling the program in Unicode mode. More precisely, it will be possible +// to construct wxString from a wide (Unicode) string and convert any wxString +// to Unicode. +// +// Default is 1 +// +// Recommended setting: 1 for win32 else 0 +#if defined(__WIN32__) || defined(__WATCOMC__) + #define wxUSE_WCHAR_T 1 +#else + #define wxUSE_WCHAR_T 0 +#endif + +// ---------------------------------------------------------------------------- +// global features +// ---------------------------------------------------------------------------- + +// Compile library in exception-safe mode? If set to 1, the library will try to +// behave correctly in presence of exceptions (even though it still will not +// use the exceptions itself) and notify the user code about any unhandled +// exceptions. If set to 0, propagation of the exceptions through the library +// code will lead to undefined behaviour -- but the code itself will be +// slightly smaller and faster. +// +// Default is 1 +// +// Recommended setting: depends on whether you intend to use C++ exceptions +// in your own code (1 if you do, 0 if you don't) +#define wxUSE_EXCEPTIONS 1 + +// Set wxUSE_STL to 1 to derive wxList(Foo) and wxArray(Foo) from +// std::list<Foo*> and std::vector<Foo*>, with a compatibility interface, +// and for wxHashMap to be implemented with templates. +// +// Default is 0 +// +// Recommended setting: YMMV +#define wxUSE_STL 0 + +// Set wxUSE_EXTENDED_RTTI to 1 to use extended RTTI +// +// Default is 0 +// +// Recommended setting: 0 +#define wxUSE_EXTENDED_RTTI 0 + +// Support for message/error logging. This includes wxLogXXX() functions and +// wxLog and derived classes. Don't set this to 0 unless you really know what +// you are doing. +// +// Default is 1 +// +// Recommended setting: 1 (always) +#define wxUSE_LOG 1 + +// Recommended setting: 1 +#define wxUSE_LOGWINDOW 1 + +// Recommended setting: 1 +#define wxUSE_LOGGUI 1 + +// Recommended setting: 1 +#define wxUSE_LOG_DIALOG 1 + +// Support for command line parsing using wxCmdLineParser class. +// +// Default is 1 +// +// Recommended setting: 1 (can be set to 0 if you don't use the cmd line) +#define wxUSE_CMDLINE_PARSER 1 + +// Support for multithreaded applications: if 1, compile in thread classes +// (thread.h) and make the library a bit more thread safe. Although thread +// support is quite stable by now, you may still consider recompiling the +// library without it if you have no use for it - this will result in a +// somewhat smaller and faster operation. +// +// This is ignored under Win16, threads are only supported under Win32. +// +// Default is 1 +// +// Recommended setting: 0 unless you do plan to develop MT applications +#define wxUSE_THREADS 1 + +// If enabled (1), compiles wxWidgets streams classes +#define wxUSE_STREAMS 1 + +// Use standard C++ streams if 1. If 0, use wxWin streams implementation. +#ifdef __MWERKS__ + #define wxUSE_STD_IOSTREAM 1 +#else + #define wxUSE_STD_IOSTREAM 0 +#endif + +// Enable conversion to standard C++ string if 1. +// +// Default is 1 for most compilers. +// +// Currently the Digital Mars and Watcom compilers come without standard C++ +// library headers by default, wxUSE_STD_STRING can be set to 1 if you do have +// them (e.g. from STLPort). +// +// VC++ 5.0 does include standard C++ library header, however they produce +// many warnings that can't be turned off when compiled at warning level 4. +#if defined(__DMC__) || defined(__WATCOMC__) \ + || (defined(_MSC_VER) && _MSC_VER < 1200) + #define wxUSE_STD_STRING 0 +#else + #define wxUSE_STD_STRING 1 +#endif + +// Support for positional parameters (e.g. %1$d, %2$s ...) in wxVsnprintf. +// Note that if the system's implementation does not support positional +// parameters, setting this to 1 forces the use of the wxWidgets implementation +// of wxVsnprintf. The standard vsnprintf() supports positional parameters on +// many Unix systems but usually doesn't under Windows. +// +// Positional parameters are very useful when translating a program since using +// them in formatting strings allow translators to correctly reorder the +// translated sentences. +// +// Default is 1 +// +// Recommended setting: 1 if you want to support multiple languages +#define wxUSE_PRINTF_POS_PARAMS 1 + +// ---------------------------------------------------------------------------- +// non GUI features selection +// ---------------------------------------------------------------------------- + +// Set wxUSE_LONGLONG to 1 to compile the wxLongLong class. This is a 64 bit +// integer which is implemented in terms of native 64 bit integers if any or +// uses emulation otherwise. +// +// This class is required by wxDateTime and so you should enable it if you want +// to use wxDateTime. For most modern platforms, it will use the native 64 bit +// integers in which case (almost) all of its functions are inline and it +// almost does not take any space, so there should be no reason to switch it +// off. +// +// Recommended setting: 1 +#define wxUSE_LONGLONG 1 + +// Set wxUSE_(F)FILE to 1 to compile wx(F)File classes. wxFile uses low level +// POSIX functions for file access, wxFFile uses ANSI C stdio.h functions. +// +// Default is 1 +// +// Recommended setting: 1 (wxFile is highly recommended as it is required by +// i18n code, wxFileConfig and others) +#define wxUSE_FILE 1 +#define wxUSE_FFILE 1 + +// Use wxFSVolume class providing access to the configured/active mount points +// +// Default is 1 +// +// Recommended setting: 1 (but may be safely disabled if you don't use it) +#define wxUSE_FSVOLUME 1 + +// Use wxStandardPaths class which allows to retrieve some standard locations +// in the file system +// +// Default is 1 +// +// Recommended setting: 1 (may be disabled to save space, but not much) +#define wxUSE_STDPATHS 1 + +// use wxTextBuffer class: required by wxTextFile +#define wxUSE_TEXTBUFFER 1 + +// use wxTextFile class: requires wxFile and wxTextBuffer, required by +// wxFileConfig +#define wxUSE_TEXTFILE 1 + +// i18n support: _() macro, wxLocale class. Requires wxTextFile. +#define wxUSE_INTL 1 + +// Set wxUSE_DATETIME to 1 to compile the wxDateTime and related classes which +// allow to manipulate dates, times and time intervals. wxDateTime replaces the +// old wxTime and wxDate classes which are still provided for backwards +// compatibility (and implemented in terms of wxDateTime). +// +// Note that this class is relatively new and is still officially in alpha +// stage because some features are not yet (fully) implemented. It is already +// quite useful though and should only be disabled if you are aiming at +// absolutely minimal version of the library. +// +// Requires: wxUSE_LONGLONG +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_DATETIME 1 + +// wxUSE_TIMEDATE enables compilation of the old wxDate and wxTime classes (not +// the same as wxDateTime!). These classes are obsolete and shouldn't be used +// in new code +// +// Default is 0 +// +// Recommended setting: 0 unless you have legacy code which uses these classes +#define wxUSE_TIMEDATE 0 + +// Set wxUSE_TIMER to 1 to compile wxTimer class +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_TIMER 1 + +// Use wxStopWatch clas. +// +// Default is 1 +// +// Recommended setting: 1 (needed by wxSocket) +#define wxUSE_STOPWATCH 1 + +// Setting wxUSE_CONFIG to 1 enables the use of wxConfig and related classes +// which allow the application to store its settings in the persistent +// storage. Setting this to 1 will also enable on-demand creation of the +// global config object in wxApp. +// +// See also wxUSE_CONFIG_NATIVE below. +// +// Recommended setting: 1 +#define wxUSE_CONFIG 1 + +// If wxUSE_CONFIG is 1, you may choose to use either the native config +// classes under Windows (using .INI files under Win16 and the registry under +// Win32) or the portable text file format used by the config classes under +// Unix. +// +// Default is 1 to use native classes. Note that you may still use +// wxFileConfig even if you set this to 1 - just the config object created by +// default for the applications needs will be a wxRegConfig or wxIniConfig and +// not wxFileConfig. +// +// Recommended setting: 0 (universal should not use native) +#if defined(__WIN32__) + #define wxUSE_CONFIG_NATIVE 0 +#else + #define wxUSE_CONFIG_NATIVE 0 +#endif + +// If wxUSE_DIALUP_MANAGER is 1, compile in wxDialUpManager class which allows +// to connect/disconnect from the network and be notified whenever the dial-up +// network connection is established/terminated. Requires wxUSE_DYNAMIC_LOADER. +// +// Default is 1. +// +// Recommended setting: 1 +#if defined(__WIN32__) + #define wxUSE_DIALUP_MANAGER 1 +#else + #define wxUSE_DIALUP_MANAGER 0 +#endif + +// Compile in classes for run-time DLL loading and function calling. +// Required by wxUSE_DIALUP_MANAGER. +// +// This setting is for Win32 only +// +// Default is 1. +// +// Recommended setting: 1 +#if defined(__WIN32__) + #define wxUSE_DYNLIB_CLASS 1 +#else + #define wxUSE_DYNLIB_CLASS 0 +#endif + +// experimental, don't use for now +#if defined(__WIN32__) + #define wxUSE_DYNAMIC_LOADER 1 +#else + #define wxUSE_DYNAMIC_LOADER 0 +#endif + +// Set to 1 to use socket classes +#define wxUSE_SOCKETS 1 + +// Set to 1 to enable virtual file systems (required by wxHTML) +#define wxUSE_FILESYSTEM 1 + +// Set to 1 to enable virtual ZIP filesystem (requires wxUSE_FILESYSTEM) +#define wxUSE_FS_ZIP 1 + +// Set to 1 to enable virtual archive filesystem (requires wxUSE_FILESYSTEM) +#define wxUSE_FS_ARCHIVE 1 + +// wxArchive classes for accessing archives such as zip and tar +#define wxUSE_ARCHIVE_STREAMS 1 + +// Set to 1 to compile wxZipInput/OutputStream classes. +#define wxUSE_ZIPSTREAM 1 + +// Set to 1 to compile wxTarInput/OutputStream classes. +#define wxUSE_TARSTREAM 1 + +// Set to 1 to compile wxZlibInput/OutputStream classes. Also required by +// wxUSE_LIBPNG +#define wxUSE_ZLIB 1 + +// Set to 1 to enable virtual Internet filesystem (requires wxUSE_FILESYSTEM) +#define wxUSE_FS_INET 1 + +// If enabled, the code written by Apple will be used to write, in a portable +// way, float on the disk. See extended.c for the license which is different +// from wxWidgets one. +// +// Default is 1. +// +// Recommended setting: 1 unless you don't like the license terms (unlikely) +#define wxUSE_APPLE_IEEE 1 + +// Joystick support class +#if defined(__WIN32__) + #define wxUSE_JOYSTICK 1 +#else + #define wxUSE_JOYSTICK 1 +#endif + +// wxFontMapper class +#define wxUSE_FONTMAP 1 + +// wxMimeTypesManager class +#define wxUSE_MIMETYPE 1 + +// wxProtocol and related classes: if you want to use either of wxFTP, wxHTTP +// or wxURL you need to set this to 1. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_PROTOCOL 1 + +// The settings for the individual URL schemes +#define wxUSE_PROTOCOL_FILE 1 +#define wxUSE_PROTOCOL_FTP 1 +#define wxUSE_PROTOCOL_HTTP 1 + +// Define this to use wxURL class. +#define wxUSE_URL 1 + +// Support for wxVariant class used in several places throughout the library, +// notably in wxDataViewCtrl API. +// +// Default is 1. +// +// Recommended setting: 1 unless you want to reduce the library size as much as +// possible in which case setting this to 0 can gain up to 100KB. +#define wxUSE_VARIANT 1 + +// Support for regular expression matching via wxRegEx class: enable this to +// use POSIX regular expressions in your code. You need to compile regex +// library from src/regex to use it under Windows. +// +// Default is 0 +// +// Recommended setting: 1 if your compiler supports it, if it doesn't please +// contribute us a makefile for src/regex for it +#define wxUSE_REGEX 1 + +// wxSystemOptions class +#define wxUSE_SYSTEM_OPTIONS 1 + +// wxSound class +#define wxUSE_SOUND 1 + +// Use wxMediaCtrl +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_MEDIACTRL 1 + +// Use QuickTime +// +// Default is 0 +// +// Recommended setting: 1 if you have the QT SDK installed and you need it, else 0 +#define wxUSE_QUICKTIME 0 + +// Use DirectShow +// +// Default is 0 +// +// Recommended setting: 1 if the DirectX 7 SDK is installed (highly recommended), else 0 +#define wxUSE_DIRECTSHOW 0 + +// Use wxWidget's XRC XML-based resource system. Recommended. +// +// Default is 1 +// +// Recommended setting: 1 (requires wxUSE_XML) +#define wxUSE_XRC 1 + +// XML parsing classes. Note that their API will change in the future, so +// using wxXmlDocument and wxXmlNode in your app is not recommended. +// +// Default is 1 +// +// Recommended setting: 1 (required by XRC) +#if wxUSE_XRC +# define wxUSE_XML 1 +#else +# define wxUSE_XML 0 +#endif + +// Use wxWidget's AUI docking system +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_AUI 1 + + +// Enable the new wxGraphicsPath and wxGraphicsContext classes for an advanced +// 2D drawing API. (Still somewhat experimental) +// +// Please note that on Windows you will need to link with gdiplus.lib (use +// USE_GDIPLUS=1 for makefile builds) and distribute gdiplus.dll with your +// application if you want it to be runnable on pre-XP systems. +// +// Default is 0 +// +// Recommended setting: 1 +#ifndef wxUSE_GRAPHICS_CONTEXT +#define wxUSE_GRAPHICS_CONTEXT 0 +#endif + +// Set to 1 to compile MS Windows XP theme engine support +#define wxUSE_UXTHEME 0 + +// Set to 1 to auto-adapt to MS Windows XP themes where possible +// (notably, wxNotebook pages) +#define wxUSE_UXTHEME_AUTO 0 + +// ---------------------------------------------------------------------------- +// Individual GUI controls +// ---------------------------------------------------------------------------- + +// You must set wxUSE_CONTROLS to 1 if you are using any controls at all +// (without it, wxControl class is not compiled) +// +// Default is 1 +// +// Recommended setting: 1 (don't change except for very special programs) +#define wxUSE_CONTROLS 1 + +// wxPopupWindow class is a top level transient window. It is currently used +// to implement wxTipWindow +// +// Default is 1 +// +// Recommended setting: 1 (may be set to 0 if you don't wxUSE_TIPWINDOW) +#define wxUSE_POPUPWIN 1 + +// wxTipWindow allows to implement the custom tooltips, it is used by the +// context help classes. Requires wxUSE_POPUPWIN. +// +// Default is 1 +// +// Recommended setting: 1 (may be set to 0) +#define wxUSE_TIPWINDOW 1 + +// Each of the settings below corresponds to one wxWidgets control. They are +// all switched on by default but may be disabled if you are sure that your +// program (including any standard dialogs it can show!) doesn't need them and +// if you desperately want to save some space. If you use any of these you must +// set wxUSE_CONTROLS as well. +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_ANIMATIONCTRL 1 // wxAnimationCtrl +#define wxUSE_BUTTON 1 // wxButton +#define wxUSE_BMPBUTTON 1 // wxBitmapButton +#define wxUSE_CALENDARCTRL 1 // wxCalendarCtrl +#define wxUSE_CHECKBOX 1 // wxCheckBox +#define wxUSE_CHECKLISTBOX 1 // wxCheckListBox +#define wxUSE_CHOICE 1 // wxChoice +#define wxUSE_COLLPANE 1 // wxCollapsiblePane +#define wxUSE_COLOURPICKERCTRL 1 // wxColourPickerCtrl +#define wxUSE_COMBOBOX 1 // wxComboBox +#define wxUSE_DATAVIEWCTRL 1 // wxDataViewCtrl +#define wxUSE_DATEPICKCTRL 1 // wxDatePickerCtrl +#define wxUSE_DIRPICKERCTRL 1 // wxDirPickerCtrl +#define wxUSE_FILEPICKERCTRL 1 // wxFilePickerCtrl +#define wxUSE_FONTPICKERCTRL 1 // wxFontPickerCtrl +#define wxUSE_GAUGE 1 // wxGauge +#define wxUSE_HYPERLINKCTRL 1 // wxHyperlinkCtrl +#define wxUSE_LISTBOX 1 // wxListBox +#define wxUSE_LISTCTRL 1 // wxListCtrl +#define wxUSE_RADIOBOX 1 // wxRadioBox +#define wxUSE_RADIOBTN 1 // wxRadioButton +#define wxUSE_SCROLLBAR 1 // wxScrollBar +#define wxUSE_SEARCHCTRL 1 // wxSearchCtrl +#define wxUSE_SLIDER 1 // wxSlider +#define wxUSE_SPINBTN 1 // wxSpinButton +#define wxUSE_SPINCTRL 1 // wxSpinCtrl +#define wxUSE_STATBOX 1 // wxStaticBox +#define wxUSE_STATLINE 1 // wxStaticLine +#define wxUSE_STATTEXT 1 // wxStaticText +#define wxUSE_STATBMP 1 // wxStaticBitmap +#define wxUSE_TEXTCTRL 1 // wxTextCtrl +#define wxUSE_TOGGLEBTN 1 // wxToggleButton +#define wxUSE_TREECTRL 1 // wxTreeCtrl + +// Use a status bar class? Depending on the value of wxUSE_NATIVE_STATUSBAR +// below either wxStatusBar95 or a generic wxStatusBar will be used. +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_STATUSBAR 1 + +// Two status bar implementations are available under Win32: the generic one +// or the wrapper around native control. For native look and feel the native +// version should be used. +// +// Default is 0. +// +// Recommended setting: 0 +#define wxUSE_NATIVE_STATUSBAR 0 + +// wxToolBar related settings: if wxUSE_TOOLBAR is 0, don't compile any toolbar +// classes at all. Otherwise, use the native toolbar class unless +// wxUSE_TOOLBAR_NATIVE is 0. +// +// Default is 0 for all settings. +// +// Recommended setting: 1 for wxUSE_TOOLBAR and 0 for wxUSE_TOOLBAR_NATIVE. +#define wxUSE_TOOLBAR 1 +#define wxUSE_TOOLBAR_NATIVE 0 + +// wxNotebook is a control with several "tabs" located on one of its sides. It +// may be used ot logically organise the data presented to the user instead of +// putting everything in one huge dialog. It replaces wxTabControl and related +// classes of wxWin 1.6x. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_NOTEBOOK 1 + +// wxListbook control is similar to wxNotebook but uses wxListCtrl instead of +// the tabs +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_LISTBOOK 1 + +// wxChoicebook control is similar to wxNotebook but uses wxChoice instead of +// the tabs +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_CHOICEBOOK 1 + +// wxTreebook control is similar to wxNotebook but uses wxTreeCtrl instead of +// the tabs +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_TREEBOOK 1 + +// wxToolbook control is similar to wxNotebook but uses wxToolBar instead of +// tabs +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_TOOLBOOK 1 + +// wxTabDialog is a generic version of wxNotebook but it is incompatible with +// the new class. It shouldn't be used in new code. +// +// Default is 0. +// +// Recommended setting: 0 (use wxNotebook) +#define wxUSE_TAB_DIALOG 0 + +// wxGrid class +// +// Default is 1, set to 0 to cut down compilation time and binaries size if you +// don't use it. +// +// Recommended setting: 1 +// +#define wxUSE_GRID 1 + +// wxProperty[Value/Form/List] classes, used by Dialog Editor +#define wxUSE_PROPSHEET 1 + + +// wxMiniFrame class: a frame with narrow title bar +// +// Default is 1. +// +// Recommended setting: 1 (it doesn't cost almost anything) +#define wxUSE_MINIFRAME 1 + + +// wxComboCtrl and related classes: combobox with custom popup window and +// not necessarily a listbox. +// +// Default is 1. +// +// Recommended setting: 1 but can be safely set to 0 except for wxUniv where it +// it used by wxComboBox +#define wxUSE_COMBOCTRL 1 + +// wxOwnerDrawnComboBox is a custom combobox allowing to paint the combobox +// items. +// +// Default is 1. +// +// Recommended setting: 1 but can be safely set to 0, except where it is +// needed as a base class for generic wxBitmapComboBox. +#define wxUSE_ODCOMBOBOX 1 + +// wxBitmapComboBox a combobox that can have images in front of text items. +// +// Default is 1. +// +// Recommended setting: 1 but can be safely set to 0 +#define wxUSE_BITMAPCOMBOBOX 1 + +// ---------------------------------------------------------------------------- +// Miscellaneous GUI stuff +// ---------------------------------------------------------------------------- + +// wxAcceleratorTable/Entry classes and support for them in wxMenu(Bar) +#define wxUSE_ACCEL 1 + +// Use wxCaret: a class implementing a "cursor" in a text control (called caret +// under Windows). +// +// Default is 1. +// +// Recommended setting: 1 (can be safely set to 0, not used by the library) +#define wxUSE_CARET 1 + +// Use wxDisplay class: it allows enumerating all displays on a system and +// working with them. +// +// Default is 0 because it isn't yet implemented on all platforms +// +// Recommended setting: 1 if you need it, can be safely set to 0 otherwise +#define wxUSE_DISPLAY 0 + +// Miscellaneous geometry code: needed for Canvas library +#define wxUSE_GEOMETRY 0 + +// Use wxImageList. This class is needed by wxNotebook, wxTreeCtrl and +// wxListCtrl. +// +// Default is 1. +// +// Recommended setting: 1 (set it to 0 if you don't use any of the controls +// enumerated above, then this class is mostly useless too) +#define wxUSE_IMAGLIST 1 + +// Use wxMenu, wxMenuBar, wxMenuItem. +// +// Default is 1. +// +// Recommended setting: 1 (can't be disabled under MSW) +#define wxUSE_MENUS 1 + +// Use wxSashWindow class. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_SASH 1 + +// Use wxSplitterWindow class. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_SPLITTER 1 + +// Use wxToolTip and wxWindow::Set/GetToolTip() methods. +// +// Default is 1. +// +// Recommended setting: 1 +#ifdef __WIN32__ + #define wxUSE_TOOLTIPS 1 +#else + #define wxUSE_TOOLTIPS 0 +#endif + +// wxValidator class and related methods +#define wxUSE_VALIDATORS 1 + +// wxDC cacheing implementation +#define wxUSE_DC_CACHEING 1 + +// Set this to 1 to enable the use of DIB's for wxBitmap to support +// bitmaps > 16MB on Win95/98/Me. Set to 0 to use DDB's only. +#define wxUSE_DIB_FOR_BITMAP 0 + +// ---------------------------------------------------------------------------- +// common dialogs +// ---------------------------------------------------------------------------- + +// On rare occasions (e.g. using DJGPP) may want to omit common dialogs (e.g. +// file selector, printer dialog). Switching this off also switches off the +// printing architecture and interactive wxPrinterDC. +// +// Default is 1 +// +// Recommended setting: 1 (unless it really doesn't work) +#define wxUSE_COMMON_DIALOGS 1 + +// wxBusyInfo displays window with message when app is busy. Works in same way +// as wxBusyCursor +#define wxUSE_BUSYINFO 1 + +// Use single/multiple choice dialogs. +// +// Default is 1 +// +// Recommended setting: 1 (used in the library itself) +#define wxUSE_CHOICEDLG 1 + +// Use colour picker dialog +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_COLOURDLG 1 + +// wxDirDlg class for getting a directory name from user +#define wxUSE_DIRDLG 1 + +// TODO: setting to choose the generic or native one + +// Use file open/save dialogs. +// +// Default is 1 +// +// Recommended setting: 1 (used in many places in the library itself) +#if defined(__WIN32__) + #define wxUSE_FILEDLG 1 +#else + #define wxUSE_FILEDLG 1 +#endif + +// Use find/replace dialogs. +// +// Default is 1 +// +// Recommended setting: 1 (but may be safely set to 0) +#define wxUSE_FINDREPLDLG 1 + +// Use font picker dialog +// +// Default is 1 +// +// Recommended setting: 1 (used in the library itself) +#define wxUSE_FONTDLG 1 + +// Use wxMessageDialog and wxMessageBox. +// +// Default is 1 +// +// Recommended setting: 1 (used in the library itself) +#define wxUSE_MSGDLG 1 + +// progress dialog class for lengthy operations +#define wxUSE_PROGRESSDLG 1 + +// support for startup tips (wxShowTip &c) +#define wxUSE_STARTUP_TIPS 1 + +// text entry dialog and wxGetTextFromUser function +#define wxUSE_TEXTDLG 1 + +// number entry dialog +#define wxUSE_NUMBERDLG 1 + +// splash screen class +#define wxUSE_SPLASH 1 + +// wizards +#define wxUSE_WIZARDDLG 1 + +// Compile in wxAboutBox() function showing the standard "About" dialog. +// +// Default is 1 +// +// Recommended setting: 1 but can be set to 0 to save some space if you don't +// use this function +#define wxUSE_ABOUTDLG 1 + +// ---------------------------------------------------------------------------- +// Metafiles support +// ---------------------------------------------------------------------------- + +// Windows supports the graphics format known as metafile which is, though not +// portable, is widely used under Windows and so is supported by wxWin (under +// Windows only, of course). Win16 (Win3.1) used the so-called "Window +// MetaFiles" or WMFs which were replaced with "Enhanced MetaFiles" or EMFs in +// Win32 (Win9x, NT, 2000). Both of these are supported in wxWin and, by +// default, WMFs will be used under Win16 and EMFs under Win32. This may be +// changed by setting wxUSE_WIN_METAFILES_ALWAYS to 1 and/or setting +// wxUSE_ENH_METAFILE to 0. You may also set wxUSE_METAFILE to 0 to not compile +// in any metafile related classes at all. +// +// Default is 1 for wxUSE_ENH_METAFILE and 0 for wxUSE_WIN_METAFILES_ALWAYS. +// +// Recommended setting: default or 0 for everything for portable programs. +#if defined(__WIN32__) + #define wxUSE_METAFILE 1 + #define wxUSE_ENH_METAFILE 1 + #define wxUSE_WIN_METAFILES_ALWAYS 0 +#else + #define wxUSE_METAFILE 0 + #define wxUSE_ENH_METAFILE 0 + #define wxUSE_WIN_METAFILES_ALWAYS 0 +#endif + +// ---------------------------------------------------------------------------- +// Big GUI components +// ---------------------------------------------------------------------------- + +// Set to 0 to disable MDI support. +// +// Requires wxUSE_NOTEBOOK under platforms other than MSW. +// +// Default is 1. +// +// Recommended setting: 1, can be safely set to 0. +#define wxUSE_MDI 1 + +// Set to 0 to disable document/view architecture +#define wxUSE_DOC_VIEW_ARCHITECTURE 1 + +// Set to 0 to disable MDI document/view architecture +// +// Requires wxUSE_MDI && wxUSE_DOC_VIEW_ARCHITECTURE +#define wxUSE_MDI_ARCHITECTURE 1 + +// Set to 0 to disable print/preview architecture code +#define wxUSE_PRINTING_ARCHITECTURE 1 + +// wxHTML sublibrary allows to display HTML in wxWindow programs and much, +// much more. +// +// Default is 1. +// +// Recommended setting: 1 (wxHTML is great!), set to 0 if you want compile a +// smaller library. +#define wxUSE_HTML 1 + +// Setting wxUSE_GLCANVAS to 1 enables OpenGL support. You need to have OpenGL +// headers and libraries to be able to compile the library with wxUSE_GLCANVAS +// set to 1. Note that for some compilers (notably Microsoft Visual C++) you +// will need to manually add opengl32.lib and glu32.lib to the list of +// libraries linked with your program if you use OpenGL. +// +// Default is 0. +// +// Recommended setting: 1 if you intend to use OpenGL, 0 otherwise +#if defined(__WIN32__) + #define wxUSE_GLCANVAS 1 +#else + #define wxUSE_GLCANVAS 0 +#endif + +// wxRichTextCtrl allows editing of styled text. +// +// Default is 1. +// +// Recommended setting: 1, set to 0 if you want compile a +// smaller library. +#define wxUSE_RICHTEXT 1 + +// wxTreeLayout class +#define wxUSE_TREELAYOUT 1 + +// ---------------------------------------------------------------------------- +// Data transfer +// ---------------------------------------------------------------------------- + +// Use wxClipboard class for clipboard copy/paste. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_CLIPBOARD 1 + +// Use wxDataObject and related classes. Needed for clipboard and OLE drag and +// drop +// +// Default is 1. +// +// Recommended setting: 1 for WIN32 +#define wxUSE_DATAOBJ 1 + +// Use wxDropTarget and wxDropSource classes for drag and drop (this is +// different from "built in" drag and drop in wxTreeCtrl which is always +// available). Requires wxUSE_DATAOBJ. +// +// Default is 1. +// +// Recommended setting: 1 +#if defined(__WIN32__) + #define wxUSE_DRAG_AND_DROP 1 +#else + #define wxUSE_DRAG_AND_DROP 0 +#endif + +// Use wxAccessible for enhanced and customisable accessibility. +// Depends on wxUSE_OLE. +// +// Default is 0. +// +// Recommended setting (at present): 0 +#define wxUSE_ACCESSIBILITY 0 + +// ---------------------------------------------------------------------------- +// miscellaneous settings +// ---------------------------------------------------------------------------- + +// wxSingleInstanceChecker class allows to verify at startup if another program +// instance is running (it is only available under Win32) +// +// Default is 1 +// +// Recommended setting: 1 (the class is tiny, disabling it won't save much +// space) +#if defined(__WIN32__) + #define wxUSE_SNGLINST_CHECKER 1 +#else + #define wxUSE_SNGLINST_CHECKER 0 +#endif + +// Drag image +#define wxUSE_DRAGIMAGE 1 + +// Interprocess communication +#define wxUSE_IPC 1 + +// Help +#if defined(__WIN32__) + #define wxUSE_HELP 1 +#else + #define wxUSE_HELP 1 +#endif + +// MS help +#define wxUSE_MS_HTML_HELP 1 + +// Use wxHTML-based help controller +#define wxUSE_WXHTML_HELP 1 + +// Use resources +#define wxUSE_RESOURCES 0 + +// Window layout constraint system +#define wxUSE_CONSTRAINTS 1 + +// Splines +#define wxUSE_SPLINES 1 + +// Include mouse wheel support +#define wxUSE_MOUSEWHEEL 1 + +// ---------------------------------------------------------------------------- +// postscript support settings +// ---------------------------------------------------------------------------- + +// Set to 1 for PostScript device context. +#define wxUSE_POSTSCRIPT 1 + +// Set to 1 to use font metric files in GetTextExtent +#define wxUSE_AFM_FOR_POSTSCRIPT 1 + +// ---------------------------------------------------------------------------- +// database classes +// ---------------------------------------------------------------------------- + +// Define 1 to use ODBC classes +#define wxUSE_ODBC 1 + +// For backward compatibility reasons, this parameter now only controls the +// default scrolling method used by cursors. This default behavior can be +// overriden by setting the second param of wxDB::wxDbGetConnection() or +// wxDb() constructor to indicate whether the connection (and any wxDbTable()s +// that use the connection) should support forward only scrolling of cursors, +// or both forward and backward support for backward scrolling cursors is +// dependent on the data source as well as the ODBC driver being used. +#define wxODBC_FWD_ONLY_CURSORS 0 + +// Default is 0. Set to 1 to use the deprecated classes, enum types, function, +// member variables. With a setting of 1, full backward compatibility with the +// 2.0.x release is possible. It is STRONGLY recommended that this be set to 0, +// as future development will be done only on the non-deprecated +// functions/classes/member variables/etc. +#define wxODBC_BACKWARD_COMPATABILITY 0 + +// ---------------------------------------------------------------------------- +// other compiler (mis)features +// ---------------------------------------------------------------------------- + +// Set this to 0 if your compiler can't cope with omission of prototype +// parameters. +// +// Default is 1. +// +// Recommended setting: 1 (should never need to set this to 0) +#define REMOVE_UNUSED_ARG 1 + +// VC++ 4.2 and above allows <iostream> and <iostream.h> but you can't mix +// them. Set to 1 for <iostream.h>, 0 for <iostream> +// +// Default is 1. +// +// Recommended setting: whatever your compiler likes more +#ifdef __MWERKS__ + #define wxUSE_IOSTREAMH 1 +#else + #define wxUSE_IOSTREAMH 0 +#endif + +// ---------------------------------------------------------------------------- +// image format support +// ---------------------------------------------------------------------------- + +// wxImage supports many different image formats which can be configured at +// compile-time. BMP is always supported, others are optional and can be safely +// disabled if you don't plan to use images in such format sometimes saving +// substantial amount of code in the final library. +// +// Some formats require an extra library which is included in wxWin sources +// which is mentioned if it is the case. + +// Set to 1 for wxImage support (recommended). +#define wxUSE_IMAGE 1 + +// Set to 1 for PNG format support (requires libpng). Also requires wxUSE_ZLIB. +#define wxUSE_LIBPNG 1 + +// Set to 1 for JPEG format support (requires libjpeg) +#define wxUSE_LIBJPEG 1 + +// Set to 1 for TIFF format support (requires libtiff) +#define wxUSE_LIBTIFF 1 + +// Set to 1 for GIF format support +#define wxUSE_GIF 1 + +// Set to 1 for PNM format support +#define wxUSE_PNM 1 + +// Set to 1 for PCX format support +#define wxUSE_PCX 1 + +// Set to 1 for IFF format support (Amiga format) +#define wxUSE_IFF 0 + +// Set to 1 for XPM format support +#define wxUSE_XPM 1 + +// Set to 1 for MS Icons and Cursors format support +#define wxUSE_ICO_CUR 0 + +// Set to 1 to compile in wxPalette class + #define wxUSE_PALETTE 1 + +// ---------------------------------------------------------------------------- +// Windows-only settings +// ---------------------------------------------------------------------------- +#if defined(__WINDOWS__) + +// Set this to 1 if you want to use wxWidgets and MFC in the same program. This +// will override some other settings (see below) +// +// Default is 0. +// +// Recommended setting: 0 unless you really have to use MFC +#define wxUSE_MFC 0 + +// Set this to 1 for generic OLE support: this is required for drag-and-drop, +// clipboard, OLE Automation. Only set it to 0 if your compiler is very old and +// can't compile/doesn't have the OLE headers. +// +// Default is 1. +// +// Recommended setting: 1 for WIN32 + #define wxUSE_OLE 1 + +// Set to 0 to disable PostScript print/preview architecture code under Windows +// (just use Windows printing). +#if defined(__WIN32__) + #define wxUSE_POSTSCRIPT_ARCHITECTURE_IN_MSW 1 +#else + #define wxUSE_POSTSCRIPT_ARCHITECTURE_IN_MSW 0 +#endif + +// Set this to 1 to use RICHEDIT controls for wxTextCtrl with style wxTE_RICH +// which allows to put more than ~32Kb of text in it even under Win9x (NT +// doesn't have such limitation). +// +// Default is 1 for compilers which support it +// +// Recommended setting: 1, only set it to 0 if your compiler doesn't have +// or can't compile <richedit.h> +#if defined(__WIN95__) && !defined(__WINE__) && !defined(__GNUWIN32_OLD__) +// TODO: This should be ifdef'ed for any compilers that don't support +// RichEdit 2.0 but do have RichEdit 1.0... + #define wxUSE_RICHEDIT 0 // currently not supported + #define wxUSE_RICHEDIT2 0 // currently not supported + +#else + #define wxUSE_RICHEDIT 0 + #define wxUSE_RICHEDIT2 0 +#endif + +// Set this to 1 to enable support for the owner-drawn menu and listboxes. +// +// Default is 1. +// +// Recommended setting: 1, set to 0 for a small library size reduction +#define wxUSE_OWNER_DRAWN 0 + +// Set this to 1 to be able to use wxCrashReport::Generate() to create mini +// dumps of your program when it crashes (or at any other moment) +// +// Default is 1 if supported by the compiler (VC++ and recent BC++ only). +// +// Recommended setting: 1, set to 0 if your programs never crash +#define wxUSE_CRASHREPORT 1 + +#endif + +// ---------------------------------------------------------------------------- +// unknown settings +// ---------------------------------------------------------------------------- + +// If 1, enables provision of run-time type information. +// NOW MANDATORY: don't change. +#define wxUSE_DYNAMIC_CLASSES 1 + +//?????? +#if defined(__WIN32__) + #define wxUSE_DDE_FOR_IPC 0 +#else + #define wxUSE_DDE_FOR_IPC 0 +#endif + +#endif // _WX_UNIV_SETUP_H_ diff --git a/Externals/wxWidgets/include/wx/univ/setup0.h b/Externals/wxWidgets/include/wx/univ/setup0.h new file mode 100644 index 0000000000..c4cd190747 --- /dev/null +++ b/Externals/wxWidgets/include/wx/univ/setup0.h @@ -0,0 +1,1328 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/univ/setup.h +// Purpose: configuration settings for wxUniversal/MSW +// Author: Vadim Zeitlin +// Modified by: +// Created: 14.08.00 +// RCS-ID: $Id: setup0.h 49997 2007-11-16 16:14:49Z CE $ +// Copyright: (c) 2000 SciTech Software, Inc. (www.scitechsoft.com) +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIV_SETUP_H_ +#define _WX_UNIV_SETUP_H_ + +// ---------------------------------------------------------------------------- +// global settings +// ---------------------------------------------------------------------------- + +// define this to 0 when building wxBase library - this can also be done from +// makefile/project file overriding the value here +#ifndef wxUSE_GUI + #define wxUSE_GUI 1 +#endif // wxUSE_GUI + +// ---------------------------------------------------------------------------- +// compatibility settings +// ---------------------------------------------------------------------------- + +// This setting determines the compatibility with 2.4 API: set it to 1 to +// enable it +// +// Default is 0. +// +// Recommended setting: 0 (please update your code instead!) +#define WXWIN_COMPATIBILITY_2_4 0 + +// This setting determines the compatibility with 2.6 API: set it to 0 to +// flag all cases of using deprecated functions. +// +// Default is 1 but please try building your code with 0 as the default will +// change to 0 in the next version and the deprecated functions will disappear +// in the version after it completely. +// +// Recommended setting: 0 (please update your code) +#define WXWIN_COMPATIBILITY_2_6 1 + +// Set to 0 for accurate dialog units, else 1 to be as per 2.1.16 and before. +// If migrating between versions, your dialogs may seem to shrink. +// +// Default is 1 +// +// Recommended setting: 0 (the new calculations are more correct!) +#define wxDIALOG_UNIT_COMPATIBILITY 0 + +// ---------------------------------------------------------------------------- +// debugging settings +// ---------------------------------------------------------------------------- + +// Generic comment about debugging settings: they are very useful if you don't +// use any other memory leak detection tools such as Purify/BoundsChecker, but +// are probably redundant otherwise. Also, Visual C++ CRT has the same features +// as wxWidgets memory debugging subsystem built in since version 5.0 and you +// may prefer to use it instead of built in memory debugging code because it is +// faster and more fool proof. +// +// Using VC++ CRT memory debugging is enabled by default in debug mode +// (__WXDEBUG__) if wxUSE_GLOBAL_MEMORY_OPERATORS is *not* enabled (i.e. is 0) +// and if __NO_VC_CRTDBG__ is not defined. + +// If 1, enables wxDebugContext, for writing error messages to file, etc. If +// __WXDEBUG__ is not defined, will still use the normal memory operators. +// +// Default is 0 +// +// Recommended setting: 0 +#ifdef __MWERKS__ + #define wxUSE_DEBUG_CONTEXT 1 +#else + #define wxUSE_DEBUG_CONTEXT 0 +#endif + +// If 1, enables debugging versions of wxObject::new and wxObject::delete *IF* +// __WXDEBUG__ is also defined. +// +// WARNING: this code may not work with all architectures, especially if +// alignment is an issue. This switch is currently ignored for mingw / cygwin +// +// Default is 0 +// +// Recommended setting: 1 if you are not using a memory debugging tool, else 0 +#define wxUSE_MEMORY_TRACING 0 + +// In debug mode, cause new and delete to be redefined globally. +// If this causes problems (e.g. link errors which is a common problem +// especially if you use another library which also redefines the global new +// and delete), set this to 0. +// This switch is currently ignored for mingw / cygwin +// +// Default is 0 +// +// Recommended setting: 0 +#define wxUSE_GLOBAL_MEMORY_OPERATORS 0 + +// In debug mode, causes new to be defined to be WXDEBUG_NEW (see object.h). If +// this causes problems (e.g. link errors), set this to 0. You may need to set +// this to 0 if using templates (at least for VC++). This switch is currently +// ignored for mingw / cygwin / CodeWarrior +// +// Default is 0 +// +// Recommended setting: 0 +#define wxUSE_DEBUG_NEW_ALWAYS 0 + +// wxHandleFatalExceptions() may be used to catch the program faults at run +// time and, instead of terminating the program with a usual GPF message box, +// call the user-defined wxApp::OnFatalException() function. If you set +// wxUSE_ON_FATAL_EXCEPTION to 0, wxHandleFatalExceptions() will not work. +// +// This setting is for Win32 only and can only be enabled if your compiler +// supports Win32 structured exception handling (currently only VC++ does) +// +// Default is 1 +// +// Recommended setting: 1 if your compiler supports it. +#ifdef _MSC_VER + #define wxUSE_ON_FATAL_EXCEPTION 1 +#else + #define wxUSE_ON_FATAL_EXCEPTION 0 +#endif + +// ---------------------------------------------------------------------------- +// Unicode support +// ---------------------------------------------------------------------------- + +// Set wxUSE_UNICODE to 1 to compile wxWidgets in Unicode mode: wxChar will be +// defined as wchar_t, wxString will use Unicode internally. If you set this +// to 1, you must use wxT() macro for all literal strings in the program. +// +// Unicode is currently only fully supported under Windows NT/2000/XP (Windows 9x +// doesn't support it and the programs compiled in Unicode mode will not run +// under 9x). +// +// Default is 0 +// +// Recommended setting: 0 (unless you only plan to use Windows NT/2000/XP) +#ifndef wxUSE_UNICODE + #define wxUSE_UNICODE 0 +#endif + +// Set wxUSE_UNICODE_MSLU to 1 if you want to compile wxWidgets in Unicode mode +// and be able to run compiled apps under Windows 9x as well as NT/2000/XP. This +// setting enables use of unicows.dll from MSLU (MS Layer for Unicode, see +// http://www.microsoft.com/globaldev/Articles/mslu_announce.asp). Note that you +// will have to modify the makefiles to include unicows.lib import library as the first +// library (if you use MSVC, you can run the makefile with "nmake MSLU=1 UNICODE=1" +// command). +// +// If your compiler doesn't have unicows.lib, you can get a version of it at +// http://libunicows.sourceforge.net +// +// Default is 0 +// +// Recommended setting: 0 +#define wxUSE_UNICODE_MSLU 0 + +// Setting wxUSE_WCHAR_T to 1 gives you some degree of Unicode support without +// compiling the program in Unicode mode. More precisely, it will be possible +// to construct wxString from a wide (Unicode) string and convert any wxString +// to Unicode. +// +// Default is 1 +// +// Recommended setting: 1 for win32 else 0 +#if defined(__WIN32__) || defined(__WATCOMC__) + #define wxUSE_WCHAR_T 1 +#else + #define wxUSE_WCHAR_T 0 +#endif + +// ---------------------------------------------------------------------------- +// global features +// ---------------------------------------------------------------------------- + +// Compile library in exception-safe mode? If set to 1, the library will try to +// behave correctly in presence of exceptions (even though it still will not +// use the exceptions itself) and notify the user code about any unhandled +// exceptions. If set to 0, propagation of the exceptions through the library +// code will lead to undefined behaviour -- but the code itself will be +// slightly smaller and faster. +// +// Default is 1 +// +// Recommended setting: depends on whether you intend to use C++ exceptions +// in your own code (1 if you do, 0 if you don't) +#define wxUSE_EXCEPTIONS 1 + +// Set wxUSE_STL to 1 to derive wxList(Foo) and wxArray(Foo) from +// std::list<Foo*> and std::vector<Foo*>, with a compatibility interface, +// and for wxHashMap to be implemented with templates. +// +// Default is 0 +// +// Recommended setting: YMMV +#define wxUSE_STL 0 + +// Set wxUSE_EXTENDED_RTTI to 1 to use extended RTTI +// +// Default is 0 +// +// Recommended setting: 0 +#define wxUSE_EXTENDED_RTTI 0 + +// Support for message/error logging. This includes wxLogXXX() functions and +// wxLog and derived classes. Don't set this to 0 unless you really know what +// you are doing. +// +// Default is 1 +// +// Recommended setting: 1 (always) +#define wxUSE_LOG 1 + +// Recommended setting: 1 +#define wxUSE_LOGWINDOW 1 + +// Recommended setting: 1 +#define wxUSE_LOGGUI 1 + +// Recommended setting: 1 +#define wxUSE_LOG_DIALOG 1 + +// Support for command line parsing using wxCmdLineParser class. +// +// Default is 1 +// +// Recommended setting: 1 (can be set to 0 if you don't use the cmd line) +#define wxUSE_CMDLINE_PARSER 1 + +// Support for multithreaded applications: if 1, compile in thread classes +// (thread.h) and make the library a bit more thread safe. Although thread +// support is quite stable by now, you may still consider recompiling the +// library without it if you have no use for it - this will result in a +// somewhat smaller and faster operation. +// +// This is ignored under Win16, threads are only supported under Win32. +// +// Default is 1 +// +// Recommended setting: 0 unless you do plan to develop MT applications +#define wxUSE_THREADS 1 + +// If enabled (1), compiles wxWidgets streams classes +#define wxUSE_STREAMS 1 + +// Use standard C++ streams if 1. If 0, use wxWin streams implementation. +#ifdef __MWERKS__ + #define wxUSE_STD_IOSTREAM 1 +#else + #define wxUSE_STD_IOSTREAM 0 +#endif + +// Enable conversion to standard C++ string if 1. +// +// Default is 1 for most compilers. +// +// Currently the Digital Mars and Watcom compilers come without standard C++ +// library headers by default, wxUSE_STD_STRING can be set to 1 if you do have +// them (e.g. from STLPort). +// +// VC++ 5.0 does include standard C++ library header, however they produce +// many warnings that can't be turned off when compiled at warning level 4. +#if defined(__DMC__) || defined(__WATCOMC__) \ + || (defined(_MSC_VER) && _MSC_VER < 1200) + #define wxUSE_STD_STRING 0 +#else + #define wxUSE_STD_STRING 1 +#endif + +// Support for positional parameters (e.g. %1$d, %2$s ...) in wxVsnprintf. +// Note that if the system's implementation does not support positional +// parameters, setting this to 1 forces the use of the wxWidgets implementation +// of wxVsnprintf. The standard vsnprintf() supports positional parameters on +// many Unix systems but usually doesn't under Windows. +// +// Positional parameters are very useful when translating a program since using +// them in formatting strings allow translators to correctly reorder the +// translated sentences. +// +// Default is 1 +// +// Recommended setting: 1 if you want to support multiple languages +#define wxUSE_PRINTF_POS_PARAMS 1 + +// ---------------------------------------------------------------------------- +// non GUI features selection +// ---------------------------------------------------------------------------- + +// Set wxUSE_LONGLONG to 1 to compile the wxLongLong class. This is a 64 bit +// integer which is implemented in terms of native 64 bit integers if any or +// uses emulation otherwise. +// +// This class is required by wxDateTime and so you should enable it if you want +// to use wxDateTime. For most modern platforms, it will use the native 64 bit +// integers in which case (almost) all of its functions are inline and it +// almost does not take any space, so there should be no reason to switch it +// off. +// +// Recommended setting: 1 +#define wxUSE_LONGLONG 1 + +// Set wxUSE_(F)FILE to 1 to compile wx(F)File classes. wxFile uses low level +// POSIX functions for file access, wxFFile uses ANSI C stdio.h functions. +// +// Default is 1 +// +// Recommended setting: 1 (wxFile is highly recommended as it is required by +// i18n code, wxFileConfig and others) +#define wxUSE_FILE 1 +#define wxUSE_FFILE 1 + +// Use wxFSVolume class providing access to the configured/active mount points +// +// Default is 1 +// +// Recommended setting: 1 (but may be safely disabled if you don't use it) +#define wxUSE_FSVOLUME 1 + +// Use wxStandardPaths class which allows to retrieve some standard locations +// in the file system +// +// Default is 1 +// +// Recommended setting: 1 (may be disabled to save space, but not much) +#define wxUSE_STDPATHS 1 + +// use wxTextBuffer class: required by wxTextFile +#define wxUSE_TEXTBUFFER 1 + +// use wxTextFile class: requires wxFile and wxTextBuffer, required by +// wxFileConfig +#define wxUSE_TEXTFILE 1 + +// i18n support: _() macro, wxLocale class. Requires wxTextFile. +#define wxUSE_INTL 1 + +// Set wxUSE_DATETIME to 1 to compile the wxDateTime and related classes which +// allow to manipulate dates, times and time intervals. wxDateTime replaces the +// old wxTime and wxDate classes which are still provided for backwards +// compatibility (and implemented in terms of wxDateTime). +// +// Note that this class is relatively new and is still officially in alpha +// stage because some features are not yet (fully) implemented. It is already +// quite useful though and should only be disabled if you are aiming at +// absolutely minimal version of the library. +// +// Requires: wxUSE_LONGLONG +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_DATETIME 1 + +// wxUSE_TIMEDATE enables compilation of the old wxDate and wxTime classes (not +// the same as wxDateTime!). These classes are obsolete and shouldn't be used +// in new code +// +// Default is 0 +// +// Recommended setting: 0 unless you have legacy code which uses these classes +#define wxUSE_TIMEDATE 0 + +// Set wxUSE_TIMER to 1 to compile wxTimer class +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_TIMER 1 + +// Use wxStopWatch clas. +// +// Default is 1 +// +// Recommended setting: 1 (needed by wxSocket) +#define wxUSE_STOPWATCH 1 + +// Setting wxUSE_CONFIG to 1 enables the use of wxConfig and related classes +// which allow the application to store its settings in the persistent +// storage. Setting this to 1 will also enable on-demand creation of the +// global config object in wxApp. +// +// See also wxUSE_CONFIG_NATIVE below. +// +// Recommended setting: 1 +#define wxUSE_CONFIG 1 + +// If wxUSE_CONFIG is 1, you may choose to use either the native config +// classes under Windows (using .INI files under Win16 and the registry under +// Win32) or the portable text file format used by the config classes under +// Unix. +// +// Default is 1 to use native classes. Note that you may still use +// wxFileConfig even if you set this to 1 - just the config object created by +// default for the applications needs will be a wxRegConfig or wxIniConfig and +// not wxFileConfig. +// +// Recommended setting: 0 (universal should not use native) +#if defined(__WIN32__) + #define wxUSE_CONFIG_NATIVE 0 +#else + #define wxUSE_CONFIG_NATIVE 0 +#endif + +// If wxUSE_DIALUP_MANAGER is 1, compile in wxDialUpManager class which allows +// to connect/disconnect from the network and be notified whenever the dial-up +// network connection is established/terminated. Requires wxUSE_DYNAMIC_LOADER. +// +// Default is 1. +// +// Recommended setting: 1 +#if defined(__WIN32__) + #define wxUSE_DIALUP_MANAGER 1 +#else + #define wxUSE_DIALUP_MANAGER 0 +#endif + +// Compile in classes for run-time DLL loading and function calling. +// Required by wxUSE_DIALUP_MANAGER. +// +// This setting is for Win32 only +// +// Default is 1. +// +// Recommended setting: 1 +#if defined(__WIN32__) + #define wxUSE_DYNLIB_CLASS 1 +#else + #define wxUSE_DYNLIB_CLASS 0 +#endif + +// experimental, don't use for now +#if defined(__WIN32__) + #define wxUSE_DYNAMIC_LOADER 1 +#else + #define wxUSE_DYNAMIC_LOADER 0 +#endif + +// Set to 1 to use socket classes +#define wxUSE_SOCKETS 1 + +// Set to 1 to enable virtual file systems (required by wxHTML) +#define wxUSE_FILESYSTEM 1 + +// Set to 1 to enable virtual ZIP filesystem (requires wxUSE_FILESYSTEM) +#define wxUSE_FS_ZIP 1 + +// Set to 1 to enable virtual archive filesystem (requires wxUSE_FILESYSTEM) +#define wxUSE_FS_ARCHIVE 1 + +// wxArchive classes for accessing archives such as zip and tar +#define wxUSE_ARCHIVE_STREAMS 1 + +// Set to 1 to compile wxZipInput/OutputStream classes. +#define wxUSE_ZIPSTREAM 1 + +// Set to 1 to compile wxTarInput/OutputStream classes. +#define wxUSE_TARSTREAM 1 + +// Set to 1 to compile wxZlibInput/OutputStream classes. Also required by +// wxUSE_LIBPNG +#define wxUSE_ZLIB 1 + +// Set to 1 to enable virtual Internet filesystem (requires wxUSE_FILESYSTEM) +#define wxUSE_FS_INET 1 + +// If enabled, the code written by Apple will be used to write, in a portable +// way, float on the disk. See extended.c for the license which is different +// from wxWidgets one. +// +// Default is 1. +// +// Recommended setting: 1 unless you don't like the license terms (unlikely) +#define wxUSE_APPLE_IEEE 1 + +// Joystick support class +#if defined(__WIN32__) + #define wxUSE_JOYSTICK 1 +#else + #define wxUSE_JOYSTICK 1 +#endif + +// wxFontMapper class +#define wxUSE_FONTMAP 1 + +// wxMimeTypesManager class +#define wxUSE_MIMETYPE 1 + +// wxProtocol and related classes: if you want to use either of wxFTP, wxHTTP +// or wxURL you need to set this to 1. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_PROTOCOL 1 + +// The settings for the individual URL schemes +#define wxUSE_PROTOCOL_FILE 1 +#define wxUSE_PROTOCOL_FTP 1 +#define wxUSE_PROTOCOL_HTTP 1 + +// Define this to use wxURL class. +#define wxUSE_URL 1 + +// Support for wxVariant class used in several places throughout the library, +// notably in wxDataViewCtrl API. +// +// Default is 1. +// +// Recommended setting: 1 unless you want to reduce the library size as much as +// possible in which case setting this to 0 can gain up to 100KB. +#define wxUSE_VARIANT 1 + +// Support for regular expression matching via wxRegEx class: enable this to +// use POSIX regular expressions in your code. You need to compile regex +// library from src/regex to use it under Windows. +// +// Default is 0 +// +// Recommended setting: 1 if your compiler supports it, if it doesn't please +// contribute us a makefile for src/regex for it +#define wxUSE_REGEX 1 + +// wxSystemOptions class +#define wxUSE_SYSTEM_OPTIONS 1 + +// wxSound class +#define wxUSE_SOUND 1 + +// Use wxMediaCtrl +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_MEDIACTRL 1 + +// Use QuickTime +// +// Default is 0 +// +// Recommended setting: 1 if you have the QT SDK installed and you need it, else 0 +#define wxUSE_QUICKTIME 0 + +// Use DirectShow +// +// Default is 0 +// +// Recommended setting: 1 if the DirectX 7 SDK is installed (highly recommended), else 0 +#define wxUSE_DIRECTSHOW 0 + +// Use wxWidget's XRC XML-based resource system. Recommended. +// +// Default is 1 +// +// Recommended setting: 1 (requires wxUSE_XML) +#define wxUSE_XRC 1 + +// XML parsing classes. Note that their API will change in the future, so +// using wxXmlDocument and wxXmlNode in your app is not recommended. +// +// Default is 1 +// +// Recommended setting: 1 (required by XRC) +#if wxUSE_XRC +# define wxUSE_XML 1 +#else +# define wxUSE_XML 0 +#endif + +// Use wxWidget's AUI docking system +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_AUI 1 + + +// Enable the new wxGraphicsPath and wxGraphicsContext classes for an advanced +// 2D drawing API. (Still somewhat experimental) +// +// Please note that on Windows you will need to link with gdiplus.lib (use +// USE_GDIPLUS=1 for makefile builds) and distribute gdiplus.dll with your +// application if you want it to be runnable on pre-XP systems. +// +// Default is 0 +// +// Recommended setting: 1 +#ifndef wxUSE_GRAPHICS_CONTEXT +#define wxUSE_GRAPHICS_CONTEXT 0 +#endif + +// Set to 1 to compile MS Windows XP theme engine support +#define wxUSE_UXTHEME 0 + +// Set to 1 to auto-adapt to MS Windows XP themes where possible +// (notably, wxNotebook pages) +#define wxUSE_UXTHEME_AUTO 0 + +// ---------------------------------------------------------------------------- +// Individual GUI controls +// ---------------------------------------------------------------------------- + +// You must set wxUSE_CONTROLS to 1 if you are using any controls at all +// (without it, wxControl class is not compiled) +// +// Default is 1 +// +// Recommended setting: 1 (don't change except for very special programs) +#define wxUSE_CONTROLS 1 + +// wxPopupWindow class is a top level transient window. It is currently used +// to implement wxTipWindow +// +// Default is 1 +// +// Recommended setting: 1 (may be set to 0 if you don't wxUSE_TIPWINDOW) +#define wxUSE_POPUPWIN 1 + +// wxTipWindow allows to implement the custom tooltips, it is used by the +// context help classes. Requires wxUSE_POPUPWIN. +// +// Default is 1 +// +// Recommended setting: 1 (may be set to 0) +#define wxUSE_TIPWINDOW 1 + +// Each of the settings below corresponds to one wxWidgets control. They are +// all switched on by default but may be disabled if you are sure that your +// program (including any standard dialogs it can show!) doesn't need them and +// if you desperately want to save some space. If you use any of these you must +// set wxUSE_CONTROLS as well. +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_ANIMATIONCTRL 1 // wxAnimationCtrl +#define wxUSE_BUTTON 1 // wxButton +#define wxUSE_BMPBUTTON 1 // wxBitmapButton +#define wxUSE_CALENDARCTRL 1 // wxCalendarCtrl +#define wxUSE_CHECKBOX 1 // wxCheckBox +#define wxUSE_CHECKLISTBOX 1 // wxCheckListBox +#define wxUSE_CHOICE 1 // wxChoice +#define wxUSE_COLLPANE 1 // wxCollapsiblePane +#define wxUSE_COLOURPICKERCTRL 1 // wxColourPickerCtrl +#define wxUSE_COMBOBOX 1 // wxComboBox +#define wxUSE_DATAVIEWCTRL 1 // wxDataViewCtrl +#define wxUSE_DATEPICKCTRL 1 // wxDatePickerCtrl +#define wxUSE_DIRPICKERCTRL 1 // wxDirPickerCtrl +#define wxUSE_FILEPICKERCTRL 1 // wxFilePickerCtrl +#define wxUSE_FONTPICKERCTRL 1 // wxFontPickerCtrl +#define wxUSE_GAUGE 1 // wxGauge +#define wxUSE_HYPERLINKCTRL 1 // wxHyperlinkCtrl +#define wxUSE_LISTBOX 1 // wxListBox +#define wxUSE_LISTCTRL 1 // wxListCtrl +#define wxUSE_RADIOBOX 1 // wxRadioBox +#define wxUSE_RADIOBTN 1 // wxRadioButton +#define wxUSE_SCROLLBAR 1 // wxScrollBar +#define wxUSE_SEARCHCTRL 1 // wxSearchCtrl +#define wxUSE_SLIDER 1 // wxSlider +#define wxUSE_SPINBTN 1 // wxSpinButton +#define wxUSE_SPINCTRL 1 // wxSpinCtrl +#define wxUSE_STATBOX 1 // wxStaticBox +#define wxUSE_STATLINE 1 // wxStaticLine +#define wxUSE_STATTEXT 1 // wxStaticText +#define wxUSE_STATBMP 1 // wxStaticBitmap +#define wxUSE_TEXTCTRL 1 // wxTextCtrl +#define wxUSE_TOGGLEBTN 1 // wxToggleButton +#define wxUSE_TREECTRL 1 // wxTreeCtrl + +// Use a status bar class? Depending on the value of wxUSE_NATIVE_STATUSBAR +// below either wxStatusBar95 or a generic wxStatusBar will be used. +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_STATUSBAR 1 + +// Two status bar implementations are available under Win32: the generic one +// or the wrapper around native control. For native look and feel the native +// version should be used. +// +// Default is 0. +// +// Recommended setting: 0 +#define wxUSE_NATIVE_STATUSBAR 0 + +// wxToolBar related settings: if wxUSE_TOOLBAR is 0, don't compile any toolbar +// classes at all. Otherwise, use the native toolbar class unless +// wxUSE_TOOLBAR_NATIVE is 0. +// +// Default is 0 for all settings. +// +// Recommended setting: 1 for wxUSE_TOOLBAR and 0 for wxUSE_TOOLBAR_NATIVE. +#define wxUSE_TOOLBAR 1 +#define wxUSE_TOOLBAR_NATIVE 0 + +// wxNotebook is a control with several "tabs" located on one of its sides. It +// may be used ot logically organise the data presented to the user instead of +// putting everything in one huge dialog. It replaces wxTabControl and related +// classes of wxWin 1.6x. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_NOTEBOOK 1 + +// wxListbook control is similar to wxNotebook but uses wxListCtrl instead of +// the tabs +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_LISTBOOK 1 + +// wxChoicebook control is similar to wxNotebook but uses wxChoice instead of +// the tabs +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_CHOICEBOOK 1 + +// wxTreebook control is similar to wxNotebook but uses wxTreeCtrl instead of +// the tabs +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_TREEBOOK 1 + +// wxToolbook control is similar to wxNotebook but uses wxToolBar instead of +// tabs +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_TOOLBOOK 1 + +// wxTabDialog is a generic version of wxNotebook but it is incompatible with +// the new class. It shouldn't be used in new code. +// +// Default is 0. +// +// Recommended setting: 0 (use wxNotebook) +#define wxUSE_TAB_DIALOG 0 + +// wxGrid class +// +// Default is 1, set to 0 to cut down compilation time and binaries size if you +// don't use it. +// +// Recommended setting: 1 +// +#define wxUSE_GRID 1 + +// wxProperty[Value/Form/List] classes, used by Dialog Editor +#define wxUSE_PROPSHEET 1 + + +// wxMiniFrame class: a frame with narrow title bar +// +// Default is 1. +// +// Recommended setting: 1 (it doesn't cost almost anything) +#define wxUSE_MINIFRAME 1 + + +// wxComboCtrl and related classes: combobox with custom popup window and +// not necessarily a listbox. +// +// Default is 1. +// +// Recommended setting: 1 but can be safely set to 0 except for wxUniv where it +// it used by wxComboBox +#define wxUSE_COMBOCTRL 1 + +// wxOwnerDrawnComboBox is a custom combobox allowing to paint the combobox +// items. +// +// Default is 1. +// +// Recommended setting: 1 but can be safely set to 0, except where it is +// needed as a base class for generic wxBitmapComboBox. +#define wxUSE_ODCOMBOBOX 1 + +// wxBitmapComboBox a combobox that can have images in front of text items. +// +// Default is 1. +// +// Recommended setting: 1 but can be safely set to 0 +#define wxUSE_BITMAPCOMBOBOX 1 + +// ---------------------------------------------------------------------------- +// Miscellaneous GUI stuff +// ---------------------------------------------------------------------------- + +// wxAcceleratorTable/Entry classes and support for them in wxMenu(Bar) +#define wxUSE_ACCEL 1 + +// Use wxCaret: a class implementing a "cursor" in a text control (called caret +// under Windows). +// +// Default is 1. +// +// Recommended setting: 1 (can be safely set to 0, not used by the library) +#define wxUSE_CARET 1 + +// Use wxDisplay class: it allows enumerating all displays on a system and +// working with them. +// +// Default is 0 because it isn't yet implemented on all platforms +// +// Recommended setting: 1 if you need it, can be safely set to 0 otherwise +#define wxUSE_DISPLAY 0 + +// Miscellaneous geometry code: needed for Canvas library +#define wxUSE_GEOMETRY 0 + +// Use wxImageList. This class is needed by wxNotebook, wxTreeCtrl and +// wxListCtrl. +// +// Default is 1. +// +// Recommended setting: 1 (set it to 0 if you don't use any of the controls +// enumerated above, then this class is mostly useless too) +#define wxUSE_IMAGLIST 1 + +// Use wxMenu, wxMenuBar, wxMenuItem. +// +// Default is 1. +// +// Recommended setting: 1 (can't be disabled under MSW) +#define wxUSE_MENUS 1 + +// Use wxSashWindow class. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_SASH 1 + +// Use wxSplitterWindow class. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_SPLITTER 1 + +// Use wxToolTip and wxWindow::Set/GetToolTip() methods. +// +// Default is 1. +// +// Recommended setting: 1 +#ifdef __WIN32__ + #define wxUSE_TOOLTIPS 1 +#else + #define wxUSE_TOOLTIPS 0 +#endif + +// wxValidator class and related methods +#define wxUSE_VALIDATORS 1 + +// wxDC cacheing implementation +#define wxUSE_DC_CACHEING 1 + +// Set this to 1 to enable the use of DIB's for wxBitmap to support +// bitmaps > 16MB on Win95/98/Me. Set to 0 to use DDB's only. +#define wxUSE_DIB_FOR_BITMAP 0 + +// ---------------------------------------------------------------------------- +// common dialogs +// ---------------------------------------------------------------------------- + +// On rare occasions (e.g. using DJGPP) may want to omit common dialogs (e.g. +// file selector, printer dialog). Switching this off also switches off the +// printing architecture and interactive wxPrinterDC. +// +// Default is 1 +// +// Recommended setting: 1 (unless it really doesn't work) +#define wxUSE_COMMON_DIALOGS 1 + +// wxBusyInfo displays window with message when app is busy. Works in same way +// as wxBusyCursor +#define wxUSE_BUSYINFO 1 + +// Use single/multiple choice dialogs. +// +// Default is 1 +// +// Recommended setting: 1 (used in the library itself) +#define wxUSE_CHOICEDLG 1 + +// Use colour picker dialog +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_COLOURDLG 1 + +// wxDirDlg class for getting a directory name from user +#define wxUSE_DIRDLG 1 + +// TODO: setting to choose the generic or native one + +// Use file open/save dialogs. +// +// Default is 1 +// +// Recommended setting: 1 (used in many places in the library itself) +#if defined(__WIN32__) + #define wxUSE_FILEDLG 1 +#else + #define wxUSE_FILEDLG 1 +#endif + +// Use find/replace dialogs. +// +// Default is 1 +// +// Recommended setting: 1 (but may be safely set to 0) +#define wxUSE_FINDREPLDLG 1 + +// Use font picker dialog +// +// Default is 1 +// +// Recommended setting: 1 (used in the library itself) +#define wxUSE_FONTDLG 1 + +// Use wxMessageDialog and wxMessageBox. +// +// Default is 1 +// +// Recommended setting: 1 (used in the library itself) +#define wxUSE_MSGDLG 1 + +// progress dialog class for lengthy operations +#define wxUSE_PROGRESSDLG 1 + +// support for startup tips (wxShowTip &c) +#define wxUSE_STARTUP_TIPS 1 + +// text entry dialog and wxGetTextFromUser function +#define wxUSE_TEXTDLG 1 + +// number entry dialog +#define wxUSE_NUMBERDLG 1 + +// splash screen class +#define wxUSE_SPLASH 1 + +// wizards +#define wxUSE_WIZARDDLG 1 + +// Compile in wxAboutBox() function showing the standard "About" dialog. +// +// Default is 1 +// +// Recommended setting: 1 but can be set to 0 to save some space if you don't +// use this function +#define wxUSE_ABOUTDLG 1 + +// ---------------------------------------------------------------------------- +// Metafiles support +// ---------------------------------------------------------------------------- + +// Windows supports the graphics format known as metafile which is, though not +// portable, is widely used under Windows and so is supported by wxWin (under +// Windows only, of course). Win16 (Win3.1) used the so-called "Window +// MetaFiles" or WMFs which were replaced with "Enhanced MetaFiles" or EMFs in +// Win32 (Win9x, NT, 2000). Both of these are supported in wxWin and, by +// default, WMFs will be used under Win16 and EMFs under Win32. This may be +// changed by setting wxUSE_WIN_METAFILES_ALWAYS to 1 and/or setting +// wxUSE_ENH_METAFILE to 0. You may also set wxUSE_METAFILE to 0 to not compile +// in any metafile related classes at all. +// +// Default is 1 for wxUSE_ENH_METAFILE and 0 for wxUSE_WIN_METAFILES_ALWAYS. +// +// Recommended setting: default or 0 for everything for portable programs. +#if defined(__WIN32__) + #define wxUSE_METAFILE 1 + #define wxUSE_ENH_METAFILE 1 + #define wxUSE_WIN_METAFILES_ALWAYS 0 +#else + #define wxUSE_METAFILE 0 + #define wxUSE_ENH_METAFILE 0 + #define wxUSE_WIN_METAFILES_ALWAYS 0 +#endif + +// ---------------------------------------------------------------------------- +// Big GUI components +// ---------------------------------------------------------------------------- + +// Set to 0 to disable MDI support. +// +// Requires wxUSE_NOTEBOOK under platforms other than MSW. +// +// Default is 1. +// +// Recommended setting: 1, can be safely set to 0. +#define wxUSE_MDI 1 + +// Set to 0 to disable document/view architecture +#define wxUSE_DOC_VIEW_ARCHITECTURE 1 + +// Set to 0 to disable MDI document/view architecture +// +// Requires wxUSE_MDI && wxUSE_DOC_VIEW_ARCHITECTURE +#define wxUSE_MDI_ARCHITECTURE 1 + +// Set to 0 to disable print/preview architecture code +#define wxUSE_PRINTING_ARCHITECTURE 1 + +// wxHTML sublibrary allows to display HTML in wxWindow programs and much, +// much more. +// +// Default is 1. +// +// Recommended setting: 1 (wxHTML is great!), set to 0 if you want compile a +// smaller library. +#define wxUSE_HTML 1 + +// Setting wxUSE_GLCANVAS to 1 enables OpenGL support. You need to have OpenGL +// headers and libraries to be able to compile the library with wxUSE_GLCANVAS +// set to 1. Note that for some compilers (notably Microsoft Visual C++) you +// will need to manually add opengl32.lib and glu32.lib to the list of +// libraries linked with your program if you use OpenGL. +// +// Default is 0. +// +// Recommended setting: 1 if you intend to use OpenGL, 0 otherwise +#if defined(__WIN32__) + #define wxUSE_GLCANVAS 1 +#else + #define wxUSE_GLCANVAS 0 +#endif + +// wxRichTextCtrl allows editing of styled text. +// +// Default is 1. +// +// Recommended setting: 1, set to 0 if you want compile a +// smaller library. +#define wxUSE_RICHTEXT 1 + +// wxTreeLayout class +#define wxUSE_TREELAYOUT 1 + +// ---------------------------------------------------------------------------- +// Data transfer +// ---------------------------------------------------------------------------- + +// Use wxClipboard class for clipboard copy/paste. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_CLIPBOARD 1 + +// Use wxDataObject and related classes. Needed for clipboard and OLE drag and +// drop +// +// Default is 1. +// +// Recommended setting: 1 for WIN32 +#define wxUSE_DATAOBJ 1 + +// Use wxDropTarget and wxDropSource classes for drag and drop (this is +// different from "built in" drag and drop in wxTreeCtrl which is always +// available). Requires wxUSE_DATAOBJ. +// +// Default is 1. +// +// Recommended setting: 1 +#if defined(__WIN32__) + #define wxUSE_DRAG_AND_DROP 1 +#else + #define wxUSE_DRAG_AND_DROP 0 +#endif + +// Use wxAccessible for enhanced and customisable accessibility. +// Depends on wxUSE_OLE. +// +// Default is 0. +// +// Recommended setting (at present): 0 +#define wxUSE_ACCESSIBILITY 0 + +// ---------------------------------------------------------------------------- +// miscellaneous settings +// ---------------------------------------------------------------------------- + +// wxSingleInstanceChecker class allows to verify at startup if another program +// instance is running (it is only available under Win32) +// +// Default is 1 +// +// Recommended setting: 1 (the class is tiny, disabling it won't save much +// space) +#if defined(__WIN32__) + #define wxUSE_SNGLINST_CHECKER 1 +#else + #define wxUSE_SNGLINST_CHECKER 0 +#endif + +// Drag image +#define wxUSE_DRAGIMAGE 1 + +// Interprocess communication +#define wxUSE_IPC 1 + +// Help +#if defined(__WIN32__) + #define wxUSE_HELP 1 +#else + #define wxUSE_HELP 1 +#endif + +// MS help +#define wxUSE_MS_HTML_HELP 1 + +// Use wxHTML-based help controller +#define wxUSE_WXHTML_HELP 1 + +// Use resources +#define wxUSE_RESOURCES 0 + +// Window layout constraint system +#define wxUSE_CONSTRAINTS 1 + +// Splines +#define wxUSE_SPLINES 1 + +// Include mouse wheel support +#define wxUSE_MOUSEWHEEL 1 + +// ---------------------------------------------------------------------------- +// postscript support settings +// ---------------------------------------------------------------------------- + +// Set to 1 for PostScript device context. +#define wxUSE_POSTSCRIPT 1 + +// Set to 1 to use font metric files in GetTextExtent +#define wxUSE_AFM_FOR_POSTSCRIPT 1 + +// ---------------------------------------------------------------------------- +// database classes +// ---------------------------------------------------------------------------- + +// Define 1 to use ODBC classes +#define wxUSE_ODBC 1 + +// For backward compatibility reasons, this parameter now only controls the +// default scrolling method used by cursors. This default behavior can be +// overriden by setting the second param of wxDB::wxDbGetConnection() or +// wxDb() constructor to indicate whether the connection (and any wxDbTable()s +// that use the connection) should support forward only scrolling of cursors, +// or both forward and backward support for backward scrolling cursors is +// dependent on the data source as well as the ODBC driver being used. +#define wxODBC_FWD_ONLY_CURSORS 0 + +// Default is 0. Set to 1 to use the deprecated classes, enum types, function, +// member variables. With a setting of 1, full backward compatibility with the +// 2.0.x release is possible. It is STRONGLY recommended that this be set to 0, +// as future development will be done only on the non-deprecated +// functions/classes/member variables/etc. +#define wxODBC_BACKWARD_COMPATABILITY 0 + +// ---------------------------------------------------------------------------- +// other compiler (mis)features +// ---------------------------------------------------------------------------- + +// Set this to 0 if your compiler can't cope with omission of prototype +// parameters. +// +// Default is 1. +// +// Recommended setting: 1 (should never need to set this to 0) +#define REMOVE_UNUSED_ARG 1 + +// VC++ 4.2 and above allows <iostream> and <iostream.h> but you can't mix +// them. Set to 1 for <iostream.h>, 0 for <iostream> +// +// Default is 1. +// +// Recommended setting: whatever your compiler likes more +#ifdef __MWERKS__ + #define wxUSE_IOSTREAMH 1 +#else + #define wxUSE_IOSTREAMH 0 +#endif + +// ---------------------------------------------------------------------------- +// image format support +// ---------------------------------------------------------------------------- + +// wxImage supports many different image formats which can be configured at +// compile-time. BMP is always supported, others are optional and can be safely +// disabled if you don't plan to use images in such format sometimes saving +// substantial amount of code in the final library. +// +// Some formats require an extra library which is included in wxWin sources +// which is mentioned if it is the case. + +// Set to 1 for wxImage support (recommended). +#define wxUSE_IMAGE 1 + +// Set to 1 for PNG format support (requires libpng). Also requires wxUSE_ZLIB. +#define wxUSE_LIBPNG 1 + +// Set to 1 for JPEG format support (requires libjpeg) +#define wxUSE_LIBJPEG 1 + +// Set to 1 for TIFF format support (requires libtiff) +#define wxUSE_LIBTIFF 1 + +// Set to 1 for GIF format support +#define wxUSE_GIF 1 + +// Set to 1 for PNM format support +#define wxUSE_PNM 1 + +// Set to 1 for PCX format support +#define wxUSE_PCX 1 + +// Set to 1 for IFF format support (Amiga format) +#define wxUSE_IFF 0 + +// Set to 1 for XPM format support +#define wxUSE_XPM 1 + +// Set to 1 for MS Icons and Cursors format support +#define wxUSE_ICO_CUR 0 + +// Set to 1 to compile in wxPalette class + #define wxUSE_PALETTE 1 + +// ---------------------------------------------------------------------------- +// Windows-only settings +// ---------------------------------------------------------------------------- +#if defined(__WINDOWS__) + +// Set this to 1 if you want to use wxWidgets and MFC in the same program. This +// will override some other settings (see below) +// +// Default is 0. +// +// Recommended setting: 0 unless you really have to use MFC +#define wxUSE_MFC 0 + +// Set this to 1 for generic OLE support: this is required for drag-and-drop, +// clipboard, OLE Automation. Only set it to 0 if your compiler is very old and +// can't compile/doesn't have the OLE headers. +// +// Default is 1. +// +// Recommended setting: 1 for WIN32 + #define wxUSE_OLE 1 + +// Set to 0 to disable PostScript print/preview architecture code under Windows +// (just use Windows printing). +#if defined(__WIN32__) + #define wxUSE_POSTSCRIPT_ARCHITECTURE_IN_MSW 1 +#else + #define wxUSE_POSTSCRIPT_ARCHITECTURE_IN_MSW 0 +#endif + +// Set this to 1 to use RICHEDIT controls for wxTextCtrl with style wxTE_RICH +// which allows to put more than ~32Kb of text in it even under Win9x (NT +// doesn't have such limitation). +// +// Default is 1 for compilers which support it +// +// Recommended setting: 1, only set it to 0 if your compiler doesn't have +// or can't compile <richedit.h> +#if defined(__WIN95__) && !defined(__WINE__) && !defined(__GNUWIN32_OLD__) +// TODO: This should be ifdef'ed for any compilers that don't support +// RichEdit 2.0 but do have RichEdit 1.0... + #define wxUSE_RICHEDIT 0 // currently not supported + #define wxUSE_RICHEDIT2 0 // currently not supported + +#else + #define wxUSE_RICHEDIT 0 + #define wxUSE_RICHEDIT2 0 +#endif + +// Set this to 1 to enable support for the owner-drawn menu and listboxes. +// +// Default is 1. +// +// Recommended setting: 1, set to 0 for a small library size reduction +#define wxUSE_OWNER_DRAWN 0 + +// Set this to 1 to be able to use wxCrashReport::Generate() to create mini +// dumps of your program when it crashes (or at any other moment) +// +// Default is 1 if supported by the compiler (VC++ and recent BC++ only). +// +// Recommended setting: 1, set to 0 if your programs never crash +#define wxUSE_CRASHREPORT 1 + +#endif + +// ---------------------------------------------------------------------------- +// unknown settings +// ---------------------------------------------------------------------------- + +// If 1, enables provision of run-time type information. +// NOW MANDATORY: don't change. +#define wxUSE_DYNAMIC_CLASSES 1 + +//?????? +#if defined(__WIN32__) + #define wxUSE_DDE_FOR_IPC 0 +#else + #define wxUSE_DDE_FOR_IPC 0 +#endif + +#endif // _WX_UNIV_SETUP_H_ diff --git a/Externals/wxWidgets/include/wx/univ/slider.h b/Externals/wxWidgets/include/wx/univ/slider.h new file mode 100644 index 0000000000..b1ba9bfdde --- /dev/null +++ b/Externals/wxWidgets/include/wx/univ/slider.h @@ -0,0 +1,226 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/univ/slider.h +// Purpose: wxSlider control for wxUniversal +// Author: Vadim Zeitlin +// Modified by: +// Created: 09.02.01 +// RCS-ID: $Id: slider.h 41227 2006-09-14 19:36:47Z VZ $ +// Copyright: (c) 2001 SciTech Software, Inc. (www.scitechsoft.com) +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIV_SLIDER_H_ +#define _WX_UNIV_SLIDER_H_ + +#include "wx/univ/scrthumb.h" + +// ---------------------------------------------------------------------------- +// the actions supported by this control +// ---------------------------------------------------------------------------- + +// our actions are the same as scrollbars + +#define wxACTION_SLIDER_START _T("start") // to the beginning +#define wxACTION_SLIDER_END _T("end") // to the end +#define wxACTION_SLIDER_LINE_UP _T("lineup") // one line up/left +#define wxACTION_SLIDER_PAGE_UP _T("pageup") // one page up/left +#define wxACTION_SLIDER_LINE_DOWN _T("linedown") // one line down/right +#define wxACTION_SLIDER_PAGE_DOWN _T("pagedown") // one page down/right +#define wxACTION_SLIDER_PAGE_CHANGE _T("pagechange")// change page by numArg + +#define wxACTION_SLIDER_THUMB_DRAG _T("thumbdrag") +#define wxACTION_SLIDER_THUMB_MOVE _T("thumbmove") +#define wxACTION_SLIDER_THUMB_RELEASE _T("thumbrelease") + +// ---------------------------------------------------------------------------- +// wxSlider +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxSlider : public wxSliderBase, + public wxControlWithThumb +{ +public: + // ctors and such + wxSlider(); + + wxSlider(wxWindow *parent, + wxWindowID id, + int value, int minValue, int maxValue, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxSL_HORIZONTAL, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxSliderNameStr); + + bool Create(wxWindow *parent, + wxWindowID id, + int value, int minValue, int maxValue, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxSL_HORIZONTAL, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxSliderNameStr); + + // implement base class pure virtuals + virtual int GetValue() const; + virtual void SetValue(int value); + + virtual void SetRange(int minValue, int maxValue); + virtual int GetMin() const; + virtual int GetMax() const; + + virtual void SetLineSize(int lineSize); + virtual void SetPageSize(int pageSize); + virtual int GetLineSize() const; + virtual int GetPageSize() const; + + virtual void SetThumbLength(int lenPixels); + virtual int GetThumbLength() const; + + virtual void SetTickFreq(int n, int WXUNUSED(dummy) = 0); + virtual int GetTickFreq() const { return m_tickFreq; } + + // wxUniv-specific methods + // ----------------------- + + // is this a vertical slider? + bool IsVert() const { return (GetWindowStyle() & wxSL_VERTICAL) != 0; } + + // get the slider orientation + wxOrientation GetOrientation() const + { return IsVert() ? wxVERTICAL : wxHORIZONTAL; } + + // do we have labels? + bool HasLabels() const + { return ((GetWindowStyle() & wxSL_LABELS) != 0) && + ((GetWindowStyle() & (wxSL_TOP|wxSL_BOTTOM|wxSL_LEFT|wxSL_RIGHT)) != 0); } + + // do we have ticks? + bool HasTicks() const + { return ((GetWindowStyle() & wxSL_TICKS) != 0) && + ((GetWindowStyle() & (wxSL_TOP|wxSL_BOTTOM|wxSL_LEFT|wxSL_RIGHT|wxSL_BOTH)) != 0); } + + // implement wxControlWithThumb interface + virtual wxWindow *GetWindow() { return this; } + virtual bool IsVertical() const { return IsVert(); } + + virtual wxScrollThumb::Shaft HitTest(const wxPoint& pt) const; + virtual wxCoord ThumbPosToPixel() const; + virtual int PixelToThumbPos(wxCoord x) const; + + virtual void SetShaftPartState(wxScrollThumb::Shaft shaftPart, + int flag, + bool set = true); + + virtual void OnThumbDragStart(int pos); + virtual void OnThumbDrag(int pos); + virtual void OnThumbDragEnd(int pos); + virtual void OnPageScrollStart(); + virtual bool OnPageScroll(int pageInc); + + // for wxStdSliderInputHandler + wxScrollThumb& GetThumb() { return m_thumb; } + + virtual bool PerformAction(const wxControlAction& action, + long numArg = 0, + const wxString& strArg = wxEmptyString); + + static wxInputHandler *GetStdInputHandler(wxInputHandler *handlerDef); + virtual wxInputHandler *DoGetStdInputHandler(wxInputHandler *handlerDef) + { + return GetStdInputHandler(handlerDef); + } + +protected: + enum + { + INVALID_THUMB_VALUE = -0xffff + }; + + // overridden base class virtuals + virtual wxSize DoGetBestClientSize() const; + virtual void DoDraw(wxControlRenderer *renderer); + virtual wxBorder GetDefaultBorder() const { return wxBORDER_NONE; } + + // event handlers + void OnSize(wxSizeEvent& event); + + // common part of all ctors + void Init(); + + // normalize the value to fit in the range + int NormalizeValue(int value) const; + + // change the value by the given increment, return true if really changed + bool ChangeValueBy(int inc); + + // change the value to the given one + bool ChangeValueTo(int value); + + // is the value inside the range? + bool IsInRange(int value) { return (value >= m_min) && (value <= m_max); } + + // format the value for printing as label + virtual wxString FormatValue(int value) const; + + // calculate max label size + wxSize CalcLabelSize() const; + + // calculate m_rectLabel/Slider + void CalcGeometry(); + + // get the thumb size + wxSize GetThumbSize() const; + + // get the shaft rect (uses m_rectSlider which is supposed to be calculated) + wxRect GetShaftRect() const; + + // calc the current thumb position using the shaft rect (if the pointer is + // NULL, we calculate it here too) + void CalcThumbRect(const wxRect *rectShaft, + wxRect *rectThumbOut, + wxRect *rectLabelOut, + int value = INVALID_THUMB_VALUE) const; + + // return the slider rect calculating it if needed + const wxRect& GetSliderRect() const; + + // refresh the current thumb position + void RefreshThumb(); + +private: + // get the default thumb size (without using m_thumbSize) + wxSize GetDefaultThumbSize() const; + + // the object which manages our thumb + wxScrollThumb m_thumb; + + // the slider range and value + int m_min, + m_max, + m_value; + + // the tick frequence (default is 1) + int m_tickFreq; + + // the line and page increments (logical units) + int m_lineSize, + m_pageSize; + + // the size of the thumb (in pixels) + int m_thumbSize; + + // the part of the client area reserved for the label, the ticks and the + // part for the slider itself + wxRect m_rectLabel, + m_rectTicks, + m_rectSlider; + + // the state of the thumb (wxCONTROL_XXX constants sum) + int m_thumbFlags; + + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS(wxSlider) +}; + +#endif // _WX_UNIV_SLIDER_H_ diff --git a/Externals/wxWidgets/include/wx/univ/spinbutt.h b/Externals/wxWidgets/include/wx/univ/spinbutt.h new file mode 100644 index 0000000000..88f76d90bf --- /dev/null +++ b/Externals/wxWidgets/include/wx/univ/spinbutt.h @@ -0,0 +1,122 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/univ/spinbutt.h +// Purpose: universal version of wxSpinButton +// Author: Vadim Zeitlin +// Modified by: +// Created: 21.01.01 +// RCS-ID: $Id: spinbutt.h 42715 2006-10-30 12:24:13Z VS $ +// Copyright: (c) 2001 SciTech Software, Inc. (www.scitechsoft.com) +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIV_SPINBUTT_H_ +#define _WX_UNIV_SPINBUTT_H_ + +#include "wx/univ/scrarrow.h" + +// ---------------------------------------------------------------------------- +// wxSpinButton +// ---------------------------------------------------------------------------- + +// actions supported by this control +#define wxACTION_SPIN_INC _T("inc") +#define wxACTION_SPIN_DEC _T("dec") + +class WXDLLEXPORT wxSpinButton : public wxSpinButtonBase, + public wxControlWithArrows +{ +public: + wxSpinButton(); + wxSpinButton(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxSP_VERTICAL | wxSP_ARROW_KEYS, + const wxString& name = wxSPIN_BUTTON_NAME); + + bool Create(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxSP_VERTICAL | wxSP_ARROW_KEYS, + const wxString& name = wxSPIN_BUTTON_NAME); + + // implement wxSpinButtonBase methods + virtual int GetValue() const; + virtual void SetValue(int val); + virtual void SetRange(int minVal, int maxVal); + + // implement wxControlWithArrows methods + virtual wxRenderer *GetRenderer() const { return m_renderer; } + virtual wxWindow *GetWindow() { return this; } + virtual bool IsVertical() const { return wxSpinButtonBase::IsVertical(); } + virtual int GetArrowState(wxScrollArrows::Arrow arrow) const; + virtual void SetArrowFlag(wxScrollArrows::Arrow arrow, int flag, bool set); + virtual bool OnArrow(wxScrollArrows::Arrow arrow); + virtual wxScrollArrows::Arrow HitTestArrow(const wxPoint& pt) const; + + // for wxStdSpinButtonInputHandler + const wxScrollArrows& GetArrows() { return m_arrows; } + + virtual bool PerformAction(const wxControlAction& action, + long numArg = 0, + const wxString& strArg = wxEmptyString); + + static wxInputHandler *GetStdInputHandler(wxInputHandler *handlerDef); + virtual wxInputHandler *DoGetStdInputHandler(wxInputHandler *handlerDef) + { + return GetStdInputHandler(handlerDef); + } + +protected: + virtual wxSize DoGetBestClientSize() const; + virtual void DoDraw(wxControlRenderer *renderer); + virtual wxBorder GetDefaultBorder() const { return wxBORDER_NONE; } + + // the common part of all ctors + void Init(); + + // normalize the value to fit into min..max range + int NormalizeValue(int value) const; + + // change the value by +1/-1 and send the event, return true if value was + // changed + bool ChangeValue(int inc); + + // get the rectangles for our 2 arrows + void CalcArrowRects(wxRect *rect1, wxRect *rect2) const; + + // the current controls value + int m_value; + +private: + // the object which manages our arrows + wxScrollArrows m_arrows; + + // the state (combination of wxCONTROL_XXX flags) of the arrows + int m_arrowsState[wxScrollArrows::Arrow_Max]; + + DECLARE_DYNAMIC_CLASS(wxSpinButton) +}; + +// ---------------------------------------------------------------------------- +// wxStdSpinButtonInputHandler: manages clicks on them (use arrows like +// wxStdScrollBarInputHandler) and processes keyboard events too +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxStdSpinButtonInputHandler : public wxStdInputHandler +{ +public: + wxStdSpinButtonInputHandler(wxInputHandler *inphand); + + virtual bool HandleKey(wxInputConsumer *consumer, + const wxKeyEvent& event, + bool pressed); + virtual bool HandleMouse(wxInputConsumer *consumer, + const wxMouseEvent& event); + virtual bool HandleMouseMove(wxInputConsumer *consumer, + const wxMouseEvent& event); +}; + +#endif // _WX_UNIV_SPINBUTT_H_ + diff --git a/Externals/wxWidgets/include/wx/univ/statbmp.h b/Externals/wxWidgets/include/wx/univ/statbmp.h new file mode 100644 index 0000000000..cf3e215191 --- /dev/null +++ b/Externals/wxWidgets/include/wx/univ/statbmp.h @@ -0,0 +1,74 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/univ/statbmp.h +// Purpose: wxStaticBitmap class for wxUniversal +// Author: Vadim Zeitlin +// Modified by: +// Created: 25.08.00 +// RCS-ID: $Id: statbmp.h 37393 2006-02-08 21:47:09Z VZ $ +// Copyright: (c) 2000 SciTech Software, Inc. (www.scitechsoft.com) +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIV_STATBMP_H_ +#define _WX_UNIV_STATBMP_H_ + +#include "wx/bitmap.h" + +// ---------------------------------------------------------------------------- +// wxStaticBitmap +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxStaticBitmap : public wxStaticBitmapBase +{ +public: + wxStaticBitmap() + { + } + + wxStaticBitmap(wxWindow *parent, + const wxBitmap& label, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0) + { + Create(parent, wxID_ANY, label, pos, size, style); + } + + wxStaticBitmap(wxWindow *parent, + wxWindowID id, + const wxBitmap& label, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxStaticBitmapNameStr) + { + Create(parent, id, label, pos, size, style, name); + } + + bool Create(wxWindow *parent, + wxWindowID id, + const wxBitmap& label, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxStaticBitmapNameStr); + + virtual void SetBitmap(const wxBitmap& bitmap); + virtual void SetIcon(const wxIcon& icon); + virtual wxBitmap GetBitmap() const { return m_bitmap; } + + wxIcon GetIcon() const; + + virtual bool HasTransparentBackground() { return true; } + +protected: + virtual void DoDraw(wxControlRenderer *renderer); + +private: + // the bitmap which we show + wxBitmap m_bitmap; + + DECLARE_DYNAMIC_CLASS(wxStaticBitmap) +}; + +#endif // _WX_UNIV_STATBMP_H_ diff --git a/Externals/wxWidgets/include/wx/univ/statbox.h b/Externals/wxWidgets/include/wx/univ/statbox.h new file mode 100644 index 0000000000..075519bdc3 --- /dev/null +++ b/Externals/wxWidgets/include/wx/univ/statbox.h @@ -0,0 +1,65 @@ +////////////////////////////////////////////////////////////////////////////// +// Name: wx/univ/statbox.h +// Purpose: wxStaticBox declaration +// Author: Vadim Zeitlin +// Modified by: +// Created: 15.08.00 +// RCS-ID: $Id: statbox.h 37393 2006-02-08 21:47:09Z VZ $ +// Copyright: (c) 2000 SciTech Software, Inc. (www.scitechsoft.com) +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIV_STATBOX_H_ +#define _WX_UNIV_STATBOX_H_ + +class WXDLLEXPORT wxStaticBox : public wxStaticBoxBase +{ +public: + wxStaticBox() { } + + wxStaticBox(wxWindow *parent, + const wxString& label, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize) + { + Create(parent, wxID_ANY, label, pos, size); + } + + wxStaticBox(wxWindow *parent, wxWindowID id, + const wxString& label, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxStaticBoxNameStr) + { + Create(parent, id, label, pos, size, style, name); + } + + bool Create(wxWindow *parent, + wxWindowID id, + const wxString& label, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxStaticBoxNameStr); + + // the origin of the static box is inside the border and under the label: + // take account of this + virtual wxPoint GetBoxAreaOrigin() const; + + // returning true from here ensures that we act as a container window for + // our children + virtual bool IsStaticBox() const { return true; } + +protected: + // draw the control + virtual void DoDraw(wxControlRenderer *renderer); + + // get the size of the border + wxRect GetBorderGeometry() const; + +private: + DECLARE_DYNAMIC_CLASS(wxStaticBox) +}; + +#endif // _WX_UNIV_STATBOX_H_ diff --git a/Externals/wxWidgets/include/wx/univ/statline.h b/Externals/wxWidgets/include/wx/univ/statline.h new file mode 100644 index 0000000000..063a51cdc8 --- /dev/null +++ b/Externals/wxWidgets/include/wx/univ/statline.h @@ -0,0 +1,56 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/univ/statline.h +// Purpose: wxStaticLine class for wxUniversal +// Author: Vadim Zeitlin +// Created: 28.06.99 +// Version: $Id: statline.h 43874 2006-12-09 14:52:59Z VZ $ +// Copyright: (c) 1999 Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIV_STATLINE_H_ +#define _WX_UNIV_STATLINE_H_ + +class WXDLLEXPORT wxStaticLine : public wxStaticLineBase +{ +public: + // constructors and pseudo-constructors + wxStaticLine() { } + + wxStaticLine(wxWindow *parent, + const wxPoint &pos, + wxCoord length, + long style = wxLI_HORIZONTAL) + { + Create(parent, wxID_ANY, pos, + style & wxLI_VERTICAL ? wxSize(wxDefaultCoord, length) + : wxSize(length, wxDefaultCoord), + style); + } + + wxStaticLine(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxPoint &pos = wxDefaultPosition, + const wxSize &size = wxDefaultSize, + long style = wxLI_HORIZONTAL, + const wxString &name = wxStaticLineNameStr ) + { + Create(parent, id, pos, size, style, name); + } + + bool Create(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxPoint &pos = wxDefaultPosition, + const wxSize &size = wxDefaultSize, + long style = wxLI_HORIZONTAL, + const wxString &name = wxStaticLineNameStr ); + +protected: + virtual void DoDraw(wxControlRenderer *renderer); + +private: + DECLARE_DYNAMIC_CLASS(wxStaticLine) +}; + +#endif // _WX_UNIV_STATLINE_H_ + diff --git a/Externals/wxWidgets/include/wx/univ/stattext.h b/Externals/wxWidgets/include/wx/univ/stattext.h new file mode 100644 index 0000000000..ec3520ff24 --- /dev/null +++ b/Externals/wxWidgets/include/wx/univ/stattext.h @@ -0,0 +1,66 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/univ/stattext.h +// Purpose: wxStaticText +// Author: Vadim Zeitlin +// Modified by: +// Created: 14.08.00 +// RCS-ID: $Id: stattext.h 35650 2005-09-23 12:56:45Z MR $ +// Copyright: (c) 2000 SciTech Software, Inc. (www.scitechsoft.com) +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIV_STATTEXT_H_ +#define _WX_UNIV_STATTEXT_H_ + +class WXDLLEXPORT wxStaticText : public wxStaticTextBase +{ +public: + wxStaticText() { } + + // usual ctor + wxStaticText(wxWindow *parent, + const wxString& label, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize) + { + Create(parent, wxID_ANY, label, pos, size, 0, wxStaticTextNameStr); + } + + // full form + wxStaticText(wxWindow *parent, + wxWindowID id, + const wxString& label, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString &name = wxStaticTextNameStr) + { + Create(parent, id, label, pos, size, style, name); + } + + // function ctor + bool Create(wxWindow *parent, + wxWindowID id, + const wxString &label, + const wxPoint &pos = wxDefaultPosition, + const wxSize &size = wxDefaultSize, + long style = 0, + const wxString &name = wxStaticTextNameStr); + + // implementation only from now on + + virtual void SetLabel(const wxString& label); + + virtual bool IsFocused() const { return false; } + +protected: + // calculate the optimal size for the label + virtual wxSize DoGetBestClientSize() const; + + // draw the control + virtual void DoDraw(wxControlRenderer *renderer); + + DECLARE_ABSTRACT_CLASS(wxStaticText) +}; + +#endif // _WX_UNIV_STATTEXT_H_ diff --git a/Externals/wxWidgets/include/wx/univ/statusbr.h b/Externals/wxWidgets/include/wx/univ/statusbr.h new file mode 100644 index 0000000000..8c636cc54e --- /dev/null +++ b/Externals/wxWidgets/include/wx/univ/statusbr.h @@ -0,0 +1,110 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/univ/statusbr.h +// Purpose: wxStatusBarUniv: wxStatusBar for wxUniversal declaration +// Author: Vadim Zeitlin +// Modified by: +// Created: 14.10.01 +// RCS-ID: $Id: statusbr.h 37393 2006-02-08 21:47:09Z VZ $ +// Copyright: (c) 2001 SciTech Software, Inc. (www.scitechsoft.com) +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIV_STATUSBR_H_ +#define _WX_UNIV_STATUSBR_H_ + +#include "wx/univ/inpcons.h" +#include "wx/arrstr.h" + +// ---------------------------------------------------------------------------- +// wxStatusBar: a window near the bottom of the frame used for status info +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxStatusBarUniv : public wxStatusBarBase, + public wxInputConsumer +{ +public: + wxStatusBarUniv() { Init(); } + + wxStatusBarUniv(wxWindow *parent, + wxWindowID id = wxID_ANY, + long style = 0, + const wxString& name = wxPanelNameStr) + { + Init(); + + (void)Create(parent, id, style, name); + } + + bool Create(wxWindow *parent, + wxWindowID id = wxID_ANY, + long style = 0, + const wxString& name = wxPanelNameStr); + + // set field count/widths + virtual void SetFieldsCount(int number = 1, const int *widths = NULL); + virtual void SetStatusWidths(int n, const int widths[]); + + // get/set the text of the given field + virtual void SetStatusText(const wxString& text, int number = 0); + virtual wxString GetStatusText(int number = 0) const; + + // Get the position and size of the field's internal bounding rectangle + virtual bool GetFieldRect(int i, wxRect& rect) const; + + // sets the minimal vertical size of the status bar + virtual void SetMinHeight(int height); + + // get the dimensions of the horizontal and vertical borders + virtual int GetBorderX() const; + virtual int GetBorderY() const; + + // wxInputConsumer pure virtual + virtual wxWindow *GetInputWindow() const + { return wx_const_cast(wxStatusBar*, this); } + +protected: + // recalculate the field widths + void OnSize(wxSizeEvent& event); + + // draw the statusbar + virtual void DoDraw(wxControlRenderer *renderer); + + // tell them about our preferred height + virtual wxSize DoGetBestSize() const; + + // override DoSetSize() to prevent the status bar height from changing + virtual void DoSetSize(int x, int y, + int width, int height, + int sizeFlags = wxSIZE_AUTO); + + // get the (fixed) status bar height + wxCoord GetHeight() const; + + // get the rectangle containing all the fields and the border between them + // + // also updates m_widthsAbs if necessary + wxRect GetTotalFieldRect(wxCoord *borderBetweenFields); + + // get the rect for this field without ani side effects (see code) + wxRect DoGetFieldRect(int n) const; + + // refresh the given field + void RefreshField(int i); + + // common part of all ctors + void Init(); + +private: + // the status fields strings + wxArrayString m_statusText; + + // the absolute status fields widths + wxArrayInt m_widthsAbs; + + DECLARE_DYNAMIC_CLASS(wxStatusBarUniv) + DECLARE_EVENT_TABLE() + WX_DECLARE_INPUT_CONSUMER() +}; + +#endif // _WX_UNIV_STATUSBR_H_ + diff --git a/Externals/wxWidgets/include/wx/univ/stdrend.h b/Externals/wxWidgets/include/wx/univ/stdrend.h new file mode 100644 index 0000000000..6c42a1113b --- /dev/null +++ b/Externals/wxWidgets/include/wx/univ/stdrend.h @@ -0,0 +1,352 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/univ/stdrend.h +// Purpose: wxStdRenderer class declaration +// Author: Vadim Zeitlin +// Created: 2006-09-18 +// RCS-ID: $Id: stdrend.h 42716 2006-10-30 12:33:25Z VS $ +// Copyright: (c) 2006 Vadim Zeitlin <vadim@wxwindows.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIV_STDREND_H_ +#define _WX_UNIV_STDREND_H_ + +#include "wx/univ/renderer.h" +#include "wx/pen.h" + +class WXDLLEXPORT wxColourScheme; + +// ---------------------------------------------------------------------------- +// wxStdRenderer: implements as much of wxRenderer API as possible generically +// ---------------------------------------------------------------------------- + +class wxStdRenderer : public wxRenderer +{ +public: + // the renderer will use the given scheme, whose lifetime must be at least + // as long as of this object itself, to choose the colours for drawing + wxStdRenderer(const wxColourScheme *scheme); + + virtual void DrawBackground(wxDC& dc, + const wxColour& col, + const wxRect& rect, + int flags = 0, + wxWindow *window = NULL); + virtual void DrawButtonSurface(wxDC& dc, + const wxColour& col, + const wxRect& rect, + int flags); + + + virtual void DrawFocusRect(wxDC& dc, const wxRect& rect, int flags = 0); + virtual void DrawLabel(wxDC& dc, + const wxString& label, + const wxRect& rect, + int flags = 0, + int alignment = wxALIGN_LEFT | wxALIGN_TOP, + int indexAccel = -1, + wxRect *rectBounds = NULL); + virtual void DrawButtonLabel(wxDC& dc, + const wxString& label, + const wxBitmap& image, + const wxRect& rect, + int flags = 0, + int alignment = wxALIGN_LEFT | wxALIGN_TOP, + int indexAccel = -1, + wxRect *rectBounds = NULL); + + + virtual void DrawBorder(wxDC& dc, + wxBorder border, + const wxRect& rect, + int flags = 0, + wxRect *rectIn = NULL); + virtual void DrawTextBorder(wxDC& dc, + wxBorder border, + const wxRect& rect, + int flags = 0, + wxRect *rectIn = NULL); + + virtual void DrawHorizontalLine(wxDC& dc, + wxCoord y, wxCoord x1, wxCoord x2); + virtual void DrawVerticalLine(wxDC& dc, + wxCoord x, wxCoord y1, wxCoord y2); + virtual void DrawFrame(wxDC& dc, + const wxString& label, + const wxRect& rect, + int flags = 0, + int alignment = wxALIGN_LEFT, + int indexAccel = -1); + + + virtual void DrawItem(wxDC& dc, + const wxString& label, + const wxRect& rect, + int flags = 0); + virtual void DrawCheckItem(wxDC& dc, + const wxString& label, + const wxBitmap& bitmap, + const wxRect& rect, + int flags = 0); + + virtual void DrawCheckButton(wxDC& dc, + const wxString& label, + const wxBitmap& bitmap, + const wxRect& rect, + int flags = 0, + wxAlignment align = wxALIGN_LEFT, + int indexAccel = -1); + virtual void DrawRadioButton(wxDC& dc, + const wxString& label, + const wxBitmap& bitmap, + const wxRect& rect, + int flags = 0, + wxAlignment align = wxALIGN_LEFT, + int indexAccel = -1); + + virtual void DrawScrollbarArrow(wxDC& dc, + wxDirection dir, + const wxRect& rect, + int flags = 0); + virtual void DrawScrollCorner(wxDC& dc, + const wxRect& rect); + +#if wxUSE_TEXTCTRL + virtual void DrawTextLine(wxDC& dc, + const wxString& text, + const wxRect& rect, + int selStart = -1, + int selEnd = -1, + int flags = 0); + + virtual void DrawLineWrapMark(wxDC& dc, const wxRect& rect); + + virtual wxRect GetTextTotalArea(const wxTextCtrl *text, + const wxRect& rect) const; + virtual wxRect GetTextClientArea(const wxTextCtrl *text, + const wxRect& rect, + wxCoord *extraSpaceBeyond) const; +#endif // wxUSE_TEXTCTRL + + virtual wxRect GetBorderDimensions(wxBorder border) const; + + virtual bool AreScrollbarsInsideBorder() const; + + virtual void AdjustSize(wxSize *size, const wxWindow *window); + + virtual wxCoord GetListboxItemHeight(wxCoord fontHeight); + +#if wxUSE_STATUSBAR + virtual void DrawStatusField(wxDC& dc, + const wxRect& rect, + const wxString& label, + int flags = 0, int style = 0); + + virtual wxSize GetStatusBarBorders() const; + + virtual wxCoord GetStatusBarBorderBetweenFields() const; + + virtual wxSize GetStatusBarFieldMargins() const; +#endif // wxUSE_STATUSBAR + + virtual wxCoord GetCheckItemMargin() const { return 0; } + + + virtual void DrawFrameTitleBar(wxDC& dc, + const wxRect& rect, + const wxString& title, + const wxIcon& icon, + int flags, + int specialButton = 0, + int specialButtonFlag = 0); + virtual void DrawFrameBorder(wxDC& dc, + const wxRect& rect, + int flags); + virtual void DrawFrameBackground(wxDC& dc, + const wxRect& rect, + int flags); + virtual void DrawFrameTitle(wxDC& dc, + const wxRect& rect, + const wxString& title, + int flags); + virtual void DrawFrameIcon(wxDC& dc, + const wxRect& rect, + const wxIcon& icon, + int flags); + virtual void DrawFrameButton(wxDC& dc, + wxCoord x, wxCoord y, + int button, + int flags = 0); + + virtual wxRect GetFrameClientArea(const wxRect& rect, int flags) const; + + virtual wxSize GetFrameTotalSize(const wxSize& clientSize, int flags) const; + + virtual wxSize GetFrameMinSize(int flags) const; + + virtual wxSize GetFrameIconSize() const; + + virtual int HitTestFrame(const wxRect& rect, + const wxPoint& pt, + int flags = 0) const; +protected: + // various constants + enum ArrowDirection + { + Arrow_Left, + Arrow_Right, + Arrow_Up, + Arrow_Down, + Arrow_Max + }; + + enum ArrowStyle + { + Arrow_Normal, + Arrow_Disabled, + Arrow_Pressed, + Arrow_Inverted, + Arrow_InvertedDisabled, + Arrow_StateMax + }; + + enum FrameButtonType + { + FrameButton_Close, + FrameButton_Minimize, + FrameButton_Maximize, + FrameButton_Restore, + FrameButton_Help, + FrameButton_Max + }; + + enum IndicatorType + { + IndicatorType_Check, + IndicatorType_Radio, + IndicatorType_MaxCtrl, + IndicatorType_Menu = IndicatorType_MaxCtrl, + IndicatorType_Max + }; + + enum IndicatorState + { + IndicatorState_Normal, + IndicatorState_Pressed, // this one is for check/radioboxes + IndicatorState_Disabled, + IndicatorState_MaxCtrl, + + // the rest of the states are valid for menu items only + IndicatorState_Selected = IndicatorState_Pressed, + IndicatorState_SelectedDisabled = IndicatorState_MaxCtrl, + IndicatorState_MaxMenu + }; + + enum IndicatorStatus + { + IndicatorStatus_Checked, + IndicatorStatus_Unchecked, + IndicatorStatus_Undetermined, + IndicatorStatus_Max + }; + + // translate the appropriate bits in flags to the above enum elements + static void GetIndicatorsFromFlags(int flags, + IndicatorState& state, + IndicatorStatus& status); + + // translate wxDirection to ArrowDirection + static ArrowDirection GetArrowDirection(wxDirection dir); + + + // fill the rectangle with a brush of given colour (must be valid) + void DrawSolidRect(wxDC& dc, const wxColour& col, const wxRect& rect); + + + // all the functions in this section adjust the rect parameter to + // correspond to the interiour of the drawn area + + // draw complete rectangle + void DrawRect(wxDC& dc, wxRect *rect, const wxPen& pen); + + // draw the rectange using the first pen for the left and top sides + // and the second one for the bottom and right ones + void DrawShadedRect(wxDC& dc, wxRect *rect, + const wxPen& pen1, const wxPen& pen2); + + // border drawing routines, may be overridden in the derived class + virtual void DrawRaisedBorder(wxDC& dc, wxRect *rect); + virtual void DrawSunkenBorder(wxDC& dc, wxRect *rect); + virtual void DrawAntiSunkenBorder(wxDC& dc, wxRect *rect); + virtual void DrawBoxBorder(wxDC& dc, wxRect *rect); + virtual void DrawStaticBorder(wxDC& dc, wxRect *rect); + virtual void DrawExtraBorder(wxDC& dc, wxRect *rect); + + + // draw the frame with non-empty label inside the given rectText + virtual void DrawFrameWithLabel(wxDC& dc, + const wxString& label, + const wxRect& rectFrame, + const wxRect& rectText, + int flags, + int alignment, + int indexAccel); + + // draw the (static box) frame without the part corresponding to rectLabel + void DrawFrameWithoutLabel(wxDC& dc, + const wxRect& rectFrame, + const wxRect& rectLabel); + + + // draw the bitmap for a check item (which is by default the same as check + // box one but may be different) + virtual void DrawCheckItemBitmap(wxDC& dc, + const wxBitmap& bitmap, + const wxRect& rect, + int flags); + + // common routine for drawing check and radio buttons + void DrawCheckOrRadioButton(wxDC& dc, + const wxString& label, + const wxBitmap& bitmap, + const wxRect& rect, + int flags, + wxAlignment align, + int indexAccel); + + // return the check/radio bitmap for the given flags + virtual wxBitmap GetRadioBitmap(int flags) = 0; + virtual wxBitmap GetCheckBitmap(int flags) = 0; + + // return the frame icon bitmap + virtual wxBitmap GetFrameButtonBitmap(FrameButtonType type) = 0; + + // get the width of either normal or resizeable frame border depending on + // whether flags contains wxTOPLEVEL_RESIZEABLE bit + // + // notice that these methods only make sense with standard border drawing + // code which uses the borders of the same width on all sides, this is why + // they are only present here and not in wxRenderer itself + virtual int GetFrameBorderWidth(int flags) const; + +#if wxUSE_TEXTCTRL + // return the width of the border around the text area in the text control + virtual int GetTextBorderWidth(const wxTextCtrl *text) const; +#endif // wxUSE_TEXTCTRL + + // GDI objects we often use + wxPen m_penBlack, + m_penDarkGrey, + m_penLightGrey, + m_penHighlight; + + wxFont m_titlebarFont; + + // the colours we use, they never change currently so we don't have to ever + // update m_penXXX objects above + const wxColourScheme * const m_scheme; + + DECLARE_NO_COPY_CLASS(wxStdRenderer) +}; + +#endif // _WX_UNIV_STDREND_H_ diff --git a/Externals/wxWidgets/include/wx/univ/textctrl.h b/Externals/wxWidgets/include/wx/univ/textctrl.h new file mode 100644 index 0000000000..eea13b0808 --- /dev/null +++ b/Externals/wxWidgets/include/wx/univ/textctrl.h @@ -0,0 +1,534 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/univ/textctrl.h +// Purpose: wxTextCtrl class +// Author: Vadim Zeitlin +// Modified by: +// Created: 15.09.00 +// RCS-ID: $Id: textctrl.h 47170 2007-07-05 21:37:36Z VZ $ +// Copyright: (c) 2000 SciTech Software, Inc. (www.scitechsoft.com) +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIV_TEXTCTRL_H_ +#define _WX_UNIV_TEXTCTRL_H_ + +class WXDLLEXPORT wxCaret; +class WXDLLEXPORT wxTextCtrlCommandProcessor; + +#include "wx/scrolwin.h" // for wxScrollHelper + +#include "wx/univ/inphand.h" + +// ---------------------------------------------------------------------------- +// wxTextCtrl actions +// ---------------------------------------------------------------------------- + +// cursor movement and also selection and delete operations +#define wxACTION_TEXT_GOTO _T("goto") // to pos in numArg +#define wxACTION_TEXT_FIRST _T("first") // go to pos 0 +#define wxACTION_TEXT_LAST _T("last") // go to last pos +#define wxACTION_TEXT_HOME _T("home") +#define wxACTION_TEXT_END _T("end") +#define wxACTION_TEXT_LEFT _T("left") +#define wxACTION_TEXT_RIGHT _T("right") +#define wxACTION_TEXT_UP _T("up") +#define wxACTION_TEXT_DOWN _T("down") +#define wxACTION_TEXT_WORD_LEFT _T("wordleft") +#define wxACTION_TEXT_WORD_RIGHT _T("wordright") +#define wxACTION_TEXT_PAGE_UP _T("pageup") +#define wxACTION_TEXT_PAGE_DOWN _T("pagedown") + +// clipboard operations +#define wxACTION_TEXT_COPY _T("copy") +#define wxACTION_TEXT_CUT _T("cut") +#define wxACTION_TEXT_PASTE _T("paste") + +// insert text at the cursor position: the text is in strArg of PerformAction +#define wxACTION_TEXT_INSERT _T("insert") + +// if the action starts with either of these prefixes and the rest of the +// string is one of the movement commands, it means to select/delete text from +// the current cursor position to the new one +#define wxACTION_TEXT_PREFIX_SEL _T("sel") +#define wxACTION_TEXT_PREFIX_DEL _T("del") + +// mouse selection +#define wxACTION_TEXT_ANCHOR_SEL _T("anchorsel") +#define wxACTION_TEXT_EXTEND_SEL _T("extendsel") +#define wxACTION_TEXT_SEL_WORD _T("wordsel") +#define wxACTION_TEXT_SEL_LINE _T("linesel") + +// undo or redo +#define wxACTION_TEXT_UNDO _T("undo") +#define wxACTION_TEXT_REDO _T("redo") + +// ---------------------------------------------------------------------------- +// wxTextCtrl +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxTextCtrl : public wxTextCtrlBase, + public wxScrollHelper +{ +public: + // creation + // -------- + + wxTextCtrl() : wxScrollHelper(this) { Init(); } + + wxTextCtrl(wxWindow *parent, + wxWindowID id, + const wxString& value = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxTextCtrlNameStr) + : wxScrollHelper(this) + { + Init(); + + Create(parent, id, value, pos, size, style, validator, name); + } + + bool Create(wxWindow *parent, + wxWindowID id, + const wxString& value = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxTextCtrlNameStr); + + virtual ~wxTextCtrl(); + + // implement base class pure virtuals + // ---------------------------------- + + virtual wxString GetValue() const; + + virtual int GetLineLength(wxTextCoord lineNo) const; + virtual wxString GetLineText(wxTextCoord lineNo) const; + virtual int GetNumberOfLines() const; + + virtual bool IsModified() const; + virtual bool IsEditable() const; + + // If the return values from and to are the same, there is no selection. + virtual void GetSelection(wxTextPos* from, wxTextPos* to) const; + + // operations + // ---------- + + // editing + virtual void Clear(); + virtual void Replace(wxTextPos from, wxTextPos to, const wxString& value); + virtual void Remove(wxTextPos from, wxTextPos to); + + // sets/clears the dirty flag + virtual void MarkDirty(); + virtual void DiscardEdits(); + + // writing text inserts it at the current position, appending always + // inserts it at the end + virtual void WriteText(const wxString& text); + virtual void AppendText(const wxString& text); + + // translate between the position (which is just an index in the text ctrl + // considering all its contents as a single strings) and (x, y) coordinates + // which represent (logical, i.e. unwrapped) column and line. + virtual wxTextPos XYToPosition(wxTextCoord x, wxTextCoord y) const; + virtual bool PositionToXY(wxTextPos pos, + wxTextCoord *x, wxTextCoord *y) const; + + // wxUniv-specific: find a screen position (in client coordinates) of the + // given text position or of the caret + bool PositionToLogicalXY(wxTextPos pos, wxCoord *x, wxCoord *y) const; + bool PositionToDeviceXY(wxTextPos pos, wxCoord *x, wxCoord *y) const; + wxPoint GetCaretPosition() const; + + virtual void ShowPosition(wxTextPos pos); + + // Clipboard operations + virtual void Copy(); + virtual void Cut(); + virtual void Paste(); + + // Undo/redo + virtual void Undo(); + virtual void Redo(); + + virtual bool CanUndo() const; + virtual bool CanRedo() const; + + // Insertion point + virtual void SetInsertionPoint(wxTextPos pos); + virtual void SetInsertionPointEnd(); + virtual wxTextPos GetInsertionPoint() const; + virtual wxTextPos GetLastPosition() const; + + virtual void SetSelection(wxTextPos from, wxTextPos to); + virtual void SetEditable(bool editable); + + // wxUniv-specific methods + // ----------------------- + + // caret stuff + virtual void ShowCaret(bool show = true); + void HideCaret() { ShowCaret(false); } + void CreateCaret(); // for the current font size + + // helpers for cursor movement + wxTextPos GetWordStart() const; + wxTextPos GetWordEnd() const; + + // selection helpers + bool HasSelection() const + { return m_selStart != -1 && m_selEnd > m_selStart; } + void ClearSelection(); + void RemoveSelection(); + wxString GetSelectionText() const; + + virtual wxTextCtrlHitTestResult HitTest(const wxPoint& pt, long *pos) const; + virtual wxTextCtrlHitTestResult HitTest(const wxPoint& pt, + wxTextCoord *col, + wxTextCoord *row) const; + + // find the character at this position in the given line, return value as + // for HitTest() + // + // NB: x is the logical coord (client and unscrolled) + wxTextCtrlHitTestResult HitTestLine(const wxString& line, + wxCoord x, + wxTextCoord *colOut) const; + + // bring the given position into view + void ShowHorzPosition(wxCoord pos); + + // scroll the window horizontally so that the first character shown is in + // position pos + void ScrollText(wxTextCoord col); + + // adjust the DC for horz text control scrolling too + virtual void DoPrepareDC(wxDC& dc); + + // implementation only from now on + // ------------------------------- + + // override this to take into account our scrollbar-less scrolling + virtual void CalcUnscrolledPosition(int x, int y, int *xx, int *yy) const; + virtual void CalcScrolledPosition(int x, int y, int *xx, int *yy) const; + + // perform an action + virtual bool PerformAction(const wxControlAction& action, + long numArg = -1, + const wxString& strArg = wxEmptyString); + + static wxInputHandler *GetStdInputHandler(wxInputHandler *handlerDef); + virtual wxInputHandler *DoGetStdInputHandler(wxInputHandler *handlerDef) + { + return GetStdInputHandler(handlerDef); + } + + // override these methods to handle the caret + virtual bool SetFont(const wxFont &font); + virtual bool Enable(bool enable = true); + + // more readable flag testing methods + bool IsPassword() const { return HasFlag(wxTE_PASSWORD); } + bool WrapLines() const { return m_wrapLines; } + + // only for wxStdTextCtrlInputHandler + void RefreshSelection(); + + // override wxScrollHelper method to prevent (auto)scrolling beyond the end + // of line + virtual bool SendAutoScrollEvents(wxScrollWinEvent& event) const; + + // idle processing + virtual void OnInternalIdle(); + +protected: + // ensure we have correct default border + virtual wxBorder GetDefaultBorder() const { return wxBORDER_SUNKEN; } + + // override base class methods + virtual void DoDrawBorder(wxDC& dc, const wxRect& rect); + virtual void DoDraw(wxControlRenderer *renderer); + + // calc the size from the text extent + virtual wxSize DoGetBestClientSize() const; + + // implements Set/ChangeValue() + virtual void DoSetValue(const wxString& value, int flags = 0); + + // common part of all ctors + void Init(); + + // drawing + // ------- + + // draw the text in the given rectangle + void DoDrawTextInRect(wxDC& dc, const wxRect& rectUpdate); + + // draw the line wrap marks in this rect + void DoDrawLineWrapMarks(wxDC& dc, const wxRect& rectUpdate); + + // line/row geometry calculations + // ------------------------------ + + // get the extent (width) of the text + wxCoord GetTextWidth(const wxString& text) const; + + // get the logical text width (accounting for scrolling) + wxCoord GetTotalWidth() const; + + // get total number of rows (different from number of lines if the lines + // can be wrapped) + wxTextCoord GetRowCount() const; + + // find the number of rows in this line (only if WrapLines()) + wxTextCoord GetRowsPerLine(wxTextCoord line) const; + + // get the starting row of the given line + wxTextCoord GetFirstRowOfLine(wxTextCoord line) const; + + // get the row following this line + wxTextCoord GetRowAfterLine(wxTextCoord line) const; + + // refresh functions + // ----------------- + + // the text area is the part of the window in which the text can be + // displayed, i.e. part of it inside the margins and the real text area is + // the area in which the text *is* currently displayed: for example, in the + // multiline control case the text area can have extra space at the bottom + // which is not tall enough for another line and which is then not included + // into the real text area + wxRect GetRealTextArea() const; + + // refresh the text in the given (in logical coords) rect + void RefreshTextRect(const wxRect& rect, bool textOnly = true); + + // refresh the line wrap marks for the given range of lines (inclusive) + void RefreshLineWrapMarks(wxTextCoord rowFirst, wxTextCoord rowLast); + + // refresh the text in the given range (in logical coords) of this line, if + // width is 0, refresh to the end of line + void RefreshPixelRange(wxTextCoord line, wxCoord start, wxCoord width); + + // refresh the text in the given range (in text coords) in this line + void RefreshColRange(wxTextCoord line, wxTextPos start, size_t count); + + // refresh the text from in the given line range (inclusive) + void RefreshLineRange(wxTextCoord lineFirst, wxTextCoord lineLast); + + // refresh the text in the given range which can span multiple lines + // (this method accepts arguments in any order) + void RefreshTextRange(wxTextPos start, wxTextPos end); + + // get the text to show: either the text itself or the text replaced with + // starts for wxTE_PASSWORD control + wxString GetTextToShow(const wxString& text) const; + + // find the row in this line where the given position (counted from the + // start of line) is + wxTextCoord GetRowInLine(wxTextCoord line, + wxTextCoord col, + wxTextCoord *colRowStart = NULL) const; + + // find the number of characters of a line before it wraps + // (and optionally also the real width of the line) + size_t GetPartOfWrappedLine(const wxChar* text, + wxCoord *widthReal = NULL) const; + + // get the start and end of the selection for this line: if the line is + // outside the selection, both will be -1 and false will be returned + bool GetSelectedPartOfLine(wxTextCoord line, + wxTextPos *start, wxTextPos *end) const; + + // update the text rect: the zone inside our client rect (its coords are + // client coords) which contains the text + void UpdateTextRect(); + + // calculate the last visible position + void UpdateLastVisible(); + + // move caret to the given position unconditionally + // (SetInsertionPoint() does nothing if the position didn't change) + void DoSetInsertionPoint(wxTextPos pos); + + // move caret to the new position without updating the display (for + // internal use only) + void MoveInsertionPoint(wxTextPos pos); + + // set the caret to its initial (default) position + void InitInsertionPoint(); + + // get the width of the longest line in pixels + wxCoord GetMaxWidth() const; + + // force recalculation of the max line width + void RecalcMaxWidth(); + + // update the max width after the given line was modified + void UpdateMaxWidth(wxTextCoord line); + + // hit testing + // ----------- + + // HitTest2() is more efficient than 2 consecutive HitTest()s with the same + // line (i.e. y) and it also returns the offset of the starting position in + // pixels + // + // as the last hack, this function accepts either logical or device (by + // default) coords depending on devCoords flag + wxTextCtrlHitTestResult HitTest2(wxCoord y, + wxCoord x1, + wxCoord x2, + wxTextCoord *row, + wxTextCoord *colStart, + wxTextCoord *colEnd, + wxTextCoord *colRowStart, + bool devCoords = true) const; + + // HitTest() version which takes the logical text coordinates and not the + // device ones + wxTextCtrlHitTestResult HitTestLogical(const wxPoint& pos, + wxTextCoord *col, + wxTextCoord *row) const; + + // get the line and the row in this line corresponding to the given row, + // return true if ok and false if row is out of range + // + // NB: this function can only be called for controls which wrap lines + bool GetLineAndRow(wxTextCoord row, + wxTextCoord *line, + wxTextCoord *rowInLine) const; + + // get the height of one line (the same for all lines) + wxCoord GetLineHeight() const + { + // this one should be already precalculated + wxASSERT_MSG( m_heightLine != -1, _T("should have line height") ); + + return m_heightLine; + } + + // get the average char width + wxCoord GetAverageWidth() const { return m_widthAvg; } + + // recalc the line height and char width (to call when the font changes) + void RecalcFontMetrics(); + + // vertical scrolling helpers + // -------------------------- + + // all these functions are for multi line controls only + + // get the number of visible lines + size_t GetLinesPerPage() const; + + // return the position above the cursor or INVALID_POS_VALUE + wxTextPos GetPositionAbove(); + + // return the position below the cursor or INVALID_POS_VALUE + wxTextPos GetPositionBelow(); + + // event handlers + // -------------- + void OnChar(wxKeyEvent& event); + void OnSize(wxSizeEvent& event); + + // return the struct containing control-type dependent data + struct wxTextSingleLineData& SData() { return *m_data.sdata; } + struct wxTextMultiLineData& MData() { return *m_data.mdata; } + struct wxTextWrappedData& WData() { return *m_data.wdata; } + const wxTextSingleLineData& SData() const { return *m_data.sdata; } + const wxTextMultiLineData& MData() const { return *m_data.mdata; } + const wxTextWrappedData& WData() const { return *m_data.wdata; } + + // clipboard operations (unlike the versions without Do prefix, they have a + // return code) + bool DoCut(); + bool DoPaste(); + +private: + // all these methods are for multiline text controls only + + // update the scrollbars (only called from OnIdle) + void UpdateScrollbars(); + + // get read only access to the lines of multiline control + inline const wxArrayString& GetLines() const; + inline size_t GetLineCount() const; + + // replace a line (returns true if the number of rows in thel ine changed) + bool ReplaceLine(wxTextCoord line, const wxString& text); + + // remove a line + void RemoveLine(wxTextCoord line); + + // insert a line at this position + void InsertLine(wxTextCoord line, const wxString& text); + + // calculate geometry of this line + void LayoutLine(wxTextCoord line, class wxWrappedLineData& lineData) const; + + // calculate geometry of all lines until the given one + void LayoutLines(wxTextCoord lineLast) const; + + // the initially specified control size + wxSize m_sizeInitial; + + // the global control text + wxString m_value; + + // current position + wxTextPos m_curPos; + wxTextCoord m_curCol, + m_curRow; + + // last position (only used by GetLastPosition()) + wxTextPos m_posLast; + + // selection + wxTextPos m_selAnchor, + m_selStart, + m_selEnd; + + // flags + bool m_isModified:1, + m_isEditable:1, + m_hasCaret:1, + m_wrapLines:1; // can't be changed after creation + + // the rectangle (in client coordinates) to draw text inside + wxRect m_rectText; + + // the height of one line (cached value of GetCharHeight) + wxCoord m_heightLine; + + // and the average char width (cached value of GetCharWidth) + wxCoord m_widthAvg; + + // we have some data which depends on the kind of control (single or multi + // line) + union + { + wxTextSingleLineData *sdata; + wxTextMultiLineData *mdata; + wxTextWrappedData *wdata; + void *data; + } m_data; + + // the object to which we delegate our undo/redo implementation + wxTextCtrlCommandProcessor *m_cmdProcessor; + + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS(wxTextCtrl) + + friend class wxWrappedLineData; +}; + +#endif // _WX_UNIV_TEXTCTRL_H_ + diff --git a/Externals/wxWidgets/include/wx/univ/tglbtn.h b/Externals/wxWidgets/include/wx/univ/tglbtn.h new file mode 100644 index 0000000000..447cc2e266 --- /dev/null +++ b/Externals/wxWidgets/include/wx/univ/tglbtn.h @@ -0,0 +1,70 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/univ/button.h +// Purpose: wxToggleButton for wxUniversal +// Author: Vadim Zeitlin +// Modified by: David Bjorkevik +// Created: 16.05.06 +// RCS-ID: $Id: tglbtn.h 39320 2006-05-24 17:17:27Z PC $ +// Copyright: (c) 2000 SciTech Software, Inc. (www.scitechsoft.com) +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIV_TGLBTN_H_ +#define _WX_UNIV_TGLBTN_H_ + +#include "wx/button.h" + +extern WXDLLEXPORT_DATA(const wxChar) wxCheckBoxNameStr[]; + +// ---------------------------------------------------------------------------- +// wxToggleButton: a push button +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxToggleButton: public wxButton +{ +public: + wxToggleButton(); + + wxToggleButton(wxWindow *parent, + wxWindowID id, + const wxBitmap& bitmap, + const wxString& label = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxCheckBoxNameStr); + + wxToggleButton(wxWindow *parent, + wxWindowID id, + const wxString& label = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxCheckBoxNameStr); + + virtual ~wxToggleButton(); + + virtual bool IsPressed() const { return m_isPressed || m_value; } + + // wxToggleButton actions + virtual void Toggle(); + virtual void Click(); + + // Get/set the value + void SetValue(bool state); + bool GetValue() const { return m_value; } + +protected: + // the current value + bool m_value; + +private: + // common part of all ctors + void Init(); + + DECLARE_DYNAMIC_CLASS(wxToggleButton) +}; + +#endif // _WX_UNIV_TGLBTN_H_ diff --git a/Externals/wxWidgets/include/wx/univ/theme.h b/Externals/wxWidgets/include/wx/univ/theme.h new file mode 100644 index 0000000000..88d67b6b9f --- /dev/null +++ b/Externals/wxWidgets/include/wx/univ/theme.h @@ -0,0 +1,202 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/univ/theme.h +// Purpose: wxTheme class manages all configurable aspects of the +// application including the look (wxRenderer), feel +// (wxInputHandler) and the colours (wxColourScheme) +// Author: Vadim Zeitlin +// Modified by: +// Created: 06.08.00 +// RCS-ID: $Id: theme.h 42455 2006-10-26 15:33:10Z VS $ +// Copyright: (c) 2000 SciTech Software, Inc. (www.scitechsoft.com) +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIV_THEME_H_ +#define _WX_UNIV_THEME_H_ + +#include "wx/string.h" + +// ---------------------------------------------------------------------------- +// wxTheme +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxArtProvider; +class WXDLLEXPORT wxColourScheme; +class WXDLLEXPORT wxInputConsumer; +class WXDLLEXPORT wxInputHandler; +class WXDLLEXPORT wxRenderer; +struct WXDLLEXPORT wxThemeInfo; + +class WXDLLEXPORT wxTheme +{ +public: + // static methods + // -------------- + + // create the default theme + static bool CreateDefault(); + + // create the theme by name (will return NULL if not found) + static wxTheme *Create(const wxString& name); + + // change the current scheme + static wxTheme *Set(wxTheme *theme); + + // get the current theme (never NULL) + static wxTheme *Get() { return ms_theme; } + + // the theme methods + // ----------------- + + // get the renderer implementing all the control-drawing operations in + // this theme + virtual wxRenderer *GetRenderer() = 0; + + // get the art provider to be used together with this theme + virtual wxArtProvider *GetArtProvider() = 0; + + // get the input handler of the given type, forward to the standard one + virtual wxInputHandler *GetInputHandler(const wxString& handlerType, + wxInputConsumer *consumer) = 0; + + // get the colour scheme for the control with this name + virtual wxColourScheme *GetColourScheme() = 0; + + // implementation only from now on + // ------------------------------- + + virtual ~wxTheme(); + +private: + // the list of descriptions of all known themes + static wxThemeInfo *ms_allThemes; + + // the current theme + static wxTheme *ms_theme; + friend struct WXDLLEXPORT wxThemeInfo; +}; + +// ---------------------------------------------------------------------------- +// wxDelegateTheme: it is impossible to inherit from any of standard +// themes as their declarations are in private code, but you can use this +// class to override only some of their functions - all the other ones +// will be left to the original theme +// ---------------------------------------------------------------------------- + +class wxDelegateTheme : public wxTheme +{ +public: + wxDelegateTheme(const wxChar *theme); + virtual ~wxDelegateTheme(); + + virtual wxRenderer *GetRenderer(); + virtual wxArtProvider *GetArtProvider(); + virtual wxInputHandler *GetInputHandler(const wxString& control, + wxInputConsumer *consumer); + virtual wxColourScheme *GetColourScheme(); + +protected: + // gets or creates theme and sets m_theme to point to it, + // returns true on success + bool GetOrCreateTheme(); + + wxString m_themeName; + wxTheme *m_theme; +}; + +// ---------------------------------------------------------------------------- +// dynamic theme creation helpers +// ---------------------------------------------------------------------------- + +struct WXDLLEXPORT wxThemeInfo +{ + typedef wxTheme *(*Constructor)(); + + // theme name and (user readable) description + wxString name, desc; + + // the function to create a theme object + Constructor ctor; + + // next node in the linked list or NULL + wxThemeInfo *next; + + // constructor for the struct itself + wxThemeInfo(Constructor ctor, const wxChar *name, const wxChar *desc); +}; + +// ---------------------------------------------------------------------------- +// macros +// ---------------------------------------------------------------------------- + +// to use a standard theme insert this macro into one of the application files: +// without it, an over optimizing linker may discard the object module +// containing the theme implementation entirely +#define WX_USE_THEME(themename) \ + /* this indirection makes it possible to pass macro as the argument */ \ + WX_USE_THEME_IMPL(themename) + +#define WX_USE_THEME_IMPL(themename) \ + extern WXDLLEXPORT_DATA(bool) wxThemeUse##themename; \ + static struct wxThemeUserFor##themename \ + { \ + wxThemeUserFor##themename() { wxThemeUse##themename = true; } \ + } wxThemeDoUse##themename + +// to declare a new theme, this macro must be used in the class declaration +#define WX_DECLARE_THEME(themename) \ + private: \ + static wxThemeInfo ms_info##themename; \ + public: \ + const wxThemeInfo *GetThemeInfo() const \ + { return &ms_info##themename; } + +// and this one must be inserted in the source file +#define WX_IMPLEMENT_THEME(classname, themename, themedesc) \ + WXDLLEXPORT_DATA(bool) wxThemeUse##themename = true; \ + wxTheme *wxCtorFor##themename() { return new classname; } \ + wxThemeInfo classname::ms_info##themename(wxCtorFor##themename, \ + wxT( #themename ), themedesc) + +// ---------------------------------------------------------------------------- +// determine default theme +// ---------------------------------------------------------------------------- + +#if wxUSE_ALL_THEMES + #undef wxUSE_THEME_WIN32 + #define wxUSE_THEME_WIN32 1 + #undef wxUSE_THEME_GTK + #define wxUSE_THEME_GTK 1 + #undef wxUSE_THEME_MONO + #define wxUSE_THEME_MONO 1 + #undef wxUSE_THEME_METAL + #define wxUSE_THEME_METAL 1 +#endif // wxUSE_ALL_THEMES + +// determine the default theme to use: +#if defined(__WXGTK__) && wxUSE_THEME_GTK + #define wxUNIV_DEFAULT_THEME gtk +#elif defined(__WXDFB__) && wxUSE_THEME_MONO + // use mono theme for DirectFB port because it cannot correctly + // render neither win32 nor gtk themes yet: + #define wxUNIV_DEFAULT_THEME mono +#endif + +// if no theme was picked, get any theme compiled in (sorted by +// quality/completeness of the theme): +#ifndef wxUNIV_DEFAULT_THEME + #if wxUSE_THEME_WIN32 + #define wxUNIV_DEFAULT_THEME win32 + #elif wxUSE_THEME_GTK + #define wxUNIV_DEFAULT_THEME gtk + #elif wxUSE_THEME_MONO + #define wxUNIV_DEFAULT_THEME mono + #endif + // If nothing matches, no themes are compiled and the app must provide + // some theme itself + // (note that wxUSE_THEME_METAL depends on win32 theme, so we don't have to + // try it) + // +#endif // !wxUNIV_DEFAULT_THEME + +#endif // _WX_UNIV_THEME_H_ diff --git a/Externals/wxWidgets/include/wx/univ/toolbar.h b/Externals/wxWidgets/include/wx/univ/toolbar.h new file mode 100644 index 0000000000..427629a654 --- /dev/null +++ b/Externals/wxWidgets/include/wx/univ/toolbar.h @@ -0,0 +1,138 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/univ/toolbar.h +// Purpose: wxToolBar declaration +// Author: Robert Roebling +// Modified by: +// Created: 10.09.00 +// RCS-ID: $Id: toolbar.h 41227 2006-09-14 19:36:47Z VZ $ +// Copyright: (c) Robert Roebling +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIV_TOOLBAR_H_ +#define _WX_UNIV_TOOLBAR_H_ + +#include "wx/button.h" // for wxStdButtonInputHandler + +class WXDLLEXPORT wxToolBarTool; + +// ---------------------------------------------------------------------------- +// the actions supported by this control +// ---------------------------------------------------------------------------- + +#define wxACTION_TOOLBAR_TOGGLE wxACTION_BUTTON_TOGGLE +#define wxACTION_TOOLBAR_PRESS wxACTION_BUTTON_PRESS +#define wxACTION_TOOLBAR_RELEASE wxACTION_BUTTON_RELEASE +#define wxACTION_TOOLBAR_CLICK wxACTION_BUTTON_CLICK +#define wxACTION_TOOLBAR_ENTER _T("enter") // highlight the tool +#define wxACTION_TOOLBAR_LEAVE _T("leave") // unhighlight the tool + +// ---------------------------------------------------------------------------- +// wxToolBar +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxToolBar : public wxToolBarBase +{ +public: + // construction/destruction + wxToolBar() { Init(); } + wxToolBar(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxToolBarNameStr) + { + Init(); + + Create(parent, id, pos, size, style, name); + } + + bool Create( wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxToolBarNameStr ); + + virtual ~wxToolBar(); + + virtual bool Realize(); + + virtual void SetWindowStyleFlag( long style ); + + virtual wxToolBarToolBase *FindToolForPosition(wxCoord x, wxCoord y) const; + + virtual void SetToolShortHelp(int id, const wxString& helpString); + + virtual void SetMargins(int x, int y); + void SetMargins(const wxSize& size) + { SetMargins((int) size.x, (int) size.y); } + + virtual bool PerformAction(const wxControlAction& action, + long numArg = -1, + const wxString& strArg = wxEmptyString); + static wxInputHandler *GetStdInputHandler(wxInputHandler *handlerDef); + virtual wxInputHandler *DoGetStdInputHandler(wxInputHandler *handlerDef) + { + return GetStdInputHandler(handlerDef); + } + +protected: + // common part of all ctors + void Init(); + + // implement base class pure virtuals + virtual bool DoInsertTool(size_t pos, wxToolBarToolBase *tool); + virtual bool DoDeleteTool(size_t pos, wxToolBarToolBase *tool); + + virtual void DoEnableTool(wxToolBarToolBase *tool, bool enable); + virtual void DoToggleTool(wxToolBarToolBase *tool, bool toggle); + virtual void DoSetToggle(wxToolBarToolBase *tool, bool toggle); + + virtual wxToolBarToolBase *CreateTool(int id, + const wxString& label, + const wxBitmap& bmpNormal, + const wxBitmap& bmpDisabled, + wxItemKind kind, + wxObject *clientData, + const wxString& shortHelp, + const wxString& longHelp); + virtual wxToolBarToolBase *CreateTool(wxControl *control); + + virtual wxSize DoGetBestClientSize() const; + virtual void DoSetSize(int x, int y, + int width, int height, + int sizeFlags = wxSIZE_AUTO); + virtual void DoDraw(wxControlRenderer *renderer); + + // get the bounding rect for the given tool + wxRect GetToolRect(wxToolBarToolBase *tool) const; + + // redraw the given tool + void RefreshTool(wxToolBarToolBase *tool); + + // (re)calculate the tool positions, should only be called if it is + // necessary to do it, i.e. m_needsLayout == true + void DoLayout(); + + // get the rect limits depending on the orientation: top/bottom for a + // vertical toolbar, left/right for a horizontal one + void GetRectLimits(const wxRect& rect, wxCoord *start, wxCoord *end) const; + +private: + // have we calculated the positions of our tools? + bool m_needsLayout; + + // the width of a separator + wxCoord m_widthSeparator; + + // the total size of all toolbar elements + wxCoord m_maxWidth, + m_maxHeight; + +private: + DECLARE_DYNAMIC_CLASS(wxToolBar) +}; + +#endif // _WX_UNIV_TOOLBAR_H_ diff --git a/Externals/wxWidgets/include/wx/univ/toplevel.h b/Externals/wxWidgets/include/wx/univ/toplevel.h new file mode 100644 index 0000000000..ec86a1b968 --- /dev/null +++ b/Externals/wxWidgets/include/wx/univ/toplevel.h @@ -0,0 +1,197 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/toplevel.h +// Purpose: Top level window, abstraction of wxFrame and wxDialog +// Author: Vaclav Slavik +// Id: $Id: toplevel.h 42664 2006-10-29 20:39:31Z VZ $ +// Copyright: (c) 2001-2002 SciTech Software, Inc. (www.scitechsoft.com) +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + + +#ifndef __WX_UNIV_TOPLEVEL_H__ +#define __WX_UNIV_TOPLEVEL_H__ + +#include "wx/univ/inpcons.h" +#include "wx/univ/inphand.h" +#include "wx/icon.h" + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// frame decorations type flags used in wxRenderer and wxColourScheme +enum +{ + wxTOPLEVEL_ACTIVE = 0x00000001, + wxTOPLEVEL_MAXIMIZED = 0x00000002, + wxTOPLEVEL_TITLEBAR = 0x00000004, + wxTOPLEVEL_ICON = 0x00000008, + wxTOPLEVEL_RESIZEABLE = 0x00000010, + wxTOPLEVEL_BORDER = 0x00000020, + wxTOPLEVEL_BUTTON_CLOSE = 0x01000000, + wxTOPLEVEL_BUTTON_MAXIMIZE = 0x02000000, + wxTOPLEVEL_BUTTON_ICONIZE = 0x04000000, + wxTOPLEVEL_BUTTON_RESTORE = 0x08000000, + wxTOPLEVEL_BUTTON_HELP = 0x10000000 +}; + +// frame hit test return values: +enum +{ + wxHT_TOPLEVEL_NOWHERE = 0x00000000, + wxHT_TOPLEVEL_CLIENT_AREA = 0x00000001, + wxHT_TOPLEVEL_ICON = 0x00000002, + wxHT_TOPLEVEL_TITLEBAR = 0x00000004, + + wxHT_TOPLEVEL_BORDER_N = 0x00000010, + wxHT_TOPLEVEL_BORDER_S = 0x00000020, + wxHT_TOPLEVEL_BORDER_E = 0x00000040, + wxHT_TOPLEVEL_BORDER_W = 0x00000080, + wxHT_TOPLEVEL_BORDER_NE = wxHT_TOPLEVEL_BORDER_N | wxHT_TOPLEVEL_BORDER_E, + wxHT_TOPLEVEL_BORDER_SE = wxHT_TOPLEVEL_BORDER_S | wxHT_TOPLEVEL_BORDER_E, + wxHT_TOPLEVEL_BORDER_NW = wxHT_TOPLEVEL_BORDER_N | wxHT_TOPLEVEL_BORDER_W, + wxHT_TOPLEVEL_BORDER_SW = wxHT_TOPLEVEL_BORDER_S | wxHT_TOPLEVEL_BORDER_W, + wxHT_TOPLEVEL_ANY_BORDER = 0x000000F0, + + wxHT_TOPLEVEL_BUTTON_CLOSE = /*0x01000000*/ wxTOPLEVEL_BUTTON_CLOSE, + wxHT_TOPLEVEL_BUTTON_MAXIMIZE = /*0x02000000*/ wxTOPLEVEL_BUTTON_MAXIMIZE, + wxHT_TOPLEVEL_BUTTON_ICONIZE = /*0x04000000*/ wxTOPLEVEL_BUTTON_ICONIZE, + wxHT_TOPLEVEL_BUTTON_RESTORE = /*0x08000000*/ wxTOPLEVEL_BUTTON_RESTORE, + wxHT_TOPLEVEL_BUTTON_HELP = /*0x10000000*/ wxTOPLEVEL_BUTTON_HELP, + wxHT_TOPLEVEL_ANY_BUTTON = 0x1F000000 +}; + +// Flags for interactive frame manipulation functions (only in wxUniversal): +enum +{ + wxINTERACTIVE_MOVE = 0x00000001, + wxINTERACTIVE_RESIZE = 0x00000002, + wxINTERACTIVE_RESIZE_S = 0x00000010, + wxINTERACTIVE_RESIZE_N = 0x00000020, + wxINTERACTIVE_RESIZE_W = 0x00000040, + wxINTERACTIVE_RESIZE_E = 0x00000080, + wxINTERACTIVE_WAIT_FOR_INPUT = 0x10000000 +}; + +// ---------------------------------------------------------------------------- +// the actions supported by this control +// ---------------------------------------------------------------------------- + +#define wxACTION_TOPLEVEL_ACTIVATE _T("activate") // (de)activate the frame +#define wxACTION_TOPLEVEL_BUTTON_PRESS _T("pressbtn") // press titlebar btn +#define wxACTION_TOPLEVEL_BUTTON_RELEASE _T("releasebtn") // press titlebar btn +#define wxACTION_TOPLEVEL_BUTTON_CLICK _T("clickbtn") // press titlebar btn +#define wxACTION_TOPLEVEL_MOVE _T("move") // move the frame +#define wxACTION_TOPLEVEL_RESIZE _T("resize") // resize the frame + +//----------------------------------------------------------------------------- +// wxTopLevelWindow +//----------------------------------------------------------------------------- + +class WXDLLEXPORT wxTopLevelWindow : public wxTopLevelWindowNative, + public wxInputConsumer +{ +public: + // construction + wxTopLevelWindow() { Init(); } + wxTopLevelWindow(wxWindow *parent, + wxWindowID id, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDEFAULT_FRAME_STYLE, + const wxString& name = wxFrameNameStr) + { + Init(); + + Create(parent, id, title, pos, size, style, name); + } + + bool Create(wxWindow *parent, + wxWindowID id, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDEFAULT_FRAME_STYLE, + const wxString& name = wxFrameNameStr); + + // wxUniv-specific methods: do [not] use native decorations for this (or + // all) window(s) + // + // notice that this has no effect if the system doesn't support any native + // decorations anyhow and that by default native decorations are used + // + // if UseNativeDecorations() is used, it must be called before Create() + static void UseNativeDecorationsByDefault(bool native = true); + void UseNativeDecorations(bool native = true); + bool IsUsingNativeDecorations() const; + + + // implement base class pure virtuals + virtual bool ShowFullScreen(bool show, long style = wxFULLSCREEN_ALL); + virtual wxPoint GetClientAreaOrigin() const; + virtual void SetIcon(const wxIcon& icon) { SetIcons( wxIconBundle( icon ) ); } + virtual void SetIcons(const wxIconBundle& icons); + + // implementation from now on + // -------------------------- + + // tests for frame's part at given point + long HitTest(const wxPoint& pt) const; + + virtual bool PerformAction(const wxControlAction& action, + long numArg = -1, + const wxString& strArg = wxEmptyString); + + static wxInputHandler *GetStdInputHandler(wxInputHandler *handlerDef); + virtual wxInputHandler *DoGetStdInputHandler(wxInputHandler *handlerDef) + { + return GetStdInputHandler(handlerDef); + } + + // move/resize the frame interactively, i.e. let the user do it + virtual void InteractiveMove(int flags = wxINTERACTIVE_MOVE); + + virtual wxSize GetMinSize() const; + + virtual wxWindow *GetInputWindow() const { return wx_const_cast(wxTopLevelWindow*, this); } + +protected: + virtual void DoGetClientSize(int *width, int *height) const; + virtual void DoSetClientSize(int width, int height); + + // handle titlebar button click event + virtual void ClickTitleBarButton(long button); + + // return wxTOPLEVEL_xxx combination based on current state of the frame + long GetDecorationsStyle() const; + + // common part of all ctors + void Init(); + + void RefreshTitleBar(); + void OnNcPaint(wxNcPaintEvent& event); + void OnSystemMenu(wxCommandEvent& event); + + // true if wxTLW should render decorations (aka titlebar) itself + static int ms_drawDecorations; + // true if wxTLW can be iconized + static int ms_canIconize; + + // true if we're using native decorations + bool m_usingNativeDecorations; + // true for currently active frame + bool m_isActive; + // version of icon for titlebar (16x16) + wxIcon m_titlebarIcon; + // saved window style in fullscreen mdoe + long m_fsSavedStyle; + // currently pressed titlebar button + long m_pressedButton; + + DECLARE_DYNAMIC_CLASS(wxTopLevelWindow) + DECLARE_EVENT_TABLE() + WX_DECLARE_INPUT_CONSUMER() +}; + +#endif // __WX_UNIV_TOPLEVEL_H__ diff --git a/Externals/wxWidgets/include/wx/univ/window.h b/Externals/wxWidgets/include/wx/univ/window.h new file mode 100644 index 0000000000..95ee644be0 --- /dev/null +++ b/Externals/wxWidgets/include/wx/univ/window.h @@ -0,0 +1,287 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/univ/window.h +// Purpose: wxWindow class which is the base class for all +// wxUniv port controls, it supports the customization of the +// window drawing and input processing. +// Author: Vadim Zeitlin +// Modified by: +// Created: 06.08.00 +// RCS-ID: $Id: window.h 39633 2006-06-08 11:25:30Z ABX $ +// Copyright: (c) 2000 SciTech Software, Inc. (www.scitechsoft.com) +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIV_WINDOW_H_ +#define _WX_UNIV_WINDOW_H_ + +#include "wx/bitmap.h" // for m_bitmapBg + +class WXDLLEXPORT wxControlRenderer; +class WXDLLEXPORT wxEventLoop; + +#if wxUSE_MENUS + class WXDLLEXPORT wxMenu; + class WXDLLEXPORT wxMenuBar; +#endif // wxUSE_MENUS + +class WXDLLEXPORT wxRenderer; + +#if wxUSE_SCROLLBAR + class WXDLLEXPORT wxScrollBar; +#endif // wxUSE_SCROLLBAR + +#ifdef __WXX11__ +#define wxUSE_TWO_WINDOWS 1 +#else +#define wxUSE_TWO_WINDOWS 0 +#endif + +// ---------------------------------------------------------------------------- +// wxWindow +// ---------------------------------------------------------------------------- + +#if defined(__WXMSW__) +#define wxWindowNative wxWindowMSW +#elif defined(__WXGTK__) +#define wxWindowNative wxWindowGTK +#elif defined(__WXMGL__) +#define wxWindowNative wxWindowMGL +#elif defined(__WXX11__) +#define wxWindowNative wxWindowX11 +#elif defined(__WXMAC__) +#define wxWindowNative wxWindowMac +#endif + +class WXDLLEXPORT wxWindow : public wxWindowNative +{ +public: + // ctors and create functions + // --------------------------- + + wxWindow() { Init(); } + + wxWindow(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxPanelNameStr) + : wxWindowNative(parent, id, pos, size, style | wxCLIP_CHILDREN, name) + { Init(); } + + bool Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxPanelNameStr); + + virtual ~wxWindow(); + + // background pixmap support + // ------------------------- + + virtual void SetBackground(const wxBitmap& bitmap, + int alignment = wxALIGN_CENTRE, + wxStretch stretch = wxSTRETCH_NOT); + + const wxBitmap& GetBackgroundBitmap(int *alignment = NULL, + wxStretch *stretch = NULL) const; + + // scrollbars: we (re)implement it ourselves using our own scrollbars + // instead of the native ones + // ------------------------------------------------------------------ + + virtual void SetScrollbar(int orient, + int pos, + int page, + int range, + bool refresh = true ); + virtual void SetScrollPos(int orient, int pos, bool refresh = true); + virtual int GetScrollPos(int orient) const; + virtual int GetScrollThumb(int orient) const; + virtual int GetScrollRange(int orient) const; + virtual void ScrollWindow(int dx, int dy, + const wxRect* rect = (wxRect *) NULL); + + // take into account the borders here + virtual wxPoint GetClientAreaOrigin() const; + + // popup menu support + // ------------------ + + // NB: all menu related functions are implemented in menu.cpp + +#if wxUSE_MENUS + // this is wxUniv-specific private method to be used only by wxMenu + void DismissPopupMenu(); +#endif // wxUSE_MENUS + + // miscellaneous other methods + // --------------------------- + + // get the state information + virtual bool IsFocused() const; + virtual bool IsCurrent() const; + virtual bool IsPressed() const; + virtual bool IsDefault() const; + + // return all state flags at once (combination of wxCONTROL_XXX values) + int GetStateFlags() const; + + // set the "highlighted" flag and return true if it changed + virtual bool SetCurrent(bool doit = true); + +#if wxUSE_SCROLLBAR + // get the scrollbar (may be NULL) for the given orientation + wxScrollBar *GetScrollbar(int orient) const + { + return orient & wxVERTICAL ? m_scrollbarVert : m_scrollbarHorz; + } +#endif // wxUSE_SCROLLBAR + + // methods used by wxColourScheme to choose the colours for this window + // -------------------------------------------------------------------- + + // return true if this is a panel/canvas window which contains other + // controls only + virtual bool IsCanvasWindow() const { return false; } + + // return true if this control can be highlighted when the mouse is over + // it (the theme decides itself whether it is really highlighted or not) + virtual bool CanBeHighlighted() const { return false; } + + // return true if we should use the colours/fonts returned by the + // corresponding GetXXX() methods instead of the default ones + bool UseFgCol() const { return m_hasFgCol; } + bool UseFont() const { return m_hasFont; } + + // return true if this window serves as a container for the other windows + // only and doesn't get any input itself + virtual bool IsStaticBox() const { return false; } + + // returns the (low level) renderer to use for drawing the control by + // querying the current theme + wxRenderer *GetRenderer() const { return m_renderer; } + + // scrolling helper: like ScrollWindow() except that it doesn't refresh the + // uncovered window areas but returns the rectangle to update (don't call + // this with both dx and dy non zero) + wxRect ScrollNoRefresh(int dx, int dy, const wxRect *rect = NULL); + + // after scrollbars are added or removed they must be refreshed by calling + // this function + void RefreshScrollbars(); + + // erase part of the control + virtual void EraseBackground(wxDC& dc, const wxRect& rect); + + // overridden base class methods + // ----------------------------- + + // the rect coordinates are, for us, in client coords, but if no rect is + // specified, the entire window is refreshed + virtual void Refresh(bool eraseBackground = true, + const wxRect *rect = (const wxRect *) NULL); + + // we refresh the window when it is dis/enabled + virtual bool Enable(bool enable = true); + + // should we use the standard control colours or not? + virtual bool ShouldInheritColours() const { return false; } + +protected: + // common part of all ctors + void Init(); + +#if wxUSE_MENUS + virtual bool DoPopupMenu(wxMenu *menu, int x, int y); +#endif // wxUSE_MENUS + + // we deal with the scrollbars in these functions + virtual void DoSetClientSize(int width, int height); + virtual void DoGetClientSize(int *width, int *height) const; + virtual wxHitTest DoHitTest(wxCoord x, wxCoord y) const; + + // event handlers + void OnSize(wxSizeEvent& event); + void OnNcPaint(wxNcPaintEvent& event); + void OnPaint(wxPaintEvent& event); + void OnErase(wxEraseEvent& event); + +#if wxUSE_ACCEL || wxUSE_MENUS + void OnKeyDown(wxKeyEvent& event); +#endif // wxUSE_ACCEL + +#if wxUSE_MENUS + void OnChar(wxKeyEvent& event); + void OnKeyUp(wxKeyEvent& event); +#endif // wxUSE_MENUS + + // draw the control background, return true if done + virtual bool DoDrawBackground(wxDC& dc); + + // draw the controls border + virtual void DoDrawBorder(wxDC& dc, const wxRect& rect); + + // draw the controls contents + virtual void DoDraw(wxControlRenderer *renderer); + + // calculate the best size for the client area of the window: default + // implementation of DoGetBestSize() uses this method and adds the border + // width to the result + virtual wxSize DoGetBestClientSize() const; + virtual wxSize DoGetBestSize() const; + + // adjust the size of the window to take into account its borders + wxSize AdjustSize(const wxSize& size) const; + + // put the scrollbars along the edges of the window + void PositionScrollbars(); + +#if wxUSE_MENUS + // return the menubar of the parent frame or NULL + wxMenuBar *GetParentFrameMenuBar() const; +#endif // wxUSE_MENUS + + // the renderer we use + wxRenderer *m_renderer; + + // background bitmap info + wxBitmap m_bitmapBg; + int m_alignBgBitmap; + wxStretch m_stretchBgBitmap; + + // old size + wxSize m_oldSize; + + // is the mouse currently inside the window? + bool m_isCurrent:1; + +#ifdef __WXMSW__ +public: + // override MSWWindowProc() to process WM_NCHITTEST + WXLRESULT MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam); +#endif // __WXMSW__ + +private: + +#if wxUSE_SCROLLBAR + // the window scrollbars + wxScrollBar *m_scrollbarHorz, + *m_scrollbarVert; +#endif // wxUSE_SCROLLBAR + +#if wxUSE_MENUS + // the current modal event loop for the popup menu we show or NULL + static wxEventLoop *ms_evtLoopPopup; + + // the last window over which Alt was pressed (used by OnKeyUp) + static wxWindow *ms_winLastAltPress; +#endif // wxUSE_MENUS + + DECLARE_DYNAMIC_CLASS(wxWindow) + DECLARE_EVENT_TABLE() +}; + +#endif // _WX_UNIV_WINDOW_H_ diff --git a/Externals/wxWidgets/include/wx/unix/apptbase.h b/Externals/wxWidgets/include/wx/unix/apptbase.h new file mode 100644 index 0000000000..ad1693b26f --- /dev/null +++ b/Externals/wxWidgets/include/wx/unix/apptbase.h @@ -0,0 +1,54 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/unix/apptbase.h +// Purpose: declaration of wxAppTraits for Unix systems +// Author: Vadim Zeitlin +// Modified by: +// Created: 23.06.2003 +// RCS-ID: $Id: apptbase.h 29409 2004-09-26 16:28:51Z VZ $ +// Copyright: (c) 2003 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIX_APPTBASE_H_ +#define _WX_UNIX_APPTBASE_H_ + +struct wxExecuteData; +class wxPipe; + +// ---------------------------------------------------------------------------- +// wxAppTraits: the Unix version adds extra hooks needed by Unix code +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxAppTraits : public wxAppTraitsBase +{ +public: + // wxExecute() support methods + // --------------------------- + + // called before starting the child process and creates the pipe used for + // detecting the process termination asynchronously in GUI, does nothing in + // wxBase + // + // if it returns false, we should return from wxExecute() with an error + virtual bool CreateEndProcessPipe(wxExecuteData& execData) = 0; + + // test if the given descriptor is the end of the pipe create by the + // function above + virtual bool IsWriteFDOfEndProcessPipe(wxExecuteData& execData, int fd) = 0; + + // ensure that the write end of the pipe is not closed by wxPipe dtor + virtual void DetachWriteFDOfEndProcessPipe(wxExecuteData& execData) = 0; + + // wait for the process termination, return whatever wxExecute() must + // return + virtual int WaitForChild(wxExecuteData& execData) = 0; + + + // wxThread helpers + // ---------------- + + // TODO +}; + +#endif // _WX_UNIX_APPTBASE_H_ + diff --git a/Externals/wxWidgets/include/wx/unix/apptrait.h b/Externals/wxWidgets/include/wx/unix/apptrait.h new file mode 100644 index 0000000000..e95f6dae4f --- /dev/null +++ b/Externals/wxWidgets/include/wx/unix/apptrait.h @@ -0,0 +1,55 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/unix/apptrait.h +// Purpose: standard implementations of wxAppTraits for Unix +// Author: Vadim Zeitlin +// Modified by: +// Created: 23.06.2003 +// RCS-ID: $Id: apptrait.h 43629 2006-11-24 11:33:53Z RR $ +// Copyright: (c) 2003 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIX_APPTRAIT_H_ +#define _WX_UNIX_APPTRAIT_H_ + +// ---------------------------------------------------------------------------- +// wxGUI/ConsoleAppTraits: must derive from wxAppTraits, not wxAppTraitsBase +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxConsoleAppTraits : public wxConsoleAppTraitsBase +{ +public: + virtual bool CreateEndProcessPipe(wxExecuteData& execData); + virtual bool IsWriteFDOfEndProcessPipe(wxExecuteData& execData, int fd); + virtual void DetachWriteFDOfEndProcessPipe(wxExecuteData& execData); + virtual int WaitForChild(wxExecuteData& execData); +}; + +#if wxUSE_GUI + +class WXDLLEXPORT wxGUIAppTraits : public wxGUIAppTraitsBase +{ +public: + virtual bool CreateEndProcessPipe(wxExecuteData& execData); + virtual bool IsWriteFDOfEndProcessPipe(wxExecuteData& execData, int fd); + virtual void DetachWriteFDOfEndProcessPipe(wxExecuteData& execData); + virtual int WaitForChild(wxExecuteData& execData); + +#if defined(__WXMAC__) || defined(__WXCOCOA__) + virtual wxStandardPathsBase& GetStandardPaths(); +#endif + virtual wxPortId GetToolkitVersion(int *majVer, int *minVer) const; + +#ifdef __WXGTK__ + virtual wxString GetDesktopEnvironment() const; +#endif + +#if defined(__WXDEBUG__) && defined(__WXGTK20__) + virtual bool ShowAssertDialog(const wxString& msg); +#endif +}; + +#endif // wxUSE_GUI + +#endif // _WX_UNIX_APPTRAIT_H_ + diff --git a/Externals/wxWidgets/include/wx/unix/execute.h b/Externals/wxWidgets/include/wx/unix/execute.h new file mode 100644 index 0000000000..7d333deffa --- /dev/null +++ b/Externals/wxWidgets/include/wx/unix/execute.h @@ -0,0 +1,79 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: unix/execute.h +// Purpose: private details of wxExecute() implementation +// Author: Vadim Zeitlin +// Id: $Id: execute.h 35055 2005-08-02 22:58:06Z MW $ +// Copyright: (c) 1998 Robert Roebling, Julian Smart, Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIX_EXECUTE_H +#define _WX_UNIX_EXECUTE_H + +#include "wx/unix/pipe.h" + +class WXDLLIMPEXP_BASE wxProcess; +class wxStreamTempInputBuffer; + +// if pid > 0, the execution is async and the data is freed in the callback +// executed when the process terminates, if pid < 0, the execution is +// synchronous and the caller (wxExecute) frees the data +struct wxEndProcessData +{ + int pid, // pid of the process + tag; // port dependent value + wxProcess *process; // if !NULL: notified on process termination + int exitcode; // the exit code +}; + +// struct in which information is passed from wxExecute() to wxAppTraits +// methods +struct wxExecuteData +{ + wxExecuteData() + { + flags = + pid = 0; + + process = NULL; + +#if wxUSE_STREAMS + bufOut = + bufErr = NULL; +#endif // wxUSE_STREAMS + } + + // wxExecute() flags + int flags; + + // the pid of the child process + int pid; + + // the associated process object or NULL + wxProcess *process; + + // pipe used for end process detection + wxPipe pipeEndProcDetect; + +#if wxUSE_STREAMS + // the input buffer bufOut is connected to stdout, this is why it is + // called bufOut and not bufIn + wxStreamTempInputBuffer *bufOut, + *bufErr; +#endif // wxUSE_STREAMS +}; + +// this function is called when the process terminates from port specific +// callback function and is common to all ports (src/unix/utilsunx.cpp) +extern WXDLLIMPEXP_BASE void wxHandleProcessTermination(wxEndProcessData *proc_data); + +// this function is called to associate the port-specific callback with the +// child process. The return valus is port-specific. +extern WXDLLIMPEXP_CORE int wxAddProcessCallback(wxEndProcessData *proc_data, int fd); + +#if defined(__DARWIN__) && (defined(__WXMAC__) || defined(__WXCOCOA__)) +// For ports (e.g. DARWIN) which can add callbacks based on the pid +extern int wxAddProcessCallbackForPid(wxEndProcessData *proc_data, int pid); +#endif + +#endif // _WX_UNIX_EXECUTE_H diff --git a/Externals/wxWidgets/include/wx/unix/fontutil.h b/Externals/wxWidgets/include/wx/unix/fontutil.h new file mode 100644 index 0000000000..5d7da717b3 --- /dev/null +++ b/Externals/wxWidgets/include/wx/unix/fontutil.h @@ -0,0 +1,37 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/unix/fontutil.h +// Purpose: font-related helper functions for Unix/X11 +// Author: Vadim Zeitlin +// Modified by: +// Created: 05.11.99 +// RCS-ID: $Id: fontutil.h 27408 2004-05-23 20:53:33Z JS $ +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIX_FONTUTIL_H_ +#define _WX_UNIX_FONTUTIL_H_ + +#ifdef __X__ + typedef WXFontStructPtr wxNativeFont; +#elif defined(__WXGTK__) + typedef GdkFont *wxNativeFont; +#else + #error "Unsupported toolkit" +#endif + +// returns the handle of the nearest available font or 0 +extern wxNativeFont +wxLoadQueryNearestFont(int pointSize, + int family, + int style, + int weight, + bool underlined, + const wxString &facename, + wxFontEncoding encoding, + wxString* xFontName = (wxString *)NULL); + +// returns the font specified by the given XLFD +extern wxNativeFont wxLoadFont(const wxString& fontSpec); + +#endif // _WX_UNIX_FONTUTIL_H_ diff --git a/Externals/wxWidgets/include/wx/unix/gsockunx.h b/Externals/wxWidgets/include/wx/unix/gsockunx.h new file mode 100644 index 0000000000..abdf6f901a --- /dev/null +++ b/Externals/wxWidgets/include/wx/unix/gsockunx.h @@ -0,0 +1,145 @@ +/* ------------------------------------------------------------------------- + * Project: GSocket (Generic Socket) for WX + * Name: gsockunx.h + * Copyright: (c) Guilhem Lavaux + * Licence: wxWindows Licence + * Purpose: GSocket Unix header + * CVSID: $Id: gsockunx.h 33948 2005-05-04 18:57:50Z JS $ + * ------------------------------------------------------------------------- + */ + +#ifndef __GSOCK_UNX_H +#define __GSOCK_UNX_H + +#ifndef __GSOCKET_STANDALONE__ +#include "wx/setup.h" +#endif + +#if wxUSE_SOCKETS || defined(__GSOCKET_STANDALONE__) + +#ifndef __GSOCKET_STANDALONE__ +#include "wx/gsocket.h" +#else +#include "gsocket.h" +#endif + +class GSocketGUIFunctionsTableConcrete: public GSocketGUIFunctionsTable +{ +public: + virtual bool OnInit(); + virtual void OnExit(); + virtual bool CanUseEventLoop(); + virtual bool Init_Socket(GSocket *socket); + virtual void Destroy_Socket(GSocket *socket); + virtual void Install_Callback(GSocket *socket, GSocketEvent event); + virtual void Uninstall_Callback(GSocket *socket, GSocketEvent event); + virtual void Enable_Events(GSocket *socket); + virtual void Disable_Events(GSocket *socket); +}; + +class GSocket +{ +public: + GSocket(); + virtual ~GSocket(); + bool IsOk() { return m_ok; } + void Close(); + void Shutdown(); + GSocketError SetLocal(GAddress *address); + GSocketError SetPeer(GAddress *address); + GAddress *GetLocal(); + GAddress *GetPeer(); + GSocketError SetServer(); + GSocket *WaitConnection(); + bool SetReusable(); + GSocketError Connect(GSocketStream stream); + GSocketError SetNonOriented(); + int Read(char *buffer, int size); + int Write(const char *buffer, int size); + GSocketEventFlags Select(GSocketEventFlags flags); + void SetNonBlocking(bool non_block); + void SetTimeout(unsigned long millisec); + GSocketError WXDLLIMPEXP_NET GetError(); + void SetCallback(GSocketEventFlags flags, + GSocketCallback callback, char *cdata); + void UnsetCallback(GSocketEventFlags flags); + GSocketError GetSockOpt(int level, int optname, void *optval, int *optlen); + GSocketError SetSockOpt(int level, int optname, + const void *optval, int optlen); + virtual void Detected_Read(); + virtual void Detected_Write(); +protected: + void Enable(GSocketEvent event); + void Disable(GSocketEvent event); + GSocketError Input_Timeout(); + GSocketError Output_Timeout(); + int Recv_Stream(char *buffer, int size); + int Recv_Dgram(char *buffer, int size); + int Send_Stream(const char *buffer, int size); + int Send_Dgram(const char *buffer, int size); + bool m_ok; +public: + /* DFE: We can't protect these data member until the GUI code is updated */ + /* protected: */ + int m_fd; + GAddress *m_local; + GAddress *m_peer; + GSocketError m_error; + + bool m_non_blocking; + bool m_server; + bool m_stream; + bool m_establishing; + bool m_reusable; + unsigned long m_timeout; + + /* Callbacks */ + GSocketEventFlags m_detected; + GSocketCallback m_cbacks[GSOCK_MAX_EVENT]; + char *m_data[GSOCK_MAX_EVENT]; + + char *m_gui_dependent; + +}; + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ +/* Definition of GAddress */ +struct _GAddress +{ + struct sockaddr *m_addr; + size_t m_len; + + GAddressType m_family; + int m_realfamily; + + GSocketError m_error; +}; +#ifdef __cplusplus +} +#endif /* __cplusplus */ + + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + + +/* GAddress */ + +GSocketError _GAddress_translate_from(GAddress *address, + struct sockaddr *addr, int len); +GSocketError _GAddress_translate_to (GAddress *address, + struct sockaddr **addr, int *len); +GSocketError _GAddress_Init_INET(GAddress *address); +GSocketError _GAddress_Init_UNIX(GAddress *address); + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* wxUSE_SOCKETS || defined(__GSOCKET_STANDALONE__) */ + +#endif /* __GSOCK_UNX_H */ diff --git a/Externals/wxWidgets/include/wx/unix/joystick.h b/Externals/wxWidgets/include/wx/unix/joystick.h new file mode 100644 index 0000000000..b76dcef45d --- /dev/null +++ b/Externals/wxWidgets/include/wx/unix/joystick.h @@ -0,0 +1,95 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/unix/joystick.h +// Purpose: wxJoystick class +// Author: Guilhem Lavaux +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: joystick.h 42077 2006-10-17 14:44:52Z ABX $ +// Copyright: (c) Guilhem Lavaux +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef __JOYSTICKH__ +#define __JOYSTICKH__ + +#include "wx/event.h" +#include "wx/thread.h" + +class WXDLLEXPORT wxJoystickThread; + +class WXDLLEXPORT wxJoystick: public wxObject +{ + DECLARE_DYNAMIC_CLASS(wxJoystick) + public: + /* + * Public interface + */ + + wxJoystick(int joystick = wxJOYSTICK1); + virtual ~wxJoystick(); + + // Attributes + //////////////////////////////////////////////////////////////////////////// + + wxPoint GetPosition() const; + int GetZPosition() const; + int GetButtonState() const; + int GetPOVPosition() const; + int GetPOVCTSPosition() const; + int GetRudderPosition() const; + int GetUPosition() const; + int GetVPosition() const; + int GetMovementThreshold() const; + void SetMovementThreshold(int threshold) ; + + // Capabilities + //////////////////////////////////////////////////////////////////////////// + + bool IsOk() const; // Checks that the joystick is functioning + static int GetNumberJoysticks() ; + int GetManufacturerId() const ; + int GetProductId() const ; + wxString GetProductName() const ; + int GetXMin() const; + int GetYMin() const; + int GetZMin() const; + int GetXMax() const; + int GetYMax() const; + int GetZMax() const; + int GetNumberButtons() const; + int GetNumberAxes() const; + int GetMaxButtons() const; + int GetMaxAxes() const; + int GetPollingMin() const; + int GetPollingMax() const; + int GetRudderMin() const; + int GetRudderMax() const; + int GetUMin() const; + int GetUMax() const; + int GetVMin() const; + int GetVMax() const; + + bool HasRudder() const; + bool HasZ() const; + bool HasU() const; + bool HasV() const; + bool HasPOV() const; + bool HasPOV4Dir() const; + bool HasPOVCTS() const; + + // Operations + //////////////////////////////////////////////////////////////////////////// + + // pollingFreq = 0 means that movement events are sent when above the threshold. + // If pollingFreq > 0, events are received every this many milliseconds. + bool SetCapture(wxWindow* win, int pollingFreq = 0); + bool ReleaseCapture(); + +protected: + int m_device; + int m_joystick; + wxJoystickThread* m_thread; +}; + +#endif + // __JOYSTICKH__ diff --git a/Externals/wxWidgets/include/wx/unix/mimetype.h b/Externals/wxWidgets/include/wx/unix/mimetype.h new file mode 100644 index 0000000000..f37923001c --- /dev/null +++ b/Externals/wxWidgets/include/wx/unix/mimetype.h @@ -0,0 +1,215 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/unix/mimetype.h +// Purpose: classes and functions to manage MIME types +// Author: Vadim Zeitlin +// Modified by: +// Created: 23.09.98 +// RCS-ID: $Id: mimetype.h 43723 2006-11-30 13:24:32Z RR $ +// Copyright: (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> +// Licence: wxWindows licence (part of wxExtra library) +///////////////////////////////////////////////////////////////////////////// + +#ifndef _MIMETYPE_IMPL_H +#define _MIMETYPE_IMPL_H + +#include "wx/mimetype.h" + +#if wxUSE_MIMETYPE + +class wxMimeTypeCommands; + +WX_DEFINE_ARRAY_PTR(wxMimeTypeCommands *, wxMimeCommandsArray); + +// this is the real wxMimeTypesManager for Unix +class WXDLLEXPORT wxMimeTypesManagerImpl +{ +public: + // ctor and dtor + wxMimeTypesManagerImpl(); + virtual ~wxMimeTypesManagerImpl(); + + // load all data into memory - done when it is needed for the first time + void Initialize(int mailcapStyles = wxMAILCAP_ALL, + const wxString& extraDir = wxEmptyString); + + // and delete the data here + void ClearData(); + + // implement containing class functions + wxFileType *GetFileTypeFromExtension(const wxString& ext); + wxFileType *GetFileTypeFromMimeType(const wxString& mimeType); + + size_t EnumAllFileTypes(wxArrayString& mimetypes); + + bool ReadMailcap(const wxString& filename, bool fallback = FALSE); + bool ReadMimeTypes(const wxString& filename); + + void AddFallback(const wxFileTypeInfo& filetype); + + // add information about the given mimetype + void AddMimeTypeInfo(const wxString& mimetype, + const wxString& extensions, + const wxString& description); + void AddMailcapInfo(const wxString& strType, + const wxString& strOpenCmd, + const wxString& strPrintCmd, + const wxString& strTest, + const wxString& strDesc); + + // add a new record to the user .mailcap/.mime.types files + wxFileType *Associate(const wxFileTypeInfo& ftInfo); + // remove association + bool Unassociate(wxFileType *ft); + + // accessors + // get the string containing space separated extensions for the given + // file type + wxString GetExtension(size_t index) { return m_aExtensions[index]; } + +protected: + void InitIfNeeded(); + + wxArrayString m_aTypes, // MIME types + m_aDescriptions, // descriptions (just some text) + m_aExtensions, // space separated list of extensions + m_aIcons; // Icon filenames + + // verb=command pairs for this file type + wxMimeCommandsArray m_aEntries; + + // are we initialized? + bool m_initialized; + + // keep track of the files we had already loaded (this is a bitwise OR of + // wxMailcapStyle values) + int m_mailcapStylesInited; + + wxString GetCommand(const wxString &verb, size_t nIndex) const; + + // read Gnome files + void LoadGnomeDataFromKeyFile(const wxString& filename, + const wxArrayString& dirs); + void LoadGnomeMimeTypesFromMimeFile(const wxString& filename); + void LoadGnomeMimeFilesFromDir(const wxString& dirbase, + const wxArrayString& dirs); + void GetGnomeMimeInfo(const wxString& sExtraDir); + + // read KDE + void LoadKDELinksForMimeSubtype(const wxString& dirbase, + const wxString& subdir, + const wxString& filename, + const wxArrayString& icondirs); + void LoadKDELinksForMimeType(const wxString& dirbase, + const wxString& subdir, + const wxArrayString& icondirs); + void LoadKDELinkFilesFromDir(const wxString& dirbase, + const wxArrayString& icondirs); + void LoadKDEApp(const wxString& filename); + void LoadKDEAppsFilesFromDir(const wxString& dirname); + void GetKDEMimeInfo(const wxString& sExtraDir); + + // write KDE + bool WriteKDEMimeFile(int index, bool delete_index); + bool CheckKDEDirsExist(const wxString & sOK, const wxString& sTest); + + //read write Netscape and MetaMail formats + void GetMimeInfo (const wxString& sExtraDir); + bool WriteToMailCap (int index, bool delete_index); + bool WriteToMimeTypes (int index, bool delete_index); + bool WriteToNSMimeTypes (int index, bool delete_index); + + // ReadMailcap() helper + bool ProcessOtherMailcapField(struct MailcapLineData& data, + const wxString& curField); + + // functions used to do associations + + virtual int AddToMimeData(const wxString& strType, + const wxString& strIcon, + wxMimeTypeCommands *entry, + const wxArrayString& strExtensions, + const wxString& strDesc, + bool replaceExisting = TRUE); + + virtual bool DoAssociation(const wxString& strType, + const wxString& strIcon, + wxMimeTypeCommands *entry, + const wxArrayString& strExtensions, + const wxString& strDesc); + + virtual bool WriteMimeInfo(int nIndex, bool delete_mime ); + + // give it access to m_aXXX variables + friend class WXDLLEXPORT wxFileTypeImpl; +}; + + + +class WXDLLEXPORT wxFileTypeImpl +{ +public: + // initialization functions + // this is used to construct a list of mimetypes which match; + // if built with GetFileTypeFromMimetype index 0 has the exact match and + // index 1 the type / * match + // if built with GetFileTypeFromExtension, index 0 has the mimetype for + // the first extension found, index 1 for the second and so on + + void Init(wxMimeTypesManagerImpl *manager, size_t index) + { m_manager = manager; m_index.Add(index); } + + // accessors + bool GetExtensions(wxArrayString& extensions); + bool GetMimeType(wxString *mimeType) const + { *mimeType = m_manager->m_aTypes[m_index[0]]; return TRUE; } + bool GetMimeTypes(wxArrayString& mimeTypes) const; + bool GetIcon(wxIconLocation *iconLoc) const; + + bool GetDescription(wxString *desc) const + { *desc = m_manager->m_aDescriptions[m_index[0]]; return TRUE; } + + bool GetOpenCommand(wxString *openCmd, + const wxFileType::MessageParameters& params) const + { + *openCmd = GetExpandedCommand(wxT("open"), params); + return (! openCmd -> IsEmpty() ); + } + + bool GetPrintCommand(wxString *printCmd, + const wxFileType::MessageParameters& params) const + { + *printCmd = GetExpandedCommand(wxT("print"), params); + return (! printCmd -> IsEmpty() ); + } + + // return the number of commands defined for this file type, 0 if none + size_t GetAllCommands(wxArrayString *verbs, wxArrayString *commands, + const wxFileType::MessageParameters& params) const; + + + // remove the record for this file type + // probably a mistake to come here, use wxMimeTypesManager.Unassociate (ft) instead + bool Unassociate(wxFileType *ft) + { + return m_manager->Unassociate(ft); + } + + // set an arbitrary command, ask confirmation if it already exists and + // overwriteprompt is TRUE + bool SetCommand(const wxString& cmd, const wxString& verb, bool overwriteprompt = TRUE); + bool SetDefaultIcon(const wxString& strIcon = wxEmptyString, int index = 0); + +private: + wxString + GetExpandedCommand(const wxString & verb, + const wxFileType::MessageParameters& params) const; + + wxMimeTypesManagerImpl *m_manager; + wxArrayInt m_index; // in the wxMimeTypesManagerImpl arrays +}; + +#endif // wxUSE_MIMETYPE + +#endif // _MIMETYPE_IMPL_H + + diff --git a/Externals/wxWidgets/include/wx/unix/pipe.h b/Externals/wxWidgets/include/wx/unix/pipe.h new file mode 100644 index 0000000000..b693ae89f1 --- /dev/null +++ b/Externals/wxWidgets/include/wx/unix/pipe.h @@ -0,0 +1,114 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/unix/pipe.h +// Purpose: wxPipe class +// Author: Vadim Zeitlin +// Modified by: +// Created: 24.06.2003 (extracted from src/unix/utilsunx.cpp) +// RCS-ID: $Id: pipe.h 40518 2006-08-08 13:06:05Z VS $ +// Copyright: (c) 2003 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIX_PIPE_H_ +#define _WX_UNIX_PIPE_H_ + +#include <unistd.h> + +#include "wx/log.h" +#include "wx/intl.h" + +// ---------------------------------------------------------------------------- +// wxPipe: this class encapsulates pipe() system call +// ---------------------------------------------------------------------------- + +class wxPipe +{ +public: + // the symbolic names for the pipe ends + enum Direction + { + Read, + Write + }; + + enum + { + INVALID_FD = -1 + }; + + // default ctor doesn't do anything + wxPipe() { m_fds[Read] = m_fds[Write] = INVALID_FD; } + + // create the pipe, return TRUE if ok, FALSE on error + bool Create() + { + if ( pipe(m_fds) == -1 ) + { + wxLogSysError(_("Pipe creation failed")); + + return FALSE; + } + + return TRUE; + } + + // return TRUE if we were created successfully + bool IsOk() const { return m_fds[Read] != INVALID_FD; } + + // return the descriptor for one of the pipe ends + int operator[](Direction which) const { return m_fds[which]; } + + // detach a descriptor, meaning that the pipe dtor won't close it, and + // return it + int Detach(Direction which) + { + int fd = m_fds[which]; + m_fds[which] = INVALID_FD; + + return fd; + } + + // close the pipe descriptors + void Close() + { + for ( size_t n = 0; n < WXSIZEOF(m_fds); n++ ) + { + if ( m_fds[n] != INVALID_FD ) + { + close(m_fds[n]); + m_fds[n] = INVALID_FD; + } + } + } + + // dtor closes the pipe descriptors + ~wxPipe() { Close(); } + +private: + int m_fds[2]; +}; + +#if wxUSE_STREAMS && wxUSE_FILE + +#include "wx/wfstream.h" + +// ---------------------------------------------------------------------------- +// wxPipeInputStream: stream for reading from a pipe +// ---------------------------------------------------------------------------- + +class wxPipeInputStream : public wxFileInputStream +{ +public: + wxPipeInputStream(int fd) : wxFileInputStream(fd) { } + + // return TRUE if the pipe is still opened + bool IsOpened() const { return !Eof(); } + + // return TRUE if we have anything to read, don't block + virtual bool CanRead() const; +}; + +#endif // wxUSE_STREAMS && wxUSE_FILE + +#endif // _WX_UNIX_PIPE_H_ + diff --git a/Externals/wxWidgets/include/wx/unix/private.h b/Externals/wxWidgets/include/wx/unix/private.h new file mode 100644 index 0000000000..2e4249a11a --- /dev/null +++ b/Externals/wxWidgets/include/wx/unix/private.h @@ -0,0 +1,47 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/unix/private.h +// Purpose: miscellaneous private things for Unix wx ports +// Author: Vadim Zeitlin +// Created: 2005-09-25 +// RCS-ID: $Id: private.h 35688 2005-09-25 19:59:19Z VZ $ +// Copyright: (c) 2005 Vadim Zeitlin <vadim@wxwindows.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIX_PRIVATE_H_ +#define _WX_UNIX_PRIVATE_H_ + +// standard linux headers produce many warnings when used with icc +#if defined(__INTELC__) && defined(__LINUX__) + inline void wxFD_ZERO(fd_set *fds) + { + #pragma warning(push) + #pragma warning(disable:593) + FD_ZERO(fds); + #pragma warning(pop) + } + + inline void wxFD_SET(int fd, fd_set *fds) + { + #pragma warning(push, 1) + #pragma warning(disable:1469) + FD_SET(fd, fds); + #pragma warning(pop) + } + + inline bool wxFD_ISSET(int fd, fd_set *fds) + { + #pragma warning(push, 1) + #pragma warning(disable:1469) + return FD_ISSET(fd, fds); + #pragma warning(pop) + } +#else // !__INTELC__ + #define wxFD_ZERO(fds) FD_ZERO(fds) + #define wxFD_SET(fd, fds) FD_SET(fd, fds) + #define wxFD_ISSET(fd, fds) FD_ISSET(fd, fds) +#endif // __INTELC__/!__INTELC__ + + +#endif // _WX_UNIX_PRIVATE_H_ + diff --git a/Externals/wxWidgets/include/wx/unix/sound.h b/Externals/wxWidgets/include/wx/unix/sound.h new file mode 100644 index 0000000000..0e18584c3e --- /dev/null +++ b/Externals/wxWidgets/include/wx/unix/sound.h @@ -0,0 +1,161 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/unix/sound.h +// Purpose: wxSound class +// Author: Julian Smart, Vaclav Slavik +// Modified by: +// Created: 25/10/98 +// RCS-ID: $Id: sound.h 42115 2006-10-19 13:09:48Z VZ $ +// Copyright: (c) Julian Smart, Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_SOUND_H_ +#define _WX_SOUND_H_ + +#include "wx/defs.h" + +#if wxUSE_SOUND + +#include "wx/object.h" + +// ---------------------------------------------------------------------------- +// wxSound: simple audio playback class +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxSoundBackend; +class WXDLLIMPEXP_ADV wxSound; +class WXDLLIMPEXP_BASE wxDynamicLibrary; + +/// Sound data, as loaded from .wav file: +class WXDLLIMPEXP_ADV wxSoundData +{ +public: + wxSoundData() : m_refCnt(1) {} + void IncRef(); + void DecRef(); + + // .wav header information: + unsigned m_channels; // num of channels (mono:1, stereo:2) + unsigned m_samplingRate; + unsigned m_bitsPerSample; // if 8, then m_data contains unsigned 8bit + // samples (wxUint8), if 16 then signed 16bit + // (wxInt16) + unsigned m_samples; // length in samples: + + // wave data: + size_t m_dataBytes; + wxUint8 *m_data; // m_dataBytes bytes of data + +private: + ~wxSoundData(); + unsigned m_refCnt; + wxUint8 *m_dataWithHeader; // ditto, but prefixed with .wav header + friend class wxSound; +}; + + +/// Simple sound class: +class WXDLLIMPEXP_ADV wxSound : public wxSoundBase +{ +public: + wxSound(); + wxSound(const wxString& fileName, bool isResource = false); + wxSound(int size, const wxByte* data); + virtual ~wxSound(); + + // Create from resource or file + bool Create(const wxString& fileName, bool isResource = false); + // Create from data + bool Create(int size, const wxByte* data); + + bool IsOk() const { return m_data != NULL; } + + // Stop playing any sound + static void Stop(); + + // Returns true if a sound is being played + static bool IsPlaying(); + + // for internal use + static void UnloadBackend(); + +protected: + bool DoPlay(unsigned flags) const; + + static void EnsureBackend(); + void Free(); + bool LoadWAV(const wxUint8 *data, size_t length, bool copyData); + + static wxSoundBackend *ms_backend; +#if wxUSE_LIBSDL && wxUSE_PLUGINS + // FIXME - temporary, until we have plugins architecture + static wxDynamicLibrary *ms_backendSDL; +#endif + +private: + wxSoundData *m_data; +}; + + +// ---------------------------------------------------------------------------- +// wxSoundBackend: +// ---------------------------------------------------------------------------- + +// This is interface to sound playing implementation. There are multiple +// sound architectures in use on Unix platforms and wxWidgets can use several +// of them for playback, depending on their availability at runtime; hence +// the need for backends. This class is for use by wxWidgets and people writing +// additional backends only, it is _not_ for use by applications! + +// Structure that holds playback status information +struct wxSoundPlaybackStatus +{ + // playback is in progress + bool m_playing; + // main thread called wxSound::Stop() + bool m_stopRequested; +}; + +// Audio backend interface +class WXDLLIMPEXP_ADV wxSoundBackend +{ +public: + virtual ~wxSoundBackend() {} + + // Returns the name of the backend (e.g. "Open Sound System") + virtual wxString GetName() const = 0; + + // Returns priority (higher priority backends are tried first) + virtual int GetPriority() const = 0; + + // Checks if the backend's audio system is available and the backend can + // be used for playback + virtual bool IsAvailable() const = 0; + + // Returns true if the backend is capable of playing sound asynchronously. + // If false, then wxWidgets creates a playback thread and handles async + // playback, otherwise it is left up to the backend (will usually be more + // effective). + virtual bool HasNativeAsyncPlayback() const = 0; + + // Plays the sound. flags are same flags as those passed to wxSound::Play. + // The function should periodically check the value of + // status->m_stopRequested and terminate if it is set to true (it may + // be modified by another thread) + virtual bool Play(wxSoundData *data, unsigned flags, + volatile wxSoundPlaybackStatus *status) = 0; + + // Stops playback (if something is played). + virtual void Stop() = 0; + + // Returns true if the backend is playing anything at the moment. + // (This method is never called for backends that don't support async + // playback.) + virtual bool IsPlaying() const = 0; +}; + + +#endif // wxUSE_SOUND + +#endif // _WX_SOUND_H_ + diff --git a/Externals/wxWidgets/include/wx/unix/stackwalk.h b/Externals/wxWidgets/include/wx/unix/stackwalk.h new file mode 100644 index 0000000000..7528fcdcf6 --- /dev/null +++ b/Externals/wxWidgets/include/wx/unix/stackwalk.h @@ -0,0 +1,97 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/unix/stackwalk.h +// Purpose: declaration of wxStackWalker for Unix +// Author: Vadim Zeitlin +// Modified by: +// Created: 2005-01-19 +// RCS-ID: $Id: stackwalk.h 43346 2006-11-12 14:33:03Z RR $ +// Copyright: (c) 2005 Vadim Zeitlin <vadim@wxwindows.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIX_STACKWALK_H_ +#define _WX_UNIX_STACKWALK_H_ + +// ---------------------------------------------------------------------------- +// wxStackFrame +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxStackFrame : public wxStackFrameBase +{ + friend class wxStackWalker; + +public: + // arguments are the stack depth of this frame, its address and the return + // value of backtrace_symbols() for it + // + // NB: we don't copy syminfo pointer so it should have lifetime at least as + // long as ours + wxStackFrame(size_t level = 0, void *address = NULL, const char *syminfo = NULL) + : wxStackFrameBase(level, address) + { + m_syminfo = syminfo; + } + +protected: + virtual void OnGetName(); + + // optimized for the 2 step initialization done by wxStackWalker + void Set(const wxString &name, const wxString &filename, const char* syminfo, + size_t level, size_t numLine, void *address) + { + m_level = level; + m_name = name; + m_filename = filename; + m_syminfo = syminfo; + + m_line = numLine; + m_address = address; + } + +private: + const char *m_syminfo; +}; + +// ---------------------------------------------------------------------------- +// wxStackWalker +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxStackWalker : public wxStackWalkerBase +{ +public: + // we need the full path to the program executable to be able to use + // addr2line, normally we can retrieve it from wxTheApp but if wxTheApp + // doesn't exist or doesn't have the correct value, the path may be given + // explicitly + wxStackWalker(const char *argv0 = NULL) + { + ms_exepath = wxString::FromAscii(argv0); + } + + ~wxStackWalker() + { + FreeStack(); + } + + virtual void Walk(size_t skip = 1, size_t maxDepth = 200); + virtual void WalkFromException() { Walk(2); } + + static const wxString& GetExePath() { return ms_exepath; } + + + // these two may be used to save the stack at some point (fast operation) + // and then process it later (slow operation) + void SaveStack(size_t maxDepth); + void ProcessFrames(size_t skip); + void FreeStack(); + +private: + int InitFrames(wxStackFrame *arr, size_t n, void **addresses, char **syminfo); + + static wxString ms_exepath; + static void *ms_addresses[]; + static char **ms_symbols; + static int m_depth; +}; + +#endif // _WX_UNIX_STACKWALK_H_ diff --git a/Externals/wxWidgets/include/wx/unix/stdpaths.h b/Externals/wxWidgets/include/wx/unix/stdpaths.h new file mode 100644 index 0000000000..a6b4db05ac --- /dev/null +++ b/Externals/wxWidgets/include/wx/unix/stdpaths.h @@ -0,0 +1,56 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/unix/stdpaths.h +// Purpose: wxStandardPaths for Unix systems +// Author: Vadim Zeitlin +// Modified by: +// Created: 2004-10-19 +// RCS-ID: $Id: stdpaths.h 43340 2006-11-12 12:58:10Z RR $ +// Copyright: (c) 2004 Vadim Zeitlin <vadim@wxwindows.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIX_STDPATHS_H_ +#define _WX_UNIX_STDPATHS_H_ + +// ---------------------------------------------------------------------------- +// wxStandardPaths +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxStandardPaths : public wxStandardPathsBase +{ +public: + // tries to determine the installation prefix automatically (Linux only right + // now) and returns /usr/local if it failed + void DetectPrefix(); + + // set the program installation directory which is /usr/local by default + // + // under some systems (currently only Linux) the program directory can be + // determined automatically but for portable programs you should always set + // it explicitly + void SetInstallPrefix(const wxString& prefix); + + // get the program installation prefix + // + // if the prefix had been previously by SetInstallPrefix, returns that + // value, otherwise calls DetectPrefix() + wxString GetInstallPrefix() const; + + + // implement base class pure virtuals + virtual wxString GetExecutablePath() const; + virtual wxString GetConfigDir() const; + virtual wxString GetUserConfigDir() const; + virtual wxString GetDataDir() const; + virtual wxString GetLocalDataDir() const; + virtual wxString GetUserDataDir() const; + virtual wxString GetPluginsDir() const; + virtual wxString GetLocalizedResourcesDir(const wxChar *lang, + ResourceCat category) const; + +private: + wxString m_prefix; +}; + +#endif // _WX_UNIX_STDPATHS_H_ + diff --git a/Externals/wxWidgets/include/wx/unix/taskbarx11.h b/Externals/wxWidgets/include/wx/unix/taskbarx11.h new file mode 100644 index 0000000000..7e74a54beb --- /dev/null +++ b/Externals/wxWidgets/include/wx/unix/taskbarx11.h @@ -0,0 +1,43 @@ +///////////////////////////////////////////////////////////////////////// +// File: wx/unix/taskbarx11.h +// Purpose: Defines wxTaskBarIcon class for most common X11 desktops +// Author: Vaclav Slavik +// Modified by: +// Created: 04/04/2003 +// RCS-ID: $Id: taskbarx11.h 35650 2005-09-23 12:56:45Z MR $ +// Copyright: (c) Vaclav Slavik, 2003 +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////// + +#ifndef _TASKBAR_H_ +#define _TASKBAR_H_ + +class WXDLLEXPORT wxIcon; +class WXDLLEXPORT wxFrame; +class WXDLLEXPORT wxWindow; + +class WXDLLIMPEXP_ADV wxTaskBarIconArea; + +class WXDLLIMPEXP_ADV wxTaskBarIcon: public wxTaskBarIconBase +{ +public: + wxTaskBarIcon(); + virtual ~wxTaskBarIcon(); + + // Accessors: + bool IsOk() const; + bool IsIconInstalled() const; + + // Operations: + bool SetIcon(const wxIcon& icon, const wxString& tooltip = wxEmptyString); + bool RemoveIcon(); + bool PopupMenu(wxMenu *menu); + +protected: + wxTaskBarIconArea *m_iconWnd; + + DECLARE_DYNAMIC_CLASS(wxTaskBarIcon) +}; + +#endif + // _TASKBAR_H_ diff --git a/Externals/wxWidgets/include/wx/unix/utilsx11.h b/Externals/wxWidgets/include/wx/unix/utilsx11.h new file mode 100644 index 0000000000..66ec873271 --- /dev/null +++ b/Externals/wxWidgets/include/wx/unix/utilsx11.h @@ -0,0 +1,53 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/unix/utilsx11.h +// Purpose: Miscellaneous X11 functions +// Author: Mattia Barbon, Vaclav Slavik +// Modified by: +// Created: 25.03.02 +// RCS-ID: $Id: utilsx11.h 27408 2004-05-23 20:53:33Z JS $ +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UNIX_UTILSX11_H_ +#define _WX_UNIX_UTILSX11_H_ + +#include "wx/defs.h" +#include "wx/gdicmn.h" + +// NB: Content of this header is for wxWidgets' private use! It is not +// part of public API and may be modified or even disappear in the future! + +#if defined(__WXMOTIF__) || defined(__WXGTK__) || defined(__WXX11__) + +#if defined(__WXGTK__) +typedef void WXDisplay; +typedef void* WXWindow; +#endif + +class wxIconBundle; + +void wxSetIconsX11( WXDisplay* display, WXWindow window, + const wxIconBundle& ib ); + + +enum wxX11FullScreenMethod +{ + wxX11_FS_AUTODETECT = 0, + wxX11_FS_WMSPEC, + wxX11_FS_KDE, + wxX11_FS_GENERIC +}; + +wxX11FullScreenMethod wxGetFullScreenMethodX11(WXDisplay* display, + WXWindow rootWindow); + +void wxSetFullScreenStateX11(WXDisplay* display, WXWindow rootWindow, + WXWindow window, bool show, wxRect *origSize, + wxX11FullScreenMethod method); + +#endif + // __WXMOTIF__, __WXGTK__, __WXX11__ + +#endif + // _WX_UNIX_UTILSX11_H_ diff --git a/Externals/wxWidgets/include/wx/uri.h b/Externals/wxWidgets/include/wx/uri.h new file mode 100644 index 0000000000..33d843c602 --- /dev/null +++ b/Externals/wxWidgets/include/wx/uri.h @@ -0,0 +1,151 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: uri.h +// Purpose: wxURI - Class for parsing URIs +// Author: Ryan Norton +// Modified By: +// Created: 07/01/2004 +// RCS-ID: $Id: uri.h 35650 2005-09-23 12:56:45Z MR $ +// Copyright: (c) Ryan Norton +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_URI_H_ +#define _WX_URI_H_ + +#include "wx/defs.h" +#include "wx/object.h" +#include "wx/string.h" + +// Host Type that the server component can be +enum wxURIHostType +{ + wxURI_REGNAME, // Host is a normal register name (www.mysite.com etc.) + wxURI_IPV4ADDRESS, // Host is a version 4 ip address (192.168.1.100) + wxURI_IPV6ADDRESS, // Host is a version 6 ip address [aa:aa:aa:aa::aa:aa]:5050 + wxURI_IPVFUTURE // Host is a future ip address (wxURI is unsure what kind) +}; + +// Component Flags +enum wxURIFieldType +{ + wxURI_SCHEME = 1, + wxURI_USERINFO = 2, + wxURI_SERVER = 4, + wxURI_PORT = 8, + wxURI_PATH = 16, + wxURI_QUERY = 32, + wxURI_FRAGMENT = 64 +}; + +// Miscellaneous other flags +enum wxURIFlags +{ + wxURI_STRICT = 1 +}; + + +// Generic class for parsing URIs. +// +// See RFC 3986 +class WXDLLIMPEXP_BASE wxURI : public wxObject +{ +public: + wxURI(); + wxURI(const wxString& uri); + wxURI(const wxURI& uri); + + virtual ~wxURI(); + + const wxChar* Create(const wxString& uri); + + bool HasScheme() const { return (m_fields & wxURI_SCHEME) == wxURI_SCHEME; } + bool HasUserInfo() const { return (m_fields & wxURI_USERINFO) == wxURI_USERINFO; } + bool HasServer() const { return (m_fields & wxURI_SERVER) == wxURI_SERVER; } + bool HasPort() const { return (m_fields & wxURI_PORT) == wxURI_PORT; } + bool HasPath() const { return (m_fields & wxURI_PATH) == wxURI_PATH; } + bool HasQuery() const { return (m_fields & wxURI_QUERY) == wxURI_QUERY; } + bool HasFragment() const { return (m_fields & wxURI_FRAGMENT) == wxURI_FRAGMENT; } + + const wxString& GetScheme() const { return m_scheme; } + const wxString& GetPath() const { return m_path; } + const wxString& GetQuery() const { return m_query; } + const wxString& GetFragment() const { return m_fragment; } + const wxString& GetPort() const { return m_port; } + const wxString& GetUserInfo() const { return m_userinfo; } + const wxString& GetServer() const { return m_server; } + const wxURIHostType& GetHostType() const { return m_hostType; } + + //Note that the following two get functions are explicitly depreciated by RFC 2396 + wxString GetUser() const; + wxString GetPassword() const; + + wxString BuildURI() const; + wxString BuildUnescapedURI() const; + + void Resolve(const wxURI& base, int flags = wxURI_STRICT); + bool IsReference() const; + + wxURI& operator = (const wxURI& uri); + wxURI& operator = (const wxString& string); + bool operator == (const wxURI& uri) const; + + static wxString Unescape (const wxString& szEscapedURI); + +protected: + wxURI& Assign(const wxURI& uri); + + void Clear(); + + const wxChar* Parse (const wxChar* uri); + const wxChar* ParseAuthority (const wxChar* uri); + const wxChar* ParseScheme (const wxChar* uri); + const wxChar* ParseUserInfo (const wxChar* uri); + const wxChar* ParseServer (const wxChar* uri); + const wxChar* ParsePort (const wxChar* uri); + const wxChar* ParsePath (const wxChar* uri, + bool bReference = false, + bool bNormalize = true); + const wxChar* ParseQuery (const wxChar* uri); + const wxChar* ParseFragment (const wxChar* uri); + + + static bool ParseH16(const wxChar*& uri); + static bool ParseIPv4address(const wxChar*& uri); + static bool ParseIPv6address(const wxChar*& uri); + static bool ParseIPvFuture(const wxChar*& uri); + + static void Normalize(wxChar* uri, bool bIgnoreLeads = false); + static void UpTree(const wxChar* uristart, const wxChar*& uri); + + static wxChar TranslateEscape(const wxChar* s); + static void Escape (wxString& s, const wxChar& c); + static bool IsEscape(const wxChar*& uri); + + static wxChar CharToHex(const wxChar& c); + + static bool IsUnreserved (const wxChar& c); + static bool IsReserved (const wxChar& c); + static bool IsGenDelim (const wxChar& c); + static bool IsSubDelim (const wxChar& c); + static bool IsHex(const wxChar& c); + static bool IsAlpha(const wxChar& c); + static bool IsDigit(const wxChar& c); + + wxString m_scheme; + wxString m_path; + wxString m_query; + wxString m_fragment; + + wxString m_userinfo; + wxString m_server; + wxString m_port; + + wxURIHostType m_hostType; + + size_t m_fields; + + DECLARE_DYNAMIC_CLASS(wxURI) +}; + +#endif // _WX_URI_H_ + diff --git a/Externals/wxWidgets/include/wx/url.h b/Externals/wxWidgets/include/wx/url.h new file mode 100644 index 0000000000..66062974c8 --- /dev/null +++ b/Externals/wxWidgets/include/wx/url.h @@ -0,0 +1,129 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: url.h +// Purpose: URL parser +// Author: Guilhem Lavaux +// Modified by: Ryan Norton +// Created: 20/07/1997 +// RCS-ID: $Id: url.h 41263 2006-09-17 10:59:18Z RR $ +// Copyright: (c) 1997, 1998 Guilhem Lavaux +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_URL_H +#define _WX_URL_H + +#include "wx/defs.h" + +#if wxUSE_URL + +#include "wx/uri.h" +#include "wx/protocol/protocol.h" + +#if wxUSE_PROTOCOL_HTTP + #include "wx/protocol/http.h" +#endif + +typedef enum { + wxURL_NOERR = 0, + wxURL_SNTXERR, + wxURL_NOPROTO, + wxURL_NOHOST, + wxURL_NOPATH, + wxURL_CONNERR, + wxURL_PROTOERR +} wxURLError; + +#if wxUSE_URL_NATIVE +class WXDLLIMPEXP_NET wxURL; + +class WXDLLIMPEXP_NET wxURLNativeImp : public wxObject +{ +public: + virtual ~wxURLNativeImp() { } + virtual wxInputStream *GetInputStream(wxURL *owner) = 0; +}; +#endif // wxUSE_URL_NATIVE + +class WXDLLIMPEXP_NET wxURL : public wxURI +{ +public: + wxURL(const wxString& sUrl = wxEmptyString); + wxURL(const wxURI& url); + virtual ~wxURL(); + + wxURL& operator = (const wxString& url); + wxURL& operator = (const wxURI& url); + + wxProtocol& GetProtocol() { return *m_protocol; } + wxURLError GetError() const { return m_error; } + wxString GetURL() const { return m_url; } + + wxURLError SetURL(const wxString &url) + { *this = url; return m_error; } + + bool IsOk() const + { return m_error == wxURL_NOERR; } + + wxInputStream *GetInputStream(); + +#if wxUSE_PROTOCOL_HTTP + static void SetDefaultProxy(const wxString& url_proxy); + void SetProxy(const wxString& url_proxy); +#endif // wxUSE_PROTOCOL_HTTP + +#if WXWIN_COMPATIBILITY_2_4 + //Use the proper wxURI accessors instead + wxDEPRECATED( wxString GetProtocolName() const ); + wxDEPRECATED( wxString GetHostName() const ); + wxDEPRECATED( wxString GetPath() const ); + + //Use wxURI instead - this does not work that well + wxDEPRECATED( static wxString ConvertToValidURI( + const wxString& uri, + const wxChar* delims = wxT(";/?:@&=+$,") + ) ); + + //Use wxURI::Unescape instead + wxDEPRECATED( static wxString ConvertFromURI(const wxString& uri) ); +#endif + +protected: + static wxProtoInfo *ms_protocols; + +#if wxUSE_PROTOCOL_HTTP + static wxHTTP *ms_proxyDefault; + static bool ms_useDefaultProxy; + wxHTTP *m_proxy; +#endif // wxUSE_PROTOCOL_HTTP + +#if wxUSE_URL_NATIVE + friend class wxURLNativeImp; + // pointer to a native URL implementation object + wxURLNativeImp *m_nativeImp; + // Creates on the heap and returns a native + // implementation object for the current platform. + static wxURLNativeImp *CreateNativeImpObject(); +#endif + wxProtoInfo *m_protoinfo; + wxProtocol *m_protocol; + + wxURLError m_error; + wxString m_url; + bool m_useProxy; + + void Init(const wxString&); + bool ParseURL(); + void CleanData(); + bool FetchProtocol(); + + friend class wxProtoInfo; + friend class wxURLModule; + +private: + DECLARE_DYNAMIC_CLASS(wxURL) +}; + +#endif // wxUSE_URL + +#endif // _WX_URL_H + diff --git a/Externals/wxWidgets/include/wx/utils.h b/Externals/wxWidgets/include/wx/utils.h new file mode 100644 index 0000000000..bfd7977b97 --- /dev/null +++ b/Externals/wxWidgets/include/wx/utils.h @@ -0,0 +1,734 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/utils.h +// Purpose: Miscellaneous utilities +// Author: Julian Smart +// Modified by: +// Created: 29/01/98 +// RCS-ID: $Id: utils.h 49804 2007-11-10 01:09:42Z VZ $ +// Copyright: (c) 1998 Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UTILSH__ +#define _WX_UTILSH__ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/object.h" +#include "wx/list.h" +#include "wx/filefn.h" +#if wxUSE_GUI + #include "wx/gdicmn.h" +#endif + +class WXDLLIMPEXP_FWD_BASE wxArrayString; +class WXDLLIMPEXP_FWD_BASE wxArrayInt; + +// need this for wxGetDiskSpace() as we can't, unfortunately, forward declare +// wxLongLong +#include "wx/longlong.h" + +// need for wxOperatingSystemId +#include "wx/platinfo.h" + +#ifdef __WATCOMC__ + #include <direct.h> +#elif defined(__X__) + #include <dirent.h> + #include <unistd.h> +#endif + +#include <stdio.h> + +// ---------------------------------------------------------------------------- +// Forward declaration +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxProcess; +class WXDLLIMPEXP_CORE wxFrame; +class WXDLLIMPEXP_CORE wxWindow; +class WXDLLIMPEXP_CORE wxWindowList; + +// ---------------------------------------------------------------------------- +// Macros +// ---------------------------------------------------------------------------- + +#define wxMax(a,b) (((a) > (b)) ? (a) : (b)) +#define wxMin(a,b) (((a) < (b)) ? (a) : (b)) +#define wxClip(a,b,c) (((a) < (b)) ? (b) : (((a) > (c)) ? (c) : (a))) + +// wxGetFreeMemory can return huge amount of memory on 32-bit platforms as well +// so to always use long long for its result type on all platforms which +// support it +#if wxUSE_LONGLONG + typedef wxLongLong wxMemorySize; +#else + typedef long wxMemorySize; +#endif + +// ---------------------------------------------------------------------------- +// String functions (deprecated, use wxString) +// ---------------------------------------------------------------------------- + +// Make a copy of this string using 'new' +#if WXWIN_COMPATIBILITY_2_4 +wxDEPRECATED( WXDLLIMPEXP_BASE wxChar* copystring(const wxChar *s) ); +#endif + +// A shorter way of using strcmp +#define wxStringEq(s1, s2) (s1 && s2 && (wxStrcmp(s1, s2) == 0)) + +// ---------------------------------------------------------------------------- +// Miscellaneous functions +// ---------------------------------------------------------------------------- + +// Sound the bell +#if !defined __EMX__ && \ + (defined __WXMOTIF__ || defined __WXGTK__ || defined __WXX11__) +WXDLLIMPEXP_CORE void wxBell(); +#else +WXDLLIMPEXP_BASE void wxBell(); +#endif + +// Get OS description as a user-readable string +WXDLLIMPEXP_BASE wxString wxGetOsDescription(); + +// Get OS version +WXDLLIMPEXP_BASE wxOperatingSystemId wxGetOsVersion(int *majorVsn = (int *) NULL, + int *minorVsn = (int *) NULL); + +// Get platform endianness +WXDLLIMPEXP_BASE bool wxIsPlatformLittleEndian(); + +// Get platform architecture +WXDLLIMPEXP_BASE bool wxIsPlatform64Bit(); + +// Return a string with the current date/time +WXDLLIMPEXP_BASE wxString wxNow(); + +// Return path where wxWidgets is installed (mostly useful in Unices) +WXDLLIMPEXP_BASE const wxChar *wxGetInstallPrefix(); +// Return path to wxWin data (/usr/share/wx/%{version}) (Unices) +WXDLLIMPEXP_BASE wxString wxGetDataDir(); + +/* + * Class to make it easier to specify platform-dependent values + * + * Examples: + * long val = wxPlatform::If(wxMac, 1).ElseIf(wxGTK, 2).ElseIf(stPDA, 5).Else(3); + * wxString strVal = wxPlatform::If(wxMac, wxT("Mac")).ElseIf(wxMSW, wxT("MSW")).Else(wxT("Other")); + * + * A custom platform symbol: + * + * #define stPDA 100 + * #ifdef __WXWINCE__ + * wxPlatform::AddPlatform(stPDA); + * #endif + * + * long windowStyle = wxCAPTION | (long) wxPlatform::IfNot(stPDA, wxRESIZE_BORDER); + * + */ + +class WXDLLIMPEXP_BASE wxPlatform +{ +public: + wxPlatform() { Init(); } + wxPlatform(const wxPlatform& platform) { Copy(platform); } + void operator = (const wxPlatform& platform) { Copy(platform); } + void Copy(const wxPlatform& platform); + + // Specify an optional default value + wxPlatform(int defValue) { Init(); m_longValue = (long)defValue; } + wxPlatform(long defValue) { Init(); m_longValue = defValue; } + wxPlatform(const wxString& defValue) { Init(); m_stringValue = defValue; } + wxPlatform(double defValue) { Init(); m_doubleValue = defValue; } + + static wxPlatform If(int platform, long value); + static wxPlatform IfNot(int platform, long value); + wxPlatform& ElseIf(int platform, long value); + wxPlatform& ElseIfNot(int platform, long value); + wxPlatform& Else(long value); + + static wxPlatform If(int platform, int value) { return If(platform, (long)value); } + static wxPlatform IfNot(int platform, int value) { return IfNot(platform, (long)value); } + wxPlatform& ElseIf(int platform, int value) { return ElseIf(platform, (long) value); } + wxPlatform& ElseIfNot(int platform, int value) { return ElseIfNot(platform, (long) value); } + wxPlatform& Else(int value) { return Else((long) value); } + + static wxPlatform If(int platform, double value); + static wxPlatform IfNot(int platform, double value); + wxPlatform& ElseIf(int platform, double value); + wxPlatform& ElseIfNot(int platform, double value); + wxPlatform& Else(double value); + + static wxPlatform If(int platform, const wxString& value); + static wxPlatform IfNot(int platform, const wxString& value); + wxPlatform& ElseIf(int platform, const wxString& value); + wxPlatform& ElseIfNot(int platform, const wxString& value); + wxPlatform& Else(const wxString& value); + + long GetInteger() const { return m_longValue; } + const wxString& GetString() const { return m_stringValue; } + double GetDouble() const { return m_doubleValue; } + + operator int() const { return (int) GetInteger(); } + operator long() const { return GetInteger(); } + operator double() const { return GetDouble(); } + operator const wxString() const { return GetString(); } + operator const wxChar*() const { return (const wxChar*) GetString(); } + + static void AddPlatform(int platform); + static bool Is(int platform); + static void ClearPlatforms(); + +private: + + void Init() { m_longValue = 0; m_doubleValue = 0.0; } + + long m_longValue; + double m_doubleValue; + wxString m_stringValue; + static wxArrayInt* sm_customPlatforms; +}; + +/// Function for testing current platform +inline bool wxPlatformIs(int platform) { return wxPlatform::Is(platform); } + +#if wxUSE_GUI + +// Get the state of a key (true if pressed, false if not) +// This is generally most useful getting the state of +// the modifier or toggle keys. +WXDLLEXPORT bool wxGetKeyState(wxKeyCode key); + + +// Don't synthesize KeyUp events holding down a key and producing +// KeyDown events with autorepeat. On by default and always on +// in wxMSW. +WXDLLEXPORT bool wxSetDetectableAutoRepeat( bool flag ); + + +// wxMouseState is used to hold information about button and modifier state +// and is what is returned from wxGetMouseState. +class WXDLLEXPORT wxMouseState +{ +public: + wxMouseState() + : m_x(0), m_y(0), + m_leftDown(false), m_middleDown(false), m_rightDown(false), + m_controlDown(false), m_shiftDown(false), m_altDown(false), + m_metaDown(false) + {} + + wxCoord GetX() { return m_x; } + wxCoord GetY() { return m_y; } + + bool LeftDown() { return m_leftDown; } + bool MiddleDown() { return m_middleDown; } + bool RightDown() { return m_rightDown; } + + bool ControlDown() { return m_controlDown; } + bool ShiftDown() { return m_shiftDown; } + bool AltDown() { return m_altDown; } + bool MetaDown() { return m_metaDown; } + bool CmdDown() + { +#if defined(__WXMAC__) || defined(__WXCOCOA__) + return MetaDown(); +#else + return ControlDown(); +#endif + } + + void SetX(wxCoord x) { m_x = x; } + void SetY(wxCoord y) { m_y = y; } + + void SetLeftDown(bool down) { m_leftDown = down; } + void SetMiddleDown(bool down) { m_middleDown = down; } + void SetRightDown(bool down) { m_rightDown = down; } + + void SetControlDown(bool down) { m_controlDown = down; } + void SetShiftDown(bool down) { m_shiftDown = down; } + void SetAltDown(bool down) { m_altDown = down; } + void SetMetaDown(bool down) { m_metaDown = down; } + +private: + wxCoord m_x; + wxCoord m_y; + + bool m_leftDown : 1; + bool m_middleDown : 1; + bool m_rightDown : 1; + + bool m_controlDown : 1; + bool m_shiftDown : 1; + bool m_altDown : 1; + bool m_metaDown : 1; +}; + + +// Returns the current state of the mouse position, buttons and modifers +WXDLLEXPORT wxMouseState wxGetMouseState(); + + +// ---------------------------------------------------------------------------- +// Window ID management +// ---------------------------------------------------------------------------- + +// Generate a unique ID +WXDLLEXPORT long wxNewId(); + +// Ensure subsequent IDs don't clash with this one +WXDLLEXPORT void wxRegisterId(long id); + +// Return the current ID +WXDLLEXPORT long wxGetCurrentId(); + +#endif // wxUSE_GUI + +// ---------------------------------------------------------------------------- +// Various conversions +// ---------------------------------------------------------------------------- + +// these functions are deprecated, use wxString methods instead! +#if WXWIN_COMPATIBILITY_2_4 + +extern WXDLLIMPEXP_DATA_BASE(const wxChar*) wxFloatToStringStr; +extern WXDLLIMPEXP_DATA_BASE(const wxChar*) wxDoubleToStringStr; + +wxDEPRECATED( WXDLLIMPEXP_BASE void StringToFloat(const wxChar *s, float *number) ); +wxDEPRECATED( WXDLLIMPEXP_BASE wxChar* FloatToString(float number, const wxChar *fmt = wxFloatToStringStr) ); +wxDEPRECATED( WXDLLIMPEXP_BASE void StringToDouble(const wxChar *s, double *number) ); +wxDEPRECATED( WXDLLIMPEXP_BASE wxChar* DoubleToString(double number, const wxChar *fmt = wxDoubleToStringStr) ); +wxDEPRECATED( WXDLLIMPEXP_BASE void StringToInt(const wxChar *s, int *number) ); +wxDEPRECATED( WXDLLIMPEXP_BASE void StringToLong(const wxChar *s, long *number) ); +wxDEPRECATED( WXDLLIMPEXP_BASE wxChar* IntToString(int number) ); +wxDEPRECATED( WXDLLIMPEXP_BASE wxChar* LongToString(long number) ); + +#endif // WXWIN_COMPATIBILITY_2_4 + +// Convert 2-digit hex number to decimal +WXDLLIMPEXP_BASE int wxHexToDec(const wxString& buf); + +// Convert decimal integer to 2-character hex string +WXDLLIMPEXP_BASE void wxDecToHex(int dec, wxChar *buf); +WXDLLIMPEXP_BASE wxString wxDecToHex(int dec); + +// ---------------------------------------------------------------------------- +// Process management +// ---------------------------------------------------------------------------- + +// NB: for backwards compatibility reasons the values of wxEXEC_[A]SYNC *must* +// be 0 and 1, don't change! + +enum +{ + // execute the process asynchronously + wxEXEC_ASYNC = 0, + + // execute it synchronously, i.e. wait until it finishes + wxEXEC_SYNC = 1, + + // under Windows, don't hide the child even if it's IO is redirected (this + // is done by default) + wxEXEC_NOHIDE = 2, + + // under Unix, if the process is the group leader then passing wxKILL_CHILDREN to wxKill + // kills all children as well as pid + wxEXEC_MAKE_GROUP_LEADER = 4, + + // by default synchronous execution disables all program windows to avoid + // that the user interacts with the program while the child process is + // running, you can use this flag to prevent this from happening + wxEXEC_NODISABLE = 8 +}; + +// Execute another program. +// +// If flags contain wxEXEC_SYNC, return -1 on failure and the exit code of the +// process if everything was ok. Otherwise (i.e. if wxEXEC_ASYNC), return 0 on +// failure and the PID of the launched process if ok. +WXDLLIMPEXP_BASE long wxExecute(wxChar **argv, int flags = wxEXEC_ASYNC, + wxProcess *process = (wxProcess *) NULL); +WXDLLIMPEXP_BASE long wxExecute(const wxString& command, int flags = wxEXEC_ASYNC, + wxProcess *process = (wxProcess *) NULL); + +// execute the command capturing its output into an array line by line, this is +// always synchronous +WXDLLIMPEXP_BASE long wxExecute(const wxString& command, + wxArrayString& output, + int flags = 0); + +// also capture stderr (also synchronous) +WXDLLIMPEXP_BASE long wxExecute(const wxString& command, + wxArrayString& output, + wxArrayString& error, + int flags = 0); + +#if defined(__WXMSW__) && wxUSE_IPC +// ask a DDE server to execute the DDE request with given parameters +WXDLLIMPEXP_BASE bool wxExecuteDDE(const wxString& ddeServer, + const wxString& ddeTopic, + const wxString& ddeCommand); +#endif // __WXMSW__ && wxUSE_IPC + +enum wxSignal +{ + wxSIGNONE = 0, // verify if the process exists under Unix + wxSIGHUP, + wxSIGINT, + wxSIGQUIT, + wxSIGILL, + wxSIGTRAP, + wxSIGABRT, + wxSIGIOT = wxSIGABRT, // another name + wxSIGEMT, + wxSIGFPE, + wxSIGKILL, + wxSIGBUS, + wxSIGSEGV, + wxSIGSYS, + wxSIGPIPE, + wxSIGALRM, + wxSIGTERM + + // further signals are different in meaning between different Unix systems +}; + +enum wxKillError +{ + wxKILL_OK, // no error + wxKILL_BAD_SIGNAL, // no such signal + wxKILL_ACCESS_DENIED, // permission denied + wxKILL_NO_PROCESS, // no such process + wxKILL_ERROR // another, unspecified error +}; + +enum wxKillFlags +{ + wxKILL_NOCHILDREN = 0, // don't kill children + wxKILL_CHILDREN = 1 // kill children +}; + +enum wxShutdownFlags +{ + wxSHUTDOWN_POWEROFF, // power off the computer + wxSHUTDOWN_REBOOT // shutdown and reboot +}; + +// Shutdown or reboot the PC +WXDLLIMPEXP_BASE bool wxShutdown(wxShutdownFlags wFlags); + +// send the given signal to the process (only NONE and KILL are supported under +// Windows, all others mean TERM), return 0 if ok and -1 on error +// +// return detailed error in rc if not NULL +WXDLLIMPEXP_BASE int wxKill(long pid, + wxSignal sig = wxSIGTERM, + wxKillError *rc = NULL, + int flags = wxKILL_NOCHILDREN); + +// Execute a command in an interactive shell window (always synchronously) +// If no command then just the shell +WXDLLIMPEXP_BASE bool wxShell(const wxString& command = wxEmptyString); + +// As wxShell(), but must give a (non interactive) command and its output will +// be returned in output array +WXDLLIMPEXP_BASE bool wxShell(const wxString& command, wxArrayString& output); + +// Sleep for nSecs seconds +WXDLLIMPEXP_BASE void wxSleep(int nSecs); + +// Sleep for a given amount of milliseconds +WXDLLIMPEXP_BASE void wxMilliSleep(unsigned long milliseconds); + +// Sleep for a given amount of microseconds +WXDLLIMPEXP_BASE void wxMicroSleep(unsigned long microseconds); + +// Sleep for a given amount of milliseconds (old, bad name), use wxMilliSleep +wxDEPRECATED( WXDLLIMPEXP_BASE void wxUsleep(unsigned long milliseconds) ); + +// Get the process id of the current process +WXDLLIMPEXP_BASE unsigned long wxGetProcessId(); + +// Get free memory in bytes, or -1 if cannot determine amount (e.g. on UNIX) +WXDLLIMPEXP_BASE wxMemorySize wxGetFreeMemory(); + +#if wxUSE_ON_FATAL_EXCEPTION + +// should wxApp::OnFatalException() be called? +WXDLLIMPEXP_BASE bool wxHandleFatalExceptions(bool doit = true); + +#endif // wxUSE_ON_FATAL_EXCEPTION + +// flags for wxLaunchDefaultBrowser +enum +{ + wxBROWSER_NEW_WINDOW = 1 +}; + +// Launch url in the user's default internet browser +WXDLLIMPEXP_BASE bool wxLaunchDefaultBrowser(const wxString& url, int flags = 0); + +// ---------------------------------------------------------------------------- +// Environment variables +// ---------------------------------------------------------------------------- + +// returns true if variable exists (value may be NULL if you just want to check +// for this) +WXDLLIMPEXP_BASE bool wxGetEnv(const wxString& var, wxString *value); + +// set the env var name to the given value, return true on success +WXDLLIMPEXP_BASE bool wxSetEnv(const wxString& var, const wxChar *value); + +// remove the env var from environment +inline bool wxUnsetEnv(const wxString& var) { return wxSetEnv(var, NULL); } + +// ---------------------------------------------------------------------------- +// Network and username functions. +// ---------------------------------------------------------------------------- + +// NB: "char *" functions are deprecated, use wxString ones! + +// Get eMail address +WXDLLIMPEXP_BASE bool wxGetEmailAddress(wxChar *buf, int maxSize); +WXDLLIMPEXP_BASE wxString wxGetEmailAddress(); + +// Get hostname. +WXDLLIMPEXP_BASE bool wxGetHostName(wxChar *buf, int maxSize); +WXDLLIMPEXP_BASE wxString wxGetHostName(); + +// Get FQDN +WXDLLIMPEXP_BASE wxString wxGetFullHostName(); +WXDLLIMPEXP_BASE bool wxGetFullHostName(wxChar *buf, int maxSize); + +// Get user ID e.g. jacs (this is known as login name under Unix) +WXDLLIMPEXP_BASE bool wxGetUserId(wxChar *buf, int maxSize); +WXDLLIMPEXP_BASE wxString wxGetUserId(); + +// Get user name e.g. Julian Smart +WXDLLIMPEXP_BASE bool wxGetUserName(wxChar *buf, int maxSize); +WXDLLIMPEXP_BASE wxString wxGetUserName(); + +// Get current Home dir and copy to dest (returns pstr->c_str()) +WXDLLIMPEXP_BASE wxString wxGetHomeDir(); +WXDLLIMPEXP_BASE const wxChar* wxGetHomeDir(wxString *pstr); + +// Get the user's home dir (caller must copy --- volatile) +// returns NULL is no HOME dir is known +#if defined(__UNIX__) && wxUSE_UNICODE && !defined(__WINE__) +WXDLLIMPEXP_BASE const wxMB2WXbuf wxGetUserHome(const wxString& user = wxEmptyString); +#else +WXDLLIMPEXP_BASE wxChar* wxGetUserHome(const wxString& user = wxEmptyString); +#endif + +#if wxUSE_LONGLONG + typedef wxLongLong wxDiskspaceSize_t; +#else + typedef long wxDiskspaceSize_t; +#endif + +// get number of total/free bytes on the disk where path belongs +WXDLLIMPEXP_BASE bool wxGetDiskSpace(const wxString& path, + wxDiskspaceSize_t *pTotal = NULL, + wxDiskspaceSize_t *pFree = NULL); + +#if wxUSE_GUI // GUI only things from now on + +// ---------------------------------------------------------------------------- +// Menu accelerators related things +// ---------------------------------------------------------------------------- + +// flags for wxStripMenuCodes +enum +{ + // strip '&' characters + wxStrip_Mnemonics = 1, + + // strip everything after '\t' + wxStrip_Accel = 2, + + // strip everything (this is the default) + wxStrip_All = wxStrip_Mnemonics | wxStrip_Accel +}; + +// strip mnemonics and/or accelerators from the label +WXDLLEXPORT wxString +wxStripMenuCodes(const wxString& str, int flags = wxStrip_All); + +#if WXWIN_COMPATIBILITY_2_6 +// obsolete and deprecated version, do not use, use the above overload instead +wxDEPRECATED( + WXDLLEXPORT wxChar* wxStripMenuCodes(const wxChar *in, wxChar *out = NULL) +); + +#if wxUSE_ACCEL +class WXDLLIMPEXP_FWD_CORE wxAcceleratorEntry; + +// use wxAcceleratorEntry::Create() or FromString() methods instead +wxDEPRECATED( + WXDLLEXPORT wxAcceleratorEntry *wxGetAccelFromString(const wxString& label) +); +#endif // wxUSE_ACCEL + +#endif // WXWIN_COMPATIBILITY_2_6 + +// ---------------------------------------------------------------------------- +// Window search +// ---------------------------------------------------------------------------- + +// Returns menu item id or wxNOT_FOUND if none. +WXDLLEXPORT int wxFindMenuItemId(wxFrame *frame, const wxString& menuString, const wxString& itemString); + +// Find the wxWindow at the given point. wxGenericFindWindowAtPoint +// is always present but may be less reliable than a native version. +WXDLLEXPORT wxWindow* wxGenericFindWindowAtPoint(const wxPoint& pt); +WXDLLEXPORT wxWindow* wxFindWindowAtPoint(const wxPoint& pt); + +// NB: this function is obsolete, use wxWindow::FindWindowByLabel() instead +// +// Find the window/widget with the given title or label. +// Pass a parent to begin the search from, or NULL to look through +// all windows. +WXDLLEXPORT wxWindow* wxFindWindowByLabel(const wxString& title, wxWindow *parent = (wxWindow *) NULL); + +// NB: this function is obsolete, use wxWindow::FindWindowByName() instead +// +// Find window by name, and if that fails, by label. +WXDLLEXPORT wxWindow* wxFindWindowByName(const wxString& name, wxWindow *parent = (wxWindow *) NULL); + +// ---------------------------------------------------------------------------- +// Message/event queue helpers +// ---------------------------------------------------------------------------- + +// Yield to other apps/messages and disable user input +WXDLLEXPORT bool wxSafeYield(wxWindow *win = NULL, bool onlyIfNeeded = false); + +// Enable or disable input to all top level windows +WXDLLEXPORT void wxEnableTopLevelWindows(bool enable = true); + +// Check whether this window wants to process messages, e.g. Stop button +// in long calculations. +WXDLLEXPORT bool wxCheckForInterrupt(wxWindow *wnd); + +// Consume all events until no more left +WXDLLEXPORT void wxFlushEvents(); + +// a class which disables all windows (except, may be, thegiven one) in its +// ctor and enables them back in its dtor +class WXDLLEXPORT wxWindowDisabler +{ +public: + wxWindowDisabler(wxWindow *winToSkip = (wxWindow *)NULL); + ~wxWindowDisabler(); + +private: + wxWindowList *m_winDisabled; + + DECLARE_NO_COPY_CLASS(wxWindowDisabler) +}; + +// ---------------------------------------------------------------------------- +// Cursors +// ---------------------------------------------------------------------------- + +// Set the cursor to the busy cursor for all windows +WXDLLIMPEXP_CORE void wxBeginBusyCursor(const wxCursor *cursor = wxHOURGLASS_CURSOR); + +// Restore cursor to normal +WXDLLEXPORT void wxEndBusyCursor(); + +// true if we're between the above two calls +WXDLLEXPORT bool wxIsBusy(); + +// Convenience class so we can just create a wxBusyCursor object on the stack +class WXDLLEXPORT wxBusyCursor +{ +public: + wxBusyCursor(const wxCursor* cursor = wxHOURGLASS_CURSOR) + { wxBeginBusyCursor(cursor); } + ~wxBusyCursor() + { wxEndBusyCursor(); } + + // FIXME: These two methods are currently only implemented (and needed?) + // in wxGTK. BusyCursor handling should probably be moved to + // common code since the wxGTK and wxMSW implementations are very + // similar except for wxMSW using HCURSOR directly instead of + // wxCursor.. -- RL. + static const wxCursor &GetStoredCursor(); + static const wxCursor GetBusyCursor(); +}; + + +// ---------------------------------------------------------------------------- +// Reading and writing resources (eg WIN.INI, .Xdefaults) +// ---------------------------------------------------------------------------- + +#if wxUSE_RESOURCES +WXDLLEXPORT bool wxWriteResource(const wxString& section, const wxString& entry, const wxString& value, const wxString& file = wxEmptyString); +WXDLLEXPORT bool wxWriteResource(const wxString& section, const wxString& entry, float value, const wxString& file = wxEmptyString); +WXDLLEXPORT bool wxWriteResource(const wxString& section, const wxString& entry, long value, const wxString& file = wxEmptyString); +WXDLLEXPORT bool wxWriteResource(const wxString& section, const wxString& entry, int value, const wxString& file = wxEmptyString); + +WXDLLEXPORT bool wxGetResource(const wxString& section, const wxString& entry, wxChar **value, const wxString& file = wxEmptyString); +WXDLLEXPORT bool wxGetResource(const wxString& section, const wxString& entry, float *value, const wxString& file = wxEmptyString); +WXDLLEXPORT bool wxGetResource(const wxString& section, const wxString& entry, long *value, const wxString& file = wxEmptyString); +WXDLLEXPORT bool wxGetResource(const wxString& section, const wxString& entry, int *value, const wxString& file = wxEmptyString); +#endif // wxUSE_RESOURCES + +void WXDLLEXPORT wxGetMousePosition( int* x, int* y ); + +// MSW only: get user-defined resource from the .res file. +// Returns NULL or newly-allocated memory, so use delete[] to clean up. +#ifdef __WXMSW__ + extern WXDLLEXPORT const wxChar* wxUserResourceStr; + WXDLLEXPORT wxChar* wxLoadUserResource(const wxString& resourceName, const wxString& resourceType = wxUserResourceStr); +#endif // MSW + +// ---------------------------------------------------------------------------- +// Display and colorss (X only) +// ---------------------------------------------------------------------------- + +#ifdef __WXGTK__ + void *wxGetDisplay(); +#endif + +#ifdef __X__ + WXDLLIMPEXP_CORE WXDisplay *wxGetDisplay(); + WXDLLIMPEXP_CORE bool wxSetDisplay(const wxString& display_name); + WXDLLIMPEXP_CORE wxString wxGetDisplayName(); +#endif // X or GTK+ + +#ifdef __X__ + +#ifdef __VMS__ // Xlib.h for VMS is not (yet) compatible with C++ + // The resulting warnings are switched off here +#pragma message disable nosimpint +#endif +// #include <X11/Xlib.h> +#ifdef __VMS__ +#pragma message enable nosimpint +#endif + +#endif //__X__ + +#endif // wxUSE_GUI + +// ---------------------------------------------------------------------------- +// wxYield(): these functions are obsolete, please use wxApp methods instead! +// ---------------------------------------------------------------------------- + +// Yield to other apps/messages +WXDLLIMPEXP_BASE bool wxYield(); + +// Like wxYield, but fails silently if the yield is recursive. +WXDLLIMPEXP_BASE bool wxYieldIfNeeded(); + +// ---------------------------------------------------------------------------- +// Error message functions used by wxWidgets (deprecated, use wxLog) +// ---------------------------------------------------------------------------- + +#endif + // _WX_UTILSH__ diff --git a/Externals/wxWidgets/include/wx/valgen.h b/Externals/wxWidgets/include/wx/valgen.h new file mode 100644 index 0000000000..fd39c7e7d1 --- /dev/null +++ b/Externals/wxWidgets/include/wx/valgen.h @@ -0,0 +1,69 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: valgen.h +// Purpose: wxGenericValidator class +// Author: Kevin Smith +// Modified by: +// Created: Jan 22 1999 +// RCS-ID: +// Copyright: (c) 1999 Julian Smart (assigned from Kevin) +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_VALGENH__ +#define _WX_VALGENH__ + +#include "wx/validate.h" + +#if wxUSE_VALIDATORS + +class WXDLLEXPORT wxGenericValidator: public wxValidator +{ +DECLARE_CLASS(wxGenericValidator) +public: + wxGenericValidator(bool* val); + wxGenericValidator(int* val); + wxGenericValidator(wxString* val); + wxGenericValidator(wxArrayInt* val); + wxGenericValidator(const wxGenericValidator& copyFrom); + + virtual ~wxGenericValidator(){} + + // Make a clone of this validator (or return NULL) - currently necessary + // if you're passing a reference to a validator. + // Another possibility is to always pass a pointer to a new validator + // (so the calling code can use a copy constructor of the relevant class). + virtual wxObject *Clone() const { return new wxGenericValidator(*this); } + bool Copy(const wxGenericValidator& val); + + // Called when the value in the window must be validated. + // This function can pop up an error message. + virtual bool Validate(wxWindow * WXUNUSED(parent)) { return true; } + + // Called to transfer data to the window + virtual bool TransferToWindow(); + + // Called to transfer data to the window + virtual bool TransferFromWindow(); + +protected: + void Initialize(); + + bool* m_pBool; + int* m_pInt; + wxString* m_pString; + wxArrayInt* m_pArrayInt; + +private: +// Cannot use +// DECLARE_NO_COPY_CLASS(wxGenericValidator) +// because copy constructor is explicitly declared above; +// but no copy assignment operator is defined, so declare +// it private to prevent the compiler from defining it: + wxGenericValidator& operator=(const wxGenericValidator&); +}; + +#endif + // wxUSE_VALIDATORS + +#endif + // _WX_VALGENH__ diff --git a/Externals/wxWidgets/include/wx/validate.h b/Externals/wxWidgets/include/wx/validate.h new file mode 100644 index 0000000000..16b03b726b --- /dev/null +++ b/Externals/wxWidgets/include/wx/validate.h @@ -0,0 +1,98 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/validate.h +// Purpose: wxValidator class +// Author: Julian Smart +// Modified by: +// Created: 29/01/98 +// RCS-ID: $Id: validate.h 45498 2007-04-16 13:03:05Z VZ $ +// Copyright: (c) 1998 Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_VALIDATE_H_ +#define _WX_VALIDATE_H_ + +#include "wx/defs.h" + +#if wxUSE_VALIDATORS + +#include "wx/event.h" + +class WXDLLEXPORT wxWindow; +class WXDLLEXPORT wxWindowBase; + +/* + A validator has up to three purposes: + + 1) To validate the data in the window that's associated + with the validator. + 2) To transfer data to and from the window. + 3) To filter input, using its role as a wxEvtHandler + to intercept e.g. OnChar. + + Note that wxValidator and derived classes use reference counting. +*/ + +class WXDLLEXPORT wxValidator : public wxEvtHandler +{ +public: + wxValidator(); + virtual ~wxValidator(); + + // Make a clone of this validator (or return NULL) - currently necessary + // if you're passing a reference to a validator. + // Another possibility is to always pass a pointer to a new validator + // (so the calling code can use a copy constructor of the relevant class). + virtual wxObject *Clone() const + { return (wxValidator *)NULL; } + bool Copy(const wxValidator& val) + { m_validatorWindow = val.m_validatorWindow; return true; } + + // Called when the value in the window must be validated. + // This function can pop up an error message. + virtual bool Validate(wxWindow *WXUNUSED(parent)) { return false; } + + // Called to transfer data to the window + virtual bool TransferToWindow() { return false; } + + // Called to transfer data from the window + virtual bool TransferFromWindow() { return false; } + + // accessors + wxWindow *GetWindow() const { return (wxWindow *)m_validatorWindow; } + void SetWindow(wxWindowBase *win) { m_validatorWindow = win; } + + // validators beep by default if invalid key is pressed, these functions + // allow to change it + static bool IsSilent() { return ms_isSilent; } + static void SetBellOnError(bool doIt = true) { ms_isSilent = doIt; } + +protected: + wxWindowBase *m_validatorWindow; + +private: + static bool ms_isSilent; + + DECLARE_DYNAMIC_CLASS(wxValidator) + DECLARE_NO_COPY_CLASS(wxValidator) +}; + +extern WXDLLEXPORT_DATA(const wxValidator) wxDefaultValidator; + +#define wxVALIDATOR_PARAM(val) val + +#else // !wxUSE_VALIDATORS + // wxWidgets is compiled without support for wxValidator, but we still + // want to be able to pass wxDefaultValidator to the functions which take + // a wxValidator parameter to avoid using "#if wxUSE_VALIDATORS" + // everywhere + class WXDLLEXPORT wxValidator; + #define wxDefaultValidator (*((wxValidator *)NULL)) + + // this macro allows to avoid warnings about unused parameters when + // wxUSE_VALIDATORS == 0 + #define wxVALIDATOR_PARAM(val) +#endif // wxUSE_VALIDATORS/!wxUSE_VALIDATORS + +#endif // _WX_VALIDATE_H_ + diff --git a/Externals/wxWidgets/include/wx/valtext.h b/Externals/wxWidgets/include/wx/valtext.h new file mode 100644 index 0000000000..1d48898eda --- /dev/null +++ b/Externals/wxWidgets/include/wx/valtext.h @@ -0,0 +1,122 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: valtext.h +// Purpose: wxTextValidator class +// Author: Julian Smart +// Modified by: +// Created: 29/01/98 +// RCS-ID: $Id: valtext.h 41020 2006-09-05 20:47:48Z VZ $ +// Copyright: (c) 1998 Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_VALTEXTH__ +#define _WX_VALTEXTH__ + +#include "wx/defs.h" + +#if wxUSE_VALIDATORS && wxUSE_TEXTCTRL + +#include "wx/textctrl.h" +#include "wx/validate.h" + +#define wxFILTER_NONE 0x0000 +#define wxFILTER_ASCII 0x0001 +#define wxFILTER_ALPHA 0x0002 +#define wxFILTER_ALPHANUMERIC 0x0004 +#define wxFILTER_NUMERIC 0x0008 +#define wxFILTER_INCLUDE_LIST 0x0010 +#define wxFILTER_EXCLUDE_LIST 0x0020 +#define wxFILTER_INCLUDE_CHAR_LIST 0x0040 +#define wxFILTER_EXCLUDE_CHAR_LIST 0x0080 + +class WXDLLEXPORT wxTextValidator: public wxValidator +{ +DECLARE_DYNAMIC_CLASS(wxTextValidator) +public: + + wxTextValidator(long style = wxFILTER_NONE, wxString *val = 0); + wxTextValidator(const wxTextValidator& val); + + virtual ~wxTextValidator(){} + + // Make a clone of this validator (or return NULL) - currently necessary + // if you're passing a reference to a validator. + // Another possibility is to always pass a pointer to a new validator + // (so the calling code can use a copy constructor of the relevant class). + virtual wxObject *Clone() const { return new wxTextValidator(*this); } + bool Copy(const wxTextValidator& val); + + // Called when the value in the window must be validated. + // This function can pop up an error message. + virtual bool Validate(wxWindow *parent); + + // Called to transfer data to the window + virtual bool TransferToWindow(); + + // Called to transfer data from the window + virtual bool TransferFromWindow(); + + // ACCESSORS + inline long GetStyle() const { return m_validatorStyle; } + inline void SetStyle(long style) { m_validatorStyle = style; } + +#if WXWIN_COMPATIBILITY_2_4 + wxDEPRECATED( void SetIncludeList(const wxStringList& list) ); + wxDEPRECATED( wxStringList& GetIncludeList() ); + + wxDEPRECATED( void SetExcludeList(const wxStringList& list) ); + wxDEPRECATED( wxStringList& GetExcludeList() ); + + wxDEPRECATED( bool IsInCharIncludeList(const wxString& val) ); + wxDEPRECATED( bool IsNotInCharExcludeList(const wxString& val) ); +#endif + + void SetIncludes(const wxArrayString& includes) { m_includes = includes; } + inline wxArrayString& GetIncludes() { return m_includes; } + + void SetExcludes(const wxArrayString& excludes) { m_excludes = excludes; } + inline wxArrayString& GetExcludes() { return m_excludes; } + + bool IsInCharIncludes(const wxString& val); + bool IsNotInCharExcludes(const wxString& val); + + // Filter keystrokes + void OnChar(wxKeyEvent& event); + + +DECLARE_EVENT_TABLE() + +protected: + long m_validatorStyle; + wxString * m_stringValue; +#if WXWIN_COMPATIBILITY_2_4 + wxStringList m_includeList; + wxStringList m_excludeList; +#endif + wxArrayString m_includes; + wxArrayString m_excludes; + + bool CheckValidator() const + { + wxCHECK_MSG( m_validatorWindow, false, + _T("No window associated with validator") ); + wxCHECK_MSG( m_validatorWindow->IsKindOf(CLASSINFO(wxTextCtrl)), false, + _T("wxTextValidator is only for wxTextCtrl's") ); + + return true; + } + +private: +// Cannot use +// DECLARE_NO_COPY_CLASS(wxTextValidator) +// because copy constructor is explicitly declared above; +// but no copy assignment operator is defined, so declare +// it private to prevent the compiler from defining it: + wxTextValidator& operator=(const wxTextValidator&); +}; + +#endif + // wxUSE_VALIDATORS && wxUSE_TEXTCTRL + +#endif + // _WX_VALTEXTH__ diff --git a/Externals/wxWidgets/include/wx/variant.h b/Externals/wxWidgets/include/wx/variant.h new file mode 100644 index 0000000000..bccf32e88d --- /dev/null +++ b/Externals/wxWidgets/include/wx/variant.h @@ -0,0 +1,423 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/variant.h +// Purpose: wxVariant class, container for any type +// Author: Julian Smart +// Modified by: +// Created: 10/09/98 +// RCS-ID: $Id: variant.h 42997 2006-11-03 21:37:08Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_VARIANT_H_ +#define _WX_VARIANT_H_ + +#include "wx/defs.h" + +#if wxUSE_VARIANT + +#include "wx/object.h" +#include "wx/string.h" +#include "wx/arrstr.h" +#include "wx/list.h" +#include "wx/cpp.h" + +#if wxUSE_DATETIME + #include "wx/datetime.h" +#endif // wxUSE_DATETIME + +#if wxUSE_ODBC + #include "wx/db.h" // will #include sqltypes.h +#endif //ODBC + +#include "wx/iosfwrap.h" + +/* + * wxVariantData stores the actual data in a wxVariant object, + * to allow it to store any type of data. + * Derive from this to provide custom data handling. + * + * NB: To prevent addition of extra vtbl pointer to wxVariantData, + * we don't multiple-inherit from wxObjectRefData. Instead, + * we simply replicate the wxObject ref-counting scheme. + * + * NB: When you construct a wxVariantData, it will have refcount + * of one. Refcount will not be further increased when + * it is passed to wxVariant. This simulates old common + * scenario where wxVariant took ownership of wxVariantData + * passed to it. + * If you create wxVariantData for other reasons than passing + * it to wxVariant, technically you are not required to call + * DecRef() before deleting it. + * + * TODO: in order to replace wxPropertyValue, we would need + * to consider adding constructors that take pointers to C++ variables, + * or removing that functionality from the wxProperty library. + * Essentially wxPropertyValue takes on some of the wxValidator functionality + * by storing pointers and not just actual values, allowing update of C++ data + * to be handled automatically. Perhaps there's another way of doing this without + * overloading wxVariant with unnecessary functionality. + */ + +class WXDLLIMPEXP_BASE wxVariantData: public wxObject +{ + friend class wxVariant; +public: + wxVariantData() + : wxObject(), m_count(1) + { } + + // Override these to provide common functionality + virtual bool Eq(wxVariantData& data) const = 0; + +#if wxUSE_STD_IOSTREAM + virtual bool Write(wxSTD ostream& WXUNUSED(str)) const { return false; } +#endif + virtual bool Write(wxString& WXUNUSED(str)) const { return false; } +#if wxUSE_STD_IOSTREAM + virtual bool Read(wxSTD istream& WXUNUSED(str)) { return false; } +#endif + virtual bool Read(wxString& WXUNUSED(str)) { return false; } + // What type is it? Return a string name. + virtual wxString GetType() const = 0; + // If it based on wxObject return the ClassInfo. + virtual wxClassInfo* GetValueClassInfo() { return NULL; } + + void IncRef() { m_count++; } + void DecRef() + { + if ( --m_count == 0 ) + delete this; + } + + int GetRefCount() const { return m_count; } + +protected: + // Protected dtor should make some incompatible code + // break more louder. That is, they should do data->DecRef() + // instead of delete data. + virtual ~wxVariantData() { } + +private: + int m_count; + +private: + DECLARE_ABSTRACT_CLASS(wxVariantData) +}; + +/* + * wxVariant can store any kind of data, but has some basic types + * built in. + */ + +class WXDLLIMPEXP_BASE wxVariant: public wxObject +{ +public: + wxVariant(); + + wxVariant(const wxVariant& variant); + wxVariant(wxVariantData* data, const wxString& name = wxEmptyString); + virtual ~wxVariant(); + + // generic assignment + void operator= (const wxVariant& variant); + + // Assignment using data, e.g. + // myVariant = new wxStringVariantData("hello"); + void operator= (wxVariantData* variantData); + + bool operator== (const wxVariant& variant) const; + bool operator!= (const wxVariant& variant) const; + + // Sets/gets name + inline void SetName(const wxString& name) { m_name = name; } + inline const wxString& GetName() const { return m_name; } + + // Tests whether there is data + bool IsNull() const; + + // For compatibility with wxWidgets <= 2.6, this doesn't increase + // reference count. + wxVariantData* GetData() const { return m_data; } + void SetData(wxVariantData* data) ; + + // make a 'clone' of the object + void Ref(const wxVariant& clone); + + // destroy a reference + void UnRef(); + + // Make NULL (i.e. delete the data) + void MakeNull(); + + // Delete data and name + void Clear(); + + // Returns a string representing the type of the variant, + // e.g. "string", "bool", "stringlist", "list", "double", "long" + wxString GetType() const; + + bool IsType(const wxString& type) const; + bool IsValueKindOf(const wxClassInfo* type) const; + + // write contents to a string (e.g. for debugging) + wxString MakeString() const; + + // double + wxVariant(double val, const wxString& name = wxEmptyString); + bool operator== (double value) const; + bool operator!= (double value) const; + void operator= (double value) ; + inline operator double () const { return GetDouble(); } + inline double GetReal() const { return GetDouble(); } + double GetDouble() const; + + // long + wxVariant(long val, const wxString& name = wxEmptyString); + wxVariant(int val, const wxString& name = wxEmptyString); + wxVariant(short val, const wxString& name = wxEmptyString); + bool operator== (long value) const; + bool operator!= (long value) const; + void operator= (long value) ; + inline operator long () const { return GetLong(); } + inline long GetInteger() const { return GetLong(); } + long GetLong() const; + + // bool +#ifdef HAVE_BOOL + wxVariant(bool val, const wxString& name = wxEmptyString); + bool operator== (bool value) const; + bool operator!= (bool value) const; + void operator= (bool value) ; + inline operator bool () const { return GetBool(); } + bool GetBool() const ; +#endif + + // wxDateTime +#if wxUSE_DATETIME + wxVariant(const wxDateTime& val, const wxString& name = wxEmptyString); +#if wxUSE_ODBC + wxVariant(const DATE_STRUCT* valptr, const wxString& name = wxEmptyString); + wxVariant(const TIME_STRUCT* valptr, const wxString& name = wxEmptyString); + wxVariant(const TIMESTAMP_STRUCT* valptr, const wxString& name = wxEmptyString); +#endif + bool operator== (const wxDateTime& value) const; + bool operator!= (const wxDateTime& value) const; + void operator= (const wxDateTime& value) ; +#if wxUSE_ODBC + void operator= (const DATE_STRUCT* value) ; + void operator= (const TIME_STRUCT* value) ; + void operator= (const TIMESTAMP_STRUCT* value) ; +#endif + inline operator wxDateTime () const { return GetDateTime(); } + wxDateTime GetDateTime() const; +#endif + + // wxString + wxVariant(const wxString& val, const wxString& name = wxEmptyString); + wxVariant(const wxChar* val, const wxString& name = wxEmptyString); // Necessary or VC++ assumes bool! + bool operator== (const wxString& value) const; + bool operator!= (const wxString& value) const; + void operator= (const wxString& value) ; + void operator= (const wxChar* value) ; // Necessary or VC++ assumes bool! + inline operator wxString () const { return MakeString(); } + wxString GetString() const; + + // wxChar + wxVariant(wxChar val, const wxString& name = wxEmptyString); + bool operator== (wxChar value) const; + bool operator!= (wxChar value) const; + void operator= (wxChar value) ; + inline operator wxChar () const { return GetChar(); } + wxChar GetChar() const ; + + // wxArrayString + wxVariant(const wxArrayString& val, const wxString& name = wxEmptyString); + bool operator== (const wxArrayString& value) const; + bool operator!= (const wxArrayString& value) const; + void operator= (const wxArrayString& value); + inline operator wxArrayString () const { return GetArrayString(); } + wxArrayString GetArrayString() const; + + // void* + wxVariant(void* ptr, const wxString& name = wxEmptyString); + bool operator== (void* value) const; + bool operator!= (void* value) const; + void operator= (void* value); + inline operator void* () const { return GetVoidPtr(); } + void* GetVoidPtr() const; + + // wxObject* + wxVariant(wxObject* ptr, const wxString& name = wxEmptyString); + bool operator== (wxObject* value) const; + bool operator!= (wxObject* value) const; + void operator= (wxObject* value); + wxObject* GetWxObjectPtr() const; + + +#if WXWIN_COMPATIBILITY_2_4 + wxDEPRECATED( wxVariant(const wxStringList& val, const wxString& name = wxEmptyString) ); + wxDEPRECATED( bool operator== (const wxStringList& value) const ); + wxDEPRECATED( bool operator!= (const wxStringList& value) const ); + wxDEPRECATED( void operator= (const wxStringList& value) ); + wxDEPRECATED( wxStringList& GetStringList() const ); +#endif + + // ------------------------------ + // list operations + // ------------------------------ + + wxVariant(const wxList& val, const wxString& name = wxEmptyString); // List of variants + bool operator== (const wxList& value) const; + bool operator!= (const wxList& value) const; + void operator= (const wxList& value) ; + // Treat a list variant as an array + wxVariant operator[] (size_t idx) const; + wxVariant& operator[] (size_t idx) ; + wxList& GetList() const ; + + // Return the number of elements in a list + size_t GetCount() const; + + // Make empty list + void NullList(); + + // Append to list + void Append(const wxVariant& value); + + // Insert at front of list + void Insert(const wxVariant& value); + + // Returns true if the variant is a member of the list + bool Member(const wxVariant& value) const; + + // Deletes the nth element of the list + bool Delete(size_t item); + + // Clear list + void ClearList(); + +public: + // Type conversion + bool Convert(long* value) const; + bool Convert(bool* value) const; + bool Convert(double* value) const; + bool Convert(wxString* value) const; + bool Convert(wxChar* value) const; +#if wxUSE_DATETIME + bool Convert(wxDateTime* value) const; +#endif // wxUSE_DATETIME + +// Attributes +protected: + wxVariantData* m_data; + wxString m_name; + +private: + DECLARE_DYNAMIC_CLASS(wxVariant) +}; + +#define DECLARE_VARIANT_OBJECT(classname) \ + DECLARE_VARIANT_OBJECT_EXPORTED(classname, wxEMPTY_PARAMETER_VALUE) + +#define DECLARE_VARIANT_OBJECT_EXPORTED(classname,expdecl) \ +expdecl classname& operator << ( classname &object, const wxVariant &variant ); \ +expdecl wxVariant& operator << ( wxVariant &variant, const classname &object ); + +#define IMPLEMENT_VARIANT_OBJECT(classname) \ + IMPLEMENT_VARIANT_OBJECT_EXPORTED(classname, wxEMPTY_PARAMETER_VALUE) + +#define IMPLEMENT_VARIANT_OBJECT_EXPORTED_NO_EQ(classname,expdecl) \ +class classname##VariantData: public wxVariantData \ +{ \ +public:\ + classname##VariantData() {} \ + classname##VariantData( const classname &value ) { m_value = value; } \ +\ + classname &GetValue() { return m_value; } \ +\ + virtual bool Eq(wxVariantData& data) const; \ +\ + virtual wxString GetType() const; \ + virtual wxClassInfo* GetValueClassInfo(); \ +\ +protected:\ + classname m_value; \ +\ +private: \ + DECLARE_CLASS(classname##VariantData) \ +};\ +\ +IMPLEMENT_CLASS(classname##VariantData, wxVariantData)\ +\ +wxString classname##VariantData::GetType() const\ +{\ + return m_value.GetClassInfo()->GetClassName();\ +}\ +\ +wxClassInfo* classname##VariantData::GetValueClassInfo()\ +{\ + return m_value.GetClassInfo();\ +}\ +\ +expdecl classname& operator << ( classname &value, const wxVariant &variant )\ +{\ + wxASSERT( wxIsKindOf( variant.GetData(), classname##VariantData ) );\ + \ + classname##VariantData *data = (classname##VariantData*) variant.GetData();\ + value = data->GetValue();\ + return value;\ +}\ +\ +expdecl wxVariant& operator << ( wxVariant &variant, const classname &value )\ +{\ + classname##VariantData *data = new classname##VariantData( value );\ + variant.SetData( data );\ + return variant;\ +} + +// implements a wxVariantData-derived class using for the Eq() method the +// operator== which must have been provided by "classname" +#define IMPLEMENT_VARIANT_OBJECT_EXPORTED(classname,expdecl) \ +IMPLEMENT_VARIANT_OBJECT_EXPORTED_NO_EQ(classname,wxEMPTY_PARAMETER_VALUE expdecl) \ +\ +bool classname##VariantData::Eq(wxVariantData& data) const \ +{\ + wxASSERT( wxIsKindOf((&data), classname##VariantData) );\ +\ + classname##VariantData & otherData = (classname##VariantData &) data;\ +\ + return otherData.m_value == m_value;\ +}\ + + +// implements a wxVariantData-derived class using for the Eq() method a shallow +// comparison (through wxObject::IsSameAs function) +#define IMPLEMENT_VARIANT_OBJECT_SHALLOWCMP(classname) \ + IMPLEMENT_VARIANT_OBJECT_EXPORTED_SHALLOWCMP(classname, wxEMPTY_PARAMETER_VALUE) +#define IMPLEMENT_VARIANT_OBJECT_EXPORTED_SHALLOWCMP(classname,expdecl) \ +IMPLEMENT_VARIANT_OBJECT_EXPORTED_NO_EQ(classname,wxEMPTY_PARAMETER_VALUE expdecl) \ +\ +bool classname##VariantData::Eq(wxVariantData& data) const \ +{\ + wxASSERT( wxIsKindOf((&data), classname##VariantData) );\ +\ + classname##VariantData & otherData = (classname##VariantData &) data;\ +\ + return (otherData.m_value.IsSameAs(m_value));\ +}\ + + +// Since we want type safety wxVariant we need to fetch and dynamic_cast +// in a seemingly safe way so the compiler can check, so we define +// a dynamic_cast /wxDynamicCast analogue. + +#define wxGetVariantCast(var,classname) \ + ((classname*)(var.IsValueKindOf(&classname::ms_classInfo) ?\ + var.GetWxObjectPtr() : NULL)); + +extern wxVariant WXDLLIMPEXP_BASE wxNullVariant; + +#endif // wxUSE_VARIANT + +#endif // _WX_VARIANT_H_ diff --git a/Externals/wxWidgets/include/wx/vector.h b/Externals/wxWidgets/include/wx/vector.h new file mode 100644 index 0000000000..b0639e29f2 --- /dev/null +++ b/Externals/wxWidgets/include/wx/vector.h @@ -0,0 +1,212 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/vector.h +// Purpose: STL vector clone +// Author: Lindsay Mathieson +// Modified by: +// Created: 30.07.2001 +// Copyright: (c) 2001 Lindsay Mathieson <lindsay@mathieson.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_VECTOR_H_ +#define _WX_VECTOR_H_ + +#include "wx/defs.h" + +class WXDLLIMPEXP_BASE wxVectorBase +{ +public: + typedef size_t size_type; +private: + size_type m_allocsize; + size_type m_size, + m_capacity; + void **m_objects; + +protected: + bool Alloc(size_type sz) + { + // work in multiples of m_allocsize; + sz = (sz / m_allocsize + 1) * m_allocsize; + if (sz <= m_capacity) + return true; + + // try to realloc + void *mem = realloc(m_objects, sizeof(void *) * sz); + if (! mem) + return false; // failed + // success + m_objects = (void **) mem; + m_capacity = sz; + return true; + } + + // untyped destructor of elements - must be overriden + virtual void Free(void *) = 0; + // untyped copy constructor of elements - must be overriden + virtual void *Copy(const void *) const = 0; + + const void *GetItem(size_type idx) const + { + wxASSERT(idx < m_size); + return m_objects[idx]; + } + + void Append(void *obj) + { + wxASSERT(m_size < m_capacity); + m_objects[m_size] = obj; + m_size++; + } + + void RemoveAt(size_type idx) + { + wxASSERT(idx < m_size); + Free(m_objects[idx]); + if (idx < m_size - 1) + memcpy( + m_objects + idx, + m_objects + idx + 1, + ( m_size - idx - 1 ) * sizeof(void*) ); + m_size--; + } + + bool copy(const wxVectorBase& vb) + { + clear(); + if (! Alloc(vb.size())) + return false; + + for (size_type i = 0; i < vb.size(); i++) + { + void *o = vb.Copy(vb.GetItem(i)); + if (! o) + return false; + Append(o); + } + + return true; + } + +public: + wxVectorBase() : m_allocsize(16), m_size(0), m_capacity(0), m_objects(0) {} + virtual ~wxVectorBase() {} // calm down GCC + + void clear() + { + for (size_type i = 0; i < size(); i++) + Free(m_objects[i]); + free(m_objects); + m_objects = 0; + m_size = m_capacity = 0; + } + + void reserve(size_type n) + { + if ( !Alloc(n) ) + { + wxFAIL_MSG( _T("out of memory in wxVector::reserve()") ); + } + } + + size_type size() const + { + return m_size; + } + + size_type capacity() const + { + return m_capacity; + } + + bool empty() const + { + return size() == 0; + } + + wxVectorBase& operator = (const wxVectorBase& vb) + { + wxCHECK(copy(vb), *this); + return *this; + } +}; + +#define WX_DECLARE_VECTORBASE(obj, cls)\ +protected:\ + virtual void Free(void *o)\ + {\ + delete (obj *) o;\ + }\ + virtual void *Copy(const void *o) const\ + {\ + return new obj(*(obj *) o);\ + }\ +public:\ + cls() {}\ + cls(const cls& c) : wxVectorBase()\ + {\ + wxCHECK2(copy(c), return);\ + }\ + ~cls()\ + {\ + clear();\ + } + +#define _WX_DECLARE_VECTOR(obj, cls, exp)\ +class exp cls : public wxVectorBase\ +{\ + WX_DECLARE_VECTORBASE(obj, cls)\ +public:\ + void push_back(const obj& o)\ + {\ + wxCHECK2(Alloc(size() + 1), return);\ + Append(new obj(o));\ + }\ + void pop_back()\ + {\ + RemoveAt(size() - 1);\ + }\ + const obj& at(size_type idx) const\ + {\ + return *(obj *) GetItem(idx);\ + }\ + obj& at(size_type idx)\ + {\ + return *(obj *) GetItem(idx);\ + }\ + const obj& operator[](size_type idx) const\ + {\ + return at(idx);\ + }\ + obj& operator[](size_type idx)\ + {\ + return at(idx);\ + }\ + const obj& front() const\ + {\ + return at(0);\ + }\ + obj& front()\ + {\ + return at(0);\ + }\ + const obj& back() const\ + {\ + return at(size() - 1);\ + }\ + obj& back()\ + {\ + return at(size() - 1);\ + }\ + size_type erase(size_type idx)\ + {\ + RemoveAt(idx);\ + return idx;\ + }\ +} + +#define WX_DECLARE_VECTOR(obj, cls) \ + _WX_DECLARE_VECTOR(obj, cls, WXDLLEXPORT) + +#endif // _WX_VECTOR_H_ + diff --git a/Externals/wxWidgets/include/wx/version.h b/Externals/wxWidgets/include/wx/version.h new file mode 100644 index 0000000000..2662d7eee2 --- /dev/null +++ b/Externals/wxWidgets/include/wx/version.h @@ -0,0 +1,91 @@ +/* + * Name: wx/version.h + * Purpose: wxWidgets version numbers + * Author: Julian Smart + * Modified by: Ryan Norton (Converted to C) + * Created: 29/01/98 + * RCS-ID: $Id: version.h 49673 2007-11-06 09:28:42Z CE $ + * Copyright: (c) 1998 Julian Smart + * Licence: wxWindows licence + */ + +/* THIS IS A C FILE, DON'T USE C++ FEATURES (IN PARTICULAR COMMENTS) IN IT */ + +#ifndef _WX_VERSION_H_ +#define _WX_VERSION_H_ + +#include "wx/cpp.h" /* for wxSTRINGIZE */ + +/* the constants below must be changed with each new version */ +/* ---------------------------------------------------------------------------- */ + +/* + Don't forget to update WX_CURRENT, WX_REVISION and WX_AGE in + build/bakefiles/version.bkl and regenerate the makefiles when you change + this! + */ + +/* NB: this file is parsed by automatic tools so don't change its format! */ +#define wxMAJOR_VERSION 2 +#define wxMINOR_VERSION 8 +#define wxRELEASE_NUMBER 7 +#define wxSUBRELEASE_NUMBER 0 +#define wxVERSION_STRING _T("wxWidgets 2.8.7") + +/* nothing to update below this line when updating the version */ +/* ---------------------------------------------------------------------------- */ + +/* Users can pre-define wxABI_VERSION to a lower value in their + * makefile/project settings to compile code that will be binary compatible + * with earlier versions of the ABI within the same minor version (between + * minor versions binary compatibility breaks anyway). The default is the + * version of wxWidgets being used. A single number with two decimal digits + * for each component, e.g. 20601 for 2.6.1 */ +#ifndef wxABI_VERSION +#define wxABI_VERSION ( wxMAJOR_VERSION * 10000 + wxMINOR_VERSION * 100 + 99 ) +#endif + +/* helpers for wxVERSION_NUM_XXX */ +#define wxMAKE_VERSION_STRING(x, y, z) \ + wxSTRINGIZE(x) wxSTRINGIZE(y) wxSTRINGIZE(z) +#define wxMAKE_VERSION_DOT_STRING(x, y, z) \ + wxSTRINGIZE(x) "." wxSTRINGIZE(y) "." wxSTRINGIZE(z) + +#define wxMAKE_VERSION_STRING_T(x, y, z) \ + wxSTRINGIZE_T(x) wxSTRINGIZE_T(y) wxSTRINGIZE_T(z) +#define wxMAKE_VERSION_DOT_STRING_T(x, y, z) \ + wxSTRINGIZE_T(x) _T(".") wxSTRINGIZE_T(y) _T(".") wxSTRINGIZE_T(z) + +/* these are used by src/msw/version.rc and should always be ASCII, not Unicode */ +#define wxVERSION_NUM_STRING \ + wxMAKE_VERSION_STRING(wxMAJOR_VERSION, wxMINOR_VERSION, wxRELEASE_NUMBER) +#define wxVERSION_NUM_DOT_STRING \ + wxMAKE_VERSION_DOT_STRING(wxMAJOR_VERSION, wxMINOR_VERSION, wxRELEASE_NUMBER) + +/* those are Unicode-friendly */ +#define wxVERSION_NUM_STRING_T \ + wxMAKE_VERSION_STRING_T(wxMAJOR_VERSION, wxMINOR_VERSION, wxRELEASE_NUMBER) +#define wxVERSION_NUM_DOT_STRING_T \ + wxMAKE_VERSION_DOT_STRING_T(wxMAJOR_VERSION, wxMINOR_VERSION, wxRELEASE_NUMBER) + +/* some more defines, not really sure if they're [still] useful */ +#define wxVERSION_NUMBER ( (wxMAJOR_VERSION * 1000) + (wxMINOR_VERSION * 100) + wxRELEASE_NUMBER ) +#define wxBETA_NUMBER 0 +#define wxVERSION_FLOAT ( wxMAJOR_VERSION + (wxMINOR_VERSION/10.0) + (wxRELEASE_NUMBER/100.0) + (wxBETA_NUMBER/10000.0) ) + +/* check if the current version is at least major.minor.release */ +#define wxCHECK_VERSION(major,minor,release) \ + (wxMAJOR_VERSION > (major) || \ + (wxMAJOR_VERSION == (major) && wxMINOR_VERSION > (minor)) || \ + (wxMAJOR_VERSION == (major) && wxMINOR_VERSION == (minor) && wxRELEASE_NUMBER >= (release))) + +/* the same but check the subrelease also */ +#define wxCHECK_VERSION_FULL(major,minor,release,subrel) \ + (wxCHECK_VERSION(major, minor, release) && \ + ((major) != wxMAJOR_VERSION || \ + (minor) != wxMINOR_VERSION || \ + (release) != wxRELEASE_NUMBER || \ + (subrel) <= wxSUBRELEASE_NUMBER)) + +#endif /* _WX_VERSION_H_ */ + diff --git a/Externals/wxWidgets/include/wx/vidmode.h b/Externals/wxWidgets/include/wx/vidmode.h new file mode 100644 index 0000000000..343d0de940 --- /dev/null +++ b/Externals/wxWidgets/include/wx/vidmode.h @@ -0,0 +1,73 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/vidmode.h +// Purpose: declares wxVideoMode class used by both wxDisplay and wxApp +// Author: Vadim Zeitlin +// Modified by: +// Created: 27.09.2003 (extracted from wx/display.h) +// RCS-ID: $Id: vidmode.h 27408 2004-05-23 20:53:33Z JS $ +// Copyright: (c) 2003 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_VMODE_H_ +#define _WX_VMODE_H_ + +// ---------------------------------------------------------------------------- +// wxVideoMode: a simple struct containing video mode parameters for a display +// ---------------------------------------------------------------------------- + +struct WXDLLEXPORT wxVideoMode +{ + wxVideoMode(int width = 0, int height = 0, int depth = 0, int freq = 0) + { + w = width; + h = height; + + bpp = depth; + + refresh = freq; + } + + // default copy ctor and assignment operator are ok + + bool operator==(const wxVideoMode& m) const + { + return w == m.w && h == m.h && bpp == m.bpp && refresh == m.refresh; + } + bool operator!=(const wxVideoMode& mode) const + { + return !operator==(mode); + } + + // returns true if this mode matches the other one in the sense that all + // non zero fields of the other mode have the same value in this one + // (except for refresh which is allowed to have a greater value) + bool Matches(const wxVideoMode& other) const + { + return (!other.w || w == other.w) && + (!other.h || h == other.h) && + (!other.bpp || bpp == other.bpp) && + (!other.refresh || refresh >= other.refresh); + } + + // trivial accessors + int GetWidth() const { return w; } + int GetHeight() const { return h; } + int GetDepth() const { return bpp; } + + // returns true if the object has been initialized + bool IsOk() const { return w && h; } + + + // the screen size in pixels (e.g. 640*480), 0 means unspecified + int w, h; + + // bits per pixel (e.g. 32), 1 is monochrome and 0 means unspecified/known + int bpp; + + // refresh frequency in Hz, 0 means unspecified/unknown + int refresh; +}; + +#endif // _WX_VMODE_H_ + diff --git a/Externals/wxWidgets/include/wx/vlbox.h b/Externals/wxWidgets/include/wx/vlbox.h new file mode 100644 index 0000000000..fbfce92596 --- /dev/null +++ b/Externals/wxWidgets/include/wx/vlbox.h @@ -0,0 +1,296 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/vlbox.h +// Purpose: wxVListBox is a virtual listbox with lines of variable height +// Author: Vadim Zeitlin +// Modified by: +// Created: 31.05.03 +// RCS-ID: $Id: vlbox.h 41810 2006-10-09 16:39:34Z VZ $ +// Copyright: (c) 2003 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_VLBOX_H_ +#define _WX_VLBOX_H_ + +#include "wx/vscroll.h" // base class +#include "wx/bitmap.h" + +class WXDLLEXPORT wxSelectionStore; + +#define wxVListBoxNameStr _T("wxVListBox") + +// ---------------------------------------------------------------------------- +// wxVListBox +// ---------------------------------------------------------------------------- + +/* + This class has two main differences from a regular listbox: it can have an + arbitrarily huge number of items because it doesn't store them itself but + uses OnDrawItem() callback to draw them and its items can have variable + height as determined by OnMeasureItem(). + + It emits the same events as wxListBox and the same event macros may be used + with it. + */ +class WXDLLEXPORT wxVListBox : public wxVScrolledWindow +{ +public: + // constructors and such + // --------------------- + + // default constructor, you must call Create() later + wxVListBox() { Init(); } + + // normal constructor which calls Create() internally + wxVListBox(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxVListBoxNameStr) + { + Init(); + + (void)Create(parent, id, pos, size, style, name); + } + + // really creates the control and sets the initial number of items in it + // (which may be changed later with SetItemCount()) + // + // the only special style which may be specified here is wxLB_MULTIPLE + // + // returns true on success or false if the control couldn't be created + bool Create(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxVListBoxNameStr); + + // dtor does some internal cleanup (deletes m_selStore if any) + virtual ~wxVListBox(); + + + // accessors + // --------- + + // get the number of items in the control + size_t GetItemCount() const { return GetLineCount(); } + + // does this control use multiple selection? + bool HasMultipleSelection() const { return m_selStore != NULL; } + + // get the currently selected item or wxNOT_FOUND if there is no selection + // + // this method is only valid for the single selection listboxes + int GetSelection() const + { + wxASSERT_MSG( !HasMultipleSelection(), + _T("GetSelection() can't be used with wxLB_MULTIPLE") ); + + return m_current; + } + + // is this item the current one? + bool IsCurrent(size_t item) const { return item == (size_t)m_current; } + #ifdef __WXUNIVERSAL__ + bool IsCurrent() const { return wxVScrolledWindow::IsCurrent(); } + #endif + + // is this item selected? + bool IsSelected(size_t item) const; + + // get the number of the selected items (maybe 0) + // + // this method is valid for both single and multi selection listboxes + size_t GetSelectedCount() const; + + // get the first selected item, returns wxNOT_FOUND if none + // + // cookie is an opaque parameter which should be passed to + // GetNextSelected() later + // + // this method is only valid for the multi selection listboxes + int GetFirstSelected(unsigned long& cookie) const; + + // get next selection item, return wxNOT_FOUND if no more + // + // cookie must be the same parameter that was passed to GetFirstSelected() + // before + // + // this method is only valid for the multi selection listboxes + int GetNextSelected(unsigned long& cookie) const; + + // get the margins around each item + wxPoint GetMargins() const { return m_ptMargins; } + + // get the background colour of selected cells + const wxColour& GetSelectionBackground() const { return m_colBgSel; } + + + // operations + // ---------- + + // set the number of items to be shown in the control + // + // this is just a synonym for wxVScrolledWindow::SetLineCount() + virtual void SetItemCount(size_t count); + + // delete all items from the control + void Clear() { SetItemCount(0); } + + // set the selection to the specified item, if it is wxNOT_FOUND the + // selection is unset + // + // this function is only valid for the single selection listboxes + void SetSelection(int selection); + + // selects or deselects the specified item which must be valid (i.e. not + // equal to wxNOT_FOUND) + // + // return true if the items selection status has changed or false + // otherwise + // + // this function is only valid for the multiple selection listboxes + bool Select(size_t item, bool select = true); + + // selects the items in the specified range whose end points may be given + // in any order + // + // return true if any items selection status has changed, false otherwise + // + // this function is only valid for the single selection listboxes + bool SelectRange(size_t from, size_t to); + + // toggle the selection of the specified item (must be valid) + // + // this function is only valid for the multiple selection listboxes + void Toggle(size_t item) { Select(item, !IsSelected(item)); } + + // select all items in the listbox + // + // the return code indicates if any items were affected by this operation + // (true) or if nothing has changed (false) + bool SelectAll() { return DoSelectAll(true); } + + // unselect all items in the listbox + // + // the return code has the same meaning as for SelectAll() + bool DeselectAll() { return DoSelectAll(false); } + + // set the margins: horizontal margin is the distance between the window + // border and the item contents while vertical margin is half of the + // distance between items + // + // by default both margins are 0 + void SetMargins(const wxPoint& pt); + void SetMargins(wxCoord x, wxCoord y) { SetMargins(wxPoint(x, y)); } + + // change the background colour of the selected cells + void SetSelectionBackground(const wxColour& col); + + + virtual wxVisualAttributes GetDefaultAttributes() const + { + return GetClassDefaultAttributes(GetWindowVariant()); + } + + static wxVisualAttributes + GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL); + +protected: + // the derived class must implement this function to actually draw the item + // with the given index on the provided DC + virtual void OnDrawItem(wxDC& dc, const wxRect& rect, size_t n) const = 0; + + // the derived class must implement this method to return the height of the + // specified item + virtual wxCoord OnMeasureItem(size_t n) const = 0; + + // this method may be used to draw separators between the lines; note that + // the rectangle may be modified, typically to deflate it a bit before + // passing to OnDrawItem() + // + // the base class version doesn't do anything + virtual void OnDrawSeparator(wxDC& dc, wxRect& rect, size_t n) const; + + // this method is used to draw the items background and, maybe, a border + // around it + // + // the base class version implements a reasonable default behaviour which + // consists in drawing the selected item with the standard background + // colour and drawing a border around the item if it is either selected or + // current + virtual void OnDrawBackground(wxDC& dc, const wxRect& rect, size_t n) const; + + // we implement OnGetLineHeight() in terms of OnMeasureItem() because this + // allows us to add borders to the items easily + // + // this function is not supposed to be overridden by the derived classes + virtual wxCoord OnGetLineHeight(size_t line) const; + + + // event handlers + void OnPaint(wxPaintEvent& event); + void OnKeyDown(wxKeyEvent& event); + void OnLeftDown(wxMouseEvent& event); + void OnLeftDClick(wxMouseEvent& event); + + + // common part of all ctors + void Init(); + + // send the wxEVT_COMMAND_LISTBOX_SELECTED event + void SendSelectedEvent(); + + // common implementation of SelectAll() and DeselectAll() + bool DoSelectAll(bool select); + + // change the current item (in single selection listbox it also implicitly + // changes the selection); current may be wxNOT_FOUND in which case there + // will be no current item any more + // + // return true if the current item changed, false otherwise + bool DoSetCurrent(int current); + + // flags for DoHandleItemClick + enum + { + ItemClick_Shift = 1, // item shift-clicked + ItemClick_Ctrl = 2, // ctrl + ItemClick_Kbd = 4 // item selected from keyboard + }; + + // common part of keyboard and mouse handling processing code + void DoHandleItemClick(int item, int flags); + +private: + // the current item or wxNOT_FOUND + // + // if m_selStore == NULL this is also the selected item, otherwise the + // selections are managed by m_selStore + int m_current; + + // the anchor of the selection for the multiselection listboxes: + // shift-clicking an item extends the selection from m_anchor to the item + // clicked, for example + // + // always wxNOT_FOUND for single selection listboxes + int m_anchor; + + // the object managing our selected items if not NULL + wxSelectionStore *m_selStore; + + // margins + wxPoint m_ptMargins; + + // the selection bg colour + wxColour m_colBgSel; + + DECLARE_EVENT_TABLE() + DECLARE_NO_COPY_CLASS(wxVListBox) + DECLARE_ABSTRACT_CLASS(wxVListBox) +}; + +#endif // _WX_VLBOX_H_ + diff --git a/Externals/wxWidgets/include/wx/vms_x_fix.h b/Externals/wxWidgets/include/wx/vms_x_fix.h new file mode 100644 index 0000000000..86f3c64944 --- /dev/null +++ b/Externals/wxWidgets/include/wx/vms_x_fix.h @@ -0,0 +1,1213 @@ +/*************************************************************************** + * * + * Author : Jouk Jansen (joukj@hrem.stm.tudelft.nl) * + * * + * Last revision : 7 October 2005 * + * * + * Repair definitions of Runtime library functions when compiling with * + * /name=(as_is) on OpenVMS * + * * + ***************************************************************************/ + +#ifndef VMS_X_FIX +#define VMS_X_FIX + +#define decw$_select DECW$_SELECT +#define DtSaverGetWindows DTSAVERGETWINDOWS +#define MrmFetchWidget MRMFETCHWIDGET +#define MrmInitialize MRMINITIALIZE +#define MrmOpenHierarchy MRMOPENHIERARCHY +#define MrmRegisterNames MRMREGISTERNAMES +#define XAddExtension XADDEXTENSION +#define XAddHosts XADDHOSTS +#define XAllocClassHint XALLOCCLASSHINT +#define XAllocColor XALLOCCOLOR +#define XAllocColorCells XALLOCCOLORCELLS +#define XAllocIconSize XALLOCICONSIZE +#define XAllocNamedColor XALLOCNAMEDCOLOR +#define XAllocSizeHints XALLOCSIZEHINTS +#define XAllocStandardColormap XALLOCSTANDARDCOLORMAP +#define XAllocWMHints XALLOCWMHINTS +#define XAllowEvents XALLOWEVENTS +#define XAutoRepeatOff XAUTOREPEATOFF +#define XAutoRepeatOn XAUTOREPEATON +#define XBaseFontNameListOfFontSet XBASEFONTNAMELISTOFFONTSET +#define XBell XBELL +#define XBitmapPad XBITMAPPAD +#define XBlackPixel XBLACKPIXEL +#define XBlackPixelOfScreen XBLACKPIXELOFSCREEN +#define XCellsOfScreen XCELLSOFSCREEN +#define XChangeActivePointerGrab XCHANGEACTIVEPOINTERGRAB +#define XChangeGC XCHANGEGC +#define XChangeKeyboardControl XCHANGEKEYBOARDCONTROL +#define XChangePointerControl XCHANGEPOINTERCONTROL +#define XChangeProperty XCHANGEPROPERTY +#define XChangeWindowAttributes XCHANGEWINDOWATTRIBUTES +#define XCheckIfEvent XCHECKIFEVENT +#define XCheckMaskEvent XCHECKMASKEVENT +#define XCheckTypedEvent XCHECKTYPEDEVENT +#define XCheckTypedWindowEvent XCHECKTYPEDWINDOWEVENT +#define XCheckWindowEvent XCHECKWINDOWEVENT +#define XClearArea XCLEARAREA +#define XClearWindow XCLEARWINDOW +#define XClipBox XCLIPBOX +#define XCloseDisplay XCLOSEDISPLAY +#define XCloseIM XCLOSEIM +#define XConfigureWindow XCONFIGUREWINDOW +#define XConvertSelection XCONVERTSELECTION +#define XCopyArea XCOPYAREA +#define XCopyColormapAndFree XCOPYCOLORMAPANDFREE +#define XCopyGC XCOPYGC +#define XCopyPlane XCOPYPLANE +#define XCreateBitmapFromData XCREATEBITMAPFROMDATA +#define XCreateColormap XCREATECOLORMAP +#define XCreateFontCursor XCREATEFONTCURSOR +#define XCreateFontSet XCREATEFONTSET +#define XCreateGC XCREATEGC +#define XCreateGlyphCursor XCREATEGLYPHCURSOR +#define XCreateIC XCREATEIC +#define XCreateImage XCREATEIMAGE +#define XCreatePixmap XCREATEPIXMAP +#define XCreatePixmapCursor XCREATEPIXMAPCURSOR +#define XCreatePixmapFromBitmapData XCREATEPIXMAPFROMBITMAPDATA +#define XCreateRegion XCREATEREGION +#define XCreateSimpleWindow XCREATESIMPLEWINDOW +#define XCreateWindow XCREATEWINDOW +#define XDefaultColormap XDEFAULTCOLORMAP +#define XDefaultColormapOfScreen XDEFAULTCOLORMAPOFSCREEN +#define XDefaultDepth XDEFAULTDEPTH +#define XDefaultDepthOfScreen XDEFAULTDEPTHOFSCREEN +#define XDefaultGC XDEFAULTGC +#define XDefaultRootWindow XDEFAULTROOTWINDOW +#define XDefaultScreen XDEFAULTSCREEN +#define XDefaultScreenOfDisplay XDEFAULTSCREENOFDISPLAY +#define XDefaultVisual XDEFAULTVISUAL +#define XDefaultVisualOfScreen XDEFAULTVISUALOFSCREEN +#define XDefineCursor XDEFINECURSOR +#define XDeleteContext XDELETECONTEXT +#define XDeleteProperty XDELETEPROPERTY +#define XDestroyIC XDESTROYIC +#define XDestroyRegion XDESTROYREGION +#define XDestroySubwindows XDESTROYSUBWINDOWS +#define XDestroyWindow XDESTROYWINDOW +#define XDisableAccessControl XDISABLEACCESSCONTROL +#define XDisplayCells XDISPLAYCELLS +#define XDisplayHeight XDISPLAYHEIGHT +#define XDisplayKeycodes XDISPLAYKEYCODES +#define XDisplayName XDISPLAYNAME +#define XDisplayOfIM XDISPLAYOFIM +#define XDisplayOfScreen XDISPLAYOFSCREEN +#define XDisplayString XDISPLAYSTRING +#define XDisplayWidth XDISPLAYWIDTH +#define XDoesBackingStore XDOESBACKINGSTORE +#define XDrawArc XDRAWARC +#define XDrawArcs XDRAWARCS +#define XDrawImageString XDRAWIMAGESTRING +#define XDrawImageString16 XDRAWIMAGESTRING16 +#define XDrawLine XDRAWLINE +#define XDrawLines XDRAWLINES +#define XDrawPoint XDRAWPOINT +#define XDrawPoints XDRAWPOINTS +#define XDrawRectangle XDRAWRECTANGLE +#define XDrawRectangles XDRAWRECTANGLES +#define XDrawSegments XDRAWSEGMENTS +#define XDrawString XDRAWSTRING +#define XDrawString16 XDRAWSTRING16 +#define XDrawText XDRAWTEXT +#define XDrawText16 XDRAWTEXT16 +#define XESetCloseDisplay XESETCLOSEDISPLAY +#define XEmptyRegion XEMPTYREGION +#define XEnableAccessControl XENABLEACCESSCONTROL +#define XEqualRegion XEQUALREGION +#define XEventsQueued XEVENTSQUEUED +#define XExtendedMaxRequestSize XEXTENDEDMAXREQUESTSIZE +#define XExtentsOfFontSet XEXTENTSOFFONTSET +#define XFetchBuffer XFETCHBUFFER +#define XFetchBytes XFETCHBYTES +#define XFetchName XFETCHNAME +#define XFillArc XFILLARC +#define XFillArcs XFILLARCS +#define XFillPolygon XFILLPOLYGON +#define XFillRectangle XFILLRECTANGLE +#define XFillRectangles XFILLRECTANGLES +#define XFilterEvent XFILTEREVENT +#define XFindContext XFINDCONTEXT +#define XFlush XFLUSH +#define XFontsOfFontSet XFONTSOFFONTSET +#define XForceScreenSaver XFORCESCREENSAVER +#define XFree XFREE +#define XFreeColormap XFREECOLORMAP +#define XFreeColors XFREECOLORS +#define XFreeCursor XFREECURSOR +#define XFreeDeviceList XFREEDEVICELIST +#define XFreeDeviceState XFREEDEVICESTATE +#define XFreeFont XFREEFONT +#define XFreeFontInfo XFREEFONTINFO +#define XFreeFontNames XFREEFONTNAMES +#define XFreeFontSet XFREEFONTSET +#define XFreeGC XFREEGC +#define XFreeModifiermap XFREEMODIFIERMAP +#define XFreePixmap XFREEPIXMAP +#define XFreeStringList XFREESTRINGLIST +#define XGContextFromGC XGCONTEXTFROMGC +#define XGeometry XGEOMETRY +#define XGetAtomName XGETATOMNAME +#define XGetCommand XGETCOMMAND +#define XGetDefault XGETDEFAULT +#define XGetErrorDatabaseText XGETERRORDATABASETEXT +#define XGetErrorText XGETERRORTEXT +#define XGetExtensionVersion XGETEXTENSIONVERSION +#define XGetFontProperty XGETFONTPROPERTY +#define XGetGCValues XGETGCVALUES +#define XGetGeometry XGETGEOMETRY +#define XGetICValues XGETICVALUES +#define XGetIMValues XGETIMVALUES +#define XGetIconName XGETICONNAME +#define XGetIconSizes XGETICONSIZES +#define XGetImage XGETIMAGE +#define XGetInputFocus XGETINPUTFOCUS +#define XGetKeyboardControl XGETKEYBOARDCONTROL +#define XGetKeyboardMapping XGETKEYBOARDMAPPING +#define XGetModifierMapping XGETMODIFIERMAPPING +#define XGetMotionEvents XGETMOTIONEVENTS +#define XGetNormalHints XGETNORMALHINTS +#define XGetPointerMapping XGETPOINTERMAPPING +#define XGetRGBColormaps XGETRGBCOLORMAPS +#define XGetScreenSaver XGETSCREENSAVER +#define XGetSelectionOwner XGETSELECTIONOWNER +#define XGetStandardColormap XGETSTANDARDCOLORMAP +#define XGetSubImage XGETSUBIMAGE +#define XGetTextProperty XGETTEXTPROPERTY +#define XGetVisualInfo XGETVISUALINFO +#define XGetWMColormapWindows XGETWMCOLORMAPWINDOWS +#define XGetWMHints XGETWMHINTS +#define XGetWMIconName XGETWMICONNAME +#define XGetWMName XGETWMNAME +#define XGetWMNormalHints XGETWMNORMALHINTS +#define XGetWindowAttributes XGETWINDOWATTRIBUTES +#define XGetWindowProperty XGETWINDOWPROPERTY +#define XGrabButton XGRABBUTTON +#define XGrabKeyboard XGRABKEYBOARD +#define XGrabPointer XGRABPOINTER +#define XGrabServer XGRABSERVER +#define XHeightMMOfScreen XHEIGHTMMOFSCREEN +#define XHeightOfScreen XHEIGHTOFSCREEN +#define XIconifyWindow XICONIFYWINDOW +#define XIfEvent XIFEVENT +#define XInitExtension XINITEXTENSION +#define XInitImage XINITIMAGE +#define XInstallColormap XINSTALLCOLORMAP +#define XInternAtom XINTERNATOM +#define XInternAtoms XINTERNATOMS +#define XIntersectRegion XINTERSECTREGION +#define XKeycodeToKeysym XKEYCODETOKEYSYM +#define XKeysymToKeycode XKEYSYMTOKEYCODE +#define XKeysymToString XKEYSYMTOSTRING +#define XKillClient XKILLCLIENT +#define XListDepths XLISTDEPTHS +#define XListFonts XLISTFONTS +#define XListFontsWithInfo XLISTFONTSWITHINFO +#define XListHosts XLISTHOSTS +#define XListInputDevices XLISTINPUTDEVICES +#define XListInstalledColormaps XLISTINSTALLEDCOLORMAPS +#define XListPixmapFormats XLISTPIXMAPFORMATS +#define XListProperties XLISTPROPERTIES +#define XLoadFont XLOADFONT +#define XLoadQueryFont XLOADQUERYFONT +#define XLookupColor XLOOKUPCOLOR +#define XLookupKeysym XLOOKUPKEYSYM +#define XLookupString XLOOKUPSTRING +#define XLowerWindow XLOWERWINDOW +#define XMapRaised XMAPRAISED +#define XMapSubwindows XMAPSUBWINDOWS +#define XMapWindow XMAPWINDOW +#define XMatchVisualInfo XMATCHVISUALINFO +#define XMaxRequestSize XMAXREQUESTSIZE +#define XMissingExtension XMISSINGEXTENSION +#define XMoveResizeWindow XMOVERESIZEWINDOW +#define XMoveWindow XMOVEWINDOW +#define XNextEvent XNEXTEVENT +#define XNextRequest XNEXTREQUEST +#define XNoOp XNOOP +#define XOffsetRegion XOFFSETREGION +#define XOpenDevice XOPENDEVICE +#define XOpenDisplay XOPENDISPLAY +#define XOpenIM XOPENIM +#define XParseColor XPARSECOLOR +#define XParseGeometry XPARSEGEOMETRY +#define XPeekEvent XPEEKEVENT +#define XPeekIfEvent XPEEKIFEVENT +#define XPending XPENDING +#define XPointInRegion XPOINTINREGION +#define XPolygonRegion XPOLYGONREGION +#define XPutBackEvent XPUTBACKEVENT +#define XPutImage XPUTIMAGE +#define XQLength XQLENGTH +#define XQueryBestCursor XQUERYBESTCURSOR +#define XQueryBestStipple XQUERYBESTSTIPPLE +#define XQueryColor XQUERYCOLOR +#define XQueryColors XQUERYCOLORS +#define XQueryDeviceState XQUERYDEVICESTATE +#define XQueryExtension XQUERYEXTENSION +#define XQueryFont XQUERYFONT +#define XQueryKeymap XQUERYKEYMAP +#define XQueryPointer XQUERYPOINTER +#define XQueryTree XQUERYTREE +#define XRaiseWindow XRAISEWINDOW +#define XReadBitmapFile XREADBITMAPFILE +#define XRecolorCursor XRECOLORCURSOR +#define XReconfigureWMWindow XRECONFIGUREWMWINDOW +#define XRectInRegion XRECTINREGION +#define XRefreshKeyboardMapping XREFRESHKEYBOARDMAPPING +#define XRemoveHosts XREMOVEHOSTS +#define XReparentWindow XREPARENTWINDOW +#define XResetScreenSaver XRESETSCREENSAVER +#define XResizeWindow XRESIZEWINDOW +#define XResourceManagerString XRESOURCEMANAGERSTRING +#define XRestackWindows XRESTACKWINDOWS +#define XRotateBuffers XROTATEBUFFERS +#define XRootWindow XROOTWINDOW +#define XRootWindowOfScreen XROOTWINDOWOFSCREEN +#define XSaveContext XSAVECONTEXT +#define XScreenNumberOfScreen XSCREENNUMBEROFSCREEN +#define XScreenOfDisplay XSCREENOFDISPLAY +#define XSelectAsyncEvent XSELECTASYNCEVENT +#define XSelectAsyncInput XSELECTASYNCINPUT +#define XSelectExtensionEvent XSELECTEXTENSIONEVENT +#define XSelectInput XSELECTINPUT +#define XSendEvent XSENDEVENT +#define XServerVendor XSERVERVENDOR +#define XSetArcMode XSETARCMODE +#define XSetBackground XSETBACKGROUND +#define XSetClassHint XSETCLASSHINT +#define XSetClipMask XSETCLIPMASK +#define XSetClipOrigin XSETCLIPORIGIN +#define XSetClipRectangles XSETCLIPRECTANGLES +#define XSetCloseDownMode XSETCLOSEDOWNMODE +#define XSetCommand XSETCOMMAND +#define XSetDashes XSETDASHES +#define XSetErrorHandler XSETERRORHANDLER +#define XSetFillRule XSETFILLRULE +#define XSetFillStyle XSETFILLSTYLE +#define XSetFont XSETFONT +#define XSetForeground XSETFOREGROUND +#define XSetFunction XSETFUNCTION +#define XSetGraphicsExposures XSETGRAPHICSEXPOSURES +#define XSetICFocus XSETICFOCUS +#define XSetICValues XSETICVALUES +#define XSetIOErrorHandler XSETIOERRORHANDLER +#define XSetIconName XSETICONNAME +#define XSetInputFocus XSETINPUTFOCUS +#define XSetLineAttributes XSETLINEATTRIBUTES +#define XSetLocaleModifiers XSETLOCALEMODIFIERS +#define XSetNormalHints XSETNORMALHINTS +#define XSetPlaneMask XSETPLANEMASK +#define XSetRegion XSETREGION +#define XSetRGBColormaps XSETRGBCOLORMAPS +#define XSetScreenSaver XSETSCREENSAVER +#define XSetSelectionOwner XSETSELECTIONOWNER +#define XSetStandardProperties XSETSTANDARDPROPERTIES +#define XSetState XSETSTATE +#define XSetStipple XSETSTIPPLE +#define XSetSubwindowMode XSETSUBWINDOWMODE +#define XSetTSOrigin XSETTSORIGIN +#define XSetTextProperty XSETTEXTPROPERTY +#define XSetTile XSETTILE +#define XSetTransientForHint XSETTRANSIENTFORHINT +#define XSetWMClientMachine XSETWMCLIENTMACHINE +#define XSetWMColormapWindows XSETWMCOLORMAPWINDOWS +#define XSetWMHints XSETWMHINTS +#define XSetWMIconName XSETWMICONNAME +#define XSetWMName XSETWMNAME +#define XSetWMNormalHints XSETWMNORMALHINTS +#define XSetWMProperties XSETWMPROPERTIES +#define XSetWMProtocols XSETWMPROTOCOLS +#define XSetWMSizeHints XSETWMSIZEHINTS +#define XSetWindowBackground XSETWINDOWBACKGROUND +#define XSetWindowBackgroundPixmap XSETWINDOWBACKGROUNDPIXMAP +#define XSetWindowBorder XSETWINDOWBORDER +#define XSetWindowBorderPixmap XSETWINDOWBORDERPIXMAP +#define XSetWindowBorderWidth XSETWINDOWBORDERWIDTH +#define XSetWindowColormap XSETWINDOWCOLORMAP +#define XShapeCombineMask XSHAPECOMBINEMASK +#define XShapeCombineRectangles XSHAPECOMBINERECTANGLES +#define XShapeGetRectangles XSHAPEGETRECTANGLES +#define XShapeQueryExtension XSHAPEQUERYEXTENSION +#define XShmAttach XSHMATTACH +#define XShmCreateImage XSHMCREATEIMAGE +#define XShmCreatePixmap XSHMCREATEPIXMAP +#define XShmDetach XSHMDETACH +#define XShmGetEventBase XSHMGETEVENTBASE +#define XShmPutImage XSHMPUTIMAGE +#define XShmQueryExtension XSHMQUERYEXTENSION +#define XShmQueryVersion XSHMQUERYVERSION +#define XShrinkRegion XSHRINKREGION +#define XStoreBuffer XSTOREBUFFER +#define XStoreBytes XSTOREBYTES +#define XStoreColor XSTORECOLOR +#define XStoreColors XSTORECOLORS +#define XStoreName XSTORENAME +#define XStringListToTextProperty XSTRINGLISTTOTEXTPROPERTY +#define XStringToKeysym XSTRINGTOKEYSYM +#define XSubtractRegion XSUBTRACTREGION +#define XSupportsLocale XSUPPORTSLOCALE +#define XSync XSYNC +#define XSynchronize XSYNCHRONIZE +#define XTextExtents XTEXTEXTENTS +#define XTextExtents16 XTEXTEXTENTS16 +#define XTextPropertyToStringList XTEXTPROPERTYTOSTRINGLIST +#define XTextWidth XTEXTWIDTH +#define XTextWidth16 XTEXTWIDTH16 +#define XTranslateCoordinates XTRANSLATECOORDINATES +#define XUndefineCursor XUNDEFINECURSOR +#define XUngrabButton XUNGRABBUTTON +#define XUngrabKeyboard XUNGRABKEYBOARD +#define XUngrabPointer XUNGRABPOINTER +#define XUngrabServer XUNGRABSERVER +#define XUninstallColormap XUNINSTALLCOLORMAP +#define XUnionRectWithRegion XUNIONRECTWITHREGION +#define XUnionRegion XUNIONREGION +#define XUniqueContext XUNIQUECONTEXT +#define XUnmapWindow XUNMAPWINDOW +#define XUnsetICFocus XUNSETICFOCUS +#define XVaCreateNestedList XVACREATENESTEDLIST +#define XVisualIDFromVisual XVISUALIDFROMVISUAL +#define XWMGeometry XWMGEOMETRY +#define XWarpPointer XWARPPOINTER +#define XWhitePixel XWHITEPIXEL +#define XWhitePixelOfScreen XWHITEPIXELOFSCREEN +#define XWidthMMOfScreen XWIDTHMMOFSCREEN +#define XWidthOfScreen XWIDTHOFSCREEN +#define XWindowEvent XWINDOWEVENT +#define XWithdrawWindow XWITHDRAWWINDOW +#define XXorRegion XXORREGION +#define XcmsQueryColor XCMSQUERYCOLOR +#define XdbeAllocateBackBufferName XDBEALLOCATEBACKBUFFERNAME +#define XdbeFreeVisualInfo XDBEFREEVISUALINFO +#define XdbeGetVisualInfo XDBEGETVISUALINFO +#define XdbeQueryExtension XDBEQUERYEXTENSION +#define XdbeSwapBuffers XDBESWAPBUFFERS +#define XextAddDisplay XEXTADDDISPLAY +#define XextFindDisplay XEXTFINDDISPLAY +#define XextRemoveDisplay XEXTREMOVEDISPLAY +#define XkbSetDetectableAutoRepeat XKBSETDETECTABLEAUTOREPEAT +#define XmActivateProtocol XMACTIVATEPROTOCOL +#define XmAddProtocolCallback XMADDPROTOCOLCALLBACK +#define XmAddProtocols XMADDPROTOCOLS +#define XmChangeColor XMCHANGECOLOR +#define XmClipboardCopy XMCLIPBOARDCOPY +#define XmClipboardCopyByName XMCLIPBOARDCOPYBYNAME +#define XmClipboardEndCopy XMCLIPBOARDENDCOPY +#define XmClipboardEndRetrieve XMCLIPBOARDENDRETRIEVE +#define XmClipboardInquireCount XMCLIPBOARDINQUIRECOUNT +#define XmClipboardInquireFormat XMCLIPBOARDINQUIREFORMAT +#define XmClipboardInquireLength XMCLIPBOARDINQUIRELENGTH +#define XmClipboardLock XMCLIPBOARDLOCK +#define XmClipboardRetrieve XMCLIPBOARDRETRIEVE +#define XmClipboardStartCopy XMCLIPBOARDSTARTCOPY +#define XmClipboardStartRetrieve XMCLIPBOARDSTARTRETRIEVE +#define XmClipboardUnlock XMCLIPBOARDUNLOCK +#define XmCommandError XMCOMMANDERROR +#define XmCommandGetChild XMCOMMANDGETCHILD +#define XmCommandSetValue XMCOMMANDSETVALUE +#define XmCreateArrowButton XMCREATEARROWBUTTON +#define XmCreateArrowButtonGadget XMCREATEARROWBUTTONGADGET +#define XmCreateBulletinBoardDialog XMCREATEBULLETINBOARDDIALOG +#define XmCreateCascadeButton XMCREATECASCADEBUTTON +#define XmCreateCascadeButtonGadget XMCREATECASCADEBUTTONGADGET +#define XmCreateDialogShell XMCREATEDIALOGSHELL +#define XmCreateDragIcon XMCREATEDRAGICON +#define XmCreateDrawingArea XMCREATEDRAWINGAREA +#define XmCreateDrawnButton XMCREATEDRAWNBUTTON +#define XmCreateErrorDialog XMCREATEERRORDIALOG +#define XmCreateFileSelectionBox XMCREATEFILESELECTIONBOX +#define XmCreateFileSelectionDialog XMCREATEFILESELECTIONDIALOG +#define XmCreateForm XMCREATEFORM +#define XmCreateFormDialog XMCREATEFORMDIALOG +#define XmCreateFrame XMCREATEFRAME +#define XmCreateInformationDialog XMCREATEINFORMATIONDIALOG +#define XmCreateLabel XMCREATELABEL +#define XmCreateLabelGadget XMCREATELABELGADGET +#define XmCreateList XMCREATELIST +#define XmCreateMainWindow XMCREATEMAINWINDOW +#define XmCreateMenuBar XMCREATEMENUBAR +#define XmCreateMessageBox XMCREATEMESSAGEBOX +#define XmCreateMessageDialog XMCREATEMESSAGEDIALOG +#define XmCreateOptionMenu XMCREATEOPTIONMENU +#define XmCreatePanedWindow XMCREATEPANEDWINDOW +#define XmCreatePopupMenu XMCREATEPOPUPMENU +#define XmCreatePromptDialog XMCREATEPROMPTDIALOG +#define XmCreatePulldownMenu XMCREATEPULLDOWNMENU +#define XmCreatePushButton XMCREATEPUSHBUTTON +#define XmCreatePushButtonGadget XMCREATEPUSHBUTTONGADGET +#define XmCreateQuestionDialog XMCREATEQUESTIONDIALOG +#define XmCreateRadioBox XMCREATERADIOBOX +#define XmCreateRowColumn XMCREATEROWCOLUMN +#define XmCreateScale XMCREATESCALE +#define XmCreateScrollBar XMCREATESCROLLBAR +#define XmCreateScrolledList XMCREATESCROLLEDLIST +#define XmCreateScrolledText XMCREATESCROLLEDTEXT +#define XmCreateScrolledWindow XMCREATESCROLLEDWINDOW +#define XmCreateSelectionDialog XMCREATESELECTIONDIALOG +#define XmCreateSeparator XMCREATESEPARATOR +#define XmCreateSeparatorGadget XMCREATESEPARATORGADGET +#define XmCreateTemplateDialog XMCREATETEMPLATEDIALOG +#define XmCreateText XMCREATETEXT +#define XmCreateTextField XMCREATETEXTFIELD +#define XmCreateToggleButton XMCREATETOGGLEBUTTON +#define XmCreateToggleButtonGadget XMCREATETOGGLEBUTTONGADGET +#define XmCreateWarningDialog XMCREATEWARNINGDIALOG +#define XmCvtCTToXmString XMCVTCTTOXMSTRING +#define XmDestroyPixmap XMDESTROYPIXMAP +#define XmDragStart XMDRAGSTART +#define XmDropSiteRegister XMDROPSITEREGISTER +#define XmDropSiteUnregister XMDROPSITEUNREGISTER +#define XmDropSiteUpdate XMDROPSITEUPDATE +#define XmDropTransferStart XMDROPTRANSFERSTART +#define XmFileSelectionBoxGetChild XMFILESELECTIONBOXGETCHILD +#define XmFileSelectionDoSearch XMFILESELECTIONDOSEARCH +#define XmFontListAppendEntry XMFONTLISTAPPENDENTRY +#define XmFontListCopy XMFONTLISTCOPY +#define XmFontListCreate XMFONTLISTCREATE +#define XmFontListEntryCreate XMFONTLISTENTRYCREATE +#define XmFontListEntryFree XMFONTLISTENTRYFREE +#define XmFontListEntryGetFont XMFONTLISTENTRYGETFONT +#define XmFontListEntryGetTag XMFONTLISTENTRYGETTAG +#define XmFontListEntryLoad XMFONTLISTENTRYLOAD +#define XmFontListFree XMFONTLISTFREE +#define XmFontListFreeFontContext XMFONTLISTFREEFONTCONTEXT +#define XmFontListGetNextFont XMFONTLISTGETNEXTFONT +#define XmFontListInitFontContext XMFONTLISTINITFONTCONTEXT +#define XmFontListNextEntry XMFONTLISTNEXTENTRY +#define XmGetColors XMGETCOLORS +#define XmGetColorCalculation XMGETCOLORCALCULATION +#define XmGetFocusWidget XMGETFOCUSWIDGET +#define XmGetMenuCursor XMGETMENUCURSOR +#define XmGetPixmap XMGETPIXMAP +#define XmGetPixmapByDepth XMGETPIXMAPBYDEPTH +#define XmGetTearOffControl XMGETTEAROFFCONTROL +#define XmGetXmDisplay XMGETXMDISPLAY +#define XmImMbLookupString XMIMMBLOOKUPSTRING +#define XmImRegister XMIMREGISTER +#define XmImSetFocusValues XMIMSETFOCUSVALUES +#define XmImSetValues XMIMSETVALUES +#define XmImUnregister XMIMUNREGISTER +#define XmImUnsetFocus XMIMUNSETFOCUS +#define XmInstallImage XMINSTALLIMAGE +#define XmInternAtom XMINTERNATOM +#define XmIsMotifWMRunning XMISMOTIFWMRUNNING +#define XmListAddItem XMLISTADDITEM +#define XmListAddItemUnselected XMLISTADDITEMUNSELECTED +#define XmListAddItems XMLISTADDITEMS +#define XmListAddItemsUnselected XMLISTADDITEMSUNSELECTED +#define XmListDeleteAllItems XMLISTDELETEALLITEMS +#define XmListDeleteItem XMLISTDELETEITEM +#define XmListDeleteItemsPos XMLISTDELETEITEMSPOS +#define XmListDeletePos XMLISTDELETEPOS +#define XmListDeselectAllItems XMLISTDESELECTALLITEMS +#define XmListDeselectPos XMLISTDESELECTPOS +#define XmListGetKbdItemPos XMLISTGETKBDITEMPOS +#define XmListGetMatchPos XMLISTGETMATCHPOS +#define XmListGetSelectedPos XMLISTGETSELECTEDPOS +#define XmListItemExists XMLISTITEMEXISTS +#define XmListItemPos XMLISTITEMPOS +#define XmListPosSelected XMLISTPOSSELECTED +#define XmListReplaceItems XMLISTREPLACEITEMS +#define XmListReplaceItemsPos XMLISTREPLACEITEMSPOS +#define XmListSelectItem XMLISTSELECTITEM +#define XmListSelectPos XMLISTSELECTPOS +#define XmListSetBottomPos XMLISTSETBOTTOMPOS +#define XmListSetItem XMLISTSETITEM +#define XmListSetKbdItemPos XMLISTSETKBDITEMPOS +#define XmListSetPos XMLISTSETPOS +#define XmMainWindowSetAreas XMMAINWINDOWSETAREAS +#define XmMenuPosition XMMENUPOSITION +#define XmMessageBoxGetChild XMMESSAGEBOXGETCHILD +#define XmOptionButtonGadget XMOPTIONBUTTONGADGET +#define XmOptionLabelGadget XMOPTIONLABELGADGET +#define XmProcessTraversal XMPROCESSTRAVERSAL +#define XmQmotif XMQMOTIF +#define XmRemoveProtocolCallback XMREMOVEPROTOCOLCALLBACK +#define XmRemoveProtocols XMREMOVEPROTOCOLS +#define XmRemoveTabGroup XMREMOVETABGROUP +#define XmRepTypeGetId XMREPTYPEGETID +#define XmRepTypeGetRecord XMREPTYPEGETRECORD +#define XmRepTypeInstallTearOffModelCon XMREPTYPEINSTALLTEAROFFMODELCON +#define XmRepTypeRegister XMREPTYPEREGISTER +#define XmRepTypeValidValue XMREPTYPEVALIDVALUE +#define XmScrollBarGetValues XMSCROLLBARGETVALUES +#define XmScrollBarSetValues XMSCROLLBARSETVALUES +#define XmScrolledWindowSetAreas XMSCROLLEDWINDOWSETAREAS +#define XmSelectionBoxGetChild XMSELECTIONBOXGETCHILD +#define XmSetColorCalculation XMSETCOLORCALCULATION +#define XmStringByteCompare XMSTRINGBYTECOMPARE +#define XmStringCompare XMSTRINGCOMPARE +#define XmStringConcat XMSTRINGCONCAT +#define XmStringCopy XMSTRINGCOPY +#define XmStringCreate XMSTRINGCREATE +#define XmStringCreateLocalized XMSTRINGCREATELOCALIZED +#define XmStringCreateLtoR XMSTRINGCREATELTOR +#define XmStringCreateSimple XMSTRINGCREATESIMPLE +#define XmStringDraw XMSTRINGDRAW +#define XmStringDrawUnderline XMSTRINGDRAWUNDERLINE +#define XmStringExtent XMSTRINGEXTENT +#define XmStringFree XMSTRINGFREE +#define XmStringFreeContext XMSTRINGFREECONTEXT +#define XmStringGetLtoR XMSTRINGGETLTOR +#define XmStringGetNextComponent XMSTRINGGETNEXTCOMPONENT +#define XmStringGetNextSegment XMSTRINGGETNEXTSEGMENT +#define XmStringInitContext XMSTRINGINITCONTEXT +#define XmStringLength XMSTRINGLENGTH +#define XmStringLtoRCreate XMSTRINGLTORCREATE +#define XmStringNConcat XMSTRINGNCONCAT +#define XmStringSegmentCreate XMSTRINGSEGMENTCREATE +#define XmStringSeparatorCreate XMSTRINGSEPARATORCREATE +#define XmStringWidth XMSTRINGWIDTH +#define XmTextClearSelection XMTEXTCLEARSELECTION +#define XmTextCopy XMTEXTCOPY +#define XmTextCut XMTEXTCUT +#define XmTextFieldClearSelection XMTEXTFIELDCLEARSELECTION +#define XmTextFieldCopy XMTEXTFIELDCOPY +#define XmTextFieldCut XMTEXTFIELDCUT +#define XmTextFieldGetEditable XMTEXTFIELDGETEDITABLE +#define XmTextFieldGetInsertionPosition XMTEXTFIELDGETINSERTIONPOSITION +#define XmTextFieldGetLastPosition XMTEXTFIELDGETLASTPOSITION +#define XmTextFieldGetMaxLength XMTEXTFIELDGETMAXLENGTH +#define XmTextFieldGetSelection XMTEXTFIELDGETSELECTION +#define XmTextFieldGetSelectionPosition XMTEXTFIELDGETSELECTIONPOSITION +#define XmTextFieldGetString XMTEXTFIELDGETSTRING +#define XmTextFieldInsert XMTEXTFIELDINSERT +#define XmTextFieldPaste XMTEXTFIELDPASTE +#define XmTextFieldRemove XMTEXTFIELDREMOVE +#define XmTextFieldReplace XMTEXTFIELDREPLACE +#define XmTextFieldSetAddMode XMTEXTFIELDSETADDMODE +#define XmTextFieldSetHighlight XMTEXTFIELDSETHIGHLIGHT +#define XmTextFieldSetInsertionPosition XMTEXTFIELDSETINSERTIONPOSITION +#define XmTextFieldSetMaxLength XMTEXTFIELDSETMAXLENGTH +#define XmTextFieldSetSelection XMTEXTFIELDSETSELECTION +#define XmTextFieldSetString XMTEXTFIELDSETSTRING +#define XmTextFieldShowPosition XMTEXTFIELDSHOWPOSITION +#define XmTextGetCursorPosition XMTEXTGETCURSORPOSITION +#define XmTextGetEditable XMTEXTGETEDITABLE +#define XmTextGetInsertionPosition XMTEXTGETINSERTIONPOSITION +#define XmTextGetLastPosition XMTEXTGETLASTPOSITION +#define XmTextGetMaxLength XMTEXTGETMAXLENGTH +#define XmTextGetSelection XMTEXTGETSELECTION +#define XmTextGetSelectionPosition XMTEXTGETSELECTIONPOSITION +#define XmTextGetString XMTEXTGETSTRING +#define XmTextInsert XMTEXTINSERT +#define XmTextPaste XMTEXTPASTE +#define XmTextPosToXY XMTEXTPOSTOXY +#define XmTextRemove XMTEXTREMOVE +#define XmTextReplace XMTEXTREPLACE +#define XmTextSetCursorPosition XMTEXTSETCURSORPOSITION +#define XmTextSetEditable XMTEXTSETEDITABLE +#define XmTextSetHighlight XMTEXTSETHIGHLIGHT +#define XmTextSetInsertionPosition XMTEXTSETINSERTIONPOSITION +#define XmTextSetSelection XMTEXTSETSELECTION +#define XmTextSetString XMTEXTSETSTRING +#define XmTextSetTopCharacter XMTEXTSETTOPCHARACTER +#define XmTextShowPosition XMTEXTSHOWPOSITION +#define XmToggleButtonGadgetGetState XMTOGGLEBUTTONGADGETGETSTATE +#define XmToggleButtonGadgetSetState XMTOGGLEBUTTONGADGETSETSTATE +#define XmToggleButtonGetState XMTOGGLEBUTTONGETSTATE +#define XmToggleButtonSetState XMTOGGLEBUTTONSETSTATE +#define XmUninstallImage XMUNINSTALLIMAGE +#define XmUpdateDisplay XMUPDATEDISPLAY +#define XmVaCreateSimpleRadioBox XMVACREATESIMPLERADIOBOX +#define XmbDrawString XMBDRAWSTRING +#define XmbLookupString XMBLOOKUPSTRING +#define XmbResetIC XMBRESETIC +#define XmbSetWMProperties XMBSETWMPROPERTIES +#define XmbTextEscapement XMBTEXTESCAPEMENT +#define XmbTextExtents XMBTEXTEXTENTS +#define XmbTextListToTextProperty XMBTEXTLISTTOTEXTPROPERTY +#define XmbTextPropertyToTextList XMBTEXTPROPERTYTOTEXTLIST +#define XmbufCreateBuffers XMBUFCREATEBUFFERS +#define XmbufDestroyBuffers XMBUFDESTROYBUFFERS +#define XmbufDisplayBuffers XMBUFDISPLAYBUFFERS +#define XmbufQueryExtension XMBUFQUERYEXTENSION +#define Xmemory_free XMEMORY_FREE +#define Xmemory_malloc XMEMORY_MALLOC +#define XmuClientWindow XMUCLIENTWINDOW +#define XmuConvertStandardSelection XMUCONVERTSTANDARDSELECTION +#define XmuCvtStringToBitmap XMUCVTSTRINGTOBITMAP +#define XmuInternAtom XMUINTERNATOM +#define XmuInternStrings XMUINTERNSTRINGS +#define XmuLookupStandardColormap XMULOOKUPSTANDARDCOLORMAP +#define XmuPrintDefaultErrorMessage XMUPRINTDEFAULTERRORMESSAGE +#define XrmCombineDatabase XRMCOMBINEDATABASE +#define XrmCombineFileDatabase XRMCOMBINEFILEDATABASE +#define XrmDestroyDatabase XRMDESTROYDATABASE +#define XrmGetDatabase XRMGETDATABASE +#define XrmGetFileDatabase XRMGETFILEDATABASE +#define XrmGetResource XRMGETRESOURCE +#define XrmGetStringDatabase XRMGETSTRINGDATABASE +#define XrmInitialize XRMINITIALIZE +#define XrmMergeDatabases XRMMERGEDATABASES +#define XrmParseCommand XRMPARSECOMMAND +#define XrmPermStringToQuark XRMPERMSTRINGTOQUARK +#define XrmPutFileDatabase XRMPUTFILEDATABASE +#define XrmPutLineResource XRMPUTLINERESOURCE +#define XrmPutStringResource XRMPUTSTRINGRESOURCE +#define XrmQGetResource XRMQGETRESOURCE +#define XrmQPutStringResource XRMQPUTSTRINGRESOURCE +#define XrmQuarkToString XRMQUARKTOSTRING +#define XrmSetDatabase XRMSETDATABASE +#define XrmStringToBindingQuarkList XRMSTRINGTOBINDINGQUARKLIST +#define XrmStringToQuark XRMSTRINGTOQUARK +#define XtAddCallback XTADDCALLBACK +#define XtAddCallbacks XTADDCALLBACKS +#define XtAddConverter XTADDCONVERTER +#define XtAddEventHandler XTADDEVENTHANDLER +#define XtAddExposureToRegion XTADDEXPOSURETOREGION +#define XtAddGrab XTADDGRAB +#define XtAddRawEventHandler XTADDRAWEVENTHANDLER +#define XtAllocateGC XTALLOCATEGC +#define XtAppAddActions XTAPPADDACTIONS +#define XtAppAddInput XTAPPADDINPUT +#define XtAppAddTimeOut XTAPPADDTIMEOUT +#define XtAppAddWorkProc XTAPPADDWORKPROC +#define XtAppCreateShell XTAPPCREATESHELL +#define XtAppError XTAPPERROR +#define XtAppErrorMsg XTAPPERRORMSG +#define XtAppInitialize XTAPPINITIALIZE +#define XtAppMainLoop XTAPPMAINLOOP +#define XtAppNextEvent XTAPPNEXTEVENT +#define XtAppPeekEvent XTAPPPEEKEVENT +#define XtAppPending XTAPPPENDING +#define XtAppProcessEvent XTAPPPROCESSEVENT +#define XtAppSetErrorHandler XTAPPSETERRORHANDLER +#define XtAppSetFallbackResources XTAPPSETFALLBACKRESOURCES +#define XtAppSetTypeConverter XTAPPSETTYPECONVERTER +#define XtAppSetWarningHandler XTAPPSETWARNINGHANDLER +#define XtAppWarningMsg XTAPPWARNINGMSG +#define XtAppSetWarningMsgHandler XTAPPSETWARNINGMSGHANDLER +#define XtAppWarning XTAPPWARNING +#define XtAugmentTranslations XTAUGMENTTRANSLATIONS +#define XtCallActionProc XTCALLACTIONPROC +#define XtCallCallbackList XTCALLCALLBACKLIST +#define XtCallCallbacks XTCALLCALLBACKS +#define XtCallConverter XTCALLCONVERTER +#define XtCalloc XTCALLOC +#ifndef NOXTDISPLAY +#define XtClass XTCLASS +#endif +#define XtCloseDisplay XTCLOSEDISPLAY +#define XtConfigureWidget XTCONFIGUREWIDGET +#define XtConvert XTCONVERT +#define XtConvertAndStore XTCONVERTANDSTORE +#define XtCreateApplicationContext XTCREATEAPPLICATIONCONTEXT +#define XtCreateManagedWidget XTCREATEMANAGEDWIDGET +#define XtCreatePopupShell XTCREATEPOPUPSHELL +#define XtCreateWidget XTCREATEWIDGET +#define XtCreateWindow XTCREATEWINDOW +#define XtCvtStringToFont XTCVTSTRINGTOFONT +#define XtDatabase XTDATABASE +#define XtDestroyApplicationContext XTDESTROYAPPLICATIONCONTEXT +#define XtDestroyWidget XTDESTROYWIDGET +#define XtDisownSelection XTDISOWNSELECTION +#define XtDispatchEvent XTDISPATCHEVENT +#ifndef NOXTDISPLAY +#define XtDisplay XTDISPLAY +#endif +#define XtDisplayOfObject XTDISPLAYOFOBJECT +#define XtDisplayStringConvWarning XTDISPLAYSTRINGCONVWARNING +#define XtDisplayToApplicationContext XTDISPLAYTOAPPLICATIONCONTEXT +#define XtError XTERROR +#define XtErrorMsg XTERRORMSG +#define XtFree XTFREE +#define XtGetActionKeysym XTGETACTIONKEYSYM +#define XtGetActionList XTGETACTIONLIST +#define XtGetApplicationNameAndClass XTGETAPPLICATIONNAMEANDCLASS +#define XtGetApplicationResources XTGETAPPLICATIONRESOURCES +#define XtGetClassExtension XTGETCLASSEXTENSION +#define XtGetConstraintResourceList XTGETCONSTRAINTRESOURCELIST +#define XtGetGC XTGETGC +#define XtGetMultiClickTime XTGETMULTICLICKTIME +#define XtGetResourceList XTGETRESOURCELIST +#define XtGetSelectionValue XTGETSELECTIONVALUE +#define XtGetSelectionValues XTGETSELECTIONVALUES +#define XtGetSubresources XTGETSUBRESOURCES +#define XtGetValues XTGETVALUES +#define XtGrabButton XTGRABBUTTON +#define XtGrabKeyboard XTGRABKEYBOARD +#define XtGrabPointer XTGRABPOINTER +#define XtHasCallbacks XTHASCALLBACKS +#define XtInitialize XTINITIALIZE +#define XtInitializeWidgetClass XTINITIALIZEWIDGETCLASS +#define XtInsertEventHandler XTINSERTEVENTHANDLER +#define XtInsertRawEventHandler XTINSERTRAWEVENTHANDLER +#define XtInstallAccelerators XTINSTALLACCELERATORS +#define XtIsManaged XTISMANAGED +#define XtIsObject XTISOBJECT +#ifndef NOXTDISPLAY +#define XtIsRealized XTISREALIZED +#endif +#define XtIsSensitive XTISSENSITIVE +#define XtIsSubclass XTISSUBCLASS +#define XtLastTimestampProcessed XTLASTTIMESTAMPPROCESSED +#define XtMainLoop XTMAINLOOP +#define XtMakeGeometryRequest XTMAKEGEOMETRYREQUEST +#define XtMakeResizeRequest XTMAKERESIZEREQUEST +#define XtMalloc XTMALLOC +#define XtManageChild XTMANAGECHILD +#define XtManageChildren XTMANAGECHILDREN +#define XtMergeArgLists XTMERGEARGLISTS +#define XtMoveWidget XTMOVEWIDGET +#define XtName XTNAME +#define XtNameToWidget XTNAMETOWIDGET +#define XtOpenApplication XTOPENAPPLICATION +#define XtOpenDisplay XTOPENDISPLAY +#define XtOverrideTranslations XTOVERRIDETRANSLATIONS +#define XtOwnSelection XTOWNSELECTION +#ifndef NOXTDISPLAY +#define XtParent XTPARENT +#endif +#define XtParseAcceleratorTable XTPARSEACCELERATORTABLE +#define XtParseTranslationTable XTPARSETRANSLATIONTABLE +#define XtPopdown XTPOPDOWN +#define XtPopup XTPOPUP +#define XtPopupSpringLoaded XTPOPUPSPRINGLOADED +#define XtQueryGeometry XTQUERYGEOMETRY +#define XtRealizeWidget XTREALIZEWIDGET +#define XtRealloc XTREALLOC +#define XtRegisterDrawable _XTREGISTERWINDOW +#define XtRegisterGrabAction XTREGISTERGRABACTION +#define XtReleaseGC XTRELEASEGC +#define XtRemoveAllCallbacks XTREMOVEALLCALLBACKS +#define XtRemoveCallback XTREMOVECALLBACK +#define XtRemoveEventHandler XTREMOVEEVENTHANDLER +#define XtRemoveGrab XTREMOVEGRAB +#define XtRemoveInput XTREMOVEINPUT +#define XtRemoveTimeOut XTREMOVETIMEOUT +#define XtRemoveWorkProc XTREMOVEWORKPROC +#define XtResizeWidget XTRESIZEWIDGET +#define XtResolvePathname XTRESOLVEPATHNAME +#ifndef NOXTDISPLAY +#define XtScreen XTSCREEN +#endif +#define XtScreenDatabase XTSCREENDATABASE +#define XtScreenOfObject XTSCREENOFOBJECT +#define XtSessionReturnToken XTSESSIONRETURNTOKEN +#define XtSetErrorHandler XTSETERRORHANDLER +#define XtSetKeyboardFocus XTSETKEYBOARDFOCUS +#define XtSetLanguageProc XTSETLANGUAGEPROC +#define XtSetMappedWhenManaged XTSETMAPPEDWHENMANAGED +#define XtSetSensitive XTSETSENSITIVE +#define XtSetTypeConverter XTSETTYPECONVERTER +#define XtSetValues XTSETVALUES +#define XtShellStrings XTSHELLSTRINGS +#define XtStringConversionWarning XTSTRINGCONVERSIONWARNING +#define XtStrings XTSTRINGS +#define XtToolkitInitialize XTTOOLKITINITIALIZE +#define XtTranslateCoords XTTRANSLATECOORDS +#define XtTranslateKeycode XTTRANSLATEKEYCODE +#define XtUngrabButton XTUNGRABBUTTON +#define XtUngrabKeyboard XTUNGRABKEYBOARD +#define XtUngrabPointer XTUNGRABPOINTER +#define XtUnmanageChild XTUNMANAGECHILD +#define XtUnmanageChildren XTUNMANAGECHILDREN +#define XtUnrealizeWidget XTUNREALIZEWIDGET +#define XtUnregisterDrawable _XTUNREGISTERWINDOW +#define XtVaCreateManagedWidget XTVACREATEMANAGEDWIDGET +#define XtVaCreatePopupShell XTVACREATEPOPUPSHELL +#define XtVaCreateWidget XTVACREATEWIDGET +#define XtVaGetApplicationResources XTVAGETAPPLICATIONRESOURCES +#define XtVaGetValues XTVAGETVALUES +#define XtVaSetValues XTVASETVALUES +#define XtWarning XTWARNING +#define XtWarningMsg XTWARNINGMSG +#define XtWidgetToApplicationContext XTWIDGETTOAPPLICATIONCONTEXT +#ifndef NOXTDISPLAY +#define XtWindow XTWINDOW +#endif +#define XtWindowOfObject XTWINDOWOFOBJECT +#define XtWindowToWidget XTWINDOWTOWIDGET +#define XwcDrawImageString XWCDRAWIMAGESTRING +#define XwcDrawString XWCDRAWSTRING +#define XwcFreeStringList XWCFREESTRINGLIST +#define XwcTextEscapement XWCTEXTESCAPEMENT +#define XwcTextExtents XWCTEXTEXTENTS +#define XwcTextListToTextProperty XWCTEXTLISTTOTEXTPROPERTY +#define XwcLookupString XWCLOOKUPSTRING +#define XwcTextPropertyToTextList XWCTEXTPROPERTYTOTEXTLIST +#define _XAllocTemp _XALLOCTEMP +#define _XDeqAsyncHandler _XDEQASYNCHANDLER +#define _XEatData _XEATDATA +#define _XFlush _XFLUSH +#define _XFreeTemp _XFREETEMP +#define _XGetAsyncReply _XGETASYNCREPLY +#define _XInitImageFuncPtrs _XINITIMAGEFUNCPTRS +#define _XRead _XREAD +#define _XReadPad _XREADPAD +#define _XRegisterFilterByType _XREGISTERFILTERBYTYPE +#define _XReply _XREPLY +#define _XSend _XSEND +#define _XUnregisterFilter _XUNREGISTERFILTER +#define _XVIDtoVisual _XVIDTOVISUAL +#define _XmBottomShadowColorDefault _XMBOTTOMSHADOWCOLORDEFAULT +#define _XmClearBorder _XMCLEARBORDER +#define _XmConfigureObject _XMCONFIGUREOBJECT +#define _XmDestroyParentCallback _XMDESTROYPARENTCALLBACK +#define _XmDrawArrow _XMDRAWARROW +#define _XmDrawShadows _XMDRAWSHADOWS +#define _XmFontListGetDefaultFont _XMFONTLISTGETDEFAULTFONT +#define _XmFromHorizontalPixels _XMFROMHORIZONTALPIXELS +#define _XmFromVerticalPixels _XMFROMVERTICALPIXELS +#define _XmGetClassExtensionPtr _XMGETCLASSEXTENSIONPTR +#define _XmGetDefaultFontList _XMGETDEFAULTFONTLIST +#define _XmGetTextualDragIcon _XMGETTEXTUALDRAGICON +#define _XmGetWidgetExtData _XMGETWIDGETEXTDATA +#define _XmGrabKeyboard _XMGRABKEYBOARD +#define _XmGrabPointer _XMGRABPOINTER +#define _XmInheritClass _XMINHERITCLASS +#define _XmInputForGadget _XMINPUTFORGADGET +#define _XmInputInGadget _XMINPUTINGADGET +#define _XmMakeGeometryRequest _XMMAKEGEOMETRYREQUEST +#define _XmMenuPopDown _XMMENUPOPDOWN +#define _XmMoveObject _XMMOVEOBJECT +#define _XmNavigChangeManaged _XMNAVIGCHANGEMANAGED +#define _XmOSBuildFileList _XMOSBUILDFILELIST +#define _XmOSFileCompare _XMOSFILECOMPARE +#define _XmOSFindPatternPart _XMOSFINDPATTERNPART +#define _XmOSQualifyFileSpec _XMOSQUALIFYFILESPEC +#define _XmPostPopupMenu _XMPOSTPOPUPMENU +#define _XmPrimitiveEnter _XMPRIMITIVEENTER +#define _XmPrimitiveLeave _XMPRIMITIVELEAVE +#define _XmRedisplayGadgets _XMREDISPLAYGADGETS +#define _XmShellIsExclusive _XMSHELLISEXCLUSIVE +#define _XmStringDraw _XMSTRINGDRAW +#define _XmStringGetTextConcat _XMSTRINGGETTEXTCONCAT +#define _XmStrings _XMSTRINGS +#define _XmToHorizontalPixels _XMTOHORIZONTALPIXELS +#define _XmToVerticalPixels _XMTOVERTICALPIXELS +#define _XmTopShadowColorDefault _XMTOPSHADOWCOLORDEFAULT +#define _Xm_fastPtr _XM_FASTPTR +#define _XtCheckSubclassFlag _XTCHECKSUBCLASSFLAG +#define _XtCopyFromArg _XTCOPYFROMARG +#define _XtCountVaList _XTCOUNTVALIST +#define _XtInherit _XTINHERIT +#define _XtInheritTranslations _XTINHERITTRANSLATIONS +#define _XtIsSubclassOf _XTISSUBCLASSOF +#define _XtVaToArgList _XTVATOARGLIST +#define applicationShellWidgetClass APPLICATIONSHELLWIDGETCLASS +#define cli$dcl_parse CLI$DCL_PARSE +#define cli$get_value CLI$GET_VALUE +#define cli$present CLI$PRESENT +#define compositeClassRec COMPOSITECLASSREC +#define compositeWidgetClass COMPOSITEWIDGETCLASS +#define constraintClassRec CONSTRAINTCLASSREC +#define constraintWidgetClass CONSTRAINTWIDGETCLASS +#define coreWidgetClass COREWIDGETCLASS +#define exe$getspi EXE$GETSPI +#define lbr$close LBR$CLOSE +#define lbr$get_header LBR$GET_HEADER +#define lbr$get_index LBR$GET_INDEX +#define lbr$get_record LBR$GET_RECORD +#define lbr$ini_control LBR$INI_CONTROL +#define lbr$lookup_key LBR$LOOKUP_KEY +#define lbr$open LBR$OPEN +#define lbr$output_help LBR$OUTPUT_HELP +#define lib$add_times LIB$ADD_TIMES +#define lib$addx LIB$ADDX +#define lib$create_dir LIB$CREATE_DIR +#define lib$create_vm_zone LIB$CREATE_VM_ZONE +#define lib$cvt_from_internal_time LIB$CVT_FROM_INTERNAL_TIME +#define lib$cvt_htb LIB$CVT_HTB +#define lib$cvt_vectim LIB$CVT_VECTIM +#define lib$day LIB$DAY +#define lib$day_of_week LIB$DAY_OF_WEEK +#define lib$delete_symbol LIB$DELETE_SYMBOL +#define lib$delete_vm_zone LIB$DELETE_VM_ZONE +#define lib$disable_ctrl LIB$DISABLE_CTRL +#define lib$ediv LIB$EDIV +#define lib$emul LIB$EMUL +#define lib$enable_ctrl LIB$ENABLE_CTRL +#define lib$find_vm_zone LIB$FIND_VM_ZONE +#define lib$format_date_time LIB$FORMAT_DATE_TIME +#define lib$free_timer LIB$FREE_TIMER +#define lib$free_vm LIB$FREE_VM +#define lib$get_ef LIB$GET_EF +#define lib$get_foreign LIB$GET_FOREIGN +#define lib$get_input LIB$GET_INPUT +#define lib$get_users_language LIB$GET_USERS_LANGUAGE +#define lib$get_vm LIB$GET_VM +#define lib$get_symbol LIB$GET_SYMBOL +#define lib$getdvi LIB$GETDVI +#define lib$init_date_time_context LIB$INIT_DATE_TIME_CONTEXT +#define lib$init_timer LIB$INIT_TIMER +#define lib$find_file LIB$FIND_FILE +#define lib$find_file_end LIB$FIND_FILE_END +#define lib$find_image_symbol LIB$FIND_IMAGE_SYMBOL +#define lib$mult_delta_time LIB$MULT_DELTA_TIME +#define lib$put_output LIB$PUT_OUTPUT +#define lib$rename_file LIB$RENAME_FILE +#define lib$reset_vm_zone LIB$RESET_VM_ZONE +#define lib$set_symbol LIB$SET_SYMBOL +#define lib$sfree1_dd LIB$SFREE1_DD +#define lib$show_vm LIB$SHOW_VM +#define lib$show_vm_zone LIB$SHOW_VM_ZONE +#define lib$spawn LIB$SPAWN +#define lib$stat_timer LIB$STAT_TIMER +#define lib$subx LIB$SUBX +#define lib$sub_times LIB$SUB_TIMES +#define lib$wait LIB$WAIT +#define mail$send_add_address MAIL$SEND_ADD_ADDRESS +#define mail$send_add_attribute MAIL$SEND_ADD_ATTRIBUTE +#define mail$send_add_bodypart MAIL$SEND_ADD_BODYPART +#define mail$send_begin MAIL$SEND_BEGIN +#define mail$send_end MAIL$SEND_END +#define mail$send_message MAIL$SEND_MESSAGE +#define ncs$convert NCS$CONVERT +#define ncs$get_cf NCS$GET_CF +#define objectClass OBJECTCLASS +#define objectClassRec OBJECTCLASSREC +#define overrideShellClassRec OVERRIDESHELLCLASSREC +#define overrideShellWidgetClass OVERRIDESHELLWIDGETCLASS +#define pthread_attr_create PTHREAD_ATTR_CREATE +#define pthread_attr_delete PTHREAD_ATTR_DELETE +#define pthread_attr_destroy PTHREAD_ATTR_DESTROY +#define pthread_attr_getdetach_np PTHREAD_ATTR_GETDETACH_NP +#define pthread_attr_getguardsize_np PTHREAD_ATTR_GETGUARDSIZE_NP +#define pthread_attr_getinheritsched PTHREAD_ATTR_GETINHERITSCHED +#define pthread_attr_getprio PTHREAD_ATTR_GETPRIO +#define pthread_attr_getsched PTHREAD_ATTR_GETSCHED +#define pthread_attr_getschedparam PTHREAD_ATTR_GETSCHEDPARAM +#define pthread_attr_getschedpolicy PTHREAD_ATTR_GETSCHEDPOLICY +#define pthread_attr_getstacksize PTHREAD_ATTR_GETSTACKSIZE +#define pthread_attr_init PTHREAD_ATTR_INIT +#define pthread_attr_setdetach_np PTHREAD_ATTR_SETDETACH_NP +#define pthread_attr_setdetachstate PTHREAD_ATTR_SETDETACHSTATE +#define pthread_attr_setguardsize_np PTHREAD_ATTR_SETGUARDSIZE_NP +#define pthread_attr_setinheritsched PTHREAD_ATTR_SETINHERITSCHED +#define pthread_attr_setprio PTHREAD_ATTR_SETPRIO +#define pthread_attr_setsched PTHREAD_ATTR_SETSCHED +#define pthread_attr_setschedparam PTHREAD_ATTR_SETSCHEDPARAM +#define pthread_attr_setschedpolicy PTHREAD_ATTR_SETSCHEDPOLICY +#ifndef pthread_attr_setscope +# define pthread_attr_setscope PTHREAD_ATTR_SETSCOPE +#endif +#define pthread_attr_setstacksize PTHREAD_ATTR_SETSTACKSIZE +#define pthread_cancel PTHREAD_CANCEL +#define pthread_cancel_e PTHREAD_CANCEL_E +#define pthread_cond_broadcast PTHREAD_COND_BROADCAST +#define pthread_cond_destroy PTHREAD_COND_DESTROY +#define pthread_cond_init PTHREAD_COND_INIT +#define pthread_cond_sig_preempt_int_np PTHREAD_COND_SIG_PREEMPT_INT_NP +#define pthread_cond_signal PTHREAD_COND_SIGNAL +#define pthread_cond_signal_int_np PTHREAD_COND_SIGNAL_INT_NP +#define pthread_cond_timedwait PTHREAD_COND_TIMEDWAIT +#define pthread_cond_wait PTHREAD_COND_WAIT +#define pthread_condattr_create PTHREAD_CONDATTR_CREATE +#define pthread_condattr_delete PTHREAD_CONDATTR_DELETE +#define pthread_condattr_init PTHREAD_CONDATTR_INIT +#define pthread_create PTHREAD_CREATE +#define pthread_delay_np PTHREAD_DELAY_NP +#define pthread_detach PTHREAD_DETACH +#define pthread_equal PTHREAD_EQUAL +#define pthread_exc_fetch_fp_np PTHREAD_EXC_FETCH_FP_NP +#define pthread_exc_handler_np PTHREAD_EXC_HANDLER_NP +#define pthread_exc_matches_np PTHREAD_EXC_MATCHES_NP +#define pthread_exc_pop_ctx_np PTHREAD_EXC_POP_CTX_NP +#define pthread_exc_push_ctx_np PTHREAD_EXC_PUSH_CTX_NP +#define pthread_exc_raise_np PTHREAD_EXC_RAISE_NP +#define pthread_exc_savecontext_np PTHREAD_EXC_SAVECONTEXT_NP +#define pthread_exit PTHREAD_EXIT +#define pthread_get_expiration_np PTHREAD_GET_EXPIRATION_NP +#define pthread_getprio PTHREAD_GETPRIO +#define pthread_getschedparam PTHREAD_GETSCHEDPARAM +#define pthread_getscheduler PTHREAD_GETSCHEDULER +#define pthread_getspecific PTHREAD_GETSPECIFIC +#define pthread_getunique_np PTHREAD_GETUNIQUE_NP +#define pthread_join PTHREAD_JOIN +#define pthread_join32 PTHREAD_JOIN32 +#define pthread_key_create PTHREAD_KEY_CREATE +#define pthread_key_delete PTHREAD_KEY_DELETE +#define pthread_keycreate PTHREAD_KEYCREATE +#define pthread_kill PTHREAD_KILL +#define pthread_lock_global_np PTHREAD_LOCK_GLOBAL_NP +#define pthread_mutex_destroy PTHREAD_MUTEX_DESTROY +#define pthread_mutex_init PTHREAD_MUTEX_INIT +#define pthread_mutex_lock PTHREAD_MUTEX_LOCK +#define pthread_mutex_trylock PTHREAD_MUTEX_TRYLOCK +#define pthread_mutex_unlock PTHREAD_MUTEX_UNLOCK +#define pthread_mutexattr_create PTHREAD_MUTEXATTR_CREATE +#define pthread_mutexattr_delete PTHREAD_MUTEXATTR_DELETE +#define pthread_mutexattr_destroy PTHREAD_MUTEXATTR_DESTROY +#define pthread_mutexattr_getkind_np PTHREAD_MUTEXATTR_GETKIND_NP +#define pthread_mutexattr_init PTHREAD_MUTEXATTR_INIT +#define pthread_mutexattr_setkind_np PTHREAD_MUTEXATTR_SETKIND_NP +#define pthread_mutexattr_settype_np PTHREAD_MUTEXATTR_SETTYPE_NP +#define pthread_once PTHREAD_ONCE +#define pthread_resume_np PTHREAD_RESUME_NP +#define pthread_self PTHREAD_SELF +#define pthread_setasynccancel PTHREAD_SETASYNCCANCEL +#define pthread_setcancel PTHREAD_SETCANCEL +#define pthread_setcancelstate PTHREAD_SETCANCELSTATE +#define pthread_setcanceltype PTHREAD_SETCANCELTYPE +#define pthread_setprio PTHREAD_SETPRIO +#define pthread_setschedparam PTHREAD_SETSCHEDPARAM +#define pthread_setscheduler PTHREAD_SETSCHEDULER +#define pthread_setspecific PTHREAD_SETSPECIFIC +#define pthread_suspend_np PTHREAD_SUSPEND_NP +#define pthread_testcancel PTHREAD_TESTCANCEL +#define pthread_unlock_global_np PTHREAD_UNLOCK_GLOBAL_NP +#define pthread_yield PTHREAD_YIELD +#define pthread_yield_np PTHREAD_YIELD_NP +#define rectObjClass RECTOBJCLASS +#define rectObjClassRec RECTOBJCLASSREC +#define sessionShellWidgetClass SESSIONSHELLWIDGETCLASS +#define shellWidgetClass SHELLWIDGETCLASS +#define shmat SHMAT +#define shmctl SHMCTL +#define shmdt SHMDT +#define shmget SHMGET +#define smg$create_key_table SMG$CREATE_KEY_TABLE +#define smg$create_virtual_keyboard SMG$CREATE_VIRTUAL_KEYBOARD +#define smg$read_composed_line SMG$READ_COMPOSED_LINE +#define sys$add_ident SYS$ADD_IDENT +#define sys$asctoid SYS$ASCTOID +#define sys$assign SYS$ASSIGN +#define sys$bintim SYS$BINTIM +#define sys$cancel SYS$CANCEL +#define sys$cantim SYS$CANTIM +#define sys$check_access SYS$CHECK_ACCESS +#define sys$close SYS$CLOSE +#define sys$connect SYS$CONNECT +#define sys$create SYS$CREATE +#define sys$create_user_profile SYS$CREATE_USER_PROFILE +#define sys$crembx SYS$CREMBX +#define sys$creprc SYS$CREPRC +#define sys$crmpsc SYS$CRMPSC +#define sys$dassgn SYS$DASSGN +#define sys$dclast SYS$DCLAST +#define sys$dclexh SYS$DCLEXH +#define sys$delprc SYS$DELPRC +#define sys$deq SYS$DEQ +#define sys$dgblsc SYS$DGBLSC +#define sys$display SYS$DISPLAY +#define sys$enq SYS$ENQ +#define sys$enqw SYS$ENQW +#define sys$erase SYS$ERASE +#define sys$fao SYS$FAO +#define sys$faol SYS$FAOL +#define sys$find_held SYS$FIND_HELD +#define sys$finish_rdb SYS$FINISH_RDB +#define sys$flush SYS$FLUSH +#define sys$forcex SYS$FORCEX +#define sys$get SYS$GET +#define sys$get_security SYS$GET_SECURITY +#define sys$getdviw SYS$GETDVIW +#define sys$getjpi SYS$GETJPI +#define sys$getjpiw SYS$GETJPIW +#define sys$getlkiw SYS$GETLKIW +#define sys$getmsg SYS$GETMSG +#define sys$getsyi SYS$GETSYI +#define sys$getsyiw SYS$GETSYIW +#define sys$gettim SYS$GETTIM +#define sys$getuai SYS$GETUAI +#define sys$grantid SYS$GRANTID +#define sys$hash_password SYS$HASH_PASSWORD +#define sys$hiber SYS$HIBER +#define sys$mgblsc SYS$MGBLSC +#define sys$numtim SYS$NUMTIM +#define sys$open SYS$OPEN +#define sys$parse SYS$PARSE +#define sys$parse_acl SYS$PARSE_ACL +#define sys$parse_acl SYS$PARSE_ACL +#define sys$persona_assume SYS$PERSONA_ASSUME +#define sys$persona_create SYS$PERSONA_CREATE +#define sys$persona_delete SYS$PERSONA_DELETE +#define sys$process_scan SYS$PROCESS_SCAN +#define sys$put SYS$PUT +#define sys$qio SYS$QIO +#define sys$qiow SYS$QIOW +#define sys$read SYS$READ +#define sys$resched SYS$RESCHED +#define sys$rewind SYS$REWIND +#define sys$search SYS$SEARCH +#define sys$set_security SYS$SET_SECURITY +#define sys$setast SYS$SETAST +#define sys$setef SYS$SETEF +#define sys$setimr SYS$SETIMR +#define sys$setpri SYS$SETPRI +#define sys$setprn SYS$SETPRN +#define sys$setprv SYS$SETPRV +#define sys$setswm SYS$SETSWM +#define sys$setuai SYS$SETUAI +#define sys$sndopr SYS$SNDOPR +#define sys$synch SYS$SYNCH +#define sys$trnlnm SYS$TRNLNM +#define sys$update SYS$UPDATE +#define sys$wake SYS$WAKE +#define sys$write SYS$WRITE +#define topLevelShellClassRec TOPLEVELSHELLCLASSREC +#define topLevelShellWidgetClass TOPLEVELSHELLWIDGETCLASS +#define transientShellWidgetClass TRANSIENTSHELLWIDGETCLASS +#define vendorShellClassRec VENDORSHELLCLASSREC +#define vendorShellWidgetClass VENDORSHELLWIDGETCLASS +#define widgetClass WIDGETCLASS +#define widgetClassRec WIDGETCLASSREC +#define wmShellClassRec WMSHELLCLASSREC +#define wmShellWidgetClass WMSHELLWIDGETCLASS +#define x$soft_ast_lib_lock X$SOFT_AST_LIB_LOCK +#define x$soft_ast_lock_depth X$SOFT_AST_LOCK_DEPTH +#define x$soft_reenable_asts X$SOFT_REENABLE_ASTS +#define xmArrowButtonWidgetClass XMARROWBUTTONWIDGETCLASS +#define xmBulletinBoardWidgetClass XMBULLETINBOARDWIDGETCLASS +#define xmCascadeButtonClassRec XMCASCADEBUTTONCLASSREC +#define xmCascadeButtonGadgetClass XMCASCADEBUTTONGADGETCLASS +#define xmCascadeButtonWidgetClass XMCASCADEBUTTONWIDGETCLASS +#define xmCommandWidgetClass XMCOMMANDWIDGETCLASS +#define xmDialogShellWidgetClass XMDIALOGSHELLWIDGETCLASS +#define xmDrawingAreaWidgetClass XMDRAWINGAREAWIDGETCLASS +#define xmDrawnButtonWidgetClass XMDRAWNBUTTONWIDGETCLASS +#define xmFileSelectionBoxWidgetClass XMFILESELECTIONBOXWIDGETCLASS +#define xmFormWidgetClass XMFORMWIDGETCLASS +#define xmFrameWidgetClass XMFRAMEWIDGETCLASS +#define xmGadgetClass XMGADGETCLASS +#define xmLabelGadgetClass XMLABELGADGETCLASS +#define xmLabelWidgetClass XMLABELWIDGETCLASS +#define xmListWidgetClass XMLISTWIDGETCLASS +#define xmMainWindowWidgetClass XMMAINWINDOWWIDGETCLASS +#define xmManagerClassRec XMMANAGERCLASSREC +#define xmManagerWidgetClass XMMANAGERWIDGETCLASS +#define xmMenuShellWidgetClass XMMENUSHELLWIDGETCLASS +#define xmMessageBoxWidgetClass XMMESSAGEBOXWIDGETCLASS +#define xmPrimitiveClassRec XMPRIMITIVECLASSREC +#define xmPrimitiveWidgetClass XMPRIMITIVEWIDGETCLASS +#define xmPushButtonClassRec XMPUSHBUTTONCLASSREC +#define xmPushButtonGadgetClass XMPUSHBUTTONGADGETCLASS +#define xmPushButtonWidgetClass XMPUSHBUTTONWIDGETCLASS +#define xmRowColumnWidgetClass XMROWCOLUMNWIDGETCLASS +#define xmSashWidgetClass XMSASHWIDGETCLASS +#define xmScaleWidgetClass XMSCALEWIDGETCLASS +#define xmScrollBarWidgetClass XMSCROLLBARWIDGETCLASS +#define xmScrolledWindowClassRec XMSCROLLEDWINDOWCLASSREC +#define xmScrolledWindowWidgetClass XMSCROLLEDWINDOWWIDGETCLASS +#define xmSeparatorGadgetClass XMSEPARATORGADGETCLASS +#define xmSeparatorWidgetClass XMSEPARATORWIDGETCLASS +#define xmTextFieldWidgetClass XMTEXTFIELDWIDGETCLASS +#define xmTextWidgetClass XMTEXTWIDGETCLASS +#define xmToggleButtonGadgetClass XMTOGGLEBUTTONGADGETCLASS +#define xmToggleButtonWidgetClass XMTOGGLEBUTTONWIDGETCLASS + +#if (__VMS_VER < 80200000) +# define SetReqLen(req,n,badlen) \ + if ((req->length + n) > (unsigned)65535) { \ + n = badlen; \ + req->length += n; \ + } else \ + req->length += n +#endif + +#ifdef __cplusplus +extern "C" { +#endif +extern void XtFree(char*); +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Externals/wxWidgets/include/wx/volume.h b/Externals/wxWidgets/include/wx/volume.h new file mode 100644 index 0000000000..7a958b98ae --- /dev/null +++ b/Externals/wxWidgets/include/wx/volume.h @@ -0,0 +1,146 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/volume.h +// Purpose: wxFSVolume - encapsulates system volume information +// Author: George Policello +// Modified by: +// Created: 28 Jan 02 +// RCS-ID: $Id: volume.h 39399 2006-05-28 23:08:31Z ABX $ +// Copyright: (c) 2002 George Policello +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ---------------------------------------------------------------------------- +// wxFSVolume represents a volume/drive/mount point in a file system +// ---------------------------------------------------------------------------- + +#ifndef _WX_FSVOLUME_H_ +#define _WX_FSVOLUME_H_ + +#include "wx/defs.h" + +#if wxUSE_FSVOLUME + +#include "wx/arrstr.h" + +// the volume flags +enum +{ + // is the volume mounted? + wxFS_VOL_MOUNTED = 0x0001, + + // is the volume removable (floppy, CD, ...)? + wxFS_VOL_REMOVABLE = 0x0002, + + // read only? (otherwise read write) + wxFS_VOL_READONLY = 0x0004, + + // network resources + wxFS_VOL_REMOTE = 0x0008 +}; + +// the volume types +enum wxFSVolumeKind +{ + wxFS_VOL_FLOPPY, + wxFS_VOL_DISK, + wxFS_VOL_CDROM, + wxFS_VOL_DVDROM, + wxFS_VOL_NETWORK, + wxFS_VOL_OTHER, + wxFS_VOL_MAX +}; + +class WXDLLIMPEXP_BASE wxFSVolumeBase +{ +public: + // return the array containing the names of the volumes + // + // only the volumes with the flags such that + // (flags & flagsSet) == flagsSet && !(flags & flagsUnset) + // are returned (by default, all mounted ones) + static wxArrayString GetVolumes(int flagsSet = wxFS_VOL_MOUNTED, + int flagsUnset = 0); + + // stop execution of GetVolumes() called previously (should be called from + // another thread, of course) + static void CancelSearch(); + + // create the volume object with this name (should be one of those returned + // by GetVolumes()). + wxFSVolumeBase(); + wxFSVolumeBase(const wxString& name); + bool Create(const wxString& name); + + // accessors + // --------- + + // is this a valid volume? + bool IsOk() const; + + // kind of this volume? + wxFSVolumeKind GetKind() const; + + // flags of this volume? + int GetFlags() const; + + // can we write to this volume? + bool IsWritable() const { return !(GetFlags() & wxFS_VOL_READONLY); } + + // get the name of the volume and the name which should be displayed to the + // user + wxString GetName() const { return m_volName; } + wxString GetDisplayName() const { return m_dispName; } + + // TODO: operatios (Mount(), Unmount(), Eject(), ...)? + +protected: + // the internal volume name + wxString m_volName; + + // the volume name as it is displayed to the user + wxString m_dispName; + + // have we been initialized correctly? + bool m_isOk; +}; + +#if wxUSE_GUI + +#include "wx/icon.h" +#include "wx/iconbndl.h" // only for wxIconArray + +enum wxFSIconType +{ + wxFS_VOL_ICO_SMALL = 0, + wxFS_VOL_ICO_LARGE, + wxFS_VOL_ICO_SEL_SMALL, + wxFS_VOL_ICO_SEL_LARGE, + wxFS_VOL_ICO_MAX +}; + +// wxFSVolume adds GetIcon() to wxFSVolumeBase +class WXDLLIMPEXP_CORE wxFSVolume : public wxFSVolumeBase +{ +public: + wxFSVolume() : wxFSVolumeBase() { InitIcons(); } + wxFSVolume(const wxString& name) : wxFSVolumeBase(name) { InitIcons(); } + + wxIcon GetIcon(wxFSIconType type) const; + +private: + void InitIcons(); + + // the different icons for this volume (created on demand) + wxIconArray m_icons; +}; + +#else // !wxUSE_GUI + +// wxFSVolume is the same thing as wxFSVolume in wxBase +typedef wxFSVolumeBase wxFSVolume; + +#endif // wxUSE_GUI/!wxUSE_GUI + +#endif // wxUSE_FSVOLUME + +#endif // _WX_FSVOLUME_H_ diff --git a/Externals/wxWidgets/include/wx/vscroll.h b/Externals/wxWidgets/include/wx/vscroll.h new file mode 100644 index 0000000000..9063e108b1 --- /dev/null +++ b/Externals/wxWidgets/include/wx/vscroll.h @@ -0,0 +1,223 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: include/wx/vscroll.h +// Purpose: wxVScrolledWindow: generalization of wxScrolledWindow +// Author: Vadim Zeitlin +// Modified by: +// Created: 30.05.03 +// RCS-ID: $Id: vscroll.h 38917 2006-04-26 00:17:52Z VZ $ +// Copyright: (c) 2003 Vadim Zeitlin <vadim@wxwidgets.org> +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_VSCROLL_H_ +#define _WX_VSCROLL_H_ + +#include "wx/panel.h" // base class + +// ---------------------------------------------------------------------------- +// wxVScrolledWindow +// ---------------------------------------------------------------------------- + +/* + In the name of this class, "V" may stand for "variable" because it can be + used for scrolling lines of variable heights; "virtual" because it is not + necessary to know the heights of all lines in advance -- only those which + are shown on the screen need to be measured; or, even, "vertical" because + this class only supports scrolling in one direction currently (this could + and probably will change in the future however). + + In any case, this is a generalization of the wxScrolledWindow class which + can be only used when all lines have the same height. It lacks some other + wxScrolledWindow features however, notably it currently lacks support for + horizontal scrolling; it can't scroll another window nor only a rectangle + of the window and not its entire client area. + */ +class WXDLLEXPORT wxVScrolledWindow : public wxPanel +{ +public: + // constructors and such + // --------------------- + + // default ctor, you must call Create() later + wxVScrolledWindow() { Init(); } + + // normal ctor, no need to call Create() after this one + // + // note that wxVSCROLL is always automatically added to our style, there is + // no need to specify it explicitly + wxVScrolledWindow(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxPanelNameStr) + { + Init(); + + (void)Create(parent, id, pos, size, style, name); + } + + // same as the previous ctor but returns status code: true if ok + // + // just as with the ctor above, wxVSCROLL style is always used, there is no + // need to specify it + bool Create(wxWindow *parent, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString& name = wxPanelNameStr) + { + return wxPanel::Create(parent, id, pos, size, style | wxVSCROLL, name); + } + + + // operations + // ---------- + + // set the number of lines the window contains: the derived class must + // provide the heights for all lines with indices up to the one given here + // in its OnGetLineHeight() + void SetLineCount(size_t count); + + // scroll to the specified line: it will become the first visible line in + // the window + // + // return true if we scrolled the window, false if nothing was done + bool ScrollToLine(size_t line); + + // scroll by the specified number of lines/pages + virtual bool ScrollLines(int lines); + virtual bool ScrollPages(int pages); + + // redraw the specified line + virtual void RefreshLine(size_t line); + + // redraw all lines in the specified range (inclusive) + virtual void RefreshLines(size_t from, size_t to); + + // return the item at the specified (in physical coordinates) position or. + + // wxNOT_FOUND if none, i.e. if it is below the last item + int HitTest(wxCoord x, wxCoord y) const; + int HitTest(const wxPoint& pt) const { return HitTest(pt.x, pt.y); } + + // recalculate all our parameters and redisplay all lines + virtual void RefreshAll(); + + + // accessors + // --------- + + // get the number of lines this window contains (previously set by + // SetLineCount()) + size_t GetLineCount() const { return m_lineMax; } + + // get the first currently visible line + size_t GetVisibleBegin() const { return m_lineFirst; } + + // get the first currently visible line + size_t GetVisibleEnd() const { return m_lineFirst + m_nVisible; } + + // is this line currently visible? + bool IsVisible(size_t line) const + { return line >= GetVisibleBegin() && line < GetVisibleEnd(); } + + + // this is the same as GetVisibleBegin(), exists to match + // GetLastVisibleLine() and for backwards compatibility only + size_t GetFirstVisibleLine() const { return m_lineFirst; } + + // get the last currently visible line + // + // this function is unsafe as it returns (size_t)-1 (i.e. a huge positive + // number) if the control is empty, use GetVisibleEnd() instead, this one + // is kept for backwards compatibility + size_t GetLastVisibleLine() const { return GetVisibleEnd() - 1; } + + // layout the children (including the sizer if needed) + virtual bool Layout(); + +protected: + // this function must be overridden in the derived class and it should + // return the height of the given line in pixels + virtual wxCoord OnGetLineHeight(size_t n) const = 0; + + // this function doesn't have to be overridden but it may be useful to do + // it if calculating the lines heights is a relatively expensive operation + // as it gives the user code a possibility to calculate several of them at + // once + // + // OnGetLinesHint() is normally called just before OnGetLineHeight() but you + // shouldn't rely on the latter being called for all lines in the interval + // specified here. It is also possible that OnGetLineHeight() will be + // called for the lines outside of this interval, so this is really just a + // hint, not a promise. + // + // finally note that lineMin is inclusive, while lineMax is exclusive, as + // usual + virtual void OnGetLinesHint(size_t WXUNUSED(lineMin), + size_t WXUNUSED(lineMax)) const { } + + // when the number of lines changes, we try to estimate the total height + // of all lines which is a rather expensive operation in terms of lines + // access, so if the user code may estimate the average height + // better/faster than we do, it should override this function to implement + // its own logic + // + // this function should return the best guess for the total height it may + // make + virtual wxCoord EstimateTotalHeight() const; + + + // the event handlers + void OnSize(wxSizeEvent& event); + void OnScroll(wxScrollWinEvent& event); +#if wxUSE_MOUSEWHEEL + void OnMouseWheel(wxMouseEvent& event); +#endif + + // find the index of the line we need to show at the top of the window such + // that the last (fully or partially) visible line is the given one + size_t FindFirstFromBottom(size_t lineLast, bool fullyVisible = false); + + // get the total height of the lines between lineMin (inclusive) and + // lineMax (exclusive) + wxCoord GetLinesHeight(size_t lineMin, size_t lineMax) const; + + // update the thumb size shown by the scrollbar + void UpdateScrollbar(); + + // remove the scrollbar completely because we don't need it + void RemoveScrollbar(); + +private: + // common part of all ctors + void Init(); + + + // the total number of (logical) lines + size_t m_lineMax; + + // the total (estimated) height + wxCoord m_heightTotal; + + // the first currently visible line + size_t m_lineFirst; + + // the number of currently visible lines (including the last, possibly only + // partly, visible one) + size_t m_nVisible; + + // accumulated mouse wheel rotation +#if wxUSE_MOUSEWHEEL + int m_sumWheelRotation; +#endif + + DECLARE_EVENT_TABLE() + DECLARE_NO_COPY_CLASS(wxVScrolledWindow) + DECLARE_ABSTRACT_CLASS(wxVScrolledWindow) +}; + +#endif // _WX_VSCROLL_H_ + diff --git a/Externals/wxWidgets/include/wx/wave.h b/Externals/wxWidgets/include/wx/wave.h new file mode 100644 index 0000000000..f5970cbab0 --- /dev/null +++ b/Externals/wxWidgets/include/wx/wave.h @@ -0,0 +1,36 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/wave.h +// Purpose: wxSound compatibility header +// Author: Vaclav Slavik +// Modified by: +// Created: 2004/02/01 +// RCS-ID: $Id: wave.h 32852 2005-03-16 16:18:31Z ABX $ +// Copyright: (c) 2004, Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_WAVE_H_BASE_ +#define _WX_WAVE_H_BASE_ + +#include "wx/defs.h" + +#if wxUSE_SOUND + +#if WXWIN_COMPATIBILITY_2_4 +#if defined(__DMC__) || defined(__BORLANDC__) + #pragma message "wx/wave.h header is deprecated, use wx/sound.h and wxSound" +#elif defined(__WATCOMC__) || defined(__VISUALC__) + #pragma message ("wx/wave.h header is deprecated, use wx/sound.h and wxSound") +#else + #warning "wx/wave.h header is deprecated, use wx/sound.h and wxSound" +#endif + #include "wx/sound.h" + // wxSound used to be called wxWave before wxWidgets 2.5.1: + typedef wxSound wxWave; +#else + #error "wx/wave.h is only available in compatibility mode" +#endif + +#endif + +#endif diff --git a/Externals/wxWidgets/include/wx/wfstream.h b/Externals/wxWidgets/include/wx/wfstream.h new file mode 100644 index 0000000000..258e13c472 --- /dev/null +++ b/Externals/wxWidgets/include/wx/wfstream.h @@ -0,0 +1,204 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/wfstream.h +// Purpose: File stream classes +// Author: Guilhem Lavaux +// Modified by: +// Created: 11/07/98 +// RCS-ID: $Id: wfstream.h 44013 2006-12-19 13:49:26Z SC $ +// Copyright: (c) Guilhem Lavaux +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_WXFSTREAM_H__ +#define _WX_WXFSTREAM_H__ + +#include "wx/defs.h" + +#if wxUSE_STREAMS + +#include "wx/object.h" +#include "wx/string.h" +#include "wx/stream.h" +#include "wx/file.h" +#include "wx/ffile.h" + +#if wxUSE_FILE + +// ---------------------------------------------------------------------------- +// wxFileStream using wxFile +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxFileInputStream : public wxInputStream +{ +public: + wxFileInputStream(const wxString& ifileName); + wxFileInputStream(wxFile& file); + wxFileInputStream(int fd); + virtual ~wxFileInputStream(); + + wxFileOffset GetLength() const; + + bool Ok() const { return IsOk(); } + virtual bool IsOk() const; + bool IsSeekable() const { return m_file->GetKind() == wxFILE_KIND_DISK; } + +protected: + wxFileInputStream(); + + size_t OnSysRead(void *buffer, size_t size); + wxFileOffset OnSysSeek(wxFileOffset pos, wxSeekMode mode); + wxFileOffset OnSysTell() const; + +protected: + wxFile *m_file; + bool m_file_destroy; + + DECLARE_NO_COPY_CLASS(wxFileInputStream) +}; + +class WXDLLIMPEXP_BASE wxFileOutputStream : public wxOutputStream +{ +public: + wxFileOutputStream(const wxString& fileName); + wxFileOutputStream(wxFile& file); + wxFileOutputStream(int fd); + virtual ~wxFileOutputStream(); + + void Sync(); + bool Close() { return m_file_destroy ? m_file->Close() : true; } + wxFileOffset GetLength() const; + + bool Ok() const { return IsOk(); } + virtual bool IsOk() const; + bool IsSeekable() const { return m_file->GetKind() == wxFILE_KIND_DISK; } + +protected: + wxFileOutputStream(); + + size_t OnSysWrite(const void *buffer, size_t size); + wxFileOffset OnSysSeek(wxFileOffset pos, wxSeekMode mode); + wxFileOffset OnSysTell() const; + +protected: + wxFile *m_file; + bool m_file_destroy; + + DECLARE_NO_COPY_CLASS(wxFileOutputStream) +}; + +class WXDLLIMPEXP_BASE wxTempFileOutputStream : public wxOutputStream +{ +public: + wxTempFileOutputStream(const wxString& fileName); + virtual ~wxTempFileOutputStream(); + + bool Close() { return Commit(); } + virtual bool Commit() { return m_file->Commit(); } + virtual void Discard() { m_file->Discard(); } + + wxFileOffset GetLength() const { return m_file->Length(); } + bool IsSeekable() const { return true; } + +protected: + size_t OnSysWrite(const void *buffer, size_t size); + wxFileOffset OnSysSeek(wxFileOffset pos, wxSeekMode mode) + { return m_file->Seek(pos, mode); } + wxFileOffset OnSysTell() const { return m_file->Tell(); } + +private: + wxTempFile *m_file; + + DECLARE_NO_COPY_CLASS(wxTempFileOutputStream) +}; + +class WXDLLIMPEXP_BASE wxFileStream : public wxFileInputStream, + public wxFileOutputStream +{ +public: + wxFileStream(const wxString& fileName); + +private: + DECLARE_NO_COPY_CLASS(wxFileStream) +}; + +#endif //wxUSE_FILE + +#if wxUSE_FFILE + +// ---------------------------------------------------------------------------- +// wxFFileStream using wxFFile +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxFFileInputStream : public wxInputStream +{ +public: + wxFFileInputStream(const wxString& fileName, const wxChar *mode = _T("rb")); + wxFFileInputStream(wxFFile& file); + wxFFileInputStream(FILE *file); + virtual ~wxFFileInputStream(); + + wxFileOffset GetLength() const; + + bool Ok() const { return IsOk(); } + virtual bool IsOk() const; + bool IsSeekable() const { return m_file->GetKind() == wxFILE_KIND_DISK; } + +protected: + wxFFileInputStream(); + + size_t OnSysRead(void *buffer, size_t size); + wxFileOffset OnSysSeek(wxFileOffset pos, wxSeekMode mode); + wxFileOffset OnSysTell() const; + +protected: + wxFFile *m_file; + bool m_file_destroy; + + DECLARE_NO_COPY_CLASS(wxFFileInputStream) +}; + +class WXDLLIMPEXP_BASE wxFFileOutputStream : public wxOutputStream +{ +public: + wxFFileOutputStream(const wxString& fileName, const wxChar *mode = _T("w+b")); + wxFFileOutputStream(wxFFile& file); + wxFFileOutputStream(FILE *file); + virtual ~wxFFileOutputStream(); + + void Sync(); + bool Close() { return m_file_destroy ? m_file->Close() : true; } + wxFileOffset GetLength() const; + + bool Ok() const { return IsOk(); } + virtual bool IsOk() const ; + bool IsSeekable() const { return m_file->GetKind() == wxFILE_KIND_DISK; } + +protected: + wxFFileOutputStream(); + + size_t OnSysWrite(const void *buffer, size_t size); + wxFileOffset OnSysSeek(wxFileOffset pos, wxSeekMode mode); + wxFileOffset OnSysTell() const; + +protected: + wxFFile *m_file; + bool m_file_destroy; + + DECLARE_NO_COPY_CLASS(wxFFileOutputStream) +}; + +class WXDLLIMPEXP_BASE wxFFileStream : public wxFFileInputStream, + public wxFFileOutputStream +{ +public: + wxFFileStream(const wxString& fileName); + +private: + DECLARE_NO_COPY_CLASS(wxFFileStream) +}; + +#endif //wxUSE_FFILE + +#endif // wxUSE_STREAMS + +#endif // _WX_WXFSTREAM_H__ diff --git a/Externals/wxWidgets/include/wx/window.h b/Externals/wxWidgets/include/wx/window.h new file mode 100644 index 0000000000..01febb3191 --- /dev/null +++ b/Externals/wxWidgets/include/wx/window.h @@ -0,0 +1,1637 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/window.h +// Purpose: wxWindowBase class - the interface of wxWindow +// Author: Vadim Zeitlin +// Modified by: Ron Lee +// Created: 01/02/97 +// RCS-ID: $Id: window.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_WINDOW_H_BASE_ +#define _WX_WINDOW_H_BASE_ + +// ---------------------------------------------------------------------------- +// headers which we must include here +// ---------------------------------------------------------------------------- + +#include "wx/event.h" // the base class + +#include "wx/list.h" // defines wxWindowList + +#include "wx/cursor.h" // we have member variables of these classes +#include "wx/font.h" // so we can't do without them +#include "wx/colour.h" +#include "wx/region.h" +#include "wx/utils.h" +#include "wx/intl.h" + +#include "wx/validate.h" // for wxDefaultValidator (always include it) + +#if wxUSE_PALETTE + #include "wx/palette.h" +#endif // wxUSE_PALETTE + +#if wxUSE_ACCEL + #include "wx/accel.h" +#endif // wxUSE_ACCEL + +#if wxUSE_ACCESSIBILITY +#include "wx/access.h" +#endif + +// when building wxUniv/Foo we don't want the code for native menu use to be +// compiled in - it should only be used when building real wxFoo +#ifdef __WXUNIVERSAL__ + #define wxUSE_MENUS_NATIVE 0 +#else // !__WXUNIVERSAL__ + #define wxUSE_MENUS_NATIVE wxUSE_MENUS +#endif // __WXUNIVERSAL__/!__WXUNIVERSAL__ + +// ---------------------------------------------------------------------------- +// forward declarations +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_FWD_CORE wxCaret; +class WXDLLIMPEXP_FWD_CORE wxControl; +class WXDLLIMPEXP_FWD_CORE wxCursor; +class WXDLLIMPEXP_FWD_CORE wxDC; +class WXDLLIMPEXP_FWD_CORE wxDropTarget; +class WXDLLIMPEXP_FWD_CORE wxItemResource; +class WXDLLIMPEXP_FWD_CORE wxLayoutConstraints; +class WXDLLIMPEXP_FWD_CORE wxResourceTable; +class WXDLLIMPEXP_FWD_CORE wxSizer; +class WXDLLIMPEXP_FWD_CORE wxToolTip; +class WXDLLIMPEXP_FWD_CORE wxWindowBase; +class WXDLLIMPEXP_FWD_CORE wxWindow; +class WXDLLIMPEXP_FWD_CORE wxScrollHelper; + +#if wxUSE_ACCESSIBILITY +class WXDLLIMPEXP_FWD_CORE wxAccessible; +#endif + +// ---------------------------------------------------------------------------- +// helper stuff used by wxWindow +// ---------------------------------------------------------------------------- + +// struct containing all the visual attributes of a control +struct WXDLLEXPORT wxVisualAttributes +{ + // the font used for control label/text inside it + wxFont font; + + // the foreground colour + wxColour colFg; + + // the background colour, may be wxNullColour if the controls background + // colour is not solid + wxColour colBg; +}; + +// different window variants, on platforms like eg mac uses different +// rendering sizes +enum wxWindowVariant +{ + wxWINDOW_VARIANT_NORMAL, // Normal size + wxWINDOW_VARIANT_SMALL, // Smaller size (about 25 % smaller than normal) + wxWINDOW_VARIANT_MINI, // Mini size (about 33 % smaller than normal) + wxWINDOW_VARIANT_LARGE, // Large size (about 25 % larger than normal) + wxWINDOW_VARIANT_MAX +}; + +#if wxUSE_SYSTEM_OPTIONS + #define wxWINDOW_DEFAULT_VARIANT wxT("window-default-variant") +#endif + +// ---------------------------------------------------------------------------- +// (pseudo)template list classes +// ---------------------------------------------------------------------------- + +WX_DECLARE_LIST_3(wxWindow, wxWindowBase, wxWindowList, wxWindowListNode, class WXDLLEXPORT); + +// ---------------------------------------------------------------------------- +// global variables +// ---------------------------------------------------------------------------- + +extern WXDLLEXPORT_DATA(wxWindowList) wxTopLevelWindows; +extern WXDLLIMPEXP_DATA_CORE(wxList) wxPendingDelete; + +// ---------------------------------------------------------------------------- +// wxWindowBase is the base class for all GUI controls/widgets, this is the public +// interface of this class. +// +// Event handler: windows have themselves as their event handlers by default, +// but their event handlers could be set to another object entirely. This +// separation can reduce the amount of derivation required, and allow +// alteration of a window's functionality (e.g. by a resource editor that +// temporarily switches event handlers). +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxWindowBase : public wxEvtHandler +{ +public: + // creating the window + // ------------------- + + // default ctor, initializes everything which can be initialized before + // Create() + wxWindowBase() ; + + // pseudo ctor (can't be virtual, called from ctor) + bool CreateBase(wxWindowBase *parent, + wxWindowID winid, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxPanelNameStr); + + virtual ~wxWindowBase(); + + // deleting the window + // ------------------- + + // ask the window to close itself, return true if the event handler + // honoured our request + bool Close( bool force = false ); + + // the following functions delete the C++ objects (the window itself + // or its children) as well as the GUI windows and normally should + // never be used directly + + // delete window unconditionally (dangerous!), returns true if ok + virtual bool Destroy(); + // delete all children of this window, returns true if ok + bool DestroyChildren(); + + // is the window being deleted? + bool IsBeingDeleted() const { return m_isBeingDeleted; } + + // window attributes + // ----------------- + + // label is just the same as the title (but for, e.g., buttons it + // makes more sense to speak about labels), title access + // is available from wxTLW classes only (frames, dialogs) + virtual void SetLabel(const wxString& label) = 0; + virtual wxString GetLabel() const = 0; + + // the window name is used for ressource setting in X, it is not the + // same as the window title/label + virtual void SetName( const wxString &name ) { m_windowName = name; } + virtual wxString GetName() const { return m_windowName; } + + // sets the window variant, calls internally DoSetVariant if variant + // has changed + void SetWindowVariant(wxWindowVariant variant); + wxWindowVariant GetWindowVariant() const { return m_windowVariant; } + + + // window id uniquely identifies the window among its siblings unless + // it is wxID_ANY which means "don't care" + void SetId( wxWindowID winid ) { m_windowId = winid; } + wxWindowID GetId() const { return m_windowId; } + + // get or change the layout direction (LTR or RTL) for this window, + // wxLayout_Default is returned if layout direction is not supported + virtual wxLayoutDirection GetLayoutDirection() const + { return wxLayout_Default; } + virtual void SetLayoutDirection(wxLayoutDirection WXUNUSED(dir)) + { } + + // mirror coordinates for RTL layout if this window uses it and if the + // mirroring is not done automatically like Win32 + virtual wxCoord AdjustForLayoutDirection(wxCoord x, + wxCoord width, + wxCoord widthTotal) const; + + // generate a control id for the controls which were not given one by + // user + static int NewControlId() { return --ms_lastControlId; } + // get the id of the control following the one with the given + // (autogenerated) id + static int NextControlId(int winid) { return winid - 1; } + // get the id of the control preceding the one with the given + // (autogenerated) id + static int PrevControlId(int winid) { return winid + 1; } + + // moving/resizing + // --------------- + + // set the window size and/or position + void SetSize( int x, int y, int width, int height, + int sizeFlags = wxSIZE_AUTO ) + { DoSetSize(x, y, width, height, sizeFlags); } + + void SetSize( int width, int height ) + { DoSetSize( wxDefaultCoord, wxDefaultCoord, width, height, wxSIZE_USE_EXISTING ); } + + void SetSize( const wxSize& size ) + { SetSize( size.x, size.y); } + + void SetSize(const wxRect& rect, int sizeFlags = wxSIZE_AUTO) + { DoSetSize(rect.x, rect.y, rect.width, rect.height, sizeFlags); } + + void Move(int x, int y, int flags = wxSIZE_USE_EXISTING) + { DoSetSize(x, y, wxDefaultCoord, wxDefaultCoord, flags); } + + void Move(const wxPoint& pt, int flags = wxSIZE_USE_EXISTING) + { Move(pt.x, pt.y, flags); } + + void SetPosition(const wxPoint& pt) { Move(pt); } + + // Z-order + virtual void Raise() = 0; + virtual void Lower() = 0; + + // client size is the size of area available for subwindows + void SetClientSize( int width, int height ) + { DoSetClientSize(width, height); } + + void SetClientSize( const wxSize& size ) + { DoSetClientSize(size.x, size.y); } + + void SetClientSize(const wxRect& rect) + { SetClientSize( rect.width, rect.height ); } + + // get the window position (pointers may be NULL): notice that it is in + // client coordinates for child windows and screen coordinates for the + // top level ones, use GetScreenPosition() if you need screen + // coordinates for all kinds of windows + void GetPosition( int *x, int *y ) const { DoGetPosition(x, y); } + wxPoint GetPosition() const + { + int x, y; + DoGetPosition(&x, &y); + + return wxPoint(x, y); + } + + // get the window position in screen coordinates + void GetScreenPosition(int *x, int *y) const { DoGetScreenPosition(x, y); } + wxPoint GetScreenPosition() const + { + int x, y; + DoGetScreenPosition(&x, &y); + + return wxPoint(x, y); + } + + // get the window size (pointers may be NULL) + void GetSize( int *w, int *h ) const { DoGetSize(w, h); } + wxSize GetSize() const + { + int w, h; + DoGetSize(& w, & h); + return wxSize(w, h); + } + + void GetClientSize( int *w, int *h ) const { DoGetClientSize(w, h); } + wxSize GetClientSize() const + { + int w, h; + DoGetClientSize(&w, &h); + + return wxSize(w, h); + } + + // get the position and size at once + wxRect GetRect() const + { + int x, y, w, h; + GetPosition(&x, &y); + GetSize(&w, &h); + + return wxRect(x, y, w, h); + } + + wxRect GetScreenRect() const + { + int x, y, w, h; + GetScreenPosition(&x, &y); + GetSize(&w, &h); + + return wxRect(x, y, w, h); + } + + // get the origin of the client area of the window relative to the + // window top left corner (the client area may be shifted because of + // the borders, scrollbars, other decorations...) + virtual wxPoint GetClientAreaOrigin() const; + + // get the client rectangle in window (i.e. client) coordinates + wxRect GetClientRect() const + { + return wxRect(GetClientAreaOrigin(), GetClientSize()); + } + + // get the size best suited for the window (in fact, minimal + // acceptable size using which it will still look "nice" in + // most situations) + wxSize GetBestSize() const + { + if (m_bestSizeCache.IsFullySpecified()) + return m_bestSizeCache; + return DoGetBestSize(); + } + void GetBestSize(int *w, int *h) const + { + wxSize s = GetBestSize(); + if ( w ) + *w = s.x; + if ( h ) + *h = s.y; + } + + void SetScrollHelper( wxScrollHelper *sh ) { m_scrollHelper = sh; } + wxScrollHelper *GetScrollHelper() { return m_scrollHelper; } + + // reset the cached best size value so it will be recalculated the + // next time it is needed. + void InvalidateBestSize(); + void CacheBestSize(const wxSize& size) const + { wxConstCast(this, wxWindowBase)->m_bestSizeCache = size; } + + + // This function will merge the window's best size into the window's + // minimum size, giving priority to the min size components, and + // returns the results. + wxSize GetEffectiveMinSize() const; + wxDEPRECATED( wxSize GetBestFittingSize() const ); // replaced by GetEffectiveMinSize + wxDEPRECATED( wxSize GetAdjustedMinSize() const ); // replaced by GetEffectiveMinSize + + // A 'Smart' SetSize that will fill in default size values with 'best' + // size. Sets the minsize to what was passed in. + void SetInitialSize(const wxSize& size=wxDefaultSize); + wxDEPRECATED( void SetBestFittingSize(const wxSize& size=wxDefaultSize) ); // replaced by SetInitialSize + + + // the generic centre function - centers the window on parent by` + // default or on screen if it doesn't have parent or + // wxCENTER_ON_SCREEN flag is given + void Centre(int dir = wxBOTH) { DoCentre(dir); } + void Center(int dir = wxBOTH) { DoCentre(dir); } + + // centre with respect to the the parent window + void CentreOnParent(int dir = wxBOTH) { DoCentre(dir); } + void CenterOnParent(int dir = wxBOTH) { CentreOnParent(dir); } + + // set window size to wrap around its children + virtual void Fit(); + + // set virtual size to satisfy children + virtual void FitInside(); + + + // SetSizeHints is actually for setting the size hints + // for the wxTLW for a Window Manager - hence the name - + // and it is therefore overridden in wxTLW to do that. + // In wxWindow(Base), it has (unfortunately) been abused + // to mean the same as SetMinSize() and SetMaxSize(). + + virtual void SetSizeHints( int minW, int minH, + int maxW = wxDefaultCoord, int maxH = wxDefaultCoord, + int incW = wxDefaultCoord, int incH = wxDefaultCoord ) + { DoSetSizeHints(minW, minH, maxW, maxH, incW, incH); } + + void SetSizeHints( const wxSize& minSize, + const wxSize& maxSize=wxDefaultSize, + const wxSize& incSize=wxDefaultSize) + { DoSetSizeHints(minSize.x, minSize.y, maxSize.x, maxSize.y, incSize.x, incSize.y); } + + virtual void DoSetSizeHints( int minW, int minH, + int maxW, int maxH, + int incW, int incH ); + + // Methods for setting virtual size hints + // FIXME: What are virtual size hints? + + virtual void SetVirtualSizeHints( int minW, int minH, + int maxW = wxDefaultCoord, int maxH = wxDefaultCoord ); + void SetVirtualSizeHints( const wxSize& minSize, + const wxSize& maxSize=wxDefaultSize) + { + SetVirtualSizeHints(minSize.x, minSize.y, maxSize.x, maxSize.y); + } + + + // Call these to override what GetBestSize() returns. This + // method is only virtual because it is overriden in wxTLW + // as a different API for SetSizeHints(). + virtual void SetMinSize(const wxSize& minSize) { m_minWidth = minSize.x; m_minHeight = minSize.y; } + virtual void SetMaxSize(const wxSize& maxSize) { m_maxWidth = maxSize.x; m_maxHeight = maxSize.y; } + + // Override these methods to impose restrictions on min/max size. + // The easier way is to call SetMinSize() and SetMaxSize() which + // will have the same effect. Doing both is non-sense. + virtual wxSize GetMinSize() const { return wxSize(m_minWidth, m_minHeight); } + virtual wxSize GetMaxSize() const { return wxSize(m_maxWidth, m_maxHeight); } + + // Get the min and max values one by one + int GetMinWidth() const { return GetMinSize().x; } + int GetMinHeight() const { return GetMinSize().y; } + int GetMaxWidth() const { return GetMaxSize().x; } + int GetMaxHeight() const { return GetMaxSize().y; } + + + // Methods for accessing the virtual size of a window. For most + // windows this is just the client area of the window, but for + // some like scrolled windows it is more or less independent of + // the screen window size. You may override the DoXXXVirtual + // methods below for classes where that is is the case. + + void SetVirtualSize( const wxSize &size ) { DoSetVirtualSize( size.x, size.y ); } + void SetVirtualSize( int x, int y ) { DoSetVirtualSize( x, y ); } + + wxSize GetVirtualSize() const { return DoGetVirtualSize(); } + void GetVirtualSize( int *x, int *y ) const + { + wxSize s( DoGetVirtualSize() ); + + if( x ) + *x = s.GetWidth(); + if( y ) + *y = s.GetHeight(); + } + + // Override these methods for windows that have a virtual size + // independent of their client size. eg. the virtual area of a + // wxScrolledWindow. + + virtual void DoSetVirtualSize( int x, int y ); + virtual wxSize DoGetVirtualSize() const; + + // Return the largest of ClientSize and BestSize (as determined + // by a sizer, interior children, or other means) + + virtual wxSize GetBestVirtualSize() const + { + wxSize client( GetClientSize() ); + wxSize best( GetBestSize() ); + + return wxSize( wxMax( client.x, best.x ), wxMax( client.y, best.y ) ); + } + + // return the size of the left/right and top/bottom borders in x and y + // components of the result respectively + virtual wxSize GetWindowBorderSize() const; + + + // window state + // ------------ + + // returns true if window was shown/hidden, false if the nothing was + // done (window was already shown/hidden) + virtual bool Show( bool show = true ); + bool Hide() { return Show(false); } + + // returns true if window was enabled/disabled, false if nothing done + virtual bool Enable( bool enable = true ); + bool Disable() { return Enable(false); } + + virtual bool IsShown() const { return m_isShown; } + virtual bool IsEnabled() const { return m_isEnabled; } + + // returns true if the window is visible, i.e. IsShown() returns true + // if called on it and all its parents up to the first TLW + virtual bool IsShownOnScreen() const; + + // get/set window style (setting style won't update the window and so + // is only useful for internal usage) + virtual void SetWindowStyleFlag( long style ) { m_windowStyle = style; } + virtual long GetWindowStyleFlag() const { return m_windowStyle; } + + // just some (somewhat shorter) synonims + void SetWindowStyle( long style ) { SetWindowStyleFlag(style); } + long GetWindowStyle() const { return GetWindowStyleFlag(); } + + // check if the flag is set + bool HasFlag(int flag) const { return (m_windowStyle & flag) != 0; } + virtual bool IsRetained() const { return HasFlag(wxRETAINED); } + + // turn the flag on if it had been turned off before and vice versa, + // return true if the flag is currently turned on + bool ToggleWindowStyle(int flag); + + // extra style: the less often used style bits which can't be set with + // SetWindowStyleFlag() + virtual void SetExtraStyle(long exStyle) { m_exStyle = exStyle; } + long GetExtraStyle() const { return m_exStyle; } + + // make the window modal (all other windows unresponsive) + virtual void MakeModal(bool modal = true); + + + // (primitive) theming support + // --------------------------- + + virtual void SetThemeEnabled(bool enableTheme) { m_themeEnabled = enableTheme; } + virtual bool GetThemeEnabled() const { return m_themeEnabled; } + + + // focus and keyboard handling + // --------------------------- + + // set focus to this window + virtual void SetFocus() = 0; + + // set focus to this window as the result of a keyboard action + virtual void SetFocusFromKbd() { SetFocus(); } + + // return the window which currently has the focus or NULL + static wxWindow *FindFocus(); + + static wxWindow *DoFindFocus() /* = 0: implement in derived classes */; + + // can this window have focus? + virtual bool AcceptsFocus() const { return IsShown() && IsEnabled(); } + + // can this window be given focus by keyboard navigation? if not, the + // only way to give it focus (provided it accepts it at all) is to + // click it + virtual bool AcceptsFocusFromKeyboard() const { return AcceptsFocus(); } + + // navigates in the specified direction by sending a wxNavigationKeyEvent + virtual bool Navigate(int flags = wxNavigationKeyEvent::IsForward); + + // move this window just before/after the specified one in tab order + // (the other window must be our sibling!) + void MoveBeforeInTabOrder(wxWindow *win) + { DoMoveInTabOrder(win, MoveBefore); } + void MoveAfterInTabOrder(wxWindow *win) + { DoMoveInTabOrder(win, MoveAfter); } + + + // parent/children relations + // ------------------------- + + // get the list of children + const wxWindowList& GetChildren() const { return m_children; } + wxWindowList& GetChildren() { return m_children; } + + // needed just for extended runtime + const wxWindowList& GetWindowChildren() const { return GetChildren() ; } + + // get the parent or the parent of the parent + wxWindow *GetParent() const { return m_parent; } + inline wxWindow *GetGrandParent() const; + + // is this window a top level one? + virtual bool IsTopLevel() const; + + // it doesn't really change parent, use Reparent() instead + void SetParent( wxWindowBase *parent ) { m_parent = (wxWindow *)parent; } + // change the real parent of this window, return true if the parent + // was changed, false otherwise (error or newParent == oldParent) + virtual bool Reparent( wxWindowBase *newParent ); + + // implementation mostly + virtual void AddChild( wxWindowBase *child ); + virtual void RemoveChild( wxWindowBase *child ); + + // looking for windows + // ------------------- + + // find window among the descendants of this one either by id or by + // name (return NULL if not found) + wxWindow *FindWindow(long winid) const; + wxWindow *FindWindow(const wxString& name) const; + + // Find a window among any window (all return NULL if not found) + static wxWindow *FindWindowById( long winid, const wxWindow *parent = NULL ); + static wxWindow *FindWindowByName( const wxString& name, + const wxWindow *parent = NULL ); + static wxWindow *FindWindowByLabel( const wxString& label, + const wxWindow *parent = NULL ); + + // event handler stuff + // ------------------- + + // get the current event handler + wxEvtHandler *GetEventHandler() const { return m_eventHandler; } + + // replace the event handler (allows to completely subclass the + // window) + void SetEventHandler( wxEvtHandler *handler ) { m_eventHandler = handler; } + + // push/pop event handler: allows to chain a custom event handler to + // alreasy existing ones + void PushEventHandler( wxEvtHandler *handler ); + wxEvtHandler *PopEventHandler( bool deleteHandler = false ); + + // find the given handler in the event handler chain and remove (but + // not delete) it from the event handler chain, return true if it was + // found and false otherwise (this also results in an assert failure so + // this function should only be called when the handler is supposed to + // be there) + bool RemoveEventHandler(wxEvtHandler *handler); + + // validators + // ---------- + +#if wxUSE_VALIDATORS + // a window may have an associated validator which is used to control + // user input + virtual void SetValidator( const wxValidator &validator ); + virtual wxValidator *GetValidator() { return m_windowValidator; } +#endif // wxUSE_VALIDATORS + + + // dialog oriented functions + // ------------------------- + + // validate the correctness of input, return true if ok + virtual bool Validate(); + + // transfer data between internal and GUI representations + virtual bool TransferDataToWindow(); + virtual bool TransferDataFromWindow(); + + virtual void InitDialog(); + +#if wxUSE_ACCEL + // accelerators + // ------------ + virtual void SetAcceleratorTable( const wxAcceleratorTable& accel ) + { m_acceleratorTable = accel; } + wxAcceleratorTable *GetAcceleratorTable() + { return &m_acceleratorTable; } + +#endif // wxUSE_ACCEL + +#if wxUSE_HOTKEY + // hot keys (system wide accelerators) + // ----------------------------------- + + virtual bool RegisterHotKey(int hotkeyId, int modifiers, int keycode); + virtual bool UnregisterHotKey(int hotkeyId); +#endif // wxUSE_HOTKEY + + + // dialog units translations + // ------------------------- + + wxPoint ConvertPixelsToDialog( const wxPoint& pt ); + wxPoint ConvertDialogToPixels( const wxPoint& pt ); + wxSize ConvertPixelsToDialog( const wxSize& sz ) + { + wxPoint pt(ConvertPixelsToDialog(wxPoint(sz.x, sz.y))); + + return wxSize(pt.x, pt.y); + } + + wxSize ConvertDialogToPixels( const wxSize& sz ) + { + wxPoint pt(ConvertDialogToPixels(wxPoint(sz.x, sz.y))); + + return wxSize(pt.x, pt.y); + } + + // mouse functions + // --------------- + + // move the mouse to the specified position + virtual void WarpPointer(int x, int y) = 0; + + // start or end mouse capture, these functions maintain the stack of + // windows having captured the mouse and after calling ReleaseMouse() + // the mouse is not released but returns to the window which had had + // captured it previously (if any) + void CaptureMouse(); + void ReleaseMouse(); + + // get the window which currently captures the mouse or NULL + static wxWindow *GetCapture(); + + // does this window have the capture? + virtual bool HasCapture() const + { return (wxWindow *)this == GetCapture(); } + + // painting the window + // ------------------- + + // mark the specified rectangle (or the whole window) as "dirty" so it + // will be repainted + virtual void Refresh( bool eraseBackground = true, + const wxRect *rect = (const wxRect *) NULL ) = 0; + + // a less awkward wrapper for Refresh + void RefreshRect(const wxRect& rect, bool eraseBackground = true) + { + Refresh(eraseBackground, &rect); + } + + // repaint all invalid areas of the window immediately + virtual void Update() { } + + // clear the window background + virtual void ClearBackground(); + + // freeze the window: don't redraw it until it is thawed + virtual void Freeze() { } + + // thaw the window: redraw it after it had been frozen + virtual void Thaw() { } + + // return true if window had been frozen and not unthawed yet + virtual bool IsFrozen() const { return false; } + + // adjust DC for drawing on this window + virtual void PrepareDC( wxDC & WXUNUSED(dc) ) { } + + // return true if the window contents is double buffered by the system + virtual bool IsDoubleBuffered() const { return false; } + + // the update region of the window contains the areas which must be + // repainted by the program + const wxRegion& GetUpdateRegion() const { return m_updateRegion; } + wxRegion& GetUpdateRegion() { return m_updateRegion; } + + // get the update rectangleregion bounding box in client coords + wxRect GetUpdateClientRect() const; + + // these functions verify whether the given point/rectangle belongs to + // (or at least intersects with) the update region + virtual bool DoIsExposed( int x, int y ) const; + virtual bool DoIsExposed( int x, int y, int w, int h ) const; + + bool IsExposed( int x, int y ) const + { return DoIsExposed(x, y); } + bool IsExposed( int x, int y, int w, int h ) const + { return DoIsExposed(x, y, w, h); } + bool IsExposed( const wxPoint& pt ) const + { return DoIsExposed(pt.x, pt.y); } + bool IsExposed( const wxRect& rect ) const + { return DoIsExposed(rect.x, rect.y, rect.width, rect.height); } + + // colours, fonts and cursors + // -------------------------- + + // get the default attributes for the controls of this class: we + // provide a virtual function which can be used to query the default + // attributes of an existing control and a static function which can + // be used even when no existing object of the given class is + // available, but which won't return any styles specific to this + // particular control, of course (e.g. "Ok" button might have + // different -- bold for example -- font) + virtual wxVisualAttributes GetDefaultAttributes() const + { + return GetClassDefaultAttributes(GetWindowVariant()); + } + + static wxVisualAttributes + GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL); + + // set/retrieve the window colours (system defaults are used by + // default): SetXXX() functions return true if colour was changed, + // SetDefaultXXX() reset the "m_inheritXXX" flag after setting the + // value to prevent it from being inherited by our children + virtual bool SetBackgroundColour(const wxColour& colour); + void SetOwnBackgroundColour(const wxColour& colour) + { + if ( SetBackgroundColour(colour) ) + m_inheritBgCol = false; + } + wxColour GetBackgroundColour() const; + bool InheritsBackgroundColour() const + { + return m_inheritBgCol; + } + bool UseBgCol() const + { + return m_hasBgCol; + } + + virtual bool SetForegroundColour(const wxColour& colour); + void SetOwnForegroundColour(const wxColour& colour) + { + if ( SetForegroundColour(colour) ) + m_inheritFgCol = false; + } + wxColour GetForegroundColour() const; + + // Set/get the background style. + // Pass one of wxBG_STYLE_SYSTEM, wxBG_STYLE_COLOUR, wxBG_STYLE_CUSTOM + virtual bool SetBackgroundStyle(wxBackgroundStyle style) { m_backgroundStyle = style; return true; } + virtual wxBackgroundStyle GetBackgroundStyle() const { return m_backgroundStyle; } + + // returns true if the control has "transparent" areas such as a + // wxStaticText and wxCheckBox and the background should be adapted + // from a parent window + virtual bool HasTransparentBackground() { return false; } + + // set/retrieve the font for the window (SetFont() returns true if the + // font really changed) + virtual bool SetFont(const wxFont& font) = 0; + void SetOwnFont(const wxFont& font) + { + if ( SetFont(font) ) + m_inheritFont = false; + } + wxFont GetFont() const; + + // set/retrieve the cursor for this window (SetCursor() returns true + // if the cursor was really changed) + virtual bool SetCursor( const wxCursor &cursor ); + const wxCursor& GetCursor() const { return m_cursor; } + +#if wxUSE_CARET + // associate a caret with the window + void SetCaret(wxCaret *caret); + // get the current caret (may be NULL) + wxCaret *GetCaret() const { return m_caret; } +#endif // wxUSE_CARET + + // get the (average) character size for the current font + virtual int GetCharHeight() const = 0; + virtual int GetCharWidth() const = 0; + + // get the width/height/... of the text using current or specified + // font + virtual void GetTextExtent(const wxString& string, + int *x, int *y, + int *descent = (int *) NULL, + int *externalLeading = (int *) NULL, + const wxFont *theFont = (const wxFont *) NULL) + const = 0; + + // client <-> screen coords + // ------------------------ + + // translate to/from screen/client coordinates (pointers may be NULL) + void ClientToScreen( int *x, int *y ) const + { DoClientToScreen(x, y); } + void ScreenToClient( int *x, int *y ) const + { DoScreenToClient(x, y); } + + // wxPoint interface to do the same thing + wxPoint ClientToScreen(const wxPoint& pt) const + { + int x = pt.x, y = pt.y; + DoClientToScreen(&x, &y); + + return wxPoint(x, y); + } + + wxPoint ScreenToClient(const wxPoint& pt) const + { + int x = pt.x, y = pt.y; + DoScreenToClient(&x, &y); + + return wxPoint(x, y); + } + + // test where the given (in client coords) point lies + wxHitTest HitTest(wxCoord x, wxCoord y) const + { return DoHitTest(x, y); } + + wxHitTest HitTest(const wxPoint& pt) const + { return DoHitTest(pt.x, pt.y); } + + // misc + // ---- + + // get the window border style from the given flags: this is different from + // simply doing flags & wxBORDER_MASK because it uses GetDefaultBorder() to + // translate wxBORDER_DEFAULT to something reasonable + wxBorder GetBorder(long flags) const; + + // get border for the flags of this window + wxBorder GetBorder() const { return GetBorder(GetWindowStyleFlag()); } + + // send wxUpdateUIEvents to this window, and children if recurse is true + virtual void UpdateWindowUI(long flags = wxUPDATE_UI_NONE); + + // do the window-specific processing after processing the update event + virtual void DoUpdateWindowUI(wxUpdateUIEvent& event) ; + +#if wxUSE_MENUS + bool PopupMenu(wxMenu *menu, const wxPoint& pos = wxDefaultPosition) + { return DoPopupMenu(menu, pos.x, pos.y); } + bool PopupMenu(wxMenu *menu, int x, int y) + { return DoPopupMenu(menu, x, y); } +#endif // wxUSE_MENUS + + // override this method to return true for controls having multiple pages + virtual bool HasMultiplePages() const { return false; } + + + // scrollbars + // ---------- + + // does the window have the scrollbar for this orientation? + bool HasScrollbar(int orient) const + { + return (m_windowStyle & + (orient == wxHORIZONTAL ? wxHSCROLL : wxVSCROLL)) != 0; + } + + // configure the window scrollbars + virtual void SetScrollbar( int orient, + int pos, + int thumbvisible, + int range, + bool refresh = true ) = 0; + virtual void SetScrollPos( int orient, int pos, bool refresh = true ) = 0; + virtual int GetScrollPos( int orient ) const = 0; + virtual int GetScrollThumb( int orient ) const = 0; + virtual int GetScrollRange( int orient ) const = 0; + + // scroll window to the specified position + virtual void ScrollWindow( int dx, int dy, + const wxRect* rect = (wxRect *) NULL ) = 0; + + // scrolls window by line/page: note that not all controls support this + // + // return true if the position changed, false otherwise + virtual bool ScrollLines(int WXUNUSED(lines)) { return false; } + virtual bool ScrollPages(int WXUNUSED(pages)) { return false; } + + // convenient wrappers for ScrollLines/Pages + bool LineUp() { return ScrollLines(-1); } + bool LineDown() { return ScrollLines(1); } + bool PageUp() { return ScrollPages(-1); } + bool PageDown() { return ScrollPages(1); } + + // context-sensitive help + // ---------------------- + + // these are the convenience functions wrapping wxHelpProvider methods + +#if wxUSE_HELP + // associate this help text with this window + void SetHelpText(const wxString& text); + // associate this help text with all windows with the same id as this + // one + void SetHelpTextForId(const wxString& text); + // get the help string associated with the given position in this window + // + // notice that pt may be invalid if event origin is keyboard or unknown + // and this method should return the global window help text then + virtual wxString GetHelpTextAtPoint(const wxPoint& pt, + wxHelpEvent::Origin origin) const; + // returns the position-independent help text + wxString GetHelpText() const + { + return GetHelpTextAtPoint(wxDefaultPosition, wxHelpEvent::Origin_Unknown); + } + +#else // !wxUSE_HELP + // silently ignore SetHelpText() calls + void SetHelpText(const wxString& WXUNUSED(text)) { } + void SetHelpTextForId(const wxString& WXUNUSED(text)) { } +#endif // wxUSE_HELP + + // tooltips + // -------- + +#if wxUSE_TOOLTIPS + // the easiest way to set a tooltip for a window is to use this method + void SetToolTip( const wxString &tip ); + // attach a tooltip to the window + void SetToolTip( wxToolTip *tip ) { DoSetToolTip(tip); } + // get the associated tooltip or NULL if none + wxToolTip* GetToolTip() const { return m_tooltip; } + wxString GetToolTipText() const ; +#else + // make it much easier to compile apps in an environment + // that doesn't support tooltips, such as PocketPC + inline void SetToolTip( const wxString & WXUNUSED(tip) ) {} +#endif // wxUSE_TOOLTIPS + + // drag and drop + // ------------- +#if wxUSE_DRAG_AND_DROP + // set/retrieve the drop target associated with this window (may be + // NULL; it's owned by the window and will be deleted by it) + virtual void SetDropTarget( wxDropTarget *dropTarget ) = 0; + virtual wxDropTarget *GetDropTarget() const { return m_dropTarget; } +#endif // wxUSE_DRAG_AND_DROP + + // constraints and sizers + // ---------------------- +#if wxUSE_CONSTRAINTS + // set the constraints for this window or retrieve them (may be NULL) + void SetConstraints( wxLayoutConstraints *constraints ); + wxLayoutConstraints *GetConstraints() const { return m_constraints; } + + // implementation only + void UnsetConstraints(wxLayoutConstraints *c); + wxWindowList *GetConstraintsInvolvedIn() const + { return m_constraintsInvolvedIn; } + void AddConstraintReference(wxWindowBase *otherWin); + void RemoveConstraintReference(wxWindowBase *otherWin); + void DeleteRelatedConstraints(); + void ResetConstraints(); + + // these methods may be overridden for special layout algorithms + virtual void SetConstraintSizes(bool recurse = true); + virtual bool LayoutPhase1(int *noChanges); + virtual bool LayoutPhase2(int *noChanges); + virtual bool DoPhase(int phase); + + // these methods are virtual but normally won't be overridden + virtual void SetSizeConstraint(int x, int y, int w, int h); + virtual void MoveConstraint(int x, int y); + virtual void GetSizeConstraint(int *w, int *h) const ; + virtual void GetClientSizeConstraint(int *w, int *h) const ; + virtual void GetPositionConstraint(int *x, int *y) const ; + +#endif // wxUSE_CONSTRAINTS + + // when using constraints or sizers, it makes sense to update + // children positions automatically whenever the window is resized + // - this is done if autoLayout is on + void SetAutoLayout( bool autoLayout ) { m_autoLayout = autoLayout; } + bool GetAutoLayout() const { return m_autoLayout; } + + // lay out the window and its children + virtual bool Layout(); + + // sizers + void SetSizer(wxSizer *sizer, bool deleteOld = true ); + void SetSizerAndFit( wxSizer *sizer, bool deleteOld = true ); + + wxSizer *GetSizer() const { return m_windowSizer; } + + // Track if this window is a member of a sizer + void SetContainingSizer(wxSizer* sizer); + wxSizer *GetContainingSizer() const { return m_containingSizer; } + + // accessibility + // ---------------------- +#if wxUSE_ACCESSIBILITY + // Override to create a specific accessible object. + virtual wxAccessible* CreateAccessible(); + + // Sets the accessible object. + void SetAccessible(wxAccessible* accessible) ; + + // Returns the accessible object. + wxAccessible* GetAccessible() { return m_accessible; } + + // Returns the accessible object, creating if necessary. + wxAccessible* GetOrCreateAccessible() ; +#endif + + + // Set window transparency if the platform supports it + virtual bool SetTransparent(wxByte WXUNUSED(alpha)) { return false; } + virtual bool CanSetTransparent() { return false; } + + + // implementation + // -------------- + + // event handlers + void OnSysColourChanged( wxSysColourChangedEvent& event ); + void OnInitDialog( wxInitDialogEvent &event ); + void OnMiddleClick( wxMouseEvent& event ); +#if wxUSE_HELP + void OnHelp(wxHelpEvent& event); +#endif // wxUSE_HELP + + // virtual function for implementing internal idle + // behaviour + virtual void OnInternalIdle() {} + + // call internal idle recursively +// void ProcessInternalIdle() ; + + // get the handle of the window for the underlying window system: this + // is only used for wxWin itself or for user code which wants to call + // platform-specific APIs + virtual WXWidget GetHandle() const = 0; + // associate the window with a new native handle + virtual void AssociateHandle(WXWidget WXUNUSED(handle)) { } + // dissociate the current native handle from the window + virtual void DissociateHandle() { } + +#if wxUSE_PALETTE + // Store the palette used by DCs in wxWindow so that the dcs can share + // a palette. And we can respond to palette messages. + wxPalette GetPalette() const { return m_palette; } + + // When palette is changed tell the DC to set the system palette to the + // new one. + void SetPalette(const wxPalette& pal); + + // return true if we have a specific palette + bool HasCustomPalette() const { return m_hasCustomPalette; } + + // return the first parent window with a custom palette or NULL + wxWindow *GetAncestorWithCustomPalette() const; +#endif // wxUSE_PALETTE + + // inherit the parents visual attributes if they had been explicitly set + // by the user (i.e. we don't inherit default attributes) and if we don't + // have our own explicitly set + virtual void InheritAttributes(); + + // returns false from here if this window doesn't want to inherit the + // parents colours even if InheritAttributes() would normally do it + // + // this just provides a simple way to customize InheritAttributes() + // behaviour in the most common case + virtual bool ShouldInheritColours() const { return false; } + +protected: + // event handling specific to wxWindow + virtual bool TryValidator(wxEvent& event); + virtual bool TryParent(wxEvent& event); + + // common part of MoveBefore/AfterInTabOrder() + enum MoveKind + { + MoveBefore, // insert before the given window + MoveAfter // insert after the given window + }; + virtual void DoMoveInTabOrder(wxWindow *win, MoveKind move); + +#if wxUSE_CONSTRAINTS + // satisfy the constraints for the windows but don't set the window sizes + void SatisfyConstraints(); +#endif // wxUSE_CONSTRAINTS + + // Send the wxWindowDestroyEvent + void SendDestroyEvent(); + + // returns the main window of composite control; this is the window + // that FindFocus returns if the focus is in one of composite control's + // windows + virtual wxWindow *GetMainWindowOfCompositeControl() + { return (wxWindow*)this; } + + // the window id - a number which uniquely identifies a window among + // its siblings unless it is wxID_ANY + wxWindowID m_windowId; + + // the parent window of this window (or NULL) and the list of the children + // of this window + wxWindow *m_parent; + wxWindowList m_children; + + // the minimal allowed size for the window (no minimal size if variable(s) + // contain(s) wxDefaultCoord) + int m_minWidth, + m_minHeight, + m_maxWidth, + m_maxHeight; + + // event handler for this window: usually is just 'this' but may be + // changed with SetEventHandler() + wxEvtHandler *m_eventHandler; + +#if wxUSE_VALIDATORS + // associated validator or NULL if none + wxValidator *m_windowValidator; +#endif // wxUSE_VALIDATORS + +#if wxUSE_DRAG_AND_DROP + wxDropTarget *m_dropTarget; +#endif // wxUSE_DRAG_AND_DROP + + // visual window attributes + wxCursor m_cursor; + wxFont m_font; // see m_hasFont + wxColour m_backgroundColour, // m_hasBgCol + m_foregroundColour; // m_hasFgCol + +#if wxUSE_CARET + wxCaret *m_caret; +#endif // wxUSE_CARET + + // the region which should be repainted in response to paint event + wxRegion m_updateRegion; + +#if wxUSE_ACCEL + // the accelerator table for the window which translates key strokes into + // command events + wxAcceleratorTable m_acceleratorTable; +#endif // wxUSE_ACCEL + + // the tooltip for this window (may be NULL) +#if wxUSE_TOOLTIPS + wxToolTip *m_tooltip; +#endif // wxUSE_TOOLTIPS + + // constraints and sizers +#if wxUSE_CONSTRAINTS + // the constraints for this window or NULL + wxLayoutConstraints *m_constraints; + + // constraints this window is involved in + wxWindowList *m_constraintsInvolvedIn; +#endif // wxUSE_CONSTRAINTS + + // this window's sizer + wxSizer *m_windowSizer; + + // The sizer this window is a member of, if any + wxSizer *m_containingSizer; + + // Layout() window automatically when its size changes? + bool m_autoLayout:1; + + // window state + bool m_isShown:1; + bool m_isEnabled:1; + bool m_isBeingDeleted:1; + + // was the window colours/font explicitly changed by user? + bool m_hasBgCol:1; + bool m_hasFgCol:1; + bool m_hasFont:1; + + // and should it be inherited by children? + bool m_inheritBgCol:1; + bool m_inheritFgCol:1; + bool m_inheritFont:1; + + // window attributes + long m_windowStyle, + m_exStyle; + wxString m_windowName; + bool m_themeEnabled; + wxBackgroundStyle m_backgroundStyle; +#if wxUSE_PALETTE + wxPalette m_palette; + bool m_hasCustomPalette; +#endif // wxUSE_PALETTE + +#if wxUSE_ACCESSIBILITY + wxAccessible* m_accessible; +#endif + + // Virtual size (scrolling) + wxSize m_virtualSize; + + wxScrollHelper *m_scrollHelper; + + int m_minVirtualWidth; // VirtualSizeHints + int m_minVirtualHeight; + int m_maxVirtualWidth; + int m_maxVirtualHeight; + + wxWindowVariant m_windowVariant ; + + // override this to change the default (i.e. used when no style is + // specified) border for the window class + virtual wxBorder GetDefaultBorder() const; + + // Get the default size for the new window if no explicit size given. TLWs + // have their own default size so this is just for non top-level windows. + static int WidthDefault(int w) { return w == wxDefaultCoord ? 20 : w; } + static int HeightDefault(int h) { return h == wxDefaultCoord ? 20 : h; } + + + // Used to save the results of DoGetBestSize so it doesn't need to be + // recalculated each time the value is needed. + wxSize m_bestSizeCache; + + wxDEPRECATED( void SetBestSize(const wxSize& size) ); // use SetInitialSize + wxDEPRECATED( virtual void SetInitialBestSize(const wxSize& size) ); // use SetInitialSize + + + + // more pure virtual functions + // --------------------------- + + // NB: we must have DoSomething() function when Something() is an overloaded + // method: indeed, we can't just have "virtual Something()" in case when + // the function is overloaded because then we'd have to make virtual all + // the variants (otherwise only the virtual function may be called on a + // pointer to derived class according to C++ rules) which is, in + // general, absolutely not needed. So instead we implement all + // overloaded Something()s in terms of DoSomething() which will be the + // only one to be virtual. + + // coordinates translation + virtual void DoClientToScreen( int *x, int *y ) const = 0; + virtual void DoScreenToClient( int *x, int *y ) const = 0; + + virtual wxHitTest DoHitTest(wxCoord x, wxCoord y) const; + + // capture/release the mouse, used by Capture/ReleaseMouse() + virtual void DoCaptureMouse() = 0; + virtual void DoReleaseMouse() = 0; + + // retrieve the position/size of the window + virtual void DoGetPosition(int *x, int *y) const = 0; + virtual void DoGetScreenPosition(int *x, int *y) const; + virtual void DoGetSize(int *width, int *height) const = 0; + virtual void DoGetClientSize(int *width, int *height) const = 0; + + // get the size which best suits the window: for a control, it would be + // the minimal size which doesn't truncate the control, for a panel - the + // same size as it would have after a call to Fit() + virtual wxSize DoGetBestSize() const; + + // called from DoGetBestSize() to convert best virtual size (returned by + // the window sizer) to the best size for the window itself; this is + // overridden at wxScrolledWindow level to clump down virtual size to real + virtual wxSize GetWindowSizeForVirtualSize(const wxSize& size) const + { + return size; + } + + // this is the virtual function to be overriden in any derived class which + // wants to change how SetSize() or Move() works - it is called by all + // versions of these functions in the base class + virtual void DoSetSize(int x, int y, + int width, int height, + int sizeFlags = wxSIZE_AUTO) = 0; + + // same as DoSetSize() for the client size + virtual void DoSetClientSize(int width, int height) = 0; + + // move the window to the specified location and resize it: this is called + // from both DoSetSize() and DoSetClientSize() and would usually just + // reposition this window except for composite controls which will want to + // arrange themselves inside the given rectangle + // + // Important note: the coordinates passed to this method are in parent's + // *window* coordinates and not parent's client coordinates (as the values + // passed to DoSetSize and returned by DoGetPosition are)! + virtual void DoMoveWindow(int x, int y, int width, int height) = 0; + + // centre the window in the specified direction on parent, note that + // wxCENTRE_ON_SCREEN shouldn't be specified here, it only makes sense for + // TLWs + virtual void DoCentre(int dir); + +#if wxUSE_TOOLTIPS + virtual void DoSetToolTip( wxToolTip *tip ); +#endif // wxUSE_TOOLTIPS + +#if wxUSE_MENUS + virtual bool DoPopupMenu(wxMenu *menu, int x, int y) = 0; +#endif // wxUSE_MENUS + + // Makes an adjustment to the window position to make it relative to the + // parents client area, e.g. if the parent is a frame with a toolbar, its + // (0, 0) is just below the toolbar + virtual void AdjustForParentClientOrigin(int& x, int& y, + int sizeFlags = 0) const; + + // implements the window variants + virtual void DoSetWindowVariant( wxWindowVariant variant ) ; + + // Must be called when mouse capture is lost to send + // wxMouseCaptureLostEvent to windows on capture stack. + static void NotifyCaptureLost(); + +private: + // contains the last id generated by NewControlId + static int ms_lastControlId; + + // the stack of windows which have captured the mouse + static struct WXDLLIMPEXP_FWD_CORE wxWindowNext *ms_winCaptureNext; + // the window that currently has mouse capture + static wxWindow *ms_winCaptureCurrent; + // indicates if execution is inside CaptureMouse/ReleaseMouse + static bool ms_winCaptureChanging; + + DECLARE_ABSTRACT_CLASS(wxWindowBase) + DECLARE_NO_COPY_CLASS(wxWindowBase) + DECLARE_EVENT_TABLE() +}; + + + +// Inlines for some deprecated methods +inline wxSize wxWindowBase::GetBestFittingSize() const +{ + return GetEffectiveMinSize(); +} + +inline void wxWindowBase::SetBestFittingSize(const wxSize& size) +{ + SetInitialSize(size); +} + +inline void wxWindowBase::SetBestSize(const wxSize& size) +{ + SetInitialSize(size); +} + +inline void wxWindowBase::SetInitialBestSize(const wxSize& size) +{ + SetInitialSize(size); +} + + +// ---------------------------------------------------------------------------- +// now include the declaration of wxWindow class +// ---------------------------------------------------------------------------- + +// include the declaration of the platform-specific class +#if defined(__WXPALMOS__) + #ifdef __WXUNIVERSAL__ + #define wxWindowNative wxWindowPalm + #else // !wxUniv + #define wxWindowPalm wxWindow + #endif // wxUniv/!wxUniv + #include "wx/palmos/window.h" +#elif defined(__WXMSW__) + #ifdef __WXUNIVERSAL__ + #define wxWindowNative wxWindowMSW + #else // !wxUniv + #define wxWindowMSW wxWindow + #endif // wxUniv/!wxUniv + #include "wx/msw/window.h" +#elif defined(__WXMOTIF__) + #include "wx/motif/window.h" +#elif defined(__WXGTK20__) + #ifdef __WXUNIVERSAL__ + #define wxWindowNative wxWindowGTK + #else // !wxUniv + #define wxWindowGTK wxWindow + #endif // wxUniv + #include "wx/gtk/window.h" +#elif defined(__WXGTK__) + #ifdef __WXUNIVERSAL__ + #define wxWindowNative wxWindowGTK + #else // !wxUniv + #define wxWindowGTK wxWindow + #endif // wxUniv + #include "wx/gtk1/window.h" +#elif defined(__WXX11__) + #ifdef __WXUNIVERSAL__ + #define wxWindowNative wxWindowX11 + #else // !wxUniv + #define wxWindowX11 wxWindow + #endif // wxUniv + #include "wx/x11/window.h" +#elif defined(__WXMGL__) + #define wxWindowNative wxWindowMGL + #include "wx/mgl/window.h" +#elif defined(__WXDFB__) + #define wxWindowNative wxWindowDFB + #include "wx/dfb/window.h" +#elif defined(__WXMAC__) + #ifdef __WXUNIVERSAL__ + #define wxWindowNative wxWindowMac + #else // !wxUniv + #define wxWindowMac wxWindow + #endif // wxUniv + #include "wx/mac/window.h" +#elif defined(__WXCOCOA__) + #ifdef __WXUNIVERSAL__ + #define wxWindowNative wxWindowCocoa + #else // !wxUniv + #define wxWindowCocoa wxWindow + #endif // wxUniv + #include "wx/cocoa/window.h" +#elif defined(__WXPM__) + #ifdef __WXUNIVERSAL__ + #define wxWindowNative wxWindowOS2 + #else // !wxUniv + #define wxWindowOS2 wxWindow + #endif // wxUniv/!wxUniv + #include "wx/os2/window.h" +#endif + +// for wxUniversal, we now derive the real wxWindow from wxWindow<platform>, +// for the native ports we already have defined it above +#if defined(__WXUNIVERSAL__) + #ifndef wxWindowNative + #error "wxWindowNative must be defined above!" + #endif + + #include "wx/univ/window.h" +#endif // wxUniv + +// ---------------------------------------------------------------------------- +// inline functions which couldn't be declared in the class body because of +// forward dependencies +// ---------------------------------------------------------------------------- + +inline wxWindow *wxWindowBase::GetGrandParent() const +{ + return m_parent ? m_parent->GetParent() : (wxWindow *)NULL; +} + +// ---------------------------------------------------------------------------- +// global functions +// ---------------------------------------------------------------------------- + +// Find the wxWindow at the current mouse position, also returning the mouse +// position. +extern WXDLLEXPORT wxWindow* wxFindWindowAtPointer(wxPoint& pt); + +// Get the current mouse position. +extern WXDLLEXPORT wxPoint wxGetMousePosition(); + +// get the currently active window of this application or NULL +extern WXDLLEXPORT wxWindow *wxGetActiveWindow(); + +// get the (first) top level parent window +WXDLLEXPORT wxWindow* wxGetTopLevelParent(wxWindow *win); + +#if WXWIN_COMPATIBILITY_2_6 + // deprecated (doesn't start with 'wx' prefix), use wxWindow::NewControlId() + wxDEPRECATED( int NewControlId() ); + inline int NewControlId() { return wxWindowBase::NewControlId(); } +#endif // WXWIN_COMPATIBILITY_2_6 + +#if wxUSE_ACCESSIBILITY +// ---------------------------------------------------------------------------- +// accessible object for windows +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxWindowAccessible: public wxAccessible +{ +public: + wxWindowAccessible(wxWindow* win): wxAccessible(win) { if (win) win->SetAccessible(this); } + virtual ~wxWindowAccessible() {} + +// Overridables + + // Can return either a child object, or an integer + // representing the child element, starting from 1. + virtual wxAccStatus HitTest(const wxPoint& pt, int* childId, wxAccessible** childObject); + + // Returns the rectangle for this object (id = 0) or a child element (id > 0). + virtual wxAccStatus GetLocation(wxRect& rect, int elementId); + + // Navigates from fromId to toId/toObject. + virtual wxAccStatus Navigate(wxNavDir navDir, int fromId, + int* toId, wxAccessible** toObject); + + // Gets the name of the specified object. + virtual wxAccStatus GetName(int childId, wxString* name); + + // Gets the number of children. + virtual wxAccStatus GetChildCount(int* childCount); + + // Gets the specified child (starting from 1). + // If *child is NULL and return value is wxACC_OK, + // this means that the child is a simple element and + // not an accessible object. + virtual wxAccStatus GetChild(int childId, wxAccessible** child); + + // Gets the parent, or NULL. + virtual wxAccStatus GetParent(wxAccessible** parent); + + // Performs the default action. childId is 0 (the action for this object) + // or > 0 (the action for a child). + // Return wxACC_NOT_SUPPORTED if there is no default action for this + // window (e.g. an edit control). + virtual wxAccStatus DoDefaultAction(int childId); + + // Gets the default action for this object (0) or > 0 (the action for a child). + // Return wxACC_OK even if there is no action. actionName is the action, or the empty + // string if there is no action. + // The retrieved string describes the action that is performed on an object, + // not what the object does as a result. For example, a toolbar button that prints + // a document has a default action of "Press" rather than "Prints the current document." + virtual wxAccStatus GetDefaultAction(int childId, wxString* actionName); + + // Returns the description for this object or a child. + virtual wxAccStatus GetDescription(int childId, wxString* description); + + // Returns help text for this object or a child, similar to tooltip text. + virtual wxAccStatus GetHelpText(int childId, wxString* helpText); + + // Returns the keyboard shortcut for this object or child. + // Return e.g. ALT+K + virtual wxAccStatus GetKeyboardShortcut(int childId, wxString* shortcut); + + // Returns a role constant. + virtual wxAccStatus GetRole(int childId, wxAccRole* role); + + // Returns a state constant. + virtual wxAccStatus GetState(int childId, long* state); + + // Returns a localized string representing the value for the object + // or child. + virtual wxAccStatus GetValue(int childId, wxString* strValue); + + // Selects the object or child. + virtual wxAccStatus Select(int childId, wxAccSelectionFlags selectFlags); + + // Gets the window with the keyboard focus. + // If childId is 0 and child is NULL, no object in + // this subhierarchy has the focus. + // If this object has the focus, child should be 'this'. + virtual wxAccStatus GetFocus(int* childId, wxAccessible** child); + +#if wxUSE_VARIANT + // Gets a variant representing the selected children + // of this object. + // Acceptable values: + // - a null variant (IsNull() returns true) + // - a list variant (GetType() == wxT("list") + // - an integer representing the selected child element, + // or 0 if this object is selected (GetType() == wxT("long") + // - a "void*" pointer to a wxAccessible child object + virtual wxAccStatus GetSelections(wxVariant* selections); +#endif // wxUSE_VARIANT +}; + +#endif // wxUSE_ACCESSIBILITY + + +#endif // _WX_WINDOW_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/wizard.h b/Externals/wxWidgets/include/wx/wizard.h new file mode 100644 index 0000000000..3b7d3e477f --- /dev/null +++ b/Externals/wxWidgets/include/wx/wizard.h @@ -0,0 +1,317 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wizard.h +// Purpose: wxWizard class: a GUI control presenting the user with a +// sequence of dialogs which allows to simply perform some task +// Author: Vadim Zeitlin (partly based on work by Ron Kuris and Kevin B. +// Smith) +// Modified by: Robert Cavanaugh +// Added capability to use .WXR resource files in Wizard pages +// Added wxWIZARD_HELP event +// Robert Vazan (sizers) +// Created: 15.08.99 +// RCS-ID: $Id: wizard.h 35858 2005-10-09 15:48:42Z MBN $ +// Copyright: (c) 1999 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_WIZARD_H_ +#define _WX_WIZARD_H_ + +#include "wx/defs.h" + +#if wxUSE_WIZARDDLG + +// ---------------------------------------------------------------------------- +// headers and other simple declarations +// ---------------------------------------------------------------------------- + +#include "wx/dialog.h" // the base class +#include "wx/panel.h" // ditto +#include "wx/event.h" // wxEVT_XXX constants +#include "wx/bitmap.h" + +// Extended style to specify a help button +#define wxWIZARD_EX_HELPBUTTON 0x00000010 + +// forward declarations +class WXDLLIMPEXP_ADV wxWizard; + +// ---------------------------------------------------------------------------- +// wxWizardPage is one of the wizards screen: it must know what are the +// following and preceding pages (which may be NULL for the first/last page). +// +// Other than GetNext/Prev() functions, wxWizardPage is just a panel and may be +// used as such (i.e. controls may be placed directly on it &c). +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxWizardPage : public wxPanel +{ +public: + wxWizardPage() { Init(); } + + // ctor accepts an optional bitmap which will be used for this page instead + // of the default one for this wizard (should be of the same size). Notice + // that no other parameters are needed because the wizard will resize and + // reposition the page anyhow + wxWizardPage(wxWizard *parent, + const wxBitmap& bitmap = wxNullBitmap, + const wxChar* resource = NULL); + + bool Create(wxWizard *parent, + const wxBitmap& bitmap = wxNullBitmap, + const wxChar* resource = NULL); + + // these functions are used by the wizard to show another page when the + // user chooses "Back" or "Next" button + virtual wxWizardPage *GetPrev() const = 0; + virtual wxWizardPage *GetNext() const = 0; + + // default GetBitmap() will just return m_bitmap which is ok in 99% of + // cases - override this method if you want to create the bitmap to be used + // dynamically or to do something even more fancy. It's ok to return + // wxNullBitmap from here - the default one will be used then. + virtual wxBitmap GetBitmap() const { return m_bitmap; } + +#if wxUSE_VALIDATORS + // Override the base functions to allow a validator to be assigned to this page. + virtual bool TransferDataToWindow() + { + return GetValidator() ? GetValidator()->TransferToWindow() + : wxPanel::TransferDataToWindow(); + } + + virtual bool TransferDataFromWindow() + { + return GetValidator() ? GetValidator()->TransferFromWindow() + : wxPanel::TransferDataFromWindow(); + } + + virtual bool Validate() + { + return GetValidator() ? GetValidator()->Validate(this) + : wxPanel::Validate(); + } +#endif // wxUSE_VALIDATORS + +protected: + // common part of ctors: + void Init(); + + wxBitmap m_bitmap; + +private: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxWizardPage) +}; + +// ---------------------------------------------------------------------------- +// wxWizardPageSimple just returns the pointers given to the ctor and is useful +// to create a simple wizard where the order of pages never changes. +// +// OTOH, it is also possible to dynamicly decide which page to return (i.e. +// depending on the user's choices) as the wizard sample shows - in order to do +// this, you must derive from wxWizardPage directly. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxWizardPageSimple : public wxWizardPage +{ +public: + wxWizardPageSimple() { Init(); } + + // ctor takes the previous and next pages + wxWizardPageSimple(wxWizard *parent, + wxWizardPage *prev = (wxWizardPage *)NULL, + wxWizardPage *next = (wxWizardPage *)NULL, + const wxBitmap& bitmap = wxNullBitmap, + const wxChar* resource = NULL) + { + Create(parent, prev, next, bitmap, resource); + } + + bool Create(wxWizard *parent = NULL, // let it be default ctor too + wxWizardPage *prev = (wxWizardPage *)NULL, + wxWizardPage *next = (wxWizardPage *)NULL, + const wxBitmap& bitmap = wxNullBitmap, + const wxChar* resource = NULL) + { + m_prev = prev; + m_next = next; + return wxWizardPage::Create(parent, bitmap, resource); + } + + // the pointers may be also set later - but before starting the wizard + void SetPrev(wxWizardPage *prev) { m_prev = prev; } + void SetNext(wxWizardPage *next) { m_next = next; } + + // a convenience function to make the pages follow each other + static void Chain(wxWizardPageSimple *first, wxWizardPageSimple *second) + { + wxCHECK_RET( first && second, + wxT("NULL passed to wxWizardPageSimple::Chain") ); + + first->SetNext(second); + second->SetPrev(first); + } + + // base class pure virtuals + virtual wxWizardPage *GetPrev() const; + virtual wxWizardPage *GetNext() const; + +private: + // common part of ctors: + void Init() + { + m_prev = m_next = NULL; + } + + // pointers are private, the derived classes shouldn't mess with them - + // just derive from wxWizardPage directly to implement different behaviour + wxWizardPage *m_prev, + *m_next; + + DECLARE_DYNAMIC_CLASS_NO_COPY(wxWizardPageSimple) +}; + +// ---------------------------------------------------------------------------- +// wxWizard +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxWizardBase : public wxDialog +{ +public: + /* + The derived class (i.e. the real wxWizard) has a ctor and Create() + function taking the following arguments: + + wxWizard(wxWindow *parent, + int id = wxID_ANY, + const wxString& title = wxEmptyString, + const wxBitmap& bitmap = wxNullBitmap, + const wxPoint& pos = wxDefaultPosition, + long style = wxDEFAULT_DIALOG_STYLE); + */ + wxWizardBase() { } + + // executes the wizard starting from the given page, returns true if it was + // successfully finished, false if user cancelled it + virtual bool RunWizard(wxWizardPage *firstPage) = 0; + + // get the current page (NULL if RunWizard() isn't running) + virtual wxWizardPage *GetCurrentPage() const = 0; + + // set the min size which should be available for the pages: a + // wizard will take into account the size of the bitmap (if any) + // itself and will never be less than some predefined fixed size + virtual void SetPageSize(const wxSize& size) = 0; + + // get the size available for the page + virtual wxSize GetPageSize() const = 0; + + // set the best size for the wizard, i.e. make it big enough to contain all + // of the pages starting from the given one + // + // this function may be called several times and possible with different + // pages in which case it will only increase the page size if needed (this + // may be useful if not all pages are accessible from the first one by + // default) + virtual void FitToPage(const wxWizardPage *firstPage) = 0; + + // Adding pages to page area sizer enlarges wizard + virtual wxSizer *GetPageAreaSizer() const = 0; + + // Set border around page area. Default is 0 if you add at least one + // page to GetPageAreaSizer and 5 if you don't. + virtual void SetBorder(int border) = 0; + + // the methods below may be overridden by the derived classes to provide + // custom logic for determining the pages order + + virtual bool HasNextPage(wxWizardPage *page) + { return page->GetNext() != NULL; } + + virtual bool HasPrevPage(wxWizardPage *page) + { return page->GetPrev() != NULL; } + + /// Override these functions to stop InitDialog from calling TransferDataToWindow + /// for _all_ pages when the wizard starts. Instead 'ShowPage' will call + /// TransferDataToWindow for the first page only. + bool TransferDataToWindow() { return true; } + bool TransferDataFromWindow() { return true; } + bool Validate() { return true; } + +private: + DECLARE_NO_COPY_CLASS(wxWizardBase) +}; + +// include the real class declaration +#include "wx/generic/wizard.h" + +// ---------------------------------------------------------------------------- +// wxWizardEvent class represents an event generated by the wizard: this event +// is first sent to the page itself and, if not processed there, goes up the +// window hierarchy as usual +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxWizardEvent : public wxNotifyEvent +{ +public: + wxWizardEvent(wxEventType type = wxEVT_NULL, + int id = wxID_ANY, + bool direction = true, + wxWizardPage* page = NULL); + + // for EVT_WIZARD_PAGE_CHANGING, return true if we're going forward or + // false otherwise and for EVT_WIZARD_PAGE_CHANGED return true if we came + // from the previous page and false if we returned from the next one + // (this function doesn't make sense for CANCEL events) + bool GetDirection() const { return m_direction; } + + wxWizardPage* GetPage() const { return m_page; } + +private: + bool m_direction; + wxWizardPage* m_page; + + DECLARE_DYNAMIC_CLASS(wxWizardEvent) + DECLARE_NO_COPY_CLASS(wxWizardEvent) +}; + +// ---------------------------------------------------------------------------- +// macros for handling wxWizardEvents +// ---------------------------------------------------------------------------- + +BEGIN_DECLARE_EVENT_TYPES() + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_WIZARD_PAGE_CHANGED, 900) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_WIZARD_PAGE_CHANGING, 901) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_WIZARD_CANCEL, 902) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_WIZARD_HELP, 903) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_WIZARD_FINISHED, 903) +END_DECLARE_EVENT_TYPES() + +typedef void (wxEvtHandler::*wxWizardEventFunction)(wxWizardEvent&); + +#define wxWizardEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxWizardEventFunction, &func) + +#define wx__DECLARE_WIZARDEVT(evt, id, fn) \ + wx__DECLARE_EVT1(wxEVT_WIZARD_ ## evt, id, wxWizardEventHandler(fn)) + +// notifies that the page has just been changed (can't be vetoed) +#define EVT_WIZARD_PAGE_CHANGED(id, fn) wx__DECLARE_WIZARDEVT(PAGE_CHANGED, id, fn) + +// the user pressed "<Back" or "Next>" button and the page is going to be +// changed - unless the event handler vetoes the event +#define EVT_WIZARD_PAGE_CHANGING(id, fn) wx__DECLARE_WIZARDEVT(PAGE_CHANGING, id, fn) + +// the user pressed "Cancel" button and the wizard is going to be dismissed - +// unless the event handler vetoes the event +#define EVT_WIZARD_CANCEL(id, fn) wx__DECLARE_WIZARDEVT(CANCEL, id, fn) + +// the user pressed "Finish" button and the wizard is going to be dismissed - +#define EVT_WIZARD_FINISHED(id, fn) wx__DECLARE_WIZARDEVT(FINISHED, id, fn) + +// the user pressed "Help" button +#define EVT_WIZARD_HELP(id, fn) wx__DECLARE_WIZARDEVT(HELP, id, fn) + +#endif // wxUSE_WIZARDDLG + +#endif // _WX_WIZARD_H_ diff --git a/Externals/wxWidgets/include/wx/wupdlock.h b/Externals/wxWidgets/include/wx/wupdlock.h new file mode 100644 index 0000000000..c30ae00b17 --- /dev/null +++ b/Externals/wxWidgets/include/wx/wupdlock.h @@ -0,0 +1,37 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/wupdlock.h +// Purpose: wxWindowUpdateLocker prevents window redrawing +// Author: Vadim Zeitlin +// Created: 2006-03-06 +// RCS-ID: $Id: wupdlock.h 37842 2006-03-07 01:50:21Z VZ $ +// Copyright: (c) 2006 Vadim Zeitlin <vadim@wxwindows.org> +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_WUPDLOCK_H_ +#define _WX_WUPDLOCK_H_ + +#include "wx/window.h" + +// ---------------------------------------------------------------------------- +// wxWindowUpdateLocker prevents updates to the window during its lifetime +// ---------------------------------------------------------------------------- + +class wxWindowUpdateLocker +{ +public: + // create an object preventing updates of the given window (which must have + // a lifetime at least as great as ours) + wxWindowUpdateLocker(wxWindow *win) : m_win(win) { win->Freeze(); } + + // dtor thaws the window to permit updates again + ~wxWindowUpdateLocker() { m_win->Thaw(); } + +private: + wxWindow *m_win; + + DECLARE_NO_COPY_CLASS(wxWindowUpdateLocker) +}; + +#endif // _WX_WUPDLOCK_H_ + diff --git a/Externals/wxWidgets/include/wx/wx.h b/Externals/wxWidgets/include/wx/wx.h new file mode 100644 index 0000000000..8c71e8ba1b --- /dev/null +++ b/Externals/wxWidgets/include/wx/wx.h @@ -0,0 +1,105 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/wx.h +// Purpose: wxWidgets central header including the most often used ones +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: wx.h 40943 2006-08-31 19:31:43Z ABX $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_WX_H_ +#define _WX_WX_H_ + +#include "wx/defs.h" +#include "wx/object.h" +#include "wx/dynarray.h" +#include "wx/list.h" +#include "wx/hash.h" +#include "wx/string.h" +#include "wx/hashmap.h" +#include "wx/arrstr.h" +#include "wx/intl.h" +#include "wx/log.h" +#include "wx/event.h" +#include "wx/app.h" +#include "wx/utils.h" +#include "wx/stream.h" +#include "wx/memory.h" +#include "wx/math.h" +#include "wx/stopwatch.h" +#include "wx/module.h" + +#if wxUSE_GUI + +#include "wx/window.h" +#include "wx/containr.h" +#include "wx/panel.h" +#include "wx/toplevel.h" +#include "wx/frame.h" +#include "wx/gdicmn.h" +#include "wx/gdiobj.h" +#include "wx/region.h" +#include "wx/bitmap.h" +#include "wx/image.h" +#include "wx/colour.h" +#include "wx/font.h" +#include "wx/dc.h" +#include "wx/dcclient.h" +#include "wx/dcmemory.h" +#include "wx/dcprint.h" +#include "wx/dcscreen.h" +#include "wx/button.h" +#include "wx/menuitem.h" +#include "wx/menu.h" +#include "wx/pen.h" +#include "wx/brush.h" +#include "wx/palette.h" +#include "wx/icon.h" +#include "wx/cursor.h" +#include "wx/dialog.h" +#include "wx/timer.h" +#include "wx/settings.h" +#include "wx/msgdlg.h" +#include "wx/cmndata.h" +#include "wx/dataobj.h" + +#include "wx/control.h" +#include "wx/ctrlsub.h" +#include "wx/bmpbuttn.h" +#include "wx/checkbox.h" +#include "wx/checklst.h" +#include "wx/choice.h" +#include "wx/scrolbar.h" +#include "wx/stattext.h" +#include "wx/statbmp.h" +#include "wx/statbox.h" +#include "wx/listbox.h" +#include "wx/radiobox.h" +#include "wx/radiobut.h" +#include "wx/textctrl.h" +#include "wx/slider.h" +#include "wx/gauge.h" +#include "wx/scrolwin.h" +#include "wx/dirdlg.h" +#include "wx/toolbar.h" +#include "wx/combobox.h" +#include "wx/layout.h" +#include "wx/sizer.h" +#include "wx/mdi.h" +#include "wx/statusbr.h" +#include "wx/choicdlg.h" +#include "wx/textdlg.h" +#include "wx/filedlg.h" + +// always include, even if !wxUSE_VALIDATORS because we need wxDefaultValidator +#include "wx/validate.h" + +#if wxUSE_VALIDATORS + #include "wx/valtext.h" +#endif // wxUSE_VALIDATORS + +#endif // wxUSE_GUI + +#endif // _WX_WX_H_ diff --git a/Externals/wxWidgets/include/wx/wx_cw.h b/Externals/wxWidgets/include/wx/wx_cw.h new file mode 100644 index 0000000000..ff1ac56311 --- /dev/null +++ b/Externals/wxWidgets/include/wx/wx_cw.h @@ -0,0 +1,65 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx_cw.h +// Purpose: wxWidgets definitions for CodeWarrior builds +// Author: Stefan Csomor +// Modified by: +// Created: 12/10/98 +// RCS-ID: $Id: wx_cw.h 29319 2004-09-24 14:32:35Z ABX $ +// Copyright: (c) Stefan Csomor +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CW__ +#define _WX_CW__ + +#if __MWERKS__ >= 0x2400 +#pragma old_argmatch on +#endif + +#if __option(profile) +#ifdef __cplusplus + #if __POWERPC__ + #include <wx_PPC++_prof.mch> + #elif __INTEL__ + #include <wx_x86++_prof.mch> + #elif __CFM68K__ + #include <wx_cfm++_prof.mch> + #else + #include <wx_68k++_prof.mch> + #endif +#else + #if __POWERPC__ + #include <wx_PPC_prof.mch> + #elif __INTEL__ + #include <wx_x86_prof.mch> + #elif __CFM68K__ + #include <wx_cfm_prof.mch> + #else + #include <wx_68k_prof.mch> + #endif +#endif +#else +#ifdef __cplusplus + #if __POWERPC__ + #include <wx_PPC++.mch> + #elif __INTEL__ + #include <wx_x86++.mch> + #elif __CFM68K__ + #include <wx_cfm++.mch> + #else + #include <wx_68k++.mch> + #endif +#else + #if __POWERPC__ + #include <wx_PPC.mch> + #elif __INTEL__ + #include <wx_x86.mch> + #elif __CFM68K__ + #include <wx_cfm.mch> + #else + #include <wx_68k.mch> + #endif +#endif +#endif +#endif + // _WX_CW__ diff --git a/Externals/wxWidgets/include/wx/wx_cw_cm.h b/Externals/wxWidgets/include/wx/wx_cw_cm.h new file mode 100644 index 0000000000..047facf15e --- /dev/null +++ b/Externals/wxWidgets/include/wx/wx_cw_cm.h @@ -0,0 +1,88 @@ +/* + Name: wx/wx_cw_cm.h + Purpose: wxWidgets definitions for CodeWarrior builds + Author: Stefan Csomor + Modified by: + Created: + RCS-ID: $Id: wx_cw_cm.h 42655 2006-10-29 20:17:29Z VZ $ + Copyright: (c) Stefan Csomor + Licence: wxWindows licence +*/ + +#define MSL_USE_PRECOMPILED_HEADERS 0 +#if __WXDEBUG__ + // mac os assert levels + #define DEBUG 1 + #define DEBUG_INTERNAL 1 +#endif +#if !defined( __MWERKS__ ) + #error "this file is only for builds with Metrowerks CodeWarrior" +#endif + +// defined if the compiler does not want the classname repeated for inlines +// within a class definition +#define WX_COMP_INLINE_NO_CLASS + +#if __MWERKS__ >= 0x2400 && __MWERKS__ < 0x3200 + #pragma old_argmatch on +#endif + +#if (__MWERKS__ < 0x0900) || macintosh || __MACH__ + #define __MAC__ + #define __WXMAC__ +#elif (__MWERKS__ >= 0x0900) && __INTEL__ + #define WIN32 + #define _WINDOWS + #define __WXMSW__ + #define __WINDOWS__ + #define __WIN95__ + #define __WIN32__ + #define STRICT + #define NOMINMAX +#elif __BEOS__ + #include <ansi_prefix.be.h> + #include <Be.h> +#else + #error unknown MW compiler +#endif + +#ifdef __WXMSW__ + #include <ansi_prefix.win32.h> + #include <ansi_parms.h> + #ifdef __MWERKS__ + #if defined( __MSL__ ) && __MSL__ >= 0x5012 && __MSL__ < 0x7000 + #define fileno _fileno + #define fdopen _fdopen + #define tell _tell + #endif + #endif +#elif defined( __WXMAC__) + /* Set to 0 if you don't want to use precompiled MacHeaders */ + #define USE_PRECOMPILED_MAC_HEADERS 0 + #define ACCESSOR_CALLS_ARE_FUNCTIONS 1 + #define OPAQUE_TOOLBOX_STRUCTS 1 + + /* CW8.3+ has mbstate_t */ + #if defined(__MACH__) && __MWERKS__ < 0x3003 + typedef int mbstate_t; + #define _MBSTATE_T + #endif + + /* CW8.3+ has ssize_t */ + #if defined(__MACH__) && __MWERKS__ >= 0x3003 + #define HAVE_SSIZE_T + #endif + + #include <mslconfig> + // for getting the correct expat includes + #define MACOS_CLASSIC + /* + #include <MacTypes.h> + #if UNIVERSAL_INTERFACES_VERSION < 0x0340 + #error "please update to Apple's lastest universal headers from http://developer.apple.com/sdk/" + #endif + */ +#endif + +#define USE_DEFINE + diff --git a/Externals/wxWidgets/include/wx/wx_cw_d.h b/Externals/wxWidgets/include/wx/wx_cw_d.h new file mode 100644 index 0000000000..802a75f329 --- /dev/null +++ b/Externals/wxWidgets/include/wx/wx_cw_d.h @@ -0,0 +1,46 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx_cw_d.h +// Purpose: wxWidgets definitions for CodeWarrior builds (Debug) +// Author: Stefan Csomor +// Modified by: +// Created: 12/10/98 +// RCS-ID: $Id: wx_cw_d.h 29319 2004-09-24 14:32:35Z ABX $ +// Copyright: (c) Stefan Csomor +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CW__ +#define _WX_CW__ + +#if __MWERKS__ >= 0x2400 && __MWERKS__ < 0x3200 +#pragma old_argmatch on +#endif + +#if __option(profile) +#error "profiling is not supported in debug versions" +#else +#ifdef __cplusplus + #if __POWERPC__ + #include <wx_PPC++_d.mch> + #elif __INTEL__ + #include <wx_x86++_d.mch> + #elif __CFM68K__ + #include <wx_cfm++_d.mch> + #else + #include <wx_68k++_d.mch> + #endif +#else + #if __POWERPC__ + #include <wx_PPC_d.mch> + #elif __INTEL__ + #include <wx_x86_d.mch> + #elif __CFM68K__ + #include <wx_cfm_d.mch> + #else + #include <wx_68k_d.mch> + #endif +#endif +#endif + +#endif + // _WX_CW__ diff --git a/Externals/wxWidgets/include/wx/wx_cwc.h b/Externals/wxWidgets/include/wx/wx_cwc.h new file mode 100644 index 0000000000..2ffd81f13b --- /dev/null +++ b/Externals/wxWidgets/include/wx/wx_cwc.h @@ -0,0 +1,49 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx_cw.h +// Purpose: wxWidgets definitions for CodeWarrior builds +// Author: Stefan Csomor +// Modified by: +// Created: 12/10/98 +// RCS-ID: $Id: wx_cwc.h 36967 2006-01-18 14:13:20Z JS $ +// Copyright: (c) Stefan Csomor +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CW__ +#define _WX_CW__ + +#if __MWERKS__ >= 0x2400 && __MWERKS__ < 0x3200 + #pragma old_argmatch on +#endif + +#if __option(profile) +#ifdef __cplusplus + #ifdef __MACH__ + #include "wx_Mach++_prof.mch" + #elif __POWERPC__ + #include "wx_Carbon++_prof.mch" + #endif +#else + #ifdef __MACH__ + #include "wx_Mach_prof.mch" + #elif __POWERPC__ + #include "wx_Carbon_prof.mch" + #endif +#endif +#else +#ifdef __cplusplus + #ifdef __MACH__ + #include "wx_Mach++.mch" + #elif __POWERPC__ + #include "wx_Carbon++.mch" + #endif +#else + #ifdef __MACH__ + #include "wx_Mach.mch" + #elif __POWERPC__ + #include "wx_Carbon.mch" + #endif +#endif +#endif +#endif + // _WX_CW__ diff --git a/Externals/wxWidgets/include/wx/wx_cwc_d.h b/Externals/wxWidgets/include/wx/wx_cwc_d.h new file mode 100644 index 0000000000..6bc69e26c1 --- /dev/null +++ b/Externals/wxWidgets/include/wx/wx_cwc_d.h @@ -0,0 +1,38 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx_cw_d.h +// Purpose: wxWidgets definitions for CodeWarrior builds (Debug) +// Author: Stefan Csomor +// Modified by: +// Created: 12/10/98 +// RCS-ID: $Id: wx_cwc_d.h 36967 2006-01-18 14:13:20Z JS $ +// Copyright: (c) Stefan Csomor +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CW__ +#define _WX_CW__ + +#if __MWERKS__ >= 0x2400 && __MWERKS__ < 0x3200 + #pragma old_argmatch on +#endif + +#if __option(profile) +#error "profiling is not supported in debug versions" +#else +#ifdef __cplusplus + #ifdef __MACH__ + #include "wx_Mach++_d.mch" + #elif __POWERPC__ + #include "wx_Carbon++_d.mch" + #endif +#else + #ifdef __MACH__ + #include "wx_Mach_d.mch" + #elif __POWERPC__ + #include "wx_Carbon_d.mch" + #endif +#endif +#endif + +#endif + // _WX_CW__ diff --git a/Externals/wxWidgets/include/wx/wx_cwcocoa.h b/Externals/wxWidgets/include/wx/wx_cwcocoa.h new file mode 100644 index 0000000000..9c1d254958 --- /dev/null +++ b/Externals/wxWidgets/include/wx/wx_cwcocoa.h @@ -0,0 +1,66 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: include/wx/wx_cwcocoa.h +// Purpose: Metrowerks Prefix Header File (wxCocoa Release) +// Author: Tommy Tian (tommy.tian@webex.com) +// Modified by: David Elliott +// Created: 10/22/2004 +// RCS-ID: $Id: wx_cwcocoa.h 30235 2004-11-02 06:22:11Z DE $ +// Copyright: (c) Tommy Tian +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CW_COCOA__ +#define _WX_CW_COCOA__ + +#if __MWERKS__ >= 0x2400 && __MWERKS__ <= 0x3200 +#pragma old_argmatch on +#endif + +#if __option(profile) +#ifdef __cplusplus + #ifdef __OBJC__ + #if __mwlinker__ + #include "wx_cocoaMacOSXmm_prof.mch" + #else + #include "wx_cocoaMach-Omm_prof.mch" + #endif + #else + #if __mwlinker__ + #include "wx_cocoaMacOSX++_prof.mch" + #else + #include "wx_cocoaMach-O++_prof.mch" + #endif + #endif +#else + #if __mwlinker__ + #include "wx_cocoaMacOSX_prof.mch" + #else + #include "wx_cocoaMach-O_prof.mch" + #endif +#endif +#else +#ifdef __cplusplus + #ifdef __OBJC__ + #if __mwlinker__ + #include "wx_cocoaMacOSXmm.mch" + #else + #include "wx_cocoaMach-Omm.mch" + #endif + #else + #if __mwlinker__ + #include "wx_cocoaMacOSX++.mch" + #else + #include "wx_cocoaMach-O++.mch" + #endif + #endif +#else + #if __mwlinker__ + #include "wx_cocoaMacOSX.mch" + #else + #include "wx_cocoaMach-O.mch" + #endif +#endif +#endif + +#endif + // _WX_CW_COCOA__ diff --git a/Externals/wxWidgets/include/wx/wx_cwcocoa_cm.h b/Externals/wxWidgets/include/wx/wx_cwcocoa_cm.h new file mode 100644 index 0000000000..b16c100555 --- /dev/null +++ b/Externals/wxWidgets/include/wx/wx_cwcocoa_cm.h @@ -0,0 +1,85 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: include/wx/wx_cwcocoa_cm.h +// Purpose: Metrowerks wxCocoa PCH common definitions +// Author: Tommy Tian (tommy.tian@webex.com) +// Modified by: +// Created: 10/04/2004 +// RCS-ID: $Id: wx_cwcocoa_cm.h 30235 2004-11-02 06:22:11Z DE $ +// Copyright: (c) Tommy Tian +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#define MSL_USE_PRECOMPILED_HEADERS 0 +#if __WXDEBUG__ + // mac os assert levels + #define DEBUG 1 + #define DEBUG_INTERNAL 1 +#endif +#if !defined( __MWERKS__ ) + #error "this file is only for builds with Metrowerks CodeWarrior" +#endif + +#define WX_COMP_INLINE_NO_CLASS // defined if the compiler does not want the classname repeated for inlines within a class definition + +#if __MWERKS__ >= 0x2400 && __MWERKS__ <= 0x3200 +#pragma old_argmatch on +#endif + +#if (__MWERKS__ < 0x0900) || macintosh || __MACH__ + #define __MAC__ + #define __WXCOCOA__ +#elif (__MWERKS__ >= 0x0900) && __INTEL__ + #define WIN32 + #define _WINDOWS + #define __WXMSW__ + #define __WINDOWS__ + #define __WIN95__ + #define __WIN32__ + #define STRICT + #define NOMINMAX +#elif __BEOS__ + #include <ansi_prefix.be.h> + #include <Be.h> +#else + #error unknown MW compiler +#endif + +#ifdef __WXMSW__ + #include <ansi_prefix.win32.h> + #include <ansi_parms.h> + #ifdef __MWERKS__ + #if defined( __MSL__ ) && __MSL__ >= 0x5012 && __MSL__ < 0x7000 + #define fileno _fileno + #define fdopen _fdopen + #define tell _tell + #endif + #endif +#elif defined( __WXMAC__) + #define USE_PRECOMPILED_MAC_HEADERS 0 /*Set to 0 if you don't want to use precompiled MacHeaders*/ + #define ACCESSOR_CALLS_ARE_FUNCTIONS 1 + #define OPAQUE_TOOLBOX_STRUCTS 1 + #ifdef __MACH__ + #include <ansi_prefix.mach.h> + #include <msl_c_version.h> + #include <stdint.h> + #undef WCHAR_MAX + #include <machine/ansi.h> + #else + #include <ansi_prefix.mac.h> + #endif + // for getting the correct expat includes + #define MACOS_CLASSIC + /* + #include <MacTypes.h> + #if UNIVERSAL_INTERFACES_VERSION < 0x0340 + #error "please update to Apple's lastest universal headers from http://developer.apple.com/sdk/" + #endif + */ +#elif defined( __WXCOCOA__) //tommy + #if defined(__OBJC__) + #include "CocoaHeaders.m" + #endif //defined(__OBJC__) +#endif + +#define USE_DEFINE + diff --git a/Externals/wxWidgets/include/wx/wx_cwcocoa_d.h b/Externals/wxWidgets/include/wx/wx_cwcocoa_d.h new file mode 100644 index 0000000000..4ea0171681 --- /dev/null +++ b/Externals/wxWidgets/include/wx/wx_cwcocoa_d.h @@ -0,0 +1,47 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: include/wx/wx_cwcocoa_d.h +// Purpose: Metrowerks Prefix Header File (wxCocoa Debug) +// Author: Tommy Tian (tommy.tian@webex.com) +// Modified by: David Elliott +// Created: 10/04/2004 +// RCS-ID: $Id: wx_cwcocoa_d.h 30235 2004-11-02 06:22:11Z DE $ +// Copyright: (c) Tommy Tian +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + + +#ifndef _WX_CW_COCOA__ +#define _WX_CW_COCOA__ + +#if __MWERKS__ >= 0x2400 && __MWERKS__ <= 0x3200 +#pragma old_argmatch on +#endif + +#if __option(profile) +#error "profiling is not supported in debug versions" +#else +#ifdef __cplusplus + #ifdef __OBJC__ + #if __mwlinker__ + #include "wx_cocoaMacOSXmm_d.mch" + #else + #include "wx_cocoaMach-Omm_d.mch" + #endif + #else + #if __mwlinker__ + #include "wx_cocoaMacOSX++_d.mch" + #else + #include "wx_cocoaMach-O++_d.mch" + #endif + #endif +#else + #if __mwlinker__ + #include "wx_cocoaMacOSX_d.mch" + #else + #include "wx_cocoaMach-O_d.mch" + #endif +#endif +#endif + +#endif + // _WX_CW_COCOA__ diff --git a/Externals/wxWidgets/include/wx/wx_cwu_d.h b/Externals/wxWidgets/include/wx/wx_cwu_d.h new file mode 100644 index 0000000000..df5b7031ff --- /dev/null +++ b/Externals/wxWidgets/include/wx/wx_cwu_d.h @@ -0,0 +1,46 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx_cw_d.h +// Purpose: wxWidgets definitions for CodeWarrior builds (Debug) +// Author: Stefan Csomor +// Modified by: +// Created: 12/10/98 +// RCS-ID: $Id: wx_cwu_d.h 29319 2004-09-24 14:32:35Z ABX $ +// Copyright: (c) Stefan Csomor +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CW__ +#define _WX_CW__ + +#if __MWERKS__ >= 0x2400 +#pragma old_argmatch on +#endif + +#if __option(profile) +#error "profiling is not supported in debug versions" +#else +#ifdef __cplusplus + #if __POWERPC__ + #include <wx_PPCu++_d.mch> + #elif __INTEL__ + #include <wx_x86u++_d.mch> + #elif __CFM68K__ + #include <wx_cfmu++_d.mch> + #else + #include <wx_68ku++_d.mch> + #endif +#else + #if __POWERPC__ + #include <wx_PPCu_d.mch> + #elif __INTEL__ + #include <wx_x86u_d.mch> + #elif __CFM68K__ + #include <wx_cfmu_d.mch> + #else + #include <wx_68ku_d.mch> + #endif +#endif +#endif + +#endif + // _WX_CW__ diff --git a/Externals/wxWidgets/include/wx/wxchar.h b/Externals/wxWidgets/include/wx/wxchar.h new file mode 100644 index 0000000000..eb9813254f --- /dev/null +++ b/Externals/wxWidgets/include/wx/wxchar.h @@ -0,0 +1,1390 @@ +/* + * Name: wx/wxchar.h + * Purpose: Declarations common to wx char/wchar_t usage (wide chars) + * Author: Joel Farley, Ove Kåven + * Modified by: Vadim Zeitlin, Robert Roebling, Ron Lee + * Created: 1998/06/12 + * RCS-ID: $Id: wxchar.h 49328 2007-10-22 11:32:59Z VZ $ + * Copyright: (c) 1998-2006 wxWidgets dev team + * Licence: wxWindows licence + */ + +/* THIS IS A C FILE, DON'T USE C++ FEATURES (IN PARTICULAR COMMENTS) IN IT */ + +#ifndef _WX_WXCHAR_H_ +#define _WX_WXCHAR_H_ + +/* defs.h indirectly includes this file, so don't include it here */ +#include "wx/platform.h" +#include "wx/dlimpexp.h" + +#include <stdio.h> /* we use FILE below */ + +#if defined(HAVE_STRTOK_R) && defined(__DARWIN__) && defined(_MSL_USING_MW_C_HEADERS) && _MSL_USING_MW_C_HEADERS + char *strtok_r(char *, const char *, char **); +#endif + +/* check whether we have wchar_t and which size it is if we do */ +#if !defined(wxUSE_WCHAR_T) + #if defined(__UNIX__) + #if defined(HAVE_WCSTR_H) || defined(HAVE_WCHAR_H) || defined(__FreeBSD__) || defined(__DARWIN__) + #define wxUSE_WCHAR_T 1 + #else + #define wxUSE_WCHAR_T 0 + #endif + #elif defined(__GNUWIN32__) && !defined(__MINGW32__) + #define wxUSE_WCHAR_T 0 + #elif defined(__WATCOMC__) + #define wxUSE_WCHAR_T 0 + #elif defined(__VISAGECPP__) && (__IBMCPP__ < 400) + #define wxUSE_WCHAR_T 0 + #else + /* add additional compiler checks if this fails */ + #define wxUSE_WCHAR_T 1 + #endif +#endif /* !defined(wxUSE_WCHAR_T) */ + +/* Unicode support requires wchar_t */ +#if wxUSE_UNICODE && !wxUSE_WCHAR_T + #error "wchar_t must be available in Unicode build" +#endif /* Unicode */ + +/* + Standard headers we need here. + + NB: don't include any wxWidgets headers here because almost all of them include + this one! + */ + +/* Required for wxPrintf() etc */ +#include <stdarg.h> + +/* Almost all compiler have strdup(), but not quite all: CodeWarrior under Mac */ +/* and VC++ for Windows CE don't provide it */ +#if defined(__VISUALC__) && __VISUALC__ >= 1400 + #define wxStrdupA _strdup +#elif !(defined(__MWERKS__) && defined(__WXMAC__)) && !defined(__WXWINCE__) + /* use #define, not inline wrapper, as it is tested with #ifndef below */ + #define wxStrdupA strdup +#endif + +/* + non Unix compilers which do have wchar.h (but not tchar.h which is included + below and which includes wchar.h anyhow). + + Actually MinGW has tchar.h, but it does not include wchar.h + */ +#if defined(__MWERKS__) || defined(__VISAGECPP__) || defined(__MINGW32__) || defined(__WATCOMC__) + #ifndef HAVE_WCHAR_H + #define HAVE_WCHAR_H + #endif +#endif +#if defined(__MWERKS__) && !defined(__MACH__) + #ifndef HAVE_WCSLEN + #define HAVE_WCSLEN + #endif +#endif + +#if wxUSE_WCHAR_T + #ifdef HAVE_WCHAR_H + /* the current (as of Nov 2002) version of cygwin has a bug in its */ + /* wchar.h -- there is no extern "C" around the declarations in it and */ + /* this results in linking errors later; also, at least on some */ + /* Cygwin versions, wchar.h requires sys/types.h */ + #ifdef __CYGWIN__ + #include <sys/types.h> + #ifdef __cplusplus + extern "C" { + #endif + #endif /* Cygwin */ + + #include <wchar.h> + + #if defined(__CYGWIN__) && defined(__cplusplus) + } + #endif /* Cygwin and C++ */ + + #elif defined(HAVE_WCSTR_H) + /* old compilers have relevant declarations here */ + #include <wcstr.h> + #elif defined(__FreeBSD__) || defined(__DARWIN__) || defined(__EMX__) + /* include stdlib.h for wchar_t */ + #include <stdlib.h> + #endif /* HAVE_WCHAR_H */ + + #ifdef HAVE_WIDEC_H + #include <widec.h> + #endif +#endif /* wxUSE_WCHAR_T */ + +/* ---------------------------------------------------------------------------- */ +/* define wxHAVE_TCHAR_SUPPORT for the compilers which support the TCHAR type */ +/* mapped to either char or wchar_t depending on the ASCII/Unicode mode and have */ +/* the function mapping _tfoo() -> foo() or wfoo() */ +/* ---------------------------------------------------------------------------- */ + +/* VC++ and BC++ starting with 5.2 have TCHAR support */ +#ifdef __VISUALC__ + #define wxHAVE_TCHAR_SUPPORT +#elif defined(__BORLANDC__) && (__BORLANDC__ >= 0x520) + #define wxHAVE_TCHAR_SUPPORT + #include <ctype.h> + #include <memory.h> +#elif defined(__WATCOMC__) + #define wxHAVE_TCHAR_SUPPORT +#elif defined(__DMC__) + #define wxHAVE_TCHAR_SUPPORT +#elif defined(__WXPALMOS__) + #include <stddef.h> +#elif defined(__MINGW32__) && wxCHECK_W32API_VERSION( 1, 0 ) + #define wxHAVE_TCHAR_SUPPORT + #include <stddef.h> + #include <string.h> + #include <ctype.h> +#elif 0 && defined(__VISAGECPP__) && (__IBMCPP__ >= 400) + /* VZ: the old VisualAge definitions were completely wrong and had no */ + /* chance at all to work in Unicode build anyhow so let's pretend that */ + /* VisualAge does _not_ support TCHAR for the moment (as indicated by */ + /* "0 &&" above) until someone really has time to delve into Unicode */ + /* issues under OS/2 */ + + /* VisualAge 4.0+ supports TCHAR */ + #define wxHAVE_TCHAR_SUPPORT +#endif /* compilers with (good) TCHAR support */ + +#if defined(__MWERKS__) + /* Metrowerks only has wide char support for OS X >= 10.3 */ + #if !defined(__DARWIN__) || \ + (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_3) + #define wxHAVE_MWERKS_UNICODE + #endif + + #ifdef wxHAVE_MWERKS_UNICODE + #define HAVE_WPRINTF 1 + #define HAVE_WCSRTOMBS 1 + #define HAVE_VSWPRINTF 1 + #endif +#endif /* __MWERKS__ */ + +#ifdef wxHAVE_TCHAR_SUPPORT + /* get TCHAR definition if we've got it */ + #include <tchar.h> + + /* we surely do have wchar_t if we have TCHAR */ + #ifndef wxUSE_WCHAR_T + #define wxUSE_WCHAR_T 1 + #endif /* !defined(wxUSE_WCHAR_T) */ + + /* and we also do have wcslen() */ + #ifndef HAVE_WCSLEN + #define HAVE_WCSLEN + #endif +#endif /* wxHAVE_TCHAR_SUPPORT */ + +/* ---------------------------------------------------------------------------- */ +/* define wxChar type */ +/* ---------------------------------------------------------------------------- */ + +/* TODO: define wxCharInt to be equal to either int or wint_t? */ + +#if !wxUSE_UNICODE + typedef char wxChar; + typedef signed char wxSChar; + typedef unsigned char wxUChar; +#else /* Unicode */ + /* VZ: note that VC++ defines _T[SU]CHAR simply as wchar_t and not as */ + /* signed/unsigned version of it which (a) makes sense to me (unlike */ + /* char wchar_t is always unsigned) and (b) was how the previous */ + /* definitions worked so keep it like this */ + + /* Sun's SunPro compiler supports the wchar_t type and wide character */ + /* functions, but does not define __WCHAR_TYPE__. Define it here to */ + /* allow unicode enabled builds. */ + #if defined(__SUNPRO_CC) || defined(__SUNPRO_C) + #define __WCHAR_TYPE__ wxchar_t + #endif + + /* GNU libc has __WCHAR_TYPE__ which requires special treatment, see */ + /* comment below */ + #if !defined(__WCHAR_TYPE__) || \ + (!defined(__GNUC__) || wxCHECK_GCC_VERSION(2, 96)) + /* standard case */ + typedef wchar_t wxChar; + typedef wchar_t wxSChar; + typedef wchar_t wxUChar; + #else /* __WCHAR_TYPE__ and gcc < 2.96 */ + /* VS: wxWidgets used to define wxChar as __WCHAR_TYPE__ here. However, */ + /* this doesn't work with new GCC 3.x compilers because wchar_t is */ + /* C++'s builtin type in the new standard. OTOH, old compilers (GCC */ + /* 2.x) won't accept new definition of wx{S,U}Char, therefore we */ + /* have to define wxChar conditionally depending on detected */ + /* compiler & compiler version. */ + /* with old definition of wxChar. */ + typedef __WCHAR_TYPE__ wxChar; + typedef __WCHAR_TYPE__ wxSChar; + typedef __WCHAR_TYPE__ wxUChar; + #endif /* __WCHAR_TYPE__ */ +#endif /* ASCII/Unicode */ + +/* ---------------------------------------------------------------------------- */ +/* define _T() and related macros */ +/* ---------------------------------------------------------------------------- */ + +/* BSD systems define _T() to be something different in ctype.h, override it */ +#if defined(__FreeBSD__) || defined(__DARWIN__) + #include <ctype.h> + #undef _T +#endif + +/* could already be defined by tchar.h (it's quasi standard) */ +#ifndef _T + #if !wxUSE_UNICODE + #define _T(x) x + #else /* Unicode */ + /* use wxCONCAT_HELPER so that x could be expanded if it's a macro */ + #define _T(x) wxCONCAT_HELPER(L, x) + #endif /* ASCII/Unicode */ +#endif /* !defined(_T) */ + +/* although global macros with such names are normally bad, we want to have */ +/* another name for _T() which should be used to avoid confusion between _T() */ +/* and _() in wxWidgets sources */ +#define wxT(x) _T(x) + +/* a helper macro allowing to make another macro Unicode-friendly, see below */ +#define wxAPPLY_T(x) _T(x) + +/* Unicode-friendly __FILE__, __DATE__ and __TIME__ analogs */ +#ifndef __TFILE__ + #define __TFILE__ wxAPPLY_T(__FILE__) +#endif + +#ifndef __TDATE__ + #define __TDATE__ wxAPPLY_T(__DATE__) +#endif + +#ifndef __TTIME__ + #define __TTIME__ wxAPPLY_T(__TIME__) +#endif + +/* + define wxFoo() function for each standard foo() function whose signature + (exceptionally including the return type) includes any mention of char: + wxFoo() is going to be a Unicode-friendly version of foo(), i.e. will have + the same signature but with char replaced by wxChar which allows us to use + it in Unicode build as well + */ + +#ifdef wxHAVE_TCHAR_SUPPORT + #include <ctype.h> + + #if defined(__WATCOMC__) && defined(UNICODE) + #define WXWCHAR_T_CAST(c) (wint_t)(c) + #else + #define WXWCHAR_T_CAST(c) c + #endif + + /* ctype.h functions */ + #define wxIsalnum(c) _istalnum(WXWCHAR_T_CAST(c)) + #define wxIsalpha(c) _istalpha(WXWCHAR_T_CAST(c)) + #define wxIscntrl(c) _istcntrl(WXWCHAR_T_CAST(c)) + #define wxIsdigit(c) _istdigit(WXWCHAR_T_CAST(c)) + #define wxIsgraph(c) _istgraph(WXWCHAR_T_CAST(c)) + #define wxIslower(c) _istlower(WXWCHAR_T_CAST(c)) + #define wxIsprint(c) _istprint(WXWCHAR_T_CAST(c)) + #define wxIspunct(c) _istpunct(WXWCHAR_T_CAST(c)) + #define wxIsspace(c) _istspace(WXWCHAR_T_CAST(c)) + #define wxIsupper(c) _istupper(WXWCHAR_T_CAST(c)) + #define wxIsxdigit(c) _istxdigit(WXWCHAR_T_CAST(c)) + + /* + There is a bug in VC6 C RTL: toxxx() functions dosn't do anything with + signed chars < 0, so "fix" it here. + */ + #define wxTolower(c) _totlower((wxUChar)(c)) + #define wxToupper(c) _totupper((wxUChar)(c)) + + /* locale.h functons */ + #define wxSetlocale _tsetlocale + + /* string.h functions */ + #define wxStrcat _tcscat + #define wxStrchr _tcschr + #define wxStrcmp _tcscmp + #define wxStrcoll _tcscoll + #define wxStrcpy _tcscpy + #define wxStrcspn _tcscspn + #define wxStrdupW _wcsdup /* notice the 'W'! */ + #define wxStrftime _tcsftime + #define wxStricmp _tcsicmp + #define wxStrnicmp _tcsnicmp + #define wxStrlen_ _tcslen /* used in wxStrlen inline function */ + #define wxStrncat _tcsncat + #define wxStrncmp _tcsncmp + #define wxStrncpy _tcsncpy + #define wxStrpbrk _tcspbrk + #define wxStrrchr _tcsrchr + #define wxStrspn _tcsspn + #define wxStrstr _tcsstr + #define wxStrtod _tcstod + #define wxStrtol _tcstol + #define wxStrtoul _tcstoul + #ifdef __VISUALC__ + #if __VISUALC__ >= 1300 && !defined(__WXWINCE__) + #define wxStrtoll _tcstoi64 + #define wxStrtoull _tcstoui64 + #endif /* VC++ 7+ */ + #endif + #define wxStrxfrm _tcsxfrm + + /* stdio.h functions */ + #define wxFgetc _fgettc + #define wxFgetchar _fgettchar + #define wxFgets _fgetts + #if wxUSE_UNICODE_MSLU + WXDLLIMPEXP_BASE FILE * wxMSLU__tfopen(const wxChar *name, const wxChar *mode); + + #define wxFopen wxMSLU__tfopen + #else + #define wxFopen _tfopen + #endif + #define wxFputc _fputtc + #define wxFputchar _fputtchar + #define wxFprintf _ftprintf + #define wxFputs _fputts + #define wxFreopen _tfreopen + #define wxFscanf _ftscanf + #define wxGetc _gettc + #define wxGetchar _gettchar + #define wxGets _getts + #define wxPerror _tperror + #define wxPrintf _tprintf + #define wxPutc(c,f) _puttc(WXWCHAR_T_CAST(c),f) + #define wxPutchar _puttchar + #define wxPuts _putts + #define wxScanf _tscanf + #if defined(__DMC__) + #if wxUSE_UNICODE + /* Digital Mars adds count to _stprintf (C99) so prototype conversion see wxchar.cpp */ + int wxSprintf (wchar_t * __RESTRICT s, const wchar_t * __RESTRICT format, ... ) ; + #else + /* and there is a bug in D Mars tchar.h prior to 8.39.4n, so define as sprintf */ + #define wxSprintf sprintf + #endif + #elif defined(__MINGW32__) && ( defined(_STLPORT_VERSION) && _STLPORT_VERSION >= 0x510 ) + #if wxUSE_UNICODE + /* MinGW with STLPort 5.1 adds count to swprintf (C99) so prototype conversion see wxchar.cpp */ + int wxSprintf (wchar_t*, const wchar_t*, ...); + #else + /* MinGW with STLPort 5.1 has clashing defines for _stprintf so use sprintf */ + #define wxSprintf sprintf + #endif + #else + #define wxSprintf _stprintf + #endif + + #define wxSscanf _stscanf + #define wxTmpnam _ttmpnam + #define wxUngetc _tungetc + #define wxVfprintf _vftprintf + #define wxVprintf _vtprintf + #define wxVsscanf _vstscanf + #define wxVsprintf _vstprintf + + /* special case: these functions are missing under Win9x with Unicows so we */ + /* have to implement them ourselves */ + #if wxUSE_UNICODE_MSLU + WXDLLIMPEXP_BASE int wxMSLU__trename(const wxChar *oldname, const wxChar *newname); + WXDLLIMPEXP_BASE int wxMSLU__tremove(const wxChar *name); + + #define wxRemove wxMSLU__tremove + #define wxRename wxMSLU__trename + #else + #ifdef __WXWINCE__ + /* carefully: wxRemove() must return 0 on success while DeleteFile() + returns 0 on error, so don't just define one as the other */ + int wxRemove(const wxChar *path); + #else + #define wxRemove _tremove + #define wxRename _trename + #endif + #endif + + /* stdlib.h functions */ + #define wxAtoi _ttoi + #define wxAtol _ttol + /* #define wxAtof _tttof -- notice that there is no such thing (why?) */ + /* there are no env vars at all under CE, so no _tgetenv neither */ + #ifdef __WXWINCE__ + /* can't define as inline function as this is a C file... */ + #define wxGetenv(name) ((wxChar *)NULL) + #else + #define wxGetenv _tgetenv + #endif + #define wxSystem _tsystem + + /* time.h functions */ + #define wxAsctime _tasctime + #define wxCtime _tctime + + #define wxMbstowcs mbstowcs + #define wxWcstombs wcstombs +#else /* !TCHAR-aware compilers */ + /* + There are 2 unrelated problems with these functions under Mac: + a) Metrowerks MSL CRT implements them strictly in C99 sense and + doesn't support (very common) extension of allowing to call + mbstowcs(NULL, ...) which makes it pretty useless as you can't + know the size of the needed buffer + b) OS X <= 10.2 declares and even defined these functions but + doesn't really implement them -- they always return an error + + So use our own replacements in both cases. + */ + #if defined(__MWERKS__) && defined(__MSL__) + #define wxNEED_WX_MBSTOWCS + #endif + + #ifdef __DARWIN__ + #if MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_2 + #define wxNEED_WX_MBSTOWCS + #endif + #endif + + #ifdef wxNEED_WX_MBSTOWCS + /* even though they are defined and "implemented", they are bad and just + stubs so we need our own - we need these even in ANSI builds!! */ + WXDLLIMPEXP_BASE size_t wxMbstowcs (wchar_t *, const char *, size_t); + WXDLLIMPEXP_BASE size_t wxWcstombs (char *, const wchar_t *, size_t); + #else + #define wxMbstowcs mbstowcs + #define wxWcstombs wcstombs + #endif + + /* + The system C library on Mac OS X 10.2 and below does not support + unicode: in other words all wide-character functions such as towupper et + al. do simply not exist so we need to provide our own in that context, + except for the wchar_t definition/typedef itself. + + We need to do this for both project builder and CodeWarrior as + the latter uses the system C library in Mach builds for wide character + support, which as mentioned does not exist on 10.2 and below. + */ + #if wxUSE_UNICODE && \ + defined(__DARWIN__) && \ + ( MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_2 ) + /* we need everything! */ + #define wxNEED_WX_STRING_H + #define wxNEED_WX_CTYPE_H + + #define wxFgetchar(c) wxFgetc(c, stdin) + #define wxFputc wxPutc + #define wxFputchar(c) wxPutc(c, stdout) + #define wxGetc wxFgetc + #define wxGetchar(c) wxFgetc(c, stdin) + + #include <stdio.h> + + #define wxNEED_FGETC + #define wxNEED_FGETS + #define wxNEED_GETS + #define wxNEED_UNGETC + + #define wxNEED_FPUTS + #define wxNEED_PUTS + #define wxNEED_PUTC + + int wxFputs(const wxChar *ch, FILE *stream); + int wxPuts(const wxChar *ws); + int wxPutc(wxChar ch, FILE *stream); + + #ifdef __cplusplus + extern "C" { + #endif + WXDLLIMPEXP_BASE size_t wxStrlen_(const wxChar *s); + #ifdef __cplusplus + } + #endif + + #define wxPutchar(wch) wxPutc(wch, stdout) + + #define wxNEED_PRINTF_CONVERSION + #define wxNEED_WX_STDIO_H + #define wxNEED_WX_STDLIB_H + #define wxNEED_WX_TIME_H + + #elif wxUSE_UNICODE + #include <wctype.h> + + /* this is probably glibc-specific */ + #if defined(__WCHAR_TYPE__) && !defined(__MWERKS__) + /* ctype.h functions (wctype.h) */ + #define wxIsalnum iswalnum + #define wxIsalpha iswalpha + #define wxIscntrl iswcntrl + #define wxIsdigit iswdigit + #define wxIsgraph iswgraph + #define wxIslower iswlower + #define wxIsprint iswprint + #define wxIspunct iswpunct + #define wxIsspace iswspace + #define wxIsupper iswupper + #define wxIsxdigit iswxdigit + + #if defined(__GLIBC__) && (__GLIBC__ == 2) && (__GLIBC_MINOR__ == 0) + /* /usr/include/wctype.h incorrectly declares translations */ + /* tables which provokes tons of compile-time warnings -- try */ + /* to correct this */ + #define wxTolower(wc) towctrans((wc), (wctrans_t)__ctype_tolower) + #define wxToupper(wc) towctrans((wc), (wctrans_t)__ctype_toupper) + #else /* !glibc 2.0 */ + #define wxTolower towlower + #define wxToupper towupper + #endif /* gcc/!gcc */ + + /* string.h functions (wchar.h) */ + #define wxStrcat wcscat + #define wxStrchr wcschr + #define wxStrcmp wcscmp + #define wxStrcoll wcscoll + #define wxStrcpy wcscpy + #define wxStrcspn wcscspn + #define wxStrlen_ wxWcslen /* wxStrlen_() is used in wxStrlen() */ + #define wxStrncat wcsncat + #define wxStrncmp wcsncmp + #define wxStrncpy wcsncpy + #define wxStrpbrk wcspbrk + #define wxStrrchr wcsrchr + #define wxStrspn wcsspn + #define wxStrstr wcsstr + #define wxStrtod wcstod + #define wxStrtol wcstol + #define wxStrtoul wcstoul + #ifdef HAVE_WCSTOULL + /* assume that we have wcstoull(), which is also C99, too */ + #define wxStrtoll wcstoll + #define wxStrtoull wcstoull + #endif /* HAVE_WCSTOULL */ + #define wxStrxfrm wcsxfrm + + #define wxFgetc fgetwc + #define wxFgetchar fgetwchar + #define wxFgets fgetws + #define wxFputc fputwc + #define wxFputchar fputwchar + #define wxGetc getwc + #define wxGetchar getwchar + #define wxGets getws + #define wxUngetc ungetwc + + #ifdef HAVE_FPUTWS + #define wxFputs fputws + #else + #define wxNEED_FPUTS + #include <stdio.h> + int wxFputs(const wxChar *ch, FILE *stream); + #endif + + #ifdef HAVE_WPUTC + #define wxPutc wputc + #else + #define wxNEED_PUTC + #include <stdio.h> + int wxPutc(wxChar ch, FILE *stream); + #endif + + #ifdef HAVE_WPUTCHAR + #define wxPutchar wputchar + #else + #define wxPutchar(wch) wxPutc(wch, stdout) + #endif + + #ifdef HAVE_PUTWS + #define wxPuts putws + #else + #define wxNEED_PUTS + int wxPuts(const wxChar *ws); + #endif + + /* we need %s to %ls conversion for printf and scanf etc */ + #define wxNEED_PRINTF_CONVERSION + + /* glibc doesn't have wide char equivalents of the other stuff so */ + /* use our own versions */ + #define wxNEED_WX_STDIO_H + #define wxNEED_WX_STDLIB_H + #define wxNEED_WX_TIME_H + #elif defined(__MWERKS__) && ( defined(__MSL__) || defined(__MACH__) ) + /* ctype.h functions (wctype.h) */ + #define wxIsalnum iswalnum + #define wxIsalpha iswalpha + #define wxIscntrl iswcntrl + #define wxIsdigit iswdigit + #define wxIsgraph iswgraph + #define wxIslower iswlower + #define wxIsprint iswprint + #define wxIspunct iswpunct + #define wxIsspace iswspace + #define wxIsupper iswupper + #define wxIsxdigit iswxdigit + #define wxTolower towlower + #define wxToupper towupper + + /* string.h functions (wchar.h) */ + #define wxStrcat wcscat + #define wxStrchr wcschr + #define wxStrcmp wcscmp + #define wxStrcoll wcscoll + #define wxStrcpy wcscpy + #define wxStrcspn wcscspn + #define wxStrlen_ wxWcslen /* wxStrlen_() is used in wxStrlen() */ + #define wxStrncat wcsncat + #define wxStrncmp wcsncmp + #define wxStrncpy wcsncpy + #define wxStrpbrk wcspbrk + #define wxStrrchr wcsrchr + #define wxStrspn wcsspn + #define wxStrstr wcsstr + #define wxStrtod wcstod + #define wxStrtol wcstol + #define wxStrtoul wcstoul + #define wxStrxfrm wcsxfrm + + #define wxFgetc fgetwc + #define wxFgetchar fgetwchar + #define wxFgets fgetws + #define wxFputc fputwc + #define wxFputchar fputwchar + #define wxGetc getwc + #define wxGetchar getwchar + #define wxGets getws + #define wxUngetc ungetwc + + #define wxNEED_PRINTF_CONVERSION + + #define wxPutc putwc + #define wxPutchar putwchar + #define wxFputs fputws + + /* stdio.h functions */ + + #define wxNEED_WX_STDIO_H + + /* stdlib.h functions */ + #ifdef __MACH__ + #define wxNEED_WX_STDLIB_H + #else + #define wxAtof watof + #define wxAtoi watoi + #define wxAtol watol + #define wxGetenv(a) ((wxChar*)NULL) + #define wxSystem(a) ((int)NULL) + #endif + /* time.h functions */ + #define wxAsctime wasciitime + #define wxCtime wctime + /* #define wxStrftime wcsftime */ + + #define wxNEED_WX_TIME_H + #else /* !metrowerks for apple */ + #error "Please define wide character functions for your environment" + #endif + #else /* ASCII */ + #include <ctype.h> + #include <string.h> + + /* ctype.h functions */ + #define wxIsalnum isalnum + #define wxIsalpha isalpha + #define wxIscntrl iscntrl + #define wxIsdigit isdigit + #define wxIsgraph isgraph + #define wxIslower islower + #define wxIsprint isprint + #define wxIspunct ispunct + #define wxIsspace isspace + #define wxIsupper isupper + #define wxIsxdigit isxdigit + #define wxTolower tolower + #define wxToupper toupper + + /* locale.h functons */ + #define wxSetlocale setlocale + + /* string.h functions */ + #define wxStrcat strcat + #define wxStrchr strchr + #define wxStrcmp strcmp + #define wxStrcoll strcoll + #define wxStrcpy strcpy + #define wxStrcspn strcspn + + /* wxStricmp and wxStrnicmp are defined below */ + #define wxStrlen_ strlen /* used in wxStrlen inline function */ + #define wxStrncat strncat + #define wxStrncmp strncmp + #define wxStrncpy strncpy + #define wxStrpbrk strpbrk + #define wxStrrchr strrchr + #define wxStrspn strspn + #define wxStrstr strstr + #define wxStrtod strtod + #ifdef HAVE_STRTOK_R + #define wxStrtok(str, sep, last) strtok_r(str, sep, last) + #endif + #define wxStrtol strtol + #define wxStrtoul strtoul + #ifdef HAVE_STRTOULL + /* assume that we have wcstoull(), which is also C99, too */ + #define wxStrtoll strtoll + #define wxStrtoull strtoull + #endif /* HAVE_WCSTOULL */ + #define wxStrxfrm strxfrm + + /* stdio.h functions */ + #define wxFopen fopen + #define wxFreopen freopen + #define wxRemove remove + #define wxRename rename + + #define wxPerror perror + #define wxTmpnam tmpnam + + #define wxFgetc fgetc + #define wxFgetchar fgetchar + #define wxFgets fgets + #define wxFputc fputc + #define wxFputs fputs + #define wxFputchar fputchar + #define wxFprintf fprintf + #define wxFscanf fscanf + #define wxGetc getc + #define wxGetchar getchar + #define wxGets gets + #define wxPrintf printf + #define wxPutc putc + #define wxPutchar putchar + #define wxPuts puts + #define wxScanf scanf + #define wxSprintf sprintf + #define wxSscanf sscanf + #define wxUngetc ungetc + #define wxVfprintf vfprintf + #define wxVprintf vprintf + #define wxVsscanf vsscanf + #define wxVsprintf vsprintf + + /* stdlib.h functions */ + #define wxAtof atof + #define wxAtoi atoi + #define wxAtol atol + #define wxGetenv getenv + #define wxSystem system + + /* time.h functions */ + #define wxAsctime asctime + #define wxCtime ctime + #define wxStrftime strftime + #endif /* Unicode/ASCII */ +#endif /* TCHAR-aware compilers/the others */ + +#ifdef wxStrtoll + #define wxHAS_STRTOLL +#endif + +/* + various special cases + */ + +/* define wxStricmp and wxStrnicmp for various compilers */ + +/* note that in Unicode mode we definitely are going to need our own version */ +#if !defined(wxStricmp) && !wxUSE_UNICODE + #if defined(__BORLANDC__) || defined(__WATCOMC__) || \ + defined(__SALFORDC__) || defined(__VISAGECPP__) || \ + defined(__EMX__) || defined(__DJGPP__) + #define wxStricmp stricmp + #define wxStrnicmp strnicmp + #elif defined(__WXPALMOS__) + /* FIXME: There is no equivalent to strnicmp in the Palm OS API. This + * quick hack should do until one can be written. + */ + #define wxStricmp StrCaselessCompare + #define wxStrnicmp strnicmp + #elif defined(__SYMANTEC__) || defined(__VISUALC__) || \ + (defined(__MWERKS__) && defined(__INTEL__)) + #define wxStricmp _stricmp + #define wxStrnicmp _strnicmp + #elif defined(__UNIX__) || defined(__GNUWIN32__) + #define wxStricmp strcasecmp + #define wxStrnicmp strncasecmp + /* #else -- use wxWidgets implementation */ + #endif +#endif /* !defined(wxStricmp) */ + +/* define wxWcslen() which should be always available if wxUSE_WCHAR_T == 1 (as */ +/* it's used in wx/buffer.h -- and also might be used just below by wxStrlen() */ +/* when wxStrlen_() is #define'd as wxWcslen so do it before defining wxStrlen) */ +#if wxUSE_WCHAR_T + #ifdef HAVE_WCSLEN + #define wxWcslen wcslen + #else + WXDLLIMPEXP_BASE size_t wxWcslen(const wchar_t *s); + #endif +#endif /* wxUSE_WCHAR_T */ + +#ifdef __cplusplus +/* checks whether the passed in pointer is NULL and if the string is empty */ +inline bool wxIsEmpty(const wxChar *p) { return !p || !*p; } + +/* safe version of strlen() (returns 0 if passed NULL pointer) */ +inline size_t wxStrlen(const wxChar *psz) { return psz ? wxStrlen_(psz) : 0; } +#endif + +/* + each of strdup() and wcsdup() may or may not be available but we need both + of them anyhow for wx/buffer.h so we define the missing one(s) in + wxchar.cpp and so we should always have both wxStrdupA and wxStrdupW + defined -- if this is somehow not the case in some situations, please + correct that and not the lines here + */ +#if wxUSE_UNICODE + #define wxStrdup wxStrdupW +#else + #define wxStrdup wxStrdupA +#endif + +#ifdef __cplusplus +WXDLLIMPEXP_BASE bool wxOKlibc(); /* for internal use */ +#endif + +/* printf() family saga */ + +/* + For some systems [v]snprintf() exists in the system libraries but not in the + headers, so we need to declare it ourselves to be able to use it. + */ +#if defined(HAVE_VSNPRINTF) && !defined(HAVE_VSNPRINTF_DECL) +#ifdef __cplusplus + extern "C" +#else + extern +#endif + int vsnprintf(char *str, size_t size, const char *format, va_list ap); +#endif /* !HAVE_VSNPRINTF_DECL */ + +#if defined(HAVE_SNPRINTF) && !defined(HAVE_SNPRINTF_DECL) +#ifdef __cplusplus + extern "C" +#else + extern +#endif + WXDLLIMPEXP_BASE int snprintf(char *str, size_t size, const char *format, ...); +#endif /* !HAVE_SNPRINTF_DECL */ + +/* Wrapper for vsnprintf if it's 3rd parameter is non-const. Note: the + * same isn't done for snprintf below, the builtin wxSnprintf_ is used + * instead since it's already a simple wrapper */ +#if defined __cplusplus && defined HAVE_BROKEN_VSNPRINTF_DECL + inline int wx_fixed_vsnprintf(char *str, size_t size, const char *format, va_list ap) + { + return vsnprintf(str, size, (char*)format, ap); + } +#endif + +/* + MinGW MSVCRT has non-standard vswprintf() (for MSVC compatibility + presumably) and normally _vsnwprintf() is used instead (but as + STLPort 5.1 defines standard vswprintf(), don't do this for it) + */ +#if defined(HAVE_VSWPRINTF) && defined(__MINGW32__) && !( defined(_STLPORT_VERSION) && _STLPORT_VERSION >= 0x510 ) + #undef HAVE_VSWPRINTF +#endif + +#if wxUSE_PRINTF_POS_PARAMS + /* + The systems where vsnprintf() supports positional parameters should + define the HAVE_UNIX98_PRINTF symbol. + + On systems which don't (e.g. Windows) we are forced to use + our wxVsnprintf() implementation. + */ + #if defined(HAVE_UNIX98_PRINTF) + #if wxUSE_UNICODE + #ifdef HAVE_VSWPRINTF + #define wxVsnprintf_ vswprintf + #endif + #else /* ASCII */ + #ifdef HAVE_BROKEN_VSNPRINTF_DECL + #define wxVsnprintf_ wx_fixed_vsnprintf + #else + #define wxVsnprintf_ vsnprintf + #endif + #endif + #else /* !HAVE_UNIX98_PRINTF */ + /* + The only compiler with positional parameters support under Windows + is VC++ 8.0 which provides a new xxprintf_p() functions family. + The 2003 PSDK includes a slightly earlier version of VC8 than the + main release and does not have the printf_p functions. + */ + #if defined _MSC_FULL_VER && _MSC_FULL_VER >= 140050727 && !defined __WXWINCE__ + #if wxUSE_UNICODE + #define wxVsnprintf_ _vswprintf_p + #else + #define wxVsnprintf_ _vsprintf_p + #endif + #endif + #endif /* HAVE_UNIX98_PRINTF/!HAVE_UNIX98_PRINTF */ +#else /* !wxUSE_PRINTF_POS_PARAMS */ + /* + We always want to define safe snprintf() function to be used instead of + sprintf(). Some compilers already have it (or rather vsnprintf() which + we really need...), otherwise we implement it using our own printf() + code. + + We define function with a trailing underscore here because the real one + is a wrapper around it as explained below + */ + + /* first deal with TCHAR-aware compilers which have _vsntprintf */ + #ifndef wxVsnprintf_ + #if defined(__VISUALC__) || \ + (defined(__BORLANDC__) && __BORLANDC__ >= 0x540) + #define wxVsnprintf_ _vsntprintf + #define wxSnprintf_ _sntprintf + #endif + #endif + + /* if this didn't work, define it separately for Unicode and ANSI builds */ + #ifndef wxVsnprintf_ + #if wxUSE_UNICODE + #if defined(HAVE__VSNWPRINTF) + #define wxVsnprintf_ _vsnwprintf + #elif defined(HAVE_VSWPRINTF) + #define wxVsnprintf_ vswprintf + #elif defined(__WATCOMC__) + #define wxVsnprintf_ _vsnwprintf + #define wxSnprintf_ _snwprintf + #endif + #else /* ASCII */ + /* + All versions of CodeWarrior supported by wxWidgets apparently + have both snprintf() and vsnprintf() + */ + #if defined(HAVE_SNPRINTF) \ + || defined(__MWERKS__) || defined(__WATCOMC__) + #ifndef HAVE_BROKEN_SNPRINTF_DECL + #define wxSnprintf_ snprintf + #endif + #endif + #if defined(HAVE_VSNPRINTF) \ + || defined(__MWERKS__) || defined(__WATCOMC__) + #ifdef HAVE_BROKEN_VSNPRINTF_DECL + #define wxVsnprintf_ wx_fixed_vsnprintf + #else + #define wxVsnprintf_ vsnprintf + #endif + #endif + #endif /* Unicode/ASCII */ + #endif /* wxVsnprintf_ */ +#endif /* wxUSE_PRINTF_POS_PARAMS/!wxUSE_PRINTF_POS_PARAMS */ + +#ifndef wxSnprintf_ + /* no snprintf(), cook our own */ + WXDLLIMPEXP_BASE int + wxSnprintf_(wxChar *buf, size_t len, const wxChar *format, ...) ATTRIBUTE_PRINTF_3; +#endif +#ifndef wxVsnprintf_ + /* no (suitable) vsnprintf(), cook our own */ + WXDLLIMPEXP_BASE int + wxVsnprintf_(wxChar *buf, size_t len, const wxChar *format, va_list argptr); + + #define wxUSE_WXVSNPRINTF 1 +#else + #define wxUSE_WXVSNPRINTF 0 +#endif + +/* + In Unicode mode we need to have all standard functions such as wprintf() and + so on but not all systems have them so use our own implementations in this + case. + */ +#if wxUSE_UNICODE && !defined(wxHAVE_TCHAR_SUPPORT) && !defined(HAVE_WPRINTF) + #define wxNEED_WPRINTF +#endif + +/* + More Unicode complications: although both ANSI C and C++ define a number of + wide character functions such as wprintf(), not all environments have them. + Worse, those which do have different behaviours: under Windows, %s format + specifier changes its meaning in Unicode build and expects a Unicode string + while under Unix/POSIX it still means an ASCII string even for wprintf() and + %ls has to be used for wide strings. + + We choose to always emulate Windows behaviour as more useful for us so even + if we have wprintf() we still must wrap it in a non trivial wxPrintf(). + +*/ + +#if defined(wxNEED_PRINTF_CONVERSION) || defined(wxNEED_WPRINTF) + /* + we need to implement all wide character printf and scanf functions + either because we don't have them at all or because they don't have the + semantics we need + */ + int wxScanf( const wxChar *format, ... ) ATTRIBUTE_PRINTF_1; + int wxSscanf( const wxChar *str, const wxChar *format, ... ) ATTRIBUTE_PRINTF_2; + int wxFscanf( FILE *stream, const wxChar *format, ... ) ATTRIBUTE_PRINTF_2; + int wxVsscanf( const wxChar *str, const wxChar *format, va_list ap ); + int wxPrintf( const wxChar *format, ... ) ATTRIBUTE_PRINTF_1; + int wxSprintf( wxChar *str, const wxChar *format, ... ) ATTRIBUTE_PRINTF_2; + int wxFprintf( FILE *stream, const wxChar *format, ... ) ATTRIBUTE_PRINTF_2; + int wxVfprintf( FILE *stream, const wxChar *format, va_list ap ); + int wxVprintf( const wxChar *format, va_list ap ); + int wxVsprintf( wxChar *str, const wxChar *format, va_list ap ); +#endif /* wxNEED_PRINTF_CONVERSION */ + +/* these 2 can be simply mapped to the versions with underscore at the end */ +/* if we don't have to do the conversion */ +/* + However, if we don't have any vswprintf() at all we don't need to redefine + anything as our own wxVsnprintf_() already behaves as needed. +*/ +#if defined(wxNEED_PRINTF_CONVERSION) && defined(wxVsnprintf_) + int wxSnprintf( wxChar *str, size_t size, const wxChar *format, ... ) ATTRIBUTE_PRINTF_3; + int wxVsnprintf( wxChar *str, size_t size, const wxChar *format, va_list ap ); +#else + #define wxSnprintf wxSnprintf_ + #define wxVsnprintf wxVsnprintf_ +#endif + +/* + various functions which might not be available in libc and for which we + provide our own replacements in wxchar.cpp + */ + +/* ctype.h functions */ + +/* RN: Used only under OSX <= 10.2 currently */ +#ifdef wxNEED_WX_CTYPE_H + WXDLLIMPEXP_BASE int wxIsalnum(wxChar ch); + WXDLLIMPEXP_BASE int wxIsalpha(wxChar ch); + WXDLLIMPEXP_BASE int wxIscntrl(wxChar ch); + WXDLLIMPEXP_BASE int wxIsdigit(wxChar ch); + WXDLLIMPEXP_BASE int wxIsgraph(wxChar ch); + WXDLLIMPEXP_BASE int wxIslower(wxChar ch); + WXDLLIMPEXP_BASE int wxIsprint(wxChar ch); + WXDLLIMPEXP_BASE int wxIspunct(wxChar ch); + WXDLLIMPEXP_BASE int wxIsspace(wxChar ch); + WXDLLIMPEXP_BASE int wxIsupper(wxChar ch); + WXDLLIMPEXP_BASE int wxIsxdigit(wxChar ch); + WXDLLIMPEXP_BASE int wxTolower(wxChar ch); + WXDLLIMPEXP_BASE int wxToupper(wxChar ch); +#endif /* wxNEED_WX_CTYPE_H */ + +/* under VC++ 6.0 isspace() returns 1 for 8 bit chars which completely breaks */ +/* the file parsing -- this may be true for 5.0 as well, update #ifdef then */ +#if defined(__VISUALC__) && (__VISUALC__ >= 1200) && !wxUSE_UNICODE + #undef wxIsspace + #define wxIsspace(c) ((((unsigned)c) < 128) && isspace(c)) +#endif /* VC++ */ + +/* + a few compilers don't have the (non standard but common) isascii function, + define it ourselves for them + */ +#ifndef isascii + #if defined(__MWERKS__) + #define wxNEED_ISASCII + #elif defined(_WIN32_WCE) + #if _WIN32_WCE <= 211 + #define wxNEED_ISASCII + #endif + #endif +#endif /* isascii */ + +#ifdef wxNEED_ISASCII + inline int isascii(int c) { return (unsigned)c < 0x80; } +#endif + +#ifdef _WIN32_WCE + #if _WIN32_WCE <= 211 + #define isspace(c) ((c) == _T(' ') || (c) == _T('\t')) + #endif +#endif /* _WIN32_WCE */ + +/* + we had goofed and defined wxIsctrl() instead of (correct) wxIscntrl() in the + initial versions of this header -- now it is too late to remove it so + although we fixed the function/macro name above, still provide the + backwards-compatible synonym. + */ +#define wxIsctrl wxIscntrl + +/* string.h functions */ +#ifndef strdup + #if defined(__MWERKS__) && !defined(__MACH__) && (__MSL__ < 0x00008000) + #define wxNEED_STRDUP + #elif defined(__WXWINCE__) + #if _WIN32_WCE <= 211 + #define wxNEED_STRDUP + #endif + #endif +#endif /* strdup */ + +#ifdef wxNEED_STRDUP + WXDLLIMPEXP_BASE char *strdup(const char* s); +#endif + +/* RN: Used only under OSX <= 10.2 currently + The __cplusplus ifdefs are messy, but they are required to build + the regex library, since c does not support function overloading +*/ +#ifdef wxNEED_WX_STRING_H +# ifdef __cplusplus + extern "C" { +# endif + WXDLLIMPEXP_BASE wxChar * wxStrcat(wxChar *dest, const wxChar *src); + WXDLLIMPEXP_BASE const wxChar * wxStrchr(const wxChar *s, wxChar c); + WXDLLIMPEXP_BASE int wxStrcmp(const wxChar *s1, const wxChar *s2); + WXDLLIMPEXP_BASE int wxStrcoll(const wxChar *s1, const wxChar *s2); + WXDLLIMPEXP_BASE wxChar * wxStrcpy(wxChar *dest, const wxChar *src); + WXDLLIMPEXP_BASE size_t wxStrcspn(const wxChar *s, const wxChar *reject); + WXDLLIMPEXP_BASE wxChar * wxStrncat(wxChar *dest, const wxChar *src, size_t n); + WXDLLIMPEXP_BASE int wxStrncmp(const wxChar *s1, const wxChar *s2, size_t n); + WXDLLIMPEXP_BASE wxChar * wxStrncpy(wxChar *dest, const wxChar *src, size_t n); + WXDLLIMPEXP_BASE const wxChar * wxStrpbrk(const wxChar *s, const wxChar *accept); + WXDLLIMPEXP_BASE const wxChar * wxStrrchr(const wxChar *s, wxChar c); + WXDLLIMPEXP_BASE size_t wxStrspn(const wxChar *s, const wxChar *accept); + WXDLLIMPEXP_BASE const wxChar * wxStrstr(const wxChar *haystack, const wxChar *needle); +# ifdef __cplusplus + } +# endif + + /* These functions use C++, so we can't c extern them */ + WXDLLIMPEXP_BASE double wxStrtod(const wxChar *nptr, wxChar **endptr); + WXDLLIMPEXP_BASE long int wxStrtol(const wxChar *nptr, wxChar **endptr, int base); + WXDLLIMPEXP_BASE unsigned long int wxStrtoul(const wxChar *nptr, wxChar **endptr, int base); + WXDLLIMPEXP_BASE size_t wxStrxfrm(wxChar *dest, const wxChar *src, size_t n); + + /* inlined versions */ + #ifdef __cplusplus + inline wxChar * wxStrchr(wxChar *s, wxChar c) + { return (wxChar *)wxStrchr((const wxChar *)s, c); } + inline wxChar * wxStrpbrk(wxChar *s, const wxChar *accept) + { return (wxChar *)wxStrpbrk((const wxChar *)s, accept); } + inline wxChar * wxStrrchr(wxChar *s, wxChar c) + { return (wxChar *)wxStrrchr((const wxChar *)s, c); } + inline wxChar *wxStrstr(wxChar *haystack, const wxChar *needle) + { return (wxChar *)wxStrstr((const wxChar *)haystack, needle); } + #endif + +#endif /* wxNEED_WX_STRING_H */ + +#ifndef wxStrdupA +WXDLLIMPEXP_BASE char *wxStrdupA(const char *psz); +#endif + +#ifndef wxStrdupW +WXDLLIMPEXP_BASE wchar_t *wxStrdupW(const wchar_t *pwz); +#endif + +#ifndef wxStricmp +WXDLLIMPEXP_BASE int wxStricmp(const wxChar *psz1, const wxChar *psz2); +#endif + +#ifndef wxStrnicmp +WXDLLIMPEXP_BASE int wxStrnicmp(const wxChar *psz1, const wxChar *psz2, size_t len); +#endif + +#ifndef wxStrtok +WXDLLIMPEXP_BASE wxChar * wxStrtok(wxChar *psz, const wxChar *delim, wxChar **save_ptr); +#endif + +#ifdef __cplusplus +#ifndef wxSetlocale +class WXDLLIMPEXP_BASE wxWCharBuffer; +WXDLLIMPEXP_BASE wxWCharBuffer wxSetlocale(int category, const wxChar *locale); +#endif +#endif + +/* stdio.h functions */ +#ifdef wxNEED_WX_STDIO_H + #include <stdio.h> + WXDLLIMPEXP_BASE FILE * wxFopen(const wxChar *path, const wxChar *mode); + WXDLLIMPEXP_BASE FILE * wxFreopen(const wxChar *path, const wxChar *mode, FILE *stream); + WXDLLIMPEXP_BASE int wxRemove(const wxChar *path); + WXDLLIMPEXP_BASE int wxRename(const wxChar *oldpath, const wxChar *newpath); + + /* *printf() family is handled separately */ +#endif /* wxNEED_WX_STDIO_H */ + + +/* stdlib.h functions */ +#ifndef wxAtof +WXDLLIMPEXP_BASE double wxAtof(const wxChar *psz); +#endif + +/* + mingw32 doesn't provide _tsystem() even though it does provide all the other + stdlib.h functions wrappers so check for it separately: + */ +#if defined(__MINGW32__) && wxUSE_UNICODE && !defined(_tsystem) + #define wxNEED_WXSYSTEM +#endif + +#ifdef wxNEED_WX_STDLIB_H +WXDLLIMPEXP_BASE int wxAtoi(const wxChar *psz); +WXDLLIMPEXP_BASE long wxAtol(const wxChar *psz); +WXDLLIMPEXP_BASE wxChar * wxGetenv(const wxChar *name); +#define wxNEED_WXSYSTEM +#endif + +#ifdef wxNEED_WXSYSTEM +WXDLLIMPEXP_BASE int wxSystem(const wxChar *psz); +#endif + + +/* time.h functions */ +#ifdef wxNEED_WX_TIME_H +#if defined(__MWERKS__) && defined(macintosh) + #include <time.h> +#endif + /*silent gabby compilers*/ + struct tm; + WXDLLIMPEXP_BASE size_t wxStrftime(wxChar *s, size_t max, + const wxChar *fmt, const struct tm *tm); +#endif /* wxNEED_WX_TIME_H */ + +#ifndef wxCtime +#include <time.h> +WXDLLIMPEXP_BASE wxChar *wxCtime(const time_t *timep); +#endif + + +/* missing functions in some WinCE versions */ +#ifdef _WIN32_WCE +#if (_WIN32_WCE < 300) +WXDLLIMPEXP_BASE void *calloc( size_t num, size_t size ); +#endif +#endif /* _WIN32_WCE */ + +/* multibyte to wide char conversion functions and macros */ + +#if wxUSE_WCHAR_T + /* multibyte<->widechar conversion */ + WXDLLIMPEXP_BASE size_t wxMB2WC(wchar_t *buf, const char *psz, size_t n); + WXDLLIMPEXP_BASE size_t wxWC2MB(char *buf, const wchar_t *psz, size_t n); + + #if wxUSE_UNICODE + #define wxMB2WX wxMB2WC + #define wxWX2MB wxWC2MB + #define wxWC2WX wxStrncpy + #define wxWX2WC wxStrncpy + #else + #define wxMB2WX wxStrncpy + #define wxWX2MB wxStrncpy + #define wxWC2WX wxWC2MB + #define wxWX2WC wxMB2WC + #endif +#else /* !wxUSE_UNICODE */ +/* Why is this here? +#error ha */ + /* No wxUSE_WCHAR_T: we have to do something (JACS) */ + #define wxMB2WC wxStrncpy + #define wxWC2MB wxStrncpy + #define wxMB2WX wxStrncpy + #define wxWX2MB wxStrncpy + #define wxWC2WX wxWC2MB + #define wxWX2WC wxMB2WC +#endif + +/* + RN: The following are not normal versions of memcpy et al., rather + these are either char or widechar versions depending on + if unicode is used or not. +*/ + +#ifdef __cplusplus + + // + // RN: We could do the usual tricky compiler detection here, + // and use their variant (such as wmemchr, etc.). The problem + // is that these functions are quite rare, even though they are + // part of the current POSIX standard. In addition, most compilers + // (including even MSC) inline them just like we do right in their + // headers. + // + #include <string.h> + #if wxUSE_UNICODE + //implement our own wmem variants + inline wxChar* wxTmemchr(const wxChar* s, wxChar c, size_t l) + { + for(;l && *s != c;--l, ++s) {} + + if(l) + return (wxChar*)s; + return NULL; + } + + inline int wxTmemcmp(const wxChar* sz1, const wxChar* sz2, size_t len) + { + for(; *sz1 == *sz2 && len; --len, ++sz1, ++sz2) {} + + if(len) + return *sz1 < *sz2 ? -1 : *sz1 > *sz2; + else + return 0; + } + + inline wxChar* wxTmemcpy(wxChar* szOut, const wxChar* szIn, size_t len) + { + return (wxChar*) memcpy(szOut, szIn, len * sizeof(wxChar)); + } + + inline wxChar* wxTmemmove(wxChar* szOut, const wxChar* szIn, size_t len) + { + return (wxChar*) memmove(szOut, szIn, len * sizeof(wxChar)); + } + + inline wxChar* wxTmemset(wxChar* szOut, const wxChar cIn, size_t len) + { + wxChar* szRet = szOut; + + while (len--) + *szOut++ = cIn; + + return szRet; + } + #else /* !wxUSE_UNICODE */ + #if wxABI_VERSION >= 20805 + // for compatibility with earlier versions, these functions take + // "void *" but in the next wx version they will take "char *" so + // don't use them with void pointers (use the standard memxxx() + // with them) + inline char* wxTmemchr(const void* s, int c, size_t len) + { return (char*)memchr(s, c, len); } + inline int wxTmemcmp(const void* sz1, const void* sz2, size_t len) + { return memcmp(sz1, sz2, len); } + inline char* wxTmemcpy(void* szOut, const void* szIn, size_t len) + { return (char*)memcpy(szOut, szIn, len); } + inline char* wxTmemmove(void* szOut, const void* szIn, size_t len) + { return (char*)memmove(szOut, szIn, len); } + inline char* wxTmemset(void* szOut, int c, size_t len) + { return (char*)memset(szOut, c, len); } + #else + # define wxTmemchr memchr + # define wxTmemcmp memcmp + # define wxTmemcpy memcpy + # define wxTmemmove memmove + # define wxTmemset memset + #endif + #endif /* wxUSE_UNICODE/!wxUSE_UNICODE */ + +#endif /*__cplusplus*/ + + +#endif /* _WX_WXCHAR_H_ */ + diff --git a/Externals/wxWidgets/include/wx/wxhtml.h b/Externals/wxWidgets/include/wx/wxhtml.h new file mode 100644 index 0000000000..367b2c35a5 --- /dev/null +++ b/Externals/wxWidgets/include/wx/wxhtml.h @@ -0,0 +1,22 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wxhtml.h +// Purpose: wxHTML library for wxWidgets +// Author: Vaclav Slavik +// RCS-ID: $Id: wxhtml.h 35650 2005-09-23 12:56:45Z MR $ +// Copyright: (c) 1999 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_HTML_H_ +#define _WX_HTML_H_ + +#include "wx/html/htmldefs.h" +#include "wx/html/htmltag.h" +#include "wx/html/htmlcell.h" +#include "wx/html/htmlpars.h" +#include "wx/html/htmlwin.h" +#include "wx/html/winpars.h" +#include "wx/filesys.h" +#include "wx/html/helpctrl.h" + +#endif // __WXHTML_H__ diff --git a/Externals/wxWidgets/include/wx/wxprec.h b/Externals/wxWidgets/include/wx/wxprec.h new file mode 100644 index 0000000000..184914e6c5 --- /dev/null +++ b/Externals/wxWidgets/include/wx/wxprec.h @@ -0,0 +1,70 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/wxprec.h +// Purpose: Includes the appropriate files for precompiled headers +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: wxprec.h 39484 2006-05-31 12:18:02Z ABX $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// compiler detection; includes setup.h +#include "wx/defs.h" + +// check if to use precompiled headers: do it for most Windows compilers unless +// explicitly disabled by defining NOPCH +#if defined(__VISUALC__) || \ + defined(__DMC__) || \ + defined(__VISAGECPP__) || \ + defined(__MWERKS__) || \ + defined(__WATCOMC__) || \ + defined(__BORLANDC__) + + + // If user did not request NOCPH and we're not building using configure + // then assume user wants precompiled headers. + #if !defined(NOPCH) && !defined(__WX_SETUP_H__) + #define WX_PRECOMP + #endif +#endif + +// For some reason, this must be defined for common dialogs to work. +#ifdef __WATCOMC__ + #define INCLUDE_COMMDLG_H 1 +#endif + +#ifdef WX_PRECOMP + +// include "wx/wxchar.h" first to ensure that UNICODE macro is correctly set +// _before_ including <windows.h> +#include "wx/wxchar.h" + +// include standard Windows headers +#if defined(__WXMSW__) + #include "wx/msw/wrapwin.h" + #include "wx/msw/wrapcctl.h" + #include "wx/msw/wrapcdlg.h" + #include "wx/msw/private.h" + #include "wx/msw/missing.h" +#endif + +// include all PalmOS headers at once +#ifdef __WXPALMOS__ +# include <PalmOS.h> +#endif + +// include <os2.h> +#ifdef __OS2__ +# include "wx/os2/private.h" +#endif + +// include mgl headers +#ifdef __WXMGL__ +# include "wx/mgl/private.h" +#endif + +// include the most common wx headers +#include "wx/wx.h" + +#endif // WX_PRECOMP diff --git a/Externals/wxWidgets/include/wx/wxshlb_cw.h b/Externals/wxWidgets/include/wx/wxshlb_cw.h new file mode 100644 index 0000000000..55987b1dfe --- /dev/null +++ b/Externals/wxWidgets/include/wx/wxshlb_cw.h @@ -0,0 +1,65 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx_cw.h +// Purpose: wxWidgets definitions for CodeWarrior builds +// Author: Stefan Csomor +// Modified by: +// Created: 12/10/98 +// RCS-ID: $Id: wxshlb_cw.h 33744 2005-04-19 10:06:30Z SC $ +// Copyright: (c) Stefan Csomor +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CW__ +#define _WX_CW__ + +#if __MWERKS__ >= 0x2400 +#pragma old_argmatch on +#endif + +#if __option(profile) +#ifdef __cplusplus + #if __POWERPC__ + #include "wxshlb_PPC++_prof.mch" + #elif __INTEL__ + #include "wxshlb_x86++_prof.mch" + #elif __CFM68K__ + #include "wxshlb_cfm++_prof.mch" + #else + #include "wxshlb_68k++_prof.mch" + #endif +#else + #if __POWERPC__ + #include "wxshlb_PPC_prof.mch" + #elif __INTEL__ + #include "wxshlb_x86_prof.mch" + #elif __CFM68K__ + #include "wxshlb_cfm_prof.mch" + #else + #include "wxshlb_68k_prof.mch" + #endif +#endif +#else +#ifdef __cplusplus + #if __POWERPC__ + #include "wxshlb_PPC++.mch" + #elif __INTEL__ + #include "wxshlb_x86++.mch" + #elif __CFM68K__ + #include "wxshlb_cfm++.mch" + #else + #include "wxshlb_68k++.mch" + #endif +#else + #if __POWERPC__ + #include "wxshlb_PPC.mch" + #elif __INTEL__ + #include "wxshlb_x86.mch" + #elif __CFM68K__ + #include "wxshlb_cfm.mch" + #else + #include "wxshlb_68k.mch" + #endif +#endif +#endif +#endif + // _WX_CW__ diff --git a/Externals/wxWidgets/include/wx/wxshlb_cw_d.h b/Externals/wxWidgets/include/wx/wxshlb_cw_d.h new file mode 100644 index 0000000000..a34abf019a --- /dev/null +++ b/Externals/wxWidgets/include/wx/wxshlb_cw_d.h @@ -0,0 +1,46 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx_cw_d.h +// Purpose: wxWidgets definitions for CodeWarrior builds (Debug) +// Author: Stefan Csomor +// Modified by: +// Created: 12/10/98 +// RCS-ID: $Id: wxshlb_cw_d.h 33744 2005-04-19 10:06:30Z SC $ +// Copyright: (c) Stefan Csomor +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CW__ +#define _WX_CW__ + +#if __MWERKS__ >= 0x2400 +#pragma old_argmatch on +#endif + +#if __option(profile) +#error "profiling is not supported in debug versions" +#else +#ifdef __cplusplus + #if __POWERPC__ + #include "wxshlb_PPC++_d.mch" + #elif __INTEL__ + #include "wxshlb_x86++_d.mch" + #elif __CFM68K__ + #include "wxshlb_cfm++_d.mch" + #else + #include "wxshlb_68k++_d.mch" + #endif +#else + #if __POWERPC__ + #include "wxshlb_PPC_d.mch" + #elif __INTEL__ + #include "wxshlb_x86_d.mch" + #elif __CFM68K__ + #include "wxshlb_cfm_d.mch" + #else + #include "wxshlb_68k_d.mch" + #endif +#endif +#endif + +#endif + // _WX_CW__ diff --git a/Externals/wxWidgets/include/wx/wxshlb_cwc.h b/Externals/wxWidgets/include/wx/wxshlb_cwc.h new file mode 100644 index 0000000000..1e3166e137 --- /dev/null +++ b/Externals/wxWidgets/include/wx/wxshlb_cwc.h @@ -0,0 +1,45 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx_cw.h +// Purpose: wxWidgets definitions for CodeWarrior builds +// Author: Stefan Csomor +// Modified by: +// Created: 12/10/98 +// RCS-ID: $Id: wxshlb_cwc.h 33744 2005-04-19 10:06:30Z SC $ +// Copyright: (c) Stefan Csomor +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CW__ +#define _WX_CW__ + +#if __MWERKS__ >= 0x2400 +#pragma old_argmatch on +#endif + +#if __option(profile) +#ifdef __cplusplus + #if __POWERPC__ + #include "wxshlb_Carbon++_prof.mch" + #endif +#else + #if __POWERPC__ + #include "wxshlb_Carbon_prof.mch" + #endif +#endif +#else +#ifdef __cplusplus + #if __MACH__ + #include "wxshlb_Mach++.mch" + #elif __POWERPC__ + #include "wxshlb_Carbon++.mch" + #endif +#else + #if __MACH__ + #include "wxshlb_Mach.mch" + #elif __POWERPC__ + #include "wxshlb_Carbon.mch" + #endif +#endif +#endif +#endif + // _WX_CW__ diff --git a/Externals/wxWidgets/include/wx/wxshlb_cwc_d.h b/Externals/wxWidgets/include/wx/wxshlb_cwc_d.h new file mode 100644 index 0000000000..b0909c4588 --- /dev/null +++ b/Externals/wxWidgets/include/wx/wxshlb_cwc_d.h @@ -0,0 +1,38 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx_cw_d.h +// Purpose: wxWidgets definitions for CodeWarrior builds (Debug) +// Author: Stefan Csomor +// Modified by: +// Created: 12/10/98 +// RCS-ID: $Id: wxshlb_cwc_d.h 33744 2005-04-19 10:06:30Z SC $ +// Copyright: (c) Stefan Csomor +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CW__ +#define _WX_CW__ + +#if __MWERKS__ >= 0x2400 +#pragma old_argmatch on +#endif + +#if __option(profile) +#error "profiling is not supported in debug versions" +#else +#ifdef __cplusplus + #ifdef __MACH__ + #include "wxshlb_Mach++_d.mch" + #elif __POWERPC__ + #include "wxshlb_Carbon++_d.mch" + #endif +#else + #ifdef __MACH__ + #include "wxshlb_Mach_d.mch" + #elif __POWERPC__ + #include "wxshlb_Carbon_d.mch" + #endif +#endif +#endif + +#endif + // _WX_CW__ diff --git a/Externals/wxWidgets/include/wx/wxshlba_cw.h b/Externals/wxWidgets/include/wx/wxshlba_cw.h new file mode 100644 index 0000000000..190492c4bc --- /dev/null +++ b/Externals/wxWidgets/include/wx/wxshlba_cw.h @@ -0,0 +1,65 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx_cw.h +// Purpose: wxWidgets definitions for CodeWarrior builds +// Author: Stefan Csomor +// Modified by: +// Created: 12/10/98 +// RCS-ID: $Id: wxshlba_cw.h 33744 2005-04-19 10:06:30Z SC $ +// Copyright: (c) Stefan Csomor +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CW__ +#define _WX_CW__ + +#if __MWERKS__ >= 0x2400 +#pragma old_argmatch on +#endif + +#if __option(profile) +#ifdef __cplusplus + #if __POWERPC__ + #include "wxshlba_PPC++_prof.mch" + #elif __INTEL__ + #include "wxshlba_x86++_prof.mch" + #elif __CFM68K__ + #include "wxshlba_cfm++_prof.mch" + #else + #include "wxshlba_68k++_prof.mch" + #endif +#else + #if __POWERPC__ + #include "wxshlba_PPC_prof.mch" + #elif __INTEL__ + #include "wxshlba_x86_prof.mch" + #elif __CFM68K__ + #include "wxshlba_cfm_prof.mch" + #else + #include "wxshlba_68k_prof.mch" + #endif +#endif +#else +#ifdef __cplusplus + #if __POWERPC__ + #include "wxshlba_PPC++.mch" + #elif __INTEL__ + #include "wxshlba_x86++.mch" + #elif __CFM68K__ + #include "wxshlba_cfm++.mch" + #else + #include "wxshlba_68k++.mch" + #endif +#else + #if __POWERPC__ + #include "wxshlba_PPC.mch" + #elif __INTEL__ + #include "wxshlba_x86.mch" + #elif __CFM68K__ + #include "wxshlba_cfm.mch" + #else + #include "wxshlba_68k.mch" + #endif +#endif +#endif +#endif + // _WX_CW__ diff --git a/Externals/wxWidgets/include/wx/wxshlba_cw_d.h b/Externals/wxWidgets/include/wx/wxshlba_cw_d.h new file mode 100644 index 0000000000..db3f5e57b7 --- /dev/null +++ b/Externals/wxWidgets/include/wx/wxshlba_cw_d.h @@ -0,0 +1,46 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx_cw_d.h +// Purpose: wxWidgets definitions for CodeWarrior builds (Debug) +// Author: Stefan Csomor +// Modified by: +// Created: 12/10/98 +// RCS-ID: $Id: wxshlba_cw_d.h 33744 2005-04-19 10:06:30Z SC $ +// Copyright: (c) Stefan Csomor +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CW__ +#define _WX_CW__ + +#if __MWERKS__ >= 0x2400 +#pragma old_argmatch on +#endif + +#if __option(profile) +#error "profiling is not supported in debug versions" +#else +#ifdef __cplusplus + #if __POWERPC__ + #include "wxshlba_PPC++_d.mch" + #elif __INTEL__ + #include "wxshlba_x86++_d.mch" + #elif __CFM68K__ + #include "wxshlba_cfm++_d.mch" + #else + #include "wxshlba_68k++_d.mch" + #endif +#else + #if __POWERPC__ + #include "wxshlba_PPC_d.mch" + #elif __INTEL__ + #include "wxshlba_x86_d.mch" + #elif __CFM68K__ + #include "wxshlba_cfm_d.mch" + #else + #include "wxshlba_68k_d.mch" + #endif +#endif +#endif + +#endif + // _WX_CW__ diff --git a/Externals/wxWidgets/include/wx/wxshlba_cwc.h b/Externals/wxWidgets/include/wx/wxshlba_cwc.h new file mode 100644 index 0000000000..33a5c85635 --- /dev/null +++ b/Externals/wxWidgets/include/wx/wxshlba_cwc.h @@ -0,0 +1,45 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx_cw.h +// Purpose: wxWidgets definitions for CodeWarrior builds +// Author: Stefan Csomor +// Modified by: +// Created: 12/10/98 +// RCS-ID: $Id: wxshlba_cwc.h 33744 2005-04-19 10:06:30Z SC $ +// Copyright: (c) Stefan Csomor +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CW__ +#define _WX_CW__ + +#if __MWERKS__ >= 0x2400 +#pragma old_argmatch on +#endif + +#if __option(profile) +#ifdef __cplusplus + #if __POWERPC__ + #include "wxshlba_Carbon++_prof.mch" + #endif +#else + #if __POWERPC__ + #include "wxshlba_Carbon_prof.mch" + #endif +#endif +#else +#ifdef __cplusplus + #ifdef __MACH__ + #include "wxshlba_Mach++.mch" + #elif __POWERPC__ + #include "wxshlba_Carbon++.mch" + #endif +#else + #ifdef __MACH__ + #include "wxshlba_Mach.mch" + #elif __POWERPC__ + #include "wxshlba_Carbon.mch" + #endif +#endif +#endif +#endif + // _WX_CW__ diff --git a/Externals/wxWidgets/include/wx/wxshlba_cwc_d.h b/Externals/wxWidgets/include/wx/wxshlba_cwc_d.h new file mode 100644 index 0000000000..9cbce75abb --- /dev/null +++ b/Externals/wxWidgets/include/wx/wxshlba_cwc_d.h @@ -0,0 +1,38 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx_cw_d.h +// Purpose: wxWidgets definitions for CodeWarrior builds (Debug) +// Author: Stefan Csomor +// Modified by: +// Created: 12/10/98 +// RCS-ID: $Id: wxshlba_cwc_d.h 33744 2005-04-19 10:06:30Z SC $ +// Copyright: (c) Stefan Csomor +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_CW__ +#define _WX_CW__ + +#if __MWERKS__ >= 0x2400 +#pragma old_argmatch on +#endif + +#if __option(profile) +#error "profiling is not supported in debug versions" +#else +#ifdef __cplusplus + #ifdef __MACH__ + #include "wxshlba_Mach++_d.mch" + #elif __POWERPC__ + #include "wxshlba_Carbon++_d.mch" + #endif +#else + #ifdef __MACH__ + #include "wxshlba_Mach_d.mch" + #elif __POWERPC__ + #include "wxshlba_Carbon_d.mch" + #endif +#endif +#endif + +#endif + // _WX_CW__ diff --git a/Externals/wxWidgets/include/wx/xml/xml.h b/Externals/wxWidgets/include/wx/xml/xml.h new file mode 100644 index 0000000000..e8658d7cd0 --- /dev/null +++ b/Externals/wxWidgets/include/wx/xml/xml.h @@ -0,0 +1,249 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: xml.h +// Purpose: wxXmlDocument - XML parser & data holder class +// Author: Vaclav Slavik +// Created: 2000/03/05 +// RCS-ID: $Id: xml.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) 2000 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + + +#ifndef _WX_XML_H_ +#define _WX_XML_H_ + +#include "wx/defs.h" + +#if wxUSE_XML + +#include "wx/string.h" +#include "wx/object.h" +#include "wx/list.h" + +#ifdef WXMAKINGDLL_XML + #define WXDLLIMPEXP_XML WXEXPORT +#elif defined(WXUSINGDLL) + #define WXDLLIMPEXP_XML WXIMPORT +#else // not making nor using DLL + #define WXDLLIMPEXP_XML +#endif + +class WXDLLIMPEXP_FWD_XML wxXmlNode; +class WXDLLIMPEXP_FWD_XML wxXmlProperty; +class WXDLLIMPEXP_FWD_XML wxXmlDocument; +class WXDLLIMPEXP_FWD_XML wxXmlIOHandler; +class WXDLLIMPEXP_FWD_BASE wxInputStream; +class WXDLLIMPEXP_FWD_BASE wxOutputStream; + + +// Represents XML node type. +enum wxXmlNodeType +{ + // note: values are synchronized with xmlElementType from libxml + wxXML_ELEMENT_NODE = 1, + wxXML_ATTRIBUTE_NODE = 2, + wxXML_TEXT_NODE = 3, + wxXML_CDATA_SECTION_NODE = 4, + wxXML_ENTITY_REF_NODE = 5, + wxXML_ENTITY_NODE = 6, + wxXML_PI_NODE = 7, + wxXML_COMMENT_NODE = 8, + wxXML_DOCUMENT_NODE = 9, + wxXML_DOCUMENT_TYPE_NODE = 10, + wxXML_DOCUMENT_FRAG_NODE = 11, + wxXML_NOTATION_NODE = 12, + wxXML_HTML_DOCUMENT_NODE = 13 +}; + + +// Represents node property(ies). +// Example: in <img src="hello.gif" id="3"/> "src" is property with value +// "hello.gif" and "id" is prop. with value "3". + +class WXDLLIMPEXP_XML wxXmlProperty +{ +public: + wxXmlProperty() : m_next(NULL) {} + wxXmlProperty(const wxString& name, const wxString& value, + wxXmlProperty *next = NULL) + : m_name(name), m_value(value), m_next(next) {} + virtual ~wxXmlProperty() {} + + wxString GetName() const { return m_name; } + wxString GetValue() const { return m_value; } + wxXmlProperty *GetNext() const { return m_next; } + + void SetName(const wxString& name) { m_name = name; } + void SetValue(const wxString& value) { m_value = value; } + void SetNext(wxXmlProperty *next) { m_next = next; } + +private: + wxString m_name; + wxString m_value; + wxXmlProperty *m_next; +}; + + + +// Represents node in XML document. Node has name and may have content +// and properties. Most common node types are wxXML_TEXT_NODE (name and props +// are irrelevant) and wxXML_ELEMENT_NODE (e.g. in <title>hi there is +// element with name="title", irrelevant content and one child (wxXML_TEXT_NODE +// with content="hi"). +// +// If wxUSE_UNICODE is 0, all strings are encoded in the encoding given to Load +// (default is UTF-8). + +class WXDLLIMPEXP_XML wxXmlNode +{ +public: + wxXmlNode() : m_properties(NULL), m_parent(NULL), + m_children(NULL), m_next(NULL) {} + wxXmlNode(wxXmlNode *parent, wxXmlNodeType type, + const wxString& name, const wxString& content = wxEmptyString, + wxXmlProperty *props = NULL, wxXmlNode *next = NULL); + virtual ~wxXmlNode(); + + // copy ctor & operator=. Note that this does NOT copy syblings + // and parent pointer, i.e. m_parent and m_next will be NULL + // after using copy ctor and are never unmodified by operator=. + // On the other hand, it DOES copy children and properties. + wxXmlNode(const wxXmlNode& node); + wxXmlNode& operator=(const wxXmlNode& node); + + // user-friendly creation: + wxXmlNode(wxXmlNodeType type, const wxString& name, + const wxString& content = wxEmptyString); + virtual void AddChild(wxXmlNode *child); + virtual bool InsertChild(wxXmlNode *child, wxXmlNode *before_node); + virtual bool RemoveChild(wxXmlNode *child); + virtual void AddProperty(const wxString& name, const wxString& value); + virtual bool DeleteProperty(const wxString& name); + + // access methods: + wxXmlNodeType GetType() const { return m_type; } + wxString GetName() const { return m_name; } + wxString GetContent() const { return m_content; } + + bool IsWhitespaceOnly() const; + int GetDepth(wxXmlNode *grandparent = NULL) const; + + // Gets node content from wxXML_ENTITY_NODE + // The problem is, content is represented as + // wxXML_ENTITY_NODE name="tag", content="" + // |-- wxXML_TEXT_NODE or + // wxXML_CDATA_SECTION_NODE name="" content="content" + wxString GetNodeContent() const; + + wxXmlNode *GetParent() const { return m_parent; } + wxXmlNode *GetNext() const { return m_next; } + wxXmlNode *GetChildren() const { return m_children; } + + wxXmlProperty *GetProperties() const { return m_properties; } + bool GetPropVal(const wxString& propName, wxString *value) const; + wxString GetPropVal(const wxString& propName, + const wxString& defaultVal) const; + bool HasProp(const wxString& propName) const; + + void SetType(wxXmlNodeType type) { m_type = type; } + void SetName(const wxString& name) { m_name = name; } + void SetContent(const wxString& con) { m_content = con; } + + void SetParent(wxXmlNode *parent) { m_parent = parent; } + void SetNext(wxXmlNode *next) { m_next = next; } + void SetChildren(wxXmlNode *child) { m_children = child; } + + void SetProperties(wxXmlProperty *prop) { m_properties = prop; } + virtual void AddProperty(wxXmlProperty *prop); + +private: + wxXmlNodeType m_type; + wxString m_name; + wxString m_content; + wxXmlProperty *m_properties; + wxXmlNode *m_parent, *m_children, *m_next; + + void DoCopy(const wxXmlNode& node); +}; + + + +// special indentation value for wxXmlDocument::Save +#define wxXML_NO_INDENTATION (-1) + +// flags for wxXmlDocument::Load +enum wxXmlDocumentLoadFlag +{ + wxXMLDOC_NONE = 0, + wxXMLDOC_KEEP_WHITESPACE_NODES = 1 +}; + + +// This class holds XML data/document as parsed by XML parser. + +class WXDLLIMPEXP_XML wxXmlDocument : public wxObject +{ +public: + wxXmlDocument(); + wxXmlDocument(const wxString& filename, + const wxString& encoding = wxT("UTF-8")); + wxXmlDocument(wxInputStream& stream, + const wxString& encoding = wxT("UTF-8")); + virtual ~wxXmlDocument() { wxDELETE(m_root); } + + wxXmlDocument(const wxXmlDocument& doc); + wxXmlDocument& operator=(const wxXmlDocument& doc); + + // Parses .xml file and loads data. Returns TRUE on success, FALSE + // otherwise. + virtual bool Load(const wxString& filename, + const wxString& encoding = wxT("UTF-8"), int flags = wxXMLDOC_NONE); + virtual bool Load(wxInputStream& stream, + const wxString& encoding = wxT("UTF-8"), int flags = wxXMLDOC_NONE); + + // Saves document as .xml file. + virtual bool Save(const wxString& filename, int indentstep = 1) const; + virtual bool Save(wxOutputStream& stream, int indentstep = 1) const; + + bool IsOk() const { return m_root != NULL; } + + // Returns root node of the document. + wxXmlNode *GetRoot() const { return m_root; } + + // Returns version of document (may be empty). + wxString GetVersion() const { return m_version; } + // Returns encoding of document (may be empty). + // Note: this is the encoding original file was saved in, *not* the + // encoding of in-memory representation! + wxString GetFileEncoding() const { return m_fileEncoding; } + + // Write-access methods: + wxXmlNode *DetachRoot() { wxXmlNode *old=m_root; m_root=NULL; return old; } + void SetRoot(wxXmlNode *node) { wxDELETE(m_root); m_root = node; } + void SetVersion(const wxString& version) { m_version = version; } + void SetFileEncoding(const wxString& encoding) { m_fileEncoding = encoding; } + +#if !wxUSE_UNICODE + // Returns encoding of in-memory representation of the document + // (same as passed to Load or ctor, defaults to UTF-8). + // NB: this is meaningless in Unicode build where data are stored as wchar_t* + wxString GetEncoding() const { return m_encoding; } + void SetEncoding(const wxString& enc) { m_encoding = enc; } +#endif + +private: + wxString m_version; + wxString m_fileEncoding; +#if !wxUSE_UNICODE + wxString m_encoding; +#endif + wxXmlNode *m_root; + + void DoCopy(const wxXmlDocument& doc); + + DECLARE_CLASS(wxXmlDocument) +}; + +#endif // wxUSE_XML + +#endif // _WX_XML_H_ diff --git a/Externals/wxWidgets/include/wx/xpmdecod.h b/Externals/wxWidgets/include/wx/xpmdecod.h new file mode 100644 index 0000000000..8cb516ae38 --- /dev/null +++ b/Externals/wxWidgets/include/wx/xpmdecod.h @@ -0,0 +1,47 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xpmdecod.h +// Purpose: wxXPMDecoder, XPM reader for wxImage and wxBitmap +// Author: Vaclav Slavik +// CVS-ID: $Id: xpmdecod.h 49804 2007-11-10 01:09:42Z VZ $ +// Copyright: (c) 2001 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XPMDECOD_H_ +#define _WX_XPMDECOD_H_ + +#include "wx/defs.h" + +#if wxUSE_IMAGE && wxUSE_XPM + +class WXDLLIMPEXP_FWD_CORE wxImage; +class WXDLLIMPEXP_FWD_BASE wxInputStream; + +// -------------------------------------------------------------------------- +// wxXPMDecoder class +// -------------------------------------------------------------------------- + +class WXDLLEXPORT wxXPMDecoder +{ +public: + // constructor, destructor, etc. + wxXPMDecoder() {} + ~wxXPMDecoder() {} + +#if wxUSE_STREAMS + // Is the stream XPM file? + bool CanRead(wxInputStream& stream); + // Read XPM file from the stream, parse it and create image from it + wxImage ReadFile(wxInputStream& stream); +#endif + // Read directly from XPM data (as passed to wxBitmap ctor): + wxImage ReadData(const char* const* xpm_data); +#ifdef __BORLANDC__ + // needed for Borland 5.5 + wxImage ReadData(char** xpm_data) { return ReadData(wx_const_cast(const char* const*, xpm_data)); } +#endif +}; + +#endif // wxUSE_IMAGE && wxUSE_XPM + +#endif // _WX_XPM_H_ diff --git a/Externals/wxWidgets/include/wx/xpmhand.h b/Externals/wxWidgets/include/wx/xpmhand.h new file mode 100644 index 0000000000..127c937320 --- /dev/null +++ b/Externals/wxWidgets/include/wx/xpmhand.h @@ -0,0 +1,25 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xpmhand.h +// Purpose: XPM handler base header +// Author: Julian Smart +// Modified by: +// Created: +// RCS-ID: $Id: xpmhand.h 33948 2005-05-04 18:57:50Z JS $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XPMHAND_H_BASE_ +#define _WX_XPMHAND_H_BASE_ + +// Only wxMSW and wxPM currently defines a separate XPM handler, since +// mostly Windows and Presentation Manager apps won't need XPMs. +#if defined(__WXMSW__) +#error xpmhand.h is no longer needed since wxImage now handles XPMs. +#endif +#if defined(__WXPM__) +#include "wx/os2/xpmhand.h" +#endif + +#endif + // _WX_XPMHAND_H_BASE_ diff --git a/Externals/wxWidgets/include/wx/xrc/xh_all.h b/Externals/wxWidgets/include/wx/xrc/xh_all.h new file mode 100644 index 0000000000..35e9c7e922 --- /dev/null +++ b/Externals/wxWidgets/include/wx/xrc/xh_all.h @@ -0,0 +1,74 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_all.h +// Purpose: includes all xh_*.h files +// Author: Vaclav Slavik +// Created: 2000/03/05 +// RCS-ID: $Id: xh_all.h 48045 2007-08-13 12:05:18Z JS $ +// Copyright: (c) 2000 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_ALL_H_ +#define _WX_XH_ALL_H_ + + +// Existing handlers: + +#include "wx/xrc/xh_menu.h" +#include "wx/xrc/xh_panel.h" +#include "wx/xrc/xh_dlg.h" +#include "wx/xrc/xh_bttn.h" +#include "wx/xrc/xh_chckb.h" +#include "wx/xrc/xh_tglbtn.h" +#include "wx/xrc/xh_gauge.h" +#include "wx/xrc/xh_html.h" +#include "wx/xrc/xh_spin.h" +#include "wx/xrc/xh_sttxt.h" +#include "wx/xrc/xh_slidr.h" +#include "wx/xrc/xh_radbt.h" +#include "wx/xrc/xh_radbx.h" +#include "wx/xrc/xh_combo.h" +#include "wx/xrc/xh_chckl.h" +#include "wx/xrc/xh_choic.h" +#include "wx/xrc/xh_datectrl.h" +#include "wx/xrc/xh_sizer.h" +#include "wx/xrc/xh_stbmp.h" +#include "wx/xrc/xh_notbk.h" +#include "wx/xrc/xh_odcombo.h" +#include "wx/xrc/xh_listbk.h" +#include "wx/xrc/xh_choicbk.h" +#include "wx/xrc/xh_treebk.h" +#include "wx/xrc/xh_text.h" +#include "wx/xrc/xh_listb.h" +#include "wx/xrc/xh_toolb.h" +#include "wx/xrc/xh_bmpbt.h" +#include "wx/xrc/xh_stbox.h" +#include "wx/xrc/xh_scrol.h" +#include "wx/xrc/xh_tree.h" +#include "wx/xrc/xh_cald.h" +#include "wx/xrc/xh_listc.h" +#include "wx/xrc/xh_stlin.h" +#include "wx/xrc/xh_bmp.h" +#include "wx/xrc/xh_unkwn.h" +#include "wx/xrc/xh_gdctl.h" +#include "wx/xrc/xh_frame.h" +#include "wx/xrc/xh_scwin.h" +#include "wx/xrc/xh_htmllbox.h" +#include "wx/xrc/xh_split.h" +#include "wx/xrc/xh_wizrd.h" +#include "wx/xrc/xh_statbar.h" +#include "wx/xrc/xh_mdi.h" +#include "wx/xrc/xh_grid.h" +#include "wx/xrc/xh_clrpicker.h" +#include "wx/xrc/xh_filepicker.h" +#include "wx/xrc/xh_fontpicker.h" +#include "wx/xrc/xh_dirpicker.h" +#include "wx/xrc/xh_hyperlink.h" +#include "wx/xrc/xh_bmpcbox.h" +#include "wx/xrc/xh_animatctrl.h" +#include "wx/xrc/xh_collpane.h" +#if wxABI_VERSION >= 20805 +#include "wx/xrc/xh_propdlg.h" +#endif + +#endif // _WX_XH_ALL_H_ diff --git a/Externals/wxWidgets/include/wx/xrc/xh_animatctrl.h b/Externals/wxWidgets/include/wx/xrc/xh_animatctrl.h new file mode 100644 index 0000000000..18d606d2f4 --- /dev/null +++ b/Externals/wxWidgets/include/wx/xrc/xh_animatctrl.h @@ -0,0 +1,30 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_animatctrl.h +// Purpose: XML resource handler for wxAnimationCtrl +// Author: Francesco Montorsi +// Created: 2006-10-15 +// RCS-ID: $Id: xh_animatctrl.h 42196 2006-10-21 13:59:25Z RR $ +// Copyright: (c) 2006 Francesco Montorsi +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_ANIMATIONCTRL_H_ +#define _WX_XH_ANIMATIONCTRL_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_ANIMATIONCTRL + +class WXDLLIMPEXP_XRC wxAnimationCtrlXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxAnimationCtrlXmlHandler) + +public: + wxAnimationCtrlXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC && wxUSE_ANIMATIONCTRL + +#endif // _WX_XH_ANIMATIONCTRL_H_ diff --git a/Externals/wxWidgets/include/wx/xrc/xh_bmp.h b/Externals/wxWidgets/include/wx/xrc/xh_bmp.h new file mode 100644 index 0000000000..93b443eb56 --- /dev/null +++ b/Externals/wxWidgets/include/wx/xrc/xh_bmp.h @@ -0,0 +1,40 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_bmp.h +// Purpose: XML resource handler for wxBitmap and wxIcon +// Author: Vaclav Slavik +// Created: 2000/09/00 +// RCS-ID: $Id: xh_bmp.h 41590 2006-10-03 14:53:40Z VZ $ +// Copyright: (c) 2000 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_BMP_H_ +#define _WX_XH_BMP_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC + +class WXDLLIMPEXP_XRC wxBitmapXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxBitmapXmlHandler) + +public: + wxBitmapXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +class WXDLLIMPEXP_XRC wxIconXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxIconXmlHandler) + +public: + wxIconXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC + +#endif // _WX_XH_BMP_H_ diff --git a/Externals/wxWidgets/include/wx/xrc/xh_bmpbt.h b/Externals/wxWidgets/include/wx/xrc/xh_bmpbt.h new file mode 100644 index 0000000000..ecd8fe1a9b --- /dev/null +++ b/Externals/wxWidgets/include/wx/xrc/xh_bmpbt.h @@ -0,0 +1,30 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_bmpbt.h +// Purpose: XML resource handler for bitmap buttons +// Author: Brian Gavin +// Created: 2000/03/05 +// RCS-ID: $Id: xh_bmpbt.h 41590 2006-10-03 14:53:40Z VZ $ +// Copyright: (c) 2000 Brian Gavin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_BMPBT_H_ +#define _WX_XH_BMPBT_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_BMPBUTTON + +class WXDLLIMPEXP_XRC wxBitmapButtonXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxBitmapButtonXmlHandler) + +public: + wxBitmapButtonXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC && wxUSE_BMPBUTTON + +#endif // _WX_XH_BMPBT_H_ diff --git a/Externals/wxWidgets/include/wx/xrc/xh_bmpcbox.h b/Externals/wxWidgets/include/wx/xrc/xh_bmpcbox.h new file mode 100644 index 0000000000..8e1e1586db --- /dev/null +++ b/Externals/wxWidgets/include/wx/xrc/xh_bmpcbox.h @@ -0,0 +1,36 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_bmpcbox.h +// Purpose: XML resource handler for wxBitmapComboBox +// Author: Jaakko Salli +// Created: Sep-10-2006 +// RCS-ID: $Id: xh_bmpcbox.h 42046 2006-10-16 09:30:01Z ABX $ +// Copyright: (c) 2006 Jaakko Salli +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_BMPCBOX_H_ +#define _WX_XH_BMPCBOX_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_BITMAPCOMBOBOX + +class WXDLLIMPEXP_ADV wxBitmapComboBox; + +class WXDLLIMPEXP_XRC wxBitmapComboBoxXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxBitmapComboBoxXmlHandler) + +public: + wxBitmapComboBoxXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); + +private: + wxBitmapComboBox* m_combobox; + bool m_isInside; +}; + +#endif // wxUSE_XRC && wxUSE_BITMAPCOMBOBOX + +#endif // _WX_XH_BMPCBOX_H_ diff --git a/Externals/wxWidgets/include/wx/xrc/xh_bttn.h b/Externals/wxWidgets/include/wx/xrc/xh_bttn.h new file mode 100644 index 0000000000..4ed7a0eea8 --- /dev/null +++ b/Externals/wxWidgets/include/wx/xrc/xh_bttn.h @@ -0,0 +1,30 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_bttn.h +// Purpose: XML resource handler for buttons +// Author: Vaclav Slavik +// Created: 2000/03/05 +// RCS-ID: $Id: xh_bttn.h 41590 2006-10-03 14:53:40Z VZ $ +// Copyright: (c) 2000 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_BTTN_H_ +#define _WX_XH_BTTN_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_BUTTON + +class WXDLLIMPEXP_XRC wxButtonXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxButtonXmlHandler) + +public: + wxButtonXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC && wxUSE_BUTTON + +#endif // _WX_XH_BTTN_H_ diff --git a/Externals/wxWidgets/include/wx/xrc/xh_cald.h b/Externals/wxWidgets/include/wx/xrc/xh_cald.h new file mode 100644 index 0000000000..a9f348a16b --- /dev/null +++ b/Externals/wxWidgets/include/wx/xrc/xh_cald.h @@ -0,0 +1,30 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_cald.h +// Purpose: XML resource handler for wxCalendarCtrl +// Author: Brian Gavin +// Created: 2000/09/09 +// RCS-ID: $Id: xh_cald.h 41590 2006-10-03 14:53:40Z VZ $ +// Copyright: (c) 2000 Brian Gavin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_CALD_H_ +#define _WX_XH_CALD_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_CALENDARCTRL + +class WXDLLIMPEXP_XRC wxCalendarCtrlXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxCalendarCtrlXmlHandler) + +public: + wxCalendarCtrlXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC && wxUSE_CALENDARCTRL + +#endif // _WX_XH_CALD_H_ diff --git a/Externals/wxWidgets/include/wx/xrc/xh_chckb.h b/Externals/wxWidgets/include/wx/xrc/xh_chckb.h new file mode 100644 index 0000000000..7a3bd3636c --- /dev/null +++ b/Externals/wxWidgets/include/wx/xrc/xh_chckb.h @@ -0,0 +1,31 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_chckb.h +// Purpose: XML resource handler for wxCheckBox +// Author: Bob Mitchell +// Created: 2000/03/21 +// RCS-ID: $Id: xh_chckb.h 41590 2006-10-03 14:53:40Z VZ $ +// Copyright: (c) 2000 Bob Mitchell and Verant Interactive +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_CHCKB_H_ +#define _WX_XH_CHCKB_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_CHECKBOX + +class WXDLLIMPEXP_XRC wxCheckBoxXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxCheckBoxXmlHandler) + +public: + wxCheckBoxXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC && wxUSE_CHECKBOX + +#endif // _WX_XH_CHECKBOX_H_ + diff --git a/Externals/wxWidgets/include/wx/xrc/xh_chckl.h b/Externals/wxWidgets/include/wx/xrc/xh_chckl.h new file mode 100644 index 0000000000..f130774116 --- /dev/null +++ b/Externals/wxWidgets/include/wx/xrc/xh_chckl.h @@ -0,0 +1,34 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_chckl.h +// Purpose: XML resource handler for wxCheckListBox +// Author: Bob Mitchell +// Created: 2000/03/21 +// RCS-ID: $Id: xh_chckl.h 41590 2006-10-03 14:53:40Z VZ $ +// Copyright: (c) 2000 Bob Mitchell and Verant Interactive +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_CHCKL_H_ +#define _WX_XH_CHCKL_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_CHECKLISTBOX + +class WXDLLIMPEXP_XRC wxCheckListBoxXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxCheckListBoxXmlHandler) + +public: + wxCheckListBoxXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); + +private: + bool m_insideBox; + wxArrayString strList; +}; + +#endif // wxUSE_XRC && wxUSE_CHECKLISTBOX + +#endif // _WX_XH_CHECKLIST_H_ diff --git a/Externals/wxWidgets/include/wx/xrc/xh_choic.h b/Externals/wxWidgets/include/wx/xrc/xh_choic.h new file mode 100644 index 0000000000..d57da00aca --- /dev/null +++ b/Externals/wxWidgets/include/wx/xrc/xh_choic.h @@ -0,0 +1,34 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_choic.h +// Purpose: XML resource handler for wxChoice +// Author: Bob Mitchell +// Created: 2000/03/21 +// RCS-ID: $Id: xh_choic.h 41590 2006-10-03 14:53:40Z VZ $ +// Copyright: (c) 2000 Bob Mitchell and Verant Interactive +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_CHOIC_H_ +#define _WX_XH_CHOIC_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_CHOICE + +class WXDLLIMPEXP_XRC wxChoiceXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxChoiceXmlHandler) + +public: + wxChoiceXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); + +private: + bool m_insideBox; + wxArrayString strList; +}; + +#endif // wxUSE_XRC && wxUSE_CHOICE + +#endif // _WX_XH_CHOIC_H_ diff --git a/Externals/wxWidgets/include/wx/xrc/xh_choicbk.h b/Externals/wxWidgets/include/wx/xrc/xh_choicbk.h new file mode 100644 index 0000000000..d79856bf4c --- /dev/null +++ b/Externals/wxWidgets/include/wx/xrc/xh_choicbk.h @@ -0,0 +1,34 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_choicbk.h +// Purpose: XML resource handler for wxChoicebook +// Author: Vaclav Slavik +// Copyright: (c) 2000 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_CHOICEBK_H_ +#define _WX_XH_CHOICEBK_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_CHOICEBOOK + +class WXDLLEXPORT wxChoicebook; + +class WXDLLIMPEXP_XRC wxChoicebookXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxChoicebookXmlHandler) + +public: + wxChoicebookXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); + +private: + bool m_isInside; + wxChoicebook *m_choicebook; +}; + +#endif // wxUSE_XRC && wxUSE_CHOICEBOOK + +#endif // _WX_XH_CHOICEBK_H_ diff --git a/Externals/wxWidgets/include/wx/xrc/xh_clrpicker.h b/Externals/wxWidgets/include/wx/xrc/xh_clrpicker.h new file mode 100644 index 0000000000..3ddb3b2cd4 --- /dev/null +++ b/Externals/wxWidgets/include/wx/xrc/xh_clrpicker.h @@ -0,0 +1,30 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_clrpicker.h +// Purpose: XML resource handler for wxColourPickerCtrl +// Author: Francesco Montorsi +// Created: 2006-04-17 +// RCS-ID: $Id: xh_clrpicker.h 41590 2006-10-03 14:53:40Z VZ $ +// Copyright: (c) 2006 Francesco Montorsi +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_CLRPICKERCTRL_H_ +#define _WX_XH_CLRPICKERCTRL_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_COLOURPICKERCTRL + +class WXDLLIMPEXP_XRC wxColourPickerCtrlXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxColourPickerCtrlXmlHandler) + +public: + wxColourPickerCtrlXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC && wxUSE_COLOURPICKERCTRL + +#endif // _WX_XH_CLRPICKERCTRL_H_ diff --git a/Externals/wxWidgets/include/wx/xrc/xh_collpane.h b/Externals/wxWidgets/include/wx/xrc/xh_collpane.h new file mode 100644 index 0000000000..fe3b859147 --- /dev/null +++ b/Externals/wxWidgets/include/wx/xrc/xh_collpane.h @@ -0,0 +1,36 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_collpane.h +// Purpose: XML resource handler for wxCollapsiblePane +// Author: Francesco Montorsi +// Created: 2006-10-27 +// RCS-ID: $Id: xh_collpane.h 49804 2007-11-10 01:09:42Z VZ $ +// Copyright: (c) 2006 Francesco Montorsi +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_COLLPANE_H_ +#define _WX_XH_COLLPANE_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_COLLPANE + +class WXDLLIMPEXP_FWD_ADV wxCollapsiblePane; + +class WXDLLIMPEXP_XRC wxCollapsiblePaneXmlHandler : public wxXmlResourceHandler +{ +public: + wxCollapsiblePaneXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); + +private: + bool m_isInside; + wxCollapsiblePane *m_collpane; + + DECLARE_DYNAMIC_CLASS(wxCollapsiblePaneXmlHandler) +}; + +#endif // wxUSE_XRC && wxUSE_COLLPANE + +#endif // _WX_XH_COLLPANE_H_ diff --git a/Externals/wxWidgets/include/wx/xrc/xh_combo.h b/Externals/wxWidgets/include/wx/xrc/xh_combo.h new file mode 100644 index 0000000000..f7857e02b6 --- /dev/null +++ b/Externals/wxWidgets/include/wx/xrc/xh_combo.h @@ -0,0 +1,34 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_combo.h +// Purpose: XML resource handler for wxComboBox +// Author: Bob Mitchell +// Created: 2000/03/21 +// RCS-ID: $Id: xh_combo.h 41590 2006-10-03 14:53:40Z VZ $ +// Copyright: (c) 2000 Bob Mitchell and Verant Interactive +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_COMBO_H_ +#define _WX_XH_COMBO_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_COMBOBOX + +class WXDLLIMPEXP_XRC wxComboBoxXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxComboBoxXmlHandler) + +public: + wxComboBoxXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); + +private: + bool m_insideBox; + wxArrayString strList; +}; + +#endif // wxUSE_XRC && wxUSE_COMBOBOX + +#endif // _WX_XH_COMBO_H_ diff --git a/Externals/wxWidgets/include/wx/xrc/xh_datectrl.h b/Externals/wxWidgets/include/wx/xrc/xh_datectrl.h new file mode 100644 index 0000000000..8ecb7c86fb --- /dev/null +++ b/Externals/wxWidgets/include/wx/xrc/xh_datectrl.h @@ -0,0 +1,30 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_datectrl.h +// Purpose: XML resource handler for wxDatePickerCtrl +// Author: Vaclav Slavik +// Created: 2005-02-07 +// RCS-ID: $Id: xh_datectrl.h 41590 2006-10-03 14:53:40Z VZ $ +// Copyright: (c) 2005 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_DATECTRL_H_ +#define _WX_XH_DATECTRL_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_DATEPICKCTRL + +class WXDLLIMPEXP_XRC wxDateCtrlXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxDateCtrlXmlHandler) + +public: + wxDateCtrlXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC && wxUSE_DATEPICKCTRL + +#endif // _WX_XH_DATECTRL_H_ diff --git a/Externals/wxWidgets/include/wx/xrc/xh_dirpicker.h b/Externals/wxWidgets/include/wx/xrc/xh_dirpicker.h new file mode 100644 index 0000000000..4d0c9d6b27 --- /dev/null +++ b/Externals/wxWidgets/include/wx/xrc/xh_dirpicker.h @@ -0,0 +1,30 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_dirpicker.h +// Purpose: XML resource handler for wxDirPickerCtrl +// Author: Francesco Montorsi +// Created: 2006-04-17 +// RCS-ID: $Id: xh_dirpicker.h 41590 2006-10-03 14:53:40Z VZ $ +// Copyright: (c) 2006 Francesco Montorsi +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_DIRPICKERCTRL_H_ +#define _WX_XH_DIRPICKERCTRL_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_DIRPICKERCTRL + +class WXDLLIMPEXP_XRC wxDirPickerCtrlXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxDirPickerCtrlXmlHandler) + +public: + wxDirPickerCtrlXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC && wxUSE_DIRPICKERCTRL + +#endif // _WX_XH_DIRPICKERCTRL_H_ diff --git a/Externals/wxWidgets/include/wx/xrc/xh_dlg.h b/Externals/wxWidgets/include/wx/xrc/xh_dlg.h new file mode 100644 index 0000000000..8c79bd4d99 --- /dev/null +++ b/Externals/wxWidgets/include/wx/xrc/xh_dlg.h @@ -0,0 +1,30 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_dlg.h +// Purpose: XML resource handler for dialogs +// Author: Vaclav Slavik +// Created: 2000/03/05 +// RCS-ID: $Id: xh_dlg.h 41590 2006-10-03 14:53:40Z VZ $ +// Copyright: (c) 2000 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_DLG_H_ +#define _WX_XH_DLG_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC + +class WXDLLIMPEXP_XRC wxDialogXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxDialogXmlHandler) + +public: + wxDialogXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC + +#endif // _WX_XH_DLG_H_ diff --git a/Externals/wxWidgets/include/wx/xrc/xh_filepicker.h b/Externals/wxWidgets/include/wx/xrc/xh_filepicker.h new file mode 100644 index 0000000000..36eed80210 --- /dev/null +++ b/Externals/wxWidgets/include/wx/xrc/xh_filepicker.h @@ -0,0 +1,30 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_filepicker.h +// Purpose: XML resource handler for wxFilePickerCtrl +// Author: Francesco Montorsi +// Created: 2006-04-17 +// RCS-ID: $Id: xh_filepicker.h 41590 2006-10-03 14:53:40Z VZ $ +// Copyright: (c) 2006 Francesco Montorsi +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_FILEPICKERCTRL_H_ +#define _WX_XH_FILEPICKERCTRL_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_FILEPICKERCTRL + +class WXDLLIMPEXP_XRC wxFilePickerCtrlXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxFilePickerCtrlXmlHandler) + +public: + wxFilePickerCtrlXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC && wxUSE_FILEPICKERCTRL + +#endif // _WX_XH_FILEPICKERCTRL_H_ diff --git a/Externals/wxWidgets/include/wx/xrc/xh_fontpicker.h b/Externals/wxWidgets/include/wx/xrc/xh_fontpicker.h new file mode 100644 index 0000000000..711b1a60c5 --- /dev/null +++ b/Externals/wxWidgets/include/wx/xrc/xh_fontpicker.h @@ -0,0 +1,30 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_fontpicker.h +// Purpose: XML resource handler for wxFontPickerCtrl +// Author: Francesco Montorsi +// Created: 2006-04-17 +// RCS-ID: $Id: xh_fontpicker.h 41590 2006-10-03 14:53:40Z VZ $ +// Copyright: (c) 2006 Francesco Montorsi +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_FONTPICKERCTRL_H_ +#define _WX_XH_FONTPICKERCTRL_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_FONTPICKERCTRL + +class WXDLLIMPEXP_XRC wxFontPickerCtrlXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxFontPickerCtrlXmlHandler) + +public: + wxFontPickerCtrlXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC && wxUSE_FONTPICKERCTRL + +#endif // _WX_XH_FONTPICKERCTRL_H_ diff --git a/Externals/wxWidgets/include/wx/xrc/xh_frame.h b/Externals/wxWidgets/include/wx/xrc/xh_frame.h new file mode 100644 index 0000000000..40ac2b9401 --- /dev/null +++ b/Externals/wxWidgets/include/wx/xrc/xh_frame.h @@ -0,0 +1,30 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_frame.h +// Purpose: XML resource handler for wxFrame +// Author: Vaclav Slavik & Aleks. +// Created: 2000/03/05 +// RCS-ID: $Id: xh_frame.h 41590 2006-10-03 14:53:40Z VZ $ +// Copyright: (c) 2000 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_FRAME_H_ +#define _WX_XH_FRAME_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC + +class WXDLLIMPEXP_XRC wxFrameXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxFrameXmlHandler) + +public: + wxFrameXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC + +#endif // _WX_XH_FRAME_H_ diff --git a/Externals/wxWidgets/include/wx/xrc/xh_gauge.h b/Externals/wxWidgets/include/wx/xrc/xh_gauge.h new file mode 100644 index 0000000000..1cefce96ed --- /dev/null +++ b/Externals/wxWidgets/include/wx/xrc/xh_gauge.h @@ -0,0 +1,34 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_gauge.h +// Purpose: XML resource handler for wxGauge +// Author: Bob Mitchell +// Created: 2000/03/21 +// RCS-ID: $Id: xh_gauge.h 41590 2006-10-03 14:53:40Z VZ $ +// Copyright: (c) 2000 Bob Mitchell and Verant Interactive +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_GAUGE_H_ +#define _WX_XH_GAUGE_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_GAUGE + +class WXDLLIMPEXP_XRC wxGaugeXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxGaugeXmlHandler) + enum + { + wxGAUGE_DEFAULT_RANGE = 100 + }; + +public: + wxGaugeXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC && wxUSE_GAUGE + +#endif // _WX_XH_GAUGE_H_ diff --git a/Externals/wxWidgets/include/wx/xrc/xh_gdctl.h b/Externals/wxWidgets/include/wx/xrc/xh_gdctl.h new file mode 100644 index 0000000000..f0bd1f5cde --- /dev/null +++ b/Externals/wxWidgets/include/wx/xrc/xh_gdctl.h @@ -0,0 +1,30 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_gdctl.h +// Purpose: XML resource handler for wxGenericDirCtrl +// Author: Markus Greither +// Created: 2002/01/20 +// RCS-ID: $Id: xh_gdctl.h 41590 2006-10-03 14:53:40Z VZ $ +// Copyright: (c) 2002 Markus Greither +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_GDCTL_H_ +#define _WX_XH_GDCTL_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_DIRDLG + +class WXDLLIMPEXP_XRC wxGenericDirCtrlXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxGenericDirCtrlXmlHandler) + +public: + wxGenericDirCtrlXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC && wxUSE_DIRDLG + +#endif // _WX_XH_GDCTL_H_ diff --git a/Externals/wxWidgets/include/wx/xrc/xh_grid.h b/Externals/wxWidgets/include/wx/xrc/xh_grid.h new file mode 100644 index 0000000000..8e84009022 --- /dev/null +++ b/Externals/wxWidgets/include/wx/xrc/xh_grid.h @@ -0,0 +1,31 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_grid.h +// Purpose: XML resource handler for wxGrid +// Author: Agron Selimaj +// Created: 2005/08/11 +// RCS-ID: $Id: xh_grid.h 41590 2006-10-03 14:53:40Z VZ $ +// Copyright: (c) 2005 Agron Selimaj, Freepour Controls Inc. +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_GRD_H_ +#define _WX_XH_GRD_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_GRID + +class WXDLLIMPEXP_XRC wxGridXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxGridXmlHandler) + +public: + wxGridXmlHandler(); + + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC && wxUSE_GRID + +#endif // _WX_XH_GRD_H_ diff --git a/Externals/wxWidgets/include/wx/xrc/xh_html.h b/Externals/wxWidgets/include/wx/xrc/xh_html.h new file mode 100644 index 0000000000..c01b66e8fe --- /dev/null +++ b/Externals/wxWidgets/include/wx/xrc/xh_html.h @@ -0,0 +1,30 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_html.h +// Purpose: XML resource handler for wxHtmlWindow +// Author: Bob Mitchell +// Created: 2000/03/21 +// RCS-ID: $Id: xh_html.h 41590 2006-10-03 14:53:40Z VZ $ +// Copyright: (c) 2000 Bob Mitchell and Verant Interactive +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_HTML_H_ +#define _WX_XH_HTML_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_HTML + +class WXDLLIMPEXP_XRC wxHtmlWindowXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxHtmlWindowXmlHandler) + +public: + wxHtmlWindowXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC && wxUSE_HTML + +#endif // _WX_XH_HTML_H_ diff --git a/Externals/wxWidgets/include/wx/xrc/xh_htmllbox.h b/Externals/wxWidgets/include/wx/xrc/xh_htmllbox.h new file mode 100644 index 0000000000..529c8049cd --- /dev/null +++ b/Externals/wxWidgets/include/wx/xrc/xh_htmllbox.h @@ -0,0 +1,34 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_htmllbox.h +// Purpose: XML resource handler for wxSimpleHtmlListBox +// Author: Francesco Montorsi +// Created: 2006/10/21 +// RCS-ID: $Id: xh_htmllbox.h 42257 2006-10-22 22:09:16Z VZ $ +// Copyright: (c) 2006 Francesco Montorsi +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_SIMPLEHTMLLISTBOX_H_ +#define _WX_XH_SIMPLEHTMLLISTBOX_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_HTML + +class WXDLLIMPEXP_XRC wxSimpleHtmlListBoxXmlHandler : public wxXmlResourceHandler +{ +public: + wxSimpleHtmlListBoxXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); + +private: + bool m_insideBox; + wxArrayString strList; + + DECLARE_DYNAMIC_CLASS(wxSimpleHtmlListBoxXmlHandler) +}; + +#endif // wxUSE_XRC && wxUSE_HTML + +#endif // _WX_XH_SIMPLEHTMLLISTBOX_H_ diff --git a/Externals/wxWidgets/include/wx/xrc/xh_hyperlink.h b/Externals/wxWidgets/include/wx/xrc/xh_hyperlink.h new file mode 100644 index 0000000000..157ef2b8ce --- /dev/null +++ b/Externals/wxWidgets/include/wx/xrc/xh_hyperlink.h @@ -0,0 +1,37 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_hyperlink.h +// Purpose: Hyperlink control (wxAdv) +// Author: David Norris +// Modified by: Ryan Norton, Francesco Montorsi +// Created: 04/02/2005 +// RCS-ID: $Id: xh_hyperlink.h 41590 2006-10-03 14:53:40Z VZ $ +// Copyright: (c) 2005 David Norris +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_HYPERLINKH__ +#define _WX_XH_HYPERLINKH__ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_HYPERLINKCTRL + +class WXDLLIMPEXP_XRC wxHyperlinkCtrlXmlHandler : public wxXmlResourceHandler +{ + // Register with wxWindows' dynamic class subsystem. + DECLARE_DYNAMIC_CLASS(wxHyperlinkCtrlXmlHandler) + +public: + // Constructor. + wxHyperlinkCtrlXmlHandler(); + + // Creates the control and returns a pointer to it. + virtual wxObject *DoCreateResource(); + + // Returns true if we know how to create a control for the given node. + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC && wxUSE_HYPERLINKCTRL + +#endif // _WX_XH_HYPERLINKH__ diff --git a/Externals/wxWidgets/include/wx/xrc/xh_listb.h b/Externals/wxWidgets/include/wx/xrc/xh_listb.h new file mode 100644 index 0000000000..6a6ad581fe --- /dev/null +++ b/Externals/wxWidgets/include/wx/xrc/xh_listb.h @@ -0,0 +1,34 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_listb.h +// Purpose: XML resource handler for wxListbox +// Author: Bob Mitchell & Vaclav Slavik +// Created: 2000/07/29 +// RCS-ID: $Id: xh_listb.h 41590 2006-10-03 14:53:40Z VZ $ +// Copyright: (c) 2000 Bob Mitchell & Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_LISTB_H_ +#define _WX_XH_LISTB_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_LISTBOX + +class WXDLLIMPEXP_XRC wxListBoxXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxListBoxXmlHandler) + +public: + wxListBoxXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); + +private: + bool m_insideBox; + wxArrayString strList; +}; + +#endif // wxUSE_XRC && wxUSE_LISTBOX + +#endif // _WX_XH_LISTB_H_ diff --git a/Externals/wxWidgets/include/wx/xrc/xh_listbk.h b/Externals/wxWidgets/include/wx/xrc/xh_listbk.h new file mode 100644 index 0000000000..f012e29740 --- /dev/null +++ b/Externals/wxWidgets/include/wx/xrc/xh_listbk.h @@ -0,0 +1,34 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_listbk.h +// Purpose: XML resource handler for wxListbook +// Author: Vaclav Slavik +// Copyright: (c) 2000 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_LISTBK_H_ +#define _WX_XH_LISTBK_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_LISTBOOK + +class WXDLLEXPORT wxListbook; + +class WXDLLIMPEXP_XRC wxListbookXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxListbookXmlHandler) + +public: + wxListbookXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); + +private: + bool m_isInside; + wxListbook *m_listbook; +}; + +#endif // wxUSE_XRC && wxUSE_LISTBOOK + +#endif // _WX_XH_LISTBK_H_ diff --git a/Externals/wxWidgets/include/wx/xrc/xh_listc.h b/Externals/wxWidgets/include/wx/xrc/xh_listc.h new file mode 100644 index 0000000000..fd88cb5034 --- /dev/null +++ b/Externals/wxWidgets/include/wx/xrc/xh_listc.h @@ -0,0 +1,30 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_listc.h +// Purpose: XML resource handler for wxListCtrl +// Author: Brian Gavin +// Created: 2000/09/09 +// RCS-ID: $Id: xh_listc.h 41590 2006-10-03 14:53:40Z VZ $ +// Copyright: (c) 2000 Brian Gavin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_LISTC_H_ +#define _WX_XH_LISTC_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_LISTCTRL + +class WXDLLIMPEXP_XRC wxListCtrlXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxListCtrlXmlHandler) + +public: + wxListCtrlXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC && wxUSE_LISTCTRL + +#endif // _WX_XH_LISTC_H_ diff --git a/Externals/wxWidgets/include/wx/xrc/xh_mdi.h b/Externals/wxWidgets/include/wx/xrc/xh_mdi.h new file mode 100644 index 0000000000..0753a54d79 --- /dev/null +++ b/Externals/wxWidgets/include/wx/xrc/xh_mdi.h @@ -0,0 +1,35 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_mdi.h +// Purpose: XML resource handler for wxMDI +// Author: David M. Falkinder & Vaclav Slavik +// Created: 14/02/2005 +// RCS-ID: $Id: xh_mdi.h 49804 2007-11-10 01:09:42Z VZ $ +// Copyright: (c) 2005 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_MDI_H_ +#define _WX_XH_MDI_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_MDI + +class WXDLLIMPEXP_FWD_CORE wxWindow; + +class WXDLLIMPEXP_XRC wxMdiXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxMdiXmlHandler) + +public: + wxMdiXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); + +private: + wxWindow *CreateFrame(); +}; + +#endif // wxUSE_XRC && wxUSE_MDI + +#endif // _WX_XH_MDI_H_ diff --git a/Externals/wxWidgets/include/wx/xrc/xh_menu.h b/Externals/wxWidgets/include/wx/xrc/xh_menu.h new file mode 100644 index 0000000000..a1895df561 --- /dev/null +++ b/Externals/wxWidgets/include/wx/xrc/xh_menu.h @@ -0,0 +1,43 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_menu.h +// Purpose: XML resource handler for menus/menubars +// Author: Vaclav Slavik +// Created: 2000/03/05 +// RCS-ID: $Id: xh_menu.h 41590 2006-10-03 14:53:40Z VZ $ +// Copyright: (c) 2000 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_MENU_H_ +#define _WX_XH_MENU_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_MENUS + +class WXDLLIMPEXP_XRC wxMenuXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxMenuXmlHandler) + +public: + wxMenuXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); + +private: + bool m_insideMenu; +}; + +class WXDLLIMPEXP_XRC wxMenuBarXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxMenuBarXmlHandler) + +public: + wxMenuBarXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC && wxUSE_MENUS + +#endif // _WX_XH_MENU_H_ diff --git a/Externals/wxWidgets/include/wx/xrc/xh_notbk.h b/Externals/wxWidgets/include/wx/xrc/xh_notbk.h new file mode 100644 index 0000000000..143892bbe6 --- /dev/null +++ b/Externals/wxWidgets/include/wx/xrc/xh_notbk.h @@ -0,0 +1,35 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_notbk.h +// Purpose: XML resource handler for wxNotebook +// Author: Vaclav Slavik +// RCS-ID: $Id: xh_notbk.h 41590 2006-10-03 14:53:40Z VZ $ +// Copyright: (c) 2000 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_NOTBK_H_ +#define _WX_XH_NOTBK_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_NOTEBOOK + +class WXDLLEXPORT wxNotebook; + +class WXDLLIMPEXP_XRC wxNotebookXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxNotebookXmlHandler) + +public: + wxNotebookXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); + +private: + bool m_isInside; + wxNotebook *m_notebook; +}; + +#endif // wxUSE_XRC && wxUSE_NOTEBOOK + +#endif // _WX_XH_NOTBK_H_ diff --git a/Externals/wxWidgets/include/wx/xrc/xh_odcombo.h b/Externals/wxWidgets/include/wx/xrc/xh_odcombo.h new file mode 100644 index 0000000000..a9c6afd045 --- /dev/null +++ b/Externals/wxWidgets/include/wx/xrc/xh_odcombo.h @@ -0,0 +1,35 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_odcombo.h +// Purpose: XML resource handler for wxOwnerDrawnComboBox +// Author: Alex Bligh - based on wx/xrc/xh_combo.h +// Created: 2006/06/19 +// RCS-ID: $Id: xh_odcombo.h 41590 2006-10-03 14:53:40Z VZ $ +// Copyright: (c) 2006 Alex Bligh +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_ODCOMBO_H_ +#define _WX_XH_ODCOMBO_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_ODCOMBOBOX + +class WXDLLIMPEXP_XRC wxOwnerDrawnComboBoxXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxOwnerDrawnComboBoxXmlHandler) + +public: + wxOwnerDrawnComboBoxXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); + +private: + bool m_insideBox; + wxArrayString strList; +}; + +#endif // wxUSE_XRC && wxUSE_ODCOMBOBOX + +#endif // _WX_XH_ODCOMBO_H_ + diff --git a/Externals/wxWidgets/include/wx/xrc/xh_panel.h b/Externals/wxWidgets/include/wx/xrc/xh_panel.h new file mode 100644 index 0000000000..65247c9880 --- /dev/null +++ b/Externals/wxWidgets/include/wx/xrc/xh_panel.h @@ -0,0 +1,30 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_panel.h +// Purpose: XML resource handler for wxPanel +// Author: Vaclav Slavik +// Created: 2000/03/05 +// RCS-ID: $Id: xh_panel.h 41590 2006-10-03 14:53:40Z VZ $ +// Copyright: (c) 2000 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_PANEL_H_ +#define _WX_XH_PANEL_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC + +class WXDLLIMPEXP_XRC wxPanelXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxPanelXmlHandler) + +public: + wxPanelXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC + +#endif // _WX_XH_PANEL_H_ diff --git a/Externals/wxWidgets/include/wx/xrc/xh_propdlg.h b/Externals/wxWidgets/include/wx/xrc/xh_propdlg.h new file mode 100644 index 0000000000..46bd2c47e4 --- /dev/null +++ b/Externals/wxWidgets/include/wx/xrc/xh_propdlg.h @@ -0,0 +1,38 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_propdlg.h +// Purpose: XML resource handler for wxPropertySheetDialog +// Author: Sander Berents +// Created: 2007/07/12 +// RCS-ID: $Id: xh_propdlg.h 48279 2007-08-21 11:35:50Z VS $ +// Copyright: (c) 2007 Sander Berents +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_PROPDLG_H_ +#define _WX_XH_PROPDLG_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC + +#if wxABI_VERSION >= 20805 +class WXDLLEXPORT wxPropertySheetDialog; + +class WXDLLIMPEXP_XRC wxPropertySheetDialogXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxPropertySheetDialogXmlHandler) + +public: + wxPropertySheetDialogXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); + +private: + bool m_isInside; + wxPropertySheetDialog *m_dialog; +}; +#endif // wxABI_VERSION >= 20805 + +#endif // wxUSE_XRC + +#endif // _WX_XH_PROPDLG_H_ diff --git a/Externals/wxWidgets/include/wx/xrc/xh_radbt.h b/Externals/wxWidgets/include/wx/xrc/xh_radbt.h new file mode 100644 index 0000000000..ec8e7cd7c6 --- /dev/null +++ b/Externals/wxWidgets/include/wx/xrc/xh_radbt.h @@ -0,0 +1,30 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_radbt.h +// Purpose: XML resource handler for wxRadioButton +// Author: Bob Mitchell +// Created: 2000/03/21 +// RCS-ID: $Id: xh_radbt.h 41590 2006-10-03 14:53:40Z VZ $ +// Copyright: (c) 2000 Bob Mitchell and Verant Interactive +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_RADBT_H_ +#define _WX_XH_RADBT_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_RADIOBTN + +class WXDLLIMPEXP_XRC wxRadioButtonXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxRadioButtonXmlHandler) + +public: + wxRadioButtonXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC && wxUSE_RADIOBOX + +#endif // _WX_XH_RADBT_H_ diff --git a/Externals/wxWidgets/include/wx/xrc/xh_radbx.h b/Externals/wxWidgets/include/wx/xrc/xh_radbx.h new file mode 100644 index 0000000000..424fa67496 --- /dev/null +++ b/Externals/wxWidgets/include/wx/xrc/xh_radbx.h @@ -0,0 +1,43 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_radbx.h +// Purpose: XML resource handler for wxRadioBox +// Author: Bob Mitchell +// Created: 2000/03/21 +// RCS-ID: $Id: xh_radbx.h 41590 2006-10-03 14:53:40Z VZ $ +// Copyright: (c) 2000 Bob Mitchell and Verant Interactive +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_RADBX_H_ +#define _WX_XH_RADBX_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_RADIOBOX + +class WXDLLIMPEXP_XRC wxRadioBoxXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxRadioBoxXmlHandler) + +public: + wxRadioBoxXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); + +private: + bool m_insideBox; + + // the items labels + wxArrayString labels; + + // the items tooltips + wxArrayString tooltips; + + // the item help text + wxArrayString helptexts; + wxArrayInt helptextSpecified; +}; + +#endif // wxUSE_XRC && wxUSE_RADIOBOX + +#endif // _WX_XH_RADBX_H_ diff --git a/Externals/wxWidgets/include/wx/xrc/xh_richtext.h b/Externals/wxWidgets/include/wx/xrc/xh_richtext.h new file mode 100644 index 0000000000..c00f423229 --- /dev/null +++ b/Externals/wxWidgets/include/wx/xrc/xh_richtext.h @@ -0,0 +1,30 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_text.h +// Purpose: XML resource handler for wxRichTextCtrl +// Author: Julian Smart +// Created: 2006-11-08 +// RCS-ID: $Id: xh_richtext.h 43199 2006-11-08 15:45:11Z JS $ +// Copyright: (c) 2006 Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_RICHTEXT_H_ +#define _WX_XH_RICHTEXT_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_RICHTEXT + +class WXDLLIMPEXP_XRC wxRichTextCtrlXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxRichTextCtrlXmlHandler) + +public: + wxRichTextCtrlXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC && wxUSE_RICHTEXT + +#endif // _WX_XH_RICHTEXT_H_ diff --git a/Externals/wxWidgets/include/wx/xrc/xh_scrol.h b/Externals/wxWidgets/include/wx/xrc/xh_scrol.h new file mode 100644 index 0000000000..61246b5f64 --- /dev/null +++ b/Externals/wxWidgets/include/wx/xrc/xh_scrol.h @@ -0,0 +1,36 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_scrol.h +// Purpose: XML resource handler for wxScrollBar +// Author: Brian Gavin +// Created: 2000/09/09 +// RCS-ID: $Id: xh_scrol.h 41590 2006-10-03 14:53:40Z VZ $ +// Copyright: (c) 2000 Brian Gavin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_SCROL_H_ +#define _WX_XH_SCROL_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_SCROLLBAR + +class WXDLLIMPEXP_XRC wxScrollBarXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxScrollBarXmlHandler) + enum + { + wxSL_DEFAULT_VALUE = 0, + wxSL_DEFAULT_MIN = 0, + wxSL_DEFAULT_MAX = 100 + }; + +public: + wxScrollBarXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC && wxUSE_SCROLLBAR + +#endif // _WX_XH_SCROL_H_ diff --git a/Externals/wxWidgets/include/wx/xrc/xh_scwin.h b/Externals/wxWidgets/include/wx/xrc/xh_scwin.h new file mode 100644 index 0000000000..8e4e18b700 --- /dev/null +++ b/Externals/wxWidgets/include/wx/xrc/xh_scwin.h @@ -0,0 +1,30 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_scwin.h +// Purpose: XML resource handler for wxScrolledWindow +// Author: Vaclav Slavik +// Created: 2002/10/18 +// RCS-ID: $Id: xh_scwin.h 41590 2006-10-03 14:53:40Z VZ $ +// Copyright: (c) 2002 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_SCWIN_H_ +#define _WX_XH_SCWIN_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC + +class WXDLLIMPEXP_XRC wxScrolledWindowXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxScrolledWindowXmlHandler) + +public: + wxScrolledWindowXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC + +#endif // _WX_XH_SCWIN_H_ diff --git a/Externals/wxWidgets/include/wx/xrc/xh_sizer.h b/Externals/wxWidgets/include/wx/xrc/xh_sizer.h new file mode 100644 index 0000000000..abbd3b77c6 --- /dev/null +++ b/Externals/wxWidgets/include/wx/xrc/xh_sizer.h @@ -0,0 +1,80 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_sizer.h +// Purpose: XML resource handler for wxBoxSizer +// Author: Vaclav Slavik +// Created: 2000/04/24 +// RCS-ID: $Id: xh_sizer.h 49804 2007-11-10 01:09:42Z VZ $ +// Copyright: (c) 2000 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_SIZER_H_ +#define _WX_XH_SIZER_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC + +#include "wx/sizer.h" +#include "wx/gbsizer.h" + +class WXDLLIMPEXP_FWD_CORE wxSizer; + +class WXDLLIMPEXP_XRC wxSizerXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxSizerXmlHandler) + +public: + wxSizerXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); + +private: + bool m_isInside; + bool m_isGBS; + + wxSizer *m_parentSizer; + + bool IsSizerNode(wxXmlNode *node); + + wxObject* Handle_sizeritem(); + wxObject* Handle_spacer(); + wxObject* Handle_sizer(); + wxSizer* Handle_wxBoxSizer(); +#if wxUSE_STATBOX + wxSizer* Handle_wxStaticBoxSizer(); +#endif + wxSizer* Handle_wxGridSizer(); + wxSizer* Handle_wxFlexGridSizer(); + wxSizer* Handle_wxGridBagSizer(); + + void SetGrowables(wxFlexGridSizer* fsizer, const wxChar* param, bool rows); + wxGBPosition GetGBPos(const wxString& param); + wxGBSpan GetGBSpan(const wxString& param); + wxSizerItem* MakeSizerItem(); + void SetSizerItemAttributes(wxSizerItem* sitem); + void AddSizerItem(wxSizerItem* sitem); +}; + +#if wxUSE_BUTTON + +class WXDLLIMPEXP_XRC wxStdDialogButtonSizerXmlHandler + : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxStdDialogButtonSizerXmlHandler) + +public: + wxStdDialogButtonSizerXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); + +private: + bool m_isInside; + wxStdDialogButtonSizer *m_parentSizer; +}; + +#endif // wxUSE_BUTTON + +#endif // wxUSE_XRC + +#endif // _WX_XH_SIZER_H_ diff --git a/Externals/wxWidgets/include/wx/xrc/xh_slidr.h b/Externals/wxWidgets/include/wx/xrc/xh_slidr.h new file mode 100644 index 0000000000..168d414c9b --- /dev/null +++ b/Externals/wxWidgets/include/wx/xrc/xh_slidr.h @@ -0,0 +1,36 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_slidr.h +// Purpose: XML resource handler for wxSlider +// Author: Bob Mitchell +// Created: 2000/03/21 +// RCS-ID: $Id: xh_slidr.h 41590 2006-10-03 14:53:40Z VZ $ +// Copyright: (c) 2000 Bob Mitchell and Verant Interactive +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_SLIDR_H_ +#define _WX_XH_SLIDR_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_SLIDER + +class WXDLLIMPEXP_XRC wxSliderXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxSliderXmlHandler) + enum + { + wxSL_DEFAULT_VALUE = 0, + wxSL_DEFAULT_MIN = 0, + wxSL_DEFAULT_MAX = 100 + }; + +public: + wxSliderXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC && wxUSE_SLIDER + +#endif // _WX_XH_SLIDR_H_ diff --git a/Externals/wxWidgets/include/wx/xrc/xh_spin.h b/Externals/wxWidgets/include/wx/xrc/xh_spin.h new file mode 100644 index 0000000000..4da1bdf5d8 --- /dev/null +++ b/Externals/wxWidgets/include/wx/xrc/xh_spin.h @@ -0,0 +1,61 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_spin.h +// Purpose: XML resource handler for wxSpinButton and wxSpinCtrl +// Author: Bob Mitchell +// Created: 2000/03/21 +// RCS-ID: $Id: xh_spin.h 41590 2006-10-03 14:53:40Z VZ $ +// Copyright: (c) 2000 Bob Mitchell and Verant Interactive +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_SPIN_H_ +#define _WX_XH_SPIN_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC + +#if wxUSE_SPINBTN + +class WXDLLIMPEXP_XRC wxSpinButtonXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxSpinButtonXmlHandler) + enum + { + wxSP_DEFAULT_VALUE = 0, + wxSP_DEFAULT_MIN = 0, + wxSP_DEFAULT_MAX = 100 + }; + +public: + wxSpinButtonXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_SPINBTN + + +#if wxUSE_SPINCTRL + +class WXDLLIMPEXP_XRC wxSpinCtrlXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxSpinCtrlXmlHandler) + enum + { + wxSP_DEFAULT_VALUE = 0, + wxSP_DEFAULT_MIN = 0, + wxSP_DEFAULT_MAX = 100 + }; + +public: + wxSpinCtrlXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_SPINCTRL + +#endif // wxUSE_XRC + +#endif // _WX_XH_SPIN_H_ diff --git a/Externals/wxWidgets/include/wx/xrc/xh_split.h b/Externals/wxWidgets/include/wx/xrc/xh_split.h new file mode 100644 index 0000000000..a342225ed6 --- /dev/null +++ b/Externals/wxWidgets/include/wx/xrc/xh_split.h @@ -0,0 +1,30 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_split.h +// Purpose: XRC resource for wxSplitterWindow +// Author: panga@freemail.hu, Vaclav Slavik +// Created: 2003/01/26 +// RCS-ID: $Id: xh_split.h 41590 2006-10-03 14:53:40Z VZ $ +// Copyright: (c) 2003 panga@freemail.hu, Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_SPLIT_H_ +#define _WX_XH_SPLIT_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_SPLITTER + +class WXDLLIMPEXP_XRC wxSplitterWindowXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxSplitterWindowXmlHandler) + +public: + wxSplitterWindowXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC && wxUSE_SPLITTER + +#endif // _WX_XH_SPLIT_H_ diff --git a/Externals/wxWidgets/include/wx/xrc/xh_statbar.h b/Externals/wxWidgets/include/wx/xrc/xh_statbar.h new file mode 100644 index 0000000000..6a1e45305b --- /dev/null +++ b/Externals/wxWidgets/include/wx/xrc/xh_statbar.h @@ -0,0 +1,30 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_statbar.h +// Purpose: XML resource handler for wxStatusBar +// Author: Brian Ravnsgaard Riis +// Created: 2004/01/21 +// RCS-ID: +// Copyright: (c) 2004 Brian Ravnsgaard Riis +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_STATBAR_H_ +#define _WX_XH_STATBAR_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_STATUSBAR + +class WXDLLIMPEXP_XRC wxStatusBarXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxStatusBarXmlHandler) + +public: + wxStatusBarXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC && wxUSE_STATUSBAR + +#endif // _WX_XH_STATBAR_H_ diff --git a/Externals/wxWidgets/include/wx/xrc/xh_stbmp.h b/Externals/wxWidgets/include/wx/xrc/xh_stbmp.h new file mode 100644 index 0000000000..d408ea4b58 --- /dev/null +++ b/Externals/wxWidgets/include/wx/xrc/xh_stbmp.h @@ -0,0 +1,30 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_stbmp.h +// Purpose: XML resource handler for wxStaticBitmap +// Author: Vaclav Slavik +// Created: 2000/04/22 +// RCS-ID: $Id: xh_stbmp.h 41590 2006-10-03 14:53:40Z VZ $ +// Copyright: (c) 2000 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_STBMP_H_ +#define _WX_XH_STBMP_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_STATBMP + +class WXDLLIMPEXP_XRC wxStaticBitmapXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxStaticBitmapXmlHandler) + +public: + wxStaticBitmapXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC && wxUSE_STATBMP + +#endif // _WX_XH_STBMP_H_ diff --git a/Externals/wxWidgets/include/wx/xrc/xh_stbox.h b/Externals/wxWidgets/include/wx/xrc/xh_stbox.h new file mode 100644 index 0000000000..d859492b50 --- /dev/null +++ b/Externals/wxWidgets/include/wx/xrc/xh_stbox.h @@ -0,0 +1,30 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_stbox.h +// Purpose: XML resource handler for wxStaticBox +// Author: Brian Gavin +// Created: 2000/09/00 +// RCS-ID: $Id: xh_stbox.h 41590 2006-10-03 14:53:40Z VZ $ +// Copyright: (c) 2000 Brian Gavin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_STBOX_H_ +#define _WX_XH_STBOX_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_STATBOX + +class WXDLLIMPEXP_XRC wxStaticBoxXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxStaticBoxXmlHandler) + +public: + wxStaticBoxXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC && wxUSE_STATBOX + +#endif // _WX_XH_STBOX_H_ diff --git a/Externals/wxWidgets/include/wx/xrc/xh_stlin.h b/Externals/wxWidgets/include/wx/xrc/xh_stlin.h new file mode 100644 index 0000000000..1951b14c5d --- /dev/null +++ b/Externals/wxWidgets/include/wx/xrc/xh_stlin.h @@ -0,0 +1,30 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_stlin.h +// Purpose: XML resource handler for wxStaticLine +// Author: Vaclav Slavik +// Created: 2000/09/00 +// RCS-ID: $Id: xh_stlin.h 41590 2006-10-03 14:53:40Z VZ $ +// Copyright: (c) 2000 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_STLIN_H_ +#define _WX_XH_STLIN_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_STATLINE + +class WXDLLIMPEXP_XRC wxStaticLineXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxStaticLineXmlHandler) + +public: + wxStaticLineXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC && wxUSE_STATLINE + +#endif // _WX_XH_STLIN_H_ diff --git a/Externals/wxWidgets/include/wx/xrc/xh_sttxt.h b/Externals/wxWidgets/include/wx/xrc/xh_sttxt.h new file mode 100644 index 0000000000..a4d53f73a8 --- /dev/null +++ b/Externals/wxWidgets/include/wx/xrc/xh_sttxt.h @@ -0,0 +1,30 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_sttxt.h +// Purpose: XML resource handler for wxStaticText +// Author: Bob Mitchell +// Created: 2000/03/21 +// RCS-ID: $Id: xh_sttxt.h 41590 2006-10-03 14:53:40Z VZ $ +// Copyright: (c) 2000 Bob Mitchell +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_STTXT_H_ +#define _WX_XH_STTXT_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_STATTEXT + +class WXDLLIMPEXP_XRC wxStaticTextXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxStaticTextXmlHandler) + +public: + wxStaticTextXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC && wxUSE_STATTEXT + +#endif // _WX_XH_STTXT_H_ diff --git a/Externals/wxWidgets/include/wx/xrc/xh_text.h b/Externals/wxWidgets/include/wx/xrc/xh_text.h new file mode 100644 index 0000000000..4452005991 --- /dev/null +++ b/Externals/wxWidgets/include/wx/xrc/xh_text.h @@ -0,0 +1,30 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_text.h +// Purpose: XML resource handler for wxTextCtrl +// Author: Aleksandras Gluchovas +// Created: 2000/03/21 +// RCS-ID: $Id: xh_text.h 41590 2006-10-03 14:53:40Z VZ $ +// Copyright: (c) 2000 Aleksandras Gluchovas +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_TEXT_H_ +#define _WX_XH_TEXT_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_TEXTCTRL + +class WXDLLIMPEXP_XRC wxTextCtrlXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxTextCtrlXmlHandler) + +public: + wxTextCtrlXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC && wxUSE_TEXTCTRL + +#endif // _WX_XH_TEXT_H_ diff --git a/Externals/wxWidgets/include/wx/xrc/xh_tglbtn.h b/Externals/wxWidgets/include/wx/xrc/xh_tglbtn.h new file mode 100644 index 0000000000..71aa37fd80 --- /dev/null +++ b/Externals/wxWidgets/include/wx/xrc/xh_tglbtn.h @@ -0,0 +1,30 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_tglbtn.h +// Purpose: XML resource handler for wxToggleButton +// Author: Julian Smart +// Created: 2004-08-30 +// RCS-ID: $Id: xh_tglbtn.h 41590 2006-10-03 14:53:40Z VZ $ +// Copyright: (c) 2004 Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_TGLBTN_H_ +#define _WX_XH_TGLBTN_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_TOGGLEBTN + +class WXDLLIMPEXP_XRC wxToggleButtonXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxToggleButtonXmlHandler) + +public: + wxToggleButtonXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC && wxUSE_TOGGLEBTN + +#endif // _WX_XH_TGLBTN_H_ diff --git a/Externals/wxWidgets/include/wx/xrc/xh_toolb.h b/Externals/wxWidgets/include/wx/xrc/xh_toolb.h new file mode 100644 index 0000000000..81a1cd8da5 --- /dev/null +++ b/Externals/wxWidgets/include/wx/xrc/xh_toolb.h @@ -0,0 +1,36 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_toolb.h +// Purpose: XML resource handler for wxToolBar +// Author: Vaclav Slavik +// Created: 2000/08/11 +// RCS-ID: $Id: xh_toolb.h 41590 2006-10-03 14:53:40Z VZ $ +// Copyright: (c) 2000 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_TOOLB_H_ +#define _WX_XH_TOOLB_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_TOOLBAR + +class WXDLLEXPORT wxToolBar; + +class WXDLLIMPEXP_XRC wxToolBarXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxToolBarXmlHandler) + +public: + wxToolBarXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); + +private: + bool m_isInside; + wxToolBar *m_toolbar; +}; + +#endif // wxUSE_XRC && wxUSE_TOOLBAR + +#endif // _WX_XH_TOOLB_H_ diff --git a/Externals/wxWidgets/include/wx/xrc/xh_tree.h b/Externals/wxWidgets/include/wx/xrc/xh_tree.h new file mode 100644 index 0000000000..f069a24457 --- /dev/null +++ b/Externals/wxWidgets/include/wx/xrc/xh_tree.h @@ -0,0 +1,30 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_tree.h +// Purpose: XML resource handler for wxTreeCtrl +// Author: Brian Gavin +// Created: 2000/09/09 +// RCS-ID: $Id: xh_tree.h 41590 2006-10-03 14:53:40Z VZ $ +// Copyright: (c) 2000 Brian Gavin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_TREE_H_ +#define _WX_XH_TREE_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_TREECTRL + +class WXDLLIMPEXP_XRC wxTreeCtrlXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxTreeCtrlXmlHandler) + +public: + wxTreeCtrlXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC && wxUSE_TREECTRL + +#endif // _WX_XH_TREE_H_ diff --git a/Externals/wxWidgets/include/wx/xrc/xh_treebk.h b/Externals/wxWidgets/include/wx/xrc/xh_treebk.h new file mode 100644 index 0000000000..0d08cc6bc0 --- /dev/null +++ b/Externals/wxWidgets/include/wx/xrc/xh_treebk.h @@ -0,0 +1,83 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_treebk.h +// Purpose: XML resource handler for wxTreebook +// Author: Evgeniy Tarassov +// Created: 2005/09/28 +// Copyright: (c) 2005 TT-Solutions +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_TREEBK_H_ +#define _WX_XH_TREEBK_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_TREEBOOK + +class WXDLLEXPORT wxTreebook; +#include "wx/dynarray.h" + +WX_DEFINE_USER_EXPORTED_ARRAY_SIZE_T(size_t, wxArrayTbkPageIndexes, + class WXDLLIMPEXP_XRC); + +// --------------------------------------------------------------------- +// wxTreebookXmlHandler class +// --------------------------------------------------------------------- +// Resource xml structure have to be almost the "same" as for wxNotebook +// except the additional (size_t)depth parameter for treebookpage nodes +// which indicates the depth of the page in the tree. +// There is only one logical constraint on this parameter : +// it cannot be greater than the previous page depth plus one +class WXDLLIMPEXP_XRC wxTreebookXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxTreebookXmlHandler) + +public: + wxTreebookXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); + +private: + wxTreebook *m_tbk; + wxArrayTbkPageIndexes m_treeContext; + bool m_isInside; +}; + + +// Example: +// ------- +// Label +// \--First +// | \--Second +// \--Third +// +// +// ... +// +// +// +// +// 0 +// +// +// +// +// 1 +// +// +// +// +// 2 +// +// +// +// +// 1 +// +// +// ... +// + +#endif // wxUSE_XRC && wxUSE_TREEBOOK + +#endif // _WX_XH_TREEBK_H_ diff --git a/Externals/wxWidgets/include/wx/xrc/xh_unkwn.h b/Externals/wxWidgets/include/wx/xrc/xh_unkwn.h new file mode 100644 index 0000000000..5759b751d6 --- /dev/null +++ b/Externals/wxWidgets/include/wx/xrc/xh_unkwn.h @@ -0,0 +1,30 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_unkwn.h +// Purpose: XML resource handler for unkown widget +// Author: Vaclav Slavik +// Created: 2000/03/05 +// RCS-ID: $Id: xh_unkwn.h 41590 2006-10-03 14:53:40Z VZ $ +// Copyright: (c) 2000 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_UNKWN_H_ +#define _WX_XH_UNKWN_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC + +class WXDLLIMPEXP_XRC wxUnknownWidgetXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxUnknownWidgetXmlHandler) + +public: + wxUnknownWidgetXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); +}; + +#endif // wxUSE_XRC + +#endif // _WX_XH_UNKWN_H_ diff --git a/Externals/wxWidgets/include/wx/xrc/xh_wizrd.h b/Externals/wxWidgets/include/wx/xrc/xh_wizrd.h new file mode 100644 index 0000000000..eb1a14b314 --- /dev/null +++ b/Externals/wxWidgets/include/wx/xrc/xh_wizrd.h @@ -0,0 +1,37 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xh_wizrd.h +// Purpose: XML resource handler for wxWizard +// Author: Vaclav Slavik +// Created: 2003/03/02 +// RCS-ID: $Id: xh_wizrd.h 41590 2006-10-03 14:53:40Z VZ $ +// Copyright: (c) 2000 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XH_WIZRD_H_ +#define _WX_XH_WIZRD_H_ + +#include "wx/xrc/xmlres.h" + +#if wxUSE_XRC && wxUSE_WIZARDDLG + +class WXDLLEXPORT wxWizard; +class WXDLLEXPORT wxWizardPageSimple; + +class WXDLLIMPEXP_XRC wxWizardXmlHandler : public wxXmlResourceHandler +{ + DECLARE_DYNAMIC_CLASS(wxWizardXmlHandler) + +public: + wxWizardXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); + +private: + wxWizard *m_wizard; + wxWizardPageSimple *m_lastSimplePage; +}; + +#endif // wxUSE_XRC && wxUSE_WIZARDDLG + +#endif // _WX_XH_WIZRD_H_ diff --git a/Externals/wxWidgets/include/wx/xrc/xmlres.h b/Externals/wxWidgets/include/wx/xrc/xmlres.h new file mode 100644 index 0000000000..77d792719b --- /dev/null +++ b/Externals/wxWidgets/include/wx/xrc/xmlres.h @@ -0,0 +1,530 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xrc/xmlres.h +// Purpose: XML resources +// Author: Vaclav Slavik +// Created: 2000/03/05 +// RCS-ID: $Id: xmlres.h 49563 2007-10-31 20:46:21Z VZ $ +// Copyright: (c) 2000 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XMLRES_H_ +#define _WX_XMLRES_H_ + +#include "wx/defs.h" + +#if wxUSE_XRC + +#include "wx/string.h" +#include "wx/dynarray.h" +#include "wx/datetime.h" +#include "wx/list.h" +#include "wx/gdicmn.h" +#include "wx/filesys.h" +#include "wx/bitmap.h" +#include "wx/icon.h" +#include "wx/artprov.h" +#include "wx/colour.h" +#include "wx/animate.h" + +#include "wx/xml/xml.h" + +class WXDLLIMPEXP_FWD_CORE wxMenu; +class WXDLLIMPEXP_FWD_CORE wxMenuBar; +class WXDLLIMPEXP_FWD_CORE wxDialog; +class WXDLLIMPEXP_FWD_CORE wxPanel; +class WXDLLIMPEXP_FWD_CORE wxWindow; +class WXDLLIMPEXP_FWD_CORE wxFrame; +class WXDLLIMPEXP_FWD_CORE wxToolBar; + +class WXDLLIMPEXP_FWD_XRC wxXmlResourceHandler; +class WXDLLIMPEXP_FWD_XRC wxXmlSubclassFactory; +class WXDLLIMPEXP_FWD_XRC wxXmlSubclassFactoriesList; +class wxXmlResourceModule; + + +// These macros indicate current version of XML resources (this information is +// encoded in root node of XRC file as "version" property). +// +// Rules for increasing version number: +// - change it only if you made incompatible change to the format. Addition +// of new attribute to control handler is _not_ incompatible change, because +// older versions of the library may ignore it. +// - if you change version number, follow these steps: +// - set major, minor and release numbers to respective version numbers of +// the wxWidgets library (see wx/version.h) +// - reset revision to 0 unless the first three are same as before, +// in which case you should increase revision by one +#define WX_XMLRES_CURRENT_VERSION_MAJOR 2 +#define WX_XMLRES_CURRENT_VERSION_MINOR 5 +#define WX_XMLRES_CURRENT_VERSION_RELEASE 3 +#define WX_XMLRES_CURRENT_VERSION_REVISION 0 +#define WX_XMLRES_CURRENT_VERSION_STRING _T("2.5.3.0") + +#define WX_XMLRES_CURRENT_VERSION \ + (WX_XMLRES_CURRENT_VERSION_MAJOR * 256*256*256 + \ + WX_XMLRES_CURRENT_VERSION_MINOR * 256*256 + \ + WX_XMLRES_CURRENT_VERSION_RELEASE * 256 + \ + WX_XMLRES_CURRENT_VERSION_REVISION) + +class WXDLLIMPEXP_XRC wxXmlResourceDataRecord +{ +public: + wxXmlResourceDataRecord() : Doc(NULL) { +#if wxUSE_DATETIME + Time = wxDateTime::Now(); +#endif + } + ~wxXmlResourceDataRecord() {delete Doc;} + + wxString File; + wxXmlDocument *Doc; +#if wxUSE_DATETIME + wxDateTime Time; +#endif +}; + + +WX_DECLARE_USER_EXPORTED_OBJARRAY(wxXmlResourceDataRecord, + wxXmlResourceDataRecords, + WXDLLIMPEXP_XRC); + +enum wxXmlResourceFlags +{ + wxXRC_USE_LOCALE = 1, + wxXRC_NO_SUBCLASSING = 2, + wxXRC_NO_RELOADING = 4 +}; + +// This class holds XML resources from one or more .xml files +// (or derived forms, either binary or zipped -- see manual for +// details). +class WXDLLIMPEXP_XRC wxXmlResource : public wxObject +{ +public: + // Constructor. + // Flags: wxXRC_USE_LOCALE + // translatable strings will be translated via _() + // using the given domain if specified + // wxXRC_NO_SUBCLASSING + // subclass property of object nodes will be ignored + // (useful for previews in XRC editors) + // wxXRC_NO_RELOADING + // don't check the modification time of the XRC files and + // reload them if they have changed on disk + wxXmlResource(int flags = wxXRC_USE_LOCALE, + const wxString& domain=wxEmptyString); + + // Constructor. + // Flags: wxXRC_USE_LOCALE + // translatable strings will be translated via _() + // using the given domain if specified + // wxXRC_NO_SUBCLASSING + // subclass property of object nodes will be ignored + // (useful for previews in XRC editors) + wxXmlResource(const wxString& filemask, int flags = wxXRC_USE_LOCALE, + const wxString& domain=wxEmptyString); + + // Destructor. + virtual ~wxXmlResource(); + + wxXmlNode *GetFirstRoot(); + + // Loads resources from XML files that match given filemask. + // This method understands VFS (see filesys.h). + bool Load(const wxString& filemask); + + // Unload resource from the given XML file (wildcards not allowed) + bool Unload(const wxString& filename); + + // Initialize handlers for all supported controls/windows. This will + // make the executable quite big because it forces linking against + // most of the wxWidgets library. + void InitAllHandlers(); + + // Initialize only a specific handler (or custom handler). Convention says + // that handler name is equal to the control's name plus 'XmlHandler', for + // example wxTextCtrlXmlHandler, wxHtmlWindowXmlHandler. The XML resource + // compiler (xmlres) can create include file that contains initialization + // code for all controls used within the resource. + void AddHandler(wxXmlResourceHandler *handler); + + // Add a new handler at the begining of the handler list + void InsertHandler(wxXmlResourceHandler *handler); + + // Removes all handlers + void ClearHandlers(); + + // Registers subclasses factory for use in XRC. This function is not meant + // for public use, please see the comment above wxXmlSubclassFactory + // definition. + static void AddSubclassFactory(wxXmlSubclassFactory *factory); + + // Loads menu from resource. Returns NULL on failure. + wxMenu *LoadMenu(const wxString& name); + + // Loads menubar from resource. Returns NULL on failure. + wxMenuBar *LoadMenuBar(wxWindow *parent, const wxString& name); + + // Loads menubar from resource. Returns NULL on failure. + wxMenuBar *LoadMenuBar(const wxString& name) { return LoadMenuBar(NULL, name); } + +#if wxUSE_TOOLBAR + // Loads a toolbar. + wxToolBar *LoadToolBar(wxWindow *parent, const wxString& name); +#endif + + // Loads a dialog. dlg points to parent window (if any). + wxDialog *LoadDialog(wxWindow *parent, const wxString& name); + + // Loads a dialog. dlg points to parent window (if any). This form + // is used to finish creation of already existing instance (main reason + // for this is that you may want to use derived class with new event table) + // Example (typical usage): + // MyDialog dlg; + // wxTheXmlResource->LoadDialog(&dlg, mainFrame, "my_dialog"); + // dlg->ShowModal(); + bool LoadDialog(wxDialog *dlg, wxWindow *parent, const wxString& name); + + // Loads a panel. panel points to parent window (if any). + wxPanel *LoadPanel(wxWindow *parent, const wxString& name); + + // Loads a panel. panel points to parent window (if any). This form + // is used to finish creation of already existing instance. + bool LoadPanel(wxPanel *panel, wxWindow *parent, const wxString& name); + + // Loads a frame. + wxFrame *LoadFrame(wxWindow* parent, const wxString& name); + bool LoadFrame(wxFrame* frame, wxWindow *parent, const wxString& name); + + // Load an object from the resource specifying both the resource name and + // the classname. This lets you load nonstandard container windows. + wxObject *LoadObject(wxWindow *parent, const wxString& name, + const wxString& classname); + + // Load an object from the resource specifying both the resource name and + // the classname. This form lets you finish the creation of an existing + // instance. + bool LoadObject(wxObject *instance, wxWindow *parent, const wxString& name, + const wxString& classname); + + // Loads a bitmap resource from a file. + wxBitmap LoadBitmap(const wxString& name); + + // Loads an icon resource from a file. + wxIcon LoadIcon(const wxString& name); + + // Attaches an unknown control to the given panel/window/dialog. + // Unknown controls are used in conjunction with . + bool AttachUnknownControl(const wxString& name, wxWindow *control, + wxWindow *parent = NULL); + + // Returns a numeric ID that is equivalent to the string ID used in an XML + // resource. If an unknown str_id is requested (i.e. other than wxID_XXX + // or integer), a new record is created which associates the given string + // with a number. If value_if_not_found == wxID_NONE, the number is obtained via + // wxWindow::NewControlId(). Otherwise value_if_not_found is used. + // Macro XRCID(name) is provided for convenient use in event tables. + static int GetXRCID(const wxChar *str_id, int value_if_not_found = wxID_NONE); + + // Returns version information (a.b.c.d = d+ 256*c + 256^2*b + 256^3*a). + long GetVersion() const { return m_version; } + + // Compares resources version to argument. Returns -1 if resources version + // is less than the argument, +1 if greater and 0 if they equal. + int CompareVersion(int major, int minor, int release, int revision) const + { return GetVersion() - + (major*256*256*256 + minor*256*256 + release*256 + revision); } + +//// Singleton accessors. + + // Gets the global resources object or creates one if none exists. + static wxXmlResource *Get(); + + // Sets the global resources object and returns a pointer to the previous one (may be NULL). + static wxXmlResource *Set(wxXmlResource *res); + + // Returns flags, which may be a bitlist of wxXRC_USE_LOCALE and wxXRC_NO_SUBCLASSING. + int GetFlags() const { return m_flags; } + // Set flags after construction. + void SetFlags(int flags) { m_flags = flags; } + + // Get/Set the domain to be passed to the translation functions, defaults to NULL. + wxChar* GetDomain() const { return m_domain; } + void SetDomain(const wxChar* domain); + +protected: + // Scans the resources list for unloaded files and loads them. Also reloads + // files that have been modified since last loading. + bool UpdateResources(); + + // Finds a resource (calls UpdateResources) and returns a node containing it. + wxXmlNode *FindResource(const wxString& name, const wxString& classname, bool recursive = false); + + // Helper function: finds a resource (calls UpdateResources) and returns a node containing it. + wxXmlNode *DoFindResource(wxXmlNode *parent, const wxString& name, const wxString& classname, bool recursive); + + // Creates a resource from information in the given node + // (Uses only 'handlerToUse' if != NULL) + wxObject *CreateResFromNode(wxXmlNode *node, wxObject *parent, + wxObject *instance = NULL, + wxXmlResourceHandler *handlerToUse = NULL); + + // Helper of Load() and Unload(): returns the URL corresponding to the + // given file if it's indeed a file, otherwise returns the original string + // unmodified + static wxString ConvertFileNameToURL(const wxString& filename); + + // loading resources from archives is impossible without wxFileSystem +#if wxUSE_FILESYSTEM + // Another helper: detect if the filename is a ZIP or XRS file + static bool IsArchive(const wxString& filename); +#endif // wxUSE_FILESYSTEM + +private: + long m_version; + + int m_flags; + wxList m_handlers; + wxXmlResourceDataRecords m_data; +#if wxUSE_FILESYSTEM + wxFileSystem m_curFileSystem; + wxFileSystem& GetCurFileSystem() { return m_curFileSystem; } +#endif + + // domain to pass to translation functions, if any. + wxChar* m_domain; + + friend class wxXmlResourceHandler; + friend class wxXmlResourceModule; + + static wxXmlSubclassFactoriesList *ms_subclassFactories; + + // singleton instance: + static wxXmlResource *ms_instance; +}; + + +// This macro translates string identifier (as used in XML resource, +// e.g. ...) to integer id that is needed by +// wxWidgets event tables. +// Example: +// BEGIN_EVENT_TABLE(MyFrame, wxFrame) +// EVT_MENU(XRCID("quit"), MyFrame::OnQuit) +// EVT_MENU(XRCID("about"), MyFrame::OnAbout) +// EVT_MENU(XRCID("new"), MyFrame::OnNew) +// EVT_MENU(XRCID("open"), MyFrame::OnOpen) +// END_EVENT_TABLE() + +#define XRCID(str_id) \ + wxXmlResource::GetXRCID(wxT(str_id)) + + +// This macro returns pointer to particular control in dialog +// created using XML resources. You can use it to set/get values from +// controls. +// Example: +// wxDialog dlg; +// wxXmlResource::Get()->LoadDialog(&dlg, mainFrame, "my_dialog"); +// XRCCTRL(dlg, "my_textctrl", wxTextCtrl)->SetValue(wxT("default value")); + +#define XRCCTRL(window, id, type) \ + (wxStaticCast((window).FindWindow(XRCID(id)), type)) + +// wxXmlResourceHandler is an abstract base class for resource handlers +// capable of creating a control from an XML node. + +class WXDLLIMPEXP_XRC wxXmlResourceHandler : public wxObject +{ +DECLARE_ABSTRACT_CLASS(wxXmlResourceHandler) +public: + // Constructor. + wxXmlResourceHandler(); + + // Destructor. + virtual ~wxXmlResourceHandler() {} + + // Creates an object (menu, dialog, control, ...) from an XML node. + // Should check for validity. + // parent is a higher-level object (usually window, dialog or panel) + // that is often necessary to create the resource. + // If instance is non-NULL it should not create a new instance via 'new' but + // should rather use this one, and call its Create method. + wxObject *CreateResource(wxXmlNode *node, wxObject *parent, + wxObject *instance); + + // This one is called from CreateResource after variables + // were filled. + virtual wxObject *DoCreateResource() = 0; + + // Returns true if it understands this node and can create + // a resource from it, false otherwise. + virtual bool CanHandle(wxXmlNode *node) = 0; + + // Sets the parent resource. + void SetParentResource(wxXmlResource *res) { m_resource = res; } + +protected: + wxXmlResource *m_resource; + wxArrayString m_styleNames; + wxArrayInt m_styleValues; + + // Variables (filled by CreateResource) + wxXmlNode *m_node; + wxString m_class; + wxObject *m_parent, *m_instance; + wxWindow *m_parentAsWindow; + + // --- Handy methods: + + // Returns true if the node has a property class equal to classname, + // e.g. . + bool IsOfClass(wxXmlNode *node, const wxString& classname); + + // Gets node content from wxXML_ENTITY_NODE + // The problem is, content is represented as + // wxXML_ENTITY_NODE name="tag", content="" + // |-- wxXML_TEXT_NODE or + // wxXML_CDATA_SECTION_NODE name="" content="content" + wxString GetNodeContent(wxXmlNode *node); + + // Check to see if a parameter exists. + bool HasParam(const wxString& param); + + // Finds the node or returns NULL. + wxXmlNode *GetParamNode(const wxString& param); + + // Finds the parameter value or returns the empty string. + wxString GetParamValue(const wxString& param); + + // Add a style flag (e.g. wxMB_DOCKABLE) to the list of flags + // understood by this handler. + void AddStyle(const wxString& name, int value); + + // Add styles common to all wxWindow-derived classes. + void AddWindowStyles(); + + // Gets style flags from text in form "flag | flag2| flag3 |..." + // Only understands flags added with AddStyle + int GetStyle(const wxString& param = wxT("style"), int defaults = 0); + + // Gets text from param and does some conversions: + // - replaces \n, \r, \t by respective chars (according to C syntax) + // - replaces _ by & and __ by _ (needed for _File => &File because of XML) + // - calls wxGetTranslations (unless disabled in wxXmlResource) + wxString GetText(const wxString& param, bool translate = true); + + // Returns the XRCID. + int GetID(); + + // Returns the resource name. + wxString GetName(); + + // Gets a bool flag (1, t, yes, on, true are true, everything else is false). + bool GetBool(const wxString& param, bool defaultv = false); + + // Gets an integer value from the parameter. + long GetLong(const wxString& param, long defaultv = 0); + + // Gets a float value from the parameter. + float GetFloat(const wxString& param, float defaultv = 0); + + // Gets colour in HTML syntax (#RRGGBB). + wxColour GetColour(const wxString& param, const wxColour& defaultv = wxNullColour); + + // Gets the size (may be in dialog units). + wxSize GetSize(const wxString& param = wxT("size"), + wxWindow *windowToUse = NULL); + + // Gets the position (may be in dialog units). + wxPoint GetPosition(const wxString& param = wxT("pos")); + + // Gets a dimension (may be in dialog units). + wxCoord GetDimension(const wxString& param, wxCoord defaultv = 0, + wxWindow *windowToUse = NULL); + + // Gets a bitmap. + wxBitmap GetBitmap(const wxString& param = wxT("bitmap"), + const wxArtClient& defaultArtClient = wxART_OTHER, + wxSize size = wxDefaultSize); + + // Gets an icon. + wxIcon GetIcon(const wxString& param = wxT("icon"), + const wxArtClient& defaultArtClient = wxART_OTHER, + wxSize size = wxDefaultSize); + +#if wxUSE_ANIMATIONCTRL + // Gets an animation. + wxAnimation GetAnimation(const wxString& param = wxT("animation")); +#endif + + // Gets a font. + wxFont GetFont(const wxString& param = wxT("font")); + + // Sets common window options. + void SetupWindow(wxWindow *wnd); + + // Creates children. + void CreateChildren(wxObject *parent, bool this_hnd_only = false); + + // Helper function. + void CreateChildrenPrivately(wxObject *parent, wxXmlNode *rootnode = NULL); + + // Creates a resource from a node. + wxObject *CreateResFromNode(wxXmlNode *node, + wxObject *parent, wxObject *instance = NULL) + { return m_resource->CreateResFromNode(node, parent, instance); } + + // helper +#if wxUSE_FILESYSTEM + wxFileSystem& GetCurFileSystem() { return m_resource->GetCurFileSystem(); } +#endif +}; + + +// Programmer-friendly macros for writing XRC handlers: + +#define XRC_ADD_STYLE(style) AddStyle(wxT(#style), style) + +#define XRC_MAKE_INSTANCE(variable, classname) \ + classname *variable = NULL; \ + if (m_instance) \ + variable = wxStaticCast(m_instance, classname); \ + if (!variable) \ + variable = new classname; + + +// FIXME -- remove this $%^#$%#$@# as soon as Ron checks his changes in!! +WXDLLIMPEXP_XRC void wxXmlInitResourceModule(); + + +// This class is used to create instances of XRC "object" nodes with "subclass" +// property. It is _not_ supposed to be used by XRC users, you should instead +// register your subclasses via wxWidgets' RTTI mechanism. This class is useful +// only for language bindings developer who need a way to implement subclassing +// in wxWidgets ports that don't support wxRTTI (e.g. wxPython). +class WXDLLIMPEXP_XRC wxXmlSubclassFactory +{ +public: + // Try to create instance of given class and return it, return NULL on + // failure: + virtual wxObject *Create(const wxString& className) = 0; + virtual ~wxXmlSubclassFactory() {} +}; + + +/* ------------------------------------------------------------------------- + Backward compatibility macros. Do *NOT* use, they may disappear in future + versions of the XRC library! + ------------------------------------------------------------------------- */ +#if WXWIN_COMPATIBILITY_2_4 + #define ADD_STYLE XRC_ADD_STYLE + #define wxTheXmlResource wxXmlResource::Get() + #define XMLID XRCID + #define XMLCTRL XRCCTRL + #define GetXMLID GetXRCID +#endif + +#endif // wxUSE_XRC + +#endif // _WX_XMLRES_H_ diff --git a/Externals/wxWidgets/include/wx/xti.h b/Externals/wxWidgets/include/wx/xti.h new file mode 100644 index 0000000000..0e461966d0 --- /dev/null +++ b/Externals/wxWidgets/include/wx/xti.h @@ -0,0 +1,2102 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xti.h +// Purpose: runtime metadata information (extended class info) +// Author: Stefan Csomor +// Modified by: +// Created: 27/07/03 +// RCS-ID: $Id: xti.h 41020 2006-09-05 20:47:48Z VZ $ +// Copyright: (c) 1997 Julian Smart +// (c) 2003 Stefan Csomor +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XTIH__ +#define _WX_XTIH__ + +// We want to support properties, event sources and events sinks through +// explicit declarations, using templates and specialization to make the +// effort as painless as possible. +// +// This means we have the following domains : +// +// - Type Information for categorizing built in types as well as custom types +// this includes information about enums, their values and names +// - Type safe value storage : a kind of wxVariant, called right now wxxVariant +// which will be merged with wxVariant +// - Property Information and Property Accessors providing access to a class' +// values and exposed event delegates +// - Information about event handlers +// - extended Class Information for accessing all these + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/defs.h" +#include "wx/memory.h" +#include "wx/flags.h" +#include "wx/string.h" +#include "wx/arrstr.h" +#include "wx/hashmap.h" +#include "wx/log.h" +#include "wx/intl.h" + +#include + +// we will move this later to defs.h + +#if defined(__GNUC__) && !wxCHECK_GCC_VERSION( 3 , 4 ) +# define wxUSE_MEMBER_TEMPLATES 0 +#endif + +#if defined(_MSC_VER) && _MSC_VER <= 1200 +# define wxUSE_MEMBER_TEMPLATES 0 +# define wxUSE_FUNC_TEMPLATE_POINTER 0 +#endif + +#ifndef wxUSE_MEMBER_TEMPLATES +# define wxUSE_MEMBER_TEMPLATES 1 +#endif + +#ifndef wxUSE_FUNC_TEMPLATE_POINTER +# define wxUSE_FUNC_TEMPLATE_POINTER 1 +#endif + +#if wxUSE_MEMBER_TEMPLATES +# define wxTEMPLATED_MEMBER_CALL( method , type ) method() +# define wxTEMPLATED_MEMBER_FIX( type ) +#else +# define wxTEMPLATED_MEMBER_CALL( method , type ) method((type*)NULL) +# define wxTEMPLATED_MEMBER_FIX( type ) type* =NULL +#endif + +#if defined(_MSC_VER) && _MSC_VER <= 1200 +# define wxTEMPLATED_FUNCTION_FIX( type ) , wxTEMPLATED_MEMBER_FIX(type) +# define wxINFUNC_CLASS_TYPE_FIX( type ) typedef type type; +#else +# define wxTEMPLATED_FUNCTION_FIX( type ) +# define wxINFUNC_CLASS_TYPE_FIX( type ) +#endif + +#define EMPTY_MACROVALUE /**/ + +class WXDLLIMPEXP_BASE wxObject; +class WXDLLIMPEXP_BASE wxClassInfo; +class WXDLLIMPEXP_BASE wxDynamicClassInfo; +class WXDLLIMPEXP_BASE wxHashTable; +class WXDLLIMPEXP_BASE wxObjectRefData; +class WXDLLIMPEXP_BASE wxEvent; +class WXDLLIMPEXP_BASE wxEvtHandler; + +typedef void (wxObject::*wxObjectEventFunction)(wxEvent&); + +#if wxUSE_FUNC_TEMPLATE_POINTER +# define wxTO_STRING(type) wxToStringConverter +# define wxTO_STRING_IMP(type) +# define wxFROM_STRING(type) wxFromStringConverter +# define wxFROM_STRING_IMP(type) +#else +# define wxTO_STRING(type) ToString##type +# define wxTO_STRING_IMP(type) inline void ToString##type( const wxxVariant& data , wxString &result ) { wxToStringConverter(data, result); } +# define wxFROM_STRING(type) FromString##type +# define wxFROM_STRING_IMP(type) inline void FromString##type( const wxString& data , wxxVariant &result ) { wxFromStringConverter(data, result); } +#endif + +// ---------------------------------------------------------------------------- +// Enum Support +// +// In the header files there would no change from pure c++ code, in the +// implementation, an enum would have +// to be enumerated eg : +// +// wxBEGIN_ENUM( wxFlavor ) +// wxENUM_MEMBER( Vanilla ) +// wxENUM_MEMBER( Chocolate ) +// wxENUM_MEMBER( Strawberry ) +// wxEND_ENUM( wxFlavor ) +// ---------------------------------------------------------------------------- + +struct WXDLLIMPEXP_BASE wxEnumMemberData +{ + const wxChar* m_name; + int m_value; +}; + +class WXDLLIMPEXP_BASE wxEnumData +{ +public : + wxEnumData( wxEnumMemberData* data ) ; + + // returns true if the member has been found and sets the int value + // pointed to accordingly (if ptr != null ) + // if not found returns false, value left unchanged + bool HasEnumMemberValue( const wxChar *name , int *value = NULL ) const ; + + // returns the value of the member, if not found in debug mode an + // assert is issued, in release 0 is returned + int GetEnumMemberValue(const wxChar *name ) const ; + + // returns the name of the enum member having the passed in value + // returns an emtpy string if not found + const wxChar *GetEnumMemberName(int value) const ; + + // returns the number of members in this enum + int GetEnumCount() const { return m_count ; } + + // returns the value of the nth member + int GetEnumMemberValueByIndex( int n ) const ; + + // returns the value of the nth member + const wxChar *GetEnumMemberNameByIndex( int n ) const ; +private : + wxEnumMemberData *m_members; + int m_count ; +}; + +#define wxBEGIN_ENUM( e ) \ + wxEnumMemberData s_enumDataMembers##e[] = { + +#define wxENUM_MEMBER( v ) { wxT(#v), v } , + +#define wxEND_ENUM( e ) { NULL , 0 } } ; \ + wxEnumData s_enumData##e( s_enumDataMembers##e ) ; \ + wxEnumData *wxGetEnumData(e) { return &s_enumData##e ; } \ + template<> void wxStringReadValue(const wxString& s , e &data ) \ +{ \ + data = (e) s_enumData##e.GetEnumMemberValue(s) ; \ +} \ + template<> void wxStringWriteValue(wxString &s , const e &data ) \ +{ \ + s = s_enumData##e.GetEnumMemberName((int)data) ; \ +} \ + void FromLong##e( long data , wxxVariant& result ) { result = wxxVariant((e)data) ;} \ + void ToLong##e( const wxxVariant& data , long &result ) { result = (long) data.wxTEMPLATED_MEMBER_CALL(Get , e) ;} \ + wxTO_STRING_IMP( e ) \ + wxFROM_STRING_IMP( e ) \ + wxEnumTypeInfo s_typeInfo##e(wxT_ENUM , &s_enumData##e , &wxTO_STRING( e ) , &wxFROM_STRING( e ) , &ToLong##e , &FromLong##e , typeid(e).name() ) ; + +// ---------------------------------------------------------------------------- +// Set Support +// +// in the header : +// +// enum wxFlavor +// { +// Vanilla, +// Chocolate, +// Strawberry, +// }; +// +// typedef wxBitset wxCoupe ; +// +// in the implementation file : +// +// wxBEGIN_ENUM( wxFlavor ) +// wxENUM_MEMBER( Vanilla ) +// wxENUM_MEMBER( Chocolate ) +// wxENUM_MEMBER( Strawberry ) +// wxEND_ENUM( wxFlavor ) +// +// wxIMPLEMENT_SET_STREAMING( wxCoupe , wxFlavor ) +// +// implementation note : no partial specialization for streaming, but a delegation to a +// different class +// +// ---------------------------------------------------------------------------- + +// in order to remove dependancy on string tokenizer +void WXDLLIMPEXP_BASE wxSetStringToArray( const wxString &s , wxArrayString &array ) ; + +template +void wxSetFromString(const wxString &s , wxBitset &data ) +{ + wxEnumData* edata = wxGetEnumData((e) 0) ; + data.reset() ; + + wxArrayString array ; + wxSetStringToArray( s , array ) ; + wxString flag; + for ( int i = 0 ; i < array.Count() ; ++i ) + { + flag = array[i] ; + int ivalue ; + if ( edata->HasEnumMemberValue( flag , &ivalue ) ) + { + data.set( (e) ivalue ) ; + } + } +} + +template +void wxSetToString( wxString &s , const wxBitset &data ) +{ + wxEnumData* edata = wxGetEnumData((e) 0) ; + int count = edata->GetEnumCount() ; + int i ; + s.Clear() ; + for ( i = 0 ; i < count ; i++ ) + { + e value = (e) edata->GetEnumMemberValueByIndex(i) ; + if ( data.test( value ) ) + { + // this could also be done by the templated calls + if ( !s.empty() ) + s +=wxT("|") ; + s += edata->GetEnumMemberNameByIndex(i) ; + } + } +} + +#define wxIMPLEMENT_SET_STREAMING(SetName,e) \ + template<> void wxStringReadValue(const wxString &s , wxBitset &data ) \ +{ \ + wxSetFromString( s , data ) ; \ +} \ + template<> void wxStringWriteValue( wxString &s , const wxBitset &data ) \ +{ \ + wxSetToString( s , data ) ; \ +} \ + void FromLong##SetName( long data , wxxVariant& result ) { result = wxxVariant(SetName((unsigned long)data)) ;} \ + void ToLong##SetName( const wxxVariant& data , long &result ) { result = (long) data.wxTEMPLATED_MEMBER_CALL(Get , SetName).to_ulong() ;} \ + wxTO_STRING_IMP( SetName ) \ + wxFROM_STRING_IMP( SetName ) \ + wxEnumTypeInfo s_typeInfo##SetName(wxT_SET , &s_enumData##e , &wxTO_STRING( SetName ) , &wxFROM_STRING( SetName ) , &ToLong##SetName , &FromLong##SetName, typeid(SetName).name() ) ; \ +} + +template +void wxFlagsFromString(const wxString &s , e &data ) +{ + wxEnumData* edata = wxGetEnumData((e*) 0) ; + data.m_data = 0 ; + + wxArrayString array ; + wxSetStringToArray( s , array ) ; + wxString flag; + for ( size_t i = 0 ; i < array.Count() ; ++i ) + { + flag = array[i] ; + int ivalue ; + if ( edata->HasEnumMemberValue( flag , &ivalue ) ) + { + data.m_data |= ivalue ; + } + } +} + +template +void wxFlagsToString( wxString &s , const e& data ) +{ + wxEnumData* edata = wxGetEnumData((e*) 0) ; + int count = edata->GetEnumCount() ; + int i ; + s.Clear() ; + long dataValue = data.m_data ; + for ( i = 0 ; i < count ; i++ ) + { + int value = edata->GetEnumMemberValueByIndex(i) ; + // make this to allow for multi-bit constants to work + if ( value && ( dataValue & value ) == value ) + { + // clear the flags we just set + dataValue &= ~value ; + // this could also be done by the templated calls + if ( !s.empty() ) + s +=wxT("|") ; + s += edata->GetEnumMemberNameByIndex(i) ; + } + } +} + +#define wxBEGIN_FLAGS( e ) \ + wxEnumMemberData s_enumDataMembers##e[] = { + +#define wxFLAGS_MEMBER( v ) { wxT(#v), v } , + +#define wxEND_FLAGS( e ) { NULL , 0 } } ; \ + wxEnumData s_enumData##e( s_enumDataMembers##e ) ; \ + wxEnumData *wxGetEnumData(e*) { return &s_enumData##e ; } \ + template<> void wxStringReadValue(const wxString &s , e &data ) \ +{ \ + wxFlagsFromString( s , data ) ; \ +} \ + template<> void wxStringWriteValue( wxString &s , const e& data ) \ +{ \ + wxFlagsToString( s , data ) ; \ +} \ + void FromLong##e( long data , wxxVariant& result ) { result = wxxVariant(e(data)) ;} \ + void ToLong##e( const wxxVariant& data , long &result ) { result = (long) data.wxTEMPLATED_MEMBER_CALL(Get , e).m_data ;} \ + wxTO_STRING_IMP( e ) \ + wxFROM_STRING_IMP( e ) \ + wxEnumTypeInfo s_typeInfo##e(wxT_SET , &s_enumData##e , &wxTO_STRING( e ) , &wxFROM_STRING( e ) , &ToLong##e , &FromLong##e, typeid(e).name() ) ; +// ---------------------------------------------------------------------------- +// Type Information +// ---------------------------------------------------------------------------- +// +// +// All data exposed by the RTTI is characterized using the following classes. +// The first characterization is done by wxTypeKind. All enums up to and including +// wxT_CUSTOM represent so called simple types. These cannot be divided any further. +// They can be converted to and from wxStrings, that's all. + + +enum wxTypeKind +{ + wxT_VOID = 0, // unknown type + wxT_BOOL, + wxT_CHAR, + wxT_UCHAR, + wxT_INT, + wxT_UINT, + wxT_LONG, + wxT_ULONG, + wxT_FLOAT, + wxT_DOUBLE, + wxT_STRING, // must be wxString + wxT_SET, // must be wxBitset<> template + wxT_ENUM, + wxT_CUSTOM, // user defined type (e.g. wxPoint) + + wxT_LAST_SIMPLE_TYPE_KIND = wxT_CUSTOM , + + wxT_OBJECT_PTR, // object reference + wxT_OBJECT , // embedded object + wxT_COLLECTION , // collection + + wxT_DELEGATE , // for connecting against an event source + + wxT_LAST_TYPE_KIND = wxT_DELEGATE // sentinel for bad data, asserts, debugging +}; + +class WXDLLIMPEXP_BASE wxxVariant ; +class WXDLLIMPEXP_BASE wxTypeInfo ; + +WX_DECLARE_STRING_HASH_MAP_WITH_DECL( wxTypeInfo* , wxTypeInfoMap , class WXDLLIMPEXP_BASE ) ; + +class WXDLLIMPEXP_BASE wxTypeInfo +{ +public : + typedef void (*converterToString_t)( const wxxVariant& data , wxString &result ) ; + typedef void (*converterFromString_t)( const wxString& data , wxxVariant &result ) ; + + wxTypeInfo(wxTypeKind kind, + converterToString_t to = NULL, converterFromString_t from = NULL, + const wxString &name = wxEmptyString): + m_toString(to), m_fromString(from), m_kind(kind), m_name(name) + { + Register(); + } +#if wxUSE_UNICODE + wxTypeInfo(wxTypeKind kind, + converterToString_t to, converterFromString_t from, + const char *name): + m_toString(to), m_fromString(from), m_kind(kind), m_name(wxString::FromAscii(name)) + { + Register(); + } +#endif + + virtual ~wxTypeInfo() + { + Unregister() ; + } + + // return the kind of this type (wxT_... constants) + wxTypeKind GetKind() const { return m_kind ; } + + // returns the unique name of this type + const wxString& GetTypeName() const { return m_name ; } + + // is this type a delegate type + bool IsDelegateType() const { return m_kind == wxT_DELEGATE ; } + + // is this type a custom type + bool IsCustomType() const { return m_kind == wxT_CUSTOM ; } + + // is this type an object type + bool IsObjectType() const { return m_kind == wxT_OBJECT || m_kind == wxT_OBJECT_PTR ; } + + // can the content of this type be converted to and from strings ? + bool HasStringConverters() const { return m_toString != NULL && m_fromString != NULL ; } + + // convert a wxxVariant holding data of this type into a string + void ConvertToString( const wxxVariant& data , wxString &result ) const + + { if ( m_toString ) (*m_toString)( data , result ) ; else wxLogError( _("String conversions not supported") ) ; } + + // convert a string into a wxxVariant holding the corresponding data in this type + void ConvertFromString( const wxString& data , wxxVariant &result ) const + { if( m_fromString ) (*m_fromString)( data , result ) ; else wxLogError( _("String conversions not supported") ) ; } + +#if wxUSE_UNICODE + static wxTypeInfo *FindType(const char *typeName) { return FindType( wxString::FromAscii(typeName) ) ; } +#endif + static wxTypeInfo *FindType(const wxChar *typeName); + +private : + + void Register(); + void Unregister(); + + converterToString_t m_toString ; + converterFromString_t m_fromString ; + + static wxTypeInfoMap* ms_typeTable ; + + wxTypeKind m_kind; + wxString m_name; +}; + +class WXDLLIMPEXP_BASE wxBuiltInTypeInfo : public wxTypeInfo +{ +public : + wxBuiltInTypeInfo( wxTypeKind kind , converterToString_t to = NULL , converterFromString_t from = NULL , const wxString &name = wxEmptyString ) : + wxTypeInfo( kind , to , from , name ) + { wxASSERT_MSG( GetKind() < wxT_SET , wxT("Illegal Kind for Base Type") ) ; } +#if wxUSE_UNICODE + wxBuiltInTypeInfo( wxTypeKind kind , converterToString_t to , converterFromString_t from , const char *name ) : + wxTypeInfo( kind , to , from , name ) + { wxASSERT_MSG( GetKind() < wxT_SET , wxT("Illegal Kind for Base Type") ) ; } +#endif +} ; + +class WXDLLIMPEXP_BASE wxCustomTypeInfo : public wxTypeInfo +{ +public : + wxCustomTypeInfo( const wxString &name , converterToString_t to , converterFromString_t from ) : + wxTypeInfo( wxT_CUSTOM , to , from , name ) + {} +#if wxUSE_UNICODE + wxCustomTypeInfo( const char *name , converterToString_t to , converterFromString_t from ) : + wxTypeInfo( wxT_CUSTOM , to , from , name ) + {} +#endif +} ; + +class WXDLLIMPEXP_BASE wxEnumTypeInfo : public wxTypeInfo +{ +public : + typedef void (*converterToLong_t)( const wxxVariant& data , long &result ) ; + typedef void (*converterFromLong_t)( long data , wxxVariant &result ) ; + + wxEnumTypeInfo( wxTypeKind kind , wxEnumData* enumInfo , converterToString_t to , converterFromString_t from , + converterToLong_t toLong , converterFromLong_t fromLong , const wxString &name ) : + wxTypeInfo( kind , to , from , name ) , m_toLong( toLong ) , m_fromLong( fromLong ) + { wxASSERT_MSG( kind == wxT_ENUM || kind == wxT_SET , wxT("Illegal Kind for Enum Type")) ; m_enumInfo = enumInfo ;} + +#if wxUSE_UNICODE + wxEnumTypeInfo( wxTypeKind kind , wxEnumData* enumInfo , converterToString_t to , converterFromString_t from , + converterToLong_t toLong , converterFromLong_t fromLong , const char * name ) : + wxTypeInfo( kind , to , from , name ) , m_toLong( toLong ) , m_fromLong( fromLong ) + { wxASSERT_MSG( kind == wxT_ENUM || kind == wxT_SET , wxT("Illegal Kind for Enum Type")) ; m_enumInfo = enumInfo ;} +#endif + const wxEnumData* GetEnumData() const { return m_enumInfo ; } + + // convert a wxxVariant holding data of this type into a long + void ConvertToLong( const wxxVariant& data , long &result ) const + + { if( m_toLong ) (*m_toLong)( data , result ) ; else wxLogError( _("Long Conversions not supported") ) ; } + + // convert a long into a wxxVariant holding the corresponding data in this type + void ConvertFromLong( long data , wxxVariant &result ) const + { if( m_fromLong ) (*m_fromLong)( data , result ) ; else wxLogError( _("Long Conversions not supported") ) ;} + +private : + converterToLong_t m_toLong ; + converterFromLong_t m_fromLong ; + + wxEnumData *m_enumInfo; // Kind == wxT_ENUM or Kind == wxT_SET +} ; + +class WXDLLIMPEXP_BASE wxClassTypeInfo : public wxTypeInfo +{ +public : + wxClassTypeInfo( wxTypeKind kind , wxClassInfo* classInfo , converterToString_t to = NULL , converterFromString_t from = NULL , const wxString &name = wxEmptyString) ; +#if wxUSE_UNICODE + wxClassTypeInfo( wxTypeKind kind , wxClassInfo* classInfo , converterToString_t to , converterFromString_t from , const char *name ) ; +#endif + const wxClassInfo *GetClassInfo() const { return m_classInfo ; } +private : + wxClassInfo *m_classInfo; // Kind == wxT_OBJECT - could be NULL +} ; + +class WXDLLIMPEXP_BASE wxCollectionTypeInfo : public wxTypeInfo +{ +public : + wxCollectionTypeInfo( const wxString &elementName , converterToString_t to , converterFromString_t from , const wxString &name) : + wxTypeInfo( wxT_COLLECTION , to , from , name ) + { m_elementTypeName = elementName ; m_elementType = NULL ;} +#if wxUSE_UNICODE + wxCollectionTypeInfo( const char *elementName , converterToString_t to , converterFromString_t from , const char *name ) : + wxTypeInfo( wxT_COLLECTION , to , from , name ) + { m_elementTypeName = wxString::FromAscii( elementName ) ; m_elementType = NULL ;} +#endif + const wxTypeInfo* GetElementType() const + { + if ( m_elementType == NULL ) + m_elementType = wxTypeInfo::FindType( m_elementTypeName ) ; + return m_elementType ; } +private : + mutable wxTypeInfo * m_elementType ; + wxString m_elementTypeName ; +} ; + +// a delegate is an exposed event source + +class WXDLLIMPEXP_BASE wxDelegateTypeInfo : public wxTypeInfo +{ +public : + wxDelegateTypeInfo( int eventType , wxClassInfo* eventClass , converterToString_t to = NULL , converterFromString_t from = NULL ) ; + wxDelegateTypeInfo( int eventType , int lastEventType, wxClassInfo* eventClass , converterToString_t to = NULL , converterFromString_t from = NULL ) ; + int GetEventType() const { return m_eventType ; } + int GetLastEventType() const { return m_lastEventType ; } + const wxClassInfo* GetEventClass() const { return m_eventClass ; } +private : + const wxClassInfo *m_eventClass; // (extended will merge into classinfo) + int m_eventType ; + int m_lastEventType ; +} ; + +template const wxTypeInfo* wxGetTypeInfo( T * ) { return wxTypeInfo::FindType(typeid(T).name()) ; } + +// this macro is for usage with custom, non-object derived classes and structs, wxPoint is such a custom type + +#if wxUSE_FUNC_TEMPLATE_POINTER +#define wxCUSTOM_TYPE_INFO( e , toString , fromString ) \ + wxCustomTypeInfo s_typeInfo##e(typeid(e).name() , &toString , &fromString) ; +#else +#define wxCUSTOM_TYPE_INFO( e , toString , fromString ) \ + void ToString##e( const wxxVariant& data , wxString &result ) { toString(data, result); } \ + void FromString##e( const wxString& data , wxxVariant &result ) { fromString(data, result); } \ + wxCustomTypeInfo s_typeInfo##e(typeid(e).name() , &ToString##e , &FromString##e) ; +#endif + +#define wxCOLLECTION_TYPE_INFO( element , collection ) \ + wxCollectionTypeInfo s_typeInfo##collection( typeid(element).name() , NULL , NULL , typeid(collection).name() ) ; + +// sometimes a compiler invents specializations that are nowhere called, use this macro to satisfy the refs, currently +// we don't have to play tricks, but if we will have to according to the compiler, we will use that macro for that + +#define wxILLEGAL_TYPE_SPECIALIZATION( a ) + +// ---------------------------------------------------------------------------- +// wxxVariant as typesafe data holder +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxxVariantData +{ +public: + virtual ~wxxVariantData() {} + + // return a heap allocated duplicate + virtual wxxVariantData* Clone() const = 0 ; + + // returns the type info of the contentc + virtual const wxTypeInfo* GetTypeInfo() const = 0 ; +} ; + +template class wxxVariantDataT : public wxxVariantData +{ +public: + wxxVariantDataT(const T& d) : m_data(d) {} + virtual ~wxxVariantDataT() {} + + // get a ref to the stored data + T & Get() { return m_data; } + + // get a const ref to the stored data + const T & Get() const { return m_data; } + + // set the data + void Set(const T& d) { m_data = d; } + + // return a heap allocated duplicate + virtual wxxVariantData* Clone() const { return new wxxVariantDataT( Get() ) ; } + + // returns the type info of the contentc + virtual const wxTypeInfo* GetTypeInfo() const { return wxGetTypeInfo( (T*) NULL ) ; } + +private: + T m_data; +}; + +class WXDLLIMPEXP_BASE wxxVariant +{ +public : + wxxVariant() { m_data = NULL ; } + wxxVariant( wxxVariantData* data , const wxString& name = wxEmptyString ) : m_data(data) , m_name(name) {} + wxxVariant( const wxxVariant &d ) { if ( d.m_data ) m_data = d.m_data->Clone() ; else m_data = NULL ; m_name = d.m_name ; } + + template wxxVariant( const T& data , const wxString& name = wxEmptyString ) : + m_data(new wxxVariantDataT(data) ), m_name(name) {} + + ~wxxVariant() { delete m_data ; } + + // get a ref to the stored data + template T& Get(wxTEMPLATED_MEMBER_FIX(T)) + { + wxxVariantDataT *dataptr = dynamic_cast*> (m_data) ; + wxASSERT_MSG( dataptr , wxString::Format(wxT("Cast to %s not possible"), typeid(T).name()) ) ; + return dataptr->Get() ; + } + + // get a ref to the stored data + template const T& Get(wxTEMPLATED_MEMBER_FIX(T)) const + { + const wxxVariantDataT *dataptr = dynamic_cast*> (m_data) ; + wxASSERT_MSG( dataptr , wxString::Format(wxT("Cast to %s not possible"), typeid(T).name()) ) ; + return dataptr->Get() ; + } + + bool IsEmpty() const { return m_data == NULL ; } + + template bool HasData(wxTEMPLATED_MEMBER_FIX(T)) const + { + const wxxVariantDataT *dataptr = dynamic_cast*> (m_data) ; + return dataptr != NULL ; + } + + // stores the data + template void Set(const T& data) const + { + delete m_data ; + m_data = new wxxVariantDataT(data) ; + } + + wxxVariant& operator=(const wxxVariant &d) + { + delete m_data; + m_data = d.m_data ? d.m_data->Clone() : NULL ; + m_name = d.m_name ; + return *this ; + } + + // gets the stored data casted to a wxObject* , returning NULL if cast is not possible + wxObject* GetAsObject() ; + + // get the typeinfo of the stored object + const wxTypeInfo* GetTypeInfo() const { return m_data->GetTypeInfo() ; } + + // returns this value as string + wxString GetAsString() const + { + wxString s ; + GetTypeInfo()->ConvertToString( *this , s ) ; + return s ; + } + const wxString& GetName() const { return m_name ; } +private : + wxxVariantData* m_data ; + wxString m_name ; +} ; + +#include "wx/dynarray.h" + +WX_DECLARE_OBJARRAY_WITH_DECL(wxxVariant, wxxVariantArray, class WXDLLIMPEXP_BASE); + +// templated streaming, every type must have their specialization for these methods + +template +void wxStringReadValue( const wxString &s , T &data ); + +template +void wxStringWriteValue( wxString &s , const T &data); + +template +void wxToStringConverter( const wxxVariant &v, wxString &s wxTEMPLATED_FUNCTION_FIX(T)) { wxStringWriteValue( s , v.wxTEMPLATED_MEMBER_CALL(Get , T) ) ; } + +template +void wxFromStringConverter( const wxString &s, wxxVariant &v wxTEMPLATED_FUNCTION_FIX(T)) { T d ; wxStringReadValue( s , d ) ; v = wxxVariant(d) ; } + +// ---------------------------------------------------------------------------- +// Property Support +// +// wxPropertyInfo is used to inquire of the property by name. It doesn't +// provide access to the property, only information about it. If you +// want access, look at wxPropertyAccessor. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxSetter +{ +public: + wxSetter( const wxString name ) { m_name = name ; } + virtual ~wxSetter() {} + virtual void Set( wxObject *object, const wxxVariant &variantValue ) const = 0; + const wxString& GetName() const { return m_name ; } +private: + wxString m_name; +}; + +class WXDLLIMPEXP_BASE wxGetter +{ +public: + wxGetter( const wxString name ) { m_name = name ; } + virtual ~wxGetter() {} + virtual void Get( const wxObject *object , wxxVariant& result) const = 0; + const wxString& GetName() const { return m_name ; } +private: + wxString m_name; +}; + +class WXDLLIMPEXP_BASE wxCollectionGetter +{ +public : + wxCollectionGetter( const wxString name ) { m_name = name ; } + virtual ~wxCollectionGetter() {} + virtual void Get( const wxObject *object , wxxVariantArray& result) const = 0; + const wxString& GetName() const { return m_name ; } +private : + wxString m_name ; +} ; + +template void WXDLLIMPEXP_BASE wxCollectionToVariantArray( const coll_t& coll , wxxVariantArray& result ) ; + +class WXDLLIMPEXP_BASE wxAdder +{ +public : + wxAdder( const wxString name ) { m_name = name ; } + virtual ~wxAdder() {} + virtual void Add( wxObject *object, const wxxVariant &variantValue ) const= 0; + const wxString& GetName() const { return m_name ; } +private : + wxString m_name ; +} ; + + +#define wxSETTER( property, Klass, valueType, setterMethod ) \ +class wxSetter##property : public wxSetter \ +{ \ +public: \ + wxINFUNC_CLASS_TYPE_FIX(Klass) \ + wxSetter##property() : wxSetter( wxT(#setterMethod) ) {} \ + virtual ~wxSetter##property() {} \ + void Set( wxObject *object, const wxxVariant &variantValue ) const \ +{ \ + Klass *obj = dynamic_cast(object) ; \ + if ( variantValue.wxTEMPLATED_MEMBER_CALL(HasData, valueType) ) \ + obj->setterMethod(variantValue.wxTEMPLATED_MEMBER_CALL(Get , valueType)) ; \ + else \ + obj->setterMethod(*variantValue.wxTEMPLATED_MEMBER_CALL(Get , valueType*)) ; \ +} \ +} ; + +#define wxGETTER( property, Klass, valueType , gettermethod ) \ +class wxGetter##property : public wxGetter \ +{ \ +public : \ + wxINFUNC_CLASS_TYPE_FIX(Klass) \ + wxGetter##property() : wxGetter( wxT(#gettermethod) ) {} \ + virtual ~wxGetter##property() {} \ + void Get( const wxObject *object , wxxVariant &result) const \ +{ \ + const Klass *obj = dynamic_cast(object) ; \ + result = wxxVariant( obj->gettermethod() ) ; \ +} \ +} ; + +#define wxADDER( property, Klass, valueType , addermethod ) \ +class wxAdder##property : public wxAdder \ +{ \ +public: \ + wxINFUNC_CLASS_TYPE_FIX(Klass) \ + wxAdder##property() : wxAdder( wxT(#addermethod) ) {} \ + virtual ~wxAdder##property() {} \ + void Add( wxObject *object, const wxxVariant &variantValue ) const \ +{ \ + Klass *obj = dynamic_cast(object) ; \ + if ( variantValue.wxTEMPLATED_MEMBER_CALL(HasData, valueType) ) \ + obj->addermethod(variantValue.wxTEMPLATED_MEMBER_CALL(Get , valueType)) ; \ + else \ + obj->addermethod(*variantValue.wxTEMPLATED_MEMBER_CALL(Get , valueType*)) ; \ +} \ +} ; + +#define wxCOLLECTION_GETTER( property, Klass, valueType , gettermethod ) \ +class wxCollectionGetter##property : public wxCollectionGetter \ +{ \ +public : \ + wxINFUNC_CLASS_TYPE_FIX(Klass) \ + wxCollectionGetter##property() : wxCollectionGetter( wxT(#gettermethod) ) {} \ + virtual ~wxCollectionGetter##property() {} \ + void Get( const wxObject *object , wxxVariantArray &result) const \ +{ \ + const Klass *obj = dynamic_cast(object) ; \ + wxCollectionToVariantArray( obj->gettermethod() , result ) ; \ +} \ +} ; + +class WXDLLIMPEXP_BASE wxPropertyAccessor +{ +public : + wxPropertyAccessor( wxSetter *setter , wxGetter *getter , wxAdder *adder , wxCollectionGetter *collectionGetter ) + { m_setter = setter ; m_getter = getter ; m_adder = adder ; m_collectionGetter = collectionGetter ;} + + virtual ~wxPropertyAccessor() {} + + // Setting a simple property (non-collection) + virtual void SetProperty(wxObject *object, const wxxVariant &value) const + { if ( m_setter ) m_setter->Set( object , value ) ; else wxLogError( _("SetProperty called w/o valid setter") ) ;} + + // Getting a simple property (non-collection) + virtual void GetProperty(const wxObject *object, wxxVariant &result) const + { if ( m_getter ) m_getter->Get( object , result ) ; else wxLogError( _("GetProperty called w/o valid getter") ) ;} + + // Adding an element to a collection property + virtual void AddToPropertyCollection(wxObject *object, const wxxVariant &value) const + { if ( m_adder ) m_adder->Add( object , value ) ; else wxLogError( _("AddToPropertyCollection called w/o valid adder") ) ;} + + // Getting a collection property + virtual void GetPropertyCollection( const wxObject *obj, wxxVariantArray &result) const + { if ( m_collectionGetter ) m_collectionGetter->Get( obj , result) ; else wxLogError( _("GetPropertyCollection called w/o valid collection getter") ) ;} + + virtual bool HasSetter() const { return m_setter != NULL ; } + virtual bool HasCollectionGetter() const { return m_collectionGetter != NULL ; } + virtual bool HasGetter() const { return m_getter != NULL ; } + virtual bool HasAdder() const { return m_adder != NULL ; } + + virtual const wxString& GetCollectionGetterName() const + { return m_collectionGetter->GetName() ; } + virtual const wxString& GetGetterName() const + { return m_getter->GetName() ; } + virtual const wxString& GetSetterName() const + { return m_setter->GetName() ; } + virtual const wxString& GetAdderName() const + { return m_adder->GetName() ; } + +protected : + wxSetter *m_setter ; + wxAdder *m_adder ; + wxGetter *m_getter ; + wxCollectionGetter* m_collectionGetter ; +}; + +class WXDLLIMPEXP_BASE wxGenericPropertyAccessor : public wxPropertyAccessor +{ +public : + wxGenericPropertyAccessor( const wxString &propName ) ; + virtual ~wxGenericPropertyAccessor() ; + + void RenameProperty( const wxString& WXUNUSED_UNLESS_DEBUG(oldName), + const wxString& newName ) + { + wxASSERT( oldName == m_propertyName ) ; m_propertyName = newName ; + } + virtual bool HasSetter() const { return true ; } + virtual bool HasGetter() const { return true ; } + virtual bool HasAdder() const { return false ; } + virtual bool HasCollectionGetter() const { return false ; } + + virtual const wxString& GetGetterName() const + { return m_getterName ; } + virtual const wxString& GetSetterName() const + { return m_setterName ; } + + virtual void SetProperty(wxObject *object, const wxxVariant &value) const ; + virtual void GetProperty(const wxObject *object, wxxVariant &value) const ; + + // Adding an element to a collection property + virtual void AddToPropertyCollection(wxObject *WXUNUSED(object), const wxxVariant &WXUNUSED(value)) const + { wxLogError( _("AddToPropertyCollection called on a generic accessor") ) ;} + + // Getting a collection property + virtual void GetPropertyCollection( const wxObject *WXUNUSED(obj), wxxVariantArray &WXUNUSED(result)) const + { wxLogError ( _("GetPropertyCollection called on a generic accessor") ) ;} +private : + struct wxGenericPropertyAccessorInternal ; + wxGenericPropertyAccessorInternal* m_data ; + wxString m_propertyName ; + wxString m_setterName ; + wxString m_getterName ; +} ; + +typedef long wxPropertyInfoFlags ; +enum { + // will be removed in future releases + wxPROP_DEPRECATED = 0x00000001 , + // object graph property, will be streamed with priority (after constructor properties) + wxPROP_OBJECT_GRAPH = 0x00000002 , + // this will only be streamed out and in as enum/set, the internal representation is still a long + wxPROP_ENUM_STORE_LONG = 0x00000004 , + // don't stream out this property, needed eg to avoid streaming out children that are always created by their parents + wxPROP_DONT_STREAM = 0x00000008 , +} ; + +class WXDLLIMPEXP_BASE wxPropertyInfo +{ + friend class WXDLLIMPEXP_BASE wxDynamicClassInfo ; +public : + wxPropertyInfo(wxPropertyInfo* &iter, + wxClassInfo* itsClass, + const wxString& name, + const wxString& typeName, + wxPropertyAccessor *accessor, + wxxVariant dv, + wxPropertyInfoFlags flags = 0, + const wxString& helpString = wxEmptyString, + const wxString& groupString = wxEmptyString) : + m_itsClass(itsClass), + m_name(name), + m_typeInfo(NULL), + m_typeName(typeName) , + m_collectionElementTypeInfo(NULL), + m_accessor(accessor), + m_defaultValue(dv), + m_flags(flags), + m_helpString(helpString), + m_groupString(groupString) + { + Insert(iter); + } + +#if wxUSE_UNICODE + wxPropertyInfo(wxPropertyInfo* &iter, + wxClassInfo* itsClass, + const wxString& name, + const char* typeName, + wxPropertyAccessor *accessor, + wxxVariant dv, + wxPropertyInfoFlags flags = 0, + const wxString& helpString = wxEmptyString, + const wxString& groupString = wxEmptyString) : + m_itsClass(itsClass), + m_name(name), + m_typeInfo(NULL), + m_typeName(wxString::FromAscii(typeName)) , + m_collectionElementTypeInfo(NULL), + m_accessor(accessor), + m_defaultValue(dv), + m_flags(flags), + m_helpString(helpString), + m_groupString(groupString) + { + Insert(iter); + } +#endif + wxPropertyInfo(wxPropertyInfo* &iter, + wxClassInfo* itsClass, + const wxString& name, + wxDelegateTypeInfo* type, + wxPropertyAccessor *accessor, + wxxVariant dv, + wxPropertyInfoFlags flags = 0, + const wxString& helpString = wxEmptyString, + const wxString& groupString = wxEmptyString) : + m_itsClass(itsClass), + m_name(name), + m_typeInfo(type), + m_collectionElementTypeInfo(NULL), + m_accessor(accessor), + m_defaultValue(dv), + m_flags(flags), + m_helpString(helpString), + m_groupString(groupString) + { + Insert(iter); + } + + wxPropertyInfo(wxPropertyInfo* &iter, + wxClassInfo* itsClass, const wxString& name, + const wxString& collectionTypeName, + const wxString& elementTypeName, + wxPropertyAccessor *accessor, + wxPropertyInfoFlags flags = 0, + const wxString& helpString = wxEmptyString, + const wxString& groupString = wxEmptyString) : + m_itsClass(itsClass), + m_name(name), + m_typeInfo(NULL), + m_typeName(collectionTypeName) , + m_collectionElementTypeInfo(NULL), + m_collectionElementTypeName(elementTypeName), + m_accessor(accessor) , + m_flags(flags), + m_helpString(helpString), + m_groupString(groupString) + { + Insert(iter); + } + +#if wxUSE_UNICODE + wxPropertyInfo(wxPropertyInfo* &iter, + wxClassInfo* itsClass, const wxString& name, + const char* collectionTypeName, + const char* elementTypeName, + wxPropertyAccessor *accessor, + wxPropertyInfoFlags flags = 0, + const wxString& helpString = wxEmptyString, + const wxString& groupString = wxEmptyString) : + m_itsClass(itsClass), + m_name(name), + m_typeInfo(NULL), + m_typeName(wxString::FromAscii(collectionTypeName)) , + m_collectionElementTypeInfo(NULL), + m_collectionElementTypeName(wxString::FromAscii(elementTypeName)), + m_accessor(accessor) , + m_flags(flags), + m_helpString(helpString), + m_groupString(groupString) + { + Insert(iter); + } +#endif + ~wxPropertyInfo() ; + + // return the class this property is declared in + const wxClassInfo* GetDeclaringClass() const { return m_itsClass ; } + + // return the name of this property + const wxString& GetName() const { return m_name ; } + + // returns the flags of this property + wxPropertyInfoFlags GetFlags() const { return m_flags ;} + + // returns the short help string of this property + const wxString& GetHelpString() const { return m_helpString ; } + + // returns the group string of this property + const wxString& GetGroupString() const { return m_groupString ; } + + // return the element type info of this property (for collections, otherwise NULL) + const wxTypeInfo * GetCollectionElementTypeInfo() const + { + if ( m_collectionElementTypeInfo == NULL ) + m_collectionElementTypeInfo = wxTypeInfo::FindType(m_collectionElementTypeName) ; + return m_collectionElementTypeInfo ; + } + + // return the type info of this property + const wxTypeInfo * GetTypeInfo() const + { + if ( m_typeInfo == NULL ) + m_typeInfo = wxTypeInfo::FindType(m_typeName) ; + return m_typeInfo ; + } + + // return the accessor for this property + wxPropertyAccessor* GetAccessor() const { return m_accessor ; } + + // returns NULL if this is the last property of this class + wxPropertyInfo* GetNext() const { return m_next ; } + + // returns the default value of this property, its kind may be wxT_VOID if it is not valid + wxxVariant GetDefaultValue() const { return m_defaultValue ; } +private : + void Insert(wxPropertyInfo* &iter) + { + m_next = NULL ; + if ( iter == NULL ) + iter = this ; + else + { + wxPropertyInfo* i = iter ; + while( i->m_next ) + i = i->m_next ; + + i->m_next = this ; + } + } + + wxClassInfo* m_itsClass ; + wxString m_name ; + mutable wxTypeInfo* m_typeInfo ; + wxString m_typeName ; + mutable wxTypeInfo* m_collectionElementTypeInfo ; + wxString m_collectionElementTypeName ; + wxPropertyAccessor* m_accessor ; + wxxVariant m_defaultValue; + wxPropertyInfoFlags m_flags ; + wxString m_helpString ; + wxString m_groupString ; + // string representation of the default value + // to be assigned by the designer to the property + // when the component is dropped on the container. + wxPropertyInfo* m_next ; +}; + +WX_DECLARE_STRING_HASH_MAP_WITH_DECL( wxPropertyInfo* , wxPropertyInfoMap , class WXDLLIMPEXP_BASE ) ; + +#define wxBEGIN_PROPERTIES_TABLE(theClass) \ + wxPropertyInfo *theClass::GetPropertiesStatic() \ +{ \ + typedef theClass class_t; \ + static wxPropertyInfo* first = NULL ; + +#define wxEND_PROPERTIES_TABLE() \ + return first ; } + +#define wxHIDE_PROPERTY( pname ) \ + static wxPropertyInfo _propertyInfo##pname( first , class_t::GetClassInfoStatic() , wxT(#pname) , typeid(void).name() ,NULL , wxxVariant() , wxPROP_DONT_STREAM , wxEmptyString , wxEmptyString ) ; + +#define wxPROPERTY( pname , type , setter , getter , defaultValue , flags , help , group) \ + wxSETTER( pname , class_t , type , setter ) \ + static wxSetter##pname _setter##pname ; \ + wxGETTER( pname , class_t , type , getter ) \ + static wxGetter##pname _getter##pname ; \ + static wxPropertyAccessor _accessor##pname( &_setter##pname , &_getter##pname , NULL , NULL ) ; \ + static wxPropertyInfo _propertyInfo##pname( first , class_t::GetClassInfoStatic() , wxT(#pname) , typeid(type).name() ,&_accessor##pname , wxxVariant(defaultValue) , flags , group , help ) ; + +#define wxPROPERTY_FLAGS( pname , flags , type , setter , getter ,defaultValue , pflags , help , group) \ + wxSETTER( pname , class_t , type , setter ) \ + static wxSetter##pname _setter##pname ; \ + wxGETTER( pname , class_t , type , getter ) \ + static wxGetter##pname _getter##pname ; \ + static wxPropertyAccessor _accessor##pname( &_setter##pname , &_getter##pname , NULL , NULL ) ; \ + static wxPropertyInfo _propertyInfo##pname( first , class_t::GetClassInfoStatic() , wxT(#pname) , typeid(flags).name() ,&_accessor##pname , wxxVariant(defaultValue), wxPROP_ENUM_STORE_LONG | pflags , help , group ) ; + +#define wxREADONLY_PROPERTY( pname , type , getter ,defaultValue , flags , help , group) \ + wxGETTER( pname , class_t , type , getter ) \ + static wxGetter##pname _getter##pname ; \ + static wxPropertyAccessor _accessor##pname( NULL , &_getter##pname , NULL , NULL ) ; \ + static wxPropertyInfo _propertyInfo##pname( first , class_t::GetClassInfoStatic() , wxT(#pname) , typeid(type).name() ,&_accessor##pname , wxxVariant(defaultValue), flags , help , group ) ; + +#define wxREADONLY_PROPERTY_FLAGS( pname , flags , type , getter ,defaultValue , pflags , help , group) \ + wxGETTER( pname , class_t , type , getter ) \ + static wxGetter##pname _getter##pname ; \ + static wxPropertyAccessor _accessor##pname( NULL , &_getter##pname , NULL , NULL ) ; \ + static wxPropertyInfo _propertyInfo##pname( first , class_t::GetClassInfoStatic() , wxT(#pname) , typeid(flags).name() ,&_accessor##pname , wxxVariant(defaultValue), wxPROP_ENUM_STORE_LONG | pflags , help , group ) ; + +#define wxPROPERTY_COLLECTION( pname , colltype , addelemtype , adder , getter , flags , help , group ) \ + wxADDER( pname , class_t , addelemtype , adder ) \ + static wxAdder##pname _adder##pname ; \ + wxCOLLECTION_GETTER( pname , class_t , colltype , getter ) \ + static wxCollectionGetter##pname _collectionGetter##pname ; \ + static wxPropertyAccessor _accessor##pname( NULL , NULL ,&_adder##pname , &_collectionGetter##pname ) ; \ + static wxPropertyInfo _propertyInfo##pname( first , class_t::GetClassInfoStatic() , wxT(#pname) , typeid(colltype).name() ,typeid(addelemtype).name() ,&_accessor##pname , flags , help , group ) ; + +#define wxREADONLY_PROPERTY_COLLECTION( pname , colltype , addelemtype , getter , flags , help , group) \ + wxCOLLECTION_GETTER( pname , class_t , colltype , getter ) \ + static wxCollectionGetter##pname _collectionGetter##pname ; \ + static wxPropertyAccessor _accessor##pname( NULL , NULL , NULL , &_collectionGetter##pname ) ; \ + static wxPropertyInfo _propertyInfo##pname( first ,class_t::GetClassInfoStatic() , wxT(#pname) , typeid(colltype).name() ,typeid(addelemtype).name() ,&_accessor##pname , flags , help , group ) ; + + +#define wxEVENT_PROPERTY( name , eventType , eventClass ) \ + static wxDelegateTypeInfo _typeInfo##name( eventType , CLASSINFO( eventClass ) ) ; \ + static wxPropertyInfo _propertyInfo##name( first ,class_t::GetClassInfoStatic() , wxT(#name) , &_typeInfo##name , NULL , wxxVariant() ) ; \ + +#define wxEVENT_RANGE_PROPERTY( name , eventType , lastEventType , eventClass ) \ + static wxDelegateTypeInfo _typeInfo##name( eventType , lastEventType , CLASSINFO( eventClass ) ) ; \ + static wxPropertyInfo _propertyInfo##name( first , class_t::GetClassInfoStatic() , wxT(#name) , &_typeInfo##name , NULL , wxxVariant() ) ; \ + +// ---------------------------------------------------------------------------- +// Implementation Helper for Simple Properties +// ---------------------------------------------------------------------------- + +#define wxIMPLEMENT_PROPERTY(name, type) \ +private:\ + type m_##name; \ +public: \ + void Set##name( type const & p) { m_##name = p; } \ + type const & Get##name() const { return m_##name; } + +// ---------------------------------------------------------------------------- +// Handler Info +// +// this is describing an event sink +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxHandlerInfo +{ + friend class WXDLLIMPEXP_BASE wxDynamicClassInfo ; +public : + wxHandlerInfo(wxHandlerInfo* &iter, + wxClassInfo* itsClass, + const wxString& name, + wxObjectEventFunction address, + const wxClassInfo* eventClassInfo) : + m_eventFunction(address), + m_name(name), + m_eventClassInfo(eventClassInfo) , + m_itsClass(itsClass) + { + m_next = NULL ; + if ( iter == NULL ) + iter = this ; + else + { + wxHandlerInfo* i = iter ; + while( i->m_next ) + i = i->m_next ; + + i->m_next = this ; + } + } + + ~wxHandlerInfo() ; + + // return the name of this handler + const wxString& GetName() const { return m_name ; } + + // return the class info of the event + const wxClassInfo *GetEventClassInfo() const { return m_eventClassInfo ; } + + // get the handler function pointer + wxObjectEventFunction GetEventFunction() const { return m_eventFunction ; } + + // returns NULL if this is the last handler of this class + wxHandlerInfo* GetNext() const { return m_next ; } + + // return the class this property is declared in + const wxClassInfo* GetDeclaringClass() const { return m_itsClass ; } + +private : + wxObjectEventFunction m_eventFunction ; + wxString m_name; + const wxClassInfo* m_eventClassInfo ; + wxHandlerInfo* m_next ; + wxClassInfo* m_itsClass ; +}; + +#define wxHANDLER(name,eventClassType) \ + static wxHandlerInfo _handlerInfo##name( first , class_t::GetClassInfoStatic() , wxT(#name) , (wxObjectEventFunction) (wxEventFunction) &name , CLASSINFO( eventClassType ) ) ; + +#define wxBEGIN_HANDLERS_TABLE(theClass) \ + wxHandlerInfo *theClass::GetHandlersStatic() \ +{ \ + typedef theClass class_t; \ + static wxHandlerInfo* first = NULL ; + +#define wxEND_HANDLERS_TABLE() \ + return first ; } + +// ---------------------------------------------------------------------------- +// Constructor Bridges +// +// allow to set up constructors with params during runtime +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxConstructorBridge +{ +public : + virtual void Create(wxObject * &o, wxxVariant *args) = 0; +}; + +// a direct constructor bridge calls the operator new for this class and +// passes all params to the constructor. needed for classes that cannot be +// instantiated using alloc-create semantics +class WXDLLIMPEXP_BASE wxDirectConstructorBrigde : public wxConstructorBridge +{ +public : + virtual void Create(wxObject * &o, wxxVariant *args) = 0; +} ; + +// Creator Bridges for all Numbers of Params + +// no params + +template +struct wxConstructorBridge_0 : public wxConstructorBridge +{ + void Create(wxObject * &o, wxxVariant *) + { + Class *obj = dynamic_cast(o); + obj->Create(); + } +}; + +struct wxConstructorBridge_Dummy : public wxConstructorBridge +{ + void Create(wxObject *&, wxxVariant *) + { + } +} ; + +#define wxCONSTRUCTOR_0(klass) \ + wxConstructorBridge_0 constructor##klass ; \ + wxConstructorBridge* klass::ms_constructor = &constructor##klass ; \ + const wxChar *klass::ms_constructorProperties[] = { NULL } ; \ + const int klass::ms_constructorPropertiesCount = 0 ; + +#define wxCONSTRUCTOR_DUMMY(klass) \ + wxConstructorBridge_Dummy constructor##klass ; \ + wxConstructorBridge* klass::ms_constructor = &constructor##klass ; \ + const wxChar *klass::ms_constructorProperties[] = { NULL } ; \ + const int klass::ms_constructorPropertiesCount = 0 ; + +// 1 param + +template +struct wxConstructorBridge_1 : public wxConstructorBridge +{ + void Create(wxObject * &o, wxxVariant *args) + { + Class *obj = dynamic_cast(o); + obj->Create( + args[0].wxTEMPLATED_MEMBER_CALL(Get , T0) + ); + } +}; + +#define wxCONSTRUCTOR_1(klass,t0,v0) \ + wxConstructorBridge_1 constructor##klass ; \ + wxConstructorBridge* klass::ms_constructor = &constructor##klass ; \ + const wxChar *klass::ms_constructorProperties[] = { wxT(#v0) } ; \ + const int klass::ms_constructorPropertiesCount = 1 ; + +// 2 params + +template +struct wxConstructorBridge_2 : public wxConstructorBridge +{ + void Create(wxObject * &o, wxxVariant *args) + { + Class *obj = dynamic_cast(o); + obj->Create( + args[0].wxTEMPLATED_MEMBER_CALL(Get , T0) , + args[1].wxTEMPLATED_MEMBER_CALL(Get , T1) + ); + } +}; + +#define wxCONSTRUCTOR_2(klass,t0,v0,t1,v1) \ + wxConstructorBridge_2 constructor##klass ; \ + wxConstructorBridge* klass::ms_constructor = &constructor##klass ; \ + const wxChar *klass::ms_constructorProperties[] = { wxT(#v0) , wxT(#v1) } ; \ + const int klass::ms_constructorPropertiesCount = 2; + +// direct constructor version + +template +struct wxDirectConstructorBridge_2 : public wxDirectConstructorBrigde +{ + void Create(wxObject * &o, wxxVariant *args) + { + o = new Class( + args[0].wxTEMPLATED_MEMBER_CALL(Get , T0) , + args[1].wxTEMPLATED_MEMBER_CALL(Get , T1) + ); + } +}; + +#define wxDIRECT_CONSTRUCTOR_2(klass,t0,v0,t1,v1) \ + wxDirectConstructorBridge_2 constructor##klass ; \ + wxConstructorBridge* klass::ms_constructor = &constructor##klass ; \ + const wxChar *klass::ms_constructorProperties[] = { wxT(#v0) , wxT(#v1) } ; \ + const int klass::ms_constructorPropertiesCount = 2; + + +// 3 params + +template +struct wxConstructorBridge_3 : public wxConstructorBridge +{ + void Create(wxObject * &o, wxxVariant *args) + { + Class *obj = dynamic_cast(o); + obj->Create( + args[0].wxTEMPLATED_MEMBER_CALL(Get , T0) , + args[1].wxTEMPLATED_MEMBER_CALL(Get , T1) , + args[2].wxTEMPLATED_MEMBER_CALL(Get , T2) + ); + } +}; + +#define wxCONSTRUCTOR_3(klass,t0,v0,t1,v1,t2,v2) \ + wxConstructorBridge_3 constructor##klass ; \ + wxConstructorBridge* klass::ms_constructor = &constructor##klass ; \ + const wxChar *klass::ms_constructorProperties[] = { wxT(#v0) , wxT(#v1) , wxT(#v2) } ; \ + const int klass::ms_constructorPropertiesCount = 3 ; + +// direct constructor version + +template +struct wxDirectConstructorBridge_3 : public wxDirectConstructorBrigde +{ + void Create(wxObject * &o, wxxVariant *args) + { + o = new Class( + args[0].wxTEMPLATED_MEMBER_CALL(Get , T0) , + args[1].wxTEMPLATED_MEMBER_CALL(Get , T1) , + args[2].wxTEMPLATED_MEMBER_CALL(Get , T2) + ); + } +}; + +#define wxDIRECT_CONSTRUCTOR_3(klass,t0,v0,t1,v1,t2,v2) \ + wxDirectConstructorBridge_3 constructor##klass ; \ + wxConstructorBridge* klass::ms_constructor = &constructor##klass ; \ + const wxChar *klass::ms_constructorProperties[] = { wxT(#v0) , wxT(#v1) , wxT(#v2) } ; \ + const int klass::ms_constructorPropertiesCount = 3; + +// 4 params + +template +struct wxConstructorBridge_4 : public wxConstructorBridge +{ + void Create(wxObject * &o, wxxVariant *args) + { + Class *obj = dynamic_cast(o); + obj->Create( + args[0].wxTEMPLATED_MEMBER_CALL(Get , T0) , + args[1].wxTEMPLATED_MEMBER_CALL(Get , T1) , + args[2].wxTEMPLATED_MEMBER_CALL(Get , T2) , + args[3].wxTEMPLATED_MEMBER_CALL(Get , T3) + ); + } +}; + +#define wxCONSTRUCTOR_4(klass,t0,v0,t1,v1,t2,v2,t3,v3) \ + wxConstructorBridge_4 constructor##klass ; \ + wxConstructorBridge* klass::ms_constructor = &constructor##klass ; \ + const wxChar *klass::ms_constructorProperties[] = { wxT(#v0) , wxT(#v1) , wxT(#v2) , wxT(#v3) } ; \ + const int klass::ms_constructorPropertiesCount = 4 ; + +// 5 params + +template +struct wxConstructorBridge_5 : public wxConstructorBridge +{ + void Create(wxObject * &o, wxxVariant *args) + { + Class *obj = dynamic_cast(o); + obj->Create( + args[0].wxTEMPLATED_MEMBER_CALL(Get , T0) , + args[1].wxTEMPLATED_MEMBER_CALL(Get , T1) , + args[2].wxTEMPLATED_MEMBER_CALL(Get , T2) , + args[3].wxTEMPLATED_MEMBER_CALL(Get , T3) , + args[4].wxTEMPLATED_MEMBER_CALL(Get , T4) + ); + } +}; + +#define wxCONSTRUCTOR_5(klass,t0,v0,t1,v1,t2,v2,t3,v3,t4,v4) \ + wxConstructorBridge_5 constructor##klass ; \ + wxConstructorBridge* klass::ms_constructor = &constructor##klass ; \ + const wxChar *klass::ms_constructorProperties[] = { wxT(#v0) , wxT(#v1) , wxT(#v2) , wxT(#v3) , wxT(#v4) } ; \ + const int klass::ms_constructorPropertiesCount = 5; + +// 6 params + +template +struct wxConstructorBridge_6 : public wxConstructorBridge +{ + void Create(wxObject * &o, wxxVariant *args) + { + Class *obj = dynamic_cast(o); + obj->Create( + args[0].wxTEMPLATED_MEMBER_CALL(Get , T0) , + args[1].wxTEMPLATED_MEMBER_CALL(Get , T1) , + args[2].wxTEMPLATED_MEMBER_CALL(Get , T2) , + args[3].wxTEMPLATED_MEMBER_CALL(Get , T3) , + args[4].wxTEMPLATED_MEMBER_CALL(Get , T4) , + args[5].wxTEMPLATED_MEMBER_CALL(Get , T5) + ); + } +}; + +#define wxCONSTRUCTOR_6(klass,t0,v0,t1,v1,t2,v2,t3,v3,t4,v4,t5,v5) \ + wxConstructorBridge_6 constructor##klass ; \ + wxConstructorBridge* klass::ms_constructor = &constructor##klass ; \ + const wxChar *klass::ms_constructorProperties[] = { wxT(#v0) , wxT(#v1) , wxT(#v2) , wxT(#v3) , wxT(#v4) , wxT(#v5) } ; \ + const int klass::ms_constructorPropertiesCount = 6; + +// direct constructor version + +template +struct wxDirectConstructorBridge_6 : public wxDirectConstructorBrigde +{ + void Create(wxObject * &o, wxxVariant *args) + { + o = new Class( + args[0].wxTEMPLATED_MEMBER_CALL(Get , T0) , + args[1].wxTEMPLATED_MEMBER_CALL(Get , T1) , + args[2].wxTEMPLATED_MEMBER_CALL(Get , T2) , + args[3].wxTEMPLATED_MEMBER_CALL(Get , T3) , + args[4].wxTEMPLATED_MEMBER_CALL(Get , T4) , + args[5].wxTEMPLATED_MEMBER_CALL(Get , T5) + ); + } +}; + +#define wxDIRECT_CONSTRUCTOR_6(klass,t0,v0,t1,v1,t2,v2,t3,v3,t4,v4,t5,v5) \ + wxDirectConstructorBridge_6 constructor##klass ; \ + wxConstructorBridge* klass::ms_constructor = &constructor##klass ; \ + const wxChar *klass::ms_constructorProperties[] = { wxT(#v0) , wxT(#v1) , wxT(#v2) , wxT(#v3) , wxT(#v4) , wxT(#v5) } ; \ + const int klass::ms_constructorPropertiesCount = 6; + +// 7 params + +template +struct wxConstructorBridge_7 : public wxConstructorBridge +{ + void Create(wxObject * &o, wxxVariant *args) + { + Class *obj = dynamic_cast(o); + obj->Create( + args[0].wxTEMPLATED_MEMBER_CALL(Get , T0) , + args[1].wxTEMPLATED_MEMBER_CALL(Get , T1) , + args[2].wxTEMPLATED_MEMBER_CALL(Get , T2) , + args[3].wxTEMPLATED_MEMBER_CALL(Get , T3) , + args[4].wxTEMPLATED_MEMBER_CALL(Get , T4) , + args[5].wxTEMPLATED_MEMBER_CALL(Get , T5) , + args[6].wxTEMPLATED_MEMBER_CALL(Get , T6) + ); + } +}; + +#define wxCONSTRUCTOR_7(klass,t0,v0,t1,v1,t2,v2,t3,v3,t4,v4,t5,v5,t6,v6) \ + wxConstructorBridge_7 constructor##klass ; \ + wxConstructorBridge* klass::ms_constructor = &constructor##klass ; \ + const wxChar *klass::ms_constructorProperties[] = { wxT(#v0) , wxT(#v1) , wxT(#v2) , wxT(#v3) , wxT(#v4) , wxT(#v5) , wxT(#v6) } ; \ + const int klass::ms_constructorPropertiesCount = 7; + +// 8 params + +template +struct wxConstructorBridge_8 : public wxConstructorBridge +{ + void Create(wxObject * &o, wxxVariant *args) + { + Class *obj = dynamic_cast(o); + obj->Create( + args[0].wxTEMPLATED_MEMBER_CALL(Get , T0) , + args[1].wxTEMPLATED_MEMBER_CALL(Get , T1) , + args[2].wxTEMPLATED_MEMBER_CALL(Get , T2) , + args[3].wxTEMPLATED_MEMBER_CALL(Get , T3) , + args[4].wxTEMPLATED_MEMBER_CALL(Get , T4) , + args[5].wxTEMPLATED_MEMBER_CALL(Get , T5) , + args[6].wxTEMPLATED_MEMBER_CALL(Get , T6) , + args[7].wxTEMPLATED_MEMBER_CALL(Get , T7) + ); + } +}; + +#define wxCONSTRUCTOR_8(klass,t0,v0,t1,v1,t2,v2,t3,v3,t4,v4,t5,v5,t6,v6,t7,v7) \ + wxConstructorBridge_8 constructor##klass ; \ + wxConstructorBridge* klass::ms_constructor = &constructor##klass ; \ + const wxChar *klass::ms_constructorProperties[] = { wxT(#v0) , wxT(#v1) , wxT(#v2) , wxT(#v3) , wxT(#v4) , wxT(#v5) , wxT(#v6) , wxT(#v7) } ; \ + const int klass::ms_constructorPropertiesCount = 8; +// ---------------------------------------------------------------------------- +// wxClassInfo +// ---------------------------------------------------------------------------- + +typedef wxObject *(*wxObjectConstructorFn)(void); +typedef wxObject* (*wxVariantToObjectConverter)( wxxVariant &data ) ; +typedef wxxVariant (*wxObjectToVariantConverter)( wxObject* ) ; + +class WXDLLIMPEXP_BASE wxWriter; +class WXDLLIMPEXP_BASE wxPersister; + +typedef bool (*wxObjectStreamingCallback) ( const wxObject *, wxWriter * , wxPersister * , wxxVariantArray & ) ; + +class WXDLLIMPEXP_BASE wxClassInfo +{ + friend class WXDLLIMPEXP_BASE wxPropertyInfo ; + friend class WXDLLIMPEXP_BASE wxHandlerInfo ; +public: + wxClassInfo(const wxClassInfo **_Parents, + const wxChar *_UnitName, + const wxChar *_ClassName, + int size, + wxObjectConstructorFn ctor , + wxPropertyInfo *_Props , + wxHandlerInfo *_Handlers , + wxConstructorBridge* _Constructor , + const wxChar ** _ConstructorProperties , + const int _ConstructorPropertiesCount , + wxVariantToObjectConverter _PtrConverter1 , + wxVariantToObjectConverter _Converter2 , + wxObjectToVariantConverter _Converter3 , + wxObjectStreamingCallback _streamingCallback = NULL + ) : + + m_className(_ClassName), + m_objectSize(size), + m_objectConstructor(ctor), + m_next(sm_first), + m_firstProperty(_Props), + m_firstHandler(_Handlers), + m_parents(_Parents), + m_unitName(_UnitName), + m_constructor(_Constructor), + m_constructorProperties(_ConstructorProperties), + m_constructorPropertiesCount(_ConstructorPropertiesCount), + m_variantOfPtrToObjectConverter(_PtrConverter1), + m_variantToObjectConverter(_Converter2), + m_objectToVariantConverter(_Converter3), + m_streamingCallback(_streamingCallback) + { + sm_first = this; + Register() ; + } + + wxClassInfo(const wxChar *_UnitName, const wxChar *_ClassName, + const wxClassInfo **_Parents) : + m_className(_ClassName), + m_objectSize(0), + m_objectConstructor(NULL), + m_next(sm_first), + m_firstProperty(NULL), + m_firstHandler(NULL), + m_parents(_Parents), + m_unitName(_UnitName), + m_constructor(NULL), + m_constructorProperties(NULL), + m_constructorPropertiesCount(0), + m_variantOfPtrToObjectConverter(NULL), + m_variantToObjectConverter(NULL), + m_objectToVariantConverter(NULL), + m_streamingCallback(NULL) + { + sm_first = this; + Register() ; + } + + virtual ~wxClassInfo() ; + + // allocates an instance of this class, this object does not have to be initialized or fully constructed + // as this call will be followed by a call to Create + virtual wxObject *AllocateObject() const { return m_objectConstructor ? (*m_objectConstructor)() : 0; } + + // 'old naming' for AllocateObject staying here for backward compatibility + wxObject *CreateObject() const { return AllocateObject() ; } + + // direct construction call for classes that cannot construct instances via alloc/create + wxObject *ConstructObject(int ParamCount, wxxVariant *Params) const + { + if ( ParamCount != m_constructorPropertiesCount ) + { + wxLogError( _("Illegal Parameter Count for ConstructObject Method") ) ; + return NULL ; + } + wxObject *object = NULL ; + m_constructor->Create( object , Params ) ; + return object ; + } + + bool NeedsDirectConstruction() const { return dynamic_cast( m_constructor) != NULL ; } + + const wxChar *GetClassName() const { return m_className; } + const wxChar *GetBaseClassName1() const + { return m_parents[0] ? m_parents[0]->GetClassName() : NULL; } + const wxChar *GetBaseClassName2() const + { return (m_parents[0] && m_parents[1]) ? m_parents[1]->GetClassName() : NULL; } + const wxChar *GetIncludeName() const { return m_unitName ; } + const wxClassInfo **GetParents() const { return m_parents; } + int GetSize() const { return m_objectSize; } + bool IsDynamic() const { return (NULL != m_objectConstructor); } + + wxObjectConstructorFn GetConstructor() const { return m_objectConstructor; } + static const wxClassInfo *GetFirst() { return sm_first; } + const wxClassInfo *GetNext() const { return m_next; } + static wxClassInfo *FindClass(const wxChar *className); + + // Climb upwards through inheritance hierarchy. + // Dual inheritance is catered for. + + bool IsKindOf(const wxClassInfo *info) const + { + if ( info != 0 ) + { + if ( info == this ) + return true ; + + for ( int i = 0 ; m_parents[i] ; ++ i ) + { + if ( m_parents[i]->IsKindOf( info ) ) + return true ; + } + } + return false ; + } + + // if there is a callback registered with that class it will be called + // before this object will be written to disk, it can veto streaming out + // this object by returning false, if this class has not registered a + // callback, the search will go up the inheritance tree if no callback has + // been registered true will be returned by default + bool BeforeWriteObject( const wxObject *obj, wxWriter *streamer , wxPersister *persister , wxxVariantArray &metadata) const ; + + // gets the streaming callback from this class or any superclass + wxObjectStreamingCallback GetStreamingCallback() const ; + +#if WXWIN_COMPATIBILITY_2_4 + // Initializes parent pointers and hash table for fast searching. + wxDEPRECATED( static void InitializeClasses() ); + // Cleans up hash table used for fast searching. + wxDEPRECATED( static void CleanUpClasses() ); +#endif + static void CleanUp(); + + // returns the first property + const wxPropertyInfo* GetFirstProperty() const { return m_firstProperty ; } + + // returns the first handler + const wxHandlerInfo* GetFirstHandler() const { return m_firstHandler ; } + + // Call the Create upon an instance of the class, in the end the object is fully + // initialized + virtual void Create (wxObject *object, int ParamCount, wxxVariant *Params) const + { + if ( ParamCount != m_constructorPropertiesCount ) + { + wxLogError( _("Illegal Parameter Count for Create Method") ) ; + return ; + } + m_constructor->Create( object , Params ) ; + } + + // get number of parameters for constructor + virtual int GetCreateParamCount() const { return m_constructorPropertiesCount; } + + // get n-th constructor parameter + virtual const wxChar* GetCreateParamName(int n) const { return m_constructorProperties[n] ; } + + // Runtime access to objects for simple properties (get/set) by property name, and variant data + virtual void SetProperty (wxObject *object, const wxChar *propertyName, const wxxVariant &value) const ; + virtual wxxVariant GetProperty (wxObject *object, const wxChar *propertyName) const; + + // Runtime access to objects for collection properties by property name + virtual wxxVariantArray GetPropertyCollection(wxObject *object, const wxChar *propertyName) const ; + virtual void AddToPropertyCollection(wxObject *object, const wxChar *propertyName , const wxxVariant& value) const ; + + // we must be able to cast variants to wxObject pointers, templates seem not to be suitable + wxObject* VariantToInstance( wxxVariant &data ) const + { + if ( data.GetTypeInfo()->GetKind() == wxT_OBJECT ) + return m_variantToObjectConverter( data ) ; + else + return m_variantOfPtrToObjectConverter( data ) ; + } + + wxxVariant InstanceToVariant( wxObject *object ) const { return m_objectToVariantConverter( object ) ; } + + // find property by name + virtual const wxPropertyInfo *FindPropertyInfo (const wxChar *PropertyName) const ; + + // find handler by name + virtual const wxHandlerInfo *FindHandlerInfo (const wxChar *PropertyName) const ; + + // find property by name + virtual wxPropertyInfo *FindPropertyInfoInThisClass (const wxChar *PropertyName) const ; + + // find handler by name + virtual wxHandlerInfo *FindHandlerInfoInThisClass (const wxChar *PropertyName) const ; + + // puts all the properties of this class and its superclasses in the map, as long as there is not yet + // an entry with the same name (overriding mechanism) + void GetProperties( wxPropertyInfoMap &map ) const ; +public: + const wxChar *m_className; + int m_objectSize; + wxObjectConstructorFn m_objectConstructor; + + // class info object live in a linked list: + // pointers to its head and the next element in it + + static wxClassInfo *sm_first; + wxClassInfo *m_next; + + // FIXME: this should be private (currently used directly by way too + // many clients) + static wxHashTable *sm_classTable; + +protected : + wxPropertyInfo * m_firstProperty ; + wxHandlerInfo * m_firstHandler ; +private: + const wxClassInfo** m_parents ; + const wxChar* m_unitName; + + wxConstructorBridge* m_constructor ; + const wxChar ** m_constructorProperties ; + const int m_constructorPropertiesCount ; + wxVariantToObjectConverter m_variantOfPtrToObjectConverter ; + wxVariantToObjectConverter m_variantToObjectConverter ; + wxObjectToVariantConverter m_objectToVariantConverter ; + wxObjectStreamingCallback m_streamingCallback ; + const wxPropertyAccessor *FindAccessor (const wxChar *propertyName) const ; + + + // InitializeClasses() helper + static wxClassInfo *GetBaseByName(const wxChar *name) ; + +protected: + // registers the class + void Register(); + void Unregister(); + + DECLARE_NO_COPY_CLASS(wxClassInfo) +}; + + +WXDLLIMPEXP_BASE wxObject *wxCreateDynamicObject(const wxChar *name); + +// ---------------------------------------------------------------------------- +// wxDynamicObject +// ---------------------------------------------------------------------------- +// +// this object leads to having a pure runtime-instantiation + +class WXDLLIMPEXP_BASE wxDynamicClassInfo : public wxClassInfo +{ + friend class WXDLLIMPEXP_BASE wxDynamicObject ; +public : + wxDynamicClassInfo( const wxChar *_UnitName, const wxChar *_ClassName , const wxClassInfo* superClass ) ; + virtual ~wxDynamicClassInfo() ; + + // constructs a wxDynamicObject with an instance + virtual wxObject *AllocateObject() const ; + + // Call the Create method for a class + virtual void Create (wxObject *object, int ParamCount, wxxVariant *Params) const ; + + // get number of parameters for constructor + virtual int GetCreateParamCount() const ; + + // get i-th constructor parameter + virtual const wxChar* GetCreateParamName(int i) const ; + + // Runtime access to objects by property name, and variant data + virtual void SetProperty (wxObject *object, const wxChar *PropertyName, const wxxVariant &Value) const ; + virtual wxxVariant GetProperty (wxObject *object, const wxChar *PropertyName) const ; + + // adds a property to this class at runtime + void AddProperty( const wxChar *propertyName , const wxTypeInfo* typeInfo ) ; + + // removes an existing runtime-property + void RemoveProperty( const wxChar *propertyName ) ; + + // renames an existing runtime-property + void RenameProperty( const wxChar *oldPropertyName , const wxChar *newPropertyName ) ; + + // as a handler to this class at runtime + void AddHandler( const wxChar *handlerName , wxObjectEventFunction address , const wxClassInfo* eventClassInfo ) ; + + // removes an existing runtime-handler + void RemoveHandler( const wxChar *handlerName ) ; + + // renames an existing runtime-handler + void RenameHandler( const wxChar *oldHandlerName , const wxChar *newHandlerName ) ; +private : + struct wxDynamicClassInfoInternal ; + wxDynamicClassInfoInternal* m_data ; +} ; + +// ---------------------------------------------------------------------------- +// Dynamic class macros +// ---------------------------------------------------------------------------- + +#define _DECLARE_DYNAMIC_CLASS(name) \ + public: \ + static wxClassInfo ms_classInfo; \ + static const wxClassInfo* ms_classParents[] ; \ + static wxPropertyInfo* GetPropertiesStatic() ; \ + static wxHandlerInfo* GetHandlersStatic() ; \ + static wxClassInfo *GetClassInfoStatic() \ +{ return &name::ms_classInfo; } \ + virtual wxClassInfo *GetClassInfo() const \ +{ return &name::ms_classInfo; } + +/* +#define _DECLARE_DYNAMIC_CLASS(name) \ + public: \ + static wxClassInfo ms_class##name; \ + static const wxClassInfo* ms_classParents##name[] ; \ + static wxPropertyInfo* GetPropertiesStatic() ; \ + static wxHandlerInfo* GetHandlersStatic() ; \ + static wxClassInfo *GetClassInfoStatic() \ +{ return &name::ms_class##name; } \ + virtual wxClassInfo *GetClassInfo() const \ +{ return &name::ms_class##name; } +*/ +#define DECLARE_DYNAMIC_CLASS(name) \ + static wxConstructorBridge* ms_constructor ; \ + static const wxChar * ms_constructorProperties[] ; \ + static const int ms_constructorPropertiesCount ; \ + _DECLARE_DYNAMIC_CLASS(name) + +#define DECLARE_DYNAMIC_CLASS_NO_ASSIGN(name) \ + DECLARE_NO_ASSIGN_CLASS(name) \ + DECLARE_DYNAMIC_CLASS(name) + +#define DECLARE_DYNAMIC_CLASS_NO_COPY(name) \ + DECLARE_NO_COPY_CLASS(name) \ + DECLARE_DYNAMIC_CLASS(name) + +#define DECLARE_ABSTRACT_CLASS(name) _DECLARE_DYNAMIC_CLASS(name) +#define DECLARE_CLASS(name) DECLARE_DYNAMIC_CLASS(name) + +// ----------------------------------- +// for concrete classes +// ----------------------------------- + +// Single inheritance with one base class + +#define _TYPEINFO_CLASSES(n , toString , fromString ) \ + wxClassTypeInfo s_typeInfo##n(wxT_OBJECT , &n::ms_classInfo , toString , fromString , typeid(n).name()) ; \ + wxClassTypeInfo s_typeInfoPtr##n(wxT_OBJECT_PTR , &n::ms_classInfo , toString , fromString , typeid(n*).name()) ; + +#define _IMPLEMENT_DYNAMIC_CLASS(name, basename, unit , callback) \ + wxObject* wxConstructorFor##name() \ +{ return new name; } \ + const wxClassInfo* name::ms_classParents[] = { &basename::ms_classInfo ,NULL } ; \ + wxObject* wxVariantOfPtrToObjectConverter##name ( wxxVariant &data ) { return data.wxTEMPLATED_MEMBER_CALL(Get , name*) ; } \ + wxxVariant wxObjectToVariantConverter##name ( wxObject *data ) { return wxxVariant( dynamic_cast (data) ) ; } \ + wxClassInfo name::ms_classInfo(name::ms_classParents , wxT(unit) , wxT(#name), \ + (int) sizeof(name), \ + (wxObjectConstructorFn) wxConstructorFor##name , \ + name::GetPropertiesStatic(),name::GetHandlersStatic(),name::ms_constructor , name::ms_constructorProperties , \ + name::ms_constructorPropertiesCount , wxVariantOfPtrToObjectConverter##name , NULL , wxObjectToVariantConverter##name , callback); + +#define _IMPLEMENT_DYNAMIC_CLASS_WITH_COPY(name, basename, unit, callback ) \ + wxObject* wxConstructorFor##name() \ +{ return new name; } \ + const wxClassInfo* name::ms_classParents[] = { &basename::ms_classInfo ,NULL } ; \ + wxObject* wxVariantToObjectConverter##name ( wxxVariant &data ) { return &data.wxTEMPLATED_MEMBER_CALL(Get , name) ; } \ + wxObject* wxVariantOfPtrToObjectConverter##name ( wxxVariant &data ) { return data.wxTEMPLATED_MEMBER_CALL(Get , name*) ; } \ + wxxVariant wxObjectToVariantConverter##name ( wxObject *data ) { return wxxVariant( dynamic_cast (data) ) ; } \ + wxClassInfo name::ms_classInfo(name::ms_classParents , wxT(unit) , wxT(#name), \ + (int) sizeof(name), \ + (wxObjectConstructorFn) wxConstructorFor##name , \ + name::GetPropertiesStatic(),name::GetHandlersStatic(),name::ms_constructor , name::ms_constructorProperties, \ + name::ms_constructorPropertiesCount , wxVariantOfPtrToObjectConverter##name , wxVariantToObjectConverter##name , wxObjectToVariantConverter##name, callback); + +#define IMPLEMENT_DYNAMIC_CLASS_WITH_COPY( name , basename ) \ + _IMPLEMENT_DYNAMIC_CLASS_WITH_COPY( name , basename , "" , NULL ) \ + _TYPEINFO_CLASSES(name, NULL , NULL) \ + const wxPropertyInfo *name::GetPropertiesStatic() { return (wxPropertyInfo*) NULL ; } \ + const wxHandlerInfo *name::GetHandlersStatic() { return (wxHandlerInfo*) NULL ; } \ + wxCONSTRUCTOR_DUMMY( name ) + +#define IMPLEMENT_DYNAMIC_CLASS( name , basename ) \ + _IMPLEMENT_DYNAMIC_CLASS( name , basename , "" , NULL ) \ + _TYPEINFO_CLASSES(name, NULL , NULL) \ + wxPropertyInfo *name::GetPropertiesStatic() { return (wxPropertyInfo*) NULL ; } \ + wxHandlerInfo *name::GetHandlersStatic() { return (wxHandlerInfo*) NULL ; } \ + wxCONSTRUCTOR_DUMMY( name ) + +#define IMPLEMENT_DYNAMIC_CLASS_XTI( name , basename , unit ) \ + _IMPLEMENT_DYNAMIC_CLASS( name , basename , unit , NULL ) \ + _TYPEINFO_CLASSES(name, NULL , NULL) + +#define IMPLEMENT_DYNAMIC_CLASS_XTI_CALLBACK( name , basename , unit , callback ) \ + _IMPLEMENT_DYNAMIC_CLASS( name , basename , unit , &callback ) \ + _TYPEINFO_CLASSES(name, NULL , NULL) + +#define IMPLEMENT_DYNAMIC_CLASS_WITH_COPY_XTI( name , basename , unit ) \ + _IMPLEMENT_DYNAMIC_CLASS_WITH_COPY( name , basename , unit , NULL ) \ + _TYPEINFO_CLASSES(name, NULL , NULL) + +#define IMPLEMENT_DYNAMIC_CLASS_WITH_COPY_AND_STREAMERS_XTI( name , basename , unit , toString , fromString ) \ + _IMPLEMENT_DYNAMIC_CLASS_WITH_COPY( name , basename , unit , NULL ) \ + _TYPEINFO_CLASSES(name, toString , fromString) + +// this is for classes that do not derive from wxobject, there are no creators for these + +#define IMPLEMENT_DYNAMIC_CLASS_NO_WXOBJECT_NO_BASE_XTI( name , unit ) \ + const wxClassInfo* name::ms_classParents[] = { NULL } ; \ + wxClassInfo name::ms_classInfo(name::ms_classParents , wxEmptyString , wxT(#name), \ + (int) sizeof(name), \ + (wxObjectConstructorFn) 0 , \ + name::GetPropertiesStatic(),name::GetHandlersStatic(),0 , 0 , \ + 0 , 0 , 0 ); \ + _TYPEINFO_CLASSES(name, NULL , NULL) + +// this is for subclasses that still do not derive from wxobject + +#define IMPLEMENT_DYNAMIC_CLASS_NO_WXOBJECT_XTI( name , basename, unit ) \ + const wxClassInfo* name::ms_classParents[] = { &basename::ms_classInfo ,NULL } ; \ + wxClassInfo name::ms_classInfo(name::ms_classParents , wxEmptyString , wxT(#name), \ + (int) sizeof(name), \ + (wxObjectConstructorFn) 0 , \ + name::GetPropertiesStatic(),name::GetHandlersStatic(),0 , 0 , \ + 0 , 0 , 0 ); \ + _TYPEINFO_CLASSES(name, NULL , NULL) + + +// Multiple inheritance with two base classes + +#define _IMPLEMENT_DYNAMIC_CLASS2(name, basename, basename2, unit) \ + wxObject* wxConstructorFor##name() \ +{ return new name; } \ + const wxClassInfo* name::ms_classParents[] = { &basename::ms_classInfo ,&basename2::ms_classInfo , NULL } ; \ + wxObject* wxVariantToObjectConverter##name ( wxxVariant &data ) { return data.wxTEMPLATED_MEMBER_CALL(Get , name*) ; } \ + wxxVariant wxObjectToVariantConverter##name ( wxObject *data ) { return wxxVariant( dynamic_cast (data) ) ; } \ + wxClassInfo name::ms_classInfo(name::ms_classParents , wxT(unit) , wxT(#name), \ + (int) sizeof(name), \ + (wxObjectConstructorFn) wxConstructorFor##name , \ + name::GetPropertiesStatic(),name::GetHandlersStatic(),name::ms_constructor , name::ms_constructorProperties , \ + name::ms_constructorPropertiesCount , wxVariantToObjectConverter##name , wxObjectToVariantConverter##name); \ + +#define IMPLEMENT_DYNAMIC_CLASS2( name , basename , basename2) \ + _IMPLEMENT_DYNAMIC_CLASS2( name , basename , basename2 , "") \ + _TYPEINFO_CLASSES(name, NULL , NULL) \ + wxPropertyInfo *name::GetPropertiesStatic() { return (wxPropertyInfo*) NULL ; } \ + wxHandlerInfo *name::GetHandlersStatic() { return (wxHandlerInfo*) NULL ; } \ + wxCONSTRUCTOR_DUMMY( name ) + +#define IMPLEMENT_DYNAMIC_CLASS2_XTI( name , basename , basename2, unit) \ + _IMPLEMENT_DYNAMIC_CLASS2( name , basename , basename2 , unit) \ + _TYPEINFO_CLASSES(name, NULL , NULL) + + +// ----------------------------------- +// for abstract classes +// ----------------------------------- + +// Single inheritance with one base class + +#define _IMPLEMENT_ABSTRACT_CLASS(name, basename) \ + const wxClassInfo* name::ms_classParents[] = { &basename::ms_classInfo ,NULL } ; \ + wxObject* wxVariantToObjectConverter##name ( wxxVariant &data ) { return data.wxTEMPLATED_MEMBER_CALL(Get , name*) ; } \ + wxObject* wxVariantOfPtrToObjectConverter##name ( wxxVariant &data ) { return data.wxTEMPLATED_MEMBER_CALL(Get , name*) ; } \ + wxxVariant wxObjectToVariantConverter##name ( wxObject *data ) { return wxxVariant( dynamic_cast (data) ) ; } \ + wxClassInfo name::ms_classInfo(name::ms_classParents , wxEmptyString , wxT(#name), \ + (int) sizeof(name), \ + (wxObjectConstructorFn) 0 , \ + name::GetPropertiesStatic(),name::GetHandlersStatic(),0 , 0 , \ + 0 , wxVariantOfPtrToObjectConverter##name ,wxVariantToObjectConverter##name , wxObjectToVariantConverter##name); \ + _TYPEINFO_CLASSES(name, NULL , NULL) + +#define IMPLEMENT_ABSTRACT_CLASS( name , basename ) \ + _IMPLEMENT_ABSTRACT_CLASS( name , basename ) \ + wxHandlerInfo *name::GetHandlersStatic() { return (wxHandlerInfo*) NULL ; } \ + wxPropertyInfo *name::GetPropertiesStatic() { return (wxPropertyInfo*) NULL ; } + +// Multiple inheritance with two base classes + +#define IMPLEMENT_ABSTRACT_CLASS2(name, basename1, basename2) \ + wxClassInfo name::ms_classInfo(wxT(#name), wxT(#basename1), \ + wxT(#basename2), (int) sizeof(name), \ + (wxObjectConstructorFn) 0); + +#define IMPLEMENT_CLASS IMPLEMENT_ABSTRACT_CLASS +#define IMPLEMENT_CLASS2 IMPLEMENT_ABSTRACT_CLASS2 + +#define wxBEGIN_EVENT_TABLE( a , b ) BEGIN_EVENT_TABLE( a , b ) +#define wxEND_EVENT_TABLE() END_EVENT_TABLE() + +// -------------------------------------------------------------------------- +// Collection Support +// -------------------------------------------------------------------------- + +template void wxListCollectionToVariantArray( const collection_t& coll , wxxVariantArray &value ) +{ + iter current = coll.GetFirst() ; + while (current) + { + value.Add( new wxxVariant(current->GetData()) ) ; + current = current->GetNext(); + } +} + +template void wxArrayCollectionToVariantArray( const collection_t& coll , wxxVariantArray &value ) +{ + for( size_t i = 0 ; i < coll.GetCount() ; i++ ) + { + value.Add( new wxxVariant(coll[i]) ) ; + } +} + + +#endif // _WX_XTIH__ diff --git a/Externals/wxWidgets/include/wx/xtistrm.h b/Externals/wxWidgets/include/wx/xtistrm.h new file mode 100644 index 0000000000..9d8901a818 --- /dev/null +++ b/Externals/wxWidgets/include/wx/xtistrm.h @@ -0,0 +1,429 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xtistrm.h +// Purpose: streaming runtime metadata information (extended class info) +// Author: Stefan Csomor +// Modified by: +// Created: 27/07/03 +// RCS-ID: $Id: xtistrm.h 41020 2006-09-05 20:47:48Z VZ $ +// Copyright: (c) 2003 Stefan Csomor +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XTISTRMH__ +#define _WX_XTISTRMH__ + +#include "wx/wx.h" + +#if wxUSE_EXTENDED_RTTI + +const int wxInvalidObjectID = -2 ; +const int wxNullObjectID = -3 ; + +// Filer contains the interfaces for streaming objects in and out of XML, +// rendering them either to objects in memory, or to code. Note: We +// consider the process of generating code to be one of *depersisting* the +// object from xml, *not* of persisting the object to code from an object +// in memory. This distincation can be confusing, and should be kept +// in mind when looking at the property streamers and callback interfaces +// listed below. + +/* +Main interfaces for streaming out objects. +*/ + +// ---------------------------------------------------------------------------- +// wxPersister +// +// This class will be asked during the streaming-out process about every single +// property or object instance. It can veto streaming out by returning false +// or modify the value before it is streamed-out. +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxWriter ; +class WXDLLIMPEXP_BASE wxReader ; + +class WXDLLIMPEXP_BASE wxPersister +{ +public : + // will be called before an object is written, may veto by returning false + virtual bool BeforeWriteObject( wxWriter *WXUNUSED(writer) , const wxObject *WXUNUSED(object) , const wxClassInfo *WXUNUSED(classInfo) , wxxVariantArray &WXUNUSED(metadata)) { return true ; } + + // will be called after this object has been written, may be needed for adjusting stacks + virtual void AfterWriteObject( wxWriter *WXUNUSED(writer) , const wxObject *WXUNUSED(object) , const wxClassInfo *WXUNUSED(classInfo) ) {} + + // will be called before a property gets written, may change the value , eg replace a concrete wxSize by wxSize( wxDefaultCoord , wxDefaultCoord ) or veto + // writing that property at all by returning false + virtual bool BeforeWriteProperty( wxWriter *WXUNUSED(writer) , const wxObject *WXUNUSED(object), const wxPropertyInfo *WXUNUSED(propInfo) , wxxVariant &WXUNUSED(value) ) { return true ; } + + // will be called before a property gets written, may change the value , eg replace a concrete wxSize by wxSize( wxDefaultCoord , wxDefaultCoord ) or veto + // writing that property at all by returning false + virtual bool BeforeWriteProperty( wxWriter *WXUNUSED(writer) , const wxObject *WXUNUSED(object), const wxPropertyInfo *WXUNUSED(propInfo) , wxxVariantArray &WXUNUSED(value) ) { return true ; } + + // will be called after a property has been written out, may be needed for adjusting stacks + virtual void AfterWriteProperty( wxWriter *WXUNUSED(writer) , const wxPropertyInfo *WXUNUSED(propInfo) ) {} + + // will be called before this delegate gets written + virtual bool BeforeWriteDelegate( wxWriter *WXUNUSED(writer) , const wxObject *WXUNUSED(object), const wxClassInfo* WXUNUSED(classInfo) , const wxPropertyInfo *WXUNUSED(propInfo) , + const wxObject *&WXUNUSED(eventSink) , const wxHandlerInfo* &WXUNUSED(handlerInfo) ) { return true ; } + + virtual void AfterWriteDelegate( wxWriter *WXUNUSED(writer) , const wxObject *WXUNUSED(object), const wxClassInfo* WXUNUSED(classInfo) , const wxPropertyInfo *WXUNUSED(propInfo) , + const wxObject *&WXUNUSED(eventSink) , const wxHandlerInfo* &WXUNUSED(handlerInfo) ) { } +} ; + +class WXDLLIMPEXP_BASE wxWriter : public wxObject +{ +public : + wxWriter() ; + virtual ~wxWriter() ; + + // with this call you start writing out a new top-level object + void WriteObject(const wxObject *object, const wxClassInfo *classInfo , wxPersister *persister , const wxString &name , wxxVariantArray &WXUNUSED(metadata)) ; + + // + // Managing the object identity table a.k.a context + // + // these methods make sure that no object gets written twice, because sometimes multiple calls to the WriteObject will be + // made without wanting to have duplicate objects written, the object identity table will be reset manually + + virtual void ClearObjectContext() ; + + // gets the object Id for a passed in object in the context + int GetObjectID(const wxObject *obj) ; + + // returns true if this object has already been written in this context + bool IsObjectKnown( const wxObject *obj ) ; + + // + // streaming callbacks + // + // these callbacks really write out the values in the stream format + + // begins writing out a new toplevel entry which has the indicated unique name + virtual void DoBeginWriteTopLevelEntry( const wxString &name ) = 0 ; + + // ends writing out a new toplevel entry which has the indicated unique name + virtual void DoEndWriteTopLevelEntry( const wxString &name ) = 0 ; + + // start of writing an object having the passed in ID + virtual void DoBeginWriteObject(const wxObject *object, const wxClassInfo *classInfo, int objectID , wxxVariantArray &metadata ) = 0 ; + + // end of writing an toplevel object name param is used for unique identification within the container + virtual void DoEndWriteObject(const wxObject *object, const wxClassInfo *classInfo, int objectID ) = 0 ; + + // writes a simple property in the stream format + virtual void DoWriteSimpleType( wxxVariant &value ) = 0 ; + + // start of writing a complex property into the stream ( + virtual void DoBeginWriteProperty( const wxPropertyInfo *propInfo ) = 0 ; + + // end of writing a complex property into the stream + virtual void DoEndWriteProperty( const wxPropertyInfo *propInfo ) = 0; + + virtual void DoBeginWriteElement() = 0 ; + virtual void DoEndWriteElement() = 0 ; + // insert an object reference to an already written object + virtual void DoWriteRepeatedObject( int objectID ) = 0 ; + + // insert a null reference + virtual void DoWriteNullObject() = 0 ; + + // writes a delegate in the stream format + virtual void DoWriteDelegate( const wxObject *object, const wxClassInfo* classInfo , const wxPropertyInfo *propInfo , + const wxObject *eventSink , int sinkObjectID , const wxClassInfo* eventSinkClassInfo , const wxHandlerInfo* handlerIndo ) = 0; +private : + + struct wxWriterInternal ; + wxWriterInternal* m_data ; + + struct wxWriterInternalPropertiesData ; + + void WriteAllProperties( const wxObject * obj , const wxClassInfo* ci , wxPersister *persister, wxWriterInternalPropertiesData * data ) ; + void WriteOneProperty( const wxObject *obj , const wxClassInfo* ci , const wxPropertyInfo* pi , wxPersister *persister , wxWriterInternalPropertiesData *data ) ; + void WriteObject(const wxObject *object, const wxClassInfo *classInfo , wxPersister *persister , bool isEmbedded, wxxVariantArray &metadata ) ; + void FindConnectEntry(const wxEvtHandler * evSource,const wxDelegateTypeInfo* dti, const wxObject* &sink , const wxHandlerInfo *&handler) ; +} ; + + +/* +Streaming callbacks for depersisting XML to code, or running objects +*/ + +class WXDLLIMPEXP_BASE wxDepersister ; + +/* +wxReader handles streaming in a class from a arbitrary format. While walking through +it issues calls out to interfaces to depersist the guts from the underlying storage format. +*/ + +class WXDLLIMPEXP_BASE wxReader : public wxObject +{ +public : + wxReader() ; + virtual ~wxReader() ; + + // the only thing wxReader knows about is the class info by object ID + wxClassInfo *GetObjectClassInfo(int objectID) ; + bool HasObjectClassInfo( int objectID ) ; + void SetObjectClassInfo(int objectID, wxClassInfo* classInfo); + + // Reads the component the reader is pointed at from the underlying format. + // The return value is the root object ID, which can + // then be used to ask the depersister about that object + // if there was a problem you will get back wxInvalidObjectID and the current + // error log will carry the problems encoutered + virtual int ReadObject( const wxString &name , wxDepersister *depersist ) = 0 ; + +private : + struct wxReaderInternal; + wxReaderInternal *m_data; +} ; + +// This abstract class matches the allocate-init/create model of creation of objects. +// At runtime, these will create actual instances, and manipulate them. +// When generating code, these will just create statements of C++ +// code to create the objects. + +class WXDLLIMPEXP_BASE wxDepersister +{ +public : + // allocate the new object on the heap, that object will have the passed in ID + virtual void AllocateObject(int objectID, wxClassInfo *classInfo, wxxVariantArray &metadata) = 0; + + // initialize the already allocated object having the ID objectID with the Create method + // creation parameters which are objects are having their Ids passed in objectIDValues + // having objectId <> wxInvalidObjectID + + virtual void CreateObject(int objectID, + const wxClassInfo *classInfo, + int paramCount, + wxxVariant *VariantValues , + int *objectIDValues , + const wxClassInfo **objectClassInfos , + wxxVariantArray &metadata) = 0; + + // construct the new object on the heap, that object will have the passed in ID (for objects that + // don't support allocate-create type of creation) + // creation parameters which are objects are having their Ids passed in objectIDValues + // having objectId <> wxInvalidObjectID + + virtual void ConstructObject(int objectID, + const wxClassInfo *classInfo, + int paramCount, + wxxVariant *VariantValues , + int *objectIDValues , + const wxClassInfo **objectClassInfos , + wxxVariantArray &metadata) = 0; + + // destroy the heap-allocated object having the ID objectID, this may be used if an object + // is embedded in another object and set via value semantics, so the intermediate + // object can be destroyed after safely + virtual void DestroyObject(int objectID, wxClassInfo *classInfo) = 0; + + // set the corresponding property + virtual void SetProperty(int objectID, + const wxClassInfo *classInfo, + const wxPropertyInfo* propertyInfo , + const wxxVariant &VariantValue) = 0; + + // sets the corresponding property (value is an object) + virtual void SetPropertyAsObject(int objectID, + const wxClassInfo *classInfo, + const wxPropertyInfo* propertyInfo , + int valueObjectId) = 0; + + // adds an element to a property collection + virtual void AddToPropertyCollection( int objectID , + const wxClassInfo *classInfo, + const wxPropertyInfo* propertyInfo , + const wxxVariant &VariantValue) = 0; + + // sets the corresponding property (value is an object) + virtual void AddToPropertyCollectionAsObject(int objectID, + const wxClassInfo *classInfo, + const wxPropertyInfo* propertyInfo , + int valueObjectId) = 0; + + // sets the corresponding event handler + virtual void SetConnect(int EventSourceObjectID, + const wxClassInfo *EventSourceClassInfo, + const wxPropertyInfo *delegateInfo , + const wxClassInfo *EventSinkClassInfo , + const wxHandlerInfo* handlerInfo , + int EventSinkObjectID ) = 0; +}; + +/* +wxRuntimeDepersister implements the callbacks that will depersist +an object into a running memory image, as opposed to writing +C++ initialization code to bring the object to life. +*/ + +class WXDLLIMPEXP_BASE wxRuntimeDepersister : public wxDepersister +{ + struct wxRuntimeDepersisterInternal ; + wxRuntimeDepersisterInternal * m_data ; +public : + wxRuntimeDepersister(); + virtual ~wxRuntimeDepersister(); + + // returns the object having the corresponding ID fully constructed + wxObject *GetObject(int objectID) ; + + // allocate the new object on the heap, that object will have the passed in ID + virtual void AllocateObject(int objectID, wxClassInfo *classInfo , + wxxVariantArray &metadata) ; + + // initialize the already allocated object having the ID objectID with the Create method + // creation parameters which are objects are having their Ids passed in objectIDValues + // having objectId <> wxInvalidObjectID + + virtual void CreateObject(int objectID, + const wxClassInfo *classInfo, + int paramCount, + wxxVariant *VariantValues , + int *objectIDValues, + const wxClassInfo **objectClassInfos , + wxxVariantArray &metadata + ) ; + + // construct the new object on the heap, that object will have the passed in ID (for objects that + // don't support allocate-create type of creation) + // creation parameters which are objects are having their Ids passed in objectIDValues + // having objectId <> wxInvalidObjectID + + virtual void ConstructObject(int objectID, + const wxClassInfo *classInfo, + int paramCount, + wxxVariant *VariantValues , + int *objectIDValues , + const wxClassInfo **objectClassInfos , + wxxVariantArray &metadata) ; + + // destroy the heap-allocated object having the ID objectID, this may be used if an object + // is embedded in another object and set via value semantics, so the intermediate + // object can be destroyed after safely + virtual void DestroyObject(int objectID, wxClassInfo *classInfo) ; + + // set the corresponding property + virtual void SetProperty(int objectID, + const wxClassInfo *classInfo, + const wxPropertyInfo* propertyInfo , + const wxxVariant &variantValue); + + // sets the corresponding property (value is an object) + virtual void SetPropertyAsObject(int objectId, + const wxClassInfo *classInfo, + const wxPropertyInfo* propertyInfo , + int valueObjectId) ; + + // adds an element to a property collection + virtual void AddToPropertyCollection( int objectID , + const wxClassInfo *classInfo, + const wxPropertyInfo* propertyInfo , + const wxxVariant &VariantValue) ; + + // sets the corresponding property (value is an object) + virtual void AddToPropertyCollectionAsObject(int objectID, + const wxClassInfo *classInfo, + const wxPropertyInfo* propertyInfo , + int valueObjectId) ; + + // sets the corresponding event handler + virtual void SetConnect(int eventSourceObjectID, + const wxClassInfo *eventSourceClassInfo, + const wxPropertyInfo *delegateInfo , + const wxClassInfo *eventSinkClassInfo , + const wxHandlerInfo* handlerInfo , + int eventSinkObjectID ) ; +}; + +/* +wxDepersisterCode implements the callbacks that will depersist +an object into a C++ initialization function. this will move to +a utility lib soon +*/ + +class WXDLLIMPEXP_BASE wxTextOutputStream ; + +class WXDLLIMPEXP_BASE wxCodeDepersister : public wxDepersister +{ +private : + struct wxCodeDepersisterInternal ; + wxCodeDepersisterInternal * m_data ; + wxTextOutputStream *m_fp; + wxString ValueAsCode( const wxxVariant ¶m ) ; +public: + wxCodeDepersister(wxTextOutputStream *out); + virtual ~wxCodeDepersister(); + + // allocate the new object on the heap, that object will have the passed in ID + virtual void AllocateObject(int objectID, wxClassInfo *classInfo , + wxxVariantArray &metadata) ; + + // initialize the already allocated object having the ID objectID with the Create method + // creation parameters which are objects are having their Ids passed in objectIDValues + // having objectId <> wxInvalidObjectID + + virtual void CreateObject(int objectID, + const wxClassInfo *classInfo, + int paramCount, + wxxVariant *variantValues , + int *objectIDValues, + const wxClassInfo **objectClassInfos , + wxxVariantArray &metadata + ) ; + + // construct the new object on the heap, that object will have the passed in ID (for objects that + // don't support allocate-create type of creation) + // creation parameters which are objects are having their Ids passed in objectIDValues + // having objectId <> wxInvalidObjectID + + virtual void ConstructObject(int objectID, + const wxClassInfo *classInfo, + int paramCount, + wxxVariant *VariantValues , + int *objectIDValues , + const wxClassInfo **objectClassInfos , + wxxVariantArray &metadata) ; + + // destroy the heap-allocated object having the ID objectID, this may be used if an object + // is embedded in another object and set via value semantics, so the intermediate + // object can be destroyed after safely + virtual void DestroyObject(int objectID, wxClassInfo *classInfo) ; + + // set the corresponding property + virtual void SetProperty(int objectID, + const wxClassInfo *classInfo, + const wxPropertyInfo* propertyInfo , + const wxxVariant &variantValue); + + // sets the corresponding property (value is an object) + virtual void SetPropertyAsObject(int objectId, + const wxClassInfo *classInfo, + const wxPropertyInfo* propertyInfo , + int valueObjectId) ; + + // adds an element to a property collection + virtual void AddToPropertyCollection( int objectID , + const wxClassInfo *classInfo, + const wxPropertyInfo* propertyInfo , + const wxxVariant &VariantValue) ; + + // sets the corresponding property (value is an object) + virtual void AddToPropertyCollectionAsObject(int objectID, + const wxClassInfo *classInfo, + const wxPropertyInfo* propertyInfo , + int valueObjectId) ; + + // sets the corresponding event handler + virtual void SetConnect(int eventSourceObjectID, + const wxClassInfo *eventSourceClassInfo, + const wxPropertyInfo *delegateInfo , + const wxClassInfo *eventSinkClassInfo , + const wxHandlerInfo* handlerInfo , + int eventSinkObjectID ) ; +}; + +#endif // wxUSE_EXTENDED_RTTI + +#endif diff --git a/Externals/wxWidgets/include/wx/xtixml.h b/Externals/wxWidgets/include/wx/xtixml.h new file mode 100644 index 0000000000..5f878bc851 --- /dev/null +++ b/Externals/wxWidgets/include/wx/xtixml.h @@ -0,0 +1,106 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/xtixml.h +// Purpose: xml streaming runtime metadata information (extended class info) +// Author: Stefan Csomor +// Modified by: +// Created: 27/07/03 +// RCS-ID: $Id: xtixml.h 41020 2006-09-05 20:47:48Z VZ $ +// Copyright: (c) 2003 Stefan Csomor +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XTIXMLH__ +#define _WX_XTIXMLH__ + +#include "wx/wx.h" + +#if wxUSE_EXTENDED_RTTI + +#include "wx/xtistrm.h" + +class WXDLLIMPEXP_XML wxXmlNode ; + +class WXDLLIMPEXP_XML wxXmlWriter : public wxWriter +{ +public : + + wxXmlWriter( wxXmlNode * parent ) ; + virtual ~wxXmlWriter() ; + + // + // streaming callbacks + // + // these callbacks really write out the values in the stream format + // + + // + // streaming callbacks + // + // these callbacks really write out the values in the stream format + + // begins writing out a new toplevel entry which has the indicated unique name + virtual void DoBeginWriteTopLevelEntry( const wxString &name ) ; + + // ends writing out a new toplevel entry which has the indicated unique name + virtual void DoEndWriteTopLevelEntry( const wxString &name ) ; + + // start of writing an object having the passed in ID + virtual void DoBeginWriteObject(const wxObject *object, const wxClassInfo *classInfo, int objectID , wxxVariantArray &metadata ) ; + + // end of writing an toplevel object name param is used for unique identification within the container + virtual void DoEndWriteObject(const wxObject *object, const wxClassInfo *classInfo, int objectID ) ; + + // writes a simple property in the stream format + virtual void DoWriteSimpleType( wxxVariant &value ) ; + + // start of writing a complex property into the stream ( + virtual void DoBeginWriteProperty( const wxPropertyInfo *propInfo ) ; + + // end of writing a complex property into the stream + virtual void DoEndWriteProperty( const wxPropertyInfo *propInfo ) ; + + virtual void DoBeginWriteElement() ; + virtual void DoEndWriteElement() ; + + // insert an object reference to an already written object + virtual void DoWriteRepeatedObject( int objectID ) ; + + // insert a null reference + virtual void DoWriteNullObject() ; + + // writes a delegate in the stream format + virtual void DoWriteDelegate( const wxObject *object, const wxClassInfo* classInfo , const wxPropertyInfo *propInfo , + const wxObject *eventSink , int sinkObjectID , const wxClassInfo* eventSinkClassInfo , const wxHandlerInfo* handlerIndo ) ; +private : + struct wxXmlWriterInternal ; + wxXmlWriterInternal* m_data ; +} ; + +/* +wxXmlReader handles streaming in a class from XML +*/ + +class WXDLLIMPEXP_XML wxXmlReader : public wxReader +{ +public: + wxXmlReader(wxXmlNode *parent) { m_parent = parent ; } + virtual ~wxXmlReader() {} + + // Reads a component from XML. The return value is the root object ID, which can + // then be used to ask the depersister about that object + + virtual int ReadObject( const wxString &name , wxDepersister *depersist ) ; + +private : + int ReadComponent(wxXmlNode *parent, wxDepersister *callbacks); + + // read the content of this node (simple type) and return the corresponding value + wxxVariant ReadValue(wxXmlNode *Node, + const wxTypeInfo *type ); + + wxXmlNode * m_parent ; +}; + +#endif // wxUSE_EXTENDED_RTTI + +#endif diff --git a/Externals/wxWidgets/include/wx/zipstrm.h b/Externals/wxWidgets/include/wx/zipstrm.h new file mode 100644 index 0000000000..4546057361 --- /dev/null +++ b/Externals/wxWidgets/include/wx/zipstrm.h @@ -0,0 +1,574 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/zipstrm.h +// Purpose: Streams for Zip files +// Author: Mike Wetherell +// RCS-ID: $Id: zipstrm.h 43887 2006-12-09 22:28:11Z MW $ +// Copyright: (c) Mike Wetherell +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_WXZIPSTREAM_H__ +#define _WX_WXZIPSTREAM_H__ + +#include "wx/defs.h" + +#if wxUSE_ZIPSTREAM + +#include "wx/archive.h" +#include "wx/filename.h" + +// some methods from wxZipInputStream and wxZipOutputStream stream do not get +// exported/imported when compiled with Mingw versions before 3.4.2. So they +// are imported/exported individually as a workaround +#if (defined(__GNUWIN32__) || defined(__MINGW32__)) \ + && (!defined __GNUC__ \ + || !defined __GNUC_MINOR__ \ + || !defined __GNUC_PATCHLEVEL__ \ + || __GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__ < 30402) +#define WXZIPFIX WXDLLIMPEXP_BASE +#else +#define WXZIPFIX +#endif + +///////////////////////////////////////////////////////////////////////////// +// constants + +// Compression Method, only 0 (store) and 8 (deflate) are supported here +// +enum wxZipMethod +{ + wxZIP_METHOD_STORE, + wxZIP_METHOD_SHRINK, + wxZIP_METHOD_REDUCE1, + wxZIP_METHOD_REDUCE2, + wxZIP_METHOD_REDUCE3, + wxZIP_METHOD_REDUCE4, + wxZIP_METHOD_IMPLODE, + wxZIP_METHOD_TOKENIZE, + wxZIP_METHOD_DEFLATE, + wxZIP_METHOD_DEFLATE64, + wxZIP_METHOD_BZIP2 = 12, + wxZIP_METHOD_DEFAULT = 0xffff +}; + +// Originating File-System. +// +// These are Pkware's values. Note that Info-zip disagree on some of them, +// most notably NTFS. +// +enum wxZipSystem +{ + wxZIP_SYSTEM_MSDOS, + wxZIP_SYSTEM_AMIGA, + wxZIP_SYSTEM_OPENVMS, + wxZIP_SYSTEM_UNIX, + wxZIP_SYSTEM_VM_CMS, + wxZIP_SYSTEM_ATARI_ST, + wxZIP_SYSTEM_OS2_HPFS, + wxZIP_SYSTEM_MACINTOSH, + wxZIP_SYSTEM_Z_SYSTEM, + wxZIP_SYSTEM_CPM, + wxZIP_SYSTEM_WINDOWS_NTFS, + wxZIP_SYSTEM_MVS, + wxZIP_SYSTEM_VSE, + wxZIP_SYSTEM_ACORN_RISC, + wxZIP_SYSTEM_VFAT, + wxZIP_SYSTEM_ALTERNATE_MVS, + wxZIP_SYSTEM_BEOS, + wxZIP_SYSTEM_TANDEM, + wxZIP_SYSTEM_OS_400 +}; + +// Dos/Win file attributes +// +enum wxZipAttributes +{ + wxZIP_A_RDONLY = 0x01, + wxZIP_A_HIDDEN = 0x02, + wxZIP_A_SYSTEM = 0x04, + wxZIP_A_SUBDIR = 0x10, + wxZIP_A_ARCH = 0x20, + + wxZIP_A_MASK = 0x37 +}; + +// Values for the flags field in the zip headers +// +enum wxZipFlags +{ + wxZIP_ENCRYPTED = 0x0001, + wxZIP_DEFLATE_NORMAL = 0x0000, // normal compression + wxZIP_DEFLATE_EXTRA = 0x0002, // extra compression + wxZIP_DEFLATE_FAST = 0x0004, // fast compression + wxZIP_DEFLATE_SUPERFAST = 0x0006, // superfast compression + wxZIP_DEFLATE_MASK = 0x0006, + wxZIP_SUMS_FOLLOW = 0x0008, // crc and sizes come after the data + wxZIP_ENHANCED = 0x0010, + wxZIP_PATCH = 0x0020, + wxZIP_STRONG_ENC = 0x0040, + wxZIP_UNUSED = 0x0F80, + wxZIP_RESERVED = 0xF000 +}; + +// Forward decls +// +class WXDLLIMPEXP_BASE wxZipEntry; +class WXDLLIMPEXP_BASE wxZipInputStream; + + +///////////////////////////////////////////////////////////////////////////// +// wxZipNotifier + +class WXDLLIMPEXP_BASE wxZipNotifier +{ +public: + virtual ~wxZipNotifier() { } + + virtual void OnEntryUpdated(wxZipEntry& entry) = 0; +}; + + +///////////////////////////////////////////////////////////////////////////// +// Zip Entry - holds the meta data for a file in the zip + +class WXDLLIMPEXP_BASE wxZipEntry : public wxArchiveEntry +{ +public: + wxZipEntry(const wxString& name = wxEmptyString, + const wxDateTime& dt = wxDateTime::Now(), + wxFileOffset size = wxInvalidOffset); + virtual ~wxZipEntry(); + + wxZipEntry(const wxZipEntry& entry); + wxZipEntry& operator=(const wxZipEntry& entry); + + // Get accessors + wxDateTime GetDateTime() const { return m_DateTime; } + wxFileOffset GetSize() const { return m_Size; } + wxFileOffset GetOffset() const { return m_Offset; } + wxString GetInternalName() const { return m_Name; } + int GetMethod() const { return m_Method; } + int GetFlags() const { return m_Flags; } + wxUint32 GetCrc() const { return m_Crc; } + wxFileOffset GetCompressedSize() const { return m_CompressedSize; } + int GetSystemMadeBy() const { return m_SystemMadeBy; } + wxString GetComment() const { return m_Comment; } + wxUint32 GetExternalAttributes() const { return m_ExternalAttributes; } + wxPathFormat GetInternalFormat() const { return wxPATH_UNIX; } + int GetMode() const; + const char *GetLocalExtra() const; + size_t GetLocalExtraLen() const; + const char *GetExtra() const; + size_t GetExtraLen() const; + wxString GetName(wxPathFormat format = wxPATH_NATIVE) const; + + // is accessors + inline bool IsDir() const; + inline bool IsText() const; + inline bool IsReadOnly() const; + inline bool IsMadeByUnix() const; + + // set accessors + void SetDateTime(const wxDateTime& dt) { m_DateTime = dt; } + void SetSize(wxFileOffset size) { m_Size = size; } + void SetMethod(int method) { m_Method = (wxUint16)method; } + void SetComment(const wxString& comment) { m_Comment = comment; } + void SetExternalAttributes(wxUint32 attr ) { m_ExternalAttributes = attr; } + void SetSystemMadeBy(int system); + void SetMode(int mode); + void SetExtra(const char *extra, size_t len); + void SetLocalExtra(const char *extra, size_t len); + + inline void SetName(const wxString& name, + wxPathFormat format = wxPATH_NATIVE); + + static wxString GetInternalName(const wxString& name, + wxPathFormat format = wxPATH_NATIVE, + bool *pIsDir = NULL); + + // set is accessors + void SetIsDir(bool isDir = true); + inline void SetIsReadOnly(bool isReadOnly = true); + inline void SetIsText(bool isText = true); + + wxZipEntry *Clone() const { return ZipClone(); } + + void SetNotifier(wxZipNotifier& notifier); + void UnsetNotifier(); + +protected: + // Internal attributes + enum { TEXT_ATTR = 1 }; + + // protected Get accessors + int GetVersionNeeded() const { return m_VersionNeeded; } + wxFileOffset GetKey() const { return m_Key; } + int GetVersionMadeBy() const { return m_VersionMadeBy; } + int GetDiskStart() const { return m_DiskStart; } + int GetInternalAttributes() const { return m_InternalAttributes; } + + void SetVersionNeeded(int version) { m_VersionNeeded = (wxUint16)version; } + void SetOffset(wxFileOffset offset) { m_Offset = offset; } + void SetFlags(int flags) { m_Flags = (wxUint16)flags; } + void SetVersionMadeBy(int version) { m_VersionMadeBy = (wxUint8)version; } + void SetCrc(wxUint32 crc) { m_Crc = crc; } + void SetCompressedSize(wxFileOffset size) { m_CompressedSize = size; } + void SetKey(wxFileOffset offset) { m_Key = offset; } + void SetDiskStart(int start) { m_DiskStart = (wxUint16)start; } + void SetInternalAttributes(int attr) { m_InternalAttributes = (wxUint16)attr; } + + virtual wxZipEntry *ZipClone() const { return new wxZipEntry(*this); } + + void Notify(); + +private: + wxArchiveEntry* DoClone() const { return ZipClone(); } + + size_t ReadLocal(wxInputStream& stream, wxMBConv& conv); + size_t WriteLocal(wxOutputStream& stream, wxMBConv& conv) const; + + size_t ReadCentral(wxInputStream& stream, wxMBConv& conv); + size_t WriteCentral(wxOutputStream& stream, wxMBConv& conv) const; + + size_t ReadDescriptor(wxInputStream& stream); + size_t WriteDescriptor(wxOutputStream& stream, wxUint32 crc, + wxFileOffset compressedSize, wxFileOffset size); + + wxUint8 m_SystemMadeBy; // one of enum wxZipSystem + wxUint8 m_VersionMadeBy; // major * 10 + minor + + wxUint16 m_VersionNeeded; // ver needed to extract (20 i.e. v2.0) + wxUint16 m_Flags; + wxUint16 m_Method; // compression method (one of wxZipMethod) + wxDateTime m_DateTime; + wxUint32 m_Crc; + wxFileOffset m_CompressedSize; + wxFileOffset m_Size; + wxString m_Name; // in internal format + wxFileOffset m_Key; // the original offset for copied entries + wxFileOffset m_Offset; // file offset of the entry + + wxString m_Comment; + wxUint16 m_DiskStart; // for multidisk archives, not unsupported + wxUint16 m_InternalAttributes; // bit 0 set for text files + wxUint32 m_ExternalAttributes; // system specific depends on SystemMadeBy + + class wxZipMemory *m_Extra; + class wxZipMemory *m_LocalExtra; + + wxZipNotifier *m_zipnotifier; + class wxZipWeakLinks *m_backlink; + + friend class wxZipInputStream; + friend class wxZipOutputStream; + + DECLARE_DYNAMIC_CLASS(wxZipEntry) +}; + + +///////////////////////////////////////////////////////////////////////////// +// wxZipOutputStream + +WX_DECLARE_LIST_WITH_DECL(wxZipEntry, wxZipEntryList_, class WXDLLIMPEXP_BASE); + +class WXDLLIMPEXP_BASE wxZipOutputStream : public wxArchiveOutputStream +{ +public: + wxZipOutputStream(wxOutputStream& stream, + int level = -1, + wxMBConv& conv = wxConvLocal); + wxZipOutputStream(wxOutputStream *stream, + int level = -1, + wxMBConv& conv = wxConvLocal); + virtual WXZIPFIX ~wxZipOutputStream(); + + bool PutNextEntry(wxZipEntry *entry) { return DoCreate(entry); } + + bool WXZIPFIX PutNextEntry(const wxString& name, + const wxDateTime& dt = wxDateTime::Now(), + wxFileOffset size = wxInvalidOffset); + + bool WXZIPFIX PutNextDirEntry(const wxString& name, + const wxDateTime& dt = wxDateTime::Now()); + + bool WXZIPFIX CopyEntry(wxZipEntry *entry, wxZipInputStream& inputStream); + bool WXZIPFIX CopyArchiveMetaData(wxZipInputStream& inputStream); + + void WXZIPFIX Sync(); + bool WXZIPFIX CloseEntry(); + bool WXZIPFIX Close(); + + void SetComment(const wxString& comment) { m_Comment = comment; } + + int GetLevel() const { return m_level; } + void WXZIPFIX SetLevel(int level); + +protected: + virtual size_t WXZIPFIX OnSysWrite(const void *buffer, size_t size); + virtual wxFileOffset OnSysTell() const { return m_entrySize; } + + // this protected interface isn't yet finalised + struct Buffer { const char *m_data; size_t m_size; }; + virtual wxOutputStream* WXZIPFIX OpenCompressor(wxOutputStream& stream, + wxZipEntry& entry, + const Buffer bufs[]); + virtual bool WXZIPFIX CloseCompressor(wxOutputStream *comp); + + bool IsParentSeekable() const + { return m_offsetAdjustment != wxInvalidOffset; } + +private: + void Init(int level); + + bool WXZIPFIX PutNextEntry(wxArchiveEntry *entry); + bool WXZIPFIX CopyEntry(wxArchiveEntry *entry, wxArchiveInputStream& stream); + bool WXZIPFIX CopyArchiveMetaData(wxArchiveInputStream& stream); + + bool IsOpened() const { return m_comp || m_pending; } + + bool DoCreate(wxZipEntry *entry, bool raw = false); + void CreatePendingEntry(const void *buffer, size_t size); + void CreatePendingEntry(); + + class wxStoredOutputStream *m_store; + class wxZlibOutputStream2 *m_deflate; + class wxZipStreamLink *m_backlink; + wxZipEntryList_ m_entries; + char *m_initialData; + size_t m_initialSize; + wxZipEntry *m_pending; + bool m_raw; + wxFileOffset m_headerOffset; + size_t m_headerSize; + wxFileOffset m_entrySize; + wxUint32 m_crcAccumulator; + wxOutputStream *m_comp; + int m_level; + wxFileOffset m_offsetAdjustment; + wxString m_Comment; + + DECLARE_NO_COPY_CLASS(wxZipOutputStream) +}; + + +///////////////////////////////////////////////////////////////////////////// +// wxZipInputStream + +class WXDLLIMPEXP_BASE wxZipInputStream : public wxArchiveInputStream +{ +public: + typedef wxZipEntry entry_type; + + wxZipInputStream(wxInputStream& stream, wxMBConv& conv = wxConvLocal); + wxZipInputStream(wxInputStream *stream, wxMBConv& conv = wxConvLocal); + +#if WXWIN_COMPATIBILITY_2_6 && wxUSE_FFILE + wxZipInputStream(const wxString& archive, const wxString& file) + : wxArchiveInputStream(OpenFile(archive), wxConvLocal) { Init(file); } +#endif + + virtual WXZIPFIX ~wxZipInputStream(); + + bool OpenEntry(wxZipEntry& entry) { return DoOpen(&entry); } + bool WXZIPFIX CloseEntry(); + + wxZipEntry *GetNextEntry(); + + wxString WXZIPFIX GetComment(); + int WXZIPFIX GetTotalEntries(); + + virtual wxFileOffset GetLength() const { return m_entry.GetSize(); } + +protected: + size_t WXZIPFIX OnSysRead(void *buffer, size_t size); + wxFileOffset OnSysTell() const { return m_decomp ? m_decomp->TellI() : 0; } + +#if WXWIN_COMPATIBILITY_2_6 + wxFileOffset WXZIPFIX OnSysSeek(wxFileOffset seek, wxSeekMode mode); +#endif + + // this protected interface isn't yet finalised + virtual wxInputStream* WXZIPFIX OpenDecompressor(wxInputStream& stream); + virtual bool WXZIPFIX CloseDecompressor(wxInputStream *decomp); + +private: + void Init(); + void Init(const wxString& file); +#if WXWIN_COMPATIBILITY_2_6 && wxUSE_FFILE + static wxInputStream *OpenFile(const wxString& archive); +#endif + + wxArchiveEntry *DoGetNextEntry() { return GetNextEntry(); } + + bool WXZIPFIX OpenEntry(wxArchiveEntry& entry); + + wxStreamError ReadLocal(bool readEndRec = false); + wxStreamError ReadCentral(); + + wxUint32 ReadSignature(); + bool FindEndRecord(); + bool LoadEndRecord(); + + bool AtHeader() const { return m_headerSize == 0; } + bool AfterHeader() const { return m_headerSize > 0 && !m_decomp; } + bool IsOpened() const { return m_decomp != NULL; } + + wxZipStreamLink *MakeLink(wxZipOutputStream *out); + + bool DoOpen(wxZipEntry *entry = NULL, bool raw = false); + bool OpenDecompressor(bool raw = false); + + class wxStoredInputStream *m_store; + class wxZlibInputStream2 *m_inflate; + class wxRawInputStream *m_rawin; + wxZipEntry m_entry; + bool m_raw; + size_t m_headerSize; + wxUint32 m_crcAccumulator; + wxInputStream *m_decomp; + bool m_parentSeekable; + class wxZipWeakLinks *m_weaklinks; + class wxZipStreamLink *m_streamlink; + wxFileOffset m_offsetAdjustment; + wxFileOffset m_position; + wxUint32 m_signature; + size_t m_TotalEntries; + wxString m_Comment; + + friend bool wxZipOutputStream::CopyEntry( + wxZipEntry *entry, wxZipInputStream& inputStream); + friend bool wxZipOutputStream::CopyArchiveMetaData( + wxZipInputStream& inputStream); + +#if WXWIN_COMPATIBILITY_2_6 + bool m_allowSeeking; + friend class wxArchiveFSHandler; +#endif + + DECLARE_NO_COPY_CLASS(wxZipInputStream) +}; + + +///////////////////////////////////////////////////////////////////////////// +// Iterators + +#if wxUSE_STL || defined WX_TEST_ARCHIVE_ITERATOR +typedef wxArchiveIterator wxZipIter; +typedef wxArchiveIterator > wxZipPairIter; +#endif + + +///////////////////////////////////////////////////////////////////////////// +// wxZipClassFactory + +class WXDLLIMPEXP_BASE wxZipClassFactory : public wxArchiveClassFactory +{ +public: + typedef wxZipEntry entry_type; + typedef wxZipInputStream instream_type; + typedef wxZipOutputStream outstream_type; + typedef wxZipNotifier notifier_type; +#if wxUSE_STL || defined WX_TEST_ARCHIVE_ITERATOR + typedef wxZipIter iter_type; + typedef wxZipPairIter pairiter_type; +#endif + + wxZipClassFactory(); + + wxZipEntry *NewEntry() const + { return new wxZipEntry; } + wxZipInputStream *NewStream(wxInputStream& stream) const + { return new wxZipInputStream(stream, GetConv()); } + wxZipOutputStream *NewStream(wxOutputStream& stream) const + { return new wxZipOutputStream(stream, -1, GetConv()); } + wxZipInputStream *NewStream(wxInputStream *stream) const + { return new wxZipInputStream(stream, GetConv()); } + wxZipOutputStream *NewStream(wxOutputStream *stream) const + { return new wxZipOutputStream(stream, -1, GetConv()); } + + wxString GetInternalName(const wxString& name, + wxPathFormat format = wxPATH_NATIVE) const + { return wxZipEntry::GetInternalName(name, format); } + + const wxChar * const *GetProtocols(wxStreamProtocolType type + = wxSTREAM_PROTOCOL) const; + +protected: + wxArchiveEntry *DoNewEntry() const + { return NewEntry(); } + wxArchiveInputStream *DoNewStream(wxInputStream& stream) const + { return NewStream(stream); } + wxArchiveOutputStream *DoNewStream(wxOutputStream& stream) const + { return NewStream(stream); } + wxArchiveInputStream *DoNewStream(wxInputStream *stream) const + { return NewStream(stream); } + wxArchiveOutputStream *DoNewStream(wxOutputStream *stream) const + { return NewStream(stream); } + +private: + DECLARE_DYNAMIC_CLASS(wxZipClassFactory) +}; + + +///////////////////////////////////////////////////////////////////////////// +// wxZipEntry inlines + +inline bool wxZipEntry::IsText() const +{ + return (m_InternalAttributes & TEXT_ATTR) != 0; +} + +inline bool wxZipEntry::IsDir() const +{ + return (m_ExternalAttributes & wxZIP_A_SUBDIR) != 0; +} + +inline bool wxZipEntry::IsReadOnly() const +{ + return (m_ExternalAttributes & wxZIP_A_RDONLY) != 0; +} + +inline bool wxZipEntry::IsMadeByUnix() const +{ + const int pattern = + (1 << wxZIP_SYSTEM_OPENVMS) | + (1 << wxZIP_SYSTEM_UNIX) | + (1 << wxZIP_SYSTEM_ATARI_ST) | + (1 << wxZIP_SYSTEM_ACORN_RISC) | + (1 << wxZIP_SYSTEM_BEOS) | (1 << wxZIP_SYSTEM_TANDEM); + + // note: some unix zippers put madeby = dos + return (m_SystemMadeBy == wxZIP_SYSTEM_MSDOS + && (m_ExternalAttributes & ~0xFFFF)) + || ((pattern >> m_SystemMadeBy) & 1); +} + +inline void wxZipEntry::SetIsText(bool isText) +{ + if (isText) + m_InternalAttributes |= TEXT_ATTR; + else + m_InternalAttributes &= ~TEXT_ATTR; +} + +inline void wxZipEntry::SetIsReadOnly(bool isReadOnly) +{ + if (isReadOnly) + SetMode(GetMode() & ~0222); + else + SetMode(GetMode() | 0200); +} + +inline void wxZipEntry::SetName(const wxString& name, + wxPathFormat format /*=wxPATH_NATIVE*/) +{ + bool isDir; + m_Name = GetInternalName(name, format, &isDir); + SetIsDir(isDir); +} + + +#endif // wxUSE_ZIPSTREAM + +#endif // _WX_WXZIPSTREAM_H__ diff --git a/Externals/wxWidgets/include/wx/zstream.h b/Externals/wxWidgets/include/wx/zstream.h new file mode 100644 index 0000000000..3ba68f311a --- /dev/null +++ b/Externals/wxWidgets/include/wx/zstream.h @@ -0,0 +1,146 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/zstream.h +// Purpose: Memory stream classes +// Author: Guilhem Lavaux +// Modified by: Mike Wetherell +// Created: 11/07/98 +// RCS-ID: $Id: zstream.h 42713 2006-10-30 11:56:12Z ABX $ +// Copyright: (c) Guilhem Lavaux +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// +#ifndef _WX_WXZSTREAM_H__ +#define _WX_WXZSTREAM_H__ + +#include "wx/defs.h" + +#if wxUSE_ZLIB && wxUSE_STREAMS + +#include "wx/stream.h" + +// Compression level +enum { + wxZ_DEFAULT_COMPRESSION = -1, + wxZ_NO_COMPRESSION = 0, + wxZ_BEST_SPEED = 1, + wxZ_BEST_COMPRESSION = 9 +}; + +// Flags +enum { +#if WXWIN_COMPATIBILITY_2_4 + wxZLIB_24COMPATIBLE = 4, // read v2.4.x data without error +#endif + wxZLIB_NO_HEADER = 0, // raw deflate stream, no header or checksum + wxZLIB_ZLIB = 1, // zlib header and checksum + wxZLIB_GZIP = 2, // gzip header and checksum, requires zlib 1.2.1+ + wxZLIB_AUTO = 3 // autodetect header zlib or gzip +}; + +class WXDLLIMPEXP_BASE wxZlibInputStream: public wxFilterInputStream { + public: + wxZlibInputStream(wxInputStream& stream, int flags = wxZLIB_AUTO); + wxZlibInputStream(wxInputStream *stream, int flags = wxZLIB_AUTO); + virtual ~wxZlibInputStream(); + + char Peek() { return wxInputStream::Peek(); } + wxFileOffset GetLength() const { return wxInputStream::GetLength(); } + + static bool CanHandleGZip(); + + protected: + size_t OnSysRead(void *buffer, size_t size); + wxFileOffset OnSysTell() const { return m_pos; } + + private: + void Init(int flags); + + protected: + size_t m_z_size; + unsigned char *m_z_buffer; + struct z_stream_s *m_inflate; + wxFileOffset m_pos; +#if WXWIN_COMPATIBILITY_2_4 + bool m_24compatibilty; +#endif + + DECLARE_NO_COPY_CLASS(wxZlibInputStream) +}; + +class WXDLLIMPEXP_BASE wxZlibOutputStream: public wxFilterOutputStream { + public: + wxZlibOutputStream(wxOutputStream& stream, int level = -1, int flags = wxZLIB_ZLIB); + wxZlibOutputStream(wxOutputStream *stream, int level = -1, int flags = wxZLIB_ZLIB); + virtual ~wxZlibOutputStream() { Close(); } + + void Sync() { DoFlush(false); } + bool Close(); + wxFileOffset GetLength() const { return m_pos; } + + static bool CanHandleGZip(); + + protected: + size_t OnSysWrite(const void *buffer, size_t size); + wxFileOffset OnSysTell() const { return m_pos; } + + virtual void DoFlush(bool final); + + private: + void Init(int level, int flags); + + protected: + size_t m_z_size; + unsigned char *m_z_buffer; + struct z_stream_s *m_deflate; + wxFileOffset m_pos; + + DECLARE_NO_COPY_CLASS(wxZlibOutputStream) +}; + +class WXDLLIMPEXP_BASE wxZlibClassFactory: public wxFilterClassFactory +{ +public: + wxZlibClassFactory(); + + wxFilterInputStream *NewStream(wxInputStream& stream) const + { return new wxZlibInputStream(stream); } + wxFilterOutputStream *NewStream(wxOutputStream& stream) const + { return new wxZlibOutputStream(stream, -1); } + wxFilterInputStream *NewStream(wxInputStream *stream) const + { return new wxZlibInputStream(stream); } + wxFilterOutputStream *NewStream(wxOutputStream *stream) const + { return new wxZlibOutputStream(stream, -1); } + + const wxChar * const *GetProtocols(wxStreamProtocolType type + = wxSTREAM_PROTOCOL) const; + +private: + DECLARE_DYNAMIC_CLASS(wxZlibClassFactory) +}; + +class WXDLLIMPEXP_BASE wxGzipClassFactory: public wxFilterClassFactory +{ +public: + wxGzipClassFactory(); + + wxFilterInputStream *NewStream(wxInputStream& stream) const + { return new wxZlibInputStream(stream); } + wxFilterOutputStream *NewStream(wxOutputStream& stream) const + { return new wxZlibOutputStream(stream, -1); } + wxFilterInputStream *NewStream(wxInputStream *stream) const + { return new wxZlibInputStream(stream); } + wxFilterOutputStream *NewStream(wxOutputStream *stream) const + { return new wxZlibOutputStream(stream, -1); } + + const wxChar * const *GetProtocols(wxStreamProtocolType type + = wxSTREAM_PROTOCOL) const; + +private: + DECLARE_DYNAMIC_CLASS(wxGzipClassFactory) +}; + +#endif + // wxUSE_ZLIB && wxUSE_STREAMS + +#endif + // _WX_WXZSTREAM_H__ + diff --git a/Externals/wxWidgets/lib/vc_lib/msw/wx/msw/rcdefs.h b/Externals/wxWidgets/lib/vc_lib/msw/wx/msw/rcdefs.h new file mode 100644 index 0000000000..dc2c7fecc6 --- /dev/null +++ b/Externals/wxWidgets/lib/vc_lib/msw/wx/msw/rcdefs.h @@ -0,0 +1,44 @@ + + + + + + + + + + + + +#ifndef _WX_RCDEFS_H +#define _WX_RCDEFS_H + + +#define WX_MSC_FULL_VER 140050727 + + + + + + + + + + + + + + + +#define WX_CPU_X86 + + + + + + + + + + +#endif diff --git a/Externals/wxWidgets/lib/vc_lib/msw/wx/setup.h b/Externals/wxWidgets/lib/vc_lib/msw/wx/setup.h new file mode 100644 index 0000000000..f3f674416d --- /dev/null +++ b/Externals/wxWidgets/lib/vc_lib/msw/wx/setup.h @@ -0,0 +1,1349 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/setup.h +// Purpose: Configuration for the library +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: setup0.h 43908 2006-12-11 06:19:27Z RD $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_SETUP_H_ +#define _WX_SETUP_H_ + +/* --- start common options --- */ +// ---------------------------------------------------------------------------- +// global settings +// ---------------------------------------------------------------------------- + +// define this to 0 when building wxBase library - this can also be done from +// makefile/project file overriding the value here +#ifndef wxUSE_GUI + #define wxUSE_GUI 1 +#endif // wxUSE_GUI + +// ---------------------------------------------------------------------------- +// compatibility settings +// ---------------------------------------------------------------------------- + +// This setting determines the compatibility with 2.4 API: set it to 1 to +// enable it but please consider updating your code instead. +// +// Default is 0 +// +// Recommended setting: 0 (please update your code) +#define WXWIN_COMPATIBILITY_2_4 0 + +// This setting determines the compatibility with 2.6 API: set it to 0 to +// flag all cases of using deprecated functions. +// +// Default is 1 but please try building your code with 0 as the default will +// change to 0 in the next version and the deprecated functions will disappear +// in the version after it completely. +// +// Recommended setting: 0 (please update your code) +#define WXWIN_COMPATIBILITY_2_6 1 + +// MSW-only: Set to 0 for accurate dialog units, else 1 for old behaviour when +// default system font is used for wxWindow::GetCharWidth/Height() instead of +// the current font. +// +// Default is 0 +// +// Recommended setting: 0 +#define wxDIALOG_UNIT_COMPATIBILITY 0 + +// ---------------------------------------------------------------------------- +// debugging settings +// ---------------------------------------------------------------------------- + +// Generic comment about debugging settings: they are very useful if you don't +// use any other memory leak detection tools such as Purify/BoundsChecker, but +// are probably redundant otherwise. Also, Visual C++ CRT has the same features +// as wxWidgets memory debugging subsystem built in since version 5.0 and you +// may prefer to use it instead of built in memory debugging code because it is +// faster and more fool proof. +// +// Using VC++ CRT memory debugging is enabled by default in debug mode +// (__WXDEBUG__) if wxUSE_GLOBAL_MEMORY_OPERATORS is *not* enabled (i.e. is 0) +// and if __NO_VC_CRTDBG__ is not defined. + +// If 1, enables wxDebugContext, for writing error messages to file, etc. If +// __WXDEBUG__ is not defined, will still use the normal memory operators. +// +// Default is 0 +// +// Recommended setting: 0 +#define wxUSE_DEBUG_CONTEXT 0 + +// If 1, enables debugging versions of wxObject::new and wxObject::delete *IF* +// __WXDEBUG__ is also defined. +// +// WARNING: this code may not work with all architectures, especially if +// alignment is an issue. This switch is currently ignored for mingw / cygwin +// +// Default is 0 +// +// Recommended setting: 1 if you are not using a memory debugging tool, else 0 +#define wxUSE_MEMORY_TRACING 0 + +// In debug mode, cause new and delete to be redefined globally. +// If this causes problems (e.g. link errors which is a common problem +// especially if you use another library which also redefines the global new +// and delete), set this to 0. +// This switch is currently ignored for mingw / cygwin +// +// Default is 0 +// +// Recommended setting: 0 +#define wxUSE_GLOBAL_MEMORY_OPERATORS 0 + +// In debug mode, causes new to be defined to be WXDEBUG_NEW (see object.h). If +// this causes problems (e.g. link errors), set this to 0. You may need to set +// this to 0 if using templates (at least for VC++). This switch is currently +// ignored for mingw / cygwin / CodeWarrior +// +// Default is 0 +// +// Recommended setting: 0 +#define wxUSE_DEBUG_NEW_ALWAYS 0 + +// wxHandleFatalExceptions() may be used to catch the program faults at run +// time and, instead of terminating the program with a usual GPF message box, +// call the user-defined wxApp::OnFatalException() function. If you set +// wxUSE_ON_FATAL_EXCEPTION to 0, wxHandleFatalExceptions() will not work. +// +// This setting is for Win32 only and can only be enabled if your compiler +// supports Win32 structured exception handling (currently only VC++ does) +// +// Default is 1 +// +// Recommended setting: 1 if your compiler supports it. +#define wxUSE_ON_FATAL_EXCEPTION 1 + +// Set this to 1 to be able to generate a human-readable (unlike +// machine-readable minidump created by wxCrashReport::Generate()) stack back +// trace when your program crashes using wxStackWalker +// +// Default is 1 if supported by the compiler. +// +// Recommended setting: 1, set to 0 if your programs never crash +#define wxUSE_STACKWALKER 1 + +// Set this to 1 to compile in wxDebugReport class which allows you to create +// and optionally upload to your web site a debug report consisting of back +// trace of the crash (if wxUSE_STACKWALKER == 1) and other information. +// +// Default is 1 if supported by the compiler. +// +// Recommended setting: 1, it is compiled into a separate library so there +// is no overhead if you don't use it +#define wxUSE_DEBUGREPORT 1 + +// ---------------------------------------------------------------------------- +// Unicode support +// ---------------------------------------------------------------------------- + +// Set wxUSE_UNICODE to 1 to compile wxWidgets in Unicode mode: wxChar will be +// defined as wchar_t, wxString will use Unicode internally. If you set this +// to 1, you must use wxT() macro for all literal strings in the program. +// +// Unicode is currently only fully supported under Windows NT/2000/XP +// (Windows 9x doesn't support it and the programs compiled in Unicode mode +// will not run under 9x -- but see wxUSE_UNICODE_MSLU below). +// +// Default is 0 +// +// Recommended setting: 0 (unless you only plan to use Windows NT/2000/XP) +#ifndef wxUSE_UNICODE + #define wxUSE_UNICODE 0 +#endif + +// Setting wxUSE_WCHAR_T to 1 gives you some degree of Unicode support without +// compiling the program in Unicode mode. More precisely, it will be possible +// to construct wxString from a wide (Unicode) string and convert any wxString +// to Unicode. +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_WCHAR_T 1 + +// ---------------------------------------------------------------------------- +// global features +// ---------------------------------------------------------------------------- + +// Compile library in exception-safe mode? If set to 1, the library will try to +// behave correctly in presence of exceptions (even though it still will not +// use the exceptions itself) and notify the user code about any unhandled +// exceptions. If set to 0, propagation of the exceptions through the library +// code will lead to undefined behaviour -- but the code itself will be +// slightly smaller and faster. +// +// Note that like wxUSE_THREADS this option is automatically set to 0 if +// wxNO_EXCEPTIONS is defined. +// +// Default is 1 +// +// Recommended setting: depends on whether you intend to use C++ exceptions +// in your own code (1 if you do, 0 if you don't) +#define wxUSE_EXCEPTIONS 1 + +// Set wxUSE_EXTENDED_RTTI to 1 to use extended RTTI +// +// Default is 0 +// +// Recommended setting: 0 (this is still work in progress...) +#define wxUSE_EXTENDED_RTTI 0 + +// Set wxUSE_STL to 1 to derive wxList(Foo) and wxArray(Foo) from +// std::list and std::vector, with a compatibility interface, +// and for wxHashMap to be implemented with templates. +// +// Default is 0 +// +// Recommended setting: YMMV +#define wxUSE_STL 0 + +// Support for message/error logging. This includes wxLogXXX() functions and +// wxLog and derived classes. Don't set this to 0 unless you really know what +// you are doing. +// +// Default is 1 +// +// Recommended setting: 1 (always) +#define wxUSE_LOG 1 + +// Recommended setting: 1 +#define wxUSE_LOGWINDOW 1 + +// Recommended setting: 1 +#define wxUSE_LOGGUI 1 + +// Recommended setting: 1 +#define wxUSE_LOG_DIALOG 1 + +// Support for command line parsing using wxCmdLineParser class. +// +// Default is 1 +// +// Recommended setting: 1 (can be set to 0 if you don't use the cmd line) +#define wxUSE_CMDLINE_PARSER 1 + +// Support for multithreaded applications: if 1, compile in thread classes +// (thread.h) and make the library a bit more thread safe. Although thread +// support is quite stable by now, you may still consider recompiling the +// library without it if you have no use for it - this will result in a +// somewhat smaller and faster operation. +// +// Notice that if wxNO_THREADS is defined, wxUSE_THREADS is automatically reset +// to 0 in wx/chkconf.h, so, for example, if you set USE_THREADS to 0 in +// build/msw/config.* file this value will have no effect. +// +// Default is 1 +// +// Recommended setting: 0 unless you do plan to develop MT applications +#define wxUSE_THREADS 1 + +// If enabled, compiles wxWidgets streams classes +// +// wx stream classes are used for image IO, process IO redirection, network +// protocols implementation and much more and so disabling this results in a +// lot of other functionality being lost. +// +// Default is 1 +// +// Recommended setting: 1 as setting it to 0 disables many other things +#define wxUSE_STREAMS 1 + +// Use standard C++ streams if 1 instead of wx streams in some places. If +// disabled (default), wx streams are used everywhere and wxWidgets doesn't +// depend on the standard streams library. +// +// Notice that enabling this does not replace wx streams with std streams +// everywhere, in a lot of places wx streams are used no matter what. +// +// Default is 0 +// +// Recommended setting: 1 if you use the standard streams anyhow and so +// dependency on the standard streams library is not a +// problem +#define wxUSE_STD_IOSTREAM 0 + +// Enable conversion to standard C++ string if 1. +// +// Default is 1 for most compilers. +// +// Currently the Digital Mars and Watcom compilers come without standard C++ +// library headers by default, wxUSE_STD_STRING can be set to 1 if you do have +// them (e.g. from STLPort). +// +// VC++ 5.0 does include standard C++ library header, however they produce +// many warnings that can't be turned off when compiled at warning level 4. +#if defined(__DMC__) || defined(__WATCOMC__) \ + || (defined(_MSC_VER) && _MSC_VER < 1200) + #define wxUSE_STD_STRING 0 +#else + #define wxUSE_STD_STRING 1 +#endif + +// Support for positional parameters (e.g. %1$d, %2$s ...) in wxVsnprintf. +// Note that if the system's implementation does not support positional +// parameters, setting this to 1 forces the use of the wxWidgets implementation +// of wxVsnprintf. The standard vsnprintf() supports positional parameters on +// many Unix systems but usually doesn't under Windows. +// +// Positional parameters are very useful when translating a program since using +// them in formatting strings allow translators to correctly reorder the +// translated sentences. +// +// Default is 1 +// +// Recommended setting: 1 if you want to support multiple languages +#define wxUSE_PRINTF_POS_PARAMS 1 + +// ---------------------------------------------------------------------------- +// non GUI features selection +// ---------------------------------------------------------------------------- + +// Set wxUSE_LONGLONG to 1 to compile the wxLongLong class. This is a 64 bit +// integer which is implemented in terms of native 64 bit integers if any or +// uses emulation otherwise. +// +// This class is required by wxDateTime and so you should enable it if you want +// to use wxDateTime. For most modern platforms, it will use the native 64 bit +// integers in which case (almost) all of its functions are inline and it +// almost does not take any space, so there should be no reason to switch it +// off. +// +// Recommended setting: 1 +#define wxUSE_LONGLONG 1 + +// Set wxUSE_(F)FILE to 1 to compile wx(F)File classes. wxFile uses low level +// POSIX functions for file access, wxFFile uses ANSI C stdio.h functions. +// +// Default is 1 +// +// Recommended setting: 1 (wxFile is highly recommended as it is required by +// i18n code, wxFileConfig and others) +#define wxUSE_FILE 1 +#define wxUSE_FFILE 1 + +// Use wxFSVolume class providing access to the configured/active mount points +// +// Default is 1 +// +// Recommended setting: 1 (but may be safely disabled if you don't use it) +#define wxUSE_FSVOLUME 1 + +// Use wxStandardPaths class which allows to retrieve some standard locations +// in the file system +// +// Default is 1 +// +// Recommended setting: 1 (may be disabled to save space, but not much) +#define wxUSE_STDPATHS 1 + +// use wxTextBuffer class: required by wxTextFile +#define wxUSE_TEXTBUFFER 1 + +// use wxTextFile class: requires wxFile and wxTextBuffer, required by +// wxFileConfig +#define wxUSE_TEXTFILE 1 + +// i18n support: _() macro, wxLocale class. Requires wxTextFile. +#define wxUSE_INTL 1 + +// Set wxUSE_DATETIME to 1 to compile the wxDateTime and related classes which +// allow to manipulate dates, times and time intervals. wxDateTime replaces the +// old wxTime and wxDate classes which are still provided for backwards +// compatibility (and implemented in terms of wxDateTime). +// +// Note that this class is relatively new and is still officially in alpha +// stage because some features are not yet (fully) implemented. It is already +// quite useful though and should only be disabled if you are aiming at +// absolutely minimal version of the library. +// +// Requires: wxUSE_LONGLONG +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_DATETIME 1 + +// Set wxUSE_TIMER to 1 to compile wxTimer class +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_TIMER 1 + +// Use wxStopWatch clas. +// +// Default is 1 +// +// Recommended setting: 1 (needed by wxSocket) +#define wxUSE_STOPWATCH 1 + +// Setting wxUSE_CONFIG to 1 enables the use of wxConfig and related classes +// which allow the application to store its settings in the persistent +// storage. Setting this to 1 will also enable on-demand creation of the +// global config object in wxApp. +// +// See also wxUSE_CONFIG_NATIVE below. +// +// Recommended setting: 1 +#define wxUSE_CONFIG 1 + +// If wxUSE_CONFIG is 1, you may choose to use either the native config +// classes under Windows (using .INI files under Win16 and the registry under +// Win32) or the portable text file format used by the config classes under +// Unix. +// +// Default is 1 to use native classes. Note that you may still use +// wxFileConfig even if you set this to 1 - just the config object created by +// default for the applications needs will be a wxRegConfig or wxIniConfig and +// not wxFileConfig. +// +// Recommended setting: 1 +#define wxUSE_CONFIG_NATIVE 1 + +// If wxUSE_DIALUP_MANAGER is 1, compile in wxDialUpManager class which allows +// to connect/disconnect from the network and be notified whenever the dial-up +// network connection is established/terminated. Requires wxUSE_DYNAMIC_LOADER. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_DIALUP_MANAGER 1 + +// Compile in classes for run-time DLL loading and function calling. +// Required by wxUSE_DIALUP_MANAGER. +// +// This setting is for Win32 only +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_DYNLIB_CLASS 1 + +// experimental, don't use for now +#define wxUSE_DYNAMIC_LOADER 1 + +// Set to 1 to use socket classes +#define wxUSE_SOCKETS 1 + +// Set to 1 to enable virtual file systems (required by wxHTML) +#define wxUSE_FILESYSTEM 1 + +// Set to 1 to enable virtual ZIP filesystem (requires wxUSE_FILESYSTEM) +#define wxUSE_FS_ZIP 1 + +// Set to 1 to enable virtual archive filesystem (requires wxUSE_FILESYSTEM) +#define wxUSE_FS_ARCHIVE 1 + +// Set to 1 to enable virtual Internet filesystem (requires wxUSE_FILESYSTEM) +#define wxUSE_FS_INET 1 + +// wxArchive classes for accessing archives such as zip and tar +#define wxUSE_ARCHIVE_STREAMS 1 + +// Set to 1 to compile wxZipInput/OutputStream classes. +#define wxUSE_ZIPSTREAM 1 + +// Set to 1 to compile wxTarInput/OutputStream classes. +#define wxUSE_TARSTREAM 1 + +// Set to 1 to compile wxZlibInput/OutputStream classes. Also required by +// wxUSE_LIBPNG +#define wxUSE_ZLIB 1 + +// If enabled, the code written by Apple will be used to write, in a portable +// way, float on the disk. See extended.c for the license which is different +// from wxWidgets one. +// +// Default is 1. +// +// Recommended setting: 1 unless you don't like the license terms (unlikely) +#define wxUSE_APPLE_IEEE 1 + +// Joystick support class +#define wxUSE_JOYSTICK 1 + +// wxFontMapper class +#define wxUSE_FONTMAP 1 + +// wxMimeTypesManager class +#define wxUSE_MIMETYPE 1 + +// wxProtocol and related classes: if you want to use either of wxFTP, wxHTTP +// or wxURL you need to set this to 1. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_PROTOCOL 1 + +// The settings for the individual URL schemes +#define wxUSE_PROTOCOL_FILE 1 +#define wxUSE_PROTOCOL_FTP 1 +#define wxUSE_PROTOCOL_HTTP 1 + +// Define this to use wxURL class. +#define wxUSE_URL 1 + +// Define this to use native platform url and protocol support. +// Currently valid only for MS-Windows. +// Note: if you set this to 1, you can open ftp/http/gopher sites +// and obtain a valid input stream for these sites +// even when you set wxUSE_PROTOCOL_FTP/HTTP to 0. +// Doing so reduces the code size. +// +// This code is experimental and subject to change. +#define wxUSE_URL_NATIVE 0 + +// Support for wxVariant class used in several places throughout the library, +// notably in wxDataViewCtrl API. +// +// Default is 1. +// +// Recommended setting: 1 unless you want to reduce the library size as much as +// possible in which case setting this to 0 can gain up to 100KB. +#define wxUSE_VARIANT 1 + +// Support for regular expression matching via wxRegEx class: enable this to +// use POSIX regular expressions in your code. You need to compile regex +// library from src/regex to use it under Windows. +// +// Default is 0 +// +// Recommended setting: 1 if your compiler supports it, if it doesn't please +// contribute us a makefile for src/regex for it +#define wxUSE_REGEX 1 + +// wxSystemOptions class +#define wxUSE_SYSTEM_OPTIONS 1 + +// wxSound class +#define wxUSE_SOUND 1 + +// Use wxMediaCtrl +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_MEDIACTRL 1 + +// Use GStreamer for Unix (req a lot of dependancies) +// +// Default is 0 +// +// Recommended setting: 1 (wxMediaCtrl won't work by default without it) +#define wxUSE_GSTREAMER 0 + +// Use wxWidget's XRC XML-based resource system. Recommended. +// +// Default is 1 +// +// Recommended setting: 1 (requires wxUSE_XML) +#define wxUSE_XRC 1 + +// XML parsing classes. Note that their API will change in the future, so +// using wxXmlDocument and wxXmlNode in your app is not recommended. +// +// Default is the same as wxUSE_XRC, i.e. 1 by default. +// +// Recommended setting: 1 (required by XRC) +#define wxUSE_XML wxUSE_XRC + +// Use wxWidget's AUI docking system +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_AUI 1 + + +// Enable the new wxGraphicsPath and wxGraphicsContext classes for an advanced +// 2D drawing API. (Still somewhat experimental) +// +// Please note that on Windows you will need to link with gdiplus.lib (use +// USE_GDIPLUS=1 for makefile builds) and distribute gdiplus.dll with your +// application if you want it to be runnable on pre-XP systems. +// +// Default is 0 +// +// Recommended setting: 1 +#ifndef wxUSE_GRAPHICS_CONTEXT +#define wxUSE_GRAPHICS_CONTEXT 0 +#endif + +// ---------------------------------------------------------------------------- +// Individual GUI controls +// ---------------------------------------------------------------------------- + +// You must set wxUSE_CONTROLS to 1 if you are using any controls at all +// (without it, wxControl class is not compiled) +// +// Default is 1 +// +// Recommended setting: 1 (don't change except for very special programs) +#define wxUSE_CONTROLS 1 + +// wxPopupWindow class is a top level transient window. It is currently used +// to implement wxTipWindow +// +// Default is 1 +// +// Recommended setting: 1 (may be set to 0 if you don't wxUSE_TIPWINDOW) +#define wxUSE_POPUPWIN 1 + +// wxTipWindow allows to implement the custom tooltips, it is used by the +// context help classes. Requires wxUSE_POPUPWIN. +// +// Default is 1 +// +// Recommended setting: 1 (may be set to 0) +#define wxUSE_TIPWINDOW 1 + +// Each of the settings below corresponds to one wxWidgets control. They are +// all switched on by default but may be disabled if you are sure that your +// program (including any standard dialogs it can show!) doesn't need them and +// if you desperately want to save some space. If you use any of these you must +// set wxUSE_CONTROLS as well. +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_ANIMATIONCTRL 1 // wxAnimationCtrl +#define wxUSE_BUTTON 1 // wxButton +#define wxUSE_BMPBUTTON 1 // wxBitmapButton +#define wxUSE_CALENDARCTRL 1 // wxCalendarCtrl +#define wxUSE_CHECKBOX 1 // wxCheckBox +#define wxUSE_CHECKLISTBOX 1 // wxCheckListBox (requires wxUSE_OWNER_DRAWN) +#define wxUSE_CHOICE 1 // wxChoice +#define wxUSE_COLLPANE 1 // wxCollapsiblePane +#define wxUSE_COLOURPICKERCTRL 1 // wxColourPickerCtrl +#define wxUSE_COMBOBOX 1 // wxComboBox +#define wxUSE_DATAVIEWCTRL 1 // wxDataViewCtrl +#define wxUSE_DATEPICKCTRL 1 // wxDatePickerCtrl +#define wxUSE_DIRPICKERCTRL 1 // wxDirPickerCtrl +#define wxUSE_FILEPICKERCTRL 1 // wxFilePickerCtrl +#define wxUSE_FONTPICKERCTRL 1 // wxFontPickerCtrl +#define wxUSE_GAUGE 1 // wxGauge +#define wxUSE_HYPERLINKCTRL 1 // wxHyperlinkCtrl +#define wxUSE_LISTBOX 1 // wxListBox +#define wxUSE_LISTCTRL 1 // wxListCtrl +#define wxUSE_RADIOBOX 1 // wxRadioBox +#define wxUSE_RADIOBTN 1 // wxRadioButton +#define wxUSE_SCROLLBAR 1 // wxScrollBar +#define wxUSE_SEARCHCTRL 1 // wxSearchCtrl +#define wxUSE_SLIDER 1 // wxSlider +#define wxUSE_SPINBTN 1 // wxSpinButton +#define wxUSE_SPINCTRL 1 // wxSpinCtrl +#define wxUSE_STATBOX 1 // wxStaticBox +#define wxUSE_STATLINE 1 // wxStaticLine +#define wxUSE_STATTEXT 1 // wxStaticText +#define wxUSE_STATBMP 1 // wxStaticBitmap +#define wxUSE_TEXTCTRL 1 // wxTextCtrl +#define wxUSE_TOGGLEBTN 1 // requires wxButton +#define wxUSE_TREECTRL 1 // wxTreeCtrl + +// Use a status bar class? Depending on the value of wxUSE_NATIVE_STATUSBAR +// below either wxStatusBar95 or a generic wxStatusBar will be used. +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_STATUSBAR 1 + +// Two status bar implementations are available under Win32: the generic one +// or the wrapper around native control. For native look and feel the native +// version should be used. +// +// Default is 1 for the platforms where native status bar is supported. +// +// Recommended setting: 1 (there is no advantage in using the generic one) +#define wxUSE_NATIVE_STATUSBAR 1 + +// wxToolBar related settings: if wxUSE_TOOLBAR is 0, don't compile any toolbar +// classes at all. Otherwise, use the native toolbar class unless +// wxUSE_TOOLBAR_NATIVE is 0. +// +// Default is 1 for all settings. +// +// Recommended setting: 1 for wxUSE_TOOLBAR and wxUSE_TOOLBAR_NATIVE. +#define wxUSE_TOOLBAR 1 +#define wxUSE_TOOLBAR_NATIVE 1 + +// wxNotebook is a control with several "tabs" located on one of its sides. It +// may be used to logically organise the data presented to the user instead of +// putting everything in one huge dialog. It replaces wxTabControl and related +// classes of wxWin 1.6x. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_NOTEBOOK 1 + +// wxListbook control is similar to wxNotebook but uses wxListCtrl instead of +// the tabs +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_LISTBOOK 1 + +// wxChoicebook control is similar to wxNotebook but uses wxChoice instead of +// the tabs +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_CHOICEBOOK 1 + +// wxTreebook control is similar to wxNotebook but uses wxTreeCtrl instead of +// the tabs +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_TREEBOOK 1 + +// wxToolbook control is similar to wxNotebook but uses wxToolBar instead of +// tabs +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_TOOLBOOK 1 + +// wxTabDialog is a generic version of wxNotebook but it is incompatible with +// the new class. It shouldn't be used in new code. +// +// Default is 0. +// +// Recommended setting: 0 (use wxNotebook) +#define wxUSE_TAB_DIALOG 0 + +// wxGrid class +// +// Default is 1, set to 0 to cut down compilation time and binaries size if you +// don't use it. +// +// Recommended setting: 1 +// +#define wxUSE_GRID 1 + +// wxMiniFrame class: a frame with narrow title bar +// +// Default is 1. +// +// Recommended setting: 1 (it doesn't cost almost anything) +#define wxUSE_MINIFRAME 1 + +// wxComboCtrl and related classes: combobox with custom popup window and +// not necessarily a listbox. +// +// Default is 1. +// +// Recommended setting: 1 but can be safely set to 0 except for wxUniv where it +// it used by wxComboBox +#define wxUSE_COMBOCTRL 1 + +// wxOwnerDrawnComboBox is a custom combobox allowing to paint the combobox +// items. +// +// Default is 1. +// +// Recommended setting: 1 but can be safely set to 0, except where it is +// needed as a base class for generic wxBitmapComboBox. +#define wxUSE_ODCOMBOBOX 1 + +// wxBitmapComboBox is a combobox that can have images in front of text items. +// +// Default is 1. +// +// Recommended setting: 1 but can be safely set to 0 +#define wxUSE_BITMAPCOMBOBOX 1 + +// ---------------------------------------------------------------------------- +// Miscellaneous GUI stuff +// ---------------------------------------------------------------------------- + +// wxAcceleratorTable/Entry classes and support for them in wxMenu(Bar) +#define wxUSE_ACCEL 1 + +// Hotkey support (currently Windows only) +#define wxUSE_HOTKEY 1 + +// Use wxCaret: a class implementing a "cursor" in a text control (called caret +// under Windows). +// +// Default is 1. +// +// Recommended setting: 1 (can be safely set to 0, not used by the library) +#define wxUSE_CARET 1 + +// Use wxDisplay class: it allows enumerating all displays on a system and +// their geometries as well as finding the display on which the given point or +// window lies. +// +// Default is 1. +// +// Recommended setting: 1 if you need it, can be safely set to 0 otherwise +#define wxUSE_DISPLAY 1 + +// Miscellaneous geometry code: needed for Canvas library +#define wxUSE_GEOMETRY 1 + +// Use wxImageList. This class is needed by wxNotebook, wxTreeCtrl and +// wxListCtrl. +// +// Default is 1. +// +// Recommended setting: 1 (set it to 0 if you don't use any of the controls +// enumerated above, then this class is mostly useless too) +#define wxUSE_IMAGLIST 1 + +// Use wxMenu, wxMenuBar, wxMenuItem. +// +// Default is 1. +// +// Recommended setting: 1 (can't be disabled under MSW) +#define wxUSE_MENUS 1 + +// Use wxSashWindow class. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_SASH 1 + +// Use wxSplitterWindow class. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_SPLITTER 1 + +// Use wxToolTip and wxWindow::Set/GetToolTip() methods. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_TOOLTIPS 1 + +// wxValidator class and related methods +#define wxUSE_VALIDATORS 1 + +// ---------------------------------------------------------------------------- +// common dialogs +// ---------------------------------------------------------------------------- + +// On rare occasions (e.g. using DJGPP) may want to omit common dialogs (e.g. +// file selector, printer dialog). Switching this off also switches off the +// printing architecture and interactive wxPrinterDC. +// +// Default is 1 +// +// Recommended setting: 1 (unless it really doesn't work) +#define wxUSE_COMMON_DIALOGS 1 + +// wxBusyInfo displays window with message when app is busy. Works in same way +// as wxBusyCursor +#define wxUSE_BUSYINFO 1 + +// Use single/multiple choice dialogs. +// +// Default is 1 +// +// Recommended setting: 1 (used in the library itself) +#define wxUSE_CHOICEDLG 1 + +// Use colour picker dialog +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_COLOURDLG 1 + +// wxDirDlg class for getting a directory name from user +#define wxUSE_DIRDLG 1 + +// TODO: setting to choose the generic or native one + +// Use file open/save dialogs. +// +// Default is 1 +// +// Recommended setting: 1 (used in many places in the library itself) +#define wxUSE_FILEDLG 1 + +// Use find/replace dialogs. +// +// Default is 1 +// +// Recommended setting: 1 (but may be safely set to 0) +#define wxUSE_FINDREPLDLG 1 + +// Use font picker dialog +// +// Default is 1 +// +// Recommended setting: 1 (used in the library itself) +#define wxUSE_FONTDLG 1 + +// Use wxMessageDialog and wxMessageBox. +// +// Default is 1 +// +// Recommended setting: 1 (used in the library itself) +#define wxUSE_MSGDLG 1 + +// progress dialog class for lengthy operations +#define wxUSE_PROGRESSDLG 1 + +// support for startup tips (wxShowTip &c) +#define wxUSE_STARTUP_TIPS 1 + +// text entry dialog and wxGetTextFromUser function +#define wxUSE_TEXTDLG 1 + +// number entry dialog +#define wxUSE_NUMBERDLG 1 + +// splash screen class +#define wxUSE_SPLASH 1 + +// wizards +#define wxUSE_WIZARDDLG 1 + +// Compile in wxAboutBox() function showing the standard "About" dialog. +// +// Default is 1 +// +// Recommended setting: 1 but can be set to 0 to save some space if you don't +// use this function +#define wxUSE_ABOUTDLG 1 + +// ---------------------------------------------------------------------------- +// Metafiles support +// ---------------------------------------------------------------------------- + +// Windows supports the graphics format known as metafile which is, though not +// portable, is widely used under Windows and so is supported by wxWin (under +// Windows only, of course). Win16 (Win3.1) used the so-called "Window +// MetaFiles" or WMFs which were replaced with "Enhanced MetaFiles" or EMFs in +// Win32 (Win9x, NT, 2000). Both of these are supported in wxWin and, by +// default, WMFs will be used under Win16 and EMFs under Win32. This may be +// changed by setting wxUSE_WIN_METAFILES_ALWAYS to 1 and/or setting +// wxUSE_ENH_METAFILE to 0. You may also set wxUSE_METAFILE to 0 to not compile +// in any metafile related classes at all. +// +// Default is 1 for wxUSE_ENH_METAFILE and 0 for wxUSE_WIN_METAFILES_ALWAYS. +// +// Recommended setting: default or 0 for everything for portable programs. +#define wxUSE_METAFILE 1 +#define wxUSE_ENH_METAFILE 1 +#define wxUSE_WIN_METAFILES_ALWAYS 0 + +// ---------------------------------------------------------------------------- +// Big GUI components +// ---------------------------------------------------------------------------- + +// Set to 0 to disable MDI support. +// +// Requires wxUSE_NOTEBOOK under platforms other than MSW. +// +// Default is 1. +// +// Recommended setting: 1, can be safely set to 0. +#define wxUSE_MDI 1 + +// Set to 0 to disable document/view architecture +#define wxUSE_DOC_VIEW_ARCHITECTURE 1 + +// Set to 0 to disable MDI document/view architecture +// +// Requires wxUSE_MDI && wxUSE_DOC_VIEW_ARCHITECTURE +#define wxUSE_MDI_ARCHITECTURE 1 + +// Set to 0 to disable print/preview architecture code +#define wxUSE_PRINTING_ARCHITECTURE 1 + +// wxHTML sublibrary allows to display HTML in wxWindow programs and much, +// much more. +// +// Default is 1. +// +// Recommended setting: 1 (wxHTML is great!), set to 0 if you want compile a +// smaller library. +#define wxUSE_HTML 1 + +// Setting wxUSE_GLCANVAS to 1 enables OpenGL support. You need to have OpenGL +// headers and libraries to be able to compile the library with wxUSE_GLCANVAS +// set to 1. Note that for some compilers (notably Microsoft Visual C++) you +// will need to manually add opengl32.lib and glu32.lib to the list of +// libraries linked with your program if you use OpenGL. +// +// Default is 0. +// +// Recommended setting: 1 if you intend to use OpenGL, 0 otherwise +#define wxUSE_GLCANVAS 1 + +// wxRichTextCtrl allows editing of styled text. +// +// Default is 1. +// +// Recommended setting: 1, set to 0 if you want compile a +// smaller library. +#define wxUSE_RICHTEXT 1 + +// ---------------------------------------------------------------------------- +// Data transfer +// ---------------------------------------------------------------------------- + +// Use wxClipboard class for clipboard copy/paste. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_CLIPBOARD 1 + +// Use wxDataObject and related classes. Needed for clipboard and OLE drag and +// drop +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_DATAOBJ 1 + +// Use wxDropTarget and wxDropSource classes for drag and drop (this is +// different from "built in" drag and drop in wxTreeCtrl which is always +// available). Requires wxUSE_DATAOBJ. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_DRAG_AND_DROP 1 + +// Use wxAccessible for enhanced and customisable accessibility. +// Depends on wxUSE_OLE. +// +// Default is 0. +// +// Recommended setting (at present): 0 +#define wxUSE_ACCESSIBILITY 0 + +// ---------------------------------------------------------------------------- +// miscellaneous settings +// ---------------------------------------------------------------------------- + +// wxSingleInstanceChecker class allows to verify at startup if another program +// instance is running (it is only available under Win32) +// +// Default is 1 +// +// Recommended setting: 1 (the class is tiny, disabling it won't save much +// space) +#define wxUSE_SNGLINST_CHECKER 1 + +#define wxUSE_DRAGIMAGE 1 + +#define wxUSE_IPC 1 + // 0 for no interprocess comms +#define wxUSE_HELP 1 + // 0 for no help facility + +// Should we use MS HTML help for wxHelpController? If disabled, neither +// wxCHMHelpController nor wxBestHelpController are available. +// +// Default is 1 under MSW, 0 is always used for the other platforms. +// +// Recommended setting: 1, only set to 0 if you have trouble compiling +// wxCHMHelpController (could be a problem with really ancient compilers) +#define wxUSE_MS_HTML_HELP 1 + + +// Use wxHTML-based help controller? +#define wxUSE_WXHTML_HELP 1 + +#define wxUSE_RESOURCES 1 + // 0 for no wxGetResource/wxWriteResource +#define wxUSE_CONSTRAINTS 1 + // 0 for no window layout constraint system + +#define wxUSE_SPLINES 1 + // 0 for no splines + +#define wxUSE_MOUSEWHEEL 1 + // Include mouse wheel support + +// ---------------------------------------------------------------------------- +// postscript support settings +// ---------------------------------------------------------------------------- + +// Set to 1 for PostScript device context. +#define wxUSE_POSTSCRIPT 0 + +// Set to 1 to use font metric files in GetTextExtent +#define wxUSE_AFM_FOR_POSTSCRIPT 1 + +// ---------------------------------------------------------------------------- +// database classes +// ---------------------------------------------------------------------------- + +// Define 1 to use ODBC classes +#define wxUSE_ODBC 1 + +// For backward compatibility reasons, this parameter now only controls the +// default scrolling method used by cursors. This default behavior can be +// overriden by setting the second param of wxDB::wxDbGetConnection() or +// wxDb() constructor to indicate whether the connection (and any wxDbTable()s +// that use the connection) should support forward only scrolling of cursors, +// or both forward and backward support for backward scrolling cursors is +// dependent on the data source as well as the ODBC driver being used. +#define wxODBC_FWD_ONLY_CURSORS 1 + +// Default is 0. Set to 1 to use the deprecated classes, enum types, function, +// member variables. With a setting of 1, full backward compatibility with the +// 2.0.x release is possible. It is STRONGLY recommended that this be set to 0, +// as future development will be done only on the non-deprecated +// functions/classes/member variables/etc. +#define wxODBC_BACKWARD_COMPATABILITY 0 + +// ---------------------------------------------------------------------------- +// other compiler (mis)features +// ---------------------------------------------------------------------------- + +// Set this to 0 if your compiler can't cope with omission of prototype +// parameters. +// +// Default is 1. +// +// Recommended setting: 1 (should never need to set this to 0) +#define REMOVE_UNUSED_ARG 1 + +// VC++ 4.2 and above allows and but you can't mix +// them. Set to 1 for , 0 for . Note that VC++ 7.1 +// and later doesn't support wxUSE_IOSTREAMH == 1 and so will be +// used anyhow. +// +// Default is 1. +// +// Recommended setting: whatever your compiler likes more +#define wxUSE_IOSTREAMH 1 + +// ---------------------------------------------------------------------------- +// image format support +// ---------------------------------------------------------------------------- + +// wxImage supports many different image formats which can be configured at +// compile-time. BMP is always supported, others are optional and can be safely +// disabled if you don't plan to use images in such format sometimes saving +// substantial amount of code in the final library. +// +// Some formats require an extra library which is included in wxWin sources +// which is mentioned if it is the case. + +// Set to 1 for wxImage support (recommended). +#define wxUSE_IMAGE 1 + +// Set to 1 for PNG format support (requires libpng). Also requires wxUSE_ZLIB. +#define wxUSE_LIBPNG 1 + +// Set to 1 for JPEG format support (requires libjpeg) +#define wxUSE_LIBJPEG 1 + +// Set to 1 for TIFF format support (requires libtiff) +#define wxUSE_LIBTIFF 1 + +// Set to 1 for TGA format support (loading only) +#define wxUSE_TGA 1 + +// Set to 1 for GIF format support +#define wxUSE_GIF 1 + +// Set to 1 for PNM format support +#define wxUSE_PNM 1 + +// Set to 1 for PCX format support +#define wxUSE_PCX 1 + +// Set to 1 for IFF format support (Amiga format) +#define wxUSE_IFF 0 + +// Set to 1 for XPM format support +#define wxUSE_XPM 1 + +// Set to 1 for MS Icons and Cursors format support +#define wxUSE_ICO_CUR 1 + +// Set to 1 to compile in wxPalette class +#define wxUSE_PALETTE 1 + +// ---------------------------------------------------------------------------- +// wxUniversal-only options +// ---------------------------------------------------------------------------- + +// Set to 1 to enable compilation of all themes, this is the default +#define wxUSE_ALL_THEMES 1 + +// Set to 1 to enable the compilation of individual theme if wxUSE_ALL_THEMES +// is unset, if it is set these options are not used; notice that metal theme +// uses Win32 one +#define wxUSE_THEME_GTK 0 +#define wxUSE_THEME_METAL 0 +#define wxUSE_THEME_MONO 0 +#define wxUSE_THEME_WIN32 0 + + +/* --- end common options --- */ + +// ---------------------------------------------------------------------------- +// Windows-only settings +// ---------------------------------------------------------------------------- + +// Set wxUSE_UNICODE_MSLU to 1 if you're compiling wxWidgets in Unicode mode +// and want to run your programs under Windows 9x and not only NT/2000/XP. +// This setting enables use of unicows.dll from MSLU (MS Layer for Unicode, see +// http://www.microsoft.com/globaldev/handson/dev/mslu_announce.mspx). Note +// that you will have to modify the makefiles to include unicows.lib import +// library as the first library (see installation instructions in install.txt +// to learn how to do it when building the library or samples). +// +// If your compiler doesn't have unicows.lib, you can get a version of it at +// http://libunicows.sourceforge.net +// +// Default is 0 +// +// Recommended setting: 0 (1 if you want to deploy Unicode apps on 9x systems) +#ifndef wxUSE_UNICODE_MSLU + #define wxUSE_UNICODE_MSLU 0 +#endif + +// Set this to 1 if you want to use wxWidgets and MFC in the same program. This +// will override some other settings (see below) +// +// Default is 0. +// +// Recommended setting: 0 unless you really have to use MFC +#define wxUSE_MFC 0 + +// Set this to 1 for generic OLE support: this is required for drag-and-drop, +// clipboard, OLE Automation. Only set it to 0 if your compiler is very old and +// can't compile/doesn't have the OLE headers. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_OLE 1 + +// Set this to 1 to enable wxAutomationObject class. +// +// Default is 1. +// +// Recommended setting: 1 if you need to control other applications via OLE +// Automation, can be safely set to 0 otherwise +#define wxUSE_OLE_AUTOMATION 1 + +// Set this to 1 to enable wxActiveXContainer class allowing to embed OLE +// controls in wx. +// +// Default is 1. +// +// Recommended setting: 1, required by wxMediaCtrl +#define wxUSE_ACTIVEX 1 + +// wxDC cacheing implementation +#define wxUSE_DC_CACHEING 1 + +// Set this to 1 to enable the use of DIB's for wxBitmap to support +// bitmaps > 16MB on Win95/98/Me. Set to 0 to use DDB's only. +#define wxUSE_DIB_FOR_BITMAP 0 + +// Set this to 1 to enable wxDIB class used internally for manipulating +// wxBitmao data. +// +// Default is 1, set it to 0 only if you don't use wxImage neither +// +// Recommended setting: 1 (without it conversion to/from wxImage won't work) +#define wxUSE_WXDIB 1 + +// Set to 0 to disable PostScript print/preview architecture code under Windows +// (just use Windows printing). +#define wxUSE_POSTSCRIPT_ARCHITECTURE_IN_MSW 1 + +// Set this to 1 to use RICHEDIT controls for wxTextCtrl with style wxTE_RICH +// which allows to put more than ~32Kb of text in it even under Win9x (NT +// doesn't have such limitation). +// +// Default is 1 for compilers which support it +// +// Recommended setting: 1, only set it to 0 if your compiler doesn't have +// or can't compile +#define wxUSE_RICHEDIT 1 + +// Set this to 1 to use extra features of richedit v2 and later controls +// +// Default is 1 for compilers which support it +// +// Recommended setting: 1 +#define wxUSE_RICHEDIT2 1 + +// Set this to 1 to enable support for the owner-drawn menu and listboxes. This +// is required by wxUSE_CHECKLISTBOX. +// +// Default is 1. +// +// Recommended setting: 1, set to 0 for a small library size reduction +#define wxUSE_OWNER_DRAWN 1 + +// Set to 1 to compile MS Windows XP theme engine support +#define wxUSE_UXTHEME 1 + +// Set to 1 to auto-adapt to MS Windows XP themes where possible +// (notably, wxNotebook pages) +#define wxUSE_UXTHEME_AUTO 1 + +// Set to 1 to use InkEdit control (Tablet PC), if available +#define wxUSE_INKEDIT 1 + +// ---------------------------------------------------------------------------- +// Generic versions of native controls +// ---------------------------------------------------------------------------- + +// Set this to 1 to be able to use wxDatePickerCtrlGeneric in addition to the +// native wxDatePickerCtrl +// +// Default is 0. +// +// Recommended setting: 0, this is mainly used for testing +#define wxUSE_DATEPICKCTRL_GENERIC 0 + +// ---------------------------------------------------------------------------- +// Crash debugging helpers +// ---------------------------------------------------------------------------- + +// Set this to 1 to be able to use wxCrashReport::Generate() to create mini +// dumps of your program when it crashes (or at any other moment) +// +// Default is 1 if supported by the compiler (VC++ and recent BC++ only). +// +// Recommended setting: 1, set to 0 if your programs never crash +#define wxUSE_CRASHREPORT 1 + +// ---------------------------------------------------------------------------- +// obsolete settings +// ---------------------------------------------------------------------------- + +// NB: all settings in this section are obsolete and should not be used/changed +// at all, they will disappear + +// Define 1 to use bitmap messages. +#define wxUSE_BITMAP_MESSAGE 1 + +#endif // _WX_SETUP_H_ + diff --git a/Externals/wxWidgets/src/common/accesscmn.cpp b/Externals/wxWidgets/src/common/accesscmn.cpp new file mode 100644 index 0000000000..14135977e9 --- /dev/null +++ b/Externals/wxWidgets/src/common/accesscmn.cpp @@ -0,0 +1,26 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: common/accesscmn.cpp +// Author: Julian Smart +// Modified by: +// Created: 2003-02-12 +// RCS-ID: $Id: accesscmn.cpp 35650 2005-09-23 12:56:45Z MR $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_ACCESSIBILITY + +#include "wx/access.h" + +#endif + diff --git a/Externals/wxWidgets/src/common/anidecod.cpp b/Externals/wxWidgets/src/common/anidecod.cpp new file mode 100644 index 0000000000..f10817c583 --- /dev/null +++ b/Externals/wxWidgets/src/common/anidecod.cpp @@ -0,0 +1,345 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/anidecod.cpp +// Purpose: wxANIDecoder, ANI reader for wxImage and wxAnimation +// Author: Francesco Montorsi +// RCS-ID: $Id: anidecod.cpp 43898 2006-12-10 14:18:37Z VZ $ +// Copyright: (c) Francesco Montorsi +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_STREAMS && wxUSE_ICO_CUR + +#include "wx/anidecod.h" + +#ifndef WX_PRECOMP + #include "wx/palette.h" +#endif + +#include +#include + +// static +wxCURHandler wxANIDecoder::sm_handler; + +//--------------------------------------------------------------------------- +// wxANIFrameInfo +//--------------------------------------------------------------------------- + +class wxANIFrameInfo +{ +public: + wxANIFrameInfo(unsigned int delay = 0, int idx = -1) + { m_delay=delay; m_imageIndex=idx; } + + unsigned int m_delay; + int m_imageIndex; +}; + +#include "wx/arrimpl.cpp" // this is a magic incantation which must be done! +WX_DEFINE_OBJARRAY(wxImageArray) + +#include "wx/arrimpl.cpp" // this is a magic incantation which must be done! +WX_DEFINE_OBJARRAY(wxANIFrameInfoArray) + + +//--------------------------------------------------------------------------- +// wxANIDecoder +//--------------------------------------------------------------------------- + +wxANIDecoder::wxANIDecoder() +{ +} + +wxANIDecoder::~wxANIDecoder() +{ +} + +bool wxANIDecoder::ConvertToImage(unsigned int frame, wxImage *image) const +{ + unsigned int idx = m_info[frame].m_imageIndex; + *image = m_images[idx]; // copy + return image->IsOk(); +} + + +//--------------------------------------------------------------------------- +// Data accessors +//--------------------------------------------------------------------------- + +wxSize wxANIDecoder::GetFrameSize(unsigned int WXUNUSED(frame)) const +{ + // all frames are of the same size... + return m_szAnimation; +} + +wxPoint wxANIDecoder::GetFramePosition(unsigned int WXUNUSED(frame)) const +{ + // all frames are of the same size... + return wxPoint(0,0); +} + +wxAnimationDisposal wxANIDecoder::GetDisposalMethod(unsigned int WXUNUSED(frame)) const +{ + // this disposal is implicit for all frames inside an ANI file + return wxANIM_TOBACKGROUND; +} + +long wxANIDecoder::GetDelay(unsigned int frame) const +{ + return m_info[frame].m_delay; +} + +wxColour wxANIDecoder::GetTransparentColour(unsigned int frame) const +{ + unsigned int idx = m_info[frame].m_imageIndex; + + if (!m_images[idx].HasMask()) + return wxNullColour; + + return wxColour(m_images[idx].GetMaskRed(), + m_images[idx].GetMaskGreen(), + m_images[idx].GetMaskBlue()); +} + + +//--------------------------------------------------------------------------- +// ANI reading and decoding +//--------------------------------------------------------------------------- + +bool wxANIDecoder::CanRead(wxInputStream& stream) const +{ + wxInt32 FCC1, FCC2; + wxUint32 datalen ; + + wxInt32 riff32; + memcpy( &riff32, "RIFF", 4 ); + wxInt32 list32; + memcpy( &list32, "LIST", 4 ); + wxInt32 ico32; + memcpy( &ico32, "icon", 4 ); + wxInt32 anih32; + memcpy( &anih32, "anih", 4 ); + + stream.SeekI(0); + if ( !stream.Read(&FCC1, 4) ) + return false; + + if ( FCC1 != riff32 ) + return false; + + // we have a riff file: + while ( stream.IsOk() ) + { + if ( FCC1 == anih32 ) + return true; // found the ANIH chunk - this should be an ANI file + + // we always have a data size: + stream.Read(&datalen, 4); + datalen = wxINT32_SWAP_ON_BE(datalen) ; + + // data should be padded to make even number of bytes + if (datalen % 2 == 1) datalen ++ ; + + // now either data or a FCC: + if ( (FCC1 == riff32) || (FCC1 == list32) ) + { + stream.Read(&FCC2, 4); + } + else + { + stream.SeekI(stream.TellI() + datalen); + } + + // try to read next data chunk: + if ( !stream.Read(&FCC1, 4) ) + { + // reading failed -- either EOF or IO error, bail out anyhow + return false; + } + } + + return false; +} + +// the "anih" RIFF chunk +struct wxANIHeader +{ + wxInt32 cbSizeOf; // Num bytes in AniHeader (36 bytes) + wxInt32 cFrames; // Number of unique Icons in this cursor + wxInt32 cSteps; // Number of Blits before the animation cycles + wxInt32 cx; // width of the frames + wxInt32 cy; // height of the frames + wxInt32 cBitCount; // bit depth + wxInt32 cPlanes; // 1 + wxInt32 JifRate; // Default Jiffies (1/60th of a second) if rate chunk not present. + wxInt32 flags; // Animation Flag (see AF_ constants) + + // ANI files are always little endian so we need to swap bytes on big + // endian architectures +#ifdef WORDS_BIGENDIAN + void AdjustEndianness() + { + // this works because all our fields are wxInt32 and they must be + // packed without holes between them (if they're not, they wouldn't map + // to the file header!) + wxInt32 * const start = (wxInt32 *)this; + wxInt32 * const end = start + sizeof(wxANIHeader)/sizeof(wxInt32); + for ( wxInt32 *p = start; p != end; p++ ) + { + *p = wxINT32_SWAP_ALWAYS(*p); + } + } +#else + void AdjustEndianness() { } +#endif +}; + +bool wxANIDecoder::Load( wxInputStream& stream ) +{ + wxInt32 FCC1, FCC2; + wxUint32 datalen; + unsigned int globaldelay=0; + + wxInt32 riff32; + memcpy( &riff32, "RIFF", 4 ); + wxInt32 list32; + memcpy( &list32, "LIST", 4 ); + wxInt32 ico32; + memcpy( &ico32, "icon", 4 ); + wxInt32 anih32; + memcpy( &anih32, "anih", 4 ); + wxInt32 rate32; + memcpy( &rate32, "rate", 4 ); + wxInt32 seq32; + memcpy( &seq32, "seq ", 4 ); + + stream.SeekI(0); + stream.Read(&FCC1, 4); + if ( FCC1 != riff32 ) + return false; + + m_nFrames = 0; + m_szAnimation = wxDefaultSize; + + m_images.Clear(); + m_info.Clear(); + + // we have a riff file: + while ( stream.IsOk() ) + { + // we always have a data size: + stream.Read(&datalen, 4); + datalen = wxINT32_SWAP_ON_BE(datalen); + + //data should be padded to make even number of bytes + if (datalen % 2 == 1) datalen++; + + // now either data or a FCC: + if ( (FCC1 == riff32) || (FCC1 == list32) ) + { + stream.Read(&FCC2, 4); + } + else if ( FCC1 == anih32 ) + { + if ( datalen != sizeof(wxANIHeader) ) + return false; + + if (m_nFrames > 0) + return false; // already parsed an ani header? + + struct wxANIHeader header; + stream.Read(&header, sizeof(wxANIHeader)); + header.AdjustEndianness(); + + // we should have a global frame size + m_szAnimation = wxSize(header.cx, header.cy); + + // save interesting info from the header + m_nFrames = header.cSteps; // NB: not cFrames!! + if ( m_nFrames == 0 ) + return false; + + globaldelay = header.JifRate * 1000 / 60; + + m_images.Alloc(header.cFrames); + m_info.Add(wxANIFrameInfo(), m_nFrames); + } + else if ( FCC1 == rate32 ) + { + // did we already process the anih32 chunk? + if (m_nFrames == 0) + return false; // rate chunks should always be placed after anih chunk + + wxASSERT(m_info.GetCount() == m_nFrames); + for (unsigned int i=0; i +// License: wxWindows license +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// for compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#ifndef WX_PRECOMP + #ifdef __WXMSW__ + #include "wx/msw/wrapwin.h" // includes windows.h for MessageBox() + #endif + #include "wx/list.h" + #include "wx/app.h" + #include "wx/intl.h" + #include "wx/log.h" + #include "wx/utils.h" +#endif //WX_PRECOMP + +#include "wx/apptrait.h" +#include "wx/cmdline.h" +#include "wx/confbase.h" +#include "wx/filename.h" +#include "wx/msgout.h" +#include "wx/tokenzr.h" + +#if !defined(__WXMSW__) || defined(__WXMICROWIN__) + #include // for SIGTRAP used by wxTrap() +#endif //Win/Unix + +#if wxUSE_FONTMAP + #include "wx/fontmap.h" +#endif // wxUSE_FONTMAP + +#if defined(__DARWIN__) && defined(_MSL_USING_MW_C_HEADERS) && _MSL_USING_MW_C_HEADERS + // For MacTypes.h for Debugger function + #include +#endif + +#if defined(__WXMAC__) + #ifdef __DARWIN__ + #include + #else + #include "wx/mac/private.h" // includes mac headers + #endif +#endif // __WXMAC__ + +#ifdef __WXDEBUG__ + #if wxUSE_STACKWALKER + #include "wx/stackwalk.h" + #ifdef __WXMSW__ + #include "wx/msw/debughlp.h" + #endif + #endif // wxUSE_STACKWALKER +#endif // __WXDEBUG__ + +// wxABI_VERSION can be defined when compiling applications but it should be +// left undefined when compiling the library itself, it is then set to its +// default value in version.h +#if wxABI_VERSION != wxMAJOR_VERSION * 10000 + wxMINOR_VERSION * 100 + 99 +#error "wxABI_VERSION should not be defined when compiling the library" +#endif + +// ---------------------------------------------------------------------------- +// private functions prototypes +// ---------------------------------------------------------------------------- + +#ifdef __WXDEBUG__ + // really just show the assert dialog + static bool DoShowAssertDialog(const wxString& msg); + + // prepare for showing the assert dialog, use the given traits or + // DoShowAssertDialog() as last fallback to really show it + static + void ShowAssertDialog(const wxChar *szFile, + int nLine, + const wxChar *szFunc, + const wxChar *szCond, + const wxChar *szMsg, + wxAppTraits *traits = NULL); + + // turn on the trace masks specified in the env variable WXTRACE + static void LINKAGEMODE SetTraceMasks(); +#endif // __WXDEBUG__ + +// ---------------------------------------------------------------------------- +// global vars +// ---------------------------------------------------------------------------- + +wxAppConsole *wxAppConsole::ms_appInstance = NULL; + +wxAppInitializerFunction wxAppConsole::ms_appInitFn = NULL; + +// ============================================================================ +// wxAppConsole implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// ctor/dtor +// ---------------------------------------------------------------------------- + +wxAppConsole::wxAppConsole() +{ + m_traits = NULL; + + ms_appInstance = this; + +#ifdef __WXDEBUG__ + SetTraceMasks(); +#if wxUSE_UNICODE + // In unicode mode the SetTraceMasks call can cause an apptraits to be + // created, but since we are still in the constructor the wrong kind will + // be created for GUI apps. Destroy it so it can be created again later. + delete m_traits; + m_traits = NULL; +#endif +#endif +} + +wxAppConsole::~wxAppConsole() +{ + delete m_traits; +} + +// ---------------------------------------------------------------------------- +// initilization/cleanup +// ---------------------------------------------------------------------------- + +bool wxAppConsole::Initialize(int& argcOrig, wxChar **argvOrig) +{ + // remember the command line arguments + argc = argcOrig; + argv = argvOrig; + +#ifndef __WXPALMOS__ + if ( m_appName.empty() && argv ) + { + // the application name is, by default, the name of its executable file + wxFileName::SplitPath(argv[0], NULL, &m_appName, NULL); + } +#endif + + return true; +} + +void wxAppConsole::CleanUp() +{ +} + +// ---------------------------------------------------------------------------- +// OnXXX() callbacks +// ---------------------------------------------------------------------------- + +bool wxAppConsole::OnInit() +{ +#if wxUSE_CMDLINE_PARSER + wxCmdLineParser parser(argc, argv); + + OnInitCmdLine(parser); + + bool cont; + switch ( parser.Parse(false /* don't show usage */) ) + { + case -1: + cont = OnCmdLineHelp(parser); + break; + + case 0: + cont = OnCmdLineParsed(parser); + break; + + default: + cont = OnCmdLineError(parser); + break; + } + + if ( !cont ) + return false; +#endif // wxUSE_CMDLINE_PARSER + + return true; +} + +int wxAppConsole::OnExit() +{ +#if wxUSE_CONFIG + // delete the config object if any (don't use Get() here, but Set() + // because Get() could create a new config object) + delete wxConfigBase::Set((wxConfigBase *) NULL); +#endif // wxUSE_CONFIG + + return 0; +} + +void wxAppConsole::Exit() +{ + exit(-1); +} + +// ---------------------------------------------------------------------------- +// traits stuff +// ---------------------------------------------------------------------------- + +wxAppTraits *wxAppConsole::CreateTraits() +{ + return new wxConsoleAppTraits; +} + +wxAppTraits *wxAppConsole::GetTraits() +{ + // FIXME-MT: protect this with a CS? + if ( !m_traits ) + { + m_traits = CreateTraits(); + + wxASSERT_MSG( m_traits, _T("wxApp::CreateTraits() failed?") ); + } + + return m_traits; +} + +// we must implement CreateXXX() in wxApp itself for backwards compatibility +#if WXWIN_COMPATIBILITY_2_4 + +#if wxUSE_LOG + +wxLog *wxAppConsole::CreateLogTarget() +{ + wxAppTraits *traits = GetTraits(); + return traits ? traits->CreateLogTarget() : NULL; +} + +#endif // wxUSE_LOG + +wxMessageOutput *wxAppConsole::CreateMessageOutput() +{ + wxAppTraits *traits = GetTraits(); + return traits ? traits->CreateMessageOutput() : NULL; +} + +#endif // WXWIN_COMPATIBILITY_2_4 + +// ---------------------------------------------------------------------------- +// event processing +// ---------------------------------------------------------------------------- + +void wxAppConsole::ProcessPendingEvents() +{ +#if wxUSE_THREADS + if ( !wxPendingEventsLocker ) + return; +#endif + + // ensure that we're the only thread to modify the pending events list + wxENTER_CRIT_SECT( *wxPendingEventsLocker ); + + if ( !wxPendingEvents ) + { + wxLEAVE_CRIT_SECT( *wxPendingEventsLocker ); + return; + } + + // iterate until the list becomes empty + wxList::compatibility_iterator node = wxPendingEvents->GetFirst(); + while (node) + { + wxEvtHandler *handler = (wxEvtHandler *)node->GetData(); + wxPendingEvents->Erase(node); + + // In ProcessPendingEvents(), new handlers might be add + // and we can safely leave the critical section here. + wxLEAVE_CRIT_SECT( *wxPendingEventsLocker ); + + handler->ProcessPendingEvents(); + + wxENTER_CRIT_SECT( *wxPendingEventsLocker ); + + node = wxPendingEvents->GetFirst(); + } + + wxLEAVE_CRIT_SECT( *wxPendingEventsLocker ); +} + +int wxAppConsole::FilterEvent(wxEvent& WXUNUSED(event)) +{ + // process the events normally by default + return -1; +} + +// ---------------------------------------------------------------------------- +// exception handling +// ---------------------------------------------------------------------------- + +#if wxUSE_EXCEPTIONS + +void +wxAppConsole::HandleEvent(wxEvtHandler *handler, + wxEventFunction func, + wxEvent& event) const +{ + // by default, simply call the handler + (handler->*func)(event); +} + +#endif // wxUSE_EXCEPTIONS + +// ---------------------------------------------------------------------------- +// cmd line parsing +// ---------------------------------------------------------------------------- + +#if wxUSE_CMDLINE_PARSER + +#define OPTION_VERBOSE _T("verbose") + +void wxAppConsole::OnInitCmdLine(wxCmdLineParser& parser) +{ + // the standard command line options + static const wxCmdLineEntryDesc cmdLineDesc[] = + { + { + wxCMD_LINE_SWITCH, + _T("h"), + _T("help"), + gettext_noop("show this help message"), + wxCMD_LINE_VAL_NONE, + wxCMD_LINE_OPTION_HELP + }, + +#if wxUSE_LOG + { + wxCMD_LINE_SWITCH, + wxEmptyString, + OPTION_VERBOSE, + gettext_noop("generate verbose log messages"), + wxCMD_LINE_VAL_NONE, + 0x0 + }, +#endif // wxUSE_LOG + + // terminator + { + wxCMD_LINE_NONE, + wxEmptyString, + wxEmptyString, + wxEmptyString, + wxCMD_LINE_VAL_NONE, + 0x0 + } + }; + + parser.SetDesc(cmdLineDesc); +} + +bool wxAppConsole::OnCmdLineParsed(wxCmdLineParser& parser) +{ +#if wxUSE_LOG + if ( parser.Found(OPTION_VERBOSE) ) + { + wxLog::SetVerbose(true); + } +#else + wxUnusedVar(parser); +#endif // wxUSE_LOG + + return true; +} + +bool wxAppConsole::OnCmdLineHelp(wxCmdLineParser& parser) +{ + parser.Usage(); + + return false; +} + +bool wxAppConsole::OnCmdLineError(wxCmdLineParser& parser) +{ + parser.Usage(); + + return false; +} + +#endif // wxUSE_CMDLINE_PARSER + +// ---------------------------------------------------------------------------- +// debugging support +// ---------------------------------------------------------------------------- + +/* static */ +bool wxAppConsole::CheckBuildOptions(const char *optionsSignature, + const char *componentName) +{ +#if 0 // can't use wxLogTrace, not up and running yet + printf("checking build options object '%s' (ptr %p) in '%s'\n", + optionsSignature, optionsSignature, componentName); +#endif + + if ( strcmp(optionsSignature, WX_BUILD_OPTIONS_SIGNATURE) != 0 ) + { + wxString lib = wxString::FromAscii(WX_BUILD_OPTIONS_SIGNATURE); + wxString prog = wxString::FromAscii(optionsSignature); + wxString progName = wxString::FromAscii(componentName); + wxString msg; + + msg.Printf(_T("Mismatch between the program and library build versions detected.\nThe library used %s,\nand %s used %s."), + lib.c_str(), progName.c_str(), prog.c_str()); + + wxLogFatalError(msg.c_str()); + + // normally wxLogFatalError doesn't return + return false; + } +#undef wxCMP + + return true; +} + +#ifdef __WXDEBUG__ + +void wxAppConsole::OnAssertFailure(const wxChar *file, + int line, + const wxChar *func, + const wxChar *cond, + const wxChar *msg) +{ + ShowAssertDialog(file, line, func, cond, msg, GetTraits()); +} + +void wxAppConsole::OnAssert(const wxChar *file, + int line, + const wxChar *cond, + const wxChar *msg) +{ + OnAssertFailure(file, line, NULL, cond, msg); +} + +#endif // __WXDEBUG__ + +#if WXWIN_COMPATIBILITY_2_4 + +bool wxAppConsole::CheckBuildOptions(const wxBuildOptions& buildOptions) +{ + return CheckBuildOptions(buildOptions.m_signature, "your program"); +} + +#endif + +// ============================================================================ +// other classes implementations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxConsoleAppTraitsBase +// ---------------------------------------------------------------------------- + +#if wxUSE_LOG + +wxLog *wxConsoleAppTraitsBase::CreateLogTarget() +{ + return new wxLogStderr; +} + +#endif // wxUSE_LOG + +wxMessageOutput *wxConsoleAppTraitsBase::CreateMessageOutput() +{ + return new wxMessageOutputStderr; +} + +#if wxUSE_FONTMAP + +wxFontMapper *wxConsoleAppTraitsBase::CreateFontMapper() +{ + return (wxFontMapper *)new wxFontMapperBase; +} + +#endif // wxUSE_FONTMAP + +wxRendererNative *wxConsoleAppTraitsBase::CreateRenderer() +{ + // console applications don't use renderers + return NULL; +} + +#ifdef __WXDEBUG__ +bool wxConsoleAppTraitsBase::ShowAssertDialog(const wxString& msg) +{ + return wxAppTraitsBase::ShowAssertDialog(msg); +} +#endif + +bool wxConsoleAppTraitsBase::HasStderr() +{ + // console applications always have stderr, even under Mac/Windows + return true; +} + +void wxConsoleAppTraitsBase::ScheduleForDestroy(wxObject *object) +{ + delete object; +} + +void wxConsoleAppTraitsBase::RemoveFromPendingDelete(wxObject * WXUNUSED(object)) +{ + // nothing to do +} + +#if wxUSE_SOCKETS +GSocketGUIFunctionsTable* wxConsoleAppTraitsBase::GetSocketGUIFunctionsTable() +{ + return NULL; +} +#endif + +// ---------------------------------------------------------------------------- +// wxAppTraits +// ---------------------------------------------------------------------------- + +#ifdef __WXDEBUG__ + +bool wxAppTraitsBase::ShowAssertDialog(const wxString& msgOriginal) +{ + wxString msg = msgOriginal; + +#if wxUSE_STACKWALKER +#if !defined(__WXMSW__) + // on Unix stack frame generation may take some time, depending on the + // size of the executable mainly... warn the user that we are working + wxFprintf(stderr, wxT("[Debug] Generating a stack trace... please wait")); + fflush(stderr); +#endif + + const wxString stackTrace = GetAssertStackTrace(); + if ( !stackTrace.empty() ) + msg << _T("\n\nCall stack:\n") << stackTrace; +#endif // wxUSE_STACKWALKER + + return DoShowAssertDialog(msg); +} + +#if wxUSE_STACKWALKER +wxString wxAppTraitsBase::GetAssertStackTrace() +{ + wxString stackTrace; + + class StackDump : public wxStackWalker + { + public: + StackDump() { } + + const wxString& GetStackTrace() const { return m_stackTrace; } + + protected: + virtual void OnStackFrame(const wxStackFrame& frame) + { + m_stackTrace << wxString::Format + ( + _T("[%02d] "), + wx_truncate_cast(int, frame.GetLevel()) + ); + + wxString name = frame.GetName(); + if ( !name.empty() ) + { + m_stackTrace << wxString::Format(_T("%-40s"), name.c_str()); + } + else + { + m_stackTrace << wxString::Format(_T("%p"), frame.GetAddress()); + } + + if ( frame.HasSourceLocation() ) + { + m_stackTrace << _T('\t') + << frame.GetFileName() + << _T(':') + << frame.GetLine(); + } + + m_stackTrace << _T('\n'); + } + + private: + wxString m_stackTrace; + }; + + // don't show more than maxLines or we could get a dialog too tall to be + // shown on screen: 20 should be ok everywhere as even with 15 pixel high + // characters it is still only 300 pixels... + static const int maxLines = 20; + + StackDump dump; + dump.Walk(2, maxLines); // don't show OnAssert() call itself + stackTrace = dump.GetStackTrace(); + + const int count = stackTrace.Freq(wxT('\n')); + for ( int i = 0; i < count - maxLines; i++ ) + stackTrace = stackTrace.BeforeLast(wxT('\n')); + + return stackTrace; +} +#endif // wxUSE_STACKWALKER + + +#endif // __WXDEBUG__ + +// ============================================================================ +// global functions implementation +// ============================================================================ + +void wxExit() +{ + if ( wxTheApp ) + { + wxTheApp->Exit(); + } + else + { + // what else can we do? + exit(-1); + } +} + +void wxWakeUpIdle() +{ + if ( wxTheApp ) + { + wxTheApp->WakeUpIdle(); + } + //else: do nothing, what can we do? +} + +#ifdef __WXDEBUG__ + +// wxASSERT() helper +bool wxAssertIsEqual(int x, int y) +{ + return x == y; +} + +// break into the debugger +void wxTrap() +{ +#if defined(__WXMSW__) && !defined(__WXMICROWIN__) + DebugBreak(); +#elif defined(__WXMAC__) && !defined(__DARWIN__) + #if __powerc + Debugger(); + #else + SysBreak(); + #endif +#elif defined(_MSL_USING_MW_C_HEADERS) && _MSL_USING_MW_C_HEADERS + Debugger(); +#elif defined(__UNIX__) + raise(SIGTRAP); +#else + // TODO +#endif // Win/Unix +} + +// this function is called when an assert fails +void wxOnAssert(const wxChar *szFile, + int nLine, + const char *szFunc, + const wxChar *szCond, + const wxChar *szMsg) +{ + // FIXME MT-unsafe + static bool s_bInAssert = false; + + if ( s_bInAssert ) + { + // He-e-e-e-elp!! we're trapped in endless loop + wxTrap(); + + s_bInAssert = false; + + return; + } + + s_bInAssert = true; + + // __FUNCTION__ is always in ASCII, convert it to wide char if needed + const wxString strFunc = wxString::FromAscii(szFunc); + + if ( !wxTheApp ) + { + // by default, show the assert dialog box -- we can't customize this + // behaviour + ShowAssertDialog(szFile, nLine, strFunc, szCond, szMsg); + } + else + { + // let the app process it as it wants + wxTheApp->OnAssertFailure(szFile, nLine, strFunc, szCond, szMsg); + } + + s_bInAssert = false; +} + +#endif // __WXDEBUG__ + +// ============================================================================ +// private functions implementation +// ============================================================================ + +#ifdef __WXDEBUG__ + +static void LINKAGEMODE SetTraceMasks() +{ +#if wxUSE_LOG + wxString mask; + if ( wxGetEnv(wxT("WXTRACE"), &mask) ) + { + wxStringTokenizer tkn(mask, wxT(",;:")); + while ( tkn.HasMoreTokens() ) + wxLog::AddTraceMask(tkn.GetNextToken()); + } +#endif // wxUSE_LOG +} + +bool DoShowAssertDialog(const wxString& msg) +{ + // under MSW we can show the dialog even in the console mode +#if defined(__WXMSW__) && !defined(__WXMICROWIN__) + wxString msgDlg(msg); + + // this message is intentionally not translated -- it is for + // developpers only + msgDlg += wxT("\nDo you want to stop the program?\n") + wxT("You can also choose [Cancel] to suppress ") + wxT("further warnings."); + + switch ( ::MessageBox(NULL, msgDlg, _T("wxWidgets Debug Alert"), + MB_YESNOCANCEL | MB_ICONSTOP ) ) + { + case IDYES: + wxTrap(); + break; + + case IDCANCEL: + // stop the asserts + return true; + + //case IDNO: nothing to do + } +#else // !__WXMSW__ + wxFprintf(stderr, wxT("%s\n"), msg.c_str()); + fflush(stderr); + + // TODO: ask the user to enter "Y" or "N" on the console? + wxTrap(); +#endif // __WXMSW__/!__WXMSW__ + + // continue with the asserts + return false; +} + +// show the assert modal dialog +static +void ShowAssertDialog(const wxChar *szFile, + int nLine, + const wxChar *szFunc, + const wxChar *szCond, + const wxChar *szMsg, + wxAppTraits *traits) +{ + // this variable can be set to true to suppress "assert failure" messages + static bool s_bNoAsserts = false; + + wxString msg; + msg.reserve(2048); + + // make life easier for people using VC++ IDE by using this format: like + // this, clicking on the message will take us immediately to the place of + // the failed assert + msg.Printf(wxT("%s(%d): assert \"%s\" failed"), szFile, nLine, szCond); + + // add the function name, if any + if ( szFunc && *szFunc ) + msg << _T(" in ") << szFunc << _T("()"); + + // and the message itself + if ( szMsg ) + { + msg << _T(": ") << szMsg; + } + else // no message given + { + msg << _T('.'); + } + +#if wxUSE_THREADS + // if we are not in the main thread, output the assert directly and trap + // since dialogs cannot be displayed + if ( !wxThread::IsMain() ) + { + msg += wxT(" [in child thread]"); + +#if defined(__WXMSW__) && !defined(__WXMICROWIN__) + msg << wxT("\r\n"); + OutputDebugString(msg ); +#else + // send to stderr + wxFprintf(stderr, wxT("%s\n"), msg.c_str()); + fflush(stderr); +#endif + // He-e-e-e-elp!! we're asserting in a child thread + wxTrap(); + } + else +#endif // wxUSE_THREADS + + if ( !s_bNoAsserts ) + { + // send it to the normal log destination + wxLogDebug(_T("%s"), msg.c_str()); + + if ( traits ) + { + // delegate showing assert dialog (if possible) to that class + s_bNoAsserts = traits->ShowAssertDialog(msg); + } + else // no traits object + { + // fall back to the function of last resort + s_bNoAsserts = DoShowAssertDialog(msg); + } + } +} + +#endif // __WXDEBUG__ diff --git a/Externals/wxWidgets/src/common/appcmn.cpp b/Externals/wxWidgets/src/common/appcmn.cpp new file mode 100644 index 0000000000..c5ef802e99 --- /dev/null +++ b/Externals/wxWidgets/src/common/appcmn.cpp @@ -0,0 +1,691 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/appcmn.cpp +// Purpose: wxAppConsole and wxAppBase methods common to all platforms +// Author: Vadim Zeitlin +// Modified by: +// Created: 18.10.99 +// RCS-ID: $Id: appcmn.cpp 47229 2007-07-08 05:31:32Z PC $ +// Copyright: (c) Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// --------------------------------------------------------------------------- +// headers +// --------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#if defined(__BORLANDC__) + #pragma hdrstop +#endif + +#ifndef WX_PRECOMP + #include "wx/app.h" + #include "wx/window.h" + #include "wx/bitmap.h" + #include "wx/log.h" + #include "wx/msgdlg.h" + #include "wx/confbase.h" + #include "wx/utils.h" +#endif + +#include "wx/apptrait.h" +#include "wx/cmdline.h" +#include "wx/evtloop.h" +#include "wx/msgout.h" +#include "wx/thread.h" +#include "wx/vidmode.h" +#include "wx/ptr_scpd.h" + +#ifdef __WXDEBUG__ + #if wxUSE_STACKWALKER + #include "wx/stackwalk.h" + #endif // wxUSE_STACKWALKER +#endif // __WXDEBUG__ + +#if defined(__WXMSW__) + #include "wx/msw/private.h" // includes windows.h for LOGFONT +#endif + +#if defined(__WXMAC__) + #include "wx/mac/private.h" +#endif + +#if wxUSE_FONTMAP + #include "wx/fontmap.h" +#endif // wxUSE_FONTMAP + +// DLL options compatibility check: +#include "wx/build.h" +WX_CHECK_BUILD_OPTIONS("wxCore") + +WXDLLIMPEXP_DATA_CORE(wxList) wxPendingDelete; + +// ---------------------------------------------------------------------------- +// wxEventLoopPtr +// ---------------------------------------------------------------------------- + +// this defines wxEventLoopPtr +wxDEFINE_TIED_SCOPED_PTR_TYPE(wxEventLoop) + +// ============================================================================ +// wxAppBase implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// initialization +// ---------------------------------------------------------------------------- + +wxAppBase::wxAppBase() +{ + m_topWindow = (wxWindow *)NULL; + + m_useBestVisual = false; + m_forceTrueColour = false; + + m_isActive = true; + + m_mainLoop = NULL; + + // We don't want to exit the app if the user code shows a dialog from its + // OnInit() -- but this is what would happen if we set m_exitOnFrameDelete + // to Yes initially as this dialog would be the last top level window. + // OTOH, if we set it to No initially we'll have to overwrite it with Yes + // when we enter our OnRun() because we do want the default behaviour from + // then on. But this would be a problem if the user code calls + // SetExitOnFrameDelete(false) from OnInit(). + // + // So we use the special "Later" value which is such that + // GetExitOnFrameDelete() returns false for it but which we know we can + // safely (i.e. without losing the effect of the users SetExitOnFrameDelete + // call) overwrite in OnRun() + m_exitOnFrameDelete = Later; +} + +bool wxAppBase::Initialize(int& argcOrig, wxChar **argvOrig) +{ + if ( !wxAppConsole::Initialize(argcOrig, argvOrig) ) + return false; + +#if wxUSE_THREADS + wxPendingEventsLocker = new wxCriticalSection; +#endif + + wxInitializeStockLists(); + + wxBitmap::InitStandardHandlers(); + + return true; +} + +// ---------------------------------------------------------------------------- +// cleanup +// ---------------------------------------------------------------------------- + +wxAppBase::~wxAppBase() +{ + // this destructor is required for Darwin +} + +void wxAppBase::CleanUp() +{ + // clean up all the pending objects + DeletePendingObjects(); + + // and any remaining TLWs (they remove themselves from wxTopLevelWindows + // when destroyed, so iterate until none are left) + while ( !wxTopLevelWindows.empty() ) + { + // do not use Destroy() here as it only puts the TLW in pending list + // but we want to delete them now + delete wxTopLevelWindows.GetFirst()->GetData(); + } + + // undo everything we did in Initialize() above + wxBitmap::CleanUpHandlers(); + + wxStockGDI::DeleteAll(); + + wxDeleteStockLists(); + + delete wxTheColourDatabase; + wxTheColourDatabase = NULL; + + delete wxPendingEvents; + wxPendingEvents = NULL; + +#if wxUSE_THREADS + delete wxPendingEventsLocker; + wxPendingEventsLocker = NULL; + + #if wxUSE_VALIDATORS + // If we don't do the following, we get an apparent memory leak. + ((wxEvtHandler&) wxDefaultValidator).ClearEventLocker(); + #endif // wxUSE_VALIDATORS +#endif // wxUSE_THREADS +} + +// ---------------------------------------------------------------------------- +// various accessors +// ---------------------------------------------------------------------------- + +wxWindow* wxAppBase::GetTopWindow() const +{ + wxWindow* window = m_topWindow; + if (window == NULL && wxTopLevelWindows.GetCount() > 0) + window = wxTopLevelWindows.GetFirst()->GetData(); + return window; +} + +wxVideoMode wxAppBase::GetDisplayMode() const +{ + return wxVideoMode(); +} + +wxLayoutDirection wxAppBase::GetLayoutDirection() const +{ +#if wxUSE_INTL + const wxLocale *const locale = wxGetLocale(); + if ( locale ) + { + const wxLanguageInfo *const + info = wxLocale::GetLanguageInfo(locale->GetLanguage()); + + if ( info ) + return info->LayoutDirection; + } +#endif // wxUSE_INTL + + // we don't know + return wxLayout_Default; +} + +#if wxUSE_CMDLINE_PARSER + +// ---------------------------------------------------------------------------- +// GUI-specific command line options handling +// ---------------------------------------------------------------------------- + +#define OPTION_THEME _T("theme") +#define OPTION_MODE _T("mode") + +void wxAppBase::OnInitCmdLine(wxCmdLineParser& parser) +{ + // first add the standard non GUI options + wxAppConsole::OnInitCmdLine(parser); + + // the standard command line options + static const wxCmdLineEntryDesc cmdLineGUIDesc[] = + { +#ifdef __WXUNIVERSAL__ + { + wxCMD_LINE_OPTION, + wxEmptyString, + OPTION_THEME, + gettext_noop("specify the theme to use"), + wxCMD_LINE_VAL_STRING, + 0x0 + }, +#endif // __WXUNIVERSAL__ + +#if defined(__WXMGL__) + // VS: this is not specific to wxMGL, all fullscreen (framebuffer) ports + // should provide this option. That's why it is in common/appcmn.cpp + // and not mgl/app.cpp + { + wxCMD_LINE_OPTION, + wxEmptyString, + OPTION_MODE, + gettext_noop("specify display mode to use (e.g. 640x480-16)"), + wxCMD_LINE_VAL_STRING, + 0x0 + }, +#endif // __WXMGL__ + + // terminator + { + wxCMD_LINE_NONE, + wxEmptyString, + wxEmptyString, + wxEmptyString, + wxCMD_LINE_VAL_NONE, + 0x0 + } + }; + + parser.SetDesc(cmdLineGUIDesc); +} + +bool wxAppBase::OnCmdLineParsed(wxCmdLineParser& parser) +{ +#ifdef __WXUNIVERSAL__ + wxString themeName; + if ( parser.Found(OPTION_THEME, &themeName) ) + { + wxTheme *theme = wxTheme::Create(themeName); + if ( !theme ) + { + wxLogError(_("Unsupported theme '%s'."), themeName.c_str()); + return false; + } + + // Delete the defaultly created theme and set the new theme. + delete wxTheme::Get(); + wxTheme::Set(theme); + } +#endif // __WXUNIVERSAL__ + +#if defined(__WXMGL__) + wxString modeDesc; + if ( parser.Found(OPTION_MODE, &modeDesc) ) + { + unsigned w, h, bpp; + if ( wxSscanf(modeDesc.c_str(), _T("%ux%u-%u"), &w, &h, &bpp) != 3 ) + { + wxLogError(_("Invalid display mode specification '%s'."), modeDesc.c_str()); + return false; + } + + if ( !SetDisplayMode(wxVideoMode(w, h, bpp)) ) + return false; + } +#endif // __WXMGL__ + + return wxAppConsole::OnCmdLineParsed(parser); +} + +#endif // wxUSE_CMDLINE_PARSER + +// ---------------------------------------------------------------------------- +// main event loop implementation +// ---------------------------------------------------------------------------- + +int wxAppBase::MainLoop() +{ + wxEventLoopTiedPtr mainLoop(&m_mainLoop, new wxEventLoop); + + return m_mainLoop->Run(); +} + +void wxAppBase::ExitMainLoop() +{ + // we should exit from the main event loop, not just any currently active + // (e.g. modal dialog) event loop + if ( m_mainLoop && m_mainLoop->IsRunning() ) + { + m_mainLoop->Exit(0); + } +} + +bool wxAppBase::Pending() +{ + // use the currently active message loop here, not m_mainLoop, because if + // we're showing a modal dialog (with its own event loop) currently the + // main event loop is not running anyhow + wxEventLoop * const loop = wxEventLoop::GetActive(); + + return loop && loop->Pending(); +} + +bool wxAppBase::Dispatch() +{ + // see comment in Pending() + wxEventLoop * const loop = wxEventLoop::GetActive(); + + return loop && loop->Dispatch(); +} + +// ---------------------------------------------------------------------------- +// OnXXX() hooks +// ---------------------------------------------------------------------------- + +bool wxAppBase::OnInitGui() +{ +#ifdef __WXUNIVERSAL__ + if ( !wxTheme::Get() && !wxTheme::CreateDefault() ) + return false; +#endif // __WXUNIVERSAL__ + + return true; +} + +int wxAppBase::OnRun() +{ + // see the comment in ctor: if the initial value hasn't been changed, use + // the default Yes from now on + if ( m_exitOnFrameDelete == Later ) + { + m_exitOnFrameDelete = Yes; + } + //else: it has been changed, assume the user knows what he is doing + + return MainLoop(); +} + +int wxAppBase::OnExit() +{ +#ifdef __WXUNIVERSAL__ + delete wxTheme::Set(NULL); +#endif // __WXUNIVERSAL__ + + return wxAppConsole::OnExit(); +} + +void wxAppBase::Exit() +{ + ExitMainLoop(); +} + +wxAppTraits *wxAppBase::CreateTraits() +{ + return new wxGUIAppTraits; +} + +// ---------------------------------------------------------------------------- +// misc +// ---------------------------------------------------------------------------- + +void wxAppBase::SetActive(bool active, wxWindow * WXUNUSED(lastFocus)) +{ + if ( active == m_isActive ) + return; + + m_isActive = active; + + wxActivateEvent event(wxEVT_ACTIVATE_APP, active); + event.SetEventObject(this); + + (void)ProcessEvent(event); +} + +// ---------------------------------------------------------------------------- +// idle handling +// ---------------------------------------------------------------------------- + +void wxAppBase::DeletePendingObjects() +{ + wxList::compatibility_iterator node = wxPendingDelete.GetFirst(); + while (node) + { + wxObject *obj = node->GetData(); + + // remove it from the list first so that if we get back here somehow + // during the object deletion (e.g. wxYield called from its dtor) we + // wouldn't try to delete it the second time + if ( wxPendingDelete.Member(obj) ) + wxPendingDelete.Erase(node); + + delete obj; + + // Deleting one object may have deleted other pending + // objects, so start from beginning of list again. + node = wxPendingDelete.GetFirst(); + } +} + +// Returns true if more time is needed. +bool wxAppBase::ProcessIdle() +{ + // process pending wx events before sending idle events + ProcessPendingEvents(); + + wxIdleEvent event; + bool needMore = false; + wxWindowList::compatibility_iterator node = wxTopLevelWindows.GetFirst(); + while (node) + { + wxWindow* win = node->GetData(); + if (SendIdleEvents(win, event)) + needMore = true; + node = node->GetNext(); + } + + event.SetEventObject(this); + (void) ProcessEvent(event); + if (event.MoreRequested()) + needMore = true; + + // 'Garbage' collection of windows deleted with Close(). + DeletePendingObjects(); + +#if wxUSE_LOG + // flush the logged messages if any + wxLog::FlushActive(); +#endif + + wxUpdateUIEvent::ResetUpdateTime(); + + return needMore; +} + +// Send idle event to window and all subwindows +bool wxAppBase::SendIdleEvents(wxWindow* win, wxIdleEvent& event) +{ + bool needMore = false; + + win->OnInternalIdle(); + + if (wxIdleEvent::CanSend(win)) + { + event.SetEventObject(win); + win->GetEventHandler()->ProcessEvent(event); + + if (event.MoreRequested()) + needMore = true; + } + wxWindowList::compatibility_iterator node = win->GetChildren().GetFirst(); + while ( node ) + { + wxWindow *child = node->GetData(); + if (SendIdleEvents(child, event)) + needMore = true; + + node = node->GetNext(); + } + + return needMore; +} + +void wxAppBase::OnIdle(wxIdleEvent& WXUNUSED(event)) +{ +} + +// ---------------------------------------------------------------------------- +// exceptions support +// ---------------------------------------------------------------------------- + +#if wxUSE_EXCEPTIONS + +bool wxAppBase::OnExceptionInMainLoop() +{ + throw; + + // some compilers are too stupid to know that we never return after throw +#if defined(__DMC__) || (defined(_MSC_VER) && _MSC_VER < 1200) + return false; +#endif +} + +#endif // wxUSE_EXCEPTIONS + +// ---------------------------------------------------------------------------- +// wxGUIAppTraitsBase +// ---------------------------------------------------------------------------- + +#if wxUSE_LOG + +wxLog *wxGUIAppTraitsBase::CreateLogTarget() +{ +#if wxUSE_LOGGUI + return new wxLogGui; +#else + // we must have something! + return new wxLogStderr; +#endif +} + +#endif // wxUSE_LOG + +wxMessageOutput *wxGUIAppTraitsBase::CreateMessageOutput() +{ + // The standard way of printing help on command line arguments (app --help) + // is (according to common practice): + // - console apps: to stderr (on any platform) + // - GUI apps: stderr on Unix platforms (!) + // message box under Windows and others +#ifdef __UNIX__ + return new wxMessageOutputStderr; +#else // !__UNIX__ + // wxMessageOutputMessageBox doesn't work under Motif + #ifdef __WXMOTIF__ + return new wxMessageOutputLog; + #else + return new wxMessageOutputMessageBox; + #endif +#endif // __UNIX__/!__UNIX__ +} + +#if wxUSE_FONTMAP + +wxFontMapper *wxGUIAppTraitsBase::CreateFontMapper() +{ + return new wxFontMapper; +} + +#endif // wxUSE_FONTMAP + +wxRendererNative *wxGUIAppTraitsBase::CreateRenderer() +{ + // use the default native renderer by default + return NULL; +} + +#ifdef __WXDEBUG__ + +bool wxGUIAppTraitsBase::ShowAssertDialog(const wxString& msg) +{ +#if defined(__WXMSW__) || !wxUSE_MSGDLG + // under MSW we prefer to use the base class version using ::MessageBox() + // even if wxMessageBox() is available because it has less chances to + // double fault our app than our wxMessageBox() + return wxAppTraitsBase::ShowAssertDialog(msg); +#else // wxUSE_MSGDLG + wxString msgDlg = msg; + +#if wxUSE_STACKWALKER + // on Unix stack frame generation may take some time, depending on the + // size of the executable mainly... warn the user that we are working + wxFprintf(stderr, wxT("[Debug] Generating a stack trace... please wait")); + fflush(stderr); + + const wxString stackTrace = GetAssertStackTrace(); + if ( !stackTrace.empty() ) + msgDlg << _T("\n\nCall stack:\n") << stackTrace; +#endif // wxUSE_STACKWALKER + + // this message is intentionally not translated -- it is for + // developpers only + msgDlg += wxT("\nDo you want to stop the program?\n") + wxT("You can also choose [Cancel] to suppress ") + wxT("further warnings."); + +#ifdef __WXMAC__ + // in order to avoid reentrancy problems, use the lowest alert API available + CFOptionFlags exitButton; + wxMacCFStringHolder cfText(msgDlg); + OSStatus err = CFUserNotificationDisplayAlert( + 0, kAlertStopAlert, NULL, NULL, NULL, CFSTR("wxWidgets Debug Alert"), cfText, + CFSTR("Yes"), CFSTR("No"), CFSTR("Cancel"), &exitButton ); + if ( err == noErr ) + { + switch( exitButton ) + { + case 0 : // yes + wxTrap(); + break; + case 2 : // cancel + // no more asserts + return true; + case 1 : // no -> nothing to do + break ; + } + } +#else + switch ( wxMessageBox(msgDlg, wxT("wxWidgets Debug Alert"), + wxYES_NO | wxCANCEL | wxICON_STOP ) ) + { + case wxYES: + wxTrap(); + break; + + case wxCANCEL: + // no more asserts + return true; + + //case wxNO: nothing to do + } +#endif + return false; +#endif // !wxUSE_MSGDLG/wxUSE_MSGDLG +} + +#endif // __WXDEBUG__ + +bool wxGUIAppTraitsBase::HasStderr() +{ + // we consider that under Unix stderr always goes somewhere, even if the + // user doesn't always see it under GUI desktops +#ifdef __UNIX__ + return true; +#else + return false; +#endif +} + +void wxGUIAppTraitsBase::ScheduleForDestroy(wxObject *object) +{ + if ( !wxPendingDelete.Member(object) ) + wxPendingDelete.Append(object); +} + +void wxGUIAppTraitsBase::RemoveFromPendingDelete(wxObject *object) +{ + wxPendingDelete.DeleteObject(object); +} + +#if wxUSE_SOCKETS + +#if defined(__WINDOWS__) + #include "wx/msw/gsockmsw.h" +#elif defined(__UNIX__) || defined(__DARWIN__) || defined(__OS2__) + #include "wx/unix/gsockunx.h" +#elif defined(__WXMAC__) + #include + #define OTUNIXERRORS 1 + #include + #include + #include + + #include "wx/mac/gsockmac.h" +#else + #error "Must include correct GSocket header here" +#endif + +GSocketGUIFunctionsTable* wxGUIAppTraitsBase::GetSocketGUIFunctionsTable() +{ +#if defined(__WXMAC__) && !defined(__DARWIN__) + // NB: wxMac CFM does not have any GUI-specific functions in gsocket.c and + // so it doesn't need this table at all + return NULL; +#else // !__WXMAC__ || __DARWIN__ + static GSocketGUIFunctionsTableConcrete table; + return &table; +#endif // !__WXMAC__ || __DARWIN__ +} + +#endif diff --git a/Externals/wxWidgets/src/common/arcall.cpp b/Externals/wxWidgets/src/common/arcall.cpp new file mode 100644 index 0000000000..a66ea703db --- /dev/null +++ b/Externals/wxWidgets/src/common/arcall.cpp @@ -0,0 +1,41 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/arcall.cpp +// Purpose: wxArchive link all archive streams +// Author: Mike Wetherell +// RCS-ID: $Id: arcall.cpp 42508 2006-10-27 09:53:38Z MW $ +// Copyright: (c) 2006 Mike Wetherell +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_ARCHIVE_STREAMS + +#if wxUSE_ZIPSTREAM +#include "wx/zipstrm.h" +#endif +#if wxUSE_TARSTREAM +#include "wx/tarstrm.h" +#endif + +// Reference archive classes to ensure they are linked into a statically +// linked program that uses Find or GetFirst to look for an archive handler. +// It is in its own file so that the user can override this behaviour by +// providing their own implementation. + +void wxUseArchiveClasses() +{ +#if wxUSE_ZIPSTREAM + wxZipClassFactory(); +#endif +#if wxUSE_TARSTREAM + wxTarClassFactory(); +#endif +} + +#endif // wxUSE_ARCHIVE_STREAMS diff --git a/Externals/wxWidgets/src/common/arcfind.cpp b/Externals/wxWidgets/src/common/arcfind.cpp new file mode 100644 index 0000000000..f983993fc2 --- /dev/null +++ b/Externals/wxWidgets/src/common/arcfind.cpp @@ -0,0 +1,43 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/arcfind.cpp +// Purpose: Streams for archive formats +// Author: Mike Wetherell +// RCS-ID: $Id: arcfind.cpp 42508 2006-10-27 09:53:38Z MW $ +// Copyright: (c) Mike Wetherell +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_ARCHIVE_STREAMS + +#include "wx/archive.h" + +// These functions are in a separate file so that statically linked apps +// that do not call them to search for archive handlers will only link in +// the archive classes they use. + +const wxArchiveClassFactory * +wxArchiveClassFactory::Find(const wxChar *protocol, wxStreamProtocolType type) +{ + for (const wxArchiveClassFactory *f = GetFirst(); f; f = f->GetNext()) + if (f->CanHandle(protocol, type)) + return f; + + return NULL; +} + +// static +const wxArchiveClassFactory *wxArchiveClassFactory::GetFirst() +{ + if (!sm_first) + wxUseArchiveClasses(); + return sm_first; +} + +#endif // wxUSE_ARCHIVE_STREAMS diff --git a/Externals/wxWidgets/src/common/archive.cpp b/Externals/wxWidgets/src/common/archive.cpp new file mode 100644 index 0000000000..512e3d7382 --- /dev/null +++ b/Externals/wxWidgets/src/common/archive.cpp @@ -0,0 +1,98 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/archive.cpp +// Purpose: Streams for archive formats +// Author: Mike Wetherell +// RCS-ID: $Id: archive.cpp 42508 2006-10-27 09:53:38Z MW $ +// Copyright: (c) Mike Wetherell +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_STREAMS && wxUSE_ARCHIVE_STREAMS + +#include "wx/archive.h" + +IMPLEMENT_ABSTRACT_CLASS(wxArchiveEntry, wxObject) +IMPLEMENT_ABSTRACT_CLASS(wxArchiveClassFactory, wxFilterClassFactoryBase) + + +///////////////////////////////////////////////////////////////////////////// +// wxArchiveInputStream + +wxArchiveInputStream::wxArchiveInputStream(wxInputStream& stream, + wxMBConv& conv) + : wxFilterInputStream(stream), + m_conv(conv) +{ +} + +wxArchiveInputStream::wxArchiveInputStream(wxInputStream *stream, + wxMBConv& conv) + : wxFilterInputStream(stream), + m_conv(conv) +{ +} + + +///////////////////////////////////////////////////////////////////////////// +// wxArchiveOutputStream + +wxArchiveOutputStream::wxArchiveOutputStream(wxOutputStream& stream, + wxMBConv& conv) + : wxFilterOutputStream(stream), + m_conv(conv) +{ +} + +wxArchiveOutputStream::wxArchiveOutputStream(wxOutputStream *stream, + wxMBConv& conv) + : wxFilterOutputStream(stream), + m_conv(conv) +{ +} + + +///////////////////////////////////////////////////////////////////////////// +// wxArchiveEntry + +void wxArchiveEntry::SetNotifier(wxArchiveNotifier& notifier) +{ + UnsetNotifier(); + m_notifier = ¬ifier; + m_notifier->OnEntryUpdated(*this); +} + +wxArchiveEntry& wxArchiveEntry::operator=(const wxArchiveEntry& WXUNUSED(e)) +{ + m_notifier = NULL; + return *this; +} + + +///////////////////////////////////////////////////////////////////////////// +// wxArchiveClassFactory + +wxArchiveClassFactory *wxArchiveClassFactory::sm_first = NULL; + +void wxArchiveClassFactory::Remove() +{ + if (m_next != this) + { + wxArchiveClassFactory **pp = &sm_first; + + while (*pp != this) + pp = &(*pp)->m_next; + + *pp = m_next; + + m_next = this; + } +} + +#endif // wxUSE_STREAMS && wxUSE_ARCHIVE_STREAMS diff --git a/Externals/wxWidgets/src/common/artprov.cpp b/Externals/wxWidgets/src/common/artprov.cpp new file mode 100644 index 0000000000..591abcbbec --- /dev/null +++ b/Externals/wxWidgets/src/common/artprov.cpp @@ -0,0 +1,338 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/artprov.cpp +// Purpose: wxArtProvider class +// Author: Vaclav Slavik +// Modified by: +// Created: 18/03/2002 +// RCS-ID: $Id: artprov.cpp 41398 2006-09-23 20:16:18Z VZ $ +// Copyright: (c) Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// --------------------------------------------------------------------------- +// headers +// --------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#if defined(__BORLANDC__) + #pragma hdrstop +#endif + +#include "wx/artprov.h" + +#ifndef WX_PRECOMP + #include "wx/list.h" + #include "wx/log.h" + #include "wx/hashmap.h" + #include "wx/image.h" + #include "wx/module.h" +#endif + +// =========================================================================== +// implementation +// =========================================================================== + +#include "wx/listimpl.cpp" +WX_DECLARE_LIST(wxArtProvider, wxArtProvidersList); +WX_DEFINE_LIST(wxArtProvidersList) + +// ---------------------------------------------------------------------------- +// Cache class - stores already requested bitmaps +// ---------------------------------------------------------------------------- + +WX_DECLARE_EXPORTED_STRING_HASH_MAP(wxBitmap, wxArtProviderBitmapsHash); + +class WXDLLEXPORT wxArtProviderCache +{ +public: + bool GetBitmap(const wxString& full_id, wxBitmap* bmp); + void PutBitmap(const wxString& full_id, const wxBitmap& bmp) + { m_bitmapsHash[full_id] = bmp; } + + void Clear(); + + static wxString ConstructHashID(const wxArtID& id, + const wxArtClient& client, + const wxSize& size); + +private: + wxArtProviderBitmapsHash m_bitmapsHash; +}; + +bool wxArtProviderCache::GetBitmap(const wxString& full_id, wxBitmap* bmp) +{ + wxArtProviderBitmapsHash::iterator entry = m_bitmapsHash.find(full_id); + if ( entry == m_bitmapsHash.end() ) + { + return false; + } + else + { + *bmp = entry->second; + return true; + } +} + +void wxArtProviderCache::Clear() +{ + m_bitmapsHash.clear(); +} + +/*static*/ wxString wxArtProviderCache::ConstructHashID( + const wxArtID& id, const wxArtClient& client, + const wxSize& size) +{ + wxString str; + str.Printf(wxT("%s-%s-%i-%i"), id.c_str(), client.c_str(), size.x, size.y); + return str; +} + + +// ============================================================================ +// wxArtProvider class +// ============================================================================ + +IMPLEMENT_ABSTRACT_CLASS(wxArtProvider, wxObject) + +wxArtProvidersList *wxArtProvider::sm_providers = NULL; +wxArtProviderCache *wxArtProvider::sm_cache = NULL; + +// ---------------------------------------------------------------------------- +// wxArtProvider ctors/dtor +// ---------------------------------------------------------------------------- + +wxArtProvider::~wxArtProvider() +{ + Remove(this); +} + +// ---------------------------------------------------------------------------- +// wxArtProvider operations on provider stack +// ---------------------------------------------------------------------------- + +/*static*/ void wxArtProvider::CommonAddingProvider() +{ + if ( !sm_providers ) + { + sm_providers = new wxArtProvidersList; + sm_cache = new wxArtProviderCache; + } + + sm_cache->Clear(); +} + +/*static*/ void wxArtProvider::Push(wxArtProvider *provider) +{ + CommonAddingProvider(); + sm_providers->Insert(provider); +} + +/*static*/ void wxArtProvider::Insert(wxArtProvider *provider) +{ + CommonAddingProvider(); + sm_providers->Append(provider); +} + +/*static*/ bool wxArtProvider::Pop() +{ + wxCHECK_MSG( sm_providers, false, _T("no wxArtProvider exists") ); + wxCHECK_MSG( !sm_providers->empty(), false, _T("wxArtProviders stack is empty") ); + + delete sm_providers->GetFirst()->GetData(); + sm_cache->Clear(); + return true; +} + +/*static*/ bool wxArtProvider::Remove(wxArtProvider *provider) +{ + wxCHECK_MSG( sm_providers, false, _T("no wxArtProvider exists") ); + + if ( sm_providers->DeleteObject(provider) ) + { + sm_cache->Clear(); + return true; + } + + return false; +} + +/*static*/ bool wxArtProvider::Delete(wxArtProvider *provider) +{ + // provider will remove itself from the stack in its dtor + delete provider; + + return true; +} + +/*static*/ void wxArtProvider::CleanUpProviders() +{ + if ( sm_providers ) + { + while ( !sm_providers->empty() ) + delete *sm_providers->begin(); + + delete sm_providers; + sm_providers = NULL; + + delete sm_cache; + sm_cache = NULL; + } +} + +// ---------------------------------------------------------------------------- +// wxArtProvider: retrieving bitmaps/icons +// ---------------------------------------------------------------------------- + +/*static*/ wxBitmap wxArtProvider::GetBitmap(const wxArtID& id, + const wxArtClient& client, + const wxSize& size) +{ + // safety-check against writing client,id,size instead of id,client,size: + wxASSERT_MSG( client.Last() == _T('C'), _T("invalid 'client' parameter") ); + + wxCHECK_MSG( sm_providers, wxNullBitmap, _T("no wxArtProvider exists") ); + + wxString hashId = wxArtProviderCache::ConstructHashID(id, client, size); + + wxBitmap bmp; + if ( !sm_cache->GetBitmap(hashId, &bmp) ) + { + for (wxArtProvidersList::compatibility_iterator node = sm_providers->GetFirst(); + node; node = node->GetNext()) + { + bmp = node->GetData()->CreateBitmap(id, client, size); + if ( bmp.Ok() ) + { +#if wxUSE_IMAGE && (!defined(__WXMSW__) || wxUSE_WXDIB) + if ( size != wxDefaultSize && + (bmp.GetWidth() != size.x || bmp.GetHeight() != size.y) ) + { + wxImage img = bmp.ConvertToImage(); + img.Rescale(size.x, size.y); + bmp = wxBitmap(img); + } +#endif + break; + } + } + + sm_cache->PutBitmap(hashId, bmp); + } + + return bmp; +} + +/*static*/ wxIcon wxArtProvider::GetIcon(const wxArtID& id, + const wxArtClient& client, + const wxSize& size) +{ + wxCHECK_MSG( sm_providers, wxNullIcon, _T("no wxArtProvider exists") ); + + wxBitmap bmp = GetBitmap(id, client, size); + if ( !bmp.Ok() ) + return wxNullIcon; + + wxIcon icon; + icon.CopyFromBitmap(bmp); + return icon; +} + +#if defined(__WXGTK20__) && !defined(__WXUNIVERSAL__) + #include "wx/gtk/private.h" + extern GtkIconSize wxArtClientToIconSize(const wxArtClient& client); +#endif // defined(__WXGTK20__) && !defined(__WXUNIVERSAL__) + +/*static*/ wxSize wxArtProvider::GetSizeHint(const wxArtClient& client, + bool platform_dependent) +{ + if (!platform_dependent) + { + wxArtProvidersList::compatibility_iterator node = sm_providers->GetFirst(); + if (node) + return node->GetData()->DoGetSizeHint(client); + } + + // else return platform dependent size + +#if defined(__WXGTK20__) && !defined(__WXUNIVERSAL__) + // Gtk has specific sizes for each client, see artgtk.cpp + GtkIconSize gtk_size = wxArtClientToIconSize(client); + // no size hints for this client + if (gtk_size == GTK_ICON_SIZE_INVALID) + return wxDefaultSize; + gint width, height; + gtk_icon_size_lookup( gtk_size, &width, &height); + return wxSize(width, height); +#else // !GTK+ 2 + // NB: These size hints may have to be adjusted per platform + if (client == wxART_TOOLBAR) + return wxSize(16, 15); + else if (client == wxART_MENU) + return wxSize(16, 15); + else if (client == wxART_FRAME_ICON) + return wxSize(16, 15); + else if (client == wxART_CMN_DIALOG || client == wxART_MESSAGE_BOX) + return wxSize(32, 32); + else if (client == wxART_HELP_BROWSER) + return wxSize(16, 15); + else if (client == wxART_BUTTON) + return wxSize(16, 15); + else // wxART_OTHER or perhaps a user's client, no specified size + return wxDefaultSize; +#endif // GTK+ 2/else +} + +// ---------------------------------------------------------------------------- +// deprecated wxArtProvider methods +// ---------------------------------------------------------------------------- + +#if WXWIN_COMPATIBILITY_2_6 + +/* static */ void wxArtProvider::PushProvider(wxArtProvider *provider) +{ + Push(provider); +} + +/* static */ void wxArtProvider::InsertProvider(wxArtProvider *provider) +{ + Insert(provider); +} + +/* static */ bool wxArtProvider::PopProvider() +{ + return Pop(); +} + +/* static */ bool wxArtProvider::RemoveProvider(wxArtProvider *provider) +{ + // RemoveProvider() used to delete the provider being removed so this is + // not a typo, we must call Delete() and not Remove() here + return Delete(provider); +} + +#endif // WXWIN_COMPATIBILITY_2_6 + +// ============================================================================ +// wxArtProviderModule +// ============================================================================ + +class wxArtProviderModule: public wxModule +{ +public: + bool OnInit() + { + wxArtProvider::InitStdProvider(); + wxArtProvider::InitNativeProvider(); + return true; + } + void OnExit() + { + wxArtProvider::CleanUpProviders(); + } + + DECLARE_DYNAMIC_CLASS(wxArtProviderModule) +}; + +IMPLEMENT_DYNAMIC_CLASS(wxArtProviderModule, wxModule) diff --git a/Externals/wxWidgets/src/common/artstd.cpp b/Externals/wxWidgets/src/common/artstd.cpp new file mode 100644 index 0000000000..5e7bcd2ba7 --- /dev/null +++ b/Externals/wxWidgets/src/common/artstd.cpp @@ -0,0 +1,258 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/artstd.cpp +// Purpose: stock wxArtProvider instance with default wxWin art +// Author: Vaclav Slavik +// Modified by: +// Created: 18/03/2002 +// RCS-ID: $Id: artstd.cpp 41398 2006-09-23 20:16:18Z VZ $ +// Copyright: (c) Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// --------------------------------------------------------------------------- +// headers +// --------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#if defined(__BORLANDC__) + #pragma hdrstop +#endif + +#ifndef WX_PRECOMP + #include "wx/image.h" +#endif + +#include "wx/artprov.h" + +// ---------------------------------------------------------------------------- +// wxDefaultArtProvider +// ---------------------------------------------------------------------------- + +class wxDefaultArtProvider : public wxArtProvider +{ +protected: + virtual wxBitmap CreateBitmap(const wxArtID& id, const wxArtClient& client, + const wxSize& size); +}; + +// ---------------------------------------------------------------------------- +// helper macros +// ---------------------------------------------------------------------------- + +// Standard macro for getting a resource from XPM file: +#define ART(artId, xpmRc) \ + if ( id == artId ) return wxBitmap(xpmRc##_xpm); + +// There are two ways of getting the standard icon: either via XPMs or via +// wxIcon ctor. This depends on the platform: +#if defined(__WXUNIVERSAL__) + #define CREATE_STD_ICON(iconId, xpmRc) return wxNullBitmap; +#elif defined(__WXGTK__) || defined(__WXMOTIF__) + #define CREATE_STD_ICON(iconId, xpmRc) return wxBitmap(xpmRc##_xpm); +#else + #define CREATE_STD_ICON(iconId, xpmRc) \ + { \ + wxIcon icon(_T(iconId)); \ + wxBitmap bmp; \ + bmp.CopyFromIcon(icon); \ + return bmp; \ + } +#endif + +// Macro used in CreateBitmap to get wxICON_FOO icons: +#define ART_MSGBOX(artId, iconId, xpmRc) \ + if ( id == artId ) \ + { \ + CREATE_STD_ICON(#iconId, xpmRc) \ + } + +// ---------------------------------------------------------------------------- +// wxArtProvider::InitStdProvider +// ---------------------------------------------------------------------------- + +/*static*/ void wxArtProvider::InitStdProvider() +{ + wxArtProvider::Push(new wxDefaultArtProvider); +} + +#if !defined(__WXGTK20__) || defined(__WXUNIVERSAL__) +/*static*/ void wxArtProvider::InitNativeProvider() +{ +} +#endif + + +// ---------------------------------------------------------------------------- +// XPMs with the art +// ---------------------------------------------------------------------------- + +// XPM hack: make the arrays const +#define static static const + +#if defined(__WXGTK__) + #include "../../art/gtk/info.xpm" + #include "../../art/gtk/error.xpm" + #include "../../art/gtk/warning.xpm" + #include "../../art/gtk/question.xpm" +#elif defined(__WXMOTIF__) + #include "../../art/motif/info.xpm" + #include "../../art/motif/error.xpm" + #include "../../art/motif/warning.xpm" + #include "../../art/motif/question.xpm" +#endif + +#if wxUSE_HTML + #include "../../art/htmsidep.xpm" + #include "../../art/htmoptns.xpm" + #include "../../art/htmbook.xpm" + #include "../../art/htmfoldr.xpm" + #include "../../art/htmpage.xpm" +#endif // wxUSE_HTML + +#include "../../art/missimg.xpm" +#include "../../art/addbookm.xpm" +#include "../../art/delbookm.xpm" +#include "../../art/back.xpm" +#include "../../art/forward.xpm" +#include "../../art/up.xpm" +#include "../../art/down.xpm" +#include "../../art/toparent.xpm" +#include "../../art/fileopen.xpm" +#include "../../art/print.xpm" +#include "../../art/helpicon.xpm" +#include "../../art/tipicon.xpm" +#include "../../art/home.xpm" +#include "../../art/repview.xpm" +#include "../../art/listview.xpm" +#include "../../art/new_dir.xpm" +#include "../../art/harddisk.xpm" +#include "../../art/cdrom.xpm" +#include "../../art/floppy.xpm" +#include "../../art/removable.xpm" +#include "../../art/folder.xpm" +#include "../../art/folder_open.xpm" +#include "../../art/dir_up.xpm" +#include "../../art/exefile.xpm" +#include "../../art/deffile.xpm" +#include "../../art/tick.xpm" +#include "../../art/cross.xpm" + +#include "../../art/filesave.xpm" +#include "../../art/filesaveas.xpm" +#include "../../art/copy.xpm" +#include "../../art/cut.xpm" +#include "../../art/paste.xpm" +#include "../../art/delete.xpm" +#include "../../art/new.xpm" +#include "../../art/undo.xpm" +#include "../../art/redo.xpm" +#include "../../art/quit.xpm" +#include "../../art/find.xpm" +#include "../../art/findrepl.xpm" + + +#undef static + +wxBitmap wxDefaultArtProvider_CreateBitmap(const wxArtID& id) +{ + // wxMessageBox icons: + ART_MSGBOX(wxART_ERROR, wxICON_ERROR, error) + ART_MSGBOX(wxART_INFORMATION, wxICON_INFORMATION, info) + ART_MSGBOX(wxART_WARNING, wxICON_WARNING, warning) + ART_MSGBOX(wxART_QUESTION, wxICON_QUESTION, question) + + // standard icons: +#if wxUSE_HTML + ART(wxART_HELP_SIDE_PANEL, htmsidep) + ART(wxART_HELP_SETTINGS, htmoptns) + ART(wxART_HELP_BOOK, htmbook) + ART(wxART_HELP_FOLDER, htmfoldr) + ART(wxART_HELP_PAGE, htmpage) +#endif // wxUSE_HTML + ART(wxART_MISSING_IMAGE, missimg) + ART(wxART_ADD_BOOKMARK, addbookm) + ART(wxART_DEL_BOOKMARK, delbookm) + ART(wxART_GO_BACK, back) + ART(wxART_GO_FORWARD, forward) + ART(wxART_GO_UP, up) + ART(wxART_GO_DOWN, down) + ART(wxART_GO_TO_PARENT, toparent) + ART(wxART_GO_HOME, home) + ART(wxART_FILE_OPEN, fileopen) + ART(wxART_PRINT, print) + ART(wxART_HELP, helpicon) + ART(wxART_TIP, tipicon) + ART(wxART_REPORT_VIEW, repview) + ART(wxART_LIST_VIEW, listview) + ART(wxART_NEW_DIR, new_dir) + ART(wxART_HARDDISK, harddisk) + ART(wxART_FLOPPY, floppy) + ART(wxART_CDROM, cdrom) + ART(wxART_REMOVABLE, removable) + ART(wxART_FOLDER, folder) + ART(wxART_FOLDER_OPEN, folder_open) + ART(wxART_GO_DIR_UP, dir_up) + ART(wxART_EXECUTABLE_FILE, exefile) + ART(wxART_NORMAL_FILE, deffile) + ART(wxART_TICK_MARK, tick) + ART(wxART_CROSS_MARK, cross) + + ART(wxART_FILE_SAVE, filesave) + ART(wxART_FILE_SAVE_AS, filesaveas) + ART(wxART_COPY, copy) + ART(wxART_CUT, cut) + ART(wxART_PASTE, paste) + ART(wxART_DELETE, delete) + ART(wxART_UNDO, undo) + ART(wxART_REDO, redo) + ART(wxART_QUIT, quit) + ART(wxART_FIND, find) + ART(wxART_FIND_AND_REPLACE, findrepl) + ART(wxART_NEW, new) + + + return wxNullBitmap; +} + +// ---------------------------------------------------------------------------- +// CreateBitmap routine +// ---------------------------------------------------------------------------- + +wxBitmap wxDefaultArtProvider::CreateBitmap(const wxArtID& id, + const wxArtClient& client, + const wxSize& reqSize) +{ + wxBitmap bmp = wxDefaultArtProvider_CreateBitmap(id); + +#if wxUSE_IMAGE && (!defined(__WXMSW__) || wxUSE_WXDIB) + if (bmp.Ok()) + { + // fit into transparent image with desired size hint from the client + if (reqSize == wxDefaultSize) + { + // find out if there is a desired size for this client + wxSize bestSize = GetSizeHint(client); + if (bestSize != wxDefaultSize) + { + int bmp_w = bmp.GetWidth(); + int bmp_h = bmp.GetHeight(); + // want default size but it's smaller, paste into transparent image + if ((bmp_h < bestSize.x) && (bmp_w < bestSize.y)) + { + wxPoint offset((bestSize.x - bmp_w)/2, (bestSize.y - bmp_h)/2); + wxImage img = bmp.ConvertToImage(); + img.Resize(bestSize, offset); + bmp = wxBitmap(img); + } + } + } + } +#else + wxUnusedVar(client); + wxUnusedVar(reqSize); +#endif // wxUSE_IMAGE + + return bmp; +} diff --git a/Externals/wxWidgets/src/common/base.rc b/Externals/wxWidgets/src/common/base.rc new file mode 100644 index 0000000000..56f595a89d --- /dev/null +++ b/Externals/wxWidgets/src/common/base.rc @@ -0,0 +1,49 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/base/base.rc +// Purpose: contains version info resource for wxBase DLL build +// Author: Vadim Zeitlin +// Modified by: +// Created: 09.07.00 +// RCS-ID: $Id: base.rc 13410 2002-01-06 14:51:28Z VS $ +// Copyright: (c) 2000 Vadim Zeitlin +// Licence: wxWindows license +/////////////////////////////////////////////////////////////////////////////// + +#include "wx/version.h" + +#ifdef _DEBUG + #define DLL_FLAGS 0x1L + #define DLL_SUFFIX "d" +#else + #define DLL_FLAGS 0x0L + #define DLL_SUFFIX "" +#endif + +1 VERSIONINFO + FILEVERSION wxMAJOR_VERSION,wxMINOR_VERSION,wxRELEASE_NUMBER,wxBETA_NUMBER + PRODUCTVERSION wxMAJOR_VERSION,wxMINOR_VERSION,wxRELEASE_NUMBER,wxBETA_NUMBER + FILEFLAGSMASK 0x3fL + FILEFLAGS DLL_FLAGS + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "Comments", "wxBase (part of Windows) cross-platform framework\0" + VALUE "CompanyName", "wxWindows development team\0" + VALUE "FileDescription", "wxBase is a non GUI part of wxWindows\0" + VALUE "FileVersion", wxVERSION_NUM_DOT_STRING "\0" + VALUE "InternalName", "wxBase\0" + VALUE "LegalCopyright", "Copyright © 1993-2002 wxWindows development team\0" + VALUE "LegalTrademarks", "\0" + VALUE "OriginalFilename", "wxbase" wxVERSION_NUM_STRING DLL_SUFFIX ".dll\0" + VALUE "PrivateBuild", "\0" + VALUE "ProductName", "wxWindows\0" + VALUE "ProductVersion", wxVERSION_NUM_DOT_STRING "\0" + VALUE "SpecialBuild", "\0" + END + END +END diff --git a/Externals/wxWidgets/src/common/bmpbase.cpp b/Externals/wxWidgets/src/common/bmpbase.cpp new file mode 100644 index 0000000000..a1d7c60aa2 --- /dev/null +++ b/Externals/wxWidgets/src/common/bmpbase.cpp @@ -0,0 +1,211 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/bmpbase.cpp +// Purpose: wxBitmapBase +// Author: VaclavSlavik +// Created: 2001/04/11 +// RCS-ID: $Id: bmpbase.cpp 42752 2006-10-30 19:26:48Z VZ $ +// Copyright: (c) 2001, Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#include "wx/bitmap.h" + +#ifndef WX_PRECOMP + #include "wx/colour.h" + #include "wx/icon.h" + #include "wx/image.h" +#endif // WX_PRECOMP + +// ---------------------------------------------------------------------------- +// wxVariant support +// ---------------------------------------------------------------------------- + +#if wxUSE_VARIANT +IMPLEMENT_VARIANT_OBJECT_EXPORTED_SHALLOWCMP(wxBitmap,WXDLLEXPORT) +IMPLEMENT_VARIANT_OBJECT_EXPORTED_SHALLOWCMP(wxIcon,WXDLLEXPORT) +#endif + +// ---------------------------------------------------------------------------- +// wxBitmapBase +// ---------------------------------------------------------------------------- + +#if wxUSE_BITMAP_BASE + +#ifndef WX_PRECOMP + #include "wx/log.h" + #include "wx/utils.h" + #include "wx/palette.h" + #include "wx/module.h" +#endif // WX_PRECOMP + + +IMPLEMENT_ABSTRACT_CLASS(wxBitmapBase, wxGDIObject) +IMPLEMENT_ABSTRACT_CLASS(wxBitmapHandlerBase,wxObject) + +wxList wxBitmapBase::sm_handlers; + +void wxBitmapBase::AddHandler(wxBitmapHandlerBase *handler) +{ + sm_handlers.Append(handler); +} + +void wxBitmapBase::InsertHandler(wxBitmapHandlerBase *handler) +{ + sm_handlers.Insert(handler); +} + +bool wxBitmapBase::RemoveHandler(const wxString& name) +{ + wxBitmapHandler *handler = FindHandler(name); + if ( handler ) + { + sm_handlers.DeleteObject(handler); + return true; + } + else + return false; +} + +wxBitmapHandler *wxBitmapBase::FindHandler(const wxString& name) +{ + wxList::compatibility_iterator node = sm_handlers.GetFirst(); + while ( node ) + { + wxBitmapHandler *handler = (wxBitmapHandler *)node->GetData(); + if ( handler->GetName() == name ) + return handler; + node = node->GetNext(); + } + return NULL; +} + +wxBitmapHandler *wxBitmapBase::FindHandler(const wxString& extension, wxBitmapType bitmapType) +{ + wxList::compatibility_iterator node = sm_handlers.GetFirst(); + while ( node ) + { + wxBitmapHandler *handler = (wxBitmapHandler *)node->GetData(); + if ( handler->GetExtension() == extension && + (bitmapType == wxBITMAP_TYPE_ANY || handler->GetType() == bitmapType) ) + return handler; + node = node->GetNext(); + } + return NULL; +} + +wxBitmapHandler *wxBitmapBase::FindHandler(wxBitmapType bitmapType) +{ + wxList::compatibility_iterator node = sm_handlers.GetFirst(); + while ( node ) + { + wxBitmapHandler *handler = (wxBitmapHandler *)node->GetData(); + if (handler->GetType() == bitmapType) + return handler; + node = node->GetNext(); + } + return NULL; +} + +void wxBitmapBase::CleanUpHandlers() +{ + wxList::compatibility_iterator node = sm_handlers.GetFirst(); + while ( node ) + { + wxBitmapHandler *handler = (wxBitmapHandler *)node->GetData(); + wxList::compatibility_iterator next = node->GetNext(); + delete handler; + sm_handlers.Erase(node); + node = next; + } +} + +bool wxBitmapHandlerBase::Create(wxBitmap*, const void*, long, int, int, int) +{ + return false; +} + +bool wxBitmapHandlerBase::LoadFile(wxBitmap*, const wxString&, long, int, int) +{ + return false; +} + +bool wxBitmapHandlerBase::SaveFile(const wxBitmap*, const wxString&, int, const wxPalette*) +{ + return false; +} + +class wxBitmapBaseModule: public wxModule +{ +DECLARE_DYNAMIC_CLASS(wxBitmapBaseModule) +public: + wxBitmapBaseModule() {} + bool OnInit() { wxBitmap::InitStandardHandlers(); return true; } + void OnExit() { wxBitmap::CleanUpHandlers(); } +}; + +IMPLEMENT_DYNAMIC_CLASS(wxBitmapBaseModule, wxModule) + +#endif // wxUSE_BITMAP_BASE + +// ---------------------------------------------------------------------------- +// wxBitmap common +// ---------------------------------------------------------------------------- + +#if !(defined(__WXGTK__) || defined(__WXMOTIF__) || defined(__WXX11__)) + +wxBitmap::wxBitmap(const char* const* bits) +{ + wxCHECK2_MSG(bits != NULL, return, wxT("invalid bitmap data")); + +#if wxUSE_IMAGE && wxUSE_XPM + wxImage image(bits); + wxCHECK2_MSG(image.Ok(), return, wxT("invalid bitmap data")); + + *this = wxBitmap(image); +#else + wxFAIL_MSG(_T("creating bitmaps from XPMs not supported")); +#endif // wxUSE_IMAGE && wxUSE_XPM +} +#endif // !(defined(__WXGTK__) || defined(__WXMOTIF__) || defined(__WXX11__)) + +// ---------------------------------------------------------------------------- +// wxMaskBase +// ---------------------------------------------------------------------------- + +bool wxMaskBase::Create(const wxBitmap& bitmap, const wxColour& colour) +{ + FreeData(); + + return InitFromColour(bitmap, colour); +} + +#if wxUSE_PALETTE + +bool wxMaskBase::Create(const wxBitmap& bitmap, int paletteIndex) +{ + wxPalette *pal = bitmap.GetPalette(); + + wxCHECK_MSG( pal, false, + wxT("Cannot create mask from palette index of a bitmap without palette") ); + + unsigned char r,g,b; + pal->GetRGB(paletteIndex, &r, &g, &b); + + return Create(bitmap, wxColour(r, g, b)); +} + +#endif // wxUSE_PALETTE + +bool wxMaskBase::Create(const wxBitmap& bitmap) +{ + FreeData(); + + return InitFromMonoBitmap(bitmap); +} diff --git a/Externals/wxWidgets/src/common/bookctrl.cpp b/Externals/wxWidgets/src/common/bookctrl.cpp new file mode 100644 index 0000000000..3c19c630f1 --- /dev/null +++ b/Externals/wxWidgets/src/common/bookctrl.cpp @@ -0,0 +1,490 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/common/bookctrl.cpp +// Purpose: wxBookCtrlBase implementation +// Author: Vadim Zeitlin +// Modified by: +// Created: 19.08.03 +// RCS-ID: $Id: bookctrl.cpp 43027 2006-11-04 12:20:09Z VZ $ +// Copyright: (c) 2003 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_BOOKCTRL + +#include "wx/imaglist.h" + +#include "wx/bookctrl.h" + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// event table +// ---------------------------------------------------------------------------- + +IMPLEMENT_ABSTRACT_CLASS(wxBookCtrlBase, wxControl) + +BEGIN_EVENT_TABLE(wxBookCtrlBase, wxControl) + EVT_SIZE(wxBookCtrlBase::OnSize) +#if wxUSE_HELP + EVT_HELP(wxID_ANY, wxBookCtrlBase::OnHelp) +#endif // wxUSE_HELP +END_EVENT_TABLE() + +// ---------------------------------------------------------------------------- +// constructors and destructors +// ---------------------------------------------------------------------------- + +void wxBookCtrlBase::Init() +{ + m_bookctrl = NULL; + m_imageList = NULL; + m_ownsImageList = false; + m_fitToCurrentPage = false; + +#if defined(__WXWINCE__) + m_internalBorder = 1; +#else + m_internalBorder = 5; +#endif + + m_controlMargin = 0; + m_controlSizer = NULL; +} + +bool +wxBookCtrlBase::Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + long style, + const wxString& name) +{ + return wxControl::Create + ( + parent, + id, + pos, + size, + style, + wxDefaultValidator, + name + ); +} + +wxBookCtrlBase::~wxBookCtrlBase() +{ + if ( m_ownsImageList ) + { + // may be NULL, ok + delete m_imageList; + } +} + +// ---------------------------------------------------------------------------- +// image list +// ---------------------------------------------------------------------------- + +void wxBookCtrlBase::SetImageList(wxImageList *imageList) +{ + if ( m_ownsImageList ) + { + // may be NULL, ok + delete m_imageList; + + m_ownsImageList = false; + } + + m_imageList = imageList; +} + +void wxBookCtrlBase::AssignImageList(wxImageList* imageList) +{ + SetImageList(imageList); + + m_ownsImageList = true; +} + +// ---------------------------------------------------------------------------- +// geometry +// ---------------------------------------------------------------------------- + +void wxBookCtrlBase::DoInvalidateBestSize() +{ + // notice that it is not necessary to invalidate our own best size + // explicitly if we have m_bookctrl as it will already invalidate the best + // size of its parent when its own size is invalidated and its parent is + // this control + if ( m_bookctrl ) + m_bookctrl->InvalidateBestSize(); + else + wxControl::InvalidateBestSize(); +} + +void wxBookCtrlBase::SetPageSize(const wxSize& size) +{ + SetClientSize(CalcSizeFromPage(size)); +} + +wxSize wxBookCtrlBase::DoGetBestSize() const +{ + wxSize bestSize; + + // iterate over all pages, get the largest width and height + const size_t nCount = m_pages.size(); + for ( size_t nPage = 0; nPage < nCount; nPage++ ) + { + const wxWindow * const pPage = m_pages[nPage]; + if( pPage ) + { + wxSize childBestSize(pPage->GetBestSize()); + + if ( childBestSize.x > bestSize.x ) + bestSize.x = childBestSize.x; + + if ( childBestSize.y > bestSize.y ) + bestSize.y = childBestSize.y; + } + } + + if (m_fitToCurrentPage && GetCurrentPage()) + bestSize = GetCurrentPage()->GetBestSize(); + + // convert display area to window area, adding the size necessary for the + // tabs + wxSize best = CalcSizeFromPage(bestSize); + CacheBestSize(best); + return best; +} + +wxRect wxBookCtrlBase::GetPageRect() const +{ + const wxSize size = GetControllerSize(); + + wxPoint pt; + wxRect rectPage(pt, GetClientSize()); + + switch ( GetWindowStyle() & wxBK_ALIGN_MASK ) + { + default: + wxFAIL_MSG( _T("unexpected alignment") ); + // fall through + + case wxBK_TOP: + rectPage.y = size.y + GetInternalBorder(); + // fall through + + case wxBK_BOTTOM: + rectPage.height -= size.y + GetInternalBorder(); + if (rectPage.height < 0) + rectPage.height = 0; + break; + + case wxBK_LEFT: + rectPage.x = size.x + GetInternalBorder(); + // fall through + + case wxBK_RIGHT: + rectPage.width -= size.x + GetInternalBorder(); + if (rectPage.width < 0) + rectPage.width = 0; + break; + } + + return rectPage; +} + +// Lay out controls +void wxBookCtrlBase::DoSize() +{ + if ( !m_bookctrl ) + { + // we're not fully created yet or OnSize() should be hidden by derived class + return; + } + + if (GetSizer()) + Layout(); + else + { + // resize controller and the page area to fit inside our new size + const wxSize sizeClient( GetClientSize() ), + sizeBorder( m_bookctrl->GetSize() - m_bookctrl->GetClientSize() ), + sizeCtrl( GetControllerSize() ); + + m_bookctrl->SetClientSize( sizeCtrl.x - sizeBorder.x, sizeCtrl.y - sizeBorder.y ); + + const wxSize sizeNew = m_bookctrl->GetSize(); + wxPoint posCtrl; + switch ( GetWindowStyle() & wxBK_ALIGN_MASK ) + { + default: + wxFAIL_MSG( _T("unexpected alignment") ); + // fall through + + case wxBK_TOP: + case wxBK_LEFT: + // posCtrl is already ok + break; + + case wxBK_BOTTOM: + posCtrl.y = sizeClient.y - sizeNew.y; + break; + + case wxBK_RIGHT: + posCtrl.x = sizeClient.x - sizeNew.x; + break; + } + + if ( m_bookctrl->GetPosition() != posCtrl ) + m_bookctrl->Move(posCtrl); + } + + // resize all pages to fit the new control size + const wxRect pageRect = GetPageRect(); + const unsigned pagesCount = m_pages.Count(); + for ( unsigned int i = 0; i < pagesCount; ++i ) + { + wxWindow * const page = m_pages[i]; + if ( !page ) + { + wxASSERT_MSG( AllowNullPage(), + _T("Null page in a control that does not allow null pages?") ); + continue; + } + + page->SetSize(pageRect); + } +} + +void wxBookCtrlBase::OnSize(wxSizeEvent& event) +{ + event.Skip(); + + DoSize(); +} + +wxSize wxBookCtrlBase::GetControllerSize() const +{ + if(!m_bookctrl) + return wxSize(0,0); + + const wxSize sizeClient = GetClientSize(), + sizeBorder = m_bookctrl->GetSize() - m_bookctrl->GetClientSize(), + sizeCtrl = m_bookctrl->GetBestSize() + sizeBorder; + + wxSize size; + + if ( IsVertical() ) + { + size.x = sizeClient.x; + size.y = sizeCtrl.y; + } + else // left/right aligned + { + size.x = sizeCtrl.x; + size.y = sizeClient.y; + } + + return size; +} + +// ---------------------------------------------------------------------------- +// miscellaneous stuff +// ---------------------------------------------------------------------------- + +#if wxUSE_HELP + +void wxBookCtrlBase::OnHelp(wxHelpEvent& event) +{ + // determine where does this even originate from to avoid redirecting it + // back to the page which generated it (resulting in an infinite loop) + + // notice that we have to check in the hard(er) way instead of just testing + // if the event object == this because the book control can have other + // subcontrols inside it (e.g. wxSpinButton in case of a notebook in wxUniv) + wxWindow *source = wxStaticCast(event.GetEventObject(), wxWindow); + while ( source && source != this && source->GetParent() != this ) + { + source = source->GetParent(); + } + + if ( source && m_pages.Index(source) == wxNOT_FOUND ) + { + // this event is for the book control itself, redirect it to the + // corresponding page + wxWindow *page = NULL; + + if ( event.GetOrigin() == wxHelpEvent::Origin_HelpButton ) + { + // show help for the page under the mouse + const int pagePos = HitTest(ScreenToClient(event.GetPosition())); + + if ( pagePos != wxNOT_FOUND) + { + page = GetPage((size_t)pagePos); + } + } + else // event from keyboard or unknown source + { + // otherwise show the current page help + page = GetCurrentPage(); + } + + if ( page ) + { + // change event object to the page to avoid infinite recursion if + // we get this event ourselves if the page doesn't handle it + event.SetEventObject(page); + + if ( page->GetEventHandler()->ProcessEvent(event) ) + { + // don't call event.Skip() + return; + } + } + } + //else: event coming from one of our pages already + + event.Skip(); +} + +#endif // wxUSE_HELP + +// ---------------------------------------------------------------------------- +// pages management +// ---------------------------------------------------------------------------- + +bool +wxBookCtrlBase::InsertPage(size_t nPage, + wxWindow *page, + const wxString& WXUNUSED(text), + bool WXUNUSED(bSelect), + int WXUNUSED(imageId)) +{ + wxCHECK_MSG( page || AllowNullPage(), false, + _T("NULL page in wxBookCtrlBase::InsertPage()") ); + wxCHECK_MSG( nPage <= m_pages.size(), false, + _T("invalid page index in wxBookCtrlBase::InsertPage()") ); + + m_pages.Insert(page, nPage); + if ( page ) + page->SetSize(GetPageRect()); + + DoInvalidateBestSize(); + + return true; +} + +bool wxBookCtrlBase::DeletePage(size_t nPage) +{ + wxWindow *page = DoRemovePage(nPage); + if ( !(page || AllowNullPage()) ) + return false; + + // delete NULL is harmless + delete page; + + return true; +} + +wxWindow *wxBookCtrlBase::DoRemovePage(size_t nPage) +{ + wxCHECK_MSG( nPage < m_pages.size(), NULL, + _T("invalid page index in wxBookCtrlBase::DoRemovePage()") ); + + wxWindow *pageRemoved = m_pages[nPage]; + m_pages.RemoveAt(nPage); + DoInvalidateBestSize(); + + return pageRemoved; +} + +int wxBookCtrlBase::GetNextPage(bool forward) const +{ + int nPage; + + int nMax = GetPageCount(); + if ( nMax-- ) // decrement it to get the last valid index + { + int nSel = GetSelection(); + + // change selection wrapping if it becomes invalid + nPage = forward ? nSel == nMax ? 0 + : nSel + 1 + : nSel == 0 ? nMax + : nSel - 1; + } + else // notebook is empty, no next page + { + nPage = wxNOT_FOUND; + } + + return nPage; +} + +int wxBookCtrlBase::DoSetSelection(size_t n, int flags) +{ + wxCHECK_MSG( n < GetPageCount(), wxNOT_FOUND, + wxT("invalid page index in wxBookCtrlBase::DoSetSelection()") ); + + const int oldSel = GetSelection(); + + if ( n != (size_t)oldSel ) + { + wxBookCtrlBaseEvent *event = CreatePageChangingEvent(); + bool allowed = false; + + if ( flags & SetSelection_SendEvent ) + { + event->SetSelection(n); + event->SetOldSelection(oldSel); + event->SetEventObject(this); + + allowed = !GetEventHandler()->ProcessEvent(*event) || event->IsAllowed(); + } + + if ( !(flags & SetSelection_SendEvent) || allowed) + { + if ( oldSel != wxNOT_FOUND ) + m_pages[oldSel]->Hide(); + + wxWindow *page = m_pages[n]; + page->SetSize(GetPageRect()); + page->Show(); + + // change selection now to ignore the selection change event + UpdateSelectedPage(n); + + if ( flags & SetSelection_SendEvent ) + { + // program allows the page change + MakeChangedEvent(*event); + (void)GetEventHandler()->ProcessEvent(*event); + } + } + + delete event; + } + + return oldSel; +} + + +#endif // wxUSE_BOOKCTRL diff --git a/Externals/wxWidgets/src/common/choiccmn.cpp b/Externals/wxWidgets/src/common/choiccmn.cpp new file mode 100644 index 0000000000..94481b9141 --- /dev/null +++ b/Externals/wxWidgets/src/common/choiccmn.cpp @@ -0,0 +1,55 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/choiccmn.cpp +// Purpose: common (to all ports) wxChoice functions +// Author: Vadim Zeitlin +// Modified by: +// Created: 26.07.99 +// RCS-ID: $Id: choiccmn.cpp 39470 2006-05-30 07:34:30Z ABX $ +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_CHOICE + +#include "wx/choice.h" + +#ifndef WX_PRECOMP +#endif + +const wxChar wxChoiceNameStr[] = wxT("choice"); + +// ============================================================================ +// implementation +// ============================================================================ + +wxChoiceBase::~wxChoiceBase() +{ + // this destructor is required for Darwin +} + +// ---------------------------------------------------------------------------- +// misc +// ---------------------------------------------------------------------------- + +void wxChoiceBase::Command(wxCommandEvent& event) +{ + SetSelection(event.GetInt()); + (void)ProcessEvent(event); +} + +#endif // wxUSE_CHOICE diff --git a/Externals/wxWidgets/src/common/clipcmn.cpp b/Externals/wxWidgets/src/common/clipcmn.cpp new file mode 100644 index 0000000000..d4912cf8e1 --- /dev/null +++ b/Externals/wxWidgets/src/common/clipcmn.cpp @@ -0,0 +1,63 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/clipcmn.cpp +// Purpose: common (to all ports) wxClipboard functions +// Author: Robert Roebling +// Modified by: +// Created: 28.06.99 +// RCS-ID: $Id: clipcmn.cpp 40943 2006-08-31 19:31:43Z ABX $ +// Copyright: (c) Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_CLIPBOARD + +#include "wx/clipbrd.h" + +#ifndef WX_PRECOMP + #include "wx/module.h" +#endif + +static wxClipboard *gs_clipboard = NULL; + +/*static*/ wxClipboard *wxClipboardBase::Get() +{ + if ( !gs_clipboard ) + { + gs_clipboard = new wxClipboard; + } + return gs_clipboard; +} + +// ---------------------------------------------------------------------------- +// wxClipboardModule: module responsible for destroying the global clipboard +// object +// ---------------------------------------------------------------------------- + +class wxClipboardModule : public wxModule +{ +public: + bool OnInit() { return true; } + void OnExit() { wxDELETE(gs_clipboard); } + +private: + DECLARE_DYNAMIC_CLASS(wxClipboardModule) +}; + +IMPLEMENT_DYNAMIC_CLASS(wxClipboardModule, wxModule) + +#endif // wxUSE_CLIPBOARD diff --git a/Externals/wxWidgets/src/common/clntdata.cpp b/Externals/wxWidgets/src/common/clntdata.cpp new file mode 100644 index 0000000000..f097259f86 --- /dev/null +++ b/Externals/wxWidgets/src/common/clntdata.cpp @@ -0,0 +1,83 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: common/clntdata.cpp +// Purpose: A mixin class for holding a wxClientData or void pointer +// Author: Robin Dunn +// Modified by: +// Created: 9-Oct-2001 +// RCS-ID: $Id: clntdata.cpp 35650 2005-09-23 12:56:45Z MR $ +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#include "wx/clntdata.h" + + +// ---------------------------------------------------------------------------- + + +wxClientDataContainer::wxClientDataContainer() +{ + // no client data (yet) + m_clientData = NULL; + m_clientDataType = wxClientData_None; +} + +wxClientDataContainer::~wxClientDataContainer() +{ + // we only delete object data, not untyped + if ( m_clientDataType == wxClientData_Object ) + delete m_clientObject; +} + +void wxClientDataContainer::DoSetClientObject( wxClientData *data ) +{ + wxASSERT_MSG( m_clientDataType != wxClientData_Void, + wxT("can't have both object and void client data") ); + + if ( m_clientObject ) + delete m_clientObject; + + m_clientObject = data; + m_clientDataType = wxClientData_Object; +} + +wxClientData *wxClientDataContainer::DoGetClientObject() const +{ + // it's not an error to call GetClientObject() on a window which doesn't + // have client data at all - NULL will be returned + wxASSERT_MSG( m_clientDataType != wxClientData_Void, + wxT("this window doesn't have object client data") ); + + return m_clientObject; +} + +void wxClientDataContainer::DoSetClientData( void *data ) +{ + wxASSERT_MSG( m_clientDataType != wxClientData_Object, + wxT("can't have both object and void client data") ); + + m_clientData = data; + m_clientDataType = wxClientData_Void; +} + +void *wxClientDataContainer::DoGetClientData() const +{ + // it's not an error to call GetClientData() on a window which doesn't have + // client data at all - NULL will be returned + wxASSERT_MSG( m_clientDataType != wxClientData_Object, + wxT("this window doesn't have void client data") ); + + return m_clientData; +} + + +// ---------------------------------------------------------------------------- + + diff --git a/Externals/wxWidgets/src/common/clrpickercmn.cpp b/Externals/wxWidgets/src/common/clrpickercmn.cpp new file mode 100644 index 0000000000..b62f6fc2bd --- /dev/null +++ b/Externals/wxWidgets/src/common/clrpickercmn.cpp @@ -0,0 +1,149 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/common/clrpickercmn.cpp +// Purpose: wxColourPickerCtrl class implementation +// Author: Francesco Montorsi (readapted code written by Vadim Zeitlin) +// Modified by: +// Created: 15/04/2006 +// RCS-ID: $Id: clrpickercmn.cpp 42219 2006-10-21 19:53:05Z PC $ +// Copyright: (c) Vadim Zeitlin, Francesco Montorsi +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_COLOURPICKERCTRL + +#include "wx/clrpicker.h" + +#ifndef WX_PRECOMP + #include "wx/textctrl.h" +#endif + +const wxChar wxColourPickerCtrlNameStr[] = wxT("colourpicker"); +const wxChar wxColourPickerWidgetNameStr[] = wxT("colourpickerwidget"); + +// ============================================================================ +// implementation +// ============================================================================ + +DEFINE_EVENT_TYPE(wxEVT_COMMAND_COLOURPICKER_CHANGED) +IMPLEMENT_DYNAMIC_CLASS(wxColourPickerCtrl, wxPickerBase) +IMPLEMENT_DYNAMIC_CLASS(wxColourPickerEvent, wxEvent) + +// ---------------------------------------------------------------------------- +// wxColourPickerCtrl +// ---------------------------------------------------------------------------- + +#define M_PICKER ((wxColourPickerWidget*)m_picker) + +bool wxColourPickerCtrl::Create( wxWindow *parent, wxWindowID id, + const wxColour &col, + const wxPoint &pos, const wxSize &size, + long style, const wxValidator& validator, + const wxString &name ) +{ + if (!wxPickerBase::CreateBase(parent, id, col.GetAsString(), pos, size, + style, validator, name)) + return false; + + // we are not interested to the ID of our picker as we connect + // to its "changed" event dynamically... + m_picker = new wxColourPickerWidget(this, wxID_ANY, col, + wxDefaultPosition, wxDefaultSize, + GetPickerStyle(style)); + + // complete sizer creation + wxPickerBase::PostCreation(); + + m_picker->Connect(wxEVT_COMMAND_COLOURPICKER_CHANGED, + wxColourPickerEventHandler(wxColourPickerCtrl::OnColourChange), + NULL, this); + + return true; +} + +void wxColourPickerCtrl::SetColour(const wxColour &col) +{ + M_PICKER->SetColour(col); + UpdateTextCtrlFromPicker(); +} + +bool wxColourPickerCtrl::SetColour(const wxString &text) +{ + wxColour col(text); // smart wxString->wxColour conversion + if ( !col.Ok() ) + return false; + M_PICKER->SetColour(col); + UpdateTextCtrlFromPicker(); + + return true; +} + +void wxColourPickerCtrl::UpdatePickerFromTextCtrl() +{ + wxASSERT(m_text); + + if (m_bIgnoreNextTextCtrlUpdate) + { + // ignore this update + m_bIgnoreNextTextCtrlUpdate = false; + return; + } + + // wxString -> wxColour conversion + wxColour col(m_text->GetValue()); + if ( !col.Ok() ) + return; // invalid user input + + if (M_PICKER->GetColour() != col) + { + M_PICKER->SetColour(col); + + // fire an event + wxColourPickerEvent event(this, GetId(), col); + GetEventHandler()->ProcessEvent(event); + } +} + +void wxColourPickerCtrl::UpdateTextCtrlFromPicker() +{ + if (!m_text) + return; // no textctrl to update + + // NOTE: this SetValue() will generate an unwanted wxEVT_COMMAND_TEXT_UPDATED + // which will trigger a unneeded UpdateFromTextCtrl(); thus before using + // SetValue() we set the m_bIgnoreNextTextCtrlUpdate flag... + m_bIgnoreNextTextCtrlUpdate = true; + m_text->SetValue(M_PICKER->GetColour().GetAsString()); +} + + + +// ---------------------------------------------------------------------------- +// wxColourPickerCtrl - event handlers +// ---------------------------------------------------------------------------- + +void wxColourPickerCtrl::OnColourChange(wxColourPickerEvent &ev) +{ + UpdateTextCtrlFromPicker(); + + // the wxColourPickerWidget sent us a colour-change notification. + // forward this event to our parent + wxColourPickerEvent event(this, GetId(), ev.GetColour()); + GetEventHandler()->ProcessEvent(event); +} + +#endif // wxUSE_COLOURPICKERCTRL diff --git a/Externals/wxWidgets/src/common/cmdline.cpp b/Externals/wxWidgets/src/common/cmdline.cpp new file mode 100644 index 0000000000..52c5c2a13d --- /dev/null +++ b/Externals/wxWidgets/src/common/cmdline.cpp @@ -0,0 +1,1247 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/common/cmdline.cpp +// Purpose: wxCmdLineParser implementation +// Author: Vadim Zeitlin +// Modified by: +// Created: 05.01.00 +// RCS-ID: $Id: cmdline.cpp 42197 2006-10-21 14:04:27Z VZ $ +// Copyright: (c) 2000 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#ifndef WX_PRECOMP + #include "wx/dynarray.h" + #include "wx/string.h" + #include "wx/log.h" + #include "wx/intl.h" + #include "wx/app.h" +#endif //WX_PRECOMP + +#include "wx/cmdline.h" + +#if wxUSE_CMDLINE_PARSER + +#include + +#include "wx/datetime.h" +#include "wx/msgout.h" +#include "wx/filename.h" + +// ---------------------------------------------------------------------------- +// private functions +// ---------------------------------------------------------------------------- + +static wxString GetTypeName(wxCmdLineParamType type); + +static wxString GetOptionName(const wxChar *p, const wxChar *allowedChars); + +static wxString GetShortOptionName(const wxChar *p); + +static wxString GetLongOptionName(const wxChar *p); + +// ---------------------------------------------------------------------------- +// private structs +// ---------------------------------------------------------------------------- + +// an internal representation of an option +struct wxCmdLineOption +{ + wxCmdLineOption(wxCmdLineEntryType k, + const wxString& shrt, + const wxString& lng, + const wxString& desc, + wxCmdLineParamType typ, + int fl) + { + wxASSERT_MSG( !shrt.empty() || !lng.empty(), + _T("option should have at least one name") ); + + wxASSERT_MSG + ( + GetShortOptionName(shrt).Len() == shrt.Len(), + wxT("Short option contains invalid characters") + ); + + wxASSERT_MSG + ( + GetLongOptionName(lng).Len() == lng.Len(), + wxT("Long option contains invalid characters") + ); + + + kind = k; + + shortName = shrt; + longName = lng; + description = desc; + + type = typ; + flags = fl; + + m_hasVal = false; + } + + // can't use union easily here, so just store all possible data fields, we + // don't waste much (might still use union later if the number of supported + // types increases, so always use the accessor functions and don't access + // the fields directly!) + + void Check(wxCmdLineParamType WXUNUSED_UNLESS_DEBUG(typ)) const + { + wxASSERT_MSG( type == typ, _T("type mismatch in wxCmdLineOption") ); + } + + long GetLongVal() const + { Check(wxCMD_LINE_VAL_NUMBER); return m_longVal; } + const wxString& GetStrVal() const + { Check(wxCMD_LINE_VAL_STRING); return m_strVal; } +#if wxUSE_DATETIME + const wxDateTime& GetDateVal() const + { Check(wxCMD_LINE_VAL_DATE); return m_dateVal; } +#endif // wxUSE_DATETIME + + void SetLongVal(long val) + { Check(wxCMD_LINE_VAL_NUMBER); m_longVal = val; m_hasVal = true; } + void SetStrVal(const wxString& val) + { Check(wxCMD_LINE_VAL_STRING); m_strVal = val; m_hasVal = true; } +#if wxUSE_DATETIME + void SetDateVal(const wxDateTime& val) + { Check(wxCMD_LINE_VAL_DATE); m_dateVal = val; m_hasVal = true; } +#endif // wxUSE_DATETIME + + void SetHasValue(bool hasValue = true) { m_hasVal = hasValue; } + bool HasValue() const { return m_hasVal; } + +public: + wxCmdLineEntryType kind; + wxString shortName, + longName, + description; + wxCmdLineParamType type; + int flags; + +private: + bool m_hasVal; + + long m_longVal; + wxString m_strVal; +#if wxUSE_DATETIME + wxDateTime m_dateVal; +#endif // wxUSE_DATETIME +}; + +struct wxCmdLineParam +{ + wxCmdLineParam(const wxString& desc, + wxCmdLineParamType typ, + int fl) + : description(desc) + { + type = typ; + flags = fl; + } + + wxString description; + wxCmdLineParamType type; + int flags; +}; + +WX_DECLARE_OBJARRAY(wxCmdLineOption, wxArrayOptions); +WX_DECLARE_OBJARRAY(wxCmdLineParam, wxArrayParams); + +#include "wx/arrimpl.cpp" + +WX_DEFINE_OBJARRAY(wxArrayOptions) +WX_DEFINE_OBJARRAY(wxArrayParams) + +// the parser internal state +struct wxCmdLineParserData +{ + // options + wxString m_switchChars; // characters which may start an option + bool m_enableLongOptions; // true if long options are enabled + wxString m_logo; // some extra text to show in Usage() + + // cmd line data + wxArrayString m_arguments; // == argv, argc == m_arguments.GetCount() + wxArrayOptions m_options; // all possible options and switchrs + wxArrayParams m_paramDesc; // description of all possible params + wxArrayString m_parameters; // all params found + + // methods + wxCmdLineParserData(); + void SetArguments(int argc, char **argv); +#if wxUSE_UNICODE + void SetArguments(int argc, wxChar **argv); +#endif // wxUSE_UNICODE + void SetArguments(const wxString& cmdline); + + int FindOption(const wxString& name); + int FindOptionByLongName(const wxString& name); +}; + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxCmdLineParserData +// ---------------------------------------------------------------------------- + +wxCmdLineParserData::wxCmdLineParserData() +{ + m_enableLongOptions = true; +#ifdef __UNIX_LIKE__ + m_switchChars = _T("-"); +#else // !Unix + m_switchChars = _T("/-"); +#endif +} + +void wxCmdLineParserData::SetArguments(int argc, char **argv) +{ + m_arguments.clear(); + + for ( int n = 0; n < argc; n++ ) + { + m_arguments.push_back(wxString::FromAscii(argv[n])); + } +} + +#if wxUSE_UNICODE + +void wxCmdLineParserData::SetArguments(int argc, wxChar **argv) +{ + m_arguments.clear(); + + for ( int n = 0; n < argc; n++ ) + { + m_arguments.push_back(argv[n]); + } +} + +#endif // wxUSE_UNICODE + +void wxCmdLineParserData::SetArguments(const wxString& cmdLine) +{ + m_arguments.clear(); + + if(wxTheApp && wxTheApp->argc > 0) + m_arguments.push_back(wxTheApp->argv[0]); + else + m_arguments.push_back(wxEmptyString); + + wxArrayString args = wxCmdLineParser::ConvertStringToArgs(cmdLine); + + WX_APPEND_ARRAY(m_arguments, args); +} + +int wxCmdLineParserData::FindOption(const wxString& name) +{ + if ( !name.empty() ) + { + size_t count = m_options.GetCount(); + for ( size_t n = 0; n < count; n++ ) + { + if ( m_options[n].shortName == name ) + { + // found + return n; + } + } + } + + return wxNOT_FOUND; +} + +int wxCmdLineParserData::FindOptionByLongName(const wxString& name) +{ + size_t count = m_options.GetCount(); + for ( size_t n = 0; n < count; n++ ) + { + if ( m_options[n].longName == name ) + { + // found + return n; + } + } + + return wxNOT_FOUND; +} + +// ---------------------------------------------------------------------------- +// construction and destruction +// ---------------------------------------------------------------------------- + +void wxCmdLineParser::Init() +{ + m_data = new wxCmdLineParserData; +} + +void wxCmdLineParser::SetCmdLine(int argc, char **argv) +{ + m_data->SetArguments(argc, argv); +} + +#if wxUSE_UNICODE + +void wxCmdLineParser::SetCmdLine(int argc, wxChar **argv) +{ + m_data->SetArguments(argc, argv); +} + +#endif // wxUSE_UNICODE + +void wxCmdLineParser::SetCmdLine(const wxString& cmdline) +{ + m_data->SetArguments(cmdline); +} + +wxCmdLineParser::~wxCmdLineParser() +{ + delete m_data; +} + +// ---------------------------------------------------------------------------- +// options +// ---------------------------------------------------------------------------- + +void wxCmdLineParser::SetSwitchChars(const wxString& switchChars) +{ + m_data->m_switchChars = switchChars; +} + +void wxCmdLineParser::EnableLongOptions(bool enable) +{ + m_data->m_enableLongOptions = enable; +} + +bool wxCmdLineParser::AreLongOptionsEnabled() +{ + return m_data->m_enableLongOptions; +} + +void wxCmdLineParser::SetLogo(const wxString& logo) +{ + m_data->m_logo = logo; +} + +// ---------------------------------------------------------------------------- +// command line construction +// ---------------------------------------------------------------------------- + +void wxCmdLineParser::SetDesc(const wxCmdLineEntryDesc *desc) +{ + for ( ;; desc++ ) + { + switch ( desc->kind ) + { + case wxCMD_LINE_SWITCH: + AddSwitch(desc->shortName, desc->longName, desc->description, + desc->flags); + break; + + case wxCMD_LINE_OPTION: + AddOption(desc->shortName, desc->longName, desc->description, + desc->type, desc->flags); + break; + + case wxCMD_LINE_PARAM: + AddParam(desc->description, desc->type, desc->flags); + break; + + default: + wxFAIL_MSG( _T("unknown command line entry type") ); + // still fall through + + case wxCMD_LINE_NONE: + return; + } + } +} + +void wxCmdLineParser::AddSwitch(const wxString& shortName, + const wxString& longName, + const wxString& desc, + int flags) +{ + wxASSERT_MSG( m_data->FindOption(shortName) == wxNOT_FOUND, + _T("duplicate switch") ); + + wxCmdLineOption *option = new wxCmdLineOption(wxCMD_LINE_SWITCH, + shortName, longName, desc, + wxCMD_LINE_VAL_NONE, flags); + + m_data->m_options.Add(option); +} + +void wxCmdLineParser::AddOption(const wxString& shortName, + const wxString& longName, + const wxString& desc, + wxCmdLineParamType type, + int flags) +{ + wxASSERT_MSG( m_data->FindOption(shortName) == wxNOT_FOUND, + _T("duplicate option") ); + + wxCmdLineOption *option = new wxCmdLineOption(wxCMD_LINE_OPTION, + shortName, longName, desc, + type, flags); + + m_data->m_options.Add(option); +} + +void wxCmdLineParser::AddParam(const wxString& desc, + wxCmdLineParamType type, + int flags) +{ + // do some consistency checks: a required parameter can't follow an + // optional one and nothing should follow a parameter with MULTIPLE flag +#ifdef __WXDEBUG__ + if ( !m_data->m_paramDesc.IsEmpty() ) + { + wxCmdLineParam& param = m_data->m_paramDesc.Last(); + + wxASSERT_MSG( !(param.flags & wxCMD_LINE_PARAM_MULTIPLE), + _T("all parameters after the one with wxCMD_LINE_PARAM_MULTIPLE style will be ignored") ); + + if ( !(flags & wxCMD_LINE_PARAM_OPTIONAL) ) + { + wxASSERT_MSG( !(param.flags & wxCMD_LINE_PARAM_OPTIONAL), + _T("a required parameter can't follow an optional one") ); + } + } +#endif // Debug + + wxCmdLineParam *param = new wxCmdLineParam(desc, type, flags); + + m_data->m_paramDesc.Add(param); +} + +// ---------------------------------------------------------------------------- +// access to parse command line +// ---------------------------------------------------------------------------- + +bool wxCmdLineParser::Found(const wxString& name) const +{ + int i = m_data->FindOption(name); + if ( i == wxNOT_FOUND ) + i = m_data->FindOptionByLongName(name); + + wxCHECK_MSG( i != wxNOT_FOUND, false, _T("unknown switch") ); + + wxCmdLineOption& opt = m_data->m_options[(size_t)i]; + if ( !opt.HasValue() ) + return false; + + return true; +} + +bool wxCmdLineParser::Found(const wxString& name, wxString *value) const +{ + int i = m_data->FindOption(name); + if ( i == wxNOT_FOUND ) + i = m_data->FindOptionByLongName(name); + + wxCHECK_MSG( i != wxNOT_FOUND, false, _T("unknown option") ); + + wxCmdLineOption& opt = m_data->m_options[(size_t)i]; + if ( !opt.HasValue() ) + return false; + + wxCHECK_MSG( value, false, _T("NULL pointer in wxCmdLineOption::Found") ); + + *value = opt.GetStrVal(); + + return true; +} + +bool wxCmdLineParser::Found(const wxString& name, long *value) const +{ + int i = m_data->FindOption(name); + if ( i == wxNOT_FOUND ) + i = m_data->FindOptionByLongName(name); + + wxCHECK_MSG( i != wxNOT_FOUND, false, _T("unknown option") ); + + wxCmdLineOption& opt = m_data->m_options[(size_t)i]; + if ( !opt.HasValue() ) + return false; + + wxCHECK_MSG( value, false, _T("NULL pointer in wxCmdLineOption::Found") ); + + *value = opt.GetLongVal(); + + return true; +} + +#if wxUSE_DATETIME +bool wxCmdLineParser::Found(const wxString& name, wxDateTime *value) const +{ + int i = m_data->FindOption(name); + if ( i == wxNOT_FOUND ) + i = m_data->FindOptionByLongName(name); + + wxCHECK_MSG( i != wxNOT_FOUND, false, _T("unknown option") ); + + wxCmdLineOption& opt = m_data->m_options[(size_t)i]; + if ( !opt.HasValue() ) + return false; + + wxCHECK_MSG( value, false, _T("NULL pointer in wxCmdLineOption::Found") ); + + *value = opt.GetDateVal(); + + return true; +} +#endif // wxUSE_DATETIME + +size_t wxCmdLineParser::GetParamCount() const +{ + return m_data->m_parameters.size(); +} + +wxString wxCmdLineParser::GetParam(size_t n) const +{ + wxCHECK_MSG( n < GetParamCount(), wxEmptyString, _T("invalid param index") ); + + return m_data->m_parameters[n]; +} + +// Resets switches and options +void wxCmdLineParser::Reset() +{ + for ( size_t i = 0; i < m_data->m_options.Count(); i++ ) + { + wxCmdLineOption& opt = m_data->m_options[i]; + opt.SetHasValue(false); + } +} + + +// ---------------------------------------------------------------------------- +// the real work is done here +// ---------------------------------------------------------------------------- + +int wxCmdLineParser::Parse(bool showUsage) +{ + bool maybeOption = true; // can the following arg be an option? + bool ok = true; // true until an error is detected + bool helpRequested = false; // true if "-h" was given + bool hadRepeatableParam = false; // true if found param with MULTIPLE flag + + size_t currentParam = 0; // the index in m_paramDesc + + size_t countParam = m_data->m_paramDesc.GetCount(); + wxString errorMsg; + + Reset(); + + // parse everything + wxString arg; + size_t count = m_data->m_arguments.size(); + for ( size_t n = 1; ok && (n < count); n++ ) // 0 is program name + { + arg = m_data->m_arguments[n]; + + // special case: "--" should be discarded and all following arguments + // should be considered as parameters, even if they start with '-' and + // not like options (this is POSIX-like) + if ( arg == _T("--") ) + { + maybeOption = false; + + continue; + } + + // empty argument or just '-' is not an option but a parameter + if ( maybeOption && arg.length() > 1 && + wxStrchr(m_data->m_switchChars, arg[0u]) ) + { + bool isLong; + wxString name; + int optInd = wxNOT_FOUND; // init to suppress warnings + + // an option or a switch: find whether it's a long or a short one + if ( arg[0u] == _T('-') && arg[1u] == _T('-') ) + { + // a long one + isLong = true; + + // Skip leading "--" + const wxChar *p = arg.c_str() + 2; + + bool longOptionsEnabled = AreLongOptionsEnabled(); + + name = GetLongOptionName(p); + + if (longOptionsEnabled) + { + optInd = m_data->FindOptionByLongName(name); + if ( optInd == wxNOT_FOUND ) + { + errorMsg << wxString::Format(_("Unknown long option '%s'"), name.c_str()) + << _T('\n'); + } + } + else + { + optInd = wxNOT_FOUND; // Sanity check + + // Print the argument including leading "--" + name.Prepend( wxT("--") ); + errorMsg << wxString::Format(_("Unknown option '%s'"), name.c_str()) + << _T('\n'); + } + + } + else // not a long option + { + isLong = false; + + // a short one: as they can be cumulated, we try to find the + // longest substring which is a valid option + const wxChar *p = arg.c_str() + 1; + + name = GetShortOptionName(p); + + size_t len = name.length(); + do + { + if ( len == 0 ) + { + // we couldn't find a valid option name in the + // beginning of this string + errorMsg << wxString::Format(_("Unknown option '%s'"), name.c_str()) + << _T('\n'); + + break; + } + else + { + optInd = m_data->FindOption(name.Left(len)); + + // will try with one character less the next time + len--; + } + } + while ( optInd == wxNOT_FOUND ); + + len++; // compensates extra len-- above + if ( (optInd != wxNOT_FOUND) && (len != name.length()) ) + { + // first of all, the option name is only part of this + // string + name = name.Left(len); + + // our option is only part of this argument, there is + // something else in it - it is either the value of this + // option or other switches if it is a switch + if ( m_data->m_options[(size_t)optInd].kind + == wxCMD_LINE_SWITCH ) + { + // pretend that all the rest of the argument is the + // next argument, in fact + wxString arg2 = arg[0u]; + arg2 += arg.Mid(len + 1); // +1 for leading '-' + + m_data->m_arguments.insert + (m_data->m_arguments.begin() + n + 1, arg2); + count++; + } + //else: it's our value, we'll deal with it below + } + } + + if ( optInd == wxNOT_FOUND ) + { + ok = false; + + continue; // will break, in fact + } + + // look at what follows: + + // +1 for leading '-' + const wxChar *p = arg.c_str() + 1 + name.length(); + if ( isLong ) + p++; // for another leading '-' + + wxCmdLineOption& opt = m_data->m_options[(size_t)optInd]; + if ( opt.kind == wxCMD_LINE_SWITCH ) + { + // we must check that there is no value following the switch + if ( *p != _T('\0') ) + { + errorMsg << wxString::Format(_("Unexpected characters following option '%s'."), name.c_str()) + << _T('\n'); + ok = false; + } + else // no value, as expected + { + // nothing more to do + opt.SetHasValue(); + + if ( opt.flags & wxCMD_LINE_OPTION_HELP ) + { + helpRequested = true; + + // it's not an error, but we still stop here + ok = false; + } + } + } + else // it's an option. not a switch + { + // get the value + if ( isLong ) + { + if ( *p++ != _T('=') ) + { + errorMsg << wxString::Format(_("Option '%s' requires a value, '=' expected."), name.c_str()) + << _T('\n'); + + ok = false; + } + } + else // short option + { + switch ( *p ) + { + case _T('='): + case _T(':'): + // the value follows + p++; + break; + + case 0: + // the value is in the next argument + if ( ++n == count ) + { + // ... but there is none + errorMsg << wxString::Format(_("Option '%s' requires a value."), + name.c_str()) + << _T('\n'); + + ok = false; + } + else + { + // ... take it from there + p = m_data->m_arguments[n].c_str(); + } + break; + + default: + // the value is right here: this may be legal or + // not depending on the option style + if ( opt.flags & wxCMD_LINE_NEEDS_SEPARATOR ) + { + errorMsg << wxString::Format(_("Separator expected after the option '%s'."), + name.c_str()) + << _T('\n'); + + ok = false; + } + } + } + + if ( ok ) + { + wxString value = p; + switch ( opt.type ) + { + default: + wxFAIL_MSG( _T("unknown option type") ); + // still fall through + + case wxCMD_LINE_VAL_STRING: + opt.SetStrVal(value); + break; + + case wxCMD_LINE_VAL_NUMBER: + { + long val; + if ( value.ToLong(&val) ) + { + opt.SetLongVal(val); + } + else + { + errorMsg << wxString::Format(_("'%s' is not a correct numeric value for option '%s'."), + value.c_str(), name.c_str()) + << _T('\n'); + + ok = false; + } + } + break; + +#if wxUSE_DATETIME + case wxCMD_LINE_VAL_DATE: + { + wxDateTime dt; + const wxChar *res = dt.ParseDate(value); + if ( !res || *res ) + { + errorMsg << wxString::Format(_("Option '%s': '%s' cannot be converted to a date."), + name.c_str(), value.c_str()) + << _T('\n'); + + ok = false; + } + else + { + opt.SetDateVal(dt); + } + } + break; +#endif // wxUSE_DATETIME + } + } + } + } + else // not an option, must be a parameter + { + if ( currentParam < countParam ) + { + wxCmdLineParam& param = m_data->m_paramDesc[currentParam]; + + // TODO check the param type + + m_data->m_parameters.push_back(arg); + + if ( !(param.flags & wxCMD_LINE_PARAM_MULTIPLE) ) + { + currentParam++; + } + else + { + wxASSERT_MSG( currentParam == countParam - 1, + _T("all parameters after the one with wxCMD_LINE_PARAM_MULTIPLE style are ignored") ); + + // remember that we did have this last repeatable parameter + hadRepeatableParam = true; + } + } + else + { + errorMsg << wxString::Format(_("Unexpected parameter '%s'"), arg.c_str()) + << _T('\n'); + + ok = false; + } + } + } + + // verify that all mandatory options were given + if ( ok ) + { + size_t countOpt = m_data->m_options.GetCount(); + for ( size_t n = 0; ok && (n < countOpt); n++ ) + { + wxCmdLineOption& opt = m_data->m_options[n]; + if ( (opt.flags & wxCMD_LINE_OPTION_MANDATORY) && !opt.HasValue() ) + { + wxString optName; + if ( !opt.longName ) + { + optName = opt.shortName; + } + else + { + if ( AreLongOptionsEnabled() ) + { + optName.Printf( _("%s (or %s)"), + opt.shortName.c_str(), + opt.longName.c_str() ); + } + else + { + optName.Printf( wxT("%s"), + opt.shortName.c_str() ); + } + } + + errorMsg << wxString::Format(_("The value for the option '%s' must be specified."), + optName.c_str()) + << _T('\n'); + + ok = false; + } + } + + for ( ; ok && (currentParam < countParam); currentParam++ ) + { + wxCmdLineParam& param = m_data->m_paramDesc[currentParam]; + if ( (currentParam == countParam - 1) && + (param.flags & wxCMD_LINE_PARAM_MULTIPLE) && + hadRepeatableParam ) + { + // special case: currentParam wasn't incremented, but we did + // have it, so don't give error + continue; + } + + if ( !(param.flags & wxCMD_LINE_PARAM_OPTIONAL) ) + { + errorMsg << wxString::Format(_("The required parameter '%s' was not specified."), + param.description.c_str()) + << _T('\n'); + + ok = false; + } + } + } + + // if there was an error during parsing the command line, show this error + // and also the usage message if it had been requested + if ( !ok && (!errorMsg.empty() || (helpRequested && showUsage)) ) + { + wxMessageOutput* msgOut = wxMessageOutput::Get(); + if ( msgOut ) + { + wxString usage; + if ( showUsage ) + usage = GetUsageString(); + + msgOut->Printf( wxT("%s%s"), usage.c_str(), errorMsg.c_str() ); + } + else + { + wxFAIL_MSG( _T("no wxMessageOutput object?") ); + } + } + + return ok ? 0 : helpRequested ? -1 : 1; +} + +// ---------------------------------------------------------------------------- +// give the usage message +// ---------------------------------------------------------------------------- + +void wxCmdLineParser::Usage() +{ + wxMessageOutput* msgOut = wxMessageOutput::Get(); + if ( msgOut ) + { + msgOut->Printf( wxT("%s"), GetUsageString().c_str() ); + } + else + { + wxFAIL_MSG( _T("no wxMessageOutput object?") ); + } +} + +wxString wxCmdLineParser::GetUsageString() +{ + wxString appname; + if ( m_data->m_arguments.empty() ) + { + if ( wxTheApp ) + appname = wxTheApp->GetAppName(); + } + else // use argv[0] + { + appname = wxFileName(m_data->m_arguments[0]).GetName(); + } + + // we construct the brief cmd line desc on the fly, but not the detailed + // help message below because we want to align the options descriptions + // and for this we must first know the longest one of them + wxString usage; + wxArrayString namesOptions, descOptions; + + if ( !m_data->m_logo.empty() ) + { + usage << m_data->m_logo << _T('\n'); + } + + usage << wxString::Format(_("Usage: %s"), appname.c_str()); + + // the switch char is usually '-' but this can be changed with + // SetSwitchChars() and then the first one of possible chars is used + wxChar chSwitch = !m_data->m_switchChars ? _T('-') + : m_data->m_switchChars[0u]; + + bool areLongOptionsEnabled = AreLongOptionsEnabled(); + size_t n, count = m_data->m_options.GetCount(); + for ( n = 0; n < count; n++ ) + { + wxCmdLineOption& opt = m_data->m_options[n]; + + usage << _T(' '); + if ( !(opt.flags & wxCMD_LINE_OPTION_MANDATORY) ) + { + usage << _T('['); + } + + if ( !opt.shortName.empty() ) + { + usage << chSwitch << opt.shortName; + } + else if ( areLongOptionsEnabled && !opt.longName.empty() ) + { + usage << _T("--") << opt.longName; + } + else + { + if (!opt.longName.empty()) + { + wxFAIL_MSG( wxT("option with only a long name while long ") + wxT("options are disabled") ); + } + else + { + wxFAIL_MSG( _T("option without neither short nor long name") ); + } + } + + wxString option; + + if ( !opt.shortName.empty() ) + { + option << _T(" ") << chSwitch << opt.shortName; + } + + if ( areLongOptionsEnabled && !opt.longName.empty() ) + { + option << (option.empty() ? _T(" ") : _T(", ")) + << _T("--") << opt.longName; + } + + if ( opt.kind != wxCMD_LINE_SWITCH ) + { + wxString val; + val << _T('<') << GetTypeName(opt.type) << _T('>'); + usage << _T(' ') << val; + option << (!opt.longName ? _T(':') : _T('=')) << val; + } + + if ( !(opt.flags & wxCMD_LINE_OPTION_MANDATORY) ) + { + usage << _T(']'); + } + + namesOptions.push_back(option); + descOptions.push_back(opt.description); + } + + count = m_data->m_paramDesc.GetCount(); + for ( n = 0; n < count; n++ ) + { + wxCmdLineParam& param = m_data->m_paramDesc[n]; + + usage << _T(' '); + if ( param.flags & wxCMD_LINE_PARAM_OPTIONAL ) + { + usage << _T('['); + } + + usage << param.description; + + if ( param.flags & wxCMD_LINE_PARAM_MULTIPLE ) + { + usage << _T("..."); + } + + if ( param.flags & wxCMD_LINE_PARAM_OPTIONAL ) + { + usage << _T(']'); + } + } + + usage << _T('\n'); + + // now construct the detailed help message + size_t len, lenMax = 0; + count = namesOptions.size(); + for ( n = 0; n < count; n++ ) + { + len = namesOptions[n].length(); + if ( len > lenMax ) + lenMax = len; + } + + for ( n = 0; n < count; n++ ) + { + len = namesOptions[n].length(); + usage << namesOptions[n] + << wxString(_T(' '), lenMax - len) << _T('\t') + << descOptions[n] + << _T('\n'); + } + + return usage; +} + +// ---------------------------------------------------------------------------- +// private functions +// ---------------------------------------------------------------------------- + +static wxString GetTypeName(wxCmdLineParamType type) +{ + wxString s; + switch ( type ) + { + default: + wxFAIL_MSG( _T("unknown option type") ); + // still fall through + + case wxCMD_LINE_VAL_STRING: + s = _("str"); + break; + + case wxCMD_LINE_VAL_NUMBER: + s = _("num"); + break; + + case wxCMD_LINE_VAL_DATE: + s = _("date"); + break; + } + + return s; +} + +/* +Returns a string which is equal to the string pointed to by p, but up to the +point where p contains an character that's not allowed. +Allowable characters are letters and numbers, and characters pointed to by +the parameter allowedChars. + +For example, if p points to "abcde-@-_", and allowedChars is "-_", +this function returns "abcde-". +*/ +static wxString GetOptionName(const wxChar *p, + const wxChar *allowedChars) +{ + wxString argName; + + while ( *p && (wxIsalnum(*p) || wxStrchr(allowedChars, *p)) ) + { + argName += *p++; + } + + return argName; +} + +// Besides alphanumeric characters, short and long options can +// have other characters. + +// A short option additionally can have these +#define wxCMD_LINE_CHARS_ALLOWED_BY_SHORT_OPTION wxT("_?") + +// A long option can have the same characters as a short option and a '-'. +#define wxCMD_LINE_CHARS_ALLOWED_BY_LONG_OPTION \ + wxCMD_LINE_CHARS_ALLOWED_BY_SHORT_OPTION wxT("-") + +static wxString GetShortOptionName(const wxChar *p) +{ + return GetOptionName(p, wxCMD_LINE_CHARS_ALLOWED_BY_SHORT_OPTION); +} + +static wxString GetLongOptionName(const wxChar *p) +{ + return GetOptionName(p, wxCMD_LINE_CHARS_ALLOWED_BY_LONG_OPTION); +} + +#endif // wxUSE_CMDLINE_PARSER + +// ---------------------------------------------------------------------------- +// global functions +// ---------------------------------------------------------------------------- + +/* + This function is mainly used under Windows (as under Unix we always get the + command line arguments as argc/argv anyhow) and so it tries to follow + Windows conventions for the command line handling, not Unix ones. For + instance, backslash is not special except when it precedes double quote when + it does quote it. + */ + +/* static */ +wxArrayString wxCmdLineParser::ConvertStringToArgs(const wxChar *p) +{ + wxArrayString args; + + wxString arg; + arg.reserve(1024); + + bool isInsideQuotes = false; + for ( ;; ) + { + // skip white space + while ( *p == _T(' ') || *p == _T('\t') ) + p++; + + // anything left? + if ( *p == _T('\0') ) + break; + + // parse this parameter + bool endParam = false; + bool lastBS = false; + for ( arg.clear(); !endParam; p++ ) + { + switch ( *p ) + { + case _T('"'): + if ( !lastBS ) + { + isInsideQuotes = !isInsideQuotes; + + // don't put quote in arg + continue; + } + //else: quote has no special meaning but the backslash + // still remains -- makes no sense but this is what + // Windows does + break; + + case _T(' '): + case _T('\t'): + // backslash does *not* quote the space, only quotes do + if ( isInsideQuotes ) + { + // skip assignment below + break; + } + // fall through + + case _T('\0'): + endParam = true; + + break; + } + + if ( endParam ) + { + break; + } + + lastBS = *p == _T('\\'); + + arg += *p; + } + + args.push_back(arg); + } + + return args; +} diff --git a/Externals/wxWidgets/src/common/cmdproc.cpp b/Externals/wxWidgets/src/common/cmdproc.cpp new file mode 100644 index 0000000000..d51fca3610 --- /dev/null +++ b/Externals/wxWidgets/src/common/cmdproc.cpp @@ -0,0 +1,325 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/common/cmdproc.cpp +// Purpose: wxCommand and wxCommandProcessor classes +// Author: Julian Smart (extracted from docview.h by VZ) +// Modified by: +// Created: 05.11.00 +// RCS-ID: $Id: cmdproc.cpp 35650 2005-09-23 12:56:45Z MR $ +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#ifndef WX_PRECOMP + #include "wx/intl.h" + #include "wx/string.h" + #include "wx/menu.h" +#endif //WX_PRECOMP + +#include "wx/cmdproc.h" + +// ============================================================================ +// implementation +// ============================================================================ + +IMPLEMENT_CLASS(wxCommand, wxObject) +IMPLEMENT_DYNAMIC_CLASS(wxCommandProcessor, wxObject) + +// ---------------------------------------------------------------------------- +// wxCommand +// ---------------------------------------------------------------------------- + +wxCommand::wxCommand(bool canUndoIt, const wxString& name) +{ + m_canUndo = canUndoIt; + m_commandName = name; +} + +// ---------------------------------------------------------------------------- +// Command processor +// ---------------------------------------------------------------------------- + +wxCommandProcessor::wxCommandProcessor(int maxCommands) +{ + m_maxNoCommands = maxCommands; +#if wxUSE_MENUS + m_commandEditMenu = (wxMenu *) NULL; +#endif // wxUSE_MENUS + m_undoAccelerator = wxT("\tCtrl+Z"); + m_redoAccelerator = wxT("\tCtrl+Y"); + + m_lastSavedCommand = + m_currentCommand = wxList::compatibility_iterator(); +} + +wxCommandProcessor::~wxCommandProcessor() +{ + ClearCommands(); +} + +bool wxCommandProcessor::DoCommand(wxCommand& cmd) +{ + return cmd.Do(); +} + +bool wxCommandProcessor::UndoCommand(wxCommand& cmd) +{ + return cmd.Undo(); +} + +// Pass a command to the processor. The processor calls Do(); +// if successful, is appended to the command history unless +// storeIt is false. +bool wxCommandProcessor::Submit(wxCommand *command, bool storeIt) +{ + wxCHECK_MSG( command, false, _T("no command in wxCommandProcessor::Submit") ); + + if ( !DoCommand(*command) ) + { + // the user code expects the command to be deleted anyhow + delete command; + + return false; + } + + if ( storeIt ) + Store(command); + else + delete command; + + return true; +} + +void wxCommandProcessor::Store(wxCommand *command) +{ + wxCHECK_RET( command, _T("no command in wxCommandProcessor::Store") ); + + if ( (int)m_commands.GetCount() == m_maxNoCommands ) + { + wxList::compatibility_iterator firstNode = m_commands.GetFirst(); + wxCommand *firstCommand = (wxCommand *)firstNode->GetData(); + delete firstCommand; + m_commands.Erase(firstNode); + + // Make sure m_lastSavedCommand won't point to freed memory + if ( m_lastSavedCommand == firstNode ) + m_lastSavedCommand = wxList::compatibility_iterator(); + } + + // Correct a bug: we must chop off the current 'branch' + // so that we're at the end of the command list. + if (!m_currentCommand) + ClearCommands(); + else + { + wxList::compatibility_iterator node = m_currentCommand->GetNext(); + while (node) + { + wxList::compatibility_iterator next = node->GetNext(); + delete (wxCommand *)node->GetData(); + m_commands.Erase(node); + + // Make sure m_lastSavedCommand won't point to freed memory + if ( m_lastSavedCommand == node ) + m_lastSavedCommand = wxList::compatibility_iterator(); + + node = next; + } + } + + m_commands.Append(command); + m_currentCommand = m_commands.GetLast(); + SetMenuStrings(); +} + +bool wxCommandProcessor::Undo() +{ + wxCommand *command = GetCurrentCommand(); + if ( command && command->CanUndo() ) + { + if ( UndoCommand(*command) ) + { + m_currentCommand = m_currentCommand->GetPrevious(); + SetMenuStrings(); + return true; + } + } + + return false; +} + +bool wxCommandProcessor::Redo() +{ + wxCommand *redoCommand = (wxCommand *) NULL; + wxList::compatibility_iterator redoNode +#if !wxUSE_STL + = NULL // just to avoid warnings +#endif // !wxUSE_STL + ; + + if ( m_currentCommand ) + { + // is there anything to redo? + if ( m_currentCommand->GetNext() ) + { + redoCommand = (wxCommand *)m_currentCommand->GetNext()->GetData(); + redoNode = m_currentCommand->GetNext(); + } + } + else // no current command, redo the first one + { + if (m_commands.GetCount() > 0) + { + redoCommand = (wxCommand *)m_commands.GetFirst()->GetData(); + redoNode = m_commands.GetFirst(); + } + } + + if (redoCommand) + { + bool success = DoCommand(*redoCommand); + if (success) + { + m_currentCommand = redoNode; + SetMenuStrings(); + return true; + } + } + return false; +} + +bool wxCommandProcessor::CanUndo() const +{ + wxCommand *command = GetCurrentCommand(); + + return command && command->CanUndo(); +} + +bool wxCommandProcessor::CanRedo() const +{ + if (m_currentCommand && !m_currentCommand->GetNext()) + return false; + + if (m_currentCommand && m_currentCommand->GetNext()) + return true; + + if (!m_currentCommand && (m_commands.GetCount() > 0)) + return true; + + return false; +} + +void wxCommandProcessor::Initialize() +{ + m_currentCommand = m_commands.GetLast(); + SetMenuStrings(); +} + +void wxCommandProcessor::SetMenuStrings() +{ +#if wxUSE_MENUS + if (m_commandEditMenu) + { + wxString undoLabel = GetUndoMenuLabel(); + wxString redoLabel = GetRedoMenuLabel(); + + m_commandEditMenu->SetLabel(wxID_UNDO, undoLabel); + m_commandEditMenu->Enable(wxID_UNDO, CanUndo()); + + m_commandEditMenu->SetLabel(wxID_REDO, redoLabel); + m_commandEditMenu->Enable(wxID_REDO, CanRedo()); + } +#endif // wxUSE_MENUS +} + +// Gets the current Undo menu label. +wxString wxCommandProcessor::GetUndoMenuLabel() const +{ + wxString buf; + if (m_currentCommand) + { + wxCommand *command = (wxCommand *)m_currentCommand->GetData(); + wxString commandName(command->GetName()); + if (commandName.empty()) commandName = _("Unnamed command"); + bool canUndo = command->CanUndo(); + if (canUndo) + buf = wxString(_("&Undo ")) + commandName + m_undoAccelerator; + else + buf = wxString(_("Can't &Undo ")) + commandName + m_undoAccelerator; + } + else + { + buf = _("&Undo") + m_undoAccelerator; + } + + return buf; +} + +// Gets the current Undo menu label. +wxString wxCommandProcessor::GetRedoMenuLabel() const +{ + wxString buf; + if (m_currentCommand) + { + // We can redo, if we're not at the end of the history. + if (m_currentCommand->GetNext()) + { + wxCommand *redoCommand = (wxCommand *)m_currentCommand->GetNext()->GetData(); + wxString redoCommandName(redoCommand->GetName()); + if (redoCommandName.empty()) redoCommandName = _("Unnamed command"); + buf = wxString(_("&Redo ")) + redoCommandName + m_redoAccelerator; + } + else + { + buf = _("&Redo") + m_redoAccelerator; + } + } + else + { + if (m_commands.GetCount() == 0) + { + buf = _("&Redo") + m_redoAccelerator; + } + else + { + // currentCommand is NULL but there are commands: this means that + // we've undone to the start of the list, but can redo the first. + wxCommand *redoCommand = (wxCommand *)m_commands.GetFirst()->GetData(); + wxString redoCommandName(redoCommand->GetName()); + if (redoCommandName.empty()) redoCommandName = _("Unnamed command"); + buf = wxString(_("&Redo ")) + redoCommandName + m_redoAccelerator; + } + } + return buf; +} + +void wxCommandProcessor::ClearCommands() +{ + wxList::compatibility_iterator node = m_commands.GetFirst(); + while (node) + { + wxCommand *command = (wxCommand *)node->GetData(); + delete command; + m_commands.Erase(node); + node = m_commands.GetFirst(); + } + + m_currentCommand = wxList::compatibility_iterator(); + m_lastSavedCommand = wxList::compatibility_iterator(); +} + + diff --git a/Externals/wxWidgets/src/common/cmndata.cpp b/Externals/wxWidgets/src/common/cmndata.cpp new file mode 100644 index 0000000000..8d937b9fb1 --- /dev/null +++ b/Externals/wxWidgets/src/common/cmndata.cpp @@ -0,0 +1,657 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/cmndata.cpp +// Purpose: Common GDI data +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: cmndata.cpp 43762 2006-12-03 15:26:01Z SC $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#include "wx/cmndata.h" + +#ifndef WX_PRECOMP + #if defined(__WXMSW__) + #include "wx/msw/wrapcdlg.h" + #endif // MSW + #include + #include "wx/string.h" + #include "wx/utils.h" + #include "wx/app.h" + #include "wx/log.h" + #include "wx/gdicmn.h" +#endif + +#include "wx/prntbase.h" +#include "wx/printdlg.h" + +#if wxUSE_FONTDLG + #include "wx/fontdlg.h" +#endif // wxUSE_FONTDLG + +#if wxUSE_PRINTING_ARCHITECTURE + +#include "wx/paper.h" + +#if defined(__WXMAC__) + #include "wx/mac/private/print.h" +#endif + +IMPLEMENT_DYNAMIC_CLASS(wxPrintData, wxObject) +IMPLEMENT_DYNAMIC_CLASS(wxPrintDialogData, wxObject) +IMPLEMENT_DYNAMIC_CLASS(wxPageSetupDialogData, wxObject) + +#endif // wxUSE_PRINTING_ARCHITECTURE + +IMPLEMENT_DYNAMIC_CLASS(wxFontData, wxObject) +IMPLEMENT_DYNAMIC_CLASS(wxColourData, wxObject) + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxColourData +// ---------------------------------------------------------------------------- + +wxColourData::wxColourData() +{ + m_chooseFull = false; + m_dataColour.Set(0,0,0); + // m_custColours are wxNullColours initially +} + +wxColourData::wxColourData(const wxColourData& data) + : wxObject() +{ + (*this) = data; +} + +wxColourData::~wxColourData() +{ +} + +void wxColourData::SetCustomColour(int i, const wxColour& colour) +{ + wxCHECK_RET( (i >= 0 && i < 16), _T("custom colour index out of range") ); + + m_custColours[i] = colour; +} + +wxColour wxColourData::GetCustomColour(int i) +{ + wxCHECK_MSG( (i >= 0 && i < 16), wxColour(0,0,0), + _T("custom colour index out of range") ); + + return m_custColours[i]; +} + +void wxColourData::operator=(const wxColourData& data) +{ + int i; + for (i = 0; i < 16; i++) + m_custColours[i] = data.m_custColours[i]; + + m_dataColour = (wxColour&)data.m_dataColour; + m_chooseFull = data.m_chooseFull; +} + +// ---------------------------------------------------------------------------- +// Font data +// ---------------------------------------------------------------------------- + +wxFontData::wxFontData() +{ + // Intialize colour to black. + m_fontColour = wxNullColour; + + m_showHelp = false; + m_allowSymbols = true; + m_enableEffects = true; + m_minSize = 0; + m_maxSize = 0; + + m_encoding = wxFONTENCODING_SYSTEM; +} + +wxFontData::~wxFontData() +{ +} + +#if wxUSE_FONTDLG + +wxFontDialogBase::~wxFontDialogBase() +{ +} + +#endif // wxUSE_FONTDLG + +#if wxUSE_PRINTING_ARCHITECTURE +// ---------------------------------------------------------------------------- +// Print data +// ---------------------------------------------------------------------------- + +wxPrintData::wxPrintData() +{ + m_bin = wxPRINTBIN_DEFAULT; + m_media = wxPRINTMEDIA_DEFAULT; + m_printMode = wxPRINT_MODE_PRINTER; + m_printOrientation = wxPORTRAIT; + m_printOrientationReversed = false; + m_printNoCopies = 1; + m_printCollate = false; + + // New, 24/3/99 + m_printerName = wxEmptyString; + m_colour = true; + m_duplexMode = wxDUPLEX_SIMPLEX; + m_printQuality = wxPRINT_QUALITY_HIGH; + + // we intentionally don't initialize paper id and size at all, like this + // the default system settings will be used for them + m_paperId = wxPAPER_NONE; + m_paperSize = wxDefaultSize; + + m_privData = NULL; + m_privDataLen = 0; + + m_nativeData = wxPrintFactory::GetFactory()->CreatePrintNativeData(); +} + +wxPrintData::wxPrintData(const wxPrintData& printData) + : wxObject() +{ + m_nativeData = NULL; + m_privData = NULL; + (*this) = printData; +} + +void wxPrintData::SetPrivData( char *privData, int len ) +{ + if (m_privData) + { + delete [] m_privData; + m_privData = NULL; + } + m_privDataLen = len; + if (m_privDataLen > 0) + { + m_privData = new char[m_privDataLen]; + memcpy( m_privData, privData, m_privDataLen ); + } +} + +wxPrintData::~wxPrintData() +{ + m_nativeData->m_ref--; + if (m_nativeData->m_ref == 0) + delete m_nativeData; + + if (m_privData) + delete [] m_privData; +} + +void wxPrintData::ConvertToNative() +{ + m_nativeData->TransferFrom( *this ) ; +} + +void wxPrintData::ConvertFromNative() +{ + m_nativeData->TransferTo( *this ) ; +} + +void wxPrintData::operator=(const wxPrintData& data) +{ + m_printNoCopies = data.m_printNoCopies; + m_printCollate = data.m_printCollate; + m_printOrientation = data.m_printOrientation; + m_printOrientationReversed = data.m_printOrientationReversed; + m_printerName = data.m_printerName; + m_colour = data.m_colour; + m_duplexMode = data.m_duplexMode; + m_printQuality = data.m_printQuality; + m_paperId = data.m_paperId; + m_paperSize = data.m_paperSize; + m_bin = data.m_bin; + m_media = data.m_media; + m_printMode = data.m_printMode; + m_filename = data.m_filename; + + // UnRef old m_nativeData + if (m_nativeData) + { + m_nativeData->m_ref--; + if (m_nativeData->m_ref == 0) + delete m_nativeData; + } + // Set Ref new one + m_nativeData = data.GetNativeData(); + m_nativeData->m_ref++; + + if (m_privData) + { + delete [] m_privData; + m_privData = NULL; + } + m_privDataLen = data.GetPrivDataLen(); + if (m_privDataLen > 0) + { + m_privData = new char[m_privDataLen]; + memcpy( m_privData, data.GetPrivData(), m_privDataLen ); + } +} + +// Is this data OK for showing the print dialog? +bool wxPrintData::IsOk() const +{ + m_nativeData->TransferFrom( *this ); + + return m_nativeData->Ok(); +} + +// What should happen here? wxPostScriptPrintNativeData is not +// defined unless all this is true on MSW. +#if WXWIN_COMPATIBILITY_2_4 && wxUSE_PRINTING_ARCHITECTURE && (!defined(__WXMSW__) || wxUSE_POSTSCRIPT_ARCHITECTURE_IN_MSW) + +#include "wx/generic/prntdlgg.h" + +#if wxUSE_POSTSCRIPT + #define WXUNUSED_WITHOUT_PS(name) name +#else + #define WXUNUSED_WITHOUT_PS(name) WXUNUSED(name) +#endif + +wxString wxPrintData::GetPrinterCommand() const +{ +#if wxUSE_POSTSCRIPT + if (m_nativeData && wxIsKindOf(m_nativeData,wxPostScriptPrintNativeData)) + return ((wxPostScriptPrintNativeData*)m_nativeData)->GetPrinterCommand(); +#endif + return wxEmptyString; +} + +wxString wxPrintData::GetPrinterOptions() const +{ +#if wxUSE_POSTSCRIPT + if (m_nativeData && wxIsKindOf(m_nativeData,wxPostScriptPrintNativeData)) + return ((wxPostScriptPrintNativeData*)m_nativeData)->GetPrinterOptions(); +#endif + return wxEmptyString; +} + +wxString wxPrintData::GetPreviewCommand() const +{ +#if wxUSE_POSTSCRIPT + if (m_nativeData && wxIsKindOf(m_nativeData,wxPostScriptPrintNativeData)) + return ((wxPostScriptPrintNativeData*)m_nativeData)->GetPreviewCommand(); +#endif + return wxEmptyString; +} + +wxString wxPrintData::GetFontMetricPath() const +{ +#if wxUSE_POSTSCRIPT + if (m_nativeData && wxIsKindOf(m_nativeData,wxPostScriptPrintNativeData)) + return ((wxPostScriptPrintNativeData*)m_nativeData)->GetFontMetricPath(); +#endif + return wxEmptyString; +} + +double wxPrintData::GetPrinterScaleX() const +{ +#if wxUSE_POSTSCRIPT + if (m_nativeData && wxIsKindOf(m_nativeData,wxPostScriptPrintNativeData)) + return ((wxPostScriptPrintNativeData*)m_nativeData)->GetPrinterScaleX(); +#endif + return 1.0; +} + +double wxPrintData::GetPrinterScaleY() const +{ +#if wxUSE_POSTSCRIPT + if (m_nativeData && wxIsKindOf(m_nativeData,wxPostScriptPrintNativeData)) + return ((wxPostScriptPrintNativeData*)m_nativeData)->GetPrinterScaleY(); +#endif + return 1.0; +} + +long wxPrintData::GetPrinterTranslateX() const +{ +#if wxUSE_POSTSCRIPT + if (m_nativeData && wxIsKindOf(m_nativeData,wxPostScriptPrintNativeData)) + return ((wxPostScriptPrintNativeData*)m_nativeData)->GetPrinterTranslateX(); +#endif + return 0; +} + +long wxPrintData::GetPrinterTranslateY() const +{ +#if wxUSE_POSTSCRIPT + if (m_nativeData && wxIsKindOf(m_nativeData,wxPostScriptPrintNativeData)) + return ((wxPostScriptPrintNativeData*)m_nativeData)->GetPrinterTranslateY(); +#endif + return 0; +} + +void wxPrintData::SetPrinterCommand(const wxString& WXUNUSED_WITHOUT_PS(command)) +{ +#if wxUSE_POSTSCRIPT + if (m_nativeData && wxIsKindOf(m_nativeData,wxPostScriptPrintNativeData)) + ((wxPostScriptPrintNativeData*)m_nativeData)->SetPrinterCommand( command ); +#endif +} + +void wxPrintData::SetPrinterOptions(const wxString& WXUNUSED_WITHOUT_PS(options)) +{ +#if wxUSE_POSTSCRIPT + if (m_nativeData && wxIsKindOf(m_nativeData,wxPostScriptPrintNativeData)) + ((wxPostScriptPrintNativeData*)m_nativeData)->SetPrinterOptions( options ); +#endif +} + +void wxPrintData::SetPreviewCommand(const wxString& WXUNUSED_WITHOUT_PS(command)) +{ +#if wxUSE_POSTSCRIPT + if (m_nativeData && wxIsKindOf(m_nativeData,wxPostScriptPrintNativeData)) + ((wxPostScriptPrintNativeData*)m_nativeData)->SetPreviewCommand( command ); +#endif +} + +void wxPrintData::SetFontMetricPath(const wxString& WXUNUSED_WITHOUT_PS(path)) +{ +#if wxUSE_POSTSCRIPT + if (m_nativeData && wxIsKindOf(m_nativeData,wxPostScriptPrintNativeData)) + ((wxPostScriptPrintNativeData*)m_nativeData)->SetFontMetricPath( path ); +#endif +} + +void wxPrintData::SetPrinterScaleX(double WXUNUSED_WITHOUT_PS(x)) +{ +#if wxUSE_POSTSCRIPT + if (m_nativeData && wxIsKindOf(m_nativeData,wxPostScriptPrintNativeData)) + ((wxPostScriptPrintNativeData*)m_nativeData)->SetPrinterScaleX( x ); +#endif +} + +void wxPrintData::SetPrinterScaleY(double WXUNUSED_WITHOUT_PS(y)) +{ +#if wxUSE_POSTSCRIPT + if (m_nativeData && wxIsKindOf(m_nativeData,wxPostScriptPrintNativeData)) + ((wxPostScriptPrintNativeData*)m_nativeData)->SetPrinterScaleY( y ); +#endif +} + +void wxPrintData::SetPrinterScaling(double WXUNUSED_WITHOUT_PS(x), double WXUNUSED_WITHOUT_PS(y)) +{ +#if wxUSE_POSTSCRIPT + if (m_nativeData && wxIsKindOf(m_nativeData,wxPostScriptPrintNativeData)) + ((wxPostScriptPrintNativeData*)m_nativeData)->SetPrinterScaling( x, y ); +#endif +} + +void wxPrintData::SetPrinterTranslateX(long WXUNUSED_WITHOUT_PS(x)) +{ +#if wxUSE_POSTSCRIPT + if (m_nativeData && wxIsKindOf(m_nativeData,wxPostScriptPrintNativeData)) + ((wxPostScriptPrintNativeData*)m_nativeData)->SetPrinterTranslateX( x ); +#endif +} + +void wxPrintData::SetPrinterTranslateY(long WXUNUSED_WITHOUT_PS(y)) +{ +#if wxUSE_POSTSCRIPT + if (m_nativeData && wxIsKindOf(m_nativeData,wxPostScriptPrintNativeData)) + ((wxPostScriptPrintNativeData*)m_nativeData)->SetPrinterTranslateY( y ); +#endif +} + +void wxPrintData::SetPrinterTranslation(long WXUNUSED_WITHOUT_PS(x), long WXUNUSED_WITHOUT_PS(y)) +{ +#if wxUSE_POSTSCRIPT + if (m_nativeData && wxIsKindOf(m_nativeData,wxPostScriptPrintNativeData)) + ((wxPostScriptPrintNativeData*)m_nativeData)->SetPrinterTranslation( x, y ); +#endif +} +#endif + +// ---------------------------------------------------------------------------- +// Print dialog data +// ---------------------------------------------------------------------------- + +wxPrintDialogData::wxPrintDialogData() +{ + m_printFromPage = 0; + m_printToPage = 0; + m_printMinPage = 0; + m_printMaxPage = 0; + m_printNoCopies = 1; + m_printAllPages = false; + m_printCollate = false; + m_printToFile = false; + m_printSelection = false; + m_printEnableSelection = false; + m_printEnablePageNumbers = true; + + wxPrintFactory* factory = wxPrintFactory::GetFactory(); + m_printEnablePrintToFile = ! factory->HasOwnPrintToFile(); + + m_printEnableHelp = false; +#if WXWIN_COMPATIBILITY_2_4 + m_printSetupDialog = false; +#endif +} + +wxPrintDialogData::wxPrintDialogData(const wxPrintDialogData& dialogData) + : wxObject() +{ + (*this) = dialogData; +} + +wxPrintDialogData::wxPrintDialogData(const wxPrintData& printData) +{ + m_printFromPage = 1; + m_printToPage = 0; + m_printMinPage = 1; + m_printMaxPage = 9999; + m_printNoCopies = 1; + m_printAllPages = false; + m_printCollate = false; + m_printToFile = false; + m_printSelection = false; + m_printEnableSelection = false; + m_printEnablePageNumbers = true; + m_printEnablePrintToFile = true; + m_printEnableHelp = false; +#if WXWIN_COMPATIBILITY_2_4 + m_printSetupDialog = false; +#endif + m_printData = printData; +} + +wxPrintDialogData::~wxPrintDialogData() +{ +} + +void wxPrintDialogData::operator=(const wxPrintDialogData& data) +{ + m_printFromPage = data.m_printFromPage; + m_printToPage = data.m_printToPage; + m_printMinPage = data.m_printMinPage; + m_printMaxPage = data.m_printMaxPage; + m_printNoCopies = data.m_printNoCopies; + m_printAllPages = data.m_printAllPages; + m_printCollate = data.m_printCollate; + m_printToFile = data.m_printToFile; + m_printSelection = data.m_printSelection; + m_printEnableSelection = data.m_printEnableSelection; + m_printEnablePageNumbers = data.m_printEnablePageNumbers; + m_printEnableHelp = data.m_printEnableHelp; + m_printEnablePrintToFile = data.m_printEnablePrintToFile; +#if WXWIN_COMPATIBILITY_2_4 + m_printSetupDialog = data.m_printSetupDialog; +#endif + m_printData = data.m_printData; +} + +void wxPrintDialogData::operator=(const wxPrintData& data) +{ + m_printData = data; +} + +// ---------------------------------------------------------------------------- +// wxPageSetupDialogData +// ---------------------------------------------------------------------------- + +wxPageSetupDialogData::wxPageSetupDialogData() +{ + m_paperSize = wxSize(0,0); + + CalculatePaperSizeFromId(); + + m_minMarginTopLeft = + m_minMarginBottomRight = + m_marginTopLeft = + m_marginBottomRight = wxPoint(0,0); + + // Flags + m_defaultMinMargins = false; + m_enableMargins = true; + m_enableOrientation = true; + m_enablePaper = true; + m_enablePrinter = true; + m_enableHelp = false; + m_getDefaultInfo = false; +} + +wxPageSetupDialogData::wxPageSetupDialogData(const wxPageSetupDialogData& dialogData) + : wxObject() +{ + (*this) = dialogData; +} + +wxPageSetupDialogData::wxPageSetupDialogData(const wxPrintData& printData) +{ + m_paperSize = wxSize(0,0); + m_minMarginTopLeft = + m_minMarginBottomRight = + m_marginTopLeft = + m_marginBottomRight = wxPoint(0,0); + + // Flags + m_defaultMinMargins = false; + m_enableMargins = true; + m_enableOrientation = true; + m_enablePaper = true; + m_enablePrinter = true; + m_enableHelp = false; + m_getDefaultInfo = false; + + m_printData = printData; + + // The wxPrintData paper size overrides these values, unless the size cannot + // be found. + CalculatePaperSizeFromId(); +} + +wxPageSetupDialogData::~wxPageSetupDialogData() +{ +} + +wxPageSetupDialogData& wxPageSetupDialogData::operator=(const wxPageSetupDialogData& data) +{ + m_paperSize = data.m_paperSize; + m_minMarginTopLeft = data.m_minMarginTopLeft; + m_minMarginBottomRight = data.m_minMarginBottomRight; + m_marginTopLeft = data.m_marginTopLeft; + m_marginBottomRight = data.m_marginBottomRight; + m_defaultMinMargins = data.m_defaultMinMargins; + m_enableMargins = data.m_enableMargins; + m_enableOrientation = data.m_enableOrientation; + m_enablePaper = data.m_enablePaper; + m_enablePrinter = data.m_enablePrinter; + m_getDefaultInfo = data.m_getDefaultInfo; + m_enableHelp = data.m_enableHelp; + + m_printData = data.m_printData; + + return *this; +} + +wxPageSetupDialogData& wxPageSetupDialogData::operator=(const wxPrintData& data) +{ + m_printData = data; + CalculatePaperSizeFromId(); + + return *this; +} + +// If a corresponding paper type is found in the paper database, will set the m_printData +// paper size id member as well. +void wxPageSetupDialogData::SetPaperSize(const wxSize& sz) +{ + m_paperSize = sz; + + CalculateIdFromPaperSize(); +} + +// Sets the wxPrintData id, plus the paper width/height if found in the paper database. +void wxPageSetupDialogData::SetPaperSize(wxPaperSize id) +{ + m_printData.SetPaperId(id); + + CalculatePaperSizeFromId(); +} + +void wxPageSetupDialogData::SetPrintData(const wxPrintData& printData) +{ + m_printData = printData; + CalculatePaperSizeFromId(); +} + +// Use paper size defined in this object to set the wxPrintData +// paper id +void wxPageSetupDialogData::CalculateIdFromPaperSize() +{ + wxASSERT_MSG( (wxThePrintPaperDatabase != (wxPrintPaperDatabase*) NULL), + wxT("wxThePrintPaperDatabase should not be NULL. Do not create global print dialog data objects.") ); + + wxSize sz = GetPaperSize(); + + wxPaperSize id = wxThePrintPaperDatabase->GetSize(wxSize(sz.x* 10, sz.y * 10)); + if (id != wxPAPER_NONE) + { + m_printData.SetPaperId(id); + } +} + +// Use paper id in wxPrintData to set this object's paper size +void wxPageSetupDialogData::CalculatePaperSizeFromId() +{ + wxASSERT_MSG( (wxThePrintPaperDatabase != (wxPrintPaperDatabase*) NULL), + wxT("wxThePrintPaperDatabase should not be NULL. Do not create global print dialog data objects.") ); + + wxSize sz = wxThePrintPaperDatabase->GetSize(m_printData.GetPaperId()); + + // sz is in 10ths of a mm, while paper size is in mm + m_paperSize.x = sz.x / 10; + m_paperSize.y = sz.y / 10; +} + +#endif // wxUSE_PRINTING_ARCHITECTURE diff --git a/Externals/wxWidgets/src/common/colourcmn.cpp b/Externals/wxWidgets/src/common/colourcmn.cpp new file mode 100644 index 0000000000..0bd34c8c90 --- /dev/null +++ b/Externals/wxWidgets/src/common/colourcmn.cpp @@ -0,0 +1,126 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/colourcmn.cpp +// Purpose: wxColourBase implementation +// Author: Francesco Montorsi +// Modified by: +// Created: 20/4/2006 +// RCS-ID: $Id: colourcmn.cpp 41538 2006-09-30 20:45:15Z RR $ +// Copyright: (c) Francesco Montorsi +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#include "wx/colour.h" + +#ifndef WX_PRECOMP + #include "wx/log.h" + #include "wx/utils.h" + #include "wx/gdicmn.h" +#endif + +#if wxUSE_VARIANT +IMPLEMENT_VARIANT_OBJECT_EXPORTED(wxColour,WXDLLEXPORT) +#endif + +// ============================================================================ +// wxString <-> wxColour conversions +// ============================================================================ + +bool wxColourBase::FromString(const wxChar *str) +{ + if ( str == NULL || str[0] == wxT('\0')) + return false; // invalid or empty string + + if ( wxStrncmp(str, wxT("RGB"), 3) == 0 || + wxStrncmp(str, wxT("rgb"), 3) == 0 ) + { + // CSS-like RGB specification + // according to http://www.w3.org/TR/REC-CSS2/syndata.html#color-units + // values outside 0-255 range are allowed but should be clipped + int red, green, blue; + if (wxSscanf(&str[3], wxT("(%d, %d, %d)"), &red, &green, &blue) != 3) + return false; + + Set((unsigned char)wxClip(red,0,255), + (unsigned char)wxClip(green,0,255), + (unsigned char)wxClip(blue,0,255)); + } + else if ( str[0] == wxT('#') && wxStrlen(str) == 7 ) + { + // hexadecimal prefixed with # (HTML syntax) + unsigned long tmp; + if (wxSscanf(&str[1], wxT("%lx"), &tmp) != 1) + return false; + + Set((unsigned char)(tmp >> 16), + (unsigned char)(tmp >> 8), + (unsigned char)tmp); + } + else if (wxTheColourDatabase) // a colour name ? + { + // we can't do + // *this = wxTheColourDatabase->Find(str) + // because this place can be called from constructor + // and 'this' could not be available yet + wxColour clr = wxTheColourDatabase->Find(str); + if (clr.Ok()) + Set((unsigned char)clr.Red(), + (unsigned char)clr.Green(), + (unsigned char)clr.Blue()); + } + + if (Ok()) + return true; + + wxLogDebug(wxT("wxColour::Set - couldn't set to colour string '%s'"), str); + return false; +} + +wxString wxColourBase::GetAsString(long flags) const +{ + wxString colName; + + if (flags & wxC2S_NAME) + colName = wxTheColourDatabase->FindName((const wxColour &)(*this)).MakeLower(); + + if ( colName.empty() && (flags & wxC2S_CSS_SYNTAX) ) + { + // no name for this colour; return it in CSS syntax + colName.Printf(wxT("rgb(%d, %d, %d)"), + Red(), Green(), Blue()); + } + else if ( colName.empty() && (flags & wxC2S_HTML_SYNTAX) ) + { + // no name for this colour; return it in HTML syntax + colName.Printf(wxT("#%02X%02X%02X"), + Red(), Green(), Blue()); + } + + // this function always returns a non-empty string + wxASSERT_MSG(!colName.empty(), + wxT("Invalid wxColour -> wxString conversion flags")); + + return colName; +} + +#if WXWIN_COMPATIBILITY_2_6 + +// static +wxColour wxColourBase::CreateByName(const wxString& name) +{ + return wxColour(name); +} + +void wxColourBase::InitFromName(const wxString& col) +{ + Set(col); +} + +#endif // WXWIN_COMPATIBILITY_2_6 diff --git a/Externals/wxWidgets/src/common/combocmn.cpp b/Externals/wxWidgets/src/common/combocmn.cpp new file mode 100644 index 0000000000..0af24efd3c --- /dev/null +++ b/Externals/wxWidgets/src/common/combocmn.cpp @@ -0,0 +1,2302 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/combocmn.cpp +// Purpose: wxComboCtrlBase +// Author: Jaakko Salli +// Modified by: +// Created: Apr-30-2006 +// RCS-ID: $Id: combocmn.cpp 45512 2007-04-16 20:51:27Z RD $ +// Copyright: (c) 2005 Jaakko Salli +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_COMBOCTRL + +#include "wx/combobox.h" + +#ifndef WX_PRECOMP + #include "wx/app.h" + #include "wx/log.h" + #include "wx/dcclient.h" + #include "wx/settings.h" + #include "wx/dialog.h" + #include "wx/timer.h" +#endif + +#include "wx/tooltip.h" + +#include "wx/combo.h" + + + +// constants +// ---------------------------------------------------------------------------- + +#define DEFAULT_DROPBUTTON_WIDTH 19 + +#define BMP_BUTTON_MARGIN 4 + +#define DEFAULT_POPUP_HEIGHT 400 + +#define DEFAULT_TEXT_INDENT 3 + +#define COMBO_MARGIN 2 // spacing right of wxTextCtrl + + +#if defined(__WXMSW__) + +#define USE_TRANSIENT_POPUP 1 // Use wxPopupWindowTransient (preferred, if it works properly on platform) +#define TRANSIENT_POPUPWIN_IS_PERFECT 0 // wxPopupTransientWindow works, its child can have focus, and common + // native controls work on it like normal. +#define POPUPWIN_IS_PERFECT 0 // Same, but for non-transient popup window. +#define TEXTCTRL_TEXT_CENTERED 0 // 1 if text in textctrl is vertically centered +#define FOCUS_RING 0 // No focus ring on wxMSW + +//#undef wxUSE_POPUPWIN +//#define wxUSE_POPUPWIN 0 + +#elif defined(__WXGTK__) + +// NB: It is not recommended to use wxDialog as popup on wxGTK, because of +// this bug: If wxDialog is hidden, its position becomes corrupt +// between hide and next show, but without internal coordinates being +// reflected (or something like that - atleast commenting out ->Hide() +// seemed to eliminate the position change). + +#define USE_TRANSIENT_POPUP 1 // Use wxPopupWindowTransient (preferred, if it works properly on platform) +#define TRANSIENT_POPUPWIN_IS_PERFECT 0 // wxPopupTransientWindow works, its child can have focus, and common + // native controls work on it like normal. +#define POPUPWIN_IS_PERFECT 1 // Same, but for non-transient popup window. +#define TEXTCTRL_TEXT_CENTERED 1 // 1 if text in textctrl is vertically centered +#define FOCUS_RING 0 // No focus ring on wxGTK + +#elif defined(__WXMAC__) + +#define USE_TRANSIENT_POPUP 0 // Use wxPopupWindowTransient (preferred, if it works properly on platform) +#define TRANSIENT_POPUPWIN_IS_PERFECT 0 // wxPopupTransientWindow works, its child can have focus, and common + // native controls work on it like normal. +#define POPUPWIN_IS_PERFECT 0 // Same, but for non-transient popup window. +#define TEXTCTRL_TEXT_CENTERED 1 // 1 if text in textctrl is vertically centered +#define FOCUS_RING 3 // Reserve room for the textctrl's focus ring to display + +#undef DEFAULT_DROPBUTTON_WIDTH +#define DEFAULT_DROPBUTTON_WIDTH 22 +#undef COMBO_MARGIN +#define COMBO_MARGIN FOCUS_RING + +#else + +#define USE_TRANSIENT_POPUP 0 // Use wxPopupWindowTransient (preferred, if it works properly on platform) +#define TRANSIENT_POPUPWIN_IS_PERFECT 0 // wxPopupTransientWindow works, its child can have focus, and common + // native controls work on it like normal. +#define POPUPWIN_IS_PERFECT 0 // Same, but for non-transient popup window. +#define TEXTCTRL_TEXT_CENTERED 1 // 1 if text in textctrl is vertically centered +#define FOCUS_RING 0 + +#endif + + +// Popupwin is really only supported on wxMSW (not WINCE) and wxGTK, regardless +// what the wxUSE_POPUPWIN says. +// FIXME: Why isn't wxUSE_POPUPWIN reliable any longer? (it was in wxW2.6.2) +#if (!defined(__WXMSW__) && !defined(__WXGTK__)) || defined(__WXWINCE__) +#undef wxUSE_POPUPWIN +#define wxUSE_POPUPWIN 0 +#endif + + +#if wxUSE_POPUPWIN + #include "wx/popupwin.h" +#else + #undef USE_TRANSIENT_POPUP + #define USE_TRANSIENT_POPUP 0 +#endif + + +// Define different types of popup windows +enum +{ + POPUPWIN_NONE = 0, + POPUPWIN_WXPOPUPTRANSIENTWINDOW = 1, + POPUPWIN_WXPOPUPWINDOW = 2, + POPUPWIN_WXDIALOG = 3 +}; + + +#if USE_TRANSIENT_POPUP + // wxPopupTransientWindow is implemented + + #define wxComboPopupWindowBase wxPopupTransientWindow + #define PRIMARY_POPUP_TYPE POPUPWIN_WXPOPUPTRANSIENTWINDOW + #define USES_WXPOPUPTRANSIENTWINDOW 1 + + #if TRANSIENT_POPUPWIN_IS_PERFECT + // + #elif POPUPWIN_IS_PERFECT + #define wxComboPopupWindowBase2 wxPopupWindow + #define SECONDARY_POPUP_TYPE POPUPWIN_WXPOPUPWINDOW + #define USES_WXPOPUPWINDOW 1 + #else + #define wxComboPopupWindowBase2 wxDialog + #define SECONDARY_POPUP_TYPE POPUPWIN_WXDIALOG + #define USES_WXDIALOG 1 + #endif + +#elif wxUSE_POPUPWIN + // wxPopupWindow (but not wxPopupTransientWindow) is properly implemented + + #define wxComboPopupWindowBase wxPopupWindow + #define PRIMARY_POPUP_TYPE POPUPWIN_WXPOPUPWINDOW + #define USES_WXPOPUPWINDOW 1 + + #if !POPUPWIN_IS_PERFECT + #define wxComboPopupWindowBase2 wxDialog + #define SECONDARY_POPUP_TYPE POPUPWIN_WXDIALOG + #define USES_WXDIALOG 1 + #endif + +#else + // wxPopupWindow is not implemented + + #define wxComboPopupWindowBase wxDialog + #define PRIMARY_POPUP_TYPE POPUPWIN_WXDIALOG + #define USES_WXDIALOG 1 + +#endif + + +#ifndef USES_WXPOPUPTRANSIENTWINDOW + #define USES_WXPOPUPTRANSIENTWINDOW 0 +#endif + +#ifndef USES_WXPOPUPWINDOW + #define USES_WXPOPUPWINDOW 0 +#endif + +#ifndef USES_WXDIALOG + #define USES_WXDIALOG 0 +#endif + + +#if USES_WXPOPUPWINDOW + #define INSTALL_TOPLEV_HANDLER 1 +#else + #define INSTALL_TOPLEV_HANDLER 0 +#endif + + +// +// ** TODO ** +// * wxComboPopupWindow for external use (ie. replace old wxUniv wxPopupComboWindow) +// + + +// ---------------------------------------------------------------------------- +// wxComboFrameEventHandler takes care of hiding the popup when events happen +// in its top level parent. +// ---------------------------------------------------------------------------- + +#if INSTALL_TOPLEV_HANDLER + +// +// This will no longer be necessary after wxTransientPopupWindow +// works well on all platforms. +// + +class wxComboFrameEventHandler : public wxEvtHandler +{ +public: + wxComboFrameEventHandler( wxComboCtrlBase* pCb ); + virtual ~wxComboFrameEventHandler(); + + void OnPopup(); + + void OnIdle( wxIdleEvent& event ); + void OnMouseEvent( wxMouseEvent& event ); + void OnActivate( wxActivateEvent& event ); + void OnResize( wxSizeEvent& event ); + void OnMove( wxMoveEvent& event ); + void OnMenuEvent( wxMenuEvent& event ); + void OnClose( wxCloseEvent& event ); + +protected: + wxWindow* m_focusStart; + wxComboCtrlBase* m_combo; + +private: + DECLARE_EVENT_TABLE() +}; + +BEGIN_EVENT_TABLE(wxComboFrameEventHandler, wxEvtHandler) + EVT_IDLE(wxComboFrameEventHandler::OnIdle) + EVT_LEFT_DOWN(wxComboFrameEventHandler::OnMouseEvent) + EVT_RIGHT_DOWN(wxComboFrameEventHandler::OnMouseEvent) + EVT_SIZE(wxComboFrameEventHandler::OnResize) + EVT_MOVE(wxComboFrameEventHandler::OnMove) + EVT_MENU_HIGHLIGHT(wxID_ANY,wxComboFrameEventHandler::OnMenuEvent) + EVT_MENU_OPEN(wxComboFrameEventHandler::OnMenuEvent) + EVT_ACTIVATE(wxComboFrameEventHandler::OnActivate) + EVT_CLOSE(wxComboFrameEventHandler::OnClose) +END_EVENT_TABLE() + +wxComboFrameEventHandler::wxComboFrameEventHandler( wxComboCtrlBase* combo ) + : wxEvtHandler() +{ + m_combo = combo; +} + +wxComboFrameEventHandler::~wxComboFrameEventHandler() +{ +} + +void wxComboFrameEventHandler::OnPopup() +{ + m_focusStart = ::wxWindow::FindFocus(); +} + +void wxComboFrameEventHandler::OnIdle( wxIdleEvent& event ) +{ + wxWindow* winFocused = ::wxWindow::FindFocus(); + + wxWindow* popup = m_combo->GetPopupControl()->GetControl(); + wxWindow* winpopup = m_combo->GetPopupWindow(); + + if ( + winFocused != m_focusStart && + winFocused != popup && + winFocused->GetParent() != popup && + winFocused != winpopup && + winFocused->GetParent() != winpopup && + winFocused != m_combo && + winFocused != m_combo->GetButton() // GTK (atleast) requires this + ) + { + m_combo->HidePopup(); + } + + event.Skip(); +} + +void wxComboFrameEventHandler::OnMenuEvent( wxMenuEvent& event ) +{ + m_combo->HidePopup(); + event.Skip(); +} + +void wxComboFrameEventHandler::OnMouseEvent( wxMouseEvent& event ) +{ + m_combo->HidePopup(); + event.Skip(); +} + +void wxComboFrameEventHandler::OnClose( wxCloseEvent& event ) +{ + m_combo->HidePopup(); + event.Skip(); +} + +void wxComboFrameEventHandler::OnActivate( wxActivateEvent& event ) +{ + m_combo->HidePopup(); + event.Skip(); +} + +void wxComboFrameEventHandler::OnResize( wxSizeEvent& event ) +{ + m_combo->HidePopup(); + event.Skip(); +} + +void wxComboFrameEventHandler::OnMove( wxMoveEvent& event ) +{ + m_combo->HidePopup(); + event.Skip(); +} + +#endif // INSTALL_TOPLEV_HANDLER + +// ---------------------------------------------------------------------------- +// wxComboPopupWindow is, in essence, wxPopupWindow customized for +// wxComboCtrl. +// ---------------------------------------------------------------------------- + +class wxComboPopupWindow : public wxComboPopupWindowBase +{ +public: + + wxComboPopupWindow( wxComboCtrlBase *parent, + int style ) + #if USES_WXPOPUPWINDOW || USES_WXPOPUPTRANSIENTWINDOW + : wxComboPopupWindowBase(parent,style) + #else + : wxComboPopupWindowBase(parent, + wxID_ANY, + wxEmptyString, + wxPoint(-21,-21), + wxSize(20,20), + style) + #endif + { + m_inShow = 0; + } + +#if USES_WXPOPUPTRANSIENTWINDOW + virtual bool Show( bool show ); + virtual bool ProcessLeftDown(wxMouseEvent& event); +protected: + virtual void OnDismiss(); +#endif + +private: + wxByte m_inShow; +}; + + +#if USES_WXPOPUPTRANSIENTWINDOW +bool wxComboPopupWindow::Show( bool show ) +{ + // Guard against recursion + if ( m_inShow ) + return wxComboPopupWindowBase::Show(show); + + m_inShow++; + + wxASSERT( IsKindOf(CLASSINFO(wxPopupTransientWindow)) ); + + wxPopupTransientWindow* ptw = (wxPopupTransientWindow*) this; + wxComboCtrlBase* combo = (wxComboCtrlBase*) GetParent(); + + if ( show != ptw->IsShown() ) + { + if ( show ) + ptw->Popup(combo->GetPopupControl()->GetControl()); + else + ptw->Dismiss(); + } + + m_inShow--; + + return true; +} + +bool wxComboPopupWindow::ProcessLeftDown(wxMouseEvent& event) +{ + return wxPopupTransientWindow::ProcessLeftDown(event); +} + +// First thing that happens when a transient popup closes is that this method gets called. +void wxComboPopupWindow::OnDismiss() +{ + wxComboCtrlBase* combo = (wxComboCtrlBase*) GetParent(); + wxASSERT_MSG( combo->IsKindOf(CLASSINFO(wxComboCtrlBase)), + wxT("parent might not be wxComboCtrl, but check IMPLEMENT_DYNAMIC_CLASS(2) macro for correctness") ); + + combo->OnPopupDismiss(); +} +#endif // USES_WXPOPUPTRANSIENTWINDOW + + +// ---------------------------------------------------------------------------- +// wxComboPopupWindowEvtHandler does bulk of the custom event handling +// of a popup window. It is separate so we can have different types +// of popup windows. +// ---------------------------------------------------------------------------- + +class wxComboPopupWindowEvtHandler : public wxEvtHandler +{ +public: + + wxComboPopupWindowEvtHandler( wxComboCtrlBase *parent ) + { + m_combo = parent; + } + + void OnSizeEvent( wxSizeEvent& event ); + void OnKeyEvent(wxKeyEvent& event); +#if USES_WXDIALOG + void OnActivate( wxActivateEvent& event ); +#endif + +private: + wxComboCtrlBase* m_combo; + + DECLARE_EVENT_TABLE() +}; + + +BEGIN_EVENT_TABLE(wxComboPopupWindowEvtHandler, wxEvtHandler) + EVT_KEY_DOWN(wxComboPopupWindowEvtHandler::OnKeyEvent) + EVT_KEY_UP(wxComboPopupWindowEvtHandler::OnKeyEvent) +#if USES_WXDIALOG + EVT_ACTIVATE(wxComboPopupWindowEvtHandler::OnActivate) +#endif + EVT_SIZE(wxComboPopupWindowEvtHandler::OnSizeEvent) +END_EVENT_TABLE() + + +void wxComboPopupWindowEvtHandler::OnSizeEvent( wxSizeEvent& WXUNUSED(event) ) +{ + // Block the event so that the popup control does not get auto-resized. +} + +void wxComboPopupWindowEvtHandler::OnKeyEvent( wxKeyEvent& event ) +{ + // Relay keyboard event to the main child controls + wxWindowList children = m_combo->GetPopupWindow()->GetChildren(); + wxWindowList::iterator node = children.begin(); + wxWindow* child = (wxWindow*)*node; + child->AddPendingEvent(event); +} + +#if USES_WXDIALOG +void wxComboPopupWindowEvtHandler::OnActivate( wxActivateEvent& event ) +{ + if ( !event.GetActive() ) + { + // Tell combo control that we are dismissed. + m_combo->HidePopup(); + + event.Skip(); + } +} +#endif + + +// ---------------------------------------------------------------------------- +// wxComboPopup +// +// ---------------------------------------------------------------------------- + +wxComboPopup::~wxComboPopup() +{ +} + +void wxComboPopup::OnPopup() +{ +} + +void wxComboPopup::OnDismiss() +{ +} + +wxSize wxComboPopup::GetAdjustedSize( int minWidth, + int prefHeight, + int WXUNUSED(maxHeight) ) +{ + return wxSize(minWidth,prefHeight); +} + +void wxComboPopup::DefaultPaintComboControl( wxComboCtrlBase* combo, + wxDC& dc, const wxRect& rect ) +{ + if ( combo->GetWindowStyle() & wxCB_READONLY ) // ie. no textctrl + { + combo->PrepareBackground(dc,rect,0); + + dc.DrawText( combo->GetValue(), + rect.x + combo->GetTextIndent(), + (rect.height-dc.GetCharHeight())/2 + rect.y ); + } +} + +void wxComboPopup::PaintComboControl( wxDC& dc, const wxRect& rect ) +{ + DefaultPaintComboControl(m_combo,dc,rect); +} + +void wxComboPopup::OnComboKeyEvent( wxKeyEvent& event ) +{ + event.Skip(); +} + +void wxComboPopup::OnComboDoubleClick() +{ +} + +void wxComboPopup::SetStringValue( const wxString& WXUNUSED(value) ) +{ +} + +bool wxComboPopup::LazyCreate() +{ + return false; +} + +void wxComboPopup::Dismiss() +{ + m_combo->HidePopup(); +} + +// ---------------------------------------------------------------------------- +// input handling +// ---------------------------------------------------------------------------- + +// +// This is pushed to the event handler queue of the child textctrl. +// +class wxComboBoxExtraInputHandler : public wxEvtHandler +{ +public: + + wxComboBoxExtraInputHandler( wxComboCtrlBase* combo ) + : wxEvtHandler() + { + m_combo = combo; + } + virtual ~wxComboBoxExtraInputHandler() { } + void OnKey(wxKeyEvent& event); + void OnFocus(wxFocusEvent& event); + +protected: + wxComboCtrlBase* m_combo; + +private: + DECLARE_EVENT_TABLE() +}; + + +BEGIN_EVENT_TABLE(wxComboBoxExtraInputHandler, wxEvtHandler) + EVT_KEY_DOWN(wxComboBoxExtraInputHandler::OnKey) + EVT_SET_FOCUS(wxComboBoxExtraInputHandler::OnFocus) +END_EVENT_TABLE() + + +void wxComboBoxExtraInputHandler::OnKey(wxKeyEvent& event) +{ + // Let the wxComboCtrl event handler have a go first. + wxComboCtrlBase* combo = m_combo; + wxObject* prevObj = event.GetEventObject(); + + event.SetId(combo->GetId()); + event.SetEventObject(combo); + combo->GetEventHandler()->ProcessEvent(event); + + event.SetId(((wxWindow*)prevObj)->GetId()); + event.SetEventObject(prevObj); +} + +void wxComboBoxExtraInputHandler::OnFocus(wxFocusEvent& event) +{ + // FIXME: This code does run when control is clicked, + // yet on Windows it doesn't select all the text. + if ( !(m_combo->GetInternalFlags() & wxCC_NO_TEXT_AUTO_SELECT) ) + { + if ( m_combo->GetTextCtrl() ) + m_combo->GetTextCtrl()->SelectAll(); + else + m_combo->SetSelection(-1,-1); + } + + // Send focus indication to parent. + // NB: This is needed for cases where the textctrl gets focus + // instead of its parent. While this may trigger multiple + // wxEVT_SET_FOCUSes (since m_text->SetFocus is called + // from combo's focus event handler), they should be quite + // harmless. + wxFocusEvent evt2(wxEVT_SET_FOCUS,m_combo->GetId()); + evt2.SetEventObject(m_combo); + m_combo->GetEventHandler()->ProcessEvent(evt2); + + event.Skip(); +} + + +// +// This is pushed to the event handler queue of the control in popup. +// + +class wxComboPopupExtraEventHandler : public wxEvtHandler +{ +public: + + wxComboPopupExtraEventHandler( wxComboCtrlBase* combo ) + : wxEvtHandler() + { + m_combo = combo; + m_beenInside = false; + } + virtual ~wxComboPopupExtraEventHandler() { } + + void OnMouseEvent( wxMouseEvent& event ); + + // Called from wxComboCtrlBase::OnPopupDismiss + void OnPopupDismiss() + { + m_beenInside = false; + } + +protected: + wxComboCtrlBase* m_combo; + + bool m_beenInside; + +private: + DECLARE_EVENT_TABLE() +}; + + +BEGIN_EVENT_TABLE(wxComboPopupExtraEventHandler, wxEvtHandler) + EVT_MOUSE_EVENTS(wxComboPopupExtraEventHandler::OnMouseEvent) +END_EVENT_TABLE() + + +void wxComboPopupExtraEventHandler::OnMouseEvent( wxMouseEvent& event ) +{ + wxPoint pt = event.GetPosition(); + wxSize sz = m_combo->GetPopupControl()->GetControl()->GetClientSize(); + int evtType = event.GetEventType(); + bool isInside = pt.x >= 0 && pt.y >= 0 && pt.x < sz.x && pt.y < sz.y; + + if ( evtType == wxEVT_MOTION || + evtType == wxEVT_LEFT_DOWN || + evtType == wxEVT_RIGHT_DOWN ) + { + // Block motion and click events outside the popup + if ( !isInside || !m_combo->IsPopupShown() ) + { + event.Skip(false); + return; + } + } + else if ( evtType == wxEVT_LEFT_UP ) + { + if ( !m_combo->IsPopupShown() ) + { + event.Skip(false); + return; + } + + if ( !m_beenInside ) + { + if ( isInside ) + { + m_beenInside = true; + } + else + { + // + // Some mouse events to popup that happen outside it, before cursor + // has been inside the popu, need to be ignored by it but relayed to + // the dropbutton. + // + wxWindow* btn = m_combo->GetButton(); + if ( btn ) + btn->GetEventHandler()->AddPendingEvent(event); + else + m_combo->GetEventHandler()->AddPendingEvent(event); + + return; + } + + event.Skip(); + } + } + + event.Skip(); +} + +// ---------------------------------------------------------------------------- +// wxComboCtrlBase +// ---------------------------------------------------------------------------- + + +BEGIN_EVENT_TABLE(wxComboCtrlBase, wxControl) + EVT_TEXT(wxID_ANY,wxComboCtrlBase::OnTextCtrlEvent) + EVT_SIZE(wxComboCtrlBase::OnSizeEvent) + EVT_SET_FOCUS(wxComboCtrlBase::OnFocusEvent) + EVT_KILL_FOCUS(wxComboCtrlBase::OnFocusEvent) + EVT_IDLE(wxComboCtrlBase::OnIdleEvent) + //EVT_BUTTON(wxID_ANY,wxComboCtrlBase::OnButtonClickEvent) + EVT_KEY_DOWN(wxComboCtrlBase::OnKeyEvent) + EVT_TEXT_ENTER(wxID_ANY,wxComboCtrlBase::OnTextCtrlEvent) + EVT_SYS_COLOUR_CHANGED(wxComboCtrlBase::OnSysColourChanged) +END_EVENT_TABLE() + + +IMPLEMENT_ABSTRACT_CLASS(wxComboCtrlBase, wxControl) + +void wxComboCtrlBase::Init() +{ + m_winPopup = (wxWindow *)NULL; + m_popup = (wxWindow *)NULL; + m_popupWinState = Hidden; + m_btn = (wxWindow*) NULL; + m_text = (wxTextCtrl*) NULL; + m_popupInterface = (wxComboPopup*) NULL; + + m_popupExtraHandler = (wxEvtHandler*) NULL; + m_textEvtHandler = (wxEvtHandler*) NULL; + +#if INSTALL_TOPLEV_HANDLER + m_toplevEvtHandler = (wxEvtHandler*) NULL; +#endif + + m_mainCtrlWnd = this; + + m_heightPopup = -1; + m_widthMinPopup = -1; + m_anchorSide = 0; + m_widthCustomPaint = 0; + m_widthCustomBorder = 0; + + m_btnState = 0; + m_btnWidDefault = 0; + m_blankButtonBg = false; + m_ignoreEvtText = 0; + m_popupWinType = POPUPWIN_NONE; + m_btnWid = m_btnHei = -1; + m_btnSide = wxRIGHT; + m_btnSpacingX = 0; + + m_extLeft = 0; + m_extRight = 0; + m_absIndent = -1; + m_iFlags = 0; + m_timeCanAcceptClick = 0; + + m_resetFocus = false; +} + +bool wxComboCtrlBase::Create(wxWindow *parent, + wxWindowID id, + const wxString& value, + const wxPoint& pos, + const wxSize& size, + long style, + const wxValidator& validator, + const wxString& name) +{ + if ( !wxControl::Create(parent, + id, + pos, + size, + style | wxWANTS_CHARS, + validator, + name) ) + return false; + + m_valueString = value; + + // Get colours + OnThemeChange(); + m_absIndent = GetNativeTextIndent(); + + m_iFlags |= wxCC_IFLAG_CREATED; + + // If x and y indicate valid size, wxSizeEvent won't be + // emitted automatically, so we need to add artifical one. + if ( size.x > 0 && size.y > 0 ) + { + wxSizeEvent evt(size,GetId()); + GetEventHandler()->AddPendingEvent(evt); + } + + return true; +} + +void wxComboCtrlBase::InstallInputHandlers() +{ + if ( m_text ) + { + m_textEvtHandler = new wxComboBoxExtraInputHandler(this); + m_text->PushEventHandler(m_textEvtHandler); + } +} + +void +wxComboCtrlBase::CreateTextCtrl(int style, const wxValidator& validator) +{ + if ( !(m_windowStyle & wxCB_READONLY) ) + { + if ( m_text ) + m_text->Destroy(); + + // wxTE_PROCESS_TAB is needed because on Windows, wxTAB_TRAVERSAL is + // not used by the wxPropertyGrid and therefore the tab is processed by + // looking at ancestors to see if they have wxTAB_TRAVERSAL. The + // navigation event is then sent to the wrong window. + style |= wxTE_PROCESS_TAB; + + if ( HasFlag(wxTE_PROCESS_ENTER) ) + style |= wxTE_PROCESS_ENTER; + + // Ignore EVT_TEXT generated by the constructor (but only + // if the event redirector already exists) + // NB: This must be " = 1" instead of "++"; + if ( m_textEvtHandler ) + m_ignoreEvtText = 1; + else + m_ignoreEvtText = 0; + + m_text = new wxTextCtrl(this, wxID_ANY, m_valueString, + wxDefaultPosition, wxSize(10,-1), + style, validator); + } +} + +void wxComboCtrlBase::OnThemeChange() +{ + // Leave the default bg on the Mac so the area used by the focus ring will + // be the correct colour and themed brush. Instead we'll use + // wxSYS_COLOUR_WINDOW in the EVT_PAINT handler as needed. +#ifndef __WXMAC__ + SetOwnBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW)); +#endif +} + +wxComboCtrlBase::~wxComboCtrlBase() +{ + if ( HasCapture() ) + ReleaseMouse(); + +#if INSTALL_TOPLEV_HANDLER + delete ((wxComboFrameEventHandler*)m_toplevEvtHandler); + m_toplevEvtHandler = (wxEvtHandler*) NULL; +#endif + + DestroyPopup(); + + if ( m_text ) + m_text->RemoveEventHandler(m_textEvtHandler); + + delete m_textEvtHandler; +} + + +// ---------------------------------------------------------------------------- +// geometry stuff +// ---------------------------------------------------------------------------- + +// Recalculates button and textctrl areas +void wxComboCtrlBase::CalculateAreas( int btnWidth ) +{ + wxSize sz = GetClientSize(); + int customBorder = m_widthCustomBorder; + int btnBorder; // border for button only + + // check if button should really be outside the border: we'll do it it if + // its platform default or bitmap+pushbutton background is used, but not if + // there is vertical size adjustment or horizontal spacing. + if ( ( (m_iFlags & wxCC_BUTTON_OUTSIDE_BORDER) || + (m_bmpNormal.Ok() && m_blankButtonBg) ) && + m_btnSpacingX == 0 && + m_btnHei <= 0 ) + { + m_iFlags |= wxCC_IFLAG_BUTTON_OUTSIDE; + btnBorder = 0; + } + else + { + m_iFlags &= ~(wxCC_IFLAG_BUTTON_OUTSIDE); + btnBorder = customBorder; + } + + // Defaul indentation + if ( m_absIndent < 0 ) + m_absIndent = GetNativeTextIndent(); + + int butWidth = btnWidth; + + if ( butWidth <= 0 ) + butWidth = m_btnWidDefault; + else + m_btnWidDefault = butWidth; + + if ( butWidth <= 0 ) + return; + + int butHeight = sz.y - btnBorder*2; + + // Adjust button width + if ( m_btnWid > 0 ) + butWidth = m_btnWid; + else + { + // Adjust button width to match aspect ratio + // (but only if control is smaller than best size). + int bestHeight = GetBestSize().y; + int height = GetSize().y; + + if ( height < bestHeight ) + { + // Make very small buttons square, as it makes + // them accommodate arrow image better and still + // looks decent. + if ( height > 18 ) + butWidth = (height*butWidth)/bestHeight; + else + butWidth = butHeight; + } + } + + // Adjust button height + if ( m_btnHei > 0 ) + butHeight = m_btnHei; + + // Use size of normal bitmap if... + // It is larger + // OR + // button width is set to default and blank button bg is not drawn + if ( m_bmpNormal.Ok() ) + { + int bmpReqWidth = m_bmpNormal.GetWidth(); + int bmpReqHeight = m_bmpNormal.GetHeight(); + + // If drawing blank button background, we need to add some margin. + if ( m_blankButtonBg ) + { + bmpReqWidth += BMP_BUTTON_MARGIN*2; + bmpReqHeight += BMP_BUTTON_MARGIN*2; + } + + if ( butWidth < bmpReqWidth || ( m_btnWid == 0 && !m_blankButtonBg ) ) + butWidth = bmpReqWidth; + if ( butHeight < bmpReqHeight || ( m_btnHei == 0 && !m_blankButtonBg ) ) + butHeight = bmpReqHeight; + + // Need to fix height? + if ( (sz.y-(customBorder*2)) < butHeight && btnWidth == 0 ) + { + int newY = butHeight+(customBorder*2); + SetClientSize(wxDefaultCoord,newY); + sz.y = newY; + } + } + + int butAreaWid = butWidth + (m_btnSpacingX*2); + + m_btnSize.x = butWidth; + m_btnSize.y = butHeight; + + m_btnArea.x = ( m_btnSide==wxRIGHT ? sz.x - butAreaWid - btnBorder : btnBorder ); + m_btnArea.y = btnBorder + FOCUS_RING; + m_btnArea.width = butAreaWid; + m_btnArea.height = sz.y - ((btnBorder+FOCUS_RING)*2); + + m_tcArea.x = ( m_btnSide==wxRIGHT ? 0 : butAreaWid ) + customBorder + FOCUS_RING; + m_tcArea.y = customBorder + FOCUS_RING; + m_tcArea.width = sz.x - butAreaWid - (customBorder*2) - (FOCUS_RING*2); + m_tcArea.height = sz.y - ((customBorder+FOCUS_RING)*2); + +/* + if ( m_text ) + { + ::wxMessageBox(wxString::Format(wxT("ButtonArea (%i,%i,%i,%i)\n"),m_btnArea.x,m_btnArea.y,m_btnArea.width,m_btnArea.height) + + wxString::Format(wxT("TextCtrlArea (%i,%i,%i,%i)"),m_tcArea.x,m_tcArea.y,m_tcArea.width,m_tcArea.height)); + } +*/ +} + +void wxComboCtrlBase::PositionTextCtrl( int textCtrlXAdjust, int textCtrlYAdjust ) +{ + if ( !m_text ) + return; + +#if !TEXTCTRL_TEXT_CENTERED + + wxSize sz = GetClientSize(); + + int customBorder = m_widthCustomBorder; + if ( (m_text->GetWindowStyleFlag() & wxBORDER_MASK) == wxNO_BORDER ) + { + // Centre textctrl + int tcSizeY = m_text->GetBestSize().y; + int diff = sz.y - tcSizeY; + int y = textCtrlYAdjust + (diff/2); + + if ( y < customBorder ) + y = customBorder; + + m_text->SetSize( m_tcArea.x + m_widthCustomPaint + m_absIndent + textCtrlXAdjust, + y, + m_tcArea.width - COMBO_MARGIN - + (textCtrlXAdjust + m_widthCustomPaint + m_absIndent), + -1 ); + + // Make sure textctrl doesn't exceed the bottom custom border + wxSize tsz = m_text->GetSize(); + diff = (y + tsz.y) - (sz.y - customBorder); + if ( diff >= 0 ) + { + tsz.y = tsz.y - diff - 1; + m_text->SetSize(tsz); + } + } + else +#else // TEXTCTRL_TEXT_CENTERED + wxUnusedVar(textCtrlXAdjust); + wxUnusedVar(textCtrlYAdjust); +#endif // !TEXTCTRL_TEXT_CENTERED/TEXTCTRL_TEXT_CENTERED + { + // If it has border, have textctrl will the entire text field. + m_text->SetSize( m_tcArea.x + m_widthCustomPaint, + m_tcArea.y, + m_tcArea.width - m_widthCustomPaint, + m_tcArea.height ); + } +} + +wxSize wxComboCtrlBase::DoGetBestSize() const +{ + wxSize sizeText(150,0); + + if ( m_text ) + sizeText = m_text->GetBestSize(); + + // TODO: Better method to calculate close-to-native control height. + + int fhei; + if ( m_font.Ok() ) + fhei = (m_font.GetPointSize()*2) + 5; + else if ( wxNORMAL_FONT->Ok() ) + fhei = (wxNORMAL_FONT->GetPointSize()*2) + 5; + else + fhei = sizeText.y + 4; + + // Need to force height to accomodate bitmap? + int btnSizeY = m_btnSize.y; + if ( m_bmpNormal.Ok() && fhei < btnSizeY ) + fhei = btnSizeY; + + // Control height doesn't depend on border +/* + // Add border + int border = m_windowStyle & wxBORDER_MASK; + if ( border == wxSIMPLE_BORDER ) + fhei += 2; + else if ( border == wxNO_BORDER ) + fhei += (m_widthCustomBorder*2); + else + // Sunken etc. + fhei += 4; +*/ + + // Final adjustments +#ifdef __WXGTK__ + fhei += 1; +#endif + +#ifdef __WXMAC__ + // these are the numbers from the HIG: + switch ( m_windowVariant ) + { + case wxWINDOW_VARIANT_NORMAL: + default : + fhei = 22; + break; + case wxWINDOW_VARIANT_SMALL: + fhei = 19; + break; + case wxWINDOW_VARIANT_MINI: + fhei = 15; + break; + } +#endif + + fhei += 2 * FOCUS_RING; + int width = sizeText.x + FOCUS_RING + COMBO_MARGIN + DEFAULT_DROPBUTTON_WIDTH; + + wxSize ret(width, fhei); + CacheBestSize(ret); + return ret; +} + +void wxComboCtrlBase::OnSizeEvent( wxSizeEvent& event ) +{ + if ( !IsCreated() ) + return; + + // defined by actual wxComboCtrls + OnResize(); + + event.Skip(); +} + +// ---------------------------------------------------------------------------- +// standard operations +// ---------------------------------------------------------------------------- + +bool wxComboCtrlBase::Enable(bool enable) +{ + if ( !wxControl::Enable(enable) ) + return false; + + if ( m_btn ) + m_btn->Enable(enable); + if ( m_text ) + m_text->Enable(enable); + + return true; +} + +bool wxComboCtrlBase::Show(bool show) +{ + if ( !wxControl::Show(show) ) + return false; + + if (m_btn) + m_btn->Show(show); + + if (m_text) + m_text->Show(show); + + return true; +} + +bool wxComboCtrlBase::SetFont ( const wxFont& font ) +{ + if ( !wxControl::SetFont(font) ) + return false; + + if (m_text) + m_text->SetFont(font); + + return true; +} + +#if wxUSE_TOOLTIPS +void wxComboCtrlBase::DoSetToolTip(wxToolTip *tooltip) +{ + wxControl::DoSetToolTip(tooltip); + + // Set tool tip for button and text box + if ( tooltip ) + { + const wxString &tip = tooltip->GetTip(); + if ( m_text ) m_text->SetToolTip(tip); + if ( m_btn ) m_btn->SetToolTip(tip); + } + else + { + if ( m_text ) m_text->SetToolTip( (wxToolTip*) NULL ); + if ( m_btn ) m_btn->SetToolTip( (wxToolTip*) NULL ); + } +} +#endif // wxUSE_TOOLTIPS + +#if wxUSE_VALIDATORS +void wxComboCtrlBase::SetValidator(const wxValidator& validator) +{ + wxTextCtrl* textCtrl = GetTextCtrl(); + + if ( textCtrl ) + textCtrl->SetValidator( validator ); +} + +wxValidator* wxComboCtrlBase::GetValidator() +{ + wxTextCtrl* textCtrl = GetTextCtrl(); + + if ( textCtrl ) + return textCtrl->GetValidator(); + + return wxControl::GetValidator(); +} +#endif // wxUSE_VALIDATORS + +// ---------------------------------------------------------------------------- +// painting +// ---------------------------------------------------------------------------- + +#if (!defined(__WXMSW__)) || defined(__WXUNIVERSAL__) +// prepare combo box background on area in a way typical on platform +void wxComboCtrlBase::PrepareBackground( wxDC& dc, const wxRect& rect, int flags ) const +{ + wxSize sz = GetClientSize(); + bool isEnabled; + bool isFocused; // also selected + + // For smaller size control (and for disabled background) use less spacing + int focusSpacingX; + int focusSpacingY; + + if ( !(flags & wxCONTROL_ISSUBMENU) ) + { + // Drawing control + isEnabled = IsEnabled(); + isFocused = ShouldDrawFocus(); + + // Windows-style: for smaller size control (and for disabled background) use less spacing + focusSpacingX = isEnabled ? 2 : 1; + focusSpacingY = sz.y > (GetCharHeight()+2) && isEnabled ? 2 : 1; + } + else + { + // Drawing a list item + isEnabled = true; // they are never disabled + isFocused = flags & wxCONTROL_SELECTED ? true : false; + + focusSpacingX = 0; + focusSpacingY = 0; + } + + // Set the background sub-rectangle for selection, disabled etc + wxRect selRect(rect); + selRect.y += focusSpacingY; + selRect.height -= (focusSpacingY*2); + + int wcp = 0; + + if ( !(flags & wxCONTROL_ISSUBMENU) ) + wcp += m_widthCustomPaint; + + selRect.x += wcp + focusSpacingX; + selRect.width -= wcp + (focusSpacingX*2); + + wxColour bgCol; + + if ( isEnabled ) + { + // If popup is hidden and this control is focused, + // then draw the focus-indicator (selbgcolor background etc.). + if ( isFocused ) + { + dc.SetTextForeground( wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT) ); + bgCol = wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHT); + } + else + { + dc.SetTextForeground( wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT) ); +#ifndef __WXMAC__ // see note in OnThemeChange + bgCol = GetBackgroundColour(); +#else + bgCol = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW); +#endif + } + } + else + { + dc.SetTextForeground( wxSystemSettings::GetColour(wxSYS_COLOUR_GRAYTEXT) ); +#ifndef __WXMAC__ // see note in OnThemeChange + bgCol = GetBackgroundColour(); +#else + bgCol = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW); +#endif + } + + dc.SetBrush( bgCol ); + dc.SetPen( bgCol ); + dc.DrawRectangle( selRect ); + + // Don't clip exactly to the selection rectangle so we can draw + // to the non-selected area in front of it. + wxRect clipRect(rect.x,rect.y, + (selRect.x+selRect.width)-rect.x,rect.height); + dc.SetClippingRegion(clipRect); +} +#else +// Save the library size a bit for platforms that re-implement this. +void wxComboCtrlBase::PrepareBackground( wxDC&, const wxRect&, int ) const +{ +} +#endif + +void wxComboCtrlBase::DrawButton( wxDC& dc, const wxRect& rect, int paintBg ) +{ + int drawState = m_btnState; + +#ifdef __WXGTK__ + if ( GetPopupWindowState() >= Animating ) + drawState |= wxCONTROL_PRESSED; +#endif + + wxRect drawRect(rect.x+m_btnSpacingX, + rect.y+((rect.height-m_btnSize.y)/2), + m_btnSize.x, + m_btnSize.y); + + // Make sure area is not larger than the control + if ( drawRect.y < rect.y ) + drawRect.y = rect.y; + if ( drawRect.height > rect.height ) + drawRect.height = rect.height; + + bool enabled = IsEnabled(); + + if ( !enabled ) + drawState |= wxCONTROL_DISABLED; + + if ( !m_bmpNormal.Ok() ) + { + // Need to clear button background even if m_btn is present + if ( paintBg ) + { + wxColour bgCol; + + if ( m_iFlags & wxCC_IFLAG_BUTTON_OUTSIDE ) + bgCol = GetParent()->GetBackgroundColour(); + else + bgCol = GetBackgroundColour(); + + dc.SetBrush(bgCol); + dc.SetPen(bgCol); + dc.DrawRectangle(rect); + } + + // Draw standard button + wxRendererNative::Get().DrawComboBoxDropButton(this, + dc, + drawRect, + drawState); + } + else + { + // Draw bitmap + + wxBitmap* pBmp; + + if ( !enabled ) + pBmp = &m_bmpDisabled; + else if ( m_btnState & wxCONTROL_PRESSED ) + pBmp = &m_bmpPressed; + else if ( m_btnState & wxCONTROL_CURRENT ) + pBmp = &m_bmpHover; + else + pBmp = &m_bmpNormal; + + if ( m_blankButtonBg ) + { + // If using blank button background, we need to clear its background + // with button face colour instead of colour for rest of the control. + if ( paintBg ) + { + wxColour bgCol = GetParent()->GetBackgroundColour(); //wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE); + //wxColour bgCol = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW); + dc.SetPen(bgCol); + dc.SetBrush(bgCol); + dc.DrawRectangle(rect); + } + + wxRendererNative::Get().DrawPushButton(this, + dc, + drawRect, + drawState); + + } + else + + { + // Need to clear button background even if m_btn is present + // (assume non-button background was cleared just before this call so brushes are good) + if ( paintBg ) + dc.DrawRectangle(rect); + } + + // Draw bitmap centered in drawRect + dc.DrawBitmap(*pBmp, + drawRect.x + (drawRect.width-pBmp->GetWidth())/2, + drawRect.y + (drawRect.height-pBmp->GetHeight())/2, + true); + } +} + +void wxComboCtrlBase::RecalcAndRefresh() +{ + if ( IsCreated() ) + { + wxSizeEvent evt(GetSize(),GetId()); + GetEventHandler()->ProcessEvent(evt); + Refresh(); + } +} + +// ---------------------------------------------------------------------------- +// miscellaneous event handlers +// ---------------------------------------------------------------------------- + +void wxComboCtrlBase::OnTextCtrlEvent(wxCommandEvent& event) +{ + if ( event.GetEventType() == wxEVT_COMMAND_TEXT_UPDATED ) + { + if ( m_ignoreEvtText > 0 ) + { + m_ignoreEvtText--; + return; + } + } + + // Change event id, object and string before relaying it forward + event.SetId(GetId()); + wxString s = event.GetString(); + event.SetEventObject(this); + event.SetString(s); + event.Skip(); +} + +// call if cursor is on button area or mouse is captured for the button +bool wxComboCtrlBase::HandleButtonMouseEvent( wxMouseEvent& event, + int flags ) +{ + int type = event.GetEventType(); + + if ( type == wxEVT_MOTION ) + { + if ( flags & wxCC_MF_ON_BUTTON ) + { + if ( !(m_btnState & wxCONTROL_CURRENT) ) + { + // Mouse hover begins + m_btnState |= wxCONTROL_CURRENT; + if ( HasCapture() ) // Retain pressed state. + m_btnState |= wxCONTROL_PRESSED; + Refresh(); + } + } + else if ( (m_btnState & wxCONTROL_CURRENT) ) + { + // Mouse hover ends + m_btnState &= ~(wxCONTROL_CURRENT|wxCONTROL_PRESSED); + Refresh(); + } + } + else if ( type == wxEVT_LEFT_DOWN || type == wxEVT_LEFT_DCLICK ) + { + if ( flags & (wxCC_MF_ON_CLICK_AREA|wxCC_MF_ON_BUTTON) ) + { + m_btnState |= wxCONTROL_PRESSED; + Refresh(); + + if ( !(m_iFlags & wxCC_POPUP_ON_MOUSE_UP) ) + OnButtonClick(); + else + // If showing popup now, do not capture mouse or there will be interference + CaptureMouse(); + } + } + else if ( type == wxEVT_LEFT_UP ) + { + + // Only accept event if mouse was left-press was previously accepted + if ( HasCapture() ) + ReleaseMouse(); + + if ( m_btnState & wxCONTROL_PRESSED ) + { + // If mouse was inside, fire the click event. + if ( m_iFlags & wxCC_POPUP_ON_MOUSE_UP ) + { + if ( flags & (wxCC_MF_ON_CLICK_AREA|wxCC_MF_ON_BUTTON) ) + OnButtonClick(); + } + + m_btnState &= ~(wxCONTROL_PRESSED); + Refresh(); + } + } + else if ( type == wxEVT_LEAVE_WINDOW ) + { + if ( m_btnState & (wxCONTROL_CURRENT|wxCONTROL_PRESSED) ) + { + m_btnState &= ~(wxCONTROL_CURRENT); + + // Mouse hover ends + if ( IsPopupWindowState(Hidden) ) + { + m_btnState &= ~(wxCONTROL_PRESSED); + Refresh(); + } + } + } + else + return false; + + return true; +} + +// returns true if event was consumed or filtered +bool wxComboCtrlBase::PreprocessMouseEvent( wxMouseEvent& event, + int WXUNUSED(flags) ) +{ + wxLongLong t = ::wxGetLocalTimeMillis(); + int evtType = event.GetEventType(); + +#if USES_WXPOPUPWINDOW || USES_WXDIALOG + if ( m_popupWinType != POPUPWIN_WXPOPUPTRANSIENTWINDOW ) + { + if ( IsPopupWindowState(Visible) && + ( evtType == wxEVT_LEFT_DOWN || evtType == wxEVT_RIGHT_DOWN ) ) + { + HidePopup(); + return true; + } + } +#endif + + // Filter out clicks on button immediately after popup dismiss (Windows like behaviour) + if ( evtType == wxEVT_LEFT_DOWN && t < m_timeCanAcceptClick ) + { + event.SetEventType(0); + return true; + } + + return false; +} + +void wxComboCtrlBase::HandleNormalMouseEvent( wxMouseEvent& event ) +{ + int evtType = event.GetEventType(); + + if ( (evtType == wxEVT_LEFT_DOWN || evtType == wxEVT_LEFT_DCLICK) && + (m_windowStyle & wxCB_READONLY) ) + { + if ( GetPopupWindowState() >= Animating ) + { + #if USES_WXPOPUPWINDOW + // Click here always hides the popup. + if ( m_popupWinType == POPUPWIN_WXPOPUPWINDOW ) + HidePopup(); + #endif + } + else + { + if ( !(m_windowStyle & wxCC_SPECIAL_DCLICK) ) + { + // In read-only mode, clicking the text is the + // same as clicking the button. + OnButtonClick(); + } + else if ( /*evtType == wxEVT_LEFT_UP || */evtType == wxEVT_LEFT_DCLICK ) + { + //if ( m_popupInterface->CycleValue() ) + // Refresh(); + if ( m_popupInterface ) + m_popupInterface->OnComboDoubleClick(); + } + } + } + else + if ( IsPopupShown() ) + { + // relay (some) mouse events to the popup + if ( evtType == wxEVT_MOUSEWHEEL ) + m_popup->AddPendingEvent(event); + } + else if ( evtType ) + event.Skip(); +} + +void wxComboCtrlBase::OnKeyEvent(wxKeyEvent& event) +{ + if ( IsPopupShown() ) + { + // pass it to the popped up control + GetPopupControl()->GetControl()->AddPendingEvent(event); + } + else // no popup + { + int keycode = event.GetKeyCode(); + + if ( keycode == WXK_TAB ) + { + wxNavigationKeyEvent evt; + + wxWindow* mainCtrl = GetMainWindowOfCompositeControl(); + + evt.SetFlags(wxNavigationKeyEvent::FromTab| + (!event.ShiftDown() ? wxNavigationKeyEvent::IsForward + : wxNavigationKeyEvent::IsBackward)); + evt.SetEventObject(mainCtrl); + evt.SetCurrentFocus(mainCtrl); + mainCtrl->GetParent()->GetEventHandler()->AddPendingEvent(evt); + return; + } + + if ( IsKeyPopupToggle(event) ) + { + OnButtonClick(); + return; + } + + int comboStyle = GetWindowStyle(); + wxComboPopup* popupInterface = GetPopupControl(); + + if ( !popupInterface ) + { + event.Skip(); + return; + } + + if ( (comboStyle & wxCB_READONLY) || + (keycode != WXK_RIGHT && keycode != WXK_LEFT) ) + { + popupInterface->OnComboKeyEvent(event); + } + else + event.Skip(); + } +} + +void wxComboCtrlBase::OnFocusEvent( wxFocusEvent& event ) +{ + if ( event.GetEventType() == wxEVT_SET_FOCUS ) + { + wxWindow* tc = GetTextCtrl(); + if ( tc && tc != DoFindFocus() ) +#ifdef __WXMAC__ + m_resetFocus = true; +#else + tc->SetFocus(); +#endif + } + + Refresh(); +} + +void wxComboCtrlBase::OnIdleEvent( wxIdleEvent& WXUNUSED(event) ) +{ + if ( m_resetFocus ) + { + m_resetFocus = false; + wxWindow* tc = GetTextCtrl(); + if ( tc ) + tc->SetFocus(); + } +} + +void wxComboCtrlBase::OnSysColourChanged(wxSysColourChangedEvent& WXUNUSED(event)) +{ + OnThemeChange(); + // indentation may also have changed + if ( !(m_iFlags & wxCC_IFLAG_INDENT_SET) ) + m_absIndent = GetNativeTextIndent(); + RecalcAndRefresh(); +} + +// ---------------------------------------------------------------------------- +// popup handling +// ---------------------------------------------------------------------------- + +// Create popup window and the child control +void wxComboCtrlBase::CreatePopup() +{ + wxComboPopup* popupInterface = m_popupInterface; + wxWindow* popup; + + if ( !m_winPopup ) + { +#ifdef wxComboPopupWindowBase2 + if ( m_iFlags & wxCC_IFLAG_USE_ALT_POPUP ) + { + #if !USES_WXDIALOG + m_winPopup = new wxComboPopupWindowBase2( this, wxNO_BORDER ); + #else + m_winPopup = new wxComboPopupWindowBase2( this, wxID_ANY, wxEmptyString, + wxPoint(-21,-21), wxSize(20, 20), + wxNO_BORDER ); + #endif + m_popupWinType = SECONDARY_POPUP_TYPE; + } + else +#endif + { + m_winPopup = new wxComboPopupWindow( this, wxNO_BORDER ); + m_popupWinType = PRIMARY_POPUP_TYPE; + } + m_popupWinEvtHandler = new wxComboPopupWindowEvtHandler(this); + m_winPopup->PushEventHandler(m_popupWinEvtHandler); + } + + popupInterface->Create(m_winPopup); + m_popup = popup = popupInterface->GetControl(); + + m_popupExtraHandler = new wxComboPopupExtraEventHandler(this); + popup->PushEventHandler( m_popupExtraHandler ); + + // This may be helpful on some platforms + // (eg. it bypasses a wxGTK popupwindow bug where + // window is not initially hidden when it should be) + m_winPopup->Hide(); + + popupInterface->m_iFlags |= wxCP_IFLAG_CREATED; +} + +// Destroy popup window and the child control +void wxComboCtrlBase::DestroyPopup() +{ + HidePopup(); + + if ( m_popup ) + m_popup->RemoveEventHandler(m_popupExtraHandler); + + delete m_popupExtraHandler; + + delete m_popupInterface; + + if ( m_winPopup ) + { + m_winPopup->RemoveEventHandler(m_popupWinEvtHandler); + delete m_popupWinEvtHandler; + m_popupWinEvtHandler = NULL; + m_winPopup->Destroy(); + } + + m_popupExtraHandler = (wxEvtHandler*) NULL; + m_popupInterface = (wxComboPopup*) NULL; + m_winPopup = (wxWindow*) NULL; + m_popup = (wxWindow*) NULL; +} + +void wxComboCtrlBase::DoSetPopupControl(wxComboPopup* iface) +{ + wxCHECK_RET( iface, wxT("no popup interface set for wxComboCtrl") ); + + DestroyPopup(); + + iface->InitBase(this); + iface->Init(); + + m_popupInterface = iface; + + if ( !iface->LazyCreate() ) + { + CreatePopup(); + } + else + { + m_popup = (wxWindow*) NULL; + } + + // This must be done after creation + if ( m_valueString.length() ) + { + iface->SetStringValue(m_valueString); + //Refresh(); + } +} + +// Ensures there is atleast the default popup +void wxComboCtrlBase::EnsurePopupControl() +{ + if ( !m_popupInterface ) + SetPopupControl(NULL); +} + +void wxComboCtrlBase::OnButtonClick() +{ + // Derived classes can override this method for totally custom + // popup action + ShowPopup(); +} + +void wxComboCtrlBase::ShowPopup() +{ + EnsurePopupControl(); + wxCHECK_RET( !IsPopupWindowState(Visible), wxT("popup window already shown") ); + + if ( IsPopupWindowState(Animating) ) + return; + + SetFocus(); + + // Space above and below + int screenHeight; + wxPoint scrPos; + int spaceAbove; + int spaceBelow; + int maxHeightPopup; + wxSize ctrlSz = GetSize(); + + screenHeight = wxSystemSettings::GetMetric( wxSYS_SCREEN_Y ); + scrPos = GetParent()->ClientToScreen(GetPosition()); + + spaceAbove = scrPos.y; + spaceBelow = screenHeight - spaceAbove - ctrlSz.y; + + maxHeightPopup = spaceBelow; + if ( spaceAbove > spaceBelow ) + maxHeightPopup = spaceAbove; + + // Width + int widthPopup = ctrlSz.x + m_extLeft + m_extRight; + + if ( widthPopup < m_widthMinPopup ) + widthPopup = m_widthMinPopup; + + wxWindow* winPopup = m_winPopup; + wxWindow* popup; + + // Need to disable tab traversal of parent + // + // NB: This is to fix a bug in wxMSW. In theory it could also be fixed + // by, for instance, adding check to window.cpp:wxWindowMSW::MSWProcessMessage + // that if transient popup is open, then tab traversal is to be ignored. + // However, I think this code would still be needed for cases where + // transient popup doesn't work yet (wxWinCE?). + wxWindow* parent = GetParent(); + int parentFlags = parent->GetWindowStyle(); + if ( parentFlags & wxTAB_TRAVERSAL ) + { + parent->SetWindowStyle( parentFlags & ~(wxTAB_TRAVERSAL) ); + m_iFlags |= wxCC_IFLAG_PARENT_TAB_TRAVERSAL; + } + + if ( !winPopup ) + { + CreatePopup(); + winPopup = m_winPopup; + popup = m_popup; + } + else + { + popup = m_popup; + } + + winPopup->Enable(); + + wxASSERT( !m_popup || m_popup == popup ); // Consistency check. + + wxSize adjustedSize = m_popupInterface->GetAdjustedSize(widthPopup, + m_heightPopup<=0?DEFAULT_POPUP_HEIGHT:m_heightPopup, + maxHeightPopup); + + popup->SetSize(adjustedSize); + popup->Move(0,0); + m_popupInterface->OnPopup(); + + // + // Reposition and resize popup window + // + + wxSize szp = popup->GetSize(); + + int popupX; + int popupY = scrPos.y + ctrlSz.y; + + // Default anchor is wxLEFT + int anchorSide = m_anchorSide; + if ( !anchorSide ) + anchorSide = wxLEFT; + + int rightX = scrPos.x + ctrlSz.x + m_extRight - szp.x; + int leftX = scrPos.x - m_extLeft; + + if ( wxTheApp->GetLayoutDirection() == wxLayout_RightToLeft ) + leftX -= ctrlSz.x; + + int screenWidth = wxSystemSettings::GetMetric( wxSYS_SCREEN_X ); + + // If there is not enough horizontal space, anchor on the other side. + // If there is no space even then, place the popup at x 0. + if ( anchorSide == wxRIGHT ) + { + if ( rightX < 0 ) + { + if ( (leftX+szp.x) < screenWidth ) + anchorSide = wxLEFT; + else + anchorSide = 0; + } + } + else + { + if ( (leftX+szp.x) >= screenWidth ) + { + if ( rightX >= 0 ) + anchorSide = wxRIGHT; + else + anchorSide = 0; + } + } + + // Select x coordinate according to the anchor side + if ( anchorSide == wxRIGHT ) + popupX = rightX; + else if ( anchorSide == wxLEFT ) + popupX = leftX; + else + popupX = 0; + + int showFlags = CanDeferShow; + + if ( spaceBelow < szp.y ) + { + popupY = scrPos.y - szp.y; + showFlags |= ShowAbove; + } + +#if INSTALL_TOPLEV_HANDLER + // Put top level window event handler into place + if ( m_popupWinType == POPUPWIN_WXPOPUPWINDOW ) + { + if ( !m_toplevEvtHandler ) + m_toplevEvtHandler = new wxComboFrameEventHandler(this); + + wxWindow* toplev = ::wxGetTopLevelParent( this ); + wxASSERT( toplev ); + ((wxComboFrameEventHandler*)m_toplevEvtHandler)->OnPopup(); + toplev->PushEventHandler( m_toplevEvtHandler ); + } +#endif + + // Set string selection (must be this way instead of SetStringSelection) + if ( m_text ) + { + if ( !(m_iFlags & wxCC_NO_TEXT_AUTO_SELECT) ) + m_text->SelectAll(); + + m_popupInterface->SetStringValue( m_text->GetValue() ); + } + else + { + // This is neede since focus/selection indication may change when popup is shown + Refresh(); + } + + // This must be after SetStringValue + m_popupWinState = Animating; + + wxRect popupWinRect( popupX, popupY, szp.x, szp.y ); + + m_popup = popup; + if ( (m_iFlags & wxCC_IFLAG_DISABLE_POPUP_ANIM) || + AnimateShow( popupWinRect, showFlags ) ) + { + DoShowPopup( popupWinRect, showFlags ); + } +} + +bool wxComboCtrlBase::AnimateShow( const wxRect& WXUNUSED(rect), int WXUNUSED(flags) ) +{ + return true; +} + +void wxComboCtrlBase::DoShowPopup( const wxRect& rect, int WXUNUSED(flags) ) +{ + wxWindow* winPopup = m_winPopup; + + if ( IsPopupWindowState(Animating) ) + { + // Make sure the popup window is shown in the right position. + // Should not matter even if animation already did this. + + // Some platforms (GTK) may like SetSize and Move to be separate + // (though the bug was probably fixed). + winPopup->SetSize( rect ); + + winPopup->Show(); + + m_popupWinState = Visible; + } + else if ( IsPopupWindowState(Hidden) ) + { + // Animation was aborted + + wxASSERT( !winPopup->IsShown() ); + + m_popupWinState = Hidden; + } +} + +void wxComboCtrlBase::OnPopupDismiss() +{ + // Just in case, avoid double dismiss + if ( IsPopupWindowState(Hidden) ) + return; + + // This must be set before focus - otherwise there will be recursive + // OnPopupDismisses. + m_popupWinState = Hidden; + + //SetFocus(); + m_winPopup->Disable(); + + // Inform popup control itself + m_popupInterface->OnDismiss(); + + if ( m_popupExtraHandler ) + ((wxComboPopupExtraEventHandler*)m_popupExtraHandler)->OnPopupDismiss(); + +#if INSTALL_TOPLEV_HANDLER + // Remove top level window event handler + if ( m_toplevEvtHandler ) + { + wxWindow* toplev = ::wxGetTopLevelParent( this ); + if ( toplev ) + toplev->RemoveEventHandler( m_toplevEvtHandler ); + } +#endif + + m_timeCanAcceptClick = ::wxGetLocalTimeMillis(); + + if ( m_popupWinType == POPUPWIN_WXPOPUPTRANSIENTWINDOW ) + m_timeCanAcceptClick += 150; + + // If cursor not on dropdown button, then clear its state + // (technically not required by all ports, but do it for all just in case) + if ( !m_btnArea.Contains(ScreenToClient(::wxGetMousePosition())) ) + m_btnState = 0; + + // Return parent's tab traversal flag. + // See ShowPopup for notes. + if ( m_iFlags & wxCC_IFLAG_PARENT_TAB_TRAVERSAL ) + { + wxWindow* parent = GetParent(); + parent->SetWindowStyle( parent->GetWindowStyle() | wxTAB_TRAVERSAL ); + m_iFlags &= ~(wxCC_IFLAG_PARENT_TAB_TRAVERSAL); + } + + // refresh control (necessary even if m_text) + Refresh(); + + SetFocus(); +} + +void wxComboCtrlBase::HidePopup() +{ + // Should be able to call this without popup interface + if ( IsPopupWindowState(Hidden) ) + return; + + // transfer value and show it in textctrl, if any + if ( !IsPopupWindowState(Animating) ) + SetValue( m_popupInterface->GetStringValue() ); + + m_winPopup->Hide(); + + OnPopupDismiss(); +} + +// ---------------------------------------------------------------------------- +// customization methods +// ---------------------------------------------------------------------------- + +void wxComboCtrlBase::SetButtonPosition( int width, int height, + int side, int spacingX ) +{ + m_btnWid = width; + m_btnHei = height; + m_btnSide = side; + m_btnSpacingX = spacingX; + + RecalcAndRefresh(); +} + +wxSize wxComboCtrlBase::GetButtonSize() +{ + if ( m_btnSize.x > 0 ) + return m_btnSize; + + wxSize retSize(m_btnWid,m_btnHei); + + // Need to call CalculateAreas now if button size is + // is not explicitly specified. + if ( retSize.x <= 0 || retSize.y <= 0) + { + OnResize(); + + retSize = m_btnSize; + } + + return retSize; +} + +void wxComboCtrlBase::SetButtonBitmaps( const wxBitmap& bmpNormal, + bool blankButtonBg, + const wxBitmap& bmpPressed, + const wxBitmap& bmpHover, + const wxBitmap& bmpDisabled ) +{ + m_bmpNormal = bmpNormal; + m_blankButtonBg = blankButtonBg; + + if ( bmpPressed.Ok() ) + m_bmpPressed = bmpPressed; + else + m_bmpPressed = bmpNormal; + + if ( bmpHover.Ok() ) + m_bmpHover = bmpHover; + else + m_bmpHover = bmpNormal; + + if ( bmpDisabled.Ok() ) + m_bmpDisabled = bmpDisabled; + else + m_bmpDisabled = bmpNormal; + + RecalcAndRefresh(); +} + +void wxComboCtrlBase::SetCustomPaintWidth( int width ) +{ + if ( m_text ) + { + // move textctrl accordingly + wxRect r = m_text->GetRect(); + int inc = width - m_widthCustomPaint; + r.x += inc; + r.width -= inc; + m_text->SetSize( r ); + } + + m_widthCustomPaint = width; + + RecalcAndRefresh(); +} + +void wxComboCtrlBase::SetTextIndent( int indent ) +{ + if ( indent < 0 ) + { + m_absIndent = GetNativeTextIndent(); + m_iFlags &= ~(wxCC_IFLAG_INDENT_SET); + } + else + { + m_absIndent = indent; + m_iFlags |= wxCC_IFLAG_INDENT_SET; + } + + RecalcAndRefresh(); +} + +wxCoord wxComboCtrlBase::GetNativeTextIndent() const +{ + return DEFAULT_TEXT_INDENT; +} + +// ---------------------------------------------------------------------------- +// methods forwarded to wxTextCtrl +// ---------------------------------------------------------------------------- + +wxString wxComboCtrlBase::GetValue() const +{ + if ( m_text ) + return m_text->GetValue(); + return m_valueString; +} + +void wxComboCtrlBase::SetValueWithEvent(const wxString& value, bool withEvent) +{ + if ( m_text ) + { + if ( !withEvent ) + m_ignoreEvtText++; + + m_text->SetValue(value); + if ( !(m_iFlags & wxCC_NO_TEXT_AUTO_SELECT) ) + m_text->SelectAll(); + } + + // Since wxComboPopup may want to paint the combo as well, we need + // to set the string value here (as well as sometimes in ShowPopup). + if ( m_valueString != value ) + { + m_valueString = value; + + EnsurePopupControl(); + + if (m_popupInterface) + m_popupInterface->SetStringValue(value); + } + + Refresh(); +} + +void wxComboCtrlBase::SetValue(const wxString& value) +{ + SetValueWithEvent(value, false); +} + +// In this SetValue variant wxComboPopup::SetStringValue is not called +void wxComboCtrlBase::SetText(const wxString& value) +{ + // Unlike in SetValue(), this must be called here or + // the behaviour will no be consistent in readonlys. + EnsurePopupControl(); + + m_valueString = value; + + if ( m_text ) + { + m_ignoreEvtText++; + m_text->SetValue( value ); + } + + Refresh(); +} + +void wxComboCtrlBase::Copy() +{ + if ( m_text ) + m_text->Copy(); +} + +void wxComboCtrlBase::Cut() +{ + if ( m_text ) + m_text->Cut(); +} + +void wxComboCtrlBase::Paste() +{ + if ( m_text ) + m_text->Paste(); +} + +void wxComboCtrlBase::SetInsertionPoint(long pos) +{ + if ( m_text ) + m_text->SetInsertionPoint(pos); +} + +void wxComboCtrlBase::SetInsertionPointEnd() +{ + if ( m_text ) + m_text->SetInsertionPointEnd(); +} + +long wxComboCtrlBase::GetInsertionPoint() const +{ + if ( m_text ) + return m_text->GetInsertionPoint(); + + return 0; +} + +long wxComboCtrlBase::GetLastPosition() const +{ + if ( m_text ) + return m_text->GetLastPosition(); + + return 0; +} + +void wxComboCtrlBase::Replace(long from, long to, const wxString& value) +{ + if ( m_text ) + m_text->Replace(from, to, value); +} + +void wxComboCtrlBase::Remove(long from, long to) +{ + if ( m_text ) + m_text->Remove(from, to); +} + +void wxComboCtrlBase::SetSelection(long from, long to) +{ + if ( m_text ) + m_text->SetSelection(from, to); +} + +void wxComboCtrlBase::Undo() +{ + if ( m_text ) + m_text->Undo(); +} + +#endif // wxUSE_COMBOCTRL diff --git a/Externals/wxWidgets/src/common/config.cpp b/Externals/wxWidgets/src/common/config.cpp new file mode 100644 index 0000000000..1862005148 --- /dev/null +++ b/Externals/wxWidgets/src/common/config.cpp @@ -0,0 +1,490 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/common/config.cpp +// Purpose: implementation of wxConfigBase class +// Author: Vadim Zeitlin +// Modified by: +// Created: 07.04.98 +// RCS-ID: $Id: config.cpp 44868 2007-03-17 14:40:30Z VZ $ +// Copyright: (c) 1997 Karsten Ballüder Ballueder@usa.net +// Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif //__BORLANDC__ + +#ifndef wxUSE_CONFIG_NATIVE + #define wxUSE_CONFIG_NATIVE 1 +#endif + +#include "wx/config.h" + +#ifndef WX_PRECOMP + #include "wx/intl.h" + #include "wx/log.h" + #include "wx/app.h" + #include "wx/utils.h" + #include "wx/arrstr.h" + #include "wx/math.h" +#endif //WX_PRECOMP + +#if wxUSE_CONFIG && ((wxUSE_FILE && wxUSE_TEXTFILE) || wxUSE_CONFIG_NATIVE) + +#include "wx/file.h" + +#include +#include +#include // for INT_MAX + +// ---------------------------------------------------------------------------- +// global and class static variables +// ---------------------------------------------------------------------------- + +wxConfigBase *wxConfigBase::ms_pConfig = NULL; +bool wxConfigBase::ms_bAutoCreate = true; + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxConfigBase +// ---------------------------------------------------------------------------- + +// Not all args will always be used by derived classes, but including them all +// in each class ensures compatibility. +wxConfigBase::wxConfigBase(const wxString& appName, + const wxString& vendorName, + const wxString& WXUNUSED(localFilename), + const wxString& WXUNUSED(globalFilename), + long style) + : m_appName(appName), m_vendorName(vendorName), m_style(style) +{ + m_bExpandEnvVars = true; + m_bRecordDefaults = false; +} + +wxConfigBase::~wxConfigBase() +{ + // required here for Darwin +} + +wxConfigBase *wxConfigBase::Set(wxConfigBase *pConfig) +{ + wxConfigBase *pOld = ms_pConfig; + ms_pConfig = pConfig; + return pOld; +} + +wxConfigBase *wxConfigBase::Create() +{ + if ( ms_bAutoCreate && ms_pConfig == NULL ) { + ms_pConfig = + #if defined(__WXMSW__) && wxUSE_CONFIG_NATIVE + new wxRegConfig(wxTheApp->GetAppName(), wxTheApp->GetVendorName()); + #elif defined(__WXPALMOS__) && wxUSE_CONFIG_NATIVE + new wxPrefConfig(wxTheApp->GetAppName()); + #else // either we're under Unix or wish to use files even under Windows + new wxFileConfig(wxTheApp->GetAppName()); + #endif + } + + return ms_pConfig; +} + +// ---------------------------------------------------------------------------- +// wxConfigBase reading entries +// ---------------------------------------------------------------------------- + +// implement both Read() overloads for the given type in terms of DoRead() +#define IMPLEMENT_READ_FOR_TYPE(name, type, deftype, extra) \ + bool wxConfigBase::Read(const wxString& key, type *val) const \ + { \ + wxCHECK_MSG( val, false, _T("wxConfig::Read(): NULL parameter") ); \ + \ + if ( !DoRead##name(key, val) ) \ + return false; \ + \ + *val = extra(*val); \ + \ + return true; \ + } \ + \ + bool wxConfigBase::Read(const wxString& key, \ + type *val, \ + deftype defVal) const \ + { \ + wxCHECK_MSG( val, false, _T("wxConfig::Read(): NULL parameter") ); \ + \ + bool read = DoRead##name(key, val); \ + if ( !read ) \ + { \ + if ( IsRecordingDefaults() ) \ + { \ + ((wxConfigBase *)this)->DoWrite##name(key, defVal); \ + } \ + \ + *val = defVal; \ + } \ + \ + *val = extra(*val); \ + \ + return read; \ + } + + +IMPLEMENT_READ_FOR_TYPE(String, wxString, const wxString&, ExpandEnvVars) +IMPLEMENT_READ_FOR_TYPE(Long, long, long, long) +IMPLEMENT_READ_FOR_TYPE(Int, int, int, int) +IMPLEMENT_READ_FOR_TYPE(Double, double, double, double) +IMPLEMENT_READ_FOR_TYPE(Bool, bool, bool, bool) + +#undef IMPLEMENT_READ_FOR_TYPE + +// the DoReadXXX() for the other types have implementation in the base class +// but can be overridden in the derived ones +bool wxConfigBase::DoReadInt(const wxString& key, int *pi) const +{ + wxCHECK_MSG( pi, false, _T("wxConfig::Read(): NULL parameter") ); + + long l; + if ( !DoReadLong(key, &l) ) + return false; + + wxASSERT_MSG( l < INT_MAX, _T("overflow in wxConfig::DoReadInt") ); + + *pi = (int)l; + + return true; +} + +bool wxConfigBase::DoReadBool(const wxString& key, bool* val) const +{ + wxCHECK_MSG( val, false, _T("wxConfig::Read(): NULL parameter") ); + + long l; + if ( !DoReadLong(key, &l) ) + return false; + + wxASSERT_MSG( l == 0 || l == 1, _T("bad bool value in wxConfig::DoReadInt") ); + + *val = l != 0; + + return true; +} + +bool wxConfigBase::DoReadDouble(const wxString& key, double* val) const +{ + wxString str; + if ( Read(key, &str) ) + { + return str.ToDouble(val); + } + + return false; +} + +// string reading helper +wxString wxConfigBase::ExpandEnvVars(const wxString& str) const +{ + wxString tmp; // Required for BC++ + if (IsExpandingEnvVars()) + tmp = wxExpandEnvVars(str); + else + tmp = str; + return tmp; +} + +// ---------------------------------------------------------------------------- +// wxConfigBase writing +// ---------------------------------------------------------------------------- + +bool wxConfigBase::DoWriteDouble(const wxString& key, double val) +{ + return DoWriteString(key, wxString::Format(_T("%g"), val)); +} + +bool wxConfigBase::DoWriteInt(const wxString& key, int value) +{ + return DoWriteLong(key, (long)value); +} + +bool wxConfigBase::DoWriteBool(const wxString& key, bool value) +{ + return DoWriteLong(key, value ? 1l : 0l); +} + +// ---------------------------------------------------------------------------- +// wxConfigPathChanger +// ---------------------------------------------------------------------------- + +wxConfigPathChanger::wxConfigPathChanger(const wxConfigBase *pContainer, + const wxString& strEntry) +{ + m_bChanged = false; + m_pContainer = (wxConfigBase *)pContainer; + + // the path is everything which precedes the last slash + wxString strPath = strEntry.BeforeLast(wxCONFIG_PATH_SEPARATOR); + + // except in the special case of "/keyname" when there is nothing before "/" + if ( strPath.empty() && + ((!strEntry.empty()) && strEntry[0] == wxCONFIG_PATH_SEPARATOR) ) + { + strPath = wxCONFIG_PATH_SEPARATOR; + } + + if ( !strPath.empty() ) + { + if ( m_pContainer->GetPath() != strPath ) + { + // we do change the path so restore it later + m_bChanged = true; + + /* JACS: work around a memory bug that causes an assert + when using wxRegConfig, related to reference-counting. + Can be reproduced by removing (const wxChar*) below and + adding the following code to the config sample OnInit under + Windows: + + pConfig->SetPath(wxT("MySettings")); + pConfig->SetPath(wxT("..")); + int value; + pConfig->Read(_T("MainWindowX"), & value); + */ + m_strOldPath = (const wxChar*) m_pContainer->GetPath(); + if ( *m_strOldPath.c_str() != wxCONFIG_PATH_SEPARATOR ) + m_strOldPath += wxCONFIG_PATH_SEPARATOR; + m_pContainer->SetPath(strPath); + } + + // in any case, use the just the name, not full path + m_strName = strEntry.AfterLast(wxCONFIG_PATH_SEPARATOR); + } + else { + // it's a name only, without path - nothing to do + m_strName = strEntry; + } +} + +void wxConfigPathChanger::UpdateIfDeleted() +{ + // we don't have to do anything at all if we didn't change the path + if ( !m_bChanged ) + return; + + // find the deepest still existing parent path of the original path + while ( !m_pContainer->HasGroup(m_strOldPath) ) + { + m_strOldPath = m_strOldPath.BeforeLast(wxCONFIG_PATH_SEPARATOR); + if ( m_strOldPath.empty() ) + m_strOldPath = wxCONFIG_PATH_SEPARATOR; + } +} + +wxConfigPathChanger::~wxConfigPathChanger() +{ + // only restore path if it was changed + if ( m_bChanged ) { + m_pContainer->SetPath(m_strOldPath); + } +} + +// this is a wxConfig method but it's mainly used with wxConfigPathChanger +/* static */ +wxString wxConfigBase::RemoveTrailingSeparator(const wxString& key) +{ + wxString path(key); + + // don't remove the only separator from a root group path! + while ( path.length() > 1 ) + { + if ( *path.rbegin() != wxCONFIG_PATH_SEPARATOR ) + break; + + path.erase(path.end() - 1); + } + + return path; +} + +#endif // wxUSE_CONFIG + +// ---------------------------------------------------------------------------- +// static & global functions +// ---------------------------------------------------------------------------- + +// understands both Unix and Windows (but only under Windows) environment +// variables expansion: i.e. $var, $(var) and ${var} are always understood +// and in addition under Windows %var% is also. + +// don't change the values the enum elements: they must be equal +// to the matching [closing] delimiter. +enum Bracket +{ + Bracket_None, + Bracket_Normal = ')', + Bracket_Curly = '}', +#ifdef __WXMSW__ + Bracket_Windows = '%', // yeah, Windows people are a bit strange ;-) +#endif + Bracket_Max +}; + +wxString wxExpandEnvVars(const wxString& str) +{ + wxString strResult; + strResult.Alloc(str.length()); + + size_t m; + for ( size_t n = 0; n < str.length(); n++ ) { + switch ( str[n] ) { +#ifdef __WXMSW__ + case wxT('%'): +#endif //WINDOWS + case wxT('$'): + { + Bracket bracket; + #ifdef __WXMSW__ + if ( str[n] == wxT('%') ) + bracket = Bracket_Windows; + else + #endif //WINDOWS + if ( n == str.length() - 1 ) { + bracket = Bracket_None; + } + else { + switch ( str[n + 1] ) { + case wxT('('): + bracket = Bracket_Normal; + n++; // skip the bracket + break; + + case wxT('{'): + bracket = Bracket_Curly; + n++; // skip the bracket + break; + + default: + bracket = Bracket_None; + } + } + + m = n + 1; + + while ( m < str.length() && (wxIsalnum(str[m]) || str[m] == wxT('_')) ) + m++; + + wxString strVarName(str.c_str() + n + 1, m - n - 1); + +#ifdef __WXWINCE__ + const wxChar *pszValue = NULL; +#else + // NB: use wxGetEnv instead of wxGetenv as otherwise variables + // set through wxSetEnv may not be read correctly! + const wxChar *pszValue = NULL; + wxString tmp; + if (wxGetEnv(strVarName, &tmp)) + pszValue = tmp; +#endif + if ( pszValue != NULL ) { + strResult += pszValue; + } + else { + // variable doesn't exist => don't change anything + #ifdef __WXMSW__ + if ( bracket != Bracket_Windows ) + #endif + if ( bracket != Bracket_None ) + strResult << str[n - 1]; + strResult << str[n] << strVarName; + } + + // check the closing bracket + if ( bracket != Bracket_None ) { + if ( m == str.length() || str[m] != (wxChar)bracket ) { + // under MSW it's common to have '%' characters in the registry + // and it's annoying to have warnings about them each time, so + // ignroe them silently if they are not used for env vars + // + // under Unix, OTOH, this warning could be useful for the user to + // understand why isn't the variable expanded as intended + #ifndef __WXMSW__ + wxLogWarning(_("Environment variables expansion failed: missing '%c' at position %u in '%s'."), + (char)bracket, (unsigned int) (m + 1), str.c_str()); + #endif // __WXMSW__ + } + else { + // skip closing bracket unless the variables wasn't expanded + if ( pszValue == NULL ) + strResult << (wxChar)bracket; + m++; + } + } + + n = m - 1; // skip variable name + } + break; + + case '\\': + // backslash can be used to suppress special meaning of % and $ + if ( n != str.length() - 1 && + (str[n + 1] == wxT('%') || str[n + 1] == wxT('$')) ) { + strResult += str[++n]; + + break; + } + //else: fall through + + default: + strResult += str[n]; + } + } + + return strResult; +} + +// this function is used to properly interpret '..' in path +void wxSplitPath(wxArrayString& aParts, const wxChar *sz) +{ + aParts.clear(); + + wxString strCurrent; + const wxChar *pc = sz; + for ( ;; ) { + if ( *pc == wxT('\0') || *pc == wxCONFIG_PATH_SEPARATOR ) { + if ( strCurrent == wxT(".") ) { + // ignore + } + else if ( strCurrent == wxT("..") ) { + // go up one level + if ( aParts.size() == 0 ) + wxLogWarning(_("'%s' has extra '..', ignored."), sz); + else + aParts.erase(aParts.end() - 1); + + strCurrent.Empty(); + } + else if ( !strCurrent.empty() ) { + aParts.push_back(strCurrent); + strCurrent.Empty(); + } + //else: + // could log an error here, but we prefer to ignore extra '/' + + if ( *pc == wxT('\0') ) + break; + } + else + strCurrent += *pc; + + pc++; + } +} diff --git a/Externals/wxWidgets/src/common/containr.cpp b/Externals/wxWidgets/src/common/containr.cpp new file mode 100644 index 0000000000..275ffb5747 --- /dev/null +++ b/Externals/wxWidgets/src/common/containr.cpp @@ -0,0 +1,678 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/common/containr.cpp +// Purpose: implementation of wxControlContainer +// Author: Vadim Zeitlin +// Modified by: +// Created: 06.08.01 +// RCS-ID: $Id: containr.cpp 44273 2007-01-21 01:21:45Z VZ $ +// Copyright: (c) 2001 Vadim Zeitlin +// License: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#ifndef WX_PRECOMP + #include "wx/log.h" + #include "wx/event.h" + #include "wx/window.h" + #include "wx/scrolbar.h" + #include "wx/radiobut.h" + #include "wx/containr.h" +#endif //WX_PRECOMP + +// trace mask for focus messages +#define TRACE_FOCUS _T("focus") + +// ============================================================================ +// implementation +// ============================================================================ + +wxControlContainer::wxControlContainer(wxWindow *winParent) +{ + m_winParent = winParent; + m_winLastFocused = NULL; + m_inSetFocus = false; +} + +bool wxControlContainer::AcceptsFocus() const +{ + // if we're not shown or disabled, we can't accept focus + if ( m_winParent->IsShown() && m_winParent->IsEnabled() ) + { + // otherwise we can accept focus either if we have no children at all + // (in this case we're probably not used as a container) or only when + // at least one child will accept focus + wxWindowList::compatibility_iterator node = m_winParent->GetChildren().GetFirst(); + if ( !node ) + return true; + +#ifdef __WXMAC__ + // wxMac has eventually the two scrollbars as children, they don't count + // as real children in the algorithm mentioned above + bool hasRealChildren = false ; +#endif + + while ( node ) + { + wxWindow *child = node->GetData(); + node = node->GetNext(); + +#ifdef __WXMAC__ + if ( m_winParent->MacIsWindowScrollbar( child ) ) + continue; + hasRealChildren = true ; +#endif + if ( child->AcceptsFocus() ) + { + return true; + } + } + +#ifdef __WXMAC__ + if ( !hasRealChildren ) + return true ; +#endif + } + + return false; +} + +void wxControlContainer::SetLastFocus(wxWindow *win) +{ + // the panel itself should never get the focus at all but if it does happen + // temporarily (as it seems to do under wxGTK), at the very least don't + // forget our previous m_winLastFocused + if ( win != m_winParent ) + { + // if we're setting the focus + if ( win ) + { + // find the last _immediate_ child which got focus + wxWindow *winParent = win; + while ( winParent != m_winParent ) + { + win = winParent; + winParent = win->GetParent(); + + // Yes, this can happen, though in a totally pathological case. + // like when detaching a menubar from a frame with a child + // which has pushed itself as an event handler for the menubar. + // (under wxGTK) + + wxASSERT_MSG( winParent, + _T("Setting last focus for a window that is not our child?") ); + } + } + + m_winLastFocused = win; + + if ( win ) + { + wxLogTrace(TRACE_FOCUS, _T("Set last focus to %s(%s)"), + win->GetClassInfo()->GetClassName(), + win->GetLabel().c_str()); + } + else + { + wxLogTrace(TRACE_FOCUS, _T("No more last focus")); + } + } + + // propagate the last focus upwards so that our parent can set focus back + // to us if it loses it now and regains later + wxWindow *parent = m_winParent->GetParent(); + if ( parent ) + { + wxChildFocusEvent eventFocus(m_winParent); + parent->GetEventHandler()->ProcessEvent(eventFocus); + } +} + +// -------------------------------------------------------------------- +// The following four functions are used to find other radio buttons +// within the same group. Used by wxSetFocusToChild on wxMSW +// -------------------------------------------------------------------- + +#ifdef __WXMSW__ + +wxRadioButton* wxGetPreviousButtonInGroup(wxRadioButton *btn) +{ + if ( btn->HasFlag(wxRB_GROUP) || btn->HasFlag(wxRB_SINGLE) ) + return NULL; + + const wxWindowList& siblings = btn->GetParent()->GetChildren(); + wxWindowList::compatibility_iterator nodeThis = siblings.Find(btn); + wxCHECK_MSG( nodeThis, NULL, _T("radio button not a child of its parent?") ); + + // Iterate over all previous siblings until we find the next radio button + wxWindowList::compatibility_iterator nodeBefore = nodeThis->GetPrevious(); + wxRadioButton *prevBtn = 0; + while (nodeBefore) + { + prevBtn = wxDynamicCast(nodeBefore->GetData(), wxRadioButton); + if (prevBtn) + break; + + nodeBefore = nodeBefore->GetPrevious(); + } + + if (!prevBtn || prevBtn->HasFlag(wxRB_SINGLE)) + { + // no more buttons in group + return NULL; + } + + return prevBtn; +} + +wxRadioButton* wxGetNextButtonInGroup(wxRadioButton *btn) +{ + if (btn->HasFlag(wxRB_SINGLE)) + return NULL; + + const wxWindowList& siblings = btn->GetParent()->GetChildren(); + wxWindowList::compatibility_iterator nodeThis = siblings.Find(btn); + wxCHECK_MSG( nodeThis, NULL, _T("radio button not a child of its parent?") ); + + // Iterate over all previous siblings until we find the next radio button + wxWindowList::compatibility_iterator nodeNext = nodeThis->GetNext(); + wxRadioButton *nextBtn = 0; + while (nodeNext) + { + nextBtn = wxDynamicCast(nodeNext->GetData(), wxRadioButton); + if (nextBtn) + break; + + nodeNext = nodeNext->GetNext(); + } + + if ( !nextBtn || nextBtn->HasFlag(wxRB_GROUP) || nextBtn->HasFlag(wxRB_SINGLE) ) + { + // no more buttons or the first button of the next group + return NULL; + } + + return nextBtn; +} + +wxRadioButton* wxGetFirstButtonInGroup(wxRadioButton *btn) +{ + while (true) + { + wxRadioButton* prevBtn = wxGetPreviousButtonInGroup(btn); + if (!prevBtn) + return btn; + + btn = prevBtn; + } +} + +wxRadioButton* wxGetLastButtonInGroup(wxRadioButton *btn) +{ + while (true) + { + wxRadioButton* nextBtn = wxGetNextButtonInGroup(btn); + if (!nextBtn) + return btn; + + btn = nextBtn; + } +} + +wxRadioButton* wxGetSelectedButtonInGroup(wxRadioButton *btn) +{ + // Find currently selected button + if (btn->GetValue()) + return btn; + + if (btn->HasFlag(wxRB_SINGLE)) + return NULL; + + wxRadioButton *selBtn; + + // First check all previous buttons + for (selBtn = wxGetPreviousButtonInGroup(btn); selBtn; selBtn = wxGetPreviousButtonInGroup(selBtn)) + if (selBtn->GetValue()) + return selBtn; + + // Now all following buttons + for (selBtn = wxGetNextButtonInGroup(btn); selBtn; selBtn = wxGetNextButtonInGroup(selBtn)) + if (selBtn->GetValue()) + return selBtn; + + return NULL; +} + +#endif // __WXMSW__ + +// ---------------------------------------------------------------------------- +// Keyboard handling - this is the place where the TAB traversal logic is +// implemented. As this code is common to all ports, this ensures consistent +// behaviour even if we don't specify how exactly the wxNavigationKeyEvent are +// generated and this is done in platform specific code which also ensures that +// we can follow the given platform standards. +// ---------------------------------------------------------------------------- + +void wxControlContainer::HandleOnNavigationKey( wxNavigationKeyEvent& event ) +{ + wxWindow *parent = m_winParent->GetParent(); + + // the event is propagated downwards if the event emitter was our parent + bool goingDown = event.GetEventObject() == parent; + + const wxWindowList& children = m_winParent->GetChildren(); + + // if we have exactly one notebook-like child window (actually it could be + // any window that returns true from its HasMultiplePages()), then + // [Shift-]Ctrl-Tab and Ctrl-PageUp/Down keys should iterate over its pages + // even if the focus is outside of the control because this is how the + // standard MSW properties dialogs behave and we do it under other platforms + // as well because it seems like a good idea -- but we can always put this + // block inside "#ifdef __WXMSW__" if it's not suitable there + if ( event.IsWindowChange() && !goingDown ) + { + // check if we have a unique notebook-like child + wxWindow *bookctrl = NULL; + for ( wxWindowList::const_iterator i = children.begin(), + end = children.end(); + i != end; + ++i ) + { + wxWindow * const window = *i; + if ( window->HasMultiplePages() ) + { + if ( bookctrl ) + { + // this is the second book-like control already so don't do + // anything as we don't know which one should have its page + // changed + bookctrl = NULL; + break; + } + + bookctrl = window; + } + } + + if ( bookctrl ) + { + // make sure that we don't bubble up the event again from the book + // control resulting in infinite recursion + wxNavigationKeyEvent eventCopy(event); + eventCopy.SetEventObject(m_winParent); + if ( bookctrl->GetEventHandler()->ProcessEvent(eventCopy) ) + return; + } + } + + // there is not much to do if we don't have children and we're not + // interested in "notebook page change" events here + if ( !children.GetCount() || event.IsWindowChange() ) + { + // let the parent process it unless it already comes from our parent + // of we don't have any + if ( goingDown || + !parent || !parent->GetEventHandler()->ProcessEvent(event) ) + { + event.Skip(); + } + + return; + } + + // where are we going? + const bool forward = event.GetDirection(); + + // the node of the children list from which we should start looking for the + // next acceptable child + wxWindowList::compatibility_iterator node, start_node; + + // we should start from the first/last control and not from the one which + // had focus the last time if we're propagating the event downwards because + // for our parent we look like a single control + if ( goingDown ) + { + // just to be sure it's not used (normally this is not necessary, but + // doesn't hurt neither) + m_winLastFocused = (wxWindow *)NULL; + + // start from first or last depending on where we're going + node = forward ? children.GetFirst() : children.GetLast(); + } + else // going up + { + // try to find the child which has the focus currently + + // the event emitter might have done this for us + wxWindow *winFocus = event.GetCurrentFocus(); + + // but if not, we might know where the focus was ourselves + if (!winFocus) + winFocus = m_winLastFocused; + + // if still no luck, do it the hard way + if (!winFocus) + winFocus = wxWindow::FindFocus(); + + if ( winFocus ) + { +#ifdef __WXMSW__ + // If we are in a radio button group, start from the first item in the + // group + if ( event.IsFromTab() && wxIsKindOf(winFocus, wxRadioButton ) ) + winFocus = wxGetFirstButtonInGroup((wxRadioButton*)winFocus); +#endif + // ok, we found the focus - now is it our child? + start_node = children.Find( winFocus ); + } + + if ( !start_node && m_winLastFocused ) + { + // window which has focus isn't our child, fall back to the one + // which had the focus the last time + start_node = children.Find( m_winLastFocused ); + } + + // if we still didn't find anything, we should start with the first one + if ( !start_node ) + { + start_node = children.GetFirst(); + } + + // and the first child which we can try setting focus to is the next or + // the previous one + node = forward ? start_node->GetNext() : start_node->GetPrevious(); + } + + // we want to cycle over all elements passing by NULL + for ( ;; ) + { + // don't go into infinite loop + if ( start_node && node && node == start_node ) + break; + + // Have we come to the last or first item on the panel? + if ( !node ) + { + if ( !start_node ) + { + // exit now as otherwise we'd loop forever + break; + } + + if ( !goingDown ) + { + // Check if our (maybe grand) parent is another panel: if this + // is the case, they will know what to do with this navigation + // key and so give them the chance to process it instead of + // looping inside this panel (normally, the focus will go to + // the next/previous item after this panel in the parent + // panel). + wxWindow *focussed_child_of_parent = m_winParent; + while ( parent ) + { + // we don't want to tab into a different dialog or frame + if ( focussed_child_of_parent->IsTopLevel() ) + break; + + event.SetCurrentFocus( focussed_child_of_parent ); + if ( parent->GetEventHandler()->ProcessEvent( event ) ) + return; + + focussed_child_of_parent = parent; + + parent = parent->GetParent(); + } + } + //else: as the focus came from our parent, we definitely don't want + // to send it back to it! + + // no, we are not inside another panel so process this ourself + node = forward ? children.GetFirst() : children.GetLast(); + + continue; + } + + wxWindow *child = node->GetData(); + +#ifdef __WXMSW__ + if ( event.IsFromTab() ) + { + if ( wxIsKindOf(child, wxRadioButton) ) + { + // only radio buttons with either wxRB_GROUP or wxRB_SINGLE + // can be tabbed to + if ( child->HasFlag(wxRB_GROUP) ) + { + // need to tab into the active button within a group + wxRadioButton *rb = wxGetSelectedButtonInGroup((wxRadioButton*)child); + if ( rb ) + child = rb; + } + else if ( !child->HasFlag(wxRB_SINGLE) ) + { + node = forward ? node->GetNext() : node->GetPrevious(); + continue; + } + } + } + else if ( m_winLastFocused && + wxIsKindOf(m_winLastFocused, wxRadioButton) && + !m_winLastFocused->HasFlag(wxRB_SINGLE) ) + { + // cursor keys don't navigate out of a radio button group so + // find the correct radio button to focus + if ( forward ) + { + child = wxGetNextButtonInGroup((wxRadioButton*)m_winLastFocused); + if ( !child ) + { + // no next button in group, set it to the first button + child = wxGetFirstButtonInGroup((wxRadioButton*)m_winLastFocused); + } + } + else + { + child = wxGetPreviousButtonInGroup((wxRadioButton*)m_winLastFocused); + if ( !child ) + { + // no previous button in group, set it to the last button + child = wxGetLastButtonInGroup((wxRadioButton*)m_winLastFocused); + } + } + + if ( child == m_winLastFocused ) + { + // must be a group consisting of only one button therefore + // no need to send a navigation event + event.Skip(false); + return; + } + } +#endif // __WXMSW__ + + if ( child->AcceptsFocusFromKeyboard() ) + { + // if we're setting the focus to a child panel we should prevent it + // from giving it to the child which had the focus the last time + // and instead give it to the first/last child depending from which + // direction we're coming + event.SetEventObject(m_winParent); + + // disable propagation for this call as otherwise the event might + // bounce back to us. + wxPropagationDisabler disableProp(event); + if ( !child->GetEventHandler()->ProcessEvent(event) ) + { + // set it first in case SetFocusFromKbd() results in focus + // change too + m_winLastFocused = child; + + // everything is simple: just give focus to it + child->SetFocusFromKbd(); + } + //else: the child manages its focus itself + + event.Skip( false ); + + return; + } + + node = forward ? node->GetNext() : node->GetPrevious(); + } + + // we cycled through all of our children and none of them wanted to accept + // focus + event.Skip(); +} + +void wxControlContainer::HandleOnWindowDestroy(wxWindowBase *child) +{ + if ( child == m_winLastFocused ) + m_winLastFocused = NULL; +} + +// ---------------------------------------------------------------------------- +// focus handling +// ---------------------------------------------------------------------------- + +bool wxControlContainer::DoSetFocus() +{ + wxLogTrace(TRACE_FOCUS, _T("SetFocus on wxPanel 0x%p."), + m_winParent->GetHandle()); + + if (m_inSetFocus) + return true; + + // when the panel gets the focus we move the focus to either the last + // window that had the focus or the first one that can get it unless the + // focus had been already set to some other child + + wxWindow *win = wxWindow::FindFocus(); + while ( win ) + { + if ( win == m_winParent ) + { + // our child already has focus, don't take it away from it + return true; + } + + if ( win->IsTopLevel() ) + { + // don't look beyond the first top level parent - useless and + // unnecessary + break; + } + + win = win->GetParent(); + } + + // protect against infinite recursion: + m_inSetFocus = true; + + bool ret = SetFocusToChild(); + + m_inSetFocus = false; + + return ret; +} + +void wxControlContainer::HandleOnFocus(wxFocusEvent& event) +{ + wxLogTrace(TRACE_FOCUS, _T("OnFocus on wxPanel 0x%p, name: %s"), + m_winParent->GetHandle(), + m_winParent->GetName().c_str() ); + + DoSetFocus(); + + event.Skip(); +} + +bool wxControlContainer::SetFocusToChild() +{ + return wxSetFocusToChild(m_winParent, &m_winLastFocused); +} + +// ---------------------------------------------------------------------------- +// SetFocusToChild(): this function is used by wxPanel but also by wxFrame in +// wxMSW, this is why it is outside of wxControlContainer class +// ---------------------------------------------------------------------------- + +bool wxSetFocusToChild(wxWindow *win, wxWindow **childLastFocused) +{ + wxCHECK_MSG( win, false, _T("wxSetFocusToChild(): invalid window") ); + wxCHECK_MSG( childLastFocused, false, + _T("wxSetFocusToChild(): NULL child poonter") ); + + if ( *childLastFocused ) + { + // It might happen that the window got reparented + if ( (*childLastFocused)->GetParent() == win ) + { + wxLogTrace(TRACE_FOCUS, + _T("SetFocusToChild() => last child (0x%p)."), + (*childLastFocused)->GetHandle()); + + // not SetFocusFromKbd(): we're restoring focus back to the old + // window and not setting it as the result of a kbd action + (*childLastFocused)->SetFocus(); + return true; + } + else + { + // it doesn't count as such any more + *childLastFocused = (wxWindow *)NULL; + } + } + + // set the focus to the first child who wants it + wxWindowList::compatibility_iterator node = win->GetChildren().GetFirst(); + while ( node ) + { + wxWindow *child = node->GetData(); + node = node->GetNext(); + +#ifdef __WXMAC__ + if ( child->GetParent()->MacIsWindowScrollbar( child ) ) + continue; +#endif + + if ( child->AcceptsFocusFromKeyboard() && !child->IsTopLevel() ) + { +#ifdef __WXMSW__ + // If a radiobutton is the first focusable child, search for the + // selected radiobutton in the same group + wxRadioButton* btn = wxDynamicCast(child, wxRadioButton); + if (btn) + { + wxRadioButton* selected = wxGetSelectedButtonInGroup(btn); + if (selected) + child = selected; + } +#endif + + wxLogTrace(TRACE_FOCUS, + _T("SetFocusToChild() => first child (0x%p)."), + child->GetHandle()); + + *childLastFocused = child; + child->SetFocusFromKbd(); + return true; + } + } + + return false; +} diff --git a/Externals/wxWidgets/src/common/convauto.cpp b/Externals/wxWidgets/src/common/convauto.cpp new file mode 100644 index 0000000000..540f180ffe --- /dev/null +++ b/Externals/wxWidgets/src/common/convauto.cpp @@ -0,0 +1,214 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/common/convauto.cpp +// Purpose: implementation of wxConvAuto +// Author: Vadim Zeitlin +// Created: 2006-04-04 +// RCS-ID: $Id: convauto.cpp 38570 2006-04-05 14:37:47Z VZ $ +// Copyright: (c) 2006 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// for compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_WCHAR_T + +#ifndef WX_PRECOMP +#endif //WX_PRECOMP + +#include "wx/convauto.h" + +// ============================================================================ +// implementation +// ============================================================================ + +/* static */ +wxConvAuto::BOMType wxConvAuto::DetectBOM(const char *src, size_t srcLen) +{ + if ( srcLen < 2 ) + { + // minimal BOM is 2 bytes so bail out immediately and simplify the code + // below which wouldn't need to check for length for UTF-16 cases + return BOM_None; + } + + // examine the buffer for BOM presence + // + // see http://www.unicode.org/faq/utf_bom.html#BOM + switch ( *src++ ) + { + case '\0': + // could only be big endian UTF-32 (00 00 FE FF) + if ( srcLen >= 4 && + src[0] == '\0' && + src[1] == '\xfe' && + src[2] == '\xff' ) + { + return BOM_UTF32BE; + } + break; + + case '\xfe': + // could only be big endian UTF-16 (FE FF) + if ( *src++ == '\xff' ) + { + return BOM_UTF16BE; + } + break; + + case '\xff': + // could be either little endian UTF-16 or UTF-32, both start + // with FF FE + if ( *src++ == '\xfe' ) + { + return srcLen >= 4 && src[0] == '\0' && src[1] == '\0' + ? BOM_UTF32LE + : BOM_UTF16LE; + } + break; + + case '\xef': + // is this UTF-8 BOM (EF BB BF)? + if ( srcLen >= 3 && src[0] == '\xbb' && src[1] == '\xbf' ) + { + return BOM_UTF8; + } + break; + } + + return BOM_None; +} + +void wxConvAuto::InitFromBOM(BOMType bomType) +{ + m_consumedBOM = false; + + switch ( bomType ) + { + case BOM_UTF32BE: + m_conv = new wxMBConvUTF32BE; + m_ownsConv = true; + break; + + case BOM_UTF32LE: + m_conv = new wxMBConvUTF32LE; + m_ownsConv = true; + break; + + case BOM_UTF16BE: + m_conv = new wxMBConvUTF16BE; + m_ownsConv = true; + break; + + case BOM_UTF16LE: + m_conv = new wxMBConvUTF16LE; + m_ownsConv = true; + break; + + case BOM_UTF8: + m_conv = &wxConvUTF8; + m_ownsConv = false; + break; + + default: + wxFAIL_MSG( _T("unexpected BOM type") ); + // fall through: still need to create something + + case BOM_None: + InitWithDefault(); + m_consumedBOM = true; // as there is nothing to consume + } +} + +void wxConvAuto::SkipBOM(const char **src, size_t *len) const +{ + int ofs; + switch ( m_bomType ) + { + case BOM_UTF32BE: + case BOM_UTF32LE: + ofs = 4; + break; + + case BOM_UTF16BE: + case BOM_UTF16LE: + ofs = 2; + break; + + case BOM_UTF8: + ofs = 3; + break; + + default: + wxFAIL_MSG( _T("unexpected BOM type") ); + // fall through: still need to create something + + case BOM_None: + ofs = 0; + } + + *src += ofs; + if ( *len != (size_t)-1 ) + *len -= ofs; +} + +void wxConvAuto::InitFromInput(const char **src, size_t *len) +{ + m_bomType = DetectBOM(*src, *len); + InitFromBOM(m_bomType); + SkipBOM(src, len); +} + +size_t +wxConvAuto::ToWChar(wchar_t *dst, size_t dstLen, + const char *src, size_t srcLen) const +{ + // we check BOM and create the appropriate conversion the first time we're + // called but we also need to ensure that the BOM is skipped not only + // during this initial call but also during the first call with non-NULL + // dst as typically we're first called with NULL dst to calculate the + // needed buffer size + wxConvAuto *self = wx_const_cast(wxConvAuto *, this); + if ( !m_conv ) + { + self->InitFromInput(&src, &srcLen); + if ( dst ) + self->m_consumedBOM = true; + } + + if ( !m_consumedBOM && dst ) + { + self->m_consumedBOM = true; + SkipBOM(&src, &srcLen); + } + + return m_conv->ToWChar(dst, dstLen, src, srcLen); +} + +size_t +wxConvAuto::FromWChar(char *dst, size_t dstLen, + const wchar_t *src, size_t srcLen) const +{ + if ( !m_conv ) + { + // default to UTF-8 for the multibyte output + wx_const_cast(wxConvAuto *, this)->InitWithDefault(); + } + + return m_conv->FromWChar(dst, dstLen, src, srcLen); +} + +#endif // wxUSE_WCHAR_T + diff --git a/Externals/wxWidgets/src/common/cshelp.cpp b/Externals/wxWidgets/src/common/cshelp.cpp new file mode 100644 index 0000000000..a79a687c92 --- /dev/null +++ b/Externals/wxWidgets/src/common/cshelp.cpp @@ -0,0 +1,503 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/cshelp.cpp +// Purpose: Context sensitive help class implementation +// Author: Julian Smart, Vadim Zeitlin +// Modified by: +// Created: 08/09/2000 +// RCS-ID: $Id: cshelp.cpp 43211 2006-11-09 00:41:18Z VZ $ +// Copyright: (c) 2000 Julian Smart, Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_HELP + +#ifndef WX_PRECOMP + #include "wx/app.h" + #include "wx/module.h" +#endif + +#include "wx/tipwin.h" +#include "wx/cshelp.h" + +#if wxUSE_MS_HTML_HELP + #include "wx/msw/helpchm.h" // for ShowContextHelpPopup + #include "wx/utils.h" // for wxGetMousePosition() +#endif + +// ---------------------------------------------------------------------------- +// wxContextHelpEvtHandler private class +// ---------------------------------------------------------------------------- + +// This class exists in order to eat events until the left mouse button is +// pressed +class wxContextHelpEvtHandler: public wxEvtHandler +{ +public: + wxContextHelpEvtHandler(wxContextHelp* contextHelp) + { + m_contextHelp = contextHelp; + } + + virtual bool ProcessEvent(wxEvent& event); + +//// Data + wxContextHelp* m_contextHelp; + + DECLARE_NO_COPY_CLASS(wxContextHelpEvtHandler) +}; + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxContextHelp +// ---------------------------------------------------------------------------- + +/* + * Invokes context-sensitive help + */ + + +IMPLEMENT_DYNAMIC_CLASS(wxContextHelp, wxObject) + +wxContextHelp::wxContextHelp(wxWindow* win, bool beginHelp) +{ + m_inHelp = false; + + if (beginHelp) + BeginContextHelp(win); +} + +wxContextHelp::~wxContextHelp() +{ + if (m_inHelp) + EndContextHelp(); +} + +// Not currently needed, but on some systems capture may not work as +// expected so we'll leave it here for now. +#ifdef __WXMOTIF__ +static void wxPushOrPopEventHandlers(wxContextHelp* help, wxWindow* win, bool push) +{ + if (push) + win->PushEventHandler(new wxContextHelpEvtHandler(help)); + else + win->PopEventHandler(true); + + wxWindowList::compatibility_iterator node = win->GetChildren().GetFirst(); + while (node) + { + wxWindow* child = node->GetData(); + wxPushOrPopEventHandlers(help, child, push); + + node = node->GetNext(); + } +} +#endif + +// Begin 'context help mode' +bool wxContextHelp::BeginContextHelp(wxWindow* win) +{ + if (!win) + win = wxTheApp->GetTopWindow(); + if (!win) + return false; + + wxCursor cursor(wxCURSOR_QUESTION_ARROW); + wxCursor oldCursor = win->GetCursor(); + win->SetCursor(cursor); + +#ifdef __WXMSW__ + // wxSetCursor(cursor); +#endif + + m_status = false; + +#ifdef __WXMOTIF__ + wxPushOrPopEventHandlers(this, win, true); +#else + win->PushEventHandler(new wxContextHelpEvtHandler(this)); +#endif + + win->CaptureMouse(); + + EventLoop(); + + win->ReleaseMouse(); + +#ifdef __WXMOTIF__ + wxPushOrPopEventHandlers(this, win, false); +#else + win->PopEventHandler(true); +#endif + + win->SetCursor(oldCursor); + + if (m_status) + { + wxPoint pt; + wxWindow* winAtPtr = wxFindWindowAtPointer(pt); + +#if 0 + if (winAtPtr) + { + printf("Picked %s (%d)\n", winAtPtr->GetName().c_str(), + winAtPtr->GetId()); + } +#endif + + if (winAtPtr) + DispatchEvent(winAtPtr, pt); + } + + return true; +} + +bool wxContextHelp::EndContextHelp() +{ + m_inHelp = false; + + return true; +} + +bool wxContextHelp::EventLoop() +{ + m_inHelp = true; + + while ( m_inHelp ) + { + if (wxTheApp->Pending()) + { + wxTheApp->Dispatch(); + } + else + { + wxTheApp->ProcessIdle(); + } + } + + return true; +} + +bool wxContextHelpEvtHandler::ProcessEvent(wxEvent& event) +{ + if (event.GetEventType() == wxEVT_LEFT_DOWN) + { + m_contextHelp->SetStatus(true); + m_contextHelp->EndContextHelp(); + return true; + } + + if ((event.GetEventType() == wxEVT_CHAR) || + (event.GetEventType() == wxEVT_KEY_DOWN) || + (event.GetEventType() == wxEVT_ACTIVATE) || + (event.GetEventType() == wxEVT_MOUSE_CAPTURE_CHANGED)) + { + // May have already been set to true by a left-click + //m_contextHelp->SetStatus(false); + m_contextHelp->EndContextHelp(); + return true; + } + + if ((event.GetEventType() == wxEVT_PAINT) || + (event.GetEventType() == wxEVT_ERASE_BACKGROUND)) + { + event.Skip(); + return false; + } + + return true; +} + +// Dispatch the help event to the relevant window +bool wxContextHelp::DispatchEvent(wxWindow* win, const wxPoint& pt) +{ + wxCHECK_MSG( win, false, _T("win parameter can't be NULL") ); + + wxHelpEvent helpEvent(wxEVT_HELP, win->GetId(), pt, + wxHelpEvent::Origin_HelpButton); + helpEvent.SetEventObject(win); + + return win->GetEventHandler()->ProcessEvent(helpEvent); +} + +// ---------------------------------------------------------------------------- +// wxContextHelpButton +// ---------------------------------------------------------------------------- + +/* + * wxContextHelpButton + * You can add this to your dialogs (especially on non-Windows platforms) + * to put the application into context help mode. + */ + +#ifndef __WXPM__ + +static const char * csquery_xpm[] = { +"12 11 2 1", +" c None", +". c #000000", +" ", +" .... ", +" .. .. ", +" .. .. ", +" .. ", +" .. ", +" .. ", +" ", +" .. ", +" .. ", +" "}; + +#endif + +IMPLEMENT_CLASS(wxContextHelpButton, wxBitmapButton) + +BEGIN_EVENT_TABLE(wxContextHelpButton, wxBitmapButton) + EVT_BUTTON(wxID_CONTEXT_HELP, wxContextHelpButton::OnContextHelp) +END_EVENT_TABLE() + +wxContextHelpButton::wxContextHelpButton(wxWindow* parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + long style) +#if defined(__WXPM__) + : wxBitmapButton(parent, id, wxBitmap(wxCSQUERY_BITMAP + ,wxBITMAP_TYPE_RESOURCE + ), + pos, size, style) +#else + : wxBitmapButton(parent, id, wxBitmap(csquery_xpm), + pos, size, style) +#endif +{ +} + +void wxContextHelpButton::OnContextHelp(wxCommandEvent& WXUNUSED(event)) +{ + wxContextHelp contextHelp(GetParent()); +} + +// ---------------------------------------------------------------------------- +// wxHelpProvider +// ---------------------------------------------------------------------------- + +wxHelpProvider *wxHelpProvider::ms_helpProvider = (wxHelpProvider *)NULL; + +// trivial implementation of some methods which we don't want to make pure +// virtual for convenience + +void wxHelpProvider::AddHelp(wxWindowBase * WXUNUSED(window), + const wxString& WXUNUSED(text)) +{ +} + +void wxHelpProvider::AddHelp(wxWindowID WXUNUSED(id), + const wxString& WXUNUSED(text)) +{ +} + +// removes the association +void wxHelpProvider::RemoveHelp(wxWindowBase* WXUNUSED(window)) +{ +} + +wxHelpProvider::~wxHelpProvider() +{ +} + +wxString wxHelpProvider::GetHelpTextMaybeAtPoint(wxWindowBase *window) +{ + if ( m_helptextAtPoint != wxDefaultPosition || + m_helptextOrigin != wxHelpEvent::Origin_Unknown ) + { + wxCHECK_MSG( window, wxEmptyString, _T("window must not be NULL") ); + + wxPoint pt = m_helptextAtPoint; + wxHelpEvent::Origin origin = m_helptextOrigin; + + m_helptextAtPoint = wxDefaultPosition; + m_helptextOrigin = wxHelpEvent::Origin_Unknown; + + return window->GetHelpTextAtPoint(pt, origin); + } + + return GetHelp(window); +} + +// ---------------------------------------------------------------------------- +// wxSimpleHelpProvider +// ---------------------------------------------------------------------------- + +#define WINHASH_KEY(w) wxPtrToUInt(w) + +wxString wxSimpleHelpProvider::GetHelp(const wxWindowBase *window) +{ + wxSimpleHelpProviderHashMap::iterator it = m_hashWindows.find(WINHASH_KEY(window)); + + if ( it == m_hashWindows.end() ) + { + it = m_hashIds.find(window->GetId()); + if ( it == m_hashIds.end() ) + return wxEmptyString; + } + + return it->second; +} + +void wxSimpleHelpProvider::AddHelp(wxWindowBase *window, const wxString& text) +{ + m_hashWindows.erase(WINHASH_KEY(window)); + m_hashWindows[WINHASH_KEY(window)] = text; +} + +void wxSimpleHelpProvider::AddHelp(wxWindowID id, const wxString& text) +{ + wxSimpleHelpProviderHashMap::key_type key = (wxSimpleHelpProviderHashMap::key_type)id; + m_hashIds.erase(key); + m_hashIds[key] = text; +} + +// removes the association +void wxSimpleHelpProvider::RemoveHelp(wxWindowBase* window) +{ + m_hashWindows.erase(WINHASH_KEY(window)); +} + +bool wxSimpleHelpProvider::ShowHelp(wxWindowBase *window) +{ +#if wxUSE_MS_HTML_HELP || wxUSE_TIPWINDOW + const wxString text = GetHelpTextMaybeAtPoint(window); + + if ( !text.empty() ) + { + // use the native help popup style if it's available +#if wxUSE_MS_HTML_HELP + if ( !wxCHMHelpController::ShowContextHelpPopup + ( + text, + wxGetMousePosition(), + (wxWindow *)window + ) ) +#endif // wxUSE_MS_HTML_HELP + { +#if wxUSE_TIPWINDOW + static wxTipWindow* s_tipWindow = NULL; + + if ( s_tipWindow ) + { + // Prevent s_tipWindow being nulled in OnIdle, thereby removing + // the chance for the window to be closed by ShowHelp + s_tipWindow->SetTipWindowPtr(NULL); + s_tipWindow->Close(); + } + + s_tipWindow = new wxTipWindow((wxWindow *)window, text, + 100, &s_tipWindow); +#else // !wxUSE_TIPWINDOW + // we tried wxCHMHelpController but it failed and we don't have + // wxTipWindow to fall back on, so + return false; +#endif // wxUSE_TIPWINDOW + } + + return true; + } +#else // !wxUSE_MS_HTML_HELP && !wxUSE_TIPWINDOW + wxUnusedVar(window); +#endif // wxUSE_MS_HTML_HELP || wxUSE_TIPWINDOW + + return false; +} + +// ---------------------------------------------------------------------------- +// wxHelpControllerHelpProvider +// ---------------------------------------------------------------------------- + +wxHelpControllerHelpProvider::wxHelpControllerHelpProvider(wxHelpControllerBase* hc) +{ + m_helpController = hc; +} + +bool wxHelpControllerHelpProvider::ShowHelp(wxWindowBase *window) +{ + const wxString text = GetHelpTextMaybeAtPoint(window); + + if ( text.empty() ) + return false; + + if ( m_helpController ) + { + // if it's a numeric topic, show it + long topic; + if ( text.ToLong(&topic) ) + return m_helpController->DisplayContextPopup(topic); + + // otherwise show the text directly + if ( m_helpController->DisplayTextPopup(text, wxGetMousePosition()) ) + return true; + } + + // if there is no help controller or it's not capable of showing the help, + // fallback to the default method + return wxSimpleHelpProvider::ShowHelp(window); +} + +// Convenience function for turning context id into wxString +wxString wxContextId(int id) +{ + return wxString::Format(_T("%d"), id); +} + +// ---------------------------------------------------------------------------- +// wxHelpProviderModule: module responsible for cleaning up help provider. +// ---------------------------------------------------------------------------- + +class wxHelpProviderModule : public wxModule +{ +public: + bool OnInit(); + void OnExit(); + +private: + DECLARE_DYNAMIC_CLASS(wxHelpProviderModule) +}; + +IMPLEMENT_DYNAMIC_CLASS(wxHelpProviderModule, wxModule) + +bool wxHelpProviderModule::OnInit() +{ + // Probably we don't want to do anything by default, + // since it could pull in extra code + // wxHelpProvider::Set(new wxSimpleHelpProvider); + + return true; +} + +void wxHelpProviderModule::OnExit() +{ + if (wxHelpProvider::Get()) + { + delete wxHelpProvider::Get(); + wxHelpProvider::Set(NULL); + } +} + +#endif // wxUSE_HELP diff --git a/Externals/wxWidgets/src/common/ctrlcmn.cpp b/Externals/wxWidgets/src/common/ctrlcmn.cpp new file mode 100644 index 0000000000..a10e48160a --- /dev/null +++ b/Externals/wxWidgets/src/common/ctrlcmn.cpp @@ -0,0 +1,188 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/ctrlcmn.cpp +// Purpose: wxControl common interface +// Author: Vadim Zeitlin +// Modified by: +// Created: 26.07.99 +// RCS-ID: $Id: ctrlcmn.cpp 40329 2006-07-25 18:40:04Z VZ $ +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_CONTROLS + +#include "wx/control.h" + +#ifndef WX_PRECOMP + #include "wx/log.h" + #include "wx/radiobut.h" + #include "wx/statbmp.h" + #include "wx/bitmap.h" + #include "wx/utils.h" // for wxStripMenuCodes() +#endif + +const wxChar wxControlNameStr[] = wxT("control"); + +// ============================================================================ +// implementation +// ============================================================================ + +wxControlBase::~wxControlBase() +{ + // this destructor is required for Darwin +} + +bool wxControlBase::Create(wxWindow *parent, + wxWindowID id, + const wxPoint &pos, + const wxSize &size, + long style, + const wxValidator& wxVALIDATOR_PARAM(validator), + const wxString &name) +{ + bool ret = wxWindow::Create(parent, id, pos, size, style, name); + +#if wxUSE_VALIDATORS + if ( ret ) + SetValidator(validator); +#endif // wxUSE_VALIDATORS + + return ret; +} + +bool wxControlBase::CreateControl(wxWindowBase *parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + long style, + const wxValidator& validator, + const wxString& name) +{ + // even if it's possible to create controls without parents in some port, + // it should surely be discouraged because it doesn't work at all under + // Windows + wxCHECK_MSG( parent, false, wxT("all controls must have parents") ); + + if ( !CreateBase(parent, id, pos, size, style, validator, name) ) + return false; + + parent->AddChild(this); + + return true; +} + +/* static */ +wxString wxControlBase::GetLabelText(const wxString& label) +{ + // we don't want strip the TABs here, just the mnemonics + return wxStripMenuCodes(label, wxStrip_Mnemonics); +} + +void wxControlBase::Command(wxCommandEvent& event) +{ + (void)GetEventHandler()->ProcessEvent(event); +} + +void wxControlBase::InitCommandEvent(wxCommandEvent& event) const +{ + event.SetEventObject((wxControlBase *)this); // const_cast + + // event.SetId(GetId()); -- this is usuall done in the event ctor + + switch ( m_clientDataType ) + { + case wxClientData_Void: + event.SetClientData(GetClientData()); + break; + + case wxClientData_Object: + event.SetClientObject(GetClientObject()); + break; + + case wxClientData_None: + // nothing to do + ; + } +} + + +void wxControlBase::SetLabel( const wxString &label ) +{ + InvalidateBestSize(); + wxWindow::SetLabel(label); +} + +bool wxControlBase::SetFont(const wxFont& font) +{ + InvalidateBestSize(); + return wxWindow::SetFont(font); +} + +// wxControl-specific processing after processing the update event +void wxControlBase::DoUpdateWindowUI(wxUpdateUIEvent& event) +{ + // call inherited + wxWindowBase::DoUpdateWindowUI(event); + + // update label + if ( event.GetSetText() ) + { + if ( event.GetText() != GetLabel() ) + SetLabel(event.GetText()); + } + + // Unfortunately we don't yet have common base class for + // wxRadioButton, so we handle updates of radiobuttons here. + // TODO: If once wxRadioButtonBase will exist, move this code there. +#if wxUSE_RADIOBTN + if ( event.GetSetChecked() ) + { + wxRadioButton *radiobtn = wxDynamicCastThis(wxRadioButton); + if ( radiobtn ) + radiobtn->SetValue(event.GetChecked()); + } +#endif // wxUSE_RADIOBTN +} + +// ---------------------------------------------------------------------------- +// wxStaticBitmap +// ---------------------------------------------------------------------------- + +#if wxUSE_STATBMP + +wxStaticBitmapBase::~wxStaticBitmapBase() +{ + // this destructor is required for Darwin +} + +wxSize wxStaticBitmapBase::DoGetBestSize() const +{ + wxSize best; + wxBitmap bmp = GetBitmap(); + if ( bmp.Ok() ) + best = wxSize(bmp.GetWidth(), bmp.GetHeight()); + else + // this is completely arbitrary + best = wxSize(16, 16); + CacheBestSize(best); + return best; +} + +#endif // wxUSE_STATBMP + +#endif // wxUSE_CONTROLS diff --git a/Externals/wxWidgets/src/common/ctrlsub.cpp b/Externals/wxWidgets/src/common/ctrlsub.cpp new file mode 100644 index 0000000000..4a036d39b2 --- /dev/null +++ b/Externals/wxWidgets/src/common/ctrlsub.cpp @@ -0,0 +1,197 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/common/ctrlsub.cpp +// Purpose: wxItemContainer implementation +// Author: Vadim Zeitlin +// Modified by: +// Created: 22.10.99 +// RCS-ID: $Id: ctrlsub.cpp 39077 2006-05-06 19:05:50Z VZ $ +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_CONTROLS + +#ifndef WX_PRECOMP + #include "wx/ctrlsub.h" + #include "wx/arrstr.h" +#endif + +IMPLEMENT_ABSTRACT_CLASS(wxControlWithItems, wxControl) + +// ============================================================================ +// wxItemContainerImmutable implementation +// ============================================================================ + +wxItemContainerImmutable::~wxItemContainerImmutable() +{ + // this destructor is required for Darwin +} + +// ---------------------------------------------------------------------------- +// selection +// ---------------------------------------------------------------------------- + +wxString wxItemContainerImmutable::GetStringSelection() const +{ + wxString s; + + int sel = GetSelection(); + if ( sel != wxNOT_FOUND ) + s = GetString((unsigned int)sel); + + return s; +} + +bool wxItemContainerImmutable::SetStringSelection(const wxString& s) +{ + const int sel = FindString(s); + if ( sel == wxNOT_FOUND ) + return false; + + SetSelection(sel); + + return true; +} + +wxArrayString wxItemContainerImmutable::GetStrings() const +{ + wxArrayString result; + + const unsigned int count = GetCount(); + result.Alloc(count); + for ( unsigned int n = 0; n < count; n++ ) + result.Add(GetString(n)); + + return result; +} + +// ============================================================================ +// wxItemContainer implementation +// ============================================================================ + +wxItemContainer::~wxItemContainer() +{ + // this destructor is required for Darwin +} + +// ---------------------------------------------------------------------------- +// appending items +// ---------------------------------------------------------------------------- + +void wxItemContainer::Append(const wxArrayString& strings) +{ + const size_t count = strings.GetCount(); + for ( size_t n = 0; n < count; n++ ) + { + Append(strings[n]); + } +} + +int wxItemContainer::Insert(const wxString& item, unsigned int pos, void *clientData) +{ + int n = DoInsert(item, pos); + if ( n != wxNOT_FOUND ) + SetClientData(n, clientData); + + return n; +} + +int wxItemContainer::Insert(const wxString& item, unsigned int pos, wxClientData *clientData) +{ + int n = DoInsert(item, pos); + if ( n != wxNOT_FOUND ) + SetClientObject(n, clientData); + + return n; +} + +// ---------------------------------------------------------------------------- +// client data +// ---------------------------------------------------------------------------- + +void wxItemContainer::SetClientObject(unsigned int n, wxClientData *data) +{ + wxASSERT_MSG( m_clientDataItemsType != wxClientData_Void, + wxT("can't have both object and void client data") ); + + // when we call SetClientObject() for the first time, m_clientDataItemsType + // is still wxClientData_None and so calling DoGetItemClientObject() would + // fail (in addition to being useless) - don't do it + if ( m_clientDataItemsType == wxClientData_Object ) + { + wxClientData *clientDataOld = DoGetItemClientObject(n); + if ( clientDataOld ) + delete clientDataOld; + } + else // m_clientDataItemsType == wxClientData_None + { + // now we have object client data + m_clientDataItemsType = wxClientData_Object; + } + + DoSetItemClientObject(n, data); +} + +wxClientData *wxItemContainer::GetClientObject(unsigned int n) const +{ + wxASSERT_MSG( m_clientDataItemsType == wxClientData_Object, + wxT("this window doesn't have object client data") ); + + return DoGetItemClientObject(n); +} + +void wxItemContainer::SetClientData(unsigned int n, void *data) +{ + wxASSERT_MSG( m_clientDataItemsType != wxClientData_Object, + wxT("can't have both object and void client data") ); + + DoSetItemClientData(n, data); + m_clientDataItemsType = wxClientData_Void; +} + +void *wxItemContainer::GetClientData(unsigned int n) const +{ + wxASSERT_MSG( m_clientDataItemsType == wxClientData_Void, + wxT("this window doesn't have void client data") ); + + return DoGetItemClientData(n); +} + +// ============================================================================ +// wxControlWithItems implementation +// ============================================================================ + +void wxControlWithItems::InitCommandEventWithItems(wxCommandEvent& event, int n) +{ + InitCommandEvent(event); + + if ( n != wxNOT_FOUND ) + { + if ( HasClientObjectData() ) + event.SetClientObject(GetClientObject(n)); + else if ( HasClientUntypedData() ) + event.SetClientData(GetClientData(n)); + } +} + +wxControlWithItems::~wxControlWithItems() +{ + // this destructor is required for Darwin +} + +#endif // wxUSE_CONTROLS diff --git a/Externals/wxWidgets/src/common/datacmn.cpp b/Externals/wxWidgets/src/common/datacmn.cpp new file mode 100644 index 0000000000..55d665ca52 --- /dev/null +++ b/Externals/wxWidgets/src/common/datacmn.cpp @@ -0,0 +1,83 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: common/datacmn.cpp +// Purpose: contains definitions of various global wxWidgets variables +// Author: Vadim Zeitlin +// Modified by: +// Created: 10.04.03 (from src/*/data.cpp files) +// RCS-ID: $Id: datacmn.cpp 43874 2006-12-09 14:52:59Z VZ $ +// Copyright: (c) 1997-2002 wxWidgets development team +// License: wxWindows license +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#ifndef WX_PRECOMP +#endif // WX_PRECOMP + +#include "wx/accel.h" + +// ============================================================================ +// implementation +// ============================================================================ + +// 'Null' objects +#if wxUSE_ACCEL +wxAcceleratorTable wxNullAcceleratorTable; +#endif // wxUSE_ACCEL + +// Default window names +extern WXDLLEXPORT_DATA(const wxChar) wxButtonNameStr[] = wxT("button"); +extern WXDLLEXPORT_DATA(const wxChar) wxCheckBoxNameStr[] = wxT("check"); +extern WXDLLEXPORT_DATA(const wxChar) wxComboBoxNameStr[] = wxT("comboBox"); +extern WXDLLEXPORT_DATA(const wxChar) wxDialogNameStr[] = wxT("dialog"); +extern WXDLLEXPORT_DATA(const wxChar) wxFrameNameStr[] = wxT("frame"); +extern WXDLLEXPORT_DATA(const wxChar) wxStaticBoxNameStr[] = wxT("groupBox"); +extern WXDLLEXPORT_DATA(const wxChar) wxListBoxNameStr[] = wxT("listBox"); +extern WXDLLEXPORT_DATA(const wxChar) wxStaticLineNameStr[] = wxT("staticLine"); +extern WXDLLEXPORT_DATA(const wxChar) wxStaticTextNameStr[] = wxT("staticText"); +extern WXDLLEXPORT_DATA(const wxChar) wxStaticBitmapNameStr[] = wxT("staticBitmap"); +extern WXDLLEXPORT_DATA(const wxChar) wxNotebookNameStr[] = wxT("notebook"); +extern WXDLLEXPORT_DATA(const wxChar) wxPanelNameStr[] = wxT("panel"); +extern WXDLLEXPORT_DATA(const wxChar) wxRadioBoxNameStr[] = wxT("radioBox"); +extern WXDLLEXPORT_DATA(const wxChar) wxRadioButtonNameStr[] = wxT("radioButton"); +extern WXDLLEXPORT_DATA(const wxChar) wxBitmapRadioButtonNameStr[] = wxT("radioButton"); +extern WXDLLEXPORT_DATA(const wxChar) wxScrollBarNameStr[] = wxT("scrollBar"); +extern WXDLLEXPORT_DATA(const wxChar) wxSliderNameStr[] = wxT("slider"); +extern WXDLLEXPORT_DATA(const wxChar) wxStatusLineNameStr[] = wxT("status_line"); +extern WXDLLEXPORT_DATA(const wxChar) wxTextCtrlNameStr[] = wxT("text"); +extern WXDLLEXPORT_DATA(const wxChar) wxTreeCtrlNameStr[] = wxT("treeCtrl"); +extern WXDLLEXPORT_DATA(const wxChar) wxToolBarNameStr[] = wxT("toolbar"); + +// Default messages +extern WXDLLEXPORT_DATA(const wxChar) wxMessageBoxCaptionStr[] = wxT("Message"); +extern WXDLLEXPORT_DATA(const wxChar) wxFileSelectorPromptStr[] = wxT("Select a file"); +extern WXDLLEXPORT_DATA(const wxChar) wxDirSelectorPromptStr[] = wxT("Select a directory"); + +// Other default strings +extern WXDLLEXPORT_DATA(const wxChar) wxFileSelectorDefaultWildcardStr[] = +#if defined(__WXMSW__) || defined(__OS2__) + wxT("*.*") +#else // Unix/Mac + wxT("*") +#endif + ; +extern WXDLLEXPORT_DATA(const wxChar) wxDirDialogNameStr[] = wxT("wxDirCtrl"); +extern WXDLLEXPORT_DATA(const wxChar) wxDirDialogDefaultFolderStr[] = wxT("/"); + +extern WXDLLEXPORT_DATA(const wxChar) wxFileDialogNameStr[] = wxT("filedlg"); +#if defined(__WXMSW__) || defined(__OS2__) +WXDLLEXPORT_DATA(const wxChar *) wxUserResourceStr = wxT("TEXT"); +#endif diff --git a/Externals/wxWidgets/src/common/datavcmn.cpp b/Externals/wxWidgets/src/common/datavcmn.cpp new file mode 100644 index 0000000000..1af370d643 --- /dev/null +++ b/Externals/wxWidgets/src/common/datavcmn.cpp @@ -0,0 +1,911 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/datavcmn.cpp +// Purpose: wxDataViewCtrl base classes and common parts +// Author: Robert Roebling +// Created: 2006/02/20 +// RCS-ID: $Id: datavcmn.cpp 41670 2006-10-07 14:15:53Z RR $ +// Copyright: (c) 2006, Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_DATAVIEWCTRL + +#include "wx/dataview.h" + +#ifndef WX_PRECOMP + #include "wx/log.h" +#endif + +const wxChar wxDataViewCtrlNameStr[] = wxT("dataviewCtrl"); + +// --------------------------------------------------------- +// wxDataViewModel +// --------------------------------------------------------- + +IMPLEMENT_ABSTRACT_CLASS(wxDataViewModel, wxObject) + +// --------------------------------------------------------- +// wxDataViewListModel +// --------------------------------------------------------- + +IMPLEMENT_ABSTRACT_CLASS(wxDataViewListModel, wxDataViewModel) + +wxDataViewListModel::wxDataViewListModel() +{ + m_viewingColumns.DeleteContents( true ); + m_notifiers.DeleteContents( true ); +} + +wxDataViewListModel::~wxDataViewListModel() +{ +} + +bool wxDataViewListModel::RowAppended() +{ + bool ret = true; + + wxList::compatibility_iterator node = m_notifiers.GetFirst(); + while (node) + { + wxDataViewListModelNotifier* notifier = (wxDataViewListModelNotifier*) node->GetData(); + if (!notifier->RowAppended()) + ret = false; + node = node->GetNext(); + } + + return ret; +} + +bool wxDataViewListModel::RowPrepended() +{ + bool ret = true; + + wxList::compatibility_iterator node = m_notifiers.GetFirst(); + while (node) + { + wxDataViewListModelNotifier* notifier = (wxDataViewListModelNotifier*) node->GetData(); + if (!notifier->RowPrepended()) + ret = false; + node = node->GetNext(); + } + + return ret; +} + +bool wxDataViewListModel::RowInserted( unsigned int before ) +{ + bool ret = true; + + wxList::compatibility_iterator node = m_notifiers.GetFirst(); + while (node) + { + wxDataViewListModelNotifier* notifier = (wxDataViewListModelNotifier*) node->GetData(); + if (!notifier->RowInserted(before)) + ret = false; + node = node->GetNext(); + } + + return ret; +} + +bool wxDataViewListModel::RowDeleted( unsigned int row ) +{ + bool ret = true; + + wxList::compatibility_iterator node = m_notifiers.GetFirst(); + while (node) + { + wxDataViewListModelNotifier* notifier = (wxDataViewListModelNotifier*) node->GetData(); + if (!notifier->RowDeleted( row )) + ret = false; + node = node->GetNext(); + } + + return ret; +} + +bool wxDataViewListModel::RowChanged( unsigned int row ) +{ + bool ret = true; + + wxList::compatibility_iterator node = m_notifiers.GetFirst(); + while (node) + { + wxDataViewListModelNotifier* notifier = (wxDataViewListModelNotifier*) node->GetData(); + if (!notifier->RowChanged( row )) + ret = false; + node = node->GetNext(); + } + + return ret; +} + +bool wxDataViewListModel::ValueChanged( unsigned int col, unsigned int row ) +{ + bool ret = true; + + wxList::compatibility_iterator node = m_notifiers.GetFirst(); + while (node) + { + wxDataViewListModelNotifier* notifier = (wxDataViewListModelNotifier*) node->GetData(); + if (!notifier->ValueChanged( col, row )) + ret = false; + node = node->GetNext(); + } + + return ret; +} + +bool wxDataViewListModel::RowsReordered( unsigned int *new_order ) +{ + bool ret = true; + + wxList::compatibility_iterator node = m_notifiers.GetFirst(); + while (node) + { + wxDataViewListModelNotifier* notifier = (wxDataViewListModelNotifier*) node->GetData(); + if (!notifier->RowsReordered( new_order )) + ret = false; + node = node->GetNext(); + } + + return ret; +} + +bool wxDataViewListModel::Cleared() +{ + bool ret = true; + + wxList::compatibility_iterator node = m_notifiers.GetFirst(); + while (node) + { + wxDataViewListModelNotifier* notifier = (wxDataViewListModelNotifier*) node->GetData(); + if (!notifier->Cleared()) + ret = false; + node = node->GetNext(); + } + + return ret; +} + +void wxDataViewListModel::AddViewingColumn( wxDataViewColumn *view_column, unsigned int model_column ) +{ + m_viewingColumns.Append( new wxDataViewViewingColumn( view_column, model_column ) ); +} + +void wxDataViewListModel::RemoveViewingColumn( wxDataViewColumn *column ) +{ + wxList::compatibility_iterator node = m_viewingColumns.GetFirst(); + while (node) + { + wxDataViewViewingColumn* tmp = (wxDataViewViewingColumn*) node->GetData(); + + if (tmp->m_viewColumn == column) + { + m_viewingColumns.DeleteObject( tmp ); + return; + } + + node = node->GetNext(); + } +} + +void wxDataViewListModel::AddNotifier( wxDataViewListModelNotifier *notifier ) +{ + m_notifiers.Append( notifier ); + notifier->SetOwner( this ); +} + +void wxDataViewListModel::RemoveNotifier( wxDataViewListModelNotifier *notifier ) +{ + m_notifiers.DeleteObject( notifier ); +} + +// --------------------------------------------------------- +// wxDataViewSortedListModelNotifier +// --------------------------------------------------------- + +class wxDataViewSortedListModelNotifier: public wxDataViewListModelNotifier +{ +public: + wxDataViewSortedListModelNotifier( wxDataViewSortedListModel *model ) + { m_model = model; } + + virtual bool RowAppended() + { return m_model->ChildRowAppended(); } + + virtual bool RowPrepended() + { return m_model->ChildRowPrepended(); } + + virtual bool RowInserted( unsigned int before ) + { return m_model->ChildRowInserted( before ); } + + virtual bool RowDeleted( unsigned int row ) + { return m_model->ChildRowDeleted( row ); } + + virtual bool RowChanged( unsigned int row ) + { return m_model->ChildRowChanged( row ); } + + virtual bool ValueChanged( unsigned int col, unsigned int row ) + { return m_model->ChildValueChanged( col, row); } + + virtual bool RowsReordered( unsigned int *new_order ) + { return m_model->ChildRowsReordered( new_order ); } + + virtual bool Cleared() + { return m_model->ChildCleared(); } + + wxDataViewSortedListModel *m_model; +}; + +// --------------------------------------------------------- +// wxDataViewSortedListModel compare function +// --------------------------------------------------------- + +int wxCALLBACK wxDataViewListModelSortedDefaultCompare + (unsigned int row1, unsigned int row2, unsigned int col, wxDataViewListModel* model ) +{ + wxVariant value1,value2; + model->GetValue( value1, col, row1 ); + model->GetValue( value2, col, row2 ); + if (value1.GetType() == wxT("string")) + { + wxString str1 = value1.GetString(); + wxString str2 = value2.GetString(); + return str1.Cmp( str2 ); + } + if (value1.GetType() == wxT("long")) + { + long l1 = value1.GetLong(); + long l2 = value2.GetLong(); + return l1-l2; + } + if (value1.GetType() == wxT("double")) + { + double d1 = value1.GetDouble(); + double d2 = value2.GetDouble(); + if (d1 == d2) return 0; + if (d1 < d2) return 1; + return -1; + } + if (value1.GetType() == wxT("datetime")) + { + wxDateTime dt1 = value1.GetDateTime(); + wxDateTime dt2 = value2.GetDateTime(); + if (dt1.IsEqualTo(dt2)) return 0; + if (dt1.IsEarlierThan(dt2)) return 1; + return -1; + } + + return 0; +} + +int wxCALLBACK wxDataViewListModelSortedDefaultCompareDescending + (unsigned int row1, unsigned int row2, unsigned int col, wxDataViewListModel* model ) +{ + return wxDataViewListModelSortedDefaultCompare( row2, row1, col, model ); +} + +static wxDataViewListModelCompare s_CmpFunc; +static wxDataViewListModel *s_CmpModel; +static unsigned int s_CmpCol; + +int LINKAGEMODE wxDataViewIntermediateCmp( unsigned int row1, unsigned int row2 ) +{ + return s_CmpFunc( row1, row2, s_CmpCol, s_CmpModel ); +} + +// --------------------------------------------------------- +// wxDataViewSortedListModel +// --------------------------------------------------------- + +IMPLEMENT_ABSTRACT_CLASS(wxDataViewSortedListModel, wxDataViewListModel) + +wxDataViewSortedListModel::wxDataViewSortedListModel( wxDataViewListModel *child ) : + m_array( wxDataViewIntermediateCmp ) +{ + m_child = child; + + m_ascending = true; + + m_notifierOnChild = new wxDataViewSortedListModelNotifier( this ); + m_child->AddNotifier( m_notifierOnChild ); + + Resort(); +} + +wxDataViewSortedListModel::~wxDataViewSortedListModel() +{ + m_child->RemoveNotifier( m_notifierOnChild ); +} + +// FIXME +void wxDataViewSortedListModel::InitStatics() +{ + s_CmpCol = 0; + s_CmpModel = m_child; + if (m_ascending) + s_CmpFunc = wxDataViewListModelSortedDefaultCompare; + else + s_CmpFunc = wxDataViewListModelSortedDefaultCompareDescending; +} + +void wxDataViewSortedListModel::Resort() +{ + InitStatics(); + + m_array.Clear(); + unsigned int n = m_child->GetNumberOfRows(); + unsigned int i; + for (i = 0; i < n; i++) + m_array.Add( i ); +} + +#if 0 +static void Dump( wxDataViewListModel *model, unsigned int col ) +{ + unsigned int n = model->GetNumberOfRows(); + unsigned int i; + for (i = 0; i < n; i++) + { + wxVariant variant; + model->GetValue( variant, col, i ); + wxString tmp; + tmp = variant.GetString(); + wxPrintf( wxT("%d: %s\n"), (int) i, tmp.c_str() ); + } +} +#endif + +bool wxDataViewSortedListModel::ChildRowAppended() +{ + // no need to fix up array + + unsigned int len = m_array.GetCount(); + + unsigned int pos = m_array.Add( len ); + + if (pos == 0) + return wxDataViewListModel::RowPrepended(); + + if (pos == len) + return wxDataViewListModel::RowAppended(); + + return wxDataViewListModel::RowInserted( pos ); +} + +bool wxDataViewSortedListModel::ChildRowPrepended() +{ + // fix up array + unsigned int i; + unsigned int len = m_array.GetCount(); + for (i = 0; i < len; i++) + { + unsigned int value = m_array[i]; + m_array[i] = value+1; + } + + unsigned int pos = m_array.Add( 0 ); + + if (pos == 0) + return wxDataViewListModel::RowPrepended(); + + if (pos == len) + return wxDataViewListModel::RowAppended(); + + return wxDataViewListModel::RowInserted( pos ); +} + +bool wxDataViewSortedListModel::ChildRowInserted( unsigned int before ) +{ + // fix up array + unsigned int i; + unsigned int len = m_array.GetCount(); + for (i = 0; i < len; i++) + { + unsigned int value = m_array[i]; + if (value >= before) + m_array[i] = value+1; + } + + unsigned int pos = m_array.Add( before ); + + if (pos == 0) + return wxDataViewListModel::RowPrepended(); + + if (pos == len) + return wxDataViewListModel::RowAppended(); + + return wxDataViewListModel::RowInserted( pos ); +} + +bool wxDataViewSortedListModel::ChildRowDeleted( unsigned int row ) +{ + unsigned int i; + unsigned int len = m_array.GetCount(); + int pos = -1; + for (i = 0; i < len; i++) + { + unsigned int value = m_array[i]; + if (value == row) + { + // delete later + pos = (int) i; + } + else + { + // Fix up array + if (value > row) + m_array[i] = value-1; + } + } + + if (pos == -1) + return false; // we should probably assert + + // remove + m_array.RemoveAt( (unsigned int) pos ); + + return wxDataViewListModel::RowDeleted( (unsigned int) pos); +} + +bool wxDataViewSortedListModel::ChildRowChanged( unsigned int row ) +{ + unsigned int i; + unsigned int len = m_array.GetCount(); + + // Remove and readd sorted. Find out at which + // position it was and where it ended. + unsigned int start_pos = 0,end_pos = 0; + for (i = 0; i < len; i++) + if (m_array[i] == row) + { + start_pos = i; + break; + } + m_array.RemoveAt( start_pos ); + m_array.Add( row ); + + for (i = 0; i < len; i++) + if (m_array[i] == row) + { + end_pos = i; + break; + } + + if (end_pos == start_pos) + return wxDataViewListModel::RowChanged( start_pos ); + + // Create an array where order[old] -> new_pos, so that + // if nothing changed order[0] -> 0 etc. + unsigned int *order = new unsigned int[ len ]; + // Fill up initial values. + for (i = 0; i < len; i++) + order[i] = i; + + if (start_pos < end_pos) + { + for (i = start_pos; i < end_pos; i++) + order[i] = order[i+1]; + order[end_pos] = start_pos; + } + else + { + for (i = end_pos; i > start_pos; i--) + order[i] = order[i-1]; + order[start_pos] = end_pos; + } + + wxDataViewListModel::RowsReordered( order ); + + delete [] order; + + return true; +} + +bool wxDataViewSortedListModel::ChildValueChanged( unsigned int col, unsigned int row ) +{ + unsigned int i; + unsigned int len = m_array.GetCount(); + + // Remove and readd sorted. Find out at which + // position it was and where it ended. + unsigned int start_pos = 0,end_pos = 0; + for (i = 0; i < len; i++) + if (m_array[i] == row) + { + start_pos = i; + break; + } + m_array.RemoveAt( start_pos ); + m_array.Add( row ); + + for (i = 0; i < len; i++) + if (m_array[i] == row) + { + end_pos = i; + break; + } + + if (end_pos == start_pos) + return wxDataViewListModel::ValueChanged( col, start_pos ); + + // Create an array where order[old] -> new_pos, so that + // if nothing changed order[0] -> 0 etc. + unsigned int *order = new unsigned int[ len ]; + // Fill up initial values. + for (i = 0; i < len; i++) + order[i] = i; + + if (start_pos < end_pos) + { + for (i = start_pos; i < end_pos; i++) + order[i] = order[i+1]; + order[end_pos] = start_pos; + } + else + { + for (i = end_pos; i > start_pos; i--) + order[i] = order[i-1]; + order[start_pos] = end_pos; + } + + wxDataViewListModel::RowsReordered( order ); + + delete [] order; + + return true; +} + +bool wxDataViewSortedListModel::ChildRowsReordered( unsigned int *WXUNUSED(new_order) ) +{ + // Nothing needs to be done. If the sort criteria + // of this list don't change, the order of the + // items of the child list isn't relevant. + return true; +} + +bool wxDataViewSortedListModel::ChildCleared() +{ + return wxDataViewListModel::Cleared(); +} + +unsigned int wxDataViewSortedListModel::GetNumberOfRows() +{ + return m_array.GetCount(); +} + +unsigned int wxDataViewSortedListModel::GetNumberOfCols() +{ + return m_child->GetNumberOfCols(); +} + +wxString wxDataViewSortedListModel::GetColType( unsigned int col ) +{ + return m_child->GetColType( col ); +} + +void wxDataViewSortedListModel::GetValue( wxVariant &variant, unsigned int col, unsigned int row ) +{ + unsigned int child_row = m_array[row]; + m_child->GetValue( variant, col, child_row ); +} + +bool wxDataViewSortedListModel::SetValue( wxVariant &variant, unsigned int col, unsigned int row ) +{ + unsigned int child_row = m_array[row]; + bool ret = m_child->SetValue( variant, col, child_row ); + + // Do nothing here as the change in the + // child model will be reported back. + + return ret; +} + +bool wxDataViewSortedListModel::RowAppended() +{ + // you can only append + bool ret = m_child->RowAppended(); + + // Do nothing here as the change in the + // child model will be reported back. + + return ret; +} + +bool wxDataViewSortedListModel::RowPrepended() +{ + // you can only append + bool ret = m_child->RowAppended(); + + // Do nothing here as the change in the + // child model will be reported back. + + return ret; +} + +bool wxDataViewSortedListModel::RowInserted( unsigned int WXUNUSED(before) ) +{ + // you can only append + bool ret = m_child->RowAppended(); + + // Do nothing here as the change in the + // child model will be reported back. + + return ret; +} + +bool wxDataViewSortedListModel::RowDeleted( unsigned int row ) +{ + unsigned int child_row = m_array[row]; + + bool ret = m_child->RowDeleted( child_row ); + + // Do nothing here as the change in the + // child model will be reported back. + + return ret; +} + +bool wxDataViewSortedListModel::RowChanged( unsigned int row ) +{ + unsigned int child_row = m_array[row]; + bool ret = m_child->RowChanged( child_row ); + + // Do nothing here as the change in the + // child model will be reported back. + + return ret; +} + +bool wxDataViewSortedListModel::ValueChanged( unsigned int col, unsigned int row ) +{ + unsigned int child_row = m_array[row]; + bool ret = m_child->ValueChanged( col, child_row ); + + // Do nothing here as the change in the + // child model will be reported back. + + return ret; +} + +bool wxDataViewSortedListModel::RowsReordered( unsigned int *WXUNUSED(new_order) ) +{ + // We sort them ourselves. + + return false; +} + +bool wxDataViewSortedListModel::Cleared() +{ + bool ret = m_child->Cleared(); + + // Do nothing here as the change in the + // child model will be reported back. + + return ret; +} + +// --------------------------------------------------------- +// wxDataViewRendererBase +// --------------------------------------------------------- + +IMPLEMENT_ABSTRACT_CLASS(wxDataViewRendererBase, wxObject) + +wxDataViewRendererBase::wxDataViewRendererBase( const wxString &varianttype, wxDataViewCellMode mode ) +{ + m_variantType = varianttype; + m_mode = mode; +} + +// --------------------------------------------------------- +// wxDataViewColumnBase +// --------------------------------------------------------- + +IMPLEMENT_ABSTRACT_CLASS(wxDataViewColumnBase, wxObject) + +wxDataViewColumnBase::wxDataViewColumnBase(const wxString& title, + wxDataViewRenderer *renderer, + unsigned int model_column, + int WXUNUSED(width), + int flags ) +{ + m_renderer = renderer; + m_model_column = model_column; + m_flags = flags; + m_title = title; + m_owner = NULL; + m_renderer->SetOwner( (wxDataViewColumn*) this ); +} + +wxDataViewColumnBase::wxDataViewColumnBase(const wxBitmap& bitmap, + wxDataViewRenderer *renderer, + unsigned int model_column, + int WXUNUSED(width), + int flags ) +{ + m_renderer = renderer; + m_model_column = model_column; + m_flags = flags; + m_bitmap = bitmap; + m_owner = NULL; + m_renderer->SetOwner( (wxDataViewColumn*) this ); +} + +wxDataViewColumnBase::~wxDataViewColumnBase() +{ + if (m_renderer) + delete m_renderer; + + if (GetOwner()) + { + GetOwner()->GetModel()->RemoveViewingColumn( (wxDataViewColumn*) this ); + } +} + +void wxDataViewColumnBase::SetTitle( const wxString &title ) +{ + m_title = title; +} + +wxString wxDataViewColumnBase::GetTitle() +{ + return m_title; +} + +void wxDataViewColumnBase::SetBitmap( const wxBitmap &bitmap ) +{ + m_bitmap = bitmap; +} + +const wxBitmap &wxDataViewColumnBase::GetBitmap() +{ + return m_bitmap; +} + +// --------------------------------------------------------- +// wxDataViewCtrlBase +// --------------------------------------------------------- + +IMPLEMENT_ABSTRACT_CLASS(wxDataViewCtrlBase, wxControl) + +wxDataViewCtrlBase::wxDataViewCtrlBase() +{ + m_model = NULL; + m_cols.DeleteContents( true ); +} + +wxDataViewCtrlBase::~wxDataViewCtrlBase() +{ +} + +bool wxDataViewCtrlBase::AssociateModel( wxDataViewListModel *model ) +{ + m_model = model; + + return true; +} + +wxDataViewListModel* wxDataViewCtrlBase::GetModel() +{ + return m_model; +} + +bool wxDataViewCtrlBase::AppendTextColumn( const wxString &label, unsigned int model_column, + wxDataViewCellMode mode, int width ) +{ + return AppendColumn( new wxDataViewColumn( label, + new wxDataViewTextRenderer( wxT("string"), mode ), model_column, width ) ); +} + +bool wxDataViewCtrlBase::AppendToggleColumn( const wxString &label, unsigned int model_column, + wxDataViewCellMode mode, int width ) +{ + return AppendColumn( new wxDataViewColumn( label, + new wxDataViewToggleRenderer( wxT("bool"), mode ), model_column, width ) ); +} + +bool wxDataViewCtrlBase::AppendProgressColumn( const wxString &label, unsigned int model_column, + wxDataViewCellMode mode, int width ) +{ + return AppendColumn( new wxDataViewColumn( label, + new wxDataViewProgressRenderer( wxEmptyString, wxT("long"), mode ), model_column, width ) ); +} + +bool wxDataViewCtrlBase::AppendDateColumn( const wxString &label, unsigned int model_column, + wxDataViewCellMode mode, int width ) +{ + return AppendColumn( new wxDataViewColumn( label, + new wxDataViewDateRenderer( wxT("datetime"), mode), model_column, width ) ); +} + +bool wxDataViewCtrlBase::AppendBitmapColumn( const wxString &label, unsigned int model_column, + wxDataViewCellMode mode, int width ) +{ + return AppendColumn( new wxDataViewColumn( label, + new wxDataViewBitmapRenderer( wxT("wxBitmap"), mode ), model_column, width ) ); +} + +bool wxDataViewCtrlBase::AppendTextColumn( const wxBitmap &label, unsigned int model_column, + wxDataViewCellMode mode, int width ) +{ + return AppendColumn( new wxDataViewColumn( label, + new wxDataViewTextRenderer( wxT("string"), mode ), model_column, width ) ); +} + +bool wxDataViewCtrlBase::AppendToggleColumn( const wxBitmap &label, unsigned int model_column, + wxDataViewCellMode mode, int width ) +{ + return AppendColumn( new wxDataViewColumn( label, + new wxDataViewToggleRenderer( wxT("bool"), mode ), model_column, width ) ); +} + +bool wxDataViewCtrlBase::AppendProgressColumn( const wxBitmap &label, unsigned int model_column, + wxDataViewCellMode mode, int width ) +{ + return AppendColumn( new wxDataViewColumn( label, + new wxDataViewProgressRenderer( wxEmptyString, wxT("long"), mode ), model_column, width ) ); +} + +bool wxDataViewCtrlBase::AppendDateColumn( const wxBitmap &label, unsigned int model_column, + wxDataViewCellMode mode, int width ) +{ + return AppendColumn( new wxDataViewColumn( label, + new wxDataViewDateRenderer( wxT("datetime"), mode ), model_column, width ) ); +} + +bool wxDataViewCtrlBase::AppendBitmapColumn( const wxBitmap &label, unsigned int model_column, + wxDataViewCellMode mode, int width ) +{ + return AppendColumn( new wxDataViewColumn( label, + new wxDataViewBitmapRenderer( wxT("wxBitmap"), mode ), model_column, width ) ); +} + +bool wxDataViewCtrlBase::AppendColumn( wxDataViewColumn *col ) +{ + m_cols.Append( (wxObject*) col ); + col->SetOwner( (wxDataViewCtrl*) this ); + m_model->AddViewingColumn( col, col->GetModelColumn() ); + return true; +} + +unsigned int wxDataViewCtrlBase::GetNumberOfColumns() +{ + return m_cols.GetCount(); +} + +bool wxDataViewCtrlBase::DeleteColumn( unsigned int WXUNUSED(pos) ) +{ + return false; +} + +bool wxDataViewCtrlBase::ClearColumns() +{ + return false; +} + +wxDataViewColumn* wxDataViewCtrlBase::GetColumn( unsigned int pos ) +{ + return (wxDataViewColumn*) m_cols[ pos ]; +} + +// --------------------------------------------------------- +// wxDataViewEvent +// --------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxDataViewEvent,wxNotifyEvent) + +DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_ROW_SELECTED) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_ROW_ACTIVATED) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_CLICK) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK) + + +#endif diff --git a/Externals/wxWidgets/src/common/datetime.cpp b/Externals/wxWidgets/src/common/datetime.cpp new file mode 100644 index 0000000000..3e29c7c94c --- /dev/null +++ b/Externals/wxWidgets/src/common/datetime.cpp @@ -0,0 +1,4627 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/common/datetime.cpp +// Purpose: implementation of time/date related classes +// Author: Vadim Zeitlin +// Modified by: +// Created: 11.05.99 +// RCS-ID: $Id: datetime.cpp 49000 2007-09-30 20:37:29Z VZ $ +// Copyright: (c) 1999 Vadim Zeitlin +// parts of code taken from sndcal library by Scott E. Lee: +// +// Copyright 1993-1995, Scott E. Lee, all rights reserved. +// Permission granted to use, copy, modify, distribute and sell +// so long as the above copyright and this permission statement +// are retained in all copies. +// +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +/* + * Implementation notes: + * + * 1. the time is stored as a 64bit integer containing the signed number of + * milliseconds since Jan 1. 1970 (the Unix Epoch) - so it is always + * expressed in GMT. + * + * 2. the range is thus something about 580 million years, but due to current + * algorithms limitations, only dates from Nov 24, 4714BC are handled + * + * 3. standard ANSI C functions are used to do time calculations whenever + * possible, i.e. when the date is in the range Jan 1, 1970 to 2038 + * + * 4. otherwise, the calculations are done by converting the date to/from JDN + * first (the range limitation mentioned above comes from here: the + * algorithm used by Scott E. Lee's code only works for positive JDNs, more + * or less) + * + * 5. the object constructed for the given DD-MM-YYYY HH:MM:SS corresponds to + * this moment in local time and may be converted to the object + * corresponding to the same date/time in another time zone by using + * ToTimezone() + * + * 6. the conversions to the current (or any other) timezone are done when the + * internal time representation is converted to the broken-down one in + * wxDateTime::Tm. + */ + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if !defined(wxUSE_DATETIME) || wxUSE_DATETIME + +#ifndef WX_PRECOMP + #ifdef __WXMSW__ + #include "wx/msw/wrapwin.h" + #endif + #include "wx/string.h" + #include "wx/log.h" + #include "wx/intl.h" + #include "wx/stopwatch.h" // for wxGetLocalTimeMillis() + #include "wx/module.h" +#endif // WX_PRECOMP + +#include "wx/thread.h" +#include "wx/tokenzr.h" + +#include + +#ifdef __WINDOWS__ + #include + #ifndef __WXWINCE__ + #include + #endif +#endif + +#include "wx/datetime.h" + +const long wxDateTime::TIME_T_FACTOR = 1000l; + +#if wxUSE_EXTENDED_RTTI + +template<> void wxStringReadValue(const wxString &s , wxDateTime &data ) +{ + data.ParseFormat(s,wxT("%Y-%m-%d %H:%M:%S")) ; +} + +template<> void wxStringWriteValue(wxString &s , const wxDateTime &data ) +{ + s = data.Format(wxT("%Y-%m-%d %H:%M:%S")) ; +} + +wxCUSTOM_TYPE_INFO(wxDateTime, wxToStringConverter , wxFromStringConverter) + +#endif + +// +// ---------------------------------------------------------------------------- +// conditional compilation +// ---------------------------------------------------------------------------- + +#if defined(HAVE_STRPTIME) && defined(__GLIBC__) && \ + ((__GLIBC__ == 2) && (__GLIBC_MINOR__ == 0)) + // glibc 2.0.7 strptime() is broken - the following snippet causes it to + // crash (instead of just failing): + // + // strncpy(buf, "Tue Dec 21 20:25:40 1999", 128); + // strptime(buf, "%x", &tm); + // + // so don't use it + #undef HAVE_STRPTIME +#endif // broken strptime() + +#if defined(HAVE_STRPTIME) && defined(__DARWIN__) && defined(_MSL_USING_MW_C_HEADERS) && _MSL_USING_MW_C_HEADERS + // configure detects strptime as linkable because it's in the OS X + // System library but MSL headers don't declare it. + +// char *strptime(const char *, const char *, struct tm *); + // However, we DON'T want to just provide it here because we would + // crash and/or overwrite data when strptime from OS X tries + // to fill in MW's struct tm which is two fields shorter (no TZ stuff) + // So for now let's just say we don't have strptime + #undef HAVE_STRPTIME +#endif + +#if defined(__MWERKS__) && wxUSE_UNICODE + #include +#endif + +// define a special symbol for VC8 instead of writing tests for 1400 repeatedly +#ifdef __VISUALC__ + #if __VISUALC__ >= 1400 + #define __VISUALC8__ + #endif +#endif + +#if !defined(WX_TIMEZONE) && !defined(WX_GMTOFF_IN_TM) + #if defined(__WXPALMOS__) + #define WX_GMTOFF_IN_TM + #elif defined(__BORLANDC__) || defined(__MINGW32__) || defined(__VISAGECPP__) + #define WX_TIMEZONE _timezone + #elif defined(__MWERKS__) + long wxmw_timezone = 28800; + #define WX_TIMEZONE wxmw_timezone + #elif defined(__DJGPP__) || defined(__WINE__) + #include + #include + static long wxGetTimeZone() + { + static long timezone = MAXLONG; // invalid timezone + if (timezone == MAXLONG) + { + struct timeb tb; + ftime(&tb); + timezone = tb.timezone; + } + return timezone; + } + #define WX_TIMEZONE wxGetTimeZone() + #elif defined(__DARWIN__) + #define WX_GMTOFF_IN_TM + #elif defined(__WXWINCE__) && defined(__VISUALC8__) + // _timezone is not present in dynamic run-time library + #if 0 + // Solution (1): use the function equivalent of _timezone + static long wxGetTimeZone() + { + static long s_Timezone = MAXLONG; // invalid timezone + if (s_Timezone == MAXLONG) + { + int t; + _get_timezone(& t); + s_Timezone = (long) t; + } + return s_Timezone; + } + #define WX_TIMEZONE wxGetTimeZone() + #elif 1 + // Solution (2): using GetTimeZoneInformation + static long wxGetTimeZone() + { + static long timezone = MAXLONG; // invalid timezone + if (timezone == MAXLONG) + { + TIME_ZONE_INFORMATION tzi; + ::GetTimeZoneInformation(&tzi); + timezone = tzi.Bias; + } + return timezone; + } + #define WX_TIMEZONE wxGetTimeZone() + #endif + #else // unknown platform - try timezone + #define WX_TIMEZONE timezone + #endif +#endif // !WX_TIMEZONE && !WX_GMTOFF_IN_TM + +// everyone has strftime except Win CE unless VC8 is used +#if !defined(__WXWINCE__) || defined(__VISUALC8__) + #define HAVE_STRFTIME +#endif + +// NB: VC8 safe time functions could/should be used for wxMSW as well probably +#if defined(__WXWINCE__) && defined(__VISUALC8__) + +struct tm *wxLocaltime_r(const time_t *t, struct tm* tm) +{ + __time64_t t64 = *t; + return _localtime64_s(tm, &t64) == 0 ? tm : NULL; +} + +struct tm *wxGmtime_r(const time_t* t, struct tm* tm) +{ + __time64_t t64 = *t; + return _gmtime64_s(tm, &t64) == 0 ? tm : NULL; +} + +#else // !wxWinCE with VC8 + +#if (!defined(HAVE_LOCALTIME_R) || !defined(HAVE_GMTIME_R)) && wxUSE_THREADS && !defined(__WINDOWS__) +static wxMutex timeLock; +#endif + +#ifndef HAVE_LOCALTIME_R +struct tm *wxLocaltime_r(const time_t* ticks, struct tm* temp) +{ +#if wxUSE_THREADS && !defined(__WINDOWS__) + // No need to waste time with a mutex on windows since it's using + // thread local storage for localtime anyway. + wxMutexLocker locker(timeLock); +#endif + + // Borland CRT crashes when passed 0 ticks for some reason, see SF bug 1704438 +#ifdef __BORLANDC__ + if ( !*ticks ) + return NULL; +#endif + + const tm * const t = localtime(ticks); + if ( !t ) + return NULL; + + memcpy(temp, t, sizeof(struct tm)); + return temp; +} +#endif // !HAVE_LOCALTIME_R + +#ifndef HAVE_GMTIME_R +struct tm *wxGmtime_r(const time_t* ticks, struct tm* temp) +{ +#if wxUSE_THREADS && !defined(__WINDOWS__) + // No need to waste time with a mutex on windows since it's + // using thread local storage for gmtime anyway. + wxMutexLocker locker(timeLock); +#endif + +#ifdef __BORLANDC__ + if ( !*ticks ) + return NULL; +#endif + + const tm * const t = gmtime(ticks); + if ( !t ) + return NULL; + + memcpy(temp, gmtime(ticks), sizeof(struct tm)); + return temp; +} +#endif // !HAVE_GMTIME_R + +#endif // wxWinCE with VC8/other platforms + +// ---------------------------------------------------------------------------- +// macros +// ---------------------------------------------------------------------------- + +// debugging helper: just a convenient replacement of wxCHECK() +#define wxDATETIME_CHECK(expr, msg) \ + wxCHECK2_MSG(expr, *this = wxInvalidDateTime; return *this, msg) + +// ---------------------------------------------------------------------------- +// private classes +// ---------------------------------------------------------------------------- + +class wxDateTimeHolidaysModule : public wxModule +{ +public: + virtual bool OnInit() + { + wxDateTimeHolidayAuthority::AddAuthority(new wxDateTimeWorkDays); + + return true; + } + + virtual void OnExit() + { + wxDateTimeHolidayAuthority::ClearAllAuthorities(); + wxDateTimeHolidayAuthority::ms_authorities.clear(); + } + +private: + DECLARE_DYNAMIC_CLASS(wxDateTimeHolidaysModule) +}; + +IMPLEMENT_DYNAMIC_CLASS(wxDateTimeHolidaysModule, wxModule) + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// some trivial ones +static const int MONTHS_IN_YEAR = 12; + +static const int SEC_PER_MIN = 60; + +static const int MIN_PER_HOUR = 60; + +static const int HOURS_PER_DAY = 24; + +static const long SECONDS_PER_DAY = 86400l; + +static const int DAYS_PER_WEEK = 7; + +static const long MILLISECONDS_PER_DAY = 86400000l; + +// this is the integral part of JDN of the midnight of Jan 1, 1970 +// (i.e. JDN(Jan 1, 1970) = 2440587.5) +static const long EPOCH_JDN = 2440587l; + +// used only in asserts +#ifdef __WXDEBUG__ +// the date of JDN -0.5 (as we don't work with fractional parts, this is the +// reference date for us) is Nov 24, 4714BC +static const int JDN_0_YEAR = -4713; +static const int JDN_0_MONTH = wxDateTime::Nov; +static const int JDN_0_DAY = 24; +#endif // __WXDEBUG__ + +// the constants used for JDN calculations +static const long JDN_OFFSET = 32046l; +static const long DAYS_PER_5_MONTHS = 153l; +static const long DAYS_PER_4_YEARS = 1461l; +static const long DAYS_PER_400_YEARS = 146097l; + +// this array contains the cumulated number of days in all previous months for +// normal and leap years +static const wxDateTime::wxDateTime_t gs_cumulatedDays[2][MONTHS_IN_YEAR] = +{ + { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 }, + { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 } +}; + +// ---------------------------------------------------------------------------- +// global data +// ---------------------------------------------------------------------------- + +const wxChar * wxDefaultDateTimeFormat = wxT("%c"); +const wxChar * wxDefaultTimeSpanFormat = wxT("%H:%M:%S"); + +// in the fine tradition of ANSI C we use our equivalent of (time_t)-1 to +// indicate an invalid wxDateTime object +const wxDateTime wxDefaultDateTime; + +wxDateTime::Country wxDateTime::ms_country = wxDateTime::Country_Unknown; + +// ---------------------------------------------------------------------------- +// private functions +// ---------------------------------------------------------------------------- + +// debugger helper: shows what the date really is +#ifdef __WXDEBUG__ +extern const wxChar *wxDumpDate(const wxDateTime* dt) +{ + static wxChar buf[128]; + + wxStrcpy(buf, dt->Format(_T("%Y-%m-%d (%a) %H:%M:%S"))); + + return buf; +} +#endif // Debug + +// get the number of days in the given month of the given year +static inline +wxDateTime::wxDateTime_t GetNumOfDaysInMonth(int year, wxDateTime::Month month) +{ + // the number of days in month in Julian/Gregorian calendar: the first line + // is for normal years, the second one is for the leap ones + static wxDateTime::wxDateTime_t daysInMonth[2][MONTHS_IN_YEAR] = + { + { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }, + { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 } + }; + + return daysInMonth[wxDateTime::IsLeapYear(year)][month]; +} + +// returns the time zone in the C sense, i.e. the difference UTC - local +// (in seconds) +static int GetTimeZone() +{ + // set to true when the timezone is set + static bool s_timezoneSet = false; + static long gmtoffset = LONG_MAX; // invalid timezone + + // ensure that the timezone variable is set by calling wxLocaltime_r + if ( !s_timezoneSet ) + { + // just call wxLocaltime_r() instead of figuring out whether this + // system supports tzset(), _tzset() or something else + time_t t = 0; + struct tm tm; + + wxLocaltime_r(&t, &tm); + s_timezoneSet = true; + +#ifdef WX_GMTOFF_IN_TM + // note that GMT offset is the opposite of time zone and so to return + // consistent results in both WX_GMTOFF_IN_TM and !WX_GMTOFF_IN_TM + // cases we have to negate it + gmtoffset = -tm.tm_gmtoff; +#else // !WX_GMTOFF_IN_TM + gmtoffset = WX_TIMEZONE; +#endif // WX_GMTOFF_IN_TM/!WX_GMTOFF_IN_TM + } + + return (int)gmtoffset; +} + +// return the integral part of the JDN for the midnight of the given date (to +// get the real JDN you need to add 0.5, this is, in fact, JDN of the +// noon of the previous day) +static long GetTruncatedJDN(wxDateTime::wxDateTime_t day, + wxDateTime::Month mon, + int year) +{ + // CREDIT: code below is by Scott E. Lee (but bugs are mine) + + // check the date validity + wxASSERT_MSG( + (year > JDN_0_YEAR) || + ((year == JDN_0_YEAR) && (mon > JDN_0_MONTH)) || + ((year == JDN_0_YEAR) && (mon == JDN_0_MONTH) && (day >= JDN_0_DAY)), + _T("date out of range - can't convert to JDN") + ); + + // make the year positive to avoid problems with negative numbers division + year += 4800; + + // months are counted from March here + int month; + if ( mon >= wxDateTime::Mar ) + { + month = mon - 2; + } + else + { + month = mon + 10; + year--; + } + + // now we can simply add all the contributions together + return ((year / 100) * DAYS_PER_400_YEARS) / 4 + + ((year % 100) * DAYS_PER_4_YEARS) / 4 + + (month * DAYS_PER_5_MONTHS + 2) / 5 + + day + - JDN_OFFSET; +} + +#ifdef HAVE_STRFTIME + +// this function is a wrapper around strftime(3) adding error checking +static wxString CallStrftime(const wxChar *format, const tm* tm) +{ + wxChar buf[4096]; + // Create temp wxString here to work around mingw/cygwin bug 1046059 + // http://sourceforge.net/tracker/?func=detail&atid=102435&aid=1046059&group_id=2435 + wxString s; + + if ( !wxStrftime(buf, WXSIZEOF(buf), format, tm) ) + { + // buffer is too small? + wxFAIL_MSG(_T("strftime() failed")); + } + + s = buf; + return s; +} + +#endif // HAVE_STRFTIME + +#ifdef HAVE_STRPTIME + +#if wxUSE_UNIX && !defined(HAVE_STRPTIME_DECL) + // configure detected that we had strptime() but not its declaration, + // provide it ourselves + extern "C" char *strptime(const char *, const char *, struct tm *); +#endif + +// Unicode-friendly strptime() wrapper +static const wxChar * +CallStrptime(const wxChar *input, const char *fmt, tm *tm) +{ + // the problem here is that strptime() returns pointer into the string we + // passed to it while we're really interested in the pointer into the + // original, Unicode, string so we try to transform the pointer back +#if wxUSE_UNICODE + wxCharBuffer inputMB(wxConvertWX2MB(input)); +#else // ASCII + const char * const inputMB = input; +#endif // Unicode/Ascii + + const char *result = strptime(inputMB, fmt, tm); + if ( !result ) + return NULL; + +#if wxUSE_UNICODE + // FIXME: this is wrong in presence of surrogates &c + return input + (result - inputMB.data()); +#else // ASCII + return result; +#endif // Unicode/Ascii +} + +#endif // HAVE_STRPTIME + +// if year and/or month have invalid values, replace them with the current ones +static void ReplaceDefaultYearMonthWithCurrent(int *year, + wxDateTime::Month *month) +{ + struct tm *tmNow = NULL; + struct tm tmstruct; + + if ( *year == wxDateTime::Inv_Year ) + { + tmNow = wxDateTime::GetTmNow(&tmstruct); + + *year = 1900 + tmNow->tm_year; + } + + if ( *month == wxDateTime::Inv_Month ) + { + if ( !tmNow ) + tmNow = wxDateTime::GetTmNow(&tmstruct); + + *month = (wxDateTime::Month)tmNow->tm_mon; + } +} + +// fll the struct tm with default values +static void InitTm(struct tm& tm) +{ + // struct tm may have etxra fields (undocumented and with unportable + // names) which, nevertheless, must be set to 0 + memset(&tm, 0, sizeof(struct tm)); + + tm.tm_mday = 1; // mday 0 is invalid + tm.tm_year = 76; // any valid year + tm.tm_isdst = -1; // auto determine +} + +// parsing helpers +// --------------- + +// return the month if the string is a month name or Inv_Month otherwise +static wxDateTime::Month GetMonthFromName(const wxString& name, int flags) +{ + wxDateTime::Month mon; + for ( mon = wxDateTime::Jan; mon < wxDateTime::Inv_Month; wxNextMonth(mon) ) + { + // case-insensitive comparison either one of or with both abbreviated + // and not versions + if ( flags & wxDateTime::Name_Full ) + { + if ( name.CmpNoCase(wxDateTime:: + GetMonthName(mon, wxDateTime::Name_Full)) == 0 ) + { + break; + } + } + + if ( flags & wxDateTime::Name_Abbr ) + { + if ( name.CmpNoCase(wxDateTime:: + GetMonthName(mon, wxDateTime::Name_Abbr)) == 0 ) + { + break; + } + } + } + + return mon; +} + +// return the weekday if the string is a weekday name or Inv_WeekDay otherwise +static wxDateTime::WeekDay GetWeekDayFromName(const wxString& name, int flags) +{ + wxDateTime::WeekDay wd; + for ( wd = wxDateTime::Sun; wd < wxDateTime::Inv_WeekDay; wxNextWDay(wd) ) + { + // case-insensitive comparison either one of or with both abbreviated + // and not versions + if ( flags & wxDateTime::Name_Full ) + { + if ( name.CmpNoCase(wxDateTime:: + GetWeekDayName(wd, wxDateTime::Name_Full)) == 0 ) + { + break; + } + } + + if ( flags & wxDateTime::Name_Abbr ) + { + if ( name.CmpNoCase(wxDateTime:: + GetWeekDayName(wd, wxDateTime::Name_Abbr)) == 0 ) + { + break; + } + } + } + + return wd; +} + +/* static */ +struct tm *wxDateTime::GetTmNow(struct tm *tmstruct) +{ + time_t t = GetTimeNow(); + return wxLocaltime_r(&t, tmstruct); +} + +// scans all digits (but no more than len) and returns the resulting number +static bool GetNumericToken(size_t len, const wxChar*& p, unsigned long *number) +{ + size_t n = 1; + wxString s; + while ( wxIsdigit(*p) ) + { + s += *p++; + + if ( len && ++n > len ) + break; + } + + return !s.empty() && s.ToULong(number); +} + +// scans all alphabetic characters and returns the resulting string +static wxString GetAlphaToken(const wxChar*& p) +{ + wxString s; + while ( wxIsalpha(*p) ) + { + s += *p++; + } + + return s; +} + +// ============================================================================ +// implementation of wxDateTime +// ============================================================================ + +// ---------------------------------------------------------------------------- +// struct Tm +// ---------------------------------------------------------------------------- + +wxDateTime::Tm::Tm() +{ + year = (wxDateTime_t)wxDateTime::Inv_Year; + mon = wxDateTime::Inv_Month; + mday = 0; + hour = min = sec = msec = 0; + wday = wxDateTime::Inv_WeekDay; +} + +wxDateTime::Tm::Tm(const struct tm& tm, const TimeZone& tz) + : m_tz(tz) +{ + msec = 0; + sec = (wxDateTime::wxDateTime_t)tm.tm_sec; + min = (wxDateTime::wxDateTime_t)tm.tm_min; + hour = (wxDateTime::wxDateTime_t)tm.tm_hour; + mday = (wxDateTime::wxDateTime_t)tm.tm_mday; + mon = (wxDateTime::Month)tm.tm_mon; + year = 1900 + tm.tm_year; + wday = (wxDateTime::wxDateTime_t)tm.tm_wday; + yday = (wxDateTime::wxDateTime_t)tm.tm_yday; +} + +bool wxDateTime::Tm::IsValid() const +{ + // we allow for the leap seconds, although we don't use them (yet) + return (year != wxDateTime::Inv_Year) && (mon != wxDateTime::Inv_Month) && + (mday <= GetNumOfDaysInMonth(year, mon)) && + (hour < 24) && (min < 60) && (sec < 62) && (msec < 1000); +} + +void wxDateTime::Tm::ComputeWeekDay() +{ + // compute the week day from day/month/year: we use the dumbest algorithm + // possible: just compute our JDN and then use the (simple to derive) + // formula: weekday = (JDN + 1.5) % 7 + wday = (wxDateTime::wxDateTime_t)((GetTruncatedJDN(mday, mon, year) + 2) % 7); +} + +void wxDateTime::Tm::AddMonths(int monDiff) +{ + // normalize the months field + while ( monDiff < -mon ) + { + year--; + + monDiff += MONTHS_IN_YEAR; + } + + while ( monDiff + mon >= MONTHS_IN_YEAR ) + { + year++; + + monDiff -= MONTHS_IN_YEAR; + } + + mon = (wxDateTime::Month)(mon + monDiff); + + wxASSERT_MSG( mon >= 0 && mon < MONTHS_IN_YEAR, _T("logic error") ); + + // NB: we don't check here that the resulting date is valid, this function + // is private and the caller must check it if needed +} + +void wxDateTime::Tm::AddDays(int dayDiff) +{ + // normalize the days field + while ( dayDiff + mday < 1 ) + { + AddMonths(-1); + + dayDiff += GetNumOfDaysInMonth(year, mon); + } + + mday = (wxDateTime::wxDateTime_t)( mday + dayDiff ); + while ( mday > GetNumOfDaysInMonth(year, mon) ) + { + mday -= GetNumOfDaysInMonth(year, mon); + + AddMonths(1); + } + + wxASSERT_MSG( mday > 0 && mday <= GetNumOfDaysInMonth(year, mon), + _T("logic error") ); +} + +// ---------------------------------------------------------------------------- +// class TimeZone +// ---------------------------------------------------------------------------- + +wxDateTime::TimeZone::TimeZone(wxDateTime::TZ tz) +{ + switch ( tz ) + { + case wxDateTime::Local: + // get the offset from C RTL: it returns the difference GMT-local + // while we want to have the offset _from_ GMT, hence the '-' + m_offset = -GetTimeZone(); + break; + + case wxDateTime::GMT_12: + case wxDateTime::GMT_11: + case wxDateTime::GMT_10: + case wxDateTime::GMT_9: + case wxDateTime::GMT_8: + case wxDateTime::GMT_7: + case wxDateTime::GMT_6: + case wxDateTime::GMT_5: + case wxDateTime::GMT_4: + case wxDateTime::GMT_3: + case wxDateTime::GMT_2: + case wxDateTime::GMT_1: + m_offset = -3600*(wxDateTime::GMT0 - tz); + break; + + case wxDateTime::GMT0: + case wxDateTime::GMT1: + case wxDateTime::GMT2: + case wxDateTime::GMT3: + case wxDateTime::GMT4: + case wxDateTime::GMT5: + case wxDateTime::GMT6: + case wxDateTime::GMT7: + case wxDateTime::GMT8: + case wxDateTime::GMT9: + case wxDateTime::GMT10: + case wxDateTime::GMT11: + case wxDateTime::GMT12: + case wxDateTime::GMT13: + m_offset = 3600*(tz - wxDateTime::GMT0); + break; + + case wxDateTime::A_CST: + // Central Standard Time in use in Australia = UTC + 9.5 + m_offset = 60l*(9*MIN_PER_HOUR + MIN_PER_HOUR/2); + break; + + default: + wxFAIL_MSG( _T("unknown time zone") ); + } +} + +// ---------------------------------------------------------------------------- +// static functions +// ---------------------------------------------------------------------------- + +/* static */ +bool wxDateTime::IsLeapYear(int year, wxDateTime::Calendar cal) +{ + if ( year == Inv_Year ) + year = GetCurrentYear(); + + if ( cal == Gregorian ) + { + // in Gregorian calendar leap years are those divisible by 4 except + // those divisible by 100 unless they're also divisible by 400 + // (in some countries, like Russia and Greece, additional corrections + // exist, but they won't manifest themselves until 2700) + return (year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0)); + } + else if ( cal == Julian ) + { + // in Julian calendar the rule is simpler + return year % 4 == 0; + } + else + { + wxFAIL_MSG(_T("unknown calendar")); + + return false; + } +} + +/* static */ +int wxDateTime::GetCentury(int year) +{ + return year > 0 ? year / 100 : year / 100 - 1; +} + +/* static */ +int wxDateTime::ConvertYearToBC(int year) +{ + // year 0 is BC 1 + return year > 0 ? year : year - 1; +} + +/* static */ +int wxDateTime::GetCurrentYear(wxDateTime::Calendar cal) +{ + switch ( cal ) + { + case Gregorian: + return Now().GetYear(); + + case Julian: + wxFAIL_MSG(_T("TODO")); + break; + + default: + wxFAIL_MSG(_T("unsupported calendar")); + break; + } + + return Inv_Year; +} + +/* static */ +wxDateTime::Month wxDateTime::GetCurrentMonth(wxDateTime::Calendar cal) +{ + switch ( cal ) + { + case Gregorian: + return Now().GetMonth(); + + case Julian: + wxFAIL_MSG(_T("TODO")); + break; + + default: + wxFAIL_MSG(_T("unsupported calendar")); + break; + } + + return Inv_Month; +} + +/* static */ +wxDateTime::wxDateTime_t wxDateTime::GetNumberOfDays(int year, Calendar cal) +{ + if ( year == Inv_Year ) + { + // take the current year if none given + year = GetCurrentYear(); + } + + switch ( cal ) + { + case Gregorian: + case Julian: + return IsLeapYear(year) ? 366 : 365; + + default: + wxFAIL_MSG(_T("unsupported calendar")); + break; + } + + return 0; +} + +/* static */ +wxDateTime::wxDateTime_t wxDateTime::GetNumberOfDays(wxDateTime::Month month, + int year, + wxDateTime::Calendar cal) +{ + wxCHECK_MSG( month < MONTHS_IN_YEAR, 0, _T("invalid month") ); + + if ( cal == Gregorian || cal == Julian ) + { + if ( year == Inv_Year ) + { + // take the current year if none given + year = GetCurrentYear(); + } + + return GetNumOfDaysInMonth(year, month); + } + else + { + wxFAIL_MSG(_T("unsupported calendar")); + + return 0; + } +} + +/* static */ +wxString wxDateTime::GetMonthName(wxDateTime::Month month, + wxDateTime::NameFlags flags) +{ + wxCHECK_MSG( month != Inv_Month, wxEmptyString, _T("invalid month") ); +#ifdef HAVE_STRFTIME + // notice that we must set all the fields to avoid confusing libc (GNU one + // gets confused to a crash if we don't do this) + tm tm; + InitTm(tm); + tm.tm_mon = month; + + return CallStrftime(flags == Name_Abbr ? _T("%b") : _T("%B"), &tm); +#else // !HAVE_STRFTIME + wxString ret; + switch(month) + { + case Jan: + ret = (flags == Name_Abbr ? wxT("Jan"): wxT("January")); + break; + case Feb: + ret = (flags == Name_Abbr ? wxT("Feb"): wxT("Febuary")); + break; + case Mar: + ret = (flags == Name_Abbr ? wxT("Mar"): wxT("March")); + break; + case Apr: + ret = (flags == Name_Abbr ? wxT("Apr"): wxT("April")); + break; + case May: + ret = (flags == Name_Abbr ? wxT("May"): wxT("May")); + break; + case Jun: + ret = (flags == Name_Abbr ? wxT("Jun"): wxT("June")); + break; + case Jul: + ret = (flags == Name_Abbr ? wxT("Jul"): wxT("July")); + break; + case Aug: + ret = (flags == Name_Abbr ? wxT("Aug"): wxT("August")); + break; + case Sep: + ret = (flags == Name_Abbr ? wxT("Sep"): wxT("September")); + break; + case Oct: + ret = (flags == Name_Abbr ? wxT("Oct"): wxT("October")); + break; + case Nov: + ret = (flags == Name_Abbr ? wxT("Nov"): wxT("November")); + break; + case Dec: + ret = (flags == Name_Abbr ? wxT("Dec"): wxT("December")); + break; + } + return ret; +#endif // HAVE_STRFTIME/!HAVE_STRFTIME +} + +/* static */ +wxString wxDateTime::GetWeekDayName(wxDateTime::WeekDay wday, + wxDateTime::NameFlags flags) +{ + wxCHECK_MSG( wday != Inv_WeekDay, wxEmptyString, _T("invalid weekday") ); +#ifdef HAVE_STRFTIME + // take some arbitrary Sunday (but notice that the day should be such that + // after adding wday to it below we still have a valid date, e.g. don't + // take 28 here!) + tm tm; + InitTm(tm); + tm.tm_mday = 21; + tm.tm_mon = Nov; + tm.tm_year = 99; + + // and offset it by the number of days needed to get the correct wday + tm.tm_mday += wday; + + // call mktime() to normalize it... + (void)mktime(&tm); + + // ... and call strftime() + return CallStrftime(flags == Name_Abbr ? _T("%a") : _T("%A"), &tm); +#else // !HAVE_STRFTIME + wxString ret; + switch(wday) + { + case Sun: + ret = (flags == Name_Abbr ? wxT("Sun") : wxT("Sunday")); + break; + case Mon: + ret = (flags == Name_Abbr ? wxT("Mon") : wxT("Monday")); + break; + case Tue: + ret = (flags == Name_Abbr ? wxT("Tue") : wxT("Tuesday")); + break; + case Wed: + ret = (flags == Name_Abbr ? wxT("Wed") : wxT("Wednesday")); + break; + case Thu: + ret = (flags == Name_Abbr ? wxT("Thu") : wxT("Thursday")); + break; + case Fri: + ret = (flags == Name_Abbr ? wxT("Fri") : wxT("Friday")); + break; + case Sat: + ret = (flags == Name_Abbr ? wxT("Sat") : wxT("Saturday")); + break; + } + return ret; +#endif // HAVE_STRFTIME/!HAVE_STRFTIME +} + +/* static */ +void wxDateTime::GetAmPmStrings(wxString *am, wxString *pm) +{ + tm tm; + InitTm(tm); + wxChar buffer[64]; + // @Note: Do not call 'CallStrftime' here! CallStrftime checks the return code + // and causes an assertion failed if the buffer is to small (which is good) - OR - + // if strftime does not return anything because the format string is invalid - OR - + // if there are no 'am' / 'pm' tokens defined for the current locale (which is not good). + // wxDateTime::ParseTime will try several different formats to parse the time. + // As a result, GetAmPmStrings might get called, even if the current locale + // does not define any 'am' / 'pm' tokens. In this case, wxStrftime would + // assert, even though it is a perfectly legal use. + if ( am ) + { + if (wxStrftime(buffer, sizeof(buffer)/sizeof(wxChar), _T("%p"), &tm) > 0) + *am = wxString(buffer); + else + *am = wxString(); + } + if ( pm ) + { + tm.tm_hour = 13; + if (wxStrftime(buffer, sizeof(buffer)/sizeof(wxChar), _T("%p"), &tm) > 0) + *pm = wxString(buffer); + else + *pm = wxString(); + } +} + +// ---------------------------------------------------------------------------- +// Country stuff: date calculations depend on the country (DST, work days, +// ...), so we need to know which rules to follow. +// ---------------------------------------------------------------------------- + +/* static */ +wxDateTime::Country wxDateTime::GetCountry() +{ + // TODO use LOCALE_ICOUNTRY setting under Win32 +#ifndef __WXWINCE__ + if ( ms_country == Country_Unknown ) + { + // try to guess from the time zone name + time_t t = time(NULL); + struct tm tmstruct; + struct tm *tm = wxLocaltime_r(&t, &tmstruct); + + wxString tz = CallStrftime(_T("%Z"), tm); + if ( tz == _T("WET") || tz == _T("WEST") ) + { + ms_country = UK; + } + else if ( tz == _T("CET") || tz == _T("CEST") ) + { + ms_country = Country_EEC; + } + else if ( tz == _T("MSK") || tz == _T("MSD") ) + { + ms_country = Russia; + } + else if ( tz == _T("AST") || tz == _T("ADT") || + tz == _T("EST") || tz == _T("EDT") || + tz == _T("CST") || tz == _T("CDT") || + tz == _T("MST") || tz == _T("MDT") || + tz == _T("PST") || tz == _T("PDT") ) + { + ms_country = USA; + } + else + { + // well, choose a default one + ms_country = USA; + } + } +#else // __WXWINCE__ + ms_country = USA; +#endif // !__WXWINCE__/__WXWINCE__ + + return ms_country; +} + +/* static */ +void wxDateTime::SetCountry(wxDateTime::Country country) +{ + ms_country = country; +} + +/* static */ +bool wxDateTime::IsWestEuropeanCountry(Country country) +{ + if ( country == Country_Default ) + { + country = GetCountry(); + } + + return (Country_WesternEurope_Start <= country) && + (country <= Country_WesternEurope_End); +} + +// ---------------------------------------------------------------------------- +// DST calculations: we use 3 different rules for the West European countries, +// USA and for the rest of the world. This is undoubtedly false for many +// countries, but I lack the necessary info (and the time to gather it), +// please add the other rules here! +// ---------------------------------------------------------------------------- + +/* static */ +bool wxDateTime::IsDSTApplicable(int year, Country country) +{ + if ( year == Inv_Year ) + { + // take the current year if none given + year = GetCurrentYear(); + } + + if ( country == Country_Default ) + { + country = GetCountry(); + } + + switch ( country ) + { + case USA: + case UK: + // DST was first observed in the US and UK during WWI, reused + // during WWII and used again since 1966 + return year >= 1966 || + (year >= 1942 && year <= 1945) || + (year == 1918 || year == 1919); + + default: + // assume that it started after WWII + return year > 1950; + } +} + +/* static */ +wxDateTime wxDateTime::GetBeginDST(int year, Country country) +{ + if ( year == Inv_Year ) + { + // take the current year if none given + year = GetCurrentYear(); + } + + if ( country == Country_Default ) + { + country = GetCountry(); + } + + if ( !IsDSTApplicable(year, country) ) + { + return wxInvalidDateTime; + } + + wxDateTime dt; + + if ( IsWestEuropeanCountry(country) || (country == Russia) ) + { + // DST begins at 1 a.m. GMT on the last Sunday of March + if ( !dt.SetToLastWeekDay(Sun, Mar, year) ) + { + // weird... + wxFAIL_MSG( _T("no last Sunday in March?") ); + } + + dt += wxTimeSpan::Hours(1); + + // disable DST tests because it could result in an infinite recursion! + dt.MakeGMT(true); + } + else switch ( country ) + { + case USA: + switch ( year ) + { + case 1918: + case 1919: + // don't know for sure - assume it was in effect all year + + case 1943: + case 1944: + case 1945: + dt.Set(1, Jan, year); + break; + + case 1942: + // DST was installed Feb 2, 1942 by the Congress + dt.Set(2, Feb, year); + break; + + // Oil embargo changed the DST period in the US + case 1974: + dt.Set(6, Jan, 1974); + break; + + case 1975: + dt.Set(23, Feb, 1975); + break; + + default: + // before 1986, DST begun on the last Sunday of April, but + // in 1986 Reagan changed it to begin at 2 a.m. of the + // first Sunday in April + if ( year < 1986 ) + { + if ( !dt.SetToLastWeekDay(Sun, Apr, year) ) + { + // weird... + wxFAIL_MSG( _T("no first Sunday in April?") ); + } + } + else + { + if ( !dt.SetToWeekDay(Sun, 1, Apr, year) ) + { + // weird... + wxFAIL_MSG( _T("no first Sunday in April?") ); + } + } + + dt += wxTimeSpan::Hours(2); + + // TODO what about timezone?? + } + + break; + + default: + // assume Mar 30 as the start of the DST for the rest of the world + // - totally bogus, of course + dt.Set(30, Mar, year); + } + + return dt; +} + +/* static */ +wxDateTime wxDateTime::GetEndDST(int year, Country country) +{ + if ( year == Inv_Year ) + { + // take the current year if none given + year = GetCurrentYear(); + } + + if ( country == Country_Default ) + { + country = GetCountry(); + } + + if ( !IsDSTApplicable(year, country) ) + { + return wxInvalidDateTime; + } + + wxDateTime dt; + + if ( IsWestEuropeanCountry(country) || (country == Russia) ) + { + // DST ends at 1 a.m. GMT on the last Sunday of October + if ( !dt.SetToLastWeekDay(Sun, Oct, year) ) + { + // weirder and weirder... + wxFAIL_MSG( _T("no last Sunday in October?") ); + } + + dt += wxTimeSpan::Hours(1); + + // disable DST tests because it could result in an infinite recursion! + dt.MakeGMT(true); + } + else switch ( country ) + { + case USA: + switch ( year ) + { + case 1918: + case 1919: + // don't know for sure - assume it was in effect all year + + case 1943: + case 1944: + dt.Set(31, Dec, year); + break; + + case 1945: + // the time was reset after the end of the WWII + dt.Set(30, Sep, year); + break; + + default: + // DST ends at 2 a.m. on the last Sunday of October + if ( !dt.SetToLastWeekDay(Sun, Oct, year) ) + { + // weirder and weirder... + wxFAIL_MSG( _T("no last Sunday in October?") ); + } + + dt += wxTimeSpan::Hours(2); + + // TODO what about timezone?? + } + break; + + default: + // assume October 26th as the end of the DST - totally bogus too + dt.Set(26, Oct, year); + } + + return dt; +} + +// ---------------------------------------------------------------------------- +// constructors and assignment operators +// ---------------------------------------------------------------------------- + +// return the current time with ms precision +/* static */ wxDateTime wxDateTime::UNow() +{ + return wxDateTime(wxGetLocalTimeMillis()); +} + +// the values in the tm structure contain the local time +wxDateTime& wxDateTime::Set(const struct tm& tm) +{ + struct tm tm2(tm); + time_t timet = mktime(&tm2); + + if ( timet == (time_t)-1 ) + { + // mktime() rather unintuitively fails for Jan 1, 1970 if the hour is + // less than timezone - try to make it work for this case + if ( tm2.tm_year == 70 && tm2.tm_mon == 0 && tm2.tm_mday == 1 ) + { + return Set((time_t)( + GetTimeZone() + + tm2.tm_hour * MIN_PER_HOUR * SEC_PER_MIN + + tm2.tm_min * SEC_PER_MIN + + tm2.tm_sec)); + } + + wxFAIL_MSG( _T("mktime() failed") ); + + *this = wxInvalidDateTime; + + return *this; + } + else + { + return Set(timet); + } +} + +wxDateTime& wxDateTime::Set(wxDateTime_t hour, + wxDateTime_t minute, + wxDateTime_t second, + wxDateTime_t millisec) +{ + // we allow seconds to be 61 to account for the leap seconds, even if we + // don't use them really + wxDATETIME_CHECK( hour < 24 && + second < 62 && + minute < 60 && + millisec < 1000, + _T("Invalid time in wxDateTime::Set()") ); + + // get the current date from system + struct tm tmstruct; + struct tm *tm = GetTmNow(&tmstruct); + + wxDATETIME_CHECK( tm, _T("wxLocaltime_r() failed") ); + + // make a copy so it isn't clobbered by the call to mktime() below + struct tm tm1(*tm); + + // adjust the time + tm1.tm_hour = hour; + tm1.tm_min = minute; + tm1.tm_sec = second; + + // and the DST in case it changes on this date + struct tm tm2(tm1); + mktime(&tm2); + if ( tm2.tm_isdst != tm1.tm_isdst ) + tm1.tm_isdst = tm2.tm_isdst; + + (void)Set(tm1); + + // and finally adjust milliseconds + return SetMillisecond(millisec); +} + +wxDateTime& wxDateTime::Set(wxDateTime_t day, + Month month, + int year, + wxDateTime_t hour, + wxDateTime_t minute, + wxDateTime_t second, + wxDateTime_t millisec) +{ + wxDATETIME_CHECK( hour < 24 && + second < 62 && + minute < 60 && + millisec < 1000, + _T("Invalid time in wxDateTime::Set()") ); + + ReplaceDefaultYearMonthWithCurrent(&year, &month); + + wxDATETIME_CHECK( (0 < day) && (day <= GetNumberOfDays(month, year)), + _T("Invalid date in wxDateTime::Set()") ); + + // the range of time_t type (inclusive) + static const int yearMinInRange = 1970; + static const int yearMaxInRange = 2037; + + // test only the year instead of testing for the exact end of the Unix + // time_t range - it doesn't bring anything to do more precise checks + if ( year >= yearMinInRange && year <= yearMaxInRange ) + { + // use the standard library version if the date is in range - this is + // probably more efficient than our code + struct tm tm; + tm.tm_year = year - 1900; + tm.tm_mon = month; + tm.tm_mday = day; + tm.tm_hour = hour; + tm.tm_min = minute; + tm.tm_sec = second; + tm.tm_isdst = -1; // mktime() will guess it + + (void)Set(tm); + + // and finally adjust milliseconds + if (IsValid()) + SetMillisecond(millisec); + + return *this; + } + else + { + // do time calculations ourselves: we want to calculate the number of + // milliseconds between the given date and the epoch + + // get the JDN for the midnight of this day + m_time = GetTruncatedJDN(day, month, year); + m_time -= EPOCH_JDN; + m_time *= SECONDS_PER_DAY * TIME_T_FACTOR; + + // JDN corresponds to GMT, we take localtime + Add(wxTimeSpan(hour, minute, second + GetTimeZone(), millisec)); + } + + return *this; +} + +wxDateTime& wxDateTime::Set(double jdn) +{ + // so that m_time will be 0 for the midnight of Jan 1, 1970 which is jdn + // EPOCH_JDN + 0.5 + jdn -= EPOCH_JDN + 0.5; + + m_time.Assign(jdn*MILLISECONDS_PER_DAY); + + // JDNs always are in UTC, so we don't need any adjustments for time zone + + return *this; +} + +wxDateTime& wxDateTime::ResetTime() +{ + Tm tm = GetTm(); + + if ( tm.hour || tm.min || tm.sec || tm.msec ) + { + tm.msec = + tm.sec = + tm.min = + tm.hour = 0; + + Set(tm); + } + + return *this; +} + +wxDateTime wxDateTime::GetDateOnly() const +{ + Tm tm = GetTm(); + tm.msec = + tm.sec = + tm.min = + tm.hour = 0; + return wxDateTime(tm); +} + +// ---------------------------------------------------------------------------- +// DOS Date and Time Format functions +// ---------------------------------------------------------------------------- +// the dos date and time value is an unsigned 32 bit value in the format: +// YYYYYYYMMMMDDDDDhhhhhmmmmmmsssss +// +// Y = year offset from 1980 (0-127) +// M = month (1-12) +// D = day of month (1-31) +// h = hour (0-23) +// m = minute (0-59) +// s = bisecond (0-29) each bisecond indicates two seconds +// ---------------------------------------------------------------------------- + +wxDateTime& wxDateTime::SetFromDOS(unsigned long ddt) +{ + struct tm tm; + InitTm(tm); + + long year = ddt & 0xFE000000; + year >>= 25; + year += 80; + tm.tm_year = year; + + long month = ddt & 0x1E00000; + month >>= 21; + month -= 1; + tm.tm_mon = month; + + long day = ddt & 0x1F0000; + day >>= 16; + tm.tm_mday = day; + + long hour = ddt & 0xF800; + hour >>= 11; + tm.tm_hour = hour; + + long minute = ddt & 0x7E0; + minute >>= 5; + tm.tm_min = minute; + + long second = ddt & 0x1F; + tm.tm_sec = second * 2; + + return Set(mktime(&tm)); +} + +unsigned long wxDateTime::GetAsDOS() const +{ + unsigned long ddt; + time_t ticks = GetTicks(); + struct tm tmstruct; + struct tm *tm = wxLocaltime_r(&ticks, &tmstruct); + wxCHECK_MSG( tm, ULONG_MAX, _T("time can't be represented in DOS format") ); + + long year = tm->tm_year; + year -= 80; + year <<= 25; + + long month = tm->tm_mon; + month += 1; + month <<= 21; + + long day = tm->tm_mday; + day <<= 16; + + long hour = tm->tm_hour; + hour <<= 11; + + long minute = tm->tm_min; + minute <<= 5; + + long second = tm->tm_sec; + second /= 2; + + ddt = year | month | day | hour | minute | second; + return ddt; +} + +// ---------------------------------------------------------------------------- +// time_t <-> broken down time conversions +// ---------------------------------------------------------------------------- + +wxDateTime::Tm wxDateTime::GetTm(const TimeZone& tz) const +{ + wxASSERT_MSG( IsValid(), _T("invalid wxDateTime") ); + + time_t time = GetTicks(); + if ( time != (time_t)-1 ) + { + // use C RTL functions + struct tm tmstruct; + tm *tm; + if ( tz.GetOffset() == -GetTimeZone() ) + { + // we are working with local time + tm = wxLocaltime_r(&time, &tmstruct); + + // should never happen + wxCHECK_MSG( tm, Tm(), _T("wxLocaltime_r() failed") ); + } + else + { + time += (time_t)tz.GetOffset(); +#if defined(__VMS__) || defined(__WATCOMC__) // time is unsigned so avoid warning + int time2 = (int) time; + if ( time2 >= 0 ) +#else + if ( time >= 0 ) +#endif + { + tm = wxGmtime_r(&time, &tmstruct); + + // should never happen + wxCHECK_MSG( tm, Tm(), _T("wxGmtime_r() failed") ); + } + else + { + tm = (struct tm *)NULL; + } + } + + if ( tm ) + { + // adjust the milliseconds + Tm tm2(*tm, tz); + long timeOnly = (m_time % MILLISECONDS_PER_DAY).ToLong(); + tm2.msec = (wxDateTime_t)(timeOnly % 1000); + return tm2; + } + //else: use generic code below + } + + // remember the time and do the calculations with the date only - this + // eliminates rounding errors of the floating point arithmetics + + wxLongLong timeMidnight = m_time + tz.GetOffset() * 1000; + + long timeOnly = (timeMidnight % MILLISECONDS_PER_DAY).ToLong(); + + // we want to always have positive time and timeMidnight to be really + // the midnight before it + if ( timeOnly < 0 ) + { + timeOnly = MILLISECONDS_PER_DAY + timeOnly; + } + + timeMidnight -= timeOnly; + + // calculate the Gregorian date from JDN for the midnight of our date: + // this will yield day, month (in 1..12 range) and year + + // actually, this is the JDN for the noon of the previous day + long jdn = (timeMidnight / MILLISECONDS_PER_DAY).ToLong() + EPOCH_JDN; + + // CREDIT: code below is by Scott E. Lee (but bugs are mine) + + wxASSERT_MSG( jdn > -2, _T("JDN out of range") ); + + // calculate the century + long temp = (jdn + JDN_OFFSET) * 4 - 1; + long century = temp / DAYS_PER_400_YEARS; + + // then the year and day of year (1 <= dayOfYear <= 366) + temp = ((temp % DAYS_PER_400_YEARS) / 4) * 4 + 3; + long year = (century * 100) + (temp / DAYS_PER_4_YEARS); + long dayOfYear = (temp % DAYS_PER_4_YEARS) / 4 + 1; + + // and finally the month and day of the month + temp = dayOfYear * 5 - 3; + long month = temp / DAYS_PER_5_MONTHS; + long day = (temp % DAYS_PER_5_MONTHS) / 5 + 1; + + // month is counted from March - convert to normal + if ( month < 10 ) + { + month += 3; + } + else + { + year += 1; + month -= 9; + } + + // year is offset by 4800 + year -= 4800; + + // check that the algorithm gave us something reasonable + wxASSERT_MSG( (0 < month) && (month <= 12), _T("invalid month") ); + wxASSERT_MSG( (1 <= day) && (day < 32), _T("invalid day") ); + + // construct Tm from these values + Tm tm; + tm.year = (int)year; + tm.mon = (Month)(month - 1); // algorithm yields 1 for January, not 0 + tm.mday = (wxDateTime_t)day; + tm.msec = (wxDateTime_t)(timeOnly % 1000); + timeOnly -= tm.msec; + timeOnly /= 1000; // now we have time in seconds + + tm.sec = (wxDateTime_t)(timeOnly % SEC_PER_MIN); + timeOnly -= tm.sec; + timeOnly /= SEC_PER_MIN; // now we have time in minutes + + tm.min = (wxDateTime_t)(timeOnly % MIN_PER_HOUR); + timeOnly -= tm.min; + + tm.hour = (wxDateTime_t)(timeOnly / MIN_PER_HOUR); + + return tm; +} + +wxDateTime& wxDateTime::SetYear(int year) +{ + wxASSERT_MSG( IsValid(), _T("invalid wxDateTime") ); + + Tm tm(GetTm()); + tm.year = year; + Set(tm); + + return *this; +} + +wxDateTime& wxDateTime::SetMonth(Month month) +{ + wxASSERT_MSG( IsValid(), _T("invalid wxDateTime") ); + + Tm tm(GetTm()); + tm.mon = month; + Set(tm); + + return *this; +} + +wxDateTime& wxDateTime::SetDay(wxDateTime_t mday) +{ + wxASSERT_MSG( IsValid(), _T("invalid wxDateTime") ); + + Tm tm(GetTm()); + tm.mday = mday; + Set(tm); + + return *this; +} + +wxDateTime& wxDateTime::SetHour(wxDateTime_t hour) +{ + wxASSERT_MSG( IsValid(), _T("invalid wxDateTime") ); + + Tm tm(GetTm()); + tm.hour = hour; + Set(tm); + + return *this; +} + +wxDateTime& wxDateTime::SetMinute(wxDateTime_t min) +{ + wxASSERT_MSG( IsValid(), _T("invalid wxDateTime") ); + + Tm tm(GetTm()); + tm.min = min; + Set(tm); + + return *this; +} + +wxDateTime& wxDateTime::SetSecond(wxDateTime_t sec) +{ + wxASSERT_MSG( IsValid(), _T("invalid wxDateTime") ); + + Tm tm(GetTm()); + tm.sec = sec; + Set(tm); + + return *this; +} + +wxDateTime& wxDateTime::SetMillisecond(wxDateTime_t millisecond) +{ + wxASSERT_MSG( IsValid(), _T("invalid wxDateTime") ); + + // we don't need to use GetTm() for this one + m_time -= m_time % 1000l; + m_time += millisecond; + + return *this; +} + +// ---------------------------------------------------------------------------- +// wxDateTime arithmetics +// ---------------------------------------------------------------------------- + +wxDateTime& wxDateTime::Add(const wxDateSpan& diff) +{ + Tm tm(GetTm()); + + tm.year += diff.GetYears(); + tm.AddMonths(diff.GetMonths()); + + // check that the resulting date is valid + if ( tm.mday > GetNumOfDaysInMonth(tm.year, tm.mon) ) + { + // We suppose that when adding one month to Jan 31 we want to get Feb + // 28 (or 29), i.e. adding a month to the last day of the month should + // give the last day of the next month which is quite logical. + // + // Unfortunately, there is no logic way to understand what should + // Jan 30 + 1 month be - Feb 28 too or Feb 27 (assuming non leap year)? + // We make it Feb 28 (last day too), but it is highly questionable. + tm.mday = GetNumOfDaysInMonth(tm.year, tm.mon); + } + + tm.AddDays(diff.GetTotalDays()); + + Set(tm); + + wxASSERT_MSG( IsSameTime(tm), + _T("Add(wxDateSpan) shouldn't modify time") ); + + return *this; +} + +// ---------------------------------------------------------------------------- +// Weekday and monthday stuff +// ---------------------------------------------------------------------------- + +// convert Sun, Mon, ..., Sat into 6, 0, ..., 5 +static inline int ConvertWeekDayToMondayBase(int wd) +{ + return wd == wxDateTime::Sun ? 6 : wd - 1; +} + +/* static */ +wxDateTime +wxDateTime::SetToWeekOfYear(int year, wxDateTime_t numWeek, WeekDay wd) +{ + wxASSERT_MSG( numWeek > 0, + _T("invalid week number: weeks are counted from 1") ); + + // Jan 4 always lies in the 1st week of the year + wxDateTime dt(4, Jan, year); + dt.SetToWeekDayInSameWeek(wd); + dt += wxDateSpan::Weeks(numWeek - 1); + + return dt; +} + +#if WXWIN_COMPATIBILITY_2_6 +// use a separate function to avoid warnings about using deprecated +// SetToTheWeek in GetWeek below +static wxDateTime +SetToTheWeek(int year, + wxDateTime::wxDateTime_t numWeek, + wxDateTime::WeekDay weekday, + wxDateTime::WeekFlags flags) +{ + // Jan 4 always lies in the 1st week of the year + wxDateTime dt(4, wxDateTime::Jan, year); + dt.SetToWeekDayInSameWeek(weekday, flags); + dt += wxDateSpan::Weeks(numWeek - 1); + + return dt; +} + +bool wxDateTime::SetToTheWeek(wxDateTime_t numWeek, + WeekDay weekday, + WeekFlags flags) +{ + int year = GetYear(); + *this = ::SetToTheWeek(year, numWeek, weekday, flags); + if ( GetYear() != year ) + { + // oops... numWeek was too big + return false; + } + + return true; +} + +wxDateTime wxDateTime::GetWeek(wxDateTime_t numWeek, + WeekDay weekday, + WeekFlags flags) const +{ + return ::SetToTheWeek(GetYear(), numWeek, weekday, flags); +} +#endif // WXWIN_COMPATIBILITY_2_6 + +wxDateTime& wxDateTime::SetToLastMonthDay(Month month, + int year) +{ + // take the current month/year if none specified + if ( year == Inv_Year ) + year = GetYear(); + if ( month == Inv_Month ) + month = GetMonth(); + + return Set(GetNumOfDaysInMonth(year, month), month, year); +} + +wxDateTime& wxDateTime::SetToWeekDayInSameWeek(WeekDay weekday, WeekFlags flags) +{ + wxDATETIME_CHECK( weekday != Inv_WeekDay, _T("invalid weekday") ); + + int wdayDst = weekday, + wdayThis = GetWeekDay(); + if ( wdayDst == wdayThis ) + { + // nothing to do + return *this; + } + + if ( flags == Default_First ) + { + flags = GetCountry() == USA ? Sunday_First : Monday_First; + } + + // the logic below based on comparing weekday and wdayThis works if Sun (0) + // is the first day in the week, but breaks down for Monday_First case so + // we adjust the week days in this case + if ( flags == Monday_First ) + { + if ( wdayThis == Sun ) + wdayThis += 7; + if ( wdayDst == Sun ) + wdayDst += 7; + } + //else: Sunday_First, nothing to do + + // go forward or back in time to the day we want + if ( wdayDst < wdayThis ) + { + return Subtract(wxDateSpan::Days(wdayThis - wdayDst)); + } + else // weekday > wdayThis + { + return Add(wxDateSpan::Days(wdayDst - wdayThis)); + } +} + +wxDateTime& wxDateTime::SetToNextWeekDay(WeekDay weekday) +{ + wxDATETIME_CHECK( weekday != Inv_WeekDay, _T("invalid weekday") ); + + int diff; + WeekDay wdayThis = GetWeekDay(); + if ( weekday == wdayThis ) + { + // nothing to do + return *this; + } + else if ( weekday < wdayThis ) + { + // need to advance a week + diff = 7 - (wdayThis - weekday); + } + else // weekday > wdayThis + { + diff = weekday - wdayThis; + } + + return Add(wxDateSpan::Days(diff)); +} + +wxDateTime& wxDateTime::SetToPrevWeekDay(WeekDay weekday) +{ + wxDATETIME_CHECK( weekday != Inv_WeekDay, _T("invalid weekday") ); + + int diff; + WeekDay wdayThis = GetWeekDay(); + if ( weekday == wdayThis ) + { + // nothing to do + return *this; + } + else if ( weekday > wdayThis ) + { + // need to go to previous week + diff = 7 - (weekday - wdayThis); + } + else // weekday < wdayThis + { + diff = wdayThis - weekday; + } + + return Subtract(wxDateSpan::Days(diff)); +} + +bool wxDateTime::SetToWeekDay(WeekDay weekday, + int n, + Month month, + int year) +{ + wxCHECK_MSG( weekday != Inv_WeekDay, false, _T("invalid weekday") ); + + // we don't check explicitly that -5 <= n <= 5 because we will return false + // anyhow in such case - but may be should still give an assert for it? + + // take the current month/year if none specified + ReplaceDefaultYearMonthWithCurrent(&year, &month); + + wxDateTime dt; + + // TODO this probably could be optimised somehow... + + if ( n > 0 ) + { + // get the first day of the month + dt.Set(1, month, year); + + // get its wday + WeekDay wdayFirst = dt.GetWeekDay(); + + // go to the first weekday of the month + int diff = weekday - wdayFirst; + if ( diff < 0 ) + diff += 7; + + // add advance n-1 weeks more + diff += 7*(n - 1); + + dt += wxDateSpan::Days(diff); + } + else // count from the end of the month + { + // get the last day of the month + dt.SetToLastMonthDay(month, year); + + // get its wday + WeekDay wdayLast = dt.GetWeekDay(); + + // go to the last weekday of the month + int diff = wdayLast - weekday; + if ( diff < 0 ) + diff += 7; + + // and rewind n-1 weeks from there + diff += 7*(-n - 1); + + dt -= wxDateSpan::Days(diff); + } + + // check that it is still in the same month + if ( dt.GetMonth() == month ) + { + *this = dt; + + return true; + } + else + { + // no such day in this month + return false; + } +} + +static inline +wxDateTime::wxDateTime_t GetDayOfYearFromTm(const wxDateTime::Tm& tm) +{ + return (wxDateTime::wxDateTime_t)(gs_cumulatedDays[wxDateTime::IsLeapYear(tm.year)][tm.mon] + tm.mday); +} + +wxDateTime::wxDateTime_t wxDateTime::GetDayOfYear(const TimeZone& tz) const +{ + return GetDayOfYearFromTm(GetTm(tz)); +} + +wxDateTime::wxDateTime_t +wxDateTime::GetWeekOfYear(wxDateTime::WeekFlags flags, const TimeZone& tz) const +{ + if ( flags == Default_First ) + { + flags = GetCountry() == USA ? Sunday_First : Monday_First; + } + + Tm tm(GetTm(tz)); + wxDateTime_t nDayInYear = GetDayOfYearFromTm(tm); + + int wdTarget = GetWeekDay(tz); + int wdYearStart = wxDateTime(1, Jan, GetYear()).GetWeekDay(); + int week; + if ( flags == Sunday_First ) + { + // FIXME: First week is not calculated correctly. + week = (nDayInYear - wdTarget + 7) / 7; + if ( wdYearStart == Wed || wdYearStart == Thu ) + week++; + } + else // week starts with monday + { + // adjust the weekdays to non-US style. + wdYearStart = ConvertWeekDayToMondayBase(wdYearStart); + wdTarget = ConvertWeekDayToMondayBase(wdTarget); + + // quoting from http://www.cl.cam.ac.uk/~mgk25/iso-time.html: + // + // Week 01 of a year is per definition the first week that has the + // Thursday in this year, which is equivalent to the week that + // contains the fourth day of January. In other words, the first + // week of a new year is the week that has the majority of its + // days in the new year. Week 01 might also contain days from the + // previous year and the week before week 01 of a year is the last + // week (52 or 53) of the previous year even if it contains days + // from the new year. A week starts with Monday (day 1) and ends + // with Sunday (day 7). + // + + // if Jan 1 is Thursday or less, it is in the first week of this year + if ( wdYearStart < 4 ) + { + // count the number of entire weeks between Jan 1 and this date + week = (nDayInYear + wdYearStart + 6 - wdTarget)/7; + + // be careful to check for overflow in the next year + if ( week == 53 && tm.mday - wdTarget > 28 ) + week = 1; + } + else // Jan 1 is in the last week of the previous year + { + // check if we happen to be at the last week of previous year: + if ( tm.mon == Jan && tm.mday < 8 - wdYearStart ) + week = wxDateTime(31, Dec, GetYear()-1).GetWeekOfYear(); + else + week = (nDayInYear + wdYearStart - 1 - wdTarget)/7; + } + } + + return (wxDateTime::wxDateTime_t)week; +} + +wxDateTime::wxDateTime_t wxDateTime::GetWeekOfMonth(wxDateTime::WeekFlags flags, + const TimeZone& tz) const +{ + Tm tm = GetTm(tz); + wxDateTime dtMonthStart = wxDateTime(1, tm.mon, tm.year); + int nWeek = GetWeekOfYear(flags) - dtMonthStart.GetWeekOfYear(flags) + 1; + if ( nWeek < 0 ) + { + // this may happen for January when Jan, 1 is the last week of the + // previous year + nWeek += IsLeapYear(tm.year - 1) ? 53 : 52; + } + + return (wxDateTime::wxDateTime_t)nWeek; +} + +wxDateTime& wxDateTime::SetToYearDay(wxDateTime::wxDateTime_t yday) +{ + int year = GetYear(); + wxDATETIME_CHECK( (0 < yday) && (yday <= GetNumberOfDays(year)), + _T("invalid year day") ); + + bool isLeap = IsLeapYear(year); + for ( Month mon = Jan; mon < Inv_Month; wxNextMonth(mon) ) + { + // for Dec, we can't compare with gs_cumulatedDays[mon + 1], but we + // don't need it neither - because of the CHECK above we know that + // yday lies in December then + if ( (mon == Dec) || (yday <= gs_cumulatedDays[isLeap][mon + 1]) ) + { + Set((wxDateTime::wxDateTime_t)(yday - gs_cumulatedDays[isLeap][mon]), mon, year); + + break; + } + } + + return *this; +} + +// ---------------------------------------------------------------------------- +// Julian day number conversion and related stuff +// ---------------------------------------------------------------------------- + +double wxDateTime::GetJulianDayNumber() const +{ + return m_time.ToDouble() / MILLISECONDS_PER_DAY + EPOCH_JDN + 0.5; +} + +double wxDateTime::GetRataDie() const +{ + // March 1 of the year 0 is Rata Die day -306 and JDN 1721119.5 + return GetJulianDayNumber() - 1721119.5 - 306; +} + +// ---------------------------------------------------------------------------- +// timezone and DST stuff +// ---------------------------------------------------------------------------- + +int wxDateTime::IsDST(wxDateTime::Country country) const +{ + wxCHECK_MSG( country == Country_Default, -1, + _T("country support not implemented") ); + + // use the C RTL for the dates in the standard range + time_t timet = GetTicks(); + if ( timet != (time_t)-1 ) + { + struct tm tmstruct; + tm *tm = wxLocaltime_r(&timet, &tmstruct); + + wxCHECK_MSG( tm, -1, _T("wxLocaltime_r() failed") ); + + return tm->tm_isdst; + } + else + { + int year = GetYear(); + + if ( !IsDSTApplicable(year, country) ) + { + // no DST time in this year in this country + return -1; + } + + return IsBetween(GetBeginDST(year, country), GetEndDST(year, country)); + } +} + +wxDateTime& wxDateTime::MakeTimezone(const TimeZone& tz, bool noDST) +{ + long secDiff = GetTimeZone() + tz.GetOffset(); + + // we need to know whether DST is or not in effect for this date unless + // the test disabled by the caller + if ( !noDST && (IsDST() == 1) ) + { + // FIXME we assume that the DST is always shifted by 1 hour + secDiff -= 3600; + } + + return Add(wxTimeSpan::Seconds(secDiff)); +} + +wxDateTime& wxDateTime::MakeFromTimezone(const TimeZone& tz, bool noDST) +{ + long secDiff = GetTimeZone() + tz.GetOffset(); + + // we need to know whether DST is or not in effect for this date unless + // the test disabled by the caller + if ( !noDST && (IsDST() == 1) ) + { + // FIXME we assume that the DST is always shifted by 1 hour + secDiff -= 3600; + } + + return Subtract(wxTimeSpan::Seconds(secDiff)); +} + +// ---------------------------------------------------------------------------- +// wxDateTime to/from text representations +// ---------------------------------------------------------------------------- + +wxString wxDateTime::Format(const wxChar *format, const TimeZone& tz) const +{ + wxCHECK_MSG( format, wxEmptyString, _T("NULL format in wxDateTime::Format") ); + + time_t time = GetTicks(); + + // we have to use our own implementation if the date is out of range of + // strftime() or if we use non standard specificators +#ifdef HAVE_STRFTIME + if ( (time != (time_t)-1) && !wxStrstr(format, _T("%l")) ) + { + // use strftime() + struct tm tmstruct; + struct tm *tm; + if ( tz.GetOffset() == -GetTimeZone() ) + { + // we are working with local time + tm = wxLocaltime_r(&time, &tmstruct); + + // should never happen + wxCHECK_MSG( tm, wxEmptyString, _T("wxLocaltime_r() failed") ); + } + else + { + time += (int)tz.GetOffset(); + +#if defined(__VMS__) || defined(__WATCOMC__) // time is unsigned so avoid warning + int time2 = (int) time; + if ( time2 >= 0 ) +#else + if ( time >= 0 ) +#endif + { + tm = wxGmtime_r(&time, &tmstruct); + + // should never happen + wxCHECK_MSG( tm, wxEmptyString, _T("wxGmtime_r() failed") ); + } + else + { + tm = (struct tm *)NULL; + } + } + + if ( tm ) + { + return CallStrftime(format, tm); + } + } + //else: use generic code below +#endif // HAVE_STRFTIME + + // we only parse ANSI C format specifications here, no POSIX 2 + // complications, no GNU extensions but we do add support for a "%l" format + // specifier allowing to get the number of milliseconds + Tm tm = GetTm(tz); + + // used for calls to strftime() when we only deal with time + struct tm tmTimeOnly; + tmTimeOnly.tm_hour = tm.hour; + tmTimeOnly.tm_min = tm.min; + tmTimeOnly.tm_sec = tm.sec; + tmTimeOnly.tm_wday = 0; + tmTimeOnly.tm_yday = 0; + tmTimeOnly.tm_mday = 1; // any date will do + tmTimeOnly.tm_mon = 0; + tmTimeOnly.tm_year = 76; + tmTimeOnly.tm_isdst = 0; // no DST, we adjust for tz ourselves + + wxString tmp, res, fmt; + for ( const wxChar *p = format; *p; p++ ) + { + if ( *p != _T('%') ) + { + // copy as is + res += *p; + + continue; + } + + // set the default format + switch ( *++p ) + { + case _T('Y'): // year has 4 digits + fmt = _T("%04d"); + break; + + case _T('j'): // day of year has 3 digits + case _T('l'): // milliseconds have 3 digits + fmt = _T("%03d"); + break; + + case _T('w'): // week day as number has only one + fmt = _T("%d"); + break; + + default: + // it's either another valid format specifier in which case + // the format is "%02d" (for all the rest) or we have the + // field width preceding the format in which case it will + // override the default format anyhow + fmt = _T("%02d"); + } + + bool restart = true; + while ( restart ) + { + restart = false; + + // start of the format specification + switch ( *p ) + { + case _T('a'): // a weekday name + case _T('A'): + // second parameter should be true for abbreviated names + res += GetWeekDayName(tm.GetWeekDay(), + *p == _T('a') ? Name_Abbr : Name_Full); + break; + + case _T('b'): // a month name + case _T('B'): + res += GetMonthName(tm.mon, + *p == _T('b') ? Name_Abbr : Name_Full); + break; + + case _T('c'): // locale default date and time representation + case _T('x'): // locale default date representation +#ifdef HAVE_STRFTIME + // + // the problem: there is no way to know what do these format + // specifications correspond to for the current locale. + // + // the solution: use a hack and still use strftime(): first + // find the YEAR which is a year in the strftime() range (1970 + // - 2038) whose Jan 1 falls on the same week day as the Jan 1 + // of the real year. Then make a copy of the format and + // replace all occurrences of YEAR in it with some unique + // string not appearing anywhere else in it, then use + // strftime() to format the date in year YEAR and then replace + // YEAR back by the real year and the unique replacement + // string back with YEAR. Notice that "all occurrences of YEAR" + // means all occurrences of 4 digit as well as 2 digit form! + // + // the bugs: we assume that neither of %c nor %x contains any + // fields which may change between the YEAR and real year. For + // example, the week number (%U, %W) and the day number (%j) + // will change if one of these years is leap and the other one + // is not! + { + // find the YEAR: normally, for any year X, Jan 1 or the + // year X + 28 is the same weekday as Jan 1 of X (because + // the weekday advances by 1 for each normal X and by 2 + // for each leap X, hence by 5 every 4 years or by 35 + // which is 0 mod 7 every 28 years) but this rule breaks + // down if there are years between X and Y which are + // divisible by 4 but not leap (i.e. divisible by 100 but + // not 400), hence the correction. + + int yearReal = GetYear(tz); + int mod28 = yearReal % 28; + + // be careful to not go too far - we risk to leave the + // supported range + int year; + if ( mod28 < 10 ) + { + year = 1988 + mod28; // 1988 == 0 (mod 28) + } + else + { + year = 1970 + mod28 - 10; // 1970 == 10 (mod 28) + } + + int nCentury = year / 100, + nCenturyReal = yearReal / 100; + + // need to adjust for the years divisble by 400 which are + // not leap but are counted like leap ones if we just take + // the number of centuries in between for nLostWeekDays + int nLostWeekDays = (nCentury - nCenturyReal) - + (nCentury / 4 - nCenturyReal / 4); + + // we have to gain back the "lost" weekdays: note that the + // effect of this loop is to not do anything to + // nLostWeekDays (which we won't use any more), but to + // (indirectly) set the year correctly + while ( (nLostWeekDays % 7) != 0 ) + { + nLostWeekDays += year++ % 4 ? 1 : 2; + } + + // Keep year below 2000 so the 2digit year number + // can never match the month or day of the month + if (year>=2000) year-=28; + // at any rate, we couldn't go further than 1988 + 9 + 28! + wxASSERT_MSG( year < 2030, + _T("logic error in wxDateTime::Format") ); + + wxString strYear, strYear2; + strYear.Printf(_T("%d"), year); + strYear2.Printf(_T("%d"), year % 100); + + // find four strings not occurring in format (this is surely + // not the optimal way of doing it... improvements welcome!) + wxString fmt2 = format; + wxString replacement,replacement2,replacement3,replacement4; + for (int rnr=1; rnr<5 ; rnr++) + { + wxString r = (wxChar)-rnr; + while ( fmt2.Find(r) != wxNOT_FOUND ) + { + r << (wxChar)-rnr; + } + + switch (rnr) + { + case 1: replacement=r; break; + case 2: replacement2=r; break; + case 3: replacement3=r; break; + case 4: replacement4=r; break; + } + } + // replace all occurrences of year with it + bool wasReplaced = fmt2.Replace(strYear, replacement) > 0; + // evaluation order ensures we always attempt the replacement. + wasReplaced = (fmt2.Replace(strYear2, replacement2) > 0) || wasReplaced; + + // use strftime() to format the same date but in supported + // year + // + // NB: we assume that strftime() doesn't check for the + // date validity and will happily format the date + // corresponding to Feb 29 of a non leap year (which + // may happen if yearReal was leap and year is not) + struct tm tmAdjusted; + InitTm(tmAdjusted); + tmAdjusted.tm_hour = tm.hour; + tmAdjusted.tm_min = tm.min; + tmAdjusted.tm_sec = tm.sec; + tmAdjusted.tm_wday = tm.GetWeekDay(); + tmAdjusted.tm_yday = GetDayOfYear(); + tmAdjusted.tm_mday = tm.mday; + tmAdjusted.tm_mon = tm.mon; + tmAdjusted.tm_year = year - 1900; + tmAdjusted.tm_isdst = 0; // no DST, already adjusted + wxString str = CallStrftime(*p == _T('c') ? _T("%c") + : _T("%x"), + &tmAdjusted); + + // now replace the occurrence of 1999 with the real year + // we do this in two stages to stop the 2 digit year + // matching any substring of the 4 digit year. + // Any day,month hours and minutes components should be safe due + // to ensuring the range of the years. + wxString strYearReal, strYearReal2; + strYearReal.Printf(_T("%04d"), yearReal); + strYearReal2.Printf(_T("%02d"), yearReal % 100); + str.Replace(strYear, replacement3); + str.Replace(strYear2,replacement4); + str.Replace(replacement3, strYearReal); + str.Replace(replacement4, strYearReal2); + + // and replace back all occurrences of replacement string + if ( wasReplaced ) + { + str.Replace(replacement2, strYear2); + str.Replace(replacement, strYear); + } + + res += str; + } +#else // !HAVE_STRFTIME + // Use "%m/%d/%y %H:%M:%S" format instead + res += wxString::Format(wxT("%02d/%02d/%04d %02d:%02d:%02d"), + tm.mon+1,tm.mday, tm.year, tm.hour, tm.min, tm.sec); +#endif // HAVE_STRFTIME/!HAVE_STRFTIME + break; + + case _T('d'): // day of a month (01-31) + res += wxString::Format(fmt, tm.mday); + break; + + case _T('H'): // hour in 24h format (00-23) + res += wxString::Format(fmt, tm.hour); + break; + + case _T('I'): // hour in 12h format (01-12) + { + // 24h -> 12h, 0h -> 12h too + int hour12 = tm.hour > 12 ? tm.hour - 12 + : tm.hour ? tm.hour : 12; + res += wxString::Format(fmt, hour12); + } + break; + + case _T('j'): // day of the year + res += wxString::Format(fmt, GetDayOfYear(tz)); + break; + + case _T('l'): // milliseconds (NOT STANDARD) + res += wxString::Format(fmt, GetMillisecond(tz)); + break; + + case _T('m'): // month as a number (01-12) + res += wxString::Format(fmt, tm.mon + 1); + break; + + case _T('M'): // minute as a decimal number (00-59) + res += wxString::Format(fmt, tm.min); + break; + + case _T('p'): // AM or PM string +#ifdef HAVE_STRFTIME + res += CallStrftime(_T("%p"), &tmTimeOnly); +#else // !HAVE_STRFTIME + res += (tmTimeOnly.tm_hour > 12) ? wxT("pm") : wxT("am"); +#endif // HAVE_STRFTIME/!HAVE_STRFTIME + break; + + case _T('S'): // second as a decimal number (00-61) + res += wxString::Format(fmt, tm.sec); + break; + + case _T('U'): // week number in the year (Sunday 1st week day) + res += wxString::Format(fmt, GetWeekOfYear(Sunday_First, tz)); + break; + + case _T('W'): // week number in the year (Monday 1st week day) + res += wxString::Format(fmt, GetWeekOfYear(Monday_First, tz)); + break; + + case _T('w'): // weekday as a number (0-6), Sunday = 0 + res += wxString::Format(fmt, tm.GetWeekDay()); + break; + + // case _T('x'): -- handled with "%c" + + case _T('X'): // locale default time representation + // just use strftime() to format the time for us +#ifdef HAVE_STRFTIME + res += CallStrftime(_T("%X"), &tmTimeOnly); +#else // !HAVE_STRFTIME + res += wxString::Format(wxT("%02d:%02d:%02d"),tm.hour, tm.min, tm.sec); +#endif // HAVE_STRFTIME/!HAVE_STRFTIME + break; + + case _T('y'): // year without century (00-99) + res += wxString::Format(fmt, tm.year % 100); + break; + + case _T('Y'): // year with century + res += wxString::Format(fmt, tm.year); + break; + + case _T('Z'): // timezone name +#ifdef HAVE_STRFTIME + res += CallStrftime(_T("%Z"), &tmTimeOnly); +#endif + break; + + default: + // is it the format width? + fmt.Empty(); + while ( *p == _T('-') || *p == _T('+') || + *p == _T(' ') || wxIsdigit(*p) ) + { + fmt += *p; + } + + if ( !fmt.empty() ) + { + // we've only got the flags and width so far in fmt + fmt.Prepend(_T('%')); + fmt.Append(_T('d')); + + restart = true; + + break; + } + + // no, it wasn't the width + wxFAIL_MSG(_T("unknown format specificator")); + + // fall through and just copy it nevertheless + + case _T('%'): // a percent sign + res += *p; + break; + + case 0: // the end of string + wxFAIL_MSG(_T("missing format at the end of string")); + + // just put the '%' which was the last char in format + res += _T('%'); + break; + } + } + } + + return res; +} + +// this function parses a string in (strict) RFC 822 format: see the section 5 +// of the RFC for the detailed description, but briefly it's something of the +// form "Sat, 18 Dec 1999 00:48:30 +0100" +// +// this function is "strict" by design - it must reject anything except true +// RFC822 time specs. +// +// TODO a great candidate for using reg exps +const wxChar *wxDateTime::ParseRfc822Date(const wxChar* date) +{ + wxCHECK_MSG( date, (wxChar *)NULL, _T("NULL pointer in wxDateTime::Parse") ); + + const wxChar *p = date; + const wxChar *comma = wxStrchr(p, _T(',')); + if ( comma ) + { + // the part before comma is the weekday + + // skip it for now - we don't use but might check that it really + // corresponds to the specfied date + p = comma + 1; + + if ( *p != _T(' ') ) + { + wxLogDebug(_T("no space after weekday in RFC822 time spec")); + + return (wxChar *)NULL; + } + + p++; // skip space + } + + // the following 1 or 2 digits are the day number + if ( !wxIsdigit(*p) ) + { + wxLogDebug(_T("day number expected in RFC822 time spec, none found")); + + return (wxChar *)NULL; + } + + wxDateTime_t day = (wxDateTime_t)(*p++ - _T('0')); + if ( wxIsdigit(*p) ) + { + day *= 10; + day = (wxDateTime_t)(day + (*p++ - _T('0'))); + } + + if ( *p++ != _T(' ') ) + { + return (wxChar *)NULL; + } + + // the following 3 letters specify the month + wxString monName(p, 3); + Month mon; + if ( monName == _T("Jan") ) + mon = Jan; + else if ( monName == _T("Feb") ) + mon = Feb; + else if ( monName == _T("Mar") ) + mon = Mar; + else if ( monName == _T("Apr") ) + mon = Apr; + else if ( monName == _T("May") ) + mon = May; + else if ( monName == _T("Jun") ) + mon = Jun; + else if ( monName == _T("Jul") ) + mon = Jul; + else if ( monName == _T("Aug") ) + mon = Aug; + else if ( monName == _T("Sep") ) + mon = Sep; + else if ( monName == _T("Oct") ) + mon = Oct; + else if ( monName == _T("Nov") ) + mon = Nov; + else if ( monName == _T("Dec") ) + mon = Dec; + else + { + wxLogDebug(_T("Invalid RFC 822 month name '%s'"), monName.c_str()); + + return (wxChar *)NULL; + } + + p += 3; + + if ( *p++ != _T(' ') ) + { + return (wxChar *)NULL; + } + + // next is the year + if ( !wxIsdigit(*p) ) + { + // no year? + return (wxChar *)NULL; + } + + int year = *p++ - _T('0'); + + if ( !wxIsdigit(*p) ) + { + // should have at least 2 digits in the year + return (wxChar *)NULL; + } + + year *= 10; + year += *p++ - _T('0'); + + // is it a 2 digit year (as per original RFC 822) or a 4 digit one? + if ( wxIsdigit(*p) ) + { + year *= 10; + year += *p++ - _T('0'); + + if ( !wxIsdigit(*p) ) + { + // no 3 digit years please + return (wxChar *)NULL; + } + + year *= 10; + year += *p++ - _T('0'); + } + + if ( *p++ != _T(' ') ) + { + return (wxChar *)NULL; + } + + // time is in the format hh:mm:ss and seconds are optional + if ( !wxIsdigit(*p) ) + { + return (wxChar *)NULL; + } + + wxDateTime_t hour = (wxDateTime_t)(*p++ - _T('0')); + + if ( !wxIsdigit(*p) ) + { + return (wxChar *)NULL; + } + + hour *= 10; + hour = (wxDateTime_t)(hour + (*p++ - _T('0'))); + + if ( *p++ != _T(':') ) + { + return (wxChar *)NULL; + } + + if ( !wxIsdigit(*p) ) + { + return (wxChar *)NULL; + } + + wxDateTime_t min = (wxDateTime_t)(*p++ - _T('0')); + + if ( !wxIsdigit(*p) ) + { + return (wxChar *)NULL; + } + + min *= 10; + min = (wxDateTime_t)(min + *p++ - _T('0')); + + wxDateTime_t sec = 0; + if ( *p++ == _T(':') ) + { + if ( !wxIsdigit(*p) ) + { + return (wxChar *)NULL; + } + + sec = (wxDateTime_t)(*p++ - _T('0')); + + if ( !wxIsdigit(*p) ) + { + return (wxChar *)NULL; + } + + sec *= 10; + sec = (wxDateTime_t)(sec + *p++ - _T('0')); + } + + if ( *p++ != _T(' ') ) + { + return (wxChar *)NULL; + } + + // and now the interesting part: the timezone + int offset wxDUMMY_INITIALIZE(0); + if ( *p == _T('-') || *p == _T('+') ) + { + // the explicit offset given: it has the form of hhmm + bool plus = *p++ == _T('+'); + + if ( !wxIsdigit(*p) || !wxIsdigit(*(p + 1)) ) + { + return (wxChar *)NULL; + } + + // hours + offset = MIN_PER_HOUR*(10*(*p - _T('0')) + (*(p + 1) - _T('0'))); + + p += 2; + + if ( !wxIsdigit(*p) || !wxIsdigit(*(p + 1)) ) + { + return (wxChar *)NULL; + } + + // minutes + offset += 10*(*p - _T('0')) + (*(p + 1) - _T('0')); + + if ( !plus ) + { + offset = -offset; + } + + p += 2; + } + else + { + // the symbolic timezone given: may be either military timezone or one + // of standard abbreviations + if ( !*(p + 1) ) + { + // military: Z = UTC, J unused, A = -1, ..., Y = +12 + static const int offsets[26] = + { + //A B C D E F G H I J K L M + -1, -2, -3, -4, -5, -6, -7, -8, -9, 0, -10, -11, -12, + //N O P R Q S T U V W Z Y Z + +1, +2, +3, +4, +5, +6, +7, +8, +9, +10, +11, +12, 0 + }; + + if ( *p < _T('A') || *p > _T('Z') || *p == _T('J') ) + { + wxLogDebug(_T("Invalid militaty timezone '%c'"), *p); + + return (wxChar *)NULL; + } + + offset = offsets[*p++ - _T('A')]; + } + else + { + // abbreviation + wxString tz = p; + if ( tz == _T("UT") || tz == _T("UTC") || tz == _T("GMT") ) + offset = 0; + else if ( tz == _T("AST") ) + offset = AST - GMT0; + else if ( tz == _T("ADT") ) + offset = ADT - GMT0; + else if ( tz == _T("EST") ) + offset = EST - GMT0; + else if ( tz == _T("EDT") ) + offset = EDT - GMT0; + else if ( tz == _T("CST") ) + offset = CST - GMT0; + else if ( tz == _T("CDT") ) + offset = CDT - GMT0; + else if ( tz == _T("MST") ) + offset = MST - GMT0; + else if ( tz == _T("MDT") ) + offset = MDT - GMT0; + else if ( tz == _T("PST") ) + offset = PST - GMT0; + else if ( tz == _T("PDT") ) + offset = PDT - GMT0; + else + { + wxLogDebug(_T("Unknown RFC 822 timezone '%s'"), p); + + return (wxChar *)NULL; + } + + p += tz.length(); + } + + // make it minutes + offset *= MIN_PER_HOUR; + } + + // the spec was correct, construct the date from the values we found + Set(day, mon, year, hour, min, sec); + MakeFromTimezone(TimeZone((wxDateTime_t)(offset*SEC_PER_MIN))); + + return p; +} + +#ifdef __WINDOWS__ + +// returns the string containing strftime() format used for short dates in the +// current locale or an empty string +static wxString GetLocaleDateFormat() +{ + wxString fmtWX; + + // there is no setlocale() under Windows CE, so just always query the + // system there +#ifndef __WXWINCE__ + if ( strcmp(setlocale(LC_ALL, NULL), "C") != 0 ) +#endif + { + // The locale was programatically set to non-C. We assume that this was + // done using wxLocale, in which case thread's current locale is also + // set to correct LCID value and we can use GetLocaleInfo to determine + // the correct formatting string: +#ifdef __WXWINCE__ + LCID lcid = LOCALE_USER_DEFAULT; +#else + LCID lcid = GetThreadLocale(); +#endif + // according to MSDN 80 chars is max allowed for short date format + wxChar fmt[81]; + if ( ::GetLocaleInfo(lcid, LOCALE_SSHORTDATE, fmt, WXSIZEOF(fmt)) ) + { + wxChar chLast = _T('\0'); + size_t lastCount = 0; + for ( const wxChar *p = fmt; /* NUL handled inside */; p++ ) + { + if ( *p == chLast ) + { + lastCount++; + continue; + } + + switch ( *p ) + { + // these characters come in groups, start counting them + case _T('d'): + case _T('M'): + case _T('y'): + case _T('g'): + chLast = *p; + lastCount = 1; + break; + + default: + // first deal with any special characters we have had + if ( lastCount ) + { + switch ( chLast ) + { + case _T('d'): + switch ( lastCount ) + { + case 1: // d + case 2: // dd + // these two are the same as we + // don't distinguish between 1 and + // 2 digits for days + fmtWX += _T("%d"); + break; + + case 3: // ddd + fmtWX += _T("%a"); + break; + + case 4: // dddd + fmtWX += _T("%A"); + break; + + default: + wxFAIL_MSG( _T("too many 'd's") ); + } + break; + + case _T('M'): + switch ( lastCount ) + { + case 1: // M + case 2: // MM + // as for 'd' and 'dd' above + fmtWX += _T("%m"); + break; + + case 3: + fmtWX += _T("%b"); + break; + + case 4: + fmtWX += _T("%B"); + break; + + default: + wxFAIL_MSG( _T("too many 'M's") ); + } + break; + + case _T('y'): + switch ( lastCount ) + { + case 1: // y + case 2: // yy + fmtWX += _T("%y"); + break; + + case 4: // yyyy + fmtWX += _T("%Y"); + break; + + default: + wxFAIL_MSG( _T("wrong number of 'y's") ); + } + break; + + case _T('g'): + // strftime() doesn't have era string, + // ignore this format + wxASSERT_MSG( lastCount <= 2, + _T("too many 'g's") ); + break; + + default: + wxFAIL_MSG( _T("unreachable") ); + } + + chLast = _T('\0'); + lastCount = 0; + } + + // not a special character so must be just a separator, + // treat as is + if ( *p != _T('\0') ) + { + if ( *p == _T('%') ) + { + // this one needs to be escaped + fmtWX += _T('%'); + } + + fmtWX += *p; + } + } + + if ( *p == _T('\0') ) + break; + } + } + //else: GetLocaleInfo() failed, leave fmtDate value unchanged and + // try our luck with the default formats + } + //else: default C locale, default formats should work + + return fmtWX; +} + +#endif // __WINDOWS__ + +const wxChar *wxDateTime::ParseFormat(const wxChar *date, + const wxChar *format, + const wxDateTime& dateDef) +{ + wxCHECK_MSG( date && format, (wxChar *)NULL, + _T("NULL pointer in wxDateTime::ParseFormat()") ); + + wxString str; + unsigned long num; + + // what fields have we found? + bool haveWDay = false, + haveYDay = false, + haveDay = false, + haveMon = false, + haveYear = false, + haveHour = false, + haveMin = false, + haveSec = false; + + bool hourIsIn12hFormat = false, // or in 24h one? + isPM = false; // AM by default + + // and the value of the items we have (init them to get rid of warnings) + wxDateTime_t sec = 0, + min = 0, + hour = 0; + WeekDay wday = Inv_WeekDay; + wxDateTime_t yday = 0, + mday = 0; + wxDateTime::Month mon = Inv_Month; + int year = 0; + + const wxChar *input = date; + for ( const wxChar *fmt = format; *fmt; fmt++ ) + { + if ( *fmt != _T('%') ) + { + if ( wxIsspace(*fmt) ) + { + // a white space in the format string matches 0 or more white + // spaces in the input + while ( wxIsspace(*input) ) + { + input++; + } + } + else // !space + { + // any other character (not whitespace, not '%') must be + // matched by itself in the input + if ( *input++ != *fmt ) + { + // no match + return (wxChar *)NULL; + } + } + + // done with this format char + continue; + } + + // start of a format specification + + // parse the optional width + size_t width = 0; + while ( wxIsdigit(*++fmt) ) + { + width *= 10; + width += *fmt - _T('0'); + } + + // the default widths for the various fields + if ( !width ) + { + switch ( *fmt ) + { + case _T('Y'): // year has 4 digits + width = 4; + break; + + case _T('j'): // day of year has 3 digits + case _T('l'): // milliseconds have 3 digits + width = 3; + break; + + case _T('w'): // week day as number has only one + width = 1; + break; + + default: + // default for all other fields + width = 2; + } + } + + // then the format itself + switch ( *fmt ) + { + case _T('a'): // a weekday name + case _T('A'): + { + int flag = *fmt == _T('a') ? Name_Abbr : Name_Full; + wday = GetWeekDayFromName(GetAlphaToken(input), flag); + if ( wday == Inv_WeekDay ) + { + // no match + return (wxChar *)NULL; + } + } + haveWDay = true; + break; + + case _T('b'): // a month name + case _T('B'): + { + int flag = *fmt == _T('b') ? Name_Abbr : Name_Full; + mon = GetMonthFromName(GetAlphaToken(input), flag); + if ( mon == Inv_Month ) + { + // no match + return (wxChar *)NULL; + } + } + haveMon = true; + break; + + case _T('c'): // locale default date and time representation + { + wxDateTime dt; + + // this is the format which corresponds to ctime() output + // and strptime("%c") should parse it, so try it first + static const wxChar *fmtCtime = _T("%a %b %d %H:%M:%S %Y"); + + const wxChar *result = dt.ParseFormat(input, fmtCtime); + if ( !result ) + { + result = dt.ParseFormat(input, _T("%x %X")); + } + + if ( !result ) + { + result = dt.ParseFormat(input, _T("%X %x")); + } + + if ( !result ) + { + // we've tried everything and still no match + return (wxChar *)NULL; + } + + Tm tm = dt.GetTm(); + + haveDay = haveMon = haveYear = + haveHour = haveMin = haveSec = true; + + hour = tm.hour; + min = tm.min; + sec = tm.sec; + + year = tm.year; + mon = tm.mon; + mday = tm.mday; + + input = result; + } + break; + + case _T('d'): // day of a month (01-31) + if ( !GetNumericToken(width, input, &num) || + (num > 31) || (num < 1) ) + { + // no match + return (wxChar *)NULL; + } + + // we can't check whether the day range is correct yet, will + // do it later - assume ok for now + haveDay = true; + mday = (wxDateTime_t)num; + break; + + case _T('H'): // hour in 24h format (00-23) + if ( !GetNumericToken(width, input, &num) || (num > 23) ) + { + // no match + return (wxChar *)NULL; + } + + haveHour = true; + hour = (wxDateTime_t)num; + break; + + case _T('I'): // hour in 12h format (01-12) + if ( !GetNumericToken(width, input, &num) || !num || (num > 12) ) + { + // no match + return (wxChar *)NULL; + } + + haveHour = true; + hourIsIn12hFormat = true; + hour = (wxDateTime_t)(num % 12); // 12 should be 0 + break; + + case _T('j'): // day of the year + if ( !GetNumericToken(width, input, &num) || !num || (num > 366) ) + { + // no match + return (wxChar *)NULL; + } + + haveYDay = true; + yday = (wxDateTime_t)num; + break; + + case _T('m'): // month as a number (01-12) + if ( !GetNumericToken(width, input, &num) || !num || (num > 12) ) + { + // no match + return (wxChar *)NULL; + } + + haveMon = true; + mon = (Month)(num - 1); + break; + + case _T('M'): // minute as a decimal number (00-59) + if ( !GetNumericToken(width, input, &num) || (num > 59) ) + { + // no match + return (wxChar *)NULL; + } + + haveMin = true; + min = (wxDateTime_t)num; + break; + + case _T('p'): // AM or PM string + { + wxString am, pm, token = GetAlphaToken(input); + + GetAmPmStrings(&am, &pm); + if (am.empty() && pm.empty()) + return (wxChar *)NULL; // no am/pm strings defined + if ( token.CmpNoCase(pm) == 0 ) + { + isPM = true; + } + else if ( token.CmpNoCase(am) != 0 ) + { + // no match + return (wxChar *)NULL; + } + } + break; + + case _T('r'): // time as %I:%M:%S %p + { + wxDateTime dt; + input = dt.ParseFormat(input, _T("%I:%M:%S %p")); + if ( !input ) + { + // no match + return (wxChar *)NULL; + } + + haveHour = haveMin = haveSec = true; + + Tm tm = dt.GetTm(); + hour = tm.hour; + min = tm.min; + sec = tm.sec; + } + break; + + case _T('R'): // time as %H:%M + { + wxDateTime dt; + input = dt.ParseFormat(input, _T("%H:%M")); + if ( !input ) + { + // no match + return (wxChar *)NULL; + } + + haveHour = haveMin = true; + + Tm tm = dt.GetTm(); + hour = tm.hour; + min = tm.min; + } + break; + + case _T('S'): // second as a decimal number (00-61) + if ( !GetNumericToken(width, input, &num) || (num > 61) ) + { + // no match + return (wxChar *)NULL; + } + + haveSec = true; + sec = (wxDateTime_t)num; + break; + + case _T('T'): // time as %H:%M:%S + { + wxDateTime dt; + input = dt.ParseFormat(input, _T("%H:%M:%S")); + if ( !input ) + { + // no match + return (wxChar *)NULL; + } + + haveHour = haveMin = haveSec = true; + + Tm tm = dt.GetTm(); + hour = tm.hour; + min = tm.min; + sec = tm.sec; + } + break; + + case _T('w'): // weekday as a number (0-6), Sunday = 0 + if ( !GetNumericToken(width, input, &num) || (wday > 6) ) + { + // no match + return (wxChar *)NULL; + } + + haveWDay = true; + wday = (WeekDay)num; + break; + + case _T('x'): // locale default date representation +#ifdef HAVE_STRPTIME + // try using strptime() -- it may fail even if the input is + // correct but the date is out of range, so we will fall back + // to our generic code anyhow + { + struct tm tm; + + const wxChar *result = CallStrptime(input, "%x", &tm); + if ( result ) + { + input = result; + + haveDay = haveMon = haveYear = true; + + year = 1900 + tm.tm_year; + mon = (Month)tm.tm_mon; + mday = tm.tm_mday; + + break; + } + } +#endif // HAVE_STRPTIME + + { + wxDateTime dt; + wxString fmtDate, + fmtDateAlt; + +#ifdef __WINDOWS__ + // The above doesn't work for all locales, try to query + // Windows for the right way of formatting the date: + fmtDate = GetLocaleDateFormat(); + if ( fmtDate.empty() ) +#endif + { + if ( IsWestEuropeanCountry(GetCountry()) || + GetCountry() == Russia ) + { + fmtDate = _T("%d/%m/%y"); + fmtDateAlt = _T("%m/%d/%y"); + } + else // assume USA + { + fmtDate = _T("%m/%d/%y"); + fmtDateAlt = _T("%d/%m/%y"); + } + } + + const wxChar *result = dt.ParseFormat(input, fmtDate); + + if ( !result && !fmtDateAlt.empty() ) + { + // ok, be nice and try another one + result = dt.ParseFormat(input, fmtDateAlt); + } + + if ( !result ) + { + // bad luck + return (wxChar *)NULL; + } + + Tm tm = dt.GetTm(); + + haveDay = haveMon = haveYear = true; + + year = tm.year; + mon = tm.mon; + mday = tm.mday; + + input = result; + } + + break; + + case _T('X'): // locale default time representation +#ifdef HAVE_STRPTIME + { + // use strptime() to do it for us (FIXME !Unicode friendly) + struct tm tm; + input = CallStrptime(input, "%X", &tm); + if ( !input ) + { + return (wxChar *)NULL; + } + + haveHour = haveMin = haveSec = true; + + hour = tm.tm_hour; + min = tm.tm_min; + sec = tm.tm_sec; + } +#else // !HAVE_STRPTIME + // TODO under Win32 we can query the LOCALE_ITIME system + // setting which says whether the default time format is + // 24 or 12 hour + { + // try to parse what follows as "%H:%M:%S" and, if this + // fails, as "%I:%M:%S %p" - this should catch the most + // common cases + wxDateTime dt; + + const wxChar *result = dt.ParseFormat(input, _T("%T")); + if ( !result ) + { + result = dt.ParseFormat(input, _T("%r")); + } + + if ( !result ) + { + // no match + return (wxChar *)NULL; + } + + haveHour = haveMin = haveSec = true; + + Tm tm = dt.GetTm(); + hour = tm.hour; + min = tm.min; + sec = tm.sec; + + input = result; + } +#endif // HAVE_STRPTIME/!HAVE_STRPTIME + break; + + case _T('y'): // year without century (00-99) + if ( !GetNumericToken(width, input, &num) || (num > 99) ) + { + // no match + return (wxChar *)NULL; + } + + haveYear = true; + + // TODO should have an option for roll over date instead of + // hard coding it here + year = (num > 30 ? 1900 : 2000) + (wxDateTime_t)num; + break; + + case _T('Y'): // year with century + if ( !GetNumericToken(width, input, &num) ) + { + // no match + return (wxChar *)NULL; + } + + haveYear = true; + year = (wxDateTime_t)num; + break; + + case _T('Z'): // timezone name + wxFAIL_MSG(_T("TODO")); + break; + + case _T('%'): // a percent sign + if ( *input++ != _T('%') ) + { + // no match + return (wxChar *)NULL; + } + break; + + case 0: // the end of string + wxFAIL_MSG(_T("unexpected format end")); + + // fall through + + default: // not a known format spec + return (wxChar *)NULL; + } + } + + // format matched, try to construct a date from what we have now + Tm tmDef; + if ( dateDef.IsValid() ) + { + // take this date as default + tmDef = dateDef.GetTm(); + } + else if ( IsValid() ) + { + // if this date is valid, don't change it + tmDef = GetTm(); + } + else + { + // no default and this date is invalid - fall back to Today() + tmDef = Today().GetTm(); + } + + Tm tm = tmDef; + + // set the date + if ( haveYear ) + { + tm.year = year; + } + + // TODO we don't check here that the values are consistent, if both year + // day and month/day were found, we just ignore the year day and we + // also always ignore the week day + if ( haveMon && haveDay ) + { + if ( mday > GetNumOfDaysInMonth(tm.year, mon) ) + { + wxLogDebug(_T("bad month day in wxDateTime::ParseFormat")); + + return (wxChar *)NULL; + } + + tm.mon = mon; + tm.mday = mday; + } + else if ( haveYDay ) + { + if ( yday > GetNumberOfDays(tm.year) ) + { + wxLogDebug(_T("bad year day in wxDateTime::ParseFormat")); + + return (wxChar *)NULL; + } + + Tm tm2 = wxDateTime(1, Jan, tm.year).SetToYearDay(yday).GetTm(); + + tm.mon = tm2.mon; + tm.mday = tm2.mday; + } + + // deal with AM/PM + if ( haveHour && hourIsIn12hFormat && isPM ) + { + // translate to 24hour format + hour += 12; + } + //else: either already in 24h format or no translation needed + + // set the time + if ( haveHour ) + { + tm.hour = hour; + } + + if ( haveMin ) + { + tm.min = min; + } + + if ( haveSec ) + { + tm.sec = sec; + } + + Set(tm); + + // finally check that the week day is consistent -- if we had it + if ( haveWDay && GetWeekDay() != wday ) + { + wxLogDebug(_T("inconsistsnet week day in wxDateTime::ParseFormat()")); + + return NULL; + } + + return input; +} + +const wxChar *wxDateTime::ParseDateTime(const wxChar *date) +{ + wxCHECK_MSG( date, (wxChar *)NULL, _T("NULL pointer in wxDateTime::Parse") ); + + // Set to current day and hour, so strings like '14:00' becomes today at + // 14, not some other random date + wxDateTime dtDate = wxDateTime::Today(); + wxDateTime dtTime = wxDateTime::Today(); + + const wxChar* pchTime; + + // Try to parse the beginning of the string as a date + const wxChar* pchDate = dtDate.ParseDate(date); + + // We got a date in the beginning, see if there is a time specified after the date + if ( pchDate ) + { + // Skip spaces, as the ParseTime() function fails on spaces + while ( wxIsspace(*pchDate) ) + pchDate++; + + pchTime = dtTime.ParseTime(pchDate); + } + else // no date in the beginning + { + // check and see if we have a time followed by a date + pchTime = dtTime.ParseTime(date); + if ( pchTime ) + { + while ( wxIsspace(*pchTime) ) + pchTime++; + + pchDate = dtDate.ParseDate(pchTime); + } + } + + // If we have a date specified, set our own data to the same date + if ( !pchDate || !pchTime ) + return NULL; + + Set(dtDate.GetDay(), dtDate.GetMonth(), dtDate.GetYear(), + dtTime.GetHour(), dtTime.GetMinute(), dtTime.GetSecond(), + dtTime.GetMillisecond()); + + // Return endpoint of scan + return pchDate > pchTime ? pchDate : pchTime; +} + +const wxChar *wxDateTime::ParseDate(const wxChar *date) +{ + // this is a simplified version of ParseDateTime() which understands only + // "today" (for wxDate compatibility) and digits only otherwise (and not + // all esoteric constructions ParseDateTime() knows about) + + wxCHECK_MSG( date, (wxChar *)NULL, _T("NULL pointer in wxDateTime::Parse") ); + + const wxChar *p = date; + while ( wxIsspace(*p) ) + p++; + + // some special cases + static struct + { + const wxChar *str; + int dayDiffFromToday; + } literalDates[] = + { + { wxTRANSLATE("today"), 0 }, + { wxTRANSLATE("yesterday"), -1 }, + { wxTRANSLATE("tomorrow"), 1 }, + }; + + for ( size_t n = 0; n < WXSIZEOF(literalDates); n++ ) + { + const wxString dateStr = wxGetTranslation(literalDates[n].str); + size_t len = dateStr.length(); + if ( wxStrlen(p) >= len ) + { + wxString str(p, len); + if ( str.CmpNoCase(dateStr) == 0 ) + { + // nothing can follow this, so stop here + p += len; + + int dayDiffFromToday = literalDates[n].dayDiffFromToday; + *this = Today(); + if ( dayDiffFromToday ) + { + *this += wxDateSpan::Days(dayDiffFromToday); + } + + return p; + } + } + } + + // We try to guess what we have here: for each new (numeric) token, we + // determine if it can be a month, day or a year. Of course, there is an + // ambiguity as some numbers may be days as well as months, so we also + // have the ability to back track. + + // what do we have? + bool haveDay = false, // the months day? + haveWDay = false, // the day of week? + haveMon = false, // the month? + haveYear = false; // the year? + + // and the value of the items we have (init them to get rid of warnings) + WeekDay wday = Inv_WeekDay; + wxDateTime_t day = 0; + wxDateTime::Month mon = Inv_Month; + int year = 0; + + // tokenize the string + size_t nPosCur = 0; + static const wxChar *dateDelimiters = _T(".,/-\t\r\n "); + wxStringTokenizer tok(p, dateDelimiters); + while ( tok.HasMoreTokens() ) + { + wxString token = tok.GetNextToken(); + if ( !token ) + continue; + + // is it a number? + unsigned long val; + if ( token.ToULong(&val) ) + { + // guess what this number is + + bool isDay = false, + isMonth = false, + isYear = false; + + if ( !haveMon && val > 0 && val <= 12 ) + { + // assume it is month + isMonth = true; + } + else // not the month + { + if ( haveDay ) + { + // this can only be the year + isYear = true; + } + else // may be either day or year + { + // use a leap year if we don't have the year yet to allow + // dates like 2/29/1976 which would be rejected otherwise + wxDateTime_t max_days = (wxDateTime_t)( + haveMon + ? GetNumOfDaysInMonth(haveYear ? year : 1976, mon) + : 31 + ); + + // can it be day? + if ( (val == 0) || (val > (unsigned long)max_days) ) + { + // no + isYear = true; + } + else // yes, suppose it's the day + { + isDay = true; + } + } + } + + if ( isYear ) + { + if ( haveYear ) + break; + + haveYear = true; + + year = (wxDateTime_t)val; + } + else if ( isDay ) + { + if ( haveDay ) + break; + + haveDay = true; + + day = (wxDateTime_t)val; + } + else if ( isMonth ) + { + haveMon = true; + + mon = (Month)(val - 1); + } + } + else // not a number + { + // be careful not to overwrite the current mon value + Month mon2 = GetMonthFromName(token, Name_Full | Name_Abbr); + if ( mon2 != Inv_Month ) + { + // it's a month + if ( haveMon ) + { + // but we already have a month - maybe we guessed wrong? + if ( !haveDay ) + { + // no need to check in month range as always < 12, but + // the days are counted from 1 unlike the months + day = (wxDateTime_t)(mon + 1); + haveDay = true; + } + else + { + // could possible be the year (doesn't the year come + // before the month in the japanese format?) (FIXME) + break; + } + } + + mon = mon2; + + haveMon = true; + } + else // not a valid month name + { + wday = GetWeekDayFromName(token, Name_Full | Name_Abbr); + if ( wday != Inv_WeekDay ) + { + // a week day + if ( haveWDay ) + { + break; + } + + haveWDay = true; + } + else // not a valid weekday name + { + // try the ordinals + static const wxChar *ordinals[] = + { + wxTRANSLATE("first"), + wxTRANSLATE("second"), + wxTRANSLATE("third"), + wxTRANSLATE("fourth"), + wxTRANSLATE("fifth"), + wxTRANSLATE("sixth"), + wxTRANSLATE("seventh"), + wxTRANSLATE("eighth"), + wxTRANSLATE("ninth"), + wxTRANSLATE("tenth"), + wxTRANSLATE("eleventh"), + wxTRANSLATE("twelfth"), + wxTRANSLATE("thirteenth"), + wxTRANSLATE("fourteenth"), + wxTRANSLATE("fifteenth"), + wxTRANSLATE("sixteenth"), + wxTRANSLATE("seventeenth"), + wxTRANSLATE("eighteenth"), + wxTRANSLATE("nineteenth"), + wxTRANSLATE("twentieth"), + // that's enough - otherwise we'd have problems with + // composite (or not) ordinals + }; + + size_t n; + for ( n = 0; n < WXSIZEOF(ordinals); n++ ) + { + if ( token.CmpNoCase(ordinals[n]) == 0 ) + { + break; + } + } + + if ( n == WXSIZEOF(ordinals) ) + { + // stop here - something unknown + break; + } + + // it's a day + if ( haveDay ) + { + // don't try anything here (as in case of numeric day + // above) - the symbolic day spec should always + // precede the month/year + break; + } + + haveDay = true; + + day = (wxDateTime_t)(n + 1); + } + } + } + + nPosCur = tok.GetPosition(); + } + + // either no more tokens or the scan was stopped by something we couldn't + // parse - in any case, see if we can construct a date from what we have + if ( !haveDay && !haveWDay ) + { + wxLogDebug(_T("ParseDate: no day, no weekday hence no date.")); + + return NULL; + } + + if ( haveWDay && (haveMon || haveYear || haveDay) && + !(haveDay && haveMon && haveYear) ) + { + // without adjectives (which we don't support here) the week day only + // makes sense completely separately or with the full date + // specification (what would "Wed 1999" mean?) + return NULL; + } + + if ( !haveWDay && haveYear && !(haveDay && haveMon) ) + { + // may be we have month and day instead of day and year? + if ( haveDay && !haveMon ) + { + if ( day <= 12 ) + { + // exchange day and month + mon = (wxDateTime::Month)(day - 1); + + // we're in the current year then + if ( (year > 0) && (year <= (int)GetNumOfDaysInMonth(Inv_Year, mon)) ) + { + day = (wxDateTime_t)year; + + haveMon = true; + haveYear = false; + } + //else: no, can't exchange, leave haveMon == false + } + } + + if ( !haveMon ) + { + // if we give the year, month and day must be given too + wxLogDebug(_T("ParseDate: day and month should be specified if year is.")); + + return NULL; + } + } + + if ( !haveMon ) + { + mon = GetCurrentMonth(); + } + + if ( !haveYear ) + { + year = GetCurrentYear(); + } + + if ( haveDay ) + { + // normally we check the day above but the check is optimistic in case + // we find the day before its month/year so we have to redo it now + if ( day > GetNumOfDaysInMonth(year, mon) ) + return NULL; + + Set(day, mon, year); + + if ( haveWDay ) + { + // check that it is really the same + if ( GetWeekDay() != wday ) + { + // inconsistency detected + wxLogDebug(_T("ParseDate: inconsistent day/weekday.")); + + return (wxChar *)NULL; + } + } + } + else // haveWDay + { + *this = Today(); + + SetToWeekDayInSameWeek(wday); + } + + // return the pointer to the first unparsed char + p += nPosCur; + if ( nPosCur && wxStrchr(dateDelimiters, *(p - 1)) ) + { + // if we couldn't parse the token after the delimiter, put back the + // delimiter as well + p--; + } + + return p; +} + +const wxChar *wxDateTime::ParseTime(const wxChar *time) +{ + wxCHECK_MSG( time, (wxChar *)NULL, _T("NULL pointer in wxDateTime::Parse") ); + + // first try some extra things + static const struct + { + const wxChar *name; + wxDateTime_t hour; + } stdTimes[] = + { + { wxTRANSLATE("noon"), 12 }, + { wxTRANSLATE("midnight"), 00 }, + // anything else? + }; + + for ( size_t n = 0; n < WXSIZEOF(stdTimes); n++ ) + { + wxString timeString = wxGetTranslation(stdTimes[n].name); + size_t len = timeString.length(); + if ( timeString.CmpNoCase(wxString(time, len)) == 0 ) + { + // casts required by DigitalMars + Set(stdTimes[n].hour, wxDateTime_t(0), wxDateTime_t(0)); + + return time + len; + } + } + + // try all time formats we may think about in the order from longest to + // shortest + + // 12hour with AM/PM? + const wxChar *result = ParseFormat(time, _T("%I:%M:%S %p")); + + if ( !result ) + { + // normally, it's the same, but why not try it? + result = ParseFormat(time, _T("%H:%M:%S")); + } + + if ( !result ) + { + // 12hour with AM/PM but without seconds? + result = ParseFormat(time, _T("%I:%M %p")); + } + + if ( !result ) + { + // without seconds? + result = ParseFormat(time, _T("%H:%M")); + } + + if ( !result ) + { + // just the hour and AM/PM? + result = ParseFormat(time, _T("%I %p")); + } + + if ( !result ) + { + // just the hour? + result = ParseFormat(time, _T("%H")); + } + + if ( !result ) + { + // parse the standard format: normally it is one of the formats above + // but it may be set to something completely different by the user + result = ParseFormat(time, _T("%X")); + } + + // TODO: parse timezones + + return result; +} + +// ---------------------------------------------------------------------------- +// Workdays and holidays support +// ---------------------------------------------------------------------------- + +bool wxDateTime::IsWorkDay(Country WXUNUSED(country)) const +{ + return !wxDateTimeHolidayAuthority::IsHoliday(*this); +} + +// ============================================================================ +// wxDateSpan +// ============================================================================ + +wxDateSpan WXDLLIMPEXP_BASE operator*(int n, const wxDateSpan& ds) +{ + wxDateSpan ds1(ds); + return ds1.Multiply(n); +} + +// ============================================================================ +// wxTimeSpan +// ============================================================================ + +wxTimeSpan WXDLLIMPEXP_BASE operator*(int n, const wxTimeSpan& ts) +{ + return wxTimeSpan(ts).Multiply(n); +} + +// this enum is only used in wxTimeSpan::Format() below but we can't declare +// it locally to the method as it provokes an internal compiler error in egcs +// 2.91.60 when building with -O2 +enum TimeSpanPart +{ + Part_Week, + Part_Day, + Part_Hour, + Part_Min, + Part_Sec, + Part_MSec +}; + +// not all strftime(3) format specifiers make sense here because, for example, +// a time span doesn't have a year nor a timezone +// +// Here are the ones which are supported (all of them are supported by strftime +// as well): +// %H hour in 24 hour format +// %M minute (00 - 59) +// %S second (00 - 59) +// %% percent sign +// +// Also, for MFC CTimeSpan compatibility, we support +// %D number of days +// +// And, to be better than MFC :-), we also have +// %E number of wEeks +// %l milliseconds (000 - 999) +wxString wxTimeSpan::Format(const wxChar *format) const +{ + wxCHECK_MSG( format, wxEmptyString, _T("NULL format in wxTimeSpan::Format") ); + + wxString str; + str.Alloc(wxStrlen(format)); + + // Suppose we have wxTimeSpan ts(1 /* hour */, 2 /* min */, 3 /* sec */) + // + // Then, of course, ts.Format("%H:%M:%S") must return "01:02:03", but the + // question is what should ts.Format("%S") do? The code here returns "3273" + // in this case (i.e. the total number of seconds, not just seconds % 60) + // because, for me, this call means "give me entire time interval in + // seconds" and not "give me the seconds part of the time interval" + // + // If we agree that it should behave like this, it is clear that the + // interpretation of each format specifier depends on the presence of the + // other format specs in the string: if there was "%H" before "%M", we + // should use GetMinutes() % 60, otherwise just GetMinutes() &c + + // we remember the most important unit found so far + TimeSpanPart partBiggest = Part_MSec; + + for ( const wxChar *pch = format; *pch; pch++ ) + { + wxChar ch = *pch; + + if ( ch == _T('%') ) + { + // the start of the format specification of the printf() below + wxString fmtPrefix(_T('%')); + + // the number + long n; + + // the number of digits for the format string, 0 if unused + unsigned digits = 0; + + ch = *++pch; // get the format spec char + switch ( ch ) + { + default: + wxFAIL_MSG( _T("invalid format character") ); + // fall through + + case _T('%'): + str += ch; + + // skip the part below switch + continue; + + case _T('D'): + n = GetDays(); + if ( partBiggest < Part_Day ) + { + n %= DAYS_PER_WEEK; + } + else + { + partBiggest = Part_Day; + } + break; + + case _T('E'): + partBiggest = Part_Week; + n = GetWeeks(); + break; + + case _T('H'): + n = GetHours(); + if ( partBiggest < Part_Hour ) + { + if ( n < 0 ) + { + // the sign has already been taken into account + // when outputting the biggest part + n = -n; + } + + n %= HOURS_PER_DAY; + } + else + { + partBiggest = Part_Hour; + } + + digits = 2; + break; + + case _T('l'): + n = GetMilliseconds().ToLong(); + if ( partBiggest < Part_MSec ) + { + if ( n < 0 ) + n = -n; + + n %= 1000; + } + //else: no need to reset partBiggest to Part_MSec, it is + // the least significant one anyhow + + digits = 3; + break; + + case _T('M'): + n = GetMinutes(); + if ( partBiggest < Part_Min ) + { + if ( n < 0 ) + n = -n; + + n %= MIN_PER_HOUR; + } + else + { + partBiggest = Part_Min; + } + + digits = 2; + break; + + case _T('S'): + n = GetSeconds().ToLong(); + if ( partBiggest < Part_Sec ) + { + if ( n < 0 ) + n = -n; + + n %= SEC_PER_MIN; + } + else + { + partBiggest = Part_Sec; + } + + digits = 2; + break; + } + + if ( digits ) + { + // negative numbers need one extra position for '-' display + if ( n < 0 ) + digits++; + + fmtPrefix << _T("0") << digits; + } + + str += wxString::Format(fmtPrefix + _T("ld"), n); + } + else + { + // normal character, just copy + str += ch; + } + } + + return str; +} + +// ============================================================================ +// wxDateTimeHolidayAuthority and related classes +// ============================================================================ + +#include "wx/arrimpl.cpp" + +WX_DEFINE_OBJARRAY(wxDateTimeArray) + +static int wxCMPFUNC_CONV +wxDateTimeCompareFunc(wxDateTime **first, wxDateTime **second) +{ + wxDateTime dt1 = **first, + dt2 = **second; + + return dt1 == dt2 ? 0 : dt1 < dt2 ? -1 : +1; +} + +// ---------------------------------------------------------------------------- +// wxDateTimeHolidayAuthority +// ---------------------------------------------------------------------------- + +wxHolidayAuthoritiesArray wxDateTimeHolidayAuthority::ms_authorities; + +/* static */ +bool wxDateTimeHolidayAuthority::IsHoliday(const wxDateTime& dt) +{ + size_t count = ms_authorities.size(); + for ( size_t n = 0; n < count; n++ ) + { + if ( ms_authorities[n]->DoIsHoliday(dt) ) + { + return true; + } + } + + return false; +} + +/* static */ +size_t +wxDateTimeHolidayAuthority::GetHolidaysInRange(const wxDateTime& dtStart, + const wxDateTime& dtEnd, + wxDateTimeArray& holidays) +{ + wxDateTimeArray hol; + + holidays.Clear(); + + const size_t countAuth = ms_authorities.size(); + for ( size_t nAuth = 0; nAuth < countAuth; nAuth++ ) + { + ms_authorities[nAuth]->DoGetHolidaysInRange(dtStart, dtEnd, hol); + + WX_APPEND_ARRAY(holidays, hol); + } + + holidays.Sort(wxDateTimeCompareFunc); + + return holidays.size(); +} + +/* static */ +void wxDateTimeHolidayAuthority::ClearAllAuthorities() +{ + WX_CLEAR_ARRAY(ms_authorities); +} + +/* static */ +void wxDateTimeHolidayAuthority::AddAuthority(wxDateTimeHolidayAuthority *auth) +{ + ms_authorities.push_back(auth); +} + +wxDateTimeHolidayAuthority::~wxDateTimeHolidayAuthority() +{ + // required here for Darwin +} + +// ---------------------------------------------------------------------------- +// wxDateTimeWorkDays +// ---------------------------------------------------------------------------- + +bool wxDateTimeWorkDays::DoIsHoliday(const wxDateTime& dt) const +{ + wxDateTime::WeekDay wd = dt.GetWeekDay(); + + return (wd == wxDateTime::Sun) || (wd == wxDateTime::Sat); +} + +size_t wxDateTimeWorkDays::DoGetHolidaysInRange(const wxDateTime& dtStart, + const wxDateTime& dtEnd, + wxDateTimeArray& holidays) const +{ + if ( dtStart > dtEnd ) + { + wxFAIL_MSG( _T("invalid date range in GetHolidaysInRange") ); + + return 0u; + } + + holidays.Empty(); + + // instead of checking all days, start with the first Sat after dtStart and + // end with the last Sun before dtEnd + wxDateTime dtSatFirst = dtStart.GetNextWeekDay(wxDateTime::Sat), + dtSatLast = dtEnd.GetPrevWeekDay(wxDateTime::Sat), + dtSunFirst = dtStart.GetNextWeekDay(wxDateTime::Sun), + dtSunLast = dtEnd.GetPrevWeekDay(wxDateTime::Sun), + dt; + + for ( dt = dtSatFirst; dt <= dtSatLast; dt += wxDateSpan::Week() ) + { + holidays.Add(dt); + } + + for ( dt = dtSunFirst; dt <= dtSunLast; dt += wxDateSpan::Week() ) + { + holidays.Add(dt); + } + + return holidays.GetCount(); +} + +// ============================================================================ +// other helper functions +// ============================================================================ + +// ---------------------------------------------------------------------------- +// iteration helpers: can be used to write a for loop over enum variable like +// this: +// for ( m = wxDateTime::Jan; m < wxDateTime::Inv_Month; wxNextMonth(m) ) +// ---------------------------------------------------------------------------- + +WXDLLIMPEXP_BASE void wxNextMonth(wxDateTime::Month& m) +{ + wxASSERT_MSG( m < wxDateTime::Inv_Month, _T("invalid month") ); + + // no wrapping or the for loop above would never end! + m = (wxDateTime::Month)(m + 1); +} + +WXDLLIMPEXP_BASE void wxPrevMonth(wxDateTime::Month& m) +{ + wxASSERT_MSG( m < wxDateTime::Inv_Month, _T("invalid month") ); + + m = m == wxDateTime::Jan ? wxDateTime::Inv_Month + : (wxDateTime::Month)(m - 1); +} + +WXDLLIMPEXP_BASE void wxNextWDay(wxDateTime::WeekDay& wd) +{ + wxASSERT_MSG( wd < wxDateTime::Inv_WeekDay, _T("invalid week day") ); + + // no wrapping or the for loop above would never end! + wd = (wxDateTime::WeekDay)(wd + 1); +} + +WXDLLIMPEXP_BASE void wxPrevWDay(wxDateTime::WeekDay& wd) +{ + wxASSERT_MSG( wd < wxDateTime::Inv_WeekDay, _T("invalid week day") ); + + wd = wd == wxDateTime::Sun ? wxDateTime::Inv_WeekDay + : (wxDateTime::WeekDay)(wd - 1); +} + +#endif // wxUSE_DATETIME diff --git a/Externals/wxWidgets/src/common/datstrm.cpp b/Externals/wxWidgets/src/common/datstrm.cpp new file mode 100644 index 0000000000..760dd852ec --- /dev/null +++ b/Externals/wxWidgets/src/common/datstrm.cpp @@ -0,0 +1,743 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/datstrm.cpp +// Purpose: Data stream classes +// Author: Guilhem Lavaux +// Modified by: Mickael Gilabert +// Created: 28/06/98 +// RCS-ID: $Id: datstrm.cpp 39745 2006-06-15 17:58:49Z ABX $ +// Copyright: (c) Guilhem Lavaux +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_STREAMS + +#include "wx/datstrm.h" + +#ifndef WX_PRECOMP + #include "wx/math.h" +#endif //WX_PRECOMP + +// --------------------------------------------------------------------------- +// wxDataInputStream +// --------------------------------------------------------------------------- + +#if wxUSE_UNICODE +wxDataInputStream::wxDataInputStream(wxInputStream& s, const wxMBConv& conv) + : m_input(&s), m_be_order(false), m_conv(conv.Clone()) +#else +wxDataInputStream::wxDataInputStream(wxInputStream& s) + : m_input(&s), m_be_order(false) +#endif +{ +} + +wxDataInputStream::~wxDataInputStream() +{ +#if wxUSE_UNICODE + delete m_conv; +#endif // wxUSE_UNICODE +} + +#if wxHAS_INT64 +wxUint64 wxDataInputStream::Read64() +{ + wxUint64 tmp; + Read64(&tmp, 1); + return tmp; +} +#endif // wxHAS_INT64 + +wxUint32 wxDataInputStream::Read32() +{ + wxUint32 i32; + + m_input->Read(&i32, 4); + + if (m_be_order) + return wxUINT32_SWAP_ON_LE(i32); + else + return wxUINT32_SWAP_ON_BE(i32); +} + +wxUint16 wxDataInputStream::Read16() +{ + wxUint16 i16; + + m_input->Read(&i16, 2); + + if (m_be_order) + return wxUINT16_SWAP_ON_LE(i16); + else + return wxUINT16_SWAP_ON_BE(i16); +} + +wxUint8 wxDataInputStream::Read8() +{ + wxUint8 buf; + + m_input->Read(&buf, 1); + return (wxUint8)buf; +} + +double wxDataInputStream::ReadDouble() +{ +#if wxUSE_APPLE_IEEE + char buf[10]; + + m_input->Read(buf, 10); + return ConvertFromIeeeExtended((const wxInt8 *)buf); +#else + return 0.0; +#endif +} + +wxString wxDataInputStream::ReadString() +{ + size_t len; + + len = Read32(); + + if (len > 0) + { +#if wxUSE_UNICODE + wxCharBuffer tmp(len + 1); + m_input->Read(tmp.data(), len); + tmp.data()[len] = '\0'; + wxString ret(m_conv->cMB2WX(tmp.data())); +#else + wxString ret; + m_input->Read( wxStringBuffer(ret, len), len); +#endif + return ret; + } + else + return wxEmptyString; +} + +#if wxUSE_LONGLONG + +template +static +void DoReadLL(T *buffer, size_t size, wxInputStream *input, bool be_order) +{ + typedef T DataType; + unsigned char *pchBuffer = new unsigned char[size * 8]; + // TODO: Check for overflow when size is of type uint and is > than 512m + input->Read(pchBuffer, size * 8); + size_t idx_base = 0; + if ( be_order ) + { + for ( size_t uiIndex = 0; uiIndex != size; ++uiIndex ) + { + buffer[uiIndex] = 0l; + for ( unsigned ui = 0; ui != 8; ++ui ) + { + buffer[uiIndex] = buffer[uiIndex] * 256l + + DataType((unsigned long) pchBuffer[idx_base + ui]); + } + + idx_base += 8; + } + } + else // little endian + { + for ( size_t uiIndex=0; uiIndex!=size; ++uiIndex ) + { + buffer[uiIndex] = 0l; + for ( unsigned ui=0; ui!=8; ++ui ) + buffer[uiIndex] = buffer[uiIndex] * 256l + + DataType((unsigned long) pchBuffer[idx_base + 7 - ui]); + idx_base += 8; + } + } + delete[] pchBuffer; +} + +template +static void DoWriteLL(const T *buffer, size_t size, wxOutputStream *output, bool be_order) +{ + typedef T DataType; + unsigned char *pchBuffer = new unsigned char[size * 8]; + size_t idx_base = 0; + if ( be_order ) + { + for ( size_t uiIndex = 0; uiIndex != size; ++uiIndex ) + { + DataType i64 = buffer[uiIndex]; + for ( unsigned ui = 0; ui != 8; ++ui ) + { + pchBuffer[idx_base + 7 - ui] = + (unsigned char) (i64.GetLo() & 255l); + i64 >>= 8l; + } + + idx_base += 8; + } + } + else // little endian + { + for ( size_t uiIndex=0; uiIndex != size; ++uiIndex ) + { + DataType i64 = buffer[uiIndex]; + for (unsigned ui=0; ui!=8; ++ui) + { + pchBuffer[idx_base + ui] = + (unsigned char) (i64.GetLo() & 255l); + i64 >>= 8l; + } + + idx_base += 8; + } + } + + // TODO: Check for overflow when size is of type uint and is > than 512m + output->Write(pchBuffer, size * 8); + delete[] pchBuffer; +} + +#endif // wxUSE_LONGLONG + +#ifdef wxLongLong_t + +template +static +void DoReadI64(T *buffer, size_t size, wxInputStream *input, bool be_order) +{ + typedef T DataType; + unsigned char *pchBuffer = (unsigned char*) buffer; + // TODO: Check for overflow when size is of type uint and is > than 512m + input->Read(pchBuffer, size * 8); + if ( be_order ) + { + for ( wxUint32 i = 0; i < size; i++ ) + { + DataType v = wxUINT64_SWAP_ON_LE(*buffer); + *(buffer++) = v; + } + } + else // little endian + { + for ( wxUint32 i=0; i +static +void DoWriteI64(const T *buffer, size_t size, wxOutputStream *output, bool be_order) +{ + typedef T DataType; + if ( be_order ) + { + for ( size_t i = 0; i < size; i++ ) + { + DataType i64 = wxUINT64_SWAP_ON_LE(*buffer); + buffer++; + output->Write(&i64, 8); + } + } + else // little endian + { + for ( size_t i=0; i < size; i++ ) + { + DataType i64 = wxUINT64_SWAP_ON_BE(*buffer); + buffer++; + output->Write(&i64, 8); + } + } +} + +#endif // wxLongLong_t + + +#if wxHAS_INT64 +void wxDataInputStream::Read64(wxUint64 *buffer, size_t size) +{ +#ifndef wxLongLong_t + DoReadLL(buffer, size, m_input, m_be_order); +#else + DoReadI64(buffer, size, m_input, m_be_order); +#endif +} + +void wxDataInputStream::Read64(wxInt64 *buffer, size_t size) +{ +#ifndef wxLongLong_t + DoReadLL(buffer, size, m_input, m_be_order); +#else + DoReadI64(buffer, size, m_input, m_be_order); +#endif +} +#endif // wxHAS_INT64 + +#if defined(wxLongLong_t) && wxUSE_LONGLONG +void wxDataInputStream::Read64(wxULongLong *buffer, size_t size) +{ + DoReadLL(buffer, size, m_input, m_be_order); +} + +void wxDataInputStream::Read64(wxLongLong *buffer, size_t size) +{ + DoReadLL(buffer, size, m_input, m_be_order); +} +#endif // wxLongLong_t + +#if wxUSE_LONGLONG +void wxDataInputStream::ReadLL(wxULongLong *buffer, size_t size) +{ + DoReadLL(buffer, size, m_input, m_be_order); +} + +void wxDataInputStream::ReadLL(wxLongLong *buffer, size_t size) +{ + DoReadLL(buffer, size, m_input, m_be_order); +} + +wxLongLong wxDataInputStream::ReadLL(void) +{ + wxLongLong ll; + DoReadLL(&ll, (size_t)1, m_input, m_be_order); + return ll; +} +#endif // wxUSE_LONGLONG + +void wxDataInputStream::Read32(wxUint32 *buffer, size_t size) +{ + m_input->Read(buffer, size * 4); + + if (m_be_order) + { + for (wxUint32 i=0; iRead(buffer, size * 2); + + if (m_be_order) + { + for (wxUint32 i=0; iRead(buffer, size); +} + +void wxDataInputStream::ReadDouble(double *buffer, size_t size) +{ + for (wxUint32 i=0; i>(wxString& s) +{ + s = ReadString(); + return *this; +} + +wxDataInputStream& wxDataInputStream::operator>>(wxInt8& c) +{ + c = (wxInt8)Read8(); + return *this; +} + +wxDataInputStream& wxDataInputStream::operator>>(wxInt16& i) +{ + i = (wxInt16)Read16(); + return *this; +} + +wxDataInputStream& wxDataInputStream::operator>>(wxInt32& i) +{ + i = (wxInt32)Read32(); + return *this; +} + +wxDataInputStream& wxDataInputStream::operator>>(wxUint8& c) +{ + c = Read8(); + return *this; +} + +wxDataInputStream& wxDataInputStream::operator>>(wxUint16& i) +{ + i = Read16(); + return *this; +} + +wxDataInputStream& wxDataInputStream::operator>>(wxUint32& i) +{ + i = Read32(); + return *this; +} + +#if wxHAS_INT64 +wxDataInputStream& wxDataInputStream::operator>>(wxUint64& i) +{ + i = Read64(); + return *this; +} + +wxDataInputStream& wxDataInputStream::operator>>(wxInt64& i) +{ + i = Read64(); + return *this; +} +#endif // wxHAS_INT64 + +#if defined(wxLongLong_t) && wxUSE_LONGLONG +wxDataInputStream& wxDataInputStream::operator>>(wxULongLong& i) +{ + i = ReadLL(); + return *this; +} + +wxDataInputStream& wxDataInputStream::operator>>(wxLongLong& i) +{ + i = ReadLL(); + return *this; +} +#endif // wxLongLong_t + +wxDataInputStream& wxDataInputStream::operator>>(double& i) +{ + i = ReadDouble(); + return *this; +} + +wxDataInputStream& wxDataInputStream::operator>>(float& f) +{ + f = (float)ReadDouble(); + return *this; +} + +// --------------------------------------------------------------------------- +// wxDataOutputStream +// --------------------------------------------------------------------------- + +#if wxUSE_UNICODE +wxDataOutputStream::wxDataOutputStream(wxOutputStream& s, const wxMBConv& conv) + : m_output(&s), m_be_order(false), m_conv(conv.Clone()) +#else +wxDataOutputStream::wxDataOutputStream(wxOutputStream& s) + : m_output(&s), m_be_order(false) +#endif +{ +} + +wxDataOutputStream::~wxDataOutputStream() +{ +#if wxUSE_UNICODE + delete m_conv; +#endif // wxUSE_UNICODE +} + +#if wxHAS_INT64 +void wxDataOutputStream::Write64(wxUint64 i) +{ + Write64(&i, 1); +} + +void wxDataOutputStream::Write64(wxInt64 i) +{ + Write64(&i, 1); +} +#endif // wxHAS_INT64 + +void wxDataOutputStream::Write32(wxUint32 i) +{ + wxUint32 i32; + + if (m_be_order) + i32 = wxUINT32_SWAP_ON_LE(i); + else + i32 = wxUINT32_SWAP_ON_BE(i); + m_output->Write(&i32, 4); +} + +void wxDataOutputStream::Write16(wxUint16 i) +{ + wxUint16 i16; + + if (m_be_order) + i16 = wxUINT16_SWAP_ON_LE(i); + else + i16 = wxUINT16_SWAP_ON_BE(i); + + m_output->Write(&i16, 2); +} + +void wxDataOutputStream::Write8(wxUint8 i) +{ + m_output->Write(&i, 1); +} + +void wxDataOutputStream::WriteString(const wxString& string) +{ +#if wxUSE_UNICODE + const wxWX2MBbuf buf = string.mb_str(*m_conv); +#else + const wxWX2MBbuf buf = string.mb_str(); +#endif + size_t len = strlen(buf); + Write32(len); + if (len > 0) + m_output->Write(buf, len); +} + +void wxDataOutputStream::WriteDouble(double d) +{ + char buf[10]; + +#if wxUSE_APPLE_IEEE + ConvertToIeeeExtended(d, (wxInt8 *)buf); +#else +#if !defined(__VMS__) && !defined(__GNUG__) +# pragma warning "wxDataOutputStream::WriteDouble() not using IeeeExtended - will not work!" +#endif + buf[0] = '\0'; +#endif + m_output->Write(buf, 10); +} + +#if wxHAS_INT64 +void wxDataOutputStream::Write64(const wxUint64 *buffer, size_t size) +{ +#ifndef wxLongLong_t + DoWriteLL(buffer, size, m_output, m_be_order); +#else + DoWriteI64(buffer, size, m_output, m_be_order); +#endif +} + +void wxDataOutputStream::Write64(const wxInt64 *buffer, size_t size) +{ +#ifndef wxLongLong_t + DoWriteLL(buffer, size, m_output, m_be_order); +#else + DoWriteI64(buffer, size, m_output, m_be_order); +#endif +} +#endif // wxHAS_INT64 + +#if defined(wxLongLong_t) && wxUSE_LONGLONG +void wxDataOutputStream::Write64(const wxULongLong *buffer, size_t size) +{ + DoWriteLL(buffer, size, m_output, m_be_order); +} + +void wxDataOutputStream::Write64(const wxLongLong *buffer, size_t size) +{ + DoWriteLL(buffer, size, m_output, m_be_order); +} +#endif // wxLongLong_t + +#if wxUSE_LONGLONG +void wxDataOutputStream::WriteLL(const wxULongLong *buffer, size_t size) +{ + DoWriteLL(buffer, size, m_output, m_be_order); +} + +void wxDataOutputStream::WriteLL(const wxLongLong *buffer, size_t size) +{ + DoWriteLL(buffer, size, m_output, m_be_order); +} + +void wxDataOutputStream::WriteLL(const wxLongLong &ll) +{ + WriteLL(&ll, 1); +} + +void wxDataOutputStream::WriteLL(const wxULongLong &ll) +{ + WriteLL(&ll, 1); +} +#endif // wxUSE_LONGLONG + +void wxDataOutputStream::Write32(const wxUint32 *buffer, size_t size) +{ + if (m_be_order) + { + for (wxUint32 i=0; iWrite(&i32, 4); + } + } + else + { + for (wxUint32 i=0; iWrite(&i32, 4); + } + } +} + +void wxDataOutputStream::Write16(const wxUint16 *buffer, size_t size) +{ + if (m_be_order) + { + for (wxUint32 i=0; iWrite(&i16, 2); + } + } + else + { + for (wxUint32 i=0; iWrite(&i16, 2); + } + } +} + +void wxDataOutputStream::Write8(const wxUint8 *buffer, size_t size) +{ + m_output->Write(buffer, size); +} + +void wxDataOutputStream::WriteDouble(const double *buffer, size_t size) +{ + for (wxUint32 i=0; iWrite((const char *)string, wxStrlen(string)*sizeof(wxChar)); + return *this; +} + +wxDataOutputStream& wxDataOutputStream::operator<<(const wxString& string) +{ + WriteString(string); + return *this; +} + +wxDataOutputStream& wxDataOutputStream::operator<<(wxInt8 c) +{ + Write8((wxUint8)c); + return *this; +} + +wxDataOutputStream& wxDataOutputStream::operator<<(wxInt16 i) +{ + Write16((wxUint16)i); + return *this; +} + +wxDataOutputStream& wxDataOutputStream::operator<<(wxInt32 i) +{ + Write32((wxUint32)i); + return *this; +} + +wxDataOutputStream& wxDataOutputStream::operator<<(wxUint8 c) +{ + Write8(c); + return *this; +} + +wxDataOutputStream& wxDataOutputStream::operator<<(wxUint16 i) +{ + Write16(i); + return *this; +} + +wxDataOutputStream& wxDataOutputStream::operator<<(wxUint32 i) +{ + Write32(i); + return *this; +} + +#if wxHAS_INT64 +wxDataOutputStream& wxDataOutputStream::operator<<(wxUint64 i) +{ + Write64(i); + return *this; +} + +wxDataOutputStream& wxDataOutputStream::operator<<(wxInt64 i) +{ + Write64(i); + return *this; +} +#endif // wxHAS_INT64 + +#if defined(wxLongLong_t) && wxUSE_LONGLONG +wxDataOutputStream& wxDataOutputStream::operator<<(const wxULongLong &i) +{ + WriteLL(i); + return *this; +} + +wxDataOutputStream& wxDataOutputStream::operator<<(const wxLongLong &i) +{ + WriteLL(i); + return *this; +} +#endif // wxLongLong_t + +wxDataOutputStream& wxDataOutputStream::operator<<(double f) +{ + WriteDouble(f); + return *this; +} + +wxDataOutputStream& wxDataOutputStream::operator<<(float f) +{ + WriteDouble((double)f); + return *this; +} + +#endif + // wxUSE_STREAMS diff --git a/Externals/wxWidgets/src/common/db.cpp b/Externals/wxWidgets/src/common/db.cpp new file mode 100644 index 0000000000..72474fdc66 --- /dev/null +++ b/Externals/wxWidgets/src/common/db.cpp @@ -0,0 +1,4524 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/common/db.cpp +// Purpose: Implementation of the wxDb class. The wxDb class represents a connection +// to an ODBC data source. The wxDb class allows operations on the data +// source such as opening and closing the data source. +// Author: Doug Card +// Modified by: George Tasker +// Bart Jourquin +// Mark Johnson, wxWindows@mj10777.de +// Mods: Dec, 1998: +// -Added support for SQL statement logging and database cataloging +// Mods: April, 1999 +// -Added QUERY_ONLY mode support to reduce default number of cursors +// -Added additional SQL logging code +// -Added DEBUG-ONLY tracking of wxTable objects to detect orphaned DB connections +// -Set ODBC option to only read committed writes to the DB so all +// databases operate the same in that respect +// Created: 9.96 +// RCS-ID: $Id: db.cpp 48685 2007-09-14 19:02:28Z VZ $ +// Copyright: (c) 1996 Remstar International, Inc. +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_ODBC + +#ifndef WX_PRECOMP + #include "wx/object.h" + #include "wx/list.h" + #include "wx/string.h" + #include "wx/utils.h" + #include "wx/log.h" + #include "wx/app.h" +#endif + +#ifdef DBDEBUG_CONSOLE + #include "wx/ioswrap.h" +#endif + +#include "wx/filefn.h" +#include "wx/wxchar.h" + +#include +#include +#include +#include +#include + +#include "wx/db.h" + +// DLL options compatibility check: +WX_CHECK_BUILD_OPTIONS("wxODBC") + +WXDLLIMPEXP_DATA_ODBC(wxDbList*) PtrBegDbList = 0; + +wxChar const *SQL_LOG_FILENAME = wxT("sqllog.txt"); +wxChar const *SQL_CATALOG_FILENAME = wxT("catalog.txt"); + +#ifdef __WXDEBUG__ + #include "wx/thread.h" + + extern wxList TablesInUse; +#if wxUSE_THREADS + extern wxCriticalSection csTablesInUse; +#endif // wxUSE_THREADS +#endif + +// SQL Log defaults to be used by GetDbConnection +wxDbSqlLogState SQLLOGstate = sqlLogOFF; + +static wxString SQLLOGfn = SQL_LOG_FILENAME; + +// The wxDb::errorList is copied to this variable when the wxDb object +// is closed. This way, the error list is still available after the +// database object is closed. This is necessary if the database +// connection fails so the calling application can show the operator +// why the connection failed. Note: as each wxDb object is closed, it +// will overwrite the errors of the previously destroyed wxDb object in +// this variable. NOTE: This occurs during a CLOSE, not a FREEing of the +// connection +wxChar DBerrorList[DB_MAX_ERROR_HISTORY][DB_MAX_ERROR_MSG_LEN+1]; + + +// This type defines the return row-struct form +// SQLTablePrivileges, and is used by wxDB::TablePrivileges. +typedef struct +{ + wxChar tableQual[128+1]; + wxChar tableOwner[128+1]; + wxChar tableName[128+1]; + wxChar grantor[128+1]; + wxChar grantee[128+1]; + wxChar privilege[128+1]; + wxChar grantable[3+1]; +} wxDbTablePrivilegeInfo; + + +/********** wxDbConnectInf Constructor - form 1 **********/ +wxDbConnectInf::wxDbConnectInf() +{ + Henv = 0; + freeHenvOnDestroy = false; + + Initialize(); +} // Constructor + + +/********** wxDbConnectInf Constructor - form 2 **********/ +wxDbConnectInf::wxDbConnectInf(HENV henv, const wxString &dsn, const wxString &userID, + const wxString &password, const wxString &defaultDir, + const wxString &fileType, const wxString &description) +{ + Henv = 0; + freeHenvOnDestroy = false; + + Initialize(); + + if (henv) + SetHenv(henv); + else + AllocHenv(); + + SetDsn(dsn); + SetUserID(userID); + SetPassword(password); + SetDescription(description); + SetFileType(fileType); + SetDefaultDir(defaultDir); +} // wxDbConnectInf Constructor + + +wxDbConnectInf::~wxDbConnectInf() +{ + if (freeHenvOnDestroy) + { + FreeHenv(); + } +} // wxDbConnectInf Destructor + + + +/********** wxDbConnectInf::Initialize() **********/ +bool wxDbConnectInf::Initialize() +{ + freeHenvOnDestroy = false; + + if (freeHenvOnDestroy && Henv) + FreeHenv(); + + Henv = 0; + Dsn[0] = 0; + Uid[0] = 0; + AuthStr[0] = 0; + ConnectionStr[0] = 0; + Description.Empty(); + FileType.Empty(); + DefaultDir.Empty(); + + useConnectionStr = false; + + return true; +} // wxDbConnectInf::Initialize() + + +/********** wxDbConnectInf::AllocHenv() **********/ +bool wxDbConnectInf::AllocHenv() +{ + // This is here to help trap if you are getting a new henv + // without releasing an existing henv + wxASSERT(!Henv); + + // Initialize the ODBC Environment for Database Operations + if (SQLAllocEnv(&Henv) != SQL_SUCCESS) + { + wxLogDebug(wxT("A problem occurred while trying to get a connection to the data source")); + return false; + } + + freeHenvOnDestroy = true; + + return true; +} // wxDbConnectInf::AllocHenv() + + +void wxDbConnectInf::FreeHenv() +{ + wxASSERT(Henv); + + if (Henv) + SQLFreeEnv(Henv); + + Henv = 0; + freeHenvOnDestroy = false; + +} // wxDbConnectInf::FreeHenv() + + +void wxDbConnectInf::SetDsn(const wxString &dsn) +{ + wxASSERT(dsn.length() < WXSIZEOF(Dsn)); + + wxStrncpy(Dsn, dsn, WXSIZEOF(Dsn)-1); + Dsn[WXSIZEOF(Dsn)-1] = 0; // Prevent buffer overrun +} // wxDbConnectInf::SetDsn() + + +void wxDbConnectInf::SetUserID(const wxString &uid) +{ + wxASSERT(uid.length() < WXSIZEOF(Uid)); + wxStrncpy(Uid, uid, WXSIZEOF(Uid)-1); + Uid[WXSIZEOF(Uid)-1] = 0; // Prevent buffer overrun +} // wxDbConnectInf::SetUserID() + + +void wxDbConnectInf::SetPassword(const wxString &password) +{ + wxASSERT(password.length() < WXSIZEOF(AuthStr)); + + wxStrncpy(AuthStr, password, WXSIZEOF(AuthStr)-1); + AuthStr[WXSIZEOF(AuthStr)-1] = 0; // Prevent buffer overrun +} // wxDbConnectInf::SetPassword() + +void wxDbConnectInf::SetConnectionStr(const wxString &connectStr) +{ + wxASSERT(connectStr.length() < WXSIZEOF(ConnectionStr)); + + useConnectionStr = wxStrlen(connectStr) > 0; + + wxStrncpy(ConnectionStr, connectStr, WXSIZEOF(ConnectionStr)-1); + ConnectionStr[WXSIZEOF(ConnectionStr)-1] = 0; // Prevent buffer overrun +} // wxDbConnectInf::SetConnectionStr() + + +/********** wxDbColFor Constructor **********/ +wxDbColFor::wxDbColFor() +{ + Initialize(); +} // wxDbColFor::wxDbColFor() + + +/********** wxDbColFor::Initialize() **********/ +void wxDbColFor::Initialize() +{ + s_Field.Empty(); + int i; + for (i=0; i<7; i++) + { + s_Format[i].Empty(); + s_Amount[i].Empty(); + i_Amount[i] = 0; + } + i_Nation = 0; // 0=EU, 1=UK, 2=International, 3=US + i_dbDataType = 0; + i_sqlDataType = 0; + Format(1,DB_DATA_TYPE_VARCHAR,0,0,0); // the Function that does the work +} // wxDbColFor::Initialize() + + +/********** wxDbColFor::Format() **********/ +int wxDbColFor::Format(int Nation, int dbDataType, SWORD sqlDataType, + short columnLength, short decimalDigits) +{ + // ---------------------------------------------------------------------------------------- + // -- 19991224 : mj10777 : Create + // There is still a lot of work to do here, but it is a start + // It handles all the basic data-types that I have run into up to now + // The main work will have be with Dates and float Formatting + // (US 1,000.00 ; EU 1.000,00) + // There are wxWindow plans for locale support and the new wxDateTime. If + // they define some constants (wxEUROPEAN) that can be gloably used, + // they should be used here. + // ---------------------------------------------------------------------------------------- + // There should also be a function to scan in a string to fill the variable + // ---------------------------------------------------------------------------------------- + wxString tempStr; + i_Nation = Nation; // 0 = timestamp , 1=EU, 2=UK, 3=International, 4=US + i_dbDataType = dbDataType; + i_sqlDataType = sqlDataType; + s_Field.Printf(wxT("%s%d"),s_Amount[1].c_str(),i_Amount[1]); // OK for VARCHAR, INTEGER and FLOAT + + if (i_dbDataType == 0) // Filter unsupported dbDataTypes + { + if ((i_sqlDataType == SQL_VARCHAR) +#if wxUSE_UNICODE + #if defined(SQL_WCHAR) + || (i_sqlDataType == SQL_WCHAR) + #endif + #if defined(SQL_WVARCHAR) + || (i_sqlDataType == SQL_WVARCHAR) + #endif +#endif + || (i_sqlDataType == SQL_LONGVARCHAR)) + i_dbDataType = DB_DATA_TYPE_VARCHAR; + if ((i_sqlDataType == SQL_C_DATE) || (i_sqlDataType == SQL_C_TIMESTAMP)) + i_dbDataType = DB_DATA_TYPE_DATE; + if (i_sqlDataType == SQL_C_BIT) + i_dbDataType = DB_DATA_TYPE_INTEGER; + if (i_sqlDataType == SQL_NUMERIC) + i_dbDataType = DB_DATA_TYPE_VARCHAR; // glt - ??? is this right? + if (i_sqlDataType == SQL_REAL) + i_dbDataType = DB_DATA_TYPE_FLOAT; + if (i_sqlDataType == SQL_C_BINARY) + i_dbDataType = DB_DATA_TYPE_BLOB; + } + + if ((i_dbDataType == DB_DATA_TYPE_INTEGER) && (i_sqlDataType == SQL_C_DOUBLE)) + { // DBASE Numeric + i_dbDataType = DB_DATA_TYPE_FLOAT; + } + + switch(i_dbDataType) // TBD: Still a lot of proper formatting to do + { + case DB_DATA_TYPE_VARCHAR: + s_Field = wxT("%s"); + break; + case DB_DATA_TYPE_INTEGER: + s_Field = wxT("%d"); + break; + case DB_DATA_TYPE_FLOAT: + if (decimalDigits == 0) + decimalDigits = 2; + tempStr.Printf(wxT("%%%d.%d"), columnLength, decimalDigits); + s_Field.Printf(wxT("%sf"), tempStr.c_str()); + break; + case DB_DATA_TYPE_DATE: + if (i_Nation == 0) // timestamp YYYY-MM-DD HH:MM:SS.SSS (tested for SYBASE) + { + s_Field = wxT("%04d-%02d-%02d %02d:%02d:%02d.%03d"); + } + if (i_Nation == 1) // European DD.MM.YYYY HH:MM:SS.SSS + { + s_Field = wxT("%02d.%02d.%04d %02d:%02d:%02d.%03d"); + } + if (i_Nation == 2) // UK DD/MM/YYYY HH:MM:SS.SSS + { + s_Field = wxT("%02d/%02d/%04d %02d:%02d:%02d.%03d"); + } + if (i_Nation == 3) // International YYYY-MM-DD HH:MM:SS.SSS + { + s_Field = wxT("%04d-%02d-%02d %02d:%02d:%02d.%03d"); + } + if (i_Nation == 4) // US MM/DD/YYYY HH:MM:SS.SSS + { + s_Field = wxT("%02d/%02d/%04d %02d:%02d:%02d.%03d"); + } + break; + case DB_DATA_TYPE_BLOB: + s_Field.Printf(wxT("Unable to format(%d)-SQL(%d)"), dbDataType,sqlDataType); // + break; + default: + s_Field.Printf(wxT("Unknown Format(%d)-SQL(%d)"), dbDataType,sqlDataType); // + break; + }; + return TRUE; +} // wxDbColFor::Format() + + +/********** wxDbColInf Constructor **********/ +wxDbColInf::wxDbColInf() +{ + Initialize(); +} // wxDbColInf::wxDbColInf() + + +/********** wxDbColInf Destructor ********/ +wxDbColInf::~wxDbColInf() +{ + if (pColFor) + delete pColFor; + pColFor = NULL; +} // wxDbColInf::~wxDbColInf() + + +bool wxDbColInf::Initialize() +{ + catalog[0] = 0; + schema[0] = 0; + tableName[0] = 0; + colName[0] = 0; + sqlDataType = 0; + typeName[0] = 0; + columnLength = 0; + bufferSize = 0; + decimalDigits = 0; + numPrecRadix = 0; + nullable = 0; + remarks[0] = 0; + dbDataType = 0; + PkCol = 0; + PkTableName[0] = 0; + FkCol = 0; + FkTableName[0] = 0; + pColFor = NULL; + + return true; +} // wxDbColInf::Initialize() + + +/********** wxDbTableInf Constructor ********/ +wxDbTableInf::wxDbTableInf() +{ + Initialize(); +} // wxDbTableInf::wxDbTableInf() + + +/********** wxDbTableInf Constructor ********/ +wxDbTableInf::~wxDbTableInf() +{ + if (pColInf) + delete [] pColInf; + pColInf = NULL; +} // wxDbTableInf::~wxDbTableInf() + + +bool wxDbTableInf::Initialize() +{ + tableName[0] = 0; + tableType[0] = 0; + tableRemarks[0] = 0; + numCols = 0; + pColInf = NULL; + + return true; +} // wxDbTableInf::Initialize() + + +/********** wxDbInf Constructor *************/ +wxDbInf::wxDbInf() +{ + Initialize(); +} // wxDbInf::wxDbInf() + + +/********** wxDbInf Destructor *************/ +wxDbInf::~wxDbInf() +{ + if (pTableInf) + delete [] pTableInf; + pTableInf = NULL; +} // wxDbInf::~wxDbInf() + + +/********** wxDbInf::Initialize() *************/ +bool wxDbInf::Initialize() +{ + catalog[0] = 0; + schema[0] = 0; + numTables = 0; + pTableInf = NULL; + + return true; +} // wxDbInf::Initialize() + + +/********** wxDb Constructor **********/ +wxDb::wxDb(const HENV &aHenv, bool FwdOnlyCursors) +{ + // Copy the HENV into the db class + henv = aHenv; + fwdOnlyCursors = FwdOnlyCursors; + + initialize(); +} // wxDb::wxDb() + + +/********** wxDb Destructor **********/ +wxDb::~wxDb() +{ + wxASSERT_MSG(!IsCached(),wxT("Cached connections must not be manually deleted, use\nwxDbFreeConnection() or wxDbCloseConnections().")); + + if (IsOpen()) + { + Close(); + } +} // wxDb destructor + + + +/********** PRIVATE! wxDb::initialize PRIVATE! **********/ +/********** wxDb::initialize() **********/ +void wxDb::initialize() +/* + * Private member function that sets all wxDb member variables to + * known values at creation of the wxDb + */ +{ + int i; + + fpSqlLog = 0; // Sql Log file pointer + sqlLogState = sqlLogOFF; // By default, logging is turned off + nTables = 0; + dbmsType = dbmsUNIDENTIFIED; + + wxStrcpy(sqlState,wxEmptyString); + wxStrcpy(errorMsg,wxEmptyString); + nativeError = cbErrorMsg = 0; + for (i = 0; i < DB_MAX_ERROR_HISTORY; i++) + wxStrcpy(errorList[i], wxEmptyString); + + // Init typeInf structures + typeInfVarchar.TypeName.Empty(); + typeInfVarchar.FsqlType = 0; + typeInfVarchar.Precision = 0; + typeInfVarchar.CaseSensitive = 0; + typeInfVarchar.MaximumScale = 0; + + typeInfInteger.TypeName.Empty(); + typeInfInteger.FsqlType = 0; + typeInfInteger.Precision = 0; + typeInfInteger.CaseSensitive = 0; + typeInfInteger.MaximumScale = 0; + + typeInfFloat.TypeName.Empty(); + typeInfFloat.FsqlType = 0; + typeInfFloat.Precision = 0; + typeInfFloat.CaseSensitive = 0; + typeInfFloat.MaximumScale = 0; + + typeInfDate.TypeName.Empty(); + typeInfDate.FsqlType = 0; + typeInfDate.Precision = 0; + typeInfDate.CaseSensitive = 0; + typeInfDate.MaximumScale = 0; + + typeInfBlob.TypeName.Empty(); + typeInfBlob.FsqlType = 0; + typeInfBlob.Precision = 0; + typeInfBlob.CaseSensitive = 0; + typeInfBlob.MaximumScale = 0; + + typeInfMemo.TypeName.Empty(); + typeInfMemo.FsqlType = 0; + typeInfMemo.Precision = 0; + typeInfMemo.CaseSensitive = 0; + typeInfMemo.MaximumScale = 0; + + // Error reporting is turned OFF by default + silent = true; + + // Allocate a data source connection handle + if (SQLAllocConnect(henv, &hdbc) != SQL_SUCCESS) + DispAllErrors(henv); + + // Initialize the db status flag + DB_STATUS = 0; + + // Mark database as not open as of yet + dbIsOpen = false; + dbIsCached = false; + dbOpenedWithConnectionString = false; +} // wxDb::initialize() + + +/********** PRIVATE! wxDb::convertUserID PRIVATE! **********/ +// +// NOTE: Return value from this function MUST be copied +// immediately, as the value is not good after +// this function has left scope. +// +const wxChar *wxDb::convertUserID(const wxChar *userID, wxString &UserID) +{ + if (userID) + { + if (!wxStrlen(userID)) + UserID = uid; + else + UserID = userID; + } + else + UserID.Empty(); + + // dBase does not use user names, and some drivers fail if you try to pass one + if ( Dbms() == dbmsDBASE + || Dbms() == dbmsXBASE_SEQUITER ) + UserID.Empty(); + + // Some databases require user names to be specified in uppercase, + // so force the name to uppercase + if ((Dbms() == dbmsORACLE) || + (Dbms() == dbmsMAXDB)) + UserID = UserID.Upper(); + + return UserID.c_str(); +} // wxDb::convertUserID() + + +bool wxDb::determineDataTypes(bool failOnDataTypeUnsupported) +{ + size_t iIndex; + + // These are the possible SQL types we check for use against the datasource we are connected + // to for the purpose of determining which data type to use for the basic character strings + // column types + // + // NOTE: The first type in this enumeration that is determined to be supported by the + // datasource/driver is the one that will be used. + SWORD PossibleSqlCharTypes[] = { +#if wxUSE_UNICODE && defined(SQL_WVARCHAR) + SQL_WVARCHAR, +#endif + SQL_VARCHAR, +#if wxUSE_UNICODE && defined(SQL_WVARCHAR) + SQL_WCHAR, +#endif + SQL_CHAR + }; + + // These are the possible SQL types we check for use against the datasource we are connected + // to for the purpose of determining which data type to use for the basic non-floating point + // column types + // + // NOTE: The first type in this enumeration that is determined to be supported by the + // datasource/driver is the one that will be used. + SWORD PossibleSqlIntegerTypes[] = { + SQL_INTEGER + }; + + // These are the possible SQL types we check for use against the datasource we are connected + // to for the purpose of determining which data type to use for the basic floating point number + // column types + // + // NOTE: The first type in this enumeration that is determined to be supported by the + // datasource/driver is the one that will be used. + SWORD PossibleSqlFloatTypes[] = { + SQL_DOUBLE, + SQL_REAL, + SQL_FLOAT, + SQL_DECIMAL, + SQL_NUMERIC + }; + + // These are the possible SQL types we check for use agains the datasource we are connected + // to for the purpose of determining which data type to use for the date/time column types + // + // NOTE: The first type in this enumeration that is determined to be supported by the + // datasource/driver is the one that will be used. + SWORD PossibleSqlDateTypes[] = { + SQL_TIMESTAMP, + SQL_DATE, +#ifdef SQL_DATETIME + SQL_DATETIME +#endif + }; + + // These are the possible SQL types we check for use agains the datasource we are connected + // to for the purpose of determining which data type to use for the BLOB column types. + // + // NOTE: The first type in this enumeration that is determined to be supported by the + // datasource/driver is the one that will be used. + SWORD PossibleSqlBlobTypes[] = { + SQL_LONGVARBINARY, + SQL_VARBINARY + }; + + // These are the possible SQL types we check for use agains the datasource we are connected + // to for the purpose of determining which data type to use for the MEMO column types + // (a type which allow to store large strings; like VARCHAR just with a bigger precision) + // + // NOTE: The first type in this enumeration that is determined to be supported by the + // datasource/driver is the one that will be used. + SWORD PossibleSqlMemoTypes[] = { + SQL_LONGVARCHAR, + }; + + + // Query the data source regarding data type information + + // + // The way it was determined which SQL data types to use was by calling SQLGetInfo + // for all of the possible SQL data types to see which ones were supported. If + // a type is not supported, the SQLFetch() that's called from getDataTypeInfo() + // fails with SQL_NO_DATA_FOUND. This is ugly because I'm sure the three SQL data + // types I've selected below will not always be what we want. These are just + // what happened to work against an Oracle 7/Intersolv combination. The following is + // a complete list of the results I got back against the Oracle 7 database: + // + // SQL_BIGINT SQL_NO_DATA_FOUND + // SQL_BINARY SQL_NO_DATA_FOUND + // SQL_BIT SQL_NO_DATA_FOUND + // SQL_CHAR type name = 'CHAR', Precision = 255 + // SQL_DATE SQL_NO_DATA_FOUND + // SQL_DECIMAL type name = 'NUMBER', Precision = 38 + // SQL_DOUBLE type name = 'NUMBER', Precision = 15 + // SQL_FLOAT SQL_NO_DATA_FOUND + // SQL_INTEGER SQL_NO_DATA_FOUND + // SQL_LONGVARBINARY type name = 'LONG RAW', Precision = 2 billion + // SQL_LONGVARCHAR type name = 'LONG', Precision = 2 billion + // SQL_NUMERIC SQL_NO_DATA_FOUND + // SQL_REAL SQL_NO_DATA_FOUND + // SQL_SMALLINT SQL_NO_DATA_FOUND + // SQL_TIME SQL_NO_DATA_FOUND + // SQL_TIMESTAMP type name = 'DATE', Precision = 19 + // SQL_VARBINARY type name = 'RAW', Precision = 255 + // SQL_VARCHAR type name = 'VARCHAR2', Precision = 2000 + // ===================================================================== + // Results from a Microsoft Access 7.0 db, using a driver from Microsoft + // + // SQL_VARCHAR type name = 'TEXT', Precision = 255 + // SQL_TIMESTAMP type name = 'DATETIME' + // SQL_DECIMAL SQL_NO_DATA_FOUND + // SQL_NUMERIC type name = 'CURRENCY', Precision = 19 + // SQL_FLOAT SQL_NO_DATA_FOUND + // SQL_REAL type name = 'SINGLE', Precision = 7 + // SQL_DOUBLE type name = 'DOUBLE', Precision = 15 + // SQL_INTEGER type name = 'LONG', Precision = 10 + + // Query the data source for info about itself + if (!getDbInfo(failOnDataTypeUnsupported)) + return false; + + // --------------- Varchar - (Variable length character string) --------------- + for (iIndex = 0; iIndex < WXSIZEOF(PossibleSqlCharTypes) && + !getDataTypeInfo(PossibleSqlCharTypes[iIndex], typeInfVarchar); ++iIndex) + {} + + if (iIndex < WXSIZEOF(PossibleSqlCharTypes)) + typeInfVarchar.FsqlType = PossibleSqlCharTypes[iIndex]; + else if (failOnDataTypeUnsupported) + return false; + + // --------------- Float --------------- + for (iIndex = 0; iIndex < WXSIZEOF(PossibleSqlFloatTypes) && + !getDataTypeInfo(PossibleSqlFloatTypes[iIndex], typeInfFloat); ++iIndex) + {} + + if (iIndex < WXSIZEOF(PossibleSqlFloatTypes)) + typeInfFloat.FsqlType = PossibleSqlFloatTypes[iIndex]; + else if (failOnDataTypeUnsupported) + return false; + + // --------------- Integer ------------- + for (iIndex = 0; iIndex < WXSIZEOF(PossibleSqlIntegerTypes) && + !getDataTypeInfo(PossibleSqlIntegerTypes[iIndex], typeInfInteger); ++iIndex) + {} + + if (iIndex < WXSIZEOF(PossibleSqlIntegerTypes)) + typeInfInteger.FsqlType = PossibleSqlIntegerTypes[iIndex]; + else if (failOnDataTypeUnsupported) + { + // If no non-floating point data types are supported, we'll + // use the type assigned for floats to store integers as well + if (!getDataTypeInfo(typeInfFloat.FsqlType, typeInfInteger)) + { + if (failOnDataTypeUnsupported) + return false; + } + else + typeInfInteger.FsqlType = typeInfFloat.FsqlType; + } + + // --------------- Date/Time --------------- + for (iIndex = 0; iIndex < WXSIZEOF(PossibleSqlDateTypes) && + !getDataTypeInfo(PossibleSqlDateTypes[iIndex], typeInfDate); ++iIndex) + {} + + if (iIndex < WXSIZEOF(PossibleSqlDateTypes)) + typeInfDate.FsqlType = PossibleSqlDateTypes[iIndex]; + else if (failOnDataTypeUnsupported) + return false; + + // --------------- BLOB --------------- + for (iIndex = 0; iIndex < WXSIZEOF(PossibleSqlBlobTypes) && + !getDataTypeInfo(PossibleSqlBlobTypes[iIndex], typeInfBlob); ++iIndex) + {} + + if (iIndex < WXSIZEOF(PossibleSqlBlobTypes)) + typeInfBlob.FsqlType = PossibleSqlBlobTypes[iIndex]; + else if (failOnDataTypeUnsupported) + return false; + + // --------------- MEMO --------------- + for (iIndex = 0; iIndex < WXSIZEOF(PossibleSqlMemoTypes) && + !getDataTypeInfo(PossibleSqlMemoTypes[iIndex], typeInfMemo); ++iIndex) + {} + + if (iIndex < WXSIZEOF(PossibleSqlMemoTypes)) + typeInfMemo.FsqlType = PossibleSqlMemoTypes[iIndex]; + else if (failOnDataTypeUnsupported) + return false; + + return true; +} // wxDb::determineDataTypes + + +bool wxDb::open(bool failOnDataTypeUnsupported) +{ +/* + If using Intersolv branded ODBC drivers, this is the place where you would substitute + your branded driver license information + + SQLSetConnectOption(hdbc, 1041, (UDWORD) wxEmptyString); + SQLSetConnectOption(hdbc, 1042, (UDWORD) wxEmptyString); +*/ + + // Mark database as open + dbIsOpen = true; + + // Allocate a statement handle for the database connection + if (SQLAllocStmt(hdbc, &hstmt) != SQL_SUCCESS) + return(DispAllErrors(henv, hdbc)); + + // Set Connection Options + if (!setConnectionOptions()) + return false; + + if (!determineDataTypes(failOnDataTypeUnsupported)) + return false; + +#ifdef DBDEBUG_CONSOLE + cout << wxT("VARCHAR DATA TYPE: ") << typeInfVarchar.TypeName << endl; + cout << wxT("INTEGER DATA TYPE: ") << typeInfInteger.TypeName << endl; + cout << wxT("FLOAT DATA TYPE: ") << typeInfFloat.TypeName << endl; + cout << wxT("DATE DATA TYPE: ") << typeInfDate.TypeName << endl; + cout << wxT("BLOB DATA TYPE: ") << typeInfBlob.TypeName << endl; + cout << wxT("MEMO DATA TYPE: ") << typeInfMemo.TypeName << endl; + cout << endl; +#endif + + // Completed Successfully + return true; +} + +bool wxDb::Open(const wxString& inConnectStr, bool failOnDataTypeUnsupported) +{ + wxASSERT(inConnectStr.length()); + return Open(inConnectStr, NULL, failOnDataTypeUnsupported); +} + +bool wxDb::Open(const wxString& inConnectStr, SQLHWND parentWnd, bool failOnDataTypeUnsupported) +{ + dsn = wxEmptyString; + uid = wxEmptyString; + authStr = wxEmptyString; + + RETCODE retcode; + + if (!FwdOnlyCursors()) + { + // Specify that the ODBC cursor library be used, if needed. This must be + // specified before the connection is made. + retcode = SQLSetConnectOption(hdbc, SQL_ODBC_CURSORS, SQL_CUR_USE_IF_NEEDED); + +#ifdef DBDEBUG_CONSOLE + if (retcode == SQL_SUCCESS) + cout << wxT("SQLSetConnectOption(CURSOR_LIB) successful") << endl; + else + cout << wxT("SQLSetConnectOption(CURSOR_LIB) failed") << endl; +#else + wxUnusedVar(retcode); +#endif + } + + // Connect to the data source + SQLTCHAR outConnectBuffer[SQL_MAX_CONNECTSTR_LEN+1]; // MS recommends at least 1k buffer + short outConnectBufferLen; + + inConnectionStr = inConnectStr; + + retcode = SQLDriverConnect(hdbc, parentWnd, (SQLTCHAR FAR *)inConnectionStr.c_str(), + (SWORD)inConnectionStr.length(), (SQLTCHAR FAR *)outConnectBuffer, + WXSIZEOF(outConnectBuffer), &outConnectBufferLen, SQL_DRIVER_COMPLETE ); + + if ((retcode != SQL_SUCCESS) && + (retcode != SQL_SUCCESS_WITH_INFO)) + return(DispAllErrors(henv, hdbc)); + + outConnectBuffer[outConnectBufferLen] = 0; + outConnectionStr = outConnectBuffer; + dbOpenedWithConnectionString = true; + + return open(failOnDataTypeUnsupported); +} + +/********** wxDb::Open() **********/ +bool wxDb::Open(const wxString &Dsn, const wxString &Uid, const wxString &AuthStr, bool failOnDataTypeUnsupported) +{ + wxASSERT(!Dsn.empty()); + dsn = Dsn; + uid = Uid; + authStr = AuthStr; + + inConnectionStr = wxEmptyString; + outConnectionStr = wxEmptyString; + + RETCODE retcode; + + if (!FwdOnlyCursors()) + { + // Specify that the ODBC cursor library be used, if needed. This must be + // specified before the connection is made. + retcode = SQLSetConnectOption(hdbc, SQL_ODBC_CURSORS, SQL_CUR_USE_IF_NEEDED); + +#ifdef DBDEBUG_CONSOLE + if (retcode == SQL_SUCCESS) + cout << wxT("SQLSetConnectOption(CURSOR_LIB) successful") << endl; + else + cout << wxT("SQLSetConnectOption(CURSOR_LIB) failed") << endl; +#else + wxUnusedVar( retcode ); +#endif + } + + // Connect to the data source + retcode = SQLConnect(hdbc, (SQLTCHAR FAR *) dsn.c_str(), SQL_NTS, + (SQLTCHAR FAR *) uid.c_str(), SQL_NTS, + (SQLTCHAR FAR *) authStr.c_str(), SQL_NTS); + + if ((retcode != SQL_SUCCESS) && + (retcode != SQL_SUCCESS_WITH_INFO)) + return(DispAllErrors(henv, hdbc)); + + return open(failOnDataTypeUnsupported); + +} // wxDb::Open() + + +bool wxDb::Open(wxDbConnectInf *dbConnectInf, bool failOnDataTypeUnsupported) +{ + wxASSERT(dbConnectInf); + + // Use the connection string if one is present + if (dbConnectInf->UseConnectionStr()) + return Open(dbConnectInf->GetConnectionStr(), failOnDataTypeUnsupported); + else + return Open(dbConnectInf->GetDsn(), dbConnectInf->GetUserID(), + dbConnectInf->GetPassword(), failOnDataTypeUnsupported); +} // wxDb::Open() + + +bool wxDb::Open(wxDb *copyDb) +{ + dsn = copyDb->GetDatasourceName(); + uid = copyDb->GetUsername(); + authStr = copyDb->GetPassword(); + inConnectionStr = copyDb->GetConnectionInStr(); + outConnectionStr = copyDb->GetConnectionOutStr(); + + RETCODE retcode; + + if (!FwdOnlyCursors()) + { + // Specify that the ODBC cursor library be used, if needed. This must be + // specified before the connection is made. + retcode = SQLSetConnectOption(hdbc, SQL_ODBC_CURSORS, SQL_CUR_USE_IF_NEEDED); + +#ifdef DBDEBUG_CONSOLE + if (retcode == SQL_SUCCESS) + cout << wxT("SQLSetConnectOption(CURSOR_LIB) successful") << endl; + else + cout << wxT("SQLSetConnectOption(CURSOR_LIB) failed") << endl; +#else + wxUnusedVar( retcode ); +#endif + } + + if (copyDb->OpenedWithConnectionString()) + { + // Connect to the data source + SQLTCHAR outConnectBuffer[SQL_MAX_CONNECTSTR_LEN+1]; + short outConnectBufferLen; + + inConnectionStr = copyDb->GetConnectionInStr(); + + retcode = SQLDriverConnect(hdbc, NULL, (SQLTCHAR FAR *)inConnectionStr.c_str(), + (SWORD)inConnectionStr.length(), (SQLTCHAR FAR *)outConnectBuffer, + WXSIZEOF(outConnectBuffer), &outConnectBufferLen, SQL_DRIVER_COMPLETE); + + if ((retcode != SQL_SUCCESS) && + (retcode != SQL_SUCCESS_WITH_INFO)) + return(DispAllErrors(henv, hdbc)); + + outConnectBuffer[outConnectBufferLen] = 0; + outConnectionStr = outConnectBuffer; + dbOpenedWithConnectionString = true; + } + else + { + // Connect to the data source + retcode = SQLConnect(hdbc, (SQLTCHAR FAR *) dsn.c_str(), SQL_NTS, + (SQLTCHAR FAR *) uid.c_str(), SQL_NTS, + (SQLTCHAR FAR *) authStr.c_str(), SQL_NTS); + } + + if ((retcode != SQL_SUCCESS) && + (retcode != SQL_SUCCESS_WITH_INFO)) + return(DispAllErrors(henv, hdbc)); + +/* + If using Intersolv branded ODBC drivers, this is the place where you would substitute + your branded driver license information + + SQLSetConnectOption(hdbc, 1041, (UDWORD) wxEmptyString); + SQLSetConnectOption(hdbc, 1042, (UDWORD) wxEmptyString); +*/ + + // Mark database as open + dbIsOpen = true; + + // Allocate a statement handle for the database connection + if (SQLAllocStmt(hdbc, &hstmt) != SQL_SUCCESS) + return(DispAllErrors(henv, hdbc)); + + // Set Connection Options + if (!setConnectionOptions()) + return false; + + // Instead of Querying the data source for info about itself, it can just be copied + // from the wxDb instance that was passed in (copyDb). + wxStrcpy(dbInf.serverName,copyDb->dbInf.serverName); + wxStrcpy(dbInf.databaseName,copyDb->dbInf.databaseName); + wxStrcpy(dbInf.dbmsName,copyDb->dbInf.dbmsName); + wxStrcpy(dbInf.dbmsVer,copyDb->dbInf.dbmsVer); + dbInf.maxConnections = copyDb->dbInf.maxConnections; + dbInf.maxStmts = copyDb->dbInf.maxStmts; + wxStrcpy(dbInf.driverName,copyDb->dbInf.driverName); + wxStrcpy(dbInf.odbcVer,copyDb->dbInf.odbcVer); + wxStrcpy(dbInf.drvMgrOdbcVer,copyDb->dbInf.drvMgrOdbcVer); + wxStrcpy(dbInf.driverVer,copyDb->dbInf.driverVer); + dbInf.apiConfLvl = copyDb->dbInf.apiConfLvl; + dbInf.cliConfLvl = copyDb->dbInf.cliConfLvl; + dbInf.sqlConfLvl = copyDb->dbInf.sqlConfLvl; + wxStrcpy(dbInf.outerJoins,copyDb->dbInf.outerJoins); + wxStrcpy(dbInf.procedureSupport,copyDb->dbInf.procedureSupport); + wxStrcpy(dbInf.accessibleTables,copyDb->dbInf.accessibleTables); + dbInf.cursorCommitBehavior = copyDb->dbInf.cursorCommitBehavior; + dbInf.cursorRollbackBehavior = copyDb->dbInf.cursorRollbackBehavior; + dbInf.supportNotNullClause = copyDb->dbInf.supportNotNullClause; + wxStrcpy(dbInf.supportIEF,copyDb->dbInf.supportIEF); + dbInf.txnIsolation = copyDb->dbInf.txnIsolation; + dbInf.txnIsolationOptions = copyDb->dbInf.txnIsolationOptions; + dbInf.fetchDirections = copyDb->dbInf.fetchDirections; + dbInf.lockTypes = copyDb->dbInf.lockTypes; + dbInf.posOperations = copyDb->dbInf.posOperations; + dbInf.posStmts = copyDb->dbInf.posStmts; + dbInf.scrollConcurrency = copyDb->dbInf.scrollConcurrency; + dbInf.scrollOptions = copyDb->dbInf.scrollOptions; + dbInf.staticSensitivity = copyDb->dbInf.staticSensitivity; + dbInf.txnCapable = copyDb->dbInf.txnCapable; + dbInf.loginTimeout = copyDb->dbInf.loginTimeout; + + // VARCHAR = Variable length character string + typeInfVarchar.FsqlType = copyDb->typeInfVarchar.FsqlType; + typeInfVarchar.TypeName = copyDb->typeInfVarchar.TypeName; + typeInfVarchar.Precision = copyDb->typeInfVarchar.Precision; + typeInfVarchar.CaseSensitive = copyDb->typeInfVarchar.CaseSensitive; + typeInfVarchar.MaximumScale = copyDb->typeInfVarchar.MaximumScale; + + // Float + typeInfFloat.FsqlType = copyDb->typeInfFloat.FsqlType; + typeInfFloat.TypeName = copyDb->typeInfFloat.TypeName; + typeInfFloat.Precision = copyDb->typeInfFloat.Precision; + typeInfFloat.CaseSensitive = copyDb->typeInfFloat.CaseSensitive; + typeInfFloat.MaximumScale = copyDb->typeInfFloat.MaximumScale; + + // Integer + typeInfInteger.FsqlType = copyDb->typeInfInteger.FsqlType; + typeInfInteger.TypeName = copyDb->typeInfInteger.TypeName; + typeInfInteger.Precision = copyDb->typeInfInteger.Precision; + typeInfInteger.CaseSensitive = copyDb->typeInfInteger.CaseSensitive; + typeInfInteger.MaximumScale = copyDb->typeInfInteger.MaximumScale; + + // Date/Time + typeInfDate.FsqlType = copyDb->typeInfDate.FsqlType; + typeInfDate.TypeName = copyDb->typeInfDate.TypeName; + typeInfDate.Precision = copyDb->typeInfDate.Precision; + typeInfDate.CaseSensitive = copyDb->typeInfDate.CaseSensitive; + typeInfDate.MaximumScale = copyDb->typeInfDate.MaximumScale; + + // Blob + typeInfBlob.FsqlType = copyDb->typeInfBlob.FsqlType; + typeInfBlob.TypeName = copyDb->typeInfBlob.TypeName; + typeInfBlob.Precision = copyDb->typeInfBlob.Precision; + typeInfBlob.CaseSensitive = copyDb->typeInfBlob.CaseSensitive; + typeInfBlob.MaximumScale = copyDb->typeInfBlob.MaximumScale; + + // Memo + typeInfMemo.FsqlType = copyDb->typeInfMemo.FsqlType; + typeInfMemo.TypeName = copyDb->typeInfMemo.TypeName; + typeInfMemo.Precision = copyDb->typeInfMemo.Precision; + typeInfMemo.CaseSensitive = copyDb->typeInfMemo.CaseSensitive; + typeInfMemo.MaximumScale = copyDb->typeInfMemo.MaximumScale; + +#ifdef DBDEBUG_CONSOLE + cout << wxT("VARCHAR DATA TYPE: ") << typeInfVarchar.TypeName << endl; + cout << wxT("INTEGER DATA TYPE: ") << typeInfInteger.TypeName << endl; + cout << wxT("FLOAT DATA TYPE: ") << typeInfFloat.TypeName << endl; + cout << wxT("DATE DATA TYPE: ") << typeInfDate.TypeName << endl; + cout << wxT("BLOB DATA TYPE: ") << typeInfBlob.TypeName << endl; + cout << wxT("MEMO DATA TYPE: ") << typeInfMemo.TypeName << endl; + cout << endl; +#endif + + // Completed Successfully + return true; +} // wxDb::Open() 2 + + +/********** wxDb::setConnectionOptions() **********/ +bool wxDb::setConnectionOptions(void) +/* + * NOTE: The Intersolv/Oracle 7 driver was "Not Capable" of setting the login timeout. + */ +{ + SWORD cb; + + // I need to get the DBMS name here, because some of the connection options + // are database specific and need to call the Dbms() function. + RETCODE retcode; + + retcode = SQLGetInfo(hdbc, SQL_DBMS_NAME, (UCHAR *) dbInf.dbmsName, sizeof(dbInf.dbmsName), &cb); + if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) + return(DispAllErrors(henv, hdbc)); + + /* retcode = */ SQLSetConnectOption(hdbc, SQL_AUTOCOMMIT, SQL_AUTOCOMMIT_OFF); + /* retcode = */ SQLSetConnectOption(hdbc, SQL_OPT_TRACE, SQL_OPT_TRACE_OFF); +// SQLSetConnectOption(hdbc, SQL_TXN_ISOLATION, SQL_TXN_READ_COMMITTED); // No dirty reads + + // By default, MS Sql Server closes cursors on commit and rollback. The following + // call to SQLSetConnectOption() is needed to force SQL Server to preserve cursors + // after a transaction. This is a driver specific option and is not part of the + // ODBC standard. Note: this behavior is specific to the ODBC interface to SQL Server. + // The database settings don't have any effect one way or the other. + if (Dbms() == dbmsMS_SQL_SERVER) + { + const long SQL_PRESERVE_CURSORS = 1204L; + const long SQL_PC_ON = 1L; + /* retcode = */ SQLSetConnectOption(hdbc, SQL_PRESERVE_CURSORS, SQL_PC_ON); + } + + // Display the connection options to verify them +#ifdef DBDEBUG_CONSOLE + long l; + cout << wxT("****** CONNECTION OPTIONS ******") << endl; + + retcode = SQLGetConnectOption(hdbc, SQL_AUTOCOMMIT, &l); + if (retcode != SQL_SUCCESS) + return(DispAllErrors(henv, hdbc)); + cout << wxT("AUTOCOMMIT: ") << (l == SQL_AUTOCOMMIT_OFF ? "OFF" : "ON") << endl; + + retcode = SQLGetConnectOption(hdbc, SQL_ODBC_CURSORS, &l); + if (retcode != SQL_SUCCESS) + return(DispAllErrors(henv, hdbc)); + cout << wxT("ODBC CURSORS: "); + switch(l) + { + case(SQL_CUR_USE_IF_NEEDED): + cout << wxT("SQL_CUR_USE_IF_NEEDED"); + break; + case(SQL_CUR_USE_ODBC): + cout << wxT("SQL_CUR_USE_ODBC"); + break; + case(SQL_CUR_USE_DRIVER): + cout << wxT("SQL_CUR_USE_DRIVER"); + break; + } + cout << endl; + + retcode = SQLGetConnectOption(hdbc, SQL_OPT_TRACE, &l) + if (retcode != SQL_SUCCESS) + return(DispAllErrors(henv, hdbc)); + cout << wxT("TRACING: ") << (l == SQL_OPT_TRACE_OFF ? wxT("OFF") : wxT("ON")) << endl; + + cout << endl; +#endif + + // Completed Successfully + return true; + +} // wxDb::setConnectionOptions() + + +/********** wxDb::getDbInfo() **********/ +bool wxDb::getDbInfo(bool failOnDataTypeUnsupported) +{ + SWORD cb; + RETCODE retcode; + + retcode = SQLGetInfo(hdbc, SQL_SERVER_NAME, (UCHAR*) dbInf.serverName, sizeof(dbInf.serverName), &cb); + if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO ) + { + DispAllErrors(henv, hdbc); + if (failOnDataTypeUnsupported) + return false; + } + + retcode = SQLGetInfo(hdbc, SQL_DATABASE_NAME, (UCHAR*) dbInf.databaseName, sizeof(dbInf.databaseName), &cb); + if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO ) + { + DispAllErrors(henv, hdbc); + if (failOnDataTypeUnsupported) + return false; + } + + retcode = SQLGetInfo(hdbc, SQL_DBMS_NAME, (UCHAR*) dbInf.dbmsName, sizeof(dbInf.dbmsName), &cb); + if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO ) + { + DispAllErrors(henv, hdbc); + if (failOnDataTypeUnsupported) + return false; + } + + // 16-Mar-1999 + // After upgrading to MSVC6, the original 20 char buffer below was insufficient, + // causing database connectivity to fail in some cases. + retcode = SQLGetInfo(hdbc, SQL_DBMS_VER, (UCHAR*) dbInf.dbmsVer, sizeof(dbInf.dbmsVer), &cb); + if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO ) + { + DispAllErrors(henv, hdbc); + if (failOnDataTypeUnsupported) + return false; + } + + retcode = SQLGetInfo(hdbc, SQL_ACTIVE_CONNECTIONS, (UCHAR*) &dbInf.maxConnections, sizeof(dbInf.maxConnections), &cb); + if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO ) + { + DispAllErrors(henv, hdbc); + if (failOnDataTypeUnsupported) + return false; + } + + retcode = SQLGetInfo(hdbc, SQL_ACTIVE_STATEMENTS, (UCHAR*) &dbInf.maxStmts, sizeof(dbInf.maxStmts), &cb); + if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO ) + { + DispAllErrors(henv, hdbc); + if (failOnDataTypeUnsupported) + return false; + } + + retcode = SQLGetInfo(hdbc, SQL_DRIVER_NAME, (UCHAR*) dbInf.driverName, sizeof(dbInf.driverName), &cb); + if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO ) + { + DispAllErrors(henv, hdbc); + if (failOnDataTypeUnsupported) + return false; + } + + retcode = SQLGetInfo(hdbc, SQL_DRIVER_ODBC_VER, (UCHAR*) dbInf.odbcVer, sizeof(dbInf.odbcVer), &cb); + if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO ) + { + DispAllErrors(henv, hdbc); + if (failOnDataTypeUnsupported) + return false; + } + + retcode = SQLGetInfo(hdbc, SQL_ODBC_VER, (UCHAR*) dbInf.drvMgrOdbcVer, sizeof(dbInf.drvMgrOdbcVer), &cb); + if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) + { + DispAllErrors(henv, hdbc); + if (failOnDataTypeUnsupported) + return false; + } + + retcode = SQLGetInfo(hdbc, SQL_DRIVER_VER, (UCHAR*) dbInf.driverVer, sizeof(dbInf.driverVer), &cb); + if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO ) + { + DispAllErrors(henv, hdbc); + if (failOnDataTypeUnsupported) + return false; + } + + retcode = SQLGetInfo(hdbc, SQL_ODBC_API_CONFORMANCE, (UCHAR*) &dbInf.apiConfLvl, sizeof(dbInf.apiConfLvl), &cb); + if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO ) + { + DispAllErrors(henv, hdbc); + if (failOnDataTypeUnsupported) + return false; + } + + retcode = SQLGetInfo(hdbc, SQL_ODBC_SAG_CLI_CONFORMANCE, (UCHAR*) &dbInf.cliConfLvl, sizeof(dbInf.cliConfLvl), &cb); + if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO ) + { + // Not all drivers support this call - Nick Gorham(unixODBC) + dbInf.cliConfLvl = 0; + DispAllErrors(henv, hdbc); + if (failOnDataTypeUnsupported) + return false; + } + + retcode = SQLGetInfo(hdbc, SQL_ODBC_SQL_CONFORMANCE, (UCHAR*) &dbInf.sqlConfLvl, sizeof(dbInf.sqlConfLvl), &cb); + if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO ) + { + DispAllErrors(henv, hdbc); + if (failOnDataTypeUnsupported) + return false; + } + + retcode = SQLGetInfo(hdbc, SQL_OUTER_JOINS, (UCHAR*) dbInf.outerJoins, sizeof(dbInf.outerJoins), &cb); + if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO ) + { + DispAllErrors(henv, hdbc); + if (failOnDataTypeUnsupported) + return false; + } + + retcode = SQLGetInfo(hdbc, SQL_PROCEDURES, (UCHAR*) dbInf.procedureSupport, sizeof(dbInf.procedureSupport), &cb); + if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO ) + { + DispAllErrors(henv, hdbc); + if (failOnDataTypeUnsupported) + return false; + } + + retcode = SQLGetInfo(hdbc, SQL_ACCESSIBLE_TABLES, (UCHAR*) dbInf.accessibleTables, sizeof(dbInf.accessibleTables), &cb); + if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO ) + { + DispAllErrors(henv, hdbc); + if (failOnDataTypeUnsupported) + return false; + } + + retcode = SQLGetInfo(hdbc, SQL_CURSOR_COMMIT_BEHAVIOR, (UCHAR*) &dbInf.cursorCommitBehavior, sizeof(dbInf.cursorCommitBehavior), &cb); + if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO ) + { + DispAllErrors(henv, hdbc); + if (failOnDataTypeUnsupported) + return false; + } + + retcode = SQLGetInfo(hdbc, SQL_CURSOR_ROLLBACK_BEHAVIOR, (UCHAR*) &dbInf.cursorRollbackBehavior, sizeof(dbInf.cursorRollbackBehavior), &cb); + if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO ) + { + DispAllErrors(henv, hdbc); + if (failOnDataTypeUnsupported) + return false; + } + + retcode = SQLGetInfo(hdbc, SQL_NON_NULLABLE_COLUMNS, (UCHAR*) &dbInf.supportNotNullClause, sizeof(dbInf.supportNotNullClause), &cb); + if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO ) + { + DispAllErrors(henv, hdbc); + if (failOnDataTypeUnsupported) + return false; + } + + retcode = SQLGetInfo(hdbc, SQL_ODBC_SQL_OPT_IEF, (UCHAR*) dbInf.supportIEF, sizeof(dbInf.supportIEF), &cb); + if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO ) + { + DispAllErrors(henv, hdbc); + if (failOnDataTypeUnsupported) + return false; + } + + retcode = SQLGetInfo(hdbc, SQL_DEFAULT_TXN_ISOLATION, (UCHAR*) &dbInf.txnIsolation, sizeof(dbInf.txnIsolation), &cb); + if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO ) + { + DispAllErrors(henv, hdbc); + if (failOnDataTypeUnsupported) + return false; + } + + retcode = SQLGetInfo(hdbc, SQL_TXN_ISOLATION_OPTION, (UCHAR*) &dbInf.txnIsolationOptions, sizeof(dbInf.txnIsolationOptions), &cb); + if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO ) + { + DispAllErrors(henv, hdbc); + if (failOnDataTypeUnsupported) + return false; + } + + retcode = SQLGetInfo(hdbc, SQL_FETCH_DIRECTION, (UCHAR*) &dbInf.fetchDirections, sizeof(dbInf.fetchDirections), &cb); + if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO ) + { + DispAllErrors(henv, hdbc); + if (failOnDataTypeUnsupported) + return false; + } + + retcode = SQLGetInfo(hdbc, SQL_LOCK_TYPES, (UCHAR*) &dbInf.lockTypes, sizeof(dbInf.lockTypes), &cb); + if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO ) + { + DispAllErrors(henv, hdbc); + if (failOnDataTypeUnsupported) + return false; + } + + retcode = SQLGetInfo(hdbc, SQL_POS_OPERATIONS, (UCHAR*) &dbInf.posOperations, sizeof(dbInf.posOperations), &cb); + if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO ) + { + DispAllErrors(henv, hdbc); + if (failOnDataTypeUnsupported) + return false; + } + + retcode = SQLGetInfo(hdbc, SQL_POSITIONED_STATEMENTS, (UCHAR*) &dbInf.posStmts, sizeof(dbInf.posStmts), &cb); + if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO ) + { + DispAllErrors(henv, hdbc); + if (failOnDataTypeUnsupported) + return false; + } + + retcode = SQLGetInfo(hdbc, SQL_SCROLL_CONCURRENCY, (UCHAR*) &dbInf.scrollConcurrency, sizeof(dbInf.scrollConcurrency), &cb); + if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO ) + { + DispAllErrors(henv, hdbc); + if (failOnDataTypeUnsupported) + return false; + } + + retcode = SQLGetInfo(hdbc, SQL_SCROLL_OPTIONS, (UCHAR*) &dbInf.scrollOptions, sizeof(dbInf.scrollOptions), &cb); + if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO ) + { + DispAllErrors(henv, hdbc); + if (failOnDataTypeUnsupported) + return false; + } + + retcode = SQLGetInfo(hdbc, SQL_STATIC_SENSITIVITY, (UCHAR*) &dbInf.staticSensitivity, sizeof(dbInf.staticSensitivity), &cb); + if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO ) + { + DispAllErrors(henv, hdbc); + if (failOnDataTypeUnsupported) + return false; + } + + retcode = SQLGetInfo(hdbc, SQL_TXN_CAPABLE, (UCHAR*) &dbInf.txnCapable, sizeof(dbInf.txnCapable), &cb); + if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO ) + { + DispAllErrors(henv, hdbc); + if (failOnDataTypeUnsupported) + return false; + } + + retcode = SQLGetInfo(hdbc, SQL_LOGIN_TIMEOUT, (UCHAR*) &dbInf.loginTimeout, sizeof(dbInf.loginTimeout), &cb); + if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO ) + { + DispAllErrors(henv, hdbc); + if (failOnDataTypeUnsupported) + return false; + } + +#ifdef DBDEBUG_CONSOLE + cout << wxT("***** DATA SOURCE INFORMATION *****") << endl; + cout << wxT(wxT("SERVER Name: ") << dbInf.serverName << endl; + cout << wxT("DBMS Name: ") << dbInf.dbmsName << wxT("; DBMS Version: ") << dbInf.dbmsVer << endl; + cout << wxT("ODBC Version: ") << dbInf.odbcVer << wxT("; Driver Version: ") << dbInf.driverVer << endl; + + cout << wxT("API Conf. Level: "); + switch(dbInf.apiConfLvl) + { + case SQL_OAC_NONE: cout << wxT("None"); break; + case SQL_OAC_LEVEL1: cout << wxT("Level 1"); break; + case SQL_OAC_LEVEL2: cout << wxT("Level 2"); break; + } + cout << endl; + + cout << wxT("SAG CLI Conf. Level: "); + switch(dbInf.cliConfLvl) + { + case SQL_OSCC_NOT_COMPLIANT: cout << wxT("Not Compliant"); break; + case SQL_OSCC_COMPLIANT: cout << wxT("Compliant"); break; + } + cout << endl; + + cout << wxT("SQL Conf. Level: "); + switch(dbInf.sqlConfLvl) + { + case SQL_OSC_MINIMUM: cout << wxT("Minimum Grammar"); break; + case SQL_OSC_CORE: cout << wxT("Core Grammar"); break; + case SQL_OSC_EXTENDED: cout << wxT("Extended Grammar"); break; + } + cout << endl; + + cout << wxT("Max. Connections: ") << dbInf.maxConnections << endl; + cout << wxT("Outer Joins: ") << dbInf.outerJoins << endl; + cout << wxT("Support for Procedures: ") << dbInf.procedureSupport << endl; + cout << wxT("All tables accessible : ") << dbInf.accessibleTables << endl; + cout << wxT("Cursor COMMIT Behavior: "); + switch(dbInf.cursorCommitBehavior) + { + case SQL_CB_DELETE: cout << wxT("Delete cursors"); break; + case SQL_CB_CLOSE: cout << wxT("Close cursors"); break; + case SQL_CB_PRESERVE: cout << wxT("Preserve cursors"); break; + } + cout << endl; + + cout << wxT("Cursor ROLLBACK Behavior: "); + switch(dbInf.cursorRollbackBehavior) + { + case SQL_CB_DELETE: cout << wxT("Delete cursors"); break; + case SQL_CB_CLOSE: cout << wxT("Close cursors"); break; + case SQL_CB_PRESERVE: cout << wxT("Preserve cursors"); break; + } + cout << endl; + + cout << wxT("Support NOT NULL clause: "); + switch(dbInf.supportNotNullClause) + { + case SQL_NNC_NULL: cout << wxT("No"); break; + case SQL_NNC_NON_NULL: cout << wxT("Yes"); break; + } + cout << endl; + + cout << wxT("Support IEF (Ref. Integrity): ") << dbInf.supportIEF << endl; + cout << wxT("Login Timeout: ") << dbInf.loginTimeout << endl; + + cout << endl << endl << wxT("more ...") << endl; + getchar(); + + cout << wxT("Default Transaction Isolation: "; + switch(dbInf.txnIsolation) + { + case SQL_TXN_READ_UNCOMMITTED: cout << wxT("Read Uncommitted"); break; + case SQL_TXN_READ_COMMITTED: cout << wxT("Read Committed"); break; + case SQL_TXN_REPEATABLE_READ: cout << wxT("Repeatable Read"); break; + case SQL_TXN_SERIALIZABLE: cout << wxT("Serializable"); break; +#ifdef ODBC_V20 + case SQL_TXN_VERSIONING: cout << wxT("Versioning"); break; +#endif + } + cout << endl; + + cout << wxT("Transaction Isolation Options: "); + if (dbInf.txnIsolationOptions & SQL_TXN_READ_UNCOMMITTED) + cout << wxT("Read Uncommitted, "); + if (dbInf.txnIsolationOptions & SQL_TXN_READ_COMMITTED) + cout << wxT("Read Committed, "); + if (dbInf.txnIsolationOptions & SQL_TXN_REPEATABLE_READ) + cout << wxT("Repeatable Read, "); + if (dbInf.txnIsolationOptions & SQL_TXN_SERIALIZABLE) + cout << wxT("Serializable, "); +#ifdef ODBC_V20 + if (dbInf.txnIsolationOptions & SQL_TXN_VERSIONING) + cout << wxT("Versioning"); +#endif + cout << endl; + + cout << wxT("Fetch Directions Supported:") << endl << wxT(" "); + if (dbInf.fetchDirections & SQL_FD_FETCH_NEXT) + cout << wxT("Next, "); + if (dbInf.fetchDirections & SQL_FD_FETCH_PRIOR) + cout << wxT("Prev, "); + if (dbInf.fetchDirections & SQL_FD_FETCH_FIRST) + cout << wxT("First, "); + if (dbInf.fetchDirections & SQL_FD_FETCH_LAST) + cout << wxT("Last, "); + if (dbInf.fetchDirections & SQL_FD_FETCH_ABSOLUTE) + cout << wxT("Absolute, "); + if (dbInf.fetchDirections & SQL_FD_FETCH_RELATIVE) + cout << wxT("Relative, "); +#ifdef ODBC_V20 + if (dbInf.fetchDirections & SQL_FD_FETCH_RESUME) + cout << wxT("Resume, "); +#endif + if (dbInf.fetchDirections & SQL_FD_FETCH_BOOKMARK) + cout << wxT("Bookmark"); + cout << endl; + + cout << wxT("Lock Types Supported (SQLSetPos): "); + if (dbInf.lockTypes & SQL_LCK_NO_CHANGE) + cout << wxT("No Change, "); + if (dbInf.lockTypes & SQL_LCK_EXCLUSIVE) + cout << wxT("Exclusive, "); + if (dbInf.lockTypes & SQL_LCK_UNLOCK) + cout << wxT("UnLock"); + cout << endl; + + cout << wxT("Position Operations Supported (SQLSetPos): "); + if (dbInf.posOperations & SQL_POS_POSITION) + cout << wxT("Position, "); + if (dbInf.posOperations & SQL_POS_REFRESH) + cout << wxT("Refresh, "); + if (dbInf.posOperations & SQL_POS_UPDATE) + cout << wxT("Upd, ")); + if (dbInf.posOperations & SQL_POS_DELETE) + cout << wxT("Del, "); + if (dbInf.posOperations & SQL_POS_ADD) + cout << wxT("Add"); + cout << endl; + + cout << wxT("Positioned Statements Supported: "); + if (dbInf.posStmts & SQL_PS_POSITIONED_DELETE) + cout << wxT("Pos delete, "); + if (dbInf.posStmts & SQL_PS_POSITIONED_UPDATE) + cout << wxT("Pos update, "); + if (dbInf.posStmts & SQL_PS_SELECT_FOR_UPDATE) + cout << wxT("Select for update"); + cout << endl; + + cout << wxT("Scroll Concurrency: "); + if (dbInf.scrollConcurrency & SQL_SCCO_READ_ONLY) + cout << wxT("Read Only, "); + if (dbInf.scrollConcurrency & SQL_SCCO_LOCK) + cout << wxT("Lock, "); + if (dbInf.scrollConcurrency & SQL_SCCO_OPT_ROWVER) + cout << wxT("Opt. Rowver, "); + if (dbInf.scrollConcurrency & SQL_SCCO_OPT_VALUES) + cout << wxT("Opt. Values"); + cout << endl; + + cout << wxT("Scroll Options: "); + if (dbInf.scrollOptions & SQL_SO_FORWARD_ONLY) + cout << wxT("Fwd Only, "); + if (dbInf.scrollOptions & SQL_SO_STATIC) + cout << wxT("Static, "); + if (dbInf.scrollOptions & SQL_SO_KEYSET_DRIVEN) + cout << wxT("Keyset Driven, "); + if (dbInf.scrollOptions & SQL_SO_DYNAMIC) + cout << wxT("Dynamic, "); + if (dbInf.scrollOptions & SQL_SO_MIXED) + cout << wxT("Mixed"); + cout << endl; + + cout << wxT("Static Sensitivity: "); + if (dbInf.staticSensitivity & SQL_SS_ADDITIONS) + cout << wxT("Additions, "); + if (dbInf.staticSensitivity & SQL_SS_DELETIONS) + cout << wxT("Deletions, "); + if (dbInf.staticSensitivity & SQL_SS_UPDATES) + cout << wxT("Updates"); + cout << endl; + + cout << wxT("Transaction Capable?: "); + switch(dbInf.txnCapable) + { + case SQL_TC_NONE: cout << wxT("No"); break; + case SQL_TC_DML: cout << wxT("DML Only"); break; + case SQL_TC_DDL_COMMIT: cout << wxT("DDL Commit"); break; + case SQL_TC_DDL_IGNORE: cout << wxT("DDL Ignore"); break; + case SQL_TC_ALL: cout << wxT("DDL & DML"); break; + } + cout << endl; + + cout << endl; +#endif + + // Completed Successfully + return true; + +} // wxDb::getDbInfo() + + +/********** wxDb::getDataTypeInfo() **********/ +bool wxDb::getDataTypeInfo(SWORD fSqlType, wxDbSqlTypeInfo &structSQLTypeInfo) +{ +/* + * fSqlType will be something like SQL_VARCHAR. This parameter determines + * the data type inf. is gathered for. + * + * wxDbSqlTypeInfo is a structure that is filled in with data type information, + */ + RETCODE retcode; + SQLLEN cbRet; + + // Get information about the data type specified + if (SQLGetTypeInfo(hstmt, fSqlType) != SQL_SUCCESS) + return(DispAllErrors(henv, hdbc, hstmt)); + + // Fetch the record + retcode = SQLFetch(hstmt); + if (retcode != SQL_SUCCESS) + { +#ifdef DBDEBUG_CONSOLE + if (retcode == SQL_NO_DATA_FOUND) + cout << wxT("SQL_NO_DATA_FOUND fetching information about data type.") << endl; +#endif + DispAllErrors(henv, hdbc, hstmt); + SQLFreeStmt(hstmt, SQL_CLOSE); + return false; + } + + wxChar typeName[DB_TYPE_NAME_LEN+1]; + + // Obtain columns from the record + if (SQLGetData(hstmt, 1, SQL_C_WXCHAR, typeName, sizeof(typeName), &cbRet) != SQL_SUCCESS) + return(DispAllErrors(henv, hdbc, hstmt)); + + structSQLTypeInfo.TypeName = typeName; + + // BJO 20000503: no more needed with new GetColumns... +#if OLD_GETCOLUMNS + // BJO 991209 + if (Dbms() == dbmsMY_SQL) + { + if (structSQLTypeInfo.TypeName == wxT("middleint")) + structSQLTypeInfo.TypeName = wxT("mediumint"); + else if (structSQLTypeInfo.TypeName == wxT("middleint unsigned")) + structSQLTypeInfo.TypeName = wxT("mediumint unsigned"); + else if (structSQLTypeInfo.TypeName == wxT("integer")) + structSQLTypeInfo.TypeName = wxT("int"); + else if (structSQLTypeInfo.TypeName == wxT("integer unsigned")) + structSQLTypeInfo.TypeName = wxT("int unsigned"); + else if (structSQLTypeInfo.TypeName == wxT("middleint")) + structSQLTypeInfo.TypeName = wxT("mediumint"); + else if (structSQLTypeInfo.TypeName == wxT("varchar")) + structSQLTypeInfo.TypeName = wxT("char"); + } + + // BJO 20000427 : OpenLink driver + if (!wxStrncmp(dbInf.driverName, wxT("oplodbc"), 7) || + !wxStrncmp(dbInf.driverName, wxT("OLOD"), 4)) + { + if (structSQLTypeInfo.TypeName == wxT("double precision")) + structSQLTypeInfo.TypeName = wxT("real"); + } +#endif + + if (SQLGetData(hstmt, 3, SQL_C_LONG, (UCHAR*) &structSQLTypeInfo.Precision, 0, &cbRet) != SQL_SUCCESS) + return(DispAllErrors(henv, hdbc, hstmt)); + if (SQLGetData(hstmt, 8, SQL_C_SHORT, (UCHAR*) &structSQLTypeInfo.CaseSensitive, 0, &cbRet) != SQL_SUCCESS) + return(DispAllErrors(henv, hdbc, hstmt)); +// if (SQLGetData(hstmt, 14, SQL_C_SHORT, (UCHAR*) &structSQLTypeInfo.MinimumScale, 0, &cbRet) != SQL_SUCCESS) +// return(DispAllErrors(henv, hdbc, hstmt)); + + if (SQLGetData(hstmt, 15, SQL_C_SHORT,(UCHAR*) &structSQLTypeInfo.MaximumScale, 0, &cbRet) != SQL_SUCCESS) + return(DispAllErrors(henv, hdbc, hstmt)); + + if (structSQLTypeInfo.MaximumScale < 0) + structSQLTypeInfo.MaximumScale = 0; + + // Close the statement handle which closes open cursors + if (SQLFreeStmt(hstmt, SQL_CLOSE) != SQL_SUCCESS) + return(DispAllErrors(henv, hdbc, hstmt)); + + // Completed Successfully + return true; + +} // wxDb::getDataTypeInfo() + + +/********** wxDb::Close() **********/ +void wxDb::Close(void) +{ + // Close the Sql Log file + if (fpSqlLog) + { + fclose(fpSqlLog); + fpSqlLog = 0; + } + + // Free statement handle + if (dbIsOpen) + { + if (SQLFreeStmt(hstmt, SQL_DROP) != SQL_SUCCESS) + DispAllErrors(henv, hdbc); + } + + // Disconnect from the datasource + if (SQLDisconnect(hdbc) != SQL_SUCCESS) + DispAllErrors(henv, hdbc); + + // Free the connection to the datasource + if (SQLFreeConnect(hdbc) != SQL_SUCCESS) + DispAllErrors(henv, hdbc); + + // There should be zero Ctable objects still connected to this db object + wxASSERT(nTables == 0); + +#ifdef __WXDEBUG__ + { +#if wxUSE_THREADS + wxCriticalSectionLocker lock(csTablesInUse); +#endif // wxUSE_THREADS + wxTablesInUse *tiu; + wxList::compatibility_iterator pNode; + pNode = TablesInUse.GetFirst(); + wxString s,s2; + while (pNode) + { + tiu = (wxTablesInUse *)pNode->GetData(); + if (tiu->pDb == this) + { + s.Printf(wxT("(%-20s) tableID:[%6lu] pDb:[%p]"), + tiu->tableName, tiu->tableID, wx_static_cast(void*, tiu->pDb)); + s2.Printf(wxT("Orphaned table found using pDb:[%p]"), wx_static_cast(void*, this)); + wxLogDebug(s.c_str(),s2.c_str()); + } + pNode = pNode->GetNext(); + } + } +#endif + + // Copy the error messages to a global variable + int i; + for (i = 0; i < DB_MAX_ERROR_HISTORY; i++) + wxStrcpy(DBerrorList[i], errorList[i]); + + dbmsType = dbmsUNIDENTIFIED; + dbIsOpen = false; + +} // wxDb::Close() + + +/********** wxDb::CommitTrans() **********/ +bool wxDb::CommitTrans(void) +{ + if (this) + { + // Commit the transaction + if (SQLTransact(henv, hdbc, SQL_COMMIT) != SQL_SUCCESS) + return(DispAllErrors(henv, hdbc)); + } + + // Completed successfully + return true; + +} // wxDb::CommitTrans() + + +/********** wxDb::RollbackTrans() **********/ +bool wxDb::RollbackTrans(void) +{ + // Rollback the transaction + if (SQLTransact(henv, hdbc, SQL_ROLLBACK) != SQL_SUCCESS) + return(DispAllErrors(henv, hdbc)); + + // Completed successfully + return true; + +} // wxDb::RollbackTrans() + + +/********** wxDb::DispAllErrors() **********/ +bool wxDb::DispAllErrors(HENV aHenv, HDBC aHdbc, HSTMT aHstmt) +/* + * This function is called internally whenever an error condition prevents the user's + * request from being executed. This function will query the datasource as to the + * actual error(s) that just occurred on the previous request of the datasource. + * + * The function will retrieve each error condition from the datasource and + * Printf the codes/text values into a string which it then logs via logError(). + * If in DBDEBUG_CONSOLE mode, the constructed string will be displayed in the console + * window and program execution will be paused until the user presses a key. + * + * This function always returns false, so that functions which call this function + * can have a line like "return (DispAllErrors(henv, hdbc));" to indicate the failure + * of the user's request, so that the calling code can then process the error message log. + */ +{ + wxString odbcErrMsg; + + while (SQLError(aHenv, aHdbc, aHstmt, (SQLTCHAR FAR *) sqlState, &nativeError, (SQLTCHAR FAR *) errorMsg, SQL_MAX_MESSAGE_LENGTH - 1, &cbErrorMsg) == SQL_SUCCESS) + { + odbcErrMsg.Printf(wxT("SQL State = %s\nNative Error Code = %li\nError Message = %s\n"), + sqlState, (long)nativeError, errorMsg); + logError(odbcErrMsg, sqlState); + if (!silent) + { +#ifdef DBDEBUG_CONSOLE + // When run in console mode, use standard out to display errors. + cout << odbcErrMsg.c_str() << endl; + cout << wxT("Press any key to continue...") << endl; + getchar(); +#endif + +#ifdef __WXDEBUG__ + wxLogDebug(odbcErrMsg,wxT("ODBC DEBUG MESSAGE from DispAllErrors()")); +#endif + } + } + + return false; // This function always returns false. + +} // wxDb::DispAllErrors() + + +/********** wxDb::GetNextError() **********/ +bool wxDb::GetNextError(HENV aHenv, HDBC aHdbc, HSTMT aHstmt) +{ + if (SQLError(aHenv, aHdbc, aHstmt, (SQLTCHAR FAR *) sqlState, &nativeError, (SQLTCHAR FAR *) errorMsg, SQL_MAX_MESSAGE_LENGTH - 1, &cbErrorMsg) == SQL_SUCCESS) + return true; + else + return false; + +} // wxDb::GetNextError() + + +/********** wxDb::DispNextError() **********/ +void wxDb::DispNextError(void) +{ + wxString odbcErrMsg; + + odbcErrMsg.Printf(wxT("SQL State = %s\nNative Error Code = %li\nError Message = %s\n"), + sqlState, (long)nativeError, errorMsg); + logError(odbcErrMsg, sqlState); + + if (silent) + return; + +#ifdef DBDEBUG_CONSOLE + // When run in console mode, use standard out to display errors. + cout << odbcErrMsg.c_str() << endl; + cout << wxT("Press any key to continue...") << endl; + getchar(); +#endif + +#ifdef __WXDEBUG__ + wxLogDebug(odbcErrMsg,wxT("ODBC DEBUG MESSAGE")); +#endif // __WXDEBUG__ + +} // wxDb::DispNextError() + + +/********** wxDb::logError() **********/ +void wxDb::logError(const wxString &errMsg, const wxString &SQLState) +{ + wxASSERT(errMsg.length()); + + static int pLast = -1; + int dbStatus; + + if (++pLast == DB_MAX_ERROR_HISTORY) + { + int i; + for (i = 0; i < DB_MAX_ERROR_HISTORY-1; i++) + wxStrcpy(errorList[i], errorList[i+1]); + pLast--; + } + + wxStrncpy(errorList[pLast], errMsg, DB_MAX_ERROR_MSG_LEN); + errorList[pLast][DB_MAX_ERROR_MSG_LEN] = 0; + + if (SQLState.length()) + if ((dbStatus = TranslateSqlState(SQLState)) != DB_ERR_FUNCTION_SEQUENCE_ERROR) + DB_STATUS = dbStatus; + + // Add the errmsg to the sql log + WriteSqlLog(errMsg); + +} // wxDb::logError() + + +/**********wxDb::TranslateSqlState() **********/ +int wxDb::TranslateSqlState(const wxString &SQLState) +{ + if (!wxStrcmp(SQLState, wxT("01000"))) + return(DB_ERR_GENERAL_WARNING); + if (!wxStrcmp(SQLState, wxT("01002"))) + return(DB_ERR_DISCONNECT_ERROR); + if (!wxStrcmp(SQLState, wxT("01004"))) + return(DB_ERR_DATA_TRUNCATED); + if (!wxStrcmp(SQLState, wxT("01006"))) + return(DB_ERR_PRIV_NOT_REVOKED); + if (!wxStrcmp(SQLState, wxT("01S00"))) + return(DB_ERR_INVALID_CONN_STR_ATTR); + if (!wxStrcmp(SQLState, wxT("01S01"))) + return(DB_ERR_ERROR_IN_ROW); + if (!wxStrcmp(SQLState, wxT("01S02"))) + return(DB_ERR_OPTION_VALUE_CHANGED); + if (!wxStrcmp(SQLState, wxT("01S03"))) + return(DB_ERR_NO_ROWS_UPD_OR_DEL); + if (!wxStrcmp(SQLState, wxT("01S04"))) + return(DB_ERR_MULTI_ROWS_UPD_OR_DEL); + if (!wxStrcmp(SQLState, wxT("07001"))) + return(DB_ERR_WRONG_NO_OF_PARAMS); + if (!wxStrcmp(SQLState, wxT("07006"))) + return(DB_ERR_DATA_TYPE_ATTR_VIOL); + if (!wxStrcmp(SQLState, wxT("08001"))) + return(DB_ERR_UNABLE_TO_CONNECT); + if (!wxStrcmp(SQLState, wxT("08002"))) + return(DB_ERR_CONNECTION_IN_USE); + if (!wxStrcmp(SQLState, wxT("08003"))) + return(DB_ERR_CONNECTION_NOT_OPEN); + if (!wxStrcmp(SQLState, wxT("08004"))) + return(DB_ERR_REJECTED_CONNECTION); + if (!wxStrcmp(SQLState, wxT("08007"))) + return(DB_ERR_CONN_FAIL_IN_TRANS); + if (!wxStrcmp(SQLState, wxT("08S01"))) + return(DB_ERR_COMM_LINK_FAILURE); + if (!wxStrcmp(SQLState, wxT("21S01"))) + return(DB_ERR_INSERT_VALUE_LIST_MISMATCH); + if (!wxStrcmp(SQLState, wxT("21S02"))) + return(DB_ERR_DERIVED_TABLE_MISMATCH); + if (!wxStrcmp(SQLState, wxT("22001"))) + return(DB_ERR_STRING_RIGHT_TRUNC); + if (!wxStrcmp(SQLState, wxT("22003"))) + return(DB_ERR_NUMERIC_VALUE_OUT_OF_RNG); + if (!wxStrcmp(SQLState, wxT("22005"))) + return(DB_ERR_ERROR_IN_ASSIGNMENT); + if (!wxStrcmp(SQLState, wxT("22008"))) + return(DB_ERR_DATETIME_FLD_OVERFLOW); + if (!wxStrcmp(SQLState, wxT("22012"))) + return(DB_ERR_DIVIDE_BY_ZERO); + if (!wxStrcmp(SQLState, wxT("22026"))) + return(DB_ERR_STR_DATA_LENGTH_MISMATCH); + if (!wxStrcmp(SQLState, wxT("23000"))) + return(DB_ERR_INTEGRITY_CONSTRAINT_VIOL); + if (!wxStrcmp(SQLState, wxT("24000"))) + return(DB_ERR_INVALID_CURSOR_STATE); + if (!wxStrcmp(SQLState, wxT("25000"))) + return(DB_ERR_INVALID_TRANS_STATE); + if (!wxStrcmp(SQLState, wxT("28000"))) + return(DB_ERR_INVALID_AUTH_SPEC); + if (!wxStrcmp(SQLState, wxT("34000"))) + return(DB_ERR_INVALID_CURSOR_NAME); + if (!wxStrcmp(SQLState, wxT("37000"))) + return(DB_ERR_SYNTAX_ERROR_OR_ACCESS_VIOL); + if (!wxStrcmp(SQLState, wxT("3C000"))) + return(DB_ERR_DUPLICATE_CURSOR_NAME); + if (!wxStrcmp(SQLState, wxT("40001"))) + return(DB_ERR_SERIALIZATION_FAILURE); + if (!wxStrcmp(SQLState, wxT("42000"))) + return(DB_ERR_SYNTAX_ERROR_OR_ACCESS_VIOL2); + if (!wxStrcmp(SQLState, wxT("70100"))) + return(DB_ERR_OPERATION_ABORTED); + if (!wxStrcmp(SQLState, wxT("IM001"))) + return(DB_ERR_UNSUPPORTED_FUNCTION); + if (!wxStrcmp(SQLState, wxT("IM002"))) + return(DB_ERR_NO_DATA_SOURCE); + if (!wxStrcmp(SQLState, wxT("IM003"))) + return(DB_ERR_DRIVER_LOAD_ERROR); + if (!wxStrcmp(SQLState, wxT("IM004"))) + return(DB_ERR_SQLALLOCENV_FAILED); + if (!wxStrcmp(SQLState, wxT("IM005"))) + return(DB_ERR_SQLALLOCCONNECT_FAILED); + if (!wxStrcmp(SQLState, wxT("IM006"))) + return(DB_ERR_SQLSETCONNECTOPTION_FAILED); + if (!wxStrcmp(SQLState, wxT("IM007"))) + return(DB_ERR_NO_DATA_SOURCE_DLG_PROHIB); + if (!wxStrcmp(SQLState, wxT("IM008"))) + return(DB_ERR_DIALOG_FAILED); + if (!wxStrcmp(SQLState, wxT("IM009"))) + return(DB_ERR_UNABLE_TO_LOAD_TRANSLATION_DLL); + if (!wxStrcmp(SQLState, wxT("IM010"))) + return(DB_ERR_DATA_SOURCE_NAME_TOO_LONG); + if (!wxStrcmp(SQLState, wxT("IM011"))) + return(DB_ERR_DRIVER_NAME_TOO_LONG); + if (!wxStrcmp(SQLState, wxT("IM012"))) + return(DB_ERR_DRIVER_KEYWORD_SYNTAX_ERROR); + if (!wxStrcmp(SQLState, wxT("IM013"))) + return(DB_ERR_TRACE_FILE_ERROR); + if (!wxStrcmp(SQLState, wxT("S0001"))) + return(DB_ERR_TABLE_OR_VIEW_ALREADY_EXISTS); + if (!wxStrcmp(SQLState, wxT("S0002"))) + return(DB_ERR_TABLE_NOT_FOUND); + if (!wxStrcmp(SQLState, wxT("S0011"))) + return(DB_ERR_INDEX_ALREADY_EXISTS); + if (!wxStrcmp(SQLState, wxT("S0012"))) + return(DB_ERR_INDEX_NOT_FOUND); + if (!wxStrcmp(SQLState, wxT("S0021"))) + return(DB_ERR_COLUMN_ALREADY_EXISTS); + if (!wxStrcmp(SQLState, wxT("S0022"))) + return(DB_ERR_COLUMN_NOT_FOUND); + if (!wxStrcmp(SQLState, wxT("S0023"))) + return(DB_ERR_NO_DEFAULT_FOR_COLUMN); + if (!wxStrcmp(SQLState, wxT("S1000"))) + return(DB_ERR_GENERAL_ERROR); + if (!wxStrcmp(SQLState, wxT("S1001"))) + return(DB_ERR_MEMORY_ALLOCATION_FAILURE); + if (!wxStrcmp(SQLState, wxT("S1002"))) + return(DB_ERR_INVALID_COLUMN_NUMBER); + if (!wxStrcmp(SQLState, wxT("S1003"))) + return(DB_ERR_PROGRAM_TYPE_OUT_OF_RANGE); + if (!wxStrcmp(SQLState, wxT("S1004"))) + return(DB_ERR_SQL_DATA_TYPE_OUT_OF_RANGE); + if (!wxStrcmp(SQLState, wxT("S1008"))) + return(DB_ERR_OPERATION_CANCELLED); + if (!wxStrcmp(SQLState, wxT("S1009"))) + return(DB_ERR_INVALID_ARGUMENT_VALUE); + if (!wxStrcmp(SQLState, wxT("S1010"))) + return(DB_ERR_FUNCTION_SEQUENCE_ERROR); + if (!wxStrcmp(SQLState, wxT("S1011"))) + return(DB_ERR_OPERATION_INVALID_AT_THIS_TIME); + if (!wxStrcmp(SQLState, wxT("S1012"))) + return(DB_ERR_INVALID_TRANS_OPERATION_CODE); + if (!wxStrcmp(SQLState, wxT("S1015"))) + return(DB_ERR_NO_CURSOR_NAME_AVAIL); + if (!wxStrcmp(SQLState, wxT("S1090"))) + return(DB_ERR_INVALID_STR_OR_BUF_LEN); + if (!wxStrcmp(SQLState, wxT("S1091"))) + return(DB_ERR_DESCRIPTOR_TYPE_OUT_OF_RANGE); + if (!wxStrcmp(SQLState, wxT("S1092"))) + return(DB_ERR_OPTION_TYPE_OUT_OF_RANGE); + if (!wxStrcmp(SQLState, wxT("S1093"))) + return(DB_ERR_INVALID_PARAM_NO); + if (!wxStrcmp(SQLState, wxT("S1094"))) + return(DB_ERR_INVALID_SCALE_VALUE); + if (!wxStrcmp(SQLState, wxT("S1095"))) + return(DB_ERR_FUNCTION_TYPE_OUT_OF_RANGE); + if (!wxStrcmp(SQLState, wxT("S1096"))) + return(DB_ERR_INF_TYPE_OUT_OF_RANGE); + if (!wxStrcmp(SQLState, wxT("S1097"))) + return(DB_ERR_COLUMN_TYPE_OUT_OF_RANGE); + if (!wxStrcmp(SQLState, wxT("S1098"))) + return(DB_ERR_SCOPE_TYPE_OUT_OF_RANGE); + if (!wxStrcmp(SQLState, wxT("S1099"))) + return(DB_ERR_NULLABLE_TYPE_OUT_OF_RANGE); + if (!wxStrcmp(SQLState, wxT("S1100"))) + return(DB_ERR_UNIQUENESS_OPTION_TYPE_OUT_OF_RANGE); + if (!wxStrcmp(SQLState, wxT("S1101"))) + return(DB_ERR_ACCURACY_OPTION_TYPE_OUT_OF_RANGE); + if (!wxStrcmp(SQLState, wxT("S1103"))) + return(DB_ERR_DIRECTION_OPTION_OUT_OF_RANGE); + if (!wxStrcmp(SQLState, wxT("S1104"))) + return(DB_ERR_INVALID_PRECISION_VALUE); + if (!wxStrcmp(SQLState, wxT("S1105"))) + return(DB_ERR_INVALID_PARAM_TYPE); + if (!wxStrcmp(SQLState, wxT("S1106"))) + return(DB_ERR_FETCH_TYPE_OUT_OF_RANGE); + if (!wxStrcmp(SQLState, wxT("S1107"))) + return(DB_ERR_ROW_VALUE_OUT_OF_RANGE); + if (!wxStrcmp(SQLState, wxT("S1108"))) + return(DB_ERR_CONCURRENCY_OPTION_OUT_OF_RANGE); + if (!wxStrcmp(SQLState, wxT("S1109"))) + return(DB_ERR_INVALID_CURSOR_POSITION); + if (!wxStrcmp(SQLState, wxT("S1110"))) + return(DB_ERR_INVALID_DRIVER_COMPLETION); + if (!wxStrcmp(SQLState, wxT("S1111"))) + return(DB_ERR_INVALID_BOOKMARK_VALUE); + if (!wxStrcmp(SQLState, wxT("S1C00"))) + return(DB_ERR_DRIVER_NOT_CAPABLE); + if (!wxStrcmp(SQLState, wxT("S1T00"))) + return(DB_ERR_TIMEOUT_EXPIRED); + + // No match + return(0); + +} // wxDb::TranslateSqlState() + + +/********** wxDb::Grant() **********/ +bool wxDb::Grant(int privileges, const wxString &tableName, const wxString &userList) +{ + wxString sqlStmt; + + // Build the grant statement + sqlStmt = wxT("GRANT "); + if (privileges == DB_GRANT_ALL) + sqlStmt += wxT("ALL"); + else + { + int c = 0; + if (privileges & DB_GRANT_SELECT) + { + sqlStmt += wxT("SELECT"); + c++; + } + if (privileges & DB_GRANT_INSERT) + { + if (c++) + sqlStmt += wxT(", "); + sqlStmt += wxT("INSERT"); + } + if (privileges & DB_GRANT_UPDATE) + { + if (c++) + sqlStmt += wxT(", "); + sqlStmt += wxT("UPDATE"); + } + if (privileges & DB_GRANT_DELETE) + { + if (c++) + sqlStmt += wxT(", "); + sqlStmt += wxT("DELETE"); + } + } + + sqlStmt += wxT(" ON "); + sqlStmt += SQLTableName(tableName); + sqlStmt += wxT(" TO "); + sqlStmt += userList; + +#ifdef DBDEBUG_CONSOLE + cout << endl << sqlStmt.c_str() << endl; +#endif + + WriteSqlLog(sqlStmt); + + return(ExecSql(sqlStmt)); + +} // wxDb::Grant() + + +/********** wxDb::CreateView() **********/ +bool wxDb::CreateView(const wxString &viewName, const wxString &colList, + const wxString &pSqlStmt, bool attemptDrop) +{ + wxString sqlStmt; + + // Drop the view first + if (attemptDrop && !DropView(viewName)) + return false; + + // Build the create view statement + sqlStmt = wxT("CREATE VIEW "); + sqlStmt += viewName; + + if (colList.length()) + { + sqlStmt += wxT(" ("); + sqlStmt += colList; + sqlStmt += wxT(")"); + } + + sqlStmt += wxT(" AS "); + sqlStmt += pSqlStmt; + + WriteSqlLog(sqlStmt); + +#ifdef DBDEBUG_CONSOLE + cout << sqlStmt.c_str() << endl; +#endif + + return(ExecSql(sqlStmt)); + +} // wxDb::CreateView() + + +/********** wxDb::DropView() **********/ +bool wxDb::DropView(const wxString &viewName) +{ +/* + * NOTE: This function returns true if the View does not exist, but + * only for identified databases. Code will need to be added + * below for any other databases when those databases are defined + * to handle this situation consistently + */ + wxString sqlStmt; + + sqlStmt.Printf(wxT("DROP VIEW %s"), viewName.c_str()); + + WriteSqlLog(sqlStmt); + +#ifdef DBDEBUG_CONSOLE + cout << endl << sqlStmt.c_str() << endl; +#endif + + if (SQLExecDirect(hstmt, (SQLTCHAR FAR *) sqlStmt.c_str(), SQL_NTS) != SQL_SUCCESS) + { + // Check for "Base table not found" error and ignore + GetNextError(henv, hdbc, hstmt); + if (wxStrcmp(sqlState,wxT("S0002"))) // "Base table not found" + { + // Check for product specific error codes + if (!((Dbms() == dbmsSYBASE_ASA && !wxStrcmp(sqlState,wxT("42000"))))) // 5.x (and lower?) + { + DispNextError(); + DispAllErrors(henv, hdbc, hstmt); + RollbackTrans(); + return false; + } + } + } + + // Commit the transaction + if (!CommitTrans()) + return false; + + return true; + +} // wxDb::DropView() + + +/********** wxDb::ExecSql() **********/ +bool wxDb::ExecSql(const wxString &pSqlStmt) +{ + RETCODE retcode; + + SQLFreeStmt(hstmt, SQL_CLOSE); + + retcode = SQLExecDirect(hstmt, (SQLTCHAR FAR *) pSqlStmt.c_str(), SQL_NTS); + if (retcode == SQL_SUCCESS || + (Dbms() == dbmsDB2 && (retcode == SQL_SUCCESS_WITH_INFO || retcode == SQL_NO_DATA_FOUND))) + { + return true; + } + else + { + DispAllErrors(henv, hdbc, hstmt); + return false; + } + +} // wxDb::ExecSql() + + +/********** wxDb::ExecSql() with column info **********/ +bool wxDb::ExecSql(const wxString &pSqlStmt, wxDbColInf** columns, short& numcols) +{ + //execute the statement first + if (!ExecSql(pSqlStmt)) + return false; + + SWORD noCols; + if (SQLNumResultCols(hstmt, &noCols) != SQL_SUCCESS) + { + DispAllErrors(henv, hdbc, hstmt); + return false; + } + + if (noCols == 0) + return false; + else + numcols = noCols; + + // Get column information + short colNum; + wxChar name[DB_MAX_COLUMN_NAME_LEN+1]; + SWORD Sword; + SQLLEN Sqllen; + wxDbColInf* pColInf = new wxDbColInf[noCols]; + + // Fill in column information (name, datatype) + for (colNum = 0; colNum < noCols; colNum++) + { + if (SQLColAttributes(hstmt, (UWORD)(colNum+1), SQL_COLUMN_NAME, + name, sizeof(name), + &Sword, &Sqllen) != SQL_SUCCESS) + { + DispAllErrors(henv, hdbc, hstmt); + delete[] pColInf; + return false; + } + + wxStrncpy(pColInf[colNum].colName, name, DB_MAX_COLUMN_NAME_LEN); + pColInf[colNum].colName[DB_MAX_COLUMN_NAME_LEN] = 0; // Prevent buffer overrun + + if (SQLColAttributes(hstmt, (UWORD)(colNum+1), SQL_COLUMN_TYPE, + NULL, 0, &Sword, &Sqllen) != SQL_SUCCESS) + { + DispAllErrors(henv, hdbc, hstmt); + delete[] pColInf; + return false; + } + + switch (Sqllen) + { +#if wxUSE_UNICODE + #if defined(SQL_WCHAR) + case SQL_WCHAR: + #endif + #if defined(SQL_WVARCHAR) + case SQL_WVARCHAR: + #endif +#endif + case SQL_VARCHAR: + case SQL_CHAR: + pColInf[colNum].dbDataType = DB_DATA_TYPE_VARCHAR; + break; + case SQL_LONGVARCHAR: + pColInf[colNum].dbDataType = DB_DATA_TYPE_MEMO; + break; + case SQL_TINYINT: + case SQL_SMALLINT: + case SQL_INTEGER: + case SQL_BIT: + pColInf[colNum].dbDataType = DB_DATA_TYPE_INTEGER; + break; + case SQL_DOUBLE: + case SQL_DECIMAL: + case SQL_NUMERIC: + case SQL_FLOAT: + case SQL_REAL: + pColInf[colNum].dbDataType = DB_DATA_TYPE_FLOAT; + break; + case SQL_DATE: + case SQL_TIMESTAMP: + pColInf[colNum].dbDataType = DB_DATA_TYPE_DATE; + break; + case SQL_BINARY: + pColInf[colNum].dbDataType = DB_DATA_TYPE_BLOB; + break; +#ifdef __WXDEBUG__ + default: + wxString errMsg; + errMsg.Printf(wxT("SQL Data type %ld currently not supported by wxWidgets"), (long)Sqllen); + wxLogDebug(errMsg,wxT("ODBC DEBUG MESSAGE")); +#endif + } + } + + *columns = pColInf; + return true; +} // wxDb::ExecSql() + +/********** wxDb::GetNext() **********/ +bool wxDb::GetNext(void) +{ + if (SQLFetch(hstmt) == SQL_SUCCESS) + return true; + else + { + DispAllErrors(henv, hdbc, hstmt); + return false; + } + +} // wxDb::GetNext() + + +/********** wxDb::GetData() **********/ +bool wxDb::GetData(UWORD colNo, SWORD cType, PTR pData, SDWORD maxLen, SQLLEN FAR *cbReturned) +{ + wxASSERT(pData); + wxASSERT(cbReturned); + + long bufferSize = maxLen; + + if (cType == SQL_C_WXCHAR) + bufferSize = maxLen * sizeof(wxChar); + + if (SQLGetData(hstmt, colNo, cType, pData, bufferSize, cbReturned) == SQL_SUCCESS) + return true; + else + { + DispAllErrors(henv, hdbc, hstmt); + return false; + } + +} // wxDb::GetData() + + +/********** wxDb::GetKeyFields() **********/ +int wxDb::GetKeyFields(const wxString &tableName, wxDbColInf* colInf, UWORD noCols) +{ + wxChar szPkTable[DB_MAX_TABLE_NAME_LEN+1]; /* Primary key table name */ + wxChar szFkTable[DB_MAX_TABLE_NAME_LEN+1]; /* Foreign key table name */ + SWORD iKeySeq; + wxChar szPkCol[DB_MAX_COLUMN_NAME_LEN+1]; /* Primary key column */ + wxChar szFkCol[DB_MAX_COLUMN_NAME_LEN+1]; /* Foreign key column */ + SQLRETURN retcode; + SQLLEN cb; + SWORD i; + wxString tempStr; + /* + * ----------------------------------------------------------------------- + * -- 19991224 : mj10777 : Create ------ + * -- : Three things are done and stored here : ------ + * -- : 1) which Column(s) is/are Primary Key(s) ------ + * -- : 2) which tables use this Key as a Foreign Key ------ + * -- : 3) which columns are Foreign Key and the name ------ + * -- : of the Table where the Key is the Primary Key ----- + * -- : Called from GetColumns(const wxString &tableName, ------ + * -- int *numCols,const wxChar *userID ) ------ + * ----------------------------------------------------------------------- + */ + + /*---------------------------------------------------------------------*/ + /* Get the names of the columns in the primary key. */ + /*---------------------------------------------------------------------*/ + retcode = SQLPrimaryKeys(hstmt, + NULL, 0, /* Catalog name */ + NULL, 0, /* Schema name */ + (SQLTCHAR FAR *) tableName.c_str(), SQL_NTS); /* Table name */ + + /*---------------------------------------------------------------------*/ + /* Fetch and display the result set. This will be a list of the */ + /* columns in the primary key of the tableName table. */ + /*---------------------------------------------------------------------*/ + while ((retcode == SQL_SUCCESS) || (retcode == SQL_SUCCESS_WITH_INFO)) + { + retcode = SQLFetch(hstmt); + if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) + { + GetData( 4, SQL_C_WXCHAR, szPkCol, DB_MAX_COLUMN_NAME_LEN+1, &cb); + GetData( 5, SQL_C_SSHORT, &iKeySeq, 0, &cb); + //------- + for (i=0;iGetColumns(tableList, userID); + * if (colInf) + * { + * // Use the column inf + * ....... + * // Destroy the memory + * delete [] colInf; + * } + * + * userID is evaluated in the following manner: + * userID == NULL ... UserID is ignored + * userID == "" ... UserID set equal to 'this->uid' + * userID != "" ... UserID set equal to 'userID' + * + * NOTE: ALL column bindings associated with this wxDb instance are unbound + * by this function. This function should use its own wxDb instance + * to avoid undesired unbinding of columns. + */ +{ + UWORD noCols = 0; + UWORD colNo = 0; + wxDbColInf *colInf = 0; + + RETCODE retcode; + SQLLEN cb; + + wxString TableName; + + wxString UserID; + convertUserID(userID,UserID); + + // Pass 1 - Determine how many columns there are. + // Pass 2 - Allocate the wxDbColInf array and fill in + // the array with the column information. + int pass; + for (pass = 1; pass <= 2; pass++) + { + if (pass == 2) + { + if (noCols == 0) // Probably a bogus table name(s) + break; + // Allocate n wxDbColInf objects to hold the column information + colInf = new wxDbColInf[noCols+1]; + if (!colInf) + break; + // Mark the end of the array + wxStrcpy(colInf[noCols].tableName, wxEmptyString); + wxStrcpy(colInf[noCols].colName, wxEmptyString); + colInf[noCols].sqlDataType = 0; + } + // Loop through each table name + int tbl; + for (tbl = 0; tableName[tbl]; tbl++) + { + TableName = tableName[tbl]; + // Oracle and Interbase table names are uppercase only, so force + // the name to uppercase just in case programmer forgot to do this + if ((Dbms() == dbmsORACLE) || + (Dbms() == dbmsFIREBIRD) || + (Dbms() == dbmsINTERBASE)) + TableName = TableName.Upper(); + + SQLFreeStmt(hstmt, SQL_CLOSE); + + // MySQL, SQLServer, and Access cannot accept a user name when looking up column names, so we + // use the call below that leaves out the user name + if (!UserID.empty() && + Dbms() != dbmsMY_SQL && + Dbms() != dbmsACCESS && + Dbms() != dbmsMS_SQL_SERVER) + { + retcode = SQLColumns(hstmt, + NULL, 0, // All qualifiers + (SQLTCHAR *) UserID.c_str(), SQL_NTS, // Owner + (SQLTCHAR *) TableName.c_str(), SQL_NTS, + NULL, 0); // All columns + } + else + { + retcode = SQLColumns(hstmt, + NULL, 0, // All qualifiers + NULL, 0, // Owner + (SQLTCHAR *) TableName.c_str(), SQL_NTS, + NULL, 0); // All columns + } + if (retcode != SQL_SUCCESS) + { // Error occurred, abort + DispAllErrors(henv, hdbc, hstmt); + if (colInf) + delete [] colInf; + SQLFreeStmt(hstmt, SQL_CLOSE); + return(0); + } + + while ((retcode = SQLFetch(hstmt)) == SQL_SUCCESS) + { + if (pass == 1) // First pass, just add up the number of columns + noCols++; + else // Pass 2; Fill in the array of structures + { + if (colNo < noCols) // Some extra error checking to prevent memory overwrites + { + // NOTE: Only the ODBC 1.x fields are retrieved + GetData( 1, SQL_C_WXCHAR, (UCHAR*) colInf[colNo].catalog, 128+1, &cb); + GetData( 2, SQL_C_WXCHAR, (UCHAR*) colInf[colNo].schema, 128+1, &cb); + GetData( 3, SQL_C_WXCHAR, (UCHAR*) colInf[colNo].tableName, DB_MAX_TABLE_NAME_LEN+1, &cb); + GetData( 4, SQL_C_WXCHAR, (UCHAR*) colInf[colNo].colName, DB_MAX_COLUMN_NAME_LEN+1, &cb); + GetData( 5, SQL_C_SSHORT, (UCHAR*) &colInf[colNo].sqlDataType, 0, &cb); + GetData( 6, SQL_C_WXCHAR, (UCHAR*) colInf[colNo].typeName, 128+1, &cb); + GetData( 7, SQL_C_SLONG, (UCHAR*) &colInf[colNo].columnLength, 0, &cb); + GetData( 8, SQL_C_SSHORT, (UCHAR*) &colInf[colNo].bufferSize, 0, &cb); + GetData( 9, SQL_C_SSHORT, (UCHAR*) &colInf[colNo].decimalDigits,0, &cb); + GetData(10, SQL_C_SSHORT, (UCHAR*) &colInf[colNo].numPrecRadix, 0, &cb); + GetData(11, SQL_C_SSHORT, (UCHAR*) &colInf[colNo].nullable, 0, &cb); + GetData(12, SQL_C_WXCHAR, (UCHAR*) colInf[colNo].remarks, 254+1, &cb); + + // Determine the wxDb data type that is used to represent the native data type of this data source + colInf[colNo].dbDataType = 0; + if (!wxStricmp(typeInfVarchar.TypeName,colInf[colNo].typeName)) + { +#ifdef _IODBC_ + // IODBC does not return a correct columnLength, so we set + // columnLength = bufferSize if no column length was returned + // IODBC returns the columnLength in bufferSize. (bug) + if (colInf[colNo].columnLength < 1) + { + colInf[colNo].columnLength = colInf[colNo].bufferSize; + } +#endif + colInf[colNo].dbDataType = DB_DATA_TYPE_VARCHAR; + } + else if (!wxStricmp(typeInfInteger.TypeName, colInf[colNo].typeName)) + colInf[colNo].dbDataType = DB_DATA_TYPE_INTEGER; + else if (!wxStricmp(typeInfFloat.TypeName, colInf[colNo].typeName)) + colInf[colNo].dbDataType = DB_DATA_TYPE_FLOAT; + else if (!wxStricmp(typeInfDate.TypeName, colInf[colNo].typeName)) + colInf[colNo].dbDataType = DB_DATA_TYPE_DATE; + else if (!wxStricmp(typeInfBlob.TypeName, colInf[colNo].typeName)) + colInf[colNo].dbDataType = DB_DATA_TYPE_BLOB; + colNo++; + } + } + } + if (retcode != SQL_NO_DATA_FOUND) + { // Error occurred, abort + DispAllErrors(henv, hdbc, hstmt); + if (colInf) + delete [] colInf; + SQLFreeStmt(hstmt, SQL_CLOSE); + return(0); + } + } + } + + SQLFreeStmt(hstmt, SQL_CLOSE); + return colInf; + +} // wxDb::GetColumns() + + +/********** wxDb::GetColumns() **********/ + +wxDbColInf *wxDb::GetColumns(const wxString &tableName, UWORD *numCols, const wxChar *userID) +// +// Same as the above GetColumns() function except this one gets columns +// only for a single table, and if 'numCols' is not NULL, the number of +// columns stored in the returned wxDbColInf is set in '*numCols' +// +// userID is evaluated in the following manner: +// userID == NULL ... UserID is ignored +// userID == "" ... UserID set equal to 'this->uid' +// userID != "" ... UserID set equal to 'userID' +// +// NOTE: ALL column bindings associated with this wxDb instance are unbound +// by this function. This function should use its own wxDb instance +// to avoid undesired unbinding of columns. + +{ + UWORD noCols = 0; + UWORD colNo = 0; + wxDbColInf *colInf = 0; + + RETCODE retcode; + SQLLEN cb; + + wxString TableName; + + wxString UserID; + convertUserID(userID,UserID); + + // Pass 1 - Determine how many columns there are. + // Pass 2 - Allocate the wxDbColInf array and fill in + // the array with the column information. + int pass; + for (pass = 1; pass <= 2; pass++) + { + if (pass == 2) + { + if (noCols == 0) // Probably a bogus table name(s) + break; + // Allocate n wxDbColInf objects to hold the column information + colInf = new wxDbColInf[noCols+1]; + if (!colInf) + break; + // Mark the end of the array + wxStrcpy(colInf[noCols].tableName, wxEmptyString); + wxStrcpy(colInf[noCols].colName, wxEmptyString); + colInf[noCols].sqlDataType = 0; + } + + TableName = tableName; + // Oracle and Interbase table names are uppercase only, so force + // the name to uppercase just in case programmer forgot to do this + if ((Dbms() == dbmsORACLE) || + (Dbms() == dbmsFIREBIRD) || + (Dbms() == dbmsINTERBASE)) + TableName = TableName.Upper(); + + SQLFreeStmt(hstmt, SQL_CLOSE); + + // MySQL, SQLServer, and Access cannot accept a user name when looking up column names, so we + // use the call below that leaves out the user name + if (!UserID.empty() && + Dbms() != dbmsMY_SQL && + Dbms() != dbmsACCESS && + Dbms() != dbmsMS_SQL_SERVER) + { + retcode = SQLColumns(hstmt, + NULL, 0, // All qualifiers + (SQLTCHAR *) UserID.c_str(), SQL_NTS, // Owner + (SQLTCHAR *) TableName.c_str(), SQL_NTS, + NULL, 0); // All columns + } + else + { + retcode = SQLColumns(hstmt, + NULL, 0, // All qualifiers + NULL, 0, // Owner + (SQLTCHAR *) TableName.c_str(), SQL_NTS, + NULL, 0); // All columns + } + if (retcode != SQL_SUCCESS) + { // Error occurred, abort + DispAllErrors(henv, hdbc, hstmt); + if (colInf) + delete [] colInf; + SQLFreeStmt(hstmt, SQL_CLOSE); + if (numCols) + *numCols = 0; + return(0); + } + + while ((retcode = SQLFetch(hstmt)) == SQL_SUCCESS) + { + if (pass == 1) // First pass, just add up the number of columns + noCols++; + else // Pass 2; Fill in the array of structures + { + if (colNo < noCols) // Some extra error checking to prevent memory overwrites + { + // NOTE: Only the ODBC 1.x fields are retrieved + GetData( 1, SQL_C_WXCHAR, (UCHAR*) colInf[colNo].catalog, 128+1, &cb); + GetData( 2, SQL_C_WXCHAR, (UCHAR*) colInf[colNo].schema, 128+1, &cb); + GetData( 3, SQL_C_WXCHAR, (UCHAR*) colInf[colNo].tableName, DB_MAX_TABLE_NAME_LEN+1, &cb); + GetData( 4, SQL_C_WXCHAR, (UCHAR*) colInf[colNo].colName, DB_MAX_COLUMN_NAME_LEN+1, &cb); + GetData( 5, SQL_C_SSHORT, (UCHAR*) &colInf[colNo].sqlDataType, 0, &cb); + GetData( 6, SQL_C_WXCHAR, (UCHAR*) colInf[colNo].typeName, 128+1, &cb); + GetData( 7, SQL_C_SLONG, (UCHAR*) &colInf[colNo].columnLength, 0, &cb); + // BJO 991214 : SQL_C_SSHORT instead of SQL_C_SLONG, otherwise fails on Sparc (probably all 64 bit architectures) + GetData( 8, SQL_C_SSHORT, (UCHAR*) &colInf[colNo].bufferSize, 0, &cb); + GetData( 9, SQL_C_SSHORT, (UCHAR*) &colInf[colNo].decimalDigits,0, &cb); + GetData(10, SQL_C_SSHORT, (UCHAR*) &colInf[colNo].numPrecRadix, 0, &cb); + GetData(11, SQL_C_SSHORT, (UCHAR*) &colInf[colNo].nullable, 0, &cb); + GetData(12, SQL_C_WXCHAR, (UCHAR*) colInf[colNo].remarks, 254+1, &cb); + // Start Values for Primary/Foriegn Key (=No) + colInf[colNo].PkCol = 0; // Primary key column 0=No; 1= First Key, 2 = Second Key etc. + colInf[colNo].PkTableName[0] = 0; // Tablenames where Primary Key is used as a Foreign Key + colInf[colNo].FkCol = 0; // Foreign key column 0=No; 1= First Key, 2 = Second Key etc. + colInf[colNo].FkTableName[0] = 0; // Foreign key table name + + // BJO 20000428 : Virtuoso returns type names with upper cases! + if (Dbms() == dbmsVIRTUOSO) + { + wxString s = colInf[colNo].typeName; + s = s.MakeLower(); + wxStrcmp(colInf[colNo].typeName, s.c_str()); + } + + // Determine the wxDb data type that is used to represent the native data type of this data source + colInf[colNo].dbDataType = 0; + if (!wxStricmp(typeInfVarchar.TypeName, colInf[colNo].typeName)) + { +#ifdef _IODBC_ + // IODBC does not return a correct columnLength, so we set + // columnLength = bufferSize if no column length was returned + // IODBC returns the columnLength in bufferSize. (bug) + if (colInf[colNo].columnLength < 1) + { + colInf[colNo].columnLength = colInf[colNo].bufferSize; + } +#endif + + colInf[colNo].dbDataType = DB_DATA_TYPE_VARCHAR; + } + else if (!wxStricmp(typeInfInteger.TypeName, colInf[colNo].typeName)) + colInf[colNo].dbDataType = DB_DATA_TYPE_INTEGER; + else if (!wxStricmp(typeInfFloat.TypeName, colInf[colNo].typeName)) + colInf[colNo].dbDataType = DB_DATA_TYPE_FLOAT; + else if (!wxStricmp(typeInfDate.TypeName, colInf[colNo].typeName)) + colInf[colNo].dbDataType = DB_DATA_TYPE_DATE; + else if (!wxStricmp(typeInfBlob.TypeName, colInf[colNo].typeName)) + colInf[colNo].dbDataType = DB_DATA_TYPE_BLOB; + + colNo++; + } + } + } + if (retcode != SQL_NO_DATA_FOUND) + { // Error occurred, abort + DispAllErrors(henv, hdbc, hstmt); + if (colInf) + delete [] colInf; + SQLFreeStmt(hstmt, SQL_CLOSE); + if (numCols) + *numCols = 0; + return(0); + } + } + + SQLFreeStmt(hstmt, SQL_CLOSE); + + // Store Primary and Foriegn Keys + GetKeyFields(tableName,colInf,noCols); + + if (numCols) + *numCols = noCols; + return colInf; + +} // wxDb::GetColumns() + + +#else // New GetColumns + + +/* + BJO 20000503 + These are tentative new GetColumns members which should be more database + independent and which always returns the columns in the order they were + created. + + - The first one (wxDbColInf *wxDb::GetColumns(wxChar *tableName[], const + wxChar* userID)) calls the second implementation for each separate table + before merging the results. This makes the code easier to maintain as + only one member (the second) makes the real work + - wxDbColInf *wxDb::GetColumns(const wxString &tableName, int *numCols, const + wxChar *userID) is a little bit improved + - It doesn't anymore rely on the type-name to find out which database-type + each column has + - It ends by sorting the columns, so that they are returned in the same + order they were created +*/ + +typedef struct +{ + UWORD noCols; + wxDbColInf *colInf; +} _TableColumns; + + +wxDbColInf *wxDb::GetColumns(wxChar *tableName[], const wxChar *userID) +{ + int i, j; + // The last array element of the tableName[] argument must be zero (null). + // This is how the end of the array is detected. + + UWORD noCols = 0; + + // How many tables ? + int tbl; + for (tbl = 0 ; tableName[tbl]; tbl++); + + // Create a table to maintain the columns for each separate table + _TableColumns *TableColumns = new _TableColumns[tbl]; + + // Fill the table + for (i = 0 ; i < tbl ; i++) + + { + TableColumns[i].colInf = GetColumns(tableName[i], &TableColumns[i].noCols, userID); + if (TableColumns[i].colInf == NULL) + return NULL; + noCols += TableColumns[i].noCols; + } + + // Now merge all the separate table infos + wxDbColInf *colInf = new wxDbColInf[noCols+1]; + + // Mark the end of the array + wxStrcpy(colInf[noCols].tableName, wxEmptyString); + wxStrcpy(colInf[noCols].colName, wxEmptyString); + colInf[noCols].sqlDataType = 0; + + // Merge ... + int offset = 0; + + for (i = 0 ; i < tbl ; i++) + { + for (j = 0 ; j < TableColumns[i].noCols ; j++) + { + colInf[offset++] = TableColumns[i].colInf[j]; + } + } + + delete [] TableColumns; + + return colInf; +} // wxDb::GetColumns() -- NEW + + +wxDbColInf *wxDb::GetColumns(const wxString &tableName, int *numCols, const wxChar *userID) +// +// Same as the above GetColumns() function except this one gets columns +// only for a single table, and if 'numCols' is not NULL, the number of +// columns stored in the returned wxDbColInf is set in '*numCols' +// +// userID is evaluated in the following manner: +// userID == NULL ... UserID is ignored +// userID == "" ... UserID set equal to 'this->uid' +// userID != "" ... UserID set equal to 'userID' +// +// NOTE: ALL column bindings associated with this wxDb instance are unbound +// by this function. This function should use its own wxDb instance +// to avoid undesired unbinding of columns. +{ + UWORD noCols = 0; + UWORD colNo = 0; + wxDbColInf *colInf = 0; + + RETCODE retcode; + SDWORD cb; + + wxString TableName; + + wxString UserID; + convertUserID(userID,UserID); + + // Pass 1 - Determine how many columns there are. + // Pass 2 - Allocate the wxDbColInf array and fill in + // the array with the column information. + int pass; + for (pass = 1; pass <= 2; pass++) + { + if (pass == 2) + { + if (noCols == 0) // Probably a bogus table name(s) + break; + // Allocate n wxDbColInf objects to hold the column information + colInf = new wxDbColInf[noCols+1]; + if (!colInf) + break; + // Mark the end of the array + wxStrcpy(colInf[noCols].tableName, wxEmptyString); + wxStrcpy(colInf[noCols].colName, wxEmptyString); + colInf[noCols].sqlDataType = 0; + } + + TableName = tableName; + // Oracle and Interbase table names are uppercase only, so force + // the name to uppercase just in case programmer forgot to do this + if ((Dbms() == dbmsORACLE) || + (Dbms() == dbmsFIREBIRD) || + (Dbms() == dbmsINTERBASE)) + TableName = TableName.Upper(); + + SQLFreeStmt(hstmt, SQL_CLOSE); + + // MySQL, SQLServer, and Access cannot accept a user name when looking up column names, so we + // use the call below that leaves out the user name + if (!UserID.empty() && + Dbms() != dbmsMY_SQL && + Dbms() != dbmsACCESS && + Dbms() != dbmsMS_SQL_SERVER) + { + retcode = SQLColumns(hstmt, + NULL, 0, // All qualifiers + (UCHAR *) UserID.c_str(), SQL_NTS, // Owner + (UCHAR *) TableName.c_str(), SQL_NTS, + NULL, 0); // All columns + } + else + { + retcode = SQLColumns(hstmt, + NULL, 0, // All qualifiers + NULL, 0, // Owner + (UCHAR *) TableName.c_str(), SQL_NTS, + NULL, 0); // All columns + } + if (retcode != SQL_SUCCESS) + { // Error occurred, abort + DispAllErrors(henv, hdbc, hstmt); + if (colInf) + delete [] colInf; + SQLFreeStmt(hstmt, SQL_CLOSE); + if (numCols) + *numCols = 0; + return(0); + } + + while ((retcode = SQLFetch(hstmt)) == SQL_SUCCESS) + { + if (pass == 1) // First pass, just add up the number of columns + noCols++; + else // Pass 2; Fill in the array of structures + { + if (colNo < noCols) // Some extra error checking to prevent memory overwrites + { + // NOTE: Only the ODBC 1.x fields are retrieved + GetData( 1, SQL_C_WXCHAR, (UCHAR*) colInf[colNo].catalog, 128+1, &cb); + GetData( 2, SQL_C_WXCHAR, (UCHAR*) colInf[colNo].schema, 128+1, &cb); + GetData( 3, SQL_C_WXCHAR, (UCHAR*) colInf[colNo].tableName, DB_MAX_TABLE_NAME_LEN+1, &cb); + GetData( 4, SQL_C_WXCHAR, (UCHAR*) colInf[colNo].colName, DB_MAX_COLUMN_NAME_LEN+1, &cb); + GetData( 5, SQL_C_SSHORT, (UCHAR*) &colInf[colNo].sqlDataType, 0, &cb); + GetData( 6, SQL_C_WXCHAR, (UCHAR*) colInf[colNo].typeName, 128+1, &cb); + GetData( 7, SQL_C_SLONG, (UCHAR*) &colInf[colNo].columnLength, 0, &cb); + GetData( 8, SQL_C_SSHORT, (UCHAR*) &colInf[colNo].bufferSize, 0, &cb); + GetData( 9, SQL_C_SSHORT, (UCHAR*) &colInf[colNo].decimalDigits,0, &cb); + GetData(10, SQL_C_SSHORT, (UCHAR*) &colInf[colNo].numPrecRadix, 0, &cb); + GetData(11, SQL_C_SSHORT, (UCHAR*) &colInf[colNo].nullable, 0, &cb); + GetData(12, SQL_C_WXCHAR, (UCHAR*) colInf[colNo].remarks, 254+1, &cb); + // Start Values for Primary/Foriegn Key (=No) + colInf[colNo].PkCol = 0; // Primary key column 0=No; 1= First Key, 2 = Second Key etc. + colInf[colNo].PkTableName[0] = 0; // Tablenames where Primary Key is used as a Foreign Key + colInf[colNo].FkCol = 0; // Foreign key column 0=No; 1= First Key, 2 = Second Key etc. + colInf[colNo].FkTableName[0] = 0; // Foreign key table name + +#ifdef _IODBC_ + // IODBC does not return a correct columnLength, so we set + // columnLength = bufferSize if no column length was returned + // IODBC returns the columnLength in bufferSize. (bug) + if (colInf[colNo].columnLength < 1) + { + colInf[colNo].columnLength = colInf[colNo].bufferSize; + } +#endif + + // Determine the wxDb data type that is used to represent the native data type of this data source + colInf[colNo].dbDataType = 0; + // Get the intern datatype + switch (colInf[colNo].sqlDataType) + { +#if wxUSE_UNICODE + #if defined(SQL_WCHAR) + case SQL_WCHAR: + #endif + #if defined(SQL_WVARCHAR) + case SQL_WVARCHAR: + #endif +#endif + case SQL_VARCHAR: + case SQL_CHAR: + colInf[colNo].dbDataType = DB_DATA_TYPE_VARCHAR; + break; + case SQL_LONGVARCHAR: + colInf[colNo].dbDataType = DB_DATA_TYPE_MEMO; + break; + case SQL_TINYINT: + case SQL_SMALLINT: + case SQL_INTEGER: + case SQL_BIT: + colInf[colNo].dbDataType = DB_DATA_TYPE_INTEGER; + break; + case SQL_DOUBLE: + case SQL_DECIMAL: + case SQL_NUMERIC: + case SQL_FLOAT: + case SQL_REAL: + colInf[colNo].dbDataType = DB_DATA_TYPE_FLOAT; + break; + case SQL_DATE: + case SQL_TIMESTAMP: + colInf[colNo].dbDataType = DB_DATA_TYPE_DATE; + break; + case SQL_BINARY: + colInf[colNo].dbDataType = DB_DATA_TYPE_BLOB; + break; +#ifdef __WXDEBUG__ + default: + wxString errMsg; + errMsg.Printf(wxT("SQL Data type %d currently not supported by wxWidgets"), colInf[colNo].sqlDataType); + wxLogDebug(errMsg,wxT("ODBC DEBUG MESSAGE")); +#endif + } + colNo++; + } + } + } + if (retcode != SQL_NO_DATA_FOUND) + { // Error occurred, abort + DispAllErrors(henv, hdbc, hstmt); + if (colInf) + delete [] colInf; + SQLFreeStmt(hstmt, SQL_CLOSE); + if (numCols) + *numCols = 0; + return(0); + } + } + + SQLFreeStmt(hstmt, SQL_CLOSE); + + // Store Primary and Foreign Keys + GetKeyFields(tableName,colInf,noCols); + + /////////////////////////////////////////////////////////////////////////// + // Now sort the the columns in order to make them appear in the right order + /////////////////////////////////////////////////////////////////////////// + + // Build a generic SELECT statement which returns 0 rows + wxString Stmt; + + Stmt.Printf(wxT("select * from \"%s\" where 0=1"), tableName); + + // Execute query + if (SQLExecDirect(hstmt, (UCHAR FAR *) Stmt.c_str(), SQL_NTS) != SQL_SUCCESS) + { + DispAllErrors(henv, hdbc, hstmt); + return NULL; + } + + // Get the number of result columns + if (SQLNumResultCols (hstmt, &noCols) != SQL_SUCCESS) + { + DispAllErrors(henv, hdbc, hstmt); + return NULL; + } + + if (noCols == 0) // Probably a bogus table name + return NULL; + + // Get the name + int i; + short colNum; + UCHAR name[100]; + SWORD Sword; + SDWORD Sdword; + for (colNum = 0; colNum < noCols; colNum++) + { + if (SQLColAttributes(hstmt,colNum+1, SQL_COLUMN_NAME, + name, sizeof(name), + &Sword, &Sdword) != SQL_SUCCESS) + { + DispAllErrors(henv, hdbc, hstmt); + return NULL; + } + + wxString Name1 = name; + Name1 = Name1.Upper(); + + // Where is this name in the array ? + for (i = colNum ; i < noCols ; i++) + { + wxString Name2 = colInf[i].colName; + Name2 = Name2.Upper(); + if (Name2 == Name1) + { + if (colNum != i) // swap to sort + { + wxDbColInf tmpColInf = colInf[colNum]; + colInf[colNum] = colInf[i]; + colInf[i] = tmpColInf; + } + break; + } + } + } + SQLFreeStmt(hstmt, SQL_CLOSE); + + /////////////////////////////////////////////////////////////////////////// + // End sorting + /////////////////////////////////////////////////////////////////////////// + + if (numCols) + *numCols = noCols; + return colInf; + +} // wxDb::GetColumns() + + +#endif // #else OLD_GETCOLUMNS + + +/********** wxDb::GetColumnCount() **********/ +int wxDb::GetColumnCount(const wxString &tableName, const wxChar *userID) +/* + * Returns a count of how many columns are in a table. + * If an error occurs in computing the number of columns + * this function will return a -1 for the count + * + * userID is evaluated in the following manner: + * userID == NULL ... UserID is ignored + * userID == "" ... UserID set equal to 'this->uid' + * userID != "" ... UserID set equal to 'userID' + * + * NOTE: ALL column bindings associated with this wxDb instance are unbound + * by this function. This function should use its own wxDb instance + * to avoid undesired unbinding of columns. + */ +{ + UWORD noCols = 0; + + RETCODE retcode; + + wxString TableName; + + wxString UserID; + convertUserID(userID,UserID); + + TableName = tableName; + // Oracle and Interbase table names are uppercase only, so force + // the name to uppercase just in case programmer forgot to do this + if ((Dbms() == dbmsORACLE) || + (Dbms() == dbmsFIREBIRD) || + (Dbms() == dbmsINTERBASE)) + TableName = TableName.Upper(); + + SQLFreeStmt(hstmt, SQL_CLOSE); + + // MySQL, SQLServer, and Access cannot accept a user name when looking up column names, so we + // use the call below that leaves out the user name + if (!UserID.empty() && + Dbms() != dbmsMY_SQL && + Dbms() != dbmsACCESS && + Dbms() != dbmsMS_SQL_SERVER) + { + retcode = SQLColumns(hstmt, + NULL, 0, // All qualifiers + (SQLTCHAR *) UserID.c_str(), SQL_NTS, // Owner + (SQLTCHAR *) TableName.c_str(), SQL_NTS, + NULL, 0); // All columns + } + else + { + retcode = SQLColumns(hstmt, + NULL, 0, // All qualifiers + NULL, 0, // Owner + (SQLTCHAR *) TableName.c_str(), SQL_NTS, + NULL, 0); // All columns + } + if (retcode != SQL_SUCCESS) + { // Error occurred, abort + DispAllErrors(henv, hdbc, hstmt); + SQLFreeStmt(hstmt, SQL_CLOSE); + return(-1); + } + + // Count the columns + while ((retcode = SQLFetch(hstmt)) == SQL_SUCCESS) + noCols++; + + if (retcode != SQL_NO_DATA_FOUND) + { // Error occurred, abort + DispAllErrors(henv, hdbc, hstmt); + SQLFreeStmt(hstmt, SQL_CLOSE); + return(-1); + } + + SQLFreeStmt(hstmt, SQL_CLOSE); + return noCols; + +} // wxDb::GetColumnCount() + + +/********** wxDb::GetCatalog() *******/ +wxDbInf *wxDb::GetCatalog(const wxChar *userID) +/* + * --------------------------------------------------------------------- + * -- 19991203 : mj10777 : Create ------ + * -- : Creates a wxDbInf with Tables / Cols Array ------ + * -- : uses SQLTables and fills pTableInf; ------ + * -- : pColInf is set to NULL and numCols to 0; ------ + * -- : returns pDbInf (wxDbInf) ------ + * -- - if unsuccessful (pDbInf == NULL) ------ + * -- : pColInf can be filled with GetColumns(..); ------ + * -- : numCols can be filled with GetColumnCount(..); ------ + * --------------------------------------------------------------------- + * + * userID is evaluated in the following manner: + * userID == NULL ... UserID is ignored + * userID == "" ... UserID set equal to 'this->uid' + * userID != "" ... UserID set equal to 'userID' + * + * NOTE: ALL column bindings associated with this wxDb instance are unbound + * by this function. This function should use its own wxDb instance + * to avoid undesired unbinding of columns. + */ +{ + int noTab = 0; // Counter while filling table entries + int pass; + RETCODE retcode; + SQLLEN cb; + wxString tblNameSave; + + wxString UserID; + convertUserID(userID,UserID); + + //------------------------------------------------------------- + // Create the Database Array of catalog entries + + wxDbInf *pDbInf = new wxDbInf; + + //------------------------------------------------------------- + // Table Information + // Pass 1 - Determine how many Tables there are. + // Pass 2 - Create the Table array and fill it + // - Create the Cols array = NULL + //------------------------------------------------------------- + + for (pass = 1; pass <= 2; pass++) + { + SQLFreeStmt(hstmt, SQL_CLOSE); // Close if Open + tblNameSave.Empty(); + + if (!UserID.empty() && + Dbms() != dbmsMY_SQL && + Dbms() != dbmsACCESS && + Dbms() != dbmsMS_SQL_SERVER) + { + retcode = SQLTables(hstmt, + NULL, 0, // All qualifiers + (SQLTCHAR *) UserID.c_str(), SQL_NTS, // User specified + NULL, 0, // All tables + NULL, 0); // All columns + } + else + { + retcode = SQLTables(hstmt, + NULL, 0, // All qualifiers + NULL, 0, // User specified + NULL, 0, // All tables + NULL, 0); // All columns + } + + if (retcode != SQL_SUCCESS) + { + DispAllErrors(henv, hdbc, hstmt); + pDbInf = NULL; + SQLFreeStmt(hstmt, SQL_CLOSE); + return pDbInf; + } + + while ((retcode = SQLFetch(hstmt)) == SQL_SUCCESS) // Table Information + { + if (pass == 1) // First pass, just count the Tables + { + if (pDbInf->numTables == 0) + { + GetData( 1, SQL_C_WXCHAR, (UCHAR*) pDbInf->catalog, 128+1, &cb); + GetData( 2, SQL_C_WXCHAR, (UCHAR*) pDbInf->schema, 128+1, &cb); + } + pDbInf->numTables++; // Counter for Tables + } // if (pass == 1) + if (pass == 2) // Create and fill the Table entries + { + if (pDbInf->pTableInf == NULL) // Has the Table Array been created + { // no, then create the Array + pDbInf->pTableInf = new wxDbTableInf[pDbInf->numTables]; + noTab = 0; + } // if (pDbInf->pTableInf == NULL) // Has the Table Array been created + + GetData( 3, SQL_C_WXCHAR, (UCHAR*) (pDbInf->pTableInf+noTab)->tableName, DB_MAX_TABLE_NAME_LEN+1, &cb); + GetData( 4, SQL_C_WXCHAR, (UCHAR*) (pDbInf->pTableInf+noTab)->tableType, 30+1, &cb); + GetData( 5, SQL_C_WXCHAR, (UCHAR*) (pDbInf->pTableInf+noTab)->tableRemarks, 254+1, &cb); + + noTab++; + } // if + } // while + } // for + SQLFreeStmt(hstmt, SQL_CLOSE); + + // Query how many columns are in each table + for (noTab=0;noTabnumTables;noTab++) + { + (pDbInf->pTableInf+noTab)->numCols = (UWORD)GetColumnCount((pDbInf->pTableInf+noTab)->tableName,UserID); + } + + return pDbInf; + +} // wxDb::GetCatalog() + + +/********** wxDb::Catalog() **********/ +bool wxDb::Catalog(const wxChar *userID, const wxString &fileName) +/* + * Creates the text file specified in 'filename' which will contain + * a minimal data dictionary of all tables accessible by the user specified + * in 'userID' + * + * userID is evaluated in the following manner: + * userID == NULL ... UserID is ignored + * userID == "" ... UserID set equal to 'this->uid' + * userID != "" ... UserID set equal to 'userID' + * + * NOTE: ALL column bindings associated with this wxDb instance are unbound + * by this function. This function should use its own wxDb instance + * to avoid undesired unbinding of columns. + */ +{ + wxASSERT(fileName.length()); + + RETCODE retcode; + SQLLEN cb; + wxChar tblName[DB_MAX_TABLE_NAME_LEN+1]; + wxString tblNameSave; + wxChar colName[DB_MAX_COLUMN_NAME_LEN+1]; + SWORD sqlDataType; + wxChar typeName[30+1]; + SDWORD precision, length; + + FILE *fp = wxFopen(fileName.c_str(),wxT("wt")); + if (fp == NULL) + return false; + + SQLFreeStmt(hstmt, SQL_CLOSE); + + wxString UserID; + convertUserID(userID,UserID); + + if (!UserID.empty() && + Dbms() != dbmsMY_SQL && + Dbms() != dbmsACCESS && + Dbms() != dbmsFIREBIRD && + Dbms() != dbmsINTERBASE && + Dbms() != dbmsMS_SQL_SERVER) + { + retcode = SQLColumns(hstmt, + NULL, 0, // All qualifiers + (SQLTCHAR *) UserID.c_str(), SQL_NTS, // User specified + NULL, 0, // All tables + NULL, 0); // All columns + } + else + { + retcode = SQLColumns(hstmt, + NULL, 0, // All qualifiers + NULL, 0, // User specified + NULL, 0, // All tables + NULL, 0); // All columns + } + if (retcode != SQL_SUCCESS) + { + DispAllErrors(henv, hdbc, hstmt); + fclose(fp); + return false; + } + + wxString outStr; + tblNameSave.Empty(); + int cnt = 0; + + while (true) + { + retcode = SQLFetch(hstmt); + if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) + break; + + GetData(3,SQL_C_WXCHAR, (UCHAR *) tblName, DB_MAX_TABLE_NAME_LEN+1, &cb); + GetData(4,SQL_C_WXCHAR, (UCHAR *) colName, DB_MAX_COLUMN_NAME_LEN+1,&cb); + GetData(5,SQL_C_SSHORT, (UCHAR *)&sqlDataType, 0, &cb); + GetData(6,SQL_C_WXCHAR, (UCHAR *) typeName, sizeof(typeName), &cb); + GetData(7,SQL_C_SLONG, (UCHAR *)&precision, 0, &cb); + GetData(8,SQL_C_SLONG, (UCHAR *)&length, 0, &cb); + + if (wxStrcmp(tblName, tblNameSave.c_str())) + { + if (cnt) + wxFputs(wxT("\n"), fp); + wxFputs(wxT("================================ "), fp); + wxFputs(wxT("================================ "), fp); + wxFputs(wxT("===================== "), fp); + wxFputs(wxT("========= "), fp); + wxFputs(wxT("=========\n"), fp); + outStr.Printf(wxT("%-32s %-32s %-21s %9s %9s\n"), + wxT("TABLE NAME"), wxT("COLUMN NAME"), wxT("DATA TYPE"), wxT("PRECISION"), wxT("LENGTH")); + wxFputs(outStr.c_str(), fp); + wxFputs(wxT("================================ "), fp); + wxFputs(wxT("================================ "), fp); + wxFputs(wxT("===================== "), fp); + wxFputs(wxT("========= "), fp); + wxFputs(wxT("=========\n"), fp); + tblNameSave = tblName; + } + + outStr.Printf(wxT("%-32s %-32s (%04d)%-15s %9ld %9ld\n"), + tblName, colName, sqlDataType, typeName, precision, length); + if (wxFputs(outStr.c_str(), fp) == EOF) + { + SQLFreeStmt(hstmt, SQL_CLOSE); + fclose(fp); + return false; + } + cnt++; + } + + if (retcode != SQL_NO_DATA_FOUND) + DispAllErrors(henv, hdbc, hstmt); + + SQLFreeStmt(hstmt, SQL_CLOSE); + + fclose(fp); + return(retcode == SQL_NO_DATA_FOUND); + +} // wxDb::Catalog() + + +bool wxDb::TableExists(const wxString &tableName, const wxChar *userID, const wxString &tablePath) +/* + * Table name can refer to a table, view, alias or synonym. Returns true + * if the object exists in the database. This function does not indicate + * whether or not the user has privleges to query or perform other functions + * on the table. + * + * userID is evaluated in the following manner: + * userID == NULL ... UserID is ignored + * userID == "" ... UserID set equal to 'this->uid' + * userID != "" ... UserID set equal to 'userID' + */ +{ + wxASSERT(tableName.length()); + + wxString TableName; + + if (Dbms() == dbmsDBASE) + { + wxString dbName; + if (tablePath.length()) + dbName.Printf(wxT("%s/%s.dbf"), tablePath.c_str(), tableName.c_str()); + else + dbName.Printf(wxT("%s.dbf"), tableName.c_str()); + + bool exists; + exists = wxFileExists(dbName); + return exists; + } + + wxString UserID; + convertUserID(userID,UserID); + + TableName = tableName; + // Oracle and Interbase table names are uppercase only, so force + // the name to uppercase just in case programmer forgot to do this + if ((Dbms() == dbmsORACLE) || + (Dbms() == dbmsFIREBIRD) || + (Dbms() == dbmsINTERBASE)) + TableName = TableName.Upper(); + + SQLFreeStmt(hstmt, SQL_CLOSE); + RETCODE retcode; + + // Some databases cannot accept a user name when looking up table names, + // so we use the call below that leaves out the user name + if (!UserID.empty() && + Dbms() != dbmsMY_SQL && + Dbms() != dbmsACCESS && + Dbms() != dbmsMS_SQL_SERVER && + Dbms() != dbmsDB2 && + Dbms() != dbmsFIREBIRD && + Dbms() != dbmsINTERBASE && + Dbms() != dbmsPERVASIVE_SQL) + { + retcode = SQLTables(hstmt, + NULL, 0, // All qualifiers + (SQLTCHAR *) UserID.c_str(), SQL_NTS, // Only tables owned by this user + (SQLTCHAR FAR *)TableName.c_str(), SQL_NTS, + NULL, 0); // All table types + } + else + { + retcode = SQLTables(hstmt, + NULL, 0, // All qualifiers + NULL, 0, // All owners + (SQLTCHAR FAR *)TableName.c_str(), SQL_NTS, + NULL, 0); // All table types + } + if (retcode != SQL_SUCCESS) + return(DispAllErrors(henv, hdbc, hstmt)); + + retcode = SQLFetch(hstmt); + if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) + { + SQLFreeStmt(hstmt, SQL_CLOSE); + return(DispAllErrors(henv, hdbc, hstmt)); + } + + SQLFreeStmt(hstmt, SQL_CLOSE); + + return true; + +} // wxDb::TableExists() + + +/********** wxDb::TablePrivileges() **********/ +bool wxDb::TablePrivileges(const wxString &tableName, const wxString &priv, const wxChar *userID, + const wxChar *schema, const wxString &WXUNUSED(tablePath)) +{ + wxASSERT(tableName.length()); + + wxDbTablePrivilegeInfo result; + SQLLEN cbRetVal; + RETCODE retcode; + + // We probably need to be able to dynamically set this based on + // the driver type, and state. + wxChar curRole[]=wxT("public"); + + wxString TableName; + + wxString UserID,Schema; + convertUserID(userID,UserID); + convertUserID(schema,Schema); + + TableName = tableName; + // Oracle and Interbase table names are uppercase only, so force + // the name to uppercase just in case programmer forgot to do this + if ((Dbms() == dbmsORACLE) || + (Dbms() == dbmsFIREBIRD) || + (Dbms() == dbmsINTERBASE)) + TableName = TableName.Upper(); + + SQLFreeStmt(hstmt, SQL_CLOSE); + + // Some databases cannot accept a user name when looking up table names, + // so we use the call below that leaves out the user name + if (!Schema.empty() && + Dbms() != dbmsMY_SQL && + Dbms() != dbmsACCESS && + Dbms() != dbmsMS_SQL_SERVER) + { + retcode = SQLTablePrivileges(hstmt, + NULL, 0, // Catalog + (SQLTCHAR FAR *)Schema.c_str(), SQL_NTS, // Schema + (SQLTCHAR FAR *)TableName.c_str(), SQL_NTS); + } + else + { + retcode = SQLTablePrivileges(hstmt, + NULL, 0, // Catalog + NULL, 0, // Schema + (SQLTCHAR FAR *)TableName.c_str(), SQL_NTS); + } + +#ifdef DBDEBUG_CONSOLE + wxFprintf(stderr ,wxT("SQLTablePrivileges() returned %i \n"),retcode); +#endif + + if ((retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO)) + return (DispAllErrors(henv, hdbc, hstmt)); + + bool failed = false; + retcode = SQLFetch(hstmt); + while (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) + { + if (SQLGetData(hstmt, 1, SQL_C_WXCHAR, (UCHAR*) result.tableQual, sizeof(result.tableQual), &cbRetVal) != SQL_SUCCESS) + failed = true; + + if (!failed && SQLGetData(hstmt, 2, SQL_C_WXCHAR, (UCHAR*) result.tableOwner, sizeof(result.tableOwner), &cbRetVal) != SQL_SUCCESS) + failed = true; + + if (!failed && SQLGetData(hstmt, 3, SQL_C_WXCHAR, (UCHAR*) result.tableName, sizeof(result.tableName), &cbRetVal) != SQL_SUCCESS) + failed = true; + + if (!failed && SQLGetData(hstmt, 4, SQL_C_WXCHAR, (UCHAR*) result.grantor, sizeof(result.grantor), &cbRetVal) != SQL_SUCCESS) + failed = true; + + if (!failed && SQLGetData(hstmt, 5, SQL_C_WXCHAR, (UCHAR*) result.grantee, sizeof(result.grantee), &cbRetVal) != SQL_SUCCESS) + failed = true; + + if (!failed && SQLGetData(hstmt, 6, SQL_C_WXCHAR, (UCHAR*) result.privilege, sizeof(result.privilege), &cbRetVal) != SQL_SUCCESS) + failed = true; + + if (!failed && SQLGetData(hstmt, 7, SQL_C_WXCHAR, (UCHAR*) result.grantable, sizeof(result.grantable), &cbRetVal) != SQL_SUCCESS) + failed = true; + + if (failed) + { + return(DispAllErrors(henv, hdbc, hstmt)); + } +#ifdef DBDEBUG_CONSOLE + wxFprintf(stderr,wxT("Scanning %s privilege on table %s.%s granted by %s to %s\n"), + result.privilege,result.tableOwner,result.tableName, + result.grantor, result.grantee); +#endif + + if (UserID.IsSameAs(result.tableOwner,false)) + { + SQLFreeStmt(hstmt, SQL_CLOSE); + return true; + } + + if (UserID.IsSameAs(result.grantee,false) && + !wxStrcmp(result.privilege,priv)) + { + SQLFreeStmt(hstmt, SQL_CLOSE); + return true; + } + + if (!wxStrcmp(result.grantee,curRole) && + !wxStrcmp(result.privilege,priv)) + { + SQLFreeStmt(hstmt, SQL_CLOSE); + return true; + } + + retcode = SQLFetch(hstmt); + } + + SQLFreeStmt(hstmt, SQL_CLOSE); + return false; + +} // wxDb::TablePrivileges + + +const wxString wxDb::SQLTableName(const wxChar *tableName) +{ + wxString TableName; + + if (Dbms() == dbmsACCESS) + TableName = _T("\""); + TableName += tableName; + if (Dbms() == dbmsACCESS) + TableName += _T("\""); + + return TableName; +} // wxDb::SQLTableName() + + +const wxString wxDb::SQLColumnName(const wxChar *colName) +{ + wxString ColName; + + if (Dbms() == dbmsACCESS) + ColName = _T("\""); + ColName += colName; + if (Dbms() == dbmsACCESS) + ColName += _T("\""); + + return ColName; +} // wxDb::SQLColumnName() + + +/********** wxDb::SetSqlLogging() **********/ +bool wxDb::SetSqlLogging(wxDbSqlLogState state, const wxString &filename, bool append) +{ + wxASSERT(state == sqlLogON || state == sqlLogOFF); + wxASSERT(state == sqlLogOFF || filename.length()); + + if (state == sqlLogON) + { + if (fpSqlLog == 0) + { + fpSqlLog = wxFopen(filename.c_str(), (append ? wxT("at") : wxT("wt"))); + if (fpSqlLog == NULL) + return false; + } + } + else // sqlLogOFF + { + if (fpSqlLog) + { + if (fclose(fpSqlLog)) + return false; + fpSqlLog = 0; + } + } + + sqlLogState = state; + return true; + +} // wxDb::SetSqlLogging() + + +/********** wxDb::WriteSqlLog() **********/ +bool wxDb::WriteSqlLog(const wxString &logMsg) +{ + wxASSERT(logMsg.length()); + + if (fpSqlLog == 0 || sqlLogState == sqlLogOFF) + return false; + + if (wxFputs(wxT("\n"), fpSqlLog) == EOF) + return false; + if (wxFputs(logMsg, fpSqlLog) == EOF) + return false; + if (wxFputs(wxT("\n"), fpSqlLog) == EOF) + return false; + + return true; + +} // wxDb::WriteSqlLog() + + +/********** wxDb::Dbms() **********/ +wxDBMS wxDb::Dbms(void) +/* + * Be aware that not all database engines use the exact same syntax, and not + * every ODBC compliant database is compliant to the same level of compliancy. + * Some manufacturers support the minimum Level 1 compliancy, and others up + * through Level 3. Others support subsets of features for levels above 1. + * + * If you find an inconsistency between the wxDb class and a specific database + * engine, and an identifier to this section, and special handle the database in + * the area where behavior is non-conforming with the other databases. + * + * + * NOTES ABOUT ISSUES SPECIFIC TO EACH DATABASE ENGINE + * --------------------------------------------------- + * + * ORACLE + * - Currently the only database supported by the class to support VIEWS + * + * DBASE + * - Does not support the SQL_TIMESTAMP structure + * - Supports only one cursor and one connect (apparently? with Microsoft driver only?) + * - Does not automatically create the primary index if the 'keyField' param of SetColDef + * is true. The user must create ALL indexes from their program. + * - Table names can only be 8 characters long + * - Column names can only be 10 characters long + * + * SYBASE (all) + * - To lock a record during QUERY functions, the reserved word 'HOLDLOCK' must be added + * after every table name involved in the query/join if that tables matching record(s) + * are to be locked + * - Ignores the keywords 'FOR UPDATE'. Use the HOLDLOCK functionality described above + * + * SYBASE (Enterprise) + * - If a column is part of the Primary Key, the column cannot be NULL + * - Maximum row size is somewhere in the neighborhood of 1920 bytes + * + * MY_SQL + * - If a column is part of the Primary Key, the column cannot be NULL + * - Cannot support selecting for update [::CanSelectForUpdate()]. Always returns FALSE + * - Columns that are part of primary or secondary keys must be defined as being NOT NULL + * when they are created. Some code is added in ::CreateIndex to try to adjust the + * column definition if it is not defined correctly, but it is experimental + * - Does not support sub-queries in SQL statements + * + * POSTGRES + * - Does not support the keywords 'ASC' or 'DESC' as of release v6.5.0 + * - Does not support sub-queries in SQL statements + * + * DB2 + * - Primary keys must be declared as NOT NULL + * - Table and index names must not be longer than 13 characters in length (technically + * table names can be up to 18 characters, but the primary index is created using the + * base table name plus "_PIDX", so the limit if the table has a primary index is 13. + * + * PERVASIVE SQL + * + * INTERBASE + * - Columns that are part of primary keys must be defined as being NOT NULL + * when they are created. Some code is added in ::CreateIndex to try to adjust the + * column definition if it is not defined correctly, but it is experimental + */ +{ + // Should only need to do this once for each new database connection + // so return the value we already determined it to be to save time + // and lots of string comparisons + if (dbmsType != dbmsUNIDENTIFIED) + return(dbmsType); + +#ifdef DBDEBUG_CONSOLE + // When run in console mode, use standard out to display errors. + cout << "Database connecting to: " << dbInf.dbmsName << endl; +#endif // DBDEBUG_CONSOLE + + wxLogDebug(wxT("Database connecting to: ")); + wxLogDebug(dbInf.dbmsName); + + wxChar baseName[25+1]; + wxStrncpy(baseName, dbInf.dbmsName, 25); + baseName[25] = 0; + + // RGG 20001025 : add support for Interbase + // GT : Integrated to base classes on 20001121 + if (!wxStricmp(dbInf.dbmsName,wxT("Interbase"))) + return((wxDBMS)(dbmsType = dbmsINTERBASE)); + + // BJO 20000428 : add support for Virtuoso + if (!wxStricmp(dbInf.dbmsName,wxT("OpenLink Virtuoso VDBMS"))) + return((wxDBMS)(dbmsType = dbmsVIRTUOSO)); + + if (!wxStricmp(dbInf.dbmsName,wxT("Adaptive Server Anywhere"))) + return((wxDBMS)(dbmsType = dbmsSYBASE_ASA)); + + // BJO 20000427 : The "SQL Server" string is also returned by SQLServer when + // connected through an OpenLink driver. + // Is it also returned by Sybase Adapatitve server? + // OpenLink driver name is OLOD3032.DLL for msw and oplodbc.so for unix + if (!wxStricmp(dbInf.dbmsName,wxT("SQL Server"))) + { + if (!wxStrncmp(dbInf.driverName, wxT("oplodbc"), 7) || + !wxStrncmp(dbInf.driverName, wxT("OLOD"), 4)) + return ((wxDBMS)(dbmsMS_SQL_SERVER)); + else + return ((wxDBMS)(dbmsType = dbmsSYBASE_ASE)); + } + + if (!wxStricmp(dbInf.dbmsName,wxT("Microsoft SQL Server"))) + return((wxDBMS)(dbmsType = dbmsMS_SQL_SERVER)); + + baseName[10] = 0; + if (!wxStricmp(baseName,wxT("PostgreSQL"))) // v6.5.0 + return((wxDBMS)(dbmsType = dbmsPOSTGRES)); + + baseName[9] = 0; + if (!wxStricmp(baseName,wxT("Pervasive"))) + return((wxDBMS)(dbmsType = dbmsPERVASIVE_SQL)); + + baseName[8] = 0; + if (!wxStricmp(baseName,wxT("Informix"))) + return((wxDBMS)(dbmsType = dbmsINFORMIX)); + + if (!wxStricmp(baseName,wxT("Firebird"))) + return((wxDBMS)(dbmsType = dbmsFIREBIRD)); + + baseName[6] = 0; + if (!wxStricmp(baseName,wxT("Oracle"))) + return((wxDBMS)(dbmsType = dbmsORACLE)); + if (!wxStricmp(baseName,wxT("ACCESS"))) + return((wxDBMS)(dbmsType = dbmsACCESS)); + if (!wxStricmp(baseName,wxT("Sybase"))) + return((wxDBMS)(dbmsType = dbmsSYBASE_ASE)); + + baseName[5] = 0; + if (!wxStricmp(baseName,wxT("DBASE"))) + return((wxDBMS)(dbmsType = dbmsDBASE)); + if (!wxStricmp(baseName,wxT("xBase"))) + return((wxDBMS)(dbmsType = dbmsXBASE_SEQUITER)); + if (!wxStricmp(baseName,wxT("MySQL"))) + return((wxDBMS)(dbmsType = dbmsMY_SQL)); + if (!wxStricmp(baseName,wxT("MaxDB"))) + return((wxDBMS)(dbmsType = dbmsMAXDB)); + + baseName[3] = 0; + if (!wxStricmp(baseName,wxT("DB2"))) + return((wxDBMS)(dbmsType = dbmsDB2)); + + return((wxDBMS)(dbmsType = dbmsUNIDENTIFIED)); + +} // wxDb::Dbms() + + +bool wxDb::ModifyColumn(const wxString &tableName, const wxString &columnName, + int dataType, ULONG columnLength, + const wxString &optionalParam) +{ + wxASSERT(tableName.length()); + wxASSERT(columnName.length()); + wxASSERT((dataType == DB_DATA_TYPE_VARCHAR && columnLength > 0) || + dataType != DB_DATA_TYPE_VARCHAR); + + // Must specify a columnLength if modifying a VARCHAR type column + if (dataType == DB_DATA_TYPE_VARCHAR && !columnLength) + return false; + + wxString dataTypeName; + wxString sqlStmt; + wxString alterSlashModify; + + switch(dataType) + { + case DB_DATA_TYPE_VARCHAR : + dataTypeName = typeInfVarchar.TypeName; + break; + case DB_DATA_TYPE_INTEGER : + dataTypeName = typeInfInteger.TypeName; + break; + case DB_DATA_TYPE_FLOAT : + dataTypeName = typeInfFloat.TypeName; + break; + case DB_DATA_TYPE_DATE : + dataTypeName = typeInfDate.TypeName; + break; + case DB_DATA_TYPE_BLOB : + dataTypeName = typeInfBlob.TypeName; + break; + default: + return false; + } + + // Set the modify or alter syntax depending on the type of database connected to + switch (Dbms()) + { + case dbmsORACLE : + alterSlashModify = _T("MODIFY"); + break; + case dbmsMS_SQL_SERVER : + alterSlashModify = _T("ALTER COLUMN"); + break; + case dbmsUNIDENTIFIED : + return false; + case dbmsSYBASE_ASA : + case dbmsSYBASE_ASE : + case dbmsMY_SQL : + case dbmsPOSTGRES : + case dbmsACCESS : + case dbmsDBASE : + case dbmsXBASE_SEQUITER : + default : + alterSlashModify = _T("MODIFY"); + break; + } + + // create the SQL statement + if ( Dbms() == dbmsMY_SQL ) + { + sqlStmt.Printf(wxT("ALTER TABLE %s %s %s %s"), tableName.c_str(), alterSlashModify.c_str(), + columnName.c_str(), dataTypeName.c_str()); + } + else + { + sqlStmt.Printf(wxT("ALTER TABLE \"%s\" \"%s\" \"%s\" %s"), tableName.c_str(), alterSlashModify.c_str(), + columnName.c_str(), dataTypeName.c_str()); + } + + // For varchars only, append the size of the column + if (dataType == DB_DATA_TYPE_VARCHAR && + (Dbms() != dbmsMY_SQL || dataTypeName != _T("text"))) + { + wxString s; + s.Printf(wxT("(%lu)"), columnLength); + sqlStmt += s; + } + + // for passing things like "NOT NULL" + if (optionalParam.length()) + { + sqlStmt += wxT(" "); + sqlStmt += optionalParam; + } + + return ExecSql(sqlStmt); + +} // wxDb::ModifyColumn() + +/********** wxDb::EscapeSqlChars() **********/ +wxString wxDb::EscapeSqlChars(const wxString& valueOrig) +{ + wxString value(valueOrig); + switch (Dbms()) + { + case dbmsACCESS: + // Access doesn't seem to care about backslashes, so only escape single quotes. + value.Replace(wxT("'"), wxT("''")); + break; + + default: + // All the others are supposed to be the same for now, add special + // handling for them if necessary + value.Replace(wxT("\\"), wxT("\\\\")); + value.Replace(wxT("'"), wxT("\\'")); + break; + } + + return value; +} // wxDb::EscapeSqlChars() + + +/********** wxDbGetConnection() **********/ +wxDb WXDLLIMPEXP_ODBC *wxDbGetConnection(wxDbConnectInf *pDbConfig, bool FwdOnlyCursors) +{ + wxDbList *pList; + + // Used to keep a pointer to a DB connection that matches the requested + // DSN and FwdOnlyCursors settings, even if it is not FREE, so that the + // data types can be copied from it (using the wxDb::Open(wxDb *) function) + // rather than having to re-query the datasource to get all the values + // using the wxDb::Open(Dsn,Uid,AuthStr) function + wxDb *matchingDbConnection = NULL; + + // Scan the linked list searching for an available database connection + // that's already been opened but is currently not in use. + for (pList = PtrBegDbList; pList; pList = pList->PtrNext) + { + // The database connection must be for the same datasource + // name and must currently not be in use. + if (pList->Free && + (pList->PtrDb->FwdOnlyCursors() == FwdOnlyCursors)) + { + if (pDbConfig->UseConnectionStr()) + { + if (pList->PtrDb->OpenedWithConnectionString() && + (!wxStrcmp(pDbConfig->GetConnectionStr(), pList->ConnectionStr))) + { + // Found a free connection + pList->Free = false; + return(pList->PtrDb); + } + } + else + { + if (!pList->PtrDb->OpenedWithConnectionString() && + (!wxStrcmp(pDbConfig->GetDsn(), pList->Dsn))) + { + // Found a free connection + pList->Free = false; + return(pList->PtrDb); + } + } + } + + if (pDbConfig->UseConnectionStr()) + { + if (!wxStrcmp(pDbConfig->GetConnectionStr(), pList->ConnectionStr)) + matchingDbConnection = pList->PtrDb; + } + else + { + if (!wxStrcmp(pDbConfig->GetDsn(), pList->Dsn) && + !wxStrcmp(pDbConfig->GetUserID(), pList->Uid) && + !wxStrcmp(pDbConfig->GetPassword(), pList->AuthStr)) + matchingDbConnection = pList->PtrDb; + } + } + + // No available connections. A new connection must be made and + // appended to the end of the linked list. + if (PtrBegDbList) + { + // Find the end of the list + for (pList = PtrBegDbList; pList->PtrNext; pList = pList->PtrNext); + // Append a new list item + pList->PtrNext = new wxDbList; + pList->PtrNext->PtrPrev = pList; + pList = pList->PtrNext; + } + else // Empty list + { + // Create the first node on the list + pList = PtrBegDbList = new wxDbList; + pList->PtrPrev = 0; + } + + // Initialize new node in the linked list + pList->PtrNext = 0; + pList->Free = false; + pList->Dsn = pDbConfig->GetDsn(); + pList->Uid = pDbConfig->GetUserID(); + pList->AuthStr = pDbConfig->GetPassword(); + pList->ConnectionStr = pDbConfig->GetConnectionStr(); + + pList->PtrDb = new wxDb(pDbConfig->GetHenv(), FwdOnlyCursors); + + bool opened; + + if (!matchingDbConnection) + { + if (pDbConfig->UseConnectionStr()) + { + opened = pList->PtrDb->Open(pDbConfig->GetConnectionStr()); + } + else + { + opened = pList->PtrDb->Open(pDbConfig->GetDsn(), pDbConfig->GetUserID(), pDbConfig->GetPassword()); + } + } + else + opened = pList->PtrDb->Open(matchingDbConnection); + + // Connect to the datasource + if (opened) + { + pList->PtrDb->setCached(true); // Prevent a user from deleting a cached connection + pList->PtrDb->SetSqlLogging(SQLLOGstate, SQLLOGfn, true); + return(pList->PtrDb); + } + else // Unable to connect, destroy list item + { + if (pList->PtrPrev) + pList->PtrPrev->PtrNext = 0; + else + PtrBegDbList = 0; // Empty list again + + pList->PtrDb->CommitTrans(); // Commit any open transactions on wxDb object + pList->PtrDb->Close(); // Close the wxDb object + delete pList->PtrDb; // Deletes the wxDb object + delete pList; // Deletes the linked list object + return(0); + } + +} // wxDbGetConnection() + + +/********** wxDbFreeConnection() **********/ +bool WXDLLIMPEXP_ODBC wxDbFreeConnection(wxDb *pDb) +{ + wxDbList *pList; + + // Scan the linked list searching for the database connection + for (pList = PtrBegDbList; pList; pList = pList->PtrNext) + { + if (pList->PtrDb == pDb) // Found it, now free it!!! + return (pList->Free = true); + } + + // Never found the database object, return failure + return false; + +} // wxDbFreeConnection() + + +/********** wxDbCloseConnections() **********/ +void WXDLLIMPEXP_ODBC wxDbCloseConnections(void) +{ + wxDbList *pList, *pNext; + + // Traverse the linked list closing database connections and freeing memory as I go. + for (pList = PtrBegDbList; pList; pList = pNext) + { + pNext = pList->PtrNext; // Save the pointer to next + pList->PtrDb->CommitTrans(); // Commit any open transactions on wxDb object + pList->PtrDb->Close(); // Close the wxDb object + pList->PtrDb->setCached(false); // Allows deletion of the wxDb instance + delete pList->PtrDb; // Deletes the wxDb object + delete pList; // Deletes the linked list object + } + + // Mark the list as empty + PtrBegDbList = 0; + +} // wxDbCloseConnections() + + +/********** wxDbConnectionsInUse() **********/ +int WXDLLIMPEXP_ODBC wxDbConnectionsInUse(void) +{ + wxDbList *pList; + int cnt = 0; + + // Scan the linked list counting db connections that are currently in use + for (pList = PtrBegDbList; pList; pList = pList->PtrNext) + { + if (pList->Free == false) + cnt++; + } + + return(cnt); + +} // wxDbConnectionsInUse() + + + +/********** wxDbLogExtendedErrorMsg() **********/ +// DEBUG ONLY function +const wxChar WXDLLIMPEXP_ODBC *wxDbLogExtendedErrorMsg(const wxChar *userText, + wxDb *pDb, + const wxChar *ErrFile, + int ErrLine) +{ + static wxString msg; + msg = userText; + + wxString tStr; + + if (ErrFile || ErrLine) + { + msg += wxT("File: "); + msg += ErrFile; + msg += wxT(" Line: "); + tStr.Printf(wxT("%d"),ErrLine); + msg += tStr.c_str(); + msg += wxT("\n"); + } + + msg.Append (wxT("\nODBC errors:\n")); + msg += wxT("\n"); + + // Display errors for this connection + int i; + for (i = 0; i < DB_MAX_ERROR_HISTORY; i++) + { + if (pDb->errorList[i]) + { + msg.Append(pDb->errorList[i]); + if (wxStrcmp(pDb->errorList[i], wxEmptyString) != 0) + msg.Append(wxT("\n")); + // Clear the errmsg buffer so the next error will not + // end up showing the previous error that have occurred + wxStrcpy(pDb->errorList[i], wxEmptyString); + } + } + msg += wxT("\n"); + + wxLogDebug(msg.c_str()); + + return msg.c_str(); +} // wxDbLogExtendedErrorMsg() + + +/********** wxDbSqlLog() **********/ +bool wxDbSqlLog(wxDbSqlLogState state, const wxChar *filename) +{ + bool append = false; + wxDbList *pList; + + for (pList = PtrBegDbList; pList; pList = pList->PtrNext) + { + if (!pList->PtrDb->SetSqlLogging(state,filename,append)) + return false; + append = true; + } + + SQLLOGstate = state; + SQLLOGfn = filename; + + return true; + +} // wxDbSqlLog() + + +#if 0 +/********** wxDbCreateDataSource() **********/ +int wxDbCreateDataSource(const wxString &driverName, const wxString &dsn, const wxString &description, + bool sysDSN, const wxString &defDir, wxWindow *parent) +/* + * !!!! ONLY FUNCTIONAL UNDER MSW with VC6 !!!! + * Very rudimentary creation of an ODBC data source. + * + * ODBC driver must be ODBC 3.0 compliant to use this function + */ +{ + int result = FALSE; + +//!!!! ONLY FUNCTIONAL UNDER MSW with VC6 !!!! +#ifdef __VISUALC__ + int dsnLocation; + wxString setupStr; + + if (sysDSN) + dsnLocation = ODBC_ADD_SYS_DSN; + else + dsnLocation = ODBC_ADD_DSN; + + // NOTE: The decimal 2 is an invalid character in all keyword pairs + // so that is why I used it, as wxString does not deal well with + // embedded nulls in strings + setupStr.Printf(wxT("DSN=%s%cDescription=%s%cDefaultDir=%s%c"),dsn,2,description,2,defDir,2); + + // Replace the separator from above with the '\0' separator needed + // by the SQLConfigDataSource() function + int k; + do + { + k = setupStr.Find((wxChar)2,true); + if (k != wxNOT_FOUND) + setupStr[(UINT)k] = wxT('\0'); + } + while (k != wxNOT_FOUND); + + result = SQLConfigDataSource((HWND)parent->GetHWND(), dsnLocation, + driverName, setupStr.c_str()); + + if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) + { + // check for errors caused by ConfigDSN based functions + DWORD retcode = 0; + WORD cb; + wxChar errMsg[SQL_MAX_MESSAGE_LENGTH]; + errMsg[0] = wxT('\0'); + + // This function is only supported in ODBC drivers v3.0 compliant and above + SQLInstallerError(1,&retcode,errMsg,SQL_MAX_MESSAGE_LENGTH-1,&cb); + if (retcode) + { +#ifdef DBDEBUG_CONSOLE + // When run in console mode, use standard out to display errors. + cout << errMsg << endl; + cout << wxT("Press any key to continue...") << endl; + getchar(); +#endif // DBDEBUG_CONSOLE + +#ifdef __WXDEBUG__ + wxLogDebug(errMsg,wxT("ODBC DEBUG MESSAGE")); +#endif // __WXDEBUG__ + } + } + else + result = TRUE; +#else + // Using iODBC/unixODBC or some other compiler which does not support the APIs + // necessary to use this function, so this function is not supported +#ifdef __WXDEBUG__ + wxLogDebug(wxT("wxDbCreateDataSource() not available except under VC++/MSW"),wxT("ODBC DEBUG MESSAGE")); +#endif + result = FALSE; +#endif // __VISUALC__ + + return result; + +} // wxDbCreateDataSource() +#endif + + +/********** wxDbGetDataSource() **********/ +bool wxDbGetDataSource(HENV henv, wxChar *Dsn, SWORD DsnMaxLength, wxChar *DsDesc, + SWORD DsDescMaxLength, UWORD direction) +/* + * Dsn and DsDesc will contain the data source name and data source + * description upon return + */ +{ + SWORD cb1,cb2; + SWORD lengthDsn = (SWORD)(DsnMaxLength*sizeof(wxChar)); + SWORD lengthDsDesc = (SWORD)(DsDescMaxLength*sizeof(wxChar)); + + if (SQLDataSources(henv, direction, (SQLTCHAR FAR *) Dsn, lengthDsn, &cb1, + (SQLTCHAR FAR *) DsDesc, lengthDsDesc, &cb2) == SQL_SUCCESS) + return true; + else + return false; + +} // wxDbGetDataSource() + + +// Change this to 0 to remove use of all deprecated functions +#if wxODBC_BACKWARD_COMPATABILITY +/******************************************************************** + ******************************************************************** + * + * The following functions are all DEPRECATED and are included for + * backward compatibility reasons only + * + ******************************************************************** + ********************************************************************/ +bool SqlLog(sqlLog state, const wxChar *filename) +{ + return wxDbSqlLog((enum wxDbSqlLogState)state, filename); +} +/***** DEPRECATED: use wxGetDataSource() *****/ +bool GetDataSource(HENV henv, char *Dsn, SWORD DsnMax, char *DsDesc, SWORD DsDescMax, + UWORD direction) +{ + return wxDbGetDataSource(henv, Dsn, DsnMax, DsDesc, DsDescMax, direction); +} +/***** DEPRECATED: use wxDbGetConnection() *****/ +wxDb WXDLLIMPEXP_ODBC *GetDbConnection(DbStuff *pDbStuff, bool FwdOnlyCursors) +{ + return wxDbGetConnection((wxDbConnectInf *)pDbStuff, FwdOnlyCursors); +} +/***** DEPRECATED: use wxDbFreeConnection() *****/ +bool WXDLLIMPEXP_ODBC FreeDbConnection(wxDb *pDb) +{ + return wxDbFreeConnection(pDb); +} +/***** DEPRECATED: use wxDbCloseConnections() *****/ +void WXDLLIMPEXP_ODBC CloseDbConnections(void) +{ + wxDbCloseConnections(); +} +/***** DEPRECATED: use wxDbConnectionsInUse() *****/ +int WXDLLIMPEXP_ODBC NumberDbConnectionsInUse(void) +{ + return wxDbConnectionsInUse(); +} +#endif + + +#endif + // wxUSE_ODBC diff --git a/Externals/wxWidgets/src/common/dbgrid.cpp b/Externals/wxWidgets/src/common/dbgrid.cpp new file mode 100644 index 0000000000..dd56bdd0b5 --- /dev/null +++ b/Externals/wxWidgets/src/common/dbgrid.cpp @@ -0,0 +1,727 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/common/dbgrid.cpp +// Purpose: Displays a wxDbTable in a wxGrid. +// Author: Roger Gammans, Paul Gammans +// Modified by: +// Created: +// RCS-ID: $Id: dbgrid.cpp 43769 2006-12-03 18:20:28Z VZ $ +// Copyright: (c) 1999 The Computer Surgery (roger@computer-surgery.co.uk) +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// +// Branched From : dbgrid.cpp,v 1.18 2000/12/19 13:00:58 +/////////////////////////////////////////////////////////////////////////////// + +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_ODBC && wxUSE_GRID + +#ifndef WX_PRECOMP + #include "wx/textctrl.h" + #include "wx/dc.h" + #include "wx/app.h" +#endif // WX_PRECOMP + +#include "wx/generic/gridctrl.h" +#include "wx/dbgrid.h" + +// DLL options compatibility check: +WX_CHECK_BUILD_OPTIONS("wxDbGrid") + + +wxDbGridCellAttrProvider::wxDbGridCellAttrProvider() +{ + m_data=NULL; + m_ColInfo=NULL; +} + +wxDbGridCellAttrProvider::wxDbGridCellAttrProvider(wxDbTable *tab, wxDbGridColInfoBase* ColInfo) +{ + m_data=tab; + m_ColInfo=ColInfo; +} + +wxDbGridCellAttrProvider::~wxDbGridCellAttrProvider() +{ +} + +wxGridCellAttr *wxDbGridCellAttrProvider::GetAttr(int row, int col, + wxGridCellAttr::wxAttrKind kind) const +{ + wxGridCellAttr *attr = wxGridCellAttrProvider::GetAttr(row,col,kind); + + if (m_data && m_ColInfo && (m_data->GetNumberOfColumns() > m_ColInfo[col].DbCol)) + { + //FIXME: this test could. + // ??::InsertPending == m_data->get_ModifiedStatus() + // and if InsertPending use colDef[].InsertAllowed + if (!(m_data->GetColDefs()[(m_ColInfo[col].DbCol)].Updateable)) + { + switch(kind) + { + case (wxGridCellAttr::Any): + if (!attr) + { + attr = new wxGridCellAttr; + // Store so we don't keep creating / deleting this... + wxDbGridCellAttrProvider * self = wxConstCast(this, wxDbGridCellAttrProvider) ; + attr->IncRef(); + self->SetColAttr(attr, col); + attr->SetReadOnly(); + } + else + { + //We now must check what we were returned. and do the right thing (tm) + wxGridCellAttr::wxAttrKind attrkind = attr->GetKind(); + if ((attrkind == (wxGridCellAttr::Default)) || (attrkind == (wxGridCellAttr::Cell)) || + (attrkind == (wxGridCellAttr::Col))) + { + wxGridCellAttr *attrtomerge = attr; + attr = new wxGridCellAttr; + attr->SetKind(wxGridCellAttr::Merged); + attr->MergeWith(attrtomerge); + attr->SetReadOnly(); + attrtomerge->DecRef(); + } + attr->SetReadOnly(); + } + break; + case (wxGridCellAttr::Col): + //As we must have a Coll, and were setting Coll attributes + // we can based on wxdbTable's so just set RO if attr valid + if (!attr) + { + attr = new wxGridCellAttr; + wxDbGridCellAttrProvider * self = wxConstCast(this, wxDbGridCellAttrProvider) ; + attr->IncRef(); + self->SetColAttr(attr, col); + } + attr->SetReadOnly(); + break; + default: + //Dont add RO for... + // wxGridCellAttr::Cell - Not required, will inherit on merge from row. + // wxGridCellAttr::Row - If wxDbtable ever supports row locking could add + // support to make RO on a row basis also. + // wxGridCellAttr::Default - Don't edit this ! or all cell with a attr will become readonly + // wxGridCellAttr::Merged - This should never be asked for. + break; + } + } + + } + return attr; +} + +void wxDbGridCellAttrProvider::AssignDbTable(wxDbTable *tab) +{ + m_data = tab; +} + +wxDbGridTableBase::wxDbGridTableBase(wxDbTable *tab, wxDbGridColInfo* ColInfo, + int count, bool takeOwnership) : + m_keys(), + m_data(tab), + m_dbowner(takeOwnership), + m_rowmodified(false) +{ + + if (count == wxUSE_QUERY) + { + m_rowtotal = m_data ? m_data->Count() : 0; + } + else + { + m_rowtotal = count; + } +// m_keys.Size(m_rowtotal); + m_row = -1; + if (ColInfo) + { + m_nocols = ColInfo->Length(); + m_ColInfo = new wxDbGridColInfoBase[m_nocols]; + //Do Copy. + wxDbGridColInfo *ptr = ColInfo; + int i =0; + while (ptr && i < m_nocols) + { + m_ColInfo[i] = ptr->m_data; + ptr = ptr->m_next; + i++; + } +#ifdef __WXDEBUG__ + if (ptr) + { + wxLogDebug(wxT("NoCols over length after traversing %i items"),i); + } + if (i < m_nocols) + { + wxLogDebug(wxT("NoCols under length after traversing %i items"),i); + } +#endif + } +} + +wxDbGridTableBase::~wxDbGridTableBase() +{ + wxDbGridCellAttrProvider *provider; + + //Can't check for update here as + + //FIXME: should i remove m_ColInfo and m_data from m_attrProvider if a wxDbGridAttrProvider +// if ((provider = dynamic_cast(GetAttrProvider()))) + // Using C casting for now until we can support dynamic_cast with wxWidgets + provider = (wxDbGridCellAttrProvider *)(GetAttrProvider()); + if (provider) + { + provider->AssignDbTable(NULL); + } + delete [] m_ColInfo; + + Writeback(); + if (m_dbowner) + { + delete m_data; + } +} + +bool wxDbGridTableBase::CanHaveAttributes() +{ + if (!GetAttrProvider()) + { + // use the default attr provider by default + SetAttrProvider(new wxDbGridCellAttrProvider(m_data, m_ColInfo)); + } + return true; +} + + +bool wxDbGridTableBase::AssignDbTable(wxDbTable *tab, int count, bool takeOwnership) +{ + wxDbGridCellAttrProvider *provider; + + //Remove Information from grid about old data + if (GetView()) + { + wxGrid *grid = GetView(); + grid->BeginBatch(); + grid->ClearSelection(); + if (grid->IsCellEditControlEnabled()) + { + grid->DisableCellEditControl(); + } + wxGridTableMessage msg(this, wxGRIDTABLE_NOTIFY_ROWS_DELETED,0,m_rowtotal); + grid->ProcessTableMessage(msg); + } + + //reset our internals... + Writeback(); + if (m_dbowner) + { + delete m_data; + } + m_keys.Empty(); + m_data = tab; + //FIXME: Remove dynamic_cast before sumision to wxwin +// if ((provider = dynamic_cast (GetAttrProvider()))) + // Using C casting for now until we can support dynamic_cast with wxWidgets + provider = (wxDbGridCellAttrProvider *)(GetAttrProvider()); + if (provider) + { + provider->AssignDbTable(m_data); + } + + if (count == wxUSE_QUERY) + { + m_rowtotal = m_data ? m_data->Count() : 0; + } + else + { + m_rowtotal = count; + } + m_row = -1; + + //Add Information to grid about new data + if (GetView()) + { + wxGrid * grid = GetView(); + wxGridTableMessage msg(this, wxGRIDTABLE_NOTIFY_ROWS_APPENDED, m_rowtotal); + grid->ProcessTableMessage(msg); + grid->EndBatch(); + } + m_dbowner = takeOwnership; + m_rowmodified = false; + return true; +} + +wxString wxDbGridTableBase::GetTypeName(int WXUNUSED(row), int col) +{ + if (GetNumberCols() > col) + { + if (m_ColInfo[col].wxtypename == wxGRID_VALUE_DBAUTO) + { + if (m_data->GetNumberOfColumns() <= m_ColInfo[col].DbCol) + { + wxFAIL_MSG (_T("You can not use wxGRID_VALUE_DBAUTO for virtual columns")); + } + switch(m_data->GetColDefs()[(m_ColInfo[col].DbCol)].SqlCtype) + { + case SQL_C_CHAR: +#ifdef SQL_C_WCHAR + case SQL_C_WCHAR: +#endif + return wxGRID_VALUE_STRING; + case SQL_C_SHORT: + case SQL_C_SSHORT: + return wxGRID_VALUE_NUMBER; + case SQL_C_USHORT: + return wxGRID_VALUE_NUMBER; + case SQL_C_LONG: + case SQL_C_SLONG: + return wxGRID_VALUE_NUMBER; + case SQL_C_ULONG: + return wxGRID_VALUE_NUMBER; + case SQL_C_FLOAT: + return wxGRID_VALUE_FLOAT; + case SQL_C_DOUBLE: + return wxGRID_VALUE_FLOAT; + case SQL_C_DATE: + return wxGRID_VALUE_DATETIME; + case SQL_C_TIME: + return wxGRID_VALUE_DATETIME; + case SQL_C_TIMESTAMP: + return wxGRID_VALUE_DATETIME; + default: + return wxGRID_VALUE_STRING; + } + } + else + { + return m_ColInfo[col].wxtypename; + } + } + wxFAIL_MSG (_T("unknown column")); + return wxString(); +} + +bool wxDbGridTableBase::CanGetValueAs(int row, int col, const wxString& typeName) +{ + wxLogDebug(wxT("CanGetValueAs() on %i,%i"),row,col); + //Is this needed? As it will be validated on GetValueAsXXXX + ValidateRow(row); + + if (typeName == wxGRID_VALUE_STRING) + { + //FIXME ummm What about blob field etc. + return true; + } + + if (m_data->IsColNull((UWORD)m_ColInfo[col].DbCol)) + { + return false; + } + + if (m_data->GetNumberOfColumns() <= m_ColInfo[col].DbCol) + { + //If a virtual column then we can't find it's type. we have to + // return false to get using wxVariant. + return false; + } + int sqltype = m_data->GetColDefs()[(m_ColInfo[col].DbCol)].SqlCtype; + + if (typeName == wxGRID_VALUE_DATETIME) + { + if ((sqltype == SQL_C_DATE) || + (sqltype == SQL_C_TIME) || + (sqltype == SQL_C_TIMESTAMP)) + { + return true; + } + return false; + } + if (typeName == wxGRID_VALUE_NUMBER) + { + if ((sqltype == SQL_C_SSHORT) || + (sqltype == SQL_C_USHORT) || + (sqltype == SQL_C_SLONG) || + (sqltype == SQL_C_ULONG)) + { + return true; + } + return false; + } + if (typeName == wxGRID_VALUE_FLOAT) + { + if ((sqltype == SQL_C_SSHORT) || + (sqltype == SQL_C_USHORT) || + (sqltype == SQL_C_SLONG) || + (sqltype == SQL_C_ULONG) || + (sqltype == SQL_C_FLOAT) || + (sqltype == SQL_C_DOUBLE)) + { + return true; + } + return false; + } + return false; +} + +bool wxDbGridTableBase::CanSetValueAs(int WXUNUSED(row), int col, const wxString& typeName) +{ + if (typeName == wxGRID_VALUE_STRING) + { + //FIXME ummm What about blob field etc. + return true; + } + + if (!(m_data->GetColDefs()[(m_ColInfo[col].DbCol)].Updateable)) + { + return false; + } + + if (m_data->GetNumberOfColumns() <= m_ColInfo[col].DbCol) + { + //If a virtual column then we can't find it's type. we have to faulse to + //get using wxVairent. + return false; + } + + int sqltype = m_data->GetColDefs()[(m_ColInfo[col].DbCol)].SqlCtype; + if (typeName == wxGRID_VALUE_DATETIME) + { + if ((sqltype == SQL_C_DATE) || + (sqltype == SQL_C_TIME) || + (sqltype == SQL_C_TIMESTAMP)) + { + return true; + } + return false; + } + if (typeName == wxGRID_VALUE_NUMBER) + { + if ((sqltype == SQL_C_SSHORT) || + (sqltype == SQL_C_USHORT) || + (sqltype == SQL_C_SLONG) || + (sqltype == SQL_C_ULONG)) + { + return true; + } + return false; + } + if (typeName == wxGRID_VALUE_FLOAT) + { + if ((sqltype == SQL_C_SSHORT) || + (sqltype == SQL_C_USHORT) || + (sqltype == SQL_C_SLONG) || + (sqltype == SQL_C_ULONG) || + (sqltype == SQL_C_FLOAT) || + (sqltype == SQL_C_DOUBLE)) + { + return true; + } + return false; + } + return false; +} + +long wxDbGridTableBase::GetValueAsLong(int row, int col) +{ + ValidateRow(row); + + if (m_data->GetNumberOfColumns() <= m_ColInfo[col].DbCol) + { + wxFAIL_MSG (_T("You can not use GetValueAsLong for virtual columns")); + return 0; + } + int sqltype = m_data->GetColDefs()[(m_ColInfo[col].DbCol)].SqlCtype; + if ((sqltype == SQL_C_SSHORT) || + (sqltype == SQL_C_USHORT) || + (sqltype == SQL_C_SLONG) || + (sqltype == SQL_C_ULONG)) + { + wxVariant val = m_data->GetColumn(m_ColInfo[col].DbCol); + return val.GetLong(); + } + wxFAIL_MSG (_T("unknown column, ")); + return 0; +} + +double wxDbGridTableBase::GetValueAsDouble(int row, int col) +{ + wxLogDebug(wxT("GetValueAsDouble() on %i,%i"),row,col); + ValidateRow(row); + + if (m_data->GetNumberOfColumns() <= m_ColInfo[col].DbCol) + { + wxFAIL_MSG (_T("You can not use GetValueAsDouble for virtual columns")); + return 0.0; + } + int sqltype = m_data->GetColDefs()[(m_ColInfo[col].DbCol)].SqlCtype; + if ((sqltype == SQL_C_SSHORT) || + (sqltype == SQL_C_USHORT) || + (sqltype == SQL_C_SLONG) || + (sqltype == SQL_C_ULONG) || + (sqltype == SQL_C_FLOAT) || + (sqltype == SQL_C_DOUBLE)) + { + wxVariant val = m_data->GetColumn(m_ColInfo[col].DbCol); + return val.GetDouble(); + } + wxFAIL_MSG (_T("unknown column")); + return 0.0; +} + +bool wxDbGridTableBase::GetValueAsBool(int row, int col) +{ + wxLogDebug(wxT("GetValueAsBool() on %i,%i"),row,col); + ValidateRow(row); + + if (m_data->GetNumberOfColumns() <= m_ColInfo[col].DbCol) + { + wxFAIL_MSG (_T("You can not use GetValueAsBool for virtual columns")); + return 0; + } + int sqltype = m_data->GetColDefs()[(m_ColInfo[col].DbCol)].SqlCtype; + if ((sqltype == SQL_C_SSHORT) || + (sqltype == SQL_C_USHORT) || + (sqltype == SQL_C_SLONG) || + (sqltype == SQL_C_ULONG)) + { + wxVariant val = m_data->GetColumn(m_ColInfo[col].DbCol); + return val.GetBool(); + } + wxFAIL_MSG (_T("unknown column, ")); + return 0; +} + +void* wxDbGridTableBase::GetValueAsCustom(int row, int col, const wxString& typeName) +{ + wxLogDebug(wxT("GetValueAsCustom() on %i,%i"),row,col); + ValidateRow(row); + + if (m_data->GetNumberOfColumns() <= m_ColInfo[col].DbCol) + { + wxFAIL_MSG (_T("You can not use GetValueAsCustom for virtual columns")); + return NULL; + } + if (m_data->IsColNull((UWORD)m_ColInfo[col].DbCol)) + return NULL; + + if (typeName == wxGRID_VALUE_DATETIME) + { + wxDbColDef *pColDefs = m_data->GetColDefs(); + int sqltype = pColDefs[(m_ColInfo[col].DbCol)].SqlCtype; + + if ((sqltype == SQL_C_DATE) || + (sqltype == SQL_C_TIME) || + (sqltype == SQL_C_TIMESTAMP)) + { + wxVariant val = m_data->GetColumn(m_ColInfo[col].DbCol); + return new wxDateTime(val.GetDateTime()); + } + } + wxFAIL_MSG (_T("unknown column data type ")); + return NULL; +} + + +void wxDbGridTableBase::SetValueAsCustom(int row, int col, const wxString& typeName, void* value) +{ + wxLogDebug(wxT("SetValueAsCustom() on %i,%i"),row,col); + ValidateRow(row); + + if (m_data->GetNumberOfColumns() <= m_ColInfo[col].DbCol) + { + wxFAIL_MSG (_T("You can not use SetValueAsCustom for virtual columns")); + return; + } + + if (typeName == wxGRID_VALUE_DATETIME) + { + int sqltype = m_data->GetColDefs()[(m_ColInfo[col].DbCol)].SqlCtype; + if ((sqltype == SQL_C_DATE) || + (sqltype == SQL_C_TIME) || + (sqltype == SQL_C_TIMESTAMP)) + { + //FIXME: you can't dynamic_cast from (void *) + //wxDateTime *date = wxDynamicCast(value, wxDateTime); + wxDateTime *date = (wxDateTime *)value; + if (!date) + { + wxFAIL_MSG (_T("Failed to convert data")); + return; + } + wxVariant val(date); + m_rowmodified = true; + m_data->SetColumn(m_ColInfo[col].DbCol,val); + } + } + wxFAIL_MSG (_T("unknown column data type")); + return ; +} + + +wxString wxDbGridTableBase::GetColLabelValue(int col) +{ + if (GetNumberCols() > col) + { + return m_ColInfo[col].Title; + } + wxFAIL_MSG (_T("unknown column")); + return wxString(); +} + +bool wxDbGridTableBase::IsEmptyCell(int row, int col) +{ + wxLogDebug(wxT("IsEmtpyCell on %i,%i"),row,col); + + ValidateRow(row); + return m_data->IsColNull((UWORD)m_ColInfo[col].DbCol); +} + + +wxString wxDbGridTableBase::GetValue(int row, int col) +{ + wxLogDebug(wxT("GetValue() on %i,%i"),row,col); + + ValidateRow(row); + wxVariant val = m_data->GetColumn(m_ColInfo[col].DbCol); + wxLogDebug(wxT("\tReturning \"%s\"\n"),val.GetString().c_str()); + + return val.GetString(); +} + + +void wxDbGridTableBase::SetValue(int row, int col,const wxString& value) +{ + wxLogDebug(wxT("SetValue() on %i,%i"),row,col); + + ValidateRow(row); + wxVariant val(value); + + m_rowmodified = true; + m_data->SetColumn(m_ColInfo[col].DbCol,val); +} + + +void wxDbGridTableBase::SetValueAsLong(int row, int col, long value) +{ + wxLogDebug(wxT("SetValueAsLong() on %i,%i"),row,col); + + ValidateRow(row); + wxVariant val(value); + + m_rowmodified = true; + m_data->SetColumn(m_ColInfo[col].DbCol,val); +} + + +void wxDbGridTableBase::SetValueAsDouble(int row, int col, double value) +{ + wxLogDebug(wxT("SetValueAsDouble() on %i,%i"),row,col); + + ValidateRow(row); + wxVariant val(value); + + m_rowmodified = true; + m_data->SetColumn(m_ColInfo[col].DbCol,val); + +} + + +void wxDbGridTableBase::SetValueAsBool(int row, int col, bool value) +{ + wxLogDebug(wxT("SetValueAsBool() on %i,%i"),row,col); + + ValidateRow(row); + wxVariant val(value); + + m_rowmodified = true; + m_data->SetColumn(m_ColInfo[col].DbCol,val); +} + + +void wxDbGridTableBase::ValidateRow(int row) +{ + wxLogDebug(wxT("ValidateRow(%i) currently on row (%i). Array count = %lu"), + row, m_row, (unsigned long)m_keys.GetCount()); + + if (row == m_row) + return; + Writeback(); + + //We add to row as Count is unsigned! + if ((unsigned)(row+1) > m_keys.GetCount()) + { + wxLogDebug(wxT("\trow key unknown")); + // Extend Array, iterate through data filling with keys + m_data->SetRowMode(wxDbTable::WX_ROW_MODE_QUERY); + int trow; + for (trow = m_keys.GetCount(); trow <= row; trow++) + { + wxLogDebug(wxT("Fetching row %i.."), trow); + bool ret = m_data->GetNext(); + + wxLogDebug(wxT(" ...success=(%i)"),ret); + GenericKey k = m_data->GetKey(); + m_keys.Add(k); + } + m_row = row; + } + else + { + wxLogDebug(wxT("\trow key known centering data")); + GenericKey k = m_keys.Item(row); + m_data->SetRowMode(wxDbTable::WX_ROW_MODE_INDIVIDUAL); + m_data->ClearMemberVars(); + m_data->SetKey(k); + if (!m_data->QueryOnKeyFields()) + { + wxDbLogExtendedErrorMsg(_T("ODBC error during Query()\n\n"), m_data->GetDb(),__TFILE__,__LINE__); + } + + m_data->GetNext(); + + m_row = row; + } + m_rowmodified = false; +} + +bool wxDbGridTableBase::Writeback() const +{ + if (!m_rowmodified) + { + return true; + } + + bool result=true; + wxLogDebug(wxT("\trow key unknown")); + +// FIXME: this code requires dbtable support for record status +#if 0 + switch (m_data->get_ModifiedStatus()) + { + case wxDbTable::UpdatePending: + result = m_data->Update(); + break; + case wxDbTable::InsertPending: + result = (m_data->Insert() == SQL_SUCCESS); + break; + default: + //Nothing + break; + } +#else + wxLogDebug(wxT("WARNING : Row writeback not implemented ")); +#endif + return result; +} + +#include "wx/arrimpl.cpp" + +WX_DEFINE_EXPORTED_OBJARRAY(keyarray) + +#endif // wxUSE_GRID && wxUSE_ODBC diff --git a/Externals/wxWidgets/src/common/dbtable.cpp b/Externals/wxWidgets/src/common/dbtable.cpp new file mode 100644 index 0000000000..8038ee69f5 --- /dev/null +++ b/Externals/wxWidgets/src/common/dbtable.cpp @@ -0,0 +1,2946 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/common/dbtable.cpp +// Purpose: Implementation of the wxDbTable class. +// Author: Doug Card +// Modified by: George Tasker +// Bart Jourquin +// Mark Johnson +// Created: 9.96 +// RCS-ID: $Id: dbtable.cpp 48685 2007-09-14 19:02:28Z VZ $ +// Copyright: (c) 1996 Remstar International, Inc. +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_ODBC + +#ifndef WX_PRECOMP + #include "wx/object.h" + #include "wx/list.h" + #include "wx/string.h" + #include "wx/utils.h" + #include "wx/log.h" +#endif + +#ifdef DBDEBUG_CONSOLE +#if wxUSE_IOSTREAMH + #include +#else + #include +#endif + #include "wx/ioswrap.h" +#endif + +#include "wx/filefn.h" + +#include +#include +#include + +#include "wx/dbtable.h" + +#ifdef __UNIX__ +// The HPUX preprocessor lines below were commented out on 8/20/97 +// because macros.h currently redefines DEBUG and is unneeded. +// # ifdef HPUX +// # include +// # endif +# ifdef LINUX +# include +# endif +#endif + +ULONG lastTableID = 0; + + +#ifdef __WXDEBUG__ + #include "wx/thread.h" + + wxList TablesInUse; +#if wxUSE_THREADS + wxCriticalSection csTablesInUse; +#endif // wxUSE_THREADS +#endif + + +void csstrncpyt(wxChar *target, const wxChar *source, int n) +{ + while ( (*target++ = *source++) != '\0' && --n != 0 ) + ; + + *target = '\0'; +} + + + +/********** wxDbColDef::wxDbColDef() Constructor **********/ +wxDbColDef::wxDbColDef() +{ + Initialize(); +} // Constructor + + +bool wxDbColDef::Initialize() +{ + ColName[0] = 0; + DbDataType = DB_DATA_TYPE_INTEGER; + SqlCtype = SQL_C_LONG; + PtrDataObj = NULL; + SzDataObj = 0; + KeyField = false; + Updateable = false; + InsertAllowed = false; + DerivedCol = false; + CbValue = 0; + Null = false; + + return true; +} // wxDbColDef::Initialize() + + +/********** wxDbTable::wxDbTable() Constructor **********/ +wxDbTable::wxDbTable(wxDb *pwxDb, const wxString &tblName, const UWORD numColumns, + const wxString &qryTblName, bool qryOnly, const wxString &tblPath) +{ + if (!initialize(pwxDb, tblName, numColumns, qryTblName, qryOnly, tblPath)) + cleanup(); +} // wxDbTable::wxDbTable() + + +/***** DEPRECATED: use wxDbTable::wxDbTable() format above *****/ +#if WXWIN_COMPATIBILITY_2_4 +wxDbTable::wxDbTable(wxDb *pwxDb, const wxString &tblName, const UWORD numColumns, + const wxChar *qryTblName, bool qryOnly, const wxString &tblPath) +{ + wxString tempQryTblName; + tempQryTblName = qryTblName; + if (!initialize(pwxDb, tblName, numColumns, tempQryTblName, qryOnly, tblPath)) + cleanup(); +} // wxDbTable::wxDbTable() +#endif // WXWIN_COMPATIBILITY_2_4 + + +/********** wxDbTable::~wxDbTable() **********/ +wxDbTable::~wxDbTable() +{ + this->cleanup(); +} // wxDbTable::~wxDbTable() + + +bool wxDbTable::initialize(wxDb *pwxDb, const wxString &tblName, const UWORD numColumns, + const wxString &qryTblName, bool qryOnly, const wxString &tblPath) +{ + // Initializing member variables + pDb = pwxDb; // Pointer to the wxDb object + henv = 0; + hdbc = 0; + hstmt = 0; + m_hstmtGridQuery = 0; + hstmtDefault = 0; // Initialized below + hstmtCount = 0; // Initialized first time it is needed + hstmtInsert = 0; + hstmtDelete = 0; + hstmtUpdate = 0; + hstmtInternal = 0; + colDefs = 0; + tableID = 0; + m_numCols = numColumns; // Number of columns in the table + where.Empty(); // Where clause + orderBy.Empty(); // Order By clause + from.Empty(); // From clause + selectForUpdate = false; // SELECT ... FOR UPDATE; Indicates whether to include the FOR UPDATE phrase + queryOnly = qryOnly; + insertable = true; + tablePath.Empty(); + tableName.Empty(); + queryTableName.Empty(); + + wxASSERT(tblName.length()); + wxASSERT(pDb); + + if (!pDb) + return false; + + tableName = tblName; // Table Name + if ((pDb->Dbms() == dbmsORACLE) || + (pDb->Dbms() == dbmsFIREBIRD) || + (pDb->Dbms() == dbmsINTERBASE)) + tableName = tableName.Upper(); + + if (tblPath.length()) + tablePath = tblPath; // Table Path - used for dBase files + else + tablePath.Empty(); + + if (qryTblName.length()) // Name of the table/view to query + queryTableName = qryTblName; + else + queryTableName = tblName; + + if ((pDb->Dbms() == dbmsORACLE) || + (pDb->Dbms() == dbmsFIREBIRD) || + (pDb->Dbms() == dbmsINTERBASE)) + queryTableName = queryTableName.Upper(); + + pDb->incrementTableCount(); + + wxString s; + tableID = ++lastTableID; + s.Printf(wxT("wxDbTable constructor (%-20s) tableID:[%6lu] pDb:[%p]"), + tblName.c_str(), tableID, wx_static_cast(void*, pDb)); + +#ifdef __WXDEBUG__ + wxTablesInUse *tableInUse; + tableInUse = new wxTablesInUse(); + tableInUse->tableName = tblName; + tableInUse->tableID = tableID; + tableInUse->pDb = pDb; + { +#if wxUSE_THREADS + wxCriticalSectionLocker lock(csTablesInUse); +#endif // wxUSE_THREADS + TablesInUse.Append(tableInUse); + } +#endif + + pDb->WriteSqlLog(s); + + // Grab the HENV and HDBC from the wxDb object + henv = pDb->GetHENV(); + hdbc = pDb->GetHDBC(); + + // Allocate space for column definitions + if (m_numCols) + colDefs = new wxDbColDef[m_numCols]; // Points to the first column definition + + // Allocate statement handles for the table + if (!queryOnly) + { + // Allocate a separate statement handle for performing inserts + if (SQLAllocStmt(hdbc, &hstmtInsert) != SQL_SUCCESS) + pDb->DispAllErrors(henv, hdbc); + // Allocate a separate statement handle for performing deletes + if (SQLAllocStmt(hdbc, &hstmtDelete) != SQL_SUCCESS) + pDb->DispAllErrors(henv, hdbc); + // Allocate a separate statement handle for performing updates + if (SQLAllocStmt(hdbc, &hstmtUpdate) != SQL_SUCCESS) + pDb->DispAllErrors(henv, hdbc); + } + // Allocate a separate statement handle for internal use + if (SQLAllocStmt(hdbc, &hstmtInternal) != SQL_SUCCESS) + pDb->DispAllErrors(henv, hdbc); + + // Set the cursor type for the statement handles + cursorType = SQL_CURSOR_STATIC; + + if (SQLSetStmtOption(hstmtInternal, SQL_CURSOR_TYPE, cursorType) != SQL_SUCCESS) + { + // Check to see if cursor type is supported + pDb->GetNextError(henv, hdbc, hstmtInternal); + if (! wxStrcmp(pDb->sqlState, wxT("01S02"))) // Option Value Changed + { + // Datasource does not support static cursors. Driver + // will substitute a cursor type. Call SQLGetStmtOption() + // to determine which cursor type was selected. + if (SQLGetStmtOption(hstmtInternal, SQL_CURSOR_TYPE, &cursorType) != SQL_SUCCESS) + pDb->DispAllErrors(henv, hdbc, hstmtInternal); +#ifdef DBDEBUG_CONSOLE + cout << wxT("Static cursor changed to: "); + switch(cursorType) + { + case SQL_CURSOR_FORWARD_ONLY: + cout << wxT("Forward Only"); + break; + case SQL_CURSOR_STATIC: + cout << wxT("Static"); + break; + case SQL_CURSOR_KEYSET_DRIVEN: + cout << wxT("Keyset Driven"); + break; + case SQL_CURSOR_DYNAMIC: + cout << wxT("Dynamic"); + break; + } + cout << endl << endl; +#endif + // BJO20000425 + if (pDb->FwdOnlyCursors() && cursorType != SQL_CURSOR_FORWARD_ONLY) + { + // Force the use of a forward only cursor... + cursorType = SQL_CURSOR_FORWARD_ONLY; + if (SQLSetStmtOption(hstmtInternal, SQL_CURSOR_TYPE, cursorType) != SQL_SUCCESS) + { + // Should never happen + pDb->GetNextError(henv, hdbc, hstmtInternal); + return false; + } + } + } + else + { + pDb->DispNextError(); + pDb->DispAllErrors(henv, hdbc, hstmtInternal); + } + } +#ifdef DBDEBUG_CONSOLE + else + cout << wxT("Cursor Type set to STATIC") << endl << endl; +#endif + + if (!queryOnly) + { + // Set the cursor type for the INSERT statement handle + if (SQLSetStmtOption(hstmtInsert, SQL_CURSOR_TYPE, SQL_CURSOR_FORWARD_ONLY) != SQL_SUCCESS) + pDb->DispAllErrors(henv, hdbc, hstmtInsert); + // Set the cursor type for the DELETE statement handle + if (SQLSetStmtOption(hstmtDelete, SQL_CURSOR_TYPE, SQL_CURSOR_FORWARD_ONLY) != SQL_SUCCESS) + pDb->DispAllErrors(henv, hdbc, hstmtDelete); + // Set the cursor type for the UPDATE statement handle + if (SQLSetStmtOption(hstmtUpdate, SQL_CURSOR_TYPE, SQL_CURSOR_FORWARD_ONLY) != SQL_SUCCESS) + pDb->DispAllErrors(henv, hdbc, hstmtUpdate); + } + + // Make the default cursor the active cursor + hstmtDefault = GetNewCursor(false,false); + wxASSERT(hstmtDefault); + hstmt = *hstmtDefault; + + return true; + +} // wxDbTable::initialize() + + +void wxDbTable::cleanup() +{ + wxString s; + if (pDb) + { + s.Printf(wxT("wxDbTable destructor (%-20s) tableID:[%6lu] pDb:[%p]"), + tableName.c_str(), tableID, wx_static_cast(void*, pDb)); + pDb->WriteSqlLog(s); + } + +#ifdef __WXDEBUG__ + if (tableID) + { + bool found = false; + + wxList::compatibility_iterator pNode; + { +#if wxUSE_THREADS + wxCriticalSectionLocker lock(csTablesInUse); +#endif // wxUSE_THREADS + pNode = TablesInUse.GetFirst(); + while (!found && pNode) + { + if (((wxTablesInUse *)pNode->GetData())->tableID == tableID) + { + found = true; + delete (wxTablesInUse *)pNode->GetData(); + TablesInUse.Erase(pNode); + } + else + pNode = pNode->GetNext(); + } + } + if (!found) + { + wxString msg; + msg.Printf(wxT("Unable to find the tableID in the linked\nlist of tables in use.\n\n%s"),s.c_str()); + wxLogDebug (msg,wxT("NOTICE...")); + } + } +#endif + + // Decrement the wxDb table count + if (pDb) + pDb->decrementTableCount(); + + // Delete memory allocated for column definitions + if (colDefs) + delete [] colDefs; + + // Free statement handles + if (!queryOnly) + { + if (hstmtInsert) + { +/* +ODBC 3.0 says to use this form + if (SQLFreeHandle(*hstmtDel, SQL_DROP) != SQL_SUCCESS) +*/ + if (SQLFreeStmt(hstmtInsert, SQL_DROP) != SQL_SUCCESS) + pDb->DispAllErrors(henv, hdbc); + } + + if (hstmtDelete) + { +/* +ODBC 3.0 says to use this form + if (SQLFreeHandle(*hstmtDel, SQL_DROP) != SQL_SUCCESS) +*/ + if (SQLFreeStmt(hstmtDelete, SQL_DROP) != SQL_SUCCESS) + pDb->DispAllErrors(henv, hdbc); + } + + if (hstmtUpdate) + { +/* +ODBC 3.0 says to use this form + if (SQLFreeHandle(*hstmtDel, SQL_DROP) != SQL_SUCCESS) +*/ + if (SQLFreeStmt(hstmtUpdate, SQL_DROP) != SQL_SUCCESS) + pDb->DispAllErrors(henv, hdbc); + } + } + + if (hstmtInternal) + { + if (SQLFreeStmt(hstmtInternal, SQL_DROP) != SQL_SUCCESS) + pDb->DispAllErrors(henv, hdbc); + } + + // Delete dynamically allocated cursors + if (hstmtDefault) + DeleteCursor(hstmtDefault); + + if (hstmtCount) + DeleteCursor(hstmtCount); + + if (m_hstmtGridQuery) + DeleteCursor(m_hstmtGridQuery); + +} // wxDbTable::cleanup() + + +/***************************** PRIVATE FUNCTIONS *****************************/ + + +void wxDbTable::setCbValueForColumn(int columnIndex) +{ + switch(colDefs[columnIndex].DbDataType) + { + case DB_DATA_TYPE_VARCHAR: + case DB_DATA_TYPE_MEMO: + if (colDefs[columnIndex].Null) + colDefs[columnIndex].CbValue = SQL_NULL_DATA; + else + colDefs[columnIndex].CbValue = SQL_NTS; + break; + case DB_DATA_TYPE_INTEGER: + if (colDefs[columnIndex].Null) + colDefs[columnIndex].CbValue = SQL_NULL_DATA; + else + colDefs[columnIndex].CbValue = 0; + break; + case DB_DATA_TYPE_FLOAT: + if (colDefs[columnIndex].Null) + colDefs[columnIndex].CbValue = SQL_NULL_DATA; + else + colDefs[columnIndex].CbValue = 0; + break; + case DB_DATA_TYPE_DATE: + if (colDefs[columnIndex].Null) + colDefs[columnIndex].CbValue = SQL_NULL_DATA; + else + colDefs[columnIndex].CbValue = 0; + break; + case DB_DATA_TYPE_BLOB: + if (colDefs[columnIndex].Null) + colDefs[columnIndex].CbValue = SQL_NULL_DATA; + else + if (colDefs[columnIndex].SqlCtype == SQL_C_WXCHAR) + colDefs[columnIndex].CbValue = SQL_NTS; + else + colDefs[columnIndex].CbValue = SQL_LEN_DATA_AT_EXEC(colDefs[columnIndex].SzDataObj); + break; + } +} + +/********** wxDbTable::bindParams() **********/ +bool wxDbTable::bindParams(bool forUpdate) +{ + wxASSERT(!queryOnly); + if (queryOnly) + return false; + + SWORD fSqlType = 0; + SDWORD precision = 0; + SWORD scale = 0; + + // Bind each column of the table that should be bound + // to a parameter marker + int i; + UWORD colNumber; + + for (i=0, colNumber=1; i < m_numCols; i++) + { + if (forUpdate) + { + if (!colDefs[i].Updateable) + continue; + } + else + { + if (!colDefs[i].InsertAllowed) + continue; + } + + switch(colDefs[i].DbDataType) + { + case DB_DATA_TYPE_VARCHAR: + fSqlType = pDb->GetTypeInfVarchar().FsqlType; + precision = colDefs[i].SzDataObj; + scale = 0; + break; + case DB_DATA_TYPE_MEMO: + fSqlType = pDb->GetTypeInfMemo().FsqlType; + precision = colDefs[i].SzDataObj; + scale = 0; + break; + case DB_DATA_TYPE_INTEGER: + fSqlType = pDb->GetTypeInfInteger().FsqlType; + precision = pDb->GetTypeInfInteger().Precision; + scale = 0; + break; + case DB_DATA_TYPE_FLOAT: + fSqlType = pDb->GetTypeInfFloat().FsqlType; + precision = pDb->GetTypeInfFloat().Precision; + scale = pDb->GetTypeInfFloat().MaximumScale; + // SQL Sybase Anywhere v5.5 returned a negative number for the + // MaxScale. This caused ODBC to kick out an error on ibscale. + // I check for this here and set the scale = precision. + //if (scale < 0) + // scale = (short) precision; + break; + case DB_DATA_TYPE_DATE: + fSqlType = pDb->GetTypeInfDate().FsqlType; + precision = pDb->GetTypeInfDate().Precision; + scale = 0; + break; + case DB_DATA_TYPE_BLOB: + fSqlType = pDb->GetTypeInfBlob().FsqlType; + precision = colDefs[i].SzDataObj; + scale = 0; + break; + } + + setCbValueForColumn(i); + + if (forUpdate) + { + if (SQLBindParameter(hstmtUpdate, colNumber++, SQL_PARAM_INPUT, colDefs[i].SqlCtype, + fSqlType, precision, scale, (UCHAR*) colDefs[i].PtrDataObj, + precision+1, &colDefs[i].CbValue) != SQL_SUCCESS) + { + return(pDb->DispAllErrors(henv, hdbc, hstmtUpdate)); + } + } + else + { + if (SQLBindParameter(hstmtInsert, colNumber++, SQL_PARAM_INPUT, colDefs[i].SqlCtype, + fSqlType, precision, scale, (UCHAR*) colDefs[i].PtrDataObj, + precision+1, &colDefs[i].CbValue) != SQL_SUCCESS) + { + return(pDb->DispAllErrors(henv, hdbc, hstmtInsert)); + } + } + } + + // Completed successfully + return true; + +} // wxDbTable::bindParams() + + +/********** wxDbTable::bindInsertParams() **********/ +bool wxDbTable::bindInsertParams(void) +{ + return bindParams(false); +} // wxDbTable::bindInsertParams() + + +/********** wxDbTable::bindUpdateParams() **********/ +bool wxDbTable::bindUpdateParams(void) +{ + return bindParams(true); +} // wxDbTable::bindUpdateParams() + + +/********** wxDbTable::bindCols() **********/ +bool wxDbTable::bindCols(HSTMT cursor) +{ + // Bind each column of the table to a memory address for fetching data + UWORD i; + for (i = 0; i < m_numCols; i++) + { + if (SQLBindCol(cursor, (UWORD)(i+1), colDefs[i].SqlCtype, (UCHAR*) colDefs[i].PtrDataObj, + colDefs[i].SzDataObj, &colDefs[i].CbValue ) != SQL_SUCCESS) + return (pDb->DispAllErrors(henv, hdbc, cursor)); + } + + // Completed successfully + return true; +} // wxDbTable::bindCols() + + +/********** wxDbTable::getRec() **********/ +bool wxDbTable::getRec(UWORD fetchType) +{ + RETCODE retcode; + + if (!pDb->FwdOnlyCursors()) + { + // Fetch the NEXT, PREV, FIRST or LAST record, depending on fetchType + SQLULEN cRowsFetched; + UWORD rowStatus; + + retcode = SQLExtendedFetch(hstmt, fetchType, 0, &cRowsFetched, &rowStatus); + if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) + { + if (retcode == SQL_NO_DATA_FOUND) + return false; + else + return(pDb->DispAllErrors(henv, hdbc, hstmt)); + } + else + { + // Set the Null member variable to indicate the Null state + // of each column just read in. + int i; + for (i = 0; i < m_numCols; i++) + colDefs[i].Null = (colDefs[i].CbValue == SQL_NULL_DATA); + } + } + else + { + // Fetch the next record from the record set + retcode = SQLFetch(hstmt); + if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) + { + if (retcode == SQL_NO_DATA_FOUND) + return false; + else + return(pDb->DispAllErrors(henv, hdbc, hstmt)); + } + else + { + // Set the Null member variable to indicate the Null state + // of each column just read in. + int i; + for (i = 0; i < m_numCols; i++) + colDefs[i].Null = (colDefs[i].CbValue == SQL_NULL_DATA); + } + } + + // Completed successfully + return true; + +} // wxDbTable::getRec() + + +/********** wxDbTable::execDelete() **********/ +bool wxDbTable::execDelete(const wxString &pSqlStmt) +{ + RETCODE retcode; + + // Execute the DELETE statement + retcode = SQLExecDirect(hstmtDelete, (SQLTCHAR FAR *) pSqlStmt.c_str(), SQL_NTS); + + if (retcode == SQL_SUCCESS || + retcode == SQL_NO_DATA_FOUND || + retcode == SQL_SUCCESS_WITH_INFO) + { + // Record deleted successfully + return true; + } + + // Problem deleting record + return(pDb->DispAllErrors(henv, hdbc, hstmtDelete)); + +} // wxDbTable::execDelete() + + +/********** wxDbTable::execUpdate() **********/ +bool wxDbTable::execUpdate(const wxString &pSqlStmt) +{ + RETCODE retcode; + + // Execute the UPDATE statement + retcode = SQLExecDirect(hstmtUpdate, (SQLTCHAR FAR *) pSqlStmt.c_str(), SQL_NTS); + + if (retcode == SQL_SUCCESS || + retcode == SQL_NO_DATA_FOUND || + retcode == SQL_SUCCESS_WITH_INFO) + { + // Record updated successfully + return true; + } + else if (retcode == SQL_NEED_DATA) + { + PTR pParmID; + retcode = SQLParamData(hstmtUpdate, &pParmID); + while (retcode == SQL_NEED_DATA) + { + // Find the parameter + int i; + for (i=0; i < m_numCols; i++) + { + if (colDefs[i].PtrDataObj == pParmID) + { + // We found it. Store the parameter. + retcode = SQLPutData(hstmtUpdate, pParmID, colDefs[i].SzDataObj); + if (retcode != SQL_SUCCESS) + { + pDb->DispNextError(); + return pDb->DispAllErrors(henv, hdbc, hstmtUpdate); + } + break; + } + } + retcode = SQLParamData(hstmtUpdate, &pParmID); + } + if (retcode == SQL_SUCCESS || + retcode == SQL_NO_DATA_FOUND || + retcode == SQL_SUCCESS_WITH_INFO) + { + // Record updated successfully + return true; + } + } + + // Problem updating record + return(pDb->DispAllErrors(henv, hdbc, hstmtUpdate)); + +} // wxDbTable::execUpdate() + + +/********** wxDbTable::query() **********/ +bool wxDbTable::query(int queryType, bool forUpdate, bool distinct, const wxString &pSqlStmt) +{ + wxString sqlStmt; + + if (forUpdate) + // The user may wish to select for update, but the DBMS may not be capable + selectForUpdate = CanSelectForUpdate(); + else + selectForUpdate = false; + + // Set the SQL SELECT string + if (queryType != DB_SELECT_STATEMENT) // A select statement was not passed in, + { // so generate a select statement. + BuildSelectStmt(sqlStmt, queryType, distinct); + pDb->WriteSqlLog(sqlStmt); + } + + // Make sure the cursor is closed first + if (!CloseCursor(hstmt)) + return false; + + // Execute the SQL SELECT statement + int retcode; + retcode = SQLExecDirect(hstmt, (SQLTCHAR FAR *) (queryType == DB_SELECT_STATEMENT ? pSqlStmt.c_str() : sqlStmt.c_str()), SQL_NTS); + if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) + return(pDb->DispAllErrors(henv, hdbc, hstmt)); + + // Completed successfully + return true; + +} // wxDbTable::query() + + +/***************************** PUBLIC FUNCTIONS *****************************/ + + +/********** wxDbTable::Open() **********/ +bool wxDbTable::Open(bool checkPrivileges, bool checkTableExists) +{ + if (!pDb) + return false; + + int i; + wxString sqlStmt; + wxString s; + + // Calculate the maximum size of the concatenated + // keys for use with wxDbGrid + m_keysize = 0; + for (i=0; i < m_numCols; i++) + { + if (colDefs[i].KeyField) + { + m_keysize += colDefs[i].SzDataObj; + } + } + + s.Empty(); + + bool exists = true; + if (checkTableExists) + { + if (pDb->Dbms() == dbmsPOSTGRES) + exists = pDb->TableExists(tableName, NULL, tablePath); + else + exists = pDb->TableExists(tableName, pDb->GetUsername(), tablePath); + } + + // Verify that the table exists in the database + if (!exists) + { + s = wxT("Table/view does not exist in the database"); + if ( *(pDb->dbInf.accessibleTables) == wxT('Y')) + s += wxT(", or you have no permissions.\n"); + else + s += wxT(".\n"); + } + else if (checkPrivileges) + { + // Verify the user has rights to access the table. + bool hasPrivs wxDUMMY_INITIALIZE(true); + + if (pDb->Dbms() == dbmsPOSTGRES) + hasPrivs = pDb->TablePrivileges(tableName, wxT("SELECT"), pDb->GetUsername(), NULL, tablePath); + else + hasPrivs = pDb->TablePrivileges(tableName, wxT("SELECT"), pDb->GetUsername(), pDb->GetUsername(), tablePath); + + if (!hasPrivs) + s = wxT("Connecting user does not have sufficient privileges to access this table.\n"); + } + + if (!s.empty()) + { + wxString p; + + if (!tablePath.empty()) + p.Printf(wxT("Error opening '%s/%s'.\n"),tablePath.c_str(),tableName.c_str()); + else + p.Printf(wxT("Error opening '%s'.\n"), tableName.c_str()); + + p += s; + pDb->LogError(p.GetData()); + + return false; + } + + // Bind the member variables for field exchange between + // the wxDbTable object and the ODBC record. + if (!queryOnly) + { + if (!bindInsertParams()) // Inserts + return false; + + if (!bindUpdateParams()) // Updates + return false; + } + + if (!bindCols(*hstmtDefault)) // Selects + return false; + + if (!bindCols(hstmtInternal)) // Internal use only + return false; + + /* + * Do NOT bind the hstmtCount cursor!!! + */ + + // Build an insert statement using parameter markers + if (!queryOnly && m_numCols > 0) + { + bool needComma = false; + sqlStmt.Printf(wxT("INSERT INTO %s ("), + pDb->SQLTableName(tableName.c_str()).c_str()); + for (i = 0; i < m_numCols; i++) + { + if (! colDefs[i].InsertAllowed) + continue; + if (needComma) + sqlStmt += wxT(","); + sqlStmt += pDb->SQLColumnName(colDefs[i].ColName); + needComma = true; + } + needComma = false; + sqlStmt += wxT(") VALUES ("); + + int insertableCount = 0; + + for (i = 0; i < m_numCols; i++) + { + if (! colDefs[i].InsertAllowed) + continue; + if (needComma) + sqlStmt += wxT(","); + sqlStmt += wxT("?"); + needComma = true; + insertableCount++; + } + sqlStmt += wxT(")"); + + // Prepare the insert statement for execution + if (insertableCount) + { + if (SQLPrepare(hstmtInsert, (SQLTCHAR FAR *) sqlStmt.c_str(), SQL_NTS) != SQL_SUCCESS) + return(pDb->DispAllErrors(henv, hdbc, hstmtInsert)); + } + else + insertable = false; + } + + // Completed successfully + return true; + +} // wxDbTable::Open() + + +/********** wxDbTable::Query() **********/ +bool wxDbTable::Query(bool forUpdate, bool distinct) +{ + + return(query(DB_SELECT_WHERE, forUpdate, distinct)); + +} // wxDbTable::Query() + + +/********** wxDbTable::QueryBySqlStmt() **********/ +bool wxDbTable::QueryBySqlStmt(const wxString &pSqlStmt) +{ + pDb->WriteSqlLog(pSqlStmt); + + return(query(DB_SELECT_STATEMENT, false, false, pSqlStmt)); + +} // wxDbTable::QueryBySqlStmt() + + +/********** wxDbTable::QueryMatching() **********/ +bool wxDbTable::QueryMatching(bool forUpdate, bool distinct) +{ + + return(query(DB_SELECT_MATCHING, forUpdate, distinct)); + +} // wxDbTable::QueryMatching() + + +/********** wxDbTable::QueryOnKeyFields() **********/ +bool wxDbTable::QueryOnKeyFields(bool forUpdate, bool distinct) +{ + + return(query(DB_SELECT_KEYFIELDS, forUpdate, distinct)); + +} // wxDbTable::QueryOnKeyFields() + + +/********** wxDbTable::GetPrev() **********/ +bool wxDbTable::GetPrev(void) +{ + if (pDb->FwdOnlyCursors()) + { + wxFAIL_MSG(wxT("GetPrev()::Backward scrolling cursors are not enabled for this instance of wxDbTable")); + return false; + } + else + return(getRec(SQL_FETCH_PRIOR)); + +} // wxDbTable::GetPrev() + + +/********** wxDbTable::operator-- **********/ +bool wxDbTable::operator--(int) +{ + if (pDb->FwdOnlyCursors()) + { + wxFAIL_MSG(wxT("operator--:Backward scrolling cursors are not enabled for this instance of wxDbTable")); + return false; + } + else + return(getRec(SQL_FETCH_PRIOR)); + +} // wxDbTable::operator-- + + +/********** wxDbTable::GetFirst() **********/ +bool wxDbTable::GetFirst(void) +{ + if (pDb->FwdOnlyCursors()) + { + wxFAIL_MSG(wxT("GetFirst():Backward scrolling cursors are not enabled for this instance of wxDbTable")); + return false; + } + else + return(getRec(SQL_FETCH_FIRST)); + +} // wxDbTable::GetFirst() + + +/********** wxDbTable::GetLast() **********/ +bool wxDbTable::GetLast(void) +{ + if (pDb->FwdOnlyCursors()) + { + wxFAIL_MSG(wxT("GetLast()::Backward scrolling cursors are not enabled for this instance of wxDbTable")); + return false; + } + else + return(getRec(SQL_FETCH_LAST)); + +} // wxDbTable::GetLast() + + +/********** wxDbTable::BuildDeleteStmt() **********/ +void wxDbTable::BuildDeleteStmt(wxString &pSqlStmt, int typeOfDel, const wxString &pWhereClause) +{ + wxASSERT(!queryOnly); + if (queryOnly) + return; + + wxString whereClause; + + whereClause.Empty(); + + // Handle the case of DeleteWhere() and the where clause is blank. It should + // delete all records from the database in this case. + if (typeOfDel == DB_DEL_WHERE && (pWhereClause.length() == 0)) + { + pSqlStmt.Printf(wxT("DELETE FROM %s"), + pDb->SQLTableName(tableName.c_str()).c_str()); + return; + } + + pSqlStmt.Printf(wxT("DELETE FROM %s WHERE "), + pDb->SQLTableName(tableName.c_str()).c_str()); + + // Append the WHERE clause to the SQL DELETE statement + switch(typeOfDel) + { + case DB_DEL_KEYFIELDS: + // If the datasource supports the ROWID column, build + // the where on ROWID for efficiency purposes. + // e.g. DELETE FROM PARTS WHERE ROWID = '111.222.333' + if (CanUpdateByROWID()) + { + SQLLEN cb; + wxChar rowid[wxDB_ROWID_LEN+1]; + + // Get the ROWID value. If not successful retreiving the ROWID, + // simply fall down through the code and build the WHERE clause + // based on the key fields. + if (SQLGetData(hstmt, (UWORD)(m_numCols+1), SQL_C_WXCHAR, (UCHAR*) rowid, sizeof(rowid), &cb) == SQL_SUCCESS) + { + pSqlStmt += wxT("ROWID = '"); + pSqlStmt += rowid; + pSqlStmt += wxT("'"); + break; + } + } + // Unable to delete by ROWID, so build a WHERE + // clause based on the keyfields. + BuildWhereClause(whereClause, DB_WHERE_KEYFIELDS); + pSqlStmt += whereClause; + break; + case DB_DEL_WHERE: + pSqlStmt += pWhereClause; + break; + case DB_DEL_MATCHING: + BuildWhereClause(whereClause, DB_WHERE_MATCHING); + pSqlStmt += whereClause; + break; + } + +} // BuildDeleteStmt() + + +/***** DEPRECATED: use wxDbTable::BuildDeleteStmt(wxString &....) form *****/ +void wxDbTable::BuildDeleteStmt(wxChar *pSqlStmt, int typeOfDel, const wxString &pWhereClause) +{ + wxString tempSqlStmt; + BuildDeleteStmt(tempSqlStmt, typeOfDel, pWhereClause); + wxStrcpy(pSqlStmt, tempSqlStmt); +} // wxDbTable::BuildDeleteStmt() + + +/********** wxDbTable::BuildSelectStmt() **********/ +void wxDbTable::BuildSelectStmt(wxString &pSqlStmt, int typeOfSelect, bool distinct) +{ + wxString whereClause; + whereClause.Empty(); + + // Build a select statement to query the database + pSqlStmt = wxT("SELECT "); + + // SELECT DISTINCT values only? + if (distinct) + pSqlStmt += wxT("DISTINCT "); + + // Was a FROM clause specified to join tables to the base table? + // Available for ::Query() only!!! + bool appendFromClause = false; +#if wxODBC_BACKWARD_COMPATABILITY + if (typeOfSelect == DB_SELECT_WHERE && from && wxStrlen(from)) + appendFromClause = true; +#else + if (typeOfSelect == DB_SELECT_WHERE && from.length()) + appendFromClause = true; +#endif + + // Add the column list + int i; + wxString tStr; + for (i = 0; i < m_numCols; i++) + { + tStr = colDefs[i].ColName; + // If joining tables, the base table column names must be qualified to avoid ambiguity + if ((appendFromClause || pDb->Dbms() == dbmsACCESS) && tStr.Find(wxT('.')) == wxNOT_FOUND) + { + pSqlStmt += pDb->SQLTableName(queryTableName.c_str()); + pSqlStmt += wxT("."); + } + pSqlStmt += pDb->SQLColumnName(colDefs[i].ColName); + if (i + 1 < m_numCols) + pSqlStmt += wxT(","); + } + + // If the datasource supports ROWID, get this column as well. Exception: Don't retrieve + // the ROWID if querying distinct records. The rowid will always be unique. + if (!distinct && CanUpdateByROWID()) + { + // If joining tables, the base table column names must be qualified to avoid ambiguity + if (appendFromClause || pDb->Dbms() == dbmsACCESS) + { + pSqlStmt += wxT(","); + pSqlStmt += pDb->SQLTableName(queryTableName); + pSqlStmt += wxT(".ROWID"); + } + else + pSqlStmt += wxT(",ROWID"); + } + + // Append the FROM tablename portion + pSqlStmt += wxT(" FROM "); + pSqlStmt += pDb->SQLTableName(queryTableName); +// pSqlStmt += queryTableName; + + // Sybase uses the HOLDLOCK keyword to lock a record during query. + // The HOLDLOCK keyword follows the table name in the from clause. + // Each table in the from clause must specify HOLDLOCK or + // NOHOLDLOCK (the default). Note: The "FOR UPDATE" clause + // is parsed but ignored in SYBASE Transact-SQL. + if (selectForUpdate && (pDb->Dbms() == dbmsSYBASE_ASA || pDb->Dbms() == dbmsSYBASE_ASE)) + pSqlStmt += wxT(" HOLDLOCK"); + + if (appendFromClause) + pSqlStmt += from; + + // Append the WHERE clause. Either append the where clause for the class + // or build a where clause. The typeOfSelect determines this. + switch(typeOfSelect) + { + case DB_SELECT_WHERE: +#if wxODBC_BACKWARD_COMPATABILITY + if (where && wxStrlen(where)) // May not want a where clause!!! +#else + if (where.length()) // May not want a where clause!!! +#endif + { + pSqlStmt += wxT(" WHERE "); + pSqlStmt += where; + } + break; + case DB_SELECT_KEYFIELDS: + BuildWhereClause(whereClause, DB_WHERE_KEYFIELDS); + if (whereClause.length()) + { + pSqlStmt += wxT(" WHERE "); + pSqlStmt += whereClause; + } + break; + case DB_SELECT_MATCHING: + BuildWhereClause(whereClause, DB_WHERE_MATCHING); + if (whereClause.length()) + { + pSqlStmt += wxT(" WHERE "); + pSqlStmt += whereClause; + } + break; + } + + // Append the ORDER BY clause +#if wxODBC_BACKWARD_COMPATABILITY + if (orderBy && wxStrlen(orderBy)) +#else + if (orderBy.length()) +#endif + { + pSqlStmt += wxT(" ORDER BY "); + pSqlStmt += orderBy; + } + + // SELECT FOR UPDATE if told to do so and the datasource is capable. Sybase + // parses the FOR UPDATE clause but ignores it. See the comment above on the + // HOLDLOCK for Sybase. + if (selectForUpdate && CanSelectForUpdate()) + pSqlStmt += wxT(" FOR UPDATE"); + +} // wxDbTable::BuildSelectStmt() + + +/***** DEPRECATED: use wxDbTable::BuildSelectStmt(wxString &....) form *****/ +void wxDbTable::BuildSelectStmt(wxChar *pSqlStmt, int typeOfSelect, bool distinct) +{ + wxString tempSqlStmt; + BuildSelectStmt(tempSqlStmt, typeOfSelect, distinct); + wxStrcpy(pSqlStmt, tempSqlStmt); +} // wxDbTable::BuildSelectStmt() + + +/********** wxDbTable::BuildUpdateStmt() **********/ +void wxDbTable::BuildUpdateStmt(wxString &pSqlStmt, int typeOfUpdate, const wxString &pWhereClause) +{ + wxASSERT(!queryOnly); + if (queryOnly) + return; + + wxString whereClause; + whereClause.Empty(); + + bool firstColumn = true; + + pSqlStmt.Printf(wxT("UPDATE %s SET "), + pDb->SQLTableName(tableName.c_str()).c_str()); + + // Append a list of columns to be updated + int i; + for (i = 0; i < m_numCols; i++) + { + // Only append Updateable columns + if (colDefs[i].Updateable) + { + if (!firstColumn) + pSqlStmt += wxT(","); + else + firstColumn = false; + + pSqlStmt += pDb->SQLColumnName(colDefs[i].ColName); +// pSqlStmt += colDefs[i].ColName; + pSqlStmt += wxT(" = ?"); + } + } + + // Append the WHERE clause to the SQL UPDATE statement + pSqlStmt += wxT(" WHERE "); + switch(typeOfUpdate) + { + case DB_UPD_KEYFIELDS: + // If the datasource supports the ROWID column, build + // the where on ROWID for efficiency purposes. + // e.g. UPDATE PARTS SET Col1 = ?, Col2 = ? WHERE ROWID = '111.222.333' + if (CanUpdateByROWID()) + { + SQLLEN cb; + wxChar rowid[wxDB_ROWID_LEN+1]; + + // Get the ROWID value. If not successful retreiving the ROWID, + // simply fall down through the code and build the WHERE clause + // based on the key fields. + if (SQLGetData(hstmt, (UWORD)(m_numCols+1), SQL_C_WXCHAR, (UCHAR*) rowid, sizeof(rowid), &cb) == SQL_SUCCESS) + { + pSqlStmt += wxT("ROWID = '"); + pSqlStmt += rowid; + pSqlStmt += wxT("'"); + break; + } + } + // Unable to delete by ROWID, so build a WHERE + // clause based on the keyfields. + BuildWhereClause(whereClause, DB_WHERE_KEYFIELDS); + pSqlStmt += whereClause; + break; + case DB_UPD_WHERE: + pSqlStmt += pWhereClause; + break; + } +} // BuildUpdateStmt() + + +/***** DEPRECATED: use wxDbTable::BuildUpdateStmt(wxString &....) form *****/ +void wxDbTable::BuildUpdateStmt(wxChar *pSqlStmt, int typeOfUpdate, const wxString &pWhereClause) +{ + wxString tempSqlStmt; + BuildUpdateStmt(tempSqlStmt, typeOfUpdate, pWhereClause); + wxStrcpy(pSqlStmt, tempSqlStmt); +} // BuildUpdateStmt() + + +/********** wxDbTable::BuildWhereClause() **********/ +void wxDbTable::BuildWhereClause(wxString &pWhereClause, int typeOfWhere, + const wxString &qualTableName, bool useLikeComparison) +/* + * Note: BuildWhereClause() currently ignores timestamp columns. + * They are not included as part of the where clause. + */ +{ + bool moreThanOneColumn = false; + wxString colValue; + + // Loop through the columns building a where clause as you go + int colNumber; + for (colNumber = 0; colNumber < m_numCols; colNumber++) + { + // Determine if this column should be included in the WHERE clause + if ((typeOfWhere == DB_WHERE_KEYFIELDS && colDefs[colNumber].KeyField) || + (typeOfWhere == DB_WHERE_MATCHING && (!IsColNull((UWORD)colNumber)))) + { + // Skip over timestamp columns + if (colDefs[colNumber].SqlCtype == SQL_C_TIMESTAMP) + continue; + // If there is more than 1 column, join them with the keyword "AND" + if (moreThanOneColumn) + pWhereClause += wxT(" AND "); + else + moreThanOneColumn = true; + + // Concatenate where phrase for the column + wxString tStr = colDefs[colNumber].ColName; + + if (qualTableName.length() && tStr.Find(wxT('.')) == wxNOT_FOUND) + { + pWhereClause += pDb->SQLTableName(qualTableName); + pWhereClause += wxT("."); + } + pWhereClause += pDb->SQLColumnName(colDefs[colNumber].ColName); + + if (useLikeComparison && (colDefs[colNumber].SqlCtype == SQL_C_WXCHAR)) + pWhereClause += wxT(" LIKE "); + else + pWhereClause += wxT(" = "); + + switch(colDefs[colNumber].SqlCtype) + { + case SQL_C_CHAR: +#ifdef SQL_C_WCHAR + case SQL_C_WCHAR: +#endif + //case SQL_C_WXCHAR: SQL_C_WXCHAR is covered by either SQL_C_CHAR or SQL_C_WCHAR + colValue.Printf(wxT("'%s'"), GetDb()->EscapeSqlChars((wxChar *)colDefs[colNumber].PtrDataObj).c_str()); + break; + case SQL_C_SHORT: + case SQL_C_SSHORT: + colValue.Printf(wxT("%hi"), *((SWORD *) colDefs[colNumber].PtrDataObj)); + break; + case SQL_C_USHORT: + colValue.Printf(wxT("%hu"), *((UWORD *) colDefs[colNumber].PtrDataObj)); + break; + case SQL_C_LONG: + case SQL_C_SLONG: + colValue.Printf(wxT("%li"), *((SDWORD *) colDefs[colNumber].PtrDataObj)); + break; + case SQL_C_ULONG: + colValue.Printf(wxT("%lu"), *((UDWORD *) colDefs[colNumber].PtrDataObj)); + break; + case SQL_C_FLOAT: + colValue.Printf(wxT("%.6f"), *((SFLOAT *) colDefs[colNumber].PtrDataObj)); + break; + case SQL_C_DOUBLE: + colValue.Printf(wxT("%.6f"), *((SDOUBLE *) colDefs[colNumber].PtrDataObj)); + break; + default: + { + wxString strMsg; + strMsg.Printf(wxT("wxDbTable::bindParams(): Unknown column type for colDefs %d colName %s"), + colNumber,colDefs[colNumber].ColName); + wxFAIL_MSG(strMsg.c_str()); + } + break; + } + pWhereClause += colValue; + } + } +} // wxDbTable::BuildWhereClause() + + +/***** DEPRECATED: use wxDbTable::BuildWhereClause(wxString &....) form *****/ +void wxDbTable::BuildWhereClause(wxChar *pWhereClause, int typeOfWhere, + const wxString &qualTableName, bool useLikeComparison) +{ + wxString tempSqlStmt; + BuildWhereClause(tempSqlStmt, typeOfWhere, qualTableName, useLikeComparison); + wxStrcpy(pWhereClause, tempSqlStmt); +} // wxDbTable::BuildWhereClause() + + +/********** wxDbTable::GetRowNum() **********/ +UWORD wxDbTable::GetRowNum(void) +{ + UDWORD rowNum; + + if (SQLGetStmtOption(hstmt, SQL_ROW_NUMBER, (UCHAR*) &rowNum) != SQL_SUCCESS) + { + pDb->DispAllErrors(henv, hdbc, hstmt); + return(0); + } + + // Completed successfully + return((UWORD) rowNum); + +} // wxDbTable::GetRowNum() + + +/********** wxDbTable::CloseCursor() **********/ +bool wxDbTable::CloseCursor(HSTMT cursor) +{ + if (SQLFreeStmt(cursor, SQL_CLOSE) != SQL_SUCCESS) + return(pDb->DispAllErrors(henv, hdbc, cursor)); + + // Completed successfully + return true; + +} // wxDbTable::CloseCursor() + + +/********** wxDbTable::CreateTable() **********/ +bool wxDbTable::CreateTable(bool attemptDrop) +{ + if (!pDb) + return false; + + int i, j; + wxString sqlStmt; + +#ifdef DBDEBUG_CONSOLE + cout << wxT("Creating Table ") << tableName << wxT("...") << endl; +#endif + + // Drop table first + if (attemptDrop && !DropTable()) + return false; + + // Create the table +#ifdef DBDEBUG_CONSOLE + for (i = 0; i < m_numCols; i++) + { + // Exclude derived columns since they are NOT part of the base table + if (colDefs[i].DerivedCol) + continue; + cout << i + 1 << wxT(": ") << colDefs[i].ColName << wxT("; "); + switch(colDefs[i].DbDataType) + { + case DB_DATA_TYPE_VARCHAR: + cout << pDb->GetTypeInfVarchar().TypeName << wxT("(") << (int)(colDefs[i].SzDataObj / sizeof(wxChar)) << wxT(")"); + break; + case DB_DATA_TYPE_MEMO: + cout << pDb->GetTypeInfMemo().TypeName; + break; + case DB_DATA_TYPE_INTEGER: + cout << pDb->GetTypeInfInteger().TypeName; + break; + case DB_DATA_TYPE_FLOAT: + cout << pDb->GetTypeInfFloat().TypeName; + break; + case DB_DATA_TYPE_DATE: + cout << pDb->GetTypeInfDate().TypeName; + break; + case DB_DATA_TYPE_BLOB: + cout << pDb->GetTypeInfBlob().TypeName; + break; + } + cout << endl; + } +#endif + + // Build a CREATE TABLE string from the colDefs structure. + bool needComma = false; + + sqlStmt.Printf(wxT("CREATE TABLE %s ("), + pDb->SQLTableName(tableName.c_str()).c_str()); + + for (i = 0; i < m_numCols; i++) + { + // Exclude derived columns since they are NOT part of the base table + if (colDefs[i].DerivedCol) + continue; + // Comma Delimiter + if (needComma) + sqlStmt += wxT(","); + // Column Name + sqlStmt += pDb->SQLColumnName(colDefs[i].ColName); +// sqlStmt += colDefs[i].ColName; + sqlStmt += wxT(" "); + // Column Type + switch(colDefs[i].DbDataType) + { + case DB_DATA_TYPE_VARCHAR: + sqlStmt += pDb->GetTypeInfVarchar().TypeName; + break; + case DB_DATA_TYPE_MEMO: + sqlStmt += pDb->GetTypeInfMemo().TypeName; + break; + case DB_DATA_TYPE_INTEGER: + sqlStmt += pDb->GetTypeInfInteger().TypeName; + break; + case DB_DATA_TYPE_FLOAT: + sqlStmt += pDb->GetTypeInfFloat().TypeName; + break; + case DB_DATA_TYPE_DATE: + sqlStmt += pDb->GetTypeInfDate().TypeName; + break; + case DB_DATA_TYPE_BLOB: + sqlStmt += pDb->GetTypeInfBlob().TypeName; + break; + } + // For varchars, append the size of the string + if (colDefs[i].DbDataType == DB_DATA_TYPE_VARCHAR && + (pDb->Dbms() != dbmsMY_SQL || pDb->GetTypeInfVarchar().TypeName != _T("text")))// || +// colDefs[i].DbDataType == DB_DATA_TYPE_BLOB) + { + wxString s; + s.Printf(wxT("(%d)"), (int)(colDefs[i].SzDataObj / sizeof(wxChar))); + sqlStmt += s; + } + + if (pDb->Dbms() == dbmsDB2 || + pDb->Dbms() == dbmsMY_SQL || + pDb->Dbms() == dbmsSYBASE_ASE || + pDb->Dbms() == dbmsINTERBASE || + pDb->Dbms() == dbmsFIREBIRD || + pDb->Dbms() == dbmsMS_SQL_SERVER) + { + if (colDefs[i].KeyField) + { + sqlStmt += wxT(" NOT NULL"); + } + } + + needComma = true; + } + // If there is a primary key defined, include it in the create statement + for (i = j = 0; i < m_numCols; i++) + { + if (colDefs[i].KeyField) + { + j++; + break; + } + } + if ( j && (pDb->Dbms() != dbmsDBASE) + && (pDb->Dbms() != dbmsXBASE_SEQUITER) ) // Found a keyfield + { + switch (pDb->Dbms()) + { + case dbmsACCESS: + case dbmsINFORMIX: + case dbmsSYBASE_ASA: + case dbmsSYBASE_ASE: + case dbmsMY_SQL: + case dbmsFIREBIRD: + { + // MySQL goes out on this one. We also declare the relevant key NON NULL above + sqlStmt += wxT(",PRIMARY KEY ("); + break; + } + default: + { + sqlStmt += wxT(",CONSTRAINT "); + // DB2 is limited to 18 characters for index names + if (pDb->Dbms() == dbmsDB2) + { + wxASSERT_MSG((tableName && wxStrlen(tableName) <= 13), wxT("DB2 table/index names must be no longer than 13 characters in length.\n\nTruncating table name to 13 characters.")); + sqlStmt += pDb->SQLTableName(tableName.substr(0, 13).c_str()); +// sqlStmt += tableName.substr(0, 13); + } + else + sqlStmt += pDb->SQLTableName(tableName.c_str()); +// sqlStmt += tableName; + + sqlStmt += wxT("_PIDX PRIMARY KEY ("); + break; + } + } + + // List column name(s) of column(s) comprising the primary key + for (i = j = 0; i < m_numCols; i++) + { + if (colDefs[i].KeyField) + { + if (j++) // Multi part key, comma separate names + sqlStmt += wxT(","); + sqlStmt += pDb->SQLColumnName(colDefs[i].ColName); + + if (pDb->Dbms() == dbmsMY_SQL && + colDefs[i].DbDataType == DB_DATA_TYPE_VARCHAR) + { + wxString s; + s.Printf(wxT("(%d)"), (int)(colDefs[i].SzDataObj / sizeof(wxChar))); + sqlStmt += s; + } + } + } + sqlStmt += wxT(")"); + + if (pDb->Dbms() == dbmsINFORMIX || + pDb->Dbms() == dbmsSYBASE_ASA || + pDb->Dbms() == dbmsSYBASE_ASE) + { + sqlStmt += wxT(" CONSTRAINT "); + sqlStmt += pDb->SQLTableName(tableName); +// sqlStmt += tableName; + sqlStmt += wxT("_PIDX"); + } + } + // Append the closing parentheses for the create table statement + sqlStmt += wxT(")"); + + pDb->WriteSqlLog(sqlStmt); + +#ifdef DBDEBUG_CONSOLE + cout << endl << sqlStmt.c_str() << endl; +#endif + + // Execute the CREATE TABLE statement + RETCODE retcode = SQLExecDirect(hstmt, (SQLTCHAR FAR *) sqlStmt.c_str(), SQL_NTS); + if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) + { + pDb->DispAllErrors(henv, hdbc, hstmt); + pDb->RollbackTrans(); + CloseCursor(hstmt); + return false; + } + + // Commit the transaction and close the cursor + if (!pDb->CommitTrans()) + return false; + if (!CloseCursor(hstmt)) + return false; + + // Database table created successfully + return true; + +} // wxDbTable::CreateTable() + + +/********** wxDbTable::DropTable() **********/ +bool wxDbTable::DropTable() +{ + // NOTE: This function returns true if the Table does not exist, but + // only for identified databases. Code will need to be added + // below for any other databases when those databases are defined + // to handle this situation consistently + + wxString sqlStmt; + + sqlStmt.Printf(wxT("DROP TABLE %s"), + pDb->SQLTableName(tableName.c_str()).c_str()); + + pDb->WriteSqlLog(sqlStmt); + +#ifdef DBDEBUG_CONSOLE + cout << endl << sqlStmt.c_str() << endl; +#endif + + RETCODE retcode = SQLExecDirect(hstmt, (SQLTCHAR FAR *) sqlStmt.c_str(), SQL_NTS); + if (retcode != SQL_SUCCESS) + { + // Check for "Base table not found" error and ignore + pDb->GetNextError(henv, hdbc, hstmt); + if (wxStrcmp(pDb->sqlState, wxT("S0002")) /*&& + wxStrcmp(pDb->sqlState, wxT("S1000"))*/) // "Base table not found" + { + // Check for product specific error codes + if (!((pDb->Dbms() == dbmsSYBASE_ASA && !wxStrcmp(pDb->sqlState,wxT("42000"))) || // 5.x (and lower?) + (pDb->Dbms() == dbmsSYBASE_ASE && !wxStrcmp(pDb->sqlState,wxT("37000"))) || + (pDb->Dbms() == dbmsPERVASIVE_SQL && !wxStrcmp(pDb->sqlState,wxT("S1000"))) || // Returns an S1000 then an S0002 + (pDb->Dbms() == dbmsPOSTGRES && !wxStrcmp(pDb->sqlState,wxT("08S01"))))) + { + pDb->DispNextError(); + pDb->DispAllErrors(henv, hdbc, hstmt); + pDb->RollbackTrans(); +// CloseCursor(hstmt); + return false; + } + } + } + + // Commit the transaction and close the cursor + if (! pDb->CommitTrans()) + return false; + if (! CloseCursor(hstmt)) + return false; + + return true; +} // wxDbTable::DropTable() + + +/********** wxDbTable::CreateIndex() **********/ +bool wxDbTable::CreateIndex(const wxString &indexName, bool unique, UWORD numIndexColumns, + wxDbIdxDef *pIndexDefs, bool attemptDrop) +{ + wxString sqlStmt; + + // Drop the index first + if (attemptDrop && !DropIndex(indexName)) + return false; + + // MySQL (and possibly Sybase ASE?? - gt) require that any columns which are used as portions + // of an index have the columns defined as "NOT NULL". During initial table creation though, + // it may not be known which columns are necessarily going to be part of an index (e.g. the + // table was created, then months later you determine that an additional index while + // give better performance, so you want to add an index). + // + // The following block of code will modify the column definition to make the column be + // defined with the "NOT NULL" qualifier. + if (pDb->Dbms() == dbmsMY_SQL) + { + wxString sqlStmt; + int i; + bool ok = true; + for (i = 0; i < numIndexColumns && ok; i++) + { + int j = 0; + bool found = false; + // Find the column definition that has the ColName that matches the + // index column name. We need to do this to get the DB_DATA_TYPE of + // the index column, as MySQL's syntax for the ALTER column requires + // this information + while (!found && (j < this->m_numCols)) + { + if (wxStrcmp(colDefs[j].ColName,pIndexDefs[i].ColName) == 0) + found = true; + if (!found) + j++; + } + + if (found) + { + ok = pDb->ModifyColumn(tableName, pIndexDefs[i].ColName, + colDefs[j].DbDataType, (int)(colDefs[j].SzDataObj / sizeof(wxChar)), + wxT("NOT NULL")); + + if (!ok) + { + #if 0 + // retcode is not used + wxODBC_ERRORS retcode; + // Oracle returns a DB_ERR_GENERAL_ERROR if the column is already + // defined to be NOT NULL, but reportedly MySQL doesn't mind. + // This line is just here for debug checking of the value + retcode = (wxODBC_ERRORS)pDb->DB_STATUS; + #endif + } + } + else + ok = false; + } + if (ok) + pDb->CommitTrans(); + else + { + pDb->RollbackTrans(); + return false; + } + } + + // Build a CREATE INDEX statement + sqlStmt = wxT("CREATE "); + if (unique) + sqlStmt += wxT("UNIQUE "); + + sqlStmt += wxT("INDEX "); + sqlStmt += pDb->SQLTableName(indexName); + sqlStmt += wxT(" ON "); + + sqlStmt += pDb->SQLTableName(tableName); +// sqlStmt += tableName; + sqlStmt += wxT(" ("); + + // Append list of columns making up index + int i; + for (i = 0; i < numIndexColumns; i++) + { + sqlStmt += pDb->SQLColumnName(pIndexDefs[i].ColName); +// sqlStmt += pIndexDefs[i].ColName; + + // MySQL requires a key length on VARCHAR keys + if ( pDb->Dbms() == dbmsMY_SQL ) + { + // Find the details on this column + int j; + for ( j = 0; j < m_numCols; ++j ) + { + if ( wxStrcmp( pIndexDefs[i].ColName, colDefs[j].ColName ) == 0 ) + { + break; + } + } + if ( colDefs[j].DbDataType == DB_DATA_TYPE_VARCHAR) + { + wxString s; + s.Printf(wxT("(%d)"), (int)(colDefs[i].SzDataObj / sizeof(wxChar))); + sqlStmt += s; + } + } + + // Postgres and SQL Server 7 do not support the ASC/DESC keywords for index columns + if (!((pDb->Dbms() == dbmsMS_SQL_SERVER) && (wxStrncmp(pDb->dbInf.dbmsVer,_T("07"),2)==0)) && + !(pDb->Dbms() == dbmsFIREBIRD) && + !(pDb->Dbms() == dbmsPOSTGRES)) + { + if (pIndexDefs[i].Ascending) + sqlStmt += wxT(" ASC"); + else + sqlStmt += wxT(" DESC"); + } + else + wxASSERT_MSG(pIndexDefs[i].Ascending, _T("Datasource does not support DESCending index columns")); + + if ((i + 1) < numIndexColumns) + sqlStmt += wxT(","); + } + + // Append closing parentheses + sqlStmt += wxT(")"); + + pDb->WriteSqlLog(sqlStmt); + +#ifdef DBDEBUG_CONSOLE + cout << endl << sqlStmt.c_str() << endl << endl; +#endif + + // Execute the CREATE INDEX statement + RETCODE retcode = SQLExecDirect(hstmt, (SQLTCHAR FAR *) sqlStmt.c_str(), SQL_NTS); + if (retcode != SQL_SUCCESS) + { + pDb->DispAllErrors(henv, hdbc, hstmt); + pDb->RollbackTrans(); + CloseCursor(hstmt); + return false; + } + + // Commit the transaction and close the cursor + if (! pDb->CommitTrans()) + return false; + if (! CloseCursor(hstmt)) + return false; + + // Index Created Successfully + return true; + +} // wxDbTable::CreateIndex() + + +/********** wxDbTable::DropIndex() **********/ +bool wxDbTable::DropIndex(const wxString &indexName) +{ + // NOTE: This function returns true if the Index does not exist, but + // only for identified databases. Code will need to be added + // below for any other databases when those databases are defined + // to handle this situation consistently + + wxString sqlStmt; + + if (pDb->Dbms() == dbmsACCESS || pDb->Dbms() == dbmsMY_SQL || + pDb->Dbms() == dbmsDBASE /*|| Paradox needs this syntax too when we add support*/) + sqlStmt.Printf(wxT("DROP INDEX %s ON %s"), + pDb->SQLTableName(indexName.c_str()).c_str(), + pDb->SQLTableName(tableName.c_str()).c_str()); + else if ((pDb->Dbms() == dbmsMS_SQL_SERVER) || + (pDb->Dbms() == dbmsSYBASE_ASE) || + (pDb->Dbms() == dbmsXBASE_SEQUITER)) + sqlStmt.Printf(wxT("DROP INDEX %s.%s"), + pDb->SQLTableName(tableName.c_str()).c_str(), + pDb->SQLTableName(indexName.c_str()).c_str()); + else + sqlStmt.Printf(wxT("DROP INDEX %s"), + pDb->SQLTableName(indexName.c_str()).c_str()); + + pDb->WriteSqlLog(sqlStmt); + +#ifdef DBDEBUG_CONSOLE + cout << endl << sqlStmt.c_str() << endl; +#endif + RETCODE retcode = SQLExecDirect(hstmt, (SQLTCHAR FAR *) sqlStmt.c_str(), SQL_NTS); + if (retcode != SQL_SUCCESS) + { + // Check for "Index not found" error and ignore + pDb->GetNextError(henv, hdbc, hstmt); + if (wxStrcmp(pDb->sqlState,wxT("S0012"))) // "Index not found" + { + // Check for product specific error codes + if (!((pDb->Dbms() == dbmsSYBASE_ASA && !wxStrcmp(pDb->sqlState,wxT("42000"))) || // v5.x (and lower?) + (pDb->Dbms() == dbmsSYBASE_ASE && !wxStrcmp(pDb->sqlState,wxT("37000"))) || + (pDb->Dbms() == dbmsMS_SQL_SERVER && !wxStrcmp(pDb->sqlState,wxT("S1000"))) || + (pDb->Dbms() == dbmsINTERBASE && !wxStrcmp(pDb->sqlState,wxT("S1000"))) || + (pDb->Dbms() == dbmsMAXDB && !wxStrcmp(pDb->sqlState,wxT("S1000"))) || + (pDb->Dbms() == dbmsFIREBIRD && !wxStrcmp(pDb->sqlState,wxT("HY000"))) || + (pDb->Dbms() == dbmsSYBASE_ASE && !wxStrcmp(pDb->sqlState,wxT("S0002"))) || // Base table not found + (pDb->Dbms() == dbmsMY_SQL && !wxStrcmp(pDb->sqlState,wxT("42S12"))) || // tested by Christopher Ludwik Marino-Cebulski using v3.23.21beta + (pDb->Dbms() == dbmsPOSTGRES && !wxStrcmp(pDb->sqlState,wxT("08S01"))) + )) + { + pDb->DispNextError(); + pDb->DispAllErrors(henv, hdbc, hstmt); + pDb->RollbackTrans(); + CloseCursor(hstmt); + return false; + } + } + } + + // Commit the transaction and close the cursor + if (! pDb->CommitTrans()) + return false; + if (! CloseCursor(hstmt)) + return false; + + return true; +} // wxDbTable::DropIndex() + + +/********** wxDbTable::SetOrderByColNums() **********/ +bool wxDbTable::SetOrderByColNums(UWORD first, ... ) +{ + int colNumber = first; // using 'int' to be able to look for wxDB_NO_MORE_COLUN_NUMBERS + va_list argptr; + + bool abort = false; + wxString tempStr; + + va_start(argptr, first); /* Initialize variable arguments. */ + while (!abort && (colNumber != wxDB_NO_MORE_COLUMN_NUMBERS)) + { + // Make sure the passed in column number + // is within the valid range of columns + // + // Valid columns are 0 thru m_numCols-1 + if (colNumber >= m_numCols || colNumber < 0) + { + abort = true; + continue; + } + + if (colNumber != first) + tempStr += wxT(","); + + tempStr += colDefs[colNumber].ColName; + colNumber = va_arg (argptr, int); + } + va_end (argptr); /* Reset variable arguments. */ + + SetOrderByClause(tempStr); + + return (!abort); +} // wxDbTable::SetOrderByColNums() + + +/********** wxDbTable::Insert() **********/ +int wxDbTable::Insert(void) +{ + wxASSERT(!queryOnly); + if (queryOnly || !insertable) + return(DB_FAILURE); + + bindInsertParams(); + + // Insert the record by executing the already prepared insert statement + RETCODE retcode; + retcode = SQLExecute(hstmtInsert); + if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO && + retcode != SQL_NEED_DATA) + { + // Check to see if integrity constraint was violated + pDb->GetNextError(henv, hdbc, hstmtInsert); + if (! wxStrcmp(pDb->sqlState, wxT("23000"))) // Integrity constraint violated + return(DB_ERR_INTEGRITY_CONSTRAINT_VIOL); + else + { + pDb->DispNextError(); + pDb->DispAllErrors(henv, hdbc, hstmtInsert); + return(DB_FAILURE); + } + } + if (retcode == SQL_NEED_DATA) + { + PTR pParmID; + retcode = SQLParamData(hstmtInsert, &pParmID); + while (retcode == SQL_NEED_DATA) + { + // Find the parameter + int i; + for (i=0; i < m_numCols; i++) + { + if (colDefs[i].PtrDataObj == pParmID) + { + // We found it. Store the parameter. + retcode = SQLPutData(hstmtInsert, pParmID, colDefs[i].SzDataObj); + if (retcode != SQL_SUCCESS) + { + pDb->DispNextError(); + pDb->DispAllErrors(henv, hdbc, hstmtInsert); + return(DB_FAILURE); + } + break; + } + } + retcode = SQLParamData(hstmtInsert, &pParmID); + if (retcode != SQL_SUCCESS && + retcode != SQL_SUCCESS_WITH_INFO) + { + // record was not inserted + pDb->DispNextError(); + pDb->DispAllErrors(henv, hdbc, hstmtInsert); + return(DB_FAILURE); + } + } + } + + // Record inserted into the datasource successfully + return(DB_SUCCESS); + +} // wxDbTable::Insert() + + +/********** wxDbTable::Update() **********/ +bool wxDbTable::Update(void) +{ + wxASSERT(!queryOnly); + if (queryOnly) + return false; + + wxString sqlStmt; + + // Build the SQL UPDATE statement + BuildUpdateStmt(sqlStmt, DB_UPD_KEYFIELDS); + + pDb->WriteSqlLog(sqlStmt); + +#ifdef DBDEBUG_CONSOLE + cout << endl << sqlStmt.c_str() << endl << endl; +#endif + + // Execute the SQL UPDATE statement + return(execUpdate(sqlStmt)); + +} // wxDbTable::Update() + + +/********** wxDbTable::Update(pSqlStmt) **********/ +bool wxDbTable::Update(const wxString &pSqlStmt) +{ + wxASSERT(!queryOnly); + if (queryOnly) + return false; + + pDb->WriteSqlLog(pSqlStmt); + + return(execUpdate(pSqlStmt)); + +} // wxDbTable::Update(pSqlStmt) + + +/********** wxDbTable::UpdateWhere() **********/ +bool wxDbTable::UpdateWhere(const wxString &pWhereClause) +{ + wxASSERT(!queryOnly); + if (queryOnly) + return false; + + wxString sqlStmt; + + // Build the SQL UPDATE statement + BuildUpdateStmt(sqlStmt, DB_UPD_WHERE, pWhereClause); + + pDb->WriteSqlLog(sqlStmt); + +#ifdef DBDEBUG_CONSOLE + cout << endl << sqlStmt.c_str() << endl << endl; +#endif + + // Execute the SQL UPDATE statement + return(execUpdate(sqlStmt)); + +} // wxDbTable::UpdateWhere() + + +/********** wxDbTable::Delete() **********/ +bool wxDbTable::Delete(void) +{ + wxASSERT(!queryOnly); + if (queryOnly) + return false; + + wxString sqlStmt; + sqlStmt.Empty(); + + // Build the SQL DELETE statement + BuildDeleteStmt(sqlStmt, DB_DEL_KEYFIELDS); + + pDb->WriteSqlLog(sqlStmt); + + // Execute the SQL DELETE statement + return(execDelete(sqlStmt)); + +} // wxDbTable::Delete() + + +/********** wxDbTable::DeleteWhere() **********/ +bool wxDbTable::DeleteWhere(const wxString &pWhereClause) +{ + wxASSERT(!queryOnly); + if (queryOnly) + return false; + + wxString sqlStmt; + sqlStmt.Empty(); + + // Build the SQL DELETE statement + BuildDeleteStmt(sqlStmt, DB_DEL_WHERE, pWhereClause); + + pDb->WriteSqlLog(sqlStmt); + + // Execute the SQL DELETE statement + return(execDelete(sqlStmt)); + +} // wxDbTable::DeleteWhere() + + +/********** wxDbTable::DeleteMatching() **********/ +bool wxDbTable::DeleteMatching(void) +{ + wxASSERT(!queryOnly); + if (queryOnly) + return false; + + wxString sqlStmt; + sqlStmt.Empty(); + + // Build the SQL DELETE statement + BuildDeleteStmt(sqlStmt, DB_DEL_MATCHING); + + pDb->WriteSqlLog(sqlStmt); + + // Execute the SQL DELETE statement + return(execDelete(sqlStmt)); + +} // wxDbTable::DeleteMatching() + + +/********** wxDbTable::IsColNull() **********/ +bool wxDbTable::IsColNull(UWORD colNumber) const +{ +/* + This logic is just not right. It would indicate true + if a numeric field were set to a value of 0. + + switch(colDefs[colNumber].SqlCtype) + { + case SQL_C_CHAR: + case SQL_C_WCHAR: + //case SQL_C_WXCHAR: SQL_C_WXCHAR is covered by either SQL_C_CHAR or SQL_C_WCHAR + return(((UCHAR FAR *) colDefs[colNumber].PtrDataObj)[0] == 0); + case SQL_C_SSHORT: + return(( *((SWORD *) colDefs[colNumber].PtrDataObj)) == 0); + case SQL_C_USHORT: + return(( *((UWORD*) colDefs[colNumber].PtrDataObj)) == 0); + case SQL_C_SLONG: + return(( *((SDWORD *) colDefs[colNumber].PtrDataObj)) == 0); + case SQL_C_ULONG: + return(( *((UDWORD *) colDefs[colNumber].PtrDataObj)) == 0); + case SQL_C_FLOAT: + return(( *((SFLOAT *) colDefs[colNumber].PtrDataObj)) == 0); + case SQL_C_DOUBLE: + return((*((SDOUBLE *) colDefs[colNumber].PtrDataObj)) == 0); + case SQL_C_TIMESTAMP: + TIMESTAMP_STRUCT *pDt; + pDt = (TIMESTAMP_STRUCT *) colDefs[colNumber].PtrDataObj; + if (pDt->year == 0 && pDt->month == 0 && pDt->day == 0) + return true; + else + return false; + default: + return true; + } +*/ + return (colDefs[colNumber].Null); +} // wxDbTable::IsColNull() + + +/********** wxDbTable::CanSelectForUpdate() **********/ +bool wxDbTable::CanSelectForUpdate(void) +{ + if (queryOnly) + return false; + + if (pDb->Dbms() == dbmsMY_SQL) + return false; + + if ((pDb->Dbms() == dbmsORACLE) || + (pDb->dbInf.posStmts & SQL_PS_SELECT_FOR_UPDATE)) + return true; + else + return false; + +} // wxDbTable::CanSelectForUpdate() + + +/********** wxDbTable::CanUpdateByROWID() **********/ +bool wxDbTable::CanUpdateByROWID(void) +{ +/* + * NOTE: Returning false for now until this can be debugged, + * as the ROWID is not getting updated correctly + */ + return false; +/* + if (pDb->Dbms() == dbmsORACLE) + return true; + else + return false; +*/ +} // wxDbTable::CanUpdateByROWID() + + +/********** wxDbTable::IsCursorClosedOnCommit() **********/ +bool wxDbTable::IsCursorClosedOnCommit(void) +{ + if (pDb->dbInf.cursorCommitBehavior == SQL_CB_PRESERVE) + return false; + else + return true; + +} // wxDbTable::IsCursorClosedOnCommit() + + + +/********** wxDbTable::ClearMemberVar() **********/ +void wxDbTable::ClearMemberVar(UWORD colNumber, bool setToNull) +{ + wxASSERT(colNumber < m_numCols); + + switch(colDefs[colNumber].SqlCtype) + { + case SQL_C_CHAR: +#ifdef SQL_C_WCHAR + case SQL_C_WCHAR: +#endif + //case SQL_C_WXCHAR: SQL_C_WXCHAR is covered by either SQL_C_CHAR or SQL_C_WCHAR + ((UCHAR FAR *) colDefs[colNumber].PtrDataObj)[0] = 0; + break; + case SQL_C_SSHORT: + *((SWORD *) colDefs[colNumber].PtrDataObj) = 0; + break; + case SQL_C_USHORT: + *((UWORD*) colDefs[colNumber].PtrDataObj) = 0; + break; + case SQL_C_LONG: + case SQL_C_SLONG: + *((SDWORD *) colDefs[colNumber].PtrDataObj) = 0; + break; + case SQL_C_ULONG: + *((UDWORD *) colDefs[colNumber].PtrDataObj) = 0; + break; + case SQL_C_FLOAT: + *((SFLOAT *) colDefs[colNumber].PtrDataObj) = 0.0f; + break; + case SQL_C_DOUBLE: + *((SDOUBLE *) colDefs[colNumber].PtrDataObj) = 0.0f; + break; + case SQL_C_TIMESTAMP: + TIMESTAMP_STRUCT *pDt; + pDt = (TIMESTAMP_STRUCT *) colDefs[colNumber].PtrDataObj; + pDt->year = 0; + pDt->month = 0; + pDt->day = 0; + pDt->hour = 0; + pDt->minute = 0; + pDt->second = 0; + pDt->fraction = 0; + break; + case SQL_C_DATE: + DATE_STRUCT *pDtd; + pDtd = (DATE_STRUCT *) colDefs[colNumber].PtrDataObj; + pDtd->year = 0; + pDtd->month = 0; + pDtd->day = 0; + break; + case SQL_C_TIME: + TIME_STRUCT *pDtt; + pDtt = (TIME_STRUCT *) colDefs[colNumber].PtrDataObj; + pDtt->hour = 0; + pDtt->minute = 0; + pDtt->second = 0; + break; + } + + if (setToNull) + SetColNull(colNumber); +} // wxDbTable::ClearMemberVar() + + +/********** wxDbTable::ClearMemberVars() **********/ +void wxDbTable::ClearMemberVars(bool setToNull) +{ + int i; + + // Loop through the columns setting each member variable to zero + for (i=0; i < m_numCols; i++) + ClearMemberVar((UWORD)i,setToNull); + +} // wxDbTable::ClearMemberVars() + + +/********** wxDbTable::SetQueryTimeout() **********/ +bool wxDbTable::SetQueryTimeout(UDWORD nSeconds) +{ + if (SQLSetStmtOption(hstmtInsert, SQL_QUERY_TIMEOUT, nSeconds) != SQL_SUCCESS) + return(pDb->DispAllErrors(henv, hdbc, hstmtInsert)); + if (SQLSetStmtOption(hstmtUpdate, SQL_QUERY_TIMEOUT, nSeconds) != SQL_SUCCESS) + return(pDb->DispAllErrors(henv, hdbc, hstmtUpdate)); + if (SQLSetStmtOption(hstmtDelete, SQL_QUERY_TIMEOUT, nSeconds) != SQL_SUCCESS) + return(pDb->DispAllErrors(henv, hdbc, hstmtDelete)); + if (SQLSetStmtOption(hstmtInternal, SQL_QUERY_TIMEOUT, nSeconds) != SQL_SUCCESS) + return(pDb->DispAllErrors(henv, hdbc, hstmtInternal)); + + // Completed Successfully + return true; + +} // wxDbTable::SetQueryTimeout() + + +/********** wxDbTable::SetColDefs() **********/ +bool wxDbTable::SetColDefs(UWORD index, const wxString &fieldName, int dataType, void *pData, + SWORD cType, int size, bool keyField, bool updateable, + bool insertAllowed, bool derivedColumn) +{ + wxString tmpStr; + + if (index >= m_numCols) // Columns numbers are zero based.... + { + tmpStr.Printf(wxT("Specified column index (%d) exceeds the maximum number of columns (%d) registered for this table definition. Column definition not added."), index, m_numCols); + wxFAIL_MSG(tmpStr); + wxLogDebug(tmpStr); + return false; + } + + if (!colDefs) // May happen if the database connection fails + return false; + + if (fieldName.length() > (unsigned int) DB_MAX_COLUMN_NAME_LEN) + { + wxStrncpy(colDefs[index].ColName, fieldName, DB_MAX_COLUMN_NAME_LEN); + colDefs[index].ColName[DB_MAX_COLUMN_NAME_LEN] = 0; // Prevent buffer overrun + + tmpStr.Printf(wxT("Column name '%s' is too long. Truncated to '%s'."), + fieldName.c_str(),colDefs[index].ColName); + wxFAIL_MSG(tmpStr); + wxLogDebug(tmpStr); + } + else + wxStrcpy(colDefs[index].ColName, fieldName); + + colDefs[index].DbDataType = dataType; + colDefs[index].PtrDataObj = pData; + colDefs[index].SqlCtype = cType; + colDefs[index].SzDataObj = size; //TODO: glt ??? * sizeof(wxChar) ??? + colDefs[index].KeyField = keyField; + colDefs[index].DerivedCol = derivedColumn; + // Derived columns by definition would NOT be "Insertable" or "Updateable" + if (derivedColumn) + { + colDefs[index].Updateable = false; + colDefs[index].InsertAllowed = false; + } + else + { + colDefs[index].Updateable = updateable; + colDefs[index].InsertAllowed = insertAllowed; + } + + colDefs[index].Null = false; + + return true; + +} // wxDbTable::SetColDefs() + + +/********** wxDbTable::SetColDefs() **********/ +wxDbColDataPtr* wxDbTable::SetColDefs(wxDbColInf *pColInfs, UWORD numCols) +{ + wxASSERT(pColInfs); + wxDbColDataPtr *pColDataPtrs = NULL; + + if (pColInfs) + { + UWORD index; + + pColDataPtrs = new wxDbColDataPtr[numCols+1]; + + for (index = 0; index < numCols; index++) + { + // Process the fields + switch (pColInfs[index].dbDataType) + { + case DB_DATA_TYPE_VARCHAR: + pColDataPtrs[index].PtrDataObj = new wxChar[pColInfs[index].bufferSize+(1*sizeof(wxChar))]; + pColDataPtrs[index].SzDataObj = pColInfs[index].bufferSize+(1*sizeof(wxChar)); + pColDataPtrs[index].SqlCtype = SQL_C_WXCHAR; + break; + case DB_DATA_TYPE_MEMO: + pColDataPtrs[index].PtrDataObj = new wxChar[pColInfs[index].bufferSize+(1*sizeof(wxChar))]; + pColDataPtrs[index].SzDataObj = pColInfs[index].bufferSize+(1*sizeof(wxChar)); + pColDataPtrs[index].SqlCtype = SQL_C_WXCHAR; + break; + case DB_DATA_TYPE_INTEGER: + // Can be long or short + if (pColInfs[index].bufferSize == sizeof(long)) + { + pColDataPtrs[index].PtrDataObj = new long; + pColDataPtrs[index].SzDataObj = sizeof(long); + pColDataPtrs[index].SqlCtype = SQL_C_SLONG; + } + else + { + pColDataPtrs[index].PtrDataObj = new short; + pColDataPtrs[index].SzDataObj = sizeof(short); + pColDataPtrs[index].SqlCtype = SQL_C_SSHORT; + } + break; + case DB_DATA_TYPE_FLOAT: + // Can be float or double + if (pColInfs[index].bufferSize == sizeof(float)) + { + pColDataPtrs[index].PtrDataObj = new float; + pColDataPtrs[index].SzDataObj = sizeof(float); + pColDataPtrs[index].SqlCtype = SQL_C_FLOAT; + } + else + { + pColDataPtrs[index].PtrDataObj = new double; + pColDataPtrs[index].SzDataObj = sizeof(double); + pColDataPtrs[index].SqlCtype = SQL_C_DOUBLE; + } + break; + case DB_DATA_TYPE_DATE: + pColDataPtrs[index].PtrDataObj = new TIMESTAMP_STRUCT; + pColDataPtrs[index].SzDataObj = sizeof(TIMESTAMP_STRUCT); + pColDataPtrs[index].SqlCtype = SQL_C_TIMESTAMP; + break; + case DB_DATA_TYPE_BLOB: + wxFAIL_MSG(wxT("This form of ::SetColDefs() cannot be used with BLOB columns")); + pColDataPtrs[index].PtrDataObj = /*BLOB ADDITION NEEDED*/NULL; + pColDataPtrs[index].SzDataObj = /*BLOB ADDITION NEEDED*/sizeof(void *); + pColDataPtrs[index].SqlCtype = SQL_VARBINARY; + break; + } + if (pColDataPtrs[index].PtrDataObj != NULL) + SetColDefs (index,pColInfs[index].colName,pColInfs[index].dbDataType, pColDataPtrs[index].PtrDataObj, pColDataPtrs[index].SqlCtype, pColDataPtrs[index].SzDataObj); + else + { + // Unable to build all the column definitions, as either one of + // the calls to "new" failed above, or there was a BLOB field + // to have a column definition for. If BLOBs are to be used, + // the other form of ::SetColDefs() must be used, as it is impossible + // to know the maximum size to create the PtrDataObj to be. + delete [] pColDataPtrs; + return NULL; + } + } + } + + return (pColDataPtrs); + +} // wxDbTable::SetColDefs() + + +/********** wxDbTable::SetCursor() **********/ +void wxDbTable::SetCursor(HSTMT *hstmtActivate) +{ + if (hstmtActivate == wxDB_DEFAULT_CURSOR) + hstmt = *hstmtDefault; + else + hstmt = *hstmtActivate; + +} // wxDbTable::SetCursor() + + +/********** wxDbTable::Count(const wxString &) **********/ +ULONG wxDbTable::Count(const wxString &args) +{ + ULONG count; + wxString sqlStmt; + SQLLEN cb; + + // Build a "SELECT COUNT(*) FROM queryTableName [WHERE whereClause]" SQL Statement + sqlStmt = wxT("SELECT COUNT("); + sqlStmt += args; + sqlStmt += wxT(") FROM "); + sqlStmt += pDb->SQLTableName(queryTableName); +// sqlStmt += queryTableName; +#if wxODBC_BACKWARD_COMPATABILITY + if (from && wxStrlen(from)) +#else + if (from.length()) +#endif + sqlStmt += from; + + // Add the where clause if one is provided +#if wxODBC_BACKWARD_COMPATABILITY + if (where && wxStrlen(where)) +#else + if (where.length()) +#endif + { + sqlStmt += wxT(" WHERE "); + sqlStmt += where; + } + + pDb->WriteSqlLog(sqlStmt); + + // Initialize the Count cursor if it's not already initialized + if (!hstmtCount) + { + hstmtCount = GetNewCursor(false,false); + wxASSERT(hstmtCount); + if (!hstmtCount) + return(0); + } + + // Execute the SQL statement + if (SQLExecDirect(*hstmtCount, (SQLTCHAR FAR *) sqlStmt.c_str(), SQL_NTS) != SQL_SUCCESS) + { + pDb->DispAllErrors(henv, hdbc, *hstmtCount); + return(0); + } + + // Fetch the record + if (SQLFetch(*hstmtCount) != SQL_SUCCESS) + { + pDb->DispAllErrors(henv, hdbc, *hstmtCount); + return(0); + } + + // Obtain the result + if (SQLGetData(*hstmtCount, (UWORD)1, SQL_C_ULONG, &count, sizeof(count), &cb) != SQL_SUCCESS) + { + pDb->DispAllErrors(henv, hdbc, *hstmtCount); + return(0); + } + + // Free the cursor + if (SQLFreeStmt(*hstmtCount, SQL_CLOSE) != SQL_SUCCESS) + pDb->DispAllErrors(henv, hdbc, *hstmtCount); + + // Return the record count + return(count); + +} // wxDbTable::Count() + + +/********** wxDbTable::Refresh() **********/ +bool wxDbTable::Refresh(void) +{ + bool result = true; + + // Switch to the internal cursor so any active cursors are not corrupted + HSTMT currCursor = GetCursor(); + hstmt = hstmtInternal; +#if wxODBC_BACKWARD_COMPATABILITY + // Save the where and order by clauses + wxChar *saveWhere = where; + wxChar *saveOrderBy = orderBy; +#else + wxString saveWhere = where; + wxString saveOrderBy = orderBy; +#endif + // Build a where clause to refetch the record with. Try and use the + // ROWID if it's available, ow use the key fields. + wxString whereClause; + whereClause.Empty(); + + if (CanUpdateByROWID()) + { + SQLLEN cb; + wxChar rowid[wxDB_ROWID_LEN+1]; + + // Get the ROWID value. If not successful retreiving the ROWID, + // simply fall down through the code and build the WHERE clause + // based on the key fields. + if (SQLGetData(hstmt, (UWORD)(m_numCols+1), SQL_C_WXCHAR, (UCHAR*) rowid, sizeof(rowid), &cb) == SQL_SUCCESS) + { + whereClause += pDb->SQLTableName(queryTableName); +// whereClause += queryTableName; + whereClause += wxT(".ROWID = '"); + whereClause += rowid; + whereClause += wxT("'"); + } + } + + // If unable to use the ROWID, build a where clause from the keyfields + if (wxStrlen(whereClause) == 0) + BuildWhereClause(whereClause, DB_WHERE_KEYFIELDS, queryTableName); + + // Requery the record + where = whereClause; + orderBy.Empty(); + if (!Query()) + result = false; + + if (result && !GetNext()) + result = false; + + // Switch back to original cursor + SetCursor(&currCursor); + + // Free the internal cursor + if (SQLFreeStmt(hstmtInternal, SQL_CLOSE) != SQL_SUCCESS) + pDb->DispAllErrors(henv, hdbc, hstmtInternal); + + // Restore the original where and order by clauses + where = saveWhere; + orderBy = saveOrderBy; + + return(result); + +} // wxDbTable::Refresh() + + +/********** wxDbTable::SetColNull() **********/ +bool wxDbTable::SetColNull(UWORD colNumber, bool set) +{ + if (colNumber < m_numCols) + { + colDefs[colNumber].Null = set; + if (set) // Blank out the values in the member variable + ClearMemberVar(colNumber, false); // Must call with false here, or infinite recursion will happen + + setCbValueForColumn(colNumber); + + return true; + } + else + return false; + +} // wxDbTable::SetColNull() + + +/********** wxDbTable::SetColNull() **********/ +bool wxDbTable::SetColNull(const wxString &colName, bool set) +{ + int colNumber; + for (colNumber = 0; colNumber < m_numCols; colNumber++) + { + if (!wxStricmp(colName, colDefs[colNumber].ColName)) + break; + } + + if (colNumber < m_numCols) + { + colDefs[colNumber].Null = set; + if (set) // Blank out the values in the member variable + ClearMemberVar((UWORD)colNumber,false); // Must call with false here, or infinite recursion will happen + + setCbValueForColumn(colNumber); + + return true; + } + else + return false; + +} // wxDbTable::SetColNull() + + +/********** wxDbTable::GetNewCursor() **********/ +HSTMT *wxDbTable::GetNewCursor(bool setCursor, bool bindColumns) +{ + HSTMT *newHSTMT = new HSTMT; + wxASSERT(newHSTMT); + if (!newHSTMT) + return(0); + + if (SQLAllocStmt(hdbc, newHSTMT) != SQL_SUCCESS) + { + pDb->DispAllErrors(henv, hdbc); + delete newHSTMT; + return(0); + } + + if (SQLSetStmtOption(*newHSTMT, SQL_CURSOR_TYPE, cursorType) != SQL_SUCCESS) + { + pDb->DispAllErrors(henv, hdbc, *newHSTMT); + delete newHSTMT; + return(0); + } + + if (bindColumns) + { + if (!bindCols(*newHSTMT)) + { + delete newHSTMT; + return(0); + } + } + + if (setCursor) + SetCursor(newHSTMT); + + return(newHSTMT); + +} // wxDbTable::GetNewCursor() + + +/********** wxDbTable::DeleteCursor() **********/ +bool wxDbTable::DeleteCursor(HSTMT *hstmtDel) +{ + bool result = true; + + if (!hstmtDel) // Cursor already deleted + return(result); + +/* +ODBC 3.0 says to use this form + if (SQLFreeHandle(*hstmtDel, SQL_DROP) != SQL_SUCCESS) + +*/ + if (SQLFreeStmt(*hstmtDel, SQL_DROP) != SQL_SUCCESS) + { + pDb->DispAllErrors(henv, hdbc); + result = false; + } + + delete hstmtDel; + + return(result); + +} // wxDbTable::DeleteCursor() + +////////////////////////////////////////////////////////////// +// wxDbGrid support functions +////////////////////////////////////////////////////////////// + +void wxDbTable::SetRowMode(const rowmode_t rowmode) +{ + if (!m_hstmtGridQuery) + { + m_hstmtGridQuery = GetNewCursor(false,false); + if (!bindCols(*m_hstmtGridQuery)) + return; + } + + m_rowmode = rowmode; + switch (m_rowmode) + { + case WX_ROW_MODE_QUERY: + SetCursor(m_hstmtGridQuery); + break; + case WX_ROW_MODE_INDIVIDUAL: + SetCursor(hstmtDefault); + break; + default: + wxASSERT(0); + } +} // wxDbTable::SetRowMode() + + +wxVariant wxDbTable::GetColumn(const int colNumber) const +{ + wxVariant val; + if ((colNumber < m_numCols) && (!IsColNull((UWORD)colNumber))) + { + switch (colDefs[colNumber].SqlCtype) + { +#if wxUSE_UNICODE + #if defined(SQL_WCHAR) + case SQL_WCHAR: + #endif + #if defined(SQL_WVARCHAR) + case SQL_WVARCHAR: + #endif +#endif + case SQL_CHAR: + case SQL_VARCHAR: + val = (wxChar *)(colDefs[colNumber].PtrDataObj); + break; + case SQL_C_LONG: + case SQL_C_SLONG: + val = *(long *)(colDefs[colNumber].PtrDataObj); + break; + case SQL_C_SHORT: + case SQL_C_SSHORT: + val = (long int )(*(short *)(colDefs[colNumber].PtrDataObj)); + break; + case SQL_C_ULONG: + val = (long)(*(unsigned long *)(colDefs[colNumber].PtrDataObj)); + break; + case SQL_C_TINYINT: + val = (long)(*(wxChar *)(colDefs[colNumber].PtrDataObj)); + break; + case SQL_C_UTINYINT: + val = (long)(*(wxChar *)(colDefs[colNumber].PtrDataObj)); + break; + case SQL_C_USHORT: + val = (long)(*(UWORD *)(colDefs[colNumber].PtrDataObj)); + break; + case SQL_C_DATE: + val = (DATE_STRUCT *)(colDefs[colNumber].PtrDataObj); + break; + case SQL_C_TIME: + val = (TIME_STRUCT *)(colDefs[colNumber].PtrDataObj); + break; + case SQL_C_TIMESTAMP: + val = (TIMESTAMP_STRUCT *)(colDefs[colNumber].PtrDataObj); + break; + case SQL_C_DOUBLE: + val = *(double *)(colDefs[colNumber].PtrDataObj); + break; + default: + assert(0); + } + } + return val; +} // wxDbTable::GetCol() + + +void wxDbTable::SetColumn(const int colNumber, const wxVariant val) +{ + //FIXME: Add proper wxDateTime support to wxVariant.. + wxDateTime dateval; + + SetColNull((UWORD)colNumber, val.IsNull()); + + if (!val.IsNull()) + { + if ((colDefs[colNumber].SqlCtype == SQL_C_DATE) + || (colDefs[colNumber].SqlCtype == SQL_C_TIME) + || (colDefs[colNumber].SqlCtype == SQL_C_TIMESTAMP)) + { + //Returns null if invalid! + if (!dateval.ParseDate(val.GetString())) + SetColNull((UWORD)colNumber, true); + } + + switch (colDefs[colNumber].SqlCtype) + { +#if wxUSE_UNICODE + #if defined(SQL_WCHAR) + case SQL_WCHAR: + #endif + #if defined(SQL_WVARCHAR) + case SQL_WVARCHAR: + #endif +#endif + case SQL_CHAR: + case SQL_VARCHAR: + csstrncpyt((wxChar *)(colDefs[colNumber].PtrDataObj), + val.GetString().c_str(), + colDefs[colNumber].SzDataObj-1); //TODO: glt ??? * sizeof(wxChar) ??? + break; + case SQL_C_LONG: + case SQL_C_SLONG: + *(long *)(colDefs[colNumber].PtrDataObj) = val; + break; + case SQL_C_SHORT: + case SQL_C_SSHORT: + *(short *)(colDefs[colNumber].PtrDataObj) = (short)val.GetLong(); + break; + case SQL_C_ULONG: + *(unsigned long *)(colDefs[colNumber].PtrDataObj) = val.GetLong(); + break; + case SQL_C_TINYINT: + *(wxChar *)(colDefs[colNumber].PtrDataObj) = val.GetChar(); + break; + case SQL_C_UTINYINT: + *(wxChar *)(colDefs[colNumber].PtrDataObj) = val.GetChar(); + break; + case SQL_C_USHORT: + *(unsigned short *)(colDefs[colNumber].PtrDataObj) = (unsigned short)val.GetLong(); + break; + //FIXME: Add proper wxDateTime support to wxVariant.. + case SQL_C_DATE: + { + DATE_STRUCT *dataptr = + (DATE_STRUCT *)colDefs[colNumber].PtrDataObj; + + dataptr->year = (SWORD)dateval.GetYear(); + dataptr->month = (UWORD)(dateval.GetMonth()+1); + dataptr->day = (UWORD)dateval.GetDay(); + } + break; + case SQL_C_TIME: + { + TIME_STRUCT *dataptr = + (TIME_STRUCT *)colDefs[colNumber].PtrDataObj; + + dataptr->hour = dateval.GetHour(); + dataptr->minute = dateval.GetMinute(); + dataptr->second = dateval.GetSecond(); + } + break; + case SQL_C_TIMESTAMP: + { + TIMESTAMP_STRUCT *dataptr = + (TIMESTAMP_STRUCT *)colDefs[colNumber].PtrDataObj; + dataptr->year = (SWORD)dateval.GetYear(); + dataptr->month = (UWORD)(dateval.GetMonth()+1); + dataptr->day = (UWORD)dateval.GetDay(); + + dataptr->hour = dateval.GetHour(); + dataptr->minute = dateval.GetMinute(); + dataptr->second = dateval.GetSecond(); + } + break; + case SQL_C_DOUBLE: + *(double *)(colDefs[colNumber].PtrDataObj) = val; + break; + default: + assert(0); + } // switch + } // if (!val.IsNull()) +} // wxDbTable::SetCol() + + +GenericKey wxDbTable::GetKey() +{ + void *blk; + wxChar *blkptr; + + blk = malloc(m_keysize); + blkptr = (wxChar *) blk; + + int i; + for (i=0; i < m_numCols; i++) + { + if (colDefs[i].KeyField) + { + memcpy(blkptr,colDefs[i].PtrDataObj, colDefs[i].SzDataObj); + blkptr += colDefs[i].SzDataObj; + } + } + + GenericKey k = GenericKey(blk, m_keysize); + free(blk); + + return k; +} // wxDbTable::GetKey() + + +void wxDbTable::SetKey(const GenericKey& k) +{ + void *blk; + wxChar *blkptr; + + blk = k.GetBlk(); + blkptr = (wxChar *)blk; + + int i; + for (i=0; i < m_numCols; i++) + { + if (colDefs[i].KeyField) + { + SetColNull((UWORD)i, false); + memcpy(colDefs[i].PtrDataObj, blkptr, colDefs[i].SzDataObj); + blkptr += colDefs[i].SzDataObj; + } + } +} // wxDbTable::SetKey() + + +#endif // wxUSE_ODBC diff --git a/Externals/wxWidgets/src/common/dcbase.cpp b/Externals/wxWidgets/src/common/dcbase.cpp new file mode 100644 index 0000000000..18374fa453 --- /dev/null +++ b/Externals/wxWidgets/src/common/dcbase.cpp @@ -0,0 +1,1159 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/dcbase.cpp +// Purpose: generic methods of the wxDC Class +// Author: Vadim Zeitlin +// Modified by: +// Created: 05/25/99 +// RCS-ID: $Id: dcbase.cpp 48616 2007-09-09 19:36:50Z VZ $ +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#include "wx/dc.h" +#include "wx/dcbuffer.h" // for IMPLEMENT_DYNAMIC_CLASS + +#ifndef WX_PRECOMP + #include "wx/math.h" +#endif + +// bool wxDCBase::sm_cacheing = false; + +IMPLEMENT_ABSTRACT_CLASS(wxDCBase, wxObject) + +// ============================================================================ +// implementation +// ============================================================================ + +IMPLEMENT_DYNAMIC_CLASS(wxBufferedDC, wxMemoryDC) +IMPLEMENT_ABSTRACT_CLASS(wxBufferedPaintDC, wxBufferedDC) + +#if WXWIN_COMPATIBILITY_2_6 +void wxDCBase::BeginDrawing() +{ +} + +void wxDCBase::EndDrawing() +{ +} +#endif // WXWIN_COMPATIBILITY_2_6 + +// ---------------------------------------------------------------------------- +// special symbols +// ---------------------------------------------------------------------------- + +void wxDCBase::DoDrawCheckMark(wxCoord x1, wxCoord y1, + wxCoord width, wxCoord height) +{ + wxCHECK_RET( Ok(), wxT("invalid window dc") ); + + wxCoord x2 = x1 + width, + y2 = y1 + height; + + // the pen width is calibrated to give 3 for width == height == 10 + wxDCPenChanger pen((wxDC&)*this, + wxPen(GetTextForeground(), (width + height + 1)/7)); + + // we're drawing a scaled version of wx/generic/tick.xpm here + wxCoord x3 = x1 + (4*width) / 10, // x of the tick bottom + y3 = y1 + height / 2; // y of the left tick branch + DoDrawLine(x1, y3, x3, y2); + DoDrawLine(x3, y2, x2, y1); + + CalcBoundingBox(x1, y1); + CalcBoundingBox(x2, y2); +} + +// ---------------------------------------------------------------------------- +// line/polygons +// ---------------------------------------------------------------------------- + +void wxDCBase::DrawLines(const wxList *list, wxCoord xoffset, wxCoord yoffset) +{ + int n = list->GetCount(); + wxPoint *points = new wxPoint[n]; + + int i = 0; + for ( wxList::compatibility_iterator node = list->GetFirst(); node; node = node->GetNext(), i++ ) + { + wxPoint *point = (wxPoint *)node->GetData(); + points[i].x = point->x; + points[i].y = point->y; + } + + DoDrawLines(n, points, xoffset, yoffset); + + delete [] points; +} + + +void wxDCBase::DrawPolygon(const wxList *list, + wxCoord xoffset, wxCoord yoffset, + int fillStyle) +{ + int n = list->GetCount(); + wxPoint *points = new wxPoint[n]; + + int i = 0; + for ( wxList::compatibility_iterator node = list->GetFirst(); node; node = node->GetNext(), i++ ) + { + wxPoint *point = (wxPoint *)node->GetData(); + points[i].x = point->x; + points[i].y = point->y; + } + + DoDrawPolygon(n, points, xoffset, yoffset, fillStyle); + + delete [] points; +} + +void +wxDCBase::DoDrawPolyPolygon(int n, + int count[], + wxPoint points[], + wxCoord xoffset, wxCoord yoffset, + int fillStyle) +{ + if ( n == 1 ) + { + DoDrawPolygon(count[0], points, xoffset, yoffset, fillStyle); + return; + } + + int i, j, lastOfs; + wxPoint* pts; + wxPen pen; + + for (i = j = lastOfs = 0; i < n; i++) + { + lastOfs = j; + j += count[i]; + } + pts = new wxPoint[j+n-1]; + for (i = 0; i < j; i++) + pts[i] = points[i]; + for (i = 2; i <= n; i++) + { + lastOfs -= count[n-i]; + pts[j++] = pts[lastOfs]; + } + + pen = GetPen(); + SetPen(wxPen(*wxBLACK, 0, wxTRANSPARENT)); + DoDrawPolygon(j, pts, xoffset, yoffset, fillStyle); + SetPen(pen); + for (i = j = 0; i < n; i++) + { + DoDrawLines(count[i], pts+j, xoffset, yoffset); + j += count[i]; + } + delete[] pts; +} + +// ---------------------------------------------------------------------------- +// splines +// ---------------------------------------------------------------------------- + +#if wxUSE_SPLINES + +// TODO: this API needs fixing (wxPointList, why (!const) "wxList *"?) +void wxDCBase::DrawSpline(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2, wxCoord x3, wxCoord y3) +{ + wxList point_list; + + wxPoint *point1 = new wxPoint; + point1->x = x1; point1->y = y1; + point_list.Append((wxObject*)point1); + + wxPoint *point2 = new wxPoint; + point2->x = x2; point2->y = y2; + point_list.Append((wxObject*)point2); + + wxPoint *point3 = new wxPoint; + point3->x = x3; point3->y = y3; + point_list.Append((wxObject*)point3); + + DrawSpline(&point_list); + + for( wxList::compatibility_iterator node = point_list.GetFirst(); node; node = node->GetNext() ) + { + wxPoint *p = (wxPoint *)node->GetData(); + delete p; + } +} + +void wxDCBase::DrawSpline(int n, wxPoint points[]) +{ + wxList list; + for (int i =0; i < n; i++) + { + list.Append((wxObject*)&points[i]); + } + + DrawSpline(&list); +} + +// ----------------------------------- spline code ---------------------------------------- + +void wx_quadratic_spline(double a1, double b1, double a2, double b2, + double a3, double b3, double a4, double b4); +void wx_clear_stack(); +int wx_spline_pop(double *x1, double *y1, double *x2, double *y2, double *x3, + double *y3, double *x4, double *y4); +void wx_spline_push(double x1, double y1, double x2, double y2, double x3, double y3, + double x4, double y4); +static bool wx_spline_add_point(double x, double y); +static void wx_spline_draw_point_array(wxDCBase *dc); + +wxList wx_spline_point_list; + +#define half(z1, z2) ((z1+z2)/2.0) +#define THRESHOLD 5 + +/* iterative version */ + +void wx_quadratic_spline(double a1, double b1, double a2, double b2, double a3, double b3, double a4, + double b4) +{ + register double xmid, ymid; + double x1, y1, x2, y2, x3, y3, x4, y4; + + wx_clear_stack(); + wx_spline_push(a1, b1, a2, b2, a3, b3, a4, b4); + + while (wx_spline_pop(&x1, &y1, &x2, &y2, &x3, &y3, &x4, &y4)) { + xmid = (double)half(x2, x3); + ymid = (double)half(y2, y3); + if (fabs(x1 - xmid) < THRESHOLD && fabs(y1 - ymid) < THRESHOLD && + fabs(xmid - x4) < THRESHOLD && fabs(ymid - y4) < THRESHOLD) { + wx_spline_add_point( x1, y1 ); + wx_spline_add_point( xmid, ymid ); + } else { + wx_spline_push(xmid, ymid, (double)half(xmid, x3), (double)half(ymid, y3), + (double)half(x3, x4), (double)half(y3, y4), x4, y4); + wx_spline_push(x1, y1, (double)half(x1, x2), (double)half(y1, y2), + (double)half(x2, xmid), (double)half(y2, ymid), xmid, ymid); + } + } +} + +/* utilities used by spline drawing routines */ + +typedef struct wx_spline_stack_struct { + double x1, y1, x2, y2, x3, y3, x4, y4; +} Stack; + +#define SPLINE_STACK_DEPTH 20 +static Stack wx_spline_stack[SPLINE_STACK_DEPTH]; +static Stack *wx_stack_top; +static int wx_stack_count; + +void wx_clear_stack() +{ + wx_stack_top = wx_spline_stack; + wx_stack_count = 0; +} + +void wx_spline_push(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4) +{ + wx_stack_top->x1 = x1; + wx_stack_top->y1 = y1; + wx_stack_top->x2 = x2; + wx_stack_top->y2 = y2; + wx_stack_top->x3 = x3; + wx_stack_top->y3 = y3; + wx_stack_top->x4 = x4; + wx_stack_top->y4 = y4; + wx_stack_top++; + wx_stack_count++; +} + +int wx_spline_pop(double *x1, double *y1, double *x2, double *y2, + double *x3, double *y3, double *x4, double *y4) +{ + if (wx_stack_count == 0) + return (0); + wx_stack_top--; + wx_stack_count--; + *x1 = wx_stack_top->x1; + *y1 = wx_stack_top->y1; + *x2 = wx_stack_top->x2; + *y2 = wx_stack_top->y2; + *x3 = wx_stack_top->x3; + *y3 = wx_stack_top->y3; + *x4 = wx_stack_top->x4; + *y4 = wx_stack_top->y4; + return (1); +} + +static bool wx_spline_add_point(double x, double y) +{ + wxPoint *point = new wxPoint ; + point->x = (int) x; + point->y = (int) y; + wx_spline_point_list.Append((wxObject*)point); + return true; +} + +static void wx_spline_draw_point_array(wxDCBase *dc) +{ + dc->DrawLines(&wx_spline_point_list, 0, 0 ); + wxList::compatibility_iterator node = wx_spline_point_list.GetFirst(); + while (node) + { + wxPoint *point = (wxPoint *)node->GetData(); + delete point; + wx_spline_point_list.Erase(node); + node = wx_spline_point_list.GetFirst(); + } +} + +void wxDCBase::DoDrawSpline( wxList *points ) +{ + wxCHECK_RET( Ok(), wxT("invalid window dc") ); + + wxPoint *p; + double cx1, cy1, cx2, cy2, cx3, cy3, cx4, cy4; + double x1, y1, x2, y2; + + wxList::compatibility_iterator node = points->GetFirst(); + if (!node) + // empty list + return; + + p = (wxPoint *)node->GetData(); + + x1 = p->x; + y1 = p->y; + + node = node->GetNext(); + p = (wxPoint *)node->GetData(); + + x2 = p->x; + y2 = p->y; + cx1 = (double)((x1 + x2) / 2); + cy1 = (double)((y1 + y2) / 2); + cx2 = (double)((cx1 + x2) / 2); + cy2 = (double)((cy1 + y2) / 2); + + wx_spline_add_point(x1, y1); + + while ((node = node->GetNext()) +#if !wxUSE_STL + != NULL +#endif // !wxUSE_STL + ) + { + p = (wxPoint *)node->GetData(); + x1 = x2; + y1 = y2; + x2 = p->x; + y2 = p->y; + cx4 = (double)(x1 + x2) / 2; + cy4 = (double)(y1 + y2) / 2; + cx3 = (double)(x1 + cx4) / 2; + cy3 = (double)(y1 + cy4) / 2; + + wx_quadratic_spline(cx1, cy1, cx2, cy2, cx3, cy3, cx4, cy4); + + cx1 = cx4; + cy1 = cy4; + cx2 = (double)(cx1 + x2) / 2; + cy2 = (double)(cy1 + y2) / 2; + } + + wx_spline_add_point( cx1, cy1 ); + wx_spline_add_point( x2, y2 ); + + wx_spline_draw_point_array( this ); +} + +#endif // wxUSE_SPLINES + +// ---------------------------------------------------------------------------- +// Partial Text Extents +// ---------------------------------------------------------------------------- + + +// Each element of the widths array will be the width of the string up to and +// including the corresponding character in text. This is the generic +// implementation, the port-specific classes should do this with native APIs +// if available and if faster. Note: pango_layout_index_to_pos is much slower +// than calling GetTextExtent!! + +#define FWC_SIZE 256 + +class FontWidthCache +{ +public: + FontWidthCache() : m_scaleX(1), m_widths(NULL) { } + ~FontWidthCache() { delete []m_widths; } + + void Reset() + { + if (!m_widths) + m_widths = new int[FWC_SIZE]; + + memset(m_widths, 0, sizeof(int)*FWC_SIZE); + } + + wxFont m_font; + double m_scaleX; + int *m_widths; +}; + +static FontWidthCache s_fontWidthCache; + +bool wxDCBase::DoGetPartialTextExtents(const wxString& text, wxArrayInt& widths) const +{ + int totalWidth = 0; + + const size_t len = text.length(); + widths.Empty(); + widths.Add(0, len); + + // reset the cache if font or horizontal scale have changed + if ( !s_fontWidthCache.m_widths || + !wxIsSameDouble(s_fontWidthCache.m_scaleX, m_scaleX) || + (s_fontWidthCache.m_font != GetFont()) ) + { + s_fontWidthCache.Reset(); + s_fontWidthCache.m_font = GetFont(); + s_fontWidthCache.m_scaleX = m_scaleX; + } + + // Calculate the position of each character based on the widths of + // the previous characters + int w, h; + for ( size_t i = 0; i < len; i++ ) + { + const wxChar c = text[i]; + unsigned int c_int = (unsigned int)c; + + if ((c_int < FWC_SIZE) && (s_fontWidthCache.m_widths[c_int] != 0)) + { + w = s_fontWidthCache.m_widths[c_int]; + } + else + { + GetTextExtent(c, &w, &h); + if (c_int < FWC_SIZE) + s_fontWidthCache.m_widths[c_int] = w; + } + + totalWidth += w; + widths[i] = totalWidth; + } + + return true; +} + + +// ---------------------------------------------------------------------------- +// enhanced text drawing +// ---------------------------------------------------------------------------- + +void wxDCBase::GetMultiLineTextExtent(const wxString& text, + wxCoord *x, + wxCoord *y, + wxCoord *h, + wxFont *font) const +{ + wxCoord widthTextMax = 0, widthLine, + heightTextTotal = 0, heightLineDefault = 0, heightLine = 0; + + wxString curLine; + for ( const wxChar *pc = text; ; pc++ ) + { + if ( *pc == _T('\n') || *pc == _T('\0') ) + { + if ( curLine.empty() ) + { + // we can't use GetTextExtent - it will return 0 for both width + // and height and an empty line should count in height + // calculation + + // assume that this line has the same height as the previous + // one + if ( !heightLineDefault ) + heightLineDefault = heightLine; + + if ( !heightLineDefault ) + { + // but we don't know it yet - choose something reasonable + GetTextExtent(_T("W"), NULL, &heightLineDefault, + NULL, NULL, font); + } + + heightTextTotal += heightLineDefault; + } + else + { + GetTextExtent(curLine, &widthLine, &heightLine, + NULL, NULL, font); + if ( widthLine > widthTextMax ) + widthTextMax = widthLine; + heightTextTotal += heightLine; + } + + if ( *pc == _T('\n') ) + { + curLine.clear(); + } + else + { + // the end of string + break; + } + } + else + { + curLine += *pc; + } + } + + if ( x ) + *x = widthTextMax; + if ( y ) + *y = heightTextTotal; + if ( h ) + *h = heightLine; +} + +void wxDCBase::DrawLabel(const wxString& text, + const wxBitmap& bitmap, + const wxRect& rect, + int alignment, + int indexAccel, + wxRect *rectBounding) +{ + // find the text position + wxCoord widthText, heightText, heightLine; + GetMultiLineTextExtent(text, &widthText, &heightText, &heightLine); + + wxCoord width, height; + if ( bitmap.Ok() ) + { + width = widthText + bitmap.GetWidth(); + height = bitmap.GetHeight(); + } + else // no bitmap + { + width = widthText; + height = heightText; + } + + wxCoord x, y; + if ( alignment & wxALIGN_RIGHT ) + { + x = rect.GetRight() - width; + } + else if ( alignment & wxALIGN_CENTRE_HORIZONTAL ) + { + x = (rect.GetLeft() + rect.GetRight() + 1 - width) / 2; + } + else // alignment & wxALIGN_LEFT + { + x = rect.GetLeft(); + } + + if ( alignment & wxALIGN_BOTTOM ) + { + y = rect.GetBottom() - height; + } + else if ( alignment & wxALIGN_CENTRE_VERTICAL ) + { + y = (rect.GetTop() + rect.GetBottom() + 1 - height) / 2; + } + else // alignment & wxALIGN_TOP + { + y = rect.GetTop(); + } + + // draw the bitmap first + wxCoord x0 = x, + y0 = y, + width0 = width; + if ( bitmap.Ok() ) + { + DrawBitmap(bitmap, x, y, true /* use mask */); + + wxCoord offset = bitmap.GetWidth() + 4; + x += offset; + width -= offset; + + y += (height - heightText) / 2; + } + + // we will draw the underscore under the accel char later + wxCoord startUnderscore = 0, + endUnderscore = 0, + yUnderscore = 0; + + // split the string into lines and draw each of them separately + wxString curLine; + for ( const wxChar *pc = text; ; pc++ ) + { + if ( *pc == _T('\n') || *pc == _T('\0') ) + { + int xRealStart = x; // init it here to avoid compielr warnings + + if ( !curLine.empty() ) + { + // NB: can't test for !(alignment & wxALIGN_LEFT) because + // wxALIGN_LEFT is 0 + if ( alignment & (wxALIGN_RIGHT | wxALIGN_CENTRE_HORIZONTAL) ) + { + wxCoord widthLine; + GetTextExtent(curLine, &widthLine, NULL); + + if ( alignment & wxALIGN_RIGHT ) + { + xRealStart += width - widthLine; + } + else // if ( alignment & wxALIGN_CENTRE_HORIZONTAL ) + { + xRealStart += (width - widthLine) / 2; + } + } + //else: left aligned, nothing to do + + DrawText(curLine, xRealStart, y); + } + + y += heightLine; + + // do we have underscore in this line? we can check yUnderscore + // because it is set below to just y + heightLine if we do + if ( y == yUnderscore ) + { + // adjust the horz positions to account for the shift + startUnderscore += xRealStart; + endUnderscore += xRealStart; + } + + if ( *pc == _T('\0') ) + break; + + curLine.clear(); + } + else // not end of line + { + if ( pc - text.c_str() == indexAccel ) + { + // remeber to draw underscore here + GetTextExtent(curLine, &startUnderscore, NULL); + curLine += *pc; + GetTextExtent(curLine, &endUnderscore, NULL); + + yUnderscore = y + heightLine; + } + else + { + curLine += *pc; + } + } + } + + // draw the underscore if found + if ( startUnderscore != endUnderscore ) + { + // it should be of the same colour as text + SetPen(wxPen(GetTextForeground(), 0, wxSOLID)); + + yUnderscore--; + + DrawLine(startUnderscore, yUnderscore, endUnderscore, yUnderscore); + } + + // return bounding rect if requested + if ( rectBounding ) + { + *rectBounding = wxRect(x, y - heightText, widthText, heightText); + } + + CalcBoundingBox(x0, y0); + CalcBoundingBox(x0 + width0, y0 + height); +} + + +void wxDCBase::DoGradientFillLinear(const wxRect& rect, + const wxColour& initialColour, + const wxColour& destColour, + wxDirection nDirection) +{ + // save old pen + wxPen oldPen = m_pen; + wxBrush oldBrush = m_brush; + + wxUint8 nR1 = initialColour.Red(); + wxUint8 nG1 = initialColour.Green(); + wxUint8 nB1 = initialColour.Blue(); + wxUint8 nR2 = destColour.Red(); + wxUint8 nG2 = destColour.Green(); + wxUint8 nB2 = destColour.Blue(); + wxUint8 nR, nG, nB; + + if ( nDirection == wxEAST || nDirection == wxWEST ) + { + wxInt32 x = rect.GetWidth(); + wxInt32 w = x; // width of area to shade + wxInt32 xDelta = w/256; // height of one shade bend + if (xDelta < 1) + xDelta = 1; + + while (x >= xDelta) + { + x -= xDelta; + if (nR1 > nR2) + nR = nR1 - (nR1-nR2)*(w-x)/w; + else + nR = nR1 + (nR2-nR1)*(w-x)/w; + + if (nG1 > nG2) + nG = nG1 - (nG1-nG2)*(w-x)/w; + else + nG = nG1 + (nG2-nG1)*(w-x)/w; + + if (nB1 > nB2) + nB = nB1 - (nB1-nB2)*(w-x)/w; + else + nB = nB1 + (nB2-nB1)*(w-x)/w; + + wxColour colour(nR,nG,nB); + SetPen(wxPen(colour, 1, wxSOLID)); + SetBrush(wxBrush(colour)); + if(nDirection == wxEAST) + DrawRectangle(rect.GetRight()-x-xDelta+1, rect.GetTop(), + xDelta, rect.GetHeight()); + else //nDirection == wxWEST + DrawRectangle(rect.GetLeft()+x, rect.GetTop(), + xDelta, rect.GetHeight()); + } + } + else // nDirection == wxNORTH || nDirection == wxSOUTH + { + wxInt32 y = rect.GetHeight(); + wxInt32 w = y; // height of area to shade + wxInt32 yDelta = w/255; // height of one shade bend + if (yDelta < 1) + yDelta = 1; + + while (y > 0) + { + y -= yDelta; + if (nR1 > nR2) + nR = nR1 - (nR1-nR2)*(w-y)/w; + else + nR = nR1 + (nR2-nR1)*(w-y)/w; + + if (nG1 > nG2) + nG = nG1 - (nG1-nG2)*(w-y)/w; + else + nG = nG1 + (nG2-nG1)*(w-y)/w; + + if (nB1 > nB2) + nB = nB1 - (nB1-nB2)*(w-y)/w; + else + nB = nB1 + (nB2-nB1)*(w-y)/w; + + wxColour colour(nR,nG,nB); + SetPen(wxPen(colour, 1, wxSOLID)); + SetBrush(wxBrush(colour)); + if(nDirection == wxNORTH) + DrawRectangle(rect.GetLeft(), rect.GetTop()+y, + rect.GetWidth(), yDelta); + else //nDirection == wxSOUTH + DrawRectangle(rect.GetLeft(), rect.GetBottom()-y-yDelta+1, + rect.GetWidth(), yDelta); + } + } + + SetPen(oldPen); + SetBrush(oldBrush); +} + +void wxDCBase::DoGradientFillConcentric(const wxRect& rect, + const wxColour& initialColour, + const wxColour& destColour, + const wxPoint& circleCenter) +{ + //save the old pen color + wxColour oldPenColour = m_pen.GetColour(); + + wxUint8 nR1 = destColour.Red(); + wxUint8 nG1 = destColour.Green(); + wxUint8 nB1 = destColour.Blue(); + wxUint8 nR2 = initialColour.Red(); + wxUint8 nG2 = initialColour.Green(); + wxUint8 nB2 = initialColour.Blue(); + wxUint8 nR, nG, nB; + + + //Radius + wxInt32 cx = rect.GetWidth() / 2; + wxInt32 cy = rect.GetHeight() / 2; + wxInt32 nRadius; + if (cx < cy) + nRadius = cx; + else + nRadius = cy; + + //Offset of circle + wxInt32 nCircleOffX = circleCenter.x - (rect.GetWidth() / 2); + wxInt32 nCircleOffY = circleCenter.y - (rect.GetHeight() / 2); + + for ( wxInt32 x = 0; x < rect.GetWidth(); x++ ) + { + for ( wxInt32 y = 0; y < rect.GetHeight(); y++ ) + { + //get color difference + wxInt32 nGradient = ((nRadius - + (wxInt32)sqrt( + pow((double)(x - cx - nCircleOffX), 2) + + pow((double)(y - cy - nCircleOffY), 2) + )) * 100) / nRadius; + + //normalize Gradient + if (nGradient < 0 ) + nGradient = 0; + + //get dest colors + nR = (wxUint8)(nR1 + ((nR2 - nR1) * nGradient / 100)); + nG = (wxUint8)(nG1 + ((nG2 - nG1) * nGradient / 100)); + nB = (wxUint8)(nB1 + ((nB2 - nB1) * nGradient / 100)); + + //set the pixel + m_pen.SetColour(wxColour(nR,nG,nB)); + DrawPoint(wxPoint(x + rect.GetLeft(), y + rect.GetTop())); + } + } + //return old pen color + m_pen.SetColour(oldPenColour); +} + +/* +Notes for wxWidgets DrawEllipticArcRot(...) + +wxDCBase::DrawEllipticArcRot(...) draws a rotated elliptic arc or an ellipse. +It uses wxDCBase::CalculateEllipticPoints(...) and wxDCBase::Rotate(...), +which are also new. + +All methods are generic, so they can be implemented in wxDCBase. +DoDrawEllipticArcRot(...) is virtual, so it can be called from deeper +methods like (WinCE) wxDC::DoDrawArc(...). + +CalculateEllipticPoints(...) fills a given list of wxPoints with some points +of an elliptic arc. The algorithm is pixel-based: In every row (in flat +parts) or every column (in steep parts) only one pixel is calculated. +Trigonometric calculation (sin, cos, tan, atan) is only done if the +starting angle is not equal to the ending angle. The calculation of the +pixels is done using simple arithmetic only and should perform not too +bad even on devices without floating point processor. I didn't test this yet. + +Rotate(...) rotates a list of point pixel-based, you will see rounding errors. +For instance: an ellipse rotated 180 degrees is drawn +slightly different from the original. + +The points are then moved to an array and used to draw a polyline and/or polygon +(with center added, the pie). +The result looks quite similar to the native ellipse, only e few pixels differ. + +The performance on a desktop system (Athlon 1800, WinXP) is about 7 times +slower as DrawEllipse(...), which calls the native API. +An rotated ellipse outside the clipping region takes nearly the same time, +while an native ellipse outside takes nearly no time to draw. + +If you draw an arc with this new method, you will see the starting and ending angles +are calculated properly. +If you use DrawEllipticArc(...), you will see they are only correct for circles +and not properly calculated for ellipses. + +Peter Lenhard +p.lenhard@t-online.de +*/ + +#ifdef __WXWINCE__ +void wxDCBase::DoDrawEllipticArcRot( wxCoord x, wxCoord y, + wxCoord w, wxCoord h, + double sa, double ea, double angle ) +{ + wxList list; + + CalculateEllipticPoints( &list, x, y, w, h, sa, ea ); + Rotate( &list, angle, wxPoint( x+w/2, y+h/2 ) ); + + // Add center (for polygon/pie) + list.Append( (wxObject*) new wxPoint( x+w/2, y+h/2 ) ); + + // copy list into array and delete list elements + int n = list.GetCount(); + wxPoint *points = new wxPoint[n]; + int i = 0; + wxNode* node = 0; + for ( node = list.GetFirst(); node; node = node->GetNext(), i++ ) + { + wxPoint *point = (wxPoint *)node->GetData(); + points[i].x = point->x; + points[i].y = point->y; + delete point; + } + + // first draw the pie without pen, if necessary + if( GetBrush() != *wxTRANSPARENT_BRUSH ) + { + wxPen tempPen( GetPen() ); + SetPen( *wxTRANSPARENT_PEN ); + DoDrawPolygon( n, points, 0, 0 ); + SetPen( tempPen ); + } + + // then draw the arc without brush, if necessary + if( GetPen() != *wxTRANSPARENT_PEN ) + { + // without center + DoDrawLines( n-1, points, 0, 0 ); + } + + delete [] points; + +} // DrawEllipticArcRot + +void wxDCBase::Rotate( wxList* points, double angle, wxPoint center ) +{ + if( angle != 0.0 ) + { + double pi(M_PI); + double dSinA = -sin(angle*2.0*pi/360.0); + double dCosA = cos(angle*2.0*pi/360.0); + for ( wxNode* node = points->GetFirst(); node; node = node->GetNext() ) + { + wxPoint* point = (wxPoint*)node->GetData(); + + // transform coordinates, if necessary + if( center.x ) point->x -= center.x; + if( center.y ) point->y -= center.y; + + // calculate rotation, rounding simply by implicit cast to integer + int xTemp = point->x * dCosA - point->y * dSinA; + point->y = point->x * dSinA + point->y * dCosA; + point->x = xTemp; + + // back transform coordinates, if necessary + if( center.x ) point->x += center.x; + if( center.y ) point->y += center.y; + } + } +} + +void wxDCBase::CalculateEllipticPoints( wxList* points, + wxCoord xStart, wxCoord yStart, + wxCoord w, wxCoord h, + double sa, double ea ) +{ + double pi = M_PI; + double sar = 0; + double ear = 0; + int xsa = 0; + int ysa = 0; + int xea = 0; + int yea = 0; + int sq = 0; + int eq = 0; + bool bUseAngles = false; + if( w<0 ) w = -w; + if( h<0 ) h = -h; + // half-axes + wxCoord a = w/2; + wxCoord b = h/2; + // decrement 1 pixel if ellipse is smaller than 2*a, 2*b + int decrX = 0; + if( 2*a == w ) decrX = 1; + int decrY = 0; + if( 2*b == h ) decrY = 1; + // center + wxCoord xCenter = xStart + a; + wxCoord yCenter = yStart + b; + // calculate data for start and end, if necessary + if( sa != ea ) + { + bUseAngles = true; + // normalisation of angles + while( sa<0 ) sa += 360; + while( ea<0 ) ea += 360; + while( sa>=360 ) sa -= 360; + while( ea>=360 ) ea -= 360; + // calculate quadrant numbers + if( sa > 270 ) sq = 3; + else if( sa > 180 ) sq = 2; + else if( sa > 90 ) sq = 1; + if( ea > 270 ) eq = 3; + else if( ea > 180 ) eq = 2; + else if( ea > 90 ) eq = 1; + sar = sa * pi / 180.0; + ear = ea * pi / 180.0; + // correct angle circle -> ellipse + sar = atan( -a/(double)b * tan( sar ) ); + if ( sq == 1 || sq == 2 ) sar += pi; + ear = atan( -a/(double)b * tan( ear ) ); + if ( eq == 1 || eq == 2 ) ear += pi; + // coordinates of points + xsa = xCenter + a * cos( sar ); + if( sq == 0 || sq == 3 ) xsa -= decrX; + ysa = yCenter + b * sin( sar ); + if( sq == 2 || sq == 3 ) ysa -= decrY; + xea = xCenter + a * cos( ear ); + if( eq == 0 || eq == 3 ) xea -= decrX; + yea = yCenter + b * sin( ear ); + if( eq == 2 || eq == 3 ) yea -= decrY; + } // if iUseAngles + // calculate c1 = b^2, c2 = b^2/a^2 with a = w/2, b = h/2 + double c1 = b * b; + double c2 = 2.0 / w; + c2 *= c2; + c2 *= c1; + wxCoord x = 0; + wxCoord y = b; + long x2 = 1; + long y2 = y*y; + long y2_old = 0; + long y_old = 0; + // Lists for quadrant 1 to 4 + wxList pointsarray[4]; + // Calculate points for first quadrant and set in all quadrants + for( x = 0; x <= a; ++x ) + { + x2 = x2+x+x-1; + y2_old = y2; + y_old = y; + bool bNewPoint = false; + while( y2 > c1 - c2 * x2 && y > 0 ) + { + bNewPoint = true; + y2 = y2-y-y+1; + --y; + } + // old y now to big: set point with old y, old x + if( bNewPoint && x>1) + { + int x1 = x - 1; + // remove points on the same line + pointsarray[0].Insert( (wxObject*) new wxPoint( xCenter + x1 - decrX, yCenter - y_old ) ); + pointsarray[1].Append( (wxObject*) new wxPoint( xCenter - x1, yCenter - y_old ) ); + pointsarray[2].Insert( (wxObject*) new wxPoint( xCenter - x1, yCenter + y_old - decrY ) ); + pointsarray[3].Append( (wxObject*) new wxPoint( xCenter + x1 - decrX, yCenter + y_old - decrY ) ); + } // set point + } // calculate point + + // Starting and/or ending points for the quadrants, first quadrant gets both. + pointsarray[0].Insert( (wxObject*) new wxPoint( xCenter + a - decrX, yCenter ) ); + pointsarray[0].Append( (wxObject*) new wxPoint( xCenter, yCenter - b ) ); + pointsarray[1].Append( (wxObject*) new wxPoint( xCenter - a, yCenter ) ); + pointsarray[2].Append( (wxObject*) new wxPoint( xCenter, yCenter + b - decrY ) ); + pointsarray[3].Append( (wxObject*) new wxPoint( xCenter + a - decrX, yCenter ) ); + + // copy quadrants in original list + if( bUseAngles ) + { + // Copy the right part of the points in the lists + // and delete the wxPoints, because they do not leave this method. + points->Append( (wxObject*) new wxPoint( xsa, ysa ) ); + int q = sq; + bool bStarted = false; + bool bReady = false; + bool bForceTurn = ( sq == eq && sa > ea ); + while( !bReady ) + { + for( wxNode *node = pointsarray[q].GetFirst(); node; node = node->GetNext() ) + { + // once: go to starting point in start quadrant + if( !bStarted && + ( + ( (wxPoint*) node->GetData() )->x < xsa+1 && q <= 1 + || + ( (wxPoint*) node->GetData() )->x > xsa-1 && q >= 2 + ) + ) + { + bStarted = true; + } + + // copy point, if not at ending point + if( bStarted ) + { + if( q != eq || bForceTurn + || + ( (wxPoint*) node->GetData() )->x > xea+1 && q <= 1 + || + ( (wxPoint*) node->GetData() )->x < xea-1 && q >= 2 + ) + { + // copy point + wxPoint* pPoint = new wxPoint( *((wxPoint*) node->GetData() ) ); + points->Append( (wxObject*) pPoint ); + } + else if( q == eq && !bForceTurn || ( (wxPoint*) node->GetData() )->x == xea) + { + bReady = true; + } + } + } // for node + ++q; + if( q > 3 ) q = 0; + bForceTurn = false; + bStarted = true; + } // while not bReady + points->Append( (wxObject*) new wxPoint( xea, yea ) ); + + // delete points + for( q = 0; q < 4; ++q ) + { + for( wxNode *node = pointsarray[q].GetFirst(); node; node = node->GetNext() ) + { + wxPoint *p = (wxPoint *)node->GetData(); + delete p; + } + } + } + else + { + wxNode* node; + // copy whole ellipse, wxPoints will be deleted outside + for( node = pointsarray[0].GetFirst(); node; node = node->GetNext() ) + { + wxObject *p = node->GetData(); + points->Append( p ); + } + for( node = pointsarray[1].GetFirst(); node; node = node->GetNext() ) + { + wxObject *p = node->GetData(); + points->Append( p ); + } + for( node = pointsarray[2].GetFirst(); node; node = node->GetNext() ) + { + wxObject *p = node->GetData(); + points->Append( p ); + } + for( node = pointsarray[3].GetFirst(); node; node = node->GetNext() ) + { + wxObject *p = node->GetData(); + points->Append( p ); + } + } // not iUseAngles +} // CalculateEllipticPoints + +#endif diff --git a/Externals/wxWidgets/src/common/dcbufcmn.cpp b/Externals/wxWidgets/src/common/dcbufcmn.cpp new file mode 100644 index 0000000000..eb232be5cf --- /dev/null +++ b/Externals/wxWidgets/src/common/dcbufcmn.cpp @@ -0,0 +1,87 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/dcbufcmn.cpp +// Purpose: Buffered DC implementation +// Author: Ron Lee, Jaakko Salli +// Modified by: +// Created: Sep-20-2006 +// RCS-ID: $Id: dcbufcmn.cpp 42885 2006-11-01 02:10:47Z RD $ +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#include "wx/dcbuffer.h" + +#ifndef WX_PRECOMP + #include "wx/module.h" +#endif + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxSharedDCBufferManager: helper class maintaining backing store bitmap +// ---------------------------------------------------------------------------- + +class wxSharedDCBufferManager : public wxModule +{ +public: + wxSharedDCBufferManager() { } + + virtual bool OnInit() { return true; } + virtual void OnExit() { wxDELETE(ms_buffer); } + + static wxBitmap* GetBuffer(int w, int h) + { + if ( !ms_buffer || + w > ms_buffer->GetWidth() || + h > ms_buffer->GetHeight() ) + { + delete ms_buffer; + ms_buffer = new wxBitmap(w, h); + } + return ms_buffer; + } + +private: + static wxBitmap *ms_buffer; + + DECLARE_DYNAMIC_CLASS(wxSharedDCBufferManager) +}; + +wxBitmap* wxSharedDCBufferManager::ms_buffer = NULL; + +IMPLEMENT_DYNAMIC_CLASS(wxSharedDCBufferManager, wxModule) + +// ============================================================================ +// wxBufferedDC +// ============================================================================ + +void wxBufferedDC::UseBuffer(wxCoord w, wxCoord h) +{ + if ( !m_buffer || !m_buffer->IsOk() ) + { + if ( w == -1 || h == -1 ) + m_dc->GetSize(&w, &h); + + m_buffer = wxSharedDCBufferManager::GetBuffer(w, h); + } + + SelectObject(*m_buffer); +} + diff --git a/Externals/wxWidgets/src/common/dcgraph.cpp b/Externals/wxWidgets/src/common/dcgraph.cpp new file mode 100644 index 0000000000..1572d70264 --- /dev/null +++ b/Externals/wxWidgets/src/common/dcgraph.cpp @@ -0,0 +1,1028 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/graphcmn.cpp +// Purpose: graphics context methods common to all platforms +// Author: Stefan Csomor +// Modified by: +// Created: +// RCS-ID: $Id: dcgraph.cpp 49369 2007-10-23 21:30:28Z RD $ +// Copyright: (c) Stefan Csomor +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#if defined(__BORLANDC__) + #pragma hdrstop +#endif + +#if wxUSE_GRAPHICS_CONTEXT + +#include "wx/graphics.h" + +#ifndef WX_PRECOMP + #include "wx/icon.h" + #include "wx/bitmap.h" + #include "wx/dcmemory.h" + #include "wx/region.h" +#endif + +#ifdef __WXMAC__ +#include "wx/mac/private.h" +#endif +//----------------------------------------------------------------------------- +// constants +//----------------------------------------------------------------------------- + +static const double RAD2DEG = 180.0 / M_PI; + +//----------------------------------------------------------------------------- +// Local functions +//----------------------------------------------------------------------------- + +static inline double DegToRad(double deg) +{ + return (deg * M_PI) / 180.0; +} + +//----------------------------------------------------------------------------- +// wxDC bridge class +//----------------------------------------------------------------------------- + +#ifdef __WXMAC__ +IMPLEMENT_DYNAMIC_CLASS(wxGCDC, wxDCBase) +#else +IMPLEMENT_DYNAMIC_CLASS(wxGCDC, wxDC) +#endif + +wxGCDC::wxGCDC() +{ + Init(); +} + +void wxGCDC::SetGraphicsContext( wxGraphicsContext* ctx ) +{ + delete m_graphicContext; + m_graphicContext = ctx; + if ( m_graphicContext ) + { + m_matrixOriginal = m_graphicContext->GetTransform(); + m_ok = true; + // apply the stored transformations to the passed in context + ComputeScaleAndOrigin(); + m_graphicContext->SetFont( m_font , m_textForegroundColour ); + m_graphicContext->SetPen( m_pen ); + m_graphicContext->SetBrush( m_brush); + } +} + +wxGCDC::wxGCDC(const wxWindowDC& dc) +{ + Init(); + SetGraphicsContext( wxGraphicsContext::Create(dc) ); +} + +#ifdef __WXMSW__ +wxGCDC::wxGCDC(const wxMemoryDC& dc) +{ + Init(); + SetGraphicsContext( wxGraphicsContext::Create(dc) ); +} +#endif + +void wxGCDC::Init() +{ + m_ok = false; + m_colour = true; + m_mm_to_pix_x = mm2pt; + m_mm_to_pix_y = mm2pt; + + m_pen = *wxBLACK_PEN; + m_font = *wxNORMAL_FONT; + m_brush = *wxWHITE_BRUSH; + + m_graphicContext = NULL; + m_logicalFunctionSupported = true; +} + + +wxGCDC::~wxGCDC() +{ + delete m_graphicContext; +} + +void wxGCDC::DoDrawBitmap( const wxBitmap &bmp, wxCoord x, wxCoord y, bool WXUNUSED(useMask) ) +{ + wxCHECK_RET( Ok(), wxT("wxGCDC(cg)::DoDrawBitmap - invalid DC") ); + wxCHECK_RET( bmp.Ok(), wxT("wxGCDC(cg)::DoDrawBitmap - invalid bitmap") ); + + if ( bmp.GetDepth() == 1 ) + { + m_graphicContext->SetPen(*wxTRANSPARENT_PEN); + m_graphicContext->SetBrush( wxBrush( m_textBackgroundColour , wxSOLID ) ); + m_graphicContext->DrawRectangle( x , y , bmp.GetWidth() , bmp.GetHeight() ); + m_graphicContext->SetBrush( wxBrush( m_textForegroundColour , wxSOLID ) ); + m_graphicContext->DrawBitmap( bmp, x , y , bmp.GetWidth() , bmp.GetHeight() ); + m_graphicContext->SetBrush( m_graphicContext->CreateBrush(m_brush)); + m_graphicContext->SetPen( m_graphicContext->CreatePen(m_pen)); + } + else + m_graphicContext->DrawBitmap( bmp, x , y , bmp.GetWidth() , bmp.GetHeight() ); +} + +void wxGCDC::DoDrawIcon( const wxIcon &icon, wxCoord x, wxCoord y ) +{ + wxCHECK_RET( Ok(), wxT("wxGCDC(cg)::DoDrawIcon - invalid DC") ); + wxCHECK_RET( icon.Ok(), wxT("wxGCDC(cg)::DoDrawIcon - invalid icon") ); + + wxCoord w = icon.GetWidth(); + wxCoord h = icon.GetHeight(); + + m_graphicContext->DrawIcon( icon , x, y, w, h ); +} + +bool wxGCDC::StartDoc( const wxString& WXUNUSED(message) ) +{ + return false; +} + +void wxGCDC::EndDoc() +{ +} + +void wxGCDC::StartPage() +{ +} + +void wxGCDC::EndPage() +{ +} + +void wxGCDC::Flush() +{ +#ifdef __WXMAC__ + CGContextFlush( (CGContextRef) m_graphicContext->GetNativeContext() ); +#endif +} + +void wxGCDC::DoSetClippingRegion( wxCoord x, wxCoord y, wxCoord w, wxCoord h ) +{ + wxCHECK_RET( Ok(), wxT("wxGCDC(cg)::DoSetClippingRegion - invalid DC") ); + + m_graphicContext->Clip( x, y, w, h ); + if ( m_clipping ) + { + m_clipX1 = wxMax( m_clipX1, x ); + m_clipY1 = wxMax( m_clipY1, y ); + m_clipX2 = wxMin( m_clipX2, (x + w) ); + m_clipY2 = wxMin( m_clipY2, (y + h) ); + } + else + { + m_clipping = true; + + m_clipX1 = x; + m_clipY1 = y; + m_clipX2 = x + w; + m_clipY2 = y + h; + } +} + +void wxGCDC::DoSetClippingRegionAsRegion( const wxRegion ®ion ) +{ + // region is in device coordinates + wxCHECK_RET( Ok(), wxT("wxGCDC(cg)::DoSetClippingRegionAsRegion - invalid DC") ); + + if (region.Empty()) + { + //DestroyClippingRegion(); + return; + } + + wxRegion logRegion( region ); + wxCoord x, y, w, h; + + logRegion.Offset( DeviceToLogicalX(0), DeviceToLogicalY(0) ); + logRegion.GetBox( x, y, w, h ); + + m_graphicContext->Clip( logRegion ); + if ( m_clipping ) + { + m_clipX1 = wxMax( m_clipX1, x ); + m_clipY1 = wxMax( m_clipY1, y ); + m_clipX2 = wxMin( m_clipX2, (x + w) ); + m_clipY2 = wxMin( m_clipY2, (y + h) ); + } + else + { + m_clipping = true; + + m_clipX1 = x; + m_clipY1 = y; + m_clipX2 = x + w; + m_clipY2 = y + h; + } +} + +void wxGCDC::DestroyClippingRegion() +{ + m_graphicContext->ResetClip(); + // currently the clip eg of a window extends to the area between the scrollbars + // so we must explicitely make sure it only covers the area we want it to draw + int width, height ; + GetSize( &width , &height ) ; + m_graphicContext->Clip( DeviceToLogicalX(0) , DeviceToLogicalY(0) , DeviceToLogicalXRel(width), DeviceToLogicalYRel(height) ); + + m_graphicContext->SetPen( m_pen ); + m_graphicContext->SetBrush( m_brush ); + + m_clipping = false; +} + +void wxGCDC::DoGetSizeMM( int* width, int* height ) const +{ + int w = 0, h = 0; + + GetSize( &w, &h ); + if (width) + *width = long( double(w) / (m_scaleX * m_mm_to_pix_x) ); + if (height) + *height = long( double(h) / (m_scaleY * m_mm_to_pix_y) ); +} + +void wxGCDC::SetTextForeground( const wxColour &col ) +{ + wxCHECK_RET( Ok(), wxT("wxGCDC(cg)::SetTextForeground - invalid DC") ); + + if ( col != m_textForegroundColour ) + { + m_textForegroundColour = col; + m_graphicContext->SetFont( m_font, m_textForegroundColour ); + } +} + +void wxGCDC::SetTextBackground( const wxColour &col ) +{ + wxCHECK_RET( Ok(), wxT("wxGCDC(cg)::SetTextBackground - invalid DC") ); + + m_textBackgroundColour = col; +} + +void wxGCDC::SetMapMode( int mode ) +{ + switch (mode) + { + case wxMM_TWIPS: + SetLogicalScale( twips2mm * m_mm_to_pix_x, twips2mm * m_mm_to_pix_y ); + break; + + case wxMM_POINTS: + SetLogicalScale( pt2mm * m_mm_to_pix_x, pt2mm * m_mm_to_pix_y ); + break; + + case wxMM_METRIC: + SetLogicalScale( m_mm_to_pix_x, m_mm_to_pix_y ); + break; + + case wxMM_LOMETRIC: + SetLogicalScale( m_mm_to_pix_x / 10.0, m_mm_to_pix_y / 10.0 ); + break; + + case wxMM_TEXT: + default: + SetLogicalScale( 1.0, 1.0 ); + break; + } + + ComputeScaleAndOrigin(); +} + +void wxGCDC::SetUserScale( double x, double y ) +{ + // allow negative ? -> no + + m_userScaleX = x; + m_userScaleY = y; + ComputeScaleAndOrigin(); +} + +void wxGCDC::SetLogicalScale( double x, double y ) +{ + // allow negative ? + m_logicalScaleX = x; + m_logicalScaleY = y; + ComputeScaleAndOrigin(); +} + +void wxGCDC::SetLogicalOrigin( wxCoord x, wxCoord y ) +{ + m_logicalOriginX = x * m_signX; // is this still correct ? + m_logicalOriginY = y * m_signY; + ComputeScaleAndOrigin(); +} + +void wxGCDC::SetDeviceOrigin( wxCoord x, wxCoord y ) +{ + m_deviceOriginX = x; + m_deviceOriginY = y; + ComputeScaleAndOrigin(); +} + +void wxGCDC::SetAxisOrientation( bool xLeftRight, bool yBottomUp ) +{ + m_signX = (xLeftRight ? 1 : -1); + m_signY = (yBottomUp ? -1 : 1); + ComputeScaleAndOrigin(); +} + +wxSize wxGCDC::GetPPI() const +{ + return wxSize(72, 72); +} + +int wxGCDC::GetDepth() const +{ + return 32; +} + +void wxGCDC::ComputeScaleAndOrigin() +{ + m_scaleX = m_logicalScaleX * m_userScaleX; + m_scaleY = m_logicalScaleY * m_userScaleY; + + if ( m_graphicContext ) + { + m_matrixCurrent = m_graphicContext->CreateMatrix(); + m_matrixCurrent.Translate( m_deviceOriginX, m_deviceOriginY ); + m_matrixCurrent.Scale( m_scaleX, m_scaleY ); + // the logical origin sets the origin to have new coordinates + m_matrixCurrent.Translate( -m_logicalOriginX, -m_logicalOriginY ); + + m_graphicContext->SetTransform( m_matrixOriginal ); + m_graphicContext->ConcatTransform( m_matrixCurrent ); + } +} + +void wxGCDC::SetPalette( const wxPalette& WXUNUSED(palette) ) +{ + +} + +void wxGCDC::SetBackgroundMode( int mode ) +{ + m_backgroundMode = mode; +} + +void wxGCDC::SetFont( const wxFont &font ) +{ + m_font = font; + if ( m_graphicContext ) + { + wxFont f = font; + if ( f.Ok() ) + f.SetPointSize( /*LogicalToDeviceYRel*/(font.GetPointSize())); + m_graphicContext->SetFont( f, m_textForegroundColour ); + } +} + +void wxGCDC::SetPen( const wxPen &pen ) +{ + if ( m_pen == pen ) + return; + + m_pen = pen; + if ( m_graphicContext ) + { + m_graphicContext->SetPen( m_pen ); + } +} + +void wxGCDC::SetBrush( const wxBrush &brush ) +{ + if (m_brush == brush) + return; + + m_brush = brush; + if ( m_graphicContext ) + { + m_graphicContext->SetBrush( m_brush ); + } +} + +void wxGCDC::SetBackground( const wxBrush &brush ) +{ + if (m_backgroundBrush == brush) + return; + + m_backgroundBrush = brush; + if (!m_backgroundBrush.Ok()) + return; +} + +void wxGCDC::SetLogicalFunction( int function ) +{ + if (m_logicalFunction == function) + return; + + m_logicalFunction = function; + if ( m_graphicContext->SetLogicalFunction( function ) ) + m_logicalFunctionSupported=true; + else + m_logicalFunctionSupported=false; +} + +bool wxGCDC::DoFloodFill(wxCoord WXUNUSED(x), wxCoord WXUNUSED(y), + const wxColour& WXUNUSED(col), int WXUNUSED(style)) +{ + return false; +} + +bool wxGCDC::DoGetPixel( wxCoord WXUNUSED(x), wxCoord WXUNUSED(y), wxColour *WXUNUSED(col) ) const +{ + // wxCHECK_MSG( 0 , false, wxT("wxGCDC(cg)::DoGetPixel - not implemented") ); + return false; +} + +void wxGCDC::DoDrawLine( wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2 ) +{ + wxCHECK_RET( Ok(), wxT("wxGCDC(cg)::DoDrawLine - invalid DC") ); + + if ( !m_logicalFunctionSupported ) + return; + + m_graphicContext->StrokeLine(x1,y1,x2,y2); + + CalcBoundingBox(x1, y1); + CalcBoundingBox(x2, y2); +} + +void wxGCDC::DoCrossHair( wxCoord x, wxCoord y ) +{ + wxCHECK_RET( Ok(), wxT("wxGCDC(cg)::DoCrossHair - invalid DC") ); + + if ( !m_logicalFunctionSupported ) + return; + + int w = 0, h = 0; + + GetSize( &w, &h ); + + m_graphicContext->StrokeLine(0,y,w,y); + m_graphicContext->StrokeLine(x,0,x,h); + + CalcBoundingBox(0, 0); + CalcBoundingBox(0+w, 0+h); +} + +void wxGCDC::DoDrawArc( wxCoord x1, wxCoord y1, + wxCoord x2, wxCoord y2, + wxCoord xc, wxCoord yc ) +{ + wxCHECK_RET( Ok(), wxT("wxGCDC(cg)::DoDrawArc - invalid DC") ); + + if ( !m_logicalFunctionSupported ) + return; + + double dx = x1 - xc; + double dy = y1 - yc; + double radius = sqrt((double)(dx * dx + dy * dy)); + wxCoord rad = (wxCoord)radius; + double sa, ea; + if (x1 == x2 && y1 == y2) + { + sa = 0.0; + ea = 360.0; + } + else if (radius == 0.0) + { + sa = ea = 0.0; + } + else + { + sa = (x1 - xc == 0) ? + (y1 - yc < 0) ? 90.0 : -90.0 : + -atan2(double(y1 - yc), double(x1 - xc)) * RAD2DEG; + ea = (x2 - xc == 0) ? + (y2 - yc < 0) ? 90.0 : -90.0 : + -atan2(double(y2 - yc), double(x2 - xc)) * RAD2DEG; + } + + bool fill = m_brush.GetStyle() != wxTRANSPARENT; + + wxGraphicsPath path = m_graphicContext->CreatePath(); + if ( fill && ((x1!=x2)||(y1!=y2)) ) + path.MoveToPoint( xc, yc ); + // since these angles (ea,sa) are measured counter-clockwise, we invert them to + // get clockwise angles + path.AddArc( xc, yc , rad , DegToRad(-sa) , DegToRad(-ea), false ); + if ( fill && ((x1!=x2)||(y1!=y2)) ) + path.AddLineToPoint( xc, yc ); + m_graphicContext->DrawPath(path); +} + +void wxGCDC::DoDrawEllipticArc( wxCoord x, wxCoord y, wxCoord w, wxCoord h, + double sa, double ea ) +{ + wxCHECK_RET( Ok(), wxT("wxGCDC(cg)::DoDrawEllipticArc - invalid DC") ); + + if ( !m_logicalFunctionSupported ) + return; + + m_graphicContext->PushState(); + m_graphicContext->Translate(x+w/2.0,y+h/2.0); + wxDouble factor = ((wxDouble) w) / h; + m_graphicContext->Scale( factor , 1.0); + + // since these angles (ea,sa) are measured counter-clockwise, we invert them to + // get clockwise angles + if ( m_brush.GetStyle() != wxTRANSPARENT ) + { + wxGraphicsPath path = m_graphicContext->CreatePath(); + path.MoveToPoint( 0, 0 ); + path.AddLineToPoint( h / 2.0 * cos(DegToRad(sa)) , h / 2.0 * sin(DegToRad(-sa)) ); + path.AddLineToPoint( h / 2.0 * cos(DegToRad(ea)) , h / 2.0 * sin(DegToRad(-ea)) ); + path.AddLineToPoint( 0, 0 ); + m_graphicContext->FillPath( path ); + + path = m_graphicContext->CreatePath(); + path.AddArc( 0, 0, h/2.0 , DegToRad(-sa) , DegToRad(-ea), sa > ea ); + m_graphicContext->FillPath( path ); + m_graphicContext->StrokePath( path ); + } + else + { + wxGraphicsPath path = m_graphicContext->CreatePath(); + path.AddArc( 0, 0, h/2.0 , DegToRad(-sa) , DegToRad(-ea), sa > ea ); + m_graphicContext->DrawPath( path ); + } + + m_graphicContext->PopState(); +} + +void wxGCDC::DoDrawPoint( wxCoord x, wxCoord y ) +{ + wxCHECK_RET( Ok(), wxT("wxGCDC(cg)::DoDrawPoint - invalid DC") ); + + DoDrawLine( x , y , x + 1 , y + 1 ); +} + +void wxGCDC::DoDrawLines(int n, wxPoint points[], + wxCoord xoffset, wxCoord yoffset) +{ + wxCHECK_RET( Ok(), wxT("wxGCDC(cg)::DoDrawLines - invalid DC") ); + + if ( !m_logicalFunctionSupported ) + return; + + wxPoint2DDouble* pointsD = new wxPoint2DDouble[n]; + for( int i = 0; i < n; ++i) + { + pointsD[i].m_x = points[i].x + xoffset; + pointsD[i].m_y = points[i].y + yoffset; + } + + m_graphicContext->StrokeLines( n , pointsD); + delete[] pointsD; +} + +#if wxUSE_SPLINES +void wxGCDC::DoDrawSpline(wxList *points) +{ + wxCHECK_RET( Ok(), wxT("wxGCDC(cg)::DoDrawSpline - invalid DC") ); + + if ( !m_logicalFunctionSupported ) + return; + + wxGraphicsPath path = m_graphicContext->CreatePath(); + + wxList::compatibility_iterator node = points->GetFirst(); + if (node == wxList::compatibility_iterator()) + // empty list + return; + + wxPoint *p = (wxPoint *)node->GetData(); + + wxCoord x1 = p->x; + wxCoord y1 = p->y; + + node = node->GetNext(); + p = (wxPoint *)node->GetData(); + + wxCoord x2 = p->x; + wxCoord y2 = p->y; + wxCoord cx1 = ( x1 + x2 ) / 2; + wxCoord cy1 = ( y1 + y2 ) / 2; + + path.MoveToPoint( x1 , y1 ); + path.AddLineToPoint( cx1 , cy1 ); +#if !wxUSE_STL + + while ((node = node->GetNext()) != NULL) +#else + + while ((node = node->GetNext())) +#endif // !wxUSE_STL + + { + p = (wxPoint *)node->GetData(); + x1 = x2; + y1 = y2; + x2 = p->x; + y2 = p->y; + wxCoord cx4 = (x1 + x2) / 2; + wxCoord cy4 = (y1 + y2) / 2; + + path.AddQuadCurveToPoint(x1 , y1 ,cx4 , cy4 ); + + cx1 = cx4; + cy1 = cy4; + } + + path.AddLineToPoint( x2 , y2 ); + + m_graphicContext->StrokePath( path ); +} +#endif // wxUSE_SPLINES + +void wxGCDC::DoDrawPolygon( int n, wxPoint points[], + wxCoord xoffset, wxCoord yoffset, + int fillStyle ) +{ + wxCHECK_RET( Ok(), wxT("wxGCDC(cg)::DoDrawPolygon - invalid DC") ); + + if ( n <= 0 || (m_brush.GetStyle() == wxTRANSPARENT && m_pen.GetStyle() == wxTRANSPARENT ) ) + return; + if ( !m_logicalFunctionSupported ) + return; + + bool closeIt = false; + if (points[n-1] != points[0]) + closeIt = true; + + wxPoint2DDouble* pointsD = new wxPoint2DDouble[n+(closeIt?1:0)]; + for( int i = 0; i < n; ++i) + { + pointsD[i].m_x = points[i].x + xoffset; + pointsD[i].m_y = points[i].y + yoffset; + } + if ( closeIt ) + pointsD[n] = pointsD[0]; + + m_graphicContext->DrawLines( n+(closeIt?1:0) , pointsD, fillStyle); + delete[] pointsD; +} + +void wxGCDC::DoDrawPolyPolygon(int n, + int count[], + wxPoint points[], + wxCoord xoffset, + wxCoord yoffset, + int fillStyle) +{ + wxASSERT(n > 1); + wxGraphicsPath path = m_graphicContext->CreatePath(); + + int i = 0; + for ( int j = 0; j < n; ++j) + { + wxPoint start = points[i]; + path.MoveToPoint( start.x+ xoffset, start.y+ yoffset); + ++i; + int l = count[j]; + for ( int k = 1; k < l; ++k) + { + path.AddLineToPoint( points[i].x+ xoffset, points[i].y+ yoffset); + ++i; + } + // close the polygon + if ( start != points[i-1]) + path.AddLineToPoint( start.x+ xoffset, start.y+ yoffset); + } + m_graphicContext->DrawPath( path , fillStyle); +} + +void wxGCDC::DoDrawRectangle(wxCoord x, wxCoord y, wxCoord w, wxCoord h) +{ + wxCHECK_RET( Ok(), wxT("wxGCDC(cg)::DoDrawRectangle - invalid DC") ); + + if ( !m_logicalFunctionSupported ) + return; + + // CMB: draw nothing if transformed w or h is 0 + if (w == 0 || h == 0) + return; + + if ( m_graphicContext->ShouldOffset() ) + { + // if we are offsetting the entire rectangle is moved 0.5, so the + // border line gets off by 1 + w -= 1; + h -= 1; + } + m_graphicContext->DrawRectangle(x,y,w,h); +} + +void wxGCDC::DoDrawRoundedRectangle(wxCoord x, wxCoord y, + wxCoord w, wxCoord h, + double radius) +{ + wxCHECK_RET( Ok(), wxT("wxGCDC(cg)::DoDrawRoundedRectangle - invalid DC") ); + + if ( !m_logicalFunctionSupported ) + return; + + if (radius < 0.0) + radius = - radius * ((w < h) ? w : h); + + // CMB: draw nothing if transformed w or h is 0 + if (w == 0 || h == 0) + return; + + if ( m_graphicContext->ShouldOffset() ) + { + // if we are offsetting the entire rectangle is moved 0.5, so the + // border line gets off by 1 + w -= 1; + h -= 1; + } + m_graphicContext->DrawRoundedRectangle( x,y,w,h,radius); +} + +void wxGCDC::DoDrawEllipse(wxCoord x, wxCoord y, wxCoord w, wxCoord h) +{ + wxCHECK_RET( Ok(), wxT("wxGCDC(cg)::DoDrawEllipse - invalid DC") ); + + if ( !m_logicalFunctionSupported ) + return; + + if ( m_graphicContext->ShouldOffset() ) + { + // if we are offsetting the entire rectangle is moved 0.5, so the + // border line gets off by 1 + w -= 1; + h -= 1; + } + m_graphicContext->DrawEllipse(x,y,w,h); +} + +bool wxGCDC::CanDrawBitmap() const +{ + return true; +} + +bool wxGCDC::DoBlit( + wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height, + wxDC *source, wxCoord xsrc, wxCoord ysrc, int logical_func , bool WXUNUSED(useMask), + wxCoord xsrcMask, wxCoord ysrcMask ) +{ + wxCHECK_MSG( Ok(), false, wxT("wxGCDC(cg)::DoBlit - invalid DC") ); + wxCHECK_MSG( source->Ok(), false, wxT("wxGCDC(cg)::DoBlit - invalid source DC") ); + + if ( logical_func == wxNO_OP ) + return true; + else if ( !m_graphicContext->SetLogicalFunction( logical_func ) ) + + { + wxFAIL_MSG( wxT("Logical function is not supported by the graphics context.") ); + return false; + } + + if (xsrcMask == -1 && ysrcMask == -1) + { + xsrcMask = xsrc; + ysrcMask = ysrc; + } + + wxRect subrect(source->LogicalToDeviceX(xsrc), + source->LogicalToDeviceY(ysrc), + source->LogicalToDeviceXRel(width), + source->LogicalToDeviceYRel(height)); + + // if needed clip the subrect down to the size of the source DC + wxCoord sw, sh; + source->GetSize(&sw, &sh); + sw = source->LogicalToDeviceXRel(sw); + sh = source->LogicalToDeviceYRel(sh); + if (subrect.x + subrect.width > sw) + subrect.width = sw - subrect.x; + if (subrect.y + subrect.height > sh) + subrect.height = sh - subrect.y; + + wxBitmap blit = source->GetAsBitmap( &subrect ); + + if ( blit.Ok() ) + { + m_graphicContext->DrawBitmap( blit, xdest, ydest, + wxMin(width, blit.GetWidth()), + wxMin(height, blit.GetHeight())); + } + else + { + wxFAIL_MSG( wxT("Cannot Blit. Unable to get contents of DC as bitmap.") ); + return false; + } + + // reset logical function + m_graphicContext->SetLogicalFunction( m_logicalFunction ); + + return true; +} + +void wxGCDC::DoDrawRotatedText(const wxString& str, wxCoord x, wxCoord y, + double angle) +{ + wxCHECK_RET( Ok(), wxT("wxGCDC(cg)::DoDrawRotatedText - invalid DC") ); + + if ( str.length() == 0 ) + return; + if ( !m_logicalFunctionSupported ) + return; + + if ( m_backgroundMode == wxTRANSPARENT ) + m_graphicContext->DrawText( str, x ,y , DegToRad(angle )); + else + m_graphicContext->DrawText( str, x ,y , DegToRad(angle ), m_graphicContext->CreateBrush( wxBrush(m_textBackgroundColour,wxSOLID) ) ); +} + +void wxGCDC::DoDrawText(const wxString& str, wxCoord x, wxCoord y) +{ + wxCHECK_RET( Ok(), wxT("wxGCDC(cg)::DoDrawRotatedText - invalid DC") ); + + if ( str.length() == 0 ) + return; + + if ( !m_logicalFunctionSupported ) + return; + + if ( m_backgroundMode == wxTRANSPARENT ) + m_graphicContext->DrawText( str, x ,y); + else + m_graphicContext->DrawText( str, x ,y , m_graphicContext->CreateBrush( wxBrush(m_textBackgroundColour,wxSOLID) ) ); +} + +bool wxGCDC::CanGetTextExtent() const +{ + wxCHECK_MSG( Ok(), false, wxT("wxGCDC(cg)::CanGetTextExtent - invalid DC") ); + + return true; +} + +void wxGCDC::DoGetTextExtent( const wxString &str, wxCoord *width, wxCoord *height, + wxCoord *descent, wxCoord *externalLeading , + wxFont *theFont ) const +{ + wxCHECK_RET( Ok(), wxT("wxGCDC(cg)::DoGetTextExtent - invalid DC") ); + + if ( theFont ) + { + m_graphicContext->SetFont( *theFont, m_textForegroundColour ); + } + + wxDouble h , d , e , w; + + m_graphicContext->GetTextExtent( str, &w, &h, &d, &e ); + + if ( height ) + *height = (wxCoord)(h+0.5); + if ( descent ) + *descent = (wxCoord)(d+0.5); + if ( externalLeading ) + *externalLeading = (wxCoord)(e+0.5); + if ( width ) + *width = (wxCoord)(w+0.5); + + if ( theFont ) + { + m_graphicContext->SetFont( m_font, m_textForegroundColour ); + } +} + +bool wxGCDC::DoGetPartialTextExtents(const wxString& text, wxArrayInt& widths) const +{ + wxCHECK_MSG( Ok(), false, wxT("wxGCDC(cg)::DoGetPartialTextExtents - invalid DC") ); + widths.Clear(); + widths.Add(0,text.Length()); + if ( text.IsEmpty() ) + return true; + + wxArrayDouble widthsD; + + m_graphicContext->GetPartialTextExtents( text, widthsD ); + for ( size_t i = 0; i < widths.GetCount(); ++i ) + widths[i] = (wxCoord)(widthsD[i] + 0.5); + + return true; +} + +wxCoord wxGCDC::GetCharWidth(void) const +{ + wxCoord width; + DoGetTextExtent( wxT("g") , &width , NULL , NULL , NULL , NULL ); + + return width; +} + +wxCoord wxGCDC::GetCharHeight(void) const +{ + wxCoord height; + DoGetTextExtent( wxT("g") , NULL , &height , NULL , NULL , NULL ); + + return height; +} + +void wxGCDC::Clear(void) +{ + wxCHECK_RET( Ok(), wxT("wxGCDC(cg)::Clear - invalid DC") ); + // TODO better implementation / incorporate size info into wxGCDC or context + m_graphicContext->SetBrush( m_backgroundBrush ); + wxPen p = *wxTRANSPARENT_PEN; + m_graphicContext->SetPen( p ); + DoDrawRectangle( 0, 0, 32000 , 32000 ); + m_graphicContext->SetPen( m_pen ); + m_graphicContext->SetBrush( m_brush ); +} + +void wxGCDC::DoGetSize(int *width, int *height) const +{ + *width = 10000; + *height = 10000; +} + +void wxGCDC::DoGradientFillLinear(const wxRect& rect, + const wxColour& initialColour, + const wxColour& destColour, + wxDirection nDirection ) +{ + wxPoint start; + wxPoint end; + switch( nDirection) + { + case wxWEST : + start = rect.GetRightBottom(); + start.x++; + end = rect.GetLeftBottom(); + break; + case wxEAST : + start = rect.GetLeftBottom(); + end = rect.GetRightBottom(); + end.x++; + break; + case wxNORTH : + start = rect.GetLeftBottom(); + start.y++; + end = rect.GetLeftTop(); + break; + case wxSOUTH : + start = rect.GetLeftTop(); + end = rect.GetLeftBottom(); + end.y++; + break; + default : + break; + } + + if (rect.width == 0 || rect.height == 0) + return; + + m_graphicContext->SetBrush( m_graphicContext->CreateLinearGradientBrush( + start.x,start.y,end.x,end.y, initialColour, destColour)); + m_graphicContext->SetPen(*wxTRANSPARENT_PEN); + m_graphicContext->DrawRectangle(rect.x,rect.y,rect.width,rect.height); + m_graphicContext->SetPen(m_pen); +} + +void wxGCDC::DoGradientFillConcentric(const wxRect& rect, + const wxColour& initialColour, + const wxColour& destColour, + const wxPoint& circleCenter) +{ + //Radius + wxInt32 cx = rect.GetWidth() / 2; + wxInt32 cy = rect.GetHeight() / 2; + wxInt32 nRadius; + if (cx < cy) + nRadius = cx; + else + nRadius = cy; + + // make sure the background is filled (todo move into specific platform implementation ?) + m_graphicContext->SetPen(*wxTRANSPARENT_PEN); + m_graphicContext->SetBrush( wxBrush( destColour) ); + m_graphicContext->DrawRectangle(rect.x,rect.y,rect.width,rect.height); + + m_graphicContext->SetBrush( m_graphicContext->CreateRadialGradientBrush( + rect.x+circleCenter.x,rect.y+circleCenter.y, + rect.x+circleCenter.x,rect.y+circleCenter.y, + nRadius,initialColour,destColour)); + + m_graphicContext->DrawRectangle(rect.x,rect.y,rect.width,rect.height); + m_graphicContext->SetPen(m_pen); +} + +void wxGCDC::DoDrawCheckMark(wxCoord x, wxCoord y, + wxCoord width, wxCoord height) +{ + wxDCBase::DoDrawCheckMark(x,y,width,height); +} + +#endif // wxUSE_GRAPHICS_CONTEXT diff --git a/Externals/wxWidgets/src/common/debugrpt.cpp b/Externals/wxWidgets/src/common/debugrpt.cpp new file mode 100644 index 0000000000..5c6093c9bc --- /dev/null +++ b/Externals/wxWidgets/src/common/debugrpt.cpp @@ -0,0 +1,698 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/common/debugrpt.cpp +// Purpose: wxDebugReport and related classes implementation +// Author: Vadim Zeitlin +// Modified by: +// Created: 2005-01-17 +// RCS-ID: $Id: debugrpt.cpp 42650 2006-10-29 19:53:53Z VZ $ +// Copyright: (c) 2005 Vadim Zeitlin +// License: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#ifndef WX_PRECOMP + #include "wx/app.h" + #include "wx/log.h" + #include "wx/intl.h" + #include "wx/utils.h" +#endif // WX_PRECOMP + +#if wxUSE_DEBUGREPORT && wxUSE_XML + +#include "wx/debugrpt.h" + +#include "wx/ffile.h" +#include "wx/filename.h" +#include "wx/dir.h" +#include "wx/dynlib.h" + +#include "wx/xml/xml.h" + +#if wxUSE_STACKWALKER + #include "wx/stackwalk.h" +#endif + +#if wxUSE_CRASHREPORT + #include "wx/msw/crashrpt.h" +#endif + +#if wxUSE_ZIPSTREAM + #include "wx/wfstream.h" + #include "wx/zipstrm.h" +#endif // wxUSE_ZIPSTREAM + +WX_CHECK_BUILD_OPTIONS("wxQA") + +// ---------------------------------------------------------------------------- +// XmlStackWalker: stack walker specialization which dumps stack in XML +// ---------------------------------------------------------------------------- + +#if wxUSE_STACKWALKER + +class XmlStackWalker : public wxStackWalker +{ +public: + XmlStackWalker(wxXmlNode *nodeStack) + { + m_isOk = false; + m_nodeStack = nodeStack; + } + + bool IsOk() const { return m_isOk; } + +protected: + virtual void OnStackFrame(const wxStackFrame& frame); + + wxXmlNode *m_nodeStack; + bool m_isOk; +}; + +// ---------------------------------------------------------------------------- +// local functions +// ---------------------------------------------------------------------------- + +static inline void +HexProperty(wxXmlNode *node, const wxChar *name, unsigned long value) +{ + node->AddProperty(name, wxString::Format(_T("%08lx"), value)); +} + +static inline void +NumProperty(wxXmlNode *node, const wxChar *name, unsigned long value) +{ + node->AddProperty(name, wxString::Format(_T("%lu"), value)); +} + +static inline void +TextElement(wxXmlNode *node, const wxChar *name, const wxString& value) +{ + wxXmlNode *nodeChild = new wxXmlNode(wxXML_ELEMENT_NODE, name); + node->AddChild(nodeChild); + nodeChild->AddChild(new wxXmlNode(wxXML_TEXT_NODE, wxEmptyString, value)); +} + +#if wxUSE_CRASHREPORT && defined(__INTEL__) + +static inline void +HexElement(wxXmlNode *node, const wxChar *name, unsigned long value) +{ + TextElement(node, name, wxString::Format(_T("%08lx"), value)); +} + +#endif // wxUSE_CRASHREPORT + +// ============================================================================ +// XmlStackWalker implementation +// ============================================================================ + +void XmlStackWalker::OnStackFrame(const wxStackFrame& frame) +{ + m_isOk = true; + + wxXmlNode *nodeFrame = new wxXmlNode(wxXML_ELEMENT_NODE, _T("frame")); + m_nodeStack->AddChild(nodeFrame); + + NumProperty(nodeFrame, _T("level"), frame.GetLevel()); + wxString func = frame.GetName(); + if ( !func.empty() ) + { + nodeFrame->AddProperty(_T("function"), func); + HexProperty(nodeFrame, _T("offset"), frame.GetOffset()); + } + + if ( frame.HasSourceLocation() ) + { + nodeFrame->AddProperty(_T("file"), frame.GetFileName()); + NumProperty(nodeFrame, _T("line"), frame.GetLine()); + } + + const size_t nParams = frame.GetParamCount(); + if ( nParams ) + { + wxXmlNode *nodeParams = new wxXmlNode(wxXML_ELEMENT_NODE, _T("parameters")); + nodeFrame->AddChild(nodeParams); + + for ( size_t n = 0; n < nParams; n++ ) + { + wxXmlNode * + nodeParam = new wxXmlNode(wxXML_ELEMENT_NODE, _T("parameter")); + nodeParams->AddChild(nodeParam); + + NumProperty(nodeParam, _T("number"), n); + + wxString type, name, value; + if ( !frame.GetParam(n, &type, &name, &value) ) + continue; + + if ( !type.empty() ) + TextElement(nodeParam, _T("type"), type); + + if ( !name.empty() ) + TextElement(nodeParam, _T("name"), name); + + if ( !value.empty() ) + TextElement(nodeParam, _T("value"), value); + } + } +} + +#endif // wxUSE_STACKWALKER + +// ============================================================================ +// wxDebugReport implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// initialization and cleanup +// ---------------------------------------------------------------------------- + +wxDebugReport::wxDebugReport() +{ + // get a temporary directory name + wxString appname = GetReportName(); + + // we can't use CreateTempFileName() because it creates a file, not a + // directory, so do our best to create a unique name ourselves + // + // of course, this doesn't protect us against malicious users... + wxFileName fn; + fn.AssignTempFileName(appname); +#if wxUSE_DATETIME + m_dir.Printf(_T("%s%c%s_dbgrpt-%lu-%s"), + fn.GetPath().c_str(), wxFILE_SEP_PATH, appname.c_str(), + wxGetProcessId(), + wxDateTime::Now().Format(_T("%Y%m%dT%H%M%S")).c_str()); +#else + m_dir.Printf(_T("%s%c%s_dbgrpt-%lu"), + fn.GetPath().c_str(), wxFILE_SEP_PATH, appname.c_str(), + wxGetProcessId()); +#endif + + // as we are going to save the process state there use restrictive + // permissions + if ( !wxMkdir(m_dir, 0700) ) + { + wxLogSysError(_("Failed to create directory \"%s\""), m_dir.c_str()); + wxLogError(_("Debug report couldn't be created.")); + + Reset(); + } +} + +wxDebugReport::~wxDebugReport() +{ + if ( !m_dir.empty() ) + { + // remove all files in this directory + wxDir dir(m_dir); + wxString file; + for ( bool cont = dir.GetFirst(&file); cont; cont = dir.GetNext(&file) ) + { + if ( wxRemove(wxFileName(m_dir, file).GetFullPath()) != 0 ) + { + wxLogSysError(_("Failed to remove debug report file \"%s\""), + file.c_str()); + m_dir.clear(); + break; + } + } + } + + if ( !m_dir.empty() ) + { + // Temp fix: what should this be? eVC++ doesn't like wxRmDir +#ifdef __WXWINCE__ + if ( wxRmdir(m_dir.fn_str()) != 0 ) +#else + if ( wxRmDir(m_dir.fn_str()) != 0 ) +#endif + { + wxLogSysError(_("Failed to clean up debug report directory \"%s\""), + m_dir.c_str()); + } + } +} + +// ---------------------------------------------------------------------------- +// various helpers +// ---------------------------------------------------------------------------- + +wxString wxDebugReport::GetReportName() const +{ + if(wxTheApp) + return wxTheApp->GetAppName(); + + return _T("wx"); +} + +void +wxDebugReport::AddFile(const wxString& filename, const wxString& description) +{ + wxString name; + wxFileName fn(filename); + if ( fn.IsAbsolute() ) + { + // we need to copy the file to the debug report directory: give it the + // same name there + name = fn.GetFullName(); + wxCopyFile(fn.GetFullPath(), + wxFileName(GetDirectory(), name).GetFullPath()); + } + else // file relative to the report directory + { + name = filename; + + wxASSERT_MSG( wxFileName(GetDirectory(), name).FileExists(), + _T("file should exist in debug report directory") ); + } + + m_files.Add(name); + m_descriptions.Add(description); +} + +bool +wxDebugReport::AddText(const wxString& filename, + const wxString& text, + const wxString& description) +{ + wxASSERT_MSG( !wxFileName(filename).IsAbsolute(), + _T("filename should be relative to debug report directory") ); + + wxFileName fn(GetDirectory(), filename); + wxFFile file(fn.GetFullPath(), _T("w")); + if ( !file.IsOpened() || !file.Write(text) ) + return false; + + AddFile(filename, description); + + return true; +} + +void wxDebugReport::RemoveFile(const wxString& name) +{ + const int n = m_files.Index(name); + wxCHECK_RET( n != wxNOT_FOUND, _T("No such file in wxDebugReport") ); + + m_files.RemoveAt(n); + m_descriptions.RemoveAt(n); + + wxRemove(wxFileName(GetDirectory(), name).GetFullPath()); +} + +bool wxDebugReport::GetFile(size_t n, wxString *name, wxString *desc) const +{ + if ( n >= m_files.GetCount() ) + return false; + + if ( name ) + *name = m_files[n]; + if ( desc ) + *desc = m_descriptions[n]; + + return true; +} + +void wxDebugReport::AddAll(Context context) +{ +#if wxUSE_STACKWALKER + AddContext(context); +#endif // wxUSE_STACKWALKER + +#if wxUSE_CRASHREPORT + AddDump(context); +#endif // wxUSE_CRASHREPORT + +#if !wxUSE_STACKWALKER && !wxUSE_CRASHREPORT + wxUnusedVar(context); +#endif +} + +// ---------------------------------------------------------------------------- +// adding basic text information about current context +// ---------------------------------------------------------------------------- + +#if wxUSE_STACKWALKER + +bool wxDebugReport::DoAddSystemInfo(wxXmlNode *nodeSystemInfo) +{ + nodeSystemInfo->AddProperty(_T("description"), wxGetOsDescription()); + + return true; +} + +bool wxDebugReport::DoAddLoadedModules(wxXmlNode *nodeModules) +{ + wxDynamicLibraryDetailsArray modules(wxDynamicLibrary::ListLoaded()); + const size_t count = modules.GetCount(); + if ( !count ) + return false; + + for ( size_t n = 0; n < count; n++ ) + { + const wxDynamicLibraryDetails& info = modules[n]; + + wxXmlNode *nodeModule = new wxXmlNode(wxXML_ELEMENT_NODE, _T("module")); + nodeModules->AddChild(nodeModule); + + wxString path = info.GetPath(); + if ( path.empty() ) + path = info.GetName(); + if ( !path.empty() ) + nodeModule->AddProperty(_T("path"), path); + + void *addr = NULL; + size_t len = 0; + if ( info.GetAddress(&addr, &len) ) + { + HexProperty(nodeModule, _T("address"), wxPtrToUInt(addr)); + HexProperty(nodeModule, _T("size"), len); + } + + wxString ver = info.GetVersion(); + if ( !ver.empty() ) + { + nodeModule->AddProperty(_T("version"), ver); + } + } + + return true; +} + +bool wxDebugReport::DoAddExceptionInfo(wxXmlNode *nodeContext) +{ +#if wxUSE_CRASHREPORT + wxCrashContext c; + if ( !c.code ) + return false; + + wxXmlNode *nodeExc = new wxXmlNode(wxXML_ELEMENT_NODE, _T("exception")); + nodeContext->AddChild(nodeExc); + + HexProperty(nodeExc, _T("code"), c.code); + nodeExc->AddProperty(_T("name"), c.GetExceptionString()); + HexProperty(nodeExc, _T("address"), wxPtrToUInt(c.addr)); + +#ifdef __INTEL__ + wxXmlNode *nodeRegs = new wxXmlNode(wxXML_ELEMENT_NODE, _T("registers")); + nodeContext->AddChild(nodeRegs); + HexElement(nodeRegs, _T("eax"), c.regs.eax); + HexElement(nodeRegs, _T("ebx"), c.regs.ebx); + HexElement(nodeRegs, _T("ecx"), c.regs.edx); + HexElement(nodeRegs, _T("edx"), c.regs.edx); + HexElement(nodeRegs, _T("esi"), c.regs.esi); + HexElement(nodeRegs, _T("edi"), c.regs.edi); + + HexElement(nodeRegs, _T("ebp"), c.regs.ebp); + HexElement(nodeRegs, _T("esp"), c.regs.esp); + HexElement(nodeRegs, _T("eip"), c.regs.eip); + + HexElement(nodeRegs, _T("cs"), c.regs.cs); + HexElement(nodeRegs, _T("ds"), c.regs.ds); + HexElement(nodeRegs, _T("es"), c.regs.es); + HexElement(nodeRegs, _T("fs"), c.regs.fs); + HexElement(nodeRegs, _T("gs"), c.regs.gs); + HexElement(nodeRegs, _T("ss"), c.regs.ss); + + HexElement(nodeRegs, _T("flags"), c.regs.flags); +#endif // __INTEL__ + + return true; +#else // !wxUSE_CRASHREPORT + wxUnusedVar(nodeContext); + + return false; +#endif // wxUSE_CRASHREPORT/!wxUSE_CRASHREPORT +} + +bool wxDebugReport::AddContext(wxDebugReport::Context ctx) +{ + wxCHECK_MSG( IsOk(), false, _T("use IsOk() first") ); + + // create XML dump of current context + wxXmlDocument xmldoc; + wxXmlNode *nodeRoot = new wxXmlNode(wxXML_ELEMENT_NODE, _T("report")); + xmldoc.SetRoot(nodeRoot); + nodeRoot->AddProperty(_T("version"), _T("1.0")); + nodeRoot->AddProperty(_T("kind"), ctx == Context_Current ? _T("user") + : _T("exception")); + + // add system information + wxXmlNode *nodeSystemInfo = new wxXmlNode(wxXML_ELEMENT_NODE, _T("system")); + if ( DoAddSystemInfo(nodeSystemInfo) ) + nodeRoot->AddChild(nodeSystemInfo); + else + delete nodeSystemInfo; + + // add information about the loaded modules + wxXmlNode *nodeModules = new wxXmlNode(wxXML_ELEMENT_NODE, _T("modules")); + if ( DoAddLoadedModules(nodeModules) ) + nodeRoot->AddChild(nodeModules); + else + delete nodeModules; + + // add CPU context information: this only makes sense for exceptions as our + // current context is not very interesting otherwise + if ( ctx == Context_Exception ) + { + wxXmlNode *nodeContext = new wxXmlNode(wxXML_ELEMENT_NODE, _T("context")); + if ( DoAddExceptionInfo(nodeContext) ) + nodeRoot->AddChild(nodeContext); + else + delete nodeContext; + } + + // add stack traceback +#if wxUSE_STACKWALKER + wxXmlNode *nodeStack = new wxXmlNode(wxXML_ELEMENT_NODE, _T("stack")); + XmlStackWalker sw(nodeStack); + if ( ctx == Context_Exception ) + { + sw.WalkFromException(); + } + else // Context_Current + { + sw.Walk(); + } + + if ( sw.IsOk() ) + nodeRoot->AddChild(nodeStack); + else + delete nodeStack; +#endif // wxUSE_STACKWALKER + + // finally let the user add any extra information he needs + DoAddCustomContext(nodeRoot); + + + // save the entire context dump in a file + wxFileName fn(m_dir, GetReportName(), _T("xml")); + + if ( !xmldoc.Save(fn.GetFullPath()) ) + return false; + + AddFile(fn.GetFullName(), _("process context description")); + + return true; +} + +#endif // wxUSE_STACKWALKER + +// ---------------------------------------------------------------------------- +// adding core dump +// ---------------------------------------------------------------------------- + +#if wxUSE_CRASHREPORT + +bool wxDebugReport::AddDump(Context ctx) +{ + wxCHECK_MSG( IsOk(), false, _T("use IsOk() first") ); + + wxFileName fn(m_dir, GetReportName(), _T("dmp")); + wxCrashReport::SetFileName(fn.GetFullPath()); + + if ( !(ctx == Context_Exception ? wxCrashReport::Generate() + : wxCrashReport::GenerateNow()) ) + return false; + + AddFile(fn.GetFullName(), _("dump of the process state (binary)")); + + return true; +} + +#endif // wxUSE_CRASHREPORT + +// ---------------------------------------------------------------------------- +// report processing +// ---------------------------------------------------------------------------- + +bool wxDebugReport::Process() +{ + if ( !GetFilesCount() ) + { + wxLogError(_("Debug report generation has failed.")); + + return false; + } + + if ( !DoProcess() ) + { + wxLogError(_("Processing debug report has failed, leaving the files in \"%s\" directory."), + GetDirectory().c_str()); + + Reset(); + + return false; + } + + return true; +} + +bool wxDebugReport::DoProcess() +{ + wxString msg(_("A debug report has been generated. It can be found in")); + msg << _T("\n") + _T("\t") << GetDirectory() << _T("\n\n") + << _("And includes the following files:\n"); + + wxString name, desc; + const size_t count = GetFilesCount(); + for ( size_t n = 0; n < count; n++ ) + { + GetFile(n, &name, &desc); + msg += wxString::Format(_("\t%s: %s\n"), name.c_str(), desc.c_str()); + } + + msg += _("\nPlease send this report to the program maintainer, thank you!\n"); + + wxLogMessage(_T("%s"), msg.c_str()); + + // we have to do this or the report would be deleted, and we don't even + // have any way to ask the user if he wants to keep it from here + Reset(); + + return true; +} + +// ============================================================================ +// wxDebugReport-derived classes +// ============================================================================ + +#if wxUSE_ZIPSTREAM + +// ---------------------------------------------------------------------------- +// wxDebugReportCompress +// ---------------------------------------------------------------------------- + +bool wxDebugReportCompress::DoProcess() +{ + const size_t count = GetFilesCount(); + if ( !count ) + return false; + + // create the streams + wxFileName fn(GetDirectory(), GetReportName(), _T("zip")); + wxFFileOutputStream os(fn.GetFullPath(), _T("wb")); + wxZipOutputStream zos(os, 9); + + // add all files to the ZIP one + wxString name, desc; + for ( size_t n = 0; n < count; n++ ) + { + GetFile(n, &name, &desc); + + wxZipEntry *ze = new wxZipEntry(name); + ze->SetComment(desc); + + if ( !zos.PutNextEntry(ze) ) + return false; + + wxFileName filename(fn.GetPath(), name); + wxFFileInputStream is(filename.GetFullPath()); + if ( !is.IsOk() || !zos.Write(is).IsOk() ) + return false; + } + + if ( !zos.Close() ) + return false; + + m_zipfile = fn.GetFullPath(); + + return true; +} + +// ---------------------------------------------------------------------------- +// wxDebugReportUpload +// ---------------------------------------------------------------------------- + +wxDebugReportUpload::wxDebugReportUpload(const wxString& url, + const wxString& input, + const wxString& action, + const wxString& curl) + : m_uploadURL(url), + m_inputField(input), + m_curlCmd(curl) +{ + if ( m_uploadURL.Last() != _T('/') ) + m_uploadURL += _T('/'); + m_uploadURL += action; +} + +bool wxDebugReportUpload::DoProcess() +{ + if ( !wxDebugReportCompress::DoProcess() ) + return false; + + + wxArrayString output, errors; + int rc = wxExecute(wxString::Format + ( + _T("%s -F %s=@\"%s\" %s"), + m_curlCmd.c_str(), + m_inputField.c_str(), + GetCompressedFileName().c_str(), + m_uploadURL.c_str() + ), + output, + errors); + if ( rc == -1 ) + { + wxLogError(_("Failed to execute curl, please install it in PATH.")); + } + else if ( rc != 0 ) + { + const size_t count = errors.GetCount(); + if ( count ) + { + for ( size_t n = 0; n < count; n++ ) + { + wxLogWarning(_T("%s"), errors[n].c_str()); + } + } + + wxLogError(_("Failed to upload the debug report (error code %d)."), rc); + } + else // rc == 0 + { + if ( OnServerReply(output) ) + return true; + } + + return false; +} + +#endif // wxUSE_ZIPSTREAM + +#endif // wxUSE_DEBUGREPORT diff --git a/Externals/wxWidgets/src/common/descrip.mms b/Externals/wxWidgets/src/common/descrip.mms new file mode 100644 index 0000000000..5b9544a245 --- /dev/null +++ b/Externals/wxWidgets/src/common/descrip.mms @@ -0,0 +1,583 @@ +#***************************************************************************** +# * +# Make file for VMS * +# Author : J.Jansen (joukj@hrem.nano.tudelft.nl) * +# Date : 1 December 2006 * +# * +#***************************************************************************** +.first + define wx [--.include.wx] + +.ifdef __WXMOTIF__ +CXX_DEFINE = /define=(__WXMOTIF__=1)/name=(as_is,short)\ + /assume=(nostdnew,noglobal_array_new) +CC_DEFINE = /define=(__WXMOTIF__=1)/name=(as_is,short) +.else +.ifdef __WXGTK__ +CXX_DEFINE = /define=(__WXGTK__=1)/float=ieee/name=(as_is,short)/ieee=denorm\ + /assume=(nostdnew,noglobal_array_new) +CC_DEFINE = /define=(__WXGTK__=1)/float=ieee/name=(as_is,short)/ieee=denorm +.else +.ifdef __WXGTK2__ +CXX_DEFINE = /define=(__WXGTK__=1,VMS_GTK2=1)/float=ieee/name=(as_is,short)/ieee=denorm\ + /assume=(nostdnew,noglobal_array_new) +CC_DEFINE = /define=(__WXGTK__=1,VMS_GTK2=1)/float=ieee/name=(as_is,short)/ieee=denorm +.else +.ifdef __WXX11__ +CXX_DEFINE = /define=(__WXX11__=1,__WXUNIVERSAL__==1)/float=ieee\ + /name=(as_is,short)/assume=(nostdnew,noglobal_array_new) +CC_DEFINE = /define=(__WXX11__=1,__WXUNIVERSAL__==1)/float=ieee\ + /name=(as_is,short) +.else +CXX_DEFINE = +CC_DEFINE = +.endif +.endif +.endif +.endif + +YACC=bison/yacc + +SED=gsed + +LEX=flex + +.suffixes : .cpp + +.cpp.obj : + cxx $(CXXFLAGS)$(CXX_DEFINE) $(MMS$TARGET_NAME).cpp +.c.obj : + cc $(CFLAGS)$(CC_DEFINE) $(MMS$TARGET_NAME).c + +OBJECTS = \ + anidecod.obj,\ + animatecmn.obj,\ + appbase.obj,\ + appcmn.obj,\ + artprov.obj,\ + artstd.obj,\ + bmpbase.obj,\ + bookctrl.obj,\ + choiccmn.obj,\ + clipcmn.obj,\ + clntdata.obj,\ + cmdline.obj,\ + cmdproc.obj,\ + cmndata.obj,\ + config.obj,\ + containr.obj,\ + convauto.obj,\ + colourcmn.obj,\ + cshelp.obj,\ + ctrlcmn.obj,\ + ctrlsub.obj,\ + datacmn.obj,\ + datetime.obj,\ + datstrm.obj,\ + db.obj,\ + dbgrid.obj,\ + dbtable.obj,\ + dcbase.obj,\ + dcbufcmn.obj,\ + dircmn.obj,\ + dlgcmn.obj,\ + dobjcmn.obj,\ + docmdi.obj,\ + docview.obj,\ + dpycmn.obj,\ + dynarray.obj,\ + dynlib.obj,\ + encconv.obj,\ + event.obj,\ + evtloopcmn.obj,\ + extended.obj,\ + fddlgcmn.obj,\ + ffile.obj,\ + file.obj,\ + fileback.obj,\ + fileconf.obj,\ + filename.obj,\ + filefn.obj,\ + filesys.obj,\ + fldlgcmn.obj,\ + fmapbase.obj,\ + fontcmn.obj,\ + fontenumcmn.obj,\ + fontmap.obj,\ + framecmn.obj + +OBJECTS1=fs_inet.obj,\ + ftp.obj,\ + gaugecmn.obj,\ + gbsizer.obj,\ + gdicmn.obj,\ + gifdecod.obj,\ + hash.obj,\ + hashmap.obj,\ + helpbase.obj,\ + http.obj,\ + iconbndl.obj,\ + init.obj,\ + imagall.obj,\ + imagbmp.obj,\ + image.obj,\ + imagfill.obj,\ + imaggif.obj,\ + imagiff.obj,\ + imagjpeg.obj,\ + imagpcx.obj,\ + imagpng.obj,\ + imagpnm.obj,\ + imagtga.obj,\ + imagtiff.obj,\ + imagxpm.obj,\ + intl.obj,\ + ipcbase.obj,\ + layout.obj,\ + lboxcmn.obj,\ + list.obj,\ + log.obj,\ + longlong.obj,\ + memory.obj,\ + menucmn.obj,\ + mimecmn.obj,\ + module.obj,\ + msgout.obj,\ + mstream.obj,\ + nbkbase.obj,\ + object.obj,\ + paper.obj,\ + platinfo.obj,\ + popupcmn.obj,\ + prntbase.obj,\ + process.obj,\ + protocol.obj,\ + quantize.obj,\ + radiocmn.obj,\ + rendcmn.obj,\ + sckaddr.obj,\ + sckfile.obj,\ + sckipc.obj,\ + sckstrm.obj,\ + sizer.obj,\ + socket.obj,\ + settcmn.obj,\ + statbar.obj,\ + stdpbase.obj,\ + stockitem.obj,\ + stopwatch.obj,\ + strconv.obj,\ + stream.obj,\ + string.obj,\ + sysopt.obj + +OBJECTS2=tbarbase.obj,\ + textbuf.obj,\ + textcmn.obj,\ + textfile.obj,\ + timercmn.obj,\ + tokenzr.obj,\ + toplvcmn.obj,\ + treebase.obj,\ + txtstrm.obj,\ + url.obj,\ + utilscmn.obj,\ + rgncmn.obj,\ + uri.obj,\ + valgen.obj,\ + validate.obj,\ + valtext.obj,\ + variant.obj,\ + wfstream.obj,\ + wxchar.obj,\ + wincmn.obj,\ + xpmdecod.obj,\ + zipstrm.obj,\ + zstream.obj,\ + clrpickercmn.obj,\ + filepickercmn.obj,\ + fontpickercmn.obj,\ + pickerbase.obj,\ + listctrlcmn.obj + +OBJECTS_MOTIF=radiocmn.obj,combocmn.obj + +OBJECTS_X11=accesscmn.obj,dndcmn.obj,dpycmn.obj,dseldlg.obj,\ + dynload.obj,effects.obj,fddlgcmn.obj,fs_mem.obj,\ + gbsizer.obj,geometry.obj,matrix.obj,radiocmn.obj,\ + regex.obj,taskbarcmn.obj,xti.obj,xtistrm.obj,xtixml.obj,\ + combocmn.obj + +OBJECTS_X11_2=socketevtdispatch.obj + +SOURCES = \ + anidecod.cpp,\ + animatecmn.cpp,\ + appbase.cpp,\ + appcmn.cpp,\ + artprov.cpp,\ + artstd.cpp,\ + bmpbase.cpp,\ + bookctrl.cpp,\ + choiccmn.cpp,\ + clipcmn.cpp,\ + clntdata.cpp,\ + cmdline.cpp,\ + cmdproc.cpp,\ + cmndata.cpp,\ + config.cpp,\ + containr.cpp,\ + convauto.cpp,\ + colourcmn.cpp,\ + cshelp.cpp,\ + ctrlcmn.cpp,\ + ctrlsub.cpp,\ + datacmn.cpp,\ + datetime.cpp,\ + datstrm.cpp,\ + db.cpp,\ + dbgrid.cpp,\ + dbtable.cpp,\ + dcbase.cpp,\ + dcbufcmn.cpp,\ + dircmn.cpp,\ + dlgcmn.cpp,\ + dobjcmn.cpp,\ + docmdi.cpp,\ + docview.cpp,\ + dpycmn.cpp,\ + dynarray.cpp,\ + dynlib.cpp,\ + encconv.cpp,\ + event.cpp,\ + evtloopcmn.cpp,\ + extended.c,\ + ffile.cpp,\ + fddlgcmn.cpp,\ + file.cpp,\ + fileback.cpp,\ + fileconf.cpp,\ + filename.cpp,\ + filefn.cpp,\ + filesys.cpp,\ + fldlgcmn.cpp,\ + fmapbase.cpp,\ + fontcmn.cpp,\ + fontenumcmn.cpp,\ + fontmap.cpp,\ + framecmn.cpp,\ + fs_inet.cpp,\ + ftp.cpp,\ + gaugecmn.cpp,\ + gbsizer.cpp,\ + gdicmn.cpp,\ + gifdecod.cpp,\ + hash.cpp,\ + hashmap.cpp,\ + helpbase.cpp,\ + http.cpp,\ + iconbndl.cpp,\ + init.cpp,\ + imagall.cpp,\ + imagbmp.cpp,\ + image.cpp,\ + imagfill.cpp,\ + imaggif.cpp,\ + imagiff.cpp,\ + imagjpeg.cpp,\ + imagpcx.cpp,\ + imagpng.cpp,\ + imagpnm.cpp,\ + imagtga.cpp,\ + imagtiff.cpp,\ + imagxpm.cpp,\ + intl.cpp,\ + ipcbase.cpp,\ + layout.cpp,\ + lboxcmn.cpp,\ + list.cpp,\ + listctrlcmn.cpp,\ + log.cpp,\ + longlong.cpp,\ + memory.cpp,\ + menucmn.cpp,\ + mimecmn.cpp,\ + module.cpp,\ + msgout.cpp,\ + mstream.cpp,\ + nbkbase.cpp,\ + object.cpp,\ + paper.cpp,\ + platinfo.cpp,\ + popupcmn.cpp,\ + prntbase.cpp,\ + process.cpp,\ + protocol.cpp,\ + quantize.cpp,\ + radiocmn.cpp,\ + rendcmn.cpp,\ + rgncmn.cpp,\ + sckaddr.cpp,\ + sckfile.cpp,\ + sckipc.cpp,\ + sckstrm.cpp,\ + sizer.cpp,\ + socket.cpp,\ + socketevtdispatch.cpp,\ + settcmn.cpp,\ + statbar.cpp,\ + stdpbase.cpp,\ + stockitem.cpp,\ + stopwatch.cpp,\ + strconv.cpp,\ + stream.cpp,\ + sysopt.cpp,\ + string.cpp,\ + tbarbase.cpp,\ + textbuf.cpp,\ + textcmn.cpp,\ + textfile.cpp,\ + timercmn.cpp,\ + tokenzr.cpp,\ + toplvcmn.cpp,\ + treebase.cpp,\ + txtstrm.cpp,\ + url.cpp,\ + utilscmn.cpp,\ + valgen.cpp,\ + validate.cpp,\ + valtext.cpp,\ + variant.cpp,\ + wfstream.cpp,\ + wincmn.cpp,\ + wxchar.cpp,\ + xpmdecod.cpp,\ + zipstrm.cpp,\ + zstream.cpp,\ + clrpickercmn.cpp,\ + filepickercmn.cpp,\ + fontpickercmn.cpp,\ + pickerbase.cpp,\ + accesscmn.cpp,\ + dndcmn.cpp,\ + dpycmn.cpp,\ + dseldlg.cpp,\ + dynload.cpp,\ + effects.cpp,\ + fddlgcmn.cpp,\ + fs_mem.cpp,\ + gbsizer.cpp,\ + geometry.cpp,\ + matrix.cpp,\ + radiocmn.cpp,\ + regex.cpp,\ + taskbarcmn.cpp,\ + uri.cpp,\ + xti.cpp,\ + xtistrm.cpp,\ + xtixml.cpp + +all : $(SOURCES) + $(MMS)$(MMSQUALIFIERS) $(OBJECTS) + $(MMS)$(MMSQUALIFIERS) $(OBJECTS1) + $(MMS)$(MMSQUALIFIERS) $(OBJECTS2) +.ifdef __WXMOTIF__ + $(MMS)$(MMSQUALIFIERS) $(OBJECTS_MOTIF) + library [--.lib]libwx_motif.olb $(OBJECTS) + library [--.lib]libwx_motif.olb $(OBJECTS1) + library [--.lib]libwx_motif.olb $(OBJECTS2) + library [--.lib]libwx_motif.olb $(OBJECTS_MOTIF) +.else +.ifdef __WXGTK__ + $(MMS)$(MMSQUALIFIERS) $(OBJECTS_X11) + library [--.lib]libwx_gtk.olb $(OBJECTS) + library [--.lib]libwx_gtk.olb $(OBJECTS1) + library [--.lib]libwx_gtk.olb $(OBJECTS2) + library [--.lib]libwx_gtk.olb $(OBJECTS_X11) +.else +.ifdef __WXGTK2__ + $(MMS)$(MMSQUALIFIERS) $(OBJECTS_X11) + library [--.lib]libwx_gtk2.olb $(OBJECTS) + library [--.lib]libwx_gtk2.olb $(OBJECTS1) + library [--.lib]libwx_gtk2.olb $(OBJECTS2) + library [--.lib]libwx_gtk2.olb $(OBJECTS_X11) +.else +.ifdef __WXX11__ + $(MMS)$(MMSQUALIFIERS) $(OBJECTS_X11) + $(MMS)$(MMSQUALIFIERS) $(OBJECTS_X11_2) + library [--.lib]libwx_x11_univ.olb $(OBJECTS) + library [--.lib]libwx_x11_univ.olb $(OBJECTS1) + library [--.lib]libwx_x11_univ.olb $(OBJECTS2) + library [--.lib]libwx_x11_univ.olb $(OBJECTS_X11) + library [--.lib]libwx_x11_univ.olb $(OBJECTS_X11_2) +.endif +.endif +.endif +.endif + +anidecod.obj : anidecod.cpp +animatecmn.obj : animatecmn.cpp +appbase.obj : appbase.cpp +appcmn.obj : appcmn.cpp +artprov.obj : artprov.cpp +artstd.obj : artstd.cpp +bmpbase.obj : bmpbase.cpp +bookctrl.obj : bookctrl.cpp +choiccmn.obj : choiccmn.cpp +clipcmn.obj : clipcmn.cpp +clntdata.obj : clntdata.cpp +cmdline.obj : cmdline.cpp +cmdproc.obj : cmdproc.cpp +cmndata.obj : cmndata.cpp +config.obj : config.cpp +containr.obj : containr.cpp +convauto.obj : convauto.cpp +colourcmn.obj : colourcmn.cpp +cshelp.obj : cshelp.cpp +ctrlcmn.obj : ctrlcmn.cpp +ctrlsub.obj : ctrlsub.cpp +datacmn.obj : datacmn.cpp +datetime.obj : datetime.cpp +datstrm.obj : datstrm.cpp +db.obj : db.cpp +dbgrid.obj : dbgrid.cpp +dbtable.obj : dbtable.cpp +dcbase.obj : dcbase.cpp +dcbufcmn.obj : dcbufcmn.cpp +dircmn.obj : dircmn.cpp +dlgcmn.obj : dlgcmn.cpp +dobjcmn.obj : dobjcmn.cpp +docmdi.obj : docmdi.cpp +docview.obj : docview.cpp +dynarray.obj : dynarray.cpp +dynlib.obj : dynlib.cpp +encconv.obj : encconv.cpp +event.obj : event.cpp +evtloopcmn.obj : evtloopcmn.cpp +extended.obj : extended.c +ffile.obj : ffile.cpp +fddlgcmn.obj : fddlgcmn.cpp +file.obj : file.cpp +fileback.obj : fileback.cpp +fileconf.obj : fileconf.cpp +filefn.obj : filefn.cpp +filename.obj : filename.cpp +filesys.obj : filesys.cpp +fldlgcmn.obj : fldlgcmn.cpp +fmapbase.obj : fmapbase.cpp +fontcmn.obj : fontcmn.cpp +fontenumcmn.obj : fontenumcmn.cpp +fontmap.obj : fontmap.cpp +framecmn.obj : framecmn.cpp +fs_inet.obj : fs_inet.cpp +ftp.obj : ftp.cpp +gaugecmn.obj : gaugecmn.cpp +gbsizer.obj : gbsizer.cpp +gdicmn.obj : gdicmn.cpp +gifdecod.obj : gifdecod.cpp +hash.obj : hash.cpp +hashmap.obj : hashmap.cpp +helpbase.obj : helpbase.cpp +http.obj : http.cpp +iconbndl.obj : iconbndl.cpp +init.obj : init.cpp +imagall.obj : imagall.cpp +imagbmp.obj : imagbmp.cpp +image.obj : image.cpp +imagfill.obj : imagfill.cpp +imaggif.obj : imaggif.cpp +imagiff.obj : imagiff.cpp +imagjpeg.obj : imagjpeg.cpp +imagpcx.obj : imagpcx.cpp +imagpng.obj : imagpng.cpp +imagpnm.obj : imagpnm.cpp +imagtga.obj : imagtga.cpp +imagtiff.obj : imagtiff.cpp +imagxpm.obj : imagxpm.cpp +intl.obj : intl.cpp +ipcbase.obj : ipcbase.cpp +layout.obj : layout.cpp +lboxcmn.obj : lboxcmn.cpp +list.obj : list.cpp +log.obj : log.cpp +longlong.obj : longlong.cpp +memory.obj : memory.cpp +menucmn.obj : menucmn.cpp +mimecmn.obj : mimecmn.cpp +module.obj : module.cpp +msgout.obj : msgout.cpp +mstream.obj : mstream.cpp +nbkbase.obj : nbkbase.cpp +object.obj : object.cpp +paper.obj : paper.cpp +platinfo.obj : platinfo.cpp +popupcmn.obj : popupcmn.cpp +prntbase.obj : prntbase.cpp +process.obj : process.cpp +protocol.obj : protocol.cpp +quantize.obj : quantize.cpp +radiocmn.obj : radiocmn.cpp +rendcmn.obj : rendcmn.cpp +rgncmn.obj : rgncmn.cpp +sckaddr.obj : sckaddr.cpp +sckfile.obj : sckfile.cpp +sckipc.obj : sckipc.cpp +sckstrm.obj : sckstrm.cpp +sizer.obj : sizer.cpp +socket.obj : socket.cpp +socketevtdispatch.obj : socketevtdispatch.cpp +settcmn.obj : settcmn.cpp +statbar.obj : statbar.cpp +stdpbase.obj : stdpbase.cpp +stockitem.obj : stockitem.cpp +stopwatch.obj : stopwatch.cpp +strconv.obj : strconv.cpp +stream.obj : stream.cpp +sysopt.obj : sysopt.cpp +string.obj : string.cpp +tbarbase.obj : tbarbase.cpp +textbuf.obj : textbuf.cpp +textcmn.obj : textcmn.cpp +textfile.obj : textfile.cpp +timercmn.obj : timercmn.cpp +tokenzr.obj : tokenzr.cpp +toplvcmn.obj : toplvcmn.cpp +treebase.obj : treebase.cpp +txtstrm.obj : txtstrm.cpp +url.obj : url.cpp +utilscmn.obj : utilscmn.cpp +valgen.obj : valgen.cpp +validate.obj : validate.cpp +valtext.obj : valtext.cpp +variant.obj : variant.cpp +wfstream.obj : wfstream.cpp +wincmn.obj : wincmn.cpp +wxchar.obj : wxchar.cpp +xpmdecod.obj : xpmdecod.cpp +zipstrm.obj : zipstrm.cpp +zstream.obj : zstream.cpp +accesscmn.obj : accesscmn.cpp +dndcmn.obj : dndcmn.cpp +dpycmn.obj : dpycmn.cpp +dseldlg.obj : dseldlg.cpp +dynload.obj : dynload.cpp +effects.obj : effects.cpp +fddlgcmn.obj : fddlgcmn.cpp +fs_mem.obj : fs_mem.cpp +gbsizer.obj : gbsizer.cpp +geometry.obj : geometry.cpp +matrix.obj : matrix.cpp +radiocmn.obj : radiocmn.cpp +regex.obj : regex.cpp +taskbarcmn.obj : taskbarcmn.cpp +xti.obj : xti.cpp +xtistrm.obj : xtistrm.cpp +xtixml.obj : xtixml.cpp +uri.obj : uri.cpp +dpycmn.obj : dpycmn.cpp +combocmn.obj : combocmn.cpp +clrpickercmn.obj : clrpickercmn.cpp +filepickercmn.obj : filepickercmn.cpp +fontpickercmn.obj : fontpickercmn.cpp +pickerbase.obj : pickerbase.cpp +listctrlcmn.obj : listctrlcmn.cpp diff --git a/Externals/wxWidgets/src/common/dircmn.cpp b/Externals/wxWidgets/src/common/dircmn.cpp new file mode 100644 index 0000000000..2e2b24a34d --- /dev/null +++ b/Externals/wxWidgets/src/common/dircmn.cpp @@ -0,0 +1,357 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/common/dircmn.cpp +// Purpose: wxDir methods common to all implementations +// Author: Vadim Zeitlin +// Modified by: +// Created: 19.05.01 +// RCS-ID: $Id: dircmn.cpp 40665 2006-08-19 08:45:31Z JS $ +// Copyright: (c) 2001 Vadim Zeitlin +// License: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#ifndef WX_PRECOMP + #include "wx/string.h" + #include "wx/log.h" + #include "wx/intl.h" + #include "wx/filefn.h" + #include "wx/arrstr.h" +#endif //WX_PRECOMP + +#include "wx/dir.h" +#include "wx/filename.h" + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxDirTraverser +// ---------------------------------------------------------------------------- + +wxDirTraverseResult +wxDirTraverser::OnOpenError(const wxString& WXUNUSED(dirname)) +{ + return wxDIR_IGNORE; +} + +// ---------------------------------------------------------------------------- +// wxDir::HasFiles() and HasSubDirs() +// ---------------------------------------------------------------------------- + +// dumb generic implementation + +bool wxDir::HasFiles(const wxString& spec) +{ + wxString s; + return GetFirst(&s, spec, wxDIR_FILES | wxDIR_HIDDEN); +} + +// we have a (much) faster version for Unix +#if (defined(__CYGWIN__) && defined(__WINDOWS__)) || !defined(__UNIX_LIKE__) || defined(__WXMAC__) || defined(__EMX__) || defined(__WINE__) + +bool wxDir::HasSubDirs(const wxString& spec) +{ + wxString s; + return GetFirst(&s, spec, wxDIR_DIRS | wxDIR_HIDDEN); +} + +#endif // !Unix + +// ---------------------------------------------------------------------------- +// wxDir::Traverse() +// ---------------------------------------------------------------------------- + +size_t wxDir::Traverse(wxDirTraverser& sink, + const wxString& filespec, + int flags) const +{ + wxCHECK_MSG( IsOpened(), (size_t)-1, + _T("dir must be opened before traversing it") ); + + // the total number of files found + size_t nFiles = 0; + + // the name of this dir with path delimiter at the end + wxString prefix = GetName(); + prefix += wxFILE_SEP_PATH; + + // first, recurse into subdirs + if ( flags & wxDIR_DIRS ) + { + wxString dirname; + for ( bool cont = GetFirst(&dirname, wxEmptyString, wxDIR_DIRS | (flags & wxDIR_HIDDEN) ); + cont; + cont = cont && GetNext(&dirname) ) + { + const wxString fulldirname = prefix + dirname; + + switch ( sink.OnDir(fulldirname) ) + { + default: + wxFAIL_MSG(_T("unexpected OnDir() return value") ); + // fall through + + case wxDIR_STOP: + cont = false; + break; + + case wxDIR_CONTINUE: + { + wxDir subdir; + + // don't give the error messages for the directories + // which we can't open: there can be all sorts of good + // reason for this (e.g. insufficient privileges) and + // this shouldn't be treated as an error -- instead + // let the user code decide what to do + bool ok; + do + { + wxLogNull noLog; + ok = subdir.Open(fulldirname); + if ( !ok ) + { + // ask the user code what to do + bool tryagain; + switch ( sink.OnOpenError(fulldirname) ) + { + default: + wxFAIL_MSG(_T("unexpected OnOpenError() return value") ); + // fall through + + case wxDIR_STOP: + cont = false; + // fall through + + case wxDIR_IGNORE: + tryagain = false; + break; + + case wxDIR_CONTINUE: + tryagain = true; + } + + if ( !tryagain ) + break; + } + } + while ( !ok ); + + if ( ok ) + { + nFiles += subdir.Traverse(sink, filespec, flags); + } + } + break; + + case wxDIR_IGNORE: + // nothing to do + ; + } + } + } + + // now enum our own files + if ( flags & wxDIR_FILES ) + { + flags &= ~wxDIR_DIRS; + + wxString filename; + bool cont = GetFirst(&filename, filespec, flags); + while ( cont ) + { + wxDirTraverseResult res = sink.OnFile(prefix + filename); + if ( res == wxDIR_STOP ) + break; + + wxASSERT_MSG( res == wxDIR_CONTINUE, + _T("unexpected OnFile() return value") ); + + nFiles++; + + cont = GetNext(&filename); + } + } + + return nFiles; +} + +// ---------------------------------------------------------------------------- +// wxDir::GetAllFiles() +// ---------------------------------------------------------------------------- + +class wxDirTraverserSimple : public wxDirTraverser +{ +public: + wxDirTraverserSimple(wxArrayString& files) : m_files(files) { } + + virtual wxDirTraverseResult OnFile(const wxString& filename) + { + m_files.push_back(filename); + return wxDIR_CONTINUE; + } + + virtual wxDirTraverseResult OnDir(const wxString& WXUNUSED(dirname)) + { + return wxDIR_CONTINUE; + } + +private: + wxArrayString& m_files; + + DECLARE_NO_COPY_CLASS(wxDirTraverserSimple) +}; + +/* static */ +size_t wxDir::GetAllFiles(const wxString& dirname, + wxArrayString *files, + const wxString& filespec, + int flags) +{ + wxCHECK_MSG( files, (size_t)-1, _T("NULL pointer in wxDir::GetAllFiles") ); + + size_t nFiles = 0; + + wxDir dir(dirname); + if ( dir.IsOpened() ) + { + wxDirTraverserSimple traverser(*files); + + nFiles += dir.Traverse(traverser, filespec, flags); + } + + return nFiles; +} + +// ---------------------------------------------------------------------------- +// wxDir::FindFirst() +// ---------------------------------------------------------------------------- + +class wxDirTraverserFindFirst : public wxDirTraverser +{ +public: + wxDirTraverserFindFirst() { } + + virtual wxDirTraverseResult OnFile(const wxString& filename) + { + m_file = filename; + return wxDIR_STOP; + } + + virtual wxDirTraverseResult OnDir(const wxString& WXUNUSED(dirname)) + { + return wxDIR_CONTINUE; + } + + const wxString& GetFile() const + { + return m_file; + } + +private: + wxString m_file; + + DECLARE_NO_COPY_CLASS(wxDirTraverserFindFirst) +}; + +/* static */ +wxString wxDir::FindFirst(const wxString& dirname, + const wxString& filespec, + int flags) +{ + wxDir dir(dirname); + if ( dir.IsOpened() ) + { + wxDirTraverserFindFirst traverser; + + dir.Traverse(traverser, filespec, flags | wxDIR_FILES); + return traverser.GetFile(); + } + + return wxEmptyString; +} + + +// ---------------------------------------------------------------------------- +// wxDir::GetTotalSize() +// ---------------------------------------------------------------------------- + +class wxDirTraverserSumSize : public wxDirTraverser +{ +public: + wxDirTraverserSumSize() { } + + virtual wxDirTraverseResult OnFile(const wxString& filename) + { + wxULongLong sz = wxFileName::GetSize(filename); + + // wxFileName::GetSize won't use this class again as + // we're passing it a file and not a directory; + // thus we are sure to avoid an endless loop + if (sz == wxInvalidSize) + { + // if the GetSize() failed (this can happen because e.g. a + // file is locked by another process), we can proceed but + // we need to at least warn the user that the resulting + // final size could be not reliable (if e.g. the locked + // file is very big). + m_skippedFiles.Add(filename); + return wxDIR_CONTINUE; + } + + m_sz += sz; + return wxDIR_CONTINUE; + } + + virtual wxDirTraverseResult OnDir(const wxString& WXUNUSED(dirname)) + { + return wxDIR_CONTINUE; + } + + wxULongLong GetTotalSize() const + { return m_sz; } + wxArrayString &FilesSkipped() + { return m_skippedFiles; } + +protected: + wxULongLong m_sz; + wxArrayString m_skippedFiles; +}; + +wxULongLong wxDir::GetTotalSize(const wxString &dirname, wxArrayString *filesSkipped) +{ + if (!wxDirExists(dirname)) + return wxInvalidSize; + + // to get the size of this directory and its contents we need + // to recursively walk it... + wxDir dir(dirname); + if ( !dir.IsOpened() ) + return wxInvalidSize; + + wxDirTraverserSumSize traverser; + if (dir.Traverse(traverser) == (size_t)-1 || + traverser.GetTotalSize() == 0) + return wxInvalidSize; + + if (filesSkipped) + *filesSkipped = traverser.FilesSkipped(); + + return traverser.GetTotalSize(); +} + diff --git a/Externals/wxWidgets/src/common/dlgcmn.cpp b/Externals/wxWidgets/src/common/dlgcmn.cpp new file mode 100644 index 0000000000..f119b86011 --- /dev/null +++ b/Externals/wxWidgets/src/common/dlgcmn.cpp @@ -0,0 +1,565 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/dlgcmn.cpp +// Purpose: common (to all ports) wxDialog functions +// Author: Vadim Zeitlin +// Modified by: +// Created: 28.06.99 +// RCS-ID: $Id: dlgcmn.cpp 49747 2007-11-09 15:06:52Z JS $ +// Copyright: (c) Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#include "wx/dialog.h" + +#ifndef WX_PRECOMP + #include "wx/button.h" + #include "wx/dcclient.h" + #include "wx/intl.h" + #include "wx/settings.h" + #include "wx/stattext.h" + #include "wx/sizer.h" + #include "wx/containr.h" +#endif + +#include "wx/statline.h" +#include "wx/sysopt.h" + +#if wxUSE_STATTEXT + +// ---------------------------------------------------------------------------- +// wxTextWrapper +// ---------------------------------------------------------------------------- + +// this class is used to wrap the text on word boundary: wrapping is done by +// calling OnStartLine() and OnOutputLine() functions +class wxTextWrapper +{ +public: + wxTextWrapper() { m_eol = false; } + + // win is used for getting the font, text is the text to wrap, width is the + // max line width or -1 to disable wrapping + void Wrap(wxWindow *win, const wxString& text, int widthMax); + + // we don't need it, but just to avoid compiler warnings + virtual ~wxTextWrapper() { } + +protected: + // line may be empty + virtual void OnOutputLine(const wxString& line) = 0; + + // called at the start of every new line (except the very first one) + virtual void OnNewLine() { } + +private: + // call OnOutputLine() and set m_eol to true + void DoOutputLine(const wxString& line) + { + OnOutputLine(line); + + m_eol = true; + } + + // this function is a destructive inspector: when it returns true it also + // resets the flag to false so calling it again woulnd't return true any + // more + bool IsStartOfNewLine() + { + if ( !m_eol ) + return false; + + m_eol = false; + + return true; + } + + + bool m_eol; +}; + +#endif // wxUSE_STATTEXT + +// ---------------------------------------------------------------------------- +// wxDialogBase +// ---------------------------------------------------------------------------- + +BEGIN_EVENT_TABLE(wxDialogBase, wxTopLevelWindow) + EVT_BUTTON(wxID_ANY, wxDialogBase::OnButton) + + EVT_CLOSE(wxDialogBase::OnCloseWindow) + + EVT_CHAR_HOOK(wxDialogBase::OnCharHook) + + WX_EVENT_TABLE_CONTROL_CONTAINER(wxDialogBase) +END_EVENT_TABLE() + +WX_DELEGATE_TO_CONTROL_CONTAINER(wxDialogBase, wxTopLevelWindow) + +void wxDialogBase::Init() +{ + m_returnCode = 0; + m_affirmativeId = wxID_OK; + m_escapeId = wxID_ANY; + + // the dialogs have this flag on by default to prevent the events from the + // dialog controls from reaching the parent frame which is usually + // undesirable and can lead to unexpected and hard to find bugs + SetExtraStyle(GetExtraStyle() | wxWS_EX_BLOCK_EVENTS); + + m_container.SetContainerWindow(this); +} + +#if wxUSE_STATTEXT + +void wxTextWrapper::Wrap(wxWindow *win, const wxString& text, int widthMax) +{ + const wxChar *lastSpace = NULL; + wxString line; + + const wxChar *lineStart = text.c_str(); + for ( const wxChar *p = lineStart; ; p++ ) + { + if ( IsStartOfNewLine() ) + { + OnNewLine(); + + lastSpace = NULL; + line.clear(); + lineStart = p; + } + + if ( *p == _T('\n') || *p == _T('\0') ) + { + DoOutputLine(line); + + if ( *p == _T('\0') ) + break; + } + else // not EOL + { + if ( *p == _T(' ') ) + lastSpace = p; + + line += *p; + + if ( widthMax >= 0 && lastSpace ) + { + int width; + win->GetTextExtent(line, &width, NULL); + + if ( width > widthMax ) + { + // remove the last word from this line + line.erase(lastSpace - lineStart, p + 1 - lineStart); + DoOutputLine(line); + + // go back to the last word of this line which we didn't + // output yet + p = lastSpace; + } + } + //else: no wrapping at all or impossible to wrap + } + } +} + +class wxTextSizerWrapper : public wxTextWrapper +{ +public: + wxTextSizerWrapper(wxWindow *win) + { + m_win = win; + m_hLine = 0; + } + + wxSizer *CreateSizer(const wxString& text, int widthMax) + { + m_sizer = new wxBoxSizer(wxVERTICAL); + Wrap(m_win, text, widthMax); + return m_sizer; + } + +protected: + virtual void OnOutputLine(const wxString& line) + { + if ( !line.empty() ) + { + m_sizer->Add(new wxStaticText(m_win, wxID_ANY, line)); + } + else // empty line, no need to create a control for it + { + if ( !m_hLine ) + m_hLine = m_win->GetCharHeight(); + + m_sizer->Add(5, m_hLine); + } + } + +private: + wxWindow *m_win; + wxSizer *m_sizer; + int m_hLine; +}; + +wxSizer *wxDialogBase::CreateTextSizer(const wxString& message) +{ + // I admit that this is complete bogus, but it makes + // message boxes work for pda screens temporarily.. + int widthMax = -1; + const bool is_pda = wxSystemSettings::GetScreenType() <= wxSYS_SCREEN_PDA; + if (is_pda) + { + widthMax = wxSystemSettings::GetMetric( wxSYS_SCREEN_X ) - 25; + } + + // '&' is used as accel mnemonic prefix in the wxWidgets controls but in + // the static messages created by CreateTextSizer() (used by wxMessageBox, + // for example), we don't want this special meaning, so we need to quote it + wxString text(message); + text.Replace(_T("&"), _T("&&")); + + wxTextSizerWrapper wrapper(this); + + return wrapper.CreateSizer(text, widthMax); +} + +class wxLabelWrapper : public wxTextWrapper +{ +public: + void WrapLabel(wxWindow *text, int widthMax) + { + m_text.clear(); + Wrap(text, text->GetLabel(), widthMax); + text->SetLabel(m_text); + } + +protected: + virtual void OnOutputLine(const wxString& line) + { + m_text += line; + } + + virtual void OnNewLine() + { + m_text += _T('\n'); + } + +private: + wxString m_text; +}; + +// NB: don't "factor out" the scope operator, SGI MIPSpro 7.3 (but not 7.4) +// gets confused if it doesn't immediately follow the class name +void +#if defined(__WXGTK__) && !defined(__WXUNIVERSAL__) +wxStaticText:: +#else +wxStaticTextBase:: +#endif +Wrap(int width) +{ + wxLabelWrapper wrapper; + wrapper.WrapLabel(this, width); +} + +#endif // wxUSE_STATTEXT + +wxSizer *wxDialogBase::CreateButtonSizer(long flags) +{ + wxSizer *sizer = NULL; + +#ifdef __SMARTPHONE__ + wxDialog* dialog = (wxDialog*) this; + if ( flags & wxOK ) + dialog->SetLeftMenu(wxID_OK); + + if ( flags & wxCANCEL ) + dialog->SetRightMenu(wxID_CANCEL); + + if ( flags & wxYES ) + dialog->SetLeftMenu(wxID_YES); + + if ( flags & wxNO ) + dialog->SetRightMenu(wxID_NO); +#else // !__SMARTPHONE__ + +#if wxUSE_BUTTON + +#ifdef __POCKETPC__ + // PocketPC guidelines recommend for Ok/Cancel dialogs to use OK button + // located inside caption bar and implement Cancel functionality through + // Undo outside dialog. As native behaviour this will be default here but + // can be replaced with real wxButtons by setting the option below to 1 + if ( (flags & ~(wxCANCEL|wxNO_DEFAULT)) != wxOK || + wxSystemOptions::GetOptionInt(wxT("wince.dialog.real-ok-cancel")) ) +#endif // __POCKETPC__ + { + sizer = CreateStdDialogButtonSizer(flags); + } +#endif // wxUSE_BUTTON + +#endif // __SMARTPHONE__/!__SMARTPHONE__ + + return sizer; +} + +wxSizer *wxDialogBase::CreateSeparatedButtonSizer(long flags) +{ + wxSizer *sizer = CreateButtonSizer(flags); + if ( !sizer ) + return NULL; + + // Mac Human Interface Guidelines recommend not to use static lines as + // grouping elements +#if wxUSE_STATLINE && !defined(__WXMAC__) + wxBoxSizer *topsizer = new wxBoxSizer(wxVERTICAL); + topsizer->Add(new wxStaticLine(this), + wxSizerFlags().Expand().DoubleBorder(wxBOTTOM)); + topsizer->Add(sizer, wxSizerFlags().Expand()); + sizer = topsizer; +#endif // wxUSE_STATLINE + + return sizer; +} + +#if wxUSE_BUTTON + +wxStdDialogButtonSizer *wxDialogBase::CreateStdDialogButtonSizer( long flags ) +{ + wxStdDialogButtonSizer *sizer = new wxStdDialogButtonSizer(); + + wxButton *ok = NULL; + wxButton *yes = NULL; + wxButton *no = NULL; + + if (flags & wxOK) + { + ok = new wxButton(this, wxID_OK); + sizer->AddButton(ok); + } + + if (flags & wxCANCEL) + { + wxButton *cancel = new wxButton(this, wxID_CANCEL); + sizer->AddButton(cancel); + } + + if (flags & wxYES) + { + yes = new wxButton(this, wxID_YES); + sizer->AddButton(yes); + } + + if (flags & wxNO) + { + no = new wxButton(this, wxID_NO); + sizer->AddButton(no); + } + + if (flags & wxHELP) + { + wxButton *help = new wxButton(this, wxID_HELP); + sizer->AddButton(help); + } + + if (flags & wxNO_DEFAULT) + { + if (no) + { + no->SetDefault(); + no->SetFocus(); + } + } + else + { + if (ok) + { + ok->SetDefault(); + ok->SetFocus(); + } + else if (yes) + { + yes->SetDefault(); + yes->SetFocus(); + } + } + + if (flags & wxOK) + SetAffirmativeId(wxID_OK); + else if (flags & wxYES) + SetAffirmativeId(wxID_YES); + + sizer->Realize(); + + return sizer; +} + +#endif // wxUSE_BUTTON + +// ---------------------------------------------------------------------------- +// standard buttons handling +// ---------------------------------------------------------------------------- + +void wxDialogBase::EndDialog(int rc) +{ + if ( IsModal() ) + EndModal(rc); + else + Hide(); +} + +void wxDialogBase::AcceptAndClose() +{ + if ( Validate() && TransferDataFromWindow() ) + { + EndDialog(m_affirmativeId); + } +} + +void wxDialogBase::SetAffirmativeId(int affirmativeId) +{ + m_affirmativeId = affirmativeId; +} + +void wxDialogBase::SetEscapeId(int escapeId) +{ + m_escapeId = escapeId; +} + +bool wxDialogBase::EmulateButtonClickIfPresent(int id) +{ +#if wxUSE_BUTTON + wxButton *btn = wxDynamicCast(FindWindow(id), wxButton); + + if ( !btn || !btn->IsEnabled() || !btn->IsShown() ) + return false; + + wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, id); + event.SetEventObject(btn); + btn->GetEventHandler()->ProcessEvent(event); + + return true; +#else // !wxUSE_BUTTON + wxUnusedVar(id); + return false; +#endif // wxUSE_BUTTON/!wxUSE_BUTTON +} + +bool wxDialogBase::IsEscapeKey(const wxKeyEvent& event) +{ + // for most platforms, Esc key is used to close the dialogs + return event.GetKeyCode() == WXK_ESCAPE && + event.GetModifiers() == wxMOD_NONE; +} + +void wxDialogBase::OnCharHook(wxKeyEvent& event) +{ + if ( event.GetKeyCode() == WXK_ESCAPE ) + { + int idCancel = GetEscapeId(); + switch ( idCancel ) + { + case wxID_NONE: + // don't handle Esc specially at all + break; + + case wxID_ANY: + // this value is special: it means translate Esc to wxID_CANCEL + // but if there is no such button, then fall back to wxID_OK + if ( EmulateButtonClickIfPresent(wxID_CANCEL) ) + return; + idCancel = GetAffirmativeId(); + // fall through + + default: + // translate Esc to button press for the button with given id + if ( EmulateButtonClickIfPresent(idCancel) ) + return; + } + } + + event.Skip(); +} + +void wxDialogBase::OnButton(wxCommandEvent& event) +{ + const int id = event.GetId(); + if ( id == GetAffirmativeId() ) + { + AcceptAndClose(); + } + else if ( id == wxID_APPLY ) + { + if ( Validate() ) + TransferDataFromWindow(); + + // TODO: disable the Apply button until things change again + } + else if ( id == GetEscapeId() || + (id == wxID_CANCEL && GetEscapeId() == wxID_ANY) ) + { + EndDialog(wxID_CANCEL); + } + else // not a standard button + { + event.Skip(); + } +} + +// ---------------------------------------------------------------------------- +// other event handlers +// ---------------------------------------------------------------------------- + +void wxDialogBase::OnCloseWindow(wxCloseEvent& WXUNUSED(event)) +{ + // We'll send a Cancel message by default, which may close the dialog. + // Check for looping if the Cancel event handler calls Close(). + + // Note that if a cancel button and handler aren't present in the dialog, + // nothing will happen when you close the dialog via the window manager, or + // via Close(). We wouldn't want to destroy the dialog by default, since + // the dialog may have been created on the stack. However, this does mean + // that calling dialog->Close() won't delete the dialog unless the handler + // for wxID_CANCEL does so. So use Destroy() if you want to be sure to + // destroy the dialog. The default OnCancel (above) simply ends a modal + // dialog, and hides a modeless dialog. + + // VZ: this is horrible and MT-unsafe. Can't we reuse some of these global + // lists here? don't dare to change it now, but should be done later! + static wxList closing; + + if ( closing.Member(this) ) + return; + + closing.Append(this); + + wxCommandEvent cancelEvent(wxEVT_COMMAND_BUTTON_CLICKED, wxID_CANCEL); + cancelEvent.SetEventObject( this ); + GetEventHandler()->ProcessEvent(cancelEvent); // This may close the dialog + + closing.DeleteObject(this); +} + +void wxDialogBase::OnSysColourChanged(wxSysColourChangedEvent& event) +{ +#ifndef __WXGTK__ + SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE)); + Refresh(); +#endif + event.Skip(); +} diff --git a/Externals/wxWidgets/src/common/dndcmn.cpp b/Externals/wxWidgets/src/common/dndcmn.cpp new file mode 100644 index 0000000000..75b8a8d314 --- /dev/null +++ b/Externals/wxWidgets/src/common/dndcmn.cpp @@ -0,0 +1,31 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: common/dndcmn.cpp +// Author: Robert Roebling +// Modified by: +// Created: 19.10.99 +// RCS-ID: $Id: dndcmn.cpp 43664 2006-11-26 21:50:51Z JS $ +// Copyright: (c) wxWidgets Team +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#include "wx/dnd.h" + +#if wxUSE_DRAG_AND_DROP + +bool wxIsDragResultOk(wxDragResult res) +{ + return res == wxDragCopy || res == wxDragMove || res == wxDragLink; +} + +#endif + diff --git a/Externals/wxWidgets/src/common/dobjcmn.cpp b/Externals/wxWidgets/src/common/dobjcmn.cpp new file mode 100644 index 0000000000..f9404928e6 --- /dev/null +++ b/Externals/wxWidgets/src/common/dobjcmn.cpp @@ -0,0 +1,517 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/common/dobjcmn.cpp +// Purpose: implementation of data object methods common to all platforms +// Author: Vadim Zeitlin, Robert Roebling +// Modified by: +// Created: 19.10.99 +// RCS-ID: $Id: dobjcmn.cpp 49036 2007-10-04 10:10:06Z SC $ +// Copyright: (c) wxWidgets Team +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_DATAOBJ + +#include "wx/dataobj.h" + +#ifndef WX_PRECOMP + #include "wx/app.h" +#endif + +// ---------------------------------------------------------------------------- +// lists +// ---------------------------------------------------------------------------- + +#include "wx/listimpl.cpp" + +WX_DEFINE_LIST(wxSimpleDataObjectList) + +// ---------------------------------------------------------------------------- +// globals +// ---------------------------------------------------------------------------- + +static wxDataFormat dataFormatInvalid; +WXDLLEXPORT const wxDataFormat& wxFormatInvalid = dataFormatInvalid; + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxDataObjectBase +// ---------------------------------------------------------------------------- + +wxDataObjectBase::~wxDataObjectBase() +{ +} + +bool wxDataObjectBase::IsSupported(const wxDataFormat& format, + Direction dir) const +{ + size_t nFormatCount = GetFormatCount( dir ); + if ( nFormatCount == 1 ) + { + return format == GetPreferredFormat( dir ); + } + else + { + wxDataFormat *formats = new wxDataFormat[nFormatCount]; + GetAllFormats( formats, dir ); + + size_t n; + for ( n = 0; n < nFormatCount; n++ ) + { + if ( formats[n] == format ) + break; + } + + delete [] formats; + + // found? + return n < nFormatCount; + } +} + +// ---------------------------------------------------------------------------- +// wxDataObjectComposite +// ---------------------------------------------------------------------------- + +wxDataObjectComposite::wxDataObjectComposite() +{ + m_preferred = 0; + m_receivedFormat = wxFormatInvalid; +} + +wxDataObjectComposite::~wxDataObjectComposite() +{ + WX_CLEAR_LIST( wxSimpleDataObjectList, m_dataObjects ); +} + +wxDataObjectSimple * +wxDataObjectComposite::GetObject(const wxDataFormat& format) const +{ + wxSimpleDataObjectList::compatibility_iterator node = m_dataObjects.GetFirst(); + while ( node ) + { + wxDataObjectSimple *dataObj = node->GetData(); + + if ( dataObj->GetFormat() == format ) + { + return dataObj; + } + + node = node->GetNext(); + } + + return (wxDataObjectSimple *)NULL; +} + +void wxDataObjectComposite::Add(wxDataObjectSimple *dataObject, bool preferred) +{ + if ( preferred ) + m_preferred = m_dataObjects.GetCount(); + + m_dataObjects.Append( dataObject ); +} + +wxDataFormat wxDataObjectComposite::GetReceivedFormat() const +{ + return m_receivedFormat; +} + +wxDataFormat +wxDataObjectComposite::GetPreferredFormat(Direction WXUNUSED(dir)) const +{ + wxSimpleDataObjectList::compatibility_iterator node = m_dataObjects.Item( m_preferred ); + + wxCHECK_MSG( node, wxFormatInvalid, wxT("no preferred format") ); + + wxDataObjectSimple* dataObj = node->GetData(); + + return dataObj->GetFormat(); +} + +#if defined(__WXMSW__) + +size_t wxDataObjectComposite::GetBufferOffset( const wxDataFormat& format ) +{ + wxDataObjectSimple *dataObj = GetObject(format); + + wxCHECK_MSG( dataObj, 0, + wxT("unsupported format in wxDataObjectComposite")); + + return dataObj->GetBufferOffset( format ); +} + + +const void* wxDataObjectComposite::GetSizeFromBuffer( const void* buffer, + size_t* size, + const wxDataFormat& format ) +{ + wxDataObjectSimple *dataObj = GetObject(format); + + wxCHECK_MSG( dataObj, NULL, + wxT("unsupported format in wxDataObjectComposite")); + + return dataObj->GetSizeFromBuffer( buffer, size, format ); +} + + +void* wxDataObjectComposite::SetSizeInBuffer( void* buffer, size_t size, + const wxDataFormat& format ) +{ + wxDataObjectSimple *dataObj = GetObject( format ); + + wxCHECK_MSG( dataObj, NULL, + wxT("unsupported format in wxDataObjectComposite")); + + return dataObj->SetSizeInBuffer( buffer, size, format ); +} + +#endif + +size_t wxDataObjectComposite::GetFormatCount(Direction WXUNUSED(dir)) const +{ + // TODO what about the Get/Set only formats? + return m_dataObjects.GetCount(); +} + +void wxDataObjectComposite::GetAllFormats(wxDataFormat *formats, + Direction WXUNUSED(dir)) const +{ + size_t n = 0; + wxSimpleDataObjectList::compatibility_iterator node; + for ( node = m_dataObjects.GetFirst(); node; node = node->GetNext() ) + { + // TODO if ( !outputOnlyToo ) && this one counts ... + formats[n++] = node->GetData()->GetFormat(); + } +} + +size_t wxDataObjectComposite::GetDataSize(const wxDataFormat& format) const +{ + wxDataObjectSimple *dataObj = GetObject(format); + + wxCHECK_MSG( dataObj, 0, + wxT("unsupported format in wxDataObjectComposite")); + + return dataObj->GetDataSize(); +} + +bool wxDataObjectComposite::GetDataHere(const wxDataFormat& format, + void *buf) const +{ + wxDataObjectSimple *dataObj = GetObject( format ); + + wxCHECK_MSG( dataObj, false, + wxT("unsupported format in wxDataObjectComposite")); + + return dataObj->GetDataHere( buf ); +} + +bool wxDataObjectComposite::SetData(const wxDataFormat& format, + size_t len, + const void *buf) +{ + wxDataObjectSimple *dataObj = GetObject( format ); + + wxCHECK_MSG( dataObj, false, + wxT("unsupported format in wxDataObjectComposite")); + + m_receivedFormat = format; + return dataObj->SetData( len, buf ); +} + +// ---------------------------------------------------------------------------- +// wxTextDataObject +// ---------------------------------------------------------------------------- + +#if defined(__WXGTK20__) && wxUSE_UNICODE + +static inline wxMBConv& GetConv(const wxDataFormat& format) +{ + // use UTF8 for wxDF_UNICODETEXT and UCS4 for wxDF_TEXT + return format == wxDF_UNICODETEXT ? wxConvUTF8 : wxConvLibc; +} + +size_t wxTextDataObject::GetDataSize(const wxDataFormat& format) const +{ + wxCharBuffer buffer = GetConv(format).cWX2MB( GetText().c_str() ); + + return buffer ? strlen( buffer ) : 0; +} + +bool wxTextDataObject::GetDataHere(const wxDataFormat& format, void *buf) const +{ + if ( !buf ) + return false; + + wxCharBuffer buffer = GetConv(format).cWX2MB( GetText().c_str() ); + if ( !buffer ) + return false; + + memcpy( (char*) buf, buffer, GetDataSize(format) ); + // strcpy( (char*) buf, buffer ); + + return true; +} + +bool wxTextDataObject::SetData(const wxDataFormat& format, + size_t WXUNUSED(len), const void *buf) +{ + if ( buf == NULL ) + return false; + + wxWCharBuffer buffer = GetConv(format).cMB2WX( (const char*)buf ); + + SetText( buffer ); + + return true; +} + +#elif wxUSE_UNICODE && defined(__WXMAC__) + +static wxMBConvUTF16 sUTF16Converter; + +static inline wxMBConv& GetConv(const wxDataFormat& format) +{ + return + format == wxDF_UNICODETEXT + ? (wxMBConv&) sUTF16Converter + : (wxMBConv&) wxConvLocal; +} + +size_t wxTextDataObject::GetDataSize(const wxDataFormat& format) const +{ + wxCharBuffer buffer = GetConv(format).cWX2MB( GetText().c_str() ); + if ( !buffer ) + return 0; + + size_t len = GetConv(format).WC2MB( NULL, GetText().c_str(), 0 ); + return len; +} + +bool wxTextDataObject::GetDataHere(const wxDataFormat& format, void *buf) const +{ + if ( buf == NULL ) + return false; + + wxCharBuffer buffer = GetConv(format).cWX2MB( GetText().c_str() ); + if ( !buffer ) + return false; + + size_t len = GetConv(format).WC2MB( NULL, GetText().c_str(), 0 ); + memcpy( (char*)buf, (const char*)buffer, len ); + + return true; +} + +bool wxTextDataObject::SetData(const wxDataFormat& format, + size_t WXUNUSED(len), const void *buf) +{ + if ( buf == NULL ) + return false; + + wxWCharBuffer buffer = GetConv(format).cMB2WX( (const char*)buf ); + + SetText( buffer ); + + return true; +} + +#else + +size_t wxTextDataObject::GetDataSize() const +{ + return GetTextLength() * sizeof(wxChar); +} + +bool wxTextDataObject::GetDataHere(void *buf) const +{ + wxStrcpy( (wxChar*)buf, GetText().c_str() ); + + return true; +} + +bool wxTextDataObject::SetData(size_t WXUNUSED(len), const void *buf) +{ + SetText( wxString((const wxChar*)buf) ); + + return true; +} + +#endif + +// ---------------------------------------------------------------------------- +// wxFileDataObjectBase +// ---------------------------------------------------------------------------- + +// VZ: I don't need this in MSW finally, so if it is needed in wxGTK, it should +// be moved to gtk/dataobj.cpp +#if 0 + +wxString wxFileDataObjectBase::GetFilenames() const +{ + wxString str; + size_t count = m_filenames.GetCount(); + for ( size_t n = 0; n < count; n++ ) + { + str << m_filenames[n] << wxT('\0'); + } + + return str; +} + +void wxFileDataObjectBase::SetFilenames(const wxChar* filenames) +{ + m_filenames.Empty(); + + wxString current; + for ( const wxChar *pc = filenames; ; pc++ ) + { + if ( *pc ) + { + current += *pc; + } + else + { + if ( !current ) + { + // 2 consecutive NULs - this is the end of the string + break; + } + + m_filenames.Add(current); + current.Empty(); + } + } +} + +#endif + +// ---------------------------------------------------------------------------- +// wxCustomDataObject +// ---------------------------------------------------------------------------- + +wxCustomDataObject::wxCustomDataObject(const wxDataFormat& format) + : wxDataObjectSimple(format) +{ + m_data = NULL; + m_size = 0; +} + +wxCustomDataObject::~wxCustomDataObject() +{ + Free(); +} + +void wxCustomDataObject::TakeData(size_t size, void *data) +{ + Free(); + + m_size = size; + m_data = data; +} + +void *wxCustomDataObject::Alloc(size_t size) +{ + return (void *)new char[size]; +} + +void wxCustomDataObject::Free() +{ + delete [] (char*)m_data; + m_size = 0; + m_data = (void*)NULL; +} + +size_t wxCustomDataObject::GetDataSize() const +{ + return GetSize(); +} + +bool wxCustomDataObject::GetDataHere(void *buf) const +{ + if ( buf == NULL ) + return false; + + void *data = GetData(); + if ( data == NULL ) + return false; + + memcpy( buf, data, GetSize() ); + + return true; +} + +bool wxCustomDataObject::SetData(size_t size, const void *buf) +{ + Free(); + + m_data = Alloc(size); + if ( m_data == NULL ) + return false; + + m_size = size; + memcpy( m_data, buf, m_size ); + + return true; +} + +// ============================================================================ +// some common dnd related code +// ============================================================================ + +#if wxUSE_DRAG_AND_DROP + +#include "wx/dnd.h" + +// ---------------------------------------------------------------------------- +// wxTextDropTarget +// ---------------------------------------------------------------------------- + +// NB: we can't use "new" in ctor initializer lists because this provokes an +// internal compiler error with VC++ 5.0 (hey, even gcc compiles this!), +// so use SetDataObject() instead + +wxTextDropTarget::wxTextDropTarget() +{ + SetDataObject(new wxTextDataObject); +} + +wxDragResult wxTextDropTarget::OnData(wxCoord x, wxCoord y, wxDragResult def) +{ + if ( !GetData() ) + return wxDragNone; + + wxTextDataObject *dobj = (wxTextDataObject *)m_dataObject; + return OnDropText( x, y, dobj->GetText() ) ? def : wxDragNone; +} + +// ---------------------------------------------------------------------------- +// wxFileDropTarget +// ---------------------------------------------------------------------------- + +wxFileDropTarget::wxFileDropTarget() +{ + SetDataObject(new wxFileDataObject); +} + +wxDragResult wxFileDropTarget::OnData(wxCoord x, wxCoord y, wxDragResult def) +{ + if ( !GetData() ) + return wxDragNone; + + wxFileDataObject *dobj = (wxFileDataObject *)m_dataObject; + return OnDropFiles( x, y, dobj->GetFilenames() ) ? def : wxDragNone; +} + +#endif // wxUSE_DRAG_AND_DROP + +#endif // wxUSE_DATAOBJ diff --git a/Externals/wxWidgets/src/common/docmdi.cpp b/Externals/wxWidgets/src/common/docmdi.cpp new file mode 100644 index 0000000000..250add1be9 --- /dev/null +++ b/Externals/wxWidgets/src/common/docmdi.cpp @@ -0,0 +1,204 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: docmdi.cpp +// Purpose: Frame classes for MDI document/view applications +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: docmdi.cpp 35650 2005-09-23 12:56:45Z MR $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_MDI_ARCHITECTURE + +#include "wx/docmdi.h" + +/* + * Docview MDI parent frame + */ + +IMPLEMENT_CLASS(wxDocMDIParentFrame, wxMDIParentFrame) + +BEGIN_EVENT_TABLE(wxDocMDIParentFrame, wxMDIParentFrame) + EVT_MENU(wxID_EXIT, wxDocMDIParentFrame::OnExit) + EVT_MENU_RANGE(wxID_FILE1, wxID_FILE9, wxDocMDIParentFrame::OnMRUFile) + EVT_CLOSE(wxDocMDIParentFrame::OnCloseWindow) +END_EVENT_TABLE() + +wxDocMDIParentFrame::wxDocMDIParentFrame() +{ + Init(); +} + +wxDocMDIParentFrame::wxDocMDIParentFrame(wxDocManager *manager, wxFrame *frame, wxWindowID id, const wxString& title, + const wxPoint& pos, const wxSize& size, long style, const wxString& name) +{ + Init(); + Create(manager, frame, id, title, pos, size, style, name); +} + +bool wxDocMDIParentFrame::Create(wxDocManager *manager, wxFrame *frame, wxWindowID id, const wxString& title, + const wxPoint& pos, const wxSize& size, long style, const wxString& name) +{ + m_docManager = manager; + return wxMDIParentFrame::Create(frame, id, title, pos, size, style, name); +} + +void wxDocMDIParentFrame::OnExit(wxCommandEvent& WXUNUSED(event)) +{ + Close(); +} + +void wxDocMDIParentFrame::Init() +{ + m_docManager = NULL; +} + +void wxDocMDIParentFrame::OnMRUFile(wxCommandEvent& event) +{ + wxString f(m_docManager->GetHistoryFile(event.GetId() - wxID_FILE1)); + if (!f.empty()) + (void)m_docManager->CreateDocument(f, wxDOC_SILENT); +} + +// Extend event processing to search the view's event table +bool wxDocMDIParentFrame::ProcessEvent(wxEvent& event) +{ + // Try the document manager, then do default processing + if (!m_docManager || !m_docManager->ProcessEvent(event)) + return wxEvtHandler::ProcessEvent(event); + else + return true; +} + +void wxDocMDIParentFrame::OnCloseWindow(wxCloseEvent& event) +{ + if (m_docManager->Clear(!event.CanVeto())) + { + this->Destroy(); + } + else + event.Veto(); +} + + +/* + * Default document child frame for MDI children + */ + +IMPLEMENT_CLASS(wxDocMDIChildFrame, wxMDIChildFrame) + +BEGIN_EVENT_TABLE(wxDocMDIChildFrame, wxMDIChildFrame) + EVT_ACTIVATE(wxDocMDIChildFrame::OnActivate) + EVT_CLOSE(wxDocMDIChildFrame::OnCloseWindow) +END_EVENT_TABLE() + +void wxDocMDIChildFrame::Init() +{ + m_childDocument = (wxDocument*) NULL; + m_childView = (wxView*) NULL; +} + +wxDocMDIChildFrame::wxDocMDIChildFrame() +{ + Init(); +} + +wxDocMDIChildFrame::wxDocMDIChildFrame(wxDocument *doc, wxView *view, wxMDIParentFrame *frame, wxWindowID id, + const wxString& title, const wxPoint& pos, const wxSize& size, long style, const wxString& name) +{ + Init(); + Create(doc, view, frame, id, title, pos, size, style, name); +} + +bool wxDocMDIChildFrame::Create(wxDocument *doc, wxView *view, wxMDIParentFrame *frame, wxWindowID id, + const wxString& title, const wxPoint& pos, const wxSize& size, long style, const wxString& name) +{ + m_childDocument = doc; + m_childView = view; + if (wxMDIChildFrame::Create(frame, id, title, pos, size, style, name)) + { + if (view) + view->SetFrame(this); + return true; + } + + return false; +} + +wxDocMDIChildFrame::~wxDocMDIChildFrame(void) +{ + m_childView = (wxView *) NULL; +} + +// Extend event processing to search the view's event table +bool wxDocMDIChildFrame::ProcessEvent(wxEvent& event) +{ + static wxEvent *ActiveEvent = NULL; + + // Break recursion loops + if (ActiveEvent == &event) + return false; + + ActiveEvent = &event; + + bool ret; + if ( !m_childView || ! m_childView->ProcessEvent(event) ) + { + // Only hand up to the parent if it's a menu command + if (!event.IsKindOf(CLASSINFO(wxCommandEvent)) || !GetParent() || !GetParent()->ProcessEvent(event)) + ret = wxEvtHandler::ProcessEvent(event); + else + ret = true; + } + else + ret = true; + + ActiveEvent = NULL; + return ret; +} + +void wxDocMDIChildFrame::OnActivate(wxActivateEvent& event) +{ + wxMDIChildFrame::OnActivate(event); + + if (event.GetActive() && m_childView) + m_childView->Activate(event.GetActive()); +} + +void wxDocMDIChildFrame::OnCloseWindow(wxCloseEvent& event) +{ + // Close view but don't delete the frame while doing so! + // ...since it will be deleted by wxWidgets if we return true. + if (m_childView) + { + bool ans = event.CanVeto() + ? m_childView->Close(false) // false means don't delete associated window + : true; // Must delete. + + if (ans) + { + m_childView->Activate(false); + delete m_childView; + m_childView = (wxView *) NULL; + m_childDocument = (wxDocument *) NULL; + + this->Destroy(); + } + else + event.Veto(); + } + else + event.Veto(); +} + +#endif + // wxUSE_DOC_VIEW_ARCHITECTURE + diff --git a/Externals/wxWidgets/src/common/docview.cpp b/Externals/wxWidgets/src/common/docview.cpp new file mode 100644 index 0000000000..fe213a1fd5 --- /dev/null +++ b/Externals/wxWidgets/src/common/docview.cpp @@ -0,0 +1,2474 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/docview.cpp +// Purpose: Document/view classes +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: docview.cpp 49483 2007-10-27 09:25:04Z JS $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_DOC_VIEW_ARCHITECTURE + +#include "wx/docview.h" + +#ifndef WX_PRECOMP + #include "wx/list.h" + #include "wx/string.h" + #include "wx/utils.h" + #include "wx/app.h" + #include "wx/dc.h" + #include "wx/dialog.h" + #include "wx/menu.h" + #include "wx/filedlg.h" + #include "wx/intl.h" + #include "wx/log.h" + #include "wx/msgdlg.h" + #include "wx/mdi.h" + #include "wx/choicdlg.h" +#endif + +#include "wx/ffile.h" + +#ifdef __WXMAC__ + #include "wx/filename.h" +#endif + +#if wxUSE_PRINTING_ARCHITECTURE + #include "wx/prntbase.h" + #include "wx/printdlg.h" +#endif + +#include "wx/confbase.h" +#include "wx/file.h" +#include "wx/cmdproc.h" +#include "wx/tokenzr.h" + +#include +#include + +#if wxUSE_STD_IOSTREAM + #include "wx/ioswrap.h" + #if wxUSE_IOSTREAMH + #include + #else + #include + #endif +#else + #include "wx/wfstream.h" +#endif + +// ---------------------------------------------------------------------------- +// wxWidgets macros +// ---------------------------------------------------------------------------- + +IMPLEMENT_ABSTRACT_CLASS(wxDocument, wxEvtHandler) +IMPLEMENT_ABSTRACT_CLASS(wxView, wxEvtHandler) +IMPLEMENT_ABSTRACT_CLASS(wxDocTemplate, wxObject) +IMPLEMENT_DYNAMIC_CLASS(wxDocManager, wxEvtHandler) +IMPLEMENT_CLASS(wxDocChildFrame, wxFrame) +IMPLEMENT_CLASS(wxDocParentFrame, wxFrame) + +#if wxUSE_PRINTING_ARCHITECTURE + IMPLEMENT_DYNAMIC_CLASS(wxDocPrintout, wxPrintout) +#endif + +IMPLEMENT_DYNAMIC_CLASS(wxFileHistory, wxObject) + +// ---------------------------------------------------------------------------- +// function prototypes +// ---------------------------------------------------------------------------- + +static wxWindow* wxFindSuitableParent(void); + +// ---------------------------------------------------------------------------- +// local constants +// ---------------------------------------------------------------------------- + +static const wxChar *s_MRUEntryFormat = wxT("&%d %s"); + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// local functions +// ---------------------------------------------------------------------------- + +static wxString FindExtension(const wxChar *path) +{ + wxString ext; + wxSplitPath(path, NULL, NULL, &ext); + + // VZ: extensions are considered not case sensitive - is this really a good + // idea? + return ext.MakeLower(); +} + +// ---------------------------------------------------------------------------- +// Definition of wxDocument +// ---------------------------------------------------------------------------- + +wxDocument::wxDocument(wxDocument *parent) +{ + m_documentModified = false; + m_documentParent = parent; + m_documentTemplate = (wxDocTemplate *) NULL; + m_commandProcessor = (wxCommandProcessor*) NULL; + m_savedYet = false; +} + +bool wxDocument::DeleteContents() +{ + return true; +} + +wxDocument::~wxDocument() +{ + DeleteContents(); + + if (m_commandProcessor) + delete m_commandProcessor; + + if (GetDocumentManager()) + GetDocumentManager()->RemoveDocument(this); + + // Not safe to do here, since it'll invoke virtual view functions + // expecting to see valid derived objects: and by the time we get here, + // we've called destructors higher up. + //DeleteAllViews(); +} + +bool wxDocument::Close() +{ + if (OnSaveModified()) + return OnCloseDocument(); + else + return false; +} + +bool wxDocument::OnCloseDocument() +{ + // Tell all views that we're about to close + NotifyClosing(); + DeleteContents(); + Modify(false); + return true; +} + +// Note that this implicitly deletes the document when the last view is +// deleted. +bool wxDocument::DeleteAllViews() +{ + wxDocManager* manager = GetDocumentManager(); + + // first check if all views agree to be closed + const wxList::iterator end = m_documentViews.end(); + for ( wxList::iterator i = m_documentViews.begin(); i != end; ++i ) + { + wxView *view = (wxView *)*i; + if ( !view->Close() ) + return false; + } + + // all views agreed to close, now do close them + if ( m_documentViews.empty() ) + { + // normally the document would be implicitly deleted when the last view + // is, but if don't have any views, do it here instead + if ( manager && manager->GetDocuments().Member(this) ) + delete this; + } + else // have views + { + // as we delete elements we iterate over, don't use the usual "from + // begin to end" loop + for ( ;; ) + { + wxView *view = (wxView *)*m_documentViews.begin(); + + bool isLastOne = m_documentViews.size() == 1; + + // this always deletes the node implicitly and if this is the last + // view also deletes this object itself (also implicitly, great), + // so we can't test for m_documentViews.empty() after calling this! + delete view; + + if ( isLastOne ) + break; + } + } + + return true; +} + +wxView *wxDocument::GetFirstView() const +{ + if (m_documentViews.GetCount() == 0) + return (wxView *) NULL; + return (wxView *)m_documentViews.GetFirst()->GetData(); +} + +wxDocManager *wxDocument::GetDocumentManager() const +{ + return (m_documentTemplate ? m_documentTemplate->GetDocumentManager() : (wxDocManager*) NULL); +} + +bool wxDocument::OnNewDocument() +{ + if (!OnSaveModified()) + return false; + + if (OnCloseDocument()==false) return false; + DeleteContents(); + Modify(false); + SetDocumentSaved(false); + + wxString name; + GetDocumentManager()->MakeDefaultName(name); + SetTitle(name); + SetFilename(name, true); + + return true; +} + +bool wxDocument::Save() +{ + if (!IsModified() && m_savedYet) + return true; + + if ( m_documentFile.empty() || !m_savedYet ) + return SaveAs(); + + return OnSaveDocument(m_documentFile); +} + +bool wxDocument::SaveAs() +{ + wxDocTemplate *docTemplate = GetDocumentTemplate(); + if (!docTemplate) + return false; + +#if defined(__WXMSW__) || defined(__WXGTK__) || defined(__WXMAC__) + wxString filter = docTemplate->GetDescription() + wxT(" (") + docTemplate->GetFileFilter() + wxT(")|") + docTemplate->GetFileFilter(); + + // Now see if there are some other template with identical view and document + // classes, whose filters may also be used. + + if (docTemplate->GetViewClassInfo() && docTemplate->GetDocClassInfo()) + { + wxList::compatibility_iterator node = docTemplate->GetDocumentManager()->GetTemplates().GetFirst(); + while (node) + { + wxDocTemplate *t = (wxDocTemplate*) node->GetData(); + + if (t->IsVisible() && t != docTemplate && + t->GetViewClassInfo() == docTemplate->GetViewClassInfo() && + t->GetDocClassInfo() == docTemplate->GetDocClassInfo()) + { + // add a '|' to separate this filter from the previous one + if ( !filter.empty() ) + filter << wxT('|'); + + filter << t->GetDescription() << wxT(" (") << t->GetFileFilter() << wxT(") |") + << t->GetFileFilter(); + } + + node = node->GetNext(); + } + } +#else + wxString filter = docTemplate->GetFileFilter() ; +#endif + wxString tmp = wxFileSelector(_("Save as"), + docTemplate->GetDirectory(), + wxFileNameFromPath(GetFilename()), + docTemplate->GetDefaultExtension(), + filter, + wxFD_SAVE | wxFD_OVERWRITE_PROMPT, + GetDocumentWindow()); + + if (tmp.empty()) + return false; + + wxString fileName(tmp); + wxString path, name, ext; + wxSplitPath(fileName, & path, & name, & ext); + + if (ext.empty()) + { + fileName += wxT("."); + fileName += docTemplate->GetDefaultExtension(); + } + + SetFilename(fileName); + SetTitle(wxFileNameFromPath(fileName)); + + // Notify the views that the filename has changed + wxList::compatibility_iterator node = m_documentViews.GetFirst(); + while (node) + { + wxView *view = (wxView *)node->GetData(); + view->OnChangeFilename(); + node = node->GetNext(); + } + + // Files that were not saved correctly are not added to the FileHistory. + if (!OnSaveDocument(m_documentFile)) + return false; + + // A file that doesn't use the default extension of its document template cannot be opened + // via the FileHistory, so we do not add it. + if (docTemplate->FileMatchesTemplate(fileName)) + { + GetDocumentManager()->AddFileToHistory(fileName); + } + else + { + // The user will probably not be able to open the file again, so + // we could warn about the wrong file-extension here. + } + return true; +} + +bool wxDocument::OnSaveDocument(const wxString& file) +{ + if ( !file ) + return false; + + if ( !DoSaveDocument(file) ) + return false; + + Modify(false); + SetFilename(file); + SetDocumentSaved(true); +#ifdef __WXMAC__ + wxFileName fn(file) ; + fn.MacSetDefaultTypeAndCreator() ; +#endif + return true; +} + +bool wxDocument::OnOpenDocument(const wxString& file) +{ + if (!OnSaveModified()) + return false; + + if ( !DoOpenDocument(file) ) + return false; + + SetFilename(file, true); + Modify(false); + m_savedYet = true; + + UpdateAllViews(); + + return true; +} + +#if wxUSE_STD_IOSTREAM +wxSTD istream& wxDocument::LoadObject(wxSTD istream& stream) +#else +wxInputStream& wxDocument::LoadObject(wxInputStream& stream) +#endif +{ + return stream; +} + +#if wxUSE_STD_IOSTREAM +wxSTD ostream& wxDocument::SaveObject(wxSTD ostream& stream) +#else +wxOutputStream& wxDocument::SaveObject(wxOutputStream& stream) +#endif +{ + return stream; +} + +bool wxDocument::Revert() +{ + return false; +} + + +// Get title, or filename if no title, else unnamed +bool wxDocument::GetPrintableName(wxString& buf) const +{ + if (!m_documentTitle.empty()) + { + buf = m_documentTitle; + return true; + } + else if (!m_documentFile.empty()) + { + buf = wxFileNameFromPath(m_documentFile); + return true; + } + else + { + buf = _("unnamed"); + return true; + } +} + +wxWindow *wxDocument::GetDocumentWindow() const +{ + wxView *view = GetFirstView(); + if (view) + return view->GetFrame(); + else + return wxTheApp->GetTopWindow(); +} + +wxCommandProcessor *wxDocument::OnCreateCommandProcessor() +{ + return new wxCommandProcessor; +} + +// true if safe to close +bool wxDocument::OnSaveModified() +{ + if (IsModified()) + { + wxString title; + GetPrintableName(title); + + wxString msgTitle; + if (!wxTheApp->GetAppName().empty()) + msgTitle = wxTheApp->GetAppName(); + else + msgTitle = wxString(_("Warning")); + + wxString prompt; + prompt.Printf(_("Do you want to save changes to document %s?"), + (const wxChar *)title); + int res = wxMessageBox(prompt, msgTitle, + wxYES_NO|wxCANCEL|wxICON_QUESTION, + GetDocumentWindow()); + if (res == wxNO) + { + Modify(false); + return true; + } + else if (res == wxYES) + return Save(); + else if (res == wxCANCEL) + return false; + } + return true; +} + +bool wxDocument::Draw(wxDC& WXUNUSED(context)) +{ + return true; +} + +bool wxDocument::AddView(wxView *view) +{ + if (!m_documentViews.Member(view)) + { + m_documentViews.Append(view); + OnChangedViewList(); + } + return true; +} + +bool wxDocument::RemoveView(wxView *view) +{ + (void)m_documentViews.DeleteObject(view); + OnChangedViewList(); + return true; +} + +bool wxDocument::OnCreate(const wxString& WXUNUSED(path), long flags) +{ + if (GetDocumentTemplate()->CreateView(this, flags)) + return true; + else + return false; +} + +// Called after a view is added or removed. +// The default implementation deletes the document if +// there are no more views. +void wxDocument::OnChangedViewList() +{ + if (m_documentViews.GetCount() == 0) + { + if (OnSaveModified()) + { + delete this; + } + } +} + +void wxDocument::UpdateAllViews(wxView *sender, wxObject *hint) +{ + wxList::compatibility_iterator node = m_documentViews.GetFirst(); + while (node) + { + wxView *view = (wxView *)node->GetData(); + if (view != sender) + view->OnUpdate(sender, hint); + node = node->GetNext(); + } +} + +void wxDocument::NotifyClosing() +{ + wxList::compatibility_iterator node = m_documentViews.GetFirst(); + while (node) + { + wxView *view = (wxView *)node->GetData(); + view->OnClosingDocument(); + node = node->GetNext(); + } +} + +void wxDocument::SetFilename(const wxString& filename, bool notifyViews) +{ + m_documentFile = filename; + if ( notifyViews ) + { + // Notify the views that the filename has changed + wxList::compatibility_iterator node = m_documentViews.GetFirst(); + while (node) + { + wxView *view = (wxView *)node->GetData(); + view->OnChangeFilename(); + node = node->GetNext(); + } + } +} + +bool wxDocument::DoSaveDocument(const wxString& file) +{ + wxString msgTitle; + if (!wxTheApp->GetAppName().empty()) + msgTitle = wxTheApp->GetAppName(); + else + msgTitle = wxString(_("File error")); + +#if wxUSE_STD_IOSTREAM + wxSTD ofstream store(file.mb_str(), wxSTD ios::binary); + if (store.fail() || store.bad()) +#else + wxFileOutputStream store(file); + if (store.GetLastError() != wxSTREAM_NO_ERROR) +#endif + { + (void)wxMessageBox(_("Sorry, could not open this file for saving."), msgTitle, wxOK | wxICON_EXCLAMATION, + GetDocumentWindow()); + // Saving error + return false; + } + if (!SaveObject(store)) + { + (void)wxMessageBox(_("Sorry, could not save this file."), msgTitle, wxOK | wxICON_EXCLAMATION, + GetDocumentWindow()); + // Saving error + return false; + } + + return true; +} + +bool wxDocument::DoOpenDocument(const wxString& file) +{ +#if wxUSE_STD_IOSTREAM + wxSTD ifstream store(file.mb_str(), wxSTD ios::binary); + if (!store.fail() && !store.bad()) +#else + wxFileInputStream store(file); + if (store.GetLastError() == wxSTREAM_NO_ERROR) +#endif + { +#if wxUSE_STD_IOSTREAM + LoadObject(store); + if ( !!store || store.eof() ) +#else + int res = LoadObject(store).GetLastError(); + if ( res == wxSTREAM_NO_ERROR || res == wxSTREAM_EOF ) +#endif + return true; + } + + wxLogError(_("Sorry, could not open this file.")); + return false; +} + + +// ---------------------------------------------------------------------------- +// Document view +// ---------------------------------------------------------------------------- + +wxView::wxView() +{ + m_viewDocument = (wxDocument*) NULL; + + m_viewFrame = (wxFrame *) NULL; +} + +wxView::~wxView() +{ + GetDocumentManager()->ActivateView(this, false); + m_viewDocument->RemoveView(this); +} + +// Extend event processing to search the document's event table +bool wxView::ProcessEvent(wxEvent& event) +{ + if ( !GetDocument() || !GetDocument()->ProcessEvent(event) ) + return wxEvtHandler::ProcessEvent(event); + + return true; +} + +void wxView::OnActivateView(bool WXUNUSED(activate), wxView *WXUNUSED(activeView), wxView *WXUNUSED(deactiveView)) +{ +} + +void wxView::OnPrint(wxDC *dc, wxObject *WXUNUSED(info)) +{ + OnDraw(dc); +} + +void wxView::OnUpdate(wxView *WXUNUSED(sender), wxObject *WXUNUSED(hint)) +{ +} + +void wxView::OnChangeFilename() +{ + // GetFrame can return wxWindow rather than wxTopLevelWindow due to + // generic MDI implementation so use SetLabel rather than SetTitle. + // It should cause SetTitle() for top level windows. + wxWindow *win = GetFrame(); + if (!win) return; + + wxDocument *doc = GetDocument(); + if (!doc) return; + + wxString name; + doc->GetPrintableName(name); + win->SetLabel(name); +} + +void wxView::SetDocument(wxDocument *doc) +{ + m_viewDocument = doc; + if (doc) + doc->AddView(this); +} + +bool wxView::Close(bool deleteWindow) +{ + if (OnClose(deleteWindow)) + return true; + else + return false; +} + +void wxView::Activate(bool activate) +{ + if (GetDocument() && GetDocumentManager()) + { + OnActivateView(activate, this, GetDocumentManager()->GetCurrentView()); + GetDocumentManager()->ActivateView(this, activate); + } +} + +bool wxView::OnClose(bool WXUNUSED(deleteWindow)) +{ + return GetDocument() ? GetDocument()->Close() : true; +} + +#if wxUSE_PRINTING_ARCHITECTURE +wxPrintout *wxView::OnCreatePrintout() +{ + return new wxDocPrintout(this); +} +#endif // wxUSE_PRINTING_ARCHITECTURE + +// ---------------------------------------------------------------------------- +// wxDocTemplate +// ---------------------------------------------------------------------------- + +wxDocTemplate::wxDocTemplate(wxDocManager *manager, + const wxString& descr, + const wxString& filter, + const wxString& dir, + const wxString& ext, + const wxString& docTypeName, + const wxString& viewTypeName, + wxClassInfo *docClassInfo, + wxClassInfo *viewClassInfo, + long flags) +{ + m_documentManager = manager; + m_description = descr; + m_directory = dir; + m_defaultExt = ext; + m_fileFilter = filter; + m_flags = flags; + m_docTypeName = docTypeName; + m_viewTypeName = viewTypeName; + m_documentManager->AssociateTemplate(this); + + m_docClassInfo = docClassInfo; + m_viewClassInfo = viewClassInfo; +} + +wxDocTemplate::~wxDocTemplate() +{ + m_documentManager->DisassociateTemplate(this); +} + +// Tries to dynamically construct an object of the right class. +wxDocument *wxDocTemplate::CreateDocument(const wxString& path, long flags) +{ + wxDocument *doc = DoCreateDocument(); + if ( doc == NULL ) + return (wxDocument *) NULL; + + if (InitDocument(doc, path, flags)) + { + return doc; + } + else + { + return (wxDocument *) NULL; + } +} + +bool wxDocTemplate::InitDocument(wxDocument* doc, const wxString& path, long flags) +{ + doc->SetFilename(path); + doc->SetDocumentTemplate(this); + GetDocumentManager()->AddDocument(doc); + doc->SetCommandProcessor(doc->OnCreateCommandProcessor()); + + if (doc->OnCreate(path, flags)) + return true; + else + { + if (GetDocumentManager()->GetDocuments().Member(doc)) + doc->DeleteAllViews(); + return false; + } +} + +wxView *wxDocTemplate::CreateView(wxDocument *doc, long flags) +{ + wxView *view = DoCreateView(); + if ( view == NULL ) + return (wxView *) NULL; + + view->SetDocument(doc); + if (view->OnCreate(doc, flags)) + { + return view; + } + else + { + delete view; + return (wxView *) NULL; + } +} + +// The default (very primitive) format detection: check is the extension is +// that of the template +bool wxDocTemplate::FileMatchesTemplate(const wxString& path) +{ + wxStringTokenizer parser (GetFileFilter(), wxT(";")); + wxString anything = wxT ("*"); + while (parser.HasMoreTokens()) + { + wxString filter = parser.GetNextToken(); + wxString filterExt = FindExtension (filter); + if ( filter.IsSameAs (anything) || + filterExt.IsSameAs (anything) || + filterExt.IsSameAs (FindExtension (path)) ) + return true; + } + return GetDefaultExtension().IsSameAs(FindExtension(path)); +} + +wxDocument *wxDocTemplate::DoCreateDocument() +{ + if (!m_docClassInfo) + return (wxDocument *) NULL; + + return (wxDocument *)m_docClassInfo->CreateObject(); +} + +wxView *wxDocTemplate::DoCreateView() +{ + if (!m_viewClassInfo) + return (wxView *) NULL; + + return (wxView *)m_viewClassInfo->CreateObject(); +} + +// ---------------------------------------------------------------------------- +// wxDocManager +// ---------------------------------------------------------------------------- + +BEGIN_EVENT_TABLE(wxDocManager, wxEvtHandler) + EVT_MENU(wxID_OPEN, wxDocManager::OnFileOpen) + EVT_MENU(wxID_CLOSE, wxDocManager::OnFileClose) + EVT_MENU(wxID_CLOSE_ALL, wxDocManager::OnFileCloseAll) + EVT_MENU(wxID_REVERT, wxDocManager::OnFileRevert) + EVT_MENU(wxID_NEW, wxDocManager::OnFileNew) + EVT_MENU(wxID_SAVE, wxDocManager::OnFileSave) + EVT_MENU(wxID_SAVEAS, wxDocManager::OnFileSaveAs) + EVT_MENU(wxID_UNDO, wxDocManager::OnUndo) + EVT_MENU(wxID_REDO, wxDocManager::OnRedo) + + EVT_UPDATE_UI(wxID_OPEN, wxDocManager::OnUpdateFileOpen) + EVT_UPDATE_UI(wxID_CLOSE, wxDocManager::OnUpdateFileClose) + EVT_UPDATE_UI(wxID_CLOSE_ALL, wxDocManager::OnUpdateFileClose) + EVT_UPDATE_UI(wxID_REVERT, wxDocManager::OnUpdateFileRevert) + EVT_UPDATE_UI(wxID_NEW, wxDocManager::OnUpdateFileNew) + EVT_UPDATE_UI(wxID_SAVE, wxDocManager::OnUpdateFileSave) + EVT_UPDATE_UI(wxID_SAVEAS, wxDocManager::OnUpdateFileSaveAs) + EVT_UPDATE_UI(wxID_UNDO, wxDocManager::OnUpdateUndo) + EVT_UPDATE_UI(wxID_REDO, wxDocManager::OnUpdateRedo) + +#if wxUSE_PRINTING_ARCHITECTURE + EVT_MENU(wxID_PRINT, wxDocManager::OnPrint) + EVT_MENU(wxID_PREVIEW, wxDocManager::OnPreview) + + EVT_UPDATE_UI(wxID_PRINT, wxDocManager::OnUpdatePrint) + EVT_UPDATE_UI(wxID_PREVIEW, wxDocManager::OnUpdatePreview) +#endif +END_EVENT_TABLE() + +wxDocManager* wxDocManager::sm_docManager = (wxDocManager*) NULL; + +wxDocManager::wxDocManager(long flags, bool initialize) +{ + m_defaultDocumentNameCounter = 1; + m_flags = flags; + m_currentView = (wxView *) NULL; + m_maxDocsOpen = 10000; + m_fileHistory = (wxFileHistory *) NULL; + if (initialize) + Initialize(); + sm_docManager = this; +} + +wxDocManager::~wxDocManager() +{ + Clear(); + if (m_fileHistory) + delete m_fileHistory; + sm_docManager = (wxDocManager*) NULL; +} + +// closes the specified document +bool wxDocManager::CloseDocument(wxDocument* doc, bool force) +{ + if (doc->Close() || force) + { + // Implicitly deletes the document when + // the last view is deleted + doc->DeleteAllViews(); + + // Check we're really deleted + if (m_docs.Member(doc)) + delete doc; + + return true; + } + return false; +} + +bool wxDocManager::CloseDocuments(bool force) +{ + wxList::compatibility_iterator node = m_docs.GetFirst(); + while (node) + { + wxDocument *doc = (wxDocument *)node->GetData(); + wxList::compatibility_iterator next = node->GetNext(); + + if (!CloseDocument(doc, force)) + return false; + + // This assumes that documents are not connected in + // any way, i.e. deleting one document does NOT + // delete another. + node = next; + } + return true; +} + +bool wxDocManager::Clear(bool force) +{ + if (!CloseDocuments(force)) + return false; + + m_currentView = NULL; + + wxList::compatibility_iterator node = m_templates.GetFirst(); + while (node) + { + wxDocTemplate *templ = (wxDocTemplate*) node->GetData(); + wxList::compatibility_iterator next = node->GetNext(); + delete templ; + node = next; + } + return true; +} + +bool wxDocManager::Initialize() +{ + m_fileHistory = OnCreateFileHistory(); + return true; +} + +wxFileHistory *wxDocManager::OnCreateFileHistory() +{ + return new wxFileHistory; +} + +void wxDocManager::OnFileClose(wxCommandEvent& WXUNUSED(event)) +{ + wxDocument *doc = GetCurrentDocument(); + if (!doc) + return; + if (doc->Close()) + { + doc->DeleteAllViews(); + if (m_docs.Member(doc)) + delete doc; + } +} + +void wxDocManager::OnFileCloseAll(wxCommandEvent& WXUNUSED(event)) +{ + CloseDocuments(false); +} + +void wxDocManager::OnFileNew(wxCommandEvent& WXUNUSED(event)) +{ + CreateDocument( wxEmptyString, wxDOC_NEW ); +} + +void wxDocManager::OnFileOpen(wxCommandEvent& WXUNUSED(event)) +{ + if ( !CreateDocument( wxEmptyString, 0) ) + { + OnOpenFileFailure(); + } +} + +void wxDocManager::OnFileRevert(wxCommandEvent& WXUNUSED(event)) +{ + wxDocument *doc = GetCurrentDocument(); + if (!doc) + return; + doc->Revert(); +} + +void wxDocManager::OnFileSave(wxCommandEvent& WXUNUSED(event)) +{ + wxDocument *doc = GetCurrentDocument(); + if (!doc) + return; + doc->Save(); +} + +void wxDocManager::OnFileSaveAs(wxCommandEvent& WXUNUSED(event)) +{ + wxDocument *doc = GetCurrentDocument(); + if (!doc) + return; + doc->SaveAs(); +} + +void wxDocManager::OnPrint(wxCommandEvent& WXUNUSED(event)) +{ +#if wxUSE_PRINTING_ARCHITECTURE + wxView *view = GetCurrentView(); + if (!view) + return; + + wxPrintout *printout = view->OnCreatePrintout(); + if (printout) + { + wxPrinter printer; + printer.Print(view->GetFrame(), printout, true); + + delete printout; + } +#endif // wxUSE_PRINTING_ARCHITECTURE +} + +void wxDocManager::OnPreview(wxCommandEvent& WXUNUSED(event)) +{ +#if wxUSE_PRINTING_ARCHITECTURE + wxView *view = GetCurrentView(); + if (!view) + return; + + wxPrintout *printout = view->OnCreatePrintout(); + if (printout) + { + // Pass two printout objects: for preview, and possible printing. + wxPrintPreviewBase *preview = new wxPrintPreview(printout, view->OnCreatePrintout()); + if ( !preview->Ok() ) + { + delete preview; + wxMessageBox( _("Sorry, print preview needs a printer to be installed.") ); + return; + } + + wxPreviewFrame *frame = new wxPreviewFrame(preview, (wxFrame *)wxTheApp->GetTopWindow(), _("Print Preview"), + wxPoint(100, 100), wxSize(600, 650)); + frame->Centre(wxBOTH); + frame->Initialize(); + frame->Show(true); + } +#endif // wxUSE_PRINTING_ARCHITECTURE +} + +void wxDocManager::OnUndo(wxCommandEvent& event) +{ + wxDocument *doc = GetCurrentDocument(); + if (!doc) + return; + if (doc->GetCommandProcessor()) + doc->GetCommandProcessor()->Undo(); + else + event.Skip(); +} + +void wxDocManager::OnRedo(wxCommandEvent& event) +{ + wxDocument *doc = GetCurrentDocument(); + if (!doc) + return; + if (doc->GetCommandProcessor()) + doc->GetCommandProcessor()->Redo(); + else + event.Skip(); +} + +// Handlers for UI update commands + +void wxDocManager::OnUpdateFileOpen(wxUpdateUIEvent& event) +{ + event.Enable( true ); +} + +void wxDocManager::OnUpdateFileClose(wxUpdateUIEvent& event) +{ + wxDocument *doc = GetCurrentDocument(); + event.Enable( (doc != (wxDocument*) NULL) ); +} + +void wxDocManager::OnUpdateFileRevert(wxUpdateUIEvent& event) +{ + wxDocument *doc = GetCurrentDocument(); + event.Enable( (doc != (wxDocument*) NULL) ); +} + +void wxDocManager::OnUpdateFileNew(wxUpdateUIEvent& event) +{ + event.Enable( true ); +} + +void wxDocManager::OnUpdateFileSave(wxUpdateUIEvent& event) +{ + wxDocument *doc = GetCurrentDocument(); + event.Enable( doc && doc->IsModified() ); +} + +void wxDocManager::OnUpdateFileSaveAs(wxUpdateUIEvent& event) +{ + wxDocument *doc = GetCurrentDocument(); + event.Enable( (doc != (wxDocument*) NULL) ); +} + +void wxDocManager::OnUpdateUndo(wxUpdateUIEvent& event) +{ + wxDocument *doc = GetCurrentDocument(); + if (!doc) + event.Enable(false); + else if (!doc->GetCommandProcessor()) + event.Skip(); + else + { + event.Enable( doc->GetCommandProcessor()->CanUndo() ); + doc->GetCommandProcessor()->SetMenuStrings(); + } +} + +void wxDocManager::OnUpdateRedo(wxUpdateUIEvent& event) +{ + wxDocument *doc = GetCurrentDocument(); + if (!doc) + event.Enable(false); + else if (!doc->GetCommandProcessor()) + event.Skip(); + else + { + event.Enable( doc->GetCommandProcessor()->CanRedo() ); + doc->GetCommandProcessor()->SetMenuStrings(); + } +} + +void wxDocManager::OnUpdatePrint(wxUpdateUIEvent& event) +{ + wxDocument *doc = GetCurrentDocument(); + event.Enable( (doc != (wxDocument*) NULL) ); +} + +void wxDocManager::OnUpdatePreview(wxUpdateUIEvent& event) +{ + wxDocument *doc = GetCurrentDocument(); + event.Enable( (doc != (wxDocument*) NULL) ); +} + +wxView *wxDocManager::GetCurrentView() const +{ + if (m_currentView) + return m_currentView; + if (m_docs.GetCount() == 1) + { + wxDocument* doc = (wxDocument*) m_docs.GetFirst()->GetData(); + return doc->GetFirstView(); + } + return (wxView *) NULL; +} + +// Extend event processing to search the view's event table +bool wxDocManager::ProcessEvent(wxEvent& event) +{ + wxView* view = GetCurrentView(); + if (view) + { + if (view->ProcessEvent(event)) + return true; + } + return wxEvtHandler::ProcessEvent(event); +} + +wxDocument *wxDocManager::CreateDocument(const wxString& path, long flags) +{ + wxDocTemplate **templates = new wxDocTemplate *[m_templates.GetCount()]; + int n = 0; + + for (size_t i = 0; i < m_templates.GetCount(); i++) + { + wxDocTemplate *temp = (wxDocTemplate *)(m_templates.Item(i)->GetData()); + if (temp->IsVisible()) + { + templates[n] = temp; + n ++; + } + } + if (n == 0) + { + delete[] templates; + return (wxDocument *) NULL; + } + + wxDocument* docToClose = NULL; + + // If we've reached the max number of docs, close the + // first one. + if ( (int)GetDocuments().GetCount() >= m_maxDocsOpen ) + { + wxDocument *doc = (wxDocument *)GetDocuments().GetFirst()->GetData(); + docToClose = doc; + } + + // New document: user chooses a template, unless there's only one. + if (flags & wxDOC_NEW) + { + if (n == 1) + { + if (docToClose) + { + if (!CloseDocument(docToClose, false)) + { + delete[] templates; + return NULL; + } + } + + wxDocTemplate *temp = templates[0]; + delete[] templates; + wxDocument *newDoc = temp->CreateDocument(path, flags); + + if (newDoc) + { + newDoc->SetDocumentName(temp->GetDocumentName()); + newDoc->SetDocumentTemplate(temp); + if (!newDoc->OnNewDocument() ) + { + // Document is implicitly deleted by DeleteAllViews + newDoc->DeleteAllViews(); + return NULL; + } + } + return newDoc; + } + + wxDocTemplate *temp = SelectDocumentType(templates, n); + delete[] templates; + if (temp) + { + if (docToClose) + { + if (!CloseDocument(docToClose, false)) + { + return NULL; + } + } + + wxDocument *newDoc = temp->CreateDocument(path, flags); + + if (newDoc) + { + newDoc->SetDocumentName(temp->GetDocumentName()); + newDoc->SetDocumentTemplate(temp); + if (!newDoc->OnNewDocument() ) + { + // Document is implicitly deleted by DeleteAllViews + newDoc->DeleteAllViews(); + return NULL; + } + } + return newDoc; + } + else + return (wxDocument *) NULL; + } + + // Existing document + wxDocTemplate *temp; + + wxString path2 = path; + + if (flags & wxDOC_SILENT) + { + temp = FindTemplateForPath(path2); + if (!temp) + { + // Since we do not add files with non-default extensions to the FileHistory this + // can only happen if the application changes the allowed templates in runtime. + (void)wxMessageBox(_("Sorry, the format for this file is unknown."), + _("Open File"), + wxOK | wxICON_EXCLAMATION, wxFindSuitableParent()); + } + } + else + temp = SelectDocumentPath(templates, n, path2, flags); + + delete[] templates; + + if (temp) + { + if (docToClose) + { + if (!CloseDocument(docToClose, false)) + { + return NULL; + } + } + + //see if this file is already open + for (size_t i = 0; i < GetDocuments().GetCount(); ++i) + { + wxDocument* currentDoc = (wxDocument*)(GetDocuments().Item(i)->GetData()); +#ifdef __WXMSW__ + //file paths are case-insensitive on Windows + if (path2.CmpNoCase(currentDoc->GetFilename()) == 0) +#else + if (path2.Cmp(currentDoc->GetFilename()) == 0) +#endif + { + //file already open. Just activate it and return + if (currentDoc->GetFirstView()) + { + ActivateView(currentDoc->GetFirstView(), true); + if (currentDoc->GetDocumentWindow()) + currentDoc->GetDocumentWindow()->SetFocus(); + return currentDoc; + } + } + } + + wxDocument *newDoc = temp->CreateDocument(path2, flags); + if (newDoc) + { + newDoc->SetDocumentName(temp->GetDocumentName()); + newDoc->SetDocumentTemplate(temp); + if (!newDoc->OnOpenDocument(path2)) + { + newDoc->DeleteAllViews(); + // delete newDoc; // Implicitly deleted by DeleteAllViews + return (wxDocument *) NULL; + } + // A file that doesn't use the default extension of its document + // template cannot be opened via the FileHistory, so we do not + // add it. + if (temp->FileMatchesTemplate(path2)) + AddFileToHistory(path2); + } + return newDoc; + } + + return (wxDocument *) NULL; +} + +wxView *wxDocManager::CreateView(wxDocument *doc, long flags) +{ + wxDocTemplate **templates = new wxDocTemplate *[m_templates.GetCount()]; + int n =0; + + for (size_t i = 0; i < m_templates.GetCount(); i++) + { + wxDocTemplate *temp = (wxDocTemplate *)(m_templates.Item(i)->GetData()); + if (temp->IsVisible()) + { + if (temp->GetDocumentName() == doc->GetDocumentName()) + { + templates[n] = temp; + n ++; + } + } + } + if (n == 0) + { + delete[] templates; + return (wxView *) NULL; + } + if (n == 1) + { + wxDocTemplate *temp = templates[0]; + delete[] templates; + wxView *view = temp->CreateView(doc, flags); + if (view) + view->SetViewName(temp->GetViewName()); + return view; + } + + wxDocTemplate *temp = SelectViewType(templates, n); + delete[] templates; + if (temp) + { + wxView *view = temp->CreateView(doc, flags); + if (view) + view->SetViewName(temp->GetViewName()); + return view; + } + else + return (wxView *) NULL; +} + +// Not yet implemented +void wxDocManager::DeleteTemplate(wxDocTemplate *WXUNUSED(temp), long WXUNUSED(flags)) +{ +} + +// Not yet implemented +bool wxDocManager::FlushDoc(wxDocument *WXUNUSED(doc)) +{ + return false; +} + +wxDocument *wxDocManager::GetCurrentDocument() const +{ + wxView *view = GetCurrentView(); + if (view) + return view->GetDocument(); + else + return (wxDocument *) NULL; +} + +// Make a default document name +bool wxDocManager::MakeDefaultName(wxString& name) +{ + name.Printf(_("unnamed%d"), m_defaultDocumentNameCounter); + m_defaultDocumentNameCounter++; + + return true; +} + +// Make a frame title (override this to do something different) +// If docName is empty, a document is not currently active. +wxString wxDocManager::MakeFrameTitle(wxDocument* doc) +{ + wxString appName = wxTheApp->GetAppName(); + wxString title; + if (!doc) + title = appName; + else + { + wxString docName; + doc->GetPrintableName(docName); + title = docName + wxString(_(" - ")) + appName; + } + return title; +} + + +// Not yet implemented +wxDocTemplate *wxDocManager::MatchTemplate(const wxString& WXUNUSED(path)) +{ + return (wxDocTemplate *) NULL; +} + +// File history management +void wxDocManager::AddFileToHistory(const wxString& file) +{ + if (m_fileHistory) + m_fileHistory->AddFileToHistory(file); +} + +void wxDocManager::RemoveFileFromHistory(size_t i) +{ + if (m_fileHistory) + m_fileHistory->RemoveFileFromHistory(i); +} + +wxString wxDocManager::GetHistoryFile(size_t i) const +{ + wxString histFile; + + if (m_fileHistory) + histFile = m_fileHistory->GetHistoryFile(i); + + return histFile; +} + +void wxDocManager::FileHistoryUseMenu(wxMenu *menu) +{ + if (m_fileHistory) + m_fileHistory->UseMenu(menu); +} + +void wxDocManager::FileHistoryRemoveMenu(wxMenu *menu) +{ + if (m_fileHistory) + m_fileHistory->RemoveMenu(menu); +} + +#if wxUSE_CONFIG +void wxDocManager::FileHistoryLoad(wxConfigBase& config) +{ + if (m_fileHistory) + m_fileHistory->Load(config); +} + +void wxDocManager::FileHistorySave(wxConfigBase& config) +{ + if (m_fileHistory) + m_fileHistory->Save(config); +} +#endif + +void wxDocManager::FileHistoryAddFilesToMenu(wxMenu* menu) +{ + if (m_fileHistory) + m_fileHistory->AddFilesToMenu(menu); +} + +void wxDocManager::FileHistoryAddFilesToMenu() +{ + if (m_fileHistory) + m_fileHistory->AddFilesToMenu(); +} + +size_t wxDocManager::GetHistoryFilesCount() const +{ + return m_fileHistory ? m_fileHistory->GetCount() : 0; +} + + +// Find out the document template via matching in the document file format +// against that of the template +wxDocTemplate *wxDocManager::FindTemplateForPath(const wxString& path) +{ + wxDocTemplate *theTemplate = (wxDocTemplate *) NULL; + + // Find the template which this extension corresponds to + for (size_t i = 0; i < m_templates.GetCount(); i++) + { + wxDocTemplate *temp = (wxDocTemplate *)m_templates.Item(i)->GetData(); + if ( temp->FileMatchesTemplate(path) ) + { + theTemplate = temp; + break; + } + } + return theTemplate; +} + +// Try to get a more suitable parent frame than the top window, +// for selection dialogs. Otherwise you may get an unexpected +// window being activated when a dialog is shown. +static wxWindow* wxFindSuitableParent() +{ + wxWindow* parent = wxTheApp->GetTopWindow(); + + wxWindow* focusWindow = wxWindow::FindFocus(); + if (focusWindow) + { + while (focusWindow && + !focusWindow->IsKindOf(CLASSINFO(wxDialog)) && + !focusWindow->IsKindOf(CLASSINFO(wxFrame))) + + focusWindow = focusWindow->GetParent(); + + if (focusWindow) + parent = focusWindow; + } + return parent; +} + +// Prompts user to open a file, using file specs in templates. +// Must extend the file selector dialog or implement own; OR +// match the extension to the template extension. + +wxDocTemplate *wxDocManager::SelectDocumentPath(wxDocTemplate **templates, +#if defined(__WXMSW__) || defined(__WXGTK__) || defined(__WXMAC__) + int noTemplates, +#else + int WXUNUSED(noTemplates), +#endif + wxString& path, + long WXUNUSED(flags), + bool WXUNUSED(save)) +{ + // We can only have multiple filters in Windows and GTK +#if defined(__WXMSW__) || defined(__WXGTK__) || defined(__WXMAC__) + wxString descrBuf; + + int i; + for (i = 0; i < noTemplates; i++) + { + if (templates[i]->IsVisible()) + { + // add a '|' to separate this filter from the previous one + if ( !descrBuf.empty() ) + descrBuf << wxT('|'); + + descrBuf << templates[i]->GetDescription() + << wxT(" (") << templates[i]->GetFileFilter() << wxT(") |") + << templates[i]->GetFileFilter(); + } + } +#else + wxString descrBuf = wxT("*.*"); +#endif + + int FilterIndex = -1; + + wxWindow* parent = wxFindSuitableParent(); + + wxString pathTmp = wxFileSelectorEx(_("Select a file"), + m_lastDirectory, + wxEmptyString, + &FilterIndex, + descrBuf, + 0, + parent); + + wxDocTemplate *theTemplate = (wxDocTemplate *)NULL; + if (!pathTmp.empty()) + { + if (!wxFileExists(pathTmp)) + { + wxString msgTitle; + if (!wxTheApp->GetAppName().empty()) + msgTitle = wxTheApp->GetAppName(); + else + msgTitle = wxString(_("File error")); + + (void)wxMessageBox(_("Sorry, could not open this file."), msgTitle, wxOK | wxICON_EXCLAMATION, + parent); + + path = wxEmptyString; + return (wxDocTemplate *) NULL; + } + m_lastDirectory = wxPathOnly(pathTmp); + + path = pathTmp; + + // first choose the template using the extension, if this fails (i.e. + // wxFileSelectorEx() didn't fill it), then use the path + if ( FilterIndex != -1 ) + theTemplate = templates[FilterIndex]; + if ( !theTemplate ) + theTemplate = FindTemplateForPath(path); + if ( !theTemplate ) + { + // Since we do not add files with non-default extensions to the FileHistory this + // can only happen if the application changes the allowed templates in runtime. + (void)wxMessageBox(_("Sorry, the format for this file is unknown."), + _("Open File"), + wxOK | wxICON_EXCLAMATION, wxFindSuitableParent()); + } + } + else + { + path = wxEmptyString; + } + + return theTemplate; +} + +wxDocTemplate *wxDocManager::SelectDocumentType(wxDocTemplate **templates, + int noTemplates, bool sort) +{ + wxArrayString strings; + wxDocTemplate **data = new wxDocTemplate *[noTemplates]; + int i; + int n = 0; + + for (i = 0; i < noTemplates; i++) + { + if (templates[i]->IsVisible()) + { + int j; + bool want = true; + for (j = 0; j < n; j++) + { + //filter out NOT unique documents + view combinations + if ( templates[i]->m_docTypeName == data[j]->m_docTypeName && + templates[i]->m_viewTypeName == data[j]->m_viewTypeName + ) + want = false; + } + + if ( want ) + { + strings.Add(templates[i]->m_description); + + data[n] = templates[i]; + n ++; + } + } + } // for + + if (sort) + { + strings.Sort(); // ascending sort + // Yes, this will be slow, but template lists + // are typically short. + int j; + n = strings.Count(); + for (i = 0; i < n; i++) + { + for (j = 0; j < noTemplates; j++) + { + if (strings[i] == templates[j]->m_description) + data[i] = templates[j]; + } + } + } + + wxDocTemplate *theTemplate; + + switch ( n ) + { + case 0: + // no visible templates, hence nothing to choose from + theTemplate = NULL; + break; + + case 1: + // don't propose the user to choose if he heas no choice + theTemplate = data[0]; + break; + + default: + // propose the user to choose one of several + theTemplate = (wxDocTemplate *)wxGetSingleChoiceData + ( + _("Select a document template"), + _("Templates"), + strings, + (void **)data, + wxFindSuitableParent() + ); + } + + delete[] data; + + return theTemplate; +} + +wxDocTemplate *wxDocManager::SelectViewType(wxDocTemplate **templates, + int noTemplates, bool sort) +{ + wxArrayString strings; + wxDocTemplate **data = new wxDocTemplate *[noTemplates]; + int i; + int n = 0; + + for (i = 0; i < noTemplates; i++) + { + wxDocTemplate *templ = templates[i]; + if ( templ->IsVisible() && !templ->GetViewName().empty() ) + { + int j; + bool want = true; + for (j = 0; j < n; j++) + { + //filter out NOT unique views + if ( templates[i]->m_viewTypeName == data[j]->m_viewTypeName ) + want = false; + } + + if ( want ) + { + strings.Add(templ->m_viewTypeName); + data[n] = templ; + n ++; + } + } + } + + if (sort) + { + strings.Sort(); // ascending sort + // Yes, this will be slow, but template lists + // are typically short. + int j; + n = strings.Count(); + for (i = 0; i < n; i++) + { + for (j = 0; j < noTemplates; j++) + { + if (strings[i] == templates[j]->m_viewTypeName) + data[i] = templates[j]; + } + } + } + + wxDocTemplate *theTemplate; + + // the same logic as above + switch ( n ) + { + case 0: + theTemplate = (wxDocTemplate *)NULL; + break; + + case 1: + theTemplate = data[0]; + break; + + default: + theTemplate = (wxDocTemplate *)wxGetSingleChoiceData + ( + _("Select a document view"), + _("Views"), + strings, + (void **)data, + wxFindSuitableParent() + ); + + } + + delete[] data; + return theTemplate; +} + +void wxDocManager::AssociateTemplate(wxDocTemplate *temp) +{ + if (!m_templates.Member(temp)) + m_templates.Append(temp); +} + +void wxDocManager::DisassociateTemplate(wxDocTemplate *temp) +{ + m_templates.DeleteObject(temp); +} + +// Add and remove a document from the manager's list +void wxDocManager::AddDocument(wxDocument *doc) +{ + if (!m_docs.Member(doc)) + m_docs.Append(doc); +} + +void wxDocManager::RemoveDocument(wxDocument *doc) +{ + m_docs.DeleteObject(doc); +} + +// Views or windows should inform the document manager +// when a view is going in or out of focus +void wxDocManager::ActivateView(wxView *view, bool activate) +{ + if ( activate ) + { + m_currentView = view; + } + else // deactivate + { + if ( m_currentView == view ) + { + // don't keep stale pointer + m_currentView = (wxView *) NULL; + } + } +} + +// ---------------------------------------------------------------------------- +// Default document child frame +// ---------------------------------------------------------------------------- + +BEGIN_EVENT_TABLE(wxDocChildFrame, wxFrame) + EVT_ACTIVATE(wxDocChildFrame::OnActivate) + EVT_CLOSE(wxDocChildFrame::OnCloseWindow) +END_EVENT_TABLE() + +wxDocChildFrame::wxDocChildFrame(wxDocument *doc, + wxView *view, + wxFrame *frame, + wxWindowID id, + const wxString& title, + const wxPoint& pos, + const wxSize& size, + long style, + const wxString& name) + : wxFrame(frame, id, title, pos, size, style, name) +{ + m_childDocument = doc; + m_childView = view; + if (view) + view->SetFrame(this); +} + +// Extend event processing to search the view's event table +bool wxDocChildFrame::ProcessEvent(wxEvent& event) +{ + if (m_childView) + m_childView->Activate(true); + + if ( !m_childView || ! m_childView->ProcessEvent(event) ) + { + // Only hand up to the parent if it's a menu command + if (!event.IsKindOf(CLASSINFO(wxCommandEvent)) || !GetParent() || !GetParent()->ProcessEvent(event)) + return wxEvtHandler::ProcessEvent(event); + else + return true; + } + else + return true; +} + +void wxDocChildFrame::OnActivate(wxActivateEvent& event) +{ + wxFrame::OnActivate(event); + + if (m_childView) + m_childView->Activate(event.GetActive()); +} + +void wxDocChildFrame::OnCloseWindow(wxCloseEvent& event) +{ + if (m_childView) + { + bool ans = event.CanVeto() + ? m_childView->Close(false) // false means don't delete associated window + : true; // Must delete. + + if (ans) + { + m_childView->Activate(false); + delete m_childView; + m_childView = (wxView *) NULL; + m_childDocument = (wxDocument *) NULL; + + this->Destroy(); + } + else + event.Veto(); + } + else + event.Veto(); +} + +// ---------------------------------------------------------------------------- +// Default parent frame +// ---------------------------------------------------------------------------- + +BEGIN_EVENT_TABLE(wxDocParentFrame, wxFrame) + EVT_MENU(wxID_EXIT, wxDocParentFrame::OnExit) + EVT_MENU_RANGE(wxID_FILE1, wxID_FILE9, wxDocParentFrame::OnMRUFile) + EVT_CLOSE(wxDocParentFrame::OnCloseWindow) +END_EVENT_TABLE() + +wxDocParentFrame::wxDocParentFrame() +{ + m_docManager = NULL; +} + +wxDocParentFrame::wxDocParentFrame(wxDocManager *manager, + wxFrame *frame, + wxWindowID id, + const wxString& title, + const wxPoint& pos, + const wxSize& size, + long style, + const wxString& name) + : wxFrame(frame, id, title, pos, size, style, name) +{ + m_docManager = manager; +} + +bool wxDocParentFrame::Create(wxDocManager *manager, + wxFrame *frame, + wxWindowID id, + const wxString& title, + const wxPoint& pos, + const wxSize& size, + long style, + const wxString& name) +{ + m_docManager = manager; + return base_type::Create(frame, id, title, pos, size, style, name); +} + +void wxDocParentFrame::OnExit(wxCommandEvent& WXUNUSED(event)) +{ + Close(); +} + +void wxDocParentFrame::OnMRUFile(wxCommandEvent& event) +{ + int n = event.GetId() - wxID_FILE1; // the index in MRU list + wxString filename(m_docManager->GetHistoryFile(n)); + if ( !filename.empty() ) + { + // verify that the file exists before doing anything else + if ( wxFile::Exists(filename) ) + { + // try to open it + if (!m_docManager->CreateDocument(filename, wxDOC_SILENT)) + { + // remove the file from the MRU list. The user should already be notified. + m_docManager->RemoveFileFromHistory(n); + + wxLogError(_("The file '%s' couldn't be opened.\nIt has been removed from the most recently used files list."), + filename.c_str()); + } + } + else + { + // remove the bogus filename from the MRU list and notify the user + // about it + m_docManager->RemoveFileFromHistory(n); + + wxLogError(_("The file '%s' doesn't exist and couldn't be opened.\nIt has been removed from the most recently used files list."), + filename.c_str()); + } + } +} + +// Extend event processing to search the view's event table +bool wxDocParentFrame::ProcessEvent(wxEvent& event) +{ + // Try the document manager, then do default processing + if (!m_docManager || !m_docManager->ProcessEvent(event)) + return wxEvtHandler::ProcessEvent(event); + else + return true; +} + +// Define the behaviour for the frame closing +// - must delete all frames except for the main one. +void wxDocParentFrame::OnCloseWindow(wxCloseEvent& event) +{ + if (m_docManager->Clear(!event.CanVeto())) + { + this->Destroy(); + } + else + event.Veto(); +} + +#if wxUSE_PRINTING_ARCHITECTURE + +wxDocPrintout::wxDocPrintout(wxView *view, const wxString& title) + : wxPrintout(title) +{ + m_printoutView = view; +} + +bool wxDocPrintout::OnPrintPage(int WXUNUSED(page)) +{ + wxDC *dc = GetDC(); + + // Get the logical pixels per inch of screen and printer + int ppiScreenX, ppiScreenY; + GetPPIScreen(&ppiScreenX, &ppiScreenY); + wxUnusedVar(ppiScreenY); + int ppiPrinterX, ppiPrinterY; + GetPPIPrinter(&ppiPrinterX, &ppiPrinterY); + wxUnusedVar(ppiPrinterY); + + // This scales the DC so that the printout roughly represents the + // the screen scaling. The text point size _should_ be the right size + // but in fact is too small for some reason. This is a detail that will + // need to be addressed at some point but can be fudged for the + // moment. + float scale = (float)((float)ppiPrinterX/(float)ppiScreenX); + + // Now we have to check in case our real page size is reduced + // (e.g. because we're drawing to a print preview memory DC) + int pageWidth, pageHeight; + int w, h; + dc->GetSize(&w, &h); + GetPageSizePixels(&pageWidth, &pageHeight); + wxUnusedVar(pageHeight); + + // If printer pageWidth == current DC width, then this doesn't + // change. But w might be the preview bitmap width, so scale down. + float overallScale = scale * (float)(w/(float)pageWidth); + dc->SetUserScale(overallScale, overallScale); + + if (m_printoutView) + { + m_printoutView->OnDraw(dc); + } + return true; +} + +bool wxDocPrintout::HasPage(int pageNum) +{ + return (pageNum == 1); +} + +bool wxDocPrintout::OnBeginDocument(int startPage, int endPage) +{ + if (!wxPrintout::OnBeginDocument(startPage, endPage)) + return false; + + return true; +} + +void wxDocPrintout::GetPageInfo(int *minPage, int *maxPage, int *selPageFrom, int *selPageTo) +{ + *minPage = 1; + *maxPage = 1; + *selPageFrom = 1; + *selPageTo = 1; +} + +#endif // wxUSE_PRINTING_ARCHITECTURE + +// ---------------------------------------------------------------------------- +// File history processor +// ---------------------------------------------------------------------------- + +static inline wxChar* MYcopystring(const wxString& s) +{ + wxChar* copy = new wxChar[s.length() + 1]; + return wxStrcpy(copy, s.c_str()); +} + +static inline wxChar* MYcopystring(const wxChar* s) +{ + wxChar* copy = new wxChar[wxStrlen(s) + 1]; + return wxStrcpy(copy, s); +} + +wxFileHistory::wxFileHistory(size_t maxFiles, wxWindowID idBase) +{ + m_fileMaxFiles = maxFiles; + m_idBase = idBase; + m_fileHistoryN = 0; + m_fileHistory = new wxChar *[m_fileMaxFiles]; +} + +wxFileHistory::~wxFileHistory() +{ + size_t i; + for (i = 0; i < m_fileHistoryN; i++) + delete[] m_fileHistory[i]; + delete[] m_fileHistory; +} + +// File history management +void wxFileHistory::AddFileToHistory(const wxString& file) +{ + size_t i; + + // Check we don't already have this file + for (i = 0; i < m_fileHistoryN; i++) + { +#if defined( __WXMSW__ ) // Add any other OSes with case insensitive file names + wxString testString; + if ( m_fileHistory[i] ) + testString = m_fileHistory[i]; + if ( m_fileHistory[i] && ( file.Lower() == testString.Lower() ) ) +#else + if ( m_fileHistory[i] && ( file == m_fileHistory[i] ) ) +#endif + { + // we do have it, move it to the top of the history + RemoveFileFromHistory (i); + AddFileToHistory (file); + return; + } + } + + // if we already have a full history, delete the one at the end + if ( m_fileMaxFiles == m_fileHistoryN ) + { + RemoveFileFromHistory (m_fileHistoryN - 1); + AddFileToHistory (file); + return; + } + + // Add to the project file history: + // Move existing files (if any) down so we can insert file at beginning. + if (m_fileHistoryN < m_fileMaxFiles) + { + wxList::compatibility_iterator node = m_fileMenus.GetFirst(); + while (node) + { + wxMenu* menu = (wxMenu*) node->GetData(); + if ( m_fileHistoryN == 0 && menu->GetMenuItemCount() ) + { + menu->AppendSeparator(); + } + menu->Append(m_idBase+m_fileHistoryN, _("[EMPTY]")); + node = node->GetNext(); + } + m_fileHistoryN ++; + } + // Shuffle filenames down + for (i = (m_fileHistoryN-1); i > 0; i--) + { + m_fileHistory[i] = m_fileHistory[i-1]; + } + m_fileHistory[0] = MYcopystring(file); + + // this is the directory of the last opened file + wxString pathCurrent; + wxSplitPath( m_fileHistory[0], &pathCurrent, NULL, NULL ); + for (i = 0; i < m_fileHistoryN; i++) + { + if ( m_fileHistory[i] ) + { + // if in same directory just show the filename; otherwise the full + // path + wxString pathInMenu, path, filename, ext; + wxSplitPath( m_fileHistory[i], &path, &filename, &ext ); + if ( path == pathCurrent ) + { + pathInMenu = filename; + if ( !ext.empty() ) + pathInMenu = pathInMenu + wxFILE_SEP_EXT + ext; + } + else + { + // absolute path; could also set relative path + pathInMenu = m_fileHistory[i]; + } + + // we need to quote '&' characters which are used for mnemonics + pathInMenu.Replace(_T("&"), _T("&&")); + wxString buf; + buf.Printf(s_MRUEntryFormat, i + 1, pathInMenu.c_str()); + wxList::compatibility_iterator node = m_fileMenus.GetFirst(); + while (node) + { + wxMenu* menu = (wxMenu*) node->GetData(); + menu->SetLabel(m_idBase + i, buf); + node = node->GetNext(); + } + } + } +} + +void wxFileHistory::RemoveFileFromHistory(size_t i) +{ + wxCHECK_RET( i < m_fileHistoryN, + wxT("invalid index in wxFileHistory::RemoveFileFromHistory") ); + + // delete the element from the array (could use memmove() too...) + delete [] m_fileHistory[i]; + + size_t j; + for ( j = i; j < m_fileHistoryN - 1; j++ ) + { + m_fileHistory[j] = m_fileHistory[j + 1]; + } + + wxList::compatibility_iterator node = m_fileMenus.GetFirst(); + while ( node ) + { + wxMenu* menu = (wxMenu*) node->GetData(); + + // shuffle filenames up + wxString buf; + for ( j = i; j < m_fileHistoryN - 1; j++ ) + { + buf.Printf(s_MRUEntryFormat, j + 1, m_fileHistory[j]); + menu->SetLabel(m_idBase + j, buf); + } + + node = node->GetNext(); + + // delete the last menu item which is unused now + wxWindowID lastItemId = m_idBase + wx_truncate_cast(wxWindowID, m_fileHistoryN) - 1; + if (menu->FindItem(lastItemId)) + { + menu->Delete(lastItemId); + } + + // delete the last separator too if no more files are left + if ( m_fileHistoryN == 1 ) + { + wxMenuItemList::compatibility_iterator nodeLast = menu->GetMenuItems().GetLast(); + if ( nodeLast ) + { + wxMenuItem *menuItem = nodeLast->GetData(); + if ( menuItem->IsSeparator() ) + { + menu->Delete(menuItem); + } + //else: should we search backwards for the last separator? + } + //else: menu is empty somehow + } + } + + m_fileHistoryN--; +} + +wxString wxFileHistory::GetHistoryFile(size_t i) const +{ + wxString s; + if ( i < m_fileHistoryN ) + { + s = m_fileHistory[i]; + } + else + { + wxFAIL_MSG( wxT("bad index in wxFileHistory::GetHistoryFile") ); + } + + return s; +} + +void wxFileHistory::UseMenu(wxMenu *menu) +{ + if (!m_fileMenus.Member(menu)) + m_fileMenus.Append(menu); +} + +void wxFileHistory::RemoveMenu(wxMenu *menu) +{ + m_fileMenus.DeleteObject(menu); +} + +#if wxUSE_CONFIG +void wxFileHistory::Load(wxConfigBase& config) +{ + m_fileHistoryN = 0; + wxString buf; + buf.Printf(wxT("file%d"), (int)m_fileHistoryN+1); + wxString historyFile; + while ((m_fileHistoryN < m_fileMaxFiles) && config.Read(buf, &historyFile) && (!historyFile.empty())) + { + m_fileHistory[m_fileHistoryN] = MYcopystring((const wxChar*) historyFile); + m_fileHistoryN ++; + buf.Printf(wxT("file%d"), (int)m_fileHistoryN+1); + historyFile = wxEmptyString; + } + AddFilesToMenu(); +} + +void wxFileHistory::Save(wxConfigBase& config) +{ + size_t i; + for (i = 0; i < m_fileMaxFiles; i++) + { + wxString buf; + buf.Printf(wxT("file%d"), (int)i+1); + if (i < m_fileHistoryN) + config.Write(buf, wxString(m_fileHistory[i])); + else + config.Write(buf, wxEmptyString); + } +} +#endif // wxUSE_CONFIG + +void wxFileHistory::AddFilesToMenu() +{ + if (m_fileHistoryN > 0) + { + wxList::compatibility_iterator node = m_fileMenus.GetFirst(); + while (node) + { + wxMenu* menu = (wxMenu*) node->GetData(); + if (menu->GetMenuItemCount()) + { + menu->AppendSeparator(); + } + + size_t i; + for (i = 0; i < m_fileHistoryN; i++) + { + if (m_fileHistory[i]) + { + wxString buf; + buf.Printf(s_MRUEntryFormat, i+1, m_fileHistory[i]); + menu->Append(m_idBase+i, buf); + } + } + node = node->GetNext(); + } + } +} + +void wxFileHistory::AddFilesToMenu(wxMenu* menu) +{ + if (m_fileHistoryN > 0) + { + if (menu->GetMenuItemCount()) + { + menu->AppendSeparator(); + } + + size_t i; + for (i = 0; i < m_fileHistoryN; i++) + { + if (m_fileHistory[i]) + { + wxString buf; + buf.Printf(s_MRUEntryFormat, i+1, m_fileHistory[i]); + menu->Append(m_idBase+i, buf); + } + } + } +} + +// ---------------------------------------------------------------------------- +// Permits compatibility with existing file formats and functions that +// manipulate files directly +// ---------------------------------------------------------------------------- + +#if wxUSE_STD_IOSTREAM + +bool wxTransferFileToStream(const wxString& filename, wxSTD ostream& stream) +{ + wxFFile file(filename, _T("rb")); + if ( !file.IsOpened() ) + return false; + + char buf[4096]; + + size_t nRead; + do + { + nRead = file.Read(buf, WXSIZEOF(buf)); + if ( file.Error() ) + return false; + + stream.write(buf, nRead); + if ( !stream ) + return false; + } + while ( !file.Eof() ); + + return true; +} + +bool wxTransferStreamToFile(wxSTD istream& stream, const wxString& filename) +{ + wxFFile file(filename, _T("wb")); + if ( !file.IsOpened() ) + return false; + + char buf[4096]; + do + { + stream.read(buf, WXSIZEOF(buf)); + if ( !stream.bad() ) // fail may be set on EOF, don't use operator!() + { + if ( !file.Write(buf, stream.gcount()) ) + return false; + } + } + while ( !stream.eof() ); + + return true; +} + +#else // !wxUSE_STD_IOSTREAM + +bool wxTransferFileToStream(const wxString& filename, wxOutputStream& stream) +{ + wxFFile file(filename, _T("rb")); + if ( !file.IsOpened() ) + return false; + + char buf[4096]; + + size_t nRead; + do + { + nRead = file.Read(buf, WXSIZEOF(buf)); + if ( file.Error() ) + return false; + + stream.Write(buf, nRead); + if ( !stream ) + return false; + } + while ( !file.Eof() ); + + return true; +} + +bool wxTransferStreamToFile(wxInputStream& stream, const wxString& filename) +{ + wxFFile file(filename, _T("wb")); + if ( !file.IsOpened() ) + return false; + + char buf[4096]; + do + { + stream.Read(buf, WXSIZEOF(buf)); + + const size_t nRead = stream.LastRead(); + if ( !nRead || !file.Write(buf, nRead) ) + return false; + } + while ( !stream.Eof() ); + + return true; +} + +#endif // wxUSE_STD_IOSTREAM/!wxUSE_STD_IOSTREAM + +#endif // wxUSE_DOC_VIEW_ARCHITECTURE diff --git a/Externals/wxWidgets/src/common/dpycmn.cpp b/Externals/wxWidgets/src/common/dpycmn.cpp new file mode 100644 index 0000000000..5d8d3e7067 --- /dev/null +++ b/Externals/wxWidgets/src/common/dpycmn.cpp @@ -0,0 +1,269 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/common/dpycmn.cpp +// Purpose: wxDisplay and wxDisplayImplSingle implementation +// Author: Vadim Zeitlin +// Modified by: +// Created: 01.03.03 +// RCS-ID: $Id: dpycmn.cpp 41548 2006-10-02 05:38:05Z PC $ +// Copyright: (c) 2003-2006 Vadim Zeitlin +// License: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#ifndef WX_PRECOMP + #include "wx/gdicmn.h" + #include "wx/window.h" + #include "wx/module.h" +#endif //WX_PRECOMP + +#include "wx/display.h" +#include "wx/display_impl.h" + +#if wxUSE_DISPLAY + +#include "wx/arrimpl.cpp" +WX_DEFINE_OBJARRAY(wxArrayVideoModes) + +const wxVideoMode wxDefaultVideoMode; + +#endif // wxUSE_DISPLAY + +// ---------------------------------------------------------------------------- +// globals +// ---------------------------------------------------------------------------- + +// the factory object used by wxDisplay +// +// created on demand and destroyed by wxDisplayModule +static wxDisplayFactory *gs_factory = NULL; + +// ---------------------------------------------------------------------------- +// wxDisplayImplSingle: trivial implementation working for main display only +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxDisplayImplSingle : public wxDisplayImpl +{ +public: + wxDisplayImplSingle() : wxDisplayImpl(0) { } + + virtual wxRect GetGeometry() const + { + wxRect r; + wxDisplaySize(&r.width, &r.height); + return r; + } + + virtual wxRect GetClientArea() const { return wxGetClientDisplayRect(); } + + virtual wxString GetName() const { return wxString(); } + +#if wxUSE_DISPLAY + // no video modes support for us, provide just the stubs + + virtual wxArrayVideoModes GetModes(const wxVideoMode& WXUNUSED(mode)) const + { + return wxArrayVideoModes(); + } + + virtual wxVideoMode GetCurrentMode() const { return wxVideoMode(); } + + virtual bool ChangeMode(const wxVideoMode& WXUNUSED(mode)) { return false; } +#endif // wxUSE_DISPLAY + + + DECLARE_NO_COPY_CLASS(wxDisplayImplSingle) +}; + +// ---------------------------------------------------------------------------- +// wxDisplayModule is used to cleanup gs_factory +// ---------------------------------------------------------------------------- + +class wxDisplayModule : public wxModule +{ +public: + virtual bool OnInit() { return true; } + virtual void OnExit() + { + if ( gs_factory ) + { + delete gs_factory; + gs_factory = NULL; + } + } + + DECLARE_DYNAMIC_CLASS(wxDisplayModule) +}; + +IMPLEMENT_DYNAMIC_CLASS(wxDisplayModule, wxModule) + +// ============================================================================ +// wxDisplay implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// ctor/dtor +// ---------------------------------------------------------------------------- + +wxDisplay::wxDisplay(unsigned n) +{ + wxASSERT_MSG( n < GetCount(), + wxT("An invalid index was passed to wxDisplay") ); + + m_impl = Factory().CreateDisplay(n); +} + +wxDisplay::~wxDisplay() +{ + delete m_impl; +} + +// ---------------------------------------------------------------------------- +// static functions forwarded to wxDisplayFactory +// ---------------------------------------------------------------------------- + +/* static */ unsigned wxDisplay::GetCount() +{ + return Factory().GetCount(); +} + +/* static */ int wxDisplay::GetFromPoint(const wxPoint& pt) +{ + return Factory().GetFromPoint(pt); +} + +/* static */ int wxDisplay::GetFromWindow(wxWindow *window) +{ + wxCHECK_MSG( window, wxNOT_FOUND, _T("invalid window") ); + + return Factory().GetFromWindow(window); +} + +// ---------------------------------------------------------------------------- +// functions forwarded to wxDisplayImpl +// ---------------------------------------------------------------------------- + +wxRect wxDisplay::GetGeometry() const +{ + wxCHECK_MSG( IsOk(), wxRect(), _T("invalid wxDisplay object") ); + + return m_impl->GetGeometry(); +} + +wxRect wxDisplay::GetClientArea() const +{ + wxCHECK_MSG( IsOk(), wxRect(), _T("invalid wxDisplay object") ); + + return m_impl->GetClientArea(); +} + +wxString wxDisplay::GetName() const +{ + wxCHECK_MSG( IsOk(), wxString(), _T("invalid wxDisplay object") ); + + return m_impl->GetName(); +} + +bool wxDisplay::IsPrimary() const +{ + return m_impl && m_impl->GetIndex() == 0; +} + +#if wxUSE_DISPLAY + +wxArrayVideoModes wxDisplay::GetModes(const wxVideoMode& mode) const +{ + wxCHECK_MSG( IsOk(), wxArrayVideoModes(), _T("invalid wxDisplay object") ); + + return m_impl->GetModes(mode); +} + +wxVideoMode wxDisplay::GetCurrentMode() const +{ + wxCHECK_MSG( IsOk(), wxVideoMode(), _T("invalid wxDisplay object") ); + + return m_impl->GetCurrentMode(); +} + +bool wxDisplay::ChangeMode(const wxVideoMode& mode) +{ + wxCHECK_MSG( IsOk(), false, _T("invalid wxDisplay object") ); + + return m_impl->ChangeMode(mode); +} + +#endif // wxUSE_DIRECTDRAW + +// ---------------------------------------------------------------------------- +// static functions implementation +// ---------------------------------------------------------------------------- + +// if wxUSE_DISPLAY == 1 this is implemented in port-specific code +#if !wxUSE_DISPLAY + +/* static */ wxDisplayFactory *wxDisplay::CreateFactory() +{ + return new wxDisplayFactorySingle; +} + +#endif // !wxUSE_DISPLAY + +/* static */ wxDisplayFactory& wxDisplay::Factory() +{ + if ( !gs_factory ) + { + gs_factory = CreateFactory(); + } + + return *gs_factory; +} + +// ============================================================================ +// wxDisplayFactory implementation +// ============================================================================ + +int wxDisplayFactory::GetFromWindow(wxWindow *window) +{ + // consider that the window belongs to the display containing its centre + const wxRect r(window->GetRect()); + return GetFromPoint(wxPoint(r.x + r.width/2, r.y + r.height/2)); +} + +// ============================================================================ +// wxDisplayFactorySingle implementation +// ============================================================================ + +/* static */ +wxDisplayImpl *wxDisplayFactorySingle::CreateDisplay(unsigned n) +{ + // we recognize the main display only + return n != 0 ? NULL : new wxDisplayImplSingle; +} + +int wxDisplayFactorySingle::GetFromPoint(const wxPoint& pt) +{ + if ( pt.x >= 0 && pt.y >= 0 ) + { + int w, h; + wxDisplaySize(&w, &h); + + if ( pt.x < w && pt.y < h ) + return 0; + } + + // the point is outside of the screen + return wxNOT_FOUND; +} diff --git a/Externals/wxWidgets/src/common/dseldlg.cpp b/Externals/wxWidgets/src/common/dseldlg.cpp new file mode 100644 index 0000000000..060dcf326a --- /dev/null +++ b/Externals/wxWidgets/src/common/dseldlg.cpp @@ -0,0 +1,55 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/common/dseldlg.cpp +// Purpose: implementation of ::wxDirSelector() +// Author: Paul Thiessen +// Modified by: +// Created: 20.02.01 +// RCS-ID: $Id: dseldlg.cpp 39613 2006-06-07 11:44:19Z ABX $ +// Copyright: (c) 2001 wxWidgets team +// License: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_DIRDLG + +#include "wx/dirdlg.h" + +#ifndef WX_PRECOMP +#endif //WX_PRECOMP + +// ============================================================================ +// implementation +// ============================================================================ + +wxString wxDirSelector(const wxString& message, + const wxString& defaultPath, + long style, + const wxPoint& pos, + wxWindow *parent) +{ + wxString path; + + wxDirDialog dirDialog(parent, message, defaultPath, style, pos); + if ( dirDialog.ShowModal() == wxID_OK ) + { + path = dirDialog.GetPath(); + } + + return path; +} + +#endif // wxUSE_DIRDLG diff --git a/Externals/wxWidgets/src/common/dummy.cpp b/Externals/wxWidgets/src/common/dummy.cpp new file mode 100644 index 0000000000..34719e6741 --- /dev/null +++ b/Externals/wxWidgets/src/common/dummy.cpp @@ -0,0 +1,32 @@ +/* + * File: src/common/dummy.cpp + * Purpose: See below + * Author: Julian Smart + * Created: 1993 + * Updated: + * Copyright: (c) 1993, AIAI, University of Edinburgh + */ + +/* A dummy file to include wx.h. If precompiling wx.h, + * always start by compiling this and producing the PCH file. + * Then subsequent source files use the PCH file. + * + * If precompiling wx.h for wxWidgets and derived apps, + * link dummy.obj with your program. + * + * This will produce a big PCH file. + */ + +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#ifdef __WXMSW__ + #include "wx/msw/msvcrt.h" +#endif + +#ifdef __VISAGECPP__ + char wxDummyChar = 0; +#endif diff --git a/Externals/wxWidgets/src/common/dynarray.cpp b/Externals/wxWidgets/src/common/dynarray.cpp new file mode 100644 index 0000000000..bdde0eafea --- /dev/null +++ b/Externals/wxWidgets/src/common/dynarray.cpp @@ -0,0 +1,527 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/common/dynarray.cpp +// Purpose: implementation of wxBaseArray class +// Author: Vadim Zeitlin +// Modified by: +// Created: 12.09.97 +// RCS-ID: $Id: dynarray.cpp 43030 2006-11-04 12:51:01Z VZ $ +// Copyright: (c) 1998 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// headers +// ============================================================================ + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#ifndef WX_PRECOMP + #include "wx/dynarray.h" + #include "wx/intl.h" +#endif //WX_PRECOMP + +#include +#include // for memmove + +// we cast the value to long from which we cast it to void * in IndexForInsert: +// this can't work if the pointers are not big enough +wxCOMPILE_TIME_ASSERT( sizeof(wxUIntPtr) <= sizeof(void *), + wxArraySizeOfPtrLessSizeOfLong ); // < 32 symbols + +// ============================================================================ +// constants +// ============================================================================ + +// size increment = max(50% of current size, ARRAY_MAXSIZE_INCREMENT) +#define ARRAY_MAXSIZE_INCREMENT 4096 + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxBaseArray - dynamic array of 'T's +// ---------------------------------------------------------------------------- + +#define _WX_DEFINE_BASEARRAY_COMMON(T, name) \ +/* searches the array for an item (forward or backwards) */ \ +int name::Index(T lItem, bool bFromEnd) const \ +{ \ + if ( bFromEnd ) { \ + if ( size() > 0 ) { \ + size_t n = size(); \ + do { \ + if ( (*this)[--n] == lItem ) \ + return n; \ + } \ + while ( n != 0 ); \ + } \ + } \ + else { \ + for( size_t n = 0; n < size(); n++ ) { \ + if( (*this)[n] == lItem ) \ + return n; \ + } \ + } \ + \ + return wxNOT_FOUND; \ +} \ + \ +/* add item assuming the array is sorted with fnCompare function */ \ +size_t name::Add(T lItem, CMPFUNC fnCompare) \ +{ \ + size_t idx = IndexForInsert(lItem, fnCompare); \ + Insert(lItem, idx); \ + return idx; \ +} + +#if wxUSE_STL + +#define _WX_DEFINE_BASEARRAY_NOCOMMON(T, name) \ +size_t name::IndexForInsert(T lItem, CMPFUNC fnCompare) const \ +{ \ + Predicate p((SCMPFUNC)fnCompare); \ + const_iterator it = std::lower_bound(begin(), end(), lItem, p); \ + return it - begin(); \ +} \ + \ +int name::Index(T lItem, CMPFUNC fnCompare) const \ +{ \ + Predicate p((SCMPFUNC)fnCompare); \ + const_iterator it = std::lower_bound(begin(), end(), lItem, p); \ + return (it != end() && !p(lItem, *it)) ? \ + (int)(it - begin()) : wxNOT_FOUND; \ +} \ + \ +void name::Shrink() \ +{ \ + name tmp(*this); \ + swap(tmp); \ +} + +#else // if !wxUSE_STL + +#define _WX_DEFINE_BASEARRAY_NOCOMMON(T, name) \ +/* ctor */ \ +name::name() \ +{ \ + m_nSize = \ + m_nCount = 0; \ + m_pItems = (T *)NULL; \ +} \ + \ +/* copy ctor */ \ +name::name(const name& src) \ +{ \ + m_nSize = /* not src.m_nSize to save memory */ \ + m_nCount = src.m_nCount; \ + \ + if ( m_nSize != 0 ) { \ + m_pItems = new T[m_nSize]; \ + /* only copy if allocation succeeded */ \ + if ( m_pItems ) { \ + memcpy(m_pItems, src.m_pItems, m_nCount*sizeof(T)); \ + } \ + else { \ + m_nSize = 0; \ + } \ + } \ + else \ + m_pItems = (T *) NULL; \ +} \ + \ +/* assignment operator */ \ +name& name::operator=(const name& src) \ +{ \ + wxDELETEA(m_pItems); \ + \ + m_nSize = /* not src.m_nSize to save memory */ \ + m_nCount = src.m_nCount; \ + \ + if ( m_nSize != 0 ){ \ + m_pItems = new T[m_nSize]; \ + /* only copy if allocation succeeded */ \ + if ( m_pItems ) { \ + memcpy(m_pItems, src.m_pItems, m_nCount*sizeof(T)); \ + } \ + else { \ + m_nSize = 0; \ + } \ + } \ + else \ + m_pItems = (T *) NULL; \ + \ + return *this; \ +} \ + \ +/* allocate new buffer of the given size and move our data to it */ \ +bool name::Realloc(size_t nSize) \ +{ \ + T *pNew = new T[nSize]; \ + /* only grow if allocation succeeded */ \ + if ( !pNew ) \ + return false; \ + \ + m_nSize = nSize; \ + /* copy data to new location */ \ + memcpy(pNew, m_pItems, m_nCount*sizeof(T)); \ + delete [] m_pItems; \ + m_pItems = pNew; \ + \ + return true; \ +} \ + \ +/* grow the array */ \ +void name::Grow(size_t nIncrement) \ +{ \ + /* only do it if no more place */ \ + if( (m_nCount == m_nSize) || ((m_nSize - m_nCount) < nIncrement) ) { \ + if( m_nSize == 0 ) { \ + /* was empty, determine initial size */ \ + size_t size = WX_ARRAY_DEFAULT_INITIAL_SIZE; \ + if (size < nIncrement) size = nIncrement; \ + /* allocate some memory */ \ + m_pItems = new T[size]; \ + /* only grow if allocation succeeded */ \ + if ( m_pItems ) { \ + m_nSize = size; \ + } \ + } \ + else \ + { \ + /* add at least 50% but not too much */ \ + size_t ndefIncrement = m_nSize < WX_ARRAY_DEFAULT_INITIAL_SIZE \ + ? WX_ARRAY_DEFAULT_INITIAL_SIZE : m_nSize >> 1; \ + if ( ndefIncrement > ARRAY_MAXSIZE_INCREMENT ) \ + ndefIncrement = ARRAY_MAXSIZE_INCREMENT; \ + if ( nIncrement < ndefIncrement ) \ + nIncrement = ndefIncrement; \ + Realloc(m_nSize + nIncrement); \ + } \ + } \ +} \ + \ +/* make sure that the array has at least count elements */ \ +void name::SetCount(size_t count, T defval) \ +{ \ + if ( m_nSize < count ) \ + { \ + /* need to realloc memory: don't overallocate it here as if */ \ + /* SetCount() is called, it probably means that the caller */ \ + /* knows in advance how many elements there will be in the */ \ + /* array and so it won't be necessary to realloc it later */ \ + if ( !Realloc(count) ) \ + { \ + /* out of memory -- what can we do? */ \ + return; \ + } \ + } \ + \ + /* add new elements if we extend the array */ \ + while ( m_nCount < count ) \ + { \ + m_pItems[m_nCount++] = defval; \ + } \ +} \ + \ +/* dtor */ \ +name::~name() \ +{ \ + wxDELETEA(m_pItems); \ +} \ + \ +/* clears the list */ \ +void name::Clear() \ +{ \ + m_nSize = \ + m_nCount = 0; \ + \ + wxDELETEA(m_pItems); \ +} \ + \ +/* minimizes the memory usage by freeing unused memory */ \ +void name::Shrink() \ +{ \ + /* only do it if we have some memory to free */ \ + if( m_nCount < m_nSize ) { \ + /* allocates exactly as much memory as we need */ \ + T *pNew = new T[m_nCount]; \ + /* only shrink if allocation succeeded */ \ + if ( pNew ) { \ + /* copy data to new location */ \ + memcpy(pNew, m_pItems, m_nCount*sizeof(T)); \ + delete [] m_pItems; \ + m_pItems = pNew; \ + \ + /* update the size of the new block */ \ + m_nSize = m_nCount; \ + } \ + /* else: don't do anything, better keep old memory block! */ \ + } \ +} \ + \ +/* add item at the end */ \ +void name::Add(T lItem, size_t nInsert) \ +{ \ + if (nInsert == 0) \ + return; \ + Grow(nInsert); \ + for (size_t i = 0; i < nInsert; i++) \ + m_pItems[m_nCount++] = lItem; \ +} \ + \ +/* add item at the given position */ \ +void name::Insert(T lItem, size_t nIndex, size_t nInsert) \ +{ \ + wxCHECK_RET( nIndex <= m_nCount, wxT("bad index in wxArray::Insert") ); \ + wxCHECK_RET( m_nCount <= m_nCount + nInsert, \ + wxT("array size overflow in wxArray::Insert") ); \ + \ + if (nInsert == 0) \ + return; \ + Grow(nInsert); \ + \ + memmove(&m_pItems[nIndex + nInsert], &m_pItems[nIndex], \ + (m_nCount - nIndex)*sizeof(T)); \ + for (size_t i = 0; i < nInsert; i++) \ + m_pItems[nIndex + i] = lItem; \ + m_nCount += nInsert; \ +} \ + \ +/* search for a place to insert item into sorted array (binary search) */ \ +size_t name::IndexForInsert(T lItem, CMPFUNC fnCompare) const \ +{ \ + size_t i, \ + lo = 0, \ + hi = m_nCount; \ + int res; \ + \ + while ( lo < hi ) { \ + i = (lo + hi)/2; \ + \ + res = (*fnCompare)((const void *)(wxUIntPtr)lItem, \ + (const void *)(wxUIntPtr)(m_pItems[i])); \ + if ( res < 0 ) \ + hi = i; \ + else if ( res > 0 ) \ + lo = i + 1; \ + else { \ + lo = i; \ + break; \ + } \ + } \ + \ + return lo; \ +} \ + \ +/* search for an item in a sorted array (binary search) */ \ +int name::Index(T lItem, CMPFUNC fnCompare) const \ +{ \ + size_t n = IndexForInsert(lItem, fnCompare); \ + \ + return (n >= m_nCount || \ + (*fnCompare)((const void *)(wxUIntPtr)lItem, \ + ((const void *)(wxUIntPtr)m_pItems[n]))) \ + ? wxNOT_FOUND \ + : (int)n; \ +} \ + \ +/* removes item from array (by index) */ \ +void name::RemoveAt(size_t nIndex, size_t nRemove) \ +{ \ + wxCHECK_RET( nIndex < m_nCount, wxT("bad index in wxArray::RemoveAt") ); \ + wxCHECK_RET( nIndex + nRemove <= m_nCount, \ + wxT("removing too many elements in wxArray::RemoveAt") ); \ + \ + memmove(&m_pItems[nIndex], &m_pItems[nIndex + nRemove], \ + (m_nCount - nIndex - nRemove)*sizeof(T)); \ + m_nCount -= nRemove; \ +} \ + \ +/* removes item from array (by value) */ \ +void name::Remove(T lItem) \ +{ \ + int iIndex = Index(lItem); \ + \ + wxCHECK_RET( iIndex != wxNOT_FOUND, \ + wxT("removing inexistent item in wxArray::Remove") ); \ + \ + RemoveAt((size_t)iIndex); \ +} \ + \ +/* sort array elements using passed comparaison function */ \ +void name::Sort(CMPFUNC fCmp) \ +{ \ + qsort(m_pItems, m_nCount, sizeof(T), fCmp); \ +} \ + \ +void name::assign(const_iterator first, const_iterator last) \ +{ \ + clear(); \ + reserve(last - first); \ + for(; first != last; ++first) \ + push_back(*first); \ +} \ + \ +void name::assign(size_type n, const_reference v) \ +{ \ + clear(); \ + reserve(n); \ + for( size_type i = 0; i < n; ++i ) \ + push_back(v); \ +} \ + \ +void name::insert(iterator it, const_iterator first, const_iterator last) \ +{ \ + size_t nInsert = last - first, nIndex = it - begin(); \ + if (nInsert == 0) \ + return; \ + Grow(nInsert); \ + \ + memmove(&m_pItems[nIndex + nInsert], &m_pItems[nIndex], \ + (m_nCount - nIndex)*sizeof(T)); \ + for (size_t i = 0; i < nInsert; ++i, ++it, ++first) \ + *it = *first; \ + m_nCount += nInsert; \ +} + +#endif + +#define _WX_DEFINE_BASEARRAY(T, name) \ + _WX_DEFINE_BASEARRAY_COMMON(T, name) \ + _WX_DEFINE_BASEARRAY_NOCOMMON(T, name) + +#ifdef __INTELC__ + #pragma warning(push) + #pragma warning(disable: 1684) + #pragma warning(disable: 1572) +#endif + +_WX_DEFINE_BASEARRAY(const void *, wxBaseArrayPtrVoid) +_WX_DEFINE_BASEARRAY(char, wxBaseArrayChar) +_WX_DEFINE_BASEARRAY(short, wxBaseArrayShort) +_WX_DEFINE_BASEARRAY(int, wxBaseArrayInt) +_WX_DEFINE_BASEARRAY(long, wxBaseArrayLong) +_WX_DEFINE_BASEARRAY(size_t, wxBaseArraySizeT) +_WX_DEFINE_BASEARRAY(double, wxBaseArrayDouble) + +#ifdef __INTELC__ + #pragma warning(pop) +#endif + +#if wxUSE_STL +#include "wx/arrstr.h" + +#include "wx/beforestd.h" +#include +#include "wx/afterstd.h" + +_WX_DEFINE_BASEARRAY(wxString, wxBaseArrayStringBase) + +// some compilers (Sun CC being the only known example) distinguish between +// extern "C" functions and the functions with C++ linkage and ptr_fun and +// wxStringCompareLess can't take wxStrcmp/wxStricmp directly as arguments in +// this case, we need the wrappers below to make this work +inline int wxStrcmpCppWrapper(const wxChar *p, const wxChar *q) +{ + return wxStrcmp(p, q); +} + +inline int wxStricmpCppWrapper(const wxChar *p, const wxChar *q) +{ + return wxStricmp(p, q); +} + +int wxArrayString::Index(const wxChar* sz, bool bCase, bool WXUNUSED(bFromEnd)) const +{ + wxArrayString::const_iterator it; + + if (bCase) + { + it = std::find_if(begin(), end(), + std::not1( + std::bind2nd( + std::ptr_fun(wxStrcmpCppWrapper), sz))); + } + else // !bCase + { + it = std::find_if(begin(), end(), + std::not1( + std::bind2nd( + std::ptr_fun(wxStricmpCppWrapper), sz))); + } + + return it == end() ? wxNOT_FOUND : it - begin(); +} + +template +class wxStringCompareLess +{ +public: + wxStringCompareLess(F f) : m_f(f) { } + bool operator()(const wxChar* s1, const wxChar* s2) + { return m_f(s1, s2) < 0; } + bool operator()(const wxString& s1, const wxString& s2) + { return m_f(s1, s2) < 0; } +private: + F m_f; +}; + +template +wxStringCompareLess wxStringCompare(F f) +{ + return wxStringCompareLess(f); +} + +void wxArrayString::Sort(CompareFunction function) +{ + std::sort(begin(), end(), wxStringCompare(function)); +} + +void wxArrayString::Sort(bool reverseOrder) +{ + if (reverseOrder) + { + std::sort(begin(), end(), std::greater()); + } + else + { + std::sort(begin(), end()); + } +} + +int wxSortedArrayString::Index(const wxChar* sz, bool bCase, bool WXUNUSED(bFromEnd)) const +{ + wxSortedArrayString::const_iterator it; + wxString s(sz); + + if (bCase) + it = std::lower_bound(begin(), end(), s, + wxStringCompare(wxStrcmpCppWrapper)); + else + it = std::lower_bound(begin(), end(), s, + wxStringCompare(wxStricmpCppWrapper)); + + if (it == end()) + return wxNOT_FOUND; + + if (bCase) + { + if (wxStrcmp(it->c_str(), sz) != 0) + return wxNOT_FOUND; + } + else + { + if (wxStricmp(it->c_str(), sz) != 0) + return wxNOT_FOUND; + } + + return it - begin(); +} + +#endif diff --git a/Externals/wxWidgets/src/common/dynlib.cpp b/Externals/wxWidgets/src/common/dynlib.cpp new file mode 100644 index 0000000000..f4e75259cd --- /dev/null +++ b/Externals/wxWidgets/src/common/dynlib.cpp @@ -0,0 +1,323 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/dynlib.cpp +// Purpose: Dynamic library management +// Author: Guilhem Lavaux +// Modified by: +// Created: 20/07/98 +// RCS-ID: $Id: dynlib.cpp 41807 2006-10-09 15:58:56Z VZ $ +// Copyright: (c) 1998 Guilhem Lavaux +// 2000-2005 Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +//FIXME: This class isn't really common at all, it should be moved into +// platform dependent files (already done for Windows and Unix) + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_DYNLIB_CLASS + +#include "wx/dynlib.h" + +#ifndef WX_PRECOMP + #include "wx/intl.h" + #include "wx/log.h" + #include "wx/app.h" + #include "wx/utils.h" +#endif //WX_PRECOMP + +#include "wx/filefn.h" +#include "wx/filename.h" // for SplitPath() +#include "wx/platinfo.h" + +#include "wx/arrimpl.cpp" + +#if defined(__WXMAC__) + #include "wx/mac/private.h" +#endif + +WX_DEFINE_USER_EXPORTED_OBJARRAY(wxDynamicLibraryDetailsArray) + +// ============================================================================ +// implementation +// ============================================================================ + +// --------------------------------------------------------------------------- +// wxDynamicLibrary +// --------------------------------------------------------------------------- + +#if defined(__WXPM__) || defined(__EMX__) + const wxChar *wxDynamicLibrary::ms_dllext = _T(".dll"); +#elif defined(__WXMAC__) && !defined(__DARWIN__) + const wxChar *wxDynamicLibrary::ms_dllext = wxEmptyString; +#endif + +// for MSW/Unix it is defined in platform-specific file +#if !(defined(__WXMSW__) || defined(__UNIX__)) || defined(__EMX__) + +wxDllType wxDynamicLibrary::GetProgramHandle() +{ + wxFAIL_MSG( wxT("GetProgramHandle() is not implemented under this platform")); + return 0; +} + +#endif // __WXMSW__ || __UNIX__ + + +bool wxDynamicLibrary::Load(const wxString& libnameOrig, int flags) +{ + wxASSERT_MSG(m_handle == 0, _T("Library already loaded.")); + + // add the proper extension for the DLL ourselves unless told not to + wxString libname = libnameOrig; + if ( !(flags & wxDL_VERBATIM) ) + { + // and also check that the libname doesn't already have it + wxString ext; + wxFileName::SplitPath(libname, NULL, NULL, &ext); + if ( ext.empty() ) + { + libname += GetDllExt(); + } + } + + // different ways to load a shared library + // + // FIXME: should go to the platform-specific files! +#if defined(__WXMAC__) && !defined(__DARWIN__) + FSSpec myFSSpec; + Ptr myMainAddr; + Str255 myErrName; + + wxMacFilename2FSSpec( libname , &myFSSpec ); + + if( GetDiskFragment( &myFSSpec, + 0, + kCFragGoesToEOF, + "\p", + kPrivateCFragCopy, + &m_handle, + &myMainAddr, + myErrName ) != noErr ) + { + wxLogSysError( _("Failed to load shared library '%s' Error '%s'"), + libname.c_str(), + wxMacMakeStringFromPascal( myErrName ).c_str() ); + m_handle = 0; + } + +#elif defined(__WXPM__) || defined(__EMX__) + char err[256] = ""; + DosLoadModule(err, sizeof(err), (PSZ)libname.c_str(), &m_handle); +#else // this should be the only remaining branch eventually + m_handle = RawLoad(libname, flags); +#endif + + if ( m_handle == 0 ) + { +#ifdef wxHAVE_DYNLIB_ERROR + Error(); +#else + wxLogSysError(_("Failed to load shared library '%s'"), libname.c_str()); +#endif + } + + return IsLoaded(); +} + +// for MSW and Unix this is implemented in the platform-specific file +// +// TODO: move the rest to os2/dlpm.cpp and mac/dlmac.cpp! +#if (!defined(__WXMSW__) && !defined(__UNIX__)) || defined(__EMX__) + +/* static */ +void wxDynamicLibrary::Unload(wxDllType handle) +{ +#if defined(__OS2__) || defined(__EMX__) + DosFreeModule( handle ); +#elif defined(__WXMAC__) && !defined(__DARWIN__) + CloseConnection( (CFragConnectionID*) &handle ); +#else + #error "runtime shared lib support not implemented" +#endif +} + +#endif // !(__WXMSW__ || __UNIX__) + +void *wxDynamicLibrary::DoGetSymbol(const wxString &name, bool *success) const +{ + wxCHECK_MSG( IsLoaded(), NULL, + _T("Can't load symbol from unloaded library") ); + + void *symbol = 0; + + wxUnusedVar(symbol); +#if defined(__WXMAC__) && !defined(__DARWIN__) + Ptr symAddress; + CFragSymbolClass symClass; + Str255 symName; +#if TARGET_CARBON + c2pstrcpy( (StringPtr) symName, name.fn_str() ); +#else + strcpy( (char *)symName, name.fn_str() ); + c2pstr( (char *)symName ); +#endif + if( FindSymbol( m_handle, symName, &symAddress, &symClass ) == noErr ) + symbol = (void *)symAddress; +#elif defined(__WXPM__) || defined(__EMX__) + DosQueryProcAddr( m_handle, 1L, (PSZ)name.c_str(), (PFN*)symbol ); +#else + symbol = RawGetSymbol(m_handle, name); +#endif + + if ( success ) + *success = symbol != NULL; + + return symbol; +} + +void *wxDynamicLibrary::GetSymbol(const wxString& name, bool *success) const +{ + void *symbol = DoGetSymbol(name, success); + if ( !symbol ) + { +#ifdef wxHAVE_DYNLIB_ERROR + Error(); +#else + wxLogSysError(_("Couldn't find symbol '%s' in a dynamic library"), + name.c_str()); +#endif + } + + return symbol; +} + +// ---------------------------------------------------------------------------- +// informational methods +// ---------------------------------------------------------------------------- + +/*static*/ +wxString +wxDynamicLibrary::CanonicalizeName(const wxString& name, + wxDynamicLibraryCategory cat) +{ + wxString nameCanonic; + + // under Unix the library names usually start with "lib" prefix, add it +#if defined(__UNIX__) && !defined(__EMX__) + switch ( cat ) + { + default: + wxFAIL_MSG( _T("unknown wxDynamicLibraryCategory value") ); + // fall through + + case wxDL_MODULE: + // don't do anything for modules, their names are arbitrary + break; + + case wxDL_LIBRARY: + // library names should start with "lib" under Unix + nameCanonic = _T("lib"); + break; + } +#else // !__UNIX__ + wxUnusedVar(cat); +#endif // __UNIX__/!__UNIX__ + + nameCanonic << name << GetDllExt(); + return nameCanonic; +} + +/*static*/ +wxString wxDynamicLibrary::CanonicalizePluginName(const wxString& name, + wxPluginCategory cat) +{ + wxString suffix; + if ( cat == wxDL_PLUGIN_GUI ) + { + suffix = wxPlatformInfo::Get().GetPortIdShortName(); + } +#if wxUSE_UNICODE + suffix << _T('u'); +#endif +#ifdef __WXDEBUG__ + suffix << _T('d'); +#endif + + if ( !suffix.empty() ) + suffix = wxString(_T("_")) + suffix; + +#define WXSTRINGIZE(x) #x +#if defined(__UNIX__) && !defined(__EMX__) + #if (wxMINOR_VERSION % 2) == 0 + #define wxDLLVER(x,y,z) "-" WXSTRINGIZE(x) "." WXSTRINGIZE(y) + #else + #define wxDLLVER(x,y,z) "-" WXSTRINGIZE(x) "." WXSTRINGIZE(y) "." WXSTRINGIZE(z) + #endif +#else + #if (wxMINOR_VERSION % 2) == 0 + #define wxDLLVER(x,y,z) WXSTRINGIZE(x) WXSTRINGIZE(y) + #else + #define wxDLLVER(x,y,z) WXSTRINGIZE(x) WXSTRINGIZE(y) WXSTRINGIZE(z) + #endif +#endif + + suffix << wxString::FromAscii(wxDLLVER(wxMAJOR_VERSION, wxMINOR_VERSION, + wxRELEASE_NUMBER)); +#undef wxDLLVER +#undef WXSTRINGIZE + +#ifdef __WINDOWS__ + // Add compiler identification: + #if defined(__GNUG__) + suffix << _T("_gcc"); + #elif defined(__VISUALC__) + suffix << _T("_vc"); + #elif defined(__WATCOMC__) + suffix << _T("_wat"); + #elif defined(__BORLANDC__) + suffix << _T("_bcc"); + #endif +#endif + + return CanonicalizeName(name + suffix, wxDL_MODULE); +} + +/*static*/ +wxString wxDynamicLibrary::GetPluginsDirectory() +{ +#ifdef __UNIX__ + wxString format = wxGetInstallPrefix(); + wxString dir; + format << wxFILE_SEP_PATH + << wxT("lib") << wxFILE_SEP_PATH + << wxT("wx") << wxFILE_SEP_PATH +#if (wxMINOR_VERSION % 2) == 0 + << wxT("%i.%i"); + dir.Printf(format.c_str(), wxMAJOR_VERSION, wxMINOR_VERSION); +#else + << wxT("%i.%i.%i"); + dir.Printf(format.c_str(), + wxMAJOR_VERSION, wxMINOR_VERSION, wxRELEASE_NUMBER); +#endif + return dir; + +#else // ! __UNIX__ + return wxEmptyString; +#endif +} + + +#endif // wxUSE_DYNLIB_CLASS diff --git a/Externals/wxWidgets/src/common/dynload.cpp b/Externals/wxWidgets/src/common/dynload.cpp new file mode 100644 index 0000000000..1a0aac9b32 --- /dev/null +++ b/Externals/wxWidgets/src/common/dynload.cpp @@ -0,0 +1,362 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/dynload.cpp +// Purpose: Dynamic loading framework +// Author: Ron Lee, David Falkinder, Vadim Zeitlin and a cast of 1000's +// (derived in part from dynlib.cpp (c) 1998 Guilhem Lavaux) +// Modified by: +// Created: 03/12/01 +// RCS-ID: $Id: dynload.cpp 40943 2006-08-31 19:31:43Z ABX $ +// Copyright: (c) 2001 Ron Lee +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_DYNAMIC_LOADER + +#ifdef __WINDOWS__ + #include "wx/msw/private.h" +#endif + +#ifndef WX_PRECOMP + #include "wx/log.h" + #include "wx/intl.h" + #include "wx/hash.h" + #include "wx/utils.h" + #include "wx/module.h" +#endif + +#include "wx/strconv.h" + +#include "wx/dynload.h" + + +// --------------------------------------------------------------------------- +// wxPluginLibrary +// --------------------------------------------------------------------------- + + +wxDLImports* wxPluginLibrary::ms_classes = NULL; + +class wxPluginLibraryModule : public wxModule +{ +public: + wxPluginLibraryModule() { } + + // TODO: create ms_classes on demand, why always preallocate it? + virtual bool OnInit() + { + wxPluginLibrary::ms_classes = new wxDLImports; + wxPluginManager::CreateManifest(); + return true; + } + + virtual void OnExit() + { + delete wxPluginLibrary::ms_classes; + wxPluginLibrary::ms_classes = NULL; + wxPluginManager::ClearManifest(); + } + +private: + DECLARE_DYNAMIC_CLASS(wxPluginLibraryModule ) +}; + +IMPLEMENT_DYNAMIC_CLASS(wxPluginLibraryModule, wxModule) + + +wxPluginLibrary::wxPluginLibrary(const wxString &libname, int flags) + : m_linkcount(1) + , m_objcount(0) +{ + m_before = wxClassInfo::sm_first; + Load( libname, flags ); + m_after = wxClassInfo::sm_first; + + if( m_handle != 0 ) + { + UpdateClasses(); + RegisterModules(); + } + else + { + // Flag us for deletion + --m_linkcount; + } +} + +wxPluginLibrary::~wxPluginLibrary() +{ + if( m_handle != 0 ) + { + UnregisterModules(); + RestoreClasses(); + } +} + +wxPluginLibrary *wxPluginLibrary::RefLib() +{ + wxCHECK_MSG( m_linkcount > 0, NULL, + _T("Library had been already deleted!") ); + + ++m_linkcount; + return this; +} + +bool wxPluginLibrary::UnrefLib() +{ + wxASSERT_MSG( m_objcount == 0, + _T("Library unloaded before all objects were destroyed") ); + + if ( m_linkcount == 0 || --m_linkcount == 0 ) + { + delete this; + return true; + } + + return false; +} + +// ------------------------ +// Private methods +// ------------------------ + +void wxPluginLibrary::UpdateClasses() +{ + for (wxClassInfo *info = m_after; info != m_before; info = info->m_next) + { + if( info->GetClassName() ) + { + // Hash all the class names into a local table too so + // we can quickly find the entry they correspond to. + (*ms_classes)[info->GetClassName()] = this; + } + } +} + +void wxPluginLibrary::RestoreClasses() +{ + // Check if there is a need to restore classes. + if (!ms_classes) + return; + + for(wxClassInfo *info = m_after; info != m_before; info = info->m_next) + { + ms_classes->erase(ms_classes->find(info->GetClassName())); + } +} + +void wxPluginLibrary::RegisterModules() +{ + // Plugin libraries might have wxModules, Register and initialise them if + // they do. + // + // Note that these classes are NOT included in the reference counting since + // it's implicit that they will be unloaded if and when the last handle to + // the library is. We do have to keep a copy of the module's pointer + // though, as there is currently no way to Unregister it without it. + + wxASSERT_MSG( m_linkcount == 1, + _T("RegisterModules should only be called for the first load") ); + + for ( wxClassInfo *info = m_after; info != m_before; info = info->m_next) + { + if( info->IsKindOf(CLASSINFO(wxModule)) ) + { + wxModule *m = wxDynamicCast(info->CreateObject(), wxModule); + + wxASSERT_MSG( m, _T("wxDynamicCast of wxModule failed") ); + + m_wxmodules.push_back(m); + wxModule::RegisterModule(m); + } + } + + // FIXME: Likewise this is (well was) very similar to InitializeModules() + + for ( wxModuleList::iterator it = m_wxmodules.begin(); + it != m_wxmodules.end(); + ++it) + { + if( !(*it)->Init() ) + { + wxLogDebug(_T("wxModule::Init() failed for wxPluginLibrary")); + + // XXX: Watch this, a different hash implementation might break it, + // a good hash implementation would let us fix it though. + + // The name of the game is to remove any uninitialised modules and + // let the dtor Exit the rest on shutdown, (which we'll initiate + // shortly). + + wxModuleList::iterator oldNode = m_wxmodules.end(); + do { + ++it; + if( oldNode != m_wxmodules.end() ) + m_wxmodules.erase(oldNode); + wxModule::UnregisterModule( *it ); + oldNode = it; + } while( it != m_wxmodules.end() ); + + --m_linkcount; // Flag us for deletion + break; + } + } +} + +void wxPluginLibrary::UnregisterModules() +{ + wxModuleList::iterator it; + + for ( it = m_wxmodules.begin(); it != m_wxmodules.end(); ++it ) + (*it)->Exit(); + + for ( it = m_wxmodules.begin(); it != m_wxmodules.end(); ++it ) + wxModule::UnregisterModule( *it ); + + // NB: content of the list was deleted by UnregisterModule calls above: + m_wxmodules.clear(); +} + + +// --------------------------------------------------------------------------- +// wxPluginManager +// --------------------------------------------------------------------------- + +wxDLManifest* wxPluginManager::ms_manifest = NULL; + +// ------------------------ +// Static accessors +// ------------------------ + +wxPluginLibrary * +wxPluginManager::LoadLibrary(const wxString &libname, int flags) +{ + wxString realname(libname); + + if( !(flags & wxDL_VERBATIM) ) + realname += wxDynamicLibrary::GetDllExt(); + + wxPluginLibrary *entry; + + if ( flags & wxDL_NOSHARE ) + { + entry = NULL; + } + else + { + entry = FindByName(realname); + } + + if ( entry ) + { + wxLogTrace(_T("dll"), + _T("LoadLibrary(%s): already loaded."), realname.c_str()); + + entry->RefLib(); + } + else + { + entry = new wxPluginLibrary( libname, flags ); + + if ( entry->IsLoaded() ) + { + (*ms_manifest)[realname] = entry; + + wxLogTrace(_T("dll"), + _T("LoadLibrary(%s): loaded ok."), realname.c_str()); + + } + else + { + wxLogTrace(_T("dll"), + _T("LoadLibrary(%s): failed to load."), realname.c_str()); + + // we have created entry just above + if ( !entry->UnrefLib() ) + { + // ... so UnrefLib() is supposed to delete it + wxFAIL_MSG( _T("Currently linked library is not loaded?") ); + } + + entry = NULL; + } + } + + return entry; +} + +bool wxPluginManager::UnloadLibrary(const wxString& libname) +{ + wxString realname = libname; + + wxPluginLibrary *entry = FindByName(realname); + + if ( !entry ) + { + realname += wxDynamicLibrary::GetDllExt(); + + entry = FindByName(realname); + } + + if ( !entry ) + { + wxLogDebug(_T("Attempt to unload library '%s' which is not loaded."), + libname.c_str()); + + return false; + } + + wxLogTrace(_T("dll"), _T("UnloadLibrary(%s)"), realname.c_str()); + + if ( !entry->UnrefLib() ) + { + // not really unloaded yet + return false; + } + + ms_manifest->erase(ms_manifest->find(realname)); + + return true; +} + +// ------------------------ +// Class implementation +// ------------------------ + +bool wxPluginManager::Load(const wxString &libname, int flags) +{ + m_entry = wxPluginManager::LoadLibrary(libname, flags); + + return IsLoaded(); +} + +void wxPluginManager::Unload() +{ + wxCHECK_RET( m_entry, _T("unloading an invalid wxPluginManager?") ); + + for ( wxDLManifest::iterator i = ms_manifest->begin(); + i != ms_manifest->end(); + ++i ) + { + if ( i->second == m_entry ) + { + ms_manifest->erase(i); + break; + } + } + + m_entry->UnrefLib(); + + m_entry = NULL; +} + +#endif // wxUSE_DYNAMIC_LOADER diff --git a/Externals/wxWidgets/src/common/effects.cpp b/Externals/wxWidgets/src/common/effects.cpp new file mode 100644 index 0000000000..444595b5f6 --- /dev/null +++ b/Externals/wxWidgets/src/common/effects.cpp @@ -0,0 +1,124 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/effects.cpp +// Purpose: wxEffects implementation +// Author: Julian Smart +// Modified by: +// Created: 25/4/2000 +// RCS-ID: $Id: effects.cpp 42755 2006-10-30 19:41:46Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#include "wx/effects.h" + +#ifndef WX_PRECOMP + #include "wx/dcmemory.h" + #include "wx/pen.h" + #include "wx/settings.h" + #include "wx/gdicmn.h" +#endif //WX_PRECOMP + +/* + * wxEffects: various 3D effects + */ + +IMPLEMENT_CLASS(wxEffects, wxObject) + +// Assume system colours +wxEffects::wxEffects() +{ + m_highlightColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DHILIGHT) ; + m_lightShadow = wxSystemSettings::GetColour(wxSYS_COLOUR_3DLIGHT) ; + m_faceColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE) ; + m_mediumShadow = wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW) ; + m_darkShadow = wxSystemSettings::GetColour(wxSYS_COLOUR_3DDKSHADOW) ; +} + +// Going from lightest to darkest +wxEffects::wxEffects(const wxColour& highlightColour, const wxColour& lightShadow, + const wxColour& faceColour, const wxColour& mediumShadow, const wxColour& darkShadow) +{ + m_highlightColour = highlightColour; + m_lightShadow = lightShadow; + m_faceColour = faceColour; + m_mediumShadow = mediumShadow; + m_darkShadow = darkShadow; +} + +// Draw a sunken edge +void wxEffects::DrawSunkenEdge(wxDC& dc, const wxRect& rect, int WXUNUSED(borderSize)) +{ + wxPen highlightPen(m_highlightColour, 1, wxSOLID); + wxPen lightShadowPen(m_lightShadow, 1, wxSOLID); + wxPen facePen(m_faceColour, 1, wxSOLID); + wxPen mediumShadowPen(m_mediumShadow, 1, wxSOLID); + wxPen darkShadowPen(m_darkShadow, 1, wxSOLID); + + //// LEFT AND TOP + // Draw a medium shadow pen on left and top, followed by dark shadow line to + // right and below of these lines + + dc.SetPen(mediumShadowPen); + dc.DrawLine(rect.x, rect.y, rect.x+rect.width-1, rect.y); // Top + dc.DrawLine(rect.x, rect.y, rect.x, rect.y+rect.height-1); // Left + + dc.SetPen(darkShadowPen); + dc.DrawLine(rect.x+1, rect.y+1, rect.x+rect.width-2, rect.y+1); // Top + dc.DrawLine(rect.x+1, rect.y+1, rect.x+1, rect.y+rect.height-1); // Left + + //// RIGHT AND BOTTOM + + dc.SetPen(highlightPen); + dc.DrawLine(rect.x+rect.width-1, rect.y, rect.x+rect.width-1, rect.y+rect.height-1); // Right + dc.DrawLine(rect.x, rect.y+rect.height-1, rect.x+rect.width, rect.y+rect.height-1); // Bottom + + dc.SetPen(lightShadowPen); + dc.DrawLine(rect.x+rect.width-2, rect.y+1, rect.x+rect.width-2, rect.y+rect.height-2); // Right + dc.DrawLine(rect.x+1, rect.y+rect.height-2, rect.x+rect.width-1, rect.y+rect.height-2); // Bottom + + dc.SetPen(wxNullPen); +} + +bool wxEffects::TileBitmap(const wxRect& rect, wxDC& dc, const wxBitmap& bitmap) +{ + int w = bitmap.GetWidth(); + int h = bitmap.GetHeight(); + + wxMemoryDC dcMem; + +#if wxUSE_PALETTE + static bool hiColour = (wxDisplayDepth() >= 16) ; + if (bitmap.GetPalette() && !hiColour) + { + dc.SetPalette(* bitmap.GetPalette()); + dcMem.SetPalette(* bitmap.GetPalette()); + } +#endif // wxUSE_PALETTE + + dcMem.SelectObjectAsSource(bitmap); + + int i, j; + for (i = rect.x; i < rect.x + rect.width; i += w) + { + for (j = rect.y; j < rect.y + rect.height; j+= h) + dc.Blit(i, j, bitmap.GetWidth(), bitmap.GetHeight(), & dcMem, 0, 0); + } + dcMem.SelectObject(wxNullBitmap); + +#if wxUSE_PALETTE + if (bitmap.GetPalette() && !hiColour) + { + dc.SetPalette(wxNullPalette); + dcMem.SetPalette(wxNullPalette); + } +#endif // wxUSE_PALETTE + + return true; +} diff --git a/Externals/wxWidgets/src/common/emptydmy.cpp b/Externals/wxWidgets/src/common/emptydmy.cpp new file mode 100644 index 0000000000..9e79b3b00a --- /dev/null +++ b/Externals/wxWidgets/src/common/emptydmy.cpp @@ -0,0 +1,3 @@ +// This file exists so that it can be compiled into an object so the linker +// will have something to chew on so that builds don't break when a platform +// lacks any objects in a particular multilib. diff --git a/Externals/wxWidgets/src/common/encconv.cpp b/Externals/wxWidgets/src/common/encconv.cpp new file mode 100644 index 0000000000..15f884fb9d --- /dev/null +++ b/Externals/wxWidgets/src/common/encconv.cpp @@ -0,0 +1,531 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: encconv.cpp +// Purpose: wxEncodingConverter class for converting between different +// font encodings +// Author: Vaclav Slavik +// Copyright: (c) 1999 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#include "wx/encconv.h" + +#include + +// conversion tables, generated by scripts in $(WXWIN)/misc/unictabl: +#if defined( __BORLANDC__ ) || defined(__DARWIN__) + #include "../common/unictabl.inc" +#else + #include "unictabl.inc" +#endif + +#if wxUSE_WCHAR_T + typedef wchar_t tchar; +#else + typedef char tchar; +#endif + +#ifdef __WXMAC__ +#ifdef __DARWIN__ +#include +#else +#include +#include +#include +#endif + #include "wx/fontutil.h" + #include "wx/mac/private.h" // includes mac headers + + wxUint16 gMacEncodings[wxFONTENCODING_MACMAX-wxFONTENCODING_MACMIN+1][128] ; + bool gMacEncodingsInited[wxFONTENCODING_MACMAX-wxFONTENCODING_MACMIN+1] ; +#endif + +#ifdef __WXWINCE__ + #include "wx/msw/wince/missing.h" // for bsearch() +#endif + +static const wxUint16* GetEncTable(wxFontEncoding enc) +{ +#ifdef __WXMAC__ + if( enc >= wxFONTENCODING_MACMIN && enc <= wxFONTENCODING_MACMAX ) + { + int i = enc-wxFONTENCODING_MACMIN ; + if ( gMacEncodingsInited[i] == false ) + { + TECObjectRef converter ; + TextEncodingBase code = wxMacGetSystemEncFromFontEnc( enc ) ; + TextEncodingBase unicode = CreateTextEncoding(kTextEncodingUnicodeDefault,0,kUnicode16BitFormat) ; + OSStatus status = TECCreateConverter(&converter,code,unicode); + char s[2] ; + s[1] = 0 ; + ByteCount byteInLen, byteOutLen ; + for( unsigned char c = 255 ; c >= 128 ; --c ) + { + s[0] = c ; + status = TECConvertText(converter, (ConstTextPtr) &s , 1, &byteInLen, + (TextPtr) &gMacEncodings[i][c-128] , 2, &byteOutLen); + } + status = TECDisposeConverter(converter); + gMacEncodingsInited[i]=true; + } + return gMacEncodings[i] ; + } +#endif + + for (int i = 0; encodings_list[i].table != NULL; i++) + { + if (encodings_list[i].encoding == enc) + return encodings_list[i].table; + } + return NULL; +} + +typedef struct { + wxUint16 u; + wxUint8 c; +} CharsetItem; + +extern "C" int wxCMPFUNC_CONV +CompareCharsetItems(const void *i1, const void *i2) +{ + return ( ((CharsetItem*)i1) -> u - ((CharsetItem*)i2) -> u ); +} + + +static CharsetItem* BuildReverseTable(const wxUint16 *tbl) +{ + CharsetItem *rev = new CharsetItem[128]; + + for (int i = 0; i < 128; i++) + rev[i].c = wxUint8(128 + i), rev[i].u = tbl[i]; + + qsort(rev, 128, sizeof(CharsetItem), CompareCharsetItems); + + return rev; +} + + + +wxEncodingConverter::wxEncodingConverter() +{ + m_Table = NULL; + m_UnicodeInput = m_UnicodeOutput = false; + m_JustCopy = false; +} + + + +bool wxEncodingConverter::Init(wxFontEncoding input_enc, wxFontEncoding output_enc, int method) +{ + unsigned i; + const wxUint16 *in_tbl; + const wxUint16 *out_tbl = NULL; + + if (m_Table) {delete[] m_Table; m_Table = NULL;} + +#if !wxUSE_WCHAR_T + if (input_enc == wxFONTENCODING_UNICODE || output_enc == wxFONTENCODING_UNICODE) return false; +#endif + + if (input_enc == output_enc) {m_JustCopy = true; return true;} + + m_UnicodeOutput = (output_enc == wxFONTENCODING_UNICODE); + m_JustCopy = false; + + if (input_enc == wxFONTENCODING_UNICODE) + { + if ((out_tbl = GetEncTable(output_enc)) == NULL) return false; + + m_Table = new tchar[65536]; + for (i = 0; i < 128; i++) m_Table[i] = (tchar)i; // 7bit ASCII + for (i = 128; i < 65536; i++) m_Table[i] = (tchar)0; + + if (method == wxCONVERT_SUBSTITUTE) + { + for (i = 0; i < encoding_unicode_fallback_count; i++) + m_Table[encoding_unicode_fallback[i].c] = (tchar) encoding_unicode_fallback[i].s; + } + + for (i = 0; i < 128; i++) + m_Table[out_tbl[i]] = (tchar)(128 + i); + + m_UnicodeInput = true; + } + else // input !Unicode + { + if ((in_tbl = GetEncTable(input_enc)) == NULL) return false; + if (output_enc != wxFONTENCODING_UNICODE) + if ((out_tbl = GetEncTable(output_enc)) == NULL) return false; + + m_UnicodeInput = false; + + m_Table = new tchar[256]; + for (i = 0; i < 128; i++) m_Table[i] = (tchar)i; // 7bit ASCII + + if (output_enc == wxFONTENCODING_UNICODE) + { + for (i = 0; i < 128; i++) m_Table[128 + i] = (tchar)in_tbl[i]; + return true; + } + else // output !Unicode + { + CharsetItem *rev = BuildReverseTable(out_tbl); + CharsetItem *item; + CharsetItem key; + + for (i = 0; i < 128; i++) + { + key.u = in_tbl[i]; + item = (CharsetItem*) bsearch(&key, rev, 128, sizeof(CharsetItem), CompareCharsetItems); + if (item == NULL && method == wxCONVERT_SUBSTITUTE) + item = (CharsetItem*) bsearch(&key, encoding_unicode_fallback, + encoding_unicode_fallback_count, sizeof(CharsetItem), CompareCharsetItems); + if (item) + m_Table[128 + i] = (tchar)item -> c; + else +#if wxUSE_WCHAR_T + m_Table[128 + i] = (wchar_t)(128 + i); +#else + m_Table[128 + i] = (char)(128 + i); +#endif + } + + delete[] rev; + } + } + + return true; +} + + +#define REPLACEMENT_CHAR ((tchar)'?') + +inline tchar GetTableValue(const tchar *table, tchar value, bool& repl) +{ + tchar r = table[value]; + if (r == 0 && value != 0) + { + r = REPLACEMENT_CHAR; + repl = true; + } + return r; +} + + +bool wxEncodingConverter::Convert(const char* input, char* output) const +{ + wxASSERT_MSG(!m_UnicodeOutput, wxT("You cannot convert to unicode if output is const char*!")); + wxASSERT_MSG(!m_UnicodeInput, wxT("You cannot convert from unicode if input is const char*!")); + + const char *i; + char *o; + + if (m_JustCopy) + { + strcpy(output, input); + return true; + } + + wxCHECK_MSG(m_Table != NULL, false, + wxT("You must call wxEncodingConverter::Init() before actually converting!")); + + bool replaced = false; + + for (i = input, o = output; *i != 0;) + *(o++) = (char)(GetTableValue(m_Table, (wxUint8)*(i++), replaced)); + *o = 0; + + return !replaced; +} + + +#if wxUSE_WCHAR_T + +bool wxEncodingConverter::Convert(const char* input, wchar_t* output) const +{ + wxASSERT_MSG(m_UnicodeOutput, wxT("You cannot convert to 8-bit if output is const wchar_t*!")); + wxASSERT_MSG(!m_UnicodeInput, wxT("You cannot convert from unicode if input is const char*!")); + + const char *i; + wchar_t *o; + + if (m_JustCopy) + { + for (i = input, o = output; *i != 0;) + *(o++) = (wchar_t)(*(i++)); + *o = 0; + return true; + } + + wxCHECK_MSG(m_Table != NULL, false, + wxT("You must call wxEncodingConverter::Init() before actually converting!")); + + bool replaced = false; + + for (i = input, o = output; *i != 0;) + *(o++) = (wchar_t)(GetTableValue(m_Table, (wxUint8)*(i++), replaced)); + *o = 0; + + return !replaced; +} + + + +bool wxEncodingConverter::Convert(const wchar_t* input, char* output) const +{ + wxASSERT_MSG(!m_UnicodeOutput, wxT("You cannot convert to unicode if output is const char*!")); + wxASSERT_MSG(m_UnicodeInput, wxT("You cannot convert from 8-bit if input is const wchar_t*!")); + + const wchar_t *i; + char *o; + + if (m_JustCopy) + { + for (i = input, o = output; *i != 0;) + *(o++) = (char)(*(i++)); + *o = 0; + return true; + } + + wxCHECK_MSG(m_Table != NULL, false, + wxT("You must call wxEncodingConverter::Init() before actually converting!")); + + bool replaced = false; + + for (i = input, o = output; *i != 0;) + *(o++) = (char)(GetTableValue(m_Table, (wxUint16)*(i++), replaced)); + *o = 0; + + return !replaced; +} + + + +bool wxEncodingConverter::Convert(const wchar_t* input, wchar_t* output) const +{ + wxASSERT_MSG(m_UnicodeOutput, wxT("You cannot convert to 8-bit if output is const wchar_t*!")); + wxASSERT_MSG(m_UnicodeInput, wxT("You cannot convert from 8-bit if input is const wchar_t*!")); + + const wchar_t *i; + wchar_t *o; + + if (m_JustCopy) + { + // wcscpy() is not guaranteed to exist + for (i = input, o = output; *i != 0;) + *(o++) = (*(i++)); + *o = 0; + return true; + } + + wxCHECK_MSG(m_Table != NULL, false, + wxT("You must call wxEncodingConverter::Init() before actually converting!")); + + bool replaced = false; + + for (i = input, o = output; *i != 0;) + *(o++) = (wchar_t)(GetTableValue(m_Table, (wxUint8)*(i++), replaced)); + *o = 0; + + return !replaced; +} + +#endif // wxUSE_WCHAR_T + + +wxString wxEncodingConverter::Convert(const wxString& input) const +{ + if (m_JustCopy) return input; + + wxString s; + const wxChar *i; + + wxCHECK_MSG(m_Table != NULL, s, + wxT("You must call wxEncodingConverter::Init() before actually converting!")); + + if (m_UnicodeInput) + { + for (i = input.c_str(); *i != 0; i++) + s << (wxChar)(m_Table[(wxUint16)*i]); + } + else + { + for (i = input.c_str(); *i != 0; i++) + s << (wxChar)(m_Table[(wxUint8)*i]); + } + + return s; +} + + + + + + + +// Following tables describe classes of encoding equivalence. +// + +#define STOP wxFONTENCODING_SYSTEM + +#define NUM_OF_PLATFORMS 4 /*must conform to enum wxPLATFORM_XXXX !!!*/ +#define ENC_PER_PLATFORM 3 + // max no. of encodings for one language used on one platform. + // Using maximum of everything at the current moment to not make the + // library larger than necessary. Make larger only if necessary - MR + +static const wxFontEncoding + EquivalentEncodings[][NUM_OF_PLATFORMS][ENC_PER_PLATFORM+1] = { + + // *** Please put more common encodings as first! *** + + // Western European + { + /* unix */ {wxFONTENCODING_ISO8859_1, wxFONTENCODING_ISO8859_15, STOP}, + /* windows */ {wxFONTENCODING_CP1252, STOP}, + /* os2 */ {STOP}, + /* mac */ {wxFONTENCODING_MACROMAN, STOP} + }, + + // Central European + { + /* unix */ {wxFONTENCODING_ISO8859_2, STOP}, + /* windows */ {wxFONTENCODING_CP1250, STOP}, + /* os2 */ {STOP}, + /* mac */ {wxFONTENCODING_MACCENTRALEUR, STOP} + }, + + // Baltic + { + /* unix */ {wxFONTENCODING_ISO8859_13, wxFONTENCODING_ISO8859_4, STOP}, + /* windows */ {wxFONTENCODING_CP1257, STOP}, + /* os2 */ {STOP}, + /* mac */ {STOP} + }, + + // Hebrew + { + /* unix */ {wxFONTENCODING_ISO8859_8, STOP}, + /* windows */ {wxFONTENCODING_CP1255, STOP}, + /* os2 */ {STOP}, + /* mac */ {wxFONTENCODING_MACHEBREW, STOP} + }, + + // Greek + { + /* unix */ {wxFONTENCODING_ISO8859_7, STOP}, + /* windows */ {wxFONTENCODING_CP1253, STOP}, + /* os2 */ {STOP}, + /* mac */ {wxFONTENCODING_MACGREEK, STOP} + }, + + // Arabic + { + /* unix */ {wxFONTENCODING_ISO8859_6, STOP}, + /* windows */ {wxFONTENCODING_CP1256, STOP}, + /* os2 */ {STOP}, + /* mac */ {wxFONTENCODING_MACARABIC, STOP} + }, + + // Turkish + { + /* unix */ {wxFONTENCODING_ISO8859_9, STOP}, + /* windows */ {wxFONTENCODING_CP1254, STOP}, + /* os2 */ {STOP}, + /* mac */ {wxFONTENCODING_MACTURKISH, STOP} + }, + + // Cyrillic + { + /* unix */ {wxFONTENCODING_KOI8, wxFONTENCODING_KOI8_U, wxFONTENCODING_ISO8859_5, STOP}, + /* windows */ {wxFONTENCODING_CP1251, STOP}, + /* os2 */ {STOP}, + /* mac */ {wxFONTENCODING_MACCYRILLIC, STOP} + }, + + {{STOP},{STOP},{STOP},{STOP}} /* Terminator */ + /* no, _not_ Arnold! */ +}; + + +static bool FindEncoding(const wxFontEncodingArray& arr, wxFontEncoding f) +{ + for (wxFontEncodingArray::const_iterator it = arr.begin(), en = arr.end(); + it != en; ++it) + if (*it == f) + return true; + return false; +} + +wxFontEncodingArray wxEncodingConverter::GetPlatformEquivalents(wxFontEncoding enc, int platform) +{ + if (platform == wxPLATFORM_CURRENT) + { +#if defined(__WXMSW__) + platform = wxPLATFORM_WINDOWS; +#elif defined(__WXGTK__) || defined(__WXMOTIF__) + platform = wxPLATFORM_UNIX; +#elif defined(__WXPM__) + platform = wxPLATFORM_OS2; +#elif defined(__WXMAC__) + platform = wxPLATFORM_MAC; +#endif + } + + int i, clas, e ; + const wxFontEncoding *f; + wxFontEncodingArray arr; + + clas = 0; + while (EquivalentEncodings[clas][0][0] != STOP) + { + for (i = 0; i < NUM_OF_PLATFORMS; i++) + for (e = 0; EquivalentEncodings[clas][i][e] != STOP; e++) + if (EquivalentEncodings[clas][i][e] == enc) + { + for (f = EquivalentEncodings[clas][platform]; *f != STOP; f++) + if (*f == enc) arr.push_back(enc); + for (f = EquivalentEncodings[clas][platform]; *f != STOP; f++) + if (!FindEncoding(arr, *f)) arr.push_back(*f); + i = NUM_OF_PLATFORMS/*hack*/; break; + } + clas++; + } + + return arr; +} + + + +wxFontEncodingArray wxEncodingConverter::GetAllEquivalents(wxFontEncoding enc) +{ + int i, clas, e, j ; + const wxFontEncoding *f; + wxFontEncodingArray arr; + + arr = GetPlatformEquivalents(enc); // we want them to be first items in array + + clas = 0; + while (EquivalentEncodings[clas][0][0] != STOP) + { + for (i = 0; i < NUM_OF_PLATFORMS; i++) + for (e = 0; EquivalentEncodings[clas][i][e] != STOP; e++) + if (EquivalentEncodings[clas][i][e] == enc) + { + for (j = 0; j < NUM_OF_PLATFORMS; j++) + for (f = EquivalentEncodings[clas][j]; *f != STOP; f++) + if (!FindEncoding(arr, *f)) arr.push_back(*f); + i = NUM_OF_PLATFORMS/*hack*/; break; + } + clas++; + } + + return arr; +} + diff --git a/Externals/wxWidgets/src/common/event.cpp b/Externals/wxWidgets/src/common/event.cpp new file mode 100644 index 0000000000..b524ee95ee --- /dev/null +++ b/Externals/wxWidgets/src/common/event.cpp @@ -0,0 +1,1485 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/event.cpp +// Purpose: Event classes +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: event.cpp 48332 2007-08-22 14:46:50Z DE $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#include "wx/event.h" + +#ifndef WX_PRECOMP + #include "wx/list.h" + #include "wx/app.h" + #include "wx/utils.h" + #include "wx/stopwatch.h" + #include "wx/module.h" + + #if wxUSE_GUI + #include "wx/control.h" + #include "wx/dc.h" + #include "wx/textctrl.h" + #include "wx/validate.h" + #endif // wxUSE_GUI +#endif + +// ---------------------------------------------------------------------------- +// wxWin macros +// ---------------------------------------------------------------------------- + +#if wxUSE_BASE + IMPLEMENT_DYNAMIC_CLASS(wxEvtHandler, wxObject) + IMPLEMENT_ABSTRACT_CLASS(wxEvent, wxObject) +#endif // wxUSE_BASE + +#if wxUSE_GUI + IMPLEMENT_DYNAMIC_CLASS(wxIdleEvent, wxEvent) + IMPLEMENT_DYNAMIC_CLASS(wxCommandEvent, wxEvent) + IMPLEMENT_DYNAMIC_CLASS(wxNotifyEvent, wxCommandEvent) + IMPLEMENT_DYNAMIC_CLASS(wxScrollEvent, wxCommandEvent) + IMPLEMENT_DYNAMIC_CLASS(wxScrollWinEvent, wxEvent) + IMPLEMENT_DYNAMIC_CLASS(wxMouseEvent, wxEvent) + IMPLEMENT_DYNAMIC_CLASS(wxKeyEvent, wxEvent) + IMPLEMENT_DYNAMIC_CLASS(wxSizeEvent, wxEvent) + IMPLEMENT_DYNAMIC_CLASS(wxPaintEvent, wxEvent) + IMPLEMENT_DYNAMIC_CLASS(wxNcPaintEvent, wxEvent) + IMPLEMENT_DYNAMIC_CLASS(wxEraseEvent, wxEvent) + IMPLEMENT_DYNAMIC_CLASS(wxMoveEvent, wxEvent) + IMPLEMENT_DYNAMIC_CLASS(wxFocusEvent, wxEvent) + IMPLEMENT_DYNAMIC_CLASS(wxChildFocusEvent, wxCommandEvent) + IMPLEMENT_DYNAMIC_CLASS(wxCloseEvent, wxEvent) + IMPLEMENT_DYNAMIC_CLASS(wxShowEvent, wxEvent) + IMPLEMENT_DYNAMIC_CLASS(wxMaximizeEvent, wxEvent) + IMPLEMENT_DYNAMIC_CLASS(wxIconizeEvent, wxEvent) + IMPLEMENT_DYNAMIC_CLASS(wxMenuEvent, wxEvent) + IMPLEMENT_DYNAMIC_CLASS(wxJoystickEvent, wxEvent) + IMPLEMENT_DYNAMIC_CLASS(wxDropFilesEvent, wxEvent) + IMPLEMENT_DYNAMIC_CLASS(wxActivateEvent, wxEvent) + IMPLEMENT_DYNAMIC_CLASS(wxInitDialogEvent, wxEvent) + IMPLEMENT_DYNAMIC_CLASS(wxSetCursorEvent, wxEvent) + IMPLEMENT_DYNAMIC_CLASS(wxSysColourChangedEvent, wxEvent) + IMPLEMENT_DYNAMIC_CLASS(wxDisplayChangedEvent, wxEvent) + IMPLEMENT_DYNAMIC_CLASS(wxUpdateUIEvent, wxCommandEvent) + IMPLEMENT_DYNAMIC_CLASS(wxNavigationKeyEvent, wxEvent) + IMPLEMENT_DYNAMIC_CLASS(wxPaletteChangedEvent, wxEvent) + IMPLEMENT_DYNAMIC_CLASS(wxQueryNewPaletteEvent, wxEvent) + IMPLEMENT_DYNAMIC_CLASS(wxWindowCreateEvent, wxEvent) + IMPLEMENT_DYNAMIC_CLASS(wxWindowDestroyEvent, wxEvent) + IMPLEMENT_DYNAMIC_CLASS(wxHelpEvent, wxCommandEvent) + IMPLEMENT_DYNAMIC_CLASS(wxContextMenuEvent, wxCommandEvent) + IMPLEMENT_DYNAMIC_CLASS(wxMouseCaptureChangedEvent, wxEvent) + IMPLEMENT_DYNAMIC_CLASS(wxMouseCaptureLostEvent, wxEvent) + IMPLEMENT_DYNAMIC_CLASS(wxClipboardTextEvent, wxCommandEvent) +#endif // wxUSE_GUI + +#if wxUSE_BASE + +const wxEventTable *wxEvtHandler::GetEventTable() const + { return &wxEvtHandler::sm_eventTable; } + +const wxEventTable wxEvtHandler::sm_eventTable = + { (const wxEventTable *)NULL, &wxEvtHandler::sm_eventTableEntries[0] }; + +wxEventHashTable &wxEvtHandler::GetEventHashTable() const + { return wxEvtHandler::sm_eventHashTable; } + +wxEventHashTable wxEvtHandler::sm_eventHashTable(wxEvtHandler::sm_eventTable); + +const wxEventTableEntry wxEvtHandler::sm_eventTableEntries[] = + { DECLARE_EVENT_TABLE_ENTRY(wxEVT_NULL, 0, 0, (wxObjectEventFunction)NULL, NULL) }; + + +#ifdef __WXDEBUG__ +// Clear up event hash table contents or we can get problems +// when C++ is cleaning up the static object +class wxEventTableEntryModule: public wxModule +{ +DECLARE_DYNAMIC_CLASS(wxEventTableEntryModule) +public: + wxEventTableEntryModule() {} + bool OnInit() + { + wxEventHashTable::ReconstructAll(); + return true; + } + void OnExit() + { + wxEventHashTable::ClearAll(); + } +}; +IMPLEMENT_DYNAMIC_CLASS(wxEventTableEntryModule, wxModule) +#endif + +// ---------------------------------------------------------------------------- +// global variables +// ---------------------------------------------------------------------------- + +// To put pending event handlers +wxList *wxPendingEvents = (wxList *)NULL; + +#if wxUSE_THREADS + // protects wxPendingEvents list + wxCriticalSection *wxPendingEventsLocker = (wxCriticalSection *)NULL; +#endif + +#if !WXWIN_COMPATIBILITY_EVENT_TYPES + +// common event types are defined here, other event types are defined by the +// components which use them + +const wxEventType wxEVT_FIRST = 10000; +const wxEventType wxEVT_USER_FIRST = wxEVT_FIRST + 2000; + +DEFINE_EVENT_TYPE(wxEVT_NULL) +DEFINE_EVENT_TYPE(wxEVT_IDLE) +DEFINE_EVENT_TYPE(wxEVT_SOCKET) + +#endif // !WXWIN_COMPATIBILITY_EVENT_TYPES + +#endif // wxUSE_BASE + +#if wxUSE_GUI + +#if !WXWIN_COMPATIBILITY_EVENT_TYPES + +DEFINE_EVENT_TYPE(wxEVT_COMMAND_BUTTON_CLICKED) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_CHECKBOX_CLICKED) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_CHOICE_SELECTED) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_LISTBOX_SELECTED) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_LISTBOX_DOUBLECLICKED) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_CHECKLISTBOX_TOGGLED) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_MENU_SELECTED) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_SLIDER_UPDATED) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_RADIOBOX_SELECTED) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_RADIOBUTTON_SELECTED) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_SCROLLBAR_UPDATED) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_VLBOX_SELECTED) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_COMBOBOX_SELECTED) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_TOOL_RCLICKED) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_TOOL_ENTER) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_SPINCTRL_UPDATED) + +// Sockets and timers send events, too +DEFINE_EVENT_TYPE(wxEVT_TIMER) + +// Mouse event types +DEFINE_EVENT_TYPE(wxEVT_LEFT_DOWN) +DEFINE_EVENT_TYPE(wxEVT_LEFT_UP) +DEFINE_EVENT_TYPE(wxEVT_MIDDLE_DOWN) +DEFINE_EVENT_TYPE(wxEVT_MIDDLE_UP) +DEFINE_EVENT_TYPE(wxEVT_RIGHT_DOWN) +DEFINE_EVENT_TYPE(wxEVT_RIGHT_UP) +DEFINE_EVENT_TYPE(wxEVT_MOTION) +DEFINE_EVENT_TYPE(wxEVT_ENTER_WINDOW) +DEFINE_EVENT_TYPE(wxEVT_LEAVE_WINDOW) +DEFINE_EVENT_TYPE(wxEVT_LEFT_DCLICK) +DEFINE_EVENT_TYPE(wxEVT_MIDDLE_DCLICK) +DEFINE_EVENT_TYPE(wxEVT_RIGHT_DCLICK) +DEFINE_EVENT_TYPE(wxEVT_SET_FOCUS) +DEFINE_EVENT_TYPE(wxEVT_KILL_FOCUS) +DEFINE_EVENT_TYPE(wxEVT_CHILD_FOCUS) +DEFINE_EVENT_TYPE(wxEVT_MOUSEWHEEL) + +// Non-client mouse events +DEFINE_EVENT_TYPE(wxEVT_NC_LEFT_DOWN) +DEFINE_EVENT_TYPE(wxEVT_NC_LEFT_UP) +DEFINE_EVENT_TYPE(wxEVT_NC_MIDDLE_DOWN) +DEFINE_EVENT_TYPE(wxEVT_NC_MIDDLE_UP) +DEFINE_EVENT_TYPE(wxEVT_NC_RIGHT_DOWN) +DEFINE_EVENT_TYPE(wxEVT_NC_RIGHT_UP) +DEFINE_EVENT_TYPE(wxEVT_NC_MOTION) +DEFINE_EVENT_TYPE(wxEVT_NC_ENTER_WINDOW) +DEFINE_EVENT_TYPE(wxEVT_NC_LEAVE_WINDOW) +DEFINE_EVENT_TYPE(wxEVT_NC_LEFT_DCLICK) +DEFINE_EVENT_TYPE(wxEVT_NC_MIDDLE_DCLICK) +DEFINE_EVENT_TYPE(wxEVT_NC_RIGHT_DCLICK) + +// Character input event type +DEFINE_EVENT_TYPE(wxEVT_CHAR) +DEFINE_EVENT_TYPE(wxEVT_CHAR_HOOK) +DEFINE_EVENT_TYPE(wxEVT_NAVIGATION_KEY) +DEFINE_EVENT_TYPE(wxEVT_KEY_DOWN) +DEFINE_EVENT_TYPE(wxEVT_KEY_UP) +#if wxUSE_HOTKEY +DEFINE_EVENT_TYPE(wxEVT_HOTKEY) +#endif + +// Set cursor event +DEFINE_EVENT_TYPE(wxEVT_SET_CURSOR) + +// wxScrollbar and wxSlider event identifiers +DEFINE_EVENT_TYPE(wxEVT_SCROLL_TOP) +DEFINE_EVENT_TYPE(wxEVT_SCROLL_BOTTOM) +DEFINE_EVENT_TYPE(wxEVT_SCROLL_LINEUP) +DEFINE_EVENT_TYPE(wxEVT_SCROLL_LINEDOWN) +DEFINE_EVENT_TYPE(wxEVT_SCROLL_PAGEUP) +DEFINE_EVENT_TYPE(wxEVT_SCROLL_PAGEDOWN) +DEFINE_EVENT_TYPE(wxEVT_SCROLL_THUMBTRACK) +DEFINE_EVENT_TYPE(wxEVT_SCROLL_THUMBRELEASE) +DEFINE_EVENT_TYPE(wxEVT_SCROLL_CHANGED) + +// Scroll events from wxWindow +DEFINE_EVENT_TYPE(wxEVT_SCROLLWIN_TOP) +DEFINE_EVENT_TYPE(wxEVT_SCROLLWIN_BOTTOM) +DEFINE_EVENT_TYPE(wxEVT_SCROLLWIN_LINEUP) +DEFINE_EVENT_TYPE(wxEVT_SCROLLWIN_LINEDOWN) +DEFINE_EVENT_TYPE(wxEVT_SCROLLWIN_PAGEUP) +DEFINE_EVENT_TYPE(wxEVT_SCROLLWIN_PAGEDOWN) +DEFINE_EVENT_TYPE(wxEVT_SCROLLWIN_THUMBTRACK) +DEFINE_EVENT_TYPE(wxEVT_SCROLLWIN_THUMBRELEASE) + +// System events +DEFINE_EVENT_TYPE(wxEVT_SIZE) +DEFINE_EVENT_TYPE(wxEVT_SIZING) +DEFINE_EVENT_TYPE(wxEVT_MOVE) +DEFINE_EVENT_TYPE(wxEVT_MOVING) +DEFINE_EVENT_TYPE(wxEVT_CLOSE_WINDOW) +DEFINE_EVENT_TYPE(wxEVT_END_SESSION) +DEFINE_EVENT_TYPE(wxEVT_QUERY_END_SESSION) +DEFINE_EVENT_TYPE(wxEVT_HIBERNATE) +DEFINE_EVENT_TYPE(wxEVT_ACTIVATE_APP) +DEFINE_EVENT_TYPE(wxEVT_POWER) +DEFINE_EVENT_TYPE(wxEVT_ACTIVATE) +DEFINE_EVENT_TYPE(wxEVT_CREATE) +DEFINE_EVENT_TYPE(wxEVT_DESTROY) +DEFINE_EVENT_TYPE(wxEVT_SHOW) +DEFINE_EVENT_TYPE(wxEVT_ICONIZE) +DEFINE_EVENT_TYPE(wxEVT_MAXIMIZE) +DEFINE_EVENT_TYPE(wxEVT_MOUSE_CAPTURE_CHANGED) +DEFINE_EVENT_TYPE(wxEVT_MOUSE_CAPTURE_LOST) +DEFINE_EVENT_TYPE(wxEVT_PAINT) +DEFINE_EVENT_TYPE(wxEVT_ERASE_BACKGROUND) +DEFINE_EVENT_TYPE(wxEVT_NC_PAINT) +DEFINE_EVENT_TYPE(wxEVT_PAINT_ICON) +DEFINE_EVENT_TYPE(wxEVT_MENU_OPEN) +DEFINE_EVENT_TYPE(wxEVT_MENU_CLOSE) +DEFINE_EVENT_TYPE(wxEVT_MENU_HIGHLIGHT) +DEFINE_EVENT_TYPE(wxEVT_CONTEXT_MENU) +DEFINE_EVENT_TYPE(wxEVT_SYS_COLOUR_CHANGED) +DEFINE_EVENT_TYPE(wxEVT_DISPLAY_CHANGED) +DEFINE_EVENT_TYPE(wxEVT_SETTING_CHANGED) +DEFINE_EVENT_TYPE(wxEVT_QUERY_NEW_PALETTE) +DEFINE_EVENT_TYPE(wxEVT_PALETTE_CHANGED) +DEFINE_EVENT_TYPE(wxEVT_JOY_BUTTON_DOWN) +DEFINE_EVENT_TYPE(wxEVT_JOY_BUTTON_UP) +DEFINE_EVENT_TYPE(wxEVT_JOY_MOVE) +DEFINE_EVENT_TYPE(wxEVT_JOY_ZMOVE) +DEFINE_EVENT_TYPE(wxEVT_DROP_FILES) +DEFINE_EVENT_TYPE(wxEVT_DRAW_ITEM) +DEFINE_EVENT_TYPE(wxEVT_MEASURE_ITEM) +DEFINE_EVENT_TYPE(wxEVT_COMPARE_ITEM) +DEFINE_EVENT_TYPE(wxEVT_INIT_DIALOG) +DEFINE_EVENT_TYPE(wxEVT_UPDATE_UI) + +// Clipboard events +DEFINE_EVENT_TYPE(wxEVT_COMMAND_TEXT_COPY) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_TEXT_CUT) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_TEXT_PASTE) + +// Generic command events +// Note: a click is a higher-level event than button down/up +DEFINE_EVENT_TYPE(wxEVT_COMMAND_LEFT_CLICK) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_LEFT_DCLICK) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_RIGHT_CLICK) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_RIGHT_DCLICK) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_SET_FOCUS) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_KILL_FOCUS) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_ENTER) + +// Help events +DEFINE_EVENT_TYPE(wxEVT_HELP) +DEFINE_EVENT_TYPE(wxEVT_DETAILED_HELP) + +#endif // !WXWIN_COMPATIBILITY_EVENT_TYPES + +#endif // wxUSE_GUI + +#if wxUSE_BASE + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// event initialization +// ---------------------------------------------------------------------------- + +int wxNewEventType() +{ + // MT-FIXME + static int s_lastUsedEventType = wxEVT_FIRST; + + return s_lastUsedEventType++; +} + +// ---------------------------------------------------------------------------- +// wxEvent +// ---------------------------------------------------------------------------- + +/* + * General wxWidgets events, covering + * all interesting things that might happen (button clicking, resizing, + * setting text in widgets, etc.). + * + * For each completely new event type, derive a new event class. + * + */ + +wxEvent::wxEvent(int theId, wxEventType commandType ) +{ + m_eventType = commandType; + m_eventObject = (wxObject *) NULL; + m_timeStamp = 0; + m_id = theId; + m_skipped = false; + m_callbackUserData = (wxObject *) NULL; + m_isCommandEvent = false; + m_propagationLevel = wxEVENT_PROPAGATE_NONE; +} + +wxEvent::wxEvent(const wxEvent &src) + : wxObject(src) + , m_eventObject(src.m_eventObject) + , m_eventType(src.m_eventType) + , m_timeStamp(src.m_timeStamp) + , m_id(src.m_id) + , m_callbackUserData(src.m_callbackUserData) + , m_propagationLevel(src.m_propagationLevel) + , m_skipped(src.m_skipped) + , m_isCommandEvent(src.m_isCommandEvent) +{ +} + +#endif // wxUSE_BASE + +#if wxUSE_GUI + +/* + * Command events + * + */ + +#ifdef __VISUALC__ + // 'this' : used in base member initializer list (for m_commandString) + #pragma warning(disable:4355) +#endif + +wxCommandEvent::wxCommandEvent(wxEventType commandType, int theId) + : wxEvent(theId, commandType) +#if WXWIN_COMPATIBILITY_2_4 + , m_commandString(this) +#endif +{ + m_clientData = (char *) NULL; + m_clientObject = (wxClientData *) NULL; + m_extraLong = 0; + m_commandInt = 0; + m_isCommandEvent = true; + + // the command events are propagated upwards by default + m_propagationLevel = wxEVENT_PROPAGATE_MAX; +} + +#ifdef __VISUALC__ + #pragma warning(default:4355) +#endif + +wxString wxCommandEvent::GetString() const +{ + if(m_eventType != wxEVT_COMMAND_TEXT_UPDATED || !m_eventObject) + return m_cmdString; + else + { +#if wxUSE_TEXTCTRL + wxTextCtrl *txt = wxDynamicCast(m_eventObject, wxTextCtrl); + if(txt) + return txt->GetValue(); + else +#endif // wxUSE_TEXTCTRL + return m_cmdString; + } +} + +/* + * UI update events + */ + +#if wxUSE_LONGLONG +wxLongLong wxUpdateUIEvent::sm_lastUpdate = 0; +#endif + +long wxUpdateUIEvent::sm_updateInterval = 0; + +wxUpdateUIMode wxUpdateUIEvent::sm_updateMode = wxUPDATE_UI_PROCESS_ALL; + +// Can we update? +bool wxUpdateUIEvent::CanUpdate(wxWindowBase *win) +{ + // Don't update if we've switched global updating off + // and this window doesn't support updates. + if (win && + (GetMode() == wxUPDATE_UI_PROCESS_SPECIFIED && + ((win->GetExtraStyle() & wxWS_EX_PROCESS_UI_UPDATES) == 0))) + return false; + + if (sm_updateInterval == -1) + return false; + + if (sm_updateInterval == 0) + return true; + +#if wxUSE_STOPWATCH && wxUSE_LONGLONG + wxLongLong now = wxGetLocalTimeMillis(); + if (now > (sm_lastUpdate + sm_updateInterval)) + { + return true; + } + + return false; +#else + // If we don't have wxStopWatch or wxLongLong, we + // should err on the safe side and update now anyway. + return true; +#endif +} + +// Reset the update time to provide a delay until the next +// time we should update +void wxUpdateUIEvent::ResetUpdateTime() +{ +#if wxUSE_STOPWATCH && wxUSE_LONGLONG + if (sm_updateInterval > 0) + { + wxLongLong now = wxGetLocalTimeMillis(); + if (now > (sm_lastUpdate + sm_updateInterval)) + { + sm_lastUpdate = now; + } + } +#endif +} + +/* + * Idle events + */ + +wxIdleMode wxIdleEvent::sm_idleMode = wxIDLE_PROCESS_ALL; + +// Can we send an idle event? +bool wxIdleEvent::CanSend(wxWindow* win) +{ + // Don't update if we've switched global updating off + // and this window doesn't support updates. + if (win && + (GetMode() == wxIDLE_PROCESS_SPECIFIED && + ((win->GetExtraStyle() & wxWS_EX_PROCESS_IDLE) == 0))) + return false; + + return true; +} + +/* + * Scroll events + */ + +wxScrollEvent::wxScrollEvent(wxEventType commandType, + int id, + int pos, + int orient) + : wxCommandEvent(commandType, id) +{ + m_extraLong = orient; + m_commandInt = pos; +} + +/* + * ScrollWin events + */ + +wxScrollWinEvent::wxScrollWinEvent(wxEventType commandType, + int pos, + int orient) +{ + m_eventType = commandType; + m_extraLong = orient; + m_commandInt = pos; +} + +/* + * Mouse events + * + */ + +wxMouseEvent::wxMouseEvent(wxEventType commandType) +{ + m_eventType = commandType; + m_metaDown = false; + m_altDown = false; + m_controlDown = false; + m_shiftDown = false; + m_leftDown = false; + m_rightDown = false; + m_middleDown = false; + m_x = 0; + m_y = 0; + m_wheelRotation = 0; + m_wheelDelta = 0; + m_linesPerAction = 0; +} + +void wxMouseEvent::Assign(const wxMouseEvent& event) +{ + m_eventType = event.m_eventType; + + m_x = event.m_x; + m_y = event.m_y; + + m_leftDown = event.m_leftDown; + m_middleDown = event.m_middleDown; + m_rightDown = event.m_rightDown; + + m_controlDown = event.m_controlDown; + m_shiftDown = event.m_shiftDown; + m_altDown = event.m_altDown; + m_metaDown = event.m_metaDown; + + m_wheelRotation = event.m_wheelRotation; + m_wheelDelta = event.m_wheelDelta; + m_linesPerAction = event.m_linesPerAction; +} + +// return true if was a button dclick event +bool wxMouseEvent::ButtonDClick(int but) const +{ + switch (but) + { + default: + wxFAIL_MSG(wxT("invalid parameter in wxMouseEvent::ButtonDClick")); + // fall through + + case wxMOUSE_BTN_ANY: + return (LeftDClick() || MiddleDClick() || RightDClick()); + + case wxMOUSE_BTN_LEFT: + return LeftDClick(); + + case wxMOUSE_BTN_MIDDLE: + return MiddleDClick(); + + case wxMOUSE_BTN_RIGHT: + return RightDClick(); + } +} + +// return true if was a button down event +bool wxMouseEvent::ButtonDown(int but) const +{ + switch (but) + { + default: + wxFAIL_MSG(wxT("invalid parameter in wxMouseEvent::ButtonDown")); + // fall through + + case wxMOUSE_BTN_ANY: + return (LeftDown() || MiddleDown() || RightDown()); + + case wxMOUSE_BTN_LEFT: + return LeftDown(); + + case wxMOUSE_BTN_MIDDLE: + return MiddleDown(); + + case wxMOUSE_BTN_RIGHT: + return RightDown(); + } +} + +// return true if was a button up event +bool wxMouseEvent::ButtonUp(int but) const +{ + switch (but) + { + default: + wxFAIL_MSG(wxT("invalid parameter in wxMouseEvent::ButtonUp")); + // fall through + + case wxMOUSE_BTN_ANY: + return (LeftUp() || MiddleUp() || RightUp()); + + case wxMOUSE_BTN_LEFT: + return LeftUp(); + + case wxMOUSE_BTN_MIDDLE: + return MiddleUp(); + + case wxMOUSE_BTN_RIGHT: + return RightUp(); + } +} + +// return true if the given button is currently changing state +bool wxMouseEvent::Button(int but) const +{ + switch (but) + { + default: + wxFAIL_MSG(wxT("invalid parameter in wxMouseEvent::Button")); + // fall through + + case wxMOUSE_BTN_ANY: + return ButtonUp(wxMOUSE_BTN_ANY) || + ButtonDown(wxMOUSE_BTN_ANY) || + ButtonDClick(wxMOUSE_BTN_ANY); + + case wxMOUSE_BTN_LEFT: + return LeftDown() || LeftUp() || LeftDClick(); + + case wxMOUSE_BTN_MIDDLE: + return MiddleDown() || MiddleUp() || MiddleDClick(); + + case wxMOUSE_BTN_RIGHT: + return RightDown() || RightUp() || RightDClick(); + } +} + +bool wxMouseEvent::ButtonIsDown(int but) const +{ + switch (but) + { + default: + wxFAIL_MSG(wxT("invalid parameter in wxMouseEvent::ButtonIsDown")); + // fall through + + case wxMOUSE_BTN_ANY: + return LeftIsDown() || MiddleIsDown() || RightIsDown(); + + case wxMOUSE_BTN_LEFT: + return LeftIsDown(); + + case wxMOUSE_BTN_MIDDLE: + return MiddleIsDown(); + + case wxMOUSE_BTN_RIGHT: + return RightIsDown(); + } +} + +int wxMouseEvent::GetButton() const +{ + for ( int i = 1; i <= 3; i++ ) + { + if ( Button(i) ) + { + return i; + } + } + + return wxMOUSE_BTN_NONE; +} + +// Find the logical position of the event given the DC +wxPoint wxMouseEvent::GetLogicalPosition(const wxDC& dc) const +{ + wxPoint pt(dc.DeviceToLogicalX(m_x), dc.DeviceToLogicalY(m_y)); + return pt; +} + + +/* + * Keyboard event + * + */ + +wxKeyEvent::wxKeyEvent(wxEventType type) +{ + m_eventType = type; + m_shiftDown = false; + m_controlDown = false; + m_metaDown = false; + m_altDown = false; + m_keyCode = 0; + m_scanCode = 0; +#if wxUSE_UNICODE + m_uniChar = 0; +#endif +} + +wxKeyEvent::wxKeyEvent(const wxKeyEvent& evt) + : wxEvent(evt) +{ + m_x = evt.m_x; + m_y = evt.m_y; + + m_keyCode = evt.m_keyCode; + + m_controlDown = evt.m_controlDown; + m_shiftDown = evt.m_shiftDown; + m_altDown = evt.m_altDown; + m_metaDown = evt.m_metaDown; + m_scanCode = evt.m_scanCode; + m_rawCode = evt.m_rawCode; + m_rawFlags = evt.m_rawFlags; + +#if wxUSE_UNICODE + m_uniChar = evt.m_uniChar; +#endif +} + +#if WXWIN_COMPATIBILITY_2_6 +long wxKeyEvent::KeyCode() const +{ + return m_keyCode; +} +#endif // WXWIN_COMPATIBILITY_2_6 + +wxWindowCreateEvent::wxWindowCreateEvent(wxWindow *win) +{ + SetEventType(wxEVT_CREATE); + SetEventObject(win); +} + +wxWindowDestroyEvent::wxWindowDestroyEvent(wxWindow *win) +{ + SetEventType(wxEVT_DESTROY); + SetEventObject(win); +} + +wxChildFocusEvent::wxChildFocusEvent(wxWindow *win) + : wxCommandEvent(wxEVT_CHILD_FOCUS) +{ + SetEventObject(win); +} + +// ---------------------------------------------------------------------------- +// wxHelpEvent +// ---------------------------------------------------------------------------- + +/* static */ +wxHelpEvent::Origin wxHelpEvent::GuessOrigin(Origin origin) +{ + if ( origin == Origin_Unknown ) + { + // assume that the event comes from the help button if it's not from + // keyboard and that pressing F1 always results in the help event + origin = wxGetKeyState(WXK_F1) ? Origin_Keyboard : Origin_HelpButton; + } + + return origin; +} + +#endif // wxUSE_GUI + + +#if wxUSE_BASE + +// ---------------------------------------------------------------------------- +// wxEventHashTable +// ---------------------------------------------------------------------------- + +static const int EVENT_TYPE_TABLE_INIT_SIZE = 31; // Not too big not too small... + +wxEventHashTable* wxEventHashTable::sm_first = NULL; + +wxEventHashTable::wxEventHashTable(const wxEventTable &table) + : m_table(table), + m_rebuildHash(true) +{ + AllocEventTypeTable(EVENT_TYPE_TABLE_INIT_SIZE); + + m_next = sm_first; + if (m_next) + m_next->m_previous = this; + sm_first = this; +} + +wxEventHashTable::~wxEventHashTable() +{ + if (m_next) + m_next->m_previous = m_previous; + if (m_previous) + m_previous->m_next = m_next; + if (sm_first == this) + sm_first = m_next; + + Clear(); +} + +void wxEventHashTable::Clear() +{ + size_t i; + for(i = 0; i < m_size; i++) + { + EventTypeTablePointer eTTnode = m_eventTypeTable[i]; + if (eTTnode) + { + delete eTTnode; + } + } + + // Necessary in order to not invoke the + // overloaded delete operator when statics are cleaned up + if (m_eventTypeTable) + delete[] m_eventTypeTable; + + m_eventTypeTable = NULL; + m_size = 0; +} + +// Clear all tables +void wxEventHashTable::ClearAll() +{ + wxEventHashTable* table = sm_first; + while (table) + { + table->Clear(); + table = table->m_next; + } +} + +// Rebuild all tables if they were cleared by ClearAll +void wxEventHashTable::ReconstructAll() +{ + wxEventHashTable* table = sm_first; + while (table) + { + // This will only be true if the event table was cleared. + // What we do here is basically what the constructor does. + if(table->m_eventTypeTable == NULL) + { + table->AllocEventTypeTable(EVENT_TYPE_TABLE_INIT_SIZE); + table->m_rebuildHash = true; + } + table = table->m_next; + } +} + +bool wxEventHashTable::HandleEvent(wxEvent &event, wxEvtHandler *self) +{ + if (m_rebuildHash) + { + InitHashTable(); + m_rebuildHash = false; + } + + if (!m_eventTypeTable) + return false; + + // Find all entries for the given event type. + wxEventType eventType = event.GetEventType(); + const EventTypeTablePointer eTTnode = m_eventTypeTable[eventType % m_size]; + if (eTTnode && eTTnode->eventType == eventType) + { + // Now start the search for an event handler + // that can handle an event with the given ID. + const wxEventTableEntryPointerArray& + eventEntryTable = eTTnode->eventEntryTable; + + const size_t count = eventEntryTable.GetCount(); + for (size_t n = 0; n < count; n++) + { + if ( wxEvtHandler:: + ProcessEventIfMatches(*eventEntryTable[n], self, event) ) + { + return true; + } + } + } + + return false; +} + +void wxEventHashTable::InitHashTable() +{ + // Loop over the event tables and all its base tables. + const wxEventTable *table = &m_table; + while (table) + { + // Retrieve all valid event handler entries + const wxEventTableEntry *entry = table->entries; + while (entry->m_fn != 0) + { + // Add the event entry in the Hash. + AddEntry(*entry); + + entry++; + } + + table = table->baseTable; + } + + // Lets free some memory. + size_t i; + for(i = 0; i < m_size; i++) + { + EventTypeTablePointer eTTnode = m_eventTypeTable[i]; + if (eTTnode) + { + eTTnode->eventEntryTable.Shrink(); + } + } +} + +void wxEventHashTable::AddEntry(const wxEventTableEntry &entry) +{ + // This might happen 'accidentally' as the app is exiting + if (!m_eventTypeTable) + return; + + EventTypeTablePointer *peTTnode = &m_eventTypeTable[entry.m_eventType % m_size]; + EventTypeTablePointer eTTnode = *peTTnode; + + if (eTTnode) + { + if (eTTnode->eventType != entry.m_eventType) + { + // Resize the table! + GrowEventTypeTable(); + // Try again to add it. + AddEntry(entry); + return; + } + } + else + { + eTTnode = new EventTypeTable; + eTTnode->eventType = entry.m_eventType; + *peTTnode = eTTnode; + } + + // Fill all hash entries between entry.m_id and entry.m_lastId... + eTTnode->eventEntryTable.Add(&entry); +} + +void wxEventHashTable::AllocEventTypeTable(size_t size) +{ + m_eventTypeTable = new EventTypeTablePointer[size]; + memset((void *)m_eventTypeTable, 0, sizeof(EventTypeTablePointer)*size); + m_size = size; +} + +void wxEventHashTable::GrowEventTypeTable() +{ + size_t oldSize = m_size; + EventTypeTablePointer *oldEventTypeTable = m_eventTypeTable; + + // TODO: Search the most optimal grow sequence + AllocEventTypeTable(/* GetNextPrime(oldSize) */oldSize*2+1); + + for ( size_t i = 0; i < oldSize; /* */ ) + { + EventTypeTablePointer eTToldNode = oldEventTypeTable[i]; + if (eTToldNode) + { + EventTypeTablePointer *peTTnode = &m_eventTypeTable[eTToldNode->eventType % m_size]; + EventTypeTablePointer eTTnode = *peTTnode; + + // Check for collision, we don't want any. + if (eTTnode) + { + GrowEventTypeTable(); + continue; // Don't increment the counter, + // as we still need to add this element. + } + else + { + // Get the old value and put it in the new table. + *peTTnode = oldEventTypeTable[i]; + } + } + + i++; + } + + delete[] oldEventTypeTable; +} + + +// ---------------------------------------------------------------------------- +// wxEvtHandler +// ---------------------------------------------------------------------------- + +/* + * Event handler + */ + +wxEvtHandler::wxEvtHandler() +{ + m_nextHandler = (wxEvtHandler *) NULL; + m_previousHandler = (wxEvtHandler *) NULL; + m_enabled = true; + m_dynamicEvents = (wxList *) NULL; + m_pendingEvents = (wxList *) NULL; +#if wxUSE_THREADS +# if !defined(__VISAGECPP__) + m_eventsLocker = new wxCriticalSection; +# endif +#endif + + // no client data (yet) + m_clientData = NULL; + m_clientDataType = wxClientData_None; +} + +wxEvtHandler::~wxEvtHandler() +{ + // Takes itself out of the list of handlers + if (m_previousHandler) + m_previousHandler->m_nextHandler = m_nextHandler; + + if (m_nextHandler) + m_nextHandler->m_previousHandler = m_previousHandler; + + if (m_dynamicEvents) + { + for ( wxList::iterator it = m_dynamicEvents->begin(), + end = m_dynamicEvents->end(); + it != end; + ++it ) + { +#if WXWIN_COMPATIBILITY_EVENT_TYPES + wxEventTableEntry *entry = (wxEventTableEntry*)*it; +#else // !WXWIN_COMPATIBILITY_EVENT_TYPES + wxDynamicEventTableEntry *entry = (wxDynamicEventTableEntry*)*it; +#endif // WXWIN_COMPATIBILITY_EVENT_TYPES/!WXWIN_COMPATIBILITY_EVENT_TYPES + + if (entry->m_callbackUserData) + delete entry->m_callbackUserData; + delete entry; + } + delete m_dynamicEvents; + }; + + if (m_pendingEvents) + m_pendingEvents->DeleteContents(true); + delete m_pendingEvents; + +#if wxUSE_THREADS +# if !defined(__VISAGECPP__) + delete m_eventsLocker; +# endif + + // Remove us from wxPendingEvents if necessary. + if(wxPendingEventsLocker) + wxENTER_CRIT_SECT(*wxPendingEventsLocker); + if ( wxPendingEvents ) + { + // Delete all occurences of this from the list of pending events + while (wxPendingEvents->DeleteObject(this)) { } // Do nothing + } + if(wxPendingEventsLocker) + wxLEAVE_CRIT_SECT(*wxPendingEventsLocker); +#endif + + // we only delete object data, not untyped + if ( m_clientDataType == wxClientData_Object ) + delete m_clientObject; +} + +#if wxUSE_THREADS + +bool wxEvtHandler::ProcessThreadEvent(wxEvent& event) +{ + // check that we are really in a child thread + wxASSERT_MSG( !wxThread::IsMain(), + wxT("use ProcessEvent() in main thread") ); + + AddPendingEvent(event); + + return true; +} + +void wxEvtHandler::ClearEventLocker() +{ +#if !defined(__VISAGECPP__) + delete m_eventsLocker; + m_eventsLocker = NULL; +#endif +} + +#endif // wxUSE_THREADS + +void wxEvtHandler::AddPendingEvent(wxEvent& event) +{ + // 1) Add event to list of pending events of this event handler + + wxEvent *eventCopy = event.Clone(); + + // we must be able to copy the events here so the event class must + // implement Clone() properly instead of just providing a NULL stab for it + wxCHECK_RET( eventCopy, + _T("events of this type aren't supposed to be posted") ); + + wxENTER_CRIT_SECT( Lock() ); + + if ( !m_pendingEvents ) + m_pendingEvents = new wxList; + + m_pendingEvents->Append(eventCopy); + + wxLEAVE_CRIT_SECT( Lock() ); + + // 2) Add this event handler to list of event handlers that + // have pending events. + + wxENTER_CRIT_SECT(*wxPendingEventsLocker); + + if ( !wxPendingEvents ) + wxPendingEvents = new wxList; + wxPendingEvents->Append(this); + + wxLEAVE_CRIT_SECT(*wxPendingEventsLocker); + + // 3) Inform the system that new pending events are somewhere, + // and that these should be processed in idle time. + wxWakeUpIdle(); +} + +void wxEvtHandler::ProcessPendingEvents() +{ + // this method is only called by wxApp if this handler does have + // pending events + wxCHECK_RET( m_pendingEvents, + wxT("Please call wxApp::ProcessPendingEvents() instead") ); + + wxENTER_CRIT_SECT( Lock() ); + + // we leave the loop once we have processed all events that were present at + // the start of ProcessPendingEvents because otherwise we could get into + // infinite loop if the pending event handler execution resulted in another + // event being posted + size_t n = m_pendingEvents->size(); + for ( wxList::compatibility_iterator node = m_pendingEvents->GetFirst(); + node; + node = m_pendingEvents->GetFirst() ) + { + wxEvent *event = (wxEvent *)node->GetData(); + + // It's importan we remove event from list before processing it. + // Else a nested event loop, for example from a modal dialog, might + // process the same event again. + + m_pendingEvents->Erase(node); + + wxLEAVE_CRIT_SECT( Lock() ); + + ProcessEvent(*event); + + delete event; + + wxENTER_CRIT_SECT( Lock() ); + + if ( --n == 0 ) + break; + } + + wxLEAVE_CRIT_SECT( Lock() ); +} + +/* + * Event table stuff + */ +/* static */ bool +wxEvtHandler::ProcessEventIfMatches(const wxEventTableEntryBase& entry, + wxEvtHandler *handler, + wxEvent& event) +{ + int tableId1 = entry.m_id, + tableId2 = entry.m_lastId; + + // match only if the event type is the same and the id is either -1 in + // the event table (meaning "any") or the event id matches the id + // specified in the event table either exactly or by falling into + // range between first and last + if ((tableId1 == wxID_ANY) || + (tableId2 == wxID_ANY && tableId1 == event.GetId()) || + (tableId2 != wxID_ANY && + (event.GetId() >= tableId1 && event.GetId() <= tableId2))) + { + event.Skip(false); + event.m_callbackUserData = entry.m_callbackUserData; + +#if wxUSE_EXCEPTIONS + if ( wxTheApp ) + { + // call the handler via wxApp method which allows the user to catch + // any exceptions which may be thrown by any handler in the program + // in one place + wxTheApp->HandleEvent(handler, (wxEventFunction)entry.m_fn, event); + } + else +#endif // wxUSE_EXCEPTIONS + { + // no need for an extra virtual function call + (handler->*((wxEventFunction) (entry.m_fn)))(event); + } + + if (!event.GetSkipped()) + return true; + } + + return false; +} + +bool wxEvtHandler::TryParent(wxEvent& event) +{ + if ( wxTheApp && (this != wxTheApp) ) + { + // Special case: don't pass wxEVT_IDLE to wxApp, since it'll always + // swallow it. wxEVT_IDLE is sent explicitly to wxApp so it will be + // processed appropriately via SearchEventTable. + if ( event.GetEventType() != wxEVT_IDLE ) + { + if ( wxTheApp->ProcessEvent(event) ) + return true; + } + } + + return false; +} + +bool wxEvtHandler::ProcessEvent(wxEvent& event) +{ + // allow the application to hook into event processing + if ( wxTheApp ) + { + int rc = wxTheApp->FilterEvent(event); + if ( rc != -1 ) + { + wxASSERT_MSG( rc == 1 || rc == 0, + _T("unexpected wxApp::FilterEvent return value") ); + + return rc != 0; + } + //else: proceed normally + } + + // An event handler can be enabled or disabled + if ( GetEvtHandlerEnabled() ) + { + // if we have a validator, it has higher priority than our own event + // table + if ( TryValidator(event) ) + return true; + + // Handle per-instance dynamic event tables first + if ( m_dynamicEvents && SearchDynamicEventTable(event) ) + return true; + + // Then static per-class event tables + if ( GetEventHashTable().HandleEvent(event, this) ) + return true; + } + + // Try going down the event handler chain + if ( GetNextHandler() ) + { + if ( GetNextHandler()->ProcessEvent(event) ) + return true; + } + + // Finally propagate the event upwards the window chain and/or to the + // application object as necessary + return TryParent(event); +} + + +bool wxEvtHandler::SearchEventTable(wxEventTable& table, wxEvent& event) +{ + const wxEventType eventType = event.GetEventType(); + for ( int i = 0; table.entries[i].m_fn != 0; i++ ) + { + const wxEventTableEntry& entry = table.entries[i]; + if ( eventType == entry.m_eventType ) + { + if ( ProcessEventIfMatches(entry, this, event) ) + return true; + } + } + + return false; +} + +void wxEvtHandler::Connect( int id, int lastId, + int eventType, + wxObjectEventFunction func, + wxObject *userData, + wxEvtHandler* eventSink ) +{ +#if WXWIN_COMPATIBILITY_EVENT_TYPES + wxEventTableEntry *entry = new wxEventTableEntry; + entry->m_eventType = eventType; + entry->m_id = id; + entry->m_lastId = lastId; + entry->m_fn = func; + entry->m_callbackUserData = userData; +#else // !WXWIN_COMPATIBILITY_EVENT_TYPES + wxDynamicEventTableEntry *entry = + new wxDynamicEventTableEntry(eventType, id, lastId, func, userData, eventSink); +#endif // WXWIN_COMPATIBILITY_EVENT_TYPES/!WXWIN_COMPATIBILITY_EVENT_TYPES + + if (!m_dynamicEvents) + m_dynamicEvents = new wxList; + + // Insert at the front of the list so most recent additions are found first + m_dynamicEvents->Insert( (wxObject*) entry ); +} + +bool wxEvtHandler::Disconnect( int id, int lastId, wxEventType eventType, + wxObjectEventFunction func, + wxObject *userData, + wxEvtHandler* eventSink ) +{ + if (!m_dynamicEvents) + return false; + + wxList::compatibility_iterator node = m_dynamicEvents->GetFirst(); + while (node) + { +#if WXWIN_COMPATIBILITY_EVENT_TYPES + wxEventTableEntry *entry = (wxEventTableEntry*)node->GetData(); +#else // !WXWIN_COMPATIBILITY_EVENT_TYPES + wxDynamicEventTableEntry *entry = (wxDynamicEventTableEntry*)node->GetData(); +#endif // WXWIN_COMPATIBILITY_EVENT_TYPES/!WXWIN_COMPATIBILITY_EVENT_TYPES + + if ((entry->m_id == id) && + ((entry->m_lastId == lastId) || (lastId == wxID_ANY)) && + ((entry->m_eventType == eventType) || (eventType == wxEVT_NULL)) && + ((entry->m_fn == func) || (func == (wxObjectEventFunction)NULL)) && + ((entry->m_eventSink == eventSink) || (eventSink == (wxEvtHandler*)NULL)) && + ((entry->m_callbackUserData == userData) || (userData == (wxObject*)NULL))) + { + if (entry->m_callbackUserData) + delete entry->m_callbackUserData; + m_dynamicEvents->Erase( node ); + delete entry; + return true; + } + node = node->GetNext(); + } + return false; +} + +bool wxEvtHandler::SearchDynamicEventTable( wxEvent& event ) +{ + wxCHECK_MSG( m_dynamicEvents, false, + wxT("caller should check that we have dynamic events") ); + + wxList::compatibility_iterator node = m_dynamicEvents->GetFirst(); + while (node) + { +#if WXWIN_COMPATIBILITY_EVENT_TYPES + wxEventTableEntry *entry = (wxEventTableEntry*)node->GetData(); +#else // !WXWIN_COMPATIBILITY_EVENT_TYPES + wxDynamicEventTableEntry *entry = (wxDynamicEventTableEntry*)node->GetData(); +#endif // WXWIN_COMPATIBILITY_EVENT_TYPES/!WXWIN_COMPATIBILITY_EVENT_TYPES + + // get next node before (maybe) calling the event handler as it could + // call Disconnect() invalidating the current node + node = node->GetNext(); + + if ((event.GetEventType() == entry->m_eventType) && (entry->m_fn != 0)) + { + wxEvtHandler *handler = +#if !WXWIN_COMPATIBILITY_EVENT_TYPES + entry->m_eventSink ? entry->m_eventSink + : +#endif + this; + + if ( ProcessEventIfMatches(*entry, handler, event) ) + { + return true; + } + } + } + + return false; +} + +void wxEvtHandler::DoSetClientObject( wxClientData *data ) +{ + wxASSERT_MSG( m_clientDataType != wxClientData_Void, + wxT("can't have both object and void client data") ); + + if ( m_clientObject ) + delete m_clientObject; + + m_clientObject = data; + m_clientDataType = wxClientData_Object; +} + +wxClientData *wxEvtHandler::DoGetClientObject() const +{ + // it's not an error to call GetClientObject() on a window which doesn't + // have client data at all - NULL will be returned + wxASSERT_MSG( m_clientDataType != wxClientData_Void, + wxT("this window doesn't have object client data") ); + + return m_clientObject; +} + +void wxEvtHandler::DoSetClientData( void *data ) +{ + wxASSERT_MSG( m_clientDataType != wxClientData_Object, + wxT("can't have both object and void client data") ); + + m_clientData = data; + m_clientDataType = wxClientData_Void; +} + +void *wxEvtHandler::DoGetClientData() const +{ + // it's not an error to call GetClientData() on a window which doesn't have + // client data at all - NULL will be returned + wxASSERT_MSG( m_clientDataType != wxClientData_Object, + wxT("this window doesn't have void client data") ); + + return m_clientData; +} + +#endif // wxUSE_BASE + +#if wxUSE_GUI + +// Find a window with the focus, that is also a descendant of the given window. +// This is used to determine the window to initially send commands to. +wxWindow* wxFindFocusDescendant(wxWindow* ancestor) +{ + // Process events starting with the window with the focus, if any. + wxWindow* focusWin = wxWindow::FindFocus(); + wxWindow* win = focusWin; + + // Check if this is a descendant of this frame. + // If not, win will be set to NULL. + while (win) + { + if (win == ancestor) + break; + else + win = win->GetParent(); + } + if (win == (wxWindow*) NULL) + focusWin = (wxWindow*) NULL; + + return focusWin; +} + +#endif // wxUSE_GUI diff --git a/Externals/wxWidgets/src/common/evtloopcmn.cpp b/Externals/wxWidgets/src/common/evtloopcmn.cpp new file mode 100644 index 0000000000..75f88ca12f --- /dev/null +++ b/Externals/wxWidgets/src/common/evtloopcmn.cpp @@ -0,0 +1,172 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/common/evtloopcmn.cpp +// Purpose: common wxEventLoop-related stuff +// Author: Vadim Zeitlin +// Modified by: +// Created: 2006-01-12 +// RCS-ID: $Id: evtloopcmn.cpp 45938 2007-05-10 02:07:41Z VZ $ +// Copyright: (c) 2006 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// for compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#include "wx/evtloop.h" + +#ifndef WX_PRECOMP + #include "wx/app.h" +#endif //WX_PRECOMP + +// see the comment near the declaration of wxRunningEventLoopCount in +// src/msw/thread.cpp for the explanation of this hack +#if defined(__WXMSW__) && wxUSE_THREADS + +extern WXDLLIMPEXP_DATA_BASE(int) wxRunningEventLoopCount; +struct wxRunningEventLoopCounter +{ + wxRunningEventLoopCounter() { wxRunningEventLoopCount++; } + ~wxRunningEventLoopCounter() { wxRunningEventLoopCount--; } +}; + +#endif // __WXMSW__ + +// ---------------------------------------------------------------------------- +// globals +// ---------------------------------------------------------------------------- + +wxEventLoop *wxEventLoopBase::ms_activeLoop = NULL; + +// wxEventLoopManual is unused in the other ports +#if defined(__WXMSW__) || defined(__WXMAC__) || defined(__WXDFB__) + +// ============================================================================ +// wxEventLoopManual implementation +// ============================================================================ + +wxEventLoopManual::wxEventLoopManual() +{ + m_exitcode = 0; + m_shouldExit = false; +} + +int wxEventLoopManual::Run() +{ + // event loops are not recursive, you need to create another loop! + wxCHECK_MSG( !IsRunning(), -1, _T("can't reenter a message loop") ); + + // ProcessIdle() and Dispatch() below may throw so the code here should + // be exception-safe, hence we must use local objects for all actions we + // should undo + wxEventLoopActivator activate(wx_static_cast(wxEventLoop *, this)); + +#if defined(__WXMSW__) && wxUSE_THREADS + wxRunningEventLoopCounter evtLoopCounter; +#endif // __WXMSW__ + + // we must ensure that OnExit() is called even if an exception is thrown + // from inside Dispatch() but we must call it from Exit() in normal + // situations because it is supposed to be called synchronously, + // wxModalEventLoop depends on this (so we can't just use ON_BLOCK_EXIT or + // something similar here) +#if wxUSE_EXCEPTIONS + for ( ;; ) + { + try + { +#endif // wxUSE_EXCEPTIONS + + // this is the event loop itself + for ( ;; ) + { + // give them the possibility to do whatever they want + OnNextIteration(); + + // generate and process idle events for as long as we don't + // have anything else to do + while ( !Pending() && (wxTheApp && wxTheApp->ProcessIdle()) ) + ; + + // if the "should exit" flag is set, the loop should terminate + // but not before processing any remaining messages so while + // Pending() returns true, do process them + if ( m_shouldExit ) + { + while ( Pending() ) + Dispatch(); + + break; + } + + // a message came or no more idle processing to do, sit in + // Dispatch() waiting for the next message + if ( !Dispatch() ) + { + // we got WM_QUIT + break; + } + } + +#if wxUSE_EXCEPTIONS + // exit the outer loop as well + break; + } + catch ( ... ) + { + try + { + if ( !wxTheApp || !wxTheApp->OnExceptionInMainLoop() ) + { + OnExit(); + break; + } + //else: continue running the event loop + } + catch ( ... ) + { + // OnException() throwed, possibly rethrowing the same + // exception again: very good, but we still need OnExit() to + // be called + OnExit(); + throw; + } + } + } +#endif // wxUSE_EXCEPTIONS + + return m_exitcode; +} + +void wxEventLoopManual::Exit(int rc) +{ + wxCHECK_RET( IsRunning(), _T("can't call Exit() if not running") ); + + m_exitcode = rc; + m_shouldExit = true; + + OnExit(); + + // all we have to do to exit from the loop is to (maybe) wake it up so that + // it can notice that Exit() had been called + // + // in particular, do *not* use here calls such as PostQuitMessage() (under + // MSW) which terminate the current event loop here because we're not sure + // that it is going to be processed by the correct event loop: it would be + // possible that another one is started and terminated by mistake if we do + // this + WakeUp(); +} + +#endif // __WXMSW__ || __WXMAC__ || __WXDFB__ diff --git a/Externals/wxWidgets/src/common/execcmn.cpp b/Externals/wxWidgets/src/common/execcmn.cpp new file mode 100644 index 0000000000..60af65d0e8 --- /dev/null +++ b/Externals/wxWidgets/src/common/execcmn.cpp @@ -0,0 +1,122 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: common/wxexec.cpp +// Purpose: defines wxStreamTempInputBuffer which is used by Unix and MSW +// implementations of wxExecute; this file is only used by the +// library and never by the user code +// Author: Vadim Zeitlin +// Modified by: +// Created: 20.08.02 +// RCS-ID: $Id: execcmn.cpp 35289 2005-08-23 23:12:48Z VZ $ +// Copyright: (c) 2002 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_WXEXEC_CPP_ +#define _WX_WXEXEC_CPP_ + +// this file should never be compiled directly, just included by other code +#ifndef _WX_USED_BY_WXEXECUTE_ + #error "You should never directly build this file!" +#endif + +// ---------------------------------------------------------------------------- +// wxStreamTempInputBuffer +// ---------------------------------------------------------------------------- + +/* + wxStreamTempInputBuffer is a hack which we need to solve the problem of + executing a child process synchronously with IO redirecting: when we do + this, the child writes to a pipe we open to it but when the pipe buffer + (which has finite capacity, e.g. commonly just 4Kb) becomes full we have to + read data from it because the child blocks in its write() until then and if + it blocks we are never going to return from wxExecute() so we dead lock. + + So here is the fix: we now read the output as soon as it appears into a temp + buffer (wxStreamTempInputBuffer object) and later just stuff it back into + the stream when the process terminates. See supporting code in wxExecute() + itself as well. + + Note that this is horribly inefficient for large amounts of output (count + the number of times we copy the data around) and so a better API is badly + needed! However it's not easy to devise a way to do this keeping backwards + compatibility with the existing wxExecute(wxEXEC_SYNC)... +*/ + +class wxStreamTempInputBuffer +{ +public: + wxStreamTempInputBuffer(); + + // call to associate a stream with this buffer, otherwise nothing happens + // at all + void Init(wxPipeInputStream *stream); + + // check for input on our stream and cache it in our buffer if any + void Update(); + + ~wxStreamTempInputBuffer(); + +private: + // the stream we're buffering, if NULL we don't do anything at all + wxPipeInputStream *m_stream; + + // the buffer of size m_size (NULL if m_size == 0) + void *m_buffer; + + // the size of the buffer + size_t m_size; + + DECLARE_NO_COPY_CLASS(wxStreamTempInputBuffer) +}; + +inline wxStreamTempInputBuffer::wxStreamTempInputBuffer() +{ + m_stream = NULL; + m_buffer = NULL; + m_size = 0; +} + +inline void wxStreamTempInputBuffer::Init(wxPipeInputStream *stream) +{ + m_stream = stream; +} + +inline +void wxStreamTempInputBuffer::Update() +{ + if ( m_stream && m_stream->CanRead() ) + { + // realloc in blocks of 4Kb: this is the default (and minimal) buffer + // size of the Unix pipes so it should be the optimal step + // + // NB: don't use "static int" in this inline function, some compilers + // (e.g. IBM xlC) don't like it + enum { incSize = 4096 }; + + void *buf = realloc(m_buffer, m_size + incSize); + if ( !buf ) + { + // don't read any more, we don't have enough memory to do it + m_stream = NULL; + } + else // got memory for the buffer + { + m_buffer = buf; + m_stream->Read((char *)m_buffer + m_size, incSize); + m_size += m_stream->LastRead(); + } + } +} + +inline +wxStreamTempInputBuffer::~wxStreamTempInputBuffer() +{ + if ( m_buffer ) + { + m_stream->Ungetch(m_buffer, m_size); + free(m_buffer); + } +} + +#endif // _WX_WXEXEC_CPP_ + diff --git a/Externals/wxWidgets/src/common/extended.c b/Externals/wxWidgets/src/common/extended.c new file mode 100644 index 0000000000..69fe57e2bf --- /dev/null +++ b/Externals/wxWidgets/src/common/extended.c @@ -0,0 +1,196 @@ +/***************************************************************************** +** Name: extended.c +** Purpose: IEEE Extended<->Double routines to save floats to file +** Maintainer: Ryan Norton +** Modified by: +** Created: 11/24/04 +** RCS-ID: $Id: extended.c 36952 2006-01-18 10:25:04Z JS $ +*****************************************************************************/ + + +#if defined(_WIN32_WCE) + /* eVC cause warnings in its own headers: stdlib.h and winnt.h */ + #pragma warning (disable:4115) + #pragma warning (disable:4214) +#endif + +#include +#include +#include +#include +#include +#include "wx/defs.h" + +#if defined(_WIN32_WCE) + #pragma warning (default:4115) + #pragma warning (default:4214) +#endif + +#if wxUSE_APPLE_IEEE + +#include "wx/math.h" + +/* Copyright (C) 1989-1991 Ken Turkowski. + * + * All rights reserved. + * + * Warranty Information + * Even though I have reviewed this software, I make no warranty + * or representation, either express or implied, with respect to this + * software, its quality, accuracy, merchantability, or fitness for a + * particular purpose. As a result, this software is provided "as is," + * and you, its user, are assuming the entire risk as to its quality + * and accuracy. + * + * This code may be used and freely distributed as long as it includes + * this copyright notice and the above warranty information. + * + * Machine-independent I/O routines for IEEE floating-point numbers. + * + * NaN's and infinities are converted to HUGE_VAL or HUGE, which + * happens to be infinity on IEEE machines. Unfortunately, it is + * impossible to preserve NaN's in a machine-independent way. + * Infinities are, however, preserved on IEEE machines. + * + * These routines have been tested on the following machines: + * Apple Macintosh, MPW 3.1 C compiler + * Apple Macintosh, THINK C compiler + * Silicon Graphics IRIS, MIPS compiler + * Cray X/MP and Y/MP + * Digital Equipment VAX + * Sequent Balance (Multiprocesor 386) + * NeXT + * + * + * Implemented by Malcolm Slaney and Ken Turkowski. + * + * Malcolm Slaney contributions during 1988-1990 include big- and little- + * endian file I/O, conversion to and from Motorola's extended 80-bit + * floating-point format, and conversions to and from IEEE single- + * precision floating-point format. + * + * In 1991, Ken Turkowski implemented the conversions to and from + * IEEE double-precision format, added more precision to the extended + * conversions, and accommodated conversions involving +/- infinity, + * NaN's, and denormalized numbers. + */ + +#ifndef HUGE_VAL +# define HUGE_VAL HUGE +#endif /*HUGE_VAL*/ + + +/**************************************************************** + * The following two routines make up for deficiencies in many + * compilers to convert properly between unsigned integers and + * floating-point. Some compilers which have this bug are the + * THINK_C compiler for the Macintosh and the C compiler for the + * Silicon Graphics MIPS-based Iris. + ****************************************************************/ + +#ifdef applec /* The Apple C compiler works */ +# define FloatToUnsigned(f) ((wxUint32)(f)) +# define UnsignedToFloat(u) ((wxFloat64)(u)) +#else /*applec*/ +# define FloatToUnsigned(f) ((wxUint32)(((wxInt32)((f) - 2147483648.0)) + 2147483647L) + 1) +# define UnsignedToFloat(u) (((wxFloat64)((wxInt32)((u) - 2147483647L - 1))) + 2147483648.0) +#endif /*applec*/ + + + +/**************************************************************** + * Extended precision IEEE floating-point conversion routines. + * Extended is an 80-bit number as defined by Motorola, + * with a sign bit, 15 bits of exponent (offset 16383?), + * and a 64-bit mantissa, with no hidden bit. + ****************************************************************/ + +wxFloat64 ConvertFromIeeeExtended(const wxInt8 *bytes) +{ + wxFloat64 f; + wxInt32 expon; + wxUint32 hiMant, loMant; + + expon = ((bytes[0] & 0x7F) << 8) | (bytes[1] & 0xFF); + hiMant = ((wxUint32)(bytes[2] & 0xFF) << 24) + | ((wxUint32)(bytes[3] & 0xFF) << 16) + | ((wxUint32)(bytes[4] & 0xFF) << 8) + | ((wxUint32)(bytes[5] & 0xFF)); + loMant = ((wxUint32)(bytes[6] & 0xFF) << 24) + | ((wxUint32)(bytes[7] & 0xFF) << 16) + | ((wxUint32)(bytes[8] & 0xFF) << 8) + | ((wxUint32)(bytes[9] & 0xFF)); + + if (expon == 0 && hiMant == 0 && loMant == 0) { + f = 0; + } + else { + if (expon == 0x7FFF) { /* Infinity or NaN */ + f = HUGE_VAL; + } + else { + expon -= 16383; + f = ldexp(UnsignedToFloat(hiMant), expon-=31); + f += ldexp(UnsignedToFloat(loMant), expon-=32); + } + } + + if (bytes[0] & 0x80) + return -f; + else + return f; +} + + +/****************************************************************/ + + +void ConvertToIeeeExtended(wxFloat64 num, wxInt8 *bytes) +{ + wxInt32 sign; + wxInt32 expon; + wxFloat64 fMant, fsMant; + wxUint32 hiMant, loMant; + + if (num < 0) { + sign = 0x8000; + num *= -1; + } else { + sign = 0; + } + + if (num == 0) { + expon = 0; hiMant = 0; loMant = 0; + } + else { + fMant = frexp(num, &expon); + if ((expon > 16384) || !(fMant < 1)) { /* Infinity or NaN */ + expon = sign|0x7FFF; hiMant = 0; loMant = 0; /* infinity */ + } + else { /* Finite */ + expon += 16382; + if (expon < 0) { /* denormalized */ + fMant = ldexp(fMant, expon); + expon = 0; + } + expon |= sign; + fMant = ldexp(fMant, 32); fsMant = floor(fMant); hiMant = FloatToUnsigned(fsMant); + fMant = ldexp(fMant - fsMant, 32); fsMant = floor(fMant); loMant = FloatToUnsigned(fsMant); + } + } + + bytes[0] = expon >> 8; + bytes[1] = expon; + bytes[2] = hiMant >> 24; + bytes[3] = hiMant >> 16; + bytes[4] = hiMant >> 8; + bytes[5] = hiMant; + bytes[6] = loMant >> 24; + bytes[7] = loMant >> 16; + bytes[8] = loMant >> 8; + bytes[9] = loMant; +} + + + +#endif /* wxUSE_APPLE_IEEE */ diff --git a/Externals/wxWidgets/src/common/fddlgcmn.cpp b/Externals/wxWidgets/src/common/fddlgcmn.cpp new file mode 100644 index 0000000000..11585c03cb --- /dev/null +++ b/Externals/wxWidgets/src/common/fddlgcmn.cpp @@ -0,0 +1,102 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/fdrepdlg.cpp +// Purpose: common parts of wxFindReplaceDialog implementations +// Author: Vadim Zeitlin +// Modified by: +// Created: 01.08.01 +// RCS-ID: +// Copyright: (c) 2001 Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_FINDREPLDLG + +#ifndef WX_PRECOMP +#endif + +#include "wx/fdrepdlg.h" + +// ---------------------------------------------------------------------------- +// wxWin macros +// ---------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxFindDialogEvent, wxCommandEvent) + +DEFINE_EVENT_TYPE(wxEVT_COMMAND_FIND) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_FIND_NEXT) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_FIND_REPLACE) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_FIND_REPLACE_ALL) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_FIND_CLOSE) + +// ============================================================================ +// implementations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxFindReplaceData +// ---------------------------------------------------------------------------- + +void wxFindReplaceData::Init() +{ + m_Flags = 0; +} + +// ---------------------------------------------------------------------------- +// wxFindReplaceDialogBase +// ---------------------------------------------------------------------------- + +wxFindReplaceDialogBase::~wxFindReplaceDialogBase() +{ +} + +void wxFindReplaceDialogBase::Send(wxFindDialogEvent& event) +{ + // we copy the data to dialog->GetData() as well + + m_FindReplaceData->m_Flags = event.GetFlags(); + m_FindReplaceData->m_FindWhat = event.GetFindString(); + if ( HasFlag(wxFR_REPLACEDIALOG) && + (event.GetEventType() == wxEVT_COMMAND_FIND_REPLACE || + event.GetEventType() == wxEVT_COMMAND_FIND_REPLACE_ALL) ) + { + m_FindReplaceData->m_ReplaceWith = event.GetReplaceString(); + } + + // translate wxEVT_COMMAND_FIND_NEXT to wxEVT_COMMAND_FIND if needed + if ( event.GetEventType() == wxEVT_COMMAND_FIND_NEXT ) + { + if ( m_FindReplaceData->m_FindWhat != m_lastSearch ) + { + event.SetEventType(wxEVT_COMMAND_FIND); + + m_lastSearch = m_FindReplaceData->m_FindWhat; + } + } + + if ( !GetEventHandler()->ProcessEvent(event) ) + { + // the event is not propagated upwards to the parent automatically + // because the dialog is a top level window, so do it manually as + // in 9 cases of 10 the message must be processed by the dialog + // owner and not the dialog itself + (void)GetParent()->GetEventHandler()->ProcessEvent(event); + } +} + +#endif // wxUSE_FINDREPLDLG + diff --git a/Externals/wxWidgets/src/common/ffile.cpp b/Externals/wxWidgets/src/common/ffile.cpp new file mode 100644 index 0000000000..12dfeb0832 --- /dev/null +++ b/Externals/wxWidgets/src/common/ffile.cpp @@ -0,0 +1,268 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: ffile.cpp +// Purpose: wxFFile encapsulates "FILE *" IO stream +// Author: Vadim Zeitlin +// Modified by: +// Created: 14.07.99 +// RCS-ID: $Id: ffile.cpp 38570 2006-04-05 14:37:47Z VZ $ +// Copyright: (c) 1998 Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_FFILE + +#ifndef WX_PRECOMP + #include "wx/intl.h" + #include "wx/log.h" +#endif + +#ifdef __WINDOWS__ +#include "wx/msw/mslu.h" +#endif + +#include "wx/ffile.h" + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// seek and tell with large file support if available +// ---------------------------------------------------------------------------- + +#ifdef HAVE_FSEEKO +# define wxFseek fseeko +# define wxFtell ftello +#else +# define wxFseek fseek +# define wxFtell ftell +#endif + +// ---------------------------------------------------------------------------- +// opening the file +// ---------------------------------------------------------------------------- + +wxFFile::wxFFile(const wxChar *filename, const wxChar *mode) +{ + Detach(); + + (void)Open(filename, mode); +} + +bool wxFFile::Open(const wxChar *filename, const wxChar *mode) +{ + wxASSERT_MSG( !m_fp, wxT("should close or detach the old file first") ); + + m_fp = wxFopen(filename, mode); + + if ( !m_fp ) + { + wxLogSysError(_("can't open file '%s'"), filename); + + return false; + } + + m_name = filename; + + return true; +} + +bool wxFFile::Close() +{ + if ( IsOpened() ) + { + if ( fclose(m_fp) != 0 ) + { + wxLogSysError(_("can't close file '%s'"), m_name.c_str()); + + return false; + } + + Detach(); + } + + return true; +} + +// ---------------------------------------------------------------------------- +// read/write +// ---------------------------------------------------------------------------- + +bool wxFFile::ReadAll(wxString *str, const wxMBConv& conv) +{ + wxCHECK_MSG( str, false, wxT("invalid parameter") ); + wxCHECK_MSG( IsOpened(), false, wxT("can't read from closed file") ); + wxCHECK_MSG( Length() >= 0, false, wxT("invalid length") ); + size_t length = wx_truncate_cast(size_t, Length()); + wxCHECK_MSG( (wxFileOffset)length == Length(), false, wxT("huge file not supported") ); + + clearerr(m_fp); + + wxCharBuffer buf(length + 1); + + // note that real length may be less than file length for text files with DOS EOLs + // ('\r's get dropped by CRT when reading which means that we have + // realLen = fileLen - numOfLinesInTheFile) + length = fread(buf.data(), sizeof(char), length, m_fp); + + if ( Error() ) + { + wxLogSysError(_("Read error on file '%s'"), m_name.c_str()); + + return false; + } + + buf.data()[length] = 0; + *str = wxString(buf, conv); + + return true; +} + +size_t wxFFile::Read(void *pBuf, size_t nCount) +{ + wxCHECK_MSG( pBuf, 0, wxT("invalid parameter") ); + wxCHECK_MSG( IsOpened(), 0, wxT("can't read from closed file") ); + + size_t nRead = fread(pBuf, 1, nCount, m_fp); + if ( (nRead < nCount) && Error() ) + { + wxLogSysError(_("Read error on file '%s'"), m_name.c_str()); + } + + return nRead; +} + +size_t wxFFile::Write(const void *pBuf, size_t nCount) +{ + wxCHECK_MSG( pBuf, 0, wxT("invalid parameter") ); + wxCHECK_MSG( IsOpened(), 0, wxT("can't write to closed file") ); + + size_t nWritten = fwrite(pBuf, 1, nCount, m_fp); + if ( nWritten < nCount ) + { + wxLogSysError(_("Write error on file '%s'"), m_name.c_str()); + } + + return nWritten; +} + +bool wxFFile::Flush() +{ + if ( IsOpened() ) + { + // fflush returns non-zero on error + // + if ( fflush(m_fp) ) + { + wxLogSysError(_("failed to flush the file '%s'"), m_name.c_str()); + + return false; + } + } + + return true; +} + +// ---------------------------------------------------------------------------- +// seeking +// ---------------------------------------------------------------------------- + +bool wxFFile::Seek(wxFileOffset ofs, wxSeekMode mode) +{ + wxCHECK_MSG( IsOpened(), false, wxT("can't seek on closed file") ); + + int origin; + switch ( mode ) + { + default: + wxFAIL_MSG(wxT("unknown seek mode")); + // still fall through + + case wxFromStart: + origin = SEEK_SET; + break; + + case wxFromCurrent: + origin = SEEK_CUR; + break; + + case wxFromEnd: + origin = SEEK_END; + break; + } + +#ifndef HAVE_FSEEKO + if ((long)ofs != ofs) + { + wxLogError(_("Seek error on file '%s' (large files not supported by stdio)"), m_name.c_str()); + + return false; + } + + if ( wxFseek(m_fp, (long)ofs, origin) != 0 ) +#else + if ( wxFseek(m_fp, ofs, origin) != 0 ) +#endif + { + wxLogSysError(_("Seek error on file '%s'"), m_name.c_str()); + + return false; + } + + return true; +} + +wxFileOffset wxFFile::Tell() const +{ + wxCHECK_MSG( IsOpened(), wxInvalidOffset, + _T("wxFFile::Tell(): file is closed!") ); + + wxFileOffset rc = wxFtell(m_fp); + if ( rc == wxInvalidOffset ) + { + wxLogSysError(_("Can't find current position in file '%s'"), + m_name.c_str()); + } + + return rc; +} + +wxFileOffset wxFFile::Length() const +{ + wxCHECK_MSG( IsOpened(), wxInvalidOffset, + _T("wxFFile::Length(): file is closed!") ); + + wxFFile& self = *(wxFFile *)this; // const_cast + + wxFileOffset posOld = Tell(); + if ( posOld != wxInvalidOffset ) + { + if ( self.SeekEnd() ) + { + wxFileOffset len = Tell(); + + (void)self.Seek(posOld); + + return len; + } + } + + return wxInvalidOffset; +} + +#endif // wxUSE_FFILE diff --git a/Externals/wxWidgets/src/common/file.cpp b/Externals/wxWidgets/src/common/file.cpp new file mode 100644 index 0000000000..7b5427460f --- /dev/null +++ b/Externals/wxWidgets/src/common/file.cpp @@ -0,0 +1,559 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: file.cpp +// Purpose: wxFile - encapsulates low-level "file descriptor" +// wxTempFile +// Author: Vadim Zeitlin +// Modified by: +// Created: 29/01/98 +// RCS-ID: $Id: file.cpp 42876 2006-10-31 23:29:02Z SN $ +// Copyright: (c) 1998 Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_FILE + +// standard +#if defined(__WXMSW__) && !defined(__GNUWIN32__) && !defined(__WXMICROWIN__) && !defined(__WXWINCE__) + +#ifndef __SALFORDC__ + #define WIN32_LEAN_AND_MEAN + #define NOSERVICE + #define NOIME + #define NOATOM + #define NOGDI + #define NOGDICAPMASKS + #define NOMETAFILE + #define NOMINMAX + #define NOMSG + #define NOOPENFILE + #define NORASTEROPS + #define NOSCROLL + #define NOSOUND + #define NOSYSMETRICS + #define NOTEXTMETRIC + #define NOWH + #define NOCOMM + #define NOKANJI + #define NOCRYPT + #define NOMCX +#endif + +#elif defined(__WXMSW__) && defined(__WXWINCE__) + #include "wx/msw/missing.h" +#elif (defined(__OS2__)) + #include +#elif (defined(__UNIX__) || defined(__GNUWIN32__)) + #include + #include + #include + #ifdef __GNUWIN32__ + #include "wx/msw/wrapwin.h" + #endif +#elif defined(__DOS__) + #if defined(__WATCOMC__) + #include + #elif defined(__DJGPP__) + #include + #include + #include + #else + #error "Please specify the header with file functions declarations." + #endif +#elif (defined(__WXSTUBS__)) + // Have to ifdef this for different environments + #include +#elif (defined(__WXMAC__)) +#if __MSL__ < 0x6000 + int access( const char *path, int mode ) { return 0 ; } +#else + int _access( const char *path, int mode ) { return 0 ; } +#endif + char* mktemp( char * path ) { return path ;} + #include + #include +#else + #error "Please specify the header with file functions declarations." +#endif //Win/UNIX + +#include // SEEK_xxx constants + +// Windows compilers don't have these constants +#ifndef W_OK + enum + { + F_OK = 0, // test for existence + X_OK = 1, // execute permission + W_OK = 2, // write + R_OK = 4 // read + }; +#endif // W_OK + +#ifdef __SALFORDC__ + #include +#endif + +// some broken compilers don't have 3rd argument in open() and creat() +#ifdef __SALFORDC__ + #define ACCESS(access) + #define stat _stat +#else // normal compiler + #define ACCESS(access) , (access) +#endif // Salford C + +// wxWidgets +#ifndef WX_PRECOMP + #include "wx/string.h" + #include "wx/intl.h" + #include "wx/log.h" +#endif // !WX_PRECOMP + +#include "wx/filename.h" +#include "wx/file.h" +#include "wx/filefn.h" + +// there is no distinction between text and binary files under Unix, so define +// O_BINARY as 0 if the system headers don't do it already +#if defined(__UNIX__) && !defined(O_BINARY) + #define O_BINARY (0) +#endif //__UNIX__ + +#ifdef __WXMSW__ + #include "wx/msw/mslu.h" +#endif + +#ifdef __WXWINCE__ + #include "wx/msw/private.h" +#endif + +#ifndef MAX_PATH + #define MAX_PATH 512 +#endif + +// ============================================================================ +// implementation of wxFile +// ============================================================================ + +// ---------------------------------------------------------------------------- +// static functions +// ---------------------------------------------------------------------------- + +bool wxFile::Exists(const wxChar *name) +{ + return wxFileExists(name); +} + +bool wxFile::Access(const wxChar *name, OpenMode mode) +{ + int how; + + switch ( mode ) + { + default: + wxFAIL_MSG(wxT("bad wxFile::Access mode parameter.")); + // fall through + + case read: + how = R_OK; + break; + + case write: + how = W_OK; + break; + + case read_write: + how = R_OK | W_OK; + break; + } + + return wxAccess(name, how) == 0; +} + +// ---------------------------------------------------------------------------- +// opening/closing +// ---------------------------------------------------------------------------- + +// ctors +wxFile::wxFile(const wxChar *szFileName, OpenMode mode) +{ + m_fd = fd_invalid; + m_error = false; + + Open(szFileName, mode); +} + +// create the file, fail if it already exists and bOverwrite +bool wxFile::Create(const wxChar *szFileName, bool bOverwrite, int accessMode) +{ + // if bOverwrite we create a new file or truncate the existing one, + // otherwise we only create the new file and fail if it already exists +#if defined(__WXMAC__) && !defined(__UNIX__) && !wxUSE_UNICODE + // Dominic Mazzoni [dmazzoni+@cs.cmu.edu] reports that open is still broken on the mac, so we replace + // int fd = open( szFileName , O_CREAT | (bOverwrite ? O_TRUNC : O_EXCL), access); + int fd = creat( szFileName , accessMode); +#else + int fd = wxOpen( szFileName, + O_BINARY | O_WRONLY | O_CREAT | + (bOverwrite ? O_TRUNC : O_EXCL) + ACCESS(accessMode) ); +#endif + if ( fd == -1 ) + { + wxLogSysError(_("can't create file '%s'"), szFileName); + return false; + } + + Attach(fd); + return true; +} + +// open the file +bool wxFile::Open(const wxChar *szFileName, OpenMode mode, int accessMode) +{ + int flags = O_BINARY; + + switch ( mode ) + { + case read: + flags |= O_RDONLY; + break; + + case write_append: + if ( wxFile::Exists(szFileName) ) + { + flags |= O_WRONLY | O_APPEND; + break; + } + //else: fall through as write_append is the same as write if the + // file doesn't exist + + case write: + flags |= O_WRONLY | O_CREAT | O_TRUNC; + break; + + case write_excl: + flags |= O_WRONLY | O_CREAT | O_EXCL; + break; + + case read_write: + flags |= O_RDWR; + break; + } + +#ifdef __WINDOWS__ + // only read/write bits for "all" are supported by this function under + // Windows, and VC++ 8 returns EINVAL if any other bits are used in + // accessMode, so clear them as they have at best no effect anyhow + accessMode &= wxS_IRUSR | wxS_IWUSR; +#endif // __WINDOWS__ + + int fd = wxOpen( szFileName, flags ACCESS(accessMode)); + + if ( fd == -1 ) + { + wxLogSysError(_("can't open file '%s'"), szFileName); + return false; + } + + Attach(fd); + return true; +} + +// close +bool wxFile::Close() +{ + if ( IsOpened() ) { + if (wxClose(m_fd) == -1) + { + wxLogSysError(_("can't close file descriptor %d"), m_fd); + m_fd = fd_invalid; + return false; + } + else + m_fd = fd_invalid; + } + + return true; +} + +// ---------------------------------------------------------------------------- +// read/write +// ---------------------------------------------------------------------------- + +// read +ssize_t wxFile::Read(void *pBuf, size_t nCount) +{ + wxCHECK( (pBuf != NULL) && IsOpened(), 0 ); + + ssize_t iRc = wxRead(m_fd, pBuf, nCount); + + if ( iRc == -1 ) + { + wxLogSysError(_("can't read from file descriptor %d"), m_fd); + return wxInvalidOffset; + } + + return iRc; +} + +// write +size_t wxFile::Write(const void *pBuf, size_t nCount) +{ + wxCHECK( (pBuf != NULL) && IsOpened(), 0 ); + + ssize_t iRc = wxWrite(m_fd, pBuf, nCount); + + if ( iRc == -1 ) + { + wxLogSysError(_("can't write to file descriptor %d"), m_fd); + m_error = true; + iRc = 0; + } + + return iRc; +} + +// flush +bool wxFile::Flush() +{ +#ifdef HAVE_FSYNC + // fsync() only works on disk files and returns errors for pipes, don't + // call it then + if ( IsOpened() && GetKind() == wxFILE_KIND_DISK ) + { + if ( wxFsync(m_fd) == -1 ) + { + wxLogSysError(_("can't flush file descriptor %d"), m_fd); + return false; + } + } +#endif // HAVE_FSYNC + + return true; +} + +// ---------------------------------------------------------------------------- +// seek +// ---------------------------------------------------------------------------- + +// seek +wxFileOffset wxFile::Seek(wxFileOffset ofs, wxSeekMode mode) +{ + wxASSERT_MSG( IsOpened(), _T("can't seek on closed file") ); + wxCHECK_MSG( ofs != wxInvalidOffset || mode != wxFromStart, + wxInvalidOffset, + _T("invalid absolute file offset") ); + + int origin; + switch ( mode ) { + default: + wxFAIL_MSG(_("unknown seek origin")); + + case wxFromStart: + origin = SEEK_SET; + break; + + case wxFromCurrent: + origin = SEEK_CUR; + break; + + case wxFromEnd: + origin = SEEK_END; + break; + } + + wxFileOffset iRc = wxSeek(m_fd, ofs, origin); + if ( iRc == wxInvalidOffset ) + { + wxLogSysError(_("can't seek on file descriptor %d"), m_fd); + } + + return iRc; +} + +// get current file offset +wxFileOffset wxFile::Tell() const +{ + wxASSERT( IsOpened() ); + + wxFileOffset iRc = wxTell(m_fd); + if ( iRc == wxInvalidOffset ) + { + wxLogSysError(_("can't get seek position on file descriptor %d"), m_fd); + } + + return iRc; +} + +// get current file length +wxFileOffset wxFile::Length() const +{ + wxASSERT( IsOpened() ); + + wxFileOffset iRc = Tell(); + if ( iRc != wxInvalidOffset ) { + // have to use const_cast :-( + wxFileOffset iLen = ((wxFile *)this)->SeekEnd(); + if ( iLen != wxInvalidOffset ) { + // restore old position + if ( ((wxFile *)this)->Seek(iRc) == wxInvalidOffset ) { + // error + iLen = wxInvalidOffset; + } + } + + iRc = iLen; + } + + if ( iRc == wxInvalidOffset ) + { + wxLogSysError(_("can't find length of file on file descriptor %d"), m_fd); + } + + return iRc; +} + +// is end of file reached? +bool wxFile::Eof() const +{ + wxASSERT( IsOpened() ); + + wxFileOffset iRc; + +#if defined(__DOS__) || defined(__UNIX__) || defined(__GNUWIN32__) || defined( __MWERKS__ ) || defined(__SALFORDC__) + // @@ this doesn't work, of course, on unseekable file descriptors + wxFileOffset ofsCur = Tell(), + ofsMax = Length(); + if ( ofsCur == wxInvalidOffset || ofsMax == wxInvalidOffset ) + iRc = wxInvalidOffset; + else + iRc = ofsCur == ofsMax; +#else // Windows and "native" compiler + iRc = wxEof(m_fd); +#endif // Windows/Unix + + if ( iRc == 1) + {} + else if ( iRc == 0 ) + return false; + else if ( iRc == wxInvalidOffset ) + wxLogSysError(_("can't determine if the end of file is reached on descriptor %d"), m_fd); + else + wxFAIL_MSG(_("invalid eof() return value.")); + + return true; +} + +// ============================================================================ +// implementation of wxTempFile +// ============================================================================ + +// ---------------------------------------------------------------------------- +// construction +// ---------------------------------------------------------------------------- + +wxTempFile::wxTempFile(const wxString& strName) +{ + Open(strName); +} + +bool wxTempFile::Open(const wxString& strName) +{ + // we must have an absolute filename because otherwise CreateTempFileName() + // would create the temp file in $TMP (i.e. the system standard location + // for the temp files) which might be on another volume/drive/mount and + // wxRename()ing it later to m_strName from Commit() would then fail + // + // with the absolute filename, the temp file is created in the same + // directory as this one which ensures that wxRename() may work later + wxFileName fn(strName); + if ( !fn.IsAbsolute() ) + { + fn.Normalize(wxPATH_NORM_ABSOLUTE); + } + + m_strName = fn.GetFullPath(); + + m_strTemp = wxFileName::CreateTempFileName(m_strName, &m_file); + + if ( m_strTemp.empty() ) + { + // CreateTempFileName() failed + return false; + } + +#ifdef __UNIX__ + // the temp file should have the same permissions as the original one + mode_t mode; + + wxStructStat st; + if ( stat( (const char*) m_strName.fn_str(), &st) == 0 ) + { + mode = st.st_mode; + } + else + { + // file probably didn't exist, just give it the default mode _using_ + // user's umask (new files creation should respect umask) + mode_t mask = umask(0777); + mode = 0666 & ~mask; + umask(mask); + } + + if ( chmod( (const char*) m_strTemp.fn_str(), mode) == -1 ) + { +#ifndef __OS2__ + wxLogSysError(_("Failed to set temporary file permissions")); +#endif + } +#endif // Unix + + return true; +} + +// ---------------------------------------------------------------------------- +// destruction +// ---------------------------------------------------------------------------- + +wxTempFile::~wxTempFile() +{ + if ( IsOpened() ) + Discard(); +} + +bool wxTempFile::Commit() +{ + m_file.Close(); + + if ( wxFile::Exists(m_strName) && wxRemove(m_strName) != 0 ) { + wxLogSysError(_("can't remove file '%s'"), m_strName.c_str()); + return false; + } + + if ( !wxRenameFile(m_strTemp, m_strName) ) { + wxLogSysError(_("can't commit changes to file '%s'"), m_strName.c_str()); + return false; + } + + return true; +} + +void wxTempFile::Discard() +{ + m_file.Close(); + if ( wxRemove(m_strTemp) != 0 ) + wxLogSysError(_("can't remove temporary file '%s'"), m_strTemp.c_str()); +} + +#endif // wxUSE_FILE + diff --git a/Externals/wxWidgets/src/common/fileback.cpp b/Externals/wxWidgets/src/common/fileback.cpp new file mode 100644 index 0000000000..58fba90c02 --- /dev/null +++ b/Externals/wxWidgets/src/common/fileback.cpp @@ -0,0 +1,338 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/fileback.cpp +// Purpose: Back an input stream with memory or a file +// Author: Mike Wetherell +// RCS-ID: $Id: fileback.cpp 42651 2006-10-29 20:06:45Z MW $ +// Copyright: (c) 2006 Mike Wetherell +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_FILESYSTEM + +#include "wx/private/fileback.h" + +#ifndef WX_PRECOMP + #include "wx/utils.h" + #include "wx/log.h" +#endif + +#include "wx/private/filename.h" + +// Prefer wxFFile unless wxFile has large file support but wxFFile does not. +// +#if wxUSE_FFILE && (defined wxHAS_LARGE_FFILES || !defined wxHAS_LARGE_FILES) +typedef wxFFile wxBFFile; +static const bool wxBadSeek = false; +#else +typedef wxFile wxBFFile; +static const wxFileOffset wxBadSeek = wxInvalidOffset; +#endif + +///////////////////////////////////////////////////////////////////////////// +// Backing file implementation + +class wxBackingFileImpl +{ +public: + wxBackingFileImpl(wxInputStream *stream, + size_t bufsize, + const wxString& prefix); + ~wxBackingFileImpl(); + + void Release() { if (--m_refcount == 0) delete this; } + wxBackingFileImpl *AddRef() { m_refcount++; return this; } + + wxStreamError ReadAt(wxFileOffset pos, void *buffer, size_t *size); + wxFileOffset GetLength() const; + +private: + int m_refcount; + + wxInputStream *m_stream; + wxStreamError m_parenterror; + + char *m_buf; + size_t m_bufsize; + size_t m_buflen; + + wxString m_prefix; + wxString m_filename; + wxBFFile m_file; + wxFileOffset m_filelen; +}; + +wxBackingFileImpl::wxBackingFileImpl(wxInputStream *stream, + size_t bufsize, + const wxString& prefix) + : m_refcount(1), + m_stream(stream), + m_parenterror(wxSTREAM_NO_ERROR), + m_buf(NULL), + m_bufsize(bufsize), + m_buflen(0), + m_prefix(prefix), + m_filelen(0) +{ + wxFileOffset len = m_stream->GetLength(); + + if (len >= 0 && len + size_t(1) < m_bufsize) + m_bufsize = size_t(len + 1); + + if (m_bufsize) + m_buf = new char[m_bufsize]; +} + +wxBackingFileImpl::~wxBackingFileImpl() +{ + delete m_stream; + delete [] m_buf; + + if (!m_filename.empty()) + wxRemoveFile(m_filename); +} + +wxStreamError wxBackingFileImpl::ReadAt(wxFileOffset pos, + void *buffer, + size_t *size) +{ + size_t reqestedSize = *size; + *size = 0; + + // size1 is the number of bytes it will read directly from the backing + // file. size2 is any remaining bytes not yet backed, these are returned + // from the buffer or read from the parent stream. + size_t size1, size2; + + if (pos + reqestedSize <= m_filelen + size_t(0)) { + size1 = reqestedSize; + size2 = 0; + } else if (pos < m_filelen) { + size1 = size_t(m_filelen - pos); + size2 = reqestedSize - size1; + } else { + size1 = 0; + size2 = reqestedSize; + } + + if (pos < 0) + return wxSTREAM_READ_ERROR; + + // read the backing file + if (size1) { + if (m_file.Seek(pos) == wxBadSeek) + return wxSTREAM_READ_ERROR; + + ssize_t n = m_file.Read(buffer, size1); + if (n > 0) { + *size = n; + pos += n; + } + + if (*size < size1) + return wxSTREAM_READ_ERROR; + } + + // read from the buffer or parent stream + if (size2) + { + while (*size < reqestedSize) + { + // if pos is further ahead than the parent has been read so far, + // then read forward in the parent stream + while (pos - m_filelen + size_t(0) >= m_buflen) + { + // if the parent is small enough, don't use a backing file + // just the buffer memory + if (!m_stream && m_filelen == 0) + return m_parenterror; + + // before refilling the buffer write out the current buffer + // to the backing file if there is anything in it + if (m_buflen) + { + if (!m_file.IsOpened()) + if (!wxCreateTempFile(m_prefix, &m_file, &m_filename)) + return wxSTREAM_READ_ERROR; + + if (m_file.Seek(m_filelen) == wxBadSeek) + return wxSTREAM_READ_ERROR; + + size_t count = m_file.Write(m_buf, m_buflen); + m_filelen += count; + + if (count < m_buflen) { + delete m_stream; + m_stream = NULL; + if (count > 0) { + delete[] m_buf; + m_buf = NULL; + m_buflen = 0; + } + m_parenterror = wxSTREAM_READ_ERROR; + return m_parenterror; + } + + m_buflen = 0; + + if (!m_stream) { + delete[] m_buf; + m_buf = NULL; + } + } + + if (!m_stream) + return m_parenterror; + + // refill buffer + m_buflen = m_stream->Read(m_buf, m_bufsize).LastRead(); + + if (m_buflen < m_bufsize) { + m_parenterror = m_stream->GetLastError(); + if (m_parenterror == wxSTREAM_NO_ERROR) + m_parenterror = wxSTREAM_EOF; + delete m_stream; + m_stream = NULL; + } + } + + // copy to the user's buffer + size_t start = size_t(pos - m_filelen); + size_t len = wxMin(m_buflen - start, reqestedSize - *size); + + memcpy((char*)buffer + *size, m_buf + start, len); + *size += len; + pos += len; + } + } + + return wxSTREAM_NO_ERROR; +} + +wxFileOffset wxBackingFileImpl::GetLength() const +{ + if (m_parenterror != wxSTREAM_EOF) { + wxLogNull nolog; + return m_stream->GetLength(); + } + return m_filelen + m_buflen; +} + + +///////////////////////////////////////////////////////////////////////////// +// Backing File, the handle part + +wxBackingFile::wxBackingFile(wxInputStream *stream, + size_t bufsize, + const wxString& prefix) + : m_impl(new wxBackingFileImpl(stream, bufsize, prefix)) +{ +} + +wxBackingFile::wxBackingFile(const wxBackingFile& backer) + : m_impl(backer.m_impl ? backer.m_impl->AddRef() : NULL) +{ +} + +wxBackingFile& wxBackingFile::operator=(const wxBackingFile& backer) +{ + if (backer.m_impl != m_impl) { + if (m_impl) + m_impl->Release(); + + m_impl = backer.m_impl; + + if (m_impl) + m_impl->AddRef(); + } + + return *this; +} + +wxBackingFile::~wxBackingFile() +{ + if (m_impl) + m_impl->Release(); +} + + +///////////////////////////////////////////////////////////////////////////// +// Input stream + +wxBackedInputStream::wxBackedInputStream(const wxBackingFile& backer) + : m_backer(backer), + m_pos(0) +{ +} + +wxFileOffset wxBackedInputStream::GetLength() const +{ + return m_backer.m_impl->GetLength(); +} + +wxFileOffset wxBackedInputStream::FindLength() const +{ + wxFileOffset len = GetLength(); + + if (len == wxInvalidOffset && IsOk()) { + // read a byte at 7ff...ffe + wxFileOffset pos = 1; + pos <<= sizeof(pos) * 8 - 1; + pos = ~pos - 1; + char ch; + size_t size = 1; + m_backer.m_impl->ReadAt(pos, &ch, &size); + len = GetLength(); + } + + return len; +} + +size_t wxBackedInputStream::OnSysRead(void *buffer, size_t size) +{ + if (!IsOk()) + return 0; + + m_lasterror = m_backer.m_impl->ReadAt(m_pos, buffer, &size); + m_pos += size; + return size; +} + +wxFileOffset wxBackedInputStream::OnSysSeek(wxFileOffset pos, wxSeekMode mode) +{ + switch (mode) { + case wxFromCurrent: + { + m_pos += pos; + break; + } + case wxFromEnd: + { + wxFileOffset len = GetLength(); + if (len == wxInvalidOffset) + return wxInvalidOffset; + m_pos = len + pos; + break; + } + default: + { + m_pos = pos; + break; + } + } + + return m_pos; +} + +wxFileOffset wxBackedInputStream::OnSysTell() const +{ + return m_pos; +} + +#endif // wxUSE_FILESYSTEM diff --git a/Externals/wxWidgets/src/common/fileconf.cpp b/Externals/wxWidgets/src/common/fileconf.cpp new file mode 100644 index 0000000000..6f312adae9 --- /dev/null +++ b/Externals/wxWidgets/src/common/fileconf.cpp @@ -0,0 +1,2131 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/common/fileconf.cpp +// Purpose: implementation of wxFileConfig derivation of wxConfig +// Author: Vadim Zeitlin +// Modified by: +// Created: 07.04.98 (adapted from appconf.cpp) +// RCS-ID: $Id: fileconf.cpp 49525 2007-10-29 19:00:07Z VZ $ +// Copyright: (c) 1997 Karsten Ballüder & Vadim Zeitlin +// Ballueder@usa.net +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif //__BORLANDC__ + +#if wxUSE_CONFIG && wxUSE_FILECONFIG + +#ifndef WX_PRECOMP + #include "wx/dynarray.h" + #include "wx/string.h" + #include "wx/intl.h" + #include "wx/log.h" + #include "wx/app.h" + #include "wx/utils.h" // for wxGetHomeDir + #if wxUSE_STREAMS + #include "wx/stream.h" + #endif // wxUSE_STREAMS +#endif //WX_PRECOMP + +#include "wx/file.h" +#include "wx/textfile.h" +#include "wx/memtext.h" +#include "wx/config.h" +#include "wx/fileconf.h" +#include "wx/filefn.h" + +#if defined(__WXMAC__) + #include "wx/mac/private.h" // includes mac headers + #include "wx/filename.h" // for MacSetTypeAndCreator +#endif + +#if defined(__WXMSW__) + #include "wx/msw/private.h" +#endif //windows.h +#if defined(__WXPM__) + #define INCL_DOS + #include +#endif + +#include +#include + +// ---------------------------------------------------------------------------- +// macros +// ---------------------------------------------------------------------------- +#define CONST_CAST ((wxFileConfig *)this)-> + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +#ifndef MAX_PATH + #define MAX_PATH 512 +#endif + +#define FILECONF_TRACE_MASK _T("fileconf") + +// ---------------------------------------------------------------------------- +// global functions declarations +// ---------------------------------------------------------------------------- + +// compare functions for sorting the arrays +static int LINKAGEMODE CompareEntries(wxFileConfigEntry *p1, wxFileConfigEntry *p2); +static int LINKAGEMODE CompareGroups(wxFileConfigGroup *p1, wxFileConfigGroup *p2); + +// filter strings +static wxString FilterInValue(const wxString& str); +static wxString FilterOutValue(const wxString& str); + +static wxString FilterInEntryName(const wxString& str); +static wxString FilterOutEntryName(const wxString& str); + +// get the name to use in wxFileConfig ctor +static wxString GetAppName(const wxString& appname); + +// ============================================================================ +// private classes +// ============================================================================ + +// ---------------------------------------------------------------------------- +// "template" array types +// ---------------------------------------------------------------------------- + +#ifdef WXMAKINGDLL_BASE + WX_DEFINE_SORTED_USER_EXPORTED_ARRAY(wxFileConfigEntry *, ArrayEntries, + WXDLLIMPEXP_BASE); + WX_DEFINE_SORTED_USER_EXPORTED_ARRAY(wxFileConfigGroup *, ArrayGroups, + WXDLLIMPEXP_BASE); +#else + WX_DEFINE_SORTED_ARRAY(wxFileConfigEntry *, ArrayEntries); + WX_DEFINE_SORTED_ARRAY(wxFileConfigGroup *, ArrayGroups); +#endif + +// ---------------------------------------------------------------------------- +// wxFileConfigLineList +// ---------------------------------------------------------------------------- + +// we store all lines of the local config file as a linked list in memory +class wxFileConfigLineList +{ +public: + void SetNext(wxFileConfigLineList *pNext) { m_pNext = pNext; } + void SetPrev(wxFileConfigLineList *pPrev) { m_pPrev = pPrev; } + + // ctor + wxFileConfigLineList(const wxString& str, + wxFileConfigLineList *pNext = NULL) : m_strLine(str) + { SetNext(pNext); SetPrev(NULL); } + + // next/prev nodes in the linked list + wxFileConfigLineList *Next() const { return m_pNext; } + wxFileConfigLineList *Prev() const { return m_pPrev; } + + // get/change lines text + void SetText(const wxString& str) { m_strLine = str; } + const wxString& Text() const { return m_strLine; } + +private: + wxString m_strLine; // line contents + wxFileConfigLineList *m_pNext, // next node + *m_pPrev; // previous one + + DECLARE_NO_COPY_CLASS(wxFileConfigLineList) +}; + +// ---------------------------------------------------------------------------- +// wxFileConfigEntry: a name/value pair +// ---------------------------------------------------------------------------- + +class wxFileConfigEntry +{ +private: + wxFileConfigGroup *m_pParent; // group that contains us + + wxString m_strName, // entry name + m_strValue; // value + bool m_bImmutable:1, // can be overriden locally? + m_bHasValue:1; // set after first call to SetValue() + + int m_nLine; // used if m_pLine == NULL only + + // pointer to our line in the linked list or NULL if it was found in global + // file (which we don't modify) + wxFileConfigLineList *m_pLine; + +public: + wxFileConfigEntry(wxFileConfigGroup *pParent, + const wxString& strName, int nLine); + + // simple accessors + const wxString& Name() const { return m_strName; } + const wxString& Value() const { return m_strValue; } + wxFileConfigGroup *Group() const { return m_pParent; } + bool IsImmutable() const { return m_bImmutable; } + bool IsLocal() const { return m_pLine != 0; } + int Line() const { return m_nLine; } + wxFileConfigLineList * + GetLine() const { return m_pLine; } + + // modify entry attributes + void SetValue(const wxString& strValue, bool bUser = true); + void SetLine(wxFileConfigLineList *pLine); + + DECLARE_NO_COPY_CLASS(wxFileConfigEntry) +}; + +// ---------------------------------------------------------------------------- +// wxFileConfigGroup: container of entries and other groups +// ---------------------------------------------------------------------------- + +class wxFileConfigGroup +{ +private: + wxFileConfig *m_pConfig; // config object we belong to + wxFileConfigGroup *m_pParent; // parent group (NULL for root group) + ArrayEntries m_aEntries; // entries in this group + ArrayGroups m_aSubgroups; // subgroups + wxString m_strName; // group's name + wxFileConfigLineList *m_pLine; // pointer to our line in the linked list + wxFileConfigEntry *m_pLastEntry; // last entry/subgroup of this group in the + wxFileConfigGroup *m_pLastGroup; // local file (we insert new ones after it) + + // DeleteSubgroupByName helper + bool DeleteSubgroup(wxFileConfigGroup *pGroup); + + // used by Rename() + void UpdateGroupAndSubgroupsLines(); + +public: + // ctor + wxFileConfigGroup(wxFileConfigGroup *pParent, const wxString& strName, wxFileConfig *); + + // dtor deletes all entries and subgroups also + ~wxFileConfigGroup(); + + // simple accessors + const wxString& Name() const { return m_strName; } + wxFileConfigGroup *Parent() const { return m_pParent; } + wxFileConfig *Config() const { return m_pConfig; } + + const ArrayEntries& Entries() const { return m_aEntries; } + const ArrayGroups& Groups() const { return m_aSubgroups; } + bool IsEmpty() const { return Entries().IsEmpty() && Groups().IsEmpty(); } + + // find entry/subgroup (NULL if not found) + wxFileConfigGroup *FindSubgroup(const wxChar *szName) const; + wxFileConfigEntry *FindEntry (const wxChar *szName) const; + + // delete entry/subgroup, return false if doesn't exist + bool DeleteSubgroupByName(const wxChar *szName); + bool DeleteEntry(const wxChar *szName); + + // create new entry/subgroup returning pointer to newly created element + wxFileConfigGroup *AddSubgroup(const wxString& strName); + wxFileConfigEntry *AddEntry (const wxString& strName, int nLine = wxNOT_FOUND); + + void SetLine(wxFileConfigLineList *pLine); + + // rename: no checks are done to ensure that the name is unique! + void Rename(const wxString& newName); + + // + wxString GetFullName() const; + + // get the last line belonging to an entry/subgroup of this group + wxFileConfigLineList *GetGroupLine(); // line which contains [group] + // may be NULL for "/" only + wxFileConfigLineList *GetLastEntryLine(); // after which our subgroups start + wxFileConfigLineList *GetLastGroupLine(); // after which the next group starts + + // called by entries/subgroups when they're created/deleted + void SetLastEntry(wxFileConfigEntry *pEntry); + void SetLastGroup(wxFileConfigGroup *pGroup) + { m_pLastGroup = pGroup; } + + DECLARE_NO_COPY_CLASS(wxFileConfigGroup) +}; + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// static functions +// ---------------------------------------------------------------------------- +wxString wxFileConfig::GetGlobalDir() +{ + wxString strDir; + +#ifdef __VMS__ // Note if __VMS is defined __UNIX is also defined + strDir = wxT("sys$manager:"); +#elif defined(__WXMAC__) + strDir = wxMacFindFolder( (short) kOnSystemDisk, kPreferencesFolderType, kDontCreateFolder ) ; +#elif defined( __UNIX__ ) + strDir = wxT("/etc/"); +#elif defined(__OS2__) + ULONG aulSysInfo[QSV_MAX] = {0}; + UINT drive; + APIRET rc; + + rc = DosQuerySysInfo( 1L, QSV_MAX, (PVOID)aulSysInfo, sizeof(ULONG)*QSV_MAX); + if (rc == 0) + { + drive = aulSysInfo[QSV_BOOT_DRIVE - 1]; + strDir.Printf(wxT("%c:\\OS2\\"), 'A'+drive-1); + } +#elif defined(__WXSTUBS__) + wxFAIL_MSG( wxT("TODO") ); +#elif defined(__DOS__) + // There's no such thing as global cfg dir in MS-DOS, let's return + // current directory (FIXME_MGL?) + strDir = wxT(".\\"); +#elif defined(__WXWINCE__) + strDir = wxT("\\Windows\\"); +#else // Windows + + wxChar szWinDir[MAX_PATH]; + ::GetWindowsDirectory(szWinDir, MAX_PATH); + + strDir = szWinDir; + strDir << wxT('\\'); +#endif // Unix/Windows + + return strDir; +} + +wxString wxFileConfig::GetLocalDir() +{ + wxString strDir; + +#if defined(__WXMAC__) || defined(__DOS__) + // no local dir concept on Mac OS 9 or MS-DOS + strDir << GetGlobalDir() ; +#else + wxGetHomeDir(&strDir); + + #ifdef __UNIX__ + if ( + (strDir.Last() != wxT('/')) + #ifdef __VMS + && (strDir.Last() != wxT(']')) + #endif + ) + strDir << wxT('/'); + #else + if (strDir.Last() != wxT('\\')) + strDir << wxT('\\'); + #endif +#endif + + return strDir; +} + +wxString wxFileConfig::GetGlobalFileName(const wxChar *szFile) +{ + wxString str = GetGlobalDir(); + str << szFile; + + if ( wxStrchr(szFile, wxT('.')) == NULL ) +#if defined( __WXMAC__ ) + str << wxT(" Preferences") ; +#elif defined( __UNIX__ ) + str << wxT(".conf"); +#else // Windows + str << wxT(".ini"); +#endif // UNIX/Win + + return str; +} + +wxString wxFileConfig::GetLocalFileName(const wxChar *szFile) +{ +#ifdef __VMS__ + // On VMS I saw the problem that the home directory was appended + // twice for the configuration file. Does that also happen for + // other platforms? + wxString str = wxT( '.' ); +#else + wxString str = GetLocalDir(); +#endif + +#if defined( __UNIX__ ) && !defined( __VMS ) && !defined( __WXMAC__ ) + str << wxT('.'); +#endif + + str << szFile; + +#if defined(__WINDOWS__) || defined(__DOS__) + if ( wxStrchr(szFile, wxT('.')) == NULL ) + str << wxT(".ini"); +#endif + +#ifdef __WXMAC__ + str << wxT(" Preferences") ; +#endif + + return str; +} + +// ---------------------------------------------------------------------------- +// ctor +// ---------------------------------------------------------------------------- + +void wxFileConfig::Init() +{ + m_pCurrentGroup = + m_pRootGroup = new wxFileConfigGroup(NULL, wxEmptyString, this); + + m_linesHead = + m_linesTail = NULL; + + // It's not an error if (one of the) file(s) doesn't exist. + + // parse the global file + if ( !m_strGlobalFile.empty() && wxFile::Exists(m_strGlobalFile) ) + { + wxTextFile fileGlobal(m_strGlobalFile); + + if ( fileGlobal.Open(*m_conv/*ignored in ANSI build*/) ) + { + Parse(fileGlobal, false /* global */); + SetRootPath(); + } + else + { + wxLogWarning(_("can't open global configuration file '%s'."), m_strGlobalFile.c_str()); + } + } + + // parse the local file + if ( !m_strLocalFile.empty() && wxFile::Exists(m_strLocalFile) ) + { + wxTextFile fileLocal(m_strLocalFile); + if ( fileLocal.Open(*m_conv/*ignored in ANSI build*/) ) + { + Parse(fileLocal, true /* local */); + SetRootPath(); + } + else + { + wxLogWarning(_("can't open user configuration file '%s'."), m_strLocalFile.c_str() ); + } + } + + m_isDirty = false; +} + +// constructor supports creation of wxFileConfig objects of any type +wxFileConfig::wxFileConfig(const wxString& appName, const wxString& vendorName, + const wxString& strLocal, const wxString& strGlobal, + long style, + const wxMBConv& conv) + : wxConfigBase(::GetAppName(appName), vendorName, + strLocal, strGlobal, + style), + m_strLocalFile(strLocal), m_strGlobalFile(strGlobal), + m_conv(conv.Clone()) +{ + // Make up names for files if empty + if ( m_strLocalFile.empty() && (style & wxCONFIG_USE_LOCAL_FILE) ) + { + m_strLocalFile = GetLocalFileName(GetAppName()); +#if defined(__UNIX__) && !defined(__VMS) + if ( style & wxCONFIG_USE_SUBDIR ) + m_strLocalFile << wxFILE_SEP_PATH << GetAppName() << _T(".conf"); +#endif + } + + if ( m_strGlobalFile.empty() && (style & wxCONFIG_USE_GLOBAL_FILE) ) + m_strGlobalFile = GetGlobalFileName(GetAppName()); + + // Check if styles are not supplied, but filenames are, in which case + // add the correct styles. + if ( !m_strLocalFile.empty() ) + SetStyle(GetStyle() | wxCONFIG_USE_LOCAL_FILE); + + if ( !m_strGlobalFile.empty() ) + SetStyle(GetStyle() | wxCONFIG_USE_GLOBAL_FILE); + + // if the path is not absolute, prepend the standard directory to it + // UNLESS wxCONFIG_USE_RELATIVE_PATH style is set + if ( !(style & wxCONFIG_USE_RELATIVE_PATH) ) + { + if ( !m_strLocalFile.empty() && !wxIsAbsolutePath(m_strLocalFile) ) + { + const wxString strLocalOrig = m_strLocalFile; + m_strLocalFile = GetLocalDir(); + m_strLocalFile << strLocalOrig; + } + + if ( !m_strGlobalFile.empty() && !wxIsAbsolutePath(m_strGlobalFile) ) + { + const wxString strGlobalOrig = m_strGlobalFile; + m_strGlobalFile = GetGlobalDir(); + m_strGlobalFile << strGlobalOrig; + } + } + + SetUmask(-1); + + Init(); +} + +#if wxUSE_STREAMS + +wxFileConfig::wxFileConfig(wxInputStream &inStream, const wxMBConv& conv) + : m_conv(conv.Clone()) +{ + // always local_file when this constructor is called (?) + SetStyle(GetStyle() | wxCONFIG_USE_LOCAL_FILE); + + m_pCurrentGroup = + m_pRootGroup = new wxFileConfigGroup(NULL, wxEmptyString, this); + + m_linesHead = + m_linesTail = NULL; + + // read the entire stream contents in memory + wxString str; + { + static const size_t chunkLen = 1024; + + wxMemoryBuffer buf(chunkLen); + do + { + inStream.Read(buf.GetAppendBuf(chunkLen), chunkLen); + buf.UngetAppendBuf(inStream.LastRead()); + + const wxStreamError err = inStream.GetLastError(); + + if ( err != wxSTREAM_NO_ERROR && err != wxSTREAM_EOF ) + { + wxLogError(_("Error reading config options.")); + break; + } + } + while ( !inStream.Eof() ); + +#if wxUSE_UNICODE + size_t len; + str = conv.cMB2WC((char *)buf.GetData(), buf.GetDataLen(), &len); + if ( !len && buf.GetDataLen() ) + { + wxLogError(_("Failed to read config options.")); + } +#else // !wxUSE_UNICODE + // no need for conversion + str.assign((char *)buf.GetData(), buf.GetDataLen()); +#endif // wxUSE_UNICODE/!wxUSE_UNICODE + } + + + // translate everything to the current (platform-dependent) line + // termination character + str = wxTextBuffer::Translate(str); + + wxMemoryText memText; + + // Now we can add the text to the memory text. To do this we extract line + // by line from the translated string, until we've reached the end. + // + // VZ: all this is horribly inefficient, we should do the translation on + // the fly in one pass saving both memory and time (TODO) + + const wxChar *pEOL = wxTextBuffer::GetEOL(wxTextBuffer::typeDefault); + const size_t EOLLen = wxStrlen(pEOL); + + int posLineStart = str.Find(pEOL); + while ( posLineStart != -1 ) + { + wxString line(str.Left(posLineStart)); + + memText.AddLine(line); + + str = str.Mid(posLineStart + EOLLen); + + posLineStart = str.Find(pEOL); + } + + // also add whatever we have left in the translated string. + if ( !str.empty() ) + memText.AddLine(str); + + // Finally we can parse it all. + Parse(memText, true /* local */); + + SetRootPath(); + ResetDirty(); +} + +#endif // wxUSE_STREAMS + +void wxFileConfig::CleanUp() +{ + delete m_pRootGroup; + + wxFileConfigLineList *pCur = m_linesHead; + while ( pCur != NULL ) { + wxFileConfigLineList *pNext = pCur->Next(); + delete pCur; + pCur = pNext; + } +} + +wxFileConfig::~wxFileConfig() +{ + Flush(); + + CleanUp(); + + delete m_conv; +} + +// ---------------------------------------------------------------------------- +// parse a config file +// ---------------------------------------------------------------------------- + +void wxFileConfig::Parse(const wxTextBuffer& buffer, bool bLocal) +{ + const wxChar *pStart; + const wxChar *pEnd; + wxString strLine; + + size_t nLineCount = buffer.GetLineCount(); + + for ( size_t n = 0; n < nLineCount; n++ ) + { + strLine = buffer[n]; + + // add the line to linked list + if ( bLocal ) + LineListAppend(strLine); + + + // skip leading spaces + for ( pStart = strLine; wxIsspace(*pStart); pStart++ ) + ; + + // skip blank/comment lines + if ( *pStart == wxT('\0')|| *pStart == wxT(';') || *pStart == wxT('#') ) + continue; + + if ( *pStart == wxT('[') ) { // a new group + pEnd = pStart; + + while ( *++pEnd != wxT(']') ) { + if ( *pEnd == wxT('\\') ) { + // the next char is escaped, so skip it even if it is ']' + pEnd++; + } + + if ( *pEnd == wxT('\n') || *pEnd == wxT('\0') ) { + // we reached the end of line, break out of the loop + break; + } + } + + if ( *pEnd != wxT(']') ) { + wxLogError(_("file '%s': unexpected character %c at line %d."), + buffer.GetName(), *pEnd, n + 1); + continue; // skip this line + } + + // group name here is always considered as abs path + wxString strGroup; + pStart++; + strGroup << wxCONFIG_PATH_SEPARATOR + << FilterInEntryName(wxString(pStart, pEnd - pStart)); + + // will create it if doesn't yet exist + SetPath(strGroup); + + if ( bLocal ) + { + if ( m_pCurrentGroup->Parent() ) + m_pCurrentGroup->Parent()->SetLastGroup(m_pCurrentGroup); + m_pCurrentGroup->SetLine(m_linesTail); + } + + // check that there is nothing except comments left on this line + bool bCont = true; + while ( *++pEnd != wxT('\0') && bCont ) { + switch ( *pEnd ) { + case wxT('#'): + case wxT(';'): + bCont = false; + break; + + case wxT(' '): + case wxT('\t'): + // ignore whitespace ('\n' impossible here) + break; + + default: + wxLogWarning(_("file '%s', line %d: '%s' ignored after group header."), + buffer.GetName(), n + 1, pEnd); + bCont = false; + } + } + } + else { // a key + pEnd = pStart; + while ( *pEnd && *pEnd != wxT('=') /* && !wxIsspace(*pEnd)*/ ) { + if ( *pEnd == wxT('\\') ) { + // next character may be space or not - still take it because it's + // quoted (unless there is nothing) + pEnd++; + if ( !*pEnd ) { + // the error message will be given below anyhow + break; + } + } + + pEnd++; + } + + wxString strKey(FilterInEntryName(wxString(pStart, pEnd).Trim())); + + // skip whitespace + while ( wxIsspace(*pEnd) ) + pEnd++; + + if ( *pEnd++ != wxT('=') ) { + wxLogError(_("file '%s', line %d: '=' expected."), + buffer.GetName(), n + 1); + } + else { + wxFileConfigEntry *pEntry = m_pCurrentGroup->FindEntry(strKey); + + if ( pEntry == NULL ) { + // new entry + pEntry = m_pCurrentGroup->AddEntry(strKey, n); + } + else { + if ( bLocal && pEntry->IsImmutable() ) { + // immutable keys can't be changed by user + wxLogWarning(_("file '%s', line %d: value for immutable key '%s' ignored."), + buffer.GetName(), n + 1, strKey.c_str()); + continue; + } + // the condition below catches the cases (a) and (b) but not (c): + // (a) global key found second time in global file + // (b) key found second (or more) time in local file + // (c) key from global file now found in local one + // which is exactly what we want. + else if ( !bLocal || pEntry->IsLocal() ) { + wxLogWarning(_("file '%s', line %d: key '%s' was first found at line %d."), + buffer.GetName(), n + 1, strKey.c_str(), pEntry->Line()); + + } + } + + if ( bLocal ) + pEntry->SetLine(m_linesTail); + + // skip whitespace + while ( wxIsspace(*pEnd) ) + pEnd++; + + wxString value = pEnd; + if ( !(GetStyle() & wxCONFIG_USE_NO_ESCAPE_CHARACTERS) ) + value = FilterInValue(value); + + pEntry->SetValue(value, false); + } + } + } +} + +// ---------------------------------------------------------------------------- +// set/retrieve path +// ---------------------------------------------------------------------------- + +void wxFileConfig::SetRootPath() +{ + m_strPath.Empty(); + m_pCurrentGroup = m_pRootGroup; +} + +bool +wxFileConfig::DoSetPath(const wxString& strPath, bool createMissingComponents) +{ + wxArrayString aParts; + + if ( strPath.empty() ) { + SetRootPath(); + return true; + } + + if ( strPath[0] == wxCONFIG_PATH_SEPARATOR ) { + // absolute path + wxSplitPath(aParts, strPath); + } + else { + // relative path, combine with current one + wxString strFullPath = m_strPath; + strFullPath << wxCONFIG_PATH_SEPARATOR << strPath; + wxSplitPath(aParts, strFullPath); + } + + // change current group + size_t n; + m_pCurrentGroup = m_pRootGroup; + for ( n = 0; n < aParts.Count(); n++ ) { + wxFileConfigGroup *pNextGroup = m_pCurrentGroup->FindSubgroup(aParts[n]); + if ( pNextGroup == NULL ) + { + if ( !createMissingComponents ) + return false; + + pNextGroup = m_pCurrentGroup->AddSubgroup(aParts[n]); + } + + m_pCurrentGroup = pNextGroup; + } + + // recombine path parts in one variable + m_strPath.Empty(); + for ( n = 0; n < aParts.Count(); n++ ) { + m_strPath << wxCONFIG_PATH_SEPARATOR << aParts[n]; + } + + return true; +} + +void wxFileConfig::SetPath(const wxString& strPath) +{ + DoSetPath(strPath, true /* create missing path components */); +} + +// ---------------------------------------------------------------------------- +// enumeration +// ---------------------------------------------------------------------------- + +bool wxFileConfig::GetFirstGroup(wxString& str, long& lIndex) const +{ + lIndex = 0; + return GetNextGroup(str, lIndex); +} + +bool wxFileConfig::GetNextGroup (wxString& str, long& lIndex) const +{ + if ( size_t(lIndex) < m_pCurrentGroup->Groups().Count() ) { + str = m_pCurrentGroup->Groups()[(size_t)lIndex++]->Name(); + return true; + } + else + return false; +} + +bool wxFileConfig::GetFirstEntry(wxString& str, long& lIndex) const +{ + lIndex = 0; + return GetNextEntry(str, lIndex); +} + +bool wxFileConfig::GetNextEntry (wxString& str, long& lIndex) const +{ + if ( size_t(lIndex) < m_pCurrentGroup->Entries().Count() ) { + str = m_pCurrentGroup->Entries()[(size_t)lIndex++]->Name(); + return true; + } + else + return false; +} + +size_t wxFileConfig::GetNumberOfEntries(bool bRecursive) const +{ + size_t n = m_pCurrentGroup->Entries().Count(); + if ( bRecursive ) { + wxFileConfigGroup *pOldCurrentGroup = m_pCurrentGroup; + size_t nSubgroups = m_pCurrentGroup->Groups().Count(); + for ( size_t nGroup = 0; nGroup < nSubgroups; nGroup++ ) { + CONST_CAST m_pCurrentGroup = m_pCurrentGroup->Groups()[nGroup]; + n += GetNumberOfEntries(true); + CONST_CAST m_pCurrentGroup = pOldCurrentGroup; + } + } + + return n; +} + +size_t wxFileConfig::GetNumberOfGroups(bool bRecursive) const +{ + size_t n = m_pCurrentGroup->Groups().Count(); + if ( bRecursive ) { + wxFileConfigGroup *pOldCurrentGroup = m_pCurrentGroup; + size_t nSubgroups = m_pCurrentGroup->Groups().Count(); + for ( size_t nGroup = 0; nGroup < nSubgroups; nGroup++ ) { + CONST_CAST m_pCurrentGroup = m_pCurrentGroup->Groups()[nGroup]; + n += GetNumberOfGroups(true); + CONST_CAST m_pCurrentGroup = pOldCurrentGroup; + } + } + + return n; +} + +// ---------------------------------------------------------------------------- +// tests for existence +// ---------------------------------------------------------------------------- + +bool wxFileConfig::HasGroup(const wxString& strName) const +{ + // special case: DoSetPath("") does work as it's equivalent to DoSetPath("/") + // but there is no group with empty name so treat this separately + if ( strName.empty() ) + return false; + + const wxString pathOld = GetPath(); + + wxFileConfig *self = wx_const_cast(wxFileConfig *, this); + const bool + rc = self->DoSetPath(strName, false /* don't create missing components */); + + self->SetPath(pathOld); + + return rc; +} + +bool wxFileConfig::HasEntry(const wxString& entry) const +{ + // path is the part before the last "/" + wxString path = entry.BeforeLast(wxCONFIG_PATH_SEPARATOR); + + // except in the special case of "/keyname" when there is nothing before "/" + if ( path.empty() && *entry.c_str() == wxCONFIG_PATH_SEPARATOR ) + { + path = wxCONFIG_PATH_SEPARATOR; + } + + // change to the path of the entry if necessary and remember the old path + // to restore it later + wxString pathOld; + wxFileConfig * const self = wx_const_cast(wxFileConfig *, this); + if ( !path.empty() ) + { + pathOld = GetPath(); + if ( pathOld.empty() ) + pathOld = wxCONFIG_PATH_SEPARATOR; + + if ( !self->DoSetPath(path, false /* don't create if doesn't exist */) ) + { + return false; + } + } + + // check if the entry exists in this group + const bool exists = m_pCurrentGroup->FindEntry( + entry.AfterLast(wxCONFIG_PATH_SEPARATOR)) != NULL; + + // restore the old path if we changed it above + if ( !pathOld.empty() ) + { + self->SetPath(pathOld); + } + + return exists; +} + +// ---------------------------------------------------------------------------- +// read/write values +// ---------------------------------------------------------------------------- + +bool wxFileConfig::DoReadString(const wxString& key, wxString* pStr) const +{ + wxConfigPathChanger path(this, key); + + wxFileConfigEntry *pEntry = m_pCurrentGroup->FindEntry(path.Name()); + if (pEntry == NULL) { + return false; + } + + *pStr = pEntry->Value(); + + return true; +} + +bool wxFileConfig::DoReadLong(const wxString& key, long *pl) const +{ + wxString str; + if ( !Read(key, &str) ) + return false; + + // extra spaces shouldn't prevent us from reading numeric values + str.Trim(); + + return str.ToLong(pl); +} + +bool wxFileConfig::DoWriteString(const wxString& key, const wxString& szValue) +{ + wxConfigPathChanger path(this, key); + wxString strName = path.Name(); + + wxLogTrace( FILECONF_TRACE_MASK, + _T(" Writing String '%s' = '%s' to Group '%s'"), + strName.c_str(), + szValue.c_str(), + GetPath().c_str() ); + + if ( strName.empty() ) + { + // setting the value of a group is an error + + wxASSERT_MSG( szValue.empty(), wxT("can't set value of a group!") ); + + // ... except if it's empty in which case it's a way to force it's creation + + wxLogTrace( FILECONF_TRACE_MASK, + _T(" Creating group %s"), + m_pCurrentGroup->Name().c_str() ); + + SetDirty(); + + // this will add a line for this group if it didn't have it before (or + // do nothing for the root but it's ok as it always exists anyhow) + (void)m_pCurrentGroup->GetGroupLine(); + } + else + { + // writing an entry check that the name is reasonable + if ( strName[0u] == wxCONFIG_IMMUTABLE_PREFIX ) + { + wxLogError( _("Config entry name cannot start with '%c'."), + wxCONFIG_IMMUTABLE_PREFIX); + return false; + } + + wxFileConfigEntry *pEntry = m_pCurrentGroup->FindEntry(strName); + + if ( pEntry == 0 ) + { + wxLogTrace( FILECONF_TRACE_MASK, + _T(" Adding Entry %s"), + strName.c_str() ); + pEntry = m_pCurrentGroup->AddEntry(strName); + } + + wxLogTrace( FILECONF_TRACE_MASK, + _T(" Setting value %s"), + szValue.c_str() ); + pEntry->SetValue(szValue); + + SetDirty(); + } + + return true; +} + +bool wxFileConfig::DoWriteLong(const wxString& key, long lValue) +{ + return Write(key, wxString::Format(_T("%ld"), lValue)); +} + +bool wxFileConfig::Flush(bool /* bCurrentOnly */) +{ + if ( !IsDirty() || !m_strLocalFile ) + return true; + + // set the umask if needed + wxCHANGE_UMASK(m_umask); + + wxTempFile file(m_strLocalFile); + + if ( !file.IsOpened() ) + { + wxLogError(_("can't open user configuration file.")); + return false; + } + + // write all strings to file + wxString filetext; + filetext.reserve(4096); + for ( wxFileConfigLineList *p = m_linesHead; p != NULL; p = p->Next() ) + { + filetext << p->Text() << wxTextFile::GetEOL(); + } + + if ( !file.Write(filetext, *m_conv) ) + { + wxLogError(_("can't write user configuration file.")); + return false; + } + + if ( !file.Commit() ) + { + wxLogError(_("Failed to update user configuration file.")); + + return false; + } + + ResetDirty(); + +#if defined(__WXMAC__) + wxFileName(m_strLocalFile).MacSetTypeAndCreator('TEXT', 'ttxt'); +#endif // __WXMAC__ + + return true; +} + +#if wxUSE_STREAMS + +bool wxFileConfig::Save(wxOutputStream& os, const wxMBConv& conv) +{ + // save unconditionally, even if not dirty + for ( wxFileConfigLineList *p = m_linesHead; p != NULL; p = p->Next() ) + { + wxString line = p->Text(); + line += wxTextFile::GetEOL(); + + wxCharBuffer buf(line.mb_str(conv)); + if ( !os.Write(buf, strlen(buf)) ) + { + wxLogError(_("Error saving user configuration data.")); + + return false; + } + } + + ResetDirty(); + + return true; +} + +#endif // wxUSE_STREAMS + +// ---------------------------------------------------------------------------- +// renaming groups/entries +// ---------------------------------------------------------------------------- + +bool wxFileConfig::RenameEntry(const wxString& oldName, + const wxString& newName) +{ + wxASSERT_MSG( !wxStrchr(oldName, wxCONFIG_PATH_SEPARATOR), + _T("RenameEntry(): paths are not supported") ); + + // check that the entry exists + wxFileConfigEntry *oldEntry = m_pCurrentGroup->FindEntry(oldName); + if ( !oldEntry ) + return false; + + // check that the new entry doesn't already exist + if ( m_pCurrentGroup->FindEntry(newName) ) + return false; + + // delete the old entry, create the new one + wxString value = oldEntry->Value(); + if ( !m_pCurrentGroup->DeleteEntry(oldName) ) + return false; + + SetDirty(); + + wxFileConfigEntry *newEntry = m_pCurrentGroup->AddEntry(newName); + newEntry->SetValue(value); + + return true; +} + +bool wxFileConfig::RenameGroup(const wxString& oldName, + const wxString& newName) +{ + // check that the group exists + wxFileConfigGroup *group = m_pCurrentGroup->FindSubgroup(oldName); + if ( !group ) + return false; + + // check that the new group doesn't already exist + if ( m_pCurrentGroup->FindSubgroup(newName) ) + return false; + + group->Rename(newName); + + SetDirty(); + + return true; +} + +// ---------------------------------------------------------------------------- +// delete groups/entries +// ---------------------------------------------------------------------------- + +bool wxFileConfig::DeleteEntry(const wxString& key, bool bGroupIfEmptyAlso) +{ + wxConfigPathChanger path(this, key); + + if ( !m_pCurrentGroup->DeleteEntry(path.Name()) ) + return false; + + SetDirty(); + + if ( bGroupIfEmptyAlso && m_pCurrentGroup->IsEmpty() ) { + if ( m_pCurrentGroup != m_pRootGroup ) { + wxFileConfigGroup *pGroup = m_pCurrentGroup; + SetPath(wxT("..")); // changes m_pCurrentGroup! + m_pCurrentGroup->DeleteSubgroupByName(pGroup->Name()); + } + //else: never delete the root group + } + + return true; +} + +bool wxFileConfig::DeleteGroup(const wxString& key) +{ + wxConfigPathChanger path(this, RemoveTrailingSeparator(key)); + + if ( !m_pCurrentGroup->DeleteSubgroupByName(path.Name()) ) + return false; + + path.UpdateIfDeleted(); + + SetDirty(); + + return true; +} + +bool wxFileConfig::DeleteAll() +{ + CleanUp(); + + if ( !m_strLocalFile.empty() ) + { + if ( wxFile::Exists(m_strLocalFile) && wxRemove(m_strLocalFile) == -1 ) + { + wxLogSysError(_("can't delete user configuration file '%s'"), + m_strLocalFile.c_str()); + return false; + } + } + + Init(); + + return true; +} + +// ---------------------------------------------------------------------------- +// linked list functions +// ---------------------------------------------------------------------------- + + // append a new line to the end of the list + +wxFileConfigLineList *wxFileConfig::LineListAppend(const wxString& str) +{ + wxLogTrace( FILECONF_TRACE_MASK, + _T(" ** Adding Line '%s'"), + str.c_str() ); + wxLogTrace( FILECONF_TRACE_MASK, + _T(" head: %s"), + ((m_linesHead) ? m_linesHead->Text().c_str() : wxEmptyString) ); + wxLogTrace( FILECONF_TRACE_MASK, + _T(" tail: %s"), + ((m_linesTail) ? m_linesTail->Text().c_str() : wxEmptyString) ); + + wxFileConfigLineList *pLine = new wxFileConfigLineList(str); + + if ( m_linesTail == NULL ) + { + // list is empty + m_linesHead = pLine; + } + else + { + // adjust pointers + m_linesTail->SetNext(pLine); + pLine->SetPrev(m_linesTail); + } + + m_linesTail = pLine; + + wxLogTrace( FILECONF_TRACE_MASK, + _T(" head: %s"), + ((m_linesHead) ? m_linesHead->Text().c_str() : wxEmptyString) ); + wxLogTrace( FILECONF_TRACE_MASK, + _T(" tail: %s"), + ((m_linesTail) ? m_linesTail->Text().c_str() : wxEmptyString) ); + + return m_linesTail; +} + +// insert a new line after the given one or in the very beginning if !pLine +wxFileConfigLineList *wxFileConfig::LineListInsert(const wxString& str, + wxFileConfigLineList *pLine) +{ + wxLogTrace( FILECONF_TRACE_MASK, + _T(" ** Inserting Line '%s' after '%s'"), + str.c_str(), + ((pLine) ? pLine->Text().c_str() : wxEmptyString) ); + wxLogTrace( FILECONF_TRACE_MASK, + _T(" head: %s"), + ((m_linesHead) ? m_linesHead->Text().c_str() : wxEmptyString) ); + wxLogTrace( FILECONF_TRACE_MASK, + _T(" tail: %s"), + ((m_linesTail) ? m_linesTail->Text().c_str() : wxEmptyString) ); + + if ( pLine == m_linesTail ) + return LineListAppend(str); + + wxFileConfigLineList *pNewLine = new wxFileConfigLineList(str); + if ( pLine == NULL ) + { + // prepend to the list + pNewLine->SetNext(m_linesHead); + m_linesHead->SetPrev(pNewLine); + m_linesHead = pNewLine; + } + else + { + // insert before pLine + wxFileConfigLineList *pNext = pLine->Next(); + pNewLine->SetNext(pNext); + pNewLine->SetPrev(pLine); + pNext->SetPrev(pNewLine); + pLine->SetNext(pNewLine); + } + + wxLogTrace( FILECONF_TRACE_MASK, + _T(" head: %s"), + ((m_linesHead) ? m_linesHead->Text().c_str() : wxEmptyString) ); + wxLogTrace( FILECONF_TRACE_MASK, + _T(" tail: %s"), + ((m_linesTail) ? m_linesTail->Text().c_str() : wxEmptyString) ); + + return pNewLine; +} + +void wxFileConfig::LineListRemove(wxFileConfigLineList *pLine) +{ + wxLogTrace( FILECONF_TRACE_MASK, + _T(" ** Removing Line '%s'"), + pLine->Text().c_str() ); + wxLogTrace( FILECONF_TRACE_MASK, + _T(" head: %s"), + ((m_linesHead) ? m_linesHead->Text().c_str() : wxEmptyString) ); + wxLogTrace( FILECONF_TRACE_MASK, + _T(" tail: %s"), + ((m_linesTail) ? m_linesTail->Text().c_str() : wxEmptyString) ); + + wxFileConfigLineList *pPrev = pLine->Prev(), + *pNext = pLine->Next(); + + // first entry? + + if ( pPrev == NULL ) + m_linesHead = pNext; + else + pPrev->SetNext(pNext); + + // last entry? + + if ( pNext == NULL ) + m_linesTail = pPrev; + else + pNext->SetPrev(pPrev); + + if ( m_pRootGroup->GetGroupLine() == pLine ) + m_pRootGroup->SetLine(m_linesHead); + + wxLogTrace( FILECONF_TRACE_MASK, + _T(" head: %s"), + ((m_linesHead) ? m_linesHead->Text().c_str() : wxEmptyString) ); + wxLogTrace( FILECONF_TRACE_MASK, + _T(" tail: %s"), + ((m_linesTail) ? m_linesTail->Text().c_str() : wxEmptyString) ); + + delete pLine; +} + +bool wxFileConfig::LineListIsEmpty() +{ + return m_linesHead == NULL; +} + +// ============================================================================ +// wxFileConfig::wxFileConfigGroup +// ============================================================================ + +// ---------------------------------------------------------------------------- +// ctor/dtor +// ---------------------------------------------------------------------------- + +// ctor +wxFileConfigGroup::wxFileConfigGroup(wxFileConfigGroup *pParent, + const wxString& strName, + wxFileConfig *pConfig) + : m_aEntries(CompareEntries), + m_aSubgroups(CompareGroups), + m_strName(strName) +{ + m_pConfig = pConfig; + m_pParent = pParent; + m_pLine = NULL; + + m_pLastEntry = NULL; + m_pLastGroup = NULL; +} + +// dtor deletes all children +wxFileConfigGroup::~wxFileConfigGroup() +{ + // entries + size_t n, nCount = m_aEntries.Count(); + for ( n = 0; n < nCount; n++ ) + delete m_aEntries[n]; + + // subgroups + nCount = m_aSubgroups.Count(); + for ( n = 0; n < nCount; n++ ) + delete m_aSubgroups[n]; +} + +// ---------------------------------------------------------------------------- +// line +// ---------------------------------------------------------------------------- + +void wxFileConfigGroup::SetLine(wxFileConfigLineList *pLine) +{ + // for a normal (i.e. not root) group this method shouldn't be called twice + // unless we are resetting the line + wxASSERT_MSG( !m_pParent || !m_pLine || !pLine, + _T("changing line for a non-root group?") ); + + m_pLine = pLine; +} + +/* + This is a bit complicated, so let me explain it in details. All lines that + were read from the local file (the only one we will ever modify) are stored + in a (doubly) linked list. Our problem is to know at which position in this + list should we insert the new entries/subgroups. To solve it we keep three + variables for each group: m_pLine, m_pLastEntry and m_pLastGroup. + + m_pLine points to the line containing "[group_name]" + m_pLastEntry points to the last entry of this group in the local file. + m_pLastGroup subgroup + + Initially, they're NULL all three. When the group (an entry/subgroup) is read + from the local file, the corresponding variable is set. However, if the group + was read from the global file and then modified or created by the application + these variables are still NULL and we need to create the corresponding lines. + See the following functions (and comments preceding them) for the details of + how we do it. + + Also, when our last entry/group are deleted we need to find the new last + element - the code in DeleteEntry/Subgroup does this by backtracking the list + of lines until it either founds an entry/subgroup (and this is the new last + element) or the m_pLine of the group, in which case there are no more entries + (or subgroups) left and m_pLast becomes NULL. + + NB: This last problem could be avoided for entries if we added new entries + immediately after m_pLine, but in this case the entries would appear + backwards in the config file (OTOH, it's not that important) and as we + would still need to do it for the subgroups the code wouldn't have been + significantly less complicated. +*/ + +// Return the line which contains "[our name]". If we're still not in the list, +// add our line to it immediately after the last line of our parent group if we +// have it or in the very beginning if we're the root group. +wxFileConfigLineList *wxFileConfigGroup::GetGroupLine() +{ + wxLogTrace( FILECONF_TRACE_MASK, + _T(" GetGroupLine() for Group '%s'"), + Name().c_str() ); + + if ( !m_pLine ) + { + wxLogTrace( FILECONF_TRACE_MASK, + _T(" Getting Line item pointer") ); + + wxFileConfigGroup *pParent = Parent(); + + // this group wasn't present in local config file, add it now + if ( pParent ) + { + wxLogTrace( FILECONF_TRACE_MASK, + _T(" checking parent '%s'"), + pParent->Name().c_str() ); + + wxString strFullName; + + // add 1 to the name because we don't want to start with '/' + strFullName << wxT("[") + << FilterOutEntryName(GetFullName().c_str() + 1) + << wxT("]"); + m_pLine = m_pConfig->LineListInsert(strFullName, + pParent->GetLastGroupLine()); + pParent->SetLastGroup(this); // we're surely after all the others + } + //else: this is the root group and so we return NULL because we don't + // have any group line + } + + return m_pLine; +} + +// Return the last line belonging to the subgroups of this group (after which +// we can add a new subgroup), if we don't have any subgroups or entries our +// last line is the group line (m_pLine) itself. +wxFileConfigLineList *wxFileConfigGroup::GetLastGroupLine() +{ + // if we have any subgroups, our last line is the last line of the last + // subgroup + if ( m_pLastGroup ) + { + wxFileConfigLineList *pLine = m_pLastGroup->GetLastGroupLine(); + + wxASSERT_MSG( pLine, _T("last group must have !NULL associated line") ); + + return pLine; + } + + // no subgroups, so the last line is the line of thelast entry (if any) + return GetLastEntryLine(); +} + +// return the last line belonging to the entries of this group (after which +// we can add a new entry), if we don't have any entries we will add the new +// one immediately after the group line itself. +wxFileConfigLineList *wxFileConfigGroup::GetLastEntryLine() +{ + wxLogTrace( FILECONF_TRACE_MASK, + _T(" GetLastEntryLine() for Group '%s'"), + Name().c_str() ); + + if ( m_pLastEntry ) + { + wxFileConfigLineList *pLine = m_pLastEntry->GetLine(); + + wxASSERT_MSG( pLine, _T("last entry must have !NULL associated line") ); + + return pLine; + } + + // no entries: insert after the group header, if any + return GetGroupLine(); +} + +void wxFileConfigGroup::SetLastEntry(wxFileConfigEntry *pEntry) +{ + m_pLastEntry = pEntry; + + if ( !m_pLine ) + { + // the only situation in which a group without its own line can have + // an entry is when the first entry is added to the initially empty + // root pseudo-group + wxASSERT_MSG( !m_pParent, _T("unexpected for non root group") ); + + // let the group know that it does have a line in the file now + m_pLine = pEntry->GetLine(); + } +} + +// ---------------------------------------------------------------------------- +// group name +// ---------------------------------------------------------------------------- + +void wxFileConfigGroup::UpdateGroupAndSubgroupsLines() +{ + // update the line of this group + wxFileConfigLineList *line = GetGroupLine(); + wxCHECK_RET( line, _T("a non root group must have a corresponding line!") ); + + // +1: skip the leading '/' + line->SetText(wxString::Format(_T("[%s]"), GetFullName().c_str() + 1)); + + + // also update all subgroups as they have this groups name in their lines + const size_t nCount = m_aSubgroups.Count(); + for ( size_t n = 0; n < nCount; n++ ) + { + m_aSubgroups[n]->UpdateGroupAndSubgroupsLines(); + } +} + +void wxFileConfigGroup::Rename(const wxString& newName) +{ + wxCHECK_RET( m_pParent, _T("the root group can't be renamed") ); + + if ( newName == m_strName ) + return; + + // we need to remove the group from the parent and it back under the new + // name to keep the parents array of subgroups alphabetically sorted + m_pParent->m_aSubgroups.Remove(this); + + m_strName = newName; + + m_pParent->m_aSubgroups.Add(this); + + // update the group lines recursively + UpdateGroupAndSubgroupsLines(); +} + +wxString wxFileConfigGroup::GetFullName() const +{ + wxString fullname; + if ( Parent() ) + fullname = Parent()->GetFullName() + wxCONFIG_PATH_SEPARATOR + Name(); + + return fullname; +} + +// ---------------------------------------------------------------------------- +// find an item +// ---------------------------------------------------------------------------- + +// use binary search because the array is sorted +wxFileConfigEntry * +wxFileConfigGroup::FindEntry(const wxChar *szName) const +{ + size_t i, + lo = 0, + hi = m_aEntries.Count(); + int res; + wxFileConfigEntry *pEntry; + + while ( lo < hi ) { + i = (lo + hi)/2; + pEntry = m_aEntries[i]; + + #if wxCONFIG_CASE_SENSITIVE + res = wxStrcmp(pEntry->Name(), szName); + #else + res = wxStricmp(pEntry->Name(), szName); + #endif + + if ( res > 0 ) + hi = i; + else if ( res < 0 ) + lo = i + 1; + else + return pEntry; + } + + return NULL; +} + +wxFileConfigGroup * +wxFileConfigGroup::FindSubgroup(const wxChar *szName) const +{ + size_t i, + lo = 0, + hi = m_aSubgroups.Count(); + int res; + wxFileConfigGroup *pGroup; + + while ( lo < hi ) { + i = (lo + hi)/2; + pGroup = m_aSubgroups[i]; + + #if wxCONFIG_CASE_SENSITIVE + res = wxStrcmp(pGroup->Name(), szName); + #else + res = wxStricmp(pGroup->Name(), szName); + #endif + + if ( res > 0 ) + hi = i; + else if ( res < 0 ) + lo = i + 1; + else + return pGroup; + } + + return NULL; +} + +// ---------------------------------------------------------------------------- +// create a new item +// ---------------------------------------------------------------------------- + +// create a new entry and add it to the current group +wxFileConfigEntry *wxFileConfigGroup::AddEntry(const wxString& strName, int nLine) +{ + wxASSERT( FindEntry(strName) == 0 ); + + wxFileConfigEntry *pEntry = new wxFileConfigEntry(this, strName, nLine); + + m_aEntries.Add(pEntry); + return pEntry; +} + +// create a new group and add it to the current group +wxFileConfigGroup *wxFileConfigGroup::AddSubgroup(const wxString& strName) +{ + wxASSERT( FindSubgroup(strName) == 0 ); + + wxFileConfigGroup *pGroup = new wxFileConfigGroup(this, strName, m_pConfig); + + m_aSubgroups.Add(pGroup); + return pGroup; +} + +// ---------------------------------------------------------------------------- +// delete an item +// ---------------------------------------------------------------------------- + +/* + The delete operations are _very_ slow if we delete the last item of this + group (see comments before GetXXXLineXXX functions for more details), + so it's much better to start with the first entry/group if we want to + delete several of them. + */ + +bool wxFileConfigGroup::DeleteSubgroupByName(const wxChar *szName) +{ + wxFileConfigGroup * const pGroup = FindSubgroup(szName); + + return pGroup ? DeleteSubgroup(pGroup) : false; +} + +// Delete the subgroup and remove all references to it from +// other data structures. +bool wxFileConfigGroup::DeleteSubgroup(wxFileConfigGroup *pGroup) +{ + wxCHECK_MSG( pGroup, false, _T("deleting non existing group?") ); + + wxLogTrace( FILECONF_TRACE_MASK, + _T("Deleting group '%s' from '%s'"), + pGroup->Name().c_str(), + Name().c_str() ); + + wxLogTrace( FILECONF_TRACE_MASK, + _T(" (m_pLine) = prev: %p, this %p, next %p"), + m_pLine ? wx_static_cast(void*, m_pLine->Prev()) : 0, + wx_static_cast(void*, m_pLine), + m_pLine ? wx_static_cast(void*, m_pLine->Next()) : 0 ); + wxLogTrace( FILECONF_TRACE_MASK, + _T(" text: '%s'"), + m_pLine ? m_pLine->Text().c_str() : wxEmptyString ); + + // delete all entries... + size_t nCount = pGroup->m_aEntries.Count(); + + wxLogTrace(FILECONF_TRACE_MASK, + _T("Removing %lu entries"), (unsigned long)nCount ); + + for ( size_t nEntry = 0; nEntry < nCount; nEntry++ ) + { + wxFileConfigLineList *pLine = pGroup->m_aEntries[nEntry]->GetLine(); + + if ( pLine ) + { + wxLogTrace( FILECONF_TRACE_MASK, + _T(" '%s'"), + pLine->Text().c_str() ); + m_pConfig->LineListRemove(pLine); + } + } + + // ...and subgroups of this subgroup + nCount = pGroup->m_aSubgroups.Count(); + + wxLogTrace( FILECONF_TRACE_MASK, + _T("Removing %lu subgroups"), (unsigned long)nCount ); + + for ( size_t nGroup = 0; nGroup < nCount; nGroup++ ) + { + pGroup->DeleteSubgroup(pGroup->m_aSubgroups[0]); + } + + // and then finally the group itself + wxFileConfigLineList *pLine = pGroup->m_pLine; + if ( pLine ) + { + wxLogTrace( FILECONF_TRACE_MASK, + _T(" Removing line for group '%s' : '%s'"), + pGroup->Name().c_str(), + pLine->Text().c_str() ); + wxLogTrace( FILECONF_TRACE_MASK, + _T(" Removing from group '%s' : '%s'"), + Name().c_str(), + ((m_pLine) ? m_pLine->Text().c_str() : wxEmptyString) ); + + // notice that we may do this test inside the previous "if" + // because the last entry's line is surely !NULL + if ( pGroup == m_pLastGroup ) + { + wxLogTrace( FILECONF_TRACE_MASK, + _T(" Removing last group") ); + + // our last entry is being deleted, so find the last one which + // stays by going back until we find a subgroup or reach the + // group line + const size_t nSubgroups = m_aSubgroups.Count(); + + m_pLastGroup = NULL; + for ( wxFileConfigLineList *pl = pLine->Prev(); + pl && !m_pLastGroup; + pl = pl->Prev() ) + { + // does this line belong to our subgroup? + for ( size_t n = 0; n < nSubgroups; n++ ) + { + // do _not_ call GetGroupLine! we don't want to add it to + // the local file if it's not already there + if ( m_aSubgroups[n]->m_pLine == pl ) + { + m_pLastGroup = m_aSubgroups[n]; + break; + } + } + + if ( pl == m_pLine ) + break; + } + } + + m_pConfig->LineListRemove(pLine); + } + else + { + wxLogTrace( FILECONF_TRACE_MASK, + _T(" No line entry for Group '%s'?"), + pGroup->Name().c_str() ); + } + + m_aSubgroups.Remove(pGroup); + delete pGroup; + + return true; +} + +bool wxFileConfigGroup::DeleteEntry(const wxChar *szName) +{ + wxFileConfigEntry *pEntry = FindEntry(szName); + if ( !pEntry ) + { + // entry doesn't exist, nothing to do + return false; + } + + wxFileConfigLineList *pLine = pEntry->GetLine(); + if ( pLine != NULL ) { + // notice that we may do this test inside the previous "if" because the + // last entry's line is surely !NULL + if ( pEntry == m_pLastEntry ) { + // our last entry is being deleted - find the last one which stays + wxASSERT( m_pLine != NULL ); // if we have an entry with !NULL pLine... + + // find the previous entry (if any) + wxFileConfigEntry *pNewLast = NULL; + const wxFileConfigLineList * const + pNewLastLine = m_pLastEntry->GetLine()->Prev(); + const size_t nEntries = m_aEntries.GetCount(); + for ( size_t n = 0; n < nEntries; n++ ) { + if ( m_aEntries[n]->GetLine() == pNewLastLine ) { + pNewLast = m_aEntries[n]; + break; + } + } + + // pNewLast can be NULL here -- it's ok and can happen if we have no + // entries left + m_pLastEntry = pNewLast; + } + + m_pConfig->LineListRemove(pLine); + } + + m_aEntries.Remove(pEntry); + delete pEntry; + + return true; +} + +// ============================================================================ +// wxFileConfig::wxFileConfigEntry +// ============================================================================ + +// ---------------------------------------------------------------------------- +// ctor +// ---------------------------------------------------------------------------- +wxFileConfigEntry::wxFileConfigEntry(wxFileConfigGroup *pParent, + const wxString& strName, + int nLine) + : m_strName(strName) +{ + wxASSERT( !strName.empty() ); + + m_pParent = pParent; + m_nLine = nLine; + m_pLine = NULL; + + m_bHasValue = false; + + m_bImmutable = strName[0] == wxCONFIG_IMMUTABLE_PREFIX; + if ( m_bImmutable ) + m_strName.erase(0, 1); // remove first character +} + +// ---------------------------------------------------------------------------- +// set value +// ---------------------------------------------------------------------------- + +void wxFileConfigEntry::SetLine(wxFileConfigLineList *pLine) +{ + if ( m_pLine != NULL ) { + wxLogWarning(_("entry '%s' appears more than once in group '%s'"), + Name().c_str(), m_pParent->GetFullName().c_str()); + } + + m_pLine = pLine; + Group()->SetLastEntry(this); +} + +// second parameter is false if we read the value from file and prevents the +// entry from being marked as 'dirty' +void wxFileConfigEntry::SetValue(const wxString& strValue, bool bUser) +{ + if ( bUser && IsImmutable() ) + { + wxLogWarning( _("attempt to change immutable key '%s' ignored."), + Name().c_str()); + return; + } + + // do nothing if it's the same value: but don't test for it if m_bHasValue + // hadn't been set yet or we'd never write empty values to the file + if ( m_bHasValue && strValue == m_strValue ) + return; + + m_bHasValue = true; + m_strValue = strValue; + + if ( bUser ) + { + wxString strValFiltered; + + if ( Group()->Config()->GetStyle() & wxCONFIG_USE_NO_ESCAPE_CHARACTERS ) + { + strValFiltered = strValue; + } + else { + strValFiltered = FilterOutValue(strValue); + } + + wxString strLine; + strLine << FilterOutEntryName(m_strName) << wxT('=') << strValFiltered; + + if ( m_pLine ) + { + // entry was read from the local config file, just modify the line + m_pLine->SetText(strLine); + } + else // this entry didn't exist in the local file + { + // add a new line to the file: note that line returned by + // GetLastEntryLine() may be NULL if we're in the root group and it + // doesn't have any entries yet, but this is ok as passing NULL + // line to LineListInsert() means to prepend new line to the list + wxFileConfigLineList *line = Group()->GetLastEntryLine(); + m_pLine = Group()->Config()->LineListInsert(strLine, line); + + Group()->SetLastEntry(this); + } + } +} + +// ============================================================================ +// global functions +// ============================================================================ + +// ---------------------------------------------------------------------------- +// compare functions for array sorting +// ---------------------------------------------------------------------------- + +int CompareEntries(wxFileConfigEntry *p1, wxFileConfigEntry *p2) +{ +#if wxCONFIG_CASE_SENSITIVE + return wxStrcmp(p1->Name(), p2->Name()); +#else + return wxStricmp(p1->Name(), p2->Name()); +#endif +} + +int CompareGroups(wxFileConfigGroup *p1, wxFileConfigGroup *p2) +{ +#if wxCONFIG_CASE_SENSITIVE + return wxStrcmp(p1->Name(), p2->Name()); +#else + return wxStricmp(p1->Name(), p2->Name()); +#endif +} + +// ---------------------------------------------------------------------------- +// filter functions +// ---------------------------------------------------------------------------- + +// undo FilterOutValue +static wxString FilterInValue(const wxString& str) +{ + wxString strResult; + strResult.Alloc(str.Len()); + + bool bQuoted = !str.empty() && str[0] == '"'; + + for ( size_t n = bQuoted ? 1 : 0; n < str.Len(); n++ ) { + if ( str[n] == wxT('\\') ) { + switch ( str[++n] ) { + case wxT('n'): + strResult += wxT('\n'); + break; + + case wxT('r'): + strResult += wxT('\r'); + break; + + case wxT('t'): + strResult += wxT('\t'); + break; + + case wxT('\\'): + strResult += wxT('\\'); + break; + + case wxT('"'): + strResult += wxT('"'); + break; + } + } + else { + if ( str[n] != wxT('"') || !bQuoted ) + strResult += str[n]; + else if ( n != str.Len() - 1 ) { + wxLogWarning(_("unexpected \" at position %d in '%s'."), + n, str.c_str()); + } + //else: it's the last quote of a quoted string, ok + } + } + + return strResult; +} + +// quote the string before writing it to file +static wxString FilterOutValue(const wxString& str) +{ + if ( !str ) + return str; + + wxString strResult; + strResult.Alloc(str.Len()); + + // quoting is necessary to preserve spaces in the beginning of the string + bool bQuote = wxIsspace(str[0]) || str[0] == wxT('"'); + + if ( bQuote ) + strResult += wxT('"'); + + wxChar c; + for ( size_t n = 0; n < str.Len(); n++ ) { + switch ( str[n] ) { + case wxT('\n'): + c = wxT('n'); + break; + + case wxT('\r'): + c = wxT('r'); + break; + + case wxT('\t'): + c = wxT('t'); + break; + + case wxT('\\'): + c = wxT('\\'); + break; + + case wxT('"'): + if ( bQuote ) { + c = wxT('"'); + break; + } + //else: fall through + + default: + strResult += str[n]; + continue; // nothing special to do + } + + // we get here only for special characters + strResult << wxT('\\') << c; + } + + if ( bQuote ) + strResult += wxT('"'); + + return strResult; +} + +// undo FilterOutEntryName +static wxString FilterInEntryName(const wxString& str) +{ + wxString strResult; + strResult.Alloc(str.Len()); + + for ( const wxChar *pc = str.c_str(); *pc != '\0'; pc++ ) { + if ( *pc == wxT('\\') ) { + // we need to test it here or we'd skip past the NUL in the loop line + if ( *++pc == _T('\0') ) + break; + } + + strResult += *pc; + } + + return strResult; +} + +// sanitize entry or group name: insert '\\' before any special characters +static wxString FilterOutEntryName(const wxString& str) +{ + wxString strResult; + strResult.Alloc(str.Len()); + + for ( const wxChar *pc = str.c_str(); *pc != wxT('\0'); pc++ ) { + const wxChar c = *pc; + + // we explicitly allow some of "safe" chars and 8bit ASCII characters + // which will probably never have special meaning and with which we can't + // use isalnum() anyhow (in ASCII built, in Unicode it's just fine) + // + // NB: note that wxCONFIG_IMMUTABLE_PREFIX and wxCONFIG_PATH_SEPARATOR + // should *not* be quoted + if ( +#if !wxUSE_UNICODE + ((unsigned char)c < 127) && +#endif // ANSI + !wxIsalnum(c) && !wxStrchr(wxT("@_/-!.*%"), c) ) + { + strResult += wxT('\\'); + } + + strResult += c; + } + + return strResult; +} + +// we can't put ?: in the ctor initializer list because it confuses some +// broken compilers (Borland C++) +static wxString GetAppName(const wxString& appName) +{ + if ( !appName && wxTheApp ) + return wxTheApp->GetAppName(); + else + return appName; +} + +#endif // wxUSE_CONFIG diff --git a/Externals/wxWidgets/src/common/filefn.cpp b/Externals/wxWidgets/src/common/filefn.cpp new file mode 100644 index 0000000000..fc40d747e9 --- /dev/null +++ b/Externals/wxWidgets/src/common/filefn.cpp @@ -0,0 +1,2108 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/filefn.cpp +// Purpose: File- and directory-related functions +// Author: Julian Smart +// Modified by: +// Created: 29/01/98 +// RCS-ID: $Id: filefn.cpp 48334 2007-08-22 14:55:07Z JS $ +// Copyright: (c) 1998 Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#include "wx/filefn.h" + +#ifndef WX_PRECOMP + #include "wx/intl.h" + #include "wx/log.h" + #include "wx/utils.h" +#endif + +#include "wx/file.h" +#include "wx/filename.h" +#include "wx/dir.h" + +#include "wx/tokenzr.h" + +// there are just too many of those... +#ifdef __VISUALC__ + #pragma warning(disable:4706) // assignment within conditional expression +#endif // VC++ + +#include +#include +#include +#include +#if !wxONLY_WATCOM_EARLIER_THAN(1,4) + #if !(defined(_MSC_VER) && (_MSC_VER > 800)) + #include + #endif +#endif + +#if defined(__WXMAC__) + #include "wx/mac/private.h" // includes mac headers +#endif + +#ifdef __WINDOWS__ + #include "wx/msw/private.h" + #include "wx/msw/mslu.h" + + // sys/cygwin.h is needed for cygwin_conv_to_full_win32_path() + // + // note that it must be included after + #ifdef __GNUWIN32__ + #ifdef __CYGWIN__ + #include + #endif + #endif // __GNUWIN32__ + + // io.h is needed for _get_osfhandle() + // Already included by filefn.h for many Windows compilers + #if defined __MWERKS__ || defined __CYGWIN__ + #include + #endif +#endif // __WINDOWS__ + +#if defined(__VMS__) + #include +#endif + +// TODO: Borland probably has _wgetcwd as well? +#ifdef _MSC_VER + #define HAVE_WGETCWD +#endif + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +#ifndef _MAXPATHLEN + #define _MAXPATHLEN 1024 +#endif + +#ifdef __WXMAC__ +# include "MoreFilesX.h" +#endif + +// ---------------------------------------------------------------------------- +// private globals +// ---------------------------------------------------------------------------- + +// MT-FIXME: get rid of this horror and all code using it +static wxChar wxFileFunctionsBuffer[4*_MAXPATHLEN]; + +#if defined(__VISAGECPP__) && __IBMCPP__ >= 400 +// +// VisualAge C++ V4.0 cannot have any external linkage const decs +// in headers included by more than one primary source +// +const int wxInvalidOffset = -1; +#endif + +// ---------------------------------------------------------------------------- +// macros +// ---------------------------------------------------------------------------- + +// translate the filenames before passing them to OS functions +#define OS_FILENAME(s) (s.fn_str()) + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wrappers around standard POSIX functions +// ---------------------------------------------------------------------------- + +#ifdef wxNEED_WX_UNISTD_H + +WXDLLEXPORT int wxStat( const wxChar *file_name, wxStructStat *buf ) +{ + return stat( wxConvFile.cWX2MB( file_name ), buf ); +} + +WXDLLEXPORT int wxLstat( const wxChar *file_name, wxStructStat *buf ) +{ + return lstat( wxConvFile.cWX2MB( file_name ), buf ); +} + +WXDLLEXPORT int wxAccess( const wxChar *pathname, int mode ) +{ + return access( wxConvFile.cWX2MB( pathname ), mode ); +} + +WXDLLEXPORT int wxOpen( const wxChar *pathname, int flags, mode_t mode ) +{ + return open( wxConvFile.cWX2MB( pathname ), flags, mode ); +} + +#endif // wxNEED_WX_UNISTD_H + +#if wxUSE_UNICODE && defined __BORLANDC__ \ + && __BORLANDC__ >= 0x550 && __BORLANDC__ <= 0x551 + +// BCC 5.5 and 5.5.1 have a bug in _wopen where files are created read only +// regardless of the mode parameter. This hack works around the problem by +// setting the mode with _wchmod. +// +int wxOpen(const wchar_t *pathname, int flags, mode_t mode) +{ + int moreflags = 0; + + // we only want to fix the mode when the file is actually created, so + // when creating first try doing it O_EXCL so we can tell if the file + // was already there. + if ((flags & O_CREAT) && !(flags & O_EXCL) && (mode & wxS_IWUSR) != 0) + moreflags = O_EXCL; + + int fd = _wopen(pathname, flags | moreflags, mode); + + // the file was actually created and needs fixing + if (fd != -1 && (flags & O_CREAT) != 0 && (mode & wxS_IWUSR) != 0) + { + close(fd); + _wchmod(pathname, mode); + fd = _wopen(pathname, flags & ~(O_EXCL | O_CREAT)); + } + // the open failed, but it may have been because the added O_EXCL stopped + // the opening of an existing file, so try again without. + else if (fd == -1 && moreflags != 0) + { + fd = _wopen(pathname, flags & ~O_CREAT); + } + + return fd; +} + +#endif + +// ---------------------------------------------------------------------------- +// wxPathList +// ---------------------------------------------------------------------------- + +bool wxPathList::Add(const wxString& path) +{ + // add a path separator to force wxFileName to interpret it always as a directory + // (i.e. if we are called with '/home/user' we want to consider it a folder and + // not, as wxFileName would consider, a filename). + wxFileName fn(path + wxFileName::GetPathSeparator()); + + // add only normalized relative/absolute paths + // NB: we won't do wxPATH_NORM_DOTS in order to avoid problems when trying to + // normalize paths which starts with ".." (which can be normalized only if + // we use also wxPATH_NORM_ABSOLUTE - which we don't want to use). + if (!fn.Normalize(wxPATH_NORM_TILDE|wxPATH_NORM_LONG|wxPATH_NORM_ENV_VARS)) + return false; + + wxString toadd = fn.GetPath(); + if (Index(toadd) == wxNOT_FOUND) + wxArrayString::Add(toadd); // do not add duplicates + + return true; +} + +void wxPathList::Add(const wxArrayString &arr) +{ + for (size_t j=0; j < arr.GetCount(); j++) + Add(arr[j]); +} + +// Add paths e.g. from the PATH environment variable +void wxPathList::AddEnvList (const wxString& WXUNUSED_IN_WINCE(envVariable)) +{ + // No environment variables on WinCE +#ifndef __WXWINCE__ + + // The space has been removed from the tokenizers, otherwise a + // path such as "C:\Program Files" would be split into 2 paths: + // "C:\Program" and "Files"; this is true for both Windows and Unix. + + static const wxChar PATH_TOKS[] = +#if defined(__WINDOWS__) || defined(__OS2__) + wxT(";"); // Don't separate with colon in DOS (used for drive) +#else + wxT(":;"); +#endif + + wxString val; + if ( wxGetEnv(envVariable, &val) ) + { + // split into an array of string the value of the env var + wxArrayString arr = wxStringTokenize(val, PATH_TOKS); + WX_APPEND_ARRAY(*this, arr); + } +#endif // !__WXWINCE__ +} + +// Given a full filename (with path), ensure that that file can +// be accessed again USING FILENAME ONLY by adding the path +// to the list if not already there. +bool wxPathList::EnsureFileAccessible (const wxString& path) +{ + return Add(wxPathOnly(path)); +} + +#if WXWIN_COMPATIBILITY_2_6 +bool wxPathList::Member (const wxString& path) const +{ + return Index(path) != wxNOT_FOUND; +} +#endif + +wxString wxPathList::FindValidPath (const wxString& file) const +{ + // normalize the given string as it could be a path + a filename + // and not only a filename + wxFileName fn(file); + wxString strend; + + // NB: normalize without making absolute otherwise calling this function with + // e.g. "b/c.txt" would result in removing the directory 'b' and the for loop + // below would only add to the paths of this list the 'c.txt' part when doing + // the existence checks... + // NB: we don't use wxPATH_NORM_DOTS here, too (see wxPathList::Add for more info) + if (!fn.Normalize(wxPATH_NORM_TILDE|wxPATH_NORM_LONG|wxPATH_NORM_ENV_VARS)) + return wxEmptyString; + + wxASSERT_MSG(!fn.IsDir(), wxT("Cannot search for directories; only for files")); + if (fn.IsAbsolute()) + strend = fn.GetFullName(); // search for the file name and ignore the path part + else + strend = fn.GetFullPath(); + + for (size_t i=0; i 0) + { + if (buffer[i] == wxT('.')) + { + buffer[i] = 0; + break; + } + i --; + } +} + +void wxStripExtension(wxString& buffer) +{ + //RN: Be careful about the handling the case where + //buffer.length() == 0 + for(size_t i = buffer.length() - 1; i != wxString::npos; --i) + { + if (buffer.GetChar(i) == wxT('.')) + { + buffer = buffer.Left(i); + break; + } + } +} + +// Destructive removal of /./ and /../ stuff +wxChar *wxRealPath (wxChar *path) +{ +#ifdef __WXMSW__ + static const wxChar SEP = wxT('\\'); + wxUnix2DosFilename(path); +#else + static const wxChar SEP = wxT('/'); +#endif + if (path[0] && path[1]) { + /* MATTHEW: special case "/./x" */ + wxChar *p; + if (path[2] == SEP && path[1] == wxT('.')) + p = &path[0]; + else + p = &path[2]; + for (; *p; p++) + { + if (*p == SEP) + { + if (p[1] == wxT('.') && p[2] == wxT('.') && (p[3] == SEP || p[3] == wxT('\0'))) + { + wxChar *q; + for (q = p - 1; q >= path && *q != SEP; q--) + { + // Empty + } + + if (q[0] == SEP && (q[1] != wxT('.') || q[2] != wxT('.') || q[3] != SEP) + && (q - 1 <= path || q[-1] != SEP)) + { + wxStrcpy (q, p + 3); + if (path[0] == wxT('\0')) + { + path[0] = SEP; + path[1] = wxT('\0'); + } +#if defined(__WXMSW__) || defined(__OS2__) + /* Check that path[2] is NULL! */ + else if (path[1] == wxT(':') && !path[2]) + { + path[2] = SEP; + path[3] = wxT('\0'); + } +#endif + p = q - 1; + } + } + else if (p[1] == wxT('.') && (p[2] == SEP || p[2] == wxT('\0'))) + wxStrcpy (p, p + 2); + } + } + } + return path; +} + +wxString wxRealPath(const wxString& path) +{ + wxChar *buf1=MYcopystring(path); + wxChar *buf2=wxRealPath(buf1); + wxString buf(buf2); + delete [] buf1; + return buf; +} + + +// Must be destroyed +wxChar *wxCopyAbsolutePath(const wxString& filename) +{ + if (filename.empty()) + return (wxChar *) NULL; + + if (! wxIsAbsolutePath(wxExpandPath(wxFileFunctionsBuffer, filename))) + { + wxString buf = ::wxGetCwd(); + wxChar ch = buf.Last(); +#ifdef __WXMSW__ + if (ch != wxT('\\') && ch != wxT('/')) + buf << wxT("\\"); +#else + if (ch != wxT('/')) + buf << wxT("/"); +#endif + buf << wxFileFunctionsBuffer; + buf = wxRealPath( buf ); + return MYcopystring( buf ); + } + return MYcopystring( wxFileFunctionsBuffer ); +} + +/*- + Handles: + ~/ => home dir + ~user/ => user's home dir + If the environment variable a = "foo" and b = "bar" then: + Unix: + $a => foo + $a$b => foobar + $a.c => foo.c + xxx$a => xxxfoo + ${a}! => foo! + $(b)! => bar! + \$a => \$a + MSDOS: + $a ==> $a + $(a) ==> foo + $(a)$b ==> foo$b + $(a)$(b)==> foobar + test.$$ ==> test.$$ + */ + +/* input name in name, pathname output to buf. */ + +wxChar *wxExpandPath(wxChar *buf, const wxChar *name) +{ + register wxChar *d, *s, *nm; + wxChar lnm[_MAXPATHLEN]; + int q; + + // Some compilers don't like this line. +// const wxChar trimchars[] = wxT("\n \t"); + + wxChar trimchars[4]; + trimchars[0] = wxT('\n'); + trimchars[1] = wxT(' '); + trimchars[2] = wxT('\t'); + trimchars[3] = 0; + +#ifdef __WXMSW__ + const wxChar SEP = wxT('\\'); +#else + const wxChar SEP = wxT('/'); +#endif + buf[0] = wxT('\0'); + if (name == NULL || *name == wxT('\0')) + return buf; + nm = MYcopystring(name); // Make a scratch copy + wxChar *nm_tmp = nm; + + /* Skip leading whitespace and cr */ + while (wxStrchr((wxChar *)trimchars, *nm) != NULL) + nm++; + /* And strip off trailing whitespace and cr */ + s = nm + (q = wxStrlen(nm)) - 1; + while (q-- && wxStrchr((wxChar *)trimchars, *s) != NULL) + *s = wxT('\0'); + + s = nm; + d = lnm; +#ifdef __WXMSW__ + q = FALSE; +#else + q = nm[0] == wxT('\\') && nm[1] == wxT('~'); +#endif + + /* Expand inline environment variables */ +#ifdef __VISAGECPP__ + while (*d) + { + *d++ = *s; + if(*s == wxT('\\')) + { + *(d - 1) = *++s; + if (*d) + { + s++; + continue; + } + else + break; + } + else +#else + while ((*d++ = *s) != 0) { +# ifndef __WXMSW__ + if (*s == wxT('\\')) { + if ((*(d - 1) = *++s)!=0) { + s++; + continue; + } else + break; + } else +# endif +#endif + // No env variables on WinCE +#ifndef __WXWINCE__ +#ifdef __WXMSW__ + if (*s++ == wxT('$') && (*s == wxT('{') || *s == wxT(')'))) +#else + if (*s++ == wxT('$')) +#endif + { + register wxChar *start = d; + register int braces = (*s == wxT('{') || *s == wxT('(')); + register wxChar *value; + while ((*d++ = *s) != 0) + if (braces ? (*s == wxT('}') || *s == wxT(')')) : !(wxIsalnum(*s) || *s == wxT('_')) ) + break; + else + s++; + *--d = 0; + value = wxGetenv(braces ? start + 1 : start); + if (value) { + for ((d = start - 1); (*d++ = *value++) != 0;) + { + // Empty + } + + d--; + if (braces && *s) + s++; + } + } +#endif + // __WXWINCE__ + } + + /* Expand ~ and ~user */ + nm = lnm; + if (nm[0] == wxT('~') && !q) + { + /* prefix ~ */ + if (nm[1] == SEP || nm[1] == 0) + { /* ~/filename */ + // FIXME: wxGetUserHome could return temporary storage in Unicode mode + if ((s = WXSTRINGCAST wxGetUserHome(wxEmptyString)) != NULL) { + if (*++nm) + nm++; + } + } else + { /* ~user/filename */ + register wxChar *nnm; + register wxChar *home; + for (s = nm; *s && *s != SEP; s++) + { + // Empty + } + int was_sep; /* MATTHEW: Was there a separator, or NULL? */ + was_sep = (*s == SEP); + nnm = *s ? s + 1 : s; + *s = 0; + // FIXME: wxGetUserHome could return temporary storage in Unicode mode + if ((home = WXSTRINGCAST wxGetUserHome(wxString(nm + 1))) == NULL) + { + if (was_sep) /* replace only if it was there: */ + *s = SEP; + s = NULL; + } + else + { + nm = nnm; + s = home; + } + } + } + + d = buf; + if (s && *s) { /* MATTHEW: s could be NULL if user '~' didn't exist */ + /* Copy home dir */ + while (wxT('\0') != (*d++ = *s++)) + /* loop */; + // Handle root home + if (d - 1 > buf && *(d - 2) != SEP) + *(d - 1) = SEP; + } + s = nm; + while ((*d++ = *s++) != 0) + { + // Empty + } + delete[] nm_tmp; // clean up alloc + /* Now clean up the buffer */ + return wxRealPath(buf); +} + +/* Contract Paths to be build upon an environment variable + component: + + example: "/usr/openwin/lib", OPENWINHOME --> ${OPENWINHOME}/lib + + The call wxExpandPath can convert these back! + */ +wxChar * +wxContractPath (const wxString& filename, + const wxString& WXUNUSED_IN_WINCE(envname), + const wxString& user) +{ + static wxChar dest[_MAXPATHLEN]; + + if (filename.empty()) + return (wxChar *) NULL; + + wxStrcpy (dest, WXSTRINGCAST filename); +#ifdef __WXMSW__ + wxUnix2DosFilename(dest); +#endif + + // Handle environment + const wxChar *val; +#ifndef __WXWINCE__ + wxChar *tcp; + if (!envname.empty() && (val = wxGetenv (WXSTRINGCAST envname)) != NULL && + (tcp = wxStrstr (dest, val)) != NULL) + { + wxStrcpy (wxFileFunctionsBuffer, tcp + wxStrlen (val)); + *tcp++ = wxT('$'); + *tcp++ = wxT('{'); + wxStrcpy (tcp, WXSTRINGCAST envname); + wxStrcat (tcp, wxT("}")); + wxStrcat (tcp, wxFileFunctionsBuffer); + } +#endif + + // Handle User's home (ignore root homes!) + val = wxGetUserHome (user); + if (!val) + return dest; + + const size_t len = wxStrlen(val); + if (len <= 2) + return dest; + + if (wxStrncmp(dest, val, len) == 0) + { + wxStrcpy(wxFileFunctionsBuffer, wxT("~")); + if (!user.empty()) + wxStrcat(wxFileFunctionsBuffer, (const wxChar*) user); + wxStrcat(wxFileFunctionsBuffer, dest + len); + wxStrcpy (dest, wxFileFunctionsBuffer); + } + + return dest; +} + +// Return just the filename, not the path (basename) +wxChar *wxFileNameFromPath (wxChar *path) +{ + wxString p = path; + wxString n = wxFileNameFromPath(p); + + return path + p.length() - n.length(); +} + +wxString wxFileNameFromPath (const wxString& path) +{ + wxString name, ext; + wxFileName::SplitPath(path, NULL, &name, &ext); + + wxString fullname = name; + if ( !ext.empty() ) + { + fullname << wxFILE_SEP_EXT << ext; + } + + return fullname; +} + +// Return just the directory, or NULL if no directory +wxChar * +wxPathOnly (wxChar *path) +{ + if (path && *path) + { + static wxChar buf[_MAXPATHLEN]; + + // Local copy + wxStrcpy (buf, path); + + int l = wxStrlen(path); + int i = l - 1; + + // Search backward for a backward or forward slash + while (i > -1) + { +#if defined(__WXMAC__) && !defined(__DARWIN__) + // Classic or Carbon CodeWarrior like + // Carbon with Apple DevTools is Unix like + if (path[i] == wxT(':') ) + { + buf[i] = 0; + return buf; + } +#else + // Unix like or Windows + if (path[i] == wxT('/') || path[i] == wxT('\\')) + { + buf[i] = 0; + return buf; + } +#endif +#ifdef __VMS__ + if (path[i] == wxT(']')) + { + buf[i+1] = 0; + return buf; + } +#endif + i --; + } + +#if defined(__WXMSW__) || defined(__OS2__) + // Try Drive specifier + if (wxIsalpha (buf[0]) && buf[1] == wxT(':')) + { + // A:junk --> A:. (since A:.\junk Not A:\junk) + buf[2] = wxT('.'); + buf[3] = wxT('\0'); + return buf; + } +#endif + } + return (wxChar *) NULL; +} + +// Return just the directory, or NULL if no directory +wxString wxPathOnly (const wxString& path) +{ + if (!path.empty()) + { + wxChar buf[_MAXPATHLEN]; + + // Local copy + wxStrcpy (buf, WXSTRINGCAST path); + + int l = path.length(); + int i = l - 1; + + // Search backward for a backward or forward slash + while (i > -1) + { +#if defined(__WXMAC__) && !defined(__DARWIN__) + // Classic or Carbon CodeWarrior like + // Carbon with Apple DevTools is Unix like + if (path[i] == wxT(':') ) + { + buf[i] = 0; + return wxString(buf); + } +#else + // Unix like or Windows + if (path[i] == wxT('/') || path[i] == wxT('\\')) + { + // Don't return an empty string + if (i == 0) + i ++; + buf[i] = 0; + return wxString(buf); + } +#endif +#ifdef __VMS__ + if (path[i] == wxT(']')) + { + buf[i+1] = 0; + return wxString(buf); + } +#endif + i --; + } + +#if defined(__WXMSW__) || defined(__OS2__) + // Try Drive specifier + if (wxIsalpha (buf[0]) && buf[1] == wxT(':')) + { + // A:junk --> A:. (since A:.\junk Not A:\junk) + buf[2] = wxT('.'); + buf[3] = wxT('\0'); + return wxString(buf); + } +#endif + } + return wxEmptyString; +} + +// Utility for converting delimiters in DOS filenames to UNIX style +// and back again - or we get nasty problems with delimiters. +// Also, convert to lower case, since case is significant in UNIX. + +#if defined(__WXMAC__) + +#if TARGET_API_MAC_OSX +#define kDefaultPathStyle kCFURLPOSIXPathStyle +#else +#define kDefaultPathStyle kCFURLHFSPathStyle +#endif + +wxString wxMacFSRefToPath( const FSRef *fsRef , CFStringRef additionalPathComponent ) +{ + CFURLRef fullURLRef; + fullURLRef = CFURLCreateFromFSRef(NULL, fsRef); + if ( additionalPathComponent ) + { + CFURLRef parentURLRef = fullURLRef ; + fullURLRef = CFURLCreateCopyAppendingPathComponent(NULL, parentURLRef, + additionalPathComponent,false); + CFRelease( parentURLRef ) ; + } + CFStringRef cfString = CFURLCopyFileSystemPath(fullURLRef, kDefaultPathStyle); + CFRelease( fullURLRef ) ; + CFMutableStringRef cfMutableString = CFStringCreateMutableCopy(NULL, 0, cfString); + CFRelease( cfString ); + CFStringNormalize(cfMutableString,kCFStringNormalizationFormC); + return wxMacCFStringHolder(cfMutableString).AsString(); +} + +OSStatus wxMacPathToFSRef( const wxString&path , FSRef *fsRef ) +{ + OSStatus err = noErr ; + CFMutableStringRef cfMutableString = CFStringCreateMutableCopy(NULL, 0, wxMacCFStringHolder(path)); + CFStringNormalize(cfMutableString,kCFStringNormalizationFormD); + CFURLRef url = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, cfMutableString , kDefaultPathStyle, false); + CFRelease( cfMutableString ); + if ( NULL != url ) + { + if ( CFURLGetFSRef(url, fsRef) == false ) + err = fnfErr ; + CFRelease( url ) ; + } + else + { + err = fnfErr ; + } + return err ; +} + +wxString wxMacHFSUniStrToString( ConstHFSUniStr255Param uniname ) +{ + CFStringRef cfname = CFStringCreateWithCharacters( kCFAllocatorDefault, + uniname->unicode, + uniname->length ); + CFMutableStringRef cfMutableString = CFStringCreateMutableCopy(NULL, 0, cfname); + CFRelease( cfname ); + CFStringNormalize(cfMutableString,kCFStringNormalizationFormC); + return wxMacCFStringHolder(cfMutableString).AsString() ; +} + +#ifndef __LP64__ + +wxString wxMacFSSpec2MacFilename( const FSSpec *spec ) +{ + FSRef fsRef ; + if ( FSpMakeFSRef( spec , &fsRef) == noErr ) + { + return wxMacFSRefToPath( &fsRef ) ; + } + return wxEmptyString ; +} + +void wxMacFilename2FSSpec( const wxString& path , FSSpec *spec ) +{ + OSStatus err = noErr ; + FSRef fsRef ; + wxMacPathToFSRef( path , &fsRef ) ; + err = FSRefMakeFSSpec( &fsRef , spec ) ; +} +#endif + +#endif // __WXMAC__ + +void +wxDos2UnixFilename (wxChar *s) +{ + if (s) + while (*s) + { + if (*s == _T('\\')) + *s = _T('/'); +#ifdef __WXMSW__ + else + *s = (wxChar)wxTolower (*s); // Case INDEPENDENT +#endif + s++; + } +} + +void +#if defined(__WXMSW__) || defined(__OS2__) +wxUnix2DosFilename (wxChar *s) +#else +wxUnix2DosFilename (wxChar *WXUNUSED(s) ) +#endif +{ +// Yes, I really mean this to happen under DOS only! JACS +#if defined(__WXMSW__) || defined(__OS2__) + if (s) + while (*s) + { + if (*s == wxT('/')) + *s = wxT('\\'); + s++; + } +#endif +} + +// Concatenate two files to form third +bool +wxConcatFiles (const wxString& file1, const wxString& file2, const wxString& file3) +{ +#if wxUSE_FILE + + wxFile in1(file1), in2(file2); + wxTempFile out(file3); + + if ( !in1.IsOpened() || !in2.IsOpened() || !out.IsOpened() ) + return false; + + ssize_t ofs; + unsigned char buf[1024]; + + for( int i=0; i<2; i++) + { + wxFile *in = i==0 ? &in1 : &in2; + do{ + if ( (ofs = in->Read(buf,WXSIZEOF(buf))) == wxInvalidOffset ) return false; + if ( ofs > 0 ) + if ( !out.Write(buf,ofs) ) + return false; + } while ( ofs == (ssize_t)WXSIZEOF(buf) ); + } + + return out.Commit(); + +#else + + wxUnusedVar(file1); + wxUnusedVar(file2); + wxUnusedVar(file3); + return false; + +#endif +} + +// Copy files +bool +wxCopyFile (const wxString& file1, const wxString& file2, bool overwrite) +{ +#if defined(__WIN32__) && !defined(__WXMICROWIN__) + // CopyFile() copies file attributes and modification time too, so use it + // instead of our code if available + // + // NB: 3rd parameter is bFailIfExists i.e. the inverse of overwrite + if ( !::CopyFile(file1, file2, !overwrite) ) + { + wxLogSysError(_("Failed to copy the file '%s' to '%s'"), + file1.c_str(), file2.c_str()); + + return false; + } +#elif defined(__OS2__) + if ( ::DosCopy((PSZ)file1.c_str(), (PSZ)file2.c_str(), overwrite ? DCPY_EXISTING : 0) != 0 ) + return false; +#elif defined(__PALMOS__) + // TODO with http://www.palmos.com/dev/support/docs/protein_books/Memory_Databases_Files/ + return false; +#elif wxUSE_FILE // !Win32 + + wxStructStat fbuf; + // get permissions of file1 + if ( wxStat( file1.c_str(), &fbuf) != 0 ) + { + // the file probably doesn't exist or we haven't the rights to read + // from it anyhow + wxLogSysError(_("Impossible to get permissions for file '%s'"), + file1.c_str()); + return false; + } + + // open file1 for reading + wxFile fileIn(file1, wxFile::read); + if ( !fileIn.IsOpened() ) + return false; + + // remove file2, if it exists. This is needed for creating + // file2 with the correct permissions in the next step + if ( wxFileExists(file2) && (!overwrite || !wxRemoveFile(file2))) + { + wxLogSysError(_("Impossible to overwrite the file '%s'"), + file2.c_str()); + return false; + } + + // reset the umask as we want to create the file with exactly the same + // permissions as the original one + wxCHANGE_UMASK(0); + + // create file2 with the same permissions than file1 and open it for + // writing + + wxFile fileOut; + if ( !fileOut.Create(file2, overwrite, fbuf.st_mode & 0777) ) + return false; + + // copy contents of file1 to file2 + char buf[4096]; + size_t count; + for ( ;; ) + { + count = fileIn.Read(buf, WXSIZEOF(buf)); + if ( fileIn.Error() ) + return false; + + // end of file? + if ( !count ) + break; + + if ( fileOut.Write(buf, count) < count ) + return false; + } + + // we can expect fileIn to be closed successfully, but we should ensure + // that fileOut was closed as some write errors (disk full) might not be + // detected before doing this + if ( !fileIn.Close() || !fileOut.Close() ) + return false; + +#if !defined(__VISAGECPP__) && !defined(__WXMAC__) || defined(__UNIX__) + // no chmod in VA. Should be some permission API for HPFS386 partitions + // however + if ( chmod(OS_FILENAME(file2), fbuf.st_mode) != 0 ) + { + wxLogSysError(_("Impossible to set permissions for the file '%s'"), + file2.c_str()); + return false; + } +#endif // OS/2 || Mac + +#else // !Win32 && ! wxUSE_FILE + + // impossible to simulate with wxWidgets API + wxUnusedVar(file1); + wxUnusedVar(file2); + wxUnusedVar(overwrite); + return false; + +#endif // __WXMSW__ && __WIN32__ + + return true; +} + +bool +wxRenameFile(const wxString& file1, const wxString& file2, bool overwrite) +{ + if ( !overwrite && wxFileExists(file2) ) + { + wxLogSysError + ( + _("Failed to rename the file '%s' to '%s' because the destination file already exists."), + file1.c_str(), file2.c_str() + ); + + return false; + } + +#if !defined(__WXWINCE__) && !defined(__WXPALMOS__) + // Normal system call + if ( wxRename (file1, file2) == 0 ) + return true; +#endif + + // Try to copy + if (wxCopyFile(file1, file2, overwrite)) { + wxRemoveFile(file1); + return true; + } + // Give up + return false; +} + +bool wxRemoveFile(const wxString& file) +{ +#if defined(__VISUALC__) \ + || defined(__BORLANDC__) \ + || defined(__WATCOMC__) \ + || defined(__DMC__) \ + || defined(__GNUWIN32__) \ + || (defined(__MWERKS__) && defined(__MSL__)) + int res = wxRemove(file); +#elif defined(__WXMAC__) + int res = unlink(wxFNCONV(file)); +#elif defined(__WXPALMOS__) + int res = 1; + // TODO with VFSFileDelete() +#else + int res = unlink(OS_FILENAME(file)); +#endif + + return res == 0; +} + +bool wxMkdir(const wxString& dir, int perm) +{ +#if defined(__WXPALMOS__) + return false; +#elif defined(__WXMAC__) && !defined(__UNIX__) + return (mkdir( wxFNCONV(dir) , 0 ) == 0); +#else // !Mac + const wxChar *dirname = dir.c_str(); + + // assume mkdir() has 2 args on non Windows-OS/2 platforms and on Windows too + // for the GNU compiler +#if (!(defined(__WXMSW__) || defined(__OS2__) || defined(__DOS__))) || (defined(__GNUWIN32__) && !defined(__MINGW32__)) || defined(__WINE__) || defined(__WXMICROWIN__) + #if defined(MSVCRT) + wxUnusedVar(perm); + if ( mkdir(wxFNCONV(dirname)) != 0 ) + #else + if ( mkdir(wxFNCONV(dirname), perm) != 0 ) + #endif +#elif defined(__OS2__) + wxUnusedVar(perm); + if (::DosCreateDir((PSZ)dirname, NULL) != 0) // enhance for EAB's?? +#elif defined(__DOS__) + #if defined(__WATCOMC__) + (void)perm; + if ( wxMkDir(wxFNSTRINGCAST wxFNCONV(dirname)) != 0 ) + #elif defined(__DJGPP__) + if ( mkdir(wxFNCONV(dirname), perm) != 0 ) + #else + #error "Unsupported DOS compiler!" + #endif +#else // !MSW, !DOS and !OS/2 VAC++ + wxUnusedVar(perm); +#ifdef __WXWINCE__ + if ( !CreateDirectory(dirname, NULL) ) +#else + if ( wxMkDir(dir.fn_str()) != 0 ) +#endif +#endif // !MSW/MSW + { + wxLogSysError(_("Directory '%s' couldn't be created"), dirname); + + return false; + } + + return true; +#endif // Mac/!Mac +} + +bool wxRmdir(const wxString& dir, int WXUNUSED(flags)) +{ +#if defined(__VMS__) + return false; //to be changed since rmdir exists in VMS7.x +#elif defined(__OS2__) + return (::DosDeleteDir((PSZ)dir.c_str()) == 0); +#elif defined(__WXWINCE__) + return (RemoveDirectory(dir) != 0); +#elif defined(__WXPALMOS__) + // TODO with VFSFileRename() + return false; +#else + return (wxRmDir(OS_FILENAME(dir)) == 0); +#endif +} + +// does the path exists? (may have or not '/' or '\\' at the end) +bool wxDirExists(const wxChar *pszPathName) +{ + wxString strPath(pszPathName); + +#if defined(__WINDOWS__) || defined(__OS2__) + // Windows fails to find directory named "c:\dir\" even if "c:\dir" exists, + // so remove all trailing backslashes from the path - but don't do this for + // the paths "d:\" (which are different from "d:") nor for just "\" + while ( wxEndsWithPathSeparator(strPath) ) + { + size_t len = strPath.length(); + if ( len == 1 || (len == 3 && strPath[len - 2] == _T(':')) ) + break; + + strPath.Truncate(len - 1); + } +#endif // __WINDOWS__ + +#ifdef __OS2__ + // OS/2 can't handle "d:", it wants either "d:\" or "d:." + if (strPath.length() == 2 && strPath[1u] == _T(':')) + strPath << _T('.'); +#endif + +#if defined(__WXPALMOS__) + return false; +#elif defined(__WIN32__) && !defined(__WXMICROWIN__) + // stat() can't cope with network paths + DWORD ret = ::GetFileAttributes(strPath); + + return (ret != (DWORD)-1) && (ret & FILE_ATTRIBUTE_DIRECTORY); +#elif defined(__OS2__) + FILESTATUS3 Info = {{0}}; + APIRET rc = ::DosQueryPathInfo((PSZ)(WXSTRINGCAST strPath), FIL_STANDARD, + (void*) &Info, sizeof(FILESTATUS3)); + + return ((rc == NO_ERROR) && (Info.attrFile & FILE_DIRECTORY)) || + (rc == ERROR_SHARING_VIOLATION); + // If we got a sharing violation, there must be something with this name. +#else // !__WIN32__ + + wxStructStat st; +#ifndef __VISAGECPP__ + return wxStat(strPath.c_str(), &st) == 0 && ((st.st_mode & S_IFMT) == S_IFDIR); +#else + // S_IFMT not supported in VA compilers.. st_mode is a 2byte value only + return wxStat(pszPathName, &st) == 0 && (st.st_mode == S_IFDIR); +#endif + +#endif // __WIN32__/!__WIN32__ +} + +// Get a temporary filename, opening and closing the file. +wxChar *wxGetTempFileName(const wxString& prefix, wxChar *buf) +{ + wxString filename; + if ( !wxGetTempFileName(prefix, filename) ) + return NULL; + + if ( buf ) + wxStrcpy(buf, filename); + else + buf = MYcopystring(filename); + + return buf; +} + +bool wxGetTempFileName(const wxString& prefix, wxString& buf) +{ +#if wxUSE_FILE + buf = wxFileName::CreateTempFileName(prefix); + + return !buf.empty(); +#else // !wxUSE_FILE + wxUnusedVar(prefix); + wxUnusedVar(buf); + + return false; +#endif // wxUSE_FILE/!wxUSE_FILE +} + +// Get first file name matching given wild card. + +static wxDir *gs_dir = NULL; +static wxString gs_dirPath; + +wxString wxFindFirstFile(const wxChar *spec, int flags) +{ + wxSplitPath(spec, &gs_dirPath, NULL, NULL); + if ( gs_dirPath.empty() ) + gs_dirPath = wxT("."); + if ( !wxEndsWithPathSeparator(gs_dirPath ) ) + gs_dirPath << wxFILE_SEP_PATH; + + if (gs_dir) + delete gs_dir; + gs_dir = new wxDir(gs_dirPath); + + if ( !gs_dir->IsOpened() ) + { + wxLogSysError(_("Can not enumerate files '%s'"), spec); + return wxEmptyString; + } + + int dirFlags; + switch (flags) + { + case wxDIR: dirFlags = wxDIR_DIRS; break; + case wxFILE: dirFlags = wxDIR_FILES; break; + default: dirFlags = wxDIR_DIRS | wxDIR_FILES; break; + } + + wxString result; + gs_dir->GetFirst(&result, wxFileNameFromPath(wxString(spec)), dirFlags); + if ( result.empty() ) + { + wxDELETE(gs_dir); + return result; + } + + return gs_dirPath + result; +} + +wxString wxFindNextFile() +{ + wxASSERT_MSG( gs_dir, wxT("You must call wxFindFirstFile before!") ); + + wxString result; + gs_dir->GetNext(&result); + + if ( result.empty() ) + { + wxDELETE(gs_dir); + return result; + } + + return gs_dirPath + result; +} + + +// Get current working directory. +// If buf is NULL, allocates space using new, else copies into buf. +// wxGetWorkingDirectory() is obsolete, use wxGetCwd() +// wxDoGetCwd() is their common core to be moved +// to wxGetCwd() once wxGetWorkingDirectory() will be removed. +// Do not expose wxDoGetCwd in headers! + +wxChar *wxDoGetCwd(wxChar *buf, int sz) +{ +#if defined(__WXPALMOS__) + // TODO + if(buf && sz>0) buf[0] = _T('\0'); + return buf; +#elif defined(__WXWINCE__) + // TODO + if(buf && sz>0) buf[0] = _T('\0'); + return buf; +#else + if ( !buf ) + { + buf = new wxChar[sz + 1]; + } + + bool ok wxDUMMY_INITIALIZE(false); + + // for the compilers which have Unicode version of _getcwd(), call it + // directly, for the others call the ANSI version and do the translation +#if !wxUSE_UNICODE + #define cbuf buf +#else // wxUSE_UNICODE + bool needsANSI = true; + + #if !defined(HAVE_WGETCWD) || wxUSE_UNICODE_MSLU + char cbuf[_MAXPATHLEN]; + #endif + + #ifdef HAVE_WGETCWD + #if wxUSE_UNICODE_MSLU + if ( wxGetOsVersion() != wxOS_WINDOWS_9X ) + #else + char *cbuf = NULL; // never really used because needsANSI will always be false + #endif + { + ok = _wgetcwd(buf, sz) != NULL; + needsANSI = false; + } + #endif + + if ( needsANSI ) +#endif // wxUSE_UNICODE + { + #if defined(_MSC_VER) || defined(__MINGW32__) + ok = _getcwd(cbuf, sz) != NULL; + #elif defined(__WXMAC__) && !defined(__DARWIN__) + char lbuf[1024] ; + if ( getcwd( lbuf , sizeof( lbuf ) ) ) + { + wxString res( lbuf , *wxConvCurrent ) ; + wxStrcpy( buf , res ) ; + ok = true; + } + else + ok = false ; + #elif defined(__OS2__) + APIRET rc; + ULONG ulDriveNum = 0; + ULONG ulDriveMap = 0; + rc = ::DosQueryCurrentDisk(&ulDriveNum, &ulDriveMap); + ok = rc == 0; + if (ok) + { + sz -= 3; + rc = ::DosQueryCurrentDir( 0 // current drive + ,cbuf + 3 + ,(PULONG)&sz + ); + cbuf[0] = char('A' + (ulDriveNum - 1)); + cbuf[1] = ':'; + cbuf[2] = '\\'; + ok = rc == 0; + } + #else // !Win32/VC++ !Mac !OS2 + ok = getcwd(cbuf, sz) != NULL; + #endif // platform + + #if wxUSE_UNICODE && !(defined(__WXMAC__) && !defined(__DARWIN__)) + // finally convert the result to Unicode if needed + wxConvFile.MB2WC(buf, cbuf, sz); + #endif // wxUSE_UNICODE + } + + if ( !ok ) + { + wxLogSysError(_("Failed to get the working directory")); + + // VZ: the old code used to return "." on error which didn't make any + // sense at all to me - empty string is a better error indicator + // (NULL might be even better but I'm afraid this could lead to + // problems with the old code assuming the return is never NULL) + buf[0] = _T('\0'); + } + else // ok, but we might need to massage the path into the right format + { +#ifdef __DJGPP__ + // VS: DJGPP is a strange mix of DOS and UNIX API and returns paths + // with / deliminers. We don't like that. + for (wxChar *ch = buf; *ch; ch++) + { + if (*ch == wxT('/')) + *ch = wxT('\\'); + } +#endif // __DJGPP__ + +// MBN: we hope that in the case the user is compiling a GTK+/Motif app, +// he needs Unix as opposed to Win32 pathnames +#if defined( __CYGWIN__ ) && defined( __WINDOWS__ ) + // another example of DOS/Unix mix (Cygwin) + wxString pathUnix = buf; +#if wxUSE_UNICODE + char bufA[_MAXPATHLEN]; + cygwin_conv_to_full_win32_path(pathUnix.mb_str(wxConvFile), bufA); + wxConvFile.MB2WC(buf, bufA, sz); +#else + cygwin_conv_to_full_win32_path(pathUnix, buf); +#endif // wxUSE_UNICODE +#endif // __CYGWIN__ + } + + return buf; + +#if !wxUSE_UNICODE + #undef cbuf +#endif + +#endif + // __WXWINCE__ +} + +#if WXWIN_COMPATIBILITY_2_6 +wxChar *wxGetWorkingDirectory(wxChar *buf, int sz) +{ + return wxDoGetCwd(buf,sz); +} +#endif // WXWIN_COMPATIBILITY_2_6 + +wxString wxGetCwd() +{ + wxString str; + wxDoGetCwd(wxStringBuffer(str, _MAXPATHLEN), _MAXPATHLEN); + return str; +} + +bool wxSetWorkingDirectory(const wxString& d) +{ +#if defined(__OS2__) + if (d[1] == ':') + { + ::DosSetDefaultDisk(1 + wxToupper(d[0]) - _T('A')); + // do not call DosSetCurrentDir when just changing drive, + // since it requires e.g. "d:." instead of "d:"! + if (d.length() == 2) + return true; + } + return (::DosSetCurrentDir((PSZ)d.c_str()) == 0); +#elif defined(__UNIX__) || defined(__WXMAC__) || defined(__DOS__) + return (chdir(wxFNSTRINGCAST d.fn_str()) == 0); +#elif defined(__WINDOWS__) + +#ifdef __WIN32__ +#ifdef __WXWINCE__ + // No equivalent in WinCE + wxUnusedVar(d); + return false; +#else + return (bool)(SetCurrentDirectory(d) != 0); +#endif +#else + // Must change drive, too. + bool isDriveSpec = ((strlen(d) > 1) && (d[1] == ':')); + if (isDriveSpec) + { + wxChar firstChar = d[0]; + + // To upper case + if (firstChar > 90) + firstChar = firstChar - 32; + + // To a drive number + unsigned int driveNo = firstChar - 64; + if (driveNo > 0) + { + unsigned int noDrives; + _dos_setdrive(driveNo, &noDrives); + } + } + bool success = (chdir(WXSTRINGCAST d) == 0); + + return success; +#endif + +#endif +} + +// Get the OS directory if appropriate (such as the Windows directory). +// On non-Windows platform, probably just return the empty string. +wxString wxGetOSDirectory() +{ +#ifdef __WXWINCE__ + return wxString(wxT("\\Windows")); +#elif defined(__WINDOWS__) && !defined(__WXMICROWIN__) + wxChar buf[256]; + GetWindowsDirectory(buf, 256); + return wxString(buf); +#elif defined(__WXMAC__) + return wxMacFindFolder(kOnSystemDisk, 'macs', false); +#else + return wxEmptyString; +#endif +} + +bool wxEndsWithPathSeparator(const wxChar *pszFileName) +{ + size_t len = wxStrlen(pszFileName); + + return len && wxIsPathSeparator(pszFileName[len - 1]); +} + +// find a file in a list of directories, returns false if not found +bool wxFindFileInPath(wxString *pStr, const wxChar *pszPath, const wxChar *pszFile) +{ + // we assume that it's not empty + wxCHECK_MSG( !wxIsEmpty(pszFile), false, + _T("empty file name in wxFindFileInPath")); + + // skip path separator in the beginning of the file name if present + if ( wxIsPathSeparator(*pszFile) ) + pszFile++; + + // copy the path (strtok will modify it) + wxChar *szPath = new wxChar[wxStrlen(pszPath) + 1]; + wxStrcpy(szPath, pszPath); + + wxString strFile; + wxChar *pc, *save_ptr; + for ( pc = wxStrtok(szPath, wxPATH_SEP, &save_ptr); + pc != NULL; + pc = wxStrtok((wxChar *) NULL, wxPATH_SEP, &save_ptr) ) + { + // search for the file in this directory + strFile = pc; + if ( !wxEndsWithPathSeparator(pc) ) + strFile += wxFILE_SEP_PATH; + strFile += pszFile; + + if ( wxFileExists(strFile) ) { + *pStr = strFile; + break; + } + } + + // suppress warning about unused variable save_ptr when wxStrtok() is a + // macro which throws away its third argument + save_ptr = pc; + + delete [] szPath; + + return pc != NULL; // if true => we breaked from the loop +} + +void WXDLLEXPORT wxSplitPath(const wxChar *pszFileName, + wxString *pstrPath, + wxString *pstrName, + wxString *pstrExt) +{ + // it can be empty, but it shouldn't be NULL + wxCHECK_RET( pszFileName, wxT("NULL file name in wxSplitPath") ); + + wxFileName::SplitPath(pszFileName, pstrPath, pstrName, pstrExt); +} + +#if wxUSE_DATETIME + +time_t WXDLLEXPORT wxFileModificationTime(const wxString& filename) +{ + wxDateTime mtime; + if ( !wxFileName(filename).GetTimes(NULL, &mtime, NULL) ) + return (time_t)-1; + + return mtime.GetTicks(); +} + +#endif // wxUSE_DATETIME + + +// Parses the filterStr, returning the number of filters. +// Returns 0 if none or if there's a problem. +// filterStr is in the form: "All files (*.*)|*.*|JPEG Files (*.jpeg)|*.jpeg" + +int WXDLLEXPORT wxParseCommonDialogsFilter(const wxString& filterStr, + wxArrayString& descriptions, + wxArrayString& filters) +{ + descriptions.Clear(); + filters.Clear(); + + wxString str(filterStr); + + wxString description, filter; + int pos = 0; + while( pos != wxNOT_FOUND ) + { + pos = str.Find(wxT('|')); + if ( pos == wxNOT_FOUND ) + { + // if there are no '|'s at all in the string just take the entire + // string as filter and make description empty for later autocompletion + if ( filters.IsEmpty() ) + { + descriptions.Add(wxEmptyString); + filters.Add(filterStr); + } + else + { + wxFAIL_MSG( _T("missing '|' in the wildcard string!") ); + } + + break; + } + + description = str.Left(pos); + str = str.Mid(pos + 1); + pos = str.Find(wxT('|')); + if ( pos == wxNOT_FOUND ) + { + filter = str; + } + else + { + filter = str.Left(pos); + str = str.Mid(pos + 1); + } + + descriptions.Add(description); + filters.Add(filter); + } + +#if defined(__WXMOTIF__) + // split it so there is one wildcard per entry + for( size_t i = 0 ; i < descriptions.GetCount() ; i++ ) + { + pos = filters[i].Find(wxT(';')); + if (pos != wxNOT_FOUND) + { + // first split only filters + descriptions.Insert(descriptions[i],i+1); + filters.Insert(filters[i].Mid(pos+1),i+1); + filters[i]=filters[i].Left(pos); + + // autoreplace new filter in description with pattern: + // C/C++ Files(*.cpp;*.c;*.h)|*.cpp;*.c;*.h + // cause split into: + // C/C++ Files(*.cpp)|*.cpp + // C/C++ Files(*.c;*.h)|*.c;*.h + // and next iteration cause another split into: + // C/C++ Files(*.cpp)|*.cpp + // C/C++ Files(*.c)|*.c + // C/C++ Files(*.h)|*.h + for ( size_t k=i;kbefore.Find(_T(')'),true)) + { + before = before.Left(pos+1); + before << filters[k]; + pos = after.Find(_T(')')); + int pos1 = after.Find(_T('(')); + if (pos != wxNOT_FOUND && (pos +* +* The match procedure is public domain code (from ircII's reg.c) +* but modified to suit our tastes (RN: No "%" syntax I guess) +*/ + +bool wxMatchWild( const wxString& pat, const wxString& text, bool dot_special ) +{ + if (text.empty()) + { + /* Match if both are empty. */ + return pat.empty(); + } + + const wxChar *m = pat.c_str(), + *n = text.c_str(), + *ma = NULL, + *na = NULL; + int just = 0, + acount = 0, + count = 0; + + if (dot_special && (*n == wxT('.'))) + { + /* Never match so that hidden Unix files + * are never found. */ + return false; + } + + for (;;) + { + if (*m == wxT('*')) + { + ma = ++m; + na = n; + just = 1; + acount = count; + } + else if (*m == wxT('?')) + { + m++; + if (!*n++) + return false; + } + else + { + if (*m == wxT('\\')) + { + m++; + /* Quoting "nothing" is a bad thing */ + if (!*m) + return false; + } + if (!*m) + { + /* + * If we are out of both strings or we just + * saw a wildcard, then we can say we have a + * match + */ + if (!*n) + return true; + if (just) + return true; + just = 0; + goto not_matched; + } + /* + * We could check for *n == NULL at this point, but + * since it's more common to have a character there, + * check to see if they match first (m and n) and + * then if they don't match, THEN we can check for + * the NULL of n + */ + just = 0; + if (*m == *n) + { + m++; + count++; + n++; + } + else + { + + not_matched: + + /* + * If there are no more characters in the + * string, but we still need to find another + * character (*m != NULL), then it will be + * impossible to match it + */ + if (!*n) + return false; + + if (ma) + { + m = ma; + n = ++na; + count = acount; + } + else + return false; + } + } + } +} + +#ifdef __VISUALC__ + #pragma warning(default:4706) // assignment within conditional expression +#endif // VC++ diff --git a/Externals/wxWidgets/src/common/filename.cpp b/Externals/wxWidgets/src/common/filename.cpp new file mode 100644 index 0000000000..a9cbc3e3c8 --- /dev/null +++ b/Externals/wxWidgets/src/common/filename.cpp @@ -0,0 +1,2523 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/filename.cpp +// Purpose: wxFileName - encapsulates a file path +// Author: Robert Roebling, Vadim Zeitlin +// Modified by: +// Created: 28.12.2000 +// RCS-ID: $Id: filename.cpp 44813 2007-03-15 00:21:59Z VZ $ +// Copyright: (c) 2000 Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +/* + Here are brief descriptions of the filename formats supported by this class: + + wxPATH_UNIX: standard Unix format, used under Darwin as well, absolute file + names have the form: + /dir1/dir2/.../dirN/filename, "." and ".." stand for the + current and parent directory respectively, "~" is parsed as the + user HOME and "~username" as the HOME of that user + + wxPATH_DOS: DOS/Windows format, absolute file names have the form: + drive:\dir1\dir2\...\dirN\filename.ext where drive is a single + letter. "." and ".." as for Unix but no "~". + + There are also UNC names of the form \\share\fullpath + + wxPATH_MAC: Mac OS 8/9 and Mac OS X under CodeWarrior 7 format, absolute file + names have the form + volume:dir1:...:dirN:filename + and the relative file names are either + :dir1:...:dirN:filename + or just + filename + (although :filename works as well). + Since the volume is just part of the file path, it is not + treated like a separate entity as it is done under DOS and + VMS, it is just treated as another dir. + + wxPATH_VMS: VMS native format, absolute file names have the form + :[dir1.dir2.dir3]file.txt + or + :[000000.dir1.dir2.dir3]file.txt + + the is the physical device (i.e. disk). 000000 is the + root directory on the device which can be omitted. + + Note that VMS uses different separators unlike Unix: + : always after the device. If the path does not contain : than + the default (the device of the current directory) is assumed. + [ start of directory specification + . separator between directory and subdirectory + ] between directory and file + */ + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ +#pragma hdrstop +#endif + +#ifndef WX_PRECOMP + #ifdef __WXMSW__ + #include "wx/msw/wrapwin.h" // For GetShort/LongPathName + #endif + #include "wx/dynarray.h" + #include "wx/intl.h" + #include "wx/log.h" + #include "wx/utils.h" +#endif + +#include "wx/filename.h" +#include "wx/private/filename.h" +#include "wx/tokenzr.h" +#include "wx/config.h" // for wxExpandEnvVars +#include "wx/dynlib.h" + +#if defined(__WIN32__) && defined(__MINGW32__) + #include "wx/msw/gccpriv.h" +#endif + +#ifdef __WXWINCE__ +#include "wx/msw/private.h" +#endif + +#if defined(__WXMAC__) + #include "wx/mac/private.h" // includes mac headers +#endif + +// utime() is POSIX so should normally be available on all Unices +#ifdef __UNIX_LIKE__ +#include +#include +#include +#include +#endif + +#ifdef __DJGPP__ +#include +#endif + +#ifdef __MWERKS__ +#ifdef __MACH__ +#include +#include +#include +#include +#else +#include +#include +#include +#endif +#endif + +#ifdef __WATCOMC__ +#include +#include +#include +#endif + +#ifdef __VISAGECPP__ +#ifndef MAX_PATH +#define MAX_PATH 256 +#endif +#endif + +#ifdef __EMX__ +#include +#define MAX_PATH _MAX_PATH +#endif + + +wxULongLong wxInvalidSize = (unsigned)-1; + + +// ---------------------------------------------------------------------------- +// private classes +// ---------------------------------------------------------------------------- + +// small helper class which opens and closes the file - we use it just to get +// a file handle for the given file name to pass it to some Win32 API function +#if defined(__WIN32__) && !defined(__WXMICROWIN__) + +class wxFileHandle +{ +public: + enum OpenMode + { + Read, + Write + }; + + wxFileHandle(const wxString& filename, OpenMode mode) + { + m_hFile = ::CreateFile + ( + filename, // name + mode == Read ? GENERIC_READ // access mask + : GENERIC_WRITE, + FILE_SHARE_READ | // sharing mode + FILE_SHARE_WRITE, // (allow everything) + NULL, // no secutity attr + OPEN_EXISTING, // creation disposition + 0, // no flags + NULL // no template file + ); + + if ( m_hFile == INVALID_HANDLE_VALUE ) + { + wxLogSysError(_("Failed to open '%s' for %s"), + filename.c_str(), + mode == Read ? _("reading") : _("writing")); + } + } + + ~wxFileHandle() + { + if ( m_hFile != INVALID_HANDLE_VALUE ) + { + if ( !::CloseHandle(m_hFile) ) + { + wxLogSysError(_("Failed to close file handle")); + } + } + } + + // return true only if the file could be opened successfully + bool IsOk() const { return m_hFile != INVALID_HANDLE_VALUE; } + + // get the handle + operator HANDLE() const { return m_hFile; } + +private: + HANDLE m_hFile; +}; + +#endif // __WIN32__ + +// ---------------------------------------------------------------------------- +// private functions +// ---------------------------------------------------------------------------- + +#if wxUSE_DATETIME && defined(__WIN32__) && !defined(__WXMICROWIN__) + +// convert between wxDateTime and FILETIME which is a 64-bit value representing +// the number of 100-nanosecond intervals since January 1, 1601. + +static void ConvertFileTimeToWx(wxDateTime *dt, const FILETIME &ft) +{ + FILETIME ftcopy = ft; + FILETIME ftLocal; + if ( !::FileTimeToLocalFileTime(&ftcopy, &ftLocal) ) + { + wxLogLastError(_T("FileTimeToLocalFileTime")); + } + + SYSTEMTIME st; + if ( !::FileTimeToSystemTime(&ftLocal, &st) ) + { + wxLogLastError(_T("FileTimeToSystemTime")); + } + + dt->Set(st.wDay, wxDateTime::Month(st.wMonth - 1), st.wYear, + st.wHour, st.wMinute, st.wSecond, st.wMilliseconds); +} + +static void ConvertWxToFileTime(FILETIME *ft, const wxDateTime& dt) +{ + SYSTEMTIME st; + st.wDay = dt.GetDay(); + st.wMonth = (WORD)(dt.GetMonth() + 1); + st.wYear = (WORD)dt.GetYear(); + st.wHour = dt.GetHour(); + st.wMinute = dt.GetMinute(); + st.wSecond = dt.GetSecond(); + st.wMilliseconds = dt.GetMillisecond(); + + FILETIME ftLocal; + if ( !::SystemTimeToFileTime(&st, &ftLocal) ) + { + wxLogLastError(_T("SystemTimeToFileTime")); + } + + if ( !::LocalFileTimeToFileTime(&ftLocal, ft) ) + { + wxLogLastError(_T("LocalFileTimeToFileTime")); + } +} + +#endif // wxUSE_DATETIME && __WIN32__ + +// return a string with the volume par +static wxString wxGetVolumeString(const wxString& volume, wxPathFormat format) +{ + wxString path; + + if ( !volume.empty() ) + { + format = wxFileName::GetFormat(format); + + // Special Windows UNC paths hack, part 2: undo what we did in + // SplitPath() and make an UNC path if we have a drive which is not a + // single letter (hopefully the network shares can't be one letter only + // although I didn't find any authoritative docs on this) + if ( format == wxPATH_DOS && volume.length() > 1 ) + { + path << wxFILE_SEP_PATH_DOS << wxFILE_SEP_PATH_DOS << volume; + } + else if ( format == wxPATH_DOS || format == wxPATH_VMS ) + { + path << volume << wxFileName::GetVolumeSeparator(format); + } + // else ignore + } + + return path; +} + +// return true if the format used is the DOS/Windows one and the string looks +// like a UNC path +static bool IsUNCPath(const wxString& path, wxPathFormat format) +{ + return format == wxPATH_DOS && + path.length() >= 4 && // "\\a" can't be a UNC path + path[0u] == wxFILE_SEP_PATH_DOS && + path[1u] == wxFILE_SEP_PATH_DOS && + path[2u] != wxFILE_SEP_PATH_DOS; +} + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxFileName construction +// ---------------------------------------------------------------------------- + +void wxFileName::Assign( const wxFileName &filepath ) +{ + m_volume = filepath.GetVolume(); + m_dirs = filepath.GetDirs(); + m_name = filepath.GetName(); + m_ext = filepath.GetExt(); + m_relative = filepath.m_relative; + m_hasExt = filepath.m_hasExt; +} + +void wxFileName::Assign(const wxString& volume, + const wxString& path, + const wxString& name, + const wxString& ext, + bool hasExt, + wxPathFormat format) +{ + // we should ignore paths which look like UNC shares because we already + // have the volume here and the UNC notation (\\server\path) is only valid + // for paths which don't start with a volume, so prevent SetPath() from + // recognizing "\\foo\bar" in "c:\\foo\bar" as an UNC path + // + // note also that this is a rather ugly way to do what we want (passing + // some kind of flag telling to ignore UNC paths to SetPath() would be + // better) but this is the safest thing to do to avoid breaking backwards + // compatibility in 2.8 + if ( IsUNCPath(path, format) ) + { + // remove one of the 2 leading backslashes to ensure that it's not + // recognized as an UNC path by SetPath() + wxString pathNonUNC(path, 1, wxString::npos); + SetPath(pathNonUNC, format); + } + else // no UNC complications + { + SetPath(path, format); + } + + m_volume = volume; + m_ext = ext; + m_name = name; + + m_hasExt = hasExt; +} + +void wxFileName::SetPath( const wxString& pathOrig, wxPathFormat format ) +{ + m_dirs.Clear(); + + if ( pathOrig.empty() ) + { + // no path at all + m_relative = true; + + return; + } + + format = GetFormat( format ); + + // 0) deal with possible volume part first + wxString volume, + path; + SplitVolume(pathOrig, &volume, &path, format); + if ( !volume.empty() ) + { + m_relative = false; + + SetVolume(volume); + } + + // 1) Determine if the path is relative or absolute. + wxChar leadingChar = path[0u]; + + switch (format) + { + case wxPATH_MAC: + m_relative = leadingChar == wxT(':'); + + // We then remove a leading ":". The reason is in our + // storage form for relative paths: + // ":dir:file.txt" actually means "./dir/file.txt" in + // DOS notation and should get stored as + // (relative) (dir) (file.txt) + // "::dir:file.txt" actually means "../dir/file.txt" + // stored as (relative) (..) (dir) (file.txt) + // This is important only for the Mac as an empty dir + // actually means , whereas under DOS, double + // slashes can be ignored: "\\\\" is the same as "\\". + if (m_relative) + path.erase( 0, 1 ); + break; + + case wxPATH_VMS: + // TODO: what is the relative path format here? + m_relative = false; + break; + + default: + wxFAIL_MSG( _T("Unknown path format") ); + // !! Fall through !! + + case wxPATH_UNIX: + // the paths of the form "~" or "~username" are absolute + m_relative = leadingChar != wxT('/') && leadingChar != _T('~'); + break; + + case wxPATH_DOS: + m_relative = !IsPathSeparator(leadingChar, format); + break; + + } + + // 2) Break up the path into its members. If the original path + // was just "/" or "\\", m_dirs will be empty. We know from + // the m_relative field, if this means "nothing" or "root dir". + + wxStringTokenizer tn( path, GetPathSeparators(format) ); + + while ( tn.HasMoreTokens() ) + { + wxString token = tn.GetNextToken(); + + // Remove empty token under DOS and Unix, interpret them + // as .. under Mac. + if (token.empty()) + { + if (format == wxPATH_MAC) + m_dirs.Add( wxT("..") ); + // else ignore + } + else + { + m_dirs.Add( token ); + } + } +} + +void wxFileName::Assign(const wxString& fullpath, + wxPathFormat format) +{ + wxString volume, path, name, ext; + bool hasExt; + SplitPath(fullpath, &volume, &path, &name, &ext, &hasExt, format); + + Assign(volume, path, name, ext, hasExt, format); +} + +void wxFileName::Assign(const wxString& fullpathOrig, + const wxString& fullname, + wxPathFormat format) +{ + // always recognize fullpath as directory, even if it doesn't end with a + // slash + wxString fullpath = fullpathOrig; + if ( !fullpath.empty() && !wxEndsWithPathSeparator(fullpath) ) + { + fullpath += GetPathSeparator(format); + } + + wxString volume, path, name, ext; + bool hasExt; + + // do some consistency checks in debug mode: the name should be really just + // the filename and the path should be really just a path +#ifdef __WXDEBUG__ + wxString volDummy, pathDummy, nameDummy, extDummy; + + SplitPath(fullname, &volDummy, &pathDummy, &name, &ext, &hasExt, format); + + wxASSERT_MSG( volDummy.empty() && pathDummy.empty(), + _T("the file name shouldn't contain the path") ); + + SplitPath(fullpath, &volume, &path, &nameDummy, &extDummy, format); + + wxASSERT_MSG( nameDummy.empty() && extDummy.empty(), + _T("the path shouldn't contain file name nor extension") ); + +#else // !__WXDEBUG__ + SplitPath(fullname, NULL /* no volume */, NULL /* no path */, + &name, &ext, &hasExt, format); + SplitPath(fullpath, &volume, &path, NULL, NULL, format); +#endif // __WXDEBUG__/!__WXDEBUG__ + + Assign(volume, path, name, ext, hasExt, format); +} + +void wxFileName::Assign(const wxString& pathOrig, + const wxString& name, + const wxString& ext, + wxPathFormat format) +{ + wxString volume, + path; + SplitVolume(pathOrig, &volume, &path, format); + + Assign(volume, path, name, ext, format); +} + +void wxFileName::AssignDir(const wxString& dir, wxPathFormat format) +{ + Assign(dir, wxEmptyString, format); +} + +void wxFileName::Clear() +{ + m_dirs.Clear(); + + m_volume = + m_name = + m_ext = wxEmptyString; + + // we don't have any absolute path for now + m_relative = true; + + // nor any extension + m_hasExt = false; +} + +/* static */ +wxFileName wxFileName::FileName(const wxString& file, wxPathFormat format) +{ + return wxFileName(file, format); +} + +/* static */ +wxFileName wxFileName::DirName(const wxString& dir, wxPathFormat format) +{ + wxFileName fn; + fn.AssignDir(dir, format); + return fn; +} + +// ---------------------------------------------------------------------------- +// existence tests +// ---------------------------------------------------------------------------- + +bool wxFileName::FileExists() const +{ + return wxFileName::FileExists( GetFullPath() ); +} + +bool wxFileName::FileExists( const wxString &file ) +{ + return ::wxFileExists( file ); +} + +bool wxFileName::DirExists() const +{ + return wxFileName::DirExists( GetPath() ); +} + +bool wxFileName::DirExists( const wxString &dir ) +{ + return ::wxDirExists( dir ); +} + +// ---------------------------------------------------------------------------- +// CWD and HOME stuff +// ---------------------------------------------------------------------------- + +void wxFileName::AssignCwd(const wxString& volume) +{ + AssignDir(wxFileName::GetCwd(volume)); +} + +/* static */ +wxString wxFileName::GetCwd(const wxString& volume) +{ + // if we have the volume, we must get the current directory on this drive + // and to do this we have to chdir to this volume - at least under Windows, + // I don't know how to get the current drive on another volume elsewhere + // (TODO) + wxString cwdOld; + if ( !volume.empty() ) + { + cwdOld = wxGetCwd(); + SetCwd(volume + GetVolumeSeparator()); + } + + wxString cwd = ::wxGetCwd(); + + if ( !volume.empty() ) + { + SetCwd(cwdOld); + } + + return cwd; +} + +bool wxFileName::SetCwd() +{ + return wxFileName::SetCwd( GetPath() ); +} + +bool wxFileName::SetCwd( const wxString &cwd ) +{ + return ::wxSetWorkingDirectory( cwd ); +} + +void wxFileName::AssignHomeDir() +{ + AssignDir(wxFileName::GetHomeDir()); +} + +wxString wxFileName::GetHomeDir() +{ + return ::wxGetHomeDir(); +} + + +// ---------------------------------------------------------------------------- +// CreateTempFileName +// ---------------------------------------------------------------------------- + +#if wxUSE_FILE || wxUSE_FFILE + + +#if !defined wx_fdopen && defined HAVE_FDOPEN + #define wx_fdopen fdopen +#endif + +// NB: GetTempFileName() under Windows creates the file, so using +// O_EXCL there would fail +#ifdef __WINDOWS__ + #define wxOPEN_EXCL 0 +#else + #define wxOPEN_EXCL O_EXCL +#endif + + +#ifdef wxOpenOSFHandle +#define WX_HAVE_DELETE_ON_CLOSE +// On Windows create a file with the FILE_FLAGS_DELETE_ON_CLOSE flags. +// +static int wxOpenWithDeleteOnClose(const wxString& filename) +{ + DWORD access = GENERIC_READ | GENERIC_WRITE; + + DWORD disposition = OPEN_ALWAYS; + + DWORD attributes = FILE_ATTRIBUTE_TEMPORARY | + FILE_FLAG_DELETE_ON_CLOSE; + + HANDLE h = ::CreateFile(filename, access, 0, NULL, + disposition, attributes, NULL); + + return wxOpenOSFHandle(h, wxO_BINARY); +} +#endif // wxOpenOSFHandle + + +// Helper to open the file +// +static int wxTempOpen(const wxString& path, bool *deleteOnClose) +{ +#ifdef WX_HAVE_DELETE_ON_CLOSE + if (*deleteOnClose) + return wxOpenWithDeleteOnClose(path); +#endif + + *deleteOnClose = false; + + return wxOpen(path, wxO_BINARY | O_RDWR | O_CREAT | wxOPEN_EXCL, 0600); +} + + +#if wxUSE_FFILE +// Helper to open the file and attach it to the wxFFile +// +static bool wxTempOpen(wxFFile *file, const wxString& path, bool *deleteOnClose) +{ +#ifndef wx_fdopen + *deleteOnClose = false; + return file->Open(path, _T("w+b")); +#else // wx_fdopen + int fd = wxTempOpen(path, deleteOnClose); + if (fd == -1) + return false; + file->Attach(wx_fdopen(fd, "w+b")); + return file->IsOpened(); +#endif // wx_fdopen +} +#endif // wxUSE_FFILE + + +#if !wxUSE_FILE + #define WXFILEARGS(x, y) y +#elif !wxUSE_FFILE + #define WXFILEARGS(x, y) x +#else + #define WXFILEARGS(x, y) x, y +#endif + + +// Implementation of wxFileName::CreateTempFileName(). +// +static wxString wxCreateTempImpl( + const wxString& prefix, + WXFILEARGS(wxFile *fileTemp, wxFFile *ffileTemp), + bool *deleteOnClose = NULL) +{ +#if wxUSE_FILE && wxUSE_FFILE + wxASSERT(fileTemp == NULL || ffileTemp == NULL); +#endif + wxString path, dir, name; + bool wantDeleteOnClose = false; + + if (deleteOnClose) + { + // set the result to false initially + wantDeleteOnClose = *deleteOnClose; + *deleteOnClose = false; + } + else + { + // easier if it alwasys points to something + deleteOnClose = &wantDeleteOnClose; + } + + // use the directory specified by the prefix + wxFileName::SplitPath(prefix, &dir, &name, NULL /* extension */); + + if (dir.empty()) + { + dir = wxFileName::GetTempDir(); + } + +#if defined(__WXWINCE__) + path = dir + wxT("\\") + name; + int i = 1; + while (wxFileName::FileExists(path)) + { + path = dir + wxT("\\") + name ; + path << i; + i ++; + } + +#elif defined(__WINDOWS__) && !defined(__WXMICROWIN__) + if ( !::GetTempFileName(dir, name, 0, wxStringBuffer(path, MAX_PATH + 1)) ) + { + wxLogLastError(_T("GetTempFileName")); + + path.clear(); + } + +#else // !Windows + path = dir; + + if ( !wxEndsWithPathSeparator(dir) && + (name.empty() || !wxIsPathSeparator(name[0u])) ) + { + path += wxFILE_SEP_PATH; + } + + path += name; + +#if defined(HAVE_MKSTEMP) + // scratch space for mkstemp() + path += _T("XXXXXX"); + + // we need to copy the path to the buffer in which mkstemp() can modify it + wxCharBuffer buf( wxConvFile.cWX2MB( path ) ); + + // cast is safe because the string length doesn't change + int fdTemp = mkstemp( (char*)(const char*) buf ); + if ( fdTemp == -1 ) + { + // this might be not necessary as mkstemp() on most systems should have + // already done it but it doesn't hurt neither... + path.clear(); + } + else // mkstemp() succeeded + { + path = wxConvFile.cMB2WX( (const char*) buf ); + + #if wxUSE_FILE + // avoid leaking the fd + if ( fileTemp ) + { + fileTemp->Attach(fdTemp); + } + else + #endif + + #if wxUSE_FFILE + if ( ffileTemp ) + { + #ifdef wx_fdopen + ffileTemp->Attach(wx_fdopen(fdTemp, "r+b")); + #else + ffileTemp->Open(path, _T("r+b")); + close(fdTemp); + #endif + } + else + #endif + + { + close(fdTemp); + } + } +#else // !HAVE_MKSTEMP + +#ifdef HAVE_MKTEMP + // same as above + path += _T("XXXXXX"); + + wxCharBuffer buf = wxConvFile.cWX2MB( path ); + if ( !mktemp( (char*)(const char*) buf ) ) + { + path.clear(); + } + else + { + path = wxConvFile.cMB2WX( (const char*) buf ); + } +#else // !HAVE_MKTEMP (includes __DOS__) + // generate the unique file name ourselves + #if !defined(__DOS__) && !defined(__PALMOS__) && (!defined(__MWERKS__) || defined(__DARWIN__) ) + path << (unsigned int)getpid(); + #endif + + wxString pathTry; + + static const size_t numTries = 1000; + for ( size_t n = 0; n < numTries; n++ ) + { + // 3 hex digits is enough for numTries == 1000 < 4096 + pathTry = path + wxString::Format(_T("%.03x"), (unsigned int) n); + if ( !wxFileName::FileExists(pathTry) ) + { + break; + } + + pathTry.clear(); + } + + path = pathTry; +#endif // HAVE_MKTEMP/!HAVE_MKTEMP + +#endif // HAVE_MKSTEMP/!HAVE_MKSTEMP + +#endif // Windows/!Windows + + if ( path.empty() ) + { + wxLogSysError(_("Failed to create a temporary file name")); + } + else + { + bool ok = true; + + // open the file - of course, there is a race condition here, this is + // why we always prefer using mkstemp()... + #if wxUSE_FILE + if ( fileTemp && !fileTemp->IsOpened() ) + { + *deleteOnClose = wantDeleteOnClose; + int fd = wxTempOpen(path, deleteOnClose); + if (fd != -1) + fileTemp->Attach(fd); + else + ok = false; + } + #endif + + #if wxUSE_FFILE + if ( ffileTemp && !ffileTemp->IsOpened() ) + { + *deleteOnClose = wantDeleteOnClose; + ok = wxTempOpen(ffileTemp, path, deleteOnClose); + } + #endif + + if ( !ok ) + { + // FIXME: If !ok here should we loop and try again with another + // file name? That is the standard recourse if open(O_EXCL) + // fails, though of course it should be protected against + // possible infinite looping too. + + wxLogError(_("Failed to open temporary file.")); + + path.clear(); + } + } + + return path; +} + + +static bool wxCreateTempImpl( + const wxString& prefix, + WXFILEARGS(wxFile *fileTemp, wxFFile *ffileTemp), + wxString *name) +{ + bool deleteOnClose = true; + + *name = wxCreateTempImpl(prefix, + WXFILEARGS(fileTemp, ffileTemp), + &deleteOnClose); + + bool ok = !name->empty(); + + if (deleteOnClose) + name->clear(); +#ifdef __UNIX__ + else if (ok && wxRemoveFile(*name)) + name->clear(); +#endif + + return ok; +} + + +static void wxAssignTempImpl( + wxFileName *fn, + const wxString& prefix, + WXFILEARGS(wxFile *fileTemp, wxFFile *ffileTemp)) +{ + wxString tempname; + tempname = wxCreateTempImpl(prefix, WXFILEARGS(fileTemp, ffileTemp)); + + if ( tempname.empty() ) + { + // error, failed to get temp file name + fn->Clear(); + } + else // ok + { + fn->Assign(tempname); + } +} + + +void wxFileName::AssignTempFileName(const wxString& prefix) +{ + wxAssignTempImpl(this, prefix, WXFILEARGS(NULL, NULL)); +} + +/* static */ +wxString wxFileName::CreateTempFileName(const wxString& prefix) +{ + return wxCreateTempImpl(prefix, WXFILEARGS(NULL, NULL)); +} + +#endif // wxUSE_FILE || wxUSE_FFILE + + +#if wxUSE_FILE + +wxString wxCreateTempFileName(const wxString& prefix, + wxFile *fileTemp, + bool *deleteOnClose) +{ + return wxCreateTempImpl(prefix, WXFILEARGS(fileTemp, NULL), deleteOnClose); +} + +bool wxCreateTempFile(const wxString& prefix, + wxFile *fileTemp, + wxString *name) +{ + return wxCreateTempImpl(prefix, WXFILEARGS(fileTemp, NULL), name); +} + +void wxFileName::AssignTempFileName(const wxString& prefix, wxFile *fileTemp) +{ + wxAssignTempImpl(this, prefix, WXFILEARGS(fileTemp, NULL)); +} + +/* static */ +wxString +wxFileName::CreateTempFileName(const wxString& prefix, wxFile *fileTemp) +{ + return wxCreateTempFileName(prefix, fileTemp); +} + +#endif // wxUSE_FILE + + +#if wxUSE_FFILE + +wxString wxCreateTempFileName(const wxString& prefix, + wxFFile *fileTemp, + bool *deleteOnClose) +{ + return wxCreateTempImpl(prefix, WXFILEARGS(NULL, fileTemp), deleteOnClose); +} + +bool wxCreateTempFile(const wxString& prefix, + wxFFile *fileTemp, + wxString *name) +{ + return wxCreateTempImpl(prefix, WXFILEARGS(NULL, fileTemp), name); + +} + +void wxFileName::AssignTempFileName(const wxString& prefix, wxFFile *fileTemp) +{ + wxAssignTempImpl(this, prefix, WXFILEARGS(NULL, fileTemp)); +} + +/* static */ +wxString +wxFileName::CreateTempFileName(const wxString& prefix, wxFFile *fileTemp) +{ + return wxCreateTempFileName(prefix, fileTemp); +} + +#endif // wxUSE_FFILE + + +// ---------------------------------------------------------------------------- +// directory operations +// ---------------------------------------------------------------------------- + +wxString wxFileName::GetTempDir() +{ + wxString dir; + dir = wxGetenv(_T("TMPDIR")); + if (dir.empty()) + { + dir = wxGetenv(_T("TMP")); + if (dir.empty()) + { + dir = wxGetenv(_T("TEMP")); + } + } + +#if defined(__WXWINCE__) + if (dir.empty()) + { + // FIXME. Create \temp dir? + if (DirExists(wxT("\\temp"))) + dir = wxT("\\temp"); + } +#elif defined(__WINDOWS__) && !defined(__WXMICROWIN__) + + if ( dir.empty() ) + { + if ( !::GetTempPath(MAX_PATH, wxStringBuffer(dir, MAX_PATH + 1)) ) + { + wxLogLastError(_T("GetTempPath")); + } + + if ( dir.empty() ) + { + // GetTempFileName() fails if we pass it an empty string + dir = _T('.'); + } + } +#else // !Windows + + if ( dir.empty() ) + { + // default +#if defined(__DOS__) || defined(__OS2__) + dir = _T("."); +#elif defined(__WXMAC__) + dir = wxMacFindFolder(short(kOnSystemDisk), kTemporaryFolderType, kCreateFolder); +#else + dir = _T("/tmp"); +#endif + } +#endif + + return dir; +} + +bool wxFileName::Mkdir( int perm, int flags ) +{ + return wxFileName::Mkdir(GetPath(), perm, flags); +} + +bool wxFileName::Mkdir( const wxString& dir, int perm, int flags ) +{ + if ( flags & wxPATH_MKDIR_FULL ) + { + // split the path in components + wxFileName filename; + filename.AssignDir(dir); + + wxString currPath; + if ( filename.HasVolume()) + { + currPath << wxGetVolumeString(filename.GetVolume(), wxPATH_NATIVE); + } + + wxArrayString dirs = filename.GetDirs(); + size_t count = dirs.GetCount(); + for ( size_t i = 0; i < count; i++ ) + { + if ( i > 0 || +#if defined(__WXMAC__) && !defined(__DARWIN__) + // relative pathnames are exactely the other way round under mac... + !filename.IsAbsolute() +#else + filename.IsAbsolute() +#endif + ) + currPath += wxFILE_SEP_PATH; + currPath += dirs[i]; + + if (!DirExists(currPath)) + { + if (!wxMkdir(currPath, perm)) + { + // no need to try creating further directories + return false; + } + } + } + + return true; + + } + + return ::wxMkdir( dir, perm ); +} + +bool wxFileName::Rmdir() +{ + return wxFileName::Rmdir( GetPath() ); +} + +bool wxFileName::Rmdir( const wxString &dir ) +{ + return ::wxRmdir( dir ); +} + +// ---------------------------------------------------------------------------- +// path normalization +// ---------------------------------------------------------------------------- + +bool wxFileName::Normalize(int flags, + const wxString& cwd, + wxPathFormat format) +{ + // deal with env vars renaming first as this may seriously change the path + if ( flags & wxPATH_NORM_ENV_VARS ) + { + wxString pathOrig = GetFullPath(format); + wxString path = wxExpandEnvVars(pathOrig); + if ( path != pathOrig ) + { + Assign(path); + } + } + + + // the existing path components + wxArrayString dirs = GetDirs(); + + // the path to prepend in front to make the path absolute + wxFileName curDir; + + format = GetFormat(format); + + // set up the directory to use for making the path absolute later + if ( (flags & wxPATH_NORM_ABSOLUTE) && !IsAbsolute(format) ) + { + if ( cwd.empty() ) + { + curDir.AssignCwd(GetVolume()); + } + else // cwd provided + { + curDir.AssignDir(cwd); + } + } + + // handle ~ stuff under Unix only + if ( (format == wxPATH_UNIX) && (flags & wxPATH_NORM_TILDE) ) + { + if ( !dirs.IsEmpty() ) + { + wxString dir = dirs[0u]; + if ( !dir.empty() && dir[0u] == _T('~') ) + { + // to make the path absolute use the home directory + curDir.AssignDir(wxGetUserHome(dir.c_str() + 1)); + + // if we are expanding the tilde, then this path + // *should* be already relative (since we checked for + // the tilde only in the first char of the first dir); + // if m_relative==false, it's because it was initialized + // from a string which started with /~; in that case + // we reach this point but then need m_relative=true + // for relative->absolute expansion later + m_relative = true; + + dirs.RemoveAt(0u); + } + } + } + + // transform relative path into abs one + if ( curDir.IsOk() ) + { + // this path may be relative because it doesn't have the volume name + // and still have m_relative=true; in this case we shouldn't modify + // our directory components but just set the current volume + if ( !HasVolume() && curDir.HasVolume() ) + { + SetVolume(curDir.GetVolume()); + + if ( !m_relative ) + { + // yes, it was the case - we don't need curDir then + curDir.Clear(); + } + } + + // finally, prepend curDir to the dirs array + wxArrayString dirsNew = curDir.GetDirs(); + WX_PREPEND_ARRAY(dirs, dirsNew); + + // if we used e.g. tilde expansion previously and wxGetUserHome didn't + // return for some reason an absolute path, then curDir maybe not be absolute! + if ( curDir.IsAbsolute(format) ) + { + // we have prepended an absolute path and thus we are now an absolute + // file name too + m_relative = false; + } + // else if (flags & wxPATH_NORM_ABSOLUTE): + // should we warn the user that we didn't manage to make the path absolute? + } + + // now deal with ".", ".." and the rest + m_dirs.Empty(); + size_t count = dirs.GetCount(); + for ( size_t n = 0; n < count; n++ ) + { + wxString dir = dirs[n]; + + if ( flags & wxPATH_NORM_DOTS ) + { + if ( dir == wxT(".") ) + { + // just ignore + continue; + } + + if ( dir == wxT("..") ) + { + if ( m_dirs.IsEmpty() ) + { + wxLogError(_("The path '%s' contains too many \"..\"!"), + GetFullPath().c_str()); + return false; + } + + m_dirs.RemoveAt(m_dirs.GetCount() - 1); + continue; + } + } + + if ( (flags & wxPATH_NORM_CASE) && !IsCaseSensitive(format) ) + { + dir.MakeLower(); + } + + m_dirs.Add(dir); + } + +#if defined(__WIN32__) && !defined(__WXWINCE__) && wxUSE_OLE + if ( (flags & wxPATH_NORM_SHORTCUT) ) + { + wxString filename; + if (GetShortcutTarget(GetFullPath(format), filename)) + { + // Repeat this since we may now have a new path + if ( (flags & wxPATH_NORM_CASE) && !IsCaseSensitive(format) ) + { + filename.MakeLower(); + } + m_relative = false; + Assign(filename); + } + } +#endif + + if ( (flags & wxPATH_NORM_CASE) && !IsCaseSensitive(format) ) + { + // VZ: expand env vars here too? + + m_volume.MakeLower(); + m_name.MakeLower(); + m_ext.MakeLower(); + } + +#if defined(__WIN32__) + if ( (flags & wxPATH_NORM_LONG) && (format == wxPATH_DOS) ) + { + Assign(GetLongPath()); + } +#endif // Win32 + + return true; +} + +// ---------------------------------------------------------------------------- +// get the shortcut target +// ---------------------------------------------------------------------------- + +// WinCE (3) doesn't have CLSID_ShellLink, IID_IShellLink definitions. +// The .lnk file is a plain text file so it should be easy to +// make it work. Hint from Google Groups: +// "If you open up a lnk file, you'll see a +// number, followed by a pound sign (#), followed by more text. The +// number is the number of characters that follows the pound sign. The +// characters after the pound sign are the command line (which _can_ +// include arguments) to be executed. Any path (e.g. \windows\program +// files\myapp.exe) that includes spaces needs to be enclosed in +// quotation marks." + +#if defined(__WIN32__) && !defined(__WXWINCE__) && wxUSE_OLE +// The following lines are necessary under WinCE +// #include "wx/msw/private.h" +// #include +#include +#if defined(__WXWINCE__) +#include +#endif + +bool wxFileName::GetShortcutTarget(const wxString& shortcutPath, + wxString& targetFilename, + wxString* arguments) +{ + wxString path, file, ext; + wxSplitPath(shortcutPath, & path, & file, & ext); + + HRESULT hres; + IShellLink* psl; + bool success = false; + + // Assume it's not a shortcut if it doesn't end with lnk + if (ext.CmpNoCase(wxT("lnk"))!=0) + return false; + + // create a ShellLink object + hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, + IID_IShellLink, (LPVOID*) &psl); + + if (SUCCEEDED(hres)) + { + IPersistFile* ppf; + hres = psl->QueryInterface( IID_IPersistFile, (LPVOID *) &ppf); + if (SUCCEEDED(hres)) + { + WCHAR wsz[MAX_PATH]; + + MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, shortcutPath.mb_str(), -1, wsz, + MAX_PATH); + + hres = ppf->Load(wsz, 0); + ppf->Release(); + + if (SUCCEEDED(hres)) + { + wxChar buf[2048]; + // Wrong prototype in early versions +#if defined(__MINGW32__) && !wxCHECK_W32API_VERSION(2, 2) + psl->GetPath((CHAR*) buf, 2048, NULL, SLGP_UNCPRIORITY); +#else + psl->GetPath(buf, 2048, NULL, SLGP_UNCPRIORITY); +#endif + targetFilename = wxString(buf); + success = (shortcutPath != targetFilename); + + psl->GetArguments(buf, 2048); + wxString args(buf); + if (!args.empty() && arguments) + { + *arguments = args; + } + } + } + + psl->Release(); + } + return success; +} + +#endif // __WIN32__ && !__WXWINCE__ + + +// ---------------------------------------------------------------------------- +// absolute/relative paths +// ---------------------------------------------------------------------------- + +bool wxFileName::IsAbsolute(wxPathFormat format) const +{ + // if our path doesn't start with a path separator, it's not an absolute + // path + if ( m_relative ) + return false; + + if ( !GetVolumeSeparator(format).empty() ) + { + // this format has volumes and an absolute path must have one, it's not + // enough to have the full path to bean absolute file under Windows + if ( GetVolume().empty() ) + return false; + } + + return true; +} + +bool wxFileName::MakeRelativeTo(const wxString& pathBase, wxPathFormat format) +{ + wxFileName fnBase = wxFileName::DirName(pathBase, format); + + // get cwd only once - small time saving + wxString cwd = wxGetCwd(); + Normalize(wxPATH_NORM_ALL & ~wxPATH_NORM_CASE, cwd, format); + fnBase.Normalize(wxPATH_NORM_ALL & ~wxPATH_NORM_CASE, cwd, format); + + bool withCase = IsCaseSensitive(format); + + // we can't do anything if the files live on different volumes + if ( !GetVolume().IsSameAs(fnBase.GetVolume(), withCase) ) + { + // nothing done + return false; + } + + // same drive, so we don't need our volume + m_volume.clear(); + + // remove common directories starting at the top + while ( !m_dirs.IsEmpty() && !fnBase.m_dirs.IsEmpty() && + m_dirs[0u].IsSameAs(fnBase.m_dirs[0u], withCase) ) + { + m_dirs.RemoveAt(0); + fnBase.m_dirs.RemoveAt(0); + } + + // add as many ".." as needed + size_t count = fnBase.m_dirs.GetCount(); + for ( size_t i = 0; i < count; i++ ) + { + m_dirs.Insert(wxT(".."), 0u); + } + + if ( format == wxPATH_UNIX || format == wxPATH_DOS ) + { + // a directory made relative with respect to itself is '.' under Unix + // and DOS, by definition (but we don't have to insert "./" for the + // files) + if ( m_dirs.IsEmpty() && IsDir() ) + { + m_dirs.Add(_T('.')); + } + } + + m_relative = true; + + // we were modified + return true; +} + +// ---------------------------------------------------------------------------- +// filename kind tests +// ---------------------------------------------------------------------------- + +bool wxFileName::SameAs(const wxFileName& filepath, wxPathFormat format) const +{ + wxFileName fn1 = *this, + fn2 = filepath; + + // get cwd only once - small time saving + wxString cwd = wxGetCwd(); + fn1.Normalize(wxPATH_NORM_ALL | wxPATH_NORM_CASE, cwd, format); + fn2.Normalize(wxPATH_NORM_ALL | wxPATH_NORM_CASE, cwd, format); + + if ( fn1.GetFullPath() == fn2.GetFullPath() ) + return true; + + // TODO: compare inodes for Unix, this works even when filenames are + // different but files are the same (symlinks) (VZ) + + return false; +} + +/* static */ +bool wxFileName::IsCaseSensitive( wxPathFormat format ) +{ + // only Unix filenames are truely case-sensitive + return GetFormat(format) == wxPATH_UNIX; +} + +/* static */ +wxString wxFileName::GetForbiddenChars(wxPathFormat format) +{ + // Inits to forbidden characters that are common to (almost) all platforms. + wxString strForbiddenChars = wxT("*?"); + + // If asserts, wxPathFormat has been changed. In case of a new path format + // addition, the following code might have to be updated. + wxCOMPILE_TIME_ASSERT(wxPATH_MAX == 5, wxPathFormatChanged); + switch ( GetFormat(format) ) + { + default : + wxFAIL_MSG( wxT("Unknown path format") ); + // !! Fall through !! + + case wxPATH_UNIX: + break; + + case wxPATH_MAC: + // On a Mac even names with * and ? are allowed (Tested with OS + // 9.2.1 and OS X 10.2.5) + strForbiddenChars = wxEmptyString; + break; + + case wxPATH_DOS: + strForbiddenChars += wxT("\\/:\"<>|"); + break; + + case wxPATH_VMS: + break; + } + + return strForbiddenChars; +} + +/* static */ +wxString wxFileName::GetVolumeSeparator(wxPathFormat WXUNUSED_IN_WINCE(format)) +{ +#ifdef __WXWINCE__ + return wxEmptyString; +#else + wxString sepVol; + + if ( (GetFormat(format) == wxPATH_DOS) || + (GetFormat(format) == wxPATH_VMS) ) + { + sepVol = wxFILE_SEP_DSK; + } + //else: leave empty + + return sepVol; +#endif +} + +/* static */ +wxString wxFileName::GetPathSeparators(wxPathFormat format) +{ + wxString seps; + switch ( GetFormat(format) ) + { + case wxPATH_DOS: + // accept both as native APIs do but put the native one first as + // this is the one we use in GetFullPath() + seps << wxFILE_SEP_PATH_DOS << wxFILE_SEP_PATH_UNIX; + break; + + default: + wxFAIL_MSG( _T("Unknown wxPATH_XXX style") ); + // fall through + + case wxPATH_UNIX: + seps = wxFILE_SEP_PATH_UNIX; + break; + + case wxPATH_MAC: + seps = wxFILE_SEP_PATH_MAC; + break; + + case wxPATH_VMS: + seps = wxFILE_SEP_PATH_VMS; + break; + } + + return seps; +} + +/* static */ +wxString wxFileName::GetPathTerminators(wxPathFormat format) +{ + format = GetFormat(format); + + // under VMS the end of the path is ']', not the path separator used to + // separate the components + return format == wxPATH_VMS ? wxString(_T(']')) : GetPathSeparators(format); +} + +/* static */ +bool wxFileName::IsPathSeparator(wxChar ch, wxPathFormat format) +{ + // wxString::Find() doesn't work as expected with NUL - it will always find + // it, so test for it separately + return ch != _T('\0') && GetPathSeparators(format).Find(ch) != wxNOT_FOUND; +} + +// ---------------------------------------------------------------------------- +// path components manipulation +// ---------------------------------------------------------------------------- + +/* static */ bool wxFileName::IsValidDirComponent(const wxString& dir) +{ + if ( dir.empty() ) + { + wxFAIL_MSG( _T("empty directory passed to wxFileName::InsertDir()") ); + + return false; + } + + const size_t len = dir.length(); + for ( size_t n = 0; n < len; n++ ) + { + if ( dir[n] == GetVolumeSeparator() || IsPathSeparator(dir[n]) ) + { + wxFAIL_MSG( _T("invalid directory component in wxFileName") ); + + return false; + } + } + + return true; +} + +void wxFileName::AppendDir( const wxString& dir ) +{ + if ( IsValidDirComponent(dir) ) + m_dirs.Add( dir ); +} + +void wxFileName::PrependDir( const wxString& dir ) +{ + InsertDir(0, dir); +} + +void wxFileName::InsertDir(size_t before, const wxString& dir) +{ + if ( IsValidDirComponent(dir) ) + m_dirs.Insert(dir, before); +} + +void wxFileName::RemoveDir(size_t pos) +{ + m_dirs.RemoveAt(pos); +} + +// ---------------------------------------------------------------------------- +// accessors +// ---------------------------------------------------------------------------- + +void wxFileName::SetFullName(const wxString& fullname) +{ + SplitPath(fullname, NULL /* no volume */, NULL /* no path */, + &m_name, &m_ext, &m_hasExt); +} + +wxString wxFileName::GetFullName() const +{ + wxString fullname = m_name; + if ( m_hasExt ) + { + fullname << wxFILE_SEP_EXT << m_ext; + } + + return fullname; +} + +wxString wxFileName::GetPath( int flags, wxPathFormat format ) const +{ + format = GetFormat( format ); + + wxString fullpath; + + // return the volume with the path as well if requested + if ( flags & wxPATH_GET_VOLUME ) + { + fullpath += wxGetVolumeString(GetVolume(), format); + } + + // the leading character + switch ( format ) + { + case wxPATH_MAC: + if ( m_relative ) + fullpath += wxFILE_SEP_PATH_MAC; + break; + + case wxPATH_DOS: + if ( !m_relative ) + fullpath += wxFILE_SEP_PATH_DOS; + break; + + default: + wxFAIL_MSG( wxT("Unknown path format") ); + // fall through + + case wxPATH_UNIX: + if ( !m_relative ) + { + // normally the absolute file names start with a slash + // with one exception: the ones like "~/foo.bar" don't + // have it + if ( m_dirs.IsEmpty() || m_dirs[0u] != _T('~') ) + { + fullpath += wxFILE_SEP_PATH_UNIX; + } + } + break; + + case wxPATH_VMS: + // no leading character here but use this place to unset + // wxPATH_GET_SEPARATOR flag: under VMS it doesn't make sense + // as, if I understand correctly, there should never be a dot + // before the closing bracket + flags &= ~wxPATH_GET_SEPARATOR; + } + + if ( m_dirs.empty() ) + { + // there is nothing more + return fullpath; + } + + // then concatenate all the path components using the path separator + if ( format == wxPATH_VMS ) + { + fullpath += wxT('['); + } + + const size_t dirCount = m_dirs.GetCount(); + for ( size_t i = 0; i < dirCount; i++ ) + { + switch (format) + { + case wxPATH_MAC: + if ( m_dirs[i] == wxT(".") ) + { + // skip appending ':', this shouldn't be done in this + // case as "::" is interpreted as ".." under Unix + continue; + } + + // convert back from ".." to nothing + if ( !m_dirs[i].IsSameAs(wxT("..")) ) + fullpath += m_dirs[i]; + break; + + default: + wxFAIL_MSG( wxT("Unexpected path format") ); + // still fall through + + case wxPATH_DOS: + case wxPATH_UNIX: + fullpath += m_dirs[i]; + break; + + case wxPATH_VMS: + // TODO: What to do with ".." under VMS + + // convert back from ".." to nothing + if ( !m_dirs[i].IsSameAs(wxT("..")) ) + fullpath += m_dirs[i]; + break; + } + + if ( (flags & wxPATH_GET_SEPARATOR) || (i != dirCount - 1) ) + fullpath += GetPathSeparator(format); + } + + if ( format == wxPATH_VMS ) + { + fullpath += wxT(']'); + } + + return fullpath; +} + +wxString wxFileName::GetFullPath( wxPathFormat format ) const +{ + // we already have a function to get the path + wxString fullpath = GetPath(wxPATH_GET_VOLUME | wxPATH_GET_SEPARATOR, + format); + + // now just add the file name and extension to it + fullpath += GetFullName(); + + return fullpath; +} + +// Return the short form of the path (returns identity on non-Windows platforms) +wxString wxFileName::GetShortPath() const +{ + wxString path(GetFullPath()); + +#if defined(__WXMSW__) && defined(__WIN32__) && !defined(__WXMICROWIN__) && !defined(__WXWINCE__) + DWORD sz = ::GetShortPathName(path, NULL, 0); + if ( sz != 0 ) + { + wxString pathOut; + if ( ::GetShortPathName + ( + path, + wxStringBuffer(pathOut, sz), + sz + ) != 0 ) + { + return pathOut; + } + } +#endif // Windows + + return path; +} + +// Return the long form of the path (returns identity on non-Windows platforms) +wxString wxFileName::GetLongPath() const +{ + wxString pathOut, + path = GetFullPath(); + +#if defined(__WIN32__) && !defined(__WXWINCE__) && !defined(__WXMICROWIN__) + +#if wxUSE_DYNAMIC_LOADER + typedef DWORD (WINAPI *GET_LONG_PATH_NAME)(const wxChar *, wxChar *, DWORD); + + // this is MT-safe as in the worst case we're going to resolve the function + // twice -- but as the result is the same in both threads, it's ok + static GET_LONG_PATH_NAME s_pfnGetLongPathName = NULL; + if ( !s_pfnGetLongPathName ) + { + static bool s_triedToLoad = false; + + if ( !s_triedToLoad ) + { + s_triedToLoad = true; + + wxDynamicLibrary dllKernel(_T("kernel32")); + + const wxChar* GetLongPathName = _T("GetLongPathName") +#if wxUSE_UNICODE + _T("W"); +#else // ANSI + _T("A"); +#endif // Unicode/ANSI + + if ( dllKernel.HasSymbol(GetLongPathName) ) + { + s_pfnGetLongPathName = (GET_LONG_PATH_NAME) + dllKernel.GetSymbol(GetLongPathName); + } + + // note that kernel32.dll can be unloaded, it stays in memory + // anyhow as all Win32 programs link to it and so it's safe to call + // GetLongPathName() even after unloading it + } + } + + if ( s_pfnGetLongPathName ) + { + DWORD dwSize = (*s_pfnGetLongPathName)(path, NULL, 0); + if ( dwSize > 0 ) + { + if ( (*s_pfnGetLongPathName) + ( + path, + wxStringBuffer(pathOut, dwSize), + dwSize + ) != 0 ) + { + return pathOut; + } + } + } +#endif // wxUSE_DYNAMIC_LOADER + + // The OS didn't support GetLongPathName, or some other error. + // We need to call FindFirstFile on each component in turn. + + WIN32_FIND_DATA findFileData; + HANDLE hFind; + + if ( HasVolume() ) + pathOut = GetVolume() + + GetVolumeSeparator(wxPATH_DOS) + + GetPathSeparator(wxPATH_DOS); + else + pathOut = wxEmptyString; + + wxArrayString dirs = GetDirs(); + dirs.Add(GetFullName()); + + wxString tmpPath; + + size_t count = dirs.GetCount(); + for ( size_t i = 0; i < count; i++ ) + { + // We're using pathOut to collect the long-name path, but using a + // temporary for appending the last path component which may be + // short-name + tmpPath = pathOut + dirs[i]; + + if ( tmpPath.empty() ) + continue; + + // can't see this being necessary? MF + if ( tmpPath.Last() == GetVolumeSeparator(wxPATH_DOS) ) + { + // Can't pass a drive and root dir to FindFirstFile, + // so continue to next dir + tmpPath += wxFILE_SEP_PATH; + pathOut = tmpPath; + continue; + } + + hFind = ::FindFirstFile(tmpPath, &findFileData); + if (hFind == INVALID_HANDLE_VALUE) + { + // Error: most likely reason is that path doesn't exist, so + // append any unprocessed parts and return + for ( i += 1; i < count; i++ ) + tmpPath += wxFILE_SEP_PATH + dirs[i]; + + return tmpPath; + } + + pathOut += findFileData.cFileName; + if ( (i < (count-1)) ) + pathOut += wxFILE_SEP_PATH; + + ::FindClose(hFind); + } +#else // !Win32 + pathOut = path; +#endif // Win32/!Win32 + + return pathOut; +} + +wxPathFormat wxFileName::GetFormat( wxPathFormat format ) +{ + if (format == wxPATH_NATIVE) + { +#if defined(__WXMSW__) || defined(__OS2__) || defined(__DOS__) + format = wxPATH_DOS; +#elif defined(__WXMAC__) && !defined(__DARWIN__) + format = wxPATH_MAC; +#elif defined(__VMS) + format = wxPATH_VMS; +#else + format = wxPATH_UNIX; +#endif + } + return format; +} + +// ---------------------------------------------------------------------------- +// path splitting function +// ---------------------------------------------------------------------------- + +/* static */ +void +wxFileName::SplitVolume(const wxString& fullpathWithVolume, + wxString *pstrVolume, + wxString *pstrPath, + wxPathFormat format) +{ + format = GetFormat(format); + + wxString fullpath = fullpathWithVolume; + + // special Windows UNC paths hack: transform \\share\path into share:path + if ( IsUNCPath(fullpath, format) ) + { + fullpath.erase(0, 2); + + size_t posFirstSlash = + fullpath.find_first_of(GetPathTerminators(format)); + if ( posFirstSlash != wxString::npos ) + { + fullpath[posFirstSlash] = wxFILE_SEP_DSK; + + // UNC paths are always absolute, right? (FIXME) + fullpath.insert(posFirstSlash + 1, 1, wxFILE_SEP_PATH_DOS); + } + } + + // We separate the volume here + if ( format == wxPATH_DOS || format == wxPATH_VMS ) + { + wxString sepVol = GetVolumeSeparator(format); + + size_t posFirstColon = fullpath.find_first_of(sepVol); + if ( posFirstColon != wxString::npos ) + { + if ( pstrVolume ) + { + *pstrVolume = fullpath.Left(posFirstColon); + } + + // remove the volume name and the separator from the full path + fullpath.erase(0, posFirstColon + sepVol.length()); + } + } + + if ( pstrPath ) + *pstrPath = fullpath; +} + +/* static */ +void wxFileName::SplitPath(const wxString& fullpathWithVolume, + wxString *pstrVolume, + wxString *pstrPath, + wxString *pstrName, + wxString *pstrExt, + bool *hasExt, + wxPathFormat format) +{ + format = GetFormat(format); + + wxString fullpath; + SplitVolume(fullpathWithVolume, pstrVolume, &fullpath, format); + + // find the positions of the last dot and last path separator in the path + size_t posLastDot = fullpath.find_last_of(wxFILE_SEP_EXT); + size_t posLastSlash = fullpath.find_last_of(GetPathTerminators(format)); + + // check whether this dot occurs at the very beginning of a path component + if ( (posLastDot != wxString::npos) && + (posLastDot == 0 || + IsPathSeparator(fullpath[posLastDot - 1]) || + (format == wxPATH_VMS && fullpath[posLastDot - 1] == _T(']'))) ) + { + // dot may be (and commonly -- at least under Unix -- is) the first + // character of the filename, don't treat the entire filename as + // extension in this case + posLastDot = wxString::npos; + } + + // if we do have a dot and a slash, check that the dot is in the name part + if ( (posLastDot != wxString::npos) && + (posLastSlash != wxString::npos) && + (posLastDot < posLastSlash) ) + { + // the dot is part of the path, not the start of the extension + posLastDot = wxString::npos; + } + + // now fill in the variables provided by user + if ( pstrPath ) + { + if ( posLastSlash == wxString::npos ) + { + // no path at all + pstrPath->Empty(); + } + else + { + // take everything up to the path separator but take care to make + // the path equal to something like '/', not empty, for the files + // immediately under root directory + size_t len = posLastSlash; + + // this rule does not apply to mac since we do not start with colons (sep) + // except for relative paths + if ( !len && format != wxPATH_MAC) + len++; + + *pstrPath = fullpath.Left(len); + + // special VMS hack: remove the initial bracket + if ( format == wxPATH_VMS ) + { + if ( (*pstrPath)[0u] == _T('[') ) + pstrPath->erase(0, 1); + } + } + } + + if ( pstrName ) + { + // take all characters starting from the one after the last slash and + // up to, but excluding, the last dot + size_t nStart = posLastSlash == wxString::npos ? 0 : posLastSlash + 1; + size_t count; + if ( posLastDot == wxString::npos ) + { + // take all until the end + count = wxString::npos; + } + else if ( posLastSlash == wxString::npos ) + { + count = posLastDot; + } + else // have both dot and slash + { + count = posLastDot - posLastSlash - 1; + } + + *pstrName = fullpath.Mid(nStart, count); + } + + // finally deal with the extension here: we have an added complication that + // extension may be empty (but present) as in "foo." where trailing dot + // indicates the empty extension at the end -- and hence we must remember + // that we have it independently of pstrExt + if ( posLastDot == wxString::npos ) + { + // no extension + if ( pstrExt ) + pstrExt->clear(); + if ( hasExt ) + *hasExt = false; + } + else + { + // take everything after the dot + if ( pstrExt ) + *pstrExt = fullpath.Mid(posLastDot + 1); + if ( hasExt ) + *hasExt = true; + } +} + +/* static */ +void wxFileName::SplitPath(const wxString& fullpath, + wxString *path, + wxString *name, + wxString *ext, + wxPathFormat format) +{ + wxString volume; + SplitPath(fullpath, &volume, path, name, ext, format); + + if ( path ) + { + path->Prepend(wxGetVolumeString(volume, format)); + } +} + +// ---------------------------------------------------------------------------- +// time functions +// ---------------------------------------------------------------------------- + +#if wxUSE_DATETIME + +bool wxFileName::SetTimes(const wxDateTime *dtAccess, + const wxDateTime *dtMod, + const wxDateTime *dtCreate) +{ +#if defined(__WIN32__) + if ( IsDir() ) + { + // VZ: please let me know how to do this if you can + wxFAIL_MSG( _T("SetTimes() not implemented for the directories") ); + } + else // file + { + wxFileHandle fh(GetFullPath(), wxFileHandle::Write); + if ( fh.IsOk() ) + { + FILETIME ftAccess, ftCreate, ftWrite; + + if ( dtCreate ) + ConvertWxToFileTime(&ftCreate, *dtCreate); + if ( dtAccess ) + ConvertWxToFileTime(&ftAccess, *dtAccess); + if ( dtMod ) + ConvertWxToFileTime(&ftWrite, *dtMod); + + if ( ::SetFileTime(fh, + dtCreate ? &ftCreate : NULL, + dtAccess ? &ftAccess : NULL, + dtMod ? &ftWrite : NULL) ) + { + return true; + } + } + } +#elif defined(__UNIX_LIKE__) || (defined(__DOS__) && defined(__WATCOMC__)) + wxUnusedVar(dtCreate); + + if ( !dtAccess && !dtMod ) + { + // can't modify the creation time anyhow, don't try + return true; + } + + // if dtAccess or dtMod is not specified, use the other one (which must be + // non NULL because of the test above) for both times + utimbuf utm; + utm.actime = dtAccess ? dtAccess->GetTicks() : dtMod->GetTicks(); + utm.modtime = dtMod ? dtMod->GetTicks() : dtAccess->GetTicks(); + if ( utime(GetFullPath().fn_str(), &utm) == 0 ) + { + return true; + } +#else // other platform + wxUnusedVar(dtAccess); + wxUnusedVar(dtMod); + wxUnusedVar(dtCreate); +#endif // platforms + + wxLogSysError(_("Failed to modify file times for '%s'"), + GetFullPath().c_str()); + + return false; +} + +bool wxFileName::Touch() +{ +#if defined(__UNIX_LIKE__) + // under Unix touching file is simple: just pass NULL to utime() + if ( utime(GetFullPath().fn_str(), NULL) == 0 ) + { + return true; + } + + wxLogSysError(_("Failed to touch the file '%s'"), GetFullPath().c_str()); + + return false; +#else // other platform + wxDateTime dtNow = wxDateTime::Now(); + + return SetTimes(&dtNow, &dtNow, NULL /* don't change create time */); +#endif // platforms +} + +bool wxFileName::GetTimes(wxDateTime *dtAccess, + wxDateTime *dtMod, + wxDateTime *dtCreate) const +{ +#if defined(__WIN32__) + // we must use different methods for the files and directories under + // Windows as CreateFile(GENERIC_READ) doesn't work for the directories and + // CreateFile(FILE_FLAG_BACKUP_SEMANTICS) works -- but only under NT and + // not 9x + bool ok; + FILETIME ftAccess, ftCreate, ftWrite; + if ( IsDir() ) + { + // implemented in msw/dir.cpp + extern bool wxGetDirectoryTimes(const wxString& dirname, + FILETIME *, FILETIME *, FILETIME *); + + // we should pass the path without the trailing separator to + // wxGetDirectoryTimes() + ok = wxGetDirectoryTimes(GetPath(wxPATH_GET_VOLUME), + &ftAccess, &ftCreate, &ftWrite); + } + else // file + { + wxFileHandle fh(GetFullPath(), wxFileHandle::Read); + if ( fh.IsOk() ) + { + ok = ::GetFileTime(fh, + dtCreate ? &ftCreate : NULL, + dtAccess ? &ftAccess : NULL, + dtMod ? &ftWrite : NULL) != 0; + } + else + { + ok = false; + } + } + + if ( ok ) + { + if ( dtCreate ) + ConvertFileTimeToWx(dtCreate, ftCreate); + if ( dtAccess ) + ConvertFileTimeToWx(dtAccess, ftAccess); + if ( dtMod ) + ConvertFileTimeToWx(dtMod, ftWrite); + + return true; + } +#elif defined(__UNIX_LIKE__) || defined(__WXMAC__) || defined(__OS2__) || (defined(__DOS__) && defined(__WATCOMC__)) + // no need to test for IsDir() here + wxStructStat stBuf; + if ( wxStat( GetFullPath().c_str(), &stBuf) == 0 ) + { + if ( dtAccess ) + dtAccess->Set(stBuf.st_atime); + if ( dtMod ) + dtMod->Set(stBuf.st_mtime); + if ( dtCreate ) + dtCreate->Set(stBuf.st_ctime); + + return true; + } +#else // other platform + wxUnusedVar(dtAccess); + wxUnusedVar(dtMod); + wxUnusedVar(dtCreate); +#endif // platforms + + wxLogSysError(_("Failed to retrieve file times for '%s'"), + GetFullPath().c_str()); + + return false; +} + +#endif // wxUSE_DATETIME + + +// ---------------------------------------------------------------------------- +// file size functions +// ---------------------------------------------------------------------------- + +/* static */ +wxULongLong wxFileName::GetSize(const wxString &filename) +{ + if (!wxFileExists(filename)) + return wxInvalidSize; + +#if defined(__WXPALMOS__) + // TODO + return wxInvalidSize; +#elif defined(__WIN32__) + wxFileHandle f(filename, wxFileHandle::Read); + if (!f.IsOk()) + return wxInvalidSize; + + DWORD lpFileSizeHigh; + DWORD ret = GetFileSize(f, &lpFileSizeHigh); + if ( ret == INVALID_FILE_SIZE && ::GetLastError() != NO_ERROR ) + return wxInvalidSize; + + return wxULongLong(lpFileSizeHigh, ret); +#else // ! __WIN32__ + wxStructStat st; +#ifndef wxNEED_WX_UNISTD_H + if (wxStat( filename.fn_str() , &st) != 0) +#else + if (wxStat( filename, &st) != 0) +#endif + return wxInvalidSize; + return wxULongLong(st.st_size); +#endif +} + +/* static */ +wxString wxFileName::GetHumanReadableSize(const wxULongLong &bs, + const wxString &nullsize, + int precision) +{ + static const double KILOBYTESIZE = 1024.0; + static const double MEGABYTESIZE = 1024.0*KILOBYTESIZE; + static const double GIGABYTESIZE = 1024.0*MEGABYTESIZE; + static const double TERABYTESIZE = 1024.0*GIGABYTESIZE; + + if (bs == 0 || bs == wxInvalidSize) + return nullsize; + + double bytesize = bs.ToDouble(); + if (bytesize < KILOBYTESIZE) + return wxString::Format(_("%s B"), bs.ToString().c_str()); + if (bytesize < MEGABYTESIZE) + return wxString::Format(_("%.*f kB"), precision, bytesize/KILOBYTESIZE); + if (bytesize < GIGABYTESIZE) + return wxString::Format(_("%.*f MB"), precision, bytesize/MEGABYTESIZE); + if (bytesize < TERABYTESIZE) + return wxString::Format(_("%.*f GB"), precision, bytesize/GIGABYTESIZE); + + return wxString::Format(_("%.*f TB"), precision, bytesize/TERABYTESIZE); +} + +wxULongLong wxFileName::GetSize() const +{ + return GetSize(GetFullPath()); +} + +wxString wxFileName::GetHumanReadableSize(const wxString &failmsg, int precision) const +{ + return GetHumanReadableSize(GetSize(), failmsg, precision); +} + + +// ---------------------------------------------------------------------------- +// Mac-specific functions +// ---------------------------------------------------------------------------- + +#ifdef __WXMAC__ + +const short kMacExtensionMaxLength = 16 ; +class MacDefaultExtensionRecord +{ +public : + MacDefaultExtensionRecord() + { + m_ext[0] = 0 ; + m_type = m_creator = 0 ; + } + MacDefaultExtensionRecord( const MacDefaultExtensionRecord& from ) + { + wxStrcpy( m_ext , from.m_ext ) ; + m_type = from.m_type ; + m_creator = from.m_creator ; + } + MacDefaultExtensionRecord( const wxChar * extension , OSType type , OSType creator ) + { + wxStrncpy( m_ext , extension , kMacExtensionMaxLength ) ; + m_ext[kMacExtensionMaxLength] = 0 ; + m_type = type ; + m_creator = creator ; + } + wxChar m_ext[kMacExtensionMaxLength] ; + OSType m_type ; + OSType m_creator ; +} ; + +WX_DECLARE_OBJARRAY(MacDefaultExtensionRecord, MacDefaultExtensionArray) ; + +bool gMacDefaultExtensionsInited = false ; + +#include "wx/arrimpl.cpp" + +WX_DEFINE_EXPORTED_OBJARRAY(MacDefaultExtensionArray) ; + +MacDefaultExtensionArray gMacDefaultExtensions ; + +// load the default extensions +MacDefaultExtensionRecord gDefaults[] = +{ + MacDefaultExtensionRecord( wxT("txt") , 'TEXT' , 'ttxt' ) , + MacDefaultExtensionRecord( wxT("tif") , 'TIFF' , '****' ) , + MacDefaultExtensionRecord( wxT("jpg") , 'JPEG' , '****' ) , +} ; + +static void MacEnsureDefaultExtensionsLoaded() +{ + if ( !gMacDefaultExtensionsInited ) + { + // we could load the pc exchange prefs here too + for ( size_t i = 0 ; i < WXSIZEOF( gDefaults ) ; ++i ) + { + gMacDefaultExtensions.Add( gDefaults[i] ) ; + } + gMacDefaultExtensionsInited = true ; + } +} + +bool wxFileName::MacSetTypeAndCreator( wxUint32 type , wxUint32 creator ) +{ + FSRef fsRef ; + FSCatalogInfo catInfo; + FileInfo *finfo ; + + if ( wxMacPathToFSRef( GetFullPath() , &fsRef ) == noErr ) + { + if ( FSGetCatalogInfo (&fsRef, kFSCatInfoFinderInfo, &catInfo, NULL, NULL, NULL) == noErr ) + { + finfo = (FileInfo*)&catInfo.finderInfo; + finfo->fileType = type ; + finfo->fileCreator = creator ; + FSSetCatalogInfo( &fsRef, kFSCatInfoFinderInfo, &catInfo ) ; + return true ; + } + } + return false ; +} + +bool wxFileName::MacGetTypeAndCreator( wxUint32 *type , wxUint32 *creator ) +{ + FSRef fsRef ; + FSCatalogInfo catInfo; + FileInfo *finfo ; + + if ( wxMacPathToFSRef( GetFullPath() , &fsRef ) == noErr ) + { + if ( FSGetCatalogInfo (&fsRef, kFSCatInfoFinderInfo, &catInfo, NULL, NULL, NULL) == noErr ) + { + finfo = (FileInfo*)&catInfo.finderInfo; + *type = finfo->fileType ; + *creator = finfo->fileCreator ; + return true ; + } + } + return false ; +} + +bool wxFileName::MacSetDefaultTypeAndCreator() +{ + wxUint32 type , creator ; + if ( wxFileName::MacFindDefaultTypeAndCreator(GetExt() , &type , + &creator ) ) + { + return MacSetTypeAndCreator( type , creator ) ; + } + return false; +} + +bool wxFileName::MacFindDefaultTypeAndCreator( const wxString& ext , wxUint32 *type , wxUint32 *creator ) +{ + MacEnsureDefaultExtensionsLoaded() ; + wxString extl = ext.Lower() ; + for( int i = gMacDefaultExtensions.Count() - 1 ; i >= 0 ; --i ) + { + if ( gMacDefaultExtensions.Item(i).m_ext == extl ) + { + *type = gMacDefaultExtensions.Item(i).m_type ; + *creator = gMacDefaultExtensions.Item(i).m_creator ; + return true ; + } + } + return false ; +} + +void wxFileName::MacRegisterDefaultTypeAndCreator( const wxString& ext , wxUint32 type , wxUint32 creator ) +{ + MacEnsureDefaultExtensionsLoaded() ; + MacDefaultExtensionRecord rec ; + rec.m_type = type ; + rec.m_creator = creator ; + wxStrncpy( rec.m_ext , ext.Lower().c_str() , kMacExtensionMaxLength ) ; + gMacDefaultExtensions.Add( rec ) ; +} +#endif diff --git a/Externals/wxWidgets/src/common/filepickercmn.cpp b/Externals/wxWidgets/src/common/filepickercmn.cpp new file mode 100644 index 0000000000..87def3dfc7 --- /dev/null +++ b/Externals/wxWidgets/src/common/filepickercmn.cpp @@ -0,0 +1,224 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/common/filepickercmn.cpp +// Purpose: wxFilePickerCtrl class implementation +// Author: Francesco Montorsi (readapted code written by Vadim Zeitlin) +// Modified by: +// Created: 15/04/2006 +// RCS-ID: $Id: filepickercmn.cpp 42219 2006-10-21 19:53:05Z PC $ +// Copyright: (c) Vadim Zeitlin, Francesco Montorsi +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_FILEPICKERCTRL || wxUSE_DIRPICKERCTRL + +#include "wx/filepicker.h" +#include "wx/filename.h" + +#ifndef WX_PRECOMP + #include "wx/textctrl.h" +#endif + +// ============================================================================ +// implementation +// ============================================================================ + +const wxChar wxFilePickerCtrlNameStr[] = wxT("filepicker"); +const wxChar wxFilePickerWidgetNameStr[] = wxT("filepickerwidget"); +const wxChar wxDirPickerCtrlNameStr[] = wxT("dirpicker"); +const wxChar wxDirPickerWidgetNameStr[] = wxT("dirpickerwidget"); +const wxChar wxFilePickerWidgetLabel[] = wxT("Browse"); +const wxChar wxDirPickerWidgetLabel[] = wxT("Browse"); + +DEFINE_EVENT_TYPE(wxEVT_COMMAND_FILEPICKER_CHANGED) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_DIRPICKER_CHANGED) +IMPLEMENT_DYNAMIC_CLASS(wxFileDirPickerEvent, wxCommandEvent) + +// ---------------------------------------------------------------------------- +// wxFileDirPickerCtrlBase +// ---------------------------------------------------------------------------- + +bool wxFileDirPickerCtrlBase::CreateBase(wxWindow *parent, + wxWindowID id, + const wxString &path, + const wxString &message, + const wxString &wildcard, + const wxPoint &pos, + const wxSize &size, + long style, + const wxValidator& validator, + const wxString &name ) +{ + wxASSERT_MSG(path.empty() || CheckPath(path), wxT("Invalid initial path!")); + + if (!wxPickerBase::CreateBase(parent, id, path, pos, size, + style, validator, name)) + return false; + + if (!HasFlag(wxFLP_OPEN) && !HasFlag(wxFLP_SAVE)) + m_windowStyle |= wxFLP_OPEN; // wxFD_OPEN is the default + + // check that the styles are not contradictory + wxASSERT_MSG( !(HasFlag(wxFLP_SAVE) && HasFlag(wxFLP_OPEN)), + _T("can't specify both wxFLP_SAVE and wxFLP_OPEN at once") ); + + wxASSERT_MSG( !HasFlag(wxFLP_SAVE) || !HasFlag(wxFLP_FILE_MUST_EXIST), + _T("wxFLP_FILE_MUST_EXIST can't be used with wxFLP_SAVE" ) ); + + wxASSERT_MSG( !HasFlag(wxFLP_OPEN) || !HasFlag(wxFLP_OVERWRITE_PROMPT), + _T("wxFLP_OVERWRITE_PROMPT can't be used with wxFLP_OPEN") ); + + // create a wxFilePickerWidget or a wxDirPickerWidget... + m_pickerIface = CreatePicker(this, path, message, wildcard); + if ( !m_pickerIface ) + return false; + m_picker = m_pickerIface->AsControl(); + + // complete sizer creation + wxPickerBase::PostCreation(); + + m_picker->Connect(GetEventType(), + wxFileDirPickerEventHandler(wxFileDirPickerCtrlBase::OnFileDirChange), + NULL, this); + + // default's wxPickerBase textctrl limit is too small for this control: + // make it bigger + if (m_text) m_text->SetMaxLength(512); + + return true; +} + +wxString wxFileDirPickerCtrlBase::GetPath() const +{ + return m_pickerIface->GetPath(); +} + +void wxFileDirPickerCtrlBase::SetPath(const wxString &path) +{ + m_pickerIface->SetPath(path); + UpdateTextCtrlFromPicker(); +} + +void wxFileDirPickerCtrlBase::UpdatePickerFromTextCtrl() +{ + wxASSERT(m_text); + + if (m_bIgnoreNextTextCtrlUpdate) + { + // ignore this update + m_bIgnoreNextTextCtrlUpdate = false; + return; + } + + // remove the eventually present path-separator from the end of the textctrl + // string otherwise we would generate a wxFileDirPickerEvent when changing + // from e.g. /home/user to /home/user/ and we want to avoid it ! + wxString newpath(GetTextCtrlValue()); + if (!CheckPath(newpath)) + return; // invalid user input + + if (m_pickerIface->GetPath() != newpath) + { + m_pickerIface->SetPath(newpath); + + // update current working directory, if necessary + // NOTE: the path separator is required because if newpath is "C:" + // then no change would happen + if (IsCwdToUpdate()) + wxSetWorkingDirectory(newpath); + + // fire an event + wxFileDirPickerEvent event(GetEventType(), this, GetId(), newpath); + GetEventHandler()->ProcessEvent(event); + } +} + +void wxFileDirPickerCtrlBase::UpdateTextCtrlFromPicker() +{ + if (!m_text) + return; // no textctrl to update + + // NOTE: this SetValue() will generate an unwanted wxEVT_COMMAND_TEXT_UPDATED + // which will trigger a unneeded UpdateFromTextCtrl(); thus before using + // SetValue() we set the m_bIgnoreNextTextCtrlUpdate flag... + m_bIgnoreNextTextCtrlUpdate = true; + m_text->SetValue(m_pickerIface->GetPath()); +} + + + +// ---------------------------------------------------------------------------- +// wxFileDirPickerCtrlBase - event handlers +// ---------------------------------------------------------------------------- + +void wxFileDirPickerCtrlBase::OnFileDirChange(wxFileDirPickerEvent &ev) +{ + UpdateTextCtrlFromPicker(); + + // the wxFilePickerWidget sent us a colour-change notification. + // forward this event to our parent + wxFileDirPickerEvent event(GetEventType(), this, GetId(), ev.GetPath()); + GetEventHandler()->ProcessEvent(event); +} + +#endif // wxUSE_FILEPICKERCTRL || wxUSE_DIRPICKERCTRL + +// ---------------------------------------------------------------------------- +// wxFileDirPickerCtrl +// ---------------------------------------------------------------------------- + +#if wxUSE_FILEPICKERCTRL + +IMPLEMENT_DYNAMIC_CLASS(wxFilePickerCtrl, wxPickerBase) + +bool wxFilePickerCtrl::CheckPath(const wxString& path) const +{ + // if wxFLP_SAVE was given or wxFLP_FILE_MUST_EXIST has NOT been given we + // must accept any path + return HasFlag(wxFLP_SAVE) || + !HasFlag(wxFLP_FILE_MUST_EXIST) || + wxFileName::FileExists(path); +} + +wxString wxFilePickerCtrl::GetTextCtrlValue() const +{ + // filter it through wxFileName to remove any spurious path separator + return wxFileName(m_text->GetValue()).GetFullPath(); +} + +#endif // wxUSE_FILEPICKERCTRL + +// ---------------------------------------------------------------------------- +// wxDirPickerCtrl +// ---------------------------------------------------------------------------- + +#if wxUSE_DIRPICKERCTRL +IMPLEMENT_DYNAMIC_CLASS(wxDirPickerCtrl, wxPickerBase) + +bool wxDirPickerCtrl::CheckPath(const wxString& path) const +{ + // if wxDIRP_DIR_MUST_EXIST has NOT been given we must accept any path + return !HasFlag(wxDIRP_DIR_MUST_EXIST) || wxFileName::DirExists(path); +} + +wxString wxDirPickerCtrl::GetTextCtrlValue() const +{ + // filter it through wxFileName to remove any spurious path separator + return wxFileName::DirName(m_text->GetValue()).GetPath(); +} + +#endif // wxUSE_DIRPICKERCTRL diff --git a/Externals/wxWidgets/src/common/filesys.cpp b/Externals/wxWidgets/src/common/filesys.cpp new file mode 100644 index 0000000000..763b22fb1b --- /dev/null +++ b/Externals/wxWidgets/src/common/filesys.cpp @@ -0,0 +1,684 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/filesys.cpp +// Purpose: wxFileSystem class - interface for opening files +// Author: Vaclav Slavik +// Copyright: (c) 1999 Vaclav Slavik +// CVS-ID: $Id: filesys.cpp 46574 2007-06-21 11:24:31Z VZ $ +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + + +#if wxUSE_FILESYSTEM + +#include "wx/filesys.h" + +#ifndef WX_PRECOMP + #include "wx/log.h" + #include "wx/module.h" +#endif + +#include "wx/wfstream.h" +#include "wx/mimetype.h" +#include "wx/filename.h" +#include "wx/tokenzr.h" +#include "wx/uri.h" +#include "wx/private/fileback.h" + + +//-------------------------------------------------------------------------------- +// wxFileSystemHandler +//-------------------------------------------------------------------------------- + +IMPLEMENT_ABSTRACT_CLASS(wxFileSystemHandler, wxObject) + + +wxString wxFileSystemHandler::GetMimeTypeFromExt(const wxString& location) +{ + wxString ext, mime; + wxString loc = GetRightLocation(location); + wxChar c; + int l = loc.length(), l2; + + l2 = l; + for (int i = l-1; i >= 0; i--) + { + c = loc[(unsigned int) i]; + if ( c == wxT('#') ) + l2 = i + 1; + if ( c == wxT('.') ) + { + ext = loc.Right(l2-i-1); + break; + } + if ( (c == wxT('/')) || (c == wxT('\\')) || (c == wxT(':')) ) + return wxEmptyString; + } + +#if wxUSE_MIMETYPE + static bool s_MinimalMimeEnsured = false; + if (!s_MinimalMimeEnsured) + { + static const wxFileTypeInfo fallbacks[] = + { + wxFileTypeInfo(_T("image/jpeg"), + wxEmptyString, + wxEmptyString, + _T("JPEG image (from fallback)"), + _T("jpg"), _T("jpeg"), _T("JPG"), _T("JPEG"), NULL), + wxFileTypeInfo(_T("image/gif"), + wxEmptyString, + wxEmptyString, + _T("GIF image (from fallback)"), + _T("gif"), _T("GIF"), NULL), + wxFileTypeInfo(_T("image/png"), + wxEmptyString, + wxEmptyString, + _T("PNG image (from fallback)"), + _T("png"), _T("PNG"), NULL), + wxFileTypeInfo(_T("image/bmp"), + wxEmptyString, + wxEmptyString, + _T("windows bitmap image (from fallback)"), + _T("bmp"), _T("BMP"), NULL), + wxFileTypeInfo(_T("text/html"), + wxEmptyString, + wxEmptyString, + _T("HTML document (from fallback)"), + _T("htm"), _T("html"), _T("HTM"), _T("HTML"), NULL), + // must terminate the table with this! + wxFileTypeInfo() + }; + wxTheMimeTypesManager->AddFallbacks(fallbacks); + s_MinimalMimeEnsured = true; + } + + wxFileType *ft = wxTheMimeTypesManager->GetFileTypeFromExtension(ext); + if ( !ft || !ft -> GetMimeType(&mime) ) + { + mime = wxEmptyString; + } + + delete ft; + + return mime; +#else + if ( ext.IsSameAs(wxT("htm"), false) || ext.IsSameAs(_T("html"), false) ) + return wxT("text/html"); + if ( ext.IsSameAs(wxT("jpg"), false) || ext.IsSameAs(_T("jpeg"), false) ) + return wxT("image/jpeg"); + if ( ext.IsSameAs(wxT("gif"), false) ) + return wxT("image/gif"); + if ( ext.IsSameAs(wxT("png"), false) ) + return wxT("image/png"); + if ( ext.IsSameAs(wxT("bmp"), false) ) + return wxT("image/bmp"); + return wxEmptyString; +#endif +} + + + +wxString wxFileSystemHandler::GetProtocol(const wxString& location) const +{ + wxString s = wxEmptyString; + int i, l = location.length(); + bool fnd = false; + + for (i = l-1; (i >= 0) && ((location[i] != wxT('#')) || (!fnd)); i--) { + if ((location[i] == wxT(':')) && (i != 1 /*win: C:\path*/)) fnd = true; + } + if (!fnd) return wxT("file"); + for (++i; (i < l) && (location[i] != wxT(':')); i++) s << location[i]; + return s; +} + + +wxString wxFileSystemHandler::GetLeftLocation(const wxString& location) const +{ + int i; + bool fnd = false; + + for (i = location.length()-1; i >= 0; i--) { + if ((location[i] == wxT(':')) && (i != 1 /*win: C:\path*/)) fnd = true; + else if (fnd && (location[i] == wxT('#'))) return location.Left(i); + } + return wxEmptyString; +} + +wxString wxFileSystemHandler::GetRightLocation(const wxString& location) const +{ + int i, l = location.length(); + int l2 = l + 1; + + for (i = l-1; + (i >= 0) && + ((location[i] != wxT(':')) || (i == 1) || (location[i-2] == wxT(':'))); + i--) + { + if (location[i] == wxT('#')) l2 = i + 1; + } + if (i == 0) return wxEmptyString; + else return location.Mid(i + 1, l2 - i - 2); +} + +wxString wxFileSystemHandler::GetAnchor(const wxString& location) const +{ + wxChar c; + int l = location.length(); + + for (int i = l-1; i >= 0; i--) { + c = location[i]; + if (c == wxT('#')) return location.Right(l-i-1); + else if ((c == wxT('.')) || (c == wxT('/')) || (c == wxT('\\')) || (c == wxT(':'))) return wxEmptyString; + } + return wxEmptyString; +} + + +wxString wxFileSystemHandler::FindFirst(const wxString& WXUNUSED(spec), + int WXUNUSED(flags)) +{ + return wxEmptyString; +} + +wxString wxFileSystemHandler::FindNext() +{ + return wxEmptyString; +} + +//-------------------------------------------------------------------------------- +// wxLocalFSHandler +//-------------------------------------------------------------------------------- + + +wxString wxLocalFSHandler::ms_root; + +bool wxLocalFSHandler::CanOpen(const wxString& location) +{ + return GetProtocol(location) == wxT("file"); +} + +wxFSFile* wxLocalFSHandler::OpenFile(wxFileSystem& WXUNUSED(fs), const wxString& location) +{ + // location has Unix path separators + wxString right = GetRightLocation(location); + wxFileName fn = wxFileSystem::URLToFileName(right); + wxString fullpath = ms_root + fn.GetFullPath(); + + if (!wxFileExists(fullpath)) + return (wxFSFile*) NULL; + + // we need to check whether we can really read from this file, otherwise + // wxFSFile is not going to work +#if wxUSE_FFILE + wxFFileInputStream *is = new wxFFileInputStream(fullpath); +#elif wxUSE_FILE + wxFileInputStream *is = new wxFileInputStream(fullpath); +#else +#error One of wxUSE_FILE or wxUSE_FFILE must be set to 1 for wxFSHandler to work +#endif + if ( !is->Ok() ) + { + delete is; + return (wxFSFile*) NULL; + } + + return new wxFSFile(is, + right, + GetMimeTypeFromExt(location), + GetAnchor(location) +#if wxUSE_DATETIME + ,wxDateTime(wxFileModificationTime(fullpath)) +#endif // wxUSE_DATETIME + ); +} + +wxString wxLocalFSHandler::FindFirst(const wxString& spec, int flags) +{ + wxFileName fn = wxFileSystem::URLToFileName(GetRightLocation(spec)); + return wxFindFirstFile(ms_root + fn.GetFullPath(), flags); +} + +wxString wxLocalFSHandler::FindNext() +{ + return wxFindNextFile(); +} + + + +//----------------------------------------------------------------------------- +// wxFileSystem +//----------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxFileSystem, wxObject) +IMPLEMENT_ABSTRACT_CLASS(wxFSFile, wxObject) + + +wxList wxFileSystem::m_Handlers; + + +wxFileSystem::~wxFileSystem() +{ + WX_CLEAR_HASH_MAP(wxFSHandlerHash, m_LocalHandlers) +} + + +static wxString MakeCorrectPath(const wxString& path) +{ + wxString p(path); + wxString r; + int i, j, cnt; + + cnt = p.length(); + for (i = 0; i < cnt; i++) + if (p.GetChar(i) == wxT('\\')) p.GetWritableChar(i) = wxT('/'); // Want to be windows-safe + + if (p.Left(2) == wxT("./")) { p = p.Mid(2); cnt -= 2; } + + if (cnt < 3) return p; + + r << p.GetChar(0) << p.GetChar(1); + + // skip trailing ../.., if any + for (i = 2; i < cnt && (p.GetChar(i) == wxT('/') || p.GetChar(i) == wxT('.')); i++) r << p.GetChar(i); + + // remove back references: translate dir1/../dir2 to dir2 + for (; i < cnt; i++) + { + r << p.GetChar(i); + if (p.GetChar(i) == wxT('/') && p.GetChar(i-1) == wxT('.') && p.GetChar(i-2) == wxT('.')) + { + for (j = r.length() - 2; j >= 0 && r.GetChar(j) != wxT('/') && r.GetChar(j) != wxT(':'); j--) {} + if (j >= 0 && r.GetChar(j) != wxT(':')) + { + for (j = j - 1; j >= 0 && r.GetChar(j) != wxT('/') && r.GetChar(j) != wxT(':'); j--) {} + r.Remove(j + 1); + } + } + } + + for (; i < cnt; i++) r << p.GetChar(i); + + return r; +} + + +void wxFileSystem::ChangePathTo(const wxString& location, bool is_dir) +{ + int i, pathpos = -1; + + m_Path = MakeCorrectPath(location); + + if (is_dir) + { + if (m_Path.length() > 0 && m_Path.Last() != wxT('/') && m_Path.Last() != wxT(':')) + m_Path << wxT('/'); + } + + else + { + for (i = m_Path.length()-1; i >= 0; i--) + { + if (m_Path[(unsigned int) i] == wxT('/')) + { + if ((i > 1) && (m_Path[(unsigned int) (i-1)] == wxT('/')) && (m_Path[(unsigned int) (i-2)] == wxT(':'))) + { + i -= 2; + continue; + } + else + { + pathpos = i; + break; + } + } + else if (m_Path[(unsigned int) i] == wxT(':')) { + pathpos = i; + break; + } + } + if (pathpos == -1) + { + for (i = 0; i < (int) m_Path.length(); i++) + { + if (m_Path[(unsigned int) i] == wxT(':')) + { + m_Path.Remove(i+1); + break; + } + } + if (i == (int) m_Path.length()) + m_Path = wxEmptyString; + } + else + { + m_Path.Remove(pathpos+1); + } + } +} + + + +wxFileSystemHandler *wxFileSystem::MakeLocal(wxFileSystemHandler *h) +{ + wxClassInfo *classinfo = h->GetClassInfo(); + + if (classinfo->IsDynamic()) + { + wxFileSystemHandler*& local = m_LocalHandlers[classinfo]; + if (!local) + local = (wxFileSystemHandler*)classinfo->CreateObject(); + return local; + } + else + { + return h; + } +} + + + +wxFSFile* wxFileSystem::OpenFile(const wxString& location, int flags) +{ + if ((flags & wxFS_READ) == 0) + return NULL; + + wxString loc = MakeCorrectPath(location); + unsigned i, ln; + wxChar meta; + wxFSFile *s = NULL; + wxList::compatibility_iterator node; + + ln = loc.length(); + meta = 0; + for (i = 0; i < ln; i++) + { + switch (loc[i]) + { + case wxT('/') : case wxT(':') : case wxT('#') : + meta = loc[i]; + break; + } + if (meta != 0) break; + } + m_LastName = wxEmptyString; + + // try relative paths first : + if (meta != wxT(':')) + { + node = m_Handlers.GetFirst(); + while (node) + { + wxFileSystemHandler *h = (wxFileSystemHandler*) node -> GetData(); + if (h->CanOpen(m_Path + loc)) + { + s = MakeLocal(h)->OpenFile(*this, m_Path + loc); + if (s) { m_LastName = m_Path + loc; break; } + } + node = node->GetNext(); + } + } + + // if failed, try absolute paths : + if (s == NULL) + { + node = m_Handlers.GetFirst(); + while (node) + { + wxFileSystemHandler *h = (wxFileSystemHandler*) node->GetData(); + if (h->CanOpen(loc)) + { + s = MakeLocal(h)->OpenFile(*this, loc); + if (s) { m_LastName = loc; break; } + } + node = node->GetNext(); + } + } + + if (s && (flags & wxFS_SEEKABLE) != 0 && !s->GetStream()->IsSeekable()) + { + wxBackedInputStream *stream; + stream = new wxBackedInputStream(s->DetachStream()); + stream->FindLength(); + s->SetStream(stream); + } + + return (s); +} + + + +wxString wxFileSystem::FindFirst(const wxString& spec, int flags) +{ + wxList::compatibility_iterator node; + wxString spec2(spec); + + m_FindFileHandler = NULL; + + for (int i = spec2.length()-1; i >= 0; i--) + if (spec2[(unsigned int) i] == wxT('\\')) spec2.GetWritableChar(i) = wxT('/'); // Want to be windows-safe + + node = m_Handlers.GetFirst(); + while (node) + { + wxFileSystemHandler *h = (wxFileSystemHandler*) node -> GetData(); + if (h -> CanOpen(m_Path + spec2)) + { + m_FindFileHandler = MakeLocal(h); + return m_FindFileHandler -> FindFirst(m_Path + spec2, flags); + } + node = node->GetNext(); + } + + node = m_Handlers.GetFirst(); + while (node) + { + wxFileSystemHandler *h = (wxFileSystemHandler*) node -> GetData(); + if (h -> CanOpen(spec2)) + { + m_FindFileHandler = MakeLocal(h); + return m_FindFileHandler -> FindFirst(spec2, flags); + } + node = node->GetNext(); + } + + return wxEmptyString; +} + + + +wxString wxFileSystem::FindNext() +{ + if (m_FindFileHandler == NULL) return wxEmptyString; + else return m_FindFileHandler -> FindNext(); +} + +bool wxFileSystem::FindFileInPath(wxString *pStr, + const wxChar *path, + const wxChar *basename) +{ + // we assume that it's not empty + wxCHECK_MSG( !wxIsEmpty(basename), false, + _T("empty file name in wxFileSystem::FindFileInPath")); + + // skip path separator in the beginning of the file name if present + if ( wxIsPathSeparator(*basename) ) + basename++; + + wxStringTokenizer tokenizer(path, wxPATH_SEP); + while ( tokenizer.HasMoreTokens() ) + { + wxString strFile = tokenizer.GetNextToken(); + if ( !wxEndsWithPathSeparator(strFile) ) + strFile += wxFILE_SEP_PATH; + strFile += basename; + + wxFSFile *file = OpenFile(strFile); + if ( file ) + { + delete file; + *pStr = strFile; + return true; + } + } + + return false; +} + +void wxFileSystem::AddHandler(wxFileSystemHandler *handler) +{ + // prepend the handler to the beginning of the list because handlers added + // last should have the highest priority to allow overriding them + m_Handlers.Insert((size_t)0, handler); +} + +wxFileSystemHandler* wxFileSystem::RemoveHandler(wxFileSystemHandler *handler) +{ + // if handler has already been removed (or deleted) + // we return NULL. This is by design in case + // CleanUpHandlers() is called before RemoveHandler + // is called, as we cannot control the order + // which modules are unloaded + if (!m_Handlers.DeleteObject(handler)) + return NULL; + + return handler; +} + + +bool wxFileSystem::HasHandlerForPath(const wxString &location) +{ + for ( wxList::compatibility_iterator node = m_Handlers.GetFirst(); + node; node = node->GetNext() ) + { + wxFileSystemHandler *h = (wxFileSystemHandler*) node->GetData(); + if (h->CanOpen(location)) + return true; + } + + return false; +} + +void wxFileSystem::CleanUpHandlers() +{ + WX_CLEAR_LIST(wxList, m_Handlers); +} + +static const wxString g_unixPathString(wxT("/")); +static const wxString g_nativePathString(wxFILE_SEP_PATH); + +// Returns the native path for a file URL +wxFileName wxFileSystem::URLToFileName(const wxString& url) +{ + wxString path = url; + + if ( path.Find(wxT("file://")) == 0 ) + { + path = path.Mid(7); + } + else if ( path.Find(wxT("file:")) == 0 ) + { + path = path.Mid(5); + } + // Remove preceding double slash on Mac Classic +#if defined(__WXMAC__) && !defined(__UNIX__) + else if ( path.Find(wxT("//")) == 0 ) + path = path.Mid(2); +#endif + + path = wxURI::Unescape(path); + +#ifdef __WXMSW__ + // file urls either start with a forward slash (local harddisk), + // otherwise they have a servername/sharename notation, + // which only exists on msw and corresponds to a unc + if ( path[0u] == wxT('/') && path [1u] != wxT('/')) + { + path = path.Mid(1); + } + else if ( (url.Find(wxT("file://")) == 0) && + (path.Find(wxT('/')) != wxNOT_FOUND) && + (path.length() > 1) && (path[1u] != wxT(':')) ) + { + path = wxT("//") + path; + } +#endif + + path.Replace(g_unixPathString, g_nativePathString); + + return wxFileName(path, wxPATH_NATIVE); +} + +// Returns the file URL for a native path +wxString wxFileSystem::FileNameToURL(const wxFileName& filename) +{ + wxFileName fn = filename; + fn.Normalize(wxPATH_NORM_DOTS | wxPATH_NORM_TILDE | wxPATH_NORM_ABSOLUTE); + wxString url = fn.GetFullPath(wxPATH_NATIVE); + +#ifndef __UNIX__ + // unc notation, wxMSW + if ( url.Find(wxT("\\\\")) == 0 ) + { + url = wxT("//") + url.Mid(2); + } + else + { + url = wxT("/") + url; +#ifdef __WXMAC__ + url = wxT("/") + url; +#endif + + } +#endif + + url.Replace(g_nativePathString, g_unixPathString); + url.Replace(wxT("%"), wxT("%25")); // '%'s must be replaced first! + url.Replace(wxT("#"), wxT("%23")); + url.Replace(wxT(":"), wxT("%3A")); + url = wxT("file:") + url; + return url; +} + + +///// Module: + +class wxFileSystemModule : public wxModule +{ + DECLARE_DYNAMIC_CLASS(wxFileSystemModule) + + public: + wxFileSystemModule() : + wxModule(), + m_handler(NULL) + { + } + + virtual bool OnInit() + { + m_handler = new wxLocalFSHandler; + wxFileSystem::AddHandler(m_handler); + return true; + } + virtual void OnExit() + { + delete wxFileSystem::RemoveHandler(m_handler); + + wxFileSystem::CleanUpHandlers(); + } + + private: + wxFileSystemHandler* m_handler; + +}; + +IMPLEMENT_DYNAMIC_CLASS(wxFileSystemModule, wxModule) + +#endif + // wxUSE_FILESYSTEM diff --git a/Externals/wxWidgets/src/common/filtall.cpp b/Externals/wxWidgets/src/common/filtall.cpp new file mode 100644 index 0000000000..69f595e450 --- /dev/null +++ b/Externals/wxWidgets/src/common/filtall.cpp @@ -0,0 +1,36 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/filtall.cpp +// Purpose: Link all filter streams +// Author: Mike Wetherell +// RCS-ID: $Id: filtall.cpp 42412 2006-10-25 20:41:12Z MW $ +// Copyright: (c) 2006 Mike Wetherell +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_STREAMS + +#if wxUSE_ZLIB +#include "wx/zstream.h" +#endif + +// Reference filter classes to ensure they are linked into a statically +// linked program that uses Find or GetFirst to look for an filter handler. +// It is in its own file so that the user can override this behaviour by +// providing their own implementation. + +void wxUseFilterClasses() +{ +#if wxUSE_ZLIB + wxZlibClassFactory(); + wxGzipClassFactory(); +#endif +} + +#endif // wxUSE_STREAMS diff --git a/Externals/wxWidgets/src/common/filtfind.cpp b/Externals/wxWidgets/src/common/filtfind.cpp new file mode 100644 index 0000000000..7da889a768 --- /dev/null +++ b/Externals/wxWidgets/src/common/filtfind.cpp @@ -0,0 +1,43 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/filtfind.cpp +// Purpose: Streams for filter formats +// Author: Mike Wetherell +// RCS-ID: $Id: filtfind.cpp 42412 2006-10-25 20:41:12Z MW $ +// Copyright: (c) Mike Wetherell +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_STREAMS + +#include "wx/stream.h" + +// These functions are in a separate file so that statically linked apps +// that do not call them to search for filter handlers will only link in +// the filter classes they use. + +const wxFilterClassFactory * +wxFilterClassFactory::Find(const wxChar *protocol, wxStreamProtocolType type) +{ + for (const wxFilterClassFactory *f = GetFirst(); f; f = f->GetNext()) + if (f->CanHandle(protocol, type)) + return f; + + return NULL; +} + +// static +const wxFilterClassFactory *wxFilterClassFactory::GetFirst() +{ + if (!sm_first) + wxUseFilterClasses(); + return sm_first; +} + +#endif // wxUSE_STREAMS diff --git a/Externals/wxWidgets/src/common/fldlgcmn.cpp b/Externals/wxWidgets/src/common/fldlgcmn.cpp new file mode 100644 index 0000000000..e949d68fe8 --- /dev/null +++ b/Externals/wxWidgets/src/common/fldlgcmn.cpp @@ -0,0 +1,348 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/fldlgcmn.cpp +// Purpose: wxFileDialog common functions +// Author: John Labenski +// Modified by: +// Created: 14.06.03 (extracted from src/*/filedlg.cpp) +// RCS-ID: $Id: fldlgcmn.cpp 47482 2007-07-15 14:12:08Z VS $ +// Copyright: (c) Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifdef __BORLANDC__ +#pragma hdrstop +#endif + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#if wxUSE_FILEDLG + +#include "wx/filedlg.h" +#include "wx/dirdlg.h" + +#ifndef WX_PRECOMP + #include "wx/string.h" + #include "wx/intl.h" + #include "wx/window.h" +#endif // WX_PRECOMP + +//---------------------------------------------------------------------------- +// wxFileDialogBase +//---------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxFileDialogBase, wxDialog) + +void wxFileDialogBase::Init() +{ + m_filterIndex = + m_windowStyle = 0; +} + +bool wxFileDialogBase::Create(wxWindow *parent, + const wxString& message, + const wxString& defaultDir, + const wxString& defaultFile, + const wxString& wildCard, + long style, + const wxPoint& WXUNUSED(pos), + const wxSize& WXUNUSED(sz), + const wxString& WXUNUSED(name)) +{ + m_message = message; + m_dir = defaultDir; + m_fileName = defaultFile; + m_wildCard = wildCard; + + m_parent = parent; + m_windowStyle = style; + m_filterIndex = 0; + + if (!HasFdFlag(wxFD_OPEN) && !HasFdFlag(wxFD_SAVE)) + m_windowStyle |= wxFD_OPEN; // wxFD_OPEN is the default + + // check that the styles are not contradictory + wxASSERT_MSG( !(HasFdFlag(wxFD_SAVE) && HasFdFlag(wxFD_OPEN)), + _T("can't specify both wxFD_SAVE and wxFD_OPEN at once") ); + + wxASSERT_MSG( !HasFdFlag(wxFD_SAVE) || + (!HasFdFlag(wxFD_MULTIPLE) && !HasFdFlag(wxFD_FILE_MUST_EXIST)), + _T("wxFD_MULTIPLE or wxFD_FILE_MUST_EXIST can't be used with wxFD_SAVE" ) ); + + wxASSERT_MSG( !HasFdFlag(wxFD_OPEN) || !HasFdFlag(wxFD_OVERWRITE_PROMPT), + _T("wxFD_OVERWRITE_PROMPT can't be used with wxFD_OPEN") ); + + if ( wildCard.empty() || wildCard == wxFileSelectorDefaultWildcardStr ) + { + m_wildCard = wxString::Format(_("All files (%s)|%s"), + wxFileSelectorDefaultWildcardStr, + wxFileSelectorDefaultWildcardStr); + } + else // have wild card + { + // convert m_wildCard from "*.bar" to "bar files (*.bar)|*.bar" + if ( m_wildCard.Find(wxT('|')) == wxNOT_FOUND ) + { + wxString::size_type nDot = m_wildCard.find(_T("*.")); + if ( nDot != wxString::npos ) + nDot++; + else + nDot = 0; + + m_wildCard = wxString::Format + ( + _("%s files (%s)|%s"), + wildCard.c_str() + nDot, + wildCard.c_str(), + wildCard.c_str() + ); + } + } + + return true; +} + +#if WXWIN_COMPATIBILITY_2_4 +// Parses the filterStr, returning the number of filters. +// Returns 0 if none or if there's a problem. +// filterStr is in the form: "All files (*.*)|*.*|JPEG Files (*.jpeg)|*.jpg" +int wxFileDialogBase::ParseWildcard(const wxString& filterStr, + wxArrayString& descriptions, + wxArrayString& filters) +{ + return ::wxParseCommonDialogsFilter(filterStr, descriptions, filters); +} +#endif // WXWIN_COMPATIBILITY_2_4 + +#if WXWIN_COMPATIBILITY_2_6 +long wxFileDialogBase::GetStyle() const +{ + return GetWindowStyle(); +} + +void wxFileDialogBase::SetStyle(long style) +{ + SetWindowStyle(style); +} +#endif // WXWIN_COMPATIBILITY_2_6 + + +wxString wxFileDialogBase::AppendExtension(const wxString &filePath, + const wxString &extensionList) +{ + // strip off path, to avoid problems with "path.bar/foo" + wxString fileName = filePath.AfterLast(wxFILE_SEP_PATH); + + // if fileName is of form "foo.bar" it's ok, return it + int idx_dot = fileName.Find(wxT('.'), true); + if ((idx_dot != wxNOT_FOUND) && (idx_dot < (int)fileName.length() - 1)) + return filePath; + + // get the first extension from extensionList, or all of it + wxString ext = extensionList.BeforeFirst(wxT(';')); + + // if ext == "foo" or "foo." there's no extension + int idx_ext_dot = ext.Find(wxT('.'), true); + if ((idx_ext_dot == wxNOT_FOUND) || (idx_ext_dot == (int)ext.length() - 1)) + return filePath; + else + ext = ext.AfterLast(wxT('.')); + + // if ext == "*" or "bar*" or "b?r" or " " then its not valid + if ((ext.Find(wxT('*')) != wxNOT_FOUND) || + (ext.Find(wxT('?')) != wxNOT_FOUND) || + (ext.Strip(wxString::both).empty())) + return filePath; + + // if fileName doesn't have a '.' then add one + if (filePath.Last() != wxT('.')) + ext = wxT(".") + ext; + + return filePath + ext; +} + +//---------------------------------------------------------------------------- +// wxFileDialog convenience functions +//---------------------------------------------------------------------------- + +wxString wxFileSelector(const wxChar *title, + const wxChar *defaultDir, + const wxChar *defaultFileName, + const wxChar *defaultExtension, + const wxChar *filter, + int flags, + wxWindow *parent, + int x, int y) +{ + // The defaultExtension, if non-NULL, is + // appended to the filename if the user fails to type an extension. The new + // implementation (taken from wxFileSelectorEx) appends the extension + // automatically, by looking at the filter specification. In fact this + // should be better than the native Microsoft implementation because + // Windows only allows *one* default extension, whereas here we do the + // right thing depending on the filter the user has chosen. + + // If there's a default extension specified but no filter, we create a + // suitable filter. + + wxString filter2; + if ( !wxIsEmpty(defaultExtension) && wxIsEmpty(filter) ) + filter2 = wxString(wxT("*.")) + defaultExtension; + else if ( !wxIsEmpty(filter) ) + filter2 = filter; + + wxString defaultDirString; + if (!wxIsEmpty(defaultDir)) + defaultDirString = defaultDir; + + wxString defaultFilenameString; + if (!wxIsEmpty(defaultFileName)) + defaultFilenameString = defaultFileName; + + wxFileDialog fileDialog(parent, title, defaultDirString, + defaultFilenameString, filter2, + flags, wxPoint(x, y)); + + // if filter is of form "All files (*)|*|..." set correct filter index + if((wxStrlen(defaultExtension) != 0) && (filter2.Find(wxT('|')) != wxNOT_FOUND)) + { + int filterIndex = 0; + + wxArrayString descriptions, filters; + // don't care about errors, handled already by wxFileDialog + (void)wxParseCommonDialogsFilter(filter2, descriptions, filters); + for (size_t n=0; n 0) + fileDialog.SetFilterIndex(filterIndex); + } + + wxString filename; + if ( fileDialog.ShowModal() == wxID_OK ) + { + filename = fileDialog.GetPath(); + } + + return filename; +} + +//---------------------------------------------------------------------------- +// wxFileSelectorEx +//---------------------------------------------------------------------------- + +wxString wxFileSelectorEx(const wxChar *title, + const wxChar *defaultDir, + const wxChar *defaultFileName, + int* defaultFilterIndex, + const wxChar *filter, + int flags, + wxWindow* parent, + int x, + int y) + +{ + wxFileDialog fileDialog(parent, + !wxIsEmpty(title) ? title : wxEmptyString, + !wxIsEmpty(defaultDir) ? defaultDir : wxEmptyString, + !wxIsEmpty(defaultFileName) ? defaultFileName : wxEmptyString, + !wxIsEmpty(filter) ? filter : wxEmptyString, + flags, wxPoint(x, y)); + + wxString filename; + if ( fileDialog.ShowModal() == wxID_OK ) + { + if ( defaultFilterIndex ) + *defaultFilterIndex = fileDialog.GetFilterIndex(); + + filename = fileDialog.GetPath(); + } + + return filename; +} + +//---------------------------------------------------------------------------- +// wxDefaultFileSelector - Generic load/save dialog (for internal use only) +//---------------------------------------------------------------------------- + +static wxString wxDefaultFileSelector(bool load, + const wxChar *what, + const wxChar *extension, + const wxChar *default_name, + wxWindow *parent) +{ + wxString prompt; + wxString str; + if (load) + str = _("Load %s file"); + else + str = _("Save %s file"); + prompt.Printf(str, what); + + wxString wild; + const wxChar *ext = extension; + if ( !wxIsEmpty(ext) ) + { + if ( *ext == wxT('.') ) + ext++; + + wild.Printf(wxT("*.%s"), ext); + } + else // no extension specified + { + wild = wxFileSelectorDefaultWildcardStr; + } + + return wxFileSelector(prompt, NULL, default_name, ext, wild, + load ? wxFD_OPEN : wxFD_SAVE, parent); +} + +//---------------------------------------------------------------------------- +// wxLoadFileSelector +//---------------------------------------------------------------------------- + +WXDLLEXPORT wxString wxLoadFileSelector(const wxChar *what, + const wxChar *extension, + const wxChar *default_name, + wxWindow *parent) +{ + return wxDefaultFileSelector(true, what, extension, default_name, parent); +} + +//---------------------------------------------------------------------------- +// wxSaveFileSelector +//---------------------------------------------------------------------------- + +WXDLLEXPORT wxString wxSaveFileSelector(const wxChar *what, + const wxChar *extension, + const wxChar *default_name, + wxWindow *parent) +{ + return wxDefaultFileSelector(false, what, extension, default_name, parent); +} + + +//---------------------------------------------------------------------------- +// wxDirDialogBase +//---------------------------------------------------------------------------- + +#if WXWIN_COMPATIBILITY_2_6 +long wxDirDialogBase::GetStyle() const +{ + return GetWindowStyle(); +} + +void wxDirDialogBase::SetStyle(long style) +{ + SetWindowStyle(style); +} +#endif // WXWIN_COMPATIBILITY_2_6 + + +#endif // wxUSE_FILEDLG diff --git a/Externals/wxWidgets/src/common/fmapbase.cpp b/Externals/wxWidgets/src/common/fmapbase.cpp new file mode 100644 index 0000000000..1650132780 --- /dev/null +++ b/Externals/wxWidgets/src/common/fmapbase.cpp @@ -0,0 +1,737 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/common/fmapbase.cpp +// Purpose: wxFontMapperBase class implementation +// Author: Vadim Zeitlin +// Modified by: +// Created: 21.06.2003 (extracted from common/fontmap.cpp) +// RCS-ID: $Id: fmapbase.cpp 43063 2006-11-04 20:48:04Z VZ $ +// Copyright: (c) 1999-2003 Vadim Zeitlin +// License: wxWindows license +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// for compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_FONTMAP + +#ifndef WX_PRECOMP + #include "wx/app.h" + #include "wx/log.h" + #include "wx/intl.h" + #include "wx/module.h" +#endif //WX_PRECOMP + +#if defined(__WXMSW__) + #include "wx/msw/private.h" // includes windows.h for LOGFONT + #include "wx/msw/winundef.h" +#endif + +#include "wx/fontmap.h" +#include "wx/fmappriv.h" + +#include "wx/apptrait.h" + +// wxMemoryConfig uses wxFileConfig +#if wxUSE_CONFIG && wxUSE_FILECONFIG + #include "wx/config.h" + #include "wx/memconf.h" +#endif + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// encodings supported by GetEncodingDescription +static wxFontEncoding gs_encodings[] = +{ + wxFONTENCODING_ISO8859_1, + wxFONTENCODING_ISO8859_2, + wxFONTENCODING_ISO8859_3, + wxFONTENCODING_ISO8859_4, + wxFONTENCODING_ISO8859_5, + wxFONTENCODING_ISO8859_6, + wxFONTENCODING_ISO8859_7, + wxFONTENCODING_ISO8859_8, + wxFONTENCODING_ISO8859_9, + wxFONTENCODING_ISO8859_10, + wxFONTENCODING_ISO8859_11, + wxFONTENCODING_ISO8859_12, + wxFONTENCODING_ISO8859_13, + wxFONTENCODING_ISO8859_14, + wxFONTENCODING_ISO8859_15, + wxFONTENCODING_KOI8, + wxFONTENCODING_KOI8_U, + wxFONTENCODING_CP874, + wxFONTENCODING_CP932, + wxFONTENCODING_CP936, + wxFONTENCODING_CP949, + wxFONTENCODING_CP950, + wxFONTENCODING_CP1250, + wxFONTENCODING_CP1251, + wxFONTENCODING_CP1252, + wxFONTENCODING_CP1253, + wxFONTENCODING_CP1254, + wxFONTENCODING_CP1255, + wxFONTENCODING_CP1256, + wxFONTENCODING_CP1257, + wxFONTENCODING_CP437, + wxFONTENCODING_UTF7, + wxFONTENCODING_UTF8, + wxFONTENCODING_UTF16BE, + wxFONTENCODING_UTF16LE, + wxFONTENCODING_UTF32BE, + wxFONTENCODING_UTF32LE, + wxFONTENCODING_EUC_JP, + wxFONTENCODING_DEFAULT, + wxFONTENCODING_BIG5, + wxFONTENCODING_SHIFT_JIS, + wxFONTENCODING_GB2312, +}; + +// the descriptions for them +static const wxChar* gs_encodingDescs[] = +{ + wxTRANSLATE( "Western European (ISO-8859-1)" ), + wxTRANSLATE( "Central European (ISO-8859-2)" ), + wxTRANSLATE( "Esperanto (ISO-8859-3)" ), + wxTRANSLATE( "Baltic (old) (ISO-8859-4)" ), + wxTRANSLATE( "Cyrillic (ISO-8859-5)" ), + wxTRANSLATE( "Arabic (ISO-8859-6)" ), + wxTRANSLATE( "Greek (ISO-8859-7)" ), + wxTRANSLATE( "Hebrew (ISO-8859-8)" ), + wxTRANSLATE( "Turkish (ISO-8859-9)" ), + wxTRANSLATE( "Nordic (ISO-8859-10)" ), + wxTRANSLATE( "Thai (ISO-8859-11)" ), + wxTRANSLATE( "Indian (ISO-8859-12)" ), + wxTRANSLATE( "Baltic (ISO-8859-13)" ), + wxTRANSLATE( "Celtic (ISO-8859-14)" ), + wxTRANSLATE( "Western European with Euro (ISO-8859-15)" ), + wxTRANSLATE( "KOI8-R" ), + wxTRANSLATE( "KOI8-U" ), + wxTRANSLATE( "Windows Thai (CP 874)" ), + wxTRANSLATE( "Windows Japanese (CP 932)" ), + wxTRANSLATE( "Windows Chinese Simplified (CP 936)" ), + wxTRANSLATE( "Windows Korean (CP 949)" ), + wxTRANSLATE( "Windows Chinese Traditional (CP 950)" ), + wxTRANSLATE( "Windows Central European (CP 1250)" ), + wxTRANSLATE( "Windows Cyrillic (CP 1251)" ), + wxTRANSLATE( "Windows Western European (CP 1252)" ), + wxTRANSLATE( "Windows Greek (CP 1253)" ), + wxTRANSLATE( "Windows Turkish (CP 1254)" ), + wxTRANSLATE( "Windows Hebrew (CP 1255)" ), + wxTRANSLATE( "Windows Arabic (CP 1256)" ), + wxTRANSLATE( "Windows Baltic (CP 1257)" ), + wxTRANSLATE( "Windows/DOS OEM (CP 437)" ), + wxTRANSLATE( "Unicode 7 bit (UTF-7)" ), + wxTRANSLATE( "Unicode 8 bit (UTF-8)" ), +#ifdef WORDS_BIGENDIAN + wxTRANSLATE( "Unicode 16 bit (UTF-16)" ), + wxTRANSLATE( "Unicode 16 bit Little Endian (UTF-16LE)" ), + wxTRANSLATE( "Unicode 32 bit (UTF-32)" ), + wxTRANSLATE( "Unicode 32 bit Little Endian (UTF-32LE)" ), +#else // WORDS_BIGENDIAN + wxTRANSLATE( "Unicode 16 bit Big Endian (UTF-16BE)" ), + wxTRANSLATE( "Unicode 16 bit (UTF-16)" ), + wxTRANSLATE( "Unicode 32 bit Big Endian (UTF-32BE)" ), + wxTRANSLATE( "Unicode 32 bit (UTF-32)" ), +#endif // WORDS_BIGENDIAN + wxTRANSLATE( "Extended Unix Codepage for Japanese (EUC-JP)" ), + wxTRANSLATE( "US-ASCII" ), + wxTRANSLATE( "BIG5" ), + wxTRANSLATE( "SHIFT-JIS" ), + wxTRANSLATE( "GB-2312" ), +}; + +// and the internal names (these are not translated on purpose!) +static const wxChar* gs_encodingNames[WXSIZEOF(gs_encodingDescs)][9] = +{ + // names from the columns correspond to these OS: + // Linux Solaris and IRIX HP-UX AIX + { _T("ISO-8859-1"), _T("ISO8859-1"), _T("iso88591"), _T("8859-1"), wxT("iso_8859_1"), NULL }, + { _T("ISO-8859-2"), _T("ISO8859-2"), _T("iso88592"), _T("8859-2"), NULL }, + { _T("ISO-8859-3"), _T("ISO8859-3"), _T("iso88593"), _T("8859-3"), NULL }, + { _T("ISO-8859-4"), _T("ISO8859-4"), _T("iso88594"), _T("8859-4"), NULL }, + { _T("ISO-8859-5"), _T("ISO8859-5"), _T("iso88595"), _T("8859-5"), NULL }, + { _T("ISO-8859-6"), _T("ISO8859-6"), _T("iso88596"), _T("8859-6"), NULL }, + { _T("ISO-8859-7"), _T("ISO8859-7"), _T("iso88597"), _T("8859-7"), NULL }, + { _T("ISO-8859-8"), _T("ISO8859-8"), _T("iso88598"), _T("8859-8"), NULL }, + { _T("ISO-8859-9"), _T("ISO8859-9"), _T("iso88599"), _T("8859-9"), NULL }, + { _T("ISO-8859-10"), _T("ISO8859-10"), _T("iso885910"), _T("8859-10"), NULL }, + { _T("ISO-8859-11"), _T("ISO8859-11"), _T("iso885911"), _T("8859-11"), NULL }, + { _T("ISO-8859-12"), _T("ISO8859-12"), _T("iso885912"), _T("8859-12"), NULL }, + { _T("ISO-8859-13"), _T("ISO8859-13"), _T("iso885913"), _T("8859-13"), NULL }, + { _T("ISO-8859-14"), _T("ISO8859-14"), _T("iso885914"), _T("8859-14"), NULL }, + { _T("ISO-8859-15"), _T("ISO8859-15"), _T("iso885915"), _T("8859-15"), NULL }, + + // although koi8-ru is not strictly speaking the same as koi8-r, + // they are similar enough to make mapping it to koi8 better than + // not recognizing it at all + { wxT( "KOI8-R" ), wxT( "KOI8-RU" ), NULL }, + { wxT( "KOI8-U" ), NULL }, + + { wxT( "WINDOWS-874" ), wxT( "CP-874" ), NULL }, + { wxT( "WINDOWS-932" ), wxT( "CP-932" ), NULL }, + { wxT( "WINDOWS-936" ), wxT( "CP-936" ), NULL }, + { wxT( "WINDOWS-949" ), wxT( "CP-949" ), wxT( "EUC-KR" ), wxT( "eucKR" ), wxT( "euc_kr" ), NULL }, + { wxT( "WINDOWS-950" ), wxT( "CP-950" ), NULL }, + { wxT( "WINDOWS-1250" ),wxT( "CP-1250" ), NULL }, + { wxT( "WINDOWS-1251" ),wxT( "CP-1251" ), NULL }, + { wxT( "WINDOWS-1252" ),wxT( "CP-1252" ), wxT("IBM-1252"), NULL }, + { wxT( "WINDOWS-1253" ),wxT( "CP-1253" ), NULL }, + { wxT( "WINDOWS-1254" ),wxT( "CP-1254" ), NULL }, + { wxT( "WINDOWS-1255" ),wxT( "CP-1255" ), NULL }, + { wxT( "WINDOWS-1256" ),wxT( "CP-1256" ), NULL }, + { wxT( "WINDOWS-1257" ),wxT( "CP-1257" ), NULL }, + { wxT( "WINDOWS-437" ), wxT( "CP-437" ), NULL }, + + { wxT( "UTF-7" ), wxT("utf7"), NULL }, + { wxT( "UTF-8" ), wxT("utf8"), NULL }, +#ifdef WORDS_BIGENDIAN + { wxT( "UTF-16BE" ), wxT("UCS-2BE"), wxT( "UTF-16" ), wxT("UCS-2"), wxT("UCS2"), NULL }, + { wxT( "UTF-16LE" ), wxT("UCS-2LE"), NULL }, + { wxT( "UTF-32BE" ), wxT( "UCS-4BE" ), wxT( "UTF-32" ), wxT( "UCS-4" ), wxT("UCS4"), NULL }, + { wxT( "UTF-32LE" ), wxT( "UCS-4LE" ), NULL }, +#else // WORDS_BIGENDIAN + { wxT( "UTF-16BE" ), wxT("UCS-2BE"), NULL }, + { wxT( "UTF-16LE" ), wxT("UCS-2LE"), wxT( "UTF-16" ), wxT("UCS-2"), wxT("UCS2"), NULL }, + { wxT( "UTF-32BE" ), wxT( "UCS-4BE" ), NULL }, + { wxT( "UTF-32LE" ), wxT( "UCS-4LE" ), wxT( "UTF-32" ), wxT( "UCS-4" ), wxT("UCS4"), NULL }, +#endif // WORDS_BIGENDIAN + + { wxT( "EUC-JP" ), wxT( "eucJP" ), wxT( "euc_jp" ), wxT( "IBM-eucJP" ), NULL }, + + // 646 is for Solaris, roman8 -- for HP-UX + { wxT( "US-ASCII" ), wxT( "ASCII" ), wxT("C"), wxT("POSIX"), wxT("ANSI_X3.4-1968"), + wxT("646"), wxT("roman8"), wxT( "" ), NULL }, + + { wxT( "BIG5" ), wxT("big5"), NULL }, + { wxT( "SJIS" ), wxT( "SHIFT-JIS" ), wxT( "SHIFT_JIS" ), NULL }, + { wxT( "GB2312" ), NULL }, +}; + +wxCOMPILE_TIME_ASSERT( WXSIZEOF(gs_encodingDescs) == WXSIZEOF(gs_encodings), EncodingsArraysNotInSync ); +wxCOMPILE_TIME_ASSERT( WXSIZEOF(gs_encodingNames) == WXSIZEOF(gs_encodings), EncodingsArraysNotInSync ); + +// ---------------------------------------------------------------------------- +// private classes +// ---------------------------------------------------------------------------- + +// clean up the font mapper object +class wxFontMapperModule : public wxModule +{ +public: + wxFontMapperModule() : wxModule() { } + + virtual bool OnInit() + { + // a dummy wxFontMapperBase object could have been created during the + // program startup before wxApp was created, we have to delete it to + // allow creating the real font mapper next time it is needed now that + // we can create it (when the modules are initialized, wxApp object + // already exists) + wxFontMapperBase *fm = wxFontMapperBase::Get(); + if ( fm && fm->IsDummy() ) + wxFontMapperBase::Reset(); + + return true; + } + + virtual void OnExit() + { + wxFontMapperBase::Reset(); + } + + DECLARE_DYNAMIC_CLASS(wxFontMapperModule) +}; + +IMPLEMENT_DYNAMIC_CLASS(wxFontMapperModule, wxModule) + + +// ============================================================================ +// wxFontMapperBase implementation +// ============================================================================ + +wxFontMapper *wxFontMapperBase::sm_instance = NULL; + +// ---------------------------------------------------------------------------- +// ctor and dtor +// ---------------------------------------------------------------------------- + +wxFontMapperBase::wxFontMapperBase() +{ +#if wxUSE_CONFIG && wxUSE_FILECONFIG + m_configDummy = NULL; +#endif // wxUSE_CONFIG +} + +wxFontMapperBase::~wxFontMapperBase() +{ +#if wxUSE_CONFIG && wxUSE_FILECONFIG + if ( m_configDummy ) + delete m_configDummy; +#endif // wxUSE_CONFIG +} + +/* static */ +wxFontMapperBase *wxFontMapperBase::Get() +{ + if ( !sm_instance ) + { + wxAppTraits *traits = wxTheApp ? wxTheApp->GetTraits() : NULL; + if ( traits ) + { + sm_instance = traits->CreateFontMapper(); + + wxASSERT_MSG( sm_instance, + _T("wxAppTraits::CreateFontMapper() failed") ); + } + + if ( !sm_instance ) + { + // last resort: we must create something because the existing code + // relies on always having a valid font mapper object + sm_instance = (wxFontMapper *)new wxFontMapperBase; + } + } + + return (wxFontMapperBase*)sm_instance; +} + +/* static */ +wxFontMapper *wxFontMapperBase::Set(wxFontMapper *mapper) +{ + wxFontMapper *old = sm_instance; + sm_instance = mapper; + return old; +} + +/* static */ +void wxFontMapperBase::Reset() +{ + if ( sm_instance ) + { + // we need a cast as wxFontMapper is not fully declared here and so the + // compiler can't know that it derives from wxFontMapperBase (but + // run-time behaviour will be correct because the dtor is virtual) + delete (wxFontMapperBase *)sm_instance; + sm_instance = NULL; + } +} + +#if wxUSE_CONFIG && wxUSE_FILECONFIG + +// ---------------------------------------------------------------------------- +// config usage customisation +// ---------------------------------------------------------------------------- + +/* static */ +const wxChar *wxFontMapperBase::GetDefaultConfigPath() +{ + return FONTMAPPER_ROOT_PATH; +} + +void wxFontMapperBase::SetConfigPath(const wxString& prefix) +{ + wxCHECK_RET( !prefix.empty() && prefix[0] == wxCONFIG_PATH_SEPARATOR, + wxT("an absolute path should be given to wxFontMapper::SetConfigPath()") ); + + m_configRootPath = prefix; +} + +// ---------------------------------------------------------------------------- +// get config object and path for it +// ---------------------------------------------------------------------------- + +wxConfigBase *wxFontMapperBase::GetConfig() +{ + wxConfigBase *config = wxConfig::Get(false); + + // If there is no global configuration, use an internal memory configuration + if ( !config ) + { + if ( !m_configDummy ) + m_configDummy = new wxMemoryConfig; + config = m_configDummy; + + // FIXME: ideally, we should add keys from dummy config to a real one later, + // but it is a low-priority task because typical wxWin application + // either doesn't use wxConfig at all or creates wxConfig object in + // wxApp::OnInit(), before any real interaction with the user takes + // place... + } + + return config; +} + +const wxString& wxFontMapperBase::GetConfigPath() +{ + if ( !m_configRootPath ) + { + // use the default + m_configRootPath = GetDefaultConfigPath(); + } + + return m_configRootPath; +} + +// ---------------------------------------------------------------------------- +// config helpers +// ---------------------------------------------------------------------------- + +bool wxFontMapperBase::ChangePath(const wxString& pathNew, wxString *pathOld) +{ + wxConfigBase *config = GetConfig(); + if ( !config ) + return false; + + *pathOld = config->GetPath(); + + wxString path = GetConfigPath(); + if ( path.empty() || path.Last() != wxCONFIG_PATH_SEPARATOR ) + { + path += wxCONFIG_PATH_SEPARATOR; + } + + wxASSERT_MSG( !pathNew || (pathNew[0] != wxCONFIG_PATH_SEPARATOR), + wxT("should be a relative path") ); + + path += pathNew; + + config->SetPath(path); + + return true; +} + +void wxFontMapperBase::RestorePath(const wxString& pathOld) +{ + GetConfig()->SetPath(pathOld); +} + +#endif + +// ---------------------------------------------------------------------------- +// charset/encoding correspondence +// ---------------------------------------------------------------------------- + +wxFontEncoding +wxFontMapperBase::CharsetToEncoding(const wxString& charset, + bool WXUNUSED(interactive)) +{ + int enc = NonInteractiveCharsetToEncoding(charset); + if ( enc == wxFONTENCODING_UNKNOWN ) + { + // we should return wxFONTENCODING_SYSTEM from here for unknown + // encodings + enc = wxFONTENCODING_SYSTEM; + } + + return (wxFontEncoding)enc; +} + +int +wxFontMapperBase::NonInteractiveCharsetToEncoding(const wxString& charset) +{ + wxFontEncoding encoding = wxFONTENCODING_SYSTEM; + + // we're going to modify it, make a copy + wxString cs = charset; + +#if wxUSE_CONFIG && wxUSE_FILECONFIG + // first try the user-defined settings + wxFontMapperPathChanger path(this, FONTMAPPER_CHARSET_PATH); + if ( path.IsOk() ) + { + wxConfigBase *config = GetConfig(); + + // do we have an encoding for this charset? + long value = config->Read(charset, -1l); + if ( value != -1 ) + { + if ( value == wxFONTENCODING_UNKNOWN ) + { + // don't try to find it, in particular don't ask the user + return value; + } + + if ( value >= 0 && value <= wxFONTENCODING_MAX ) + { + encoding = (wxFontEncoding)value; + } + else + { + wxLogDebug(wxT("corrupted config data: invalid encoding %ld for charset '%s' ignored"), + value, charset.c_str()); + } + } + + if ( encoding == wxFONTENCODING_SYSTEM ) + { + // may be we have an alias? + config->SetPath(FONTMAPPER_CHARSET_ALIAS_PATH); + + wxString alias = config->Read(charset); + if ( !alias.empty() ) + { + // yes, we do - use it instead + cs = alias; + } + } + } +#endif // wxUSE_CONFIG + + // if didn't find it there, try to recognize it ourselves + if ( encoding == wxFONTENCODING_SYSTEM ) + { + // trim any spaces + cs.Trim(true); + cs.Trim(false); + + // discard the optional quotes + if ( !cs.empty() ) + { + if ( cs[0u] == _T('"') && cs.Last() == _T('"') ) + { + cs = wxString(cs.c_str(), cs.length() - 1); + } + } + + for ( size_t i = 0; i < WXSIZEOF(gs_encodingNames); ++i ) + { + for ( const wxChar** encName = gs_encodingNames[i]; *encName; ++encName ) + { + if ( cs.CmpNoCase(*encName) == 0 ) + return gs_encodings[i]; + } + } + + cs.MakeUpper(); + + if ( cs.Left(3) == wxT("ISO") ) + { + // the dash is optional (or, to be exact, it is not, but + // several brokenmails "forget" it) + const wxChar *p = cs.c_str() + 3; + if ( *p == wxT('-') ) + p++; + + // printf( "iso %s\n", (const char*) cs.ToAscii() ); + + unsigned int value; + if ( wxSscanf(p, wxT("8859-%u"), &value) == 1 ) + { + // printf( "value %d\n", (int)value ); + + // make it 0 based and check that it is strictly positive in + // the process (no such thing as iso8859-0 encoding) + if ( (value-- > 0) && + (value < wxFONTENCODING_ISO8859_MAX - + wxFONTENCODING_ISO8859_1) ) + { + // it's a valid ISO8859 encoding + value += wxFONTENCODING_ISO8859_1; + encoding = (wxFontEncoding)value; + } + } + } + else if ( cs.Left(4) == wxT("8859") ) + { + const wxChar *p = cs.c_str(); + + unsigned int value; + if ( wxSscanf(p, wxT("8859-%u"), &value) == 1 ) + { + // printf( "value %d\n", (int)value ); + + // make it 0 based and check that it is strictly positive in + // the process (no such thing as iso8859-0 encoding) + if ( (value-- > 0) && + (value < wxFONTENCODING_ISO8859_MAX - + wxFONTENCODING_ISO8859_1) ) + { + // it's a valid ISO8859 encoding + value += wxFONTENCODING_ISO8859_1; + encoding = (wxFontEncoding)value; + } + } + } + else // check for Windows charsets + { + size_t len; + if ( cs.Left(7) == wxT("WINDOWS") ) + { + len = 7; + } + else if ( cs.Left(2) == wxT("CP") ) + { + len = 2; + } + else // not a Windows encoding + { + len = 0; + } + + if ( len ) + { + const wxChar *p = cs.c_str() + len; + if ( *p == wxT('-') ) + p++; + + unsigned int value; + if ( wxSscanf(p, wxT("%u"), &value) == 1 ) + { + if ( value >= 1250 ) + { + value -= 1250; + if ( value < wxFONTENCODING_CP12_MAX - + wxFONTENCODING_CP1250 ) + { + // a valid Windows code page + value += wxFONTENCODING_CP1250; + encoding = (wxFontEncoding)value; + } + } + + switch ( value ) + { + case 866: + encoding = wxFONTENCODING_CP866; + break; + + case 874: + encoding = wxFONTENCODING_CP874; + break; + + case 932: + encoding = wxFONTENCODING_CP932; + break; + + case 936: + encoding = wxFONTENCODING_CP936; + break; + + case 949: + encoding = wxFONTENCODING_CP949; + break; + + case 950: + encoding = wxFONTENCODING_CP950; + break; + } + } + } + } + //else: unknown + } + + return encoding; +} + +/* static */ +size_t wxFontMapperBase::GetSupportedEncodingsCount() +{ + return WXSIZEOF(gs_encodings); +} + +/* static */ +wxFontEncoding wxFontMapperBase::GetEncoding(size_t n) +{ + wxCHECK_MSG( n < WXSIZEOF(gs_encodings), wxFONTENCODING_SYSTEM, + _T("wxFontMapper::GetEncoding(): invalid index") ); + + return gs_encodings[n]; +} + +/* static */ +wxString wxFontMapperBase::GetEncodingDescription(wxFontEncoding encoding) +{ + if ( encoding == wxFONTENCODING_DEFAULT ) + { + return _("Default encoding"); + } + + const size_t count = WXSIZEOF(gs_encodingDescs); + + for ( size_t i = 0; i < count; i++ ) + { + if ( gs_encodings[i] == encoding ) + { + return wxGetTranslation(gs_encodingDescs[i]); + } + } + + wxString str; + str.Printf(_("Unknown encoding (%d)"), encoding); + + return str; +} + +/* static */ +wxString wxFontMapperBase::GetEncodingName(wxFontEncoding encoding) +{ + if ( encoding == wxFONTENCODING_DEFAULT ) + { + return _("default"); + } + + const size_t count = WXSIZEOF(gs_encodingNames); + + for ( size_t i = 0; i < count; i++ ) + { + if ( gs_encodings[i] == encoding ) + { + return gs_encodingNames[i][0]; + } + } + + wxString str; + str.Printf(_("unknown-%d"), encoding); + + return str; +} + +/* static */ +const wxChar** wxFontMapperBase::GetAllEncodingNames(wxFontEncoding encoding) +{ + static const wxChar* dummy[] = { NULL }; + + for ( size_t i = 0; i < WXSIZEOF(gs_encodingNames); i++ ) + { + if ( gs_encodings[i] == encoding ) + { + return gs_encodingNames[i]; + } + } + + return dummy; +} + +/* static */ +wxFontEncoding wxFontMapperBase::GetEncodingFromName(const wxString& name) +{ + const size_t count = WXSIZEOF(gs_encodingNames); + + for ( size_t i = 0; i < count; i++ ) + { + for ( const wxChar** encName = gs_encodingNames[i]; *encName; ++encName ) + { + if ( name.CmpNoCase(*encName) == 0 ) + return gs_encodings[i]; + } + } + + return wxFONTENCODING_MAX; +} + +#endif // wxUSE_FONTMAP diff --git a/Externals/wxWidgets/src/common/fontcmn.cpp b/Externals/wxWidgets/src/common/fontcmn.cpp new file mode 100644 index 0000000000..fe34d8a521 --- /dev/null +++ b/Externals/wxWidgets/src/common/fontcmn.cpp @@ -0,0 +1,784 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/fontcmn.cpp +// Purpose: implementation of wxFontBase methods +// Author: Vadim Zeitlin +// Modified by: +// Created: 20.09.99 +// RCS-ID: $Id: fontcmn.cpp 43661 2006-11-26 20:18:53Z VZ $ +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#include "wx/font.h" + +#ifndef WX_PRECOMP + #include "wx/dc.h" + #include "wx/intl.h" + #include "wx/dcscreen.h" + #include "wx/log.h" + #include "wx/gdicmn.h" +#endif // WX_PRECOMP + +#if defined(__WXMSW__) + #include "wx/msw/private.h" // includes windows.h for LOGFONT + #include "wx/msw/winundef.h" +#endif + +#include "wx/fontutil.h" // for wxNativeFontInfo +#include "wx/fontmap.h" +#include "wx/fontenum.h" + +#include "wx/tokenzr.h" + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// helper functions +// ---------------------------------------------------------------------------- + +static void AdjustFontSize(wxFont& font, wxDC& dc, const wxSize& pixelSize) +{ + int currentSize = 0; + int largestGood = 0; + int smallestBad = 0; + + bool initialGoodFound = false; + bool initialBadFound = false; + + // NB: this assignment was separated from the variable definition + // in order to fix a gcc v3.3.3 compiler crash + currentSize = font.GetPointSize(); + while (currentSize > 0) + { + dc.SetFont(font); + + // if currentSize (in points) results in a font that is smaller + // than required by pixelSize it is considered a good size + if (dc.GetCharHeight() <= pixelSize.GetHeight() && + (!pixelSize.GetWidth() || + dc.GetCharWidth() <= pixelSize.GetWidth())) + { + largestGood = currentSize; + initialGoodFound = true; + } + else + { + smallestBad = currentSize; + initialBadFound = true; + } + if (!initialGoodFound) + { + currentSize /= 2; + } + else if (!initialBadFound) + { + currentSize *= 2; + } + else + { + int distance = smallestBad - largestGood; + if (distance == 1) + break; + + currentSize = largestGood + distance / 2; + } + + font.SetPointSize(currentSize); + } + + if (currentSize != largestGood) + font.SetPointSize(largestGood); +} + +// ---------------------------------------------------------------------------- +// wxFontBase +// ---------------------------------------------------------------------------- + +wxFontEncoding wxFontBase::ms_encodingDefault = wxFONTENCODING_SYSTEM; + +/* static */ +void wxFontBase::SetDefaultEncoding(wxFontEncoding encoding) +{ + // GetDefaultEncoding() should return something != wxFONTENCODING_DEFAULT + // and, besides, using this value here doesn't make any sense + wxCHECK_RET( encoding != wxFONTENCODING_DEFAULT, + _T("can't set default encoding to wxFONTENCODING_DEFAULT") ); + + ms_encodingDefault = encoding; +} + +wxFontBase::~wxFontBase() +{ + // this destructor is required for Darwin +} + +/* static */ +wxFont *wxFontBase::New(int size, + int family, + int style, + int weight, + bool underlined, + const wxString& face, + wxFontEncoding encoding) +{ + return new wxFont(size, family, style, weight, underlined, face, encoding); +} + +static inline int flags2Style(int flags) +{ + return flags & wxFONTFLAG_ITALIC + ? wxFONTSTYLE_ITALIC + : flags & wxFONTFLAG_SLANT + ? wxFONTSTYLE_SLANT + : wxFONTSTYLE_NORMAL; +} + +static inline int flags2Weight(int flags) +{ + return flags & wxFONTFLAG_LIGHT + ? wxFONTWEIGHT_LIGHT + : flags & wxFONTFLAG_BOLD + ? wxFONTWEIGHT_BOLD + : wxFONTWEIGHT_NORMAL; +} + +static inline bool flags2Underlined(int flags) +{ + return (flags & wxFONTFLAG_UNDERLINED) != 0; +} + +/* static */ +wxFont *wxFontBase::New(int pointSize, + wxFontFamily family, + int flags, + const wxString& face, + wxFontEncoding encoding) +{ + return New(pointSize, family, flags2Style(flags), flags2Weight(flags), + flags2Underlined(flags), face, encoding); +} + +/* static */ +wxFont *wxFontBase::New(const wxSize& pixelSize, + int family, + int style, + int weight, + bool underlined, + const wxString& face, + wxFontEncoding encoding) +{ +#if defined(__WXMSW__) + return new wxFont(pixelSize, family, style, weight, underlined, + face, encoding); +#else + wxFont *self = New(10, family, style, weight, underlined, face, encoding); + wxScreenDC dc; + AdjustFontSize(*(wxFont *)self, dc, pixelSize); + return self; +#endif +} + +/* static */ +wxFont *wxFontBase::New(const wxSize& pixelSize, + wxFontFamily family, + int flags, + const wxString& face, + wxFontEncoding encoding) +{ + return New(pixelSize, family, flags2Style(flags), flags2Weight(flags), + flags2Underlined(flags), face, encoding); +} + +wxSize wxFontBase::GetPixelSize() const +{ + wxScreenDC dc; + dc.SetFont(*(wxFont *)this); + return wxSize(dc.GetCharWidth(), dc.GetCharHeight()); +} + +bool wxFontBase::IsUsingSizeInPixels() const +{ + return false; +} + +void wxFontBase::SetPixelSize( const wxSize& pixelSize ) +{ + wxScreenDC dc; + AdjustFontSize(*(wxFont *)this, dc, pixelSize); +} + +/* static */ +wxFont *wxFontBase::New(const wxNativeFontInfo& info) +{ + return new wxFont(info); +} + +/* static */ +wxFont *wxFontBase::New(const wxString& strNativeFontDesc) +{ + wxNativeFontInfo fontInfo; + if ( !fontInfo.FromString(strNativeFontDesc) ) + return new wxFont(*wxNORMAL_FONT); + + return New(fontInfo); +} + +bool wxFontBase::IsFixedWidth() const +{ + return GetFamily() == wxFONTFAMILY_TELETYPE; +} + +void wxFontBase::DoSetNativeFontInfo(const wxNativeFontInfo& info) +{ +#ifdef wxNO_NATIVE_FONTINFO + SetPointSize(info.pointSize); + SetFamily(info.family); + SetStyle(info.style); + SetWeight(info.weight); + SetUnderlined(info.underlined); + SetFaceName(info.faceName); + SetEncoding(info.encoding); +#else + (void)info; +#endif +} + +wxString wxFontBase::GetNativeFontInfoDesc() const +{ + wxString fontDesc; + const wxNativeFontInfo *fontInfo = GetNativeFontInfo(); + if ( fontInfo ) + { + fontDesc = fontInfo->ToString(); + wxASSERT_MSG(!fontDesc.empty(), wxT("This should be a non-empty string!")); + } + else + { + wxFAIL_MSG(wxT("Derived class should have created the wxNativeFontInfo!")); + } + + return fontDesc; +} + +wxString wxFontBase::GetNativeFontInfoUserDesc() const +{ + wxString fontDesc; + const wxNativeFontInfo *fontInfo = GetNativeFontInfo(); + if ( fontInfo ) + { + fontDesc = fontInfo->ToUserString(); + wxASSERT_MSG(!fontDesc.empty(), wxT("This should be a non-empty string!")); + } + else + { + wxFAIL_MSG(wxT("Derived class should have created the wxNativeFontInfo!")); + } + + return fontDesc; +} + +bool wxFontBase::SetNativeFontInfo(const wxString& info) +{ + wxNativeFontInfo fontInfo; + if ( !info.empty() && fontInfo.FromString(info) ) + { + SetNativeFontInfo(fontInfo); + return true; + } + + UnRef(); + return false; +} + +bool wxFontBase::SetNativeFontInfoUserDesc(const wxString& info) +{ + wxNativeFontInfo fontInfo; + if ( !info.empty() && fontInfo.FromUserString(info) ) + { + SetNativeFontInfo(fontInfo); + return true; + } + + UnRef(); + return false; +} + +bool wxFontBase::operator==(const wxFont& font) const +{ + // either it is the same font, i.e. they share the same common data or they + // have different ref datas but still describe the same font + return IsSameAs(font) || + ( + Ok() == font.Ok() && + GetPointSize() == font.GetPointSize() && + // in wxGTK1 GetPixelSize() calls GetInternalFont() which uses + // operator==() resulting in infinite recursion so we can't use it + // in that port +#if !defined(__WXGTK__) || defined(__WXGTK20__) + GetPixelSize() == font.GetPixelSize() && +#endif + GetFamily() == font.GetFamily() && + GetStyle() == font.GetStyle() && + GetWeight() == font.GetWeight() && + GetUnderlined() == font.GetUnderlined() && + GetFaceName().IsSameAs(font.GetFaceName(), false) && + GetEncoding() == font.GetEncoding() + ); +} + +bool wxFontBase::operator!=(const wxFont& font) const +{ + return !(*this == font); +} + +wxString wxFontBase::GetFamilyString() const +{ + wxCHECK_MSG( Ok(), wxT("wxDEFAULT"), wxT("invalid font") ); + + switch ( GetFamily() ) + { + case wxDECORATIVE: return wxT("wxDECORATIVE"); + case wxROMAN: return wxT("wxROMAN"); + case wxSCRIPT: return wxT("wxSCRIPT"); + case wxSWISS: return wxT("wxSWISS"); + case wxMODERN: return wxT("wxMODERN"); + case wxTELETYPE: return wxT("wxTELETYPE"); + default: return wxT("wxDEFAULT"); + } +} + +wxString wxFontBase::GetStyleString() const +{ + wxCHECK_MSG( Ok(), wxT("wxDEFAULT"), wxT("invalid font") ); + + switch ( GetStyle() ) + { + case wxNORMAL: return wxT("wxNORMAL"); + case wxSLANT: return wxT("wxSLANT"); + case wxITALIC: return wxT("wxITALIC"); + default: return wxT("wxDEFAULT"); + } +} + +wxString wxFontBase::GetWeightString() const +{ + wxCHECK_MSG( Ok(), wxT("wxDEFAULT"), wxT("invalid font") ); + + switch ( GetWeight() ) + { + case wxNORMAL: return wxT("wxNORMAL"); + case wxBOLD: return wxT("wxBOLD"); + case wxLIGHT: return wxT("wxLIGHT"); + default: return wxT("wxDEFAULT"); + } +} + +bool wxFontBase::SetFaceName(const wxString &facename) +{ + if (!wxFontEnumerator::IsValidFacename(facename)) + { + UnRef(); // make Ok() return false + return false; + } + + return true; +} + + +// ---------------------------------------------------------------------------- +// wxNativeFontInfo +// ---------------------------------------------------------------------------- + +// Up to now, there are no native implementations of this function: +void wxNativeFontInfo::SetFaceName(const wxArrayString &facenames) +{ + for (size_t i=0; i < facenames.GetCount(); i++) + { + if (wxFontEnumerator::IsValidFacename(facenames[i])) + { + SetFaceName(facenames[i]); + return; + } + } + + // set the first valid facename we can find on this system + wxString validfacename = wxFontEnumerator::GetFacenames().Item(0); + wxLogTrace(wxT("font"), wxT("Falling back to '%s'"), validfacename.c_str()); + SetFaceName(validfacename); +} + + +#ifdef wxNO_NATIVE_FONTINFO + +// These are the generic forms of FromString()/ToString. +// +// convert to/from the string representation: format is +// version;pointsize;family;style;weight;underlined;facename;encoding + +bool wxNativeFontInfo::FromString(const wxString& s) +{ + long l; + + wxStringTokenizer tokenizer(s, _T(";")); + + wxString token = tokenizer.GetNextToken(); + // + // Ignore the version for now + // + + token = tokenizer.GetNextToken(); + if ( !token.ToLong(&l) ) + return false; + pointSize = (int)l; + + token = tokenizer.GetNextToken(); + if ( !token.ToLong(&l) ) + return false; + family = (wxFontFamily)l; + + token = tokenizer.GetNextToken(); + if ( !token.ToLong(&l) ) + return false; + style = (wxFontStyle)l; + + token = tokenizer.GetNextToken(); + if ( !token.ToLong(&l) ) + return false; + weight = (wxFontWeight)l; + + token = tokenizer.GetNextToken(); + if ( !token.ToLong(&l) ) + return false; + underlined = l != 0; + + faceName = tokenizer.GetNextToken(); + +#ifndef __WXMAC__ + if( !faceName ) + return false; +#endif + + token = tokenizer.GetNextToken(); + if ( !token.ToLong(&l) ) + return false; + encoding = (wxFontEncoding)l; + + return true; +} + +wxString wxNativeFontInfo::ToString() const +{ + wxString s; + + s.Printf(_T("%d;%d;%d;%d;%d;%d;%s;%d"), + 0, // version + pointSize, + family, + (int)style, + (int)weight, + underlined, + faceName.GetData(), + (int)encoding); + + return s; +} + +void wxNativeFontInfo::Init() +{ + pointSize = 0; + family = wxFONTFAMILY_DEFAULT; + style = wxFONTSTYLE_NORMAL; + weight = wxFONTWEIGHT_NORMAL; + underlined = false; + faceName.clear(); + encoding = wxFONTENCODING_DEFAULT; +} + +int wxNativeFontInfo::GetPointSize() const +{ + return pointSize; +} + +wxFontStyle wxNativeFontInfo::GetStyle() const +{ + return style; +} + +wxFontWeight wxNativeFontInfo::GetWeight() const +{ + return weight; +} + +bool wxNativeFontInfo::GetUnderlined() const +{ + return underlined; +} + +wxString wxNativeFontInfo::GetFaceName() const +{ + return faceName; +} + +wxFontFamily wxNativeFontInfo::GetFamily() const +{ + return family; +} + +wxFontEncoding wxNativeFontInfo::GetEncoding() const +{ + return encoding; +} + +void wxNativeFontInfo::SetPointSize(int pointsize) +{ + pointSize = pointsize; +} + +void wxNativeFontInfo::SetStyle(wxFontStyle style_) +{ + style = style_; +} + +void wxNativeFontInfo::SetWeight(wxFontWeight weight_) +{ + weight = weight_; +} + +void wxNativeFontInfo::SetUnderlined(bool underlined_) +{ + underlined = underlined_; +} + +bool wxNativeFontInfo::SetFaceName(const wxString& facename_) +{ + faceName = facename_; + return true; +} + +void wxNativeFontInfo::SetFamily(wxFontFamily family_) +{ + family = family_; +} + +void wxNativeFontInfo::SetEncoding(wxFontEncoding encoding_) +{ + encoding = encoding_; +} + +#endif // generic wxNativeFontInfo implementation + +// conversion to/from user-readable string: this is used in the generic +// versions and under MSW as well because there is no standard font description +// format there anyhow (but there is a well-defined standard for X11 fonts used +// by wxGTK and wxMotif) + +#if defined(wxNO_NATIVE_FONTINFO) || defined(__WXMSW__) || defined (__WXPM__) + +wxString wxNativeFontInfo::ToUserString() const +{ + wxString desc; + + // first put the adjectives, if any - this is English-centric, of course, + // but what else can we do? + if ( GetUnderlined() ) + { + desc << _("underlined"); + } + + switch ( GetWeight() ) + { + default: + wxFAIL_MSG( _T("unknown font weight") ); + // fall through + + case wxFONTWEIGHT_NORMAL: + break; + + case wxFONTWEIGHT_LIGHT: + desc << _(" light"); + break; + + case wxFONTWEIGHT_BOLD: + desc << _(" bold"); + break; + } + + switch ( GetStyle() ) + { + default: + wxFAIL_MSG( _T("unknown font style") ); + // fall through + + case wxFONTSTYLE_NORMAL: + break; + + // we don't distinguish between the two for now anyhow... + case wxFONTSTYLE_ITALIC: + case wxFONTSTYLE_SLANT: + desc << _(" italic"); + break; + } + + wxString face = GetFaceName(); + if ( !face.empty() ) + { + desc << _T(' ') << face; + } + + int size = GetPointSize(); + if ( size != wxNORMAL_FONT->GetPointSize() ) + { + desc << _T(' ') << size; + } + +#if wxUSE_FONTMAP + wxFontEncoding enc = GetEncoding(); + if ( enc != wxFONTENCODING_DEFAULT && enc != wxFONTENCODING_SYSTEM ) + { + desc << _T(' ') << wxFontMapper::GetEncodingName(enc); + } +#endif // wxUSE_FONTMAP + + return desc.Strip(wxString::both).MakeLower(); +} + +bool wxNativeFontInfo::FromUserString(const wxString& s) +{ + // reset to the default state + Init(); + + // parse a more or less free form string + // + // TODO: we should handle at least the quoted facenames + wxStringTokenizer tokenizer(s, _T(";, "), wxTOKEN_STRTOK); + + wxString face; + unsigned long size; + bool weightfound = false, pointsizefound = false; +#if wxUSE_FONTMAP + bool encodingfound = false; +#endif + + while ( tokenizer.HasMoreTokens() ) + { + wxString token = tokenizer.GetNextToken(); + + // normalize it + token.Trim(true).Trim(false).MakeLower(); + + // look for the known tokens + if ( token == _T("underlined") || token == _("underlined") ) + { + SetUnderlined(true); + } + else if ( token == _T("light") || token == _("light") ) + { + SetWeight(wxFONTWEIGHT_LIGHT); + weightfound = true; + } + else if ( token == _T("bold") || token == _("bold") ) + { + SetWeight(wxFONTWEIGHT_BOLD); + weightfound = true; + } + else if ( token == _T("italic") || token == _("italic") ) + { + SetStyle(wxFONTSTYLE_ITALIC); + } + else if ( token.ToULong(&size) ) + { + SetPointSize(size); + pointsizefound = true; + } + else + { +#if wxUSE_FONTMAP + // try to interpret this as an encoding + wxFontEncoding encoding = wxFontMapper::Get()->CharsetToEncoding(token, false); + if ( encoding != wxFONTENCODING_DEFAULT && + encoding != wxFONTENCODING_SYSTEM ) // returned when the recognition failed + { + SetEncoding(encoding); + encodingfound = true; + } + else + { +#endif // wxUSE_FONTMAP + + // assume it is the face name + if ( !face.empty() ) + { + face += _T(' '); + } + + face += token; + + // skip the code which resets face below + continue; + +#if wxUSE_FONTMAP + } +#endif // wxUSE_FONTMAP + } + + // if we had had the facename, we shouldn't continue appending tokens + // to it (i.e. "foo bold bar" shouldn't result in the facename "foo + // bar") + if ( !face.empty() ) + { + // NB: the check on the facename is implemented in wxFontBase::SetFaceName + // and not in wxNativeFontInfo::SetFaceName thus we need to explicitely + // call here wxFontEnumerator::IsValidFacename + if (!wxFontEnumerator::IsValidFacename(face) || + !SetFaceName(face)) + SetFaceName(wxNORMAL_FONT->GetFaceName()); + face.clear(); + } + } + + // we might not have flushed it inside the loop + if ( !face.empty() ) + { + // NB: the check on the facename is implemented in wxFontBase::SetFaceName + // and not in wxNativeFontInfo::SetFaceName thus we need to explicitely + // call here wxFontEnumerator::IsValidFacename + if (!wxFontEnumerator::IsValidFacename(face) || + !SetFaceName(face)) + SetFaceName(wxNORMAL_FONT->GetFaceName()); + } + + // set point size to default value if size was not given + if ( !pointsizefound ) + SetPointSize(wxNORMAL_FONT->GetPointSize()); + + // set font weight to default value if weight was not given + if ( !weightfound ) + SetWeight(wxFONTWEIGHT_NORMAL); + +#if wxUSE_FONTMAP + // set font encoding to default value if encoding was not given + if ( !encodingfound ) + SetEncoding(wxFONTENCODING_SYSTEM); +#endif // wxUSE_FONTMAP + + return true; +} + +#endif // generic or wxMSW or wxOS2 diff --git a/Externals/wxWidgets/src/common/fontenumcmn.cpp b/Externals/wxWidgets/src/common/fontenumcmn.cpp new file mode 100644 index 0000000000..0b64d0f4db --- /dev/null +++ b/Externals/wxWidgets/src/common/fontenumcmn.cpp @@ -0,0 +1,131 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/fontenumcmn.cpp +// Purpose: wxFontEnumerator class +// Author: Vadim Zeitlin +// Modified by: +// Created: 7/5/2006 +// RCS-ID: $Id: fontenumcmn.cpp 43727 2006-12-01 10:14:28Z VS $ +// Copyright: (c) 1999-2003 Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#include "wx/fontenum.h" + +// ============================================================================ +// implementation +// ============================================================================ + +// A simple wxFontEnumerator which doesn't perform any filtering and +// just returns all facenames and encodings found in the system +class WXDLLEXPORT wxSimpleFontEnumerator : public wxFontEnumerator +{ +public: + wxSimpleFontEnumerator() { } + + // called by EnumerateFacenames + virtual bool OnFacename(const wxString& facename) + { + m_arrFacenames.Add(facename); + return true; + } + + // called by EnumerateEncodings + virtual bool OnFontEncoding(const wxString& WXUNUSED(facename), + const wxString& encoding) + { + m_arrEncodings.Add(encoding); + return true; + } + +public: + wxArrayString m_arrFacenames, m_arrEncodings; +}; + + +/* static */ +wxArrayString wxFontEnumerator::GetFacenames(wxFontEncoding encoding, bool fixedWidthOnly) +{ + wxSimpleFontEnumerator temp; + temp.EnumerateFacenames(encoding, fixedWidthOnly); + return temp.m_arrFacenames; +} + +/* static */ +wxArrayString wxFontEnumerator::GetEncodings(const wxString& facename) +{ + wxSimpleFontEnumerator temp; + temp.EnumerateEncodings(facename); + return temp.m_arrEncodings; +} + +/* static */ +bool wxFontEnumerator::IsValidFacename(const wxString &facename) +{ + // we cache the result of wxFontEnumerator::GetFacenames supposing that + // the array of face names won't change in the session of this program + static wxArrayString s_arr = wxFontEnumerator::GetFacenames(); + +#ifdef __WXMSW__ + // Quoting the MSDN: + // "MS Shell Dlg is a mapping mechanism that enables + // U.S. English Microsoft Windows NT, and Microsoft Windows 2000 to + // support locales that have characters that are not contained in code + // page 1252. It is not a font but a face name for a nonexistent font." + // Thus we need to consider "Ms Shell Dlg" and "Ms Shell Dlg 2" as valid + // font face names even if they are enumerated by wxFontEnumerator + if (facename.IsSameAs(wxT("Ms Shell Dlg"), false) || + facename.IsSameAs(wxT("Ms Shell Dlg 2"), false)) + return true; +#endif + + // is given font face name a valid one ? + if (s_arr.Index(facename, false) == wxNOT_FOUND) + return false; + + return true; +} + +#ifdef wxHAS_UTF8_FONTS +bool wxFontEnumerator::EnumerateEncodingsUTF8(const wxString& facename) +{ + // name of UTF-8 encoding: no need to use wxFontMapper for it as it's + // unlikely to change + const wxString utf8(_T("UTF-8")); + + // all fonts are in UTF-8 only if this code is used + if ( !facename.empty() ) + { + OnFontEncoding(facename, utf8); + return true; + } + + // so enumerating all facenames supporting this encoding is the same as + // enumerating all facenames + const wxArrayString facenames(GetFacenames(wxFONTENCODING_UTF8)); + const size_t count = facenames.size(); + if ( !count ) + return false; + + for ( size_t n = 0; n < count; n++ ) + { + OnFontEncoding(facenames[n], utf8); + } + + return true; +} +#endif // wxHAS_UTF8_FONTS diff --git a/Externals/wxWidgets/src/common/fontmap.cpp b/Externals/wxWidgets/src/common/fontmap.cpp new file mode 100644 index 0000000000..cf53fd914e --- /dev/null +++ b/Externals/wxWidgets/src/common/fontmap.cpp @@ -0,0 +1,519 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/fontmap.cpp +// Purpose: wxFontMapper class +// Author: Vadim Zeitlin +// Modified by: +// Created: 04.11.99 +// RCS-ID: $Id: fontmap.cpp 39651 2006-06-09 17:50:46Z ABX $ +// Copyright: (c) 1999-2003 Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_FONTMAP + +#include "wx/fontmap.h" + +#ifndef WX_PRECOMP + #include "wx/app.h" + #include "wx/log.h" + #include "wx/intl.h" + #include "wx/msgdlg.h" + #include "wx/choicdlg.h" +#endif // PCH + +#if wxUSE_CONFIG + #include "wx/config.h" +#endif // wxUSE_CONFIG + +#if defined(__WXMSW__) + #include "wx/msw/private.h" // includes windows.h for LOGFONT + #include "wx/msw/winundef.h" +#endif + +#include "wx/fmappriv.h" +#include "wx/fontutil.h" +#include "wx/fontdlg.h" +#include "wx/encinfo.h" + +#include "wx/encconv.h" + +#if wxUSE_EXTENDED_RTTI + +wxBEGIN_ENUM( wxFontEncoding ) + wxENUM_MEMBER( wxFONTENCODING_SYSTEM ) + wxENUM_MEMBER( wxFONTENCODING_DEFAULT ) + + wxENUM_MEMBER( wxFONTENCODING_ISO8859_1 ) + wxENUM_MEMBER( wxFONTENCODING_ISO8859_2 ) + wxENUM_MEMBER( wxFONTENCODING_ISO8859_3 ) + wxENUM_MEMBER( wxFONTENCODING_ISO8859_4 ) + wxENUM_MEMBER( wxFONTENCODING_ISO8859_5 ) + wxENUM_MEMBER( wxFONTENCODING_ISO8859_6 ) + wxENUM_MEMBER( wxFONTENCODING_ISO8859_7 ) + wxENUM_MEMBER( wxFONTENCODING_ISO8859_8 ) + wxENUM_MEMBER( wxFONTENCODING_ISO8859_9 ) + wxENUM_MEMBER( wxFONTENCODING_ISO8859_10 ) + wxENUM_MEMBER( wxFONTENCODING_ISO8859_11 ) + wxENUM_MEMBER( wxFONTENCODING_ISO8859_12 ) + wxENUM_MEMBER( wxFONTENCODING_ISO8859_13 ) + wxENUM_MEMBER( wxFONTENCODING_ISO8859_14 ) + wxENUM_MEMBER( wxFONTENCODING_ISO8859_15 ) + wxENUM_MEMBER( wxFONTENCODING_ISO8859_MAX ) + wxENUM_MEMBER( wxFONTENCODING_KOI8 ) + wxENUM_MEMBER( wxFONTENCODING_KOI8_U ) + wxENUM_MEMBER( wxFONTENCODING_ALTERNATIVE ) + wxENUM_MEMBER( wxFONTENCODING_BULGARIAN ) + wxENUM_MEMBER( wxFONTENCODING_CP437 ) + wxENUM_MEMBER( wxFONTENCODING_CP850 ) + wxENUM_MEMBER( wxFONTENCODING_CP852 ) + wxENUM_MEMBER( wxFONTENCODING_CP855 ) + wxENUM_MEMBER( wxFONTENCODING_CP866 ) + + wxENUM_MEMBER( wxFONTENCODING_CP874 ) + wxENUM_MEMBER( wxFONTENCODING_CP932 ) + wxENUM_MEMBER( wxFONTENCODING_CP936 ) + wxENUM_MEMBER( wxFONTENCODING_CP949 ) + wxENUM_MEMBER( wxFONTENCODING_CP950 ) + wxENUM_MEMBER( wxFONTENCODING_CP1250 ) + wxENUM_MEMBER( wxFONTENCODING_CP1251 ) + wxENUM_MEMBER( wxFONTENCODING_CP1252 ) + wxENUM_MEMBER( wxFONTENCODING_CP1253 ) + wxENUM_MEMBER( wxFONTENCODING_CP1254 ) + wxENUM_MEMBER( wxFONTENCODING_CP1255 ) + wxENUM_MEMBER( wxFONTENCODING_CP1256 ) + wxENUM_MEMBER( wxFONTENCODING_CP1257 ) + wxENUM_MEMBER( wxFONTENCODING_CP12_MAX ) + wxENUM_MEMBER( wxFONTENCODING_UTF7 ) + wxENUM_MEMBER( wxFONTENCODING_UTF8 ) + wxENUM_MEMBER( wxFONTENCODING_GB2312 ) + wxENUM_MEMBER( wxFONTENCODING_BIG5 ) + wxENUM_MEMBER( wxFONTENCODING_SHIFT_JIS ) + wxENUM_MEMBER( wxFONTENCODING_EUC_JP ) + wxENUM_MEMBER( wxFONTENCODING_UNICODE ) +wxEND_ENUM( wxFontEncoding ) +#endif + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// the config paths we use +#if wxUSE_CONFIG + +static const wxChar* FONTMAPPER_FONT_FROM_ENCODING_PATH = wxT("Encodings"); +static const wxChar* FONTMAPPER_FONT_DONT_ASK = wxT("none"); + +#endif // wxUSE_CONFIG + +// ---------------------------------------------------------------------------- +// private classes +// ---------------------------------------------------------------------------- + +// it may happen that while we're showing a dialog asking the user about +// something, another request for an encoding mapping arrives: in this case it +// is best to not do anything because otherwise we risk to enter an infinite +// loop so we create an object of this class on stack to test for this in all +// interactive functions +class ReentrancyBlocker +{ +public: + ReentrancyBlocker(bool& flag) : m_flagOld(flag), m_flag(flag) + { m_flag = true; } + ~ReentrancyBlocker() { m_flag = m_flagOld; } + +private: + bool m_flagOld; + bool& m_flag; + + DECLARE_NO_COPY_CLASS(ReentrancyBlocker) +}; + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// ctor and dtor +// ---------------------------------------------------------------------------- + +wxFontMapper::wxFontMapper() +{ + m_windowParent = NULL; +} + +wxFontMapper::~wxFontMapper() +{ +} + +/* static */ +wxFontMapper *wxFontMapper::Get() +{ + wxFontMapperBase *fontmapper = wxFontMapperBase::Get(); + wxASSERT_MSG( !fontmapper->IsDummy(), + wxT("GUI code requested a wxFontMapper but we only have a wxFontMapperBase.") ); + + // Now return it anyway because there's a chance the GUI code might just + // only want to call wxFontMapperBase functions and it's better than + // crashing by returning NULL + return (wxFontMapper *)fontmapper; +} + +wxFontEncoding +wxFontMapper::CharsetToEncoding(const wxString& charset, bool interactive) +{ + // try the ways not needing the users intervention first + int encoding = wxFontMapperBase::NonInteractiveCharsetToEncoding(charset); + + // if we failed to find the encoding, ask the user -- unless disabled + if ( encoding == wxFONTENCODING_UNKNOWN ) + { + // this is the special value which disables asking the user (he had + // chosen to suppress this the last time) + encoding = wxFONTENCODING_SYSTEM; + } +#if wxUSE_CHOICEDLG + else if ( (encoding == wxFONTENCODING_SYSTEM) && interactive ) + { + // prepare the dialog data + + // the dialog title + wxString title(m_titleDialog); + if ( !title ) + title << wxTheApp->GetAppName() << _(": unknown charset"); + + // the message + wxString msg; + msg.Printf(_("The charset '%s' is unknown. You may select\nanother charset to replace it with or choose\n[Cancel] if it cannot be replaced"), charset.c_str()); + + // the list of choices + const size_t count = GetSupportedEncodingsCount(); + + wxString *encodingNamesTranslated = new wxString[count]; + + for ( size_t i = 0; i < count; i++ ) + { + encodingNamesTranslated[i] = GetEncodingDescription(GetEncoding(i)); + } + + // the parent window + wxWindow *parent = m_windowParent; + if ( !parent ) + parent = wxTheApp->GetTopWindow(); + + // do ask the user and get back the index in encodings table + int n = wxGetSingleChoiceIndex(msg, title, + count, + encodingNamesTranslated, + parent); + + delete [] encodingNamesTranslated; + + if ( n != -1 ) + { + encoding = GetEncoding(n); + } + +#if wxUSE_CONFIG && wxUSE_FILECONFIG + // save the result in the config now + wxFontMapperPathChanger path(this, FONTMAPPER_CHARSET_PATH); + if ( path.IsOk() ) + { + wxConfigBase *config = GetConfig(); + + // remember the alt encoding for this charset -- or remember that + // we don't know it + long value = n == -1 ? (long)wxFONTENCODING_UNKNOWN : (long)encoding; + if ( !config->Write(charset, value) ) + { + wxLogError(_("Failed to remember the encoding for the charset '%s'."), charset.c_str()); + } + } +#endif // wxUSE_CONFIG + } +#else + wxUnusedVar(interactive); +#endif // wxUSE_CHOICEDLG + + return (wxFontEncoding)encoding; +} + +// ---------------------------------------------------------------------------- +// support for unknown encodings: we maintain a map between the +// (platform-specific) strings identifying them and our wxFontEncodings they +// correspond to which is used by GetFontForEncoding() function +// ---------------------------------------------------------------------------- + +bool wxFontMapper::TestAltEncoding(const wxString& configEntry, + wxFontEncoding encReplacement, + wxNativeEncodingInfo *info) +{ + if ( wxGetNativeFontEncoding(encReplacement, info) && + wxTestFontEncoding(*info) ) + { +#if wxUSE_CONFIG && wxUSE_FILECONFIG + // remember the mapping in the config + wxFontMapperPathChanger path(this, FONTMAPPER_FONT_FROM_ENCODING_PATH); + + if ( path.IsOk() ) + { + GetConfig()->Write(configEntry, info->ToString()); + } +#else + wxUnusedVar(configEntry); +#endif // wxUSE_CONFIG + return true; + } + + return false; +} + +bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding, + wxNativeEncodingInfo *info, + const wxString& facename, + bool interactive) +{ +#if wxUSE_GUI + // we need a flag to prevent infinite recursion which happens, for + // example, when GetAltForEncoding() is called from an OnPaint() handler: + // in this case, wxYield() which is called from wxMessageBox() we use here + // will lead to another call of OnPaint() and hence to another call of + // GetAltForEncoding() -- and it is impossible to catch this from the user + // code because we are called from wxFont ctor implicitly. + + // assume we're always called from the main thread, so that it is safe to + // use a static var + static bool s_inGetAltForEncoding = false; + + if ( interactive && s_inGetAltForEncoding ) + return false; + + ReentrancyBlocker blocker(s_inGetAltForEncoding); +#endif // wxUSE_GUI + + wxCHECK_MSG( info, false, wxT("bad pointer in GetAltForEncoding") ); + + info->facename = facename; + + if ( encoding == wxFONTENCODING_DEFAULT ) + { + encoding = wxFont::GetDefaultEncoding(); + } + + // if we failed to load the system default encoding, something is really + // wrong and we'd better stop now -- otherwise we will go into endless + // recursion trying to create the font in the msg box with the error + // message + if ( encoding == wxFONTENCODING_SYSTEM ) + { + wxLogFatalError(_("can't load any font, aborting")); + + // wxLogFatalError doesn't return + } + + wxString configEntry, + encName = GetEncodingName(encoding); + if ( !facename.empty() ) + { + configEntry = facename + _T("_"); + } + configEntry += encName; + +#if wxUSE_CONFIG && wxUSE_FILECONFIG + // do we have a font spec for this encoding? + wxString fontinfo; + wxFontMapperPathChanger path(this, FONTMAPPER_FONT_FROM_ENCODING_PATH); + if ( path.IsOk() ) + { + fontinfo = GetConfig()->Read(configEntry); + } + + // this special value means that we don't know of fonts for this + // encoding but, moreover, have already asked the user as well and he + // didn't specify any font neither + if ( fontinfo == FONTMAPPER_FONT_DONT_ASK ) + { + interactive = false; + } + else // use the info entered the last time + { + if ( !fontinfo.empty() && !facename.empty() ) + { + // we tried to find a match with facename -- now try without it + fontinfo = GetConfig()->Read(encName); + } + + if ( !fontinfo.empty() ) + { + if ( info->FromString(fontinfo) ) + { + if ( wxTestFontEncoding(*info) ) + { + // ok, got something + return true; + } + //else: no such fonts, look for something else + // (should we erase the outdated value?) + } + else + { + wxLogDebug(wxT("corrupted config data: string '%s' is not a valid font encoding info"), + fontinfo.c_str()); + } + } + //else: there is no information in config about this encoding + } +#endif // wxUSE_CONFIG + + // now try to map this encoding to a compatible one which we have on this + // system + wxFontEncodingArray equiv = wxEncodingConverter::GetAllEquivalents(encoding); + size_t count = equiv.GetCount(); + bool foundEquivEncoding = false; + wxFontEncoding equivEncoding = wxFONTENCODING_SYSTEM; + if ( count ) + { + for ( size_t i = 0; i < count && !foundEquivEncoding; i++ ) + { + // don't test for encoding itself, we already know we don't have it + if ( equiv[i] == encoding ) + continue; + + if ( TestAltEncoding(configEntry, equiv[i], info) ) + { + equivEncoding = equiv[i]; + + foundEquivEncoding = true; + } + } + } + + // ask the user +#if wxUSE_FONTDLG + if ( interactive ) + { + wxString title(m_titleDialog); + if ( !title ) + title << wxTheApp->GetAppName() << _(": unknown encoding"); + + // built the message + wxString encDesc = GetEncodingDescription(encoding), + msg; + if ( foundEquivEncoding ) + { + // ask the user if he wants to override found alternative encoding + msg.Printf(_("No font for displaying text in encoding '%s' found,\nbut an alternative encoding '%s' is available.\nDo you want to use this encoding (otherwise you will have to choose another one)?"), + encDesc.c_str(), GetEncodingDescription(equivEncoding).c_str()); + } + else + { + msg.Printf(_("No font for displaying text in encoding '%s' found.\nWould you like to select a font to be used for this encoding\n(otherwise the text in this encoding will not be shown correctly)?"), + encDesc.c_str()); + } + + // the question is different in 2 cases so the answer has to be + // interpreted differently as well + int answer = foundEquivEncoding ? wxNO : wxYES; + + if ( wxMessageBox(msg, title, + wxICON_QUESTION | wxYES_NO, + m_windowParent) == answer ) + { + wxFontData data; + data.SetEncoding(encoding); + data.EncodingInfo() = *info; + wxFontDialog dialog(m_windowParent, data); + if ( dialog.ShowModal() == wxID_OK ) + { + wxFontData retData = dialog.GetFontData(); + + *info = retData.EncodingInfo(); + info->encoding = retData.GetEncoding(); + +#if wxUSE_CONFIG && wxUSE_FILECONFIG + // remember this in the config + wxFontMapperPathChanger path2(this, + FONTMAPPER_FONT_FROM_ENCODING_PATH); + if ( path2.IsOk() ) + { + GetConfig()->Write(configEntry, info->ToString()); + } +#endif // wxUSE_CONFIG + + return true; + } + //else: the user canceled the font selection dialog + } + else + { + // the user doesn't want to select a font for this encoding + // or selected to use equivalent encoding + // + // remember it to avoid asking the same question again later +#if wxUSE_CONFIG && wxUSE_FILECONFIG + wxFontMapperPathChanger path2(this, + FONTMAPPER_FONT_FROM_ENCODING_PATH); + if ( path2.IsOk() ) + { + GetConfig()->Write + ( + configEntry, + foundEquivEncoding ? info->ToString().c_str() + : FONTMAPPER_FONT_DONT_ASK + ); + } +#endif // wxUSE_CONFIG + } + } + //else: we're in non-interactive mode +#else + wxUnusedVar(equivEncoding); +#endif // wxUSE_FONTDLG + + return foundEquivEncoding; +} + +bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding, + wxFontEncoding *encodingAlt, + const wxString& facename, + bool interactive) +{ + wxCHECK_MSG( encodingAlt, false, + _T("wxFontEncoding::GetAltForEncoding(): NULL pointer") ); + + wxNativeEncodingInfo info; + if ( !GetAltForEncoding(encoding, &info, facename, interactive) ) + return false; + + *encodingAlt = info.encoding; + + return true; +} + +bool wxFontMapper::IsEncodingAvailable(wxFontEncoding encoding, + const wxString& facename) +{ + wxNativeEncodingInfo info; + + if ( !wxGetNativeFontEncoding(encoding, &info) ) + return false; + + info.facename = facename; + return wxTestFontEncoding(info); +} + +#endif // wxUSE_FONTMAP diff --git a/Externals/wxWidgets/src/common/fontmgrcmn.cpp b/Externals/wxWidgets/src/common/fontmgrcmn.cpp new file mode 100644 index 0000000000..0ade79e254 --- /dev/null +++ b/Externals/wxWidgets/src/common/fontmgrcmn.cpp @@ -0,0 +1,345 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/fontmgrcmn.cpp +// Purpose: font management for ports that don't have their own +// Author: Vaclav Slavik +// Created: 2006-11-18 +// RCS-ID: $Id: fontmgrcmn.cpp 43550 2006-11-20 20:45:57Z VS $ +// Copyright: (c) 2001-2002 SciTech Software, Inc. (www.scitechsoft.com) +// (c) 2006 REA Elektronik GmbH +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#include "wx/private/fontmgr.h" + +#include "wx/listimpl.cpp" +#include "wx/hashmap.h" + +WX_DECLARE_LIST(wxFontInstance, wxFontInstanceList); +WX_DEFINE_LIST(wxFontInstanceList) +WX_DEFINE_LIST(wxFontBundleList) +WX_DECLARE_HASH_MAP(wxString, wxFontBundle*, + wxStringHash, wxStringEqual, + wxFontBundleHash); + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxFontFaceBase +// ---------------------------------------------------------------------------- + +wxFontFaceBase::wxFontFaceBase() + : m_refCnt(0) +{ + m_instances = new wxFontInstanceList; + m_instances->DeleteContents(true); +} + +wxFontFaceBase::~wxFontFaceBase() +{ + delete m_instances; +} + +void wxFontFaceBase::Acquire() +{ + m_refCnt++; +} + +void wxFontFaceBase::Release() +{ + if ( --m_refCnt == 0 ) + { + m_instances->Clear(); + } +} + +wxFontInstance *wxFontFaceBase::GetFontInstance(float ptSize, bool aa) +{ + wxASSERT_MSG( m_refCnt > 0, _T("font library not loaded!") ); + + wxFontInstance *i; + wxFontInstanceList::Node *node; + + for ( node = m_instances->GetFirst(); node; node = node->GetNext() ) + { + i = node->GetData(); + if ( i->GetPointSize() == ptSize && i->IsAntiAliased() == aa ) + return i; + } + + i = CreateFontInstance(ptSize, aa); + m_instances->Append(i); + return i; +} + +// ---------------------------------------------------------------------------- +// wxFontBundleBase +// ---------------------------------------------------------------------------- + +wxFontBundleBase::wxFontBundleBase() +{ + for (int i = 0; i < FaceType_Max; i++) + m_faces[i] = NULL; +} + +wxFontBundleBase::~wxFontBundleBase() +{ + for (int i = 0; i < FaceType_Max; i++) + delete m_faces[i]; +} + +wxFontFace *wxFontBundleBase::GetFace(FaceType type) const +{ + wxFontFace *f = m_faces[type]; + + wxCHECK_MSG( f, NULL, _T("no such face in font bundle") ); + + f->Acquire(); + + return f; +} + +wxFontFace * +wxFontBundleBase::GetFaceForFont(const wxFontMgrFontRefData& font) const +{ + wxASSERT_MSG( font.GetFaceName().empty() || font.GetFaceName() == GetName(), + _T("calling GetFaceForFont for incompatible font") ); + + int type = FaceType_Regular; + + if ( font.GetWeight() == wxBOLD ) + type |= FaceType_Bold; + + // FIXME -- this should read "if ( font->GetStyle() == wxITALIC )", + // but since MGL neither DFB supports slant, we try to display it with + // italic face (better than nothing...) + if ( font.GetStyle() == wxITALIC || font.GetStyle() == wxSLANT ) + { + if ( HasFace((FaceType)(type | FaceType_Italic)) ) + type |= FaceType_Italic; + } + + if ( !HasFace((FaceType)type) ) + { + for (int i = 0; i < FaceType_Max; i++) + { + if ( HasFace((FaceType)i) ) + return GetFace((FaceType)i); + } + + wxFAIL_MSG( _T("no face") ); + return NULL; + } + + return GetFace((FaceType)type); +} + +// ---------------------------------------------------------------------------- +// wxFontsManagerBase +// ---------------------------------------------------------------------------- + +wxFontsManager *wxFontsManagerBase::ms_instance = NULL; + +wxFontsManagerBase::wxFontsManagerBase() +{ + m_hash = new wxFontBundleHash(); + m_list = new wxFontBundleList; + m_list->DeleteContents(true); +} + +wxFontsManagerBase::~wxFontsManagerBase() +{ + delete m_hash; + delete m_list; +} + +/* static */ +wxFontsManager *wxFontsManagerBase::Get() +{ + if ( !ms_instance ) + ms_instance = new wxFontsManager(); + return ms_instance; +} + +/* static */ +void wxFontsManagerBase::CleanUp() +{ + wxDELETE(ms_instance); +} + +wxFontBundle *wxFontsManagerBase::GetBundle(const wxString& name) const +{ + return (*m_hash)[name.Lower()]; +} + +wxFontBundle * +wxFontsManagerBase::GetBundleForFont(const wxFontMgrFontRefData& font) const +{ + wxFontBundle *bundle = NULL; + + wxString facename = font.GetFaceName(); + if ( !facename.empty() ) + bundle = GetBundle(facename); + + if ( !bundle ) + { + facename = GetDefaultFacename((wxFontFamily)font.GetFamily()); + if ( !facename.empty() ) + bundle = GetBundle(facename); + } + + if ( !bundle ) + { + if ( m_list->GetFirst() ) + bundle = m_list->GetFirst()->GetData(); + else + wxFAIL_MSG(wxT("Fatal error, no fonts available!")); + } + + return bundle; +} + +void wxFontsManagerBase::AddBundle(wxFontBundle *bundle) +{ + (*m_hash)[bundle->GetName().Lower()] = bundle; + m_list->Append(bundle); +} + + +// ---------------------------------------------------------------------------- +// wxFontMgrFontRefData +// ---------------------------------------------------------------------------- + +wxFontMgrFontRefData::wxFontMgrFontRefData(int size, + int family, + int style, + int weight, + bool underlined, + const wxString& faceName, + wxFontEncoding encoding) +{ + if ( family == wxDEFAULT ) + family = wxSWISS; + if ( style == wxDEFAULT ) + style = wxNORMAL; + if ( weight == wxDEFAULT ) + weight = wxNORMAL; + if ( size == wxDEFAULT ) + size = 12; + + m_info.family = (wxFontFamily)family; + m_info.faceName = faceName; + m_info.style = (wxFontStyle)style; + m_info.weight = (wxFontWeight)weight; + m_info.pointSize = size; + m_info.underlined = underlined; + m_info.encoding = encoding; + + m_noAA = false; + + m_fontFace = NULL; + m_fontBundle = NULL; + m_fontValid = false; +} + +wxFontMgrFontRefData::wxFontMgrFontRefData(const wxFontMgrFontRefData& data) +{ + m_info = data.m_info; + m_noAA = data.m_noAA; + + m_fontFace = data.m_fontFace; + m_fontBundle = data.m_fontBundle; + m_fontValid = data.m_fontValid; + if ( m_fontFace ) + m_fontFace->Acquire(); +} + +wxFontMgrFontRefData::~wxFontMgrFontRefData() +{ + if ( m_fontFace ) + m_fontFace->Release(); +} + +wxFontBundle *wxFontMgrFontRefData::GetFontBundle() const +{ + wxConstCast(this, wxFontMgrFontRefData)->EnsureValidFont(); + return m_fontBundle; +} + +wxFontInstance * +wxFontMgrFontRefData::GetFontInstance(float scale, bool antialiased) const +{ + wxConstCast(this, wxFontMgrFontRefData)->EnsureValidFont(); + return m_fontFace->GetFontInstance(m_info.pointSize * scale, + antialiased && !m_noAA); +} + +void wxFontMgrFontRefData::SetPointSize(int pointSize) +{ + m_info.pointSize = pointSize; + m_fontValid = false; +} + +void wxFontMgrFontRefData::SetFamily(int family) +{ + m_info.family = (wxFontFamily)family; + m_fontValid = false; +} + +void wxFontMgrFontRefData::SetStyle(int style) +{ + m_info.style = (wxFontStyle)style; + m_fontValid = false; +} + +void wxFontMgrFontRefData::SetWeight(int weight) +{ + m_info.weight = (wxFontWeight)weight; + m_fontValid = false; +} + +void wxFontMgrFontRefData::SetFaceName(const wxString& faceName) +{ + m_info.faceName = faceName; + m_fontValid = false; +} + +void wxFontMgrFontRefData::SetUnderlined(bool underlined) +{ + m_info.underlined = underlined; + m_fontValid = false; +} + +void wxFontMgrFontRefData::SetEncoding(wxFontEncoding encoding) +{ + m_info.encoding = encoding; + m_fontValid = false; +} + +void wxFontMgrFontRefData::SetNoAntiAliasing(bool no) +{ + m_noAA = no; +} + + +void wxFontMgrFontRefData::EnsureValidFont() +{ + if ( !m_fontValid ) + { + wxFontFace *old = m_fontFace; + + m_fontBundle = wxFontsManager::Get()->GetBundleForFont(*this); + m_fontFace = m_fontBundle->GetFaceForFont(*this); + + if ( old ) + old->Release(); + } +} diff --git a/Externals/wxWidgets/src/common/fontpickercmn.cpp b/Externals/wxWidgets/src/common/fontpickercmn.cpp new file mode 100644 index 0000000000..08808e996c --- /dev/null +++ b/Externals/wxWidgets/src/common/fontpickercmn.cpp @@ -0,0 +1,181 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/common/fontpickercmn.cpp +// Purpose: wxFontPickerCtrl class implementation +// Author: Francesco Montorsi +// Modified by: +// Created: 15/04/2006 +// RCS-ID: $Id: fontpickercmn.cpp 42999 2006-11-03 21:54:13Z VZ $ +// Copyright: (c) Francesco Montorsi +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_FONTPICKERCTRL + +#include "wx/fontpicker.h" + +#ifndef WX_PRECOMP + #include "wx/textctrl.h" +#endif + +#include "wx/fontenum.h" +#include "wx/tokenzr.h" + +// ============================================================================ +// implementation +// ============================================================================ + +const wxChar wxFontPickerCtrlNameStr[] = wxT("fontpicker"); +const wxChar wxFontPickerWidgetNameStr[] = wxT("fontpickerwidget"); + +DEFINE_EVENT_TYPE(wxEVT_COMMAND_FONTPICKER_CHANGED) +IMPLEMENT_DYNAMIC_CLASS(wxFontPickerCtrl, wxPickerBase) +IMPLEMENT_DYNAMIC_CLASS(wxFontPickerEvent, wxCommandEvent) + +// ---------------------------------------------------------------------------- +// wxFontPickerCtrl +// ---------------------------------------------------------------------------- + +#define M_PICKER ((wxFontPickerWidget*)m_picker) + +bool wxFontPickerCtrl::Create( wxWindow *parent, wxWindowID id, + const wxFont &initial, + const wxPoint &pos, const wxSize &size, + long style, const wxValidator& validator, + const wxString &name ) +{ + if (!wxPickerBase::CreateBase(parent, id, + Font2String(initial.IsOk() ? initial + : *wxNORMAL_FONT), + pos, size, style, validator, name)) + return false; + + // the picker of a wxFontPickerCtrl is a wxFontPickerWidget + m_picker = new wxFontPickerWidget(this, wxID_ANY, initial, + wxDefaultPosition, wxDefaultSize, + GetPickerStyle(style)); + // complete sizer creation + wxPickerBase::PostCreation(); + + m_picker->Connect(wxEVT_COMMAND_FONTPICKER_CHANGED, + wxFontPickerEventHandler(wxFontPickerCtrl::OnFontChange), + NULL, this); + + return true; +} + +wxString wxFontPickerCtrl::Font2String(const wxFont &f) +{ + wxString ret = f.GetNativeFontInfoUserDesc(); +#ifdef __WXMSW__ + // on wxMSW the encoding of the font is appended at the end of the string; + // since encoding is not very user-friendly we remove it. + wxFontEncoding enc = f.GetEncoding(); + if ( enc != wxFONTENCODING_DEFAULT && enc != wxFONTENCODING_SYSTEM ) + ret = ret.BeforeLast(wxT(' ')); +#endif + return ret; +} + +wxFont wxFontPickerCtrl::String2Font(const wxString &s) +{ + wxString str(s); + wxFont ret; + double n; + + // put a limit on the maximum point size which the user can enter + // NOTE: we suppose the last word of given string is the pointsize + wxString size = str.AfterLast(wxT(' ')); + if (size.ToDouble(&n)) + { + if (n < 1) + str = str.Left(str.length() - size.length()) + wxT("1"); + else if (n >= m_nMaxPointSize) + str = str.Left(str.length() - size.length()) + + wxString::Format(wxT("%d"), m_nMaxPointSize); + } + + if (!ret.SetNativeFontInfoUserDesc(str)) + return wxNullFont; + + return ret; +} + +void wxFontPickerCtrl::SetSelectedFont(const wxFont &f) +{ + M_PICKER->SetSelectedFont(f); + UpdateTextCtrlFromPicker(); +} + +void wxFontPickerCtrl::UpdatePickerFromTextCtrl() +{ + wxASSERT(m_text); + + if (m_bIgnoreNextTextCtrlUpdate) + { + // ignore this update + m_bIgnoreNextTextCtrlUpdate = false; + return; + } + + // NB: we don't use the wxFont::wxFont(const wxString &) constructor + // since that constructor expects the native font description + // string returned by wxFont::GetNativeFontInfoDesc() and not + // the user-friendly one returned by wxFont::GetNativeFontInfoUserDesc() + wxFont f = String2Font(m_text->GetValue()); + if (!f.Ok()) + return; // invalid user input + + if (M_PICKER->GetSelectedFont() != f) + { + M_PICKER->SetSelectedFont(f); + + // fire an event + wxFontPickerEvent event(this, GetId(), f); + GetEventHandler()->ProcessEvent(event); + } +} + +void wxFontPickerCtrl::UpdateTextCtrlFromPicker() +{ + if (!m_text) + return; // no textctrl to update + + // NOTE: this SetValue() will generate an unwanted wxEVT_COMMAND_TEXT_UPDATED + // which will trigger a unneeded UpdateFromTextCtrl(); thus before using + // SetValue() we set the m_bIgnoreNextTextCtrlUpdate flag... + m_bIgnoreNextTextCtrlUpdate = true; + m_text->SetValue(Font2String(M_PICKER->GetSelectedFont())); +} + + + +// ---------------------------------------------------------------------------- +// wxFontPickerCtrl - event handlers +// ---------------------------------------------------------------------------- + +void wxFontPickerCtrl::OnFontChange(wxFontPickerEvent &ev) +{ + UpdateTextCtrlFromPicker(); + + // the wxFontPickerWidget sent us a colour-change notification. + // forward this event to our parent + wxFontPickerEvent event(this, GetId(), ev.GetFont()); + GetEventHandler()->ProcessEvent(event); +} + +#endif // wxUSE_FONTPICKERCTRL diff --git a/Externals/wxWidgets/src/common/framecmn.cpp b/Externals/wxWidgets/src/common/framecmn.cpp new file mode 100644 index 0000000000..aee874e199 --- /dev/null +++ b/Externals/wxWidgets/src/common/framecmn.cpp @@ -0,0 +1,586 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/framecmn.cpp +// Purpose: common (for all platforms) wxFrame functions +// Author: Julian Smart, Vadim Zeitlin +// Created: 01/02/97 +// Id: $Id: framecmn.cpp 49740 2007-11-09 11:08:13Z JS $ +// Copyright: (c) 1998 Robert Roebling and Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#include "wx/frame.h" + +#ifndef WX_PRECOMP + #include "wx/menu.h" + #include "wx/menuitem.h" + #include "wx/dcclient.h" + #include "wx/toolbar.h" + #include "wx/statusbr.h" +#endif // WX_PRECOMP + +// ---------------------------------------------------------------------------- +// event table +// ---------------------------------------------------------------------------- + +#if wxUSE_MENUS && wxUSE_STATUSBAR + +BEGIN_EVENT_TABLE(wxFrameBase, wxTopLevelWindow) + EVT_MENU_OPEN(wxFrameBase::OnMenuOpen) + EVT_MENU_CLOSE(wxFrameBase::OnMenuClose) + + EVT_MENU_HIGHLIGHT_ALL(wxFrameBase::OnMenuHighlight) +END_EVENT_TABLE() + +#endif // wxUSE_MENUS && wxUSE_STATUSBAR + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// construction/destruction +// ---------------------------------------------------------------------------- + +wxFrameBase::wxFrameBase() +{ +#if wxUSE_MENUS + m_frameMenuBar = NULL; +#endif // wxUSE_MENUS + +#if wxUSE_TOOLBAR + m_frameToolBar = NULL; +#endif // wxUSE_TOOLBAR + +#if wxUSE_STATUSBAR + m_frameStatusBar = NULL; +#endif // wxUSE_STATUSBAR + + m_statusBarPane = 0; +} + +wxFrameBase::~wxFrameBase() +{ + // this destructor is required for Darwin +} + +wxFrame *wxFrameBase::New(wxWindow *parent, + wxWindowID id, + const wxString& title, + const wxPoint& pos, + const wxSize& size, + long style, + const wxString& name) +{ + return new wxFrame(parent, id, title, pos, size, style, name); +} + +void wxFrameBase::DeleteAllBars() +{ +#if wxUSE_MENUS + if ( m_frameMenuBar ) + { + delete m_frameMenuBar; + m_frameMenuBar = (wxMenuBar *) NULL; + } +#endif // wxUSE_MENUS + +#if wxUSE_STATUSBAR + if ( m_frameStatusBar ) + { + delete m_frameStatusBar; + m_frameStatusBar = (wxStatusBar *) NULL; + } +#endif // wxUSE_STATUSBAR + +#if wxUSE_TOOLBAR + if ( m_frameToolBar ) + { + delete m_frameToolBar; + m_frameToolBar = (wxToolBar *) NULL; + } +#endif // wxUSE_TOOLBAR +} + +bool wxFrameBase::IsOneOfBars(const wxWindow *win) const +{ +#if wxUSE_MENUS + if ( win == GetMenuBar() ) + return true; +#endif // wxUSE_MENUS + +#if wxUSE_STATUSBAR + if ( win == GetStatusBar() ) + return true; +#endif // wxUSE_STATUSBAR + +#if wxUSE_TOOLBAR + if ( win == GetToolBar() ) + return true; +#endif // wxUSE_TOOLBAR + + return false; +} + +// ---------------------------------------------------------------------------- +// wxFrame size management: we exclude the areas taken by menu/status/toolbars +// from the client area, so the client area is what's really available for the +// frame contents +// ---------------------------------------------------------------------------- + +// get the origin of the client area in the client coordinates +wxPoint wxFrameBase::GetClientAreaOrigin() const +{ + wxPoint pt = wxTopLevelWindow::GetClientAreaOrigin(); + +#if wxUSE_TOOLBAR && !defined(__WXUNIVERSAL__) + wxToolBar *toolbar = GetToolBar(); + if ( toolbar && toolbar->IsShown() ) + { + int w, h; + toolbar->GetSize(&w, &h); + + if ( toolbar->GetWindowStyleFlag() & wxTB_VERTICAL ) + { + pt.x += w; + } + else + { + pt.y += h; + } + } +#endif // wxUSE_TOOLBAR + + return pt; +} + + +void wxFrameBase::SendSizeEvent() +{ + wxSizeEvent event( GetSize(), GetId() ); + event.SetEventObject( this ); + GetEventHandler()->AddPendingEvent( event ); + +#ifdef __WXGTK__ + // SendSizeEvent is typically called when a toolbar is shown + // or hidden, but sending the size event alone is not enough + // to trigger a full layout. + ((wxFrame*)this)->GtkOnSize(); +#endif +} + + +// ---------------------------------------------------------------------------- +// misc +// ---------------------------------------------------------------------------- + +bool wxFrameBase::ProcessCommand(int id) +{ +#if wxUSE_MENUS + wxMenuBar *bar = GetMenuBar(); + if ( !bar ) + return false; + + wxCommandEvent commandEvent(wxEVT_COMMAND_MENU_SELECTED, id); + commandEvent.SetEventObject(this); + + wxMenuItem *item = bar->FindItem(id); + if (item) + { + if (!item->IsEnabled()) + return true; + + if ((item->GetKind() == wxITEM_RADIO) && item->IsChecked() ) + return true; + + if (item->IsCheckable()) + { + item->Toggle(); + + // use the new value + commandEvent.SetInt(item->IsChecked()); + } + } + + GetEventHandler()->ProcessEvent(commandEvent); + return true; +#else // !wxUSE_MENUS + return false; +#endif // wxUSE_MENUS/!wxUSE_MENUS +} + +// Do the UI update processing for this window. This is +// provided for the application to call if it wants to +// force a UI update, particularly for the menus and toolbar. +void wxFrameBase::UpdateWindowUI(long flags) +{ + wxWindowBase::UpdateWindowUI(flags); + +#if wxUSE_TOOLBAR + if (GetToolBar()) + GetToolBar()->UpdateWindowUI(flags); +#endif + +#if wxUSE_MENUS + if (GetMenuBar()) + { + if ((flags & wxUPDATE_UI_FROMIDLE) && !wxUSE_IDLEMENUUPDATES) + { + // If coming from an idle event, we only + // want to update the menus if we're + // in the wxUSE_IDLEMENUUPDATES configuration: + // so if we're not, do nothing + } + else + DoMenuUpdates(); + } +#endif // wxUSE_MENUS +} + +// ---------------------------------------------------------------------------- +// event handlers for status bar updates from menus +// ---------------------------------------------------------------------------- + +#if wxUSE_MENUS && wxUSE_STATUSBAR + +void wxFrameBase::OnMenuHighlight(wxMenuEvent& event) +{ +#if wxUSE_STATUSBAR + (void)ShowMenuHelp(GetStatusBar(), event.GetMenuId()); +#endif // wxUSE_STATUSBAR +} + +#if !wxUSE_IDLEMENUUPDATES +void wxFrameBase::OnMenuOpen(wxMenuEvent& event) +#else +void wxFrameBase::OnMenuOpen(wxMenuEvent& WXUNUSED(event)) +#endif +{ +#if !wxUSE_IDLEMENUUPDATES + DoMenuUpdates(event.GetMenu()); +#endif // !wxUSE_IDLEMENUUPDATES +} + +void wxFrameBase::OnMenuClose(wxMenuEvent& WXUNUSED(event)) +{ + // do we have real status text to restore? + if ( !m_oldStatusText.empty() ) + { + if ( m_statusBarPane >= 0 ) + { + wxStatusBar *statbar = GetStatusBar(); + if ( statbar ) + statbar->SetStatusText(m_oldStatusText, m_statusBarPane); + } + + m_oldStatusText.clear(); + } +} + +#endif // wxUSE_MENUS && wxUSE_STATUSBAR + +// Implement internal behaviour (menu updating on some platforms) +void wxFrameBase::OnInternalIdle() +{ + wxTopLevelWindow::OnInternalIdle(); + +#if wxUSE_MENUS && wxUSE_IDLEMENUUPDATES + if (wxUpdateUIEvent::CanUpdate(this)) + DoMenuUpdates(); +#endif +} + +// ---------------------------------------------------------------------------- +// status bar stuff +// ---------------------------------------------------------------------------- + +#if wxUSE_STATUSBAR + +wxStatusBar* wxFrameBase::CreateStatusBar(int number, + long style, + wxWindowID id, + const wxString& name) +{ + // the main status bar can only be created once (or else it should be + // deleted before calling CreateStatusBar() again) + wxCHECK_MSG( !m_frameStatusBar, (wxStatusBar *)NULL, + wxT("recreating status bar in wxFrame") ); + + SetStatusBar(OnCreateStatusBar(number, style, id, name)); + + return m_frameStatusBar; +} + +wxStatusBar *wxFrameBase::OnCreateStatusBar(int number, + long style, + wxWindowID id, + const wxString& name) +{ + wxStatusBar *statusBar = new wxStatusBar(this, id, style, name); + + statusBar->SetFieldsCount(number); + + return statusBar; +} + +void wxFrameBase::SetStatusText(const wxString& text, int number) +{ + wxCHECK_RET( m_frameStatusBar != NULL, wxT("no statusbar to set text for") ); + + m_frameStatusBar->SetStatusText(text, number); +} + +void wxFrameBase::SetStatusWidths(int n, const int widths_field[] ) +{ + wxCHECK_RET( m_frameStatusBar != NULL, wxT("no statusbar to set widths for") ); + + m_frameStatusBar->SetStatusWidths(n, widths_field); + + PositionStatusBar(); +} + +void wxFrameBase::PushStatusText(const wxString& text, int number) +{ + wxCHECK_RET( m_frameStatusBar != NULL, wxT("no statusbar to set text for") ); + + m_frameStatusBar->PushStatusText(text, number); +} + +void wxFrameBase::PopStatusText(int number) +{ + wxCHECK_RET( m_frameStatusBar != NULL, wxT("no statusbar to set text for") ); + + m_frameStatusBar->PopStatusText(number); +} + +bool wxFrameBase::ShowMenuHelp(wxStatusBar *WXUNUSED(statbar), int menuId) +{ +#if wxUSE_MENUS + // if no help string found, we will clear the status bar text + wxString helpString; + bool show = menuId != wxID_SEPARATOR && menuId != -2 /* wxID_TITLE */; + + if ( show ) + { + wxMenuBar *menuBar = GetMenuBar(); + if ( menuBar ) + { + // it's ok if we don't find the item because it might belong + // to the popup menu + wxMenuItem *item = menuBar->FindItem(menuId); + if ( item ) + helpString = item->GetHelp(); + } + } + + DoGiveHelp(helpString, show); + + return !helpString.empty(); +#else // !wxUSE_MENUS + return false; +#endif // wxUSE_MENUS/!wxUSE_MENUS +} + +void wxFrameBase::SetStatusBar(wxStatusBar *statBar) +{ + bool hadBar = m_frameStatusBar != NULL; + m_frameStatusBar = statBar; + + if ( (m_frameStatusBar != NULL) != hadBar ) + { + PositionStatusBar(); + + DoLayout(); + } +} + +#endif // wxUSE_STATUSBAR + +#if wxUSE_MENUS || wxUSE_TOOLBAR +void wxFrameBase::DoGiveHelp(const wxString& text, bool show) +{ +#if wxUSE_STATUSBAR + if ( m_statusBarPane < 0 ) + { + // status bar messages disabled + return; + } + + wxStatusBar *statbar = GetStatusBar(); + if ( !statbar ) + return; + + wxString help; + if ( show ) + { + help = text; + + // remember the old status bar text if this is the first time we're + // called since the menu has been opened as we're going to overwrite it + // in our DoGiveHelp() and we want to restore it when the menu is + // closed + // + // note that it would be logical to do this in OnMenuOpen() but under + // MSW we get an EVT_MENU_HIGHLIGHT before EVT_MENU_OPEN, strangely + // enough, and so this doesn't work and instead we use the ugly trick + // with using special m_oldStatusText value as "menu opened" (but it is + // arguably better than adding yet another member variable to wxFrame + // on all platforms) + if ( m_oldStatusText.empty() ) + { + m_oldStatusText = statbar->GetStatusText(m_statusBarPane); + if ( m_oldStatusText.empty() ) + { + // use special value to prevent us from doing this the next time + m_oldStatusText += _T('\0'); + } + } + } + else // hide the status bar text + { + // i.e. restore the old one + help = m_oldStatusText; + + // make sure we get the up to date text when showing it the next time + m_oldStatusText.clear(); + } + + statbar->SetStatusText(help, m_statusBarPane); +#else + wxUnusedVar(text); + wxUnusedVar(show); +#endif // wxUSE_STATUSBAR +} +#endif // wxUSE_MENUS || wxUSE_TOOLBAR + + +// ---------------------------------------------------------------------------- +// toolbar stuff +// ---------------------------------------------------------------------------- + +#if wxUSE_TOOLBAR + +wxToolBar* wxFrameBase::CreateToolBar(long style, + wxWindowID id, + const wxString& name) +{ + // the main toolbar can't be recreated (unless it was explicitly deleted + // before) + wxCHECK_MSG( !m_frameToolBar, (wxToolBar *)NULL, + wxT("recreating toolbar in wxFrame") ); + + if ( style == -1 ) + { + // use default style + // + // NB: we don't specify the default value in the method declaration + // because + // a) this allows us to have different defaults for different + // platforms (even if we don't have them right now) + // b) we don't need to include wx/toolbar.h in the header then + style = wxBORDER_NONE | wxTB_HORIZONTAL | wxTB_FLAT; + } + + SetToolBar(OnCreateToolBar(style, id, name)); + + return m_frameToolBar; +} + +wxToolBar* wxFrameBase::OnCreateToolBar(long style, + wxWindowID id, + const wxString& name) +{ +#if defined(__WXWINCE__) && defined(__POCKETPC__) + return new wxToolMenuBar(this, id, + wxDefaultPosition, wxDefaultSize, + style, name); +#else + return new wxToolBar(this, id, + wxDefaultPosition, wxDefaultSize, + style, name); +#endif +} + +void wxFrameBase::SetToolBar(wxToolBar *toolbar) +{ + bool hadBar = m_frameToolBar != NULL; + m_frameToolBar = toolbar; + + if ( (m_frameToolBar != NULL) != hadBar ) + { + PositionToolBar(); + + DoLayout(); + } +} + +#endif // wxUSE_TOOLBAR + +// ---------------------------------------------------------------------------- +// menus +// ---------------------------------------------------------------------------- + +#if wxUSE_MENUS + +// update all menus +void wxFrameBase::DoMenuUpdates(wxMenu* menu) +{ + if (menu) + { + wxEvtHandler* source = GetEventHandler(); + menu->UpdateUI(source); + } + else + { + wxMenuBar* bar = GetMenuBar(); + if (bar != NULL) + bar->UpdateMenus(); + } +} + +void wxFrameBase::DetachMenuBar() +{ + if ( m_frameMenuBar ) + { + m_frameMenuBar->Detach(); + m_frameMenuBar = NULL; + } +} + +void wxFrameBase::AttachMenuBar(wxMenuBar *menubar) +{ + if ( menubar ) + { + menubar->Attach((wxFrame *)this); + m_frameMenuBar = menubar; + } +} + +void wxFrameBase::SetMenuBar(wxMenuBar *menubar) +{ + if ( menubar == GetMenuBar() ) + { + // nothing to do + return; + } + + DetachMenuBar(); + + this->AttachMenuBar(menubar); +} + +#endif // wxUSE_MENUS diff --git a/Externals/wxWidgets/src/common/fs_arc.cpp b/Externals/wxWidgets/src/common/fs_arc.cpp new file mode 100644 index 0000000000..70a03372d0 --- /dev/null +++ b/Externals/wxWidgets/src/common/fs_arc.cpp @@ -0,0 +1,533 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: fs_arc.cpp +// Purpose: wxArchive file system +// Author: Vaclav Slavik, Mike Wetherell +// Copyright: (c) 1999 Vaclav Slavik, (c) 2006 Mike Wetherell +// CVS-ID: $Id: fs_arc.cpp 43505 2006-11-19 02:11:40Z MW $ +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ +#pragma hdrstop +#endif + +#if wxUSE_FS_ARCHIVE + +#include "wx/fs_arc.h" + +#ifndef WXPRECOMP + #include "wx/intl.h" + #include "wx/log.h" +#endif + +#if WXWIN_COMPATIBILITY_2_6 + #include "wx/zipstrm.h" +#else + #include "wx/archive.h" +#endif + +#include "wx/private/fileback.h" + +//--------------------------------------------------------------------------- +// wxArchiveFSCacheDataImpl +// +// Holds the catalog of an archive file, and if it is being read from a +// non-seekable stream, a copy of its backing file. +// +// This class is actually the reference counted implementation for the +// wxArchiveFSCacheData class below. It was done that way to allow sharing +// between instances of wxFileSystem, though that's a feature not used in this +// version. +//--------------------------------------------------------------------------- + +WX_DECLARE_STRING_HASH_MAP(wxArchiveEntry*, wxArchiveFSEntryHash); + +struct wxArchiveFSEntry +{ + wxArchiveEntry *entry; + wxArchiveFSEntry *next; +}; + +class wxArchiveFSCacheDataImpl +{ +public: + wxArchiveFSCacheDataImpl(const wxArchiveClassFactory& factory, + const wxBackingFile& backer); + wxArchiveFSCacheDataImpl(const wxArchiveClassFactory& factory, + wxInputStream *stream); + + ~wxArchiveFSCacheDataImpl(); + + void Release() { if (--m_refcount == 0) delete this; } + wxArchiveFSCacheDataImpl *AddRef() { m_refcount++; return this; } + + wxArchiveEntry *Get(const wxString& name); + wxInputStream *NewStream() const; + + wxArchiveFSEntry *GetNext(wxArchiveFSEntry *fse); + +private: + wxArchiveFSEntry *AddToCache(wxArchiveEntry *entry); + void CloseStreams(); + + int m_refcount; + + wxArchiveFSEntryHash m_hash; + wxArchiveFSEntry *m_begin; + wxArchiveFSEntry **m_endptr; + + wxBackingFile m_backer; + wxInputStream *m_stream; + wxArchiveInputStream *m_archive; +}; + +wxArchiveFSCacheDataImpl::wxArchiveFSCacheDataImpl( + const wxArchiveClassFactory& factory, + const wxBackingFile& backer) + : m_refcount(1), + m_begin(NULL), + m_endptr(&m_begin), + m_backer(backer), + m_stream(new wxBackedInputStream(backer)), + m_archive(factory.NewStream(*m_stream)) +{ +} + +wxArchiveFSCacheDataImpl::wxArchiveFSCacheDataImpl( + const wxArchiveClassFactory& factory, + wxInputStream *stream) + : m_refcount(1), + m_begin(NULL), + m_endptr(&m_begin), + m_stream(stream), + m_archive(factory.NewStream(*m_stream)) +{ +} + +wxArchiveFSCacheDataImpl::~wxArchiveFSCacheDataImpl() +{ + WX_CLEAR_HASH_MAP(wxArchiveFSEntryHash, m_hash); + + wxArchiveFSEntry *entry = m_begin; + + while (entry) + { + wxArchiveFSEntry *next = entry->next; + delete entry; + entry = next; + } + + CloseStreams(); +} + +wxArchiveFSEntry *wxArchiveFSCacheDataImpl::AddToCache(wxArchiveEntry *entry) +{ + m_hash[entry->GetName(wxPATH_UNIX)] = entry; + wxArchiveFSEntry *fse = new wxArchiveFSEntry; + *m_endptr = fse; + (*m_endptr)->entry = entry; + (*m_endptr)->next = NULL; + m_endptr = &(*m_endptr)->next; + return fse; +} + +void wxArchiveFSCacheDataImpl::CloseStreams() +{ + delete m_archive; + m_archive = NULL; + delete m_stream; + m_stream = NULL; +} + +wxArchiveEntry *wxArchiveFSCacheDataImpl::Get(const wxString& name) +{ + wxArchiveFSEntryHash::iterator it = m_hash.find(name); + + if (it != m_hash.end()) + return it->second; + + if (!m_archive) + return NULL; + + wxArchiveEntry *entry; + + while ((entry = m_archive->GetNextEntry()) != NULL) + { + AddToCache(entry); + + if (entry->GetName(wxPATH_UNIX) == name) + return entry; + } + + CloseStreams(); + + return NULL; +} + +wxInputStream* wxArchiveFSCacheDataImpl::NewStream() const +{ + if (m_backer) + return new wxBackedInputStream(m_backer); + else + return NULL; +} + +wxArchiveFSEntry *wxArchiveFSCacheDataImpl::GetNext(wxArchiveFSEntry *fse) +{ + wxArchiveFSEntry *next = fse ? fse->next : m_begin; + + if (!next && m_archive) + { + wxArchiveEntry *entry = m_archive->GetNextEntry(); + + if (entry) + next = AddToCache(entry); + else + CloseStreams(); + } + + return next; +} + +//--------------------------------------------------------------------------- +// wxArchiveFSCacheData +// +// This is the inteface for wxArchiveFSCacheDataImpl above. Holds the catalog +// of an archive file, and if it is being read from a non-seekable stream, a +// copy of its backing file. +//--------------------------------------------------------------------------- + +class wxArchiveFSCacheData +{ +public: + wxArchiveFSCacheData() : m_impl(NULL) { } + wxArchiveFSCacheData(const wxArchiveClassFactory& factory, + const wxBackingFile& backer); + wxArchiveFSCacheData(const wxArchiveClassFactory& factory, + wxInputStream *stream); + + wxArchiveFSCacheData(const wxArchiveFSCacheData& data); + wxArchiveFSCacheData& operator=(const wxArchiveFSCacheData& data); + + ~wxArchiveFSCacheData() { if (m_impl) m_impl->Release(); } + + wxArchiveEntry *Get(const wxString& name) { return m_impl->Get(name); } + wxInputStream *NewStream() const { return m_impl->NewStream(); } + wxArchiveFSEntry *GetNext(wxArchiveFSEntry *fse) + { return m_impl->GetNext(fse); } + +private: + wxArchiveFSCacheDataImpl *m_impl; +}; + +wxArchiveFSCacheData::wxArchiveFSCacheData( + const wxArchiveClassFactory& factory, + const wxBackingFile& backer) + : m_impl(new wxArchiveFSCacheDataImpl(factory, backer)) +{ +} + +wxArchiveFSCacheData::wxArchiveFSCacheData( + const wxArchiveClassFactory& factory, + wxInputStream *stream) + : m_impl(new wxArchiveFSCacheDataImpl(factory, stream)) +{ +} + +wxArchiveFSCacheData::wxArchiveFSCacheData(const wxArchiveFSCacheData& data) + : m_impl(data.m_impl ? data.m_impl->AddRef() : NULL) +{ +} + +wxArchiveFSCacheData& wxArchiveFSCacheData::operator=( + const wxArchiveFSCacheData& data) +{ + if (data.m_impl != m_impl) + { + if (m_impl) + m_impl->Release(); + + m_impl = data.m_impl; + + if (m_impl) + m_impl->AddRef(); + } + + return *this; +} + +//--------------------------------------------------------------------------- +// wxArchiveFSCache +// +// wxArchiveFSCacheData caches a single archive, and this class holds a +// collection of them to cache all the archives accessed by this instance +// of wxFileSystem. +//--------------------------------------------------------------------------- + +WX_DECLARE_STRING_HASH_MAP(wxArchiveFSCacheData, wxArchiveFSCacheDataHash); + +class wxArchiveFSCache +{ +public: + wxArchiveFSCache() { } + ~wxArchiveFSCache() { } + + wxArchiveFSCacheData* Add(const wxString& name, + const wxArchiveClassFactory& factory, + wxInputStream *stream); + + wxArchiveFSCacheData *Get(const wxString& name); + +private: + wxArchiveFSCacheDataHash m_hash; +}; + +wxArchiveFSCacheData* wxArchiveFSCache::Add( + const wxString& name, + const wxArchiveClassFactory& factory, + wxInputStream *stream) +{ + wxArchiveFSCacheData& data = m_hash[name]; + + if (stream->IsSeekable()) + data = wxArchiveFSCacheData(factory, stream); + else + data = wxArchiveFSCacheData(factory, wxBackingFile(stream)); + + return &data; +} + +wxArchiveFSCacheData *wxArchiveFSCache::Get(const wxString& name) +{ + wxArchiveFSCacheDataHash::iterator it; + + if ((it = m_hash.find(name)) != m_hash.end()) + return &it->second; + + return NULL; +} + +//---------------------------------------------------------------------------- +// wxArchiveFSHandler +//---------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxArchiveFSHandler, wxFileSystemHandler) + +wxArchiveFSHandler::wxArchiveFSHandler() + : wxFileSystemHandler() +{ + m_Archive = NULL; + m_FindEntry = NULL; + m_ZipFile = m_Pattern = m_BaseDir = wxEmptyString; + m_AllowDirs = m_AllowFiles = true; + m_DirsFound = NULL; + m_cache = NULL; +} + +wxArchiveFSHandler::~wxArchiveFSHandler() +{ + Cleanup(); + delete m_cache; +} + +void wxArchiveFSHandler::Cleanup() +{ + wxDELETE(m_DirsFound); +} + +bool wxArchiveFSHandler::CanOpen(const wxString& location) +{ + wxString p = GetProtocol(location); + return wxArchiveClassFactory::Find(p) != NULL; +} + +wxFSFile* wxArchiveFSHandler::OpenFile( + wxFileSystem& WXUNUSED(fs), + const wxString& location) +{ + wxString right = GetRightLocation(location); + wxString left = GetLeftLocation(location); + wxString protocol = GetProtocol(location); + wxString key = left + wxT("#") + protocol + wxT(":"); + + if (right.Contains(wxT("./"))) + { + if (right.GetChar(0) != wxT('/')) right = wxT('/') + right; + wxFileName rightPart(right, wxPATH_UNIX); + rightPart.Normalize(wxPATH_NORM_DOTS, wxT("/"), wxPATH_UNIX); + right = rightPart.GetFullPath(wxPATH_UNIX); + } + + if (right.GetChar(0) == wxT('/')) right = right.Mid(1); + + if (!m_cache) + m_cache = new wxArchiveFSCache; + + const wxArchiveClassFactory *factory; + factory = wxArchiveClassFactory::Find(protocol); + if (!factory) + return NULL; + + wxArchiveFSCacheData *cached = m_cache->Get(key); + if (!cached) + { + wxFSFile *leftFile = m_fs.OpenFile(left); + if (!leftFile) + return NULL; + cached = m_cache->Add(key, *factory, leftFile->DetachStream()); + delete leftFile; + } + + wxArchiveEntry *entry = cached->Get(right); + if (!entry) + return NULL; + + wxInputStream *leftStream = cached->NewStream(); + if (!leftStream) + { + wxFSFile *leftFile = m_fs.OpenFile(left); + if (!leftFile) + return NULL; + leftStream = leftFile->DetachStream(); + delete leftFile; + } + + wxArchiveInputStream *s = factory->NewStream(leftStream); + s->OpenEntry(*entry); + + if (s && s->IsOk()) + { +#if WXWIN_COMPATIBILITY_2_6 + if (factory->IsKindOf(CLASSINFO(wxZipClassFactory))) + ((wxZipInputStream*)s)->m_allowSeeking = true; +#endif // WXWIN_COMPATIBILITY_2_6 + + return new wxFSFile(s, + key + right, + GetMimeTypeFromExt(location), + GetAnchor(location) +#if wxUSE_DATETIME + , entry->GetDateTime() +#endif // wxUSE_DATETIME + ); + } + + delete s; + return NULL; +} + +wxString wxArchiveFSHandler::FindFirst(const wxString& spec, int flags) +{ + wxString right = GetRightLocation(spec); + wxString left = GetLeftLocation(spec); + wxString protocol = GetProtocol(spec); + wxString key = left + wxT("#") + protocol + wxT(":"); + + if (!right.empty() && right.Last() == wxT('/')) right.RemoveLast(); + + if (!m_cache) + m_cache = new wxArchiveFSCache; + + const wxArchiveClassFactory *factory; + factory = wxArchiveClassFactory::Find(protocol); + if (!factory) + return wxEmptyString; + + m_Archive = m_cache->Get(key); + if (!m_Archive) + { + wxFSFile *leftFile = m_fs.OpenFile(left); + if (!leftFile) + return wxEmptyString; + m_Archive = m_cache->Add(key, *factory, leftFile->DetachStream()); + delete leftFile; + } + + m_FindEntry = NULL; + + switch (flags) + { + case wxFILE: + m_AllowDirs = false, m_AllowFiles = true; break; + case wxDIR: + m_AllowDirs = true, m_AllowFiles = false; break; + default: + m_AllowDirs = m_AllowFiles = true; break; + } + + m_ZipFile = key; + + m_Pattern = right.AfterLast(wxT('/')); + m_BaseDir = right.BeforeLast(wxT('/')); + if (m_BaseDir.StartsWith(wxT("/"))) + m_BaseDir = m_BaseDir.Mid(1); + + if (m_Archive) + { + if (m_AllowDirs) + { + delete m_DirsFound; + m_DirsFound = new wxArchiveFilenameHashMap(); + if (right.empty()) // allow "/" to match the archive root + return spec; + } + return DoFind(); + } + return wxEmptyString; +} + +wxString wxArchiveFSHandler::FindNext() +{ + if (!m_Archive) return wxEmptyString; + return DoFind(); +} + +wxString wxArchiveFSHandler::DoFind() +{ + wxString namestr, dir, filename; + wxString match = wxEmptyString; + + while (match == wxEmptyString) + { + m_FindEntry = m_Archive->GetNext(m_FindEntry); + + if (!m_FindEntry) + { + m_Archive = NULL; + m_FindEntry = NULL; + break; + } + namestr = m_FindEntry->entry->GetName(wxPATH_UNIX); + + if (m_AllowDirs) + { + dir = namestr.BeforeLast(wxT('/')); + while (!dir.empty()) + { + if( m_DirsFound->find(dir) == m_DirsFound->end() ) + { + (*m_DirsFound)[dir] = 1; + filename = dir.AfterLast(wxT('/')); + dir = dir.BeforeLast(wxT('/')); + if (!filename.empty() && m_BaseDir == dir && + wxMatchWild(m_Pattern, filename, false)) + match = m_ZipFile + dir + wxT("/") + filename; + } + else + break; // already tranversed + } + } + + filename = namestr.AfterLast(wxT('/')); + dir = namestr.BeforeLast(wxT('/')); + if (m_AllowFiles && !filename.empty() && m_BaseDir == dir && + wxMatchWild(m_Pattern, filename, false)) + match = m_ZipFile + namestr; + } + + return match; +} + +#endif // wxUSE_FS_ARCHIVE diff --git a/Externals/wxWidgets/src/common/fs_filter.cpp b/Externals/wxWidgets/src/common/fs_filter.cpp new file mode 100644 index 0000000000..adaf0cba11 --- /dev/null +++ b/Externals/wxWidgets/src/common/fs_filter.cpp @@ -0,0 +1,92 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/fs_filter.cpp +// Purpose: wxFilter file system handler +// Author: Mike Wetherell +// Copyright: (c) 2006 Mike Wetherell +// CVS-ID: $Id: fs_filter.cpp 42514 2006-10-27 10:47:13Z MW $ +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_FILESYSTEM + +#include "wx/fs_filter.h" + +#ifndef WXPRECOMP +#endif + +#include "wx/ptr_scpd.h" + +wxDEFINE_SCOPED_PTR_TYPE(wxFSFile) +wxDEFINE_SCOPED_PTR_TYPE(wxInputStream) + +//---------------------------------------------------------------------------- +// wxFilterFSHandler +//---------------------------------------------------------------------------- + +bool wxFilterFSHandler::CanOpen(const wxString& location) +{ + return wxFilterClassFactory::Find(GetProtocol(location)) != NULL; +} + +wxFSFile* wxFilterFSHandler::OpenFile( + wxFileSystem& fs, + const wxString& location) +{ + wxString right = GetRightLocation(location); + if (!right.empty()) + return NULL; + + wxString protocol = GetProtocol(location); + const wxFilterClassFactory *factory = wxFilterClassFactory::Find(protocol); + if (!factory) + return NULL; + + wxString left = GetLeftLocation(location); + wxFSFilePtr leftFile(fs.OpenFile(left)); + if (!leftFile.get()) + return NULL; + + wxInputStreamPtr leftStream(leftFile->DetachStream()); + if (!leftStream.get() || !leftStream->IsOk()) + return NULL; + + wxInputStreamPtr stream(factory->NewStream(leftStream.release())); + + // The way compressed streams are supposed to be served is e.g.: + // Content-type: application/postscript + // Content-encoding: gzip + // So the mime type should be just the mime type of the lhs. However check + // whether the mime type is that of this compression format (e.g. + // application/gzip). If so pop any extension and try GetMimeTypeFromExt, + // e.g. if it were '.ps.gz' pop the '.gz' and try looking up '.ps' + wxString mime = leftFile->GetMimeType(); + if (factory->CanHandle(mime, wxSTREAM_MIMETYPE)) + mime = GetMimeTypeFromExt(factory->PopExtension(left)); + + return new wxFSFile(stream.release(), + left + wxT("#") + protocol + wxT(":") + right, + mime, + GetAnchor(location) +#if wxUSE_DATETIME + , leftFile->GetModificationTime() +#endif // wxUSE_DATETIME + ); +} + +wxString wxFilterFSHandler::FindFirst(const wxString& WXUNUSED(spec), int WXUNUSED(flags)) +{ + return wxEmptyString; +} + +wxString wxFilterFSHandler::FindNext() +{ + return wxEmptyString; +} + +#endif //wxUSE_FILESYSTEM diff --git a/Externals/wxWidgets/src/common/fs_inet.cpp b/Externals/wxWidgets/src/common/fs_inet.cpp new file mode 100644 index 0000000000..81bf6a9591 --- /dev/null +++ b/Externals/wxWidgets/src/common/fs_inet.cpp @@ -0,0 +1,167 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/fs_inet.cpp +// Purpose: HTTP and FTP file system +// Author: Vaclav Slavik +// Copyright: (c) 1999 Vaclav Slavik +// RCS-ID: $Id: fs_inet.cpp 41033 2006-09-06 13:49:42Z RR $ +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if !wxUSE_SOCKETS + #undef wxUSE_FS_INET + #define wxUSE_FS_INET 0 +#endif + +#if wxUSE_FILESYSTEM && wxUSE_FS_INET + +#ifndef WXPRECOMP + #include "wx/module.h" +#endif + +#include "wx/wfstream.h" +#include "wx/url.h" +#include "wx/filesys.h" +#include "wx/fs_inet.h" + +// ---------------------------------------------------------------------------- +// Helper classes +// ---------------------------------------------------------------------------- + +// This stream deletes the file when destroyed +class wxTemporaryFileInputStream : public wxFileInputStream +{ +public: + wxTemporaryFileInputStream(const wxString& filename) : + wxFileInputStream(filename), m_filename(filename) {} + + virtual ~wxTemporaryFileInputStream() + { + // NB: copied from wxFileInputStream dtor, we need to do it before + // wxRemoveFile + if (m_file_destroy) + { + delete m_file; + m_file_destroy = false; + } + wxRemoveFile(m_filename); + } + +protected: + wxString m_filename; +}; + + +// ---------------------------------------------------------------------------- +// wxInternetFSHandler +// ---------------------------------------------------------------------------- + +static wxString StripProtocolAnchor(const wxString& location) +{ + wxString myloc(location.BeforeLast(wxT('#'))); + if (myloc.empty()) myloc = location.AfterFirst(wxT(':')); + else myloc = myloc.AfterFirst(wxT(':')); + + // fix malformed url: + if (!myloc.Left(2).IsSameAs(wxT("//"))) + { + if (myloc.GetChar(0) != wxT('/')) myloc = wxT("//") + myloc; + else myloc = wxT("/") + myloc; + } + if (myloc.Mid(2).Find(wxT('/')) == wxNOT_FOUND) myloc << wxT('/'); + + return myloc; +} + + +bool wxInternetFSHandler::CanOpen(const wxString& location) +{ +#if wxUSE_URL + wxString p = GetProtocol(location); + if ((p == wxT("http")) || (p == wxT("ftp"))) + { + wxURL url(p + wxT(":") + StripProtocolAnchor(location)); + return (url.GetError() == wxURL_NOERR); + } +#endif + return false; +} + + +wxFSFile* wxInternetFSHandler::OpenFile(wxFileSystem& WXUNUSED(fs), + const wxString& location) +{ +#if !wxUSE_URL + return NULL; +#else + wxString right = + GetProtocol(location) + wxT(":") + StripProtocolAnchor(location); + + wxURL url(right); + if (url.GetError() == wxURL_NOERR) + { + wxInputStream *s = url.GetInputStream(); + wxString content = url.GetProtocol().GetContentType(); + if (content == wxEmptyString) content = GetMimeTypeFromExt(location); + if (s) + { + wxString tmpfile = + wxFileName::CreateTempFileName(wxT("wxhtml")); + + { // now copy streams content to temporary file: + wxFileOutputStream sout(tmpfile); + s->Read(sout); + } + delete s; + + return new wxFSFile(new wxTemporaryFileInputStream(tmpfile), + right, + content, + GetAnchor(location) +#if wxUSE_DATETIME + , wxDateTime::Now() +#endif // wxUSE_DATETIME + ); + } + } + + return (wxFSFile*) NULL; // incorrect URL +#endif +} + + +class wxFileSystemInternetModule : public wxModule +{ + DECLARE_DYNAMIC_CLASS(wxFileSystemInternetModule) + + public: + wxFileSystemInternetModule() : + wxModule(), + m_handler(NULL) + { + } + + virtual bool OnInit() + { + m_handler = new wxInternetFSHandler; + wxFileSystem::AddHandler(m_handler); + return true; + } + + virtual void OnExit() + { + delete wxFileSystem::RemoveHandler(m_handler); + } + + private: + wxFileSystemHandler* m_handler; +}; + +IMPLEMENT_DYNAMIC_CLASS(wxFileSystemInternetModule, wxModule) + +#endif // wxUSE_FILESYSTEM && wxUSE_FS_INET diff --git a/Externals/wxWidgets/src/common/fs_mem.cpp b/Externals/wxWidgets/src/common/fs_mem.cpp new file mode 100644 index 0000000000..9967b881b2 --- /dev/null +++ b/Externals/wxWidgets/src/common/fs_mem.cpp @@ -0,0 +1,288 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/fs_mem.cpp +// Purpose: in-memory file system +// Author: Vaclav Slavik +// RCS-ID: $Id: fs_mem.cpp 46522 2007-06-18 18:37:40Z VS $ +// Copyright: (c) 2000 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_FILESYSTEM && wxUSE_STREAMS + +#include "wx/fs_mem.h" + +#ifndef WXPRECOMP + #include "wx/intl.h" + #include "wx/log.h" + #include "wx/hash.h" + #if wxUSE_GUI + #include "wx/bitmap.h" + #include "wx/image.h" + #endif // wxUSE_GUI +#endif + +#include "wx/mstream.h" + +class MemFSHashObj : public wxObject +{ + public: + + MemFSHashObj(const void *data, size_t len, const wxString& mime) + { + m_Data = new char[len]; + memcpy(m_Data, data, len); + m_Len = len; + m_MimeType = mime; + InitTime(); + } + + MemFSHashObj(const wxMemoryOutputStream& stream, const wxString& mime) + { + m_Len = stream.GetSize(); + m_Data = new char[m_Len]; + stream.CopyTo(m_Data, m_Len); + m_MimeType = mime; + InitTime(); + } + + virtual ~MemFSHashObj() + { + delete[] m_Data; + } + + char *m_Data; + size_t m_Len; + wxString m_MimeType; +#if wxUSE_DATETIME + wxDateTime m_Time; +#endif // wxUSE_DATETIME + + DECLARE_NO_COPY_CLASS(MemFSHashObj) + + private: + void InitTime() + { +#if wxUSE_DATETIME + m_Time = wxDateTime::Now(); +#endif // wxUSE_DATETIME + } +}; + +#if wxUSE_BASE + + +//-------------------------------------------------------------------------------- +// wxMemoryFSHandler +//-------------------------------------------------------------------------------- + + +wxHashTable *wxMemoryFSHandlerBase::m_Hash = NULL; + + +wxMemoryFSHandlerBase::wxMemoryFSHandlerBase() : wxFileSystemHandler() +{ +} + + + +wxMemoryFSHandlerBase::~wxMemoryFSHandlerBase() +{ + // as only one copy of FS handler is supposed to exist, we may silently + // delete static data here. (There is no way how to remove FS handler from + // wxFileSystem other than releasing _all_ handlers.) + + if (m_Hash) + { + WX_CLEAR_HASH_TABLE(*m_Hash); + delete m_Hash; + m_Hash = NULL; + } +} + + + +bool wxMemoryFSHandlerBase::CanOpen(const wxString& location) +{ + wxString p = GetProtocol(location); + return (p == wxT("memory")); +} + + + + +wxFSFile* wxMemoryFSHandlerBase::OpenFile(wxFileSystem& WXUNUSED(fs), const wxString& location) +{ + if (m_Hash) + { + MemFSHashObj *obj = (MemFSHashObj*) m_Hash -> Get(GetRightLocation(location)); + if (obj == NULL) + { + return NULL; + } + else + { + wxString mime = obj->m_MimeType; + if ( mime.empty() ) + mime = GetMimeTypeFromExt(location); + return new wxFSFile + ( + new wxMemoryInputStream(obj -> m_Data, obj -> m_Len), + location, + mime, + GetAnchor(location) +#if wxUSE_DATETIME + , obj -> m_Time +#endif // wxUSE_DATETIME + ); + } + } + else return NULL; +} + + + +wxString wxMemoryFSHandlerBase::FindFirst(const wxString& WXUNUSED(spec), + int WXUNUSED(flags)) +{ + wxFAIL_MSG(wxT("wxMemoryFSHandlerBase::FindFirst not implemented")); + + return wxEmptyString; +} + + + +wxString wxMemoryFSHandlerBase::FindNext() +{ + wxFAIL_MSG(wxT("wxMemoryFSHandlerBase::FindNext not implemented")); + + return wxEmptyString; +} + + +bool wxMemoryFSHandlerBase::CheckHash(const wxString& filename) +{ + if (m_Hash == NULL) + { + m_Hash = new wxHashTable(wxKEY_STRING); + } + + if (m_Hash -> Get(filename) != NULL) + { + wxString s; + s.Printf(_("Memory VFS already contains file '%s'!"), filename.c_str()); + wxLogError(s); + return false; + } + else + return true; +} + + +/*static*/ +void wxMemoryFSHandlerBase::AddFileWithMimeType(const wxString& filename, + const wxString& textdata, + const wxString& mimetype) +{ + AddFileWithMimeType(filename, + (const void*) textdata.mb_str(), textdata.length(), + mimetype); +} + + +/*static*/ +void wxMemoryFSHandlerBase::AddFileWithMimeType(const wxString& filename, + const void *binarydata, size_t size, + const wxString& mimetype) +{ + if (!CheckHash(filename)) return; + m_Hash -> Put(filename, new MemFSHashObj(binarydata, size, mimetype)); +} + +/*static*/ +void wxMemoryFSHandlerBase::AddFile(const wxString& filename, + const wxString& textdata) +{ + AddFileWithMimeType(filename, textdata, wxEmptyString); +} + + +/*static*/ +void wxMemoryFSHandlerBase::AddFile(const wxString& filename, + const void *binarydata, size_t size) +{ + AddFileWithMimeType(filename, binarydata, size, wxEmptyString); +} + + + +/*static*/ void wxMemoryFSHandlerBase::RemoveFile(const wxString& filename) +{ + if (m_Hash == NULL || + m_Hash -> Get(filename) == NULL) + { + wxString s; + s.Printf(_("Trying to remove file '%s' from memory VFS, but it is not loaded!"), filename.c_str()); + wxLogError(s); + } + + else + delete m_Hash -> Delete(filename); +} + +#endif // wxUSE_BASE + +#if wxUSE_GUI + +#if wxUSE_IMAGE +/*static*/ void +wxMemoryFSHandler::AddFile(const wxString& filename, + const wxImage& image, + long type) +{ + if (!CheckHash(filename)) return; + + wxMemoryOutputStream mems; + if (image.Ok() && image.SaveFile(mems, (int)type)) + { + m_Hash->Put + ( + filename, + new MemFSHashObj + ( + mems, + wxImage::FindHandler(type)->GetMimeType() + ) + ); + } + else + { + wxString s; + s.Printf(_("Failed to store image '%s' to memory VFS!"), filename.c_str()); + wxPrintf(wxT("'%s'\n"), s.c_str()); + wxLogError(s); + } +} + +/*static*/ void +wxMemoryFSHandler::AddFile(const wxString& filename, + const wxBitmap& bitmap, + long type) +{ +#if !defined(__WXMSW__) || wxUSE_WXDIB + wxImage img = bitmap.ConvertToImage(); + AddFile(filename, img, type); +#endif +} + +#endif // wxUSE_IMAGE + +#endif // wxUSE_GUI + + +#endif // wxUSE_FILESYSTEM && wxUSE_FS_ZIP diff --git a/Externals/wxWidgets/src/common/ftp.cpp b/Externals/wxWidgets/src/common/ftp.cpp new file mode 100644 index 0000000000..a490f81993 --- /dev/null +++ b/Externals/wxWidgets/src/common/ftp.cpp @@ -0,0 +1,1008 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: common/ftp.cpp +// Purpose: FTP protocol +// Author: Guilhem Lavaux +// Modified by: Mark Johnson, wxWindows@mj10777.de +// 20000917 : RmDir, GetLastResult, GetList +// Vadim Zeitlin (numerous fixes and rewrites to all part of the +// code, support ASCII/Binary modes, better error reporting, more +// robust Abort(), support for arbitrary FTP commands, ...) +// Randall Fox (support for active mode) +// Created: 07/07/1997 +// RCS-ID: $Id: ftp.cpp 47969 2007-08-08 23:34:14Z VZ $ +// Copyright: (c) 1997, 1998 Guilhem Lavaux +// (c) 1998-2004 wxWidgets team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_PROTOCOL_FTP + +#ifndef WX_PRECOMP + #include + #include "wx/string.h" + #include "wx/utils.h" + #include "wx/log.h" + #include "wx/intl.h" +#endif // WX_PRECOMP + +#include "wx/sckaddr.h" +#include "wx/socket.h" +#include "wx/url.h" +#include "wx/sckstrm.h" +#include "wx/protocol/protocol.h" +#include "wx/protocol/ftp.h" + +#if defined(__WXMAC__) + #include "wx/mac/macsock.h" +#endif + +#ifndef __MWERKS__ + #include +#endif + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// the length of FTP status code (3 digits) +static const size_t LEN_CODE = 3; + +// ---------------------------------------------------------------------------- +// macros +// ---------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxFTP, wxProtocol) +IMPLEMENT_PROTOCOL(wxFTP, wxT("ftp"), wxT("ftp"), true) + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxFTP constructor and destructor +// ---------------------------------------------------------------------------- + +wxFTP::wxFTP() +{ + m_lastError = wxPROTO_NOERR; + m_streaming = false; + m_currentTransfermode = NONE; + + m_user = wxT("anonymous"); + m_passwd << wxGetUserId() << wxT('@') << wxGetFullHostName(); + + SetNotify(0); + SetFlags(wxSOCKET_NOWAIT); + m_bPassive = true; + SetDefaultTimeout(60); // Default is Sixty Seconds + m_bEncounteredError = false; +} + +wxFTP::~wxFTP() +{ + if ( m_streaming ) + { + // if we are streaming, this will issue + // an FTP ABORT command, to tell the server we are aborting + (void)Abort(); + } + + // now this issues a "QUIT" command to tell the server we are + Close(); +} + +// ---------------------------------------------------------------------------- +// wxFTP connect and login methods +// ---------------------------------------------------------------------------- + +bool wxFTP::Connect(wxSockAddress& addr, bool WXUNUSED(wait)) +{ + if ( !wxProtocol::Connect(addr) ) + { + m_lastError = wxPROTO_NETERR; + return false; + } + + if ( !m_user ) + { + m_lastError = wxPROTO_CONNERR; + return false; + } + + // we should have 220 welcome message + if ( !CheckResult('2') ) + { + Close(); + return false; + } + + wxString command; + command.Printf(wxT("USER %s"), m_user.c_str()); + char rc = SendCommand(command); + if ( rc == '2' ) + { + // 230 return: user accepted without password + return true; + } + + if ( rc != '3' ) + { + Close(); + return false; + } + + command.Printf(wxT("PASS %s"), m_passwd.c_str()); + if ( !CheckCommand(command, '2') ) + { + Close(); + return false; + } + + return true; +} + +bool wxFTP::Connect(const wxString& host) +{ + wxIPV4address addr; + addr.Hostname(host); + addr.Service(wxT("ftp")); + + return Connect(addr); +} + +bool wxFTP::Close() +{ + if ( m_streaming ) + { + m_lastError = wxPROTO_STREAMING; + return false; + } + + if ( IsConnected() ) + { + if ( !CheckCommand(wxT("QUIT"), '2') ) + { + wxLogDebug(_T("Failed to close connection gracefully.")); + } + } + + return wxSocketClient::Close(); +} + +// ============================================================================ +// low level methods +// ============================================================================ + +// ---------------------------------------------------------------------------- +// Send command to FTP server +// ---------------------------------------------------------------------------- + +char wxFTP::SendCommand(const wxString& command) +{ + if ( m_streaming ) + { + m_lastError = wxPROTO_STREAMING; + return 0; + } + + wxString tmp_str = command + wxT("\r\n"); + const wxWX2MBbuf tmp_buf = tmp_str.mb_str(); + if ( Write(wxMBSTRINGCAST tmp_buf, strlen(tmp_buf)).Error()) + { + m_lastError = wxPROTO_NETERR; + return 0; + } + +#ifdef __WXDEBUG__ + // don't show the passwords in the logs (even in debug ones) + wxString cmd, password; + if ( command.Upper().StartsWith(_T("PASS "), &password) ) + { + cmd << _T("PASS ") << wxString(_T('*'), password.length()); + } + else + { + cmd = command; + } + + wxLogTrace(FTP_TRACE_MASK, _T("==> %s"), cmd.c_str()); +#endif // __WXDEBUG__ + + return GetResult(); +} + +// ---------------------------------------------------------------------------- +// Recieve servers reply +// ---------------------------------------------------------------------------- + +char wxFTP::GetResult() +{ + // if we've already had a read or write timeout error, the connection is + // probably toast, so don't bother, it just wastes the users time + if ( m_bEncounteredError ) + return 0; + + wxString code; + + // m_lastResult will contain the entire server response, possibly on + // multiple lines + m_lastResult.clear(); + + // we handle multiline replies here according to RFC 959: it says that a + // reply may either be on 1 line of the form "xyz ..." or on several lines + // in whuch case it looks like + // xyz-... + // ... + // xyz ... + // and the intermeidate lines may start with xyz or not + bool badReply = false; + bool firstLine = true; + bool endOfReply = false; + while ( !endOfReply && !badReply ) + { + wxString line; + m_lastError = ReadLine(this,line); + if ( m_lastError ) + { + m_bEncounteredError = true; + return 0; + } + + if ( !m_lastResult.empty() ) + { + // separate from last line + m_lastResult += _T('\n'); + } + + m_lastResult += line; + + // unless this is an intermediate line of a multiline reply, it must + // contain the code in the beginning and '-' or ' ' following it + if ( line.Len() < LEN_CODE + 1 ) + { + if ( firstLine ) + { + badReply = true; + } + else + { + wxLogTrace(FTP_TRACE_MASK, _T("<== %s %s"), + code.c_str(), line.c_str()); + } + } + else // line has at least 4 chars + { + // this is the char which tells us what we're dealing with + wxChar chMarker = line.GetChar(LEN_CODE); + + if ( firstLine ) + { + code = wxString(line, LEN_CODE); + wxLogTrace(FTP_TRACE_MASK, _T("<== %s %s"), + code.c_str(), line.c_str() + LEN_CODE + 1); + + switch ( chMarker ) + { + case _T(' '): + endOfReply = true; + break; + + case _T('-'): + firstLine = false; + break; + + default: + // unexpected + badReply = true; + } + } + else // subsequent line of multiline reply + { + if ( wxStrncmp(line, code, LEN_CODE) == 0 ) + { + if ( chMarker == _T(' ') ) + { + endOfReply = true; + } + + wxLogTrace(FTP_TRACE_MASK, _T("<== %s %s"), + code.c_str(), line.c_str() + LEN_CODE + 1); + } + else + { + // just part of reply + wxLogTrace(FTP_TRACE_MASK, _T("<== %s %s"), + code.c_str(), line.c_str()); + } + } + } + } + + if ( badReply ) + { + wxLogDebug(_T("Broken FTP server: '%s' is not a valid reply."), + m_lastResult.c_str()); + + m_lastError = wxPROTO_PROTERR; + + return 0; + } + + // if we got here we must have a non empty code string + return (char)code[0u]; +} + +// ---------------------------------------------------------------------------- +// wxFTP simple commands +// ---------------------------------------------------------------------------- + +bool wxFTP::SetTransferMode(TransferMode transferMode) +{ + if ( transferMode == m_currentTransfermode ) + { + // nothing to do + return true; + } + + wxString mode; + switch ( transferMode ) + { + default: + wxFAIL_MSG(_T("unknown FTP transfer mode")); + // fall through + + case BINARY: + mode = _T('I'); + break; + + case ASCII: + mode = _T('A'); + break; + } + + if ( !DoSimpleCommand(_T("TYPE"), mode) ) + { + wxLogError(_("Failed to set FTP transfer mode to %s."), (const wxChar*) + (transferMode == ASCII ? _("ASCII") : _("binary"))); + + return false; + } + + // If we get here the operation has been successfully completed + // Set the status-member + m_currentTransfermode = transferMode; + + return true; +} + +bool wxFTP::DoSimpleCommand(const wxChar *command, const wxString& arg) +{ + wxString fullcmd = command; + if ( !arg.empty() ) + { + fullcmd << _T(' ') << arg; + } + + if ( !CheckCommand(fullcmd, '2') ) + { + wxLogDebug(_T("FTP command '%s' failed."), fullcmd.c_str()); + + return false; + } + + return true; +} + +bool wxFTP::ChDir(const wxString& dir) +{ + // some servers might not understand ".." if they use different directory + // tree conventions, but they always understand CDUP - should we use it if + // dir == ".."? OTOH, do such servers (still) exist? + + return DoSimpleCommand(_T("CWD"), dir); +} + +bool wxFTP::MkDir(const wxString& dir) +{ + return DoSimpleCommand(_T("MKD"), dir); +} + +bool wxFTP::RmDir(const wxString& dir) +{ + return DoSimpleCommand(_T("RMD"), dir); +} + +wxString wxFTP::Pwd() +{ + wxString path; + + if ( CheckCommand(wxT("PWD"), '2') ) + { + // the result is at least that long if CheckCommand() succeeded + const wxChar *p = m_lastResult.c_str() + LEN_CODE + 1; + if ( *p != _T('"') ) + { + wxLogDebug(_T("Missing starting quote in reply for PWD: %s"), p); + } + else + { + for ( p++; *p; p++ ) + { + if ( *p == _T('"') ) + { + // check if the quote is doubled + p++; + if ( !*p || *p != _T('"') ) + { + // no, this is the end + break; + } + //else: yes, it is: this is an embedded quote in the + // filename, treat as normal char + } + + path += *p; + } + + if ( !*p ) + { + wxLogDebug(_T("Missing ending quote in reply for PWD: %s"), + m_lastResult.c_str() + LEN_CODE + 1); + } + } + } + else + { + wxLogDebug(_T("FTP PWD command failed.")); + } + + return path; +} + +bool wxFTP::Rename(const wxString& src, const wxString& dst) +{ + wxString str; + + str = wxT("RNFR ") + src; + if ( !CheckCommand(str, '3') ) + return false; + + str = wxT("RNTO ") + dst; + + return CheckCommand(str, '2'); +} + +bool wxFTP::RmFile(const wxString& path) +{ + wxString str; + str = wxT("DELE ") + path; + + return CheckCommand(str, '2'); +} + +// ---------------------------------------------------------------------------- +// wxFTP download and upload +// ---------------------------------------------------------------------------- + +class wxInputFTPStream : public wxSocketInputStream +{ +public: + wxInputFTPStream(wxFTP *ftp, wxSocketBase *sock) + : wxSocketInputStream(*sock) + { + m_ftp = ftp; + // socket timeout automatically set in GetPort function + } + + virtual ~wxInputFTPStream() + { + delete m_i_socket; // keep at top + + // when checking the result, the stream will + // almost always show an error, even if the file was + // properly transfered, thus, lets just grab the result + + // we are looking for "226 transfer completed" + char code = m_ftp->GetResult(); + if ('2' == code) + { + // it was a good transfer. + // we're done! + m_ftp->m_streaming = false; + return; + } + // did we timeout? + if (0 == code) + { + // the connection is probably toast. issue an abort, and + // then a close. there won't be any more waiting + // for this connection + m_ftp->Abort(); + m_ftp->Close(); + return; + } + // There was a problem with the transfer and the server + // has acknowledged it. If we issue an "ABORT" now, the user + // would get the "226" for the abort and think the xfer was + // complete, thus, don't do anything here, just return + } + + wxFTP *m_ftp; + + DECLARE_NO_COPY_CLASS(wxInputFTPStream) +}; + +class wxOutputFTPStream : public wxSocketOutputStream +{ +public: + wxOutputFTPStream(wxFTP *ftp_clt, wxSocketBase *sock) + : wxSocketOutputStream(*sock), m_ftp(ftp_clt) + { + } + + virtual ~wxOutputFTPStream(void) + { + if ( IsOk() ) + { + // close data connection first, this will generate "transfer + // completed" reply + delete m_o_socket; + + // read this reply + m_ftp->GetResult(); // save result so user can get to it + + m_ftp->m_streaming = false; + } + else + { + // abort data connection first + m_ftp->Abort(); + + // and close it after + delete m_o_socket; + } + } + + wxFTP *m_ftp; + + DECLARE_NO_COPY_CLASS(wxOutputFTPStream) +}; + +void wxFTP::SetDefaultTimeout(wxUint32 Value) +{ + m_uiDefaultTimeout = Value; + SetTimeout(Value); // sets it for this socket +} + + +wxSocketBase *wxFTP::GetPort() +{ + /* + PASSIVE: Client sends a "PASV" to the server. The server responds with + an address and port number which it will be listening on. Then + the client connects to the server at the specified address and + port. + + ACTIVE: Client sends the server a PORT command which includes an + address and port number which the client will be listening on. + The server then connects to the client at that address and + port. + */ + + wxSocketBase *socket = m_bPassive ? GetPassivePort() : GetActivePort(); + if ( !socket ) + { + m_bEncounteredError = true; + return NULL; + } + + // Now set the time for the new socket to the default or user selected + // timeout period + socket->SetTimeout(m_uiDefaultTimeout); + + return socket; +} + +wxSocketBase *wxFTP::AcceptIfActive(wxSocketBase *sock) +{ + if ( m_bPassive ) + return sock; + + // now wait for a connection from server + wxSocketServer *sockSrv = (wxSocketServer *)sock; + if ( !sockSrv->WaitForAccept() ) + { + m_lastError = wxPROTO_CONNERR; + wxLogError(_("Timeout while waiting for FTP server to connect, try passive mode.")); + delete sock; + sock = NULL; + } + else + { + sock = sockSrv->Accept(true); + delete sockSrv; + } + + return sock; +} + +wxString wxFTP::GetPortCmdArgument(const wxIPV4address& addrLocal, + const wxIPV4address& addrNew) +{ + // Just fills in the return value with the local IP + // address of the current socket. Also it fill in the + // PORT which the client will be listening on + + wxString addrIP = addrLocal.IPAddress(); + int portNew = addrNew.Service(); + + // We need to break the PORT number in bytes + addrIP.Replace(_T("."), _T(",")); + addrIP << _T(',') + << wxString::Format(_T("%d"), portNew >> 8) << _T(',') + << wxString::Format(_T("%d"), portNew & 0xff); + + // Now we have a value like "10,0,0,1,5,23" + return addrIP; +} + +wxSocketBase *wxFTP::GetActivePort() +{ + // we need an address to listen on + wxIPV4address addrNew, addrLocal; + GetLocal(addrLocal); + addrNew.AnyAddress(); + addrNew.Service(0); // pick an open port number. + + wxSocketServer *sockSrv = new wxSocketServer(addrNew); + if (!sockSrv->Ok()) + { + // We use Ok() here to see if everything is ok + m_lastError = wxPROTO_PROTERR; + delete sockSrv; + return NULL; + } + + //gets the new address, actually it is just the port number + sockSrv->GetLocal(addrNew); + + // Now we create the argument of the PORT command, we send in both + // addresses because the addrNew has an IP of "0.0.0.0", so we need the + // value in addrLocal + wxString port = GetPortCmdArgument(addrLocal, addrNew); + if ( !DoSimpleCommand(_T("PORT"), port) ) + { + m_lastError = wxPROTO_PROTERR; + delete sockSrv; + wxLogError(_("The FTP server doesn't support the PORT command.")); + return NULL; + } + + sockSrv->Notify(false); // Don't send any events + return sockSrv; +} + +wxSocketBase *wxFTP::GetPassivePort() +{ + if ( !DoSimpleCommand(_T("PASV")) ) + { + wxLogError(_("The FTP server doesn't support passive mode.")); + return NULL; + } + + const wxChar *addrStart = wxStrchr(m_lastResult, _T('(')); + const wxChar *addrEnd = addrStart ? wxStrchr(addrStart, _T(')')) : NULL; + if ( !addrEnd ) + { + m_lastError = wxPROTO_PROTERR; + + return NULL; + } + + // get the port number and address + int a[6]; + wxString straddr(addrStart + 1, addrEnd); + wxSscanf(straddr, wxT("%d,%d,%d,%d,%d,%d"), + &a[2],&a[3],&a[4],&a[5],&a[0],&a[1]); + + wxUint32 hostaddr = (wxUint16)a[2] << 24 | + (wxUint16)a[3] << 16 | + (wxUint16)a[4] << 8 | + a[5]; + wxUint16 port = (wxUint16)(a[0] << 8 | a[1]); + + wxIPV4address addr; + addr.Hostname(hostaddr); + addr.Service(port); + + wxSocketClient *client = new wxSocketClient(); + if ( !client->Connect(addr) ) + { + delete client; + return NULL; + } + + client->Notify(false); + + return client; +} + +bool wxFTP::Abort() +{ + if ( !m_streaming ) + return true; + + m_streaming = false; + if ( !CheckCommand(wxT("ABOR"), '4') ) + return false; + + return CheckResult('2'); +} + +wxInputStream *wxFTP::GetInputStream(const wxString& path) +{ + if ( ( m_currentTransfermode == NONE ) && !SetTransferMode(BINARY) ) + return NULL; + + wxSocketBase *sock = GetPort(); + + if ( !sock ) + { + m_lastError = wxPROTO_NETERR; + return NULL; + } + + wxString tmp_str = wxT("RETR ") + wxURI::Unescape(path); + if ( !CheckCommand(tmp_str, '1') ) + return NULL; + + sock = AcceptIfActive(sock); + if ( !sock ) + return NULL; + + sock->SetFlags(wxSOCKET_WAITALL); + + m_streaming = true; + + wxInputFTPStream *in_stream = new wxInputFTPStream(this, sock); + + return in_stream; +} + +wxOutputStream *wxFTP::GetOutputStream(const wxString& path) +{ + if ( ( m_currentTransfermode == NONE ) && !SetTransferMode(BINARY) ) + return NULL; + + wxSocketBase *sock = GetPort(); + + wxString tmp_str = wxT("STOR ") + path; + if ( !CheckCommand(tmp_str, '1') ) + return NULL; + + sock = AcceptIfActive(sock); + + m_streaming = true; + + return new wxOutputFTPStream(this, sock); +} + +// ---------------------------------------------------------------------------- +// FTP directory listing +// ---------------------------------------------------------------------------- + +bool wxFTP::GetList(wxArrayString& files, + const wxString& wildcard, + bool details) +{ + wxSocketBase *sock = GetPort(); + if (!sock) + return false; + + // NLST : List of Filenames (including Directory's !) + // LIST : depending on BS of FTP-Server + // - Unix : result like "ls" command + // - Windows : like "dir" command + // - others : ? + wxString line(details ? _T("LIST") : _T("NLST")); + if ( !wildcard.empty() ) + { + line << _T(' ') << wildcard; + } + + if ( !CheckCommand(line, '1') ) + { + m_lastError = wxPROTO_PROTERR; + wxLogDebug(_T("FTP 'LIST' command returned unexpected result from server")); + delete sock; + return false; + } + + sock = AcceptIfActive(sock); + if ( !sock ) + return false; + + files.Empty(); + while (ReadLine(sock, line) == wxPROTO_NOERR ) + { + files.Add(line); + } + + delete sock; + + // the file list should be terminated by "226 Transfer complete"" + return CheckResult('2'); +} + +bool wxFTP::FileExists(const wxString& fileName) +{ + // This function checks if the file specified in fileName exists in the + // current dir. It does so by simply doing an NLST (via GetList). + // If this succeeds (and the list is not empty) the file exists. + + bool retval = false; + wxArrayString fileList; + + if ( GetList(fileList, fileName, false) ) + { + // Some ftp-servers (Ipswitch WS_FTP Server 1.0.5 does this) + // displays this behaviour when queried on a nonexistent file: + // NLST this_file_does_not_exist + // 150 Opening ASCII data connection for directory listing + // (no data transferred) + // 226 Transfer complete + // Here wxFTP::GetList(...) will succeed but it will return an empty + // list. + retval = !fileList.IsEmpty(); + } + + return retval; +} + +// ---------------------------------------------------------------------------- +// FTP GetSize +// ---------------------------------------------------------------------------- + +int wxFTP::GetFileSize(const wxString& fileName) +{ + // return the filesize of the given file if possible + // return -1 otherwise (predominantly if file doesn't exist + // in current dir) + + int filesize = -1; + + // Check for existance of file via wxFTP::FileExists(...) + if ( FileExists(fileName) ) + { + wxString command; + + // First try "SIZE" command using BINARY(IMAGE) transfermode + // Especially UNIX ftp-servers distinguish between the different + // transfermodes and reports different filesizes accordingly. + // The BINARY size is the interesting one: How much memory + // will we need to hold this file? + TransferMode oldTransfermode = m_currentTransfermode; + SetTransferMode(BINARY); + command << _T("SIZE ") << fileName; + + bool ok = CheckCommand(command, '2'); + + if ( ok ) + { + // The answer should be one line: "213 \n" + // 213 is File Status (STD9) + // "SIZE" is not described anywhere..? It works on most servers + int statuscode; + if ( wxSscanf(GetLastResult().c_str(), _T("%i %i"), + &statuscode, &filesize) == 2 ) + { + // We've gotten a good reply. + ok = true; + } + else + { + // Something bad happened.. A "2yz" reply with no size + // Fallback + ok = false; + } + } + + // Set transfermode back to the original. Only the "SIZE"-command + // is dependant on transfermode + if ( oldTransfermode != NONE ) + { + SetTransferMode(oldTransfermode); + } + + // this is not a direct else clause.. The size command might return an + // invalid "2yz" reply + if ( !ok ) + { + // The server didn't understand the "SIZE"-command or it + // returned an invalid reply. + // We now try to get details for the file with a "LIST"-command + // and then parse the output from there.. + wxArrayString fileList; + if ( GetList(fileList, fileName, true) ) + { + if ( !fileList.IsEmpty() ) + { + // We _should_ only get one line in return, but just to be + // safe we run through the line(s) returned and look for a + // substring containing the name we are looking for. We + // stop the iteration at the first occurrence of the + // filename. The search is not case-sensitive. + bool foundIt = false; + + size_t i; + for ( i = 0; !foundIt && i < fileList.Count(); i++ ) + { + foundIt = fileList[i].Upper().Contains(fileName.Upper()); + } + + if ( foundIt ) + { + // The index i points to the first occurrence of + // fileName in the array Now we have to find out what + // format the LIST has returned. There are two + // "schools": Unix-like + // + // '-rw-rw-rw- owner group size month day time filename' + // + // or Windows-like + // + // 'date size filename' + + // check if the first character is '-'. This would + // indicate Unix-style (this also limits this function + // to searching for files, not directories) + if ( fileList[i].Mid(0, 1) == _T("-") ) + { + + if ( wxSscanf(fileList[i].c_str(), + _T("%*s %*s %*s %*s %i %*s %*s %*s %*s"), + &filesize) != 9 ) + { + // Hmm... Invalid response + wxLogTrace(FTP_TRACE_MASK, + _T("Invalid LIST response")); + } + } + else // Windows-style response (?) + { + if ( wxSscanf(fileList[i].c_str(), + _T("%*s %*s %i %*s"), + &filesize) != 4 ) + { + // something bad happened..? + wxLogTrace(FTP_TRACE_MASK, + _T("Invalid or unknown LIST response")); + } + } + } + } + } + } + } + + // filesize might still be -1 when exiting + return filesize; +} + +#endif // wxUSE_PROTOCOL_FTP + diff --git a/Externals/wxWidgets/src/common/gaugecmn.cpp b/Externals/wxWidgets/src/common/gaugecmn.cpp new file mode 100644 index 0000000000..f672bb6a3d --- /dev/null +++ b/Externals/wxWidgets/src/common/gaugecmn.cpp @@ -0,0 +1,156 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/common/gaugecmn.cpp +// Purpose: wxGaugeBase: common to all ports methods of wxGauge +// Author: Vadim Zeitlin +// Modified by: +// Created: 20.02.01 +// RCS-ID: $Id: gaugecmn.cpp 41089 2006-09-09 13:36:54Z RR $ +// Copyright: (c) 2001 Vadim Zeitlin +// License: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#ifndef WX_PRECOMP +#endif //WX_PRECOMP + +#if wxUSE_GAUGE + +#include "wx/gauge.h" + +const wxChar wxGaugeNameStr[] = wxT("gauge"); + +// ============================================================================ +// implementation +// ============================================================================ + +wxGaugeBase::~wxGaugeBase() +{ + // this destructor is required for Darwin +} + +// ---------------------------------------------------------------------------- +// wxGauge creation +// ---------------------------------------------------------------------------- + +bool wxGaugeBase::Create(wxWindow *parent, + wxWindowID id, + int range, + const wxPoint& pos, + const wxSize& size, + long style, + const wxValidator& validator, + const wxString& name) +{ + if ( !wxControl::Create(parent, id, pos, size, style, validator, name) ) + return false; + + SetName(name); + +#if wxUSE_VALIDATORS + SetValidator(validator); +#endif // wxUSE_VALIDATORS + + SetRange(range); + SetValue(0); +#if wxGAUGE_EMULATE_INDETERMINATE_MODE + m_nDirection = wxRIGHT; +#endif + + return true; +} + +// ---------------------------------------------------------------------------- +// wxGauge determinate mode range/position +// ---------------------------------------------------------------------------- + +void wxGaugeBase::SetRange(int range) +{ + m_rangeMax = range; +} + +int wxGaugeBase::GetRange() const +{ + return m_rangeMax; +} + +void wxGaugeBase::SetValue(int pos) +{ + m_gaugePos = pos; +} + +int wxGaugeBase::GetValue() const +{ + return m_gaugePos; +} + +// ---------------------------------------------------------------------------- +// wxGauge indeterminate mode +// ---------------------------------------------------------------------------- + +void wxGaugeBase::Pulse() +{ +#if wxGAUGE_EMULATE_INDETERMINATE_MODE + // simulate indeterminate mode + int curr = GetValue(), max = GetRange(); + + if (m_nDirection == wxRIGHT) + { + if (curr < max) + SetValue(curr + 1); + else + { + SetValue(max - 1); + m_nDirection = wxLEFT; + } + } + else + { + if (curr > 0) + SetValue(curr - 1); + else + { + SetValue(1); + m_nDirection = wxRIGHT; + } + } +#endif +} + +// ---------------------------------------------------------------------------- +// wxGauge appearance params +// ---------------------------------------------------------------------------- + +void wxGaugeBase::SetShadowWidth(int WXUNUSED(w)) +{ +} + +int wxGaugeBase::GetShadowWidth() const +{ + return 0; +} + + +void wxGaugeBase::SetBezelFace(int WXUNUSED(w)) +{ +} + +int wxGaugeBase::GetBezelFace() const +{ + return 0; +} + +#endif // wxUSE_GAUGE diff --git a/Externals/wxWidgets/src/common/gbsizer.cpp b/Externals/wxWidgets/src/common/gbsizer.cpp new file mode 100644 index 0000000000..c9f58f7948 --- /dev/null +++ b/Externals/wxWidgets/src/common/gbsizer.cpp @@ -0,0 +1,693 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: gbsizer.cpp +// Purpose: wxGridBagSizer: A sizer that can lay out items in a grid, +// with items at specified cells, and with the option of row +// and/or column spanning +// +// Author: Robin Dunn +// Created: 03-Nov-2003 +// RCS-ID: $Id: gbsizer.cpp 45407 2007-04-11 21:54:15Z RD $ +// Copyright: (c) Robin Dunn +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#include "wx/gbsizer.h" + +//--------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxGBSizerItem, wxSizerItem) +IMPLEMENT_CLASS(wxGridBagSizer, wxFlexGridSizer) + +const wxGBSpan wxDefaultSpan; + +//--------------------------------------------------------------------------- +// wxGBSizerItem +//--------------------------------------------------------------------------- + +wxGBSizerItem::wxGBSizerItem( int width, + int height, + const wxGBPosition& pos, + const wxGBSpan& span, + int flag, + int border, + wxObject* userData) + : wxSizerItem(width, height, 0, flag, border, userData), + m_pos(pos), + m_span(span), + m_gbsizer(NULL) +{ +} + + +wxGBSizerItem::wxGBSizerItem( wxWindow *window, + const wxGBPosition& pos, + const wxGBSpan& span, + int flag, + int border, + wxObject* userData ) + : wxSizerItem(window, 0, flag, border, userData), + m_pos(pos), + m_span(span), + m_gbsizer(NULL) +{ +} + + +wxGBSizerItem::wxGBSizerItem( wxSizer *sizer, + const wxGBPosition& pos, + const wxGBSpan& span, + int flag, + int border, + wxObject* userData ) + : wxSizerItem(sizer, 0, flag, border, userData), + m_pos(pos), + m_span(span), + m_gbsizer(NULL) +{ +} + +wxGBSizerItem::wxGBSizerItem() + : wxSizerItem(), + m_pos(-1,-1), + m_span(-1,-1), + m_gbsizer(NULL) +{ +} + +//--------------------------------------------------------------------------- + + +void wxGBSizerItem::GetPos(int& row, int& col) const +{ + row = m_pos.GetRow(); + col = m_pos.GetCol(); +} + +void wxGBSizerItem::GetSpan(int& rowspan, int& colspan) const +{ + rowspan = m_span.GetRowspan(); + colspan = m_span.GetColspan(); +} + + +bool wxGBSizerItem::SetPos( const wxGBPosition& pos ) +{ + if (m_gbsizer) + { + wxCHECK_MSG( !m_gbsizer->CheckForIntersection(pos, m_span, this), false, + wxT("An item is already at that position") ); + } + m_pos = pos; + return true; +} + +bool wxGBSizerItem::SetSpan( const wxGBSpan& span ) +{ + if (m_gbsizer) + { + wxCHECK_MSG( !m_gbsizer->CheckForIntersection(m_pos, span, this), false, + wxT("An item is already at that position") ); + } + m_span = span; + return true; +} + + +inline bool InRange(int val, int min, int max) +{ + return (val >= min && val <= max); +} + +bool wxGBSizerItem::Intersects(const wxGBSizerItem& other) +{ + return Intersects(other.GetPos(), other.GetSpan()); +} + +bool wxGBSizerItem::Intersects(const wxGBPosition& pos, const wxGBSpan& span) +{ + + int row, col, endrow, endcol; + int otherrow, othercol, otherendrow, otherendcol; + + GetPos(row, col); + GetEndPos(endrow, endcol); + + otherrow = pos.GetRow(); + othercol = pos.GetCol(); + otherendrow = otherrow + span.GetRowspan() - 1; + otherendcol = othercol + span.GetColspan() - 1; + + // is the other item's start or end in the range of this one? + if (( InRange(otherrow, row, endrow) && InRange(othercol, col, endcol) ) || + ( InRange(otherendrow, row, endrow) && InRange(otherendcol, col, endcol) )) + return true; + + // is this item's start or end in the range of the other one? + if (( InRange(row, otherrow, otherendrow) && InRange(col, othercol, otherendcol) ) || + ( InRange(endrow, otherrow, otherendrow) && InRange(endcol, othercol, otherendcol) )) + return true; + + return false; +} + + +void wxGBSizerItem::GetEndPos(int& row, int& col) +{ + row = m_pos.GetRow() + m_span.GetRowspan() - 1; + col = m_pos.GetCol() + m_span.GetColspan() - 1; +} + + +//--------------------------------------------------------------------------- +// wxGridBagSizer +//--------------------------------------------------------------------------- + +wxGridBagSizer::wxGridBagSizer(int vgap, int hgap ) + : wxFlexGridSizer(1, vgap, hgap), + m_emptyCellSize(10,20) + +{ +} + + +wxSizerItem* wxGridBagSizer::Add( wxWindow *window, + const wxGBPosition& pos, const wxGBSpan& span, + int flag, int border, wxObject* userData ) +{ + wxGBSizerItem* item = new wxGBSizerItem(window, pos, span, flag, border, userData); + if ( Add(item) ) + return item; + else + { + delete item; + return (wxSizerItem*)NULL; + } +} + +wxSizerItem* wxGridBagSizer::Add( wxSizer *sizer, + const wxGBPosition& pos, const wxGBSpan& span, + int flag, int border, wxObject* userData ) +{ + wxGBSizerItem* item = new wxGBSizerItem(sizer, pos, span, flag, border, userData); + if ( Add(item) ) + return item; + else + { + delete item; + return (wxSizerItem*)NULL; + } +} + +wxSizerItem* wxGridBagSizer::Add( int width, int height, + const wxGBPosition& pos, const wxGBSpan& span, + int flag, int border, wxObject* userData ) +{ + wxGBSizerItem* item = new wxGBSizerItem(width, height, pos, span, flag, border, userData); + if ( Add(item) ) + return item; + else + { + delete item; + return (wxSizerItem*)NULL; + } +} + +wxSizerItem* wxGridBagSizer::Add( wxGBSizerItem *item ) +{ + wxCHECK_MSG( !CheckForIntersection(item), NULL, + wxT("An item is already at that position") ); + m_children.Append(item); + item->SetGBSizer(this); + if ( item->GetWindow() ) + item->GetWindow()->SetContainingSizer( this ); + + return item; +} + + + +//--------------------------------------------------------------------------- + +wxSize wxGridBagSizer::GetCellSize(int row, int col) const +{ + wxCHECK_MSG( (row < m_rows) && (col < m_cols), + wxDefaultSize, + wxT("Invalid cell.")); + return wxSize( m_colWidths[col], m_rowHeights[row] ); +} + + +wxGBPosition wxGridBagSizer::GetItemPosition(wxWindow *window) +{ + wxGBPosition badpos(-1,-1); + wxGBSizerItem* item = FindItem(window); + wxCHECK_MSG(item, badpos, wxT("Failed to find item.")); + return item->GetPos(); +} + + +wxGBPosition wxGridBagSizer::GetItemPosition(wxSizer *sizer) +{ + wxGBPosition badpos(-1,-1); + wxGBSizerItem* item = FindItem(sizer); + wxCHECK_MSG(item, badpos, wxT("Failed to find item.")); + return item->GetPos(); +} + + +wxGBPosition wxGridBagSizer::GetItemPosition(size_t index) +{ + wxGBPosition badpos(-1,-1); + wxSizerItemList::compatibility_iterator node = m_children.Item( index ); + wxCHECK_MSG( node, badpos, _T("Failed to find item.") ); + wxGBSizerItem* item = (wxGBSizerItem*)node->GetData(); + return item->GetPos(); +} + + + +bool wxGridBagSizer::SetItemPosition(wxWindow *window, const wxGBPosition& pos) +{ + wxGBSizerItem* item = FindItem(window); + wxCHECK_MSG(item, false, wxT("Failed to find item.")); + return item->SetPos(pos); +} + + +bool wxGridBagSizer::SetItemPosition(wxSizer *sizer, const wxGBPosition& pos) +{ + wxGBSizerItem* item = FindItem(sizer); + wxCHECK_MSG(item, false, wxT("Failed to find item.")); + return item->SetPos(pos); +} + + +bool wxGridBagSizer::SetItemPosition(size_t index, const wxGBPosition& pos) +{ + wxSizerItemList::compatibility_iterator node = m_children.Item( index ); + wxCHECK_MSG( node, false, _T("Failed to find item.") ); + wxGBSizerItem* item = (wxGBSizerItem*)node->GetData(); + return item->SetPos(pos); +} + + + +wxGBSpan wxGridBagSizer::GetItemSpan(wxWindow *window) +{ + wxGBSpan badspan(-1,-1); + wxGBSizerItem* item = FindItem(window); + wxCHECK_MSG( item, badspan, _T("Failed to find item.") ); + return item->GetSpan(); +} + + +wxGBSpan wxGridBagSizer::GetItemSpan(wxSizer *sizer) +{ + wxGBSpan badspan(-1,-1); + wxGBSizerItem* item = FindItem(sizer); + wxCHECK_MSG( item, badspan, _T("Failed to find item.") ); + return item->GetSpan(); +} + + +wxGBSpan wxGridBagSizer::GetItemSpan(size_t index) +{ + wxGBSpan badspan(-1,-1); + wxSizerItemList::compatibility_iterator node = m_children.Item( index ); + wxCHECK_MSG( node, badspan, _T("Failed to find item.") ); + wxGBSizerItem* item = (wxGBSizerItem*)node->GetData(); + return item->GetSpan(); +} + + + +bool wxGridBagSizer::SetItemSpan(wxWindow *window, const wxGBSpan& span) +{ + wxGBSizerItem* item = FindItem(window); + wxCHECK_MSG(item, false, wxT("Failed to find item.")); + return item->SetSpan(span); +} + + +bool wxGridBagSizer::SetItemSpan(wxSizer *sizer, const wxGBSpan& span) +{ + wxGBSizerItem* item = FindItem(sizer); + wxCHECK_MSG(item, false, wxT("Failed to find item.")); + return item->SetSpan(span); +} + + +bool wxGridBagSizer::SetItemSpan(size_t index, const wxGBSpan& span) +{ + wxSizerItemList::compatibility_iterator node = m_children.Item( index ); + wxCHECK_MSG( node, false, _T("Failed to find item.") ); + wxGBSizerItem* item = (wxGBSizerItem*)node->GetData(); + return item->SetSpan(span); +} + + + + +wxGBSizerItem* wxGridBagSizer::FindItem(wxWindow* window) +{ + wxSizerItemList::compatibility_iterator node = m_children.GetFirst(); + while (node) + { + wxGBSizerItem* item = (wxGBSizerItem*)node->GetData(); + if ( item->GetWindow() == window ) + return item; + node = node->GetNext(); + } + return NULL; +} + + +wxGBSizerItem* wxGridBagSizer::FindItem(wxSizer* sizer) +{ + wxSizerItemList::compatibility_iterator node = m_children.GetFirst(); + while (node) + { + wxGBSizerItem* item = (wxGBSizerItem*)node->GetData(); + if ( item->GetSizer() == sizer ) + return item; + node = node->GetNext(); + } + return NULL; +} + + + + +wxGBSizerItem* wxGridBagSizer::FindItemAtPosition(const wxGBPosition& pos) +{ + wxSizerItemList::compatibility_iterator node = m_children.GetFirst(); + while (node) + { + wxGBSizerItem* item = (wxGBSizerItem*)node->GetData(); + if ( item->Intersects(pos, wxDefaultSpan) ) + return item; + node = node->GetNext(); + } + return NULL; +} + + + + +wxGBSizerItem* wxGridBagSizer::FindItemAtPoint(const wxPoint& pt) +{ + wxSizerItemList::compatibility_iterator node = m_children.GetFirst(); + while (node) + { + wxGBSizerItem* item = (wxGBSizerItem*)node->GetData(); + wxRect rect(item->GetPosition(), item->GetSize()); + rect.Inflate(m_hgap, m_vgap); + if ( rect.Contains(pt) ) + return item; + node = node->GetNext(); + } + return NULL; +} + + + + +wxGBSizerItem* wxGridBagSizer::FindItemWithData(const wxObject* userData) +{ + wxSizerItemList::compatibility_iterator node = m_children.GetFirst(); + while (node) + { + wxGBSizerItem* item = (wxGBSizerItem*)node->GetData(); + if ( item->GetUserData() == userData ) + return item; + node = node->GetNext(); + } + return NULL; +} + + + + +//--------------------------------------------------------------------------- + +// Figure out what all the min row heights and col widths are, and calculate +// min size from that. +wxSize wxGridBagSizer::CalcMin() +{ + int idx; + + if (m_children.GetCount() == 0) + return m_emptyCellSize; + + m_rowHeights.Empty(); + m_colWidths.Empty(); + + wxSizerItemList::compatibility_iterator node = m_children.GetFirst(); + while (node) + { + wxGBSizerItem* item = (wxGBSizerItem*)node->GetData(); + if ( item->IsShown() ) + { + int row, col, endrow, endcol; + + item->GetPos(row, col); + item->GetEndPos(endrow, endcol); + + // fill heights and widths upto this item if needed + while ( m_rowHeights.GetCount() <= (size_t)endrow ) + m_rowHeights.Add(m_emptyCellSize.GetHeight()); + while ( m_colWidths.GetCount() <= (size_t)endcol ) + m_colWidths.Add(m_emptyCellSize.GetWidth()); + + // See if this item increases the size of its row(s) or col(s) + wxSize size(item->CalcMin()); + for (idx=row; idx <= endrow; idx++) + m_rowHeights[idx] = wxMax(m_rowHeights[idx], size.GetHeight() / (endrow-row+1)); + for (idx=col; idx <= endcol; idx++) + m_colWidths[idx] = wxMax(m_colWidths[idx], size.GetWidth() / (endcol-col+1)); + } + node = node->GetNext(); + } + + AdjustForFlexDirection(); + + // Now traverse the heights and widths arrays calcing the totals, including gaps + int width = 0; + m_cols = m_colWidths.GetCount(); + for (idx=0; idx < m_cols; idx++) + width += m_colWidths[idx] + ( idx == m_cols-1 ? 0 : m_hgap ); + + int height = 0; + m_rows = m_rowHeights.GetCount(); + for (idx=0; idx < m_rows; idx++) + height += m_rowHeights[idx] + ( idx == m_rows-1 ? 0 : m_vgap ); + + m_calculatedMinSize = wxSize(width, height); + return m_calculatedMinSize; +} + + + +void wxGridBagSizer::RecalcSizes() +{ + if (m_children.GetCount() == 0) + return; + + wxPoint pt( GetPosition() ); + wxSize sz( GetSize() ); + + m_rows = m_rowHeights.GetCount(); + m_cols = m_colWidths.GetCount(); + int idx, width, height; + + AdjustForGrowables(sz, m_calculatedMinSize, m_rows, m_cols); + + // Find the start positions on the window of the rows and columns + wxArrayInt rowpos; + rowpos.Add(0, m_rows); + int y = pt.y; + for (idx=0; idx < m_rows; idx++) + { + height = m_rowHeights[idx] + m_vgap; + rowpos[idx] = y; + y += height; + } + + wxArrayInt colpos; + colpos.Add(0, m_cols); + int x = pt.x; + for (idx=0; idx < m_cols; idx++) + { + width = m_colWidths[idx] + m_hgap; + colpos[idx] = x; + x += width; + } + + + // Now iterate the children, setting each child's dimensions + wxSizerItemList::compatibility_iterator node = m_children.GetFirst(); + while (node) + { + int row, col, endrow, endcol; + wxGBSizerItem* item = (wxGBSizerItem*)node->GetData(); + + if ( item->IsShown() ) + { + item->GetPos(row, col); + item->GetEndPos(endrow, endcol); + + height = 0; + for(idx=row; idx <= endrow; idx++) + height += m_rowHeights[idx]; + height += (endrow - row) * m_vgap; // add a vgap for every row spanned + + width = 0; + for (idx=col; idx <= endcol; idx++) + width += m_colWidths[idx]; + width += (endcol - col) * m_hgap; // add a hgap for every col spanned + + SetItemBounds(item, colpos[col], rowpos[row], width, height); + } + + node = node->GetNext(); + } +} + + + +//--------------------------------------------------------------------------- + +bool wxGridBagSizer::CheckForIntersection(wxGBSizerItem* item, wxGBSizerItem* excludeItem) +{ + return CheckForIntersection(item->GetPos(), item->GetSpan(), excludeItem); +} + +bool wxGridBagSizer::CheckForIntersection(const wxGBPosition& pos, const wxGBSpan& span, wxGBSizerItem* excludeItem) +{ + wxSizerItemList::compatibility_iterator node = m_children.GetFirst(); + while (node) + { + wxGBSizerItem* item = (wxGBSizerItem*)node->GetData(); + node = node->GetNext(); + + if ( excludeItem && item == excludeItem ) + continue; + + if ( item->Intersects(pos, span) ) + return true; + + } + return false; +} + + +// Assumes a 10x10 grid, and returns the first empty cell found. This is +// really stupid but it is only used by the Add methods that match the base +// class virtuals, which should normally not be used anyway... +wxGBPosition wxGridBagSizer::FindEmptyCell() +{ + int row, col; + + for (row=0; row<10; row++) + for (col=0; col<10; col++) + { + wxGBPosition pos(row, col); + if ( !CheckForIntersection(pos, wxDefaultSpan) ) + return pos; + } + return wxGBPosition(-1, -1); +} + + +//--------------------------------------------------------------------------- + +// The Add base class virtuals should not be used with this class, but +// we'll try to make them automatically select a location for the item +// anyway. + +wxSizerItem* wxGridBagSizer::Add( wxWindow *window, int, int flag, int border, wxObject* userData ) +{ + return Add(window, FindEmptyCell(), wxDefaultSpan, flag, border, userData); +} + +wxSizerItem* wxGridBagSizer::Add( wxSizer *sizer, int, int flag, int border, wxObject* userData ) +{ + return Add(sizer, FindEmptyCell(), wxDefaultSpan, flag, border, userData); +} + +wxSizerItem* wxGridBagSizer::Add( int width, int height, int, int flag, int border, wxObject* userData ) +{ + return Add(width, height, FindEmptyCell(), wxDefaultSpan, flag, border, userData); +} + + + +// The Insert nad Prepend base class virtuals that are not appropriate for +// this class and should not be used. Their implementation in this class +// simply fails. + +wxSizerItem* wxGridBagSizer::Add( wxSizerItem * ) +{ + wxFAIL_MSG(wxT("Invalid Add form called.")); + return (wxSizerItem*)NULL; +} + +wxSizerItem* wxGridBagSizer::Prepend( wxWindow *, int, int, int, wxObject* ) +{ + wxFAIL_MSG(wxT("Prepend should not be used with wxGridBagSizer.")); + return (wxSizerItem*)NULL; +} + +wxSizerItem* wxGridBagSizer::Prepend( wxSizer *, int, int, int, wxObject* ) +{ + wxFAIL_MSG(wxT("Prepend should not be used with wxGridBagSizer.")); + return (wxSizerItem*)NULL; +} + +wxSizerItem* wxGridBagSizer::Prepend( int, int, int, int, int, wxObject* ) +{ + wxFAIL_MSG(wxT("Prepend should not be used with wxGridBagSizer.")); + return (wxSizerItem*)NULL; +} + +wxSizerItem* wxGridBagSizer::Prepend( wxSizerItem * ) +{ + wxFAIL_MSG(wxT("Prepend should not be used with wxGridBagSizer.")); + return (wxSizerItem*)NULL; +} + + +wxSizerItem* wxGridBagSizer::Insert( size_t, wxWindow *, int, int, int, wxObject* ) +{ + wxFAIL_MSG(wxT("Insert should not be used with wxGridBagSizer.")); + return (wxSizerItem*)NULL; +} + +wxSizerItem* wxGridBagSizer::Insert( size_t, wxSizer *, int, int, int, wxObject* ) +{ + wxFAIL_MSG(wxT("Insert should not be used with wxGridBagSizer.")); + return (wxSizerItem*)NULL; +} + +wxSizerItem* wxGridBagSizer::Insert( size_t, int, int, int, int, int, wxObject* ) +{ + wxFAIL_MSG(wxT("Insert should not be used with wxGridBagSizer.")); + return (wxSizerItem*)NULL; +} + +wxSizerItem* wxGridBagSizer::Insert( size_t, wxSizerItem * ) +{ + wxFAIL_MSG(wxT("Insert should not be used with wxGridBagSizer.")); + return (wxSizerItem*)NULL; +} + + +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- diff --git a/Externals/wxWidgets/src/common/gdicmn.cpp b/Externals/wxWidgets/src/common/gdicmn.cpp new file mode 100644 index 0000000000..86411416fd --- /dev/null +++ b/Externals/wxWidgets/src/common/gdicmn.cpp @@ -0,0 +1,871 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/gdicmn.cpp +// Purpose: Common GDI classes +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: gdicmn.cpp 50022 2007-11-17 14:24:18Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#include "wx/gdicmn.h" +#include "wx/gdiobj.h" + +#ifndef WX_PRECOMP + #include "wx/log.h" + #include "wx/pen.h" + #include "wx/brush.h" + #include "wx/palette.h" + #include "wx/icon.h" + #include "wx/cursor.h" + #include "wx/settings.h" + #include "wx/bitmap.h" + #include "wx/colour.h" + #include "wx/font.h" +#endif + + +IMPLEMENT_DYNAMIC_CLASS(wxGDIObject, wxObject) + + +WXDLLIMPEXP_DATA_CORE(wxBrushList*) wxTheBrushList; +WXDLLIMPEXP_DATA_CORE(wxFontList*) wxTheFontList; +WXDLLIMPEXP_DATA_CORE(wxPenList*) wxThePenList; + +WXDLLIMPEXP_DATA_CORE(wxColourDatabase*) wxTheColourDatabase; + +WXDLLIMPEXP_DATA_CORE(wxBitmap) wxNullBitmap; +WXDLLIMPEXP_DATA_CORE(wxBrush) wxNullBrush; +WXDLLIMPEXP_DATA_CORE(wxColour) wxNullColour; +WXDLLIMPEXP_DATA_CORE(wxCursor) wxNullCursor; +WXDLLIMPEXP_DATA_CORE(wxFont) wxNullFont; +WXDLLIMPEXP_DATA_CORE(wxIcon) wxNullIcon; +WXDLLIMPEXP_DATA_CORE(wxPen) wxNullPen; +#if wxUSE_PALETTE +WXDLLIMPEXP_DATA_CORE(wxPalette) wxNullPalette; +#endif + +const wxSize wxDefaultSize(wxDefaultCoord, wxDefaultCoord); +const wxPoint wxDefaultPosition(wxDefaultCoord, wxDefaultCoord); + +#if wxUSE_EXTENDED_RTTI + +// wxPoint + +template<> void wxStringReadValue(const wxString &s , wxPoint &data ) +{ + wxSscanf(s, wxT("%d,%d"), &data.x , &data.y ) ; +} + +template<> void wxStringWriteValue(wxString &s , const wxPoint &data ) +{ + s = wxString::Format(wxT("%d,%d"), data.x , data.y ) ; +} + +wxCUSTOM_TYPE_INFO(wxPoint, wxToStringConverter , wxFromStringConverter) + +template<> void wxStringReadValue(const wxString &s , wxSize &data ) +{ + wxSscanf(s, wxT("%d,%d"), &data.x , &data.y ) ; +} + +template<> void wxStringWriteValue(wxString &s , const wxSize &data ) +{ + s = wxString::Format(wxT("%d,%d"), data.x , data.y ) ; +} + +wxCUSTOM_TYPE_INFO(wxSize, wxToStringConverter , wxFromStringConverter) + +#endif + +wxRect::wxRect(const wxPoint& point1, const wxPoint& point2) +{ + x = point1.x; + y = point1.y; + width = point2.x - point1.x; + height = point2.y - point1.y; + + if (width < 0) + { + width = -width; + x = point2.x; + } + width++; + + if (height < 0) + { + height = -height; + y = point2.y; + } + height++; +} + +bool wxRect::operator==(const wxRect& rect) const +{ + return ((x == rect.x) && + (y == rect.y) && + (width == rect.width) && + (height == rect.height)); +} + +wxRect wxRect::operator+(const wxRect& rect) const +{ + int x1 = wxMin(this->x, rect.x); + int y1 = wxMin(this->y, rect.y); + int y2 = wxMax(y+height, rect.height+rect.y); + int x2 = wxMax(x+width, rect.width+rect.x); + return wxRect(x1, y1, x2-x1, y2-y1); +} + +wxRect& wxRect::Union(const wxRect& rect) +{ + // ignore empty rectangles: union with an empty rectangle shouldn't extend + // this one to (0, 0) + if ( !width || !height ) + { + *this = rect; + } + else if ( rect.width && rect.height ) + { + int x1 = wxMin(x, rect.x); + int y1 = wxMin(y, rect.y); + int y2 = wxMax(y + height, rect.height + rect.y); + int x2 = wxMax(x + width, rect.width + rect.x); + + x = x1; + y = y1; + width = x2 - x1; + height = y2 - y1; + } + //else: we're not empty and rect is empty + + return *this; +} + +wxRect& wxRect::Inflate(wxCoord dx, wxCoord dy) +{ + if (-2*dx>width) + { + // Don't allow deflate to eat more width than we have, + // a well-defined rectangle cannot have negative width. + x+=width/2; + width=0; + } + else + { + // The inflate is valid. + x-=dx; + width+=2*dx; + } + + if (-2*dy>height) + { + // Don't allow deflate to eat more height than we have, + // a well-defined rectangle cannot have negative height. + y+=height/2; + height=0; + } + else + { + // The inflate is valid. + y-=dy; + height+=2*dy; + } + + return *this; +} + +bool wxRect::Contains(int cx, int cy) const +{ + return ( (cx >= x) && (cy >= y) + && ((cy - y) < height) + && ((cx - x) < width) + ); +} + +bool wxRect::Contains(const wxRect& rect) const +{ + return Contains(rect.GetTopLeft()) && Contains(rect.GetBottomRight()); +} + +wxRect& wxRect::Intersect(const wxRect& rect) +{ + int x2 = GetRight(), + y2 = GetBottom(); + + if ( x < rect.x ) + x = rect.x; + if ( y < rect.y ) + y = rect.y; + if ( x2 > rect.GetRight() ) + x2 = rect.GetRight(); + if ( y2 > rect.GetBottom() ) + y2 = rect.GetBottom(); + + width = x2 - x + 1; + height = y2 - y + 1; + + if ( width <= 0 || height <= 0 ) + { + width = + height = 0; + } + + return *this; +} + +bool wxRect::Intersects(const wxRect& rect) const +{ + wxRect r = Intersect(rect); + + // if there is no intersection, both width and height are 0 + return r.width != 0; +} + +// ============================================================================ +// wxColourDatabase +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxColourDatabase ctor/dtor +// ---------------------------------------------------------------------------- + +wxColourDatabase::wxColourDatabase () +{ + // will be created on demand in Initialize() + m_map = NULL; +} + +wxColourDatabase::~wxColourDatabase () +{ + if ( m_map ) + { + WX_CLEAR_HASH_MAP(wxStringToColourHashMap, *m_map); + + delete m_map; + } + +#ifdef __WXPM__ + delete [] m_palTable; +#endif +} + +// Colour database stuff +void wxColourDatabase::Initialize() +{ + if ( m_map ) + { + // already initialized + return; + } + + m_map = new wxStringToColourHashMap; + + static const struct wxColourDesc + { + const wxChar *name; + unsigned char r,g,b; + } + wxColourTable[] = + { + {wxT("AQUAMARINE"),112, 219, 147}, + {wxT("BLACK"),0, 0, 0}, + {wxT("BLUE"), 0, 0, 255}, + {wxT("BLUE VIOLET"), 159, 95, 159}, + {wxT("BROWN"), 165, 42, 42}, + {wxT("CADET BLUE"), 95, 159, 159}, + {wxT("CORAL"), 255, 127, 0}, + {wxT("CORNFLOWER BLUE"), 66, 66, 111}, + {wxT("CYAN"), 0, 255, 255}, + {wxT("DARK GREY"), 47, 47, 47}, // ? + + {wxT("DARK GREEN"), 47, 79, 47}, + {wxT("DARK OLIVE GREEN"), 79, 79, 47}, + {wxT("DARK ORCHID"), 153, 50, 204}, + {wxT("DARK SLATE BLUE"), 107, 35, 142}, + {wxT("DARK SLATE GREY"), 47, 79, 79}, + {wxT("DARK TURQUOISE"), 112, 147, 219}, + {wxT("DIM GREY"), 84, 84, 84}, + {wxT("FIREBRICK"), 142, 35, 35}, + {wxT("FOREST GREEN"), 35, 142, 35}, + {wxT("GOLD"), 204, 127, 50}, + {wxT("GOLDENROD"), 219, 219, 112}, + {wxT("GREY"), 128, 128, 128}, + {wxT("GREEN"), 0, 255, 0}, + {wxT("GREEN YELLOW"), 147, 219, 112}, + {wxT("INDIAN RED"), 79, 47, 47}, + {wxT("KHAKI"), 159, 159, 95}, + {wxT("LIGHT BLUE"), 191, 216, 216}, + {wxT("LIGHT GREY"), 192, 192, 192}, + {wxT("LIGHT STEEL BLUE"), 143, 143, 188}, + {wxT("LIME GREEN"), 50, 204, 50}, + {wxT("LIGHT MAGENTA"), 255, 0, 255}, + {wxT("MAGENTA"), 255, 0, 255}, + {wxT("MAROON"), 142, 35, 107}, + {wxT("MEDIUM AQUAMARINE"), 50, 204, 153}, + {wxT("MEDIUM GREY"), 100, 100, 100}, + {wxT("MEDIUM BLUE"), 50, 50, 204}, + {wxT("MEDIUM FOREST GREEN"), 107, 142, 35}, + {wxT("MEDIUM GOLDENROD"), 234, 234, 173}, + {wxT("MEDIUM ORCHID"), 147, 112, 219}, + {wxT("MEDIUM SEA GREEN"), 66, 111, 66}, + {wxT("MEDIUM SLATE BLUE"), 127, 0, 255}, + {wxT("MEDIUM SPRING GREEN"), 127, 255, 0}, + {wxT("MEDIUM TURQUOISE"), 112, 219, 219}, + {wxT("MEDIUM VIOLET RED"), 219, 112, 147}, + {wxT("MIDNIGHT BLUE"), 47, 47, 79}, + {wxT("NAVY"), 35, 35, 142}, + {wxT("ORANGE"), 204, 50, 50}, + {wxT("ORANGE RED"), 255, 0, 127}, + {wxT("ORCHID"), 219, 112, 219}, + {wxT("PALE GREEN"), 143, 188, 143}, + {wxT("PINK"), 255, 192, 203}, + {wxT("PLUM"), 234, 173, 234}, + {wxT("PURPLE"), 176, 0, 255}, + {wxT("RED"), 255, 0, 0}, + {wxT("SALMON"), 111, 66, 66}, + {wxT("SEA GREEN"), 35, 142, 107}, + {wxT("SIENNA"), 142, 107, 35}, + {wxT("SKY BLUE"), 50, 153, 204}, + {wxT("SLATE BLUE"), 0, 127, 255}, + {wxT("SPRING GREEN"), 0, 255, 127}, + {wxT("STEEL BLUE"), 35, 107, 142}, + {wxT("TAN"), 219, 147, 112}, + {wxT("THISTLE"), 216, 191, 216}, + {wxT("TURQUOISE"), 173, 234, 234}, + {wxT("VIOLET"), 79, 47, 79}, + {wxT("VIOLET RED"), 204, 50, 153}, + {wxT("WHEAT"), 216, 216, 191}, + {wxT("WHITE"), 255, 255, 255}, + {wxT("YELLOW"), 255, 255, 0}, + {wxT("YELLOW GREEN"), 153, 204, 50} + }; + + size_t n; + + for ( n = 0; n < WXSIZEOF(wxColourTable); n++ ) + { + const wxColourDesc& cc = wxColourTable[n]; + (*m_map)[cc.name] = new wxColour(cc.r, cc.g, cc.b); + } + +#ifdef __WXPM__ + m_palTable = new long[n]; + for ( n = 0; n < WXSIZEOF(wxColourTable); n++ ) + { + const wxColourDesc& cc = wxColourTable[n]; + m_palTable[n] = OS2RGB(cc.r,cc.g,cc.b); + } + m_nSize = n; +#endif +} + +// ---------------------------------------------------------------------------- +// wxColourDatabase operations +// ---------------------------------------------------------------------------- + +void wxColourDatabase::AddColour(const wxString& name, const wxColour& colour) +{ + Initialize(); + + // canonicalize the colour names before using them as keys: they should be + // in upper case + wxString colName = name; + colName.MakeUpper(); + + // ... and we also allow both grey/gray + wxString colNameAlt = colName; + if ( !colNameAlt.Replace(_T("GRAY"), _T("GREY")) ) + { + // but in this case it is not necessary so avoid extra search below + colNameAlt.clear(); + } + + wxStringToColourHashMap::iterator it = m_map->find(colName); + if ( it == m_map->end() && !colNameAlt.empty() ) + it = m_map->find(colNameAlt); + if ( it != m_map->end() ) + { + *(it->second) = colour; + } + else // new colour + { + (*m_map)[colName] = new wxColour(colour); + } +} + +wxColour wxColourDatabase::Find(const wxString& colour) const +{ + wxColourDatabase * const self = wxConstCast(this, wxColourDatabase); + self->Initialize(); + + // make the comparaison case insensitive and also match both grey and gray + wxString colName = colour; + colName.MakeUpper(); + wxString colNameAlt = colName; + if ( !colNameAlt.Replace(_T("GRAY"), _T("GREY")) ) + colNameAlt.clear(); + + wxStringToColourHashMap::iterator it = m_map->find(colName); + if ( it == m_map->end() && !colNameAlt.empty() ) + it = m_map->find(colNameAlt); + if ( it != m_map->end() ) + return *(it->second); + + // we did not find any result in existing colours: + // we won't use wxString -> wxColour conversion because the + // wxColour::Set(const wxString &) function which does that conversion + // internally uses this function (wxColourDatabase::Find) and we want + // to avoid infinite recursion ! + return wxNullColour; +} + +wxString wxColourDatabase::FindName(const wxColour& colour) const +{ + wxColourDatabase * const self = wxConstCast(this, wxColourDatabase); + self->Initialize(); + + typedef wxStringToColourHashMap::iterator iterator; + + for ( iterator it = m_map->begin(), en = m_map->end(); it != en; ++it ) + { + if ( *(it->second) == colour ) + return it->first; + } + + return wxEmptyString; +} + +// ---------------------------------------------------------------------------- +// deprecated wxColourDatabase methods +// ---------------------------------------------------------------------------- + +#if WXWIN_COMPATIBILITY_2_6 +wxColour *wxColourDatabase::FindColour(const wxString& name) +{ + // This function is deprecated, use Find() instead. + // Formerly this function sometimes would return a deletable pointer and + // sometimes a non-deletable one (when returning a colour from the database). + // Trying to delete the latter anyway results in problems, so probably + // nobody ever freed the pointers. Currently it always returns a new + // instance, which means there will be memory leaks. + wxLogDebug(wxT("wxColourDataBase::FindColour():") + wxT(" Please use wxColourDataBase::Find() instead")); + + // using a static variable here is not the most elegant solution but unless + // we want to make wxStringToColourHashMap public (i.e. move it to the + // header) so that we could have a member function returning + // wxStringToColourHashMap::iterator, there is really no good way to do it + // otherwise + // + // and knowing that this function is going to disappear in the next release + // anyhow I don't want to waste time on this + + static wxColour s_col; + + s_col = Find(name); + if ( !s_col.Ok() ) + return NULL; + + return new wxColour(s_col); +} +#endif // WXWIN_COMPATIBILITY_2_6 + +// ============================================================================ +// stock objects +// ============================================================================ + +static wxStockGDI gs_wxStockGDI_instance; +wxStockGDI* wxStockGDI::ms_instance = &gs_wxStockGDI_instance; +wxObject* wxStockGDI::ms_stockObject[ITEMCOUNT]; + +wxStockGDI::wxStockGDI() +{ +} + +wxStockGDI::~wxStockGDI() +{ +} + +void wxStockGDI::DeleteAll() +{ + for (unsigned i = 0; i < ITEMCOUNT; i++) + { + delete ms_stockObject[i]; + ms_stockObject[i] = NULL; + } +} + +const wxBrush* wxStockGDI::GetBrush(Item item) +{ + wxBrush* brush = wx_static_cast(wxBrush*, ms_stockObject[item]); + if (brush == NULL) + { + switch (item) + { + case BRUSH_BLACK: + brush = new wxBrush(*GetColour(COLOUR_BLACK), wxSOLID); + break; + case BRUSH_BLUE: + brush = new wxBrush(*GetColour(COLOUR_BLUE), wxSOLID); + break; + case BRUSH_CYAN: + brush = new wxBrush(*GetColour(COLOUR_CYAN), wxSOLID); + break; + case BRUSH_GREEN: + brush = new wxBrush(*GetColour(COLOUR_GREEN), wxSOLID); + break; + case BRUSH_GREY: + brush = new wxBrush(wxColour(wxT("GREY")), wxSOLID); + break; + case BRUSH_LIGHTGREY: + brush = new wxBrush(*GetColour(COLOUR_LIGHTGREY), wxSOLID); + break; + case BRUSH_MEDIUMGREY: + brush = new wxBrush(wxColour(wxT("MEDIUM GREY")), wxSOLID); + break; + case BRUSH_RED: + brush = new wxBrush(*GetColour(COLOUR_RED), wxSOLID); + break; + case BRUSH_TRANSPARENT: + brush = new wxBrush(*GetColour(COLOUR_BLACK), wxTRANSPARENT); + break; + case BRUSH_WHITE: + brush = new wxBrush(*GetColour(COLOUR_WHITE), wxSOLID); + break; + default: + wxFAIL; + } + ms_stockObject[item] = brush; + } + return brush; +} + +const wxColour* wxStockGDI::GetColour(Item item) +{ + wxColour* colour = wx_static_cast(wxColour*, ms_stockObject[item]); + if (colour == NULL) + { + switch (item) + { + case COLOUR_BLACK: + colour = new wxColour(0, 0, 0); + break; + case COLOUR_BLUE: + colour = new wxColour(0, 0, 255); + break; + case COLOUR_CYAN: + colour = new wxColour(wxT("CYAN")); + break; + case COLOUR_GREEN: + colour = new wxColour(0, 255, 0); + break; + case COLOUR_LIGHTGREY: + colour = new wxColour(wxT("LIGHT GREY")); + break; + case COLOUR_RED: + colour = new wxColour(255, 0, 0); + break; + case COLOUR_WHITE: + colour = new wxColour(255, 255, 255); + break; + default: + wxFAIL; + } + ms_stockObject[item] = colour; + } + return colour; +} + +const wxCursor* wxStockGDI::GetCursor(Item item) +{ + wxCursor* cursor = wx_static_cast(wxCursor*, ms_stockObject[item]); + if (cursor == NULL) + { + switch (item) + { + case CURSOR_CROSS: + cursor = new wxCursor(wxCURSOR_CROSS); + break; + case CURSOR_HOURGLASS: + cursor = new wxCursor(wxCURSOR_WAIT); + break; + case CURSOR_STANDARD: + cursor = new wxCursor(wxCURSOR_ARROW); + break; + default: + wxFAIL; + } + ms_stockObject[item] = cursor; + } + return cursor; +} + +const wxFont* wxStockGDI::GetFont(Item item) +{ + wxFont* font = wx_static_cast(wxFont*, ms_stockObject[item]); + if (font == NULL) + { + switch (item) + { + case FONT_ITALIC: + font = new wxFont(GetFont(FONT_NORMAL)->GetPointSize(), wxROMAN, wxITALIC, wxNORMAL); + break; + case FONT_NORMAL: + font = new wxFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT)); + break; + case FONT_SMALL: + font = new wxFont(GetFont(FONT_NORMAL)->GetPointSize() - 2, wxSWISS, wxNORMAL, wxNORMAL); + break; + case FONT_SWISS: + font = new wxFont(GetFont(FONT_NORMAL)->GetPointSize(), wxSWISS, wxNORMAL, wxNORMAL); + break; + default: + wxFAIL; + } + ms_stockObject[item] = font; + } + return font; +} + +const wxPen* wxStockGDI::GetPen(Item item) +{ + wxPen* pen = wx_static_cast(wxPen*, ms_stockObject[item]); + if (pen == NULL) + { + switch (item) + { + case PEN_BLACK: + pen = new wxPen(*GetColour(COLOUR_BLACK), 1, wxSOLID); + break; + case PEN_BLACKDASHED: + pen = new wxPen(*GetColour(COLOUR_BLACK), 1, wxSHORT_DASH); + break; + case PEN_CYAN: + pen = new wxPen(*GetColour(COLOUR_CYAN), 1, wxSOLID); + break; + case PEN_GREEN: + pen = new wxPen(*GetColour(COLOUR_GREEN), 1, wxSOLID); + break; + case PEN_GREY: + pen = new wxPen(wxColour(wxT("GREY")), 1, wxSOLID); + break; + case PEN_LIGHTGREY: + pen = new wxPen(*GetColour(COLOUR_LIGHTGREY), 1, wxSOLID); + break; + case PEN_MEDIUMGREY: + pen = new wxPen(wxColour(wxT("MEDIUM GREY")), 1, wxSOLID); + break; + case PEN_RED: + pen = new wxPen(*GetColour(COLOUR_RED), 1, wxSOLID); + break; + case PEN_TRANSPARENT: + pen = new wxPen(*GetColour(COLOUR_BLACK), 1, wxTRANSPARENT); + break; + case PEN_WHITE: + pen = new wxPen(*GetColour(COLOUR_WHITE), 1, wxSOLID); + break; + default: + wxFAIL; + } + ms_stockObject[item] = pen; + } + return pen; +} + +void wxInitializeStockLists() +{ + wxTheColourDatabase = new wxColourDatabase; + + wxTheBrushList = new wxBrushList; + wxThePenList = new wxPenList; + wxTheFontList = new wxFontList; +} + +void wxDeleteStockLists() +{ + wxDELETE(wxTheBrushList); + wxDELETE(wxThePenList); + wxDELETE(wxTheFontList); +} + +// ============================================================================ +// wxTheXXXList stuff (semi-obsolete) +// ============================================================================ + +wxGDIObjListBase::wxGDIObjListBase() +{ +} + +wxGDIObjListBase::~wxGDIObjListBase() +{ + for (wxList::compatibility_iterator node = list.GetFirst(); node; node = node->GetNext()) + { + delete wx_static_cast(wxObject*, node->GetData()); + } +} + +wxPen *wxPenList::FindOrCreatePen (const wxColour& colour, int width, int style) +{ + for ( wxList::compatibility_iterator node = list.GetFirst(); + node; + node = node->GetNext() ) + { + wxPen * const pen = (wxPen *) node->GetData(); + if ( pen->GetWidth () == width && + pen->GetStyle () == style && + pen->GetColour() == colour ) + return pen; + } + + wxPen* pen = NULL; + wxPen penTmp(colour, width, style); + if (penTmp.Ok()) + { + pen = new wxPen(penTmp); + list.Append(pen); + } + + return pen; +} + +wxBrush *wxBrushList::FindOrCreateBrush (const wxColour& colour, int style) +{ + for ( wxList::compatibility_iterator node = list.GetFirst(); + node; + node = node->GetNext() ) + { + wxBrush * const brush = (wxBrush *) node->GetData (); + if ( brush->GetStyle () == style && brush->GetColour() == colour ) + return brush; + } + + wxBrush* brush = NULL; + wxBrush brushTmp(colour, style); + if (brushTmp.Ok()) + { + brush = new wxBrush(brushTmp); + list.Append(brush); + } + + return brush; +} + +wxFont *wxFontList::FindOrCreateFont(int pointSize, + int family, + int style, + int weight, + bool underline, + const wxString& facename, + wxFontEncoding encoding) +{ + wxFont *font; + wxList::compatibility_iterator node; + for (node = list.GetFirst(); node; node = node->GetNext()) + { + font = (wxFont *)node->GetData(); + if ( + font->GetPointSize () == pointSize && + font->GetStyle () == style && + font->GetWeight () == weight && + font->GetUnderlined () == underline ) + { + int fontFamily = font->GetFamily(); + +#if defined(__WXGTK__) + // under GTK the default family is wxSWISS, so looking for a font + // with wxDEFAULT family should return a wxSWISS one instead of + // creating a new one + bool same = (fontFamily == family) || + (fontFamily == wxSWISS && family == wxDEFAULT); +#else // !GTK + // VZ: but why elsewhere do we require an exact match? mystery... + bool same = fontFamily == family; +#endif // GTK/!GTK + + // empty facename matches anything at all: this is bad because + // depending on which fonts are already created, we might get back + // a different font if we create it with empty facename, but it is + // still better than never matching anything in the cache at all + // in this case + if ( same && !facename.empty() ) + { + const wxString& fontFace = font->GetFaceName(); + + // empty facename matches everything + same = !fontFace || fontFace == facename; + } + + if ( same && (encoding != wxFONTENCODING_DEFAULT) ) + { + // have to match the encoding too + same = font->GetEncoding() == encoding; + } + + if ( same ) + { + return font; + } + } + } + + // font not found, create the new one + font = NULL; + wxFont fontTmp(pointSize, family, style, weight, underline, facename, encoding); + if (fontTmp.Ok()) + { + font = new wxFont(fontTmp); + list.Append(font); + } + + return font; +} + +#if WXWIN_COMPATIBILITY_2_6 +void wxBrushList::AddBrush(wxBrush*) { } +void wxBrushList::RemoveBrush(wxBrush*) { } +void wxFontList::AddFont(wxFont*) { } +void wxFontList::RemoveFont(wxFont*) { } +void wxPenList::AddPen(wxPen*) { } +void wxPenList::RemovePen(wxPen*) { } +#endif + +wxSize wxGetDisplaySize() +{ + int x, y; + wxDisplaySize(& x, & y); + return wxSize(x, y); +} + +wxRect wxGetClientDisplayRect() +{ + int x, y, width, height; + wxClientDisplayRect(&x, &y, &width, &height); // call plat-specific version + return wxRect(x, y, width, height); +} + +wxSize wxGetDisplaySizeMM() +{ + int x, y; + wxDisplaySizeMM(& x, & y); + return wxSize(x, y); +} + +wxResourceCache::~wxResourceCache () +{ + wxList::compatibility_iterator node = GetFirst (); + while (node) { + wxObject *item = (wxObject *)node->GetData(); + delete item; + + node = node->GetNext (); + } +} diff --git a/Externals/wxWidgets/src/common/geometry.cpp b/Externals/wxWidgets/src/common/geometry.cpp new file mode 100644 index 0000000000..66726d13eb --- /dev/null +++ b/Externals/wxWidgets/src/common/geometry.cpp @@ -0,0 +1,364 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/geometry.cpp +// Purpose: Common Geometry Classes +// Author: Stefan Csomor +// Modified by: +// Created: 08/05/99 +// RCS-ID: +// Copyright: (c) 1999 Stefan Csomor +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_GEOMETRY + +#include "wx/geometry.h" + +#ifndef WX_PRECOMP + #include "wx/log.h" +#endif + +#include + +#include "wx/datstrm.h" + +// +// wxPoint2D +// + +// +// wxRect2D +// + +// wxDouble version + +// for the following calculations always remember +// that the right and bottom edges are not part of a rect + +bool wxRect2DDouble::Intersects( const wxRect2DDouble &rect ) const +{ + wxDouble left,right,bottom,top; + left = wxMax ( m_x , rect.m_x ); + right = wxMin ( m_x+m_width, rect.m_x + rect.m_width ); + top = wxMax ( m_y , rect.m_y ); + bottom = wxMin ( m_y+m_height, rect.m_y + rect.m_height ); + + if ( left < right && top < bottom ) + { + return true; + } + return false; +} + +void wxRect2DDouble::Intersect( const wxRect2DDouble &src1 , const wxRect2DDouble &src2 , wxRect2DDouble *dest ) +{ + wxDouble left,right,bottom,top; + left = wxMax ( src1.m_x , src2.m_x ); + right = wxMin ( src1.m_x+src1.m_width, src2.m_x + src2.m_width ); + top = wxMax ( src1.m_y , src2.m_y ); + bottom = wxMin ( src1.m_y+src1.m_height, src2.m_y + src2.m_height ); + + if ( left < right && top < bottom ) + { + dest->m_x = left; + dest->m_y = top; + dest->m_width = right - left; + dest->m_height = bottom - top; + } + else + { + dest->m_width = dest->m_height = 0; + } +} + +void wxRect2DDouble::Union( const wxRect2DDouble &src1 , const wxRect2DDouble &src2 , wxRect2DDouble *dest ) +{ + wxDouble left,right,bottom,top; + + left = wxMin ( src1.m_x , src2.m_x ); + right = wxMax ( src1.m_x+src1.m_width, src2.m_x + src2.m_width ); + top = wxMin ( src1.m_y , src2.m_y ); + bottom = wxMax ( src1.m_y+src1.m_height, src2.m_y + src2.m_height ); + + dest->m_x = left; + dest->m_y = top; + dest->m_width = right - left; + dest->m_height = bottom - top; +} + +void wxRect2DDouble::Union( const wxPoint2DDouble &pt ) +{ + wxDouble x = pt.m_x; + wxDouble y = pt.m_y; + + if ( x < m_x ) + { + SetLeft( x ); + } + else if ( x < m_x + m_width ) + { + // contained + } + else + { + SetRight( x ); + } + + if ( y < m_y ) + { + SetTop( y ); + } + else if ( y < m_y + m_height ) + { + // contained + } + else + { + SetBottom( y ); + } +} + +void wxRect2DDouble::ConstrainTo( const wxRect2DDouble &rect ) +{ + if ( GetLeft() < rect.GetLeft() ) + SetLeft( rect.GetLeft() ); + + if ( GetRight() > rect.GetRight() ) + SetRight( rect.GetRight() ); + + if ( GetBottom() > rect.GetBottom() ) + SetBottom( rect.GetBottom() ); + + if ( GetTop() < rect.GetTop() ) + SetTop( rect.GetTop() ); +} + +wxRect2DDouble& wxRect2DDouble::operator=( const wxRect2DDouble &r ) +{ + m_x = r.m_x; + m_y = r.m_y; + m_width = r.m_width; + m_height = r.m_height; + return *this; +} + +// integer version + +// for the following calculations always remember +// that the right and bottom edges are not part of a rect + +// wxPoint2D + +#if wxUSE_STREAMS +void wxPoint2DInt::WriteTo( wxDataOutputStream &stream ) const +{ + stream.Write32( m_x ); + stream.Write32( m_y ); +} + +void wxPoint2DInt::ReadFrom( wxDataInputStream &stream ) +{ + m_x = stream.Read32(); + m_y = stream.Read32(); +} +#endif // wxUSE_STREAMS + +wxDouble wxPoint2DInt::GetVectorAngle() const +{ + if ( m_x == 0 ) + { + if ( m_y >= 0 ) + return 90; + else + return 270; + } + if ( m_y == 0 ) + { + if ( m_x >= 0 ) + return 0; + else + return 180; + } + + // casts needed for MIPSpro compiler under SGI + wxDouble deg = atan2( (double)m_y , (double)m_x ) * 180 / M_PI; + if ( deg < 0 ) + { + deg += 360; + } + return deg; +} + + +void wxPoint2DInt::SetVectorAngle( wxDouble degrees ) +{ + wxDouble length = GetVectorLength(); + m_x = (int)(length * cos( degrees / 180 * M_PI )); + m_y = (int)(length * sin( degrees / 180 * M_PI )); +} + +wxDouble wxPoint2DDouble::GetVectorAngle() const +{ + if ( wxIsNullDouble(m_x) ) + { + if ( m_y >= 0 ) + return 90; + else + return 270; + } + if ( wxIsNullDouble(m_y) ) + { + if ( m_x >= 0 ) + return 0; + else + return 180; + } + wxDouble deg = atan2( m_y , m_x ) * 180 / M_PI; + if ( deg < 0 ) + { + deg += 360; + } + return deg; +} + +void wxPoint2DDouble::SetVectorAngle( wxDouble degrees ) +{ + wxDouble length = GetVectorLength(); + m_x = length * cos( degrees / 180 * M_PI ); + m_y = length * sin( degrees / 180 * M_PI ); +} + +// wxRect2D + +bool wxRect2DInt::Intersects( const wxRect2DInt &rect ) const +{ + wxInt32 left,right,bottom,top; + left = wxMax ( m_x , rect.m_x ); + right = wxMin ( m_x+m_width, rect.m_x + rect.m_width ); + top = wxMax ( m_y , rect.m_y ); + bottom = wxMin ( m_y+m_height, rect.m_y + rect.m_height ); + + if ( left < right && top < bottom ) + { + return true; + } + return false; +} + +void wxRect2DInt::Intersect( const wxRect2DInt &src1 , const wxRect2DInt &src2 , wxRect2DInt *dest ) +{ + wxInt32 left,right,bottom,top; + left = wxMax ( src1.m_x , src2.m_x ); + right = wxMin ( src1.m_x+src1.m_width, src2.m_x + src2.m_width ); + top = wxMax ( src1.m_y , src2.m_y ); + bottom = wxMin ( src1.m_y+src1.m_height, src2.m_y + src2.m_height ); + + if ( left < right && top < bottom ) + { + dest->m_x = left; + dest->m_y = top; + dest->m_width = right - left; + dest->m_height = bottom - top; + } + else + { + dest->m_width = dest->m_height = 0; + } +} + +void wxRect2DInt::Union( const wxRect2DInt &src1 , const wxRect2DInt &src2 , wxRect2DInt *dest ) +{ + wxInt32 left,right,bottom,top; + + left = wxMin ( src1.m_x , src2.m_x ); + right = wxMax ( src1.m_x+src1.m_width, src2.m_x + src2.m_width ); + top = wxMin ( src1.m_y , src2.m_y ); + bottom = wxMax ( src1.m_y+src1.m_height, src2.m_y + src2.m_height ); + + dest->m_x = left; + dest->m_y = top; + dest->m_width = right - left; + dest->m_height = bottom - top; +} + +void wxRect2DInt::Union( const wxPoint2DInt &pt ) +{ + wxInt32 x = pt.m_x; + wxInt32 y = pt.m_y; + + if ( x < m_x ) + { + SetLeft( x ); + } + else if ( x < m_x + m_width ) + { + // contained + } + else + { + SetRight( x ); + } + + if ( y < m_y ) + { + SetTop( y ); + } + else if ( y < m_y + m_height ) + { + // contained + } + else + { + SetBottom( y ); + } +} + +void wxRect2DInt::ConstrainTo( const wxRect2DInt &rect ) +{ + if ( GetLeft() < rect.GetLeft() ) + SetLeft( rect.GetLeft() ); + + if ( GetRight() > rect.GetRight() ) + SetRight( rect.GetRight() ); + + if ( GetBottom() > rect.GetBottom() ) + SetBottom( rect.GetBottom() ); + + if ( GetTop() < rect.GetTop() ) + SetTop( rect.GetTop() ); +} + +wxRect2DInt& wxRect2DInt::operator=( const wxRect2DInt &r ) +{ + m_x = r.m_x; + m_y = r.m_y; + m_width = r.m_width; + m_height = r.m_height; + return *this; +} + +#if wxUSE_STREAMS +void wxRect2DInt::WriteTo( wxDataOutputStream &stream ) const +{ + stream.Write32( m_x ); + stream.Write32( m_y ); + stream.Write32( m_width ); + stream.Write32( m_height ); +} + +void wxRect2DInt::ReadFrom( wxDataInputStream &stream ) +{ + m_x = stream.Read32(); + m_y = stream.Read32(); + m_width = stream.Read32(); + m_height = stream.Read32(); +} +#endif // wxUSE_STREAMS + +#endif // wxUSE_GEOMETRY diff --git a/Externals/wxWidgets/src/common/gifdecod.cpp b/Externals/wxWidgets/src/common/gifdecod.cpp new file mode 100644 index 0000000000..f158185f02 --- /dev/null +++ b/Externals/wxWidgets/src/common/gifdecod.cpp @@ -0,0 +1,906 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/gifdecod.cpp +// Purpose: wxGIFDecoder, GIF reader for wxImage and wxAnimation +// Author: Guillermo Rodriguez Garcia +// Version: 3.04 +// RCS-ID: $Id: gifdecod.cpp 43898 2006-12-10 14:18:37Z VZ $ +// Copyright: (c) Guillermo Rodriguez Garcia +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_STREAMS && wxUSE_GIF + +#ifndef WX_PRECOMP + #include "wx/palette.h" +#endif + +#include +#include +#include "wx/gifdecod.h" + + + +//--------------------------------------------------------------------------- +// GIFImage +//--------------------------------------------------------------------------- + +// internal class for storing GIF image data +class GIFImage +{ +public: + // def ctor + GIFImage(); + + unsigned int w; // width + unsigned int h; // height + unsigned int left; // x coord (in logical screen) + unsigned int top; // y coord (in logical screen) + int transparent; // transparent color index (-1 = none) + wxAnimationDisposal disposal; // disposal method + long delay; // delay in ms (-1 = unused) + unsigned char *p; // bitmap + unsigned char *pal; // palette + unsigned int ncolours; // number of colours + + DECLARE_NO_COPY_CLASS(GIFImage) +}; + + + +//--------------------------------------------------------------------------- +// GIFImage constructor +//--------------------------------------------------------------------------- +GIFImage::GIFImage() +{ + w = 0; + h = 0; + left = 0; + top = 0; + transparent = 0; + disposal = wxANIM_DONOTREMOVE; + delay = -1; + p = (unsigned char *) NULL; + pal = (unsigned char *) NULL; + ncolours = 0; +} + +//--------------------------------------------------------------------------- +// wxGIFDecoder constructor and destructor +//--------------------------------------------------------------------------- + +wxGIFDecoder::wxGIFDecoder() +{ +} + +wxGIFDecoder::~wxGIFDecoder() +{ + Destroy(); +} + +void wxGIFDecoder::Destroy() +{ + wxASSERT(m_nFrames==m_frames.GetCount()); + for (unsigned int i=0; ip); + free(f->pal); + delete f; + } + + m_frames.Clear(); + m_nFrames = 0; +} + + +//--------------------------------------------------------------------------- +// Convert this image to a wxImage object +//--------------------------------------------------------------------------- + +// This function was designed by Vaclav Slavik + +bool wxGIFDecoder::ConvertToImage(unsigned int frame, wxImage *image) const +{ + unsigned char *src, *dst, *pal; + unsigned long i; + int transparent; + + // just in case... + image->Destroy(); + + // create the image + wxSize sz = GetFrameSize(frame); + image->Create(sz.GetWidth(), sz.GetHeight()); + + if (!image->Ok()) + return false; + + pal = GetPalette(frame); + src = GetData(frame); + dst = image->GetData(); + transparent = GetTransparentColourIndex(frame); + + // set transparent colour mask + if (transparent != -1) + { + for (i = 0; i < GetNcolours(frame); i++) + { + if ((pal[3 * i + 0] == 255) && + (pal[3 * i + 1] == 0) && + (pal[3 * i + 2] == 255)) + { + pal[3 * i + 2] = 254; + } + } + + pal[3 * transparent + 0] = 255, + pal[3 * transparent + 1] = 0, + pal[3 * transparent + 2] = 255; + + image->SetMaskColour(255, 0, 255); + } + else + image->SetMask(false); + +#if wxUSE_PALETTE + unsigned char r[256]; + unsigned char g[256]; + unsigned char b[256]; + + for (i = 0; i < 256; i++) + { + r[i] = pal[3*i + 0]; + g[i] = pal[3*i + 1]; + b[i] = pal[3*i + 2]; + } + + image->SetPalette(wxPalette(GetNcolours(frame), r, g, b)); +#endif // wxUSE_PALETTE + + // copy image data + unsigned long npixel = sz.GetWidth() * sz.GetHeight(); + for (i = 0; i < npixel; i++, src++) + { + *(dst++) = pal[3 * (*src) + 0]; + *(dst++) = pal[3 * (*src) + 1]; + *(dst++) = pal[3 * (*src) + 2]; + } + + return true; +} + + +//--------------------------------------------------------------------------- +// Data accessors +//--------------------------------------------------------------------------- + +#define GetFrame(n) ((GIFImage*)m_frames[n]) + + +// Get data for current frame + +wxSize wxGIFDecoder::GetFrameSize(unsigned int frame) const +{ + return wxSize(GetFrame(frame)->w, GetFrame(frame)->h); +} + +wxPoint wxGIFDecoder::GetFramePosition(unsigned int frame) const +{ + return wxPoint(GetFrame(frame)->left, GetFrame(frame)->top); +} + +wxAnimationDisposal wxGIFDecoder::GetDisposalMethod(unsigned int frame) const +{ + return GetFrame(frame)->disposal; +} + +long wxGIFDecoder::GetDelay(unsigned int frame) const +{ + return GetFrame(frame)->delay; +} + +wxColour wxGIFDecoder::GetTransparentColour(unsigned int frame) const +{ + unsigned char *pal = GetFrame(frame)->pal; + int n = GetFrame(frame)->transparent; + if (n == -1) + return wxNullColour; + + return wxColour(pal[n*3 + 0], + pal[n*3 + 1], + pal[n*3 + 2]); +} + +unsigned char* wxGIFDecoder::GetData(unsigned int frame) const { return (GetFrame(frame)->p); } +unsigned char* wxGIFDecoder::GetPalette(unsigned int frame) const { return (GetFrame(frame)->pal); } +unsigned int wxGIFDecoder::GetNcolours(unsigned int frame) const { return (GetFrame(frame)->ncolours); } +int wxGIFDecoder::GetTransparentColourIndex(unsigned int frame) const { return (GetFrame(frame)->transparent); } + + + +//--------------------------------------------------------------------------- +// GIF reading and decoding +//--------------------------------------------------------------------------- + +// getcode: +// Reads the next code from the file stream, with size 'bits' +// +int wxGIFDecoder::getcode(wxInputStream& stream, int bits, int ab_fin) +{ + unsigned int mask; // bit mask + unsigned int code; // code (result) + + // get remaining bits from last byte read + mask = (1 << bits) - 1; + code = (m_lastbyte >> (8 - m_restbits)) & mask; + + // keep reading new bytes while needed + while (bits > m_restbits) + { + // if no bytes left in this block, read the next block + if (m_restbyte == 0) + { + m_restbyte = (unsigned char)stream.GetC(); + + /* Some encoders are a bit broken: instead of issuing + * an end-of-image symbol (ab_fin) they come up with + * a zero-length subblock!! We catch this here so + * that the decoder sees an ab_fin code. + */ + if (m_restbyte == 0) + { + code = ab_fin; + break; + } + + // prefetch data + stream.Read((void *) m_buffer, m_restbyte); + if (stream.LastRead() != m_restbyte) + { + code = ab_fin; + return code; + } + m_bufp = m_buffer; + } + + // read next byte and isolate the bits we need + m_lastbyte = (unsigned char) (*m_bufp++); + mask = (1 << (bits - m_restbits)) - 1; + code = code + ((m_lastbyte & mask) << m_restbits); + m_restbyte--; + + // adjust total number of bits extracted from the buffer + m_restbits = m_restbits + 8; + } + + // find number of bits remaining for next code + m_restbits = (m_restbits - bits); + + return code; +} + + +// dgif: +// GIF decoding function. The initial code size (aka root size) +// is 'bits'. Supports interlaced images (interl == 1). +// Returns wxGIF_OK (== 0) on success, or an error code if something +// fails (see header file for details) +wxGIFErrorCode +wxGIFDecoder::dgif(wxInputStream& stream, GIFImage *img, int interl, int bits) +{ + static const int allocSize = 4096 + 1; + int *ab_prefix = new int[allocSize]; // alphabet (prefixes) + if (ab_prefix == NULL) + { + return wxGIF_MEMERR; + } + + int *ab_tail = new int[allocSize]; // alphabet (tails) + if (ab_tail == NULL) + { + delete[] ab_prefix; + return wxGIF_MEMERR; + } + + int *stack = new int[allocSize]; // decompression stack + if (stack == NULL) + { + delete[] ab_prefix; + delete[] ab_tail; + return wxGIF_MEMERR; + } + + int ab_clr; // clear code + int ab_fin; // end of info code + int ab_bits; // actual symbol width, in bits + int ab_free; // first free position in alphabet + int ab_max; // last possible character in alphabet + int pass; // pass number in interlaced images + int pos; // index into decompresion stack + unsigned int x, y; // position in image buffer + + int code, readcode, lastcode, abcabca; + + // these won't change + ab_clr = (1 << bits); + ab_fin = (1 << bits) + 1; + + // these will change through the decompression proccess + ab_bits = bits + 1; + ab_free = (1 << bits) + 2; + ab_max = (1 << ab_bits) - 1; + lastcode = -1; + abcabca = -1; + pass = 1; + pos = x = y = 0; + + // reset decoder vars + m_restbits = 0; + m_restbyte = 0; + m_lastbyte = 0; + + do + { + // get next code + readcode = code = getcode(stream, ab_bits, ab_fin); + + // end of image? + if (code == ab_fin) break; + + // reset alphabet? + if (code == ab_clr) + { + // reset main variables + ab_bits = bits + 1; + ab_free = (1 << bits) + 2; + ab_max = (1 << ab_bits) - 1; + lastcode = -1; + abcabca = -1; + + // skip to next code + continue; + } + + // unknown code: special case (like in ABCABCA) + if (code >= ab_free) + { + code = lastcode; // take last string + stack[pos++] = abcabca; // add first character + } + + // build the string for this code in the stack + while (code > ab_clr) + { + stack[pos++] = ab_tail[code]; + code = ab_prefix[code]; + + // Don't overflow. This shouldn't happen with normal + // GIF files, the allocSize of 4096+1 is enough. This + // will only happen with badly formed GIFs. + if (pos >= allocSize) + { + delete[] ab_prefix; + delete[] ab_tail; + delete[] stack; + return wxGIF_INVFORMAT; + } + } + + if (pos >= allocSize) + { + delete[] ab_prefix; + delete[] ab_tail; + delete[] stack; + return wxGIF_INVFORMAT; + } + + stack[pos] = code; // push last code into the stack + abcabca = code; // save for special case + + // make new entry in alphabet (only if NOT just cleared) + if (lastcode != -1) + { + // Normally, after the alphabet is full and can't grow any + // further (ab_free == 4096), encoder should (must?) emit CLEAR + // to reset it. This checks whether we really got it, otherwise + // the GIF is damaged. + if (ab_free > ab_max) + { + delete[] ab_prefix; + delete[] ab_tail; + delete[] stack; + return wxGIF_INVFORMAT; + } + + // This assert seems unnecessary since the condition above + // eliminates the only case in which it went false. But I really + // don't like being forced to ask "Who in .text could have + // written there?!" And I wouldn't have been forced to ask if + // this line had already been here. + wxASSERT(ab_free < allocSize); + + ab_prefix[ab_free] = lastcode; + ab_tail[ab_free] = code; + ab_free++; + + if ((ab_free > ab_max) && (ab_bits < 12)) + { + ab_bits++; + ab_max = (1 << ab_bits) - 1; + } + } + + // dump stack data to the image buffer + while (pos >= 0) + { + (img->p)[x + (y * (img->w))] = (char) stack[pos]; + pos--; + + if (++x >= (img->w)) + { + x = 0; + + if (interl) + { + // support for interlaced images + switch (pass) + { + case 1: y += 8; break; + case 2: y += 8; break; + case 3: y += 4; break; + case 4: y += 2; break; + } + + /* loop until a valid y coordinate has been + found, Or if the maximum number of passes has + been reached, exit the loop, and stop image + decoding (At this point the image is successfully + decoded). + If we don't loop, but merely set y to some other + value, that new value might still be invalid depending + on the height of the image. This would cause out of + bounds writing. + */ + while (y >= (img->h)) + { + switch (++pass) + { + case 2: y = 4; break; + case 3: y = 2; break; + case 4: y = 1; break; + + default: + /* + It's possible we arrive here. For example this + happens when the image is interlaced, and the + height is 1. Looking at the above cases, the + lowest possible y is 1. While the only valid + one would be 0 for an image of height 1. So + 'eventually' the loop will arrive here. + This case makes sure this while loop is + exited, as well as the 2 other ones. + */ + + // Set y to a valid coordinate so the local + // while loop will be exited. (y = 0 always + // is >= img->h since if img->h == 0 the + // image is never decoded) + y = 0; + + // This will exit the other outer while loop + pos = -1; + + // This will halt image decoding. + code = ab_fin; + + break; + } + } + } + else + { + // non-interlaced + y++; +/* +Normally image decoding is finished when an End of Information code is +encountered (code == ab_fin) however some broken encoders write wrong +"block byte counts" (The first byte value after the "code size" byte), +being one value too high. It might very well be possible other variants +of this problem occur as well. The only sensible solution seems to +be to check for clipping. +Example of wrong encoding: +(1 * 1 B/W image, raster data stream follows in hex bytes) + +02 << B/W images have a code size of 2 +02 << Block byte count +44 << LZW packed +00 << Zero byte count (terminates data stream) + +Because the block byte count is 2, the zero byte count is used in the +decoding process, and decoding is continued after this byte. (While it +should signal an end of image) + +It should be: +02 +02 +44 +01 << When decoded this correctly includes the End of Information code +00 + +Or (Worse solution): +02 +01 +44 +00 +(The 44 doesn't include an End of Information code, but at least the +decoder correctly skips to 00 now after decoding, and signals this +as an End of Information itself) +*/ + if (y >= img->h) + { + code = ab_fin; + break; + } + } + } + } + + pos = 0; + lastcode = readcode; + } + while (code != ab_fin); + + delete [] ab_prefix ; + delete [] ab_tail ; + delete [] stack ; + + return wxGIF_OK; +} + + +// CanRead: +// Returns true if the file looks like a valid GIF, false otherwise. +// +bool wxGIFDecoder::CanRead(wxInputStream &stream) const +{ + unsigned char buf[3]; + + if ( !stream.Read(buf, WXSIZEOF(buf)) ) + return false; + + stream.SeekI(-(wxFileOffset)WXSIZEOF(buf), wxFromCurrent); + + return memcmp(buf, "GIF", WXSIZEOF(buf)) == 0; +} + + +// LoadGIF: +// Reads and decodes one or more GIF images, depending on whether +// animated GIF support is enabled. Can read GIFs with any bit +// size (color depth), but the output images are always expanded +// to 8 bits per pixel. Also, the image palettes always contain +// 256 colors, although some of them may be unused. Returns wxGIF_OK +// (== 0) on success, or an error code if something fails (see +// header file for details) +// +wxGIFErrorCode wxGIFDecoder::LoadGIF(wxInputStream& stream) +{ + unsigned int global_ncolors = 0; + int bits, interl, transparent, i; + wxAnimationDisposal disposal; + long size; + long delay; + unsigned char type = 0; + unsigned char pal[768]; + unsigned char buf[16]; + bool anim = true; + + // check GIF signature + if (!CanRead(stream)) + return wxGIF_INVFORMAT; + + // check for animated GIF support (ver. >= 89a) + + static const unsigned int headerSize = (3 + 3); + stream.Read(buf, headerSize); + if (stream.LastRead() != headerSize) + { + return wxGIF_INVFORMAT; + } + + if (memcmp(buf + 3, "89a", 3) < 0) + { + anim = false; + } + + // read logical screen descriptor block (LSDB) + static const unsigned int lsdbSize = (2 + 2 + 1 + 1 + 1); + stream.Read(buf, lsdbSize); + if (stream.LastRead() != lsdbSize) + { + return wxGIF_INVFORMAT; + } + + m_szAnimation.SetWidth( buf[0] + 256 * buf[1] ); + m_szAnimation.SetHeight( buf[2] + 256 * buf[3] ); + + if (anim && ((m_szAnimation.GetWidth() == 0) || (m_szAnimation.GetHeight() == 0))) + { + return wxGIF_INVFORMAT; + } + + // load global color map if available + if ((buf[4] & 0x80) == 0x80) + { + int backgroundColIndex = buf[5]; + + global_ncolors = 2 << (buf[4] & 0x07); + unsigned int numBytes = 3 * global_ncolors; + stream.Read(pal, numBytes); + if (stream.LastRead() != numBytes) + { + return wxGIF_INVFORMAT; + } + + m_background.Set(pal[backgroundColIndex*3 + 0], + pal[backgroundColIndex*3 + 1], + pal[backgroundColIndex*3 + 2]); + } + + // transparent colour, disposal method and delay default to unused + transparent = -1; + disposal = wxANIM_UNSPECIFIED; + delay = -1; + + bool done = false; + while (!done) + { + type = (unsigned char)stream.GetC(); + + /* + If the end of file has been reached (or an error) and a ";" + (0x3B) hasn't been encountered yet, exit the loop. (Without this + check the while loop would loop endlessly.) Later on, in the next while + loop, the file will be treated as being truncated (But still + be decoded as far as possible). returning wxGIF_TRUNCATED is not + possible here since some init code is done after this loop. + */ + if (stream.Eof())// || !stream.IsOk()) + { + /* + type is set to some bogus value, so there's no + need to continue evaluating it. + */ + break; // Alternative : "return wxGIF_INVFORMAT;" + } + + // end of data? + if (type == 0x3B) + { + done = true; + } + else + // extension block? + if (type == 0x21) + { + if (((unsigned char)stream.GetC()) == 0xF9) + // graphics control extension, parse it + { + static const unsigned int gceSize = 6; + stream.Read(buf, gceSize); + if (stream.LastRead() != gceSize) + { + Destroy(); + return wxGIF_INVFORMAT; + } + + // read delay and convert from 1/100 of a second to ms + delay = 10 * (buf[2] + 256 * buf[3]); + + // read transparent colour index, if used + if (buf[1] & 0x01) + transparent = buf[4]; + + // read disposal method + disposal = (wxAnimationDisposal)(((buf[1] & 0x1C) >> 2) - 1); + } + else + // other extension, skip + { + while ((i = (unsigned char)stream.GetC()) != 0) + { + if (stream.Eof() || (stream.LastRead() == 0)) + { + done = true; + break; + } + stream.SeekI(i, wxFromCurrent); + } + } + } + else + // image descriptor block? + if (type == 0x2C) + { + // allocate memory for IMAGEN struct + GIFImage *pimg = new GIFImage(); + + if (pimg == NULL) + { + Destroy(); + return wxGIF_MEMERR; + } + + // fill in the data + static const unsigned int idbSize = (2 + 2 + 2 + 2 + 1); + stream.Read(buf, idbSize); + if (stream.LastRead() != idbSize) + { + Destroy(); + return wxGIF_INVFORMAT; + } + + pimg->left = buf[0] + 256 * buf[1]; + pimg->top = buf[2] + 256 * buf[3]; +/* + pimg->left = buf[4] + 256 * buf[5]; + pimg->top = buf[4] + 256 * buf[5]; +*/ + pimg->w = buf[4] + 256 * buf[5]; + pimg->h = buf[6] + 256 * buf[7]; + + if (anim && ((pimg->w == 0) || (pimg->w > (unsigned int)m_szAnimation.GetWidth()) || + (pimg->h == 0) || (pimg->h > (unsigned int)m_szAnimation.GetHeight()))) + { + Destroy(); + return wxGIF_INVFORMAT; + } + + interl = ((buf[8] & 0x40)? 1 : 0); + size = pimg->w * pimg->h; + + pimg->transparent = transparent; + pimg->disposal = disposal; + pimg->delay = delay; + + // allocate memory for image and palette + pimg->p = (unsigned char *) malloc((unsigned int)size); + pimg->pal = (unsigned char *) malloc(768); + + if ((!pimg->p) || (!pimg->pal)) + { + Destroy(); + return wxGIF_MEMERR; + } + + // load local color map if available, else use global map + if ((buf[8] & 0x80) == 0x80) + { + unsigned int local_ncolors = 2 << (buf[8] & 0x07); + unsigned int numBytes = 3 * local_ncolors; + stream.Read(pimg->pal, numBytes); + pimg->ncolours = local_ncolors; + if (stream.LastRead() != numBytes) + { + Destroy(); + return wxGIF_INVFORMAT; + } + } + else + { + memcpy(pimg->pal, pal, 768); + pimg->ncolours = global_ncolors; + } + + // get initial code size from first byte in raster data + bits = (unsigned char)stream.GetC(); + if (bits == 0) + { + Destroy(); + return wxGIF_INVFORMAT; + } + + // decode image + wxGIFErrorCode result = dgif(stream, pimg, interl, bits); + if (result != wxGIF_OK) + { + Destroy(); + return result; + } + + // add the image to our frame array + m_frames.Add((void*)pimg); + m_nFrames++; + + // if this is not an animated GIF, exit after first image + if (!anim) + done = true; + } + } + + if (m_nFrames <= 0) + { + Destroy(); + return wxGIF_INVFORMAT; + } + + // try to read to the end of the stream + while (type != 0x3B) + { + if (!stream.IsOk()) + return wxGIF_TRUNCATED; + + type = (unsigned char)stream.GetC(); + + if (type == 0x21) + { + // extension type + (void) stream.GetC(); + + // skip all data + while ((i = (unsigned char)stream.GetC()) != 0) + { + if (stream.Eof() || (stream.LastRead() == 0)) + { + Destroy(); + return wxGIF_INVFORMAT; + } + stream.SeekI(i, wxFromCurrent); + } + } + else if (type == 0x2C) + { + // image descriptor block + static const unsigned int idbSize = (2 + 2 + 2 + 2 + 1); + stream.Read(buf, idbSize); + if (stream.LastRead() != idbSize) + { + Destroy(); + return wxGIF_INVFORMAT; + } + + // local color map + if ((buf[8] & 0x80) == 0x80) + { + unsigned int local_ncolors = 2 << (buf[8] & 0x07); + wxFileOffset numBytes = 3 * local_ncolors; + stream.SeekI(numBytes, wxFromCurrent); + } + + // initial code size + (void) stream.GetC(); + if (stream.Eof() || (stream.LastRead() == 0)) + { + Destroy(); + return wxGIF_INVFORMAT; + } + + // skip all data + while ((i = (unsigned char)stream.GetC()) != 0) + { + if (stream.Eof() || (stream.LastRead() == 0)) + { + Destroy(); + return wxGIF_INVFORMAT; + } + stream.SeekI(i, wxFromCurrent); + } + } + else if ((type != 0x3B) && (type != 00)) // testing + { + // images are OK, but couldn't read to the end of the stream + return wxGIF_TRUNCATED; + } + } + + return wxGIF_OK; +} + +#endif // wxUSE_STREAMS && wxUSE_GIF diff --git a/Externals/wxWidgets/src/common/glob.inc b/Externals/wxWidgets/src/common/glob.inc new file mode 100644 index 0000000000..ea226977ef --- /dev/null +++ b/Externals/wxWidgets/src/common/glob.inc @@ -0,0 +1,367 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: glob.inc +// Purpose: File and other globbing (included by utils.cpp) +// Author: Karsten Ballueder +// Modified by: +// Created: 20/5/1998 +// RCS-ID: $Id: glob.inc 33948 2005-05-04 18:57:50Z JS $ +// Copyright: (c) Karsten Ballueder +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// This file includes: +// wxIsWild(const char *pattern) +// wxMatchWild(const char *pattern, const char *str, bool dot_special) +// + +//--------------------------------------------------------------------------------- +#ifndef UNIX_GLOB +# ifdef wx_x +# define UNIX_GLOB 1 +# else +# define UNIX_GLOB 0 +# endif +#endif + +#if UNIX_GLOB +# ifdef wx_msw +# error "Can't use Unix file globbing under Windows!" +# endif +#endif + +/************************************************************************* + * + * wxIsWild checks whether the pattern contains wildcards, and + * returns TRUE if it does, and FALSE if it does not (or if the + * pattern is NULL -- i.e. no string). + * + * The argument is: + * + * 1) pattern - a character string + */ +bool +wxIsWild (const char *pattern) +{ + while (*pattern) + { + switch (*pattern++) + { + case '?': + case '*': +#if UNIX_GLOB + case '[': + case '{': /* } */ +#endif + return TRUE; +#if UNIX_GLOB + case '\\': + if (!*pattern++) + return FALSE; +#endif + } /* switch() */ + } /* while() */ + return FALSE; +} + + + +#if UNIX_GLOB + +// Unix Glob() +// +// Pattern Function +// ----------------------------------------------------- +// '*' = match 0 or more occurances of anything +// "[abc]" = match anyof "abc" (ranges supported) +// "{xx,yy,zz}" = match anyof "xx", "yy", or "zz" +// '?' = match any character +// +// '\' is used to "escape" special characters +// Recursive + +bool +wxMatchWild (const char *pattern, const char *str, bool dot_special) +{ + char c; + const char *cp; + bool done = FALSE, ret_code, ok; + // Below is for vi fans + const char OB = '{', CB = '}'; + +#if 0 + if (strcmp(pattern, "*.*") == 0) + pattern = "*"; // Hack for MS-DOS compat. +#endif + + // dot_special means '.' only matches '.' + if (dot_special && *str == '.' && *pattern != *str) + return FALSE; + + while ((*pattern != '\0') && (!done) && (((*str == '\0') && + ((*pattern == OB) || (*pattern == '*'))) || (*str != '\0'))) + { + switch (*pattern) + { + case '\\': + pattern++; + if (*pattern != '\0') + pattern++; + break; + case '*': + pattern++; + ret_code = FALSE; + while ((*str != '\0') && (!(ret_code = wxMatchWild (pattern, str++, FALSE)))); + if (ret_code) + { + while (*str != '\0') + str++; + while (*pattern != '\0') + pattern++; + } + break; + case '[': + pattern++; + repeat: + if ((*pattern == '\0') || (*pattern == ']')) + { + done = TRUE; + break; + } + if (*pattern == '\\') + { + pattern++; + if (*pattern == '\0') + { + done = TRUE; + break; + } + } + if (*(pattern + 1) == '-') + { + c = *pattern; + pattern += 2; + if (*pattern == ']') + { + done = TRUE; + break; + } + if (*pattern == '\\') + { + pattern++; + if (*pattern == '\0') + { + done = TRUE; + break; + } + } + if ((*str < c) || (*str > *pattern)) + { + pattern++; + goto repeat; + } + } + else if (*pattern != *str) + { + pattern++; + goto repeat; + } + pattern++; + while ((*pattern != ']') && (*pattern != '\0')) + { + if ((*pattern == '\\') && (*(pattern + 1) != '\0')) + pattern++; + pattern++; + } // while() + if (*pattern != '\0') + { + pattern++, str++; + } + break; + case '?': + pattern++; + str++; + break; + case OB: + pattern++; + while ((*pattern != CB) && (*pattern != '\0')) + { + cp = str; + ok = TRUE; + while (ok && (*cp != '\0') && (*pattern != '\0') && + (*pattern != ',') && (*pattern != CB)) + { + if (*pattern == '\\') + pattern++; + ok = (*pattern++ == *cp++); + } // while() + if (*pattern == '\0') + { + ok = FALSE; + done = TRUE; + break; + } + else if (ok) + { + str = cp; + while ((*pattern != CB) && (*pattern != '\0')) + { + if (*++pattern == '\\') + { + if (*++pattern == CB) + pattern++; + } + } // while() + } + else + { + while (*pattern != CB && *pattern != ',' && *pattern != '\0') + { + if (*++pattern == '\\') + { + if (*++pattern == CB || *pattern == ',') + pattern++; + } + } // while() + } + if (*pattern != '\0') + pattern++; + } // while() + break; + default: + if (*str == *pattern) + { + str++, pattern++; + } + else + { + done = TRUE; + } + } // switch() + } // while() + while (*pattern == '*') + pattern++; + return ((*str == '\0') && (*pattern == '\0')); +} + +#else /* MS-DOS/Windows glob() */ +/************************************************************************* + * + * wxMatchWild matches the given pattern string against + * a text string, and returns TRUE if it matches, FALSE otherwise. + * + * A match means that the entire text string is used up in the matching. + * The pattern can contain the following wildcards. + * + * * -- matches any sequence of characters + * ? -- matches one character + * + * If one or other or both of the string arguments to wxMatchWild function is + * NULL (i.e. there isn't a string), then the function returns FALSE. + * + */ +static bool wxPatternMatch (const char *pattern, const char *text, size_t i, size_t j); + +// @@@@ dotSpecial is ignored by MS-DOS +bool +wxMatchWild (const char *pattern, const char *text, bool /* dotSpecial */ ) +{ + if (pattern == NULL || text == NULL || *pattern == '\0' || *text == '\0') + return FALSE; + return wxPatternMatch (pattern, text, 0, 0); +} + +/************************************************************************* + * + * wxPatternMatch does the work for wxMatchWild. wxPatternMatch matches + * the given pattern string against a text string, and returns TRUE if + * it matches, FALSE otherwise. It is assumed that the string arguments + * to wxPatternMatch exist. + * + * A match means that the entire text string is used up in the matching. + * The pattern can contain the following wildcards. + * + * * -- matches any sequence of characters + * ? -- matches one character + * + * wxPatternMatch works by going down the pattern trying to match the + * the same index character in the pattern and string arrays, and stops + * when the end of the pattern or text string is reached. However, if a + * '*' wildcard is met, the algorithm checks to see whether the remaining + * pattern (after the wildcard) matches the rest of the text (i.e. the + * wxPatternMatch function is called recursively). + */ +// Recursive +static bool +wxPatternMatch (const char *pattern, const char *text, size_t i, size_t j) +{ + size_t pattern_length = strlen (pattern); + size_t text_length = strlen (text); + bool match = FALSE; + +#ifdef wx_msw +// MS-DOS file system is case INDEPENDENT +# define EQU(x,y) (wxToLower(x) == wxToLower(y)) +#else +# define EQU(x,y) ((x) == (y)) +#endif + + while (j < pattern_length && i < text_length) + { + if (EQU(text[i], pattern[j]) || pattern[j] == '?') + { + match = TRUE; + i++, j++; + } + else if (pattern[j] == '*') + { + // If pattern ends in '*' + if (++j == pattern_length) + { + match = TRUE; + i = text_length; + } + else + { + match = FALSE; +// after wildcard check to see whether rest of pattern matches + // up with rest of text + while (i < text_length && match != TRUE) + { + match = wxPatternMatch (pattern, text, i, j); + i++; + } +// text index is decremented so that it points to where + // the text string starts to match the rest of the pattern + i--; + } + } + else if (! EQU(text[i], pattern[j])) + { + j = pattern_length; + match = FALSE; + } + } + if (j == pattern_length && i == text_length && match == TRUE) + { + return TRUE; + } + else +// special case where pattern and text are the same except that pattern + // also only has '*' wildcards on the end + if (i == text_length && pattern[j] == '*' && match == TRUE) + { + for (; j < pattern_length; j++) + { + if (pattern[j] != '*') + return FALSE; + } + return TRUE; + } + else + { + return FALSE; + } +} + +#endif /* UNIX_GLOB */ +//----------------------------------------------------------------------------- diff --git a/Externals/wxWidgets/src/common/graphcmn.cpp b/Externals/wxWidgets/src/common/graphcmn.cpp new file mode 100644 index 0000000000..368026025d --- /dev/null +++ b/Externals/wxWidgets/src/common/graphcmn.cpp @@ -0,0 +1,769 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/graphcmn.cpp +// Purpose: graphics context methods common to all platforms +// Author: Stefan Csomor +// Modified by: +// Created: +// RCS-ID: $Id: graphcmn.cpp 49287 2007-10-21 11:52:54Z SC $ +// Copyright: (c) Stefan Csomor +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#if defined(__BORLANDC__) + #pragma hdrstop +#endif + +#if wxUSE_GRAPHICS_CONTEXT + +#include "wx/graphics.h" + +#ifndef WX_PRECOMP + #include "wx/icon.h" + #include "wx/bitmap.h" + #include "wx/dcmemory.h" + #include "wx/region.h" + #include "wx/log.h" +#endif + +#if !defined(wxMAC_USE_CORE_GRAPHICS_BLEND_MODES) +#define wxMAC_USE_CORE_GRAPHICS_BLEND_MODES 0 +#endif + +//----------------------------------------------------------------------------- +// constants +//----------------------------------------------------------------------------- + +static const double RAD2DEG = 180.0 / M_PI; + +//----------------------------------------------------------------------------- +// Local functions +//----------------------------------------------------------------------------- + +static inline double DegToRad(double deg) +{ + return (deg * M_PI) / 180.0; +} + +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// wxGraphicsObject +//----------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxGraphicsObject, wxObject) + +wxGraphicsObjectRefData::wxGraphicsObjectRefData( wxGraphicsRenderer* renderer ) +{ + m_renderer = renderer; +} +wxGraphicsObjectRefData::wxGraphicsObjectRefData( const wxGraphicsObjectRefData* data ) +{ + m_renderer = data->m_renderer; +} +wxGraphicsRenderer* wxGraphicsObjectRefData::GetRenderer() const +{ + return m_renderer ; +} + +wxGraphicsObjectRefData* wxGraphicsObjectRefData::Clone() const +{ + return new wxGraphicsObjectRefData(this); +} + +wxGraphicsObject::wxGraphicsObject() +{ +} + +wxGraphicsObject::wxGraphicsObject( wxGraphicsRenderer* renderer ) +{ + SetRefData( new wxGraphicsObjectRefData(renderer)); +} + +wxGraphicsObject::~wxGraphicsObject() +{ +} + +bool wxGraphicsObject::IsNull() const +{ + return m_refData == NULL; +} + +wxGraphicsRenderer* wxGraphicsObject::GetRenderer() const +{ + return ( IsNull() ? NULL : GetGraphicsData()->GetRenderer() ); +} + +wxGraphicsObjectRefData* wxGraphicsObject::GetGraphicsData() const +{ + return (wxGraphicsObjectRefData*) m_refData; +} + +wxObjectRefData* wxGraphicsObject::CreateRefData() const +{ + wxLogDebug(wxT("A Null Object cannot be changed")); + return NULL; +} + +wxObjectRefData* wxGraphicsObject::CloneRefData(const wxObjectRefData* data) const +{ + const wxGraphicsObjectRefData* ptr = (const wxGraphicsObjectRefData*) data; + return ptr->Clone(); +} + +//----------------------------------------------------------------------------- +// pens etc. +//----------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxGraphicsPen, wxGraphicsObject) +IMPLEMENT_DYNAMIC_CLASS(wxGraphicsBrush, wxGraphicsObject) +IMPLEMENT_DYNAMIC_CLASS(wxGraphicsFont, wxGraphicsObject) + +WXDLLIMPEXP_DATA_CORE(wxGraphicsPen) wxNullGraphicsPen; +WXDLLIMPEXP_DATA_CORE(wxGraphicsBrush) wxNullGraphicsBrush; +WXDLLIMPEXP_DATA_CORE(wxGraphicsFont) wxNullGraphicsFont; + +//----------------------------------------------------------------------------- +// matrix +//----------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxGraphicsMatrix, wxGraphicsObject) +WXDLLIMPEXP_DATA_CORE(wxGraphicsMatrix) wxNullGraphicsMatrix; + +// concatenates the matrix +void wxGraphicsMatrix::Concat( const wxGraphicsMatrix *t ) +{ + AllocExclusive(); + GetMatrixData()->Concat(t->GetMatrixData()); +} + +// sets the matrix to the respective values +void wxGraphicsMatrix::Set(wxDouble a, wxDouble b, wxDouble c, wxDouble d, + wxDouble tx, wxDouble ty) +{ + AllocExclusive(); + GetMatrixData()->Set(a,b,c,d,tx,ty); +} + +// gets the component valuess of the matrix +void wxGraphicsMatrix::Get(wxDouble* a, wxDouble* b, wxDouble* c, + wxDouble* d, wxDouble* tx, wxDouble* ty) const +{ + GetMatrixData()->Get(a, b, c, d, tx, ty); +} + +// makes this the inverse matrix +void wxGraphicsMatrix::Invert() +{ + AllocExclusive(); + GetMatrixData()->Invert(); +} + +// returns true if the elements of the transformation matrix are equal ? +bool wxGraphicsMatrix::IsEqual( const wxGraphicsMatrix* t) const +{ + return GetMatrixData()->IsEqual(t->GetMatrixData()); +} + +// return true if this is the identity matrix +bool wxGraphicsMatrix::IsIdentity() const +{ + return GetMatrixData()->IsIdentity(); +} + +// add the translation to this matrix +void wxGraphicsMatrix::Translate( wxDouble dx , wxDouble dy ) +{ + AllocExclusive(); + GetMatrixData()->Translate(dx,dy); +} + +// add the scale to this matrix +void wxGraphicsMatrix::Scale( wxDouble xScale , wxDouble yScale ) +{ + AllocExclusive(); + GetMatrixData()->Scale(xScale,yScale); +} + +// add the rotation to this matrix (radians) +void wxGraphicsMatrix::Rotate( wxDouble angle ) +{ + AllocExclusive(); + GetMatrixData()->Rotate(angle); +} + +// +// apply the transforms +// + +// applies that matrix to the point +void wxGraphicsMatrix::TransformPoint( wxDouble *x, wxDouble *y ) const +{ + GetMatrixData()->TransformPoint(x,y); +} + +// applies the matrix except for translations +void wxGraphicsMatrix::TransformDistance( wxDouble *dx, wxDouble *dy ) const +{ + GetMatrixData()->TransformDistance(dx,dy); +} + +// returns the native representation +void * wxGraphicsMatrix::GetNativeMatrix() const +{ + return GetMatrixData()->GetNativeMatrix(); +} + +//----------------------------------------------------------------------------- +// path +//----------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxGraphicsPath, wxGraphicsObject) +WXDLLIMPEXP_DATA_CORE(wxGraphicsPath) wxNullGraphicsPath; + +// convenience functions, for using wxPoint2DDouble etc + +wxPoint2DDouble wxGraphicsPath::GetCurrentPoint() const +{ + wxDouble x,y; + GetCurrentPoint(&x,&y); + return wxPoint2DDouble(x,y); +} + +void wxGraphicsPath::MoveToPoint( const wxPoint2DDouble& p) +{ + MoveToPoint( p.m_x , p.m_y); +} + +void wxGraphicsPath::AddLineToPoint( const wxPoint2DDouble& p) +{ + AddLineToPoint( p.m_x , p.m_y); +} + +void wxGraphicsPath::AddCurveToPoint( const wxPoint2DDouble& c1, const wxPoint2DDouble& c2, const wxPoint2DDouble& e) +{ + AddCurveToPoint(c1.m_x, c1.m_y, c2.m_x, c2.m_y, e.m_x, e.m_y); +} + +void wxGraphicsPath::AddArc( const wxPoint2DDouble& c, wxDouble r, wxDouble startAngle, wxDouble endAngle, bool clockwise) +{ + AddArc(c.m_x, c.m_y, r, startAngle, endAngle, clockwise); +} + +wxRect2DDouble wxGraphicsPath::GetBox() const +{ + wxDouble x,y,w,h; + GetBox(&x,&y,&w,&h); + return wxRect2DDouble( x,y,w,h ); +} + +bool wxGraphicsPath::Contains( const wxPoint2DDouble& c, int fillStyle ) const +{ + return Contains( c.m_x, c.m_y, fillStyle); +} + +// true redirections + +// begins a new subpath at (x,y) +void wxGraphicsPath::MoveToPoint( wxDouble x, wxDouble y ) +{ + AllocExclusive(); + GetPathData()->MoveToPoint(x,y); +} + +// adds a straight line from the current point to (x,y) +void wxGraphicsPath::AddLineToPoint( wxDouble x, wxDouble y ) +{ + AllocExclusive(); + GetPathData()->AddLineToPoint(x,y); +} + +// adds a cubic Bezier curve from the current point, using two control points and an end point +void wxGraphicsPath::AddCurveToPoint( wxDouble cx1, wxDouble cy1, wxDouble cx2, wxDouble cy2, wxDouble x, wxDouble y ) +{ + AllocExclusive(); + GetPathData()->AddCurveToPoint(cx1,cy1,cx2,cy2,x,y); +} + +// adds another path +void wxGraphicsPath::AddPath( const wxGraphicsPath& path ) +{ + AllocExclusive(); + GetPathData()->AddPath(path.GetPathData()); +} + +// closes the current sub-path +void wxGraphicsPath::CloseSubpath() +{ + AllocExclusive(); + GetPathData()->CloseSubpath(); +} + +// gets the last point of the current path, (0,0) if not yet set +void wxGraphicsPath::GetCurrentPoint( wxDouble* x, wxDouble* y) const +{ + GetPathData()->GetCurrentPoint(x,y); +} + +// adds an arc of a circle centering at (x,y) with radius (r) from startAngle to endAngle +void wxGraphicsPath::AddArc( wxDouble x, wxDouble y, wxDouble r, wxDouble startAngle, wxDouble endAngle, bool clockwise ) +{ + AllocExclusive(); + GetPathData()->AddArc(x,y,r,startAngle,endAngle,clockwise); +} + +// +// These are convenience functions which - if not available natively will be assembled +// using the primitives from above +// + +// adds a quadratic Bezier curve from the current point, using a control point and an end point +void wxGraphicsPath::AddQuadCurveToPoint( wxDouble cx, wxDouble cy, wxDouble x, wxDouble y ) +{ + AllocExclusive(); + GetPathData()->AddQuadCurveToPoint(cx,cy,x,y); +} + +// appends a rectangle as a new closed subpath +void wxGraphicsPath::AddRectangle( wxDouble x, wxDouble y, wxDouble w, wxDouble h ) +{ + AllocExclusive(); + GetPathData()->AddRectangle(x,y,w,h); +} + +// appends an ellipsis as a new closed subpath fitting the passed rectangle +void wxGraphicsPath::AddCircle( wxDouble x, wxDouble y, wxDouble r ) +{ + AllocExclusive(); + GetPathData()->AddCircle(x,y,r); +} + +// appends a an arc to two tangents connecting (current) to (x1,y1) and (x1,y1) to (x2,y2), also a straight line from (current) to (x1,y1) +void wxGraphicsPath::AddArcToPoint( wxDouble x1, wxDouble y1 , wxDouble x2, wxDouble y2, wxDouble r ) +{ + GetPathData()->AddArcToPoint(x1,y1,x2,y2,r); +} + +// appends an ellipse +void wxGraphicsPath::AddEllipse( wxDouble x, wxDouble y, wxDouble w, wxDouble h) +{ + AllocExclusive(); + GetPathData()->AddEllipse(x,y,w,h); +} + +// appends a rounded rectangle +void wxGraphicsPath::AddRoundedRectangle( wxDouble x, wxDouble y, wxDouble w, wxDouble h, wxDouble radius) +{ + AllocExclusive(); + GetPathData()->AddRoundedRectangle(x,y,w,h,radius); +} + +// returns the native path +void * wxGraphicsPath::GetNativePath() const +{ + return GetPathData()->GetNativePath(); +} + +// give the native path returned by GetNativePath() back (there might be some deallocations necessary) +void wxGraphicsPath::UnGetNativePath(void *p)const +{ + GetPathData()->UnGetNativePath(p); +} + +// transforms each point of this path by the matrix +void wxGraphicsPath::Transform( const wxGraphicsMatrix& matrix ) +{ + AllocExclusive(); + GetPathData()->Transform(matrix.GetMatrixData()); +} + +// gets the bounding box enclosing all points (possibly including control points) +void wxGraphicsPath::GetBox(wxDouble *x, wxDouble *y, wxDouble *w, wxDouble *h) const +{ + GetPathData()->GetBox(x,y,w,h); +} + +bool wxGraphicsPath::Contains( wxDouble x, wxDouble y, int fillStyle ) const +{ + return GetPathData()->Contains(x,y,fillStyle); +} + +// +// Emulations, these mus be implemented in the ...Data classes in order to allow for proper overrides +// + +void wxGraphicsPathData::AddQuadCurveToPoint( wxDouble cx, wxDouble cy, wxDouble x, wxDouble y ) +{ + // calculate using degree elevation to a cubic bezier + wxPoint2DDouble c1; + wxPoint2DDouble c2; + + wxPoint2DDouble start; + GetCurrentPoint(&start.m_x,&start.m_y); + wxPoint2DDouble end(x,y); + wxPoint2DDouble c(cx,cy); + c1 = wxDouble(1/3.0) * start + wxDouble(2/3.0) * c; + c2 = wxDouble(2/3.0) * c + wxDouble(1/3.0) * end; + AddCurveToPoint(c1.m_x,c1.m_y,c2.m_x,c2.m_y,x,y); +} + +void wxGraphicsPathData::AddRectangle( wxDouble x, wxDouble y, wxDouble w, wxDouble h ) +{ + MoveToPoint(x,y); + AddLineToPoint(x,y+h); + AddLineToPoint(x+w,y+h); + AddLineToPoint(x+w,y); + CloseSubpath(); +} + +void wxGraphicsPathData::AddCircle( wxDouble x, wxDouble y, wxDouble r ) +{ + MoveToPoint(x+r,y); + AddArc( x,y,r,0,2*M_PI,false); + CloseSubpath(); +} + +void wxGraphicsPathData::AddEllipse( wxDouble x, wxDouble y, wxDouble w, wxDouble h) +{ + wxDouble rw = w/2; + wxDouble rh = h/2; + wxDouble xc = x + rw; + wxDouble yc = y + rh; + wxGraphicsMatrix m = GetRenderer()->CreateMatrix(); + m.Translate(xc,yc); + m.Scale(rw/rh,1.0); + wxGraphicsPath p = GetRenderer()->CreatePath(); + p.AddCircle(0,0,rh); + p.Transform(m); + AddPath(p.GetPathData()); +} + +void wxGraphicsPathData::AddRoundedRectangle( wxDouble x, wxDouble y, wxDouble w, wxDouble h, wxDouble radius) +{ + if ( radius == 0 ) + AddRectangle(x,y,w,h); + else + { + MoveToPoint( x + w, y + h / 2); + AddArcToPoint(x + w, y + h, x + w / 2, y + h, radius); + AddArcToPoint(x, y + h, x, y + h / 2, radius); + AddArcToPoint(x, y , x + w / 2, y, radius); + AddArcToPoint(x + w, y, x + w, y + h / 2, radius); + CloseSubpath(); + } +} + +// draws a an arc to two tangents connecting (current) to (x1,y1) and (x1,y1) to (x2,y2), also a straight line from (current) to (x1,y1) +void wxGraphicsPathData::AddArcToPoint( wxDouble x1, wxDouble y1 , wxDouble x2, wxDouble y2, wxDouble r ) +{ + wxPoint2DDouble current; + GetCurrentPoint(¤t.m_x,¤t.m_y); + wxPoint2DDouble p1(x1,y1); + wxPoint2DDouble p2(x2,y2); + + wxPoint2DDouble v1 = current - p1; + v1.Normalize(); + wxPoint2DDouble v2 = p2 - p1; + v2.Normalize(); + + wxDouble alpha = v1.GetVectorAngle() - v2.GetVectorAngle(); + + if ( alpha < 0 ) + alpha = 360 + alpha; + // TODO obtuse angles + + alpha = DegToRad(alpha); + + wxDouble dist = r / sin(alpha/2) * cos(alpha/2); + // calculate tangential points + wxPoint2DDouble t1 = dist*v1 + p1; + wxPoint2DDouble t2 = dist*v2 + p1; + + wxPoint2DDouble nv1 = v1; + nv1.SetVectorAngle(v1.GetVectorAngle()-90); + wxPoint2DDouble c = t1 + r*nv1; + + wxDouble a1 = v1.GetVectorAngle()+90; + wxDouble a2 = v2.GetVectorAngle()-90; + + AddLineToPoint(t1.m_x,t1.m_y); + AddArc(c.m_x,c.m_y,r,DegToRad(a1),DegToRad(a2),true); + AddLineToPoint(p2.m_x,p2.m_y); +} + +//----------------------------------------------------------------------------- +// wxGraphicsContext Convenience Methods +//----------------------------------------------------------------------------- + +IMPLEMENT_ABSTRACT_CLASS(wxGraphicsContext, wxObject) + + +wxGraphicsContext::wxGraphicsContext(wxGraphicsRenderer* renderer) : wxGraphicsObject(renderer) +{ + m_logicalFunction = wxCOPY; +} + +wxGraphicsContext::~wxGraphicsContext() +{ +} + +// sets the pen +void wxGraphicsContext::SetPen( const wxGraphicsPen& pen ) +{ + m_pen = pen; +} + +void wxGraphicsContext::SetPen( const wxPen& pen ) +{ + if ( !pen.Ok() || pen.GetStyle() == wxTRANSPARENT ) + SetPen( wxNullGraphicsPen ); + else + SetPen( CreatePen( pen ) ); +} + +// sets the brush for filling +void wxGraphicsContext::SetBrush( const wxGraphicsBrush& brush ) +{ + m_brush = brush; +} + +void wxGraphicsContext::SetBrush( const wxBrush& brush ) +{ + if ( !brush.Ok() || brush.GetStyle() == wxTRANSPARENT ) + SetBrush( wxNullGraphicsBrush ); + else + SetBrush( CreateBrush( brush ) ); +} + +// sets the brush for filling +void wxGraphicsContext::SetFont( const wxGraphicsFont& font ) +{ + m_font = font; +} + +bool wxGraphicsContext::SetLogicalFunction( int function ) +{ + if ( function == wxCOPY ) + { + m_logicalFunction = function; + return true; + } + return false; +} + +void wxGraphicsContext::SetFont( const wxFont& font, const wxColour& colour ) +{ + if ( font.Ok() ) + SetFont( CreateFont( font, colour ) ); + else + SetFont( wxNullGraphicsFont ); +} + +void wxGraphicsContext::DrawPath( const wxGraphicsPath& path, int fillStyle ) +{ + FillPath( path , fillStyle ); + StrokePath( path ); +} + +void wxGraphicsContext::DrawText( const wxString &str, wxDouble x, wxDouble y, wxDouble angle ) +{ + Translate(x,y); + Rotate( -angle ); + DrawText( str , 0, 0 ); + Rotate( angle ); + Translate(-x,-y); +} + +void wxGraphicsContext::DrawText( const wxString &str, wxDouble x, wxDouble y, const wxGraphicsBrush& backgroundBrush ) +{ + wxGraphicsBrush formerBrush = m_brush; + wxGraphicsPen formerPen = m_pen; + wxDouble width; + wxDouble height; + wxDouble descent; + wxDouble externalLeading; + GetTextExtent( str , &width, &height, &descent, &externalLeading ); + SetBrush( backgroundBrush ); + // to make sure our 'OffsetToPixelBoundaries' doesn't move the fill shape + SetPen( wxNullGraphicsPen ); + + wxGraphicsPath path = CreatePath(); + path.AddRectangle( x , y, width, height ); + FillPath( path ); + + DrawText( str, x ,y); + SetBrush( formerBrush ); + SetPen( formerPen ); +} + +void wxGraphicsContext::DrawText( const wxString &str, wxDouble x, wxDouble y, wxDouble angle, const wxGraphicsBrush& backgroundBrush ) +{ + wxGraphicsBrush formerBrush = m_brush; + wxGraphicsPen formerPen = m_pen; + + wxDouble width; + wxDouble height; + wxDouble descent; + wxDouble externalLeading; + GetTextExtent( str , &width, &height, &descent, &externalLeading ); + SetBrush( backgroundBrush ); + // to make sure our 'OffsetToPixelBoundaries' doesn't move the fill shape + SetPen( wxNullGraphicsPen ); + + wxGraphicsPath path = CreatePath(); + path.MoveToPoint( x , y ); + path.AddLineToPoint( (int) (x + sin(angle) * height) , (int) (y + cos(angle) * height) ); + path.AddLineToPoint( + (int) (x + sin(angle) * height + cos(angle) * width) , + (int) (y + cos(angle) * height - sin(angle) * width)); + path.AddLineToPoint((int) (x + cos(angle) * width) , (int) (y - sin(angle) * width) ); + FillPath( path ); + DrawText( str, x ,y, angle); + SetBrush( formerBrush ); + SetPen( formerPen ); +} + +void wxGraphicsContext::StrokeLine( wxDouble x1, wxDouble y1, wxDouble x2, wxDouble y2) +{ + wxGraphicsPath path = CreatePath(); + path.MoveToPoint(x1, y1); + path.AddLineToPoint( x2, y2 ); + StrokePath( path ); +} + +void wxGraphicsContext::DrawRectangle( wxDouble x, wxDouble y, wxDouble w, wxDouble h) +{ + wxGraphicsPath path = CreatePath(); + path.AddRectangle( x , y , w , h ); + DrawPath( path ); +} + +void wxGraphicsContext::DrawEllipse( wxDouble x, wxDouble y, wxDouble w, wxDouble h) +{ + wxGraphicsPath path = CreatePath(); + path.AddEllipse(x,y,w,h); + DrawPath(path); +} + +void wxGraphicsContext::DrawRoundedRectangle( wxDouble x, wxDouble y, wxDouble w, wxDouble h, wxDouble radius) +{ + wxGraphicsPath path = CreatePath(); + path.AddRoundedRectangle(x,y,w,h,radius); + DrawPath(path); +} + +void wxGraphicsContext::StrokeLines( size_t n, const wxPoint2DDouble *points) +{ + wxASSERT(n > 1); + wxGraphicsPath path = CreatePath(); + path.MoveToPoint(points[0].m_x, points[0].m_y); + for ( size_t i = 1; i < n; ++i) + path.AddLineToPoint( points[i].m_x, points[i].m_y ); + StrokePath( path ); +} + +void wxGraphicsContext::DrawLines( size_t n, const wxPoint2DDouble *points, int fillStyle) +{ + wxASSERT(n > 1); + wxGraphicsPath path = CreatePath(); + path.MoveToPoint(points[0].m_x, points[0].m_y); + for ( size_t i = 1; i < n; ++i) + path.AddLineToPoint( points[i].m_x, points[i].m_y ); + DrawPath( path , fillStyle); +} + +void wxGraphicsContext::StrokeLines( size_t n, const wxPoint2DDouble *beginPoints, const wxPoint2DDouble *endPoints) +{ + wxASSERT(n > 0); + wxGraphicsPath path = CreatePath(); + for ( size_t i = 0; i < n; ++i) + { + path.MoveToPoint(beginPoints[i].m_x, beginPoints[i].m_y); + path.AddLineToPoint( endPoints[i].m_x, endPoints[i].m_y ); + } + StrokePath( path ); +} + +// create a 'native' matrix corresponding to these values +wxGraphicsMatrix wxGraphicsContext::CreateMatrix( wxDouble a, wxDouble b, wxDouble c, wxDouble d, + wxDouble tx, wxDouble ty) const +{ + return GetRenderer()->CreateMatrix(a,b,c,d,tx,ty); +} + +wxGraphicsPath wxGraphicsContext::CreatePath() const +{ + return GetRenderer()->CreatePath(); +} + +wxGraphicsPen wxGraphicsContext::CreatePen(const wxPen& pen) const +{ + return GetRenderer()->CreatePen(pen); +} + +wxGraphicsBrush wxGraphicsContext::CreateBrush(const wxBrush& brush ) const +{ + return GetRenderer()->CreateBrush(brush); +} + +// sets the brush to a linear gradient, starting at (x1,y1) with color c1 to (x2,y2) with color c2 +wxGraphicsBrush wxGraphicsContext::CreateLinearGradientBrush( wxDouble x1, wxDouble y1, wxDouble x2, wxDouble y2, + const wxColour&c1, const wxColour&c2) const +{ + return GetRenderer()->CreateLinearGradientBrush(x1,y1,x2,y2,c1,c2); +} + +// sets the brush to a radial gradient originating at (xo,yc) with color oColor and ends on a circle around (xc,yc) +// with radius r and color cColor +wxGraphicsBrush wxGraphicsContext::CreateRadialGradientBrush( wxDouble xo, wxDouble yo, wxDouble xc, wxDouble yc, wxDouble radius, + const wxColour &oColor, const wxColour &cColor) const +{ + return GetRenderer()->CreateRadialGradientBrush(xo,yo,xc,yc,radius,oColor,cColor); +} + +// sets the font +wxGraphicsFont wxGraphicsContext::CreateFont( const wxFont &font , const wxColour &col ) const +{ + return GetRenderer()->CreateFont(font,col); +} + +wxGraphicsContext* wxGraphicsContext::Create( const wxWindowDC& dc) +{ + return wxGraphicsRenderer::GetDefaultRenderer()->CreateContext(dc); +} +#ifdef __WXMSW__ +wxGraphicsContext* wxGraphicsContext::Create( const wxMemoryDC& dc) +{ + return wxGraphicsRenderer::GetDefaultRenderer()->CreateContext(dc); +} +#endif + +wxGraphicsContext* wxGraphicsContext::CreateFromNative( void * context ) +{ + return wxGraphicsRenderer::GetDefaultRenderer()->CreateContextFromNativeContext(context); +} + +wxGraphicsContext* wxGraphicsContext::CreateFromNativeWindow( void * window ) +{ + return wxGraphicsRenderer::GetDefaultRenderer()->CreateContextFromNativeWindow(window); +} + +wxGraphicsContext* wxGraphicsContext::Create( wxWindow* window ) +{ + return wxGraphicsRenderer::GetDefaultRenderer()->CreateContext(window); +} + +wxGraphicsContext* wxGraphicsContext::Create() +{ + return wxGraphicsRenderer::GetDefaultRenderer()->CreateMeasuringContext(); +} + +//----------------------------------------------------------------------------- +// wxGraphicsRenderer +//----------------------------------------------------------------------------- + +IMPLEMENT_ABSTRACT_CLASS(wxGraphicsRenderer, wxObject) + +#endif // wxUSE_GRAPHICS_CONTEXT diff --git a/Externals/wxWidgets/src/common/hash.cpp b/Externals/wxWidgets/src/common/hash.cpp new file mode 100644 index 0000000000..4fb13b4380 --- /dev/null +++ b/Externals/wxWidgets/src/common/hash.cpp @@ -0,0 +1,1077 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/hash.cpp +// Purpose: wxHashTable implementation +// Author: Julian Smart +// Modified by: VZ at 25.02.00: type safe hashes with WX_DECLARE_HASH() +// Created: 01/02/97 +// RCS-ID: $Id: hash.cpp 49529 2007-10-30 00:32:18Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#ifndef WX_PRECOMP + #include "wx/list.h" + #include "wx/hash.h" +#endif + +#if wxUSE_OLD_HASH_TABLE + +#include +#include + +// ---------------------------------------------------------------------------- +// wxWin macros +// ---------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxHashTable, wxObject) + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxHashTablleBase for working with "void *" data +// ---------------------------------------------------------------------------- + +wxHashTableBase::wxHashTableBase() +{ + m_deleteContents = false; + m_hashTable = (wxListBase **)NULL; + m_hashSize = 0; + m_count = 0; + m_keyType = wxKEY_NONE; +} + +void wxHashTableBase::Create(wxKeyType keyType, size_t size) +{ + Destroy(); + + m_hashSize = size; + m_keyType = keyType; + m_hashTable = new wxListBase *[size]; + for ( size_t n = 0; n < m_hashSize; n++ ) + { + m_hashTable[n] = (wxListBase *) NULL; + } +} + +void wxHashTableBase::Destroy() +{ + if ( m_hashTable ) + { + for ( size_t n = 0; n < m_hashSize; n++ ) + { + delete m_hashTable[n]; + } + + delete [] m_hashTable; + + m_hashTable = (wxListBase **)NULL; + + m_count = 0; + } +} + +void wxHashTableBase::DeleteContents(bool flag) +{ + m_deleteContents = flag; + for ( size_t n = 0; n < m_hashSize; n++ ) + { + if ( m_hashTable[n] ) + { + m_hashTable[n]->DeleteContents(flag); + } + } +} + +wxNodeBase *wxHashTableBase::GetNode(long key, long value) const +{ + size_t slot = (size_t)abs((int)(key % (long)m_hashSize)); + + wxNodeBase *node; + if ( m_hashTable[slot] ) + { + node = m_hashTable[slot]->Find(wxListKey(value)); + } + else + { + node = (wxNodeBase *)NULL; + } + + return node; +} + +#if WXWIN_COMPATIBILITY_2_4 + +// ---------------------------------------------------------------------------- +// wxHashTableLong +// ---------------------------------------------------------------------------- + +wxHashTableLong::~wxHashTableLong() +{ + Destroy(); +} + +void wxHashTableLong::Init(size_t size) +{ + m_hashSize = size; + m_values = new wxArrayLong *[size]; + m_keys = new wxArrayLong *[size]; + + for ( size_t n = 0; n < m_hashSize; n++ ) + { + m_values[n] = + m_keys[n] = (wxArrayLong *)NULL; + } + + m_count = 0; +} + +void wxHashTableLong::Create(size_t size) +{ + Init(size); +} + +void wxHashTableLong::Destroy() +{ + for ( size_t n = 0; n < m_hashSize; n++ ) + { + delete m_values[n]; + delete m_keys[n]; + } + + delete [] m_values; + delete [] m_keys; + m_hashSize = 0; + m_count = 0; +} + +void wxHashTableLong::Put(long key, long value) +{ + wxCHECK_RET( m_hashSize, _T("must call Create() first") ); + + size_t slot = (size_t)abs((int)(key % (long)m_hashSize)); + + if ( !m_keys[slot] ) + { + m_keys[slot] = new wxArrayLong; + m_values[slot] = new wxArrayLong; + } + + m_keys[slot]->Add(key); + m_values[slot]->Add(value); + + m_count++; +} + +long wxHashTableLong::Get(long key) const +{ + wxCHECK_MSG( m_hashSize, wxNOT_FOUND, _T("must call Create() first") ); + + size_t slot = (size_t)abs((int)(key % (long)m_hashSize)); + + wxArrayLong *keys = m_keys[slot]; + if ( keys ) + { + size_t count = keys->GetCount(); + for ( size_t n = 0; n < count; n++ ) + { + if ( keys->Item(n) == key ) + { + return m_values[slot]->Item(n); + } + } + } + + return wxNOT_FOUND; +} + +long wxHashTableLong::Delete(long key) +{ + wxCHECK_MSG( m_hashSize, wxNOT_FOUND, _T("must call Create() first") ); + + size_t slot = (size_t)abs((int)(key % (long)m_hashSize)); + + wxArrayLong *keys = m_keys[slot]; + if ( keys ) + { + size_t count = keys->GetCount(); + for ( size_t n = 0; n < count; n++ ) + { + if ( keys->Item(n) == key ) + { + long val = m_values[slot]->Item(n); + + keys->RemoveAt(n); + m_values[slot]->RemoveAt(n); + + m_count--; + + return val; + } + } + } + + return wxNOT_FOUND; +} + +// ---------------------------------------------------------------------------- +// wxStringHashTable: more efficient than storing strings in a list +// ---------------------------------------------------------------------------- + +wxStringHashTable::wxStringHashTable(size_t sizeTable) +{ + m_keys = new wxArrayLong *[sizeTable]; + m_values = new wxArrayString *[sizeTable]; + + m_hashSize = sizeTable; + for ( size_t n = 0; n < m_hashSize; n++ ) + { + m_values[n] = (wxArrayString *)NULL; + m_keys[n] = (wxArrayLong *)NULL; + } +} + +wxStringHashTable::~wxStringHashTable() +{ + Destroy(); +} + +void wxStringHashTable::Destroy() +{ + for ( size_t n = 0; n < m_hashSize; n++ ) + { + delete m_values[n]; + delete m_keys[n]; + } + + delete [] m_values; + delete [] m_keys; + m_hashSize = 0; +} + +void wxStringHashTable::Put(long key, const wxString& value) +{ + wxCHECK_RET( m_hashSize, _T("must call Create() first") ); + + size_t slot = (size_t)abs((int)(key % (long)m_hashSize)); + + if ( !m_keys[slot] ) + { + m_keys[slot] = new wxArrayLong; + m_values[slot] = new wxArrayString; + } + + m_keys[slot]->Add(key); + m_values[slot]->Add(value); +} + +wxString wxStringHashTable::Get(long key, bool *wasFound) const +{ + wxCHECK_MSG( m_hashSize, wxEmptyString, _T("must call Create() first") ); + + size_t slot = (size_t)abs((int)(key % (long)m_hashSize)); + + wxArrayLong *keys = m_keys[slot]; + if ( keys ) + { + size_t count = keys->GetCount(); + for ( size_t n = 0; n < count; n++ ) + { + if ( keys->Item(n) == key ) + { + if ( wasFound ) + *wasFound = true; + + return m_values[slot]->Item(n); + } + } + } + + if ( wasFound ) + *wasFound = false; + + return wxEmptyString; +} + +bool wxStringHashTable::Delete(long key) const +{ + wxCHECK_MSG( m_hashSize, false, _T("must call Create() first") ); + + size_t slot = (size_t)abs((int)(key % (long)m_hashSize)); + + wxArrayLong *keys = m_keys[slot]; + if ( keys ) + { + size_t count = keys->GetCount(); + for ( size_t n = 0; n < count; n++ ) + { + if ( keys->Item(n) == key ) + { + keys->RemoveAt(n); + m_values[slot]->RemoveAt(n); + return true; + } + } + } + + return false; +} + +#endif // WXWIN_COMPATIBILITY_2_4 + +// ---------------------------------------------------------------------------- +// old not type safe wxHashTable +// ---------------------------------------------------------------------------- + +wxHashTable::wxHashTable (int the_key_type, int size) +{ + n = 0; + hash_table = (wxList**) NULL; + Create(the_key_type, size); + m_count = 0; + m_deleteContents = false; +/* + n = size; + current_position = -1; + current_node = (wxNode *) NULL; + + key_type = the_key_type; + hash_table = new wxList *[size]; + int i; + for (i = 0; i < size; i++) + hash_table[i] = (wxList *) NULL; +*/ +} + +wxHashTable::~wxHashTable () +{ + Destroy(); +} + +void wxHashTable::Destroy() +{ + if (!hash_table) return; + int i; + for (i = 0; i < n; i++) + if (hash_table[i]) + delete hash_table[i]; + delete[] hash_table; + hash_table = NULL; +} + +bool wxHashTable::Create(int the_key_type, int size) +{ + Destroy(); + + n = size; + current_position = -1; + current_node = (wxNode *) NULL; + + key_type = the_key_type; + hash_table = new wxList *[size]; + int i; + for (i = 0; i < size; i++) + hash_table[i] = (wxList *) NULL; + return true; +} + + +void wxHashTable::DoCopy(const wxHashTable& table) +{ + n = table.n; + m_count = table.m_count; + current_position = table.current_position; + current_node = NULL; // doesn't matter - Next() will reconstruct it + key_type = table.key_type; + + hash_table = new wxList *[n]; + for (int i = 0; i < n; i++) { + if (table.hash_table[i] == NULL) + hash_table[i] = NULL; + else { + hash_table[i] = new wxList(key_type); + *hash_table[i] = *(table.hash_table[i]); + } + } +} + +void wxHashTable::Put (long key, long value, wxObject * object) +{ + // Should NEVER be + long k = (long) key; + + int position = (int) (k % n); + if (position < 0) position = -position; + + if (!hash_table[position]) + { + hash_table[position] = new wxList (wxKEY_INTEGER); + if (m_deleteContents) hash_table[position]->DeleteContents(true); + } + + hash_table[position]->Append (value, object); + m_count++; +} + +void wxHashTable::Put (long key, const wxChar *value, wxObject * object) +{ + // Should NEVER be + long k = (long) key; + + int position = (int) (k % n); + if (position < 0) position = -position; + + if (!hash_table[position]) + { + hash_table[position] = new wxList (wxKEY_STRING); + if (m_deleteContents) hash_table[position]->DeleteContents(true); + } + + hash_table[position]->Append (value, object); + m_count++; +} + +void wxHashTable::Put (long key, wxObject * object) +{ + // Should NEVER be + long k = (long) key; + + int position = (int) (k % n); + if (position < 0) position = -position; + + if (!hash_table[position]) + { + hash_table[position] = new wxList (wxKEY_INTEGER); + if (m_deleteContents) hash_table[position]->DeleteContents(true); + } + + hash_table[position]->Append (k, object); + m_count++; +} + +void wxHashTable::Put (const wxChar *key, wxObject * object) +{ + int position = (int) (MakeKey (key) % n); + if (position < 0) position = -position; + + if (!hash_table[position]) + { + hash_table[position] = new wxList (wxKEY_STRING); + if (m_deleteContents) hash_table[position]->DeleteContents(true); + } + + hash_table[position]->Append (key, object); + m_count++; +} + +wxObject *wxHashTable::Get (long key, long value) const +{ + // Should NEVER be + long k = (long) key; + + int position = (int) (k % n); + if (position < 0) position = -position; + + if (!hash_table[position]) + return (wxObject *) NULL; + else + { + wxNode *node = hash_table[position]->Find (value); + if (node) + return node->GetData (); + else + return (wxObject *) NULL; + } +} + +wxObject *wxHashTable::Get (long key, const wxChar *value) const +{ + // Should NEVER be + long k = (long) key; + + int position = (int) (k % n); + if (position < 0) position = -position; + + if (!hash_table[position]) + return (wxObject *) NULL; + else + { + wxNode *node = hash_table[position]->Find (value); + if (node) + return node->GetData (); + else + return (wxObject *) NULL; + } +} + +wxObject *wxHashTable::Get (long key) const +{ + // Should NEVER be + long k = (long) key; + + int position = (int) (k % n); + if (position < 0) position = -position; + + if (!hash_table[position]) + return (wxObject *) NULL; + else + { + wxNode *node = hash_table[position]->Find (k); + return node ? node->GetData () : (wxObject*)NULL; + } +} + +wxObject *wxHashTable::Get (const wxChar *key) const +{ + int position = (int) (MakeKey (key) % n); + if (position < 0) position = -position; + + if (!hash_table[position]) + return (wxObject *) NULL; + else + { + wxNode *node = hash_table[position]->Find (key); + return node ? node->GetData () : (wxObject*)NULL; + } +} + +wxObject *wxHashTable::Delete (long key) +{ + // Should NEVER be + long k = (long) key; + + int position = (int) (k % n); + if (position < 0) position = -position; + + if (!hash_table[position]) + return (wxObject *) NULL; + else + { + wxNode *node = hash_table[position]->Find (k); + if (node) + { + wxObject *data = node->GetData (); + delete node; + m_count--; + return data; + } + else + return (wxObject *) NULL; + } +} + +wxObject *wxHashTable::Delete (const wxChar *key) +{ + int position = (int) (MakeKey (key) % n); + if (position < 0) position = -position; + + if (!hash_table[position]) + return (wxObject *) NULL; + else + { + wxNode *node = hash_table[position]->Find (key); + if (node) + { + wxObject *data = node->GetData (); + delete node; + m_count--; + return data; + } + else + return (wxObject *) NULL; + } +} + +wxObject *wxHashTable::Delete (long key, int value) +{ + // Should NEVER be + long k = (long) key; + + int position = (int) (k % n); + if (position < 0) position = -position; + + if (!hash_table[position]) + return (wxObject *) NULL; + else + { + wxNode *node = hash_table[position]->Find (value); + if (node) + { + wxObject *data = node->GetData (); + delete node; + m_count--; + return data; + } + else + return (wxObject *) NULL; + } +} + +wxObject *wxHashTable::Delete (long key, const wxChar *value) +{ + int position = (int) (key % n); + if (position < 0) position = -position; + + if (!hash_table[position]) + return (wxObject *) NULL; + else + { + wxNode *node = hash_table[position]->Find (value); + if (node) + { + wxObject *data = node->GetData (); + delete node; + m_count--; + return data; + } + else + return (wxObject *) NULL; + } +} + +long wxHashTable::MakeKey (const wxChar *string) const +{ + long int_key = 0; + + while (*string) + int_key += (wxUChar) *string++; + + return int_key; +} + +void wxHashTable::BeginFind () +{ + current_position = -1; + current_node = (wxNode *) NULL; +} + +wxHashTable::Node* wxHashTable::Next () +{ + wxNode *found = (wxNode *) NULL; + bool end = false; + while (!end && !found) + { + if (!current_node) + { + current_position++; + if (current_position >= n) + { + current_position = -1; + current_node = (wxNode *) NULL; + end = true; + } + else + { + if (hash_table[current_position]) + { + current_node = hash_table[current_position]->GetFirst (); + found = current_node; + } + } + } + else + { + current_node = current_node->GetNext (); + found = current_node; + } + } + return found; +} + +void wxHashTable::DeleteContents (bool flag) +{ + int i; + m_deleteContents = flag; + for (i = 0; i < n; i++) + { + if (hash_table[i]) + hash_table[i]->DeleteContents (flag); + } +} + +void wxHashTable::Clear () +{ + int i; + if (hash_table) + { + for (i = 0; i < n; i++) + { + if (hash_table[i]) + hash_table[i]->Clear (); + } + } + m_count = 0; +} + +#else // if !wxUSE_OLD_HASH_TABLE + +wxHashTableBase_Node::wxHashTableBase_Node( long key, void* value, + wxHashTableBase* table ) + : m_value( value ), m_hashPtr( table ) +{ + m_key.integer = key; +} + +wxHashTableBase_Node::wxHashTableBase_Node( const wxChar* key, void* value, + wxHashTableBase* table ) + : m_value( value ), m_hashPtr( table ) +{ + m_key.string = wxStrcpy( new wxChar[wxStrlen( key ) + 1], key ); +} + +wxHashTableBase_Node::~wxHashTableBase_Node() +{ + if( m_hashPtr ) m_hashPtr->DoRemoveNode( this ); +} + +// + +wxHashTableBase::wxHashTableBase() + : m_size( 0 ), m_count( 0 ), m_table( NULL ), m_keyType( wxKEY_NONE ), + m_deleteContents( false ) +{ +} + +void wxHashTableBase::Create( wxKeyType keyType, size_t size ) +{ + m_keyType = keyType; + m_size = size; + m_table = new wxHashTableBase_Node*[ m_size ]; + + for( size_t i = 0; i < m_size; ++i ) + m_table[i] = NULL; +} + +void wxHashTableBase::Clear() +{ + for( size_t i = 0; i < m_size; ++i ) + { + Node* end = m_table[i]; + + if( end == NULL ) + continue; + + Node *curr, *next = end->GetNext(); + + do + { + curr = next; + next = curr->GetNext(); + + DoDestroyNode( curr ); + + delete curr; + } + while( curr != end ); + + m_table[i] = NULL; + } + + m_count = 0; +} + +void wxHashTableBase::DoRemoveNode( wxHashTableBase_Node* node ) +{ + size_t bucket = ( m_keyType == wxKEY_INTEGER ? + node->m_key.integer : + MakeKey( node->m_key.string ) ) % m_size; + + if( node->GetNext() == node ) + { + // single-node chain (common case) + m_table[bucket] = NULL; + } + else + { + Node *start = m_table[bucket], *curr; + Node* prev = start; + + for( curr = prev->GetNext(); curr != node; + prev = curr, curr = curr->GetNext() ) ; + + DoUnlinkNode( bucket, node, prev ); + } + + DoDestroyNode( node ); +} + +void wxHashTableBase::DoDestroyNode( wxHashTableBase_Node* node ) +{ + // if it is called from DoRemoveNode, node has already been + // removed, from other places it does not matter + node->m_hashPtr = NULL; + + if( m_keyType == wxKEY_STRING ) + delete[] node->m_key.string; + if( m_deleteContents ) + DoDeleteContents( node ); +} + +void wxHashTableBase::Destroy() +{ + Clear(); + + delete[] m_table; + + m_table = NULL; + m_size = 0; +} + +void wxHashTableBase::DoInsertNode( size_t bucket, wxHashTableBase_Node* node ) +{ + if( m_table[bucket] == NULL ) + { + m_table[bucket] = node->m_next = node; + } + else + { + Node *prev = m_table[bucket]; + Node *next = prev->m_next; + + prev->m_next = node; + node->m_next = next; + m_table[bucket] = node; + } + + ++m_count; +} + +void wxHashTableBase::DoPut( long key, long hash, void* data ) +{ + wxASSERT( m_keyType == wxKEY_INTEGER ); + + size_t bucket = size_t(hash) % m_size; + Node* node = new wxHashTableBase_Node( key, data, this ); + + DoInsertNode( bucket, node ); +} + +void wxHashTableBase::DoPut( const wxChar* key, long hash, void* data ) +{ + wxASSERT( m_keyType == wxKEY_STRING ); + + size_t bucket = size_t(hash) % m_size; + Node* node = new wxHashTableBase_Node( key, data, this ); + + DoInsertNode( bucket, node ); +} + +void* wxHashTableBase::DoGet( long key, long hash ) const +{ + wxASSERT( m_keyType == wxKEY_INTEGER ); + + size_t bucket = size_t(hash) % m_size; + + if( m_table[bucket] == NULL ) + return NULL; + + Node *first = m_table[bucket]->GetNext(), + *curr = first; + + do + { + if( curr->m_key.integer == key ) + return curr->m_value; + + curr = curr->GetNext(); + } + while( curr != first ); + + return NULL; +} + +void* wxHashTableBase::DoGet( const wxChar* key, long hash ) const +{ + wxASSERT( m_keyType == wxKEY_STRING ); + + size_t bucket = size_t(hash) % m_size; + + if( m_table[bucket] == NULL ) + return NULL; + + Node *first = m_table[bucket]->GetNext(), + *curr = first; + + do + { + if( wxStrcmp( curr->m_key.string, key ) == 0 ) + return curr->m_value; + + curr = curr->GetNext(); + } + while( curr != first ); + + return NULL; +} + +void wxHashTableBase::DoUnlinkNode( size_t bucket, wxHashTableBase_Node* node, + wxHashTableBase_Node* prev ) +{ + if( node == m_table[bucket] ) + m_table[bucket] = prev; + + if( prev == node && prev == node->GetNext() ) + m_table[bucket] = NULL; + else + prev->m_next = node->m_next; + + DoDestroyNode( node ); + --m_count; +} + +void* wxHashTableBase::DoDelete( long key, long hash ) +{ + wxASSERT( m_keyType == wxKEY_INTEGER ); + + size_t bucket = size_t(hash) % m_size; + + if( m_table[bucket] == NULL ) + return NULL; + + Node *first = m_table[bucket]->GetNext(), + *curr = first, + *prev = m_table[bucket]; + + do + { + if( curr->m_key.integer == key ) + { + void* retval = curr->m_value; + curr->m_value = NULL; + + DoUnlinkNode( bucket, curr, prev ); + delete curr; + + return retval; + } + + prev = curr; + curr = curr->GetNext(); + } + while( curr != first ); + + return NULL; +} + +void* wxHashTableBase::DoDelete( const wxChar* key, long hash ) +{ + wxASSERT( m_keyType == wxKEY_STRING ); + + size_t bucket = size_t(hash) % m_size; + + if( m_table[bucket] == NULL ) + return NULL; + + Node *first = m_table[bucket]->GetNext(), + *curr = first, + *prev = m_table[bucket]; + + do + { + if( wxStrcmp( curr->m_key.string, key ) == 0 ) + { + void* retval = curr->m_value; + curr->m_value = NULL; + + DoUnlinkNode( bucket, curr, prev ); + delete curr; + + return retval; + } + + prev = curr; + curr = curr->GetNext(); + } + while( curr != first ); + + return NULL; +} + +long wxHashTableBase::MakeKey( const wxChar *str ) +{ + long int_key = 0; + + while( *str ) + int_key += (wxUChar)*str++; + + return int_key; +} + +// ---------------------------------------------------------------------------- +// wxHashTable +// ---------------------------------------------------------------------------- + +wxHashTable::wxHashTable( const wxHashTable& table ) + : wxHashTableBase() +{ + DoCopy( table ); +} + +const wxHashTable& wxHashTable::operator=( const wxHashTable& table ) +{ + Destroy(); + DoCopy( table ); + + return *this; +} + +void wxHashTable::DoCopy( const wxHashTable& WXUNUSED(table) ) +{ + Create( m_keyType, m_size ); + + wxFAIL; +} + +void wxHashTable::DoDeleteContents( wxHashTableBase_Node* node ) +{ + delete ((wxHashTable_Node*)node)->GetData(); +} + +void wxHashTable::GetNextNode( size_t bucketStart ) +{ + for( size_t i = bucketStart; i < m_size; ++i ) + { + if( m_table[i] != NULL ) + { + m_curr = ((Node*)m_table[i])->GetNext(); + m_currBucket = i; + return; + } + } + + m_curr = NULL; + m_currBucket = 0; +} + +wxHashTable::Node* wxHashTable::Next() +{ + if( m_curr == NULL ) + GetNextNode( 0 ); + else + { + m_curr = m_curr->GetNext(); + + if( m_curr == ( (Node*)m_table[m_currBucket] )->GetNext() ) + GetNextNode( m_currBucket + 1 ); + } + + return m_curr; +} + +#endif // !wxUSE_OLD_HASH_TABLE diff --git a/Externals/wxWidgets/src/common/hashmap.cpp b/Externals/wxWidgets/src/common/hashmap.cpp new file mode 100644 index 0000000000..c3fba8dfc2 --- /dev/null +++ b/Externals/wxWidgets/src/common/hashmap.cpp @@ -0,0 +1,152 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/hashmap.cpp +// Purpose: wxHashMap implementation +// Author: Mattia Barbon +// Modified by: +// Created: 29/01/2002 +// RCS-ID: $Id: hashmap.cpp 39802 2006-06-20 10:24:07Z ABX $ +// Copyright: (c) Mattia Barbon +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#include "wx/hashmap.h" + +/* FYI: This is the "One-at-a-Time" algorithm by Bob Jenkins */ +/* from requirements by Colin Plumb. */ +/* (http://burtleburtle.net/bob/hash/doobs.html) */ +/* adapted from Perl sources ( hv.h ) */ +unsigned long wxStringHash::wxCharStringHash( const wxChar* k ) +{ + unsigned long hash = 0; + + while( *k ) + { + hash += *k++; + hash += (hash << 10); + hash ^= (hash >> 6); + } + hash += (hash << 3); + hash ^= (hash >> 11); + + return hash + (hash << 15); +} + +#if wxUSE_UNICODE +unsigned long wxStringHash::charStringHash( const char* k ) +{ + unsigned long hash = 0; + + while( *k ) + { + hash += *k++; + hash += (hash << 10); + hash ^= (hash >> 6); + } + hash += (hash << 3); + hash ^= (hash >> 11); + + return hash + (hash << 15); +} +#endif + +#if !wxUSE_STL || !defined(HAVE_STL_HASH_MAP) + +/* from SGI STL */ +const unsigned long _wxHashTableBase2::ms_primes[prime_count] = +{ + 7ul, 13ul, 29ul, + 53ul, 97ul, 193ul, 389ul, 769ul, + 1543ul, 3079ul, 6151ul, 12289ul, 24593ul, + 49157ul, 98317ul, 196613ul, 393241ul, 786433ul, + 1572869ul, 3145739ul, 6291469ul, 12582917ul, 25165843ul, + 50331653ul, 100663319ul, 201326611ul, 402653189ul, 805306457ul, + 1610612741ul, 3221225473ul, 4294967291ul +}; + +unsigned long _wxHashTableBase2::GetNextPrime( unsigned long n ) +{ + const unsigned long* ptr = &ms_primes[0]; + for( size_t i = 0; i < prime_count; ++i, ++ptr ) + { + if( n < *ptr ) + return *ptr; + } + + /* someone might try to alloc a 2^32-element hash table */ + wxFAIL_MSG( _T("hash table too big?") ); + + /* quiet warning */ + return 0; +} + +unsigned long _wxHashTableBase2::GetPreviousPrime( unsigned long n ) +{ + const unsigned long* ptr = &ms_primes[prime_count - 1]; + + for( size_t i = 0; i < prime_count; ++i, --ptr ) + { + if( n > *ptr ) + return *ptr; + } + + /* quiet warning */ + return 1; +} + +void _wxHashTableBase2::DeleteNodes( size_t buckets, + _wxHashTable_NodeBase** table, + NodeDtor dtor ) +{ + size_t i; + + for( i = 0; i < buckets; ++i ) + { + _wxHashTable_NodeBase* node = table[i]; + _wxHashTable_NodeBase* tmp; + + while( node ) + { + tmp = node->m_nxt; + dtor( node ); + node = tmp; + } + } + + memset( table, 0, buckets * sizeof(void*) ); +} + +void _wxHashTableBase2::CopyHashTable( _wxHashTable_NodeBase** srcTable, + size_t srcBuckets, + _wxHashTableBase2* dst, + _wxHashTable_NodeBase** dstTable, + BucketFromNode func, ProcessNode proc ) +{ + for( size_t i = 0; i < srcBuckets; ++i ) + { + _wxHashTable_NodeBase* nextnode; + + for( _wxHashTable_NodeBase* node = srcTable[i]; node; node = nextnode ) + { + size_t bucket = func( dst, node ); + + nextnode = node->m_nxt; + _wxHashTable_NodeBase* newnode = proc( node ); + newnode->m_nxt = dstTable[bucket]; + dstTable[bucket] = newnode; + } + } +} + +_wxHashTable_NodeBase* _wxHashTableBase2::DummyProcessNode(_wxHashTable_NodeBase* node) +{ + return node; +} + +#endif // !wxUSE_STL || !defined(HAVE_STL_HASH_MAP) diff --git a/Externals/wxWidgets/src/common/helpbase.cpp b/Externals/wxWidgets/src/common/helpbase.cpp new file mode 100644 index 0000000000..b1f95e2def --- /dev/null +++ b/Externals/wxWidgets/src/common/helpbase.cpp @@ -0,0 +1,28 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/helpbase.cpp +// Purpose: Help system base classes +// Author: Julian Smart +// Modified by: +// Created: 04/01/98 +// RCS-ID: $Id: helpbase.cpp 38787 2006-04-18 07:24:35Z ABX $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_HELP + +#ifndef WX_PRECOMP +#endif + +#include "wx/helpbase.h" + +IMPLEMENT_CLASS(wxHelpControllerBase, wxObject) + +#endif // wxUSE_HELP diff --git a/Externals/wxWidgets/src/common/http.cpp b/Externals/wxWidgets/src/common/http.cpp new file mode 100644 index 0000000000..f5bceedde8 --- /dev/null +++ b/Externals/wxWidgets/src/common/http.cpp @@ -0,0 +1,422 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/http.cpp +// Purpose: HTTP protocol +// Author: Guilhem Lavaux +// Modified by: Simo Virokannas (authentication, Dec 2005) +// Created: August 1997 +// RCS-ID: $Id: http.cpp 44660 2007-03-07 23:07:17Z VZ $ +// Copyright: (c) 1997, 1998 Guilhem Lavaux +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_PROTOCOL_HTTP + +#include +#include + +#ifndef WX_PRECOMP + #include "wx/string.h" + #include "wx/app.h" +#endif + +#include "wx/tokenzr.h" +#include "wx/socket.h" +#include "wx/protocol/protocol.h" +#include "wx/url.h" +#include "wx/protocol/http.h" +#include "wx/sckstrm.h" + +IMPLEMENT_DYNAMIC_CLASS(wxHTTP, wxProtocol) +IMPLEMENT_PROTOCOL(wxHTTP, wxT("http"), wxT("80"), true) + +wxHTTP::wxHTTP() + : wxProtocol() +{ + m_addr = NULL; + m_read = false; + m_proxy_mode = false; + m_post_buf = wxEmptyString; + m_http_response = 0; + + SetNotify(wxSOCKET_LOST_FLAG); +} + +wxHTTP::~wxHTTP() +{ + ClearHeaders(); + + delete m_addr; +} + +void wxHTTP::ClearHeaders() +{ + m_headers.clear(); +} + +wxString wxHTTP::GetContentType() +{ + return GetHeader(wxT("Content-Type")); +} + +void wxHTTP::SetProxyMode(bool on) +{ + m_proxy_mode = on; +} + +wxHTTP::wxHeaderIterator wxHTTP::FindHeader(const wxString& header) +{ + wxHeaderIterator it = m_headers.begin(); + for ( wxHeaderIterator en = m_headers.end(); it != en; ++it ) + { + if ( wxStricmp(it->first, header) == 0 ) + break; + } + + return it; +} + +wxHTTP::wxHeaderConstIterator wxHTTP::FindHeader(const wxString& header) const +{ + wxHeaderConstIterator it = m_headers.begin(); + for ( wxHeaderConstIterator en = m_headers.end(); it != en; ++it ) + { + if ( wxStricmp(it->first, header) == 0 ) + break; + } + + return it; +} + +void wxHTTP::SetHeader(const wxString& header, const wxString& h_data) +{ + if (m_read) { + ClearHeaders(); + m_read = false; + } + + wxHeaderIterator it = FindHeader(header); + if (it != m_headers.end()) + it->second = h_data; + else + m_headers[header] = h_data; +} + +wxString wxHTTP::GetHeader(const wxString& header) const +{ + wxHeaderConstIterator it = FindHeader(header); + + return it == m_headers.end() ? wxGetEmptyString() : it->second; +} + +wxString wxHTTP::GenerateAuthString(const wxString& user, const wxString& pass) const +{ + static const char *base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + + wxString buf; + wxString toencode; + + buf.Printf(wxT("Basic ")); + + toencode.Printf(wxT("%s:%s"),user.c_str(),pass.c_str()); + + size_t len = toencode.length(); + const wxChar *from = toencode.c_str(); + while (len >= 3) { // encode full blocks first + buf << wxString::Format(wxT("%c%c"), base64[(from[0] >> 2) & 0x3f], base64[((from[0] << 4) & 0x30) | ((from[1] >> 4) & 0xf)]); + buf << wxString::Format(wxT("%c%c"), base64[((from[1] << 2) & 0x3c) | ((from[2] >> 6) & 0x3)], base64[from[2] & 0x3f]); + from += 3; + len -= 3; + } + if (len > 0) { // pad the remaining characters + buf << wxString::Format(wxT("%c"), base64[(from[0] >> 2) & 0x3f]); + if (len == 1) { + buf << wxString::Format(wxT("%c="), base64[(from[0] << 4) & 0x30]); + } else { + buf << wxString::Format(wxT("%c%c"), base64[((from[0] << 4) & 0x30) | ((from[1] >> 4) & 0xf)], base64[(from[1] << 2) & 0x3c]); + } + buf << wxString::Format(wxT("=")); + } + + return buf; +} + +void wxHTTP::SetPostBuffer(const wxString& post_buf) +{ + m_post_buf = post_buf; +} + +void wxHTTP::SendHeaders() +{ + typedef wxStringToStringHashMap::iterator iterator; + wxString buf; + + for (iterator it = m_headers.begin(), en = m_headers.end(); it != en; ++it ) + { + buf.Printf(wxT("%s: %s\r\n"), it->first.c_str(), it->second.c_str()); + + const wxWX2MBbuf cbuf = buf.mb_str(); + Write(cbuf, strlen(cbuf)); + } +} + +bool wxHTTP::ParseHeaders() +{ + wxString line; + wxStringTokenizer tokenzr; + + ClearHeaders(); + m_read = true; + + for ( ;; ) + { + m_perr = ReadLine(this, line); + if (m_perr != wxPROTO_NOERR) + return false; + + if (line.length() == 0) + break; + + wxString left_str = line.BeforeFirst(':'); + m_headers[left_str] = line.AfterFirst(':').Strip(wxString::both); + } + return true; +} + +bool wxHTTP::Connect(const wxString& host, unsigned short port) +{ + wxIPV4address *addr; + + if (m_addr) { + delete m_addr; + m_addr = NULL; + Close(); + } + + m_addr = addr = new wxIPV4address(); + + if (!addr->Hostname(host)) { + delete m_addr; + m_addr = NULL; + m_perr = wxPROTO_NETERR; + return false; + } + + if ( port ) + addr->Service(port); + else if (!addr->Service(wxT("http"))) + addr->Service(80); + + SetHeader(wxT("Host"), host); + + return true; +} + +bool wxHTTP::Connect(wxSockAddress& addr, bool WXUNUSED(wait)) +{ + if (m_addr) { + delete m_addr; + Close(); + } + + m_addr = addr.Clone(); + + wxIPV4address *ipv4addr = wxDynamicCast(&addr, wxIPV4address); + if (ipv4addr) + SetHeader(wxT("Host"), ipv4addr->OrigHostname()); + + return true; +} + +bool wxHTTP::BuildRequest(const wxString& path, wxHTTP_Req req) +{ + const wxChar *request; + + switch (req) + { + case wxHTTP_GET: + request = wxT("GET"); + break; + + case wxHTTP_POST: + request = wxT("POST"); + if ( GetHeader( wxT("Content-Length") ).IsNull() ) + SetHeader( wxT("Content-Length"), wxString::Format( wxT("%lu"), (unsigned long)m_post_buf.Len() ) ); + break; + + default: + return false; + } + + m_http_response = 0; + + // If there is no User-Agent defined, define it. + if (GetHeader(wxT("User-Agent")).IsNull()) + SetHeader(wxT("User-Agent"), wxT("wxWidgets 2.x")); + + // Send authentication information + if (!m_username.empty() || !m_password.empty()) { + SetHeader(wxT("Authorization"), GenerateAuthString(m_username, m_password)); + } + + SaveState(); + + // we may use non blocking sockets only if we can dispatch events from them + SetFlags( wxIsMainThread() && wxApp::IsMainLoopRunning() ? wxSOCKET_NONE + : wxSOCKET_BLOCK ); + Notify(false); + + wxString buf; + buf.Printf(wxT("%s %s HTTP/1.0\r\n"), request, path.c_str()); + const wxWX2MBbuf pathbuf = wxConvLocal.cWX2MB(buf); + Write(pathbuf, strlen(wxMBSTRINGCAST pathbuf)); + SendHeaders(); + Write("\r\n", 2); + + if ( req == wxHTTP_POST ) { + Write(m_post_buf.mbc_str(), m_post_buf.Len()); + m_post_buf = wxEmptyString; + } + + wxString tmp_str; + m_perr = ReadLine(this, tmp_str); + if (m_perr != wxPROTO_NOERR) { + RestoreState(); + return false; + } + + if (!tmp_str.Contains(wxT("HTTP/"))) { + // TODO: support HTTP v0.9 which can have no header. + // FIXME: tmp_str is not put back in the in-queue of the socket. + SetHeader(wxT("Content-Length"), wxT("-1")); + SetHeader(wxT("Content-Type"), wxT("none/none")); + RestoreState(); + return true; + } + + wxStringTokenizer token(tmp_str,wxT(' ')); + wxString tmp_str2; + bool ret_value; + + token.NextToken(); + tmp_str2 = token.NextToken(); + + m_http_response = wxAtoi(tmp_str2); + + switch (tmp_str2[0u]) + { + case wxT('1'): + /* INFORMATION / SUCCESS */ + break; + + case wxT('2'): + /* SUCCESS */ + break; + + case wxT('3'): + /* REDIRECTION */ + break; + + default: + m_perr = wxPROTO_NOFILE; + RestoreState(); + return false; + } + + ret_value = ParseHeaders(); + RestoreState(); + return ret_value; +} + +class wxHTTPStream : public wxSocketInputStream +{ +public: + wxHTTP *m_http; + size_t m_httpsize; + unsigned long m_read_bytes; + + wxHTTPStream(wxHTTP *http) : wxSocketInputStream(*http), m_http(http) {} + size_t GetSize() const { return m_httpsize; } + virtual ~wxHTTPStream(void) { m_http->Abort(); } + +protected: + size_t OnSysRead(void *buffer, size_t bufsize); + + DECLARE_NO_COPY_CLASS(wxHTTPStream) +}; + +size_t wxHTTPStream::OnSysRead(void *buffer, size_t bufsize) +{ + if (m_httpsize > 0 && m_read_bytes >= m_httpsize) + { + m_lasterror = wxSTREAM_EOF; + return 0; + } + + size_t ret = wxSocketInputStream::OnSysRead(buffer, bufsize); + m_read_bytes += ret; + + if (m_httpsize==(size_t)-1 && m_lasterror == wxSTREAM_READ_ERROR ) + { + // if m_httpsize is (size_t) -1 this means read until connection closed + // which is equivalent to getting a READ_ERROR, for clients however this + // must be translated into EOF, as it is the expected way of signalling + // end end of the content + m_lasterror = wxSTREAM_EOF ; + } + + return ret; +} + +bool wxHTTP::Abort(void) +{ + return wxSocketClient::Close(); +} + +wxInputStream *wxHTTP::GetInputStream(const wxString& path) +{ + wxHTTPStream *inp_stream; + + wxString new_path; + + m_perr = wxPROTO_CONNERR; + if (!m_addr) + return NULL; + + // We set m_connected back to false so wxSocketBase will know what to do. +#ifdef __WXMAC__ + wxSocketClient::Connect(*m_addr , false ); + wxSocketClient::WaitOnConnect(10); + + if (!wxSocketClient::IsConnected()) + return NULL; +#else + if (!wxProtocol::Connect(*m_addr)) + return NULL; +#endif + + if (!BuildRequest(path, m_post_buf.empty() ? wxHTTP_GET : wxHTTP_POST)) + return NULL; + + inp_stream = new wxHTTPStream(this); + + if (!GetHeader(wxT("Content-Length")).empty()) + inp_stream->m_httpsize = wxAtoi(WXSTRINGCAST GetHeader(wxT("Content-Length"))); + else + inp_stream->m_httpsize = (size_t)-1; + + inp_stream->m_read_bytes = 0; + + Notify(false); + SetFlags(wxSOCKET_BLOCK | wxSOCKET_WAITALL); + + return inp_stream; +} + +#endif // wxUSE_PROTOCOL_HTTP diff --git a/Externals/wxWidgets/src/common/iconbndl.cpp b/Externals/wxWidgets/src/common/iconbndl.cpp new file mode 100644 index 0000000000..56ccc004b8 --- /dev/null +++ b/Externals/wxWidgets/src/common/iconbndl.cpp @@ -0,0 +1,142 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/iconbndl.cpp +// Purpose: wxIconBundle +// Author: Mattia Barbon +// Created: 23.03.2002 +// RCS-ID: $Id: iconbndl.cpp 40654 2006-08-17 16:08:13Z VS $ +// Copyright: (c) Mattia barbon +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#include "wx/iconbndl.h" + +#ifndef WX_PRECOMP + #include "wx/settings.h" + #include "wx/icon.h" + #include "wx/log.h" + #include "wx/intl.h" + #include "wx/bitmap.h" + #include "wx/image.h" +#endif + +#include "wx/arrimpl.cpp" + +WX_DEFINE_OBJARRAY(wxIconArray) + +const wxIconBundle& wxIconBundle::operator =( const wxIconBundle& ic ) +{ + if( this == &ic ) return *this; + + size_t i, max = ic.m_icons.GetCount(); + + DeleteIcons(); + for( i = 0; i < max; ++i ) + m_icons.Add( ic.m_icons[i] ); + + return *this; +} + +void wxIconBundle::DeleteIcons() +{ + m_icons.Empty(); +} + +#if wxUSE_IMAGE +void wxIconBundle::AddIcon( const wxString& file, long type ) +#else +void wxIconBundle::AddIcon( const wxString& WXUNUSED(file), long WXUNUSED(type) ) +#endif +{ +#if wxUSE_IMAGE && (!defined(__WXMSW__) || wxUSE_WXDIB) + size_t count = wxImage::GetImageCount( file, type ); + size_t i; + wxImage image; + + for( i = 0; i < count; ++i ) + { + if( !image.LoadFile( file, type, i ) ) + { + wxLogError( _("Failed to load image %d from file '%s'."), + i, file.c_str() ); + continue; + } + + wxIcon* tmp = new wxIcon(); + tmp->CopyFromBitmap( wxBitmap( image ) ); + AddIcon( *tmp ); + delete tmp; + } +#endif +} + +const wxIcon& wxIconBundle::GetIcon( const wxSize& size ) const +{ + // temp. variable needed to fix Borland C++ 5.5.1 problem + // with passing a return value through two functions + wxIcon *tmp; + + size_t max = m_icons.GetCount(); + + // if we have one or no icon, we can return now without doing more work: + if ( max <= 1 ) + { + if ( max == 1 ) // fix for broken BCC + tmp = &m_icons[0]; + else // max == 0 + tmp = &wxNullIcon; + return *tmp; + } + + // there are more icons, find the best match: + wxCoord sysX = wxSystemSettings::GetMetric( wxSYS_ICON_X ), + sysY = wxSystemSettings::GetMetric( wxSYS_ICON_Y ); + + wxIcon *sysIcon = 0; + + for( size_t i = 0; i < max; i++ ) + { + if( !m_icons[i].Ok() ) + continue; + wxCoord sx = m_icons[i].GetWidth(), sy = m_icons[i].GetHeight(); + // requested size + if( sx == size.x && sy == size.y ) + { + tmp = &m_icons[i]; // fix for broken BCC + return *tmp; + } + // keep track if there is a system-size icon + if( sx == sysX && sy == sysY ) + sysIcon = &m_icons[i]; + } + + // return the system-sized icon if we've got one + if( sysIcon ) return *sysIcon; + // we certainly have at least one icon thanks to the <=1 check above + tmp = &m_icons[0]; + return *tmp; +} + +void wxIconBundle::AddIcon( const wxIcon& icon ) +{ + size_t i, max = m_icons.GetCount(); + + for( i = 0; i < max; ++i ) + { + wxIcon& tmp = m_icons[i]; + if( tmp.Ok() && tmp.GetWidth() == icon.GetWidth() && + tmp.GetHeight() == icon.GetHeight() ) + { + tmp = icon; + return; + } + } + + m_icons.Add( icon ); +} diff --git a/Externals/wxWidgets/src/common/imagall.cpp b/Externals/wxWidgets/src/common/imagall.cpp new file mode 100644 index 0000000000..311c567e55 --- /dev/null +++ b/Externals/wxWidgets/src/common/imagall.cpp @@ -0,0 +1,64 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/imagall.cpp +// Purpose: wxImage access all handler +// Author: Sylvain Bougnoux +// RCS-ID: $Id: imagall.cpp 42644 2006-10-29 18:58:25Z VZ $ +// Copyright: (c) Sylvain Bougnoux +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_IMAGE + +#ifndef WX_PRECOMP + #include "wx/image.h" +#endif + +//----------------------------------------------------------------------------- +// This function allows dynamic access to all image handlers compile within +// the library. This function should be in a separate file as some compilers +// link against the whole object file as long as just one of is function is called! + +void wxInitAllImageHandlers() +{ +#if wxUSE_LIBPNG + wxImage::AddHandler( new wxPNGHandler ); +#endif +#if wxUSE_LIBJPEG + wxImage::AddHandler( new wxJPEGHandler ); +#endif +#if wxUSE_LIBTIFF + wxImage::AddHandler( new wxTIFFHandler ); +#endif +#if wxUSE_GIF + wxImage::AddHandler( new wxGIFHandler ); +#endif +#if wxUSE_PNM + wxImage::AddHandler( new wxPNMHandler ); +#endif +#if wxUSE_PCX + wxImage::AddHandler( new wxPCXHandler ); +#endif +#if wxUSE_IFF + wxImage::AddHandler( new wxIFFHandler ); +#endif +#if wxUSE_ICO_CUR + wxImage::AddHandler( new wxICOHandler ); + wxImage::AddHandler( new wxCURHandler ); + wxImage::AddHandler( new wxANIHandler ); +#endif +#if wxUSE_TGA + wxImage::AddHandler( new wxTGAHandler ); +#endif +#if wxUSE_XPM + wxImage::AddHandler( new wxXPMHandler ); +#endif +} + +#endif // wxUSE_IMAGE diff --git a/Externals/wxWidgets/src/common/imagbmp.cpp b/Externals/wxWidgets/src/common/imagbmp.cpp new file mode 100644 index 0000000000..6d6dbbc6e6 --- /dev/null +++ b/Externals/wxWidgets/src/common/imagbmp.cpp @@ -0,0 +1,1356 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/imagbmp.cpp +// Purpose: wxImage BMP,ICO and CUR handlers +// Author: Robert Roebling, Chris Elliott +// RCS-ID: $Id: imagbmp.cpp 41819 2006-10-09 17:51:07Z VZ $ +// Copyright: (c) Robert Roebling, Chris Elliott +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_IMAGE + +#include "wx/imagbmp.h" + +#ifndef WX_PRECOMP + #ifdef __WXMSW__ + #include "wx/msw/wrapwin.h" + #endif + #include "wx/log.h" + #include "wx/app.h" + #include "wx/bitmap.h" + #include "wx/palette.h" + #include "wx/intl.h" +#endif + +#include "wx/filefn.h" +#include "wx/wfstream.h" +#include "wx/quantize.h" +#include "wx/anidecod.h" + +// For memcpy +#include + +#ifdef __SALFORDC__ +#ifdef FAR +#undef FAR +#endif +#endif + +//----------------------------------------------------------------------------- +// wxBMPHandler +//----------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxBMPHandler,wxImageHandler) + +#if wxUSE_STREAMS + +#ifndef BI_RGB + #define BI_RGB 0 +#endif + +#ifndef BI_RLE8 +#define BI_RLE8 1 +#endif + +#ifndef BI_RLE4 +#define BI_RLE4 2 +#endif + +#ifndef BI_BITFIELDS +#define BI_BITFIELDS 3 +#endif + +#define poffset (line * width * 3 + column * 3) + +bool wxBMPHandler::SaveFile(wxImage *image, + wxOutputStream& stream, + bool verbose) +{ + return SaveDib(image, stream, verbose, true/*IsBmp*/, false/*IsMask*/); +} + +bool wxBMPHandler::SaveDib(wxImage *image, + wxOutputStream& stream, + bool verbose, + bool IsBmp, + bool IsMask) + +{ + wxCHECK_MSG( image, false, _T("invalid pointer in wxBMPHandler::SaveFile") ); + + if ( !image->Ok() ) + { + if ( verbose ) + wxLogError(_("BMP: Couldn't save invalid image.")); + return false; + } + + // get the format of the BMP file to save, else use 24bpp + unsigned format = wxBMP_24BPP; + if ( image->HasOption(wxIMAGE_OPTION_BMP_FORMAT) ) + format = image->GetOptionInt(wxIMAGE_OPTION_BMP_FORMAT); + + wxUint16 bpp; // # of bits per pixel + int palette_size; // # of color map entries, ie. 2^bpp colors + + // set the bpp and appropriate palette_size, and do additional checks + if ( (format == wxBMP_1BPP) || (format == wxBMP_1BPP_BW) ) + { + bpp = 1; + palette_size = 2; + } + else if ( format == wxBMP_4BPP ) + { + bpp = 4; + palette_size = 16; + } + else if ( (format == wxBMP_8BPP) || (format == wxBMP_8BPP_GREY) || + (format == wxBMP_8BPP_RED) || (format == wxBMP_8BPP_PALETTE) ) + { + // need to set a wxPalette to use this, HOW TO CHECK IF VALID, SIZE? + if ((format == wxBMP_8BPP_PALETTE) +#if wxUSE_PALETTE + && !image->HasPalette() +#endif // wxUSE_PALETTE + ) + { + if ( verbose ) + wxLogError(_("BMP: wxImage doesn't have own wxPalette.")); + return false; + } + bpp = 8; + palette_size = 256; + } + else // you get 24bpp + { + format = wxBMP_24BPP; + bpp = 24; + palette_size = 0; + } + + unsigned width = image->GetWidth(); + unsigned row_padding = (4 - int(width*bpp/8.0) % 4) % 4; // # bytes to pad to dword + unsigned row_width = int(width * bpp/8.0) + row_padding; // # of bytes per row + + struct + { + // BitmapHeader: + wxUint16 magic; // format magic, always 'BM' + wxUint32 filesize; // total file size, inc. headers + wxUint32 reserved; // for future use + wxUint32 data_offset; // image data offset in the file + + // BitmapInfoHeader: + wxUint32 bih_size; // 2nd part's size + wxUint32 width, height; // bitmap's dimensions + wxUint16 planes; // num of planes + wxUint16 bpp; // bits per pixel + wxUint32 compression; // compression method + wxUint32 size_of_bmp; // size of the bitmap + wxUint32 h_res, v_res; // image resolution in dpi + wxUint32 num_clrs; // number of colors used + wxUint32 num_signif_clrs;// number of significant colors + } hdr; + + wxUint32 hdr_size = 14/*BitmapHeader*/ + 40/*BitmapInfoHeader*/; + + hdr.magic = wxUINT16_SWAP_ON_BE(0x4D42/*'BM'*/); + hdr.filesize = wxUINT32_SWAP_ON_BE( hdr_size + palette_size*4 + + row_width * image->GetHeight() ); + hdr.reserved = 0; + hdr.data_offset = wxUINT32_SWAP_ON_BE(hdr_size + palette_size*4); + + hdr.bih_size = wxUINT32_SWAP_ON_BE(hdr_size - 14); + hdr.width = wxUINT32_SWAP_ON_BE(image->GetWidth()); + if ( IsBmp ) + { + hdr.height = wxUINT32_SWAP_ON_BE(image->GetHeight()); + } + else + { + hdr.height = wxUINT32_SWAP_ON_BE(2 * image->GetHeight()); + } + hdr.planes = wxUINT16_SWAP_ON_BE(1); // always 1 plane + hdr.bpp = wxUINT16_SWAP_ON_BE(bpp); + hdr.compression = 0; // RGB uncompressed + hdr.size_of_bmp = wxUINT32_SWAP_ON_BE(row_width * image->GetHeight()); + hdr.h_res = hdr.v_res = wxUINT32_SWAP_ON_BE(72); // 72dpi is standard + hdr.num_clrs = wxUINT32_SWAP_ON_BE(palette_size); // # colors in colormap + hdr.num_signif_clrs = 0; // all colors are significant + + if ( IsBmp ) + { + if (// VS: looks ugly but compilers tend to do ugly things with structs, + // like aligning hdr.filesize's ofset to dword :( + // VZ: we should add padding then... + !stream.Write(&hdr.magic, 2) || + !stream.Write(&hdr.filesize, 4) || + !stream.Write(&hdr.reserved, 4) || + !stream.Write(&hdr.data_offset, 4) + ) + { + if (verbose) + wxLogError(_("BMP: Couldn't write the file (Bitmap) header.")); + return false; + } + } + if ( !IsMask ) + { + if ( + !stream.Write(&hdr.bih_size, 4) || + !stream.Write(&hdr.width, 4) || + !stream.Write(&hdr.height, 4) || + !stream.Write(&hdr.planes, 2) || + !stream.Write(&hdr.bpp, 2) || + !stream.Write(&hdr.compression, 4) || + !stream.Write(&hdr.size_of_bmp, 4) || + !stream.Write(&hdr.h_res, 4) || + !stream.Write(&hdr.v_res, 4) || + !stream.Write(&hdr.num_clrs, 4) || + !stream.Write(&hdr.num_signif_clrs, 4) + ) + { + if (verbose) + wxLogError(_("BMP: Couldn't write the file (BitmapInfo) header.")); + return false; + } + } + + wxPalette *palette = NULL; // entries for quantized images + wxUint8 *rgbquad = NULL; // for the RGBQUAD bytes for the colormap + wxImage *q_image = NULL; // destination for quantized image + + // if <24bpp use quantization to reduce colors for *some* of the formats + if ( (format == wxBMP_1BPP) || (format == wxBMP_4BPP) || + (format == wxBMP_8BPP) || (format == wxBMP_8BPP_PALETTE) ) + { + // make a new palette and quantize the image + if (format != wxBMP_8BPP_PALETTE) + { + q_image = new wxImage(); + + // I get a delete error using Quantize when desired colors > 236 + int quantize = ((palette_size > 236) ? 236 : palette_size); + // fill the destination too, it gives much nicer 4bpp images + wxQuantize::Quantize( *image, *q_image, &palette, quantize, 0, + wxQUANTIZE_FILL_DESTINATION_IMAGE ); + } + else + { +#if wxUSE_PALETTE + palette = new wxPalette(image->GetPalette()); +#endif // wxUSE_PALETTE + } + + int i; + unsigned char r, g, b; + rgbquad = new wxUint8 [palette_size*4]; + + for (i = 0; i < palette_size; i++) + { +#if wxUSE_PALETTE + if ( !palette->GetRGB(i, &r, &g, &b) ) +#endif // wxUSE_PALETTE + r = g = b = 0; + + rgbquad[i*4] = b; + rgbquad[i*4+1] = g; + rgbquad[i*4+2] = r; + rgbquad[i*4+3] = 0; + } + } + // make a 256 entry greyscale colormap or 2 entry black & white + else if ( (format == wxBMP_8BPP_GREY) || (format == wxBMP_8BPP_RED) || + (format == wxBMP_1BPP_BW) ) + { + rgbquad = new wxUint8 [palette_size*4]; + + for ( int i = 0; i < palette_size; i++ ) + { + // if 1BPP_BW then the value should be either 0 or 255 + wxUint8 c = (wxUint8)((i > 0) && (format == wxBMP_1BPP_BW) ? 255 : i); + + rgbquad[i*4] = + rgbquad[i*4+1] = + rgbquad[i*4+2] = c; + rgbquad[i*4+3] = 0; + } + } + + // if the colormap was made, then it needs to be written + if (rgbquad) + { + if ( !IsMask ) + { + if ( !stream.Write(rgbquad, palette_size*4) ) + { + if (verbose) + wxLogError(_("BMP: Couldn't write RGB color map.")); + delete[] rgbquad; +#if wxUSE_PALETTE + delete palette; +#endif // wxUSE_PALETTE + delete q_image; + return false; + } + } + delete []rgbquad; + } + + // pointer to the image data, use quantized if available + wxUint8 *data = (wxUint8*) image->GetData(); + if (q_image) if (q_image->Ok()) data = (wxUint8*) q_image->GetData(); + + wxUint8 *buffer = new wxUint8[row_width]; + memset(buffer, 0, row_width); + int y; unsigned x; + long int pixel; + + for (y = image->GetHeight() -1; y >= 0; y--) + { + if ( format == wxBMP_24BPP ) // 3 bytes per pixel red,green,blue + { + for ( x = 0; x < width; x++ ) + { + pixel = 3*(y*width + x); + + buffer[3*x ] = data[pixel+2]; + buffer[3*x + 1] = data[pixel+1]; + buffer[3*x + 2] = data[pixel]; + } + } + else if ((format == wxBMP_8BPP) || // 1 byte per pixel in color + (format == wxBMP_8BPP_PALETTE)) + { + for (x = 0; x < width; x++) + { + pixel = 3*(y*width + x); +#if wxUSE_PALETTE + buffer[x] = (wxUint8)palette->GetPixel( data[pixel], + data[pixel+1], + data[pixel+2] ); +#else + // FIXME: what should this be? use some std palette maybe? + buffer[x] = 0; +#endif // wxUSE_PALETTE + } + } + else if ( format == wxBMP_8BPP_GREY ) // 1 byte per pix, rgb ave to grey + { + for (x = 0; x < width; x++) + { + pixel = 3*(y*width + x); + buffer[x] = (wxUint8)(.299*data[pixel] + + .587*data[pixel+1] + + .114*data[pixel+2]); + } + } + else if ( format == wxBMP_8BPP_RED ) // 1 byte per pixel, red as greys + { + for (x = 0; x < width; x++) + { + buffer[x] = (wxUint8)data[3*(y*width + x)]; + } + } + else if ( format == wxBMP_4BPP ) // 4 bpp in color + { + for (x = 0; x < width; x+=2) + { + pixel = 3*(y*width + x); + + // fill buffer, ignore if > width +#if wxUSE_PALETTE + buffer[x/2] = (wxUint8)( + ((wxUint8)palette->GetPixel(data[pixel], + data[pixel+1], + data[pixel+2]) << 4) | + (((x+1) > width) + ? 0 + : ((wxUint8)palette->GetPixel(data[pixel+3], + data[pixel+4], + data[pixel+5]) )) ); +#else + // FIXME: what should this be? use some std palette maybe? + buffer[x/2] = 0; +#endif // wxUSE_PALETTE + } + } + else if ( format == wxBMP_1BPP ) // 1 bpp in "color" + { + for (x = 0; x < width; x+=8) + { + pixel = 3*(y*width + x); + +#if wxUSE_PALETTE + buffer[x/8] = (wxUint8)( + ((wxUint8)palette->GetPixel(data[pixel], data[pixel+1], data[pixel+2]) << 7) | + (((x+1) > width) ? 0 : ((wxUint8)palette->GetPixel(data[pixel+3], data[pixel+4], data[pixel+5]) << 6)) | + (((x+2) > width) ? 0 : ((wxUint8)palette->GetPixel(data[pixel+6], data[pixel+7], data[pixel+8]) << 5)) | + (((x+3) > width) ? 0 : ((wxUint8)palette->GetPixel(data[pixel+9], data[pixel+10], data[pixel+11]) << 4)) | + (((x+4) > width) ? 0 : ((wxUint8)palette->GetPixel(data[pixel+12], data[pixel+13], data[pixel+14]) << 3)) | + (((x+5) > width) ? 0 : ((wxUint8)palette->GetPixel(data[pixel+15], data[pixel+16], data[pixel+17]) << 2)) | + (((x+6) > width) ? 0 : ((wxUint8)palette->GetPixel(data[pixel+18], data[pixel+19], data[pixel+20]) << 1)) | + (((x+7) > width) ? 0 : ((wxUint8)palette->GetPixel(data[pixel+21], data[pixel+22], data[pixel+23]) )) ); +#else + // FIXME: what should this be? use some std palette maybe? + buffer[x/8] = 0; +#endif // wxUSE_PALETTE + } + } + else if ( format == wxBMP_1BPP_BW ) // 1 bpp B&W colormap from red color ONLY + { + for (x = 0; x < width; x+=8) + { + pixel = 3*(y*width + x); + + buffer[x/8] = (wxUint8)( + (((wxUint8)(data[pixel] /128.)) << 7) | + (((x+1) > width) ? 0 : (((wxUint8)(data[pixel+3] /128.)) << 6)) | + (((x+2) > width) ? 0 : (((wxUint8)(data[pixel+6] /128.)) << 5)) | + (((x+3) > width) ? 0 : (((wxUint8)(data[pixel+9] /128.)) << 4)) | + (((x+4) > width) ? 0 : (((wxUint8)(data[pixel+12]/128.)) << 3)) | + (((x+5) > width) ? 0 : (((wxUint8)(data[pixel+15]/128.)) << 2)) | + (((x+6) > width) ? 0 : (((wxUint8)(data[pixel+18]/128.)) << 1)) | + (((x+7) > width) ? 0 : (((wxUint8)(data[pixel+21]/128.)) )) ); + } + } + + if ( !stream.Write(buffer, row_width) ) + { + if (verbose) + wxLogError(_("BMP: Couldn't write data.")); + delete[] buffer; +#if wxUSE_PALETTE + delete palette; +#endif // wxUSE_PALETTE + delete q_image; + return false; + } + } + delete[] buffer; +#if wxUSE_PALETTE + delete palette; +#endif // wxUSE_PALETTE + delete q_image; + + return true; +} + + +typedef struct +{ + unsigned char r, g, b; +} _cmap; + +bool wxBMPHandler::DoLoadDib(wxImage * image, int width, int height, + int bpp, int ncolors, int comp, + wxFileOffset bmpOffset, wxInputStream& stream, + bool verbose, bool IsBmp, bool hasPalette) +{ + wxInt32 aDword, rmask = 0, gmask = 0, bmask = 0; + int rshift = 0, gshift = 0, bshift = 0; + int rbits = 0, gbits = 0, bbits = 0; + wxInt32 dbuf[4]; + wxInt8 bbuf[4]; + wxUint8 aByte; + wxUint16 aWord; + + // allocate space for palette if needed: + _cmap *cmap; + + if ( bpp < 16 ) + { + cmap = new _cmap[ncolors]; + if ( !cmap ) + { + if (verbose) + wxLogError(_("BMP: Couldn't allocate memory.")); + return false; + } + } + else + cmap = NULL; + + // destroy existing here instead of: + image->Destroy(); + image->Create(width, height); + + unsigned char *ptr = image->GetData(); + + if ( !ptr ) + { + if ( verbose ) + wxLogError( _("BMP: Couldn't allocate memory.") ); + if ( cmap ) + delete[] cmap; + return false; + } + + // Reading the palette, if it exists: + if ( bpp < 16 && ncolors != 0 ) + { + unsigned char* r = new unsigned char[ncolors]; + unsigned char* g = new unsigned char[ncolors]; + unsigned char* b = new unsigned char[ncolors]; + for (int j = 0; j < ncolors; j++) + { + if (hasPalette) + { + stream.Read(bbuf, 4); + cmap[j].b = bbuf[0]; + cmap[j].g = bbuf[1]; + cmap[j].r = bbuf[2]; + + r[j] = cmap[j].r; + g[j] = cmap[j].g; + b[j] = cmap[j].b; + } + else + { + //used in reading .ico file mask + r[j] = cmap[j].r = + g[j] = cmap[j].g = + b[j] = cmap[j].b = ( j ? 255 : 0 ); + } + } + +#if wxUSE_PALETTE + // Set the palette for the wxImage + image->SetPalette(wxPalette(ncolors, r, g, b)); +#endif // wxUSE_PALETTE + + delete[] r; + delete[] g; + delete[] b; + } + else if ( bpp == 16 || bpp == 32 ) + { + if ( comp == BI_BITFIELDS ) + { + int bit = 0; + stream.Read(dbuf, 4 * 3); + rmask = wxINT32_SWAP_ON_BE(dbuf[0]); + gmask = wxINT32_SWAP_ON_BE(dbuf[1]); + bmask = wxINT32_SWAP_ON_BE(dbuf[2]); + // find shift amount (Least significant bit of mask) + for (bit = bpp-1; bit>=0; bit--) + { + if (bmask & (1 << bit)) + bshift = bit; + if (gmask & (1 << bit)) + gshift = bit; + if (rmask & (1 << bit)) + rshift = bit; + } + // Find number of bits in mask (MSB-LSB+1) + for (bit = 0; bit < bpp; bit++) + { + if (bmask & (1 << bit)) + bbits = bit-bshift+1; + if (gmask & (1 << bit)) + gbits = bit-gshift+1; + if (rmask & (1 << bit)) + rbits = bit-rshift+1; + } + } + else if ( bpp == 16 ) + { + rmask = 0x7C00; + gmask = 0x03E0; + bmask = 0x001F; + rshift = 10; + gshift = 5; + bshift = 0; + rbits = 5; + gbits = 5; + bbits = 5; + } + else if ( bpp == 32 ) + { + rmask = 0x00FF0000; + gmask = 0x0000FF00; + bmask = 0x000000FF; + rshift = 16; + gshift = 8; + bshift = 0; + rbits = 8; + gbits = 8; + bbits = 8; + } + } + + /* + * Reading the image data + */ + if ( IsBmp ) + stream.SeekI(bmpOffset); // else icon, just carry on + + unsigned char *data = ptr; + + /* set the whole image to the background color */ + if ( bpp < 16 && (comp == BI_RLE4 || comp == BI_RLE8) ) + { + for (int i = 0; i < width * height; i++) + { + *ptr++ = cmap[0].r; + *ptr++ = cmap[0].g; + *ptr++ = cmap[0].b; + } + ptr = data; + } + + int linesize = ((width * bpp + 31) / 32) * 4; + + /* BMPs are stored upside down */ + for ( int line = (height - 1); line >= 0; line-- ) + { + int linepos = 0; + for ( int column = 0; column < width ; ) + { + if ( bpp < 16 ) + { + linepos++; + aByte = stream.GetC(); + if ( bpp == 1 ) + { + for (int bit = 0; bit < 8 && column < width; bit++) + { + int index = ((aByte & (0x80 >> bit)) ? 1 : 0); + ptr[poffset] = cmap[index].r; + ptr[poffset + 1] = cmap[index].g; + ptr[poffset + 2] = cmap[index].b; + column++; + } + } + else if ( bpp == 4 ) + { + if ( comp == BI_RLE4 ) + { + wxUint8 first; + first = aByte; + aByte = stream.GetC(); + if ( first == 0 ) + { + if ( aByte == 0 ) + { + if ( column > 0 ) + column = width; + } + else if ( aByte == 1 ) + { + column = width; + line = -1; + } + else if ( aByte == 2 ) + { + aByte = stream.GetC(); + column += aByte; + linepos = column * bpp / 4; + aByte = stream.GetC(); + line -= aByte; // upside down + } + else + { + int absolute = aByte; + wxUint8 nibble[2] ; + int readBytes = 0 ; + for (int k = 0; k < absolute; k++) + { + if ( !(k % 2 ) ) + { + ++readBytes ; + aByte = stream.GetC(); + nibble[0] = (wxUint8)( (aByte & 0xF0) >> 4 ) ; + nibble[1] = (wxUint8)( aByte & 0x0F ) ; + } + ptr[poffset ] = cmap[nibble[k%2]].r; + ptr[poffset + 1] = cmap[nibble[k%2]].g; + ptr[poffset + 2] = cmap[nibble[k%2]].b; + column++; + if ( k % 2 ) + linepos++; + } + if ( readBytes & 0x01 ) + aByte = stream.GetC(); + } + } + else + { + wxUint8 nibble[2] ; + nibble[0] = (wxUint8)( (aByte & 0xF0) >> 4 ) ; + nibble[1] = (wxUint8)( aByte & 0x0F ) ; + + for ( int l = 0; l < first && column < width; l++ ) + { + ptr[poffset ] = cmap[nibble[l%2]].r; + ptr[poffset + 1] = cmap[nibble[l%2]].g; + ptr[poffset + 2] = cmap[nibble[l%2]].b; + column++; + if ( l % 2 ) + linepos++; + } + } + } + else + { + for (int nibble = 0; nibble < 2 && column < width; nibble++) + { + int index = ((aByte & (0xF0 >> nibble * 4)) >> (!nibble * 4)); + if ( index >= 16 ) + index = 15; + ptr[poffset] = cmap[index].r; + ptr[poffset + 1] = cmap[index].g; + ptr[poffset + 2] = cmap[index].b; + column++; + } + } + } + else if ( bpp == 8 ) + { + if ( comp == BI_RLE8 ) + { + unsigned char first; + first = aByte; + aByte = stream.GetC(); + if ( first == 0 ) + { + if ( aByte == 0 ) + { + /* column = width; */ + } + else if ( aByte == 1 ) + { + column = width; + line = -1; + } + else if ( aByte == 2 ) + { + aByte = stream.GetC(); + column += aByte; + linepos = column * bpp / 8; + aByte = stream.GetC(); + line += aByte; + } + else + { + int absolute = aByte; + for (int k = 0; k < absolute; k++) + { + linepos++; + aByte = stream.GetC(); + ptr[poffset ] = cmap[aByte].r; + ptr[poffset + 1] = cmap[aByte].g; + ptr[poffset + 2] = cmap[aByte].b; + column++; + } + if ( absolute & 0x01 ) + aByte = stream.GetC(); + } + } + else + { + for ( int l = 0; l < first && column < width; l++ ) + { + ptr[poffset ] = cmap[aByte].r; + ptr[poffset + 1] = cmap[aByte].g; + ptr[poffset + 2] = cmap[aByte].b; + column++; + linepos++; + } + } + } + else + { + ptr[poffset ] = cmap[aByte].r; + ptr[poffset + 1] = cmap[aByte].g; + ptr[poffset + 2] = cmap[aByte].b; + column++; + // linepos += size; seems to be wrong, RR + } + } + } + else if ( bpp == 24 ) + { + stream.Read(bbuf, 3); + linepos += 3; + ptr[poffset ] = (unsigned char)bbuf[2]; + ptr[poffset + 1] = (unsigned char)bbuf[1]; + ptr[poffset + 2] = (unsigned char)bbuf[0]; + column++; + } + else if ( bpp == 16 ) + { + unsigned char temp; + stream.Read(&aWord, 2); + aWord = wxUINT16_SWAP_ON_BE(aWord); + linepos += 2; + /* use the masks and calculated amonut of shift + to retrieve the color data out of the word. Then + shift it left by (8 - number of bits) such that + the image has the proper dynamic range */ + temp = (unsigned char)((aWord & rmask) >> rshift << (8-rbits)); + ptr[poffset] = temp; + temp = (unsigned char)((aWord & gmask) >> gshift << (8-gbits)); + ptr[poffset + 1] = temp; + temp = (unsigned char)((aWord & bmask) >> bshift << (8-bbits)); + ptr[poffset + 2] = temp; + column++; + } + else + { + unsigned char temp; + stream.Read(&aDword, 4); + aDword = wxINT32_SWAP_ON_BE(aDword); + linepos += 4; + temp = (unsigned char)((aDword & rmask) >> rshift); + ptr[poffset] = temp; + temp = (unsigned char)((aDword & gmask) >> gshift); + ptr[poffset + 1] = temp; + temp = (unsigned char)((aDword & bmask) >> bshift); + ptr[poffset + 2] = temp; + column++; + } + } + while ( (linepos < linesize) && (comp != 1) && (comp != 2) ) + { + stream.Read(&aByte, 1); + linepos += 1; + if ( !stream ) + break; + } + } + + delete[] cmap; + + image->SetMask(false); + + const wxStreamError err = stream.GetLastError(); + return err == wxSTREAM_NO_ERROR || err == wxSTREAM_EOF; +} + +bool wxBMPHandler::LoadDib(wxImage *image, wxInputStream& stream, + bool verbose, bool IsBmp) +{ + wxUint16 aWord; + wxInt32 dbuf[4]; + wxInt8 bbuf[4]; + + wxFileOffset offset = 0; // keep gcc quiet + if ( IsBmp ) + { + // read the header off the .BMP format file + + offset = stream.TellI(); + if (offset == wxInvalidOffset) + offset = 0; + + stream.Read(bbuf, 2); + stream.Read(dbuf, 16); + } + else + { + stream.Read(dbuf, 4); + } + #if 0 // unused + wxInt32 size = wxINT32_SWAP_ON_BE(dbuf[0]); + #endif + offset = offset + wxINT32_SWAP_ON_BE(dbuf[2]); + + stream.Read(dbuf, 4 * 2); + int width = wxINT32_SWAP_ON_BE((int)dbuf[0]); + int height = wxINT32_SWAP_ON_BE((int)dbuf[1]); + if ( !IsBmp)height = height / 2; // for icons divide by 2 + + if ( width > 32767 ) + { + if (verbose) + wxLogError( _("DIB Header: Image width > 32767 pixels for file.") ); + return false; + } + if ( height > 32767 ) + { + if (verbose) + wxLogError( _("DIB Header: Image height > 32767 pixels for file.") ); + return false; + } + + stream.Read(&aWord, 2); + /* + TODO + int planes = (int)wxUINT16_SWAP_ON_BE( aWord ); + */ + stream.Read(&aWord, 2); + int bpp = wxUINT16_SWAP_ON_BE((int)aWord); + if ( bpp != 1 && bpp != 4 && bpp != 8 && bpp != 16 && bpp != 24 && bpp != 32 ) + { + if (verbose) + wxLogError( _("DIB Header: Unknown bitdepth in file.") ); + return false; + } + + stream.Read(dbuf, 4 * 4); + int comp = wxINT32_SWAP_ON_BE((int)dbuf[0]); + if ( comp != BI_RGB && comp != BI_RLE4 && comp != BI_RLE8 && + comp != BI_BITFIELDS ) + { + if (verbose) + wxLogError( _("DIB Header: Unknown encoding in file.") ); + return false; + } + + stream.Read(dbuf, 4 * 2); + int ncolors = wxINT32_SWAP_ON_BE( (int)dbuf[0] ); + if (ncolors == 0) + ncolors = 1 << bpp; + /* some more sanity checks */ + if (((comp == BI_RLE4) && (bpp != 4)) || + ((comp == BI_RLE8) && (bpp != 8)) || + ((comp == BI_BITFIELDS) && (bpp != 16 && bpp != 32))) + { + if (verbose) + wxLogError( _("DIB Header: Encoding doesn't match bitdepth.") ); + return false; + } + + //read DIB; this is the BMP image or the XOR part of an icon image + if ( !DoLoadDib(image, width, height, bpp, ncolors, comp, offset, stream, + verbose, IsBmp, true) ) + { + if (verbose) + wxLogError( _("Error in reading image DIB.") ); + return false; + } + + if ( !IsBmp ) + { + //read Icon mask which is monochrome + //there is no palette, so we will create one + wxImage mask; + if ( !DoLoadDib(&mask, width, height, 1, 2, BI_RGB, offset, stream, + verbose, IsBmp, false) ) + { + if (verbose) + wxLogError( _("ICO: Error in reading mask DIB.") ); + return false; + } + image->SetMaskFromImage(mask, 255, 255, 255); + + } + + return true; +} + +bool wxBMPHandler::LoadFile(wxImage *image, wxInputStream& stream, + bool verbose, int WXUNUSED(index)) +{ + // Read a single DIB fom the file: + return LoadDib(image, stream, verbose, true/*isBmp*/); +} + +bool wxBMPHandler::DoCanRead(wxInputStream& stream) +{ + unsigned char hdr[2]; + + if ( !stream.Read(hdr, WXSIZEOF(hdr)) ) + return false; + + // do we have the BMP file signature? + return hdr[0] == 'B' && hdr[1] == 'M'; +} + +#endif // wxUSE_STREAMS + + +#if wxUSE_ICO_CUR +//----------------------------------------------------------------------------- +// wxICOHandler +//----------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxICOHandler, wxBMPHandler) + +#if wxUSE_STREAMS + +struct ICONDIRENTRY +{ + wxUint8 bWidth; // Width of the image + wxUint8 bHeight; // Height of the image (times 2) + wxUint8 bColorCount; // Number of colors in image (0 if >=8bpp) + wxUint8 bReserved; // Reserved + + // these two are different in icons and cursors: + // icon or cursor + wxUint16 wPlanes; // Color Planes or XHotSpot + wxUint16 wBitCount; // Bits per pixel or YHotSpot + + wxUint32 dwBytesInRes; // how many bytes in this resource? + wxUint32 dwImageOffset; // where in the file is this image +}; + +struct ICONDIR +{ + wxUint16 idReserved; // Reserved + wxUint16 idType; // resource type (1 for icons, 2 for cursors) + wxUint16 idCount; // how many images? +}; + + +bool wxICOHandler::SaveFile(wxImage *image, + wxOutputStream& stream, + bool verbose) + +{ + //sanity check; icon must be less than 127 pixels high and 255 wide + if ( image->GetHeight () > 127 ) + { + if ( verbose ) + wxLogError(_("ICO: Image too tall for an icon.")); + return false; + } + if ( image->GetWidth () > 255 ) + { + if ( verbose ) + wxLogError(_("ICO: Image too wide for an icon.")); + return false; + } + + const int images = 1; // only generate one image + + // VS: This is a hack of sort - since ICO and CUR files are almost + // identical, we have all the meat in wxICOHandler and check for + // the actual (handler) type when the code has to distinguish between + // the two formats + int type = (this->GetType() == wxBITMAP_TYPE_CUR) ? 2 : 1; + + // write a header, (ICONDIR) + // Calculate the header size + wxUint32 offset = 3 * sizeof(wxUint16); + + ICONDIR IconDir; + IconDir.idReserved = 0; + IconDir.idType = wxUINT16_SWAP_ON_BE((wxUint16)type); + IconDir.idCount = wxUINT16_SWAP_ON_BE((wxUint16)images); + stream.Write(&IconDir.idReserved, sizeof(IconDir.idReserved)); + stream.Write(&IconDir.idType, sizeof(IconDir.idType)); + stream.Write(&IconDir.idCount, sizeof(IconDir.idCount)); + if ( !stream.IsOk() ) + { + if ( verbose ) + wxLogError(_("ICO: Error writing the image file!")); + return false; + } + + // for each iamage write a description ICONDIRENTRY: + ICONDIRENTRY icondirentry; + for (int img = 0; img < images; img++) + { + wxImage mask; + + if ( image->HasMask() ) + { + // make another image with black/white: + mask = image->ConvertToMono (image->GetMaskRed(), image->GetMaskGreen(), image->GetMaskBlue() ); + + // now we need to change the masked regions to black: + unsigned char r = image->GetMaskRed(); + unsigned char g = image->GetMaskGreen(); + unsigned char b = image->GetMaskBlue(); + if ( (r != 0) || (g != 0) || (b != 0) ) + { + // Go round and apply black to the masked bits: + int i, j; + for (i = 0; i < mask.GetWidth(); i++) + { + for (j = 0; j < mask.GetHeight(); j++) + { + if ((r == mask.GetRed(i, j)) && + (g == mask.GetGreen(i, j))&& + (b == mask.GetBlue(i, j)) ) + image->SetRGB(i, j, 0, 0, 0 ); + } + } + } + } + else + { + // just make a black mask all over: + mask = image->Copy(); + int i, j; + for (i = 0; i < mask.GetWidth(); i++) + for (j = 0; j < mask.GetHeight(); j++) + mask.SetRGB(i, j, 0, 0, 0 ); + } + // Set the formats for image and mask + // (Windows never saves with more than 8 colors): + image->SetOption(wxIMAGE_OPTION_BMP_FORMAT, wxBMP_8BPP); + + // monochome bitmap: + mask.SetOption(wxIMAGE_OPTION_BMP_FORMAT, wxBMP_1BPP_BW); + bool IsBmp = false; + bool IsMask = false; + + //calculate size and offset of image and mask + wxCountingOutputStream cStream; + bool bResult = SaveDib(image, cStream, verbose, IsBmp, IsMask); + if ( !bResult ) + { + if ( verbose ) + wxLogError(_("ICO: Error writing the image file!")); + return false; + } + IsMask = true; + + bResult = SaveDib(&mask, cStream, verbose, IsBmp, IsMask); + if ( !bResult ) + { + if ( verbose ) + wxLogError(_("ICO: Error writing the image file!")); + return false; + } + wxUint32 Size = cStream.GetSize(); + + // wxCountingOutputStream::IsOk() always returns true for now and this + // "if" provokes VC++ warnings in optimized build +#if 0 + if ( !cStream.Ok() ) + { + if ( verbose ) + wxLogError(_("ICO: Error writing the image file!")); + return false; + } +#endif // 0 + + offset = offset + sizeof(ICONDIRENTRY); + + icondirentry.bWidth = (wxUint8)image->GetWidth(); + icondirentry.bHeight = (wxUint8)(2 * image->GetHeight()); + icondirentry.bColorCount = 0; + icondirentry.bReserved = 0; + icondirentry.wPlanes = wxUINT16_SWAP_ON_BE(1); + icondirentry.wBitCount = wxUINT16_SWAP_ON_BE(wxBMP_8BPP); + if ( type == 2 /*CUR*/) + { + int hx = image->HasOption(wxIMAGE_OPTION_CUR_HOTSPOT_X) ? + image->GetOptionInt(wxIMAGE_OPTION_CUR_HOTSPOT_X) : + image->GetWidth() / 2; + int hy = image->HasOption(wxIMAGE_OPTION_CUR_HOTSPOT_Y) ? + image->GetOptionInt(wxIMAGE_OPTION_CUR_HOTSPOT_Y) : + image->GetHeight() / 2; + + // actually write the values of the hot spot here: + icondirentry.wPlanes = wxUINT16_SWAP_ON_BE((wxUint16)hx); + icondirentry.wBitCount = wxUINT16_SWAP_ON_BE((wxUint16)hy); + } + icondirentry.dwBytesInRes = wxUINT32_SWAP_ON_BE(Size); + icondirentry.dwImageOffset = wxUINT32_SWAP_ON_BE(offset); + + // increase size to allow for the data written: + offset += Size; + + // write to stream: + stream.Write(&icondirentry.bWidth, sizeof(icondirentry.bWidth)); + stream.Write(&icondirentry.bHeight, sizeof(icondirentry.bHeight)); + stream.Write(&icondirentry.bColorCount, sizeof(icondirentry.bColorCount)); + stream.Write(&icondirentry.bReserved, sizeof(icondirentry.bReserved)); + stream.Write(&icondirentry.wPlanes, sizeof(icondirentry.wPlanes)); + stream.Write(&icondirentry.wBitCount, sizeof(icondirentry.wBitCount)); + stream.Write(&icondirentry.dwBytesInRes, sizeof(icondirentry.dwBytesInRes)); + stream.Write(&icondirentry.dwImageOffset, sizeof(icondirentry.dwImageOffset)); + if ( !stream.IsOk() ) + { + if ( verbose ) + wxLogError(_("ICO: Error writing the image file!")); + return false; + } + + // actually save it: + IsMask = false; + bResult = SaveDib(image, stream, verbose, IsBmp, IsMask); + if ( !bResult ) + { + if ( verbose ) + wxLogError(_("ICO: Error writing the image file!")); + return false; + } + IsMask = true; + + bResult = SaveDib(&mask, stream, verbose, IsBmp, IsMask); + if ( !bResult ) + { + if ( verbose ) + wxLogError(_("ICO: Error writing the image file!")); + return false; + } + + } // end of for loop + + return true; +} + +bool wxICOHandler::LoadFile(wxImage *image, wxInputStream& stream, + bool verbose, int index) +{ + stream.SeekI(0); + return DoLoadFile(image, stream, verbose, index); +} + +bool wxICOHandler::DoLoadFile(wxImage *image, wxInputStream& stream, + bool WXUNUSED(verbose), int index) +{ + bool bResult wxDUMMY_INITIALIZE(false); + bool IsBmp = false; + + ICONDIR IconDir; + + wxFileOffset iPos = stream.TellI(); + stream.Read(&IconDir, sizeof(IconDir)); + wxUint16 nIcons = wxUINT16_SWAP_ON_BE(IconDir.idCount); + // nType is 1 for Icons, 2 for Cursors: + wxUint16 nType = wxUINT16_SWAP_ON_BE(IconDir.idType); + + // loop round the icons and choose the best one: + ICONDIRENTRY *pIconDirEntry = new ICONDIRENTRY[nIcons]; + ICONDIRENTRY *pCurrentEntry = pIconDirEntry; + int wMax = 0; + int colmax = 0; + int iSel = wxNOT_FOUND; + + for (int i = 0; i < nIcons; i++ ) + { + stream.Read(pCurrentEntry, sizeof(ICONDIRENTRY)); + // bHeight and bColorCount are wxUint8 + if ( pCurrentEntry->bWidth >= wMax ) + { + // see if we have more colors, ==0 indicates > 8bpp: + if ( pCurrentEntry->bColorCount == 0 ) + pCurrentEntry->bColorCount = 255; + if ( pCurrentEntry->bColorCount >= colmax ) + { + iSel = i; + wMax = pCurrentEntry->bWidth; + colmax = pCurrentEntry->bColorCount; + } + } + pCurrentEntry++; + } + + if ( index != -1 ) + { + // VS: Note that we *have* to run the loop above even if index != -1, because + // it reads ICONDIRENTRies. + iSel = index; + } + + if ( iSel == wxNOT_FOUND || iSel < 0 || iSel >= nIcons ) + { + wxLogError(_("ICO: Invalid icon index.")); + bResult = false; + } + else + { + // seek to selected icon: + pCurrentEntry = pIconDirEntry + iSel; + stream.SeekI(iPos + wxUINT32_SWAP_ON_BE(pCurrentEntry->dwImageOffset), wxFromStart); + bResult = LoadDib(image, stream, true, IsBmp); + bool bIsCursorType = (this->GetType() == wxBITMAP_TYPE_CUR) || (this->GetType() == wxBITMAP_TYPE_ANI); + if ( bResult && bIsCursorType && nType == 2 ) + { + // it is a cursor, so let's set the hotspot: + image->SetOption(wxIMAGE_OPTION_CUR_HOTSPOT_X, wxUINT16_SWAP_ON_BE(pCurrentEntry->wPlanes)); + image->SetOption(wxIMAGE_OPTION_CUR_HOTSPOT_Y, wxUINT16_SWAP_ON_BE(pCurrentEntry->wBitCount)); + } + } + delete[] pIconDirEntry; + return bResult; +} + +int wxICOHandler::GetImageCount(wxInputStream& stream) +{ + ICONDIR IconDir; + wxFileOffset iPos = stream.TellI(); + stream.SeekI(0); + stream.Read(&IconDir, sizeof(IconDir)); + wxUint16 nIcons = wxUINT16_SWAP_ON_BE(IconDir.idCount); + stream.SeekI(iPos); + return (int)nIcons; +} + +bool wxICOHandler::DoCanRead(wxInputStream& stream) +{ + stream.SeekI(0); + unsigned char hdr[4]; + if ( !stream.Read(hdr, WXSIZEOF(hdr)) ) + return false; + + // hdr[2] is one for an icon and two for a cursor + return hdr[0] == '\0' && hdr[1] == '\0' && hdr[2] == '\1' && hdr[3] == '\0'; +} + +#endif // wxUSE_STREAMS + + +//----------------------------------------------------------------------------- +// wxCURHandler +//----------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxCURHandler, wxICOHandler) + +#if wxUSE_STREAMS + +bool wxCURHandler::DoCanRead(wxInputStream& stream) +{ + stream.SeekI(0); + unsigned char hdr[4]; + if ( !stream.Read(hdr, WXSIZEOF(hdr)) ) + return false; + + // hdr[2] is one for an icon and two for a cursor + return hdr[0] == '\0' && hdr[1] == '\0' && hdr[2] == '\2' && hdr[3] == '\0'; +} + +#endif // wxUSE_STREAMS + +//----------------------------------------------------------------------------- +// wxANIHandler +//----------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxANIHandler, wxCURHandler) + +#if wxUSE_STREAMS + +bool wxANIHandler::LoadFile(wxImage *image, wxInputStream& stream, + bool WXUNUSED(verbose), int index) +{ + wxANIDecoder decoder; + if (!decoder.Load(stream)) + return false; + + return decoder.ConvertToImage(index != -1 ? (size_t)index : 0, image); +} + +bool wxANIHandler::DoCanRead(wxInputStream& stream) +{ + wxANIDecoder decod; + return decod.CanRead(stream); +} + +int wxANIHandler::GetImageCount(wxInputStream& stream) +{ + wxANIDecoder decoder; + if (!decoder.Load(stream)) + return wxNOT_FOUND; + + return decoder.GetFrameCount(); +} + +#endif // wxUSE_STREAMS + +#endif // wxUSE_ICO_CUR + +#endif // wxUSE_IMAGE diff --git a/Externals/wxWidgets/src/common/image.cpp b/Externals/wxWidgets/src/common/image.cpp new file mode 100644 index 0000000000..918bc9e1d9 --- /dev/null +++ b/Externals/wxWidgets/src/common/image.cpp @@ -0,0 +1,3114 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/image.cpp +// Purpose: wxImage +// Author: Robert Roebling +// RCS-ID: $Id: image.cpp 46549 2007-06-20 00:13:57Z VZ $ +// Copyright: (c) Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_IMAGE + +#include "wx/image.h" + +#ifndef WX_PRECOMP + #include "wx/log.h" + #include "wx/hash.h" + #include "wx/utils.h" + #include "wx/math.h" + #include "wx/module.h" + #include "wx/palette.h" + #include "wx/intl.h" +#endif + +#include "wx/filefn.h" +#include "wx/wfstream.h" +#include "wx/xpmdecod.h" + +// For memcpy +#include + +// make the code compile with either wxFile*Stream or wxFFile*Stream: +#define HAS_FILE_STREAMS (wxUSE_STREAMS && (wxUSE_FILE || wxUSE_FFILE)) + +#if HAS_FILE_STREAMS + #if wxUSE_FFILE + typedef wxFFileInputStream wxImageFileInputStream; + typedef wxFFileOutputStream wxImageFileOutputStream; + #elif wxUSE_FILE + typedef wxFileInputStream wxImageFileInputStream; + typedef wxFileOutputStream wxImageFileOutputStream; + #endif // wxUSE_FILE/wxUSE_FFILE +#endif // HAS_FILE_STREAMS + +#if wxUSE_VARIANT +IMPLEMENT_VARIANT_OBJECT_EXPORTED_SHALLOWCMP(wxImage,WXDLLEXPORT) +#endif + +//----------------------------------------------------------------------------- +// wxImage +//----------------------------------------------------------------------------- + +class wxImageRefData: public wxObjectRefData +{ +public: + wxImageRefData(); + virtual ~wxImageRefData(); + + int m_width; + int m_height; + unsigned char *m_data; + + bool m_hasMask; + unsigned char m_maskRed,m_maskGreen,m_maskBlue; + + // alpha channel data, may be NULL for the formats without alpha support + unsigned char *m_alpha; + + bool m_ok; + + // if true, m_data is pointer to static data and shouldn't be freed + bool m_static; + + // same as m_static but for m_alpha + bool m_staticAlpha; + +#if wxUSE_PALETTE + wxPalette m_palette; +#endif // wxUSE_PALETTE + + wxArrayString m_optionNames; + wxArrayString m_optionValues; + + DECLARE_NO_COPY_CLASS(wxImageRefData) +}; + +wxImageRefData::wxImageRefData() +{ + m_width = 0; + m_height = 0; + m_data = + m_alpha = (unsigned char *) NULL; + + m_maskRed = 0; + m_maskGreen = 0; + m_maskBlue = 0; + m_hasMask = false; + + m_ok = false; + m_static = + m_staticAlpha = false; +} + +wxImageRefData::~wxImageRefData() +{ + if ( !m_static ) + free( m_data ); + if ( !m_staticAlpha ) + free( m_alpha ); +} + +wxList wxImage::sm_handlers; + +wxImage wxNullImage; + +//----------------------------------------------------------------------------- + +#define M_IMGDATA wx_static_cast(wxImageRefData*, m_refData) + +IMPLEMENT_DYNAMIC_CLASS(wxImage, wxObject) + +wxImage::wxImage( int width, int height, bool clear ) +{ + Create( width, height, clear ); +} + +wxImage::wxImage( int width, int height, unsigned char* data, bool static_data ) +{ + Create( width, height, data, static_data ); +} + +wxImage::wxImage( int width, int height, unsigned char* data, unsigned char* alpha, bool static_data ) +{ + Create( width, height, data, alpha, static_data ); +} + +wxImage::wxImage( const wxString& name, long type, int index ) +{ + LoadFile( name, type, index ); +} + +wxImage::wxImage( const wxString& name, const wxString& mimetype, int index ) +{ + LoadFile( name, mimetype, index ); +} + +#if wxUSE_STREAMS +wxImage::wxImage( wxInputStream& stream, long type, int index ) +{ + LoadFile( stream, type, index ); +} + +wxImage::wxImage( wxInputStream& stream, const wxString& mimetype, int index ) +{ + LoadFile( stream, mimetype, index ); +} +#endif // wxUSE_STREAMS + +wxImage::wxImage(const char* const* xpmData) +{ + Create(xpmData); +} + +bool wxImage::Create(const char* const* xpmData) +{ +#if wxUSE_XPM + UnRef(); + + wxXPMDecoder decoder; + (*this) = decoder.ReadData(xpmData); + return Ok(); +#else + return false; +#endif +} + +bool wxImage::Create( int width, int height, bool clear ) +{ + UnRef(); + + m_refData = new wxImageRefData(); + + M_IMGDATA->m_data = (unsigned char *) malloc( width*height*3 ); + if (!M_IMGDATA->m_data) + { + UnRef(); + return false; + } + + if (clear) + memset(M_IMGDATA->m_data, 0, width*height*3); + + M_IMGDATA->m_width = width; + M_IMGDATA->m_height = height; + M_IMGDATA->m_ok = true; + + return true; +} + +bool wxImage::Create( int width, int height, unsigned char* data, bool static_data ) +{ + UnRef(); + + wxCHECK_MSG( data, false, _T("NULL data in wxImage::Create") ); + + m_refData = new wxImageRefData(); + + M_IMGDATA->m_data = data; + M_IMGDATA->m_width = width; + M_IMGDATA->m_height = height; + M_IMGDATA->m_ok = true; + M_IMGDATA->m_static = static_data; + + return true; +} + +bool wxImage::Create( int width, int height, unsigned char* data, unsigned char* alpha, bool static_data ) +{ + UnRef(); + + wxCHECK_MSG( data, false, _T("NULL data in wxImage::Create") ); + + m_refData = new wxImageRefData(); + + M_IMGDATA->m_data = data; + M_IMGDATA->m_alpha = alpha; + M_IMGDATA->m_width = width; + M_IMGDATA->m_height = height; + M_IMGDATA->m_ok = true; + M_IMGDATA->m_static = static_data; + + return true; +} + +void wxImage::Destroy() +{ + UnRef(); +} + +wxObjectRefData* wxImage::CreateRefData() const +{ + return new wxImageRefData; +} + +wxObjectRefData* wxImage::CloneRefData(const wxObjectRefData* that) const +{ + const wxImageRefData* refData = wx_static_cast(const wxImageRefData*, that); + wxCHECK_MSG(refData->m_ok, NULL, wxT("invalid image") ); + + wxImageRefData* refData_new = new wxImageRefData; + refData_new->m_width = refData->m_width; + refData_new->m_height = refData->m_height; + refData_new->m_maskRed = refData->m_maskRed; + refData_new->m_maskGreen = refData->m_maskGreen; + refData_new->m_maskBlue = refData->m_maskBlue; + refData_new->m_hasMask = refData->m_hasMask; + refData_new->m_ok = true; + unsigned size = unsigned(refData->m_width) * unsigned(refData->m_height); + if (refData->m_alpha != NULL) + { + refData_new->m_alpha = (unsigned char*)malloc(size); + memcpy(refData_new->m_alpha, refData->m_alpha, size); + } + size *= 3; + refData_new->m_data = (unsigned char*)malloc(size); + memcpy(refData_new->m_data, refData->m_data, size); +#if wxUSE_PALETTE + refData_new->m_palette = refData->m_palette; +#endif + refData_new->m_optionNames = refData->m_optionNames; + refData_new->m_optionValues = refData->m_optionValues; + return refData_new; +} + +wxImage wxImage::Copy() const +{ + wxImage image; + + wxCHECK_MSG( Ok(), image, wxT("invalid image") ); + + image.m_refData = CloneRefData(m_refData); + + return image; +} + +wxImage wxImage::ShrinkBy( int xFactor , int yFactor ) const +{ + if( xFactor == 1 && yFactor == 1 ) + return *this; + + wxImage image; + + wxCHECK_MSG( Ok(), image, wxT("invalid image") ); + + // can't scale to/from 0 size + wxCHECK_MSG( (xFactor > 0) && (yFactor > 0), image, + wxT("invalid new image size") ); + + long old_height = M_IMGDATA->m_height, + old_width = M_IMGDATA->m_width; + + wxCHECK_MSG( (old_height > 0) && (old_width > 0), image, + wxT("invalid old image size") ); + + long width = old_width / xFactor ; + long height = old_height / yFactor ; + + image.Create( width, height, false ); + + char unsigned *data = image.GetData(); + + wxCHECK_MSG( data, image, wxT("unable to create image") ); + + bool hasMask = false ; + unsigned char maskRed = 0; + unsigned char maskGreen = 0; + unsigned char maskBlue =0 ; + + unsigned char *source_data = M_IMGDATA->m_data; + unsigned char *target_data = data; + unsigned char *source_alpha = 0 ; + unsigned char *target_alpha = 0 ; + if (M_IMGDATA->m_hasMask) + { + hasMask = true ; + maskRed = M_IMGDATA->m_maskRed; + maskGreen = M_IMGDATA->m_maskGreen; + maskBlue =M_IMGDATA->m_maskBlue ; + + image.SetMaskColour( M_IMGDATA->m_maskRed, + M_IMGDATA->m_maskGreen, + M_IMGDATA->m_maskBlue ); + } + else + { + source_alpha = M_IMGDATA->m_alpha ; + if ( source_alpha ) + { + image.SetAlpha() ; + target_alpha = image.GetAlpha() ; + } + } + + for (long y = 0; y < height; y++) + { + for (long x = 0; x < width; x++) + { + unsigned long avgRed = 0 ; + unsigned long avgGreen = 0; + unsigned long avgBlue = 0; + unsigned long avgAlpha = 0 ; + unsigned long counter = 0 ; + // determine average + for ( int y1 = 0 ; y1 < yFactor ; ++y1 ) + { + long y_offset = (y * yFactor + y1) * old_width; + for ( int x1 = 0 ; x1 < xFactor ; ++x1 ) + { + unsigned char *pixel = source_data + 3 * ( y_offset + x * xFactor + x1 ) ; + unsigned char red = pixel[0] ; + unsigned char green = pixel[1] ; + unsigned char blue = pixel[2] ; + unsigned char alpha = 255 ; + if ( source_alpha ) + alpha = *(source_alpha + y_offset + x * xFactor + x1) ; + if ( !hasMask || red != maskRed || green != maskGreen || blue != maskBlue ) + { + if ( alpha > 0 ) + { + avgRed += red ; + avgGreen += green ; + avgBlue += blue ; + } + avgAlpha += alpha ; + counter++ ; + } + } + } + if ( counter == 0 ) + { + *(target_data++) = M_IMGDATA->m_maskRed ; + *(target_data++) = M_IMGDATA->m_maskGreen ; + *(target_data++) = M_IMGDATA->m_maskBlue ; + } + else + { + if ( source_alpha ) + *(target_alpha++) = (unsigned char)(avgAlpha / counter ) ; + *(target_data++) = (unsigned char)(avgRed / counter); + *(target_data++) = (unsigned char)(avgGreen / counter); + *(target_data++) = (unsigned char)(avgBlue / counter); + } + } + } + + // In case this is a cursor, make sure the hotspot is scaled accordingly: + if ( HasOption(wxIMAGE_OPTION_CUR_HOTSPOT_X) ) + image.SetOption(wxIMAGE_OPTION_CUR_HOTSPOT_X, + (GetOptionInt(wxIMAGE_OPTION_CUR_HOTSPOT_X))/xFactor); + if ( HasOption(wxIMAGE_OPTION_CUR_HOTSPOT_Y) ) + image.SetOption(wxIMAGE_OPTION_CUR_HOTSPOT_Y, + (GetOptionInt(wxIMAGE_OPTION_CUR_HOTSPOT_Y))/yFactor); + + return image; +} + +wxImage wxImage::Scale( int width, int height, int quality ) const +{ + wxImage image; + + wxCHECK_MSG( Ok(), image, wxT("invalid image") ); + + // can't scale to/from 0 size + wxCHECK_MSG( (width > 0) && (height > 0), image, + wxT("invalid new image size") ); + + long old_height = M_IMGDATA->m_height, + old_width = M_IMGDATA->m_width; + wxCHECK_MSG( (old_height > 0) && (old_width > 0), image, + wxT("invalid old image size") ); + + // If the image's new width and height are the same as the original, no + // need to waste time or CPU cycles + if ( old_width == width && old_height == height ) + return *this; + + // Scale the image (...or more appropriately, resample the image) using + // either the high-quality or normal method as specified + if ( quality == wxIMAGE_QUALITY_HIGH ) + { + // We need to check whether we are downsampling or upsampling the image + if ( width < old_width && height < old_height ) + { + // Downsample the image using the box averaging method for best results + image = ResampleBox(width, height); + } + else + { + // For upsampling or other random/wierd image dimensions we'll use + // a bicubic b-spline scaling method + image = ResampleBicubic(width, height); + } + } + else // Default scaling method == simple pixel replication + { + if ( old_width % width == 0 && old_width >= width && + old_height % height == 0 && old_height >= height ) + { + return ShrinkBy( old_width / width , old_height / height ) ; + } + image.Create( width, height, false ); + + unsigned char *data = image.GetData(); + + wxCHECK_MSG( data, image, wxT("unable to create image") ); + + unsigned char *source_data = M_IMGDATA->m_data; + unsigned char *target_data = data; + unsigned char *source_alpha = 0 ; + unsigned char *target_alpha = 0 ; + + if ( !M_IMGDATA->m_hasMask ) + { + source_alpha = M_IMGDATA->m_alpha ; + if ( source_alpha ) + { + image.SetAlpha() ; + target_alpha = image.GetAlpha() ; + } + } + + long x_delta = (old_width<<16) / width; + long y_delta = (old_height<<16) / height; + + unsigned char* dest_pixel = target_data; + + long y = 0; + for ( long j = 0; j < height; j++ ) + { + unsigned char* src_line = &source_data[(y>>16)*old_width*3]; + unsigned char* src_alpha_line = source_alpha ? &source_alpha[(y>>16)*old_width] : 0 ; + + long x = 0; + for ( long i = 0; i < width; i++ ) + { + unsigned char* src_pixel = &src_line[(x>>16)*3]; + unsigned char* src_alpha_pixel = source_alpha ? &src_alpha_line[(x>>16)] : 0 ; + dest_pixel[0] = src_pixel[0]; + dest_pixel[1] = src_pixel[1]; + dest_pixel[2] = src_pixel[2]; + dest_pixel += 3; + if ( source_alpha ) + *(target_alpha++) = *src_alpha_pixel ; + x += x_delta; + } + + y += y_delta; + } + } + + // If the original image has a mask, apply the mask to the new image + if (M_IMGDATA->m_hasMask) + { + image.SetMaskColour( M_IMGDATA->m_maskRed, + M_IMGDATA->m_maskGreen, + M_IMGDATA->m_maskBlue ); + } + + // In case this is a cursor, make sure the hotspot is scaled accordingly: + if ( HasOption(wxIMAGE_OPTION_CUR_HOTSPOT_X) ) + image.SetOption(wxIMAGE_OPTION_CUR_HOTSPOT_X, + (GetOptionInt(wxIMAGE_OPTION_CUR_HOTSPOT_X)*width)/old_width); + if ( HasOption(wxIMAGE_OPTION_CUR_HOTSPOT_Y) ) + image.SetOption(wxIMAGE_OPTION_CUR_HOTSPOT_Y, + (GetOptionInt(wxIMAGE_OPTION_CUR_HOTSPOT_Y)*height)/old_height); + + return image; +} + +wxImage wxImage::ResampleBox(int width, int height) const +{ + // This function implements a simple pre-blur/box averaging method for + // downsampling that gives reasonably smooth results To scale the image + // down we will need to gather a grid of pixels of the size of the scale + // factor in each direction and then do an averaging of the pixels. + + wxImage ret_image(width, height, false); + + const double scale_factor_x = double(M_IMGDATA->m_width) / width; + const double scale_factor_y = double(M_IMGDATA->m_height) / height; + + const int scale_factor_x_2 = (int)(scale_factor_x / 2); + const int scale_factor_y_2 = (int)(scale_factor_y / 2); + + // If we want good-looking results we need to pre-blur the image a bit first + wxImage src_image(*this); + src_image = src_image.BlurHorizontal(scale_factor_x_2); + src_image = src_image.BlurVertical(scale_factor_y_2); + + unsigned char* src_data = src_image.GetData(); + unsigned char* src_alpha = src_image.GetAlpha(); + unsigned char* dst_data = ret_image.GetData(); + unsigned char* dst_alpha = NULL; + + if ( src_alpha ) + { + ret_image.SetAlpha(); + dst_alpha = ret_image.GetAlpha(); + } + + int averaged_pixels, src_pixel_index; + double sum_r, sum_g, sum_b, sum_a; + + for ( int y = 0; y < height; y++ ) // Destination image - Y direction + { + // Source pixel in the Y direction + int src_y = (int)(y * scale_factor_y); + + for ( int x = 0; x < width; x++ ) // Destination image - X direction + { + // Source pixel in the X direction + int src_x = (int)(x * scale_factor_x); + + // Box of pixels to average + averaged_pixels = 0; + sum_r = sum_g = sum_b = sum_a = 0.0; + + for ( int j = int(src_y - scale_factor_y/2.0 + 1); + j <= int(src_y + scale_factor_y_2); + j++ ) + { + // We don't care to average pixels that don't exist (edges) + if ( j < 0 || j > M_IMGDATA->m_height ) + continue; + + for ( int i = int(src_x - scale_factor_x/2.0 + 1); + i <= src_x + scale_factor_x_2; + i++ ) + { + // Don't average edge pixels + if ( i < 0 || i > M_IMGDATA->m_width ) + continue; + + // Calculate the actual index in our source pixels + src_pixel_index = src_y * M_IMGDATA->m_width + src_x; + + sum_r += src_data[src_pixel_index * 3 + 0]; + sum_g += src_data[src_pixel_index * 3 + 1]; + sum_b += src_data[src_pixel_index * 3 + 2]; + if ( src_alpha ) + sum_a += src_alpha[src_pixel_index]; + + averaged_pixels++; + } + } + + // Calculate the average from the sum and number of averaged pixels + dst_data[0] = (unsigned char)(sum_r / averaged_pixels); + dst_data[1] = (unsigned char)(sum_g / averaged_pixels); + dst_data[2] = (unsigned char)(sum_b / averaged_pixels); + dst_data += 3; + if ( src_alpha ) + *dst_alpha++ = (unsigned char)(sum_a / averaged_pixels); + } + } + + return ret_image; +} + +// The following two local functions are for the B-spline weighting of the +// bicubic sampling algorithm +static inline double spline_cube(double value) +{ + return value <= 0.0 ? 0.0 : value * value * value; +} + +static inline double spline_weight(double value) +{ + return (spline_cube(value + 2) - + 4 * spline_cube(value + 1) + + 6 * spline_cube(value) - + 4 * spline_cube(value - 1)) / 6; +} + +// This is the bicubic resampling algorithm +wxImage wxImage::ResampleBicubic(int width, int height) const +{ + // This function implements a Bicubic B-Spline algorithm for resampling. + // This method is certainly a little slower than wxImage's default pixel + // replication method, however for most reasonably sized images not being + // upsampled too much on a fairly average CPU this difference is hardly + // noticeable and the results are far more pleasing to look at. + // + // This particular bicubic algorithm does pixel weighting according to a + // B-Spline that basically implements a Gaussian bell-like weighting + // kernel. Because of this method the results may appear a bit blurry when + // upsampling by large factors. This is basically because a slight + // gaussian blur is being performed to get the smooth look of the upsampled + // image. + + // Edge pixels: 3-4 possible solutions + // - (Wrap/tile) Wrap the image, take the color value from the opposite + // side of the image. + // - (Mirror) Duplicate edge pixels, so that pixel at coordinate (2, n), + // where n is nonpositive, will have the value of (2, 1). + // - (Ignore) Simply ignore the edge pixels and apply the kernel only to + // pixels which do have all neighbours. + // - (Clamp) Choose the nearest pixel along the border. This takes the + // border pixels and extends them out to infinity. + // + // NOTE: below the y_offset and x_offset variables are being set for edge + // pixels using the "Mirror" method mentioned above + + wxImage ret_image; + + ret_image.Create(width, height, false); + + unsigned char* src_data = M_IMGDATA->m_data; + unsigned char* src_alpha = M_IMGDATA->m_alpha; + unsigned char* dst_data = ret_image.GetData(); + unsigned char* dst_alpha = NULL; + + if ( src_alpha ) + { + ret_image.SetAlpha(); + dst_alpha = ret_image.GetAlpha(); + } + + for ( int dsty = 0; dsty < height; dsty++ ) + { + // We need to calculate the source pixel to interpolate from - Y-axis + double srcpixy = double(dsty * M_IMGDATA->m_height) / height; + double dy = srcpixy - (int)srcpixy; + + for ( int dstx = 0; dstx < width; dstx++ ) + { + // X-axis of pixel to interpolate from + double srcpixx = double(dstx * M_IMGDATA->m_width) / width; + double dx = srcpixx - (int)srcpixx; + + // Sums for each color channel + double sum_r = 0, sum_g = 0, sum_b = 0, sum_a = 0; + + // Here we actually determine the RGBA values for the destination pixel + for ( int k = -1; k <= 2; k++ ) + { + // Y offset + int y_offset = srcpixy + k < 0.0 + ? 0 + : srcpixy + k >= M_IMGDATA->m_height + ? M_IMGDATA->m_height - 1 + : (int)(srcpixy + k); + + // Loop across the X axis + for ( int i = -1; i <= 2; i++ ) + { + // X offset + int x_offset = srcpixx + i < 0.0 + ? 0 + : srcpixx + i >= M_IMGDATA->m_width + ? M_IMGDATA->m_width - 1 + : (int)(srcpixx + i); + + // Calculate the exact position where the source data + // should be pulled from based on the x_offset and y_offset + int src_pixel_index = y_offset*M_IMGDATA->m_width + x_offset; + + // Calculate the weight for the specified pixel according + // to the bicubic b-spline kernel we're using for + // interpolation + double + pixel_weight = spline_weight(i - dx)*spline_weight(k - dy); + + // Create a sum of all velues for each color channel + // adjusted for the pixel's calculated weight + sum_r += src_data[src_pixel_index * 3 + 0] * pixel_weight; + sum_g += src_data[src_pixel_index * 3 + 1] * pixel_weight; + sum_b += src_data[src_pixel_index * 3 + 2] * pixel_weight; + if ( src_alpha ) + sum_a += src_alpha[src_pixel_index] * pixel_weight; + } + } + + // Put the data into the destination image. The summed values are + // of double data type and are rounded here for accuracy + dst_data[0] = (unsigned char)(sum_r + 0.5); + dst_data[1] = (unsigned char)(sum_g + 0.5); + dst_data[2] = (unsigned char)(sum_b + 0.5); + dst_data += 3; + + if ( src_alpha ) + *dst_alpha++ = (unsigned char)sum_a; + } + } + + return ret_image; +} + +// Blur in the horizontal direction +wxImage wxImage::BlurHorizontal(int blurRadius) +{ + wxImage ret_image; + ret_image.Create(M_IMGDATA->m_width, M_IMGDATA->m_height, false); + + unsigned char* src_data = M_IMGDATA->m_data; + unsigned char* dst_data = ret_image.GetData(); + unsigned char* src_alpha = M_IMGDATA->m_alpha; + unsigned char* dst_alpha = NULL; + + // Check for a mask or alpha + if ( M_IMGDATA->m_hasMask ) + { + ret_image.SetMaskColour(M_IMGDATA->m_maskRed, + M_IMGDATA->m_maskGreen, + M_IMGDATA->m_maskBlue); + } + else + { + if ( src_alpha ) + { + ret_image.SetAlpha(); + dst_alpha = ret_image.GetAlpha(); + } + } + + // number of pixels we average over + const int blurArea = blurRadius*2 + 1; + + // Horizontal blurring algorithm - average all pixels in the specified blur + // radius in the X or horizontal direction + for ( int y = 0; y < M_IMGDATA->m_height; y++ ) + { + // Variables used in the blurring algorithm + long sum_r = 0, + sum_g = 0, + sum_b = 0, + sum_a = 0; + + long pixel_idx; + const unsigned char *src; + unsigned char *dst; + + // Calculate the average of all pixels in the blur radius for the first + // pixel of the row + for ( int kernel_x = -blurRadius; kernel_x <= blurRadius; kernel_x++ ) + { + // To deal with the pixels at the start of a row so it's not + // grabbing GOK values from memory at negative indices of the + // image's data or grabbing from the previous row + if ( kernel_x < 0 ) + pixel_idx = y * M_IMGDATA->m_width; + else + pixel_idx = kernel_x + y * M_IMGDATA->m_width; + + src = src_data + pixel_idx*3; + sum_r += src[0]; + sum_g += src[1]; + sum_b += src[2]; + if ( src_alpha ) + sum_a += src_alpha[pixel_idx]; + } + + dst = dst_data + y * M_IMGDATA->m_width*3; + dst[0] = (unsigned char)(sum_r / blurArea); + dst[1] = (unsigned char)(sum_g / blurArea); + dst[2] = (unsigned char)(sum_b / blurArea); + if ( src_alpha ) + dst_alpha[y * M_IMGDATA->m_width] = (unsigned char)(sum_a / blurArea); + + // Now average the values of the rest of the pixels by just moving the + // blur radius box along the row + for ( int x = 1; x < M_IMGDATA->m_width; x++ ) + { + // Take care of edge pixels on the left edge by essentially + // duplicating the edge pixel + if ( x - blurRadius - 1 < 0 ) + pixel_idx = y * M_IMGDATA->m_width; + else + pixel_idx = (x - blurRadius - 1) + y * M_IMGDATA->m_width; + + // Subtract the value of the pixel at the left side of the blur + // radius box + src = src_data + pixel_idx*3; + sum_r -= src[0]; + sum_g -= src[1]; + sum_b -= src[2]; + if ( src_alpha ) + sum_a -= src_alpha[pixel_idx]; + + // Take care of edge pixels on the right edge + if ( x + blurRadius > M_IMGDATA->m_width - 1 ) + pixel_idx = M_IMGDATA->m_width - 1 + y * M_IMGDATA->m_width; + else + pixel_idx = x + blurRadius + y * M_IMGDATA->m_width; + + // Add the value of the pixel being added to the end of our box + src = src_data + pixel_idx*3; + sum_r += src[0]; + sum_g += src[1]; + sum_b += src[2]; + if ( src_alpha ) + sum_a += src_alpha[pixel_idx]; + + // Save off the averaged data + dst = dst_data + x*3 + y*M_IMGDATA->m_width*3; + dst[0] = (unsigned char)(sum_r / blurArea); + dst[1] = (unsigned char)(sum_g / blurArea); + dst[2] = (unsigned char)(sum_b / blurArea); + if ( src_alpha ) + dst_alpha[x + y * M_IMGDATA->m_width] = (unsigned char)(sum_a / blurArea); + } + } + + return ret_image; +} + +// Blur in the vertical direction +wxImage wxImage::BlurVertical(int blurRadius) +{ + wxImage ret_image; + ret_image.Create(M_IMGDATA->m_width, M_IMGDATA->m_height, false); + + unsigned char* src_data = M_IMGDATA->m_data; + unsigned char* dst_data = ret_image.GetData(); + unsigned char* src_alpha = M_IMGDATA->m_alpha; + unsigned char* dst_alpha = NULL; + + // Check for a mask or alpha + if ( M_IMGDATA->m_hasMask ) + { + ret_image.SetMaskColour(M_IMGDATA->m_maskRed, + M_IMGDATA->m_maskGreen, + M_IMGDATA->m_maskBlue); + } + else + { + if ( src_alpha ) + { + ret_image.SetAlpha(); + dst_alpha = ret_image.GetAlpha(); + } + } + + // number of pixels we average over + const int blurArea = blurRadius*2 + 1; + + // Vertical blurring algorithm - same as horizontal but switched the + // opposite direction + for ( int x = 0; x < M_IMGDATA->m_width; x++ ) + { + // Variables used in the blurring algorithm + long sum_r = 0, + sum_g = 0, + sum_b = 0, + sum_a = 0; + + long pixel_idx; + const unsigned char *src; + unsigned char *dst; + + // Calculate the average of all pixels in our blur radius box for the + // first pixel of the column + for ( int kernel_y = -blurRadius; kernel_y <= blurRadius; kernel_y++ ) + { + // To deal with the pixels at the start of a column so it's not + // grabbing GOK values from memory at negative indices of the + // image's data or grabbing from the previous column + if ( kernel_y < 0 ) + pixel_idx = x; + else + pixel_idx = x + kernel_y * M_IMGDATA->m_width; + + src = src_data + pixel_idx*3; + sum_r += src[0]; + sum_g += src[1]; + sum_b += src[2]; + if ( src_alpha ) + sum_a += src_alpha[pixel_idx]; + } + + dst = dst_data + x*3; + dst[0] = (unsigned char)(sum_r / blurArea); + dst[1] = (unsigned char)(sum_g / blurArea); + dst[2] = (unsigned char)(sum_b / blurArea); + if ( src_alpha ) + dst_alpha[x] = (unsigned char)(sum_a / blurArea); + + // Now average the values of the rest of the pixels by just moving the + // box along the column from top to bottom + for ( int y = 1; y < M_IMGDATA->m_height; y++ ) + { + // Take care of pixels that would be beyond the top edge by + // duplicating the top edge pixel for the column + if ( y - blurRadius - 1 < 0 ) + pixel_idx = x; + else + pixel_idx = x + (y - blurRadius - 1) * M_IMGDATA->m_width; + + // Subtract the value of the pixel at the top of our blur radius box + src = src_data + pixel_idx*3; + sum_r -= src[0]; + sum_g -= src[1]; + sum_b -= src[2]; + if ( src_alpha ) + sum_a -= src_alpha[pixel_idx]; + + // Take care of the pixels that would be beyond the bottom edge of + // the image similar to the top edge + if ( y + blurRadius > M_IMGDATA->m_height - 1 ) + pixel_idx = x + (M_IMGDATA->m_height - 1) * M_IMGDATA->m_width; + else + pixel_idx = x + (blurRadius + y) * M_IMGDATA->m_width; + + // Add the value of the pixel being added to the end of our box + src = src_data + pixel_idx*3; + sum_r += src[0]; + sum_g += src[1]; + sum_b += src[2]; + if ( src_alpha ) + sum_a += src_alpha[pixel_idx]; + + // Save off the averaged data + dst = dst_data + (x + y * M_IMGDATA->m_width) * 3; + dst[0] = (unsigned char)(sum_r / blurArea); + dst[1] = (unsigned char)(sum_g / blurArea); + dst[2] = (unsigned char)(sum_b / blurArea); + if ( src_alpha ) + dst_alpha[x + y * M_IMGDATA->m_width] = (unsigned char)(sum_a / blurArea); + } + } + + return ret_image; +} + +// The new blur function +wxImage wxImage::Blur(int blurRadius) +{ + wxImage ret_image; + ret_image.Create(M_IMGDATA->m_width, M_IMGDATA->m_height, false); + + // Blur the image in each direction + ret_image = BlurHorizontal(blurRadius); + ret_image = ret_image.BlurVertical(blurRadius); + + return ret_image; +} + +wxImage wxImage::Rotate90( bool clockwise ) const +{ + wxImage image; + + wxCHECK_MSG( Ok(), image, wxT("invalid image") ); + + image.Create( M_IMGDATA->m_height, M_IMGDATA->m_width, false ); + + unsigned char *data = image.GetData(); + + wxCHECK_MSG( data, image, wxT("unable to create image") ); + + unsigned char *source_data = M_IMGDATA->m_data; + unsigned char *target_data; + unsigned char *alpha_data = 0 ; + unsigned char *source_alpha = 0 ; + unsigned char *target_alpha = 0 ; + + if (M_IMGDATA->m_hasMask) + { + image.SetMaskColour( M_IMGDATA->m_maskRed, M_IMGDATA->m_maskGreen, M_IMGDATA->m_maskBlue ); + } + else + { + source_alpha = M_IMGDATA->m_alpha ; + if ( source_alpha ) + { + image.SetAlpha() ; + alpha_data = image.GetAlpha() ; + } + } + + long height = M_IMGDATA->m_height; + long width = M_IMGDATA->m_width; + + for (long j = 0; j < height; j++) + { + for (long i = 0; i < width; i++) + { + if (clockwise) + { + target_data = data + (((i+1)*height) - j - 1)*3; + if(source_alpha) + target_alpha = alpha_data + (((i+1)*height) - j - 1); + } + else + { + target_data = data + ((height*(width-1)) + j - (i*height))*3; + if(source_alpha) + target_alpha = alpha_data + ((height*(width-1)) + j - (i*height)); + } + memcpy( target_data, source_data, 3 ); + source_data += 3; + + if(source_alpha) + { + memcpy( target_alpha, source_alpha, 1 ); + source_alpha += 1; + } + } + } + + return image; +} + +wxImage wxImage::Mirror( bool horizontally ) const +{ + wxImage image; + + wxCHECK_MSG( Ok(), image, wxT("invalid image") ); + + image.Create( M_IMGDATA->m_width, M_IMGDATA->m_height, false ); + + unsigned char *data = image.GetData(); + unsigned char *alpha = NULL; + + wxCHECK_MSG( data, image, wxT("unable to create image") ); + + if (M_IMGDATA->m_alpha != NULL) { + image.SetAlpha(); + alpha = image.GetAlpha(); + wxCHECK_MSG( alpha, image, wxT("unable to create alpha channel") ); + } + + if (M_IMGDATA->m_hasMask) + image.SetMaskColour( M_IMGDATA->m_maskRed, M_IMGDATA->m_maskGreen, M_IMGDATA->m_maskBlue ); + + long height = M_IMGDATA->m_height; + long width = M_IMGDATA->m_width; + + unsigned char *source_data = M_IMGDATA->m_data; + unsigned char *target_data; + + if (horizontally) + { + for (long j = 0; j < height; j++) + { + data += width*3; + target_data = data-3; + for (long i = 0; i < width; i++) + { + memcpy( target_data, source_data, 3 ); + source_data += 3; + target_data -= 3; + } + } + + if (alpha != NULL) + { + // src_alpha starts at the first pixel and increases by 1 after each step + // (a step here is the copy of the alpha value of one pixel) + const unsigned char *src_alpha = M_IMGDATA->m_alpha; + // dest_alpha starts just beyond the first line, decreases before each step, + // and after each line is finished, increases by 2 widths (skipping the line + // just copied and the line that will be copied next) + unsigned char *dest_alpha = alpha + width; + + for (long jj = 0; jj < height; ++jj) + { + for (long i = 0; i < width; ++i) { + *(--dest_alpha) = *(src_alpha++); // copy one pixel + } + dest_alpha += 2 * width; // advance beyond the end of the next line + } + } + } + else + { + for (long i = 0; i < height; i++) + { + target_data = data + 3*width*(height-1-i); + memcpy( target_data, source_data, (size_t)3*width ); + source_data += 3*width; + } + + if (alpha != NULL) + { + // src_alpha starts at the first pixel and increases by 1 width after each step + // (a step here is the copy of the alpha channel of an entire line) + const unsigned char *src_alpha = M_IMGDATA->m_alpha; + // dest_alpha starts just beyond the last line (beyond the whole image) + // and decreases by 1 width before each step + unsigned char *dest_alpha = alpha + width * height; + + for (long jj = 0; jj < height; ++jj) + { + dest_alpha -= width; + memcpy( dest_alpha, src_alpha, (size_t)width ); + src_alpha += width; + } + } + } + + return image; +} + +wxImage wxImage::GetSubImage( const wxRect &rect ) const +{ + wxImage image; + + wxCHECK_MSG( Ok(), image, wxT("invalid image") ); + + wxCHECK_MSG( (rect.GetLeft()>=0) && (rect.GetTop()>=0) && + (rect.GetRight()<=GetWidth()) && (rect.GetBottom()<=GetHeight()), + image, wxT("invalid subimage size") ); + + const int subwidth = rect.GetWidth(); + const int subheight = rect.GetHeight(); + + image.Create( subwidth, subheight, false ); + + const unsigned char *src_data = GetData(); + const unsigned char *src_alpha = M_IMGDATA->m_alpha; + unsigned char *subdata = image.GetData(); + unsigned char *subalpha = NULL; + + wxCHECK_MSG( subdata, image, wxT("unable to create image") ); + + if (src_alpha != NULL) { + image.SetAlpha(); + subalpha = image.GetAlpha(); + wxCHECK_MSG( subalpha, image, wxT("unable to create alpha channel")); + } + + if (M_IMGDATA->m_hasMask) + image.SetMaskColour( M_IMGDATA->m_maskRed, M_IMGDATA->m_maskGreen, M_IMGDATA->m_maskBlue ); + + const int width = GetWidth(); + const int pixsoff = rect.GetLeft() + width * rect.GetTop(); + + src_data += 3 * pixsoff; + src_alpha += pixsoff; // won't be used if was NULL, so this is ok + + for (long j = 0; j < subheight; ++j) + { + memcpy( subdata, src_data, 3 * subwidth ); + subdata += 3 * subwidth; + src_data += 3 * width; + if (subalpha != NULL) { + memcpy( subalpha, src_alpha, subwidth ); + subalpha += subwidth; + src_alpha += width; + } + } + + return image; +} + +wxImage wxImage::Size( const wxSize& size, const wxPoint& pos, + int r_, int g_, int b_ ) const +{ + wxImage image; + + wxCHECK_MSG( Ok(), image, wxT("invalid image") ); + wxCHECK_MSG( (size.GetWidth() > 0) && (size.GetHeight() > 0), image, wxT("invalid size") ); + + int width = GetWidth(), height = GetHeight(); + image.Create(size.GetWidth(), size.GetHeight(), false); + + unsigned char r = (unsigned char)r_; + unsigned char g = (unsigned char)g_; + unsigned char b = (unsigned char)b_; + if ((r_ == -1) && (g_ == -1) && (b_ == -1)) + { + GetOrFindMaskColour( &r, &g, &b ); + image.SetMaskColour(r, g, b); + } + + image.SetRGB(wxRect(), r, g, b); + + wxRect subRect(pos.x, pos.y, width, height); + wxRect finalRect(0, 0, size.GetWidth(), size.GetHeight()); + if (pos.x < 0) + finalRect.width -= pos.x; + if (pos.y < 0) + finalRect.height -= pos.y; + + subRect.Intersect(finalRect); + + if (!subRect.IsEmpty()) + { + if ((subRect.GetWidth() == width) && (subRect.GetHeight() == height)) + image.Paste(*this, pos.x, pos.y); + else + image.Paste(GetSubImage(subRect), pos.x, pos.y); + } + + return image; +} + +void wxImage::Paste( const wxImage &image, int x, int y ) +{ + wxCHECK_RET( Ok(), wxT("invalid image") ); + wxCHECK_RET( image.Ok(), wxT("invalid image") ); + + AllocExclusive(); + + int xx = 0; + int yy = 0; + int width = image.GetWidth(); + int height = image.GetHeight(); + + if (x < 0) + { + xx = -x; + width += x; + } + if (y < 0) + { + yy = -y; + height += y; + } + + if ((x+xx)+width > M_IMGDATA->m_width) + width = M_IMGDATA->m_width - (x+xx); + if ((y+yy)+height > M_IMGDATA->m_height) + height = M_IMGDATA->m_height - (y+yy); + + if (width < 1) return; + if (height < 1) return; + + if ((!HasMask() && !image.HasMask()) || + (HasMask() && !image.HasMask()) || + ((HasMask() && image.HasMask() && + (GetMaskRed()==image.GetMaskRed()) && + (GetMaskGreen()==image.GetMaskGreen()) && + (GetMaskBlue()==image.GetMaskBlue())))) + { + width *= 3; + unsigned char* source_data = image.GetData() + xx*3 + yy*3*image.GetWidth(); + int source_step = image.GetWidth()*3; + + unsigned char* target_data = GetData() + (x+xx)*3 + (y+yy)*3*M_IMGDATA->m_width; + int target_step = M_IMGDATA->m_width*3; + for (int j = 0; j < height; j++) + { + memcpy( target_data, source_data, width ); + source_data += source_step; + target_data += target_step; + } + return; + } + + if (!HasMask() && image.HasMask()) + { + unsigned char r = image.GetMaskRed(); + unsigned char g = image.GetMaskGreen(); + unsigned char b = image.GetMaskBlue(); + + width *= 3; + unsigned char* source_data = image.GetData() + xx*3 + yy*3*image.GetWidth(); + int source_step = image.GetWidth()*3; + + unsigned char* target_data = GetData() + (x+xx)*3 + (y+yy)*3*M_IMGDATA->m_width; + int target_step = M_IMGDATA->m_width*3; + + for (int j = 0; j < height; j++) + { + for (int i = 0; i < width; i+=3) + { + if ((source_data[i] != r) || + (source_data[i+1] != g) || + (source_data[i+2] != b)) + { + memcpy( target_data+i, source_data+i, 3 ); + } + } + source_data += source_step; + target_data += target_step; + } + } +} + +void wxImage::Replace( unsigned char r1, unsigned char g1, unsigned char b1, + unsigned char r2, unsigned char g2, unsigned char b2 ) +{ + wxCHECK_RET( Ok(), wxT("invalid image") ); + + AllocExclusive(); + + unsigned char *data = GetData(); + + const int w = GetWidth(); + const int h = GetHeight(); + + for (int j = 0; j < h; j++) + for (int i = 0; i < w; i++) + { + if ((data[0] == r1) && (data[1] == g1) && (data[2] == b1)) + { + data[0] = r2; + data[1] = g2; + data[2] = b2; + } + data += 3; + } +} + +wxImage wxImage::ConvertToGreyscale( double lr, double lg, double lb ) const +{ + wxImage image; + + wxCHECK_MSG( Ok(), image, wxT("invalid image") ); + + image.Create(M_IMGDATA->m_width, M_IMGDATA->m_height, false); + + unsigned char *dest = image.GetData(); + + wxCHECK_MSG( dest, image, wxT("unable to create image") ); + + unsigned char *src = M_IMGDATA->m_data; + bool hasMask = M_IMGDATA->m_hasMask; + unsigned char maskRed = M_IMGDATA->m_maskRed; + unsigned char maskGreen = M_IMGDATA->m_maskGreen; + unsigned char maskBlue = M_IMGDATA->m_maskBlue; + + if ( hasMask ) + image.SetMaskColour(maskRed, maskGreen, maskBlue); + + const long size = M_IMGDATA->m_width * M_IMGDATA->m_height; + for ( long i = 0; i < size; i++, src += 3, dest += 3 ) + { + // don't modify the mask + if ( hasMask && src[0] == maskRed && src[1] == maskGreen && src[2] == maskBlue ) + { + memcpy(dest, src, 3); + } + else + { + // calculate the luma + double luma = (src[0] * lr + src[1] * lg + src[2] * lb) + 0.5; + dest[0] = dest[1] = dest[2] = wx_static_cast(unsigned char, luma); + } + } + + // copy the alpha channel, if any + if (HasAlpha()) + { + const size_t alphaSize = GetWidth() * GetHeight(); + unsigned char *alpha = (unsigned char*)malloc(alphaSize); + memcpy(alpha, GetAlpha(), alphaSize); + image.InitAlpha(); + image.SetAlpha(alpha); + } + + return image; +} + +wxImage wxImage::ConvertToMono( unsigned char r, unsigned char g, unsigned char b ) const +{ + wxImage image; + + wxCHECK_MSG( Ok(), image, wxT("invalid image") ); + + image.Create( M_IMGDATA->m_width, M_IMGDATA->m_height, false ); + + unsigned char *data = image.GetData(); + + wxCHECK_MSG( data, image, wxT("unable to create image") ); + + if (M_IMGDATA->m_hasMask) + { + if (M_IMGDATA->m_maskRed == r && M_IMGDATA->m_maskGreen == g && + M_IMGDATA->m_maskBlue == b) + image.SetMaskColour( 255, 255, 255 ); + else + image.SetMaskColour( 0, 0, 0 ); + } + + long size = M_IMGDATA->m_height * M_IMGDATA->m_width; + + unsigned char *srcd = M_IMGDATA->m_data; + unsigned char *tard = image.GetData(); + + for ( long i = 0; i < size; i++, srcd += 3, tard += 3 ) + { + if (srcd[0] == r && srcd[1] == g && srcd[2] == b) + tard[0] = tard[1] = tard[2] = 255; + else + tard[0] = tard[1] = tard[2] = 0; + } + + return image; +} + +int wxImage::GetWidth() const +{ + wxCHECK_MSG( Ok(), 0, wxT("invalid image") ); + + return M_IMGDATA->m_width; +} + +int wxImage::GetHeight() const +{ + wxCHECK_MSG( Ok(), 0, wxT("invalid image") ); + + return M_IMGDATA->m_height; +} + +long wxImage::XYToIndex(int x, int y) const +{ + if ( Ok() && + x >= 0 && y >= 0 && + x < M_IMGDATA->m_width && y < M_IMGDATA->m_height ) + { + return y*M_IMGDATA->m_width + x; + } + + return -1; +} + +void wxImage::SetRGB( int x, int y, unsigned char r, unsigned char g, unsigned char b ) +{ + long pos = XYToIndex(x, y); + wxCHECK_RET( pos != -1, wxT("invalid image coordinates") ); + + AllocExclusive(); + + pos *= 3; + + M_IMGDATA->m_data[ pos ] = r; + M_IMGDATA->m_data[ pos+1 ] = g; + M_IMGDATA->m_data[ pos+2 ] = b; +} + +void wxImage::SetRGB( const wxRect& rect_, unsigned char r, unsigned char g, unsigned char b ) +{ + wxCHECK_RET( Ok(), wxT("invalid image") ); + + AllocExclusive(); + + wxRect rect(rect_); + wxRect imageRect(0, 0, GetWidth(), GetHeight()); + if ( rect == wxRect() ) + { + rect = imageRect; + } + else + { + wxCHECK_RET( imageRect.Contains(rect.GetTopLeft()) && + imageRect.Contains(rect.GetBottomRight()), + wxT("invalid bounding rectangle") ); + } + + int x1 = rect.GetLeft(), + y1 = rect.GetTop(), + x2 = rect.GetRight() + 1, + y2 = rect.GetBottom() + 1; + + unsigned char *data wxDUMMY_INITIALIZE(NULL); + int x, y, width = GetWidth(); + for (y = y1; y < y2; y++) + { + data = M_IMGDATA->m_data + (y*width + x1)*3; + for (x = x1; x < x2; x++) + { + *data++ = r; + *data++ = g; + *data++ = b; + } + } +} + +unsigned char wxImage::GetRed( int x, int y ) const +{ + long pos = XYToIndex(x, y); + wxCHECK_MSG( pos != -1, 0, wxT("invalid image coordinates") ); + + pos *= 3; + + return M_IMGDATA->m_data[pos]; +} + +unsigned char wxImage::GetGreen( int x, int y ) const +{ + long pos = XYToIndex(x, y); + wxCHECK_MSG( pos != -1, 0, wxT("invalid image coordinates") ); + + pos *= 3; + + return M_IMGDATA->m_data[pos+1]; +} + +unsigned char wxImage::GetBlue( int x, int y ) const +{ + long pos = XYToIndex(x, y); + wxCHECK_MSG( pos != -1, 0, wxT("invalid image coordinates") ); + + pos *= 3; + + return M_IMGDATA->m_data[pos+2]; +} + +bool wxImage::IsOk() const +{ + // image of 0 width or height can't be considered ok - at least because it + // causes crashes in ConvertToBitmap() if we don't catch it in time + wxImageRefData *data = M_IMGDATA; + return data && data->m_ok && data->m_width && data->m_height; +} + +unsigned char *wxImage::GetData() const +{ + wxCHECK_MSG( Ok(), (unsigned char *)NULL, wxT("invalid image") ); + + return M_IMGDATA->m_data; +} + +void wxImage::SetData( unsigned char *data, bool static_data ) +{ + wxCHECK_RET( Ok(), wxT("invalid image") ); + + wxImageRefData *newRefData = new wxImageRefData(); + + newRefData->m_width = M_IMGDATA->m_width; + newRefData->m_height = M_IMGDATA->m_height; + newRefData->m_data = data; + newRefData->m_ok = true; + newRefData->m_maskRed = M_IMGDATA->m_maskRed; + newRefData->m_maskGreen = M_IMGDATA->m_maskGreen; + newRefData->m_maskBlue = M_IMGDATA->m_maskBlue; + newRefData->m_hasMask = M_IMGDATA->m_hasMask; + newRefData->m_static = static_data; + + UnRef(); + + m_refData = newRefData; +} + +void wxImage::SetData( unsigned char *data, int new_width, int new_height, bool static_data ) +{ + wxImageRefData *newRefData = new wxImageRefData(); + + if (m_refData) + { + newRefData->m_width = new_width; + newRefData->m_height = new_height; + newRefData->m_data = data; + newRefData->m_ok = true; + newRefData->m_maskRed = M_IMGDATA->m_maskRed; + newRefData->m_maskGreen = M_IMGDATA->m_maskGreen; + newRefData->m_maskBlue = M_IMGDATA->m_maskBlue; + newRefData->m_hasMask = M_IMGDATA->m_hasMask; + } + else + { + newRefData->m_width = new_width; + newRefData->m_height = new_height; + newRefData->m_data = data; + newRefData->m_ok = true; + } + newRefData->m_static = static_data; + + UnRef(); + + m_refData = newRefData; +} + +// ---------------------------------------------------------------------------- +// alpha channel support +// ---------------------------------------------------------------------------- + +void wxImage::SetAlpha(int x, int y, unsigned char alpha) +{ + wxCHECK_RET( HasAlpha(), wxT("no alpha channel") ); + + long pos = XYToIndex(x, y); + wxCHECK_RET( pos != -1, wxT("invalid image coordinates") ); + + AllocExclusive(); + + M_IMGDATA->m_alpha[pos] = alpha; +} + +unsigned char wxImage::GetAlpha(int x, int y) const +{ + wxCHECK_MSG( HasAlpha(), 0, wxT("no alpha channel") ); + + long pos = XYToIndex(x, y); + wxCHECK_MSG( pos != -1, 0, wxT("invalid image coordinates") ); + + return M_IMGDATA->m_alpha[pos]; +} + +bool +wxImage::ConvertColourToAlpha(unsigned char r, unsigned char g, unsigned char b) +{ + SetAlpha(NULL); + + const int w = M_IMGDATA->m_width; + const int h = M_IMGDATA->m_height; + + unsigned char *alpha = GetAlpha(); + unsigned char *data = GetData(); + + for ( int y = 0; y < h; y++ ) + { + for ( int x = 0; x < w; x++ ) + { + *alpha++ = *data; + *data++ = r; + *data++ = g; + *data++ = b; + } + } + + return true; +} + +void wxImage::SetAlpha( unsigned char *alpha, bool static_data ) +{ + wxCHECK_RET( Ok(), wxT("invalid image") ); + + AllocExclusive(); + + if ( !alpha ) + { + alpha = (unsigned char *)malloc(M_IMGDATA->m_width*M_IMGDATA->m_height); + } + + if( !M_IMGDATA->m_staticAlpha ) + free(M_IMGDATA->m_alpha); + + M_IMGDATA->m_alpha = alpha; + M_IMGDATA->m_staticAlpha = static_data; +} + +unsigned char *wxImage::GetAlpha() const +{ + wxCHECK_MSG( Ok(), (unsigned char *)NULL, wxT("invalid image") ); + + return M_IMGDATA->m_alpha; +} + +void wxImage::InitAlpha() +{ + wxCHECK_RET( !HasAlpha(), wxT("image already has an alpha channel") ); + + // initialize memory for alpha channel + SetAlpha(); + + unsigned char *alpha = M_IMGDATA->m_alpha; + const size_t lenAlpha = M_IMGDATA->m_width * M_IMGDATA->m_height; + + if ( HasMask() ) + { + // use the mask to initialize the alpha channel. + const unsigned char * const alphaEnd = alpha + lenAlpha; + + const unsigned char mr = M_IMGDATA->m_maskRed; + const unsigned char mg = M_IMGDATA->m_maskGreen; + const unsigned char mb = M_IMGDATA->m_maskBlue; + for ( unsigned char *src = M_IMGDATA->m_data; + alpha < alphaEnd; + src += 3, alpha++ ) + { + *alpha = (src[0] == mr && src[1] == mg && src[2] == mb) + ? wxIMAGE_ALPHA_TRANSPARENT + : wxIMAGE_ALPHA_OPAQUE; + } + + M_IMGDATA->m_hasMask = false; + } + else // no mask + { + // make the image fully opaque + memset(alpha, wxIMAGE_ALPHA_OPAQUE, lenAlpha); + } +} + +// ---------------------------------------------------------------------------- +// mask support +// ---------------------------------------------------------------------------- + +void wxImage::SetMaskColour( unsigned char r, unsigned char g, unsigned char b ) +{ + wxCHECK_RET( Ok(), wxT("invalid image") ); + + AllocExclusive(); + + M_IMGDATA->m_maskRed = r; + M_IMGDATA->m_maskGreen = g; + M_IMGDATA->m_maskBlue = b; + M_IMGDATA->m_hasMask = true; +} + +bool wxImage::GetOrFindMaskColour( unsigned char *r, unsigned char *g, unsigned char *b ) const +{ + wxCHECK_MSG( Ok(), false, wxT("invalid image") ); + + if (M_IMGDATA->m_hasMask) + { + if (r) *r = M_IMGDATA->m_maskRed; + if (g) *g = M_IMGDATA->m_maskGreen; + if (b) *b = M_IMGDATA->m_maskBlue; + return true; + } + else + { + FindFirstUnusedColour(r, g, b); + return false; + } +} + +unsigned char wxImage::GetMaskRed() const +{ + wxCHECK_MSG( Ok(), 0, wxT("invalid image") ); + + return M_IMGDATA->m_maskRed; +} + +unsigned char wxImage::GetMaskGreen() const +{ + wxCHECK_MSG( Ok(), 0, wxT("invalid image") ); + + return M_IMGDATA->m_maskGreen; +} + +unsigned char wxImage::GetMaskBlue() const +{ + wxCHECK_MSG( Ok(), 0, wxT("invalid image") ); + + return M_IMGDATA->m_maskBlue; +} + +void wxImage::SetMask( bool mask ) +{ + wxCHECK_RET( Ok(), wxT("invalid image") ); + + AllocExclusive(); + + M_IMGDATA->m_hasMask = mask; +} + +bool wxImage::HasMask() const +{ + wxCHECK_MSG( Ok(), false, wxT("invalid image") ); + + return M_IMGDATA->m_hasMask; +} + +bool wxImage::IsTransparent(int x, int y, unsigned char threshold) const +{ + long pos = XYToIndex(x, y); + wxCHECK_MSG( pos != -1, false, wxT("invalid image coordinates") ); + + // check mask + if ( M_IMGDATA->m_hasMask ) + { + const unsigned char *p = M_IMGDATA->m_data + 3*pos; + if ( p[0] == M_IMGDATA->m_maskRed && + p[1] == M_IMGDATA->m_maskGreen && + p[2] == M_IMGDATA->m_maskBlue ) + { + return true; + } + } + + // then check alpha + if ( M_IMGDATA->m_alpha ) + { + if ( M_IMGDATA->m_alpha[pos] < threshold ) + { + // transparent enough + return true; + } + } + + // not transparent + return false; +} + +bool wxImage::SetMaskFromImage(const wxImage& mask, + unsigned char mr, unsigned char mg, unsigned char mb) +{ + // check that the images are the same size + if ( (M_IMGDATA->m_height != mask.GetHeight() ) || (M_IMGDATA->m_width != mask.GetWidth () ) ) + { + wxLogError( _("Image and mask have different sizes.") ); + return false; + } + + // find unused colour + unsigned char r,g,b ; + if (!FindFirstUnusedColour(&r, &g, &b)) + { + wxLogError( _("No unused colour in image being masked.") ); + return false ; + } + + AllocExclusive(); + + unsigned char *imgdata = GetData(); + unsigned char *maskdata = mask.GetData(); + + const int w = GetWidth(); + const int h = GetHeight(); + + for (int j = 0; j < h; j++) + { + for (int i = 0; i < w; i++) + { + if ((maskdata[0] == mr) && (maskdata[1] == mg) && (maskdata[2] == mb)) + { + imgdata[0] = r; + imgdata[1] = g; + imgdata[2] = b; + } + imgdata += 3; + maskdata += 3; + } + } + + SetMaskColour(r, g, b); + SetMask(true); + + return true; +} + +bool wxImage::ConvertAlphaToMask(unsigned char threshold) +{ + if (!HasAlpha()) + return true; + + unsigned char mr, mg, mb; + if (!FindFirstUnusedColour(&mr, &mg, &mb)) + { + wxLogError( _("No unused colour in image being masked.") ); + return false; + } + + AllocExclusive(); + + SetMask(true); + SetMaskColour(mr, mg, mb); + + unsigned char *imgdata = GetData(); + unsigned char *alphadata = GetAlpha(); + + int w = GetWidth(); + int h = GetHeight(); + + for (int y = 0; y < h; y++) + { + for (int x = 0; x < w; x++, imgdata += 3, alphadata++) + { + if (*alphadata < threshold) + { + imgdata[0] = mr; + imgdata[1] = mg; + imgdata[2] = mb; + } + } + } + + if( !M_IMGDATA->m_staticAlpha ) + free(M_IMGDATA->m_alpha); + + M_IMGDATA->m_alpha = NULL; + M_IMGDATA->m_staticAlpha = false; + + return true; +} + +// ---------------------------------------------------------------------------- +// Palette functions +// ---------------------------------------------------------------------------- + +#if wxUSE_PALETTE + +bool wxImage::HasPalette() const +{ + if (!Ok()) + return false; + + return M_IMGDATA->m_palette.Ok(); +} + +const wxPalette& wxImage::GetPalette() const +{ + wxCHECK_MSG( Ok(), wxNullPalette, wxT("invalid image") ); + + return M_IMGDATA->m_palette; +} + +void wxImage::SetPalette(const wxPalette& palette) +{ + wxCHECK_RET( Ok(), wxT("invalid image") ); + + AllocExclusive(); + + M_IMGDATA->m_palette = palette; +} + +#endif // wxUSE_PALETTE + +// ---------------------------------------------------------------------------- +// Option functions (arbitrary name/value mapping) +// ---------------------------------------------------------------------------- + +void wxImage::SetOption(const wxString& name, const wxString& value) +{ + wxCHECK_RET( Ok(), wxT("invalid image") ); + + AllocExclusive(); + + int idx = M_IMGDATA->m_optionNames.Index(name, false); + if (idx == wxNOT_FOUND) + { + M_IMGDATA->m_optionNames.Add(name); + M_IMGDATA->m_optionValues.Add(value); + } + else + { + M_IMGDATA->m_optionNames[idx] = name; + M_IMGDATA->m_optionValues[idx] = value; + } +} + +void wxImage::SetOption(const wxString& name, int value) +{ + wxString valStr; + valStr.Printf(wxT("%d"), value); + SetOption(name, valStr); +} + +wxString wxImage::GetOption(const wxString& name) const +{ + wxCHECK_MSG( Ok(), wxEmptyString, wxT("invalid image") ); + + int idx = M_IMGDATA->m_optionNames.Index(name, false); + if (idx == wxNOT_FOUND) + return wxEmptyString; + else + return M_IMGDATA->m_optionValues[idx]; +} + +int wxImage::GetOptionInt(const wxString& name) const +{ + return wxAtoi(GetOption(name)); +} + +bool wxImage::HasOption(const wxString& name) const +{ + wxCHECK_MSG( Ok(), false, wxT("invalid image") ); + + return (M_IMGDATA->m_optionNames.Index(name, false) != wxNOT_FOUND); +} + +// ---------------------------------------------------------------------------- +// image I/O +// ---------------------------------------------------------------------------- + +bool wxImage::LoadFile( const wxString& WXUNUSED_UNLESS_STREAMS(filename), + long WXUNUSED_UNLESS_STREAMS(type), + int WXUNUSED_UNLESS_STREAMS(index) ) +{ +#if HAS_FILE_STREAMS + if (wxFileExists(filename)) + { + wxImageFileInputStream stream(filename); + wxBufferedInputStream bstream( stream ); + return LoadFile(bstream, type, index); + } + else + { + wxLogError( _("Can't load image from file '%s': file does not exist."), filename.c_str() ); + + return false; + } +#else // !HAS_FILE_STREAMS + return false; +#endif // HAS_FILE_STREAMS +} + +bool wxImage::LoadFile( const wxString& WXUNUSED_UNLESS_STREAMS(filename), + const wxString& WXUNUSED_UNLESS_STREAMS(mimetype), + int WXUNUSED_UNLESS_STREAMS(index) ) +{ +#if HAS_FILE_STREAMS + if (wxFileExists(filename)) + { + wxImageFileInputStream stream(filename); + wxBufferedInputStream bstream( stream ); + return LoadFile(bstream, mimetype, index); + } + else + { + wxLogError( _("Can't load image from file '%s': file does not exist."), filename.c_str() ); + + return false; + } +#else // !HAS_FILE_STREAMS + return false; +#endif // HAS_FILE_STREAMS +} + + + +bool wxImage::SaveFile( const wxString& filename ) const +{ + wxString ext = filename.AfterLast('.').Lower(); + + wxImageHandler * pHandler = FindHandler(ext, -1); + if (pHandler) + { + SaveFile(filename, pHandler->GetType()); + return true; + } + + wxLogError(_("Can't save image to file '%s': unknown extension."), filename.c_str()); + + return false; +} + +bool wxImage::SaveFile( const wxString& WXUNUSED_UNLESS_STREAMS(filename), + int WXUNUSED_UNLESS_STREAMS(type) ) const +{ +#if HAS_FILE_STREAMS + wxCHECK_MSG( Ok(), false, wxT("invalid image") ); + + ((wxImage*)this)->SetOption(wxIMAGE_OPTION_FILENAME, filename); + + wxImageFileOutputStream stream(filename); + + if ( stream.IsOk() ) + { + wxBufferedOutputStream bstream( stream ); + return SaveFile(bstream, type); + } +#endif // HAS_FILE_STREAMS + + return false; +} + +bool wxImage::SaveFile( const wxString& WXUNUSED_UNLESS_STREAMS(filename), + const wxString& WXUNUSED_UNLESS_STREAMS(mimetype) ) const +{ +#if HAS_FILE_STREAMS + wxCHECK_MSG( Ok(), false, wxT("invalid image") ); + + ((wxImage*)this)->SetOption(wxIMAGE_OPTION_FILENAME, filename); + + wxImageFileOutputStream stream(filename); + + if ( stream.IsOk() ) + { + wxBufferedOutputStream bstream( stream ); + return SaveFile(bstream, mimetype); + } +#endif // HAS_FILE_STREAMS + + return false; +} + +bool wxImage::CanRead( const wxString& WXUNUSED_UNLESS_STREAMS(name) ) +{ +#if HAS_FILE_STREAMS + wxImageFileInputStream stream(name); + return CanRead(stream); +#else + return false; +#endif +} + +int wxImage::GetImageCount( const wxString& WXUNUSED_UNLESS_STREAMS(name), + long WXUNUSED_UNLESS_STREAMS(type) ) +{ +#if HAS_FILE_STREAMS + wxImageFileInputStream stream(name); + if (stream.Ok()) + return GetImageCount(stream, type); +#endif + + return 0; +} + +#if wxUSE_STREAMS + +bool wxImage::CanRead( wxInputStream &stream ) +{ + const wxList& list = GetHandlers(); + + for ( wxList::compatibility_iterator node = list.GetFirst(); node; node = node->GetNext() ) + { + wxImageHandler *handler=(wxImageHandler*)node->GetData(); + if (handler->CanRead( stream )) + return true; + } + + return false; +} + +int wxImage::GetImageCount( wxInputStream &stream, long type ) +{ + wxImageHandler *handler; + + if ( type == wxBITMAP_TYPE_ANY ) + { + wxList &list=GetHandlers(); + + for (wxList::compatibility_iterator node = list.GetFirst(); node; node = node->GetNext()) + { + handler=(wxImageHandler*)node->GetData(); + if ( handler->CanRead(stream) ) + return handler->GetImageCount(stream); + + } + + wxLogWarning(_("No handler found for image type.")); + return 0; + } + + handler = FindHandler(type); + + if ( !handler ) + { + wxLogWarning(_("No image handler for type %ld defined."), type); + return false; + } + + if ( handler->CanRead(stream) ) + { + return handler->GetImageCount(stream); + } + else + { + wxLogError(_("Image file is not of type %ld."), type); + return 0; + } +} + +bool wxImage::LoadFile( wxInputStream& stream, long type, int index ) +{ + UnRef(); + + m_refData = new wxImageRefData; + + wxImageHandler *handler; + + if ( type == wxBITMAP_TYPE_ANY ) + { + wxList &list=GetHandlers(); + + for ( wxList::compatibility_iterator node = list.GetFirst(); node; node = node->GetNext() ) + { + handler=(wxImageHandler*)node->GetData(); + if ( handler->CanRead(stream) ) + return handler->LoadFile(this, stream, true/*verbose*/, index); + + } + + wxLogWarning( _("No handler found for image type.") ); + return false; + } + + handler = FindHandler(type); + + if (handler == 0) + { + wxLogWarning( _("No image handler for type %ld defined."), type ); + + return false; + } + + if (stream.IsSeekable() && !handler->CanRead(stream)) + { + wxLogError(_("Image file is not of type %ld."), type); + return false; + } + else + return handler->LoadFile(this, stream, true/*verbose*/, index); +} + +bool wxImage::LoadFile( wxInputStream& stream, const wxString& mimetype, int index ) +{ + UnRef(); + + m_refData = new wxImageRefData; + + wxImageHandler *handler = FindHandlerMime(mimetype); + + if (handler == 0) + { + wxLogWarning( _("No image handler for type %s defined."), mimetype.GetData() ); + + return false; + } + + if (stream.IsSeekable() && !handler->CanRead(stream)) + { + wxLogError(_("Image file is not of type %s."), (const wxChar*) mimetype); + return false; + } + else + return handler->LoadFile( this, stream, true/*verbose*/, index ); +} + +bool wxImage::SaveFile( wxOutputStream& stream, int type ) const +{ + wxCHECK_MSG( Ok(), false, wxT("invalid image") ); + + wxImageHandler *handler = FindHandler(type); + if ( !handler ) + { + wxLogWarning( _("No image handler for type %d defined."), type ); + + return false; + } + + return handler->SaveFile( (wxImage*)this, stream ); +} + +bool wxImage::SaveFile( wxOutputStream& stream, const wxString& mimetype ) const +{ + wxCHECK_MSG( Ok(), false, wxT("invalid image") ); + + wxImageHandler *handler = FindHandlerMime(mimetype); + if ( !handler ) + { + wxLogWarning( _("No image handler for type %s defined."), mimetype.GetData() ); + + return false; + } + + return handler->SaveFile( (wxImage*)this, stream ); +} +#endif // wxUSE_STREAMS + +// ---------------------------------------------------------------------------- +// image I/O handlers +// ---------------------------------------------------------------------------- + +void wxImage::AddHandler( wxImageHandler *handler ) +{ + // Check for an existing handler of the type being added. + if (FindHandler( handler->GetType() ) == 0) + { + sm_handlers.Append( handler ); + } + else + { + // This is not documented behaviour, merely the simplest 'fix' + // for preventing duplicate additions. If someone ever has + // a good reason to add and remove duplicate handlers (and they + // may) we should probably refcount the duplicates. + // also an issue in InsertHandler below. + + wxLogDebug( _T("Adding duplicate image handler for '%s'"), + handler->GetName().c_str() ); + delete handler; + } +} + +void wxImage::InsertHandler( wxImageHandler *handler ) +{ + // Check for an existing handler of the type being added. + if (FindHandler( handler->GetType() ) == 0) + { + sm_handlers.Insert( handler ); + } + else + { + // see AddHandler for additional comments. + wxLogDebug( _T("Inserting duplicate image handler for '%s'"), + handler->GetName().c_str() ); + delete handler; + } +} + +bool wxImage::RemoveHandler( const wxString& name ) +{ + wxImageHandler *handler = FindHandler(name); + if (handler) + { + sm_handlers.DeleteObject(handler); + delete handler; + return true; + } + else + return false; +} + +wxImageHandler *wxImage::FindHandler( const wxString& name ) +{ + wxList::compatibility_iterator node = sm_handlers.GetFirst(); + while (node) + { + wxImageHandler *handler = (wxImageHandler*)node->GetData(); + if (handler->GetName().Cmp(name) == 0) return handler; + + node = node->GetNext(); + } + return 0; +} + +wxImageHandler *wxImage::FindHandler( const wxString& extension, long bitmapType ) +{ + wxList::compatibility_iterator node = sm_handlers.GetFirst(); + while (node) + { + wxImageHandler *handler = (wxImageHandler*)node->GetData(); + if ( (handler->GetExtension().Cmp(extension) == 0) && + (bitmapType == -1 || handler->GetType() == bitmapType) ) + return handler; + node = node->GetNext(); + } + return 0; +} + +wxImageHandler *wxImage::FindHandler( long bitmapType ) +{ + wxList::compatibility_iterator node = sm_handlers.GetFirst(); + while (node) + { + wxImageHandler *handler = (wxImageHandler *)node->GetData(); + if (handler->GetType() == bitmapType) return handler; + node = node->GetNext(); + } + return 0; +} + +wxImageHandler *wxImage::FindHandlerMime( const wxString& mimetype ) +{ + wxList::compatibility_iterator node = sm_handlers.GetFirst(); + while (node) + { + wxImageHandler *handler = (wxImageHandler *)node->GetData(); + if (handler->GetMimeType().IsSameAs(mimetype, false)) return handler; + node = node->GetNext(); + } + return 0; +} + +void wxImage::InitStandardHandlers() +{ +#if wxUSE_STREAMS + AddHandler(new wxBMPHandler); +#endif // wxUSE_STREAMS +} + +void wxImage::CleanUpHandlers() +{ + wxList::compatibility_iterator node = sm_handlers.GetFirst(); + while (node) + { + wxImageHandler *handler = (wxImageHandler *)node->GetData(); + wxList::compatibility_iterator next = node->GetNext(); + delete handler; + node = next; + } + + sm_handlers.Clear(); +} + +wxString wxImage::GetImageExtWildcard() +{ + wxString fmts; + + wxList& Handlers = wxImage::GetHandlers(); + wxList::compatibility_iterator Node = Handlers.GetFirst(); + while ( Node ) + { + wxImageHandler* Handler = (wxImageHandler*)Node->GetData(); + fmts += wxT("*.") + Handler->GetExtension(); + Node = Node->GetNext(); + if ( Node ) fmts += wxT(";"); + } + + return wxT("(") + fmts + wxT(")|") + fmts; +} + +wxImage::HSVValue wxImage::RGBtoHSV(const RGBValue& rgb) +{ + const double red = rgb.red / 255.0, + green = rgb.green / 255.0, + blue = rgb.blue / 255.0; + + // find the min and max intensity (and remember which one was it for the + // latter) + double minimumRGB = red; + if ( green < minimumRGB ) + minimumRGB = green; + if ( blue < minimumRGB ) + minimumRGB = blue; + + enum { RED, GREEN, BLUE } chMax = RED; + double maximumRGB = red; + if ( green > maximumRGB ) + { + chMax = GREEN; + maximumRGB = green; + } + if ( blue > maximumRGB ) + { + chMax = BLUE; + maximumRGB = blue; + } + + const double value = maximumRGB; + + double hue = 0.0, saturation; + const double deltaRGB = maximumRGB - minimumRGB; + if ( wxIsNullDouble(deltaRGB) ) + { + // Gray has no color + hue = 0.0; + saturation = 0.0; + } + else + { + switch ( chMax ) + { + case RED: + hue = (green - blue) / deltaRGB; + break; + + case GREEN: + hue = 2.0 + (blue - red) / deltaRGB; + break; + + case BLUE: + hue = 4.0 + (red - green) / deltaRGB; + break; + + default: + wxFAIL_MSG(wxT("hue not specified")); + break; + } + + hue /= 6.0; + + if ( hue < 0.0 ) + hue += 1.0; + + saturation = deltaRGB / maximumRGB; + } + + return HSVValue(hue, saturation, value); +} + +wxImage::RGBValue wxImage::HSVtoRGB(const HSVValue& hsv) +{ + double red, green, blue; + + if ( wxIsNullDouble(hsv.saturation) ) + { + // Grey + red = hsv.value; + green = hsv.value; + blue = hsv.value; + } + else // not grey + { + double hue = hsv.hue * 6.0; // sector 0 to 5 + int i = (int)floor(hue); + double f = hue - i; // fractional part of h + double p = hsv.value * (1.0 - hsv.saturation); + + switch (i) + { + case 0: + red = hsv.value; + green = hsv.value * (1.0 - hsv.saturation * (1.0 - f)); + blue = p; + break; + + case 1: + red = hsv.value * (1.0 - hsv.saturation * f); + green = hsv.value; + blue = p; + break; + + case 2: + red = p; + green = hsv.value; + blue = hsv.value * (1.0 - hsv.saturation * (1.0 - f)); + break; + + case 3: + red = p; + green = hsv.value * (1.0 - hsv.saturation * f); + blue = hsv.value; + break; + + case 4: + red = hsv.value * (1.0 - hsv.saturation * (1.0 - f)); + green = p; + blue = hsv.value; + break; + + default: // case 5: + red = hsv.value; + green = p; + blue = hsv.value * (1.0 - hsv.saturation * f); + break; + } + } + + return RGBValue((unsigned char)(red * 255.0), + (unsigned char)(green * 255.0), + (unsigned char)(blue * 255.0)); +} + +/* + * Rotates the hue of each pixel of the image. angle is a double in the range + * -1.0..1.0 where -1.0 is -360 degrees and 1.0 is 360 degrees + */ +void wxImage::RotateHue(double angle) +{ + AllocExclusive(); + + unsigned char *srcBytePtr; + unsigned char *dstBytePtr; + unsigned long count; + wxImage::HSVValue hsv; + wxImage::RGBValue rgb; + + wxASSERT (angle >= -1.0 && angle <= 1.0); + count = M_IMGDATA->m_width * M_IMGDATA->m_height; + if ( count > 0 && !wxIsNullDouble(angle) ) + { + srcBytePtr = M_IMGDATA->m_data; + dstBytePtr = srcBytePtr; + do + { + rgb.red = *srcBytePtr++; + rgb.green = *srcBytePtr++; + rgb.blue = *srcBytePtr++; + hsv = RGBtoHSV(rgb); + + hsv.hue = hsv.hue + angle; + if (hsv.hue > 1.0) + hsv.hue = hsv.hue - 1.0; + else if (hsv.hue < 0.0) + hsv.hue = hsv.hue + 1.0; + + rgb = HSVtoRGB(hsv); + *dstBytePtr++ = rgb.red; + *dstBytePtr++ = rgb.green; + *dstBytePtr++ = rgb.blue; + } while (--count != 0); + } +} + +//----------------------------------------------------------------------------- +// wxImageHandler +//----------------------------------------------------------------------------- + +IMPLEMENT_ABSTRACT_CLASS(wxImageHandler,wxObject) + +#if wxUSE_STREAMS +bool wxImageHandler::LoadFile( wxImage *WXUNUSED(image), wxInputStream& WXUNUSED(stream), bool WXUNUSED(verbose), int WXUNUSED(index) ) +{ + return false; +} + +bool wxImageHandler::SaveFile( wxImage *WXUNUSED(image), wxOutputStream& WXUNUSED(stream), bool WXUNUSED(verbose) ) +{ + return false; +} + +int wxImageHandler::GetImageCount( wxInputStream& WXUNUSED(stream) ) +{ + return 1; +} + +bool wxImageHandler::CanRead( const wxString& name ) +{ + if (wxFileExists(name)) + { + wxImageFileInputStream stream(name); + return CanRead(stream); + } + + wxLogError( _("Can't check image format of file '%s': file does not exist."), name.c_str() ); + + return false; +} + +bool wxImageHandler::CallDoCanRead(wxInputStream& stream) +{ + wxFileOffset posOld = stream.TellI(); + if ( posOld == wxInvalidOffset ) + { + // can't test unseekable stream + return false; + } + + bool ok = DoCanRead(stream); + + // restore the old position to be able to test other formats and so on + if ( stream.SeekI(posOld) == wxInvalidOffset ) + { + wxLogDebug(_T("Failed to rewind the stream in wxImageHandler!")); + + // reading would fail anyhow as we're not at the right position + return false; + } + + return ok; +} + +#endif // wxUSE_STREAMS + +// ---------------------------------------------------------------------------- +// image histogram stuff +// ---------------------------------------------------------------------------- + +bool +wxImageHistogram::FindFirstUnusedColour(unsigned char *r, + unsigned char *g, + unsigned char *b, + unsigned char r2, + unsigned char b2, + unsigned char g2) const +{ + unsigned long key = MakeKey(r2, g2, b2); + + while ( find(key) != end() ) + { + // color already used + r2++; + if ( r2 >= 255 ) + { + r2 = 0; + g2++; + if ( g2 >= 255 ) + { + g2 = 0; + b2++; + if ( b2 >= 255 ) + { + wxLogError(_("No unused colour in image.") ); + return false; + } + } + } + + key = MakeKey(r2, g2, b2); + } + + if ( r ) + *r = r2; + if ( g ) + *g = g2; + if ( b ) + *b = b2; + + return true; +} + +bool +wxImage::FindFirstUnusedColour(unsigned char *r, + unsigned char *g, + unsigned char *b, + unsigned char r2, + unsigned char b2, + unsigned char g2) const +{ + wxImageHistogram histogram; + + ComputeHistogram(histogram); + + return histogram.FindFirstUnusedColour(r, g, b, r2, g2, b2); +} + + + +// GRG, Dic/99 +// Counts and returns the number of different colours. Optionally stops +// when it exceeds 'stopafter' different colours. This is useful, for +// example, to see if the image can be saved as 8-bit (256 colour or +// less, in this case it would be invoked as CountColours(256)). Default +// value for stopafter is -1 (don't care). +// +unsigned long wxImage::CountColours( unsigned long stopafter ) const +{ + wxHashTable h; + wxObject dummy; + unsigned char r, g, b; + unsigned char *p; + unsigned long size, nentries, key; + + p = GetData(); + size = GetWidth() * GetHeight(); + nentries = 0; + + for (unsigned long j = 0; (j < size) && (nentries <= stopafter) ; j++) + { + r = *(p++); + g = *(p++); + b = *(p++); + key = wxImageHistogram::MakeKey(r, g, b); + + if (h.Get(key) == NULL) + { + h.Put(key, &dummy); + nentries++; + } + } + + return nentries; +} + + +unsigned long wxImage::ComputeHistogram( wxImageHistogram &h ) const +{ + unsigned char *p = GetData(); + unsigned long nentries = 0; + + h.clear(); + + const unsigned long size = GetWidth() * GetHeight(); + + unsigned char r, g, b; + for ( unsigned long n = 0; n < size; n++ ) + { + r = *p++; + g = *p++; + b = *p++; + + wxImageHistogramEntry& entry = h[wxImageHistogram::MakeKey(r, g, b)]; + + if ( entry.value++ == 0 ) + entry.index = nentries++; + } + + return nentries; +} + +/* + * Rotation code by Carlos Moreno + */ + +static const double wxROTATE_EPSILON = 1e-10; + +// Auxiliary function to rotate a point (x,y) with respect to point p0 +// make it inline and use a straight return to facilitate optimization +// also, the function receives the sine and cosine of the angle to avoid +// repeating the time-consuming calls to these functions -- sin/cos can +// be computed and stored in the calling function. + +static inline wxRealPoint +wxRotatePoint(const wxRealPoint& p, double cos_angle, double sin_angle, + const wxRealPoint& p0) +{ + return wxRealPoint(p0.x + (p.x - p0.x) * cos_angle - (p.y - p0.y) * sin_angle, + p0.y + (p.y - p0.y) * cos_angle + (p.x - p0.x) * sin_angle); +} + +static inline wxRealPoint +wxRotatePoint(double x, double y, double cos_angle, double sin_angle, + const wxRealPoint & p0) +{ + return wxRotatePoint (wxRealPoint(x,y), cos_angle, sin_angle, p0); +} + +wxImage wxImage::Rotate(double angle, const wxPoint & centre_of_rotation, bool interpolating, wxPoint * offset_after_rotation) const +{ + int i; + angle = -angle; // screen coordinates are a mirror image of "real" coordinates + + bool has_alpha = HasAlpha(); + + const int w = GetWidth(), + h = GetHeight(); + + // Create pointer-based array to accelerate access to wxImage's data + unsigned char ** data = new unsigned char * [h]; + data[0] = GetData(); + for (i = 1; i < h; i++) + data[i] = data[i - 1] + (3 * w); + + // Same for alpha channel + unsigned char ** alpha = NULL; + if (has_alpha) + { + alpha = new unsigned char * [h]; + alpha[0] = GetAlpha(); + for (i = 1; i < h; i++) + alpha[i] = alpha[i - 1] + w; + } + + // precompute coefficients for rotation formula + // (sine and cosine of the angle) + const double cos_angle = cos(angle); + const double sin_angle = sin(angle); + + // Create new Image to store the result + // First, find rectangle that covers the rotated image; to do that, + // rotate the four corners + + const wxRealPoint p0(centre_of_rotation.x, centre_of_rotation.y); + + wxRealPoint p1 = wxRotatePoint (0, 0, cos_angle, sin_angle, p0); + wxRealPoint p2 = wxRotatePoint (0, h, cos_angle, sin_angle, p0); + wxRealPoint p3 = wxRotatePoint (w, 0, cos_angle, sin_angle, p0); + wxRealPoint p4 = wxRotatePoint (w, h, cos_angle, sin_angle, p0); + + int x1a = (int) floor (wxMin (wxMin(p1.x, p2.x), wxMin(p3.x, p4.x))); + int y1a = (int) floor (wxMin (wxMin(p1.y, p2.y), wxMin(p3.y, p4.y))); + int x2a = (int) ceil (wxMax (wxMax(p1.x, p2.x), wxMax(p3.x, p4.x))); + int y2a = (int) ceil (wxMax (wxMax(p1.y, p2.y), wxMax(p3.y, p4.y))); + + // Create rotated image + wxImage rotated (x2a - x1a + 1, y2a - y1a + 1, false); + // With alpha channel + if (has_alpha) + rotated.SetAlpha(); + + if (offset_after_rotation != NULL) + { + *offset_after_rotation = wxPoint (x1a, y1a); + } + + // GRG: The rotated (destination) image is always accessed + // sequentially, so there is no need for a pointer-based + // array here (and in fact it would be slower). + // + unsigned char * dst = rotated.GetData(); + + unsigned char * alpha_dst = NULL; + if (has_alpha) + alpha_dst = rotated.GetAlpha(); + + // GRG: if the original image has a mask, use its RGB values + // as the blank pixel, else, fall back to default (black). + // + unsigned char blank_r = 0; + unsigned char blank_g = 0; + unsigned char blank_b = 0; + + if (HasMask()) + { + blank_r = GetMaskRed(); + blank_g = GetMaskGreen(); + blank_b = GetMaskBlue(); + rotated.SetMaskColour( blank_r, blank_g, blank_b ); + } + + // Now, for each point of the rotated image, find where it came from, by + // performing an inverse rotation (a rotation of -angle) and getting the + // pixel at those coordinates + + const int rH = rotated.GetHeight(); + const int rW = rotated.GetWidth(); + + // GRG: I've taken the (interpolating) test out of the loops, so that + // it is done only once, instead of repeating it for each pixel. + + if (interpolating) + { + for (int y = 0; y < rH; y++) + { + for (int x = 0; x < rW; x++) + { + wxRealPoint src = wxRotatePoint (x + x1a, y + y1a, cos_angle, -sin_angle, p0); + + if (-0.25 < src.x && src.x < w - 0.75 && + -0.25 < src.y && src.y < h - 0.75) + { + // interpolate using the 4 enclosing grid-points. Those + // points can be obtained using floor and ceiling of the + // exact coordinates of the point + int x1, y1, x2, y2; + + if (0 < src.x && src.x < w - 1) + { + x1 = wxRound(floor(src.x)); + x2 = wxRound(ceil(src.x)); + } + else // else means that x is near one of the borders (0 or width-1) + { + x1 = x2 = wxRound (src.x); + } + + if (0 < src.y && src.y < h - 1) + { + y1 = wxRound(floor(src.y)); + y2 = wxRound(ceil(src.y)); + } + else + { + y1 = y2 = wxRound (src.y); + } + + // get four points and the distances (square of the distance, + // for efficiency reasons) for the interpolation formula + + // GRG: Do not calculate the points until they are + // really needed -- this way we can calculate + // just one, instead of four, if d1, d2, d3 + // or d4 are < wxROTATE_EPSILON + + const double d1 = (src.x - x1) * (src.x - x1) + (src.y - y1) * (src.y - y1); + const double d2 = (src.x - x2) * (src.x - x2) + (src.y - y1) * (src.y - y1); + const double d3 = (src.x - x2) * (src.x - x2) + (src.y - y2) * (src.y - y2); + const double d4 = (src.x - x1) * (src.x - x1) + (src.y - y2) * (src.y - y2); + + // Now interpolate as a weighted average of the four surrounding + // points, where the weights are the distances to each of those points + + // If the point is exactly at one point of the grid of the source + // image, then don't interpolate -- just assign the pixel + + // d1,d2,d3,d4 are positive -- no need for abs() + if (d1 < wxROTATE_EPSILON) + { + unsigned char *p = data[y1] + (3 * x1); + *(dst++) = *(p++); + *(dst++) = *(p++); + *(dst++) = *p; + + if (has_alpha) + *(alpha_dst++) = *(alpha[y1] + x1); + } + else if (d2 < wxROTATE_EPSILON) + { + unsigned char *p = data[y1] + (3 * x2); + *(dst++) = *(p++); + *(dst++) = *(p++); + *(dst++) = *p; + + if (has_alpha) + *(alpha_dst++) = *(alpha[y1] + x2); + } + else if (d3 < wxROTATE_EPSILON) + { + unsigned char *p = data[y2] + (3 * x2); + *(dst++) = *(p++); + *(dst++) = *(p++); + *(dst++) = *p; + + if (has_alpha) + *(alpha_dst++) = *(alpha[y2] + x2); + } + else if (d4 < wxROTATE_EPSILON) + { + unsigned char *p = data[y2] + (3 * x1); + *(dst++) = *(p++); + *(dst++) = *(p++); + *(dst++) = *p; + + if (has_alpha) + *(alpha_dst++) = *(alpha[y2] + x1); + } + else + { + // weights for the weighted average are proportional to the inverse of the distance + unsigned char *v1 = data[y1] + (3 * x1); + unsigned char *v2 = data[y1] + (3 * x2); + unsigned char *v3 = data[y2] + (3 * x2); + unsigned char *v4 = data[y2] + (3 * x1); + + const double w1 = 1/d1, w2 = 1/d2, w3 = 1/d3, w4 = 1/d4; + + // GRG: Unrolled. + + *(dst++) = (unsigned char) + ( (w1 * *(v1++) + w2 * *(v2++) + + w3 * *(v3++) + w4 * *(v4++)) / + (w1 + w2 + w3 + w4) ); + *(dst++) = (unsigned char) + ( (w1 * *(v1++) + w2 * *(v2++) + + w3 * *(v3++) + w4 * *(v4++)) / + (w1 + w2 + w3 + w4) ); + *(dst++) = (unsigned char) + ( (w1 * *v1 + w2 * *v2 + + w3 * *v3 + w4 * *v4) / + (w1 + w2 + w3 + w4) ); + + if (has_alpha) + { + v1 = alpha[y1] + (x1); + v2 = alpha[y1] + (x2); + v3 = alpha[y2] + (x2); + v4 = alpha[y2] + (x1); + + *(alpha_dst++) = (unsigned char) + ( (w1 * *v1 + w2 * *v2 + + w3 * *v3 + w4 * *v4) / + (w1 + w2 + w3 + w4) ); + } + } + } + else + { + *(dst++) = blank_r; + *(dst++) = blank_g; + *(dst++) = blank_b; + + if (has_alpha) + *(alpha_dst++) = 0; + } + } + } + } + else // not interpolating + { + for (int y = 0; y < rH; y++) + { + for (int x = 0; x < rW; x++) + { + wxRealPoint src = wxRotatePoint (x + x1a, y + y1a, cos_angle, -sin_angle, p0); + + const int xs = wxRound (src.x); // wxRound rounds to the + const int ys = wxRound (src.y); // closest integer + + if (0 <= xs && xs < w && 0 <= ys && ys < h) + { + unsigned char *p = data[ys] + (3 * xs); + *(dst++) = *(p++); + *(dst++) = *(p++); + *(dst++) = *p; + + if (has_alpha) + *(alpha_dst++) = *(alpha[ys] + (xs)); + } + else + { + *(dst++) = blank_r; + *(dst++) = blank_g; + *(dst++) = blank_b; + + if (has_alpha) + *(alpha_dst++) = 255; + } + } + } + } + + delete [] data; + + if (has_alpha) + delete [] alpha; + + return rotated; +} + + + + + +// A module to allow wxImage initialization/cleanup +// without calling these functions from app.cpp or from +// the user's application. + +class wxImageModule: public wxModule +{ +DECLARE_DYNAMIC_CLASS(wxImageModule) +public: + wxImageModule() {} + bool OnInit() { wxImage::InitStandardHandlers(); return true; } + void OnExit() { wxImage::CleanUpHandlers(); } +}; + +IMPLEMENT_DYNAMIC_CLASS(wxImageModule, wxModule) + + +#endif // wxUSE_IMAGE diff --git a/Externals/wxWidgets/src/common/imagfill.cpp b/Externals/wxWidgets/src/common/imagfill.cpp new file mode 100644 index 0000000000..5d016de76d --- /dev/null +++ b/Externals/wxWidgets/src/common/imagfill.cpp @@ -0,0 +1,308 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/imagfill.cpp +// Purpose: FloodFill for wxImage +// Author: Julian Smart +// RCS-ID: $Id: imagfill.cpp 39957 2006-07-03 19:02:54Z ABX $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_IMAGE && !defined(__WXMSW__) +// we have no use for this code in wxMSW... + +#ifndef WX_PRECOMP + #include "wx/brush.h" + #include "wx/dc.h" + #include "wx/dcmemory.h" + #include "wx/image.h" +#endif + +// DoFloodFill +// Fills with the colour extracted from fillBrush, starting at x,y until either +// a color different from the start pixel is reached (wxFLOOD_SURFACE) +// or fill color is reached (wxFLOOD_BORDER) + +static bool LINKAGEMODE MatchPixel(wxImage *img, int x, int y, int w, int h, const wxColour& c) +{ + if ((x<0)||(x>=w)||(y<0)||(y>=h)) return false; + + unsigned char r = img->GetRed(x,y); + unsigned char g = img->GetGreen(x,y); + unsigned char b = img->GetBlue(x,y); + return c.Red() == r && c.Green() == g && c.Blue() == b ; +} + +static bool LINKAGEMODE MatchBoundaryPixel(wxImage *img, int x, int y, int w, int h, const wxColour & fill, const wxColour& bound) +{ + if ((x<0)||(x>=w)||(y<0)||(y>=h)) return true; + + unsigned char r = img->GetRed(x,y); + unsigned char g = img->GetGreen(x,y); + unsigned char b = img->GetBlue(x,y); + if ( fill.Red() == r && fill.Green() == g && fill.Blue() == b ) + return true; + if ( bound.Red() == r && bound.Green() == g && bound.Blue() == b ) + return true; + return false; +} + + +static void LINKAGEMODE +wxImageFloodFill(wxImage *image, + wxCoord x, wxCoord y, const wxBrush & fillBrush, + const wxColour& testColour, int style, + int WXUNUSED(LogicalFunction)) +{ + /* A diamond flood-fill using a circular queue system. + Each pixel surrounding the current pixel is added to + the queue if it meets the criteria, then is retrieved in + its turn. Code originally based on http://www.drawit.co.nz/Developers.htm, + with explicit permission to use this for wxWidgets granted by Andrew Empson + (no copyright claimed) + */ + + int width = image->GetWidth(); + int height = image->GetHeight(); + + //Draw using a pen made from the current brush colour + //Potentially allows us to use patterned flood fills in future code + wxColour fillColour = fillBrush.GetColour(); + unsigned char r = fillColour.Red(); + unsigned char g = fillColour.Green(); + unsigned char b = fillColour.Blue(); + + //initial test : + if (style == wxFLOOD_SURFACE) + { + //if wxFLOOD_SURFACE, if fill colour is same as required, we don't do anything + if ( image->GetRed(x,y) != r + || image->GetGreen(x,y) != g + || image->GetBlue (x,y) != b ) + { + //prepare memory for queue + //queue save, start, read + size_t *qs, *qst, *qr; + + //queue size (physical) + long qSz= height * width * 2; + qst = new size_t [qSz]; + + //temporary x and y locations + int xt, yt; + + for (int i=0; i < qSz; i++) + qst[i] = 0; + + // start queue + qs=qr=qst; + *qs=xt=x; + qs++; + *qs=yt=y; + qs++; + + image->SetRGB(xt,yt,r,g,b); + + //Main queue loop + while(qr!=qs) + { + //Add new members to queue + //Above current pixel + if(MatchPixel(image,xt,yt-1,width,height,testColour)) + { + *qs=xt; + qs++; + *qs=yt-1; + qs++; + image->SetRGB(xt,yt-1,r,g,b); + + //Loop back to beginning of queue + if(qs>=(qst+qSz)) qs=qst; + } + + //Below current pixel + if(MatchPixel(image,xt,yt+1,width,height,testColour)) + { + *qs=xt; + qs++; + *qs=yt+1; + qs++; + image->SetRGB(xt,yt+1,r,g,b); + if(qs>=(qst+qSz)) qs=qst; + } + + //Left of current pixel + if(MatchPixel(image,xt-1,yt,width,height,testColour)) + { + *qs=xt-1; + qs++; + *qs=yt; + qs++; + image->SetRGB(xt-1,yt,r,g,b); + if(qs>=(qst+qSz)) qs=qst; + } + + //Right of current pixel + if(MatchPixel(image,xt+1,yt,width,height,testColour)) + { + *qs=xt+1; + qs++; + *qs=yt; + qs++; + image->SetRGB(xt+1,yt,r,g,b); + if(qs>=(qst+qSz)) qs=qst; + } + + //Retrieve current queue member + qr+=2; + + //Loop back to the beginning + if(qr>=(qst+qSz)) qr=qst; + xt=*qr; + yt=*(qr+1); + + //Go Back to beginning of loop + } + + delete[] qst; + } + } + else + { + //style is wxFLOOD_BORDER + // fill up to testColor border - if already testColour don't do anything + if ( image->GetRed(x,y) != testColour.Red() + || image->GetGreen(x,y) != testColour.Green() + || image->GetBlue(x,y) != testColour.Blue() ) + { + //prepare memory for queue + //queue save, start, read + size_t *qs, *qst, *qr; + + //queue size (physical) + long qSz= height * width * 2; + qst = new size_t [qSz]; + + //temporary x and y locations + int xt, yt; + + for (int i=0; i < qSz; i++) + qst[i] = 0; + + // start queue + qs=qr=qst; + *qs=xt=x; + qs++; + *qs=yt=y; + qs++; + + image->SetRGB(xt,yt,r,g,b); + + //Main queue loop + while (qr!=qs) + { + //Add new members to queue + //Above current pixel + if(!MatchBoundaryPixel(image,xt,yt-1,width,height,fillColour,testColour)) + { + *qs=xt; + qs++; + *qs=yt-1; + qs++; + image->SetRGB(xt,yt-1,r,g,b); + + //Loop back to beginning of queue + if(qs>=(qst+qSz)) qs=qst; + } + + //Below current pixel + if(!MatchBoundaryPixel(image,xt,yt+1,width,height,fillColour,testColour)) + { + *qs=xt; + qs++; + *qs=yt+1; + qs++; + image->SetRGB(xt,yt+1,r,g,b); + if(qs>=(qst+qSz)) qs=qst; + } + + //Left of current pixel + if(!MatchBoundaryPixel(image,xt-1,yt,width,height,fillColour,testColour)) + { + *qs=xt-1; + qs++; + *qs=yt; + qs++; + image->SetRGB(xt-1,yt,r,g,b); + if(qs>=(qst+qSz)) qs=qst; + } + + //Right of current pixel + if(!MatchBoundaryPixel(image,xt+1,yt,width,height,fillColour,testColour)) + { + *qs=xt+1; + qs++; + *qs=yt; + qs++; + image->SetRGB(xt+1,yt,r,g,b); + if(qs>=(qst+qSz)) qs=qst; + } + + //Retrieve current queue member + qr+=2; + + //Loop back to the beginning + if(qr>=(qst+qSz)) qr=qst; + xt=*qr; + yt=*(qr+1); + + //Go Back to beginning of loop + } + + delete[] qst; + } + } + //all done, +} + + +bool wxDoFloodFill(wxDC *dc, wxCoord x, wxCoord y, + const wxColour& col, int style) +{ + if (dc->GetBrush().GetStyle() == wxTRANSPARENT) + return true; + + int height = 0; + int width = 0; + dc->GetSize(&width, &height); + + //it would be nice to fail if we don't get a sensible size... + wxCHECK_MSG(width >= 1 && height >= 1, false, + wxT("In FloodFill, dc.GetSize routine failed, method not supported by this DC")); + + //this is much faster than doing the individual pixels + wxMemoryDC memdc; + wxBitmap bitmap(width, height); + memdc.SelectObject(bitmap); + memdc.Blit(0, 0, width, height, dc, 0, 0); + memdc.SelectObject(wxNullBitmap); + + wxImage image = bitmap.ConvertToImage(); + wxImageFloodFill(&image, x,y, dc->GetBrush(), col, style, + dc->GetLogicalFunction()); + bitmap = wxBitmap(image); + memdc.SelectObject(bitmap); + dc->Blit(0, 0, width, height, &memdc, 0, 0); + memdc.SelectObject(wxNullBitmap); + + return true; +} + +#endif // wxUSE_IMAGE diff --git a/Externals/wxWidgets/src/common/imaggif.cpp b/Externals/wxWidgets/src/common/imaggif.cpp new file mode 100644 index 0000000000..befa52af3c --- /dev/null +++ b/Externals/wxWidgets/src/common/imaggif.cpp @@ -0,0 +1,105 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/imaggif.cpp +// Purpose: wxGIFHandler +// Author: Vaclav Slavik & Guillermo Rodriguez Garcia +// RCS-ID: $Id: imaggif.cpp 41819 2006-10-09 17:51:07Z VZ $ +// Copyright: (c) 1999 Vaclav Slavik & Guillermo Rodriguez Garcia +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_IMAGE && wxUSE_GIF + +#ifndef WX_PRECOMP + #include "wx/intl.h" + #include "wx/log.h" +#endif + +#include "wx/imaggif.h" +#include "wx/gifdecod.h" +#include "wx/wfstream.h" + +IMPLEMENT_DYNAMIC_CLASS(wxGIFHandler,wxImageHandler) + +//----------------------------------------------------------------------------- +// wxGIFHandler +//----------------------------------------------------------------------------- + +#if wxUSE_STREAMS + +bool wxGIFHandler::LoadFile(wxImage *image, wxInputStream& stream, + bool verbose, int index) +{ + wxGIFDecoder *decod; + wxGIFErrorCode error; + bool ok = true; + +// image->Destroy(); + decod = new wxGIFDecoder(); + error = decod->LoadGIF(stream); + + if ((error != wxGIF_OK) && (error != wxGIF_TRUNCATED)) + { + if (verbose) + { + switch (error) + { + case wxGIF_INVFORMAT: + wxLogError(_("GIF: error in GIF image format.")); + break; + case wxGIF_MEMERR: + wxLogError(_("GIF: not enough memory.")); + break; + default: + wxLogError(_("GIF: unknown error!!!")); + break; + } + } + delete decod; + return false; + } + + if ((error == wxGIF_TRUNCATED) && verbose) + { + wxLogError(_("GIF: data stream seems to be truncated.")); + /* go on; image data is OK */ + } + + if (ok) + { + ok = decod->ConvertToImage(index != -1 ? (size_t)index : 0, image); + } + else + { + wxLogError(_("GIF: Invalid gif index.")); + } + + delete decod; + + return ok; +} + +bool wxGIFHandler::SaveFile( wxImage * WXUNUSED(image), + wxOutputStream& WXUNUSED(stream), bool verbose ) +{ + if (verbose) + wxLogDebug(wxT("GIF: the handler is read-only!!")); + + return false; +} + +bool wxGIFHandler::DoCanRead( wxInputStream& stream ) +{ + wxGIFDecoder decod; + return decod.CanRead(stream); +} + +#endif // wxUSE_STREAMS + +#endif // wxUSE_GIF diff --git a/Externals/wxWidgets/src/common/imagiff.cpp b/Externals/wxWidgets/src/common/imagiff.cpp new file mode 100644 index 0000000000..1f00efae82 --- /dev/null +++ b/Externals/wxWidgets/src/common/imagiff.cpp @@ -0,0 +1,794 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/imagiff.h +// Purpose: wxImage handler for Amiga IFF images +// Author: Steffen Gutmann, Thomas Meyer +// RCS-ID: $Id: imagiff.cpp 38787 2006-04-18 07:24:35Z ABX $ +// Copyright: (c) Steffen Gutmann, 2002 +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// Parts of this source are based on the iff loading algorithm found +// in xviff.c. Permission by the original author, Thomas Meyer, and +// by the author of xv, John Bradley for using the iff loading part +// in wxWidgets has been gratefully given. + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_IMAGE && wxUSE_IFF + +#ifndef WX_PRECOMP + #include "wx/log.h" + #include "wx/intl.h" +#endif + +#include "wx/imagiff.h" +#include "wx/wfstream.h" + +#if wxUSE_PALETTE + #include "wx/palette.h" +#endif // wxUSE_PALETTE + +#include +#include + + +// -------------------------------------------------------------------------- +// Constants +// -------------------------------------------------------------------------- + +// Error codes: +// Note that the error code wxIFF_TRUNCATED means that the image itself +// is most probably OK, but the decoder didn't reach the end of the data +// stream; this means that if it was not reading directly from file, +// the stream will not be correctly positioned. +// + +enum +{ + wxIFF_OK = 0, /* everything was OK */ + wxIFF_INVFORMAT, /* error in iff header */ + wxIFF_MEMERR, /* error allocating memory */ + wxIFF_TRUNCATED /* file appears to be truncated */ +}; + +// -------------------------------------------------------------------------- +// wxIFFDecoder class +// -------------------------------------------------------------------------- + +// internal class for storing IFF image data +class IFFImage +{ +public: + unsigned int w; /* width */ + unsigned int h; /* height */ + int transparent; /* transparent color (-1 = none) */ + int colors; /* number of colors */ + unsigned char *p; /* bitmap */ + unsigned char *pal; /* palette */ + + IFFImage() : w(0), h(0), colors(0), p(0), pal(0) {} + ~IFFImage() { delete [] p; delete [] pal; } +}; + +class WXDLLEXPORT wxIFFDecoder +{ +private: + IFFImage *m_image; // image data + wxInputStream *m_f; // input stream + unsigned char *databuf; + unsigned char *picptr; + unsigned char *decomp_mem; + + void Destroy(); + +public: + // get data of current frame + unsigned char* GetData() const; + unsigned char* GetPalette() const; + int GetNumColors() const; + unsigned int GetWidth() const; + unsigned int GetHeight() const; + int GetTransparentColour() const; + + // constructor, destructor, etc. + wxIFFDecoder(wxInputStream *s); + ~wxIFFDecoder() { Destroy(); } + bool CanRead(); + int ReadIFF(); + bool ConvertToImage(wxImage *image) const; +}; + + +//--------------------------------------------------------------------------- +// wxIFFDecoder constructor and destructor +//--------------------------------------------------------------------------- + +wxIFFDecoder::wxIFFDecoder(wxInputStream *s) +{ + m_f = s; + m_image = 0; + databuf = 0; + decomp_mem = 0; +} + +void wxIFFDecoder::Destroy() +{ + delete m_image; + m_image = 0; + delete [] databuf; + databuf = 0; + delete [] decomp_mem; + decomp_mem = 0; +} + +//--------------------------------------------------------------------------- +// Convert this image to a wxImage object +//--------------------------------------------------------------------------- + +// This function was designed by Vaclav Slavik + +bool wxIFFDecoder::ConvertToImage(wxImage *image) const +{ + // just in case... + image->Destroy(); + + // create the image + image->Create(GetWidth(), GetHeight()); + + if (!image->Ok()) + return false; + + unsigned char *pal = GetPalette(); + unsigned char *src = GetData(); + unsigned char *dst = image->GetData(); + int colors = GetNumColors(); + int transparent = GetTransparentColour(); + long i; + + // set transparent colour mask + if (transparent != -1) + { + for (i = 0; i < colors; i++) + { + if ((pal[3 * i + 0] == 255) && + (pal[3 * i + 1] == 0) && + (pal[3 * i + 2] == 255)) + { + pal[3 * i + 2] = 254; + } + } + + pal[3 * transparent + 0] = 255, + pal[3 * transparent + 1] = 0, + pal[3 * transparent + 2] = 255; + + image->SetMaskColour(255, 0, 255); + } + else + image->SetMask(false); + +#if wxUSE_PALETTE + if (pal && colors > 0) + { + unsigned char* r = new unsigned char[colors]; + unsigned char* g = new unsigned char[colors]; + unsigned char* b = new unsigned char[colors]; + + for (i = 0; i < colors; i++) + { + r[i] = pal[3*i + 0]; + g[i] = pal[3*i + 1]; + b[i] = pal[3*i + 2]; + } + + image->SetPalette(wxPalette(colors, r, g, b)); + + delete [] r; + delete [] g; + delete [] b; + } +#endif // wxUSE_PALETTE + + // copy image data + for (i = 0; i < (long)(GetWidth() * GetHeight()); i++, src += 3, dst += 3) + { + dst[0] = src[0]; + dst[1] = src[1]; + dst[2] = src[2]; + } + + return true; +} + + +//--------------------------------------------------------------------------- +// Data accessors +//--------------------------------------------------------------------------- + +// Get data for current frame + +unsigned char* wxIFFDecoder::GetData() const { return (m_image->p); } +unsigned char* wxIFFDecoder::GetPalette() const { return (m_image->pal); } +int wxIFFDecoder::GetNumColors() const { return m_image->colors; } +unsigned int wxIFFDecoder::GetWidth() const { return (m_image->w); } +unsigned int wxIFFDecoder::GetHeight() const { return (m_image->h); } +int wxIFFDecoder::GetTransparentColour() const { return m_image->transparent; } + +//--------------------------------------------------------------------------- +// IFF reading and decoding +//--------------------------------------------------------------------------- + +// +// CanRead: +// Returns true if the file looks like a valid IFF, false otherwise. +// +bool wxIFFDecoder::CanRead() +{ + unsigned char buf[12]; + + if ( !m_f->Read(buf, WXSIZEOF(buf)) ) + return false; + + m_f->SeekI(-(wxFileOffset)WXSIZEOF(buf), wxFromCurrent); + + return (memcmp(buf, "FORM", 4) == 0) && (memcmp(buf+8, "ILBM", 4) == 0); +} + + +// ReadIFF: +// Based on xv source code by Thomas Meyer +// Permission for use in wxWidgets has been gratefully given. + +typedef unsigned char byte; +#define IFFDEBUG 0 + +/************************************************************************* + void decomprle(source, destination, source length, buffer size) + + Decompress run-length encoded data from source to destination. Terminates + when source is decoded completely or destination buffer is full. + + The decruncher is as optimized as I could make it, without risking + safety in case of corrupt BODY chunks. +**************************************************************************/ + +static void decomprle(const byte *sptr, byte *dptr, long slen, long dlen) +{ + byte codeByte, dataByte; + + while ((slen > 0) && (dlen > 0)) { + // read control byte + codeByte = *sptr++; + + if (codeByte < 0x80) { + codeByte++; + if ((slen > (long) codeByte) && (dlen >= (long) codeByte)) { + slen -= codeByte + 1; + dlen -= codeByte; + while (codeByte > 0) { + *dptr++ = *sptr++; + codeByte--; + } + } + else slen = 0; + } + + else if (codeByte > 0x80) { + codeByte = 0x81 - (codeByte & 0x7f); + if ((slen > (long) 0) && (dlen >= (long) codeByte)) { + dataByte = *sptr++; + slen -= 2; + dlen -= codeByte; + while (codeByte > 0) { + *dptr++ = dataByte; + codeByte--; + } + } + else slen = 0; + } + } +} + +/******************************************/ +static unsigned int iff_getword(const byte *ptr) +{ + unsigned int v; + + v = *ptr++; + v = (v << 8) + *ptr; + return v; +} + +/******************************************/ +static unsigned long iff_getlong(const byte *ptr) +{ + unsigned long l; + + l = *ptr++; + l = (l << 8) + *ptr++; + l = (l << 8) + *ptr++; + l = (l << 8) + *ptr; + return l; +} + +// Define internal ILBM types +#define ILBM_NORMAL 0 +#define ILBM_EHB 1 +#define ILBM_HAM 2 +#define ILBM_HAM8 3 +#define ILBM_24BIT 4 + +int wxIFFDecoder::ReadIFF() +{ + Destroy(); + + m_image = new IFFImage(); + if (m_image == 0) { + Destroy(); + return wxIFF_MEMERR; + } + + // compute file length + wxFileOffset currentPos = m_f->TellI(); + m_f->SeekI(0, wxFromEnd); + long filesize = m_f->TellI(); + m_f->SeekI(currentPos, wxFromStart); + + // allocate memory for complete file + if ((databuf = new byte[filesize]) == 0) { + Destroy(); + return wxIFF_MEMERR; + } + + m_f->Read(databuf, filesize); + const byte *dataend = databuf + filesize; + + // initialize work pointer. used to trace the buffer for IFF chunks + const byte *dataptr = databuf; + + // check for minmal size + if (dataptr + 12 > dataend) { + Destroy(); + return wxIFF_INVFORMAT; + } + + // check if we really got an IFF file + if (strncmp((char *)dataptr, "FORM", 4) != 0) { + Destroy(); + return wxIFF_INVFORMAT; + } + + dataptr = dataptr + 8; // skip ID and length of FORM + + // check if the IFF file is an ILBM (picture) file + if (strncmp((char *) dataptr, "ILBM", 4) != 0) { + Destroy(); + return wxIFF_INVFORMAT; + } + + wxLogTrace(_T("iff"), _T("IFF ILBM file recognized")); + + dataptr = dataptr + 4; // skip ID + + // + // main decoding loop. searches IFF chunks and handles them. + // terminates when BODY chunk was found or dataptr ran over end of file + // + bool BMHDok = false, CMAPok = false, CAMGok = false; + int bmhd_width = 0, bmhd_height = 0, bmhd_bitplanes = 0, bmhd_transcol = -1; + byte bmhd_masking = 0, bmhd_compression = 0; + long camg_viewmode = 0; + int colors = 0; + while (dataptr + 8 <= dataend) { + // get chunk length and make even + size_t chunkLen = (iff_getlong(dataptr + 4) + 1) & 0xfffffffe; +#ifdef __VMS + // Silence compiler warning + int chunkLen_; + chunkLen_ = chunkLen; + if (chunkLen_ < 0) { // format error? +#else + if (chunkLen < 0) { // format error? +#endif + break; + } + bool truncated = (dataptr + 8 + chunkLen > dataend); + + if (strncmp((char *)dataptr, "BMHD", 4) == 0) { // BMHD chunk? + if (chunkLen < 12 + 2 || truncated) { + break; + } + bmhd_width = iff_getword(dataptr + 8); // width of picture + bmhd_height= iff_getword(dataptr + 8 + 2); // height of picture + bmhd_bitplanes = *(dataptr + 8 + 8); // # of bitplanes + bmhd_masking = *(dataptr + 8 + 9); + bmhd_compression = *(dataptr + 8 + 10); // get compression + bmhd_transcol = iff_getword(dataptr + 8 + 12); + BMHDok = true; // got BMHD + dataptr += 8 + chunkLen; // to next chunk + } + else if (strncmp((char *)dataptr, "CMAP", 4) == 0) { // CMAP ? + if (truncated) { + break; + } + const byte *cmapptr = dataptr + 8; + colors = chunkLen / 3; // calc no of colors + + delete m_image->pal; + m_image->pal = 0; + m_image->colors = colors; + if (colors > 0) { + m_image->pal = new byte[3*colors]; + if (!m_image->pal) { + Destroy(); + return wxIFF_MEMERR; + } + + // copy colors to color map + for (int i=0; i < colors; i++) { + m_image->pal[3*i + 0] = *cmapptr++; + m_image->pal[3*i + 1] = *cmapptr++; + m_image->pal[3*i + 2] = *cmapptr++; + } + } + + wxLogTrace(_T("iff"), _T("Read %d colors from IFF file."), + colors); + + CMAPok = true; // got CMAP + dataptr += 8 + chunkLen; // to next chunk + } else if (strncmp((char *)dataptr, "CAMG", 4) == 0) { // CAMG ? + if (chunkLen < 4 || truncated) { + break; + } + camg_viewmode = iff_getlong(dataptr + 8); // get viewmodes + CAMGok = true; // got CAMG + dataptr += 8 + chunkLen; // to next chunk + } + else if (strncmp((char *)dataptr, "BODY", 4) == 0) { // BODY ? + if (!BMHDok) { // BMHD found? + break; + } + const byte *bodyptr = dataptr + 8; // -> BODY data + + if (truncated) { + chunkLen = dataend - dataptr; + } + + // + // if BODY is compressed, allocate buffer for decrunched BODY + // and decompress it (run length encoding) + // + if (bmhd_compression == 1) { + // calc size of decrunch buffer - (size of the actual pic. + // decompressed in interleaved Amiga bitplane format) + + size_t decomp_bufsize = (((bmhd_width + 15) >> 4) << 1) + * bmhd_height * bmhd_bitplanes; + + if ((decomp_mem = new byte[decomp_bufsize]) == 0) { + Destroy(); + return wxIFF_MEMERR; + } + + decomprle(bodyptr, decomp_mem, chunkLen, decomp_bufsize); + bodyptr = decomp_mem; // -> uncompressed BODY + chunkLen = decomp_bufsize; + delete [] databuf; + databuf = 0; + } + + // the following determines the type of the ILBM file. + // it's either NORMAL, EHB, HAM, HAM8 or 24BIT + + int fmt = ILBM_NORMAL; // assume normal ILBM + if (bmhd_bitplanes == 24) { + fmt = ILBM_24BIT; + } else if (bmhd_bitplanes == 8) { + if (CAMGok && (camg_viewmode & 0x800)) { + fmt = ILBM_HAM8; + } + } else if ((bmhd_bitplanes > 5) && CAMGok) { + if (camg_viewmode & 0x80) { + fmt = ILBM_EHB; + } else if (camg_viewmode & 0x800) { + fmt = ILBM_HAM; + } + } + + wxLogTrace(_T("iff"), + _T("LoadIFF: %s %dx%d, planes=%d (%d cols), comp=%d"), + (fmt==ILBM_NORMAL) ? "Normal ILBM" : + (fmt==ILBM_HAM) ? "HAM ILBM" : + (fmt==ILBM_HAM8) ? "HAM8 ILBM" : + (fmt==ILBM_EHB) ? "EHB ILBM" : + (fmt==ILBM_24BIT) ? "24BIT ILBM" : "unknown ILBM", + bmhd_width, bmhd_height, bmhd_bitplanes, + 1< m_image->colors) { + byte *pal = new byte[colors*3]; + if (!pal) { + Destroy(); + return wxIFF_MEMERR; + } + int i; + for (i = 0; i < m_image->colors; i++) { + pal[3*i + 0] = m_image->pal[3*i + 0]; + pal[3*i + 1] = m_image->pal[3*i + 1]; + pal[3*i + 2] = m_image->pal[3*i + 2]; + } + for (; i < colors; i++) { + pal[3*i + 0] = 0; + pal[3*i + 1] = 0; + pal[3*i + 2] = 0; + } + delete m_image->pal; + m_image->pal = pal; + m_image->colors = colors; + } + + for (int i=0; i < colors; i++) { + m_image->pal[3*i + 0] = (m_image->pal[3*i + 0] >> 4) * 17; + m_image->pal[3*i + 1] = (m_image->pal[3*i + 1] >> 4) * 17; + m_image->pal[3*i + 2] = (m_image->pal[3*i + 2] >> 4) * 17; + } + } + + m_image->p = new byte[bmhd_width * bmhd_height * 3]; + byte *picptr = m_image->p; + if (!picptr) { + Destroy(); + return wxIFF_MEMERR; + } + + byte *pal = m_image->pal; + int lineskip = ((bmhd_width + 15) >> 4) << 1; + int height = chunkLen / (lineskip * bmhd_bitplanes); + + if (bmhd_height < height) { + height = bmhd_height; + } + + if (fmt == ILBM_HAM || fmt == ILBM_HAM8 || fmt == ILBM_24BIT) { + byte *pic = picptr; + const byte *workptr = bodyptr; + + for (int i=0; i < height; i++) { + byte bitmsk = 0x80; + const byte *workptr2 = workptr; + + // at start of each line, init RGB values to background + byte rval = pal[0]; + byte gval = pal[1]; + byte bval = pal[2]; + + for (int j=0; j < bmhd_width; j++) { + long col = 0; + long colbit = 1; + const byte *workptr3 = workptr2; + for (int k=0; k < bmhd_bitplanes; k++) { + if (*workptr3 & bitmsk) { + col += colbit; + } + workptr3 += lineskip; + colbit <<= 1; + } + + if (fmt==ILBM_HAM) { + int c = (col & 0x0f); + switch (col & 0x30) { + case 0x00: if (c >= 0 && c < colors) { + rval = pal[3*c + 0]; + gval = pal[3*c + 1]; + bval = pal[3*c + 2]; + } + break; + + case 0x10: bval = c * 17; + break; + + case 0x20: rval = c * 17; + break; + + case 0x30: gval = c * 17; + break; + } + } else if (fmt == ILBM_HAM8) { + int c = (col & 0x3f); + switch(col & 0xc0) { + case 0x00: if (c >= 0 && c < colors) { + rval = pal[3*c + 0]; + gval = pal[3*c + 1]; + bval = pal[3*c + 2]; + } + break; + + case 0x40: bval = (bval & 3) | (c << 2); + break; + + case 0x80: rval = (rval & 3) | (c << 2); + break; + + case 0xc0: gval = (rval & 3) | (c << 2); + } + } else { + rval = col & 0xff; + gval = (col >> 8) & 0xff; + bval = (col >> 16) & 0xff; + } + + *pic++ = rval; + *pic++ = gval; + *pic++ = bval; + + bitmsk = bitmsk >> 1; + if (bitmsk == 0) { + bitmsk = 0x80; + workptr2++; + } + } + workptr += lineskip * bmhd_bitplanes; + } + } else if ((fmt == ILBM_NORMAL) || (fmt == ILBM_EHB)) { + if (fmt == ILBM_EHB) { + wxLogTrace(_T("iff"), _T("Doubling CMAP for EHB mode")); + + for (int i=0; i<32; i++) { + pal[3*(i + 32) + 0] = pal[3*i + 0] >> 1; + pal[3*(i + 32) + 1] = pal[3*i + 1] >> 1; + pal[3*(i + 32) + 2] = pal[3*i + 2] >> 1; + } + } + + byte *pic = picptr; // ptr to buffer + const byte *workptr = bodyptr; // ptr to pic, planar format + + if (bmhd_height < height) { + height = bmhd_height; + } + + for (int i=0; i < height; i++) { + byte bitmsk = 0x80; // left most bit (mask) + const byte *workptr2 = workptr; // work ptr to source + for (int j=0; j < bmhd_width; j++) { + long col = 0; + long colbit = 1; + const byte *workptr3 = workptr2; // 1st byte in 1st pln + + for (int k=0; k < bmhd_bitplanes; k++) { + if (*workptr3 & bitmsk) { // if bit set in this pln + col = col + colbit; // add bit to chunky byte + } + workptr3 += lineskip; // go to next line + colbit <<= 1; // shift color bit + } + + if (col >= 0 && col < colors) { + pic[0] = pal[3*col + 0]; + pic[1] = pal[3*col + 1]; + pic[2] = pal[3*col + 2]; + } else { + pic[0] = pic[1] = pic[2] = 0; + } + pic += 3; + bitmsk = bitmsk >> 1; // shift mask to next bit + if (bitmsk == 0) { // if mask is zero + bitmsk = 0x80; // reset mask + workptr2++; // mv ptr to next byte + } + } + + workptr += lineskip * bmhd_bitplanes; // to next line + } + } else { + break; // unknown format + } + + m_image->w = bmhd_width; + m_image->h = height; + m_image->transparent = bmhd_transcol; + + wxLogTrace(_T("iff"), _T("Loaded IFF picture %s"), + truncated? "truncated" : "completely"); + + return (truncated? wxIFF_TRUNCATED : wxIFF_OK); + } else { + wxLogTrace(_T("iff"), _T("Skipping unknown chunk '%c%c%c%c'"), + *dataptr, *(dataptr+1), *(dataptr+2), *(dataptr+3)); + + dataptr = dataptr + 8 + chunkLen; // skip unknown chunk + } + } + + Destroy(); + return wxIFF_INVFORMAT; +} + + + +//----------------------------------------------------------------------------- +// wxIFFHandler +//----------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxIFFHandler, wxImageHandler) + +#if wxUSE_STREAMS + +bool wxIFFHandler::LoadFile(wxImage *image, wxInputStream& stream, + bool verbose, int WXUNUSED(index)) +{ + wxIFFDecoder *decod; + int error; + bool ok; + + decod = new wxIFFDecoder(&stream); + error = decod->ReadIFF(); + + if ((error != wxIFF_OK) && (error != wxIFF_TRUNCATED)) + { + if (verbose) + { + switch (error) + { + case wxIFF_INVFORMAT: + wxLogError(_("IFF: error in IFF image format.")); + break; + case wxIFF_MEMERR: + wxLogError(_("IFF: not enough memory.")); + break; + default: + wxLogError(_("IFF: unknown error!!!")); + break; + } + } + delete decod; + return false; + } + + if ((error == wxIFF_TRUNCATED) && verbose) + { + wxLogError(_("IFF: data stream seems to be truncated.")); + /* go on; image data is OK */ + } + + ok = decod->ConvertToImage(image); + delete decod; + + return ok; +} + +bool wxIFFHandler::SaveFile(wxImage * WXUNUSED(image), + wxOutputStream& WXUNUSED(stream), bool verbose) +{ + if (verbose) + wxLogDebug(wxT("IFF: the handler is read-only!!")); + + return false; +} + +bool wxIFFHandler::DoCanRead(wxInputStream& stream) +{ + wxIFFDecoder decod(&stream); + + return decod.CanRead(); +} + +#endif // wxUSE_STREAMS + +#endif // wxUSE_IFF diff --git a/Externals/wxWidgets/src/common/imagjpeg.cpp b/Externals/wxWidgets/src/common/imagjpeg.cpp new file mode 100644 index 0000000000..a247d70915 --- /dev/null +++ b/Externals/wxWidgets/src/common/imagjpeg.cpp @@ -0,0 +1,480 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/imagjpeg.cpp +// Purpose: wxImage JPEG handler +// Author: Vaclav Slavik +// RCS-ID: $Id: imagjpeg.cpp 43781 2006-12-03 21:59:47Z MW $ +// Copyright: (c) Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_IMAGE && wxUSE_LIBJPEG + +#include "wx/imagjpeg.h" + +#ifndef WX_PRECOMP + #include "wx/log.h" + #include "wx/app.h" + #include "wx/intl.h" + #include "wx/bitmap.h" + #include "wx/module.h" +#endif + +// A hack based on one from tif_jpeg.c to overcome the problem on Windows +// of rpcndr.h defining boolean with a different type to the jpeg headers. +// +// This hack is only necessary for an external jpeg library, the builtin one +// usually used on Windows doesn't use the type boolean, so always works. +// +#ifdef wxHACK_BOOLEAN + #define HAVE_BOOLEAN + #define boolean wxHACK_BOOLEAN +#endif + +extern "C" +{ + #if defined(__WXMSW__) + #define XMD_H + #endif + #include "jpeglib.h" +} + +#ifndef HAVE_WXJPEG_BOOLEAN +typedef boolean wxjpeg_boolean; +#endif + +#include "wx/filefn.h" +#include "wx/wfstream.h" + +// For memcpy +#include +// For JPEG library error handling +#include + +#ifdef __SALFORDC__ +#undef FAR +#endif + +// ---------------------------------------------------------------------------- +// types +// ---------------------------------------------------------------------------- + +// the standard definition of METHODDEF(type) from jmorecfg.h is "static type" +// which means that we can't declare the method functions as extern "C" - the +// compiler (rightfully) complains about the multiple storage classes in +// declaration +// +// so we only add extern "C" when using our own, modified, jmorecfg.h - and use +// whatever we have in the system headers if this is what we use hoping that it +// should be ok (can't do anything else) +#ifdef JPEG_METHOD_LINKAGE + #define CPP_METHODDEF(type) extern "C" METHODDEF(type) +#else // not using our jmorecfg.h header + #define CPP_METHODDEF(type) METHODDEF(type) +#endif + +//----------------------------------------------------------------------------- +// wxJPEGHandler +//----------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxJPEGHandler,wxImageHandler) + +#if wxUSE_STREAMS + +//------------- JPEG Data Source Manager + +#define JPEG_IO_BUFFER_SIZE 2048 + +typedef struct { + struct jpeg_source_mgr pub; /* public fields */ + + JOCTET* buffer; /* start of buffer */ + wxInputStream *stream; +} wx_source_mgr; + +typedef wx_source_mgr * wx_src_ptr; + +CPP_METHODDEF(void) wx_init_source ( j_decompress_ptr WXUNUSED(cinfo) ) +{ +} + +CPP_METHODDEF(wxjpeg_boolean) wx_fill_input_buffer ( j_decompress_ptr cinfo ) +{ + wx_src_ptr src = (wx_src_ptr) cinfo->src; + + src->pub.next_input_byte = src->buffer; + src->pub.bytes_in_buffer = src->stream->Read(src->buffer, JPEG_IO_BUFFER_SIZE).LastRead(); + + if (src->pub.bytes_in_buffer == 0) // check for end-of-stream + { + // Insert a fake EOI marker + src->buffer[0] = 0xFF; + src->buffer[1] = JPEG_EOI; + src->pub.bytes_in_buffer = 2; + } + return TRUE; +} + +CPP_METHODDEF(void) wx_skip_input_data ( j_decompress_ptr cinfo, long num_bytes ) +{ + if (num_bytes > 0) + { + wx_src_ptr src = (wx_src_ptr) cinfo->src; + + while (num_bytes > (long)src->pub.bytes_in_buffer) + { + num_bytes -= (long) src->pub.bytes_in_buffer; + src->pub.fill_input_buffer(cinfo); + } + src->pub.next_input_byte += (size_t) num_bytes; + src->pub.bytes_in_buffer -= (size_t) num_bytes; + } +} + +CPP_METHODDEF(void) wx_term_source ( j_decompress_ptr cinfo ) +{ + wx_src_ptr src = (wx_src_ptr) cinfo->src; + + if (src->pub.bytes_in_buffer > 0) + src->stream->SeekI(-(long)src->pub.bytes_in_buffer, wxFromCurrent); + delete[] src->buffer; +} + + +// JPEG error manager: + +struct wx_error_mgr { + struct jpeg_error_mgr pub; /* "public" fields */ + + jmp_buf setjmp_buffer; /* for return to caller */ +}; + +typedef struct wx_error_mgr * wx_error_ptr; + +/* + * Here's the routine that will replace the standard error_exit method: + */ + +CPP_METHODDEF(void) wx_error_exit (j_common_ptr cinfo) +{ + /* cinfo->err really points to a wx_error_mgr struct, so coerce pointer */ + wx_error_ptr myerr = (wx_error_ptr) cinfo->err; + + /* Always display the message. */ + /* We could postpone this until after returning, if we chose. */ + (*cinfo->err->output_message) (cinfo); + + /* Return control to the setjmp point */ + longjmp(myerr->setjmp_buffer, 1); +} + +/* + * This will replace the standard output_message method when the user + * wants us to be silent (verbose==false). We must have such method instead of + * simply using NULL for cinfo->err->output_message because it's called + * unconditionally from within libjpeg when there's "garbage input". + */ +CPP_METHODDEF(void) wx_ignore_message (j_common_ptr WXUNUSED(cinfo)) +{ +} + +void wx_jpeg_io_src( j_decompress_ptr cinfo, wxInputStream& infile ) +{ + wx_src_ptr src; + + if (cinfo->src == NULL) { /* first time for this JPEG object? */ + cinfo->src = (struct jpeg_source_mgr *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, + sizeof(wx_source_mgr)); + } + src = (wx_src_ptr) cinfo->src; + src->pub.bytes_in_buffer = 0; /* forces fill_input_buffer on first read */ + src->buffer = new JOCTET[JPEG_IO_BUFFER_SIZE]; + src->pub.next_input_byte = NULL; /* until buffer loaded */ + src->stream = &infile; + + src->pub.init_source = wx_init_source; + src->pub.fill_input_buffer = wx_fill_input_buffer; + src->pub.skip_input_data = wx_skip_input_data; + src->pub.resync_to_restart = jpeg_resync_to_restart; /* use default method */ + src->pub.term_source = wx_term_source; +} + +static inline void wx_cmyk_to_rgb(unsigned char* rgb, const unsigned char* cmyk) +{ + register int k = 255 - cmyk[3]; + register int k2 = cmyk[3]; + register int c; + + c = k + k2 * (255 - cmyk[0]) / 255; + rgb[0] = (unsigned char)((c > 255) ? 0 : (255 - c)); + + c = k + k2 * (255 - cmyk[1]) / 255; + rgb[1] = (unsigned char)((c > 255) ? 0 : (255 - c)); + + c = k + k2 * (255 - cmyk[2]) / 255; + rgb[2] = (unsigned char)((c > 255) ? 0 : (255 - c)); +} + +// temporarily disable the warning C4611 (interaction between '_setjmp' and +// C++ object destruction is non-portable) - I don't see any dtors here +#ifdef __VISUALC__ + #pragma warning(disable:4611) +#endif /* VC++ */ + +bool wxJPEGHandler::LoadFile( wxImage *image, wxInputStream& stream, bool verbose, int WXUNUSED(index) ) +{ + struct jpeg_decompress_struct cinfo; + struct wx_error_mgr jerr; + unsigned char *ptr; + + image->Destroy(); + cinfo.err = jpeg_std_error( &jerr.pub ); + jerr.pub.error_exit = wx_error_exit; + + if (!verbose) + cinfo.err->output_message = wx_ignore_message; + + /* Establish the setjmp return context for wx_error_exit to use. */ + if (setjmp(jerr.setjmp_buffer)) { + /* If we get here, the JPEG code has signaled an error. + * We need to clean up the JPEG object, close the input file, and return. + */ + if (verbose) + wxLogError(_("JPEG: Couldn't load - file is probably corrupted.")); + (cinfo.src->term_source)(&cinfo); + jpeg_destroy_decompress(&cinfo); + if (image->Ok()) image->Destroy(); + return false; + } + + jpeg_create_decompress( &cinfo ); + wx_jpeg_io_src( &cinfo, stream ); + jpeg_read_header( &cinfo, TRUE ); + + int bytesPerPixel; + if ((cinfo.out_color_space == JCS_CMYK) || (cinfo.out_color_space == JCS_YCCK)) + { + cinfo.out_color_space = JCS_CMYK; + bytesPerPixel = 4; + } + else // all the rest is treated as RGB + { + cinfo.out_color_space = JCS_RGB; + bytesPerPixel = 3; + } + + jpeg_start_decompress( &cinfo ); + + image->Create( cinfo.image_width, cinfo.image_height ); + if (!image->Ok()) { + jpeg_finish_decompress( &cinfo ); + jpeg_destroy_decompress( &cinfo ); + return false; + } + image->SetMask( false ); + ptr = image->GetData(); + + unsigned stride = cinfo.output_width * bytesPerPixel; + JSAMPARRAY tempbuf = (*cinfo.mem->alloc_sarray) + ((j_common_ptr) &cinfo, JPOOL_IMAGE, stride, 1 ); + + while ( cinfo.output_scanline < cinfo.output_height ) + { + jpeg_read_scanlines( &cinfo, tempbuf, 1 ); + if (cinfo.out_color_space == JCS_RGB) + { + memcpy( ptr, tempbuf[0], stride ); + ptr += stride; + } + else // CMYK + { + const unsigned char* inptr = (const unsigned char*) tempbuf[0]; + for (size_t i = 0; i < cinfo.output_width; i++) + { + wx_cmyk_to_rgb(ptr, inptr); + ptr += 3; + inptr += 4; + } + } + } + + jpeg_finish_decompress( &cinfo ); + jpeg_destroy_decompress( &cinfo ); + return true; +} + +typedef struct { + struct jpeg_destination_mgr pub; + + wxOutputStream *stream; + JOCTET * buffer; +} wx_destination_mgr; + +typedef wx_destination_mgr * wx_dest_ptr; + +#define OUTPUT_BUF_SIZE 4096 /* choose an efficiently fwrite'able size */ + +CPP_METHODDEF(void) wx_init_destination (j_compress_ptr cinfo) +{ + wx_dest_ptr dest = (wx_dest_ptr) cinfo->dest; + + /* Allocate the output buffer --- it will be released when done with image */ + dest->buffer = (JOCTET *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + OUTPUT_BUF_SIZE * sizeof(JOCTET)); + dest->pub.next_output_byte = dest->buffer; + dest->pub.free_in_buffer = OUTPUT_BUF_SIZE; +} + +CPP_METHODDEF(wxjpeg_boolean) wx_empty_output_buffer (j_compress_ptr cinfo) +{ + wx_dest_ptr dest = (wx_dest_ptr) cinfo->dest; + + dest->stream->Write(dest->buffer, OUTPUT_BUF_SIZE); + dest->pub.next_output_byte = dest->buffer; + dest->pub.free_in_buffer = OUTPUT_BUF_SIZE; + return TRUE; +} + +CPP_METHODDEF(void) wx_term_destination (j_compress_ptr cinfo) +{ + wx_dest_ptr dest = (wx_dest_ptr) cinfo->dest; + size_t datacount = OUTPUT_BUF_SIZE - dest->pub.free_in_buffer; + /* Write any data remaining in the buffer */ + if (datacount > 0) + dest->stream->Write(dest->buffer, datacount); +} + +GLOBAL(void) wx_jpeg_io_dest (j_compress_ptr cinfo, wxOutputStream& outfile) +{ + wx_dest_ptr dest; + + if (cinfo->dest == NULL) { /* first time for this JPEG object? */ + cinfo->dest = (struct jpeg_destination_mgr *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, + sizeof(wx_destination_mgr)); + } + + dest = (wx_dest_ptr) cinfo->dest; + dest->pub.init_destination = wx_init_destination; + dest->pub.empty_output_buffer = wx_empty_output_buffer; + dest->pub.term_destination = wx_term_destination; + dest->stream = &outfile; +} + +bool wxJPEGHandler::SaveFile( wxImage *image, wxOutputStream& stream, bool verbose ) +{ + struct jpeg_compress_struct cinfo; + struct wx_error_mgr jerr; + JSAMPROW row_pointer[1]; /* pointer to JSAMPLE row[s] */ + JSAMPLE *image_buffer; + int stride; /* physical row width in image buffer */ + + cinfo.err = jpeg_std_error(&jerr.pub); + jerr.pub.error_exit = wx_error_exit; + + if (!verbose) + cinfo.err->output_message = wx_ignore_message; + + /* Establish the setjmp return context for wx_error_exit to use. */ + if (setjmp(jerr.setjmp_buffer)) + { + /* If we get here, the JPEG code has signaled an error. + * We need to clean up the JPEG object, close the input file, and return. + */ + if (verbose) + wxLogError(_("JPEG: Couldn't save image.")); + jpeg_destroy_compress(&cinfo); + return false; + } + + jpeg_create_compress(&cinfo); + wx_jpeg_io_dest(&cinfo, stream); + + cinfo.image_width = image->GetWidth(); + cinfo.image_height = image->GetHeight(); + cinfo.input_components = 3; + cinfo.in_color_space = JCS_RGB; + jpeg_set_defaults(&cinfo); + + // TODO: 3rd parameter is force_baseline, what value should this be? + // Code says: "If force_baseline is TRUE, the computed quantization table entries + // are limited to 1..255 for JPEG baseline compatibility." + // 'Quality' is a number between 0 (terrible) and 100 (very good). + // The default (in jcparam.c, jpeg_set_defaults) is 75, + // and force_baseline is TRUE. + if (image->HasOption(wxIMAGE_OPTION_QUALITY)) + jpeg_set_quality(&cinfo, image->GetOptionInt(wxIMAGE_OPTION_QUALITY), TRUE); + + // set the resolution fields in the output file + UINT16 resX, + resY; + if ( image->HasOption(wxIMAGE_OPTION_RESOLUTIONX) && + image->HasOption(wxIMAGE_OPTION_RESOLUTIONY) ) + { + resX = (UINT16)image->GetOptionInt(wxIMAGE_OPTION_RESOLUTIONX); + resY = (UINT16)image->GetOptionInt(wxIMAGE_OPTION_RESOLUTIONY); + } + else if ( image->HasOption(wxIMAGE_OPTION_RESOLUTION) ) + { + resX = + resY = (UINT16)image->GetOptionInt(wxIMAGE_OPTION_RESOLUTION); + } + else + { + resX = + resY = 0; + } + + if ( resX && resY ) + { + cinfo.X_density = resX; + cinfo.Y_density = resY; + } + + // sets the resolution unit field in the output file + // wxIMAGE_RESOLUTION_INCHES for inches + // wxIMAGE_RESOLUTION_CM for centimeters + if ( image->HasOption(wxIMAGE_OPTION_RESOLUTIONUNIT) ) + { + cinfo.density_unit = (UINT8)image->GetOptionInt(wxIMAGE_OPTION_RESOLUTIONUNIT); + } + + jpeg_start_compress(&cinfo, TRUE); + + stride = cinfo.image_width * 3; /* JSAMPLEs per row in image_buffer */ + image_buffer = image->GetData(); + while (cinfo.next_scanline < cinfo.image_height) { + row_pointer[0] = &image_buffer[cinfo.next_scanline * stride]; + jpeg_write_scanlines( &cinfo, row_pointer, 1 ); + } + jpeg_finish_compress(&cinfo); + jpeg_destroy_compress(&cinfo); + + return true; +} + +#ifdef __VISUALC__ + #pragma warning(default:4611) +#endif /* VC++ */ + +bool wxJPEGHandler::DoCanRead( wxInputStream& stream ) +{ + unsigned char hdr[2]; + + if ( !stream.Read(hdr, WXSIZEOF(hdr)) ) + return false; + + return hdr[0] == 0xFF && hdr[1] == 0xD8; +} + +#endif // wxUSE_STREAMS + +#endif // wxUSE_LIBJPEG diff --git a/Externals/wxWidgets/src/common/imagpcx.cpp b/Externals/wxWidgets/src/common/imagpcx.cpp new file mode 100644 index 0000000000..96694be690 --- /dev/null +++ b/Externals/wxWidgets/src/common/imagpcx.cpp @@ -0,0 +1,500 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/imagpcx.cpp +// Purpose: wxImage PCX handler +// Author: Guillermo Rodriguez Garcia +// Version: 1.1 +// CVS-ID: $Id: imagpcx.cpp 40943 2006-08-31 19:31:43Z ABX $ +// Copyright: (c) 1999 Guillermo Rodriguez Garcia +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_IMAGE && wxUSE_PCX + +#ifndef WX_PRECOMP + #include "wx/object.h" + #include "wx/list.h" + #include "wx/log.h" + #include "wx/intl.h" + #include "wx/palette.h" + #include "wx/hash.h" + #include "wx/module.h" +#endif + +#include "wx/imagpcx.h" +#include "wx/wfstream.h" + +//----------------------------------------------------------------------------- +// wxPCXHandler +//----------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxPCXHandler,wxImageHandler) + +#if wxUSE_STREAMS + +//----------------------------------------------------------------------------- +// RLE encoding and decoding +//----------------------------------------------------------------------------- + +void RLEencode(unsigned char *p, unsigned int size, wxOutputStream& s) +{ + unsigned int data, last, cont; + + // Write 'size' bytes. The PCX official specs say there will be + // a decoding break at the end of each scanline, so in order to + // force this decoding break use this function to write, at most, + // _one_ complete scanline at a time. + + last = (unsigned char) *(p++); + cont = 1; + size--; + + while (size-- > 0) + { + data = (unsigned char) *(p++); + + // Up to 63 bytes with the same value can be stored using + // a single { cont, value } pair. + // + if ((data == last) && (cont < 63)) + { + cont++; + } + else + { + // need to write a 'counter' byte? + if ((cont > 1) || ((last & 0xC0) == 0xC0)) + s.PutC((char) (cont | 0xC0)); + + s.PutC((char) last); + last = data; + cont = 1; + } + } + + // write the last one and return; + if ((cont > 1) || ((last & 0xC0) == 0xC0)) + s.PutC((char) (cont | 0xC0)); + + s.PutC((char) last); +} + +void RLEdecode(unsigned char *p, unsigned int size, wxInputStream& s) +{ + unsigned int i, data, cont; + + // Read 'size' bytes. The PCX official specs say there will be + // a decoding break at the end of each scanline (but not at the + // end of each plane inside a scanline). Only use this function + // to read one or more _complete_ scanlines. Else, more than + // 'size' bytes might be read and the buffer might overflow. + + while (size > 0) + { + data = (unsigned char)s.GetC(); + + // If ((data & 0xC0) != 0xC0), then the value read is a data + // byte. Else, it is a counter (cont = val & 0x3F) and the + // next byte is the data byte. + + if ((data & 0xC0) != 0xC0) + { + *(p++) = (unsigned char)data; + size--; + } + else + { + cont = data & 0x3F; + data = (unsigned char)s.GetC(); + for (i = 1; i <= cont; i++) + *(p++) = (unsigned char)data; + size -= cont; + } + } +} + + +//----------------------------------------------------------------------------- +// PCX reading and saving +//----------------------------------------------------------------------------- + +// PCX header +#define HDR_MANUFACTURER 0 +#define HDR_VERSION 1 +#define HDR_ENCODING 2 +#define HDR_BITSPERPIXEL 3 +#define HDR_XMIN 4 +#define HDR_YMIN 6 +#define HDR_XMAX 8 +#define HDR_YMAX 10 +#define HDR_NPLANES 65 +#define HDR_BYTESPERLINE 66 +#define HDR_PALETTEINFO 68 + +// image formats +enum { + wxPCX_8BIT, // 8 bpp, 1 plane (8 bit) + wxPCX_24BIT // 8 bpp, 3 planes (24 bit) +}; + +// error codes +enum { + wxPCX_OK = 0, // everything was OK + wxPCX_INVFORMAT = 1, // error in pcx file format + wxPCX_MEMERR = 2, // error allocating memory + wxPCX_VERERR = 3 // error in pcx version number +}; + + +// ReadPCX: +// Loads a PCX file into the wxImage object pointed by image. +// Returns wxPCX_OK on success, or an error code otherwise +// (see above for error codes) +// +int ReadPCX(wxImage *image, wxInputStream& stream) +{ + unsigned char hdr[128]; // PCX header + unsigned char pal[768]; // palette for 8 bit images + unsigned char *p; // space to store one scanline + unsigned char *dst; // pointer into wxImage data + unsigned int width, height; // size of the image + unsigned int bytesperline; // bytes per line (each plane) + int bitsperpixel; // bits per pixel (each plane) + int nplanes; // number of planes + int encoding; // is the image RLE encoded? + int format; // image format (8 bit, 24 bit) + unsigned int i, j; + + // Read PCX header and check the version number (it must + // be at least 5 or higher for 8 bit and 24 bit images). + + stream.Read(hdr, 128); + + if (hdr[HDR_VERSION] < 5) return wxPCX_VERERR; + + // Extract all image info from the PCX header. + + encoding = hdr[HDR_ENCODING]; + nplanes = hdr[HDR_NPLANES]; + bitsperpixel = hdr[HDR_BITSPERPIXEL]; + bytesperline = hdr[HDR_BYTESPERLINE] + 256 * hdr[HDR_BYTESPERLINE + 1]; + width = (hdr[HDR_XMAX] + 256 * hdr[HDR_XMAX + 1]) - + (hdr[HDR_XMIN] + 256 * hdr[HDR_XMIN + 1]) + 1; + height = (hdr[HDR_YMAX] + 256 * hdr[HDR_YMAX + 1]) - + (hdr[HDR_YMIN] + 256 * hdr[HDR_YMIN + 1]) + 1; + + // Check image format. Currently supported formats are + // 8 bits (8 bpp, 1 plane) and 24 bits (8 bpp, 3 planes). + + if ((nplanes == 3) && (bitsperpixel == 8)) + format = wxPCX_24BIT; + else if ((nplanes == 1) && (bitsperpixel == 8)) + format = wxPCX_8BIT; + else + return wxPCX_INVFORMAT; + + // If the image is of type wxPCX_8BIT, then there is + // a palette at the end of the image data. If we were + // working with a file, we could seek at the end to the + // end (SeekI(-769, wxFromEnd) and read the palette + // before proceeding. Unfortunately, this would prevent + // loading several PCXs in a single stream, so we can't + // do it. Thus, 8-bit images will have to be decoded in + // two passes: one to read and decode the image data, + // and another to replace 'colour indexes' with RGB + // values. + + // Resize the image and allocate memory for a scanline. + + image->Create(width, height); + + if (!image->Ok()) + return wxPCX_MEMERR; + + if ((p = (unsigned char *) malloc(bytesperline * nplanes)) == NULL) + return wxPCX_MEMERR; + + // Now start reading the file, line by line, and store + // the data in the format required by wxImage. + + dst = image->GetData(); + + for (j = height; j; j--) + { + if (encoding) + RLEdecode(p, bytesperline * nplanes, stream); + else + stream.Read(p, bytesperline * nplanes); + + switch (format) + { + case wxPCX_8BIT: + { + for (i = 0; i < width; i++) + { + // first pass, just store the colour index + *dst = p[i]; + dst += 3; + } + break; + } + case wxPCX_24BIT: + { + for (i = 0; i < width; i++) + { + *(dst++) = p[i]; + *(dst++) = p[i + bytesperline]; + *(dst++) = p[i + 2 * bytesperline]; + } + break; + } + } + } + + free(p); + + // For 8 bit images, we read the palette, and then do a second + // pass replacing indexes with their RGB values; + + if (format == wxPCX_8BIT) + { + unsigned char index; + + if (stream.GetC() != 12) + return wxPCX_INVFORMAT; + + stream.Read(pal, 768); + + p = image->GetData(); + for (unsigned long k = height * width; k; k--) + { + index = *p; + *(p++) = pal[3 * index]; + *(p++) = pal[3 * index + 1]; + *(p++) = pal[3 * index + 2]; + } + +#if wxUSE_PALETTE + unsigned char r[256]; + unsigned char g[256]; + unsigned char b[256]; + for (i = 0; i < 256; i++) + { + r[i] = pal[3*i + 0]; + g[i] = pal[3*i + 1]; + b[i] = pal[3*i + 2]; + } + image->SetPalette(wxPalette(256, r, g, b)); +#endif // wxUSE_PALETTE + } + + return wxPCX_OK; +} + +// SavePCX: +// Saves a PCX file into the wxImage object pointed by image. +// Returns wxPCX_OK on success, or an error code otherwise +// (see above for error codes). Will try to save as 8-bit +// PCX if possible, and then fall back to 24-bit if there +// are more than 256 different colours. +// +int SavePCX(wxImage *image, wxOutputStream& stream) +{ + unsigned char hdr[128]; // PCX header + unsigned char pal[768]; // palette for 8 bit images + unsigned char *p; // space to store one scanline + unsigned char *src; // pointer into wxImage data + unsigned int width, height; // size of the image + unsigned int bytesperline; // bytes per line (each plane) + unsigned char nplanes = 3; // number of planes + int format = wxPCX_24BIT; // image format (8 bit, 24 bit) + wxImageHistogram histogram; // image histogram + unsigned long key; // key in the hashtable + unsigned int i; + + // See if we can save as 8 bit. + + if (image->CountColours(256) <= 256) + { + image->ComputeHistogram(histogram); + format = wxPCX_8BIT; + nplanes = 1; + } + + // Get image dimensions, calculate bytesperline (must be even, + // according to PCX specs) and allocate space for one complete + // scanline. + + if (!image->Ok()) + return wxPCX_INVFORMAT; + + width = image->GetWidth(); + height = image->GetHeight(); + bytesperline = width; + if (bytesperline % 2) + bytesperline++; + + if ((p = (unsigned char *) malloc(bytesperline * nplanes)) == NULL) + return wxPCX_MEMERR; + + // Build header data and write it to the stream. Initially, + // set all bytes to zero (most values default to zero). + + memset(hdr, 0, sizeof(hdr)); + + hdr[HDR_MANUFACTURER] = 10; + hdr[HDR_VERSION] = 5; + hdr[HDR_ENCODING] = 1; + hdr[HDR_NPLANES] = nplanes; + hdr[HDR_BITSPERPIXEL] = 8; + hdr[HDR_BYTESPERLINE] = (unsigned char)(bytesperline % 256); + hdr[HDR_BYTESPERLINE + 1] = (unsigned char)(bytesperline / 256); + hdr[HDR_XMAX] = (unsigned char)((width - 1) % 256); + hdr[HDR_XMAX + 1] = (unsigned char)((width - 1) / 256); + hdr[HDR_YMAX] = (unsigned char)((height - 1) % 256); + hdr[HDR_YMAX + 1] = (unsigned char)((height - 1) / 256); + hdr[HDR_PALETTEINFO] = 1; + + stream.Write(hdr, 128); + + // Encode image data line by line and write it to the stream + + src = image->GetData(); + + for (; height; height--) + { + switch (format) + { + case wxPCX_8BIT: + { + unsigned char r, g, b; + + for (i = 0; i < width; i++) + { + r = *(src++); + g = *(src++); + b = *(src++); + key = (r << 16) | (g << 8) | b; + + p[i] = (unsigned char)histogram[key].index; + } + break; + } + case wxPCX_24BIT: + { + for (i = 0; i < width; i++) + { + p[i] = *(src++); + p[i + bytesperline] = *(src++); + p[i + 2 * bytesperline] = *(src++); + } + break; + } + } + + RLEencode(p, bytesperline * nplanes, stream); + } + + free(p); + + // For 8 bit images, build the palette and write it to the stream: + if (format == wxPCX_8BIT) + { + // zero unused colours + memset(pal, 0, sizeof(pal)); + + unsigned long index; + + for (wxImageHistogram::iterator entry = histogram.begin(); + entry != histogram.end(); ++entry ) + { + key = entry->first; + index = entry->second.index; + pal[3 * index] = (unsigned char)(key >> 16); + pal[3 * index + 1] = (unsigned char)(key >> 8); + pal[3 * index + 2] = (unsigned char)(key); + } + + stream.PutC(12); + stream.Write(pal, 768); + } + + return wxPCX_OK; +} + +//----------------------------------------------------------------------------- +// wxPCXHandler +//----------------------------------------------------------------------------- + +bool wxPCXHandler::LoadFile( wxImage *image, wxInputStream& stream, bool verbose, int WXUNUSED(index) ) +{ + int error; + + if (!CanRead(stream)) + { + if (verbose) + wxLogError(_("PCX: this is not a PCX file.")); + + return false; + } + + image->Destroy(); + + if ((error = ReadPCX(image, stream)) != wxPCX_OK) + { + if (verbose) + { + switch (error) + { + case wxPCX_INVFORMAT: wxLogError(_("PCX: image format unsupported")); break; + case wxPCX_MEMERR: wxLogError(_("PCX: couldn't allocate memory")); break; + case wxPCX_VERERR: wxLogError(_("PCX: version number too low")); break; + default: wxLogError(_("PCX: unknown error !!!")); + } + } + image->Destroy(); + return false; + } + + return true; +} + +bool wxPCXHandler::SaveFile( wxImage *image, wxOutputStream& stream, bool verbose ) +{ + int error; + + if ((error = SavePCX(image, stream)) != wxPCX_OK) + { + if (verbose) + { + switch (error) + { + case wxPCX_INVFORMAT: wxLogError(_("PCX: invalid image")); break; + case wxPCX_MEMERR: wxLogError(_("PCX: couldn't allocate memory")); break; + default: wxLogError(_("PCX: unknown error !!!")); + } + } + } + + return (error == wxPCX_OK); +} + +bool wxPCXHandler::DoCanRead( wxInputStream& stream ) +{ + unsigned char c = stream.GetC(); + if ( !stream ) + return false; + + // not very safe, but this is all we can get from PCX header :-( + return c == 10; +} + +#endif // wxUSE_STREAMS + +#endif // wxUSE_IMAGE && wxUSE_PCX diff --git a/Externals/wxWidgets/src/common/imagpng.cpp b/Externals/wxWidgets/src/common/imagpng.cpp new file mode 100644 index 0000000000..c533848dd8 --- /dev/null +++ b/Externals/wxWidgets/src/common/imagpng.cpp @@ -0,0 +1,866 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/imagepng.cpp +// Purpose: wxImage PNG handler +// Author: Robert Roebling +// RCS-ID: $Id: imagpng.cpp 42092 2006-10-18 17:06:11Z RR $ +// Copyright: (c) Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_IMAGE && wxUSE_LIBPNG + +#include "wx/imagpng.h" + +#ifndef WX_PRECOMP + #include "wx/log.h" + #include "wx/app.h" + #include "wx/bitmap.h" + #include "wx/module.h" +#endif + +#include "../png/png.h" +#include "wx/filefn.h" +#include "wx/wfstream.h" +#include "wx/intl.h" +#include "wx/palette.h" + +// For memcpy +#include + +#ifdef __SALFORDC__ +#ifdef FAR +#undef FAR +#endif +#endif + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// image can not have any transparent pixels at all, have only 100% opaque +// and/or 100% transparent pixels in which case a simple mask is enough to +// store this information in wxImage or have a real alpha channel in which case +// we need to have it in wxImage as well +enum Transparency +{ + Transparency_None, + Transparency_Mask, + Transparency_Alpha +}; + +// ---------------------------------------------------------------------------- +// local functions +// ---------------------------------------------------------------------------- + +// return the kind of transparency needed for this image assuming that it does +// have transparent pixels, i.e. either Transparency_Alpha or Transparency_Mask +static Transparency +CheckTransparency(unsigned char **lines, + png_uint_32 x, png_uint_32 y, png_uint_32 w, png_uint_32 h, + size_t numColBytes); + +// init the alpha channel for the image and fill it with 1s up to (x, y) +static unsigned char *InitAlpha(wxImage *image, png_uint_32 x, png_uint_32 y); + +// find a free colour for the mask in the PNG data array +static void +FindMaskColour(unsigned char **lines, png_uint_32 width, png_uint_32 height, + unsigned char& rMask, unsigned char& gMask, unsigned char& bMask); + +// is the pixel with this value of alpha a fully opaque one? +static inline +bool IsOpaque(unsigned char a) +{ + return a == 0xff; +} + +// is the pixel with this value of alpha a fully transparent one? +static inline +bool IsTransparent(unsigned char a) +{ + return !a; +} + +// ============================================================================ +// wxPNGHandler implementation +// ============================================================================ + +IMPLEMENT_DYNAMIC_CLASS(wxPNGHandler,wxImageHandler) + +#if wxUSE_STREAMS + +#ifndef PNGLINKAGEMODE + #ifdef __WATCOMC__ + // we need an explicit cdecl for Watcom, at least according to + // + // http://sf.net/tracker/index.php?func=detail&aid=651492&group_id=9863&atid=109863 + // + // more testing is needed for this however, please remove this comment + // if you can confirm that my fix works with Watcom 11 + #define PNGLINKAGEMODE cdecl + #else + #define PNGLINKAGEMODE LINKAGEMODE + #endif +#endif + + +// VS: wxPNGInfoStruct declared below is a hack that needs some explanation. +// First, let me describe what's the problem: libpng uses jmp_buf in +// its png_struct structure. Unfortunately, this structure is +// compiler-specific and may vary in size, so if you use libpng compiled +// as DLL with another compiler than the main executable, it may not work +// (this is for example the case with wxMGL port and SciTech MGL library +// that provides custom runtime-loadable libpng implementation with jmpbuf +// disabled altogether). Luckily, it is still possible to use setjmp() & +// longjmp() as long as the structure is not part of png_struct. +// +// Sadly, there's no clean way to attach user-defined data to png_struct. +// There is only one customizable place, png_struct.io_ptr, which is meant +// only for I/O routines and is set with png_set_read_fn or +// png_set_write_fn. The hacky part is that we use io_ptr to store +// a pointer to wxPNGInfoStruct that holds I/O structures _and_ jmp_buf. + +struct wxPNGInfoStruct +{ + jmp_buf jmpbuf; + bool verbose; + + union + { + wxInputStream *in; + wxOutputStream *out; + } stream; +}; + +#define WX_PNG_INFO(png_ptr) ((wxPNGInfoStruct*)png_get_io_ptr(png_ptr)) + +// ---------------------------------------------------------------------------- +// helper functions +// ---------------------------------------------------------------------------- + +extern "C" +{ + +void PNGLINKAGEMODE wx_PNG_stream_reader( png_structp png_ptr, png_bytep data, + png_size_t length ) +{ + WX_PNG_INFO(png_ptr)->stream.in->Read(data, length); +} + +void PNGLINKAGEMODE wx_PNG_stream_writer( png_structp png_ptr, png_bytep data, + png_size_t length ) +{ + WX_PNG_INFO(png_ptr)->stream.out->Write(data, length); +} + +void +PNGLINKAGEMODE wx_png_warning(png_structp png_ptr, png_const_charp message) +{ + wxPNGInfoStruct *info = png_ptr ? WX_PNG_INFO(png_ptr) : NULL; + if ( !info || info->verbose ) + wxLogWarning( wxString::FromAscii(message) ); +} + +// from pngerror.c +// so that the libpng doesn't send anything on stderr +void +PNGLINKAGEMODE wx_png_error(png_structp png_ptr, png_const_charp message) +{ + wx_png_warning(NULL, message); + + // we're not using libpng built-in jump buffer (see comment before + // wxPNGInfoStruct above) so we have to return ourselves, otherwise libpng + // would just abort + longjmp(WX_PNG_INFO(png_ptr)->jmpbuf, 1); +} + +} // extern "C" + +// ---------------------------------------------------------------------------- +// LoadFile() helpers +// ---------------------------------------------------------------------------- + +// determine the kind of transparency we need for this image: if the only alpha +// values it has are 0 (transparent) and 0xff (opaque) then we can simply +// create a mask for it, we should be ok with a simple mask but otherwise we +// need a full blown alpha channel in wxImage +// +// parameters: +// lines raw PNG data +// x, y starting position +// w, h size of the image +// numColBytes number of colour bytes (1 for grey scale, 3 for RGB) +// (NB: alpha always follows the colour bytes) +Transparency +CheckTransparency(unsigned char **lines, + png_uint_32 x, png_uint_32 y, png_uint_32 w, png_uint_32 h, + size_t numColBytes) +{ + // suppose that a mask will suffice and check all the remaining alpha + // values to see if it does + for ( ; y < h; y++ ) + { + // each pixel is numColBytes+1 bytes, offset into the current line by + // the current x position + unsigned const char *ptr = lines[y] + (x * (numColBytes + 1)); + + for ( png_uint_32 x2 = x; x2 < w; x2++ ) + { + // skip the grey or colour byte(s) + ptr += numColBytes; + + unsigned char a2 = *ptr++; + + if ( !IsTransparent(a2) && !IsOpaque(a2) ) + { + // not fully opaque nor fully transparent, hence need alpha + return Transparency_Alpha; + } + } + + // during the next loop iteration check all the pixels in the row + x = 0; + } + + // mask will be enough + return Transparency_Mask; +} + +unsigned char *InitAlpha(wxImage *image, png_uint_32 x, png_uint_32 y) +{ + // create alpha channel + image->SetAlpha(); + + unsigned char *alpha = image->GetAlpha(); + + // set alpha for the pixels we had so far + png_uint_32 end = y * image->GetWidth() + x; + for ( png_uint_32 i = 0; i < end; i++ ) + { + // all the previous pixels were opaque + *alpha++ = 0xff; + } + + return alpha; +} + +void +FindMaskColour(unsigned char **lines, png_uint_32 width, png_uint_32 height, + unsigned char& rMask, unsigned char& gMask, unsigned char& bMask) +{ + // choosing the colour for the mask is more + // difficult: we need to iterate over the entire + // image for this in order to choose an unused + // colour (this is not very efficient but what else + // can we do?) + wxImageHistogram h; + unsigned nentries = 0; + unsigned char r2, g2, b2; + for ( png_uint_32 y2 = 0; y2 < height; y2++ ) + { + const unsigned char *p = lines[y2]; + for ( png_uint_32 x2 = 0; x2 < width; x2++ ) + { + r2 = *p++; + g2 = *p++; + b2 = *p++; + ++p; // jump over alpha + + wxImageHistogramEntry& + entry = h[wxImageHistogram:: MakeKey(r2, g2, b2)]; + + if ( entry.value++ == 0 ) + entry.index = nentries++; + } + } + + if ( !h.FindFirstUnusedColour(&rMask, &gMask, &bMask) ) + { + wxLogWarning(_("Too many colours in PNG, the image may be slightly blurred.")); + + // use a fixed mask colour and we'll fudge + // the real pixels with this colour (see + // below) + rMask = 0xfe; + gMask = 0; + bMask = 0xff; + } +} + +// ---------------------------------------------------------------------------- +// reading PNGs +// ---------------------------------------------------------------------------- + +bool wxPNGHandler::DoCanRead( wxInputStream& stream ) +{ + unsigned char hdr[4]; + + if ( !stream.Read(hdr, WXSIZEOF(hdr)) ) + return false; + + return memcmp(hdr, "\211PNG", WXSIZEOF(hdr)) == 0; +} + +// convert data from RGB to wxImage format +static +void CopyDataFromPNG(wxImage *image, + unsigned char **lines, + png_uint_32 width, + png_uint_32 height, + int color_type) +{ + Transparency transparency = Transparency_None; + + // only non NULL if transparency == Transparency_Alpha + unsigned char *alpha = NULL; + + // RGB of the mask colour if transparency == Transparency_Mask + // (but init them anyhow to avoid compiler warnings) + unsigned char rMask = 0, + gMask = 0, + bMask = 0; + + unsigned char *ptrDst = image->GetData(); + if ( !(color_type & PNG_COLOR_MASK_COLOR) ) + { + // grey image: GAGAGA... where G == grey component and A == alpha + for ( png_uint_32 y = 0; y < height; y++ ) + { + const unsigned char *ptrSrc = lines[y]; + for ( png_uint_32 x = 0; x < width; x++ ) + { + unsigned char g = *ptrSrc++; + unsigned char a = *ptrSrc++; + + // the first time we encounter a transparent pixel we must + // decide about what to do about them + if ( !IsOpaque(a) && transparency == Transparency_None ) + { + // we'll need at least the mask for this image and + // maybe even full alpha channel info: the former is + // only enough if we have alpha values of 0 and 0xff + // only, otherwisewe need the latter + transparency = CheckTransparency + ( + lines, + x, y, + width, height, + 1 + ); + + if ( transparency == Transparency_Mask ) + { + // let's choose this colour for the mask: this is + // not a problem here as all the other pixels are + // grey, i.e. R == G == B which is not the case for + // this one so no confusion is possible + rMask = 0xff; + gMask = 0; + bMask = 0xff; + } + else // transparency == Transparency_Alpha + { + alpha = InitAlpha(image, x, y); + } + } + + switch ( transparency ) + { + case Transparency_Mask: + if ( IsTransparent(a) ) + { + *ptrDst++ = rMask; + *ptrDst++ = gMask; + *ptrDst++ = bMask; + break; + } + // else: !transparent + + // must be opaque then as otherwise we shouldn't be + // using the mask at all + wxASSERT_MSG( IsOpaque(a), _T("logic error") ); + + // fall through + + case Transparency_Alpha: + if ( alpha ) + *alpha++ = a; + // fall through + + case Transparency_None: + *ptrDst++ = g; + *ptrDst++ = g; + *ptrDst++ = g; + break; + } + } + } + } + else // colour image: RGBRGB... + { + for ( png_uint_32 y = 0; y < height; y++ ) + { + const unsigned char *ptrSrc = lines[y]; + for ( png_uint_32 x = 0; x < width; x++ ) + { + unsigned char r = *ptrSrc++; + unsigned char g = *ptrSrc++; + unsigned char b = *ptrSrc++; + unsigned char a = *ptrSrc++; + + // the logic here is the same as for the grey case except + // where noted + if ( !IsOpaque(a) && transparency == Transparency_None ) + { + transparency = CheckTransparency + ( + lines, + x, y, + width, height, + 3 + ); + + if ( transparency == Transparency_Mask ) + { + FindMaskColour(lines, width, height, + rMask, gMask, bMask); + } + else // transparency == Transparency_Alpha + { + alpha = InitAlpha(image, x, y); + } + + } + + switch ( transparency ) + { + case Transparency_Mask: + if ( IsTransparent(a) ) + { + *ptrDst++ = rMask; + *ptrDst++ = gMask; + *ptrDst++ = bMask; + break; + } + else // !transparent + { + // must be opaque then as otherwise we shouldn't be + // using the mask at all + wxASSERT_MSG( IsOpaque(a), _T("logic error") ); + + // if we couldn't find a unique colour for the + // mask, we can have real pixels with the same + // value as the mask and it's better to slightly + // change their colour than to make them + // transparent + if ( r == rMask && g == gMask && b == bMask ) + { + r++; + } + } + + // fall through + + case Transparency_Alpha: + if ( alpha ) + *alpha++ = a; + // fall through + + case Transparency_None: + *ptrDst++ = r; + *ptrDst++ = g; + *ptrDst++ = b; + break; + } + } + } + } + + if ( transparency == Transparency_Mask ) + { + image->SetMaskColour(rMask, gMask, bMask); + } +} + +// temporarily disable the warning C4611 (interaction between '_setjmp' and +// C++ object destruction is non-portable) - I don't see any dtors here +#ifdef __VISUALC__ + #pragma warning(disable:4611) +#endif /* VC++ */ + +bool +wxPNGHandler::LoadFile(wxImage *image, + wxInputStream& stream, + bool verbose, + int WXUNUSED(index)) +{ + // VZ: as this function uses setjmp() the only fool-proof error handling + // method is to use goto (setjmp is not really C++ dtors friendly...) + + unsigned char **lines = NULL; + png_infop info_ptr = (png_infop) NULL; + wxPNGInfoStruct wxinfo; + + png_uint_32 i, width, height = 0; + int bit_depth, color_type, interlace_type; + + wxinfo.verbose = verbose; + wxinfo.stream.in = &stream; + + image->Destroy(); + + png_structp png_ptr = png_create_read_struct + ( + PNG_LIBPNG_VER_STRING, + (voidp) NULL, + wx_png_error, + wx_png_warning + ); + if (!png_ptr) + goto error; + + // NB: please see the comment near wxPNGInfoStruct declaration for + // explanation why this line is mandatory + png_set_read_fn( png_ptr, &wxinfo, wx_PNG_stream_reader); + + info_ptr = png_create_info_struct( png_ptr ); + if (!info_ptr) + goto error; + + if (setjmp(wxinfo.jmpbuf)) + goto error; + + png_read_info( png_ptr, info_ptr ); + png_get_IHDR( png_ptr, info_ptr, &width, &height, &bit_depth, &color_type, &interlace_type, (int*) NULL, (int*) NULL ); + + if (color_type == PNG_COLOR_TYPE_PALETTE) + png_set_expand( png_ptr ); + + // Fix for Bug [ 439207 ] Monochrome PNG images come up black + if (bit_depth < 8) + png_set_expand( png_ptr ); + + png_set_strip_16( png_ptr ); + png_set_packing( png_ptr ); + if (png_get_valid( png_ptr, info_ptr, PNG_INFO_tRNS)) + png_set_expand( png_ptr ); + png_set_filler( png_ptr, 0xff, PNG_FILLER_AFTER ); + + image->Create((int)width, (int)height, (bool) false /* no need to init pixels */); + + if (!image->Ok()) + goto error; + + lines = (unsigned char **)malloc( (size_t)(height * sizeof(unsigned char *)) ); + if ( !lines ) + goto error; + + for (i = 0; i < height; i++) + { + if ((lines[i] = (unsigned char *)malloc( (size_t)(width * (sizeof(unsigned char) * 4)))) == NULL) + { + for ( unsigned int n = 0; n < i; n++ ) + free( lines[n] ); + goto error; + } + } + + png_read_image( png_ptr, lines ); + png_read_end( png_ptr, info_ptr ); + +#if wxUSE_PALETTE + if (color_type == PNG_COLOR_TYPE_PALETTE) + { + const size_t ncolors = info_ptr->num_palette; + unsigned char* r = new unsigned char[ncolors]; + unsigned char* g = new unsigned char[ncolors]; + unsigned char* b = new unsigned char[ncolors]; + + for (size_t j = 0; j < ncolors; j++) + { + r[j] = info_ptr->palette[j].red; + g[j] = info_ptr->palette[j].green; + b[j] = info_ptr->palette[j].blue; + } + + image->SetPalette(wxPalette(ncolors, r, g, b)); + delete[] r; + delete[] g; + delete[] b; + } +#endif // wxUSE_PALETTE + + png_destroy_read_struct( &png_ptr, &info_ptr, (png_infopp) NULL ); + + // loaded successfully, now init wxImage with this data + CopyDataFromPNG(image, lines, width, height, color_type); + + for ( i = 0; i < height; i++ ) + free( lines[i] ); + free( lines ); + + return true; + +error: + if (verbose) + wxLogError(_("Couldn't load a PNG image - file is corrupted or not enough memory.")); + + if ( image->Ok() ) + { + image->Destroy(); + } + + if ( lines ) + { + for ( unsigned int n = 0; n < height; n++ ) + free( lines[n] ); + + free( lines ); + } + + if ( png_ptr ) + { + if ( info_ptr ) + { + png_destroy_read_struct( &png_ptr, &info_ptr, (png_infopp) NULL ); + free(info_ptr); + } + else + png_destroy_read_struct( &png_ptr, (png_infopp) NULL, (png_infopp) NULL ); + } + return false; +} + +// ---------------------------------------------------------------------------- +// writing PNGs +// ---------------------------------------------------------------------------- + +bool wxPNGHandler::SaveFile( wxImage *image, wxOutputStream& stream, bool verbose ) +{ + wxPNGInfoStruct wxinfo; + + wxinfo.verbose = verbose; + wxinfo.stream.out = &stream; + + png_structp png_ptr = png_create_write_struct + ( + PNG_LIBPNG_VER_STRING, + NULL, + wx_png_error, + wx_png_warning + ); + if (!png_ptr) + { + if (verbose) + wxLogError(_("Couldn't save PNG image.")); + return false; + } + + png_infop info_ptr = png_create_info_struct(png_ptr); + if (info_ptr == NULL) + { + png_destroy_write_struct( &png_ptr, (png_infopp)NULL ); + if (verbose) + wxLogError(_("Couldn't save PNG image.")); + return false; + } + + if (setjmp(wxinfo.jmpbuf)) + { + png_destroy_write_struct( &png_ptr, (png_infopp)NULL ); + if (verbose) + wxLogError(_("Couldn't save PNG image.")); + return false; + } + + // NB: please see the comment near wxPNGInfoStruct declaration for + // explanation why this line is mandatory + png_set_write_fn( png_ptr, &wxinfo, wx_PNG_stream_writer, NULL); + + const int iColorType = image->HasOption(wxIMAGE_OPTION_PNG_FORMAT) + ? image->GetOptionInt(wxIMAGE_OPTION_PNG_FORMAT) + : wxPNG_TYPE_COLOUR; + const int iBitDepth = image->HasOption(wxIMAGE_OPTION_PNG_BITDEPTH) + ? image->GetOptionInt(wxIMAGE_OPTION_PNG_BITDEPTH) + : 8; + + wxASSERT_MSG( iBitDepth == 8 || iBitDepth == 16, + _T("PNG bit depth must be 8 or 16") ); + + bool bHasAlpha = image->HasAlpha(); + bool bHasMask = image->HasMask(); + bool bUseAlpha = bHasAlpha || bHasMask; + + int iPngColorType; + if ( iColorType==wxPNG_TYPE_COLOUR ) + { + iPngColorType = bUseAlpha ? PNG_COLOR_TYPE_RGB_ALPHA + : PNG_COLOR_TYPE_RGB; + } + else + { + iPngColorType = bUseAlpha ? PNG_COLOR_TYPE_GRAY_ALPHA + : PNG_COLOR_TYPE_GRAY; + } + + png_set_IHDR( png_ptr, info_ptr, image->GetWidth(), image->GetHeight(), + iBitDepth, iPngColorType, + PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, + PNG_FILTER_TYPE_BASE); + + int iElements; + png_color_8 sig_bit; + + if ( iPngColorType & PNG_COLOR_MASK_COLOR ) + { + sig_bit.red = + sig_bit.green = + sig_bit.blue = (png_byte)iBitDepth; + iElements = 3; + } + else // grey + { + sig_bit.gray = (png_byte)iBitDepth; + iElements = 1; + } + + if ( iPngColorType & PNG_COLOR_MASK_ALPHA ) + { + sig_bit.alpha = (png_byte)iBitDepth; + iElements++; + } + + if ( iBitDepth == 16 ) + iElements *= 2; + + png_set_sBIT( png_ptr, info_ptr, &sig_bit ); + png_write_info( png_ptr, info_ptr ); + png_set_shift( png_ptr, &sig_bit ); + png_set_packing( png_ptr ); + + unsigned char * + data = (unsigned char *)malloc( image->GetWidth() * iElements ); + if ( !data ) + { + png_destroy_write_struct( &png_ptr, (png_infopp)NULL ); + return false; + } + + unsigned char * + pAlpha = (unsigned char *)(bHasAlpha ? image->GetAlpha() : NULL); + int iHeight = image->GetHeight(); + int iWidth = image->GetWidth(); + + unsigned char uchMaskRed = 0, uchMaskGreen = 0, uchMaskBlue = 0; + + if ( bHasMask ) + { + uchMaskRed = image->GetMaskRed(); + uchMaskGreen = image->GetMaskGreen(); + uchMaskBlue = image->GetMaskBlue(); + } + + unsigned char *pColors = image->GetData(); + + for (int y = 0; y != iHeight; ++y) + { + unsigned char *pData = data; + for (int x = 0; x != iWidth; x++) + { + unsigned char uchRed = *pColors++; + unsigned char uchGreen = *pColors++; + unsigned char uchBlue = *pColors++; + + switch ( iColorType ) + { + default: + wxFAIL_MSG( _T("unknown wxPNG_TYPE_XXX") ); + // fall through + + case wxPNG_TYPE_COLOUR: + *pData++ = uchRed; + if ( iBitDepth == 16 ) + *pData++ = 0; + *pData++ = uchGreen; + if ( iBitDepth == 16 ) + *pData++ = 0; + *pData++ = uchBlue; + if ( iBitDepth == 16 ) + *pData++ = 0; + break; + + case wxPNG_TYPE_GREY: + { + // where do these coefficients come from? maybe we + // should have image options for them as well? + unsigned uiColor = + (unsigned) (76.544*(unsigned)uchRed + + 150.272*(unsigned)uchGreen + + 36.864*(unsigned)uchBlue); + + *pData++ = (unsigned char)((uiColor >> 8) & 0xFF); + if ( iBitDepth == 16 ) + *pData++ = (unsigned char)(uiColor & 0xFF); + } + break; + + case wxPNG_TYPE_GREY_RED: + *pData++ = uchRed; + if ( iBitDepth == 16 ) + *pData++ = 0; + break; + } + + if ( bUseAlpha ) + { + unsigned char uchAlpha = 255; + if ( bHasAlpha ) + uchAlpha = *pAlpha++; + + if ( bHasMask ) + { + if ( (uchRed == uchMaskRed) + && (uchGreen == uchMaskGreen) + && (uchBlue == uchMaskBlue) ) + uchAlpha = 0; + } + + *pData++ = uchAlpha; + if ( iBitDepth == 16 ) + *pData++ = 0; + } + } + + png_bytep row_ptr = data; + png_write_rows( png_ptr, &row_ptr, 1 ); + } + + free(data); + png_write_end( png_ptr, info_ptr ); + png_destroy_write_struct( &png_ptr, (png_infopp)&info_ptr ); + + return true; +} + +#ifdef __VISUALC__ + #pragma warning(default:4611) +#endif /* VC++ */ + +#endif // wxUSE_STREAMS + +#endif // wxUSE_LIBPNG diff --git a/Externals/wxWidgets/src/common/imagpnm.cpp b/Externals/wxWidgets/src/common/imagpnm.cpp new file mode 100644 index 0000000000..ba9c5c8bf6 --- /dev/null +++ b/Externals/wxWidgets/src/common/imagpnm.cpp @@ -0,0 +1,201 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/imagpnm.cpp +// Purpose: wxImage PNM handler +// Author: Sylvain Bougnoux +// RCS-ID: $Id: imagpnm.cpp 46311 2007-06-03 22:14:32Z VZ $ +// Copyright: (c) Sylvain Bougnoux +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_IMAGE && wxUSE_PNM + +#include "wx/imagpnm.h" + +#ifndef WX_PRECOMP + #include "wx/intl.h" + #include "wx/log.h" +#endif + +#include "wx/txtstrm.h" + +//----------------------------------------------------------------------------- +// wxBMPHandler +//----------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxPNMHandler,wxImageHandler) + +#if wxUSE_STREAMS + +void Skip_Comment(wxInputStream &stream) +{ + wxTextInputStream text_stream(stream); + + if (stream.Peek()==wxT('#')) + { + text_stream.ReadLine(); + Skip_Comment(stream); + } +} + +bool wxPNMHandler::LoadFile( wxImage *image, wxInputStream& stream, bool verbose, int WXUNUSED(index) ) +{ + wxUint32 width, height; + wxUint16 maxval; + char c(0); + + image->Destroy(); + + /* + * Read the PNM header + */ + + wxBufferedInputStream buf_stream(stream); + wxTextInputStream text_stream(buf_stream); + + Skip_Comment(buf_stream); + if (buf_stream.GetC()==wxT('P')) c=buf_stream.GetC(); + + switch (c) + { + case wxT('2'): // ASCII Grey + case wxT('3'): // ASCII RGB + case wxT('5'): // RAW Grey + case wxT('6'): break; + default: + if (verbose) wxLogError(_("PNM: File format is not recognized.")); + return false; + } + + text_stream.ReadLine(); // for the \n + Skip_Comment(buf_stream); + text_stream >> width >> height ; + Skip_Comment(buf_stream); + text_stream >> maxval; + + //cout << line << " " << width << " " << height << " " << maxval << endl; + image->Create( width, height ); + unsigned char *ptr = image->GetData(); + if (!ptr) + { + if (verbose) + wxLogError( _("PNM: Couldn't allocate memory.") ); + return false; + } + + + if (c=='2') // Ascii GREY + { + wxUint32 value, size=width*height; + for (wxUint32 i=0; iSetMask( false ); + + const wxStreamError err = buf_stream.GetLastError(); + return err == wxSTREAM_NO_ERROR || err == wxSTREAM_EOF; +} + +bool wxPNMHandler::SaveFile( wxImage *image, wxOutputStream& stream, bool WXUNUSED(verbose) ) +{ + wxTextOutputStream text_stream(stream); + + //text_stream << "P6" << endl + //<< image->GetWidth() << " " << image->GetHeight() << endl + //<< "255" << endl; + text_stream << wxT("P6\n") << image->GetWidth() << wxT(" ") << image->GetHeight() << wxT("\n255\n"); + stream.Write(image->GetData(),3*image->GetWidth()*image->GetHeight()); + + return stream.IsOk(); +} + +bool wxPNMHandler::DoCanRead( wxInputStream& stream ) +{ + Skip_Comment(stream); + + if ( stream.GetC() == 'P' ) + { + switch ( stream.GetC() ) + { + case '2': // ASCII Grey + case '3': // ASCII RGB + case '5': // RAW Grey + case '6': // RAW RGB + return true; + } + } + + return false; +} + + +#endif // wxUSE_STREAMS + +#endif // wxUSE_IMAGE && wxUSE_PNM diff --git a/Externals/wxWidgets/src/common/imagtga.cpp b/Externals/wxWidgets/src/common/imagtga.cpp new file mode 100644 index 0000000000..458bc27c76 --- /dev/null +++ b/Externals/wxWidgets/src/common/imagtga.cpp @@ -0,0 +1,750 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: imagtga.cpp +// Purpose: wxImage TGA handler +// Author: Seth Jackson +// CVS-ID: $Id: imagtga.cpp 43681 2006-11-27 15:01:58Z VZ $ +// Copyright: (c) 2005 Seth Jackson +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_IMAGE && wxUSE_TGA + +#ifndef WX_PRECOMP + #include "wx/palette.h" +#endif + +#include "wx/imagtga.h" +#include "wx/log.h" +#include "wx/scopeguard.h" + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// TGA error codes. +enum +{ + wxTGA_OK = 0, + wxTGA_INVFORMAT = 1, + wxTGA_MEMERR = 2 +}; + +// TGA header bytes. +enum +{ + HDR_OFFSET = 0, + HDR_COLORTYPE = 1, + HDR_IMAGETYPE = 2, + HDR_PALETTESTART = 3, + HDR_PALETTELENGTH = 5, + HDR_PALETTEBITS = 7, + HDR_XORIGIN = 8, + HDR_YORIGIN = 10, + HDR_WIDTH = 12, + HDR_HEIGHT = 14, + HDR_BPP = 16, + HDR_ORIENTATION = 17, + HDR_SIZE +}; + +// TGA color types. +enum +{ + wxTGA_UNMAPPED = 0, + wxTGA_MAPPED = 1 +}; + +// ============================================================================ +// implementation +// ============================================================================ + +IMPLEMENT_DYNAMIC_CLASS(wxTGAHandler, wxImageHandler) + +#if wxUSE_STREAMS + +// ---------------------------------------------------------------------------- +// worker functions +// ---------------------------------------------------------------------------- + +static +void FlipTGA(unsigned char* imageData, int width, int height, short pixelSize) +{ + int lineLength = width * pixelSize; + unsigned char *line1 = imageData; + unsigned char *line2 = &imageData[lineLength * (height - 1)]; + + unsigned char temp; + for ( ; line1 < line2; line2 -= (lineLength * 2)) + { + for (int index = 0; index < lineLength; line1++, line2++, index++) + { + temp = *line1; + *line1 = *line2; + *line2 = temp; + } + } +} + +static +void DecodeRLE(unsigned char* imageData, unsigned long imageSize, + short pixelSize, wxInputStream& stream) +{ + unsigned long index = 0; + unsigned char current; + unsigned int length; + unsigned char buf[4]; + + while (index < imageSize) + { + current = stream.GetC(); + + // RLE packet. + if ( current & 0x80 ) + { + // Get the run length of the packet. + current &= 0x7f; + + current++; + + length = current; + + index += current * pixelSize; + + // Repeat the pixel length times. + stream.Read(buf, pixelSize); + + for (unsigned int i = 0; i < length; i++) + { + memcpy(imageData, buf, pixelSize); + + imageData += pixelSize; + } + } + else // Raw packet. + { + // Get the run length of the packet. + current++; + + length = current * pixelSize; + + index += length; + + // Write the next length pixels directly to the image data. + stream.Read(imageData, length); + + imageData += length; + } + } +} + +static +int ReadTGA(wxImage* image, wxInputStream& stream) +{ + // Read in the TGA header + unsigned char hdr[HDR_SIZE]; + stream.Read(hdr, HDR_SIZE); + + short offset = hdr[HDR_OFFSET] + HDR_SIZE; + short colorType = hdr[HDR_COLORTYPE]; + short imageType = hdr[HDR_IMAGETYPE]; + int paletteLength = hdr[HDR_PALETTELENGTH] + 256 * hdr[HDR_PALETTELENGTH + 1]; + int width = (hdr[HDR_WIDTH] + 256 * hdr[HDR_WIDTH + 1]) - + (hdr[HDR_XORIGIN] + 256 * hdr[HDR_XORIGIN + 1]); + int height = (hdr[HDR_HEIGHT] + 256 * hdr[HDR_HEIGHT + 1]) - + (hdr[HDR_YORIGIN] + 256 * hdr[HDR_YORIGIN + 1]); + short bpp = hdr[HDR_BPP]; + short orientation = hdr[HDR_ORIENTATION] & 0x20; + + image->Create(width, height); + + if (!image->Ok()) + { + return wxTGA_MEMERR; + } + + const short pixelSize = bpp / 8; + + const unsigned long imageSize = width * height * pixelSize; + + unsigned char *imageData = (unsigned char* )malloc(imageSize); + + if (!imageData) + { + return wxTGA_MEMERR; + } + + wxON_BLOCK_EXIT1(free, imageData); + + unsigned char *dst = image->GetData(); + + unsigned char* alpha = NULL; + if (bpp == 16 || bpp == 32) + { + image->SetAlpha(); + + alpha = image->GetAlpha(); + } + + // Seek from the offset we got from the TGA header. + stream.SeekI(offset, wxFromStart); + + // Load a palette if we have one. + if (colorType == wxTGA_MAPPED) + { + unsigned char buf[3]; + + unsigned char* r = new unsigned char[paletteLength]; + unsigned char* g = new unsigned char[paletteLength]; + unsigned char* b = new unsigned char[paletteLength]; + + for (int i = 0; i < paletteLength; i++) + { + stream.Read(buf, 3); + + r[i] = buf[2]; + g[i] = buf[1]; + b[i] = buf[0]; + } + +#if wxUSE_PALETTE + // Set the palette of the image. + image->SetPalette(wxPalette(paletteLength, r, g, b)); +#endif // wxUSE_PALETTE + + delete[] r; + delete[] g; + delete[] b; + } + + // Handle the various TGA formats we support. + + switch (imageType) + { +#if wxUSE_PALETTE + // Raw indexed. + + case 1: + { + const wxPalette& palette = image->GetPalette(); + unsigned char r; + unsigned char g; + unsigned char b; + + // No compression read the data directly to imageData. + + stream.Read(imageData, imageSize); + + // If orientation == 0, then the image is stored upside down. + // We need to store it right side up. + + if (orientation == 0) + { + FlipTGA(imageData, width, height, pixelSize); + } + + // Handle the different pixel depths. + + switch (bpp) + { + // 8 bpp. + + case 8: + { + for (unsigned long index = 0; index < imageSize; index += pixelSize) + { + palette.GetRGB(imageData[index], &r, &g, &b); + + *(dst++) = r; + *(dst++) = g; + *(dst++) = b; + } + } + break; + + // 16 bpp. + + case 16: + { + for (unsigned long index = 0; index < imageSize; index += pixelSize) + { + palette.GetRGB(imageData[index], &r, &g, &b); + + *(dst++) = r; + *(dst++) = g; + *(dst++) = b; + *(alpha++) = (imageData[index + 1] & 0x80) ? 0 : 255; + } + } + break; + + default: + return wxTGA_INVFORMAT; + } + } + break; +#endif // wxUSE_PALETTE + + // Raw RGB. + + case 2: + { + // No compression read the data directly to imageData. + + stream.Read(imageData, imageSize); + + // If orientation == 0, then the image is stored upside down. + // We need to store it right side up. + + if (orientation == 0) + { + FlipTGA(imageData, width, height, pixelSize); + } + + // Handle the different pixel depths. + + switch (bpp) + { + //16 bpp. + + case 16: + { + unsigned char temp; + + for (unsigned long index = 0; index < imageSize; index += pixelSize) + { + temp = (imageData[index + 1] & 0x7c) << 1; + temp |= temp >> 5; + *(dst++) = temp; + + temp = ((imageData[index + 1] & 0x03) << 6) | ((imageData[index] & 0xe0) >> 2); + temp |= temp >> 5; + *(dst++) = temp; + + temp = (imageData[index] & 0x1f) << 3; + temp |= temp >> 5; + *(dst++) = temp; + + *(alpha++) = (imageData[index + 1] & 0x80) ? 0 : 255; + } + } + break; + + // 24 bpp. + + case 24: + { + for (unsigned long index = 0; index < imageSize; index += pixelSize) + { + *(dst++) = imageData[index + 2]; + *(dst++) = imageData[index + 1]; + *(dst++) = imageData[index]; + } + } + break; + + // 32 bpp. + + case 32: + { + for (unsigned long index = 0; index < imageSize; index += pixelSize) + { + *(dst++) = imageData[index + 2]; + *(dst++) = imageData[index + 1]; + *(dst++) = imageData[index]; + *(alpha++) = imageData[index + 3]; + } + } + break; + + default: + return wxTGA_INVFORMAT; + } + } + break; + + // Raw grayscale. + + case 3: + { + // No compression read the data directly to imageData. + + stream.Read(imageData, imageSize); + + // If orientation == 0, then the image is stored upside down. + // We need to store it right side up. + + if (orientation == 0) + { + FlipTGA(imageData, width, height, pixelSize); + } + + // Handle the different pixel depths. + + switch (bpp) + { + // 8 bpp. + + case 8: + { + for (unsigned long index = 0; index < imageSize; index += pixelSize) + { + *(dst++) = imageData[index]; + *(dst++) = imageData[index]; + *(dst++) = imageData[index]; + } + } + break; + + // 16 bpp. + + case 16: + { + for (unsigned long index = 0; index < imageSize; index += pixelSize) + { + *(dst++) = imageData[index]; + *(dst++) = imageData[index]; + *(dst++) = imageData[index]; + *(alpha++) = imageData[index + 1]; + } + } + break; + + default: + return wxTGA_INVFORMAT; + } + } + break; + +#if wxUSE_PALETTE + // RLE indexed. + + case 9: + { + const wxPalette& palette = image->GetPalette(); + unsigned char r; + unsigned char g; + unsigned char b; + + // Decode the RLE data. + + DecodeRLE(imageData, imageSize, pixelSize, stream); + + // If orientation == 0, then the image is stored upside down. + // We need to store it right side up. + + if (orientation == 0) + { + FlipTGA(imageData, width, height, pixelSize); + } + + // Handle the different pixel depths. + + switch (bpp) + { + // 8 bpp. + + case 8: + { + for (unsigned long index = 0; index < imageSize; index += pixelSize) + { + palette.GetRGB(imageData[index], &r, &g, &b); + + *(dst++) = r; + *(dst++) = g; + *(dst++) = b; + } + } + break; + + // 16 bpp. + + case 16: + { + for (unsigned long index = 0; index < imageSize; index += pixelSize) + { + palette.GetRGB(imageData[index], &r, &g, &b); + + *(dst++) = r; + *(dst++) = g; + *(dst++) = b; + *(alpha++) = (imageData[index + 1] & 0x80) ? 0 : 255; + } + } + break; + + default: + return wxTGA_INVFORMAT; + } + } + break; +#endif // wxUSE_PALETTE + + // RLE RGB. + + case 10: + { + // Decode the RLE data. + + DecodeRLE(imageData, imageSize, pixelSize, stream); + + // If orientation == 0, then the image is stored upside down. + // We need to store it right side up. + + if (orientation == 0) + { + FlipTGA(imageData, width, height, pixelSize); + } + + // Handle the different pixel depths. + + switch (bpp) + { + //16 bpp. + + case 16: + { + unsigned char temp; + + for (unsigned long index = 0; index < imageSize; index += pixelSize) + { + temp = (imageData[index + 1] & 0x7c) << 1; + temp |= temp >> 5; + *(dst++) = temp; + + temp = ((imageData[index + 1] & 0x03) << 6) | ((imageData[index] & 0xe0) >> 2); + temp |= temp >> 5; + *(dst++) = temp; + + temp = (imageData[index] & 0x1f) << 3; + temp |= temp >> 5; + *(dst++) = temp; + + *(alpha++) = (imageData[index + 1] & 0x80) ? 0 : 255; + } + } + break; + + // 24 bpp. + + case 24: + { + for (unsigned long index = 0; index < imageSize; index += pixelSize) + { + *(dst++) = imageData[index + 2]; + *(dst++) = imageData[index + 1]; + *(dst++) = imageData[index]; + } + } + break; + + // 32 bpp. + + case 32: + { + for (unsigned long index = 0; index < imageSize; index += pixelSize) + { + *(dst++) = imageData[index + 2]; + *(dst++) = imageData[index + 1]; + *(dst++) = imageData[index]; + *(alpha++) = imageData[index + 3]; + } + } + break; + + default: + return wxTGA_INVFORMAT; + } + } + break; + + // RLE grayscale. + + case 11: + { + // Decode the RLE data. + + DecodeRLE(imageData, imageSize, pixelSize, stream); + + // If orientation == 0, then the image is stored upside down. + // We need to store it right side up. + + if (orientation == 0) + { + FlipTGA(imageData, width, height, pixelSize); + } + + // Handle the different pixel depths. + + switch (bpp) + { + // 8 bpp. + + case 8: + { + for (unsigned long index = 0; index < imageSize; index += pixelSize) + { + *(dst++) = imageData[index]; + *(dst++) = imageData[index]; + *(dst++) = imageData[index]; + } + } + break; + + // 16 bpp. + + case 16: + { + for (unsigned long index = 0; index < imageSize; index += pixelSize) + { + *(dst++) = imageData[index]; + *(dst++) = imageData[index]; + *(dst++) = imageData[index]; + *(alpha++) = imageData[index + 1]; + } + } + break; + + default: + return wxTGA_INVFORMAT; + } + } + break; + + default: + return wxTGA_INVFORMAT; + } + + return wxTGA_OK; +} + +static +int SaveTGA(wxImage* WXUNUSED(image), wxOutputStream& WXUNUSED(stream)) +{ + wxLogError(wxT("Saving in TGA format is not implemented.")); + + return wxTGA_OK; +} + +// ---------------------------------------------------------------------------- +// wxTGAHandler +// ---------------------------------------------------------------------------- + +bool wxTGAHandler::LoadFile(wxImage* image, + wxInputStream& stream, + bool verbose, + int WXUNUSED(index)) +{ + if ( !CanRead(stream) ) + { + if ( verbose ) + wxLogError(wxT("TGA: this is not a TGA file.")); + + return false; + } + + image->Destroy(); + + int error = ReadTGA(image, stream); + if ( error != wxTGA_OK ) + { + if ( verbose ) + { + switch ( error ) + { + case wxTGA_INVFORMAT: + wxLogError(wxT("TGA: image format unsupported.")); + break; + + case wxTGA_MEMERR: + wxLogError(wxT("TGA: couldn't allocate memory.")); + break; + + default: + wxLogError(wxT("TGA: unknown error!")); + } + } + + image->Destroy(); + + return false; + } + + return true; +} + +bool wxTGAHandler::SaveFile(wxImage* image, wxOutputStream& stream, bool verbose) +{ + int error = SaveTGA(image, stream); + + if ( error != wxTGA_OK ) + { + if ( verbose ) + { + switch ( error ) + { + case wxTGA_INVFORMAT: + wxLogError(wxT("TGA: invalid image.")); + break; + + case wxTGA_MEMERR: + wxLogError(wxT("TGA: couldn't allocate memory.")); + break; + + default: + wxLogError(wxT("TGA: unknown error!")); + } + } + + return false; + } + + return true; +} + +bool wxTGAHandler::DoCanRead(wxInputStream& stream) +{ + // read the fixed-size TGA headers + unsigned char hdr[HDR_SIZE]; + stream.Read(hdr, HDR_SIZE); + + // Check wether we can read the file or not. + + short colorType = hdr[HDR_COLORTYPE]; + if ( colorType != wxTGA_UNMAPPED && colorType != wxTGA_MAPPED ) + { + return false; + } + + short imageType = hdr[HDR_IMAGETYPE]; + if ( imageType == 0 || imageType == 32 || imageType == 33 ) + { + return false; + } + + short bpp = hdr[HDR_BPP]; + if ( bpp != 8 && bpp != 16 && bpp != 24 && bpp != 32 ) + { + return false; + } + + return true; +} + +#endif // wxUSE_STREAMS + +#endif // wxUSE_IMAGE && wxUSE_TGA diff --git a/Externals/wxWidgets/src/common/imagtiff.cpp b/Externals/wxWidgets/src/common/imagtiff.cpp new file mode 100644 index 0000000000..c44415d744 --- /dev/null +++ b/Externals/wxWidgets/src/common/imagtiff.cpp @@ -0,0 +1,515 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/imagtiff.cpp +// Purpose: wxImage TIFF handler +// Author: Robert Roebling +// RCS-ID: $Id: imagtiff.cpp 48694 2007-09-14 23:21:29Z VZ $ +// Copyright: (c) Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_IMAGE && wxUSE_LIBTIFF + +#include "wx/imagtiff.h" + +#ifndef WX_PRECOMP + #include "wx/log.h" + #include "wx/app.h" + #include "wx/intl.h" + #include "wx/bitmap.h" + #include "wx/module.h" +#endif + +extern "C" +{ + #include "tiff.h" + #include "tiffio.h" +} +#include "wx/filefn.h" +#include "wx/wfstream.h" + +#ifndef TIFFLINKAGEMODE + #if defined(__WATCOMC__) && defined(__WXMGL__) + #define TIFFLINKAGEMODE cdecl + #else + #define TIFFLINKAGEMODE LINKAGEMODE + #endif +#endif + +//----------------------------------------------------------------------------- +// wxTIFFHandler +//----------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxTIFFHandler,wxImageHandler) + +#if wxUSE_STREAMS + +// helper to translate our, possibly 64 bit, wxFileOffset to TIFF, always 32 +// bit, toff_t +static toff_t wxFileOffsetToTIFF(wxFileOffset ofs) +{ + if ( ofs == wxInvalidOffset ) + return (toff_t)-1; + + toff_t tofs = wx_truncate_cast(toff_t, ofs); + wxCHECK_MSG( (wxFileOffset)tofs == ofs, (toff_t)-1, + _T("TIFF library doesn't support large files") ); + + return tofs; +} + +// another helper to convert standard seek mode to our +static wxSeekMode wxSeekModeFromTIFF(int whence) +{ + switch ( whence ) + { + case SEEK_SET: + return wxFromStart; + + case SEEK_CUR: + return wxFromCurrent; + + case SEEK_END: + return wxFromEnd; + + default: + return wxFromCurrent; + } +} + +extern "C" +{ + +tsize_t TIFFLINKAGEMODE +wxTIFFNullProc(thandle_t WXUNUSED(handle), + tdata_t WXUNUSED(buf), + tsize_t WXUNUSED(size)) +{ + return (tsize_t) -1; +} + +tsize_t TIFFLINKAGEMODE +wxTIFFReadProc(thandle_t handle, tdata_t buf, tsize_t size) +{ + wxInputStream *stream = (wxInputStream*) handle; + stream->Read( (void*) buf, (size_t) size ); + return wx_truncate_cast(tsize_t, stream->LastRead()); +} + +tsize_t TIFFLINKAGEMODE +wxTIFFWriteProc(thandle_t handle, tdata_t buf, tsize_t size) +{ + wxOutputStream *stream = (wxOutputStream*) handle; + stream->Write( (void*) buf, (size_t) size ); + return wx_truncate_cast(tsize_t, stream->LastWrite()); +} + +toff_t TIFFLINKAGEMODE +wxTIFFSeekIProc(thandle_t handle, toff_t off, int whence) +{ + wxInputStream *stream = (wxInputStream*) handle; + + return wxFileOffsetToTIFF(stream->SeekI((wxFileOffset)off, + wxSeekModeFromTIFF(whence))); +} + +toff_t TIFFLINKAGEMODE +wxTIFFSeekOProc(thandle_t handle, toff_t off, int whence) +{ + wxOutputStream *stream = (wxOutputStream*) handle; + + return wxFileOffsetToTIFF(stream->SeekO((wxFileOffset)off, + wxSeekModeFromTIFF(whence))); +} + +int TIFFLINKAGEMODE +wxTIFFCloseIProc(thandle_t WXUNUSED(handle)) +{ + // there is no need to close the input stream + return 0; +} + +int TIFFLINKAGEMODE +wxTIFFCloseOProc(thandle_t handle) +{ + wxOutputStream *stream = (wxOutputStream*) handle; + + return stream->Close() ? 0 : -1; +} + +toff_t TIFFLINKAGEMODE +wxTIFFSizeProc(thandle_t handle) +{ + wxStreamBase *stream = (wxStreamBase*) handle; + return (toff_t) stream->GetSize(); +} + +int TIFFLINKAGEMODE +wxTIFFMapProc(thandle_t WXUNUSED(handle), + tdata_t* WXUNUSED(pbase), + toff_t* WXUNUSED(psize)) +{ + return 0; +} + +void TIFFLINKAGEMODE +wxTIFFUnmapProc(thandle_t WXUNUSED(handle), + tdata_t WXUNUSED(base), + toff_t WXUNUSED(size)) +{ +} + +static void +TIFFwxWarningHandler(const char* module, + const char* WXUNUSED_IN_UNICODE(fmt), + va_list WXUNUSED_IN_UNICODE(ap)) +{ + if (module != NULL) + wxLogWarning(_("tiff module: %s"), wxString::FromAscii(module).c_str()); + + // FIXME: this is not terrible informative but better than crashing! +#if wxUSE_UNICODE + wxLogWarning(_("TIFF library warning.")); +#else + wxVLogWarning(fmt, ap); +#endif +} + +static void +TIFFwxErrorHandler(const char* module, + const char* WXUNUSED_IN_UNICODE(fmt), + va_list WXUNUSED_IN_UNICODE(ap)) +{ + if (module != NULL) + wxLogError(_("tiff module: %s"), wxString::FromAscii(module).c_str()); + + // FIXME: as above +#if wxUSE_UNICODE + wxLogError(_("TIFF library error.")); +#else + wxVLogError(fmt, ap); +#endif +} + +} // extern "C" + +TIFF* +TIFFwxOpen(wxInputStream &stream, const char* name, const char* mode) +{ + TIFF* tif = TIFFClientOpen(name, mode, + (thandle_t) &stream, + wxTIFFReadProc, wxTIFFNullProc, + wxTIFFSeekIProc, wxTIFFCloseIProc, wxTIFFSizeProc, + wxTIFFMapProc, wxTIFFUnmapProc); + + return tif; +} + +TIFF* +TIFFwxOpen(wxOutputStream &stream, const char* name, const char* mode) +{ + TIFF* tif = TIFFClientOpen(name, mode, + (thandle_t) &stream, + wxTIFFNullProc, wxTIFFWriteProc, + wxTIFFSeekOProc, wxTIFFCloseOProc, wxTIFFSizeProc, + wxTIFFMapProc, wxTIFFUnmapProc); + + return tif; +} + +wxTIFFHandler::wxTIFFHandler() +{ + m_name = wxT("TIFF file"); + m_extension = wxT("tif"); + m_type = wxBITMAP_TYPE_TIF; + m_mime = wxT("image/tiff"); + TIFFSetWarningHandler((TIFFErrorHandler) TIFFwxWarningHandler); + TIFFSetErrorHandler((TIFFErrorHandler) TIFFwxErrorHandler); +} + +bool wxTIFFHandler::LoadFile( wxImage *image, wxInputStream& stream, bool verbose, int index ) +{ + if (index == -1) + index = 0; + + image->Destroy(); + + TIFF *tif = TIFFwxOpen( stream, "image", "r" ); + + if (!tif) + { + if (verbose) + wxLogError( _("TIFF: Error loading image.") ); + + return false; + } + + if (!TIFFSetDirectory( tif, (tdir_t)index )) + { + if (verbose) + wxLogError( _("Invalid TIFF image index.") ); + + TIFFClose( tif ); + + return false; + } + + uint32 w, h; + uint32 npixels; + uint32 *raster; + + TIFFGetField( tif, TIFFTAG_IMAGEWIDTH, &w ); + TIFFGetField( tif, TIFFTAG_IMAGELENGTH, &h ); + + uint16 extraSamples; + uint16* samplesInfo; + TIFFGetFieldDefaulted(tif, TIFFTAG_EXTRASAMPLES, + &extraSamples, &samplesInfo); + const bool hasAlpha = (extraSamples == 1 && + (samplesInfo[0] == EXTRASAMPLE_ASSOCALPHA || + samplesInfo[0] == EXTRASAMPLE_UNASSALPHA)); + + npixels = w * h; + + raster = (uint32*) _TIFFmalloc( npixels * sizeof(uint32) ); + + if (!raster) + { + if (verbose) + wxLogError( _("TIFF: Couldn't allocate memory.") ); + + TIFFClose( tif ); + + return false; + } + + image->Create( (int)w, (int)h ); + if (!image->Ok()) + { + if (verbose) + wxLogError( _("TIFF: Couldn't allocate memory.") ); + + _TIFFfree( raster ); + TIFFClose( tif ); + + return false; + } + + if ( hasAlpha ) + image->SetAlpha(); + + if (!TIFFReadRGBAImage( tif, w, h, raster, 0 )) + { + if (verbose) + wxLogError( _("TIFF: Error reading image.") ); + + _TIFFfree( raster ); + image->Destroy(); + TIFFClose( tif ); + + return false; + } + + unsigned char *ptr = image->GetData(); + ptr += w*3*(h-1); + + unsigned char *alpha = hasAlpha ? image->GetAlpha() : NULL; + if ( hasAlpha ) + alpha += w*(h-1); + + uint32 pos = 0; + + for (uint32 i = 0; i < h; i++) + { + for (uint32 j = 0; j < w; j++) + { + *(ptr++) = (unsigned char)TIFFGetR(raster[pos]); + *(ptr++) = (unsigned char)TIFFGetG(raster[pos]); + *(ptr++) = (unsigned char)TIFFGetB(raster[pos]); + if ( hasAlpha ) + *(alpha++) = (unsigned char)TIFFGetA(raster[pos]); + + pos++; + } + + // subtract line we just added plus one line: + ptr -= 2*w*3; + if ( hasAlpha ) + alpha -= 2*w; + } + + _TIFFfree( raster ); + + TIFFClose( tif ); + + return true; +} + +int wxTIFFHandler::GetImageCount( wxInputStream& stream ) +{ + TIFF *tif = TIFFwxOpen( stream, "image", "r" ); + + if (!tif) + return 0; + + int dircount = 0; // according to the libtiff docs, dircount should be set to 1 here??? + do { + dircount++; + } while (TIFFReadDirectory(tif)); + + TIFFClose( tif ); + + return dircount; +} + +bool wxTIFFHandler::SaveFile( wxImage *image, wxOutputStream& stream, bool verbose ) +{ + TIFF *tif = TIFFwxOpen( stream, "image", "w" ); + + if (!tif) + { + if (verbose) + wxLogError( _("TIFF: Error saving image.") ); + + return false; + } + + TIFFSetField(tif, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT); + TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, (uint32)image->GetWidth()); + TIFFSetField(tif, TIFFTAG_IMAGELENGTH, (uint32)image->GetHeight()); + TIFFSetField(tif, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT); + TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); + + if ( image->HasOption(wxIMAGE_OPTION_RESOLUTIONX) && + image->HasOption(wxIMAGE_OPTION_RESOLUTIONY) ) + { + TIFFSetField(tif, TIFFTAG_XRESOLUTION, + (float)image->GetOptionInt(wxIMAGE_OPTION_RESOLUTIONX)); + TIFFSetField(tif, TIFFTAG_YRESOLUTION, + (float)image->GetOptionInt(wxIMAGE_OPTION_RESOLUTIONY)); + } + + int spp = image->GetOptionInt(wxIMAGE_OPTION_SAMPLESPERPIXEL); + if ( !spp ) + spp = 3; + + int bpp = image->GetOptionInt(wxIMAGE_OPTION_BITSPERSAMPLE); + if ( !bpp ) + bpp=8; + + int compression = image->GetOptionInt(wxIMAGE_OPTION_COMPRESSION); + if ( !compression ) + { + // we can't use COMPRESSION_LZW because current version of libtiff + // doesn't implement it ("no longer implemented due to Unisys patent + // enforcement") and other compression methods are lossy so we + // shouldn't use them by default -- and the only remaining one is none + compression = COMPRESSION_NONE; + } + + TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, spp); + TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, bpp); + TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, spp*bpp == 1 ? PHOTOMETRIC_MINISBLACK + : PHOTOMETRIC_RGB); + TIFFSetField(tif, TIFFTAG_COMPRESSION, compression); + + // scanlinesize if determined by spp and bpp + tsize_t linebytes = (tsize_t)image->GetWidth() * spp * bpp / 8; + + if ( (image->GetWidth() % 8 > 0) && (spp * bpp < 8) ) + linebytes+=1; + + unsigned char *buf; + + if (TIFFScanlineSize(tif) > linebytes || (spp * bpp < 24)) + { + buf = (unsigned char *)_TIFFmalloc(TIFFScanlineSize(tif)); + if (!buf) + { + if (verbose) + wxLogError( _("TIFF: Couldn't allocate memory.") ); + + TIFFClose( tif ); + + return false; + } + } + else + { + buf = NULL; + } + + TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP,TIFFDefaultStripSize(tif, (uint32) -1)); + + unsigned char *ptr = image->GetData(); + for ( int row = 0; row < image->GetHeight(); row++ ) + { + if ( buf ) + { + if ( spp * bpp > 1 ) + { + // color image + memcpy(buf, ptr, image->GetWidth()); + } + else // black and white image + { + for ( int column = 0; column < linebytes; column++ ) + { + uint8 reverse = 0; + for ( int bp = 0; bp < 8; bp++ ) + { + if ( ptr[column*24 + bp*3] > 0 ) + { + // check only red as this is sufficient + reverse = (uint8)(reverse | 128 >> bp); + } + } + + buf[column] = reverse; + } + } + } + + if ( TIFFWriteScanline(tif, buf ? buf : ptr, (uint32)row, 0) < 0 ) + { + if (verbose) + wxLogError( _("TIFF: Error writing image.") ); + + TIFFClose( tif ); + if (buf) + _TIFFfree(buf); + + return false; + } + + ptr += image->GetWidth()*3; + } + + (void) TIFFClose(tif); + + if (buf) + _TIFFfree(buf); + + return true; +} + +bool wxTIFFHandler::DoCanRead( wxInputStream& stream ) +{ + unsigned char hdr[2]; + + if ( !stream.Read(&hdr[0], WXSIZEOF(hdr)) ) + return false; + + return (hdr[0] == 'I' && hdr[1] == 'I') || + (hdr[0] == 'M' && hdr[1] == 'M'); +} + +#endif // wxUSE_STREAMS + +#endif // wxUSE_LIBTIFF diff --git a/Externals/wxWidgets/src/common/imagxpm.cpp b/Externals/wxWidgets/src/common/imagxpm.cpp new file mode 100644 index 0000000000..5a7c326df0 --- /dev/null +++ b/Externals/wxWidgets/src/common/imagxpm.cpp @@ -0,0 +1,224 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/imagxpm.cpp +// Purpose: wxXPMHandler +// Author: Vaclav Slavik, Robert Roebling +// RCS-ID: $Id: imagxpm.cpp 47105 2007-07-03 17:17:20Z PC $ +// Copyright: (c) 2001 Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +/* + +This file is partially based on source code of ImageMagick by John Cristy. Its +license is as follows: + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% X X PPPP M M % +% X X P P MM MM % +% X PPPP M M M % +% X X P M M % +% X X P M M % +% % +% % +% Read/Write ImageMagick Image Format. % +% % +% % +% Software Design % +% John Cristy % +% July 1992 % +% % +% % +% Copyright (C) 2001 ImageMagick Studio, a non-profit organization dedicated % +% to making software imaging solutions freely available. % +% % +% Permission is hereby granted, free of charge, to any person obtaining a % +% copy of this software and associated documentation files ("ImageMagick"), % +% to deal in ImageMagick without restriction, including without limitation % +% the rights to use, copy, modify, merge, publish, distribute, sublicense, % +% and/or sell copies of ImageMagick, and to permit persons to whom the % +% ImageMagick is furnished to do so, subject to the following conditions: % +% % +% The above copyright notice and this permission notice shall be included in % +% all copies or substantial portions of ImageMagick. % +% % +% 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 % +% ImageMagick Studio 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 ImageMagick or the use or other dealings in % +% ImageMagick. % +% % +% Except as contained in this notice, the name of the ImageMagick Studio % +% shall not be used in advertising or otherwise to promote the sale, use or % +% other dealings in ImageMagick without prior written authorization from the % +% ImageMagick Studio. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_XPM + +#ifndef WX_PRECOMP + #include "wx/log.h" + #include "wx/intl.h" + #include "wx/utils.h" +#endif + +#include "wx/imagxpm.h" +#include "wx/wfstream.h" +#include "wx/xpmdecod.h" + +IMPLEMENT_DYNAMIC_CLASS(wxXPMHandler,wxImageHandler) + +//----------------------------------------------------------------------------- +// wxXPMHandler +//----------------------------------------------------------------------------- + +#if wxUSE_STREAMS + +bool wxXPMHandler::LoadFile(wxImage *image, + wxInputStream& stream, + bool WXUNUSED(verbose), int WXUNUSED(index)) +{ + wxXPMDecoder decoder; + + wxImage img = decoder.ReadFile(stream); + if ( !img.Ok() ) + return false; + *image = img; + return true; +} + +bool wxXPMHandler::SaveFile(wxImage * image, + wxOutputStream& stream, bool WXUNUSED(verbose)) +{ + // 1. count colours: + #define MaxCixels 92 + static const char Cixel[MaxCixels+1] = + " .XoO+@#$%&*=-;:>,<1234567890qwertyuipasdfghjk" + "lzxcvbnmMNBVCZASDFGHJKLPIUYTREWQ!~^/()_`'][{}|"; + int i, j, k; + + wxImageHistogram histogram; + int cols = int(image->ComputeHistogram(histogram)); + + int chars_per_pixel = 1; + for ( k = MaxCixels; cols > k; k *= MaxCixels) + chars_per_pixel++; + + // 2. write the header: + wxString sName; + if ( image->HasOption(wxIMAGE_OPTION_FILENAME) ) + { + wxSplitPath(image->GetOption(wxIMAGE_OPTION_FILENAME), + NULL, &sName, NULL); + sName << wxT("_xpm"); + } + + if ( !sName.empty() ) + sName = wxString(wxT("/* XPM */\nstatic char *")) + sName; + else + sName = wxT("/* XPM */\nstatic char *xpm_data"); + stream.Write( (const char*) sName.ToAscii(), sName.Len() ); + + char tmpbuf[200]; + // VS: 200b is safe upper bound for anything produced by sprintf below + // (<101 bytes the string, neither %i can expand into more than 10 chars) + sprintf(tmpbuf, + "[] = {\n" + "/* columns rows colors chars-per-pixel */\n" + "\"%i %i %i %i\",\n", + image->GetWidth(), image->GetHeight(), cols, chars_per_pixel); + stream.Write(tmpbuf, strlen(tmpbuf)); + + // 3. create color symbols table: + char *symbols_data = new char[cols * (chars_per_pixel+1)]; + char **symbols = new char*[cols]; + + // 2a. find mask colour: + unsigned long mask_key = 0x1000000 /*invalid RGB value*/; + if (image->HasMask()) + mask_key = (image->GetMaskRed() << 16) | + (image->GetMaskGreen() << 8) | image->GetMaskBlue(); + + // 2b. generate colour table: + for (wxImageHistogram::iterator entry = histogram.begin(); + entry != histogram.end(); ++entry ) + { + unsigned long index = entry->second.index; + symbols[index] = symbols_data + index * (chars_per_pixel+1); + char *sym = symbols[index]; + + for (j = 0; j < chars_per_pixel; j++) + { + sym[j] = Cixel[index % MaxCixels]; + index /= MaxCixels; + } + sym[j] = '\0'; + + unsigned long key = entry->first; + + if (key == 0) + sprintf( tmpbuf, "\"%s c Black\",\n", sym); + else if (key == mask_key) + sprintf( tmpbuf, "\"%s c None\",\n", sym); + else + { + wxByte r = wxByte(key >> 16); + wxByte g = wxByte(key >> 8); + wxByte b = wxByte(key); + sprintf(tmpbuf, "\"%s c #%02X%02X%02X\",\n", sym, r, g, b); + } + stream.Write( tmpbuf, strlen(tmpbuf) ); + } + + stream.Write("/* pixels */\n", 13); + + unsigned char *data = image->GetData(); + for (j = 0; j < image->GetHeight(); j++) + { + char tmp_c; + tmp_c = '\"'; stream.Write(&tmp_c, 1); + for (i = 0; i < image->GetWidth(); i++, data += 3) + { + unsigned long key = (data[0] << 16) | (data[1] << 8) | (data[2]); + stream.Write(symbols[histogram[key].index], chars_per_pixel); + } + tmp_c = '\"'; stream.Write(&tmp_c, 1); + if ( j + 1 < image->GetHeight() ) + { + tmp_c = ','; stream.Write(&tmp_c, 1); + } + tmp_c = '\n'; stream.Write(&tmp_c, 1); + } + stream.Write("};\n", 3 ); + + // Clean up: + delete[] symbols; + delete[] symbols_data; + + return true; +} + +bool wxXPMHandler::DoCanRead(wxInputStream& stream) +{ + wxXPMDecoder decoder; + return decoder.CanRead(stream); +} + +#endif // wxUSE_STREAMS + +#endif // wxUSE_XPM diff --git a/Externals/wxWidgets/src/common/init.cpp b/Externals/wxWidgets/src/common/init.cpp new file mode 100644 index 0000000000..8bcd852543 --- /dev/null +++ b/Externals/wxWidgets/src/common/init.cpp @@ -0,0 +1,498 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/init.cpp +// Purpose: initialisation for the library +// Author: Vadim Zeitlin +// Modified by: +// Created: 04.10.99 +// RCS-ID: $Id: init.cpp 50009 2007-11-16 23:41:38Z VZ $ +// Copyright: (c) Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif //__BORLANDC__ + +#ifndef WX_PRECOMP + #include "wx/app.h" + #include "wx/filefn.h" + #include "wx/log.h" + #include "wx/thread.h" + #include "wx/intl.h" + #include "wx/module.h" +#endif + +#include "wx/init.h" + +#include "wx/ptr_scpd.h" +#include "wx/except.h" + +#if defined(__WXMSW__) && defined(__WXDEBUG__) + #include "wx/msw/msvcrt.h" + + static struct EnableMemLeakChecking + { + EnableMemLeakChecking() + { + // do check for memory leaks on program exit (another useful flag + // is _CRTDBG_DELAY_FREE_MEM_DF which doesn't free deallocated + // memory which may be used to simulate low-memory condition) + wxCrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF); + } + } gs_enableLeakChecks; +#endif // __WXMSW__ && __WXDEBUG__ + +// ---------------------------------------------------------------------------- +// private classes +// ---------------------------------------------------------------------------- + +// we need a dummy app object if the user doesn't want to create a real one +class wxDummyConsoleApp : public wxAppConsole +{ +public: + wxDummyConsoleApp() { } + + virtual int OnRun() { wxFAIL_MSG( _T("unreachable code") ); return 0; } + + DECLARE_NO_COPY_CLASS(wxDummyConsoleApp) +}; + +// we need a special kind of auto pointer to wxApp which not only deletes the +// pointer it holds in its dtor but also resets the global application pointer +wxDECLARE_SCOPED_PTR(wxAppConsole, wxAppPtrBase) +wxDEFINE_SCOPED_PTR(wxAppConsole, wxAppPtrBase) + +class wxAppPtr : public wxAppPtrBase +{ +public: + wxEXPLICIT wxAppPtr(wxAppConsole *ptr = NULL) : wxAppPtrBase(ptr) { } + ~wxAppPtr() + { + if ( get() ) + { + // the pointer is going to be deleted in the base class dtor, don't + // leave the dangling pointer! + wxApp::SetInstance(NULL); + } + } + + void Set(wxAppConsole *ptr) + { + reset(ptr); + + wxApp::SetInstance(ptr); + } + + DECLARE_NO_COPY_CLASS(wxAppPtr) +}; + +// class to ensure that wxAppBase::CleanUp() is called if our Initialize() +// fails +class wxCallAppCleanup +{ +public: + wxCallAppCleanup(wxAppConsole *app) : m_app(app) { } + ~wxCallAppCleanup() { if ( m_app ) m_app->CleanUp(); } + + void Dismiss() { m_app = NULL; } + +private: + wxAppConsole *m_app; +}; + +// another tiny class which simply exists to ensure that wxEntryCleanup is +// always called +class wxCleanupOnExit +{ +public: + ~wxCleanupOnExit() { wxEntryCleanup(); } +}; + +// ---------------------------------------------------------------------------- +// private functions +// ---------------------------------------------------------------------------- + +// suppress warnings about unused variables +static inline void Use(void *) { } + +#define WX_SUPPRESS_UNUSED_WARN(x) Use(&x) + +// ---------------------------------------------------------------------------- +// initialization data +// ---------------------------------------------------------------------------- + +static struct InitData +{ + InitData() + { + nInitCount = 0; + +#if wxUSE_UNICODE + argc = 0; + // argv = NULL; -- not even really needed +#endif // wxUSE_UNICODE + } + + // critical section protecting this struct + wxCRIT_SECT_DECLARE_MEMBER(csInit); + + // number of times wxInitialize() was called minus the number of times + // wxUninitialize() was + size_t nInitCount; + +#if wxUSE_UNICODE + int argc; + + // if we receive the command line arguments as ASCII and have to convert + // them to Unicode ourselves (this is the case under Unix but not Windows, + // for example), we remember the converted argv here because we'll have to + // free it when doing cleanup to avoid memory leaks + wchar_t **argv; +#endif // wxUSE_UNICODE + + DECLARE_NO_COPY_CLASS(InitData) +} gs_initData; + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// command line arguments ANSI -> Unicode conversion +// ---------------------------------------------------------------------------- + +#if wxUSE_UNICODE + +static void ConvertArgsToUnicode(int argc, char **argv) +{ + gs_initData.argv = new wchar_t *[argc + 1]; + int wargc = 0; + for ( int i = 0; i < argc; i++ ) + { + wxWCharBuffer buf(wxConvLocal.cMB2WX(argv[i])); + if ( !buf ) + { + wxLogWarning(_("Command line argument %d couldn't be converted to Unicode and will be ignored."), + i); + } + else // converted ok + { + gs_initData.argv[wargc++] = wxStrdup(buf); + } + } + + gs_initData.argc = wargc; + gs_initData.argv[wargc] = NULL; +} + +static void FreeConvertedArgs() +{ + if ( gs_initData.argv ) + { + for ( int i = 0; i < gs_initData.argc; i++ ) + { + free(gs_initData.argv[i]); + } + + delete [] gs_initData.argv; + gs_initData.argv = NULL; + gs_initData.argc = 0; + } +} + +#endif // wxUSE_UNICODE + +// ---------------------------------------------------------------------------- +// start up +// ---------------------------------------------------------------------------- + +// initialization which is always done (not customizable) before wxApp creation +static bool DoCommonPreInit() +{ +#if wxUSE_LOG + // Reset logging in case we were cleaned up and are being reinitialized. + wxLog::DoCreateOnDemand(); + + // install temporary log sink: we can't use wxLogGui before wxApp is + // constructed and if we use wxLogStderr, all messages during + // initialization simply disappear under Windows + // + // note that we will delete this log target below + delete wxLog::SetActiveTarget(new wxLogBuffer); +#endif // wxUSE_LOG + + return true; +} + +// non customizable initialization done after wxApp creation and initialization +static bool DoCommonPostInit() +{ + wxModule::RegisterModules(); + + if ( !wxModule::InitializeModules() ) + { + wxLogError(_("Initialization failed in post init, aborting.")); + return false; + } + + return true; +} + +bool wxEntryStart(int& argc, wxChar **argv) +{ + // do minimal, always necessary, initialization + // -------------------------------------------- + + // initialize wxRTTI + if ( !DoCommonPreInit() ) + { + return false; + } + + + // first of all, we need an application object + // ------------------------------------------- + + // the user might have already created it himself somehow + wxAppPtr app(wxTheApp); + if ( !app.get() ) + { + // if not, he might have used IMPLEMENT_APP() to give us a function to + // create it + wxAppInitializerFunction fnCreate = wxApp::GetInitializerFunction(); + + if ( fnCreate ) + { + // he did, try to create the custom wxApp object + app.Set((*fnCreate)()); + } + } + + if ( !app.get() ) + { + // either IMPLEMENT_APP() was not used at all or it failed -- in any + // case we still need something + app.Set(new wxDummyConsoleApp); + } + + + // wxApp initialization: this can be customized + // -------------------------------------------- + + if ( !app->Initialize(argc, argv) ) + { + return false; + } + + wxCallAppCleanup callAppCleanup(app.get()); + + // for compatibility call the old initialization function too + if ( !app->OnInitGui() ) + return false; + + + // common initialization after wxTheApp creation + // --------------------------------------------- + + if ( !DoCommonPostInit() ) + return false; + + + // prevent the smart pointer from destroying its contents + app.release(); + + // and the cleanup object from doing cleanup + callAppCleanup.Dismiss(); + +#if wxUSE_LOG + // now that we have a valid wxApp (wxLogGui would have crashed if we used + // it before now), we can delete the temporary sink we had created for the + // initialization messages -- the next time logging function is called, the + // sink will be recreated but this time wxAppTraits will be used + delete wxLog::SetActiveTarget(NULL); +#endif // wxUSE_LOG + + return true; +} + +#if wxUSE_UNICODE + +// we provide a wxEntryStart() wrapper taking "char *" pointer too +bool wxEntryStart(int& argc, char **argv) +{ + ConvertArgsToUnicode(argc, argv); + + if ( !wxEntryStart(gs_initData.argc, gs_initData.argv) ) + { + FreeConvertedArgs(); + + return false; + } + + return true; +} + +#endif // wxUSE_UNICODE + +// ---------------------------------------------------------------------------- +// clean up +// ---------------------------------------------------------------------------- + +// cleanup done before destroying wxTheApp +static void DoCommonPreCleanup() +{ +#if wxUSE_LOG + // flush the logged messages if any and install a 'safer' log target: the + // default one (wxLogGui) can't be used after the resources are freed just + // below and the user supplied one might be even more unsafe (using any + // wxWidgets GUI function is unsafe starting from now) + wxLog::DontCreateOnDemand(); + + // this will flush the old messages if any + delete wxLog::SetActiveTarget(new wxLogStderr); +#endif // wxUSE_LOG +} + +// cleanup done after destroying wxTheApp +static void DoCommonPostCleanup() +{ + wxModule::CleanUpModules(); + + // we can't do this in wxApp itself because it doesn't know if argv had + // been allocated +#if wxUSE_UNICODE + FreeConvertedArgs(); +#endif // wxUSE_UNICODE + + // use Set(NULL) and not Get() to avoid creating a message output object on + // demand when we just want to delete it + delete wxMessageOutput::Set(NULL); + +#if wxUSE_LOG + // and now delete the last logger as well + delete wxLog::SetActiveTarget(NULL); +#endif // wxUSE_LOG +} + +void wxEntryCleanup() +{ + DoCommonPreCleanup(); + + + // delete the application object + if ( wxTheApp ) + { + wxTheApp->CleanUp(); + + // reset the global pointer to it to NULL before destroying it as in + // some circumstances this can result in executing the code using + // wxTheApp and using half-destroyed object is no good + wxAppConsole * const app = wxApp::GetInstance(); + wxApp::SetInstance(NULL); + delete app; + } + + + DoCommonPostCleanup(); +} + +// ---------------------------------------------------------------------------- +// wxEntry +// ---------------------------------------------------------------------------- + +// for MSW the real wxEntry is defined in msw/main.cpp +#ifndef __WXMSW__ + #define wxEntryReal wxEntry +#endif // !__WXMSW__ + +int wxEntryReal(int& argc, wxChar **argv) +{ + // library initialization + if ( !wxEntryStart(argc, argv) ) + { +#if wxUSE_LOG + // flush any log messages explaining why we failed + delete wxLog::SetActiveTarget(NULL); +#endif + return -1; + } + + // if wxEntryStart succeeded, we must call wxEntryCleanup even if the code + // below returns or throws + wxCleanupOnExit cleanupOnExit; + + WX_SUPPRESS_UNUSED_WARN(cleanupOnExit); + + wxTRY + { + + // app initialization + if ( !wxTheApp->CallOnInit() ) + { + // don't call OnExit() if OnInit() failed + return -1; + } + + // ensure that OnExit() is called if OnInit() had succeeded + class CallOnExit + { + public: + ~CallOnExit() { wxTheApp->OnExit(); } + } callOnExit; + + WX_SUPPRESS_UNUSED_WARN(callOnExit); + + // app execution + return wxTheApp->OnRun(); + } + wxCATCH_ALL( wxTheApp->OnUnhandledException(); return -1; ) +} + +#if wxUSE_UNICODE + +// as with wxEntryStart, we provide an ANSI wrapper +int wxEntry(int& argc, char **argv) +{ + ConvertArgsToUnicode(argc, argv); + + return wxEntry(gs_initData.argc, gs_initData.argv); +} + +#endif // wxUSE_UNICODE + +// ---------------------------------------------------------------------------- +// wxInitialize/wxUninitialize +// ---------------------------------------------------------------------------- + +bool wxInitialize(int argc, wxChar **argv) +{ + wxCRIT_SECT_LOCKER(lockInit, gs_initData.csInit); + + if ( gs_initData.nInitCount++ ) + { + // already initialized + return true; + } + + return wxEntryStart(argc, argv); +} + +void wxUninitialize() +{ + wxCRIT_SECT_LOCKER(lockInit, gs_initData.csInit); + + if ( --gs_initData.nInitCount == 0 ) + { + wxEntryCleanup(); + } +} diff --git a/Externals/wxWidgets/src/common/intl.cpp b/Externals/wxWidgets/src/common/intl.cpp new file mode 100644 index 0000000000..0da85adad6 --- /dev/null +++ b/Externals/wxWidgets/src/common/intl.cpp @@ -0,0 +1,3682 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/intl.cpp +// Purpose: Internationalization and localisation for wxWidgets +// Author: Vadim Zeitlin +// Modified by: Michael N. Filippov +// (2003/09/30 - PluralForms support) +// Created: 29/01/98 +// RCS-ID: $Id: intl.cpp 49569 2007-10-31 23:05:53Z RD $ +// Copyright: (c) 1998 Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declaration +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#ifdef __EMX__ +// The following define is needed by Innotek's libc to +// make the definition of struct localeconv available. +#define __INTERNAL_DEFS +#endif + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_INTL + +#ifndef WX_PRECOMP + #include "wx/dynarray.h" + #include "wx/string.h" + #include "wx/intl.h" + #include "wx/log.h" + #include "wx/utils.h" + #include "wx/app.h" + #include "wx/hashmap.h" + #include "wx/module.h" +#endif // WX_PRECOMP + +#ifndef __WXWINCE__ + #include +#endif + +// standard headers +#include +#include +#ifdef HAVE_LANGINFO_H + #include +#endif + +#ifdef __WIN32__ + #include "wx/msw/private.h" +#elif defined(__UNIX_LIKE__) + #include "wx/fontmap.h" // for CharsetToEncoding() +#endif + +#include "wx/file.h" +#include "wx/filename.h" +#include "wx/tokenzr.h" +#include "wx/fontmap.h" +#include "wx/encconv.h" +#include "wx/ptr_scpd.h" +#include "wx/apptrait.h" +#include "wx/stdpaths.h" + +#if defined(__WXMAC__) + #include "wx/mac/private.h" // includes mac headers +#endif + +// ---------------------------------------------------------------------------- +// simple types +// ---------------------------------------------------------------------------- + +// this should *not* be wxChar, this type must have exactly 8 bits! +typedef wxUint8 size_t8; +typedef wxUint32 size_t32; + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// magic number identifying the .mo format file +const size_t32 MSGCATALOG_MAGIC = 0x950412de; +const size_t32 MSGCATALOG_MAGIC_SW = 0xde120495; + +// the constants describing the format of lang_LANG locale string +static const size_t LEN_LANG = 2; +static const size_t LEN_SUBLANG = 2; +static const size_t LEN_FULL = LEN_LANG + 1 + LEN_SUBLANG; // 1 for '_' + +#define TRACE_I18N _T("i18n") + +// ---------------------------------------------------------------------------- +// global functions +// ---------------------------------------------------------------------------- + +#ifdef __WXDEBUG__ + +// small class to suppress the translation erros until exit from current scope +class NoTransErr +{ +public: + NoTransErr() { ms_suppressCount++; } + ~NoTransErr() { ms_suppressCount--; } + + static bool Suppress() { return ms_suppressCount > 0; } + +private: + static size_t ms_suppressCount; +}; + +size_t NoTransErr::ms_suppressCount = 0; + +#else // !Debug + +class NoTransErr +{ +public: + NoTransErr() { } + ~NoTransErr() { } +}; + +#endif // Debug/!Debug + +static wxLocale *wxSetLocale(wxLocale *pLocale); + +// helper functions of GetSystemLanguage() +#ifdef __UNIX__ + +// get just the language part +static inline wxString ExtractLang(const wxString& langFull) +{ + return langFull.Left(LEN_LANG); +} + +// get everything else (including the leading '_') +static inline wxString ExtractNotLang(const wxString& langFull) +{ + return langFull.Mid(LEN_LANG); +} + +#endif // __UNIX__ + + +// ---------------------------------------------------------------------------- +// Plural forms parser +// ---------------------------------------------------------------------------- + +/* + Simplified Grammar + +Expression: + LogicalOrExpression '?' Expression ':' Expression + LogicalOrExpression + +LogicalOrExpression: + LogicalAndExpression "||" LogicalOrExpression // to (a || b) || c + LogicalAndExpression + +LogicalAndExpression: + EqualityExpression "&&" LogicalAndExpression // to (a && b) && c + EqualityExpression + +EqualityExpression: + RelationalExpression "==" RelationalExperession + RelationalExpression "!=" RelationalExperession + RelationalExpression + +RelationalExpression: + MultiplicativeExpression '>' MultiplicativeExpression + MultiplicativeExpression '<' MultiplicativeExpression + MultiplicativeExpression ">=" MultiplicativeExpression + MultiplicativeExpression "<=" MultiplicativeExpression + MultiplicativeExpression + +MultiplicativeExpression: + PmExpression '%' PmExpression + PmExpression + +PmExpression: + N + Number + '(' Expression ')' +*/ + +class wxPluralFormsToken +{ +public: + enum Type + { + T_ERROR, T_EOF, T_NUMBER, T_N, T_PLURAL, T_NPLURALS, T_EQUAL, T_ASSIGN, + T_GREATER, T_GREATER_OR_EQUAL, T_LESS, T_LESS_OR_EQUAL, + T_REMINDER, T_NOT_EQUAL, + T_LOGICAL_AND, T_LOGICAL_OR, T_QUESTION, T_COLON, T_SEMICOLON, + T_LEFT_BRACKET, T_RIGHT_BRACKET + }; + Type type() const { return m_type; } + void setType(Type type) { m_type = type; } + // for T_NUMBER only + typedef int Number; + Number number() const { return m_number; } + void setNumber(Number num) { m_number = num; } +private: + Type m_type; + Number m_number; +}; + + +class wxPluralFormsScanner +{ +public: + wxPluralFormsScanner(const char* s); + const wxPluralFormsToken& token() const { return m_token; } + bool nextToken(); // returns false if error +private: + const char* m_s; + wxPluralFormsToken m_token; +}; + +wxPluralFormsScanner::wxPluralFormsScanner(const char* s) : m_s(s) +{ + nextToken(); +} + +bool wxPluralFormsScanner::nextToken() +{ + wxPluralFormsToken::Type type = wxPluralFormsToken::T_ERROR; + while (isspace(*m_s)) + { + ++m_s; + } + if (*m_s == 0) + { + type = wxPluralFormsToken::T_EOF; + } + else if (isdigit(*m_s)) + { + wxPluralFormsToken::Number number = *m_s++ - '0'; + while (isdigit(*m_s)) + { + number = number * 10 + (*m_s++ - '0'); + } + m_token.setNumber(number); + type = wxPluralFormsToken::T_NUMBER; + } + else if (isalpha(*m_s)) + { + const char* begin = m_s++; + while (isalnum(*m_s)) + { + ++m_s; + } + size_t size = m_s - begin; + if (size == 1 && memcmp(begin, "n", size) == 0) + { + type = wxPluralFormsToken::T_N; + } + else if (size == 6 && memcmp(begin, "plural", size) == 0) + { + type = wxPluralFormsToken::T_PLURAL; + } + else if (size == 8 && memcmp(begin, "nplurals", size) == 0) + { + type = wxPluralFormsToken::T_NPLURALS; + } + } + else if (*m_s == '=') + { + ++m_s; + if (*m_s == '=') + { + ++m_s; + type = wxPluralFormsToken::T_EQUAL; + } + else + { + type = wxPluralFormsToken::T_ASSIGN; + } + } + else if (*m_s == '>') + { + ++m_s; + if (*m_s == '=') + { + ++m_s; + type = wxPluralFormsToken::T_GREATER_OR_EQUAL; + } + else + { + type = wxPluralFormsToken::T_GREATER; + } + } + else if (*m_s == '<') + { + ++m_s; + if (*m_s == '=') + { + ++m_s; + type = wxPluralFormsToken::T_LESS_OR_EQUAL; + } + else + { + type = wxPluralFormsToken::T_LESS; + } + } + else if (*m_s == '%') + { + ++m_s; + type = wxPluralFormsToken::T_REMINDER; + } + else if (*m_s == '!' && m_s[1] == '=') + { + m_s += 2; + type = wxPluralFormsToken::T_NOT_EQUAL; + } + else if (*m_s == '&' && m_s[1] == '&') + { + m_s += 2; + type = wxPluralFormsToken::T_LOGICAL_AND; + } + else if (*m_s == '|' && m_s[1] == '|') + { + m_s += 2; + type = wxPluralFormsToken::T_LOGICAL_OR; + } + else if (*m_s == '?') + { + ++m_s; + type = wxPluralFormsToken::T_QUESTION; + } + else if (*m_s == ':') + { + ++m_s; + type = wxPluralFormsToken::T_COLON; + } else if (*m_s == ';') { + ++m_s; + type = wxPluralFormsToken::T_SEMICOLON; + } + else if (*m_s == '(') + { + ++m_s; + type = wxPluralFormsToken::T_LEFT_BRACKET; + } + else if (*m_s == ')') + { + ++m_s; + type = wxPluralFormsToken::T_RIGHT_BRACKET; + } + m_token.setType(type); + return type != wxPluralFormsToken::T_ERROR; +} + +class wxPluralFormsNode; + +// NB: Can't use wxDEFINE_SCOPED_PTR_TYPE because wxPluralFormsNode is not +// fully defined yet: +class wxPluralFormsNodePtr +{ +public: + wxPluralFormsNodePtr(wxPluralFormsNode *p = NULL) : m_p(p) {} + ~wxPluralFormsNodePtr(); + wxPluralFormsNode& operator*() const { return *m_p; } + wxPluralFormsNode* operator->() const { return m_p; } + wxPluralFormsNode* get() const { return m_p; } + wxPluralFormsNode* release(); + void reset(wxPluralFormsNode *p); + +private: + wxPluralFormsNode *m_p; +}; + +class wxPluralFormsNode +{ +public: + wxPluralFormsNode(const wxPluralFormsToken& token) : m_token(token) {} + const wxPluralFormsToken& token() const { return m_token; } + const wxPluralFormsNode* node(size_t i) const + { return m_nodes[i].get(); } + void setNode(size_t i, wxPluralFormsNode* n); + wxPluralFormsNode* releaseNode(size_t i); + wxPluralFormsToken::Number evaluate(wxPluralFormsToken::Number n) const; + +private: + wxPluralFormsToken m_token; + wxPluralFormsNodePtr m_nodes[3]; +}; + +wxPluralFormsNodePtr::~wxPluralFormsNodePtr() +{ + delete m_p; +} +wxPluralFormsNode* wxPluralFormsNodePtr::release() +{ + wxPluralFormsNode *p = m_p; + m_p = NULL; + return p; +} +void wxPluralFormsNodePtr::reset(wxPluralFormsNode *p) +{ + if (p != m_p) + { + delete m_p; + m_p = p; + } +} + + +void wxPluralFormsNode::setNode(size_t i, wxPluralFormsNode* n) +{ + m_nodes[i].reset(n); +} + +wxPluralFormsNode* wxPluralFormsNode::releaseNode(size_t i) +{ + return m_nodes[i].release(); +} + +wxPluralFormsToken::Number +wxPluralFormsNode::evaluate(wxPluralFormsToken::Number n) const +{ + switch (token().type()) + { + // leaf + case wxPluralFormsToken::T_NUMBER: + return token().number(); + case wxPluralFormsToken::T_N: + return n; + // 2 args + case wxPluralFormsToken::T_EQUAL: + return node(0)->evaluate(n) == node(1)->evaluate(n); + case wxPluralFormsToken::T_NOT_EQUAL: + return node(0)->evaluate(n) != node(1)->evaluate(n); + case wxPluralFormsToken::T_GREATER: + return node(0)->evaluate(n) > node(1)->evaluate(n); + case wxPluralFormsToken::T_GREATER_OR_EQUAL: + return node(0)->evaluate(n) >= node(1)->evaluate(n); + case wxPluralFormsToken::T_LESS: + return node(0)->evaluate(n) < node(1)->evaluate(n); + case wxPluralFormsToken::T_LESS_OR_EQUAL: + return node(0)->evaluate(n) <= node(1)->evaluate(n); + case wxPluralFormsToken::T_REMINDER: + { + wxPluralFormsToken::Number number = node(1)->evaluate(n); + if (number != 0) + { + return node(0)->evaluate(n) % number; + } + else + { + return 0; + } + } + case wxPluralFormsToken::T_LOGICAL_AND: + return node(0)->evaluate(n) && node(1)->evaluate(n); + case wxPluralFormsToken::T_LOGICAL_OR: + return node(0)->evaluate(n) || node(1)->evaluate(n); + // 3 args + case wxPluralFormsToken::T_QUESTION: + return node(0)->evaluate(n) + ? node(1)->evaluate(n) + : node(2)->evaluate(n); + default: + return 0; + } +} + + +class wxPluralFormsCalculator +{ +public: + wxPluralFormsCalculator() : m_nplurals(0), m_plural(0) {} + + // input: number, returns msgstr index + int evaluate(int n) const; + + // input: text after "Plural-Forms:" (e.g. "nplurals=2; plural=(n != 1);"), + // if s == 0, creates default handler + // returns 0 if error + static wxPluralFormsCalculator* make(const char* s = 0); + + ~wxPluralFormsCalculator() {} + + void init(wxPluralFormsToken::Number nplurals, wxPluralFormsNode* plural); + +private: + wxPluralFormsToken::Number m_nplurals; + wxPluralFormsNodePtr m_plural; +}; + +wxDEFINE_SCOPED_PTR_TYPE(wxPluralFormsCalculator) + +void wxPluralFormsCalculator::init(wxPluralFormsToken::Number nplurals, + wxPluralFormsNode* plural) +{ + m_nplurals = nplurals; + m_plural.reset(plural); +} + +int wxPluralFormsCalculator::evaluate(int n) const +{ + if (m_plural.get() == 0) + { + return 0; + } + wxPluralFormsToken::Number number = m_plural->evaluate(n); + if (number < 0 || number > m_nplurals) + { + return 0; + } + return number; +} + + +class wxPluralFormsParser +{ +public: + wxPluralFormsParser(wxPluralFormsScanner& scanner) : m_scanner(scanner) {} + bool parse(wxPluralFormsCalculator& rCalculator); + +private: + wxPluralFormsNode* parsePlural(); + // stops at T_SEMICOLON, returns 0 if error + wxPluralFormsScanner& m_scanner; + const wxPluralFormsToken& token() const; + bool nextToken(); + + wxPluralFormsNode* expression(); + wxPluralFormsNode* logicalOrExpression(); + wxPluralFormsNode* logicalAndExpression(); + wxPluralFormsNode* equalityExpression(); + wxPluralFormsNode* multiplicativeExpression(); + wxPluralFormsNode* relationalExpression(); + wxPluralFormsNode* pmExpression(); +}; + +bool wxPluralFormsParser::parse(wxPluralFormsCalculator& rCalculator) +{ + if (token().type() != wxPluralFormsToken::T_NPLURALS) + return false; + if (!nextToken()) + return false; + if (token().type() != wxPluralFormsToken::T_ASSIGN) + return false; + if (!nextToken()) + return false; + if (token().type() != wxPluralFormsToken::T_NUMBER) + return false; + wxPluralFormsToken::Number nplurals = token().number(); + if (!nextToken()) + return false; + if (token().type() != wxPluralFormsToken::T_SEMICOLON) + return false; + if (!nextToken()) + return false; + if (token().type() != wxPluralFormsToken::T_PLURAL) + return false; + if (!nextToken()) + return false; + if (token().type() != wxPluralFormsToken::T_ASSIGN) + return false; + if (!nextToken()) + return false; + wxPluralFormsNode* plural = parsePlural(); + if (plural == 0) + return false; + if (token().type() != wxPluralFormsToken::T_SEMICOLON) + return false; + if (!nextToken()) + return false; + if (token().type() != wxPluralFormsToken::T_EOF) + return false; + rCalculator.init(nplurals, plural); + return true; +} + +wxPluralFormsNode* wxPluralFormsParser::parsePlural() +{ + wxPluralFormsNode* p = expression(); + if (p == NULL) + { + return NULL; + } + wxPluralFormsNodePtr n(p); + if (token().type() != wxPluralFormsToken::T_SEMICOLON) + { + return NULL; + } + return n.release(); +} + +const wxPluralFormsToken& wxPluralFormsParser::token() const +{ + return m_scanner.token(); +} + +bool wxPluralFormsParser::nextToken() +{ + if (!m_scanner.nextToken()) + return false; + return true; +} + +wxPluralFormsNode* wxPluralFormsParser::expression() +{ + wxPluralFormsNode* p = logicalOrExpression(); + if (p == NULL) + return NULL; + wxPluralFormsNodePtr n(p); + if (token().type() == wxPluralFormsToken::T_QUESTION) + { + wxPluralFormsNodePtr qn(new wxPluralFormsNode(token())); + if (!nextToken()) + { + return 0; + } + p = expression(); + if (p == 0) + { + return 0; + } + qn->setNode(1, p); + if (token().type() != wxPluralFormsToken::T_COLON) + { + return 0; + } + if (!nextToken()) + { + return 0; + } + p = expression(); + if (p == 0) + { + return 0; + } + qn->setNode(2, p); + qn->setNode(0, n.release()); + return qn.release(); + } + return n.release(); +} + +wxPluralFormsNode*wxPluralFormsParser::logicalOrExpression() +{ + wxPluralFormsNode* p = logicalAndExpression(); + if (p == NULL) + return NULL; + wxPluralFormsNodePtr ln(p); + if (token().type() == wxPluralFormsToken::T_LOGICAL_OR) + { + wxPluralFormsNodePtr un(new wxPluralFormsNode(token())); + if (!nextToken()) + { + return 0; + } + p = logicalOrExpression(); + if (p == 0) + { + return 0; + } + wxPluralFormsNodePtr rn(p); // right + if (rn->token().type() == wxPluralFormsToken::T_LOGICAL_OR) + { + // see logicalAndExpression comment + un->setNode(0, ln.release()); + un->setNode(1, rn->releaseNode(0)); + rn->setNode(0, un.release()); + return rn.release(); + } + + + un->setNode(0, ln.release()); + un->setNode(1, rn.release()); + return un.release(); + } + return ln.release(); +} + +wxPluralFormsNode* wxPluralFormsParser::logicalAndExpression() +{ + wxPluralFormsNode* p = equalityExpression(); + if (p == NULL) + return NULL; + wxPluralFormsNodePtr ln(p); // left + if (token().type() == wxPluralFormsToken::T_LOGICAL_AND) + { + wxPluralFormsNodePtr un(new wxPluralFormsNode(token())); // up + if (!nextToken()) + { + return NULL; + } + p = logicalAndExpression(); + if (p == 0) + { + return NULL; + } + wxPluralFormsNodePtr rn(p); // right + if (rn->token().type() == wxPluralFormsToken::T_LOGICAL_AND) + { +// transform 1 && (2 && 3) -> (1 && 2) && 3 +// u r +// l r -> u 3 +// 2 3 l 2 + un->setNode(0, ln.release()); + un->setNode(1, rn->releaseNode(0)); + rn->setNode(0, un.release()); + return rn.release(); + } + + un->setNode(0, ln.release()); + un->setNode(1, rn.release()); + return un.release(); + } + return ln.release(); +} + +wxPluralFormsNode* wxPluralFormsParser::equalityExpression() +{ + wxPluralFormsNode* p = relationalExpression(); + if (p == NULL) + return NULL; + wxPluralFormsNodePtr n(p); + if (token().type() == wxPluralFormsToken::T_EQUAL + || token().type() == wxPluralFormsToken::T_NOT_EQUAL) + { + wxPluralFormsNodePtr qn(new wxPluralFormsNode(token())); + if (!nextToken()) + { + return NULL; + } + p = relationalExpression(); + if (p == NULL) + { + return NULL; + } + qn->setNode(1, p); + qn->setNode(0, n.release()); + return qn.release(); + } + return n.release(); +} + +wxPluralFormsNode* wxPluralFormsParser::relationalExpression() +{ + wxPluralFormsNode* p = multiplicativeExpression(); + if (p == NULL) + return NULL; + wxPluralFormsNodePtr n(p); + if (token().type() == wxPluralFormsToken::T_GREATER + || token().type() == wxPluralFormsToken::T_LESS + || token().type() == wxPluralFormsToken::T_GREATER_OR_EQUAL + || token().type() == wxPluralFormsToken::T_LESS_OR_EQUAL) + { + wxPluralFormsNodePtr qn(new wxPluralFormsNode(token())); + if (!nextToken()) + { + return NULL; + } + p = multiplicativeExpression(); + if (p == NULL) + { + return NULL; + } + qn->setNode(1, p); + qn->setNode(0, n.release()); + return qn.release(); + } + return n.release(); +} + +wxPluralFormsNode* wxPluralFormsParser::multiplicativeExpression() +{ + wxPluralFormsNode* p = pmExpression(); + if (p == NULL) + return NULL; + wxPluralFormsNodePtr n(p); + if (token().type() == wxPluralFormsToken::T_REMINDER) + { + wxPluralFormsNodePtr qn(new wxPluralFormsNode(token())); + if (!nextToken()) + { + return NULL; + } + p = pmExpression(); + if (p == NULL) + { + return NULL; + } + qn->setNode(1, p); + qn->setNode(0, n.release()); + return qn.release(); + } + return n.release(); +} + +wxPluralFormsNode* wxPluralFormsParser::pmExpression() +{ + wxPluralFormsNodePtr n; + if (token().type() == wxPluralFormsToken::T_N + || token().type() == wxPluralFormsToken::T_NUMBER) + { + n.reset(new wxPluralFormsNode(token())); + if (!nextToken()) + { + return NULL; + } + } + else if (token().type() == wxPluralFormsToken::T_LEFT_BRACKET) { + if (!nextToken()) + { + return NULL; + } + wxPluralFormsNode* p = expression(); + if (p == NULL) + { + return NULL; + } + n.reset(p); + if (token().type() != wxPluralFormsToken::T_RIGHT_BRACKET) + { + return NULL; + } + if (!nextToken()) + { + return NULL; + } + } + else + { + return NULL; + } + return n.release(); +} + +wxPluralFormsCalculator* wxPluralFormsCalculator::make(const char* s) +{ + wxPluralFormsCalculatorPtr calculator(new wxPluralFormsCalculator); + if (s != NULL) + { + wxPluralFormsScanner scanner(s); + wxPluralFormsParser p(scanner); + if (!p.parse(*calculator)) + { + return NULL; + } + } + return calculator.release(); +} + + + + +// ---------------------------------------------------------------------------- +// wxMsgCatalogFile corresponds to one disk-file message catalog. +// +// This is a "low-level" class and is used only by wxMsgCatalog +// ---------------------------------------------------------------------------- + +WX_DECLARE_EXPORTED_STRING_HASH_MAP(wxString, wxMessagesHash); + +class wxMsgCatalogFile +{ +public: + // ctor & dtor + wxMsgCatalogFile(); + ~wxMsgCatalogFile(); + + // load the catalog from disk (szDirPrefix corresponds to language) + bool Load(const wxChar *szDirPrefix, const wxChar *szName, + wxPluralFormsCalculatorPtr& rPluralFormsCalculator); + + // fills the hash with string-translation pairs + void FillHash(wxMessagesHash& hash, + const wxString& msgIdCharset, + bool convertEncoding) const; + + // return the charset of the strings in this catalog or empty string if + // none/unknown + wxString GetCharset() const { return m_charset; } + +private: + // this implementation is binary compatible with GNU gettext() version 0.10 + + // an entry in the string table + struct wxMsgTableEntry + { + size_t32 nLen; // length of the string + size_t32 ofsString; // pointer to the string + }; + + // header of a .mo file + struct wxMsgCatalogHeader + { + size_t32 magic, // offset +00: magic id + revision, // +04: revision + numStrings; // +08: number of strings in the file + size_t32 ofsOrigTable, // +0C: start of original string table + ofsTransTable; // +10: start of translated string table + size_t32 nHashSize, // +14: hash table size + ofsHashTable; // +18: offset of hash table start + }; + + // all data is stored here, NULL if no data loaded + size_t8 *m_pData; + + // amount of memory pointed to by m_pData. + size_t32 m_nSize; + + // data description + size_t32 m_numStrings; // number of strings in this domain + wxMsgTableEntry *m_pOrigTable, // pointer to original strings + *m_pTransTable; // translated + + wxString m_charset; // from the message catalog header + + + // swap the 2 halves of 32 bit integer if needed + size_t32 Swap(size_t32 ui) const + { + return m_bSwapped ? (ui << 24) | ((ui & 0xff00) << 8) | + ((ui >> 8) & 0xff00) | (ui >> 24) + : ui; + } + + const char *StringAtOfs(wxMsgTableEntry *pTable, size_t32 n) const + { + const wxMsgTableEntry * const ent = pTable + n; + + // this check could fail for a corrupt message catalog + size_t32 ofsString = Swap(ent->ofsString); + if ( ofsString + Swap(ent->nLen) > m_nSize) + { + return NULL; + } + + return (const char *)(m_pData + ofsString); + } + + bool m_bSwapped; // wrong endianness? + + DECLARE_NO_COPY_CLASS(wxMsgCatalogFile) +}; + + +// ---------------------------------------------------------------------------- +// wxMsgCatalog corresponds to one loaded message catalog. +// +// This is a "low-level" class and is used only by wxLocale (that's why +// it's designed to be stored in a linked list) +// ---------------------------------------------------------------------------- + +class wxMsgCatalog +{ +public: + wxMsgCatalog() { m_conv = NULL; } + ~wxMsgCatalog(); + + // load the catalog from disk (szDirPrefix corresponds to language) + bool Load(const wxChar *szDirPrefix, const wxChar *szName, + const wxChar *msgIdCharset = NULL, bool bConvertEncoding = false); + + // get name of the catalog + wxString GetName() const { return m_name; } + + // get the translated string: returns NULL if not found + const wxChar *GetString(const wxChar *sz, size_t n = size_t(-1)) const; + + // public variable pointing to the next element in a linked list (or NULL) + wxMsgCatalog *m_pNext; + +private: + wxMessagesHash m_messages; // all messages in the catalog + wxString m_name; // name of the domain + + // the conversion corresponding to this catalog charset if we installed it + // as the global one + wxCSConv *m_conv; + + wxPluralFormsCalculatorPtr m_pluralFormsCalculator; +}; + +// ---------------------------------------------------------------------------- +// global variables +// ---------------------------------------------------------------------------- + +// the list of the directories to search for message catalog files +static wxArrayString gs_searchPrefixes; + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxMsgCatalogFile class +// ---------------------------------------------------------------------------- + +wxMsgCatalogFile::wxMsgCatalogFile() +{ + m_pData = NULL; + m_nSize = 0; +} + +wxMsgCatalogFile::~wxMsgCatalogFile() +{ + delete [] m_pData; +} + +// return the directories to search for message catalogs under the given +// prefix, separated by wxPATH_SEP +static +wxString GetMsgCatalogSubdirs(const wxChar *prefix, const wxChar *lang) +{ + // Search first in Unix-standard prefix/lang/LC_MESSAGES, then in + // prefix/lang and finally in just prefix. + // + // Note that we use LC_MESSAGES on all platforms and not just Unix, because + // it doesn't cost much to look into one more directory and doing it this + // way has two important benefits: + // a) we don't break compatibility with wx-2.6 and older by stopping to + // look in a directory where the catalogs used to be and thus silently + // breaking apps after they are recompiled against the latest wx + // b) it makes it possible to package app's support files in the same + // way on all target platforms + wxString pathPrefix; + pathPrefix << prefix << wxFILE_SEP_PATH << lang; + + wxString searchPath; + searchPath.reserve(4*pathPrefix.length()); + searchPath << pathPrefix << wxFILE_SEP_PATH << wxT("LC_MESSAGES") << wxPATH_SEP + << prefix << wxFILE_SEP_PATH << wxPATH_SEP + << pathPrefix; + + return searchPath; +} + +// construct the search path for the given language +static wxString GetFullSearchPath(const wxChar *lang) +{ + // first take the entries explicitly added by the program + wxArrayString paths; + paths.reserve(gs_searchPrefixes.size() + 1); + size_t n, + count = gs_searchPrefixes.size(); + for ( n = 0; n < count; n++ ) + { + paths.Add(GetMsgCatalogSubdirs(gs_searchPrefixes[n], lang)); + } + + +#if wxUSE_STDPATHS + // then look in the standard location + const wxString stdp = wxStandardPaths::Get(). + GetLocalizedResourcesDir(lang, wxStandardPaths::ResourceCat_Messages); + + if ( paths.Index(stdp) == wxNOT_FOUND ) + paths.Add(stdp); +#endif // wxUSE_STDPATHS + + // last look in default locations +#ifdef __UNIX__ + // LC_PATH is a standard env var containing the search path for the .mo + // files + const wxChar *pszLcPath = wxGetenv(wxT("LC_PATH")); + if ( pszLcPath ) + { + const wxString lcp = GetMsgCatalogSubdirs(pszLcPath, lang); + if ( paths.Index(lcp) == wxNOT_FOUND ) + paths.Add(lcp); + } + + // also add the one from where wxWin was installed: + wxString wxp = wxGetInstallPrefix(); + if ( !wxp.empty() ) + { + wxp = GetMsgCatalogSubdirs(wxp + _T("/share/locale"), lang); + if ( paths.Index(wxp) == wxNOT_FOUND ) + paths.Add(wxp); + } +#endif // __UNIX__ + + + // finally construct the full search path + wxString searchPath; + searchPath.reserve(500); + count = paths.size(); + for ( n = 0; n < count; n++ ) + { + searchPath += paths[n]; + if ( n != count - 1 ) + searchPath += wxPATH_SEP; + } + + return searchPath; +} + +// open disk file and read in it's contents +bool wxMsgCatalogFile::Load(const wxChar *szDirPrefix, const wxChar *szName, + wxPluralFormsCalculatorPtr& rPluralFormsCalculator) +{ + wxString searchPath; + +#if wxUSE_FONTMAP + // first look for the catalog for this language and the current locale: + // notice that we don't use the system name for the locale as this would + // force us to install catalogs in different locations depending on the + // system but always use the canonical name + wxFontEncoding encSys = wxLocale::GetSystemEncoding(); + if ( encSys != wxFONTENCODING_SYSTEM ) + { + wxString fullname(szDirPrefix); + fullname << _T('.') << wxFontMapperBase::GetEncodingName(encSys); + searchPath << GetFullSearchPath(fullname) << wxPATH_SEP; + } +#endif // wxUSE_FONTMAP + + + searchPath += GetFullSearchPath(szDirPrefix); + const wxChar *sublocale = wxStrchr(szDirPrefix, wxT('_')); + if ( sublocale ) + { + // also add just base locale name: for things like "fr_BE" (belgium + // french) we should use "fr" if no belgium specific message catalogs + // exist + searchPath << wxPATH_SEP + << GetFullSearchPath(wxString(szDirPrefix). + Left((size_t)(sublocale - szDirPrefix))); + } + + // don't give translation errors here because the wxstd catalog might + // not yet be loaded (and it's normal) + // + // (we're using an object because we have several return paths) + + NoTransErr noTransErr; + wxLogVerbose(_("looking for catalog '%s' in path '%s'."), + szName, searchPath.c_str()); + wxLogTrace(TRACE_I18N, _T("Looking for \"%s.mo\" in \"%s\""), + szName, searchPath.c_str()); + + wxFileName fn(szName); + fn.SetExt(_T("mo")); + wxString strFullName; + if ( !wxFindFileInPath(&strFullName, searchPath, fn.GetFullPath()) ) { + wxLogVerbose(_("catalog file for domain '%s' not found."), szName); + wxLogTrace(TRACE_I18N, _T("Catalog \"%s.mo\" not found"), szName); + return false; + } + + // open file + wxLogVerbose(_("using catalog '%s' from '%s'."), szName, strFullName.c_str()); + wxLogTrace(TRACE_I18N, _T("Using catalog \"%s\"."), strFullName.c_str()); + + wxFile fileMsg(strFullName); + if ( !fileMsg.IsOpened() ) + return false; + + // get the file size (assume it is less than 4Gb...) + wxFileOffset lenFile = fileMsg.Length(); + if ( lenFile == wxInvalidOffset ) + return false; + + size_t nSize = wx_truncate_cast(size_t, lenFile); + wxASSERT_MSG( nSize == lenFile + size_t(0), _T("message catalog bigger than 4GB?") ); + + // read the whole file in memory + m_pData = new size_t8[nSize]; + if ( fileMsg.Read(m_pData, nSize) != lenFile ) { + wxDELETEA(m_pData); + return false; + } + + // examine header + bool bValid = nSize + (size_t)0 > sizeof(wxMsgCatalogHeader); + + wxMsgCatalogHeader *pHeader = (wxMsgCatalogHeader *)m_pData; + if ( bValid ) { + // we'll have to swap all the integers if it's true + m_bSwapped = pHeader->magic == MSGCATALOG_MAGIC_SW; + + // check the magic number + bValid = m_bSwapped || pHeader->magic == MSGCATALOG_MAGIC; + } + + if ( !bValid ) { + // it's either too short or has incorrect magic number + wxLogWarning(_("'%s' is not a valid message catalog."), strFullName.c_str()); + + wxDELETEA(m_pData); + return false; + } + + // initialize + m_numStrings = Swap(pHeader->numStrings); + m_pOrigTable = (wxMsgTableEntry *)(m_pData + + Swap(pHeader->ofsOrigTable)); + m_pTransTable = (wxMsgTableEntry *)(m_pData + + Swap(pHeader->ofsTransTable)); + m_nSize = (size_t32)nSize; + + // now parse catalog's header and try to extract catalog charset and + // plural forms formula from it: + + const char* headerData = StringAtOfs(m_pOrigTable, 0); + if (headerData && headerData[0] == 0) + { + // Extract the charset: + wxString header = wxString::FromAscii(StringAtOfs(m_pTransTable, 0)); + int begin = header.Find(wxT("Content-Type: text/plain; charset=")); + if (begin != wxNOT_FOUND) + { + begin += 34; //strlen("Content-Type: text/plain; charset=") + size_t end = header.find('\n', begin); + if (end != size_t(-1)) + { + m_charset.assign(header, begin, end - begin); + if (m_charset == wxT("CHARSET")) + { + // "CHARSET" is not valid charset, but lazy translator + m_charset.Clear(); + } + } + } + // else: incorrectly filled Content-Type header + + // Extract plural forms: + begin = header.Find(wxT("Plural-Forms:")); + if (begin != wxNOT_FOUND) + { + begin += 13; + size_t end = header.find('\n', begin); + if (end != size_t(-1)) + { + wxString pfs(header, begin, end - begin); + wxPluralFormsCalculator* pCalculator = wxPluralFormsCalculator + ::make(pfs.ToAscii()); + if (pCalculator != 0) + { + rPluralFormsCalculator.reset(pCalculator); + } + else + { + wxLogVerbose(_("Cannot parse Plural-Forms:'%s'"), pfs.c_str()); + } + } + } + if (rPluralFormsCalculator.get() == NULL) + { + rPluralFormsCalculator.reset(wxPluralFormsCalculator::make()); + } + } + + // everything is fine + return true; +} + +void wxMsgCatalogFile::FillHash(wxMessagesHash& hash, + const wxString& msgIdCharset, + bool convertEncoding) const +{ +#if wxUSE_UNICODE + // this parameter doesn't make sense, we always must convert encoding in + // Unicode build + convertEncoding = true; +#elif wxUSE_FONTMAP + if ( convertEncoding ) + { + // determine if we need any conversion at all + wxFontEncoding encCat = wxFontMapperBase::GetEncodingFromName(m_charset); + if ( encCat == wxLocale::GetSystemEncoding() ) + { + // no need to convert + convertEncoding = false; + } + } +#endif // wxUSE_UNICODE/wxUSE_FONTMAP + +#if wxUSE_WCHAR_T + // conversion to use to convert catalog strings to the GUI encoding + wxMBConv *inputConv, + *inputConvPtr = NULL; // same as inputConv but safely deleteable + if ( convertEncoding && !m_charset.empty() ) + { + inputConvPtr = + inputConv = new wxCSConv(m_charset); + } + else // no need or not possible to convert the encoding + { +#if wxUSE_UNICODE + // we must somehow convert the narrow strings in the message catalog to + // wide strings, so use the default conversion if we have no charset + inputConv = wxConvCurrent; +#else // !wxUSE_UNICODE + inputConv = NULL; +#endif // wxUSE_UNICODE/!wxUSE_UNICODE + } + + // conversion to apply to msgid strings before looking them up: we only + // need it if the msgids are neither in 7 bit ASCII nor in the same + // encoding as the catalog + wxCSConv *sourceConv = msgIdCharset.empty() || (msgIdCharset == m_charset) + ? NULL + : new wxCSConv(msgIdCharset); + +#elif wxUSE_FONTMAP + wxASSERT_MSG( msgIdCharset.empty(), + _T("non-ASCII msgid languages only supported if wxUSE_WCHAR_T=1") ); + + wxEncodingConverter converter; + if ( convertEncoding ) + { + wxFontEncoding targetEnc = wxFONTENCODING_SYSTEM; + wxFontEncoding enc = wxFontMapperBase::Get()->CharsetToEncoding(m_charset, false); + if ( enc == wxFONTENCODING_SYSTEM ) + { + convertEncoding = false; // unknown encoding + } + else + { + targetEnc = wxLocale::GetSystemEncoding(); + if (targetEnc == wxFONTENCODING_SYSTEM) + { + wxFontEncodingArray a = wxEncodingConverter::GetPlatformEquivalents(enc); + if (a[0] == enc) + // no conversion needed, locale uses native encoding + convertEncoding = false; + if (a.GetCount() == 0) + // we don't know common equiv. under this platform + convertEncoding = false; + targetEnc = a[0]; + } + } + + if ( convertEncoding ) + { + converter.Init(enc, targetEnc); + } + } +#endif // wxUSE_WCHAR_T/!wxUSE_WCHAR_T + (void)convertEncoding; // get rid of warnings about unused parameter + + for (size_t32 i = 0; i < m_numStrings; i++) + { + const char *data = StringAtOfs(m_pOrigTable, i); + + wxString msgid; +#if wxUSE_UNICODE + msgid = wxString(data, *inputConv); +#else // ASCII + #if wxUSE_WCHAR_T + if ( inputConv && sourceConv ) + msgid = wxString(inputConv->cMB2WC(data), *sourceConv); + else + #endif + msgid = data; +#endif // wxUSE_UNICODE + + data = StringAtOfs(m_pTransTable, i); + size_t length = Swap(m_pTransTable[i].nLen); + size_t offset = 0; + size_t index = 0; + while (offset < length) + { + const char * const str = data + offset; + + wxString msgstr; +#if wxUSE_UNICODE + msgstr = wxString(str, *inputConv); +#elif wxUSE_WCHAR_T + if ( inputConv ) + msgstr = wxString(inputConv->cMB2WC(str), *wxConvUI); + else + msgstr = str; +#else // !wxUSE_WCHAR_T + #if wxUSE_FONTMAP + if ( convertEncoding ) + msgstr = wxString(converter.Convert(str)); + else + #endif + msgstr = str; +#endif // wxUSE_WCHAR_T/!wxUSE_WCHAR_T + + if ( !msgstr.empty() ) + { + hash[index == 0 ? msgid : msgid + wxChar(index)] = msgstr; + } + + // skip this string + offset += strlen(str) + 1; + ++index; + } + } + +#if wxUSE_WCHAR_T + delete sourceConv; + delete inputConvPtr; +#endif // wxUSE_WCHAR_T +} + + +// ---------------------------------------------------------------------------- +// wxMsgCatalog class +// ---------------------------------------------------------------------------- + +wxMsgCatalog::~wxMsgCatalog() +{ + if ( m_conv ) + { + if ( wxConvUI == m_conv ) + { + // we only change wxConvUI if it points to wxConvLocal so we reset + // it back to it too + wxConvUI = &wxConvLocal; + } + + delete m_conv; + } +} + +bool wxMsgCatalog::Load(const wxChar *szDirPrefix, const wxChar *szName, + const wxChar *msgIdCharset, bool bConvertEncoding) +{ + wxMsgCatalogFile file; + + m_name = szName; + + if ( !file.Load(szDirPrefix, szName, m_pluralFormsCalculator) ) + return false; + + file.FillHash(m_messages, msgIdCharset, bConvertEncoding); + +#if wxUSE_WCHAR_T + // we should use a conversion compatible with the message catalog encoding + // in the GUI if we don't convert the strings to the current conversion but + // as the encoding is global, only change it once, otherwise we could get + // into trouble if we use several message catalogs with different encodings + // + // this is, of course, a hack but it at least allows the program to use + // message catalogs in any encodings without asking the user to change his + // locale + if ( !bConvertEncoding && + !file.GetCharset().empty() && + wxConvUI == &wxConvLocal ) + { + wxConvUI = + m_conv = new wxCSConv(file.GetCharset()); + } +#endif // wxUSE_WCHAR_T + + return true; +} + +const wxChar *wxMsgCatalog::GetString(const wxChar *sz, size_t n) const +{ + int index = 0; + if (n != size_t(-1)) + { + index = m_pluralFormsCalculator->evaluate(n); + } + wxMessagesHash::const_iterator i; + if (index != 0) + { + i = m_messages.find(wxString(sz) + wxChar(index)); // plural + } + else + { + i = m_messages.find(sz); + } + + if ( i != m_messages.end() ) + { + return i->second.c_str(); + } + else + return NULL; +} + +// ---------------------------------------------------------------------------- +// wxLocale +// ---------------------------------------------------------------------------- + +#include "wx/arrimpl.cpp" +WX_DECLARE_EXPORTED_OBJARRAY(wxLanguageInfo, wxLanguageInfoArray); +WX_DEFINE_OBJARRAY(wxLanguageInfoArray) + +wxLanguageInfoArray *wxLocale::ms_languagesDB = NULL; + +/*static*/ void wxLocale::CreateLanguagesDB() +{ + if (ms_languagesDB == NULL) + { + ms_languagesDB = new wxLanguageInfoArray; + InitLanguagesDB(); + } +} + +/*static*/ void wxLocale::DestroyLanguagesDB() +{ + delete ms_languagesDB; + ms_languagesDB = NULL; +} + + +void wxLocale::DoCommonInit() +{ + m_pszOldLocale = NULL; + + m_pOldLocale = wxSetLocale(this); + + m_pMsgCat = NULL; + m_language = wxLANGUAGE_UNKNOWN; + m_initialized = false; +} + +// NB: this function has (desired) side effect of changing current locale +bool wxLocale::Init(const wxChar *szName, + const wxChar *szShort, + const wxChar *szLocale, + bool bLoadDefault, + bool bConvertEncoding) +{ + wxASSERT_MSG( !m_initialized, + _T("you can't call wxLocale::Init more than once") ); + + m_initialized = true; + m_strLocale = szName; + m_strShort = szShort; + m_bConvertEncoding = bConvertEncoding; + m_language = wxLANGUAGE_UNKNOWN; + + // change current locale (default: same as long name) + if ( szLocale == NULL ) + { + // the argument to setlocale() + szLocale = szShort; + + wxCHECK_MSG( szLocale, false, _T("no locale to set in wxLocale::Init()") ); + } + +#ifdef __WXWINCE__ + // FIXME: I'm guessing here + wxChar localeName[256]; + int ret = GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SLANGUAGE, localeName, + 256); + if (ret != 0) + { + m_pszOldLocale = wxStrdup(localeName); + } + else + m_pszOldLocale = NULL; + + // TODO: how to find languageId + // SetLocaleInfo(languageId, SORT_DEFAULT, localeName); +#else + wxMB2WXbuf oldLocale = wxSetlocale(LC_ALL, szLocale); + if ( oldLocale ) + m_pszOldLocale = wxStrdup(oldLocale); + else + m_pszOldLocale = NULL; +#endif + + if ( m_pszOldLocale == NULL ) + wxLogError(_("locale '%s' can not be set."), szLocale); + + // the short name will be used to look for catalog files as well, + // so we need something here + if ( m_strShort.empty() ) { + // FIXME I don't know how these 2 letter abbreviations are formed, + // this wild guess is surely wrong + if ( szLocale && szLocale[0] ) + { + m_strShort += (wxChar)wxTolower(szLocale[0]); + if ( szLocale[1] ) + m_strShort += (wxChar)wxTolower(szLocale[1]); + } + } + + // load the default catalog with wxWidgets standard messages + m_pMsgCat = NULL; + bool bOk = true; + if ( bLoadDefault ) + { + bOk = AddCatalog(wxT("wxstd")); + + // there may be a catalog with toolkit specific overrides, it is not + // an error if this does not exist + if ( bOk ) + { + wxString port(wxPlatformInfo::Get().GetPortIdName()); + if ( !port.empty() ) + { + AddCatalog(port.BeforeFirst(wxT('/')).MakeLower()); + } + } + } + + return bOk; +} + + +#if defined(__UNIX__) && wxUSE_UNICODE && !defined(__WXMAC__) +static wxWCharBuffer wxSetlocaleTryUTF(int c, const wxChar *lc) +{ + wxMB2WXbuf l = wxSetlocale(c, lc); + if ( !l && lc && lc[0] != 0 ) + { + wxString buf(lc); + wxString buf2; + buf2 = buf + wxT(".UTF-8"); + l = wxSetlocale(c, buf2.c_str()); + if ( !l ) + { + buf2 = buf + wxT(".utf-8"); + l = wxSetlocale(c, buf2.c_str()); + } + if ( !l ) + { + buf2 = buf + wxT(".UTF8"); + l = wxSetlocale(c, buf2.c_str()); + } + if ( !l ) + { + buf2 = buf + wxT(".utf8"); + l = wxSetlocale(c, buf2.c_str()); + } + } + return l; +} +#else +#define wxSetlocaleTryUTF(c, lc) wxSetlocale(c, lc) +#endif + +bool wxLocale::Init(int language, int flags) +{ + int lang = language; + if (lang == wxLANGUAGE_DEFAULT) + { + // auto detect the language + lang = GetSystemLanguage(); + } + + // We failed to detect system language, so we will use English: + if (lang == wxLANGUAGE_UNKNOWN) + { + return false; + } + + const wxLanguageInfo *info = GetLanguageInfo(lang); + + // Unknown language: + if (info == NULL) + { + wxLogError(wxT("Unknown language %i."), lang); + return false; + } + + wxString name = info->Description; + wxString canonical = info->CanonicalName; + wxString locale; + + // Set the locale: +#if defined(__OS2__) + wxMB2WXbuf retloc = wxSetlocale(LC_ALL , wxEmptyString); +#elif defined(__UNIX__) && !defined(__WXMAC__) + if (language != wxLANGUAGE_DEFAULT) + locale = info->CanonicalName; + + wxMB2WXbuf retloc = wxSetlocaleTryUTF(LC_ALL, locale); + + const wxString langOnly = locale.Left(2); + if ( !retloc ) + { + // Some C libraries don't like xx_YY form and require xx only + retloc = wxSetlocaleTryUTF(LC_ALL, langOnly); + } + +#if wxUSE_FONTMAP + // some systems (e.g. FreeBSD and HP-UX) don't have xx_YY aliases but + // require the full xx_YY.encoding form, so try using UTF-8 because this is + // the only thing we can do generically + // + // TODO: add encodings applicable to each language to the lang DB and try + // them all in turn here + if ( !retloc ) + { + const wxChar **names = + wxFontMapperBase::GetAllEncodingNames(wxFONTENCODING_UTF8); + while ( *names ) + { + retloc = wxSetlocale(LC_ALL, locale + _T('.') + *names++); + if ( retloc ) + break; + } + } +#endif // wxUSE_FONTMAP + + if ( !retloc ) + { + // Some C libraries (namely glibc) still use old ISO 639, + // so will translate the abbrev for them + wxString localeAlt; + if ( langOnly == wxT("he") ) + localeAlt = wxT("iw") + locale.Mid(3); + else if ( langOnly == wxT("id") ) + localeAlt = wxT("in") + locale.Mid(3); + else if ( langOnly == wxT("yi") ) + localeAlt = wxT("ji") + locale.Mid(3); + else if ( langOnly == wxT("nb") ) + localeAlt = wxT("no_NO"); + else if ( langOnly == wxT("nn") ) + localeAlt = wxT("no_NY"); + + if ( !localeAlt.empty() ) + { + retloc = wxSetlocaleTryUTF(LC_ALL, localeAlt); + if ( !retloc ) + retloc = wxSetlocaleTryUTF(LC_ALL, localeAlt.Left(2)); + } + } + + if ( !retloc ) + { + wxLogError(wxT("Cannot set locale to '%s'."), locale.c_str()); + return false; + } + +#ifdef __AIX__ + // at least in AIX 5.2 libc is buggy and the string returned from setlocale(LC_ALL) + // can't be passed back to it because it returns 6 strings (one for each locale + // category), i.e. for C locale we get back "C C C C C C" + // + // this contradicts IBM own docs but this is not of much help, so just work around + // it in the crudest possible manner + wxChar *p = wxStrchr((wxChar *)retloc, _T(' ')); + if ( p ) + *p = _T('\0'); +#endif // __AIX__ + +#elif defined(__WIN32__) + + #if wxUSE_UNICODE && (defined(__VISUALC__) || defined(__MINGW32__)) + // NB: setlocale() from msvcrt.dll (used by VC++ and Mingw) + // can't set locale to language that can only be written using + // Unicode. Therefore wxSetlocale call failed, but we don't want + // to report it as an error -- so that at least message catalogs + // can be used. Watch for code marked with + // #ifdef SETLOCALE_FAILS_ON_UNICODE_LANGS bellow. + #define SETLOCALE_FAILS_ON_UNICODE_LANGS + #endif + +#if !wxUSE_UNICODE + const +#endif + wxMB2WXbuf retloc = wxT("C"); + if (language != wxLANGUAGE_DEFAULT) + { + if (info->WinLang == 0) + { + wxLogWarning(wxT("Locale '%s' not supported by OS."), name.c_str()); + // retloc already set to "C" + } + else + { + int codepage + #ifdef SETLOCALE_FAILS_ON_UNICODE_LANGS + = -1 + #endif + ; + wxUint32 lcid = MAKELCID(MAKELANGID(info->WinLang, info->WinSublang), + SORT_DEFAULT); + // FIXME +#ifndef __WXWINCE__ + SetThreadLocale(lcid); +#endif + // NB: we must translate LCID to CRT's setlocale string ourselves, + // because SetThreadLocale does not modify change the + // interpretation of setlocale(LC_ALL, "") call: + wxChar buffer[256]; + buffer[0] = wxT('\0'); + GetLocaleInfo(lcid, LOCALE_SENGLANGUAGE, buffer, 256); + locale << buffer; + if (GetLocaleInfo(lcid, LOCALE_SENGCOUNTRY, buffer, 256) > 0) + locale << wxT("_") << buffer; + if (GetLocaleInfo(lcid, LOCALE_IDEFAULTANSICODEPAGE, buffer, 256) > 0) + { + codepage = wxAtoi(buffer); + if (codepage != 0) + locale << wxT(".") << buffer; + } + if (locale.empty()) + { + wxLogLastError(wxT("SetThreadLocale")); + wxLogError(wxT("Cannot set locale to language %s."), name.c_str()); + return false; + } + else + { + // FIXME +#ifndef __WXWINCE__ + retloc = wxSetlocale(LC_ALL, locale); +#endif +#ifdef SETLOCALE_FAILS_ON_UNICODE_LANGS + if (codepage == 0 && (const wxChar*)retloc == NULL) + { + retloc = wxT("C"); + } +#endif + } + } + } + else + { + // FIXME +#ifndef __WXWINCE__ + retloc = wxSetlocale(LC_ALL, wxEmptyString); +#else + retloc = NULL; +#endif +#ifdef SETLOCALE_FAILS_ON_UNICODE_LANGS + if ((const wxChar*)retloc == NULL) + { + wxChar buffer[16]; + if (GetLocaleInfo(LOCALE_USER_DEFAULT, + LOCALE_IDEFAULTANSICODEPAGE, buffer, 16) > 0 && + wxStrcmp(buffer, wxT("0")) == 0) + { + retloc = wxT("C"); + } + } +#endif + } + + if ( !retloc ) + { + wxLogError(wxT("Cannot set locale to language %s."), name.c_str()); + return false; + } +#elif defined(__WXMAC__) + if (lang == wxLANGUAGE_DEFAULT) + locale = wxEmptyString; + else + locale = info->CanonicalName; + + wxMB2WXbuf retloc = wxSetlocale(LC_ALL, locale); + + if ( !retloc ) + { + // Some C libraries don't like xx_YY form and require xx only + retloc = wxSetlocale(LC_ALL, locale.Mid(0,2)); + } + if ( !retloc ) + { + wxLogError(wxT("Cannot set locale to '%s'."), locale.c_str()); + return false; + } +#else + wxUnusedVar(flags); + return false; + #define WX_NO_LOCALE_SUPPORT +#endif + +#ifndef WX_NO_LOCALE_SUPPORT + wxChar *szLocale = retloc ? wxStrdup(retloc) : NULL; + bool ret = Init(name, canonical, szLocale, + (flags & wxLOCALE_LOAD_DEFAULT) != 0, + (flags & wxLOCALE_CONV_ENCODING) != 0); + free(szLocale); + + if (IsOk()) // setlocale() succeeded + m_language = lang; + + return ret; +#endif // !WX_NO_LOCALE_SUPPORT +} + + + +void wxLocale::AddCatalogLookupPathPrefix(const wxString& prefix) +{ + if ( gs_searchPrefixes.Index(prefix) == wxNOT_FOUND ) + { + gs_searchPrefixes.Add(prefix); + } + //else: already have it +} + +/*static*/ int wxLocale::GetSystemLanguage() +{ + CreateLanguagesDB(); + + // init i to avoid compiler warning + size_t i = 0, + count = ms_languagesDB->GetCount(); + +#if defined(__UNIX__) && !defined(__WXMAC__) + // first get the string identifying the language from the environment + wxString langFull; + if (!wxGetEnv(wxT("LC_ALL"), &langFull) && + !wxGetEnv(wxT("LC_MESSAGES"), &langFull) && + !wxGetEnv(wxT("LANG"), &langFull)) + { + // no language specified, treat it as English + return wxLANGUAGE_ENGLISH_US; + } + + if ( langFull == _T("C") || langFull == _T("POSIX") ) + { + // default C locale is English too + return wxLANGUAGE_ENGLISH_US; + } + + // the language string has the following form + // + // lang[_LANG][.encoding][@modifier] + // + // (see environ(5) in the Open Unix specification) + // + // where lang is the primary language, LANG is a sublang/territory, + // encoding is the charset to use and modifier "allows the user to select + // a specific instance of localization data within a single category" + // + // for example, the following strings are valid: + // fr + // fr_FR + // de_DE.iso88591 + // de_DE@euro + // de_DE.iso88591@euro + + // for now we don't use the encoding, although we probably should (doing + // translations of the msg catalogs on the fly as required) (TODO) + // + // we don't use the modifiers neither but we probably should translate + // "euro" into iso885915 + size_t posEndLang = langFull.find_first_of(_T("@.")); + if ( posEndLang != wxString::npos ) + { + langFull.Truncate(posEndLang); + } + + // in addition to the format above, we also can have full language names + // in LANG env var - for example, SuSE is known to use LANG="german" - so + // check for this + + // do we have just the language (or sublang too)? + bool justLang = langFull.length() == LEN_LANG; + if ( justLang || + (langFull.length() == LEN_FULL && langFull[LEN_LANG] == wxT('_')) ) + { + // 0. Make sure the lang is according to latest ISO 639 + // (this is necessary because glibc uses iw and in instead + // of he and id respectively). + + // the language itself (second part is the dialect/sublang) + wxString langOrig = ExtractLang(langFull); + + wxString lang; + if ( langOrig == wxT("iw")) + lang = _T("he"); + else if (langOrig == wxT("in")) + lang = wxT("id"); + else if (langOrig == wxT("ji")) + lang = wxT("yi"); + else if (langOrig == wxT("no_NO")) + lang = wxT("nb_NO"); + else if (langOrig == wxT("no_NY")) + lang = wxT("nn_NO"); + else if (langOrig == wxT("no")) + lang = wxT("nb_NO"); + else + lang = langOrig; + + // did we change it? + if ( lang != langOrig ) + { + langFull = lang + ExtractNotLang(langFull); + } + + // 1. Try to find the language either as is: + for ( i = 0; i < count; i++ ) + { + if ( ms_languagesDB->Item(i).CanonicalName == langFull ) + { + break; + } + } + + // 2. If langFull is of the form xx_YY, try to find xx: + if ( i == count && !justLang ) + { + for ( i = 0; i < count; i++ ) + { + if ( ms_languagesDB->Item(i).CanonicalName == lang ) + { + break; + } + } + } + + // 3. If langFull is of the form xx, try to find any xx_YY record: + if ( i == count && justLang ) + { + for ( i = 0; i < count; i++ ) + { + if ( ExtractLang(ms_languagesDB->Item(i).CanonicalName) + == langFull ) + { + break; + } + } + } + } + else // not standard format + { + // try to find the name in verbose description + for ( i = 0; i < count; i++ ) + { + if (ms_languagesDB->Item(i).Description.CmpNoCase(langFull) == 0) + { + break; + } + } + } +#elif defined(__WXMAC__) + const wxChar * lc = NULL ; + long lang = GetScriptVariable( smSystemScript, smScriptLang) ; + switch( GetScriptManagerVariable( smRegionCode ) ) { + case verUS : + lc = wxT("en_US") ; + break ; + case verFrance : + lc = wxT("fr_FR") ; + break ; + case verBritain : + lc = wxT("en_GB") ; + break ; + case verGermany : + lc = wxT("de_DE") ; + break ; + case verItaly : + lc = wxT("it_IT") ; + break ; + case verNetherlands : + lc = wxT("nl_NL") ; + break ; + case verFlemish : + lc = wxT("nl_BE") ; + break ; + case verSweden : + lc = wxT("sv_SE" ); + break ; + case verSpain : + lc = wxT("es_ES" ); + break ; + case verDenmark : + lc = wxT("da_DK") ; + break ; + case verPortugal : + lc = wxT("pt_PT") ; + break ; + case verFrCanada: + lc = wxT("fr_CA") ; + break ; + case verNorway: + lc = wxT("nb_NO") ; + break ; + case verIsrael: + lc = wxT("iw_IL") ; + break ; + case verJapan: + lc = wxT("ja_JP") ; + break ; + case verAustralia: + lc = wxT("en_AU") ; + break ; + case verArabic: + lc = wxT("ar") ; + break ; + case verFinland: + lc = wxT("fi_FI") ; + break ; + case verFrSwiss: + lc = wxT("fr_CH") ; + break ; + case verGrSwiss: + lc = wxT("de_CH") ; + break ; + case verGreece: + lc = wxT("el_GR") ; + break ; + case verIceland: + lc = wxT("is_IS") ; + break ; + case verMalta: + lc = wxT("mt_MT") ; + break ; + case verCyprus: + // _CY is not part of wx, so we have to translate according to the system language + if ( lang == langGreek ) { + lc = wxT("el_GR") ; + } + else if ( lang == langTurkish ) { + lc = wxT("tr_TR") ; + } + break ; + case verTurkey: + lc = wxT("tr_TR") ; + break ; + case verYugoCroatian: + lc = wxT("hr_HR") ; + break ; + case verIndiaHindi: + lc = wxT("hi_IN") ; + break ; + case verPakistanUrdu: + lc = wxT("ur_PK") ; + break ; + case verTurkishModified: + lc = wxT("tr_TR") ; + break ; + case verItalianSwiss: + lc = wxT("it_CH") ; + break ; + case verInternational: + lc = wxT("en") ; + break ; + case verRomania: + lc = wxT("ro_RO") ; + break ; + case verGreecePoly: + lc = wxT("el_GR") ; + break ; + case verLithuania: + lc = wxT("lt_LT") ; + break ; + case verPoland: + lc = wxT("pl_PL") ; + break ; + case verMagyar : + case verHungary: + lc = wxT("hu_HU") ; + break ; + case verEstonia: + lc = wxT("et_EE") ; + break ; + case verLatvia: + lc = wxT("lv_LV") ; + break ; + case verSami: + // not known + break ; + case verFaroeIsl: + lc = wxT("fo_FO") ; + break ; + case verIran: + lc = wxT("fa_IR") ; + break ; + case verRussia: + lc = wxT("ru_RU") ; + break ; + case verIreland: + lc = wxT("ga_IE") ; + break ; + case verKorea: + lc = wxT("ko_KR") ; + break ; + case verChina: + lc = wxT("zh_CN") ; + break ; + case verTaiwan: + lc = wxT("zh_TW") ; + break ; + case verThailand: + lc = wxT("th_TH") ; + break ; + case verCzech: + lc = wxT("cs_CZ") ; + break ; + case verSlovak: + lc = wxT("sk_SK") ; + break ; + case verBengali: + lc = wxT("bn") ; + break ; + case verByeloRussian: + lc = wxT("be_BY") ; + break ; + case verUkraine: + lc = wxT("uk_UA") ; + break ; + case verGreeceAlt: + lc = wxT("el_GR") ; + break ; + case verSerbian: + lc = wxT("sr_YU") ; + break ; + case verSlovenian: + lc = wxT("sl_SI") ; + break ; + case verMacedonian: + lc = wxT("mk_MK") ; + break ; + case verCroatia: + lc = wxT("hr_HR") ; + break ; + case verBrazil: + lc = wxT("pt_BR ") ; + break ; + case verBulgaria: + lc = wxT("bg_BG") ; + break ; + case verCatalonia: + lc = wxT("ca_ES") ; + break ; + case verScottishGaelic: + lc = wxT("gd") ; + break ; + case verManxGaelic: + lc = wxT("gv") ; + break ; + case verBreton: + lc = wxT("br") ; + break ; + case verNunavut: + lc = wxT("iu_CA") ; + break ; + case verWelsh: + lc = wxT("cy") ; + break ; + case verIrishGaelicScript: + lc = wxT("ga_IE") ; + break ; + case verEngCanada: + lc = wxT("en_CA") ; + break ; + case verBhutan: + lc = wxT("dz_BT") ; + break ; + case verArmenian: + lc = wxT("hy_AM") ; + break ; + case verGeorgian: + lc = wxT("ka_GE") ; + break ; + case verSpLatinAmerica: + lc = wxT("es_AR") ; + break ; + case verTonga: + lc = wxT("to_TO" ); + break ; + case verFrenchUniversal: + lc = wxT("fr_FR") ; + break ; + case verAustria: + lc = wxT("de_AT") ; + break ; + case verGujarati: + lc = wxT("gu_IN") ; + break ; + case verPunjabi: + lc = wxT("pa") ; + break ; + case verIndiaUrdu: + lc = wxT("ur_IN") ; + break ; + case verVietnam: + lc = wxT("vi_VN") ; + break ; + case verFrBelgium: + lc = wxT("fr_BE") ; + break ; + case verUzbek: + lc = wxT("uz_UZ") ; + break ; + case verSingapore: + lc = wxT("zh_SG") ; + break ; + case verNynorsk: + lc = wxT("nn_NO") ; + break ; + case verAfrikaans: + lc = wxT("af_ZA") ; + break ; + case verEsperanto: + lc = wxT("eo") ; + break ; + case verMarathi: + lc = wxT("mr_IN") ; + break ; + case verTibetan: + lc = wxT("bo") ; + break ; + case verNepal: + lc = wxT("ne_NP") ; + break ; + case verGreenland: + lc = wxT("kl_GL") ; + break ; + default : + break ; + } + for ( i = 0; i < count; i++ ) + { + if ( ms_languagesDB->Item(i).CanonicalName == lc ) + { + break; + } + } + +#elif defined(__WIN32__) + LCID lcid = GetUserDefaultLCID(); + if ( lcid != 0 ) + { + wxUint32 lang = PRIMARYLANGID(LANGIDFROMLCID(lcid)); + wxUint32 sublang = SUBLANGID(LANGIDFROMLCID(lcid)); + + for ( i = 0; i < count; i++ ) + { + if (ms_languagesDB->Item(i).WinLang == lang && + ms_languagesDB->Item(i).WinSublang == sublang) + { + break; + } + } + } + //else: leave wxlang == wxLANGUAGE_UNKNOWN +#endif // Unix/Win32 + + if ( i < count ) + { + // we did find a matching entry, use it + return ms_languagesDB->Item(i).Language; + } + + // no info about this language in the database + return wxLANGUAGE_UNKNOWN; +} + +// ---------------------------------------------------------------------------- +// encoding stuff +// ---------------------------------------------------------------------------- + +// this is a bit strange as under Windows we get the encoding name using its +// numeric value and under Unix we do it the other way round, but this just +// reflects the way different systems provide the encoding info + +/* static */ +wxString wxLocale::GetSystemEncodingName() +{ + wxString encname; + +#if defined(__WIN32__) && !defined(__WXMICROWIN__) + // FIXME: what is the error return value for GetACP()? + UINT codepage = ::GetACP(); + encname.Printf(_T("windows-%u"), codepage); +#elif defined(__WXMAC__) + // default is just empty string, this resolves to the default system + // encoding later +#elif defined(__UNIX_LIKE__) + +#if defined(HAVE_LANGINFO_H) && defined(CODESET) + // GNU libc provides current character set this way (this conforms + // to Unix98) + char *oldLocale = strdup(setlocale(LC_CTYPE, NULL)); + setlocale(LC_CTYPE, ""); + const char *alang = nl_langinfo(CODESET); + setlocale(LC_CTYPE, oldLocale); + free(oldLocale); + + if ( alang ) + { + encname = wxString::FromAscii( alang ); + } + else // nl_langinfo() failed +#endif // HAVE_LANGINFO_H + { + // if we can't get at the character set directly, try to see if it's in + // the environment variables (in most cases this won't work, but I was + // out of ideas) + char *lang = getenv( "LC_ALL"); + char *dot = lang ? strchr(lang, '.') : (char *)NULL; + if (!dot) + { + lang = getenv( "LC_CTYPE" ); + if ( lang ) + dot = strchr(lang, '.' ); + } + if (!dot) + { + lang = getenv( "LANG"); + if ( lang ) + dot = strchr(lang, '.'); + } + + if ( dot ) + { + encname = wxString::FromAscii( dot+1 ); + } + } +#endif // Win32/Unix + + return encname; +} + +/* static */ +wxFontEncoding wxLocale::GetSystemEncoding() +{ +#if defined(__WIN32__) && !defined(__WXMICROWIN__) + UINT codepage = ::GetACP(); + + // wxWidgets only knows about CP1250-1257, 874, 932, 936, 949, 950 + if ( codepage >= 1250 && codepage <= 1257 ) + { + return (wxFontEncoding)(wxFONTENCODING_CP1250 + codepage - 1250); + } + + if ( codepage == 874 ) + { + return wxFONTENCODING_CP874; + } + + if ( codepage == 932 ) + { + return wxFONTENCODING_CP932; + } + + if ( codepage == 936 ) + { + return wxFONTENCODING_CP936; + } + + if ( codepage == 949 ) + { + return wxFONTENCODING_CP949; + } + + if ( codepage == 950 ) + { + return wxFONTENCODING_CP950; + } +#elif defined(__WXMAC__) + TextEncoding encoding = 0 ; +#if TARGET_CARBON + encoding = CFStringGetSystemEncoding() ; +#else + UpgradeScriptInfoToTextEncoding ( smSystemScript , kTextLanguageDontCare , kTextRegionDontCare , NULL , &encoding ) ; +#endif + return wxMacGetFontEncFromSystemEnc( encoding ) ; +#elif defined(__UNIX_LIKE__) && wxUSE_FONTMAP + const wxString encname = GetSystemEncodingName(); + if ( !encname.empty() ) + { + wxFontEncoding enc = wxFontMapperBase::GetEncodingFromName(encname); + + // on some modern Linux systems (RedHat 8) the default system locale + // is UTF8 -- but it isn't supported by wxGTK1 in ANSI build at all so + // don't even try to use it in this case +#if !wxUSE_UNICODE && \ + ((defined(__WXGTK__) && !defined(__WXGTK20__)) || defined(__WXMOTIF__)) + if ( enc == wxFONTENCODING_UTF8 ) + { + // the most similar supported encoding... + enc = wxFONTENCODING_ISO8859_1; + } +#endif // !wxUSE_UNICODE + + // GetEncodingFromName() returns wxFONTENCODING_DEFAULT for C locale + // (a.k.a. US-ASCII) which is arguably a bug but keep it like this for + // backwards compatibility and just take care to not return + // wxFONTENCODING_DEFAULT from here as this surely doesn't make sense + if ( enc != wxFONTENCODING_MAX && enc != wxFONTENCODING_DEFAULT ) + { + return enc; + } + //else: return wxFONTENCODING_SYSTEM below + } +#endif // Win32/Unix + + return wxFONTENCODING_SYSTEM; +} + +/* static */ +void wxLocale::AddLanguage(const wxLanguageInfo& info) +{ + CreateLanguagesDB(); + ms_languagesDB->Add(info); +} + +/* static */ +const wxLanguageInfo *wxLocale::GetLanguageInfo(int lang) +{ + CreateLanguagesDB(); + + // calling GetLanguageInfo(wxLANGUAGE_DEFAULT) is a natural thing to do, so + // make it work + if ( lang == wxLANGUAGE_DEFAULT ) + lang = GetSystemLanguage(); + + const size_t count = ms_languagesDB->GetCount(); + for ( size_t i = 0; i < count; i++ ) + { + if ( ms_languagesDB->Item(i).Language == lang ) + { + // We need to create a temporary here in order to make this work with BCC in final build mode + wxLanguageInfo *ptr = &ms_languagesDB->Item(i); + return ptr; + } + } + + return NULL; +} + +/* static */ +wxString wxLocale::GetLanguageName(int lang) +{ + const wxLanguageInfo *info = GetLanguageInfo(lang); + if ( !info ) + return wxEmptyString; + else + return info->Description; +} + +/* static */ +const wxLanguageInfo *wxLocale::FindLanguageInfo(const wxString& locale) +{ + CreateLanguagesDB(); + + const wxLanguageInfo *infoRet = NULL; + + const size_t count = ms_languagesDB->GetCount(); + for ( size_t i = 0; i < count; i++ ) + { + const wxLanguageInfo *info = &ms_languagesDB->Item(i); + + if ( wxStricmp(locale, info->CanonicalName) == 0 || + wxStricmp(locale, info->Description) == 0 ) + { + // exact match, stop searching + infoRet = info; + break; + } + + if ( wxStricmp(locale, info->CanonicalName.BeforeFirst(_T('_'))) == 0 ) + { + // a match -- but maybe we'll find an exact one later, so continue + // looking + // + // OTOH, maybe we had already found a language match and in this + // case don't overwrite it becauce the entry for the default + // country always appears first in ms_languagesDB + if ( !infoRet ) + infoRet = info; + } + } + + return infoRet; +} + +wxString wxLocale::GetSysName() const +{ + // FIXME +#ifndef __WXWINCE__ + return wxSetlocale(LC_ALL, NULL); +#else + return wxEmptyString; +#endif +} + +// clean up +wxLocale::~wxLocale() +{ + // free memory + wxMsgCatalog *pTmpCat; + while ( m_pMsgCat != NULL ) { + pTmpCat = m_pMsgCat; + m_pMsgCat = m_pMsgCat->m_pNext; + delete pTmpCat; + } + + // restore old locale pointer + wxSetLocale(m_pOldLocale); + + // FIXME +#ifndef __WXWINCE__ + wxSetlocale(LC_ALL, m_pszOldLocale); +#endif + free((wxChar *)m_pszOldLocale); // const_cast +} + +// get the translation of given string in current locale +const wxChar *wxLocale::GetString(const wxChar *szOrigString, + const wxChar *szDomain) const +{ + return GetString(szOrigString, szOrigString, size_t(-1), szDomain); +} + +const wxChar *wxLocale::GetString(const wxChar *szOrigString, + const wxChar *szOrigString2, + size_t n, + const wxChar *szDomain) const +{ + if ( wxIsEmpty(szOrigString) ) + return wxEmptyString; + + const wxChar *pszTrans = NULL; + wxMsgCatalog *pMsgCat; + + if ( szDomain != NULL && szDomain[0] ) + { + pMsgCat = FindCatalog(szDomain); + + // does the catalog exist? + if ( pMsgCat != NULL ) + pszTrans = pMsgCat->GetString(szOrigString, n); + } + else + { + // search in all domains + for ( pMsgCat = m_pMsgCat; pMsgCat != NULL; pMsgCat = pMsgCat->m_pNext ) + { + pszTrans = pMsgCat->GetString(szOrigString, n); + if ( pszTrans != NULL ) // take the first found + break; + } + } + + if ( pszTrans == NULL ) + { +#ifdef __WXDEBUG__ + if ( !NoTransErr::Suppress() ) + { + NoTransErr noTransErr; + + wxLogTrace(TRACE_I18N, + _T("string \"%s\"[%ld] not found in %slocale '%s'."), + szOrigString, (long)n, + szDomain ? wxString::Format(_T("domain '%s' "), szDomain).c_str() + : _T(""), + m_strLocale.c_str()); + } +#endif // __WXDEBUG__ + + if (n == size_t(-1)) + return szOrigString; + else + return n == 1 ? szOrigString : szOrigString2; + } + + return pszTrans; +} + +wxString wxLocale::GetHeaderValue( const wxChar* szHeader, + const wxChar* szDomain ) const +{ + if ( wxIsEmpty(szHeader) ) + return wxEmptyString; + + wxChar const * pszTrans = NULL; + wxMsgCatalog *pMsgCat; + + if ( szDomain != NULL ) + { + pMsgCat = FindCatalog(szDomain); + + // does the catalog exist? + if ( pMsgCat == NULL ) + return wxEmptyString; + + pszTrans = pMsgCat->GetString(wxEmptyString, (size_t)-1); + } + else + { + // search in all domains + for ( pMsgCat = m_pMsgCat; pMsgCat != NULL; pMsgCat = pMsgCat->m_pNext ) + { + pszTrans = pMsgCat->GetString(wxEmptyString, (size_t)-1); + if ( pszTrans != NULL ) // take the first found + break; + } + } + + if ( wxIsEmpty(pszTrans) ) + return wxEmptyString; + + wxChar const * pszFound = wxStrstr(pszTrans, szHeader); + if ( pszFound == NULL ) + return wxEmptyString; + + pszFound += wxStrlen(szHeader) + 2 /* ': ' */; + + // Every header is separated by \n + + wxChar const * pszEndLine = wxStrchr(pszFound, wxT('\n')); + if ( pszEndLine == NULL ) pszEndLine = pszFound + wxStrlen(pszFound); + + + // wxString( wxChar*, length); + wxString retVal( pszFound, pszEndLine - pszFound ); + + return retVal; +} + + +// find catalog by name in a linked list, return NULL if !found +wxMsgCatalog *wxLocale::FindCatalog(const wxChar *szDomain) const +{ + // linear search in the linked list + wxMsgCatalog *pMsgCat; + for ( pMsgCat = m_pMsgCat; pMsgCat != NULL; pMsgCat = pMsgCat->m_pNext ) + { + if ( wxStricmp(pMsgCat->GetName(), szDomain) == 0 ) + return pMsgCat; + } + + return NULL; +} + +// check if the given locale is provided by OS and C run time +/* static */ +bool wxLocale::IsAvailable(int lang) +{ + const wxLanguageInfo *info = wxLocale::GetLanguageInfo(lang); + wxCHECK_MSG( info, false, _T("invalid language") ); + +#if defined(__WIN32__) + if ( !info->WinLang ) + return false; + + if ( !::IsValidLocale + ( + MAKELCID(MAKELANGID(info->WinLang, info->WinSublang), + SORT_DEFAULT), + LCID_INSTALLED + ) ) + return false; + +#elif defined(__UNIX__) + + // Test if setting the locale works, then set it back. + wxMB2WXbuf oldLocale = wxSetlocale(LC_ALL, wxEmptyString); + wxMB2WXbuf tmp = wxSetlocaleTryUTF(LC_ALL, info->CanonicalName); + if ( !tmp ) + { + // Some C libraries don't like xx_YY form and require xx only + tmp = wxSetlocaleTryUTF(LC_ALL, info->CanonicalName.Left(2)); + if ( !tmp ) + return false; + } + // restore the original locale + wxSetlocale(LC_ALL, oldLocale); +#endif + + return true; +} + +// check if the given catalog is loaded +bool wxLocale::IsLoaded(const wxChar *szDomain) const +{ + return FindCatalog(szDomain) != NULL; +} + +// add a catalog to our linked list +bool wxLocale::AddCatalog(const wxChar *szDomain) +{ + return AddCatalog(szDomain, wxLANGUAGE_ENGLISH_US, NULL); +} + +// add a catalog to our linked list +bool wxLocale::AddCatalog(const wxChar *szDomain, + wxLanguage msgIdLanguage, + const wxChar *msgIdCharset) + +{ + wxMsgCatalog *pMsgCat = new wxMsgCatalog; + + if ( pMsgCat->Load(m_strShort, szDomain, msgIdCharset, m_bConvertEncoding) ) { + // add it to the head of the list so that in GetString it will + // be searched before the catalogs added earlier + pMsgCat->m_pNext = m_pMsgCat; + m_pMsgCat = pMsgCat; + + return true; + } + else { + // don't add it because it couldn't be loaded anyway + delete pMsgCat; + + // It is OK to not load catalog if the msgid language and m_language match, + // in which case we can directly display the texts embedded in program's + // source code: + if (m_language == msgIdLanguage) + return true; + + // If there's no exact match, we may still get partial match where the + // (basic) language is same, but the country differs. For example, it's + // permitted to use en_US strings from sources even if m_language is en_GB: + const wxLanguageInfo *msgIdLangInfo = GetLanguageInfo(msgIdLanguage); + if ( msgIdLangInfo && + msgIdLangInfo->CanonicalName.Mid(0, 2) == m_strShort.Mid(0, 2) ) + { + return true; + } + + return false; + } +} + +// ---------------------------------------------------------------------------- +// accessors for locale-dependent data +// ---------------------------------------------------------------------------- + +#ifdef __WXMSW__ + +/* static */ +wxString wxLocale::GetInfo(wxLocaleInfo index, wxLocaleCategory WXUNUSED(cat)) +{ + wxString str; + wxChar buffer[256]; + size_t count; + buffer[0] = wxT('\0'); + switch (index) + { + case wxLOCALE_DECIMAL_POINT: + count = ::GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, buffer, 256); + if (!count) + str << wxT("."); + else + str << buffer; + break; +#if 0 + case wxSYS_LIST_SEPARATOR: + count = ::GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SLIST, buffer, 256); + if (!count) + str << wxT(","); + else + str << buffer; + break; + case wxSYS_LEADING_ZERO: // 0 means no leading zero, 1 means leading zero + count = ::GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_ILZERO, buffer, 256); + if (!count) + str << wxT("0"); + else + str << buffer; + break; +#endif + default: + wxFAIL_MSG(wxT("Unknown System String !")); + } + return str; +} + +#else // !__WXMSW__ + +/* static */ +wxString wxLocale::GetInfo(wxLocaleInfo index, wxLocaleCategory cat) +{ + struct lconv *locale_info = localeconv(); + switch (cat) + { + case wxLOCALE_CAT_NUMBER: + switch (index) + { + case wxLOCALE_THOUSANDS_SEP: + return wxString(locale_info->thousands_sep, + *wxConvCurrent); + case wxLOCALE_DECIMAL_POINT: + return wxString(locale_info->decimal_point, + *wxConvCurrent); + default: + return wxEmptyString; + } + case wxLOCALE_CAT_MONEY: + switch (index) + { + case wxLOCALE_THOUSANDS_SEP: + return wxString(locale_info->mon_thousands_sep, + *wxConvCurrent); + case wxLOCALE_DECIMAL_POINT: + return wxString(locale_info->mon_decimal_point, + *wxConvCurrent); + default: + return wxEmptyString; + } + default: + return wxEmptyString; + } +} + +#endif // __WXMSW__/!__WXMSW__ + +// ---------------------------------------------------------------------------- +// global functions and variables +// ---------------------------------------------------------------------------- + +// retrieve/change current locale +// ------------------------------ + +// the current locale object +static wxLocale *g_pLocale = NULL; + +wxLocale *wxGetLocale() +{ + return g_pLocale; +} + +wxLocale *wxSetLocale(wxLocale *pLocale) +{ + wxLocale *pOld = g_pLocale; + g_pLocale = pLocale; + return pOld; +} + + + +// ---------------------------------------------------------------------------- +// wxLocale module (for lazy destruction of languagesDB) +// ---------------------------------------------------------------------------- + +class wxLocaleModule: public wxModule +{ + DECLARE_DYNAMIC_CLASS(wxLocaleModule) + public: + wxLocaleModule() {} + bool OnInit() { return true; } + void OnExit() { wxLocale::DestroyLanguagesDB(); } +}; + +IMPLEMENT_DYNAMIC_CLASS(wxLocaleModule, wxModule) + + + +// ---------------------------------------------------------------------------- +// default languages table & initialization +// ---------------------------------------------------------------------------- + + + +// --- --- --- generated code begins here --- --- --- + +// This table is generated by misc/languages/genlang.py +// When making changes, please put them into misc/languages/langtabl.txt + +#if !defined(__WIN32__) || defined(__WXMICROWIN__) + +#define SETWINLANG(info,lang,sublang) + +#else + +#define SETWINLANG(info,lang,sublang) \ + info.WinLang = lang, info.WinSublang = sublang; + +#ifndef LANG_AFRIKAANS +#define LANG_AFRIKAANS (0) +#endif +#ifndef LANG_ALBANIAN +#define LANG_ALBANIAN (0) +#endif +#ifndef LANG_ARABIC +#define LANG_ARABIC (0) +#endif +#ifndef LANG_ARMENIAN +#define LANG_ARMENIAN (0) +#endif +#ifndef LANG_ASSAMESE +#define LANG_ASSAMESE (0) +#endif +#ifndef LANG_AZERI +#define LANG_AZERI (0) +#endif +#ifndef LANG_BASQUE +#define LANG_BASQUE (0) +#endif +#ifndef LANG_BELARUSIAN +#define LANG_BELARUSIAN (0) +#endif +#ifndef LANG_BENGALI +#define LANG_BENGALI (0) +#endif +#ifndef LANG_BULGARIAN +#define LANG_BULGARIAN (0) +#endif +#ifndef LANG_CATALAN +#define LANG_CATALAN (0) +#endif +#ifndef LANG_CHINESE +#define LANG_CHINESE (0) +#endif +#ifndef LANG_CROATIAN +#define LANG_CROATIAN (0) +#endif +#ifndef LANG_CZECH +#define LANG_CZECH (0) +#endif +#ifndef LANG_DANISH +#define LANG_DANISH (0) +#endif +#ifndef LANG_DUTCH +#define LANG_DUTCH (0) +#endif +#ifndef LANG_ENGLISH +#define LANG_ENGLISH (0) +#endif +#ifndef LANG_ESTONIAN +#define LANG_ESTONIAN (0) +#endif +#ifndef LANG_FAEROESE +#define LANG_FAEROESE (0) +#endif +#ifndef LANG_FARSI +#define LANG_FARSI (0) +#endif +#ifndef LANG_FINNISH +#define LANG_FINNISH (0) +#endif +#ifndef LANG_FRENCH +#define LANG_FRENCH (0) +#endif +#ifndef LANG_GEORGIAN +#define LANG_GEORGIAN (0) +#endif +#ifndef LANG_GERMAN +#define LANG_GERMAN (0) +#endif +#ifndef LANG_GREEK +#define LANG_GREEK (0) +#endif +#ifndef LANG_GUJARATI +#define LANG_GUJARATI (0) +#endif +#ifndef LANG_HEBREW +#define LANG_HEBREW (0) +#endif +#ifndef LANG_HINDI +#define LANG_HINDI (0) +#endif +#ifndef LANG_HUNGARIAN +#define LANG_HUNGARIAN (0) +#endif +#ifndef LANG_ICELANDIC +#define LANG_ICELANDIC (0) +#endif +#ifndef LANG_INDONESIAN +#define LANG_INDONESIAN (0) +#endif +#ifndef LANG_ITALIAN +#define LANG_ITALIAN (0) +#endif +#ifndef LANG_JAPANESE +#define LANG_JAPANESE (0) +#endif +#ifndef LANG_KANNADA +#define LANG_KANNADA (0) +#endif +#ifndef LANG_KASHMIRI +#define LANG_KASHMIRI (0) +#endif +#ifndef LANG_KAZAK +#define LANG_KAZAK (0) +#endif +#ifndef LANG_KONKANI +#define LANG_KONKANI (0) +#endif +#ifndef LANG_KOREAN +#define LANG_KOREAN (0) +#endif +#ifndef LANG_LATVIAN +#define LANG_LATVIAN (0) +#endif +#ifndef LANG_LITHUANIAN +#define LANG_LITHUANIAN (0) +#endif +#ifndef LANG_MACEDONIAN +#define LANG_MACEDONIAN (0) +#endif +#ifndef LANG_MALAY +#define LANG_MALAY (0) +#endif +#ifndef LANG_MALAYALAM +#define LANG_MALAYALAM (0) +#endif +#ifndef LANG_MANIPURI +#define LANG_MANIPURI (0) +#endif +#ifndef LANG_MARATHI +#define LANG_MARATHI (0) +#endif +#ifndef LANG_NEPALI +#define LANG_NEPALI (0) +#endif +#ifndef LANG_NORWEGIAN +#define LANG_NORWEGIAN (0) +#endif +#ifndef LANG_ORIYA +#define LANG_ORIYA (0) +#endif +#ifndef LANG_POLISH +#define LANG_POLISH (0) +#endif +#ifndef LANG_PORTUGUESE +#define LANG_PORTUGUESE (0) +#endif +#ifndef LANG_PUNJABI +#define LANG_PUNJABI (0) +#endif +#ifndef LANG_ROMANIAN +#define LANG_ROMANIAN (0) +#endif +#ifndef LANG_RUSSIAN +#define LANG_RUSSIAN (0) +#endif +#ifndef LANG_SANSKRIT +#define LANG_SANSKRIT (0) +#endif +#ifndef LANG_SERBIAN +#define LANG_SERBIAN (0) +#endif +#ifndef LANG_SINDHI +#define LANG_SINDHI (0) +#endif +#ifndef LANG_SLOVAK +#define LANG_SLOVAK (0) +#endif +#ifndef LANG_SLOVENIAN +#define LANG_SLOVENIAN (0) +#endif +#ifndef LANG_SPANISH +#define LANG_SPANISH (0) +#endif +#ifndef LANG_SWAHILI +#define LANG_SWAHILI (0) +#endif +#ifndef LANG_SWEDISH +#define LANG_SWEDISH (0) +#endif +#ifndef LANG_TAMIL +#define LANG_TAMIL (0) +#endif +#ifndef LANG_TATAR +#define LANG_TATAR (0) +#endif +#ifndef LANG_TELUGU +#define LANG_TELUGU (0) +#endif +#ifndef LANG_THAI +#define LANG_THAI (0) +#endif +#ifndef LANG_TURKISH +#define LANG_TURKISH (0) +#endif +#ifndef LANG_UKRAINIAN +#define LANG_UKRAINIAN (0) +#endif +#ifndef LANG_URDU +#define LANG_URDU (0) +#endif +#ifndef LANG_UZBEK +#define LANG_UZBEK (0) +#endif +#ifndef LANG_VIETNAMESE +#define LANG_VIETNAMESE (0) +#endif +#ifndef SUBLANG_ARABIC_ALGERIA +#define SUBLANG_ARABIC_ALGERIA SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_ARABIC_BAHRAIN +#define SUBLANG_ARABIC_BAHRAIN SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_ARABIC_EGYPT +#define SUBLANG_ARABIC_EGYPT SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_ARABIC_IRAQ +#define SUBLANG_ARABIC_IRAQ SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_ARABIC_JORDAN +#define SUBLANG_ARABIC_JORDAN SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_ARABIC_KUWAIT +#define SUBLANG_ARABIC_KUWAIT SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_ARABIC_LEBANON +#define SUBLANG_ARABIC_LEBANON SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_ARABIC_LIBYA +#define SUBLANG_ARABIC_LIBYA SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_ARABIC_MOROCCO +#define SUBLANG_ARABIC_MOROCCO SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_ARABIC_OMAN +#define SUBLANG_ARABIC_OMAN SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_ARABIC_QATAR +#define SUBLANG_ARABIC_QATAR SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_ARABIC_SAUDI_ARABIA +#define SUBLANG_ARABIC_SAUDI_ARABIA SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_ARABIC_SYRIA +#define SUBLANG_ARABIC_SYRIA SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_ARABIC_TUNISIA +#define SUBLANG_ARABIC_TUNISIA SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_ARABIC_UAE +#define SUBLANG_ARABIC_UAE SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_ARABIC_YEMEN +#define SUBLANG_ARABIC_YEMEN SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_AZERI_CYRILLIC +#define SUBLANG_AZERI_CYRILLIC SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_AZERI_LATIN +#define SUBLANG_AZERI_LATIN SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_CHINESE_SIMPLIFIED +#define SUBLANG_CHINESE_SIMPLIFIED SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_CHINESE_TRADITIONAL +#define SUBLANG_CHINESE_TRADITIONAL SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_CHINESE_HONGKONG +#define SUBLANG_CHINESE_HONGKONG SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_CHINESE_MACAU +#define SUBLANG_CHINESE_MACAU SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_CHINESE_SINGAPORE +#define SUBLANG_CHINESE_SINGAPORE SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_DUTCH +#define SUBLANG_DUTCH SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_DUTCH_BELGIAN +#define SUBLANG_DUTCH_BELGIAN SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_ENGLISH_UK +#define SUBLANG_ENGLISH_UK SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_ENGLISH_US +#define SUBLANG_ENGLISH_US SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_ENGLISH_AUS +#define SUBLANG_ENGLISH_AUS SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_ENGLISH_BELIZE +#define SUBLANG_ENGLISH_BELIZE SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_ENGLISH_CAN +#define SUBLANG_ENGLISH_CAN SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_ENGLISH_CARIBBEAN +#define SUBLANG_ENGLISH_CARIBBEAN SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_ENGLISH_EIRE +#define SUBLANG_ENGLISH_EIRE SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_ENGLISH_JAMAICA +#define SUBLANG_ENGLISH_JAMAICA SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_ENGLISH_NZ +#define SUBLANG_ENGLISH_NZ SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_ENGLISH_PHILIPPINES +#define SUBLANG_ENGLISH_PHILIPPINES SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_ENGLISH_SOUTH_AFRICA +#define SUBLANG_ENGLISH_SOUTH_AFRICA SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_ENGLISH_TRINIDAD +#define SUBLANG_ENGLISH_TRINIDAD SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_ENGLISH_ZIMBABWE +#define SUBLANG_ENGLISH_ZIMBABWE SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_FRENCH +#define SUBLANG_FRENCH SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_FRENCH_BELGIAN +#define SUBLANG_FRENCH_BELGIAN SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_FRENCH_CANADIAN +#define SUBLANG_FRENCH_CANADIAN SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_FRENCH_LUXEMBOURG +#define SUBLANG_FRENCH_LUXEMBOURG SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_FRENCH_MONACO +#define SUBLANG_FRENCH_MONACO SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_FRENCH_SWISS +#define SUBLANG_FRENCH_SWISS SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_GERMAN +#define SUBLANG_GERMAN SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_GERMAN_AUSTRIAN +#define SUBLANG_GERMAN_AUSTRIAN SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_GERMAN_LIECHTENSTEIN +#define SUBLANG_GERMAN_LIECHTENSTEIN SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_GERMAN_LUXEMBOURG +#define SUBLANG_GERMAN_LUXEMBOURG SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_GERMAN_SWISS +#define SUBLANG_GERMAN_SWISS SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_ITALIAN +#define SUBLANG_ITALIAN SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_ITALIAN_SWISS +#define SUBLANG_ITALIAN_SWISS SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_KASHMIRI_INDIA +#define SUBLANG_KASHMIRI_INDIA SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_KOREAN +#define SUBLANG_KOREAN SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_LITHUANIAN +#define SUBLANG_LITHUANIAN SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_MALAY_BRUNEI_DARUSSALAM +#define SUBLANG_MALAY_BRUNEI_DARUSSALAM SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_MALAY_MALAYSIA +#define SUBLANG_MALAY_MALAYSIA SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_NEPALI_INDIA +#define SUBLANG_NEPALI_INDIA SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_NORWEGIAN_BOKMAL +#define SUBLANG_NORWEGIAN_BOKMAL SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_NORWEGIAN_NYNORSK +#define SUBLANG_NORWEGIAN_NYNORSK SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_PORTUGUESE +#define SUBLANG_PORTUGUESE SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_PORTUGUESE_BRAZILIAN +#define SUBLANG_PORTUGUESE_BRAZILIAN SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_SERBIAN_CYRILLIC +#define SUBLANG_SERBIAN_CYRILLIC SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_SERBIAN_LATIN +#define SUBLANG_SERBIAN_LATIN SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_SPANISH +#define SUBLANG_SPANISH SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_SPANISH_ARGENTINA +#define SUBLANG_SPANISH_ARGENTINA SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_SPANISH_BOLIVIA +#define SUBLANG_SPANISH_BOLIVIA SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_SPANISH_CHILE +#define SUBLANG_SPANISH_CHILE SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_SPANISH_COLOMBIA +#define SUBLANG_SPANISH_COLOMBIA SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_SPANISH_COSTA_RICA +#define SUBLANG_SPANISH_COSTA_RICA SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_SPANISH_DOMINICAN_REPUBLIC +#define SUBLANG_SPANISH_DOMINICAN_REPUBLIC SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_SPANISH_ECUADOR +#define SUBLANG_SPANISH_ECUADOR SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_SPANISH_EL_SALVADOR +#define SUBLANG_SPANISH_EL_SALVADOR SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_SPANISH_GUATEMALA +#define SUBLANG_SPANISH_GUATEMALA SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_SPANISH_HONDURAS +#define SUBLANG_SPANISH_HONDURAS SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_SPANISH_MEXICAN +#define SUBLANG_SPANISH_MEXICAN SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_SPANISH_MODERN +#define SUBLANG_SPANISH_MODERN SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_SPANISH_NICARAGUA +#define SUBLANG_SPANISH_NICARAGUA SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_SPANISH_PANAMA +#define SUBLANG_SPANISH_PANAMA SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_SPANISH_PARAGUAY +#define SUBLANG_SPANISH_PARAGUAY SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_SPANISH_PERU +#define SUBLANG_SPANISH_PERU SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_SPANISH_PUERTO_RICO +#define SUBLANG_SPANISH_PUERTO_RICO SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_SPANISH_URUGUAY +#define SUBLANG_SPANISH_URUGUAY SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_SPANISH_VENEZUELA +#define SUBLANG_SPANISH_VENEZUELA SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_SWEDISH +#define SUBLANG_SWEDISH SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_SWEDISH_FINLAND +#define SUBLANG_SWEDISH_FINLAND SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_URDU_INDIA +#define SUBLANG_URDU_INDIA SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_URDU_PAKISTAN +#define SUBLANG_URDU_PAKISTAN SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_UZBEK_CYRILLIC +#define SUBLANG_UZBEK_CYRILLIC SUBLANG_DEFAULT +#endif +#ifndef SUBLANG_UZBEK_LATIN +#define SUBLANG_UZBEK_LATIN SUBLANG_DEFAULT +#endif + + +#endif // __WIN32__ + +#define LNG(wxlang, canonical, winlang, winsublang, layout, desc) \ + info.Language = wxlang; \ + info.CanonicalName = wxT(canonical); \ + info.LayoutDirection = layout; \ + info.Description = wxT(desc); \ + SETWINLANG(info, winlang, winsublang) \ + AddLanguage(info); + +void wxLocale::InitLanguagesDB() +{ + wxLanguageInfo info; + wxStringTokenizer tkn; + + LNG(wxLANGUAGE_ABKHAZIAN, "ab" , 0 , 0 , wxLayout_LeftToRight, "Abkhazian") + LNG(wxLANGUAGE_AFAR, "aa" , 0 , 0 , wxLayout_LeftToRight, "Afar") + LNG(wxLANGUAGE_AFRIKAANS, "af_ZA", LANG_AFRIKAANS , SUBLANG_DEFAULT , wxLayout_LeftToRight, "Afrikaans") + LNG(wxLANGUAGE_ALBANIAN, "sq_AL", LANG_ALBANIAN , SUBLANG_DEFAULT , wxLayout_LeftToRight, "Albanian") + LNG(wxLANGUAGE_AMHARIC, "am" , 0 , 0 , wxLayout_LeftToRight, "Amharic") + LNG(wxLANGUAGE_ARABIC, "ar" , LANG_ARABIC , SUBLANG_DEFAULT , wxLayout_RightToLeft, "Arabic") + LNG(wxLANGUAGE_ARABIC_ALGERIA, "ar_DZ", LANG_ARABIC , SUBLANG_ARABIC_ALGERIA , wxLayout_RightToLeft, "Arabic (Algeria)") + LNG(wxLANGUAGE_ARABIC_BAHRAIN, "ar_BH", LANG_ARABIC , SUBLANG_ARABIC_BAHRAIN , wxLayout_RightToLeft, "Arabic (Bahrain)") + LNG(wxLANGUAGE_ARABIC_EGYPT, "ar_EG", LANG_ARABIC , SUBLANG_ARABIC_EGYPT , wxLayout_RightToLeft, "Arabic (Egypt)") + LNG(wxLANGUAGE_ARABIC_IRAQ, "ar_IQ", LANG_ARABIC , SUBLANG_ARABIC_IRAQ , wxLayout_RightToLeft, "Arabic (Iraq)") + LNG(wxLANGUAGE_ARABIC_JORDAN, "ar_JO", LANG_ARABIC , SUBLANG_ARABIC_JORDAN , wxLayout_RightToLeft, "Arabic (Jordan)") + LNG(wxLANGUAGE_ARABIC_KUWAIT, "ar_KW", LANG_ARABIC , SUBLANG_ARABIC_KUWAIT , wxLayout_RightToLeft, "Arabic (Kuwait)") + LNG(wxLANGUAGE_ARABIC_LEBANON, "ar_LB", LANG_ARABIC , SUBLANG_ARABIC_LEBANON , wxLayout_RightToLeft, "Arabic (Lebanon)") + LNG(wxLANGUAGE_ARABIC_LIBYA, "ar_LY", LANG_ARABIC , SUBLANG_ARABIC_LIBYA , wxLayout_RightToLeft, "Arabic (Libya)") + LNG(wxLANGUAGE_ARABIC_MOROCCO, "ar_MA", LANG_ARABIC , SUBLANG_ARABIC_MOROCCO , wxLayout_RightToLeft, "Arabic (Morocco)") + LNG(wxLANGUAGE_ARABIC_OMAN, "ar_OM", LANG_ARABIC , SUBLANG_ARABIC_OMAN , wxLayout_RightToLeft, "Arabic (Oman)") + LNG(wxLANGUAGE_ARABIC_QATAR, "ar_QA", LANG_ARABIC , SUBLANG_ARABIC_QATAR , wxLayout_RightToLeft, "Arabic (Qatar)") + LNG(wxLANGUAGE_ARABIC_SAUDI_ARABIA, "ar_SA", LANG_ARABIC , SUBLANG_ARABIC_SAUDI_ARABIA , wxLayout_RightToLeft, "Arabic (Saudi Arabia)") + LNG(wxLANGUAGE_ARABIC_SUDAN, "ar_SD", 0 , 0 , wxLayout_RightToLeft, "Arabic (Sudan)") + LNG(wxLANGUAGE_ARABIC_SYRIA, "ar_SY", LANG_ARABIC , SUBLANG_ARABIC_SYRIA , wxLayout_RightToLeft, "Arabic (Syria)") + LNG(wxLANGUAGE_ARABIC_TUNISIA, "ar_TN", LANG_ARABIC , SUBLANG_ARABIC_TUNISIA , wxLayout_RightToLeft, "Arabic (Tunisia)") + LNG(wxLANGUAGE_ARABIC_UAE, "ar_AE", LANG_ARABIC , SUBLANG_ARABIC_UAE , wxLayout_RightToLeft, "Arabic (Uae)") + LNG(wxLANGUAGE_ARABIC_YEMEN, "ar_YE", LANG_ARABIC , SUBLANG_ARABIC_YEMEN , wxLayout_RightToLeft, "Arabic (Yemen)") + LNG(wxLANGUAGE_ARMENIAN, "hy" , LANG_ARMENIAN , SUBLANG_DEFAULT , wxLayout_LeftToRight, "Armenian") + LNG(wxLANGUAGE_ASSAMESE, "as" , LANG_ASSAMESE , SUBLANG_DEFAULT , wxLayout_LeftToRight, "Assamese") + LNG(wxLANGUAGE_AYMARA, "ay" , 0 , 0 , wxLayout_LeftToRight, "Aymara") + LNG(wxLANGUAGE_AZERI, "az" , LANG_AZERI , SUBLANG_DEFAULT , wxLayout_LeftToRight, "Azeri") + LNG(wxLANGUAGE_AZERI_CYRILLIC, "az" , LANG_AZERI , SUBLANG_AZERI_CYRILLIC , wxLayout_LeftToRight, "Azeri (Cyrillic)") + LNG(wxLANGUAGE_AZERI_LATIN, "az" , LANG_AZERI , SUBLANG_AZERI_LATIN , wxLayout_LeftToRight, "Azeri (Latin)") + LNG(wxLANGUAGE_BASHKIR, "ba" , 0 , 0 , wxLayout_LeftToRight, "Bashkir") + LNG(wxLANGUAGE_BASQUE, "eu_ES", LANG_BASQUE , SUBLANG_DEFAULT , wxLayout_LeftToRight, "Basque") + LNG(wxLANGUAGE_BELARUSIAN, "be_BY", LANG_BELARUSIAN, SUBLANG_DEFAULT , wxLayout_LeftToRight, "Belarusian") + LNG(wxLANGUAGE_BENGALI, "bn" , LANG_BENGALI , SUBLANG_DEFAULT , wxLayout_LeftToRight, "Bengali") + LNG(wxLANGUAGE_BHUTANI, "dz" , 0 , 0 , wxLayout_LeftToRight, "Bhutani") + LNG(wxLANGUAGE_BIHARI, "bh" , 0 , 0 , wxLayout_LeftToRight, "Bihari") + LNG(wxLANGUAGE_BISLAMA, "bi" , 0 , 0 , wxLayout_LeftToRight, "Bislama") + LNG(wxLANGUAGE_BRETON, "br" , 0 , 0 , wxLayout_LeftToRight, "Breton") + LNG(wxLANGUAGE_BULGARIAN, "bg_BG", LANG_BULGARIAN , SUBLANG_DEFAULT , wxLayout_LeftToRight, "Bulgarian") + LNG(wxLANGUAGE_BURMESE, "my" , 0 , 0 , wxLayout_LeftToRight, "Burmese") + LNG(wxLANGUAGE_CAMBODIAN, "km" , 0 , 0 , wxLayout_LeftToRight, "Cambodian") + LNG(wxLANGUAGE_CATALAN, "ca_ES", LANG_CATALAN , SUBLANG_DEFAULT , wxLayout_LeftToRight, "Catalan") + LNG(wxLANGUAGE_CHINESE, "zh_TW", LANG_CHINESE , SUBLANG_DEFAULT , wxLayout_LeftToRight, "Chinese") + LNG(wxLANGUAGE_CHINESE_SIMPLIFIED, "zh_CN", LANG_CHINESE , SUBLANG_CHINESE_SIMPLIFIED , wxLayout_LeftToRight, "Chinese (Simplified)") + LNG(wxLANGUAGE_CHINESE_TRADITIONAL, "zh_TW", LANG_CHINESE , SUBLANG_CHINESE_TRADITIONAL , wxLayout_LeftToRight, "Chinese (Traditional)") + LNG(wxLANGUAGE_CHINESE_HONGKONG, "zh_HK", LANG_CHINESE , SUBLANG_CHINESE_HONGKONG , wxLayout_LeftToRight, "Chinese (Hongkong)") + LNG(wxLANGUAGE_CHINESE_MACAU, "zh_MO", LANG_CHINESE , SUBLANG_CHINESE_MACAU , wxLayout_LeftToRight, "Chinese (Macau)") + LNG(wxLANGUAGE_CHINESE_SINGAPORE, "zh_SG", LANG_CHINESE , SUBLANG_CHINESE_SINGAPORE , wxLayout_LeftToRight, "Chinese (Singapore)") + LNG(wxLANGUAGE_CHINESE_TAIWAN, "zh_TW", LANG_CHINESE , SUBLANG_CHINESE_TRADITIONAL , wxLayout_LeftToRight, "Chinese (Taiwan)") + LNG(wxLANGUAGE_CORSICAN, "co" , 0 , 0 , wxLayout_LeftToRight, "Corsican") + LNG(wxLANGUAGE_CROATIAN, "hr_HR", LANG_CROATIAN , SUBLANG_DEFAULT , wxLayout_LeftToRight, "Croatian") + LNG(wxLANGUAGE_CZECH, "cs_CZ", LANG_CZECH , SUBLANG_DEFAULT , wxLayout_LeftToRight, "Czech") + LNG(wxLANGUAGE_DANISH, "da_DK", LANG_DANISH , SUBLANG_DEFAULT , wxLayout_LeftToRight, "Danish") + LNG(wxLANGUAGE_DUTCH, "nl_NL", LANG_DUTCH , SUBLANG_DUTCH , wxLayout_LeftToRight, "Dutch") + LNG(wxLANGUAGE_DUTCH_BELGIAN, "nl_BE", LANG_DUTCH , SUBLANG_DUTCH_BELGIAN , wxLayout_LeftToRight, "Dutch (Belgian)") + LNG(wxLANGUAGE_ENGLISH, "en_GB", LANG_ENGLISH , SUBLANG_ENGLISH_UK , wxLayout_LeftToRight, "English") + LNG(wxLANGUAGE_ENGLISH_UK, "en_GB", LANG_ENGLISH , SUBLANG_ENGLISH_UK , wxLayout_LeftToRight, "English (U.K.)") + LNG(wxLANGUAGE_ENGLISH_US, "en_US", LANG_ENGLISH , SUBLANG_ENGLISH_US , wxLayout_LeftToRight, "English (U.S.)") + LNG(wxLANGUAGE_ENGLISH_AUSTRALIA, "en_AU", LANG_ENGLISH , SUBLANG_ENGLISH_AUS , wxLayout_LeftToRight, "English (Australia)") + LNG(wxLANGUAGE_ENGLISH_BELIZE, "en_BZ", LANG_ENGLISH , SUBLANG_ENGLISH_BELIZE , wxLayout_LeftToRight, "English (Belize)") + LNG(wxLANGUAGE_ENGLISH_BOTSWANA, "en_BW", 0 , 0 , wxLayout_LeftToRight, "English (Botswana)") + LNG(wxLANGUAGE_ENGLISH_CANADA, "en_CA", LANG_ENGLISH , SUBLANG_ENGLISH_CAN , wxLayout_LeftToRight, "English (Canada)") + LNG(wxLANGUAGE_ENGLISH_CARIBBEAN, "en_CB", LANG_ENGLISH , SUBLANG_ENGLISH_CARIBBEAN , wxLayout_LeftToRight, "English (Caribbean)") + LNG(wxLANGUAGE_ENGLISH_DENMARK, "en_DK", 0 , 0 , wxLayout_LeftToRight, "English (Denmark)") + LNG(wxLANGUAGE_ENGLISH_EIRE, "en_IE", LANG_ENGLISH , SUBLANG_ENGLISH_EIRE , wxLayout_LeftToRight, "English (Eire)") + LNG(wxLANGUAGE_ENGLISH_JAMAICA, "en_JM", LANG_ENGLISH , SUBLANG_ENGLISH_JAMAICA , wxLayout_LeftToRight, "English (Jamaica)") + LNG(wxLANGUAGE_ENGLISH_NEW_ZEALAND, "en_NZ", LANG_ENGLISH , SUBLANG_ENGLISH_NZ , wxLayout_LeftToRight, "English (New Zealand)") + LNG(wxLANGUAGE_ENGLISH_PHILIPPINES, "en_PH", LANG_ENGLISH , SUBLANG_ENGLISH_PHILIPPINES , wxLayout_LeftToRight, "English (Philippines)") + LNG(wxLANGUAGE_ENGLISH_SOUTH_AFRICA, "en_ZA", LANG_ENGLISH , SUBLANG_ENGLISH_SOUTH_AFRICA , wxLayout_LeftToRight, "English (South Africa)") + LNG(wxLANGUAGE_ENGLISH_TRINIDAD, "en_TT", LANG_ENGLISH , SUBLANG_ENGLISH_TRINIDAD , wxLayout_LeftToRight, "English (Trinidad)") + LNG(wxLANGUAGE_ENGLISH_ZIMBABWE, "en_ZW", LANG_ENGLISH , SUBLANG_ENGLISH_ZIMBABWE , wxLayout_LeftToRight, "English (Zimbabwe)") + LNG(wxLANGUAGE_ESPERANTO, "eo" , 0 , 0 , wxLayout_LeftToRight, "Esperanto") + LNG(wxLANGUAGE_ESTONIAN, "et_EE", LANG_ESTONIAN , SUBLANG_DEFAULT , wxLayout_LeftToRight, "Estonian") + LNG(wxLANGUAGE_FAEROESE, "fo_FO", LANG_FAEROESE , SUBLANG_DEFAULT , wxLayout_LeftToRight, "Faeroese") + LNG(wxLANGUAGE_FARSI, "fa_IR", LANG_FARSI , SUBLANG_DEFAULT , wxLayout_LeftToRight, "Farsi") + LNG(wxLANGUAGE_FIJI, "fj" , 0 , 0 , wxLayout_LeftToRight, "Fiji") + LNG(wxLANGUAGE_FINNISH, "fi_FI", LANG_FINNISH , SUBLANG_DEFAULT , wxLayout_LeftToRight, "Finnish") + LNG(wxLANGUAGE_FRENCH, "fr_FR", LANG_FRENCH , SUBLANG_FRENCH , wxLayout_LeftToRight, "French") + LNG(wxLANGUAGE_FRENCH_BELGIAN, "fr_BE", LANG_FRENCH , SUBLANG_FRENCH_BELGIAN , wxLayout_LeftToRight, "French (Belgian)") + LNG(wxLANGUAGE_FRENCH_CANADIAN, "fr_CA", LANG_FRENCH , SUBLANG_FRENCH_CANADIAN , wxLayout_LeftToRight, "French (Canadian)") + LNG(wxLANGUAGE_FRENCH_LUXEMBOURG, "fr_LU", LANG_FRENCH , SUBLANG_FRENCH_LUXEMBOURG , wxLayout_LeftToRight, "French (Luxembourg)") + LNG(wxLANGUAGE_FRENCH_MONACO, "fr_MC", LANG_FRENCH , SUBLANG_FRENCH_MONACO , wxLayout_LeftToRight, "French (Monaco)") + LNG(wxLANGUAGE_FRENCH_SWISS, "fr_CH", LANG_FRENCH , SUBLANG_FRENCH_SWISS , wxLayout_LeftToRight, "French (Swiss)") + LNG(wxLANGUAGE_FRISIAN, "fy" , 0 , 0 , wxLayout_LeftToRight, "Frisian") + LNG(wxLANGUAGE_GALICIAN, "gl_ES", 0 , 0 , wxLayout_LeftToRight, "Galician") + LNG(wxLANGUAGE_GEORGIAN, "ka" , LANG_GEORGIAN , SUBLANG_DEFAULT , wxLayout_LeftToRight, "Georgian") + LNG(wxLANGUAGE_GERMAN, "de_DE", LANG_GERMAN , SUBLANG_GERMAN , wxLayout_LeftToRight, "German") + LNG(wxLANGUAGE_GERMAN_AUSTRIAN, "de_AT", LANG_GERMAN , SUBLANG_GERMAN_AUSTRIAN , wxLayout_LeftToRight, "German (Austrian)") + LNG(wxLANGUAGE_GERMAN_BELGIUM, "de_BE", 0 , 0 , wxLayout_LeftToRight, "German (Belgium)") + LNG(wxLANGUAGE_GERMAN_LIECHTENSTEIN, "de_LI", LANG_GERMAN , SUBLANG_GERMAN_LIECHTENSTEIN , wxLayout_LeftToRight, "German (Liechtenstein)") + LNG(wxLANGUAGE_GERMAN_LUXEMBOURG, "de_LU", LANG_GERMAN , SUBLANG_GERMAN_LUXEMBOURG , wxLayout_LeftToRight, "German (Luxembourg)") + LNG(wxLANGUAGE_GERMAN_SWISS, "de_CH", LANG_GERMAN , SUBLANG_GERMAN_SWISS , wxLayout_LeftToRight, "German (Swiss)") + LNG(wxLANGUAGE_GREEK, "el_GR", LANG_GREEK , SUBLANG_DEFAULT , wxLayout_LeftToRight, "Greek") + LNG(wxLANGUAGE_GREENLANDIC, "kl_GL", 0 , 0 , wxLayout_LeftToRight, "Greenlandic") + LNG(wxLANGUAGE_GUARANI, "gn" , 0 , 0 , wxLayout_LeftToRight, "Guarani") + LNG(wxLANGUAGE_GUJARATI, "gu" , LANG_GUJARATI , SUBLANG_DEFAULT , wxLayout_LeftToRight, "Gujarati") + LNG(wxLANGUAGE_HAUSA, "ha" , 0 , 0 , wxLayout_LeftToRight, "Hausa") + LNG(wxLANGUAGE_HEBREW, "he_IL", LANG_HEBREW , SUBLANG_DEFAULT , wxLayout_RightToLeft, "Hebrew") + LNG(wxLANGUAGE_HINDI, "hi_IN", LANG_HINDI , SUBLANG_DEFAULT , wxLayout_LeftToRight, "Hindi") + LNG(wxLANGUAGE_HUNGARIAN, "hu_HU", LANG_HUNGARIAN , SUBLANG_DEFAULT , wxLayout_LeftToRight, "Hungarian") + LNG(wxLANGUAGE_ICELANDIC, "is_IS", LANG_ICELANDIC , SUBLANG_DEFAULT , wxLayout_LeftToRight, "Icelandic") + LNG(wxLANGUAGE_INDONESIAN, "id_ID", LANG_INDONESIAN, SUBLANG_DEFAULT , wxLayout_LeftToRight, "Indonesian") + LNG(wxLANGUAGE_INTERLINGUA, "ia" , 0 , 0 , wxLayout_LeftToRight, "Interlingua") + LNG(wxLANGUAGE_INTERLINGUE, "ie" , 0 , 0 , wxLayout_LeftToRight, "Interlingue") + LNG(wxLANGUAGE_INUKTITUT, "iu" , 0 , 0 , wxLayout_LeftToRight, "Inuktitut") + LNG(wxLANGUAGE_INUPIAK, "ik" , 0 , 0 , wxLayout_LeftToRight, "Inupiak") + LNG(wxLANGUAGE_IRISH, "ga_IE", 0 , 0 , wxLayout_LeftToRight, "Irish") + LNG(wxLANGUAGE_ITALIAN, "it_IT", LANG_ITALIAN , SUBLANG_ITALIAN , wxLayout_LeftToRight, "Italian") + LNG(wxLANGUAGE_ITALIAN_SWISS, "it_CH", LANG_ITALIAN , SUBLANG_ITALIAN_SWISS , wxLayout_LeftToRight, "Italian (Swiss)") + LNG(wxLANGUAGE_JAPANESE, "ja_JP", LANG_JAPANESE , SUBLANG_DEFAULT , wxLayout_LeftToRight, "Japanese") + LNG(wxLANGUAGE_JAVANESE, "jw" , 0 , 0 , wxLayout_LeftToRight, "Javanese") + LNG(wxLANGUAGE_KANNADA, "kn" , LANG_KANNADA , SUBLANG_DEFAULT , wxLayout_LeftToRight, "Kannada") + LNG(wxLANGUAGE_KASHMIRI, "ks" , LANG_KASHMIRI , SUBLANG_DEFAULT , wxLayout_LeftToRight, "Kashmiri") + LNG(wxLANGUAGE_KASHMIRI_INDIA, "ks_IN", LANG_KASHMIRI , SUBLANG_KASHMIRI_INDIA , wxLayout_LeftToRight, "Kashmiri (India)") + LNG(wxLANGUAGE_KAZAKH, "kk" , LANG_KAZAK , SUBLANG_DEFAULT , wxLayout_LeftToRight, "Kazakh") + LNG(wxLANGUAGE_KERNEWEK, "kw_GB", 0 , 0 , wxLayout_LeftToRight, "Kernewek") + LNG(wxLANGUAGE_KINYARWANDA, "rw" , 0 , 0 , wxLayout_LeftToRight, "Kinyarwanda") + LNG(wxLANGUAGE_KIRGHIZ, "ky" , 0 , 0 , wxLayout_LeftToRight, "Kirghiz") + LNG(wxLANGUAGE_KIRUNDI, "rn" , 0 , 0 , wxLayout_LeftToRight, "Kirundi") + LNG(wxLANGUAGE_KONKANI, "" , LANG_KONKANI , SUBLANG_DEFAULT , wxLayout_LeftToRight, "Konkani") + LNG(wxLANGUAGE_KOREAN, "ko_KR", LANG_KOREAN , SUBLANG_KOREAN , wxLayout_LeftToRight, "Korean") + LNG(wxLANGUAGE_KURDISH, "ku" , 0 , 0 , wxLayout_LeftToRight, "Kurdish") + LNG(wxLANGUAGE_LAOTHIAN, "lo" , 0 , 0 , wxLayout_LeftToRight, "Laothian") + LNG(wxLANGUAGE_LATIN, "la" , 0 , 0 , wxLayout_LeftToRight, "Latin") + LNG(wxLANGUAGE_LATVIAN, "lv_LV", LANG_LATVIAN , SUBLANG_DEFAULT , wxLayout_LeftToRight, "Latvian") + LNG(wxLANGUAGE_LINGALA, "ln" , 0 , 0 , wxLayout_LeftToRight, "Lingala") + LNG(wxLANGUAGE_LITHUANIAN, "lt_LT", LANG_LITHUANIAN, SUBLANG_LITHUANIAN , wxLayout_LeftToRight, "Lithuanian") + LNG(wxLANGUAGE_MACEDONIAN, "mk_MK", LANG_MACEDONIAN, SUBLANG_DEFAULT , wxLayout_LeftToRight, "Macedonian") + LNG(wxLANGUAGE_MALAGASY, "mg" , 0 , 0 , wxLayout_LeftToRight, "Malagasy") + LNG(wxLANGUAGE_MALAY, "ms_MY", LANG_MALAY , SUBLANG_DEFAULT , wxLayout_LeftToRight, "Malay") + LNG(wxLANGUAGE_MALAYALAM, "ml" , LANG_MALAYALAM , SUBLANG_DEFAULT , wxLayout_LeftToRight, "Malayalam") + LNG(wxLANGUAGE_MALAY_BRUNEI_DARUSSALAM, "ms_BN", LANG_MALAY , SUBLANG_MALAY_BRUNEI_DARUSSALAM , wxLayout_LeftToRight, "Malay (Brunei Darussalam)") + LNG(wxLANGUAGE_MALAY_MALAYSIA, "ms_MY", LANG_MALAY , SUBLANG_MALAY_MALAYSIA , wxLayout_LeftToRight, "Malay (Malaysia)") + LNG(wxLANGUAGE_MALTESE, "mt_MT", 0 , 0 , wxLayout_LeftToRight, "Maltese") + LNG(wxLANGUAGE_MANIPURI, "" , LANG_MANIPURI , SUBLANG_DEFAULT , wxLayout_LeftToRight, "Manipuri") + LNG(wxLANGUAGE_MAORI, "mi" , 0 , 0 , wxLayout_LeftToRight, "Maori") + LNG(wxLANGUAGE_MARATHI, "mr_IN", LANG_MARATHI , SUBLANG_DEFAULT , wxLayout_LeftToRight, "Marathi") + LNG(wxLANGUAGE_MOLDAVIAN, "mo" , 0 , 0 , wxLayout_LeftToRight, "Moldavian") + LNG(wxLANGUAGE_MONGOLIAN, "mn" , 0 , 0 , wxLayout_LeftToRight, "Mongolian") + LNG(wxLANGUAGE_NAURU, "na" , 0 , 0 , wxLayout_LeftToRight, "Nauru") + LNG(wxLANGUAGE_NEPALI, "ne" , LANG_NEPALI , SUBLANG_DEFAULT , wxLayout_LeftToRight, "Nepali") + LNG(wxLANGUAGE_NEPALI_INDIA, "ne_IN", LANG_NEPALI , SUBLANG_NEPALI_INDIA , wxLayout_LeftToRight, "Nepali (India)") + LNG(wxLANGUAGE_NORWEGIAN_BOKMAL, "nb_NO", LANG_NORWEGIAN , SUBLANG_NORWEGIAN_BOKMAL , wxLayout_LeftToRight, "Norwegian (Bokmal)") + LNG(wxLANGUAGE_NORWEGIAN_NYNORSK, "nn_NO", LANG_NORWEGIAN , SUBLANG_NORWEGIAN_NYNORSK , wxLayout_LeftToRight, "Norwegian (Nynorsk)") + LNG(wxLANGUAGE_OCCITAN, "oc" , 0 , 0 , wxLayout_LeftToRight, "Occitan") + LNG(wxLANGUAGE_ORIYA, "or" , LANG_ORIYA , SUBLANG_DEFAULT , wxLayout_LeftToRight, "Oriya") + LNG(wxLANGUAGE_OROMO, "om" , 0 , 0 , wxLayout_LeftToRight, "(Afan) Oromo") + LNG(wxLANGUAGE_PASHTO, "ps" , 0 , 0 , wxLayout_LeftToRight, "Pashto, Pushto") + LNG(wxLANGUAGE_POLISH, "pl_PL", LANG_POLISH , SUBLANG_DEFAULT , wxLayout_LeftToRight, "Polish") + LNG(wxLANGUAGE_PORTUGUESE, "pt_PT", LANG_PORTUGUESE, SUBLANG_PORTUGUESE , wxLayout_LeftToRight, "Portuguese") + LNG(wxLANGUAGE_PORTUGUESE_BRAZILIAN, "pt_BR", LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN , wxLayout_LeftToRight, "Portuguese (Brazilian)") + LNG(wxLANGUAGE_PUNJABI, "pa" , LANG_PUNJABI , SUBLANG_DEFAULT , wxLayout_LeftToRight, "Punjabi") + LNG(wxLANGUAGE_QUECHUA, "qu" , 0 , 0 , wxLayout_LeftToRight, "Quechua") + LNG(wxLANGUAGE_RHAETO_ROMANCE, "rm" , 0 , 0 , wxLayout_LeftToRight, "Rhaeto-Romance") + LNG(wxLANGUAGE_ROMANIAN, "ro_RO", LANG_ROMANIAN , SUBLANG_DEFAULT , wxLayout_LeftToRight, "Romanian") + LNG(wxLANGUAGE_RUSSIAN, "ru_RU", LANG_RUSSIAN , SUBLANG_DEFAULT , wxLayout_LeftToRight, "Russian") + LNG(wxLANGUAGE_RUSSIAN_UKRAINE, "ru_UA", 0 , 0 , wxLayout_LeftToRight, "Russian (Ukraine)") + LNG(wxLANGUAGE_SAMOAN, "sm" , 0 , 0 , wxLayout_LeftToRight, "Samoan") + LNG(wxLANGUAGE_SANGHO, "sg" , 0 , 0 , wxLayout_LeftToRight, "Sangho") + LNG(wxLANGUAGE_SANSKRIT, "sa" , LANG_SANSKRIT , SUBLANG_DEFAULT , wxLayout_LeftToRight, "Sanskrit") + LNG(wxLANGUAGE_SCOTS_GAELIC, "gd" , 0 , 0 , wxLayout_LeftToRight, "Scots Gaelic") + LNG(wxLANGUAGE_SERBIAN_CYRILLIC, "sr_YU", LANG_SERBIAN , SUBLANG_SERBIAN_CYRILLIC , wxLayout_LeftToRight, "Serbian (Cyrillic)") + LNG(wxLANGUAGE_SERBIAN_LATIN, "sr_YU", LANG_SERBIAN , SUBLANG_SERBIAN_LATIN , wxLayout_LeftToRight, "Serbian (Latin)") + LNG(wxLANGUAGE_SERBO_CROATIAN, "sh" , 0 , 0 , wxLayout_LeftToRight, "Serbo-Croatian") + LNG(wxLANGUAGE_SESOTHO, "st" , 0 , 0 , wxLayout_LeftToRight, "Sesotho") + LNG(wxLANGUAGE_SETSWANA, "tn" , 0 , 0 , wxLayout_LeftToRight, "Setswana") + LNG(wxLANGUAGE_SHONA, "sn" , 0 , 0 , wxLayout_LeftToRight, "Shona") + LNG(wxLANGUAGE_SINDHI, "sd" , LANG_SINDHI , SUBLANG_DEFAULT , wxLayout_LeftToRight, "Sindhi") + LNG(wxLANGUAGE_SINHALESE, "si" , 0 , 0 , wxLayout_LeftToRight, "Sinhalese") + LNG(wxLANGUAGE_SISWATI, "ss" , 0 , 0 , wxLayout_LeftToRight, "Siswati") + LNG(wxLANGUAGE_SLOVAK, "sk_SK", LANG_SLOVAK , SUBLANG_DEFAULT , wxLayout_LeftToRight, "Slovak") + LNG(wxLANGUAGE_SLOVENIAN, "sl_SI", LANG_SLOVENIAN , SUBLANG_DEFAULT , wxLayout_LeftToRight, "Slovenian") + LNG(wxLANGUAGE_SOMALI, "so" , 0 , 0 , wxLayout_LeftToRight, "Somali") + LNG(wxLANGUAGE_SPANISH, "es_ES", LANG_SPANISH , SUBLANG_SPANISH , wxLayout_LeftToRight, "Spanish") + LNG(wxLANGUAGE_SPANISH_ARGENTINA, "es_AR", LANG_SPANISH , SUBLANG_SPANISH_ARGENTINA , wxLayout_LeftToRight, "Spanish (Argentina)") + LNG(wxLANGUAGE_SPANISH_BOLIVIA, "es_BO", LANG_SPANISH , SUBLANG_SPANISH_BOLIVIA , wxLayout_LeftToRight, "Spanish (Bolivia)") + LNG(wxLANGUAGE_SPANISH_CHILE, "es_CL", LANG_SPANISH , SUBLANG_SPANISH_CHILE , wxLayout_LeftToRight, "Spanish (Chile)") + LNG(wxLANGUAGE_SPANISH_COLOMBIA, "es_CO", LANG_SPANISH , SUBLANG_SPANISH_COLOMBIA , wxLayout_LeftToRight, "Spanish (Colombia)") + LNG(wxLANGUAGE_SPANISH_COSTA_RICA, "es_CR", LANG_SPANISH , SUBLANG_SPANISH_COSTA_RICA , wxLayout_LeftToRight, "Spanish (Costa Rica)") + LNG(wxLANGUAGE_SPANISH_DOMINICAN_REPUBLIC, "es_DO", LANG_SPANISH , SUBLANG_SPANISH_DOMINICAN_REPUBLIC, wxLayout_LeftToRight, "Spanish (Dominican republic)") + LNG(wxLANGUAGE_SPANISH_ECUADOR, "es_EC", LANG_SPANISH , SUBLANG_SPANISH_ECUADOR , wxLayout_LeftToRight, "Spanish (Ecuador)") + LNG(wxLANGUAGE_SPANISH_EL_SALVADOR, "es_SV", LANG_SPANISH , SUBLANG_SPANISH_EL_SALVADOR , wxLayout_LeftToRight, "Spanish (El Salvador)") + LNG(wxLANGUAGE_SPANISH_GUATEMALA, "es_GT", LANG_SPANISH , SUBLANG_SPANISH_GUATEMALA , wxLayout_LeftToRight, "Spanish (Guatemala)") + LNG(wxLANGUAGE_SPANISH_HONDURAS, "es_HN", LANG_SPANISH , SUBLANG_SPANISH_HONDURAS , wxLayout_LeftToRight, "Spanish (Honduras)") + LNG(wxLANGUAGE_SPANISH_MEXICAN, "es_MX", LANG_SPANISH , SUBLANG_SPANISH_MEXICAN , wxLayout_LeftToRight, "Spanish (Mexican)") + LNG(wxLANGUAGE_SPANISH_MODERN, "es_ES", LANG_SPANISH , SUBLANG_SPANISH_MODERN , wxLayout_LeftToRight, "Spanish (Modern)") + LNG(wxLANGUAGE_SPANISH_NICARAGUA, "es_NI", LANG_SPANISH , SUBLANG_SPANISH_NICARAGUA , wxLayout_LeftToRight, "Spanish (Nicaragua)") + LNG(wxLANGUAGE_SPANISH_PANAMA, "es_PA", LANG_SPANISH , SUBLANG_SPANISH_PANAMA , wxLayout_LeftToRight, "Spanish (Panama)") + LNG(wxLANGUAGE_SPANISH_PARAGUAY, "es_PY", LANG_SPANISH , SUBLANG_SPANISH_PARAGUAY , wxLayout_LeftToRight, "Spanish (Paraguay)") + LNG(wxLANGUAGE_SPANISH_PERU, "es_PE", LANG_SPANISH , SUBLANG_SPANISH_PERU , wxLayout_LeftToRight, "Spanish (Peru)") + LNG(wxLANGUAGE_SPANISH_PUERTO_RICO, "es_PR", LANG_SPANISH , SUBLANG_SPANISH_PUERTO_RICO , wxLayout_LeftToRight, "Spanish (Puerto Rico)") + LNG(wxLANGUAGE_SPANISH_URUGUAY, "es_UY", LANG_SPANISH , SUBLANG_SPANISH_URUGUAY , wxLayout_LeftToRight, "Spanish (Uruguay)") + LNG(wxLANGUAGE_SPANISH_US, "es_US", 0 , 0 , wxLayout_LeftToRight, "Spanish (U.S.)") + LNG(wxLANGUAGE_SPANISH_VENEZUELA, "es_VE", LANG_SPANISH , SUBLANG_SPANISH_VENEZUELA , wxLayout_LeftToRight, "Spanish (Venezuela)") + LNG(wxLANGUAGE_SUNDANESE, "su" , 0 , 0 , wxLayout_LeftToRight, "Sundanese") + LNG(wxLANGUAGE_SWAHILI, "sw_KE", LANG_SWAHILI , SUBLANG_DEFAULT , wxLayout_LeftToRight, "Swahili") + LNG(wxLANGUAGE_SWEDISH, "sv_SE", LANG_SWEDISH , SUBLANG_SWEDISH , wxLayout_LeftToRight, "Swedish") + LNG(wxLANGUAGE_SWEDISH_FINLAND, "sv_FI", LANG_SWEDISH , SUBLANG_SWEDISH_FINLAND , wxLayout_LeftToRight, "Swedish (Finland)") + LNG(wxLANGUAGE_TAGALOG, "tl_PH", 0 , 0 , wxLayout_LeftToRight, "Tagalog") + LNG(wxLANGUAGE_TAJIK, "tg" , 0 , 0 , wxLayout_LeftToRight, "Tajik") + LNG(wxLANGUAGE_TAMIL, "ta" , LANG_TAMIL , SUBLANG_DEFAULT , wxLayout_LeftToRight, "Tamil") + LNG(wxLANGUAGE_TATAR, "tt" , LANG_TATAR , SUBLANG_DEFAULT , wxLayout_LeftToRight, "Tatar") + LNG(wxLANGUAGE_TELUGU, "te" , LANG_TELUGU , SUBLANG_DEFAULT , wxLayout_LeftToRight, "Telugu") + LNG(wxLANGUAGE_THAI, "th_TH", LANG_THAI , SUBLANG_DEFAULT , wxLayout_LeftToRight, "Thai") + LNG(wxLANGUAGE_TIBETAN, "bo" , 0 , 0 , wxLayout_LeftToRight, "Tibetan") + LNG(wxLANGUAGE_TIGRINYA, "ti" , 0 , 0 , wxLayout_LeftToRight, "Tigrinya") + LNG(wxLANGUAGE_TONGA, "to" , 0 , 0 , wxLayout_LeftToRight, "Tonga") + LNG(wxLANGUAGE_TSONGA, "ts" , 0 , 0 , wxLayout_LeftToRight, "Tsonga") + LNG(wxLANGUAGE_TURKISH, "tr_TR", LANG_TURKISH , SUBLANG_DEFAULT , wxLayout_LeftToRight, "Turkish") + LNG(wxLANGUAGE_TURKMEN, "tk" , 0 , 0 , wxLayout_LeftToRight, "Turkmen") + LNG(wxLANGUAGE_TWI, "tw" , 0 , 0 , wxLayout_LeftToRight, "Twi") + LNG(wxLANGUAGE_UIGHUR, "ug" , 0 , 0 , wxLayout_LeftToRight, "Uighur") + LNG(wxLANGUAGE_UKRAINIAN, "uk_UA", LANG_UKRAINIAN , SUBLANG_DEFAULT , wxLayout_LeftToRight, "Ukrainian") + LNG(wxLANGUAGE_URDU, "ur" , LANG_URDU , SUBLANG_DEFAULT , wxLayout_LeftToRight, "Urdu") + LNG(wxLANGUAGE_URDU_INDIA, "ur_IN", LANG_URDU , SUBLANG_URDU_INDIA , wxLayout_LeftToRight, "Urdu (India)") + LNG(wxLANGUAGE_URDU_PAKISTAN, "ur_PK", LANG_URDU , SUBLANG_URDU_PAKISTAN , wxLayout_LeftToRight, "Urdu (Pakistan)") + LNG(wxLANGUAGE_UZBEK, "uz" , LANG_UZBEK , SUBLANG_DEFAULT , wxLayout_LeftToRight, "Uzbek") + LNG(wxLANGUAGE_UZBEK_CYRILLIC, "uz" , LANG_UZBEK , SUBLANG_UZBEK_CYRILLIC , wxLayout_LeftToRight, "Uzbek (Cyrillic)") + LNG(wxLANGUAGE_UZBEK_LATIN, "uz" , LANG_UZBEK , SUBLANG_UZBEK_LATIN , wxLayout_LeftToRight, "Uzbek (Latin)") + LNG(wxLANGUAGE_VIETNAMESE, "vi_VN", LANG_VIETNAMESE, SUBLANG_DEFAULT , wxLayout_LeftToRight, "Vietnamese") + LNG(wxLANGUAGE_VOLAPUK, "vo" , 0 , 0 , wxLayout_LeftToRight, "Volapuk") + LNG(wxLANGUAGE_WELSH, "cy" , 0 , 0 , wxLayout_LeftToRight, "Welsh") + LNG(wxLANGUAGE_WOLOF, "wo" , 0 , 0 , wxLayout_LeftToRight, "Wolof") + LNG(wxLANGUAGE_XHOSA, "xh" , 0 , 0 , wxLayout_LeftToRight, "Xhosa") + LNG(wxLANGUAGE_YIDDISH, "yi" , 0 , 0 , wxLayout_LeftToRight, "Yiddish") + LNG(wxLANGUAGE_YORUBA, "yo" , 0 , 0 , wxLayout_LeftToRight, "Yoruba") + LNG(wxLANGUAGE_ZHUANG, "za" , 0 , 0 , wxLayout_LeftToRight, "Zhuang") + LNG(wxLANGUAGE_ZULU, "zu" , 0 , 0 , wxLayout_LeftToRight, "Zulu") +} +#undef LNG + +// --- --- --- generated code ends here --- --- --- + +#endif // wxUSE_INTL diff --git a/Externals/wxWidgets/src/common/ipcbase.cpp b/Externals/wxWidgets/src/common/ipcbase.cpp new file mode 100644 index 0000000000..212ed50945 --- /dev/null +++ b/Externals/wxWidgets/src/common/ipcbase.cpp @@ -0,0 +1,88 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/ipcbase.cpp +// Purpose: IPC base classes +// Author: Julian Smart +// Modified by: +// Created: 04/01/98 +// RCS-ID: $Id: ipcbase.cpp 38787 2006-04-18 07:24:35Z ABX $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#ifndef WX_PRECOMP +#endif + +#include "wx/ipcbase.h" + +IMPLEMENT_CLASS(wxServerBase, wxObject) +IMPLEMENT_CLASS(wxClientBase, wxObject) +IMPLEMENT_CLASS(wxConnectionBase, wxObject) + +wxConnectionBase::wxConnectionBase(wxChar *buffer, int bytes) + : m_connected(true), + m_buffer(buffer), + m_buffersize(bytes), + m_deletebufferwhendone(false) +{ + if ( buffer == (wxChar *)NULL ) + { // behave like next constructor + m_buffersize = 0; + m_deletebufferwhendone = true; + } +} + +wxConnectionBase::wxConnectionBase() + : m_connected(true), + m_buffer(NULL), + m_buffersize(0), + m_deletebufferwhendone(true) +{ +} + +wxConnectionBase::wxConnectionBase(const wxConnectionBase& copy) + : wxObject(), + m_connected(copy.m_connected), + m_buffer(copy.m_buffer), + m_buffersize(copy.m_buffersize), + m_deletebufferwhendone(false) + +{ + // copy constructor would require ref-counted pointer to buffer + wxFAIL_MSG( _T("Copy constructor of wxConnectionBase not implemented") ); +} + + +wxConnectionBase::~wxConnectionBase(void) +{ + if ( m_deletebufferwhendone && m_buffer ) + delete m_buffer; +} + +wxChar *wxConnectionBase::GetBufferAtLeast( size_t bytes ) +{ + if ( m_buffersize >= bytes ) + return m_buffer; + else + { // need to resize buffer + if ( m_deletebufferwhendone ) + { // we're in charge of buffer, increase it + if ( m_buffer ) + delete m_buffer; + // the argument specifies **byte size**, but m_buffer is of type + // wxChar. Under unicode: sizeof(wxChar) > 1, so the buffer size is + // bytes / sizeof(wxChar) rounded upwards. + m_buffer = new wxChar[(bytes + sizeof(wxChar) - 1) / sizeof(wxChar)]; + m_buffersize = bytes; + return m_buffer; + } // user-supplied buffer, fail + else + return NULL; + } +} diff --git a/Externals/wxWidgets/src/common/layout.cpp b/Externals/wxWidgets/src/common/layout.cpp new file mode 100644 index 0000000000..9df71dce75 --- /dev/null +++ b/Externals/wxWidgets/src/common/layout.cpp @@ -0,0 +1,1026 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/layout.cpp +// Purpose: Constraint layout system classes +// Author: Julian Smart +// Modified by: +// Created: 04/01/98 +// RCS-ID: $Id: layout.cpp 39627 2006-06-08 06:57:39Z ABX $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================= +// declarations +// ============================================================================= + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_CONSTRAINTS + +#include "wx/layout.h" + +#ifndef WX_PRECOMP + #include "wx/window.h" + #include "wx/utils.h" + #include "wx/dialog.h" + #include "wx/msgdlg.h" + #include "wx/intl.h" +#endif + + +IMPLEMENT_DYNAMIC_CLASS(wxIndividualLayoutConstraint, wxObject) +IMPLEMENT_DYNAMIC_CLASS(wxLayoutConstraints, wxObject) + + +inline void wxGetAsIs(wxWindowBase* win, int* w, int* h) +{ +#if 1 + // The old way. Works for me. + win->GetSize(w, h); +#endif + +#if 0 + // Vadim's change. Breaks wxPython's LayoutAnchors + win->GetBestSize(w, h); +#endif + +#if 0 + // Proposed compromise. Doesn't work. + int sw, sh, bw, bh; + win->GetSize(&sw, &sh); + win->GetBestSize(&bw, &bh); + if (w) + *w = wxMax(sw, bw); + if (h) + *h = wxMax(sh, bh); +#endif +} + + +wxIndividualLayoutConstraint::wxIndividualLayoutConstraint() +{ + myEdge = wxTop; + relationship = wxUnconstrained; + margin = 0; + value = 0; + percent = 0; + otherEdge = wxTop; + done = false; + otherWin = (wxWindowBase *) NULL; +} + +void wxIndividualLayoutConstraint::Set(wxRelationship rel, wxWindowBase *otherW, wxEdge otherE, int val, int marg) +{ + if (rel == wxSameAs) + { + // If Set is called by the user with wxSameAs then call SameAs to do + // it since it will actually use wxPercent instead. + SameAs(otherW, otherE, marg); + return; + } + + relationship = rel; + otherWin = otherW; + otherEdge = otherE; + + if ( rel == wxPercentOf ) + { + percent = val; + } + else + { + value = val; + } + + margin = marg; +} + +void wxIndividualLayoutConstraint::LeftOf(wxWindowBase *sibling, int marg) +{ + Set(wxLeftOf, sibling, wxLeft, 0, marg); +} + +void wxIndividualLayoutConstraint::RightOf(wxWindowBase *sibling, int marg) +{ + Set(wxRightOf, sibling, wxRight, 0, marg); +} + +void wxIndividualLayoutConstraint::Above(wxWindowBase *sibling, int marg) +{ + Set(wxAbove, sibling, wxTop, 0, marg); +} + +void wxIndividualLayoutConstraint::Below(wxWindowBase *sibling, int marg) +{ + Set(wxBelow, sibling, wxBottom, 0, marg); +} + +// +// 'Same edge' alignment +// +void wxIndividualLayoutConstraint::SameAs(wxWindowBase *otherW, wxEdge edge, int marg) +{ + Set(wxPercentOf, otherW, edge, 100, marg); +} + +// The edge is a percentage of the other window's edge +void wxIndividualLayoutConstraint::PercentOf(wxWindowBase *otherW, wxEdge wh, int per) +{ + Set(wxPercentOf, otherW, wh, per); +} + +// +// Edge has absolute value +// +void wxIndividualLayoutConstraint::Absolute(int val) +{ + value = val; + relationship = wxAbsolute; +} + +// Reset constraint if it mentions otherWin +bool wxIndividualLayoutConstraint::ResetIfWin(wxWindowBase *otherW) +{ + if (otherW == otherWin) + { + myEdge = wxTop; + relationship = wxAsIs; + margin = 0; + value = 0; + percent = 0; + otherEdge = wxTop; + otherWin = (wxWindowBase *) NULL; + return true; + } + + return false; +} + +// Try to satisfy constraint +bool wxIndividualLayoutConstraint::SatisfyConstraint(wxLayoutConstraints *constraints, wxWindowBase *win) +{ + if (relationship == wxAbsolute) + { + done = true; + return true; + } + + switch (myEdge) + { + case wxLeft: + { + switch (relationship) + { + case wxLeftOf: + { + // We can know this edge if: otherWin is win's + // parent, or otherWin has a satisfied constraint, + // or otherWin has no constraint. + int edgePos = GetEdge(otherEdge, win, otherWin); + if (edgePos != -1) + { + value = edgePos - margin; + done = true; + return true; + } + else + return false; + } + case wxRightOf: + { + int edgePos = GetEdge(otherEdge, win, otherWin); + if (edgePos != -1) + { + value = edgePos + margin; + done = true; + return true; + } + else + return false; + } + case wxPercentOf: + { + int edgePos = GetEdge(otherEdge, win, otherWin); + if (edgePos != -1) + { + value = (int)(edgePos*(((float)percent)*0.01) + margin); + done = true; + return true; + } + else + return false; + } + case wxUnconstrained: + { + // We know the left-hand edge position if we know + // the right-hand edge and we know the width; OR if + // we know the centre and the width. + if (constraints->right.GetDone() && constraints->width.GetDone()) + { + value = (constraints->right.GetValue() - constraints->width.GetValue() + margin); + done = true; + return true; + } + else if (constraints->centreX.GetDone() && constraints->width.GetDone()) + { + value = (int)(constraints->centreX.GetValue() - (constraints->width.GetValue()/2) + margin); + done = true; + return true; + } + else + return false; + } + case wxAsIs: + { + int y; + win->GetPosition(&value, &y); + done = true; + return true; + } + default: + break; + } + break; + } + case wxRight: + { + switch (relationship) + { + case wxLeftOf: + { + // We can know this edge if: otherWin is win's + // parent, or otherWin has a satisfied constraint, + // or otherWin has no constraint. + int edgePos = GetEdge(otherEdge, win, otherWin); + if (edgePos != -1) + { + value = edgePos - margin; + done = true; + return true; + } + else + return false; + } + case wxRightOf: + { + int edgePos = GetEdge(otherEdge, win, otherWin); + if (edgePos != -1) + { + value = edgePos + margin; + done = true; + return true; + } + else + return false; + } + case wxPercentOf: + { + int edgePos = GetEdge(otherEdge, win, otherWin); + if (edgePos != -1) + { + value = (int)(edgePos*(((float)percent)*0.01) - margin); + done = true; + return true; + } + else + return false; + } + case wxUnconstrained: + { + // We know the right-hand edge position if we know the + // left-hand edge and we know the width, OR if we know the + // centre edge and the width. + if (constraints->left.GetDone() && constraints->width.GetDone()) + { + value = (constraints->left.GetValue() + constraints->width.GetValue() - margin); + done = true; + return true; + } + else if (constraints->centreX.GetDone() && constraints->width.GetDone()) + { + value = (int)(constraints->centreX.GetValue() + (constraints->width.GetValue()/2) - margin); + done = true; + return true; + } + else + return false; + } + case wxAsIs: + { + int x, y; + int w, h; + wxGetAsIs(win, &w, &h); + win->GetPosition(&x, &y); + value = x + w; + done = true; + return true; + } + default: + break; + } + break; + } + case wxTop: + { + switch (relationship) + { + case wxAbove: + { + // We can know this edge if: otherWin is win's + // parent, or otherWin has a satisfied constraint, + // or otherWin has no constraint. + int edgePos = GetEdge(otherEdge, win, otherWin); + if (edgePos != -1) + { + value = edgePos - margin; + done = true; + return true; + } + else + return false; + } + case wxBelow: + { + int edgePos = GetEdge(otherEdge, win, otherWin); + if (edgePos != -1) + { + value = edgePos + margin; + done = true; + return true; + } + else + return false; + } + case wxPercentOf: + { + int edgePos = GetEdge(otherEdge, win, otherWin); + if (edgePos != -1) + { + value = (int)(edgePos*(((float)percent)*0.01) + margin); + done = true; + return true; + } + else + return false; + } + case wxUnconstrained: + { + // We know the top edge position if we know the bottom edge + // and we know the height; OR if we know the centre edge and + // the height. + if (constraints->bottom.GetDone() && constraints->height.GetDone()) + { + value = (constraints->bottom.GetValue() - constraints->height.GetValue() + margin); + done = true; + return true; + } + else if (constraints->centreY.GetDone() && constraints->height.GetDone()) + { + value = (constraints->centreY.GetValue() - (constraints->height.GetValue()/2) + margin); + done = true; + return true; + } + else + return false; + } + case wxAsIs: + { + int x; + win->GetPosition(&x, &value); + done = true; + return true; + } + default: + break; + } + break; + } + case wxBottom: + { + switch (relationship) + { + case wxAbove: + { + // We can know this edge if: otherWin is win's parent, + // or otherWin has a satisfied constraint, or + // otherWin has no constraint. + int edgePos = GetEdge(otherEdge, win, otherWin); + if (edgePos != -1) + { + value = edgePos + margin; + done = true; + return true; + } + else + return false; + } + case wxBelow: + { + int edgePos = GetEdge(otherEdge, win, otherWin); + if (edgePos != -1) + { + value = edgePos - margin; + done = true; + return true; + } + else + return false; + } + case wxPercentOf: + { + int edgePos = GetEdge(otherEdge, win, otherWin); + if (edgePos != -1) + { + value = (int)(edgePos*(((float)percent)*0.01) - margin); + done = true; + return true; + } + else + return false; + } + case wxUnconstrained: + { + // We know the bottom edge position if we know the top edge + // and we know the height; OR if we know the centre edge and + // the height. + if (constraints->top.GetDone() && constraints->height.GetDone()) + { + value = (constraints->top.GetValue() + constraints->height.GetValue() - margin); + done = true; + return true; + } + else if (constraints->centreY.GetDone() && constraints->height.GetDone()) + { + value = (constraints->centreY.GetValue() + (constraints->height.GetValue()/2) - margin); + done = true; + return true; + } + else + return false; + } + case wxAsIs: + { + int x, y; + int w, h; + wxGetAsIs(win, &w, &h); + win->GetPosition(&x, &y); + value = h + y; + done = true; + return true; + } + default: + break; + } + break; + } + case wxCentreX: + { + switch (relationship) + { + case wxLeftOf: + { + // We can know this edge if: otherWin is win's parent, or + // otherWin has a satisfied constraint, or otherWin has no + // constraint. + int edgePos = GetEdge(otherEdge, win, otherWin); + if (edgePos != -1) + { + value = edgePos - margin; + done = true; + return true; + } + else + return false; + } + case wxRightOf: + { + int edgePos = GetEdge(otherEdge, win, otherWin); + if (edgePos != -1) + { + value = edgePos + margin; + done = true; + return true; + } + else + return false; + } + case wxPercentOf: + { + int edgePos = GetEdge(otherEdge, win, otherWin); + if (edgePos != -1) + { + value = (int)(edgePos*(((float)percent)*0.01) + margin); + done = true; + return true; + } + else + return false; + } + case wxUnconstrained: + { + // We know the centre position if we know + // the left-hand edge and we know the width, OR + // the right-hand edge and the width + if (constraints->left.GetDone() && constraints->width.GetDone()) + { + value = (int)(constraints->left.GetValue() + (constraints->width.GetValue()/2) + margin); + done = true; + return true; + } + else if (constraints->right.GetDone() && constraints->width.GetDone()) + { + value = (int)(constraints->left.GetValue() - (constraints->width.GetValue()/2) + margin); + done = true; + return true; + } + else + return false; + } + default: + break; + } + break; + } + case wxCentreY: + { + switch (relationship) + { + case wxAbove: + { + // We can know this edge if: otherWin is win's parent, + // or otherWin has a satisfied constraint, or otherWin + // has no constraint. + int edgePos = GetEdge(otherEdge, win, otherWin); + if (edgePos != -1) + { + value = edgePos - margin; + done = true; + return true; + } + else + return false; + } + case wxBelow: + { + int edgePos = GetEdge(otherEdge, win, otherWin); + if (edgePos != -1) + { + value = edgePos + margin; + done = true; + return true; + } + else + return false; + } + case wxPercentOf: + { + int edgePos = GetEdge(otherEdge, win, otherWin); + if (edgePos != -1) + { + value = (int)(edgePos*(((float)percent)*0.01) + margin); + done = true; + return true; + } + else + return false; + } + case wxUnconstrained: + { + // We know the centre position if we know + // the top edge and we know the height, OR + // the bottom edge and the height. + if (constraints->bottom.GetDone() && constraints->height.GetDone()) + { + value = (int)(constraints->bottom.GetValue() - (constraints->height.GetValue()/2) + margin); + done = true; + return true; + } + else if (constraints->top.GetDone() && constraints->height.GetDone()) + { + value = (int)(constraints->top.GetValue() + (constraints->height.GetValue()/2) + margin); + done = true; + return true; + } + else + return false; + } + default: + break; + } + break; + } + case wxWidth: + { + switch (relationship) + { + case wxPercentOf: + { + int edgePos = GetEdge(otherEdge, win, otherWin); + if (edgePos != -1) + { + value = (int)(edgePos*(((float)percent)*0.01)); + done = true; + return true; + } + else + return false; + } + case wxAsIs: + { + if (win) + { + int h; + wxGetAsIs(win, &value, &h); + done = true; + return true; + } + else return false; + } + case wxUnconstrained: + { + // We know the width if we know the left edge and the right edge, OR + // if we know the left edge and the centre, OR + // if we know the right edge and the centre + if (constraints->left.GetDone() && constraints->right.GetDone()) + { + value = constraints->right.GetValue() - constraints->left.GetValue(); + done = true; + return true; + } + else if (constraints->centreX.GetDone() && constraints->left.GetDone()) + { + value = (int)(2*(constraints->centreX.GetValue() - constraints->left.GetValue())); + done = true; + return true; + } + else if (constraints->centreX.GetDone() && constraints->right.GetDone()) + { + value = (int)(2*(constraints->right.GetValue() - constraints->centreX.GetValue())); + done = true; + return true; + } + else + return false; + } + default: + break; + } + break; + } + case wxHeight: + { + switch (relationship) + { + case wxPercentOf: + { + int edgePos = GetEdge(otherEdge, win, otherWin); + if (edgePos != -1) + { + value = (int)(edgePos*(((float)percent)*0.01)); + done = true; + return true; + } + else + return false; + } + case wxAsIs: + { + if (win) + { + int w; + wxGetAsIs(win, &w, &value); + done = true; + return true; + } + else return false; + } + case wxUnconstrained: + { + // We know the height if we know the top edge and the bottom edge, OR + // if we know the top edge and the centre, OR + // if we know the bottom edge and the centre + if (constraints->top.GetDone() && constraints->bottom.GetDone()) + { + value = constraints->bottom.GetValue() - constraints->top.GetValue(); + done = true; + return true; + } + else if (constraints->top.GetDone() && constraints->centreY.GetDone()) + { + value = (int)(2*(constraints->centreY.GetValue() - constraints->top.GetValue())); + done = true; + return true; + } + else if (constraints->bottom.GetDone() && constraints->centreY.GetDone()) + { + value = (int)(2*(constraints->bottom.GetValue() - constraints->centreY.GetValue())); + done = true; + return true; + } + else + return false; + } + default: + break; + } + break; + } + default: + break; + } + return false; +} + +// Get the value of this edge or dimension, or if this is not determinable, -1. +int wxIndividualLayoutConstraint::GetEdge(wxEdge which, + wxWindowBase *thisWin, + wxWindowBase *other) const +{ + // If the edge or dimension belongs to the parent, then we know the + // dimension is obtainable immediately. E.g. a wxExpandSizer may contain a + // button (but the button's true parent is a panel, not the sizer) + if (other->GetChildren().Find((wxWindow*)thisWin)) + { + switch (which) + { + case wxLeft: + { + return 0; + } + case wxTop: + { + return 0; + } + case wxRight: + { + int w, h; + other->GetClientSizeConstraint(&w, &h); + return w; + } + case wxBottom: + { + int w, h; + other->GetClientSizeConstraint(&w, &h); + return h; + } + case wxWidth: + { + int w, h; + other->GetClientSizeConstraint(&w, &h); + return w; + } + case wxHeight: + { + int w, h; + other->GetClientSizeConstraint(&w, &h); + return h; + } + case wxCentreX: + case wxCentreY: + { + int w, h; + other->GetClientSizeConstraint(&w, &h); + if (which == wxCentreX) + return (int)(w/2); + else + return (int)(h/2); + } + default: + return -1; + } + } + switch (which) + { + case wxLeft: + { + wxLayoutConstraints *constr = other->GetConstraints(); + // If no constraints, it means the window is not dependent + // on anything, and therefore we know its value immediately + if (constr) + { + if (constr->left.GetDone()) + return constr->left.GetValue(); + else + return -1; + } + else + { + int x, y; + other->GetPosition(&x, &y); + return x; + } + } + case wxTop: + { + wxLayoutConstraints *constr = other->GetConstraints(); + // If no constraints, it means the window is not dependent + // on anything, and therefore we know its value immediately + if (constr) + { + if (constr->top.GetDone()) + return constr->top.GetValue(); + else + return -1; + } + else + { + int x, y; + other->GetPosition(&x, &y); + return y; + } + } + case wxRight: + { + wxLayoutConstraints *constr = other->GetConstraints(); + // If no constraints, it means the window is not dependent + // on anything, and therefore we know its value immediately + if (constr) + { + if (constr->right.GetDone()) + return constr->right.GetValue(); + else + return -1; + } + else + { + int x, y, w, h; + other->GetPosition(&x, &y); + other->GetSize(&w, &h); + return (int)(x + w); + } + } + case wxBottom: + { + wxLayoutConstraints *constr = other->GetConstraints(); + // If no constraints, it means the window is not dependent + // on anything, and therefore we know its value immediately + if (constr) + { + if (constr->bottom.GetDone()) + return constr->bottom.GetValue(); + else + return -1; + } + else + { + int x, y, w, h; + other->GetPosition(&x, &y); + other->GetSize(&w, &h); + return (int)(y + h); + } + } + case wxWidth: + { + wxLayoutConstraints *constr = other->GetConstraints(); + // If no constraints, it means the window is not dependent + // on anything, and therefore we know its value immediately + if (constr) + { + if (constr->width.GetDone()) + return constr->width.GetValue(); + else + return -1; + } + else + { + int w, h; + other->GetSize(&w, &h); + return w; + } + } + case wxHeight: + { + wxLayoutConstraints *constr = other->GetConstraints(); + // If no constraints, it means the window is not dependent + // on anything, and therefore we know its value immediately + if (constr) + { + if (constr->height.GetDone()) + return constr->height.GetValue(); + else + return -1; + } + else + { + int w, h; + other->GetSize(&w, &h); + return h; + } + } + case wxCentreX: + { + wxLayoutConstraints *constr = other->GetConstraints(); + // If no constraints, it means the window is not dependent + // on anything, and therefore we know its value immediately + if (constr) + { + if (constr->centreX.GetDone()) + return constr->centreX.GetValue(); + else + return -1; + } + else + { + int x, y, w, h; + other->GetPosition(&x, &y); + other->GetSize(&w, &h); + return (int)(x + (w/2)); + } + } + case wxCentreY: + { + wxLayoutConstraints *constr = other->GetConstraints(); + // If no constraints, it means the window is not dependent + // on anything, and therefore we know its value immediately + if (constr) + { + if (constr->centreY.GetDone()) + return constr->centreY.GetValue(); + else + return -1; + } + else + { + int x, y, w, h; + other->GetPosition(&x, &y); + other->GetSize(&w, &h); + return (int)(y + (h/2)); + } + } + default: + break; + } + return -1; +} + +wxLayoutConstraints::wxLayoutConstraints() +{ + left.SetEdge(wxLeft); + top.SetEdge(wxTop); + right.SetEdge(wxRight); + bottom.SetEdge(wxBottom); + centreX.SetEdge(wxCentreX); + centreY.SetEdge(wxCentreY); + width.SetEdge(wxWidth); + height.SetEdge(wxHeight); +} + +bool wxLayoutConstraints::SatisfyConstraints(wxWindowBase *win, int *nChanges) +{ + int noChanges = 0; + + bool done = width.GetDone(); + bool newDone = (done ? true : width.SatisfyConstraint(this, win)); + if (newDone != done) + noChanges ++; + + done = height.GetDone(); + newDone = (done ? true : height.SatisfyConstraint(this, win)); + if (newDone != done) + noChanges ++; + + done = left.GetDone(); + newDone = (done ? true : left.SatisfyConstraint(this, win)); + if (newDone != done) + noChanges ++; + + done = top.GetDone(); + newDone = (done ? true : top.SatisfyConstraint(this, win)); + if (newDone != done) + noChanges ++; + + done = right.GetDone(); + newDone = (done ? true : right.SatisfyConstraint(this, win)); + if (newDone != done) + noChanges ++; + + done = bottom.GetDone(); + newDone = (done ? true : bottom.SatisfyConstraint(this, win)); + if (newDone != done) + noChanges ++; + + done = centreX.GetDone(); + newDone = (done ? true : centreX.SatisfyConstraint(this, win)); + if (newDone != done) + noChanges ++; + + done = centreY.GetDone(); + newDone = (done ? true : centreY.SatisfyConstraint(this, win)); + if (newDone != done) + noChanges ++; + + *nChanges = noChanges; + + return AreSatisfied(); +} + +#endif // wxUSE_CONSTRAINTS diff --git a/Externals/wxWidgets/src/common/lboxcmn.cpp b/Externals/wxWidgets/src/common/lboxcmn.cpp new file mode 100644 index 0000000000..f1787982a5 --- /dev/null +++ b/Externals/wxWidgets/src/common/lboxcmn.cpp @@ -0,0 +1,147 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/common/lboxcmn.cpp +// Purpose: wxListBox class methods common to all platforms +// Author: Vadim Zeitlin +// Modified by: +// Created: 22.10.99 +// RCS-ID: $Id: lboxcmn.cpp 39964 2006-07-04 00:31:52Z VZ $ +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_LISTBOX + +#include "wx/listbox.h" + +#ifndef WX_PRECOMP + #include "wx/dynarray.h" + #include "wx/arrstr.h" +#endif + +// ============================================================================ +// implementation +// ============================================================================ + +wxListBoxBase::~wxListBoxBase() +{ + // this destructor is required for Darwin +} + +// ---------------------------------------------------------------------------- +// adding items +// ---------------------------------------------------------------------------- + +void wxListBoxBase::InsertItems(unsigned int nItems, const wxString *items, unsigned int pos) +{ + wxArrayString aItems; + for ( unsigned int n = 0; n < nItems; n++ ) + { + aItems.Add(items[n]); + } + + DoInsertItems(aItems, pos); +} + + +void wxListBoxBase::Set(int nItems, const wxString* items, void **clientData) +{ + wxArrayString aItems; + for ( int n = 0; n < nItems; n++ ) + { + aItems.Add(items[n]); + } + + DoSetItems(aItems, clientData); +} + +// ---------------------------------------------------------------------------- +// selection +// ---------------------------------------------------------------------------- + +bool wxListBoxBase::SetStringSelection(const wxString& s, bool select) +{ + const int sel = FindString(s); + if ( sel == wxNOT_FOUND ) + return false; + + SetSelection(sel, select); + + return true; +} + +void wxListBoxBase::DeselectAll(int itemToLeaveSelected) +{ + if ( HasMultipleSelection() ) + { + wxArrayInt selections; + GetSelections(selections); + + size_t count = selections.GetCount(); + for ( size_t n = 0; n < count; n++ ) + { + int item = selections[n]; + if ( item != itemToLeaveSelected ) + Deselect(item); + } + } + else // single selection + { + int sel = GetSelection(); + if ( sel != wxNOT_FOUND && sel != itemToLeaveSelected ) + { + Deselect(sel); + } + } +} + +// ---------------------------------------------------------------------------- +// misc +// ---------------------------------------------------------------------------- + +void wxListBoxBase::Command(wxCommandEvent& event) +{ + SetSelection(event.GetInt(), event.GetExtraLong() != 0); + (void)ProcessEvent(event); +} + +// ---------------------------------------------------------------------------- +// SetFirstItem() and such +// ---------------------------------------------------------------------------- + +void wxListBoxBase::SetFirstItem(const wxString& s) +{ + int n = FindString(s); + + wxCHECK_RET( n != wxNOT_FOUND, wxT("invalid string in wxListBox::SetFirstItem") ); + + DoSetFirstItem(n); +} + +void wxListBoxBase::AppendAndEnsureVisible(const wxString& s) +{ + Append(s); + EnsureVisible(GetCount() - 1); +} + +void wxListBoxBase::EnsureVisible(int WXUNUSED(n)) +{ + // the base class version does nothing (the only alternative would be to + // call SetFirstItem() but this is probably even more stupid) +} + +#endif // wxUSE_LISTBOX diff --git a/Externals/wxWidgets/src/common/list.cpp b/Externals/wxWidgets/src/common/list.cpp new file mode 100644 index 0000000000..1a9f46a3aa --- /dev/null +++ b/Externals/wxWidgets/src/common/list.cpp @@ -0,0 +1,768 @@ +//////////////////////////////////////////////////////////////////////////////// +// Name: src/common/list.cpp +// Purpose: wxList implementation +// Author: Julian Smart +// Modified by: VZ at 16/11/98: WX_DECLARE_LIST() and typesafe lists added +// Created: 04/01/98 +// RCS-ID: $Id: list.cpp 43048 2006-11-04 18:14:50Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +//////////////////////////////////////////////////////////////////////////////// + +// ============================================================================= +// declarations +// ============================================================================= + +// ----------------------------------------------------------------------------- +// headers +// ----------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#include +#include +#include + +#ifndef WX_PRECOMP + #include "wx/list.h" +#endif + +#if !wxUSE_STL + +// ============================================================================= +// implementation +// ============================================================================= + +// ----------------------------------------------------------------------------- +// wxListKey +// ----------------------------------------------------------------------------- +wxListKey wxDefaultListKey; + +bool wxListKey::operator==(wxListKeyValue value) const +{ + switch ( m_keyType ) + { + default: + wxFAIL_MSG(wxT("bad key type.")); + // let compiler optimize the line above away in release build + // by not putting return here... + + case wxKEY_STRING: + return wxStrcmp(m_key.string, value.string) == 0; + + case wxKEY_INTEGER: + return m_key.integer == value.integer; + } +} + +// ----------------------------------------------------------------------------- +// wxNodeBase +// ----------------------------------------------------------------------------- + +wxNodeBase::wxNodeBase(wxListBase *list, + wxNodeBase *previous, wxNodeBase *next, + void *data, const wxListKey& key) +{ + m_list = list; + m_data = data; + m_previous = previous; + m_next = next; + + switch ( key.GetKeyType() ) + { + case wxKEY_NONE: + break; + + case wxKEY_INTEGER: + m_key.integer = key.GetNumber(); + break; + + case wxKEY_STRING: + // to be free()d later + m_key.string = wxStrdup(key.GetString()); + break; + + default: + wxFAIL_MSG(wxT("invalid key type")); + } + + if ( previous ) + previous->m_next = this; + + if ( next ) + next->m_previous = this; +} + +wxNodeBase::~wxNodeBase() +{ + // handle the case when we're being deleted from the list by the user (i.e. + // not by the list itself from DeleteNode) - we must do it for + // compatibility with old code + if ( m_list != NULL ) + { + if ( m_list->m_keyType == wxKEY_STRING ) + { + free(m_key.string); + } + + m_list->DetachNode(this); + } +} + +int wxNodeBase::IndexOf() const +{ + wxCHECK_MSG( m_list, wxNOT_FOUND, wxT("node doesn't belong to a list in IndexOf")); + + // It would be more efficient to implement IndexOf() completely inside + // wxListBase (only traverse the list once), but this is probably a more + // reusable way of doing it. Can always be optimized at a later date (since + // IndexOf() resides in wxListBase as well) if efficiency is a problem. + int i; + wxNodeBase *prev = m_previous; + + for( i = 0; prev; i++ ) + { + prev = prev->m_previous; + } + + return i; +} + +// ----------------------------------------------------------------------------- +// wxListBase +// ----------------------------------------------------------------------------- + +void wxListBase::Init(wxKeyType keyType) +{ + m_nodeFirst = + m_nodeLast = (wxNodeBase *) NULL; + m_count = 0; + m_destroy = false; + m_keyType = keyType; +} + +wxListBase::wxListBase(size_t count, void *elements[]) +{ + Init(); + + for ( size_t n = 0; n < count; n++ ) + { + Append(elements[n]); + } +} + +void wxListBase::DoCopy(const wxListBase& list) +{ + wxASSERT_MSG( !list.m_destroy, + wxT("copying list which owns it's elements is a bad idea") ); + + m_destroy = list.m_destroy; + m_keyType = list.m_keyType; + m_nodeFirst = + m_nodeLast = (wxNodeBase *) NULL; + + switch (m_keyType) + { + case wxKEY_INTEGER: + { + long key; + for ( wxNodeBase *node = list.GetFirst(); node; node = node->GetNext() ) + { + key = node->GetKeyInteger(); + Append(key, node->GetData()); + } + break; + } + + case wxKEY_STRING: + { + const wxChar *key; + for ( wxNodeBase *node = list.GetFirst(); node; node = node->GetNext() ) + { + key = node->GetKeyString(); + Append(key, node->GetData()); + } + break; + } + + default: + { + for ( wxNodeBase *node = list.GetFirst(); node; node = node->GetNext() ) + { + Append(node->GetData()); + } + break; + } + } + + wxASSERT_MSG( m_count == list.m_count, _T("logic error in wxList::DoCopy") ); +} + +wxListBase::~wxListBase() +{ + wxNodeBase *each = m_nodeFirst; + while ( each != NULL ) + { + wxNodeBase *next = each->GetNext(); + DoDeleteNode(each); + each = next; + } +} + +wxNodeBase *wxListBase::AppendCommon(wxNodeBase *node) +{ + if ( !m_nodeFirst ) + { + m_nodeFirst = node; + m_nodeLast = m_nodeFirst; + } + else + { + m_nodeLast->m_next = node; + m_nodeLast = node; + } + + m_count++; + + return node; +} + +wxNodeBase *wxListBase::Append(void *object) +{ + // all objects in a keyed list should have a key + wxCHECK_MSG( m_keyType == wxKEY_NONE, (wxNodeBase *)NULL, + wxT("need a key for the object to append") ); + + // we use wxDefaultListKey even though it is the default parameter value + // because gcc under Mac OS X seems to miscompile this call otherwise + wxNodeBase *node = CreateNode(m_nodeLast, (wxNodeBase *)NULL, object, + wxDefaultListKey); + + return AppendCommon(node); +} + +wxNodeBase *wxListBase::Append(long key, void *object) +{ + wxCHECK_MSG( (m_keyType == wxKEY_INTEGER) || + (m_keyType == wxKEY_NONE && m_count == 0), + (wxNodeBase *)NULL, + wxT("can't append object with numeric key to this list") ); + + wxNodeBase *node = CreateNode(m_nodeLast, (wxNodeBase *)NULL, object, key); + return AppendCommon(node); +} + +wxNodeBase *wxListBase::Append (const wxChar *key, void *object) +{ + wxCHECK_MSG( (m_keyType == wxKEY_STRING) || + (m_keyType == wxKEY_NONE && m_count == 0), + (wxNodeBase *)NULL, + wxT("can't append object with string key to this list") ); + + wxNodeBase *node = CreateNode(m_nodeLast, (wxNodeBase *)NULL, object, key); + return AppendCommon(node); +} + +wxNodeBase *wxListBase::Insert(wxNodeBase *position, void *object) +{ + // all objects in a keyed list should have a key + wxCHECK_MSG( m_keyType == wxKEY_NONE, (wxNodeBase *)NULL, + wxT("need a key for the object to insert") ); + + wxCHECK_MSG( !position || position->m_list == this, (wxNodeBase *)NULL, + wxT("can't insert before a node from another list") ); + + // previous and next node for the node being inserted + wxNodeBase *prev, *next; + if ( position ) + { + prev = position->GetPrevious(); + next = position; + } + else + { + // inserting in the beginning of the list + prev = (wxNodeBase *)NULL; + next = m_nodeFirst; + } + + // wxDefaultListKey: see comment in Append() above + wxNodeBase *node = CreateNode(prev, next, object, wxDefaultListKey); + if ( !m_nodeFirst ) + { + m_nodeLast = node; + } + + if ( prev == NULL ) + { + m_nodeFirst = node; + } + + m_count++; + + return node; +} + +wxNodeBase *wxListBase::Item(size_t n) const +{ + for ( wxNodeBase *current = GetFirst(); current; current = current->GetNext() ) + { + if ( n-- == 0 ) + { + return current; + } + } + + wxFAIL_MSG( wxT("invalid index in wxListBase::Item") ); + + return (wxNodeBase *)NULL; +} + +wxNodeBase *wxListBase::Find(const wxListKey& key) const +{ + wxASSERT_MSG( m_keyType == key.GetKeyType(), + wxT("this list is not keyed on the type of this key") ); + + for ( wxNodeBase *current = GetFirst(); current; current = current->GetNext() ) + { + if ( key == current->m_key ) + { + return current; + } + } + + // not found + return (wxNodeBase *)NULL; +} + +wxNodeBase *wxListBase::Find(const void *object) const +{ + for ( wxNodeBase *current = GetFirst(); current; current = current->GetNext() ) + { + if ( current->GetData() == object ) + return current; + } + + // not found + return (wxNodeBase *)NULL; +} + +int wxListBase::IndexOf(void *object) const +{ + wxNodeBase *node = Find( object ); + + return node ? node->IndexOf() : wxNOT_FOUND; +} + +void wxListBase::DoDeleteNode(wxNodeBase *node) +{ + // free node's data + if ( m_keyType == wxKEY_STRING ) + { + free(node->m_key.string); + } + + if ( m_destroy ) + { + node->DeleteData(); + } + + // so that the node knows that it's being deleted by the list + node->m_list = NULL; + delete node; +} + +wxNodeBase *wxListBase::DetachNode(wxNodeBase *node) +{ + wxCHECK_MSG( node, NULL, wxT("detaching NULL wxNodeBase") ); + wxCHECK_MSG( node->m_list == this, NULL, + wxT("detaching node which is not from this list") ); + + // update the list + wxNodeBase **prevNext = node->GetPrevious() ? &node->GetPrevious()->m_next + : &m_nodeFirst; + wxNodeBase **nextPrev = node->GetNext() ? &node->GetNext()->m_previous + : &m_nodeLast; + + *prevNext = node->GetNext(); + *nextPrev = node->GetPrevious(); + + m_count--; + + // mark the node as not belonging to this list any more + node->m_list = NULL; + + return node; +} + +bool wxListBase::DeleteNode(wxNodeBase *node) +{ + if ( !DetachNode(node) ) + return false; + + DoDeleteNode(node); + + return true; +} + +bool wxListBase::DeleteObject(void *object) +{ + for ( wxNodeBase *current = GetFirst(); current; current = current->GetNext() ) + { + if ( current->GetData() == object ) + { + DeleteNode(current); + return true; + } + } + + // not found + return false; +} + +void wxListBase::Clear() +{ + wxNodeBase *current = m_nodeFirst; + while ( current ) + { + wxNodeBase *next = current->GetNext(); + DoDeleteNode(current); + current = next; + } + + m_nodeFirst = + m_nodeLast = (wxNodeBase *)NULL; + + m_count = 0; +} + +void wxListBase::ForEach(wxListIterateFunction F) +{ + for ( wxNodeBase *current = GetFirst(); current; current = current->GetNext() ) + { + (*F)(current->GetData()); + } +} + +void *wxListBase::FirstThat(wxListIterateFunction F) +{ + for ( wxNodeBase *current = GetFirst(); current; current = current->GetNext() ) + { + if ( (*F)(current->GetData()) ) + return current->GetData(); + } + + return (wxNodeBase *)NULL; +} + +void *wxListBase::LastThat(wxListIterateFunction F) +{ + for ( wxNodeBase *current = GetLast(); current; current = current->GetPrevious() ) + { + if ( (*F)(current->GetData()) ) + return current->GetData(); + } + + return (wxNodeBase *)NULL; +} + +// (stefan.hammes@urz.uni-heidelberg.de) +// +// function for sorting lists. the concept is borrowed from 'qsort'. +// by giving a sort function, arbitrary lists can be sorted. +// method: +// - put wxObject pointers into an array +// - sort the array with qsort +// - put back the sorted wxObject pointers into the list +// +// CAVE: the sort function receives pointers to wxObject pointers (wxObject **), +// so dereference right! +// EXAMPLE: +// int listcompare(const void *arg1, const void *arg2) +// { +// return(compare(**(wxString **)arg1, +// **(wxString **)arg2)); +// } +// +// void main() +// { +// wxListBase list; +// +// list.Append(new wxString("DEF")); +// list.Append(new wxString("GHI")); +// list.Append(new wxString("ABC")); +// list.Sort(listcompare); +// } + +void wxListBase::Sort(const wxSortCompareFunction compfunc) +{ + // allocate an array for the wxObject pointers of the list + const size_t num = GetCount(); + void **objArray = new void *[num]; + void **objPtr = objArray; + + // go through the list and put the pointers into the array + wxNodeBase *node; + for ( node = GetFirst(); node; node = node->GetNext() ) + { + *objPtr++ = node->GetData(); + } + + // sort the array + qsort((void *)objArray,num,sizeof(wxObject *), +#ifdef __WXWINCE__ + (int (__cdecl *)(const void *,const void *)) +#endif + compfunc); + + // put the sorted pointers back into the list + objPtr = objArray; + for ( node = GetFirst(); node; node = node->GetNext() ) + { + node->SetData(*objPtr++); + } + + // free the array + delete[] objArray; +} + +void wxListBase::Reverse() +{ + wxNodeBase* node = m_nodeFirst; + wxNodeBase* tmp; + + while (node) + { + // swap prev and next pointers + tmp = node->m_next; + node->m_next = node->m_previous; + node->m_previous = tmp; + + // this is the node that was next before swapping + node = tmp; + } + + // swap first and last node + tmp = m_nodeFirst; m_nodeFirst = m_nodeLast; m_nodeLast = tmp; +} + +void wxListBase::DeleteNodes(wxNodeBase* first, wxNodeBase* last) +{ + wxNodeBase* node = first; + + while (node != last) + { + wxNodeBase* next = node->GetNext(); + DeleteNode(node); + node = next; + } +} + +// ============================================================================ +// compatibility section from now on +// ============================================================================ + +#ifdef wxLIST_COMPATIBILITY + +// ----------------------------------------------------------------------------- +// wxList (a.k.a. wxObjectList) +// ----------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxList, wxObject) + +wxList::wxList( int key_type ) + : wxObjectList( (wxKeyType)key_type ) +{ +} + +void wxObjectListNode::DeleteData() +{ + delete (wxObject *)GetData(); +} + +// ---------------------------------------------------------------------------- +// wxStringList +// ---------------------------------------------------------------------------- + +static inline wxChar* MYcopystring(const wxChar* s) +{ + wxChar* copy = new wxChar[wxStrlen(s) + 1]; + return wxStrcpy(copy, s); +} + +IMPLEMENT_DYNAMIC_CLASS(wxStringList, wxObject) + +// instead of WX_DEFINE_LIST(wxStringListBase) we define this function +// ourselves +void wxStringListNode::DeleteData() +{ + delete [] (char *)GetData(); +} + +bool wxStringList::Delete(const wxChar *s) +{ + wxStringListNode *current; + + for ( current = GetFirst(); current; current = current->GetNext() ) + { + if ( wxStrcmp(current->GetData(), s) == 0 ) + { + DeleteNode(current); + return true; + } + } + + // not found + return false; +} + +void wxStringList::DoCopy(const wxStringList& other) +{ + wxASSERT( GetCount() == 0 ); // this list must be empty before copying! + + size_t count = other.GetCount(); + for ( size_t n = 0; n < count; n++ ) + { + Add(other.Item(n)->GetData()); + } +} + +wxStringList::wxStringList() +{ + DeleteContents(true); +} + +// Variable argument list, terminated by a zero +// Makes new storage for the strings +wxStringList::wxStringList (const wxChar *first, ...) +{ + DeleteContents(true); + if ( !first ) + return; + + va_list ap; + va_start(ap, first); + + const wxChar *s = first; + for (;;) + { + Add(s); + + // icc gives this warning in its own va_arg() macro, argh +#ifdef __INTELC__ + #pragma warning(push) + #pragma warning(disable: 1684) +#endif + + s = va_arg(ap, const wxChar *); + +#ifdef __INTELC__ + #pragma warning(pop) +#endif + + if ( !s ) + break; + } + + va_end(ap); +} + +// Only makes new strings if arg is true +wxChar **wxStringList::ListToArray(bool new_copies) const +{ + wxChar **string_array = new wxChar *[GetCount()]; + wxStringListNode *node = GetFirst(); + for (size_t i = 0; i < GetCount(); i++) + { + wxChar *s = node->GetData(); + if ( new_copies ) + string_array[i] = MYcopystring(s); + else + string_array[i] = s; + node = node->GetNext(); + } + + return string_array; +} + +// Checks whether s is a member of the list +bool wxStringList::Member(const wxChar *s) const +{ + for ( wxStringListNode *node = GetFirst(); node; node = node->GetNext() ) + { + const wxChar *s1 = node->GetData(); + if (s == s1 || wxStrcmp (s, s1) == 0) + return true; + } + + return false; +} + +#ifdef __WXWINCE__ +extern "C" int __cdecl +#else +extern "C" int LINKAGEMODE +#endif + +wx_comparestrings(const void *arg1, const void *arg2) +{ + wxChar **s1 = (wxChar **) arg1; + wxChar **s2 = (wxChar **) arg2; + + return wxStrcmp (*s1, *s2); +} + +// Sort a list of strings - deallocates old nodes, allocates new +void wxStringList::Sort() +{ + size_t N = GetCount(); + wxChar **array = new wxChar *[N]; + wxStringListNode *node; + + size_t i = 0; + for ( node = GetFirst(); node; node = node->GetNext() ) + { + array[i++] = node->GetData(); + } + + qsort (array, N, sizeof (wxChar *), wx_comparestrings); + + i = 0; + for ( node = GetFirst(); node; node = node->GetNext() ) + node->SetData( array[i++] ); + + delete [] array; +} + +wxNode *wxStringList::Add(const wxChar *s) +{ + return (wxNode *)(wxStringListBase::Node *) + wxStringListBase::Append(MYcopystring(s)); +} + +wxNode *wxStringList::Prepend(const wxChar *s) +{ + return (wxNode *)(wxStringListBase::Node *) + wxStringListBase::Insert(MYcopystring(s)); +} + +#endif // wxLIST_COMPATIBILITY + +#else // wxUSE_STL = 1 + + #include "wx/listimpl.cpp" + WX_DEFINE_LIST(wxObjectList) + +// with wxUSE_STL wxStringList contains wxString objects, not pointers +void _WX_LIST_HELPER_wxStringListBase::DeleteFunction( wxString WXUNUSED(X) ) +{ +} + +wxStringListBase::BaseListType wxStringListBase::EmptyList; + +#endif // !wxUSE_STL diff --git a/Externals/wxWidgets/src/common/listctrlcmn.cpp b/Externals/wxWidgets/src/common/listctrlcmn.cpp new file mode 100644 index 0000000000..f0703f39e4 --- /dev/null +++ b/Externals/wxWidgets/src/common/listctrlcmn.cpp @@ -0,0 +1,54 @@ +//////////////////////////////////////////////////////////////////////////////// +// Name: src/common/listctrlcmn.cpp +// Purpose: Common defines for wxListCtrl and wxListCtrl-based classes. +// Author: Kevin Ollivier +// Created: 09/15/06 +// RCS-ID: $Id: listctrlcmn.cpp 41568 2006-10-02 17:38:30Z PC $ +// Copyright: (c) Kevin Ollivier +// Licence: wxWindows licence +//////////////////////////////////////////////////////////////////////////////// + +// ============================================================================= +// declarations +// ============================================================================= + +// ----------------------------------------------------------------------------- +// headers +// ----------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#if wxUSE_LISTCTRL + +#include "wx/listctrl.h" + +const wxChar wxListCtrlNameStr[] = wxT("listCtrl"); + +// ListCtrl events +DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_BEGIN_DRAG) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_BEGIN_RDRAG) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_BEGIN_LABEL_EDIT) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_END_LABEL_EDIT) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_DELETE_ITEM) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_DELETE_ALL_ITEMS) +#if WXWIN_COMPATIBILITY_2_4 +DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_GET_INFO) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_SET_INFO) +#endif +DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_ITEM_SELECTED) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_ITEM_DESELECTED) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_KEY_DOWN) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_INSERT_ITEM) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_COL_CLICK) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_COL_RIGHT_CLICK) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_COL_BEGIN_DRAG) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_COL_DRAGGING) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_COL_END_DRAG) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_ITEM_RIGHT_CLICK) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_ITEM_MIDDLE_CLICK) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_ITEM_ACTIVATED) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_ITEM_FOCUSED) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_CACHE_HINT) + +#endif // wxUSE_LISTCTRL diff --git a/Externals/wxWidgets/src/common/log.cpp b/Externals/wxWidgets/src/common/log.cpp new file mode 100644 index 0000000000..7068d24fe8 --- /dev/null +++ b/Externals/wxWidgets/src/common/log.cpp @@ -0,0 +1,834 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/log.cpp +// Purpose: Assorted wxLogXXX functions, and wxLog (sink for logs) +// Author: Vadim Zeitlin +// Modified by: +// Created: 29/01/98 +// RCS-ID: $Id: log.cpp 49589 2007-11-01 20:35:45Z VZ $ +// Copyright: (c) 1998 Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_LOG + +// wxWidgets +#ifndef WX_PRECOMP + #include "wx/log.h" + #include "wx/app.h" + #include "wx/arrstr.h" + #include "wx/intl.h" + #include "wx/string.h" + #include "wx/utils.h" +#endif //WX_PRECOMP + +#include "wx/apptrait.h" +#include "wx/datetime.h" +#include "wx/file.h" +#include "wx/msgout.h" +#include "wx/textfile.h" +#include "wx/thread.h" +#include "wx/wxchar.h" + +// other standard headers +#ifndef __WXWINCE__ +#include +#endif + +#include + +#ifndef __WXWINCE__ +#include +#else +#include "wx/msw/wince/time.h" +#endif + +#if defined(__WINDOWS__) + #include "wx/msw/private.h" // includes windows.h +#endif + +// ---------------------------------------------------------------------------- +// non member functions +// ---------------------------------------------------------------------------- + +// define this to enable wrapping of log messages +//#define LOG_PRETTY_WRAP + +#ifdef LOG_PRETTY_WRAP + static void wxLogWrap(FILE *f, const char *pszPrefix, const char *psz); +#endif + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// implementation of Log functions +// +// NB: unfortunately we need all these distinct functions, we can't make them +// macros and not all compilers inline vararg functions. +// ---------------------------------------------------------------------------- + +// generic log function +void wxVLogGeneric(wxLogLevel level, const wxChar *szFormat, va_list argptr) +{ + if ( wxLog::IsEnabled() ) { + wxLog::OnLog(level, wxString::FormatV(szFormat, argptr), time(NULL)); + } +} + +void wxLogGeneric(wxLogLevel level, const wxChar *szFormat, ...) +{ + va_list argptr; + va_start(argptr, szFormat); + wxVLogGeneric(level, szFormat, argptr); + va_end(argptr); +} + +#define IMPLEMENT_LOG_FUNCTION(level) \ + void wxVLog##level(const wxChar *szFormat, va_list argptr) \ + { \ + if ( wxLog::IsEnabled() ) { \ + wxLog::OnLog(wxLOG_##level, \ + wxString::FormatV(szFormat, argptr), time(NULL));\ + } \ + } \ + \ + void wxLog##level(const wxChar *szFormat, ...) \ + { \ + va_list argptr; \ + va_start(argptr, szFormat); \ + wxVLog##level(szFormat, argptr); \ + va_end(argptr); \ + } + +IMPLEMENT_LOG_FUNCTION(Error) +IMPLEMENT_LOG_FUNCTION(Warning) +IMPLEMENT_LOG_FUNCTION(Message) +IMPLEMENT_LOG_FUNCTION(Info) +IMPLEMENT_LOG_FUNCTION(Status) + +void wxSafeShowMessage(const wxString& title, const wxString& text) +{ +#ifdef __WINDOWS__ + ::MessageBox(NULL, text, title, MB_OK | MB_ICONSTOP); +#else + wxFprintf(stderr, _T("%s: %s\n"), title.c_str(), text.c_str()); + fflush(stderr); +#endif +} + +// fatal errors can't be suppressed nor handled by the custom log target and +// always terminate the program +void wxVLogFatalError(const wxChar *szFormat, va_list argptr) +{ + wxSafeShowMessage(_T("Fatal Error"), wxString::FormatV(szFormat, argptr)); + +#ifdef __WXWINCE__ + ExitThread(3); +#else + abort(); +#endif +} + +void wxLogFatalError(const wxChar *szFormat, ...) +{ + va_list argptr; + va_start(argptr, szFormat); + wxVLogFatalError(szFormat, argptr); + + // some compilers warn about unreachable code and it shouldn't matter + // for the others anyhow... + //va_end(argptr); +} + +// same as info, but only if 'verbose' mode is on +void wxVLogVerbose(const wxChar *szFormat, va_list argptr) +{ + if ( wxLog::IsEnabled() ) { + if ( wxLog::GetActiveTarget() != NULL && wxLog::GetVerbose() ) { + wxLog::OnLog(wxLOG_Info, + wxString::FormatV(szFormat, argptr), time(NULL)); + } + } +} + +void wxLogVerbose(const wxChar *szFormat, ...) +{ + va_list argptr; + va_start(argptr, szFormat); + wxVLogVerbose(szFormat, argptr); + va_end(argptr); +} + +// debug functions +#ifdef __WXDEBUG__ +#define IMPLEMENT_LOG_DEBUG_FUNCTION(level) \ + void wxVLog##level(const wxChar *szFormat, va_list argptr) \ + { \ + if ( wxLog::IsEnabled() ) { \ + wxLog::OnLog(wxLOG_##level, \ + wxString::FormatV(szFormat, argptr), time(NULL));\ + } \ + } \ + \ + void wxLog##level(const wxChar *szFormat, ...) \ + { \ + va_list argptr; \ + va_start(argptr, szFormat); \ + wxVLog##level(szFormat, argptr); \ + va_end(argptr); \ + } + + void wxVLogTrace(const wxChar *mask, const wxChar *szFormat, va_list argptr) + { + if ( wxLog::IsEnabled() && wxLog::IsAllowedTraceMask(mask) ) { + wxString msg; + msg << _T("(") << mask << _T(") ") << wxString::FormatV(szFormat, argptr); + + wxLog::OnLog(wxLOG_Trace, msg, time(NULL)); + } + } + + void wxLogTrace(const wxChar *mask, const wxChar *szFormat, ...) + { + va_list argptr; + va_start(argptr, szFormat); + wxVLogTrace(mask, szFormat, argptr); + va_end(argptr); + } + + void wxVLogTrace(wxTraceMask mask, const wxChar *szFormat, va_list argptr) + { + // we check that all of mask bits are set in the current mask, so + // that wxLogTrace(wxTraceRefCount | wxTraceOle) will only do something + // if both bits are set. + if ( wxLog::IsEnabled() && ((wxLog::GetTraceMask() & mask) == mask) ) { + wxLog::OnLog(wxLOG_Trace, wxString::FormatV(szFormat, argptr), time(NULL)); + } + } + + void wxLogTrace(wxTraceMask mask, const wxChar *szFormat, ...) + { + va_list argptr; + va_start(argptr, szFormat); + wxVLogTrace(mask, szFormat, argptr); + va_end(argptr); + } + +#else // release + #define IMPLEMENT_LOG_DEBUG_FUNCTION(level) +#endif + +IMPLEMENT_LOG_DEBUG_FUNCTION(Debug) +IMPLEMENT_LOG_DEBUG_FUNCTION(Trace) + +// wxLogSysError: one uses the last error code, for other you must give it +// explicitly + +// return the system error message description +static inline wxString wxLogSysErrorHelper(long err) +{ + return wxString::Format(_(" (error %ld: %s)"), err, wxSysErrorMsg(err)); +} + +void WXDLLEXPORT wxVLogSysError(const wxChar *szFormat, va_list argptr) +{ + wxVLogSysError(wxSysErrorCode(), szFormat, argptr); +} + +void WXDLLEXPORT wxLogSysError(const wxChar *szFormat, ...) +{ + va_list argptr; + va_start(argptr, szFormat); + wxVLogSysError(szFormat, argptr); + va_end(argptr); +} + +void WXDLLEXPORT wxVLogSysError(long err, const wxChar *fmt, va_list argptr) +{ + if ( wxLog::IsEnabled() ) { + wxLog::OnLog(wxLOG_Error, + wxString::FormatV(fmt, argptr) + wxLogSysErrorHelper(err), + time(NULL)); + } +} + +void WXDLLEXPORT wxLogSysError(long lErrCode, const wxChar *szFormat, ...) +{ + va_list argptr; + va_start(argptr, szFormat); + wxVLogSysError(lErrCode, szFormat, argptr); + va_end(argptr); +} + +// ---------------------------------------------------------------------------- +// wxLog class implementation +// ---------------------------------------------------------------------------- + +// define a critical section gs_prevCS protecting access to wxLog::ms_prevXXX +wxCRIT_SECT_DECLARE(gs_prevCS); + +/* static */ +unsigned wxLog::DoLogNumberOfRepeats() +{ + wxLog * const pLogger = GetActiveTarget(); + return pLogger ? pLogger->LogLastRepetitionCountIfNeeded() : 0u; +} + +unsigned wxLog::LogLastRepetitionCountIfNeeded() +{ + wxCRIT_SECT_LOCKER(lock, gs_prevCS); + + long retval = ms_prevCounter; + if ( ms_prevCounter > 0 ) + { + wxString msg; +#if wxUSE_INTL + msg.Printf(wxPLURAL("The previous message repeated once.", + "The previous message repeated %lu times.", + ms_prevCounter), + ms_prevCounter); +#else + msg.Printf(wxT("The previous message was repeated.")); +#endif + ms_prevCounter = 0; + ms_prevString.clear(); + DoLog(ms_prevLevel, msg.c_str(), ms_prevTimeStamp); + } + return retval; +} + +wxLog::~wxLog() +{ + LogLastRepetitionCountIfNeeded(); +} + +/* static */ +void wxLog::OnLog(wxLogLevel level, const wxChar *szString, time_t t) +{ + if ( IsEnabled() && ms_logLevel >= level ) + { + wxLog *pLogger = GetActiveTarget(); + if ( pLogger ) + { + if ( GetRepetitionCounting() ) + { + wxCRIT_SECT_LOCKER(lock, gs_prevCS); + + if ( szString == ms_prevString ) + { + ms_prevCounter++; + + // nothing else to do, in particular, don't log the + // repeated message + return; + } + + pLogger->LogLastRepetitionCountIfNeeded(); + + // reset repetition counter for a new message + ms_prevString = szString; + ms_prevLevel = level; + ms_prevTimeStamp = t; + } + + pLogger->DoLog(level, szString, t); + } + } +} + +// deprecated function +#if WXWIN_COMPATIBILITY_2_6 + +wxChar *wxLog::SetLogBuffer(wxChar * WXUNUSED(buf), size_t WXUNUSED(size)) +{ + return NULL; +} + +#endif // WXWIN_COMPATIBILITY_2_6 + +wxLog *wxLog::GetActiveTarget() +{ + if ( ms_bAutoCreate && ms_pLogger == NULL ) { + // prevent infinite recursion if someone calls wxLogXXX() from + // wxApp::CreateLogTarget() + static bool s_bInGetActiveTarget = false; + if ( !s_bInGetActiveTarget ) { + s_bInGetActiveTarget = true; + + // ask the application to create a log target for us + if ( wxTheApp != NULL ) + ms_pLogger = wxTheApp->GetTraits()->CreateLogTarget(); + else + ms_pLogger = new wxLogStderr; + + s_bInGetActiveTarget = false; + + // do nothing if it fails - what can we do? + } + } + + return ms_pLogger; +} + +wxLog *wxLog::SetActiveTarget(wxLog *pLogger) +{ + if ( ms_pLogger != NULL ) { + // flush the old messages before changing because otherwise they might + // get lost later if this target is not restored + ms_pLogger->Flush(); + } + + wxLog *pOldLogger = ms_pLogger; + ms_pLogger = pLogger; + + return pOldLogger; +} + +void wxLog::DontCreateOnDemand() +{ + ms_bAutoCreate = false; + + // this is usually called at the end of the program and we assume that it + // is *always* called at the end - so we free memory here to avoid false + // memory leak reports from wxWin memory tracking code + ClearTraceMasks(); +} + +void wxLog::DoCreateOnDemand() +{ + ms_bAutoCreate = true; +} + +void wxLog::RemoveTraceMask(const wxString& str) +{ + int index = ms_aTraceMasks.Index(str); + if ( index != wxNOT_FOUND ) + ms_aTraceMasks.RemoveAt((size_t)index); +} + +void wxLog::ClearTraceMasks() +{ + ms_aTraceMasks.Clear(); +} + +void wxLog::TimeStamp(wxString *str) +{ +#if wxUSE_DATETIME + if ( ms_timestamp ) + { + wxChar buf[256]; + time_t timeNow; + (void)time(&timeNow); + + struct tm tm; + wxStrftime(buf, WXSIZEOF(buf), + ms_timestamp, wxLocaltime_r(&timeNow, &tm)); + + str->Empty(); + *str << buf << wxT(": "); + } +#endif // wxUSE_DATETIME +} + +void wxLog::DoLog(wxLogLevel level, const wxChar *szString, time_t t) +{ + switch ( level ) { + case wxLOG_FatalError: + DoLogString(wxString(_("Fatal error: ")) + szString, t); + DoLogString(_("Program aborted."), t); + Flush(); +#ifdef __WXWINCE__ + ExitThread(3); +#else + abort(); +#endif + break; + + case wxLOG_Error: + DoLogString(wxString(_("Error: ")) + szString, t); + break; + + case wxLOG_Warning: + DoLogString(wxString(_("Warning: ")) + szString, t); + break; + + case wxLOG_Info: + if ( GetVerbose() ) + case wxLOG_Message: + case wxLOG_Status: + default: // log unknown log levels too + DoLogString(szString, t); + break; + + case wxLOG_Trace: + case wxLOG_Debug: +#ifdef __WXDEBUG__ + { + wxString msg = level == wxLOG_Trace ? wxT("Trace: ") + : wxT("Debug: "); + msg << szString; + DoLogString(msg, t); + } +#endif // Debug + break; + } +} + +void wxLog::DoLogString(const wxChar *WXUNUSED(szString), time_t WXUNUSED(t)) +{ + wxFAIL_MSG(wxT("DoLogString must be overriden if it's called.")); +} + +void wxLog::Flush() +{ + // nothing to do here +} + +/*static*/ bool wxLog::IsAllowedTraceMask(const wxChar *mask) +{ + for ( wxArrayString::iterator it = ms_aTraceMasks.begin(), + en = ms_aTraceMasks.end(); + it != en; ++it ) + if ( *it == mask) + return true; + return false; +} + +// ---------------------------------------------------------------------------- +// wxLogBuffer implementation +// ---------------------------------------------------------------------------- + +void wxLogBuffer::Flush() +{ + if ( !m_str.empty() ) + { + wxMessageOutputBest out; + out.Printf(_T("%s"), m_str.c_str()); + m_str.clear(); + } +} + +void wxLogBuffer::DoLog(wxLogLevel level, const wxChar *szString, time_t t) +{ + switch ( level ) + { + case wxLOG_Trace: + case wxLOG_Debug: +#ifdef __WXDEBUG__ + // don't put debug messages in the buffer, we don't want to show + // them to the user in a msg box, log them immediately + { + wxString str; + TimeStamp(&str); + str += szString; + + wxMessageOutputDebug dbgout; + dbgout.Printf(_T("%s\n"), str.c_str()); + } +#endif // __WXDEBUG__ + break; + + default: + wxLog::DoLog(level, szString, t); + } +} + +void wxLogBuffer::DoLogString(const wxChar *szString, time_t WXUNUSED(t)) +{ + m_str << szString << _T("\n"); +} + +// ---------------------------------------------------------------------------- +// wxLogStderr class implementation +// ---------------------------------------------------------------------------- + +wxLogStderr::wxLogStderr(FILE *fp) +{ + if ( fp == NULL ) + m_fp = stderr; + else + m_fp = fp; +} + +void wxLogStderr::DoLogString(const wxChar *szString, time_t WXUNUSED(t)) +{ + wxString str; + TimeStamp(&str); + str << szString; + + wxFputs(str, m_fp); + wxFputc(_T('\n'), m_fp); + fflush(m_fp); + + // under GUI systems such as Windows or Mac, programs usually don't have + // stderr at all, so show the messages also somewhere else, typically in + // the debugger window so that they go at least somewhere instead of being + // simply lost + if ( m_fp == stderr ) + { + wxAppTraits *traits = wxTheApp ? wxTheApp->GetTraits() : NULL; + if ( traits && !traits->HasStderr() ) + { + wxMessageOutputDebug dbgout; + dbgout.Printf(_T("%s\n"), str.c_str()); + } + } +} + +// ---------------------------------------------------------------------------- +// wxLogStream implementation +// ---------------------------------------------------------------------------- + +#if wxUSE_STD_IOSTREAM +#include "wx/ioswrap.h" +wxLogStream::wxLogStream(wxSTD ostream *ostr) +{ + if ( ostr == NULL ) + m_ostr = &wxSTD cerr; + else + m_ostr = ostr; +} + +void wxLogStream::DoLogString(const wxChar *szString, time_t WXUNUSED(t)) +{ + wxString str; + TimeStamp(&str); + (*m_ostr) << wxSafeConvertWX2MB(str) << wxSafeConvertWX2MB(szString) << wxSTD endl; +} +#endif // wxUSE_STD_IOSTREAM + +// ---------------------------------------------------------------------------- +// wxLogChain +// ---------------------------------------------------------------------------- + +wxLogChain::wxLogChain(wxLog *logger) +{ + m_bPassMessages = true; + + m_logNew = logger; + m_logOld = wxLog::SetActiveTarget(this); +} + +wxLogChain::~wxLogChain() +{ + delete m_logOld; + + if ( m_logNew != this ) + delete m_logNew; +} + +void wxLogChain::SetLog(wxLog *logger) +{ + if ( m_logNew != this ) + delete m_logNew; + + m_logNew = logger; +} + +void wxLogChain::Flush() +{ + if ( m_logOld ) + m_logOld->Flush(); + + // be careful to avoid infinite recursion + if ( m_logNew && m_logNew != this ) + m_logNew->Flush(); +} + +void wxLogChain::DoLog(wxLogLevel level, const wxChar *szString, time_t t) +{ + // let the previous logger show it + if ( m_logOld && IsPassingMessages() ) + { + // bogus cast just to access protected DoLog + ((wxLogChain *)m_logOld)->DoLog(level, szString, t); + } + + if ( m_logNew && m_logNew != this ) + { + // as above... + ((wxLogChain *)m_logNew)->DoLog(level, szString, t); + } +} + +// ---------------------------------------------------------------------------- +// wxLogPassThrough +// ---------------------------------------------------------------------------- + +#ifdef __VISUALC__ + // "'this' : used in base member initializer list" - so what? + #pragma warning(disable:4355) +#endif // VC++ + +wxLogPassThrough::wxLogPassThrough() + : wxLogChain(this) +{ +} + +#ifdef __VISUALC__ + #pragma warning(default:4355) +#endif // VC++ + +// ============================================================================ +// Global functions/variables +// ============================================================================ + +// ---------------------------------------------------------------------------- +// static variables +// ---------------------------------------------------------------------------- + +bool wxLog::ms_bRepetCounting = false; +wxString wxLog::ms_prevString; +unsigned int wxLog::ms_prevCounter = 0; +time_t wxLog::ms_prevTimeStamp= 0; +wxLogLevel wxLog::ms_prevLevel; + +wxLog *wxLog::ms_pLogger = (wxLog *)NULL; +bool wxLog::ms_doLog = true; +bool wxLog::ms_bAutoCreate = true; +bool wxLog::ms_bVerbose = false; + +wxLogLevel wxLog::ms_logLevel = wxLOG_Max; // log everything by default + +size_t wxLog::ms_suspendCount = 0; + +const wxChar *wxLog::ms_timestamp = wxT("%X"); // time only, no date + +wxTraceMask wxLog::ms_ulTraceMask = (wxTraceMask)0; +wxArrayString wxLog::ms_aTraceMasks; + +// ---------------------------------------------------------------------------- +// stdout error logging helper +// ---------------------------------------------------------------------------- + +// helper function: wraps the message and justifies it under given position +// (looks more pretty on the terminal). Also adds newline at the end. +// +// TODO this is now disabled until I find a portable way of determining the +// terminal window size (ok, I found it but does anybody really cares?) +#ifdef LOG_PRETTY_WRAP +static void wxLogWrap(FILE *f, const char *pszPrefix, const char *psz) +{ + size_t nMax = 80; // FIXME + size_t nStart = strlen(pszPrefix); + fputs(pszPrefix, f); + + size_t n; + while ( *psz != '\0' ) { + for ( n = nStart; (n < nMax) && (*psz != '\0'); n++ ) + putc(*psz++, f); + + // wrapped? + if ( *psz != '\0' ) { + /*putc('\n', f);*/ + for ( n = 0; n < nStart; n++ ) + putc(' ', f); + + // as we wrapped, squeeze all white space + while ( isspace(*psz) ) + psz++; + } + } + + putc('\n', f); +} +#endif //LOG_PRETTY_WRAP + +// ---------------------------------------------------------------------------- +// error code/error message retrieval functions +// ---------------------------------------------------------------------------- + +// get error code from syste +unsigned long wxSysErrorCode() +{ +#if defined(__WXMSW__) && !defined(__WXMICROWIN__) + return ::GetLastError(); +#else //Unix + return errno; +#endif //Win/Unix +} + +// get error message from system +const wxChar *wxSysErrorMsg(unsigned long nErrCode) +{ + if ( nErrCode == 0 ) + nErrCode = wxSysErrorCode(); + +#if defined(__WXMSW__) && !defined(__WXMICROWIN__) + static wxChar s_szBuf[1024]; + + // get error message from system + LPVOID lpMsgBuf; + if ( ::FormatMessage + ( + FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, + NULL, + nErrCode, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPTSTR)&lpMsgBuf, + 0, + NULL + ) == 0 ) + { + // if this happens, something is seriously wrong, so don't use _() here + // for safety + wxSprintf(s_szBuf, _T("unknown error %lx"), nErrCode); + return s_szBuf; + } + + + // copy it to our buffer and free memory + // Crashes on SmartPhone (FIXME) +#if !defined(__SMARTPHONE__) /* of WinCE */ + if( lpMsgBuf != 0 ) + { + wxStrncpy(s_szBuf, (const wxChar *)lpMsgBuf, WXSIZEOF(s_szBuf) - 1); + s_szBuf[WXSIZEOF(s_szBuf) - 1] = wxT('\0'); + + LocalFree(lpMsgBuf); + + // returned string is capitalized and ended with '\r\n' - bad + s_szBuf[0] = (wxChar)wxTolower(s_szBuf[0]); + size_t len = wxStrlen(s_szBuf); + if ( len > 0 ) { + // truncate string + if ( s_szBuf[len - 2] == wxT('\r') ) + s_szBuf[len - 2] = wxT('\0'); + } + } + else +#endif // !__SMARTPHONE__ + { + s_szBuf[0] = wxT('\0'); + } + + return s_szBuf; +#else // !__WXMSW__ + #if wxUSE_UNICODE + static wchar_t s_wzBuf[1024]; + wxConvCurrent->MB2WC(s_wzBuf, strerror((int)nErrCode), + WXSIZEOF(s_wzBuf) - 1); + return s_wzBuf; + #else + return strerror((int)nErrCode); + #endif +#endif // __WXMSW__/!__WXMSW__ +} + +#endif // wxUSE_LOG diff --git a/Externals/wxWidgets/src/common/longlong.cpp b/Externals/wxWidgets/src/common/longlong.cpp new file mode 100644 index 0000000000..af121be815 --- /dev/null +++ b/Externals/wxWidgets/src/common/longlong.cpp @@ -0,0 +1,1363 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/longlong.cpp +// Purpose: implementation of wxLongLongNative +// Author: Jeffrey C. Ollie , Vadim Zeitlin +// Remarks: this class is not public in wxWidgets 2.0! It is intentionally +// not documented and is for private use only. +// Modified by: +// Created: 10.02.99 +// RCS-ID: $Id: longlong.cpp 40750 2006-08-22 19:04:45Z MW $ +// Copyright: (c) 1998 Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// headers +// ============================================================================ + +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_LONGLONG + +#include "wx/longlong.h" + +#ifndef WX_PRECOMP + #include "wx/math.h" // for fabs() +#endif + +#if wxUSE_STREAMS + #include "wx/txtstrm.h" +#endif + +#include // for memset() + +#include "wx/ioswrap.h" + +// ============================================================================ +// implementation +// ============================================================================ + +#if wxUSE_LONGLONG_NATIVE + +// ---------------------------------------------------------------------------- +// misc +// ---------------------------------------------------------------------------- + +void *wxLongLongNative::asArray() const +{ + static unsigned char temp[8]; + + temp[0] = wx_truncate_cast(unsigned char, ((m_ll >> 56) & 0xFF)); + temp[1] = wx_truncate_cast(unsigned char, ((m_ll >> 48) & 0xFF)); + temp[2] = wx_truncate_cast(unsigned char, ((m_ll >> 40) & 0xFF)); + temp[3] = wx_truncate_cast(unsigned char, ((m_ll >> 32) & 0xFF)); + temp[4] = wx_truncate_cast(unsigned char, ((m_ll >> 24) & 0xFF)); + temp[5] = wx_truncate_cast(unsigned char, ((m_ll >> 16) & 0xFF)); + temp[6] = wx_truncate_cast(unsigned char, ((m_ll >> 8) & 0xFF)); + temp[7] = wx_truncate_cast(unsigned char, ((m_ll >> 0) & 0xFF)); + + return temp; +} + +void *wxULongLongNative::asArray() const +{ + static unsigned char temp[8]; + + temp[0] = wx_truncate_cast(unsigned char, ((m_ll >> 56) & 0xFF)); + temp[1] = wx_truncate_cast(unsigned char, ((m_ll >> 48) & 0xFF)); + temp[2] = wx_truncate_cast(unsigned char, ((m_ll >> 40) & 0xFF)); + temp[3] = wx_truncate_cast(unsigned char, ((m_ll >> 32) & 0xFF)); + temp[4] = wx_truncate_cast(unsigned char, ((m_ll >> 24) & 0xFF)); + temp[5] = wx_truncate_cast(unsigned char, ((m_ll >> 16) & 0xFF)); + temp[6] = wx_truncate_cast(unsigned char, ((m_ll >> 8) & 0xFF)); + temp[7] = wx_truncate_cast(unsigned char, ((m_ll >> 0) & 0xFF)); + + return temp; +} + +#if wxUSE_LONGLONG_WX +wxLongLongNative::wxLongLongNative(wxLongLongWx ll) +{ + // assign first to avoid precision loss! + m_ll = ll.GetHi(); + m_ll <<= 32; + m_ll |= ll.GetLo(); +} + +wxLongLongNative& wxLongLongNative::operator=(wxLongLongWx ll) +{ + // assign first to avoid precision loss! + m_ll = ll.GetHi(); + m_ll <<= 32; + m_ll |= ll.GetLo(); + return *this; +} + +wxLongLongNative& wxLongLongNative::operator=(const class wxULongLongWx &ll) +{ + // assign first to avoid precision loss! + m_ll = ll.GetHi(); + m_ll <<= 32; + m_ll |= ll.GetLo(); + return *this; +} + +wxULongLongNative::wxULongLongNative(const class wxULongLongWx &ll) +{ + // assign first to avoid precision loss! + m_ll = ll.GetHi(); + m_ll <<= 32; + m_ll |= ((unsigned long) ll.GetLo()); +} + +wxULongLongNative& wxULongLongNative::operator=(wxLongLongWx ll) +{ + // assign first to avoid precision loss! + m_ll = ll.GetHi(); + m_ll <<= 32; + m_ll |= ((unsigned long) ll.GetLo()); + return *this; +} + +wxULongLongNative& wxULongLongNative::operator=(const class wxULongLongWx &ll) +{ + // assign first to avoid precision loss! + m_ll = ll.GetHi(); + m_ll <<= 32; + m_ll |= ((unsigned long) ll.GetLo()); + return *this; +} +#endif + +#endif // wxUSE_LONGLONG_NATIVE + +// ============================================================================ +// wxLongLongWx: emulation of 'long long' using 2 longs +// ============================================================================ + +#if wxUSE_LONGLONG_WX + +// Set value from unsigned wxULongLongWx +wxLongLongWx &wxLongLongWx::operator=(const class wxULongLongWx &ll) +{ + m_hi = (unsigned long) ll.GetHi(); + m_lo = ll.GetLo(); + return *this; +} + +// assignment +wxLongLongWx& wxLongLongWx::Assign(double d) +{ + bool positive = d >= 0; + d = fabs(d); + if ( d <= ULONG_MAX ) + { + m_hi = 0; + m_lo = (long)d; + } + else + { + m_hi = (unsigned long)(d / (1.0 + (double)ULONG_MAX)); + m_lo = (unsigned long)(d - ((double)m_hi * (1.0 + (double)ULONG_MAX))); + } + +#ifdef wxLONGLONG_TEST_MODE + m_ll = (wxLongLong_t)d; + + Check(); +#endif // wxLONGLONG_TEST_MODE + + if ( !positive ) + Negate(); + + return *this; +} + +double wxLongLongWx::ToDouble() const +{ + double d = m_hi; + d *= 1.0 + (double)ULONG_MAX; + d += m_lo; + +#ifdef wxLONGLONG_TEST_MODE + wxASSERT( d == m_ll ); +#endif // wxLONGLONG_TEST_MODE + + return d; +} + +double wxULongLongWx::ToDouble() const +{ + unsigned double d = m_hi; + d *= 1.0 + (double)ULONG_MAX; + d += m_lo; + +#ifdef wxLONGLONG_TEST_MODE + wxASSERT( d == m_ll ); +#endif // wxLONGLONG_TEST_MODE + + return d; +} + +wxLongLongWx wxLongLongWx::operator<<(int shift) const +{ + wxLongLongWx ll(*this); + ll <<= shift; + + return ll; +} + +wxULongLongWx wxULongLongWx::operator<<(int shift) const +{ + wxULongLongWx ll(*this); + ll <<= shift; + + return ll; +} + +wxLongLongWx& wxLongLongWx::operator<<=(int shift) +{ + if (shift != 0) + { + if (shift < 32) + { + m_hi <<= shift; + m_hi |= m_lo >> (32 - shift); + m_lo <<= shift; + } + else + { + m_hi = m_lo << (shift - 32); + m_lo = 0; + } + } + +#ifdef wxLONGLONG_TEST_MODE + m_ll <<= shift; + + Check(); +#endif // wxLONGLONG_TEST_MODE + + return *this; +} + +wxULongLongWx& wxULongLongWx::operator<<=(int shift) +{ + if (shift != 0) + { + if (shift < 32) + { + m_hi <<= shift; + m_hi |= m_lo >> (32 - shift); + m_lo <<= shift; + } + else + { + m_hi = m_lo << (shift - 32); + m_lo = 0; + } + } + +#ifdef wxLONGLONG_TEST_MODE + m_ll <<= shift; + + Check(); +#endif // wxLONGLONG_TEST_MODE + + return *this; +} + +wxLongLongWx wxLongLongWx::operator>>(int shift) const +{ + wxLongLongWx ll(*this); + ll >>= shift; + + return ll; +} + +wxULongLongWx wxULongLongWx::operator>>(int shift) const +{ + wxULongLongWx ll(*this); + ll >>= shift; + + return ll; +} + +wxLongLongWx& wxLongLongWx::operator>>=(int shift) +{ + if (shift != 0) + { + if (shift < 32) + { + m_lo >>= shift; + m_lo |= m_hi << (32 - shift); + m_hi >>= shift; + } + else + { + m_lo = m_hi >> (shift - 32); + m_hi = (m_hi < 0 ? -1L : 0); + } + } + +#ifdef wxLONGLONG_TEST_MODE + m_ll >>= shift; + + Check(); +#endif // wxLONGLONG_TEST_MODE + + return *this; +} + +wxULongLongWx& wxULongLongWx::operator>>=(int shift) +{ + if (shift != 0) + { + if (shift < 32) + { + m_lo >>= shift; + m_lo |= m_hi << (32 - shift); + m_hi >>= shift; + } + else + { + m_lo = m_hi >> (shift - 32); + m_hi = 0; + } + } + +#ifdef wxLONGLONG_TEST_MODE + m_ll >>= shift; + + Check(); +#endif // wxLONGLONG_TEST_MODE + + return *this; +} + +wxLongLongWx wxLongLongWx::operator+(const wxLongLongWx& ll) const +{ + wxLongLongWx res(*this); + res += ll; + + return res; +} + +wxULongLongWx wxULongLongWx::operator+(const wxULongLongWx& ll) const +{ + wxULongLongWx res(*this); + res += ll; + + return res; +} + +wxLongLongWx wxLongLongWx::operator+(long l) const +{ + wxLongLongWx res(*this); + res += l; + + return res; +} + +wxULongLongWx wxULongLongWx::operator+(unsigned long l) const +{ + wxULongLongWx res(*this); + res += l; + + return res; +} + +wxLongLongWx& wxLongLongWx::operator+=(const wxLongLongWx& ll) +{ + unsigned long previous = m_lo; + + m_lo += ll.m_lo; + m_hi += ll.m_hi; + + if ((m_lo < previous) || (m_lo < ll.m_lo)) + m_hi++; + +#ifdef wxLONGLONG_TEST_MODE + m_ll += ll.m_ll; + + Check(); +#endif // wxLONGLONG_TEST_MODE + + return *this; +} + +wxULongLongWx& wxULongLongWx::operator+=(const wxULongLongWx& ll) +{ + unsigned long previous = m_lo; + + m_lo += ll.m_lo; + m_hi += ll.m_hi; + + if ((m_lo < previous) || (m_lo < ll.m_lo)) + m_hi++; + +#ifdef wxLONGLONG_TEST_MODE + m_ll += ll.m_ll; + + Check(); +#endif // wxLONGLONG_TEST_MODE + + return *this; +} + +wxLongLongWx& wxLongLongWx::operator+=(long l) +{ + unsigned long previous = m_lo; + + m_lo += l; + if (l < 0) + m_hi += -1l; + + if ((m_lo < previous) || (m_lo < (unsigned long)l)) + m_hi++; + +#ifdef wxLONGLONG_TEST_MODE + m_ll += l; + + Check(); +#endif // wxLONGLONG_TEST_MODE + + return *this; +} + +wxULongLongWx& wxULongLongWx::operator+=(unsigned long l) +{ + unsigned long previous = m_lo; + + m_lo += l; + + if ((m_lo < previous) || (m_lo < l)) + m_hi++; + +#ifdef wxLONGLONG_TEST_MODE + m_ll += l; + + Check(); +#endif // wxLONGLONG_TEST_MODE + + return *this; +} + +// pre increment +wxLongLongWx& wxLongLongWx::operator++() +{ + m_lo++; + if (m_lo == 0) + m_hi++; + +#ifdef wxLONGLONG_TEST_MODE + m_ll++; + + Check(); +#endif // wxLONGLONG_TEST_MODE + + return *this; +} + +wxULongLongWx& wxULongLongWx::operator++() +{ + m_lo++; + if (m_lo == 0) + m_hi++; + +#ifdef wxLONGLONG_TEST_MODE + m_ll++; + + Check(); +#endif // wxLONGLONG_TEST_MODE + + return *this; +} + +// negation +wxLongLongWx wxLongLongWx::operator-() const +{ + wxLongLongWx res(*this); + res.Negate(); + + return res; +} + +wxLongLongWx& wxLongLongWx::Negate() +{ + m_hi = ~m_hi; + m_lo = ~m_lo; + + m_lo++; + if ( m_lo == 0 ) + m_hi++; + +#ifdef wxLONGLONG_TEST_MODE + m_ll = -m_ll; + + Check(); +#endif // wxLONGLONG_TEST_MODE + + return *this; +} + +// subtraction + +wxLongLongWx wxLongLongWx::operator-(const wxLongLongWx& ll) const +{ + wxLongLongWx res(*this); + res -= ll; + + return res; +} + +wxLongLongWx wxULongLongWx::operator-(const wxULongLongWx& ll) const +{ + wxASSERT(m_hi <= LONG_MAX ); + wxASSERT(ll.m_hi <= LONG_MAX ); + + wxLongLongWx res( (long)m_hi , m_lo ); + wxLongLongWx op( (long)ll.m_hi , ll.m_lo ); + res -= op; + + return res; +} + +wxLongLongWx& wxLongLongWx::operator-=(const wxLongLongWx& ll) +{ + unsigned long previous = m_lo; + + m_lo -= ll.m_lo; + m_hi -= ll.m_hi; + + if (previous < ll.m_lo) + m_hi--; + +#ifdef wxLONGLONG_TEST_MODE + m_ll -= ll.m_ll; + + Check(); +#endif // wxLONGLONG_TEST_MODE + + return *this; +} + +wxULongLongWx& wxULongLongWx::operator-=(const wxULongLongWx& ll) +{ + unsigned long previous = m_lo; + + m_lo -= ll.m_lo; + m_hi -= ll.m_hi; + + if (previous < ll.m_lo) + m_hi--; + +#ifdef wxLONGLONG_TEST_MODE + m_ll -= ll.m_ll; + + Check(); +#endif // wxLONGLONG_TEST_MODE + + return *this; +} + +// pre decrement +wxLongLongWx& wxLongLongWx::operator--() +{ + m_lo--; + if (m_lo == 0xFFFFFFFF) + m_hi--; + +#ifdef wxLONGLONG_TEST_MODE + m_ll--; + + Check(); +#endif // wxLONGLONG_TEST_MODE + + return *this; +} + +wxULongLongWx& wxULongLongWx::operator--() +{ + m_lo--; + if (m_lo == 0xFFFFFFFF) + m_hi--; + +#ifdef wxLONGLONG_TEST_MODE + m_ll--; + + Check(); +#endif // wxLONGLONG_TEST_MODE + + return *this; +} + +// comparison operators + +bool wxLongLongWx::operator<(const wxLongLongWx& ll) const +{ + if ( m_hi < ll.m_hi ) + return true; + else if ( m_hi == ll.m_hi ) + return m_lo < ll.m_lo; + else + return false; +} + +bool wxULongLongWx::operator<(const wxULongLongWx& ll) const +{ + if ( m_hi < ll.m_hi ) + return true; + else if ( m_hi == ll.m_hi ) + return m_lo < ll.m_lo; + else + return false; +} + +bool wxLongLongWx::operator>(const wxLongLongWx& ll) const +{ + if ( m_hi > ll.m_hi ) + return true; + else if ( m_hi == ll.m_hi ) + return m_lo > ll.m_lo; + else + return false; +} + +bool wxULongLongWx::operator>(const wxULongLongWx& ll) const +{ + if ( m_hi > ll.m_hi ) + return true; + else if ( m_hi == ll.m_hi ) + return m_lo > ll.m_lo; + else + return false; +} + +// bitwise operators + +wxLongLongWx wxLongLongWx::operator&(const wxLongLongWx& ll) const +{ + return wxLongLongWx(m_hi & ll.m_hi, m_lo & ll.m_lo); +} + +wxULongLongWx wxULongLongWx::operator&(const wxULongLongWx& ll) const +{ + return wxULongLongWx(m_hi & ll.m_hi, m_lo & ll.m_lo); +} + +wxLongLongWx wxLongLongWx::operator|(const wxLongLongWx& ll) const +{ + return wxLongLongWx(m_hi | ll.m_hi, m_lo | ll.m_lo); +} + +wxULongLongWx wxULongLongWx::operator|(const wxULongLongWx& ll) const +{ + return wxULongLongWx(m_hi | ll.m_hi, m_lo | ll.m_lo); +} + +wxLongLongWx wxLongLongWx::operator^(const wxLongLongWx& ll) const +{ + return wxLongLongWx(m_hi ^ ll.m_hi, m_lo ^ ll.m_lo); +} + +wxULongLongWx wxULongLongWx::operator^(const wxULongLongWx& ll) const +{ + return wxULongLongWx(m_hi ^ ll.m_hi, m_lo ^ ll.m_lo); +} + +wxLongLongWx& wxLongLongWx::operator&=(const wxLongLongWx& ll) +{ + m_lo &= ll.m_lo; + m_hi &= ll.m_hi; + +#ifdef wxLONGLONG_TEST_MODE + m_ll &= ll.m_ll; + + Check(); +#endif // wxLONGLONG_TEST_MODE + + return *this; +} + +wxULongLongWx& wxULongLongWx::operator&=(const wxULongLongWx& ll) +{ + m_lo &= ll.m_lo; + m_hi &= ll.m_hi; + +#ifdef wxLONGLONG_TEST_MODE + m_ll &= ll.m_ll; + + Check(); +#endif // wxLONGLONG_TEST_MODE + + return *this; +} + +wxLongLongWx& wxLongLongWx::operator|=(const wxLongLongWx& ll) +{ + m_lo |= ll.m_lo; + m_hi |= ll.m_hi; + +#ifdef wxLONGLONG_TEST_MODE + m_ll |= ll.m_ll; + + Check(); +#endif // wxLONGLONG_TEST_MODE + + return *this; +} + +wxULongLongWx& wxULongLongWx::operator|=(const wxULongLongWx& ll) +{ + m_lo |= ll.m_lo; + m_hi |= ll.m_hi; + +#ifdef wxLONGLONG_TEST_MODE + m_ll |= ll.m_ll; + + Check(); +#endif // wxLONGLONG_TEST_MODE + + return *this; +} + +wxLongLongWx& wxLongLongWx::operator^=(const wxLongLongWx& ll) +{ + m_lo ^= ll.m_lo; + m_hi ^= ll.m_hi; + +#ifdef wxLONGLONG_TEST_MODE + m_ll ^= ll.m_ll; + + Check(); +#endif // wxLONGLONG_TEST_MODE + + return *this; +} + +wxULongLongWx& wxULongLongWx::operator^=(const wxULongLongWx& ll) +{ + m_lo ^= ll.m_lo; + m_hi ^= ll.m_hi; + +#ifdef wxLONGLONG_TEST_MODE + m_ll ^= ll.m_ll; + + Check(); +#endif // wxLONGLONG_TEST_MODE + + return *this; +} + +wxLongLongWx wxLongLongWx::operator~() const +{ + return wxLongLongWx(~m_hi, ~m_lo); +} + +wxULongLongWx wxULongLongWx::operator~() const +{ + return wxULongLongWx(~m_hi, ~m_lo); +} + +// multiplication + +wxLongLongWx wxLongLongWx::operator*(const wxLongLongWx& ll) const +{ + wxLongLongWx res(*this); + res *= ll; + + return res; +} + +wxULongLongWx wxULongLongWx::operator*(const wxULongLongWx& ll) const +{ + wxULongLongWx res(*this); + res *= ll; + + return res; +} + +wxLongLongWx& wxLongLongWx::operator*=(const wxLongLongWx& ll) +{ + wxLongLongWx t(m_hi, m_lo); + wxLongLongWx q(ll.m_hi, ll.m_lo); + + m_hi = m_lo = 0; + +#ifdef wxLONGLONG_TEST_MODE + wxLongLong_t llOld = m_ll; + m_ll = 0; +#endif // wxLONGLONG_TEST_MODE + + int counter = 0; + do + { + if ((q.m_lo & 1) != 0) + *this += t; + q >>= 1; + t <<= 1; + counter++; + } + while ((counter < 64) && ((q.m_hi != 0) || (q.m_lo != 0))); + +#ifdef wxLONGLONG_TEST_MODE + m_ll = llOld * ll.m_ll; + + Check(); +#endif // wxLONGLONG_TEST_MODE + + return *this; +} + +wxULongLongWx& wxULongLongWx::operator*=(const wxULongLongWx& ll) +{ + wxULongLongWx t(m_hi, m_lo); + wxULongLongWx q(ll.m_hi, ll.m_lo); + + m_hi = m_lo = 0; + +#ifdef wxLONGLONG_TEST_MODE + wxULongLong_t llOld = m_ll; + m_ll = 0; +#endif // wxLONGLONG_TEST_MODE + + int counter = 0; + do + { + if ((q.m_lo & 1) != 0) + *this += t; + q >>= 1; + t <<= 1; + counter++; + } + while ((counter < 64) && ((q.m_hi != 0) || (q.m_lo != 0))); + +#ifdef wxLONGLONG_TEST_MODE + m_ll = llOld * ll.m_ll; + + Check(); +#endif // wxLONGLONG_TEST_MODE + + return *this; +} + +// division + +#define IS_MSB_SET(ll) ((ll.GetHi()) & (1 << (8*sizeof(long) - 1))) + +void wxLongLongWx::Divide(const wxLongLongWx& divisorIn, + wxLongLongWx& quotient, + wxLongLongWx& remainderIO) const +{ + if ((divisorIn.m_lo == 0) && (divisorIn.m_hi == 0)) + { + // provoke division by zero error and silence the compilers warnings + // about an expression without effect and unused variable + long dummy = divisorIn.m_lo/divisorIn.m_hi; + dummy += 0; + } + + // VZ: I'm writing this in a hurry and it's surely not the fastest way to + // do this - any improvements are more than welcome + // + // code inspired by the snippet at + // http://www.bearcave.com/software/divide.htm + // + // Copyright notice: + // + // Use of this program, for any purpose, is granted the author, Ian + // Kaplan, as long as this copyright notice is included in the source + // code or any source code derived from this program. The user assumes + // all responsibility for using this code. + + // init everything + wxULongLongWx dividend, divisor, remainder; + + quotient = 0l; + remainder = 0l; + + // always do unsigned division and adjust the signs later: in C integer + // division, the sign of the remainder is the same as the sign of the + // dividend, while the sign of the quotient is the product of the signs of + // the dividend and divisor. Of course, we also always have + // + // dividend = quotient*divisor + remainder + // + // with 0 <= abs(remainder) < abs(divisor) + bool negRemainder = GetHi() < 0; + bool negQuotient = false; // assume positive + if ( GetHi() < 0 ) + { + negQuotient = !negQuotient; + dividend = -*this; + } else { + dividend = *this; + } + if ( divisorIn.GetHi() < 0 ) + { + negQuotient = !negQuotient; + divisor = -divisorIn; + } else { + divisor = divisorIn; + } + + // check for some particular cases + if ( divisor > dividend ) + { + remainder = dividend; + } + else if ( divisor == dividend ) + { + quotient = 1l; + } + else + { + // here: dividend > divisor and both are positive: do unsigned division + size_t nBits = 64u; + wxLongLongWx d; + + while ( remainder < divisor ) + { + remainder <<= 1; + if ( IS_MSB_SET(dividend) ) + { + remainder |= 1; + } + + d = dividend; + dividend <<= 1; + + nBits--; + } + + // undo the last loop iteration + dividend = d; + remainder >>= 1; + nBits++; + + for ( size_t i = 0; i < nBits; i++ ) + { + remainder <<= 1; + if ( IS_MSB_SET(dividend) ) + { + remainder |= 1; + } + + wxLongLongWx t = remainder - divisor; + dividend <<= 1; + quotient <<= 1; + if ( !IS_MSB_SET(t) ) + { + quotient |= 1; + + remainder = t; + } + } + } + + remainderIO = remainder; + + // adjust signs + if ( negRemainder ) + { + remainderIO = -remainderIO; + } + + if ( negQuotient ) + { + quotient = -quotient; + } +} + +void wxULongLongWx::Divide(const wxULongLongWx& divisorIn, + wxULongLongWx& quotient, + wxULongLongWx& remainder) const +{ + if ((divisorIn.m_lo == 0) && (divisorIn.m_hi == 0)) + { + // provoke division by zero error and silence the compilers warnings + // about an expression without effect and unused variable + unsigned long dummy = divisorIn.m_lo/divisorIn.m_hi; + dummy += 0; + } + + // VZ: I'm writing this in a hurry and it's surely not the fastest way to + // do this - any improvements are more than welcome + // + // code inspired by the snippet at + // http://www.bearcave.com/software/divide.htm + // + // Copyright notice: + // + // Use of this program, for any purpose, is granted the author, Ian + // Kaplan, as long as this copyright notice is included in the source + // code or any source code derived from this program. The user assumes + // all responsibility for using this code. + + // init everything + wxULongLongWx dividend = *this, + divisor = divisorIn; + + quotient = 0l; + remainder = 0l; + + // check for some particular cases + if ( divisor > dividend ) + { + remainder = dividend; + } + else if ( divisor == dividend ) + { + quotient = 1l; + } + else + { + // here: dividend > divisor + size_t nBits = 64u; + wxULongLongWx d; + + while ( remainder < divisor ) + { + remainder <<= 1; + if ( IS_MSB_SET(dividend) ) + { + remainder |= 1; + } + + d = dividend; + dividend <<= 1; + + nBits--; + } + + // undo the last loop iteration + dividend = d; + remainder >>= 1; + nBits++; + + for ( size_t i = 0; i < nBits; i++ ) + { + remainder <<= 1; + if ( IS_MSB_SET(dividend) ) + { + remainder |= 1; + } + + wxULongLongWx t = remainder - divisor; + dividend <<= 1; + quotient <<= 1; + if ( !IS_MSB_SET(t) ) + { + quotient |= 1; + + remainder = t; + } + } + } +} + +wxLongLongWx wxLongLongWx::operator/(const wxLongLongWx& ll) const +{ + wxLongLongWx quotient, remainder; + + Divide(ll, quotient, remainder); + + return quotient; +} + +wxULongLongWx wxULongLongWx::operator/(const wxULongLongWx& ll) const +{ + wxULongLongWx quotient, remainder; + + Divide(ll, quotient, remainder); + + return quotient; +} + +wxLongLongWx& wxLongLongWx::operator/=(const wxLongLongWx& ll) +{ + wxLongLongWx quotient, remainder; + + Divide(ll, quotient, remainder); + + *this = quotient; + + return *this; +} + +wxULongLongWx& wxULongLongWx::operator/=(const wxULongLongWx& ll) +{ + wxULongLongWx quotient, remainder; + + Divide(ll, quotient, remainder); + + *this = quotient; + + return *this; +} + +wxLongLongWx wxLongLongWx::operator%(const wxLongLongWx& ll) const +{ + wxLongLongWx quotient, remainder; + + Divide(ll, quotient, remainder); + + return remainder; +} + +wxULongLongWx wxULongLongWx::operator%(const wxULongLongWx& ll) const +{ + wxULongLongWx quotient, remainder; + + Divide(ll, quotient, remainder); + + return remainder; +} + +// ---------------------------------------------------------------------------- +// misc +// ---------------------------------------------------------------------------- + +// temporary - just for testing +void *wxLongLongWx::asArray(void) const +{ + static unsigned char temp[8]; + + temp[0] = (char)((m_hi >> 24) & 0xFF); + temp[1] = (char)((m_hi >> 16) & 0xFF); + temp[2] = (char)((m_hi >> 8) & 0xFF); + temp[3] = (char)((m_hi >> 0) & 0xFF); + temp[4] = (char)((m_lo >> 24) & 0xFF); + temp[5] = (char)((m_lo >> 16) & 0xFF); + temp[6] = (char)((m_lo >> 8) & 0xFF); + temp[7] = (char)((m_lo >> 0) & 0xFF); + + return temp; +} + +void *wxULongLongWx::asArray(void) const +{ + static unsigned char temp[8]; + + temp[0] = (char)((m_hi >> 24) & 0xFF); + temp[1] = (char)((m_hi >> 16) & 0xFF); + temp[2] = (char)((m_hi >> 8) & 0xFF); + temp[3] = (char)((m_hi >> 0) & 0xFF); + temp[4] = (char)((m_lo >> 24) & 0xFF); + temp[5] = (char)((m_lo >> 16) & 0xFF); + temp[6] = (char)((m_lo >> 8) & 0xFF); + temp[7] = (char)((m_lo >> 0) & 0xFF); + + return temp; +} + +#endif // wxUSE_LONGLONG_WX + +#define LL_TO_STRING(name) \ + wxString name::ToString() const \ + { \ + /* TODO: this is awfully inefficient, anything better? */ \ + wxString result; \ + \ + name ll = *this; \ + \ + bool neg = ll < 0; \ + if ( neg ) \ + { \ + while ( ll != 0 ) \ + { \ + long digit = (ll % 10).ToLong(); \ + result.Prepend((wxChar)(_T('0') - digit)); \ + ll /= 10; \ + } \ + } \ + else \ + { \ + while ( ll != 0 ) \ + { \ + long digit = (ll % 10).ToLong(); \ + result.Prepend((wxChar)(_T('0') + digit)); \ + ll /= 10; \ + } \ + } \ + \ + if ( result.empty() ) \ + result = _T('0'); \ + else if ( neg ) \ + result.Prepend(_T('-')); \ + \ + return result; \ + } + +#define ULL_TO_STRING(name) \ + wxString name::ToString() const \ + { \ + /* TODO: this is awfully inefficient, anything better? */ \ + wxString result; \ + \ + name ll = *this; \ + \ + while ( ll != 0 ) \ + { \ + result.Prepend((wxChar)(_T('0') + (ll % 10).ToULong())); \ + ll /= 10; \ + } \ + \ + if ( result.empty() ) \ + result = _T('0'); \ + \ + return result; \ + } + +#if wxUSE_LONGLONG_NATIVE + LL_TO_STRING(wxLongLongNative) + ULL_TO_STRING(wxULongLongNative) +#endif + +#if wxUSE_LONGLONG_WX + LL_TO_STRING(wxLongLongWx) + ULL_TO_STRING(wxULongLongWx) +#endif + +#if wxUSE_STD_IOSTREAM + +// input/output +WXDLLIMPEXP_BASE +wxSTD ostream& operator<< (wxSTD ostream& o, const wxLongLong& ll) +{ + return o << ll.ToString(); +} + +WXDLLIMPEXP_BASE +wxSTD ostream& operator<< (wxSTD ostream& o, const wxULongLong& ll) +{ + return o << ll.ToString(); +} + +#endif // wxUSE_STD_IOSTREAM + +WXDLLIMPEXP_BASE wxString& operator<< (wxString& s, const wxLongLong& ll) +{ + return s << ll.ToString(); +} + +WXDLLIMPEXP_BASE wxString& operator<< (wxString& s, const wxULongLong& ll) +{ + return s << ll.ToString(); +} + +#if wxUSE_STREAMS + +WXDLLIMPEXP_BASE wxTextOutputStream& operator<< (wxTextOutputStream& o, const wxULongLong& ll) +{ + return o << ll.ToString(); +} + +WXDLLIMPEXP_BASE wxTextOutputStream& operator<< (wxTextOutputStream& o, const wxLongLong& ll) +{ + return o << ll.ToString(); +} + +#define READ_STRING_CHAR(s, idx, len) ((wxChar) ((idx!=len) ? s[idx++] : 0)) + +WXDLLIMPEXP_BASE class wxTextInputStream &operator>>(class wxTextInputStream &o, wxULongLong &ll) +{ + wxString s = o.ReadWord(); + + ll = wxULongLong(0l, 0l); + size_t length = s.length(); + size_t idx = 0; + + wxChar ch = READ_STRING_CHAR(s, idx, length); + + // Skip WS + while (ch==wxT(' ') || ch==wxT('\t')) + ch = READ_STRING_CHAR(s, idx, length); + + // Read number + wxULongLong multiplier(0l, 10l); + while (ch>=wxT('0') && ch<=wxT('9')) { + long lValue = (unsigned) (ch - wxT('0')); + ll = ll * multiplier + wxULongLong(0l, lValue); + ch = READ_STRING_CHAR(s, idx, length); + } + + return o; +} + +WXDLLIMPEXP_BASE class wxTextInputStream &operator>>(class wxTextInputStream &o, wxLongLong &ll) +{ + wxString s = o.ReadWord(); + + ll = wxLongLong(0l, 0l); + size_t length = s.length(); + size_t idx = 0; + + wxChar ch = READ_STRING_CHAR(s, idx, length); + + // Skip WS + while (ch==wxT(' ') || ch==wxT('\t')) + ch = READ_STRING_CHAR(s, idx, length); + + // Ask for sign + int iSign = 1; + if (ch==wxT('-') || ch==wxT('+')) { + iSign = ((ch==wxT('-')) ? -1 : 1); + ch = READ_STRING_CHAR(s, idx, length); + } + + // Read number + wxLongLong multiplier(0l, 10l); + while (ch>=wxT('0') && ch<=wxT('9')) { + long lValue = (unsigned) (ch - wxT('0')); + ll = ll * multiplier + wxLongLong(0l, lValue); + ch = READ_STRING_CHAR(s, idx, length); + } + +#if wxUSE_LONGLONG_NATIVE + ll = ll * wxLongLong((wxLongLong_t) iSign); +#else + ll = ll * wxLongLong((long) iSign); +#endif + + return o; +} + +#if wxUSE_LONGLONG_NATIVE + +WXDLLIMPEXP_BASE class wxTextOutputStream &operator<<(class wxTextOutputStream &o, wxULongLong_t value) +{ + return o << wxULongLong(value).ToString(); +} + +WXDLLIMPEXP_BASE class wxTextOutputStream &operator<<(class wxTextOutputStream &o, wxLongLong_t value) +{ + return o << wxLongLong(value).ToString(); +} + +WXDLLIMPEXP_BASE class wxTextInputStream &operator>>(class wxTextInputStream &o, wxULongLong_t &value) +{ + wxULongLong ll; + o >> ll; + value = ll.GetValue(); + return o; +} + +WXDLLIMPEXP_BASE class wxTextInputStream &operator>>(class wxTextInputStream &o, wxLongLong_t &value) +{ + wxLongLong ll; + o >> ll; + value = ll.GetValue(); + return o; +} + +#endif // wxUSE_LONGLONG_NATIVE + +#endif // wxUSE_STREAMS + +#endif // wxUSE_LONGLONG diff --git a/Externals/wxWidgets/src/common/matrix.cpp b/Externals/wxWidgets/src/common/matrix.cpp new file mode 100644 index 0000000000..e0fe8b002d --- /dev/null +++ b/Externals/wxWidgets/src/common/matrix.cpp @@ -0,0 +1,601 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/common/matrix.cpp +// Purpose: wxTransformMatrix class +// Author: Chris Breeze, Julian Smart +// Modified by: Klaas Holwerda +// Created: 01/02/97 +// RCS-ID: $Id: matrix.cpp 39745 2006-06-15 17:58:49Z ABX $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// Note: this is intended to be used in wxDC at some point to replace +// the current system of scaling/translation. It is not yet used. + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#include "wx/matrix.h" + +#ifndef WX_PRECOMP + #include "wx/math.h" +#endif + +static const double pi = M_PI; + +wxTransformMatrix::wxTransformMatrix(void) +{ + m_isIdentity = false; + + Identity(); +} + +wxTransformMatrix::wxTransformMatrix(const wxTransformMatrix& mat) + : wxObject() +{ + (*this) = mat; +} + +double wxTransformMatrix::GetValue(int col, int row) const +{ + if (row < 0 || row > 2 || col < 0 || col > 2) + return 0.0; + + return m_matrix[col][row]; +} + +void wxTransformMatrix::SetValue(int col, int row, double value) +{ + if (row < 0 || row > 2 || col < 0 || col > 2) + return; + + m_matrix[col][row] = value; + m_isIdentity = IsIdentity1(); +} + +void wxTransformMatrix::operator = (const wxTransformMatrix& mat) +{ + int i, j; + for (i = 0; i < 3; i++) + { + for (j = 0; j < 3; j++) + { + m_matrix[i][j] = mat.m_matrix[i][j]; + } + } + m_isIdentity = mat.m_isIdentity; +} + +bool wxTransformMatrix::operator == (const wxTransformMatrix& mat) const +{ + if (m_isIdentity && mat.m_isIdentity) + return true; + + int i, j; + for (i = 0; i < 3; i++) + { + for (j = 0; j < 3; j++) + { + if ( !wxIsSameDouble(m_matrix[i][j], mat.m_matrix[i][j]) ) + return false; + } + } + return true; +} + +bool wxTransformMatrix::operator != (const wxTransformMatrix& mat) const +{ + return (! ((*this) == mat)); +} + +double& wxTransformMatrix::operator()(int col, int row) +{ + if (row < 0 || row > 2 || col < 0 || col > 2) + return m_matrix[0][0]; + + return m_matrix[col][row]; +} + +double wxTransformMatrix::operator()(int col, int row) const +{ + if (row < 0 || row > 2 || col < 0 || col > 2) + return 0.0; + + return m_matrix[col][row]; +} + +// Invert matrix +bool wxTransformMatrix::Invert(void) +{ + double inverseMatrix[3][3]; + + // calculate the adjoint + inverseMatrix[0][0] = wxCalculateDet(m_matrix[1][1],m_matrix[2][1],m_matrix[1][2],m_matrix[2][2]); + inverseMatrix[0][1] = -wxCalculateDet(m_matrix[0][1],m_matrix[2][1],m_matrix[0][2],m_matrix[2][2]); + inverseMatrix[0][2] = wxCalculateDet(m_matrix[0][1],m_matrix[1][1],m_matrix[0][2],m_matrix[1][2]); + + inverseMatrix[1][0] = -wxCalculateDet(m_matrix[1][0],m_matrix[2][0],m_matrix[1][2],m_matrix[2][2]); + inverseMatrix[1][1] = wxCalculateDet(m_matrix[0][0],m_matrix[2][0],m_matrix[0][2],m_matrix[2][2]); + inverseMatrix[1][2] = -wxCalculateDet(m_matrix[0][0],m_matrix[1][0],m_matrix[0][2],m_matrix[1][2]); + + inverseMatrix[2][0] = wxCalculateDet(m_matrix[1][0],m_matrix[2][0],m_matrix[1][1],m_matrix[2][1]); + inverseMatrix[2][1] = -wxCalculateDet(m_matrix[0][0],m_matrix[2][0],m_matrix[0][1],m_matrix[2][1]); + inverseMatrix[2][2] = wxCalculateDet(m_matrix[0][0],m_matrix[1][0],m_matrix[0][1],m_matrix[1][1]); + + // now divide by the determinant + double det = m_matrix[0][0] * inverseMatrix[0][0] + m_matrix[0][1] * inverseMatrix[1][0] + m_matrix[0][2] * inverseMatrix[2][0]; + if ( wxIsNullDouble(det) ) + return false; + + inverseMatrix[0][0] /= det; inverseMatrix[1][0] /= det; inverseMatrix[2][0] /= det; + inverseMatrix[0][1] /= det; inverseMatrix[1][1] /= det; inverseMatrix[2][1] /= det; + inverseMatrix[0][2] /= det; inverseMatrix[1][2] /= det; inverseMatrix[2][2] /= det; + + for (int i = 0; i < 3; i++) + { + for (int j = 0; j < 3; j++) + { + m_matrix[i][j] = inverseMatrix[i][j]; + } + } + m_isIdentity = IsIdentity1(); + return true; +} + +// Make into identity matrix +bool wxTransformMatrix::Identity(void) +{ + m_matrix[0][0] = m_matrix[1][1] = m_matrix[2][2] = 1.0; + m_matrix[1][0] = m_matrix[2][0] = m_matrix[0][1] = m_matrix[2][1] = m_matrix[0][2] = m_matrix[1][2] = 0.0; + m_isIdentity = true; + + return true; +} + +// Scale by scale (isotropic scaling i.e. the same in x and y): +// | scale 0 0 | +// matrix' = | 0 scale 0 | x matrix +// | 0 0 scale | +// +bool wxTransformMatrix::Scale(double scale) +{ + int i, j; + for (i = 0; i < 3; i++) + { + for (j = 0; j < 3; j++) + { + m_matrix[i][j] *= scale; + } + } + m_isIdentity = IsIdentity1(); + + return true; +} + + +// scale a matrix in 2D +// +// xs 0 xc(1-xs) +// 0 ys yc(1-ys) +// 0 0 1 +// +wxTransformMatrix& wxTransformMatrix::Scale(const double &xs, const double &ys,const double &xc, const double &yc) +{ + double r00,r10,r20,r01,r11,r21; + + if (m_isIdentity) + { + double tx = xc*(1-xs); + double ty = yc*(1-ys); + r00 = xs; + r10 = 0; + r20 = tx; + r01 = 0; + r11 = ys; + r21 = ty; + } + else if ( !wxIsNullDouble(xc) || !wxIsNullDouble(yc) ) + { + double tx = xc*(1-xs); + double ty = yc*(1-ys); + r00 = xs * m_matrix[0][0]; + r10 = xs * m_matrix[1][0]; + r20 = xs * m_matrix[2][0] + tx; + r01 = ys * m_matrix[0][1]; + r11 = ys * m_matrix[1][1]; + r21 = ys * m_matrix[2][1] + ty; + } + else + { + r00 = xs * m_matrix[0][0]; + r10 = xs * m_matrix[1][0]; + r20 = xs * m_matrix[2][0]; + r01 = ys * m_matrix[0][1]; + r11 = ys * m_matrix[1][1]; + r21 = ys * m_matrix[2][1]; + } + + m_matrix[0][0] = r00; + m_matrix[1][0] = r10; + m_matrix[2][0] = r20; + m_matrix[0][1] = r01; + m_matrix[1][1] = r11; + m_matrix[2][1] = r21; + +/* or like this + // first translate to origin O + (*this).Translate(-x_cen, -y_cen); + + // now do the scaling + wxTransformMatrix scale; + scale.m_matrix[0][0] = x_fac; + scale.m_matrix[1][1] = y_fac; + scale.m_isIdentity = IsIdentity1(); + + *this = scale * (*this); + + // translate back from origin to x_cen, y_cen + (*this).Translate(x_cen, y_cen); +*/ + + m_isIdentity = IsIdentity1(); + + return *this; +} + + +// mirror a matrix in x, y +// +// -1 0 0 Y-mirror +// 0 -1 0 X-mirror +// 0 0 -1 Z-mirror +wxTransformMatrix& wxTransformMatrix::Mirror(bool x, bool y) +{ + wxTransformMatrix temp; + if (x) + { + temp.m_matrix[1][1] = -1; + temp.m_isIdentity=false; + } + if (y) + { + temp.m_matrix[0][0] = -1; + temp.m_isIdentity=false; + } + + *this = temp * (*this); + m_isIdentity = IsIdentity1(); + return *this; +} + +// Translate by dx, dy: +// | 1 0 dx | +// matrix' = | 0 1 dy | x matrix +// | 0 0 1 | +// +bool wxTransformMatrix::Translate(double dx, double dy) +{ + int i; + for (i = 0; i < 3; i++) + m_matrix[i][0] += dx * m_matrix[i][2]; + for (i = 0; i < 3; i++) + m_matrix[i][1] += dy * m_matrix[i][2]; + + m_isIdentity = IsIdentity1(); + + return true; +} + +// Rotate clockwise by the given number of degrees: +// | cos sin 0 | +// matrix' = | -sin cos 0 | x matrix +// | 0 0 1 | +bool wxTransformMatrix::Rotate(double degrees) +{ + Rotate(-degrees,0,0); + return true; +} + +// counter clockwise rotate around a point +// +// cos(r) -sin(r) x(1-cos(r))+y(sin(r) +// sin(r) cos(r) y(1-cos(r))-x(sin(r) +// 0 0 1 +wxTransformMatrix& wxTransformMatrix::Rotate(const double °rees, const double &x, const double &y) +{ + double angle = degrees * pi / 180.0; + double c = cos(angle); + double s = sin(angle); + double r00,r10,r20,r01,r11,r21; + + if (m_isIdentity) + { + double tx = x*(1-c)+y*s; + double ty = y*(1-c)-x*s; + r00 = c ; + r10 = -s; + r20 = tx; + r01 = s; + r11 = c; + r21 = ty; + } + else if ( !wxIsNullDouble(x) || !wxIsNullDouble(y) ) + { + double tx = x*(1-c)+y*s; + double ty = y*(1-c)-x*s; + r00 = c * m_matrix[0][0] - s * m_matrix[0][1] + tx * m_matrix[0][2]; + r10 = c * m_matrix[1][0] - s * m_matrix[1][1] + tx * m_matrix[1][2]; + r20 = c * m_matrix[2][0] - s * m_matrix[2][1] + tx;// * m_matrix[2][2]; + r01 = c * m_matrix[0][1] + s * m_matrix[0][0] + ty * m_matrix[0][2]; + r11 = c * m_matrix[1][1] + s * m_matrix[1][0] + ty * m_matrix[1][2]; + r21 = c * m_matrix[2][1] + s * m_matrix[2][0] + ty;// * m_matrix[2][2]; + } + else + { + r00 = c * m_matrix[0][0] - s * m_matrix[0][1]; + r10 = c * m_matrix[1][0] - s * m_matrix[1][1]; + r20 = c * m_matrix[2][0] - s * m_matrix[2][1]; + r01 = c * m_matrix[0][1] + s * m_matrix[0][0]; + r11 = c * m_matrix[1][1] + s * m_matrix[1][0]; + r21 = c * m_matrix[2][1] + s * m_matrix[2][0]; + } + + m_matrix[0][0] = r00; + m_matrix[1][0] = r10; + m_matrix[2][0] = r20; + m_matrix[0][1] = r01; + m_matrix[1][1] = r11; + m_matrix[2][1] = r21; + +/* or like this + wxTransformMatrix rotate; + rotate.m_matrix[2][0] = tx; + rotate.m_matrix[2][1] = ty; + + rotate.m_matrix[0][0] = c; + rotate.m_matrix[0][1] = s; + + rotate.m_matrix[1][0] = -s; + rotate.m_matrix[1][1] = c; + + rotate.m_isIdentity=false; + *this = rotate * (*this); +*/ + m_isIdentity = IsIdentity1(); + + return *this; +} + +// Transform a point from logical to device coordinates +bool wxTransformMatrix::TransformPoint(double x, double y, double& tx, double& ty) const +{ + if (IsIdentity()) + { + tx = x; ty = y; return true; + } + + tx = x * m_matrix[0][0] + y * m_matrix[1][0] + m_matrix[2][0]; + ty = x * m_matrix[0][1] + y * m_matrix[1][1] + m_matrix[2][1]; + + return true; +} + +// Transform a point from device to logical coordinates. + +// Example of use: +// wxTransformMatrix mat = dc.GetTransformation(); +// mat.Invert(); +// mat.InverseTransformPoint(x, y, x1, y1); +// OR (shorthand:) +// dc.LogicalToDevice(x, y, x1, y1); +// The latter is slightly less efficient if we're doing several +// conversions, since the matrix is inverted several times. +bool wxTransformMatrix::InverseTransformPoint(double x, double y, double& tx, double& ty) const +{ + if (IsIdentity()) + { + tx = x; + ty = y; + return true; + } + + const double z = (1.0 - m_matrix[0][2] * x - m_matrix[1][2] * y) / m_matrix[2][2]; + if ( wxIsNullDouble(z) ) + return false; + + tx = x * m_matrix[0][0] + y * m_matrix[1][0] + z * m_matrix[2][0]; + ty = x * m_matrix[0][1] + y * m_matrix[1][1] + z * m_matrix[2][1]; + return true; +} + +wxTransformMatrix& wxTransformMatrix::operator*=(const double& t) +{ + for (int i = 0; i < 3; i++) + for (int j = 0; j < 3; j++) + m_matrix[i][j]*= t; + m_isIdentity = IsIdentity1(); + return *this; +} + +wxTransformMatrix& wxTransformMatrix::operator/=(const double& t) +{ + for (int i = 0; i < 3; i++) + for (int j = 0; j < 3; j++) + m_matrix[i][j]/= t; + m_isIdentity = IsIdentity1(); + return *this; +} + +wxTransformMatrix& wxTransformMatrix::operator+=(const wxTransformMatrix& mat) +{ + for (int i = 0; i < 3; i++) + for (int j = 0; j < 3; j++) + m_matrix[i][j] += mat.m_matrix[i][j]; + m_isIdentity = IsIdentity1(); + return *this; +} + +wxTransformMatrix& wxTransformMatrix::operator-=(const wxTransformMatrix& mat) +{ + for (int i = 0; i < 3; i++) + for (int j = 0; j < 3; j++) + m_matrix[i][j] -= mat.m_matrix[i][j]; + m_isIdentity = IsIdentity1(); + return *this; +} + +wxTransformMatrix& wxTransformMatrix::operator*=(const wxTransformMatrix& mat) +{ + + if (mat.m_isIdentity) + return *this; + if (m_isIdentity) + { + *this = mat; + return *this; + } + else + { + wxTransformMatrix result; + for (int i = 0; i < 3; i++) + { + for (int j = 0; j < 3; j++) + { + double sum = 0; + for (int k = 0; k < 3; k++) + sum += m_matrix[k][i] * mat.m_matrix[j][k]; + result.m_matrix[j][i] = sum; + } + } + *this = result; + } + + m_isIdentity = IsIdentity1(); + return *this; +} + + +// constant operators +wxTransformMatrix wxTransformMatrix::operator*(const double& t) const +{ + wxTransformMatrix result = *this; + result *= t; + result.m_isIdentity = result.IsIdentity1(); + return result; +} + +wxTransformMatrix wxTransformMatrix::operator/(const double& t) const +{ + wxTransformMatrix result = *this; +// wxASSERT(t!=0); + result /= t; + result.m_isIdentity = result.IsIdentity1(); + return result; +} + +wxTransformMatrix wxTransformMatrix::operator+(const wxTransformMatrix& m) const +{ + wxTransformMatrix result = *this; + result += m; + result.m_isIdentity = result.IsIdentity1(); + return result; +} + +wxTransformMatrix wxTransformMatrix::operator-(const wxTransformMatrix& m) const +{ + wxTransformMatrix result = *this; + result -= m; + result.m_isIdentity = result.IsIdentity1(); + return result; +} + + +wxTransformMatrix wxTransformMatrix::operator*(const wxTransformMatrix& m) const +{ + wxTransformMatrix result = *this; + result *= m; + result.m_isIdentity = result.IsIdentity1(); + return result; +} + + +wxTransformMatrix wxTransformMatrix::operator-() const +{ + wxTransformMatrix result = *this; + for (int i = 0; i < 3; i++) + for (int j = 0; j < 3; j++) + result.m_matrix[i][j] = -(this->m_matrix[i][j]); + result.m_isIdentity = result.IsIdentity1(); + return result; +} + +static double CheckInt(double getal) +{ + // check if the number is very close to an integer + if ( (ceil(getal) - getal) < 0.0001) + return ceil(getal); + + else if ( (getal - floor(getal)) < 0.0001) + return floor(getal); + + return getal; + +} + +double wxTransformMatrix::Get_scaleX() +{ + double scale_factor; + double rot_angle = CheckInt(atan2(m_matrix[1][0],m_matrix[0][0])*180/pi); + if ( !wxIsSameDouble(rot_angle, 90) && !wxIsSameDouble(rot_angle, -90) ) + scale_factor = m_matrix[0][0]/cos((rot_angle/180)*pi); + else + scale_factor = m_matrix[0][0]/sin((rot_angle/180)*pi); // er kan nl. niet door 0 gedeeld worden ! + + scale_factor = CheckInt(scale_factor); + if (scale_factor < 0) + scale_factor = -scale_factor; + + return scale_factor; +} + +double wxTransformMatrix::Get_scaleY() +{ + double scale_factor; + double rot_angle = CheckInt(atan2(m_matrix[1][0],m_matrix[0][0])*180/pi); + if ( !wxIsSameDouble(rot_angle, 90) && !wxIsSameDouble(rot_angle, -90) ) + scale_factor = m_matrix[1][1]/cos((rot_angle/180)*pi); + else + scale_factor = m_matrix[1][1]/sin((rot_angle/180)*pi); // er kan nl. niet door 0 gedeeld worden ! + + scale_factor = CheckInt(scale_factor); + if (scale_factor < 0) + + scale_factor = -scale_factor; + + return scale_factor; + +} + +double wxTransformMatrix::GetRotation() +{ + double temp1 = GetValue(0,0); // for angle calculation + double temp2 = GetValue(0,1); // + + // Rotation + double rot_angle = atan2(temp2,temp1)*180/pi; + + rot_angle = CheckInt(rot_angle); + return rot_angle; +} + +void wxTransformMatrix::SetRotation(double rotation) +{ + double x=GetValue(2,0); + double y=GetValue(2,1); + Rotate(-GetRotation(), x, y); + Rotate(rotation, x, y); +} diff --git a/Externals/wxWidgets/src/common/mediactrlcmn.cpp b/Externals/wxWidgets/src/common/mediactrlcmn.cpp new file mode 100644 index 0000000000..4585eed501 --- /dev/null +++ b/Externals/wxWidgets/src/common/mediactrlcmn.cpp @@ -0,0 +1,559 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/mediactrl.cpp +// Purpose: wxMediaCtrl common code +// Author: Ryan Norton +// Modified by: +// Created: 11/07/04 +// RCS-ID: $Id: mediactrlcmn.cpp 42816 2006-10-31 08:50:17Z RD $ +// Copyright: (c) Ryan Norton +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// TODO: Platform specific backend defaults? + +//=========================================================================== +// Definitions +//=========================================================================== + +//--------------------------------------------------------------------------- +// Pre-compiled header stuff +//--------------------------------------------------------------------------- + +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_MEDIACTRL + +#ifndef WX_PRECOMP + #include "wx/hash.h" +#endif + +//--------------------------------------------------------------------------- +// Includes +//--------------------------------------------------------------------------- +#include "wx/mediactrl.h" + +//=========================================================================== +// +// Implementation +// +//=========================================================================== + +//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// RTTI and Event implementations +//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +IMPLEMENT_CLASS(wxMediaCtrl, wxControl) +DEFINE_EVENT_TYPE(wxEVT_MEDIA_STATECHANGED) +DEFINE_EVENT_TYPE(wxEVT_MEDIA_PLAY) +DEFINE_EVENT_TYPE(wxEVT_MEDIA_PAUSE) +IMPLEMENT_CLASS(wxMediaBackend, wxObject) +IMPLEMENT_DYNAMIC_CLASS(wxMediaEvent, wxEvent) +DEFINE_EVENT_TYPE(wxEVT_MEDIA_FINISHED) +DEFINE_EVENT_TYPE(wxEVT_MEDIA_LOADED) +DEFINE_EVENT_TYPE(wxEVT_MEDIA_STOP) + +//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// +// wxMediaCtrl +// +//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +//--------------------------------------------------------------------------- +// wxMediaBackend Destructor +// +// This is here because the DARWIN gcc compiler badly screwed up and +// needs the destructor implementation in the source +//--------------------------------------------------------------------------- +wxMediaBackend::~wxMediaBackend() +{ +} + +//--------------------------------------------------------------------------- +// wxMediaCtrl::Create (file version) +// wxMediaCtrl::Create (URL version) +// +// Searches for a backend that is installed on the system (backends +// starting with lower characters in the alphabet are given priority), +// and creates the control from it +// +// This searches by searching the global RTTI hashtable, class by class, +// attempting to call CreateControl on each one found that is a derivative +// of wxMediaBackend - if it succeeded Create returns true, otherwise +// it keeps iterating through the hashmap. +//--------------------------------------------------------------------------- +bool wxMediaCtrl::Create(wxWindow* parent, wxWindowID id, + const wxString& fileName, + const wxPoint& pos, + const wxSize& size, + long style, + const wxString& szBackend, + const wxValidator& validator, + const wxString& name) +{ + if(!szBackend.empty()) + { + wxClassInfo* pClassInfo = wxClassInfo::FindClass(szBackend); + + if(!pClassInfo || !DoCreate(pClassInfo, parent, id, + pos, size, style, validator, name)) + { + m_imp = NULL; + return false; + } + + if (!fileName.empty()) + { + if (!Load(fileName)) + { + delete m_imp; + m_imp = NULL; + return false; + } + } + + SetInitialSize(size); + return true; + } + else + { + wxClassInfo::sm_classTable->BeginFind(); + + wxClassInfo* classInfo; + + while((classInfo = NextBackend()) != NULL) + { + if(!DoCreate(classInfo, parent, id, + pos, size, style, validator, name)) + continue; + + if (!fileName.empty()) + { + if (Load(fileName)) + { + SetInitialSize(size); + return true; + } + else + delete m_imp; + } + else + { + SetInitialSize(size); + return true; + } + } + + m_imp = NULL; + return false; + } +} + +bool wxMediaCtrl::Create(wxWindow* parent, wxWindowID id, + const wxURI& location, + const wxPoint& pos, + const wxSize& size, + long style, + const wxString& szBackend, + const wxValidator& validator, + const wxString& name) +{ + if(!szBackend.empty()) + { + wxClassInfo* pClassInfo = wxClassInfo::FindClass(szBackend); + if(!pClassInfo || !DoCreate(pClassInfo, parent, id, + pos, size, style, validator, name)) + { + m_imp = NULL; + return false; + } + + if (!Load(location)) + { + delete m_imp; + m_imp = NULL; + return false; + } + + SetInitialSize(size); + return true; + } + else + { + wxClassInfo::sm_classTable->BeginFind(); + + wxClassInfo* classInfo; + + while((classInfo = NextBackend()) != NULL) + { + if(!DoCreate(classInfo, parent, id, + pos, size, style, validator, name)) + continue; + + if (Load(location)) + { + SetInitialSize(size); + return true; + } + else + delete m_imp; + } + + m_imp = NULL; + return false; + } +} + +//--------------------------------------------------------------------------- +// wxMediaCtrl::DoCreate +// +// Attempts to create the control from a backend +//--------------------------------------------------------------------------- +bool wxMediaCtrl::DoCreate(wxClassInfo* classInfo, + wxWindow* parent, wxWindowID id, + const wxPoint& pos, + const wxSize& size, + long style, + const wxValidator& validator, + const wxString& name) +{ + m_imp = (wxMediaBackend*)classInfo->CreateObject(); + + if( m_imp->CreateControl(this, parent, id, pos, size, + style, validator, name) ) + { + return true; + } + + delete m_imp; + return false; +} + +//--------------------------------------------------------------------------- +// wxMediaCtrl::NextBackend (static) +// +// +// Search through the RTTI hashmap one at a +// time, attempting to create each derivative +// of wxMediaBackend +// +// +// STL isn't compatible with and will have a compilation error +// on a wxNode, however, wxHashTable::compatibility_iterator is +// incompatible with the old 2.4 stable version - but since +// we're in 2.5+ only we don't need to worry about the new version +//--------------------------------------------------------------------------- +wxClassInfo* wxMediaCtrl::NextBackend() +{ + wxHashTable::compatibility_iterator + node = wxClassInfo::sm_classTable->Next(); + while (node) + { + wxClassInfo* classInfo = (wxClassInfo *)node->GetData(); + if ( classInfo->IsKindOf(CLASSINFO(wxMediaBackend)) && + classInfo != CLASSINFO(wxMediaBackend) ) + { + return classInfo; + } + node = wxClassInfo::sm_classTable->Next(); + } + + // + // Nope - couldn't successfully find one... fail + // + return NULL; +} + + +//--------------------------------------------------------------------------- +// wxMediaCtrl Destructor +// +// Free up the backend if it exists +//--------------------------------------------------------------------------- +wxMediaCtrl::~wxMediaCtrl() +{ + if (m_imp) + delete m_imp; +} + +//--------------------------------------------------------------------------- +// wxMediaCtrl::Load (file version) +// wxMediaCtrl::Load (URL version) +// wxMediaCtrl::Load (URL & Proxy version) +// wxMediaCtrl::Load (wxInputStream version) +// +// Here we call load of the backend - keeping +// track of whether it was successful or not - which +// will determine which later method calls work +//--------------------------------------------------------------------------- +bool wxMediaCtrl::Load(const wxString& fileName) +{ + if(m_imp) + return (m_bLoaded = m_imp->Load(fileName)); + return false; +} + +bool wxMediaCtrl::Load(const wxURI& location) +{ + if(m_imp) + return (m_bLoaded = m_imp->Load(location)); + return false; +} + +bool wxMediaCtrl::Load(const wxURI& location, const wxURI& proxy) +{ + if(m_imp) + return (m_bLoaded = m_imp->Load(location, proxy)); + return false; +} + +//--------------------------------------------------------------------------- +// wxMediaCtrl::Play +// wxMediaCtrl::Pause +// wxMediaCtrl::Stop +// wxMediaCtrl::GetPlaybackRate +// wxMediaCtrl::SetPlaybackRate +// wxMediaCtrl::Seek --> SetPosition +// wxMediaCtrl::Tell --> GetPosition +// wxMediaCtrl::Length --> GetDuration +// wxMediaCtrl::GetState +// wxMediaCtrl::DoGetBestSize +// wxMediaCtrl::SetVolume +// wxMediaCtrl::GetVolume +// wxMediaCtrl::ShowInterface +// wxMediaCtrl::GetDownloadProgress +// wxMediaCtrl::GetDownloadTotal +// +// 1) Check to see whether the backend exists and is loading +// 2) Call the backend's version of the method, returning success +// if the backend's version succeeds +//--------------------------------------------------------------------------- +bool wxMediaCtrl::Play() +{ + if(m_imp && m_bLoaded) + return m_imp->Play(); + return 0; +} + +bool wxMediaCtrl::Pause() +{ + if(m_imp && m_bLoaded) + return m_imp->Pause(); + return 0; +} + +bool wxMediaCtrl::Stop() +{ + if(m_imp && m_bLoaded) + return m_imp->Stop(); + return 0; +} + +double wxMediaCtrl::GetPlaybackRate() +{ + if(m_imp && m_bLoaded) + return m_imp->GetPlaybackRate(); + return 0; +} + +bool wxMediaCtrl::SetPlaybackRate(double dRate) +{ + if(m_imp && m_bLoaded) + return m_imp->SetPlaybackRate(dRate); + return false; +} + +wxFileOffset wxMediaCtrl::Seek(wxFileOffset where, wxSeekMode mode) +{ + wxFileOffset offset; + + switch (mode) + { + case wxFromStart: + offset = where; + break; + case wxFromEnd: + offset = Length() - where; + break; +// case wxFromCurrent: + default: + offset = Tell() + where; + break; + } + + if(m_imp && m_bLoaded && m_imp->SetPosition(offset)) + return offset; + return wxInvalidOffset; +} + +wxFileOffset wxMediaCtrl::Tell() +{ + if(m_imp && m_bLoaded) + return (wxFileOffset) m_imp->GetPosition().ToLong(); + return wxInvalidOffset; +} + +wxFileOffset wxMediaCtrl::Length() +{ + if(m_imp && m_bLoaded) + return (wxFileOffset) m_imp->GetDuration().ToLong(); + return wxInvalidOffset; +} + +wxMediaState wxMediaCtrl::GetState() +{ + if(m_imp && m_bLoaded) + return m_imp->GetState(); + return wxMEDIASTATE_STOPPED; +} + +wxSize wxMediaCtrl::DoGetBestSize() const +{ + if(m_imp) + return m_imp->GetVideoSize(); + return wxSize(0,0); +} + +double wxMediaCtrl::GetVolume() +{ + if(m_imp && m_bLoaded) + return m_imp->GetVolume(); + return 0.0; +} + +bool wxMediaCtrl::SetVolume(double dVolume) +{ + if(m_imp && m_bLoaded) + return m_imp->SetVolume(dVolume); + return false; +} + +bool wxMediaCtrl::ShowPlayerControls(wxMediaCtrlPlayerControls flags) +{ + if(m_imp) + return m_imp->ShowPlayerControls(flags); + return false; +} + +wxFileOffset wxMediaCtrl::GetDownloadProgress() +{ + if(m_imp && m_bLoaded) + return (wxFileOffset) m_imp->GetDownloadProgress().ToLong(); + return wxInvalidOffset; +} + +wxFileOffset wxMediaCtrl::GetDownloadTotal() +{ + if(m_imp && m_bLoaded) + return (wxFileOffset) m_imp->GetDownloadTotal().ToLong(); + return wxInvalidOffset; +} + +//--------------------------------------------------------------------------- +// wxMediaCtrl::DoMoveWindow +// +// 1) Call parent's version so that our control's window moves where +// it's supposed to +// 2) If the backend exists and is loaded, move the video +// of the media to where our control's window is now located +//--------------------------------------------------------------------------- +void wxMediaCtrl::DoMoveWindow(int x, int y, int w, int h) +{ + wxControl::DoMoveWindow(x,y,w,h); + + if(m_imp) + m_imp->Move(x, y, w, h); +} + +//--------------------------------------------------------------------------- +// wxMediaCtrl::MacVisibilityChanged +//--------------------------------------------------------------------------- +#ifdef __WXMAC__ +void wxMediaCtrl::MacVisibilityChanged() +{ + wxControl::MacVisibilityChanged(); + + if(m_imp) + m_imp->MacVisibilityChanged(); +} +#endif + +//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// +// wxMediaBackendCommonBase +// +//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +void wxMediaBackendCommonBase::NotifyMovieSizeChanged() +{ + // our best size changed after opening a new file + m_ctrl->InvalidateBestSize(); + m_ctrl->SetSize(m_ctrl->GetSize()); + + // if the parent of the control has a sizer ask it to refresh our size + wxWindow * const parent = m_ctrl->GetParent(); + if ( parent->GetSizer() ) + { + m_ctrl->GetParent()->Layout(); + m_ctrl->GetParent()->Refresh(); + m_ctrl->GetParent()->Update(); + } +} + +void wxMediaBackendCommonBase::NotifyMovieLoaded() +{ + NotifyMovieSizeChanged(); + + // notify about movie being fully loaded + QueueEvent(wxEVT_MEDIA_LOADED); +} + +bool wxMediaBackendCommonBase::SendStopEvent() +{ + wxMediaEvent theEvent(wxEVT_MEDIA_STOP, m_ctrl->GetId()); + + return !m_ctrl->ProcessEvent(theEvent) || theEvent.IsAllowed(); +} + +void wxMediaBackendCommonBase::QueueEvent(wxEventType evtType) +{ + wxMediaEvent theEvent(evtType, m_ctrl->GetId()); + m_ctrl->AddPendingEvent(theEvent); +} + +void wxMediaBackendCommonBase::QueuePlayEvent() +{ + QueueEvent(wxEVT_MEDIA_STATECHANGED); + QueueEvent(wxEVT_MEDIA_PLAY); +} + +void wxMediaBackendCommonBase::QueuePauseEvent() +{ + QueueEvent(wxEVT_MEDIA_STATECHANGED); + QueueEvent(wxEVT_MEDIA_PAUSE); +} + +void wxMediaBackendCommonBase::QueueStopEvent() +{ + QueueEvent(wxEVT_MEDIA_STATECHANGED); + QueueEvent(wxEVT_MEDIA_STOP); +} + + +// +// Force link default backends in - +// see http://wiki.wxwidgets.org/wiki.pl?RTTI +// +#include "wx/html/forcelnk.h" + +#ifdef __WXMSW__ // MSW has huge backends so we do it seperately +FORCE_LINK(wxmediabackend_am) +FORCE_LINK(wxmediabackend_wmp10) +#else +FORCE_LINK(basewxmediabackends) +#endif + +#endif //wxUSE_MEDIACTRL diff --git a/Externals/wxWidgets/src/common/memory.cpp b/Externals/wxWidgets/src/common/memory.cpp new file mode 100644 index 0000000000..d01f1a061c --- /dev/null +++ b/Externals/wxWidgets/src/common/memory.cpp @@ -0,0 +1,1148 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/memory.cpp +// Purpose: Memory checking implementation +// Author: Arthur Seaton, Julian Smart +// Modified by: +// Created: 04/01/98 +// RCS-ID: $Id: memory.cpp 41054 2006-09-07 19:01:45Z ABX $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if (defined(__WXDEBUG__) && wxUSE_MEMORY_TRACING) || wxUSE_DEBUG_CONTEXT + +#include "wx/memory.h" + +#ifndef WX_PRECOMP + #ifdef __WXMSW__ + #include "wx/msw/wrapwin.h" + #endif + #include "wx/utils.h" + #include "wx/app.h" + #include "wx/hash.h" + #include "wx/log.h" +#endif + +#if wxUSE_THREADS + #include "wx/thread.h" +#endif + +#include + +#include "wx/ioswrap.h" + +#if !defined(__WATCOMC__) && !(defined(__VMS__) && ( __VMS_VER < 70000000 ) )\ + && !defined( __MWERKS__ ) && !defined(__SALFORDC__) +#include +#endif + +#include +#include + +#if wxUSE_THREADS && defined(__WXDEBUG__) +#define USE_THREADSAFE_MEMORY_ALLOCATION 1 +#else +#define USE_THREADSAFE_MEMORY_ALLOCATION 0 +#endif + + +#ifdef new +#undef new +#endif + +// wxDebugContext wxTheDebugContext; +/* + Redefine new and delete so that we can pick up situations where: + - we overwrite or underwrite areas of malloc'd memory. + - we use uninitialise variables + Only do this in debug mode. + + We change new to get enough memory to allocate a struct, followed + by the caller's requested memory, followed by a tag. The struct + is used to create a doubly linked list of these areas and also + contains another tag. The tags are used to determine when the area + has been over/under written. +*/ + + +/* + Values which are used to set the markers which will be tested for + under/over write. There are 3 of these, one in the struct, one + immediately after the struct but before the caller requested memory and + one immediately after the requested memory. +*/ +#define MemStartCheck 0x23A8 +#define MemMidCheck 0xA328 +#define MemEndCheck 0x8A32 +#define MemFillChar 0xAF +#define MemStructId 0x666D + +/* + External interface for the wxMemStruct class. Others are + defined inline within the class def. Here we only need to be able + to add and delete nodes from the list and handle errors in some way. +*/ + +/* + Used for internal "this shouldn't happen" type of errors. +*/ +void wxMemStruct::ErrorMsg (const char * mesg) +{ + wxLogMessage(wxT("wxWidgets memory checking error: %s"), mesg); + PrintNode (); +} + +/* + Used when we find an overwrite or an underwrite error. +*/ +void wxMemStruct::ErrorMsg () +{ + wxLogMessage(wxT("wxWidgets over/underwrite memory error:")); + PrintNode (); +} + + +/* + We want to find out if pointers have been overwritten as soon as is + possible, so test everything before we dereference it. Of course it's still + quite possible that, if things have been overwritten, this function will + fall over, but the only way of dealing with that would cost too much in terms + of time. +*/ +int wxMemStruct::AssertList () +{ + if (wxDebugContext::GetHead () != 0 && ! (wxDebugContext::GetHead ())->AssertIt () || + wxDebugContext::GetTail () != 0 && ! wxDebugContext::GetTail ()->AssertIt ()) { + ErrorMsg ("Head or tail pointers trashed"); + return 0; + } + return 1; +} + + +/* + Check that the thing we're pointing to has the correct id for a wxMemStruct + object and also that it's previous and next pointers are pointing at objects + which have valid ids. + This is definitely not perfect since we could fall over just trying to access + any of the slots which we use here, but I think it's about the best that I + can do without doing something like taking all new wxMemStruct pointers and + comparing them against all known pointer within the list and then only + doing this sort of check _after_ you've found the pointer in the list. That + would be safer, but also much more time consuming. +*/ +int wxMemStruct::AssertIt () +{ + return (m_id == MemStructId && + (m_prev == 0 || m_prev->m_id == MemStructId) && + (m_next == 0 || m_next->m_id == MemStructId)); +} + + +/* + Additions are always at the tail of the list. + Returns 0 on error, non-zero on success. +*/ +int wxMemStruct::Append () +{ + if (! AssertList ()) + return 0; + + if (wxDebugContext::GetHead () == 0) { + if (wxDebugContext::GetTail () != 0) { + ErrorMsg ("Null list should have a null tail pointer"); + return 0; + } + (void) wxDebugContext::SetHead (this); + (void) wxDebugContext::SetTail (this); + } else { + wxDebugContext::GetTail ()->m_next = this; + this->m_prev = wxDebugContext::GetTail (); + (void) wxDebugContext::SetTail (this); + } + return 1; +} + + +/* + Don't actually free up anything here as the space which is used + by the node will be free'd up when the whole block is free'd. + Returns 0 on error, non-zero on success. +*/ +int wxMemStruct::Unlink () +{ + if (! AssertList ()) + return 0; + + if (wxDebugContext::GetHead () == 0 || wxDebugContext::GetTail () == 0) { + ErrorMsg ("Trying to remove node from empty list"); + return 0; + } + + // Handle the part of the list before this node. + if (m_prev == 0) { + if (this != wxDebugContext::GetHead ()) { + ErrorMsg ("No previous node for non-head node"); + return 0; + } + (void) wxDebugContext::SetHead (m_next); + } else { + if (! m_prev->AssertIt ()) { + ErrorMsg ("Trashed previous pointer"); + return 0; + } + + if (m_prev->m_next != this) { + ErrorMsg ("List is inconsistent"); + return 0; + } + m_prev->m_next = m_next; + } + + // Handle the part of the list after this node. + if (m_next == 0) { + if (this != wxDebugContext::GetTail ()) { + ErrorMsg ("No next node for non-tail node"); + return 0; + } + (void) wxDebugContext::SetTail (m_prev); + } else { + if (! m_next->AssertIt ()) { + ErrorMsg ("Trashed next pointer"); + return 0; + } + + if (m_next->m_prev != this) { + ErrorMsg ("List is inconsistent"); + return 0; + } + m_next->m_prev = m_prev; + } + + return 1; +} + + + +/* + Checks a node and block of memory to see that the markers are still + intact. +*/ +int wxMemStruct::CheckBlock () +{ + int nFailures = 0; + + if (m_firstMarker != MemStartCheck) { + nFailures++; + ErrorMsg (); + } + + char * pointer = wxDebugContext::MidMarkerPos ((char *) this); + if (* (wxMarkerType *) pointer != MemMidCheck) { + nFailures++; + ErrorMsg (); + } + + pointer = wxDebugContext::EndMarkerPos ((char *) this, RequestSize ()); + if (* (wxMarkerType *) pointer != MemEndCheck) { + nFailures++; + ErrorMsg (); + } + + return nFailures; +} + + +/* + Check the list of nodes to see if they are all ok. +*/ +int wxMemStruct::CheckAllPrevious () +{ + int nFailures = 0; + + for (wxMemStruct * st = this->m_prev; st != 0; st = st->m_prev) { + if (st->AssertIt ()) + nFailures += st->CheckBlock (); + else + return -1; + } + + return nFailures; +} + + +/* + When we delete a node we set the id slot to a specific value and then test + against this to see if a nodes have been deleted previously. I don't + just set the entire memory to the fillChar because then I'd be overwriting + useful stuff like the vtbl which may be needed to output the error message + including the file name and line numbers. Without this info the whole point + of this class is lost! +*/ +void wxMemStruct::SetDeleted () +{ + m_id = MemFillChar; +} + +int wxMemStruct::IsDeleted () +{ + return (m_id == MemFillChar); +} + + +/* + Print out a single node. There are many far better ways of doing this + but this will suffice for now. +*/ +void wxMemStruct::PrintNode () +{ + if (m_isObject) + { + wxObject *obj = (wxObject *)m_actualData; + wxClassInfo *info = obj->GetClassInfo(); + + // Let's put this in standard form so IDEs can load the file at the appropriate + // line + wxString msg; + + if (m_fileName) + msg.Printf(wxT("%s(%d): "), m_fileName, (int)m_lineNum); + + if (info && info->GetClassName()) + msg += info->GetClassName(); + else + msg += wxT("object"); + + wxString msg2; + msg2.Printf(wxT(" at 0x%lX, size %d"), (long)GetActualData(), (int)RequestSize()); + msg += msg2; + + wxLogMessage(msg); + } + else + { + wxString msg; + + if (m_fileName) + msg.Printf(wxT("%s(%d): "), m_fileName, (int)m_lineNum); + msg += wxT("non-object data"); + wxString msg2; + msg2.Printf(wxT(" at 0x%lX, size %d\n"), (long)GetActualData(), (int)RequestSize()); + msg += msg2; + + wxLogMessage(msg); + } +} + +void wxMemStruct::Dump () +{ + if (!ValidateNode()) return; + + if (m_isObject) + { + wxObject *obj = (wxObject *)m_actualData; + + wxString msg; + if (m_fileName) + msg.Printf(wxT("%s(%d): "), m_fileName, (int)m_lineNum); + + + /* TODO: We no longer have a stream (using wxLogDebug) so we can't dump it. + * Instead, do what wxObject::Dump does. + * What should we do long-term, eliminate Dumping? Or specify + * that MyClass::Dump should use wxLogDebug? Ugh. + obj->Dump(wxDebugContext::GetStream()); + */ + + if (obj->GetClassInfo() && obj->GetClassInfo()->GetClassName()) + msg += obj->GetClassInfo()->GetClassName(); + else + msg += wxT("unknown object class"); + + wxString msg2; + msg2.Printf(wxT(" at 0x%lX, size %d"), (long)GetActualData(), (int)RequestSize()); + msg += msg2; + + wxDebugContext::OutputDumpLine(msg); + } + else + { + wxString msg; + if (m_fileName) + msg.Printf(wxT("%s(%d): "), m_fileName, (int)m_lineNum); + + wxString msg2; + msg2.Printf(wxT("non-object data at 0x%lX, size %d"), (long)GetActualData(), (int)RequestSize() ); + msg += msg2; + wxDebugContext::OutputDumpLine(msg); + } +} + + +/* + Validate a node. Check to see that the node is "clean" in the sense + that nothing has over/underwritten it etc. +*/ +int wxMemStruct::ValidateNode () +{ + char * startPointer = (char *) this; + if (!AssertIt ()) { + if (IsDeleted ()) + ErrorMsg ("Object already deleted"); + else { + // Can't use the error routines as we have no recognisable object. +#ifndef __WXGTK__ + wxLogMessage(wxT("Can't verify memory struct - all bets are off!")); +#endif + } + return 0; + } + +/* + int i; + for (i = 0; i < wxDebugContext::TotSize (requestSize ()); i++) + cout << startPointer [i]; + cout << endl; +*/ + if (Marker () != MemStartCheck) + ErrorMsg (); + if (* (wxMarkerType *) wxDebugContext::MidMarkerPos (startPointer) != MemMidCheck) + ErrorMsg (); + if (* (wxMarkerType *) wxDebugContext::EndMarkerPos (startPointer, + RequestSize ()) != + MemEndCheck) + ErrorMsg (); + + // Back to before the extra buffer and check that + // we can still read what we originally wrote. + if (Marker () != MemStartCheck || + * (wxMarkerType *) wxDebugContext::MidMarkerPos (startPointer) + != MemMidCheck || + * (wxMarkerType *) wxDebugContext::EndMarkerPos (startPointer, + RequestSize ()) != MemEndCheck) + { + ErrorMsg (); + return 0; + } + + return 1; +} + +/* + The wxDebugContext class. +*/ + +wxMemStruct *wxDebugContext::m_head = NULL; +wxMemStruct *wxDebugContext::m_tail = NULL; + +bool wxDebugContext::m_checkPrevious = false; +int wxDebugContext::debugLevel = 1; +bool wxDebugContext::debugOn = true; +wxMemStruct *wxDebugContext::checkPoint = NULL; + +// For faster alignment calculation +static wxMarkerType markerCalc[2]; +int wxDebugContext::m_balign = (int)((char *)&markerCalc[1] - (char*)&markerCalc[0]); +int wxDebugContext::m_balignmask = (int)((char *)&markerCalc[1] - (char*)&markerCalc[0]) - 1; + +wxDebugContext::wxDebugContext(void) +{ +} + +wxDebugContext::~wxDebugContext(void) +{ +} + +/* + Work out the positions of the markers by creating an array of 2 markers + and comparing the addresses of the 2 elements. Use this number as the + alignment for markers. +*/ +size_t wxDebugContext::CalcAlignment () +{ + wxMarkerType ar[2]; + return (char *) &ar[1] - (char *) &ar[0]; +} + + +char * wxDebugContext::StructPos (const char * buf) +{ + return (char *) buf; +} + +char * wxDebugContext::MidMarkerPos (const char * buf) +{ + return StructPos (buf) + PaddedSize (sizeof (wxMemStruct)); +} + +char * wxDebugContext::CallerMemPos (const char * buf) +{ + return MidMarkerPos (buf) + PaddedSize (sizeof(wxMarkerType)); +} + + +char * wxDebugContext::EndMarkerPos (const char * buf, const size_t size) +{ + return CallerMemPos (buf) + PaddedSize (size); +} + + +/* + Slightly different as this takes a pointer to the start of the caller + requested region and returns a pointer to the start of the buffer. + */ +char * wxDebugContext::StartPos (const char * caller) +{ + return ((char *) (caller - wxDebugContext::PaddedSize (sizeof(wxMarkerType)) - + wxDebugContext::PaddedSize (sizeof (wxMemStruct)))); +} + +/* + We may need padding between various parts of the allocated memory. + Given a size of memory, this returns the amount of memory which should + be allocated in order to allow for alignment of the following object. + + I don't know how portable this stuff is, but it seems to work for me at + the moment. It would be real nice if I knew more about this! + + // Note: this function is now obsolete (along with CalcAlignment) + // because the calculations are done statically, for greater speed. +*/ +size_t wxDebugContext::GetPadding (const size_t size) +{ + size_t pad = size % CalcAlignment (); + return (pad) ? sizeof(wxMarkerType) - pad : 0; +} + +size_t wxDebugContext::PaddedSize (const size_t size) +{ + // Added by Terry Farnham to replace + // slow GetPadding call. + int padb; + + padb = size & m_balignmask; + if(padb) + return(size + m_balign - padb); + else + return(size); +} + +/* + Returns the total amount of memory which we need to get from the system + in order to satisfy a caller request. This includes space for the struct + plus markers and the caller's memory as well. +*/ +size_t wxDebugContext::TotSize (const size_t reqSize) +{ + return (PaddedSize (sizeof (wxMemStruct)) + PaddedSize (reqSize) + + 2 * sizeof(wxMarkerType)); +} + + +/* + Traverse the list of nodes executing the given function on each node. +*/ +void wxDebugContext::TraverseList (PmSFV func, wxMemStruct *from) +{ + if (!from) + from = wxDebugContext::GetHead (); + + wxMemStruct * st = NULL; + for (st = from; st != 0; st = st->m_next) + { + void* data = st->GetActualData(); +// if ((data != (void*)m_debugStream) && (data != (void*) m_streamBuf)) + if (data != (void*) wxLog::GetActiveTarget()) + { + (st->*func) (); + } + } +} + + +/* + Print out the list. + */ +bool wxDebugContext::PrintList (void) +{ +#ifdef __WXDEBUG__ + TraverseList ((PmSFV)&wxMemStruct::PrintNode, (checkPoint ? checkPoint->m_next : (wxMemStruct*)NULL)); + + return true; +#else + return false; +#endif +} + +bool wxDebugContext::Dump(void) +{ +#ifdef __WXDEBUG__ + { + wxChar* appName = (wxChar*) wxT("application"); + wxString appNameStr; + if (wxTheApp) + { + appNameStr = wxTheApp->GetAppName(); + appName = WXSTRINGCAST appNameStr; + OutputDumpLine(wxT("----- Memory dump of %s at %s -----"), appName, WXSTRINGCAST wxNow() ); + } + else + { + OutputDumpLine( wxT("----- Memory dump -----") ); + } + } + + TraverseList ((PmSFV)&wxMemStruct::Dump, (checkPoint ? checkPoint->m_next : (wxMemStruct*)NULL)); + + OutputDumpLine(wxEmptyString); + OutputDumpLine(wxEmptyString); + + return true; +#else + return false; +#endif +} + +#ifdef __WXDEBUG__ +struct wxDebugStatsStruct +{ + long instanceCount; + long totalSize; + wxChar *instanceClass; + wxDebugStatsStruct *next; +}; + +static wxDebugStatsStruct *FindStatsStruct(wxDebugStatsStruct *st, wxChar *name) +{ + while (st) + { + if (wxStrcmp(st->instanceClass, name) == 0) + return st; + st = st->next; + } + return NULL; +} + +static wxDebugStatsStruct *InsertStatsStruct(wxDebugStatsStruct *head, wxDebugStatsStruct *st) +{ + st->next = head; + return st; +} +#endif + +bool wxDebugContext::PrintStatistics(bool detailed) +{ +#ifdef __WXDEBUG__ + { + wxChar* appName = (wxChar*) wxT("application"); + wxString appNameStr; + if (wxTheApp) + { + appNameStr = wxTheApp->GetAppName(); + appName = WXSTRINGCAST appNameStr; + OutputDumpLine(wxT("----- Memory statistics of %s at %s -----"), appName, WXSTRINGCAST wxNow() ); + } + else + { + OutputDumpLine( wxT("----- Memory statistics -----") ); + } + } + + bool currentMode = GetDebugMode(); + SetDebugMode(false); + + long noNonObjectNodes = 0; + long noObjectNodes = 0; + long totalSize = 0; + + wxDebugStatsStruct *list = NULL; + + wxMemStruct *from = (checkPoint ? checkPoint->m_next : (wxMemStruct*)NULL ); + if (!from) + from = wxDebugContext::GetHead (); + + wxMemStruct *st; + for (st = from; st != 0; st = st->m_next) + { + void* data = st->GetActualData(); + if (detailed && (data != (void*) wxLog::GetActiveTarget())) + { + wxChar *className = (wxChar*) wxT("nonobject"); + if (st->m_isObject && st->GetActualData()) + { + wxObject *obj = (wxObject *)st->GetActualData(); + if (obj->GetClassInfo()->GetClassName()) + className = (wxChar*)obj->GetClassInfo()->GetClassName(); + } + wxDebugStatsStruct *stats = FindStatsStruct(list, className); + if (!stats) + { + stats = (wxDebugStatsStruct *)malloc(sizeof(wxDebugStatsStruct)); + stats->instanceClass = className; + stats->instanceCount = 0; + stats->totalSize = 0; + list = InsertStatsStruct(list, stats); + } + stats->instanceCount ++; + stats->totalSize += st->RequestSize(); + } + + if (data != (void*) wxLog::GetActiveTarget()) + { + totalSize += st->RequestSize(); + if (st->m_isObject) + noObjectNodes ++; + else + noNonObjectNodes ++; + } + } + + if (detailed) + { + while (list) + { + OutputDumpLine(wxT("%ld objects of class %s, total size %ld"), + list->instanceCount, list->instanceClass, list->totalSize); + wxDebugStatsStruct *old = list; + list = old->next; + free((char *)old); + } + OutputDumpLine(wxEmptyString); + } + + SetDebugMode(currentMode); + + OutputDumpLine(wxT("Number of object items: %ld"), noObjectNodes); + OutputDumpLine(wxT("Number of non-object items: %ld"), noNonObjectNodes); + OutputDumpLine(wxT("Total allocated size: %ld"), totalSize); + OutputDumpLine(wxEmptyString); + OutputDumpLine(wxEmptyString); + + return true; +#else + (void)detailed; + return false; +#endif +} + +bool wxDebugContext::PrintClasses(void) +{ + { + wxChar* appName = (wxChar*) wxT("application"); + wxString appNameStr; + if (wxTheApp) + { + appNameStr = wxTheApp->GetAppName(); + appName = WXSTRINGCAST appNameStr; + wxLogMessage(wxT("----- Classes in %s -----"), appName); + } + } + + int n = 0; + wxHashTable::compatibility_iterator node; + wxClassInfo *info; + + wxClassInfo::sm_classTable->BeginFind(); + node = wxClassInfo::sm_classTable->Next(); + while (node) + { + info = (wxClassInfo *)node->GetData(); + if (info->GetClassName()) + { + wxString msg(info->GetClassName()); + msg += wxT(" "); + + if (info->GetBaseClassName1() && !info->GetBaseClassName2()) + { + msg += wxT("is a "); + msg += info->GetBaseClassName1(); + } + else if (info->GetBaseClassName1() && info->GetBaseClassName2()) + { + msg += wxT("is a "); + msg += info->GetBaseClassName1() ; + msg += wxT(", "); + msg += info->GetBaseClassName2() ; + } + if (info->GetConstructor()) + msg += wxT(": dynamic"); + + wxLogMessage(msg); + } + node = wxClassInfo::sm_classTable->Next(); + n ++; + } + wxLogMessage(wxEmptyString); + wxLogMessage(wxT("There are %d classes derived from wxObject."), n); + wxLogMessage(wxEmptyString); + wxLogMessage(wxEmptyString); + return true; +} + +void wxDebugContext::SetCheckpoint(bool all) +{ + if (all) + checkPoint = NULL; + else + checkPoint = m_tail; +} + +// Checks all nodes since checkpoint, or since start. +int wxDebugContext::Check(bool checkAll) +{ + int nFailures = 0; + + wxMemStruct *from = (checkPoint ? checkPoint->m_next : (wxMemStruct*)NULL ); + if (!from || checkAll) + from = wxDebugContext::GetHead (); + + for (wxMemStruct * st = from; st != 0; st = st->m_next) + { + if (st->AssertIt ()) + nFailures += st->CheckBlock (); + else + return -1; + } + + return nFailures; +} + +// Count the number of non-wxDebugContext-related objects +// that are outstanding +int wxDebugContext::CountObjectsLeft(bool sinceCheckpoint) +{ + int n = 0; + + wxMemStruct *from = NULL; + if (sinceCheckpoint && checkPoint) + from = checkPoint->m_next; + else + from = wxDebugContext::GetHead () ; + + for (wxMemStruct * st = from; st != 0; st = st->m_next) + { + void* data = st->GetActualData(); + if (data != (void*) wxLog::GetActiveTarget()) + n ++; + } + + return n ; +} + +// This function is used to output the dump +void wxDebugContext::OutputDumpLine(const wxChar *szFormat, ...) +{ + // a buffer of 2048 bytes should be long enough for a file name + // and a class name + wxChar buf[2048]; + int count; + va_list argptr; + va_start(argptr, szFormat); + buf[sizeof(buf)/sizeof(wxChar)-1] = _T('\0'); + + // keep 3 bytes for a \r\n\0 + count = wxVsnprintf(buf, sizeof(buf)/sizeof(wxChar)-3, szFormat, argptr); + + if ( count < 0 ) + count = sizeof(buf)/sizeof(wxChar)-3; + buf[count]=_T('\r'); + buf[count+1]=_T('\n'); + buf[count+2]=_T('\0'); + + wxMessageOutputDebug dbgout; + dbgout.Printf(buf); +} + + +#if USE_THREADSAFE_MEMORY_ALLOCATION +static bool memSectionOk = false; + +class MemoryCriticalSection : public wxCriticalSection +{ +public: + MemoryCriticalSection() { + memSectionOk = true; + } + ~MemoryCriticalSection() { + memSectionOk = false; + } +}; + +class MemoryCriticalSectionLocker +{ +public: + inline MemoryCriticalSectionLocker(wxCriticalSection& critsect) + : m_critsect(critsect), m_locked(memSectionOk) { if(m_locked) m_critsect.Enter(); } + inline ~MemoryCriticalSectionLocker() { if(m_locked) m_critsect.Leave(); } + +private: + // no assignment operator nor copy ctor + MemoryCriticalSectionLocker(const MemoryCriticalSectionLocker&); + MemoryCriticalSectionLocker& operator=(const MemoryCriticalSectionLocker&); + + wxCriticalSection& m_critsect; + bool m_locked; +}; + +static MemoryCriticalSection memLocker; + +#endif // USE_THREADSAFE_MEMORY_ALLOCATION + + +#ifdef __WXDEBUG__ +#if !(defined(__WXMSW__) && (defined(WXUSINGDLL) || defined(WXMAKINGDLL_BASE))) +#if wxUSE_GLOBAL_MEMORY_OPERATORS +void * operator new (size_t size, wxChar * fileName, int lineNum) +{ + return wxDebugAlloc(size, fileName, lineNum, false, false); +} + +void * operator new (size_t size) +{ + return wxDebugAlloc(size, NULL, 0, false); +} + +void operator delete (void * buf) +{ + wxDebugFree(buf, false); +} + +#if wxUSE_ARRAY_MEMORY_OPERATORS +void * operator new[] (size_t size) +{ + return wxDebugAlloc(size, NULL, 0, false, true); +} + +void * operator new[] (size_t size, wxChar * fileName, int lineNum) +{ + return wxDebugAlloc(size, fileName, lineNum, false, true); +} + +void operator delete[] (void * buf) +{ + wxDebugFree(buf, true); +} +#endif // wxUSE_ARRAY_MEMORY_OPERATORS +#endif // wxUSE_GLOBAL_MEMORY_OPERATORS +#endif // !(defined(__WXMSW__) && (defined(WXUSINGDLL) || defined(WXMAKINGDLL_BASE))) + +// TODO: store whether this is a vector or not. +void * wxDebugAlloc(size_t size, wxChar * fileName, int lineNum, bool isObject, bool WXUNUSED(isVect) ) +{ +#if USE_THREADSAFE_MEMORY_ALLOCATION + MemoryCriticalSectionLocker lock(memLocker); +#endif + + // If not in debugging allocation mode, do the normal thing + // so we don't leave any trace of ourselves in the node list. + +#if defined(__VISAGECPP__) && (__IBMCPP__ < 400 || __IBMC__ < 400 ) +// VA 3.0 still has trouble in here + return (void *)malloc(size); +#endif + if (!wxDebugContext::GetDebugMode()) + { + return (void *)malloc(size); + } + + int totSize = wxDebugContext::TotSize (size); + char * buf = (char *) malloc(totSize); + if (!buf) { + wxLogMessage(wxT("Call to malloc (%ld) failed."), (long)size); + return 0; + } + wxMemStruct * st = (wxMemStruct *)buf; + st->m_firstMarker = MemStartCheck; + st->m_reqSize = size; + st->m_fileName = fileName; + st->m_lineNum = lineNum; + st->m_id = MemStructId; + st->m_prev = 0; + st->m_next = 0; + st->m_isObject = isObject; + + // Errors from Append() shouldn't really happen - but just in case! + if (st->Append () == 0) { + st->ErrorMsg ("Trying to append new node"); + } + + if (wxDebugContext::GetCheckPrevious ()) { + if (st->CheckAllPrevious () < 0) { + st->ErrorMsg ("Checking previous nodes"); + } + } + + // Set up the extra markers at the middle and end. + char * ptr = wxDebugContext::MidMarkerPos (buf); + * (wxMarkerType *) ptr = MemMidCheck; + ptr = wxDebugContext::EndMarkerPos (buf, size); + * (wxMarkerType *) ptr = MemEndCheck; + + // pointer returned points to the start of the caller's + // usable area. + void *m_actualData = (void *) wxDebugContext::CallerMemPos (buf); + st->m_actualData = m_actualData; + + return m_actualData; +} + +// TODO: check whether was allocated as a vector +void wxDebugFree(void * buf, bool WXUNUSED(isVect) ) +{ +#if USE_THREADSAFE_MEMORY_ALLOCATION + MemoryCriticalSectionLocker lock(memLocker); +#endif + + if (!buf) + return; + +#if defined(__VISAGECPP__) && (__IBMCPP__ < 400 || __IBMC__ < 400 ) +// VA 3.0 still has trouble in here + free((char *)buf); +#endif + // If not in debugging allocation mode, do the normal thing + // so we don't leave any trace of ourselves in the node list. + if (!wxDebugContext::GetDebugMode()) + { + free((char *)buf); + return; + } + + // Points to the start of the entire allocated area. + char * startPointer = wxDebugContext::StartPos ((char *) buf); + // Find the struct and make sure that it's identifiable. + wxMemStruct * st = (wxMemStruct *) wxDebugContext::StructPos (startPointer); + + if (! st->ValidateNode ()) + return; + + // If this is the current checkpoint, we need to + // move the checkpoint back so it points to a valid + // node. + if (st == wxDebugContext::checkPoint) + wxDebugContext::checkPoint = wxDebugContext::checkPoint->m_prev; + + if (! st->Unlink ()) + { + st->ErrorMsg ("Unlinking deleted node"); + } + + // Now put in the fill char into the id slot and the caller requested + // memory locations. + st->SetDeleted (); + (void) memset (wxDebugContext::CallerMemPos (startPointer), MemFillChar, + st->RequestSize ()); + + free((char *)st); +} + +#endif // __WXDEBUG__ + +// Trace: send output to the current debugging stream +void wxTrace(const wxChar * ...) +{ +#if 1 + wxFAIL_MSG(wxT("wxTrace is now obsolete. Please use wxDebugXXX instead.")); +#else + va_list ap; + static wxChar buffer[512]; + + va_start(ap, fmt); + +#ifdef __WXMSW__ + wvsprintf(buffer,fmt,ap) ; +#else + vsprintf(buffer,fmt,ap) ; +#endif + + va_end(ap); + + if (wxDebugContext::HasStream()) + { + wxDebugContext::GetStream() << buffer; + wxDebugContext::GetStream().flush(); + } + else +#ifdef __WXMSW__ +#ifdef __WIN32__ + OutputDebugString((LPCTSTR)buffer) ; +#else + OutputDebugString((const char*) buffer) ; +#endif +#else + fprintf(stderr, buffer); +#endif +#endif +} + +// Trace with level +void wxTraceLevel(int, const wxChar * ...) +{ +#if 1 + wxFAIL_MSG(wxT("wxTrace is now obsolete. Please use wxDebugXXX instead.")); +#else + if (wxDebugContext::GetLevel() < level) + return; + + va_list ap; + static wxChar buffer[512]; + + va_start(ap, fmt); + +#ifdef __WXMSW__ + wxWvsprintf(buffer,fmt,ap) ; +#else + vsprintf(buffer,fmt,ap) ; +#endif + + va_end(ap); + + if (wxDebugContext::HasStream()) + { + wxDebugContext::GetStream() << buffer; + wxDebugContext::GetStream().flush(); + } + else +#ifdef __WXMSW__ +#ifdef __WIN32__ + OutputDebugString((LPCTSTR)buffer) ; +#else + OutputDebugString((const char*) buffer) ; +#endif +#else + fprintf(stderr, buffer); +#endif +#endif +} + +//---------------------------------------------------------------------------- +// Final cleanup after all global objects in all files have been destroyed +//---------------------------------------------------------------------------- + +// Don't set it to 0 by dynamic initialization +// Some compilers will really do the assignment later +// All global variables are initialized to 0 at the very beginning, and this is just fine. +int wxDebugContextDumpDelayCounter::sm_count; + +void wxDebugContextDumpDelayCounter::DoDump() +{ + if (wxDebugContext::CountObjectsLeft(true) > 0) + { + wxDebugContext::OutputDumpLine(wxT("There were memory leaks.\n")); + wxDebugContext::Dump(); + wxDebugContext::PrintStatistics(); + } +} + +// Even if there is nothing else, make sure that there is at +// least one cleanup counter object +static wxDebugContextDumpDelayCounter wxDebugContextDumpDelayCounter_One; + +#endif // (defined(__WXDEBUG__) && wxUSE_MEMORY_TRACING) || wxUSE_DEBUG_CONTEXT diff --git a/Externals/wxWidgets/src/common/menucmn.cpp b/Externals/wxWidgets/src/common/menucmn.cpp new file mode 100644 index 0000000000..e018b08ada --- /dev/null +++ b/Externals/wxWidgets/src/common/menucmn.cpp @@ -0,0 +1,1167 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/common/menucmn.cpp +// Purpose: wxMenu and wxMenuBar methods common to all ports +// Author: Vadim Zeitlin +// Modified by: +// Created: 26.10.99 +// RCS-ID: $Id: menucmn.cpp 48053 2007-08-13 17:07:01Z JS $ +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_MENUS + +#include + +#ifndef WX_PRECOMP + #include "wx/intl.h" + #include "wx/log.h" + #include "wx/menu.h" +#endif + +#include "wx/stockitem.h" + +// ---------------------------------------------------------------------------- +// template lists +// ---------------------------------------------------------------------------- + +#include "wx/listimpl.cpp" + +WX_DEFINE_LIST(wxMenuList) +WX_DEFINE_LIST(wxMenuItemList) + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxAcceleratorEntry +// ---------------------------------------------------------------------------- + + +#if wxUSE_ACCEL + +static const struct wxKeyName +{ + wxKeyCode code; + const wxChar *name; +} wxKeyNames[] = +{ + { WXK_DELETE, wxTRANSLATE("DEL") }, + { WXK_DELETE, wxTRANSLATE("DELETE") }, + { WXK_BACK, wxTRANSLATE("BACK") }, + { WXK_INSERT, wxTRANSLATE("INS") }, + { WXK_INSERT, wxTRANSLATE("INSERT") }, + { WXK_RETURN, wxTRANSLATE("ENTER") }, + { WXK_RETURN, wxTRANSLATE("RETURN") }, + { WXK_PAGEUP, wxTRANSLATE("PGUP") }, + { WXK_PAGEDOWN, wxTRANSLATE("PGDN") }, + { WXK_LEFT, wxTRANSLATE("LEFT") }, + { WXK_RIGHT, wxTRANSLATE("RIGHT") }, + { WXK_UP, wxTRANSLATE("UP") }, + { WXK_DOWN, wxTRANSLATE("DOWN") }, + { WXK_HOME, wxTRANSLATE("HOME") }, + { WXK_END, wxTRANSLATE("END") }, + { WXK_SPACE, wxTRANSLATE("SPACE") }, + { WXK_TAB, wxTRANSLATE("TAB") }, + { WXK_ESCAPE, wxTRANSLATE("ESC") }, + { WXK_ESCAPE, wxTRANSLATE("ESCAPE") }, + { WXK_CANCEL, wxTRANSLATE("CANCEL") }, + { WXK_CLEAR, wxTRANSLATE("CLEAR") }, + { WXK_MENU, wxTRANSLATE("MENU") }, + { WXK_PAUSE, wxTRANSLATE("PAUSE") }, + { WXK_CAPITAL, wxTRANSLATE("CAPITAL") }, + { WXK_SELECT, wxTRANSLATE("SELECT") }, + { WXK_PRINT, wxTRANSLATE("PRINT") }, + { WXK_EXECUTE, wxTRANSLATE("EXECUTE") }, + { WXK_SNAPSHOT, wxTRANSLATE("SNAPSHOT") }, + { WXK_HELP, wxTRANSLATE("HELP") }, + { WXK_ADD, wxTRANSLATE("ADD") }, + { WXK_SEPARATOR, wxTRANSLATE("SEPARATOR") }, + { WXK_SUBTRACT, wxTRANSLATE("SUBTRACT") }, + { WXK_DECIMAL, wxTRANSLATE("DECIMAL") }, + { WXK_DIVIDE, wxTRANSLATE("DIVIDE") }, + { WXK_NUMLOCK, wxTRANSLATE("NUM_LOCK") }, + { WXK_SCROLL, wxTRANSLATE("SCROLL_LOCK") }, + { WXK_PAGEUP, wxTRANSLATE("PAGEUP") }, + { WXK_PAGEDOWN, wxTRANSLATE("PAGEDOWN") }, + { WXK_NUMPAD_SPACE, wxTRANSLATE("KP_SPACE") }, + { WXK_NUMPAD_TAB, wxTRANSLATE("KP_TAB") }, + { WXK_NUMPAD_ENTER, wxTRANSLATE("KP_ENTER") }, + { WXK_NUMPAD_HOME, wxTRANSLATE("KP_HOME") }, + { WXK_NUMPAD_LEFT, wxTRANSLATE("KP_LEFT") }, + { WXK_NUMPAD_UP, wxTRANSLATE("KP_UP") }, + { WXK_NUMPAD_RIGHT, wxTRANSLATE("KP_RIGHT") }, + { WXK_NUMPAD_DOWN, wxTRANSLATE("KP_DOWN") }, + { WXK_NUMPAD_PAGEUP, wxTRANSLATE("KP_PRIOR") }, + { WXK_NUMPAD_PAGEUP, wxTRANSLATE("KP_PAGEUP") }, + { WXK_NUMPAD_PAGEDOWN, wxTRANSLATE("KP_NEXT") }, + { WXK_NUMPAD_PAGEDOWN, wxTRANSLATE("KP_PAGEDOWN") }, + { WXK_NUMPAD_END, wxTRANSLATE("KP_END") }, + { WXK_NUMPAD_BEGIN, wxTRANSLATE("KP_BEGIN") }, + { WXK_NUMPAD_INSERT, wxTRANSLATE("KP_INSERT") }, + { WXK_NUMPAD_DELETE, wxTRANSLATE("KP_DELETE") }, + { WXK_NUMPAD_EQUAL, wxTRANSLATE("KP_EQUAL") }, + { WXK_NUMPAD_MULTIPLY, wxTRANSLATE("KP_MULTIPLY") }, + { WXK_NUMPAD_ADD, wxTRANSLATE("KP_ADD") }, + { WXK_NUMPAD_SEPARATOR, wxTRANSLATE("KP_SEPARATOR") }, + { WXK_NUMPAD_SUBTRACT, wxTRANSLATE("KP_SUBTRACT") }, + { WXK_NUMPAD_DECIMAL, wxTRANSLATE("KP_DECIMAL") }, + { WXK_NUMPAD_DIVIDE, wxTRANSLATE("KP_DIVIDE") }, + { WXK_WINDOWS_LEFT, wxTRANSLATE("WINDOWS_LEFT") }, + { WXK_WINDOWS_RIGHT, wxTRANSLATE("WINDOWS_RIGHT") }, + { WXK_WINDOWS_MENU, wxTRANSLATE("WINDOWS_MENU") }, + { WXK_COMMAND, wxTRANSLATE("COMMAND") }, +}; + +// return true if the 2 strings refer to the same accel +// +// as accels can be either translated or not, check for both possibilities and +// also compare case-insensitively as the key names case doesn't count +static inline bool CompareAccelString(const wxString& str, const wxChar *accel) +{ + return str.CmpNoCase(accel) == 0 +#if wxUSE_INTL + || str.CmpNoCase(wxGetTranslation(accel)) == 0 +#endif + ; +} + +// return prefixCode+number if the string is of the form "" and +// 0 if it isn't +// +// first and last parameter specify the valid domain for "number" part +static int + IsNumberedAccelKey(const wxString& str, + const wxChar *prefix, + wxKeyCode prefixCode, + unsigned first, + unsigned last) +{ + const size_t lenPrefix = wxStrlen(prefix); + if ( !CompareAccelString(str.Left(lenPrefix), prefix) ) + return 0; + + unsigned long num; + if ( !str.Mid(lenPrefix).ToULong(&num) ) + return 0; + + if ( num < first || num > last ) + { + // this must be a mistake, chances that this is a valid name of another + // key are vanishingly small + wxLogDebug(_T("Invalid key string \"%s\""), str.c_str()); + return 0; + } + + return prefixCode + num - first; +} + +/* static */ +bool +wxAcceleratorEntry::ParseAccel(const wxString& text, int *flagsOut, int *keyOut) +{ + // the parser won't like trailing spaces + wxString label = text; + label.Trim(true); // the initial \t must be preserved so don't strip leading whitespaces + + // check for accelerators: they are given after '\t' + int posTab = label.Find(wxT('\t')); + if ( posTab == wxNOT_FOUND ) + { + return false; + } + + // parse the accelerator string + int accelFlags = wxACCEL_NORMAL; + wxString current; + for ( size_t n = (size_t)posTab + 1; n < label.length(); n++ ) + { + if ( (label[n] == '+') || (label[n] == '-') ) + { + if ( CompareAccelString(current, wxTRANSLATE("ctrl")) ) + accelFlags |= wxACCEL_CTRL; + else if ( CompareAccelString(current, wxTRANSLATE("alt")) ) + accelFlags |= wxACCEL_ALT; + else if ( CompareAccelString(current, wxTRANSLATE("shift")) ) + accelFlags |= wxACCEL_SHIFT; + else // not a recognized modifier name + { + // we may have "Ctrl-+", for example, but we still want to + // catch typos like "Crtl-A" so only give the warning if we + // have something before the current '+' or '-', else take + // it as a literal symbol + if ( current.empty() ) + { + current += label[n]; + + // skip clearing it below + continue; + } + else + { + wxLogDebug(wxT("Unknown accel modifier: '%s'"), + current.c_str()); + } + } + + current.clear(); + } + else // not special character + { + current += (wxChar) wxTolower(label[n]); + } + } + + int keyCode; + const size_t len = current.length(); + switch ( len ) + { + case 0: + wxLogDebug(wxT("No accel key found, accel string ignored.")); + return false; + + case 1: + // it's just a letter + keyCode = current[0U]; + + // if the key is used with any modifiers, make it an uppercase one + // because Ctrl-A and Ctrl-a are the same; but keep it as is if it's + // used alone as 'a' and 'A' are different + if ( accelFlags != wxACCEL_NORMAL ) + keyCode = wxToupper(keyCode); + break; + + default: + keyCode = IsNumberedAccelKey(current, wxTRANSLATE("F"), + WXK_F1, 1, 12); + if ( !keyCode ) + { + for ( size_t n = 0; n < WXSIZEOF(wxKeyNames); n++ ) + { + const wxKeyName& kn = wxKeyNames[n]; + if ( CompareAccelString(current, kn.name) ) + { + keyCode = kn.code; + break; + } + } + } + + if ( !keyCode ) + keyCode = IsNumberedAccelKey(current, wxTRANSLATE("KP_"), + WXK_NUMPAD0, 0, 9); + if ( !keyCode ) + keyCode = IsNumberedAccelKey(current, wxTRANSLATE("SPECIAL"), + WXK_SPECIAL1, 1, 20); + + if ( !keyCode ) + { + wxLogDebug(wxT("Unrecognized accel key '%s', accel string ignored."), + current.c_str()); + return false; + } + } + + + wxASSERT_MSG( keyCode, _T("logic error: should have key code here") ); + + if ( flagsOut ) + *flagsOut = accelFlags; + if ( keyOut ) + *keyOut = keyCode; + + return true; +} + +/* static */ +wxAcceleratorEntry *wxAcceleratorEntry::Create(const wxString& str) +{ + int flags, + keyCode; + if ( !ParseAccel(str, &flags, &keyCode) ) + return NULL; + + return new wxAcceleratorEntry(flags, keyCode); +} + +bool wxAcceleratorEntry::FromString(const wxString& str) +{ + return ParseAccel(str, &m_flags, &m_keyCode); +} + +wxString wxAcceleratorEntry::ToString() const +{ + wxString text; + + int flags = GetFlags(); + if ( flags & wxACCEL_ALT ) + text += _("Alt-"); + if ( flags & wxACCEL_CTRL ) + text += _("Ctrl-"); + if ( flags & wxACCEL_SHIFT ) + text += _("Shift-"); + + const int code = GetKeyCode(); + + if ( code >= WXK_F1 && code <= WXK_F12 ) + text << _("F") << code - WXK_F1 + 1; + else if ( code >= WXK_NUMPAD0 && code <= WXK_NUMPAD9 ) + text << _("KP_") << code - WXK_NUMPAD0; + else if ( code >= WXK_SPECIAL1 && code <= WXK_SPECIAL20 ) + text << _("SPECIAL") << code - WXK_SPECIAL1 + 1; + else // check the named keys + { + size_t n; + for ( n = 0; n < WXSIZEOF(wxKeyNames); n++ ) + { + const wxKeyName& kn = wxKeyNames[n]; + if ( code == kn.code ) + { + text << wxGetTranslation(kn.name); + break; + } + } + + if ( n == WXSIZEOF(wxKeyNames) ) + { + // must be a simple key + if ( +#if !wxUSE_UNICODE + isascii(code) && +#endif // ANSI + wxIsalnum(code) ) + { + text << (wxChar)code; + } + else + { + wxFAIL_MSG( wxT("unknown keyboard accelerator code") ); + } + } + } + + return text; +} + +wxAcceleratorEntry *wxGetAccelFromString(const wxString& label) +{ + return wxAcceleratorEntry::Create(label); +} + +#endif // wxUSE_ACCEL + + +// ---------------------------------------------------------------------------- +// wxMenuItem +// ---------------------------------------------------------------------------- + +wxMenuItemBase::wxMenuItemBase(wxMenu *parentMenu, + int id, + const wxString& text, + const wxString& help, + wxItemKind kind, + wxMenu *subMenu) +{ + wxASSERT_MSG( parentMenu != NULL, wxT("menuitem should have a menu") ); + + m_parentMenu = parentMenu; + m_subMenu = subMenu; + m_isEnabled = true; + m_isChecked = false; + m_id = id; + m_kind = kind; + if (m_id == wxID_ANY) + m_id = wxNewId(); + if (m_id == wxID_SEPARATOR) + m_kind = wxITEM_SEPARATOR; + + SetText(text); + SetHelp(help); +} + +wxMenuItemBase::~wxMenuItemBase() +{ + delete m_subMenu; +} + +#if wxUSE_ACCEL + +wxAcceleratorEntry *wxMenuItemBase::GetAccel() const +{ + return wxAcceleratorEntry::Create(GetText()); +} + +void wxMenuItemBase::SetAccel(wxAcceleratorEntry *accel) +{ + wxString text = m_text.BeforeFirst(wxT('\t')); + if ( accel ) + { + text += wxT('\t'); + text += accel->ToString(); + } + + SetText(text); +} + +#endif // wxUSE_ACCEL + +void wxMenuItemBase::SetText(const wxString& str) +{ + m_text = str; + + if ( m_text.empty() && !IsSeparator() ) + { + wxASSERT_MSG( wxIsStockID(GetId()), + wxT("A non-stock menu item with an empty label?") ); + m_text = wxGetStockLabel(GetId(), wxSTOCK_WITH_ACCELERATOR | + wxSTOCK_WITH_MNEMONIC); + } +} + +void wxMenuItemBase::SetHelp(const wxString& str) +{ + m_help = str; + + if ( m_help.empty() && !IsSeparator() && wxIsStockID(GetId()) ) + { + // get a stock help string + m_help = wxGetStockHelpString(GetId()); + } +} + +wxString wxMenuItemBase::GetLabelText(const wxString& label) +{ + return GetLabelFromText(label); +} + +bool wxMenuBase::ms_locked = true; + +// ---------------------------------------------------------------------------- +// wxMenu ctor and dtor +// ---------------------------------------------------------------------------- + +void wxMenuBase::Init(long style) +{ + m_menuBar = (wxMenuBar *)NULL; + m_menuParent = (wxMenu *)NULL; + + m_invokingWindow = (wxWindow *)NULL; + m_style = style; + m_clientData = (void *)NULL; + m_eventHandler = this; +} + +wxMenuBase::~wxMenuBase() +{ + WX_CLEAR_LIST(wxMenuItemList, m_items); + + // Actually, in GTK, the submenus have to get deleted first. +} + +// ---------------------------------------------------------------------------- +// wxMenu item adding/removing +// ---------------------------------------------------------------------------- + +void wxMenuBase::AddSubMenu(wxMenu *submenu) +{ + wxCHECK_RET( submenu, _T("can't add a NULL submenu") ); + + submenu->SetParent((wxMenu *)this); +} + +wxMenuItem* wxMenuBase::DoAppend(wxMenuItem *item) +{ + wxCHECK_MSG( item, NULL, wxT("invalid item in wxMenu::Append()") ); + + m_items.Append(item); + item->SetMenu((wxMenu*)this); + if ( item->IsSubMenu() ) + { + AddSubMenu(item->GetSubMenu()); + } + + return item; +} + +wxMenuItem* wxMenuBase::Insert(size_t pos, wxMenuItem *item) +{ + wxCHECK_MSG( item, NULL, wxT("invalid item in wxMenu::Insert") ); + + if ( pos == GetMenuItemCount() ) + { + return DoAppend(item); + } + else + { + wxCHECK_MSG( pos < GetMenuItemCount(), NULL, + wxT("invalid index in wxMenu::Insert") ); + + return DoInsert(pos, item); + } +} + +wxMenuItem* wxMenuBase::DoInsert(size_t pos, wxMenuItem *item) +{ + wxCHECK_MSG( item, NULL, wxT("invalid item in wxMenu::Insert()") ); + + wxMenuItemList::compatibility_iterator node = m_items.Item(pos); + wxCHECK_MSG( node, NULL, wxT("invalid index in wxMenu::Insert()") ); + + m_items.Insert(node, item); + item->SetMenu((wxMenu*)this); + if ( item->IsSubMenu() ) + { + AddSubMenu(item->GetSubMenu()); + } + + return item; +} + +wxMenuItem *wxMenuBase::Remove(wxMenuItem *item) +{ + wxCHECK_MSG( item, NULL, wxT("invalid item in wxMenu::Remove") ); + + return DoRemove(item); +} + +wxMenuItem *wxMenuBase::DoRemove(wxMenuItem *item) +{ + wxMenuItemList::compatibility_iterator node = m_items.Find(item); + + // if we get here, the item is valid or one of Remove() functions is broken + wxCHECK_MSG( node, NULL, wxT("bug in wxMenu::Remove logic") ); + + // we detach the item, but we do delete the list node (i.e. don't call + // DetachNode() here!) + m_items.Erase(node); + + // item isn't attached to anything any more + item->SetMenu((wxMenu *)NULL); + wxMenu *submenu = item->GetSubMenu(); + if ( submenu ) + { + submenu->SetParent((wxMenu *)NULL); + if ( submenu->IsAttached() ) + submenu->Detach(); + } + + return item; +} + +bool wxMenuBase::Delete(wxMenuItem *item) +{ + wxCHECK_MSG( item, false, wxT("invalid item in wxMenu::Delete") ); + + return DoDelete(item); +} + +bool wxMenuBase::DoDelete(wxMenuItem *item) +{ + wxMenuItem *item2 = DoRemove(item); + wxCHECK_MSG( item2, false, wxT("failed to delete menu item") ); + + // don't delete the submenu + item2->SetSubMenu((wxMenu *)NULL); + + delete item2; + + return true; +} + +bool wxMenuBase::Destroy(wxMenuItem *item) +{ + wxCHECK_MSG( item, false, wxT("invalid item in wxMenu::Destroy") ); + + return DoDestroy(item); +} + +bool wxMenuBase::DoDestroy(wxMenuItem *item) +{ + wxMenuItem *item2 = DoRemove(item); + wxCHECK_MSG( item2, false, wxT("failed to delete menu item") ); + + delete item2; + + return true; +} + +// ---------------------------------------------------------------------------- +// wxMenu searching for items +// ---------------------------------------------------------------------------- + +// Finds the item id matching the given string, wxNOT_FOUND if not found. +int wxMenuBase::FindItem(const wxString& text) const +{ + wxString label = wxMenuItem::GetLabelFromText(text); + for ( wxMenuItemList::compatibility_iterator node = m_items.GetFirst(); + node; + node = node->GetNext() ) + { + wxMenuItem *item = node->GetData(); + if ( item->IsSubMenu() ) + { + int rc = item->GetSubMenu()->FindItem(label); + if ( rc != wxNOT_FOUND ) + return rc; + } + + // we execute this code for submenus as well to alllow finding them by + // name just like the ordinary items + if ( !item->IsSeparator() ) + { + if ( item->GetLabel() == label ) + return item->GetId(); + } + } + + return wxNOT_FOUND; +} + +// recursive search for item by id +wxMenuItem *wxMenuBase::FindItem(int itemId, wxMenu **itemMenu) const +{ + if ( itemMenu ) + *itemMenu = NULL; + + wxMenuItem *item = NULL; + for ( wxMenuItemList::compatibility_iterator node = m_items.GetFirst(); + node && !item; + node = node->GetNext() ) + { + item = node->GetData(); + + if ( item->GetId() == itemId ) + { + if ( itemMenu ) + *itemMenu = (wxMenu *)this; + } + else if ( item->IsSubMenu() ) + { + item = item->GetSubMenu()->FindItem(itemId, itemMenu); + } + else + { + // don't exit the loop + item = NULL; + } + } + + return item; +} + +// non recursive search +wxMenuItem *wxMenuBase::FindChildItem(int id, size_t *ppos) const +{ + wxMenuItem *item = (wxMenuItem *)NULL; + wxMenuItemList::compatibility_iterator node = GetMenuItems().GetFirst(); + + size_t pos; + for ( pos = 0; node; pos++ ) + { + if ( node->GetData()->GetId() == id ) + { + item = node->GetData(); + + break; + } + + node = node->GetNext(); + } + + if ( ppos ) + { + *ppos = item ? pos : (size_t)wxNOT_FOUND; + } + + return item; +} + +// find by position +wxMenuItem* wxMenuBase::FindItemByPosition(size_t position) const +{ + wxCHECK_MSG( position < m_items.GetCount(), NULL, + _T("wxMenu::FindItemByPosition(): invalid menu index") ); + + return m_items.Item( position )->GetData(); +} + +// ---------------------------------------------------------------------------- +// wxMenu helpers used by derived classes +// ---------------------------------------------------------------------------- + +// Update a menu and all submenus recursively. source is the object that has +// the update event handlers defined for it. If NULL, the menu or associated +// window will be used. +void wxMenuBase::UpdateUI(wxEvtHandler* source) +{ + if (GetInvokingWindow()) + { + // Don't update menus if the parent + // frame is about to get deleted + wxWindow *tlw = wxGetTopLevelParent( GetInvokingWindow() ); + if (tlw && wxPendingDelete.Member(tlw)) + return; + } + + if ( !source && GetInvokingWindow() ) + source = GetInvokingWindow()->GetEventHandler(); + if ( !source ) + source = GetEventHandler(); + if ( !source ) + source = this; + + wxMenuItemList::compatibility_iterator node = GetMenuItems().GetFirst(); + while ( node ) + { + wxMenuItem* item = node->GetData(); + if ( !item->IsSeparator() ) + { + wxWindowID id = item->GetId(); + wxUpdateUIEvent event(id); + event.SetEventObject( source ); + + if ( source->ProcessEvent(event) ) + { + // if anything changed, update the changed attribute + if (event.GetSetText()) + SetLabel(id, event.GetText()); + if (event.GetSetChecked()) + Check(id, event.GetChecked()); + if (event.GetSetEnabled()) + Enable(id, event.GetEnabled()); + } + + // recurse to the submenus + if ( item->GetSubMenu() ) + item->GetSubMenu()->UpdateUI(source); + } + //else: item is a separator (which doesn't process update UI events) + + node = node->GetNext(); + } +} + +bool wxMenuBase::SendEvent(int id, int checked) +{ + wxCommandEvent event(wxEVT_COMMAND_MENU_SELECTED, id); + event.SetEventObject(this); + event.SetInt(checked); + + bool processed = false; + + // Try the menu's event handler + // if ( !processed ) + { + wxEvtHandler *handler = GetEventHandler(); + if ( handler ) + processed = handler->ProcessEvent(event); + } + + // Try the window the menu was popped up from (and up through the + // hierarchy) + if ( !processed ) + { + const wxMenuBase *menu = this; + while ( menu ) + { + wxWindow *win = menu->GetInvokingWindow(); + if ( win ) + { + processed = win->GetEventHandler()->ProcessEvent(event); + break; + } + + menu = menu->GetParent(); + } + } + + return processed; +} + +// ---------------------------------------------------------------------------- +// wxMenu attaching/detaching to/from menu bar +// ---------------------------------------------------------------------------- + +wxMenuBar* wxMenuBase::GetMenuBar() const +{ + if(GetParent()) + return GetParent()->GetMenuBar(); + return m_menuBar; +} + +void wxMenuBase::Attach(wxMenuBarBase *menubar) +{ + // use Detach() instead! + wxASSERT_MSG( menubar, _T("menu can't be attached to NULL menubar") ); + + // use IsAttached() to prevent this from happening + wxASSERT_MSG( !m_menuBar, _T("attaching menu twice?") ); + + m_menuBar = (wxMenuBar *)menubar; +} + +void wxMenuBase::Detach() +{ + // use IsAttached() to prevent this from happening + wxASSERT_MSG( m_menuBar, _T("detaching unattached menu?") ); + + m_menuBar = NULL; +} + +// ---------------------------------------------------------------------------- +// wxMenu functions forwarded to wxMenuItem +// ---------------------------------------------------------------------------- + +void wxMenuBase::Enable( int id, bool enable ) +{ + wxMenuItem *item = FindItem(id); + + wxCHECK_RET( item, wxT("wxMenu::Enable: no such item") ); + + item->Enable(enable); +} + +bool wxMenuBase::IsEnabled( int id ) const +{ + wxMenuItem *item = FindItem(id); + + wxCHECK_MSG( item, false, wxT("wxMenu::IsEnabled: no such item") ); + + return item->IsEnabled(); +} + +void wxMenuBase::Check( int id, bool enable ) +{ + wxMenuItem *item = FindItem(id); + + wxCHECK_RET( item, wxT("wxMenu::Check: no such item") ); + + item->Check(enable); +} + +bool wxMenuBase::IsChecked( int id ) const +{ + wxMenuItem *item = FindItem(id); + + wxCHECK_MSG( item, false, wxT("wxMenu::IsChecked: no such item") ); + + return item->IsChecked(); +} + +void wxMenuBase::SetLabel( int id, const wxString &label ) +{ + wxMenuItem *item = FindItem(id); + + wxCHECK_RET( item, wxT("wxMenu::SetLabel: no such item") ); + + item->SetText(label); +} + +wxString wxMenuBase::GetLabel( int id ) const +{ + wxMenuItem *item = FindItem(id); + + wxCHECK_MSG( item, wxEmptyString, wxT("wxMenu::GetLabel: no such item") ); + + return item->GetText(); +} + +void wxMenuBase::SetHelpString( int id, const wxString& helpString ) +{ + wxMenuItem *item = FindItem(id); + + wxCHECK_RET( item, wxT("wxMenu::SetHelpString: no such item") ); + + item->SetHelp( helpString ); +} + +wxString wxMenuBase::GetHelpString( int id ) const +{ + wxMenuItem *item = FindItem(id); + + wxCHECK_MSG( item, wxEmptyString, wxT("wxMenu::GetHelpString: no such item") ); + + return item->GetHelp(); +} + +// ---------------------------------------------------------------------------- +// wxMenuBarBase ctor and dtor +// ---------------------------------------------------------------------------- + +wxMenuBarBase::wxMenuBarBase() +{ + // not attached yet + m_menuBarFrame = NULL; +} + +wxMenuBarBase::~wxMenuBarBase() +{ + WX_CLEAR_LIST(wxMenuList, m_menus); +} + +// ---------------------------------------------------------------------------- +// wxMenuBar item access: the base class versions manage m_menus list, the +// derived class should reflect the changes in the real menubar +// ---------------------------------------------------------------------------- + +wxMenu *wxMenuBarBase::GetMenu(size_t pos) const +{ + wxMenuList::compatibility_iterator node = m_menus.Item(pos); + wxCHECK_MSG( node, NULL, wxT("bad index in wxMenuBar::GetMenu()") ); + + return node->GetData(); +} + +bool wxMenuBarBase::Append(wxMenu *menu, const wxString& WXUNUSED(title)) +{ + wxCHECK_MSG( menu, false, wxT("can't append NULL menu") ); + + m_menus.Append(menu); + menu->Attach(this); + + return true; +} + +bool wxMenuBarBase::Insert(size_t pos, wxMenu *menu, + const wxString& title) +{ + if ( pos == m_menus.GetCount() ) + { + return wxMenuBarBase::Append(menu, title); + } + else // not at the end + { + wxCHECK_MSG( menu, false, wxT("can't insert NULL menu") ); + + wxMenuList::compatibility_iterator node = m_menus.Item(pos); + wxCHECK_MSG( node, false, wxT("bad index in wxMenuBar::Insert()") ); + + m_menus.Insert(node, menu); + menu->Attach(this); + + return true; + } +} + +wxMenu *wxMenuBarBase::Replace(size_t pos, wxMenu *menu, + const wxString& WXUNUSED(title)) +{ + wxCHECK_MSG( menu, NULL, wxT("can't insert NULL menu") ); + + wxMenuList::compatibility_iterator node = m_menus.Item(pos); + wxCHECK_MSG( node, NULL, wxT("bad index in wxMenuBar::Replace()") ); + + wxMenu *menuOld = node->GetData(); + node->SetData(menu); + + menu->Attach(this); + menuOld->Detach(); + + return menuOld; +} + +wxMenu *wxMenuBarBase::Remove(size_t pos) +{ + wxMenuList::compatibility_iterator node = m_menus.Item(pos); + wxCHECK_MSG( node, NULL, wxT("bad index in wxMenuBar::Remove()") ); + + wxMenu *menu = node->GetData(); + m_menus.Erase(node); + menu->Detach(); + + return menu; +} + +int wxMenuBarBase::FindMenu(const wxString& title) const +{ + wxString label = wxMenuItem::GetLabelFromText(title); + + size_t count = GetMenuCount(); + for ( size_t i = 0; i < count; i++ ) + { + wxString title2 = GetLabelTop(i); + if ( (title2 == title) || + (wxMenuItem::GetLabelFromText(title2) == label) ) + { + // found + return (int)i; + } + } + + return wxNOT_FOUND; + +} + +// ---------------------------------------------------------------------------- +// wxMenuBar attaching/detaching to/from the frame +// ---------------------------------------------------------------------------- + +void wxMenuBarBase::Attach(wxFrame *frame) +{ + wxASSERT_MSG( !IsAttached(), wxT("menubar already attached!") ); + + m_menuBarFrame = frame; +} + +void wxMenuBarBase::Detach() +{ + wxASSERT_MSG( IsAttached(), wxT("detaching unattached menubar") ); + + m_menuBarFrame = NULL; +} + +// ---------------------------------------------------------------------------- +// wxMenuBar searching for items +// ---------------------------------------------------------------------------- + +wxMenuItem *wxMenuBarBase::FindItem(int id, wxMenu **menu) const +{ + if ( menu ) + *menu = NULL; + + wxMenuItem *item = NULL; + size_t count = GetMenuCount(), i; + wxMenuList::const_iterator it; + for ( i = 0, it = m_menus.begin(); !item && (i < count); i++, it++ ) + { + item = (*it)->FindItem(id, menu); + } + + return item; +} + +int wxMenuBarBase::FindMenuItem(const wxString& menu, const wxString& item) const +{ + wxString label = wxMenuItem::GetLabelFromText(menu); + + int i = 0; + wxMenuList::compatibility_iterator node; + for ( node = m_menus.GetFirst(); node; node = node->GetNext(), i++ ) + { + if ( label == wxMenuItem::GetLabelFromText(GetLabelTop(i)) ) + return node->GetData()->FindItem(item); + } + + return wxNOT_FOUND; +} + +// --------------------------------------------------------------------------- +// wxMenuBar functions forwarded to wxMenuItem +// --------------------------------------------------------------------------- + +void wxMenuBarBase::Enable(int id, bool enable) +{ + wxMenuItem *item = FindItem(id); + + wxCHECK_RET( item, wxT("attempt to enable an item which doesn't exist") ); + + item->Enable(enable); +} + +void wxMenuBarBase::Check(int id, bool check) +{ + wxMenuItem *item = FindItem(id); + + wxCHECK_RET( item, wxT("attempt to check an item which doesn't exist") ); + wxCHECK_RET( item->IsCheckable(), wxT("attempt to check an uncheckable item") ); + + item->Check(check); +} + +bool wxMenuBarBase::IsChecked(int id) const +{ + wxMenuItem *item = FindItem(id); + + wxCHECK_MSG( item, false, wxT("wxMenuBar::IsChecked(): no such item") ); + + return item->IsChecked(); +} + +bool wxMenuBarBase::IsEnabled(int id) const +{ + wxMenuItem *item = FindItem(id); + + wxCHECK_MSG( item, false, wxT("wxMenuBar::IsEnabled(): no such item") ); + + return item->IsEnabled(); +} + +void wxMenuBarBase::SetLabel(int id, const wxString& label) +{ + wxMenuItem *item = FindItem(id); + + wxCHECK_RET( item, wxT("wxMenuBar::SetLabel(): no such item") ); + + item->SetText(label); +} + +wxString wxMenuBarBase::GetLabel(int id) const +{ + wxMenuItem *item = FindItem(id); + + wxCHECK_MSG( item, wxEmptyString, + wxT("wxMenuBar::GetLabel(): no such item") ); + + return item->GetText(); +} + +void wxMenuBarBase::SetHelpString(int id, const wxString& helpString) +{ + wxMenuItem *item = FindItem(id); + + wxCHECK_RET( item, wxT("wxMenuBar::SetHelpString(): no such item") ); + + item->SetHelp(helpString); +} + +wxString wxMenuBarBase::GetHelpString(int id) const +{ + wxMenuItem *item = FindItem(id); + + wxCHECK_MSG( item, wxEmptyString, + wxT("wxMenuBar::GetHelpString(): no such item") ); + + return item->GetHelp(); +} + +void wxMenuBarBase::UpdateMenus( void ) +{ + wxEvtHandler* source; + wxMenu* menu; + int nCount = GetMenuCount(); + for (int n = 0; n < nCount; n++) + { + menu = GetMenu( n ); + if (menu != NULL) + { + source = menu->GetEventHandler(); + if (source != NULL) + menu->UpdateUI( source ); + } + } +} + +// Get the text only, from the label +wxString wxMenuBarBase::GetMenuLabelText(size_t pos) const +{ + return wxMenuItem::GetLabelText(((wxMenuBar*)this)->GetMenuLabel(pos)); +} + + +#endif // wxUSE_MENUS diff --git a/Externals/wxWidgets/src/common/mimecmn.cpp b/Externals/wxWidgets/src/common/mimecmn.cpp new file mode 100644 index 0000000000..87320c1494 --- /dev/null +++ b/Externals/wxWidgets/src/common/mimecmn.cpp @@ -0,0 +1,752 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/mimecmn.cpp +// Purpose: classes and functions to manage MIME types +// Author: Vadim Zeitlin +// Modified by: +// Chris Elliott (biol75@york.ac.uk) 5 Dec 00: write support for Win32 +// Created: 23.09.98 +// RCS-ID: $Id: mimecmn.cpp 47027 2007-06-29 18:23:39Z VZ $ +// Copyright: (c) 1998 Vadim Zeitlin +// Licence: wxWindows licence (part of wxExtra library) +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// for compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_MIMETYPE + +#include "wx/mimetype.h" + +#ifndef WX_PRECOMP + #include "wx/dynarray.h" + #include "wx/string.h" + #include "wx/intl.h" + #include "wx/log.h" + #include "wx/module.h" +#endif //WX_PRECOMP + +#include "wx/file.h" +#include "wx/iconloc.h" +#include "wx/confbase.h" + +// other standard headers +#include + +// implementation classes: +#if defined(__WXMSW__) + #include "wx/msw/mimetype.h" +#elif defined(__WXMAC__) + #include "wx/mac/mimetype.h" +#elif defined(__WXPM__) || defined (__EMX__) + #include "wx/os2/mimetype.h" + #undef __UNIX__ +#elif defined(__DOS__) + #include "wx/msdos/mimetype.h" +#else // Unix + #include "wx/unix/mimetype.h" +#endif + +// ============================================================================ +// common classes +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxMimeTypeCommands +// ---------------------------------------------------------------------------- + +void +wxMimeTypeCommands::AddOrReplaceVerb(const wxString& verb, const wxString& cmd) +{ + int n = m_verbs.Index(verb, false /* ignore case */); + if ( n == wxNOT_FOUND ) + { + m_verbs.Add(verb); + m_commands.Add(cmd); + } + else + { + m_commands[n] = cmd; + } +} + +wxString +wxMimeTypeCommands::GetCommandForVerb(const wxString& verb, size_t *idx) const +{ + wxString s; + + int n = m_verbs.Index(verb); + if ( n != wxNOT_FOUND ) + { + s = m_commands[(size_t)n]; + if ( idx ) + *idx = n; + } + else if ( idx ) + { + // different from any valid index + *idx = (size_t)-1; + } + + return s; +} + +wxString wxMimeTypeCommands::GetVerbCmd(size_t n) const +{ + return m_verbs[n] + wxT('=') + m_commands[n]; +} + +// ---------------------------------------------------------------------------- +// wxFileTypeInfo +// ---------------------------------------------------------------------------- + +wxFileTypeInfo::wxFileTypeInfo(const wxChar *mimeType, + const wxChar *openCmd, + const wxChar *printCmd, + const wxChar *desc, + ...) + : m_mimeType(mimeType), + m_openCmd(openCmd), + m_printCmd(printCmd), + m_desc(desc) +{ + va_list argptr; + va_start(argptr, desc); + + for ( ;; ) + { + // icc gives this warning in its own va_arg() macro, argh +#ifdef __INTELC__ + #pragma warning(push) + #pragma warning(disable: 1684) +#endif + + const wxChar *ext = va_arg(argptr, const wxChar *); + +#ifdef __INTELC__ + #pragma warning(pop) +#endif + if ( !ext ) + { + // NULL terminates the list + break; + } + + m_exts.Add(ext); + } + + va_end(argptr); +} + + +wxFileTypeInfo::wxFileTypeInfo(const wxArrayString& sArray) +{ + m_mimeType = sArray [0u]; + m_openCmd = sArray [1u]; + m_printCmd = sArray [2u]; + m_desc = sArray [3u]; + + size_t count = sArray.GetCount(); + for ( size_t i = 4; i < count; i++ ) + { + m_exts.Add(sArray[i]); + } +} + +#include "wx/arrimpl.cpp" +WX_DEFINE_OBJARRAY(wxArrayFileTypeInfo) + +// ============================================================================ +// implementation of the wrapper classes +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxFileType +// ---------------------------------------------------------------------------- + +/* static */ +wxString wxFileType::ExpandCommand(const wxString& command, + const wxFileType::MessageParameters& params) +{ + bool hasFilename = false; + + wxString str; + for ( const wxChar *pc = command.c_str(); *pc != wxT('\0'); pc++ ) { + if ( *pc == wxT('%') ) { + switch ( *++pc ) { + case wxT('s'): + // '%s' expands into file name (quoted because it might + // contain spaces) - except if there are already quotes + // there because otherwise some programs may get confused + // by double double quotes +#if 0 + if ( *(pc - 2) == wxT('"') ) + str << params.GetFileName(); + else + str << wxT('"') << params.GetFileName() << wxT('"'); +#endif + str << params.GetFileName(); + hasFilename = true; + break; + + case wxT('t'): + // '%t' expands into MIME type (quote it too just to be + // consistent) + str << wxT('\'') << params.GetMimeType() << wxT('\''); + break; + + case wxT('{'): + { + const wxChar *pEnd = wxStrchr(pc, wxT('}')); + if ( pEnd == NULL ) { + wxString mimetype; + wxLogWarning(_("Unmatched '{' in an entry for mime type %s."), + params.GetMimeType().c_str()); + str << wxT("%{"); + } + else { + wxString param(pc + 1, pEnd - pc - 1); + str << wxT('\'') << params.GetParamValue(param) << wxT('\''); + pc = pEnd; + } + } + break; + + case wxT('n'): + case wxT('F'): + // TODO %n is the number of parts, %F is an array containing + // the names of temp files these parts were written to + // and their mime types. + break; + + default: + wxLogDebug(wxT("Unknown field %%%c in command '%s'."), + *pc, command.c_str()); + str << *pc; + } + } + else { + str << *pc; + } + } + + // metamail(1) man page states that if the mailcap entry doesn't have '%s' + // the program will accept the data on stdin so normally we should append + // "< %s" to the end of the command in such case, but not all commands + // behave like this, in particular a common test is 'test -n "$DISPLAY"' + // and appending "< %s" to this command makes the test fail... I don't + // know of the correct solution, try to guess what we have to do. + + // test now carried out on reading file so test should never get here + if ( !hasFilename && !str.empty() +#ifdef __UNIX__ + && !str.StartsWith(_T("test ")) +#endif // Unix + ) { + str << wxT(" < '") << params.GetFileName() << wxT('\''); + } + + return str; +} + +wxFileType::wxFileType(const wxFileTypeInfo& info) +{ + m_info = &info; + m_impl = NULL; +} + +wxFileType::wxFileType() +{ + m_info = NULL; + m_impl = new wxFileTypeImpl; +} + +wxFileType::~wxFileType() +{ + if ( m_impl ) + delete m_impl; +} + +bool wxFileType::GetExtensions(wxArrayString& extensions) +{ + if ( m_info ) + { + extensions = m_info->GetExtensions(); + return true; + } + + return m_impl->GetExtensions(extensions); +} + +bool wxFileType::GetMimeType(wxString *mimeType) const +{ + wxCHECK_MSG( mimeType, false, _T("invalid parameter in GetMimeType") ); + + if ( m_info ) + { + *mimeType = m_info->GetMimeType(); + + return true; + } + + return m_impl->GetMimeType(mimeType); +} + +bool wxFileType::GetMimeTypes(wxArrayString& mimeTypes) const +{ + if ( m_info ) + { + mimeTypes.Clear(); + mimeTypes.Add(m_info->GetMimeType()); + + return true; + } + + return m_impl->GetMimeTypes(mimeTypes); +} + +bool wxFileType::GetIcon(wxIconLocation *iconLoc) const +{ + if ( m_info ) + { + if ( iconLoc ) + { + iconLoc->SetFileName(m_info->GetIconFile()); +#ifdef __WXMSW__ + iconLoc->SetIndex(m_info->GetIconIndex()); +#endif // __WXMSW__ + } + + return true; + } + + return m_impl->GetIcon(iconLoc); +} + +bool +wxFileType::GetIcon(wxIconLocation *iconloc, + const MessageParameters& params) const +{ + if ( !GetIcon(iconloc) ) + { + return false; + } + + // we may have "%s" in the icon location string, at least under Windows, so + // expand this + if ( iconloc ) + { + iconloc->SetFileName(ExpandCommand(iconloc->GetFileName(), params)); + } + + return true; +} + +bool wxFileType::GetDescription(wxString *desc) const +{ + wxCHECK_MSG( desc, false, _T("invalid parameter in GetDescription") ); + + if ( m_info ) + { + *desc = m_info->GetDescription(); + + return true; + } + + return m_impl->GetDescription(desc); +} + +bool +wxFileType::GetOpenCommand(wxString *openCmd, + const wxFileType::MessageParameters& params) const +{ + wxCHECK_MSG( openCmd, false, _T("invalid parameter in GetOpenCommand") ); + + if ( m_info ) + { + *openCmd = ExpandCommand(m_info->GetOpenCommand(), params); + + return true; + } + + return m_impl->GetOpenCommand(openCmd, params); +} + +wxString wxFileType::GetOpenCommand(const wxString& filename) const +{ + wxString cmd; + if ( !GetOpenCommand(&cmd, filename) ) + { + // return empty string to indicate an error + cmd.clear(); + } + + return cmd; +} + +bool +wxFileType::GetPrintCommand(wxString *printCmd, + const wxFileType::MessageParameters& params) const +{ + wxCHECK_MSG( printCmd, false, _T("invalid parameter in GetPrintCommand") ); + + if ( m_info ) + { + *printCmd = ExpandCommand(m_info->GetPrintCommand(), params); + + return true; + } + + return m_impl->GetPrintCommand(printCmd, params); +} + + +size_t wxFileType::GetAllCommands(wxArrayString *verbs, + wxArrayString *commands, + const wxFileType::MessageParameters& params) const +{ + if ( verbs ) + verbs->Clear(); + if ( commands ) + commands->Clear(); + +#if defined (__WXMSW__) || defined(__UNIX__) + return m_impl->GetAllCommands(verbs, commands, params); +#else // !__WXMSW__ || Unix + // we don't know how to retrieve all commands, so just try the 2 we know + // about + size_t count = 0; + wxString cmd; + if ( GetOpenCommand(&cmd, params) ) + { + if ( verbs ) + verbs->Add(_T("Open")); + if ( commands ) + commands->Add(cmd); + count++; + } + + if ( GetPrintCommand(&cmd, params) ) + { + if ( verbs ) + verbs->Add(_T("Print")); + if ( commands ) + commands->Add(cmd); + + count++; + } + + return count; +#endif // __WXMSW__/| __UNIX__ +} + +bool wxFileType::Unassociate() +{ +#if defined(__WXMSW__) + return m_impl->Unassociate(); +#elif defined(__UNIX__) + return m_impl->Unassociate(this); +#else + wxFAIL_MSG( _T("not implemented") ); // TODO + return false; +#endif +} + +bool wxFileType::SetCommand(const wxString& cmd, + const wxString& verb, + bool overwriteprompt) +{ +#if defined (__WXMSW__) || defined(__UNIX__) + return m_impl->SetCommand(cmd, verb, overwriteprompt); +#else + wxUnusedVar(cmd); + wxUnusedVar(verb); + wxUnusedVar(overwriteprompt); + wxFAIL_MSG(_T("not implemented")); + return false; +#endif +} + +bool wxFileType::SetDefaultIcon(const wxString& cmd, int index) +{ + wxString sTmp = cmd; +#ifdef __WXMSW__ + // VZ: should we do this? + // chris elliott : only makes sense in MS windows + if ( sTmp.empty() ) + GetOpenCommand(&sTmp, wxFileType::MessageParameters(wxEmptyString, wxEmptyString)); +#endif + wxCHECK_MSG( !sTmp.empty(), false, _T("need the icon file") ); + +#if defined (__WXMSW__) || defined(__UNIX__) + return m_impl->SetDefaultIcon (cmd, index); +#else + wxUnusedVar(index); + wxFAIL_MSG(_T("not implemented")); + return false; +#endif +} + +// ---------------------------------------------------------------------------- +// wxMimeTypesManagerFactory +// ---------------------------------------------------------------------------- + +wxMimeTypesManagerFactory *wxMimeTypesManagerFactory::m_factory = NULL; + +/* static */ +void wxMimeTypesManagerFactory::Set(wxMimeTypesManagerFactory *factory) +{ + delete m_factory; + + m_factory = factory; +} + +/* static */ +wxMimeTypesManagerFactory *wxMimeTypesManagerFactory::Get() +{ + if ( !m_factory ) + m_factory = new wxMimeTypesManagerFactory; + + return m_factory; +} + +wxMimeTypesManagerImpl *wxMimeTypesManagerFactory::CreateMimeTypesManagerImpl() +{ + return new wxMimeTypesManagerImpl; +} + +// ---------------------------------------------------------------------------- +// wxMimeTypesManager +// ---------------------------------------------------------------------------- + +void wxMimeTypesManager::EnsureImpl() +{ + if ( !m_impl ) + m_impl = wxMimeTypesManagerFactory::Get()->CreateMimeTypesManagerImpl(); +} + +bool wxMimeTypesManager::IsOfType(const wxString& mimeType, + const wxString& wildcard) +{ + wxASSERT_MSG( mimeType.Find(wxT('*')) == wxNOT_FOUND, + wxT("first MIME type can't contain wildcards") ); + + // all comparaisons are case insensitive (2nd arg of IsSameAs() is false) + if ( wildcard.BeforeFirst(wxT('/')). + IsSameAs(mimeType.BeforeFirst(wxT('/')), false) ) + { + wxString strSubtype = wildcard.AfterFirst(wxT('/')); + + if ( strSubtype == wxT("*") || + strSubtype.IsSameAs(mimeType.AfterFirst(wxT('/')), false) ) + { + // matches (either exactly or it's a wildcard) + return true; + } + } + + return false; +} + +wxMimeTypesManager::wxMimeTypesManager() +{ + m_impl = NULL; +} + +wxMimeTypesManager::~wxMimeTypesManager() +{ + if ( m_impl ) + delete m_impl; +} + +bool wxMimeTypesManager::Unassociate(wxFileType *ft) +{ + EnsureImpl(); + +#if defined(__UNIX__) && !defined(__CYGWIN__) && !defined(__WINE__) + return m_impl->Unassociate(ft); +#else + return ft->Unassociate(); +#endif +} + + +wxFileType * +wxMimeTypesManager::Associate(const wxFileTypeInfo& ftInfo) +{ + EnsureImpl(); + +#if defined(__WXMSW__) || defined(__UNIX__) + return m_impl->Associate(ftInfo); +#else // other platforms + wxUnusedVar(ftInfo); + wxFAIL_MSG( _T("not implemented") ); // TODO + return NULL; +#endif // platforms +} + +wxFileType * +wxMimeTypesManager::GetFileTypeFromExtension(const wxString& ext) +{ + EnsureImpl(); + + wxString::const_iterator i = ext.begin(); + const wxString::const_iterator end = ext.end(); + wxString extWithoutDot; + if ( i != end && *i == '.' ) + extWithoutDot.assign(++i, ext.end()); + else + extWithoutDot = ext; + + wxCHECK_MSG( !ext.empty(), NULL, _T("extension can't be empty") ); + + wxFileType *ft = m_impl->GetFileTypeFromExtension(extWithoutDot); + + if ( !ft ) { + // check the fallbacks + // + // TODO linear search is potentially slow, perhaps we should use a + // sorted array? + size_t count = m_fallbacks.GetCount(); + for ( size_t n = 0; n < count; n++ ) { + if ( m_fallbacks[n].GetExtensions().Index(ext) != wxNOT_FOUND ) { + ft = new wxFileType(m_fallbacks[n]); + + break; + } + } + } + + return ft; +} + +wxFileType * +wxMimeTypesManager::GetFileTypeFromMimeType(const wxString& mimeType) +{ + EnsureImpl(); + wxFileType *ft = m_impl->GetFileTypeFromMimeType(mimeType); + + if ( !ft ) { + // check the fallbacks + // + // TODO linear search is potentially slow, perhaps we should use a + // sorted array? + size_t count = m_fallbacks.GetCount(); + for ( size_t n = 0; n < count; n++ ) { + if ( wxMimeTypesManager::IsOfType(mimeType, + m_fallbacks[n].GetMimeType()) ) { + ft = new wxFileType(m_fallbacks[n]); + + break; + } + } + } + + return ft; +} + +bool wxMimeTypesManager::ReadMailcap(const wxString& filename, bool fallback) +{ + EnsureImpl(); + return m_impl->ReadMailcap(filename, fallback); +} + +bool wxMimeTypesManager::ReadMimeTypes(const wxString& filename) +{ + EnsureImpl(); + return m_impl->ReadMimeTypes(filename); +} + +void wxMimeTypesManager::AddFallbacks(const wxFileTypeInfo *filetypes) +{ + EnsureImpl(); + for ( const wxFileTypeInfo *ft = filetypes; ft && ft->IsValid(); ft++ ) { + AddFallback(*ft); + } +} + +size_t wxMimeTypesManager::EnumAllFileTypes(wxArrayString& mimetypes) +{ + EnsureImpl(); + size_t countAll = m_impl->EnumAllFileTypes(mimetypes); + + // add the fallback filetypes + size_t count = m_fallbacks.GetCount(); + for ( size_t n = 0; n < count; n++ ) { + if ( mimetypes.Index(m_fallbacks[n].GetMimeType()) == wxNOT_FOUND ) { + mimetypes.Add(m_fallbacks[n].GetMimeType()); + countAll++; + } + } + + return countAll; +} + +void wxMimeTypesManager::Initialize(int mcapStyle, + const wxString& sExtraDir) +{ +#if defined(__UNIX__) && !defined(__CYGWIN__) && !defined(__WINE__) + EnsureImpl(); + + m_impl->Initialize(mcapStyle, sExtraDir); +#else + (void)mcapStyle; + (void)sExtraDir; +#endif // Unix +} + +// and this function clears all the data from the manager +void wxMimeTypesManager::ClearData() +{ +#if defined(__UNIX__) && !defined(__CYGWIN__) && !defined(__WINE__) + EnsureImpl(); + + m_impl->ClearData(); +#endif // Unix +} + +// ---------------------------------------------------------------------------- +// global data and wxMimeTypeCmnModule +// ---------------------------------------------------------------------------- + +// private object +static wxMimeTypesManager gs_mimeTypesManager; + +// and public pointer +wxMimeTypesManager *wxTheMimeTypesManager = &gs_mimeTypesManager; + +class wxMimeTypeCmnModule: public wxModule +{ +public: + wxMimeTypeCmnModule() : wxModule() { } + + virtual bool OnInit() { return true; } + virtual void OnExit() + { + wxMimeTypesManagerFactory::Set(NULL); + + if ( gs_mimeTypesManager.m_impl != NULL ) + { + delete gs_mimeTypesManager.m_impl; + gs_mimeTypesManager.m_impl = NULL; + gs_mimeTypesManager.m_fallbacks.Clear(); + } + } + + DECLARE_DYNAMIC_CLASS(wxMimeTypeCmnModule) +}; + +IMPLEMENT_DYNAMIC_CLASS(wxMimeTypeCmnModule, wxModule) + +#endif // wxUSE_MIMETYPE diff --git a/Externals/wxWidgets/src/common/module.cpp b/Externals/wxWidgets/src/common/module.cpp new file mode 100644 index 0000000000..ba5732e781 --- /dev/null +++ b/Externals/wxWidgets/src/common/module.cpp @@ -0,0 +1,202 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/module.cpp +// Purpose: Modules initialization/destruction +// Author: Wolfram Gloger/adapted by Guilhem Lavaux +// Modified by: +// Created: 04/11/98 +// RCS-ID: $Id: module.cpp 39677 2006-06-11 22:19:12Z VZ $ +// Copyright: (c) Wolfram Gloger and Guilhem Lavaux +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#include "wx/module.h" + +#ifndef WX_PRECOMP + #include "wx/hash.h" + #include "wx/intl.h" + #include "wx/log.h" +#endif + +#include "wx/listimpl.cpp" + +#define TRACE_MODULE _T("module") + +WX_DEFINE_LIST(wxModuleList) + +IMPLEMENT_CLASS(wxModule, wxObject) + +wxModuleList wxModule::m_modules; + +void wxModule::RegisterModule(wxModule* module) +{ + module->m_state = State_Registered; + m_modules.Append(module); +} + +void wxModule::UnregisterModule(wxModule* module) +{ + m_modules.DeleteObject(module); + delete module; +} + +// Collect up all module-derived classes, create an instance of each, +// and register them. +void wxModule::RegisterModules() +{ + wxHashTable::compatibility_iterator node; + wxClassInfo* classInfo; + + wxClassInfo::sm_classTable->BeginFind(); + node = wxClassInfo::sm_classTable->Next(); + while (node) + { + classInfo = (wxClassInfo *)node->GetData(); + if ( classInfo->IsKindOf(CLASSINFO(wxModule)) && + (classInfo != (& (wxModule::ms_classInfo))) ) + { + wxLogTrace(TRACE_MODULE, wxT("Registering module %s"), + classInfo->GetClassName()); + wxModule* module = (wxModule *)classInfo->CreateObject(); + RegisterModule(module); + } + node = wxClassInfo::sm_classTable->Next(); + } +} + +bool wxModule::DoInitializeModule(wxModule *module, + wxModuleList &initializedModules) +{ + if ( module->m_state == State_Initializing ) + { + wxLogError(_("Circular dependency involving module \"%s\" detected."), + module->GetClassInfo()->GetClassName()); + return false; + } + + module->m_state = State_Initializing; + + const wxArrayClassInfo& dependencies = module->m_dependencies; + + // satisfy module dependencies by loading them before the current module + for ( unsigned int i = 0; i < dependencies.size(); ++i ) + { + wxClassInfo * cinfo = dependencies[i]; + + // Check if the module is already initialized + wxModuleList::compatibility_iterator node; + for ( node = initializedModules.GetFirst(); node; node = node->GetNext() ) + { + if ( node->GetData()->GetClassInfo() == cinfo ) + break; + } + + if ( node ) + { + // this dependency is already initialized, nothing to do + continue; + } + + // find the module in the registered modules list + for ( node = m_modules.GetFirst(); node; node = node->GetNext() ) + { + wxModule *moduleDep = node->GetData(); + if ( moduleDep->GetClassInfo() == cinfo ) + { + if ( !DoInitializeModule(moduleDep, initializedModules ) ) + { + // failed to initialize a dependency, so fail this one too + return false; + } + + break; + } + } + + if ( !node ) + { + wxLogError(_("Dependency \"%s\" of module \"%s\" doesn't exist."), + cinfo->GetClassName(), + module->GetClassInfo()->GetClassName()); + return false; + } + } + + if ( !module->Init() ) + { + wxLogError(_("Module \"%s\" initialization failed"), + module->GetClassInfo()->GetClassName()); + return false; + } + + wxLogTrace(TRACE_MODULE, wxT("Module \"%s\" initialized"), + module->GetClassInfo()->GetClassName()); + + module->m_state = State_Initialized; + initializedModules.Append(module); + + return true; +} + +// Initialize user-defined modules +bool wxModule::InitializeModules() +{ + wxModuleList initializedModules; + + for ( wxModuleList::compatibility_iterator node = m_modules.GetFirst(); + node; + node = node->GetNext() ) + { + wxModule *module = node->GetData(); + + // the module could have been already initialized as dependency of + // another one + if ( module->m_state == State_Registered ) + { + if ( !DoInitializeModule( module, initializedModules ) ) + { + // failed to initialize all modules, so clean up the already + // initialized ones + DoCleanUpModules(initializedModules); + + return false; + } + } + } + + // remember the real initialisation order + m_modules = initializedModules; + + return true; +} + +// Clean up all currently initialized modules +void wxModule::DoCleanUpModules(const wxModuleList& modules) +{ + // cleanup user-defined modules in the reverse order compared to their + // initialization -- this ensures that dependencies are respected + for ( wxModuleList::compatibility_iterator node = modules.GetLast(); + node; + node = node->GetPrevious() ) + { + wxLogTrace(TRACE_MODULE, wxT("Cleanup module %s"), + node->GetData()->GetClassInfo()->GetClassName()); + + wxModule * module = node->GetData(); + + wxASSERT_MSG( module->m_state == State_Initialized, + _T("not initialized module being cleaned up") ); + + module->Exit(); + module->m_state = State_Registered; + } + + // clear all modules, even the non-initialized ones + WX_CLEAR_LIST(wxModuleList, m_modules); +} diff --git a/Externals/wxWidgets/src/common/msgout.cpp b/Externals/wxWidgets/src/common/msgout.cpp new file mode 100644 index 0000000000..1b2026ba92 --- /dev/null +++ b/Externals/wxWidgets/src/common/msgout.cpp @@ -0,0 +1,222 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/msgout.cpp +// Purpose: wxMessageOutput implementation +// Author: Mattia Barbon +// Modified by: +// Created: 17.07.02 +// RCS-ID: $Id: msgout.cpp 38920 2006-04-26 08:21:31Z ABX $ +// Copyright: (c) the wxWidgets team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// --------------------------------------------------------------------------- +// headers +// --------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#if defined(__BORLANDC__) + #pragma hdrstop +#endif + +#ifndef WX_PRECOMP + #include "wx/string.h" + #include "wx/ffile.h" + #include "wx/app.h" + #include "wx/intl.h" + #include "wx/log.h" + #if wxUSE_GUI + #include "wx/msgdlg.h" + #endif // wxUSE_GUI +#endif + +#include "wx/msgout.h" +#include "wx/apptrait.h" +#include +#include + +#if defined(__WINDOWS__) + #include "wx/msw/private.h" +#endif +#ifdef __WXMAC__ + #include "wx/mac/private.h" +#endif + +// =========================================================================== +// implementation +// =========================================================================== + +#if wxUSE_BASE + +// ---------------------------------------------------------------------------- +// wxMessageOutput +// ---------------------------------------------------------------------------- + +wxMessageOutput* wxMessageOutput::ms_msgOut = 0; + +wxMessageOutput* wxMessageOutput::Get() +{ + if ( !ms_msgOut && wxTheApp ) + { + ms_msgOut = wxTheApp->GetTraits()->CreateMessageOutput(); + } + + return ms_msgOut; +} + +wxMessageOutput* wxMessageOutput::Set(wxMessageOutput* msgout) +{ + wxMessageOutput* old = ms_msgOut; + ms_msgOut = msgout; + return old; +} + +// ---------------------------------------------------------------------------- +// wxMessageOutputBest +// ---------------------------------------------------------------------------- + +#ifdef __WINDOWS__ + +// check if we're running in a console under Windows +static inline bool IsInConsole() +{ +#ifdef __WXWINCE__ + return false; +#else // !__WXWINCE__ + HANDLE hStdErr = ::GetStdHandle(STD_ERROR_HANDLE); + return hStdErr && hStdErr != INVALID_HANDLE_VALUE; +#endif // __WXWINCE__/!__WXWINCE__ +} + +#endif // __WINDOWS__ + +void wxMessageOutputBest::Printf(const wxChar* format, ...) +{ + va_list args; + va_start(args, format); + wxString out; + + out.PrintfV(format, args); + va_end(args); + +#ifdef __WINDOWS__ + if ( !IsInConsole() ) + { + ::MessageBox(NULL, out, _T("wxWidgets"), MB_ICONINFORMATION | MB_OK); + } + else +#endif // __WINDOWS__/!__WINDOWS__ + { + fprintf(stderr, "%s", (const char*) out.mb_str()); + } +} + +// ---------------------------------------------------------------------------- +// wxMessageOutputStderr +// ---------------------------------------------------------------------------- + +void wxMessageOutputStderr::Printf(const wxChar* format, ...) +{ + va_list args; + va_start(args, format); + wxString out; + + out.PrintfV(format, args); + va_end(args); + + fprintf(stderr, "%s", (const char*) out.mb_str()); +} + +// ---------------------------------------------------------------------------- +// wxMessageOutputDebug +// ---------------------------------------------------------------------------- + +void wxMessageOutputDebug::Printf(const wxChar* format, ...) +{ + wxString out; + + va_list args; + va_start(args, format); + + out.PrintfV(format, args); + va_end(args); + +#if defined(__WXMSW__) && !defined(__WXMICROWIN__) + out.Replace(wxT("\t"), wxT(" ")); + out.Replace(wxT("\n"), wxT("\r\n")); + ::OutputDebugString(out); +#elif defined(__WXMAC__) && !defined(__DARWIN__) + if ( wxIsDebuggerRunning() ) + { + Str255 pstr; + wxString output = out + wxT(";g") ; + wxMacStringToPascal(output.c_str(), pstr); + + #ifdef __powerc + DebugStr(pstr); + #else + SysBreakStr(pstr); + #endif + } +#else + wxFputs( out , stderr ) ; + if ( out.Right(1) != wxT("\n") ) + wxFputs( wxT("\n") , stderr ) ; + fflush( stderr ) ; +#endif // platform +} + +// ---------------------------------------------------------------------------- +// wxMessageOutputLog +// ---------------------------------------------------------------------------- + +void wxMessageOutputLog::Printf(const wxChar* format, ...) +{ + wxString out; + + va_list args; + va_start(args, format); + + out.PrintfV(format, args); + va_end(args); + + out.Replace(wxT("\t"), wxT(" ")); + + ::wxLogMessage(wxT("%s"), out.c_str()); +} + +#endif // wxUSE_BASE + +// ---------------------------------------------------------------------------- +// wxMessageOutputMessageBox +// ---------------------------------------------------------------------------- + +#if wxUSE_GUI + +void wxMessageOutputMessageBox::Printf(const wxChar* format, ...) +{ + va_list args; + va_start(args, format); + wxString out; + + out.PrintfV(format, args); + va_end(args); + + // the native MSW msg box understands the TABs, others don't +#ifndef __WXMSW__ + out.Replace(wxT("\t"), wxT(" ")); +#endif + + wxString title; + if ( wxTheApp ) + title.Printf(_("%s message"), wxTheApp->GetAppName().c_str()); + + ::wxMessageBox(out, title); +} + +#endif // wxUSE_GUI diff --git a/Externals/wxWidgets/src/common/mstream.cpp b/Externals/wxWidgets/src/common/mstream.cpp new file mode 100644 index 0000000000..35aac92927 --- /dev/null +++ b/Externals/wxWidgets/src/common/mstream.cpp @@ -0,0 +1,174 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/mstream.cpp +// Purpose: "Memory stream" classes +// Author: Guilhem Lavaux +// Modified by: VZ (23.11.00): general code review +// Created: 04/01/98 +// RCS-ID: $Id: mstream.cpp 39001 2006-05-03 21:50:35Z ABX $ +// Copyright: (c) Guilhem Lavaux +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_STREAMS + +#include "wx/mstream.h" + +#ifndef WX_PRECOMP + #include "wx/stream.h" +#endif //WX_PRECOMP + +#include + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxMemoryInputStream +// ---------------------------------------------------------------------------- + +wxMemoryInputStream::wxMemoryInputStream(const void *data, size_t len) +{ + m_i_streambuf = new wxStreamBuffer(wxStreamBuffer::read); + m_i_streambuf->SetBufferIO((void *)data, len); // const_cast + m_i_streambuf->SetIntPosition(0); // seek to start pos + m_i_streambuf->Fixed(true); + + m_length = len; +} + +wxMemoryInputStream::wxMemoryInputStream(const wxMemoryOutputStream& stream) +{ + const wxFileOffset lenFile = stream.GetLength(); + if ( lenFile == wxInvalidOffset ) + { + m_i_streambuf = NULL; + m_lasterror = wxSTREAM_EOF; + return; + } + + const size_t len = wx_truncate_cast(size_t, lenFile); + wxASSERT_MSG( len == lenFile + size_t(0), _T("huge files not supported") ); + + m_i_streambuf = new wxStreamBuffer(wxStreamBuffer::read); + m_i_streambuf->SetBufferIO(len); // create buffer + stream.CopyTo(m_i_streambuf->GetBufferStart(), len); + m_i_streambuf->SetIntPosition(0); // seek to start pos + m_i_streambuf->Fixed(true); + m_length = len; +} + +wxMemoryInputStream::~wxMemoryInputStream() +{ + delete m_i_streambuf; +} + +char wxMemoryInputStream::Peek() +{ + char *buf = (char *)m_i_streambuf->GetBufferStart(); + size_t pos = m_i_streambuf->GetIntPosition(); + if ( pos == m_length ) + { + m_lasterror = wxSTREAM_READ_ERROR; + + return 0; + } + + return buf[pos]; +} + +size_t wxMemoryInputStream::OnSysRead(void *buffer, size_t nbytes) +{ + size_t pos = m_i_streambuf->GetIntPosition(); + if ( pos == m_length ) + { + m_lasterror = wxSTREAM_EOF; + + return 0; + } + + m_i_streambuf->Read(buffer, nbytes); + m_lasterror = wxSTREAM_NO_ERROR; + + return m_i_streambuf->GetIntPosition() - pos; +} + +wxFileOffset wxMemoryInputStream::OnSysSeek(wxFileOffset pos, wxSeekMode mode) +{ + return m_i_streambuf->Seek(pos, mode); +} + +wxFileOffset wxMemoryInputStream::OnSysTell() const +{ + return m_i_streambuf->Tell(); +} + +// ---------------------------------------------------------------------------- +// wxMemoryOutputStream +// ---------------------------------------------------------------------------- + +wxMemoryOutputStream::wxMemoryOutputStream(void *data, size_t len) +{ + m_o_streambuf = new wxStreamBuffer(wxStreamBuffer::write); + if ( data ) + m_o_streambuf->SetBufferIO(data, len); + m_o_streambuf->Fixed(false); + m_o_streambuf->Flushable(false); +} + +wxMemoryOutputStream::~wxMemoryOutputStream() +{ + delete m_o_streambuf; +} + +size_t wxMemoryOutputStream::OnSysWrite(const void *buffer, size_t nbytes) +{ + size_t oldpos = m_o_streambuf->GetIntPosition(); + m_o_streambuf->Write(buffer, nbytes); + size_t newpos = m_o_streambuf->GetIntPosition(); + + // FIXME can someone please explain what this does? (VZ) + if ( !newpos ) + newpos = m_o_streambuf->GetBufferSize(); + + return newpos - oldpos; +} + +wxFileOffset wxMemoryOutputStream::OnSysSeek(wxFileOffset pos, wxSeekMode mode) +{ + return m_o_streambuf->Seek(pos, mode); +} + +wxFileOffset wxMemoryOutputStream::OnSysTell() const +{ + return m_o_streambuf->Tell(); +} + +size_t wxMemoryOutputStream::CopyTo(void *buffer, size_t len) const +{ + wxCHECK_MSG( buffer, 0, _T("must have buffer to CopyTo") ); + + if ( len > GetSize() ) + len = GetSize(); + + memcpy(buffer, m_o_streambuf->GetBufferStart(), len); + + return len; +} + +#endif // wxUSE_STREAMS diff --git a/Externals/wxWidgets/src/common/nbkbase.cpp b/Externals/wxWidgets/src/common/nbkbase.cpp new file mode 100644 index 0000000000..b63c93585a --- /dev/null +++ b/Externals/wxWidgets/src/common/nbkbase.cpp @@ -0,0 +1,84 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/common/nbkbase.cpp +// Purpose: common wxNotebook methods +// Author: Vadim Zeitlin +// Modified by: +// Created: 02.07.01 +// RCS-ID: $Id: nbkbase.cpp 41764 2006-10-08 23:41:52Z VZ $ +// Copyright: (c) 2001 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_NOTEBOOK + +#ifndef WX_PRECOMP +#endif //WX_PRECOMP + +#include "wx/notebook.h" + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// geometry +// ---------------------------------------------------------------------------- + +wxSize wxNotebookBase::CalcSizeFromPage(const wxSize& sizePage) const +{ + // this is, of course, totally bogus -- but we must do something by + // default because not all ports implement this + wxSize sizeTotal = sizePage; + + if ( HasFlag(wxBK_LEFT) || HasFlag(wxBK_RIGHT) ) + { + sizeTotal.x += 90; + sizeTotal.y += 10; + } + else // tabs on top/bottom side + { + sizeTotal.x += 10; + sizeTotal.y += 40; + } + + return sizeTotal; +} + +// ---------------------------------------------------------------------------- +// events +// ---------------------------------------------------------------------------- + +bool wxNotebookBase::SendPageChangingEvent(int nPage) +{ + wxNotebookEvent event(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING, GetId()); + event.SetSelection(nPage); + event.SetOldSelection(GetSelection()); + event.SetEventObject(this); + return !GetEventHandler()->ProcessEvent(event) || event.IsAllowed(); +} + +void wxNotebookBase::SendPageChangedEvent(int nPageOld, int nPageNew) +{ + wxNotebookEvent event(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED, GetId()); + event.SetSelection(nPageNew == -1 ? GetSelection() : nPageNew); + event.SetOldSelection(nPageOld); + event.SetEventObject(this); + GetEventHandler()->ProcessEvent(event); +} + +#endif // wxUSE_NOTEBOOK diff --git a/Externals/wxWidgets/src/common/object.cpp b/Externals/wxWidgets/src/common/object.cpp new file mode 100644 index 0000000000..6250513dc1 --- /dev/null +++ b/Externals/wxWidgets/src/common/object.cpp @@ -0,0 +1,365 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/object.cpp +// Purpose: wxObject implementation +// Author: Julian Smart +// Modified by: Ron Lee +// Created: 04/01/98 +// RCS-ID: $Id: object.cpp 40111 2006-07-15 22:21:44Z MW $ +// Copyright: (c) 1998 Julian Smart +// (c) 2001 Ron Lee +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#ifndef WX_PRECOMP + #include "wx/object.h" + #include "wx/hash.h" + #include "wx/memory.h" +#endif + +#include + +#if defined(__WXDEBUG__) || wxUSE_DEBUG_CONTEXT + #if defined(__VISAGECPP__) + #define DEBUG_PRINTF(NAME) { static int raz=0; \ + printf( #NAME " %i\n",raz); fflush(stdout); raz++; } + #else + #define DEBUG_PRINTF(NAME) + #endif +#endif // __WXDEBUG__ || wxUSE_DEBUG_CONTEXT + +// we must disable optimizations for VC.NET because otherwise its too eager +// linker discards wxClassInfo objects in release build thus breaking many, +// many things +#if defined __VISUALC__ && __VISUALC__ >= 1300 + #pragma optimize("", off) +#endif + +#if wxUSE_EXTENDED_RTTI +const wxClassInfo* wxObject::ms_classParents[] = { NULL } ; + wxObject* wxVariantToObjectConverterwxObject ( wxxVariant &data ) +{ return data.wxTEMPLATED_MEMBER_CALL(Get , wxObject*) ; } + wxObject* wxVariantOfPtrToObjectConverterwxObject ( wxxVariant &data ) +{ return &data.wxTEMPLATED_MEMBER_CALL(Get , wxObject) ; } + wxxVariant wxObjectToVariantConverterwxObject ( wxObject *data ) + { return wxxVariant( dynamic_cast (data) ) ; } + wxClassInfo wxObject::ms_classInfo(ms_classParents , wxEmptyString , wxT("wxObject"), + (int) sizeof(wxObject), \ + (wxObjectConstructorFn) 0 , + (wxPropertyInfo*) NULL,(wxHandlerInfo*) NULL,0 , 0 , + 0 , wxVariantOfPtrToObjectConverterwxObject , wxVariantToObjectConverterwxObject , wxObjectToVariantConverterwxObject); + template<> void wxStringReadValue(const wxString & , wxObject * & ){assert(0) ;} + template<> void wxStringWriteValue(wxString & , wxObject* const & ){assert(0) ;} + template<> void wxStringReadValue(const wxString & , wxObject & ){assert(0) ;} + template<> void wxStringWriteValue(wxString & , wxObject const & ){assert(0) ;} + wxClassTypeInfo s_typeInfo(wxT_OBJECT_PTR , &wxObject::ms_classInfo , NULL , NULL , typeid(wxObject*).name() ) ; + wxClassTypeInfo s_typeInfowxObject(wxT_OBJECT , &wxObject::ms_classInfo , NULL , NULL , typeid(wxObject).name() ) ; +#else +wxClassInfo wxObject::ms_classInfo( wxT("wxObject"), 0, 0, + (int) sizeof(wxObject), + (wxObjectConstructorFn) 0 ); +#endif + +// restore optimizations +#if defined __VISUALC__ && __VISUALC__ >= 1300 + #pragma optimize("", on) +#endif + +wxClassInfo* wxClassInfo::sm_first = NULL; +wxHashTable* wxClassInfo::sm_classTable = NULL; + +// when using XTI, this method is already implemented inline inside +// DECLARE_DYNAMIC_CLASS but otherwise we intentionally make this function +// non-inline because this allows us to have a non-inline virtual function in +// all wx classes and this solves linking problems for HP-UX native toolchain +// and possibly others (we could make dtor non-inline as well but it's more +// useful to keep it inline than this function) +#if !wxUSE_EXTENDED_RTTI + +wxClassInfo *wxObject::GetClassInfo() const +{ + return &wxObject::ms_classInfo; +} + +#endif // wxUSE_EXTENDED_RTTI + +// this variable exists only so that we can avoid 'always true/false' warnings +const bool wxFalse = false; + +// Is this object a kind of (a subclass of) 'info'? +// E.g. is wxWindow a kind of wxObject? +// Go from this class to superclass, taking into account +// two possible base classes. +bool wxObject::IsKindOf(wxClassInfo *info) const +{ + wxClassInfo *thisInfo = GetClassInfo(); + return (thisInfo) ? thisInfo->IsKindOf(info) : false ; +} + +#if defined(__WXDEBUG__) && wxUSE_MEMORY_TRACING && defined( new ) + #undef new +#endif + + +#ifdef _WX_WANT_NEW_SIZET_WXCHAR_INT +void *wxObject::operator new ( size_t size, const wxChar *fileName, int lineNum ) +{ + return wxDebugAlloc(size, (wxChar*) fileName, lineNum, true); +} +#endif + +#ifdef _WX_WANT_DELETE_VOID +void wxObject::operator delete ( void *buf ) +{ + wxDebugFree(buf); +} +#endif + +#ifdef _WX_WANT_DELETE_VOID_CONSTCHAR_SIZET +void wxObject::operator delete ( void *buf, const char *_fname, size_t _line ) +{ + wxDebugFree(buf); +} +#endif + +#ifdef _WX_WANT_DELETE_VOID_WXCHAR_INT +void wxObject::operator delete ( void *buf, const wxChar *WXUNUSED(fileName), int WXUNUSED(lineNum) ) +{ + wxDebugFree(buf); +} +#endif + +#ifdef _WX_WANT_ARRAY_NEW_SIZET_WXCHAR_INT +void *wxObject::operator new[] ( size_t size, const wxChar* fileName, int lineNum ) +{ + return wxDebugAlloc(size, (wxChar*) fileName, lineNum, true, true); +} +#endif + +#ifdef _WX_WANT_ARRAY_DELETE_VOID +void wxObject::operator delete[] ( void *buf ) +{ + wxDebugFree(buf, true); +} +#endif + +#ifdef _WX_WANT_ARRAY_DELETE_VOID_WXCHAR_INT +void wxObject::operator delete[] (void * buf, const wxChar* WXUNUSED(fileName), int WXUNUSED(lineNum) ) +{ + wxDebugFree(buf, true); +} +#endif + + +// ---------------------------------------------------------------------------- +// wxClassInfo +// ---------------------------------------------------------------------------- + +wxClassInfo::~wxClassInfo() +{ + // remove this object from the linked list of all class infos: if we don't + // do it, loading/unloading a DLL containing static wxClassInfo objects is + // not going to work + if ( this == sm_first ) + { + sm_first = m_next; + } + else + { + wxClassInfo *info = sm_first; + while (info) + { + if ( info->m_next == this ) + { + info->m_next = m_next; + break; + } + + info = info->m_next; + } + } + Unregister(); +} + +wxClassInfo *wxClassInfo::FindClass(const wxChar *className) +{ + if ( sm_classTable ) + { + return (wxClassInfo *)wxClassInfo::sm_classTable->Get(className); + } + else + { + for ( wxClassInfo *info = sm_first; info ; info = info->m_next ) + { + if ( wxStrcmp(info->GetClassName(), className) == 0 ) + return info; + } + + return NULL; + } +} + +// This function wasn't written to be reentrant but there is a possiblity of +// reentrance if something it does causes a shared lib to load and register +// classes. On Solaris this happens when the wxHashTable is newed, so the first +// part of the function has been modified to handle it, and a wxASSERT checks +// against reentrance in the remainder of the function. + +void wxClassInfo::Register() +{ + if ( !sm_classTable ) + { + wxHashTable *classTable = new wxHashTable(wxKEY_STRING); + + // check for reentrance + if ( sm_classTable ) + delete classTable; + else + sm_classTable = classTable; + } + +#ifdef __WXDEBUG__ + // reentrance guard - see note above + static int entry = 0; + wxASSERT_MSG(++entry == 1, _T("wxClassInfo::Register() reentrance")); +#endif + + // Using IMPLEMENT_DYNAMIC_CLASS() macro twice (which may happen if you + // link any object module twice mistakenly, or link twice against wx shared + // library) will break this function because it will enter an infinite loop + // and eventually die with "out of memory" - as this is quite hard to + // detect if you're unaware of this, try to do some checks here. + wxASSERT_MSG( sm_classTable->Get(m_className) == NULL, + wxString::Format + ( + _T("Class \"%s\" already in RTTI table - have you used IMPLEMENT_DYNAMIC_CLASS() multiple times or linked some object file twice)?"), + m_className + ) + ); + + sm_classTable->Put(m_className, (wxObject *)this); + +#ifdef __WXDEBUG__ + --entry; +#endif +} + +void wxClassInfo::Unregister() +{ + if ( sm_classTable ) + { + sm_classTable->Delete(m_className); + if ( sm_classTable->GetCount() == 0 ) + { + delete sm_classTable; + sm_classTable = NULL; + } + } +} + +wxObject *wxCreateDynamicObject(const wxChar *name) +{ +#if defined(__WXDEBUG__) || wxUSE_DEBUG_CONTEXT + DEBUG_PRINTF(wxObject *wxCreateDynamicObject) +#endif + + if ( wxClassInfo::sm_classTable ) + { + wxClassInfo *info = (wxClassInfo *)wxClassInfo::sm_classTable->Get(name); + return info ? info->CreateObject() : NULL; + } + else // no sm_classTable yet + { + for ( wxClassInfo *info = wxClassInfo::sm_first; + info; + info = info->m_next ) + { + if (info->m_className && wxStrcmp(info->m_className, name) == 0) + return info->CreateObject(); + } + + return NULL; + } +} + + +// ---------------------------------------------------------------------------- +// wxObject +// ---------------------------------------------------------------------------- + +void wxObject::Ref(const wxObject& clone) +{ +#if defined(__WXDEBUG__) || wxUSE_DEBUG_CONTEXT + DEBUG_PRINTF(wxObject::Ref) +#endif + + // nothing to be done + if (m_refData == clone.m_refData) + return; + + // delete reference to old data + UnRef(); + + // reference new data + if ( clone.m_refData ) + { + m_refData = clone.m_refData; + ++(m_refData->m_count); + } +} + +void wxObject::UnRef() +{ + if ( m_refData ) + { + wxASSERT_MSG( m_refData->m_count > 0, _T("invalid ref data count") ); + + if ( --m_refData->m_count == 0 ) + delete m_refData; + m_refData = NULL; + } +} + +void wxObject::AllocExclusive() +{ + if ( !m_refData ) + { + m_refData = CreateRefData(); + } + else if ( m_refData->GetRefCount() > 1 ) + { + // note that ref is not going to be destroyed in this case + const wxObjectRefData* ref = m_refData; + UnRef(); + + // ... so we can still access it + m_refData = CloneRefData(ref); + } + //else: ref count is 1, we are exclusive owners of m_refData anyhow + + wxASSERT_MSG( m_refData && m_refData->GetRefCount() == 1, + _T("wxObject::AllocExclusive() failed.") ); +} + +wxObjectRefData *wxObject::CreateRefData() const +{ + // if you use AllocExclusive() you must override this method + wxFAIL_MSG( _T("CreateRefData() must be overridden if called!") ); + + return NULL; +} + +wxObjectRefData * +wxObject::CloneRefData(const wxObjectRefData * WXUNUSED(data)) const +{ + // if you use AllocExclusive() you must override this method + wxFAIL_MSG( _T("CloneRefData() must be overridden if called!") ); + + return NULL; +} diff --git a/Externals/wxWidgets/src/common/overlaycmn.cpp b/Externals/wxWidgets/src/common/overlaycmn.cpp new file mode 100644 index 0000000000..d745289851 --- /dev/null +++ b/Externals/wxWidgets/src/common/overlaycmn.cpp @@ -0,0 +1,197 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/overlaycmn.cpp +// Purpose: common wxOverlay code +// Author: Stefan Csomor +// Modified by: +// Created: 2006-10-20 +// RCS-ID: $Id: overlaycmn.cpp 42397 2006-10-25 12:12:56Z VS $ +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#include "wx/overlay.h" +#include "wx/private/overlay.h" +#include "wx/dcclient.h" +#include "wx/dcmemory.h" + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxOverlay +// ---------------------------------------------------------------------------- + +wxOverlay::wxOverlay() +{ + m_impl = new wxOverlayImpl(); + m_inDrawing = false; +} + +wxOverlay::~wxOverlay() +{ + delete m_impl; +} + +bool wxOverlay::IsOk() +{ + return m_impl->IsOk(); +} + +void wxOverlay::Init( wxWindowDC* dc, int x , int y , int width , int height ) +{ + m_impl->Init(dc, x, y, width, height); +} + +void wxOverlay::BeginDrawing( wxWindowDC* dc) +{ + m_impl->BeginDrawing(dc); + m_inDrawing = true ; +} + +void wxOverlay::EndDrawing( wxWindowDC* dc) +{ + m_impl->EndDrawing(dc); + m_inDrawing = false ; +} + +void wxOverlay::Clear( wxWindowDC* dc) +{ + m_impl->Clear(dc); +} + +void wxOverlay::Reset() +{ + wxASSERT_MSG(m_inDrawing==false,wxT("cannot reset overlay during drawing")); + m_impl->Reset(); +} + + +// ---------------------------------------------------------------------------- +// wxDCOverlay +// ---------------------------------------------------------------------------- + +wxDCOverlay::wxDCOverlay(wxOverlay &overlay, wxWindowDC *dc, int x , int y , int width , int height) : + m_overlay(overlay) +{ + Init(dc, x, y, width, height); +} + +wxDCOverlay::wxDCOverlay(wxOverlay &overlay, wxWindowDC *dc) : + m_overlay(overlay) +{ + int width; + int height; + dc->GetSize(&width,&height); + Init(dc, 0, 0, width, height); +} + +wxDCOverlay::~wxDCOverlay() +{ + m_overlay.EndDrawing(m_dc); +} + +void wxDCOverlay::Init(wxWindowDC *dc, int x , int y , int width , int height ) +{ + m_dc = dc ; + if ( !m_overlay.IsOk() ) + { + m_overlay.Init(dc,x,y,width,height); + } + m_overlay.BeginDrawing(dc); +} + +void wxDCOverlay::Clear() +{ + m_overlay.Clear(m_dc); +} + +// ---------------------------------------------------------------------------- +// generic implementation of wxOverlayImpl +// ---------------------------------------------------------------------------- + +#ifndef wxHAS_NATIVE_OVERLAY + +wxOverlayImpl::wxOverlayImpl() +{ +#if defined(__WXGTK__) || defined(__WXMSW__) + m_window = NULL ; +#endif + m_x = m_y = m_width = m_height = 0 ; +} + +wxOverlayImpl::~wxOverlayImpl() +{ +} + +bool wxOverlayImpl::IsOk() +{ + return m_bmpSaved.Ok() ; +} + +void wxOverlayImpl::Init( wxWindowDC* dc, int x , int y , int width , int height ) +{ +#if defined(__WXGTK__) + m_window = dc->m_owner; +#else + #if defined (__WXMSW__) + m_window = dc->GetWindow(); + #endif // __WXMSW__ + +#endif + wxMemoryDC dcMem ; + m_bmpSaved.Create( width, height ); + dcMem.SelectObject( m_bmpSaved ); + m_x = x ; + m_y = y ; + m_width = width ; + m_height = height ; +#if defined(__WXGTK__) && !defined(__WX_DC_BLIT_FIXED__) + wxPoint pt = dc->GetDeviceOrigin(); + x += pt.x; + y += pt.y; +#endif // broken wxGTK wxDC::Blit + dcMem.Blit(0, 0, m_width, m_height, + dc, x, y); + dcMem.SelectObject( wxNullBitmap ); +} + +void wxOverlayImpl::Clear(wxWindowDC* dc) +{ + wxMemoryDC dcMem ; + dcMem.SelectObject( m_bmpSaved ); + dc->Blit( m_x, m_y, m_width, m_height , &dcMem , 0 , 0 ); + dcMem.SelectObject( wxNullBitmap ); +} + +void wxOverlayImpl::Reset() +{ + m_bmpSaved = wxBitmap(); +} + +void wxOverlayImpl::BeginDrawing(wxWindowDC* WXUNUSED(dc)) +{ +} + +void wxOverlayImpl::EndDrawing(wxWindowDC* WXUNUSED(dc)) +{ +} + +#endif // !wxHAS_NATIVE_OVERLAY + + diff --git a/Externals/wxWidgets/src/common/paper.cpp b/Externals/wxWidgets/src/common/paper.cpp new file mode 100644 index 0000000000..7e7997fcf3 --- /dev/null +++ b/Externals/wxWidgets/src/common/paper.cpp @@ -0,0 +1,373 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/paper.cpp +// Purpose: Paper size classes +// Author: Julian Smart +// Modified by: +// Created: 04/01/98 +// RCS-ID: $Id: paper.cpp 41054 2006-09-07 19:01:45Z ABX $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_PRINTING_ARCHITECTURE + +#ifndef WX_PRECOMP + #if defined(__WXMSW__) + #include "wx/msw/wrapcdlg.h" + #endif // MSW + #include "wx/utils.h" + #include "wx/settings.h" + #include "wx/intl.h" + #include "wx/module.h" +#endif + +#include "wx/paper.h" + +#include +#include + +#ifdef __WXMSW__ + #ifndef __WIN32__ + #include + #endif +#endif + // End __WXMSW__ + +IMPLEMENT_DYNAMIC_CLASS(wxPrintPaperType, wxObject) +// IMPLEMENT_DYNAMIC_CLASS(wxPrintPaperDatabase, wxList) + +/* + * Paper size database for all platforms + */ + +wxPrintPaperType::wxPrintPaperType() +{ + m_paperId = wxPAPER_NONE; + m_platformId = 0; + m_paperName = wxEmptyString; + m_width = 0; + m_height = 0; +} + +wxPrintPaperType::wxPrintPaperType(wxPaperSize paperId, int platformId, const wxString& name, int w, int h) +{ + m_paperId = paperId; + m_platformId = platformId; + m_paperName = name; + m_width = w; + m_height = h; +} + +// Get width and height in points (1/72th of an inch) +wxSize wxPrintPaperType::GetSizeDeviceUnits() const +{ + return wxSize( (int) ((m_width / 10.0) / (25.4 / 72.0)), (int) ((m_height / 10.0) / (25.4 / 72.0)) ); +} + +/* + * Print paper database for PostScript + */ + +WX_DECLARE_LIST(wxPrintPaperType, wxPrintPaperTypeList); +#include "wx/listimpl.cpp" +WX_DEFINE_LIST(wxPrintPaperTypeList) + +wxPrintPaperDatabase* wxThePrintPaperDatabase = (wxPrintPaperDatabase*) NULL; + +wxPrintPaperDatabase::wxPrintPaperDatabase() +{ + m_map = new wxStringToPrintPaperTypeHashMap; + m_list = new wxPrintPaperTypeList; +} + +wxPrintPaperDatabase::~wxPrintPaperDatabase() +{ + ClearDatabase(); +} + +void wxPrintPaperDatabase::CreateDatabase() +{ + WXADDPAPER(wxPAPER_LETTER, DMPAPER_LETTER, wxTRANSLATE("Letter, 8 1/2 x 11 in"), 2159, 2794); + WXADDPAPER(wxPAPER_LEGAL, DMPAPER_LEGAL, wxTRANSLATE("Legal, 8 1/2 x 14 in"), 2159, 3556); + WXADDPAPER(wxPAPER_A4, DMPAPER_A4, wxTRANSLATE("A4 sheet, 210 x 297 mm"), 2100, 2970); + WXADDPAPER(wxPAPER_CSHEET, DMPAPER_CSHEET, wxTRANSLATE("C sheet, 17 x 22 in"), 4318, 5588); + WXADDPAPER(wxPAPER_DSHEET, DMPAPER_DSHEET, wxTRANSLATE("D sheet, 22 x 34 in"), 5588, 8636); + WXADDPAPER(wxPAPER_ESHEET, DMPAPER_ESHEET, wxTRANSLATE("E sheet, 34 x 44 in"), 8636, 11176); + WXADDPAPER(wxPAPER_LETTERSMALL, DMPAPER_LETTERSMALL, wxTRANSLATE("Letter Small, 8 1/2 x 11 in"), 2159, 2794); + WXADDPAPER(wxPAPER_TABLOID, DMPAPER_TABLOID, wxTRANSLATE("Tabloid, 11 x 17 in"), 2794, 4318); + WXADDPAPER(wxPAPER_LEDGER, DMPAPER_LEDGER, wxTRANSLATE("Ledger, 17 x 11 in"), 4318, 2794); + WXADDPAPER(wxPAPER_STATEMENT, DMPAPER_STATEMENT, wxTRANSLATE("Statement, 5 1/2 x 8 1/2 in"), 1397, 2159); + WXADDPAPER(wxPAPER_EXECUTIVE, DMPAPER_EXECUTIVE, wxTRANSLATE("Executive, 7 1/4 x 10 1/2 in"), 1842, 2667); + WXADDPAPER(wxPAPER_A3, DMPAPER_A3, wxTRANSLATE("A3 sheet, 297 x 420 mm"), 2970, 4200); + WXADDPAPER(wxPAPER_A4SMALL, DMPAPER_A4SMALL, wxTRANSLATE("A4 small sheet, 210 x 297 mm"), 2100, 2970); + WXADDPAPER(wxPAPER_A5, DMPAPER_A5, wxTRANSLATE("A5 sheet, 148 x 210 mm"), 1480, 2100); + WXADDPAPER(wxPAPER_B4, DMPAPER_B4, wxTRANSLATE("B4 sheet, 250 x 354 mm"), 2500, 3540); + WXADDPAPER(wxPAPER_B5, DMPAPER_B5, wxTRANSLATE("B5 sheet, 182 x 257 millimeter"), 1820, 2570); + WXADDPAPER(wxPAPER_FOLIO, DMPAPER_FOLIO, wxTRANSLATE("Folio, 8 1/2 x 13 in"), 2159, 3302); + WXADDPAPER(wxPAPER_QUARTO, DMPAPER_QUARTO, wxTRANSLATE("Quarto, 215 x 275 mm"), 2150, 2750); + WXADDPAPER(wxPAPER_10X14, DMPAPER_10X14, wxTRANSLATE("10 x 14 in"), 2540, 3556); + WXADDPAPER(wxPAPER_11X17, DMPAPER_11X17, wxTRANSLATE("11 x 17 in"), 2794, 4318); + WXADDPAPER(wxPAPER_NOTE, DMPAPER_NOTE, wxTRANSLATE("Note, 8 1/2 x 11 in"), 2159, 2794); + WXADDPAPER(wxPAPER_ENV_9, DMPAPER_ENV_9, wxTRANSLATE("#9 Envelope, 3 7/8 x 8 7/8 in"), 984, 2254); + WXADDPAPER(wxPAPER_ENV_10, DMPAPER_ENV_10, wxTRANSLATE("#10 Envelope, 4 1/8 x 9 1/2 in"), 1048, 2413); + WXADDPAPER(wxPAPER_ENV_11, DMPAPER_ENV_11, wxTRANSLATE("#11 Envelope, 4 1/2 x 10 3/8 in"), 1143, 2635); + WXADDPAPER(wxPAPER_ENV_12, DMPAPER_ENV_12, wxTRANSLATE("#12 Envelope, 4 3/4 x 11 in"), 1206, 2794); + WXADDPAPER(wxPAPER_ENV_14, DMPAPER_ENV_14, wxTRANSLATE("#14 Envelope, 5 x 11 1/2 in"), 1270, 2921); + WXADDPAPER(wxPAPER_ENV_DL, DMPAPER_ENV_DL, wxTRANSLATE("DL Envelope, 110 x 220 mm"), 1100, 2200); + WXADDPAPER(wxPAPER_ENV_C5, DMPAPER_ENV_C5, wxTRANSLATE("C5 Envelope, 162 x 229 mm"), 1620, 2290); + WXADDPAPER(wxPAPER_ENV_C3, DMPAPER_ENV_C3, wxTRANSLATE("C3 Envelope, 324 x 458 mm"), 3240, 4580); + WXADDPAPER(wxPAPER_ENV_C4, DMPAPER_ENV_C4, wxTRANSLATE("C4 Envelope, 229 x 324 mm"), 2290, 3240); + WXADDPAPER(wxPAPER_ENV_C6, DMPAPER_ENV_C6, wxTRANSLATE("C6 Envelope, 114 x 162 mm"), 1140, 1620); + WXADDPAPER(wxPAPER_ENV_C65, DMPAPER_ENV_C65, wxTRANSLATE("C65 Envelope, 114 x 229 mm"), 1140, 2290); + WXADDPAPER(wxPAPER_ENV_B4, DMPAPER_ENV_B4, wxTRANSLATE("B4 Envelope, 250 x 353 mm"), 2500, 3530); + WXADDPAPER(wxPAPER_ENV_B5, DMPAPER_ENV_B5, wxTRANSLATE("B5 Envelope, 176 x 250 mm"), 1760, 2500); + WXADDPAPER(wxPAPER_ENV_B6, DMPAPER_ENV_B6, wxTRANSLATE("B6 Envelope, 176 x 125 mm"), 1760, 1250); + WXADDPAPER(wxPAPER_ENV_ITALY, DMPAPER_ENV_ITALY, wxTRANSLATE("Italy Envelope, 110 x 230 mm"), 1100, 2300); + WXADDPAPER(wxPAPER_ENV_MONARCH, DMPAPER_ENV_MONARCH, wxTRANSLATE("Monarch Envelope, 3 7/8 x 7 1/2 in"), 984, 1905); + WXADDPAPER(wxPAPER_ENV_PERSONAL, DMPAPER_ENV_PERSONAL, wxTRANSLATE("6 3/4 Envelope, 3 5/8 x 6 1/2 in"), 921, 1651); + WXADDPAPER(wxPAPER_FANFOLD_US, DMPAPER_FANFOLD_US, wxTRANSLATE("US Std Fanfold, 14 7/8 x 11 in"), 3778, 2794); + WXADDPAPER(wxPAPER_FANFOLD_STD_GERMAN, DMPAPER_FANFOLD_STD_GERMAN, wxTRANSLATE("German Std Fanfold, 8 1/2 x 12 in"), 2159, 3048); + WXADDPAPER(wxPAPER_FANFOLD_LGL_GERMAN, DMPAPER_FANFOLD_LGL_GERMAN, wxTRANSLATE("German Legal Fanfold, 8 1/2 x 13 in"), 2159, 3302); + + WXADDPAPER(wxPAPER_ISO_B4, DMPAPER_ISO_B4, wxTRANSLATE("B4 (ISO) 250 x 353 mm"), 2500, 2530); + WXADDPAPER(wxPAPER_JAPANESE_POSTCARD, DMPAPER_JAPANESE_POSTCARD, wxTRANSLATE("Japanese Postcard 100 x 148 mm"), 1000, 1480); + WXADDPAPER(wxPAPER_9X11, DMPAPER_9X11, wxTRANSLATE("9 x 11 in"), 2286, 2794); + WXADDPAPER(wxPAPER_10X11, DMPAPER_10X11, wxTRANSLATE("10 x 11 in"), 2540, 2794); + WXADDPAPER(wxPAPER_15X11, DMPAPER_15X11, wxTRANSLATE("15 x 11 in"), 3810, 2794); + WXADDPAPER(wxPAPER_ENV_INVITE, DMPAPER_ENV_INVITE, wxTRANSLATE("Envelope Invite 220 x 220 mm"), 2200, 2200); + WXADDPAPER(wxPAPER_LETTER_EXTRA, DMPAPER_LETTER_EXTRA, wxTRANSLATE("Letter Extra 9 1/2 x 12 in"), 2413, 3048); + WXADDPAPER(wxPAPER_LEGAL_EXTRA, DMPAPER_LEGAL_EXTRA, wxTRANSLATE("Legal Extra 9 1/2 x 15 in"), 2413, 3810); + WXADDPAPER(wxPAPER_TABLOID_EXTRA, DMPAPER_TABLOID_EXTRA, wxTRANSLATE("Tabloid Extra 11.69 x 18 in"), 2969, 4572); + WXADDPAPER(wxPAPER_A4_EXTRA, DMPAPER_A4_EXTRA, wxTRANSLATE("A4 Extra 9.27 x 12.69 in"), 2355, 3223); + WXADDPAPER(wxPAPER_LETTER_TRANSVERSE, DMPAPER_LETTER_TRANSVERSE, wxTRANSLATE("Letter Transverse 8 1/2 x 11 in"), 2159, 2794); + WXADDPAPER(wxPAPER_A4_TRANSVERSE, DMPAPER_A4_TRANSVERSE, wxTRANSLATE("A4 Transverse 210 x 297 mm"), 2100, 2970); + WXADDPAPER(wxPAPER_LETTER_EXTRA_TRANSVERSE, DMPAPER_LETTER_EXTRA_TRANSVERSE, wxTRANSLATE("Letter Extra Transverse 9.275 x 12 in"), 2355, 3048); + WXADDPAPER(wxPAPER_A_PLUS, DMPAPER_A_PLUS, wxTRANSLATE("SuperA/SuperA/A4 227 x 356 mm"), 2270, 3560); + WXADDPAPER(wxPAPER_B_PLUS, DMPAPER_B_PLUS, wxTRANSLATE("SuperB/SuperB/A3 305 x 487 mm"), 3050, 4870); + WXADDPAPER(wxPAPER_LETTER_PLUS, DMPAPER_LETTER_PLUS, wxTRANSLATE("Letter Plus 8 1/2 x 12.69 in"), 2159, 3223); + WXADDPAPER(wxPAPER_A4_PLUS, DMPAPER_A4_PLUS, wxTRANSLATE("A4 Plus 210 x 330 mm"), 2100, 3300); + WXADDPAPER(wxPAPER_A5_TRANSVERSE, DMPAPER_A5_TRANSVERSE, wxTRANSLATE("A5 Transverse 148 x 210 mm"), 1480, 2100); + WXADDPAPER(wxPAPER_B5_TRANSVERSE, DMPAPER_B5_TRANSVERSE, wxTRANSLATE("B5 (JIS) Transverse 182 x 257 mm"), 1820, 2570); + WXADDPAPER(wxPAPER_A3_EXTRA, DMPAPER_A3_EXTRA, wxTRANSLATE("A3 Extra 322 x 445 mm"), 3220, 4450); + WXADDPAPER(wxPAPER_A5_EXTRA, DMPAPER_A5_EXTRA, wxTRANSLATE("A5 Extra 174 x 235 mm"), 1740, 2350); + WXADDPAPER(wxPAPER_B5_EXTRA, DMPAPER_B5_EXTRA, wxTRANSLATE("B5 (ISO) Extra 201 x 276 mm"), 2010, 2760); + WXADDPAPER(wxPAPER_A2, DMPAPER_A2, wxTRANSLATE("A2 420 x 594 mm"), 4200, 5940); + WXADDPAPER(wxPAPER_A3_TRANSVERSE, DMPAPER_A3_TRANSVERSE, wxTRANSLATE("A3 Transverse 297 x 420 mm"), 2970, 4200); + WXADDPAPER(wxPAPER_A3_EXTRA_TRANSVERSE,DMPAPER_A3_EXTRA_TRANSVERSE,wxTRANSLATE("A3 Extra Transverse 322 x 445 mm"), 3220, 4450); + + WXADDPAPER(wxPAPER_DBL_JAPANESE_POSTCARD, 69, wxTRANSLATE("Japanese Double Postcard 200 x 148 mm"), 2000, 1480); + WXADDPAPER(wxPAPER_A6, 70, wxTRANSLATE("A6 105 x 148 mm"), 1050, 1480); + WXADDPAPER(wxPAPER_JENV_KAKU2, 71, wxTRANSLATE("Japanese Envelope Kaku #2"), 2400, 3320); + WXADDPAPER(wxPAPER_JENV_KAKU3, 72, wxTRANSLATE("Japanese Envelope Kaku #3"), 2160, 2770); + WXADDPAPER(wxPAPER_JENV_CHOU3, 73, wxTRANSLATE("Japanese Envelope Chou #3"), 1200, 2350); + WXADDPAPER(wxPAPER_JENV_CHOU4, 74, wxTRANSLATE("Japanese Envelope Chou #4"), 900, 2050); + WXADDPAPER(wxPAPER_LETTER_ROTATED, 75, wxTRANSLATE("Letter Rotated 11 x 8 1/2 in"), 2794, 2159); + WXADDPAPER(wxPAPER_A3_ROTATED, 76, wxTRANSLATE("A3 Rotated 420 x 297 mm"), 4200, 2970); + WXADDPAPER(wxPAPER_A4_ROTATED, 77, wxTRANSLATE("A4 Rotated 297 x 210 mm"), 2970, 2100); + WXADDPAPER(wxPAPER_A5_ROTATED, 78, wxTRANSLATE("A5 Rotated 210 x 148 mm"), 2100, 1480); + WXADDPAPER(wxPAPER_B4_JIS_ROTATED, 79, wxTRANSLATE("B4 (JIS) Rotated 364 x 257 mm"), 3640, 2570); + WXADDPAPER(wxPAPER_B5_JIS_ROTATED, 80, wxTRANSLATE("B5 (JIS) Rotated 257 x 182 mm"), 2570, 1820); + WXADDPAPER(wxPAPER_JAPANESE_POSTCARD_ROTATED, 81, wxTRANSLATE("Japanese Postcard Rotated 148 x 100 mm"), 1480, 1000); + WXADDPAPER(wxPAPER_DBL_JAPANESE_POSTCARD_ROTATED, 82, wxTRANSLATE("Double Japanese Postcard Rotated 148 x 200 mm"), 1480, 2000); + WXADDPAPER(wxPAPER_A6_ROTATED, 83, wxTRANSLATE("A6 Rotated 148 x 105 mm"), 1480, 1050); + WXADDPAPER(wxPAPER_JENV_KAKU2_ROTATED, 84, wxTRANSLATE("Japanese Envelope Kaku #2 Rotated"), 3320, 2400); + WXADDPAPER(wxPAPER_JENV_KAKU3_ROTATED, 85, wxTRANSLATE("Japanese Envelope Kaku #3 Rotated"), 2770, 2160); + WXADDPAPER(wxPAPER_JENV_CHOU3_ROTATED, 86, wxTRANSLATE("Japanese Envelope Chou #3 Rotated"), 2350, 1200); + WXADDPAPER(wxPAPER_JENV_CHOU4_ROTATED, 87, wxTRANSLATE("Japanese Envelope Chou #4 Rotated"), 2050, 900); + WXADDPAPER(wxPAPER_B6_JIS, 88, wxTRANSLATE("B6 (JIS) 128 x 182 mm"), 1280, 1820); + WXADDPAPER(wxPAPER_B6_JIS_ROTATED, 89, wxTRANSLATE("B6 (JIS) Rotated 182 x 128 mm"), 1920, 1280); + WXADDPAPER(wxPAPER_12X11, 90, wxTRANSLATE("12 x 11 in"), 3048, 2794); + WXADDPAPER(wxPAPER_JENV_YOU4, 91, wxTRANSLATE("Japanese Envelope You #4"), 2350, 1050); + WXADDPAPER(wxPAPER_JENV_YOU4_ROTATED, 92, wxTRANSLATE("Japanese Envelope You #4 Rotated"), 1050, 2350); + WXADDPAPER(wxPAPER_P16K, 93, wxTRANSLATE("PRC 16K 146 x 215 mm"), 1460, 2150); + WXADDPAPER(wxPAPER_P32K, 94, wxTRANSLATE("PRC 32K 97 x 151 mm"), 970, 1510); + WXADDPAPER(wxPAPER_P32KBIG, 95, wxTRANSLATE("PRC 32K(Big) 97 x 151 mm"), 970, 1510); + WXADDPAPER(wxPAPER_PENV_1, 96, wxTRANSLATE("PRC Envelope #1 102 x 165 mm"), 1020, 1650); + WXADDPAPER(wxPAPER_PENV_2, 97, wxTRANSLATE("PRC Envelope #2 102 x 176 mm"), 1020, 1760); + WXADDPAPER(wxPAPER_PENV_3, 98, wxTRANSLATE("PRC Envelope #3 125 x 176 mm"), 1250, 1760); + WXADDPAPER(wxPAPER_PENV_4, 99, wxTRANSLATE("PRC Envelope #4 110 x 208 mm"), 1100, 2080); + WXADDPAPER(wxPAPER_PENV_5, 100, wxTRANSLATE("PRC Envelope #5 110 x 220 mm"), 1100, 2200); + WXADDPAPER(wxPAPER_PENV_6, 101, wxTRANSLATE("PRC Envelope #6 120 x 230 mm"), 1200, 2300); + WXADDPAPER(wxPAPER_PENV_7, 102, wxTRANSLATE("PRC Envelope #7 160 x 230 mm"), 1600, 2300); + WXADDPAPER(wxPAPER_PENV_8, 103, wxTRANSLATE("PRC Envelope #8 120 x 309 mm"), 1200, 3090); + WXADDPAPER(wxPAPER_PENV_9, 104, wxTRANSLATE("PRC Envelope #9 229 x 324 mm"), 2290, 3240); + WXADDPAPER(wxPAPER_PENV_10, 105, wxTRANSLATE("PRC Envelope #10 324 x 458 mm"), 3240, 4580); + WXADDPAPER(wxPAPER_P16K_ROTATED, 106, wxTRANSLATE("PRC 16K Rotated"), 2150, 1460); + WXADDPAPER(wxPAPER_P32K_ROTATED, 107, wxTRANSLATE("PRC 32K Rotated"), 1510, 970); + WXADDPAPER(wxPAPER_P32KBIG_ROTATED, 108, wxTRANSLATE("PRC 32K(Big) Rotated"), 1510, 970); + WXADDPAPER(wxPAPER_PENV_1_ROTATED, 109, wxTRANSLATE("PRC Envelope #1 Rotated 165 x 102 mm"), 1650, 1020); + WXADDPAPER(wxPAPER_PENV_2_ROTATED, 110, wxTRANSLATE("PRC Envelope #2 Rotated 176 x 102 mm"), 1760, 1020); + WXADDPAPER(wxPAPER_PENV_3_ROTATED, 111, wxTRANSLATE("PRC Envelope #3 Rotated 176 x 125 mm"), 1760, 1250); + WXADDPAPER(wxPAPER_PENV_4_ROTATED, 112, wxTRANSLATE("PRC Envelope #4 Rotated 208 x 110 mm"), 2080, 1100); + WXADDPAPER(wxPAPER_PENV_5_ROTATED, 113, wxTRANSLATE("PRC Envelope #5 Rotated 220 x 110 mm"), 2200, 1100); + WXADDPAPER(wxPAPER_PENV_6_ROTATED, 114, wxTRANSLATE("PRC Envelope #6 Rotated 230 x 120 mm"), 2300, 1200); + WXADDPAPER(wxPAPER_PENV_7_ROTATED, 115, wxTRANSLATE("PRC Envelope #7 Rotated 230 x 160 mm"), 2300, 1600); + WXADDPAPER(wxPAPER_PENV_8_ROTATED, 116, wxTRANSLATE("PRC Envelope #8 Rotated 309 x 120 mm"), 3090, 1200); + WXADDPAPER(wxPAPER_PENV_9_ROTATED, 117, wxTRANSLATE("PRC Envelope #9 Rotated 324 x 229 mm"), 3240, 2290); + WXADDPAPER(wxPAPER_PENV_10_ROTATED, 118, wxTRANSLATE("PRC Envelope #10 Rotated 458 x 324 mm"), 4580, 3240); +} + +void wxPrintPaperDatabase::ClearDatabase() +{ + delete m_list; + WX_CLEAR_HASH_MAP(wxStringToPrintPaperTypeHashMap, *m_map); + delete m_map; +} + +void wxPrintPaperDatabase::AddPaperType(wxPaperSize paperId, const wxString& name, int w, int h) +{ + wxPrintPaperType* tmp = new wxPrintPaperType(paperId, 0, name, w, h); + (*m_map)[name] = tmp; + m_list->push_back(tmp); +} + +void wxPrintPaperDatabase::AddPaperType(wxPaperSize paperId, int platformId, const wxString& name, int w, int h) +{ + wxPrintPaperType* tmp = new wxPrintPaperType(paperId, platformId, name, w, h); + (*m_map)[name] = tmp; + m_list->push_back(tmp); +} + +wxPrintPaperType *wxPrintPaperDatabase::FindPaperType(const wxString& name) +{ + wxStringToPrintPaperTypeHashMap::iterator it = m_map->find(name); + if (it != m_map->end()) + return it->second; + else + return NULL; +} + +wxPrintPaperType *wxPrintPaperDatabase::FindPaperType(wxPaperSize id) +{ + typedef wxStringToPrintPaperTypeHashMap::iterator iterator; + + for (iterator it = m_map->begin(), en = m_map->end(); it != en; ++it) + { + wxPrintPaperType* paperType = it->second; + if (paperType->GetId() == id) + return paperType; + } + + return NULL; +} + +wxPrintPaperType *wxPrintPaperDatabase::FindPaperTypeByPlatformId(int id) +{ + typedef wxStringToPrintPaperTypeHashMap::iterator iterator; + + for (iterator it = m_map->begin(), en = m_map->end(); it != en; ++it) + { + wxPrintPaperType* paperType = it->second; + if (paperType->GetPlatformId() == id) + return paperType; + } + + return NULL; +} + +wxPrintPaperType *wxPrintPaperDatabase::FindPaperType(const wxSize& sz) +{ + typedef wxStringToPrintPaperTypeHashMap::iterator iterator; + + for (iterator it = m_map->begin(), en = m_map->end(); it != en; ++it) + { + wxPrintPaperType* paperType = it->second; + wxSize paperSize = paperType->GetSize() ; + if ( abs( paperSize.x - sz.x ) < 10 && abs( paperSize.y - sz.y ) < 10 ) + return paperType; + } + + return NULL; +} + +// Convert name to size id +wxPaperSize wxPrintPaperDatabase::ConvertNameToId(const wxString& name) +{ + wxPrintPaperType* type = FindPaperType(name); + if (type) + return type->GetId(); + else + return wxPAPER_NONE; +} + +// Convert size id to name +wxString wxPrintPaperDatabase::ConvertIdToName(wxPaperSize paperId) +{ + wxPrintPaperType* type = FindPaperType(paperId); + if (type) + return type->GetName(); + else + return wxEmptyString; +} + +// Get the paper size +wxSize wxPrintPaperDatabase::GetSize(wxPaperSize paperId) +{ + wxPrintPaperType* type = FindPaperType(paperId); + if (type) + return type->GetSize(); + else + return wxSize(0,0); +} + +// Get the paper size +wxPaperSize wxPrintPaperDatabase::GetSize(const wxSize& size) +{ + wxPrintPaperType* type = FindPaperType(size); + if (type) + return type->GetId(); + else + return wxPAPER_NONE; +} + +// QUICK and DIRTY +size_t wxPrintPaperDatabase::GetCount() const +{ + return m_list->GetCount(); +} + +wxPrintPaperType* wxPrintPaperDatabase::Item(size_t index) const +{ + return m_list->Item(index)->GetData(); +} + +// A module to allow initialization/cleanup of print paper +// things without calling these functions from app.cpp. + +class WXDLLEXPORT wxPrintPaperModule: public wxModule +{ +DECLARE_DYNAMIC_CLASS(wxPrintPaperModule) +public: + wxPrintPaperModule() {} + bool OnInit(); + void OnExit(); +}; + +IMPLEMENT_DYNAMIC_CLASS(wxPrintPaperModule, wxModule) + +/* + * Initialization/cleanup module + */ + +bool wxPrintPaperModule::OnInit() +{ + wxThePrintPaperDatabase = new wxPrintPaperDatabase; + wxThePrintPaperDatabase->CreateDatabase(); + + return true; +} + +void wxPrintPaperModule::OnExit() +{ + delete wxThePrintPaperDatabase; + wxThePrintPaperDatabase = NULL; +} + +#endif // wxUSE_PRINTING_ARCHITECTURE diff --git a/Externals/wxWidgets/src/common/pickerbase.cpp b/Externals/wxWidgets/src/common/pickerbase.cpp new file mode 100644 index 0000000000..beb6059277 --- /dev/null +++ b/Externals/wxWidgets/src/common/pickerbase.cpp @@ -0,0 +1,175 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/common/pickerbase.cpp +// Purpose: wxPickerBase class implementation +// Author: Francesco Montorsi +// Modified by: +// Created: 15/04/2006 +// RCS-ID: $Id: pickerbase.cpp 44218 2007-01-14 16:18:36Z VZ $ +// Copyright: (c) Francesco Montorsi +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_COLOURPICKERCTRL || \ + wxUSE_DIRPICKERCTRL || \ + wxUSE_FILEPICKERCTRL || \ + wxUSE_FONTPICKERCTRL + +#include "wx/pickerbase.h" +#include "wx/tooltip.h" + +#ifndef WX_PRECOMP + #include "wx/textctrl.h" +#endif + + +// ============================================================================ +// implementation +// ============================================================================ + +IMPLEMENT_ABSTRACT_CLASS(wxPickerBase, wxControl) + +BEGIN_EVENT_TABLE(wxPickerBase, wxControl) + EVT_SIZE(wxPickerBase::OnSize) + WX_EVENT_TABLE_CONTROL_CONTAINER(wxPickerBase) +END_EVENT_TABLE() +WX_DELEGATE_TO_CONTROL_CONTAINER(wxPickerBase, wxControl) + + +// ---------------------------------------------------------------------------- +// wxPickerBase +// ---------------------------------------------------------------------------- + +bool wxPickerBase::CreateBase(wxWindow *parent, + wxWindowID id, + const wxString &text, + const wxPoint& pos, + const wxSize& size, + long style, + const wxValidator& validator, + const wxString& name) +{ + // remove any border style from our style as wxPickerBase's window must be + // invisible (user styles must be set on the textctrl or the platform-dependent picker) + style &= ~wxBORDER_MASK; + if (!wxControl::Create(parent, id, pos, size, style | wxNO_BORDER | wxTAB_TRAVERSAL, + validator, name)) + return false; + + m_sizer = new wxBoxSizer(wxHORIZONTAL); + + if (HasFlag(wxPB_USE_TEXTCTRL)) + { + // NOTE: the style of this class (wxPickerBase) and the style of the + // attached text control are different: GetTextCtrlStyle() extracts + // the styles related to the textctrl from the styles passed here + m_text = new wxTextCtrl(this, wxID_ANY, wxEmptyString, + wxDefaultPosition, wxDefaultSize, + GetTextCtrlStyle(style)); + if (!m_text) + { + wxFAIL_MSG( wxT("wxPickerBase's textctrl creation failed") ); + return false; + } + + // set the maximum lenght allowed for this textctrl. + // This is very important since any change to it will trigger an update in + // the m_picker; for very long strings, this real-time synchronization could + // become a CPU-blocker and thus should be avoided. + // 32 characters will be more than enough for all common uses. + m_text->SetMaxLength(32); + + // set the initial contents of the textctrl + m_text->SetValue(text); + + m_text->Connect(wxEVT_COMMAND_TEXT_UPDATED, + wxCommandEventHandler(wxPickerBase::OnTextCtrlUpdate), + NULL, this); + m_text->Connect(wxEVT_KILL_FOCUS, + wxFocusEventHandler(wxPickerBase::OnTextCtrlKillFocus), + NULL, this); + + m_text->Connect(wxEVT_DESTROY, + wxWindowDestroyEventHandler(wxPickerBase::OnTextCtrlDelete), + NULL, this); + + // the text control's proportion values defaults to 2 + m_sizer->Add(m_text, 2, GetDefaultTextCtrlFlag(), 5); + } + + return true; +} + +void wxPickerBase::PostCreation() +{ + // the picker's proportion value defaults to 1 when there's no text control + // associated with it - in that case it defaults to 0 + m_sizer->Add(m_picker, HasTextCtrl() ? 0 : 1, GetDefaultPickerCtrlFlag(), 5); + + SetSizer(m_sizer); + SetMinSize( m_sizer->GetMinSize() ); +} + +#if wxUSE_TOOLTIPS + +void wxPickerBase::DoSetToolTip(wxToolTip *tip) +{ + // don't set the tooltip on us but rather on our two child windows + // as otherwise it would appear only when the cursor is placed on the + // small area around the child windows which belong to wxPickerBase + m_picker->SetToolTip(tip); + + // do a copy as wxWindow will own the pointer we pass + if ( m_text ) + m_text->SetToolTip(tip ? new wxToolTip(tip->GetTip()) : NULL); +} + +#endif // wxUSE_TOOLTIPS + +// ---------------------------------------------------------------------------- +// wxPickerBase - event handlers +// ---------------------------------------------------------------------------- + +void wxPickerBase::OnTextCtrlKillFocus(wxFocusEvent &) +{ + wxASSERT(m_text); + + // don't leave the textctrl empty + if (m_text->GetValue().empty()) + UpdateTextCtrlFromPicker(); +} + +void wxPickerBase::OnTextCtrlDelete(wxWindowDestroyEvent &) +{ + // the textctrl has been deleted; our pointer is invalid! + m_text = NULL; +} + +void wxPickerBase::OnTextCtrlUpdate(wxCommandEvent &) +{ + // for each text-change, update the picker + UpdatePickerFromTextCtrl(); +} + +void wxPickerBase::OnSize(wxSizeEvent &event) +{ + if (GetAutoLayout()) + Layout(); + event.Skip(); +} + +#endif // Any picker in use diff --git a/Externals/wxWidgets/src/common/platinfo.cpp b/Externals/wxWidgets/src/common/platinfo.cpp new file mode 100644 index 0000000000..c61fc393d3 --- /dev/null +++ b/Externals/wxWidgets/src/common/platinfo.cpp @@ -0,0 +1,336 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/common/platinfo.cpp +// Purpose: implements wxPlatformInfo class +// Author: Francesco Montorsi +// Modified by: +// Created: 07.07.2006 (based on wxToolkitInfo) +// RCS-ID: $Id: platinfo.cpp 44078 2006-12-30 21:46:22Z SN $ +// Copyright: (c) 2006 Francesco Montorsi +// License: wxWindows license +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// for compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#include "wx/platinfo.h" + +#ifndef WX_PRECOMP + #include "wx/app.h" + #include "wx/utils.h" +#endif //WX_PRECOMP + +#include "wx/apptrait.h" + +// global object +// VERY IMPORTANT: do not use the default constructor since it would +// try to init the wxPlatformInfo instance using +// gs_platInfo itself! +static wxPlatformInfo gs_platInfo(wxPORT_UNKNOWN); + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +static const wxChar* const wxOperatingSystemIdNames[] = +{ + _T("Apple Mac OS"), + _T("Apple Mac OS X"), + + _T("Microsoft Windows 9X"), + _T("Microsoft Windows NT"), + _T("Microsoft Windows Micro"), + _T("Microsoft Windows CE"), + + _T("Linux"), + _T("FreeBSD"), + _T("OpenBSD"), + _T("NetBSD"), + + _T("SunOS"), + _T("AIX"), + _T("HPUX"), + + _T("Other Unix"), + _T("Other Unix"), + + _T("DOS"), + _T("OS/2") +}; + +static const wxChar* const wxPortIdNames[] = +{ + _T("wxBase"), + _T("wxMSW"), + _T("wxMotif"), + _T("wxGTK"), + _T("wxMGL"), + _T("wxX11"), + _T("wxOS2"), + _T("wxMac"), + _T("wxCocoa"), + _T("wxWinCE"), + _T("wxPalmOS"), + _T("wxDFB") +}; + +static const wxChar* const wxArchitectureNames[] = +{ + _T("32 bit"), + _T("64 bit") +}; + +static const wxChar* const wxEndiannessNames[] = +{ + _T("Big endian"), + _T("Little endian"), + _T("PDP endian") +}; + +// ---------------------------------------------------------------------------- +// local functions +// ---------------------------------------------------------------------------- + +// returns log in base 2 of the value, this maps the enum values to the +// corresponding indices +static unsigned wxGetIndexFromEnumValue(int value) +{ + wxCHECK_MSG( value, (unsigned)-1, _T("invalid enum value") ); + + int n = 0; + while ( !(value & 1) ) + { + value >>= 1; + n++; + } + + wxASSERT_MSG( value == 1, _T("more than one bit set in enum value") ); + + return n; +} + +// ---------------------------------------------------------------------------- +// wxPlatformInfo +// ---------------------------------------------------------------------------- + +wxPlatformInfo::wxPlatformInfo() +{ + // just copy platform info for currently running platform + *this = Get(); +} + +wxPlatformInfo::wxPlatformInfo(wxPortId pid, int tkMajor, int tkMinor, + wxOperatingSystemId id, int osMajor, int osMinor, + wxArchitecture arch, + wxEndianness endian, + bool usingUniversal) +{ + m_tkVersionMajor = tkMajor; + m_tkVersionMinor = tkMinor; + m_port = pid; + m_usingUniversal = usingUniversal; + + m_os = id; + m_osVersionMajor = osMajor; + m_osVersionMinor = osMinor; + + m_endian = endian; + m_arch = arch; +} + +bool wxPlatformInfo::operator==(const wxPlatformInfo &t) const +{ + return m_tkVersionMajor == t.m_tkVersionMajor && + m_tkVersionMinor == t.m_tkVersionMinor && + m_osVersionMajor == t.m_osVersionMajor && + m_osVersionMinor == t.m_osVersionMinor && + m_os == t.m_os && + m_port == t.m_port && + m_usingUniversal == t.m_usingUniversal && + m_arch == t.m_arch && + m_endian == t.m_endian; +} + +void wxPlatformInfo::InitForCurrentPlatform() +{ + // autodetect all informations + const wxAppTraits * const traits = wxTheApp ? wxTheApp->GetTraits() : NULL; + if ( !traits ) + { + wxFAIL_MSG( _T("failed to initialize wxPlatformInfo") ); + + m_port = wxPORT_UNKNOWN; + m_usingUniversal = false; + m_tkVersionMajor = + m_tkVersionMinor = 0; + } + else + { + m_port = traits->GetToolkitVersion(&m_tkVersionMajor, &m_tkVersionMinor); + m_usingUniversal = traits->IsUsingUniversalWidgets(); + } + + m_os = wxGetOsVersion(&m_osVersionMajor, &m_osVersionMinor); + m_endian = wxIsPlatformLittleEndian() ? wxENDIAN_LITTLE : wxENDIAN_BIG; + m_arch = wxIsPlatform64Bit() ? wxARCH_64 : wxARCH_32; +} + +/* static */ +const wxPlatformInfo& wxPlatformInfo::Get() +{ + static bool initialized = false; + if ( !initialized ) + { + gs_platInfo.InitForCurrentPlatform(); + initialized = true; + } + + return gs_platInfo; +} + + + +// ---------------------------------------------------------------------------- +// wxPlatformInfo - enum -> string conversions +// ---------------------------------------------------------------------------- + +wxString wxPlatformInfo::GetOperatingSystemFamilyName(wxOperatingSystemId os) +{ + const wxChar* string = _T("Unknown"); + if ( os & wxOS_MAC ) + string = _T("Macintosh"); + else if ( os & wxOS_WINDOWS ) + string = _T("Windows"); + else if ( os & wxOS_UNIX ) + string = _T("Unix"); + else if ( os == wxOS_DOS ) + string = _T("DOS"); + else if ( os == wxOS_OS2 ) + string = _T("OS/2"); + + return string; +} + +wxString wxPlatformInfo::GetOperatingSystemIdName(wxOperatingSystemId os) +{ + const unsigned idx = wxGetIndexFromEnumValue(os); + + wxCHECK_MSG( idx < WXSIZEOF(wxOperatingSystemIdNames), wxEmptyString, + _T("invalid OS id") ); + + return wxOperatingSystemIdNames[idx]; +} + +wxString wxPlatformInfo::GetPortIdName(wxPortId port, bool usingUniversal) +{ + const unsigned idx = wxGetIndexFromEnumValue(port); + + wxCHECK_MSG( idx < WXSIZEOF(wxPortIdNames), wxEmptyString, + _T("invalid port id") ); + + wxString ret = wxPortIdNames[idx]; + + if ( usingUniversal ) + ret += wxT("/wxUniversal"); + + return ret; +} + +wxString wxPlatformInfo::GetPortIdShortName(wxPortId port, bool usingUniversal) +{ + const unsigned idx = wxGetIndexFromEnumValue(port); + + wxCHECK_MSG( idx < WXSIZEOF(wxPortIdNames), wxEmptyString, + _T("invalid port id") ); + + wxString ret = wxPortIdNames[idx]; + ret = ret.Mid(2).Lower(); // remove 'wx' prefix + + if ( usingUniversal ) + ret += wxT("univ"); + + return ret; +} + +wxString wxPlatformInfo::GetArchName(wxArchitecture arch) +{ + wxCOMPILE_TIME_ASSERT( WXSIZEOF(wxArchitectureNames) == wxARCH_MAX, + wxArchitectureNamesMismatch ); + + return wxArchitectureNames[arch]; +} + +wxString wxPlatformInfo::GetEndiannessName(wxEndianness end) +{ + wxCOMPILE_TIME_ASSERT( WXSIZEOF(wxEndiannessNames) == wxENDIAN_MAX, + wxEndiannessNamesMismatch ); + + return wxEndiannessNames[end]; +} + + +// ---------------------------------------------------------------------------- +// wxPlatformInfo - string -> enum conversions +// ---------------------------------------------------------------------------- + +wxOperatingSystemId wxPlatformInfo::GetOperatingSystemId(const wxString &str) +{ + for ( size_t i = 0; i < WXSIZEOF(wxOperatingSystemIdNames); i++ ) + { + if ( wxString(wxOperatingSystemIdNames[i]).CmpNoCase(str) == 0 ) + return (wxOperatingSystemId)(1 << i); + } + + return wxOS_UNKNOWN; +} + +wxPortId wxPlatformInfo::GetPortId(const wxString &str) +{ + // recognize both short and long port names + for ( size_t i = 0; i < WXSIZEOF(wxPortIdNames); i++ ) + { + wxPortId current = (wxPortId)(1 << i); + + if ( wxString(wxPortIdNames[i]).CmpNoCase(str) == 0 || + GetPortIdShortName(current, true).CmpNoCase(str) == 0 || + GetPortIdShortName(current, false).CmpNoCase(str) == 0 ) + return current; + } + + return wxPORT_UNKNOWN; +} + +wxArchitecture wxPlatformInfo::GetArch(const wxString &arch) +{ + if ( arch.Contains(wxT("32")) ) + return wxARCH_32; + + if ( arch.Contains(wxT("64")) ) + return wxARCH_64; + + return wxARCH_INVALID; +} + +wxEndianness wxPlatformInfo::GetEndianness(const wxString& end) +{ + wxString endl(end.Lower()); + if ( end.StartsWith(wxT("little")) ) + return wxENDIAN_LITTLE; + + if ( end.StartsWith(wxT("big")) ) + return wxENDIAN_BIG; + + return wxENDIAN_INVALID; +} + diff --git a/Externals/wxWidgets/src/common/popupcmn.cpp b/Externals/wxWidgets/src/common/popupcmn.cpp new file mode 100644 index 0000000000..fc92158a8d --- /dev/null +++ b/Externals/wxWidgets/src/common/popupcmn.cpp @@ -0,0 +1,595 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/common/popupcmn.cpp +// Purpose: implementation of wxPopupTransientWindow +// Author: Vadim Zeitlin +// Modified by: +// Created: 06.01.01 +// RCS-ID: $Id: popupcmn.cpp 49643 2007-11-05 16:55:13Z SC $ +// Copyright: (c) 2001 Vadim Zeitlin +// License: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_POPUPWIN + +#include "wx/popupwin.h" + +#ifndef WX_PRECOMP + #include "wx/combobox.h" // wxComboCtrl + #include "wx/app.h" // wxPostEvent + #include "wx/log.h" +#endif //WX_PRECOMP + +#include "wx/recguard.h" + +#ifdef __WXUNIVERSAL__ + #include "wx/univ/renderer.h" + #include "wx/scrolbar.h" +#endif // __WXUNIVERSAL__ + +#ifdef __WXGTK__ + #include +#endif +#ifdef __WXX11__ +#include "wx/x11/private.h" +#endif + +IMPLEMENT_DYNAMIC_CLASS(wxPopupWindow, wxWindow) +IMPLEMENT_DYNAMIC_CLASS(wxPopupTransientWindow, wxPopupWindow) + +#if wxUSE_COMBOBOX && defined(__WXUNIVERSAL__) + IMPLEMENT_DYNAMIC_CLASS(wxPopupComboWindow, wxPopupTransientWindow) +#endif + +// ---------------------------------------------------------------------------- +// private classes +// ---------------------------------------------------------------------------- + +// event handlers which we use to intercept events which cause the popup to +// disappear +class wxPopupWindowHandler : public wxEvtHandler +{ +public: + wxPopupWindowHandler(wxPopupTransientWindow *popup) : m_popup(popup) {} + +protected: + // event handlers + void OnLeftDown(wxMouseEvent& event); + +private: + wxPopupTransientWindow *m_popup; + + DECLARE_EVENT_TABLE() + DECLARE_NO_COPY_CLASS(wxPopupWindowHandler) +}; + +class wxPopupFocusHandler : public wxEvtHandler +{ +public: + wxPopupFocusHandler(wxPopupTransientWindow *popup) : m_popup(popup) {} + +protected: + void OnKillFocus(wxFocusEvent& event); + void OnKeyDown(wxKeyEvent& event); + +private: + wxPopupTransientWindow *m_popup; + + DECLARE_EVENT_TABLE() + DECLARE_NO_COPY_CLASS(wxPopupFocusHandler) +}; + +// ---------------------------------------------------------------------------- +// event tables +// ---------------------------------------------------------------------------- + +BEGIN_EVENT_TABLE(wxPopupWindowHandler, wxEvtHandler) + EVT_LEFT_DOWN(wxPopupWindowHandler::OnLeftDown) +END_EVENT_TABLE() + +BEGIN_EVENT_TABLE(wxPopupFocusHandler, wxEvtHandler) + EVT_KILL_FOCUS(wxPopupFocusHandler::OnKillFocus) + EVT_KEY_DOWN(wxPopupFocusHandler::OnKeyDown) +END_EVENT_TABLE() + +BEGIN_EVENT_TABLE(wxPopupTransientWindow, wxPopupWindow) +#if defined( __WXMSW__ ) || defined( __WXMAC__ ) + EVT_IDLE(wxPopupTransientWindow::OnIdle) +#endif +END_EVENT_TABLE() + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxPopupWindowBase +// ---------------------------------------------------------------------------- + +wxPopupWindowBase::~wxPopupWindowBase() +{ + // this destructor is required for Darwin +} + +bool wxPopupWindowBase::Create(wxWindow* WXUNUSED(parent), int WXUNUSED(flags)) +{ + return true; +} + +void wxPopupWindowBase::Position(const wxPoint& ptOrigin, + const wxSize& size) +{ + wxSize sizeScreen = wxGetDisplaySize(), + sizeSelf = GetSize(); + + // is there enough space to put the popup below the window (where we put it + // by default)? + wxCoord y = ptOrigin.y + size.y; + if ( y + sizeSelf.y > sizeScreen.y ) + { + // check if there is enough space above + if ( ptOrigin.y > sizeSelf.y ) + { + // do position the control above the window + y -= size.y + sizeSelf.y; + } + //else: not enough space below nor above, leave below + } + + // now check left/right too + wxCoord x = ptOrigin.x; + + if ( wxTheApp->GetLayoutDirection() == wxLayout_RightToLeft ) + { + // shift the window to the left instead of the right. + x -= size.x; + x -= sizeSelf.x; // also shift it by window width. + } + else + x += size.x; + + + if ( x + sizeSelf.x > sizeScreen.x ) + { + // check if there is enough space to the left + if ( ptOrigin.x > sizeSelf.x ) + { + // do position the control to the left + x -= size.x + sizeSelf.x; + } + //else: not enough space there neither, leave in default position + } + + Move(x, y, wxSIZE_NO_ADJUSTMENTS); +} + +// ---------------------------------------------------------------------------- +// wxPopupTransientWindow +// ---------------------------------------------------------------------------- + +void wxPopupTransientWindow::Init() +{ + m_child = + m_focus = (wxWindow *)NULL; + + m_handlerFocus = NULL; + m_handlerPopup = NULL; +} + +wxPopupTransientWindow::wxPopupTransientWindow(wxWindow *parent, int style) +{ + Init(); + + (void)Create(parent, style); +} + +wxPopupTransientWindow::~wxPopupTransientWindow() +{ + if (m_handlerPopup && m_handlerPopup->GetNextHandler()) + PopHandlers(); + + wxASSERT(!m_handlerFocus || !m_handlerFocus->GetNextHandler()); + wxASSERT(!m_handlerPopup || !m_handlerPopup->GetNextHandler()); + + delete m_handlerFocus; + delete m_handlerPopup; +} + +void wxPopupTransientWindow::PopHandlers() +{ + if ( m_child ) + { + if ( !m_child->RemoveEventHandler(m_handlerPopup) ) + { + // something is very wrong and someone else probably deleted our + // handler - so don't risk deleting it second time + m_handlerPopup = NULL; + } + if (m_child->HasCapture()) + { + m_child->ReleaseMouse(); + } + m_child = NULL; + } + + if ( m_focus ) + { + if ( !m_focus->RemoveEventHandler(m_handlerFocus) ) + { + // see above + m_handlerFocus = NULL; + } + } + m_focus = NULL; +} + +void wxPopupTransientWindow::Popup(wxWindow *winFocus) +{ + const wxWindowList& children = GetChildren(); + if ( children.GetCount() ) + { + m_child = children.GetFirst()->GetData(); + } + else + { + m_child = this; + } + + Show(); + + // There is is a problem if these are still in use + wxASSERT(!m_handlerFocus || !m_handlerFocus->GetNextHandler()); + wxASSERT(!m_handlerPopup || !m_handlerPopup->GetNextHandler()); + + if (!m_handlerPopup) + m_handlerPopup = new wxPopupWindowHandler(this); + + m_child->PushEventHandler(m_handlerPopup); + + m_focus = winFocus ? winFocus : this; + m_focus->SetFocus(); + +#if defined( __WXMSW__ ) || defined( __WXMAC__ ) + // MSW doesn't allow to set focus to the popup window, but we need to + // subclass the window which has the focus, and not winFocus passed in or + // otherwise everything else breaks down + m_focus = FindFocus(); +#elif defined(__WXGTK__) + // GTK+ catches the activate events from the popup + // window, not the focus events from the child window + m_focus = this; +#endif + + if ( m_focus ) + { + if (!m_handlerFocus) + m_handlerFocus = new wxPopupFocusHandler(this); + + m_focus->PushEventHandler(m_handlerFocus); + } +} + +bool wxPopupTransientWindow::Show( bool show ) +{ +#ifdef __WXGTK__ + if (!show) + { + gdk_pointer_ungrab( (guint32)GDK_CURRENT_TIME ); + + gtk_grab_remove( m_widget ); + } +#endif + +#ifdef __WXX11__ + if (!show) + { + XUngrabPointer( wxGlobalDisplay(), CurrentTime ); + } +#endif + +#if defined( __WXMSW__ ) || defined( __WMAC__ ) + if (!show && m_child && m_child->HasCapture()) + { + m_child->ReleaseMouse(); + } +#endif + + bool ret = wxPopupWindow::Show( show ); + +#ifdef __WXGTK__ + if (show) + { + gtk_grab_add( m_widget ); + + gdk_pointer_grab( m_widget->window, TRUE, + (GdkEventMask) + (GDK_BUTTON_PRESS_MASK | + GDK_BUTTON_RELEASE_MASK | + GDK_POINTER_MOTION_HINT_MASK | + GDK_POINTER_MOTION_MASK), + (GdkWindow *) NULL, + (GdkCursor *) NULL, + (guint32)GDK_CURRENT_TIME ); + } +#endif + +#ifdef __WXX11__ + if (show) + { + Window xwindow = (Window) m_clientWindow; + + /* int res =*/ XGrabPointer(wxGlobalDisplay(), xwindow, + True, + ButtonPressMask | ButtonReleaseMask | ButtonMotionMask | EnterWindowMask | LeaveWindowMask | PointerMotionMask, + GrabModeAsync, + GrabModeAsync, + None, + None, + CurrentTime ); + } +#endif + +#if defined( __WXMSW__ ) || defined( __WMAC__ ) + if (show && m_child) + { + // Assume that the mouse is outside the popup to begin with + m_child->CaptureMouse(); + } +#endif + + return ret; +} + +void wxPopupTransientWindow::Dismiss() +{ + Hide(); + PopHandlers(); +} + +void wxPopupTransientWindow::DismissAndNotify() +{ + Dismiss(); + OnDismiss(); +} + +void wxPopupTransientWindow::OnDismiss() +{ + // nothing to do here - but it may be interesting for derived class +} + +bool wxPopupTransientWindow::ProcessLeftDown(wxMouseEvent& WXUNUSED(event)) +{ + // no special processing here + return false; +} + +#if defined( __WXMSW__ ) || defined( __WXMAC__ ) +void wxPopupTransientWindow::OnIdle(wxIdleEvent& event) +{ + event.Skip(); + + if (IsShown() && m_child) + { + wxPoint pos = ScreenToClient(wxGetMousePosition()); + wxRect rect(GetSize()); + + if ( rect.Contains(pos) ) + { + if ( m_child->HasCapture() ) + { + m_child->ReleaseMouse(); + } + } + else + { + if ( !m_child->HasCapture() ) + { + m_child->CaptureMouse(); + } + } + } +} +#endif // __WXMSW__ + + +#if wxUSE_COMBOBOX && defined(__WXUNIVERSAL__) + +// ---------------------------------------------------------------------------- +// wxPopupComboWindow +// ---------------------------------------------------------------------------- + +BEGIN_EVENT_TABLE(wxPopupComboWindow, wxPopupTransientWindow) + EVT_KEY_DOWN(wxPopupComboWindow::OnKeyDown) +END_EVENT_TABLE() + +wxPopupComboWindow::wxPopupComboWindow(wxComboCtrl *parent) + : wxPopupTransientWindow(parent) +{ + m_combo = parent; +} + +bool wxPopupComboWindow::Create(wxComboCtrl *parent) +{ + m_combo = parent; + + return wxPopupWindow::Create(parent); +} + +void wxPopupComboWindow::PositionNearCombo() +{ + // the origin point must be in screen coords + wxPoint ptOrigin = m_combo->ClientToScreen(wxPoint(0,0)); + +#if 0 //def __WXUNIVERSAL__ + // account for the fact that (0, 0) is not the top left corner of the + // window: there is also the border + wxRect rectBorders = m_combo->GetRenderer()-> + GetBorderDimensions(m_combo->GetBorder()); + ptOrigin.x -= rectBorders.x; + ptOrigin.y -= rectBorders.y; +#endif // __WXUNIVERSAL__ + + // position below or above the combobox: the width is 0 to put it exactly + // below us, not to the left or to the right + Position(ptOrigin, wxSize(0, m_combo->GetSize().y)); +} + +void wxPopupComboWindow::OnDismiss() +{ + m_combo->OnPopupDismiss(); +} + +void wxPopupComboWindow::OnKeyDown(wxKeyEvent& event) +{ + m_combo->ProcessEvent(event); +} + +#endif // wxUSE_COMBOBOX && defined(__WXUNIVERSAL__) + +// ---------------------------------------------------------------------------- +// wxPopupWindowHandler +// ---------------------------------------------------------------------------- + +void wxPopupWindowHandler::OnLeftDown(wxMouseEvent& event) +{ + // let the window have it first (we're the first event handler in the chain + // of handlers for this window) + if ( m_popup->ProcessLeftDown(event) ) + { + return; + } + + wxPoint pos = event.GetPosition(); + + // in non-Univ ports the system manages scrollbars for us +#if defined(__WXUNIVERSAL__) && wxUSE_SCROLLBAR + // scrollbar on which the click occurred + wxWindow *sbar = NULL; +#endif // __WXUNIVERSAL__ && wxUSE_SCROLLBAR + + wxWindow *win = (wxWindow *)event.GetEventObject(); + + switch ( win->HitTest(pos.x, pos.y) ) + { + case wxHT_WINDOW_OUTSIDE: + { + // do the coords translation now as after DismissAndNotify() + // m_popup may be destroyed + wxMouseEvent event2(event); + + m_popup->ClientToScreen(&event2.m_x, &event2.m_y); + + // clicking outside a popup dismisses it + m_popup->DismissAndNotify(); + + // dismissing a tooltip shouldn't waste a click, i.e. you + // should be able to dismiss it and press the button with the + // same click, so repost this event to the window beneath us + wxWindow *winUnder = wxFindWindowAtPoint(event2.GetPosition()); + if ( winUnder ) + { + // translate the event coords to the ones of the window + // which is going to get the event + winUnder->ScreenToClient(&event2.m_x, &event2.m_y); + + event2.SetEventObject(winUnder); + wxPostEvent(winUnder, event2); + } + } + break; + +#if defined(__WXUNIVERSAL__) && wxUSE_SCROLLBAR + case wxHT_WINDOW_HORZ_SCROLLBAR: + sbar = win->GetScrollbar(wxHORIZONTAL); + break; + + case wxHT_WINDOW_VERT_SCROLLBAR: + sbar = win->GetScrollbar(wxVERTICAL); + break; +#endif // __WXUNIVERSAL__ && wxUSE_SCROLLBAR + + default: + // forgot to update the switch after adding a new hit test code? + wxFAIL_MSG( _T("unexpected HitTest() return value") ); + // fall through + + case wxHT_WINDOW_CORNER: + // don't actually know if this one is good for anything, but let it + // pass just in case + + case wxHT_WINDOW_INSIDE: + // let the normal processing take place + event.Skip(); + break; + } + +#if defined(__WXUNIVERSAL__) && wxUSE_SCROLLBAR + if ( sbar ) + { + // translate the event coordinates to the scrollbar ones + pos = sbar->ScreenToClient(win->ClientToScreen(pos)); + + // and give the event to it + wxMouseEvent event2 = event; + event2.m_x = pos.x; + event2.m_y = pos.y; + + (void)sbar->GetEventHandler()->ProcessEvent(event2); + } +#endif // __WXUNIVERSAL__ && wxUSE_SCROLLBAR +} + +// ---------------------------------------------------------------------------- +// wxPopupFocusHandler +// ---------------------------------------------------------------------------- + +void wxPopupFocusHandler::OnKillFocus(wxFocusEvent& event) +{ + // when we lose focus we always disappear - unless it goes to the popup (in + // which case we don't really lose it) + wxWindow *win = event.GetWindow(); + while ( win ) + { + if ( win == m_popup ) + return; + win = win->GetParent(); + } + + m_popup->DismissAndNotify(); +} + +void wxPopupFocusHandler::OnKeyDown(wxKeyEvent& event) +{ + // we can be associated with the popup itself in which case we should avoid + // infinite recursion + static int s_inside; + wxRecursionGuard guard(s_inside); + if ( guard.IsInside() ) + { + event.Skip(); + return; + } + + // let the window have it first, it might process the keys + if ( !m_popup->GetEventHandler()->ProcessEvent(event) ) + { + // by default, dismiss the popup + m_popup->DismissAndNotify(); + } +} + +#endif // wxUSE_POPUPWIN diff --git a/Externals/wxWidgets/src/common/powercmn.cpp b/Externals/wxWidgets/src/common/powercmn.cpp new file mode 100644 index 0000000000..82f28c416e --- /dev/null +++ b/Externals/wxWidgets/src/common/powercmn.cpp @@ -0,0 +1,59 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/common/powercmn.cpp +// Purpose: power event types and stubs for power functions +// Author: Vadim Zeitlin +// Modified by: +// Created: 2006-05-27 +// RCS-ID: $Id: powercmn.cpp 48811 2007-09-19 23:11:28Z RD $ +// Copyright: (c) 2006 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// for compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#ifndef WX_PRECOMP +#endif //WX_PRECOMP + +#include "wx/power.h" + +// ============================================================================ +// implementation +// ============================================================================ + +#ifdef wxHAS_POWER_EVENTS + DEFINE_EVENT_TYPE(wxEVT_POWER_SUSPENDING) + DEFINE_EVENT_TYPE(wxEVT_POWER_SUSPENDED) + DEFINE_EVENT_TYPE(wxEVT_POWER_SUSPEND_CANCEL) + DEFINE_EVENT_TYPE(wxEVT_POWER_RESUME) + + IMPLEMENT_ABSTRACT_CLASS(wxPowerEvent, wxEvent) +#endif + +// provide stubs for the systems not implementing these functions +#if !defined(__WXPALMOS__) && !defined(__WXMSW__) + +wxPowerType wxGetPowerType() +{ + return wxPOWER_UNKNOWN; +} + +wxBatteryState wxGetBatteryState() +{ + return wxBATTERY_UNKNOWN_STATE; +} + +#endif // systems without power management functions + diff --git a/Externals/wxWidgets/src/common/prntbase.cpp b/Externals/wxWidgets/src/common/prntbase.cpp new file mode 100644 index 0000000000..1eb29887ff --- /dev/null +++ b/Externals/wxWidgets/src/common/prntbase.cpp @@ -0,0 +1,1761 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/prntbase.cpp +// Purpose: Printing framework base class implementation +// Author: Julian Smart +// Modified by: +// Created: 04/01/98 +// RCS-ID: $Id: prntbase.cpp 42763 2006-10-30 20:34:25Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_PRINTING_ARCHITECTURE + +#include "wx/dcprint.h" + +#ifndef WX_PRECOMP + #if defined(__WXMSW__) + #include "wx/msw/wrapcdlg.h" + #endif // MSW + #include "wx/utils.h" + #include "wx/dc.h" + #include "wx/app.h" + #include "wx/math.h" + #include "wx/msgdlg.h" + #include "wx/layout.h" + #include "wx/choice.h" + #include "wx/button.h" + #include "wx/settings.h" + #include "wx/dcmemory.h" + #include "wx/stattext.h" + #include "wx/intl.h" + #include "wx/textdlg.h" + #include "wx/sizer.h" + #include "wx/module.h" +#endif // !WX_PRECOMP + +#include "wx/prntbase.h" +#include "wx/printdlg.h" +#include "wx/print.h" +#include "wx/dcprint.h" + +#include +#include + +#if defined(__WXMSW__) && !defined(__WXUNIVERSAL__) +#include "wx/msw/printdlg.h" +#elif defined(__WXMAC__) +#include "wx/mac/printdlg.h" +#include "wx/mac/private/print.h" +#else +#include "wx/generic/prntdlgg.h" +#include "wx/dcps.h" +#endif + +#ifdef __WXMSW__ + #ifndef __WIN32__ + #include + #endif +#endif // __WXMSW__ + +//---------------------------------------------------------------------------- +// wxPrintFactory +//---------------------------------------------------------------------------- + +wxPrintFactory *wxPrintFactory::m_factory = NULL; + +void wxPrintFactory::SetPrintFactory( wxPrintFactory *factory ) +{ + if (wxPrintFactory::m_factory) + delete wxPrintFactory::m_factory; + + wxPrintFactory::m_factory = factory; +} + +wxPrintFactory *wxPrintFactory::GetFactory() +{ + if (!wxPrintFactory::m_factory) + wxPrintFactory::m_factory = new wxNativePrintFactory; + + return wxPrintFactory::m_factory; +} + +//---------------------------------------------------------------------------- +// wxNativePrintFactory +//---------------------------------------------------------------------------- + +wxPrinterBase *wxNativePrintFactory::CreatePrinter( wxPrintDialogData *data ) +{ +#if defined(__WXMSW__) && !defined(__WXUNIVERSAL__) + return new wxWindowsPrinter( data ); +#elif defined(__WXMAC__) + return new wxMacPrinter( data ); +#elif defined(__WXPM__) + return new wxOS2Printer( data ); +#else + return new wxPostScriptPrinter( data ); +#endif +} + +wxPrintPreviewBase *wxNativePrintFactory::CreatePrintPreview( wxPrintout *preview, + wxPrintout *printout, wxPrintDialogData *data ) +{ +#if defined(__WXMSW__) && !defined(__WXUNIVERSAL__) + return new wxWindowsPrintPreview( preview, printout, data ); +#elif defined(__WXMAC__) + return new wxMacPrintPreview( preview, printout, data ); +#elif defined(__WXPM__) + return new wxOS2PrintPreview( preview, printout, data ); +#else + return new wxPostScriptPrintPreview( preview, printout, data ); +#endif +} + +wxPrintPreviewBase *wxNativePrintFactory::CreatePrintPreview( wxPrintout *preview, + wxPrintout *printout, wxPrintData *data ) +{ +#if defined(__WXMSW__) && !defined(__WXUNIVERSAL__) + return new wxWindowsPrintPreview( preview, printout, data ); +#elif defined(__WXMAC__) + return new wxMacPrintPreview( preview, printout, data ); +#elif defined(__WXPM__) + return new wxOS2PrintPreview( preview, printout, data ); +#else + return new wxPostScriptPrintPreview( preview, printout, data ); +#endif +} + +wxPrintDialogBase *wxNativePrintFactory::CreatePrintDialog( wxWindow *parent, + wxPrintDialogData *data ) +{ +#if defined(__WXMSW__) && !defined(__WXUNIVERSAL__) + return new wxWindowsPrintDialog( parent, data ); +#elif defined(__WXMAC__) + return new wxMacPrintDialog( parent, data ); +#else + return new wxGenericPrintDialog( parent, data ); +#endif +} + +wxPrintDialogBase *wxNativePrintFactory::CreatePrintDialog( wxWindow *parent, + wxPrintData *data ) +{ +#if defined(__WXMSW__) && !defined(__WXUNIVERSAL__) + return new wxWindowsPrintDialog( parent, data ); +#elif defined(__WXMAC__) + return new wxMacPrintDialog( parent, data ); +#else + return new wxGenericPrintDialog( parent, data ); +#endif +} + +wxPageSetupDialogBase *wxNativePrintFactory::CreatePageSetupDialog( wxWindow *parent, + wxPageSetupDialogData *data ) +{ +#if defined(__WXMSW__) && !defined(__WXUNIVERSAL__) + return new wxWindowsPageSetupDialog( parent, data ); +#elif defined(__WXMAC__) + return new wxMacPageSetupDialog( parent, data ); +#else + return new wxGenericPageSetupDialog( parent, data ); +#endif +} + +bool wxNativePrintFactory::HasPrintSetupDialog() +{ +#if defined(__WXMSW__) && !defined(__WXUNIVERSAL__) + return false; +#elif defined(__WXMAC__) + return false; +#else + // Only here do we need to provide the print setup + // dialog ourselves, the other platforms either have + // none, don't make it accessible or let you configure + // the printer from the wxPrintDialog anyway. + return true; +#endif + +} + +wxDialog *wxNativePrintFactory::CreatePrintSetupDialog( wxWindow *parent, + wxPrintData *data ) +{ +#if defined(__WXMSW__) && !defined(__WXUNIVERSAL__) + wxUnusedVar(parent); + wxUnusedVar(data); + return NULL; +#elif defined(__WXMAC__) + wxUnusedVar(parent); + wxUnusedVar(data); + return NULL; +#else + // Only here do we need to provide the print setup + // dialog ourselves, the other platforms either have + // none, don't make it accessible or let you configure + // the printer from the wxPrintDialog anyway. + return new wxGenericPrintSetupDialog( parent, data ); +#endif +} + +wxDC* wxNativePrintFactory::CreatePrinterDC( const wxPrintData& data ) +{ +#if defined(__WXMSW__) && !defined(__WXUNIVERSAL__) + return new wxPrinterDC(data); +#elif defined(__WXMAC__) + return new wxPrinterDC(data); +#else + return new wxPostScriptDC(data); +#endif +} + +bool wxNativePrintFactory::HasOwnPrintToFile() +{ + // Only relevant for PostScript and here the + // setup dialog provides no "print to file" + // option. In the GNOME setup dialog, the + // setup dialog has its own print to file. + return false; +} + +bool wxNativePrintFactory::HasPrinterLine() +{ + // Only relevant for PostScript for now + return true; +} + +wxString wxNativePrintFactory::CreatePrinterLine() +{ + // Only relevant for PostScript for now + + // We should query "lpstat -d" here + return _("Generic PostScript"); +} + +bool wxNativePrintFactory::HasStatusLine() +{ + // Only relevant for PostScript for now + return true; +} + +wxString wxNativePrintFactory::CreateStatusLine() +{ + // Only relevant for PostScript for now + + // We should query "lpstat -r" or "lpstat -p" here + return _("Ready"); +} + +wxPrintNativeDataBase *wxNativePrintFactory::CreatePrintNativeData() +{ +#if defined(__WXMSW__) && !defined(__WXUNIVERSAL__) + return new wxWindowsPrintNativeData; +#elif defined(__WXMAC__) + return new wxMacCarbonPrintData; +#else + return new wxPostScriptPrintNativeData; +#endif +} + +//---------------------------------------------------------------------------- +// wxPrintNativeDataBase +//---------------------------------------------------------------------------- + +IMPLEMENT_ABSTRACT_CLASS(wxPrintNativeDataBase, wxObject) + +wxPrintNativeDataBase::wxPrintNativeDataBase() +{ + m_ref = 1; +} + +//---------------------------------------------------------------------------- +// wxPrintFactoryModule +//---------------------------------------------------------------------------- + +class wxPrintFactoryModule: public wxModule +{ +public: + wxPrintFactoryModule() {} + bool OnInit() { return true; } + void OnExit() { wxPrintFactory::SetPrintFactory( NULL ); } + +private: + DECLARE_DYNAMIC_CLASS(wxPrintFactoryModule) +}; + +IMPLEMENT_DYNAMIC_CLASS(wxPrintFactoryModule, wxModule) + +//---------------------------------------------------------------------------- +// wxPrinterBase +//---------------------------------------------------------------------------- + +IMPLEMENT_CLASS(wxPrinterBase, wxObject) + +wxPrinterBase::wxPrinterBase(wxPrintDialogData *data) +{ + m_currentPrintout = (wxPrintout *) NULL; + sm_abortWindow = (wxWindow *) NULL; + sm_abortIt = false; + if (data) + m_printDialogData = (*data); + sm_lastError = wxPRINTER_NO_ERROR; +} + +wxWindow *wxPrinterBase::sm_abortWindow = (wxWindow *) NULL; +bool wxPrinterBase::sm_abortIt = false; +wxPrinterError wxPrinterBase::sm_lastError = wxPRINTER_NO_ERROR; + +wxPrinterBase::~wxPrinterBase() +{ +} + +wxWindow *wxPrinterBase::CreateAbortWindow(wxWindow *parent, wxPrintout * printout) +{ + wxPrintAbortDialog *dialog = new wxPrintAbortDialog(parent, _("Printing ") , wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE); + + wxBoxSizer *button_sizer = new wxBoxSizer( wxVERTICAL ); + button_sizer->Add( new wxStaticText(dialog, wxID_ANY, _("Please wait while printing\n") + printout->GetTitle() ), 0, wxALL, 10 ); + button_sizer->Add( new wxButton( dialog, wxID_CANCEL, wxT("Cancel") ), 0, wxALL | wxALIGN_CENTER, 10 ); + + dialog->SetAutoLayout( true ); + dialog->SetSizer( button_sizer ); + + button_sizer->Fit(dialog); + button_sizer->SetSizeHints (dialog) ; + + return dialog; +} + +void wxPrinterBase::ReportError(wxWindow *parent, wxPrintout *WXUNUSED(printout), const wxString& message) +{ + wxMessageBox(message, _("Printing Error"), wxOK, parent); +} + +wxPrintDialogData& wxPrinterBase::GetPrintDialogData() const +{ + return (wxPrintDialogData&) m_printDialogData; +} + +//---------------------------------------------------------------------------- +// wxPrinter +//---------------------------------------------------------------------------- + +IMPLEMENT_CLASS(wxPrinter, wxPrinterBase) + +wxPrinter::wxPrinter(wxPrintDialogData *data) +{ + m_pimpl = wxPrintFactory::GetFactory()->CreatePrinter( data ); +} + +wxPrinter::~wxPrinter() +{ + delete m_pimpl; +} + +wxWindow *wxPrinter::CreateAbortWindow(wxWindow *parent, wxPrintout *printout) +{ + return m_pimpl->CreateAbortWindow( parent, printout ); +} + +void wxPrinter::ReportError(wxWindow *parent, wxPrintout *printout, const wxString& message) +{ + m_pimpl->ReportError( parent, printout, message ); +} + +bool wxPrinter::Setup(wxWindow *parent) +{ + return m_pimpl->Setup( parent ); +} + +bool wxPrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt) +{ + return m_pimpl->Print( parent, printout, prompt ); +} + +wxDC* wxPrinter::PrintDialog(wxWindow *parent) +{ + return m_pimpl->PrintDialog( parent ); +} + +wxPrintDialogData& wxPrinter::GetPrintDialogData() const +{ + return m_pimpl->GetPrintDialogData(); +} + +// --------------------------------------------------------------------------- +// wxPrintDialogBase: the dialog for printing. +// --------------------------------------------------------------------------- + +IMPLEMENT_ABSTRACT_CLASS(wxPrintDialogBase, wxDialog) + +wxPrintDialogBase::wxPrintDialogBase(wxWindow *parent, + wxWindowID id, + const wxString &title, + const wxPoint &pos, + const wxSize &size, + long style) + : wxDialog( parent, id, title.empty() ? wxString(_("Print")) : title, + pos, size, style ) +{ +} + +// --------------------------------------------------------------------------- +// wxPrintDialog: the dialog for printing +// --------------------------------------------------------------------------- + +IMPLEMENT_CLASS(wxPrintDialog, wxObject) + +wxPrintDialog::wxPrintDialog(wxWindow *parent, wxPrintDialogData* data) +{ + m_pimpl = wxPrintFactory::GetFactory()->CreatePrintDialog( parent, data ); +} + +wxPrintDialog::wxPrintDialog(wxWindow *parent, wxPrintData* data) +{ + m_pimpl = wxPrintFactory::GetFactory()->CreatePrintDialog( parent, data ); +} + +wxPrintDialog::~wxPrintDialog() +{ + delete m_pimpl; +} + +int wxPrintDialog::ShowModal() +{ + return m_pimpl->ShowModal(); +} + +wxPrintDialogData& wxPrintDialog::GetPrintDialogData() +{ + return m_pimpl->GetPrintDialogData(); +} + +wxPrintData& wxPrintDialog::GetPrintData() +{ + return m_pimpl->GetPrintData(); +} + +wxDC *wxPrintDialog::GetPrintDC() +{ + return m_pimpl->GetPrintDC(); +} + +// --------------------------------------------------------------------------- +// wxPageSetupDialogBase: the page setup dialog +// --------------------------------------------------------------------------- + +IMPLEMENT_ABSTRACT_CLASS(wxPageSetupDialogBase, wxDialog) + +wxPageSetupDialogBase::wxPageSetupDialogBase(wxWindow *parent, + wxWindowID id, + const wxString &title, + const wxPoint &pos, + const wxSize &size, + long style) + : wxDialog( parent, id, title.empty() ? wxString(_("Page setup")) : title, + pos, size, style ) +{ +} + +// --------------------------------------------------------------------------- +// wxPageSetupDialog: the page setup dialog +// --------------------------------------------------------------------------- + +IMPLEMENT_CLASS(wxPageSetupDialog, wxObject) + +wxPageSetupDialog::wxPageSetupDialog(wxWindow *parent, wxPageSetupDialogData *data ) +{ + m_pimpl = wxPrintFactory::GetFactory()->CreatePageSetupDialog( parent, data ); +} + +wxPageSetupDialog::~wxPageSetupDialog() +{ + delete m_pimpl; +} + +int wxPageSetupDialog::ShowModal() +{ + return m_pimpl->ShowModal(); +} + +wxPageSetupDialogData& wxPageSetupDialog::GetPageSetupDialogData() +{ + return m_pimpl->GetPageSetupDialogData(); +} + +// old name +wxPageSetupDialogData& wxPageSetupDialog::GetPageSetupData() +{ + return m_pimpl->GetPageSetupDialogData(); +} + +//---------------------------------------------------------------------------- +// wxPrintAbortDialog +//---------------------------------------------------------------------------- + +BEGIN_EVENT_TABLE(wxPrintAbortDialog, wxDialog) + EVT_BUTTON(wxID_CANCEL, wxPrintAbortDialog::OnCancel) +END_EVENT_TABLE() + +void wxPrintAbortDialog::OnCancel(wxCommandEvent& WXUNUSED(event)) +{ + wxPrinterBase::sm_abortIt = true; + wxPrinterBase::sm_abortWindow->Show(false); + wxPrinterBase::sm_abortWindow->Close(true); + wxPrinterBase::sm_abortWindow = (wxWindow *) NULL; +} + +//---------------------------------------------------------------------------- +// wxPrintout +//---------------------------------------------------------------------------- + +IMPLEMENT_ABSTRACT_CLASS(wxPrintout, wxObject) + +wxPrintout::wxPrintout(const wxString& title) +{ + m_printoutTitle = title ; + m_printoutDC = (wxDC *) NULL; + m_pageWidthMM = 0; + m_pageHeightMM = 0; + m_pageWidthPixels = 0; + m_pageHeightPixels = 0; + m_PPIScreenX = 0; + m_PPIScreenY = 0; + m_PPIPrinterX = 0; + m_PPIPrinterY = 0; + m_isPreview = false; +} + +wxPrintout::~wxPrintout() +{ +} + +bool wxPrintout::OnBeginDocument(int WXUNUSED(startPage), int WXUNUSED(endPage)) +{ + return GetDC()->StartDoc(_("Printing ") + m_printoutTitle); +} + +void wxPrintout::OnEndDocument() +{ + GetDC()->EndDoc(); +} + +void wxPrintout::OnBeginPrinting() +{ +} + +void wxPrintout::OnEndPrinting() +{ +} + +bool wxPrintout::HasPage(int page) +{ + return (page == 1); +} + +void wxPrintout::GetPageInfo(int *minPage, int *maxPage, int *fromPage, int *toPage) +{ + *minPage = 1; + *maxPage = 32000; + *fromPage = 1; + *toPage = 1; +} + +void wxPrintout::FitThisSizeToPaper(const wxSize& imageSize) +{ + // Set the DC scale and origin so that the given image size fits within the + // entire page and the origin is at the top left corner of the page. Note + // that with most printers, portions of the page will be non-printable. Use + // this if you're managing your own page margins. + if (!m_printoutDC) return; + wxRect paperRect = GetPaperRectPixels(); + wxCoord pw, ph; + GetPageSizePixels(&pw, &ph); + wxCoord w, h; + m_printoutDC->GetSize(&w, &h); + float scaleX = ((float(paperRect.width) * w) / (float(pw) * imageSize.x)); + float scaleY = ((float(paperRect.height) * h) / (float(ph) * imageSize.y)); + float actualScale = wxMin(scaleX, scaleY); + m_printoutDC->SetUserScale(actualScale, actualScale); + m_printoutDC->SetDeviceOrigin(0, 0); + wxRect logicalPaperRect = GetLogicalPaperRect(); + SetLogicalOrigin(logicalPaperRect.x, logicalPaperRect.y); +} + +void wxPrintout::FitThisSizeToPage(const wxSize& imageSize) +{ + // Set the DC scale and origin so that the given image size fits within the + // printable area of the page and the origin is at the top left corner of + // the printable area. + if (!m_printoutDC) return; + int w, h; + m_printoutDC->GetSize(&w, &h); + float scaleX = float(w) / imageSize.x; + float scaleY = float(h) / imageSize.y; + float actualScale = wxMin(scaleX, scaleY); + m_printoutDC->SetUserScale(actualScale, actualScale); + m_printoutDC->SetDeviceOrigin(0, 0); +} + +void wxPrintout::FitThisSizeToPageMargins(const wxSize& imageSize, const wxPageSetupDialogData& pageSetupData) +{ + // Set the DC scale and origin so that the given image size fits within the + // page margins defined in the given wxPageSetupDialogData object and the + // origin is at the top left corner of the page margins. + if (!m_printoutDC) return; + wxRect paperRect = GetPaperRectPixels(); + wxCoord pw, ph; + GetPageSizePixels(&pw, &ph); + wxPoint topLeft = pageSetupData.GetMarginTopLeft(); + wxPoint bottomRight = pageSetupData.GetMarginBottomRight(); + wxCoord mw, mh; + GetPageSizeMM(&mw, &mh); + float mmToDeviceX = float(pw) / mw; + float mmToDeviceY = float(ph) / mh; + wxRect pageMarginsRect(paperRect.x + wxRound(mmToDeviceX * topLeft.x), + paperRect.y + wxRound(mmToDeviceY * topLeft.y), + paperRect.width - wxRound(mmToDeviceX * (topLeft.x + bottomRight.x)), + paperRect.height - wxRound(mmToDeviceY * (topLeft.y + bottomRight.y))); + wxCoord w, h; + m_printoutDC->GetSize(&w, &h); + float scaleX = (float(pageMarginsRect.width) * w) / (float(pw) * imageSize.x); + float scaleY = (float(pageMarginsRect.height) * h) / (float(ph) * imageSize.y); + float actualScale = wxMin(scaleX, scaleY); + m_printoutDC->SetUserScale(actualScale, actualScale); + m_printoutDC->SetDeviceOrigin(0, 0); + wxRect logicalPageMarginsRect = GetLogicalPageMarginsRect(pageSetupData); + SetLogicalOrigin(logicalPageMarginsRect.x, logicalPageMarginsRect.y); +} + +void wxPrintout::MapScreenSizeToPaper() +{ + // Set the DC scale so that an image on the screen is the same size on the + // paper and the origin is at the top left of the paper. Note that with most + // printers, portions of the page will be cut off. Use this if you're + // managing your own page margins. + if (!m_printoutDC) return; + MapScreenSizeToPage(); + wxRect logicalPaperRect = GetLogicalPaperRect(); + SetLogicalOrigin(logicalPaperRect.x, logicalPaperRect.y); +} + +void wxPrintout::MapScreenSizeToPage() +{ + // Set the DC scale and origin so that an image on the screen is the same + // size on the paper and the origin is at the top left of the printable area. + if (!m_printoutDC) return; + int ppiScreenX, ppiScreenY; + GetPPIScreen(&ppiScreenX, &ppiScreenY); + int ppiPrinterX, ppiPrinterY; + GetPPIPrinter(&ppiPrinterX, &ppiPrinterY); + int w, h; + m_printoutDC->GetSize(&w, &h); + int pageSizePixelsX, pageSizePixelsY; + GetPageSizePixels(&pageSizePixelsX, &pageSizePixelsY); + float userScaleX = (float(ppiPrinterX) * w) / (float(ppiScreenX) * pageSizePixelsX); + float userScaleY = (float(ppiPrinterY) * h) / (float(ppiScreenY) * pageSizePixelsY); + m_printoutDC->SetUserScale(userScaleX, userScaleY); + m_printoutDC->SetDeviceOrigin(0, 0); +} + +void wxPrintout::MapScreenSizeToPageMargins(const wxPageSetupDialogData& pageSetupData) +{ + // Set the DC scale so that an image on the screen is the same size on the + // paper and the origin is at the top left of the page margins defined by + // the given wxPageSetupDialogData object. + if (!m_printoutDC) return; + MapScreenSizeToPage(); + wxRect logicalPageMarginsRect = GetLogicalPageMarginsRect(pageSetupData); + SetLogicalOrigin(logicalPageMarginsRect.x, logicalPageMarginsRect.y); +} + +void wxPrintout::MapScreenSizeToDevice() +{ + // Set the DC scale so that a screen pixel is the same size as a device + // pixel and the origin is at the top left of the printable area. + if (!m_printoutDC) return; + int w, h; + m_printoutDC->GetSize(&w, &h); + int pageSizePixelsX, pageSizePixelsY; + GetPageSizePixels(&pageSizePixelsX, &pageSizePixelsY); + float userScaleX = float(w) / pageSizePixelsX; + float userScaleY = float(h) / pageSizePixelsY; + m_printoutDC->SetUserScale(userScaleX, userScaleY); + m_printoutDC->SetDeviceOrigin(0, 0); +} + +wxRect wxPrintout::GetLogicalPaperRect() const +{ + // Return the rectangle in logical units that corresponds to the paper + // rectangle. + wxRect paperRect = GetPaperRectPixels(); + wxCoord pw, ph; + GetPageSizePixels(&pw, &ph); + wxCoord w, h; + m_printoutDC->GetSize(&w, &h); + if (w == pw && h == ph) { + // this DC matches the printed page, so no scaling + return wxRect(m_printoutDC->DeviceToLogicalX(paperRect.x), + m_printoutDC->DeviceToLogicalY(paperRect.y), + m_printoutDC->DeviceToLogicalXRel(paperRect.width), + m_printoutDC->DeviceToLogicalYRel(paperRect.height)); + } + // This DC doesn't match the printed page, so we have to scale. + float scaleX = float(w) / pw; + float scaleY = float(h) / ph; + return wxRect(m_printoutDC->DeviceToLogicalX(wxRound(paperRect.x * scaleX)), + m_printoutDC->DeviceToLogicalY(wxRound(paperRect.y * scaleY)), + m_printoutDC->DeviceToLogicalXRel(wxRound(paperRect.width * scaleX)), + m_printoutDC->DeviceToLogicalYRel(wxRound(paperRect.height * scaleY))); +} + +wxRect wxPrintout::GetLogicalPageRect() const +{ + // Return the rectangle in logical units that corresponds to the printable + // area. + int w, h; + m_printoutDC->GetSize(&w, &h); + return wxRect(m_printoutDC->DeviceToLogicalX(0), + m_printoutDC->DeviceToLogicalY(0), + m_printoutDC->DeviceToLogicalXRel(w), + m_printoutDC->DeviceToLogicalYRel(h)); +} + +wxRect wxPrintout::GetLogicalPageMarginsRect(const wxPageSetupDialogData& pageSetupData) const +{ + // Return the rectangle in logical units that corresponds to the region + // within the page margins as specified by the given wxPageSetupDialogData + // object. + wxRect paperRect = GetPaperRectPixels(); + wxCoord pw, ph; + GetPageSizePixels(&pw, &ph); + wxPoint topLeft = pageSetupData.GetMarginTopLeft(); + wxPoint bottomRight = pageSetupData.GetMarginBottomRight(); + wxCoord mw, mh; + GetPageSizeMM(&mw, &mh); + float mmToDeviceX = float(pw) / mw; + float mmToDeviceY = float(ph) / mh; + wxRect pageMarginsRect(paperRect.x + wxRound(mmToDeviceX * topLeft.x), + paperRect.y + wxRound(mmToDeviceY * topLeft.y), + paperRect.width - wxRound(mmToDeviceX * (topLeft.x + bottomRight.x)), + paperRect.height - wxRound(mmToDeviceY * (topLeft.y + bottomRight.y))); + wxCoord w, h; + m_printoutDC->GetSize(&w, &h); + if (w == pw && h == ph) { + // this DC matches the printed page, so no scaling + return wxRect(m_printoutDC->DeviceToLogicalX(pageMarginsRect.x), + m_printoutDC->DeviceToLogicalY(pageMarginsRect.y), + m_printoutDC->DeviceToLogicalXRel(pageMarginsRect.width), + m_printoutDC->DeviceToLogicalYRel(pageMarginsRect.height)); + } + // This DC doesn't match the printed page, so we have to scale. + float scaleX = float(w) / pw; + float scaleY = float(h) / ph; + return wxRect(m_printoutDC->DeviceToLogicalX(wxRound(pageMarginsRect.x * scaleX)), + m_printoutDC->DeviceToLogicalY(wxRound(pageMarginsRect.y * scaleY)), + m_printoutDC->DeviceToLogicalXRel(wxRound(pageMarginsRect.width * scaleX)), + m_printoutDC->DeviceToLogicalYRel(wxRound(pageMarginsRect.height * scaleY))); +} + +void wxPrintout::SetLogicalOrigin(wxCoord x, wxCoord y) +{ + // Set the device origin by specifying a point in logical coordinates. + m_printoutDC->SetDeviceOrigin(m_printoutDC->LogicalToDeviceX(x), + m_printoutDC->LogicalToDeviceY(y)); +} + +void wxPrintout::OffsetLogicalOrigin(wxCoord xoff, wxCoord yoff) +{ + // Offset the device origin by a specified distance in device coordinates. + wxCoord x = m_printoutDC->LogicalToDeviceX(0); + wxCoord y = m_printoutDC->LogicalToDeviceY(0); + m_printoutDC->SetDeviceOrigin(x + m_printoutDC->LogicalToDeviceXRel(xoff), + y + m_printoutDC->LogicalToDeviceYRel(yoff)); +} + + +//---------------------------------------------------------------------------- +// wxPreviewCanvas +//---------------------------------------------------------------------------- + +IMPLEMENT_CLASS(wxPreviewCanvas, wxWindow) + +BEGIN_EVENT_TABLE(wxPreviewCanvas, wxScrolledWindow) + EVT_PAINT(wxPreviewCanvas::OnPaint) + EVT_CHAR(wxPreviewCanvas::OnChar) + EVT_SYS_COLOUR_CHANGED(wxPreviewCanvas::OnSysColourChanged) +#if wxUSE_MOUSEWHEEL + EVT_MOUSEWHEEL(wxPreviewCanvas::OnMouseWheel) +#endif +END_EVENT_TABLE() + +// VZ: the current code doesn't refresh properly without +// wxFULL_REPAINT_ON_RESIZE, this must be fixed as otherwise we have +// really horrible flicker when resizing the preview frame, but without +// this style it simply doesn't work correctly at all... +wxPreviewCanvas::wxPreviewCanvas(wxPrintPreviewBase *preview, wxWindow *parent, + const wxPoint& pos, const wxSize& size, long style, const wxString& name): +wxScrolledWindow(parent, wxID_ANY, pos, size, style | wxFULL_REPAINT_ON_RESIZE, name) +{ + m_printPreview = preview; +#ifdef __WXMAC__ + // The app workspace colour is always white, but we should have + // a contrast with the page. + wxSystemColour colourIndex = wxSYS_COLOUR_3DDKSHADOW; +#elif defined(__WXGTK__) + wxSystemColour colourIndex = wxSYS_COLOUR_BTNFACE; +#else + wxSystemColour colourIndex = wxSYS_COLOUR_APPWORKSPACE; +#endif + SetBackgroundColour(wxSystemSettings::GetColour(colourIndex)); + + SetScrollbars(10, 10, 100, 100); +} + +wxPreviewCanvas::~wxPreviewCanvas() +{ +} + +void wxPreviewCanvas::OnPaint(wxPaintEvent& WXUNUSED(event)) +{ + wxPaintDC dc(this); + PrepareDC( dc ); + +/* +#ifdef __WXGTK__ + if (!GetUpdateRegion().IsEmpty()) + dc.SetClippingRegion( GetUpdateRegion() ); +#endif +*/ + + if (m_printPreview) + { + m_printPreview->PaintPage(this, dc); + } +} + +// Responds to colour changes, and passes event on to children. +void wxPreviewCanvas::OnSysColourChanged(wxSysColourChangedEvent& event) +{ +#ifdef __WXMAC__ + // The app workspace colour is always white, but we should have + // a contrast with the page. + wxSystemColour colourIndex = wxSYS_COLOUR_3DDKSHADOW; +#elif defined(__WXGTK__) + wxSystemColour colourIndex = wxSYS_COLOUR_BTNFACE; +#else + wxSystemColour colourIndex = wxSYS_COLOUR_APPWORKSPACE; +#endif + SetBackgroundColour(wxSystemSettings::GetColour(colourIndex)); + Refresh(); + + // Propagate the event to the non-top-level children + wxWindow::OnSysColourChanged(event); +} + +void wxPreviewCanvas::OnChar(wxKeyEvent &event) +{ + wxPreviewControlBar* controlBar = ((wxPreviewFrame*) GetParent())->GetControlBar(); + if (event.GetKeyCode() == WXK_ESCAPE) + { + ((wxPreviewFrame*) GetParent())->Close(true); + return; + } + else if (event.GetKeyCode() == WXK_TAB) + { + controlBar->OnGoto(); + return; + } + else if (event.GetKeyCode() == WXK_RETURN) + { + controlBar->OnPrint(); + return; + } + + if (!event.ControlDown()) + { + event.Skip(); + return; + } + + switch(event.GetKeyCode()) + { + case WXK_PAGEDOWN: + controlBar->OnNext(); break; + case WXK_PAGEUP: + controlBar->OnPrevious(); break; + case WXK_HOME: + controlBar->OnFirst(); break; + case WXK_END: + controlBar->OnLast(); break; + default: + event.Skip(); + } +} + +#if wxUSE_MOUSEWHEEL + +void wxPreviewCanvas::OnMouseWheel(wxMouseEvent& event) +{ + wxPreviewControlBar * + controlBar = wxStaticCast(GetParent(), wxPreviewFrame)->GetControlBar(); + + if ( controlBar ) + { + if ( event.ControlDown() && event.GetWheelRotation() != 0 ) + { + int currentZoom = controlBar->GetZoomControl(); + + int delta; + if ( currentZoom < 100 ) + delta = 5; + else if ( currentZoom <= 120 ) + delta = 10; + else + delta = 50; + + if ( event.GetWheelRotation() > 0 ) + delta = -delta; + + int newZoom = currentZoom + delta; + if ( newZoom < 10 ) + newZoom = 10; + if ( newZoom > 200 ) + newZoom = 200; + if ( newZoom != currentZoom ) + { + controlBar->SetZoomControl(newZoom); + m_printPreview->SetZoom(newZoom); + Refresh(); + } + return; + } + } + + event.Skip(); +} + +#endif // wxUSE_MOUSEWHEEL + +//---------------------------------------------------------------------------- +// wxPreviewControlBar +//---------------------------------------------------------------------------- + +IMPLEMENT_CLASS(wxPreviewControlBar, wxWindow) + +BEGIN_EVENT_TABLE(wxPreviewControlBar, wxPanel) + EVT_BUTTON(wxID_PREVIEW_CLOSE, wxPreviewControlBar::OnWindowClose) + EVT_BUTTON(wxID_PREVIEW_PRINT, wxPreviewControlBar::OnPrintButton) + EVT_BUTTON(wxID_PREVIEW_PREVIOUS, wxPreviewControlBar::OnPreviousButton) + EVT_BUTTON(wxID_PREVIEW_NEXT, wxPreviewControlBar::OnNextButton) + EVT_BUTTON(wxID_PREVIEW_FIRST, wxPreviewControlBar::OnFirstButton) + EVT_BUTTON(wxID_PREVIEW_LAST, wxPreviewControlBar::OnLastButton) + EVT_BUTTON(wxID_PREVIEW_GOTO, wxPreviewControlBar::OnGotoButton) + EVT_CHOICE(wxID_PREVIEW_ZOOM, wxPreviewControlBar::OnZoom) + EVT_PAINT(wxPreviewControlBar::OnPaint) +END_EVENT_TABLE() + +wxPreviewControlBar::wxPreviewControlBar(wxPrintPreviewBase *preview, long buttons, + wxWindow *parent, const wxPoint& pos, const wxSize& size, + long style, const wxString& name): +wxPanel(parent, wxID_ANY, pos, size, style, name) +{ + m_printPreview = preview; + m_closeButton = (wxButton *) NULL; + m_nextPageButton = (wxButton *) NULL; + m_previousPageButton = (wxButton *) NULL; + m_printButton = (wxButton *) NULL; + m_zoomControl = (wxChoice *) NULL; + m_buttonFlags = buttons; +} + +wxPreviewControlBar::~wxPreviewControlBar() +{ +} + +void wxPreviewControlBar::OnPaint(wxPaintEvent& WXUNUSED(event)) +{ + wxPaintDC dc(this); + + int w, h; + GetSize(&w, &h); + dc.SetPen(*wxBLACK_PEN); + dc.SetBrush(*wxTRANSPARENT_BRUSH); + dc.DrawLine( 0, h-1, w, h-1 ); +} + +void wxPreviewControlBar::OnWindowClose(wxCommandEvent& WXUNUSED(event)) +{ + wxPreviewFrame *frame = (wxPreviewFrame *)GetParent(); + frame->Close(true); +} + +void wxPreviewControlBar::OnPrint(void) +{ + wxPrintPreviewBase *preview = GetPrintPreview(); + preview->Print(true); +} + +void wxPreviewControlBar::OnNext(void) +{ + wxPrintPreviewBase *preview = GetPrintPreview(); + if (preview) + { + int currentPage = preview->GetCurrentPage(); + if ((preview->GetMaxPage() > 0) && + (currentPage < preview->GetMaxPage()) && + preview->GetPrintout()->HasPage(currentPage + 1)) + { + preview->SetCurrentPage(currentPage + 1); + } + } +} + +void wxPreviewControlBar::OnPrevious(void) +{ + wxPrintPreviewBase *preview = GetPrintPreview(); + if (preview) + { + int currentPage = preview->GetCurrentPage(); + if ((preview->GetMinPage() > 0) && + (currentPage > preview->GetMinPage()) && + preview->GetPrintout()->HasPage(currentPage - 1)) + { + preview->SetCurrentPage(currentPage - 1); + } + } +} + +void wxPreviewControlBar::OnFirst(void) +{ + wxPrintPreviewBase *preview = GetPrintPreview(); + if (preview) + { + int currentPage = preview->GetMinPage(); + if (preview->GetPrintout()->HasPage(currentPage)) + { + preview->SetCurrentPage(currentPage); + } + } +} + +void wxPreviewControlBar::OnLast(void) +{ + wxPrintPreviewBase *preview = GetPrintPreview(); + if (preview) + { + int currentPage = preview->GetMaxPage(); + if (preview->GetPrintout()->HasPage(currentPage)) + { + preview->SetCurrentPage(currentPage); + } + } +} + +void wxPreviewControlBar::OnGoto(void) +{ + wxPrintPreviewBase *preview = GetPrintPreview(); + if (preview) + { + long currentPage; + + if (preview->GetMinPage() > 0) + { + wxString strPrompt; + wxString strPage; + + strPrompt.Printf( _("Enter a page number between %d and %d:"), + preview->GetMinPage(), preview->GetMaxPage()); + strPage.Printf( wxT("%d"), preview->GetCurrentPage() ); + + strPage = + wxGetTextFromUser( strPrompt, _("Goto Page"), strPage, GetParent()); + + if ( strPage.ToLong( ¤tPage ) ) + if (preview->GetPrintout()->HasPage(currentPage)) + { + preview->SetCurrentPage(currentPage); + } + } + } +} + +void wxPreviewControlBar::OnZoom(wxCommandEvent& WXUNUSED(event)) +{ + int zoom = GetZoomControl(); + if (GetPrintPreview()) + GetPrintPreview()->SetZoom(zoom); +} + +void wxPreviewControlBar::CreateButtons() +{ + SetSize(0, 0, 400, 40); + + wxBoxSizer *item0 = new wxBoxSizer( wxHORIZONTAL ); + + m_closeButton = new wxButton( this, wxID_PREVIEW_CLOSE, _("&Close"), wxDefaultPosition, wxDefaultSize, 0 ); + item0->Add( m_closeButton, 0, wxALIGN_CENTRE|wxALL, 5 ); + + if (m_buttonFlags & wxPREVIEW_PRINT) + { + m_printButton = new wxButton( this, wxID_PREVIEW_PRINT, _("&Print..."), wxDefaultPosition, wxDefaultSize, 0 ); + item0->Add( m_printButton, 0, wxALIGN_CENTRE|wxALL, 5 ); + } + + // Exact-fit buttons are too tiny on wxUniversal + int navButtonStyle; + wxSize navButtonSize; +#ifdef __WXUNIVERSAL__ + navButtonStyle = 0; + navButtonSize = wxSize(40, m_closeButton->GetSize().y); +#else + navButtonStyle = wxBU_EXACTFIT; + navButtonSize = wxDefaultSize; +#endif + + if (m_buttonFlags & wxPREVIEW_FIRST) + { + m_firstPageButton = new wxButton( this, wxID_PREVIEW_FIRST, _("|<<"), wxDefaultPosition, navButtonSize, navButtonStyle ); + item0->Add( m_firstPageButton, 0, wxALIGN_CENTRE|wxALL, 5 ); + } + + if (m_buttonFlags & wxPREVIEW_PREVIOUS) + { + m_previousPageButton = new wxButton( this, wxID_PREVIEW_PREVIOUS, _("<<"), wxDefaultPosition, navButtonSize, navButtonStyle ); + item0->Add( m_previousPageButton, 0, wxALIGN_CENTRE|wxRIGHT|wxTOP|wxBOTTOM, 5 ); + } + + if (m_buttonFlags & wxPREVIEW_NEXT) + { + m_nextPageButton = new wxButton( this, wxID_PREVIEW_NEXT, _(">>"), wxDefaultPosition, navButtonSize, navButtonStyle ); + item0->Add( m_nextPageButton, 0, wxALIGN_CENTRE|wxRIGHT|wxTOP|wxBOTTOM, 5 ); + } + + if (m_buttonFlags & wxPREVIEW_LAST) + { + m_lastPageButton = new wxButton( this, wxID_PREVIEW_LAST, _(">>|"), wxDefaultPosition, navButtonSize, navButtonStyle ); + item0->Add( m_lastPageButton, 0, wxALIGN_CENTRE|wxRIGHT|wxTOP|wxBOTTOM, 5 ); + } + + if (m_buttonFlags & wxPREVIEW_GOTO) + { + m_gotoPageButton = new wxButton( this, wxID_PREVIEW_GOTO, _("&Goto..."), wxDefaultPosition, wxDefaultSize, 0 ); + item0->Add( m_gotoPageButton, 0, wxALIGN_CENTRE|wxALL, 5 ); + } + + if (m_buttonFlags & wxPREVIEW_ZOOM) + { + wxString choices[] = + { + wxT("10%"), wxT("15%"), wxT("20%"), wxT("25%"), wxT("30%"), wxT("35%"), wxT("40%"), wxT("45%"), wxT("50%"), wxT("55%"), + wxT("60%"), wxT("65%"), wxT("70%"), wxT("75%"), wxT("80%"), wxT("85%"), wxT("90%"), wxT("95%"), wxT("100%"), wxT("110%"), + wxT("120%"), wxT("150%"), wxT("200%") + }; + int n = WXSIZEOF(choices); + + m_zoomControl = new wxChoice( this, wxID_PREVIEW_ZOOM, wxDefaultPosition, wxSize(70,wxDefaultCoord), n, choices, 0 ); + item0->Add( m_zoomControl, 0, wxALIGN_CENTRE|wxALL, 5 ); + SetZoomControl(m_printPreview->GetZoom()); + } + + SetSizer(item0); + item0->Fit(this); +} + +void wxPreviewControlBar::SetZoomControl(int zoom) +{ + if (m_zoomControl) + { + int n, count = m_zoomControl->GetCount(); + long val; + for (n=0; nGetString(n).BeforeFirst(wxT('%')).ToLong(&val) && + (val >= long(zoom))) + { + m_zoomControl->SetSelection(n); + return; + } + } + + m_zoomControl->SetSelection(count-1); + } +} + +int wxPreviewControlBar::GetZoomControl() +{ + if (m_zoomControl && (m_zoomControl->GetStringSelection() != wxEmptyString)) + { + long val; + if (m_zoomControl->GetStringSelection().BeforeFirst(wxT('%')).ToLong(&val)) + return int(val); + } + + return 0; +} + + +/* +* Preview frame +*/ + +IMPLEMENT_CLASS(wxPreviewFrame, wxFrame) + +BEGIN_EVENT_TABLE(wxPreviewFrame, wxFrame) + EVT_CLOSE(wxPreviewFrame::OnCloseWindow) +END_EVENT_TABLE() + +wxPreviewFrame::wxPreviewFrame(wxPrintPreviewBase *preview, wxWindow *parent, const wxString& title, + const wxPoint& pos, const wxSize& size, long style, const wxString& name): +wxFrame(parent, wxID_ANY, title, pos, size, style, name) +{ + m_printPreview = preview; + m_controlBar = NULL; + m_previewCanvas = NULL; + m_windowDisabler = NULL; + + // Give the application icon +#ifdef __WXMSW__ + wxFrame* topFrame = wxDynamicCast(wxTheApp->GetTopWindow(), wxFrame); + if (topFrame) + SetIcon(topFrame->GetIcon()); +#endif +} + +wxPreviewFrame::~wxPreviewFrame() +{ +} + +void wxPreviewFrame::OnCloseWindow(wxCloseEvent& WXUNUSED(event)) +{ + if (m_windowDisabler) + delete m_windowDisabler; + + // Need to delete the printout and the print preview + wxPrintout *printout = m_printPreview->GetPrintout(); + if (printout) + { + delete printout; + m_printPreview->SetPrintout(NULL); + m_printPreview->SetCanvas(NULL); + m_printPreview->SetFrame(NULL); + } + delete m_printPreview; + + Destroy(); +} + +void wxPreviewFrame::Initialize() +{ +#if wxUSE_STATUSBAR + CreateStatusBar(); +#endif + CreateCanvas(); + CreateControlBar(); + + m_printPreview->SetCanvas(m_previewCanvas); + m_printPreview->SetFrame(this); + + wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL ); + + item0->Add( m_controlBar, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + item0->Add( m_previewCanvas, 1, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + + SetAutoLayout( true ); + SetSizer( item0 ); + + m_windowDisabler = new wxWindowDisabler(this); + + Layout(); + + m_printPreview->AdjustScrollbars(m_previewCanvas); + m_previewCanvas->SetFocus(); + m_controlBar->SetFocus(); +} + +void wxPreviewFrame::CreateCanvas() +{ + m_previewCanvas = new wxPreviewCanvas(m_printPreview, this); +} + +void wxPreviewFrame::CreateControlBar() +{ + long buttons = wxPREVIEW_DEFAULT; + if (m_printPreview->GetPrintoutForPrinting()) + buttons |= wxPREVIEW_PRINT; + + m_controlBar = new wxPreviewControlBar(m_printPreview, buttons, this, wxPoint(0,0), wxSize(400, 40)); + m_controlBar->CreateButtons(); +} + +/* +* Print preview +*/ + +IMPLEMENT_CLASS(wxPrintPreviewBase, wxObject) + +wxPrintPreviewBase::wxPrintPreviewBase(wxPrintout *printout, + wxPrintout *printoutForPrinting, + wxPrintData *data) +{ + if (data) + m_printDialogData = (*data); + + Init(printout, printoutForPrinting); +} + +wxPrintPreviewBase::wxPrintPreviewBase(wxPrintout *printout, + wxPrintout *printoutForPrinting, + wxPrintDialogData *data) +{ + if (data) + m_printDialogData = (*data); + + Init(printout, printoutForPrinting); +} + +void wxPrintPreviewBase::Init(wxPrintout *printout, + wxPrintout *printoutForPrinting) +{ + m_isOk = true; + m_previewPrintout = printout; + if (m_previewPrintout) + m_previewPrintout->SetIsPreview(true); + + m_printPrintout = printoutForPrinting; + + m_previewCanvas = NULL; + m_previewFrame = NULL; + m_previewBitmap = NULL; + m_currentPage = 1; + m_currentZoom = 70; + m_topMargin = 40; + m_leftMargin = 40; + m_pageWidth = 0; + m_pageHeight = 0; + m_printingPrepared = false; + m_minPage = 1; + m_maxPage = 1; +} + +wxPrintPreviewBase::~wxPrintPreviewBase() +{ + if (m_previewPrintout) + delete m_previewPrintout; + if (m_previewBitmap) + delete m_previewBitmap; + if (m_printPrintout) + delete m_printPrintout; +} + +bool wxPrintPreviewBase::SetCurrentPage(int pageNum) +{ + if (m_currentPage == pageNum) + return true; + + m_currentPage = pageNum; + if (m_previewBitmap) + { + delete m_previewBitmap; + m_previewBitmap = NULL; + } + + if (m_previewCanvas) + { + AdjustScrollbars(m_previewCanvas); + + if (!RenderPage(pageNum)) + return false; + m_previewCanvas->Refresh(); + m_previewCanvas->SetFocus(); + } + return true; +} + +int wxPrintPreviewBase::GetCurrentPage() const + { return m_currentPage; } +void wxPrintPreviewBase::SetPrintout(wxPrintout *printout) + { m_previewPrintout = printout; } +wxPrintout *wxPrintPreviewBase::GetPrintout() const + { return m_previewPrintout; } +wxPrintout *wxPrintPreviewBase::GetPrintoutForPrinting() const + { return m_printPrintout; } +void wxPrintPreviewBase::SetFrame(wxFrame *frame) + { m_previewFrame = frame; } +void wxPrintPreviewBase::SetCanvas(wxPreviewCanvas *canvas) + { m_previewCanvas = canvas; } +wxFrame *wxPrintPreviewBase::GetFrame() const + { return m_previewFrame; } +wxPreviewCanvas *wxPrintPreviewBase::GetCanvas() const + { return m_previewCanvas; } + +void wxPrintPreviewBase::CalcRects(wxPreviewCanvas *canvas, wxRect& pageRect, wxRect& paperRect) +{ + // Calculate the rectangles for the printable area of the page and the + // entire paper as they appear on the canvas on-screen. + int canvasWidth, canvasHeight; + canvas->GetSize(&canvasWidth, &canvasHeight); + + float zoomScale = float(m_currentZoom) / 100; + float screenPrintableWidth = zoomScale * m_pageWidth * m_previewScaleX; + float screenPrintableHeight = zoomScale * m_pageHeight * m_previewScaleY; + + wxRect devicePaperRect = m_previewPrintout->GetPaperRectPixels(); + wxCoord devicePrintableWidth, devicePrintableHeight; + m_previewPrintout->GetPageSizePixels(&devicePrintableWidth, &devicePrintableHeight); + float scaleX = screenPrintableWidth / devicePrintableWidth; + float scaleY = screenPrintableHeight / devicePrintableHeight; + paperRect.width = wxCoord(scaleX * devicePaperRect.width); + paperRect.height = wxCoord(scaleY * devicePaperRect.height); + + paperRect.x = wxCoord((canvasWidth - paperRect.width)/ 2.0); + if (paperRect.x < m_leftMargin) + paperRect.x = m_leftMargin; + paperRect.y = wxCoord((canvasHeight - paperRect.height)/ 2.0); + if (paperRect.y < m_topMargin) + paperRect.y = m_topMargin; + + pageRect.x = paperRect.x - wxCoord(scaleX * devicePaperRect.x); + pageRect.y = paperRect.y - wxCoord(scaleY * devicePaperRect.y); + pageRect.width = wxCoord(screenPrintableWidth); + pageRect.height = wxCoord(screenPrintableHeight); +} + + +bool wxPrintPreviewBase::PaintPage(wxPreviewCanvas *canvas, wxDC& dc) +{ + DrawBlankPage(canvas, dc); + + if (!m_previewBitmap) + if (!RenderPage(m_currentPage)) + return false; + if (!m_previewBitmap) + return false; + if (!canvas) + return false; + + wxRect pageRect, paperRect; + CalcRects(canvas, pageRect, paperRect); + wxMemoryDC temp_dc; + temp_dc.SelectObject(*m_previewBitmap); + + dc.Blit(pageRect.x, pageRect.y, + m_previewBitmap->GetWidth(), m_previewBitmap->GetHeight(), &temp_dc, 0, 0); + + temp_dc.SelectObject(wxNullBitmap); + return true; +} + +// Adjusts the scrollbars for the current scale +void wxPrintPreviewBase::AdjustScrollbars(wxPreviewCanvas *canvas) +{ + if (!canvas) + return ; + + wxRect pageRect, paperRect; + CalcRects(canvas, pageRect, paperRect); + int totalWidth = paperRect.width + 2 * m_leftMargin; + int totalHeight = paperRect.height + 2 * m_topMargin; + int scrollUnitsX = totalWidth / 10; + int scrollUnitsY = totalHeight / 10; + wxSize virtualSize = canvas->GetVirtualSize(); + if (virtualSize.GetWidth() != totalWidth || virtualSize.GetHeight() != totalHeight) + canvas->SetScrollbars(10, 10, scrollUnitsX, scrollUnitsY, 0, 0, true); +} + +bool wxPrintPreviewBase::RenderPage(int pageNum) +{ + wxBusyCursor busy; + + if (!m_previewCanvas) + { + wxFAIL_MSG(_T("wxPrintPreviewBase::RenderPage: must use wxPrintPreviewBase::SetCanvas to let me know about the canvas!")); + return false; + } + + wxRect pageRect, paperRect; + CalcRects(m_previewCanvas, pageRect, paperRect); + + if (!m_previewBitmap) + { + m_previewBitmap = new wxBitmap(pageRect.width, pageRect.height); + + if (!m_previewBitmap || !m_previewBitmap->Ok()) + { + if (m_previewBitmap) { + delete m_previewBitmap; + m_previewBitmap = NULL; + } + wxMessageBox(_("Sorry, not enough memory to create a preview."), _("Print Preview Failure"), wxOK); + return false; + } + } + + wxMemoryDC memoryDC; + memoryDC.SelectObject(*m_previewBitmap); + + memoryDC.Clear(); + + m_previewPrintout->SetDC(&memoryDC); + m_previewPrintout->SetPageSizePixels(m_pageWidth, m_pageHeight); + + // Need to delay OnPreparePrinting until here, so we have enough information. + if (!m_printingPrepared) + { + m_previewPrintout->OnPreparePrinting(); + int selFrom, selTo; + m_previewPrintout->GetPageInfo(&m_minPage, &m_maxPage, &selFrom, &selTo); + m_printingPrepared = true; + } + + m_previewPrintout->OnBeginPrinting(); + + if (!m_previewPrintout->OnBeginDocument(m_printDialogData.GetFromPage(), m_printDialogData.GetToPage())) + { + wxMessageBox(_("Could not start document preview."), _("Print Preview Failure"), wxOK); + + memoryDC.SelectObject(wxNullBitmap); + + delete m_previewBitmap; + m_previewBitmap = NULL; + return false; + } + + m_previewPrintout->OnPrintPage(pageNum); + m_previewPrintout->OnEndDocument(); + m_previewPrintout->OnEndPrinting(); + + m_previewPrintout->SetDC(NULL); + + memoryDC.SelectObject(wxNullBitmap); + +#if wxUSE_STATUSBAR + wxString status; + if (m_maxPage != 0) + status = wxString::Format(_("Page %d of %d"), pageNum, m_maxPage); + else + status = wxString::Format(_("Page %d"), pageNum); + + if (m_previewFrame) + m_previewFrame->SetStatusText(status); +#endif + + return true; +} + +bool wxPrintPreviewBase::DrawBlankPage(wxPreviewCanvas *canvas, wxDC& dc) +{ + wxRect pageRect, paperRect; + + CalcRects(canvas, pageRect, paperRect); + + // Draw shadow, allowing for 1-pixel border AROUND the actual paper + wxCoord shadowOffset = 4; + + dc.SetPen(*wxBLACK_PEN); + dc.SetBrush(*wxBLACK_BRUSH); + dc.DrawRectangle(paperRect.x + shadowOffset, paperRect.y + paperRect.height + 1, + paperRect.width, shadowOffset); + + dc.DrawRectangle(paperRect.x + paperRect.width, paperRect.y + shadowOffset, + shadowOffset, paperRect.height); + + // Draw blank page allowing for 1-pixel border AROUND the actual paper + dc.SetPen(*wxBLACK_PEN); + dc.SetBrush(*wxWHITE_BRUSH); + dc.DrawRectangle(paperRect.x - 2, paperRect.y - 1, + paperRect.width + 3, paperRect.height + 2); + + return true; +} + +void wxPrintPreviewBase::SetZoom(int percent) +{ + if (m_currentZoom == percent) + return; + + m_currentZoom = percent; + if (m_previewBitmap) + { + delete m_previewBitmap; + m_previewBitmap = NULL; + } + + if (m_previewCanvas) + { + AdjustScrollbars(m_previewCanvas); + RenderPage(m_currentPage); + ((wxScrolledWindow *) m_previewCanvas)->Scroll(0, 0); + m_previewCanvas->ClearBackground(); + m_previewCanvas->Refresh(); + m_previewCanvas->SetFocus(); + } +} + +wxPrintDialogData& wxPrintPreviewBase::GetPrintDialogData() +{ + return m_printDialogData; +} + +int wxPrintPreviewBase::GetZoom() const +{ return m_currentZoom; } +int wxPrintPreviewBase::GetMaxPage() const +{ return m_maxPage; } +int wxPrintPreviewBase::GetMinPage() const +{ return m_minPage; } +bool wxPrintPreviewBase::IsOk() const +{ return m_isOk; } +void wxPrintPreviewBase::SetOk(bool ok) +{ m_isOk = ok; } + +//---------------------------------------------------------------------------- +// wxPrintPreview +//---------------------------------------------------------------------------- + +IMPLEMENT_CLASS(wxPrintPreview, wxPrintPreviewBase) + +wxPrintPreview::wxPrintPreview(wxPrintout *printout, + wxPrintout *printoutForPrinting, + wxPrintDialogData *data) : + wxPrintPreviewBase( printout, printoutForPrinting, data ) +{ + m_pimpl = wxPrintFactory::GetFactory()-> + CreatePrintPreview( printout, printoutForPrinting, data ); +} + +wxPrintPreview::wxPrintPreview(wxPrintout *printout, + wxPrintout *printoutForPrinting, + wxPrintData *data ) : + wxPrintPreviewBase( printout, printoutForPrinting, data ) +{ + m_pimpl = wxPrintFactory::GetFactory()-> + CreatePrintPreview( printout, printoutForPrinting, data ); +} + +wxPrintPreview::~wxPrintPreview() +{ + delete m_pimpl; + + // don't delete twice + m_printPrintout = NULL; + m_previewPrintout = NULL; + m_previewBitmap = NULL; +} + +bool wxPrintPreview::SetCurrentPage(int pageNum) +{ + return m_pimpl->SetCurrentPage( pageNum ); +} + +int wxPrintPreview::GetCurrentPage() const +{ + return m_pimpl->GetCurrentPage(); +} + +void wxPrintPreview::SetPrintout(wxPrintout *printout) +{ + m_pimpl->SetPrintout( printout ); +} + +wxPrintout *wxPrintPreview::GetPrintout() const +{ + return m_pimpl->GetPrintout(); +} + +wxPrintout *wxPrintPreview::GetPrintoutForPrinting() const +{ + return m_pimpl->GetPrintoutForPrinting(); +} + +void wxPrintPreview::SetFrame(wxFrame *frame) +{ + m_pimpl->SetFrame( frame ); +} + +void wxPrintPreview::SetCanvas(wxPreviewCanvas *canvas) +{ + m_pimpl->SetCanvas( canvas ); +} + +wxFrame *wxPrintPreview::GetFrame() const +{ + return m_pimpl->GetFrame(); +} + +wxPreviewCanvas *wxPrintPreview::GetCanvas() const +{ + return m_pimpl->GetCanvas(); +} + +bool wxPrintPreview::PaintPage(wxPreviewCanvas *canvas, wxDC& dc) +{ + return m_pimpl->PaintPage( canvas, dc ); +} + +bool wxPrintPreview::DrawBlankPage(wxPreviewCanvas *canvas, wxDC& dc) +{ + return m_pimpl->DrawBlankPage( canvas, dc ); +} + +void wxPrintPreview::AdjustScrollbars(wxPreviewCanvas *canvas) +{ + m_pimpl->AdjustScrollbars( canvas ); +} + +bool wxPrintPreview::RenderPage(int pageNum) +{ + return m_pimpl->RenderPage( pageNum ); +} + +void wxPrintPreview::SetZoom(int percent) +{ + m_pimpl->SetZoom( percent ); +} + +int wxPrintPreview::GetZoom() const +{ + return m_pimpl->GetZoom(); +} + +wxPrintDialogData& wxPrintPreview::GetPrintDialogData() +{ + return m_pimpl->GetPrintDialogData(); +} + +int wxPrintPreview::GetMaxPage() const +{ + return m_pimpl->GetMaxPage(); +} + +int wxPrintPreview::GetMinPage() const +{ + return m_pimpl->GetMinPage(); +} + +bool wxPrintPreview::IsOk() const +{ + return m_pimpl->Ok(); +} + +void wxPrintPreview::SetOk(bool ok) +{ + m_pimpl->SetOk( ok ); +} + +bool wxPrintPreview::Print(bool interactive) +{ + return m_pimpl->Print( interactive ); +} + +void wxPrintPreview::DetermineScaling() +{ + m_pimpl->DetermineScaling(); +} + +#endif // wxUSE_PRINTING_ARCHITECTURE diff --git a/Externals/wxWidgets/src/common/process.cpp b/Externals/wxWidgets/src/common/process.cpp new file mode 100644 index 0000000000..3c0ae358c7 --- /dev/null +++ b/Externals/wxWidgets/src/common/process.cpp @@ -0,0 +1,172 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: process.cpp +// Purpose: Process termination classes +// Author: Guilhem Lavaux +// Modified by: Vadim Zeitlin to check error codes, added Detach() method +// Created: 24/06/98 +// RCS-ID: $Id: process.cpp 42702 2006-10-30 09:03:18Z JS $ +// Copyright: (c) Guilhem Lavaux +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#include "wx/process.h" + +// ---------------------------------------------------------------------------- +// event tables and such +// ---------------------------------------------------------------------------- + +DEFINE_EVENT_TYPE(wxEVT_END_PROCESS) + +IMPLEMENT_DYNAMIC_CLASS(wxProcess, wxEvtHandler) +IMPLEMENT_DYNAMIC_CLASS(wxProcessEvent, wxEvent) + +// ============================================================================ +// wxProcess implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxProcess creation +// ---------------------------------------------------------------------------- + +void wxProcess::Init(wxEvtHandler *parent, int id, int flags) +{ + if ( parent ) + SetNextHandler(parent); + + m_id = id; + m_pid = 0; + m_redirect = (flags & wxPROCESS_REDIRECT) != 0; + +#if wxUSE_STREAMS + m_inputStream = NULL; + m_errorStream = NULL; + m_outputStream = NULL; +#endif // wxUSE_STREAMS +} + +/* static */ +wxProcess *wxProcess::Open(const wxString& cmd, int flags) +{ + wxASSERT_MSG( !(flags & wxEXEC_SYNC), wxT("wxEXEC_SYNC should not be used." )); + wxProcess *process = new wxProcess(wxPROCESS_REDIRECT); + long pid = wxExecute(cmd, flags, process); + if( !pid ) + { + // couldn't launch the process + delete process; + return NULL; + } + + process->SetPid(pid); + + return process; +} + +// ---------------------------------------------------------------------------- +// wxProcess termination +// ---------------------------------------------------------------------------- + +wxProcess::~wxProcess() +{ +#if wxUSE_STREAMS + delete m_inputStream; + delete m_errorStream; + delete m_outputStream; +#endif // wxUSE_STREAMS +} + +void wxProcess::OnTerminate(int pid, int status) +{ + wxProcessEvent event(m_id, pid, status); + + if ( !ProcessEvent(event) ) + delete this; + //else: the object which processed the event is responsible for deleting + // us! +} + +void wxProcess::Detach() +{ + SetNextHandler(NULL); +} + +// ---------------------------------------------------------------------------- +// process IO redirection +// ---------------------------------------------------------------------------- + +#if wxUSE_STREAMS + +void wxProcess::SetPipeStreams(wxInputStream *inputSstream, + wxOutputStream *outputStream, + wxInputStream *errorStream) +{ + m_inputStream = inputSstream; + m_errorStream = errorStream; + m_outputStream = outputStream; +} + +bool wxProcess::IsInputOpened() const +{ + return m_inputStream && m_inputStream->GetLastError() != wxSTREAM_EOF; +} + +bool wxProcess::IsInputAvailable() const +{ + return m_inputStream && m_inputStream->CanRead(); +} + +bool wxProcess::IsErrorAvailable() const +{ + return m_errorStream && m_errorStream->CanRead(); +} + +#endif // wxUSE_STREAMS + +// ---------------------------------------------------------------------------- +// process killing +// ---------------------------------------------------------------------------- + +/* static */ +wxKillError wxProcess::Kill(int pid, wxSignal sig, int flags) +{ + wxKillError rc; + (void)wxKill(pid, sig, &rc, flags); + + return rc; +} + +/* static */ +bool wxProcess::Exists(int pid) +{ + switch ( Kill(pid, wxSIGNONE) ) + { + case wxKILL_OK: + case wxKILL_ACCESS_DENIED: + return true; + + default: + case wxKILL_ERROR: + case wxKILL_BAD_SIGNAL: + wxFAIL_MSG( _T("unexpected wxProcess::Kill() return code") ); + // fall through + + case wxKILL_NO_PROCESS: + return false; + } +} + diff --git a/Externals/wxWidgets/src/common/protocol.cpp b/Externals/wxWidgets/src/common/protocol.cpp new file mode 100644 index 0000000000..1bbf85e0b2 --- /dev/null +++ b/Externals/wxWidgets/src/common/protocol.cpp @@ -0,0 +1,215 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/protocol.cpp +// Purpose: Implement protocol base class +// Author: Guilhem Lavaux +// Modified by: +// Created: 07/07/1997 +// RCS-ID: $Id: protocol.cpp 40943 2006-08-31 19:31:43Z ABX $ +// Copyright: (c) 1997, 1998 Guilhem Lavaux +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_PROTOCOL + +#include "wx/protocol/protocol.h" + +#ifndef WX_PRECOMP + #include "wx/module.h" +#endif + +#include "wx/url.h" + +#include + +///////////////////////////////////////////////////////////////// +// wxProtoInfo +///////////////////////////////////////////////////////////////// + +/* + * -------------------------------------------------------------- + * --------- wxProtoInfo CONSTRUCTOR ---------------------------- + * -------------------------------------------------------------- + */ + +wxProtoInfo::wxProtoInfo(const wxChar *name, const wxChar *serv, + const bool need_host1, wxClassInfo *info) + : m_protoname(name), + m_servname(serv) +{ + m_cinfo = info; + m_needhost = need_host1; +#if wxUSE_URL + next = wxURL::ms_protocols; + wxURL::ms_protocols = this; +#else + next = NULL; +#endif +} + +///////////////////////////////////////////////////////////////// +// wxProtocol /////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////// + +#if wxUSE_SOCKETS +IMPLEMENT_ABSTRACT_CLASS(wxProtocol, wxSocketClient) +#else +IMPLEMENT_ABSTRACT_CLASS(wxProtocol, wxObject) +#endif + +wxProtocol::wxProtocol() +#if wxUSE_SOCKETS + : wxSocketClient() +#endif +{ +} + +#if wxUSE_SOCKETS +bool wxProtocol::Reconnect() +{ + wxIPV4address addr; + + if (!GetPeer(addr)) + { + Close(); + return false; + } + + if (!Close()) + return false; + + if (!Connect(addr)) + return false; + + return true; +} + +// ---------------------------------------------------------------------------- +// Read a line from socket +// ---------------------------------------------------------------------------- + +/* static */ +wxProtocolError wxProtocol::ReadLine(wxSocketBase *sock, wxString& result) +{ + static const int LINE_BUF = 4095; + + result.clear(); + + wxCharBuffer buf(LINE_BUF); + char *pBuf = buf.data(); + while ( sock->WaitForRead() ) + { + // peek at the socket to see if there is a CRLF + sock->Peek(pBuf, LINE_BUF); + + size_t nRead = sock->LastCount(); + if ( !nRead && sock->Error() ) + return wxPROTO_NETERR; + + // look for "\r\n" paying attention to a special case: "\r\n" could + // have been split by buffer boundary, so check also for \r at the end + // of the last chunk and \n at the beginning of this one + pBuf[nRead] = '\0'; + const char *eol = strchr(pBuf, '\n'); + + // if we found '\n', is there a '\r' as well? + if ( eol ) + { + if ( eol == pBuf ) + { + // check for case of "\r\n" being split + if ( result.empty() || result.Last() != _T('\r') ) + { + // ignore the stray '\n' + eol = NULL; + } + //else: ok, got real EOL + + // read just this '\n' and restart + nRead = 1; + } + else // '\n' in the middle of the buffer + { + // in any case, read everything up to and including '\n' + nRead = eol - pBuf + 1; + + if ( eol[-1] != '\r' ) + { + // as above, simply ignore stray '\n' + eol = NULL; + } + } + } + + sock->Read(pBuf, nRead); + if ( sock->LastCount() != nRead ) + return wxPROTO_NETERR; + + pBuf[nRead] = '\0'; + result += wxString::FromAscii(pBuf); + + if ( eol ) + { + // remove trailing "\r\n" + result.RemoveLast(2); + + return wxPROTO_NOERR; + } + } + + return wxPROTO_NETERR; +} + +wxProtocolError wxProtocol::ReadLine(wxString& result) +{ + return ReadLine(this, result); +} + +// old function which only chops '\n' and not '\r\n' +wxProtocolError GetLine(wxSocketBase *sock, wxString& result) +{ +#define PROTO_BSIZE 2048 + size_t avail, size; + char tmp_buf[PROTO_BSIZE], tmp_str[PROTO_BSIZE]; + char *ret; + bool found; + + avail = sock->Read(tmp_buf, PROTO_BSIZE).LastCount(); + if (sock->Error() || avail == 0) + return wxPROTO_NETERR; + + memcpy(tmp_str, tmp_buf, avail); + + // Not implemented on all systems + // ret = (char *)memccpy(tmp_str, tmp_buf, '\n', avail); + found = false; + for (ret=tmp_str;ret < (tmp_str+avail); ret++) + if (*ret == '\n') + { + found = true; + break; + } + + if (!found) + return wxPROTO_PROTERR; + + *ret = 0; + + result = wxString::FromAscii( tmp_str ); + result = result.Left(result.length()-1); + + size = ret-tmp_str+1; + sock->Unread(&tmp_buf[size], avail-size); + + return wxPROTO_NOERR; +#undef PROTO_BSIZE +} +#endif // wxUSE_SOCKETS + +#endif // wxUSE_PROTOCOL diff --git a/Externals/wxWidgets/src/common/quantize.cpp b/Externals/wxWidgets/src/common/quantize.cpp new file mode 100644 index 0000000000..85d0f1fc1b --- /dev/null +++ b/Externals/wxWidgets/src/common/quantize.cpp @@ -0,0 +1,1654 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/quantize.cpp +// Purpose: wxQuantize implementation +// Author: Julian Smart +// Modified by: +// Created: 22/6/2000 +// RCS-ID: $Id: quantize.cpp 39957 2006-07-03 19:02:54Z ABX $ +// Copyright: (c) Thomas G. Lane, Vaclav Slavik, Julian Smart +// Licence: wxWindows licence + JPEG library licence +///////////////////////////////////////////////////////////////////////////// + +/* + * jquant2.c + * + * Copyright (C) 1991-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains 2-pass color quantization (color mapping) routines. + * These routines provide selection of a custom color map for an image, + * followed by mapping of the image to that color map, with optional + * Floyd-Steinberg dithering. + * It is also possible to use just the second pass to map to an arbitrary + * externally-given color map. + * + * Note: ordered dithering is not supported, since there isn't any fast + * way to compute intercolor distances; it's unclear that ordered dither's + * fundamental assumptions even hold with an irregularly spaced color map. + */ + +/* modified by Vaclav Slavik for use as jpeglib-independent module */ + +// For compilers that support precompilation, includes "wx/wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ +#pragma hdrstop +#endif + +#if wxUSE_IMAGE + +#include "wx/quantize.h" + +#ifndef WX_PRECOMP + #include "wx/palette.h" + #include "wx/image.h" +#endif + +#ifdef __WXMSW__ + #include "wx/msw/private.h" +#endif + +#include +#include + +#if defined(__OS2__) +#define RGB_RED_OS2 0 +#define RGB_GREEN_OS2 1 +#define RGB_BLUE_OS2 2 +#else +#define RGB_RED 0 +#define RGB_GREEN 1 +#define RGB_BLUE 2 +#endif +#define RGB_PIXELSIZE 3 + +#define MAXJSAMPLE 255 +#define CENTERJSAMPLE 128 +#define BITS_IN_JSAMPLE 8 +#define GETJSAMPLE(value) ((int) (value)) + +#define RIGHT_SHIFT(x,shft) ((x) >> (shft)) + +typedef unsigned short UINT16; +typedef signed short INT16; +#if !(defined(__WATCOMC__) && (defined(__WXMSW__) || defined(__WXMOTIF__))) +typedef signed int INT32; +#endif + +typedef unsigned char JSAMPLE; +typedef JSAMPLE *JSAMPROW; +typedef JSAMPROW *JSAMPARRAY; +typedef unsigned int JDIMENSION; + +typedef struct { + void *cquantize; + JDIMENSION output_width; + JSAMPARRAY colormap; + int actual_number_of_colors; + int desired_number_of_colors; + JSAMPLE *sample_range_limit, *srl_orig; +} j_decompress; + +#if defined(__WINDOWS__) && !defined(__WXMICROWIN__) + #define JMETHOD(type,methodname,arglist) type (__cdecl methodname) arglist +#else + #define JMETHOD(type,methodname,arglist) type (methodname) arglist +#endif + +typedef j_decompress *j_decompress_ptr; +struct jpeg_color_quantizer { + JMETHOD(void, start_pass, (j_decompress_ptr cinfo, bool is_pre_scan)); + JMETHOD(void, color_quantize, (j_decompress_ptr cinfo, + JSAMPARRAY input_buf, JSAMPARRAY output_buf, + int num_rows)); + JMETHOD(void, finish_pass, (j_decompress_ptr cinfo)); + JMETHOD(void, new_color_map, (j_decompress_ptr cinfo)); +}; + + + + +/* + * This module implements the well-known Heckbert paradigm for color + * quantization. Most of the ideas used here can be traced back to + * Heckbert's seminal paper + * Heckbert, Paul. "Color Image Quantization for Frame Buffer Display", + * Proc. SIGGRAPH '82, Computer Graphics v.16 #3 (July 1982), pp 297-304. + * + * In the first pass over the image, we accumulate a histogram showing the + * usage count of each possible color. To keep the histogram to a reasonable + * size, we reduce the precision of the input; typical practice is to retain + * 5 or 6 bits per color, so that 8 or 4 different input values are counted + * in the same histogram cell. + * + * Next, the color-selection step begins with a box representing the whole + * color space, and repeatedly splits the "largest" remaining box until we + * have as many boxes as desired colors. Then the mean color in each + * remaining box becomes one of the possible output colors. + * + * The second pass over the image maps each input pixel to the closest output + * color (optionally after applying a Floyd-Steinberg dithering correction). + * This mapping is logically trivial, but making it go fast enough requires + * considerable care. + * + * Heckbert-style quantizers vary a good deal in their policies for choosing + * the "largest" box and deciding where to cut it. The particular policies + * used here have proved out well in experimental comparisons, but better ones + * may yet be found. + * + * In earlier versions of the IJG code, this module quantized in YCbCr color + * space, processing the raw upsampled data without a color conversion step. + * This allowed the color conversion math to be done only once per colormap + * entry, not once per pixel. However, that optimization precluded other + * useful optimizations (such as merging color conversion with upsampling) + * and it also interfered with desired capabilities such as quantizing to an + * externally-supplied colormap. We have therefore abandoned that approach. + * The present code works in the post-conversion color space, typically RGB. + * + * To improve the visual quality of the results, we actually work in scaled + * RGB space, giving G distances more weight than R, and R in turn more than + * B. To do everything in integer math, we must use integer scale factors. + * The 2/3/1 scale factors used here correspond loosely to the relative + * weights of the colors in the NTSC grayscale equation. + * If you want to use this code to quantize a non-RGB color space, you'll + * probably need to change these scale factors. + */ + +#define R_SCALE 2 /* scale R distances by this much */ +#define G_SCALE 3 /* scale G distances by this much */ +#define B_SCALE 1 /* and B by this much */ + +/* Relabel R/G/B as components 0/1/2, respecting the RGB ordering defined + * in jmorecfg.h. As the code stands, it will do the right thing for R,G,B + * and B,G,R orders. If you define some other weird order in jmorecfg.h, + * you'll get compile errors until you extend this logic. In that case + * you'll probably want to tweak the histogram sizes too. + */ + +#if defined(__OS2__) + +#if RGB_RED_OS2 == 0 +#define C0_SCALE R_SCALE +#endif +#if RGB_BLUE_OS2 == 0 +#define C0_SCALE B_SCALE +#endif +#if RGB_GREEN_OS2 == 1 +#define C1_SCALE G_SCALE +#endif +#if RGB_RED_OS2 == 2 +#define C2_SCALE R_SCALE +#endif +#if RGB_BLUE_OS2 == 2 +#define C2_SCALE B_SCALE +#endif + +#else + +#if RGB_RED == 0 +#define C0_SCALE R_SCALE +#endif +#if RGB_BLUE == 0 +#define C0_SCALE B_SCALE +#endif +#if RGB_GREEN == 1 +#define C1_SCALE G_SCALE +#endif +#if RGB_RED == 2 +#define C2_SCALE R_SCALE +#endif +#if RGB_BLUE == 2 +#define C2_SCALE B_SCALE +#endif + +#endif + +/* + * First we have the histogram data structure and routines for creating it. + * + * The number of bits of precision can be adjusted by changing these symbols. + * We recommend keeping 6 bits for G and 5 each for R and B. + * If you have plenty of memory and cycles, 6 bits all around gives marginally + * better results; if you are short of memory, 5 bits all around will save + * some space but degrade the results. + * To maintain a fully accurate histogram, we'd need to allocate a "long" + * (preferably unsigned long) for each cell. In practice this is overkill; + * we can get by with 16 bits per cell. Few of the cell counts will overflow, + * and clamping those that do overflow to the maximum value will give close- + * enough results. This reduces the recommended histogram size from 256Kb + * to 128Kb, which is a useful savings on PC-class machines. + * (In the second pass the histogram space is re-used for pixel mapping data; + * in that capacity, each cell must be able to store zero to the number of + * desired colors. 16 bits/cell is plenty for that too.) + * Since the JPEG code is intended to run in small memory model on 80x86 + * machines, we can't just allocate the histogram in one chunk. Instead + * of a true 3-D array, we use a row of pointers to 2-D arrays. Each + * pointer corresponds to a C0 value (typically 2^5 = 32 pointers) and + * each 2-D array has 2^6*2^5 = 2048 or 2^6*2^6 = 4096 entries. Note that + * on 80x86 machines, the pointer row is in near memory but the actual + * arrays are in far memory (same arrangement as we use for image arrays). + */ + +#define MAXNUMCOLORS (MAXJSAMPLE+1) /* maximum size of colormap */ + +/* These will do the right thing for either R,G,B or B,G,R color order, + * but you may not like the results for other color orders. + */ +#define HIST_C0_BITS 5 /* bits of precision in R/B histogram */ +#define HIST_C1_BITS 6 /* bits of precision in G histogram */ +#define HIST_C2_BITS 5 /* bits of precision in B/R histogram */ + +/* Number of elements along histogram axes. */ +#define HIST_C0_ELEMS (1<cquantize; + register JSAMPROW ptr; + register histptr histp; + register hist3d histogram = cquantize->histogram; + int row; + JDIMENSION col; + JDIMENSION width = cinfo->output_width; + + for (row = 0; row < num_rows; row++) { + ptr = input_buf[row]; + for (col = width; col > 0; col--) { + + { + + /* get pixel value and index into the histogram */ + histp = & histogram[GETJSAMPLE(ptr[0]) >> C0_SHIFT] + [GETJSAMPLE(ptr[1]) >> C1_SHIFT] + [GETJSAMPLE(ptr[2]) >> C2_SHIFT]; + /* increment, check for overflow and undo increment if so. */ + if (++(*histp) <= 0) + (*histp)--; + } + ptr += 3; + } + } +} + + +/* + * Next we have the really interesting routines: selection of a colormap + * given the completed histogram. + * These routines work with a list of "boxes", each representing a rectangular + * subset of the input color space (to histogram precision). + */ + +typedef struct { + /* The bounds of the box (inclusive); expressed as histogram indexes */ + int c0min, c0max; + int c1min, c1max; + int c2min, c2max; + /* The volume (actually 2-norm) of the box */ + INT32 volume; + /* The number of nonzero histogram cells within this box */ + long colorcount; +} box; + +typedef box * boxptr; + + +boxptr +find_biggest_color_pop (boxptr boxlist, int numboxes) +/* Find the splittable box with the largest color population */ +/* Returns NULL if no splittable boxes remain */ +{ + register boxptr boxp; + register int i; + register long maxc = 0; + boxptr which = NULL; + + for (i = 0, boxp = boxlist; i < numboxes; i++, boxp++) { + if (boxp->colorcount > maxc && boxp->volume > 0) { + which = boxp; + maxc = boxp->colorcount; + } + } + return which; +} + + +boxptr +find_biggest_volume (boxptr boxlist, int numboxes) +/* Find the splittable box with the largest (scaled) volume */ +/* Returns NULL if no splittable boxes remain */ +{ + register boxptr boxp; + register int i; + register INT32 maxv = 0; + boxptr which = NULL; + + for (i = 0, boxp = boxlist; i < numboxes; i++, boxp++) { + if (boxp->volume > maxv) { + which = boxp; + maxv = boxp->volume; + } + } + return which; +} + + +void +update_box (j_decompress_ptr cinfo, boxptr boxp) +/* Shrink the min/max bounds of a box to enclose only nonzero elements, */ +/* and recompute its volume and population */ +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + hist3d histogram = cquantize->histogram; + histptr histp; + int c0,c1,c2; + int c0min,c0max,c1min,c1max,c2min,c2max; + INT32 dist0,dist1,dist2; + long ccount; + + c0min = boxp->c0min; c0max = boxp->c0max; + c1min = boxp->c1min; c1max = boxp->c1max; + c2min = boxp->c2min; c2max = boxp->c2max; + + if (c0max > c0min) + for (c0 = c0min; c0 <= c0max; c0++) + for (c1 = c1min; c1 <= c1max; c1++) { + histp = & histogram[c0][c1][c2min]; + for (c2 = c2min; c2 <= c2max; c2++) + if (*histp++ != 0) { + boxp->c0min = c0min = c0; + goto have_c0min; + } + } + have_c0min: + if (c0max > c0min) + for (c0 = c0max; c0 >= c0min; c0--) + for (c1 = c1min; c1 <= c1max; c1++) { + histp = & histogram[c0][c1][c2min]; + for (c2 = c2min; c2 <= c2max; c2++) + if (*histp++ != 0) { + boxp->c0max = c0max = c0; + goto have_c0max; + } + } + have_c0max: + if (c1max > c1min) + for (c1 = c1min; c1 <= c1max; c1++) + for (c0 = c0min; c0 <= c0max; c0++) { + histp = & histogram[c0][c1][c2min]; + for (c2 = c2min; c2 <= c2max; c2++) + if (*histp++ != 0) { + boxp->c1min = c1min = c1; + goto have_c1min; + } + } + have_c1min: + if (c1max > c1min) + for (c1 = c1max; c1 >= c1min; c1--) + for (c0 = c0min; c0 <= c0max; c0++) { + histp = & histogram[c0][c1][c2min]; + for (c2 = c2min; c2 <= c2max; c2++) + if (*histp++ != 0) { + boxp->c1max = c1max = c1; + goto have_c1max; + } + } + have_c1max: + if (c2max > c2min) + for (c2 = c2min; c2 <= c2max; c2++) + for (c0 = c0min; c0 <= c0max; c0++) { + histp = & histogram[c0][c1min][c2]; + for (c1 = c1min; c1 <= c1max; c1++, histp += HIST_C2_ELEMS) + if (*histp != 0) { + boxp->c2min = c2min = c2; + goto have_c2min; + } + } + have_c2min: + if (c2max > c2min) + for (c2 = c2max; c2 >= c2min; c2--) + for (c0 = c0min; c0 <= c0max; c0++) { + histp = & histogram[c0][c1min][c2]; + for (c1 = c1min; c1 <= c1max; c1++, histp += HIST_C2_ELEMS) + if (*histp != 0) { + boxp->c2max = c2max = c2; + goto have_c2max; + } + } + have_c2max: + + /* Update box volume. + * We use 2-norm rather than real volume here; this biases the method + * against making long narrow boxes, and it has the side benefit that + * a box is splittable iff norm > 0. + * Since the differences are expressed in histogram-cell units, + * we have to shift back to JSAMPLE units to get consistent distances; + * after which, we scale according to the selected distance scale factors. + */ + dist0 = ((c0max - c0min) << C0_SHIFT) * C0_SCALE; + dist1 = ((c1max - c1min) << C1_SHIFT) * C1_SCALE; + dist2 = ((c2max - c2min) << C2_SHIFT) * C2_SCALE; + boxp->volume = dist0*dist0 + dist1*dist1 + dist2*dist2; + + /* Now scan remaining volume of box and compute population */ + ccount = 0; + for (c0 = c0min; c0 <= c0max; c0++) + for (c1 = c1min; c1 <= c1max; c1++) { + histp = & histogram[c0][c1][c2min]; + for (c2 = c2min; c2 <= c2max; c2++, histp++) + if (*histp != 0) { + ccount++; + } + } + boxp->colorcount = ccount; +} + + +int +median_cut (j_decompress_ptr cinfo, boxptr boxlist, int numboxes, + int desired_colors) +/* Repeatedly select and split the largest box until we have enough boxes */ +{ + int n,lb; + int c0,c1,c2,cmax; + register boxptr b1,b2; + + while (numboxes < desired_colors) { + /* Select box to split. + * Current algorithm: by population for first half, then by volume. + */ + if ((numboxes*2) <= desired_colors) { + b1 = find_biggest_color_pop(boxlist, numboxes); + } else { + b1 = find_biggest_volume(boxlist, numboxes); + } + if (b1 == NULL) /* no splittable boxes left! */ + break; + b2 = &boxlist[numboxes]; /* where new box will go */ + /* Copy the color bounds to the new box. */ + b2->c0max = b1->c0max; b2->c1max = b1->c1max; b2->c2max = b1->c2max; + b2->c0min = b1->c0min; b2->c1min = b1->c1min; b2->c2min = b1->c2min; + /* Choose which axis to split the box on. + * Current algorithm: longest scaled axis. + * See notes in update_box about scaling distances. + */ + c0 = ((b1->c0max - b1->c0min) << C0_SHIFT) * C0_SCALE; + c1 = ((b1->c1max - b1->c1min) << C1_SHIFT) * C1_SCALE; + c2 = ((b1->c2max - b1->c2min) << C2_SHIFT) * C2_SCALE; + /* We want to break any ties in favor of green, then red, blue last. + * This code does the right thing for R,G,B or B,G,R color orders only. + */ +#if defined(__VISAGECPP__) + +#if RGB_RED_OS2 == 0 + cmax = c1; n = 1; + if (c0 > cmax) { cmax = c0; n = 0; } + if (c2 > cmax) { n = 2; } +#else + cmax = c1; n = 1; + if (c2 > cmax) { cmax = c2; n = 2; } + if (c0 > cmax) { n = 0; } +#endif + +#else + +#if RGB_RED == 0 + cmax = c1; n = 1; + if (c0 > cmax) { cmax = c0; n = 0; } + if (c2 > cmax) { n = 2; } +#else + cmax = c1; n = 1; + if (c2 > cmax) { cmax = c2; n = 2; } + if (c0 > cmax) { n = 0; } +#endif + +#endif + /* Choose split point along selected axis, and update box bounds. + * Current algorithm: split at halfway point. + * (Since the box has been shrunk to minimum volume, + * any split will produce two nonempty subboxes.) + * Note that lb value is max for lower box, so must be < old max. + */ + switch (n) { + case 0: + lb = (b1->c0max + b1->c0min) / 2; + b1->c0max = lb; + b2->c0min = lb+1; + break; + case 1: + lb = (b1->c1max + b1->c1min) / 2; + b1->c1max = lb; + b2->c1min = lb+1; + break; + case 2: + lb = (b1->c2max + b1->c2min) / 2; + b1->c2max = lb; + b2->c2min = lb+1; + break; + } + /* Update stats for boxes */ + update_box(cinfo, b1); + update_box(cinfo, b2); + numboxes++; + } + return numboxes; +} + + +void +compute_color (j_decompress_ptr cinfo, boxptr boxp, int icolor) +/* Compute representative color for a box, put it in colormap[icolor] */ +{ + /* Current algorithm: mean weighted by pixels (not colors) */ + /* Note it is important to get the rounding correct! */ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + hist3d histogram = cquantize->histogram; + histptr histp; + int c0,c1,c2; + int c0min,c0max,c1min,c1max,c2min,c2max; + long count; + long total = 0; + long c0total = 0; + long c1total = 0; + long c2total = 0; + + c0min = boxp->c0min; c0max = boxp->c0max; + c1min = boxp->c1min; c1max = boxp->c1max; + c2min = boxp->c2min; c2max = boxp->c2max; + + for (c0 = c0min; c0 <= c0max; c0++) + for (c1 = c1min; c1 <= c1max; c1++) { + histp = & histogram[c0][c1][c2min]; + for (c2 = c2min; c2 <= c2max; c2++) { + if ((count = *histp++) != 0) { + total += count; + c0total += ((c0 << C0_SHIFT) + ((1<>1)) * count; + c1total += ((c1 << C1_SHIFT) + ((1<>1)) * count; + c2total += ((c2 << C2_SHIFT) + ((1<>1)) * count; + } + } + } + + cinfo->colormap[0][icolor] = (JSAMPLE) ((c0total + (total>>1)) / total); + cinfo->colormap[1][icolor] = (JSAMPLE) ((c1total + (total>>1)) / total); + cinfo->colormap[2][icolor] = (JSAMPLE) ((c2total + (total>>1)) / total); +} + + +static void +select_colors (j_decompress_ptr cinfo, int desired_colors) +/* Master routine for color selection */ +{ + boxptr boxlist; + int numboxes; + int i; + + /* Allocate workspace for box list */ + boxlist = (boxptr) malloc(desired_colors * sizeof(box)); + /* Initialize one box containing whole space */ + numboxes = 1; + boxlist[0].c0min = 0; + boxlist[0].c0max = MAXJSAMPLE >> C0_SHIFT; + boxlist[0].c1min = 0; + boxlist[0].c1max = MAXJSAMPLE >> C1_SHIFT; + boxlist[0].c2min = 0; + boxlist[0].c2max = MAXJSAMPLE >> C2_SHIFT; + /* Shrink it to actually-used volume and set its statistics */ + update_box(cinfo, & boxlist[0]); + /* Perform median-cut to produce final box list */ + numboxes = median_cut(cinfo, boxlist, numboxes, desired_colors); + /* Compute the representative color for each box, fill colormap */ + for (i = 0; i < numboxes; i++) + compute_color(cinfo, & boxlist[i], i); + cinfo->actual_number_of_colors = numboxes; + + free(boxlist); //FIXME?? I don't know if this is correct - VS +} + + +/* + * These routines are concerned with the time-critical task of mapping input + * colors to the nearest color in the selected colormap. + * + * We re-use the histogram space as an "inverse color map", essentially a + * cache for the results of nearest-color searches. All colors within a + * histogram cell will be mapped to the same colormap entry, namely the one + * closest to the cell's center. This may not be quite the closest entry to + * the actual input color, but it's almost as good. A zero in the cache + * indicates we haven't found the nearest color for that cell yet; the array + * is cleared to zeroes before starting the mapping pass. When we find the + * nearest color for a cell, its colormap index plus one is recorded in the + * cache for future use. The pass2 scanning routines call fill_inverse_cmap + * when they need to use an unfilled entry in the cache. + * + * Our method of efficiently finding nearest colors is based on the "locally + * sorted search" idea described by Heckbert and on the incremental distance + * calculation described by Spencer W. Thomas in chapter III.1 of Graphics + * Gems II (James Arvo, ed. Academic Press, 1991). Thomas points out that + * the distances from a given colormap entry to each cell of the histogram can + * be computed quickly using an incremental method: the differences between + * distances to adjacent cells themselves differ by a constant. This allows a + * fairly fast implementation of the "brute force" approach of computing the + * distance from every colormap entry to every histogram cell. Unfortunately, + * it needs a work array to hold the best-distance-so-far for each histogram + * cell (because the inner loop has to be over cells, not colormap entries). + * The work array elements have to be INT32s, so the work array would need + * 256Kb at our recommended precision. This is not feasible in DOS machines. + * + * To get around these problems, we apply Thomas' method to compute the + * nearest colors for only the cells within a small subbox of the histogram. + * The work array need be only as big as the subbox, so the memory usage + * problem is solved. Furthermore, we need not fill subboxes that are never + * referenced in pass2; many images use only part of the color gamut, so a + * fair amount of work is saved. An additional advantage of this + * approach is that we can apply Heckbert's locality criterion to quickly + * eliminate colormap entries that are far away from the subbox; typically + * three-fourths of the colormap entries are rejected by Heckbert's criterion, + * and we need not compute their distances to individual cells in the subbox. + * The speed of this approach is heavily influenced by the subbox size: too + * small means too much overhead, too big loses because Heckbert's criterion + * can't eliminate as many colormap entries. Empirically the best subbox + * size seems to be about 1/512th of the histogram (1/8th in each direction). + * + * Thomas' article also describes a refined method which is asymptotically + * faster than the brute-force method, but it is also far more complex and + * cannot efficiently be applied to small subboxes. It is therefore not + * useful for programs intended to be portable to DOS machines. On machines + * with plenty of memory, filling the whole histogram in one shot with Thomas' + * refined method might be faster than the present code --- but then again, + * it might not be any faster, and it's certainly more complicated. + */ + + +/* log2(histogram cells in update box) for each axis; this can be adjusted */ +#define BOX_C0_LOG (HIST_C0_BITS-3) +#define BOX_C1_LOG (HIST_C1_BITS-3) +#define BOX_C2_LOG (HIST_C2_BITS-3) + +#define BOX_C0_ELEMS (1<actual_number_of_colors; + int maxc0, maxc1, maxc2; + int centerc0, centerc1, centerc2; + int i, x, ncolors; + INT32 minmaxdist, min_dist, max_dist, tdist; + INT32 mindist[MAXNUMCOLORS]; /* min distance to colormap entry i */ + + /* Compute true coordinates of update box's upper corner and center. + * Actually we compute the coordinates of the center of the upper-corner + * histogram cell, which are the upper bounds of the volume we care about. + * Note that since ">>" rounds down, the "center" values may be closer to + * min than to max; hence comparisons to them must be "<=", not "<". + */ + maxc0 = minc0 + ((1 << BOX_C0_SHIFT) - (1 << C0_SHIFT)); + centerc0 = (minc0 + maxc0) >> 1; + maxc1 = minc1 + ((1 << BOX_C1_SHIFT) - (1 << C1_SHIFT)); + centerc1 = (minc1 + maxc1) >> 1; + maxc2 = minc2 + ((1 << BOX_C2_SHIFT) - (1 << C2_SHIFT)); + centerc2 = (minc2 + maxc2) >> 1; + + /* For each color in colormap, find: + * 1. its minimum squared-distance to any point in the update box + * (zero if color is within update box); + * 2. its maximum squared-distance to any point in the update box. + * Both of these can be found by considering only the corners of the box. + * We save the minimum distance for each color in mindist[]; + * only the smallest maximum distance is of interest. + */ + minmaxdist = 0x7FFFFFFFL; + + for (i = 0; i < numcolors; i++) { + /* We compute the squared-c0-distance term, then add in the other two. */ + x = GETJSAMPLE(cinfo->colormap[0][i]); + if (x < minc0) { + tdist = (x - minc0) * C0_SCALE; + min_dist = tdist*tdist; + tdist = (x - maxc0) * C0_SCALE; + max_dist = tdist*tdist; + } else if (x > maxc0) { + tdist = (x - maxc0) * C0_SCALE; + min_dist = tdist*tdist; + tdist = (x - minc0) * C0_SCALE; + max_dist = tdist*tdist; + } else { + /* within cell range so no contribution to min_dist */ + min_dist = 0; + if (x <= centerc0) { + tdist = (x - maxc0) * C0_SCALE; + max_dist = tdist*tdist; + } else { + tdist = (x - minc0) * C0_SCALE; + max_dist = tdist*tdist; + } + } + + x = GETJSAMPLE(cinfo->colormap[1][i]); + if (x < minc1) { + tdist = (x - minc1) * C1_SCALE; + min_dist += tdist*tdist; + tdist = (x - maxc1) * C1_SCALE; + max_dist += tdist*tdist; + } else if (x > maxc1) { + tdist = (x - maxc1) * C1_SCALE; + min_dist += tdist*tdist; + tdist = (x - minc1) * C1_SCALE; + max_dist += tdist*tdist; + } else { + /* within cell range so no contribution to min_dist */ + if (x <= centerc1) { + tdist = (x - maxc1) * C1_SCALE; + max_dist += tdist*tdist; + } else { + tdist = (x - minc1) * C1_SCALE; + max_dist += tdist*tdist; + } + } + + x = GETJSAMPLE(cinfo->colormap[2][i]); + if (x < minc2) { + tdist = (x - minc2) * C2_SCALE; + min_dist += tdist*tdist; + tdist = (x - maxc2) * C2_SCALE; + max_dist += tdist*tdist; + } else if (x > maxc2) { + tdist = (x - maxc2) * C2_SCALE; + min_dist += tdist*tdist; + tdist = (x - minc2) * C2_SCALE; + max_dist += tdist*tdist; + } else { + /* within cell range so no contribution to min_dist */ + if (x <= centerc2) { + tdist = (x - maxc2) * C2_SCALE; + max_dist += tdist*tdist; + } else { + tdist = (x - minc2) * C2_SCALE; + max_dist += tdist*tdist; + } + } + + mindist[i] = min_dist; /* save away the results */ + if (max_dist < minmaxdist) + minmaxdist = max_dist; + } + + /* Now we know that no cell in the update box is more than minmaxdist + * away from some colormap entry. Therefore, only colors that are + * within minmaxdist of some part of the box need be considered. + */ + ncolors = 0; + for (i = 0; i < numcolors; i++) { + if (mindist[i] <= minmaxdist) + colorlist[ncolors++] = (JSAMPLE) i; + } + return ncolors; +} + + +static void +find_best_colors (j_decompress_ptr cinfo, int minc0, int minc1, int minc2, + int numcolors, JSAMPLE colorlist[], JSAMPLE bestcolor[]) +/* Find the closest colormap entry for each cell in the update box, + * given the list of candidate colors prepared by find_nearby_colors. + * Return the indexes of the closest entries in the bestcolor[] array. + * This routine uses Thomas' incremental distance calculation method to + * find the distance from a colormap entry to successive cells in the box. + */ +{ + int ic0, ic1, ic2; + int i, icolor; + register INT32 * bptr; /* pointer into bestdist[] array */ + JSAMPLE * cptr; /* pointer into bestcolor[] array */ + INT32 dist0, dist1; /* initial distance values */ + register INT32 dist2; /* current distance in inner loop */ + INT32 xx0, xx1; /* distance increments */ + register INT32 xx2; + INT32 inc0, inc1, inc2; /* initial values for increments */ + /* This array holds the distance to the nearest-so-far color for each cell */ + INT32 bestdist[BOX_C0_ELEMS * BOX_C1_ELEMS * BOX_C2_ELEMS]; + + /* Initialize best-distance for each cell of the update box */ + bptr = bestdist; + for (i = BOX_C0_ELEMS*BOX_C1_ELEMS*BOX_C2_ELEMS-1; i >= 0; i--) + *bptr++ = 0x7FFFFFFFL; + + /* For each color selected by find_nearby_colors, + * compute its distance to the center of each cell in the box. + * If that's less than best-so-far, update best distance and color number. + */ + + /* Nominal steps between cell centers ("x" in Thomas article) */ +#define STEP_C0 ((1 << C0_SHIFT) * C0_SCALE) +#define STEP_C1 ((1 << C1_SHIFT) * C1_SCALE) +#define STEP_C2 ((1 << C2_SHIFT) * C2_SCALE) + + for (i = 0; i < numcolors; i++) { + icolor = GETJSAMPLE(colorlist[i]); + /* Compute (square of) distance from minc0/c1/c2 to this color */ + inc0 = (minc0 - GETJSAMPLE(cinfo->colormap[0][icolor])) * C0_SCALE; + dist0 = inc0*inc0; + inc1 = (minc1 - GETJSAMPLE(cinfo->colormap[1][icolor])) * C1_SCALE; + dist0 += inc1*inc1; + inc2 = (minc2 - GETJSAMPLE(cinfo->colormap[2][icolor])) * C2_SCALE; + dist0 += inc2*inc2; + /* Form the initial difference increments */ + inc0 = inc0 * (2 * STEP_C0) + STEP_C0 * STEP_C0; + inc1 = inc1 * (2 * STEP_C1) + STEP_C1 * STEP_C1; + inc2 = inc2 * (2 * STEP_C2) + STEP_C2 * STEP_C2; + /* Now loop over all cells in box, updating distance per Thomas method */ + bptr = bestdist; + cptr = bestcolor; + xx0 = inc0; + for (ic0 = BOX_C0_ELEMS-1; ic0 >= 0; ic0--) { + dist1 = dist0; + xx1 = inc1; + for (ic1 = BOX_C1_ELEMS-1; ic1 >= 0; ic1--) { + dist2 = dist1; + xx2 = inc2; + for (ic2 = BOX_C2_ELEMS-1; ic2 >= 0; ic2--) { + if (dist2 < *bptr) { + *bptr = dist2; + *cptr = (JSAMPLE) icolor; + } + dist2 += xx2; + xx2 += 2 * STEP_C2 * STEP_C2; + bptr++; + cptr++; + } + dist1 += xx1; + xx1 += 2 * STEP_C1 * STEP_C1; + } + dist0 += xx0; + xx0 += 2 * STEP_C0 * STEP_C0; + } + } +} + + +static void +fill_inverse_cmap (j_decompress_ptr cinfo, int c0, int c1, int c2) +/* Fill the inverse-colormap entries in the update box that contains */ +/* histogram cell c0/c1/c2. (Only that one cell MUST be filled, but */ +/* we can fill as many others as we wish.) */ +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + hist3d histogram = cquantize->histogram; + int minc0, minc1, minc2; /* lower left corner of update box */ + int ic0, ic1, ic2; + register JSAMPLE * cptr; /* pointer into bestcolor[] array */ + register histptr cachep; /* pointer into main cache array */ + /* This array lists the candidate colormap indexes. */ + JSAMPLE colorlist[MAXNUMCOLORS]; + int numcolors; /* number of candidate colors */ + /* This array holds the actually closest colormap index for each cell. */ + JSAMPLE bestcolor[BOX_C0_ELEMS * BOX_C1_ELEMS * BOX_C2_ELEMS]; + + /* Convert cell coordinates to update box ID */ + c0 >>= BOX_C0_LOG; + c1 >>= BOX_C1_LOG; + c2 >>= BOX_C2_LOG; + + /* Compute true coordinates of update box's origin corner. + * Actually we compute the coordinates of the center of the corner + * histogram cell, which are the lower bounds of the volume we care about. + */ + minc0 = (c0 << BOX_C0_SHIFT) + ((1 << C0_SHIFT) >> 1); + minc1 = (c1 << BOX_C1_SHIFT) + ((1 << C1_SHIFT) >> 1); + minc2 = (c2 << BOX_C2_SHIFT) + ((1 << C2_SHIFT) >> 1); + + /* Determine which colormap entries are close enough to be candidates + * for the nearest entry to some cell in the update box. + */ + numcolors = find_nearby_colors(cinfo, minc0, minc1, minc2, colorlist); + + /* Determine the actually nearest colors. */ + find_best_colors(cinfo, minc0, minc1, minc2, numcolors, colorlist, + bestcolor); + + /* Save the best color numbers (plus 1) in the main cache array */ + c0 <<= BOX_C0_LOG; /* convert ID back to base cell indexes */ + c1 <<= BOX_C1_LOG; + c2 <<= BOX_C2_LOG; + cptr = bestcolor; + for (ic0 = 0; ic0 < BOX_C0_ELEMS; ic0++) { + for (ic1 = 0; ic1 < BOX_C1_ELEMS; ic1++) { + cachep = & histogram[c0+ic0][c1+ic1][c2]; + for (ic2 = 0; ic2 < BOX_C2_ELEMS; ic2++) { + *cachep++ = (histcell) (GETJSAMPLE(*cptr++) + 1); + } + } + } +} + + +/* + * Map some rows of pixels to the output colormapped representation. + */ + +void +pass2_no_dither (j_decompress_ptr cinfo, + JSAMPARRAY input_buf, JSAMPARRAY output_buf, int num_rows) +/* This version performs no dithering */ +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + hist3d histogram = cquantize->histogram; + register JSAMPROW inptr, outptr; + register histptr cachep; + register int c0, c1, c2; + int row; + JDIMENSION col; + JDIMENSION width = cinfo->output_width; + + for (row = 0; row < num_rows; row++) { + inptr = input_buf[row]; + outptr = output_buf[row]; + for (col = width; col > 0; col--) { + /* get pixel value and index into the cache */ + c0 = GETJSAMPLE(*inptr++) >> C0_SHIFT; + c1 = GETJSAMPLE(*inptr++) >> C1_SHIFT; + c2 = GETJSAMPLE(*inptr++) >> C2_SHIFT; + cachep = & histogram[c0][c1][c2]; + /* If we have not seen this color before, find nearest colormap entry */ + /* and update the cache */ + if (*cachep == 0) + fill_inverse_cmap(cinfo, c0,c1,c2); + /* Now emit the colormap index for this cell */ + *outptr++ = (JSAMPLE) (*cachep - 1); + } + } +} + + +void +pass2_fs_dither (j_decompress_ptr cinfo, + JSAMPARRAY input_buf, JSAMPARRAY output_buf, int num_rows) +/* This version performs Floyd-Steinberg dithering */ +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + hist3d histogram = cquantize->histogram; + register LOCFSERROR cur0, cur1, cur2; /* current error or pixel value */ + LOCFSERROR belowerr0, belowerr1, belowerr2; /* error for pixel below cur */ + LOCFSERROR bpreverr0, bpreverr1, bpreverr2; /* error for below/prev col */ + register FSERRPTR errorptr; /* => fserrors[] at column before current */ + JSAMPROW inptr; /* => current input pixel */ + JSAMPROW outptr; /* => current output pixel */ + histptr cachep; + int dir; /* +1 or -1 depending on direction */ + int dir3; /* 3*dir, for advancing inptr & errorptr */ + int row; + JDIMENSION col; + JDIMENSION width = cinfo->output_width; + JSAMPLE *range_limit = cinfo->sample_range_limit; + int *error_limit = cquantize->error_limiter; + JSAMPROW colormap0 = cinfo->colormap[0]; + JSAMPROW colormap1 = cinfo->colormap[1]; + JSAMPROW colormap2 = cinfo->colormap[2]; + + + for (row = 0; row < num_rows; row++) { + inptr = input_buf[row]; + outptr = output_buf[row]; + if (cquantize->on_odd_row) { + /* work right to left in this row */ + inptr += (width-1) * 3; /* so point to rightmost pixel */ + outptr += width-1; + dir = -1; + dir3 = -3; + errorptr = cquantize->fserrors + (width+1)*3; /* => entry after last column */ + cquantize->on_odd_row = false; /* flip for next time */ + } else { + /* work left to right in this row */ + dir = 1; + dir3 = 3; + errorptr = cquantize->fserrors; /* => entry before first real column */ + cquantize->on_odd_row = true; /* flip for next time */ + } + /* Preset error values: no error propagated to first pixel from left */ + cur0 = cur1 = cur2 = 0; + /* and no error propagated to row below yet */ + belowerr0 = belowerr1 = belowerr2 = 0; + bpreverr0 = bpreverr1 = bpreverr2 = 0; + + for (col = width; col > 0; col--) { + /* curN holds the error propagated from the previous pixel on the + * current line. Add the error propagated from the previous line + * to form the complete error correction term for this pixel, and + * round the error term (which is expressed * 16) to an integer. + * RIGHT_SHIFT rounds towards minus infinity, so adding 8 is correct + * for either sign of the error value. + * Note: errorptr points to *previous* column's array entry. + */ + cur0 = RIGHT_SHIFT(cur0 + errorptr[dir3+0] + 8, 4); + cur1 = RIGHT_SHIFT(cur1 + errorptr[dir3+1] + 8, 4); + cur2 = RIGHT_SHIFT(cur2 + errorptr[dir3+2] + 8, 4); + /* Limit the error using transfer function set by init_error_limit. + * See comments with init_error_limit for rationale. + */ + cur0 = error_limit[cur0]; + cur1 = error_limit[cur1]; + cur2 = error_limit[cur2]; + /* Form pixel value + error, and range-limit to 0..MAXJSAMPLE. + * The maximum error is +- MAXJSAMPLE (or less with error limiting); + * this sets the required size of the range_limit array. + */ + cur0 += GETJSAMPLE(inptr[0]); + cur1 += GETJSAMPLE(inptr[1]); + cur2 += GETJSAMPLE(inptr[2]); + cur0 = GETJSAMPLE(range_limit[cur0]); + cur1 = GETJSAMPLE(range_limit[cur1]); + cur2 = GETJSAMPLE(range_limit[cur2]); + /* Index into the cache with adjusted pixel value */ + cachep = & histogram[cur0>>C0_SHIFT][cur1>>C1_SHIFT][cur2>>C2_SHIFT]; + /* If we have not seen this color before, find nearest colormap */ + /* entry and update the cache */ + if (*cachep == 0) + fill_inverse_cmap(cinfo, cur0>>C0_SHIFT,cur1>>C1_SHIFT,cur2>>C2_SHIFT); + /* Now emit the colormap index for this cell */ + { register int pixcode = *cachep - 1; + *outptr = (JSAMPLE) pixcode; + /* Compute representation error for this pixel */ + cur0 -= GETJSAMPLE(colormap0[pixcode]); + cur1 -= GETJSAMPLE(colormap1[pixcode]); + cur2 -= GETJSAMPLE(colormap2[pixcode]); + } + /* Compute error fractions to be propagated to adjacent pixels. + * Add these into the running sums, and simultaneously shift the + * next-line error sums left by 1 column. + */ + { register LOCFSERROR bnexterr, delta; + + bnexterr = cur0; /* Process component 0 */ + delta = cur0 * 2; + cur0 += delta; /* form error * 3 */ + errorptr[0] = (FSERROR) (bpreverr0 + cur0); + cur0 += delta; /* form error * 5 */ + bpreverr0 = belowerr0 + cur0; + belowerr0 = bnexterr; + cur0 += delta; /* form error * 7 */ + bnexterr = cur1; /* Process component 1 */ + delta = cur1 * 2; + cur1 += delta; /* form error * 3 */ + errorptr[1] = (FSERROR) (bpreverr1 + cur1); + cur1 += delta; /* form error * 5 */ + bpreverr1 = belowerr1 + cur1; + belowerr1 = bnexterr; + cur1 += delta; /* form error * 7 */ + bnexterr = cur2; /* Process component 2 */ + delta = cur2 * 2; + cur2 += delta; /* form error * 3 */ + errorptr[2] = (FSERROR) (bpreverr2 + cur2); + cur2 += delta; /* form error * 5 */ + bpreverr2 = belowerr2 + cur2; + belowerr2 = bnexterr; + cur2 += delta; /* form error * 7 */ + } + /* At this point curN contains the 7/16 error value to be propagated + * to the next pixel on the current line, and all the errors for the + * next line have been shifted over. We are therefore ready to move on. + */ + inptr += dir3; /* Advance pixel pointers to next column */ + outptr += dir; + errorptr += dir3; /* advance errorptr to current column */ + } + /* Post-loop cleanup: we must unload the final error values into the + * final fserrors[] entry. Note we need not unload belowerrN because + * it is for the dummy column before or after the actual array. + */ + errorptr[0] = (FSERROR) bpreverr0; /* unload prev errs into array */ + errorptr[1] = (FSERROR) bpreverr1; + errorptr[2] = (FSERROR) bpreverr2; + } +} + + +/* + * Initialize the error-limiting transfer function (lookup table). + * The raw F-S error computation can potentially compute error values of up to + * +- MAXJSAMPLE. But we want the maximum correction applied to a pixel to be + * much less, otherwise obviously wrong pixels will be created. (Typical + * effects include weird fringes at color-area boundaries, isolated bright + * pixels in a dark area, etc.) The standard advice for avoiding this problem + * is to ensure that the "corners" of the color cube are allocated as output + * colors; then repeated errors in the same direction cannot cause cascading + * error buildup. However, that only prevents the error from getting + * completely out of hand; Aaron Giles reports that error limiting improves + * the results even with corner colors allocated. + * A simple clamping of the error values to about +- MAXJSAMPLE/8 works pretty + * well, but the smoother transfer function used below is even better. Thanks + * to Aaron Giles for this idea. + */ + +static void +init_error_limit (j_decompress_ptr cinfo) +/* Allocate and fill in the error_limiter table */ +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + int * table; + int in, out; + + table = (int *) malloc((MAXJSAMPLE*2+1) * sizeof(int)); + table += MAXJSAMPLE; /* so can index -MAXJSAMPLE .. +MAXJSAMPLE */ + cquantize->error_limiter = table; + +#define STEPSIZE ((MAXJSAMPLE+1)/16) + /* Map errors 1:1 up to +- MAXJSAMPLE/16 */ + out = 0; + for (in = 0; in < STEPSIZE; in++, out++) { + table[in] = out; table[-in] = -out; + } + /* Map errors 1:2 up to +- 3*MAXJSAMPLE/16 */ + for (; in < STEPSIZE*3; in++, out += (in&1) ? 0 : 1) { + table[in] = out; table[-in] = -out; + } + /* Clamp the rest to final out value (which is (MAXJSAMPLE+1)/8) */ + for (; in <= MAXJSAMPLE; in++) { + table[in] = out; table[-in] = -out; + } +#undef STEPSIZE +} + + +/* + * Finish up at the end of each pass. + */ + +void +finish_pass1 (j_decompress_ptr cinfo) +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + + /* Select the representative colors and fill in cinfo->colormap */ + cinfo->colormap = cquantize->sv_colormap; + select_colors(cinfo, cquantize->desired); + /* Force next pass to zero the color index table */ + cquantize->needs_zeroed = true; +} + + +void +finish_pass2 (j_decompress_ptr WXUNUSED(cinfo)) +{ + /* no work */ +} + + +/* + * Initialize for each processing pass. + */ + +void +start_pass_2_quant (j_decompress_ptr cinfo, bool is_pre_scan) +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + hist3d histogram = cquantize->histogram; + + if (is_pre_scan) { + /* Set up method pointers */ + cquantize->pub.color_quantize = prescan_quantize; + cquantize->pub.finish_pass = finish_pass1; + cquantize->needs_zeroed = true; /* Always zero histogram */ + } else { + /* Set up method pointers */ + cquantize->pub.color_quantize = pass2_fs_dither; + cquantize->pub.finish_pass = finish_pass2; + + { + size_t arraysize = (size_t) ((cinfo->output_width + 2) * + (3 * sizeof(FSERROR))); + /* Allocate Floyd-Steinberg workspace if we didn't already. */ + if (cquantize->fserrors == NULL) + cquantize->fserrors = (INT16*) malloc(arraysize); + /* Initialize the propagated errors to zero. */ + memset((void *) cquantize->fserrors, 0, arraysize); + /* Make the error-limit table if we didn't already. */ + if (cquantize->error_limiter == NULL) + init_error_limit(cinfo); + cquantize->on_odd_row = false; + } + + } + /* Zero the histogram or inverse color map, if necessary */ + if (cquantize->needs_zeroed) { + for (int i = 0; i < HIST_C0_ELEMS; i++) { + memset((void *) histogram[i], 0, + HIST_C1_ELEMS*HIST_C2_ELEMS * sizeof(histcell)); + } + cquantize->needs_zeroed = false; + } +} + + +/* + * Switch to a new external colormap between output passes. + */ + +void +new_color_map_2_quant (j_decompress_ptr cinfo) +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + + /* Reset the inverse color map */ + cquantize->needs_zeroed = true; +} + + +/* + * Module initialization routine for 2-pass color quantization. + */ + +void +jinit_2pass_quantizer (j_decompress_ptr cinfo) +{ + my_cquantize_ptr cquantize; + int i; + + cquantize = (my_cquantize_ptr) malloc(sizeof(my_cquantizer)); + cinfo->cquantize = (jpeg_color_quantizer *) cquantize; + cquantize->pub.start_pass = start_pass_2_quant; + cquantize->pub.new_color_map = new_color_map_2_quant; + cquantize->fserrors = NULL; /* flag optional arrays not allocated */ + cquantize->error_limiter = NULL; + + + /* Allocate the histogram/inverse colormap storage */ + cquantize->histogram = (hist3d) malloc(HIST_C0_ELEMS * sizeof(hist2d)); + for (i = 0; i < HIST_C0_ELEMS; i++) { + cquantize->histogram[i] = (hist2d) malloc(HIST_C1_ELEMS*HIST_C2_ELEMS * sizeof(histcell)); + } + cquantize->needs_zeroed = true; /* histogram is garbage now */ + + /* Allocate storage for the completed colormap, if required. + * We do this now since it is storage and may affect + * the memory manager's space calculations. + */ + { + /* Make sure color count is acceptable */ + int desired = cinfo->desired_number_of_colors; + + cquantize->sv_colormap = (JSAMPARRAY) malloc(sizeof(JSAMPROW) * 3); + cquantize->sv_colormap[0] = (JSAMPROW) malloc(sizeof(JSAMPLE) * desired); + cquantize->sv_colormap[1] = (JSAMPROW) malloc(sizeof(JSAMPLE) * desired); + cquantize->sv_colormap[2] = (JSAMPROW) malloc(sizeof(JSAMPLE) * desired); + + cquantize->desired = desired; + } + + /* Allocate Floyd-Steinberg workspace if necessary. + * This isn't really needed until pass 2, but again it is storage. + * Although we will cope with a later change in dither_mode, + * we do not promise to honor max_memory_to_use if dither_mode changes. + */ + { + cquantize->fserrors = (FSERRPTR) malloc( + (size_t) ((cinfo->output_width + 2) * (3 * sizeof(FSERROR)))); + /* Might as well create the error-limiting table too. */ + init_error_limit(cinfo); + } +} + + + + + + + + + + +void +prepare_range_limit_table (j_decompress_ptr cinfo) +/* Allocate and fill in the sample_range_limit table */ +{ + JSAMPLE * table; + int i; + + table = (JSAMPLE *) malloc((5 * (MAXJSAMPLE+1) + CENTERJSAMPLE) * sizeof(JSAMPLE)); + cinfo->srl_orig = table; + table += (MAXJSAMPLE+1); /* allow negative subscripts of simple table */ + cinfo->sample_range_limit = table; + /* First segment of "simple" table: limit[x] = 0 for x < 0 */ + memset(table - (MAXJSAMPLE+1), 0, (MAXJSAMPLE+1) * sizeof(JSAMPLE)); + /* Main part of "simple" table: limit[x] = x */ + for (i = 0; i <= MAXJSAMPLE; i++) + table[i] = (JSAMPLE) i; + table += CENTERJSAMPLE; /* Point to where post-IDCT table starts */ + /* End of simple table, rest of first half of post-IDCT table */ + for (i = CENTERJSAMPLE; i < 2*(MAXJSAMPLE+1); i++) + table[i] = MAXJSAMPLE; + /* Second half of post-IDCT table */ + memset(table + (2 * (MAXJSAMPLE+1)), 0, + (2 * (MAXJSAMPLE+1) - CENTERJSAMPLE) * sizeof(JSAMPLE)); + memcpy(table + (4 * (MAXJSAMPLE+1) - CENTERJSAMPLE), + cinfo->sample_range_limit, CENTERJSAMPLE * sizeof(JSAMPLE)); +} + + + + +/* + * wxQuantize + */ + +IMPLEMENT_DYNAMIC_CLASS(wxQuantize, wxObject) + +void wxQuantize::DoQuantize(unsigned w, unsigned h, unsigned char **in_rows, unsigned char **out_rows, + unsigned char *palette, int desiredNoColours) +{ + j_decompress dec; + my_cquantize_ptr cquantize; + + dec.output_width = w; + dec.desired_number_of_colors = desiredNoColours; + prepare_range_limit_table(&dec); + jinit_2pass_quantizer(&dec); + cquantize = (my_cquantize_ptr) dec.cquantize; + + + cquantize->pub.start_pass(&dec, true); + cquantize->pub.color_quantize(&dec, in_rows, out_rows, h); + cquantize->pub.finish_pass(&dec); + + cquantize->pub.start_pass(&dec, false); + cquantize->pub.color_quantize(&dec, in_rows, out_rows, h); + cquantize->pub.finish_pass(&dec); + + + for (int i = 0; i < dec.desired_number_of_colors; i++) { + palette[3 * i + 0] = dec.colormap[0][i]; + palette[3 * i + 1] = dec.colormap[1][i]; + palette[3 * i + 2] = dec.colormap[2][i]; + } + + for (int ii = 0; ii < HIST_C0_ELEMS; ii++) free(cquantize->histogram[ii]); + free(cquantize->histogram); + free(dec.colormap[0]); + free(dec.colormap[1]); + free(dec.colormap[2]); + free(dec.colormap); + free(dec.srl_orig); + + //free(cquantize->error_limiter); + free((void*)(cquantize->error_limiter - MAXJSAMPLE)); // To reverse what was done to it + + free(cquantize->fserrors); + free(cquantize); +} + +// TODO: somehow make use of the Windows system colours, rather than ignoring them for the +// purposes of quantization. + +bool wxQuantize::Quantize(const wxImage& src, wxImage& dest, + wxPalette** pPalette, + int desiredNoColours, + unsigned char** eightBitData, + int flags) + +{ + int i; + + int windowsSystemColourCount = 20; + + int paletteShift = 0; + + // Shift the palette up by the number of Windows system colours, + // if necessary + if (flags & wxQUANTIZE_INCLUDE_WINDOWS_COLOURS) + paletteShift = windowsSystemColourCount; + + // Make room for the Windows system colours +#ifdef __WXMSW__ + if ((flags & wxQUANTIZE_INCLUDE_WINDOWS_COLOURS) && (desiredNoColours > (256 - windowsSystemColourCount))) + desiredNoColours = 256 - windowsSystemColourCount; +#endif + + // create rows info: + int h = src.GetHeight(); + int w = src.GetWidth(); + unsigned char **rows = new unsigned char *[h]; + unsigned char *imgdt = src.GetData(); + for (i = 0; i < h; i++) + rows[i] = imgdt + 3/*RGB*/ * w * i; + + unsigned char palette[3*256]; + + // This is the image as represented by palette indexes. + unsigned char *data8bit = new unsigned char[w * h]; + unsigned char **outrows = new unsigned char *[h]; + for (i = 0; i < h; i++) + outrows[i] = data8bit + w * i; + + //RGB->palette + DoQuantize(w, h, rows, outrows, palette, desiredNoColours); + + delete[] rows; + delete[] outrows; + + // palette->RGB(max.256) + + if (flags & wxQUANTIZE_FILL_DESTINATION_IMAGE) + { + if (!dest.Ok()) + dest.Create(w, h); + + imgdt = dest.GetData(); + for (i = 0; i < w * h; i++) + { + unsigned char c = data8bit[i]; + imgdt[3 * i + 0/*R*/] = palette[3 * c + 0]; + imgdt[3 * i + 1/*G*/] = palette[3 * c + 1]; + imgdt[3 * i + 2/*B*/] = palette[3 * c + 2]; + } + } + + if (eightBitData && (flags & wxQUANTIZE_RETURN_8BIT_DATA)) + { +#ifdef __WXMSW__ + if (flags & wxQUANTIZE_INCLUDE_WINDOWS_COLOURS) + { + // We need to shift the palette entries up + // to make room for the Windows system colours. + for (i = 0; i < w * h; i++) + data8bit[i] = (unsigned char)(data8bit[i] + paletteShift); + } +#endif + *eightBitData = data8bit; + } + else + delete[] data8bit; + +#if wxUSE_PALETTE + // Make a wxWidgets palette + if (pPalette) + { + unsigned char* r = new unsigned char[256]; + unsigned char* g = new unsigned char[256]; + unsigned char* b = new unsigned char[256]; + +#ifdef __WXMSW__ + // Fill the first 20 entries with Windows system colours + if (flags & wxQUANTIZE_INCLUDE_WINDOWS_COLOURS) + { + HDC hDC = ::GetDC(NULL); + PALETTEENTRY* entries = new PALETTEENTRY[windowsSystemColourCount]; + ::GetSystemPaletteEntries(hDC, 0, windowsSystemColourCount, entries); + ::ReleaseDC(NULL, hDC); + + for (i = 0; i < windowsSystemColourCount; i++) + { + r[i] = entries[i].peRed; + g[i] = entries[i].peGreen; + b[i] = entries[i].peBlue; + } + delete[] entries; + } +#endif + + for (i = 0; i < desiredNoColours; i++) + { + r[i+paletteShift] = palette[i*3 + 0]; + g[i+paletteShift] = palette[i*3 + 1]; + b[i+paletteShift] = palette[i*3 + 2]; + } + + // Blank out any remaining palette entries + for (i = desiredNoColours+paletteShift; i < 256; i++) + { + r[i] = 0; + g[i] = 0; + b[i] = 0; + } + *pPalette = new wxPalette(256, r, g, b); + delete[] r; + delete[] g; + delete[] b; + } +#endif // wxUSE_PALETTE + + return true; +} + +// This version sets a palette in the destination image so you don't +// have to manage it yourself. + +bool wxQuantize::Quantize(const wxImage& src, + wxImage& dest, + int desiredNoColours, + unsigned char** eightBitData, + int flags) +{ + wxPalette* palette = NULL; + if ( !Quantize(src, dest, & palette, desiredNoColours, eightBitData, flags) ) + return false; + +#if wxUSE_PALETTE + if (palette) + { + dest.SetPalette(* palette); + delete palette; + } +#endif // wxUSE_PALETTE + + return true; +} + +#endif + // wxUSE_IMAGE diff --git a/Externals/wxWidgets/src/common/radiocmn.cpp b/Externals/wxWidgets/src/common/radiocmn.cpp new file mode 100644 index 0000000000..fe26b79537 --- /dev/null +++ b/Externals/wxWidgets/src/common/radiocmn.cpp @@ -0,0 +1,294 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/common/radiocmn.cpp +// Purpose: wxRadioBox methods common to all ports +// Author: Vadim Zeitlin +// Modified by: +// Created: 03.06.01 +// RCS-ID: $Id: radiocmn.cpp 39676 2006-06-11 21:13:13Z VZ $ +// Copyright: (c) 2001 Vadim Zeitlin +// License: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_RADIOBOX + +#ifndef WX_PRECOMP + #include "wx/radiobox.h" +#endif //WX_PRECOMP + +#if wxUSE_TOOLTIPS + #include "wx/tooltip.h" +#endif // wxUSE_TOOLTIPS + +#if wxUSE_HELP + #include "wx/cshelp.h" +#endif + +// ============================================================================ +// implementation +// ============================================================================ + +void wxRadioBoxBase::SetMajorDim(unsigned int majorDim, long style) +{ + wxCHECK_RET( majorDim != 0, _T("major radiobox dimension can't be 0") ); + + m_majorDim = majorDim; + + int minorDim = (GetCount() + m_majorDim - 1) / m_majorDim; + + if ( style & wxRA_SPECIFY_COLS ) + { + m_numCols = majorDim; + m_numRows = minorDim; + } + else // wxRA_SPECIFY_ROWS + { + m_numCols = minorDim; + m_numRows = majorDim; + } +} + +int wxRadioBoxBase::GetNextItem(int item, wxDirection dir, long style) const +{ + int count = GetCount(), + numCols = GetColumnCount(), + numRows = GetRowCount(); + + bool horz = (style & wxRA_SPECIFY_COLS) != 0; + + switch ( dir ) + { + case wxUP: + if ( horz ) + { + item -= numCols; + } + else // vertical layout + { + if ( !item-- ) + item = count - 1; + } + break; + + case wxLEFT: + if ( horz ) + { + if ( !item-- ) + item = count - 1; + } + else // vertical layout + { + item -= numRows; + } + break; + + case wxDOWN: + if ( horz ) + { + item += numCols; + } + else // vertical layout + { + if ( ++item == count ) + item = 0; + } + break; + + case wxRIGHT: + if ( horz ) + { + if ( ++item == count ) + item = 0; + } + else // vertical layout + { + item += numRows; + } + break; + + default: + wxFAIL_MSG( _T("unexpected wxDirection value") ); + return wxNOT_FOUND; + } + + // ensure that the item is in range [0..count) + if ( item < 0 ) + { + // first map the item to the one in the same column but in the last row + item += count; + + // now there are 2 cases: either it is the first item of the last row + // in which case we need to wrap again and get to the last item or we + // can just go to the previous item + if ( item % (horz ? numCols : numRows) ) + item--; + else + item = count - 1; + } + else if ( item >= count ) + { + // same logic as above + item -= count; + + // ... except that we need to check if this is not the last item, not + // the first one + if ( (item + 1) % (horz ? numCols : numRows) ) + item++; + else + item = 0; + } + + wxASSERT_MSG( item < count && item >= 0, + _T("logic error in wxRadioBox::GetNextItem()") ); + + return item; +} + +#if wxUSE_TOOLTIPS + +void wxRadioBoxBase::SetItemToolTip(unsigned int item, const wxString& text) +{ + wxASSERT_MSG( item < GetCount(), _T("Invalid item index") ); + + // extend the array to have entries for all our items on first use + if ( !m_itemsTooltips ) + { + m_itemsTooltips = new wxToolTipArray; + m_itemsTooltips->resize(GetCount()); + } + + wxToolTip *tooltip = (*m_itemsTooltips)[item]; + + bool changed = true; + if ( text.empty() ) + { + if ( tooltip ) + { + // delete the tooltip + delete tooltip; + tooltip = NULL; + } + else // nothing to do + { + changed = false; + } + } + else // non empty tooltip text + { + if ( tooltip ) + { + // just change the existing tooltip text, don't change the tooltip + tooltip->SetTip(text); + changed = false; + } + else // no tooltip yet + { + // create the new one + tooltip = new wxToolTip(text); + } + } + + if ( changed ) + { + (*m_itemsTooltips)[item] = tooltip; + DoSetItemToolTip(item, tooltip); + } +} + +void +wxRadioBoxBase::DoSetItemToolTip(unsigned int WXUNUSED(item), + wxToolTip * WXUNUSED(tooltip)) +{ + // per-item tooltips not implemented by default +} + +#endif // wxUSE_TOOLTIPS + +wxRadioBoxBase::~wxRadioBoxBase() +{ +#if wxUSE_TOOLTIPS + if ( m_itemsTooltips ) + { + const size_t n = m_itemsTooltips->size(); + for ( size_t i = 0; i < n; i++ ) + delete (*m_itemsTooltips)[i]; + + delete m_itemsTooltips; + } +#endif // wxUSE_TOOLTIPS +} + +#if wxUSE_HELP + +// set helptext for a particular item +void wxRadioBoxBase::SetItemHelpText(unsigned int n, const wxString& helpText) +{ + wxCHECK_RET( n < GetCount(), _T("Invalid item index") ); + + if ( m_itemsHelpTexts.empty() ) + { + // once-only initialization of the array: reserve space for all items + m_itemsHelpTexts.Add(wxEmptyString, GetCount()); + } + + m_itemsHelpTexts[n] = helpText; +} + +// retrieve helptext for a particular item +wxString wxRadioBoxBase::GetItemHelpText( unsigned int n ) const +{ + wxCHECK_MSG( n < GetCount(), wxEmptyString, _T("Invalid item index") ); + + return m_itemsHelpTexts.empty() ? wxString() : m_itemsHelpTexts[n]; +} + +// return help text for the item for which wxEVT_HELP was generated. +wxString wxRadioBoxBase::DoGetHelpTextAtPoint(const wxWindow *derived, + const wxPoint& pt, + wxHelpEvent::Origin origin) const +{ + const int item = origin == wxHelpEvent::Origin_HelpButton + ? GetItemFromPoint(pt) + : GetSelection(); + + if ( item != wxNOT_FOUND ) + { + wxString text = GetItemHelpText(wx_static_cast(unsigned int, item)); + if( !text.empty() ) + return text; + } + + return derived->wxWindowBase::GetHelpTextAtPoint(pt, origin); +} + +#endif // wxUSE_HELP + +#if WXWIN_COMPATIBILITY_2_4 + +// these functions are deprecated and don't do anything +int wxRadioBoxBase::GetNumberOfRowsOrCols() const +{ + return 1; +} + +void wxRadioBoxBase::SetNumberOfRowsOrCols(int WXUNUSED(n)) +{ +} + +#endif // WXWIN_COMPATIBILITY_2_4 + +#endif // wxUSE_RADIOBOX diff --git a/Externals/wxWidgets/src/common/regex.cpp b/Externals/wxWidgets/src/common/regex.cpp new file mode 100644 index 0000000000..4eea090b99 --- /dev/null +++ b/Externals/wxWidgets/src/common/regex.cpp @@ -0,0 +1,686 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/common/regex.cpp +// Purpose: regular expression matching +// Author: Karsten Ballüder and Vadim Zeitlin +// Modified by: +// Created: 13.07.01 +// RCS-ID: $Id: regex.cpp 36271 2005-11-27 18:12:37Z MW $ +// Copyright: (c) 2000 Karsten Ballüder +// 2001 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_REGEX + +#ifndef WX_PRECOMP + #include "wx/object.h" + #include "wx/string.h" + #include "wx/log.h" + #include "wx/intl.h" +#endif //WX_PRECOMP + +// FreeBSD, Watcom and DMars require this, CW doesn't have nor need it. +// Others also don't seem to need it. If you have an error related to +// (not) including please report details to +// wx-dev@lists.wxwindows.org +#if defined(__UNIX__) || defined(__WATCOMC__) || defined(__DIGITALMARS__) +# include +#endif + +#include +#include "wx/regex.h" + +// WXREGEX_USING_BUILTIN defined when using the built-in regex lib +// WXREGEX_USING_RE_SEARCH defined when using re_search in the GNU regex lib +// WXREGEX_IF_NEED_LEN() wrap the len parameter only used with the built-in +// or GNU regex +// WXREGEX_CONVERT_TO_MB defined when the regex lib is using chars and +// wxChar is wide, so conversion must be done +// WXREGEX_CHAR(x) Convert wxChar to wxRegChar +// +#ifdef __REG_NOFRONT +# define WXREGEX_USING_BUILTIN +# define WXREGEX_IF_NEED_LEN(x) ,x +# define WXREGEX_CHAR(x) x +#else +# ifdef HAVE_RE_SEARCH +# define WXREGEX_IF_NEED_LEN(x) ,x +# define WXREGEX_USING_RE_SEARCH +# else +# define WXREGEX_IF_NEED_LEN(x) +# endif +# if wxUSE_UNICODE +# define WXREGEX_CONVERT_TO_MB +# endif +# define WXREGEX_CHAR(x) wxConvertWX2MB(x) +# define wx_regfree regfree +# define wx_regerror regerror +#endif + +// ---------------------------------------------------------------------------- +// private classes +// ---------------------------------------------------------------------------- + +#ifndef WXREGEX_USING_RE_SEARCH + +// the array of offsets for the matches, the usual POSIX regmatch_t array. +class wxRegExMatches +{ +public: + typedef regmatch_t *match_type; + + wxRegExMatches(size_t n) { m_matches = new regmatch_t[n]; } + ~wxRegExMatches() { delete [] m_matches; } + + // we just use casts here because the fields of regmatch_t struct may be 64 + // bit but we're limited to size_t in our public API and are not going to + // change it because operating on strings longer than 4GB using it is + // absolutely impractical anyhow + size_t Start(size_t n) const + { + return wx_truncate_cast(size_t, m_matches[n].rm_so); + } + + size_t End(size_t n) const + { + return wx_truncate_cast(size_t, m_matches[n].rm_eo); + } + + regmatch_t *get() const { return m_matches; } + +private: + regmatch_t *m_matches; +}; + +#else // WXREGEX_USING_RE_SEARCH + +// the array of offsets for the matches, the struct used by the GNU lib +class wxRegExMatches +{ +public: + typedef re_registers *match_type; + + wxRegExMatches(size_t n) + { + m_matches.num_regs = n; + m_matches.start = new regoff_t[n]; + m_matches.end = new regoff_t[n]; + } + + ~wxRegExMatches() + { + delete [] m_matches.start; + delete [] m_matches.end; + } + + size_t Start(size_t n) const { return m_matches.start[n]; } + size_t End(size_t n) const { return m_matches.end[n]; } + + re_registers *get() { return &m_matches; } + +private: + re_registers m_matches; +}; + +#endif // WXREGEX_USING_RE_SEARCH + +// the character type used by the regular expression engine +#ifndef WXREGEX_CONVERT_TO_MB +typedef wxChar wxRegChar; +#else +typedef char wxRegChar; +#endif + +// the real implementation of wxRegEx +class wxRegExImpl +{ +public: + // ctor and dtor + wxRegExImpl(); + ~wxRegExImpl(); + + // return true if Compile() had been called successfully + bool IsValid() const { return m_isCompiled; } + + // RE operations + bool Compile(const wxString& expr, int flags = 0); + bool Matches(const wxRegChar *str, int flags + WXREGEX_IF_NEED_LEN(size_t len)) const; + bool GetMatch(size_t *start, size_t *len, size_t index = 0) const; + size_t GetMatchCount() const; + int Replace(wxString *pattern, const wxString& replacement, + size_t maxMatches = 0) const; + +private: + // return the string containing the error message for the given err code + wxString GetErrorMsg(int errorcode, bool badconv) const; + + // init the members + void Init() + { + m_isCompiled = false; + m_Matches = NULL; + m_nMatches = 0; + } + + // free the RE if compiled + void Free() + { + if ( IsValid() ) + { + wx_regfree(&m_RegEx); + } + + delete m_Matches; + } + + // free the RE if any and reinit the members + void Reinit() + { + Free(); + Init(); + } + + // compiled RE + regex_t m_RegEx; + + // the subexpressions data + wxRegExMatches *m_Matches; + size_t m_nMatches; + + // true if m_RegEx is valid + bool m_isCompiled; +}; + + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxRegExImpl +// ---------------------------------------------------------------------------- + +wxRegExImpl::wxRegExImpl() +{ + Init(); +} + +wxRegExImpl::~wxRegExImpl() +{ + Free(); +} + +wxString wxRegExImpl::GetErrorMsg(int errorcode, bool badconv) const +{ +#ifdef WXREGEX_CONVERT_TO_MB + // currently only needed when using system library in Unicode mode + if ( badconv ) + { + return _("conversion to 8-bit encoding failed"); + } +#else + // 'use' badconv to avoid a compiler warning + (void)badconv; +#endif + + wxString szError; + + // first get the string length needed + int len = wx_regerror(errorcode, &m_RegEx, NULL, 0); + if ( len > 0 ) + { + char* szcmbError = new char[++len]; + + (void)wx_regerror(errorcode, &m_RegEx, szcmbError, len); + + szError = wxConvertMB2WX(szcmbError); + delete [] szcmbError; + } + else // regerror() returned 0 + { + szError = _("unknown error"); + } + + return szError; +} + +bool wxRegExImpl::Compile(const wxString& expr, int flags) +{ + Reinit(); + +#ifdef WX_NO_REGEX_ADVANCED +# define FLAVORS wxRE_BASIC +#else +# define FLAVORS (wxRE_ADVANCED | wxRE_BASIC) + wxASSERT_MSG( (flags & FLAVORS) != FLAVORS, + _T("incompatible flags in wxRegEx::Compile") ); +#endif + wxASSERT_MSG( !(flags & ~(FLAVORS | wxRE_ICASE | wxRE_NOSUB | wxRE_NEWLINE)), + _T("unrecognized flags in wxRegEx::Compile") ); + + // translate our flags to regcomp() ones + int flagsRE = 0; + if ( !(flags & wxRE_BASIC) ) +#ifndef WX_NO_REGEX_ADVANCED + if (flags & wxRE_ADVANCED) + flagsRE |= REG_ADVANCED; + else +#endif + flagsRE |= REG_EXTENDED; + if ( flags & wxRE_ICASE ) + flagsRE |= REG_ICASE; + if ( flags & wxRE_NOSUB ) + flagsRE |= REG_NOSUB; + if ( flags & wxRE_NEWLINE ) + flagsRE |= REG_NEWLINE; + + // compile it +#ifdef WXREGEX_USING_BUILTIN + bool conv = true; + int errorcode = wx_re_comp(&m_RegEx, expr, expr.length(), flagsRE); +#else + const wxWX2MBbuf conv = expr.mbc_str(); + int errorcode = conv ? regcomp(&m_RegEx, conv, flagsRE) : REG_BADPAT; +#endif + + if ( errorcode ) + { + wxLogError(_("Invalid regular expression '%s': %s"), + expr.c_str(), GetErrorMsg(errorcode, !conv).c_str()); + + m_isCompiled = false; + } + else // ok + { + // don't allocate the matches array now, but do it later if necessary + if ( flags & wxRE_NOSUB ) + { + // we don't need it at all + m_nMatches = 0; + } + else + { + // we will alloc the array later (only if really needed) but count + // the number of sub-expressions in the regex right now + + // there is always one for the whole expression + m_nMatches = 1; + + // and some more for bracketed subexperessions + for ( const wxChar *cptr = expr.c_str(); *cptr; cptr++ ) + { + if ( *cptr == _T('\\') ) + { + // in basic RE syntax groups are inside \(...\) + if ( *++cptr == _T('(') && (flags & wxRE_BASIC) ) + { + m_nMatches++; + } + } + else if ( *cptr == _T('(') && !(flags & wxRE_BASIC) ) + { + // we know that the previous character is not an unquoted + // backslash because it would have been eaten above, so we + // have a bare '(' and this indicates a group start for the + // extended syntax. '(?' is used for extensions by perl- + // like REs (e.g. advanced), and is not valid for POSIX + // extended, so ignore them always. + if ( cptr[1] != _T('?') ) + m_nMatches++; + } + } + } + + m_isCompiled = true; + } + + return IsValid(); +} + +#ifdef WXREGEX_USING_RE_SEARCH + +// On GNU, regexec is implemented as a wrapper around re_search. re_search +// requires a length parameter which the POSIX regexec does not have, +// therefore regexec must do a strlen on the search text each time it is +// called. This can drastically affect performance when matching is done in +// a loop along a string, such as during a search and replace. Therefore if +// re_search is detected by configure, it is used directly. +// +static int ReSearch(const regex_t *preg, + const char *text, + size_t len, + re_registers *matches, + int eflags) +{ + regex_t *pattern = wx_const_cast(regex_t*, preg); + + pattern->not_bol = (eflags & REG_NOTBOL) != 0; + pattern->not_eol = (eflags & REG_NOTEOL) != 0; + pattern->regs_allocated = REGS_FIXED; + + int ret = re_search(pattern, text, len, 0, len, matches); + return ret >= 0 ? 0 : REG_NOMATCH; +} + +#endif // WXREGEX_USING_RE_SEARCH + +bool wxRegExImpl::Matches(const wxRegChar *str, + int flags + WXREGEX_IF_NEED_LEN(size_t len)) const +{ + wxCHECK_MSG( IsValid(), false, _T("must successfully Compile() first") ); + + // translate our flags to regexec() ones + wxASSERT_MSG( !(flags & ~(wxRE_NOTBOL | wxRE_NOTEOL)), + _T("unrecognized flags in wxRegEx::Matches") ); + + int flagsRE = 0; + if ( flags & wxRE_NOTBOL ) + flagsRE |= REG_NOTBOL; + if ( flags & wxRE_NOTEOL ) + flagsRE |= REG_NOTEOL; + + // allocate matches array if needed + wxRegExImpl *self = wxConstCast(this, wxRegExImpl); + if ( !m_Matches && m_nMatches ) + { + self->m_Matches = new wxRegExMatches(m_nMatches); + } + + wxRegExMatches::match_type matches = m_Matches ? m_Matches->get() : NULL; + + // do match it +#if defined WXREGEX_USING_BUILTIN + int rc = wx_re_exec(&self->m_RegEx, str, len, NULL, m_nMatches, matches, flagsRE); +#elif defined WXREGEX_USING_RE_SEARCH + int rc = str ? ReSearch(&self->m_RegEx, str, len, matches, flagsRE) : REG_BADPAT; +#else + int rc = str ? regexec(&self->m_RegEx, str, m_nMatches, matches, flagsRE) : REG_BADPAT; +#endif + + switch ( rc ) + { + case 0: + // matched successfully + return true; + + default: + // an error occurred + wxLogError(_("Failed to find match for regular expression: %s"), + GetErrorMsg(rc, !str).c_str()); + // fall through + + case REG_NOMATCH: + // no match + return false; + } +} + +bool wxRegExImpl::GetMatch(size_t *start, size_t *len, size_t index) const +{ + wxCHECK_MSG( IsValid(), false, _T("must successfully Compile() first") ); + wxCHECK_MSG( m_nMatches, false, _T("can't use with wxRE_NOSUB") ); + wxCHECK_MSG( m_Matches, false, _T("must call Matches() first") ); + wxCHECK_MSG( index < m_nMatches, false, _T("invalid match index") ); + + if ( start ) + *start = m_Matches->Start(index); + if ( len ) + *len = m_Matches->End(index) - m_Matches->Start(index); + + return true; +} + +size_t wxRegExImpl::GetMatchCount() const +{ + wxCHECK_MSG( IsValid(), 0, _T("must successfully Compile() first") ); + wxCHECK_MSG( m_nMatches, 0, _T("can't use with wxRE_NOSUB") ); + + return m_nMatches; +} + +int wxRegExImpl::Replace(wxString *text, + const wxString& replacement, + size_t maxMatches) const +{ + wxCHECK_MSG( text, wxNOT_FOUND, _T("NULL text in wxRegEx::Replace") ); + wxCHECK_MSG( IsValid(), wxNOT_FOUND, _T("must successfully Compile() first") ); + + // the input string +#ifndef WXREGEX_CONVERT_TO_MB + const wxChar *textstr = text->c_str(); + size_t textlen = text->length(); +#else + const wxWX2MBbuf textstr = WXREGEX_CHAR(*text); + if (!textstr) + { + wxLogError(_("Failed to find match for regular expression: %s"), + GetErrorMsg(0, true).c_str()); + return 0; + } + size_t textlen = strlen(textstr); + text->clear(); +#endif + + // the replacement text + wxString textNew; + + // the result, allow 25% extra + wxString result; + result.reserve(5 * textlen / 4); + + // attempt at optimization: don't iterate over the string if it doesn't + // contain back references at all + bool mayHaveBackrefs = + replacement.find_first_of(_T("\\&")) != wxString::npos; + + if ( !mayHaveBackrefs ) + { + textNew = replacement; + } + + // the position where we start looking for the match + size_t matchStart = 0; + + // number of replacement made: we won't make more than maxMatches of them + // (unless maxMatches is 0 which doesn't limit the number of replacements) + size_t countRepl = 0; + + // note that "^" shouldn't match after the first call to Matches() so we + // use wxRE_NOTBOL to prevent it from happening + while ( (!maxMatches || countRepl < maxMatches) && + Matches(textstr + matchStart, + countRepl ? wxRE_NOTBOL : 0 + WXREGEX_IF_NEED_LEN(textlen - matchStart)) ) + { + // the string possibly contains back references: we need to calculate + // the replacement text anew after each match + if ( mayHaveBackrefs ) + { + mayHaveBackrefs = false; + textNew.clear(); + textNew.reserve(replacement.length()); + + for ( const wxChar *p = replacement.c_str(); *p; p++ ) + { + size_t index = (size_t)-1; + + if ( *p == _T('\\') ) + { + if ( wxIsdigit(*++p) ) + { + // back reference + wxChar *end; + index = (size_t)wxStrtoul(p, &end, 10); + p = end - 1; // -1 to compensate for p++ in the loop + } + //else: backslash used as escape character + } + else if ( *p == _T('&') ) + { + // treat this as "\0" for compatbility with ed and such + index = 0; + } + + // do we have a back reference? + if ( index != (size_t)-1 ) + { + // yes, get its text + size_t start, len; + if ( !GetMatch(&start, &len, index) ) + { + wxFAIL_MSG( _T("invalid back reference") ); + + // just eat it... + } + else + { + textNew += wxString(textstr + matchStart + start, + *wxConvCurrent, len); + + mayHaveBackrefs = true; + } + } + else // ordinary character + { + textNew += *p; + } + } + } + + size_t start, len; + if ( !GetMatch(&start, &len) ) + { + // we did have match as Matches() returned true above! + wxFAIL_MSG( _T("internal logic error in wxRegEx::Replace") ); + + return wxNOT_FOUND; + } + + // an insurance against implementations that don't grow exponentially + // to ensure building the result takes linear time + if (result.capacity() < result.length() + start + textNew.length()) + result.reserve(2 * result.length()); + +#ifndef WXREGEX_CONVERT_TO_MB + result.append(*text, matchStart, start); +#else + result.append(wxString(textstr + matchStart, *wxConvCurrent, start)); +#endif + matchStart += start; + result.append(textNew); + + countRepl++; + + matchStart += len; + } + +#ifndef WXREGEX_CONVERT_TO_MB + result.append(*text, matchStart, wxString::npos); +#else + result.append(wxString(textstr + matchStart, *wxConvCurrent)); +#endif + *text = result; + + return countRepl; +} + +// ---------------------------------------------------------------------------- +// wxRegEx: all methods are mostly forwarded to wxRegExImpl +// ---------------------------------------------------------------------------- + +void wxRegEx::Init() +{ + m_impl = NULL; +} + +wxRegEx::~wxRegEx() +{ + delete m_impl; +} + +bool wxRegEx::Compile(const wxString& expr, int flags) +{ + if ( !m_impl ) + { + m_impl = new wxRegExImpl; + } + + if ( !m_impl->Compile(expr, flags) ) + { + // error message already given in wxRegExImpl::Compile + delete m_impl; + m_impl = NULL; + + return false; + } + + return true; +} + +bool wxRegEx::Matches(const wxChar *str, int flags, size_t len) const +{ + wxCHECK_MSG( IsValid(), false, _T("must successfully Compile() first") ); + (void)len; + + return m_impl->Matches(WXREGEX_CHAR(str), flags WXREGEX_IF_NEED_LEN(len)); +} + +bool wxRegEx::Matches(const wxChar *str, int flags) const +{ + wxCHECK_MSG( IsValid(), false, _T("must successfully Compile() first") ); + + return m_impl->Matches(WXREGEX_CHAR(str), + flags + WXREGEX_IF_NEED_LEN(wxStrlen(str))); +} + +bool wxRegEx::GetMatch(size_t *start, size_t *len, size_t index) const +{ + wxCHECK_MSG( IsValid(), false, _T("must successfully Compile() first") ); + + return m_impl->GetMatch(start, len, index); +} + +wxString wxRegEx::GetMatch(const wxString& text, size_t index) const +{ + size_t start, len; + if ( !GetMatch(&start, &len, index) ) + return wxEmptyString; + + return text.Mid(start, len); +} + +size_t wxRegEx::GetMatchCount() const +{ + wxCHECK_MSG( IsValid(), 0, _T("must successfully Compile() first") ); + + return m_impl->GetMatchCount(); +} + +int wxRegEx::Replace(wxString *pattern, + const wxString& replacement, + size_t maxMatches) const +{ + wxCHECK_MSG( IsValid(), wxNOT_FOUND, _T("must successfully Compile() first") ); + + return m_impl->Replace(pattern, replacement, maxMatches); +} + +#endif // wxUSE_REGEX diff --git a/Externals/wxWidgets/src/common/rendcmn.cpp b/Externals/wxWidgets/src/common/rendcmn.cpp new file mode 100644 index 0000000000..9d77c390be --- /dev/null +++ b/Externals/wxWidgets/src/common/rendcmn.cpp @@ -0,0 +1,208 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/common/rendcmn.cpp +// Purpose: wxRendererNative common functions +// Author: Vadim Zeitlin +// Modified by: +// Created: 28.07.03 +// RCS-ID: $Id: rendcmn.cpp 41216 2006-09-14 16:04:18Z ABX $ +// Copyright: (c) 2003 Vadim Zeitlin +// License: wxWindows license +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#ifndef WX_PRECOMP + #include "wx/app.h" + #include "wx/log.h" + #include "wx/intl.h" +#endif //WX_PRECOMP + +#include "wx/apptrait.h" +#include "wx/renderer.h" + +#include "wx/ptr_scpd.h" + +#if wxUSE_DYNLIB_CLASS + #include "wx/dynlib.h" +#endif // wxUSE_DYNLIB_CLASS + +// ---------------------------------------------------------------------------- +// wxRendererPtr: auto pointer holding the global renderer +// ---------------------------------------------------------------------------- + +wxDECLARE_SCOPED_PTR(wxRendererNative, wxRendererPtrBase) +wxDEFINE_SCOPED_PTR(wxRendererNative, wxRendererPtrBase) + +class wxRendererPtr : public wxRendererPtrBase +{ +public: + // return true if we have a renderer, false otherwise + bool IsOk() + { + if ( !m_initialized ) + { + // only try to create the renderer once + m_initialized = true; + + DoInit(); + } + + return get() != NULL; + } + + // return the global and unique wxRendererPtr + static wxRendererPtr& Get(); + +private: + wxRendererPtr() : wxRendererPtrBase(NULL) { m_initialized = false; } + + void DoInit() + { + wxAppTraits *traits = wxTheApp ? wxTheApp->GetTraits() : NULL; + if ( traits ) + { + // ask the traits object to create a renderer for us + reset(traits->CreateRenderer()); + } + } + + bool m_initialized; + + // just to suppress a gcc warning + friend class wxRendererPtrDummyFriend; + + DECLARE_NO_COPY_CLASS(wxRendererPtr) +}; + +// return the global and unique wxRendererPtr +/*static*/ wxRendererPtr& wxRendererPtr::Get() +{ + static wxRendererPtr s_renderer; + + return s_renderer; +} + +#if wxUSE_DYNLIB_CLASS + +// ---------------------------------------------------------------------------- +// wxRendererFromDynLib: represents a renderer dynamically loaded from a DLL +// ---------------------------------------------------------------------------- + +class wxRendererFromDynLib : public wxDelegateRendererNative +{ +public: + // create the object wrapping the given renderer created from this DLL + // + // we take ownership of the pointer and will delete it (and also unload the + // DLL) when we're deleted + wxRendererFromDynLib(wxDynamicLibrary& dll, wxRendererNative *renderer) + : wxDelegateRendererNative(*renderer), + m_renderer(renderer), + m_dllHandle(dll.Detach()) + { + } + + virtual ~wxRendererFromDynLib() + { + delete m_renderer; + wxDynamicLibrary::Unload(m_dllHandle); + } + +private: + wxRendererNative *m_renderer; + wxDllType m_dllHandle; +}; + +#endif // wxUSE_DYNLIB_CLASS + +// ============================================================================ +// wxRendererNative implementation +// ============================================================================ + +wxRendererNative::~wxRendererNative() +{ + // empty but necessary +} + +// ---------------------------------------------------------------------------- +// Managing the global renderer +// ---------------------------------------------------------------------------- + +/* static */ +wxRendererNative& wxRendererNative::Get() +{ + wxRendererPtr& renderer = wxRendererPtr::Get(); + + return renderer.IsOk() ? *renderer.get() : GetDefault(); +} + +/* static */ +wxRendererNative *wxRendererNative::Set(wxRendererNative *rendererNew) +{ + wxRendererPtr& renderer = wxRendererPtr::Get(); + + wxRendererNative *rendererOld = renderer.release(); + + renderer.reset(rendererNew); + + return rendererOld; +} + + +// ---------------------------------------------------------------------------- +// Dynamic renderers loading +// ---------------------------------------------------------------------------- + +#if wxUSE_DYNLIB_CLASS + +/* static */ +wxRendererNative *wxRendererNative::Load(const wxString& name) +{ + wxString fullname = wxDynamicLibrary::CanonicalizePluginName(name); + + wxDynamicLibrary dll(fullname); + if ( !dll.IsLoaded() ) + return NULL; + + // each theme DLL must export a wxCreateRenderer() function with this + // signature + typedef wxRendererNative *(*wxCreateRenderer_t)(); + + wxDYNLIB_FUNCTION(wxCreateRenderer_t, wxCreateRenderer, dll); + if ( !pfnwxCreateRenderer ) + return NULL; + + // create a renderer object + wxRendererNative *renderer = (*pfnwxCreateRenderer)(); + if ( !renderer ) + return NULL; + + // check that its version is compatible with ours + wxRendererVersion ver = renderer->GetVersion(); + if ( !wxRendererVersion::IsCompatible(ver) ) + { + wxLogError(_("Renderer \"%s\" has incompatible version %d.%d and couldn't be loaded."), + name.c_str(), ver.version, ver.age); + delete renderer; + + return NULL; + } + + // finally wrap the renderer in an object which will delete it and unload + // the library when it is deleted and return it to the caller + return new wxRendererFromDynLib(dll, renderer); +} + +#endif // wxUSE_DYNLIB_CLASS diff --git a/Externals/wxWidgets/src/common/rgncmn.cpp b/Externals/wxWidgets/src/common/rgncmn.cpp new file mode 100644 index 0000000000..ca5ff249d3 --- /dev/null +++ b/Externals/wxWidgets/src/common/rgncmn.cpp @@ -0,0 +1,192 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/rgncmn.cpp +// Purpose: Methods of wxRegion that have a generic implementation +// Author: Robin Dunn +// Modified by: +// Created: 27-Mar-2003 +// RCS-ID: $Id: rgncmn.cpp 41901 2006-10-10 17:33:49Z PC $ +// Copyright: (c) Robin Dunn +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#include "wx/region.h" + +#ifndef WX_PRECOMP + #include "wx/dcmemory.h" + #include "wx/bitmap.h" + #include "wx/image.h" +#endif //WX_PRECOMP + +// ============================================================================ +// wxRegionBase implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// region comparision +// ---------------------------------------------------------------------------- + +bool wxRegionBase::IsEqual(const wxRegion& region) const +{ + if ( m_refData == region.GetRefData() ) + { + // regions are identical, hence equal + return true; + } + + if ( !m_refData || !region.GetRefData() ) + { + // one, but not both, of the regions is invalid + return false; + } + + return DoIsEqual(region); +} + +// ---------------------------------------------------------------------------- +// region to/from bitmap conversions +// ---------------------------------------------------------------------------- + +wxBitmap wxRegionBase::ConvertToBitmap() const +{ + wxRect box = GetBox(); + wxBitmap bmp(box.GetRight(), box.GetBottom()); + wxMemoryDC dc; + dc.SelectObject(bmp); + dc.SetBackground(*wxBLACK_BRUSH); + dc.Clear(); + dc.SetClippingRegion(*wx_static_cast(const wxRegion *, this)); + dc.SetBackground(*wxWHITE_BRUSH); + dc.Clear(); + dc.SelectObject(wxNullBitmap); + return bmp; +} + +#if wxUSE_IMAGE + +static bool DoRegionUnion(wxRegionBase& region, + const wxImage& image, + unsigned char loR, + unsigned char loG, + unsigned char loB, + int tolerance) +{ + unsigned char hiR, hiG, hiB; + + hiR = (unsigned char)wxMin(0xFF, loR + tolerance); + hiG = (unsigned char)wxMin(0xFF, loG + tolerance); + hiB = (unsigned char)wxMin(0xFF, loB + tolerance); + + // Loop through the image row by row, pixel by pixel, building up + // rectangles to add to the region. + int width = image.GetWidth(); + int height = image.GetHeight(); + for (int y=0; y < height; y++) + { + wxRect rect; + rect.y = y; + rect.height = 1; + + for (int x=0; x < width; x++) + { + // search for a continuous range of non-transparent pixels + int x0 = x; + while ( x < width) + { + unsigned char R = image.GetRed(x,y); + unsigned char G = image.GetGreen(x,y); + unsigned char B = image.GetBlue(x,y); + if (( R >= loR && R <= hiR) && + ( G >= loG && G <= hiG) && + ( B >= loB && B <= hiB)) // It's transparent + break; + x++; + } + + // Add the run of non-transparent pixels (if any) to the region + if (x > x0) { + rect.x = x0; + rect.width = x - x0; + region.Union(rect); + } + } + } + + return true; +} + + +bool wxRegionBase::Union(const wxBitmap& bmp) +{ + if (bmp.GetMask()) + { + wxImage image = bmp.ConvertToImage(); + wxASSERT_MSG( image.HasMask(), _T("wxBitmap::ConvertToImage doesn't preserve mask?") ); + return DoRegionUnion(*this, image, + image.GetMaskRed(), + image.GetMaskGreen(), + image.GetMaskBlue(), + 0); + } + else + { + return Union(0, 0, bmp.GetWidth(), bmp.GetHeight()); + } +} + +bool wxRegionBase::Union(const wxBitmap& bmp, + const wxColour& transColour, + int tolerance) +{ + wxImage image = bmp.ConvertToImage(); + return DoRegionUnion(*this, image, + transColour.Red(), + transColour.Green(), + transColour.Blue(), + tolerance); +} + +#endif // wxUSE_IMAGE + +#ifdef wxHAS_REGION_COMBINE +// ============================================================================ +// wxRegionWithCombine +// ============================================================================ + +// implement some wxRegionBase pure virtuals in terms of Combine() +bool wxRegionWithCombine::DoUnionWithRect(const wxRect& rect) +{ + return Combine(rect, wxRGN_OR); +} + +bool wxRegionWithCombine::DoUnionWithRegion(const wxRegion& region) +{ + return DoCombine(region, wxRGN_OR); +} + +bool wxRegionWithCombine::DoIntersect(const wxRegion& region) +{ + return DoCombine(region, wxRGN_AND); +} + +bool wxRegionWithCombine::DoSubtract(const wxRegion& region) +{ + return DoCombine(region, wxRGN_DIFF); +} + +bool wxRegionWithCombine::DoXor(const wxRegion& region) +{ + return DoCombine(region, wxRGN_XOR); +} + +#endif // wxHAS_REGION_COMBINE diff --git a/Externals/wxWidgets/src/common/sckaddr.cpp b/Externals/wxWidgets/src/common/sckaddr.cpp new file mode 100644 index 0000000000..ab7a1aa715 --- /dev/null +++ b/Externals/wxWidgets/src/common/sckaddr.cpp @@ -0,0 +1,349 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/sckaddr.cpp +// Purpose: Network address manager +// Author: Guilhem Lavaux +// Modified by: +// Created: 26/04/97 +// RCS-ID: $Id: sckaddr.cpp 38787 2006-04-18 07:24:35Z ABX $ +// Copyright: (c) 1997, 1998 Guilhem Lavaux +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_SOCKETS + +#ifndef WX_PRECOMP + #include "wx/object.h" + #include "wx/log.h" + #include "wx/intl.h" + + #include + #include + #include + + #if !defined(__MWERKS__) && !defined(__SALFORDC__) + #include + #endif +#endif // !WX_PRECOMP + +#include "wx/gsocket.h" +#include "wx/socket.h" +#include "wx/sckaddr.h" + +IMPLEMENT_ABSTRACT_CLASS(wxSockAddress, wxObject) +IMPLEMENT_ABSTRACT_CLASS(wxIPaddress, wxSockAddress) +IMPLEMENT_DYNAMIC_CLASS(wxIPV4address, wxIPaddress) +#if wxUSE_IPV6 +IMPLEMENT_DYNAMIC_CLASS(wxIPV6address, wxIPaddress) +#endif +#if defined(__UNIX__) && !defined(__WINDOWS__) && !defined(__WINE__) && (!defined(__WXMAC__) || defined(__DARWIN__)) +IMPLEMENT_DYNAMIC_CLASS(wxUNIXaddress, wxSockAddress) +#endif + +// --------------------------------------------------------------------------- +// wxSockAddress +// --------------------------------------------------------------------------- + +void wxSockAddress::Init() +{ + if ( !wxSocketBase::IsInitialized() ) + { + // we must do it before using GAddress_XXX functions + (void)wxSocketBase::Initialize(); + } +} + +wxSockAddress::wxSockAddress() +{ + Init(); + + m_address = GAddress_new(); +} + +wxSockAddress::wxSockAddress(const wxSockAddress& other) + : wxObject() +{ + Init(); + + m_address = GAddress_copy(other.m_address); +} + +wxSockAddress::~wxSockAddress() +{ + GAddress_destroy(m_address); +} + +void wxSockAddress::SetAddress(GAddress *address) +{ + if ( address != m_address ) + { + GAddress_destroy(m_address); + m_address = GAddress_copy(address); + } +} + +wxSockAddress& wxSockAddress::operator=(const wxSockAddress& addr) +{ + SetAddress(addr.GetAddress()); + return *this; +} + +void wxSockAddress::Clear() +{ + GAddress_destroy(m_address); + m_address = GAddress_new(); +} + +// --------------------------------------------------------------------------- +// wxIPaddress +// --------------------------------------------------------------------------- + +wxIPaddress::wxIPaddress() + : wxSockAddress() +{ +} + +wxIPaddress::wxIPaddress(const wxIPaddress& other) + : wxSockAddress(other) +{ +} + +wxIPaddress::~wxIPaddress() +{ +} + +// --------------------------------------------------------------------------- +// wxIPV4address +// --------------------------------------------------------------------------- + +wxIPV4address::wxIPV4address() + : wxIPaddress() +{ +} + +wxIPV4address::wxIPV4address(const wxIPV4address& other) + : wxIPaddress(other) +{ +} + +wxIPV4address::~wxIPV4address() +{ +} + +bool wxIPV4address::Hostname(const wxString& name) +{ + // Some people are sometimes fool. + if (name.empty()) + { + wxLogWarning( _("Trying to solve a NULL hostname: giving up") ); + return false; + } + m_origHostname = name; + return (GAddress_INET_SetHostName(m_address, name.mb_str()) == GSOCK_NOERROR); +} + +bool wxIPV4address::Hostname(unsigned long addr) +{ + bool rv = (GAddress_INET_SetHostAddress(m_address, addr) == GSOCK_NOERROR); + if (rv) + m_origHostname = Hostname(); + else + m_origHostname = wxEmptyString; + return rv; +} + +bool wxIPV4address::Service(const wxString& name) +{ + return (GAddress_INET_SetPortName(m_address, name.mb_str(), "tcp") == GSOCK_NOERROR); +} + +bool wxIPV4address::Service(unsigned short port) +{ + return (GAddress_INET_SetPort(m_address, port) == GSOCK_NOERROR); +} + +bool wxIPV4address::LocalHost() +{ + return (GAddress_INET_SetHostName(m_address, "localhost") == GSOCK_NOERROR); +} + +bool wxIPV4address::IsLocalHost() const +{ + return (Hostname() == wxT("localhost") || IPAddress() == wxT("127.0.0.1")); +} + +bool wxIPV4address::AnyAddress() +{ + return (GAddress_INET_SetAnyAddress(m_address) == GSOCK_NOERROR); +} + +wxString wxIPV4address::Hostname() const +{ + char hostname[1024]; + + hostname[0] = 0; + GAddress_INET_GetHostName(m_address, hostname, 1024); + return wxString::FromAscii(hostname); +} + +unsigned short wxIPV4address::Service() const +{ + return GAddress_INET_GetPort(m_address); +} + +wxSockAddress *wxIPV4address::Clone() const +{ + wxIPV4address *addr = new wxIPV4address(*this); + addr->m_origHostname = m_origHostname; + return addr; +} + +wxString wxIPV4address::IPAddress() const +{ + unsigned long raw = GAddress_INET_GetHostAddress(m_address); + return wxString::Format(_T("%lu.%lu.%lu.%lu"), + (raw>>24) & 0xff, + (raw>>16) & 0xff, + (raw>>8) & 0xff, + raw & 0xff + ); +} + +bool wxIPV4address::operator==(const wxIPV4address& addr) const +{ + return Hostname().Cmp(addr.Hostname().c_str()) == 0 && + Service() == addr.Service(); +} + +#if wxUSE_IPV6 +// --------------------------------------------------------------------------- +// wxIPV6address +// --------------------------------------------------------------------------- + +wxIPV6address::wxIPV6address() + : wxIPaddress() +{ +} + +wxIPV6address::wxIPV6address(const wxIPV6address& other) + : wxIPaddress(other) +{ +} + +wxIPV6address::~wxIPV6address() +{ +} + +bool wxIPV6address::Hostname(const wxString& name) +{ + if (name.empty()) + { + wxLogWarning( _("Trying to solve a NULL hostname: giving up") ); + return false; + } + return (GAddress_INET_SetHostName(m_address, name.mb_str()) == GSOCK_NOERROR); +} + +bool wxIPV6address::Hostname(unsigned char[16] WXUNUSED(addr)) +{ + return true; +} + +bool wxIPV6address::Service(const wxString& name) +{ + return (GAddress_INET_SetPortName(m_address, name.mb_str(), "tcp") == GSOCK_NOERROR); +} + +bool wxIPV6address::Service(unsigned short port) +{ + return (GAddress_INET_SetPort(m_address, port) == GSOCK_NOERROR); +} + +bool wxIPV6address::LocalHost() +{ + return (GAddress_INET_SetHostName(m_address, "localhost") == GSOCK_NOERROR); +} + +bool wxIPV6address::IsLocalHost() const +{ + return (Hostname() == wxT("localhost") || IPAddress() == wxT("127.0.0.1")); +} + +bool wxIPV6address::AnyAddress() +{ + return (GAddress_INET_SetAnyAddress(m_address) == GSOCK_NOERROR); +} + +wxString wxIPV6address::IPAddress() const +{ + unsigned long raw = GAddress_INET_GetHostAddress(m_address); + return wxString::Format( + _T("%u.%u.%u.%u"), + (unsigned char)((raw>>24) & 0xff), + (unsigned char)((raw>>16) & 0xff), + (unsigned char)((raw>>8) & 0xff), + (unsigned char)(raw & 0xff) + ); +} + +wxString wxIPV6address::Hostname() const +{ + char hostname[1024]; + + hostname[0] = 0; + GAddress_INET_GetHostName(m_address, hostname, 1024); + return wxString::FromAscii(hostname); +} + +unsigned short wxIPV6address::Service() const +{ + return GAddress_INET_GetPort(m_address); +} + +#endif // wxUSE_IPV6 + +#if defined(__UNIX__) && !defined(__WINDOWS__) && !defined(__WINE__) && (!defined(__WXMAC__) || defined(__DARWIN__)) + +// --------------------------------------------------------------------------- +// wxUNIXaddress +// --------------------------------------------------------------------------- + +wxUNIXaddress::wxUNIXaddress() + : wxSockAddress() +{ +} + +wxUNIXaddress::wxUNIXaddress(const wxUNIXaddress& other) + : wxSockAddress(other) +{ +} + +wxUNIXaddress::~wxUNIXaddress() +{ +} + +void wxUNIXaddress::Filename(const wxString& fname) +{ + GAddress_UNIX_SetPath(m_address, fname.fn_str()); +} + +wxString wxUNIXaddress::Filename() +{ + char path[1024]; + + path[0] = 0; + GAddress_UNIX_GetPath(m_address, path, 1024); + + return wxString::FromAscii(path); +} + +#endif // __UNIX__ + +#endif + // wxUSE_SOCKETS diff --git a/Externals/wxWidgets/src/common/sckfile.cpp b/Externals/wxWidgets/src/common/sckfile.cpp new file mode 100644 index 0000000000..b7ccf97ce7 --- /dev/null +++ b/Externals/wxWidgets/src/common/sckfile.cpp @@ -0,0 +1,57 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/sckfile.cpp +// Purpose: File protocol +// Author: Guilhem Lavaux +// Modified by: +// Created: 20/07/97 +// RCS-ID: $Id: sckfile.cpp 43836 2006-12-06 19:20:40Z VZ $ +// Copyright: (c) 1997, 1998 Guilhem Lavaux +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_STREAMS && wxUSE_PROTOCOL_FILE + +#ifndef WX_PRECOMP +#endif + +#include "wx/uri.h" +#include "wx/wfstream.h" +#include "wx/protocol/file.h" + +IMPLEMENT_DYNAMIC_CLASS(wxFileProto, wxProtocol) +IMPLEMENT_PROTOCOL(wxFileProto, wxT("file"), NULL, false) + +wxFileProto::wxFileProto() + : wxProtocol() +{ + m_error = wxPROTO_NOERR; +} + +wxFileProto::~wxFileProto() +{ +} + +wxInputStream *wxFileProto::GetInputStream(const wxString& path) +{ + wxFileInputStream *retval = new wxFileInputStream(wxURI::Unescape(path)); + if ( retval->Ok() ) + { + m_error = wxPROTO_NOERR; + + return retval; + } + + m_error = wxPROTO_NOFILE; + delete retval; + + return NULL; +} + +#endif // wxUSE_STREAMS && wxUSE_PROTOCOL_FILE diff --git a/Externals/wxWidgets/src/common/sckipc.cpp b/Externals/wxWidgets/src/common/sckipc.cpp new file mode 100644 index 0000000000..3f29491194 --- /dev/null +++ b/Externals/wxWidgets/src/common/sckipc.cpp @@ -0,0 +1,769 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/sckipc.cpp +// Purpose: Interprocess communication implementation (wxSocket version) +// Author: Julian Smart +// Modified by: Guilhem Lavaux (big rewrite) May 1997, 1998 +// Guillermo Rodriguez (updated for wxSocket v2) Jan 2000 +// (callbacks deprecated) Mar 2000 +// Vadim Zeitlin (added support for Unix sockets) Apr 2002 +// Created: 1993 +// RCS-ID: $Id: sckipc.cpp 41982 2006-10-13 09:00:06Z RR $ +// Copyright: (c) Julian Smart 1993 +// (c) Guilhem Lavaux 1997, 1998 +// (c) 2000 Guillermo Rodriguez +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ========================================================================== +// declarations +// ========================================================================== + +// -------------------------------------------------------------------------- +// headers +// -------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_SOCKETS && wxUSE_IPC && wxUSE_STREAMS + +#include "wx/sckipc.h" + +#ifndef WX_PRECOMP + #include "wx/log.h" + #include "wx/event.h" + #include "wx/module.h" +#endif + +#include +#include +#include + +#include "wx/socket.h" + +// -------------------------------------------------------------------------- +// macros and constants +// -------------------------------------------------------------------------- + +// It seems to be already defined somewhere in the Xt includes. +#ifndef __XT__ +// Message codes +enum +{ + IPC_EXECUTE = 1, + IPC_REQUEST, + IPC_POKE, + IPC_ADVISE_START, + IPC_ADVISE_REQUEST, + IPC_ADVISE, + IPC_ADVISE_STOP, + IPC_REQUEST_REPLY, + IPC_FAIL, + IPC_CONNECT, + IPC_DISCONNECT +}; +#endif + +// All sockets will be created with the following flags +#define SCKIPC_FLAGS (wxSOCKET_WAITALL) + +// headers needed for umask() +#ifdef __UNIX_LIKE__ + #include + #include +#endif // __UNIX_LIKE__ + +// ---------------------------------------------------------------------------- +// private functions +// ---------------------------------------------------------------------------- + +// get the address object for the given server name, the caller must delete it +static wxSockAddress * +GetAddressFromName(const wxString& serverName, const wxString& host = wxEmptyString) +{ + // we always use INET sockets under non-Unix systems +#if defined(__UNIX__) && !defined(__WINDOWS__) && !defined(__WINE__) && (!defined(__WXMAC__) || defined(__DARWIN__)) + // under Unix, if the server name looks like a path, create a AF_UNIX + // socket instead of AF_INET one + if ( serverName.Find(_T('/')) != wxNOT_FOUND ) + { + wxUNIXaddress *addr = new wxUNIXaddress; + addr->Filename(serverName); + + return addr; + } +#endif // Unix/!Unix + { + wxIPV4address *addr = new wxIPV4address; + addr->Service(serverName); + if ( !host.empty() ) + { + addr->Hostname(host); + } + + return addr; + } +} + +// -------------------------------------------------------------------------- +// wxTCPEventHandler stuff (private class) +// -------------------------------------------------------------------------- + +class wxTCPEventHandler : public wxEvtHandler +{ +public: + wxTCPEventHandler() : wxEvtHandler() {} + + void Client_OnRequest(wxSocketEvent& event); + void Server_OnRequest(wxSocketEvent& event); + + DECLARE_EVENT_TABLE() + DECLARE_NO_COPY_CLASS(wxTCPEventHandler) +}; + +enum +{ + _CLIENT_ONREQUEST_ID = 1000, + _SERVER_ONREQUEST_ID +}; + +static wxTCPEventHandler *gs_handler = NULL; + +// ========================================================================== +// implementation +// ========================================================================== + +IMPLEMENT_DYNAMIC_CLASS(wxTCPServer, wxServerBase) +IMPLEMENT_DYNAMIC_CLASS(wxTCPClient, wxClientBase) +IMPLEMENT_CLASS(wxTCPConnection, wxConnectionBase) + +// -------------------------------------------------------------------------- +// wxTCPClient +// -------------------------------------------------------------------------- + +wxTCPClient::wxTCPClient () : wxClientBase() +{ +} + +wxTCPClient::~wxTCPClient () +{ +} + +bool wxTCPClient::ValidHost(const wxString& host) +{ + wxIPV4address addr; + + return addr.Hostname(host); +} + +wxConnectionBase *wxTCPClient::MakeConnection (const wxString& host, + const wxString& serverName, + const wxString& topic) +{ + wxSockAddress *addr = GetAddressFromName(serverName, host); + if ( !addr ) + return NULL; + + wxSocketClient *client = new wxSocketClient(SCKIPC_FLAGS); + wxSocketStream *stream = new wxSocketStream(*client); + wxDataInputStream *data_is = new wxDataInputStream(*stream); + wxDataOutputStream *data_os = new wxDataOutputStream(*stream); + + bool ok = client->Connect(*addr); + delete addr; + + if ( ok ) + { + unsigned char msg; + + // Send topic name, and enquire whether this has succeeded + data_os->Write8(IPC_CONNECT); + data_os->WriteString(topic); + + msg = data_is->Read8(); + + // OK! Confirmation. + if (msg == IPC_CONNECT) + { + wxTCPConnection *connection = (wxTCPConnection *)OnMakeConnection (); + + if (connection) + { + if (connection->IsKindOf(CLASSINFO(wxTCPConnection))) + { + connection->m_topic = topic; + connection->m_sock = client; + connection->m_sockstrm = stream; + connection->m_codeci = data_is; + connection->m_codeco = data_os; + client->SetEventHandler(*gs_handler, _CLIENT_ONREQUEST_ID); + client->SetClientData(connection); + client->SetNotify(wxSOCKET_INPUT_FLAG | wxSOCKET_LOST_FLAG); + client->Notify(true); + return connection; + } + else + { + delete connection; + // and fall through to delete everything else + } + } + } + } + + // Something went wrong, delete everything + delete data_is; + delete data_os; + delete stream; + client->Destroy(); + + return NULL; +} + +wxConnectionBase *wxTCPClient::OnMakeConnection() +{ + return new wxTCPConnection(); +} + +// -------------------------------------------------------------------------- +// wxTCPServer +// -------------------------------------------------------------------------- + +wxTCPServer::wxTCPServer () : wxServerBase() +{ + m_server = NULL; +} + +bool wxTCPServer::Create(const wxString& serverName) +{ + // Destroy previous server, if any + if (m_server) + { + m_server->SetClientData(NULL); + m_server->Destroy(); + m_server = NULL; + } + + wxSockAddress *addr = GetAddressFromName(serverName); + if ( !addr ) + return false; + +#ifdef __UNIX_LIKE__ + mode_t umaskOld; + if ( addr->Type() == wxSockAddress::UNIX ) + { + // ensure that the file doesn't exist as otherwise calling socket() would + // fail + int rc = remove(serverName.fn_str()); + if ( rc < 0 && errno != ENOENT ) + { + delete addr; + + return false; + } + + // also set the umask to prevent the others from reading our file + umaskOld = umask(077); + } + else + { + // unused anyhow but shut down the compiler warnings + umaskOld = 0; + } +#endif // __UNIX_LIKE__ + + // Create a socket listening on the specified port + m_server = new wxSocketServer(*addr, SCKIPC_FLAGS); + +#ifdef __UNIX_LIKE__ + if ( addr->Type() == wxSockAddress::UNIX ) + { + // restore the umask + umask(umaskOld); + + // save the file name to remove it later + m_filename = serverName; + } +#endif // __UNIX_LIKE__ + + delete addr; + + if (!m_server->Ok()) + { + m_server->Destroy(); + m_server = NULL; + + return false; + } + + m_server->SetEventHandler(*gs_handler, _SERVER_ONREQUEST_ID); + m_server->SetClientData(this); + m_server->SetNotify(wxSOCKET_CONNECTION_FLAG); + m_server->Notify(true); + + return true; +} + +wxTCPServer::~wxTCPServer() +{ + if (m_server) + { + m_server->SetClientData(NULL); + m_server->Destroy(); + } + +#ifdef __UNIX_LIKE__ + if ( !m_filename.empty() ) + { + if ( remove(m_filename.fn_str()) != 0 ) + { + wxLogDebug(_T("Stale AF_UNIX file '%s' left."), m_filename.c_str()); + } + } +#endif // __UNIX_LIKE__ +} + +wxConnectionBase *wxTCPServer::OnAcceptConnection( const wxString& WXUNUSED(topic) ) +{ + return new wxTCPConnection(); +} + +// -------------------------------------------------------------------------- +// wxTCPConnection +// -------------------------------------------------------------------------- + +wxTCPConnection::wxTCPConnection () : wxConnectionBase() +{ + m_sock = NULL; + m_sockstrm = NULL; + m_codeci = NULL; + m_codeco = NULL; +} + +wxTCPConnection::wxTCPConnection(wxChar *buffer, int size) + : wxConnectionBase(buffer, size) +{ + m_sock = NULL; + m_sockstrm = NULL; + m_codeci = NULL; + m_codeco = NULL; +} + +wxTCPConnection::~wxTCPConnection () +{ + Disconnect(); + + if (m_sock) + { + m_sock->SetClientData(NULL); + m_sock->Destroy(); + } + + /* Delete after destroy */ + wxDELETE(m_codeci); + wxDELETE(m_codeco); + wxDELETE(m_sockstrm); +} + +void wxTCPConnection::Compress(bool WXUNUSED(on)) +{ + // Use wxLZWStream +} + +// Calls that CLIENT can make. +bool wxTCPConnection::Disconnect () +{ + if ( !GetConnected() ) + return true; + // Send the the disconnect message to the peer. + m_codeco->Write8(IPC_DISCONNECT); + m_sock->Notify(false); + m_sock->Close(); + SetConnected(false); + + return true; +} + +bool wxTCPConnection::Execute(const wxChar *data, int size, wxIPCFormat format) +{ + if (!m_sock->IsConnected()) + return false; + + // Prepare EXECUTE message + m_codeco->Write8(IPC_EXECUTE); + m_codeco->Write8(format); + + if (size < 0) + size = (wxStrlen(data) + 1) * sizeof(wxChar); // includes final NUL + + m_codeco->Write32(size); + m_sockstrm->Write(data, size); + + return true; +} + +wxChar *wxTCPConnection::Request (const wxString& item, int *size, wxIPCFormat format) +{ + if (!m_sock->IsConnected()) + return NULL; + + m_codeco->Write8(IPC_REQUEST); + m_codeco->WriteString(item); + m_codeco->Write8(format); + + // If Unpack doesn't initialize it. + int ret; + + ret = m_codeci->Read8(); + if (ret == IPC_FAIL) + return NULL; + else + { + size_t s; + + s = m_codeci->Read32(); + + wxChar *data = GetBufferAtLeast( s ); + wxASSERT_MSG(data != NULL, + _T("Buffer too small in wxTCPConnection::Request") ); + m_sockstrm->Read(data, s); + + if (size) + *size = s; + return data; + } +} + +bool wxTCPConnection::Poke (const wxString& item, wxChar *data, int size, wxIPCFormat format) +{ + if (!m_sock->IsConnected()) + return false; + + m_codeco->Write8(IPC_POKE); + m_codeco->WriteString(item); + m_codeco->Write8(format); + + if (size < 0) + size = (wxStrlen(data) + 1) * sizeof(wxChar); // includes final NUL + + m_codeco->Write32(size); + m_sockstrm->Write(data, size); + + return true; +} + +bool wxTCPConnection::StartAdvise (const wxString& item) +{ + int ret; + + if (!m_sock->IsConnected()) + return false; + + m_codeco->Write8(IPC_ADVISE_START); + m_codeco->WriteString(item); + + ret = m_codeci->Read8(); + + if (ret != IPC_FAIL) + return true; + else + return false; +} + +bool wxTCPConnection::StopAdvise (const wxString& item) +{ + int msg; + + if (!m_sock->IsConnected()) + return false; + + m_codeco->Write8(IPC_ADVISE_STOP); + m_codeco->WriteString(item); + + msg = m_codeci->Read8(); + + if (msg != IPC_FAIL) + return true; + else + return false; +} + +// Calls that SERVER can make +bool wxTCPConnection::Advise (const wxString& item, + wxChar *data, int size, wxIPCFormat format) +{ + if (!m_sock->IsConnected()) + return false; + + m_codeco->Write8(IPC_ADVISE); + m_codeco->WriteString(item); + m_codeco->Write8(format); + + if (size < 0) + size = (wxStrlen(data) + 1) * sizeof(wxChar); // includes final NUL + + m_codeco->Write32(size); + m_sockstrm->Write(data, size); + + return true; +} + +// -------------------------------------------------------------------------- +// wxTCPEventHandler (private class) +// -------------------------------------------------------------------------- + +BEGIN_EVENT_TABLE(wxTCPEventHandler, wxEvtHandler) + EVT_SOCKET(_CLIENT_ONREQUEST_ID, wxTCPEventHandler::Client_OnRequest) + EVT_SOCKET(_SERVER_ONREQUEST_ID, wxTCPEventHandler::Server_OnRequest) +END_EVENT_TABLE() + +void wxTCPEventHandler::Client_OnRequest(wxSocketEvent &event) +{ + wxSocketBase *sock = event.GetSocket(); + if (!sock) { /* No socket, no glory */ + return ; + } + wxSocketNotify evt = event.GetSocketEvent(); + wxTCPConnection *connection = (wxTCPConnection *)(sock->GetClientData()); + + // This socket is being deleted; skip this event + if (!connection) + return; + + wxDataInputStream *codeci; + wxDataOutputStream *codeco; + wxSocketStream *sockstrm; + wxString topic_name = connection->m_topic; + wxString item; + + // We lost the connection: destroy everything + if (evt == wxSOCKET_LOST) + { + sock->Notify(false); + sock->Close(); + connection->OnDisconnect(); + return; + } + + // Receive message number. + codeci = connection->m_codeci; + codeco = connection->m_codeco; + sockstrm = connection->m_sockstrm; + int msg = codeci->Read8(); + + switch (msg) + { + case IPC_EXECUTE: + { + wxChar *data; + size_t size; + wxIPCFormat format; + + format = (wxIPCFormat)codeci->Read8(); + size = codeci->Read32(); + + data = connection->GetBufferAtLeast( size ); + wxASSERT_MSG(data != NULL, + _T("Buffer too small in wxTCPEventHandler::Client_OnRequest") ); + sockstrm->Read(data, size); + + connection->OnExecute (topic_name, data, size, format); + + break; + } + case IPC_ADVISE: + { + wxChar *data; + size_t size; + wxIPCFormat format; + + item = codeci->ReadString(); + format = (wxIPCFormat)codeci->Read8(); + size = codeci->Read32(); + data = connection->GetBufferAtLeast( size ); + wxASSERT_MSG(data != NULL, + _T("Buffer too small in wxTCPEventHandler::Client_OnRequest") ); + sockstrm->Read(data, size); + + connection->OnAdvise (topic_name, item, data, size, format); + + break; + } + case IPC_ADVISE_START: + { + item = codeci->ReadString(); + + bool ok = connection->OnStartAdvise (topic_name, item); + if (ok) + codeco->Write8(IPC_ADVISE_START); + else + codeco->Write8(IPC_FAIL); + + break; + } + case IPC_ADVISE_STOP: + { + item = codeci->ReadString(); + + bool ok = connection->OnStopAdvise (topic_name, item); + if (ok) + codeco->Write8(IPC_ADVISE_STOP); + else + codeco->Write8(IPC_FAIL); + + break; + } + case IPC_POKE: + { + wxIPCFormat format; + size_t size; + wxChar *data; + + item = codeci->ReadString(); + format = (wxIPCFormat)codeci->Read8(); + size = codeci->Read32(); + data = connection->GetBufferAtLeast( size ); + wxASSERT_MSG(data != NULL, + _T("Buffer too small in wxTCPEventHandler::Client_OnRequest") ); + sockstrm->Read(data, size); + + connection->OnPoke (topic_name, item, data, size, format); + + break; + } + case IPC_REQUEST: + { + wxIPCFormat format; + + item = codeci->ReadString(); + format = (wxIPCFormat)codeci->Read8(); + + int user_size = -1; + wxChar *user_data = connection->OnRequest (topic_name, item, &user_size, format); + + if (user_data) + { + codeco->Write8(IPC_REQUEST_REPLY); + + if (user_size == -1) + user_size = (wxStrlen(user_data) + 1) * sizeof(wxChar); // includes final NUL + + codeco->Write32(user_size); + sockstrm->Write(user_data, user_size); + } + else + codeco->Write8(IPC_FAIL); + + break; + } + case IPC_DISCONNECT: + { + sock->Notify(false); + sock->Close(); + connection->SetConnected(false); + connection->OnDisconnect(); + break; + } + default: + codeco->Write8(IPC_FAIL); + break; + } +} + +void wxTCPEventHandler::Server_OnRequest(wxSocketEvent &event) +{ + wxSocketServer *server = (wxSocketServer *) event.GetSocket(); + if (!server) { /* No server, Then exit */ + return ; + } + wxTCPServer *ipcserv = (wxTCPServer *) server->GetClientData(); + + // This socket is being deleted; skip this event + if (!ipcserv) + return; + + if (event.GetSocketEvent() != wxSOCKET_CONNECTION) + return; + + // Accept the connection, getting a new socket + wxSocketBase *sock = server->Accept(); + if (!sock) { /* No socket, no glory */ + return ; + } + if (!sock->Ok()) + { + sock->Destroy(); + return; + } + + wxSocketStream *stream = new wxSocketStream(*sock); + wxDataInputStream *codeci = new wxDataInputStream(*stream); + wxDataOutputStream *codeco = new wxDataOutputStream(*stream); + + int msg; + msg = codeci->Read8(); + + if (msg == IPC_CONNECT) + { + wxString topic_name; + topic_name = codeci->ReadString(); + + wxTCPConnection *new_connection = + (wxTCPConnection *)ipcserv->OnAcceptConnection (topic_name); + + if (new_connection) + { + if (new_connection->IsKindOf(CLASSINFO(wxTCPConnection))) + { + // Acknowledge success + codeco->Write8(IPC_CONNECT); + new_connection->m_topic = topic_name; + new_connection->m_sock = sock; + new_connection->m_sockstrm = stream; + new_connection->m_codeci = codeci; + new_connection->m_codeco = codeco; + sock->SetEventHandler(*gs_handler, _CLIENT_ONREQUEST_ID); + sock->SetClientData(new_connection); + sock->SetNotify(wxSOCKET_INPUT_FLAG | wxSOCKET_LOST_FLAG); + sock->Notify(true); + return; + } + else + { + delete new_connection; + // and fall through to delete everything else + } + } + } + + // Something went wrong, send failure message and delete everything + codeco->Write8(IPC_FAIL); + + delete codeco; + delete codeci; + delete stream; + sock->Destroy(); +} + +// -------------------------------------------------------------------------- +// wxTCPEventHandlerModule (private class) +// -------------------------------------------------------------------------- + +class wxTCPEventHandlerModule: public wxModule +{ + DECLARE_DYNAMIC_CLASS(wxTCPEventHandlerModule) + +public: + bool OnInit() { gs_handler = new wxTCPEventHandler(); return true; } + void OnExit() { wxDELETE(gs_handler); } +}; + +IMPLEMENT_DYNAMIC_CLASS(wxTCPEventHandlerModule, wxModule) + + +#endif + // wxUSE_SOCKETS && wxUSE_IPC && wxUSE_STREAMS diff --git a/Externals/wxWidgets/src/common/sckstrm.cpp b/Externals/wxWidgets/src/common/sckstrm.cpp new file mode 100644 index 0000000000..658e3e57ed --- /dev/null +++ b/Externals/wxWidgets/src/common/sckstrm.cpp @@ -0,0 +1,135 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/sckstrm.cpp +// Purpose: wxSocket*Stream +// Author: Guilhem Lavaux +// Modified by: +// Created: 17/07/97 +// RCS-ID: $Id: sckstrm.cpp 42897 2006-11-01 10:21:24Z JS $ +// Copyright: (c) +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_SOCKETS && wxUSE_STREAMS + +#include "wx/sckstrm.h" + +#ifndef WX_PRECOMP + #include "wx/stream.h" +#endif + +#include "wx/socket.h" + +// --------------------------------------------------------------------------- +// wxSocketOutputStream +// --------------------------------------------------------------------------- + +wxSocketOutputStream::wxSocketOutputStream(wxSocketBase& s) + : m_o_socket(&s) +{ +} + +wxSocketOutputStream::~wxSocketOutputStream() +{ +} + +size_t wxSocketOutputStream::OnSysWrite(const void *buffer, size_t size) +{ + size_t ret = m_o_socket->Write((const char *)buffer, size).LastCount(); + m_lasterror = m_o_socket->Error() ? wxSTREAM_WRITE_ERROR : wxSTREAM_NO_ERROR; + return ret; + + // Patch 1476893 caused Advise to hang, needs further investigation +#if 0 + const char *buf = (const char *)buffer; + size_t count = 0; + + while ( count < size && m_o_socket->WaitForWrite() ) + { + const size_t ret = m_o_socket->Write(buf, size - count).LastCount(); + + buf += ret; + count += ret; + + if ( m_o_socket->Error() ) + { + if (m_o_socket->LastError() != wxSOCKET_WOULDBLOCK) + { + m_lasterror = wxSTREAM_WRITE_ERROR; + return count; + } + } + } + + m_lasterror = wxSTREAM_NO_ERROR; + return count; +#endif +} + +// --------------------------------------------------------------------------- +// wxSocketInputStream +// --------------------------------------------------------------------------- + +wxSocketInputStream::wxSocketInputStream(wxSocketBase& s) + : m_i_socket(&s) +{ +} + +wxSocketInputStream::~wxSocketInputStream() +{ +} + +size_t wxSocketInputStream::OnSysRead(void *buffer, size_t size) +{ + size_t ret = m_i_socket->Read((char *)buffer, size).LastCount(); + m_lasterror = m_i_socket->Error() ? wxSTREAM_READ_ERROR : wxSTREAM_NO_ERROR; + return ret; + + // Patch 1476893 caused Advise to hang, needs further investigation +#if 0 + char *buf = (char *)buffer; + size_t count = 0; + + while ( count < size && m_i_socket->WaitForRead() ) + { + const size_t ret = m_i_socket->Read(buf, size - count).LastCount(); + + buf += ret; + count += ret; + + if ( m_i_socket->Error() ) + { + if (m_i_socket->LastError() != wxSOCKET_WOULDBLOCK) + { + m_lasterror = wxSTREAM_READ_ERROR; + return count; + } + } + } + + m_lasterror = wxSTREAM_NO_ERROR; + return count; +#endif +} + +// --------------------------------------------------------------------------- +// wxSocketStream +// --------------------------------------------------------------------------- + +wxSocketStream::wxSocketStream(wxSocketBase& s) + : wxSocketInputStream(s), wxSocketOutputStream(s) +{ +} + +wxSocketStream::~wxSocketStream() +{ +} + +#endif + // wxUSE_STREAMS && wxUSE_SOCKETS diff --git a/Externals/wxWidgets/src/common/settcmn.cpp b/Externals/wxWidgets/src/common/settcmn.cpp new file mode 100644 index 0000000000..2aa32ea0d9 --- /dev/null +++ b/Externals/wxWidgets/src/common/settcmn.cpp @@ -0,0 +1,88 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/settcmn.cpp +// Purpose: common (to all ports) wxWindow functions +// Author: Robert Roebling +// RCS-ID: $Id: settcmn.cpp 39310 2006-05-24 07:16:32Z ABX $ +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#include "wx/settings.h" + +#ifndef WX_PRECOMP + #include "wx/utils.h" +#endif //WX_PRECOMP + +// ---------------------------------------------------------------------------- +// static data +// ---------------------------------------------------------------------------- + +wxSystemScreenType wxSystemSettings::ms_screen = wxSYS_SCREEN_NONE; + +// ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- + +wxSystemScreenType wxSystemSettings::GetScreenType() +{ + if (ms_screen == wxSYS_SCREEN_NONE) + { + // wxUniv will be used on small devices, too. + int x = GetMetric( wxSYS_SCREEN_X ); + + ms_screen = wxSYS_SCREEN_DESKTOP; + + if (x < 800) + ms_screen = wxSYS_SCREEN_SMALL; + + if (x < 640) + ms_screen = wxSYS_SCREEN_PDA; + + if (x < 200) + ms_screen = wxSYS_SCREEN_TINY; + + // This is probably a bug, but VNC seems to report 0 + if (x < 10) + ms_screen = wxSYS_SCREEN_DESKTOP; + } + + return ms_screen; +} + +void wxSystemSettings::SetScreenType( wxSystemScreenType screen ) +{ + ms_screen = screen; +} + +#if WXWIN_COMPATIBILITY_2_4 + +wxColour wxSystemSettings::GetSystemColour(int index) +{ + return GetColour((wxSystemColour)index); +} + +wxFont wxSystemSettings::GetSystemFont(int index) +{ + return GetFont((wxSystemFont)index); +} + +int wxSystemSettings::GetSystemMetric(int index) +{ + return GetMetric((wxSystemMetric)index); +} + +#endif // WXWIN_COMPATIBILITY_2_4 diff --git a/Externals/wxWidgets/src/common/sizer.cpp b/Externals/wxWidgets/src/common/sizer.cpp new file mode 100644 index 0000000000..b2528e8982 --- /dev/null +++ b/Externals/wxWidgets/src/common/sizer.cpp @@ -0,0 +1,2201 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/sizer.cpp +// Purpose: provide new wxSizer class for layout +// Author: Robert Roebling and Robin Dunn, contributions by +// Dirk Holtwick, Ron Lee +// Modified by: Ron Lee +// Created: +// RCS-ID: $Id: sizer.cpp 49676 2007-11-06 10:47:58Z JS $ +// Copyright: (c) Robin Dunn, Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#include "wx/display.h" +#include "wx/sizer.h" + +#ifndef WX_PRECOMP + #include "wx/string.h" + #include "wx/intl.h" + #include "wx/math.h" + #include "wx/utils.h" + #include "wx/settings.h" + #include "wx/button.h" + #include "wx/statbox.h" + #include "wx/toplevel.h" +#endif // WX_PRECOMP + +#include "wx/listimpl.cpp" + +#if WXWIN_COMPATIBILITY_2_4 + #include "wx/notebook.h" +#endif + +//--------------------------------------------------------------------------- + +IMPLEMENT_CLASS(wxSizerItem, wxObject) +IMPLEMENT_CLASS(wxSizer, wxObject) +IMPLEMENT_CLASS(wxGridSizer, wxSizer) +IMPLEMENT_CLASS(wxFlexGridSizer, wxGridSizer) +IMPLEMENT_CLASS(wxBoxSizer, wxSizer) +#if wxUSE_STATBOX +IMPLEMENT_CLASS(wxStaticBoxSizer, wxBoxSizer) +#endif +#if wxUSE_BUTTON +IMPLEMENT_CLASS(wxStdDialogButtonSizer, wxBoxSizer) +#endif + +WX_DEFINE_EXPORTED_LIST( wxSizerItemList ) + +/* + TODO PROPERTIES + sizeritem + object + object_ref + minsize + option + flag + border + spacer + option + flag + borfder + boxsizer + orient + staticboxsizer + orient + label + gridsizer + rows + cols + vgap + hgap + flexgridsizer + rows + cols + vgap + hgap + growablerows + growablecols + minsize +*/ + +// ---------------------------------------------------------------------------- +// wxSizerItem +// ---------------------------------------------------------------------------- + +void wxSizerItem::Init(const wxSizerFlags& flags) +{ + Init(); + + m_proportion = flags.GetProportion(); + m_flag = flags.GetFlags(); + m_border = flags.GetBorderInPixels(); +} + +wxSizerItem::wxSizerItem() +{ + Init(); + + m_proportion = 0; + m_border = 0; + m_flag = 0; + + m_kind = Item_None; +} + +// window item +void wxSizerItem::SetWindow(wxWindow *window) +{ + wxCHECK_RET( window, _T("NULL window in wxSizerItem::SetWindow()") ); + + m_kind = Item_Window; + m_window = window; + + // window doesn't become smaller than its initial size, whatever happens + m_minSize = window->GetSize(); + + if ( m_flag & wxFIXED_MINSIZE ) + window->SetMinSize(m_minSize); + + // aspect ratio calculated from initial size + SetRatio(m_minSize); +} + +wxSizerItem::wxSizerItem(wxWindow *window, + int proportion, + int flag, + int border, + wxObject* userData) + : m_proportion(proportion), + m_border(border), + m_flag(flag), + m_userData(userData) +{ + SetWindow(window); +} + +// sizer item +void wxSizerItem::SetSizer(wxSizer *sizer) +{ + m_kind = Item_Sizer; + m_sizer = sizer; +} + +wxSizerItem::wxSizerItem(wxSizer *sizer, + int proportion, + int flag, + int border, + wxObject* userData) + : m_proportion(proportion), + m_border(border), + m_flag(flag), + m_ratio(0.0), + m_userData(userData) +{ + SetSizer(sizer); + + // m_minSize is set later +} + +// spacer item +void wxSizerItem::SetSpacer(const wxSize& size) +{ + m_kind = Item_Spacer; + m_spacer = new wxSizerSpacer(size); + m_minSize = size; + SetRatio(size); +} + +wxSizerItem::wxSizerItem(int width, + int height, + int proportion, + int flag, + int border, + wxObject* userData) + : m_minSize(width, height), // minimal size is the initial size + m_proportion(proportion), + m_border(border), + m_flag(flag), + m_userData(userData) +{ + SetSpacer(width, height); +} + +wxSizerItem::~wxSizerItem() +{ + delete m_userData; + + switch ( m_kind ) + { + case Item_None: + break; + + case Item_Window: + m_window->SetContainingSizer(NULL); + break; + + case Item_Sizer: + delete m_sizer; + break; + + case Item_Spacer: + delete m_spacer; + break; + + case Item_Max: + default: + wxFAIL_MSG( _T("unexpected wxSizerItem::m_kind") ); + } +} + +wxSize wxSizerItem::GetSpacer() const +{ + wxSize size; + if ( m_kind == Item_Spacer ) + size = m_spacer->GetSize(); + + return size; +} + + +wxSize wxSizerItem::GetSize() const +{ + wxSize ret; + switch ( m_kind ) + { + case Item_None: + break; + + case Item_Window: + ret = m_window->GetSize(); + break; + + case Item_Sizer: + ret = m_sizer->GetSize(); + break; + + case Item_Spacer: + ret = m_spacer->GetSize(); + break; + + case Item_Max: + default: + wxFAIL_MSG( _T("unexpected wxSizerItem::m_kind") ); + } + + if (m_flag & wxWEST) + ret.x += m_border; + if (m_flag & wxEAST) + ret.x += m_border; + if (m_flag & wxNORTH) + ret.y += m_border; + if (m_flag & wxSOUTH) + ret.y += m_border; + + return ret; +} + +wxSize wxSizerItem::CalcMin() +{ + if (IsSizer()) + { + m_minSize = m_sizer->GetMinSize(); + + // if we have to preserve aspect ratio _AND_ this is + // the first-time calculation, consider ret to be initial size + if ( (m_flag & wxSHAPED) && wxIsNullDouble(m_ratio) ) + SetRatio(m_minSize); + } + else if ( IsWindow() ) + { + // Since the size of the window may change during runtime, we + // should use the current minimal/best size. + m_minSize = m_window->GetEffectiveMinSize(); + } + + return GetMinSizeWithBorder(); +} + +wxSize wxSizerItem::GetMinSizeWithBorder() const +{ + wxSize ret = m_minSize; + + if (m_flag & wxWEST) + ret.x += m_border; + if (m_flag & wxEAST) + ret.x += m_border; + if (m_flag & wxNORTH) + ret.y += m_border; + if (m_flag & wxSOUTH) + ret.y += m_border; + + return ret; +} + + +void wxSizerItem::SetDimension( const wxPoint& pos_, const wxSize& size_ ) +{ + wxPoint pos = pos_; + wxSize size = size_; + if (m_flag & wxSHAPED) + { + // adjust aspect ratio + int rwidth = (int) (size.y * m_ratio); + if (rwidth > size.x) + { + // fit horizontally + int rheight = (int) (size.x / m_ratio); + // add vertical space + if (m_flag & wxALIGN_CENTER_VERTICAL) + pos.y += (size.y - rheight) / 2; + else if (m_flag & wxALIGN_BOTTOM) + pos.y += (size.y - rheight); + // use reduced dimensions + size.y =rheight; + } + else if (rwidth < size.x) + { + // add horizontal space + if (m_flag & wxALIGN_CENTER_HORIZONTAL) + pos.x += (size.x - rwidth) / 2; + else if (m_flag & wxALIGN_RIGHT) + pos.x += (size.x - rwidth); + size.x = rwidth; + } + } + + // This is what GetPosition() returns. Since we calculate + // borders afterwards, GetPosition() will be the left/top + // corner of the surrounding border. + m_pos = pos; + + if (m_flag & wxWEST) + { + pos.x += m_border; + size.x -= m_border; + } + if (m_flag & wxEAST) + { + size.x -= m_border; + } + if (m_flag & wxNORTH) + { + pos.y += m_border; + size.y -= m_border; + } + if (m_flag & wxSOUTH) + { + size.y -= m_border; + } + + if (size.x < 0) + size.x = 0; + if (size.y < 0) + size.y = 0; + + m_rect = wxRect(pos, size); + + switch ( m_kind ) + { + case Item_None: + wxFAIL_MSG( _T("can't set size of uninitialized sizer item") ); + break; + + case Item_Window: + m_window->SetSize(pos.x, pos.y, size.x, size.y, + wxSIZE_ALLOW_MINUS_ONE); + break; + + case Item_Sizer: + m_sizer->SetDimension(pos.x, pos.y, size.x, size.y); + break; + + case Item_Spacer: + m_spacer->SetSize(size); + break; + + case Item_Max: + default: + wxFAIL_MSG( _T("unexpected wxSizerItem::m_kind") ); + } +} + +void wxSizerItem::DeleteWindows() +{ + switch ( m_kind ) + { + case Item_None: + case Item_Spacer: + break; + + case Item_Window: + //We are deleting the window from this sizer - normally + //the window destroys the sizer associated with it, + //which might destroy this, which we don't want + m_window->SetContainingSizer(NULL); + m_window->Destroy(); + //Putting this after the switch will result in a spacer + //not being deleted properly on destruction + m_kind = Item_None; + break; + + case Item_Sizer: + m_sizer->DeleteWindows(); + break; + + case Item_Max: + default: + wxFAIL_MSG( _T("unexpected wxSizerItem::m_kind") ); + } + +} + +void wxSizerItem::Show( bool show ) +{ + switch ( m_kind ) + { + case Item_None: + wxFAIL_MSG( _T("can't show uninitialized sizer item") ); + break; + + case Item_Window: + m_window->Show(show); + break; + + case Item_Sizer: + m_sizer->Show(show); + break; + + case Item_Spacer: + m_spacer->Show(show); + break; + + case Item_Max: + default: + wxFAIL_MSG( _T("unexpected wxSizerItem::m_kind") ); + } +} + +bool wxSizerItem::IsShown() const +{ + switch ( m_kind ) + { + case Item_None: + // we may be called from CalcMin(), just return false so that we're + // not used + break; + + case Item_Window: + return m_window->IsShown(); + + case Item_Sizer: + // arbitrarily decide that if at least one of our elements is + // shown, so are we (this arbitrariness is the reason for + // deprecating this function) + { + // Some apps (such as dialog editors) depend on an empty sizer still + // being laid out correctly and reporting the correct size and position. + if (m_sizer->GetChildren().GetCount() == 0) + return true; + + for ( wxSizerItemList::compatibility_iterator + node = m_sizer->GetChildren().GetFirst(); + node; + node = node->GetNext() ) + { + if ( node->GetData()->IsShown() ) + return true; + } + } + return false; + + case Item_Spacer: + return m_spacer->IsShown(); + + case Item_Max: + default: + wxFAIL_MSG( _T("unexpected wxSizerItem::m_kind") ); + } + + return false; +} + +#if WXWIN_COMPATIBILITY_2_6 +void wxSizerItem::SetOption( int option ) +{ + SetProportion( option ); +} + +int wxSizerItem::GetOption() const +{ + return GetProportion(); +} +#endif // WXWIN_COMPATIBILITY_2_6 + + +//--------------------------------------------------------------------------- +// wxSizer +//--------------------------------------------------------------------------- + +wxSizer::~wxSizer() +{ + WX_CLEAR_LIST(wxSizerItemList, m_children); +} + +wxSizerItem* wxSizer::Insert( size_t index, wxSizerItem *item ) +{ + m_children.Insert( index, item ); + + if ( item->GetWindow() ) + item->GetWindow()->SetContainingSizer( this ); + + if ( item->GetSizer() ) + item->GetSizer()->SetContainingWindow( m_containingWindow ); + + return item; +} + +void wxSizer::SetContainingWindow(wxWindow *win) +{ + if ( win == m_containingWindow ) + return; + + m_containingWindow = win; + + // set the same window for all nested sizers as well, they also are in the + // same window + for ( wxSizerItemList::compatibility_iterator node = m_children.GetFirst(); + node; + node = node->GetNext() ) + { + wxSizerItem *const item = node->GetData(); + wxSizer *const sizer = item->GetSizer(); + + if ( sizer ) + { + sizer->SetContainingWindow(win); + } + } +} + +#if WXWIN_COMPATIBILITY_2_6 +bool wxSizer::Remove( wxWindow *window ) +{ + return Detach( window ); +} +#endif // WXWIN_COMPATIBILITY_2_6 + +bool wxSizer::Remove( wxSizer *sizer ) +{ + wxASSERT_MSG( sizer, _T("Removing NULL sizer") ); + + wxSizerItemList::compatibility_iterator node = m_children.GetFirst(); + while (node) + { + wxSizerItem *item = node->GetData(); + + if (item->GetSizer() == sizer) + { + delete item; + m_children.Erase( node ); + return true; + } + + node = node->GetNext(); + } + + return false; +} + +bool wxSizer::Remove( int index ) +{ + wxCHECK_MSG( index >= 0 && (size_t)index < m_children.GetCount(), + false, + _T("Remove index is out of range") ); + + wxSizerItemList::compatibility_iterator node = m_children.Item( index ); + + wxCHECK_MSG( node, false, _T("Failed to find child node") ); + + wxSizerItem *item = node->GetData(); + + if ( item->IsWindow() ) + item->GetWindow()->SetContainingSizer( NULL ); + + delete item; + m_children.Erase( node ); + return true; +} + +bool wxSizer::Detach( wxSizer *sizer ) +{ + wxASSERT_MSG( sizer, _T("Detaching NULL sizer") ); + + wxSizerItemList::compatibility_iterator node = m_children.GetFirst(); + while (node) + { + wxSizerItem *item = node->GetData(); + + if (item->GetSizer() == sizer) + { + item->DetachSizer(); + delete item; + m_children.Erase( node ); + return true; + } + node = node->GetNext(); + } + + return false; +} + +bool wxSizer::Detach( wxWindow *window ) +{ + wxASSERT_MSG( window, _T("Detaching NULL window") ); + + wxSizerItemList::compatibility_iterator node = m_children.GetFirst(); + while (node) + { + wxSizerItem *item = node->GetData(); + + if (item->GetWindow() == window) + { + item->GetWindow()->SetContainingSizer( NULL ); + delete item; + m_children.Erase( node ); + return true; + } + node = node->GetNext(); + } + + return false; +} + +bool wxSizer::Detach( int index ) +{ + wxCHECK_MSG( index >= 0 && (size_t)index < m_children.GetCount(), + false, + _T("Detach index is out of range") ); + + wxSizerItemList::compatibility_iterator node = m_children.Item( index ); + + wxCHECK_MSG( node, false, _T("Failed to find child node") ); + + wxSizerItem *item = node->GetData(); + + if ( item->IsSizer() ) + item->DetachSizer(); + else if ( item->IsWindow() ) + item->GetWindow()->SetContainingSizer( NULL ); + + delete item; + m_children.Erase( node ); + return true; +} + +bool wxSizer::Replace( wxWindow *oldwin, wxWindow *newwin, bool recursive ) +{ + wxASSERT_MSG( oldwin, _T("Replacing NULL window") ); + wxASSERT_MSG( newwin, _T("Replacing with NULL window") ); + + wxSizerItemList::compatibility_iterator node = m_children.GetFirst(); + while (node) + { + wxSizerItem *item = node->GetData(); + + if (item->GetWindow() == oldwin) + { + item->GetWindow()->SetContainingSizer( NULL ); + item->SetWindow(newwin); + newwin->SetContainingSizer( this ); + return true; + } + else if (recursive && item->IsSizer()) + { + if (item->GetSizer()->Replace( oldwin, newwin, true )) + return true; + } + + node = node->GetNext(); + } + + return false; +} + +bool wxSizer::Replace( wxSizer *oldsz, wxSizer *newsz, bool recursive ) +{ + wxASSERT_MSG( oldsz, _T("Replacing NULL sizer") ); + wxASSERT_MSG( newsz, _T("Replacing with NULL sizer") ); + + wxSizerItemList::compatibility_iterator node = m_children.GetFirst(); + while (node) + { + wxSizerItem *item = node->GetData(); + + if (item->GetSizer() == oldsz) + { + wxSizer *old = item->GetSizer(); + item->SetSizer(newsz); + delete old; + return true; + } + else if (recursive && item->IsSizer()) + { + if (item->GetSizer()->Replace( oldsz, newsz, true )) + return true; + } + + node = node->GetNext(); + } + + return false; +} + +bool wxSizer::Replace( size_t old, wxSizerItem *newitem ) +{ + wxCHECK_MSG( old < m_children.GetCount(), false, _T("Replace index is out of range") ); + wxASSERT_MSG( newitem, _T("Replacing with NULL item") ); + + wxSizerItemList::compatibility_iterator node = m_children.Item( old ); + + wxCHECK_MSG( node, false, _T("Failed to find child node") ); + + wxSizerItem *item = node->GetData(); + node->SetData(newitem); + delete item; + + return true; +} + +void wxSizer::Clear( bool delete_windows ) +{ + // First clear the ContainingSizer pointers + wxSizerItemList::compatibility_iterator node = m_children.GetFirst(); + while (node) + { + wxSizerItem *item = node->GetData(); + + if (item->IsWindow()) + item->GetWindow()->SetContainingSizer( NULL ); + node = node->GetNext(); + } + + // Destroy the windows if needed + if (delete_windows) + DeleteWindows(); + + // Now empty the list + WX_CLEAR_LIST(wxSizerItemList, m_children); +} + +void wxSizer::DeleteWindows() +{ + wxSizerItemList::compatibility_iterator node = m_children.GetFirst(); + while (node) + { + wxSizerItem *item = node->GetData(); + + item->DeleteWindows(); + node = node->GetNext(); + } +} + +wxSize wxSizer::Fit( wxWindow *window ) +{ + // take the min size by default and limit it by max size + wxSize size = GetMinWindowSize(window); + wxSize sizeMax = GetMaxWindowSize(window); + + wxTopLevelWindow *tlw = wxDynamicCast(window, wxTopLevelWindow); + if ( tlw ) + { + // hack for small screen devices where TLWs are always full screen + if ( tlw->IsAlwaysMaximized() ) + { + size = tlw->GetSize(); + } + else // normal situation + { + // limit the window to the size of the display it is on + int disp = wxDisplay::GetFromWindow(window); + if ( disp == wxNOT_FOUND ) + { + // or, if we don't know which one it is, of the main one + disp = 0; + } + + sizeMax = wxDisplay(disp).GetClientArea().GetSize(); + } + } + + if ( sizeMax.x != wxDefaultCoord && size.x > sizeMax.x ) + size.x = sizeMax.x; + if ( sizeMax.y != wxDefaultCoord && size.y > sizeMax.y ) + size.y = sizeMax.y; + + + window->SetSize( size ); + + return size; +} + +void wxSizer::FitInside( wxWindow *window ) +{ + wxSize size; + if (window->IsTopLevel()) + size = VirtualFitSize( window ); + else + size = GetMinClientSize( window ); + + window->SetVirtualSize( size ); +} + +void wxSizer::Layout() +{ + // (re)calculates minimums needed for each item and other preparations + // for layout + CalcMin(); + + // Applies the layout and repositions/resizes the items + RecalcSizes(); +} + +void wxSizer::SetSizeHints( wxWindow *window ) +{ + // Preserve the window's max size hints, but set the + // lower bound according to the sizer calculations. + + wxSize size = Fit( window ); + + window->SetSizeHints( size.x, + size.y, + window->GetMaxWidth(), + window->GetMaxHeight() ); +} + +void wxSizer::SetVirtualSizeHints( wxWindow *window ) +{ + // Preserve the window's max size hints, but set the + // lower bound according to the sizer calculations. + + FitInside( window ); + wxSize size( window->GetVirtualSize() ); + window->SetVirtualSizeHints( size.x, + size.y, + window->GetMaxWidth(), + window->GetMaxHeight() ); +} + +wxSize wxSizer::GetMaxWindowSize( wxWindow *window ) const +{ + return window->GetMaxSize(); +} + +wxSize wxSizer::GetMinWindowSize( wxWindow *window ) +{ + wxSize minSize( GetMinSize() ); + wxSize size( window->GetSize() ); + wxSize client_size( window->GetClientSize() ); + + return wxSize( minSize.x+size.x-client_size.x, + minSize.y+size.y-client_size.y ); +} + +// TODO on mac we need a function that determines how much free space this +// min size contains, in order to make sure that we have 20 pixels of free +// space around the controls +wxSize wxSizer::GetMaxClientSize( wxWindow *window ) const +{ + wxSize maxSize( window->GetMaxSize() ); + + if ( maxSize != wxDefaultSize ) + { + wxSize size( window->GetSize() ); + wxSize client_size( window->GetClientSize() ); + + return wxSize( maxSize.x + client_size.x - size.x, + maxSize.y + client_size.y - size.y ); + } + else + return wxDefaultSize; +} + +wxSize wxSizer::GetMinClientSize( wxWindow *WXUNUSED(window) ) +{ + return GetMinSize(); // Already returns client size. +} + +wxSize wxSizer::VirtualFitSize( wxWindow *window ) +{ + wxSize size = GetMinClientSize( window ); + wxSize sizeMax = GetMaxClientSize( window ); + + // Limit the size if sizeMax != wxDefaultSize + + if ( size.x > sizeMax.x && sizeMax.x != wxDefaultCoord ) + size.x = sizeMax.x; + if ( size.y > sizeMax.y && sizeMax.y != wxDefaultCoord ) + size.y = sizeMax.y; + + return size; +} + +void wxSizer::SetDimension( int x, int y, int width, int height ) +{ + m_position.x = x; + m_position.y = y; + m_size.x = width; + m_size.y = height; + Layout(); +} + +wxSize wxSizer::GetMinSize() +{ + wxSize ret( CalcMin() ); + if (ret.x < m_minSize.x) ret.x = m_minSize.x; + if (ret.y < m_minSize.y) ret.y = m_minSize.y; + return ret; +} + +void wxSizer::DoSetMinSize( int width, int height ) +{ + m_minSize.x = width; + m_minSize.y = height; +} + +bool wxSizer::DoSetItemMinSize( wxWindow *window, int width, int height ) +{ + wxASSERT_MSG( window, _T("SetMinSize for NULL window") ); + + // Is it our immediate child? + + wxSizerItemList::compatibility_iterator node = m_children.GetFirst(); + while (node) + { + wxSizerItem *item = node->GetData(); + + if (item->GetWindow() == window) + { + item->SetMinSize( width, height ); + return true; + } + node = node->GetNext(); + } + + // No? Search any subsizers we own then + + node = m_children.GetFirst(); + while (node) + { + wxSizerItem *item = node->GetData(); + + if ( item->GetSizer() && + item->GetSizer()->DoSetItemMinSize( window, width, height ) ) + { + // A child sizer found the requested windw, exit. + return true; + } + node = node->GetNext(); + } + + return false; +} + +bool wxSizer::DoSetItemMinSize( wxSizer *sizer, int width, int height ) +{ + wxASSERT_MSG( sizer, _T("SetMinSize for NULL sizer") ); + + // Is it our immediate child? + + wxSizerItemList::compatibility_iterator node = m_children.GetFirst(); + while (node) + { + wxSizerItem *item = node->GetData(); + + if (item->GetSizer() == sizer) + { + item->GetSizer()->DoSetMinSize( width, height ); + return true; + } + node = node->GetNext(); + } + + // No? Search any subsizers we own then + + node = m_children.GetFirst(); + while (node) + { + wxSizerItem *item = node->GetData(); + + if ( item->GetSizer() && + item->GetSizer()->DoSetItemMinSize( sizer, width, height ) ) + { + // A child found the requested sizer, exit. + return true; + } + node = node->GetNext(); + } + + return false; +} + +bool wxSizer::DoSetItemMinSize( size_t index, int width, int height ) +{ + wxSizerItemList::compatibility_iterator node = m_children.Item( index ); + + wxCHECK_MSG( node, false, _T("Failed to find child node") ); + + wxSizerItem *item = node->GetData(); + + if (item->GetSizer()) + { + // Sizers contains the minimal size in them, if not calculated ... + item->GetSizer()->DoSetMinSize( width, height ); + } + else + { + // ... but the minimal size of spacers and windows is stored via the item + item->SetMinSize( width, height ); + } + + return true; +} + +wxSizerItem* wxSizer::GetItem( wxWindow *window, bool recursive ) +{ + wxASSERT_MSG( window, _T("GetItem for NULL window") ); + + wxSizerItemList::compatibility_iterator node = m_children.GetFirst(); + while (node) + { + wxSizerItem *item = node->GetData(); + + if (item->GetWindow() == window) + { + return item; + } + else if (recursive && item->IsSizer()) + { + wxSizerItem *subitem = item->GetSizer()->GetItem( window, true ); + if (subitem) + return subitem; + } + + node = node->GetNext(); + } + + return NULL; +} + +wxSizerItem* wxSizer::GetItem( wxSizer *sizer, bool recursive ) +{ + wxASSERT_MSG( sizer, _T("GetItem for NULL sizer") ); + + wxSizerItemList::compatibility_iterator node = m_children.GetFirst(); + while (node) + { + wxSizerItem *item = node->GetData(); + + if (item->GetSizer() == sizer) + { + return item; + } + else if (recursive && item->IsSizer()) + { + wxSizerItem *subitem = item->GetSizer()->GetItem( sizer, true ); + if (subitem) + return subitem; + } + + node = node->GetNext(); + } + + return NULL; +} + +wxSizerItem* wxSizer::GetItem( size_t index ) +{ + wxCHECK_MSG( index < m_children.GetCount(), + NULL, + _T("GetItem index is out of range") ); + + return m_children.Item( index )->GetData(); +} + +bool wxSizer::Show( wxWindow *window, bool show, bool recursive ) +{ + wxSizerItem *item = GetItem( window, recursive ); + + if ( item ) + { + item->Show( show ); + return true; + } + + return false; +} + +bool wxSizer::Show( wxSizer *sizer, bool show, bool recursive ) +{ + wxSizerItem *item = GetItem( sizer, recursive ); + + if ( item ) + { + item->Show( show ); + return true; + } + + return false; +} + +bool wxSizer::Show( size_t index, bool show) +{ + wxSizerItem *item = GetItem( index ); + + if ( item ) + { + item->Show( show ); + return true; + } + + return false; +} + +void wxSizer::ShowItems( bool show ) +{ + wxSizerItemList::compatibility_iterator node = m_children.GetFirst(); + while (node) + { + node->GetData()->Show( show ); + node = node->GetNext(); + } +} + +bool wxSizer::IsShown( wxWindow *window ) const +{ + wxSizerItemList::compatibility_iterator node = m_children.GetFirst(); + while (node) + { + wxSizerItem *item = node->GetData(); + + if (item->GetWindow() == window) + { + return item->IsShown(); + } + node = node->GetNext(); + } + + wxFAIL_MSG( _T("IsShown failed to find sizer item") ); + + return false; +} + +bool wxSizer::IsShown( wxSizer *sizer ) const +{ + wxSizerItemList::compatibility_iterator node = m_children.GetFirst(); + while (node) + { + wxSizerItem *item = node->GetData(); + + if (item->GetSizer() == sizer) + { + return item->IsShown(); + } + node = node->GetNext(); + } + + wxFAIL_MSG( _T("IsShown failed to find sizer item") ); + + return false; +} + +bool wxSizer::IsShown( size_t index ) const +{ + wxCHECK_MSG( index < m_children.GetCount(), + false, + _T("IsShown index is out of range") ); + + return m_children.Item( index )->GetData()->IsShown(); +} + + +//--------------------------------------------------------------------------- +// wxGridSizer +//--------------------------------------------------------------------------- + +wxGridSizer::wxGridSizer( int rows, int cols, int vgap, int hgap ) + : m_rows( ( cols == 0 && rows == 0 ) ? 1 : rows ) + , m_cols( cols ) + , m_vgap( vgap ) + , m_hgap( hgap ) +{ +} + +wxGridSizer::wxGridSizer( int cols, int vgap, int hgap ) + : m_rows( cols == 0 ? 1 : 0 ) + , m_cols( cols ) + , m_vgap( vgap ) + , m_hgap( hgap ) +{ +} + +int wxGridSizer::CalcRowsCols(int& nrows, int& ncols) const +{ + int nitems = m_children.GetCount(); + if ( nitems) + { + if ( m_cols ) + { + ncols = m_cols; + nrows = (nitems + m_cols - 1) / m_cols; + } + else if ( m_rows ) + { + ncols = (nitems + m_rows - 1) / m_rows; + nrows = m_rows; + } + else // 0 columns, 0 rows? + { + wxFAIL_MSG( _T("grid sizer must have either rows or columns fixed") ); + + nrows = ncols = 0; + } + } + + return nitems; +} + +void wxGridSizer::RecalcSizes() +{ + int nitems, nrows, ncols; + if ( (nitems = CalcRowsCols(nrows, ncols)) == 0 ) + return; + + wxSize sz( GetSize() ); + wxPoint pt( GetPosition() ); + + int w = (sz.x - (ncols - 1) * m_hgap) / ncols; + int h = (sz.y - (nrows - 1) * m_vgap) / nrows; + + int x = pt.x; + for (int c = 0; c < ncols; c++) + { + int y = pt.y; + for (int r = 0; r < nrows; r++) + { + int i = r * ncols + c; + if (i < nitems) + { + wxSizerItemList::compatibility_iterator node = m_children.Item( i ); + + wxASSERT_MSG( node, _T("Failed to find SizerItemList node") ); + + SetItemBounds( node->GetData(), x, y, w, h); + } + y = y + h + m_vgap; + } + x = x + w + m_hgap; + } +} + +wxSize wxGridSizer::CalcMin() +{ + int nrows, ncols; + if ( CalcRowsCols(nrows, ncols) == 0 ) + return wxSize(); + + // Find the max width and height for any component + int w = 0; + int h = 0; + + wxSizerItemList::compatibility_iterator node = m_children.GetFirst(); + while (node) + { + wxSizerItem *item = node->GetData(); + wxSize sz( item->CalcMin() ); + + w = wxMax( w, sz.x ); + h = wxMax( h, sz.y ); + + node = node->GetNext(); + } + + return wxSize( ncols * w + (ncols-1) * m_hgap, + nrows * h + (nrows-1) * m_vgap ); +} + +void wxGridSizer::SetItemBounds( wxSizerItem *item, int x, int y, int w, int h ) +{ + wxPoint pt( x,y ); + wxSize sz( item->GetMinSizeWithBorder() ); + int flag = item->GetFlag(); + + if ((flag & wxEXPAND) || (flag & wxSHAPED)) + { + sz = wxSize(w, h); + } + else + { + if (flag & wxALIGN_CENTER_HORIZONTAL) + { + pt.x = x + (w - sz.x) / 2; + } + else if (flag & wxALIGN_RIGHT) + { + pt.x = x + (w - sz.x); + } + + if (flag & wxALIGN_CENTER_VERTICAL) + { + pt.y = y + (h - sz.y) / 2; + } + else if (flag & wxALIGN_BOTTOM) + { + pt.y = y + (h - sz.y); + } + } + + item->SetDimension(pt, sz); +} + +//--------------------------------------------------------------------------- +// wxFlexGridSizer +//--------------------------------------------------------------------------- + +wxFlexGridSizer::wxFlexGridSizer( int rows, int cols, int vgap, int hgap ) + : wxGridSizer( rows, cols, vgap, hgap ), + m_flexDirection(wxBOTH), + m_growMode(wxFLEX_GROWMODE_SPECIFIED) +{ +} + +wxFlexGridSizer::wxFlexGridSizer( int cols, int vgap, int hgap ) + : wxGridSizer( cols, vgap, hgap ), + m_flexDirection(wxBOTH), + m_growMode(wxFLEX_GROWMODE_SPECIFIED) +{ +} + +wxFlexGridSizer::~wxFlexGridSizer() +{ +} + +void wxFlexGridSizer::RecalcSizes() +{ + int nitems, nrows, ncols; + if ( (nitems = CalcRowsCols(nrows, ncols)) == 0 ) + return; + + wxPoint pt( GetPosition() ); + wxSize sz( GetSize() ); + + AdjustForGrowables(sz, m_calculatedMinSize, nrows, ncols); + + sz = wxSize( pt.x + sz.x, pt.y + sz.y ); + + int x = pt.x; + for (int c = 0; c < ncols; c++) + { + int y = pt.y; + for (int r = 0; r < nrows; r++) + { + int i = r * ncols + c; + if (i < nitems) + { + wxSizerItemList::compatibility_iterator node = m_children.Item( i ); + + wxASSERT_MSG( node, _T("Failed to find node") ); + + int w = wxMax( 0, wxMin( m_colWidths[c], sz.x - x ) ); + int h = wxMax( 0, wxMin( m_rowHeights[r], sz.y - y ) ); + + SetItemBounds( node->GetData(), x, y, w, h); + } + if (m_rowHeights[r] != -1) + y = y + m_rowHeights[r] + m_vgap; + } + if (m_colWidths[c] != -1) + x = x + m_colWidths[c] + m_hgap; + } +} + +wxSize wxFlexGridSizer::CalcMin() +{ + int nrows, + ncols; + size_t i, s; + + // Number of rows/columns can change as items are added or removed. + if ( !CalcRowsCols(nrows, ncols) ) + return wxSize(); + + m_rowHeights.SetCount(nrows); + m_colWidths.SetCount(ncols); + + // We have to recalcuate the sizes in case the item minimum size has + // changed since the previous layout, or the item has been hidden using + // wxSizer::Show(). If all the items in a row/column are hidden, the final + // dimension of the row/column will be -1, indicating that the column + // itself is hidden. + for( s = m_rowHeights.GetCount(), i = 0; i < s; ++i ) + m_rowHeights[ i ] = -1; + for( s = m_colWidths.GetCount(), i = 0; i < s; ++i ) + m_colWidths[ i ] = -1; + + wxSizerItemList::compatibility_iterator node = m_children.GetFirst(); + + i = 0; + while (node) + { + wxSizerItem *item = node->GetData(); + if ( item->IsShown() ) + { + wxSize sz( item->CalcMin() ); + int row = i / ncols; + int col = i % ncols; + + m_rowHeights[ row ] = wxMax( wxMax( 0, sz.y ), m_rowHeights[ row ] ); + m_colWidths[ col ] = wxMax( wxMax( 0, sz.x ), m_colWidths[ col ] ); + } + + node = node->GetNext(); + i++; + } + + AdjustForFlexDirection(); + + // Sum total minimum size, including gaps between rows/columns. + // -1 is used as a magic number meaning empty column. + int width = 0; + for (int col = 0; col < ncols; col++) + if ( m_colWidths[ col ] != -1 ) + width += m_colWidths[ col ] + m_hgap; + if (width > 0) + width -= m_hgap; + + int height = 0; + for (int row = 0; row < nrows; row++) + if ( m_rowHeights[ row ] != -1 ) + height += m_rowHeights[ row ] + m_vgap; + if (height > 0) + height -= m_vgap; + + m_calculatedMinSize = wxSize( width, height ); + return m_calculatedMinSize; +} + +void wxFlexGridSizer::AdjustForFlexDirection() +{ + // the logic in CalcMin works when we resize flexibly in both directions + // but maybe this is not the case + if ( m_flexDirection != wxBOTH ) + { + // select the array corresponding to the direction in which we do *not* + // resize flexibly + wxArrayInt& array = m_flexDirection == wxVERTICAL ? m_colWidths + : m_rowHeights; + + const size_t count = array.GetCount(); + + // find the largest value in this array + size_t n; + int largest = 0; + + for ( n = 0; n < count; ++n ) + { + if ( array[n] > largest ) + largest = array[n]; + } + + // and now fill it with the largest value + for ( n = 0; n < count; ++n ) + { + // don't touch hidden rows + if ( array[n] != -1 ) + array[n] = largest; + } + } +} + + +void wxFlexGridSizer::AdjustForGrowables(const wxSize& sz, const wxSize& minsz, + int nrows, int ncols) +{ + // what to do with the rows? by default, resize them proportionally + if ( sz.y > minsz.y && ( (m_flexDirection & wxVERTICAL) || (m_growMode == wxFLEX_GROWMODE_SPECIFIED) ) ) + { + int sum_proportions = 0; + int growable_space = 0; + int num = 0; + size_t idx; + for (idx = 0; idx < m_growableRows.GetCount(); idx++) + { + // Since the number of rows/columns can change as items are + // inserted/deleted, we need to verify at runtime that the + // requested growable rows/columns are still valid. + if (m_growableRows[idx] >= nrows) + continue; + + // If all items in a row/column are hidden, that row/column will + // have a dimension of -1. This causes the row/column to be + // hidden completely. + if (m_rowHeights[ m_growableRows[idx] ] == -1) + continue; + sum_proportions += m_growableRowsProportions[idx]; + growable_space += m_rowHeights[ m_growableRows[idx] ]; + num++; + } + + if (num > 0) + { + for (idx = 0; idx < m_growableRows.GetCount(); idx++) + { + if (m_growableRows[idx] >= nrows ) + continue; + if (m_rowHeights[ m_growableRows[idx] ] != -1) + { + int delta = (sz.y - minsz.y); + if (sum_proportions == 0) + delta = (delta/num) + m_rowHeights[ m_growableRows[idx] ]; + else + delta = ((delta+growable_space)*m_growableRowsProportions[idx]) / sum_proportions; + m_rowHeights[ m_growableRows[idx] ] = delta; + } + } + } + } + else if ( (m_growMode == wxFLEX_GROWMODE_ALL) && (sz.y > minsz.y) ) + { + // rounding problem? + for ( int row = 0; row < nrows; ++row ) + m_rowHeights[ row ] = sz.y / nrows; + } + + // the same logic as above but for the columns + if ( sz.x > minsz.x && ( (m_flexDirection & wxHORIZONTAL) || (m_growMode == wxFLEX_GROWMODE_SPECIFIED) ) ) + { + int sum_proportions = 0; + int growable_space = 0; + int num = 0; + size_t idx; + for (idx = 0; idx < m_growableCols.GetCount(); idx++) + { + // Since the number of rows/columns can change as items are + // inserted/deleted, we need to verify at runtime that the + // requested growable rows/columns are still valid. + if (m_growableCols[idx] >= ncols) + continue; + + // If all items in a row/column are hidden, that row/column will + // have a dimension of -1. This causes the column to be hidden + // completely. + if (m_colWidths[ m_growableCols[idx] ] == -1) + continue; + sum_proportions += m_growableColsProportions[idx]; + growable_space += m_colWidths[ m_growableCols[idx] ]; + num++; + } + + if (num > 0) + { + for (idx = 0; idx < m_growableCols.GetCount(); idx++) + { + if (m_growableCols[idx] >= ncols ) + continue; + if (m_colWidths[ m_growableCols[idx] ] != -1) + { + int delta = (sz.x - minsz.x); + if (sum_proportions == 0) + delta = (delta/num) + m_colWidths[ m_growableCols[idx] ]; + else + delta = ((delta+growable_space)*m_growableColsProportions[idx])/sum_proportions; + m_colWidths[ m_growableCols[idx] ] = delta; + } + } + } + } + else if ( (m_growMode == wxFLEX_GROWMODE_ALL) && (sz.x > minsz.x) ) + { + for ( int col=0; col < ncols; ++col ) + m_colWidths[ col ] = sz.x / ncols; + } +} + + +void wxFlexGridSizer::AddGrowableRow( size_t idx, int proportion ) +{ + m_growableRows.Add( idx ); + m_growableRowsProportions.Add( proportion ); +} + +void wxFlexGridSizer::AddGrowableCol( size_t idx, int proportion ) +{ + m_growableCols.Add( idx ); + m_growableColsProportions.Add( proportion ); +} + +// helper function for RemoveGrowableCol/Row() +static void +DoRemoveFromArrays(size_t idx, wxArrayInt& items, wxArrayInt& proportions) +{ + const size_t count = items.size(); + for ( size_t n = 0; n < count; n++ ) + { + if ( (size_t)items[n] == idx ) + { + items.RemoveAt(n); + proportions.RemoveAt(n); + return; + } + } + + wxFAIL_MSG( _T("column/row is already not growable") ); +} + +void wxFlexGridSizer::RemoveGrowableCol( size_t idx ) +{ + DoRemoveFromArrays(idx, m_growableCols, m_growableColsProportions); +} + +void wxFlexGridSizer::RemoveGrowableRow( size_t idx ) +{ + DoRemoveFromArrays(idx, m_growableRows, m_growableRowsProportions); +} + +//--------------------------------------------------------------------------- +// wxBoxSizer +//--------------------------------------------------------------------------- + +wxBoxSizer::wxBoxSizer( int orient ) + : m_orient( orient ) +{ +} + +void wxBoxSizer::RecalcSizes() +{ + if (m_children.GetCount() == 0) + return; + + int delta = 0; + if (m_stretchable) + { + if (m_orient == wxHORIZONTAL) + delta = m_size.x - m_fixedWidth; + else + delta = m_size.y - m_fixedHeight; + } + + wxPoint pt( m_position ); + + int stretchable = m_stretchable; + wxSizerItemList::compatibility_iterator node = m_children.GetFirst(); + while (node) + { + wxSizerItem *item = node->GetData(); + + if (item->IsShown()) + { + wxSize size( item->GetMinSizeWithBorder() ); + + if (m_orient == wxVERTICAL) + { + wxCoord height = size.y; + if (item->GetProportion()) + { + // Because of at least one visible item has non-zero + // proportion then m_stretchable is not zero + height = (delta * item->GetProportion()) / stretchable; + delta -= height; + stretchable -= item->GetProportion(); + } + + wxPoint child_pos( pt ); + wxSize child_size( size.x, height ); + + if (item->GetFlag() & (wxEXPAND | wxSHAPED)) + child_size.x = m_size.x; + else if (item->GetFlag() & wxALIGN_RIGHT) + child_pos.x += m_size.x - size.x; + else if (item->GetFlag() & (wxCENTER | wxALIGN_CENTER_HORIZONTAL)) + // XXX wxCENTER is added for backward compatibility; + // wxALIGN_CENTER should be used in new code + child_pos.x += (m_size.x - size.x) / 2; + + item->SetDimension( child_pos, child_size ); + + pt.y += height; + } + else + { + wxCoord width = size.x; + if (item->GetProportion()) + { + // Because of at least one visible item has non-zero + // proportion then m_stretchable is not zero + width = (delta * item->GetProportion()) / stretchable; + delta -= width; + stretchable -= item->GetProportion(); + } + + wxPoint child_pos( pt ); + wxSize child_size( width, size.y ); + + if (item->GetFlag() & (wxEXPAND | wxSHAPED)) + child_size.y = m_size.y; + else if (item->GetFlag() & wxALIGN_BOTTOM) + child_pos.y += m_size.y - size.y; + else if (item->GetFlag() & (wxCENTER | wxALIGN_CENTER_VERTICAL)) + // XXX wxCENTER is added for backward compatibility; + // wxALIGN_CENTER should be used in new code + child_pos.y += (m_size.y - size.y) / 2; + + if ( m_containingWindow ) + { + child_pos.x = m_containingWindow->AdjustForLayoutDirection + ( + child_pos.x, + width, + m_size.x + ); + } + + item->SetDimension( child_pos, child_size ); + + pt.x += width; + } + } + + node = node->GetNext(); + } +} + +wxSize wxBoxSizer::CalcMin() +{ + if (m_children.GetCount() == 0) + return wxSize(); + + m_stretchable = 0; + m_minWidth = 0; + m_minHeight = 0; + m_fixedWidth = 0; + m_fixedHeight = 0; + + // precalc item minsizes and count proportions + wxSizerItemList::compatibility_iterator node = m_children.GetFirst(); + while (node) + { + wxSizerItem *item = node->GetData(); + + if ( item->IsShown() ) + { + item->CalcMin(); // result is stored in the item + + m_stretchable += item->GetProportion(); + } + + node = node->GetNext(); + } + + // Total minimum size (width or height) of sizer + int maxMinSize = 0; + + node = m_children.GetFirst(); + while (node) + { + wxSizerItem *item = node->GetData(); + + if (item->IsShown() && item->GetProportion() != 0) + { + int stretch = item->GetProportion(); + wxSize size( item->GetMinSizeWithBorder() ); + int minSize; + + // Integer division rounded up is (a + b - 1) / b + // Round up needed in order to guarantee that all + // all items will have size not less then their min size + if (m_orient == wxHORIZONTAL) + minSize = ( size.x*m_stretchable + stretch - 1)/stretch; + else + minSize = ( size.y*m_stretchable + stretch - 1)/stretch; + + if (minSize > maxMinSize) + maxMinSize = minSize; + } + node = node->GetNext(); + } + + // Calculate overall minimum size + node = m_children.GetFirst(); + while (node) + { + wxSizerItem *item = node->GetData(); + + if (item->IsShown()) + { + wxSize size( item->GetMinSizeWithBorder() ); + if (item->GetProportion() != 0) + { + if (m_orient == wxHORIZONTAL) + size.x = (maxMinSize*item->GetProportion())/m_stretchable; + else + size.y = (maxMinSize*item->GetProportion())/m_stretchable; + } + else + { + if (m_orient == wxVERTICAL) + { + m_fixedHeight += size.y; + m_fixedWidth = wxMax( m_fixedWidth, size.x ); + } + else + { + m_fixedWidth += size.x; + m_fixedHeight = wxMax( m_fixedHeight, size.y ); + } + } + + if (m_orient == wxHORIZONTAL) + { + m_minWidth += size.x; + m_minHeight = wxMax( m_minHeight, size.y ); + } + else + { + m_minHeight += size.y; + m_minWidth = wxMax( m_minWidth, size.x ); + } + } + node = node->GetNext(); + } + + return wxSize( m_minWidth, m_minHeight ); +} + +//--------------------------------------------------------------------------- +// wxStaticBoxSizer +//--------------------------------------------------------------------------- + +#if wxUSE_STATBOX + +wxStaticBoxSizer::wxStaticBoxSizer( wxStaticBox *box, int orient ) + : wxBoxSizer( orient ), + m_staticBox( box ) +{ + wxASSERT_MSG( box, wxT("wxStaticBoxSizer needs a static box") ); + + // do this so that our Detach() is called if the static box is destroyed + // before we are + m_staticBox->SetContainingSizer(this); +} + +wxStaticBoxSizer::wxStaticBoxSizer(int orient, wxWindow *win, const wxString& s) + : wxBoxSizer(orient), + m_staticBox(new wxStaticBox(win, wxID_ANY, s)) +{ + // same as above + m_staticBox->SetContainingSizer(this); +} + +wxStaticBoxSizer::~wxStaticBoxSizer() +{ + delete m_staticBox; +} + +static void GetStaticBoxBorders( wxStaticBox *box, + int *borderTop, + int *borderOther) +{ + // this has to be done platform by platform as there is no way to + // guess the thickness of a wxStaticBox border + box->GetBordersForSizer(borderTop, borderOther); +} + +void wxStaticBoxSizer::RecalcSizes() +{ + int top_border, other_border; + GetStaticBoxBorders(m_staticBox, &top_border, &other_border); + + m_staticBox->SetSize( m_position.x, m_position.y, m_size.x, m_size.y ); + + wxPoint old_pos( m_position ); + m_position.x += other_border; + m_position.y += top_border; + wxSize old_size( m_size ); + m_size.x -= 2*other_border; + m_size.y -= top_border + other_border; + + wxBoxSizer::RecalcSizes(); + + m_position = old_pos; + m_size = old_size; +} + +wxSize wxStaticBoxSizer::CalcMin() +{ + int top_border, other_border; + GetStaticBoxBorders(m_staticBox, &top_border, &other_border); + + wxSize ret( wxBoxSizer::CalcMin() ); + ret.x += 2*other_border; + ret.y += other_border + top_border; + + return ret; +} + +void wxStaticBoxSizer::ShowItems( bool show ) +{ + m_staticBox->Show( show ); + wxBoxSizer::ShowItems( show ); +} + +bool wxStaticBoxSizer::Detach( wxWindow *window ) +{ + // avoid deleting m_staticBox in our dtor if it's being detached from the + // sizer (which can happen because it's being already destroyed for + // example) + if ( window == m_staticBox ) + { + m_staticBox = NULL; + return true; + } + + return wxSizer::Detach( window ); +} + +#endif // wxUSE_STATBOX + +#if wxUSE_BUTTON + +wxStdDialogButtonSizer::wxStdDialogButtonSizer() + : wxBoxSizer(wxHORIZONTAL) +{ + // Vertical buttons with lots of space on either side + // looks rubbish on WinCE, so let's not do this for now. + // If we are going to use vertical buttons, we should + // put the sizer to the right of other controls in the dialog, + // and that's beyond the scope of this sizer. +#ifndef __WXWINCE__ + bool is_pda = (wxSystemSettings::GetScreenType() <= wxSYS_SCREEN_PDA); + // If we have a PDA screen, put yes/no button over + // all other buttons, otherwise on the left side. + if (is_pda) + m_orient = wxVERTICAL; +#endif + + m_buttonAffirmative = NULL; + m_buttonApply = NULL; + m_buttonNegative = NULL; + m_buttonCancel = NULL; + m_buttonHelp = NULL; +} + +void wxStdDialogButtonSizer::AddButton(wxButton *mybutton) +{ + switch (mybutton->GetId()) + { + case wxID_OK: + case wxID_YES: + case wxID_SAVE: + m_buttonAffirmative = mybutton; + break; + case wxID_APPLY: + m_buttonApply = mybutton; + break; + case wxID_NO: + m_buttonNegative = mybutton; + break; + case wxID_CANCEL: + m_buttonCancel = mybutton; + break; + case wxID_HELP: + case wxID_CONTEXT_HELP: + m_buttonHelp = mybutton; + break; + default: + break; + } +} + +void wxStdDialogButtonSizer::SetAffirmativeButton( wxButton *button ) +{ + m_buttonAffirmative = button; +} + +void wxStdDialogButtonSizer::SetNegativeButton( wxButton *button ) +{ + m_buttonNegative = button; +} + +void wxStdDialogButtonSizer::SetCancelButton( wxButton *button ) +{ + m_buttonCancel = button; +} + +void wxStdDialogButtonSizer::Realize() +{ +#ifdef __WXMAC__ + Add(0, 0, 0, wxLEFT, 6); + if (m_buttonHelp) + Add((wxWindow*)m_buttonHelp, 0, wxALIGN_CENTRE | wxLEFT | wxRIGHT, 6); + + if (m_buttonNegative){ + // HIG POLICE BULLETIN - destructive buttons need extra padding + // 24 pixels on either side + Add((wxWindow*)m_buttonNegative, 0, wxALIGN_CENTRE | wxLEFT | wxRIGHT, 12); + } + + // extra whitespace between help/negative and cancel/ok buttons + Add(0, 0, 1, wxEXPAND, 0); + + if (m_buttonCancel){ + Add((wxWindow*)m_buttonCancel, 0, wxALIGN_CENTRE | wxLEFT | wxRIGHT, 6); + // Cancel or help should be default + // m_buttonCancel->SetDefaultButton(); + } + + // Ugh, Mac doesn't really have apply dialogs, so I'll just + // figure the best place is between Cancel and OK + if (m_buttonApply) + Add((wxWindow*)m_buttonApply, 0, wxALIGN_CENTRE | wxLEFT | wxRIGHT, 6); + + if (m_buttonAffirmative){ + Add((wxWindow*)m_buttonAffirmative, 0, wxALIGN_CENTRE | wxLEFT, 6); + + if (m_buttonAffirmative->GetId() == wxID_SAVE){ + // these buttons have set labels under Mac so we should use them + m_buttonAffirmative->SetLabel(_("Save")); + if (m_buttonNegative) + m_buttonNegative->SetLabel(_("Don't Save")); + } + } + + // Extra space around and at the right + Add(12, 24); +#elif defined(__WXGTK20__) + Add(0, 0, 0, wxLEFT, 9); + if (m_buttonHelp) + Add((wxWindow*)m_buttonHelp, 0, wxALIGN_CENTRE | wxLEFT | wxRIGHT, 3); + + // extra whitespace between help and cancel/ok buttons + Add(0, 0, 1, wxEXPAND, 0); + + if (m_buttonNegative){ + Add((wxWindow*)m_buttonNegative, 0, wxALIGN_CENTRE | wxLEFT | wxRIGHT, 3); + } + + if (m_buttonCancel){ + Add((wxWindow*)m_buttonCancel, 0, wxALIGN_CENTRE | wxLEFT | wxRIGHT, 3); + // Cancel or help should be default + // m_buttonCancel->SetDefaultButton(); + } + + if (m_buttonApply) + Add((wxWindow*)m_buttonApply, 0, wxALIGN_CENTRE | wxLEFT | wxRIGHT, 3); + + if (m_buttonAffirmative) + Add((wxWindow*)m_buttonAffirmative, 0, wxALIGN_CENTRE | wxLEFT, 6); +#elif defined(__WXMSW__) + // Windows + + // right-justify buttons + Add(0, 0, 1, wxEXPAND, 0); + + if (m_buttonAffirmative){ + Add((wxWindow*)m_buttonAffirmative, 0, wxALIGN_CENTRE | wxLEFT | wxRIGHT, m_buttonAffirmative->ConvertDialogToPixels(wxSize(2, 0)).x); + } + + if (m_buttonNegative){ + Add((wxWindow*)m_buttonNegative, 0, wxALIGN_CENTRE | wxLEFT | wxRIGHT, m_buttonNegative->ConvertDialogToPixels(wxSize(2, 0)).x); + } + + if (m_buttonCancel){ + Add((wxWindow*)m_buttonCancel, 0, wxALIGN_CENTRE | wxLEFT | wxRIGHT, m_buttonCancel->ConvertDialogToPixels(wxSize(2, 0)).x); + } + if (m_buttonApply) + Add((wxWindow*)m_buttonApply, 0, wxALIGN_CENTRE | wxLEFT | wxRIGHT, m_buttonApply->ConvertDialogToPixels(wxSize(2, 0)).x); + + if (m_buttonHelp) + Add((wxWindow*)m_buttonHelp, 0, wxALIGN_CENTRE | wxLEFT | wxRIGHT, m_buttonHelp->ConvertDialogToPixels(wxSize(2, 0)).x); +#else + // GTK+1 and any other platform + + // Add(0, 0, 0, wxLEFT, 5); // Not sure what this was for but it unbalances the dialog + if (m_buttonHelp) + Add((wxWindow*)m_buttonHelp, 0, wxALIGN_CENTRE | wxLEFT | wxRIGHT, m_buttonHelp->ConvertDialogToPixels(wxSize(4, 0)).x); + + // extra whitespace between help and cancel/ok buttons + Add(0, 0, 1, wxEXPAND, 0); + + if (m_buttonApply) + Add((wxWindow*)m_buttonApply, 0, wxALIGN_CENTRE | wxLEFT | wxRIGHT, m_buttonApply->ConvertDialogToPixels(wxSize(4, 0)).x); + + if (m_buttonAffirmative){ + Add((wxWindow*)m_buttonAffirmative, 0, wxALIGN_CENTRE | wxLEFT | wxRIGHT, m_buttonAffirmative->ConvertDialogToPixels(wxSize(4, 0)).x); + } + + if (m_buttonNegative){ + Add((wxWindow*)m_buttonNegative, 0, wxALIGN_CENTRE | wxLEFT | wxRIGHT, m_buttonNegative->ConvertDialogToPixels(wxSize(4, 0)).x); + } + + if (m_buttonCancel){ + Add((wxWindow*)m_buttonCancel, 0, wxALIGN_CENTRE | wxLEFT | wxRIGHT, m_buttonCancel->ConvertDialogToPixels(wxSize(4, 0)).x); + // Cancel or help should be default + // m_buttonCancel->SetDefaultButton(); + } + +#endif +} + +#endif // wxUSE_BUTTON + +#if WXWIN_COMPATIBILITY_2_4 + +// ---------------------------------------------------------------------------- +// wxNotebookSizer +// ---------------------------------------------------------------------------- + +#if wxUSE_BOOKCTRL +IMPLEMENT_CLASS(wxBookCtrlSizer, wxSizer) +#if wxUSE_NOTEBOOK +IMPLEMENT_CLASS(wxNotebookSizer, wxBookCtrlSizer) +#endif // wxUSE_NOTEBOOK +#endif // wxUSE_BOOKCTRL + +#if wxUSE_BOOKCTRL + +#if WXWIN_COMPATIBILITY_2_6 + +wxBookCtrlSizer::wxBookCtrlSizer(wxBookCtrlBase *bookctrl) + : m_bookctrl(bookctrl) +{ + wxASSERT_MSG( bookctrl, wxT("wxBookCtrlSizer needs a control") ); +} + +#endif // WXWIN_COMPATIBILITY_2_6 + +void wxBookCtrlSizer::RecalcSizes() +{ + m_bookctrl->SetSize( m_position.x, m_position.y, m_size.x, m_size.y ); +} + +wxSize wxBookCtrlSizer::CalcMin() +{ + wxSize sizeBorder = m_bookctrl->CalcSizeFromPage(wxSize(0,0)); + + sizeBorder.x += 5; + sizeBorder.y += 5; + + if ( m_bookctrl->GetPageCount() == 0 ) + { + return wxSize(sizeBorder.x + 10, sizeBorder.y + 10); + } + + int maxX = 0; + int maxY = 0; + + wxWindowList::compatibility_iterator + node = m_bookctrl->GetChildren().GetFirst(); + while (node) + { + wxWindow *item = node->GetData(); + wxSizer *itemsizer = item->GetSizer(); + + if (itemsizer) + { + wxSize subsize( itemsizer->CalcMin() ); + + if (subsize.x > maxX) + maxX = subsize.x; + if (subsize.y > maxY) + maxY = subsize.y; + } + + node = node->GetNext(); + } + + return wxSize( maxX, maxY ) + sizeBorder; +} + +#if wxUSE_NOTEBOOK + +#if WXWIN_COMPATIBILITY_2_6 + +wxNotebookSizer::wxNotebookSizer(wxNotebook *nb) +{ + wxASSERT_MSG( nb, wxT("wxNotebookSizer needs a control") ); + m_bookctrl = nb; +} + +#endif // WXWIN_COMPATIBILITY_2_6 + +#endif // wxUSE_NOTEBOOOK +#endif // wxUSE_BOOKCTRL + +#endif // WXWIN_COMPATIBILITY_2_4 diff --git a/Externals/wxWidgets/src/common/socket.cpp b/Externals/wxWidgets/src/common/socket.cpp new file mode 100644 index 0000000000..6cdcfb2bcc --- /dev/null +++ b/Externals/wxWidgets/src/common/socket.cpp @@ -0,0 +1,1420 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/socket.cpp +// Purpose: Socket handler classes +// Authors: Guilhem Lavaux, Guillermo Rodriguez Garcia +// Created: April 1997 +// Copyright: (C) 1999-1997, Guilhem Lavaux +// (C) 2000-1999, Guillermo Rodriguez Garcia +// RCS_ID: $Id: socket.cpp 44662 2007-03-07 23:21:48Z VZ $ +// License: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ========================================================================== +// Declarations +// ========================================================================== + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_SOCKETS + +#include "wx/socket.h" + +#ifndef WX_PRECOMP + #include "wx/object.h" + #include "wx/string.h" + #include "wx/intl.h" + #include "wx/log.h" + #include "wx/event.h" + #include "wx/app.h" + #include "wx/utils.h" + #include "wx/timer.h" + #include "wx/module.h" +#endif + +#include "wx/apptrait.h" + +#include "wx/sckaddr.h" +#include "wx/datetime.h" + +// DLL options compatibility check: +#include "wx/build.h" +WX_CHECK_BUILD_OPTIONS("wxNet") + +// -------------------------------------------------------------------------- +// macros and constants +// -------------------------------------------------------------------------- + +// discard buffer +#define MAX_DISCARD_SIZE (10 * 1024) + +// what to do within waits: we have 2 cases: from the main thread itself we +// have to call wxYield() to let the events (including the GUI events and the +// low-level (not wxWidgets) events from GSocket) be processed. From another +// thread it is enough to just call wxThread::Yield() which will give away the +// rest of our time slice: the explanation is that the events will be processed +// by the main thread anyhow, without calling wxYield(), but we don't want to +// eat the CPU time uselessly while sitting in the loop waiting for the data +#if wxUSE_THREADS + #define PROCESS_EVENTS() \ + { \ + if ( wxThread::IsMain() ) \ + wxYield(); \ + else \ + wxThread::Yield(); \ + } +#else // !wxUSE_THREADS + #define PROCESS_EVENTS() wxYield() +#endif // wxUSE_THREADS/!wxUSE_THREADS + +#define wxTRACE_Socket _T("wxSocket") + +// -------------------------------------------------------------------------- +// wxWin macros +// -------------------------------------------------------------------------- + +IMPLEMENT_CLASS(wxSocketBase, wxObject) +IMPLEMENT_CLASS(wxSocketServer, wxSocketBase) +IMPLEMENT_CLASS(wxSocketClient, wxSocketBase) +IMPLEMENT_CLASS(wxDatagramSocket, wxSocketBase) +IMPLEMENT_DYNAMIC_CLASS(wxSocketEvent, wxEvent) + +// -------------------------------------------------------------------------- +// private classes +// -------------------------------------------------------------------------- + +class wxSocketState : public wxObject +{ +public: + wxSocketFlags m_flags; + wxSocketEventFlags m_eventmask; + bool m_notify; + void *m_clientData; + +public: + wxSocketState() : wxObject() {} + + DECLARE_NO_COPY_CLASS(wxSocketState) +}; + +// ========================================================================== +// wxSocketBase +// ========================================================================== + +// -------------------------------------------------------------------------- +// Initialization and shutdown +// -------------------------------------------------------------------------- + +// FIXME-MT: all this is MT-unsafe, of course, we should protect all accesses +// to m_countInit with a crit section +size_t wxSocketBase::m_countInit = 0; + +bool wxSocketBase::IsInitialized() +{ + return m_countInit > 0; +} + +bool wxSocketBase::Initialize() +{ + if ( !m_countInit++ ) + { + /* + Details: Initialize() creates a hidden window as a sink for socket + events, such as 'read completed'. wxMSW has only one message loop + for the main thread. If Initialize is called in a secondary thread, + the socket window will be created for the secondary thread, but + since there is no message loop on this thread, it will never + receive events and all socket operations will time out. + BTW, the main thread must not be stopped using sleep or block + on a semaphore (a bad idea in any case) or socket operations + will time out. + + On the Mac side, Initialize() stores a pointer to the CFRunLoop for + the main thread. Because secondary threads do not have run loops, + adding event notifications to the "Current" loop would have no + effect at all, events would never fire. + */ + wxASSERT_MSG( wxIsMainThread(), + wxT("Call wxSocketBase::Initialize() from the main thread first!")); + + wxAppTraits *traits = wxAppConsole::GetInstance() ? + wxAppConsole::GetInstance()->GetTraits() : NULL; + GSocketGUIFunctionsTable *functions = + traits ? traits->GetSocketGUIFunctionsTable() : NULL; + GSocket_SetGUIFunctions(functions); + + if ( !GSocket_Init() ) + { + m_countInit--; + + return false; + } + } + + return true; +} + +void wxSocketBase::Shutdown() +{ + // we should be initialized + wxASSERT_MSG( m_countInit, _T("extra call to Shutdown()") ); + if ( --m_countInit == 0 ) + { + GSocket_Cleanup(); + } +} + +// -------------------------------------------------------------------------- +// Ctor and dtor +// -------------------------------------------------------------------------- + +void wxSocketBase::Init() +{ + m_socket = NULL; + m_type = wxSOCKET_UNINIT; + + // state + m_flags = 0; + m_connected = + m_establishing = + m_reading = + m_writing = + m_error = false; + m_lcount = 0; + m_timeout = 600; + m_beingDeleted = false; + + // pushback buffer + m_unread = NULL; + m_unrd_size = 0; + m_unrd_cur = 0; + + // events + m_id = wxID_ANY; + m_handler = NULL; + m_clientData = NULL; + m_notify = false; + m_eventmask = 0; + + if ( !IsInitialized() ) + { + // this Initialize() will be undone by wxSocketModule::OnExit(), all the + // other calls to it should be matched by a call to Shutdown() + Initialize(); + } +} + +wxSocketBase::wxSocketBase() +{ + Init(); +} + +wxSocketBase::wxSocketBase(wxSocketFlags flags, wxSocketType type) +{ + Init(); + + m_flags = flags; + m_type = type; +} + +wxSocketBase::~wxSocketBase() +{ + // Just in case the app called Destroy() *and* then deleted + // the socket immediately: don't leave dangling pointers. + wxAppTraits *traits = wxTheApp ? wxTheApp->GetTraits() : NULL; + if ( traits ) + traits->RemoveFromPendingDelete(this); + + // Shutdown and close the socket + if (!m_beingDeleted) + Close(); + + // Destroy the GSocket object + if (m_socket) + delete m_socket; + + // Free the pushback buffer + if (m_unread) + free(m_unread); +} + +bool wxSocketBase::Destroy() +{ + // Delayed destruction: the socket will be deleted during the next + // idle loop iteration. This ensures that all pending events have + // been processed. + m_beingDeleted = true; + + // Shutdown and close the socket + Close(); + + // Supress events from now on + Notify(false); + + // schedule this object for deletion + wxAppTraits *traits = wxTheApp ? wxTheApp->GetTraits() : NULL; + if ( traits ) + { + // let the traits object decide what to do with us + traits->ScheduleForDestroy(this); + } + else // no app or no traits + { + // in wxBase we might have no app object at all, don't leak memory + delete this; + } + + return true; +} + +// -------------------------------------------------------------------------- +// Basic IO calls +// -------------------------------------------------------------------------- + +// The following IO operations update m_error and m_lcount: +// {Read, Write, ReadMsg, WriteMsg, Peek, Unread, Discard} +// +// TODO: Should Connect, Accept and AcceptWith update m_error? + +bool wxSocketBase::Close() +{ + // Interrupt pending waits + InterruptWait(); + + if (m_socket) + { + // Disable callbacks + m_socket->UnsetCallback(GSOCK_INPUT_FLAG | GSOCK_OUTPUT_FLAG | + GSOCK_LOST_FLAG | GSOCK_CONNECTION_FLAG); + + // Shutdown the connection + m_socket->Shutdown(); + } + + m_connected = false; + m_establishing = false; + return true; +} + +wxSocketBase& wxSocketBase::Read(void* buffer, wxUint32 nbytes) +{ + // Mask read events + m_reading = true; + + m_lcount = _Read(buffer, nbytes); + + // If in wxSOCKET_WAITALL mode, all bytes should have been read. + if (m_flags & wxSOCKET_WAITALL) + m_error = (m_lcount != nbytes); + else + m_error = (m_lcount == 0); + + // Allow read events from now on + m_reading = false; + + return *this; +} + +wxUint32 wxSocketBase::_Read(void* buffer, wxUint32 nbytes) +{ + int total; + + // Try the pushback buffer first + total = GetPushback(buffer, nbytes, false); + nbytes -= total; + buffer = (char *)buffer + total; + + // Return now in one of the following cases: + // - the socket is invalid, + // - we got all the data + if ( !m_socket || + !nbytes ) + return total; + + // Possible combinations (they are checked in this order) + // wxSOCKET_NOWAIT + // wxSOCKET_WAITALL (with or without wxSOCKET_BLOCK) + // wxSOCKET_BLOCK + // wxSOCKET_NONE + // + int ret; + if (m_flags & wxSOCKET_NOWAIT) + { + m_socket->SetNonBlocking(1); + ret = m_socket->Read((char *)buffer, nbytes); + m_socket->SetNonBlocking(0); + + if (ret > 0) + total += ret; + } + else + { + bool more = true; + + while (more) + { + if ( !(m_flags & wxSOCKET_BLOCK) && !WaitForRead() ) + break; + + ret = m_socket->Read((char *)buffer, nbytes); + + if (ret > 0) + { + total += ret; + nbytes -= ret; + buffer = (char *)buffer + ret; + } + + // If we got here and wxSOCKET_WAITALL is not set, we can leave + // now. Otherwise, wait until we recv all the data or until there + // is an error. + // + more = (ret > 0 && nbytes > 0 && (m_flags & wxSOCKET_WAITALL)); + } + } + + return total; +} + +wxSocketBase& wxSocketBase::ReadMsg(void* buffer, wxUint32 nbytes) +{ + wxUint32 len, len2, sig, total; + bool error; + int old_flags; + struct + { + unsigned char sig[4]; + unsigned char len[4]; + } msg; + + // Mask read events + m_reading = true; + + total = 0; + error = true; + old_flags = m_flags; + SetFlags((m_flags & wxSOCKET_BLOCK) | wxSOCKET_WAITALL); + + if (_Read(&msg, sizeof(msg)) != sizeof(msg)) + goto exit; + + sig = (wxUint32)msg.sig[0]; + sig |= (wxUint32)(msg.sig[1] << 8); + sig |= (wxUint32)(msg.sig[2] << 16); + sig |= (wxUint32)(msg.sig[3] << 24); + + if (sig != 0xfeeddead) + { + wxLogWarning(_("wxSocket: invalid signature in ReadMsg.")); + goto exit; + } + + len = (wxUint32)msg.len[0]; + len |= (wxUint32)(msg.len[1] << 8); + len |= (wxUint32)(msg.len[2] << 16); + len |= (wxUint32)(msg.len[3] << 24); + + if (len > nbytes) + { + len2 = len - nbytes; + len = nbytes; + } + else + len2 = 0; + + // Don't attemp to read if the msg was zero bytes long. + if (len) + { + total = _Read(buffer, len); + + if (total != len) + goto exit; + } + if (len2) + { + char *discard_buffer = new char[MAX_DISCARD_SIZE]; + long discard_len; + + // NOTE: discarded bytes don't add to m_lcount. + do + { + discard_len = ((len2 > MAX_DISCARD_SIZE)? MAX_DISCARD_SIZE : len2); + discard_len = _Read(discard_buffer, (wxUint32)discard_len); + len2 -= (wxUint32)discard_len; + } + while ((discard_len > 0) && len2); + + delete [] discard_buffer; + + if (len2 != 0) + goto exit; + } + if (_Read(&msg, sizeof(msg)) != sizeof(msg)) + goto exit; + + sig = (wxUint32)msg.sig[0]; + sig |= (wxUint32)(msg.sig[1] << 8); + sig |= (wxUint32)(msg.sig[2] << 16); + sig |= (wxUint32)(msg.sig[3] << 24); + + if (sig != 0xdeadfeed) + { + wxLogWarning(_("wxSocket: invalid signature in ReadMsg.")); + goto exit; + } + + // everything was OK + error = false; + +exit: + m_error = error; + m_lcount = total; + m_reading = false; + SetFlags(old_flags); + + return *this; +} + +wxSocketBase& wxSocketBase::Peek(void* buffer, wxUint32 nbytes) +{ + // Mask read events + m_reading = true; + + m_lcount = _Read(buffer, nbytes); + Pushback(buffer, m_lcount); + + // If in wxSOCKET_WAITALL mode, all bytes should have been read. + if (m_flags & wxSOCKET_WAITALL) + m_error = (m_lcount != nbytes); + else + m_error = (m_lcount == 0); + + // Allow read events again + m_reading = false; + + return *this; +} + +wxSocketBase& wxSocketBase::Write(const void *buffer, wxUint32 nbytes) +{ + // Mask write events + m_writing = true; + + m_lcount = _Write(buffer, nbytes); + + // If in wxSOCKET_WAITALL mode, all bytes should have been written. + if (m_flags & wxSOCKET_WAITALL) + m_error = (m_lcount != nbytes); + else + m_error = (m_lcount == 0); + + // Allow write events again + m_writing = false; + + return *this; +} + +wxUint32 wxSocketBase::_Write(const void *buffer, wxUint32 nbytes) +{ + wxUint32 total = 0; + + // If the socket is invalid or parameters are ill, return immediately + if (!m_socket || !buffer || !nbytes) + return 0; + + // Possible combinations (they are checked in this order) + // wxSOCKET_NOWAIT + // wxSOCKET_WAITALL (with or without wxSOCKET_BLOCK) + // wxSOCKET_BLOCK + // wxSOCKET_NONE + // + int ret; + if (m_flags & wxSOCKET_NOWAIT) + { + m_socket->SetNonBlocking(1); + ret = m_socket->Write((const char *)buffer, nbytes); + m_socket->SetNonBlocking(0); + + if (ret > 0) + total = ret; + } + else + { + bool more = true; + + while (more) + { + if ( !(m_flags & wxSOCKET_BLOCK) && !WaitForWrite() ) + break; + + ret = m_socket->Write((const char *)buffer, nbytes); + + if (ret > 0) + { + total += ret; + nbytes -= ret; + buffer = (const char *)buffer + ret; + } + + // If we got here and wxSOCKET_WAITALL is not set, we can leave + // now. Otherwise, wait until we send all the data or until there + // is an error. + // + more = (ret > 0 && nbytes > 0 && (m_flags & wxSOCKET_WAITALL)); + } + } + + return total; +} + +wxSocketBase& wxSocketBase::WriteMsg(const void *buffer, wxUint32 nbytes) +{ + wxUint32 total; + bool error; + struct + { + unsigned char sig[4]; + unsigned char len[4]; + } msg; + + // Mask write events + m_writing = true; + + error = true; + total = 0; + SetFlags((m_flags & wxSOCKET_BLOCK) | wxSOCKET_WAITALL); + + msg.sig[0] = (unsigned char) 0xad; + msg.sig[1] = (unsigned char) 0xde; + msg.sig[2] = (unsigned char) 0xed; + msg.sig[3] = (unsigned char) 0xfe; + + msg.len[0] = (unsigned char) (nbytes & 0xff); + msg.len[1] = (unsigned char) ((nbytes >> 8) & 0xff); + msg.len[2] = (unsigned char) ((nbytes >> 16) & 0xff); + msg.len[3] = (unsigned char) ((nbytes >> 24) & 0xff); + + if (_Write(&msg, sizeof(msg)) < sizeof(msg)) + goto exit; + + total = _Write(buffer, nbytes); + + if (total < nbytes) + goto exit; + + msg.sig[0] = (unsigned char) 0xed; + msg.sig[1] = (unsigned char) 0xfe; + msg.sig[2] = (unsigned char) 0xad; + msg.sig[3] = (unsigned char) 0xde; + msg.len[0] = msg.len[1] = msg.len[2] = msg.len[3] = (char) 0; + + if ((_Write(&msg, sizeof(msg))) < sizeof(msg)) + goto exit; + + // everything was OK + error = false; + +exit: + m_error = error; + m_lcount = total; + m_writing = false; + + return *this; +} + +wxSocketBase& wxSocketBase::Unread(const void *buffer, wxUint32 nbytes) +{ + if (nbytes != 0) + Pushback(buffer, nbytes); + + m_error = false; + m_lcount = nbytes; + + return *this; +} + +wxSocketBase& wxSocketBase::Discard() +{ + char *buffer = new char[MAX_DISCARD_SIZE]; + wxUint32 ret; + wxUint32 total = 0; + + // Mask read events + m_reading = true; + + SetFlags(wxSOCKET_NOWAIT); + + do + { + ret = _Read(buffer, MAX_DISCARD_SIZE); + total += ret; + } + while (ret == MAX_DISCARD_SIZE); + + delete[] buffer; + m_lcount = total; + m_error = false; + + // Allow read events again + m_reading = false; + + return *this; +} + +// -------------------------------------------------------------------------- +// Wait functions +// -------------------------------------------------------------------------- + +// All Wait functions poll the socket using GSocket_Select() to +// check for the specified combination of conditions, until one +// of these conditions become true, an error occurs, or the +// timeout elapses. The polling loop calls PROCESS_EVENTS(), so +// this won't block the GUI. + +bool wxSocketBase::_Wait(long seconds, + long milliseconds, + wxSocketEventFlags flags) +{ + GSocketEventFlags result; + long timeout; + + // Set this to true to interrupt ongoing waits + m_interrupt = false; + + // Check for valid socket + if (!m_socket) + return false; + + // Check for valid timeout value. + if (seconds != -1) + timeout = seconds * 1000 + milliseconds; + else + timeout = m_timeout * 1000; + + bool has_event_loop = wxTheApp->GetTraits() ? (wxTheApp->GetTraits()->GetSocketGUIFunctionsTable() ? true : false) : false; + + // Wait in an active polling loop. + // + // NOTE: We duplicate some of the code in OnRequest, but this doesn't + // hurt. It has to be here because the (GSocket) event might arrive + // a bit delayed, and it has to be in OnRequest as well because we + // don't know whether the Wait functions are being used. + // + // Do this at least once (important if timeout == 0, when + // we are just polling). Also, if just polling, do not yield. + + wxDateTime current_time = wxDateTime::UNow(); + unsigned int time_limit = (current_time.GetTicks() * 1000) + current_time.GetMillisecond() + timeout; + bool done = false; + bool valid_result = false; + + if (!has_event_loop) + { + // This is used to avoid a busy loop on wxBase - having a select + // timeout of 50 ms per iteration should be enough. + if (timeout > 50) + m_socket->SetTimeout(50); + else + m_socket->SetTimeout(timeout); + } + + while (!done) + { + result = m_socket->Select(flags | GSOCK_LOST_FLAG); + + // Incoming connection (server) or connection established (client) + if (result & GSOCK_CONNECTION_FLAG) + { + m_connected = true; + m_establishing = false; + valid_result = true; + break; + } + + // Data available or output buffer ready + if ((result & GSOCK_INPUT_FLAG) || (result & GSOCK_OUTPUT_FLAG)) + { + valid_result = true; + break; + } + + // Connection lost + if (result & GSOCK_LOST_FLAG) + { + m_connected = false; + m_establishing = false; + valid_result = ((flags & GSOCK_LOST_FLAG) != 0); + break; + } + + // Wait more? + current_time = wxDateTime::UNow(); + int time_left = time_limit - ((current_time.GetTicks() * 1000) + current_time.GetMillisecond()); + if ((!timeout) || (time_left <= 0) || (m_interrupt)) + done = true; + else + { + if (has_event_loop) + { + PROCESS_EVENTS(); + } + else + { + // If there's less than 50 ms left, just call select with that timeout. + if (time_left < 50) + m_socket->SetTimeout(time_left); + } + } + } + + // Set timeout back to original value (we overwrote it for polling) + if (!has_event_loop) + m_socket->SetTimeout(m_timeout*1000); + + return valid_result; +} + +bool wxSocketBase::Wait(long seconds, long milliseconds) +{ + return _Wait(seconds, milliseconds, GSOCK_INPUT_FLAG | + GSOCK_OUTPUT_FLAG | + GSOCK_CONNECTION_FLAG | + GSOCK_LOST_FLAG); +} + +bool wxSocketBase::WaitForRead(long seconds, long milliseconds) +{ + // Check pushback buffer before entering _Wait + if (m_unread) + return true; + + // Note that GSOCK_INPUT_LOST has to be explicitly passed to + // _Wait because of the semantics of WaitForRead: a return + // value of true means that a GSocket_Read call will return + // immediately, not that there is actually data to read. + + return _Wait(seconds, milliseconds, GSOCK_INPUT_FLAG | + GSOCK_LOST_FLAG); +} + + +bool wxSocketBase::WaitForWrite(long seconds, long milliseconds) +{ + return _Wait(seconds, milliseconds, GSOCK_OUTPUT_FLAG); +} + +bool wxSocketBase::WaitForLost(long seconds, long milliseconds) +{ + return _Wait(seconds, milliseconds, GSOCK_LOST_FLAG); +} + +// -------------------------------------------------------------------------- +// Miscellaneous +// -------------------------------------------------------------------------- + +// +// Get local or peer address +// + +bool wxSocketBase::GetPeer(wxSockAddress& addr_man) const +{ + GAddress *peer; + + if (!m_socket) + return false; + + peer = m_socket->GetPeer(); + + // copying a null address would just trigger an assert anyway + + if (!peer) + return false; + + addr_man.SetAddress(peer); + GAddress_destroy(peer); + + return true; +} + +bool wxSocketBase::GetLocal(wxSockAddress& addr_man) const +{ + GAddress *local; + + if (!m_socket) + return false; + + local = m_socket->GetLocal(); + addr_man.SetAddress(local); + GAddress_destroy(local); + + return true; +} + +// +// Save and restore socket state +// + +void wxSocketBase::SaveState() +{ + wxSocketState *state; + + state = new wxSocketState(); + + state->m_flags = m_flags; + state->m_notify = m_notify; + state->m_eventmask = m_eventmask; + state->m_clientData = m_clientData; + + m_states.Append(state); +} + +void wxSocketBase::RestoreState() +{ + wxList::compatibility_iterator node; + wxSocketState *state; + + node = m_states.GetLast(); + if (!node) + return; + + state = (wxSocketState *)node->GetData(); + + m_flags = state->m_flags; + m_notify = state->m_notify; + m_eventmask = state->m_eventmask; + m_clientData = state->m_clientData; + + m_states.Erase(node); + delete state; +} + +// +// Timeout and flags +// + +void wxSocketBase::SetTimeout(long seconds) +{ + m_timeout = seconds; + + if (m_socket) + m_socket->SetTimeout(m_timeout * 1000); +} + +void wxSocketBase::SetFlags(wxSocketFlags flags) +{ + m_flags = flags; +} + + +// -------------------------------------------------------------------------- +// Event handling +// -------------------------------------------------------------------------- + +// A note on how events are processed, which is probably the most +// difficult thing to get working right while keeping the same API +// and functionality for all platforms. +// +// When GSocket detects an event, it calls wx_socket_callback, which in +// turn just calls wxSocketBase::OnRequest in the corresponding wxSocket +// object. OnRequest does some housekeeping, and if the event is to be +// propagated to the user, it creates a new wxSocketEvent object and +// posts it. The event is not processed immediately, but delayed with +// AddPendingEvent instead. This is necessary in order to decouple the +// event processing from wx_socket_callback; otherwise, subsequent IO +// calls made from the user event handler would fail, as gtk callbacks +// are not reentrant. +// +// Note that, unlike events, user callbacks (now deprecated) are _not_ +// decoupled from wx_socket_callback and thus they suffer from a variety +// of problems. Avoid them where possible and use events instead. + +extern "C" +void LINKAGEMODE wx_socket_callback(GSocket * WXUNUSED(socket), + GSocketEvent notification, + char *cdata) +{ + wxSocketBase *sckobj = (wxSocketBase *)cdata; + + sckobj->OnRequest((wxSocketNotify) notification); +} + +void wxSocketBase::OnRequest(wxSocketNotify notification) +{ + // NOTE: We duplicate some of the code in _Wait, but this doesn't + // hurt. It has to be here because the (GSocket) event might arrive + // a bit delayed, and it has to be in _Wait as well because we don't + // know whether the Wait functions are being used. + + switch(notification) + { + case wxSOCKET_CONNECTION: + m_establishing = false; + m_connected = true; + break; + + // If we are in the middle of a R/W operation, do not + // propagate events to users. Also, filter 'late' events + // which are no longer valid. + + case wxSOCKET_INPUT: + if (m_reading || !m_socket->Select(GSOCK_INPUT_FLAG)) + return; + break; + + case wxSOCKET_OUTPUT: + if (m_writing || !m_socket->Select(GSOCK_OUTPUT_FLAG)) + return; + break; + + case wxSOCKET_LOST: + m_connected = false; + m_establishing = false; + break; + + default: + break; + } + + // Schedule the event + + wxSocketEventFlags flag = 0; + wxUnusedVar(flag); + switch (notification) + { + case GSOCK_INPUT: flag = GSOCK_INPUT_FLAG; break; + case GSOCK_OUTPUT: flag = GSOCK_OUTPUT_FLAG; break; + case GSOCK_CONNECTION: flag = GSOCK_CONNECTION_FLAG; break; + case GSOCK_LOST: flag = GSOCK_LOST_FLAG; break; + default: + wxLogWarning(_("wxSocket: unknown event!.")); + return; + } + + if (((m_eventmask & flag) == flag) && m_notify) + { + if (m_handler) + { + wxSocketEvent event(m_id); + event.m_event = notification; + event.m_clientData = m_clientData; + event.SetEventObject(this); + + m_handler->AddPendingEvent(event); + } + } +} + +void wxSocketBase::Notify(bool notify) +{ + m_notify = notify; +} + +void wxSocketBase::SetNotify(wxSocketEventFlags flags) +{ + m_eventmask = flags; +} + +void wxSocketBase::SetEventHandler(wxEvtHandler& handler, int id) +{ + m_handler = &handler; + m_id = id; +} + +// -------------------------------------------------------------------------- +// Pushback buffer +// -------------------------------------------------------------------------- + +void wxSocketBase::Pushback(const void *buffer, wxUint32 size) +{ + if (!size) return; + + if (m_unread == NULL) + m_unread = malloc(size); + else + { + void *tmp; + + tmp = malloc(m_unrd_size + size); + memcpy((char *)tmp + size, m_unread, m_unrd_size); + free(m_unread); + + m_unread = tmp; + } + + m_unrd_size += size; + + memcpy(m_unread, buffer, size); +} + +wxUint32 wxSocketBase::GetPushback(void *buffer, wxUint32 size, bool peek) +{ + if (!m_unrd_size) + return 0; + + if (size > (m_unrd_size-m_unrd_cur)) + size = m_unrd_size-m_unrd_cur; + + memcpy(buffer, (char *)m_unread + m_unrd_cur, size); + + if (!peek) + { + m_unrd_cur += size; + if (m_unrd_size == m_unrd_cur) + { + free(m_unread); + m_unread = NULL; + m_unrd_size = 0; + m_unrd_cur = 0; + } + } + + return size; +} + + +// ========================================================================== +// wxSocketServer +// ========================================================================== + +// -------------------------------------------------------------------------- +// Ctor +// -------------------------------------------------------------------------- + +wxSocketServer::wxSocketServer(const wxSockAddress& addr_man, + wxSocketFlags flags) + : wxSocketBase(flags, wxSOCKET_SERVER) +{ + wxLogTrace( wxTRACE_Socket, _T("Opening wxSocketServer") ); + + m_socket = GSocket_new(); + + if (!m_socket) + { + wxLogTrace( wxTRACE_Socket, _T("*** GSocket_new failed") ); + return; + } + + // Setup the socket as server + + m_socket->SetLocal(addr_man.GetAddress()); + + if (GetFlags() & wxSOCKET_REUSEADDR) { + m_socket->SetReusable(); + } + + if (m_socket->SetServer() != GSOCK_NOERROR) + { + delete m_socket; + m_socket = NULL; + + wxLogTrace( wxTRACE_Socket, _T("*** GSocket_SetServer failed") ); + return; + } + + m_socket->SetTimeout(m_timeout * 1000); + m_socket->SetCallback(GSOCK_INPUT_FLAG | GSOCK_OUTPUT_FLAG | + GSOCK_LOST_FLAG | GSOCK_CONNECTION_FLAG, + wx_socket_callback, (char *)this); +} + +// -------------------------------------------------------------------------- +// Accept +// -------------------------------------------------------------------------- + +bool wxSocketServer::AcceptWith(wxSocketBase& sock, bool wait) +{ + GSocket *child_socket; + + if (!m_socket) + return false; + + // If wait == false, then the call should be nonblocking. + // When we are finished, we put the socket to blocking mode + // again. + + if (!wait) + m_socket->SetNonBlocking(1); + + child_socket = m_socket->WaitConnection(); + + if (!wait) + m_socket->SetNonBlocking(0); + + if (!child_socket) + return false; + + sock.m_type = wxSOCKET_BASE; + sock.m_socket = child_socket; + sock.m_connected = true; + + sock.m_socket->SetTimeout(sock.m_timeout * 1000); + sock.m_socket->SetCallback(GSOCK_INPUT_FLAG | GSOCK_OUTPUT_FLAG | + GSOCK_LOST_FLAG | GSOCK_CONNECTION_FLAG, + wx_socket_callback, (char *)&sock); + + return true; +} + +wxSocketBase *wxSocketServer::Accept(bool wait) +{ + wxSocketBase* sock = new wxSocketBase(); + + sock->SetFlags(m_flags); + + if (!AcceptWith(*sock, wait)) + { + sock->Destroy(); + sock = NULL; + } + + return sock; +} + +bool wxSocketServer::WaitForAccept(long seconds, long milliseconds) +{ + return _Wait(seconds, milliseconds, GSOCK_CONNECTION_FLAG); +} + +bool wxSocketBase::GetOption(int level, int optname, void *optval, int *optlen) +{ + wxASSERT_MSG( m_socket, _T("Socket not initialised") ); + + if (m_socket->GetSockOpt(level, optname, optval, optlen) + != GSOCK_NOERROR) + { + return false; + } + return true; +} + +bool wxSocketBase::SetOption(int level, int optname, const void *optval, + int optlen) +{ + wxASSERT_MSG( m_socket, _T("Socket not initialised") ); + + if (m_socket->SetSockOpt(level, optname, optval, optlen) + != GSOCK_NOERROR) + { + return false; + } + return true; +} + +bool wxSocketBase::SetLocal(wxIPV4address& local) +{ + GAddress* la = local.GetAddress(); + + // If the address is valid, save it for use when we call Connect + if (la && la->m_addr) + { + m_localAddress = local; + + return true; + } + + return false; +} + +// ========================================================================== +// wxSocketClient +// ========================================================================== + +// -------------------------------------------------------------------------- +// Ctor and dtor +// -------------------------------------------------------------------------- + +wxSocketClient::wxSocketClient(wxSocketFlags flags) + : wxSocketBase(flags, wxSOCKET_CLIENT) +{ +} + +wxSocketClient::~wxSocketClient() +{ +} + +// -------------------------------------------------------------------------- +// Connect +// -------------------------------------------------------------------------- + +bool wxSocketClient::DoConnect(wxSockAddress& addr_man, wxSockAddress* local, bool wait) +{ + GSocketError err; + + if (m_socket) + { + // Shutdown and destroy the socket + Close(); + delete m_socket; + } + + m_socket = GSocket_new(); + m_connected = false; + m_establishing = false; + + if (!m_socket) + return false; + + m_socket->SetTimeout(m_timeout * 1000); + m_socket->SetCallback(GSOCK_INPUT_FLAG | GSOCK_OUTPUT_FLAG | + GSOCK_LOST_FLAG | GSOCK_CONNECTION_FLAG, + wx_socket_callback, (char *)this); + + // If wait == false, then the call should be nonblocking. + // When we are finished, we put the socket to blocking mode + // again. + + if (!wait) + m_socket->SetNonBlocking(1); + + // Reuse makes sense for clients too, if we are trying to rebind to the same port + if (GetFlags() & wxSOCKET_REUSEADDR) + { + m_socket->SetReusable(); + } + + // If no local address was passed and one has been set, use the one that was Set + if (!local && m_localAddress.GetAddress()) + { + local = &m_localAddress; + } + + // Bind to the local IP address and port, when provided + if (local) + { + GAddress* la = local->GetAddress(); + + if (la && la->m_addr) + m_socket->SetLocal(la); + } + + m_socket->SetPeer(addr_man.GetAddress()); + err = m_socket->Connect(GSOCK_STREAMED); + + if (!wait) + m_socket->SetNonBlocking(0); + + if (err != GSOCK_NOERROR) + { + if (err == GSOCK_WOULDBLOCK) + m_establishing = true; + + return false; + } + + m_connected = true; + return true; +} + +bool wxSocketClient::Connect(wxSockAddress& addr_man, bool wait) +{ + return (DoConnect(addr_man, NULL, wait)); +} + +bool wxSocketClient::Connect(wxSockAddress& addr_man, wxSockAddress& local, bool wait) +{ + return (DoConnect(addr_man, &local, wait)); +} + +bool wxSocketClient::WaitOnConnect(long seconds, long milliseconds) +{ + if (m_connected) // Already connected + return true; + + if (!m_establishing || !m_socket) // No connection in progress + return false; + + return _Wait(seconds, milliseconds, GSOCK_CONNECTION_FLAG | + GSOCK_LOST_FLAG); +} + +// ========================================================================== +// wxDatagramSocket +// ========================================================================== + +/* NOTE: experimental stuff - might change */ + +wxDatagramSocket::wxDatagramSocket( const wxSockAddress& addr, + wxSocketFlags flags ) + : wxSocketBase( flags, wxSOCKET_DATAGRAM ) +{ + // Create the socket + m_socket = GSocket_new(); + + if (!m_socket) + { + wxFAIL_MSG( _T("datagram socket not new'd") ); + return; + } + // Setup the socket as non connection oriented + m_socket->SetLocal(addr.GetAddress()); + if (flags & wxSOCKET_REUSEADDR) + { + m_socket->SetReusable(); + } + if ( m_socket->SetNonOriented() != GSOCK_NOERROR ) + { + delete m_socket; + m_socket = NULL; + return; + } + + // Initialize all stuff + m_connected = false; + m_establishing = false; + m_socket->SetTimeout( m_timeout ); + m_socket->SetCallback( GSOCK_INPUT_FLAG | GSOCK_OUTPUT_FLAG | + GSOCK_LOST_FLAG | GSOCK_CONNECTION_FLAG, + wx_socket_callback, (char*)this ); +} + +wxDatagramSocket& wxDatagramSocket::RecvFrom( wxSockAddress& addr, + void* buf, + wxUint32 nBytes ) +{ + Read(buf, nBytes); + GetPeer(addr); + return (*this); +} + +wxDatagramSocket& wxDatagramSocket::SendTo( const wxSockAddress& addr, + const void* buf, + wxUint32 nBytes ) +{ + wxASSERT_MSG( m_socket, _T("Socket not initialised") ); + + m_socket->SetPeer(addr.GetAddress()); + Write(buf, nBytes); + return (*this); +} + +// ========================================================================== +// wxSocketModule +// ========================================================================== + +class wxSocketModule : public wxModule +{ +public: + virtual bool OnInit() + { + // wxSocketBase will call GSocket_Init() itself when/if needed + return true; + } + + virtual void OnExit() + { + if ( wxSocketBase::IsInitialized() ) + wxSocketBase::Shutdown(); + } + +private: + DECLARE_DYNAMIC_CLASS(wxSocketModule) +}; + +IMPLEMENT_DYNAMIC_CLASS(wxSocketModule, wxModule) + +#endif + // wxUSE_SOCKETS diff --git a/Externals/wxWidgets/src/common/socketevtdispatch.cpp b/Externals/wxWidgets/src/common/socketevtdispatch.cpp new file mode 100644 index 0000000000..221f92e482 --- /dev/null +++ b/Externals/wxWidgets/src/common/socketevtdispatch.cpp @@ -0,0 +1,339 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/common/socketevtdispatch.cpp +// Purpose: implements wxSocketEventDispatcher for platforms with no +// socket events notification +// Author: Angel Vidal +// Modified by: +// Created: 08.24.06 +// RCS-ID: $Id: socketevtdispatch.cpp 43976 2006-12-14 14:13:57Z VS $ +// Copyright: (c) 2006 Angel vidal +// License: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// for compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#if wxUSE_SOCKETS + +#include "wx/private/socketevtdispatch.h" +#include "wx/module.h" +#include "wx/unix/private.h" +#include "wx/gsocket.h" +#include "wx/unix/gsockunx.h" + +#ifndef WX_PRECOMP + #include "wx/hash.h" +#endif + +#include +#include + +#ifdef HAVE_SYS_SELECT_H +# include +#endif + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxSocketEventDispatcherEntry +// ---------------------------------------------------------------------------- + +class wxSocketEventDispatcherEntry: public wxObject +{ + public: + wxSocketEventDispatcherEntry() + { + m_fdInput = -1; m_fdOutput = -1; + m_socket = NULL; + } + + int m_fdInput; + int m_fdOutput; + GSocket* m_socket; +}; + +// ---------------------------------------------------------------------------- +// wxSocketEventDispatcher +// ---------------------------------------------------------------------------- + +wxSocketEventDispatcher* wxSocketEventDispatcher::ms_instance = NULL; + +/* static */ +wxSocketEventDispatcher& wxSocketEventDispatcher::Get() +{ + if ( !ms_instance ) + ms_instance = new wxSocketEventDispatcher; + return *ms_instance; +} + +wxSocketEventDispatcherEntry* wxSocketEventDispatcher::FindEntry(int fd) +{ + wxSocketEventDispatcherEntry* entry = + (wxSocketEventDispatcherEntry*) wxHashTable::Get(fd); + return entry; +} + +void +wxSocketEventDispatcher::RegisterCallback(int fd, + wxSocketEventDispatcherType socketType, + GSocket* socket) +{ + wxSocketEventDispatcherEntry* entry = FindEntry(fd); + if (!entry) + { + entry = new wxSocketEventDispatcherEntry(); + Put(fd, entry); + } + + if (socketType == wxSocketEventDispatcherInput) + entry->m_fdInput = fd; + else + entry->m_fdOutput = fd; + + entry->m_socket = socket; +} + +void +wxSocketEventDispatcher::UnregisterCallback(int fd, + wxSocketEventDispatcherType socketType) +{ + wxSocketEventDispatcherEntry* entry = FindEntry(fd); + if (entry) + { + if (socketType == wxSocketEventDispatcherInput) + entry->m_fdInput = -1; + else + entry->m_fdOutput = -1; + + if (entry->m_fdInput == -1 && entry->m_fdOutput == -1) + { + entry->m_socket = NULL; + Delete(fd); + delete entry; + } + } +} + +int wxSocketEventDispatcher::FillSets(fd_set* readset, fd_set* writeset) +{ + int max_fd = 0; + + wxFD_ZERO(readset); + wxFD_ZERO(writeset); + + BeginFind(); + wxHashTable::compatibility_iterator node = Next(); + while (node) + { + wxSocketEventDispatcherEntry* entry = + (wxSocketEventDispatcherEntry*) node->GetData(); + + if (entry->m_fdInput != -1) + { + wxFD_SET(entry->m_fdInput, readset); + if (entry->m_fdInput > max_fd) + max_fd = entry->m_fdInput; + } + + if (entry->m_fdOutput != -1) + { + wxFD_SET(entry->m_fdOutput, writeset); + if (entry->m_fdOutput > max_fd) + max_fd = entry->m_fdOutput; + } + + node = Next(); + } + + return max_fd; +} + +void wxSocketEventDispatcher::AddEvents(fd_set* readset, fd_set* writeset) +{ + BeginFind(); + wxHashTable::compatibility_iterator node = Next(); + while (node) + { + // We have to store the next node here, because the event processing can + // destroy the object before we call Next() + + wxHashTable::compatibility_iterator next_node = Next(); + + wxSocketEventDispatcherEntry* entry = + (wxSocketEventDispatcherEntry*) node->GetData(); + + wxCHECK_RET(entry->m_socket, wxT("Critical: Processing a NULL socket in wxSocketEventDispatcher")); + + if (entry->m_fdInput != -1 && wxFD_ISSET(entry->m_fdInput, readset)) + entry->m_socket->Detected_Read(); + + if (entry->m_fdOutput != -1 && wxFD_ISSET(entry->m_fdOutput, writeset)) + entry->m_socket->Detected_Write();; + + node = next_node; + } +} + +void wxSocketEventDispatcher::RunLoop(int timeout) +{ + struct timeval tv; + tv.tv_sec = 0; + tv.tv_usec = timeout; + fd_set readset; + fd_set writeset; + + int max_fd = FillSets( &readset, &writeset); + if (select( max_fd+1, &readset, &writeset, NULL, &tv ) == 0) + { + // No socket input/output. Don't add events. + return; + } + else + { + AddEvents(&readset, &writeset); + } +} + +// ---------------------------------------------------------------------------- +// wxSocketEventDispatcherModule +// ---------------------------------------------------------------------------- + +class wxSocketEventDispatcherModule: public wxModule +{ +public: + bool OnInit() { return true; } + void OnExit() { wxDELETE(wxSocketEventDispatcher::ms_instance); } + +private: + DECLARE_DYNAMIC_CLASS(wxSocketEventDispatcherModule) +}; + +IMPLEMENT_DYNAMIC_CLASS(wxSocketEventDispatcherModule, wxModule) + + +// ---------------------------------------------------------------------------- +// GSocket interface +// ---------------------------------------------------------------------------- + +bool GSocketGUIFunctionsTableConcrete::CanUseEventLoop() +{ + return true; +} + +bool GSocketGUIFunctionsTableConcrete::OnInit(void) +{ + return 1; +} + +void GSocketGUIFunctionsTableConcrete::OnExit(void) +{ +} + +bool GSocketGUIFunctionsTableConcrete::Init_Socket(GSocket *socket) +{ + int *m_id; + + socket->m_gui_dependent = (char *)malloc(sizeof(int)*2); + m_id = (int *)(socket->m_gui_dependent); + + m_id[0] = -1; + m_id[1] = -1; + + return true; +} + +void GSocketGUIFunctionsTableConcrete::Destroy_Socket(GSocket *socket) +{ + free(socket->m_gui_dependent); +} + +void GSocketGUIFunctionsTableConcrete::Install_Callback(GSocket *socket, + GSocketEvent event) +{ + int *m_id = (int *)(socket->m_gui_dependent); + int c; + + if (socket->m_fd == -1) + return; + + switch (event) + { + case GSOCK_LOST: /* fall-through */ + case GSOCK_INPUT: c = 0; break; + case GSOCK_OUTPUT: c = 1; break; + case GSOCK_CONNECTION: c = ((socket->m_server) ? 0 : 1); break; + default: return; + } + +#if 0 + if (m_id[c] != -1) + XtRemoveInput(m_id[c]); +#endif /* 0 */ + + if (c == 0) + { + m_id[0] = socket->m_fd; + + wxSocketEventDispatcher::Get().RegisterCallback( + socket->m_fd, wxSocketEventDispatcherInput, socket); + } + else + { + m_id[1] = socket->m_fd; + + wxSocketEventDispatcher::Get().RegisterCallback( + socket->m_fd, wxSocketEventDispatcherOutput, socket); + } +} + +void GSocketGUIFunctionsTableConcrete::Uninstall_Callback(GSocket *socket, + GSocketEvent event) +{ + int *m_id = (int *)(socket->m_gui_dependent); + int c; + + switch (event) + { + case GSOCK_LOST: /* fall-through */ + case GSOCK_INPUT: c = 0; break; + case GSOCK_OUTPUT: c = 1; break; + case GSOCK_CONNECTION: c = ((socket->m_server) ? 0 : 1); break; + default: return; + } + + if (m_id[c] != -1) + { + if (c == 0) + wxSocketEventDispatcher::Get().UnregisterCallback( + m_id[c], wxSocketEventDispatcherInput); + else + wxSocketEventDispatcher::Get().UnregisterCallback( + m_id[c], wxSocketEventDispatcherOutput); + } + + m_id[c] = -1; +} + +void GSocketGUIFunctionsTableConcrete::Enable_Events(GSocket *socket) +{ + Install_Callback(socket, GSOCK_INPUT); + Install_Callback(socket, GSOCK_OUTPUT); +} + +void GSocketGUIFunctionsTableConcrete::Disable_Events(GSocket *socket) +{ + Uninstall_Callback(socket, GSOCK_INPUT); + Uninstall_Callback(socket, GSOCK_OUTPUT); +} + +#endif // wxUSE_SOCKETS diff --git a/Externals/wxWidgets/src/common/srchcmn.cpp b/Externals/wxWidgets/src/common/srchcmn.cpp new file mode 100644 index 0000000000..3c05e828c4 --- /dev/null +++ b/Externals/wxWidgets/src/common/srchcmn.cpp @@ -0,0 +1,42 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/srchcmn.cpp +// Purpose: common (to all ports) bits of wxSearchCtrl +// Author: Robin Dunn +// Modified by: +// Created: 19-Dec-2006 +// RCS-ID: $Id: srchcmn.cpp 43939 2006-12-11 20:32:16Z KO $ +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_SEARCHCTRL + +#include "wx/srchctrl.h" + +#ifndef WX_PRECOMP +#endif + +// ---------------------------------------------------------------------------- + +const wxChar wxSearchCtrlNameStr[] = wxT("searchCtrl"); + +DEFINE_EVENT_TYPE(wxEVT_COMMAND_SEARCHCTRL_CANCEL_BTN) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_SEARCHCTRL_SEARCH_BTN) + + +#endif // wxUSE_SEARCHCTRL diff --git a/Externals/wxWidgets/src/common/sstream.cpp b/Externals/wxWidgets/src/common/sstream.cpp new file mode 100644 index 0000000000..80129c50fb --- /dev/null +++ b/Externals/wxWidgets/src/common/sstream.cpp @@ -0,0 +1,235 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: common/sstream.cpp +// Purpose: string-based streams implementation +// Author: Vadim Zeitlin +// Modified by: Ryan Norton (UTF8 UNICODE) +// Created: 2004-09-19 +// RCS-ID: $Id: sstream.cpp 45772 2007-05-03 02:19:16Z VZ $ +// Copyright: (c) 2004 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_STREAMS + +#include "wx/sstream.h" + +#if wxUSE_UNICODE + #include "wx/hashmap.h" +#endif + +// ============================================================================ +// wxStringInputStream implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// construction/destruction +// ---------------------------------------------------------------------------- + +// TODO: Do we want to include the null char in the stream? If so then +// just add +1 to m_len in the ctor +wxStringInputStream::wxStringInputStream(const wxString& s) +#if wxUSE_UNICODE + : m_str(s), m_buf(wxMBConvUTF8().cWX2MB(s).release()), m_len(strlen(m_buf)) +#else + : m_str(s), m_buf((char*)s.c_str()), m_len(s.length()) +#endif +{ +#if wxUSE_UNICODE + wxASSERT_MSG(m_buf != NULL, _T("Could not convert string to UTF8!")); +#endif + m_pos = 0; +} + +wxStringInputStream::~wxStringInputStream() +{ +#if wxUSE_UNICODE + // Note: wx[W]CharBuffer uses malloc()/free() + free(m_buf); +#endif +} + +// ---------------------------------------------------------------------------- +// getlength +// ---------------------------------------------------------------------------- + +wxFileOffset wxStringInputStream::GetLength() const +{ + return m_len; +} + +// ---------------------------------------------------------------------------- +// seek/tell +// ---------------------------------------------------------------------------- + +wxFileOffset wxStringInputStream::OnSysSeek(wxFileOffset ofs, wxSeekMode mode) +{ + switch ( mode ) + { + case wxFromStart: + // nothing to do, ofs already ok + break; + + case wxFromEnd: + ofs += m_len; + break; + + case wxFromCurrent: + ofs += m_pos; + break; + + default: + wxFAIL_MSG( _T("invalid seek mode") ); + return wxInvalidOffset; + } + + if ( ofs < 0 || ofs > wx_static_cast(wxFileOffset, m_len) ) + return wxInvalidOffset; + + // FIXME: this can't be right + m_pos = wx_truncate_cast(size_t, ofs); + + return ofs; +} + +wxFileOffset wxStringInputStream::OnSysTell() const +{ + return wx_static_cast(wxFileOffset, m_pos); +} + +// ---------------------------------------------------------------------------- +// actual IO +// ---------------------------------------------------------------------------- + +size_t wxStringInputStream::OnSysRead(void *buffer, size_t size) +{ + const size_t sizeMax = m_len - m_pos; + + if ( size >= sizeMax ) + { + if ( sizeMax == 0 ) + { + m_lasterror = wxSTREAM_EOF; + return 0; + } + + size = sizeMax; + } + + memcpy(buffer, m_buf + m_pos, size); + m_pos += size; + + return size; +} + +// ============================================================================ +// wxStringOutputStream implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// seek/tell +// ---------------------------------------------------------------------------- + +wxFileOffset wxStringOutputStream::OnSysTell() const +{ + return wx_static_cast(wxFileOffset, m_pos); +} + +// ---------------------------------------------------------------------------- +// actual IO +// ---------------------------------------------------------------------------- + +#if wxUSE_UNICODE + +// we can't add a member to wxStringOutputStream in 2.8 branch without breaking +// backwards binary compatibility, so we emulate it by using a hash indexed by +// wxStringOutputStream pointers + +// can't use wxCharBuffer as it has incorrect copying semantics and doesn't +// store the length which we need here +WX_DECLARE_VOIDPTR_HASH_MAP(wxMemoryBuffer, wxStringStreamUnconvBuffers); + +static wxStringStreamUnconvBuffers gs_unconverted; + +wxStringOutputStream::~wxStringOutputStream() +{ + // TODO: check that nothing remains (i.e. the unconverted buffer is empty)? + gs_unconverted.erase(this); +} + +#endif // wxUSE_UNICODE + +size_t wxStringOutputStream::OnSysWrite(const void *buffer, size_t size) +{ + const char *p = wx_static_cast(const char *, buffer); + +#if wxUSE_UNICODE + // the part of the string we have here may be incomplete, i.e. it can stop + // in the middle of an UTF-8 character and so converting it would fail; if + // this is the case, accumulate the part which we failed to convert until + // we get the rest (and also take into account the part which we might have + // left unconverted before) + const char *src; + size_t srcLen; + wxMemoryBuffer& unconv = gs_unconverted[this]; + if ( unconv.GetDataLen() ) + { + // append the new data to the data remaining since the last time + unconv.AppendData(p, size); + src = unconv; + srcLen = unconv.GetDataLen(); + } + else // no unconverted data left, avoid extra copy + { + src = p; + srcLen = size; + } + + wxWCharBuffer wbuf(m_conv.cMB2WC(src, srcLen, NULL /* out len */)); + if ( wbuf ) + { + // conversion succeeded, clear the unconverted buffer + unconv = wxMemoryBuffer(0); + + *m_str += wbuf; + } + else // conversion failed + { + // remember unconverted data if there had been none before (otherwise + // we've already got it in the buffer) + if ( src == p ) + unconv.AppendData(src, srcLen); + + // pretend that we wrote the data anyhow, otherwise the caller would + // believe there was an error and this might not be the case, but do + // not update m_pos as m_str hasn't changed + return size; + } +#else // !wxUSE_UNICODE + // append directly, no conversion necessary + m_str->Append(wxString(p, size)); +#endif // wxUSE_UNICODE/!wxUSE_UNICODE + + // update position + m_pos += size; + + // return number of bytes actually written + return size; +} + +#endif // wxUSE_STREAMS + diff --git a/Externals/wxWidgets/src/common/statbar.cpp b/Externals/wxWidgets/src/common/statbar.cpp new file mode 100644 index 0000000000..69a32456ce --- /dev/null +++ b/Externals/wxWidgets/src/common/statbar.cpp @@ -0,0 +1,368 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/common/statbar.cpp +// Purpose: wxStatusBarBase implementation +// Author: Vadim Zeitlin +// Modified by: +// Created: 14.10.01 +// RCS-ID: $Id: statbar.cpp 42171 2006-10-20 14:54:14Z VS $ +// Copyright: (c) 2001 Vadim Zeitlin +// License: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_STATUSBAR + +#include "wx/statusbr.h" + +#ifndef WX_PRECOMP + #include "wx/frame.h" +#endif //WX_PRECOMP + +#include "wx/listimpl.cpp" +WX_DEFINE_LIST(wxListString) + +const wxChar wxStatusBarNameStr[] = wxT("statusBar"); + +// ============================================================================ +// wxStatusBarBase implementation +// ============================================================================ + +IMPLEMENT_DYNAMIC_CLASS(wxStatusBar, wxWindow) + +// ---------------------------------------------------------------------------- +// ctor/dtor +// ---------------------------------------------------------------------------- + +wxStatusBarBase::wxStatusBarBase() +{ + m_nFields = 0; + + InitWidths(); + InitStacks(); + InitStyles(); +} + +wxStatusBarBase::~wxStatusBarBase() +{ + FreeWidths(); + FreeStacks(); + FreeStyles(); + + // notify the frame that it doesn't have a status bar any longer to avoid + // dangling pointers + wxFrame *frame = wxDynamicCast(GetParent(), wxFrame); + if ( frame && frame->GetStatusBar() == this ) + { + frame->SetStatusBar(NULL); + } +} + +// ---------------------------------------------------------------------------- +// widths array handling +// ---------------------------------------------------------------------------- + +void wxStatusBarBase::InitWidths() +{ + m_statusWidths = NULL; +} + +void wxStatusBarBase::FreeWidths() +{ + delete [] m_statusWidths; +} + +// ---------------------------------------------------------------------------- +// styles array handling +// ---------------------------------------------------------------------------- + +void wxStatusBarBase::InitStyles() +{ + m_statusStyles = NULL; +} + +void wxStatusBarBase::FreeStyles() +{ + delete [] m_statusStyles; +} + +// ---------------------------------------------------------------------------- +// field widths +// ---------------------------------------------------------------------------- + +void wxStatusBarBase::SetFieldsCount(int number, const int *widths) +{ + wxCHECK_RET( number > 0, _T("invalid field number in SetFieldsCount") ); + + bool refresh = false; + + if ( number != m_nFields ) + { + // copy stacks if present + if(m_statusTextStacks) + { + wxListString **newStacks = new wxListString*[number]; + size_t i, j, max = wxMin(number, m_nFields); + + // copy old stacks + for(i = 0; i < max; ++i) + newStacks[i] = m_statusTextStacks[i]; + // free old stacks in excess + for(j = i; j < (size_t)m_nFields; ++j) + { + if(m_statusTextStacks[j]) + { + m_statusTextStacks[j]->Clear(); + delete m_statusTextStacks[j]; + } + } + // initialize new stacks to NULL + for(j = i; j < (size_t)number; ++j) + newStacks[j] = 0; + + m_statusTextStacks = newStacks; + } + + // Resize styles array + if (m_statusStyles) + { + int *oldStyles = m_statusStyles; + m_statusStyles = new int[number]; + int i, max = wxMin(number, m_nFields); + + // copy old styles + for (i = 0; i < max; ++i) + m_statusStyles[i] = oldStyles[i]; + + // initialize new styles to wxSB_NORMAL + for (i = max; i < number; ++i) + m_statusStyles[i] = wxSB_NORMAL; + + // free old styles + delete [] oldStyles; + } + + + m_nFields = number; + + ReinitWidths(); + + refresh = true; + } + //else: keep the old m_statusWidths if we had them + + if ( widths ) + { + SetStatusWidths(number, widths); + + // already done from SetStatusWidths() + refresh = false; + } + + if ( refresh ) + Refresh(); +} + +void wxStatusBarBase::SetStatusWidths(int WXUNUSED_UNLESS_DEBUG(n), + const int widths[]) +{ + wxCHECK_RET( widths, _T("NULL pointer in SetStatusWidths") ); + + wxASSERT_MSG( n == m_nFields, _T("field number mismatch") ); + + if ( !m_statusWidths ) + m_statusWidths = new int[m_nFields]; + + for ( int i = 0; i < m_nFields; i++ ) + { + m_statusWidths[i] = widths[i]; + } + + // update the display after the widths changed + Refresh(); +} + +void wxStatusBarBase::SetStatusStyles(int WXUNUSED_UNLESS_DEBUG(n), + const int styles[]) +{ + wxCHECK_RET( styles, _T("NULL pointer in SetStatusStyles") ); + + wxASSERT_MSG( n == m_nFields, _T("field number mismatch") ); + + if ( !m_statusStyles ) + m_statusStyles = new int[m_nFields]; + + for ( int i = 0; i < m_nFields; i++ ) + { + m_statusStyles[i] = styles[i]; + } + + // update the display after the widths changed + Refresh(); +} + +wxArrayInt wxStatusBarBase::CalculateAbsWidths(wxCoord widthTotal) const +{ + wxArrayInt widths; + + if ( m_statusWidths == NULL ) + { + if ( m_nFields ) + { + // Default: all fields have the same width. This is not always + // possible to do exactly (if widthTotal is not divisible by + // m_nFields) - if that happens, we distribute the extra pixels + // among all fields: + int widthToUse = widthTotal; + + for ( int i = m_nFields; i > 0; i-- ) + { + // divide the unassigned width evently between the + // not yet processed fields: + int w = widthToUse / i; + widths.Add(w); + widthToUse -= w; + } + + } + //else: we're empty anyhow + } + else // have explicit status widths + { + // calculate the total width of all the fixed width fields and the + // total number of var field widths counting with multiplicity + int nTotalWidth = 0, + nVarCount = 0, + i; + for ( i = 0; i < m_nFields; i++ ) + { + if ( m_statusWidths[i] >= 0 ) + { + nTotalWidth += m_statusWidths[i]; + } + else + { + nVarCount += -m_statusWidths[i]; + } + } + + // the amount of extra width we have per each var width field + int widthExtra = widthTotal - nTotalWidth; + + // do fill the array + for ( i = 0; i < m_nFields; i++ ) + { + if ( m_statusWidths[i] >= 0 ) + { + widths.Add(m_statusWidths[i]); + } + else + { + int nVarWidth = widthExtra > 0 ? (widthExtra * -m_statusWidths[i]) / nVarCount : 0; + nVarCount += m_statusWidths[i]; + widthExtra -= nVarWidth; + widths.Add(nVarWidth); + } + } + } + + return widths; +} + +// ---------------------------------------------------------------------------- +// text stacks handling +// ---------------------------------------------------------------------------- + +void wxStatusBarBase::InitStacks() +{ + m_statusTextStacks = NULL; +} + +void wxStatusBarBase::FreeStacks() +{ + if ( !m_statusTextStacks ) + return; + + for ( size_t i = 0; i < (size_t)m_nFields; ++i ) + { + if ( m_statusTextStacks[i] ) + { + wxListString& t = *m_statusTextStacks[i]; + WX_CLEAR_LIST(wxListString, t); + delete m_statusTextStacks[i]; + } + } + + delete[] m_statusTextStacks; +} + +// ---------------------------------------------------------------------------- +// text stacks +// ---------------------------------------------------------------------------- + +void wxStatusBarBase::PushStatusText(const wxString& text, int number) +{ + wxListString* st = GetOrCreateStatusStack(number); + // This long-winded way around avoids an internal compiler error + // in VC++ 6 with RTTI enabled + wxString tmp1(GetStatusText(number)); + wxString* tmp = new wxString(tmp1); + st->Insert(tmp); + SetStatusText(text, number); +} + +void wxStatusBarBase::PopStatusText(int number) +{ + wxListString *st = GetStatusStack(number); + wxCHECK_RET( st, _T("Unbalanced PushStatusText/PopStatusText") ); + wxListString::compatibility_iterator top = st->GetFirst(); + + SetStatusText(*top->GetData(), number); + delete top->GetData(); + st->Erase(top); + if(st->GetCount() == 0) + { + delete st; + m_statusTextStacks[number] = 0; + } +} + +wxListString *wxStatusBarBase::GetStatusStack(int i) const +{ + if(!m_statusTextStacks) + return 0; + return m_statusTextStacks[i]; +} + +wxListString *wxStatusBarBase::GetOrCreateStatusStack(int i) +{ + if(!m_statusTextStacks) + { + m_statusTextStacks = new wxListString*[m_nFields]; + + size_t j; + for(j = 0; j < (size_t)m_nFields; ++j) m_statusTextStacks[j] = 0; + } + + if(!m_statusTextStacks[i]) + { + m_statusTextStacks[i] = new wxListString(); + } + + return m_statusTextStacks[i]; +} + +#endif // wxUSE_STATUSBAR diff --git a/Externals/wxWidgets/src/common/stdpbase.cpp b/Externals/wxWidgets/src/common/stdpbase.cpp new file mode 100644 index 0000000000..99f27adc52 --- /dev/null +++ b/Externals/wxWidgets/src/common/stdpbase.cpp @@ -0,0 +1,130 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: common/stdpbase.cpp +// Purpose: wxStandardPathsBase methods common to all ports +// Author: Vadim Zeitlin +// Modified by: +// Created: 2004-10-19 +// RCS-ID: $Id: stdpbase.cpp 43340 2006-11-12 12:58:10Z RR $ +// Copyright: (c) 2004 Vadim Zeitlin +// License: wxWindows license +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// for compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_STDPATHS + +#ifndef WX_PRECOMP + #include "wx/app.h" +#endif //WX_PRECOMP +#include "wx/apptrait.h" + +#include "wx/filename.h" +#include "wx/stdpaths.h" + +// ---------------------------------------------------------------------------- +// module globals +// ---------------------------------------------------------------------------- + +static wxStandardPaths gs_stdPaths; + +// ============================================================================ +// implementation +// ============================================================================ + +/* static */ +wxStandardPathsBase& wxStandardPathsBase::Get() +{ + wxAppTraits * const traits = wxTheApp ? wxTheApp->GetTraits() : NULL; + wxCHECK_MSG( traits, gs_stdPaths, _T("create wxApp before calling this") ); + + return traits->GetStandardPaths(); +} + +wxString wxStandardPathsBase::GetExecutablePath() const +{ + if ( !wxTheApp || !wxTheApp->argv ) + return wxEmptyString; + + wxString argv0 = wxTheApp->argv[0]; + if (wxIsAbsolutePath(argv0)) + return argv0; + + // Search PATH.environment variable... + wxPathList pathlist; + pathlist.AddEnvList(wxT("PATH")); + wxString path = pathlist.FindAbsoluteValidPath(argv0); + if ( path.empty() ) + return argv0; // better than nothing + + wxFileName filename(path); + filename.Normalize(); + return filename.GetFullPath(); +} + +wxStandardPathsBase& wxAppTraitsBase::GetStandardPaths() +{ + return gs_stdPaths; +} + +wxStandardPathsBase::~wxStandardPathsBase() +{ + // nothing to do here +} + +wxString wxStandardPathsBase::GetLocalDataDir() const +{ + return GetDataDir(); +} + +wxString wxStandardPathsBase::GetUserLocalDataDir() const +{ + return GetUserDataDir(); +} + +wxString wxStandardPathsBase::GetDocumentsDir() const +{ + return wxFileName::GetHomeDir(); +} + +// return the temporary directory for the current user +wxString wxStandardPathsBase::GetTempDir() const +{ + return wxFileName::GetTempDir(); +} + +/* static */ +wxString wxStandardPathsBase::AppendAppName(const wxString& dir) +{ + wxString subdir(dir); + + // empty string indicates that an error has occurred, don't touch it then + if ( !subdir.empty() ) + { + const wxString appname = wxTheApp->GetAppName(); + if ( !appname.empty() ) + { + const wxChar ch = *(subdir.end() - 1); + if ( !wxFileName::IsPathSeparator(ch) && ch != _T('.') ) + subdir += wxFileName::GetPathSeparator(); + + subdir += appname; + } + } + + return subdir; +} + +#endif // wxUSE_STDPATHS diff --git a/Externals/wxWidgets/src/common/stockitem.cpp b/Externals/wxWidgets/src/common/stockitem.cpp new file mode 100644 index 0000000000..4708f3903f --- /dev/null +++ b/Externals/wxWidgets/src/common/stockitem.cpp @@ -0,0 +1,278 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/common/stockitem.cpp +// Purpose: Stock buttons, menu and toolbar items labels +// Author: Vaclav Slavik +// Modified by: +// Created: 2004-08-15 +// RCS-ID: $Id: stockitem.cpp 42936 2006-11-02 10:42:42Z JS $ +// Copyright: (c) Vaclav Slavik, 2004 +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#include "wx/stockitem.h" + +#ifndef WX_PRECOMP + #include "wx/intl.h" + #include "wx/utils.h" // for wxStripMenuCodes() +#endif + +bool wxIsStockID(wxWindowID id) +{ + switch (id) + { + case wxID_ABOUT: + case wxID_ADD: + case wxID_APPLY: + case wxID_BOLD: + case wxID_CANCEL: + case wxID_CLEAR: + case wxID_CLOSE: + case wxID_COPY: + case wxID_CUT: + case wxID_DELETE: + case wxID_EDIT: + case wxID_FIND: + case wxID_FILE: + case wxID_REPLACE: + case wxID_BACKWARD: + case wxID_DOWN: + case wxID_FORWARD: + case wxID_UP: + case wxID_HELP: + case wxID_HOME: + case wxID_INDENT: + case wxID_INDEX: + case wxID_ITALIC: + case wxID_JUSTIFY_CENTER: + case wxID_JUSTIFY_FILL: + case wxID_JUSTIFY_LEFT: + case wxID_JUSTIFY_RIGHT: + case wxID_NEW: + case wxID_NO: + case wxID_OK: + case wxID_OPEN: + case wxID_PASTE: + case wxID_PREFERENCES: + case wxID_PRINT: + case wxID_PREVIEW: + case wxID_PROPERTIES: + case wxID_EXIT: + case wxID_REDO: + case wxID_REFRESH: + case wxID_REMOVE: + case wxID_REVERT_TO_SAVED: + case wxID_SAVE: + case wxID_SAVEAS: + case wxID_SELECTALL: + case wxID_STOP: + case wxID_UNDELETE: + case wxID_UNDERLINE: + case wxID_UNDO: + case wxID_UNINDENT: + case wxID_YES: + case wxID_ZOOM_100: + case wxID_ZOOM_FIT: + case wxID_ZOOM_IN: + case wxID_ZOOM_OUT: + return true; + + default: + return false; + } +} + +wxString wxGetStockLabel(wxWindowID id, long flags) +{ + wxString stockLabel; + + #define STOCKITEM(stockid, label) \ + case stockid: \ + stockLabel = label; \ + break; + + switch (id) + { + STOCKITEM(wxID_ABOUT, _("&About")) + STOCKITEM(wxID_ADD, _("Add")) + STOCKITEM(wxID_APPLY, _("&Apply")) + STOCKITEM(wxID_BOLD, _("&Bold")) + STOCKITEM(wxID_CANCEL, _("&Cancel")) + STOCKITEM(wxID_CLEAR, _("&Clear")) + STOCKITEM(wxID_CLOSE, _("&Close")) + STOCKITEM(wxID_COPY, _("&Copy")) + STOCKITEM(wxID_CUT, _("Cu&t")) + STOCKITEM(wxID_DELETE, _("&Delete")) + STOCKITEM(wxID_EDIT, _("&Edit")) + STOCKITEM(wxID_FIND, _("&Find")) + STOCKITEM(wxID_FILE, _("&File")) + STOCKITEM(wxID_REPLACE, _("Rep&lace")) + STOCKITEM(wxID_BACKWARD, _("&Back")) + STOCKITEM(wxID_DOWN, _("&Down")) + STOCKITEM(wxID_FORWARD, _("&Forward")) + STOCKITEM(wxID_UP, _("&Up")) + STOCKITEM(wxID_HELP, _("&Help")) + STOCKITEM(wxID_HOME, _("&Home")) + STOCKITEM(wxID_INDENT, _("Indent")) + STOCKITEM(wxID_INDEX, _("&Index")) + STOCKITEM(wxID_ITALIC, _("&Italic")) + STOCKITEM(wxID_JUSTIFY_CENTER, _("Centered")) + STOCKITEM(wxID_JUSTIFY_FILL, _("Justified")) + STOCKITEM(wxID_JUSTIFY_LEFT, _("Align Left")) + STOCKITEM(wxID_JUSTIFY_RIGHT, _("Align Right")) + STOCKITEM(wxID_NEW, _("&New")) + STOCKITEM(wxID_NO, _("&No")) + STOCKITEM(wxID_OK, _("&OK")) + STOCKITEM(wxID_OPEN, _("&Open")) + STOCKITEM(wxID_PASTE, _("&Paste")) + STOCKITEM(wxID_PREFERENCES, _("&Preferences")) + STOCKITEM(wxID_PRINT, _("&Print")) + STOCKITEM(wxID_PREVIEW, _("Print previe&w")) + STOCKITEM(wxID_PROPERTIES, _("&Properties")) + STOCKITEM(wxID_EXIT, _("&Quit")) + STOCKITEM(wxID_REDO, _("&Redo")) + STOCKITEM(wxID_REFRESH, _("Refresh")) + STOCKITEM(wxID_REMOVE, _("Remove")) + STOCKITEM(wxID_REVERT_TO_SAVED, _("Revert to Saved")) + STOCKITEM(wxID_SAVE, _("&Save")) + STOCKITEM(wxID_SAVEAS, _("Save &As...")) + STOCKITEM(wxID_SELECTALL, _("Select all")) + STOCKITEM(wxID_STOP, _("&Stop")) + STOCKITEM(wxID_UNDELETE, _("Undelete")) + STOCKITEM(wxID_UNDERLINE, _("&Underline")) + STOCKITEM(wxID_UNDO, _("&Undo")) + STOCKITEM(wxID_UNINDENT, _("&Unindent")) + STOCKITEM(wxID_YES, _("&Yes")) + STOCKITEM(wxID_ZOOM_100, _("&Actual Size")) + STOCKITEM(wxID_ZOOM_FIT, _("Zoom to &Fit")) + STOCKITEM(wxID_ZOOM_IN, _("Zoom &In")) + STOCKITEM(wxID_ZOOM_OUT, _("Zoom &Out")) + + default: + wxFAIL_MSG( _T("invalid stock item ID") ); + break; + }; + + #undef STOCKITEM + + if ( !(flags & wxSTOCK_WITH_MNEMONIC) ) + { + stockLabel = wxStripMenuCodes(stockLabel); + } + +#if wxUSE_ACCEL + if ( !stockLabel.empty() && (flags & wxSTOCK_WITH_ACCELERATOR) ) + { + wxAcceleratorEntry accel = wxGetStockAccelerator(id); + if (accel.IsOk()) + stockLabel << _T('\t') << accel.ToString(); + } +#endif // wxUSE_ACCEL + + return stockLabel; +} + +wxString wxGetStockHelpString(wxWindowID id, wxStockHelpStringClient client) +{ + wxString stockHelp; + + #define STOCKITEM(stockid, ctx, helpstr) \ + case stockid: \ + if (client==ctx) stockHelp = helpstr; \ + break; + + switch (id) + { + // NB: these help string should be not too specific as they could be used + // in completely different programs! + STOCKITEM(wxID_ABOUT, wxSTOCK_MENU, _("Show about dialog")) + STOCKITEM(wxID_COPY, wxSTOCK_MENU, _("Copy selection")) + STOCKITEM(wxID_CUT, wxSTOCK_MENU, _("Cut selection")) + STOCKITEM(wxID_DELETE, wxSTOCK_MENU, _("Delete selection")) + STOCKITEM(wxID_REPLACE, wxSTOCK_MENU, _("Replace selection")) + STOCKITEM(wxID_PASTE, wxSTOCK_MENU, _("Paste selection")) + STOCKITEM(wxID_EXIT, wxSTOCK_MENU, _("Quit this program")) + STOCKITEM(wxID_REDO, wxSTOCK_MENU, _("Redo last action")) + STOCKITEM(wxID_UNDO, wxSTOCK_MENU, _("Undo last action")) + STOCKITEM(wxID_CLOSE, wxSTOCK_MENU, _("Close current document")) + STOCKITEM(wxID_SAVE, wxSTOCK_MENU, _("Save current document")) + STOCKITEM(wxID_SAVEAS, wxSTOCK_MENU, _("Save current document with a different filename")) + + default: + // there's no stock help string for this ID / client + return wxEmptyString; + } + + #undef STOCKITEM + + return stockHelp; +} + +#if wxUSE_ACCEL + +wxAcceleratorEntry wxGetStockAccelerator(wxWindowID id) +{ + wxAcceleratorEntry ret; + + #define STOCKITEM(stockid, flags, keycode) \ + case stockid: \ + ret.Set(flags, keycode, stockid); \ + break; + + switch (id) + { + STOCKITEM(wxID_COPY, wxACCEL_CTRL,'C') + STOCKITEM(wxID_CUT, wxACCEL_CTRL,'X') + STOCKITEM(wxID_FIND, wxACCEL_CTRL,'F') + STOCKITEM(wxID_REPLACE, wxACCEL_CTRL,'R') + STOCKITEM(wxID_HELP, wxACCEL_CTRL,'H') + STOCKITEM(wxID_NEW, wxACCEL_CTRL,'N') + STOCKITEM(wxID_OPEN, wxACCEL_CTRL,'O') + STOCKITEM(wxID_PASTE, wxACCEL_CTRL,'V') + STOCKITEM(wxID_SAVE, wxACCEL_CTRL,'S') + + default: + // set the wxAcceleratorEntry to return into an invalid state: + // there's no stock accelerator for that. + ret.Set(0, 0, id); + break; + }; + + #undef STOCKITEM + + // always use wxAcceleratorEntry::IsOk on returned value ! + return ret; +} + +#endif // wxUSE_ACCEL + +bool wxIsStockLabel(wxWindowID id, const wxString& label) +{ + if (label.empty()) + return true; + + wxString stock = wxGetStockLabel(id); + + if (label == stock) + return true; + + stock.Replace(_T("&"), wxEmptyString); + if (label == stock) + return true; + + return false; +} diff --git a/Externals/wxWidgets/src/common/stopwatch.cpp b/Externals/wxWidgets/src/common/stopwatch.cpp new file mode 100644 index 0000000000..1c8bbdaed5 --- /dev/null +++ b/Externals/wxWidgets/src/common/stopwatch.cpp @@ -0,0 +1,372 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/common/stopwatch.cpp +// Purpose: wxStopWatch and other non-GUI stuff from wx/timer.h +// Author: +// Original version by Julian Smart +// Vadim Zeitlin got rid of all ifdefs (11.12.99) +// Sylvain Bougnoux added wxStopWatch class +// Guillermo Rodriguez rewrote from scratch (Dic/99) +// Modified by: +// Created: 20.06.2003 (extracted from common/timercmn.cpp) +// RCS-ID: $Id: stopwatch.cpp 41054 2006-09-07 19:01:45Z ABX $ +// Copyright: (c) 1998-2003 wxWidgets Team +// License: wxWindows license +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// for compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#include "wx/stopwatch.h" + +#ifndef WX_PRECOMP + #ifdef __WXMSW__ + #include "wx/msw/wrapwin.h" + #endif + #include "wx/intl.h" + #include "wx/log.h" +#endif //WX_PRECOMP + +// ---------------------------------------------------------------------------- +// System headers +// ---------------------------------------------------------------------------- + +#if defined(__WIN32__) && !defined(HAVE_FTIME) && !defined(__MWERKS__) && !defined(__WXWINCE__) + #define HAVE_FTIME +#endif + +#if defined(__VISAGECPP__) && !defined(HAVE_FTIME) + #define HAVE_FTIME +# if __IBMCPP__ >= 400 + # define ftime(x) _ftime(x) +# endif +#endif + +#if defined(__MWERKS__) && defined(__WXMSW__) +# undef HAVE_FTIME +# undef HAVE_GETTIMEOFDAY +#endif + +#ifndef __WXWINCE__ +#include +#else +#include "wx/msw/private.h" +#include "wx/msw/wince/time.h" +#endif + +#if !defined(__WXMAC__) && !defined(__WXWINCE__) + #include // for time_t +#endif + +#if defined(HAVE_GETTIMEOFDAY) + #include + #include +#elif defined(HAVE_FTIME) + #include +#endif + +#ifdef __WXMAC__ +#ifndef __DARWIN__ + #include + #include +#else + #include +#endif +#endif + +#ifdef __WXPALMOS__ + #include + #include + #include +#endif + +// ---------------------------------------------------------------------------- +// macros +// ---------------------------------------------------------------------------- + +// on some really old systems gettimeofday() doesn't have the second argument, +// define wxGetTimeOfDay() to hide this difference +#ifdef HAVE_GETTIMEOFDAY + #ifdef WX_GETTIMEOFDAY_NO_TZ + struct timezone; + #define wxGetTimeOfDay(tv, tz) gettimeofday(tv) + #else + #define wxGetTimeOfDay(tv, tz) gettimeofday((tv), (tz)) + #endif +#endif // HAVE_GETTIMEOFDAY + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxStopWatch +// ---------------------------------------------------------------------------- + +#if wxUSE_STOPWATCH + +void wxStopWatch::Start(long t) +{ +#if 0 +// __WXMSW__ + LARGE_INTEGER frequency_li; + ::QueryPerformanceFrequency( &frequency_li ); + m_frequency = frequency_li.QuadPart; + if (m_frequency == 0) + { + m_t0 = wxGetLocalTimeMillis() - t; + } + else + { + LARGE_INTEGER counter_li; + ::QueryPerformanceCounter( &counter_li ); + wxLongLong counter = counter_li.QuadPart; + m_t0 = (counter * 10000 / m_frequency) - t*10; + } +#else + m_t0 = wxGetLocalTimeMillis() - t; +#endif + m_pause = 0; + m_pauseCount = 0; +} + +long wxStopWatch::GetElapsedTime() const +{ +#if 0 +//__WXMSW__ + if (m_frequency == 0) + { + return (wxGetLocalTimeMillis() - m_t0).GetLo(); + } + else + { + LARGE_INTEGER counter_li; + ::QueryPerformanceCounter( &counter_li ); + wxLongLong counter = counter_li.QuadPart; + wxLongLong res = (counter * 10000 / m_frequency) - m_t0; + return res.GetLo() / 10; + } +#else + return (wxGetLocalTimeMillis() - m_t0).GetLo(); +#endif +} + +long wxStopWatch::Time() const +{ + return m_pauseCount ? m_pause : GetElapsedTime(); +} + +#endif // wxUSE_STOPWATCH + +// ---------------------------------------------------------------------------- +// old timer functions superceded by wxStopWatch +// ---------------------------------------------------------------------------- + +#if wxUSE_LONGLONG + +static wxLongLong wxStartTime = 0l; + +// starts the global timer +void wxStartTimer() +{ + wxStartTime = wxGetLocalTimeMillis(); +} + +// Returns elapsed time in milliseconds +long wxGetElapsedTime(bool resetTimer) +{ + wxLongLong oldTime = wxStartTime; + wxLongLong newTime = wxGetLocalTimeMillis(); + + if ( resetTimer ) + wxStartTime = newTime; + + return (newTime - oldTime).GetLo(); +} + +#endif // wxUSE_LONGLONG + +// ---------------------------------------------------------------------------- +// the functions to get the current time and timezone info +// ---------------------------------------------------------------------------- + +// Get local time as seconds since 00:00:00, Jan 1st 1970 +long wxGetLocalTime() +{ + struct tm tm; + time_t t0, t1; + + // This cannot be made static because mktime can overwrite it. + // + memset(&tm, 0, sizeof(tm)); + tm.tm_year = 70; + tm.tm_mon = 0; + tm.tm_mday = 5; // not Jan 1st 1970 due to mktime 'feature' + tm.tm_hour = 0; + tm.tm_min = 0; + tm.tm_sec = 0; + tm.tm_isdst = -1; // let mktime guess + + // Note that mktime assumes that the struct tm contains local time. + // + t1 = time(&t1); // now + t0 = mktime(&tm); // origin + + // Return the difference in seconds. + // + if (( t0 != (time_t)-1 ) && ( t1 != (time_t)-1 )) + return (long)difftime(t1, t0) + (60 * 60 * 24 * 4); + + wxLogSysError(_("Failed to get the local system time")); + return -1; +} + +// Get UTC time as seconds since 00:00:00, Jan 1st 1970 +long wxGetUTCTime() +{ + return (long)time(NULL); +} + +#if wxUSE_LONGLONG + +// Get local time as milliseconds since 00:00:00, Jan 1st 1970 +wxLongLong wxGetLocalTimeMillis() +{ + wxLongLong val = 1000l; + + // If possible, use a function which avoids conversions from + // broken-up time structures to milliseconds + +#if defined(__WXPALMOS__) + DateTimeType thenst; + thenst.second = 0; + thenst.minute = 0; + thenst.hour = 0; + thenst.day = 1; + thenst.month = 1; + thenst.year = 1970; + thenst.weekDay = 5; + uint32_t now = TimGetSeconds(); + uint32_t then = TimDateTimeToSeconds (&thenst); + return SysTimeToMilliSecs(SysTimeInSecs(now - then)); +#elif defined(__WXMSW__) && (defined(__WINE__) || defined(__MWERKS__)) + // This should probably be the way all WXMSW compilers should do it + // Go direct to the OS for time + + SYSTEMTIME thenst = { 1970, 1, 4, 1, 0, 0, 0, 0 }; // 00:00:00 Jan 1st 1970 + FILETIME thenft; + SystemTimeToFileTime( &thenst, &thenft ); + wxLongLong then( thenft.dwHighDateTime, thenft.dwLowDateTime ); // time in 100 nanoseconds + + SYSTEMTIME nowst; + GetLocalTime( &nowst ); + FILETIME nowft; + SystemTimeToFileTime( &nowst, &nowft ); + wxLongLong now( nowft.dwHighDateTime, nowft.dwLowDateTime ); // time in 100 nanoseconds + + return ( now - then ) / 10000.0; // time from 00:00:00 Jan 1st 1970 to now in milliseconds + +#elif defined(HAVE_GETTIMEOFDAY) + struct timeval tp; + if ( wxGetTimeOfDay(&tp, (struct timezone *)NULL) != -1 ) + { + val *= tp.tv_sec; + return (val + (tp.tv_usec / 1000)); + } + else + { + wxLogError(_("wxGetTimeOfDay failed.")); + return 0; + } +#elif defined(HAVE_FTIME) + struct timeb tp; + + // ftime() is void and not int in some mingw32 headers, so don't + // test the return code (well, it shouldn't fail anyhow...) + (void)::ftime(&tp); + val *= tp.time; + return (val + tp.millitm); +#elif defined(__WXMAC__) + + static UInt64 gMilliAtStart = 0; + + Nanoseconds upTime = AbsoluteToNanoseconds( UpTime() ); + + if ( gMilliAtStart == 0 ) + { + time_t start = time(NULL); + gMilliAtStart = ((UInt64) start) * 1000000L; + gMilliAtStart -= upTime.lo / 1000 ; + gMilliAtStart -= ( ( (UInt64) upTime.hi ) << 32 ) / (1000 * 1000); + } + + UInt64 millival = gMilliAtStart; + millival += upTime.lo / (1000 * 1000); + millival += ( ( (UInt64) upTime.hi ) << 32 ) / (1000 * 1000); + val = millival; + + return val; +#else // no gettimeofday() nor ftime() + // We use wxGetLocalTime() to get the seconds since + // 00:00:00 Jan 1st 1970 and then whatever is available + // to get millisecond resolution. + // + // NOTE that this might lead to a problem if the clocks + // use different sources, so this approach should be + // avoided where possible. + + val *= wxGetLocalTime(); + +// GRG: This will go soon as all WIN32 seem to have ftime +// JACS: unfortunately not. WinCE doesn't have it. +#if defined (__WIN32__) + // If your platform/compiler needs to use two different functions + // to get ms resolution, please do NOT just shut off these warnings, + // drop me a line instead at + + // FIXME +#ifndef __WXWINCE__ + #warning "Possible clock skew bug in wxGetLocalTimeMillis()!" +#endif + + SYSTEMTIME st; + ::GetLocalTime(&st); + val += st.wMilliseconds; +#else // !Win32 + // If your platform/compiler does not support ms resolution please + // do NOT just shut off these warnings, drop me a line instead at + // + + #if defined(__VISUALC__) || defined (__WATCOMC__) + #pragma message("wxStopWatch will be up to second resolution!") + #elif defined(__BORLANDC__) + #pragma message "wxStopWatch will be up to second resolution!" + #else + #warning "wxStopWatch will be up to second resolution!" + #endif // compiler +#endif + + return val; + +#endif // time functions +} + +#else // !wxUSE_LONGLONG + +double wxGetLocalTimeMillis(void) +{ + return (double(clock()) / double(CLOCKS_PER_SEC)) * 1000.0; +} + +#endif // wxUSE_LONGLONG/!wxUSE_LONGLONG diff --git a/Externals/wxWidgets/src/common/strconv.cpp b/Externals/wxWidgets/src/common/strconv.cpp new file mode 100644 index 0000000000..3de2fe6a9b --- /dev/null +++ b/Externals/wxWidgets/src/common/strconv.cpp @@ -0,0 +1,3697 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/strconv.cpp +// Purpose: Unicode conversion classes +// Author: Ove Kaaven, Robert Roebling, Vadim Zeitlin, Vaclav Slavik, +// Ryan Norton, Fredrik Roubert (UTF7) +// Modified by: +// Created: 29/01/98 +// RCS-ID: $Id: strconv.cpp 45921 2007-05-09 18:10:26Z VZ $ +// Copyright: (c) 1999 Ove Kaaven, Robert Roebling, Vaclav Slavik +// (c) 2000-2003 Vadim Zeitlin +// (c) 2004 Ryan Norton, Fredrik Roubert +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifndef WX_PRECOMP + #ifdef __WXMSW__ + #include "wx/msw/missing.h" + #endif + #include "wx/intl.h" + #include "wx/log.h" + #include "wx/utils.h" + #include "wx/hashmap.h" +#endif + +#include "wx/strconv.h" + +#if wxUSE_WCHAR_T + +#ifdef __WINDOWS__ + #include "wx/msw/private.h" +#endif + +#ifndef __WXWINCE__ +#include +#endif + +#include +#include +#include + +#if defined(__WIN32__) && !defined(__WXMICROWIN__) + #define wxHAVE_WIN32_MB2WC +#endif + +#ifdef __SALFORDC__ + #include +#endif + +#ifdef HAVE_ICONV + #include + #include "wx/thread.h" +#endif + +#include "wx/encconv.h" +#include "wx/fontmap.h" + +#ifdef __WXMAC__ +#ifndef __DARWIN__ +#include +#include +#include +#endif + +// includes Mac headers +#include "wx/mac/private.h" +#endif + + +#define TRACE_STRCONV _T("strconv") + +// WC_UTF16 is defined only if sizeof(wchar_t) == 2, otherwise it's supposed to +// be 4 bytes +#if SIZEOF_WCHAR_T == 2 + #define WC_UTF16 +#endif + + +// ============================================================================ +// implementation +// ============================================================================ + +// helper function of cMB2WC(): check if n bytes at this location are all NUL +static bool NotAllNULs(const char *p, size_t n) +{ + while ( n && *p++ == '\0' ) + n--; + + return n != 0; +} + +// ---------------------------------------------------------------------------- +// UTF-16 en/decoding to/from UCS-4 with surrogates handling +// ---------------------------------------------------------------------------- + +static size_t encode_utf16(wxUint32 input, wxUint16 *output) +{ + if (input <= 0xffff) + { + if (output) + *output = (wxUint16) input; + + return 1; + } + else if (input >= 0x110000) + { + return wxCONV_FAILED; + } + else + { + if (output) + { + *output++ = (wxUint16) ((input >> 10) + 0xd7c0); + *output = (wxUint16) ((input & 0x3ff) + 0xdc00); + } + + return 2; + } +} + +static size_t decode_utf16(const wxUint16* input, wxUint32& output) +{ + if ((*input < 0xd800) || (*input > 0xdfff)) + { + output = *input; + return 1; + } + else if ((input[1] < 0xdc00) || (input[1] > 0xdfff)) + { + output = *input; + return wxCONV_FAILED; + } + else + { + output = ((input[0] - 0xd7c0) << 10) + (input[1] - 0xdc00); + return 2; + } +} + +#ifdef WC_UTF16 + typedef wchar_t wxDecodeSurrogate_t; +#else // !WC_UTF16 + typedef wxUint16 wxDecodeSurrogate_t; +#endif // WC_UTF16/!WC_UTF16 + +// returns the next UTF-32 character from the wchar_t buffer and advances the +// pointer to the character after this one +// +// if an invalid character is found, *pSrc is set to NULL, the caller must +// check for this +static wxUint32 wxDecodeSurrogate(const wxDecodeSurrogate_t **pSrc) +{ + wxUint32 out; + const size_t + n = decode_utf16(wx_reinterpret_cast(const wxUint16 *, *pSrc), out); + if ( n == wxCONV_FAILED ) + *pSrc = NULL; + else + *pSrc += n; + + return out; +} + +// ---------------------------------------------------------------------------- +// wxMBConv +// ---------------------------------------------------------------------------- + +size_t +wxMBConv::ToWChar(wchar_t *dst, size_t dstLen, + const char *src, size_t srcLen) const +{ + // although new conversion classes are supposed to implement this function + // directly, the existins ones only implement the old MB2WC() and so, to + // avoid to have to rewrite all conversion classes at once, we provide a + // default (but not efficient) implementation of this one in terms of the + // old function by copying the input to ensure that it's NUL-terminated and + // then using MB2WC() to convert it + + // the number of chars [which would be] written to dst [if it were not NULL] + size_t dstWritten = 0; + + // the number of NULs terminating this string + size_t nulLen = 0; // not really needed, but just to avoid warnings + + // if we were not given the input size we just have to assume that the + // string is properly terminated as we have no way of knowing how long it + // is anyhow, but if we do have the size check whether there are enough + // NULs at the end + wxCharBuffer bufTmp; + const char *srcEnd; + if ( srcLen != wxNO_LEN ) + { + // we need to know how to find the end of this string + nulLen = GetMBNulLen(); + if ( nulLen == wxCONV_FAILED ) + return wxCONV_FAILED; + + // if there are enough NULs we can avoid the copy + if ( srcLen < nulLen || NotAllNULs(src + srcLen - nulLen, nulLen) ) + { + // make a copy in order to properly NUL-terminate the string + bufTmp = wxCharBuffer(srcLen + nulLen - 1 /* 1 will be added */); + char * const p = bufTmp.data(); + memcpy(p, src, srcLen); + for ( char *s = p + srcLen; s < p + srcLen + nulLen; s++ ) + *s = '\0'; + + src = bufTmp; + } + + srcEnd = src + srcLen; + } + else // quit after the first loop iteration + { + srcEnd = NULL; + } + + for ( ;; ) + { + // try to convert the current chunk + size_t lenChunk = MB2WC(NULL, src, 0); + if ( lenChunk == wxCONV_FAILED ) + return wxCONV_FAILED; + + lenChunk++; // for the L'\0' at the end of this chunk + + dstWritten += lenChunk; + + if ( lenChunk == 1 ) + { + // nothing left in the input string, conversion succeeded + break; + } + + if ( dst ) + { + if ( dstWritten > dstLen ) + return wxCONV_FAILED; + + if ( MB2WC(dst, src, lenChunk) == wxCONV_FAILED ) + return wxCONV_FAILED; + + dst += lenChunk; + } + + if ( !srcEnd ) + { + // we convert just one chunk in this case as this is the entire + // string anyhow + break; + } + + // advance the input pointer past the end of this chunk + while ( NotAllNULs(src, nulLen) ) + { + // notice that we must skip over multiple bytes here as we suppose + // that if NUL takes 2 or 4 bytes, then all the other characters do + // too and so if advanced by a single byte we might erroneously + // detect sequences of NUL bytes in the middle of the input + src += nulLen; + } + + src += nulLen; // skipping over its terminator as well + + // note that ">=" (and not just "==") is needed here as the terminator + // we skipped just above could be inside or just after the buffer + // delimited by inEnd + if ( src >= srcEnd ) + break; + } + + return dstWritten; +} + +size_t +wxMBConv::FromWChar(char *dst, size_t dstLen, + const wchar_t *src, size_t srcLen) const +{ + // the number of chars [which would be] written to dst [if it were not NULL] + size_t dstWritten = 0; + + // make a copy of the input string unless it is already properly + // NUL-terminated + // + // if we don't know its length we have no choice but to assume that it is, + // indeed, properly terminated + wxWCharBuffer bufTmp; + if ( srcLen == wxNO_LEN ) + { + srcLen = wxWcslen(src) + 1; + } + else if ( srcLen != 0 && src[srcLen - 1] != L'\0' ) + { + // make a copy in order to properly NUL-terminate the string + bufTmp = wxWCharBuffer(srcLen); + memcpy(bufTmp.data(), src, srcLen * sizeof(wchar_t)); + src = bufTmp; + } + + const size_t lenNul = GetMBNulLen(); + for ( const wchar_t * const srcEnd = src + srcLen; + src < srcEnd; + src += wxWcslen(src) + 1 /* skip L'\0' too */ ) + { + // try to convert the current chunk + size_t lenChunk = WC2MB(NULL, src, 0); + + if ( lenChunk == wxCONV_FAILED ) + return wxCONV_FAILED; + + lenChunk += lenNul; + dstWritten += lenChunk; + + if ( dst ) + { + if ( dstWritten > dstLen ) + return wxCONV_FAILED; + + if ( WC2MB(dst, src, lenChunk) == wxCONV_FAILED ) + return wxCONV_FAILED; + + dst += lenChunk; + } + } + + return dstWritten; +} + +size_t wxMBConv::MB2WC(wchar_t *outBuff, const char *inBuff, size_t outLen) const +{ + size_t rc = ToWChar(outBuff, outLen, inBuff); + if ( rc != wxCONV_FAILED ) + { + // ToWChar() returns the buffer length, i.e. including the trailing + // NUL, while this method doesn't take it into account + rc--; + } + + return rc; +} + +size_t wxMBConv::WC2MB(char *outBuff, const wchar_t *inBuff, size_t outLen) const +{ + size_t rc = FromWChar(outBuff, outLen, inBuff); + if ( rc != wxCONV_FAILED ) + { + rc -= GetMBNulLen(); + } + + return rc; +} + +wxMBConv::~wxMBConv() +{ + // nothing to do here (necessary for Darwin linking probably) +} + +const wxWCharBuffer wxMBConv::cMB2WC(const char *psz) const +{ + if ( psz ) + { + // calculate the length of the buffer needed first + const size_t nLen = MB2WC(NULL, psz, 0); + if ( nLen != wxCONV_FAILED ) + { + // now do the actual conversion + wxWCharBuffer buf(nLen /* +1 added implicitly */); + + // +1 for the trailing NULL + if ( MB2WC(buf.data(), psz, nLen + 1) != wxCONV_FAILED ) + return buf; + } + } + + return wxWCharBuffer(); +} + +const wxCharBuffer wxMBConv::cWC2MB(const wchar_t *pwz) const +{ + if ( pwz ) + { + const size_t nLen = WC2MB(NULL, pwz, 0); + if ( nLen != wxCONV_FAILED ) + { + // extra space for trailing NUL(s) + static const size_t extraLen = GetMaxMBNulLen(); + + wxCharBuffer buf(nLen + extraLen - 1); + if ( WC2MB(buf.data(), pwz, nLen + extraLen) != wxCONV_FAILED ) + return buf; + } + } + + return wxCharBuffer(); +} + +const wxWCharBuffer +wxMBConv::cMB2WC(const char *inBuff, size_t inLen, size_t *outLen) const +{ + const size_t dstLen = ToWChar(NULL, 0, inBuff, inLen); + if ( dstLen != wxCONV_FAILED ) + { + wxWCharBuffer wbuf(dstLen - 1); + if ( ToWChar(wbuf.data(), dstLen, inBuff, inLen) != wxCONV_FAILED ) + { + if ( outLen ) + { + *outLen = dstLen; + if ( wbuf[dstLen - 1] == L'\0' ) + (*outLen)--; + } + + return wbuf; + } + } + + if ( outLen ) + *outLen = 0; + + return wxWCharBuffer(); +} + +const wxCharBuffer +wxMBConv::cWC2MB(const wchar_t *inBuff, size_t inLen, size_t *outLen) const +{ + size_t dstLen = FromWChar(NULL, 0, inBuff, inLen); + if ( dstLen != wxCONV_FAILED ) + { + // special case of empty input: can't allocate 0 size buffer below as + // wxCharBuffer insists on NUL-terminating it + wxCharBuffer buf(dstLen ? dstLen - 1 : 1); + if ( FromWChar(buf.data(), dstLen, inBuff, inLen) != wxCONV_FAILED ) + { + if ( outLen ) + { + *outLen = dstLen; + + const size_t nulLen = GetMBNulLen(); + if ( dstLen >= nulLen && + !NotAllNULs(buf.data() + dstLen - nulLen, nulLen) ) + { + // in this case the output is NUL-terminated and we're not + // supposed to count NUL + *outLen -= nulLen; + } + } + + return buf; + } + } + + if ( outLen ) + *outLen = 0; + + return wxCharBuffer(); +} + +// ---------------------------------------------------------------------------- +// wxMBConvLibc +// ---------------------------------------------------------------------------- + +size_t wxMBConvLibc::MB2WC(wchar_t *buf, const char *psz, size_t n) const +{ + return wxMB2WC(buf, psz, n); +} + +size_t wxMBConvLibc::WC2MB(char *buf, const wchar_t *psz, size_t n) const +{ + return wxWC2MB(buf, psz, n); +} + +// ---------------------------------------------------------------------------- +// wxConvBrokenFileNames +// ---------------------------------------------------------------------------- + +#ifdef __UNIX__ + +wxConvBrokenFileNames::wxConvBrokenFileNames(const wxChar *charset) +{ + if ( !charset || wxStricmp(charset, _T("UTF-8")) == 0 + || wxStricmp(charset, _T("UTF8")) == 0 ) + m_conv = new wxMBConvUTF8(wxMBConvUTF8::MAP_INVALID_UTF8_TO_PUA); + else + m_conv = new wxCSConv(charset); +} + +#endif // __UNIX__ + +// ---------------------------------------------------------------------------- +// UTF-7 +// ---------------------------------------------------------------------------- + +// Implementation (C) 2004 Fredrik Roubert + +// +// BASE64 decoding table +// +static const unsigned char utf7unb64[] = +{ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x3e, 0xff, 0xff, 0xff, 0x3f, + 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, + 0x3c, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, + 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, + 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, + 0x17, 0x18, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, + 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, + 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, + 0x31, 0x32, 0x33, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff +}; + +size_t wxMBConvUTF7::MB2WC(wchar_t *buf, const char *psz, size_t n) const +{ + size_t len = 0; + + while ( *psz && (!buf || (len < n)) ) + { + unsigned char cc = *psz++; + if (cc != '+') + { + // plain ASCII char + if (buf) + *buf++ = cc; + len++; + } + else if (*psz == '-') + { + // encoded plus sign + if (buf) + *buf++ = cc; + len++; + psz++; + } + else // start of BASE64 encoded string + { + bool lsb, ok; + unsigned int d, l; + for ( ok = lsb = false, d = 0, l = 0; + (cc = utf7unb64[(unsigned char)*psz]) != 0xff; + psz++ ) + { + d <<= 6; + d += cc; + for (l += 6; l >= 8; lsb = !lsb) + { + unsigned char c = (unsigned char)((d >> (l -= 8)) % 256); + if (lsb) + { + if (buf) + *buf++ |= c; + len ++; + } + else + { + if (buf) + *buf = (wchar_t)(c << 8); + } + + ok = true; + } + } + + if ( !ok ) + { + // in valid UTF7 we should have valid characters after '+' + return wxCONV_FAILED; + } + + if (*psz == '-') + psz++; + } + } + + if ( buf && (len < n) ) + *buf = '\0'; + + return len; +} + +// +// BASE64 encoding table +// +static const unsigned char utf7enb64[] = +{ + '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', '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', '0', '1', '2', '3', + '4', '5', '6', '7', '8', '9', '+', '/' +}; + +// +// UTF-7 encoding table +// +// 0 - Set D (directly encoded characters) +// 1 - Set O (optional direct characters) +// 2 - whitespace characters (optional) +// 3 - special characters +// +static const unsigned char utf7encode[128] = +{ + 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 3, 3, 2, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 2, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 3, 0, 0, 0, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 1, 1, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 3, 3 +}; + +size_t wxMBConvUTF7::WC2MB(char *buf, const wchar_t *psz, size_t n) const +{ + size_t len = 0; + + while (*psz && ((!buf) || (len < n))) + { + wchar_t cc = *psz++; + if (cc < 0x80 && utf7encode[cc] < 1) + { + // plain ASCII char + if (buf) + *buf++ = (char)cc; + + len++; + } +#ifndef WC_UTF16 + else if (((wxUint32)cc) > 0xffff) + { + // no surrogate pair generation (yet?) + return wxCONV_FAILED; + } +#endif + else + { + if (buf) + *buf++ = '+'; + + len++; + if (cc != '+') + { + // BASE64 encode string + unsigned int lsb, d, l; + for (d = 0, l = 0; /*nothing*/; psz++) + { + for (lsb = 0; lsb < 2; lsb ++) + { + d <<= 8; + d += lsb ? cc & 0xff : (cc & 0xff00) >> 8; + + for (l += 8; l >= 6; ) + { + l -= 6; + if (buf) + *buf++ = utf7enb64[(d >> l) % 64]; + len++; + } + } + + cc = *psz; + if (!(cc) || (cc < 0x80 && utf7encode[cc] < 1)) + break; + } + + if (l != 0) + { + if (buf) + *buf++ = utf7enb64[((d % 16) << (6 - l)) % 64]; + + len++; + } + } + + if (buf) + *buf++ = '-'; + len++; + } + } + + if (buf && (len < n)) + *buf = 0; + + return len; +} + +// ---------------------------------------------------------------------------- +// UTF-8 +// ---------------------------------------------------------------------------- + +static wxUint32 utf8_max[]= + { 0x7f, 0x7ff, 0xffff, 0x1fffff, 0x3ffffff, 0x7fffffff, 0xffffffff }; + +// boundaries of the private use area we use to (temporarily) remap invalid +// characters invalid in a UTF-8 encoded string +const wxUint32 wxUnicodePUA = 0x100000; +const wxUint32 wxUnicodePUAEnd = wxUnicodePUA + 256; + +size_t wxMBConvUTF8::MB2WC(wchar_t *buf, const char *psz, size_t n) const +{ + size_t len = 0; + + while (*psz && ((!buf) || (len < n))) + { + const char *opsz = psz; + bool invalid = false; + unsigned char cc = *psz++, fc = cc; + unsigned cnt; + for (cnt = 0; fc & 0x80; cnt++) + fc <<= 1; + + if (!cnt) + { + // plain ASCII char + if (buf) + *buf++ = cc; + len++; + + // escape the escape character for octal escapes + if ((m_options & MAP_INVALID_UTF8_TO_OCTAL) + && cc == '\\' && (!buf || len < n)) + { + if (buf) + *buf++ = cc; + len++; + } + } + else + { + cnt--; + if (!cnt) + { + // invalid UTF-8 sequence + invalid = true; + } + else + { + unsigned ocnt = cnt - 1; + wxUint32 res = cc & (0x3f >> cnt); + while (cnt--) + { + cc = *psz; + if ((cc & 0xC0) != 0x80) + { + // invalid UTF-8 sequence + invalid = true; + break; + } + + psz++; + res = (res << 6) | (cc & 0x3f); + } + + if (invalid || res <= utf8_max[ocnt]) + { + // illegal UTF-8 encoding + invalid = true; + } + else if ((m_options & MAP_INVALID_UTF8_TO_PUA) && + res >= wxUnicodePUA && res < wxUnicodePUAEnd) + { + // if one of our PUA characters turns up externally + // it must also be treated as an illegal sequence + // (a bit like you have to escape an escape character) + invalid = true; + } + else + { +#ifdef WC_UTF16 + // cast is ok because wchar_t == wxUuint16 if WC_UTF16 + size_t pa = encode_utf16(res, (wxUint16 *)buf); + if (pa == wxCONV_FAILED) + { + invalid = true; + } + else + { + if (buf) + buf += pa; + len += pa; + } +#else // !WC_UTF16 + if (buf) + *buf++ = (wchar_t)res; + len++; +#endif // WC_UTF16/!WC_UTF16 + } + } + + if (invalid) + { + if (m_options & MAP_INVALID_UTF8_TO_PUA) + { + while (opsz < psz && (!buf || len < n)) + { +#ifdef WC_UTF16 + // cast is ok because wchar_t == wxUuint16 if WC_UTF16 + size_t pa = encode_utf16((unsigned char)*opsz + wxUnicodePUA, (wxUint16 *)buf); + wxASSERT(pa != wxCONV_FAILED); + if (buf) + buf += pa; + opsz++; + len += pa; +#else + if (buf) + *buf++ = (wchar_t)(wxUnicodePUA + (unsigned char)*opsz); + opsz++; + len++; +#endif + } + } + else if (m_options & MAP_INVALID_UTF8_TO_OCTAL) + { + while (opsz < psz && (!buf || len < n)) + { + if ( buf && len + 3 < n ) + { + unsigned char on = *opsz; + *buf++ = L'\\'; + *buf++ = (wchar_t)( L'0' + on / 0100 ); + *buf++ = (wchar_t)( L'0' + (on % 0100) / 010 ); + *buf++ = (wchar_t)( L'0' + on % 010 ); + } + + opsz++; + len += 4; + } + } + else // MAP_INVALID_UTF8_NOT + { + return wxCONV_FAILED; + } + } + } + } + + if (buf && (len < n)) + *buf = 0; + + return len; +} + +static inline bool isoctal(wchar_t wch) +{ + return L'0' <= wch && wch <= L'7'; +} + +size_t wxMBConvUTF8::WC2MB(char *buf, const wchar_t *psz, size_t n) const +{ + size_t len = 0; + + while (*psz && ((!buf) || (len < n))) + { + wxUint32 cc; + +#ifdef WC_UTF16 + // cast is ok for WC_UTF16 + size_t pa = decode_utf16((const wxUint16 *)psz, cc); + psz += (pa == wxCONV_FAILED) ? 1 : pa; +#else + cc = (*psz++) & 0x7fffffff; +#endif + + if ( (m_options & MAP_INVALID_UTF8_TO_PUA) + && cc >= wxUnicodePUA && cc < wxUnicodePUAEnd ) + { + if (buf) + *buf++ = (char)(cc - wxUnicodePUA); + len++; + } + else if ( (m_options & MAP_INVALID_UTF8_TO_OCTAL) + && cc == L'\\' && psz[0] == L'\\' ) + { + if (buf) + *buf++ = (char)cc; + psz++; + len++; + } + else if ( (m_options & MAP_INVALID_UTF8_TO_OCTAL) && + cc == L'\\' && + isoctal(psz[0]) && isoctal(psz[1]) && isoctal(psz[2]) ) + { + if (buf) + { + *buf++ = (char) ((psz[0] - L'0') * 0100 + + (psz[1] - L'0') * 010 + + (psz[2] - L'0')); + } + + psz += 3; + len++; + } + else + { + unsigned cnt; + for (cnt = 0; cc > utf8_max[cnt]; cnt++) + { + } + + if (!cnt) + { + // plain ASCII char + if (buf) + *buf++ = (char) cc; + len++; + } + else + { + len += cnt + 1; + if (buf) + { + *buf++ = (char) ((-128 >> cnt) | ((cc >> (cnt * 6)) & (0x3f >> cnt))); + while (cnt--) + *buf++ = (char) (0x80 | ((cc >> (cnt * 6)) & 0x3f)); + } + } + } + } + + if (buf && (len < n)) + *buf = 0; + + return len; +} + +// ============================================================================ +// UTF-16 +// ============================================================================ + +#ifdef WORDS_BIGENDIAN + #define wxMBConvUTF16straight wxMBConvUTF16BE + #define wxMBConvUTF16swap wxMBConvUTF16LE +#else + #define wxMBConvUTF16swap wxMBConvUTF16BE + #define wxMBConvUTF16straight wxMBConvUTF16LE +#endif + +/* static */ +size_t wxMBConvUTF16Base::GetLength(const char *src, size_t srcLen) +{ + if ( srcLen == wxNO_LEN ) + { + // count the number of bytes in input, including the trailing NULs + const wxUint16 *inBuff = wx_reinterpret_cast(const wxUint16 *, src); + for ( srcLen = 1; *inBuff++; srcLen++ ) + ; + + srcLen *= BYTES_PER_CHAR; + } + else // we already have the length + { + // we can only convert an entire number of UTF-16 characters + if ( srcLen % BYTES_PER_CHAR ) + return wxCONV_FAILED; + } + + return srcLen; +} + +// case when in-memory representation is UTF-16 too +#ifdef WC_UTF16 + +// ---------------------------------------------------------------------------- +// conversions without endianness change +// ---------------------------------------------------------------------------- + +size_t +wxMBConvUTF16straight::ToWChar(wchar_t *dst, size_t dstLen, + const char *src, size_t srcLen) const +{ + // set up the scene for using memcpy() (which is presumably more efficient + // than copying the bytes one by one) + srcLen = GetLength(src, srcLen); + if ( srcLen == wxNO_LEN ) + return wxCONV_FAILED; + + const size_t inLen = srcLen / BYTES_PER_CHAR; + if ( dst ) + { + if ( dstLen < inLen ) + return wxCONV_FAILED; + + memcpy(dst, src, srcLen); + } + + return inLen; +} + +size_t +wxMBConvUTF16straight::FromWChar(char *dst, size_t dstLen, + const wchar_t *src, size_t srcLen) const +{ + if ( srcLen == wxNO_LEN ) + srcLen = wxWcslen(src) + 1; + + srcLen *= BYTES_PER_CHAR; + + if ( dst ) + { + if ( dstLen < srcLen ) + return wxCONV_FAILED; + + memcpy(dst, src, srcLen); + } + + return srcLen; +} + +// ---------------------------------------------------------------------------- +// endian-reversing conversions +// ---------------------------------------------------------------------------- + +size_t +wxMBConvUTF16swap::ToWChar(wchar_t *dst, size_t dstLen, + const char *src, size_t srcLen) const +{ + srcLen = GetLength(src, srcLen); + if ( srcLen == wxNO_LEN ) + return wxCONV_FAILED; + + srcLen /= BYTES_PER_CHAR; + + if ( dst ) + { + if ( dstLen < srcLen ) + return wxCONV_FAILED; + + const wxUint16 *inBuff = wx_reinterpret_cast(const wxUint16 *, src); + for ( size_t n = 0; n < srcLen; n++, inBuff++ ) + { + *dst++ = wxUINT16_SWAP_ALWAYS(*inBuff); + } + } + + return srcLen; +} + +size_t +wxMBConvUTF16swap::FromWChar(char *dst, size_t dstLen, + const wchar_t *src, size_t srcLen) const +{ + if ( srcLen == wxNO_LEN ) + srcLen = wxWcslen(src) + 1; + + srcLen *= BYTES_PER_CHAR; + + if ( dst ) + { + if ( dstLen < srcLen ) + return wxCONV_FAILED; + + wxUint16 *outBuff = wx_reinterpret_cast(wxUint16 *, dst); + for ( size_t n = 0; n < srcLen; n += BYTES_PER_CHAR, src++ ) + { + *outBuff++ = wxUINT16_SWAP_ALWAYS(*src); + } + } + + return srcLen; +} + +#else // !WC_UTF16: wchar_t is UTF-32 + +// ---------------------------------------------------------------------------- +// conversions without endianness change +// ---------------------------------------------------------------------------- + +size_t +wxMBConvUTF16straight::ToWChar(wchar_t *dst, size_t dstLen, + const char *src, size_t srcLen) const +{ + srcLen = GetLength(src, srcLen); + if ( srcLen == wxNO_LEN ) + return wxCONV_FAILED; + + const size_t inLen = srcLen / BYTES_PER_CHAR; + if ( !dst ) + { + // optimization: return maximal space which could be needed for this + // string even if the real size could be smaller if the buffer contains + // any surrogates + return inLen; + } + + size_t outLen = 0; + const wxUint16 *inBuff = wx_reinterpret_cast(const wxUint16 *, src); + for ( const wxUint16 * const inEnd = inBuff + inLen; inBuff < inEnd; ) + { + const wxUint32 ch = wxDecodeSurrogate(&inBuff); + if ( !inBuff ) + return wxCONV_FAILED; + + if ( ++outLen > dstLen ) + return wxCONV_FAILED; + + *dst++ = ch; + } + + + return outLen; +} + +size_t +wxMBConvUTF16straight::FromWChar(char *dst, size_t dstLen, + const wchar_t *src, size_t srcLen) const +{ + if ( srcLen == wxNO_LEN ) + srcLen = wxWcslen(src) + 1; + + size_t outLen = 0; + wxUint16 *outBuff = wx_reinterpret_cast(wxUint16 *, dst); + for ( size_t n = 0; n < srcLen; n++ ) + { + wxUint16 cc[2]; + const size_t numChars = encode_utf16(*src++, cc); + if ( numChars == wxCONV_FAILED ) + return wxCONV_FAILED; + + outLen += numChars * BYTES_PER_CHAR; + if ( outBuff ) + { + if ( outLen > dstLen ) + return wxCONV_FAILED; + + *outBuff++ = cc[0]; + if ( numChars == 2 ) + { + // second character of a surrogate + *outBuff++ = cc[1]; + } + } + } + + return outLen; +} + +// ---------------------------------------------------------------------------- +// endian-reversing conversions +// ---------------------------------------------------------------------------- + +size_t +wxMBConvUTF16swap::ToWChar(wchar_t *dst, size_t dstLen, + const char *src, size_t srcLen) const +{ + srcLen = GetLength(src, srcLen); + if ( srcLen == wxNO_LEN ) + return wxCONV_FAILED; + + const size_t inLen = srcLen / BYTES_PER_CHAR; + if ( !dst ) + { + // optimization: return maximal space which could be needed for this + // string even if the real size could be smaller if the buffer contains + // any surrogates + return inLen; + } + + size_t outLen = 0; + const wxUint16 *inBuff = wx_reinterpret_cast(const wxUint16 *, src); + for ( const wxUint16 * const inEnd = inBuff + inLen; inBuff < inEnd; ) + { + wxUint32 ch; + wxUint16 tmp[2]; + + tmp[0] = wxUINT16_SWAP_ALWAYS(*inBuff); + inBuff++; + tmp[1] = wxUINT16_SWAP_ALWAYS(*inBuff); + + const size_t numChars = decode_utf16(tmp, ch); + if ( numChars == wxCONV_FAILED ) + return wxCONV_FAILED; + + if ( numChars == 2 ) + inBuff++; + + if ( ++outLen > dstLen ) + return wxCONV_FAILED; + + *dst++ = ch; + } + + + return outLen; +} + +size_t +wxMBConvUTF16swap::FromWChar(char *dst, size_t dstLen, + const wchar_t *src, size_t srcLen) const +{ + if ( srcLen == wxNO_LEN ) + srcLen = wxWcslen(src) + 1; + + size_t outLen = 0; + wxUint16 *outBuff = wx_reinterpret_cast(wxUint16 *, dst); + for ( const wchar_t *srcEnd = src + srcLen; src < srcEnd; src++ ) + { + wxUint16 cc[2]; + const size_t numChars = encode_utf16(*src, cc); + if ( numChars == wxCONV_FAILED ) + return wxCONV_FAILED; + + outLen += numChars * BYTES_PER_CHAR; + if ( outBuff ) + { + if ( outLen > dstLen ) + return wxCONV_FAILED; + + *outBuff++ = wxUINT16_SWAP_ALWAYS(cc[0]); + if ( numChars == 2 ) + { + // second character of a surrogate + *outBuff++ = wxUINT16_SWAP_ALWAYS(cc[1]); + } + } + } + + return outLen; +} + +#endif // WC_UTF16/!WC_UTF16 + + +// ============================================================================ +// UTF-32 +// ============================================================================ + +#ifdef WORDS_BIGENDIAN + #define wxMBConvUTF32straight wxMBConvUTF32BE + #define wxMBConvUTF32swap wxMBConvUTF32LE +#else + #define wxMBConvUTF32swap wxMBConvUTF32BE + #define wxMBConvUTF32straight wxMBConvUTF32LE +#endif + + +WXDLLIMPEXP_DATA_BASE(wxMBConvUTF32LE) wxConvUTF32LE; +WXDLLIMPEXP_DATA_BASE(wxMBConvUTF32BE) wxConvUTF32BE; + +/* static */ +size_t wxMBConvUTF32Base::GetLength(const char *src, size_t srcLen) +{ + if ( srcLen == wxNO_LEN ) + { + // count the number of bytes in input, including the trailing NULs + const wxUint32 *inBuff = wx_reinterpret_cast(const wxUint32 *, src); + for ( srcLen = 1; *inBuff++; srcLen++ ) + ; + + srcLen *= BYTES_PER_CHAR; + } + else // we already have the length + { + // we can only convert an entire number of UTF-32 characters + if ( srcLen % BYTES_PER_CHAR ) + return wxCONV_FAILED; + } + + return srcLen; +} + +// case when in-memory representation is UTF-16 +#ifdef WC_UTF16 + +// ---------------------------------------------------------------------------- +// conversions without endianness change +// ---------------------------------------------------------------------------- + +size_t +wxMBConvUTF32straight::ToWChar(wchar_t *dst, size_t dstLen, + const char *src, size_t srcLen) const +{ + srcLen = GetLength(src, srcLen); + if ( srcLen == wxNO_LEN ) + return wxCONV_FAILED; + + const wxUint32 *inBuff = wx_reinterpret_cast(const wxUint32 *, src); + const size_t inLen = srcLen / BYTES_PER_CHAR; + size_t outLen = 0; + for ( size_t n = 0; n < inLen; n++ ) + { + wxUint16 cc[2]; + const size_t numChars = encode_utf16(*inBuff++, cc); + if ( numChars == wxCONV_FAILED ) + return wxCONV_FAILED; + + outLen += numChars; + if ( dst ) + { + if ( outLen > dstLen ) + return wxCONV_FAILED; + + *dst++ = cc[0]; + if ( numChars == 2 ) + { + // second character of a surrogate + *dst++ = cc[1]; + } + } + } + + return outLen; +} + +size_t +wxMBConvUTF32straight::FromWChar(char *dst, size_t dstLen, + const wchar_t *src, size_t srcLen) const +{ + if ( srcLen == wxNO_LEN ) + srcLen = wxWcslen(src) + 1; + + if ( !dst ) + { + // optimization: return maximal space which could be needed for this + // string instead of the exact amount which could be less if there are + // any surrogates in the input + // + // we consider that surrogates are rare enough to make it worthwhile to + // avoid running the loop below at the cost of slightly extra memory + // consumption + return srcLen * BYTES_PER_CHAR; + } + + wxUint32 *outBuff = wx_reinterpret_cast(wxUint32 *, dst); + size_t outLen = 0; + for ( const wchar_t * const srcEnd = src + srcLen; src < srcEnd; ) + { + const wxUint32 ch = wxDecodeSurrogate(&src); + if ( !src ) + return wxCONV_FAILED; + + outLen += BYTES_PER_CHAR; + + if ( outLen > dstLen ) + return wxCONV_FAILED; + + *outBuff++ = ch; + } + + return outLen; +} + +// ---------------------------------------------------------------------------- +// endian-reversing conversions +// ---------------------------------------------------------------------------- + +size_t +wxMBConvUTF32swap::ToWChar(wchar_t *dst, size_t dstLen, + const char *src, size_t srcLen) const +{ + srcLen = GetLength(src, srcLen); + if ( srcLen == wxNO_LEN ) + return wxCONV_FAILED; + + const wxUint32 *inBuff = wx_reinterpret_cast(const wxUint32 *, src); + const size_t inLen = srcLen / BYTES_PER_CHAR; + size_t outLen = 0; + for ( size_t n = 0; n < inLen; n++, inBuff++ ) + { + wxUint16 cc[2]; + const size_t numChars = encode_utf16(wxUINT32_SWAP_ALWAYS(*inBuff), cc); + if ( numChars == wxCONV_FAILED ) + return wxCONV_FAILED; + + outLen += numChars; + if ( dst ) + { + if ( outLen > dstLen ) + return wxCONV_FAILED; + + *dst++ = cc[0]; + if ( numChars == 2 ) + { + // second character of a surrogate + *dst++ = cc[1]; + } + } + } + + return outLen; +} + +size_t +wxMBConvUTF32swap::FromWChar(char *dst, size_t dstLen, + const wchar_t *src, size_t srcLen) const +{ + if ( srcLen == wxNO_LEN ) + srcLen = wxWcslen(src) + 1; + + if ( !dst ) + { + // optimization: return maximal space which could be needed for this + // string instead of the exact amount which could be less if there are + // any surrogates in the input + // + // we consider that surrogates are rare enough to make it worthwhile to + // avoid running the loop below at the cost of slightly extra memory + // consumption + return srcLen*BYTES_PER_CHAR; + } + + wxUint32 *outBuff = wx_reinterpret_cast(wxUint32 *, dst); + size_t outLen = 0; + for ( const wchar_t * const srcEnd = src + srcLen; src < srcEnd; ) + { + const wxUint32 ch = wxDecodeSurrogate(&src); + if ( !src ) + return wxCONV_FAILED; + + outLen += BYTES_PER_CHAR; + + if ( outLen > dstLen ) + return wxCONV_FAILED; + + *outBuff++ = wxUINT32_SWAP_ALWAYS(ch); + } + + return outLen; +} + +#else // !WC_UTF16: wchar_t is UTF-32 + +// ---------------------------------------------------------------------------- +// conversions without endianness change +// ---------------------------------------------------------------------------- + +size_t +wxMBConvUTF32straight::ToWChar(wchar_t *dst, size_t dstLen, + const char *src, size_t srcLen) const +{ + // use memcpy() as it should be much faster than hand-written loop + srcLen = GetLength(src, srcLen); + if ( srcLen == wxNO_LEN ) + return wxCONV_FAILED; + + const size_t inLen = srcLen/BYTES_PER_CHAR; + if ( dst ) + { + if ( dstLen < inLen ) + return wxCONV_FAILED; + + memcpy(dst, src, srcLen); + } + + return inLen; +} + +size_t +wxMBConvUTF32straight::FromWChar(char *dst, size_t dstLen, + const wchar_t *src, size_t srcLen) const +{ + if ( srcLen == wxNO_LEN ) + srcLen = wxWcslen(src) + 1; + + srcLen *= BYTES_PER_CHAR; + + if ( dst ) + { + if ( dstLen < srcLen ) + return wxCONV_FAILED; + + memcpy(dst, src, srcLen); + } + + return srcLen; +} + +// ---------------------------------------------------------------------------- +// endian-reversing conversions +// ---------------------------------------------------------------------------- + +size_t +wxMBConvUTF32swap::ToWChar(wchar_t *dst, size_t dstLen, + const char *src, size_t srcLen) const +{ + srcLen = GetLength(src, srcLen); + if ( srcLen == wxNO_LEN ) + return wxCONV_FAILED; + + srcLen /= BYTES_PER_CHAR; + + if ( dst ) + { + if ( dstLen < srcLen ) + return wxCONV_FAILED; + + const wxUint32 *inBuff = wx_reinterpret_cast(const wxUint32 *, src); + for ( size_t n = 0; n < srcLen; n++, inBuff++ ) + { + *dst++ = wxUINT32_SWAP_ALWAYS(*inBuff); + } + } + + return srcLen; +} + +size_t +wxMBConvUTF32swap::FromWChar(char *dst, size_t dstLen, + const wchar_t *src, size_t srcLen) const +{ + if ( srcLen == wxNO_LEN ) + srcLen = wxWcslen(src) + 1; + + srcLen *= BYTES_PER_CHAR; + + if ( dst ) + { + if ( dstLen < srcLen ) + return wxCONV_FAILED; + + wxUint32 *outBuff = wx_reinterpret_cast(wxUint32 *, dst); + for ( size_t n = 0; n < srcLen; n += BYTES_PER_CHAR, src++ ) + { + *outBuff++ = wxUINT32_SWAP_ALWAYS(*src); + } + } + + return srcLen; +} + +#endif // WC_UTF16/!WC_UTF16 + + +// ============================================================================ +// The classes doing conversion using the iconv_xxx() functions +// ============================================================================ + +#ifdef HAVE_ICONV + +// VS: glibc 2.1.3 is broken in that iconv() conversion to/from UCS4 fails with +// E2BIG if output buffer is _exactly_ as big as needed. Such case is +// (unless there's yet another bug in glibc) the only case when iconv() +// returns with (size_t)-1 (which means error) and says there are 0 bytes +// left in the input buffer -- when _real_ error occurs, +// bytes-left-in-input buffer is non-zero. Hence, this alternative test for +// iconv() failure. +// [This bug does not appear in glibc 2.2.] +#if defined(__GLIBC__) && __GLIBC__ == 2 && __GLIBC_MINOR__ <= 1 +#define ICONV_FAILED(cres, bufLeft) ((cres == (size_t)-1) && \ + (errno != E2BIG || bufLeft != 0)) +#else +#define ICONV_FAILED(cres, bufLeft) (cres == (size_t)-1) +#endif + +#define ICONV_CHAR_CAST(x) ((ICONV_CONST char **)(x)) + +#define ICONV_T_INVALID ((iconv_t)-1) + +#if SIZEOF_WCHAR_T == 4 + #define WC_BSWAP wxUINT32_SWAP_ALWAYS + #define WC_ENC wxFONTENCODING_UTF32 +#elif SIZEOF_WCHAR_T == 2 + #define WC_BSWAP wxUINT16_SWAP_ALWAYS + #define WC_ENC wxFONTENCODING_UTF16 +#else // sizeof(wchar_t) != 2 nor 4 + // does this ever happen? + #error "Unknown sizeof(wchar_t): please report this to wx-dev@lists.wxwindows.org" +#endif + +// ---------------------------------------------------------------------------- +// wxMBConv_iconv: encapsulates an iconv character set +// ---------------------------------------------------------------------------- + +class wxMBConv_iconv : public wxMBConv +{ +public: + wxMBConv_iconv(const wxChar *name); + virtual ~wxMBConv_iconv(); + + virtual size_t MB2WC(wchar_t *buf, const char *psz, size_t n) const; + virtual size_t WC2MB(char *buf, const wchar_t *psz, size_t n) const; + + // classify this encoding as explained in wxMBConv::GetMBNulLen() comment + virtual size_t GetMBNulLen() const; + + virtual wxMBConv *Clone() const + { + wxMBConv_iconv *p = new wxMBConv_iconv(m_name); + p->m_minMBCharWidth = m_minMBCharWidth; + return p; + } + + bool IsOk() const + { return (m2w != ICONV_T_INVALID) && (w2m != ICONV_T_INVALID); } + +protected: + // the iconv handlers used to translate from multibyte + // to wide char and in the other direction + iconv_t m2w, + w2m; + +#if wxUSE_THREADS + // guards access to m2w and w2m objects + wxMutex m_iconvMutex; +#endif + +private: + // the name (for iconv_open()) of a wide char charset -- if none is + // available on this machine, it will remain NULL + static wxString ms_wcCharsetName; + + // true if the wide char encoding we use (i.e. ms_wcCharsetName) has + // different endian-ness than the native one + static bool ms_wcNeedsSwap; + + + // name of the encoding handled by this conversion + wxString m_name; + + // cached result of GetMBNulLen(); set to 0 meaning "unknown" + // initially + size_t m_minMBCharWidth; +}; + +// make the constructor available for unit testing +WXDLLIMPEXP_BASE wxMBConv* new_wxMBConv_iconv( const wxChar* name ) +{ + wxMBConv_iconv* result = new wxMBConv_iconv( name ); + if ( !result->IsOk() ) + { + delete result; + return 0; + } + + return result; +} + +wxString wxMBConv_iconv::ms_wcCharsetName; +bool wxMBConv_iconv::ms_wcNeedsSwap = false; + +wxMBConv_iconv::wxMBConv_iconv(const wxChar *name) + : m_name(name) +{ + m_minMBCharWidth = 0; + + // iconv operates with chars, not wxChars, but luckily it uses only ASCII + // names for the charsets + const wxCharBuffer cname(wxString(name).ToAscii()); + + // check for charset that represents wchar_t: + if ( ms_wcCharsetName.empty() ) + { + wxLogTrace(TRACE_STRCONV, _T("Looking for wide char codeset:")); + +#if wxUSE_FONTMAP + const wxChar **names = wxFontMapperBase::GetAllEncodingNames(WC_ENC); +#else // !wxUSE_FONTMAP + static const wxChar *names_static[] = + { +#if SIZEOF_WCHAR_T == 4 + _T("UCS-4"), +#elif SIZEOF_WCHAR_T = 2 + _T("UCS-2"), +#endif + NULL + }; + const wxChar **names = names_static; +#endif // wxUSE_FONTMAP/!wxUSE_FONTMAP + + for ( ; *names && ms_wcCharsetName.empty(); ++names ) + { + const wxString nameCS(*names); + + // first try charset with explicit bytesex info (e.g. "UCS-4LE"): + wxString nameXE(nameCS); + +#ifdef WORDS_BIGENDIAN + nameXE += _T("BE"); +#else // little endian + nameXE += _T("LE"); +#endif + + wxLogTrace(TRACE_STRCONV, _T(" trying charset \"%s\""), + nameXE.c_str()); + + m2w = iconv_open(nameXE.ToAscii(), cname); + if ( m2w == ICONV_T_INVALID ) + { + // try charset w/o bytesex info (e.g. "UCS4") + wxLogTrace(TRACE_STRCONV, _T(" trying charset \"%s\""), + nameCS.c_str()); + m2w = iconv_open(nameCS.ToAscii(), cname); + + // and check for bytesex ourselves: + if ( m2w != ICONV_T_INVALID ) + { + char buf[2], *bufPtr; + wchar_t wbuf[2], *wbufPtr; + size_t insz, outsz; + size_t res; + + buf[0] = 'A'; + buf[1] = 0; + wbuf[0] = 0; + insz = 2; + outsz = SIZEOF_WCHAR_T * 2; + wbufPtr = wbuf; + bufPtr = buf; + + res = iconv( + m2w, ICONV_CHAR_CAST(&bufPtr), &insz, + (char**)&wbufPtr, &outsz); + + if (ICONV_FAILED(res, insz)) + { + wxLogLastError(wxT("iconv")); + wxLogError(_("Conversion to charset '%s' doesn't work."), + nameCS.c_str()); + } + else // ok, can convert to this encoding, remember it + { + ms_wcCharsetName = nameCS; + ms_wcNeedsSwap = wbuf[0] != (wchar_t)buf[0]; + } + } + } + else // use charset not requiring byte swapping + { + ms_wcCharsetName = nameXE; + } + } + + wxLogTrace(TRACE_STRCONV, + wxT("iconv wchar_t charset is \"%s\"%s"), + ms_wcCharsetName.empty() ? _T("") + : ms_wcCharsetName.c_str(), + ms_wcNeedsSwap ? _T(" (needs swap)") + : _T("")); + } + else // we already have ms_wcCharsetName + { + m2w = iconv_open(ms_wcCharsetName.ToAscii(), cname); + } + + if ( ms_wcCharsetName.empty() ) + { + w2m = ICONV_T_INVALID; + } + else + { + w2m = iconv_open(cname, ms_wcCharsetName.ToAscii()); + if ( w2m == ICONV_T_INVALID ) + { + wxLogTrace(TRACE_STRCONV, + wxT("\"%s\" -> \"%s\" works but not the converse!?"), + ms_wcCharsetName.c_str(), cname.data()); + } + } +} + +wxMBConv_iconv::~wxMBConv_iconv() +{ + if ( m2w != ICONV_T_INVALID ) + iconv_close(m2w); + if ( w2m != ICONV_T_INVALID ) + iconv_close(w2m); +} + +size_t wxMBConv_iconv::MB2WC(wchar_t *buf, const char *psz, size_t n) const +{ + // find the string length: notice that must be done differently for + // NUL-terminated strings and UTF-16/32 which are terminated with 2/4 NULs + size_t inbuf; + const size_t nulLen = GetMBNulLen(); + switch ( nulLen ) + { + default: + return wxCONV_FAILED; + + case 1: + inbuf = strlen(psz); // arguably more optimized than our version + break; + + case 2: + case 4: + // for UTF-16/32 not only we need to have 2/4 consecutive NULs but + // they also have to start at character boundary and not span two + // adjacent characters + const char *p; + for ( p = psz; NotAllNULs(p, nulLen); p += nulLen ) + ; + inbuf = p - psz; + break; + } + +#if wxUSE_THREADS + // NB: iconv() is MT-safe, but each thread must use its own iconv_t handle. + // Unfortunately there are a couple of global wxCSConv objects such as + // wxConvLocal that are used all over wx code, so we have to make sure + // the handle is used by at most one thread at the time. Otherwise + // only a few wx classes would be safe to use from non-main threads + // as MB<->WC conversion would fail "randomly". + wxMutexLocker lock(wxConstCast(this, wxMBConv_iconv)->m_iconvMutex); +#endif // wxUSE_THREADS + + size_t outbuf = n * SIZEOF_WCHAR_T; + size_t res, cres; + // VS: Use these instead of psz, buf because iconv() modifies its arguments: + wchar_t *bufPtr = buf; + const char *pszPtr = psz; + + if (buf) + { + // have destination buffer, convert there + cres = iconv(m2w, + ICONV_CHAR_CAST(&pszPtr), &inbuf, + (char**)&bufPtr, &outbuf); + res = n - (outbuf / SIZEOF_WCHAR_T); + + if (ms_wcNeedsSwap) + { + // convert to native endianness + for ( unsigned i = 0; i < res; i++ ) + buf[n] = WC_BSWAP(buf[i]); + } + + // NUL-terminate the string if there is any space left + if (res < n) + buf[res] = 0; + } + else + { + // no destination buffer... convert using temp buffer + // to calculate destination buffer requirement + wchar_t tbuf[8]; + res = 0; + + do + { + bufPtr = tbuf; + outbuf = 8 * SIZEOF_WCHAR_T; + + cres = iconv(m2w, + ICONV_CHAR_CAST(&pszPtr), &inbuf, + (char**)&bufPtr, &outbuf ); + + res += 8 - (outbuf / SIZEOF_WCHAR_T); + } + while ((cres == (size_t)-1) && (errno == E2BIG)); + } + + if (ICONV_FAILED(cres, inbuf)) + { + //VS: it is ok if iconv fails, hence trace only + wxLogTrace(TRACE_STRCONV, wxT("iconv failed: %s"), wxSysErrorMsg(wxSysErrorCode())); + return wxCONV_FAILED; + } + + return res; +} + +size_t wxMBConv_iconv::WC2MB(char *buf, const wchar_t *psz, size_t n) const +{ +#if wxUSE_THREADS + // NB: explained in MB2WC + wxMutexLocker lock(wxConstCast(this, wxMBConv_iconv)->m_iconvMutex); +#endif + + size_t inlen = wxWcslen(psz); + size_t inbuf = inlen * SIZEOF_WCHAR_T; + size_t outbuf = n; + size_t res, cres; + + wchar_t *tmpbuf = 0; + + if (ms_wcNeedsSwap) + { + // need to copy to temp buffer to switch endianness + // (doing WC_BSWAP twice on the original buffer won't help, as it + // could be in read-only memory, or be accessed in some other thread) + tmpbuf = (wchar_t *)malloc(inbuf + SIZEOF_WCHAR_T); + for ( size_t i = 0; i < inlen; i++ ) + tmpbuf[n] = WC_BSWAP(psz[i]); + + tmpbuf[inlen] = L'\0'; + psz = tmpbuf; + } + + if (buf) + { + // have destination buffer, convert there + cres = iconv( w2m, ICONV_CHAR_CAST(&psz), &inbuf, &buf, &outbuf ); + + res = n - outbuf; + + // NB: iconv was given only wcslen(psz) characters on input, and so + // it couldn't convert the trailing zero. Let's do it ourselves + // if there's some room left for it in the output buffer. + if (res < n) + buf[0] = 0; + } + else + { + // no destination buffer: convert using temp buffer + // to calculate destination buffer requirement + char tbuf[16]; + res = 0; + do + { + buf = tbuf; + outbuf = 16; + + cres = iconv( w2m, ICONV_CHAR_CAST(&psz), &inbuf, &buf, &outbuf ); + + res += 16 - outbuf; + } + while ((cres == (size_t)-1) && (errno == E2BIG)); + } + + if (ms_wcNeedsSwap) + { + free(tmpbuf); + } + + if (ICONV_FAILED(cres, inbuf)) + { + wxLogTrace(TRACE_STRCONV, wxT("iconv failed: %s"), wxSysErrorMsg(wxSysErrorCode())); + return wxCONV_FAILED; + } + + return res; +} + +size_t wxMBConv_iconv::GetMBNulLen() const +{ + if ( m_minMBCharWidth == 0 ) + { + wxMBConv_iconv * const self = wxConstCast(this, wxMBConv_iconv); + +#if wxUSE_THREADS + // NB: explained in MB2WC + wxMutexLocker lock(self->m_iconvMutex); +#endif + + wchar_t *wnul = L""; + char buf[8]; // should be enough for NUL in any encoding + size_t inLen = sizeof(wchar_t), + outLen = WXSIZEOF(buf); + char *inBuff = (char *)wnul; + char *outBuff = buf; + if ( iconv(w2m, ICONV_CHAR_CAST(&inBuff), &inLen, &outBuff, &outLen) == (size_t)-1 ) + { + self->m_minMBCharWidth = (size_t)-1; + } + else // ok + { + self->m_minMBCharWidth = outBuff - buf; + } + } + + return m_minMBCharWidth; +} + +#endif // HAVE_ICONV + + +// ============================================================================ +// Win32 conversion classes +// ============================================================================ + +#ifdef wxHAVE_WIN32_MB2WC + +// from utils.cpp +#if wxUSE_FONTMAP +extern WXDLLIMPEXP_BASE long wxCharsetToCodepage(const wxChar *charset); +extern WXDLLIMPEXP_BASE long wxEncodingToCodepage(wxFontEncoding encoding); +#endif + +class wxMBConv_win32 : public wxMBConv +{ +public: + wxMBConv_win32() + { + m_CodePage = CP_ACP; + m_minMBCharWidth = 0; + } + + wxMBConv_win32(const wxMBConv_win32& conv) + : wxMBConv() + { + m_CodePage = conv.m_CodePage; + m_minMBCharWidth = conv.m_minMBCharWidth; + } + +#if wxUSE_FONTMAP + wxMBConv_win32(const wxChar* name) + { + m_CodePage = wxCharsetToCodepage(name); + m_minMBCharWidth = 0; + } + + wxMBConv_win32(wxFontEncoding encoding) + { + m_CodePage = wxEncodingToCodepage(encoding); + m_minMBCharWidth = 0; + } +#endif // wxUSE_FONTMAP + + virtual size_t MB2WC(wchar_t *buf, const char *psz, size_t n) const + { + // note that we have to use MB_ERR_INVALID_CHARS flag as it without it + // the behaviour is not compatible with the Unix version (using iconv) + // and break the library itself, e.g. wxTextInputStream::NextChar() + // wouldn't work if reading an incomplete MB char didn't result in an + // error + // + // Moreover, MB_ERR_INVALID_CHARS is only supported on Win 2K SP4 or + // Win XP or newer and it is not supported for UTF-[78] so we always + // use our own conversions in this case. See + // http://blogs.msdn.com/michkap/archive/2005/04/19/409566.aspx + // http://msdn.microsoft.com/library/en-us/intl/unicode_17si.asp + if ( m_CodePage == CP_UTF8 ) + { + return wxConvUTF8.MB2WC(buf, psz, n); + } + + if ( m_CodePage == CP_UTF7 ) + { + return wxConvUTF7.MB2WC(buf, psz, n); + } + + int flags = 0; + if ( (m_CodePage < 50000 && m_CodePage != CP_SYMBOL) && + IsAtLeastWin2kSP4() ) + { + flags = MB_ERR_INVALID_CHARS; + } + + const size_t len = ::MultiByteToWideChar + ( + m_CodePage, // code page + flags, // flags: fall on error + psz, // input string + -1, // its length (NUL-terminated) + buf, // output string + buf ? n : 0 // size of output buffer + ); + if ( !len ) + { + // function totally failed + return wxCONV_FAILED; + } + + // if we were really converting and didn't use MB_ERR_INVALID_CHARS, + // check if we succeeded, by doing a double trip: + if ( !flags && buf ) + { + const size_t mbLen = strlen(psz); + wxCharBuffer mbBuf(mbLen); + if ( ::WideCharToMultiByte + ( + m_CodePage, + 0, + buf, + -1, + mbBuf.data(), + mbLen + 1, // size in bytes, not length + NULL, + NULL + ) == 0 || + strcmp(mbBuf, psz) != 0 ) + { + // we didn't obtain the same thing we started from, hence + // the conversion was lossy and we consider that it failed + return wxCONV_FAILED; + } + } + + // note that it returns count of written chars for buf != NULL and size + // of the needed buffer for buf == NULL so in either case the length of + // the string (which never includes the terminating NUL) is one less + return len - 1; + } + + virtual size_t WC2MB(char *buf, const wchar_t *pwz, size_t n) const + { + /* + we have a problem here: by default, WideCharToMultiByte() may + replace characters unrepresentable in the target code page with bad + quality approximations such as turning "1/2" symbol (U+00BD) into + "1" for the code pages which don't have it and we, obviously, want + to avoid this at any price + + the trouble is that this function does it _silently_, i.e. it won't + even tell us whether it did or not... Win98/2000 and higher provide + WC_NO_BEST_FIT_CHARS but it doesn't work for the older systems and + we have to resort to a round trip, i.e. check that converting back + results in the same string -- this is, of course, expensive but + otherwise we simply can't be sure to not garble the data. + */ + + // determine if we can rely on WC_NO_BEST_FIT_CHARS: according to MSDN + // it doesn't work with CJK encodings (which we test for rather roughly + // here...) nor with UTF-7/8 nor, of course, with Windows versions not + // supporting it + BOOL usedDef wxDUMMY_INITIALIZE(false); + BOOL *pUsedDef; + int flags; + if ( CanUseNoBestFit() && m_CodePage < 50000 ) + { + // it's our lucky day + flags = WC_NO_BEST_FIT_CHARS; + pUsedDef = &usedDef; + } + else // old system or unsupported encoding + { + flags = 0; + pUsedDef = NULL; + } + + const size_t len = ::WideCharToMultiByte + ( + m_CodePage, // code page + flags, // either none or no best fit + pwz, // input string + -1, // it is (wide) NUL-terminated + buf, // output buffer + buf ? n : 0, // and its size + NULL, // default "replacement" char + pUsedDef // [out] was it used? + ); + + if ( !len ) + { + // function totally failed + return wxCONV_FAILED; + } + + // if we were really converting, check if we succeeded + if ( buf ) + { + if ( flags ) + { + // check if the conversion failed, i.e. if any replacements + // were done + if ( usedDef ) + return wxCONV_FAILED; + } + else // we must resort to double tripping... + { + wxWCharBuffer wcBuf(n); + if ( MB2WC(wcBuf.data(), buf, n) == wxCONV_FAILED || + wcscmp(wcBuf, pwz) != 0 ) + { + // we didn't obtain the same thing we started from, hence + // the conversion was lossy and we consider that it failed + return wxCONV_FAILED; + } + } + } + + // see the comment above for the reason of "len - 1" + return len - 1; + } + + virtual size_t GetMBNulLen() const + { + if ( m_minMBCharWidth == 0 ) + { + int len = ::WideCharToMultiByte + ( + m_CodePage, // code page + 0, // no flags + L"", // input string + 1, // translate just the NUL + NULL, // output buffer + 0, // and its size + NULL, // no replacement char + NULL // [out] don't care if it was used + ); + + wxMBConv_win32 * const self = wxConstCast(this, wxMBConv_win32); + switch ( len ) + { + default: + wxLogDebug(_T("Unexpected NUL length %d"), len); + self->m_minMBCharWidth = (size_t)-1; + break; + + case 0: + self->m_minMBCharWidth = (size_t)-1; + break; + + case 1: + case 2: + case 4: + self->m_minMBCharWidth = len; + break; + } + } + + return m_minMBCharWidth; + } + + virtual wxMBConv *Clone() const { return new wxMBConv_win32(*this); } + + bool IsOk() const { return m_CodePage != -1; } + +private: + static bool CanUseNoBestFit() + { + static int s_isWin98Or2k = -1; + + if ( s_isWin98Or2k == -1 ) + { + int verMaj, verMin; + switch ( wxGetOsVersion(&verMaj, &verMin) ) + { + case wxOS_WINDOWS_9X: + s_isWin98Or2k = verMaj >= 4 && verMin >= 10; + break; + + case wxOS_WINDOWS_NT: + s_isWin98Or2k = verMaj >= 5; + break; + + default: + // unknown: be conservative by default + s_isWin98Or2k = 0; + break; + } + + wxASSERT_MSG( s_isWin98Or2k != -1, _T("should be set above") ); + } + + return s_isWin98Or2k == 1; + } + + static bool IsAtLeastWin2kSP4() + { +#ifdef __WXWINCE__ + return false; +#else + static int s_isAtLeastWin2kSP4 = -1; + + if ( s_isAtLeastWin2kSP4 == -1 ) + { + OSVERSIONINFOEX ver; + + memset(&ver, 0, sizeof(ver)); + ver.dwOSVersionInfoSize = sizeof(ver); + GetVersionEx((OSVERSIONINFO*)&ver); + + s_isAtLeastWin2kSP4 = + ((ver.dwMajorVersion > 5) || // Vista+ + (ver.dwMajorVersion == 5 && ver.dwMinorVersion > 0) || // XP/2003 + (ver.dwMajorVersion == 5 && ver.dwMinorVersion == 0 && + ver.wServicePackMajor >= 4)) // 2000 SP4+ + ? 1 : 0; + } + + return s_isAtLeastWin2kSP4 == 1; +#endif + } + + + // the code page we're working with + long m_CodePage; + + // cached result of GetMBNulLen(), set to 0 initially meaning + // "unknown" + size_t m_minMBCharWidth; +}; + +#endif // wxHAVE_WIN32_MB2WC + +// ============================================================================ +// Cocoa conversion classes +// ============================================================================ + +#if defined(__WXCOCOA__) + +// RN: There is no UTF-32 support in either Core Foundation or Cocoa. +// Strangely enough, internally Core Foundation uses +// UTF-32 internally quite a bit - its just not public (yet). + +#include +#include + +CFStringEncoding wxCFStringEncFromFontEnc(wxFontEncoding encoding) +{ + CFStringEncoding enc = kCFStringEncodingInvalidId ; + + switch (encoding) + { + case wxFONTENCODING_DEFAULT : + enc = CFStringGetSystemEncoding(); + break ; + + case wxFONTENCODING_ISO8859_1 : + enc = kCFStringEncodingISOLatin1 ; + break ; + case wxFONTENCODING_ISO8859_2 : + enc = kCFStringEncodingISOLatin2; + break ; + case wxFONTENCODING_ISO8859_3 : + enc = kCFStringEncodingISOLatin3 ; + break ; + case wxFONTENCODING_ISO8859_4 : + enc = kCFStringEncodingISOLatin4; + break ; + case wxFONTENCODING_ISO8859_5 : + enc = kCFStringEncodingISOLatinCyrillic; + break ; + case wxFONTENCODING_ISO8859_6 : + enc = kCFStringEncodingISOLatinArabic; + break ; + case wxFONTENCODING_ISO8859_7 : + enc = kCFStringEncodingISOLatinGreek; + break ; + case wxFONTENCODING_ISO8859_8 : + enc = kCFStringEncodingISOLatinHebrew; + break ; + case wxFONTENCODING_ISO8859_9 : + enc = kCFStringEncodingISOLatin5; + break ; + case wxFONTENCODING_ISO8859_10 : + enc = kCFStringEncodingISOLatin6; + break ; + case wxFONTENCODING_ISO8859_11 : + enc = kCFStringEncodingISOLatinThai; + break ; + case wxFONTENCODING_ISO8859_13 : + enc = kCFStringEncodingISOLatin7; + break ; + case wxFONTENCODING_ISO8859_14 : + enc = kCFStringEncodingISOLatin8; + break ; + case wxFONTENCODING_ISO8859_15 : + enc = kCFStringEncodingISOLatin9; + break ; + + case wxFONTENCODING_KOI8 : + enc = kCFStringEncodingKOI8_R; + break ; + case wxFONTENCODING_ALTERNATIVE : // MS-DOS CP866 + enc = kCFStringEncodingDOSRussian; + break ; + +// case wxFONTENCODING_BULGARIAN : +// enc = ; +// break ; + + case wxFONTENCODING_CP437 : + enc = kCFStringEncodingDOSLatinUS ; + break ; + case wxFONTENCODING_CP850 : + enc = kCFStringEncodingDOSLatin1; + break ; + case wxFONTENCODING_CP852 : + enc = kCFStringEncodingDOSLatin2; + break ; + case wxFONTENCODING_CP855 : + enc = kCFStringEncodingDOSCyrillic; + break ; + case wxFONTENCODING_CP866 : + enc = kCFStringEncodingDOSRussian ; + break ; + case wxFONTENCODING_CP874 : + enc = kCFStringEncodingDOSThai; + break ; + case wxFONTENCODING_CP932 : + enc = kCFStringEncodingDOSJapanese; + break ; + case wxFONTENCODING_CP936 : + enc = kCFStringEncodingDOSChineseSimplif ; + break ; + case wxFONTENCODING_CP949 : + enc = kCFStringEncodingDOSKorean; + break ; + case wxFONTENCODING_CP950 : + enc = kCFStringEncodingDOSChineseTrad; + break ; + case wxFONTENCODING_CP1250 : + enc = kCFStringEncodingWindowsLatin2; + break ; + case wxFONTENCODING_CP1251 : + enc = kCFStringEncodingWindowsCyrillic ; + break ; + case wxFONTENCODING_CP1252 : + enc = kCFStringEncodingWindowsLatin1 ; + break ; + case wxFONTENCODING_CP1253 : + enc = kCFStringEncodingWindowsGreek; + break ; + case wxFONTENCODING_CP1254 : + enc = kCFStringEncodingWindowsLatin5; + break ; + case wxFONTENCODING_CP1255 : + enc = kCFStringEncodingWindowsHebrew ; + break ; + case wxFONTENCODING_CP1256 : + enc = kCFStringEncodingWindowsArabic ; + break ; + case wxFONTENCODING_CP1257 : + enc = kCFStringEncodingWindowsBalticRim; + break ; +// This only really encodes to UTF7 (if that) evidently +// case wxFONTENCODING_UTF7 : +// enc = kCFStringEncodingNonLossyASCII ; +// break ; + case wxFONTENCODING_UTF8 : + enc = kCFStringEncodingUTF8 ; + break ; + case wxFONTENCODING_EUC_JP : + enc = kCFStringEncodingEUC_JP; + break ; + case wxFONTENCODING_UTF16 : + enc = kCFStringEncodingUnicode ; + break ; + case wxFONTENCODING_MACROMAN : + enc = kCFStringEncodingMacRoman ; + break ; + case wxFONTENCODING_MACJAPANESE : + enc = kCFStringEncodingMacJapanese ; + break ; + case wxFONTENCODING_MACCHINESETRAD : + enc = kCFStringEncodingMacChineseTrad ; + break ; + case wxFONTENCODING_MACKOREAN : + enc = kCFStringEncodingMacKorean ; + break ; + case wxFONTENCODING_MACARABIC : + enc = kCFStringEncodingMacArabic ; + break ; + case wxFONTENCODING_MACHEBREW : + enc = kCFStringEncodingMacHebrew ; + break ; + case wxFONTENCODING_MACGREEK : + enc = kCFStringEncodingMacGreek ; + break ; + case wxFONTENCODING_MACCYRILLIC : + enc = kCFStringEncodingMacCyrillic ; + break ; + case wxFONTENCODING_MACDEVANAGARI : + enc = kCFStringEncodingMacDevanagari ; + break ; + case wxFONTENCODING_MACGURMUKHI : + enc = kCFStringEncodingMacGurmukhi ; + break ; + case wxFONTENCODING_MACGUJARATI : + enc = kCFStringEncodingMacGujarati ; + break ; + case wxFONTENCODING_MACORIYA : + enc = kCFStringEncodingMacOriya ; + break ; + case wxFONTENCODING_MACBENGALI : + enc = kCFStringEncodingMacBengali ; + break ; + case wxFONTENCODING_MACTAMIL : + enc = kCFStringEncodingMacTamil ; + break ; + case wxFONTENCODING_MACTELUGU : + enc = kCFStringEncodingMacTelugu ; + break ; + case wxFONTENCODING_MACKANNADA : + enc = kCFStringEncodingMacKannada ; + break ; + case wxFONTENCODING_MACMALAJALAM : + enc = kCFStringEncodingMacMalayalam ; + break ; + case wxFONTENCODING_MACSINHALESE : + enc = kCFStringEncodingMacSinhalese ; + break ; + case wxFONTENCODING_MACBURMESE : + enc = kCFStringEncodingMacBurmese ; + break ; + case wxFONTENCODING_MACKHMER : + enc = kCFStringEncodingMacKhmer ; + break ; + case wxFONTENCODING_MACTHAI : + enc = kCFStringEncodingMacThai ; + break ; + case wxFONTENCODING_MACLAOTIAN : + enc = kCFStringEncodingMacLaotian ; + break ; + case wxFONTENCODING_MACGEORGIAN : + enc = kCFStringEncodingMacGeorgian ; + break ; + case wxFONTENCODING_MACARMENIAN : + enc = kCFStringEncodingMacArmenian ; + break ; + case wxFONTENCODING_MACCHINESESIMP : + enc = kCFStringEncodingMacChineseSimp ; + break ; + case wxFONTENCODING_MACTIBETAN : + enc = kCFStringEncodingMacTibetan ; + break ; + case wxFONTENCODING_MACMONGOLIAN : + enc = kCFStringEncodingMacMongolian ; + break ; + case wxFONTENCODING_MACETHIOPIC : + enc = kCFStringEncodingMacEthiopic ; + break ; + case wxFONTENCODING_MACCENTRALEUR : + enc = kCFStringEncodingMacCentralEurRoman ; + break ; + case wxFONTENCODING_MACVIATNAMESE : + enc = kCFStringEncodingMacVietnamese ; + break ; + case wxFONTENCODING_MACARABICEXT : + enc = kCFStringEncodingMacExtArabic ; + break ; + case wxFONTENCODING_MACSYMBOL : + enc = kCFStringEncodingMacSymbol ; + break ; + case wxFONTENCODING_MACDINGBATS : + enc = kCFStringEncodingMacDingbats ; + break ; + case wxFONTENCODING_MACTURKISH : + enc = kCFStringEncodingMacTurkish ; + break ; + case wxFONTENCODING_MACCROATIAN : + enc = kCFStringEncodingMacCroatian ; + break ; + case wxFONTENCODING_MACICELANDIC : + enc = kCFStringEncodingMacIcelandic ; + break ; + case wxFONTENCODING_MACROMANIAN : + enc = kCFStringEncodingMacRomanian ; + break ; + case wxFONTENCODING_MACCELTIC : + enc = kCFStringEncodingMacCeltic ; + break ; + case wxFONTENCODING_MACGAELIC : + enc = kCFStringEncodingMacGaelic ; + break ; +// case wxFONTENCODING_MACKEYBOARD : +// enc = kCFStringEncodingMacKeyboardGlyphs ; +// break ; + + default : + // because gcc is picky + break ; + } + + return enc ; +} + +class wxMBConv_cocoa : public wxMBConv +{ +public: + wxMBConv_cocoa() + { + Init(CFStringGetSystemEncoding()) ; + } + + wxMBConv_cocoa(const wxMBConv_cocoa& conv) + { + m_encoding = conv.m_encoding; + } + +#if wxUSE_FONTMAP + wxMBConv_cocoa(const wxChar* name) + { + Init( wxCFStringEncFromFontEnc(wxFontMapperBase::Get()->CharsetToEncoding(name, false) ) ) ; + } +#endif + + wxMBConv_cocoa(wxFontEncoding encoding) + { + Init( wxCFStringEncFromFontEnc(encoding) ); + } + + virtual ~wxMBConv_cocoa() + { + } + + void Init( CFStringEncoding encoding) + { + m_encoding = encoding ; + } + + size_t MB2WC(wchar_t * szOut, const char * szUnConv, size_t nOutSize) const + { + wxASSERT(szUnConv); + + CFStringRef theString = CFStringCreateWithBytes ( + NULL, //the allocator + (const UInt8*)szUnConv, + strlen(szUnConv), + m_encoding, + false //no BOM/external representation + ); + + wxASSERT(theString); + + size_t nOutLength = CFStringGetLength(theString); + + if (szOut == NULL) + { + CFRelease(theString); + return nOutLength; + } + + CFRange theRange = { 0, nOutSize }; + +#if SIZEOF_WCHAR_T == 4 + UniChar* szUniCharBuffer = new UniChar[nOutSize]; +#endif + + CFStringGetCharacters(theString, theRange, szUniCharBuffer); + + CFRelease(theString); + + szUniCharBuffer[nOutLength] = '\0'; + +#if SIZEOF_WCHAR_T == 4 + wxMBConvUTF16 converter; + converter.MB2WC( szOut, (const char*)szUniCharBuffer, nOutSize ); + delete [] szUniCharBuffer; +#endif + + return nOutLength; + } + + size_t WC2MB(char *szOut, const wchar_t *szUnConv, size_t nOutSize) const + { + wxASSERT(szUnConv); + + size_t nRealOutSize; + size_t nBufSize = wxWcslen(szUnConv); + UniChar* szUniBuffer = (UniChar*) szUnConv; + +#if SIZEOF_WCHAR_T == 4 + wxMBConvUTF16 converter ; + nBufSize = converter.WC2MB( NULL, szUnConv, 0 ); + szUniBuffer = new UniChar[ (nBufSize / sizeof(UniChar)) + 1]; + converter.WC2MB( (char*) szUniBuffer, szUnConv, nBufSize + sizeof(UniChar)); + nBufSize /= sizeof(UniChar); +#endif + + CFStringRef theString = CFStringCreateWithCharactersNoCopy( + NULL, //allocator + szUniBuffer, + nBufSize, + kCFAllocatorNull //deallocator - we want to deallocate it ourselves + ); + + wxASSERT(theString); + + //Note that CER puts a BOM when converting to unicode + //so we check and use getchars instead in that case + if (m_encoding == kCFStringEncodingUnicode) + { + if (szOut != NULL) + CFStringGetCharacters(theString, CFRangeMake(0, nOutSize - 1), (UniChar*) szOut); + + nRealOutSize = CFStringGetLength(theString) + 1; + } + else + { + CFStringGetBytes( + theString, + CFRangeMake(0, CFStringGetLength(theString)), + m_encoding, + 0, //what to put in characters that can't be converted - + //0 tells CFString to return NULL if it meets such a character + false, //not an external representation + (UInt8*) szOut, + nOutSize, + (CFIndex*) &nRealOutSize + ); + } + + CFRelease(theString); + +#if SIZEOF_WCHAR_T == 4 + delete[] szUniBuffer; +#endif + + return nRealOutSize - 1; + } + + virtual wxMBConv *Clone() const { return new wxMBConv_cocoa(*this); } + + bool IsOk() const + { + return m_encoding != kCFStringEncodingInvalidId && + CFStringIsEncodingAvailable(m_encoding); + } + +private: + CFStringEncoding m_encoding ; +}; + +#endif // defined(__WXCOCOA__) + +// ============================================================================ +// Mac conversion classes +// ============================================================================ + +#if defined(__WXMAC__) && defined(TARGET_CARBON) + +class wxMBConv_mac : public wxMBConv +{ +public: + wxMBConv_mac() + { + Init(CFStringGetSystemEncoding()) ; + } + + wxMBConv_mac(const wxMBConv_mac& conv) + { + Init(conv.m_char_encoding); + } + +#if wxUSE_FONTMAP + wxMBConv_mac(const wxChar* name) + { + Init( wxMacGetSystemEncFromFontEnc( wxFontMapperBase::Get()->CharsetToEncoding(name, false) ) ); + } +#endif + + wxMBConv_mac(wxFontEncoding encoding) + { + Init( wxMacGetSystemEncFromFontEnc(encoding) ); + } + + virtual ~wxMBConv_mac() + { + OSStatus status = noErr ; + if (m_MB2WC_converter) + status = TECDisposeConverter(m_MB2WC_converter); + if (m_WC2MB_converter) + status = TECDisposeConverter(m_WC2MB_converter); + } + + void Init( TextEncodingBase encoding,TextEncodingVariant encodingVariant = kTextEncodingDefaultVariant , + TextEncodingFormat encodingFormat = kTextEncodingDefaultFormat) + { + m_MB2WC_converter = NULL ; + m_WC2MB_converter = NULL ; + m_char_encoding = CreateTextEncoding(encoding, encodingVariant, encodingFormat) ; + m_unicode_encoding = CreateTextEncoding(kTextEncodingUnicodeDefault, 0, kUnicode16BitFormat) ; + } + + virtual void CreateIfNeeded() const + { + if ( m_MB2WC_converter == NULL && m_WC2MB_converter == NULL ) + { + OSStatus status = noErr ; + status = TECCreateConverter(&m_MB2WC_converter, + m_char_encoding, + m_unicode_encoding); + wxASSERT_MSG( status == noErr , _("Unable to create TextEncodingConverter")) ; + status = TECCreateConverter(&m_WC2MB_converter, + m_unicode_encoding, + m_char_encoding); + wxASSERT_MSG( status == noErr , _("Unable to create TextEncodingConverter")) ; + } + } + + size_t MB2WC(wchar_t *buf, const char *psz, size_t n) const + { + CreateIfNeeded() ; + OSStatus status = noErr ; + ByteCount byteOutLen ; + ByteCount byteInLen = strlen(psz) + 1; + wchar_t *tbuf = NULL ; + UniChar* ubuf = NULL ; + size_t res = 0 ; + + if (buf == NULL) + { + // Apple specs say at least 32 + n = wxMax( 32, byteInLen ) ; + tbuf = (wchar_t*) malloc( n * SIZEOF_WCHAR_T ) ; + } + + ByteCount byteBufferLen = n * sizeof( UniChar ) ; + +#if SIZEOF_WCHAR_T == 4 + ubuf = (UniChar*) malloc( byteBufferLen + 2 ) ; +#else + ubuf = (UniChar*) (buf ? buf : tbuf) ; +#endif + + status = TECConvertText( + m_MB2WC_converter, (ConstTextPtr) psz, byteInLen, &byteInLen, + (TextPtr) ubuf, byteBufferLen, &byteOutLen); + +#if SIZEOF_WCHAR_T == 4 + // we have to terminate here, because n might be larger for the trailing zero, and if UniChar + // is not properly terminated we get random characters at the end + ubuf[byteOutLen / sizeof( UniChar ) ] = 0 ; + wxMBConvUTF16 converter ; + res = converter.MB2WC( (buf ? buf : tbuf), (const char*)ubuf, n ) ; + free( ubuf ) ; +#else + res = byteOutLen / sizeof( UniChar ) ; +#endif + + if ( buf == NULL ) + free(tbuf) ; + + if ( buf && res < n) + buf[res] = 0; + + return res ; + } + + size_t WC2MB(char *buf, const wchar_t *psz, size_t n) const + { + CreateIfNeeded() ; + OSStatus status = noErr ; + ByteCount byteOutLen ; + ByteCount byteInLen = wxWcslen(psz) * SIZEOF_WCHAR_T ; + + char *tbuf = NULL ; + + if (buf == NULL) + { + // Apple specs say at least 32 + n = wxMax( 32, ((byteInLen / SIZEOF_WCHAR_T) * 8) + SIZEOF_WCHAR_T ); + tbuf = (char*) malloc( n ) ; + } + + ByteCount byteBufferLen = n ; + UniChar* ubuf = NULL ; + +#if SIZEOF_WCHAR_T == 4 + wxMBConvUTF16 converter ; + size_t unicharlen = converter.WC2MB( NULL, psz, 0 ) ; + byteInLen = unicharlen ; + ubuf = (UniChar*) malloc( byteInLen + 2 ) ; + converter.WC2MB( (char*) ubuf, psz, unicharlen + 2 ) ; +#else + ubuf = (UniChar*) psz ; +#endif + + status = TECConvertText( + m_WC2MB_converter, (ConstTextPtr) ubuf, byteInLen, &byteInLen, + (TextPtr) (buf ? buf : tbuf), byteBufferLen, &byteOutLen); + +#if SIZEOF_WCHAR_T == 4 + free( ubuf ) ; +#endif + + if ( buf == NULL ) + free(tbuf) ; + + size_t res = byteOutLen ; + if ( buf && res < n) + { + buf[res] = 0; + + //we need to double-trip to verify it didn't insert any ? in place + //of bogus characters + wxWCharBuffer wcBuf(n); + size_t pszlen = wxWcslen(psz); + if ( MB2WC(wcBuf.data(), buf, n) == wxCONV_FAILED || + wxWcslen(wcBuf) != pszlen || + memcmp(wcBuf, psz, pszlen * sizeof(wchar_t)) != 0 ) + { + // we didn't obtain the same thing we started from, hence + // the conversion was lossy and we consider that it failed + return wxCONV_FAILED; + } + } + + return res ; + } + + virtual wxMBConv *Clone() const { return new wxMBConv_mac(*this); } + + bool IsOk() const + { + CreateIfNeeded() ; + return m_MB2WC_converter != NULL && m_WC2MB_converter != NULL; + } + +protected : + mutable TECObjectRef m_MB2WC_converter; + mutable TECObjectRef m_WC2MB_converter; + + TextEncodingBase m_char_encoding; + TextEncodingBase m_unicode_encoding; +}; + +// MB is decomposed (D) normalized UTF8 + +class wxMBConv_macUTF8D : public wxMBConv_mac +{ +public : + wxMBConv_macUTF8D() + { + Init( kTextEncodingUnicodeDefault , kUnicodeNoSubset , kUnicodeUTF8Format ) ; + m_uni = NULL; + m_uniBack = NULL ; + } + + virtual ~wxMBConv_macUTF8D() + { + if (m_uni!=NULL) + DisposeUnicodeToTextInfo(&m_uni); + if (m_uniBack!=NULL) + DisposeUnicodeToTextInfo(&m_uniBack); + } + + size_t WC2MB(char *buf, const wchar_t *psz, size_t n) const + { + CreateIfNeeded() ; + OSStatus status = noErr ; + ByteCount byteOutLen ; + ByteCount byteInLen = wxWcslen(psz) * SIZEOF_WCHAR_T ; + + char *tbuf = NULL ; + + if (buf == NULL) + { + // Apple specs say at least 32 + n = wxMax( 32, ((byteInLen / SIZEOF_WCHAR_T) * 8) + SIZEOF_WCHAR_T ); + tbuf = (char*) malloc( n ) ; + } + + ByteCount byteBufferLen = n ; + UniChar* ubuf = NULL ; + +#if SIZEOF_WCHAR_T == 4 + wxMBConvUTF16 converter ; + size_t unicharlen = converter.WC2MB( NULL, psz, 0 ) ; + byteInLen = unicharlen ; + ubuf = (UniChar*) malloc( byteInLen + 2 ) ; + converter.WC2MB( (char*) ubuf, psz, unicharlen + 2 ) ; +#else + ubuf = (UniChar*) psz ; +#endif + + // ubuf is a non-decomposed UniChar buffer + + ByteCount dcubuflen = byteInLen * 2 + 2 ; + ByteCount dcubufread , dcubufwritten ; + UniChar *dcubuf = (UniChar*) malloc( dcubuflen ) ; + + ConvertFromUnicodeToText( m_uni , byteInLen , ubuf , + kUnicodeDefaultDirectionMask, 0, NULL, NULL, NULL, dcubuflen , &dcubufread , &dcubufwritten , dcubuf ) ; + + // we now convert that decomposed buffer into UTF8 + + status = TECConvertText( + m_WC2MB_converter, (ConstTextPtr) dcubuf, dcubufwritten, &dcubufread, + (TextPtr) (buf ? buf : tbuf), byteBufferLen, &byteOutLen); + + free( dcubuf ); + +#if SIZEOF_WCHAR_T == 4 + free( ubuf ) ; +#endif + + if ( buf == NULL ) + free(tbuf) ; + + size_t res = byteOutLen ; + if ( buf && res < n) + { + buf[res] = 0; + // don't test for round-trip fidelity yet, we cannot guarantee it yet + } + + return res ; + } + + size_t MB2WC(wchar_t *buf, const char *psz, size_t n) const + { + CreateIfNeeded() ; + OSStatus status = noErr ; + ByteCount byteOutLen ; + ByteCount byteInLen = strlen(psz) + 1; + wchar_t *tbuf = NULL ; + UniChar* ubuf = NULL ; + size_t res = 0 ; + + if (buf == NULL) + { + // Apple specs say at least 32 + n = wxMax( 32, byteInLen ) ; + tbuf = (wchar_t*) malloc( n * SIZEOF_WCHAR_T ) ; + } + + ByteCount byteBufferLen = n * sizeof( UniChar ) ; + +#if SIZEOF_WCHAR_T == 4 + ubuf = (UniChar*) malloc( byteBufferLen + 2 ) ; +#else + ubuf = (UniChar*) (buf ? buf : tbuf) ; +#endif + + ByteCount dcubuflen = byteBufferLen * 2 + 2 ; + ByteCount dcubufread , dcubufwritten ; + UniChar *dcubuf = (UniChar*) malloc( dcubuflen ) ; + + status = TECConvertText( + m_MB2WC_converter, (ConstTextPtr) psz, byteInLen, &byteInLen, + (TextPtr) dcubuf, dcubuflen, &byteOutLen); + // we have to terminate here, because n might be larger for the trailing zero, and if UniChar + // is not properly terminated we get random characters at the end + dcubuf[byteOutLen / sizeof( UniChar ) ] = 0 ; + + // now from the decomposed UniChar to properly composed uniChar + ConvertFromUnicodeToText( m_uniBack , byteOutLen , dcubuf , + kUnicodeDefaultDirectionMask, 0, NULL, NULL, NULL, dcubuflen , &dcubufread , &dcubufwritten , ubuf ) ; + + free( dcubuf ); + byteOutLen = dcubufwritten ; + ubuf[byteOutLen / sizeof( UniChar ) ] = 0 ; + + +#if SIZEOF_WCHAR_T == 4 + wxMBConvUTF16 converter ; + res = converter.MB2WC( (buf ? buf : tbuf), (const char*)ubuf, n ) ; + free( ubuf ) ; +#else + res = byteOutLen / sizeof( UniChar ) ; +#endif + + if ( buf == NULL ) + free(tbuf) ; + + if ( buf && res < n) + buf[res] = 0; + + return res ; + } + + virtual void CreateIfNeeded() const + { + wxMBConv_mac::CreateIfNeeded() ; + if ( m_uni == NULL ) + { + m_map.unicodeEncoding = CreateTextEncoding(kTextEncodingUnicodeDefault, + kUnicodeNoSubset, kTextEncodingDefaultFormat); + m_map.otherEncoding = CreateTextEncoding(kTextEncodingUnicodeDefault, + kUnicodeCanonicalDecompVariant, kTextEncodingDefaultFormat); + m_map.mappingVersion = kUnicodeUseLatestMapping; + + OSStatus err = CreateUnicodeToTextInfo(&m_map, &m_uni); + wxASSERT_MSG( err == noErr , _(" Couldn't create the UnicodeConverter")) ; + + m_map.unicodeEncoding = CreateTextEncoding(kTextEncodingUnicodeDefault, + kUnicodeNoSubset, kTextEncodingDefaultFormat); + m_map.otherEncoding = CreateTextEncoding(kTextEncodingUnicodeDefault, + kUnicodeCanonicalCompVariant, kTextEncodingDefaultFormat); + m_map.mappingVersion = kUnicodeUseLatestMapping; + err = CreateUnicodeToTextInfo(&m_map, &m_uniBack); + wxASSERT_MSG( err == noErr , _(" Couldn't create the UnicodeConverter")) ; + } + } +protected : + mutable UnicodeToTextInfo m_uni; + mutable UnicodeToTextInfo m_uniBack; + mutable UnicodeMapping m_map; +}; +#endif // defined(__WXMAC__) && defined(TARGET_CARBON) + +// ============================================================================ +// wxEncodingConverter based conversion classes +// ============================================================================ + +#if wxUSE_FONTMAP + +class wxMBConv_wxwin : public wxMBConv +{ +private: + void Init() + { + m_ok = m2w.Init(m_enc, wxFONTENCODING_UNICODE) && + w2m.Init(wxFONTENCODING_UNICODE, m_enc); + } + +public: + // temporarily just use wxEncodingConverter stuff, + // so that it works while a better implementation is built + wxMBConv_wxwin(const wxChar* name) + { + if (name) + m_enc = wxFontMapperBase::Get()->CharsetToEncoding(name, false); + else + m_enc = wxFONTENCODING_SYSTEM; + + Init(); + } + + wxMBConv_wxwin(wxFontEncoding enc) + { + m_enc = enc; + + Init(); + } + + size_t MB2WC(wchar_t *buf, const char *psz, size_t WXUNUSED(n)) const + { + size_t inbuf = strlen(psz); + if (buf) + { + if (!m2w.Convert(psz, buf)) + return wxCONV_FAILED; + } + return inbuf; + } + + size_t WC2MB(char *buf, const wchar_t *psz, size_t WXUNUSED(n)) const + { + const size_t inbuf = wxWcslen(psz); + if (buf) + { + if (!w2m.Convert(psz, buf)) + return wxCONV_FAILED; + } + + return inbuf; + } + + virtual size_t GetMBNulLen() const + { + switch ( m_enc ) + { + case wxFONTENCODING_UTF16BE: + case wxFONTENCODING_UTF16LE: + return 2; + + case wxFONTENCODING_UTF32BE: + case wxFONTENCODING_UTF32LE: + return 4; + + default: + return 1; + } + } + + virtual wxMBConv *Clone() const { return new wxMBConv_wxwin(m_enc); } + + bool IsOk() const { return m_ok; } + +public: + wxFontEncoding m_enc; + wxEncodingConverter m2w, w2m; + +private: + // were we initialized successfully? + bool m_ok; + + DECLARE_NO_COPY_CLASS(wxMBConv_wxwin) +}; + +// make the constructors available for unit testing +WXDLLIMPEXP_BASE wxMBConv* new_wxMBConv_wxwin( const wxChar* name ) +{ + wxMBConv_wxwin* result = new wxMBConv_wxwin( name ); + if ( !result->IsOk() ) + { + delete result; + return 0; + } + + return result; +} + +#endif // wxUSE_FONTMAP + +// ============================================================================ +// wxCSConv implementation +// ============================================================================ + +void wxCSConv::Init() +{ + m_name = NULL; + m_convReal = NULL; + m_deferred = true; +} + +wxCSConv::wxCSConv(const wxChar *charset) +{ + Init(); + + if ( charset ) + { + SetName(charset); + } + +#if wxUSE_FONTMAP + m_encoding = wxFontMapperBase::GetEncodingFromName(charset); +#else + m_encoding = wxFONTENCODING_SYSTEM; +#endif +} + +wxCSConv::wxCSConv(wxFontEncoding encoding) +{ + if ( encoding == wxFONTENCODING_MAX || encoding == wxFONTENCODING_DEFAULT ) + { + wxFAIL_MSG( _T("invalid encoding value in wxCSConv ctor") ); + + encoding = wxFONTENCODING_SYSTEM; + } + + Init(); + + m_encoding = encoding; +} + +wxCSConv::~wxCSConv() +{ + Clear(); +} + +wxCSConv::wxCSConv(const wxCSConv& conv) + : wxMBConv() +{ + Init(); + + SetName(conv.m_name); + m_encoding = conv.m_encoding; +} + +wxCSConv& wxCSConv::operator=(const wxCSConv& conv) +{ + Clear(); + + SetName(conv.m_name); + m_encoding = conv.m_encoding; + + return *this; +} + +void wxCSConv::Clear() +{ + free(m_name); + delete m_convReal; + + m_name = NULL; + m_convReal = NULL; +} + +void wxCSConv::SetName(const wxChar *charset) +{ + if (charset) + { + m_name = wxStrdup(charset); + m_deferred = true; + } +} + +#if wxUSE_FONTMAP + +WX_DECLARE_HASH_MAP( wxFontEncoding, wxString, wxIntegerHash, wxIntegerEqual, + wxEncodingNameCache ); + +static wxEncodingNameCache gs_nameCache; +#endif + +wxMBConv *wxCSConv::DoCreate() const +{ +#if wxUSE_FONTMAP + wxLogTrace(TRACE_STRCONV, + wxT("creating conversion for %s"), + (m_name ? m_name + : wxFontMapperBase::GetEncodingName(m_encoding).c_str())); +#endif // wxUSE_FONTMAP + + // check for the special case of ASCII or ISO8859-1 charset: as we have + // special knowledge of it anyhow, we don't need to create a special + // conversion object + if ( m_encoding == wxFONTENCODING_ISO8859_1 || + m_encoding == wxFONTENCODING_DEFAULT ) + { + // don't convert at all + return NULL; + } + + // we trust OS to do conversion better than we can so try external + // conversion methods first + // + // the full order is: + // 1. OS conversion (iconv() under Unix or Win32 API) + // 2. hard coded conversions for UTF + // 3. wxEncodingConverter as fall back + + // step (1) +#ifdef HAVE_ICONV +#if !wxUSE_FONTMAP + if ( m_name ) +#endif // !wxUSE_FONTMAP + { + wxString name(m_name); +#if wxUSE_FONTMAP + wxFontEncoding encoding(m_encoding); +#endif + + if ( !name.empty() ) + { + wxMBConv_iconv *conv = new wxMBConv_iconv(name); + if ( conv->IsOk() ) + return conv; + + delete conv; + +#if wxUSE_FONTMAP + encoding = + wxFontMapperBase::Get()->CharsetToEncoding(name, false); +#endif // wxUSE_FONTMAP + } +#if wxUSE_FONTMAP + { + const wxEncodingNameCache::iterator it = gs_nameCache.find(encoding); + if ( it != gs_nameCache.end() ) + { + if ( it->second.empty() ) + return NULL; + + wxMBConv_iconv *conv = new wxMBConv_iconv(it->second); + if ( conv->IsOk() ) + return conv; + + delete conv; + } + + const wxChar** names = wxFontMapperBase::GetAllEncodingNames(encoding); + // CS : in case this does not return valid names (eg for MacRoman) encoding + // got a 'failure' entry in the cache all the same, although it just has to + // be created using a different method, so only store failed iconv creation + // attempts (or perhaps we shoulnd't do this at all ?) + if ( names[0] != NULL ) + { + for ( ; *names; ++names ) + { + wxMBConv_iconv *conv = new wxMBConv_iconv(*names); + if ( conv->IsOk() ) + { + gs_nameCache[encoding] = *names; + return conv; + } + + delete conv; + } + + gs_nameCache[encoding] = _T(""); // cache the failure + } + } +#endif // wxUSE_FONTMAP + } +#endif // HAVE_ICONV + +#ifdef wxHAVE_WIN32_MB2WC + { +#if wxUSE_FONTMAP + wxMBConv_win32 *conv = m_name ? new wxMBConv_win32(m_name) + : new wxMBConv_win32(m_encoding); + if ( conv->IsOk() ) + return conv; + + delete conv; +#else + return NULL; +#endif + } +#endif // wxHAVE_WIN32_MB2WC + +#if defined(__WXMAC__) + { + // leave UTF16 and UTF32 to the built-ins of wx + if ( m_name || ( m_encoding < wxFONTENCODING_UTF16BE || + ( m_encoding >= wxFONTENCODING_MACMIN && m_encoding <= wxFONTENCODING_MACMAX ) ) ) + { +#if wxUSE_FONTMAP + wxMBConv_mac *conv = m_name ? new wxMBConv_mac(m_name) + : new wxMBConv_mac(m_encoding); +#else + wxMBConv_mac *conv = new wxMBConv_mac(m_encoding); +#endif + if ( conv->IsOk() ) + return conv; + + delete conv; + } + } +#endif + +#if defined(__WXCOCOA__) + { + if ( m_name || ( m_encoding <= wxFONTENCODING_UTF16 ) ) + { +#if wxUSE_FONTMAP + wxMBConv_cocoa *conv = m_name ? new wxMBConv_cocoa(m_name) + : new wxMBConv_cocoa(m_encoding); +#else + wxMBConv_cocoa *conv = new wxMBConv_cocoa(m_encoding); +#endif + + if ( conv->IsOk() ) + return conv; + + delete conv; + } + } +#endif + // step (2) + wxFontEncoding enc = m_encoding; +#if wxUSE_FONTMAP + if ( enc == wxFONTENCODING_SYSTEM && m_name ) + { + // use "false" to suppress interactive dialogs -- we can be called from + // anywhere and popping up a dialog from here is the last thing we want to + // do + enc = wxFontMapperBase::Get()->CharsetToEncoding(m_name, false); + } +#endif // wxUSE_FONTMAP + + switch ( enc ) + { + case wxFONTENCODING_UTF7: + return new wxMBConvUTF7; + + case wxFONTENCODING_UTF8: + return new wxMBConvUTF8; + + case wxFONTENCODING_UTF16BE: + return new wxMBConvUTF16BE; + + case wxFONTENCODING_UTF16LE: + return new wxMBConvUTF16LE; + + case wxFONTENCODING_UTF32BE: + return new wxMBConvUTF32BE; + + case wxFONTENCODING_UTF32LE: + return new wxMBConvUTF32LE; + + default: + // nothing to do but put here to suppress gcc warnings + break; + } + + // step (3) +#if wxUSE_FONTMAP + { + wxMBConv_wxwin *conv = m_name ? new wxMBConv_wxwin(m_name) + : new wxMBConv_wxwin(m_encoding); + if ( conv->IsOk() ) + return conv; + + delete conv; + } +#endif // wxUSE_FONTMAP + + // NB: This is a hack to prevent deadlock. What could otherwise happen + // in Unicode build: wxConvLocal creation ends up being here + // because of some failure and logs the error. But wxLog will try to + // attach a timestamp, for which it will need wxConvLocal (to convert + // time to char* and then wchar_t*), but that fails, tries to log the + // error, but wxLog has an (already locked) critical section that + // guards the static buffer. + static bool alreadyLoggingError = false; + if (!alreadyLoggingError) + { + alreadyLoggingError = true; + wxLogError(_("Cannot convert from the charset '%s'!"), + m_name ? m_name + : +#if wxUSE_FONTMAP + wxFontMapperBase::GetEncodingDescription(m_encoding).c_str() +#else // !wxUSE_FONTMAP + wxString::Format(_("encoding %i"), m_encoding).c_str() +#endif // wxUSE_FONTMAP/!wxUSE_FONTMAP + ); + + alreadyLoggingError = false; + } + + return NULL; +} + +void wxCSConv::CreateConvIfNeeded() const +{ + if ( m_deferred ) + { + wxCSConv *self = (wxCSConv *)this; // const_cast + + // if we don't have neither the name nor the encoding, use the default + // encoding for this system + if ( !m_name && m_encoding == wxFONTENCODING_SYSTEM ) + { +#if wxUSE_INTL + self->m_name = wxStrdup(wxLocale::GetSystemEncodingName()); +#else + // fallback to some reasonable default: + self->m_encoding = wxFONTENCODING_ISO8859_1; +#endif // wxUSE_INTL + } + + self->m_convReal = DoCreate(); + self->m_deferred = false; + } +} + +bool wxCSConv::IsOk() const +{ + CreateConvIfNeeded(); + + // special case: no convReal created for wxFONTENCODING_ISO8859_1 + if ( m_encoding == wxFONTENCODING_ISO8859_1 ) + return true; // always ok as we do it ourselves + + // m_convReal->IsOk() is called at its own creation, so we know it must + // be ok if m_convReal is non-NULL + return m_convReal != NULL; +} + +size_t wxCSConv::ToWChar(wchar_t *dst, size_t dstLen, + const char *src, size_t srcLen) const +{ + CreateConvIfNeeded(); + + if (m_convReal) + return m_convReal->ToWChar(dst, dstLen, src, srcLen); + + // latin-1 (direct) + return wxMBConv::ToWChar(dst, dstLen, src, srcLen); +} + +size_t wxCSConv::FromWChar(char *dst, size_t dstLen, + const wchar_t *src, size_t srcLen) const +{ + CreateConvIfNeeded(); + + if (m_convReal) + return m_convReal->FromWChar(dst, dstLen, src, srcLen); + + // latin-1 (direct) + return wxMBConv::FromWChar(dst, dstLen, src, srcLen); +} + +size_t wxCSConv::MB2WC(wchar_t *buf, const char *psz, size_t n) const +{ + CreateConvIfNeeded(); + + if (m_convReal) + return m_convReal->MB2WC(buf, psz, n); + + // latin-1 (direct) + size_t len = strlen(psz); + + if (buf) + { + for (size_t c = 0; c <= len; c++) + buf[c] = (unsigned char)(psz[c]); + } + + return len; +} + +size_t wxCSConv::WC2MB(char *buf, const wchar_t *psz, size_t n) const +{ + CreateConvIfNeeded(); + + if (m_convReal) + return m_convReal->WC2MB(buf, psz, n); + + // latin-1 (direct) + const size_t len = wxWcslen(psz); + if (buf) + { + for (size_t c = 0; c <= len; c++) + { + if (psz[c] > 0xFF) + return wxCONV_FAILED; + + buf[c] = (char)psz[c]; + } + } + else + { + for (size_t c = 0; c <= len; c++) + { + if (psz[c] > 0xFF) + return wxCONV_FAILED; + } + } + + return len; +} + +size_t wxCSConv::GetMBNulLen() const +{ + CreateConvIfNeeded(); + + if ( m_convReal ) + { + return m_convReal->GetMBNulLen(); + } + + return 1; +} + +// ---------------------------------------------------------------------------- +// globals +// ---------------------------------------------------------------------------- + +#ifdef __WINDOWS__ + static wxMBConv_win32 wxConvLibcObj; +#elif defined(__WXMAC__) && !defined(__MACH__) + static wxMBConv_mac wxConvLibcObj ; +#else + static wxMBConvLibc wxConvLibcObj; +#endif + +static wxCSConv wxConvLocalObj(wxFONTENCODING_SYSTEM); +static wxCSConv wxConvISO8859_1Obj(wxFONTENCODING_ISO8859_1); +static wxMBConvUTF7 wxConvUTF7Obj; +static wxMBConvUTF8 wxConvUTF8Obj; +#if defined(__WXMAC__) && defined(TARGET_CARBON) +static wxMBConv_macUTF8D wxConvMacUTF8DObj; +#endif +WXDLLIMPEXP_DATA_BASE(wxMBConv&) wxConvLibc = wxConvLibcObj; +WXDLLIMPEXP_DATA_BASE(wxCSConv&) wxConvLocal = wxConvLocalObj; +WXDLLIMPEXP_DATA_BASE(wxCSConv&) wxConvISO8859_1 = wxConvISO8859_1Obj; +WXDLLIMPEXP_DATA_BASE(wxMBConvUTF7&) wxConvUTF7 = wxConvUTF7Obj; +WXDLLIMPEXP_DATA_BASE(wxMBConvUTF8&) wxConvUTF8 = wxConvUTF8Obj; +WXDLLIMPEXP_DATA_BASE(wxMBConv *) wxConvCurrent = &wxConvLibcObj; +WXDLLIMPEXP_DATA_BASE(wxMBConv *) wxConvUI = &wxConvLocal; +WXDLLIMPEXP_DATA_BASE(wxMBConv *) wxConvFileName = & +#ifdef __WXOSX__ +#if defined(__WXMAC__) && defined(TARGET_CARBON) + wxConvMacUTF8DObj; +#else + wxConvUTF8Obj; +#endif +#else // !__WXOSX__ + wxConvLibcObj; +#endif // __WXOSX__/!__WXOSX__ + +#if wxUSE_UNICODE + +wxWCharBuffer wxSafeConvertMB2WX(const char *s) +{ + if ( !s ) + return wxWCharBuffer(); + + wxWCharBuffer wbuf(wxConvLibc.cMB2WX(s)); + if ( !wbuf ) + wbuf = wxConvUTF8.cMB2WX(s); + if ( !wbuf ) + wbuf = wxConvISO8859_1.cMB2WX(s); + + return wbuf; +} + +wxCharBuffer wxSafeConvertWX2MB(const wchar_t *ws) +{ + if ( !ws ) + return wxCharBuffer(); + + wxCharBuffer buf(wxConvLibc.cWX2MB(ws)); + if ( !buf ) + buf = wxMBConvUTF8(wxMBConvUTF8::MAP_INVALID_UTF8_TO_OCTAL).cWX2MB(ws); + + return buf; +} + +#endif // wxUSE_UNICODE + +#else // !wxUSE_WCHAR_T + +// stand-ins in absence of wchar_t +WXDLLIMPEXP_DATA_BASE(wxMBConv) wxConvLibc, + wxConvISO8859_1, + wxConvLocal, + wxConvUTF8; + +WXDLLIMPEXP_DATA_BASE(wxMBConv *) wxConvCurrent = NULL; + +#endif // wxUSE_WCHAR_T/!wxUSE_WCHAR_T diff --git a/Externals/wxWidgets/src/common/stream.cpp b/Externals/wxWidgets/src/common/stream.cpp new file mode 100644 index 0000000000..1b5eb4aed5 --- /dev/null +++ b/Externals/wxWidgets/src/common/stream.cpp @@ -0,0 +1,1385 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/stream.cpp +// Purpose: wxStream base classes +// Author: Guilhem Lavaux +// Modified by: VZ (23.11.00) to fix realloc()ing new[]ed memory, +// general code review +// Created: 11/07/98 +// RCS-ID: $Id: stream.cpp 44485 2007-02-12 19:11:12Z VZ $ +// Copyright: (c) Guilhem Lavaux +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_STREAMS + +#include "wx/stream.h" + +#ifndef WX_PRECOMP + #include "wx/log.h" +#endif + +#include +#include "wx/datstrm.h" +#include "wx/textfile.h" + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// the temporary buffer size used when copying from stream to stream +#define BUF_TEMP_SIZE 4096 + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxStreamBuffer +// ---------------------------------------------------------------------------- + +void wxStreamBuffer::SetError(wxStreamError err) +{ + if ( m_stream && m_stream->m_lasterror == wxSTREAM_NO_ERROR ) + m_stream->m_lasterror = err; +} + +void wxStreamBuffer::InitBuffer() +{ + m_buffer_start = + m_buffer_end = + m_buffer_pos = NULL; + m_buffer_size = 0; + + // if we are going to allocate the buffer, we should free it later as well + m_destroybuf = true; +} + +void wxStreamBuffer::Init() +{ + InitBuffer(); + + m_fixed = true; +} + +wxStreamBuffer::wxStreamBuffer(BufMode mode) +{ + Init(); + + m_stream = NULL; + m_mode = mode; + + m_flushable = false; +} + +wxStreamBuffer::wxStreamBuffer(wxStreamBase& stream, BufMode mode) +{ + Init(); + + m_stream = &stream; + m_mode = mode; + + m_flushable = true; +} + +wxStreamBuffer::wxStreamBuffer(const wxStreamBuffer& buffer) +{ + // doing this has big chances to lead to a crash when the source buffer is + // destroyed (otherwise assume the caller knows what he does) + wxASSERT_MSG( !buffer.m_destroybuf, + _T("it's a bad idea to copy this buffer") ); + + m_buffer_start = buffer.m_buffer_start; + m_buffer_end = buffer.m_buffer_end; + m_buffer_pos = buffer.m_buffer_pos; + m_buffer_size = buffer.m_buffer_size; + m_fixed = buffer.m_fixed; + m_flushable = buffer.m_flushable; + m_stream = buffer.m_stream; + m_mode = buffer.m_mode; + m_destroybuf = false; +} + +void wxStreamBuffer::FreeBuffer() +{ + if ( m_destroybuf ) + { + free(m_buffer_start); + m_buffer_start = NULL; + } +} + +wxStreamBuffer::~wxStreamBuffer() +{ + FreeBuffer(); +} + +wxInputStream *wxStreamBuffer::GetInputStream() const +{ + return m_mode == write ? NULL : (wxInputStream *)m_stream; +} + +wxOutputStream *wxStreamBuffer::GetOutputStream() const +{ + return m_mode == read ? NULL : (wxOutputStream *)m_stream; +} + +void wxStreamBuffer::SetBufferIO(void *buffer_start, + void *buffer_end, + bool takeOwnership) +{ + SetBufferIO(buffer_start, (char *)buffer_end - (char *)buffer_start, + takeOwnership); +} + +void wxStreamBuffer::SetBufferIO(void *start, + size_t len, + bool takeOwnership) +{ + // start by freeing the old buffer + FreeBuffer(); + + m_buffer_start = (char *)start; + m_buffer_end = m_buffer_start + len; + + m_buffer_size = len; + + // if we own it, we free it + m_destroybuf = takeOwnership; + + ResetBuffer(); +} + +void wxStreamBuffer::SetBufferIO(size_t bufsize) +{ + if ( bufsize ) + { + // this will free the old buffer and allocate the new one + SetBufferIO(malloc(bufsize), bufsize, true /* take ownership */); + } + else // no buffer size => no buffer + { + // still free the old one + FreeBuffer(); + InitBuffer(); + } +} + +void wxStreamBuffer::ResetBuffer() +{ + if ( m_stream ) + { + m_stream->Reset(); + m_stream->m_lastcount = 0; + } + + m_buffer_pos = m_mode == read && m_flushable + ? m_buffer_end + : m_buffer_start; +} + +// fill the buffer with as much data as possible (only for read buffers) +bool wxStreamBuffer::FillBuffer() +{ + wxInputStream *inStream = GetInputStream(); + + // It's legal to have no stream, so we don't complain about it just return false + if ( !inStream ) + return false; + + size_t count = inStream->OnSysRead(m_buffer_start, m_buffer_size); + if ( !count ) + return false; + + m_buffer_end = m_buffer_start + count; + m_buffer_pos = m_buffer_start; + + return true; +} + +// write the buffer contents to the stream (only for write buffers) +bool wxStreamBuffer::FlushBuffer() +{ + wxCHECK_MSG( m_flushable, false, _T("can't flush this buffer") ); + + // FIXME: what is this check for? (VZ) + if ( m_buffer_pos == m_buffer_start ) + return false; + + wxOutputStream *outStream = GetOutputStream(); + + wxCHECK_MSG( outStream, false, _T("should have a stream in wxStreamBuffer") ); + + size_t current = m_buffer_pos - m_buffer_start; + size_t count = outStream->OnSysWrite(m_buffer_start, current); + if ( count != current ) + return false; + + m_buffer_pos = m_buffer_start; + + return true; +} + +size_t wxStreamBuffer::GetDataLeft() +{ + /* Why is this done? RR. */ + if ( m_buffer_pos == m_buffer_end && m_flushable) + FillBuffer(); + + return GetBytesLeft(); +} + +// copy up to size bytes from our buffer into the provided one +void wxStreamBuffer::GetFromBuffer(void *buffer, size_t size) +{ + // don't get more bytes than left in the buffer + size_t left = GetBytesLeft(); + + if ( size > left ) + size = left; + + memcpy(buffer, m_buffer_pos, size); + m_buffer_pos += size; +} + +// copy the contents of the provided buffer into this one +void wxStreamBuffer::PutToBuffer(const void *buffer, size_t size) +{ + size_t left = GetBytesLeft(); + + if ( size > left ) + { + if ( m_fixed ) + { + // we can't realloc the buffer, so just copy what we can + size = left; + } + else // !m_fixed + { + // realloc the buffer to have enough space for the data + size_t delta = m_buffer_pos - m_buffer_start; + + char *startOld = m_buffer_start; + m_buffer_size += size; + m_buffer_start = (char *)realloc(m_buffer_start, m_buffer_size); + if ( !m_buffer_start ) + { + // don't leak memory if realloc() failed + m_buffer_start = startOld; + m_buffer_size -= size; + + // what else can we do? + return; + } + + // adjust the pointers invalidated by realloc() + m_buffer_pos = m_buffer_start + delta; + m_buffer_end = m_buffer_start + m_buffer_size; + } + } + + memcpy(m_buffer_pos, buffer, size); + m_buffer_pos += size; +} + +void wxStreamBuffer::PutChar(char c) +{ + wxOutputStream *outStream = GetOutputStream(); + + wxCHECK_RET( outStream, _T("should have a stream in wxStreamBuffer") ); + + // if we don't have buffer at all, just forward this call to the stream, + if ( !HasBuffer() ) + { + outStream->OnSysWrite(&c, sizeof(c)); + } + else + { + // otherwise check we have enough space left + if ( !GetDataLeft() && !FlushBuffer() ) + { + // we don't + SetError(wxSTREAM_WRITE_ERROR); + } + else + { + PutToBuffer(&c, sizeof(c)); + m_stream->m_lastcount = 1; + } + } +} + +char wxStreamBuffer::Peek() +{ + wxCHECK_MSG( m_stream && HasBuffer(), 0, + _T("should have the stream and the buffer in wxStreamBuffer") ); + + if ( !GetDataLeft() ) + { + SetError(wxSTREAM_READ_ERROR); + return 0; + } + + char c; + GetFromBuffer(&c, sizeof(c)); + m_buffer_pos--; + + return c; +} + +char wxStreamBuffer::GetChar() +{ + wxInputStream *inStream = GetInputStream(); + + wxCHECK_MSG( inStream, 0, _T("should have a stream in wxStreamBuffer") ); + + char c; + if ( !HasBuffer() ) + { + inStream->OnSysRead(&c, sizeof(c)); + } + else + { + if ( !GetDataLeft() ) + { + SetError(wxSTREAM_READ_ERROR); + c = 0; + } + else + { + GetFromBuffer(&c, sizeof(c)); + m_stream->m_lastcount = 1; + } + } + + return c; +} + +size_t wxStreamBuffer::Read(void *buffer, size_t size) +{ + wxASSERT_MSG( buffer, _T("Warning: Null pointer is about to be used") ); + + /* Clear buffer first */ + memset(buffer, 0x00, size); + + // lasterror is reset before all new IO calls + if ( m_stream ) + m_stream->Reset(); + + size_t readBytes; + if ( !HasBuffer() ) + { + wxInputStream *inStream = GetInputStream(); + + wxCHECK_MSG( inStream, 0, _T("should have a stream in wxStreamBuffer") ); + + readBytes = inStream->OnSysRead(buffer, size); + } + else // we have a buffer, use it + { + size_t orig_size = size; + + while ( size > 0 ) + { + size_t left = GetDataLeft(); + + // if the requested number of bytes if greater than the buffer + // size, read data in chunks + if ( size > left ) + { + GetFromBuffer(buffer, left); + size -= left; + buffer = (char *)buffer + left; + + if ( !FillBuffer() ) + { + SetError(wxSTREAM_EOF); + break; + } + } + else // otherwise just do it in one gulp + { + GetFromBuffer(buffer, size); + size = 0; + } + } + + readBytes = orig_size - size; + } + + if ( m_stream ) + m_stream->m_lastcount = readBytes; + + return readBytes; +} + +// this should really be called "Copy()" +size_t wxStreamBuffer::Read(wxStreamBuffer *dbuf) +{ + wxCHECK_MSG( m_mode != write, 0, _T("can't read from this buffer") ); + + char buf[BUF_TEMP_SIZE]; + size_t nRead, + total = 0; + + do + { + nRead = Read(buf, WXSIZEOF(buf)); + if ( nRead ) + { + nRead = dbuf->Write(buf, nRead); + total += nRead; + } + } + while ( nRead ); + + return total; +} + +size_t wxStreamBuffer::Write(const void *buffer, size_t size) +{ + wxASSERT_MSG( buffer, _T("Warning: Null pointer is about to be send") ); + + if (m_stream) + { + // lasterror is reset before all new IO calls + m_stream->Reset(); + } + + size_t ret; + + if ( !HasBuffer() && m_fixed ) + { + wxOutputStream *outStream = GetOutputStream(); + + wxCHECK_MSG( outStream, 0, _T("should have a stream in wxStreamBuffer") ); + + // no buffer, just forward the call to the stream + ret = outStream->OnSysWrite(buffer, size); + } + else // we [may] have a buffer, use it + { + size_t orig_size = size; + + while ( size > 0 ) + { + size_t left = GetBytesLeft(); + + // if the buffer is too large to fit in the stream buffer, split + // it in smaller parts + // + // NB: If stream buffer isn't fixed (as for wxMemoryOutputStream), + // we always go to the second case. + // + // FIXME: fine, but if it fails we should (re)try writing it by + // chunks as this will (hopefully) always work (VZ) + + if ( size > left && m_fixed ) + { + PutToBuffer(buffer, left); + size -= left; + buffer = (char *)buffer + left; + + if ( !FlushBuffer() ) + { + SetError(wxSTREAM_WRITE_ERROR); + + break; + } + + m_buffer_pos = m_buffer_start; + } + else // we can do it in one gulp + { + PutToBuffer(buffer, size); + size = 0; + } + } + + ret = orig_size - size; + } + + if (m_stream) + { + // i am not entirely sure what we do this for + m_stream->m_lastcount = ret; + } + + return ret; +} + +size_t wxStreamBuffer::Write(wxStreamBuffer *sbuf) +{ + wxCHECK_MSG( m_mode != read, 0, _T("can't write to this buffer") ); + wxCHECK_MSG( sbuf->m_mode != write, 0, _T("can't read from that buffer") ); + + char buf[BUF_TEMP_SIZE]; + size_t nWrite, + total = 0; + + do + { + size_t nRead = sbuf->Read(buf, WXSIZEOF(buf)); + if ( nRead ) + { + nWrite = Write(buf, nRead); + if ( nWrite < nRead ) + { + // put back data we couldn't copy + wxInputStream *in_stream = (wxInputStream *)sbuf->GetStream(); + + in_stream->Ungetch(buf + nWrite, nRead - nWrite); + } + + total += nWrite; + } + else + { + nWrite = 0; + } + } + while ( nWrite == WXSIZEOF(buf) ); + + return total; +} + +wxFileOffset wxStreamBuffer::Seek(wxFileOffset pos, wxSeekMode mode) +{ + wxFileOffset ret_off, diff; + + wxFileOffset last_access = GetLastAccess(); + + if ( !m_flushable ) + { + switch (mode) + { + case wxFromStart: + diff = pos; + break; + + case wxFromCurrent: + diff = pos + GetIntPosition(); + break; + + case wxFromEnd: + diff = pos + last_access; + break; + + default: + wxFAIL_MSG( _T("invalid seek mode") ); + + return wxInvalidOffset; + } + if (diff < 0 || diff > last_access) + return wxInvalidOffset; + size_t int_diff = wx_truncate_cast(size_t, diff); + wxCHECK_MSG( (wxFileOffset)int_diff == diff, wxInvalidOffset, wxT("huge file not supported") ); + SetIntPosition(int_diff); + return diff; + } + + switch ( mode ) + { + case wxFromStart: + // We'll try to compute an internal position later ... + ret_off = m_stream->OnSysSeek(pos, wxFromStart); + ResetBuffer(); + return ret_off; + + case wxFromCurrent: + diff = pos + GetIntPosition(); + + if ( (diff > last_access) || (diff < 0) ) + { + // We must take into account the fact that we have read + // something previously. + ret_off = m_stream->OnSysSeek(diff-last_access, wxFromCurrent); + ResetBuffer(); + return ret_off; + } + else + { + size_t int_diff = wx_truncate_cast(size_t, diff); + wxCHECK_MSG( (wxFileOffset)int_diff == diff, wxInvalidOffset, wxT("huge file not supported") ); + SetIntPosition(int_diff); + return pos; + } + + case wxFromEnd: + // Hard to compute: always seek to the requested position. + ret_off = m_stream->OnSysSeek(pos, wxFromEnd); + ResetBuffer(); + return ret_off; + } + + return wxInvalidOffset; +} + +wxFileOffset wxStreamBuffer::Tell() const +{ + wxFileOffset pos; + + // ask the stream for position if we have a real one + if ( m_stream ) + { + pos = m_stream->OnSysTell(); + if ( pos == wxInvalidOffset ) + return wxInvalidOffset; + } + else // no associated stream + { + pos = 0; + } + + pos += GetIntPosition(); + + if ( m_mode == read && m_flushable ) + pos -= GetLastAccess(); + + return pos; +} + +// ---------------------------------------------------------------------------- +// wxStreamBase +// ---------------------------------------------------------------------------- + +wxStreamBase::wxStreamBase() +{ + m_lasterror = wxSTREAM_NO_ERROR; + m_lastcount = 0; +} + +wxStreamBase::~wxStreamBase() +{ +} + +size_t wxStreamBase::GetSize() const +{ + wxFileOffset length = GetLength(); + if ( length == (wxFileOffset)wxInvalidOffset ) + return 0; + + const size_t len = wx_truncate_cast(size_t, length); + wxASSERT_MSG( len == length + size_t(0), _T("large files not supported") ); + + return len; +} + +wxFileOffset wxStreamBase::OnSysSeek(wxFileOffset WXUNUSED(seek), wxSeekMode WXUNUSED(mode)) +{ + return wxInvalidOffset; +} + +wxFileOffset wxStreamBase::OnSysTell() const +{ + return wxInvalidOffset; +} + +// ---------------------------------------------------------------------------- +// wxInputStream +// ---------------------------------------------------------------------------- + +wxInputStream::wxInputStream() +{ + m_wback = NULL; + m_wbacksize = + m_wbackcur = 0; +} + +wxInputStream::~wxInputStream() +{ + free(m_wback); +} + +bool wxInputStream::CanRead() const +{ + // we don't know if there is anything to read or not and by default we + // prefer to be optimistic and try to read data unless we know for sure + // there is no more of it + return m_lasterror != wxSTREAM_EOF; +} + +bool wxInputStream::Eof() const +{ + // the only way the base class can know we're at EOF is when we'd already + // tried to read beyond it in which case last error is set accordingly + return GetLastError() == wxSTREAM_EOF; +} + +char *wxInputStream::AllocSpaceWBack(size_t needed_size) +{ + // get number of bytes left from previous wback buffer + size_t toget = m_wbacksize - m_wbackcur; + + // allocate a buffer large enough to hold prev + new data + char *temp_b = (char *)malloc(needed_size + toget); + + if (!temp_b) + return NULL; + + // copy previous data (and free old buffer) if needed + if (m_wback) + { + memmove(temp_b + needed_size, m_wback + m_wbackcur, toget); + free(m_wback); + } + + // done + m_wback = temp_b; + m_wbackcur = 0; + m_wbacksize = needed_size + toget; + + return m_wback; +} + +size_t wxInputStream::GetWBack(void *buf, size_t size) +{ + wxASSERT_MSG( buf, _T("Warning: Null pointer is about to be used") ); + + /* Clear buffer first */ + memset(buf, 0x00, size); + + if (!m_wback) + return 0; + + // how many bytes do we have in the buffer? + size_t toget = m_wbacksize - m_wbackcur; + + if ( size < toget ) + { + // we won't read everything + toget = size; + } + + // copy the data from the cache + memcpy(buf, m_wback + m_wbackcur, toget); + + m_wbackcur += toget; + if ( m_wbackcur == m_wbacksize ) + { + // TODO: should we really free it here all the time? maybe keep it? + free(m_wback); + m_wback = NULL; + m_wbacksize = 0; + m_wbackcur = 0; + } + + // return the number of bytes copied + return toget; +} + +size_t wxInputStream::Ungetch(const void *buf, size_t bufsize) +{ + wxASSERT_MSG( buf, _T("Warning: Null pointer is about to be used in Ungetch()") ); + + if ( m_lasterror != wxSTREAM_NO_ERROR && m_lasterror != wxSTREAM_EOF ) + { + // can't operate on this stream until the error is cleared + return 0; + } + + char *ptrback = AllocSpaceWBack(bufsize); + if (!ptrback) + return 0; + + // Eof() shouldn't return true any longer + if ( m_lasterror == wxSTREAM_EOF ) + m_lasterror = wxSTREAM_NO_ERROR; + + memcpy(ptrback, buf, bufsize); + return bufsize; +} + +bool wxInputStream::Ungetch(char c) +{ + return Ungetch(&c, sizeof(c)) != 0; +} + +int wxInputStream::GetC() +{ + unsigned char c; + Read(&c, sizeof(c)); + return LastRead() ? c : wxEOF; +} + +wxInputStream& wxInputStream::Read(void *buf, size_t size) +{ + wxASSERT_MSG( buf, _T("Warning: Null pointer is about to be read") ); + + char *p = (char *)buf; + m_lastcount = 0; + + size_t read = GetWBack(buf, size); + for ( ;; ) + { + size -= read; + m_lastcount += read; + p += read; + + if ( !size ) + { + // we read the requested amount of data + break; + } + + if ( p != buf && !CanRead() ) + { + // we have already read something and we would block in OnSysRead() + // now: don't do it but return immediately + break; + } + + read = OnSysRead(p, size); + if ( !read ) + { + // no more data available + break; + } + } + + return *this; +} + +char wxInputStream::Peek() +{ + char c; + Read(&c, sizeof(c)); + if (m_lasterror == wxSTREAM_NO_ERROR) + { + Ungetch(c); + return c; + } + + return 0; +} + +wxInputStream& wxInputStream::Read(wxOutputStream& stream_out) +{ + size_t lastcount = 0; + char buf[BUF_TEMP_SIZE]; + + for ( ;; ) + { + size_t bytes_read = Read(buf, WXSIZEOF(buf)).LastRead(); + if ( !bytes_read ) + break; + + if ( stream_out.Write(buf, bytes_read).LastWrite() != bytes_read ) + break; + + lastcount += bytes_read; + } + + m_lastcount = lastcount; + + return *this; +} + +wxFileOffset wxInputStream::SeekI(wxFileOffset pos, wxSeekMode mode) +{ + // RR: This code is duplicated in wxBufferedInputStream. This is + // not really a good design, but buffered stream are different + // from all other in that they handle two stream-related objects, + // the stream buffer and parent stream. + + // I don't know whether it should be put as well in wxFileInputStream::OnSysSeek + if (m_lasterror==wxSTREAM_EOF) + m_lasterror=wxSTREAM_NO_ERROR; + + /* RR: A call to SeekI() will automatically invalidate any previous + call to Ungetch(), otherwise it would be possible to SeekI() to + one position, unread some bytes there, SeekI() to another position + and the data would be corrupted. + + GRG: Could add code here to try to navigate within the wback + buffer if possible, but is it really needed? It would only work + when seeking in wxFromCurrent mode, else it would invalidate + anyway... */ + + if (m_wback) + { + wxLogDebug( wxT("Seeking in stream which has data written back to it.") ); + + free(m_wback); + m_wback = NULL; + m_wbacksize = 0; + m_wbackcur = 0; + } + + return OnSysSeek(pos, mode); +} + +wxFileOffset wxInputStream::TellI() const +{ + wxFileOffset pos = OnSysTell(); + + if (pos != wxInvalidOffset) + pos -= (m_wbacksize - m_wbackcur); + + return pos; +} + + +// ---------------------------------------------------------------------------- +// wxOutputStream +// ---------------------------------------------------------------------------- + +wxOutputStream::wxOutputStream() +{ +} + +wxOutputStream::~wxOutputStream() +{ +} + +size_t wxOutputStream::OnSysWrite(const void * WXUNUSED(buffer), + size_t WXUNUSED(bufsize)) +{ + return 0; +} + +void wxOutputStream::PutC(char c) +{ + Write(&c, sizeof(c)); +} + +wxOutputStream& wxOutputStream::Write(const void *buffer, size_t size) +{ + m_lastcount = OnSysWrite(buffer, size); + return *this; +} + +wxOutputStream& wxOutputStream::Write(wxInputStream& stream_in) +{ + stream_in.Read(*this); + return *this; +} + +wxFileOffset wxOutputStream::TellO() const +{ + return OnSysTell(); +} + +wxFileOffset wxOutputStream::SeekO(wxFileOffset pos, wxSeekMode mode) +{ + return OnSysSeek(pos, mode); +} + +void wxOutputStream::Sync() +{ +} + + +// ---------------------------------------------------------------------------- +// wxCountingOutputStream +// ---------------------------------------------------------------------------- + +wxCountingOutputStream::wxCountingOutputStream () +{ + m_currentPos = 0; +} + +wxFileOffset wxCountingOutputStream::GetLength() const +{ + return m_lastcount; +} + +size_t wxCountingOutputStream::OnSysWrite(const void *WXUNUSED(buffer), + size_t size) +{ + m_currentPos += size; + if (m_currentPos > m_lastcount) + m_lastcount = m_currentPos; + + return m_currentPos; +} + +wxFileOffset wxCountingOutputStream::OnSysSeek(wxFileOffset pos, wxSeekMode mode) +{ + ssize_t new_pos = wx_truncate_cast(ssize_t, pos); + + switch ( mode ) + { + case wxFromStart: + wxCHECK_MSG( (wxFileOffset)new_pos == pos, wxInvalidOffset, wxT("huge position not supported") ); + break; + + case wxFromEnd: + new_pos = m_lastcount + new_pos; + wxCHECK_MSG( (wxFileOffset)new_pos == (wxFileOffset)(m_lastcount + pos), wxInvalidOffset, wxT("huge position not supported") ); + break; + + case wxFromCurrent: + new_pos = m_currentPos + new_pos; + wxCHECK_MSG( (wxFileOffset)new_pos == (wxFileOffset)(m_currentPos + pos), wxInvalidOffset, wxT("huge position not supported") ); + break; + + default: + wxFAIL_MSG( _T("invalid seek mode") ); + return wxInvalidOffset; + } + + m_currentPos = new_pos; + + if (m_currentPos > m_lastcount) + m_lastcount = m_currentPos; + + return m_currentPos; +} + +wxFileOffset wxCountingOutputStream::OnSysTell() const +{ + return m_currentPos; +} + +// ---------------------------------------------------------------------------- +// wxFilterInputStream +// ---------------------------------------------------------------------------- + +wxFilterInputStream::wxFilterInputStream() + : m_parent_i_stream(NULL), + m_owns(false) +{ +} + +wxFilterInputStream::wxFilterInputStream(wxInputStream& stream) + : m_parent_i_stream(&stream), + m_owns(false) +{ +} + +wxFilterInputStream::wxFilterInputStream(wxInputStream *stream) + : m_parent_i_stream(stream), + m_owns(true) +{ +} + +wxFilterInputStream::~wxFilterInputStream() +{ + if (m_owns) + delete m_parent_i_stream; +} + +// ---------------------------------------------------------------------------- +// wxFilterOutputStream +// ---------------------------------------------------------------------------- + +wxFilterOutputStream::wxFilterOutputStream() + : m_parent_o_stream(NULL), + m_owns(false) +{ +} + +wxFilterOutputStream::wxFilterOutputStream(wxOutputStream& stream) + : m_parent_o_stream(&stream), + m_owns(false) +{ +} + +wxFilterOutputStream::wxFilterOutputStream(wxOutputStream *stream) + : m_parent_o_stream(stream), + m_owns(true) +{ +} + +bool wxFilterOutputStream::Close() +{ + if (m_parent_o_stream && m_owns) + return m_parent_o_stream->Close(); + else + return true; +} + +wxFilterOutputStream::~wxFilterOutputStream() +{ + if (m_owns) + delete m_parent_o_stream; +} + +// ---------------------------------------------------------------------------- +// wxFilterClassFactoryBase +// ---------------------------------------------------------------------------- + +IMPLEMENT_ABSTRACT_CLASS(wxFilterClassFactoryBase, wxObject) + +wxString wxFilterClassFactoryBase::PopExtension(const wxString& location) const +{ + return location.substr(0, FindExtension(location)); +} + +wxString::size_type wxFilterClassFactoryBase::FindExtension( + const wxChar *location) const +{ + size_t len = wxStrlen(location); + + for (const wxChar *const *p = GetProtocols(wxSTREAM_FILEEXT); *p; p++) + { + size_t l = wxStrlen(*p); + + if (l <= len && wxStrcmp(*p, location + len - l) == 0) + return len - l; + } + + return wxString::npos; +} + +bool wxFilterClassFactoryBase::CanHandle(const wxChar *protocol, + wxStreamProtocolType type) const +{ + if (type == wxSTREAM_FILEEXT) + return FindExtension(protocol) != wxString::npos; + else + for (const wxChar *const *p = GetProtocols(type); *p; p++) + if (wxStrcmp(*p, protocol) == 0) + return true; + + return false; +} + +// ---------------------------------------------------------------------------- +// wxFilterClassFactory +// ---------------------------------------------------------------------------- + +IMPLEMENT_ABSTRACT_CLASS(wxFilterClassFactory, wxFilterClassFactoryBase) + +wxFilterClassFactory *wxFilterClassFactory::sm_first = NULL; + +void wxFilterClassFactory::Remove() +{ + if (m_next != this) + { + wxFilterClassFactory **pp = &sm_first; + + while (*pp != this) + pp = &(*pp)->m_next; + + *pp = m_next; + + m_next = this; + } +} + +// ---------------------------------------------------------------------------- +// wxBufferedInputStream +// ---------------------------------------------------------------------------- + +wxBufferedInputStream::wxBufferedInputStream(wxInputStream& s, + wxStreamBuffer *buffer) + : wxFilterInputStream(s) +{ + if ( buffer ) + { + // use the buffer provided by the user + m_i_streambuf = buffer; + } + else // create a default buffer + { + m_i_streambuf = new wxStreamBuffer(*this, wxStreamBuffer::read); + + m_i_streambuf->SetBufferIO(1024); + } +} + +wxBufferedInputStream::~wxBufferedInputStream() +{ + m_parent_i_stream->SeekI(-(wxFileOffset)m_i_streambuf->GetBytesLeft(), + wxFromCurrent); + + delete m_i_streambuf; +} + +char wxBufferedInputStream::Peek() +{ + return m_i_streambuf->Peek(); +} + +wxInputStream& wxBufferedInputStream::Read(void *buf, size_t size) +{ + // reset the error flag + Reset(); + + // first read from the already cached data + m_lastcount = GetWBack(buf, size); + + // do we have to read anything more? + if ( m_lastcount < size ) + { + size -= m_lastcount; + buf = (char *)buf + m_lastcount; + + // the call to wxStreamBuffer::Read() below will reset our m_lastcount, + // so save it + size_t countOld = m_lastcount; + + m_i_streambuf->Read(buf, size); + + m_lastcount += countOld; + } + + return *this; +} + +wxFileOffset wxBufferedInputStream::SeekI(wxFileOffset pos, wxSeekMode mode) +{ + // RR: Look at wxInputStream for comments. + + if (m_lasterror==wxSTREAM_EOF) + Reset(); + + if (m_wback) + { + wxLogDebug( wxT("Seeking in stream which has data written back to it.") ); + + free(m_wback); + m_wback = NULL; + m_wbacksize = 0; + m_wbackcur = 0; + } + + return m_i_streambuf->Seek(pos, mode); +} + +wxFileOffset wxBufferedInputStream::TellI() const +{ + wxFileOffset pos = m_i_streambuf->Tell(); + + if (pos != wxInvalidOffset) + pos -= (m_wbacksize - m_wbackcur); + + return pos; +} + +size_t wxBufferedInputStream::OnSysRead(void *buffer, size_t bufsize) +{ + return m_parent_i_stream->Read(buffer, bufsize).LastRead(); +} + +wxFileOffset wxBufferedInputStream::OnSysSeek(wxFileOffset seek, wxSeekMode mode) +{ + return m_parent_i_stream->SeekI(seek, mode); +} + +wxFileOffset wxBufferedInputStream::OnSysTell() const +{ + return m_parent_i_stream->TellI(); +} + +void wxBufferedInputStream::SetInputStreamBuffer(wxStreamBuffer *buffer) +{ + wxCHECK_RET( buffer, _T("wxBufferedInputStream needs buffer") ); + + delete m_i_streambuf; + m_i_streambuf = buffer; +} + +// ---------------------------------------------------------------------------- +// wxBufferedOutputStream +// ---------------------------------------------------------------------------- + +wxBufferedOutputStream::wxBufferedOutputStream(wxOutputStream& s, + wxStreamBuffer *buffer) + : wxFilterOutputStream(s) +{ + if ( buffer ) + { + m_o_streambuf = buffer; + } + else // create a default one + { + m_o_streambuf = new wxStreamBuffer(*this, wxStreamBuffer::write); + + m_o_streambuf->SetBufferIO(1024); + } +} + +wxBufferedOutputStream::~wxBufferedOutputStream() +{ + Sync(); + delete m_o_streambuf; +} + +bool wxBufferedOutputStream::Close() +{ + Sync(); + return IsOk(); +} + + +wxOutputStream& wxBufferedOutputStream::Write(const void *buffer, size_t size) +{ + m_lastcount = 0; + m_o_streambuf->Write(buffer, size); + return *this; +} + +wxFileOffset wxBufferedOutputStream::SeekO(wxFileOffset pos, wxSeekMode mode) +{ + Sync(); + return m_o_streambuf->Seek(pos, mode); +} + +wxFileOffset wxBufferedOutputStream::TellO() const +{ + return m_o_streambuf->Tell(); +} + +void wxBufferedOutputStream::Sync() +{ + m_o_streambuf->FlushBuffer(); + m_parent_o_stream->Sync(); +} + +size_t wxBufferedOutputStream::OnSysWrite(const void *buffer, size_t bufsize) +{ + return m_parent_o_stream->Write(buffer, bufsize).LastWrite(); +} + +wxFileOffset wxBufferedOutputStream::OnSysSeek(wxFileOffset seek, wxSeekMode mode) +{ + return m_parent_o_stream->SeekO(seek, mode); +} + +wxFileOffset wxBufferedOutputStream::OnSysTell() const +{ + return m_parent_o_stream->TellO(); +} + +wxFileOffset wxBufferedOutputStream::GetLength() const +{ + return m_parent_o_stream->GetLength() + m_o_streambuf->GetIntPosition(); +} + +void wxBufferedOutputStream::SetOutputStreamBuffer(wxStreamBuffer *buffer) +{ + wxCHECK_RET( buffer, _T("wxBufferedOutputStream needs buffer") ); + + delete m_o_streambuf; + m_o_streambuf = buffer; +} + +// ---------------------------------------------------------------------------- +// Some IOManip function +// ---------------------------------------------------------------------------- + +wxOutputStream& wxEndL(wxOutputStream& stream) +{ + static const wxChar *eol = wxTextFile::GetEOL(); + + return stream.Write(eol, wxStrlen(eol)); +} + +#endif // wxUSE_STREAMS diff --git a/Externals/wxWidgets/src/common/string.cpp b/Externals/wxWidgets/src/common/string.cpp new file mode 100644 index 0000000000..3fcacc3a76 --- /dev/null +++ b/Externals/wxWidgets/src/common/string.cpp @@ -0,0 +1,2622 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/string.cpp +// Purpose: wxString class +// Author: Vadim Zeitlin, Ryan Norton +// Modified by: +// Created: 29/01/98 +// RCS-ID: $Id: string.cpp 49342 2007-10-23 03:30:16Z DE $ +// Copyright: (c) 1998 Vadim Zeitlin +// (c) 2004 Ryan Norton +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +/* + * About ref counting: + * 1) all empty strings use g_strEmpty, nRefs = -1 (set in Init()) + * 2) AllocBuffer() sets nRefs to 1, Lock() increments it by one + * 3) Unlock() decrements nRefs and frees memory if it goes to 0 + */ + +// =========================================================================== +// headers, declarations, constants +// =========================================================================== + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#ifndef WX_PRECOMP + #include "wx/string.h" + #include "wx/intl.h" + #include "wx/thread.h" +#endif + +#include + +#ifndef __WXWINCE__ + #include +#endif + +#include +#include + +#ifdef __SALFORDC__ + #include +#endif + +// allocating extra space for each string consumes more memory but speeds up +// the concatenation operations (nLen is the current string's length) +// NB: EXTRA_ALLOC must be >= 0! +#define EXTRA_ALLOC (19 - nLen % 16) + +// --------------------------------------------------------------------------- +// static class variables definition +// --------------------------------------------------------------------------- + +#if !wxUSE_STL + //According to STL _must_ be a -1 size_t + const size_t wxStringBase::npos = (size_t) -1; +#endif + +// ---------------------------------------------------------------------------- +// static data +// ---------------------------------------------------------------------------- + +#if wxUSE_STL + +extern const wxChar WXDLLIMPEXP_BASE *wxEmptyString = _T(""); + +#else + +// for an empty string, GetStringData() will return this address: this +// structure has the same layout as wxStringData and it's data() method will +// return the empty string (dummy pointer) +static const struct +{ + wxStringData data; + wxChar dummy; +} g_strEmpty = { {-1, 0, 0}, wxT('\0') }; + +// empty C style string: points to 'string data' byte of g_strEmpty +extern const wxChar WXDLLIMPEXP_BASE *wxEmptyString = &g_strEmpty.dummy; + +#endif + +// ---------------------------------------------------------------------------- +// global functions +// ---------------------------------------------------------------------------- + +#if wxUSE_STD_IOSTREAM + +#include + +wxSTD ostream& operator<<(wxSTD ostream& os, const wxString& str) +{ +#ifdef __BORLANDC__ + os << str.mb_str(); +#else + os << str.c_str(); +#endif + return os; +} + +#endif // wxUSE_STD_IOSTREAM + +// ---------------------------------------------------------------------------- +// private classes +// ---------------------------------------------------------------------------- + +// this small class is used to gather statistics for performance tuning +//#define WXSTRING_STATISTICS +#ifdef WXSTRING_STATISTICS + class Averager + { + public: + Averager(const wxChar *sz) { m_sz = sz; m_nTotal = m_nCount = 0; } + ~Averager() + { wxPrintf("wxString: average %s = %f\n", m_sz, ((float)m_nTotal)/m_nCount); } + + void Add(size_t n) { m_nTotal += n; m_nCount++; } + + private: + size_t m_nCount, m_nTotal; + const wxChar *m_sz; + } g_averageLength("allocation size"), + g_averageSummandLength("summand length"), + g_averageConcatHit("hit probability in concat"), + g_averageInitialLength("initial string length"); + + #define STATISTICS_ADD(av, val) g_average##av.Add(val) +#else + #define STATISTICS_ADD(av, val) +#endif // WXSTRING_STATISTICS + +#if !wxUSE_STL + +// =========================================================================== +// wxStringData class deallocation +// =========================================================================== + +#if defined(__VISUALC__) && defined(_MT) && !defined(_DLL) +# pragma message (__FILE__ ": building with Multithreaded non DLL runtime has a performance impact on wxString!") +void wxStringData::Free() +{ + free(this); +} +#endif + +// =========================================================================== +// wxStringBase +// =========================================================================== + +// takes nLength elements of psz starting at nPos +void wxStringBase::InitWith(const wxChar *psz, size_t nPos, size_t nLength) +{ + Init(); + + // if the length is not given, assume the string to be NUL terminated + if ( nLength == npos ) { + wxASSERT_MSG( nPos <= wxStrlen(psz), _T("index out of bounds") ); + + nLength = wxStrlen(psz + nPos); + } + + STATISTICS_ADD(InitialLength, nLength); + + if ( nLength > 0 ) { + // trailing '\0' is written in AllocBuffer() + if ( !AllocBuffer(nLength) ) { + wxFAIL_MSG( _T("out of memory in wxStringBase::InitWith") ); + return; + } + wxTmemcpy(m_pchData, psz + nPos, nLength); + } +} + +// poor man's iterators are "void *" pointers +wxStringBase::wxStringBase(const void *pStart, const void *pEnd) +{ + if ( pEnd >= pStart ) + { + InitWith((const wxChar *)pStart, 0, + (const wxChar *)pEnd - (const wxChar *)pStart); + } + else + { + wxFAIL_MSG( _T("pStart is not before pEnd") ); + Init(); + } +} + +wxStringBase::wxStringBase(size_type n, wxChar ch) +{ + Init(); + append(n, ch); +} + +// --------------------------------------------------------------------------- +// memory allocation +// --------------------------------------------------------------------------- + +// allocates memory needed to store a C string of length nLen +bool wxStringBase::AllocBuffer(size_t nLen) +{ + // allocating 0 sized buffer doesn't make sense, all empty strings should + // reuse g_strEmpty + wxASSERT( nLen > 0 ); + + // make sure that we don't overflow + wxASSERT( nLen < (INT_MAX / sizeof(wxChar)) - + (sizeof(wxStringData) + EXTRA_ALLOC + 1) ); + + STATISTICS_ADD(Length, nLen); + + // allocate memory: + // 1) one extra character for '\0' termination + // 2) sizeof(wxStringData) for housekeeping info + wxStringData* pData = (wxStringData*) + malloc(sizeof(wxStringData) + (nLen + EXTRA_ALLOC + 1)*sizeof(wxChar)); + + if ( pData == NULL ) { + // allocation failures are handled by the caller + return false; + } + + pData->nRefs = 1; + pData->nDataLength = nLen; + pData->nAllocLength = nLen + EXTRA_ALLOC; + m_pchData = pData->data(); // data starts after wxStringData + m_pchData[nLen] = wxT('\0'); + return true; +} + +// must be called before changing this string +bool wxStringBase::CopyBeforeWrite() +{ + wxStringData* pData = GetStringData(); + + if ( pData->IsShared() ) { + pData->Unlock(); // memory not freed because shared + size_t nLen = pData->nDataLength; + if ( !AllocBuffer(nLen) ) { + // allocation failures are handled by the caller + return false; + } + wxTmemcpy(m_pchData, pData->data(), nLen); + } + + wxASSERT( !GetStringData()->IsShared() ); // we must be the only owner + + return true; +} + +// must be called before replacing contents of this string +bool wxStringBase::AllocBeforeWrite(size_t nLen) +{ + wxASSERT( nLen != 0 ); // doesn't make any sense + + // must not share string and must have enough space + wxStringData* pData = GetStringData(); + if ( pData->IsShared() || pData->IsEmpty() ) { + // can't work with old buffer, get new one + pData->Unlock(); + if ( !AllocBuffer(nLen) ) { + // allocation failures are handled by the caller + return false; + } + } + else { + if ( nLen > pData->nAllocLength ) { + // realloc the buffer instead of calling malloc() again, this is more + // efficient + STATISTICS_ADD(Length, nLen); + + nLen += EXTRA_ALLOC; + + pData = (wxStringData*) + realloc(pData, sizeof(wxStringData) + (nLen + 1)*sizeof(wxChar)); + + if ( pData == NULL ) { + // allocation failures are handled by the caller + // keep previous data since reallocation failed + return false; + } + + pData->nAllocLength = nLen; + m_pchData = pData->data(); + } + } + + wxASSERT( !GetStringData()->IsShared() ); // we must be the only owner + + // it doesn't really matter what the string length is as it's going to be + // overwritten later but, for extra safety, set it to 0 for now as we may + // have some junk in m_pchData + GetStringData()->nDataLength = 0; + + return true; +} + +wxStringBase& wxStringBase::append(size_t n, wxChar ch) +{ + size_type len = length(); + + if ( !Alloc(len + n) || !CopyBeforeWrite() ) { + wxFAIL_MSG( _T("out of memory in wxStringBase::append") ); + } + GetStringData()->nDataLength = len + n; + m_pchData[len + n] = '\0'; + for ( size_t i = 0; i < n; ++i ) + m_pchData[len + i] = ch; + return *this; +} + +void wxStringBase::resize(size_t nSize, wxChar ch) +{ + size_t len = length(); + + if ( nSize < len ) + { + erase(begin() + nSize, end()); + } + else if ( nSize > len ) + { + append(nSize - len, ch); + } + //else: we have exactly the specified length, nothing to do +} + +// allocate enough memory for nLen characters +bool wxStringBase::Alloc(size_t nLen) +{ + wxStringData *pData = GetStringData(); + if ( pData->nAllocLength <= nLen ) { + if ( pData->IsEmpty() ) { + nLen += EXTRA_ALLOC; + + pData = (wxStringData *) + malloc(sizeof(wxStringData) + (nLen + 1)*sizeof(wxChar)); + + if ( pData == NULL ) { + // allocation failure handled by caller + return false; + } + + pData->nRefs = 1; + pData->nDataLength = 0; + pData->nAllocLength = nLen; + m_pchData = pData->data(); // data starts after wxStringData + m_pchData[0u] = wxT('\0'); + } + else if ( pData->IsShared() ) { + pData->Unlock(); // memory not freed because shared + size_t nOldLen = pData->nDataLength; + if ( !AllocBuffer(nLen) ) { + // allocation failure handled by caller + return false; + } + // +1 to copy the terminator, too + memcpy(m_pchData, pData->data(), (nOldLen+1)*sizeof(wxChar)); + GetStringData()->nDataLength = nOldLen; + } + else { + nLen += EXTRA_ALLOC; + + pData = (wxStringData *) + realloc(pData, sizeof(wxStringData) + (nLen + 1)*sizeof(wxChar)); + + if ( pData == NULL ) { + // allocation failure handled by caller + // keep previous data since reallocation failed + return false; + } + + // it's not important if the pointer changed or not (the check for this + // is not faster than assigning to m_pchData in all cases) + pData->nAllocLength = nLen; + m_pchData = pData->data(); + } + } + //else: we've already got enough + return true; +} + +wxStringBase::iterator wxStringBase::begin() +{ + if (length() > 0) + CopyBeforeWrite(); + return m_pchData; +} + +wxStringBase::iterator wxStringBase::end() +{ + if (length() > 0) + CopyBeforeWrite(); + return m_pchData + length(); +} + +wxStringBase::iterator wxStringBase::erase(iterator it) +{ + size_type idx = it - begin(); + erase(idx, 1); + return begin() + idx; +} + +wxStringBase& wxStringBase::erase(size_t nStart, size_t nLen) +{ + wxASSERT(nStart <= length()); + size_t strLen = length() - nStart; + // delete nLen or up to the end of the string characters + nLen = strLen < nLen ? strLen : nLen; + wxString strTmp(c_str(), nStart); + strTmp.append(c_str() + nStart + nLen, length() - nStart - nLen); + + swap(strTmp); + return *this; +} + +wxStringBase& wxStringBase::insert(size_t nPos, const wxChar *sz, size_t n) +{ + wxASSERT( nPos <= length() ); + + if ( n == npos ) n = wxStrlen(sz); + if ( n == 0 ) return *this; + + if ( !Alloc(length() + n) || !CopyBeforeWrite() ) { + wxFAIL_MSG( _T("out of memory in wxStringBase::insert") ); + } + + memmove(m_pchData + nPos + n, m_pchData + nPos, + (length() - nPos) * sizeof(wxChar)); + memcpy(m_pchData + nPos, sz, n * sizeof(wxChar)); + GetStringData()->nDataLength = length() + n; + m_pchData[length()] = '\0'; + + return *this; +} + +void wxStringBase::swap(wxStringBase& str) +{ + wxChar* tmp = str.m_pchData; + str.m_pchData = m_pchData; + m_pchData = tmp; +} + +size_t wxStringBase::find(const wxStringBase& str, size_t nStart) const +{ + // deal with the special case of empty string first + const size_t nLen = length(); + const size_t nLenOther = str.length(); + + if ( !nLenOther ) + { + // empty string is a substring of anything + return 0; + } + + if ( !nLen ) + { + // the other string is non empty so can't be our substring + return npos; + } + + wxASSERT( str.GetStringData()->IsValid() ); + wxASSERT( nStart <= nLen ); + + const wxChar * const other = str.c_str(); + + // anchor + const wxChar* p = (const wxChar*)wxTmemchr(c_str() + nStart, + *other, + nLen - nStart); + + if ( !p ) + return npos; + + while ( p - c_str() + nLenOther <= nLen && wxTmemcmp(p, other, nLenOther) ) + { + p++; + + // anchor again + p = (const wxChar*)wxTmemchr(p, *other, nLen - (p - c_str())); + + if ( !p ) + return npos; + } + + return p - c_str() + nLenOther <= nLen ? p - c_str() : npos; +} + +size_t wxStringBase::find(const wxChar* sz, size_t nStart, size_t n) const +{ + return find(wxStringBase(sz, n), nStart); +} + +size_t wxStringBase::find(wxChar ch, size_t nStart) const +{ + wxASSERT( nStart <= length() ); + + const wxChar *p = (const wxChar*)wxTmemchr(c_str() + nStart, ch, length() - nStart); + + return p == NULL ? npos : p - c_str(); +} + +size_t wxStringBase::rfind(const wxStringBase& str, size_t nStart) const +{ + wxASSERT( str.GetStringData()->IsValid() ); + wxASSERT( nStart == npos || nStart <= length() ); + + if ( length() >= str.length() ) + { + // avoids a corner case later + if ( length() == 0 && str.length() == 0 ) + return 0; + + // "top" is the point where search starts from + size_t top = length() - str.length(); + + if ( nStart == npos ) + nStart = length() - 1; + if ( nStart < top ) + top = nStart; + + const wxChar *cursor = c_str() + top; + do + { + if ( wxTmemcmp(cursor, str.c_str(), + str.length()) == 0 ) + { + return cursor - c_str(); + } + } while ( cursor-- > c_str() ); + } + + return npos; +} + +size_t wxStringBase::rfind(const wxChar* sz, size_t nStart, size_t n) const +{ + return rfind(wxStringBase(sz, n), nStart); +} + +size_t wxStringBase::rfind(wxChar ch, size_t nStart) const +{ + if ( nStart == npos ) + { + nStart = length(); + } + else + { + wxASSERT( nStart <= length() ); + } + + const wxChar *actual; + for ( actual = c_str() + ( nStart == npos ? length() : nStart + 1 ); + actual > c_str(); --actual ) + { + if ( *(actual - 1) == ch ) + return (actual - 1) - c_str(); + } + + return npos; +} + +size_t wxStringBase::find_first_of(const wxChar* sz, size_t nStart) const +{ + wxASSERT(nStart <= length()); + + size_t len = wxStrlen(sz); + + size_t i; + for(i = nStart; i < this->length(); ++i) + { + if (wxTmemchr(sz, *(c_str() + i), len)) + break; + } + + if(i == this->length()) + return npos; + else + return i; +} + +size_t wxStringBase::find_first_of(const wxChar* sz, size_t nStart, + size_t n) const +{ + return find_first_of(wxStringBase(sz, n), nStart); +} + +size_t wxStringBase::find_last_of(const wxChar* sz, size_t nStart) const +{ + if ( nStart == npos ) + { + nStart = length() - 1; + } + else + { + wxASSERT_MSG( nStart <= length(), + _T("invalid index in find_last_of()") ); + } + + size_t len = wxStrlen(sz); + + for ( const wxChar *p = c_str() + nStart; p >= c_str(); --p ) + { + if ( wxTmemchr(sz, *p, len) ) + return p - c_str(); + } + + return npos; +} + +size_t wxStringBase::find_last_of(const wxChar* sz, size_t nStart, + size_t n) const +{ + return find_last_of(wxStringBase(sz, n), nStart); +} + +size_t wxStringBase::find_first_not_of(const wxChar* sz, size_t nStart) const +{ + if ( nStart == npos ) + { + nStart = length(); + } + else + { + wxASSERT( nStart <= length() ); + } + + size_t len = wxStrlen(sz); + + size_t i; + for(i = nStart; i < this->length(); ++i) + { + if (!wxTmemchr(sz, *(c_str() + i), len)) + break; + } + + if(i == this->length()) + return npos; + else + return i; +} + +size_t wxStringBase::find_first_not_of(const wxChar* sz, size_t nStart, + size_t n) const +{ + return find_first_not_of(wxStringBase(sz, n), nStart); +} + +size_t wxStringBase::find_first_not_of(wxChar ch, size_t nStart) const +{ + wxASSERT( nStart <= length() ); + + for ( const wxChar *p = c_str() + nStart; *p; p++ ) + { + if ( *p != ch ) + return p - c_str(); + } + + return npos; +} + +size_t wxStringBase::find_last_not_of(const wxChar* sz, size_t nStart) const +{ + if ( nStart == npos ) + { + nStart = length() - 1; + } + else + { + wxASSERT( nStart <= length() ); + } + + size_t len = wxStrlen(sz); + + for ( const wxChar *p = c_str() + nStart; p >= c_str(); --p ) + { + if ( !wxTmemchr(sz, *p,len) ) + return p - c_str(); + } + + return npos; +} + +size_t wxStringBase::find_last_not_of(const wxChar* sz, size_t nStart, + size_t n) const +{ + return find_last_not_of(wxStringBase(sz, n), nStart); +} + +size_t wxStringBase::find_last_not_of(wxChar ch, size_t nStart) const +{ + if ( nStart == npos ) + { + nStart = length() - 1; + } + else + { + wxASSERT( nStart <= length() ); + } + + for ( const wxChar *p = c_str() + nStart; p >= c_str(); --p ) + { + if ( *p != ch ) + return p - c_str(); + } + + return npos; +} + +wxStringBase& wxStringBase::replace(size_t nStart, size_t nLen, + const wxChar *sz) +{ + wxASSERT_MSG( nStart <= length(), + _T("index out of bounds in wxStringBase::replace") ); + size_t strLen = length() - nStart; + nLen = strLen < nLen ? strLen : nLen; + + wxStringBase strTmp; + strTmp.reserve(length()); // micro optimisation to avoid multiple mem allocs + + //This is kind of inefficient, but its pretty good considering... + //we don't want to use character access operators here because on STL + //it will freeze the reference count of strTmp, which means a deep copy + //at the end when swap is called + // + //Also, we can't use append with the full character pointer and must + //do it manually because this string can contain null characters + for(size_t i1 = 0; i1 < nStart; ++i1) + strTmp.append(1, this->c_str()[i1]); + + //its safe to do the full version here because + //sz must be a normal c string + strTmp.append(sz); + + for(size_t i2 = nStart + nLen; i2 < length(); ++i2) + strTmp.append(1, this->c_str()[i2]); + + swap(strTmp); + return *this; +} + +wxStringBase& wxStringBase::replace(size_t nStart, size_t nLen, + size_t nCount, wxChar ch) +{ + return replace(nStart, nLen, wxStringBase(nCount, ch).c_str()); +} + +wxStringBase& wxStringBase::replace(size_t nStart, size_t nLen, + const wxStringBase& str, + size_t nStart2, size_t nLen2) +{ + return replace(nStart, nLen, str.substr(nStart2, nLen2)); +} + +wxStringBase& wxStringBase::replace(size_t nStart, size_t nLen, + const wxChar* sz, size_t nCount) +{ + return replace(nStart, nLen, wxStringBase(sz, nCount).c_str()); +} + +wxStringBase wxStringBase::substr(size_t nStart, size_t nLen) const +{ + if ( nLen == npos ) + nLen = length() - nStart; + return wxStringBase(*this, nStart, nLen); +} + +// assigns one string to another +wxStringBase& wxStringBase::operator=(const wxStringBase& stringSrc) +{ + wxASSERT( stringSrc.GetStringData()->IsValid() ); + + // don't copy string over itself + if ( m_pchData != stringSrc.m_pchData ) { + if ( stringSrc.GetStringData()->IsEmpty() ) { + Reinit(); + } + else { + // adjust references + GetStringData()->Unlock(); + m_pchData = stringSrc.m_pchData; + GetStringData()->Lock(); + } + } + + return *this; +} + +// assigns a single character +wxStringBase& wxStringBase::operator=(wxChar ch) +{ + if ( !AssignCopy(1, &ch) ) { + wxFAIL_MSG( _T("out of memory in wxStringBase::operator=(wxChar)") ); + } + return *this; +} + +// assigns C string +wxStringBase& wxStringBase::operator=(const wxChar *psz) +{ + if ( !AssignCopy(wxStrlen(psz), psz) ) { + wxFAIL_MSG( _T("out of memory in wxStringBase::operator=(const wxChar *)") ); + } + return *this; +} + +// helper function: does real copy +bool wxStringBase::AssignCopy(size_t nSrcLen, const wxChar *pszSrcData) +{ + if ( nSrcLen == 0 ) { + Reinit(); + } + else { + if ( !AllocBeforeWrite(nSrcLen) ) { + // allocation failure handled by caller + return false; + } + memcpy(m_pchData, pszSrcData, nSrcLen*sizeof(wxChar)); + GetStringData()->nDataLength = nSrcLen; + m_pchData[nSrcLen] = wxT('\0'); + } + return true; +} + +// --------------------------------------------------------------------------- +// string concatenation +// --------------------------------------------------------------------------- + +// add something to this string +bool wxStringBase::ConcatSelf(size_t nSrcLen, const wxChar *pszSrcData, + size_t nMaxLen) +{ + STATISTICS_ADD(SummandLength, nSrcLen); + + nSrcLen = nSrcLen < nMaxLen ? nSrcLen : nMaxLen; + + // concatenating an empty string is a NOP + if ( nSrcLen > 0 ) { + wxStringData *pData = GetStringData(); + size_t nLen = pData->nDataLength; + size_t nNewLen = nLen + nSrcLen; + + // alloc new buffer if current is too small + if ( pData->IsShared() ) { + STATISTICS_ADD(ConcatHit, 0); + + // we have to allocate another buffer + wxStringData* pOldData = GetStringData(); + if ( !AllocBuffer(nNewLen) ) { + // allocation failure handled by caller + return false; + } + memcpy(m_pchData, pOldData->data(), nLen*sizeof(wxChar)); + pOldData->Unlock(); + } + else if ( nNewLen > pData->nAllocLength ) { + STATISTICS_ADD(ConcatHit, 0); + + reserve(nNewLen); + // we have to grow the buffer + if ( capacity() < nNewLen ) { + // allocation failure handled by caller + return false; + } + } + else { + STATISTICS_ADD(ConcatHit, 1); + + // the buffer is already big enough + } + + // should be enough space + wxASSERT( nNewLen <= GetStringData()->nAllocLength ); + + // fast concatenation - all is done in our buffer + memcpy(m_pchData + nLen, pszSrcData, nSrcLen*sizeof(wxChar)); + + m_pchData[nNewLen] = wxT('\0'); // put terminating '\0' + GetStringData()->nDataLength = nNewLen; // and fix the length + } + //else: the string to append was empty + return true; +} + +// --------------------------------------------------------------------------- +// simple sub-string extraction +// --------------------------------------------------------------------------- + +// helper function: clone the data attached to this string +bool wxStringBase::AllocCopy(wxString& dest, int nCopyLen, int nCopyIndex) const +{ + if ( nCopyLen == 0 ) { + dest.Init(); + } + else { + if ( !dest.AllocBuffer(nCopyLen) ) { + // allocation failure handled by caller + return false; + } + memcpy(dest.m_pchData, m_pchData + nCopyIndex, nCopyLen*sizeof(wxChar)); + } + return true; +} + +#endif // !wxUSE_STL + +#if !wxUSE_STL || !defined(HAVE_STD_STRING_COMPARE) + +#if !wxUSE_STL + #define STRINGCLASS wxStringBase +#else + #define STRINGCLASS wxString +#endif + +static inline int wxDoCmp(const wxChar* s1, size_t l1, + const wxChar* s2, size_t l2) +{ + if( l1 == l2 ) + return wxTmemcmp(s1, s2, l1); + else if( l1 < l2 ) + { + int ret = wxTmemcmp(s1, s2, l1); + return ret == 0 ? -1 : ret; + } + else + { + int ret = wxTmemcmp(s1, s2, l2); + return ret == 0 ? +1 : ret; + } +} + +int STRINGCLASS::compare(const wxStringBase& str) const +{ + return ::wxDoCmp(data(), length(), str.data(), str.length()); +} + +int STRINGCLASS::compare(size_t nStart, size_t nLen, + const wxStringBase& str) const +{ + wxASSERT(nStart <= length()); + size_type strLen = length() - nStart; + nLen = strLen < nLen ? strLen : nLen; + return ::wxDoCmp(data() + nStart, nLen, str.data(), str.length()); +} + +int STRINGCLASS::compare(size_t nStart, size_t nLen, + const wxStringBase& str, + size_t nStart2, size_t nLen2) const +{ + wxASSERT(nStart <= length()); + wxASSERT(nStart2 <= str.length()); + size_type strLen = length() - nStart, + strLen2 = str.length() - nStart2; + nLen = strLen < nLen ? strLen : nLen; + nLen2 = strLen2 < nLen2 ? strLen2 : nLen2; + return ::wxDoCmp(data() + nStart, nLen, str.data() + nStart2, nLen2); +} + +int STRINGCLASS::compare(const wxChar* sz) const +{ + size_t nLen = wxStrlen(sz); + return ::wxDoCmp(data(), length(), sz, nLen); +} + +int STRINGCLASS::compare(size_t nStart, size_t nLen, + const wxChar* sz, size_t nCount) const +{ + wxASSERT(nStart <= length()); + size_type strLen = length() - nStart; + nLen = strLen < nLen ? strLen : nLen; + if( nCount == npos ) + nCount = wxStrlen(sz); + + return ::wxDoCmp(data() + nStart, nLen, sz, nCount); +} + +#undef STRINGCLASS + +#endif // !wxUSE_STL || !defined(HAVE_STD_STRING_COMPARE) + +// =========================================================================== +// wxString class core +// =========================================================================== + +// --------------------------------------------------------------------------- +// construction and conversion +// --------------------------------------------------------------------------- + +#if wxUSE_UNICODE + +// from multibyte string +wxString::wxString(const char *psz, const wxMBConv& conv, size_t nLength) +{ + // anything to do? + if ( psz && nLength != 0 ) + { + if ( nLength == npos ) + { + nLength = wxNO_LEN; + } + + size_t nLenWide; + wxWCharBuffer wbuf = conv.cMB2WC(psz, nLength, &nLenWide); + + if ( nLenWide ) + assign(wbuf, nLenWide); + } +} + +//Convert wxString in Unicode mode to a multi-byte string +const wxCharBuffer wxString::mb_str(const wxMBConv& conv) const +{ + return conv.cWC2MB(c_str(), length() + 1 /* size, not length */, NULL); +} + +#else // ANSI + +#if wxUSE_WCHAR_T + +// from wide string +wxString::wxString(const wchar_t *pwz, const wxMBConv& conv, size_t nLength) +{ + // anything to do? + if ( pwz && nLength != 0 ) + { + if ( nLength == npos ) + { + nLength = wxNO_LEN; + } + + size_t nLenMB; + wxCharBuffer buf = conv.cWC2MB(pwz, nLength, &nLenMB); + + if ( nLenMB ) + assign(buf, nLenMB); + } +} + +//Converts this string to a wide character string if unicode +//mode is not enabled and wxUSE_WCHAR_T is enabled +const wxWCharBuffer wxString::wc_str(const wxMBConv& conv) const +{ + return conv.cMB2WC(c_str(), length() + 1 /* size, not length */, NULL); +} + +#endif // wxUSE_WCHAR_T + +#endif // Unicode/ANSI + +// shrink to minimal size (releasing extra memory) +bool wxString::Shrink() +{ + wxString tmp(begin(), end()); + swap(tmp); + return tmp.length() == length(); +} + +#if !wxUSE_STL +// get the pointer to writable buffer of (at least) nLen bytes +wxChar *wxString::GetWriteBuf(size_t nLen) +{ + if ( !AllocBeforeWrite(nLen) ) { + // allocation failure handled by caller + return NULL; + } + + wxASSERT( GetStringData()->nRefs == 1 ); + GetStringData()->Validate(false); + + return m_pchData; +} + +// put string back in a reasonable state after GetWriteBuf +void wxString::UngetWriteBuf() +{ + UngetWriteBuf(wxStrlen(m_pchData)); +} + +void wxString::UngetWriteBuf(size_t nLen) +{ + wxStringData * const pData = GetStringData(); + + wxASSERT_MSG( nLen < pData->nAllocLength, _T("buffer overrun") ); + + // the strings we store are always NUL-terminated + pData->data()[nLen] = _T('\0'); + pData->nDataLength = nLen; + pData->Validate(true); +} +#endif // !wxUSE_STL + +// --------------------------------------------------------------------------- +// data access +// --------------------------------------------------------------------------- + +// all functions are inline in string.h + +// --------------------------------------------------------------------------- +// assignment operators +// --------------------------------------------------------------------------- + +#if !wxUSE_UNICODE + +// same as 'signed char' variant +wxString& wxString::operator=(const unsigned char* psz) +{ + *this = (const char *)psz; + return *this; +} + +#if wxUSE_WCHAR_T +wxString& wxString::operator=(const wchar_t *pwz) +{ + wxString str(pwz); + swap(str); + return *this; +} +#endif + +#endif + +/* + * concatenation functions come in 5 flavours: + * string + string + * char + string and string + char + * C str + string and string + C str + */ + +wxString operator+(const wxString& str1, const wxString& str2) +{ +#if !wxUSE_STL + wxASSERT( str1.GetStringData()->IsValid() ); + wxASSERT( str2.GetStringData()->IsValid() ); +#endif + + wxString s = str1; + s += str2; + + return s; +} + +wxString operator+(const wxString& str, wxChar ch) +{ +#if !wxUSE_STL + wxASSERT( str.GetStringData()->IsValid() ); +#endif + + wxString s = str; + s += ch; + + return s; +} + +wxString operator+(wxChar ch, const wxString& str) +{ +#if !wxUSE_STL + wxASSERT( str.GetStringData()->IsValid() ); +#endif + + wxString s = ch; + s += str; + + return s; +} + +wxString operator+(const wxString& str, const wxChar *psz) +{ +#if !wxUSE_STL + wxASSERT( str.GetStringData()->IsValid() ); +#endif + + wxString s; + if ( !s.Alloc(wxStrlen(psz) + str.length()) ) { + wxFAIL_MSG( _T("out of memory in wxString::operator+") ); + } + s += str; + s += psz; + + return s; +} + +wxString operator+(const wxChar *psz, const wxString& str) +{ +#if !wxUSE_STL + wxASSERT( str.GetStringData()->IsValid() ); +#endif + + wxString s; + if ( !s.Alloc(wxStrlen(psz) + str.length()) ) { + wxFAIL_MSG( _T("out of memory in wxString::operator+") ); + } + s = psz; + s += str; + + return s; +} + +// =========================================================================== +// other common string functions +// =========================================================================== + +int wxString::Cmp(const wxString& s) const +{ + return compare(s); +} + +int wxString::Cmp(const wxChar* psz) const +{ + return compare(psz); +} + +static inline int wxDoCmpNoCase(const wxChar* s1, size_t l1, + const wxChar* s2, size_t l2) +{ + size_t i; + + if( l1 == l2 ) + { + for(i = 0; i < l1; ++i) + { + if(wxTolower(s1[i]) != wxTolower(s2[i])) + break; + } + return i == l1 ? 0 : wxTolower(s1[i]) < wxTolower(s2[i]) ? -1 : 1; + } + else if( l1 < l2 ) + { + for(i = 0; i < l1; ++i) + { + if(wxTolower(s1[i]) != wxTolower(s2[i])) + break; + } + return i == l1 ? -1 : wxTolower(s1[i]) < wxTolower(s2[i]) ? -1 : 1; + } + else + { + for(i = 0; i < l2; ++i) + { + if(wxTolower(s1[i]) != wxTolower(s2[i])) + break; + } + return i == l2 ? 1 : wxTolower(s1[i]) < wxTolower(s2[i]) ? -1 : 1; + } +} + +int wxString::CmpNoCase(const wxString& s) const +{ + return wxDoCmpNoCase(data(), length(), s.data(), s.length()); +} + +int wxString::CmpNoCase(const wxChar* psz) const +{ + int nLen = wxStrlen(psz); + + return wxDoCmpNoCase(data(), length(), psz, nLen); +} + + +#if wxUSE_UNICODE + +#ifdef __MWERKS__ +#ifndef __SCHAR_MAX__ +#define __SCHAR_MAX__ 127 +#endif +#endif + +wxString wxString::FromAscii(const char *ascii) +{ + if (!ascii) + return wxEmptyString; + + size_t len = strlen( ascii ); + wxString res; + + if ( len ) + { + wxStringBuffer buf(res, len); + + wchar_t *dest = buf; + + for ( ;; ) + { + if ( (*dest++ = (wchar_t)(unsigned char)*ascii++) == L'\0' ) + break; + } + } + + return res; +} + +wxString wxString::FromAscii(const char ascii) +{ + // What do we do with '\0' ? + + wxString res; + res += (wchar_t)(unsigned char) ascii; + + return res; +} + +const wxCharBuffer wxString::ToAscii() const +{ + // this will allocate enough space for the terminating NUL too + wxCharBuffer buffer(length()); + + + char *dest = buffer.data(); + + const wchar_t *pwc = c_str(); + for ( ;; ) + { + *dest++ = (char)(*pwc > SCHAR_MAX ? wxT('_') : *pwc); + + // the output string can't have embedded NULs anyhow, so we can safely + // stop at first of them even if we do have any + if ( !*pwc++ ) + break; + } + + return buffer; +} + +#endif // Unicode + +// extract string of length nCount starting at nFirst +wxString wxString::Mid(size_t nFirst, size_t nCount) const +{ + size_t nLen = length(); + + // default value of nCount is npos and means "till the end" + if ( nCount == npos ) + { + nCount = nLen - nFirst; + } + + // out-of-bounds requests return sensible things + if ( nFirst + nCount > nLen ) + { + nCount = nLen - nFirst; + } + + if ( nFirst > nLen ) + { + // AllocCopy() will return empty string + return wxEmptyString; + } + + wxString dest(*this, nFirst, nCount); + if ( dest.length() != nCount ) + { + wxFAIL_MSG( _T("out of memory in wxString::Mid") ); + } + + return dest; +} + +// check that the string starts with prefix and return the rest of the string +// in the provided pointer if it is not NULL, otherwise return false +bool wxString::StartsWith(const wxChar *prefix, wxString *rest) const +{ + wxASSERT_MSG( prefix, _T("invalid parameter in wxString::StartsWith") ); + + // first check if the beginning of the string matches the prefix: note + // that we don't have to check that we don't run out of this string as + // when we reach the terminating NUL, either prefix string ends too (and + // then it's ok) or we break out of the loop because there is no match + const wxChar *p = c_str(); + while ( *prefix ) + { + if ( *prefix++ != *p++ ) + { + // no match + return false; + } + } + + if ( rest ) + { + // put the rest of the string into provided pointer + *rest = p; + } + + return true; +} + + +// check that the string ends with suffix and return the rest of it in the +// provided pointer if it is not NULL, otherwise return false +bool wxString::EndsWith(const wxChar *suffix, wxString *rest) const +{ + wxASSERT_MSG( suffix, _T("invalid parameter in wxString::EndssWith") ); + + int start = length() - wxStrlen(suffix); + if ( start < 0 || wxStrcmp(c_str() + start, suffix) != 0 ) + return false; + + if ( rest ) + { + // put the rest of the string into provided pointer + rest->assign(*this, 0, start); + } + + return true; +} + + +// extract nCount last (rightmost) characters +wxString wxString::Right(size_t nCount) const +{ + if ( nCount > length() ) + nCount = length(); + + wxString dest(*this, length() - nCount, nCount); + if ( dest.length() != nCount ) { + wxFAIL_MSG( _T("out of memory in wxString::Right") ); + } + return dest; +} + +// get all characters after the last occurence of ch +// (returns the whole string if ch not found) +wxString wxString::AfterLast(wxChar ch) const +{ + wxString str; + int iPos = Find(ch, true); + if ( iPos == wxNOT_FOUND ) + str = *this; + else + str = c_str() + iPos + 1; + + return str; +} + +// extract nCount first (leftmost) characters +wxString wxString::Left(size_t nCount) const +{ + if ( nCount > length() ) + nCount = length(); + + wxString dest(*this, 0, nCount); + if ( dest.length() != nCount ) { + wxFAIL_MSG( _T("out of memory in wxString::Left") ); + } + return dest; +} + +// get all characters before the first occurence of ch +// (returns the whole string if ch not found) +wxString wxString::BeforeFirst(wxChar ch) const +{ + int iPos = Find(ch); + if ( iPos == wxNOT_FOUND ) iPos = length(); + return wxString(*this, 0, iPos); +} + +/// get all characters before the last occurence of ch +/// (returns empty string if ch not found) +wxString wxString::BeforeLast(wxChar ch) const +{ + wxString str; + int iPos = Find(ch, true); + if ( iPos != wxNOT_FOUND && iPos != 0 ) + str = wxString(c_str(), iPos); + + return str; +} + +/// get all characters after the first occurence of ch +/// (returns empty string if ch not found) +wxString wxString::AfterFirst(wxChar ch) const +{ + wxString str; + int iPos = Find(ch); + if ( iPos != wxNOT_FOUND ) + str = c_str() + iPos + 1; + + return str; +} + +// replace first (or all) occurences of some substring with another one +size_t wxString::Replace(const wxChar *szOld, + const wxChar *szNew, bool bReplaceAll) +{ + // if we tried to replace an empty string we'd enter an infinite loop below + wxCHECK_MSG( szOld && *szOld && szNew, 0, + _T("wxString::Replace(): invalid parameter") ); + + size_t uiCount = 0; // count of replacements made + + size_t uiOldLen = wxStrlen(szOld); + size_t uiNewLen = wxStrlen(szNew); + + size_t dwPos = 0; + + while ( this->c_str()[dwPos] != wxT('\0') ) + { + //DO NOT USE STRSTR HERE + //this string can contain embedded null characters, + //so strstr will function incorrectly + dwPos = find(szOld, dwPos); + if ( dwPos == npos ) + break; // exit the loop + else + { + //replace this occurance of the old string with the new one + replace(dwPos, uiOldLen, szNew, uiNewLen); + + //move up pos past the string that was replaced + dwPos += uiNewLen; + + //increase replace count + ++uiCount; + + // stop now? + if ( !bReplaceAll ) + break; // exit the loop + } + } + + return uiCount; +} + +bool wxString::IsAscii() const +{ + const wxChar *s = (const wxChar*) *this; + while(*s){ + if(!isascii(*s)) return(false); + s++; + } + return(true); +} + +bool wxString::IsWord() const +{ + const wxChar *s = (const wxChar*) *this; + while(*s){ + if(!wxIsalpha(*s)) return(false); + s++; + } + return(true); +} + +bool wxString::IsNumber() const +{ + const wxChar *s = (const wxChar*) *this; + if (wxStrlen(s)) + if ((s[0] == wxT('-')) || (s[0] == wxT('+'))) s++; + while(*s){ + if(!wxIsdigit(*s)) return(false); + s++; + } + return(true); +} + +wxString wxString::Strip(stripType w) const +{ + wxString s = *this; + if ( w & leading ) s.Trim(false); + if ( w & trailing ) s.Trim(true); + return s; +} + +// --------------------------------------------------------------------------- +// case conversion +// --------------------------------------------------------------------------- + +wxString& wxString::MakeUpper() +{ + for ( iterator it = begin(), en = end(); it != en; ++it ) + *it = (wxChar)wxToupper(*it); + + return *this; +} + +wxString& wxString::MakeLower() +{ + for ( iterator it = begin(), en = end(); it != en; ++it ) + *it = (wxChar)wxTolower(*it); + + return *this; +} + +// --------------------------------------------------------------------------- +// trimming and padding +// --------------------------------------------------------------------------- + +// some compilers (VC++ 6.0 not to name them) return true for a call to +// isspace('ê') in the C locale which seems to be broken to me, but we have to +// live with this by checking that the character is a 7 bit one - even if this +// may fail to detect some spaces (I don't know if Unicode doesn't have +// space-like symbols somewhere except in the first 128 chars), it is arguably +// still better than trimming away accented letters +inline int wxSafeIsspace(wxChar ch) { return (ch < 127) && wxIsspace(ch); } + +// trims spaces (in the sense of isspace) from left or right side +wxString& wxString::Trim(bool bFromRight) +{ + // first check if we're going to modify the string at all + if ( !empty() && + ( + (bFromRight && wxSafeIsspace(GetChar(length() - 1))) || + (!bFromRight && wxSafeIsspace(GetChar(0u))) + ) + ) + { + if ( bFromRight ) + { + // find last non-space character + reverse_iterator psz = rbegin(); + while ( (psz != rend()) && wxSafeIsspace(*psz) ) + psz++; + + // truncate at trailing space start + erase(psz.base(), end()); + } + else + { + // find first non-space character + iterator psz = begin(); + while ( (psz != end()) && wxSafeIsspace(*psz) ) + psz++; + + // fix up data and length + erase(begin(), psz); + } + } + + return *this; +} + +// adds nCount characters chPad to the string from either side +wxString& wxString::Pad(size_t nCount, wxChar chPad, bool bFromRight) +{ + wxString s(chPad, nCount); + + if ( bFromRight ) + *this += s; + else + { + s += *this; + swap(s); + } + + return *this; +} + +// truncate the string +wxString& wxString::Truncate(size_t uiLen) +{ + if ( uiLen < length() ) + { + erase(begin() + uiLen, end()); + } + //else: nothing to do, string is already short enough + + return *this; +} + +// --------------------------------------------------------------------------- +// finding (return wxNOT_FOUND if not found and index otherwise) +// --------------------------------------------------------------------------- + +// find a character +int wxString::Find(wxChar ch, bool bFromEnd) const +{ + size_type idx = bFromEnd ? find_last_of(ch) : find_first_of(ch); + + return (idx == npos) ? wxNOT_FOUND : (int)idx; +} + +// find a sub-string (like strstr) +int wxString::Find(const wxChar *pszSub) const +{ + size_type idx = find(pszSub); + + return (idx == npos) ? wxNOT_FOUND : (int)idx; +} + +// ---------------------------------------------------------------------------- +// conversion to numbers +// ---------------------------------------------------------------------------- + +// the implementation of all the functions below is exactly the same so factor +// it out + +template +bool wxStringToIntType(const wxChar *start, + T *val, + int base, + F func) +{ + wxCHECK_MSG( val, false, _T("NULL output pointer") ); + wxASSERT_MSG( !base || (base > 1 && base <= 36), _T("invalid base") ); + +#ifndef __WXWINCE__ + errno = 0; +#endif + + wxChar *end; + *val = (*func)(start, &end, base); + + // return true only if scan was stopped by the terminating NUL and if the + // string was not empty to start with and no under/overflow occurred + return !*end && (end != start) +#ifndef __WXWINCE__ + && (errno != ERANGE) +#endif + ; +} + +bool wxString::ToLong(long *val, int base) const +{ + return wxStringToIntType(c_str(), val, base, wxStrtol); +} + +bool wxString::ToULong(unsigned long *val, int base) const +{ + return wxStringToIntType(c_str(), val, base, wxStrtoul); +} + +bool wxString::ToLongLong(wxLongLong_t *val, int base) const +{ +#ifdef wxHAS_STRTOLL + return wxStringToIntType(c_str(), val, base, wxStrtoll); +#else + // TODO: implement this ourselves + wxUnusedVar(val); + wxUnusedVar(base); + return false; +#endif // wxHAS_STRTOLL +} + +bool wxString::ToULongLong(wxULongLong_t *val, int base) const +{ +#ifdef wxHAS_STRTOLL + return wxStringToIntType(c_str(), val, base, wxStrtoull); +#else + // TODO: implement this ourselves + wxUnusedVar(val); + wxUnusedVar(base); + return false; +#endif +} + +bool wxString::ToDouble(double *val) const +{ + wxCHECK_MSG( val, false, _T("NULL pointer in wxString::ToDouble") ); + +#ifndef __WXWINCE__ + errno = 0; +#endif + + const wxChar *start = c_str(); + wxChar *end; + *val = wxStrtod(start, &end); + + // return true only if scan was stopped by the terminating NUL and if the + // string was not empty to start with and no under/overflow occurred + return !*end && (end != start) +#ifndef __WXWINCE__ + && (errno != ERANGE) +#endif + ; +} + +// --------------------------------------------------------------------------- +// formatted output +// --------------------------------------------------------------------------- + +/* static */ +wxString wxString::Format(const wxChar *pszFormat, ...) +{ + va_list argptr; + va_start(argptr, pszFormat); + + wxString s; + s.PrintfV(pszFormat, argptr); + + va_end(argptr); + + return s; +} + +/* static */ +wxString wxString::FormatV(const wxChar *pszFormat, va_list argptr) +{ + wxString s; + s.PrintfV(pszFormat, argptr); + return s; +} + +int wxString::Printf(const wxChar *pszFormat, ...) +{ + va_list argptr; + va_start(argptr, pszFormat); + + int iLen = PrintfV(pszFormat, argptr); + + va_end(argptr); + + return iLen; +} + +/* + Uses wxVsnprintf and places the result into the this string. + + In ANSI build, wxVsnprintf is effectively vsnprintf but in Unicode build + it is vswprintf. Due to a discrepancy between vsnprintf and vswprintf in + the ISO C99 (and thus SUSv3) standard the return value for the case of + an undersized buffer is inconsistent. For conforming vsnprintf + implementations the function must return the number of characters that + would have been printed had the buffer been large enough. For conforming + vswprintf implementations the function must return a negative number + and set errno. + + What vswprintf sets errno to is undefined but Darwin seems to set it to + EOVERFLOW. The only expected errno are EILSEQ and EINVAL. Both of + those are defined in the standard and backed up by several conformance + statements. Note that ENOMEM mentioned in the manual page does not + apply to swprintf, only wprintf and fwprintf. + + Official manual page: + http://www.opengroup.org/onlinepubs/009695399/functions/swprintf.html + + Some conformance statements (AIX, Solaris): + http://www.opengroup.org/csq/view.mhtml?RID=ibm%2FSD1%2F3 + http://www.theopengroup.org/csq/view.mhtml?norationale=1&noreferences=1&RID=Fujitsu%2FSE2%2F10 + + Since EILSEQ and EINVAL are rather common but EOVERFLOW is not and since + EILSEQ and EINVAL are specifically defined to mean the error is other than + an undersized buffer and no other errno are defined we treat those two + as meaning hard errors and everything else gets the old behavior which + is to keep looping and increasing buffer size until the function succeeds. + + In practice it's impossible to determine before compilation which behavior + may be used. The vswprintf function may have vsnprintf-like behavior or + vice-versa. Behavior detected on one release can theoretically change + with an updated release. Not to mention that configure testing for it + would require the test to be run on the host system, not the build system + which makes cross compilation difficult. Therefore, we make no assumptions + about behavior and try our best to handle every known case, including the + case where wxVsnprintf returns a negative number and fails to set errno. + + There is yet one more non-standard implementation and that is our own. + Fortunately, that can be detected at compile-time. + + On top of all that, ISO C99 explicitly defines snprintf to write a null + character to the last position of the specified buffer. That would be at + at the given buffer size minus 1. It is supposed to do this even if it + turns out that the buffer is sized too small. + + Darwin (tested on 10.5) follows the C99 behavior exactly. + + Glibc 2.6 almost follows the C99 behavior except vswprintf never sets + errno even when it fails. However, it only seems to ever fail due + to an undersized buffer. +*/ +int wxString::PrintfV(const wxChar* pszFormat, va_list argptr) +{ + int size = 1024; + + for ( ;; ) + { + // Allocate 1 more character than we tell wxVsnprintf about + // just in case it is buggy. + // FIXME: I have a feeling that the underlying function was not buggy + // and I suspect it was to fix the buf[size] = '\0' line below + wxStringBuffer tmp(*this, size + 1); + wxChar *buf = tmp; + + if ( !buf ) + { + // out of memory + return -1; + } + + // wxVsnprintf() may modify the original arg pointer, so pass it + // only a copy + va_list argptrcopy; + wxVaCopy(argptrcopy, argptr); + +#ifndef __WXWINCE__ + // Set errno to 0 to make it determinate if wxVsnprintf fails to set it. + errno = 0; +#endif + int len = wxVsnprintf(buf, size, pszFormat, argptrcopy); + va_end(argptrcopy); + + // some implementations of vsnprintf() don't NUL terminate + // the string if there is not enough space for it so + // always do it manually + // FIXME: This really seems to be the wrong and would be an off-by-one + // bug except the code above allocates an extra character. + buf[size] = _T('\0'); + + // vsnprintf() may return either -1 (traditional Unix behaviour) or the + // total number of characters which would have been written if the + // buffer were large enough (newer standards such as Unix98) + if ( len < 0 ) + { +#if wxUSE_WXVSNPRINTF + // we know that our own implementation of wxVsnprintf() returns -1 + // only for a format error - thus there's something wrong with + // the user's format string + return -1; +#else // assume that system version only returns error if not enough space +#ifndef __WXWINCE__ + if( (errno == EILSEQ) || (errno == EINVAL) ) + // If errno was set to one of the two well-known hard errors + // then fail immediately to avoid an infinite loop. + return -1; + else +#endif // __WXWINCE__ + // still not enough, as we don't know how much we need, double the + // current size of the buffer + size *= 2; +#endif // wxUSE_WXVSNPRINTF/!wxUSE_WXVSNPRINTF + } + else if ( len >= size ) + { +#if wxUSE_WXVSNPRINTF + // we know that our own implementation of wxVsnprintf() returns + // size+1 when there's not enough space but that's not the size + // of the required buffer! + size *= 2; // so we just double the current size of the buffer +#else + // some vsnprintf() implementations NUL-terminate the buffer and + // some don't in len == size case, to be safe always add 1 + // FIXME: I don't quite understand this comment. The vsnprintf + // function is specifically defined to return the number of + // characters printed not including the null terminator. + // So OF COURSE you need to add 1 to get the right buffer size. + // The following line is definitely correct, no question. + size = len + 1; +#endif + } + else // ok, there was enough space + { + break; + } + } + + // we could have overshot + Shrink(); + + return length(); +} + +// ---------------------------------------------------------------------------- +// misc other operations +// ---------------------------------------------------------------------------- + +// returns true if the string matches the pattern which may contain '*' and +// '?' metacharacters (as usual, '?' matches any character and '*' any number +// of them) +bool wxString::Matches(const wxChar *pszMask) const +{ + // I disable this code as it doesn't seem to be faster (in fact, it seems + // to be much slower) than the old, hand-written code below and using it + // here requires always linking with libregex even if the user code doesn't + // use it +#if 0 // wxUSE_REGEX + // first translate the shell-like mask into a regex + wxString pattern; + pattern.reserve(wxStrlen(pszMask)); + + pattern += _T('^'); + while ( *pszMask ) + { + switch ( *pszMask ) + { + case _T('?'): + pattern += _T('.'); + break; + + case _T('*'): + pattern += _T(".*"); + break; + + case _T('^'): + case _T('.'): + case _T('$'): + case _T('('): + case _T(')'): + case _T('|'): + case _T('+'): + case _T('\\'): + // these characters are special in a RE, quote them + // (however note that we don't quote '[' and ']' to allow + // using them for Unix shell like matching) + pattern += _T('\\'); + // fall through + + default: + pattern += *pszMask; + } + + pszMask++; + } + pattern += _T('$'); + + // and now use it + return wxRegEx(pattern, wxRE_NOSUB | wxRE_EXTENDED).Matches(c_str()); +#else // !wxUSE_REGEX + // TODO: this is, of course, awfully inefficient... + + // the char currently being checked + const wxChar *pszTxt = c_str(); + + // the last location where '*' matched + const wxChar *pszLastStarInText = NULL; + const wxChar *pszLastStarInMask = NULL; + +match: + for ( ; *pszMask != wxT('\0'); pszMask++, pszTxt++ ) { + switch ( *pszMask ) { + case wxT('?'): + if ( *pszTxt == wxT('\0') ) + return false; + + // pszTxt and pszMask will be incremented in the loop statement + + break; + + case wxT('*'): + { + // remember where we started to be able to backtrack later + pszLastStarInText = pszTxt; + pszLastStarInMask = pszMask; + + // ignore special chars immediately following this one + // (should this be an error?) + while ( *pszMask == wxT('*') || *pszMask == wxT('?') ) + pszMask++; + + // if there is nothing more, match + if ( *pszMask == wxT('\0') ) + return true; + + // are there any other metacharacters in the mask? + size_t uiLenMask; + const wxChar *pEndMask = wxStrpbrk(pszMask, wxT("*?")); + + if ( pEndMask != NULL ) { + // we have to match the string between two metachars + uiLenMask = pEndMask - pszMask; + } + else { + // we have to match the remainder of the string + uiLenMask = wxStrlen(pszMask); + } + + wxString strToMatch(pszMask, uiLenMask); + const wxChar* pMatch = wxStrstr(pszTxt, strToMatch); + if ( pMatch == NULL ) + return false; + + // -1 to compensate "++" in the loop + pszTxt = pMatch + uiLenMask - 1; + pszMask += uiLenMask - 1; + } + break; + + default: + if ( *pszMask != *pszTxt ) + return false; + break; + } + } + + // match only if nothing left + if ( *pszTxt == wxT('\0') ) + return true; + + // if we failed to match, backtrack if we can + if ( pszLastStarInText ) { + pszTxt = pszLastStarInText + 1; + pszMask = pszLastStarInMask; + + pszLastStarInText = NULL; + + // don't bother resetting pszLastStarInMask, it's unnecessary + + goto match; + } + + return false; +#endif // wxUSE_REGEX/!wxUSE_REGEX +} + +// Count the number of chars +int wxString::Freq(wxChar ch) const +{ + int count = 0; + int len = length(); + for (int i = 0; i < len; i++) + { + if (GetChar(i) == ch) + count ++; + } + return count; +} + +// convert to upper case, return the copy of the string +wxString wxString::Upper() const +{ wxString s(*this); return s.MakeUpper(); } + +// convert to lower case, return the copy of the string +wxString wxString::Lower() const { wxString s(*this); return s.MakeLower(); } + +int wxString::sprintf(const wxChar *pszFormat, ...) + { + va_list argptr; + va_start(argptr, pszFormat); + int iLen = PrintfV(pszFormat, argptr); + va_end(argptr); + return iLen; + } + +// ============================================================================ +// ArrayString +// ============================================================================ + +#include "wx/arrstr.h" + +wxArrayString::wxArrayString(size_t sz, const wxChar** a) +{ +#if !wxUSE_STL + Init(false); +#endif + for (size_t i=0; i < sz; i++) + Add(a[i]); +} + +wxArrayString::wxArrayString(size_t sz, const wxString* a) +{ +#if !wxUSE_STL + Init(false); +#endif + for (size_t i=0; i < sz; i++) + Add(a[i]); +} + +#if !wxUSE_STL + +// size increment = min(50% of current size, ARRAY_MAXSIZE_INCREMENT) +#define ARRAY_MAXSIZE_INCREMENT 4096 + +#ifndef ARRAY_DEFAULT_INITIAL_SIZE // also defined in dynarray.h +#define ARRAY_DEFAULT_INITIAL_SIZE (16) +#endif + +#define STRING(p) ((wxString *)(&(p))) + +// ctor +void wxArrayString::Init(bool autoSort) +{ + m_nSize = + m_nCount = 0; + m_pItems = (wxChar **) NULL; + m_autoSort = autoSort; +} + +// copy ctor +wxArrayString::wxArrayString(const wxArrayString& src) +{ + Init(src.m_autoSort); + + *this = src; +} + +// assignment operator +wxArrayString& wxArrayString::operator=(const wxArrayString& src) +{ + if ( m_nSize > 0 ) + Clear(); + + Copy(src); + + m_autoSort = src.m_autoSort; + + return *this; +} + +void wxArrayString::Copy(const wxArrayString& src) +{ + if ( src.m_nCount > ARRAY_DEFAULT_INITIAL_SIZE ) + Alloc(src.m_nCount); + + for ( size_t n = 0; n < src.m_nCount; n++ ) + Add(src[n]); +} + +// grow the array +void wxArrayString::Grow(size_t nIncrement) +{ + // only do it if no more place + if ( (m_nSize - m_nCount) < nIncrement ) { + // if ARRAY_DEFAULT_INITIAL_SIZE were set to 0, the initially empty would + // be never resized! + #if ARRAY_DEFAULT_INITIAL_SIZE == 0 + #error "ARRAY_DEFAULT_INITIAL_SIZE must be > 0!" + #endif + + if ( m_nSize == 0 ) { + // was empty, alloc some memory + m_nSize = ARRAY_DEFAULT_INITIAL_SIZE; + if (m_nSize < nIncrement) + m_nSize = nIncrement; + m_pItems = new wxChar *[m_nSize]; + } + else { + // otherwise when it's called for the first time, nIncrement would be 0 + // and the array would never be expanded + // add 50% but not too much + size_t ndefIncrement = m_nSize < ARRAY_DEFAULT_INITIAL_SIZE + ? ARRAY_DEFAULT_INITIAL_SIZE : m_nSize >> 1; + if ( ndefIncrement > ARRAY_MAXSIZE_INCREMENT ) + ndefIncrement = ARRAY_MAXSIZE_INCREMENT; + if ( nIncrement < ndefIncrement ) + nIncrement = ndefIncrement; + m_nSize += nIncrement; + wxChar **pNew = new wxChar *[m_nSize]; + + // copy data to new location + memcpy(pNew, m_pItems, m_nCount*sizeof(wxChar *)); + + // delete old memory (but do not release the strings!) + wxDELETEA(m_pItems); + + m_pItems = pNew; + } + } +} + +void wxArrayString::Free() +{ + for ( size_t n = 0; n < m_nCount; n++ ) { + STRING(m_pItems[n])->GetStringData()->Unlock(); + } +} + +// deletes all the strings from the list +void wxArrayString::Empty() +{ + Free(); + + m_nCount = 0; +} + +// as Empty, but also frees memory +void wxArrayString::Clear() +{ + Free(); + + m_nSize = + m_nCount = 0; + + wxDELETEA(m_pItems); +} + +// dtor +wxArrayString::~wxArrayString() +{ + Free(); + + wxDELETEA(m_pItems); +} + +void wxArrayString::reserve(size_t nSize) +{ + Alloc(nSize); +} + +// pre-allocates memory (frees the previous data!) +void wxArrayString::Alloc(size_t nSize) +{ + // only if old buffer was not big enough + if ( nSize > m_nSize ) { + wxChar **pNew = new wxChar *[nSize]; + if ( !pNew ) + return; + + memcpy(pNew, m_pItems, m_nCount*sizeof(wxChar *)); + delete [] m_pItems; + + m_pItems = pNew; + m_nSize = nSize; + } +} + +// minimizes the memory usage by freeing unused memory +void wxArrayString::Shrink() +{ + // only do it if we have some memory to free + if( m_nCount < m_nSize ) { + // allocates exactly as much memory as we need + wxChar **pNew = new wxChar *[m_nCount]; + + // copy data to new location + memcpy(pNew, m_pItems, m_nCount*sizeof(wxChar *)); + delete [] m_pItems; + m_pItems = pNew; + } +} + +#if WXWIN_COMPATIBILITY_2_4 + +// return a wxString[] as required for some control ctors. +wxString* wxArrayString::GetStringArray() const +{ + wxString *array = 0; + + if( m_nCount > 0 ) + { + array = new wxString[m_nCount]; + for( size_t i = 0; i < m_nCount; i++ ) + array[i] = m_pItems[i]; + } + + return array; +} + +void wxArrayString::Remove(size_t nIndex, size_t nRemove) +{ + RemoveAt(nIndex, nRemove); +} + +#endif // WXWIN_COMPATIBILITY_2_4 + +// searches the array for an item (forward or backwards) +int wxArrayString::Index(const wxChar *sz, bool bCase, bool bFromEnd) const +{ + if ( m_autoSort ) { + // use binary search in the sorted array + wxASSERT_MSG( bCase && !bFromEnd, + wxT("search parameters ignored for auto sorted array") ); + + size_t i, + lo = 0, + hi = m_nCount; + int res; + while ( lo < hi ) { + i = (lo + hi)/2; + + res = wxStrcmp(sz, m_pItems[i]); + if ( res < 0 ) + hi = i; + else if ( res > 0 ) + lo = i + 1; + else + return i; + } + + return wxNOT_FOUND; + } + else { + // use linear search in unsorted array + if ( bFromEnd ) { + if ( m_nCount > 0 ) { + size_t ui = m_nCount; + do { + if ( STRING(m_pItems[--ui])->IsSameAs(sz, bCase) ) + return ui; + } + while ( ui != 0 ); + } + } + else { + for( size_t ui = 0; ui < m_nCount; ui++ ) { + if( STRING(m_pItems[ui])->IsSameAs(sz, bCase) ) + return ui; + } + } + } + + return wxNOT_FOUND; +} + +// add item at the end +size_t wxArrayString::Add(const wxString& str, size_t nInsert) +{ + if ( m_autoSort ) { + // insert the string at the correct position to keep the array sorted + size_t i, + lo = 0, + hi = m_nCount; + int res; + while ( lo < hi ) { + i = (lo + hi)/2; + + res = str.Cmp(m_pItems[i]); + if ( res < 0 ) + hi = i; + else if ( res > 0 ) + lo = i + 1; + else { + lo = hi = i; + break; + } + } + + wxASSERT_MSG( lo == hi, wxT("binary search broken") ); + + Insert(str, lo, nInsert); + + return (size_t)lo; + } + else { + wxASSERT( str.GetStringData()->IsValid() ); + + Grow(nInsert); + + for (size_t i = 0; i < nInsert; i++) + { + // the string data must not be deleted! + str.GetStringData()->Lock(); + + // just append + m_pItems[m_nCount + i] = (wxChar *)str.c_str(); // const_cast + } + size_t ret = m_nCount; + m_nCount += nInsert; + return ret; + } +} + +// add item at the given position +void wxArrayString::Insert(const wxString& str, size_t nIndex, size_t nInsert) +{ + wxASSERT( str.GetStringData()->IsValid() ); + + wxCHECK_RET( nIndex <= m_nCount, wxT("bad index in wxArrayString::Insert") ); + wxCHECK_RET( m_nCount <= m_nCount + nInsert, + wxT("array size overflow in wxArrayString::Insert") ); + + Grow(nInsert); + + memmove(&m_pItems[nIndex + nInsert], &m_pItems[nIndex], + (m_nCount - nIndex)*sizeof(wxChar *)); + + for (size_t i = 0; i < nInsert; i++) + { + str.GetStringData()->Lock(); + m_pItems[nIndex + i] = (wxChar *)str.c_str(); + } + m_nCount += nInsert; +} + +// range insert (STL 23.2.4.3) +void +wxArrayString::insert(iterator it, const_iterator first, const_iterator last) +{ + const int idx = it - begin(); + + // grow it once + Grow(last - first); + + // reset "it" since it can change inside Grow() + it = begin() + idx; + + while ( first != last ) + { + it = insert(it, *first); + + // insert returns an iterator to the last element inserted but we need + // insert the next after this one, that is before the next one + ++it; + + ++first; + } +} + +// expand the array +void wxArrayString::SetCount(size_t count) +{ + Alloc(count); + + wxString s; + while ( m_nCount < count ) + m_pItems[m_nCount++] = (wxChar *)s.c_str(); +} + +// removes item from array (by index) +void wxArrayString::RemoveAt(size_t nIndex, size_t nRemove) +{ + wxCHECK_RET( nIndex < m_nCount, wxT("bad index in wxArrayString::Remove") ); + wxCHECK_RET( nIndex + nRemove <= m_nCount, + wxT("removing too many elements in wxArrayString::Remove") ); + + // release our lock + for (size_t i = 0; i < nRemove; i++) + Item(nIndex + i).GetStringData()->Unlock(); + + memmove(&m_pItems[nIndex], &m_pItems[nIndex + nRemove], + (m_nCount - nIndex - nRemove)*sizeof(wxChar *)); + m_nCount -= nRemove; +} + +// removes item from array (by value) +void wxArrayString::Remove(const wxChar *sz) +{ + int iIndex = Index(sz); + + wxCHECK_RET( iIndex != wxNOT_FOUND, + wxT("removing inexistent element in wxArrayString::Remove") ); + + RemoveAt(iIndex); +} + +void wxArrayString::assign(const_iterator first, const_iterator last) +{ + reserve(last - first); + for(; first != last; ++first) + push_back(*first); +} + +// ---------------------------------------------------------------------------- +// sorting +// ---------------------------------------------------------------------------- + +// we can only sort one array at a time with the quick-sort based +// implementation +#if wxUSE_THREADS + // need a critical section to protect access to gs_compareFunction and + // gs_sortAscending variables + static wxCriticalSection gs_critsectStringSort; +#endif // wxUSE_THREADS + +// function to use for string comparaison +static wxArrayString::CompareFunction gs_compareFunction = NULL; + +// if we don't use the compare function, this flag tells us if we sort the +// array in ascending or descending order +static bool gs_sortAscending = true; + +// function which is called by quick sort +extern "C" int wxC_CALLING_CONV // LINKAGEMODE +wxStringCompareFunction(const void *first, const void *second) +{ + wxString *strFirst = (wxString *)first; + wxString *strSecond = (wxString *)second; + + if ( gs_compareFunction ) { + return gs_compareFunction(*strFirst, *strSecond); + } + else { + // maybe we should use wxStrcoll + int result = strFirst->Cmp(*strSecond); + + return gs_sortAscending ? result : -result; + } +} + +// sort array elements using passed comparaison function +void wxArrayString::Sort(CompareFunction compareFunction) +{ + wxCRIT_SECT_LOCKER(lockCmpFunc, gs_critsectStringSort); + + wxASSERT( !gs_compareFunction ); // must have been reset to NULL + gs_compareFunction = compareFunction; + + DoSort(); + + // reset it to NULL so that Sort(bool) will work the next time + gs_compareFunction = NULL; +} + +extern "C" +{ + typedef int (wxC_CALLING_CONV * wxStringCompareFn)(const void *first, + const void *second); +} + +void wxArrayString::Sort(CompareFunction2 compareFunction) +{ + qsort(m_pItems, m_nCount, sizeof(wxChar *), (wxStringCompareFn)compareFunction); +} + +void wxArrayString::Sort(bool reverseOrder) +{ + Sort(reverseOrder ? wxStringSortDescending : wxStringSortAscending); +} + +void wxArrayString::DoSort() +{ + wxCHECK_RET( !m_autoSort, wxT("can't use this method with sorted arrays") ); + + // just sort the pointers using qsort() - of course it only works because + // wxString() *is* a pointer to its data + qsort(m_pItems, m_nCount, sizeof(wxChar *), wxStringCompareFunction); +} + +bool wxArrayString::operator==(const wxArrayString& a) const +{ + if ( m_nCount != a.m_nCount ) + return false; + + for ( size_t n = 0; n < m_nCount; n++ ) + { + if ( Item(n) != a[n] ) + return false; + } + + return true; +} + +#endif // !wxUSE_STL + +int wxCMPFUNC_CONV wxStringSortAscending(wxString* s1, wxString* s2) +{ + return s1->Cmp(*s2); +} + +int wxCMPFUNC_CONV wxStringSortDescending(wxString* s1, wxString* s2) +{ + return -s1->Cmp(*s2); +} diff --git a/Externals/wxWidgets/src/common/sysopt.cpp b/Externals/wxWidgets/src/common/sysopt.cpp new file mode 100644 index 0000000000..93a5039660 --- /dev/null +++ b/Externals/wxWidgets/src/common/sysopt.cpp @@ -0,0 +1,111 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/sysopt.cpp +// Purpose: wxSystemOptions +// Author: Julian Smart +// Modified by: +// Created: 2001-07-10 +// RCS-ID: $Id: sysopt.cpp 39851 2006-06-27 14:33:14Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// --------------------------------------------------------------------------- +// headers +// --------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#if defined(__BORLANDC__) + #pragma hdrstop +#endif + +#if wxUSE_SYSTEM_OPTIONS + +#include "wx/sysopt.h" + +#ifndef WX_PRECOMP + #include "wx/app.h" + #include "wx/list.h" + #include "wx/string.h" + #include "wx/arrstr.h" +#endif + +// ---------------------------------------------------------------------------- +// private globals +// ---------------------------------------------------------------------------- + +static wxArrayString gs_optionNames, + gs_optionValues; + +// ============================================================================ +// wxSystemOptions implementation +// ============================================================================ + +// Option functions (arbitrary name/value mapping) +void wxSystemOptions::SetOption(const wxString& name, const wxString& value) +{ + int idx = gs_optionNames.Index(name, false); + if (idx == wxNOT_FOUND) + { + gs_optionNames.Add(name); + gs_optionValues.Add(value); + } + else + { + gs_optionNames[idx] = name; + gs_optionValues[idx] = value; + } +} + +void wxSystemOptions::SetOption(const wxString& name, int value) +{ + SetOption(name, wxString::Format(wxT("%d"), value)); +} + +wxString wxSystemOptions::GetOption(const wxString& name) +{ + wxString val; + + int idx = gs_optionNames.Index(name, false); + if ( idx != wxNOT_FOUND ) + { + val = gs_optionValues[idx]; + } + else // not set explicitely + { + // look in the environment: first for a variable named "wx_appname_name" + // which can be set to affect the behaviour or just this application + // and then for "wx_name" which can be set to change the option globally + wxString var(name); + var.Replace(_T("."), _T("_")); // '.'s not allowed in env var names + + wxString appname; + if ( wxTheApp ) + appname = wxTheApp->GetAppName(); + + if ( !appname.empty() ) + val = wxGetenv(_T("wx_") + appname + _T('_') + var); + + if ( val.empty() ) + val = wxGetenv(_T("wx_") + var); + } + + return val; +} + +int wxSystemOptions::GetOptionInt(const wxString& name) +{ + return wxAtoi(GetOption(name)); +} + +bool wxSystemOptions::HasOption(const wxString& name) +{ + return !GetOption(name).empty(); +} + +#endif // wxUSE_SYSTEM_OPTIONS diff --git a/Externals/wxWidgets/src/common/tarstrm.cpp b/Externals/wxWidgets/src/common/tarstrm.cpp new file mode 100644 index 0000000000..5b33204b33 --- /dev/null +++ b/Externals/wxWidgets/src/common/tarstrm.cpp @@ -0,0 +1,1527 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: tarstrm.cpp +// Purpose: Streams for Tar files +// Author: Mike Wetherell +// RCS-ID: $Id: tarstrm.cpp 49010 2007-10-01 21:25:08Z MW $ +// Copyright: (c) 2004 Mike Wetherell +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_TARSTREAM + +#include "wx/tarstrm.h" + +#ifndef WX_PRECOMP + #include "wx/intl.h" + #include "wx/log.h" + #include "wx/utils.h" +#endif + +#include "wx/buffer.h" +#include "wx/datetime.h" +#include "wx/ptr_scpd.h" +#include "wx/filename.h" +#include "wx/thread.h" + +#include + +#ifdef __UNIX__ +#include +#include +#endif + + +///////////////////////////////////////////////////////////////////////////// +// constants + +enum { + TAR_NAME, + TAR_MODE, + TAR_UID, + TAR_GID, + TAR_SIZE, + TAR_MTIME, + TAR_CHKSUM, + TAR_TYPEFLAG, + TAR_LINKNAME, + TAR_MAGIC, + TAR_VERSION, + TAR_UNAME, + TAR_GNAME, + TAR_DEVMAJOR, + TAR_DEVMINOR, + TAR_PREFIX, + TAR_UNUSED, + TAR_NUMFIELDS +}; + +enum { + TAR_BLOCKSIZE = 512 +}; + +// checksum type +enum { + SUM_UNKNOWN, + SUM_UNSIGNED, + SUM_SIGNED +}; + +// type of input tar +enum { + TYPE_OLDTAR, // fields after TAR_LINKNAME are invalid + TYPE_GNUTAR, // all fields except TAR_PREFIX are valid + TYPE_USTAR // all fields are valid +}; + +// signatures +static const char *USTAR_MAGIC = "ustar"; +static const char *USTAR_VERSION = "00"; +static const char *GNU_MAGIC = "ustar "; +static const char *GNU_VERION = " "; + +IMPLEMENT_DYNAMIC_CLASS(wxTarEntry, wxArchiveEntry) +IMPLEMENT_DYNAMIC_CLASS(wxTarClassFactory, wxArchiveClassFactory) + + +///////////////////////////////////////////////////////////////////////////// +// Class factory + +static wxTarClassFactory g_wxTarClassFactory; + +wxTarClassFactory::wxTarClassFactory() +{ + if (this == &g_wxTarClassFactory) + PushFront(); +} + +const wxChar * const * +wxTarClassFactory::GetProtocols(wxStreamProtocolType type) const +{ + static const wxChar *protocols[] = { _T("tar"), NULL }; + static const wxChar *mimetypes[] = { _T("application/x-tar"), NULL }; + static const wxChar *fileexts[] = { _T(".tar"), NULL }; + static const wxChar *empty[] = { NULL }; + + switch (type) { + case wxSTREAM_PROTOCOL: return protocols; + case wxSTREAM_MIMETYPE: return mimetypes; + case wxSTREAM_FILEEXT: return fileexts; + default: return empty; + } +} + + +///////////////////////////////////////////////////////////////////////////// +// tar header block + +typedef wxFileOffset wxTarNumber; + +struct wxTarField { const wxChar *name; int pos; }; + +class wxTarHeaderBlock +{ +public: + wxTarHeaderBlock() + { memset(data, 0, sizeof(data)); } + wxTarHeaderBlock(const wxTarHeaderBlock& hb) + { memcpy(data, hb.data, sizeof(data)); } + + bool Read(wxInputStream& in); + bool Write(wxOutputStream& out); + inline bool WriteField(wxOutputStream& out, int id); + + bool IsAllZeros() const; + wxUint32 Sum(bool SignedSum = false); + wxUint32 SumField(int id); + + char *Get(int id) { return data + fields[id].pos + id; } + static size_t Len(int id) { return fields[id + 1].pos - fields[id].pos; } + static const wxChar *Name(int id) { return fields[id].name; } + static size_t Offset(int id) { return fields[id].pos; } + + bool SetOctal(int id, wxTarNumber n); + wxTarNumber GetOctal(int id); + bool SetPath(const wxString& name, wxMBConv& conv); + +private: + char data[TAR_BLOCKSIZE + TAR_NUMFIELDS]; + static const wxTarField fields[]; + static void check(); +}; + +wxDEFINE_SCOPED_PTR_TYPE(wxTarHeaderBlock) + +// A table giving the field names and offsets in a tar header block +const wxTarField wxTarHeaderBlock::fields[] = +{ + { _T("name"), 0 }, // 100 + { _T("mode"), 100 }, // 8 + { _T("uid"), 108 }, // 8 + { _T("gid"), 116 }, // 8 + { _T("size"), 124 }, // 12 + { _T("mtime"), 136 }, // 12 + { _T("chksum"), 148 }, // 8 + { _T("typeflag"), 156 }, // 1 + { _T("linkname"), 157 }, // 100 + { _T("magic"), 257 }, // 6 + { _T("version"), 263 }, // 2 + { _T("uname"), 265 }, // 32 + { _T("gname"), 297 }, // 32 + { _T("devmajor"), 329 }, // 8 + { _T("devminor"), 337 }, // 8 + { _T("prefix"), 345 }, // 155 + { _T("unused"), 500 }, // 12 + { NULL, TAR_BLOCKSIZE } +}; + +void wxTarHeaderBlock::check() +{ +#if 0 + wxCOMPILE_TIME_ASSERT( + WXSIZEOF(fields) == TAR_NUMFIELDS + 1, + Wrong_number_of_elements_in_fields_table + ); +#endif +} + +bool wxTarHeaderBlock::IsAllZeros() const +{ + const char *p = data; + for (size_t i = 0; i < sizeof(data); i++) + if (p[i]) + return false; + return true; +} + +wxUint32 wxTarHeaderBlock::Sum(bool SignedSum /*=false*/) +{ + // the chksum field itself should be blanks during the calculation + memset(Get(TAR_CHKSUM), ' ', Len(TAR_CHKSUM)); + const char *p = data; + wxUint32 n = 0; + + if (SignedSum) + for (size_t i = 0; i < sizeof(data); i++) + n += (signed char)p[i]; + else + for (size_t i = 0; i < sizeof(data); i++) + n += (unsigned char)p[i]; + + return n; +} + +wxUint32 wxTarHeaderBlock::SumField(int id) +{ + unsigned char *p = (unsigned char*)Get(id); + unsigned char *q = p + Len(id); + wxUint32 n = 0; + + while (p < q) + n += *p++; + + return n; +} + +bool wxTarHeaderBlock::Read(wxInputStream& in) +{ + bool ok = true; + + for (int id = 0; id < TAR_NUMFIELDS && ok; id++) + ok = in.Read(Get(id), Len(id)).LastRead() == Len(id); + + return ok; +} + +bool wxTarHeaderBlock::Write(wxOutputStream& out) +{ + bool ok = true; + + for (int id = 0; id < TAR_NUMFIELDS && ok; id++) + ok = WriteField(out, id); + + return ok; +} + +inline bool wxTarHeaderBlock::WriteField(wxOutputStream& out, int id) +{ + return out.Write(Get(id), Len(id)).LastWrite() == Len(id); +} + +wxTarNumber wxTarHeaderBlock::GetOctal(int id) +{ + wxTarNumber n = 0; + const char *p = Get(id); + while (*p == ' ') + p++; + while (*p >= '0' && *p < '8') + n = (n << 3) | (*p++ - '0'); + return n; +} + +bool wxTarHeaderBlock::SetOctal(int id, wxTarNumber n) +{ + // set an octal field, return true if the number fits + char *field = Get(id); + char *p = field + Len(id); + *--p = 0; + while (p > field) { + *--p = char('0' + (n & 7)); + n >>= 3; + } + return n == 0; +} + +bool wxTarHeaderBlock::SetPath(const wxString& name, wxMBConv& conv) +{ + bool badconv = false; + +#if wxUSE_UNICODE + wxCharBuffer nameBuf = name.mb_str(conv); + + // if the conversion fails make an approximation + if (!nameBuf) { + badconv = true; + size_t len = name.length(); + wxCharBuffer approx(len); + for (size_t i = 0; i < len; i++) + approx.data()[i] = name[i] & ~0x7F ? '_' : name[i]; + nameBuf = approx; + } + + const char *mbName = nameBuf; +#else + const char *mbName = name.c_str(); + (void)conv; +#endif + + bool fits; + bool notGoingToFit = false; + size_t len = strlen(mbName); + size_t maxname = Len(TAR_NAME); + size_t maxprefix = Len(TAR_PREFIX); + size_t i = 0; + size_t nexti = 0; + + for (;;) { + fits = i < maxprefix && len - i <= maxname; + + if (!fits) { + const char *p = strchr(mbName + i, '/'); + if (p) + nexti = p - mbName + 1; + if (!p || nexti - 1 > maxprefix) + notGoingToFit = true; + } + + if (fits || notGoingToFit) { + strncpy(Get(TAR_NAME), mbName + i, maxname); + if (i > 0) + strncpy(Get(TAR_PREFIX), mbName, i - 1); + break; + } + + i = nexti; + } + + return fits && !badconv; +} + + +///////////////////////////////////////////////////////////////////////////// +// Some helpers + +static wxFileOffset RoundUpSize(wxFileOffset size, int factor = 1) +{ + wxFileOffset chunk = TAR_BLOCKSIZE * factor; + return ((size + chunk - 1) / chunk) * chunk; +} + +#ifdef __UNIX__ + +static wxString wxTarUserName(int uid) +{ + struct passwd *ppw; + +#ifdef HAVE_GETPWUID_R +#if defined HAVE_SYSCONF && defined _SC_GETPW_R_SIZE_MAX + long pwsize = sysconf(_SC_GETPW_R_SIZE_MAX); + size_t bufsize(wxMin(wxMax(1024l, pwsize), 32768l)); +#else + size_t bufsize = 1024; +#endif + wxCharBuffer buf(bufsize); + struct passwd pw; + + if (getpwuid_r(uid, &pw, buf.data(), bufsize, &ppw) == 0) + return wxString(pw.pw_name, wxConvLibc); +#else + if ((ppw = getpwuid(uid)) != NULL) + return wxString(ppw->pw_name, wxConvLibc); +#endif + return _("unknown"); +} + +static wxString wxTarGroupName(int gid) +{ + struct group *pgr; +#ifdef HAVE_GETGRGID_R +#if defined HAVE_SYSCONF && defined _SC_GETGR_R_SIZE_MAX + long grsize = sysconf(_SC_GETGR_R_SIZE_MAX); + size_t bufsize(wxMin(wxMax(1024l, grsize), 32768l)); +#else + size_t bufsize = 1024; +#endif + wxCharBuffer buf(bufsize); + struct group gr; + + if (getgrgid_r(gid, &gr, buf.data(), bufsize, &pgr) == 0) + return wxString(gr.gr_name, wxConvLibc); +#else + if ((pgr = getgrgid(gid)) != NULL) + return wxString(pgr->gr_name, wxConvLibc); +#endif + return _("unknown"); +} + +#endif // __UNIX__ + +// Cache the user and group names since getting them can be expensive, +// get both names and ids at the same time. +// +struct wxTarUser +{ + wxTarUser(); + ~wxTarUser() { delete [] uname; delete [] gname; } + + int uid; + int gid; + + wxChar *uname; + wxChar *gname; +}; + +wxTarUser::wxTarUser() +{ +#ifdef __UNIX__ + uid = getuid(); + gid = getgid(); + wxString usr = wxTarUserName(uid); + wxString grp = wxTarGroupName(gid); +#else + uid = 0; + gid = 0; + wxString usr = wxGetUserId(); + wxString grp = _("unknown"); +#endif + + uname = new wxChar[usr.length() + 1]; + wxStrcpy(uname, usr.c_str()); + + gname = new wxChar[grp.length() + 1]; + wxStrcpy(gname, grp.c_str()); +} + +static const wxTarUser& wxGetTarUser() +{ +#if wxUSE_THREADS + static wxCriticalSection cs; + wxCriticalSectionLocker lock(cs); +#endif + static wxTarUser tu; + return tu; +} + +// ignore the size field for entry types 3, 4, 5 and 6 +// +static inline wxFileOffset GetDataSize(const wxTarEntry& entry) +{ + switch (entry.GetTypeFlag()) { + case wxTAR_CHRTYPE: + case wxTAR_BLKTYPE: + case wxTAR_DIRTYPE: + case wxTAR_FIFOTYPE: + return 0; + default: + return entry.GetSize(); + } +} + + +///////////////////////////////////////////////////////////////////////////// +// Tar Entry +// Holds all the meta-data for a file in the tar + +wxTarEntry::wxTarEntry(const wxString& name /*=wxEmptyString*/, + const wxDateTime& dt /*=wxDateTime::Now()*/, + wxFileOffset size /*=0*/) + : m_Mode(0644), + m_IsModeSet(false), + m_UserId(wxGetTarUser().uid), + m_GroupId(wxGetTarUser().gid), + m_Size(size), + m_Offset(wxInvalidOffset), + m_ModifyTime(dt), + m_TypeFlag(wxTAR_REGTYPE), + m_UserName(wxGetTarUser().uname), + m_GroupName(wxGetTarUser().gname), + m_DevMajor(~0), + m_DevMinor(~0) +{ + if (!name.empty()) + SetName(name); +} + +wxTarEntry::~wxTarEntry() +{ +} + +wxTarEntry::wxTarEntry(const wxTarEntry& e) + : wxArchiveEntry(), + m_Name(e.m_Name), + m_Mode(e.m_Mode), + m_IsModeSet(e.m_IsModeSet), + m_UserId(e.m_UserId), + m_GroupId(e.m_GroupId), + m_Size(e.m_Size), + m_Offset(e.m_Offset), + m_ModifyTime(e.m_ModifyTime), + m_AccessTime(e.m_AccessTime), + m_CreateTime(e.m_CreateTime), + m_TypeFlag(e.m_TypeFlag), + m_LinkName(e.m_LinkName), + m_UserName(e.m_UserName), + m_GroupName(e.m_GroupName), + m_DevMajor(e.m_DevMajor), + m_DevMinor(e.m_DevMinor) +{ +} + +wxTarEntry& wxTarEntry::operator=(const wxTarEntry& e) +{ + if (&e != this) { + m_Name = e.m_Name; + m_Mode = e.m_Mode; + m_IsModeSet = e.m_IsModeSet; + m_UserId = e.m_UserId; + m_GroupId = e.m_GroupId; + m_Size = e.m_Size; + m_Offset = e.m_Offset; + m_ModifyTime = e.m_ModifyTime; + m_AccessTime = e.m_AccessTime; + m_CreateTime = e.m_CreateTime; + m_TypeFlag = e.m_TypeFlag; + m_LinkName = e.m_LinkName; + m_UserName = e.m_UserName; + m_GroupName = e.m_GroupName; + m_DevMajor = e.m_DevMajor; + m_DevMinor = e.m_DevMinor; + } + return *this; +} + +wxString wxTarEntry::GetName(wxPathFormat format /*=wxPATH_NATIVE*/) const +{ + bool isDir = IsDir() && !m_Name.empty(); + + // optimisations for common (and easy) cases + switch (wxFileName::GetFormat(format)) { + case wxPATH_DOS: + { + wxString name(isDir ? m_Name + _T("\\") : m_Name); + for (size_t i = 0; i < name.length(); i++) + if (name[i] == _T('/')) + name[i] = _T('\\'); + return name; + } + + case wxPATH_UNIX: + return isDir ? m_Name + _T("/") : m_Name; + + default: + ; + } + + wxFileName fn; + + if (isDir) + fn.AssignDir(m_Name, wxPATH_UNIX); + else + fn.Assign(m_Name, wxPATH_UNIX); + + return fn.GetFullPath(format); +} + +void wxTarEntry::SetName(const wxString& name, wxPathFormat format) +{ + bool isDir; + m_Name = GetInternalName(name, format, &isDir); + SetIsDir(isDir); +} + +// Static - Internally tars and zips use forward slashes for the path +// separator, absolute paths aren't allowed, and directory names have a +// trailing slash. This function converts a path into this internal format, +// but without a trailing slash for a directory. +// +wxString wxTarEntry::GetInternalName(const wxString& name, + wxPathFormat format /*=wxPATH_NATIVE*/, + bool *pIsDir /*=NULL*/) +{ + wxString internal; + + if (wxFileName::GetFormat(format) != wxPATH_UNIX) + internal = wxFileName(name, format).GetFullPath(wxPATH_UNIX); + else + internal = name; + + bool isDir = !internal.empty() && internal.Last() == '/'; + if (pIsDir) + *pIsDir = isDir; + if (isDir) + internal.erase(internal.length() - 1); + + while (!internal.empty() && *internal.begin() == '/') + internal.erase(0, 1); + while (!internal.empty() && internal.compare(0, 2, _T("./")) == 0) + internal.erase(0, 2); + if (internal == _T(".") || internal == _T("..")) + internal = wxEmptyString; + + return internal; +} + +bool wxTarEntry::IsDir() const +{ + return m_TypeFlag == wxTAR_DIRTYPE; +} + +void wxTarEntry::SetIsDir(bool isDir) +{ + if (isDir) + m_TypeFlag = wxTAR_DIRTYPE; + else if (m_TypeFlag == wxTAR_DIRTYPE) + m_TypeFlag = wxTAR_REGTYPE; +} + +void wxTarEntry::SetIsReadOnly(bool isReadOnly) +{ + if (isReadOnly) + m_Mode &= ~0222; + else + m_Mode |= 0200; +} + +int wxTarEntry::GetMode() const +{ + if (m_IsModeSet || !IsDir()) + return m_Mode; + else + return m_Mode | 0111; + +} + +void wxTarEntry::SetMode(int mode) +{ + m_Mode = mode & 07777; + m_IsModeSet = true; +} + + +///////////////////////////////////////////////////////////////////////////// +// Input stream + +wxDECLARE_SCOPED_PTR(wxTarEntry, wxTarEntryPtr_) +wxDEFINE_SCOPED_PTR (wxTarEntry, wxTarEntryPtr_) + +wxTarInputStream::wxTarInputStream(wxInputStream& stream, + wxMBConv& conv /*=wxConvLocal*/) + : wxArchiveInputStream(stream, conv) +{ + Init(); +} + +wxTarInputStream::wxTarInputStream(wxInputStream *stream, + wxMBConv& conv /*=wxConvLocal*/) + : wxArchiveInputStream(stream, conv) +{ + Init(); +} + +void wxTarInputStream::Init() +{ + m_pos = wxInvalidOffset; + m_offset = 0; + m_size = wxInvalidOffset; + m_sumType = SUM_UNKNOWN; + m_tarType = TYPE_USTAR; + m_hdr = new wxTarHeaderBlock; + m_HeaderRecs = NULL; + m_GlobalHeaderRecs = NULL; + m_lasterror = m_parent_i_stream->GetLastError(); +} + +wxTarInputStream::~wxTarInputStream() +{ + delete m_hdr; + delete m_HeaderRecs; + delete m_GlobalHeaderRecs; +} + +wxTarEntry *wxTarInputStream::GetNextEntry() +{ + m_lasterror = ReadHeaders(); + + if (!IsOk()) + return NULL; + + wxTarEntryPtr_ entry(new wxTarEntry); + + entry->SetMode(GetHeaderNumber(TAR_MODE)); + entry->SetUserId(GetHeaderNumber(TAR_UID)); + entry->SetGroupId(GetHeaderNumber(TAR_UID)); + entry->SetSize(GetHeaderNumber(TAR_SIZE)); + + entry->SetOffset(m_offset); + + entry->SetDateTime(GetHeaderDate(_T("mtime"))); + entry->SetAccessTime(GetHeaderDate(_T("atime"))); + entry->SetCreateTime(GetHeaderDate(_T("ctime"))); + + entry->SetTypeFlag(*m_hdr->Get(TAR_TYPEFLAG)); + bool isDir = entry->IsDir(); + + entry->SetLinkName(GetHeaderString(TAR_LINKNAME)); + + if (m_tarType != TYPE_OLDTAR) { + entry->SetUserName(GetHeaderString(TAR_UNAME)); + entry->SetGroupName(GetHeaderString(TAR_GNAME)); + + entry->SetDevMajor(GetHeaderNumber(TAR_DEVMAJOR)); + entry->SetDevMinor(GetHeaderNumber(TAR_DEVMINOR)); + } + + entry->SetName(GetHeaderPath(), wxPATH_UNIX); + if (isDir) + entry->SetIsDir(); + + if (m_HeaderRecs) + m_HeaderRecs->clear(); + + m_size = GetDataSize(*entry); + m_pos = 0; + + return entry.release(); +} + +bool wxTarInputStream::OpenEntry(wxTarEntry& entry) +{ + wxFileOffset offset = entry.GetOffset(); + + if (GetLastError() != wxSTREAM_READ_ERROR + && m_parent_i_stream->IsSeekable() + && m_parent_i_stream->SeekI(offset) == offset) + { + m_offset = offset; + m_size = GetDataSize(entry); + m_pos = 0; + m_lasterror = wxSTREAM_NO_ERROR; + return true; + } else { + m_lasterror = wxSTREAM_READ_ERROR; + return false; + } +} + +bool wxTarInputStream::OpenEntry(wxArchiveEntry& entry) +{ + wxTarEntry *tarEntry = wxStaticCast(&entry, wxTarEntry); + return tarEntry ? OpenEntry(*tarEntry) : false; +} + +bool wxTarInputStream::CloseEntry() +{ + if (m_lasterror == wxSTREAM_READ_ERROR) + return false; + if (!IsOpened()) + return true; + + wxFileOffset size = RoundUpSize(m_size); + wxFileOffset remainder = size - m_pos; + + if (remainder && m_parent_i_stream->IsSeekable()) { + wxLogNull nolog; + if (m_parent_i_stream->SeekI(remainder, wxFromCurrent) + != wxInvalidOffset) + remainder = 0; + } + + if (remainder) { + const int BUFSIZE = 8192; + wxCharBuffer buf(BUFSIZE); + + while (remainder > 0 && m_parent_i_stream->IsOk()) + remainder -= m_parent_i_stream->Read( + buf.data(), wxMin(BUFSIZE, remainder)).LastRead(); + } + + m_pos = wxInvalidOffset; + m_offset += size; + m_lasterror = m_parent_i_stream->GetLastError(); + + return IsOk(); +} + +wxStreamError wxTarInputStream::ReadHeaders() +{ + if (!CloseEntry()) + return wxSTREAM_READ_ERROR; + + bool done = false; + + while (!done) { + m_hdr->Read(*m_parent_i_stream); + if (m_parent_i_stream->Eof()) + wxLogError(_("incomplete header block in tar")); + if (!*m_parent_i_stream) + return wxSTREAM_READ_ERROR; + m_offset += TAR_BLOCKSIZE; + + // an all-zero header marks the end of the tar + if (m_hdr->IsAllZeros()) + return wxSTREAM_EOF; + + // the checksum is supposed to be the unsigned sum of the header bytes, + // but there have been versions of tar that used the signed sum, so + // accept that too, but only if used throughout. + wxUint32 chksum = m_hdr->GetOctal(TAR_CHKSUM); + bool ok = false; + + if (m_sumType != SUM_SIGNED) { + ok = chksum == m_hdr->Sum(); + if (m_sumType == SUM_UNKNOWN) + m_sumType = ok ? SUM_UNSIGNED : SUM_SIGNED; + } + if (m_sumType == SUM_SIGNED) + ok = chksum == m_hdr->Sum(true); + if (!ok) { + wxLogError(_("checksum failure reading tar header block")); + return wxSTREAM_READ_ERROR; + } + + if (strcmp(m_hdr->Get(TAR_MAGIC), USTAR_MAGIC) == 0) + m_tarType = TYPE_USTAR; + else if (strcmp(m_hdr->Get(TAR_MAGIC), GNU_MAGIC) == 0 && + strcmp(m_hdr->Get(TAR_VERSION), GNU_VERION) == 0) + m_tarType = TYPE_GNUTAR; + else + m_tarType = TYPE_OLDTAR; + + if (m_tarType != TYPE_USTAR) + break; + + switch (*m_hdr->Get(TAR_TYPEFLAG)) { + case 'g': ReadExtendedHeader(m_GlobalHeaderRecs); break; + case 'x': ReadExtendedHeader(m_HeaderRecs); break; + default: done = true; + } + } + + return wxSTREAM_NO_ERROR; +} + +wxString wxTarInputStream::GetExtendedHeader(const wxString& key) const +{ + wxTarHeaderRecords::iterator it; + + // look at normal extended header records first + if (m_HeaderRecs) { + it = m_HeaderRecs->find(key); + if (it != m_HeaderRecs->end()) + return wxString(it->second.wc_str(wxConvUTF8), GetConv()); + } + + // if not found, look at the global header records + if (m_GlobalHeaderRecs) { + it = m_GlobalHeaderRecs->find(key); + if (it != m_GlobalHeaderRecs->end()) + return wxString(it->second.wc_str(wxConvUTF8), GetConv()); + } + + return wxEmptyString; +} + +wxString wxTarInputStream::GetHeaderPath() const +{ + wxString path; + + if ((path = GetExtendedHeader(_T("path"))) != wxEmptyString) + return path; + + path = wxString(m_hdr->Get(TAR_NAME), GetConv()); + if (m_tarType != TYPE_USTAR) + return path; + + const char *prefix = m_hdr->Get(TAR_PREFIX); + return *prefix ? wxString(prefix, GetConv()) + _T("/") + path : path; +} + +wxDateTime wxTarInputStream::GetHeaderDate(const wxString& key) const +{ + wxString value; + + // try extended header, stored as decimal seconds since the epoch + if ((value = GetExtendedHeader(key)) != wxEmptyString) { + wxLongLong ll; + ll.Assign(wxAtof(value) * 1000.0); + return ll; + } + + if (key == _T("mtime")) + return wxLongLong(m_hdr->GetOctal(TAR_MTIME)) * 1000L; + + return wxDateTime(); +} + +wxTarNumber wxTarInputStream::GetHeaderNumber(int id) const +{ + wxString value; + + if ((value = GetExtendedHeader(m_hdr->Name(id))) != wxEmptyString) { + wxTarNumber n = 0; + const wxChar *p = value; + while (*p == ' ') + p++; + while (isdigit(*p)) + n = n * 10 + (*p++ - '0'); + return n; + } else { + return m_hdr->GetOctal(id); + } +} + +wxString wxTarInputStream::GetHeaderString(int id) const +{ + wxString value; + + if ((value = GetExtendedHeader(m_hdr->Name(id))) != wxEmptyString) + return value; + + return wxString(m_hdr->Get(id), GetConv()); +} + +// An extended header consists of one or more records, each constructed: +// "%d %s=%s\n", , , +// is the byte length, and are UTF-8 + +bool wxTarInputStream::ReadExtendedHeader(wxTarHeaderRecords*& recs) +{ + if (!recs) + recs = new wxTarHeaderRecords; + + // round length up to a whole number of blocks + size_t len = m_hdr->GetOctal(TAR_SIZE); + size_t size = RoundUpSize(len); + + // read in the whole header since it should be small + wxCharBuffer buf(size); + size_t lastread = m_parent_i_stream->Read(buf.data(), size).LastRead(); + if (lastread < len) + len = lastread; + buf.data()[len] = 0; + m_offset += lastread; + + size_t recPos, recSize; + bool ok = true; + + for (recPos = 0; recPos < len; recPos += recSize) { + char *pRec = buf.data() + recPos; + char *p = pRec; + + // read the record size (byte count in ascii decimal) + recSize = 0; + while (isdigit(*p)) + recSize = recSize * 10 + *p++ - '0'; + + // validity checks + if (recPos + recSize > len) + break; + if (recSize < p - pRec + (size_t)3 || *p != ' ' + || pRec[recSize - 1] != '\012') { + ok = false; + continue; + } + + // replace the final '\n' with a nul, to terminate value + pRec[recSize - 1] = 0; + // the key is here, following the space + char *pKey = ++p; + + // look forward for the '=', the value follows + while (*p && *p != '=') + p++; + if (!*p) { + ok = false; + continue; + } + // replace the '=' with a nul, to terminate the key + *p++ = 0; + + wxString key(wxConvUTF8.cMB2WC(pKey), GetConv()); + wxString value(wxConvUTF8.cMB2WC(p), GetConv()); + + // an empty value unsets a previously given value + if (value.empty()) + recs->erase(key); + else + (*recs)[key] = value; + } + + if (!ok || recPos < len || size != lastread) { + wxLogWarning(_("invalid data in extended tar header")); + return false; + } + + return true; +} + +wxFileOffset wxTarInputStream::OnSysSeek(wxFileOffset pos, wxSeekMode mode) +{ + if (!IsOpened()) { + wxLogError(_("tar entry not open")); + m_lasterror = wxSTREAM_READ_ERROR; + } + if (!IsOk()) + return wxInvalidOffset; + + switch (mode) { + case wxFromStart: break; + case wxFromCurrent: pos += m_pos; break; + case wxFromEnd: pos += m_size; break; + } + + if (pos < 0 || m_parent_i_stream->SeekI(m_offset + pos) == wxInvalidOffset) + return wxInvalidOffset; + + m_pos = pos; + return m_pos; +} + +size_t wxTarInputStream::OnSysRead(void *buffer, size_t size) +{ + if (!IsOpened()) { + wxLogError(_("tar entry not open")); + m_lasterror = wxSTREAM_READ_ERROR; + } + if (!IsOk() || !size) + return 0; + + if (m_pos >= m_size) + size = 0; + else if (m_pos + size > m_size + (size_t)0) + size = m_size - m_pos; + + size_t lastread = m_parent_i_stream->Read(buffer, size).LastRead(); + m_pos += lastread; + + if (m_pos >= m_size) { + m_lasterror = wxSTREAM_EOF; + } else if (!m_parent_i_stream->IsOk()) { + // any other error will have been reported by the underlying stream + if (m_parent_i_stream->Eof()) + wxLogError(_("unexpected end of file")); + m_lasterror = wxSTREAM_READ_ERROR; + } + + return lastread; +} + + +///////////////////////////////////////////////////////////////////////////// +// Output stream + +wxTarOutputStream::wxTarOutputStream(wxOutputStream& stream, + wxTarFormat format /*=wxTAR_PAX*/, + wxMBConv& conv /*=wxConvLocal*/) + : wxArchiveOutputStream(stream, conv) +{ + Init(format); +} + +wxTarOutputStream::wxTarOutputStream(wxOutputStream *stream, + wxTarFormat format /*=wxTAR_PAX*/, + wxMBConv& conv /*=wxConvLocal*/) + : wxArchiveOutputStream(stream, conv) +{ + Init(format); +} + +void wxTarOutputStream::Init(wxTarFormat format) +{ + m_pos = wxInvalidOffset; + m_maxpos = wxInvalidOffset; + m_size = wxInvalidOffset; + m_headpos = wxInvalidOffset; + m_datapos = wxInvalidOffset; + m_tarstart = wxInvalidOffset; + m_tarsize = 0; + m_pax = format == wxTAR_PAX; + m_BlockingFactor = m_pax ? 10 : 20; + m_chksum = 0; + m_large = false; + m_hdr = new wxTarHeaderBlock; + m_hdr2 = NULL; + m_extendedHdr = NULL; + m_extendedSize = 0; + m_lasterror = m_parent_o_stream->GetLastError(); +} + +wxTarOutputStream::~wxTarOutputStream() +{ + if (m_tarsize) + Close(); + delete m_hdr; + delete m_hdr2; + delete [] m_extendedHdr; +} + +bool wxTarOutputStream::PutNextEntry(wxTarEntry *entry) +{ + wxTarEntryPtr_ e(entry); + + if (!CloseEntry()) + return false; + + if (!m_tarsize) { + wxLogNull nolog; + m_tarstart = m_parent_o_stream->TellO(); + } + + if (m_tarstart != wxInvalidOffset) + m_headpos = m_tarstart + m_tarsize; + + if (WriteHeaders(*e)) { + m_pos = 0; + m_maxpos = 0; + m_size = GetDataSize(*e); + if (m_tarstart != wxInvalidOffset) + m_datapos = m_tarstart + m_tarsize; + + // types that are not allowd any data + const char nodata[] = { + wxTAR_LNKTYPE, wxTAR_SYMTYPE, wxTAR_CHRTYPE, wxTAR_BLKTYPE, + wxTAR_DIRTYPE, wxTAR_FIFOTYPE, 0 + }; + int typeflag = e->GetTypeFlag(); + + // pax does now allow data for wxTAR_LNKTYPE + if (!m_pax || typeflag != wxTAR_LNKTYPE) + if (strchr(nodata, typeflag) != NULL) + CloseEntry(); + } + + return IsOk(); +} + +bool wxTarOutputStream::PutNextEntry(const wxString& name, + const wxDateTime& dt, + wxFileOffset size) +{ + return PutNextEntry(new wxTarEntry(name, dt, size)); +} + +bool wxTarOutputStream::PutNextDirEntry(const wxString& name, + const wxDateTime& dt) +{ + wxTarEntry *entry = new wxTarEntry(name, dt); + entry->SetIsDir(); + return PutNextEntry(entry); +} + +bool wxTarOutputStream::PutNextEntry(wxArchiveEntry *entry) +{ + wxTarEntry *tarEntry = wxStaticCast(entry, wxTarEntry); + if (!tarEntry) + delete entry; + return PutNextEntry(tarEntry); +} + +bool wxTarOutputStream::CopyEntry(wxTarEntry *entry, + wxTarInputStream& inputStream) +{ + if (PutNextEntry(entry)) + Write(inputStream); + return IsOk() && inputStream.Eof(); +} + +bool wxTarOutputStream::CopyEntry(wxArchiveEntry *entry, + wxArchiveInputStream& inputStream) +{ + if (PutNextEntry(entry)) + Write(inputStream); + return IsOk() && inputStream.Eof(); +} + +bool wxTarOutputStream::CloseEntry() +{ + if (!IsOpened()) + return true; + + if (m_pos < m_maxpos) { + wxASSERT(m_parent_o_stream->IsSeekable()); + m_parent_o_stream->SeekO(m_datapos + m_maxpos); + m_lasterror = m_parent_o_stream->GetLastError(); + m_pos = m_maxpos; + } + + if (IsOk()) { + wxFileOffset size = RoundUpSize(m_pos); + if (size > m_pos) { + memset(m_hdr, 0, size - m_pos); + m_parent_o_stream->Write(m_hdr, size - m_pos); + m_lasterror = m_parent_o_stream->GetLastError(); + } + m_tarsize += size; + } + + if (IsOk() && m_pos != m_size) + ModifyHeader(); + + m_pos = wxInvalidOffset; + m_maxpos = wxInvalidOffset; + m_size = wxInvalidOffset; + m_headpos = wxInvalidOffset; + m_datapos = wxInvalidOffset; + + return IsOk(); +} + +bool wxTarOutputStream::Close() +{ + if (!CloseEntry()) + return false; + + memset(m_hdr, 0, sizeof(*m_hdr)); + int count = (RoundUpSize(m_tarsize + 2 * TAR_BLOCKSIZE, m_BlockingFactor) + - m_tarsize) / TAR_BLOCKSIZE; + while (count--) + m_parent_o_stream->Write(m_hdr, TAR_BLOCKSIZE); + + m_tarsize = 0; + m_tarstart = wxInvalidOffset; + m_lasterror = m_parent_o_stream->GetLastError(); + return IsOk(); +} + +bool wxTarOutputStream::WriteHeaders(wxTarEntry& entry) +{ + memset(m_hdr, 0, sizeof(*m_hdr)); + + SetHeaderPath(entry.GetName(wxPATH_UNIX)); + + SetHeaderNumber(TAR_MODE, entry.GetMode()); + SetHeaderNumber(TAR_UID, entry.GetUserId()); + SetHeaderNumber(TAR_GID, entry.GetGroupId()); + + if (entry.GetSize() == wxInvalidOffset) + entry.SetSize(0); + m_large = !SetHeaderNumber(TAR_SIZE, entry.GetSize()); + + SetHeaderDate(_T("mtime"), entry.GetDateTime()); + if (entry.GetAccessTime().IsValid()) + SetHeaderDate(_T("atime"), entry.GetAccessTime()); + if (entry.GetCreateTime().IsValid()) + SetHeaderDate(_T("ctime"), entry.GetCreateTime()); + + *m_hdr->Get(TAR_TYPEFLAG) = char(entry.GetTypeFlag()); + + strcpy(m_hdr->Get(TAR_MAGIC), USTAR_MAGIC); + strcpy(m_hdr->Get(TAR_VERSION), USTAR_VERSION); + + SetHeaderString(TAR_LINKNAME, entry.GetLinkName()); + SetHeaderString(TAR_UNAME, entry.GetUserName()); + SetHeaderString(TAR_GNAME, entry.GetGroupName()); + + if (~entry.GetDevMajor()) + SetHeaderNumber(TAR_DEVMAJOR, entry.GetDevMajor()); + if (~entry.GetDevMinor()) + SetHeaderNumber(TAR_DEVMINOR, entry.GetDevMinor()); + + m_chksum = m_hdr->Sum(); + m_hdr->SetOctal(TAR_CHKSUM, m_chksum); + if (!m_large) + m_chksum -= m_hdr->SumField(TAR_SIZE); + + // The main header is now fully prepared so we know what extended headers + // (if any) will be needed. Output any extended headers before writing + // the main header. + if (m_extendedHdr && *m_extendedHdr) { + wxASSERT(m_pax); + // the extended headers are written to the tar as a file entry, + // so prepare a regular header block for the pseudo-file. + if (!m_hdr2) + m_hdr2 = new wxTarHeaderBlock; + memset(m_hdr2, 0, sizeof(*m_hdr2)); + + // an old tar that doesn't understand extended headers will + // extract it as a file, so give these fields reasonable values + // so that the user will have access to read and remove it. + m_hdr2->SetPath(PaxHeaderPath(_T("%d/PaxHeaders.%p/%f"), + entry.GetName(wxPATH_UNIX)), GetConv()); + m_hdr2->SetOctal(TAR_MODE, 0600); + strcpy(m_hdr2->Get(TAR_UID), m_hdr->Get(TAR_UID)); + strcpy(m_hdr2->Get(TAR_GID), m_hdr->Get(TAR_GID)); + size_t length = strlen(m_extendedHdr); + m_hdr2->SetOctal(TAR_SIZE, length); + strcpy(m_hdr2->Get(TAR_MTIME), m_hdr->Get(TAR_MTIME)); + *m_hdr2->Get(TAR_TYPEFLAG) = 'x'; + strcpy(m_hdr2->Get(TAR_MAGIC), USTAR_MAGIC); + strcpy(m_hdr2->Get(TAR_VERSION), USTAR_VERSION); + strcpy(m_hdr2->Get(TAR_UNAME), m_hdr->Get(TAR_UNAME)); + strcpy(m_hdr2->Get(TAR_GNAME), m_hdr->Get(TAR_GNAME)); + + m_hdr2->SetOctal(TAR_CHKSUM, m_hdr2->Sum()); + + m_hdr2->Write(*m_parent_o_stream); + m_tarsize += TAR_BLOCKSIZE; + + size_t rounded = RoundUpSize(length); + memset(m_extendedHdr + length, 0, rounded - length); + m_parent_o_stream->Write(m_extendedHdr, rounded); + m_tarsize += rounded; + + *m_extendedHdr = 0; + } + + // if don't have extended headers just report error + if (!m_badfit.empty()) { + wxASSERT(!m_pax); + wxLogWarning(_("%s did not fit the tar header for entry '%s'"), + m_badfit.c_str(), entry.GetName().c_str()); + m_badfit.clear(); + } + + m_hdr->Write(*m_parent_o_stream); + m_tarsize += TAR_BLOCKSIZE; + m_lasterror = m_parent_o_stream->GetLastError(); + + return IsOk(); +} + +wxString wxTarOutputStream::PaxHeaderPath(const wxString& format, + const wxString& path) +{ + wxString d = path.BeforeLast(_T('/')); + wxString f = path.AfterLast(_T('/')); + wxString ret; + + if (d.empty()) + d = _T("."); + + ret.reserve(format.length() + path.length() + 16); + + size_t begin = 0; + size_t end; + + for (;;) { + end = format.find('%', begin); + if (end == wxString::npos || end + 1 >= format.length()) + break; + ret << format.substr(begin, end - begin); + switch (format[end + 1]) { + case 'd': ret << d; break; + case 'f': ret << f; break; + case 'p': ret << wxGetProcessId(); break; + case '%': ret << _T("%"); break; + } + begin = end + 2; + } + + ret << format.substr(begin); + + return ret; +} + +bool wxTarOutputStream::ModifyHeader() +{ + wxFileOffset originalPos = wxInvalidOffset; + wxFileOffset sizePos = wxInvalidOffset; + + if (!m_large && m_headpos != wxInvalidOffset + && m_parent_o_stream->IsSeekable()) + { + wxLogNull nolog; + originalPos = m_parent_o_stream->TellO(); + if (originalPos != wxInvalidOffset) + sizePos = + m_parent_o_stream->SeekO(m_headpos + m_hdr->Offset(TAR_SIZE)); + } + + if (sizePos == wxInvalidOffset || !m_hdr->SetOctal(TAR_SIZE, m_pos)) { + wxLogError(_("incorrect size given for tar entry")); + m_lasterror = wxSTREAM_WRITE_ERROR; + return false; + } + + m_chksum += m_hdr->SumField(TAR_SIZE); + m_hdr->SetOctal(TAR_CHKSUM, m_chksum); + wxFileOffset sumPos = m_headpos + m_hdr->Offset(TAR_CHKSUM); + + return + m_hdr->WriteField(*m_parent_o_stream, TAR_SIZE) && + m_parent_o_stream->SeekO(sumPos) == sumPos && + m_hdr->WriteField(*m_parent_o_stream, TAR_CHKSUM) && + m_parent_o_stream->SeekO(originalPos) == originalPos; +} + +void wxTarOutputStream::SetHeaderPath(const wxString& name) +{ + if (!m_hdr->SetPath(name, GetConv()) || (m_pax && !name.IsAscii())) + SetExtendedHeader(_T("path"), name); +} + +bool wxTarOutputStream::SetHeaderNumber(int id, wxTarNumber n) +{ + if (m_hdr->SetOctal(id, n)) { + return true; + } else { + SetExtendedHeader(m_hdr->Name(id), wxLongLong(n).ToString()); + return false; + } +} + +void wxTarOutputStream::SetHeaderString(int id, const wxString& str) +{ + strncpy(m_hdr->Get(id), str.mb_str(GetConv()), m_hdr->Len(id)); + if (str.length() > m_hdr->Len(id)) + SetExtendedHeader(m_hdr->Name(id), str); +} + +void wxTarOutputStream::SetHeaderDate(const wxString& key, + const wxDateTime& datetime) +{ + wxLongLong ll = datetime.IsValid() ? datetime.GetValue() : wxLongLong(0); + wxLongLong secs = ll / 1000L; + + if (key != _T("mtime") + || !m_hdr->SetOctal(TAR_MTIME, wxTarNumber(secs.GetValue())) + || secs <= 0 || secs >= 0x7fffffff) + { + wxString str; + if (ll >= LONG_MIN && ll <= LONG_MAX) { + str.Printf(_T("%g"), ll.ToLong() / 1000.0); + } else { + str = ll.ToString(); + str.insert(str.end() - 3, '.'); + } + SetExtendedHeader(key, str); + } +} + +void wxTarOutputStream::SetExtendedHeader(const wxString& key, + const wxString& value) +{ + if (m_pax) { + const wxWX2WCbuf wide_key = key.wc_str(GetConv()); + const wxCharBuffer utf_key = wxConvUTF8.cWC2MB(wide_key); + + const wxWX2WCbuf wide_value = value.wc_str(GetConv()); + const wxCharBuffer utf_value = wxConvUTF8.cWC2MB(wide_value); + + // a small buffer to format the length field in + char buf[32]; + // length of "99=\n" + unsigned long length = strlen(utf_value) + strlen(utf_key) + 5; + sprintf(buf, "%lu", length); + // the length includes itself + size_t lenlen = strlen(buf); + if (lenlen != 2) { + length += lenlen - 2; + sprintf(buf, "%lu", length); + if (strlen(buf) > lenlen) + sprintf(buf, "%lu", ++length); + } + + // reallocate m_extendedHdr if it's not big enough + if (m_extendedSize < length) { + size_t rounded = RoundUpSize(length); + m_extendedSize <<= 1; + if (rounded > m_extendedSize) + m_extendedSize = rounded; + char *oldHdr = m_extendedHdr; + m_extendedHdr = new char[m_extendedSize]; + if (oldHdr) { + strcpy(m_extendedHdr, oldHdr); + delete oldHdr; + } else { + *m_extendedHdr = 0; + } + } + + // append the new record + char *append = strchr(m_extendedHdr, 0); + sprintf(append, "%s %s=%s\012", buf, + (const char*)utf_key, (const char*)utf_value); + } + else { + // if not pax then make a list of fields to report as errors + if (!m_badfit.empty()) + m_badfit += _T(", "); + m_badfit += key; + } +} + +void wxTarOutputStream::Sync() +{ + m_parent_o_stream->Sync(); +} + +wxFileOffset wxTarOutputStream::OnSysSeek(wxFileOffset pos, wxSeekMode mode) +{ + if (!IsOpened()) { + wxLogError(_("tar entry not open")); + m_lasterror = wxSTREAM_WRITE_ERROR; + } + if (!IsOk() || m_datapos == wxInvalidOffset) + return wxInvalidOffset; + + switch (mode) { + case wxFromStart: break; + case wxFromCurrent: pos += m_pos; break; + case wxFromEnd: pos += m_maxpos; break; + } + + if (pos < 0 || m_parent_o_stream->SeekO(m_datapos + pos) == wxInvalidOffset) + return wxInvalidOffset; + + m_pos = pos; + return m_pos; +} + +size_t wxTarOutputStream::OnSysWrite(const void *buffer, size_t size) +{ + if (!IsOpened()) { + wxLogError(_("tar entry not open")); + m_lasterror = wxSTREAM_WRITE_ERROR; + } + if (!IsOk() || !size) + return 0; + + size_t lastwrite = m_parent_o_stream->Write(buffer, size).LastWrite(); + m_pos += lastwrite; + if (m_pos > m_maxpos) + m_maxpos = m_pos; + + if (lastwrite != size) + m_lasterror = wxSTREAM_WRITE_ERROR; + + return lastwrite; +} + +#endif // wxUSE_TARSTREAM diff --git a/Externals/wxWidgets/src/common/taskbarcmn.cpp b/Externals/wxWidgets/src/common/taskbarcmn.cpp new file mode 100644 index 0000000000..ef923d4d5d --- /dev/null +++ b/Externals/wxWidgets/src/common/taskbarcmn.cpp @@ -0,0 +1,54 @@ +///////////////////////////////////////////////////////////////////////// +// File: src/common/taskbarcmn.cpp +// Purpose: Common parts of wxTaskBarIcon class +// Author: Julian Smart +// Modified by: +// Created: 04/04/2003 +// RCS-ID: $Id: taskbarcmn.cpp 44138 2007-01-07 19:44:14Z VZ $ +// Copyright: (c) Julian Smart, 2003 +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#ifdef wxHAS_TASK_BAR_ICON + +#ifndef WX_PRECOMP + #include "wx/app.h" + #include "wx/menu.h" +#endif + +// DLL options compatibility check: +WX_CHECK_BUILD_OPTIONS("wxAdvanced") + +#include "wx/taskbar.h" + +DEFINE_EVENT_TYPE( wxEVT_TASKBAR_MOVE ) +DEFINE_EVENT_TYPE( wxEVT_TASKBAR_LEFT_DOWN ) +DEFINE_EVENT_TYPE( wxEVT_TASKBAR_LEFT_UP ) +DEFINE_EVENT_TYPE( wxEVT_TASKBAR_RIGHT_DOWN ) +DEFINE_EVENT_TYPE( wxEVT_TASKBAR_RIGHT_UP ) +DEFINE_EVENT_TYPE( wxEVT_TASKBAR_LEFT_DCLICK ) +DEFINE_EVENT_TYPE( wxEVT_TASKBAR_RIGHT_DCLICK ) + + +BEGIN_EVENT_TABLE(wxTaskBarIconBase, wxEvtHandler) + EVT_TASKBAR_CLICK(wxTaskBarIconBase::OnRightButtonDown) +END_EVENT_TABLE() + +void wxTaskBarIconBase::OnRightButtonDown(wxTaskBarIconEvent& WXUNUSED(event)) +{ + wxMenu *menu = CreatePopupMenu(); + if (menu) + { + PopupMenu(menu); + delete menu; + } +} + +#endif // defined(wxHAS_TASK_BAR_ICON) diff --git a/Externals/wxWidgets/src/common/tbarbase.cpp b/Externals/wxWidgets/src/common/tbarbase.cpp new file mode 100644 index 0000000000..2b1459c6bc --- /dev/null +++ b/Externals/wxWidgets/src/common/tbarbase.cpp @@ -0,0 +1,746 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/tbarbase.cpp +// Purpose: wxToolBarBase implementation +// Author: Julian Smart +// Modified by: VZ at 11.12.99 (wxScrollableToolBar split off) +// Created: 04/01/98 +// RCS-ID: $Id: tbarbase.cpp 42840 2006-10-31 13:09:08Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_TOOLBAR + +#include "wx/toolbar.h" + +#ifndef WX_PRECOMP + #include "wx/control.h" + #include "wx/frame.h" + #include "wx/settings.h" + #include "wx/image.h" +#endif + +// ---------------------------------------------------------------------------- +// wxWidgets macros +// ---------------------------------------------------------------------------- + +BEGIN_EVENT_TABLE(wxToolBarBase, wxControl) +END_EVENT_TABLE() + +#include "wx/listimpl.cpp" + +WX_DEFINE_LIST(wxToolBarToolsList) + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxToolBarToolBase +// ---------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxToolBarToolBase, wxObject) + +bool wxToolBarToolBase::Enable(bool enable) +{ + if ( m_enabled == enable ) + return false; + + m_enabled = enable; + + return true; +} + +bool wxToolBarToolBase::Toggle(bool toggle) +{ + wxASSERT_MSG( CanBeToggled(), _T("can't toggle this tool") ); + + if ( m_toggled == toggle ) + return false; + + m_toggled = toggle; + + return true; +} + +bool wxToolBarToolBase::SetToggle(bool toggle) +{ + wxItemKind kind = toggle ? wxITEM_CHECK : wxITEM_NORMAL; + if ( m_kind == kind ) + return false; + + m_kind = kind; + + return true; +} + +bool wxToolBarToolBase::SetShortHelp(const wxString& help) +{ + if ( m_shortHelpString == help ) + return false; + + m_shortHelpString = help; + + return true; +} + +bool wxToolBarToolBase::SetLongHelp(const wxString& help) +{ + if ( m_longHelpString == help ) + return false; + + m_longHelpString = help; + + return true; +} + +// ---------------------------------------------------------------------------- +// wxToolBarBase adding/deleting items +// ---------------------------------------------------------------------------- + +wxToolBarBase::wxToolBarBase() +{ + // the list owns the pointers + m_xMargin = m_yMargin = 0; + m_maxRows = m_maxCols = 0; + m_toolPacking = m_toolSeparation = 0; + m_defaultWidth = 16; + m_defaultHeight = 15; +} + +void wxToolBarBase::FixupStyle() +{ + if ( !HasFlag(wxTB_TOP | wxTB_LEFT | wxTB_RIGHT | wxTB_BOTTOM) ) + { + // this is the default + m_windowStyle |= wxTB_TOP; + } +} + +wxToolBarToolBase *wxToolBarBase::DoAddTool(int id, + const wxString& label, + const wxBitmap& bitmap, + const wxBitmap& bmpDisabled, + wxItemKind kind, + const wxString& shortHelp, + const wxString& longHelp, + wxObject *clientData, + wxCoord WXUNUSED(xPos), + wxCoord WXUNUSED(yPos)) +{ + InvalidateBestSize(); + return InsertTool(GetToolsCount(), id, label, bitmap, bmpDisabled, + kind, shortHelp, longHelp, clientData); +} + +wxToolBarToolBase *wxToolBarBase::InsertTool(size_t pos, + int id, + const wxString& label, + const wxBitmap& bitmap, + const wxBitmap& bmpDisabled, + wxItemKind kind, + const wxString& shortHelp, + const wxString& longHelp, + wxObject *clientData) +{ + wxCHECK_MSG( pos <= GetToolsCount(), (wxToolBarToolBase *)NULL, + _T("invalid position in wxToolBar::InsertTool()") ); + + wxToolBarToolBase *tool = CreateTool(id, label, bitmap, bmpDisabled, kind, + clientData, shortHelp, longHelp); + + if ( !InsertTool(pos, tool) ) + { + delete tool; + + return NULL; + } + + return tool; +} + +wxToolBarToolBase *wxToolBarBase::AddTool(wxToolBarToolBase *tool) +{ + return InsertTool(GetToolsCount(), tool); +} + +wxToolBarToolBase * +wxToolBarBase::InsertTool(size_t pos, wxToolBarToolBase *tool) +{ + wxCHECK_MSG( pos <= GetToolsCount(), (wxToolBarToolBase *)NULL, + _T("invalid position in wxToolBar::InsertTool()") ); + + if ( !tool || !DoInsertTool(pos, tool) ) + { + return NULL; + } + + m_tools.Insert(pos, tool); + + return tool; +} + +wxToolBarToolBase *wxToolBarBase::AddControl(wxControl *control) +{ + return InsertControl(GetToolsCount(), control); +} + +wxToolBarToolBase *wxToolBarBase::InsertControl(size_t pos, wxControl *control) +{ + wxCHECK_MSG( control, (wxToolBarToolBase *)NULL, + _T("toolbar: can't insert NULL control") ); + + wxCHECK_MSG( control->GetParent() == this, (wxToolBarToolBase *)NULL, + _T("control must have toolbar as parent") ); + + wxCHECK_MSG( pos <= GetToolsCount(), (wxToolBarToolBase *)NULL, + _T("invalid position in wxToolBar::InsertControl()") ); + + wxToolBarToolBase *tool = CreateTool(control); + + if ( !InsertTool(pos, tool) ) + { + delete tool; + + return NULL; + } + + return tool; +} + +wxControl *wxToolBarBase::FindControl( int id ) +{ + for ( wxToolBarToolsList::compatibility_iterator node = m_tools.GetFirst(); + node; + node = node->GetNext() ) + { + const wxToolBarToolBase * const tool = node->GetData(); + if ( tool->IsControl() ) + { + wxControl * const control = tool->GetControl(); + + if ( !control ) + { + wxFAIL_MSG( _T("NULL control in toolbar?") ); + } + else if ( control->GetId() == id ) + { + // found + return control; + } + } + } + + return NULL; +} + +wxToolBarToolBase *wxToolBarBase::AddSeparator() +{ + return InsertSeparator(GetToolsCount()); +} + +wxToolBarToolBase *wxToolBarBase::InsertSeparator(size_t pos) +{ + wxCHECK_MSG( pos <= GetToolsCount(), (wxToolBarToolBase *)NULL, + _T("invalid position in wxToolBar::InsertSeparator()") ); + + wxToolBarToolBase *tool = CreateTool(wxID_SEPARATOR, + wxEmptyString, + wxNullBitmap, wxNullBitmap, + wxITEM_SEPARATOR, (wxObject *)NULL, + wxEmptyString, wxEmptyString); + + if ( !tool || !DoInsertTool(pos, tool) ) + { + delete tool; + + return NULL; + } + + m_tools.Insert(pos, tool); + + return tool; +} + +wxToolBarToolBase *wxToolBarBase::RemoveTool(int id) +{ + size_t pos = 0; + wxToolBarToolsList::compatibility_iterator node; + for ( node = m_tools.GetFirst(); node; node = node->GetNext() ) + { + if ( node->GetData()->GetId() == id ) + break; + + pos++; + } + + if ( !node ) + { + // don't give any error messages - sometimes we might call RemoveTool() + // without knowing whether the tool is or not in the toolbar + return (wxToolBarToolBase *)NULL; + } + + wxToolBarToolBase *tool = node->GetData(); + if ( !DoDeleteTool(pos, tool) ) + { + return (wxToolBarToolBase *)NULL; + } + + m_tools.Erase(node); + + return tool; +} + +bool wxToolBarBase::DeleteToolByPos(size_t pos) +{ + wxCHECK_MSG( pos < GetToolsCount(), false, + _T("invalid position in wxToolBar::DeleteToolByPos()") ); + + wxToolBarToolsList::compatibility_iterator node = m_tools.Item(pos); + + if ( !DoDeleteTool(pos, node->GetData()) ) + { + return false; + } + + delete node->GetData(); + m_tools.Erase(node); + + return true; +} + +bool wxToolBarBase::DeleteTool(int id) +{ + size_t pos = 0; + wxToolBarToolsList::compatibility_iterator node; + for ( node = m_tools.GetFirst(); node; node = node->GetNext() ) + { + if ( node->GetData()->GetId() == id ) + break; + + pos++; + } + + if ( !node || !DoDeleteTool(pos, node->GetData()) ) + { + return false; + } + + delete node->GetData(); + m_tools.Erase(node); + + return true; +} + +wxToolBarToolBase *wxToolBarBase::FindById(int id) const +{ + wxToolBarToolBase *tool = (wxToolBarToolBase *)NULL; + + for ( wxToolBarToolsList::compatibility_iterator node = m_tools.GetFirst(); + node; + node = node->GetNext() ) + { + tool = node->GetData(); + if ( tool->GetId() == id ) + { + // found + break; + } + + tool = NULL; + } + + return tool; +} + +void wxToolBarBase::UnToggleRadioGroup(wxToolBarToolBase *tool) +{ + wxCHECK_RET( tool, _T("NULL tool in wxToolBarTool::UnToggleRadioGroup") ); + + if ( !tool->IsButton() || tool->GetKind() != wxITEM_RADIO ) + return; + + wxToolBarToolsList::compatibility_iterator node = m_tools.Find(tool); + wxCHECK_RET( node, _T("invalid tool in wxToolBarTool::UnToggleRadioGroup") ); + + wxToolBarToolsList::compatibility_iterator nodeNext = node->GetNext(); + while ( nodeNext ) + { + wxToolBarToolBase *toolNext = nodeNext->GetData(); + + if ( !toolNext->IsButton() || toolNext->GetKind() != wxITEM_RADIO ) + break; + + if ( toolNext->Toggle(false) ) + { + DoToggleTool(toolNext, false); + } + + nodeNext = nodeNext->GetNext(); + } + + wxToolBarToolsList::compatibility_iterator nodePrev = node->GetPrevious(); + while ( nodePrev ) + { + wxToolBarToolBase *toolNext = nodePrev->GetData(); + + if ( !toolNext->IsButton() || toolNext->GetKind() != wxITEM_RADIO ) + break; + + if ( toolNext->Toggle(false) ) + { + DoToggleTool(toolNext, false); + } + + nodePrev = nodePrev->GetPrevious(); + } +} + +void wxToolBarBase::ClearTools() +{ + while ( GetToolsCount() ) + { + DeleteToolByPos(0); + } +} + +bool wxToolBarBase::Realize() +{ + return true; +} + +wxToolBarBase::~wxToolBarBase() +{ + WX_CLEAR_LIST(wxToolBarToolsList, m_tools); + + // notify the frame that it doesn't have a tool bar any longer to avoid + // dangling pointers + wxFrame *frame = wxDynamicCast(GetParent(), wxFrame); + if ( frame && frame->GetToolBar() == this ) + { + frame->SetToolBar(NULL); + } +} + +// ---------------------------------------------------------------------------- +// wxToolBarBase tools state +// ---------------------------------------------------------------------------- + +void wxToolBarBase::EnableTool(int id, bool enable) +{ + wxToolBarToolBase *tool = FindById(id); + if ( tool ) + { + if ( tool->Enable(enable) ) + { + DoEnableTool(tool, enable); + } + } +} + +void wxToolBarBase::ToggleTool(int id, bool toggle) +{ + wxToolBarToolBase *tool = FindById(id); + if ( tool && tool->CanBeToggled() ) + { + if ( tool->Toggle(toggle) ) + { + UnToggleRadioGroup(tool); + DoToggleTool(tool, toggle); + } + } +} + +void wxToolBarBase::SetToggle(int id, bool toggle) +{ + wxToolBarToolBase *tool = FindById(id); + if ( tool ) + { + if ( tool->SetToggle(toggle) ) + { + DoSetToggle(tool, toggle); + } + } +} + +void wxToolBarBase::SetToolShortHelp(int id, const wxString& help) +{ + wxToolBarToolBase *tool = FindById(id); + if ( tool ) + { + (void)tool->SetShortHelp(help); + } +} + +void wxToolBarBase::SetToolLongHelp(int id, const wxString& help) +{ + wxToolBarToolBase *tool = FindById(id); + if ( tool ) + { + (void)tool->SetLongHelp(help); + } +} + +wxObject *wxToolBarBase::GetToolClientData(int id) const +{ + wxToolBarToolBase *tool = FindById(id); + + return tool ? tool->GetClientData() : (wxObject *)NULL; +} + +void wxToolBarBase::SetToolClientData(int id, wxObject *clientData) +{ + wxToolBarToolBase *tool = FindById(id); + + wxCHECK_RET( tool, _T("no such tool in wxToolBar::SetToolClientData") ); + + tool->SetClientData(clientData); +} + +int wxToolBarBase::GetToolPos(int id) const +{ + size_t pos = 0; + wxToolBarToolsList::compatibility_iterator node; + + for ( node = m_tools.GetFirst(); node; node = node->GetNext() ) + { + if ( node->GetData()->GetId() == id ) + return pos; + + pos++; + } + + return wxNOT_FOUND; +} + +bool wxToolBarBase::GetToolState(int id) const +{ + wxToolBarToolBase *tool = FindById(id); + wxCHECK_MSG( tool, false, _T("no such tool") ); + + return tool->IsToggled(); +} + +bool wxToolBarBase::GetToolEnabled(int id) const +{ + wxToolBarToolBase *tool = FindById(id); + wxCHECK_MSG( tool, false, _T("no such tool") ); + + return tool->IsEnabled(); +} + +wxString wxToolBarBase::GetToolShortHelp(int id) const +{ + wxToolBarToolBase *tool = FindById(id); + wxCHECK_MSG( tool, wxEmptyString, _T("no such tool") ); + + return tool->GetShortHelp(); +} + +wxString wxToolBarBase::GetToolLongHelp(int id) const +{ + wxToolBarToolBase *tool = FindById(id); + wxCHECK_MSG( tool, wxEmptyString, _T("no such tool") ); + + return tool->GetLongHelp(); +} + +// ---------------------------------------------------------------------------- +// wxToolBarBase geometry +// ---------------------------------------------------------------------------- + +void wxToolBarBase::SetMargins(int x, int y) +{ + m_xMargin = x; + m_yMargin = y; +} + +void wxToolBarBase::SetRows(int WXUNUSED(nRows)) +{ + // nothing +} + +// ---------------------------------------------------------------------------- +// event processing +// ---------------------------------------------------------------------------- + +// Only allow toggle if returns true +bool wxToolBarBase::OnLeftClick(int id, bool toggleDown) +{ + wxCommandEvent event(wxEVT_COMMAND_TOOL_CLICKED, id); + event.SetEventObject(this); + + // we use SetInt() to make wxCommandEvent::IsChecked() return toggleDown + event.SetInt((int)toggleDown); + + // and SetExtraLong() for backwards compatibility + event.SetExtraLong((long)toggleDown); + + // Send events to this toolbar instead (and thence up the window hierarchy) + GetEventHandler()->ProcessEvent(event); + + return true; +} + +// Call when right button down. +void wxToolBarBase::OnRightClick(int id, + long WXUNUSED(x), + long WXUNUSED(y)) +{ + wxCommandEvent event(wxEVT_COMMAND_TOOL_RCLICKED, id); + event.SetEventObject(this); + event.SetInt(id); + + GetEventHandler()->ProcessEvent(event); +} + +// Called when the mouse cursor enters a tool bitmap (no button pressed). +// Argument is wxID_ANY if mouse is exiting the toolbar. +// Note that for this event, the id of the window is used, +// and the integer parameter of wxCommandEvent is used to retrieve +// the tool id. +void wxToolBarBase::OnMouseEnter(int id) +{ + wxCommandEvent event(wxEVT_COMMAND_TOOL_ENTER, GetId()); + event.SetEventObject(this); + event.SetInt(id); + + wxFrame *frame = wxDynamicCast(GetParent(), wxFrame); + if( frame ) + { + wxString help; + wxToolBarToolBase* tool = id == wxID_ANY ? (wxToolBarToolBase*)NULL : FindById(id); + if(tool) + help = tool->GetLongHelp(); + frame->DoGiveHelp( help, id != wxID_ANY ); + } + + (void)GetEventHandler()->ProcessEvent(event); +} + +// ---------------------------------------------------------------------------- +// UI updates +// ---------------------------------------------------------------------------- + +// Do the toolbar button updates (check for EVT_UPDATE_UI handlers) +void wxToolBarBase::UpdateWindowUI(long flags) +{ + wxWindowBase::UpdateWindowUI(flags); + + // There is no sense in updating the toolbar UI + // if the parent window is about to get destroyed + wxWindow *tlw = wxGetTopLevelParent( this ); + if (tlw && wxPendingDelete.Member( tlw )) + return; + + wxEvtHandler* evtHandler = GetEventHandler() ; + + for ( wxToolBarToolsList::compatibility_iterator node = m_tools.GetFirst(); + node; + node = node->GetNext() ) + { + int id = node->GetData()->GetId(); + + wxUpdateUIEvent event(id); + event.SetEventObject(this); + + if ( evtHandler->ProcessEvent(event) ) + { + if ( event.GetSetEnabled() ) + EnableTool(id, event.GetEnabled()); + if ( event.GetSetChecked() ) + ToggleTool(id, event.GetChecked()); +#if 0 + if ( event.GetSetText() ) + // Set tooltip? +#endif // 0 + } + } +} + +#if wxUSE_IMAGE + +/* + * Make a greyed-out image suitable for disabled buttons. + * This code is adapted from wxNewBitmapButton in FL. + */ + +bool wxCreateGreyedImage(const wxImage& src, wxImage& dst) +{ + dst = src.Copy(); + + unsigned char rBg, gBg, bBg; + if ( src.HasMask() ) + { + src.GetOrFindMaskColour(&rBg, &gBg, &bBg); + dst.SetMaskColour(rBg, gBg, bBg); + } + else // assuming the pixels along the edges are of the background color + { + rBg = src.GetRed(0, 0); + gBg = src.GetGreen(0, 0); + bBg = src.GetBlue(0, 0); + } + + const wxColour colBg(rBg, gBg, bBg); + + const wxColour colDark = wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW); + const wxColour colLight = wxSystemSettings::GetColour(wxSYS_COLOUR_3DHIGHLIGHT); + + // Second attempt, just making things monochrome + const int width = src.GetWidth(); + const int height = src.GetHeight(); + + for ( int x = 0; x < width; x++ ) + { + for ( int y = 0; y < height; y++ ) + { + const int r = src.GetRed(x, y); + const int g = src.GetGreen(x, y); + const int b = src.GetBlue(x, y); + + if ( r == rBg && g == gBg && b == bBg ) + { + // Leave the background colour as-is + continue; + } + + // Change light things to the background colour + wxColour col; + if ( r >= (colLight.Red() - 50) && + g >= (colLight.Green() - 50) && + b >= (colLight.Blue() - 50) ) + { + col = colBg; + } + else // Change dark things to really dark + { + col = colDark; + } + + dst.SetRGB(x, y, col.Red(), col.Green(), col.Blue()); + } + } + + return true; +} + +#endif // wxUSE_IMAGE + +#endif // wxUSE_TOOLBAR diff --git a/Externals/wxWidgets/src/common/textbuf.cpp b/Externals/wxWidgets/src/common/textbuf.cpp new file mode 100644 index 0000000000..7aab707430 --- /dev/null +++ b/Externals/wxWidgets/src/common/textbuf.cpp @@ -0,0 +1,284 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/common/textbuf.cpp +// Purpose: implementation of wxTextBuffer class +// Created: 14.11.01 +// Author: Morten Hanssen, Vadim Zeitlin +// RCS-ID: $Id: textbuf.cpp 38570 2006-04-05 14:37:47Z VZ $ +// Copyright: (c) 1998-2001 wxWidgets team +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// headers +// ============================================================================ + +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif //__BORLANDC__ + +#ifndef WX_PRECOMP + #include "wx/string.h" + #include "wx/intl.h" + #include "wx/log.h" +#endif + +#include "wx/textbuf.h" + +// ============================================================================ +// wxTextBuffer class implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// static methods (always compiled in) +// ---------------------------------------------------------------------------- + +// default type is the native one +// the native type under Mac OS X is: +// - Unix when compiling with the Apple Developer Tools (__UNIX__) +// - Mac when compiling with CodeWarrior (__WXMAC__) + +const wxTextFileType wxTextBuffer::typeDefault = +#if defined(__WINDOWS__) || defined(__DOS__) || defined(__PALMOS__) + wxTextFileType_Dos; +#elif defined(__UNIX__) + wxTextFileType_Unix; +#elif defined(__WXMAC__) + wxTextFileType_Mac; +#elif defined(__OS2__) + wxTextFileType_Os2; +#else + wxTextFileType_None; + #error "wxTextBuffer: unsupported platform." +#endif + +const wxChar *wxTextBuffer::GetEOL(wxTextFileType type) +{ + switch ( type ) { + default: + wxFAIL_MSG(wxT("bad buffer type in wxTextBuffer::GetEOL.")); + // fall through nevertheless - we must return something... + + case wxTextFileType_None: return wxEmptyString; + case wxTextFileType_Unix: return wxT("\n"); + case wxTextFileType_Dos: return wxT("\r\n"); + case wxTextFileType_Mac: return wxT("\r"); + } +} + +wxString wxTextBuffer::Translate(const wxString& text, wxTextFileType type) +{ + // don't do anything if there is nothing to do + if ( type == wxTextFileType_None ) + return text; + + // nor if it is empty + if ( text.empty() ) + return text; + + wxString eol = GetEOL(type), result; + + // optimization: we know that the length of the new string will be about + // the same as the length of the old one, so prealloc memory to aviod + // unnecessary relocations + result.Alloc(text.Len()); + + wxChar chLast = 0; + for ( const wxChar *pc = text.c_str(); *pc; pc++ ) + { + wxChar ch = *pc; + switch ( ch ) { + case _T('\n'): + // Dos/Unix line termination + result += eol; + chLast = 0; + break; + + case _T('\r'): + if ( chLast == _T('\r') ) { + // Mac empty line + result += eol; + } + else { + // just remember it: we don't know whether it is just "\r" + // or "\r\n" yet + chLast = _T('\r'); + } + break; + + default: + if ( chLast == _T('\r') ) { + // Mac line termination + result += eol; + + // reset chLast to avoid inserting another eol before the + // next character + chLast = 0; + } + + // add to the current line + result += ch; + } + } + + if ( chLast ) { + // trailing '\r' + result += eol; + } + + return result; +} + +#if wxUSE_TEXTBUFFER + +wxString wxTextBuffer::ms_eof; + +// ---------------------------------------------------------------------------- +// ctors & dtor +// ---------------------------------------------------------------------------- + +wxTextBuffer::wxTextBuffer(const wxString& strBufferName) + : m_strBufferName(strBufferName) +{ + m_nCurLine = 0; + m_isOpened = false; +} + +wxTextBuffer::~wxTextBuffer() +{ + // required here for Darwin +} + +// ---------------------------------------------------------------------------- +// buffer operations +// ---------------------------------------------------------------------------- + +bool wxTextBuffer::Exists() const +{ + return OnExists(); +} + +bool wxTextBuffer::Create(const wxString& strBufferName) +{ + m_strBufferName = strBufferName; + + return Create(); +} + +bool wxTextBuffer::Create() +{ + // buffer name must be either given in ctor or in Create(const wxString&) + wxASSERT( !m_strBufferName.empty() ); + + // if the buffer already exists do nothing + if ( Exists() ) return false; + + if ( !OnOpen(m_strBufferName, WriteAccess) ) + return false; + + OnClose(); + return true; +} + +bool wxTextBuffer::Open(const wxString& strBufferName, const wxMBConv& conv) +{ + m_strBufferName = strBufferName; + + return Open(conv); +} + +bool wxTextBuffer::Open(const wxMBConv& conv) +{ + // buffer name must be either given in ctor or in Open(const wxString&) + wxASSERT( !m_strBufferName.empty() ); + + // open buffer in read-only mode + if ( !OnOpen(m_strBufferName, ReadAccess) ) + return false; + + // read buffer into memory + m_isOpened = OnRead(conv); + + OnClose(); + + return m_isOpened; +} + +// analyse some lines of the buffer trying to guess it's type. +// if it fails, it assumes the native type for our platform. +wxTextFileType wxTextBuffer::GuessType() const +{ + wxASSERT( IsOpened() ); + + // scan the buffer lines + size_t nUnix = 0, // number of '\n's alone + nDos = 0, // number of '\r\n' + nMac = 0; // number of '\r's + + // we take MAX_LINES_SCAN in the beginning, middle and the end of buffer + #define MAX_LINES_SCAN (10) + size_t nCount = m_aLines.Count() / 3, + nScan = nCount > 3*MAX_LINES_SCAN ? MAX_LINES_SCAN : nCount / 3; + + #define AnalyseLine(n) \ + switch ( m_aTypes[n] ) { \ + case wxTextFileType_Unix: nUnix++; break; \ + case wxTextFileType_Dos: nDos++; break; \ + case wxTextFileType_Mac: nMac++; break; \ + default: wxFAIL_MSG(_("unknown line terminator")); \ + } + + size_t n; + for ( n = 0; n < nScan; n++ ) // the beginning + AnalyseLine(n); + for ( n = (nCount - nScan)/2; n < (nCount + nScan)/2; n++ ) + AnalyseLine(n); + for ( n = nCount - nScan; n < nCount; n++ ) + AnalyseLine(n); + + #undef AnalyseLine + + // interpret the results (FIXME far from being even 50% fool proof) + if ( nScan > 0 && nDos + nUnix + nMac == 0 ) { + // no newlines at all + wxLogWarning(_("'%s' is probably a binary buffer."), m_strBufferName.c_str()); + } + else { + #define GREATER_OF(t1, t2) n##t1 == n##t2 ? typeDefault \ + : n##t1 > n##t2 \ + ? wxTextFileType_##t1 \ + : wxTextFileType_##t2 + +#if !defined(__WATCOMC__) || wxCHECK_WATCOM_VERSION(1,4) + if ( nDos > nUnix ) + return GREATER_OF(Dos, Mac); + else if ( nDos < nUnix ) + return GREATER_OF(Unix, Mac); + else { + // nDos == nUnix + return nMac > nDos ? wxTextFileType_Mac : typeDefault; + } +#endif // __WATCOMC__ + + #undef GREATER_OF + } + + return typeDefault; +} + + +bool wxTextBuffer::Close() +{ + Clear(); + m_isOpened = false; + + return true; +} + +bool wxTextBuffer::Write(wxTextFileType typeNew, const wxMBConv& conv) +{ + return OnWrite(typeNew, conv); +} + +#endif // wxUSE_TEXTBUFFER diff --git a/Externals/wxWidgets/src/common/textcmn.cpp b/Externals/wxWidgets/src/common/textcmn.cpp new file mode 100644 index 0000000000..121df9633f --- /dev/null +++ b/Externals/wxWidgets/src/common/textcmn.cpp @@ -0,0 +1,553 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/common/textcmn.cpp +// Purpose: implementation of platform-independent functions of wxTextCtrl +// Author: Julian Smart +// Modified by: +// Created: 13.07.99 +// RCS-ID: $Id: textcmn.cpp 41754 2006-10-08 22:40:14Z VZ $ +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// for compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#ifndef WX_PRECOMP + #include "wx/event.h" +#endif // WX_PRECOMP + +#if wxUSE_TEXTCTRL + +#include "wx/textctrl.h" + +#ifndef WX_PRECOMP + #include "wx/intl.h" + #include "wx/log.h" +#endif // WX_PRECOMP + +#include "wx/ffile.h" + +// ---------------------------------------------------------------------------- +// macros +// ---------------------------------------------------------------------------- + +// we don't have any objects of type wxTextCtrlBase in the program, only +// wxTextCtrl, so this cast is safe +#define TEXTCTRL(ptr) ((wxTextCtrl *)(ptr)) + +// ============================================================================ +// implementation +// ============================================================================ + +IMPLEMENT_DYNAMIC_CLASS(wxTextUrlEvent, wxCommandEvent) + +DEFINE_EVENT_TYPE(wxEVT_COMMAND_TEXT_UPDATED) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_TEXT_ENTER) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_TEXT_URL) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_TEXT_MAXLEN) + +IMPLEMENT_ABSTRACT_CLASS(wxTextCtrlBase, wxControl) + +// ---------------------------------------------------------------------------- +// style functions - not implemented here +// ---------------------------------------------------------------------------- + +wxTextAttr::wxTextAttr(const wxColour& colText, + const wxColour& colBack, + const wxFont& font, + wxTextAttrAlignment alignment) + : m_colText(colText), m_colBack(colBack), m_font(font), m_textAlignment(alignment) +{ + m_flags = 0; + m_leftIndent = 0; + m_leftSubIndent = 0; + m_rightIndent = 0; + if (m_colText.Ok()) m_flags |= wxTEXT_ATTR_TEXT_COLOUR; + if (m_colBack.Ok()) m_flags |= wxTEXT_ATTR_BACKGROUND_COLOUR; + if (m_font.Ok()) m_flags |= wxTEXT_ATTR_FONT; + if (alignment != wxTEXT_ALIGNMENT_DEFAULT) + m_flags |= wxTEXT_ATTR_ALIGNMENT; +} + +void wxTextAttr::Init() +{ + m_textAlignment = wxTEXT_ALIGNMENT_DEFAULT; + m_flags = 0; + m_leftIndent = 0; + m_leftSubIndent = 0; + m_rightIndent = 0; +} + +/* static */ +wxTextAttr wxTextAttr::Combine(const wxTextAttr& attr, + const wxTextAttr& attrDef, + const wxTextCtrlBase *text) +{ + wxFont font = attr.GetFont(); + if ( !font.Ok() ) + { + font = attrDef.GetFont(); + + if ( text && !font.Ok() ) + font = text->GetFont(); + } + + wxColour colFg = attr.GetTextColour(); + if ( !colFg.Ok() ) + { + colFg = attrDef.GetTextColour(); + + if ( text && !colFg.Ok() ) + colFg = text->GetForegroundColour(); + } + + wxColour colBg = attr.GetBackgroundColour(); + if ( !colBg.Ok() ) + { + colBg = attrDef.GetBackgroundColour(); + + if ( text && !colBg.Ok() ) + colBg = text->GetBackgroundColour(); + } + + wxTextAttr newAttr(colFg, colBg, font); + + if (attr.HasAlignment()) + newAttr.SetAlignment(attr.GetAlignment()); + else if (attrDef.HasAlignment()) + newAttr.SetAlignment(attrDef.GetAlignment()); + + if (attr.HasTabs()) + newAttr.SetTabs(attr.GetTabs()); + else if (attrDef.HasTabs()) + newAttr.SetTabs(attrDef.GetTabs()); + + if (attr.HasLeftIndent()) + newAttr.SetLeftIndent(attr.GetLeftIndent(), attr.GetLeftSubIndent()); + else if (attrDef.HasLeftIndent()) + newAttr.SetLeftIndent(attrDef.GetLeftIndent(), attr.GetLeftSubIndent()); + + if (attr.HasRightIndent()) + newAttr.SetRightIndent(attr.GetRightIndent()); + else if (attrDef.HasRightIndent()) + newAttr.SetRightIndent(attrDef.GetRightIndent()); + + return newAttr; +} + +void wxTextAttr::operator= (const wxTextAttr& attr) +{ + m_font = attr.m_font; + m_colText = attr.m_colText; + m_colBack = attr.m_colBack; + m_textAlignment = attr.m_textAlignment; + m_leftIndent = attr.m_leftIndent; + m_leftSubIndent = attr.m_leftSubIndent; + m_rightIndent = attr.m_rightIndent; + m_tabs = attr.m_tabs; + m_flags = attr.m_flags; +} + + +// apply styling to text range +bool wxTextCtrlBase::SetStyle(long WXUNUSED(start), long WXUNUSED(end), + const wxTextAttr& WXUNUSED(style)) +{ + // to be implemented in derived TextCtrl classes + return false; +} + +// get the styling at the given position +bool wxTextCtrlBase::GetStyle(long WXUNUSED(position), wxTextAttr& WXUNUSED(style)) +{ + // to be implemented in derived TextCtrl classes + return false; +} + +// change default text attributes +bool wxTextCtrlBase::SetDefaultStyle(const wxTextAttr& style) +{ + // keep the old attributes if the new style doesn't specify them unless the + // new style is empty - then reset m_defaultStyle (as there is no other way + // to do it) + if ( style.IsDefault() ) + m_defaultStyle = style; + else + m_defaultStyle = wxTextAttr::Combine(style, m_defaultStyle, this); + + return true; +} + +// get default text attributes +const wxTextAttr& wxTextCtrlBase::GetDefaultStyle() const +{ + return m_defaultStyle; +} + +// ---------------------------------------------------------------------------- +// file IO functions +// ---------------------------------------------------------------------------- + +bool wxTextCtrlBase::DoLoadFile(const wxString& filename, int WXUNUSED(fileType)) +{ +#if wxUSE_FFILE + wxFFile file(filename); + if ( file.IsOpened() ) + { + wxString text; + if ( file.ReadAll(&text) ) + { + SetValue(text); + + DiscardEdits(); + + m_filename = filename; + + return true; + } + } + + wxLogError(_("File couldn't be loaded.")); +#endif // wxUSE_FFILE + + return false; +} + +bool wxTextCtrlBase::SaveFile(const wxString& filename, int fileType) +{ + wxString filenameToUse = filename.empty() ? m_filename : filename; + if ( filenameToUse.empty() ) + { + // what kind of message to give? is it an error or a program bug? + wxLogDebug(wxT("Can't save textctrl to file without filename.")); + + return false; + } + + return DoSaveFile(filenameToUse, fileType); +} + +bool wxTextCtrlBase::DoSaveFile(const wxString& filename, int WXUNUSED(fileType)) +{ +#if wxUSE_FFILE + wxFFile file(filename, _T("w")); + if ( file.IsOpened() && file.Write(GetValue()) ) + { + // if it worked, save for future calls + m_filename = filename; + + // it's not modified any longer + DiscardEdits(); + + return true; + } +#endif // wxUSE_FFILE + + wxLogError(_("The text couldn't be saved.")); + + return false; +} + +// ---------------------------------------------------------------------------- +// stream-like insertion operator +// ---------------------------------------------------------------------------- + +wxTextCtrl& wxTextCtrlBase::operator<<(const wxString& s) +{ + AppendText(s); + return *TEXTCTRL(this); +} + +wxTextCtrl& wxTextCtrlBase::operator<<(float f) +{ + wxString str; + str.Printf(wxT("%.2f"), f); + AppendText(str); + return *TEXTCTRL(this); +} + +wxTextCtrl& wxTextCtrlBase::operator<<(double d) +{ + wxString str; + str.Printf(wxT("%.2f"), d); + AppendText(str); + return *TEXTCTRL(this); +} + +wxTextCtrl& wxTextCtrlBase::operator<<(int i) +{ + wxString str; + str.Printf(wxT("%d"), i); + AppendText(str); + return *TEXTCTRL(this); +} + +wxTextCtrl& wxTextCtrlBase::operator<<(long i) +{ + wxString str; + str.Printf(wxT("%ld"), i); + AppendText(str); + return *TEXTCTRL(this); +} + +wxTextCtrl& wxTextCtrlBase::operator<<(const wxChar c) +{ + return operator<<(wxString(c)); +} + +// ---------------------------------------------------------------------------- +// streambuf methods implementation +// ---------------------------------------------------------------------------- + +#if wxHAS_TEXT_WINDOW_STREAM + +int wxTextCtrlBase::overflow(int c) +{ + AppendText((wxChar)c); + + // return something different from EOF + return 0; +} + +#endif // wxHAS_TEXT_WINDOW_STREAM + +// ---------------------------------------------------------------------------- +// clipboard stuff +// ---------------------------------------------------------------------------- + +bool wxTextCtrlBase::CanCopy() const +{ + // can copy if there's a selection + long from, to; + GetSelection(&from, &to); + return from != to; +} + +bool wxTextCtrlBase::CanCut() const +{ + // can cut if there's a selection and if we're not read only + return CanCopy() && IsEditable(); +} + +bool wxTextCtrlBase::CanPaste() const +{ + // can paste if we are not read only + return IsEditable(); +} + +// ---------------------------------------------------------------------------- +// emulating key presses +// ---------------------------------------------------------------------------- + +#ifdef __WIN32__ +// the generic version is unused in wxMSW +bool wxTextCtrlBase::EmulateKeyPress(const wxKeyEvent& WXUNUSED(event)) +{ + return false; +} +#else // !__WIN32__ +bool wxTextCtrlBase::EmulateKeyPress(const wxKeyEvent& event) +{ + wxChar ch = 0; + int keycode = event.GetKeyCode(); + switch ( keycode ) + { + case WXK_NUMPAD0: + case WXK_NUMPAD1: + case WXK_NUMPAD2: + case WXK_NUMPAD3: + case WXK_NUMPAD4: + case WXK_NUMPAD5: + case WXK_NUMPAD6: + case WXK_NUMPAD7: + case WXK_NUMPAD8: + case WXK_NUMPAD9: + ch = (wxChar)(_T('0') + keycode - WXK_NUMPAD0); + break; + + case WXK_MULTIPLY: + case WXK_NUMPAD_MULTIPLY: + ch = _T('*'); + break; + + case WXK_ADD: + case WXK_NUMPAD_ADD: + ch = _T('+'); + break; + + case WXK_SUBTRACT: + case WXK_NUMPAD_SUBTRACT: + ch = _T('-'); + break; + + case WXK_DECIMAL: + case WXK_NUMPAD_DECIMAL: + ch = _T('.'); + break; + + case WXK_DIVIDE: + case WXK_NUMPAD_DIVIDE: + ch = _T('/'); + break; + + case WXK_DELETE: + case WXK_NUMPAD_DELETE: + // delete the character at cursor + { + const long pos = GetInsertionPoint(); + if ( pos < GetLastPosition() ) + Remove(pos, pos + 1); + } + break; + + case WXK_BACK: + // delete the character before the cursor + { + const long pos = GetInsertionPoint(); + if ( pos > 0 ) + Remove(pos - 1, pos); + } + break; + + default: +#if wxUSE_UNICODE + if ( event.GetUnicodeKey() ) + { + ch = event.GetUnicodeKey(); + } + else +#endif + if ( keycode < 256 && keycode >= 0 && wxIsprint(keycode) ) + { + // FIXME this is not going to work for non letters... + if ( !event.ShiftDown() ) + { + keycode = wxTolower(keycode); + } + + ch = (wxChar)keycode; + } + else + { + ch = _T('\0'); + } + } + + if ( ch ) + { + WriteText(ch); + + return true; + } + + return false; +} +#endif // !__WIN32__ + +// ---------------------------------------------------------------------------- +// selection and ranges +// ---------------------------------------------------------------------------- + +void wxTextCtrlBase::SelectAll() +{ + SetSelection(0, GetLastPosition()); +} + +wxString wxTextCtrlBase::GetStringSelection() const +{ + long from, to; + GetSelection(&from, &to); + + return GetRange(from, to); +} + +wxString wxTextCtrlBase::GetRange(long from, long to) const +{ + wxString sel; + if ( from < to ) + { + sel = GetValue().Mid(from, to - from); + } + + return sel; +} + +// do the window-specific processing after processing the update event +void wxTextCtrlBase::DoUpdateWindowUI(wxUpdateUIEvent& event) +{ + // call inherited, but skip the wxControl's version, and call directly the + // wxWindow's one instead, because the only reason why we are overriding this + // function is that we want to use SetValue() instead of wxControl::SetLabel() + wxWindowBase::DoUpdateWindowUI(event); + + // update text + if ( event.GetSetText() ) + { + if ( event.GetText() != GetValue() ) + SetValue(event.GetText()); + } +} + +// ---------------------------------------------------------------------------- +// hit testing +// ---------------------------------------------------------------------------- + +wxTextCtrlHitTestResult +wxTextCtrlBase::HitTest(const wxPoint& pt, wxTextCoord *x, wxTextCoord *y) const +{ + // implement in terms of the other overload as the native ports typically + // can get the position and not (x, y) pair directly (although wxUniv + // directly gets x and y -- and so overrides this method as well) + long pos; + wxTextCtrlHitTestResult rc = HitTest(pt, &pos); + + if ( rc != wxTE_HT_UNKNOWN ) + { + PositionToXY(pos, x, y); + } + + return rc; +} + +wxTextCtrlHitTestResult +wxTextCtrlBase::HitTest(const wxPoint& WXUNUSED(pt), + long * WXUNUSED(pos)) const +{ + // not implemented + return wxTE_HT_UNKNOWN; +} + +// ---------------------------------------------------------------------------- +// events +// ---------------------------------------------------------------------------- + +void wxTextCtrlBase::SendTextUpdatedEvent() +{ + wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, GetId()); + + // do not do this as it could be very inefficient if the text control + // contains a lot of text and we're not using ref-counted wxString + // implementation -- instead, event.GetString() will query the control for + // its current text if needed + //event.SetString(GetValue()); + + event.SetEventObject(this); + GetEventHandler()->ProcessEvent(event); +} + +#else // !wxUSE_TEXTCTRL + +// define this one even if !wxUSE_TEXTCTRL because it is also used by other +// controls (wxComboBox and wxSpinCtrl) + +DEFINE_EVENT_TYPE(wxEVT_COMMAND_TEXT_UPDATED) + +#endif // wxUSE_TEXTCTRL/!wxUSE_TEXTCTRL diff --git a/Externals/wxWidgets/src/common/textfile.cpp b/Externals/wxWidgets/src/common/textfile.cpp new file mode 100644 index 0000000000..80dc4cc1cb --- /dev/null +++ b/Externals/wxWidgets/src/common/textfile.cpp @@ -0,0 +1,295 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/common/textfile.cpp +// Purpose: implementation of wxTextFile class +// Author: Vadim Zeitlin +// Modified by: +// Created: 03.04.98 +// RCS-ID: $Id: textfile.cpp 49298 2007-10-21 18:05:49Z SC $ +// Copyright: (c) 1998 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// headers +// ============================================================================ + +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif //__BORLANDC__ + +#if !wxUSE_FILE || !wxUSE_TEXTBUFFER + #undef wxUSE_TEXTFILE + #define wxUSE_TEXTFILE 0 +#endif // wxUSE_FILE + +#if wxUSE_TEXTFILE + +#ifndef WX_PRECOMP + #include "wx/string.h" + #include "wx/intl.h" + #include "wx/file.h" + #include "wx/log.h" +#endif + +#include "wx/textfile.h" +#include "wx/filename.h" +#include "wx/buffer.h" + +// ============================================================================ +// wxTextFile class implementation +// ============================================================================ + +wxTextFile::wxTextFile(const wxString& strFileName) + : wxTextBuffer(strFileName) +{ +} + + +// ---------------------------------------------------------------------------- +// file operations +// ---------------------------------------------------------------------------- + +bool wxTextFile::OnExists() const +{ + return wxFile::Exists(m_strBufferName); +} + + +bool wxTextFile::OnOpen(const wxString &strBufferName, wxTextBufferOpenMode OpenMode) +{ + wxFile::OpenMode FileOpenMode; + + switch ( OpenMode ) + { + default: + wxFAIL_MSG( _T("unknown open mode in wxTextFile::Open") ); + // fall through + + case ReadAccess : + FileOpenMode = wxFile::read; + break; + + case WriteAccess : + FileOpenMode = wxFile::write; + break; + } + + return m_file.Open(strBufferName.c_str(), FileOpenMode); +} + + +bool wxTextFile::OnClose() +{ + return m_file.Close(); +} + + +bool wxTextFile::OnRead(const wxMBConv& conv) +{ + // file should be opened + wxASSERT_MSG( m_file.IsOpened(), _T("can't read closed file") ); + + // read the entire file in memory: this is not the most efficient thing to + // do but there is no good way to avoid it in Unicode build because if we + // read the file block by block we can't convert each block to Unicode + // separately (the last multibyte char in the block might be only partially + // read and so the conversion would fail) and, as the file contents is kept + // in memory by wxTextFile anyhow, it shouldn't be a big problem to read + // the file entirely + size_t bufSize = 0, + bufPos = 0; + char block[1024]; + wxCharBuffer buf; + + // first determine if the file is seekable or not and so whether we can + // determine its length in advance + wxFileOffset fileLength; + { + wxLogNull logNull; + fileLength = m_file.Length(); + } + + // some non-seekable files under /proc under Linux pretend that they're + // seekable but always return 0; others do return an error + const bool seekable = fileLength != wxInvalidOffset && fileLength != 0; + if ( seekable ) + { + // we know the required length, so set the buffer size in advance + bufSize = fileLength; + if ( !buf.extend(bufSize - 1 /* it adds 1 internally */) ) + return false; + + // if the file is seekable, also check that we're at its beginning + wxASSERT_MSG( m_file.Tell() == 0, _T("should be at start of file") ); + } + + for ( ;; ) + { + ssize_t nRead = m_file.Read(block, WXSIZEOF(block)); + + if ( nRead == wxInvalidOffset ) + { + // read error (error message already given in wxFile::Read) + return false; + } + + if ( nRead == 0 ) + { + // if no bytes have been read, presumably this is a valid-but-empty file + if ( bufPos == 0 ) + return true; + + // otherwise we've finished reading the file + break; + } + + if ( seekable ) + { + // this shouldn't happen but don't overwrite the buffer if it does + wxCHECK_MSG( bufPos + nRead <= bufSize, false, + _T("read more than file length?") ); + } + else // !seekable + { + // for non-seekable files we have to allocate more memory on the go + if ( !buf.extend(bufPos + nRead - 1 /* it adds 1 internally */) ) + return false; + } + + // append to the buffer + memcpy(buf.data() + bufPos, block, nRead); + bufPos += nRead; + } + + if ( !seekable ) + { + bufSize = bufPos; + } + + const wxString str(buf, conv, bufPos); + + // there's no risk of this happening in ANSI build +#if wxUSE_UNICODE + if ( bufSize > 4 && str.empty() ) + { + wxLogError(_("Failed to convert file \"%s\" to Unicode."), GetName()); + return false; + } +#endif // wxUSE_UNICODE + + free(buf.release()); // we don't need this memory any more + + + // now break the buffer in lines + + // last processed character, we need to know if it was a CR or not + wxChar chLast = '\0'; + + // the beginning of the current line, changes inside the loop + wxString::const_iterator lineStart = str.begin(); + const wxString::const_iterator end = str.end(); + for ( wxString::const_iterator p = lineStart; p != end; p++ ) + { + const wxChar ch = *p; + switch ( ch ) + { + case '\n': + // could be a DOS or Unix EOL + if ( chLast == '\r' ) + { + if ( p - 1 >= lineStart ) + { + AddLine(wxString(lineStart, p - 1), wxTextFileType_Dos); + } + else + { + // there were two line endings, so add an empty line: + AddLine(wxEmptyString, wxTextFileType_Dos); + } + } + else // bare '\n', Unix style + { + AddLine(wxString(lineStart, p), wxTextFileType_Unix); + } + + lineStart = p + 1; + break; + + case '\r': + if ( chLast == '\r' ) + { + if ( p - 1 >= lineStart ) + { + AddLine(wxString(lineStart, p - 1), wxTextFileType_Mac); + } + // Mac empty line + AddLine(wxEmptyString, wxTextFileType_Mac); + lineStart = p + 1; + } + //else: we don't know what this is yet -- could be a Mac EOL or + // start of DOS EOL so wait for next char + break; + + default: + if ( chLast == '\r' ) + { + // Mac line termination + if ( p - 1 >= lineStart ) + { + AddLine(wxString(lineStart, p - 1), wxTextFileType_Mac); + } + else + { + // there were two line endings, so add an empty line: + AddLine(wxEmptyString, wxTextFileType_Mac); + } + lineStart = p; + } + } + + chLast = ch; + } + + // anything in the last line? + if ( lineStart != end ) + { + // add unterminated last line + AddLine(wxString(lineStart, end), wxTextFileType_None); + } + + return true; +} + + +bool wxTextFile::OnWrite(wxTextFileType typeNew, const wxMBConv& conv) +{ + wxFileName fn = m_strBufferName; + + // We do NOT want wxPATH_NORM_CASE here, or the case will not + // be preserved. + if ( !fn.IsAbsolute() ) + fn.Normalize(wxPATH_NORM_ENV_VARS | wxPATH_NORM_DOTS | wxPATH_NORM_TILDE | + wxPATH_NORM_ABSOLUTE | wxPATH_NORM_LONG); + + wxTempFile fileTmp(fn.GetFullPath()); + + if ( !fileTmp.IsOpened() ) { + wxLogError(_("can't write buffer '%s' to disk."), m_strBufferName.c_str()); + return false; + } + + size_t nCount = GetLineCount(); + for ( size_t n = 0; n < nCount; n++ ) { + fileTmp.Write(GetLine(n) + + GetEOL(typeNew == wxTextFileType_None ? GetLineType(n) + : typeNew), + conv); + } + + // replace the old file with this one + return fileTmp.Commit(); +} + +#endif // wxUSE_TEXTFILE diff --git a/Externals/wxWidgets/src/common/timercmn.cpp b/Externals/wxWidgets/src/common/timercmn.cpp new file mode 100644 index 0000000000..dd5fc39c00 --- /dev/null +++ b/Externals/wxWidgets/src/common/timercmn.cpp @@ -0,0 +1,88 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: common/timercmn.cpp +// Purpose: wxTimerBase implementation +// Author: Julian Smart, Guillermo Rodriguez, Vadim Zeitlin +// Modified by: VZ: extracted all non-wxTimer stuff in stopwatch.cpp (20.06.03) +// Created: 04/01/98 +// RCS-ID: $Id: timercmn.cpp 35650 2005-09-23 12:56:45Z MR $ +// Copyright: (c) Julian Smart +// (c) 1999 Guillermo Rodriguez +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxWin headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_TIMER + +#ifndef WX_PRECOMP + #include "wx/timer.h" +#endif + +// ---------------------------------------------------------------------------- +// wxWin macros +// ---------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxTimerEvent, wxEvent) + +// ============================================================================ +// wxTimerBase implementation +// ============================================================================ + +wxTimerBase::~wxTimerBase() +{ + // this destructor is required for Darwin +} + +void wxTimerBase::Notify() +{ + // the base class version generates an event if it has owner - which it + // should because otherwise nobody can process timer events + wxCHECK_RET( m_owner, _T("wxTimer::Notify() should be overridden.") ); + + wxTimerEvent event(m_idTimer, m_milli); + event.SetEventObject(this); + (void)m_owner->ProcessEvent(event); +} + +bool wxTimerBase::Start(int milliseconds, bool oneShot) +{ + // under MSW timers only work when they're started from the main thread so + // let the caller know about it +#if wxUSE_THREADS + wxASSERT_MSG( wxThread::IsMain(), + _T("timer can only be started from the main thread") ); +#endif // wxUSE_THREADS + + if ( IsRunning() ) + { + // not stopping the already running timer might work for some + // platforms (no problems under MSW) but leads to mysterious crashes + // on the others (GTK), so to be on the safe side do it here + Stop(); + } + + if ( milliseconds != -1 ) + { + m_milli = milliseconds; + } + + m_oneShot = oneShot; + + return true; +} + +#endif // wxUSE_TIMER + diff --git a/Externals/wxWidgets/src/common/tokenzr.cpp b/Externals/wxWidgets/src/common/tokenzr.cpp new file mode 100644 index 0000000000..448a6651f0 --- /dev/null +++ b/Externals/wxWidgets/src/common/tokenzr.cpp @@ -0,0 +1,229 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/tokenzr.cpp +// Purpose: String tokenizer +// Author: Guilhem Lavaux +// Modified by: Vadim Zeitlin (almost full rewrite) +// Created: 04/22/98 +// RCS-ID: $Id: tokenzr.cpp 39694 2006-06-13 11:30:40Z ABX $ +// Copyright: (c) Guilhem Lavaux +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#include "wx/tokenzr.h" + +#ifndef WX_PRECOMP + #include "wx/arrstr.h" +#endif + +// Required for wxIs... functions +#include + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxStringTokenizer construction +// ---------------------------------------------------------------------------- + +wxStringTokenizer::wxStringTokenizer(const wxString& str, + const wxString& delims, + wxStringTokenizerMode mode) +{ + SetString(str, delims, mode); +} + +void wxStringTokenizer::SetString(const wxString& str, + const wxString& delims, + wxStringTokenizerMode mode) +{ + if ( mode == wxTOKEN_DEFAULT ) + { + // by default, we behave like strtok() if the delimiters are only + // whitespace characters and as wxTOKEN_RET_EMPTY otherwise (for + // whitespace delimiters, strtok() behaviour is better because we want + // to count consecutive spaces as one delimiter) + const wxChar *p; + for ( p = delims.c_str(); *p; p++ ) + { + if ( !wxIsspace(*p) ) + break; + } + + if ( *p ) + { + // not whitespace char in delims + mode = wxTOKEN_RET_EMPTY; + } + else + { + // only whitespaces + mode = wxTOKEN_STRTOK; + } + } + + m_delims = delims; + m_mode = mode; + + Reinit(str); +} + +void wxStringTokenizer::Reinit(const wxString& str) +{ + wxASSERT_MSG( IsOk(), _T("you should call SetString() first") ); + + m_string = str; + m_pos = 0; + m_lastDelim = _T('\0'); +} + +// ---------------------------------------------------------------------------- +// access to the tokens +// ---------------------------------------------------------------------------- + +// do we have more of them? +bool wxStringTokenizer::HasMoreTokens() const +{ + wxCHECK_MSG( IsOk(), false, _T("you should call SetString() first") ); + + if ( m_string.find_first_not_of(m_delims, m_pos) != wxString::npos ) + { + // there are non delimiter characters left, so we do have more tokens + return true; + } + + switch ( m_mode ) + { + case wxTOKEN_RET_EMPTY: + case wxTOKEN_RET_DELIMS: + // special hack for wxTOKEN_RET_EMPTY: we should return the initial + // empty token even if there are only delimiters after it + return m_pos == 0 && !m_string.empty(); + + case wxTOKEN_RET_EMPTY_ALL: + // special hack for wxTOKEN_RET_EMPTY_ALL: we can know if we had + // already returned the trailing empty token after the last + // delimiter by examining m_lastDelim: it is set to NUL if we run + // up to the end of the string in GetNextToken(), but if it is not + // NUL yet we still have this last token to return even if m_pos is + // already at m_string.length() + return m_pos < m_string.length() || m_lastDelim != _T('\0'); + + case wxTOKEN_INVALID: + case wxTOKEN_DEFAULT: + wxFAIL_MSG( _T("unexpected tokenizer mode") ); + // fall through + + case wxTOKEN_STRTOK: + // never return empty delimiters + break; + } + + return false; +} + +// count the number of (remaining) tokens in the string +size_t wxStringTokenizer::CountTokens() const +{ + wxCHECK_MSG( IsOk(), 0, _T("you should call SetString() first") ); + + // VZ: this function is IMHO not very useful, so it's probably not very + // important if its implementation here is not as efficient as it + // could be -- but OTOH like this we're sure to get the correct answer + // in all modes + wxStringTokenizer tkz(m_string.c_str() + m_pos, m_delims, m_mode); + + size_t count = 0; + while ( tkz.HasMoreTokens() ) + { + count++; + + (void)tkz.GetNextToken(); + } + + return count; +} + +// ---------------------------------------------------------------------------- +// token extraction +// ---------------------------------------------------------------------------- + +wxString wxStringTokenizer::GetNextToken() +{ + wxString token; + do + { + if ( !HasMoreTokens() ) + { + break; + } + + // find the end of this token + size_t pos = m_string.find_first_of(m_delims, m_pos); + + // and the start of the next one + if ( pos == wxString::npos ) + { + // no more delimiters, the token is everything till the end of + // string + token.assign(m_string, m_pos, wxString::npos); + + // skip the token + m_pos = m_string.length(); + + // it wasn't terminated + m_lastDelim = _T('\0'); + } + else // we found a delimiter at pos + { + // in wxTOKEN_RET_DELIMS mode we return the delimiter character + // with token, otherwise leave it out + size_t len = pos - m_pos; + if ( m_mode == wxTOKEN_RET_DELIMS ) + len++; + + token.assign(m_string, m_pos, len); + + // skip the token and the trailing delimiter + m_pos = pos + 1; + + m_lastDelim = m_string[pos]; + } + } + while ( !AllowEmpty() && token.empty() ); + + return token; +} + +// ---------------------------------------------------------------------------- +// public functions +// ---------------------------------------------------------------------------- + +wxArrayString wxStringTokenize(const wxString& str, + const wxString& delims, + wxStringTokenizerMode mode) +{ + wxArrayString tokens; + wxStringTokenizer tk(str, delims, mode); + while ( tk.HasMoreTokens() ) + { + tokens.Add(tk.GetNextToken()); + } + + return tokens; +} diff --git a/Externals/wxWidgets/src/common/toplvcmn.cpp b/Externals/wxWidgets/src/common/toplvcmn.cpp new file mode 100644 index 0000000000..723cbce0ab --- /dev/null +++ b/Externals/wxWidgets/src/common/toplvcmn.cpp @@ -0,0 +1,417 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/toplvcmn.cpp +// Purpose: common (for all platforms) wxTopLevelWindow functions +// Author: Julian Smart, Vadim Zeitlin +// Created: 01/02/97 +// Id: $Id: toplvcmn.cpp 49029 2007-10-04 07:25:26Z SC $ +// Copyright: (c) 1998 Robert Roebling and Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#include "wx/toplevel.h" + +#ifndef WX_PRECOMP + #include "wx/dcclient.h" + #include "wx/app.h" +#endif // WX_PRECOMP + +#include "wx/display.h" + +// ---------------------------------------------------------------------------- +// event table +// ---------------------------------------------------------------------------- + +BEGIN_EVENT_TABLE(wxTopLevelWindowBase, wxWindow) + EVT_CLOSE(wxTopLevelWindowBase::OnCloseWindow) + EVT_SIZE(wxTopLevelWindowBase::OnSize) +END_EVENT_TABLE() + +// ============================================================================ +// implementation +// ============================================================================ + +IMPLEMENT_ABSTRACT_CLASS(wxTopLevelWindow, wxWindow) + +// ---------------------------------------------------------------------------- +// construction/destruction +// ---------------------------------------------------------------------------- + +wxTopLevelWindowBase::wxTopLevelWindowBase() +{ + // Unlike windows, top level windows are created hidden by default. + m_isShown = false; + m_winDefault = NULL; + m_winTmpDefault = NULL; +} + +wxTopLevelWindowBase::~wxTopLevelWindowBase() +{ + // don't let wxTheApp keep any stale pointers to us + if ( wxTheApp && wxTheApp->GetTopWindow() == this ) + wxTheApp->SetTopWindow(NULL); + + wxTopLevelWindows.DeleteObject(this); + + if ( IsLastBeforeExit() ) + { + // no other (important) windows left, quit the app + wxTheApp->ExitMainLoop(); + } +} + +bool wxTopLevelWindowBase::Destroy() +{ + // delayed destruction: the frame will be deleted during the next idle + // loop iteration + if ( !wxPendingDelete.Member(this) ) + wxPendingDelete.Append(this); + +#ifdef __WXMAC__ + // on mac we know that objects will always be deleted after this event + // has been handled, using Hide we avoid erratic redraws during window + // tear down + Hide(); +#else + if (wxTopLevelWindows.GetCount() > 1) + { + // Hide it immediately. This should + // not be done if this TLW is the + // only one left since we then would + // risk not to get any idle events + // at all anymore during which we + // could delete any pending events. + Hide(); + } +#endif + + return true; +} + +bool wxTopLevelWindowBase::IsLastBeforeExit() const +{ + // first of all, automatically exiting the app on last window close can be + // completely disabled at wxTheApp level + if ( !wxTheApp || !wxTheApp->GetExitOnFrameDelete() ) + return false; + + wxWindowList::const_iterator i; + const wxWindowList::const_iterator end = wxTopLevelWindows.end(); + + // then decide whether we should exit at all + for ( i = wxTopLevelWindows.begin(); i != end; ++i ) + { + wxTopLevelWindow * const win = wx_static_cast(wxTopLevelWindow *, *i); + if ( win->ShouldPreventAppExit() ) + { + // there remains at least one important TLW, don't exit + return false; + } + } + + // if yes, close all the other windows: this could still fail + for ( i = wxTopLevelWindows.begin(); i != end; ++i ) + { + // don't close twice the windows which are already marked for deletion + wxTopLevelWindow * const win = wx_static_cast(wxTopLevelWindow *, *i); + if ( !wxPendingDelete.Member(win) && !win->Close() ) + { + // one of the windows refused to close, don't exit + // + // NB: of course, by now some other windows could have been already + // closed but there is really nothing we can do about it as we + // have no way just to ask the window if it can close without + // forcing it to do it + return false; + } + } + + return true; +} + +// ---------------------------------------------------------------------------- +// wxTopLevelWindow geometry +// ---------------------------------------------------------------------------- + +void wxTopLevelWindowBase::SetMinSize(const wxSize& minSize) +{ + SetSizeHints( minSize.x, minSize.y, GetMaxWidth(), GetMaxHeight() ); +} + +void wxTopLevelWindowBase::SetMaxSize(const wxSize& maxSize) +{ + SetSizeHints( GetMinWidth(), GetMinHeight(), maxSize.x, maxSize.y ); +} + +// set the min/max size of the window +void wxTopLevelWindowBase::DoSetSizeHints(int minW, int minH, + int maxW, int maxH, + int WXUNUSED(incW), int WXUNUSED(incH)) +{ + // setting min width greater than max width leads to infinite loops under + // X11 and generally doesn't make any sense, so don't allow it + wxCHECK_RET( (minW == wxDefaultCoord || maxW == wxDefaultCoord || minW <= maxW) && + (minH == wxDefaultCoord || maxH == wxDefaultCoord || minH <= maxH), + _T("min width/height must be less than max width/height!") ); + + m_minWidth = minW; + m_maxWidth = maxW; + m_minHeight = minH; + m_maxHeight = maxH; +} + +void wxTopLevelWindowBase::GetRectForTopLevelChildren(int *x, int *y, int *w, int *h) +{ + GetPosition(x,y); + GetSize(w,h); +} + +/* static */ +wxSize wxTopLevelWindowBase::GetDefaultSize() +{ + wxSize size = wxGetClientDisplayRect().GetSize(); + + // create proportionally bigger windows on small screens + if ( size.x >= 1024 ) + size.x = 400; + else if ( size.x >= 800 ) + size.x = 300; + else if ( size.x >= 320 ) + size.x = 240; + + if ( size.y >= 768 ) + size.y = 250; + else if ( size.y > 200 ) + { + size.y *= 2; + size.y /= 3; + } + + return size; +} + +void wxTopLevelWindowBase::DoCentre(int dir) +{ + // on some platforms centering top level windows is impossible + // because they are always maximized by guidelines or limitations + if(IsAlwaysMaximized()) + return; + + // we need the display rect anyhow so store it first: notice that we should + // be centered on the same display as our parent window, the display of + // this window itself is not really defined yet + int nDisplay = wxDisplay::GetFromWindow(GetParent() ? GetParent() : this); + wxDisplay dpy(nDisplay == wxNOT_FOUND ? 0 : nDisplay); + const wxRect rectDisplay(dpy.GetClientArea()); + + // what should we centre this window on? + wxRect rectParent; + if ( !(dir & wxCENTRE_ON_SCREEN) && GetParent() ) + { + // centre on parent window: notice that we need screen coordinates for + // positioning this TLW + rectParent = GetParent()->GetScreenRect(); + + // if the parent is entirely off screen (happens at least with MDI + // parent frame under Mac but could happen elsewhere too if the frame + // was hidden/moved away for some reason), don't use it as otherwise + // this window wouldn't be visible at all + if ( !rectDisplay.Contains(rectParent.GetTopLeft()) && + !rectParent.Contains(rectParent.GetBottomRight()) ) + { + // this is enough to make IsEmpty() test below pass + rectParent.width = 0; + } + } + + if ( rectParent.IsEmpty() ) + { + // we were explicitely asked to centre this window on the entire screen + // or if we have no parent anyhow and so can't centre on it + rectParent = rectDisplay; + } + + // centering maximized window on screen is no-op + if((rectParent == rectDisplay) && IsMaximized()) + return; + + // the new window rect candidate + wxRect rect = GetRect().CentreIn(rectParent, dir); + + // we don't want to place the window off screen if Centre() is called as + // this is (almost?) never wanted and it would be very difficult to prevent + // it from happening from the user code if we didn't check for it here + if ( !rectDisplay.Contains(rect.GetTopLeft()) ) + { + // move the window just enough to make the corner visible + int dx = rectDisplay.GetLeft() - rect.GetLeft(); + int dy = rectDisplay.GetTop() - rect.GetTop(); + rect.Offset(dx > 0 ? dx : 0, dy > 0 ? dy : 0); + } + + if ( !rectDisplay.Contains(rect.GetBottomRight()) ) + { + // do the same for this corner too + int dx = rectDisplay.GetRight() - rect.GetRight(); + int dy = rectDisplay.GetBottom() - rect.GetBottom(); + rect.Offset(dx < 0 ? dx : 0, dy < 0 ? dy : 0); + } + + // the window top left and bottom right corner are both visible now and + // although the window might still be not entirely on screen (with 2 + // staggered displays for example) we wouldn't be able to improve the + // layout much in such case, so we stop here + + // -1 could be valid coordinate here if there are several displays + SetSize(rect, wxSIZE_ALLOW_MINUS_ONE); +} + +// ---------------------------------------------------------------------------- +// wxTopLevelWindow size management: we exclude the areas taken by +// menu/status/toolbars from the client area, so the client area is what's +// really available for the frame contents +// ---------------------------------------------------------------------------- + +void wxTopLevelWindowBase::DoScreenToClient(int *x, int *y) const +{ + wxWindow::DoScreenToClient(x, y); + + // translate the wxWindow client coords to our client coords + wxPoint pt(GetClientAreaOrigin()); + if ( x ) + *x -= pt.x; + if ( y ) + *y -= pt.y; +} + +void wxTopLevelWindowBase::DoClientToScreen(int *x, int *y) const +{ + // our client area origin (0, 0) may be really something like (0, 30) for + // wxWindow if we have a toolbar, account for it before translating + wxPoint pt(GetClientAreaOrigin()); + if ( x ) + *x += pt.x; + if ( y ) + *y += pt.y; + + wxWindow::DoClientToScreen(x, y); +} + +bool wxTopLevelWindowBase::IsAlwaysMaximized() const +{ +#if defined(__SMARTPHONE__) || defined(__POCKETPC__) + return true; +#else + return false; +#endif +} + +// ---------------------------------------------------------------------------- +// event handlers +// ---------------------------------------------------------------------------- + +// default resizing behaviour - if only ONE subwindow, resize to fill the +// whole client area +void wxTopLevelWindowBase::DoLayout() +{ + // if we're using constraints or sizers - do use them + if ( GetAutoLayout() ) + { + Layout(); + } + else + { + // do we have _exactly_ one child? + wxWindow *child = (wxWindow *)NULL; + for ( wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); + node; + node = node->GetNext() ) + { + wxWindow *win = node->GetData(); + + // exclude top level and managed windows (status bar isn't + // currently in the children list except under wxMac anyhow, but + // it makes no harm to test for it) + if ( !win->IsTopLevel() && !IsOneOfBars(win) ) + { + if ( child ) + { + return; // it's our second subwindow - nothing to do + } + + child = win; + } + } + + // do we have any children at all? + if ( child && child->IsShown() ) + { + // exactly one child - set it's size to fill the whole frame + int clientW, clientH; + DoGetClientSize(&clientW, &clientH); + + child->SetSize(0, 0, clientW, clientH); + } + } +} + +// The default implementation for the close window event. +void wxTopLevelWindowBase::OnCloseWindow(wxCloseEvent& WXUNUSED(event)) +{ + Destroy(); +} + +bool wxTopLevelWindowBase::SendIconizeEvent(bool iconized) +{ + wxIconizeEvent event(GetId(), iconized); + event.SetEventObject(this); + + return GetEventHandler()->ProcessEvent(event); +} + +// do the window-specific processing after processing the update event +void wxTopLevelWindowBase::DoUpdateWindowUI(wxUpdateUIEvent& event) +{ + // call inherited, but skip the wxControl's version, and call directly the + // wxWindow's one instead, because the only reason why we are overriding this + // function is that we want to use SetTitle() instead of wxControl::SetLabel() + wxWindowBase::DoUpdateWindowUI(event); + + // update title + if ( event.GetSetText() ) + { + if ( event.GetText() != GetTitle() ) + SetTitle(event.GetText()); + } +} + +void wxTopLevelWindowBase::RequestUserAttention(int WXUNUSED(flags)) +{ + // it's probably better than do nothing, isn't it? + Raise(); +} + +void wxTopLevelWindowBase::RemoveChild(wxWindowBase *child) +{ + if ( child == m_winDefault ) + m_winDefault = NULL; + + if ( child == m_winTmpDefault ) + m_winTmpDefault = NULL; + + wxWindow::RemoveChild(child); +} diff --git a/Externals/wxWidgets/src/common/treebase.cpp b/Externals/wxWidgets/src/common/treebase.cpp new file mode 100644 index 0000000000..8ab76b76f2 --- /dev/null +++ b/Externals/wxWidgets/src/common/treebase.cpp @@ -0,0 +1,237 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: treebase.cpp +// Purpose: Base wxTreeCtrl classes +// Author: Julian Smart +// Created: 01/02/97 +// Modified: +// Id: $Id: treebase.cpp 44116 2007-01-07 15:02:57Z VZ $ +// Copyright: (c) 1998 Robert Roebling, Julian Smart et al +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================= +// declarations +// ============================================================================= + +// ----------------------------------------------------------------------------- +// headers +// ----------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_TREECTRL + +#include "wx/treectrl.h" +#include "wx/imaglist.h" + +// ---------------------------------------------------------------------------- +// events +// ---------------------------------------------------------------------------- + +DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_BEGIN_DRAG) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_BEGIN_RDRAG) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_BEGIN_LABEL_EDIT) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_END_LABEL_EDIT) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_DELETE_ITEM) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_GET_INFO) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_SET_INFO) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_ITEM_EXPANDED) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_ITEM_EXPANDING) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_ITEM_COLLAPSED) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_ITEM_COLLAPSING) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_SEL_CHANGED) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_SEL_CHANGING) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_KEY_DOWN) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_ITEM_ACTIVATED) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_ITEM_RIGHT_CLICK) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_ITEM_MIDDLE_CLICK) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_END_DRAG) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_STATE_IMAGE_CLICK) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_ITEM_GETTOOLTIP) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_ITEM_MENU) + +// ---------------------------------------------------------------------------- +// Tree event +// ---------------------------------------------------------------------------- + +IMPLEMENT_ABSTRACT_CLASS(wxTreeEvent, wxNotifyEvent) + + +wxTreeEvent::wxTreeEvent(wxEventType commandType, + wxTreeCtrlBase *tree, + const wxTreeItemId& item) + : wxNotifyEvent(commandType, tree->GetId()), + m_item(item) +{ + m_editCancelled = false; + + SetEventObject(tree); + + if ( item.IsOk() ) + SetClientObject(tree->GetItemData(item)); +} + +wxTreeEvent::wxTreeEvent(wxEventType commandType, int id) + : wxNotifyEvent(commandType, id) +{ + m_itemOld = 0l; + m_editCancelled = false; +} + +wxTreeEvent::wxTreeEvent(const wxTreeEvent & event) + : wxNotifyEvent(event) +{ + m_evtKey = event.m_evtKey; + m_item = event.m_item; + m_itemOld = event.m_itemOld; + m_pointDrag = event.m_pointDrag; + m_label = event.m_label; + m_editCancelled = event.m_editCancelled; +} + +// ---------------------------------------------------------------------------- +// wxTreeCtrlBase +// ---------------------------------------------------------------------------- + +wxTreeCtrlBase::~wxTreeCtrlBase() +{ + if (m_ownsImageListNormal) + delete m_imageListNormal; + if (m_ownsImageListState) + delete m_imageListState; +} + +static void +wxGetBestTreeSize(const wxTreeCtrlBase* treeCtrl, wxTreeItemId id, wxSize& size) +{ + wxRect rect; + + if ( treeCtrl->GetBoundingRect(id, rect, true /* just the item */) ) + { + // Translate to logical position so we get the full extent +#if defined(__WXMSW__) && !defined(__WXUNIVERSAL__) + rect.x += treeCtrl->GetScrollPos(wxHORIZONTAL); + rect.y += treeCtrl->GetScrollPos(wxVERTICAL); +#endif + + size.IncTo(wxSize(rect.GetRight(), rect.GetBottom())); + } + + wxTreeItemIdValue cookie; + for ( wxTreeItemId item = treeCtrl->GetFirstChild(id, cookie); + item.IsOk(); + item = treeCtrl->GetNextChild(id, cookie) ) + { + wxGetBestTreeSize(treeCtrl, item, size); + } +} + +wxSize wxTreeCtrlBase::DoGetBestSize() const +{ + wxSize size; + + // this doesn't really compute the total bounding rectangle of all items + // but a not too bad guess of it which has the advantage of not having to + // examine all (potentially hundreds or thousands) items in the control + + if (GetQuickBestSize()) + { + for ( wxTreeItemId item = GetRootItem(); + item.IsOk(); + item = GetLastChild(item) ) + { + wxRect rect; + + // last parameter is "true" to get only the dimensions of the text + // label, we don't want to get the entire item width as it's determined + // by the current size + if ( GetBoundingRect(item, rect, true) ) + { + if ( size.x < rect.x + rect.width ) + size.x = rect.x + rect.width; + if ( size.y < rect.y + rect.height ) + size.y = rect.y + rect.height; + } + } + } + else // use precise, if potentially slow, size computation method + { + // iterate over all items recursively + wxTreeItemId idRoot = GetRootItem(); + if ( idRoot.IsOk() ) + wxGetBestTreeSize(this, idRoot, size); + } + + // need some minimal size even for empty tree + if ( !size.x || !size.y ) + size = wxControl::DoGetBestSize(); + else + { + // Add border size + size += GetWindowBorderSize(); + + CacheBestSize(size); + } + + return size; +} + +void wxTreeCtrlBase::ExpandAll() +{ + if ( IsEmpty() ) + return; + + ExpandAllChildren(GetRootItem()); +} + +void wxTreeCtrlBase::ExpandAllChildren(const wxTreeItemId& item) +{ + // expand this item first, this might result in its children being added on + // the fly + Expand(item); + + // then (recursively) expand all the children + wxTreeItemIdValue cookie; + for ( wxTreeItemId idCurr = GetFirstChild(item, cookie); + idCurr.IsOk(); + idCurr = GetNextChild(item, cookie) ) + { + ExpandAllChildren(idCurr); + } +} + +void wxTreeCtrlBase::CollapseAll() +{ + if ( IsEmpty() ) + return; + + CollapseAllChildren(GetRootItem()); +} + +void wxTreeCtrlBase::CollapseAllChildren(const wxTreeItemId& item) +{ + // first (recursively) collapse all the children + wxTreeItemIdValue cookie; + for ( wxTreeItemId idCurr = GetFirstChild(item, cookie); + idCurr.IsOk(); + idCurr = GetNextChild(item, cookie) ) + { + CollapseAllChildren(idCurr); + } + + // then collapse this element too + Collapse(item); +} + +bool wxTreeCtrlBase::IsEmpty() const +{ + return !GetRootItem().IsOk(); +} + +#endif // wxUSE_TREECTRL + diff --git a/Externals/wxWidgets/src/common/txtstrm.cpp b/Externals/wxWidgets/src/common/txtstrm.cpp new file mode 100644 index 0000000000..0da50befdc --- /dev/null +++ b/Externals/wxWidgets/src/common/txtstrm.cpp @@ -0,0 +1,520 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/common/txtstrm.cpp +// Purpose: Text stream classes +// Author: Guilhem Lavaux +// Modified by: +// Created: 28/06/98 +// RCS-ID: $Id: txtstrm.cpp 48920 2007-09-24 13:11:36Z JS $ +// Copyright: (c) Guilhem Lavaux +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_STREAMS + +#include "wx/txtstrm.h" +#include + + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// Unix: "\n" +// Dos: "\r\n" +// Mac: "\r" + +// ---------------------------------------------------------------------------- +// wxTextInputStream +// ---------------------------------------------------------------------------- + +#if wxUSE_UNICODE +wxTextInputStream::wxTextInputStream(wxInputStream &s, + const wxString &sep, + const wxMBConv& conv) + : m_input(s), m_separators(sep), m_conv(conv.Clone()) +{ + memset((void*)m_lastBytes, 0, 10); +} +#else +wxTextInputStream::wxTextInputStream(wxInputStream &s, const wxString &sep) + : m_input(s), m_separators(sep) +{ + memset((void*)m_lastBytes, 0, 10); +} +#endif + +wxTextInputStream::~wxTextInputStream() +{ +#if wxUSE_UNICODE + delete m_conv; +#endif // wxUSE_UNICODE +} + +void wxTextInputStream::UngetLast() +{ + size_t byteCount = 0; + while(m_lastBytes[byteCount]) // pseudo ANSI strlen (even for Unicode!) + byteCount++; + m_input.Ungetch(m_lastBytes, byteCount); + memset((void*)m_lastBytes, 0, 10); +} + +wxChar wxTextInputStream::NextChar() +{ +#if wxUSE_UNICODE + wxChar wbuf[2]; + memset((void*)m_lastBytes, 0, 10); + for(size_t inlen = 0; inlen < 9; inlen++) + { + // actually read the next character + m_lastBytes[inlen] = m_input.GetC(); + + if(m_input.LastRead() <= 0) + return wxEOT; + + if ( m_conv->ToWChar(wbuf, WXSIZEOF(wbuf), m_lastBytes, inlen + 1) + != wxCONV_FAILED ) + return wbuf[0]; + } + // there should be no encoding which requires more than nine bytes for one character... + return wxEOT; +#else + m_lastBytes[0] = m_input.GetC(); + + if(m_input.LastRead() <= 0) + return wxEOT; + + return m_lastBytes[0]; +#endif + +} + +wxChar wxTextInputStream::NextNonSeparators() +{ + for (;;) + { + wxChar c = NextChar(); + if (c == wxEOT) return (wxChar) 0; + + if (c != wxT('\n') && + c != wxT('\r') && + !m_separators.Contains(c)) + return c; + } + +} + +bool wxTextInputStream::EatEOL(const wxChar &c) +{ + if (c == wxT('\n')) return true; // eat on UNIX + + if (c == wxT('\r')) // eat on both Mac and DOS + { + wxChar c2 = NextChar(); + if(c2 == wxEOT) return true; // end of stream reached, had enough :-) + + if (c2 != wxT('\n')) UngetLast(); // Don't eat on Mac + return true; + } + + return false; +} + +wxUint32 wxTextInputStream::Read32(int base) +{ + wxASSERT_MSG( !base || (base > 1 && base <= 36), _T("invalid base") ); + if(!m_input) return 0; + + wxString word = ReadWord(); + if(word.empty()) + return 0; + return wxStrtoul(word.c_str(), 0, base); +} + +wxUint16 wxTextInputStream::Read16(int base) +{ + return (wxUint16)Read32(base); +} + +wxUint8 wxTextInputStream::Read8(int base) +{ + return (wxUint8)Read32(base); +} + +wxInt32 wxTextInputStream::Read32S(int base) +{ + wxASSERT_MSG( !base || (base > 1 && base <= 36), _T("invalid base") ); + if(!m_input) return 0; + + wxString word = ReadWord(); + if(word.empty()) + return 0; + return wxStrtol(word.c_str(), 0, base); +} + +wxInt16 wxTextInputStream::Read16S(int base) +{ + return (wxInt16)Read32S(base); +} + +wxInt8 wxTextInputStream::Read8S(int base) +{ + return (wxInt8)Read32S(base); +} + +double wxTextInputStream::ReadDouble() +{ + if(!m_input) return 0; + wxString word = ReadWord(); + if(word.empty()) + return 0; + return wxStrtod(word.c_str(), 0); +} + +#if WXWIN_COMPATIBILITY_2_6 + +wxString wxTextInputStream::ReadString() +{ + return ReadLine(); +} + +#endif // WXWIN_COMPATIBILITY_2_6 + +wxString wxTextInputStream::ReadLine() +{ + wxString line; + + while ( !m_input.Eof() ) + { + wxChar c = NextChar(); + if(c == wxEOT) + break; + + if (EatEOL(c)) + break; + + line += c; + } + + return line; +} + +wxString wxTextInputStream::ReadWord() +{ + wxString word; + + if ( !m_input ) + return word; + + wxChar c = NextNonSeparators(); + if ( !c ) + return word; + + word += c; + + while ( !m_input.Eof() ) + { + c = NextChar(); + if(c == wxEOT) + break; + + if (m_separators.Contains(c)) + break; + + if (EatEOL(c)) + break; + + word += c; + } + + return word; +} + +wxTextInputStream& wxTextInputStream::operator>>(wxString& word) +{ + word = ReadWord(); + return *this; +} + +wxTextInputStream& wxTextInputStream::operator>>(char& c) +{ + c = m_input.GetC(); + if(m_input.LastRead() <= 0) c = 0; + + if (EatEOL(c)) + c = '\n'; + + return *this; +} + +#if wxUSE_UNICODE && wxWCHAR_T_IS_REAL_TYPE + +wxTextInputStream& wxTextInputStream::operator>>(wchar_t& wc) +{ + wc = GetChar(); + + return *this; +} + +#endif // wxUSE_UNICODE + +wxTextInputStream& wxTextInputStream::operator>>(wxInt16& i) +{ + i = (wxInt16)Read16(); + return *this; +} + +wxTextInputStream& wxTextInputStream::operator>>(wxInt32& i) +{ + i = (wxInt32)Read32(); + return *this; +} + +wxTextInputStream& wxTextInputStream::operator>>(wxUint16& i) +{ + i = Read16(); + return *this; +} + +wxTextInputStream& wxTextInputStream::operator>>(wxUint32& i) +{ + i = Read32(); + return *this; +} + +wxTextInputStream& wxTextInputStream::operator>>(double& i) +{ + i = ReadDouble(); + return *this; +} + +wxTextInputStream& wxTextInputStream::operator>>(float& f) +{ + f = (float)ReadDouble(); + return *this; +} + + + +#if wxUSE_UNICODE +wxTextOutputStream::wxTextOutputStream(wxOutputStream& s, + wxEOL mode, + const wxMBConv& conv) + : m_output(s), m_conv(conv.Clone()) +#else +wxTextOutputStream::wxTextOutputStream(wxOutputStream& s, wxEOL mode) + : m_output(s) +#endif +{ + m_mode = mode; + if (m_mode == wxEOL_NATIVE) + { +#if defined(__WXMSW__) || defined(__WXPM__) + m_mode = wxEOL_DOS; +#elif defined(__WXMAC__) && !defined(__DARWIN__) + m_mode = wxEOL_MAC; +#else + m_mode = wxEOL_UNIX; +#endif + } +} + +wxTextOutputStream::~wxTextOutputStream() +{ +#if wxUSE_UNICODE + delete m_conv; +#endif // wxUSE_UNICODE +} + +void wxTextOutputStream::SetMode(wxEOL mode) +{ + m_mode = mode; + if (m_mode == wxEOL_NATIVE) + { +#if defined(__WXMSW__) || defined(__WXPM__) + m_mode = wxEOL_DOS; +#elif defined(__WXMAC__) && !defined(__DARWIN__) + m_mode = wxEOL_MAC; +#else + m_mode = wxEOL_UNIX; +#endif + } +} + +void wxTextOutputStream::Write32(wxUint32 i) +{ + wxString str; + str.Printf(wxT("%u"), i); + + WriteString(str); +} + +void wxTextOutputStream::Write16(wxUint16 i) +{ + wxString str; + str.Printf(wxT("%u"), (unsigned)i); + + WriteString(str); +} + +void wxTextOutputStream::Write8(wxUint8 i) +{ + wxString str; + str.Printf(wxT("%u"), (unsigned)i); + + WriteString(str); +} + +void wxTextOutputStream::WriteDouble(double d) +{ + wxString str; + + str.Printf(wxT("%f"), d); + WriteString(str); +} + +void wxTextOutputStream::WriteString(const wxString& string) +{ + size_t len = string.length(); + + wxString out; + out.reserve(len); + + for ( size_t i = 0; i < len; i++ ) + { + const wxChar c = string[i]; + if ( c == wxT('\n') ) + { + switch ( m_mode ) + { + case wxEOL_DOS: + out << _T("\r\n"); + continue; + + case wxEOL_MAC: + out << _T('\r'); + continue; + + default: + wxFAIL_MSG( _T("unknown EOL mode in wxTextOutputStream") ); + // fall through + + case wxEOL_UNIX: + // don't treat '\n' specially + ; + } + } + + out << c; + } + +#if wxUSE_UNICODE + wxCharBuffer buffer = m_conv->cWC2MB(out, out.length(), &len); + m_output.Write(buffer, len); +#else + m_output.Write(out.c_str(), out.length() ); +#endif +} + +wxTextOutputStream& wxTextOutputStream::PutChar(wxChar c) +{ +#if wxUSE_UNICODE + WriteString( wxString(&c, *m_conv, 1) ); +#else + WriteString( wxString(&c, wxConvLocal, 1) ); +#endif + return *this; +} + +wxTextOutputStream& wxTextOutputStream::operator<<(const wxChar *string) +{ + WriteString( wxString(string) ); + return *this; +} + +wxTextOutputStream& wxTextOutputStream::operator<<(const wxString& string) +{ + WriteString( string ); + return *this; +} + +wxTextOutputStream& wxTextOutputStream::operator<<(char c) +{ + WriteString( wxString::FromAscii(c) ); + + return *this; +} + +#if wxUSE_UNICODE && wxWCHAR_T_IS_REAL_TYPE + +wxTextOutputStream& wxTextOutputStream::operator<<(wchar_t wc) +{ + WriteString( wxString(&wc, *m_conv, 1) ); + + return *this; +} + +#endif // wxUSE_UNICODE + +wxTextOutputStream& wxTextOutputStream::operator<<(wxInt16 c) +{ + wxString str; + str.Printf(wxT("%d"), (signed int)c); + WriteString(str); + + return *this; +} + +wxTextOutputStream& wxTextOutputStream::operator<<(wxInt32 c) +{ + wxString str; + str.Printf(wxT("%ld"), (signed long)c); + WriteString(str); + + return *this; +} + +wxTextOutputStream& wxTextOutputStream::operator<<(wxUint16 c) +{ + wxString str; + str.Printf(wxT("%u"), (unsigned int)c); + WriteString(str); + + return *this; +} + +wxTextOutputStream& wxTextOutputStream::operator<<(wxUint32 c) +{ + wxString str; + str.Printf(wxT("%lu"), (unsigned long)c); + WriteString(str); + + return *this; +} + +wxTextOutputStream &wxTextOutputStream::operator<<(double f) +{ + WriteDouble(f); + return *this; +} + +wxTextOutputStream& wxTextOutputStream::operator<<(float f) +{ + WriteDouble((double)f); + return *this; +} + +wxTextOutputStream &endl( wxTextOutputStream &stream ) +{ + return stream.PutChar(wxT('\n')); +} + +#endif + // wxUSE_STREAMS diff --git a/Externals/wxWidgets/src/common/unictabl.inc b/Externals/wxWidgets/src/common/unictabl.inc new file mode 100644 index 0000000000..13ee276afb --- /dev/null +++ b/Externals/wxWidgets/src/common/unictabl.inc @@ -0,0 +1,872 @@ + + +/* + * This file is #included by encconv.cpp + * + * CVS-ID: $Id: unictabl.inc 40398 2006-07-31 16:28:43Z VS $ + * + * *** *** CAUTION! *** *** + * Do not modify this file by hand! It is generated by shell + * script $(WXWIN)/misc/unictabl/regenerate + * + * Parts of this file are based on tables published by Unicode, Inc. + * Original tables are freely available at + * ftp://ftp.unicode.org/Public/MAPPINGS + * + * Original copyright info as present in mapping tables follows: + * + * + * Copyright (c) 1991-1999 Unicode, Inc. All Rights reserved. + * + * This file is provided as-is by Unicode, Inc. (The Unicode Consortium). + * No claims are made as to fitness for any particular purpose. No + * warranties of any kind are expressed or implied. The recipient + * agrees to determine applicability of information provided. If this + * file has been provided on optical media by Unicode, Inc., the sole + * remedy for any claim will be exchange of defective media within 90 + * days of receipt. + * + * Unicode, Inc. hereby grants the right to freely use the information + * supplied in this file in the creation of products supporting the + * Unicode Standard, and to make copies of this file in any form for + * internal or external distribution as long as this notice remains + * attached. + */ + + + + +/* + * ISO8859_1 to Unicode recoding table + * based on file mappings/8859-1.TXT by Unicode Consortium + */ + +static const wxUint16 encoding_table__ISO8859_1[128] = { + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, + 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, + 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, + 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, + 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, + 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, + 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF, + 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, + 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, + 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, + 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF + }; + + +/* + * ISO8859_10 to Unicode recoding table + * based on file mappings/8859-10.TXT by Unicode Consortium + */ + +static const wxUint16 encoding_table__ISO8859_10[128] = { + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, + 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, + 0x00A0, 0x0104, 0x0112, 0x0122, 0x012A, 0x0128, 0x0136, 0x00A7, + 0x013B, 0x0110, 0x0160, 0x0166, 0x017D, 0x00AD, 0x016A, 0x014A, + 0x00B0, 0x0105, 0x0113, 0x0123, 0x012B, 0x0129, 0x0137, 0x00B7, + 0x013C, 0x0111, 0x0161, 0x0167, 0x017E, 0x2015, 0x016B, 0x014B, + 0x0100, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x012E, + 0x010C, 0x00C9, 0x0118, 0x00CB, 0x0116, 0x00CD, 0x00CE, 0x00CF, + 0x00D0, 0x0145, 0x014C, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x0168, + 0x00D8, 0x0172, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF, + 0x0101, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x012F, + 0x010D, 0x00E9, 0x0119, 0x00EB, 0x0117, 0x00ED, 0x00EE, 0x00EF, + 0x00F0, 0x0146, 0x014D, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x0169, + 0x00F8, 0x0173, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x0138 + }; + + +/* + * ISO8859_13 to Unicode recoding table + * based on file mappings/8859-13.TXT by Unicode Consortium + */ + +static const wxUint16 encoding_table__ISO8859_13[128] = { + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, + 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, + 0x00A0, 0x201D, 0x00A2, 0x00A3, 0x00A4, 0x201E, 0x00A6, 0x00A7, + 0x00D8, 0x00A9, 0x0156, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00C6, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x201C, 0x00B5, 0x00B6, 0x00B7, + 0x00F8, 0x00B9, 0x0157, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00E6, + 0x0104, 0x012E, 0x0100, 0x0106, 0x00C4, 0x00C5, 0x0118, 0x0112, + 0x010C, 0x00C9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012A, 0x013B, + 0x0160, 0x0143, 0x0145, 0x00D3, 0x014C, 0x00D5, 0x00D6, 0x00D7, + 0x0172, 0x0141, 0x015A, 0x016A, 0x00DC, 0x017B, 0x017D, 0x00DF, + 0x0105, 0x012F, 0x0101, 0x0107, 0x00E4, 0x00E5, 0x0119, 0x0113, + 0x010D, 0x00E9, 0x017A, 0x0117, 0x0123, 0x0137, 0x012B, 0x013C, + 0x0161, 0x0144, 0x0146, 0x00F3, 0x014D, 0x00F5, 0x00F6, 0x00F7, + 0x0173, 0x0142, 0x015B, 0x016B, 0x00FC, 0x017C, 0x017E, 0x2019 + }; + + +/* + * ISO8859_14 to Unicode recoding table + * based on file mappings/8859-14.TXT by Unicode Consortium + */ + +static const wxUint16 encoding_table__ISO8859_14[128] = { + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, + 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, + 0x00A0, 0x1E02, 0x1E03, 0x00A3, 0x010A, 0x010B, 0x1E0A, 0x00A7, + 0x1E80, 0x00A9, 0x1E82, 0x1E0B, 0x1EF2, 0x00AD, 0x00AE, 0x0178, + 0x1E1E, 0x1E1F, 0x0120, 0x0121, 0x1E40, 0x1E41, 0x00B6, 0x1E56, + 0x1E81, 0x1E57, 0x1E83, 0x1E60, 0x1EF3, 0x1E84, 0x1E85, 0x1E61, + 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, + 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, + 0x0174, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x1E6A, + 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x0176, 0x00DF, + 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, + 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, + 0x0175, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x1E6B, + 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x0177, 0x00FF + }; + + +/* + * ISO8859_15 to Unicode recoding table + * based on file mappings/8859-15.TXT by Unicode Consortium + */ + +static const wxUint16 encoding_table__ISO8859_15[128] = { + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, + 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, + 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x20AC, 0x00A5, 0x0160, 0x00A7, + 0x0161, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x017D, 0x00B5, 0x00B6, 0x00B7, + 0x017E, 0x00B9, 0x00BA, 0x00BB, 0x0152, 0x0153, 0x0178, 0x00BF, + 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, + 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, + 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, + 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF, + 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, + 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, + 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, + 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF + }; + + +/* + * ISO8859_2 to Unicode recoding table + * based on file mappings/8859-2.TXT by Unicode Consortium + */ + +static const wxUint16 encoding_table__ISO8859_2[128] = { + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, + 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, + 0x00A0, 0x0104, 0x02D8, 0x0141, 0x00A4, 0x013D, 0x015A, 0x00A7, + 0x00A8, 0x0160, 0x015E, 0x0164, 0x0179, 0x00AD, 0x017D, 0x017B, + 0x00B0, 0x0105, 0x02DB, 0x0142, 0x00B4, 0x013E, 0x015B, 0x02C7, + 0x00B8, 0x0161, 0x015F, 0x0165, 0x017A, 0x02DD, 0x017E, 0x017C, + 0x0154, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0139, 0x0106, 0x00C7, + 0x010C, 0x00C9, 0x0118, 0x00CB, 0x011A, 0x00CD, 0x00CE, 0x010E, + 0x0110, 0x0143, 0x0147, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x00D7, + 0x0158, 0x016E, 0x00DA, 0x0170, 0x00DC, 0x00DD, 0x0162, 0x00DF, + 0x0155, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x013A, 0x0107, 0x00E7, + 0x010D, 0x00E9, 0x0119, 0x00EB, 0x011B, 0x00ED, 0x00EE, 0x010F, + 0x0111, 0x0144, 0x0148, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x00F7, + 0x0159, 0x016F, 0x00FA, 0x0171, 0x00FC, 0x00FD, 0x0163, 0x02D9 + }; + + +/* + * ISO8859_3 to Unicode recoding table + * based on file mappings/8859-3.TXT by Unicode Consortium + */ + +static const wxUint16 encoding_table__ISO8859_3[128] = { + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, + 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, + 0x00A0, 0x0126, 0x02D8, 0x00A3, 0x00A4, 0x0000, 0x0124, 0x00A7, + 0x00A8, 0x0130, 0x015E, 0x011E, 0x0134, 0x00AD, 0x0000, 0x017B, + 0x00B0, 0x0127, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x0125, 0x00B7, + 0x00B8, 0x0131, 0x015F, 0x011F, 0x0135, 0x00BD, 0x0000, 0x017C, + 0x00C0, 0x00C1, 0x00C2, 0x0000, 0x00C4, 0x010A, 0x0108, 0x00C7, + 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, + 0x0000, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x0120, 0x00D6, 0x00D7, + 0x011C, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x016C, 0x015C, 0x00DF, + 0x00E0, 0x00E1, 0x00E2, 0x0000, 0x00E4, 0x010B, 0x0109, 0x00E7, + 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, + 0x0000, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x0121, 0x00F6, 0x00F7, + 0x011D, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x016D, 0x015D, 0x02D9 + }; + + +/* + * ISO8859_4 to Unicode recoding table + * based on file mappings/8859-4.TXT by Unicode Consortium + */ + +static const wxUint16 encoding_table__ISO8859_4[128] = { + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, + 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, + 0x00A0, 0x0104, 0x0138, 0x0156, 0x00A4, 0x0128, 0x013B, 0x00A7, + 0x00A8, 0x0160, 0x0112, 0x0122, 0x0166, 0x00AD, 0x017D, 0x00AF, + 0x00B0, 0x0105, 0x02DB, 0x0157, 0x00B4, 0x0129, 0x013C, 0x02C7, + 0x00B8, 0x0161, 0x0113, 0x0123, 0x0167, 0x014A, 0x017E, 0x014B, + 0x0100, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x012E, + 0x010C, 0x00C9, 0x0118, 0x00CB, 0x0116, 0x00CD, 0x00CE, 0x012A, + 0x0110, 0x0145, 0x014C, 0x0136, 0x00D4, 0x00D5, 0x00D6, 0x00D7, + 0x00D8, 0x0172, 0x00DA, 0x00DB, 0x00DC, 0x0168, 0x016A, 0x00DF, + 0x0101, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x012F, + 0x010D, 0x00E9, 0x0119, 0x00EB, 0x0117, 0x00ED, 0x00EE, 0x012B, + 0x0111, 0x0146, 0x014D, 0x0137, 0x00F4, 0x00F5, 0x00F6, 0x00F7, + 0x00F8, 0x0173, 0x00FA, 0x00FB, 0x00FC, 0x0169, 0x016B, 0x02D9 + }; + + +/* + * ISO8859_5 to Unicode recoding table + * based on file mappings/8859-5.TXT by Unicode Consortium + */ + +static const wxUint16 encoding_table__ISO8859_5[128] = { + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, + 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, + 0x00A0, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407, + 0x0408, 0x0409, 0x040A, 0x040B, 0x040C, 0x00AD, 0x040E, 0x040F, + 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, + 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, + 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, + 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, + 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, + 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, + 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, + 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, + 0x2116, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457, + 0x0458, 0x0459, 0x045A, 0x045B, 0x045C, 0x00A7, 0x045E, 0x045F + }; + + +/* + * ISO8859_6 to Unicode recoding table + * based on file mappings/8859-6.TXT by Unicode Consortium + */ + +static const wxUint16 encoding_table__ISO8859_6[128] = { + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, + 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, + 0x00A0, 0x0000, 0x0000, 0x0000, 0x00A4, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x060C, 0x00AD, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x061B, 0x0000, 0x0000, 0x0000, 0x061F, + 0x0000, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, + 0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F, + 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x0637, + 0x0638, 0x0639, 0x063A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0640, 0x0641, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647, + 0x0648, 0x0649, 0x064A, 0x064B, 0x064C, 0x064D, 0x064E, 0x064F, + 0x0650, 0x0651, 0x0652, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 + }; + + +/* + * ISO8859_7 to Unicode recoding table + * based on file mappings/8859-7.TXT by Unicode Consortium + */ + +static const wxUint16 encoding_table__ISO8859_7[128] = { + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, + 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, + 0x00A0, 0x2018, 0x2019, 0x00A3, 0x0000, 0x0000, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x0000, 0x00AB, 0x00AC, 0x00AD, 0x0000, 0x2015, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x0384, 0x0385, 0x0386, 0x00B7, + 0x0388, 0x0389, 0x038A, 0x00BB, 0x038C, 0x00BD, 0x038E, 0x038F, + 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, + 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, + 0x03A0, 0x03A1, 0x0000, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, + 0x03A8, 0x03A9, 0x03AA, 0x03AB, 0x03AC, 0x03AD, 0x03AE, 0x03AF, + 0x03B0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, + 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, + 0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, + 0x03C8, 0x03C9, 0x03CA, 0x03CB, 0x03CC, 0x03CD, 0x03CE, 0x0000 + }; + + +/* + * ISO8859_8 to Unicode recoding table + * based on file mappings/8859-8.TXT by Unicode Consortium + */ + +static const wxUint16 encoding_table__ISO8859_8[128] = { + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, + 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, + 0x00A0, 0x0000, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x00D7, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x203E, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x00B9, 0x00F7, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2017, + 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, + 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF, + 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7, + 0x05E8, 0x05E9, 0x05EA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 + }; + + +/* + * ISO8859_9 to Unicode recoding table + * based on file mappings/8859-9.TXT by Unicode Consortium + */ + +static const wxUint16 encoding_table__ISO8859_9[128] = { + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, + 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, + 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, + 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, + 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, + 0x011E, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, + 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x0130, 0x015E, 0x00DF, + 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, + 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, + 0x011F, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, + 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0131, 0x015F, 0x00FF + }; + + +/* + * CP1250 to Unicode recoding table + * based on file mappings/CP1250.TXT by Unicode Consortium + */ + +static const wxUint16 encoding_table__CP1250[128] = { + 0x20AC, 0x0000, 0x201A, 0x0000, 0x201E, 0x2026, 0x2020, 0x2021, + 0x0000, 0x2030, 0x0160, 0x2039, 0x015A, 0x0164, 0x017D, 0x0179, + 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x0000, 0x2122, 0x0161, 0x203A, 0x015B, 0x0165, 0x017E, 0x017A, + 0x00A0, 0x02C7, 0x02D8, 0x0141, 0x00A4, 0x0104, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x015E, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x017B, + 0x00B0, 0x00B1, 0x02DB, 0x0142, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x0105, 0x015F, 0x00BB, 0x013D, 0x02DD, 0x013E, 0x017C, + 0x0154, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0139, 0x0106, 0x00C7, + 0x010C, 0x00C9, 0x0118, 0x00CB, 0x011A, 0x00CD, 0x00CE, 0x010E, + 0x0110, 0x0143, 0x0147, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x00D7, + 0x0158, 0x016E, 0x00DA, 0x0170, 0x00DC, 0x00DD, 0x0162, 0x00DF, + 0x0155, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x013A, 0x0107, 0x00E7, + 0x010D, 0x00E9, 0x0119, 0x00EB, 0x011B, 0x00ED, 0x00EE, 0x010F, + 0x0111, 0x0144, 0x0148, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x00F7, + 0x0159, 0x016F, 0x00FA, 0x0171, 0x00FC, 0x00FD, 0x0163, 0x02D9 + }; + + +/* + * CP1251 to Unicode recoding table + * based on file mappings/CP1251.TXT by Unicode Consortium + */ + +static const wxUint16 encoding_table__CP1251[128] = { + 0x0402, 0x0403, 0x201A, 0x0453, 0x201E, 0x2026, 0x2020, 0x2021, + 0x20AC, 0x2030, 0x0409, 0x2039, 0x040A, 0x040C, 0x040B, 0x040F, + 0x0452, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x0000, 0x2122, 0x0459, 0x203A, 0x045A, 0x045C, 0x045B, 0x045F, + 0x00A0, 0x040E, 0x045E, 0x0408, 0x00A4, 0x0490, 0x00A6, 0x00A7, + 0x0401, 0x00A9, 0x0404, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x0407, + 0x00B0, 0x00B1, 0x0406, 0x0456, 0x0491, 0x00B5, 0x00B6, 0x00B7, + 0x0451, 0x2116, 0x0454, 0x00BB, 0x0458, 0x0405, 0x0455, 0x0457, + 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, + 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, + 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, + 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, + 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, + 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, + 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, + 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F + }; + + +/* + * CP1252 to Unicode recoding table + * based on file mappings/CP1252.TXT by Unicode Consortium + */ + +static const wxUint16 encoding_table__CP1252[128] = { + 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, + 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0000, 0x017D, 0x0000, + 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x0000, 0x017E, 0x0178, + 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, + 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, + 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, + 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, + 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF, + 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, + 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, + 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, + 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF + }; + + +/* + * CP1253 to Unicode recoding table + * based on file mappings/CP1253.TXT by Unicode Consortium + */ + +static const wxUint16 encoding_table__CP1253[128] = { + 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, + 0x0000, 0x2030, 0x0000, 0x2039, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x0000, 0x2122, 0x0000, 0x203A, 0x0000, 0x0000, 0x0000, 0x0000, + 0x00A0, 0x0385, 0x0386, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x0000, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x2015, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x0384, 0x00B5, 0x00B6, 0x00B7, + 0x0388, 0x0389, 0x038A, 0x00BB, 0x038C, 0x00BD, 0x038E, 0x038F, + 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, + 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, + 0x03A0, 0x03A1, 0x0000, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, + 0x03A8, 0x03A9, 0x03AA, 0x03AB, 0x03AC, 0x03AD, 0x03AE, 0x03AF, + 0x03B0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, + 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, + 0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, + 0x03C8, 0x03C9, 0x03CA, 0x03CB, 0x03CC, 0x03CD, 0x03CE, 0x0000 + }; + + +/* + * CP1254 to Unicode recoding table + * based on file mappings/CP1254.TXT by Unicode Consortium + */ + +static const wxUint16 encoding_table__CP1254[128] = { + 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, + 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0000, 0x0000, 0x0000, + 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x0000, 0x0000, 0x0178, + 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, + 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, + 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, + 0x011E, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, + 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x0130, 0x015E, 0x00DF, + 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, + 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, + 0x011F, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, + 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0131, 0x015F, 0x00FF + }; + + +/* + * CP1255 to Unicode recoding table + * based on file mappings/CP1255.TXT by Unicode Consortium + */ + +static const wxUint16 encoding_table__CP1255[128] = { + 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, + 0x02C6, 0x2030, 0x0000, 0x2039, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x02DC, 0x2122, 0x0000, 0x203A, 0x0000, 0x0000, 0x0000, 0x0000, + 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x20AA, 0x00A5, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x00D7, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x00B9, 0x00F7, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, + 0x05B0, 0x05B1, 0x05B2, 0x05B3, 0x05B4, 0x05B5, 0x05B6, 0x05B7, + 0x05B8, 0x05B9, 0x0000, 0x05BB, 0x05BC, 0x05BD, 0x05BE, 0x05BF, + 0x05C0, 0x05C1, 0x05C2, 0x05C3, 0x05F0, 0x05F1, 0x05F2, 0x05F3, + 0x05F4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, + 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF, + 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7, + 0x05E8, 0x05E9, 0x05EA, 0x0000, 0x0000, 0x200E, 0x200F, 0x0000 + }; + + +/* + * CP1256 to Unicode recoding table + * based on file mappings/CP1256.TXT by Unicode Consortium + */ + +static const wxUint16 encoding_table__CP1256[128] = { + 0x20AC, 0x067E, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, + 0x02C6, 0x2030, 0x0679, 0x2039, 0x0152, 0x0686, 0x0698, 0x0688, + 0x06AF, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x06A9, 0x2122, 0x0691, 0x203A, 0x0153, 0x200C, 0x200D, 0x06BA, + 0x00A0, 0x060C, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x06BE, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x00B9, 0x061B, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x061F, + 0x06C1, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, + 0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F, + 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x00D7, + 0x0637, 0x0638, 0x0639, 0x063A, 0x0640, 0x0641, 0x0642, 0x0643, + 0x00E0, 0x0644, 0x00E2, 0x0645, 0x0646, 0x0647, 0x0648, 0x00E7, + 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x0649, 0x064A, 0x00EE, 0x00EF, + 0x064B, 0x064C, 0x064D, 0x064E, 0x00F4, 0x064F, 0x0650, 0x00F7, + 0x0651, 0x00F9, 0x0652, 0x00FB, 0x00FC, 0x200E, 0x200F, 0x06D2 + }; + + +/* + * CP1257 to Unicode recoding table + * based on file mappings/CP1257.TXT by Unicode Consortium + */ + +static const wxUint16 encoding_table__CP1257[128] = { + 0x20AC, 0x0000, 0x201A, 0x0000, 0x201E, 0x2026, 0x2020, 0x2021, + 0x0000, 0x2030, 0x0000, 0x2039, 0x0000, 0x00A8, 0x02C7, 0x00B8, + 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x0000, 0x2122, 0x0000, 0x203A, 0x0000, 0x00AF, 0x02DB, 0x0000, + 0x00A0, 0x0000, 0x00A2, 0x00A3, 0x00A4, 0x0000, 0x00A6, 0x00A7, + 0x00D8, 0x00A9, 0x0156, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00C6, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00F8, 0x00B9, 0x0157, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00E6, + 0x0104, 0x012E, 0x0100, 0x0106, 0x00C4, 0x00C5, 0x0118, 0x0112, + 0x010C, 0x00C9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012A, 0x013B, + 0x0160, 0x0143, 0x0145, 0x00D3, 0x014C, 0x00D5, 0x00D6, 0x00D7, + 0x0172, 0x0141, 0x015A, 0x016A, 0x00DC, 0x017B, 0x017D, 0x00DF, + 0x0105, 0x012F, 0x0101, 0x0107, 0x00E4, 0x00E5, 0x0119, 0x0113, + 0x010D, 0x00E9, 0x017A, 0x0117, 0x0123, 0x0137, 0x012B, 0x013C, + 0x0161, 0x0144, 0x0146, 0x00F3, 0x014D, 0x00F5, 0x00F6, 0x00F7, + 0x0173, 0x0142, 0x015B, 0x016B, 0x00FC, 0x017C, 0x017E, 0x02D9 + }; + + +/* + * KOI8 to Unicode recoding table + * based on file mappings/KOI8-R.TXT by Unicode Consortium + */ + +static const wxUint16 encoding_table__KOI8[128] = { + 0x2500, 0x2502, 0x250C, 0x2510, 0x2514, 0x2518, 0x251C, 0x2524, + 0x252C, 0x2534, 0x253C, 0x2580, 0x2584, 0x2588, 0x258C, 0x2590, + 0x2591, 0x2592, 0x2593, 0x2320, 0x25A0, 0x2219, 0x221A, 0x2248, + 0x2264, 0x2265, 0x00A0, 0x2321, 0x00B0, 0x00B2, 0x00B7, 0x00F7, + 0x2550, 0x2551, 0x2552, 0x0451, 0x2553, 0x2554, 0x2555, 0x2556, + 0x2557, 0x2558, 0x2559, 0x255A, 0x255B, 0x255C, 0x255D, 0x255E, + 0x255F, 0x2560, 0x2561, 0x0401, 0x2562, 0x2563, 0x2564, 0x2565, + 0x2566, 0x2567, 0x2568, 0x2569, 0x256A, 0x256B, 0x256C, 0x00A9, + 0x044E, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433, + 0x0445, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, + 0x043F, 0x044F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432, + 0x044C, 0x044B, 0x0437, 0x0448, 0x044D, 0x0449, 0x0447, 0x044A, + 0x042E, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413, + 0x0425, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, + 0x041F, 0x042F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412, + 0x042C, 0x042B, 0x0417, 0x0428, 0x042D, 0x0429, 0x0427, 0x042A + }; + + +/* + * KOI8_U to Unicode recoding table + * based on file mappings/KOI8-U.TXT by Unicode Consortium + */ + +static const wxUint16 encoding_table__KOI8_U[128] = { + 0x2500, 0x2502, 0x250C, 0x2510, 0x2514, 0x2518, 0x251C, 0x2524, + 0x252C, 0x2534, 0x253C, 0x2580, 0x2584, 0x2588, 0x258C, 0x2590, + 0x2591, 0x2592, 0x2593, 0x2320, 0x25A0, 0x2219, 0x221A, 0x2248, + 0x2264, 0x2265, 0x00A0, 0x2321, 0x00B0, 0x00B2, 0x00B7, 0x00F7, + 0x2550, 0x2551, 0x2552, 0x0451, 0x0454, 0x2554, 0x0456, 0x0457, + 0x2557, 0x2558, 0x2559, 0x255A, 0x255B, 0x0491, 0x255D, 0x255E, + 0x255F, 0x2560, 0x2561, 0x0401, 0x0403, 0x2563, 0x0406, 0x0407, + 0x2566, 0x2567, 0x2568, 0x2569, 0x256A, 0x0490, 0x256C, 0x00A9, + 0x044E, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433, + 0x0445, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, + 0x043F, 0x044F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432, + 0x044C, 0x044B, 0x0437, 0x0448, 0x044D, 0x0449, 0x0447, 0x044A, + 0x042E, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413, + 0x0425, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, + 0x041F, 0x042F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412, + 0x042C, 0x042B, 0x0417, 0x0428, 0x042D, 0x0429, 0x0427, 0x042A + }; + + + + + +/* + * + * Unicode to 7bit ASCII fallback + * (for use with wxRECODE_SUBSTITUTE recoding mode) + * + */ + +static const struct { + wxUint16 c /*code*/; + wxUint8 s /*inaccurate substitution*/; +} encoding_unicode_fallback[] = { + + {0x00AB, 0x22}, + {0x00BB, 0x22}, + {0x00C0, 0x41}, + {0x00C1, 0x41}, + {0x00C2, 0x41}, + {0x00C3, 0x41}, + {0x00C4, 0x41}, + {0x00C5, 0x41}, + {0x00C7, 0x43}, + {0x00C8, 0x45}, + {0x00C9, 0x45}, + {0x00CA, 0x45}, + {0x00CB, 0x45}, + {0x00CC, 0x49}, + {0x00CD, 0x49}, + {0x00CE, 0x49}, + {0x00CF, 0x49}, + {0x00D1, 0x4E}, + {0x00D2, 0x4F}, + {0x00D3, 0x4F}, + {0x00D4, 0x4F}, + {0x00D5, 0x4F}, + {0x00D6, 0x4F}, + {0x00D8, 0x4F}, + {0x00D9, 0x55}, + {0x00DA, 0x55}, + {0x00DB, 0x55}, + {0x00DC, 0x55}, + {0x00DD, 0x59}, + {0x00E0, 0x61}, + {0x00E1, 0x61}, + {0x00E2, 0x61}, + {0x00E3, 0x61}, + {0x00E4, 0x61}, + {0x00E5, 0x61}, + {0x00E7, 0x63}, + {0x00E8, 0x65}, + {0x00E9, 0x65}, + {0x00EA, 0x65}, + {0x00EB, 0x65}, + {0x00EC, 0x69}, + {0x00ED, 0x69}, + {0x00EE, 0x69}, + {0x00EF, 0x69}, + {0x00F1, 0x6E}, + {0x00F2, 0x6F}, + {0x00F3, 0x6F}, + {0x00F4, 0x6F}, + {0x00F5, 0x6F}, + {0x00F6, 0x6F}, + {0x00F8, 0x6F}, + {0x00F9, 0x75}, + {0x00FA, 0x75}, + {0x00FB, 0x75}, + {0x00FC, 0x75}, + {0x00FD, 0x79}, + {0x00FF, 0x79}, + {0x0100, 0x41}, + {0x0101, 0x61}, + {0x0102, 0x41}, + {0x0103, 0x61}, + {0x0104, 0x41}, + {0x0105, 0x61}, + {0x0106, 0x43}, + {0x0107, 0x63}, + {0x0108, 0x43}, + {0x0109, 0x63}, + {0x010A, 0x43}, + {0x010B, 0x63}, + {0x010C, 0x43}, + {0x010D, 0x63}, + {0x010E, 0x44}, + {0x010F, 0x64}, + {0x0110, 0x44}, + {0x0111, 0x64}, + {0x0112, 0x45}, + {0x0113, 0x65}, + {0x0116, 0x45}, + {0x0117, 0x65}, + {0x0118, 0x45}, + {0x0119, 0x65}, + {0x011A, 0x45}, + {0x011B, 0x65}, + {0x011C, 0x47}, + {0x011D, 0x67}, + {0x011E, 0x47}, + {0x011F, 0x67}, + {0x0120, 0x47}, + {0x0121, 0x67}, + {0x0122, 0x47}, + {0x0123, 0x67}, + {0x0124, 0x48}, + {0x0125, 0x68}, + {0x0126, 0x48}, + {0x0127, 0x68}, + {0x0128, 0x49}, + {0x0129, 0x69}, + {0x012A, 0x49}, + {0x012B, 0x69}, + {0x012E, 0x49}, + {0x012F, 0x69}, + {0x0130, 0x49}, + {0x0134, 0x4A}, + {0x0135, 0x6A}, + {0x0136, 0x4B}, + {0x0137, 0x6B}, + {0x0139, 0x4C}, + {0x013A, 0x6C}, + {0x013B, 0x4C}, + {0x013C, 0x6C}, + {0x013D, 0x4C}, + {0x013E, 0x6C}, + {0x0141, 0x4C}, + {0x0142, 0x6C}, + {0x0143, 0x4E}, + {0x0144, 0x6E}, + {0x0145, 0x4E}, + {0x0146, 0x6E}, + {0x0147, 0x4E}, + {0x0148, 0x6E}, + {0x014C, 0x4F}, + {0x014D, 0x6F}, + {0x0150, 0x4F}, + {0x0151, 0x6F}, + {0x0154, 0x52}, + {0x0155, 0x72}, + {0x0156, 0x52}, + {0x0157, 0x72}, + {0x0158, 0x52}, + {0x0159, 0x72}, + {0x015A, 0x53}, + {0x015B, 0x73}, + {0x015C, 0x53}, + {0x015D, 0x73}, + {0x015E, 0x53}, + {0x015F, 0x73}, + {0x0160, 0x53}, + {0x0161, 0x73}, + {0x0162, 0x54}, + {0x0163, 0x74}, + {0x0164, 0x54}, + {0x0165, 0x74}, + {0x0166, 0x54}, + {0x0167, 0x74}, + {0x0168, 0x55}, + {0x0169, 0x75}, + {0x016A, 0x55}, + {0x016B, 0x75}, + {0x016C, 0x55}, + {0x016D, 0x75}, + {0x016E, 0x55}, + {0x016F, 0x75}, + {0x0170, 0x55}, + {0x0171, 0x75}, + {0x0172, 0x55}, + {0x0173, 0x75}, + {0x0174, 0x57}, + {0x0175, 0x77}, + {0x0176, 0x59}, + {0x0177, 0x79}, + {0x0178, 0x59}, + {0x0179, 0x5A}, + {0x017A, 0x7A}, + {0x017B, 0x5A}, + {0x017C, 0x7A}, + {0x017D, 0x5A}, + {0x017E, 0x7A}, + {0x0192, 0x66}, + {0x1E02, 0x42}, + {0x1E03, 0x62}, + {0x1E0A, 0x44}, + {0x1E0B, 0x64}, + {0x1E1E, 0x46}, + {0x1E1F, 0x66}, + {0x1E40, 0x4D}, + {0x1E41, 0x6D}, + {0x1E56, 0x50}, + {0x1E57, 0x70}, + {0x1E60, 0x53}, + {0x1E61, 0x73}, + {0x1E6A, 0x54}, + {0x1E6B, 0x74}, + {0x1E80, 0x57}, + {0x1E81, 0x77}, + {0x1E82, 0x57}, + {0x1E83, 0x77}, + {0x1E84, 0x57}, + {0x1E85, 0x77}, + {0x1EF2, 0x59}, + {0x1EF3, 0x79}, + {0x2013, 0x2D}, + {0x2014, 0x2D}, + {0x2018, 0x27}, + {0x2019, 0x27}, + {0x201A, 0x27}, + {0x201C, 0x22}, + {0x201D, 0x22}, + {0x201E, 0x22}, + {0x2039, 0x27}, + {0x203A, 0x27}, + {0, 0} + }; + +static const unsigned encoding_unicode_fallback_count = 200; + + + + +/* + * + * Table of all supported encodings: + * + */ + +static const struct { + wxFontEncoding encoding; // encoding identifier + const wxUint16 *table; // 8bit to unicode table +} encodings_list[] = { + + { wxFONTENCODING_ISO8859_1, encoding_table__ISO8859_1}, + { wxFONTENCODING_ISO8859_10, encoding_table__ISO8859_10}, + { wxFONTENCODING_ISO8859_13, encoding_table__ISO8859_13}, + { wxFONTENCODING_ISO8859_14, encoding_table__ISO8859_14}, + { wxFONTENCODING_ISO8859_15, encoding_table__ISO8859_15}, + { wxFONTENCODING_ISO8859_2, encoding_table__ISO8859_2}, + { wxFONTENCODING_ISO8859_3, encoding_table__ISO8859_3}, + { wxFONTENCODING_ISO8859_4, encoding_table__ISO8859_4}, + { wxFONTENCODING_ISO8859_5, encoding_table__ISO8859_5}, + { wxFONTENCODING_ISO8859_6, encoding_table__ISO8859_6}, + { wxFONTENCODING_ISO8859_7, encoding_table__ISO8859_7}, + { wxFONTENCODING_ISO8859_8, encoding_table__ISO8859_8}, + { wxFONTENCODING_ISO8859_9, encoding_table__ISO8859_9}, + { wxFONTENCODING_CP1250, encoding_table__CP1250}, + { wxFONTENCODING_CP1251, encoding_table__CP1251}, + { wxFONTENCODING_CP1252, encoding_table__CP1252}, + { wxFONTENCODING_CP1253, encoding_table__CP1253}, + { wxFONTENCODING_CP1254, encoding_table__CP1254}, + { wxFONTENCODING_CP1255, encoding_table__CP1255}, + { wxFONTENCODING_CP1256, encoding_table__CP1256}, + { wxFONTENCODING_CP1257, encoding_table__CP1257}, + { wxFONTENCODING_KOI8, encoding_table__KOI8}, + { wxFONTENCODING_KOI8_U, encoding_table__KOI8_U}, + {wxFONTENCODING_MAX /*anything*/, NULL} + }; diff --git a/Externals/wxWidgets/src/common/uri.cpp b/Externals/wxWidgets/src/common/uri.cpp new file mode 100644 index 0000000000..4c3e2f031d --- /dev/null +++ b/Externals/wxWidgets/src/common/uri.cpp @@ -0,0 +1,1298 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: uri.cpp +// Purpose: Implementation of a uri parser +// Author: Ryan Norton +// Created: 10/26/04 +// RCS-ID: $Id: uri.cpp 37403 2006-02-09 03:09:36Z VZ $ +// Copyright: (c) 2004 Ryan Norton +// Licence: wxWindows +///////////////////////////////////////////////////////////////////////////// + +// =========================================================================== +// declarations +// =========================================================================== + +// --------------------------------------------------------------------------- +// headers +// --------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#include "wx/uri.h" + +// --------------------------------------------------------------------------- +// definitions +// --------------------------------------------------------------------------- + +IMPLEMENT_CLASS(wxURI, wxObject) + +// =========================================================================== +// implementation +// =========================================================================== + +// --------------------------------------------------------------------------- +// utilities +// --------------------------------------------------------------------------- + +// --------------------------------------------------------------------------- +// +// wxURI +// +// --------------------------------------------------------------------------- + +// --------------------------------------------------------------------------- +// Constructors +// --------------------------------------------------------------------------- + +wxURI::wxURI() : m_hostType(wxURI_REGNAME), m_fields(0) +{ +} + +wxURI::wxURI(const wxString& uri) : m_hostType(wxURI_REGNAME), m_fields(0) +{ + Create(uri); +} + +wxURI::wxURI(const wxURI& uri) : wxObject(), m_hostType(wxURI_REGNAME), m_fields(0) +{ + Assign(uri); +} + +// --------------------------------------------------------------------------- +// Destructor and cleanup +// --------------------------------------------------------------------------- + +wxURI::~wxURI() +{ + Clear(); +} + +void wxURI::Clear() +{ + m_scheme = m_userinfo = m_server = m_port = m_path = + m_query = m_fragment = wxEmptyString; + + m_hostType = wxURI_REGNAME; + + m_fields = 0; +} + +// --------------------------------------------------------------------------- +// Create +// +// This creates the URI - all we do here is call the main parsing method +// --------------------------------------------------------------------------- + +const wxChar* wxURI::Create(const wxString& uri) +{ + if (m_fields) + Clear(); + + return Parse(uri); +} + +// --------------------------------------------------------------------------- +// Escape Methods +// +// TranslateEscape unencodes a 3 character URL escape sequence +// +// Escape encodes an invalid URI character into a 3 character sequence +// +// IsEscape determines if the input string contains an escape sequence, +// if it does, then it moves the input string past the escape sequence +// +// Unescape unencodes all 3 character URL escape sequences in a wxString +// --------------------------------------------------------------------------- + +wxChar wxURI::TranslateEscape(const wxChar* s) +{ + wxASSERT_MSG( IsHex(s[0]) && IsHex(s[1]), wxT("Invalid escape sequence!")); + + return wx_truncate_cast(wxChar, (CharToHex(s[0]) << 4 ) | CharToHex(s[1])); +} + +wxString wxURI::Unescape(const wxString& uri) +{ + wxString new_uri; + + for(size_t i = 0; i < uri.length(); ++i) + { + if (uri[i] == wxT('%')) + { + new_uri += wxURI::TranslateEscape( &(uri.c_str()[i+1]) ); + i += 2; + } + else + new_uri += uri[i]; + } + + return new_uri; +} + +void wxURI::Escape(wxString& s, const wxChar& c) +{ + const wxChar* hdig = wxT("0123456789abcdef"); + s += wxT('%'); + s += hdig[(c >> 4) & 15]; + s += hdig[c & 15]; +} + +bool wxURI::IsEscape(const wxChar*& uri) +{ + // pct-encoded = "%" HEXDIG HEXDIG + if(*uri == wxT('%') && IsHex(*(uri+1)) && IsHex(*(uri+2))) + return true; + else + return false; +} + +// --------------------------------------------------------------------------- +// GetUser +// GetPassword +// +// Gets the username and password via the old URL method. +// --------------------------------------------------------------------------- +wxString wxURI::GetUser() const +{ + size_t dwPasswordPos = m_userinfo.find(':'); + + if (dwPasswordPos == wxString::npos) + dwPasswordPos = 0; + + return m_userinfo(0, dwPasswordPos); +} + +wxString wxURI::GetPassword() const +{ + size_t dwPasswordPos = m_userinfo.find(':'); + + if (dwPasswordPos == wxString::npos) + return wxT(""); + else + return m_userinfo(dwPasswordPos+1, m_userinfo.length() + 1); +} + +// --------------------------------------------------------------------------- +// BuildURI +// +// BuildURI() builds the entire URI into a useable +// representation, including proper identification characters such as slashes +// +// BuildUnescapedURI() does the same thing as BuildURI(), only it unescapes +// the components that accept escape sequences +// --------------------------------------------------------------------------- + +wxString wxURI::BuildURI() const +{ + wxString ret; + + if (HasScheme()) + ret = ret + m_scheme + wxT(":"); + + if (HasServer()) + { + ret += wxT("//"); + + if (HasUserInfo()) + ret = ret + m_userinfo + wxT("@"); + + ret += m_server; + + if (HasPort()) + ret = ret + wxT(":") + m_port; + } + + ret += m_path; + + if (HasQuery()) + ret = ret + wxT("?") + m_query; + + if (HasFragment()) + ret = ret + wxT("#") + m_fragment; + + return ret; +} + +wxString wxURI::BuildUnescapedURI() const +{ + wxString ret; + + if (HasScheme()) + ret = ret + m_scheme + wxT(":"); + + if (HasServer()) + { + ret += wxT("//"); + + if (HasUserInfo()) + ret = ret + wxURI::Unescape(m_userinfo) + wxT("@"); + + if (m_hostType == wxURI_REGNAME) + ret += wxURI::Unescape(m_server); + else + ret += m_server; + + if (HasPort()) + ret = ret + wxT(":") + m_port; + } + + ret += wxURI::Unescape(m_path); + + if (HasQuery()) + ret = ret + wxT("?") + wxURI::Unescape(m_query); + + if (HasFragment()) + ret = ret + wxT("#") + wxURI::Unescape(m_fragment); + + return ret; +} + +// --------------------------------------------------------------------------- +// Assignment +// --------------------------------------------------------------------------- + +wxURI& wxURI::Assign(const wxURI& uri) +{ + //assign fields + m_fields = uri.m_fields; + + //ref over components + m_scheme = uri.m_scheme; + m_userinfo = uri.m_userinfo; + m_server = uri.m_server; + m_hostType = uri.m_hostType; + m_port = uri.m_port; + m_path = uri.m_path; + m_query = uri.m_query; + m_fragment = uri.m_fragment; + + return *this; +} + +wxURI& wxURI::operator = (const wxURI& uri) +{ + return Assign(uri); +} + +wxURI& wxURI::operator = (const wxString& string) +{ + Create(string); + return *this; +} + +// --------------------------------------------------------------------------- +// Comparison +// --------------------------------------------------------------------------- + +bool wxURI::operator == (const wxURI& uri) const +{ + if (HasScheme()) + { + if(m_scheme != uri.m_scheme) + return false; + } + else if (uri.HasScheme()) + return false; + + + if (HasServer()) + { + if (HasUserInfo()) + { + if (m_userinfo != uri.m_userinfo) + return false; + } + else if (uri.HasUserInfo()) + return false; + + if (m_server != uri.m_server || + m_hostType != uri.m_hostType) + return false; + + if (HasPort()) + { + if(m_port != uri.m_port) + return false; + } + else if (uri.HasPort()) + return false; + } + else if (uri.HasServer()) + return false; + + + if (HasPath()) + { + if(m_path != uri.m_path) + return false; + } + else if (uri.HasPath()) + return false; + + if (HasQuery()) + { + if (m_query != uri.m_query) + return false; + } + else if (uri.HasQuery()) + return false; + + if (HasFragment()) + { + if (m_fragment != uri.m_fragment) + return false; + } + else if (uri.HasFragment()) + return false; + + return true; +} + +// --------------------------------------------------------------------------- +// IsReference +// +// if there is no authority or scheme, it is a reference +// --------------------------------------------------------------------------- + +bool wxURI::IsReference() const +{ return !HasScheme() || !HasServer(); } + +// --------------------------------------------------------------------------- +// Parse +// +// Master URI parsing method. Just calls the individual parsing methods +// +// URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ] +// URI-reference = URI / relative +// --------------------------------------------------------------------------- + +const wxChar* wxURI::Parse(const wxChar* uri) +{ + uri = ParseScheme(uri); + uri = ParseAuthority(uri); + uri = ParsePath(uri); + uri = ParseQuery(uri); + return ParseFragment(uri); +} + +// --------------------------------------------------------------------------- +// ParseXXX +// +// Individual parsers for each URI component +// --------------------------------------------------------------------------- + +const wxChar* wxURI::ParseScheme(const wxChar* uri) +{ + wxASSERT(uri != NULL); + + //copy of the uri - used for figuring out + //length of each component + const wxChar* uricopy = uri; + + //Does the uri have a scheme (first character alpha)? + if (IsAlpha(*uri)) + { + m_scheme += *uri++; + + //scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." ) + while (IsAlpha(*uri) || IsDigit(*uri) || + *uri == wxT('+') || + *uri == wxT('-') || + *uri == wxT('.')) + { + m_scheme += *uri++; + } + + //valid scheme? + if (*uri == wxT(':')) + { + //mark the scheme as valid + m_fields |= wxURI_SCHEME; + + //move reference point up to input buffer + uricopy = ++uri; + } + else + //relative uri with relative path reference + m_scheme = wxEmptyString; + } +// else + //relative uri with _possible_ relative path reference + + return uricopy; +} + +const wxChar* wxURI::ParseAuthority(const wxChar* uri) +{ + // authority = [ userinfo "@" ] host [ ":" port ] + if (*uri == wxT('/') && *(uri+1) == wxT('/')) + { + //skip past the two slashes + uri += 2; + + // ############# DEVIATION FROM RFC ######################### + // Don't parse the server component for file URIs + if(m_scheme != wxT("file")) + { + //normal way + uri = ParseUserInfo(uri); + uri = ParseServer(uri); + return ParsePort(uri); + } + } + + return uri; +} + +const wxChar* wxURI::ParseUserInfo(const wxChar* uri) +{ + wxASSERT(uri != NULL); + + //copy of the uri - used for figuring out + //length of each component + const wxChar* uricopy = uri; + + // userinfo = *( unreserved / pct-encoded / sub-delims / ":" ) + while(*uri && *uri != wxT('@') && *uri != wxT('/') && *uri != wxT('#') && *uri != wxT('?')) + { + if(IsUnreserved(*uri) || + IsSubDelim(*uri) || *uri == wxT(':')) + m_userinfo += *uri++; + else if (IsEscape(uri)) + { + m_userinfo += *uri++; + m_userinfo += *uri++; + m_userinfo += *uri++; + } + else + Escape(m_userinfo, *uri++); + } + + if(*uri == wxT('@')) + { + //valid userinfo + m_fields |= wxURI_USERINFO; + + uricopy = ++uri; + } + else + m_userinfo = wxEmptyString; + + return uricopy; +} + +const wxChar* wxURI::ParseServer(const wxChar* uri) +{ + wxASSERT(uri != NULL); + + //copy of the uri - used for figuring out + //length of each component + const wxChar* uricopy = uri; + + // host = IP-literal / IPv4address / reg-name + // IP-literal = "[" ( IPv6address / IPvFuture ) "]" + if (*uri == wxT('[')) + { + ++uri; //some compilers don't support *&ing a ++* + if (ParseIPv6address(uri) && *uri == wxT(']')) + { + ++uri; + m_hostType = wxURI_IPV6ADDRESS; + + wxStringBufferLength theBuffer(m_server, uri - uricopy); + wxTmemcpy(theBuffer, uricopy, uri-uricopy); + theBuffer.SetLength(uri-uricopy); + } + else + { + uri = uricopy; + + ++uri; //some compilers don't support *&ing a ++* + if (ParseIPvFuture(uri) && *uri == wxT(']')) + { + ++uri; + m_hostType = wxURI_IPVFUTURE; + + wxStringBufferLength theBuffer(m_server, uri - uricopy); + wxTmemcpy(theBuffer, uricopy, uri-uricopy); + theBuffer.SetLength(uri-uricopy); + } + else + uri = uricopy; + } + } + else + { + if (ParseIPv4address(uri)) + { + m_hostType = wxURI_IPV4ADDRESS; + + wxStringBufferLength theBuffer(m_server, uri - uricopy); + wxTmemcpy(theBuffer, uricopy, uri-uricopy); + theBuffer.SetLength(uri-uricopy); + } + else + uri = uricopy; + } + + if(m_hostType == wxURI_REGNAME) + { + uri = uricopy; + // reg-name = *( unreserved / pct-encoded / sub-delims ) + while(*uri && *uri != wxT('/') && *uri != wxT(':') && *uri != wxT('#') && *uri != wxT('?')) + { + if(IsUnreserved(*uri) || IsSubDelim(*uri)) + m_server += *uri++; + else if (IsEscape(uri)) + { + m_server += *uri++; + m_server += *uri++; + m_server += *uri++; + } + else + Escape(m_server, *uri++); + } + } + + //mark the server as valid + m_fields |= wxURI_SERVER; + + return uri; +} + + +const wxChar* wxURI::ParsePort(const wxChar* uri) +{ + wxASSERT(uri != NULL); + + // port = *DIGIT + if(*uri == wxT(':')) + { + ++uri; + while(IsDigit(*uri)) + { + m_port += *uri++; + } + + //mark the port as valid + m_fields |= wxURI_PORT; + } + + return uri; +} + +const wxChar* wxURI::ParsePath(const wxChar* uri, bool bReference, bool bNormalize) +{ + wxASSERT(uri != NULL); + + //copy of the uri - used for figuring out + //length of each component + const wxChar* uricopy = uri; + + /// hier-part = "//" authority path-abempty + /// / path-absolute + /// / path-rootless + /// / path-empty + /// + /// relative-part = "//" authority path-abempty + /// / path-absolute + /// / path-noscheme + /// / path-empty + /// + /// path-abempty = *( "/" segment ) + /// path-absolute = "/" [ segment-nz *( "/" segment ) ] + /// path-noscheme = segment-nz-nc *( "/" segment ) + /// path-rootless = segment-nz *( "/" segment ) + /// path-empty = 0 + /// + /// segment = *pchar + /// segment-nz = 1*pchar + /// segment-nz-nc = 1*( unreserved / pct-encoded / sub-delims / "@" ) + /// ; non-zero-length segment without any colon ":" + /// + /// pchar = unreserved / pct-encoded / sub-delims / ":" / "@" + if (*uri == wxT('/')) + { + m_path += *uri++; + + while(*uri && *uri != wxT('#') && *uri != wxT('?')) + { + if( IsUnreserved(*uri) || IsSubDelim(*uri) || + *uri == wxT(':') || *uri == wxT('@') || *uri == wxT('/')) + m_path += *uri++; + else if (IsEscape(uri)) + { + m_path += *uri++; + m_path += *uri++; + m_path += *uri++; + } + else + Escape(m_path, *uri++); + } + + if (bNormalize) + { + wxStringBufferLength theBuffer(m_path, m_path.length() + 1); +#if wxUSE_STL + wxTmemcpy(theBuffer, m_path.c_str(), m_path.length()+1); +#endif + Normalize(theBuffer, true); + theBuffer.SetLength(wxStrlen(theBuffer)); + } + //mark the path as valid + m_fields |= wxURI_PATH; + } + else if(*uri) //Relative path + { + if (bReference) + { + //no colon allowed + while(*uri && *uri != wxT('#') && *uri != wxT('?')) + { + if(IsUnreserved(*uri) || IsSubDelim(*uri) || + *uri == wxT('@') || *uri == wxT('/')) + m_path += *uri++; + else if (IsEscape(uri)) + { + m_path += *uri++; + m_path += *uri++; + m_path += *uri++; + } + else + Escape(m_path, *uri++); + } + } + else + { + while(*uri && *uri != wxT('#') && *uri != wxT('?')) + { + if(IsUnreserved(*uri) || IsSubDelim(*uri) || + *uri == wxT(':') || *uri == wxT('@') || *uri == wxT('/')) + m_path += *uri++; + else if (IsEscape(uri)) + { + m_path += *uri++; + m_path += *uri++; + m_path += *uri++; + } + else + Escape(m_path, *uri++); + } + } + + if (uri != uricopy) + { + if (bNormalize) + { + wxStringBufferLength theBuffer(m_path, m_path.length() + 1); +#if wxUSE_STL + wxTmemcpy(theBuffer, m_path.c_str(), m_path.length()+1); +#endif + Normalize(theBuffer); + theBuffer.SetLength(wxStrlen(theBuffer)); + } + + //mark the path as valid + m_fields |= wxURI_PATH; + } + } + + return uri; +} + + +const wxChar* wxURI::ParseQuery(const wxChar* uri) +{ + wxASSERT(uri != NULL); + + // query = *( pchar / "/" / "?" ) + if (*uri == wxT('?')) + { + ++uri; + while(*uri && *uri != wxT('#')) + { + if (IsUnreserved(*uri) || IsSubDelim(*uri) || + *uri == wxT(':') || *uri == wxT('@') || *uri == wxT('/') || *uri == wxT('?')) + m_query += *uri++; + else if (IsEscape(uri)) + { + m_query += *uri++; + m_query += *uri++; + m_query += *uri++; + } + else + Escape(m_query, *uri++); + } + + //mark the server as valid + m_fields |= wxURI_QUERY; + } + + return uri; +} + + +const wxChar* wxURI::ParseFragment(const wxChar* uri) +{ + wxASSERT(uri != NULL); + + // fragment = *( pchar / "/" / "?" ) + if (*uri == wxT('#')) + { + ++uri; + while(*uri) + { + if (IsUnreserved(*uri) || IsSubDelim(*uri) || + *uri == wxT(':') || *uri == wxT('@') || *uri == wxT('/') || *uri == wxT('?')) + m_fragment += *uri++; + else if (IsEscape(uri)) + { + m_fragment += *uri++; + m_fragment += *uri++; + m_fragment += *uri++; + } + else + Escape(m_fragment, *uri++); + } + + //mark the server as valid + m_fields |= wxURI_FRAGMENT; + } + + return uri; +} + +// --------------------------------------------------------------------------- +// Resolve +// +// Builds missing components of this uri from a base uri +// +// A version of the algorithm outlined in the RFC is used here +// (it is shown in comments) +// +// Note that an empty URI inherits all components +// --------------------------------------------------------------------------- + +void wxURI::Resolve(const wxURI& base, int flags) +{ + wxASSERT_MSG(!base.IsReference(), + wxT("wxURI to inherit from must not be a reference!")); + + // If we arn't being strict, enable the older (pre-RFC2396) + // loophole that allows this uri to inherit other + // properties from the base uri - even if the scheme + // is defined + if ( !(flags & wxURI_STRICT) && + HasScheme() && base.HasScheme() && + m_scheme == base.m_scheme ) + { + m_fields -= wxURI_SCHEME; + } + + + // Do nothing if this is an absolute wxURI + // if defined(R.scheme) then + // T.scheme = R.scheme; + // T.authority = R.authority; + // T.path = remove_dot_segments(R.path); + // T.query = R.query; + if (HasScheme()) + { + return; + } + + //No scheme - inherit + m_scheme = base.m_scheme; + m_fields |= wxURI_SCHEME; + + // All we need to do for relative URIs with an + // authority component is just inherit the scheme + // if defined(R.authority) then + // T.authority = R.authority; + // T.path = remove_dot_segments(R.path); + // T.query = R.query; + if (HasServer()) + { + return; + } + + //No authority - inherit + if (base.HasUserInfo()) + { + m_userinfo = base.m_userinfo; + m_fields |= wxURI_USERINFO; + } + + m_server = base.m_server; + m_hostType = base.m_hostType; + m_fields |= wxURI_SERVER; + + if (base.HasPort()) + { + m_port = base.m_port; + m_fields |= wxURI_PORT; + } + + + // Simple path inheritance from base + if (!HasPath()) + { + // T.path = Base.path; + m_path = base.m_path; + m_fields |= wxURI_PATH; + + + // if defined(R.query) then + // T.query = R.query; + // else + // T.query = Base.query; + // endif; + if (!HasQuery()) + { + m_query = base.m_query; + m_fields |= wxURI_QUERY; + } + } + else + { + // if (R.path starts-with "/") then + // T.path = remove_dot_segments(R.path); + // else + // T.path = merge(Base.path, R.path); + // T.path = remove_dot_segments(T.path); + // endif; + // T.query = R.query; + if (m_path[0u] != wxT('/')) + { + //Merge paths + const wxChar* op = m_path.c_str(); + const wxChar* bp = base.m_path.c_str() + base.m_path.Length(); + + //not a ending directory? move up + if (base.m_path[0] && *(bp-1) != wxT('/')) + UpTree(base.m_path, bp); + + //normalize directories + while(*op == wxT('.') && *(op+1) == wxT('.') && + (*(op+2) == '\0' || *(op+2) == wxT('/')) ) + { + UpTree(base.m_path, bp); + + if (*(op+2) == '\0') + op += 2; + else + op += 3; + } + + m_path = base.m_path.substr(0, bp - base.m_path.c_str()) + + m_path.substr((op - m_path.c_str()), m_path.Length()); + } + } + + //T.fragment = R.fragment; +} + +// --------------------------------------------------------------------------- +// UpTree +// +// Moves a URI path up a directory +// --------------------------------------------------------------------------- + +//static +void wxURI::UpTree(const wxChar* uristart, const wxChar*& uri) +{ + if (uri != uristart && *(uri-1) == wxT('/')) + { + uri -= 2; + } + + for(;uri != uristart; --uri) + { + if (*uri == wxT('/')) + { + ++uri; + break; + } + } + + //!!!TODO:HACK!!!// + if (uri == uristart && *uri == wxT('/')) + ++uri; + //!!!// +} + +// --------------------------------------------------------------------------- +// Normalize +// +// Normalizes directories in-place +// +// I.E. ./ and . are ignored +// +// ../ and .. are removed if a directory is before it, along +// with that directory (leading .. and ../ are kept) +// --------------------------------------------------------------------------- + +//static +void wxURI::Normalize(wxChar* s, bool bIgnoreLeads) +{ + wxChar* cp = s; + wxChar* bp = s; + + if(s[0] == wxT('/')) + ++bp; + + while(*cp) + { + if (*cp == wxT('.') && (*(cp+1) == wxT('/') || *(cp+1) == '\0') + && (bp == cp || *(cp-1) == wxT('/'))) + { + //. _or_ ./ - ignore + if (*(cp+1) == '\0') + cp += 1; + else + cp += 2; + } + else if (*cp == wxT('.') && *(cp+1) == wxT('.') && + (*(cp+2) == wxT('/') || *(cp+2) == '\0') + && (bp == cp || *(cp-1) == wxT('/'))) + { + //.. _or_ ../ - go up the tree + if (s != bp) + { + UpTree((const wxChar*)bp, (const wxChar*&)s); + + if (*(cp+2) == '\0') + cp += 2; + else + cp += 3; + } + else if (!bIgnoreLeads) + + { + *bp++ = *cp++; + *bp++ = *cp++; + if (*cp) + *bp++ = *cp++; + + s = bp; + } + else + { + if (*(cp+2) == '\0') + cp += 2; + else + cp += 3; + } + } + else + *s++ = *cp++; + } + + *s = '\0'; +} + +// --------------------------------------------------------------------------- +// ParseH16 +// +// Parses 1 to 4 hex values. Returns true if the first character of the input +// string is a valid hex character. It is the caller's responsability to move +// the input string back to its original position on failure. +// --------------------------------------------------------------------------- + +bool wxURI::ParseH16(const wxChar*& uri) +{ + // h16 = 1*4HEXDIG + if(!IsHex(*++uri)) + return false; + + if(IsHex(*++uri) && IsHex(*++uri) && IsHex(*++uri)) + ++uri; + + return true; +} + +// --------------------------------------------------------------------------- +// ParseIPXXX +// +// Parses a certain version of an IP address and moves the input string past +// it. Returns true if the input string contains the proper version of an ip +// address. It is the caller's responsability to move the input string back +// to its original position on failure. +// --------------------------------------------------------------------------- + +bool wxURI::ParseIPv4address(const wxChar*& uri) +{ + //IPv4address = dec-octet "." dec-octet "." dec-octet "." dec-octet + // + //dec-octet = DIGIT ; 0-9 + // / %x31-39 DIGIT ; 10-99 + // / "1" 2DIGIT ; 100-199 + // / "2" %x30-34 DIGIT ; 200-249 + // / "25" %x30-35 ; 250-255 + size_t iIPv4 = 0; + if (IsDigit(*uri)) + { + ++iIPv4; + + + //each ip part must be between 0-255 (dupe of version in for loop) + if( IsDigit(*++uri) && IsDigit(*++uri) && + //100 or less (note !) + !( (*(uri-2) < wxT('2')) || + //240 or less + (*(uri-2) == wxT('2') && + (*(uri-1) < wxT('5') || (*(uri-1) == wxT('5') && *uri <= wxT('5'))) + ) + ) + ) + { + return false; + } + + if(IsDigit(*uri))++uri; + + //compilers should unroll this loop + for(; iIPv4 < 4; ++iIPv4) + { + if (*uri != wxT('.') || !IsDigit(*++uri)) + break; + + //each ip part must be between 0-255 + if( IsDigit(*++uri) && IsDigit(*++uri) && + //100 or less (note !) + !( (*(uri-2) < wxT('2')) || + //240 or less + (*(uri-2) == wxT('2') && + (*(uri-1) < wxT('5') || (*(uri-1) == wxT('5') && *uri <= wxT('5'))) + ) + ) + ) + { + return false; + } + if(IsDigit(*uri))++uri; + } + } + return iIPv4 == 4; +} + +bool wxURI::ParseIPv6address(const wxChar*& uri) +{ + // IPv6address = 6( h16 ":" ) ls32 + // / "::" 5( h16 ":" ) ls32 + // / [ h16 ] "::" 4( h16 ":" ) ls32 + // / [ *1( h16 ":" ) h16 ] "::" 3( h16 ":" ) ls32 + // / [ *2( h16 ":" ) h16 ] "::" 2( h16 ":" ) ls32 + // / [ *3( h16 ":" ) h16 ] "::" h16 ":" ls32 + // / [ *4( h16 ":" ) h16 ] "::" ls32 + // / [ *5( h16 ":" ) h16 ] "::" h16 + // / [ *6( h16 ":" ) h16 ] "::" + + size_t numPrefix = 0, + maxPostfix; + + bool bEndHex = false; + + for( ; numPrefix < 6; ++numPrefix) + { + if(!ParseH16(uri)) + { + --uri; + bEndHex = true; + break; + } + + if(*uri != wxT(':')) + { + break; + } + } + + if(!bEndHex && !ParseH16(uri)) + { + --uri; + + if (numPrefix) + return false; + + if (*uri == wxT(':')) + { + if (*++uri != wxT(':')) + return false; + + maxPostfix = 5; + } + else + maxPostfix = 6; + } + else + { + if (*uri != wxT(':') || *(uri+1) != wxT(':')) + { + if (numPrefix != 6) + return false; + + while (*--uri != wxT(':')) {} + ++uri; + + const wxChar* uristart = uri; + //parse ls32 + // ls32 = ( h16 ":" h16 ) / IPv4address + if (ParseH16(uri) && *uri == wxT(':') && ParseH16(uri)) + return true; + + uri = uristart; + + if (ParseIPv4address(uri)) + return true; + else + return false; + } + else + { + uri += 2; + + if (numPrefix > 3) + maxPostfix = 0; + else + maxPostfix = 4 - numPrefix; + } + } + + bool bAllowAltEnding = maxPostfix == 0; + + for(; maxPostfix != 0; --maxPostfix) + { + if(!ParseH16(uri) || *uri != wxT(':')) + return false; + } + + if(numPrefix <= 4) + { + const wxChar* uristart = uri; + //parse ls32 + // ls32 = ( h16 ":" h16 ) / IPv4address + if (ParseH16(uri) && *uri == wxT(':') && ParseH16(uri)) + return true; + + uri = uristart; + + if (ParseIPv4address(uri)) + return true; + + uri = uristart; + + if (!bAllowAltEnding) + return false; + } + + if(numPrefix <= 5 && ParseH16(uri)) + return true; + + return true; +} + +bool wxURI::ParseIPvFuture(const wxChar*& uri) +{ + // IPvFuture = "v" 1*HEXDIG "." 1*( unreserved / sub-delims / ":" ) + if (*++uri != wxT('v') || !IsHex(*++uri)) + return false; + + while (IsHex(*++uri)) {} + + if (*uri != wxT('.') || !(IsUnreserved(*++uri) || IsSubDelim(*uri) || *uri == wxT(':'))) + return false; + + while(IsUnreserved(*++uri) || IsSubDelim(*uri) || *uri == wxT(':')) {} + + return true; +} + + +// --------------------------------------------------------------------------- +// CharToHex +// +// Converts a character into a numeric hexidecimal value, or 0 if the +// passed in character is not a valid hex character +// --------------------------------------------------------------------------- + +//static +wxChar wxURI::CharToHex(const wxChar& c) +{ + if ((c >= wxT('A')) && (c <= wxT('Z'))) return wxChar(c - wxT('A') + 0x0A); + if ((c >= wxT('a')) && (c <= wxT('z'))) return wxChar(c - wxT('a') + 0x0a); + if ((c >= wxT('0')) && (c <= wxT('9'))) return wxChar(c - wxT('0') + 0x00); + + return 0; +} + +// --------------------------------------------------------------------------- +// IsXXX +// +// Returns true if the passed in character meets the criteria of the method +// --------------------------------------------------------------------------- + +//! unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" +bool wxURI::IsUnreserved (const wxChar& c) +{ return IsAlpha(c) || IsDigit(c) || + c == wxT('-') || + c == wxT('.') || + c == wxT('_') || + c == wxT('~') //tilde + ; +} + +bool wxURI::IsReserved (const wxChar& c) +{ + return IsGenDelim(c) || IsSubDelim(c); +} + +//! gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@" +bool wxURI::IsGenDelim (const wxChar& c) +{ + return c == wxT(':') || + c == wxT('/') || + c == wxT('?') || + c == wxT('#') || + c == wxT('[') || + c == wxT(']') || + c == wxT('@'); +} + +//! sub-delims = "!" / "$" / "&" / "'" / "(" / ")" +//! / "*" / "+" / "," / ";" / "=" +bool wxURI::IsSubDelim (const wxChar& c) +{ + return c == wxT('!') || + c == wxT('$') || + c == wxT('&') || + c == wxT('\'') || + c == wxT('(') || + c == wxT(')') || + c == wxT('*') || + c == wxT('+') || + c == wxT(',') || + c == wxT(';') || + c == wxT('=') + ; +} + +bool wxURI::IsHex(const wxChar& c) +{ return IsDigit(c) || (c >= wxT('a') && c <= wxT('f')) || (c >= wxT('A') && c <= wxT('F')); } + +bool wxURI::IsAlpha(const wxChar& c) +{ return (c >= wxT('a') && c <= wxT('z')) || (c >= wxT('A') && c <= wxT('Z')); } + +bool wxURI::IsDigit(const wxChar& c) +{ return c >= wxT('0') && c <= wxT('9'); } + + +//end of uri.cpp + + + diff --git a/Externals/wxWidgets/src/common/url.cpp b/Externals/wxWidgets/src/common/url.cpp new file mode 100644 index 0000000000..4313a3ffec --- /dev/null +++ b/Externals/wxWidgets/src/common/url.cpp @@ -0,0 +1,533 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/url.cpp +// Purpose: URL parser +// Author: Guilhem Lavaux +// Modified by: +// Created: 20/07/1997 +// RCS-ID: $Id: url.cpp 49798 2007-11-09 23:17:49Z VZ $ +// Copyright: (c) 1997, 1998 Guilhem Lavaux +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_URL + +#include "wx/url.h" + +#ifndef WX_PRECOMP + #include "wx/list.h" + #include "wx/string.h" + #include "wx/utils.h" + #include "wx/module.h" +#endif + +#include +#include + +IMPLEMENT_CLASS(wxProtoInfo, wxObject) +IMPLEMENT_CLASS(wxURL, wxURI) + +// Protocols list +wxProtoInfo *wxURL::ms_protocols = NULL; + +// Enforce linking of protocol classes: +USE_PROTOCOL(wxFileProto) + +#if wxUSE_PROTOCOL_HTTP +USE_PROTOCOL(wxHTTP) + + wxHTTP *wxURL::ms_proxyDefault = NULL; + bool wxURL::ms_useDefaultProxy = false; +#endif + +#if wxUSE_PROTOCOL_FTP +USE_PROTOCOL(wxFTP) +#endif + +// -------------------------------------------------------------- +// +// wxURL +// +// -------------------------------------------------------------- + +// -------------------------------------------------------------- +// Construction +// -------------------------------------------------------------- + +wxURL::wxURL(const wxString& url) : wxURI(url) +{ + Init(url); + ParseURL(); +} + +wxURL::wxURL(const wxURI& url) : wxURI(url) +{ + Init(url.BuildURI()); + ParseURL(); +} + +void wxURL::Init(const wxString& url) +{ + m_protocol = NULL; + m_error = wxURL_NOERR; + m_url = url; +#if wxUSE_URL_NATIVE + m_nativeImp = CreateNativeImpObject(); +#endif + +#if wxUSE_PROTOCOL_HTTP + if ( ms_useDefaultProxy && !ms_proxyDefault ) + { + SetDefaultProxy( wxGetenv(wxT("HTTP_PROXY")) ); + + if ( !ms_proxyDefault ) + { + // don't try again + ms_useDefaultProxy = false; + } + } + + m_useProxy = ms_proxyDefault != NULL; + m_proxy = ms_proxyDefault; +#endif // wxUSE_PROTOCOL_HTTP + +} + +// -------------------------------------------------------------- +// Assignment +// -------------------------------------------------------------- + +wxURL& wxURL::operator = (const wxURI& url) +{ + wxURI::operator = (url); + Init(url.BuildURI()); + ParseURL(); + return *this; +} +wxURL& wxURL::operator = (const wxString& url) +{ + wxURI::operator = (url); + Init(url); + ParseURL(); + return *this; +} + +// -------------------------------------------------------------- +// ParseURL +// +// Builds the URL and takes care of the old protocol stuff +// -------------------------------------------------------------- + +bool wxURL::ParseURL() +{ + // If the URL was already parsed (m_protocol != NULL), pass this section. + if (!m_protocol) + { + // Clean up + CleanData(); + + // Make sure we have a protocol/scheme + if (!HasScheme()) + { + m_error = wxURL_SNTXERR; + return false; + } + + // Find and create the protocol object + if (!FetchProtocol()) + { + m_error = wxURL_NOPROTO; + return false; + } + + // Do we need a host name ? + if (m_protoinfo->m_needhost) + { + // Make sure we have one, then + if (!HasServer()) + { + m_error = wxURL_SNTXERR; + return false; + } + } + } + +#if wxUSE_PROTOCOL_HTTP + if (m_useProxy) + { + // Third, we rebuild the URL. + m_url = m_scheme + wxT(":"); + if (m_protoinfo->m_needhost) + m_url = m_url + wxT("//") + m_server; + + // We initialize specific variables. + m_protocol = m_proxy; // FIXME: we should clone the protocol + } +#endif // wxUSE_PROTOCOL_HTTP + + m_error = wxURL_NOERR; + return true; +} + +// -------------------------------------------------------------- +// Destruction/Cleanup +// -------------------------------------------------------------- + +void wxURL::CleanData() +{ +#if wxUSE_PROTOCOL_HTTP + if (!m_useProxy) +#endif // wxUSE_PROTOCOL_HTTP + if (m_protocol) + // Need to safely delete the socket (pending events) + m_protocol->Destroy(); +} + +wxURL::~wxURL() +{ + CleanData(); +#if wxUSE_PROTOCOL_HTTP + if (m_proxy && m_proxy != ms_proxyDefault) + delete m_proxy; +#endif // wxUSE_PROTOCOL_HTTP +#if wxUSE_URL_NATIVE + delete m_nativeImp; +#endif +} + +// -------------------------------------------------------------- +// FetchProtocol +// -------------------------------------------------------------- + +bool wxURL::FetchProtocol() +{ + wxProtoInfo *info = ms_protocols; + + while (info) + { + if (m_scheme == info->m_protoname) + { + if (m_port.IsNull()) + m_port = info->m_servname; + m_protoinfo = info; + m_protocol = (wxProtocol *)m_protoinfo->m_cinfo->CreateObject(); + return true; + } + info = info->next; + } + return false; +} + +// -------------------------------------------------------------- +// GetInputStream +// -------------------------------------------------------------- + +wxInputStream *wxURL::GetInputStream() +{ + if (!m_protocol) + { + m_error = wxURL_NOPROTO; + return NULL; + } + + m_error = wxURL_NOERR; + if (HasUserInfo()) + { + size_t dwPasswordPos = m_userinfo.find(':'); + + if (dwPasswordPos == wxString::npos) + m_protocol->SetUser(m_userinfo); + else + { + m_protocol->SetUser(m_userinfo(0, dwPasswordPos)); + m_protocol->SetPassword(m_userinfo(dwPasswordPos+1, m_userinfo.length() + 1)); + } + } + +#if wxUSE_URL_NATIVE + // give the native implementation to return a better stream + // such as the native WinINet functionality under MS-Windows + if (m_nativeImp) + { + wxInputStream *rc; + rc = m_nativeImp->GetInputStream(this); + if (rc != 0) + return rc; + } + // else use the standard behaviour +#endif // wxUSE_URL_NATIVE + +#if wxUSE_SOCKETS + wxIPV4address addr; + + // m_protoinfo is NULL when we use a proxy + if (!m_useProxy && m_protoinfo->m_needhost) + { + if (!addr.Hostname(m_server)) + { + m_error = wxURL_NOHOST; + return NULL; + } + + addr.Service(m_port); + + if (!m_protocol->Connect(addr, true)) // Watcom needs the 2nd arg for some reason + { + m_error = wxURL_CONNERR; + return NULL; + } + } +#endif + + wxString fullPath; + + // When we use a proxy, we have to pass the whole URL to it. + if (m_useProxy) + fullPath += m_url; + + if(m_path.empty()) + fullPath += wxT("/"); + else + fullPath += m_path; + + if (HasQuery()) + fullPath += wxT("?") + m_query; + + if (HasFragment()) + fullPath += wxT("#") + m_fragment; + + wxInputStream *the_i_stream = m_protocol->GetInputStream(fullPath); + + if (!the_i_stream) + { + m_error = wxURL_PROTOERR; + return NULL; + } + + return the_i_stream; +} + +#if wxUSE_PROTOCOL_HTTP +void wxURL::SetDefaultProxy(const wxString& url_proxy) +{ + if ( !url_proxy ) + { + if ( ms_proxyDefault ) + { + ms_proxyDefault->Close(); + delete ms_proxyDefault; + ms_proxyDefault = NULL; + } + } + else + { + wxString tmp_str = url_proxy; + int pos = tmp_str.Find(wxT(':')); + if (pos == wxNOT_FOUND) + return; + + wxString hostname = tmp_str(0, pos), + port = tmp_str(pos+1, tmp_str.length()-pos); + wxIPV4address addr; + + if (!addr.Hostname(hostname)) + return; + if (!addr.Service(port)) + return; + + if (ms_proxyDefault) + // Finally, when all is right, we connect the new proxy. + ms_proxyDefault->Close(); + else + ms_proxyDefault = new wxHTTP(); + ms_proxyDefault->Connect(addr, true); // Watcom needs the 2nd arg for some reason + } +} + +void wxURL::SetProxy(const wxString& url_proxy) +{ + if ( !url_proxy ) + { + if ( m_proxy && m_proxy != ms_proxyDefault ) + { + m_proxy->Close(); + delete m_proxy; + } + + m_useProxy = false; + } + else + { + wxString tmp_str; + wxString hostname, port; + int pos; + wxIPV4address addr; + + tmp_str = url_proxy; + pos = tmp_str.Find(wxT(':')); + // This is an invalid proxy name. + if (pos == wxNOT_FOUND) + return; + + hostname = tmp_str(0, pos); + port = tmp_str(pos+1, tmp_str.length()-pos); + + addr.Hostname(hostname); + addr.Service(port); + + // Finally, create the whole stuff. + if (m_proxy && m_proxy != ms_proxyDefault) + delete m_proxy; + m_proxy = new wxHTTP(); + m_proxy->Connect(addr, true); // Watcom needs the 2nd arg for some reason + + CleanData(); + // Reparse url. + m_useProxy = true; + ParseURL(); + } +} +#endif // wxUSE_PROTOCOL_HTTP + +// ---------------------------------------------------------------------- +// wxURLModule +// +// A module which deletes the default proxy if we created it +// ---------------------------------------------------------------------- + +#if wxUSE_SOCKETS + +class wxURLModule : public wxModule +{ +public: + wxURLModule(); + + virtual bool OnInit(); + virtual void OnExit(); + +private: + DECLARE_DYNAMIC_CLASS(wxURLModule) +}; + +IMPLEMENT_DYNAMIC_CLASS(wxURLModule, wxModule) + +wxURLModule::wxURLModule() +{ + // we must be cleaned up before wxSocketModule as otherwise deleting + // ms_proxyDefault from our OnExit() won't work (and can actually crash) + AddDependency(wxClassInfo::FindClass(_T("wxSocketModule"))); +} + +bool wxURLModule::OnInit() +{ +#if wxUSE_PROTOCOL_HTTP + // env var HTTP_PROXY contains the address of the default proxy to use if + // set, but don't try to create this proxy right now because it will slow + // down the program startup (especially if there is no DNS server + // available, in which case it may take up to 1 minute) + + if ( wxGetenv(_T("HTTP_PROXY")) ) + { + wxURL::ms_useDefaultProxy = true; + } +#endif // wxUSE_PROTOCOL_HTTP + return true; +} + +void wxURLModule::OnExit() +{ +#if wxUSE_PROTOCOL_HTTP + delete wxURL::ms_proxyDefault; + wxURL::ms_proxyDefault = NULL; +#endif // wxUSE_PROTOCOL_HTTP +} + +#endif // wxUSE_SOCKETS + +// --------------------------------------------------------------------------- +// +// wxURL Compatibility +// +// --------------------------------------------------------------------------- + +#if WXWIN_COMPATIBILITY_2_4 + +#include "wx/url.h" + +wxString wxURL::GetProtocolName() const +{ + return m_scheme; +} + +wxString wxURL::GetHostName() const +{ + return m_server; +} + +wxString wxURL::GetPath() const +{ + return m_path; +} + +//Note that this old code really doesn't convert to a URI that well and looks +//more like a dirty hack than anything else... + +wxString wxURL::ConvertToValidURI(const wxString& uri, const wxChar* delims) +{ + wxString out_str; + wxString hexa_code; + size_t i; + + for (i = 0; i < uri.Len(); i++) + { + wxChar c = uri.GetChar(i); + + if (c == wxT(' ')) + { + // GRG, Apr/2000: changed to "%20" instead of '+' + + out_str += wxT("%20"); + } + else + { + // GRG, Apr/2000: modified according to the URI definition (RFC 2396) + // + // - Alphanumeric characters are never escaped + // - Unreserved marks are never escaped + // - Delimiters must be escaped if they appear within a component + // but not if they are used to separate components. Here we have + // no clear way to distinguish between these two cases, so they + // are escaped unless they are passed in the 'delims' parameter + // (allowed delimiters). + + static const wxChar marks[] = wxT("-_.!~*()'"); + + if ( !wxIsalnum(c) && !wxStrchr(marks, c) && !wxStrchr(delims, c) ) + { + hexa_code.Printf(wxT("%%%02X"), c); + out_str += hexa_code; + } + else + { + out_str += c; + } + } + } + + return out_str; +} + +wxString wxURL::ConvertFromURI(const wxString& uri) +{ + return wxURI::Unescape(uri); +} + +#endif //WXWIN_COMPATIBILITY_2_4 + +#endif // wxUSE_URL diff --git a/Externals/wxWidgets/src/common/utilscmn.cpp b/Externals/wxWidgets/src/common/utilscmn.cpp new file mode 100644 index 0000000000..421f735312 --- /dev/null +++ b/Externals/wxWidgets/src/common/utilscmn.cpp @@ -0,0 +1,1398 @@ +// Name: src/common/utilscmn.cpp +// Purpose: Miscellaneous utility functions and classes +// Author: Julian Smart +// Modified by: +// Created: 29/01/98 +// RCS-ID: $Id: utilscmn.cpp 48211 2007-08-20 01:41:09Z KO $ +// Copyright: (c) 1998 Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#ifndef WX_PRECOMP + #include "wx/app.h" + #include "wx/string.h" + #include "wx/utils.h" + #include "wx/intl.h" + #include "wx/log.h" + + #if wxUSE_GUI + #include "wx/window.h" + #include "wx/frame.h" + #include "wx/menu.h" + #include "wx/msgdlg.h" + #include "wx/textdlg.h" + #include "wx/textctrl.h" // for wxTE_PASSWORD + #if wxUSE_ACCEL + #include "wx/menuitem.h" + #include "wx/accel.h" + #endif // wxUSE_ACCEL + #endif // wxUSE_GUI +#endif // WX_PRECOMP + +#include "wx/apptrait.h" + +#include "wx/process.h" +#include "wx/txtstrm.h" +#include "wx/uri.h" +#include "wx/mimetype.h" +#include "wx/config.h" + +#if defined(__WXWINCE__) && wxUSE_DATETIME +#include "wx/datetime.h" +#endif + +#include +#include +#include +#include + +#if !wxONLY_WATCOM_EARLIER_THAN(1,4) + #if !(defined(_MSC_VER) && (_MSC_VER > 800)) + #include + #endif +#endif + +#if wxUSE_GUI + #include "wx/colordlg.h" + #include "wx/fontdlg.h" + #include "wx/notebook.h" + #include "wx/statusbr.h" +#endif // wxUSE_GUI + +#ifndef __WXWINCE__ +#include +#else +#include "wx/msw/wince/time.h" +#endif + +#ifdef __WXMAC__ +#include "wx/mac/private.h" +#ifndef __DARWIN__ +#include "InternetConfig.h" +#endif +#endif + +#if !defined(__MWERKS__) && !defined(__WXWINCE__) + #include + #include +#endif + +#if defined(__WXMSW__) + #include "wx/msw/private.h" + #include "wx/msw/registry.h" + #include // needed for SHELLEXECUTEINFO +#endif + +#if wxUSE_BASE + +// ---------------------------------------------------------------------------- +// common data +// ---------------------------------------------------------------------------- + +// ============================================================================ +// implementation +// ============================================================================ + +#if WXWIN_COMPATIBILITY_2_4 + +wxChar * +copystring (const wxChar *s) +{ + if (s == NULL) s = wxEmptyString; + size_t len = wxStrlen (s) + 1; + + wxChar *news = new wxChar[len]; + memcpy (news, s, len * sizeof(wxChar)); // Should be the fastest + + return news; +} + +#endif // WXWIN_COMPATIBILITY_2_4 + +// ---------------------------------------------------------------------------- +// String <-> Number conversions (deprecated) +// ---------------------------------------------------------------------------- + +#if WXWIN_COMPATIBILITY_2_4 + +WXDLLIMPEXP_DATA_BASE(const wxChar *) wxFloatToStringStr = wxT("%.2f"); +WXDLLIMPEXP_DATA_BASE(const wxChar *) wxDoubleToStringStr = wxT("%.2f"); + +void +StringToFloat (const wxChar *s, float *number) +{ + if (s && *s && number) + *number = (float) wxStrtod (s, (wxChar **) NULL); +} + +void +StringToDouble (const wxChar *s, double *number) +{ + if (s && *s && number) + *number = wxStrtod (s, (wxChar **) NULL); +} + +wxChar * +FloatToString (float number, const wxChar *fmt) +{ + static wxChar buf[256]; + + wxSprintf (buf, fmt, number); + return buf; +} + +wxChar * +DoubleToString (double number, const wxChar *fmt) +{ + static wxChar buf[256]; + + wxSprintf (buf, fmt, number); + return buf; +} + +void +StringToInt (const wxChar *s, int *number) +{ + if (s && *s && number) + *number = (int) wxStrtol (s, (wxChar **) NULL, 10); +} + +void +StringToLong (const wxChar *s, long *number) +{ + if (s && *s && number) + *number = wxStrtol (s, (wxChar **) NULL, 10); +} + +wxChar * +IntToString (int number) +{ + static wxChar buf[20]; + + wxSprintf (buf, wxT("%d"), number); + return buf; +} + +wxChar * +LongToString (long number) +{ + static wxChar buf[20]; + + wxSprintf (buf, wxT("%ld"), number); + return buf; +} + +#endif // WXWIN_COMPATIBILITY_2_4 + +// Array used in DecToHex conversion routine. +static wxChar hexArray[] = wxT("0123456789ABCDEF"); + +// Convert 2-digit hex number to decimal +int wxHexToDec(const wxString& buf) +{ + int firstDigit, secondDigit; + + if (buf.GetChar(0) >= wxT('A')) + firstDigit = buf.GetChar(0) - wxT('A') + 10; + else + firstDigit = buf.GetChar(0) - wxT('0'); + + if (buf.GetChar(1) >= wxT('A')) + secondDigit = buf.GetChar(1) - wxT('A') + 10; + else + secondDigit = buf.GetChar(1) - wxT('0'); + + return (firstDigit & 0xF) * 16 + (secondDigit & 0xF ); +} + +// Convert decimal integer to 2-character hex string +void wxDecToHex(int dec, wxChar *buf) +{ + int firstDigit = (int)(dec/16.0); + int secondDigit = (int)(dec - (firstDigit*16.0)); + buf[0] = hexArray[firstDigit]; + buf[1] = hexArray[secondDigit]; + buf[2] = 0; +} + +// Convert decimal integer to 2-character hex string +wxString wxDecToHex(int dec) +{ + wxChar buf[3]; + wxDecToHex(dec, buf); + return wxString(buf); +} + +// ---------------------------------------------------------------------------- +// misc functions +// ---------------------------------------------------------------------------- + +// Return the current date/time +wxString wxNow() +{ +#ifdef __WXWINCE__ +#if wxUSE_DATETIME + wxDateTime now = wxDateTime::Now(); + return now.Format(); +#else + return wxEmptyString; +#endif +#else + time_t now = time((time_t *) NULL); + char *date = ctime(&now); + date[24] = '\0'; + return wxString::FromAscii(date); +#endif +} + +void wxUsleep(unsigned long milliseconds) +{ + wxMilliSleep(milliseconds); +} + +const wxChar *wxGetInstallPrefix() +{ + wxString prefix; + + if ( wxGetEnv(wxT("WXPREFIX"), &prefix) ) + return prefix.c_str(); + +#ifdef wxINSTALL_PREFIX + return wxT(wxINSTALL_PREFIX); +#else + return wxEmptyString; +#endif +} + +wxString wxGetDataDir() +{ + wxString dir = wxGetInstallPrefix(); + dir << wxFILE_SEP_PATH << wxT("share") << wxFILE_SEP_PATH << wxT("wx"); + return dir; +} + +bool wxIsPlatformLittleEndian() +{ + // Are we little or big endian? This method is from Harbison & Steele. + union + { + long l; + char c[sizeof(long)]; + } u; + u.l = 1; + + return u.c[0] == 1; +} + + +/* + * Class to make it easier to specify platform-dependent values + */ + +wxArrayInt* wxPlatform::sm_customPlatforms = NULL; + +void wxPlatform::Copy(const wxPlatform& platform) +{ + m_longValue = platform.m_longValue; + m_doubleValue = platform.m_doubleValue; + m_stringValue = platform.m_stringValue; +} + +wxPlatform wxPlatform::If(int platform, long value) +{ + if (Is(platform)) + return wxPlatform(value); + else + return wxPlatform(); +} + +wxPlatform wxPlatform::IfNot(int platform, long value) +{ + if (!Is(platform)) + return wxPlatform(value); + else + return wxPlatform(); +} + +wxPlatform& wxPlatform::ElseIf(int platform, long value) +{ + if (Is(platform)) + m_longValue = value; + return *this; +} + +wxPlatform& wxPlatform::ElseIfNot(int platform, long value) +{ + if (!Is(platform)) + m_longValue = value; + return *this; +} + +wxPlatform wxPlatform::If(int platform, double value) +{ + if (Is(platform)) + return wxPlatform(value); + else + return wxPlatform(); +} + +wxPlatform wxPlatform::IfNot(int platform, double value) +{ + if (!Is(platform)) + return wxPlatform(value); + else + return wxPlatform(); +} + +wxPlatform& wxPlatform::ElseIf(int platform, double value) +{ + if (Is(platform)) + m_doubleValue = value; + return *this; +} + +wxPlatform& wxPlatform::ElseIfNot(int platform, double value) +{ + if (!Is(platform)) + m_doubleValue = value; + return *this; +} + +wxPlatform wxPlatform::If(int platform, const wxString& value) +{ + if (Is(platform)) + return wxPlatform(value); + else + return wxPlatform(); +} + +wxPlatform wxPlatform::IfNot(int platform, const wxString& value) +{ + if (!Is(platform)) + return wxPlatform(value); + else + return wxPlatform(); +} + +wxPlatform& wxPlatform::ElseIf(int platform, const wxString& value) +{ + if (Is(platform)) + m_stringValue = value; + return *this; +} + +wxPlatform& wxPlatform::ElseIfNot(int platform, const wxString& value) +{ + if (!Is(platform)) + m_stringValue = value; + return *this; +} + +wxPlatform& wxPlatform::Else(long value) +{ + m_longValue = value; + return *this; +} + +wxPlatform& wxPlatform::Else(double value) +{ + m_doubleValue = value; + return *this; +} + +wxPlatform& wxPlatform::Else(const wxString& value) +{ + m_stringValue = value; + return *this; +} + +void wxPlatform::AddPlatform(int platform) +{ + if (!sm_customPlatforms) + sm_customPlatforms = new wxArrayInt; + sm_customPlatforms->Add(platform); +} + +void wxPlatform::ClearPlatforms() +{ + delete sm_customPlatforms; + sm_customPlatforms = NULL; +} + +/// Function for testing current platform + +bool wxPlatform::Is(int platform) +{ +#ifdef __WXMSW__ + if (platform == wxOS_WINDOWS) + return true; +#endif +#ifdef __WXWINCE__ + if (platform == wxOS_WINDOWS_CE) + return true; +#endif + +#if 0 + +// FIXME: wxWinPocketPC and wxWinSmartPhone are unknown symbols + +#if defined(__WXWINCE__) && defined(__POCKETPC__) + if (platform == wxWinPocketPC) + return true; +#endif +#if defined(__WXWINCE__) && defined(__SMARTPHONE__) + if (platform == wxWinSmartPhone) + return true; +#endif + +#endif + +#ifdef __WXGTK__ + if (platform == wxPORT_GTK) + return true; +#endif +#ifdef __WXMAC__ + if (platform == wxPORT_MAC) + return true; +#endif +#ifdef __WXX11__ + if (platform == wxPORT_X11) + return true; +#endif +#ifdef __UNIX__ + if (platform == wxOS_UNIX) + return true; +#endif +#ifdef __WXMGL__ + if (platform == wxPORT_MGL) + return true; +#endif +#ifdef __OS2__ + if (platform == wxOS_OS2) + return true; +#endif +#ifdef __WXPM__ + if (platform == wxPORT_PM) + return true; +#endif +#ifdef __WXCOCOA__ + if (platform == wxPORT_MAC) + return true; +#endif + + if (sm_customPlatforms && sm_customPlatforms->Index(platform) != wxNOT_FOUND) + return true; + + return false; +} + +// ---------------------------------------------------------------------------- +// network and user id functions +// ---------------------------------------------------------------------------- + +// Get Full RFC822 style email address +bool wxGetEmailAddress(wxChar *address, int maxSize) +{ + wxString email = wxGetEmailAddress(); + if ( !email ) + return false; + + wxStrncpy(address, email, maxSize - 1); + address[maxSize - 1] = wxT('\0'); + + return true; +} + +wxString wxGetEmailAddress() +{ + wxString email; + + wxString host = wxGetFullHostName(); + if ( !host.empty() ) + { + wxString user = wxGetUserId(); + if ( !user.empty() ) + { + email << user << wxT('@') << host; + } + } + + return email; +} + +wxString wxGetUserId() +{ + static const int maxLoginLen = 256; // FIXME arbitrary number + + wxString buf; + bool ok = wxGetUserId(wxStringBuffer(buf, maxLoginLen), maxLoginLen); + + if ( !ok ) + buf.Empty(); + + return buf; +} + +wxString wxGetUserName() +{ + static const int maxUserNameLen = 1024; // FIXME arbitrary number + + wxString buf; + bool ok = wxGetUserName(wxStringBuffer(buf, maxUserNameLen), maxUserNameLen); + + if ( !ok ) + buf.Empty(); + + return buf; +} + +wxString wxGetHostName() +{ + static const size_t hostnameSize = 257; + + wxString buf; + bool ok = wxGetHostName(wxStringBuffer(buf, hostnameSize), hostnameSize); + + if ( !ok ) + buf.Empty(); + + return buf; +} + +wxString wxGetFullHostName() +{ + static const size_t hostnameSize = 257; + + wxString buf; + bool ok = wxGetFullHostName(wxStringBuffer(buf, hostnameSize), hostnameSize); + + if ( !ok ) + buf.Empty(); + + return buf; +} + +wxString wxGetHomeDir() +{ + wxString home; + wxGetHomeDir(&home); + + return home; +} + +#if 0 + +wxString wxGetCurrentDir() +{ + wxString dir; + size_t len = 1024; + bool ok; + do + { + ok = getcwd(dir.GetWriteBuf(len + 1), len) != NULL; + dir.UngetWriteBuf(); + + if ( !ok ) + { + if ( errno != ERANGE ) + { + wxLogSysError(_T("Failed to get current directory")); + + return wxEmptyString; + } + else + { + // buffer was too small, retry with a larger one + len *= 2; + } + } + //else: ok + } while ( !ok ); + + return dir; +} + +#endif // 0 + +// ---------------------------------------------------------------------------- +// wxExecute +// ---------------------------------------------------------------------------- + +// wxDoExecuteWithCapture() helper: reads an entire stream into one array +// +// returns true if ok, false if error +#if wxUSE_STREAMS +static bool ReadAll(wxInputStream *is, wxArrayString& output) +{ + wxCHECK_MSG( is, false, _T("NULL stream in wxExecute()?") ); + + // the stream could be already at EOF or in wxSTREAM_BROKEN_PIPE state + is->Reset(); + + wxTextInputStream tis(*is); + + for ( ;; ) + { + wxString line = tis.ReadLine(); + + // check for EOF before other errors as it's not really an error + if ( is->Eof() ) + { + // add the last, possibly incomplete, line + if ( !line.empty() ) + output.Add(line); + break; + } + + // any other error is fatal + if ( !*is ) + return false; + + output.Add(line); + } + + return true; +} +#endif // wxUSE_STREAMS + +// this is a private function because it hasn't a clean interface: the first +// array is passed by reference, the second by pointer - instead we have 2 +// public versions of wxExecute() below +static long wxDoExecuteWithCapture(const wxString& command, + wxArrayString& output, + wxArrayString* error, + int flags) +{ + // create a wxProcess which will capture the output + wxProcess *process = new wxProcess; + process->Redirect(); + + long rc = wxExecute(command, wxEXEC_SYNC | flags, process); + +#if wxUSE_STREAMS + if ( rc != -1 ) + { + if ( !ReadAll(process->GetInputStream(), output) ) + rc = -1; + + if ( error ) + { + if ( !ReadAll(process->GetErrorStream(), *error) ) + rc = -1; + } + + } +#else + wxUnusedVar(output); + wxUnusedVar(error); +#endif // wxUSE_STREAMS/!wxUSE_STREAMS + + delete process; + + return rc; +} + +long wxExecute(const wxString& command, wxArrayString& output, int flags) +{ + return wxDoExecuteWithCapture(command, output, NULL, flags); +} + +long wxExecute(const wxString& command, + wxArrayString& output, + wxArrayString& error, + int flags) +{ + return wxDoExecuteWithCapture(command, output, &error, flags); +} + +// ---------------------------------------------------------------------------- +// Launch default browser +// ---------------------------------------------------------------------------- + +#include "wx/private/browserhack28.h" + +static bool wxLaunchDefaultBrowserBaseImpl(const wxString& url, int flags); + +// Use wxLaunchDefaultBrowserBaseImpl by default +static wxLaunchDefaultBrowserImpl_t s_launchBrowserImpl = &wxLaunchDefaultBrowserBaseImpl; + +// Function the GUI library can call to provide a better implementation +WXDLLIMPEXP_BASE void wxSetLaunchDefaultBrowserImpl(wxLaunchDefaultBrowserImpl_t newImpl) +{ + s_launchBrowserImpl = newImpl!=NULL ? newImpl : &wxLaunchDefaultBrowserBaseImpl; +} + +static bool wxLaunchDefaultBrowserBaseImpl(const wxString& url, int flags) +{ + wxUnusedVar(flags); + +#if defined(__WXMSW__) + +#if wxUSE_IPC + if ( flags & wxBROWSER_NEW_WINDOW ) + { + // ShellExecuteEx() opens the URL in an existing window by default so + // we can't use it if we need a new window + wxURI uri(url); + wxRegKey key(wxRegKey::HKCR, uri.GetScheme() + _T("\\shell\\open")); + if ( !key.Exists() ) + { + // try default browser, it must be registered at least for http URLs + key.SetName(wxRegKey::HKCR, _T("http\\shell\\open")); + } + + if ( key.Exists() ) + { + wxRegKey keyDDE(key, wxT("DDEExec")); + if ( keyDDE.Exists() ) + { + const wxString ddeTopic = wxRegKey(keyDDE, wxT("topic")); + + // we only know the syntax of WWW_OpenURL DDE request for IE, + // optimistically assume that all other browsers are compatible + // with it + wxString ddeCmd; + bool ok = ddeTopic == wxT("WWW_OpenURL"); + if ( ok ) + { + ddeCmd = keyDDE.QueryDefaultValue(); + ok = !ddeCmd.empty(); + } + + if ( ok ) + { + // for WWW_OpenURL, the index of the window to open the URL + // in is -1 (meaning "current") by default, replace it with + // 0 which means "new" (see KB article 160957) + ok = ddeCmd.Replace(wxT("-1"), wxT("0"), + false /* only first occurence */) == 1; + } + + if ( ok ) + { + // and also replace the parameters: the topic should + // contain a placeholder for the URL + ok = ddeCmd.Replace(wxT("%1"), url, false) == 1; + } + + if ( ok ) + { + // try to send it the DDE request now but ignore the errors + wxLogNull noLog; + + const wxString ddeServer = wxRegKey(keyDDE, wxT("application")); + if ( wxExecuteDDE(ddeServer, ddeTopic, ddeCmd) ) + return true; + + // this is not necessarily an error: maybe browser is + // simply not running, but no matter, in any case we're + // going to launch it using ShellExecuteEx() below now and + // we shouldn't try to open a new window if we open a new + // browser anyhow + } + } + } + } +#endif // wxUSE_IPC + + WinStruct sei; + sei.lpFile = url.c_str(); + sei.lpVerb = _T("open"); + sei.nShow = SW_SHOWNORMAL; + + ::ShellExecuteEx(&sei); + + const int nResult = (int) sei.hInstApp; + + // Firefox returns file not found for some reason, so make an exception + // for it + if ( nResult > 32 || nResult == SE_ERR_FNF ) + { +#ifdef __WXDEBUG__ + // Log something if SE_ERR_FNF happens + if ( nResult == SE_ERR_FNF ) + wxLogDebug(wxT("SE_ERR_FNF from ShellExecute -- maybe FireFox?")); +#endif // __WXDEBUG__ + return true; + } +#elif defined(__WXMAC__) + OSStatus err; + ICInstance inst; + long int startSel; + long int endSel; + + err = ICStart(&inst, 'STKA'); // put your app creator code here + if (err == noErr) + { +#if !TARGET_CARBON + err = ICFindConfigFile(inst, 0, NULL); +#endif + if (err == noErr) + { + ConstStr255Param hint = 0; + startSel = 0; + endSel = url.length(); + err = ICLaunchURL(inst, hint, url.fn_str(), endSel, &startSel, &endSel); + if (err != noErr) + wxLogDebug(wxT("ICLaunchURL error %d"), (int) err); + } + ICStop(inst); + return true; + } + else + { + wxLogDebug(wxT("ICStart error %d"), (int) err); + return false; + } +#else + // (non-Mac, non-MSW) + +#ifdef __UNIX__ + + wxString desktop = wxTheApp->GetTraits()->GetDesktopEnvironment(); + + // GNOME and KDE desktops have some applications which should be always installed + // together with their main parts, which give us the + if (desktop == wxT("GNOME")) + { + wxArrayString errors; + wxArrayString output; + + // gconf will tell us the path of the application to use as browser + long res = wxExecute( wxT("gconftool-2 --get /desktop/gnome/applications/browser/exec"), + output, errors, wxEXEC_NODISABLE ); + if (res >= 0 && errors.GetCount() == 0) + { + wxString cmd = output[0]; + cmd << _T(' ') << url; + if (wxExecute(cmd)) + return true; + } + } + else if (desktop == wxT("KDE")) + { + // kfmclient directly opens the given URL + if (wxExecute(wxT("kfmclient openURL ") + url)) + return true; + } +#endif + + bool ok = false; + wxString cmd; + +#if wxUSE_MIMETYPE + wxFileType *ft = wxTheMimeTypesManager->GetFileTypeFromExtension(_T("html")); + if ( ft ) + { + wxString mt; + ft->GetMimeType(&mt); + + ok = ft->GetOpenCommand(&cmd, wxFileType::MessageParameters(url)); + delete ft; + } +#endif // wxUSE_MIMETYPE + + if ( !ok || cmd.empty() ) + { + // fallback to checking for the BROWSER environment variable + cmd = wxGetenv(wxT("BROWSER")); + if ( !cmd.empty() ) + cmd << _T(' ') << url; + } + + ok = ( !cmd.empty() && wxExecute(cmd) ); + if (ok) + return ok; + + // no file type for HTML extension + wxLogError(_T("No default application configured for HTML files.")); + +#endif // !wxUSE_MIMETYPE && !__WXMSW__ + return false; +} + +bool wxLaunchDefaultBrowser(const wxString& urlOrig, int flags) +{ + // set the scheme of url to http if it does not have one + // RR: This doesn't work if the url is just a local path + wxString url(urlOrig); + wxURI uri(url); + if ( !uri.HasScheme() ) + { + if (wxFileExists(urlOrig)) + url.Prepend( wxT("file://") ); + else + url.Prepend(wxT("http://")); + } + + if(s_launchBrowserImpl(url, flags)) + return true; + + wxLogSysError(_T("Failed to open URL \"%s\" in default browser."), + url.c_str()); + + return false; +} + +// ---------------------------------------------------------------------------- +// wxApp::Yield() wrappers for backwards compatibility +// ---------------------------------------------------------------------------- + +bool wxYield() +{ + return wxTheApp && wxTheApp->Yield(); +} + +bool wxYieldIfNeeded() +{ + return wxTheApp && wxTheApp->Yield(true); +} + +#endif // wxUSE_BASE + +// ============================================================================ +// GUI-only functions from now on +// ============================================================================ + +#if wxUSE_GUI + +// Id generation +static long wxCurrentId = 100; + +long wxNewId() +{ + // skip the part of IDs space that contains hard-coded values: + if (wxCurrentId == wxID_LOWEST) + wxCurrentId = wxID_HIGHEST + 1; + + return wxCurrentId++; +} + +long +wxGetCurrentId(void) { return wxCurrentId; } + +void +wxRegisterId (long id) +{ + if (id >= wxCurrentId) + wxCurrentId = id + 1; +} + +// ---------------------------------------------------------------------------- +// Menu accelerators related functions +// ---------------------------------------------------------------------------- + +wxChar *wxStripMenuCodes(const wxChar *in, wxChar *out) +{ +#if wxUSE_MENUS + wxString s = wxMenuItem::GetLabelFromText(in); +#else + wxString str(in); + wxString s = wxStripMenuCodes(str); +#endif // wxUSE_MENUS + if ( out ) + { + // go smash their buffer if it's not big enough - I love char * params + memcpy(out, s.c_str(), s.length() * sizeof(wxChar)); + } + else + { + // MYcopystring - for easier search... + out = new wxChar[s.length() + 1]; + wxStrcpy(out, s.c_str()); + } + + return out; +} + +wxString wxStripMenuCodes(const wxString& in, int flags) +{ + wxASSERT_MSG( flags, _T("this is useless to call without any flags") ); + + wxString out; + + size_t len = in.length(); + out.reserve(len); + + for ( size_t n = 0; n < len; n++ ) + { + wxChar ch = in[n]; + if ( (flags & wxStrip_Mnemonics) && ch == _T('&') ) + { + // skip it, it is used to introduce the accel char (or to quote + // itself in which case it should still be skipped): note that it + // can't be the last character of the string + if ( ++n == len ) + { + wxLogDebug(_T("Invalid menu string '%s'"), in.c_str()); + } + else + { + // use the next char instead + ch = in[n]; + } + } + else if ( (flags & wxStrip_Accel) && ch == _T('\t') ) + { + // everything after TAB is accel string, exit the loop + break; + } + + out += ch; + } + + return out; +} + +// ---------------------------------------------------------------------------- +// Window search functions +// ---------------------------------------------------------------------------- + +/* + * If parent is non-NULL, look through children for a label or title + * matching the specified string. If NULL, look through all top-level windows. + * + */ + +wxWindow * +wxFindWindowByLabel (const wxString& title, wxWindow * parent) +{ + return wxWindow::FindWindowByLabel( title, parent ); +} + + +/* + * If parent is non-NULL, look through children for a name + * matching the specified string. If NULL, look through all top-level windows. + * + */ + +wxWindow * +wxFindWindowByName (const wxString& name, wxWindow * parent) +{ + return wxWindow::FindWindowByName( name, parent ); +} + +// Returns menu item id or wxNOT_FOUND if none. +int +wxFindMenuItemId (wxFrame * frame, const wxString& menuString, const wxString& itemString) +{ +#if wxUSE_MENUS + wxMenuBar *menuBar = frame->GetMenuBar (); + if ( menuBar ) + return menuBar->FindMenuItem (menuString, itemString); +#endif // wxUSE_MENUS + + return wxNOT_FOUND; +} + +// Try to find the deepest child that contains 'pt'. +// We go backwards, to try to allow for controls that are spacially +// within other controls, but are still siblings (e.g. buttons within +// static boxes). Static boxes are likely to be created _before_ controls +// that sit inside them. +wxWindow* wxFindWindowAtPoint(wxWindow* win, const wxPoint& pt) +{ + if (!win->IsShown()) + return NULL; + + // Hack for wxNotebook case: at least in wxGTK, all pages + // claim to be shown, so we must only deal with the selected one. +#if wxUSE_NOTEBOOK + if (win->IsKindOf(CLASSINFO(wxNotebook))) + { + wxNotebook* nb = (wxNotebook*) win; + int sel = nb->GetSelection(); + if (sel >= 0) + { + wxWindow* child = nb->GetPage(sel); + wxWindow* foundWin = wxFindWindowAtPoint(child, pt); + if (foundWin) + return foundWin; + } + } +#endif + + wxWindowList::compatibility_iterator node = win->GetChildren().GetLast(); + while (node) + { + wxWindow* child = node->GetData(); + wxWindow* foundWin = wxFindWindowAtPoint(child, pt); + if (foundWin) + return foundWin; + node = node->GetPrevious(); + } + + wxPoint pos = win->GetPosition(); + wxSize sz = win->GetSize(); + if ( !win->IsTopLevel() && win->GetParent() ) + { + pos = win->GetParent()->ClientToScreen(pos); + } + + wxRect rect(pos, sz); + if (rect.Contains(pt)) + return win; + + return NULL; +} + +wxWindow* wxGenericFindWindowAtPoint(const wxPoint& pt) +{ + // Go backwards through the list since windows + // on top are likely to have been appended most + // recently. + wxWindowList::compatibility_iterator node = wxTopLevelWindows.GetLast(); + while (node) + { + wxWindow* win = node->GetData(); + wxWindow* found = wxFindWindowAtPoint(win, pt); + if (found) + return found; + node = node->GetPrevious(); + } + return NULL; +} + +// ---------------------------------------------------------------------------- +// GUI helpers +// ---------------------------------------------------------------------------- + +/* + * N.B. these convenience functions must be separate from msgdlgg.cpp, textdlgg.cpp + * since otherwise the generic code may be pulled in unnecessarily. + */ + +#if wxUSE_MSGDLG + +int wxMessageBox(const wxString& message, const wxString& caption, long style, + wxWindow *parent, int WXUNUSED(x), int WXUNUSED(y) ) +{ + long decorated_style = style; + + if ( ( style & ( wxICON_EXCLAMATION | wxICON_HAND | wxICON_INFORMATION | wxICON_QUESTION ) ) == 0 ) + { + decorated_style |= ( style & wxYES ) ? wxICON_QUESTION : wxICON_INFORMATION ; + } + + wxMessageDialog dialog(parent, message, caption, decorated_style); + + int ans = dialog.ShowModal(); + switch ( ans ) + { + case wxID_OK: + return wxOK; + case wxID_YES: + return wxYES; + case wxID_NO: + return wxNO; + case wxID_CANCEL: + return wxCANCEL; + } + + wxFAIL_MSG( _T("unexpected return code from wxMessageDialog") ); + + return wxCANCEL; +} + +#endif // wxUSE_MSGDLG + +#if wxUSE_TEXTDLG + +wxString wxGetTextFromUser(const wxString& message, const wxString& caption, + const wxString& defaultValue, wxWindow *parent, + wxCoord x, wxCoord y, bool centre ) +{ + wxString str; + long style = wxTextEntryDialogStyle; + + if (centre) + style |= wxCENTRE; + else + style &= ~wxCENTRE; + + wxTextEntryDialog dialog(parent, message, caption, defaultValue, style, wxPoint(x, y)); + + if (dialog.ShowModal() == wxID_OK) + { + str = dialog.GetValue(); + } + + return str; +} + +wxString wxGetPasswordFromUser(const wxString& message, + const wxString& caption, + const wxString& defaultValue, + wxWindow *parent, + wxCoord x, wxCoord y, bool centre ) +{ + wxString str; + long style = wxTextEntryDialogStyle; + + if (centre) + style |= wxCENTRE; + else + style &= ~wxCENTRE; + + wxPasswordEntryDialog dialog(parent, message, caption, defaultValue, + style, wxPoint(x, y)); + if ( dialog.ShowModal() == wxID_OK ) + { + str = dialog.GetValue(); + } + + return str; +} + +#endif // wxUSE_TEXTDLG + +#if wxUSE_COLOURDLG + +wxColour wxGetColourFromUser(wxWindow *parent, const wxColour& colInit, const wxString& caption) +{ + wxColourData data; + data.SetChooseFull(true); + if ( colInit.Ok() ) + { + data.SetColour((wxColour &)colInit); // const_cast + } + + wxColour colRet; + wxColourDialog dialog(parent, &data); + if (!caption.empty()) + dialog.SetTitle(caption); + if ( dialog.ShowModal() == wxID_OK ) + { + colRet = dialog.GetColourData().GetColour(); + } + //else: leave it invalid + + return colRet; +} + +#endif // wxUSE_COLOURDLG + +#if wxUSE_FONTDLG + +wxFont wxGetFontFromUser(wxWindow *parent, const wxFont& fontInit, const wxString& caption) +{ + wxFontData data; + if ( fontInit.Ok() ) + { + data.SetInitialFont(fontInit); + } + + wxFont fontRet; + wxFontDialog dialog(parent, data); + if (!caption.empty()) + dialog.SetTitle(caption); + if ( dialog.ShowModal() == wxID_OK ) + { + fontRet = dialog.GetFontData().GetChosenFont(); + } + //else: leave it invalid + + return fontRet; +} + +#endif // wxUSE_FONTDLG + +// ---------------------------------------------------------------------------- +// wxSafeYield and supporting functions +// ---------------------------------------------------------------------------- + +void wxEnableTopLevelWindows(bool enable) +{ + wxWindowList::compatibility_iterator node; + for ( node = wxTopLevelWindows.GetFirst(); node; node = node->GetNext() ) + node->GetData()->Enable(enable); +} + +wxWindowDisabler::wxWindowDisabler(wxWindow *winToSkip) +{ + // remember the top level windows which were already disabled, so that we + // don't reenable them later + m_winDisabled = NULL; + + wxWindowList::compatibility_iterator node; + for ( node = wxTopLevelWindows.GetFirst(); node; node = node->GetNext() ) + { + wxWindow *winTop = node->GetData(); + if ( winTop == winToSkip ) + continue; + + // we don't need to disable the hidden or already disabled windows + if ( winTop->IsEnabled() && winTop->IsShown() ) + { + winTop->Disable(); + } + else + { + if ( !m_winDisabled ) + { + m_winDisabled = new wxWindowList; + } + + m_winDisabled->Append(winTop); + } + } +} + +wxWindowDisabler::~wxWindowDisabler() +{ + wxWindowList::compatibility_iterator node; + for ( node = wxTopLevelWindows.GetFirst(); node; node = node->GetNext() ) + { + wxWindow *winTop = node->GetData(); + if ( !m_winDisabled || !m_winDisabled->Find(winTop) ) + { + winTop->Enable(); + } + //else: had been already disabled, don't reenable + } + + delete m_winDisabled; +} + +// Yield to other apps/messages and disable user input to all windows except +// the given one +bool wxSafeYield(wxWindow *win, bool onlyIfNeeded) +{ + wxWindowDisabler wd(win); + + bool rc; + if (onlyIfNeeded) + rc = wxYieldIfNeeded(); + else + rc = wxYield(); + + return rc; +} + +// Don't synthesize KeyUp events holding down a key and producing KeyDown +// events with autorepeat. On by default and always on in wxMSW. wxGTK version +// in utilsgtk.cpp. +#ifndef __WXGTK__ +bool wxSetDetectableAutoRepeat( bool WXUNUSED(flag) ) +{ + return true; // detectable auto-repeat is the only mode MSW supports +} +#endif // !wxGTK + +#endif // wxUSE_GUI diff --git a/Externals/wxWidgets/src/common/valgen.cpp b/Externals/wxWidgets/src/common/valgen.cpp new file mode 100644 index 0000000000..9b206483a7 --- /dev/null +++ b/Externals/wxWidgets/src/common/valgen.cpp @@ -0,0 +1,591 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/valgen.cpp +// Purpose: wxGenericValidator class +// Author: Kevin Smith +// Modified by: +// Created: Jan 22 1999 +// RCS-ID: $Id: valgen.cpp 39463 2006-05-29 21:26:35Z ABX $ +// Copyright: (c) 1999 Kevin Smith +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_VALIDATORS + +#ifndef WX_PRECOMP + #include "wx/dynarray.h" + #include "wx/utils.h" + #include "wx/intl.h" + #include "wx/choice.h" + #include "wx/combobox.h" + #include "wx/radiobox.h" + #include "wx/radiobut.h" + #include "wx/checkbox.h" + #include "wx/scrolbar.h" + #include "wx/gauge.h" + #include "wx/stattext.h" + #include "wx/textctrl.h" + #include "wx/button.h" + #include "wx/listbox.h" + #include "wx/slider.h" + #include "wx/checklst.h" +#endif + +#include "wx/spinctrl.h" + +#if wxUSE_SPINBTN + #include "wx/spinbutt.h" +#endif +#if wxUSE_TOGGLEBTN + #include "wx/tglbtn.h" +#endif + +#include "wx/valgen.h" + +IMPLEMENT_CLASS(wxGenericValidator, wxValidator) + +wxGenericValidator::wxGenericValidator(bool *val) +{ + Initialize(); + m_pBool = val; +} + +wxGenericValidator::wxGenericValidator(int *val) +{ + Initialize(); + m_pInt = val; +} + +wxGenericValidator::wxGenericValidator(wxString *val) +{ + Initialize(); + m_pString = val; +} + +wxGenericValidator::wxGenericValidator(wxArrayInt *val) +{ + Initialize(); + m_pArrayInt = val; +} + +wxGenericValidator::wxGenericValidator(const wxGenericValidator& val) + : wxValidator() +{ + Copy(val); +} + +bool wxGenericValidator::Copy(const wxGenericValidator& val) +{ + wxValidator::Copy(val); + + m_pBool = val.m_pBool; + m_pInt = val.m_pInt; + m_pString = val.m_pString; + m_pArrayInt = val.m_pArrayInt; + + return true; +} + +// Called to transfer data to the window +bool wxGenericValidator::TransferToWindow(void) +{ + if ( !m_validatorWindow ) + return false; + + // bool controls +#if wxUSE_CHECKBOX + if (m_validatorWindow->IsKindOf(CLASSINFO(wxCheckBox)) ) + { + wxCheckBox* pControl = (wxCheckBox*) m_validatorWindow; + if (m_pBool) + { + pControl->SetValue(*m_pBool); + return true; + } + } else +#endif +#if wxUSE_RADIOBTN + if (m_validatorWindow->IsKindOf(CLASSINFO(wxRadioButton)) ) + { + wxRadioButton* pControl = (wxRadioButton*) m_validatorWindow; + if (m_pBool) + { + pControl->SetValue(*m_pBool) ; + return true; + } + } else +#endif +#if wxUSE_TOGGLEBTN + if (m_validatorWindow->IsKindOf(CLASSINFO(wxToggleButton)) ) + { + wxToggleButton * pControl = (wxToggleButton *) m_validatorWindow; + if (m_pBool) + { + pControl->SetValue(*m_pBool); + return true; + } + } else +#endif + + // int controls +#if wxUSE_GAUGE + if (m_validatorWindow->IsKindOf(CLASSINFO(wxGauge)) ) + { + wxGauge* pControl = (wxGauge*) m_validatorWindow; + if (m_pInt) + { + pControl->SetValue(*m_pInt); + return true; + } + } else +#endif +#if wxUSE_RADIOBOX + if (m_validatorWindow->IsKindOf(CLASSINFO(wxRadioBox)) ) + { + wxRadioBox* pControl = (wxRadioBox*) m_validatorWindow; + if (m_pInt) + { + pControl->SetSelection(*m_pInt) ; + return true; + } + } else +#endif +#if wxUSE_SCROLLBAR + if (m_validatorWindow->IsKindOf(CLASSINFO(wxScrollBar)) ) + { + wxScrollBar* pControl = (wxScrollBar*) m_validatorWindow; + if (m_pInt) + { + pControl->SetThumbPosition(*m_pInt) ; + return true; + } + } else +#endif +#if wxUSE_SPINCTRL && !defined(__WXMOTIF__) + if (m_validatorWindow->IsKindOf(CLASSINFO(wxSpinCtrl)) ) + { + wxSpinCtrl* pControl = (wxSpinCtrl*) m_validatorWindow; + if (m_pInt) + { + pControl->SetValue(*m_pInt); + return true; + } + } else +#endif +#if wxUSE_SPINBTN + if (m_validatorWindow->IsKindOf(CLASSINFO(wxSpinButton)) ) + { + wxSpinButton* pControl = (wxSpinButton*) m_validatorWindow; + if (m_pInt) + { + pControl->SetValue(*m_pInt) ; + return true; + } + } else +#endif +#if wxUSE_SLIDER + if (m_validatorWindow->IsKindOf(CLASSINFO(wxSlider)) ) + { + wxSlider* pControl = (wxSlider*) m_validatorWindow; + if (m_pInt) + { + pControl->SetValue(*m_pInt) ; + return true; + } + } else +#endif + + // string controls +#if wxUSE_BUTTON + if (m_validatorWindow->IsKindOf(CLASSINFO(wxButton)) ) + { + wxButton* pControl = (wxButton*) m_validatorWindow; + if (m_pString) + { + pControl->SetLabel(*m_pString) ; + return true; + } + } else +#endif +#if wxUSE_COMBOBOX + if (m_validatorWindow->IsKindOf(CLASSINFO(wxComboBox)) ) + { + wxComboBox* pControl = (wxComboBox*) m_validatorWindow; + if (m_pInt) + { + pControl->SetSelection(*m_pInt) ; + return true; + } + else if (m_pString) + { + if (pControl->FindString(* m_pString) != wxNOT_FOUND) + { + pControl->SetStringSelection(* m_pString); + } + if ((m_validatorWindow->GetWindowStyle() & wxCB_READONLY) == 0) + { + pControl->SetValue(* m_pString); + } + return true; + } + } else +#endif +#if wxUSE_CHOICE + if (m_validatorWindow->IsKindOf(CLASSINFO(wxChoice)) ) + { + wxChoice* pControl = (wxChoice*) m_validatorWindow; + if (m_pInt) + { + pControl->SetSelection(*m_pInt) ; + return true; + } + else if (m_pString) + { + if (pControl->FindString(* m_pString) != wxNOT_FOUND) + { + pControl->SetStringSelection(* m_pString); + } + return true; + } + } else +#endif +#if wxUSE_STATTEXT + if (m_validatorWindow->IsKindOf(CLASSINFO(wxStaticText)) ) + { + wxStaticText* pControl = (wxStaticText*) m_validatorWindow; + if (m_pString) + { + pControl->SetLabel(*m_pString) ; + return true; + } + } else +#endif +#if wxUSE_TEXTCTRL + if (m_validatorWindow->IsKindOf(CLASSINFO(wxTextCtrl)) ) + { + wxTextCtrl* pControl = (wxTextCtrl*) m_validatorWindow; + if (m_pString) + { + pControl->SetValue(*m_pString) ; + return true; + } + else if (m_pInt) + { + wxString str; + str.Printf(wxT("%d"), *m_pInt); + pControl->SetValue(str); + return true; + } + } else +#endif + + // array controls +#if wxUSE_CHECKLISTBOX + // NOTE: wxCheckListBox is a wxListBox, so wxCheckListBox MUST come first: + if (m_validatorWindow->IsKindOf(CLASSINFO(wxCheckListBox)) ) + { + wxCheckListBox* pControl = (wxCheckListBox*) m_validatorWindow; + if (m_pArrayInt) + { + // clear all selections + size_t i, + count = pControl->GetCount(); + for ( i = 0 ; i < count; i++ ) + pControl->Check(i, false); + + // select each item in our array + count = m_pArrayInt->GetCount(); + for ( i = 0 ; i < count; i++ ) + pControl->Check(m_pArrayInt->Item(i)); + + return true; + } + else + return false; + } else +#endif +#if wxUSE_LISTBOX + if (m_validatorWindow->IsKindOf(CLASSINFO(wxListBox)) ) + { + wxListBox* pControl = (wxListBox*) m_validatorWindow; + if (m_pArrayInt) + { + // clear all selections + size_t i, + count = pControl->GetCount(); + for ( i = 0 ; i < count; i++ ) + pControl->Deselect(i); + + // select each item in our array + count = m_pArrayInt->GetCount(); + for ( i = 0 ; i < count; i++ ) + pControl->SetSelection(m_pArrayInt->Item(i)); + + return true; + } + } else +#endif + ; // to match the last 'else' above + + // unrecognized control, or bad pointer + return false; +} + +// Called to transfer data from the window +bool wxGenericValidator::TransferFromWindow(void) +{ + if ( !m_validatorWindow ) + return false; + + // BOOL CONTROLS ************************************** +#if wxUSE_CHECKBOX + if (m_validatorWindow->IsKindOf(CLASSINFO(wxCheckBox)) ) + { + wxCheckBox* pControl = (wxCheckBox*) m_validatorWindow; + if (m_pBool) + { + *m_pBool = pControl->GetValue() ; + return true; + } + } else +#endif +#if wxUSE_RADIOBTN + if (m_validatorWindow->IsKindOf(CLASSINFO(wxRadioButton)) ) + { + wxRadioButton* pControl = (wxRadioButton*) m_validatorWindow; + if (m_pBool) + { + *m_pBool = pControl->GetValue() ; + return true; + } + } else +#endif +#if wxUSE_TOGGLEBTN + if (m_validatorWindow->IsKindOf(CLASSINFO(wxToggleButton)) ) + { + wxToggleButton *pControl = (wxToggleButton *) m_validatorWindow; + if (m_pBool) + { + *m_pBool = pControl->GetValue() ; + return true; + } + } else +#endif + + // INT CONTROLS *************************************** +#if wxUSE_GAUGE + if (m_validatorWindow->IsKindOf(CLASSINFO(wxGauge)) ) + { + wxGauge* pControl = (wxGauge*) m_validatorWindow; + if (m_pInt) + { + *m_pInt = pControl->GetValue() ; + return true; + } + } else +#endif +#if wxUSE_RADIOBOX + if (m_validatorWindow->IsKindOf(CLASSINFO(wxRadioBox)) ) + { + wxRadioBox* pControl = (wxRadioBox*) m_validatorWindow; + if (m_pInt) + { + *m_pInt = pControl->GetSelection() ; + return true; + } + } else +#endif +#if wxUSE_SCROLLBAR + if (m_validatorWindow->IsKindOf(CLASSINFO(wxScrollBar)) ) + { + wxScrollBar* pControl = (wxScrollBar*) m_validatorWindow; + if (m_pInt) + { + *m_pInt = pControl->GetThumbPosition() ; + return true; + } + } else +#endif +#if wxUSE_SPINCTRL && !defined(__WXMOTIF__) + if (m_validatorWindow->IsKindOf(CLASSINFO(wxSpinCtrl)) ) + { + wxSpinCtrl* pControl = (wxSpinCtrl*) m_validatorWindow; + if (m_pInt) + { + *m_pInt=pControl->GetValue(); + return true; + } + } else +#endif +#if wxUSE_SPINBTN + if (m_validatorWindow->IsKindOf(CLASSINFO(wxSpinButton)) ) + { + wxSpinButton* pControl = (wxSpinButton*) m_validatorWindow; + if (m_pInt) + { + *m_pInt = pControl->GetValue() ; + return true; + } + } else +#endif +#if wxUSE_SLIDER + if (m_validatorWindow->IsKindOf(CLASSINFO(wxSlider)) ) + { + wxSlider* pControl = (wxSlider*) m_validatorWindow; + if (m_pInt) + { + *m_pInt = pControl->GetValue() ; + return true; + } + } else +#endif + + // STRING CONTROLS ************************************ +#if wxUSE_BUTTON + if (m_validatorWindow->IsKindOf(CLASSINFO(wxButton)) ) + { + wxButton* pControl = (wxButton*) m_validatorWindow; + if (m_pString) + { + *m_pString = pControl->GetLabel() ; + return true; + } + } else +#endif +#if wxUSE_COMBOBOX + if (m_validatorWindow->IsKindOf(CLASSINFO(wxComboBox)) ) + { + wxComboBox* pControl = (wxComboBox*) m_validatorWindow; + if (m_pInt) + { + *m_pInt = pControl->GetSelection() ; + return true; + } + else if (m_pString) + { + if (m_validatorWindow->GetWindowStyle() & wxCB_READONLY) + *m_pString = pControl->GetStringSelection(); + else + *m_pString = pControl->GetValue(); + return true; + } + } else +#endif +#if wxUSE_CHOICE + if (m_validatorWindow->IsKindOf(CLASSINFO(wxChoice)) ) + { + wxChoice* pControl = (wxChoice*) m_validatorWindow; + if (m_pInt) + { + *m_pInt = pControl->GetSelection() ; + return true; + } + else if (m_pString) + { + *m_pString = pControl->GetStringSelection(); + return true; + } + } else +#endif +#if wxUSE_STATTEXT + if (m_validatorWindow->IsKindOf(CLASSINFO(wxStaticText)) ) + { + wxStaticText* pControl = (wxStaticText*) m_validatorWindow; + if (m_pString) + { + *m_pString = pControl->GetLabel() ; + return true; + } + } else +#endif +#if wxUSE_TEXTCTRL + if (m_validatorWindow->IsKindOf(CLASSINFO(wxTextCtrl)) ) + { + wxTextCtrl* pControl = (wxTextCtrl*) m_validatorWindow; + if (m_pString) + { + *m_pString = pControl->GetValue() ; + return true; + } + else if (m_pInt) + { + *m_pInt = wxAtoi(pControl->GetValue()); + return true; + } + } else +#endif + + // ARRAY CONTROLS ************************************* +#if wxUSE_CHECKLISTBOX + // NOTE: wxCheckListBox isa wxListBox, so wxCheckListBox MUST come first: + if (m_validatorWindow->IsKindOf(CLASSINFO(wxCheckListBox)) ) + { + wxCheckListBox* pControl = (wxCheckListBox*) m_validatorWindow; + if (m_pArrayInt) + { + // clear our array + m_pArrayInt->Clear(); + + // add each selected item to our array + size_t i, + count = pControl->GetCount(); + for ( i = 0; i < count; i++ ) + { + if (pControl->IsChecked(i)) + m_pArrayInt->Add(i); + } + + return true; + } + else + return false; + } else +#endif +#if wxUSE_LISTBOX + if (m_validatorWindow->IsKindOf(CLASSINFO(wxListBox)) ) + { + wxListBox* pControl = (wxListBox*) m_validatorWindow; + if (m_pArrayInt) + { + // clear our array + m_pArrayInt->Clear(); + + // add each selected item to our array + size_t i, + count = pControl->GetCount(); + for ( i = 0; i < count; i++ ) + { + if (pControl->IsSelected(i)) + m_pArrayInt->Add(i); + } + + return true; + } + } else +#endif + + // unrecognized control, or bad pointer + return false; + + return false; +} + +/* + Called by constructors to initialize ALL data members +*/ +void wxGenericValidator::Initialize() +{ + m_pBool = 0; + m_pInt = 0; + m_pString = 0; + m_pArrayInt = 0; +} + +#endif + // wxUSE_VALIDATORS diff --git a/Externals/wxWidgets/src/common/validate.cpp b/Externals/wxWidgets/src/common/validate.cpp new file mode 100644 index 0000000000..d4ba5e61af --- /dev/null +++ b/Externals/wxWidgets/src/common/validate.cpp @@ -0,0 +1,45 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/validate.cpp +// Purpose: wxValidator +// Author: Julian Smart +// Modified by: +// Created: 04/01/98 +// RCS-ID: $Id: validate.cpp 39656 2006-06-09 21:21:53Z ABX $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_VALIDATORS + +#include "wx/validate.h" + +#ifndef WX_PRECOMP + #include "wx/window.h" +#endif + +const wxValidator wxDefaultValidator; + +IMPLEMENT_DYNAMIC_CLASS(wxValidator, wxEvtHandler) + +// VZ: personally, I think true would be more appropriate - these bells are +// _annoying_ +bool wxValidator::ms_isSilent = false; + +wxValidator::wxValidator() +{ + m_validatorWindow = (wxWindow *) NULL; +} + +wxValidator::~wxValidator() +{ +} + +#endif + // wxUSE_VALIDATORS diff --git a/Externals/wxWidgets/src/common/valtext.cpp b/Externals/wxWidgets/src/common/valtext.cpp new file mode 100644 index 0000000000..e9eba332a1 --- /dev/null +++ b/Externals/wxWidgets/src/common/valtext.cpp @@ -0,0 +1,344 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/valtext.cpp +// Purpose: wxTextValidator +// Author: Julian Smart +// Modified by: +// Created: 04/01/98 +// RCS-ID: $Id: valtext.cpp 39656 2006-06-09 21:21:53Z ABX $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_VALIDATORS && wxUSE_TEXTCTRL + +#include "wx/valtext.h" + +#ifndef WX_PRECOMP + #include + #include "wx/textctrl.h" + #include "wx/utils.h" + #include "wx/msgdlg.h" + #include "wx/intl.h" +#endif + +#include +#include +#include + +#ifdef __SALFORDC__ + #include +#endif + +IMPLEMENT_DYNAMIC_CLASS(wxTextValidator, wxValidator) + +BEGIN_EVENT_TABLE(wxTextValidator, wxValidator) + EVT_CHAR(wxTextValidator::OnChar) +END_EVENT_TABLE() + +static bool wxIsNumeric(const wxString& val); + +wxTextValidator::wxTextValidator(long style, wxString *val) +{ + m_validatorStyle = style; + m_stringValue = val; +/* + m_refData = new wxVTextRefData; + + M_VTEXTDATA->m_validatorStyle = style; + M_VTEXTDATA->m_stringValue = val; +*/ +} + +wxTextValidator::wxTextValidator(const wxTextValidator& val) + : wxValidator() +{ + Copy(val); +} + +bool wxTextValidator::Copy(const wxTextValidator& val) +{ + wxValidator::Copy(val); + + m_validatorStyle = val.m_validatorStyle; + m_stringValue = val.m_stringValue; + + m_includes = val.m_includes; + m_excludes = val.m_excludes; + + return true; +} + +static bool wxIsAlpha(const wxString& val) +{ + int i; + for ( i = 0; i < (int)val.length(); i++) + { + if (!wxIsalpha(val[i])) + return false; + } + return true; +} + +static bool wxIsAlphaNumeric(const wxString& val) +{ + int i; + for ( i = 0; i < (int)val.length(); i++) + { + if (!wxIsalnum(val[i])) + return false; + } + return true; +} + +// Called when the value in the window must be validated. +// This function can pop up an error message. +bool wxTextValidator::Validate(wxWindow *parent) +{ + if( !CheckValidator() ) + return false; + + wxTextCtrl *control = (wxTextCtrl *) m_validatorWindow; + + // If window is disabled, simply return + if ( !control->IsEnabled() ) + return true; + + wxString val(control->GetValue()); + + bool ok = true; + + // NB: this format string should contian exactly one '%s' + wxString errormsg; + + bool includes = (m_validatorStyle & wxFILTER_INCLUDE_LIST) != 0; + if ( includes || (m_validatorStyle & wxFILTER_EXCLUDE_LIST) ) + { + // if includes, it's only ok to have the members of the list, + // otherwise it's only ok to have non-members + ok = includes == (m_includes.Index(val) != wxNOT_FOUND); + if ( !ok ) + { + errormsg = _("'%s' is invalid"); + } + } + else if ( (m_validatorStyle & wxFILTER_ASCII) && !val.IsAscii() ) + { + ok = false; + + errormsg = _("'%s' should only contain ASCII characters."); + } + else if ( (m_validatorStyle & wxFILTER_ALPHA) && !wxIsAlpha(val) ) + { + ok = false; + + errormsg = _("'%s' should only contain alphabetic characters."); + } + else if ( (m_validatorStyle & wxFILTER_ALPHANUMERIC) && !wxIsAlphaNumeric(val)) + { + ok = false; + + errormsg = _("'%s' should only contain alphabetic or numeric characters."); + } + else if ( (m_validatorStyle & wxFILTER_NUMERIC) && !wxIsNumeric(val)) + { + ok = false; + + errormsg = _("'%s' should be numeric."); + } + else if ( (m_validatorStyle & wxFILTER_INCLUDE_CHAR_LIST) && !IsInCharIncludes(val)) + { + //it's only ok to have the members of the list + errormsg = _("'%s' is invalid"); + ok = false; + } + else if ( (m_validatorStyle & wxFILTER_EXCLUDE_CHAR_LIST) && !IsNotInCharExcludes(val)) + { + // it's only ok to have non-members of the list + errormsg = _("'%s' is invalid"); + ok = false; + } + + if ( !ok ) + { + wxASSERT_MSG( !errormsg.empty(), _T("you forgot to set errormsg") ); + + m_validatorWindow->SetFocus(); + + wxString buf; + buf.Printf(errormsg, val.c_str()); + + wxMessageBox(buf, _("Validation conflict"), + wxOK | wxICON_EXCLAMATION, parent); + } + + return ok; +} + +// Called to transfer data to the window +bool wxTextValidator::TransferToWindow(void) +{ + if( !CheckValidator() ) + return false; + + if ( m_stringValue ) + { + wxTextCtrl *control = (wxTextCtrl *) m_validatorWindow; + control->SetValue(* m_stringValue); + } + + return true; +} + +// Called to transfer data to the window +bool wxTextValidator::TransferFromWindow(void) +{ + if( !CheckValidator() ) + return false; + + if ( m_stringValue ) + { + wxTextCtrl *control = (wxTextCtrl *) m_validatorWindow; + *m_stringValue = control->GetValue(); + } + + return true; +} + +#if WXWIN_COMPATIBILITY_2_4 + +inline void wxCopyStringListToArrayString(wxArrayString& to, const wxStringList& from) +{ + to.Clear(); + + for ( wxStringList::compatibility_iterator pNode = from.GetFirst(); + pNode; + pNode = pNode->GetNext() ) + { + to.Add(pNode->GetData()); + } +} + +inline void wxCopyArrayStringToStringList(wxStringList& to, const wxArrayString& from) +{ + to.Clear(); + + for(size_t i = 0; i < from.GetCount(); ++i) + to.Add(from[i]); +} + +wxStringList& wxTextValidator::GetIncludeList() +{ + wxCopyArrayStringToStringList(m_includeList, m_includes); + return m_includeList; +} + +wxStringList& wxTextValidator::GetExcludeList() +{ + wxCopyArrayStringToStringList(m_excludeList, m_excludes); + return m_excludeList; +} + +void wxTextValidator::SetIncludeList(const wxStringList& list) +{ + wxCopyStringListToArrayString(m_includes, list); +} + +void wxTextValidator::SetExcludeList(const wxStringList& list) +{ + wxCopyStringListToArrayString(m_excludes, list); +} + +bool wxTextValidator::IsInCharIncludeList(const wxString& val) +{ + return IsInCharIncludes(val); +} + +bool wxTextValidator::IsNotInCharExcludeList(const wxString& val) +{ + return IsNotInCharExcludes(val); +} + +#endif //compat 2.4 + + +bool wxTextValidator::IsInCharIncludes(const wxString& val) +{ + size_t i; + for ( i = 0; i < val.length(); i++) + { + if (m_includes.Index((wxString) val[i]) == wxNOT_FOUND) + return false; + } + return true; +} + +bool wxTextValidator::IsNotInCharExcludes(const wxString& val) +{ + size_t i; + for ( i = 0; i < val.length(); i++) + { + if (m_excludes.Index((wxString) val[i]) != wxNOT_FOUND) + return false; + } + return true; +} + +void wxTextValidator::OnChar(wxKeyEvent& event) +{ +/* + if ( !M_VTEXTDATA ) + return; +*/ + + if ( m_validatorWindow ) + { + int keyCode = event.GetKeyCode(); + + // we don't filter special keys and Delete + if ( + !(keyCode < WXK_SPACE || keyCode == WXK_DELETE || keyCode > WXK_START) && + ( + ((m_validatorStyle & wxFILTER_INCLUDE_CHAR_LIST) && !IsInCharIncludes(wxString((wxChar) keyCode, 1))) || + ((m_validatorStyle & wxFILTER_EXCLUDE_CHAR_LIST) && !IsNotInCharExcludes(wxString((wxChar) keyCode, 1))) || + ((m_validatorStyle & wxFILTER_ASCII) && !isascii(keyCode)) || + ((m_validatorStyle & wxFILTER_ALPHA) && !wxIsalpha(keyCode)) || + ((m_validatorStyle & wxFILTER_ALPHANUMERIC) && !wxIsalnum(keyCode)) || + ((m_validatorStyle & wxFILTER_NUMERIC) && !wxIsdigit(keyCode) + && keyCode != wxT('.') && keyCode != wxT(',') && keyCode != wxT('-') && keyCode != wxT('+') && keyCode != wxT('e') && keyCode != wxT('E')) + ) + ) + { + if ( !wxValidator::IsSilent() ) + wxBell(); + + // eat message + return; + } + } + + event.Skip(); +} + +static bool wxIsNumeric(const wxString& val) +{ + int i; + for ( i = 0; i < (int)val.length(); i++) + { + // Allow for "," (French) as well as "." -- in future we should + // use wxSystemSettings or other to do better localisation + if ((!wxIsdigit(val[i])) && (val[i] != wxT('.')) && (val[i] != wxT(',')) && (val[i] != wxT('e')) && (val[i] != wxT('E')) && (val[i] != wxT('+')) && (val[i] != wxT('-'))) + return false; + } + return true; +} + + +#endif + // wxUSE_VALIDATORS && wxUSE_TEXTCTRL diff --git a/Externals/wxWidgets/src/common/variant.cpp b/Externals/wxWidgets/src/common/variant.cpp new file mode 100644 index 0000000000..76bb93950f --- /dev/null +++ b/Externals/wxWidgets/src/common/variant.cpp @@ -0,0 +1,2030 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/variant.cpp +// Purpose: wxVariant class, container for any type +// Author: Julian Smart +// Modified by: +// Created: 10/09/98 +// RCS-ID: $Id: variant.cpp 45498 2007-04-16 13:03:05Z VZ $ +// Copyright: (c) +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx/wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#include "wx/variant.h" + +#if wxUSE_VARIANT + +#ifndef WX_PRECOMP + #include "wx/string.h" + #include "wx/math.h" + #if wxUSE_STREAMS + #include "wx/stream.h" + #endif +#endif + +#if wxUSE_STD_IOSTREAM + #if wxUSE_IOSTREAMH + #include + #else + #include + #endif +#endif + +#if defined(__MWERKS__) && __MSL__ >= 0x6000 +namespace std {} +using namespace std ; +#endif + +#if wxUSE_STREAMS + #include "wx/txtstrm.h" +#endif + +#include "wx/string.h" +#include "wx/tokenzr.h" + +IMPLEMENT_ABSTRACT_CLASS(wxVariantData, wxObject) + +wxVariant WXDLLIMPEXP_BASE wxNullVariant; + + +/* + * wxVariant + */ + +IMPLEMENT_DYNAMIC_CLASS(wxVariant, wxObject) + +wxVariant::wxVariant() +{ + m_data = (wxVariantData*) NULL; +} + +bool wxVariant::IsNull() const +{ + return (m_data == (wxVariantData*) NULL); +} + +void wxVariant::MakeNull() +{ + UnRef(); +} + +void wxVariant::Clear() +{ + m_name = wxEmptyString; +} + +wxVariant::wxVariant(const wxVariant& variant) + : wxObject() +{ + m_data = (wxVariantData*) NULL; + + if (!variant.IsNull()) + Ref(variant); + + m_name = variant.m_name; +} + +wxVariant::wxVariant(wxVariantData* data, const wxString& name) // User-defined data +{ + m_data = data; + m_name = name; +} + +wxVariant::~wxVariant() +{ + UnRef(); +} + +// Assignment +void wxVariant::operator= (const wxVariant& variant) +{ + Ref(variant); + m_name = variant.m_name; +} + +// myVariant = new wxStringVariantData("hello") +void wxVariant::operator= (wxVariantData* variantData) +{ + UnRef(); + m_data = variantData; +} + +bool wxVariant::operator== (const wxVariant& variant) const +{ + if (IsNull() || variant.IsNull()) + return (IsNull() == variant.IsNull()); + + return (GetData()->Eq(* variant.GetData())); +} + +bool wxVariant::operator!= (const wxVariant& variant) const +{ + return (!(*this == variant)); +} + + +wxString wxVariant::MakeString() const +{ + if (!IsNull()) + { + wxString str; + if (GetData()->Write(str)) + return str; + } + return wxEmptyString; +} + +void wxVariant::SetData(wxVariantData* data) +{ + UnRef(); + m_data = data; +} + +void wxVariant::Ref(const wxVariant& clone) +{ + // nothing to be done + if (m_data == clone.m_data) + return; + + // delete reference to old data + UnRef(); + + // reference new data + if ( clone.m_data ) + { + m_data = clone.m_data; + m_data->m_count++; + } +} + + +void wxVariant::UnRef() +{ + if ( m_data ) + { + wxASSERT_MSG( m_data->m_count > 0, _T("invalid ref data count") ); + + m_data->DecRef(); + m_data = NULL; + } +} + + +// Returns a string representing the type of the variant, +// e.g. "string", "bool", "list", "double", "long" +wxString wxVariant::GetType() const +{ + if (IsNull()) + return wxString(wxT("null")); + else + return GetData()->GetType(); +} + + +bool wxVariant::IsType(const wxString& type) const +{ + return (GetType() == type); +} + +bool wxVariant::IsValueKindOf(const wxClassInfo* type) const +{ + wxClassInfo* info=GetData()->GetValueClassInfo(); + return info ? info->IsKindOf(type) : false ; +} + + +// ----------------------------------------------------------------- +// wxVariantDataLong +// ----------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxVariantDataLong: public wxVariantData +{ +DECLARE_DYNAMIC_CLASS(wxVariantDataLong) +public: + wxVariantDataLong() { m_value = 0; } + wxVariantDataLong(long value) { m_value = value; } + + inline long GetValue() const { return m_value; } + inline void SetValue(long value) { m_value = value; } + + virtual bool Eq(wxVariantData& data) const; + + virtual bool Read(wxString& str); + virtual bool Write(wxString& str) const; +#if wxUSE_STD_IOSTREAM + virtual bool Read(wxSTD istream& str); + virtual bool Write(wxSTD ostream& str) const; +#endif +#if wxUSE_STREAMS + virtual bool Read(wxInputStream& str); + virtual bool Write(wxOutputStream &str) const; +#endif // wxUSE_STREAMS + + virtual wxString GetType() const { return wxT("long"); } + +protected: + long m_value; +}; + +IMPLEMENT_DYNAMIC_CLASS(wxVariantDataLong, wxVariantData) + +bool wxVariantDataLong::Eq(wxVariantData& data) const +{ + wxASSERT_MSG( (data.GetType() == wxT("long")), wxT("wxVariantDataLong::Eq: argument mismatch") ); + + wxVariantDataLong& otherData = (wxVariantDataLong&) data; + + return (otherData.m_value == m_value); +} + +#if wxUSE_STD_IOSTREAM +bool wxVariantDataLong::Write(wxSTD ostream& str) const +{ + wxString s; + Write(s); + str << (const char*) s.mb_str(); + return true; +} +#endif + +bool wxVariantDataLong::Write(wxString& str) const +{ + str.Printf(wxT("%ld"), m_value); + return true; +} + +#if wxUSE_STD_IOSTREAM +bool wxVariantDataLong::Read(wxSTD istream& str) +{ + str >> m_value; + return true; +} +#endif + +#if wxUSE_STREAMS +bool wxVariantDataLong::Write(wxOutputStream& str) const +{ + wxTextOutputStream s(str); + + s.Write32((size_t)m_value); + return true; +} + +bool wxVariantDataLong::Read(wxInputStream& str) +{ + wxTextInputStream s(str); + m_value = s.Read32(); + return true; +} +#endif // wxUSE_STREAMS + +bool wxVariantDataLong::Read(wxString& str) +{ + m_value = wxAtol((const wxChar*) str); + return true; +} + +// wxVariant + +wxVariant::wxVariant(long val, const wxString& name) +{ + m_data = new wxVariantDataLong(val); + m_name = name; +} + +wxVariant::wxVariant(int val, const wxString& name) +{ + m_data = new wxVariantDataLong((long)val); + m_name = name; +} + +wxVariant::wxVariant(short val, const wxString& name) +{ + m_data = new wxVariantDataLong((long)val); + m_name = name; +} + +bool wxVariant::operator== (long value) const +{ + long thisValue; + if (!Convert(&thisValue)) + return false; + else + return (value == thisValue); +} + +bool wxVariant::operator!= (long value) const +{ + return (!((*this) == value)); +} + +void wxVariant::operator= (long value) +{ + if (GetType() == wxT("long") && + m_data->GetRefCount() == 1) + { + ((wxVariantDataLong*)GetData())->SetValue(value); + } + else + { + UnRef(); + m_data = new wxVariantDataLong(value); + } +} + +long wxVariant::GetLong() const +{ + long value; + if (Convert(& value)) + return value; + else + { + wxFAIL_MSG(wxT("Could not convert to a long")); + return 0; + } +} + +// ----------------------------------------------------------------- +// wxVariantDoubleData +// ----------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxVariantDoubleData: public wxVariantData +{ +DECLARE_DYNAMIC_CLASS(wxVariantDoubleData) +public: + wxVariantDoubleData() { m_value = 0.0; } + wxVariantDoubleData(double value) { m_value = value; } + + inline double GetValue() const { return m_value; } + inline void SetValue(double value) { m_value = value; } + + virtual bool Eq(wxVariantData& data) const; + virtual bool Read(wxString& str); +#if wxUSE_STD_IOSTREAM + virtual bool Write(wxSTD ostream& str) const; +#endif + virtual bool Write(wxString& str) const; +#if wxUSE_STD_IOSTREAM + virtual bool Read(wxSTD istream& str); +#endif +#if wxUSE_STREAMS + virtual bool Read(wxInputStream& str); + virtual bool Write(wxOutputStream &str) const; +#endif // wxUSE_STREAMS + virtual wxString GetType() const { return wxT("double"); } + +protected: + double m_value; +}; + +IMPLEMENT_DYNAMIC_CLASS(wxVariantDoubleData, wxVariantData) + +bool wxVariantDoubleData::Eq(wxVariantData& data) const +{ + wxASSERT_MSG( (data.GetType() == wxT("double")), wxT("wxVariantDoubleData::Eq: argument mismatch") ); + + wxVariantDoubleData& otherData = (wxVariantDoubleData&) data; + + return wxIsSameDouble(otherData.m_value, m_value); +} + +#if wxUSE_STD_IOSTREAM +bool wxVariantDoubleData::Write(wxSTD ostream& str) const +{ + wxString s; + Write(s); + str << (const char*) s.mb_str(); + return true; +} +#endif + +bool wxVariantDoubleData::Write(wxString& str) const +{ + str.Printf(wxT("%.14g"), m_value); + return true; +} + +#if wxUSE_STD_IOSTREAM +bool wxVariantDoubleData::Read(wxSTD istream& str) +{ + str >> m_value; + return true; +} +#endif + +#if wxUSE_STREAMS +bool wxVariantDoubleData::Write(wxOutputStream& str) const +{ + wxTextOutputStream s(str); + s.WriteDouble((double)m_value); + return true; +} + +bool wxVariantDoubleData::Read(wxInputStream& str) +{ + wxTextInputStream s(str); + m_value = (float)s.ReadDouble(); + return true; +} +#endif // wxUSE_STREAMS + +bool wxVariantDoubleData::Read(wxString& str) +{ + m_value = wxAtof((const wxChar*) str); + return true; +} + +// wxVariant double code + +wxVariant::wxVariant(double val, const wxString& name) +{ + m_data = new wxVariantDoubleData(val); + m_name = name; +} + +bool wxVariant::operator== (double value) const +{ + double thisValue; + if (!Convert(&thisValue)) + return false; + + return wxIsSameDouble(value, thisValue); +} + +bool wxVariant::operator!= (double value) const +{ + return (!((*this) == value)); +} + +void wxVariant::operator= (double value) +{ + if (GetType() == wxT("double") && + m_data->GetRefCount() == 1) + { + ((wxVariantDoubleData*)GetData())->SetValue(value); + } + else + { + UnRef(); + m_data = new wxVariantDoubleData(value); + } +} + +double wxVariant::GetDouble() const +{ + double value; + if (Convert(& value)) + return value; + else + { + wxFAIL_MSG(wxT("Could not convert to a double number")); + return 0.0; + } +} + +// ----------------------------------------------------------------- +// wxVariantBoolData +// ----------------------------------------------------------------- + +#ifdef HAVE_BOOL + +class WXDLLIMPEXP_BASE wxVariantDataBool: public wxVariantData +{ +DECLARE_DYNAMIC_CLASS(wxVariantDataBool) +public: + wxVariantDataBool() { m_value = 0; } + wxVariantDataBool(bool value) { m_value = value; } + + inline bool GetValue() const { return m_value; } + inline void SetValue(bool value) { m_value = value; } + + virtual bool Eq(wxVariantData& data) const; +#if wxUSE_STD_IOSTREAM + virtual bool Write(wxSTD ostream& str) const; +#endif + virtual bool Write(wxString& str) const; + virtual bool Read(wxString& str); +#if wxUSE_STD_IOSTREAM + virtual bool Read(wxSTD istream& str); +#endif +#if wxUSE_STREAMS + virtual bool Read(wxInputStream& str); + virtual bool Write(wxOutputStream& str) const; +#endif // wxUSE_STREAMS + virtual wxString GetType() const { return wxT("bool"); } + +protected: + bool m_value; +}; + +IMPLEMENT_DYNAMIC_CLASS(wxVariantDataBool, wxVariantData) + +bool wxVariantDataBool::Eq(wxVariantData& data) const +{ + wxASSERT_MSG( (data.GetType() == wxT("bool")), wxT("wxVariantDataBool::Eq: argument mismatch") ); + + wxVariantDataBool& otherData = (wxVariantDataBool&) data; + + return (otherData.m_value == m_value); +} + +#if wxUSE_STD_IOSTREAM +bool wxVariantDataBool::Write(wxSTD ostream& str) const +{ + wxString s; + Write(s); + str << (const char*) s.mb_str(); + return true; +} +#endif + +bool wxVariantDataBool::Write(wxString& str) const +{ + str.Printf(wxT("%d"), (int) m_value); + return true; +} + +#if wxUSE_STD_IOSTREAM +bool wxVariantDataBool::Read(wxSTD istream& WXUNUSED(str)) +{ + wxFAIL_MSG(wxT("Unimplemented")); +// str >> (long) m_value; + return false; +} +#endif + +#if wxUSE_STREAMS +bool wxVariantDataBool::Write(wxOutputStream& str) const +{ + wxTextOutputStream s(str); + + s.Write8(m_value); + return true; +} + +bool wxVariantDataBool::Read(wxInputStream& str) +{ + wxTextInputStream s(str); + + m_value = s.Read8() != 0; + return true; +} +#endif // wxUSE_STREAMS + +bool wxVariantDataBool::Read(wxString& str) +{ + m_value = (wxAtol((const wxChar*) str) != 0); + return true; +} + +// wxVariant **** + +wxVariant::wxVariant(bool val, const wxString& name) +{ + m_data = new wxVariantDataBool(val); + m_name = name; +} + +bool wxVariant::operator== (bool value) const +{ + bool thisValue; + if (!Convert(&thisValue)) + return false; + else + return (value == thisValue); +} + +bool wxVariant::operator!= (bool value) const +{ + return (!((*this) == value)); +} + +void wxVariant::operator= (bool value) +{ + if (GetType() == wxT("bool") && + m_data->GetRefCount() == 1) + { + ((wxVariantDataBool*)GetData())->SetValue(value); + } + else + { + UnRef(); + m_data = new wxVariantDataBool(value); + } +} + +bool wxVariant::GetBool() const +{ + bool value; + if (Convert(& value)) + return value; + else + { + wxFAIL_MSG(wxT("Could not convert to a bool")); + return 0; + } +} + +#endif // HAVE_BOOL + +// ----------------------------------------------------------------- +// wxVariantDataChar +// ----------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxVariantDataChar: public wxVariantData +{ +DECLARE_DYNAMIC_CLASS(wxVariantDataChar) +public: + wxVariantDataChar() { m_value = 0; } + wxVariantDataChar(wxChar value) { m_value = value; } + + inline wxChar GetValue() const { return m_value; } + inline void SetValue(wxChar value) { m_value = value; } + + virtual bool Eq(wxVariantData& data) const; +#if wxUSE_STD_IOSTREAM + virtual bool Read(wxSTD istream& str); + virtual bool Write(wxSTD ostream& str) const; +#endif + virtual bool Read(wxString& str); + virtual bool Write(wxString& str) const; +#if wxUSE_STREAMS + virtual bool Read(wxInputStream& str); + virtual bool Write(wxOutputStream& str) const; +#endif // wxUSE_STREAMS + virtual wxString GetType() const { return wxT("char"); } + +protected: + wxChar m_value; +}; + +IMPLEMENT_DYNAMIC_CLASS(wxVariantDataChar, wxVariantData) + +bool wxVariantDataChar::Eq(wxVariantData& data) const +{ + wxASSERT_MSG( (data.GetType() == wxT("char")), wxT("wxVariantDataChar::Eq: argument mismatch") ); + + wxVariantDataChar& otherData = (wxVariantDataChar&) data; + + return (otherData.m_value == m_value); +} + +#if wxUSE_STD_IOSTREAM +bool wxVariantDataChar::Write(wxSTD ostream& str) const +{ + wxString s; + Write(s); + str << (const char*) s.mb_str(); + return true; +} +#endif + +bool wxVariantDataChar::Write(wxString& str) const +{ + str.Printf(wxT("%c"), m_value); + return true; +} + +#if wxUSE_STD_IOSTREAM +bool wxVariantDataChar::Read(wxSTD istream& WXUNUSED(str)) +{ + wxFAIL_MSG(wxT("Unimplemented")); + + return false; +} +#endif + +#if wxUSE_STREAMS +bool wxVariantDataChar::Write(wxOutputStream& str) const +{ + wxTextOutputStream s(str); + + s << m_value; + + return true; +} + +bool wxVariantDataChar::Read(wxInputStream& str) +{ + wxTextInputStream s(str); + + s >> m_value; + + return true; +} +#endif // wxUSE_STREAMS + +bool wxVariantDataChar::Read(wxString& str) +{ + m_value = str[size_t(0)]; + return true; +} + +wxVariant::wxVariant(wxChar val, const wxString& name) +{ + m_data = new wxVariantDataChar(val); + m_name = name; +} + +bool wxVariant::operator== (wxChar value) const +{ + wxChar thisValue; + if (!Convert(&thisValue)) + return false; + else + return (value == thisValue); +} + +bool wxVariant::operator!= (wxChar value) const +{ + return (!((*this) == value)); +} + +void wxVariant::operator= (wxChar value) +{ + if (GetType() == wxT("char") && + m_data->GetRefCount() == 1) + { + ((wxVariantDataChar*)GetData())->SetValue(value); + } + else + { + UnRef(); + m_data = new wxVariantDataChar(value); + } +} + +wxChar wxVariant::GetChar() const +{ + wxChar value; + if (Convert(& value)) + return value; + else + { + wxFAIL_MSG(wxT("Could not convert to a char")); + return 0; + } +} + +// ---------------------------------------------------------------------------- +// wxVariantDataString +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxVariantDataString: public wxVariantData +{ +DECLARE_DYNAMIC_CLASS(wxVariantDataString) +public: + wxVariantDataString() { } + wxVariantDataString(const wxString& value) { m_value = value; } + + inline wxString GetValue() const { return m_value; } + inline void SetValue(const wxString& value) { m_value = value; } + + virtual bool Eq(wxVariantData& data) const; +#if wxUSE_STD_IOSTREAM + virtual bool Write(wxSTD ostream& str) const; +#endif + virtual bool Read(wxString& str); + virtual bool Write(wxString& str) const; +#if wxUSE_STD_IOSTREAM + virtual bool Read(wxSTD istream& WXUNUSED(str)) { return false; } +#endif +#if wxUSE_STREAMS + virtual bool Read(wxInputStream& str); + virtual bool Write(wxOutputStream& str) const; +#endif // wxUSE_STREAMS + virtual wxString GetType() const { return wxT("string"); } + +protected: + wxString m_value; +}; + +bool wxVariantDataString::Eq(wxVariantData& data) const +{ + wxASSERT_MSG( (data.GetType() == wxT("string")), wxT("wxVariantDataString::Eq: argument mismatch") ); + + wxVariantDataString& otherData = (wxVariantDataString&) data; + + return (otherData.m_value == m_value); +} + +#if wxUSE_STD_IOSTREAM +bool wxVariantDataString::Write(wxSTD ostream& str) const +{ + str << (const char*) m_value.mb_str(); + return true; +} +#endif + +bool wxVariantDataString::Write(wxString& str) const +{ + str = m_value; + return true; +} + +#if wxUSE_STREAMS +bool wxVariantDataString::Write(wxOutputStream& str) const +{ + // why doesn't wxOutputStream::operator<< take "const wxString&" + wxTextOutputStream s(str); + s.WriteString(m_value); + return true; +} + +bool wxVariantDataString::Read(wxInputStream& str) +{ + wxTextInputStream s(str); + + m_value = s.ReadLine(); + return true; +} +#endif // wxUSE_STREAMS + +bool wxVariantDataString::Read(wxString& str) +{ + m_value = str; + return true; +} + +IMPLEMENT_DYNAMIC_CLASS(wxVariantDataString, wxVariantData) + +// wxVariant **** + +wxVariant::wxVariant(const wxString& val, const wxString& name) +{ + m_data = new wxVariantDataString(val); + m_name = name; +} + +wxVariant::wxVariant(const wxChar* val, const wxString& name) +{ + m_data = new wxVariantDataString(wxString(val)); + m_name = name; +} + +bool wxVariant::operator== (const wxString& value) const +{ + wxString thisValue; + if (!Convert(&thisValue)) + return false; + + return value == thisValue; +} + +bool wxVariant::operator!= (const wxString& value) const +{ + return (!((*this) == value)); +} + +void wxVariant::operator= (const wxString& value) +{ + if (GetType() == wxT("string") && + m_data->GetRefCount() == 1) + { + ((wxVariantDataString*)GetData())->SetValue(value); + } + else + { + UnRef(); + m_data = new wxVariantDataString(value); + } +} + +void wxVariant::operator= (const wxChar* value) +{ + if (GetType() == wxT("string") && + m_data->GetRefCount() == 1) + { + ((wxVariantDataString*)GetData())->SetValue(wxString(value)); + } + else + { + UnRef(); + m_data = new wxVariantDataString(wxString(value)); + } +} + +wxString wxVariant::GetString() const +{ + wxString value; + if (!Convert(& value)) + { + wxFAIL_MSG(wxT("Could not convert to a string")); + } + + return value; +} + +// ---------------------------------------------------------------------------- +// wxVariantDataWxObjectPtr +// ---------------------------------------------------------------------------- + +class wxVariantDataWxObjectPtr: public wxVariantData +{ +DECLARE_DYNAMIC_CLASS(wxVariantDataWxObjectPtr) +public: + wxVariantDataWxObjectPtr() { } + wxVariantDataWxObjectPtr(wxObject* value) { m_value = value; } + + inline wxObject* GetValue() const { return m_value; } + inline void SetValue(wxObject* value) { m_value = value; } + + virtual bool Eq(wxVariantData& data) const; +#if wxUSE_STD_IOSTREAM + virtual bool Write(wxSTD ostream& str) const; +#endif + virtual bool Write(wxString& str) const; +#if wxUSE_STD_IOSTREAM + virtual bool Read(wxSTD istream& str); +#endif + virtual bool Read(wxString& str); + virtual wxString GetType() const ; + virtual wxVariantData* Clone() { return new wxVariantDataWxObjectPtr; } + + virtual wxClassInfo* GetValueClassInfo() ; +protected: + wxObject* m_value; + + DECLARE_NO_COPY_CLASS(wxVariantDataWxObjectPtr) +}; + +IMPLEMENT_DYNAMIC_CLASS(wxVariantDataWxObjectPtr, wxVariantData) + +bool wxVariantDataWxObjectPtr::Eq(wxVariantData& data) const +{ + wxASSERT_MSG( wxIsKindOf((&data), wxVariantDataWxObjectPtr), wxT("wxVariantDataWxObjectPtr::Eq: argument mismatch") ); + + wxVariantDataWxObjectPtr& otherData = (wxVariantDataWxObjectPtr&) data; + + return (otherData.m_value == m_value); +} + +wxString wxVariantDataWxObjectPtr::GetType() const +{ + wxString returnVal(wxT("wxObject")); + if (m_value) { + returnVal = m_value->GetClassInfo()->GetClassName(); + } + return returnVal; +} + +wxClassInfo* wxVariantDataWxObjectPtr::GetValueClassInfo() +{ + wxClassInfo* returnVal=NULL; + + if (m_value) returnVal = m_value->GetClassInfo(); + + return returnVal; +} + +#if wxUSE_STD_IOSTREAM +bool wxVariantDataWxObjectPtr::Write(wxSTD ostream& str) const +{ + wxString s; + Write(s); + str << (const char*) s.mb_str(); + return true; +} +#endif + +bool wxVariantDataWxObjectPtr::Write(wxString& str) const +{ + str.Printf(wxT("%s(%p)"), GetType().c_str(), wx_static_cast(void*, m_value)); + return true; +} + +#if wxUSE_STD_IOSTREAM +bool wxVariantDataWxObjectPtr::Read(wxSTD istream& WXUNUSED(str)) +{ + // Not implemented + return false; +} +#endif + +bool wxVariantDataWxObjectPtr::Read(wxString& WXUNUSED(str)) +{ + // Not implemented + return false; +} + +// wxVariant + +wxVariant::wxVariant( wxObject* val, const wxString& name) +{ + m_data = new wxVariantDataWxObjectPtr(val); + m_name = name; +} + +bool wxVariant::operator== (wxObject* value) const +{ + return (value == ((wxVariantDataWxObjectPtr*)GetData())->GetValue()); +} + +bool wxVariant::operator!= (wxObject* value) const +{ + return (!((*this) == (wxObject*) value)); +} + +void wxVariant::operator= (wxObject* value) +{ + UnRef(); + m_data = new wxVariantDataWxObjectPtr(value); +} + +wxObject* wxVariant::GetWxObjectPtr() const +{ + wxASSERT(wxIsKindOf(GetData(), wxVariantDataWxObjectPtr)); + return (wxObject*) ((wxVariantDataWxObjectPtr*) m_data)->GetValue(); +} + +// ---------------------------------------------------------------------------- +// wxVariantDataVoidPtr +// ---------------------------------------------------------------------------- + +class wxVariantDataVoidPtr: public wxVariantData +{ +DECLARE_DYNAMIC_CLASS(wxVariantDataVoidPtr) +public: + wxVariantDataVoidPtr() { } + wxVariantDataVoidPtr(void* value) { m_value = value; } + + inline void* GetValue() const { return m_value; } + inline void SetValue(void* value) { m_value = value; } + + virtual bool Eq(wxVariantData& data) const; +#if wxUSE_STD_IOSTREAM + virtual bool Write(wxSTD ostream& str) const; +#endif + virtual bool Write(wxString& str) const; +#if wxUSE_STD_IOSTREAM + virtual bool Read(wxSTD istream& str); +#endif + virtual bool Read(wxString& str); + virtual wxString GetType() const { return wxT("void*"); } + virtual wxVariantData* Clone() { return new wxVariantDataVoidPtr; } + +protected: + void* m_value; + + DECLARE_NO_COPY_CLASS(wxVariantDataVoidPtr) +}; + +IMPLEMENT_DYNAMIC_CLASS(wxVariantDataVoidPtr, wxVariantData) + +bool wxVariantDataVoidPtr::Eq(wxVariantData& data) const +{ + wxASSERT_MSG( (data.GetType() == wxT("void*")), wxT("wxVariantDataVoidPtr::Eq: argument mismatch") ); + + wxVariantDataVoidPtr& otherData = (wxVariantDataVoidPtr&) data; + + return (otherData.m_value == m_value); +} + +#if wxUSE_STD_IOSTREAM +bool wxVariantDataVoidPtr::Write(wxSTD ostream& str) const +{ + wxString s; + Write(s); + str << (const char*) s.mb_str(); + return true; +} +#endif + +bool wxVariantDataVoidPtr::Write(wxString& str) const +{ + str.Printf(wxT("%p"), m_value); + return true; +} + +#if wxUSE_STD_IOSTREAM +bool wxVariantDataVoidPtr::Read(wxSTD istream& WXUNUSED(str)) +{ + // Not implemented + return false; +} +#endif + +bool wxVariantDataVoidPtr::Read(wxString& WXUNUSED(str)) +{ + // Not implemented + return false; +} + +// wxVariant + +wxVariant::wxVariant( void* val, const wxString& name) +{ + m_data = new wxVariantDataVoidPtr(val); + m_name = name; +} + +bool wxVariant::operator== (void* value) const +{ + return (value == ((wxVariantDataVoidPtr*)GetData())->GetValue()); +} + +bool wxVariant::operator!= (void* value) const +{ + return (!((*this) == (void*) value)); +} + +void wxVariant::operator= (void* value) +{ + if (GetType() == wxT("void*") && + m_data->GetRefCount() == 1) + { + ((wxVariantDataVoidPtr*)GetData())->SetValue(value); + } + else + { + UnRef(); + m_data = new wxVariantDataVoidPtr(value); + } +} + +void* wxVariant::GetVoidPtr() const +{ + wxASSERT( (GetType() == wxT("void*")) ); + + return (void*) ((wxVariantDataVoidPtr*) m_data)->GetValue(); +} + +// ---------------------------------------------------------------------------- +// wxVariantDataDateTime +// ---------------------------------------------------------------------------- + +#if wxUSE_DATETIME + +class wxVariantDataDateTime: public wxVariantData +{ + DECLARE_DYNAMIC_CLASS(wxVariantDataDateTime) + +public: + wxVariantDataDateTime() { } + wxVariantDataDateTime(const wxDateTime& value) { m_value = value; } +#if wxUSE_ODBC + wxVariantDataDateTime(const TIME_STRUCT* valptr) + { m_value = wxDateTime(valptr->hour, valptr->minute, valptr->second); } + wxVariantDataDateTime(const DATE_STRUCT* valptr) + { m_value = wxDateTime(valptr->day, (wxDateTime::Month) (valptr->month - 1),valptr->year); } + wxVariantDataDateTime(const TIMESTAMP_STRUCT* valptr) + { m_value = wxDateTime(valptr->day, (wxDateTime::Month) (valptr->month - 1), valptr->year, + valptr->hour, valptr->minute, valptr->second, (wxDateTime::wxDateTime_t)valptr->fraction ); } +#endif //ODBC + + inline wxDateTime GetValue() const { return m_value; } + inline void SetValue(const wxDateTime& value) { m_value = value; } + + virtual bool Eq(wxVariantData& data) const; +#if wxUSE_STD_IOSTREAM + virtual bool Write(wxSTD ostream& str) const; +#endif + virtual bool Write(wxString& str) const; +#if wxUSE_STD_IOSTREAM + virtual bool Read(wxSTD istream& str); +#endif + virtual bool Read(wxString& str); + virtual wxString GetType() const { return wxT("datetime"); } + virtual wxVariantData* Clone() { return new wxVariantDataDateTime; } + +protected: + wxDateTime m_value; +}; + + +IMPLEMENT_DYNAMIC_CLASS(wxVariantDataDateTime, wxVariantData) + +bool wxVariantDataDateTime::Eq(wxVariantData& data) const +{ + wxASSERT_MSG( (data.GetType() == wxT("datetime")), wxT("wxVariantDataDateTime::Eq: argument mismatch") ); + + wxVariantDataDateTime& otherData = (wxVariantDataDateTime&) data; + + return (otherData.m_value == m_value); +} + + +#if wxUSE_STD_IOSTREAM +bool wxVariantDataDateTime::Write(wxSTD ostream& str) const +{ + wxString value; + Write( value ); + str << value.c_str(); + return true; +} +#endif + + +bool wxVariantDataDateTime::Write(wxString& str) const +{ + str = m_value.Format(); + return true; +} + + +#if wxUSE_STD_IOSTREAM +bool wxVariantDataDateTime::Read(wxSTD istream& WXUNUSED(str)) +{ + // Not implemented + return false; +} +#endif + + +bool wxVariantDataDateTime::Read(wxString& str) +{ + if(! m_value.ParseDateTime(str)) + return false; + return true; +} + +// wxVariant + +wxVariant::wxVariant(const wxDateTime& val, const wxString& name) // Date +{ + m_data = new wxVariantDataDateTime(val); + m_name = name; +} + +#if wxUSE_ODBC +wxVariant::wxVariant(const TIME_STRUCT* valptr, const wxString& name) // Date +{ + m_data = new wxVariantDataDateTime(valptr); + m_name = name; +} + +wxVariant::wxVariant(const TIMESTAMP_STRUCT* valptr, const wxString& name) // Date +{ + m_data = new wxVariantDataDateTime(valptr); + m_name = name; +} + +wxVariant::wxVariant(const DATE_STRUCT* valptr, const wxString& name) // Date +{ + m_data = new wxVariantDataDateTime(valptr); + m_name = name; +} +#endif // wxUSE_ODBC + +bool wxVariant::operator== (const wxDateTime& value) const +{ + wxDateTime thisValue; + if (!Convert(&thisValue)) + return false; + + return value.IsEqualTo(thisValue); +} + +bool wxVariant::operator!= (const wxDateTime& value) const +{ + return (!((*this) == value)); +} + +void wxVariant::operator= (const wxDateTime& value) +{ + if (GetType() == wxT("datetime") && + m_data->GetRefCount() == 1) + { + ((wxVariantDataDateTime*)GetData())->SetValue(value); + } + else + { + UnRef(); + m_data = new wxVariantDataDateTime(value); + } +} + +#if wxUSE_ODBC +void wxVariant::operator= (const DATE_STRUCT* value) +{ + UnRef(); + m_data = new wxVariantDataDateTime(value); +} + +void wxVariant::operator= (const TIME_STRUCT* value) +{ + UnRef(); + m_data = new wxVariantDataDateTime(value); +} + +void wxVariant::operator= (const TIMESTAMP_STRUCT* value) +{ + UnRef(); + m_data = new wxVariantDataDateTime(value); +} + +#endif // wxUSE_ODBC + +wxDateTime wxVariant::GetDateTime() const +{ + wxDateTime value; + if (!Convert(& value)) + { + wxFAIL_MSG(wxT("Could not convert to a datetime")); + } + + return value; +} + +#endif // wxUSE_DATETIME + +// ---------------------------------------------------------------------------- +// wxVariantDataArrayString +// ---------------------------------------------------------------------------- + +class wxVariantDataArrayString: public wxVariantData +{ +public: + wxVariantDataArrayString() { } + wxVariantDataArrayString(const wxArrayString& value) { m_value = value; } + + wxArrayString GetValue() const { return m_value; } + void SetValue(const wxArrayString& value) { m_value = value; } + + virtual bool Eq(wxVariantData& data) const; +#if wxUSE_STD_IOSTREAM + virtual bool Write(wxSTD ostream& str) const; +#endif + virtual bool Write(wxString& str) const; +#if wxUSE_STD_IOSTREAM + virtual bool Read(wxSTD istream& str); +#endif + virtual bool Read(wxString& str); + virtual wxString GetType() const { return wxT("arrstring"); } + virtual wxVariantData* Clone() { return new wxVariantDataArrayString; } + +protected: + wxArrayString m_value; + + DECLARE_DYNAMIC_CLASS(wxVariantDataArrayString) +}; + +IMPLEMENT_DYNAMIC_CLASS(wxVariantDataArrayString, wxVariantData) + +bool wxVariantDataArrayString::Eq(wxVariantData& data) const +{ + wxASSERT_MSG( data.GetType() == GetType(), wxT("wxVariantDataArrayString::Eq: argument mismatch") ); + + wxVariantDataArrayString& otherData = (wxVariantDataArrayString&) data; + + return otherData.m_value == m_value; +} + +#if wxUSE_STD_IOSTREAM +bool wxVariantDataArrayString::Write(wxSTD ostream& WXUNUSED(str)) const +{ + // Not implemented + return false; +} +#endif + +bool wxVariantDataArrayString::Write(wxString& str) const +{ + size_t count = m_value.GetCount(); + for ( size_t n = 0; n < count; n++ ) + { + if ( n ) + str += _T(';'); + + str += m_value[n]; + } + + return true; +} + + +#if wxUSE_STD_IOSTREAM +bool wxVariantDataArrayString::Read(wxSTD istream& WXUNUSED(str)) +{ + // Not implemented + return false; +} +#endif + + +bool wxVariantDataArrayString::Read(wxString& str) +{ + wxStringTokenizer tk(str, _T(";")); + while ( tk.HasMoreTokens() ) + { + m_value.Add(tk.GetNextToken()); + } + + return true; +} + +// wxVariant + +wxVariant::wxVariant(const wxArrayString& val, const wxString& name) // Strings +{ + m_data = new wxVariantDataArrayString(val); + m_name = name; +} + +bool wxVariant::operator==(const wxArrayString& WXUNUSED(value)) const +{ + wxFAIL_MSG( _T("TODO") ); + + return false; +} + +bool wxVariant::operator!=(const wxArrayString& value) const +{ + return !(*this == value); +} + +void wxVariant::operator=(const wxArrayString& value) +{ + if (GetType() == wxT("arrstring") && + m_data->GetRefCount() == 1) + { + ((wxVariantDataArrayString *)GetData())->SetValue(value); + } + else + { + UnRef(); + m_data = new wxVariantDataArrayString(value); + } +} + +wxArrayString wxVariant::GetArrayString() const +{ + if ( GetType() == wxT("arrstring") ) + return ((wxVariantDataArrayString *)GetData())->GetValue(); + + return wxArrayString(); +} + +// ---------------------------------------------------------------------------- +// wxVariantDataList +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxVariantDataList: public wxVariantData +{ +DECLARE_DYNAMIC_CLASS(wxVariantDataList) +public: + wxVariantDataList() {} + wxVariantDataList(const wxList& list); + virtual ~wxVariantDataList(); + + wxList& GetValue() { return m_value; } + void SetValue(const wxList& value) ; + + virtual bool Eq(wxVariantData& data) const; +#if wxUSE_STD_IOSTREAM + virtual bool Write(wxSTD ostream& str) const; +#endif + virtual bool Write(wxString& str) const; +#if wxUSE_STD_IOSTREAM + virtual bool Read(wxSTD istream& str); +#endif + virtual bool Read(wxString& str); + virtual wxString GetType() const { return wxT("list"); } + + void Clear(); + +protected: + wxList m_value; +}; + +IMPLEMENT_DYNAMIC_CLASS(wxVariantDataList, wxVariantData) + +wxVariantDataList::wxVariantDataList(const wxList& list) +{ + SetValue(list); +} + +wxVariantDataList::~wxVariantDataList() +{ + Clear(); +} + +void wxVariantDataList::SetValue(const wxList& value) +{ + Clear(); + wxList::compatibility_iterator node = value.GetFirst(); + while (node) + { + wxVariant* var = (wxVariant*) node->GetData(); + m_value.Append(new wxVariant(*var)); + node = node->GetNext(); + } +} + +void wxVariantDataList::Clear() +{ + wxList::compatibility_iterator node = m_value.GetFirst(); + while (node) + { + wxVariant* var = (wxVariant*) node->GetData(); + delete var; + node = node->GetNext(); + } + m_value.Clear(); +} + +bool wxVariantDataList::Eq(wxVariantData& data) const +{ + wxASSERT_MSG( (data.GetType() == wxT("list")), wxT("wxVariantDataList::Eq: argument mismatch") ); + + wxVariantDataList& listData = (wxVariantDataList&) data; + wxList::compatibility_iterator node1 = m_value.GetFirst(); + wxList::compatibility_iterator node2 = listData.GetValue().GetFirst(); + while (node1 && node2) + { + wxVariant* var1 = (wxVariant*) node1->GetData(); + wxVariant* var2 = (wxVariant*) node2->GetData(); + if ((*var1) != (*var2)) + return false; + node1 = node1->GetNext(); + node2 = node2->GetNext(); + } + if (node1 || node2) return false; + return true; +} + +#if wxUSE_STD_IOSTREAM +bool wxVariantDataList::Write(wxSTD ostream& str) const +{ + wxString s; + Write(s); + str << (const char*) s.mb_str(); + return true; +} +#endif + +bool wxVariantDataList::Write(wxString& str) const +{ + str = wxEmptyString; + wxList::compatibility_iterator node = m_value.GetFirst(); + while (node) + { + wxVariant* var = (wxVariant*) node->GetData(); + if (node != m_value.GetFirst()) + str += wxT(" "); + wxString str1; + str += var->MakeString(); + node = node->GetNext(); + } + + return true; +} + +#if wxUSE_STD_IOSTREAM +bool wxVariantDataList::Read(wxSTD istream& WXUNUSED(str)) +{ + wxFAIL_MSG(wxT("Unimplemented")); + // TODO + return false; +} +#endif + +bool wxVariantDataList::Read(wxString& WXUNUSED(str)) +{ + wxFAIL_MSG(wxT("Unimplemented")); + // TODO + return false; +} + +// wxVariant + +wxVariant::wxVariant(const wxList& val, const wxString& name) // List of variants +{ + m_data = new wxVariantDataList(val); + m_name = name; +} + +bool wxVariant::operator== (const wxList& value) const +{ + wxASSERT_MSG( (GetType() == wxT("list")), wxT("Invalid type for == operator") ); + + wxVariantDataList other(value); + return (GetData()->Eq(other)); +} + +bool wxVariant::operator!= (const wxList& value) const +{ + return (!((*this) == value)); +} + +void wxVariant::operator= (const wxList& value) +{ + if (GetType() == wxT("list") && + m_data->GetRefCount() == 1) + { + ((wxVariantDataList*)GetData())->SetValue(value); + } + else + { + UnRef(); + m_data = new wxVariantDataList(value); + } +} + +wxList& wxVariant::GetList() const +{ + wxASSERT( (GetType() == wxT("list")) ); + + return (wxList&) ((wxVariantDataList*) m_data)->GetValue(); +} + +// Make empty list +void wxVariant::NullList() +{ + SetData(new wxVariantDataList()); +} + +// Append to list +void wxVariant::Append(const wxVariant& value) +{ + wxList& list = GetList(); + + list.Append(new wxVariant(value)); +} + +// Insert at front of list +void wxVariant::Insert(const wxVariant& value) +{ + wxList& list = GetList(); + + list.Insert(new wxVariant(value)); +} + +// Returns true if the variant is a member of the list +bool wxVariant::Member(const wxVariant& value) const +{ + wxList& list = GetList(); + + wxList::compatibility_iterator node = list.GetFirst(); + while (node) + { + wxVariant* other = (wxVariant*) node->GetData(); + if (value == *other) + return true; + node = node->GetNext(); + } + return false; +} + +// Deletes the nth element of the list +bool wxVariant::Delete(size_t item) +{ + wxList& list = GetList(); + + wxASSERT_MSG( (item < list.GetCount()), wxT("Invalid index to Delete") ); + wxList::compatibility_iterator node = list.Item(item); + wxVariant* variant = (wxVariant*) node->GetData(); + delete variant; + list.Erase(node); + return true; +} + +// Clear list +void wxVariant::ClearList() +{ + if (!IsNull() && (GetType() == wxT("list"))) + { + ((wxVariantDataList*) m_data)->Clear(); + } + else + { + if (!GetType().IsSameAs(wxT("list"))) + UnRef(); + + m_data = new wxVariantDataList; + } +} + +#if WXWIN_COMPATIBILITY_2_4 + +// ---------------------------------------------------------------------------- +// wxVariantDataStringList +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxVariantDataStringList: public wxVariantData +{ +DECLARE_DYNAMIC_CLASS(wxVariantDataStringList) +public: + wxVariantDataStringList() {} + wxVariantDataStringList(const wxStringList& list) { m_value = list; } + + wxStringList& GetValue() const { return (wxStringList&) m_value; } + void SetValue(const wxStringList& value); + + virtual bool Eq(wxVariantData& data) const; +#if wxUSE_STD_IOSTREAM + virtual bool Write(wxSTD ostream& str) const; +#endif + virtual bool Write(wxString& str) const; +#if wxUSE_STD_IOSTREAM + virtual bool Read(wxSTD istream& str); +#endif + virtual bool Read(wxString& str); + virtual wxString GetType() const { return wxT("stringlist"); }; + +protected: + wxStringList m_value; +}; + +IMPLEMENT_DYNAMIC_CLASS(wxVariantDataStringList, wxVariantData) + +void wxVariantDataStringList::SetValue(const wxStringList& value) +{ + m_value = value; +} + +bool wxVariantDataStringList::Eq(wxVariantData& data) const +{ + wxASSERT_MSG( (data.GetType() == wxT("stringlist")), wxT("wxVariantDataStringList::Eq: argument mismatch") ); + + wxVariantDataStringList& listData = (wxVariantDataStringList&) data; + wxStringList::compatibility_iterator node1 = m_value.GetFirst(); + wxStringList::compatibility_iterator node2 = listData.GetValue().GetFirst(); + while (node1 && node2) + { + wxString str1 ( node1->GetData() ); + wxString str2 ( node2->GetData() ); + if (str1 != str2) + return false; + node1 = node1->GetNext(); + node2 = node2->GetNext(); + } + if (node1 || node2) return false; + return true; +} + +#if wxUSE_STD_IOSTREAM +bool wxVariantDataStringList::Write(wxSTD ostream& str) const +{ + wxString s; + Write(s); + str << (const char*) s.mb_str(); + return true; +} +#endif + +bool wxVariantDataStringList::Write(wxString& str) const +{ + str.Empty(); + wxStringList::compatibility_iterator node = m_value.GetFirst(); + while (node) + { + const wxChar* s = node->GetData(); + if (node != m_value.GetFirst()) + str += wxT(" "); + str += s; + node = node->GetNext(); + } + + return true; +} + +#if wxUSE_STD_IOSTREAM +bool wxVariantDataStringList::Read(wxSTD istream& WXUNUSED(str)) +{ + wxFAIL_MSG(wxT("Unimplemented")); + // TODO + return false; +} +#endif + +bool wxVariantDataStringList::Read(wxString& WXUNUSED(str)) +{ + wxFAIL_MSG(wxT("Unimplemented")); + // TODO + return false; +} + +#endif //2.4 compat + +#if WXWIN_COMPATIBILITY_2_4 + +wxVariant::wxVariant(const wxStringList& val, const wxString& name) +{ + m_data = new wxVariantDataStringList(val); + m_name = name; +} + +bool wxVariant::operator== (const wxStringList& value) const +{ + wxASSERT_MSG( (GetType() == wxT("stringlist")), wxT("Invalid type for == operator") ); + + wxVariantDataStringList other(value); + return (GetData()->Eq(other)); +} + +bool wxVariant::operator!= (const wxStringList& value) const +{ + wxASSERT_MSG( (GetType() == wxT("stringlist")), wxT("Invalid type for == operator") ); + + wxVariantDataStringList other(value); + return !(GetData()->Eq(other)); +} + +void wxVariant::operator= (const wxStringList& value) +{ + if (GetType() == wxT("stringlist") && + m_data->GetRefCount() == 1) + { + ((wxVariantDataStringList*)GetData())->SetValue(value); + } + else + { + UnRef(); + m_data = new wxVariantDataStringList(value); + } +} + +// wxVariant + +wxStringList& wxVariant::GetStringList() const +{ + wxASSERT( (GetType() == wxT("stringlist")) ); + + return (wxStringList&) ((wxVariantDataStringList*) m_data)->GetValue(); +} + +#endif + +// Treat a list variant as an array +wxVariant wxVariant::operator[] (size_t idx) const +{ +#if WXWIN_COMPATIBILITY_2_4 + wxASSERT_MSG( (GetType() == wxT("list") || GetType() == wxT("stringlist")), wxT("Invalid type for array operator") ); +#else + wxASSERT_MSG( GetType() == wxT("list"), wxT("Invalid type for array operator") ); +#endif + + if (GetType() == wxT("list")) + { + wxVariantDataList* data = (wxVariantDataList*) m_data; + wxASSERT_MSG( (idx < data->GetValue().GetCount()), wxT("Invalid index for array") ); + return * (wxVariant*) (data->GetValue().Item(idx)->GetData()); + } +#if WXWIN_COMPATIBILITY_2_4 + else if (GetType() == wxT("stringlist")) + { + wxVariantDataStringList* data = (wxVariantDataStringList*) m_data; + wxASSERT_MSG( (idx < data->GetValue().GetCount()), wxT("Invalid index for array") ); + + wxString str( (const wxChar*) (data->GetValue().Item(idx)->GetData()) ); + wxVariant variant( str ); + return variant; + } +#endif + return wxNullVariant; +} + +wxVariant& wxVariant::operator[] (size_t idx) +{ + // We can't return a reference to a variant for a string list, since the string + // is actually stored as a char*, not a variant. + + wxASSERT_MSG( (GetType() == wxT("list")), wxT("Invalid type for array operator") ); + + wxVariantDataList* data = (wxVariantDataList*) m_data; + wxASSERT_MSG( (idx < data->GetValue().GetCount()), wxT("Invalid index for array") ); + + return * (wxVariant*) (data->GetValue().Item(idx)->GetData()); +} + +// Return the number of elements in a list +size_t wxVariant::GetCount() const +{ +#if WXWIN_COMPATIBILITY_2_4 + wxASSERT_MSG( (GetType() == wxT("list") || GetType() == wxT("stringlist")), wxT("Invalid type for GetCount()") ); +#else + wxASSERT_MSG( GetType() == wxT("list"), wxT("Invalid type for GetCount()") ); +#endif + + if (GetType() == wxT("list")) + { + wxVariantDataList* data = (wxVariantDataList*) m_data; + return data->GetValue().GetCount(); + } +#if WXWIN_COMPATIBILITY_2_4 + else if (GetType() == wxT("stringlist")) + { + wxVariantDataStringList* data = (wxVariantDataStringList*) m_data; + return data->GetValue().GetCount(); + } +#endif + return 0; +} + +// ---------------------------------------------------------------------------- +// Type conversion +// ---------------------------------------------------------------------------- + +bool wxVariant::Convert(long* value) const +{ + wxString type(GetType()); + if (type == wxT("double")) + *value = (long) (((wxVariantDoubleData*)GetData())->GetValue()); + else if (type == wxT("long")) + *value = ((wxVariantDataLong*)GetData())->GetValue(); +#ifdef HAVE_BOOL + else if (type == wxT("bool")) + *value = (long) (((wxVariantDataBool*)GetData())->GetValue()); +#endif + else if (type == wxT("string")) + *value = wxAtol((const wxChar*) ((wxVariantDataString*)GetData())->GetValue()); + else + return false; + + return true; +} + +bool wxVariant::Convert(bool* value) const +{ + wxString type(GetType()); + if (type == wxT("double")) + *value = ((int) (((wxVariantDoubleData*)GetData())->GetValue()) != 0); + else if (type == wxT("long")) + *value = (((wxVariantDataLong*)GetData())->GetValue() != 0); +#ifdef HAVE_BOOL + else if (type == wxT("bool")) + *value = ((wxVariantDataBool*)GetData())->GetValue(); +#endif + else if (type == wxT("string")) + { + wxString val(((wxVariantDataString*)GetData())->GetValue()); + val.MakeLower(); + if (val == wxT("true") || val == wxT("yes") || val == wxT('1') ) + *value = true; + else if (val == wxT("false") || val == wxT("no") || val == wxT('0') ) + *value = false; + else + return false; + } + else + return false; + + return true; +} + +bool wxVariant::Convert(double* value) const +{ + wxString type(GetType()); + if (type == wxT("double")) + *value = ((wxVariantDoubleData*)GetData())->GetValue(); + else if (type == wxT("long")) + *value = (double) (((wxVariantDataLong*)GetData())->GetValue()); +#ifdef HAVE_BOOL + else if (type == wxT("bool")) + *value = (double) (((wxVariantDataBool*)GetData())->GetValue()); +#endif + else if (type == wxT("string")) + *value = (double) wxAtof((const wxChar*) ((wxVariantDataString*)GetData())->GetValue()); + else + return false; + + return true; +} + +bool wxVariant::Convert(wxChar* value) const +{ + wxString type(GetType()); + if (type == wxT("char")) + *value = ((wxVariantDataChar*)GetData())->GetValue(); + else if (type == wxT("long")) + *value = (char) (((wxVariantDataLong*)GetData())->GetValue()); +#ifdef HAVE_BOOL + else if (type == wxT("bool")) + *value = (char) (((wxVariantDataBool*)GetData())->GetValue()); +#endif + else + return false; + + return true; +} + +bool wxVariant::Convert(wxString* value) const +{ + *value = MakeString(); + return true; +} + +#if wxUSE_DATETIME +bool wxVariant::Convert(wxDateTime* value) const +{ + wxString type(GetType()); + if (type == wxT("datetime")) + { + *value = ((wxVariantDataDateTime*)GetData())->GetValue(); + return true; + } + // Fallback to string conversion + wxString val; + return Convert(&val) && + (value->ParseDateTime(val) || value->ParseDate(val) || value->ParseTime(val)); +} +#endif // wxUSE_DATETIME + +#endif // wxUSE_VARIANT diff --git a/Externals/wxWidgets/src/common/wfstream.cpp b/Externals/wxWidgets/src/common/wfstream.cpp new file mode 100644 index 0000000000..30ece91557 --- /dev/null +++ b/Externals/wxWidgets/src/common/wfstream.cpp @@ -0,0 +1,406 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/fstream.cpp +// Purpose: "File stream" classes +// Author: Julian Smart +// Modified by: +// Created: 11/07/98 +// RCS-ID: $Id: wfstream.cpp 44013 2006-12-19 13:49:26Z SC $ +// Copyright: (c) Guilhem Lavaux +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_STREAMS + +#include "wx/wfstream.h" + +#ifndef WX_PRECOMP + #include "wx/stream.h" +#endif + +#include + +#if wxUSE_FILE + +// ---------------------------------------------------------------------------- +// wxFileInputStream +// ---------------------------------------------------------------------------- + +wxFileInputStream::wxFileInputStream(const wxString& fileName) + : wxInputStream() +{ + m_file = new wxFile(fileName, wxFile::read); + m_file_destroy = true; + if ( !m_file->IsOpened() ) + m_lasterror = wxSTREAM_READ_ERROR; +} + +wxFileInputStream::wxFileInputStream() + : wxInputStream() +{ + m_file_destroy = false; + m_file = NULL; +} + +wxFileInputStream::wxFileInputStream(wxFile& file) +{ + m_file = &file; + m_file_destroy = false; +} + +wxFileInputStream::wxFileInputStream(int fd) +{ + m_file = new wxFile(fd); + m_file_destroy = true; +} + +wxFileInputStream::~wxFileInputStream() +{ + if (m_file_destroy) + delete m_file; +} + +wxFileOffset wxFileInputStream::GetLength() const +{ + return m_file->Length(); +} + +size_t wxFileInputStream::OnSysRead(void *buffer, size_t size) +{ + ssize_t ret = m_file->Read(buffer, size); + + // NB: we can't use a switch here because HP-UX CC doesn't allow + // switching over long long (which size_t is in 64bit mode) + + if ( !ret ) + { + // nothing read, so nothing more to read + m_lasterror = wxSTREAM_EOF; + } + else if ( ret == wxInvalidOffset ) + { + m_lasterror = wxSTREAM_READ_ERROR; + ret = 0; + } + else + { + // normal case + m_lasterror = wxSTREAM_NO_ERROR; + } + + return ret; +} + +wxFileOffset wxFileInputStream::OnSysSeek(wxFileOffset pos, wxSeekMode mode) +{ + return m_file->Seek(pos, mode); +} + +wxFileOffset wxFileInputStream::OnSysTell() const +{ + return m_file->Tell(); +} + +bool wxFileInputStream::IsOk() const +{ + return (wxStreamBase::IsOk() && m_file->IsOpened()); +} + +// ---------------------------------------------------------------------------- +// wxFileOutputStream +// ---------------------------------------------------------------------------- + +wxFileOutputStream::wxFileOutputStream(const wxString& fileName) +{ + m_file = new wxFile(fileName, wxFile::write); + m_file_destroy = true; + + if (!m_file->IsOpened()) + m_lasterror = wxSTREAM_WRITE_ERROR; +} + +wxFileOutputStream::wxFileOutputStream(wxFile& file) +{ + m_file = &file; + m_file_destroy = false; +} + +wxFileOutputStream::wxFileOutputStream() + : wxOutputStream() +{ + m_file_destroy = false; + m_file = NULL; +} + +wxFileOutputStream::wxFileOutputStream(int fd) +{ + m_file = new wxFile(fd); + m_file_destroy = true; +} + +wxFileOutputStream::~wxFileOutputStream() +{ + if (m_file_destroy) + { + Sync(); + delete m_file; + } +} + +size_t wxFileOutputStream::OnSysWrite(const void *buffer, size_t size) +{ + size_t ret = m_file->Write(buffer, size); + + m_lasterror = m_file->Error() ? wxSTREAM_WRITE_ERROR : wxSTREAM_NO_ERROR; + + return ret; +} + +wxFileOffset wxFileOutputStream::OnSysTell() const +{ + return m_file->Tell(); +} + +wxFileOffset wxFileOutputStream::OnSysSeek(wxFileOffset pos, wxSeekMode mode) +{ + return m_file->Seek(pos, mode); +} + +void wxFileOutputStream::Sync() +{ + wxOutputStream::Sync(); + m_file->Flush(); +} + +wxFileOffset wxFileOutputStream::GetLength() const +{ + return m_file->Length(); +} + +bool wxFileOutputStream::IsOk() const +{ + return (wxStreamBase::IsOk() && m_file->IsOpened()); +} + +// ---------------------------------------------------------------------------- +// wxTempFileOutputStream +// ---------------------------------------------------------------------------- + +wxTempFileOutputStream::wxTempFileOutputStream(const wxString& fileName) +{ + m_file = new wxTempFile(fileName); + + if (!m_file->IsOpened()) + m_lasterror = wxSTREAM_WRITE_ERROR; +} + +wxTempFileOutputStream::~wxTempFileOutputStream() +{ + if (m_file->IsOpened()) + Discard(); + delete m_file; +} + +size_t wxTempFileOutputStream::OnSysWrite(const void *buffer, size_t size) +{ + if (IsOk() && m_file->Write(buffer, size)) + return size; + m_lasterror = wxSTREAM_WRITE_ERROR; + return 0; +} + +// ---------------------------------------------------------------------------- +// wxFileStream +// ---------------------------------------------------------------------------- + +wxFileStream::wxFileStream(const wxString& fileName) + : wxFileInputStream(fileName) +{ + wxFileOutputStream::m_file = wxFileInputStream::m_file; +} + +#endif //wxUSE_FILE + +#if wxUSE_FFILE + +// ---------------------------------------------------------------------------- +// wxFFileInputStream +// ---------------------------------------------------------------------------- + +wxFFileInputStream::wxFFileInputStream(const wxString& fileName, + const wxChar *mode) + : wxInputStream() +{ + m_file = new wxFFile(fileName, mode); + m_file_destroy = true; + + if (!m_file->IsOpened()) + m_lasterror = wxSTREAM_WRITE_ERROR; +} + +wxFFileInputStream::wxFFileInputStream() + : wxInputStream() +{ + m_file = NULL; + m_file_destroy = false; +} + +wxFFileInputStream::wxFFileInputStream(wxFFile& file) +{ + m_file = &file; + m_file_destroy = false; +} + +wxFFileInputStream::wxFFileInputStream(FILE *file) +{ + m_file = new wxFFile(file); + m_file_destroy = true; +} + +wxFFileInputStream::~wxFFileInputStream() +{ + if (m_file_destroy) + delete m_file; +} + +wxFileOffset wxFFileInputStream::GetLength() const +{ + return m_file->Length(); +} + +size_t wxFFileInputStream::OnSysRead(void *buffer, size_t size) +{ + ssize_t ret = m_file->Read(buffer, size); + + // It is not safe to call Eof() if the file is not opened. + if (!m_file->IsOpened() || m_file->Eof()) + m_lasterror = wxSTREAM_EOF; + if (ret == wxInvalidOffset) + { + m_lasterror = wxSTREAM_READ_ERROR; + ret = 0; + } + + return ret; +} + +wxFileOffset wxFFileInputStream::OnSysSeek(wxFileOffset pos, wxSeekMode mode) +{ + return m_file->Seek(pos, mode) ? m_file->Tell() : wxInvalidOffset; +} + +wxFileOffset wxFFileInputStream::OnSysTell() const +{ + return m_file->Tell(); +} + +bool wxFFileInputStream::IsOk() const +{ + return (wxStreamBase::IsOk() && m_file->IsOpened()); +} + +// ---------------------------------------------------------------------------- +// wxFFileOutputStream +// ---------------------------------------------------------------------------- + +wxFFileOutputStream::wxFFileOutputStream(const wxString& fileName, + const wxChar *mode) +{ + m_file = new wxFFile(fileName, mode); + m_file_destroy = true; + + if (!m_file->IsOpened()) + { + m_lasterror = wxSTREAM_WRITE_ERROR; + } + else + { + if (m_file->Error()) + m_lasterror = wxSTREAM_WRITE_ERROR; + } +} + +wxFFileOutputStream::wxFFileOutputStream(wxFFile& file) +{ + m_file = &file; + m_file_destroy = false; +} + +wxFFileOutputStream::wxFFileOutputStream() + : wxOutputStream() +{ + m_file = NULL; + m_file_destroy = false; +} + +wxFFileOutputStream::wxFFileOutputStream(FILE *file) +{ + m_file = new wxFFile(file); + m_file_destroy = true; +} + +wxFFileOutputStream::~wxFFileOutputStream() +{ + if (m_file_destroy) + { + Sync(); + delete m_file; + } +} + +size_t wxFFileOutputStream::OnSysWrite(const void *buffer, size_t size) +{ + size_t ret = m_file->Write(buffer, size); + // It is not safe to call Error() if the file is not opened. + if (!m_file->IsOpened() || m_file->Error()) + m_lasterror = wxSTREAM_WRITE_ERROR; + else + m_lasterror = wxSTREAM_NO_ERROR; + return ret; +} + +wxFileOffset wxFFileOutputStream::OnSysTell() const +{ + return m_file->Tell(); +} + +wxFileOffset wxFFileOutputStream::OnSysSeek(wxFileOffset pos, wxSeekMode mode) +{ + return m_file->Seek(pos, mode) ? m_file->Tell() : wxInvalidOffset; +} + +void wxFFileOutputStream::Sync() +{ + wxOutputStream::Sync(); + m_file->Flush(); +} + +wxFileOffset wxFFileOutputStream::GetLength() const +{ + return m_file->Length(); +} + +bool wxFFileOutputStream::IsOk() const +{ + return (wxStreamBase::IsOk() && m_file->IsOpened()); +} + +// ---------------------------------------------------------------------------- +// wxFFileStream +// ---------------------------------------------------------------------------- + +wxFFileStream::wxFFileStream(const wxString& fileName) + : wxFFileInputStream(fileName) +{ + wxFFileOutputStream::m_file = wxFFileInputStream::m_file; +} + +#endif //wxUSE_FFILE + +#endif // wxUSE_STREAMS diff --git a/Externals/wxWidgets/src/common/wincmn.cpp b/Externals/wxWidgets/src/common/wincmn.cpp new file mode 100644 index 0000000000..106fad2c5e --- /dev/null +++ b/Externals/wxWidgets/src/common/wincmn.cpp @@ -0,0 +1,3135 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/window.cpp +// Purpose: common (to all ports) wxWindow functions +// Author: Julian Smart, Vadim Zeitlin +// Modified by: +// Created: 13/07/98 +// RCS-ID: $Id: wincmn.cpp 46272 2007-06-02 13:25:43Z VZ $ +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#ifndef WX_PRECOMP + #include "wx/string.h" + #include "wx/log.h" + #include "wx/intl.h" + #include "wx/frame.h" + #include "wx/window.h" + #include "wx/control.h" + #include "wx/checkbox.h" + #include "wx/radiobut.h" + #include "wx/statbox.h" + #include "wx/textctrl.h" + #include "wx/settings.h" + #include "wx/dialog.h" + #include "wx/msgdlg.h" + #include "wx/statusbr.h" + #include "wx/toolbar.h" + #include "wx/dcclient.h" + #include "wx/scrolbar.h" + #include "wx/layout.h" + #include "wx/sizer.h" +#endif //WX_PRECOMP + +#if wxUSE_DRAG_AND_DROP + #include "wx/dnd.h" +#endif // wxUSE_DRAG_AND_DROP + +#if wxUSE_ACCESSIBILITY + #include "wx/access.h" +#endif + +#if wxUSE_HELP + #include "wx/cshelp.h" +#endif // wxUSE_HELP + +#if wxUSE_TOOLTIPS + #include "wx/tooltip.h" +#endif // wxUSE_TOOLTIPS + +#if wxUSE_CARET + #include "wx/caret.h" +#endif // wxUSE_CARET + +#if wxUSE_SYSTEM_OPTIONS + #include "wx/sysopt.h" +#endif + +// For reporting compile- and runtime version of GTK+ in the ctrl+alt+mclick dialog. +// The gtk includes don't pull any other headers in, at least not on my system - MR +#ifdef __WXGTK__ + #ifdef __WXGTK20__ + #include + #else + #include + #endif + extern const unsigned int gtk_major_version; + extern const unsigned int gtk_minor_version; + extern const unsigned int gtk_micro_version; +#endif + +#include "wx/platinfo.h" + +// Windows List +WXDLLIMPEXP_DATA_CORE(wxWindowList) wxTopLevelWindows; + +// ---------------------------------------------------------------------------- +// static data +// ---------------------------------------------------------------------------- + +#if defined(__WXPALMOS__) +int wxWindowBase::ms_lastControlId = 32767; +#elif defined(__WXPM__) +int wxWindowBase::ms_lastControlId = 2000; +#else +int wxWindowBase::ms_lastControlId = -200; +#endif + +IMPLEMENT_ABSTRACT_CLASS(wxWindowBase, wxEvtHandler) + +// ---------------------------------------------------------------------------- +// event table +// ---------------------------------------------------------------------------- + +BEGIN_EVENT_TABLE(wxWindowBase, wxEvtHandler) + EVT_SYS_COLOUR_CHANGED(wxWindowBase::OnSysColourChanged) + EVT_INIT_DIALOG(wxWindowBase::OnInitDialog) + EVT_MIDDLE_DOWN(wxWindowBase::OnMiddleClick) + +#if wxUSE_HELP + EVT_HELP(wxID_ANY, wxWindowBase::OnHelp) +#endif // wxUSE_HELP + +END_EVENT_TABLE() + +// ============================================================================ +// implementation of the common functionality of the wxWindow class +// ============================================================================ + +// ---------------------------------------------------------------------------- +// initialization +// ---------------------------------------------------------------------------- + +// the default initialization +wxWindowBase::wxWindowBase() +{ + // no window yet, no parent nor children + m_parent = (wxWindow *)NULL; + m_windowId = wxID_ANY; + + // no constraints on the minimal window size + m_minWidth = + m_maxWidth = wxDefaultCoord; + m_minHeight = + m_maxHeight = wxDefaultCoord; + + // invalidiated cache value + m_bestSizeCache = wxDefaultSize; + + // window are created enabled and visible by default + m_isShown = + m_isEnabled = true; + + // the default event handler is just this window + m_eventHandler = this; + +#if wxUSE_VALIDATORS + // no validator + m_windowValidator = (wxValidator *) NULL; +#endif // wxUSE_VALIDATORS + + // the colours/fonts are default for now, so leave m_font, + // m_backgroundColour and m_foregroundColour uninitialized and set those + m_hasBgCol = + m_hasFgCol = + m_hasFont = false; + m_inheritBgCol = + m_inheritFgCol = + m_inheritFont = false; + + // no style bits + m_exStyle = + m_windowStyle = 0; + + m_backgroundStyle = wxBG_STYLE_SYSTEM; + +#if wxUSE_CONSTRAINTS + // no constraints whatsoever + m_constraints = (wxLayoutConstraints *) NULL; + m_constraintsInvolvedIn = (wxWindowList *) NULL; +#endif // wxUSE_CONSTRAINTS + + m_windowSizer = (wxSizer *) NULL; + m_containingSizer = (wxSizer *) NULL; + m_autoLayout = false; + +#if wxUSE_DRAG_AND_DROP + m_dropTarget = (wxDropTarget *)NULL; +#endif // wxUSE_DRAG_AND_DROP + +#if wxUSE_TOOLTIPS + m_tooltip = (wxToolTip *)NULL; +#endif // wxUSE_TOOLTIPS + +#if wxUSE_CARET + m_caret = (wxCaret *)NULL; +#endif // wxUSE_CARET + +#if wxUSE_PALETTE + m_hasCustomPalette = false; +#endif // wxUSE_PALETTE + +#if wxUSE_ACCESSIBILITY + m_accessible = NULL; +#endif + + m_virtualSize = wxDefaultSize; + + m_scrollHelper = (wxScrollHelper *) NULL; + + m_minVirtualWidth = + m_maxVirtualWidth = wxDefaultCoord; + m_minVirtualHeight = + m_maxVirtualHeight = wxDefaultCoord; + + m_windowVariant = wxWINDOW_VARIANT_NORMAL; +#if wxUSE_SYSTEM_OPTIONS + if ( wxSystemOptions::HasOption(wxWINDOW_DEFAULT_VARIANT) ) + { + m_windowVariant = (wxWindowVariant) wxSystemOptions::GetOptionInt( wxWINDOW_DEFAULT_VARIANT ) ; + } +#endif + + // Whether we're using the current theme for this window (wxGTK only for now) + m_themeEnabled = false; + + // VZ: this one shouldn't exist... + m_isBeingDeleted = false; +} + +// common part of window creation process +bool wxWindowBase::CreateBase(wxWindowBase *parent, + wxWindowID id, + const wxPoint& WXUNUSED(pos), + const wxSize& WXUNUSED(size), + long style, + const wxValidator& wxVALIDATOR_PARAM(validator), + const wxString& name) +{ +#if wxUSE_STATBOX + // wxGTK doesn't allow to create controls with static box as the parent so + // this will result in a crash when the program is ported to wxGTK so warn + // the user about it + + // if you get this assert, the correct solution is to create the controls + // as siblings of the static box + wxASSERT_MSG( !parent || !wxDynamicCast(parent, wxStaticBox), + _T("wxStaticBox can't be used as a window parent!") ); +#endif // wxUSE_STATBOX + + // ids are limited to 16 bits under MSW so if you care about portability, + // it's not a good idea to use ids out of this range (and negative ids are + // reserved for wxWidgets own usage) + wxASSERT_MSG( id == wxID_ANY || (id >= 0 && id < 32767), + _T("invalid id value") ); + + // generate a new id if the user doesn't care about it + m_windowId = id == wxID_ANY ? NewControlId() : id; + + // don't use SetWindowStyleFlag() here, this function should only be called + // to change the flag after creation as it tries to reflect the changes in + // flags by updating the window dynamically and we don't need this here + m_windowStyle = style; + + SetName(name); + SetParent(parent); + +#if wxUSE_VALIDATORS + SetValidator(validator); +#endif // wxUSE_VALIDATORS + + // if the parent window has wxWS_EX_VALIDATE_RECURSIVELY set, we want to + // have it too - like this it's possible to set it only in the top level + // dialog/frame and all children will inherit it by defult + if ( parent && (parent->GetExtraStyle() & wxWS_EX_VALIDATE_RECURSIVELY) ) + { + SetExtraStyle(GetExtraStyle() | wxWS_EX_VALIDATE_RECURSIVELY); + } + + return true; +} + +bool wxWindowBase::ToggleWindowStyle(int flag) +{ + wxASSERT_MSG( flag, _T("flags with 0 value can't be toggled") ); + + bool rc; + long style = GetWindowStyleFlag(); + if ( style & flag ) + { + style &= ~flag; + rc = false; + } + else // currently off + { + style |= flag; + rc = true; + } + + SetWindowStyleFlag(style); + + return rc; +} + +// ---------------------------------------------------------------------------- +// destruction +// ---------------------------------------------------------------------------- + +// common clean up +wxWindowBase::~wxWindowBase() +{ + wxASSERT_MSG( GetCapture() != this, wxT("attempt to destroy window with mouse capture") ); + + // FIXME if these 2 cases result from programming errors in the user code + // we should probably assert here instead of silently fixing them + + // Just in case the window has been Closed, but we're then deleting + // immediately: don't leave dangling pointers. + wxPendingDelete.DeleteObject(this); + + // Just in case we've loaded a top-level window via LoadNativeDialog but + // we weren't a dialog class + wxTopLevelWindows.DeleteObject((wxWindow*)this); + + wxASSERT_MSG( GetChildren().GetCount() == 0, wxT("children not destroyed") ); + + // reset the top-level parent's default item if it is this widget + if ( m_parent ) + { + wxTopLevelWindow *tlw = wxDynamicCast(wxGetTopLevelParent((wxWindow*)this), + wxTopLevelWindow); + + if ( tlw ) + { + wxWindow* tmpDefaultItem = tlw->GetTmpDefaultItem(); + if ( tmpDefaultItem == this ) + tlw->SetTmpDefaultItem(NULL); + else if ( tmpDefaultItem ) + { + // A temporary default item masks the real default item, so + // temporarily unset the temporary default item so we can access the + // real default item. + tlw->SetTmpDefaultItem(NULL); + + if ( tlw->GetDefaultItem() == this ) + tlw->SetDefaultItem(NULL); + + // Set the temporary default item back. + tlw->SetTmpDefaultItem(tmpDefaultItem); + } + else if ( tlw->GetDefaultItem() == this ) + tlw->SetDefaultItem(NULL); + } + } + + // reset the dangling pointer our parent window may keep to us + if ( m_parent ) + { + m_parent->RemoveChild(this); + } + +#if wxUSE_CARET + delete m_caret; +#endif // wxUSE_CARET + +#if wxUSE_VALIDATORS + delete m_windowValidator; +#endif // wxUSE_VALIDATORS + +#if wxUSE_CONSTRAINTS + // Have to delete constraints/sizer FIRST otherwise sizers may try to look + // at deleted windows as they delete themselves. + DeleteRelatedConstraints(); + + if ( m_constraints ) + { + // This removes any dangling pointers to this window in other windows' + // constraintsInvolvedIn lists. + UnsetConstraints(m_constraints); + delete m_constraints; + m_constraints = NULL; + } +#endif // wxUSE_CONSTRAINTS + + if ( m_containingSizer ) + m_containingSizer->Detach( (wxWindow*)this ); + + delete m_windowSizer; + +#if wxUSE_DRAG_AND_DROP + delete m_dropTarget; +#endif // wxUSE_DRAG_AND_DROP + +#if wxUSE_TOOLTIPS + delete m_tooltip; +#endif // wxUSE_TOOLTIPS + +#if wxUSE_ACCESSIBILITY + delete m_accessible; +#endif +} + +void wxWindowBase::SendDestroyEvent() +{ + wxWindowDestroyEvent event; + event.SetEventObject(this); + event.SetId(GetId()); + GetEventHandler()->ProcessEvent(event); +} + +bool wxWindowBase::Destroy() +{ + delete this; + + return true; +} + +bool wxWindowBase::Close(bool force) +{ + wxCloseEvent event(wxEVT_CLOSE_WINDOW, m_windowId); + event.SetEventObject(this); + event.SetCanVeto(!force); + + // return false if window wasn't closed because the application vetoed the + // close event + return GetEventHandler()->ProcessEvent(event) && !event.GetVeto(); +} + +bool wxWindowBase::DestroyChildren() +{ + wxWindowList::compatibility_iterator node; + for ( ;; ) + { + // we iterate until the list becomes empty + node = GetChildren().GetFirst(); + if ( !node ) + break; + + wxWindow *child = node->GetData(); + + // note that we really want to call delete and not ->Destroy() here + // because we want to delete the child immediately, before we are + // deleted, and delayed deletion would result in problems as our (top + // level) child could outlive its parent + delete child; + + wxASSERT_MSG( !GetChildren().Find(child), + wxT("child didn't remove itself using RemoveChild()") ); + } + + return true; +} + +// ---------------------------------------------------------------------------- +// size/position related methods +// ---------------------------------------------------------------------------- + +// centre the window with respect to its parent in either (or both) directions +void wxWindowBase::DoCentre(int dir) +{ + wxCHECK_RET( !(dir & wxCENTRE_ON_SCREEN) && GetParent(), + _T("this method only implements centering child windows") ); + + SetSize(GetRect().CentreIn(GetParent()->GetClientSize(), dir)); +} + +// fits the window around the children +void wxWindowBase::Fit() +{ + if ( !GetChildren().empty() ) + { + SetSize(GetBestSize()); + } + //else: do nothing if we have no children +} + +// fits virtual size (ie. scrolled area etc.) around children +void wxWindowBase::FitInside() +{ + if ( GetChildren().GetCount() > 0 ) + { + SetVirtualSize( GetBestVirtualSize() ); + } +} + +// On Mac, scrollbars are explicitly children. +#ifdef __WXMAC__ +static bool wxHasRealChildren(const wxWindowBase* win) +{ + int realChildCount = 0; + + for ( wxWindowList::compatibility_iterator node = win->GetChildren().GetFirst(); + node; + node = node->GetNext() ) + { + wxWindow *win = node->GetData(); + if ( !win->IsTopLevel() && win->IsShown() && !win->IsKindOf(CLASSINFO(wxScrollBar))) + realChildCount ++; + } + return (realChildCount > 0); +} +#endif + +void wxWindowBase::InvalidateBestSize() +{ + m_bestSizeCache = wxDefaultSize; + + // parent's best size calculation may depend on its children's + // as long as child window we are in is not top level window itself + // (because the TLW size is never resized automatically) + // so let's invalidate it as well to be safe: + if (m_parent && !IsTopLevel()) + m_parent->InvalidateBestSize(); +} + +// return the size best suited for the current window +wxSize wxWindowBase::DoGetBestSize() const +{ + wxSize best; + + if ( m_windowSizer ) + { + // Adjust to window size, since the return value of GetWindowSizeForVirtualSize is + // expressed in window and not client size + wxSize minSize = m_windowSizer->GetMinSize(); + wxSize size(GetSize()); + wxSize clientSize(GetClientSize()); + + wxSize minWindowSize(minSize.x + size.x - clientSize.x, + minSize.y + size.y - clientSize.y); + + best = GetWindowSizeForVirtualSize(minWindowSize); + + return best; + } +#if wxUSE_CONSTRAINTS + else if ( m_constraints ) + { + wxConstCast(this, wxWindowBase)->SatisfyConstraints(); + + // our minimal acceptable size is such that all our windows fit inside + int maxX = 0, + maxY = 0; + + for ( wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); + node; + node = node->GetNext() ) + { + wxLayoutConstraints *c = node->GetData()->GetConstraints(); + if ( !c ) + { + // it's not normal that we have an unconstrained child, but + // what can we do about it? + continue; + } + + int x = c->right.GetValue(), + y = c->bottom.GetValue(); + + if ( x > maxX ) + maxX = x; + + if ( y > maxY ) + maxY = y; + + // TODO: we must calculate the overlaps somehow, otherwise we + // will never return a size bigger than the current one :-( + } + + best = wxSize(maxX, maxY); + } +#endif // wxUSE_CONSTRAINTS + else if ( !GetChildren().empty() +#ifdef __WXMAC__ + && wxHasRealChildren(this) +#endif + ) + { + // our minimal acceptable size is such that all our visible child + // windows fit inside + int maxX = 0, + maxY = 0; + + for ( wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); + node; + node = node->GetNext() ) + { + wxWindow *win = node->GetData(); + if ( win->IsTopLevel() + || !win->IsShown() +#if wxUSE_STATUSBAR + || wxDynamicCast(win, wxStatusBar) +#endif // wxUSE_STATUSBAR + ) + { + // dialogs and frames lie in different top level windows - + // don't deal with them here; as for the status bars, they + // don't lie in the client area at all + continue; + } + + int wx, wy, ww, wh; + win->GetPosition(&wx, &wy); + + // if the window hadn't been positioned yet, assume that it is in + // the origin + if ( wx == wxDefaultCoord ) + wx = 0; + if ( wy == wxDefaultCoord ) + wy = 0; + + win->GetSize(&ww, &wh); + if ( wx + ww > maxX ) + maxX = wx + ww; + if ( wy + wh > maxY ) + maxY = wy + wh; + } + + best = wxSize(maxX, maxY); + } + else // ! has children + { + // for a generic window there is no natural best size so, if the + // minimal size is not set, use the current size but take care to + // remember it as minimal size for the next time because our best size + // should be constant: otherwise we could get into a situation when the + // window is initially at some size, then expanded to a larger size and + // then, when the containing window is shrunk back (because our initial + // best size had been used for computing the parent min size), we can't + // be shrunk back any more because our best size is now bigger + wxSize size = GetMinSize(); + if ( !size.IsFullySpecified() ) + { + size.SetDefaults(GetSize()); + wxConstCast(this, wxWindowBase)->SetMinSize(size); + } + + // return as-is, unadjusted by the client size difference. + return size; + } + + // Add any difference between size and client size + wxSize diff = GetSize() - GetClientSize(); + best.x += wxMax(0, diff.x); + best.y += wxMax(0, diff.y); + + return best; +} + +// helper of GetWindowBorderSize(): as many ports don't implement support for +// wxSYS_BORDER/EDGE_X/Y metrics in their wxSystemSettings, use hard coded +// fallbacks in this case +static int wxGetMetricOrDefault(wxSystemMetric what) +{ + int rc = wxSystemSettings::GetMetric(what); + if ( rc == -1 ) + { + switch ( what ) + { + case wxSYS_BORDER_X: + case wxSYS_BORDER_Y: + // 2D border is by default 1 pixel wide + rc = 1; + break; + + case wxSYS_EDGE_X: + case wxSYS_EDGE_Y: + // 3D borders are by default 2 pixels + rc = 2; + break; + + default: + wxFAIL_MSG( _T("unexpected wxGetMetricOrDefault() argument") ); + rc = 0; + } + } + + return rc; +} + +wxSize wxWindowBase::GetWindowBorderSize() const +{ + wxSize size; + + switch ( GetBorder() ) + { + case wxBORDER_NONE: + // nothing to do, size is already (0, 0) + break; + + case wxBORDER_SIMPLE: + case wxBORDER_STATIC: + size.x = wxGetMetricOrDefault(wxSYS_BORDER_X); + size.y = wxGetMetricOrDefault(wxSYS_BORDER_Y); + break; + + case wxBORDER_SUNKEN: + case wxBORDER_RAISED: + size.x = wxMax(wxGetMetricOrDefault(wxSYS_EDGE_X), + wxGetMetricOrDefault(wxSYS_BORDER_X)); + size.y = wxMax(wxGetMetricOrDefault(wxSYS_EDGE_Y), + wxGetMetricOrDefault(wxSYS_BORDER_Y)); + break; + + case wxBORDER_DOUBLE: + size.x = wxGetMetricOrDefault(wxSYS_EDGE_X) + + wxGetMetricOrDefault(wxSYS_BORDER_X); + size.y = wxGetMetricOrDefault(wxSYS_EDGE_Y) + + wxGetMetricOrDefault(wxSYS_BORDER_Y); + break; + + default: + wxFAIL_MSG(_T("Unknown border style.")); + break; + } + + // we have borders on both sides + return size*2; +} + +wxSize wxWindowBase::GetEffectiveMinSize() const +{ + // merge the best size with the min size, giving priority to the min size + wxSize min = GetMinSize(); + if (min.x == wxDefaultCoord || min.y == wxDefaultCoord) + { + wxSize best = GetBestSize(); + if (min.x == wxDefaultCoord) min.x = best.x; + if (min.y == wxDefaultCoord) min.y = best.y; + } + return min; +} + + +void wxWindowBase::SetInitialSize(const wxSize& size) +{ + // Set the min size to the size passed in. This will usually either be + // wxDefaultSize or the size passed to this window's ctor/Create function. + SetMinSize(size); + + // Merge the size with the best size if needed + wxSize best = GetEffectiveMinSize(); + + // If the current size doesn't match then change it + if (GetSize() != best) + SetSize(best); +} + + +// by default the origin is not shifted +wxPoint wxWindowBase::GetClientAreaOrigin() const +{ + return wxPoint(0,0); +} + +void wxWindowBase::SetWindowVariant( wxWindowVariant variant ) +{ + if ( m_windowVariant != variant ) + { + m_windowVariant = variant; + + DoSetWindowVariant(variant); + } +} + +void wxWindowBase::DoSetWindowVariant( wxWindowVariant variant ) +{ + // adjust the font height to correspond to our new variant (notice that + // we're only called if something really changed) + wxFont font = GetFont(); + int size = font.GetPointSize(); + switch ( variant ) + { + case wxWINDOW_VARIANT_NORMAL: + break; + + case wxWINDOW_VARIANT_SMALL: + size *= 3; + size /= 4; + break; + + case wxWINDOW_VARIANT_MINI: + size *= 2; + size /= 3; + break; + + case wxWINDOW_VARIANT_LARGE: + size *= 5; + size /= 4; + break; + + default: + wxFAIL_MSG(_T("unexpected window variant")); + break; + } + + font.SetPointSize(size); + SetFont(font); +} + +void wxWindowBase::DoSetSizeHints( int minW, int minH, + int maxW, int maxH, + int WXUNUSED(incW), int WXUNUSED(incH) ) +{ + wxCHECK_RET( (minW == wxDefaultCoord || maxW == wxDefaultCoord || minW <= maxW) && + (minH == wxDefaultCoord || maxH == wxDefaultCoord || minH <= maxH), + _T("min width/height must be less than max width/height!") ); + + m_minWidth = minW; + m_maxWidth = maxW; + m_minHeight = minH; + m_maxHeight = maxH; +} + + +void wxWindowBase::SetVirtualSizeHints( int minW, int minH, + int maxW, int maxH ) +{ + m_minVirtualWidth = minW; + m_maxVirtualWidth = maxW; + m_minVirtualHeight = minH; + m_maxVirtualHeight = maxH; +} + +void wxWindowBase::DoSetVirtualSize( int x, int y ) +{ + if ( m_minVirtualWidth != wxDefaultCoord && m_minVirtualWidth > x ) + x = m_minVirtualWidth; + if ( m_maxVirtualWidth != wxDefaultCoord && m_maxVirtualWidth < x ) + x = m_maxVirtualWidth; + if ( m_minVirtualHeight != wxDefaultCoord && m_minVirtualHeight > y ) + y = m_minVirtualHeight; + if ( m_maxVirtualHeight != wxDefaultCoord && m_maxVirtualHeight < y ) + y = m_maxVirtualHeight; + + m_virtualSize = wxSize(x, y); +} + +wxSize wxWindowBase::DoGetVirtualSize() const +{ + // we should use the entire client area so if it is greater than our + // virtual size, expand it to fit (otherwise if the window is big enough we + // wouldn't be using parts of it) + wxSize size = GetClientSize(); + if ( m_virtualSize.x > size.x ) + size.x = m_virtualSize.x; + + if ( m_virtualSize.y >= size.y ) + size.y = m_virtualSize.y; + + return size; +} + +void wxWindowBase::DoGetScreenPosition(int *x, int *y) const +{ + // screen position is the same as (0, 0) in client coords for non TLWs (and + // TLWs override this method) + if ( x ) + *x = 0; + if ( y ) + *y = 0; + + ClientToScreen(x, y); +} + +// ---------------------------------------------------------------------------- +// show/hide/enable/disable the window +// ---------------------------------------------------------------------------- + +bool wxWindowBase::Show(bool show) +{ + if ( show != m_isShown ) + { + m_isShown = show; + + return true; + } + else + { + return false; + } +} + +bool wxWindowBase::Enable(bool enable) +{ + if ( enable != m_isEnabled ) + { + m_isEnabled = enable; + + return true; + } + else + { + return false; + } +} + +bool wxWindowBase::IsShownOnScreen() const +{ + return IsShown() && + (GetParent() == NULL || GetParent()->IsShownOnScreen()); +} + +// ---------------------------------------------------------------------------- +// RTTI +// ---------------------------------------------------------------------------- + +bool wxWindowBase::IsTopLevel() const +{ + return false; +} + +// ---------------------------------------------------------------------------- +// reparenting the window +// ---------------------------------------------------------------------------- + +void wxWindowBase::AddChild(wxWindowBase *child) +{ + wxCHECK_RET( child, wxT("can't add a NULL child") ); + + // this should never happen and it will lead to a crash later if it does + // because RemoveChild() will remove only one node from the children list + // and the other(s) one(s) will be left with dangling pointers in them + wxASSERT_MSG( !GetChildren().Find((wxWindow*)child), _T("AddChild() called twice") ); + + GetChildren().Append((wxWindow*)child); + child->SetParent(this); +} + +void wxWindowBase::RemoveChild(wxWindowBase *child) +{ + wxCHECK_RET( child, wxT("can't remove a NULL child") ); + + GetChildren().DeleteObject((wxWindow *)child); + child->SetParent(NULL); +} + +bool wxWindowBase::Reparent(wxWindowBase *newParent) +{ + wxWindow *oldParent = GetParent(); + if ( newParent == oldParent ) + { + // nothing done + return false; + } + + // unlink this window from the existing parent. + if ( oldParent ) + { + oldParent->RemoveChild(this); + } + else + { + wxTopLevelWindows.DeleteObject((wxWindow *)this); + } + + // add it to the new one + if ( newParent ) + { + newParent->AddChild(this); + } + else + { + wxTopLevelWindows.Append((wxWindow *)this); + } + + return true; +} + +// ---------------------------------------------------------------------------- +// event handler stuff +// ---------------------------------------------------------------------------- + +void wxWindowBase::PushEventHandler(wxEvtHandler *handler) +{ + wxEvtHandler *handlerOld = GetEventHandler(); + + handler->SetNextHandler(handlerOld); + + if ( handlerOld ) + GetEventHandler()->SetPreviousHandler(handler); + + SetEventHandler(handler); +} + +wxEvtHandler *wxWindowBase::PopEventHandler(bool deleteHandler) +{ + wxEvtHandler *handlerA = GetEventHandler(); + if ( handlerA ) + { + wxEvtHandler *handlerB = handlerA->GetNextHandler(); + handlerA->SetNextHandler((wxEvtHandler *)NULL); + + if ( handlerB ) + handlerB->SetPreviousHandler((wxEvtHandler *)NULL); + SetEventHandler(handlerB); + + if ( deleteHandler ) + { + delete handlerA; + handlerA = (wxEvtHandler *)NULL; + } + } + + return handlerA; +} + +bool wxWindowBase::RemoveEventHandler(wxEvtHandler *handler) +{ + wxCHECK_MSG( handler, false, _T("RemoveEventHandler(NULL) called") ); + + wxEvtHandler *handlerPrev = NULL, + *handlerCur = GetEventHandler(); + while ( handlerCur ) + { + wxEvtHandler *handlerNext = handlerCur->GetNextHandler(); + + if ( handlerCur == handler ) + { + if ( handlerPrev ) + { + handlerPrev->SetNextHandler(handlerNext); + } + else + { + SetEventHandler(handlerNext); + } + + if ( handlerNext ) + { + handlerNext->SetPreviousHandler ( handlerPrev ); + } + + handler->SetNextHandler(NULL); + handler->SetPreviousHandler(NULL); + + return true; + } + + handlerPrev = handlerCur; + handlerCur = handlerNext; + } + + wxFAIL_MSG( _T("where has the event handler gone?") ); + + return false; +} + +// ---------------------------------------------------------------------------- +// colours, fonts &c +// ---------------------------------------------------------------------------- + +void wxWindowBase::InheritAttributes() +{ + const wxWindowBase * const parent = GetParent(); + if ( !parent ) + return; + + // we only inherit attributes which had been explicitly set for the parent + // which ensures that this only happens if the user really wants it and + // not by default which wouldn't make any sense in modern GUIs where the + // controls don't all use the same fonts (nor colours) + if ( parent->m_inheritFont && !m_hasFont ) + SetFont(parent->GetFont()); + + // in addition, there is a possibility to explicitly forbid inheriting + // colours at each class level by overriding ShouldInheritColours() + if ( ShouldInheritColours() ) + { + if ( parent->m_inheritFgCol && !m_hasFgCol ) + SetForegroundColour(parent->GetForegroundColour()); + + // inheriting (solid) background colour is wrong as it totally breaks + // any kind of themed backgrounds + // + // instead, the controls should use the same background as their parent + // (ideally by not drawing it at all) +#if 0 + if ( parent->m_inheritBgCol && !m_hasBgCol ) + SetBackgroundColour(parent->GetBackgroundColour()); +#endif // 0 + } +} + +/* static */ wxVisualAttributes +wxWindowBase::GetClassDefaultAttributes(wxWindowVariant WXUNUSED(variant)) +{ + // it is important to return valid values for all attributes from here, + // GetXXX() below rely on this + wxVisualAttributes attrs; + attrs.font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT); + attrs.colFg = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT); + + // On Smartphone/PocketPC, wxSYS_COLOUR_WINDOW is a better reflection of + // the usual background colour than wxSYS_COLOUR_BTNFACE. + // It's a pity that wxSYS_COLOUR_WINDOW isn't always a suitable background + // colour on other platforms. + +#if defined(__WXWINCE__) && (defined(__SMARTPHONE__) || defined(__POCKETPC__)) + attrs.colBg = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW); +#else + attrs.colBg = wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE); +#endif + return attrs; +} + +wxColour wxWindowBase::GetBackgroundColour() const +{ + if ( !m_backgroundColour.Ok() ) + { + wxASSERT_MSG( !m_hasBgCol, _T("we have invalid explicit bg colour?") ); + + // get our default background colour + wxColour colBg = GetDefaultAttributes().colBg; + + // we must return some valid colour to avoid redoing this every time + // and also to avoid surprizing the applications written for older + // wxWidgets versions where GetBackgroundColour() always returned + // something -- so give them something even if it doesn't make sense + // for this window (e.g. it has a themed background) + if ( !colBg.Ok() ) + colBg = GetClassDefaultAttributes().colBg; + + return colBg; + } + else + return m_backgroundColour; +} + +wxColour wxWindowBase::GetForegroundColour() const +{ + // logic is the same as above + if ( !m_hasFgCol && !m_foregroundColour.Ok() ) + { + wxASSERT_MSG( !m_hasFgCol, _T("we have invalid explicit fg colour?") ); + + wxColour colFg = GetDefaultAttributes().colFg; + + if ( !colFg.Ok() ) + colFg = GetClassDefaultAttributes().colFg; + + return colFg; + } + else + return m_foregroundColour; +} + +bool wxWindowBase::SetBackgroundColour( const wxColour &colour ) +{ + if ( colour == m_backgroundColour ) + return false; + + m_hasBgCol = colour.Ok(); + if ( m_backgroundStyle != wxBG_STYLE_CUSTOM ) + m_backgroundStyle = m_hasBgCol ? wxBG_STYLE_COLOUR : wxBG_STYLE_SYSTEM; + + m_inheritBgCol = m_hasBgCol; + m_backgroundColour = colour; + SetThemeEnabled( !m_hasBgCol && !m_foregroundColour.Ok() ); + return true; +} + +bool wxWindowBase::SetForegroundColour( const wxColour &colour ) +{ + if (colour == m_foregroundColour ) + return false; + + m_hasFgCol = colour.Ok(); + m_inheritFgCol = m_hasFgCol; + m_foregroundColour = colour; + SetThemeEnabled( !m_hasFgCol && !m_backgroundColour.Ok() ); + return true; +} + +bool wxWindowBase::SetCursor(const wxCursor& cursor) +{ + // setting an invalid cursor is ok, it means that we don't have any special + // cursor + if ( m_cursor.IsSameAs(cursor) ) + { + // no change + return false; + } + + m_cursor = cursor; + + return true; +} + +wxFont wxWindowBase::GetFont() const +{ + // logic is the same as in GetBackgroundColour() + if ( !m_font.Ok() ) + { + wxASSERT_MSG( !m_hasFont, _T("we have invalid explicit font?") ); + + wxFont font = GetDefaultAttributes().font; + if ( !font.Ok() ) + font = GetClassDefaultAttributes().font; + + return font; + } + else + return m_font; +} + +bool wxWindowBase::SetFont(const wxFont& font) +{ + if ( font == m_font ) + { + // no change + return false; + } + + m_font = font; + m_hasFont = font.Ok(); + m_inheritFont = m_hasFont; + + InvalidateBestSize(); + + return true; +} + +#if wxUSE_PALETTE + +void wxWindowBase::SetPalette(const wxPalette& pal) +{ + m_hasCustomPalette = true; + m_palette = pal; + + // VZ: can anyone explain me what do we do here? + wxWindowDC d((wxWindow *) this); + d.SetPalette(pal); +} + +wxWindow *wxWindowBase::GetAncestorWithCustomPalette() const +{ + wxWindow *win = (wxWindow *)this; + while ( win && !win->HasCustomPalette() ) + { + win = win->GetParent(); + } + + return win; +} + +#endif // wxUSE_PALETTE + +#if wxUSE_CARET +void wxWindowBase::SetCaret(wxCaret *caret) +{ + if ( m_caret ) + { + delete m_caret; + } + + m_caret = caret; + + if ( m_caret ) + { + wxASSERT_MSG( m_caret->GetWindow() == this, + wxT("caret should be created associated to this window") ); + } +} +#endif // wxUSE_CARET + +#if wxUSE_VALIDATORS +// ---------------------------------------------------------------------------- +// validators +// ---------------------------------------------------------------------------- + +void wxWindowBase::SetValidator(const wxValidator& validator) +{ + if ( m_windowValidator ) + delete m_windowValidator; + + m_windowValidator = (wxValidator *)validator.Clone(); + + if ( m_windowValidator ) + m_windowValidator->SetWindow(this); +} +#endif // wxUSE_VALIDATORS + +// ---------------------------------------------------------------------------- +// update region stuff +// ---------------------------------------------------------------------------- + +wxRect wxWindowBase::GetUpdateClientRect() const +{ + wxRegion rgnUpdate = GetUpdateRegion(); + rgnUpdate.Intersect(GetClientRect()); + wxRect rectUpdate = rgnUpdate.GetBox(); + wxPoint ptOrigin = GetClientAreaOrigin(); + rectUpdate.x -= ptOrigin.x; + rectUpdate.y -= ptOrigin.y; + + return rectUpdate; +} + +bool wxWindowBase::DoIsExposed(int x, int y) const +{ + return m_updateRegion.Contains(x, y) != wxOutRegion; +} + +bool wxWindowBase::DoIsExposed(int x, int y, int w, int h) const +{ + return m_updateRegion.Contains(x, y, w, h) != wxOutRegion; +} + +void wxWindowBase::ClearBackground() +{ + // wxGTK uses its own version, no need to add never used code +#ifndef __WXGTK__ + wxClientDC dc((wxWindow *)this); + wxBrush brush(GetBackgroundColour(), wxSOLID); + dc.SetBackground(brush); + dc.Clear(); +#endif // __WXGTK__ +} + +// ---------------------------------------------------------------------------- +// find child window by id or name +// ---------------------------------------------------------------------------- + +wxWindow *wxWindowBase::FindWindow(long id) const +{ + if ( id == m_windowId ) + return (wxWindow *)this; + + wxWindowBase *res = (wxWindow *)NULL; + wxWindowList::compatibility_iterator node; + for ( node = m_children.GetFirst(); node && !res; node = node->GetNext() ) + { + wxWindowBase *child = node->GetData(); + res = child->FindWindow( id ); + } + + return (wxWindow *)res; +} + +wxWindow *wxWindowBase::FindWindow(const wxString& name) const +{ + if ( name == m_windowName ) + return (wxWindow *)this; + + wxWindowBase *res = (wxWindow *)NULL; + wxWindowList::compatibility_iterator node; + for ( node = m_children.GetFirst(); node && !res; node = node->GetNext() ) + { + wxWindow *child = node->GetData(); + res = child->FindWindow(name); + } + + return (wxWindow *)res; +} + + +// find any window by id or name or label: If parent is non-NULL, look through +// children for a label or title matching the specified string. If NULL, look +// through all top-level windows. +// +// to avoid duplicating code we reuse the same helper function but with +// different comparators + +typedef bool (*wxFindWindowCmp)(const wxWindow *win, + const wxString& label, long id); + +static +bool wxFindWindowCmpLabels(const wxWindow *win, const wxString& label, + long WXUNUSED(id)) +{ + return win->GetLabel() == label; +} + +static +bool wxFindWindowCmpNames(const wxWindow *win, const wxString& label, + long WXUNUSED(id)) +{ + return win->GetName() == label; +} + +static +bool wxFindWindowCmpIds(const wxWindow *win, const wxString& WXUNUSED(label), + long id) +{ + return win->GetId() == id; +} + +// recursive helper for the FindWindowByXXX() functions +static +wxWindow *wxFindWindowRecursively(const wxWindow *parent, + const wxString& label, + long id, + wxFindWindowCmp cmp) +{ + if ( parent ) + { + // see if this is the one we're looking for + if ( (*cmp)(parent, label, id) ) + return (wxWindow *)parent; + + // It wasn't, so check all its children + for ( wxWindowList::compatibility_iterator node = parent->GetChildren().GetFirst(); + node; + node = node->GetNext() ) + { + // recursively check each child + wxWindow *win = (wxWindow *)node->GetData(); + wxWindow *retwin = wxFindWindowRecursively(win, label, id, cmp); + if (retwin) + return retwin; + } + } + + // Not found + return NULL; +} + +// helper for FindWindowByXXX() +static +wxWindow *wxFindWindowHelper(const wxWindow *parent, + const wxString& label, + long id, + wxFindWindowCmp cmp) +{ + if ( parent ) + { + // just check parent and all its children + return wxFindWindowRecursively(parent, label, id, cmp); + } + + // start at very top of wx's windows + for ( wxWindowList::compatibility_iterator node = wxTopLevelWindows.GetFirst(); + node; + node = node->GetNext() ) + { + // recursively check each window & its children + wxWindow *win = node->GetData(); + wxWindow *retwin = wxFindWindowRecursively(win, label, id, cmp); + if (retwin) + return retwin; + } + + return NULL; +} + +/* static */ +wxWindow * +wxWindowBase::FindWindowByLabel(const wxString& title, const wxWindow *parent) +{ + return wxFindWindowHelper(parent, title, 0, wxFindWindowCmpLabels); +} + +/* static */ +wxWindow * +wxWindowBase::FindWindowByName(const wxString& title, const wxWindow *parent) +{ + wxWindow *win = wxFindWindowHelper(parent, title, 0, wxFindWindowCmpNames); + + if ( !win ) + { + // fall back to the label + win = FindWindowByLabel(title, parent); + } + + return win; +} + +/* static */ +wxWindow * +wxWindowBase::FindWindowById( long id, const wxWindow* parent ) +{ + return wxFindWindowHelper(parent, wxEmptyString, id, wxFindWindowCmpIds); +} + +// ---------------------------------------------------------------------------- +// dialog oriented functions +// ---------------------------------------------------------------------------- + +void wxWindowBase::MakeModal(bool modal) +{ + // Disable all other windows + if ( IsTopLevel() ) + { + wxWindowList::compatibility_iterator node = wxTopLevelWindows.GetFirst(); + while (node) + { + wxWindow *win = node->GetData(); + if (win != this) + win->Enable(!modal); + + node = node->GetNext(); + } + } +} + +bool wxWindowBase::Validate() +{ +#if wxUSE_VALIDATORS + bool recurse = (GetExtraStyle() & wxWS_EX_VALIDATE_RECURSIVELY) != 0; + + wxWindowList::compatibility_iterator node; + for ( node = m_children.GetFirst(); node; node = node->GetNext() ) + { + wxWindowBase *child = node->GetData(); + wxValidator *validator = child->GetValidator(); + if ( validator && !validator->Validate((wxWindow *)this) ) + { + return false; + } + + if ( recurse && !child->Validate() ) + { + return false; + } + } +#endif // wxUSE_VALIDATORS + + return true; +} + +bool wxWindowBase::TransferDataToWindow() +{ +#if wxUSE_VALIDATORS + bool recurse = (GetExtraStyle() & wxWS_EX_VALIDATE_RECURSIVELY) != 0; + + wxWindowList::compatibility_iterator node; + for ( node = m_children.GetFirst(); node; node = node->GetNext() ) + { + wxWindowBase *child = node->GetData(); + wxValidator *validator = child->GetValidator(); + if ( validator && !validator->TransferToWindow() ) + { + wxLogWarning(_("Could not transfer data to window")); +#if wxUSE_LOG + wxLog::FlushActive(); +#endif // wxUSE_LOG + + return false; + } + + if ( recurse ) + { + if ( !child->TransferDataToWindow() ) + { + // warning already given + return false; + } + } + } +#endif // wxUSE_VALIDATORS + + return true; +} + +bool wxWindowBase::TransferDataFromWindow() +{ +#if wxUSE_VALIDATORS + bool recurse = (GetExtraStyle() & wxWS_EX_VALIDATE_RECURSIVELY) != 0; + + wxWindowList::compatibility_iterator node; + for ( node = m_children.GetFirst(); node; node = node->GetNext() ) + { + wxWindow *child = node->GetData(); + wxValidator *validator = child->GetValidator(); + if ( validator && !validator->TransferFromWindow() ) + { + // nop warning here because the application is supposed to give + // one itself - we don't know here what might have gone wrongly + + return false; + } + + if ( recurse ) + { + if ( !child->TransferDataFromWindow() ) + { + // warning already given + return false; + } + } + } +#endif // wxUSE_VALIDATORS + + return true; +} + +void wxWindowBase::InitDialog() +{ + wxInitDialogEvent event(GetId()); + event.SetEventObject( this ); + GetEventHandler()->ProcessEvent(event); +} + +// ---------------------------------------------------------------------------- +// context-sensitive help support +// ---------------------------------------------------------------------------- + +#if wxUSE_HELP + +// associate this help text with this window +void wxWindowBase::SetHelpText(const wxString& text) +{ + wxHelpProvider *helpProvider = wxHelpProvider::Get(); + if ( helpProvider ) + { + helpProvider->AddHelp(this, text); + } +} + +// associate this help text with all windows with the same id as this +// one +void wxWindowBase::SetHelpTextForId(const wxString& text) +{ + wxHelpProvider *helpProvider = wxHelpProvider::Get(); + if ( helpProvider ) + { + helpProvider->AddHelp(GetId(), text); + } +} + +// get the help string associated with this window (may be empty) +// default implementation forwards calls to the help provider +wxString +wxWindowBase::GetHelpTextAtPoint(const wxPoint & WXUNUSED(pt), + wxHelpEvent::Origin WXUNUSED(origin)) const +{ + wxString text; + wxHelpProvider *helpProvider = wxHelpProvider::Get(); + if ( helpProvider ) + { + text = helpProvider->GetHelp(this); + } + + return text; +} + +// show help for this window +void wxWindowBase::OnHelp(wxHelpEvent& event) +{ + wxHelpProvider *helpProvider = wxHelpProvider::Get(); + if ( helpProvider ) + { + if ( helpProvider->ShowHelpAtPoint(this, event.GetPosition(), event.GetOrigin()) ) + { + // skip the event.Skip() below + return; + } + } + + event.Skip(); +} + +#endif // wxUSE_HELP + +// ---------------------------------------------------------------------------- +// tooltips +// ---------------------------------------------------------------------------- + +#if wxUSE_TOOLTIPS + +void wxWindowBase::SetToolTip( const wxString &tip ) +{ + // don't create the new tooltip if we already have one + if ( m_tooltip ) + { + m_tooltip->SetTip( tip ); + } + else + { + SetToolTip( new wxToolTip( tip ) ); + } + + // setting empty tooltip text does not remove the tooltip any more - use + // SetToolTip((wxToolTip *)NULL) for this +} + +void wxWindowBase::DoSetToolTip(wxToolTip *tooltip) +{ + if ( m_tooltip != tooltip ) + { + if ( m_tooltip ) + delete m_tooltip; + + m_tooltip = tooltip; + } +} + +#endif // wxUSE_TOOLTIPS + +// ---------------------------------------------------------------------------- +// constraints and sizers +// ---------------------------------------------------------------------------- + +#if wxUSE_CONSTRAINTS + +void wxWindowBase::SetConstraints( wxLayoutConstraints *constraints ) +{ + if ( m_constraints ) + { + UnsetConstraints(m_constraints); + delete m_constraints; + } + m_constraints = constraints; + if ( m_constraints ) + { + // Make sure other windows know they're part of a 'meaningful relationship' + if ( m_constraints->left.GetOtherWindow() && (m_constraints->left.GetOtherWindow() != this) ) + m_constraints->left.GetOtherWindow()->AddConstraintReference(this); + if ( m_constraints->top.GetOtherWindow() && (m_constraints->top.GetOtherWindow() != this) ) + m_constraints->top.GetOtherWindow()->AddConstraintReference(this); + if ( m_constraints->right.GetOtherWindow() && (m_constraints->right.GetOtherWindow() != this) ) + m_constraints->right.GetOtherWindow()->AddConstraintReference(this); + if ( m_constraints->bottom.GetOtherWindow() && (m_constraints->bottom.GetOtherWindow() != this) ) + m_constraints->bottom.GetOtherWindow()->AddConstraintReference(this); + if ( m_constraints->width.GetOtherWindow() && (m_constraints->width.GetOtherWindow() != this) ) + m_constraints->width.GetOtherWindow()->AddConstraintReference(this); + if ( m_constraints->height.GetOtherWindow() && (m_constraints->height.GetOtherWindow() != this) ) + m_constraints->height.GetOtherWindow()->AddConstraintReference(this); + if ( m_constraints->centreX.GetOtherWindow() && (m_constraints->centreX.GetOtherWindow() != this) ) + m_constraints->centreX.GetOtherWindow()->AddConstraintReference(this); + if ( m_constraints->centreY.GetOtherWindow() && (m_constraints->centreY.GetOtherWindow() != this) ) + m_constraints->centreY.GetOtherWindow()->AddConstraintReference(this); + } +} + +// This removes any dangling pointers to this window in other windows' +// constraintsInvolvedIn lists. +void wxWindowBase::UnsetConstraints(wxLayoutConstraints *c) +{ + if ( c ) + { + if ( c->left.GetOtherWindow() && (c->top.GetOtherWindow() != this) ) + c->left.GetOtherWindow()->RemoveConstraintReference(this); + if ( c->top.GetOtherWindow() && (c->top.GetOtherWindow() != this) ) + c->top.GetOtherWindow()->RemoveConstraintReference(this); + if ( c->right.GetOtherWindow() && (c->right.GetOtherWindow() != this) ) + c->right.GetOtherWindow()->RemoveConstraintReference(this); + if ( c->bottom.GetOtherWindow() && (c->bottom.GetOtherWindow() != this) ) + c->bottom.GetOtherWindow()->RemoveConstraintReference(this); + if ( c->width.GetOtherWindow() && (c->width.GetOtherWindow() != this) ) + c->width.GetOtherWindow()->RemoveConstraintReference(this); + if ( c->height.GetOtherWindow() && (c->height.GetOtherWindow() != this) ) + c->height.GetOtherWindow()->RemoveConstraintReference(this); + if ( c->centreX.GetOtherWindow() && (c->centreX.GetOtherWindow() != this) ) + c->centreX.GetOtherWindow()->RemoveConstraintReference(this); + if ( c->centreY.GetOtherWindow() && (c->centreY.GetOtherWindow() != this) ) + c->centreY.GetOtherWindow()->RemoveConstraintReference(this); + } +} + +// Back-pointer to other windows we're involved with, so if we delete this +// window, we must delete any constraints we're involved with. +void wxWindowBase::AddConstraintReference(wxWindowBase *otherWin) +{ + if ( !m_constraintsInvolvedIn ) + m_constraintsInvolvedIn = new wxWindowList; + if ( !m_constraintsInvolvedIn->Find((wxWindow *)otherWin) ) + m_constraintsInvolvedIn->Append((wxWindow *)otherWin); +} + +// REMOVE back-pointer to other windows we're involved with. +void wxWindowBase::RemoveConstraintReference(wxWindowBase *otherWin) +{ + if ( m_constraintsInvolvedIn ) + m_constraintsInvolvedIn->DeleteObject((wxWindow *)otherWin); +} + +// Reset any constraints that mention this window +void wxWindowBase::DeleteRelatedConstraints() +{ + if ( m_constraintsInvolvedIn ) + { + wxWindowList::compatibility_iterator node = m_constraintsInvolvedIn->GetFirst(); + while (node) + { + wxWindow *win = node->GetData(); + wxLayoutConstraints *constr = win->GetConstraints(); + + // Reset any constraints involving this window + if ( constr ) + { + constr->left.ResetIfWin(this); + constr->top.ResetIfWin(this); + constr->right.ResetIfWin(this); + constr->bottom.ResetIfWin(this); + constr->width.ResetIfWin(this); + constr->height.ResetIfWin(this); + constr->centreX.ResetIfWin(this); + constr->centreY.ResetIfWin(this); + } + + wxWindowList::compatibility_iterator next = node->GetNext(); + m_constraintsInvolvedIn->Erase(node); + node = next; + } + + delete m_constraintsInvolvedIn; + m_constraintsInvolvedIn = (wxWindowList *) NULL; + } +} + +#endif // wxUSE_CONSTRAINTS + +void wxWindowBase::SetSizer(wxSizer *sizer, bool deleteOld) +{ + if ( sizer == m_windowSizer) + return; + + if ( m_windowSizer ) + { + m_windowSizer->SetContainingWindow(NULL); + + if ( deleteOld ) + delete m_windowSizer; + } + + m_windowSizer = sizer; + if ( m_windowSizer ) + { + m_windowSizer->SetContainingWindow((wxWindow *)this); + } + + SetAutoLayout(m_windowSizer != NULL); +} + +void wxWindowBase::SetSizerAndFit(wxSizer *sizer, bool deleteOld) +{ + SetSizer( sizer, deleteOld ); + sizer->SetSizeHints( (wxWindow*) this ); +} + + +void wxWindowBase::SetContainingSizer(wxSizer* sizer) +{ + // adding a window to a sizer twice is going to result in fatal and + // hard to debug problems later because when deleting the second + // associated wxSizerItem we're going to dereference a dangling + // pointer; so try to detect this as early as possible + wxASSERT_MSG( !sizer || m_containingSizer != sizer, + _T("Adding a window to the same sizer twice?") ); + + m_containingSizer = sizer; +} + +#if wxUSE_CONSTRAINTS + +void wxWindowBase::SatisfyConstraints() +{ + wxLayoutConstraints *constr = GetConstraints(); + bool wasOk = constr && constr->AreSatisfied(); + + ResetConstraints(); // Mark all constraints as unevaluated + + int noChanges = 1; + + // if we're a top level panel (i.e. our parent is frame/dialog), our + // own constraints will never be satisfied any more unless we do it + // here + if ( wasOk ) + { + while ( noChanges > 0 ) + { + LayoutPhase1(&noChanges); + } + } + + LayoutPhase2(&noChanges); +} + +#endif // wxUSE_CONSTRAINTS + +bool wxWindowBase::Layout() +{ + // If there is a sizer, use it instead of the constraints + if ( GetSizer() ) + { + int w = 0, h = 0; + GetVirtualSize(&w, &h); + GetSizer()->SetDimension( 0, 0, w, h ); + } +#if wxUSE_CONSTRAINTS + else + { + SatisfyConstraints(); // Find the right constraints values + SetConstraintSizes(); // Recursively set the real window sizes + } +#endif + + return true; +} + +#if wxUSE_CONSTRAINTS + +// first phase of the constraints evaluation: set our own constraints +bool wxWindowBase::LayoutPhase1(int *noChanges) +{ + wxLayoutConstraints *constr = GetConstraints(); + + return !constr || constr->SatisfyConstraints(this, noChanges); +} + +// second phase: set the constraints for our children +bool wxWindowBase::LayoutPhase2(int *noChanges) +{ + *noChanges = 0; + + // Layout children + DoPhase(1); + + // Layout grand children + DoPhase(2); + + return true; +} + +// Do a phase of evaluating child constraints +bool wxWindowBase::DoPhase(int phase) +{ + // the list containing the children for which the constraints are already + // set correctly + wxWindowList succeeded; + + // the max number of iterations we loop before concluding that we can't set + // the constraints + static const int maxIterations = 500; + + for ( int noIterations = 0; noIterations < maxIterations; noIterations++ ) + { + int noChanges = 0; + + // loop over all children setting their constraints + for ( wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); + node; + node = node->GetNext() ) + { + wxWindow *child = node->GetData(); + if ( child->IsTopLevel() ) + { + // top level children are not inside our client area + continue; + } + + if ( !child->GetConstraints() || succeeded.Find(child) ) + { + // this one is either already ok or nothing we can do about it + continue; + } + + int tempNoChanges = 0; + bool success = phase == 1 ? child->LayoutPhase1(&tempNoChanges) + : child->LayoutPhase2(&tempNoChanges); + noChanges += tempNoChanges; + + if ( success ) + { + succeeded.Append(child); + } + } + + if ( !noChanges ) + { + // constraints are set + break; + } + } + + return true; +} + +void wxWindowBase::ResetConstraints() +{ + wxLayoutConstraints *constr = GetConstraints(); + if ( constr ) + { + constr->left.SetDone(false); + constr->top.SetDone(false); + constr->right.SetDone(false); + constr->bottom.SetDone(false); + constr->width.SetDone(false); + constr->height.SetDone(false); + constr->centreX.SetDone(false); + constr->centreY.SetDone(false); + } + + wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); + while (node) + { + wxWindow *win = node->GetData(); + if ( !win->IsTopLevel() ) + win->ResetConstraints(); + node = node->GetNext(); + } +} + +// Need to distinguish between setting the 'fake' size for windows and sizers, +// and setting the real values. +void wxWindowBase::SetConstraintSizes(bool recurse) +{ + wxLayoutConstraints *constr = GetConstraints(); + if ( constr && constr->AreSatisfied() ) + { + int x = constr->left.GetValue(); + int y = constr->top.GetValue(); + int w = constr->width.GetValue(); + int h = constr->height.GetValue(); + + if ( (constr->width.GetRelationship() != wxAsIs ) || + (constr->height.GetRelationship() != wxAsIs) ) + { + SetSize(x, y, w, h); + } + else + { + // If we don't want to resize this window, just move it... + Move(x, y); + } + } + else if ( constr ) + { + wxLogDebug(wxT("Constraints not satisfied for %s named '%s'."), + GetClassInfo()->GetClassName(), + GetName().c_str()); + } + + if ( recurse ) + { + wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); + while (node) + { + wxWindow *win = node->GetData(); + if ( !win->IsTopLevel() && win->GetConstraints() ) + win->SetConstraintSizes(); + node = node->GetNext(); + } + } +} + +// Only set the size/position of the constraint (if any) +void wxWindowBase::SetSizeConstraint(int x, int y, int w, int h) +{ + wxLayoutConstraints *constr = GetConstraints(); + if ( constr ) + { + if ( x != wxDefaultCoord ) + { + constr->left.SetValue(x); + constr->left.SetDone(true); + } + if ( y != wxDefaultCoord ) + { + constr->top.SetValue(y); + constr->top.SetDone(true); + } + if ( w != wxDefaultCoord ) + { + constr->width.SetValue(w); + constr->width.SetDone(true); + } + if ( h != wxDefaultCoord ) + { + constr->height.SetValue(h); + constr->height.SetDone(true); + } + } +} + +void wxWindowBase::MoveConstraint(int x, int y) +{ + wxLayoutConstraints *constr = GetConstraints(); + if ( constr ) + { + if ( x != wxDefaultCoord ) + { + constr->left.SetValue(x); + constr->left.SetDone(true); + } + if ( y != wxDefaultCoord ) + { + constr->top.SetValue(y); + constr->top.SetDone(true); + } + } +} + +void wxWindowBase::GetSizeConstraint(int *w, int *h) const +{ + wxLayoutConstraints *constr = GetConstraints(); + if ( constr ) + { + *w = constr->width.GetValue(); + *h = constr->height.GetValue(); + } + else + GetSize(w, h); +} + +void wxWindowBase::GetClientSizeConstraint(int *w, int *h) const +{ + wxLayoutConstraints *constr = GetConstraints(); + if ( constr ) + { + *w = constr->width.GetValue(); + *h = constr->height.GetValue(); + } + else + GetClientSize(w, h); +} + +void wxWindowBase::GetPositionConstraint(int *x, int *y) const +{ + wxLayoutConstraints *constr = GetConstraints(); + if ( constr ) + { + *x = constr->left.GetValue(); + *y = constr->top.GetValue(); + } + else + GetPosition(x, y); +} + +#endif // wxUSE_CONSTRAINTS + +void wxWindowBase::AdjustForParentClientOrigin(int& x, int& y, int sizeFlags) const +{ + // don't do it for the dialogs/frames - they float independently of their + // parent + if ( !IsTopLevel() ) + { + wxWindow *parent = GetParent(); + if ( !(sizeFlags & wxSIZE_NO_ADJUSTMENTS) && parent ) + { + wxPoint pt(parent->GetClientAreaOrigin()); + x += pt.x; + y += pt.y; + } + } +} + +// ---------------------------------------------------------------------------- +// Update UI processing +// ---------------------------------------------------------------------------- + +void wxWindowBase::UpdateWindowUI(long flags) +{ + wxUpdateUIEvent event(GetId()); + event.SetEventObject(this); + + if ( GetEventHandler()->ProcessEvent(event) ) + { + DoUpdateWindowUI(event); + } + + if (flags & wxUPDATE_UI_RECURSE) + { + wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); + while (node) + { + wxWindow* child = (wxWindow*) node->GetData(); + child->UpdateWindowUI(flags); + node = node->GetNext(); + } + } +} + +// do the window-specific processing after processing the update event +void wxWindowBase::DoUpdateWindowUI(wxUpdateUIEvent& event) +{ + if ( event.GetSetEnabled() ) + Enable(event.GetEnabled()); + + if ( event.GetSetShown() ) + Show(event.GetShown()); +} + +// ---------------------------------------------------------------------------- +// dialog units translations +// ---------------------------------------------------------------------------- + +wxPoint wxWindowBase::ConvertPixelsToDialog(const wxPoint& pt) +{ + int charWidth = GetCharWidth(); + int charHeight = GetCharHeight(); + wxPoint pt2 = wxDefaultPosition; + if (pt.x != wxDefaultCoord) + pt2.x = (int) ((pt.x * 4) / charWidth); + if (pt.y != wxDefaultCoord) + pt2.y = (int) ((pt.y * 8) / charHeight); + + return pt2; +} + +wxPoint wxWindowBase::ConvertDialogToPixels(const wxPoint& pt) +{ + int charWidth = GetCharWidth(); + int charHeight = GetCharHeight(); + wxPoint pt2 = wxDefaultPosition; + if (pt.x != wxDefaultCoord) + pt2.x = (int) ((pt.x * charWidth) / 4); + if (pt.y != wxDefaultCoord) + pt2.y = (int) ((pt.y * charHeight) / 8); + + return pt2; +} + +// ---------------------------------------------------------------------------- +// event handlers +// ---------------------------------------------------------------------------- + +// propagate the colour change event to the subwindows +void wxWindowBase::OnSysColourChanged(wxSysColourChangedEvent& event) +{ + wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); + while ( node ) + { + // Only propagate to non-top-level windows + wxWindow *win = node->GetData(); + if ( !win->IsTopLevel() ) + { + wxSysColourChangedEvent event2; + event.SetEventObject(win); + win->GetEventHandler()->ProcessEvent(event2); + } + + node = node->GetNext(); + } + + Refresh(); +} + +// the default action is to populate dialog with data when it's created, +// and nudge the UI into displaying itself correctly in case +// we've turned the wxUpdateUIEvents frequency down low. +void wxWindowBase::OnInitDialog( wxInitDialogEvent &WXUNUSED(event) ) +{ + TransferDataToWindow(); + + // Update the UI at this point + UpdateWindowUI(wxUPDATE_UI_RECURSE); +} + +// methods for drawing the sizers in a visible way +#ifdef __WXDEBUG__ + +static void DrawSizers(wxWindowBase *win); + +static void DrawBorder(wxWindowBase *win, const wxRect& rect, bool fill = false) +{ + wxClientDC dc((wxWindow *)win); + dc.SetPen(*wxRED_PEN); + dc.SetBrush(fill ? wxBrush(*wxRED, wxCROSSDIAG_HATCH): *wxTRANSPARENT_BRUSH); + dc.DrawRectangle(rect.Deflate(1, 1)); +} + +static void DrawSizer(wxWindowBase *win, wxSizer *sizer) +{ + const wxSizerItemList& items = sizer->GetChildren(); + for ( wxSizerItemList::const_iterator i = items.begin(), + end = items.end(); + i != end; + ++i ) + { + wxSizerItem *item = *i; + if ( item->IsSizer() ) + { + DrawBorder(win, item->GetRect().Deflate(2)); + DrawSizer(win, item->GetSizer()); + } + else if ( item->IsSpacer() ) + { + DrawBorder(win, item->GetRect().Deflate(2), true); + } + else if ( item->IsWindow() ) + { + DrawSizers(item->GetWindow()); + } + } +} + +static void DrawSizers(wxWindowBase *win) +{ + wxSizer *sizer = win->GetSizer(); + if ( sizer ) + { + DrawBorder(win, win->GetClientSize()); + DrawSizer(win, sizer); + } + else // no sizer, still recurse into the children + { + const wxWindowList& children = win->GetChildren(); + for ( wxWindowList::const_iterator i = children.begin(), + end = children.end(); + i != end; + ++i ) + { + DrawSizers(*i); + } + } +} + +#endif // __WXDEBUG__ + +// process special middle clicks +void wxWindowBase::OnMiddleClick( wxMouseEvent& event ) +{ + if ( event.ControlDown() && event.AltDown() ) + { +#ifdef __WXDEBUG__ + // Ctrl-Alt-Shift-mclick makes the sizers visible in debug builds + if ( event.ShiftDown() ) + { + DrawSizers(this); + return; + } +#endif // __WXDEBUG__ + +#if wxUSE_MSGDLG + // don't translate these strings, they're for diagnostics purposes only + wxString msg; + msg.Printf(_T("wxWidgets Library (%s port)\n") + _T("Version %d.%d.%d%s%s, compiled at %s %s\n") + _T("Runtime version of toolkit used is %d.%d.%s\n") + _T("Copyright (c) 1995-2007 wxWidgets team"), + wxPlatformInfo::Get().GetPortIdName().c_str(), + wxMAJOR_VERSION, + wxMINOR_VERSION, + wxRELEASE_NUMBER, +#if wxUSE_UNICODE + L" (Unicode)", +#else + wxEmptyString, +#endif +#ifdef __WXDEBUG__ + _T(" Debug build"), +#else + wxEmptyString, +#endif + __TDATE__, + __TTIME__, + wxPlatformInfo::Get().GetToolkitMajorVersion(), + wxPlatformInfo::Get().GetToolkitMinorVersion(), +#ifdef __WXGTK__ + wxString::Format(_T("\nThe compile-time GTK+ version is %d.%d.%d."), GTK_MAJOR_VERSION, GTK_MINOR_VERSION, GTK_MICRO_VERSION).c_str() +#else + wxEmptyString +#endif + ); + + wxMessageBox(msg, _T("wxWidgets information"), + wxICON_INFORMATION | wxOK, + (wxWindow *)this); + } + else +#endif // wxUSE_MSGDLG + { + event.Skip(); + } +} + +// ---------------------------------------------------------------------------- +// accessibility +// ---------------------------------------------------------------------------- + +#if wxUSE_ACCESSIBILITY +void wxWindowBase::SetAccessible(wxAccessible* accessible) +{ + if (m_accessible && (accessible != m_accessible)) + delete m_accessible; + m_accessible = accessible; + if (m_accessible) + m_accessible->SetWindow((wxWindow*) this); +} + +// Returns the accessible object, creating if necessary. +wxAccessible* wxWindowBase::GetOrCreateAccessible() +{ + if (!m_accessible) + m_accessible = CreateAccessible(); + return m_accessible; +} + +// Override to create a specific accessible object. +wxAccessible* wxWindowBase::CreateAccessible() +{ + return new wxWindowAccessible((wxWindow*) this); +} + +#endif + +// ---------------------------------------------------------------------------- +// list classes implementation +// ---------------------------------------------------------------------------- + +#if wxUSE_STL + +#include "wx/listimpl.cpp" +WX_DEFINE_LIST(wxWindowList) + +#else // !wxUSE_STL + +void wxWindowListNode::DeleteData() +{ + delete (wxWindow *)GetData(); +} + +#endif // wxUSE_STL/!wxUSE_STL + +// ---------------------------------------------------------------------------- +// borders +// ---------------------------------------------------------------------------- + +wxBorder wxWindowBase::GetBorder(long flags) const +{ + wxBorder border = (wxBorder)(flags & wxBORDER_MASK); + if ( border == wxBORDER_DEFAULT ) + { + border = GetDefaultBorder(); + } + + return border; +} + +wxBorder wxWindowBase::GetDefaultBorder() const +{ + return wxBORDER_NONE; +} + +// ---------------------------------------------------------------------------- +// hit testing +// ---------------------------------------------------------------------------- + +wxHitTest wxWindowBase::DoHitTest(wxCoord x, wxCoord y) const +{ + // here we just check if the point is inside the window or not + + // check the top and left border first + bool outside = x < 0 || y < 0; + if ( !outside ) + { + // check the right and bottom borders too + wxSize size = GetSize(); + outside = x >= size.x || y >= size.y; + } + + return outside ? wxHT_WINDOW_OUTSIDE : wxHT_WINDOW_INSIDE; +} + +// ---------------------------------------------------------------------------- +// mouse capture +// ---------------------------------------------------------------------------- + +struct WXDLLEXPORT wxWindowNext +{ + wxWindow *win; + wxWindowNext *next; +} *wxWindowBase::ms_winCaptureNext = NULL; +wxWindow *wxWindowBase::ms_winCaptureCurrent = NULL; +bool wxWindowBase::ms_winCaptureChanging = false; + +void wxWindowBase::CaptureMouse() +{ + wxLogTrace(_T("mousecapture"), _T("CaptureMouse(%p)"), wx_static_cast(void*, this)); + + wxASSERT_MSG( !ms_winCaptureChanging, _T("recursive CaptureMouse call?") ); + + ms_winCaptureChanging = true; + + wxWindow *winOld = GetCapture(); + if ( winOld ) + { + ((wxWindowBase*) winOld)->DoReleaseMouse(); + + // save it on stack + wxWindowNext *item = new wxWindowNext; + item->win = winOld; + item->next = ms_winCaptureNext; + ms_winCaptureNext = item; + } + //else: no mouse capture to save + + DoCaptureMouse(); + ms_winCaptureCurrent = (wxWindow*)this; + + ms_winCaptureChanging = false; +} + +void wxWindowBase::ReleaseMouse() +{ + wxLogTrace(_T("mousecapture"), _T("ReleaseMouse(%p)"), wx_static_cast(void*, this)); + + wxASSERT_MSG( !ms_winCaptureChanging, _T("recursive ReleaseMouse call?") ); + + wxASSERT_MSG( GetCapture() == this, wxT("attempt to release mouse, but this window hasn't captured it") ); + + ms_winCaptureChanging = true; + + DoReleaseMouse(); + ms_winCaptureCurrent = NULL; + + if ( ms_winCaptureNext ) + { + ((wxWindowBase*)ms_winCaptureNext->win)->DoCaptureMouse(); + ms_winCaptureCurrent = ms_winCaptureNext->win; + + wxWindowNext *item = ms_winCaptureNext; + ms_winCaptureNext = item->next; + delete item; + } + //else: stack is empty, no previous capture + + ms_winCaptureChanging = false; + + wxLogTrace(_T("mousecapture"), + (const wxChar *) _T("After ReleaseMouse() mouse is captured by %p"), + wx_static_cast(void*, GetCapture())); +} + +static void DoNotifyWindowAboutCaptureLost(wxWindow *win) +{ + wxMouseCaptureLostEvent event(win->GetId()); + event.SetEventObject(win); + if ( !win->GetEventHandler()->ProcessEvent(event) ) + { + // windows must handle this event, otherwise the app wouldn't behave + // correctly if it loses capture unexpectedly; see the discussion here: + // http://sourceforge.net/tracker/index.php?func=detail&aid=1153662&group_id=9863&atid=109863 + // http://article.gmane.org/gmane.comp.lib.wxwidgets.devel/82376 + wxFAIL_MSG( _T("window that captured the mouse didn't process wxEVT_MOUSE_CAPTURE_LOST") ); + } +} + +/* static */ +void wxWindowBase::NotifyCaptureLost() +{ + // don't do anything if capture lost was expected, i.e. resulted from + // a wx call to ReleaseMouse or CaptureMouse: + if ( ms_winCaptureChanging ) + return; + + // if the capture was lost unexpectedly, notify every window that has + // capture (on stack or current) about it and clear the stack: + + if ( ms_winCaptureCurrent ) + { + DoNotifyWindowAboutCaptureLost(ms_winCaptureCurrent); + ms_winCaptureCurrent = NULL; + } + + while ( ms_winCaptureNext ) + { + wxWindowNext *item = ms_winCaptureNext; + ms_winCaptureNext = item->next; + + DoNotifyWindowAboutCaptureLost(item->win); + + delete item; + } +} + +#if wxUSE_HOTKEY + +bool +wxWindowBase::RegisterHotKey(int WXUNUSED(hotkeyId), + int WXUNUSED(modifiers), + int WXUNUSED(keycode)) +{ + // not implemented + return false; +} + +bool wxWindowBase::UnregisterHotKey(int WXUNUSED(hotkeyId)) +{ + // not implemented + return false; +} + +#endif // wxUSE_HOTKEY + +// ---------------------------------------------------------------------------- +// event processing +// ---------------------------------------------------------------------------- + +bool wxWindowBase::TryValidator(wxEvent& wxVALIDATOR_PARAM(event)) +{ +#if wxUSE_VALIDATORS + // Can only use the validator of the window which + // is receiving the event + if ( event.GetEventObject() == this ) + { + wxValidator *validator = GetValidator(); + if ( validator && validator->ProcessEvent(event) ) + { + return true; + } + } +#endif // wxUSE_VALIDATORS + + return false; +} + +bool wxWindowBase::TryParent(wxEvent& event) +{ + // carry on up the parent-child hierarchy if the propagation count hasn't + // reached zero yet + if ( event.ShouldPropagate() ) + { + // honour the requests to stop propagation at this window: this is + // used by the dialogs, for example, to prevent processing the events + // from the dialog controls in the parent frame which rarely, if ever, + // makes sense + if ( !(GetExtraStyle() & wxWS_EX_BLOCK_EVENTS) ) + { + wxWindow *parent = GetParent(); + if ( parent && !parent->IsBeingDeleted() ) + { + wxPropagateOnce propagateOnce(event); + + return parent->GetEventHandler()->ProcessEvent(event); + } + } + } + + return wxEvtHandler::TryParent(event); +} + +// ---------------------------------------------------------------------------- +// keyboard navigation +// ---------------------------------------------------------------------------- + +// Navigates in the specified direction. +bool wxWindowBase::Navigate(int flags) +{ + wxNavigationKeyEvent eventNav; + eventNav.SetFlags(flags); + eventNav.SetEventObject(this); + if ( GetParent()->GetEventHandler()->ProcessEvent(eventNav) ) + { + return true; + } + return false; +} + +void wxWindowBase::DoMoveInTabOrder(wxWindow *win, MoveKind move) +{ + // check that we're not a top level window + wxCHECK_RET( GetParent(), + _T("MoveBefore/AfterInTabOrder() don't work for TLWs!") ); + + // detect the special case when we have nothing to do anyhow and when the + // code below wouldn't work + if ( win == this ) + return; + + // find the target window in the siblings list + wxWindowList& siblings = GetParent()->GetChildren(); + wxWindowList::compatibility_iterator i = siblings.Find(win); + wxCHECK_RET( i, _T("MoveBefore/AfterInTabOrder(): win is not a sibling") ); + + // unfortunately, when wxUSE_STL == 1 DetachNode() is not implemented so we + // can't just move the node around + wxWindow *self = (wxWindow *)this; + siblings.DeleteObject(self); + if ( move == MoveAfter ) + { + i = i->GetNext(); + } + + if ( i ) + { + siblings.Insert(i, self); + } + else // MoveAfter and win was the last sibling + { + siblings.Append(self); + } +} + +// ---------------------------------------------------------------------------- +// focus handling +// ---------------------------------------------------------------------------- + +/*static*/ wxWindow* wxWindowBase::FindFocus() +{ + wxWindowBase *win = DoFindFocus(); + return win ? win->GetMainWindowOfCompositeControl() : NULL; +} + +// ---------------------------------------------------------------------------- +// global functions +// ---------------------------------------------------------------------------- + +wxWindow* wxGetTopLevelParent(wxWindow *win) +{ + while ( win && !win->IsTopLevel() ) + win = win->GetParent(); + + return win; +} + +#if wxUSE_ACCESSIBILITY +// ---------------------------------------------------------------------------- +// accessible object for windows +// ---------------------------------------------------------------------------- + +// Can return either a child object, or an integer +// representing the child element, starting from 1. +wxAccStatus wxWindowAccessible::HitTest(const wxPoint& WXUNUSED(pt), int* WXUNUSED(childId), wxAccessible** WXUNUSED(childObject)) +{ + wxASSERT( GetWindow() != NULL ); + if (!GetWindow()) + return wxACC_FAIL; + + return wxACC_NOT_IMPLEMENTED; +} + +// Returns the rectangle for this object (id = 0) or a child element (id > 0). +wxAccStatus wxWindowAccessible::GetLocation(wxRect& rect, int elementId) +{ + wxASSERT( GetWindow() != NULL ); + if (!GetWindow()) + return wxACC_FAIL; + + wxWindow* win = NULL; + if (elementId == 0) + { + win = GetWindow(); + } + else + { + if (elementId <= (int) GetWindow()->GetChildren().GetCount()) + { + win = GetWindow()->GetChildren().Item(elementId-1)->GetData(); + } + else + return wxACC_FAIL; + } + if (win) + { + rect = win->GetRect(); + if (win->GetParent() && !win->IsKindOf(CLASSINFO(wxTopLevelWindow))) + rect.SetPosition(win->GetParent()->ClientToScreen(rect.GetPosition())); + return wxACC_OK; + } + + return wxACC_NOT_IMPLEMENTED; +} + +// Navigates from fromId to toId/toObject. +wxAccStatus wxWindowAccessible::Navigate(wxNavDir navDir, int fromId, + int* WXUNUSED(toId), wxAccessible** toObject) +{ + wxASSERT( GetWindow() != NULL ); + if (!GetWindow()) + return wxACC_FAIL; + + switch (navDir) + { + case wxNAVDIR_FIRSTCHILD: + { + if (GetWindow()->GetChildren().GetCount() == 0) + return wxACC_FALSE; + wxWindow* childWindow = (wxWindow*) GetWindow()->GetChildren().GetFirst()->GetData(); + *toObject = childWindow->GetOrCreateAccessible(); + + return wxACC_OK; + } + case wxNAVDIR_LASTCHILD: + { + if (GetWindow()->GetChildren().GetCount() == 0) + return wxACC_FALSE; + wxWindow* childWindow = (wxWindow*) GetWindow()->GetChildren().GetLast()->GetData(); + *toObject = childWindow->GetOrCreateAccessible(); + + return wxACC_OK; + } + case wxNAVDIR_RIGHT: + case wxNAVDIR_DOWN: + case wxNAVDIR_NEXT: + { + wxWindowList::compatibility_iterator node = + wxWindowList::compatibility_iterator(); + if (fromId == 0) + { + // Can't navigate to sibling of this window + // if we're a top-level window. + if (!GetWindow()->GetParent()) + return wxACC_NOT_IMPLEMENTED; + + node = GetWindow()->GetParent()->GetChildren().Find(GetWindow()); + } + else + { + if (fromId <= (int) GetWindow()->GetChildren().GetCount()) + node = GetWindow()->GetChildren().Item(fromId-1); + } + + if (node && node->GetNext()) + { + wxWindow* nextWindow = node->GetNext()->GetData(); + *toObject = nextWindow->GetOrCreateAccessible(); + return wxACC_OK; + } + else + return wxACC_FALSE; + } + case wxNAVDIR_LEFT: + case wxNAVDIR_UP: + case wxNAVDIR_PREVIOUS: + { + wxWindowList::compatibility_iterator node = + wxWindowList::compatibility_iterator(); + if (fromId == 0) + { + // Can't navigate to sibling of this window + // if we're a top-level window. + if (!GetWindow()->GetParent()) + return wxACC_NOT_IMPLEMENTED; + + node = GetWindow()->GetParent()->GetChildren().Find(GetWindow()); + } + else + { + if (fromId <= (int) GetWindow()->GetChildren().GetCount()) + node = GetWindow()->GetChildren().Item(fromId-1); + } + + if (node && node->GetPrevious()) + { + wxWindow* previousWindow = node->GetPrevious()->GetData(); + *toObject = previousWindow->GetOrCreateAccessible(); + return wxACC_OK; + } + else + return wxACC_FALSE; + } + } + + return wxACC_NOT_IMPLEMENTED; +} + +// Gets the name of the specified object. +wxAccStatus wxWindowAccessible::GetName(int childId, wxString* name) +{ + wxASSERT( GetWindow() != NULL ); + if (!GetWindow()) + return wxACC_FAIL; + + wxString title; + + // If a child, leave wxWidgets to call the function on the actual + // child object. + if (childId > 0) + return wxACC_NOT_IMPLEMENTED; + + // This will eventually be replaced by specialised + // accessible classes, one for each kind of wxWidgets + // control or window. +#if wxUSE_BUTTON + if (GetWindow()->IsKindOf(CLASSINFO(wxButton))) + title = ((wxButton*) GetWindow())->GetLabel(); + else +#endif + title = GetWindow()->GetName(); + + if (!title.empty()) + { + *name = title; + return wxACC_OK; + } + else + return wxACC_NOT_IMPLEMENTED; +} + +// Gets the number of children. +wxAccStatus wxWindowAccessible::GetChildCount(int* childId) +{ + wxASSERT( GetWindow() != NULL ); + if (!GetWindow()) + return wxACC_FAIL; + + *childId = (int) GetWindow()->GetChildren().GetCount(); + return wxACC_OK; +} + +// Gets the specified child (starting from 1). +// If *child is NULL and return value is wxACC_OK, +// this means that the child is a simple element and +// not an accessible object. +wxAccStatus wxWindowAccessible::GetChild(int childId, wxAccessible** child) +{ + wxASSERT( GetWindow() != NULL ); + if (!GetWindow()) + return wxACC_FAIL; + + if (childId == 0) + { + *child = this; + return wxACC_OK; + } + + if (childId > (int) GetWindow()->GetChildren().GetCount()) + return wxACC_FAIL; + + wxWindow* childWindow = GetWindow()->GetChildren().Item(childId-1)->GetData(); + *child = childWindow->GetOrCreateAccessible(); + if (*child) + return wxACC_OK; + else + return wxACC_FAIL; +} + +// Gets the parent, or NULL. +wxAccStatus wxWindowAccessible::GetParent(wxAccessible** parent) +{ + wxASSERT( GetWindow() != NULL ); + if (!GetWindow()) + return wxACC_FAIL; + + wxWindow* parentWindow = GetWindow()->GetParent(); + if (!parentWindow) + { + *parent = NULL; + return wxACC_OK; + } + else + { + *parent = parentWindow->GetOrCreateAccessible(); + if (*parent) + return wxACC_OK; + else + return wxACC_FAIL; + } +} + +// Performs the default action. childId is 0 (the action for this object) +// or > 0 (the action for a child). +// Return wxACC_NOT_SUPPORTED if there is no default action for this +// window (e.g. an edit control). +wxAccStatus wxWindowAccessible::DoDefaultAction(int WXUNUSED(childId)) +{ + wxASSERT( GetWindow() != NULL ); + if (!GetWindow()) + return wxACC_FAIL; + + return wxACC_NOT_IMPLEMENTED; +} + +// Gets the default action for this object (0) or > 0 (the action for a child). +// Return wxACC_OK even if there is no action. actionName is the action, or the empty +// string if there is no action. +// The retrieved string describes the action that is performed on an object, +// not what the object does as a result. For example, a toolbar button that prints +// a document has a default action of "Press" rather than "Prints the current document." +wxAccStatus wxWindowAccessible::GetDefaultAction(int WXUNUSED(childId), wxString* WXUNUSED(actionName)) +{ + wxASSERT( GetWindow() != NULL ); + if (!GetWindow()) + return wxACC_FAIL; + + return wxACC_NOT_IMPLEMENTED; +} + +// Returns the description for this object or a child. +wxAccStatus wxWindowAccessible::GetDescription(int WXUNUSED(childId), wxString* description) +{ + wxASSERT( GetWindow() != NULL ); + if (!GetWindow()) + return wxACC_FAIL; + + wxString ht(GetWindow()->GetHelpTextAtPoint(wxDefaultPosition, wxHelpEvent::Origin_Keyboard)); + if (!ht.empty()) + { + *description = ht; + return wxACC_OK; + } + return wxACC_NOT_IMPLEMENTED; +} + +// Returns help text for this object or a child, similar to tooltip text. +wxAccStatus wxWindowAccessible::GetHelpText(int WXUNUSED(childId), wxString* helpText) +{ + wxASSERT( GetWindow() != NULL ); + if (!GetWindow()) + return wxACC_FAIL; + + wxString ht(GetWindow()->GetHelpTextAtPoint(wxDefaultPosition, wxHelpEvent::Origin_Keyboard)); + if (!ht.empty()) + { + *helpText = ht; + return wxACC_OK; + } + return wxACC_NOT_IMPLEMENTED; +} + +// Returns the keyboard shortcut for this object or child. +// Return e.g. ALT+K +wxAccStatus wxWindowAccessible::GetKeyboardShortcut(int WXUNUSED(childId), wxString* WXUNUSED(shortcut)) +{ + wxASSERT( GetWindow() != NULL ); + if (!GetWindow()) + return wxACC_FAIL; + + return wxACC_NOT_IMPLEMENTED; +} + +// Returns a role constant. +wxAccStatus wxWindowAccessible::GetRole(int childId, wxAccRole* role) +{ + wxASSERT( GetWindow() != NULL ); + if (!GetWindow()) + return wxACC_FAIL; + + // If a child, leave wxWidgets to call the function on the actual + // child object. + if (childId > 0) + return wxACC_NOT_IMPLEMENTED; + + if (GetWindow()->IsKindOf(CLASSINFO(wxControl))) + return wxACC_NOT_IMPLEMENTED; +#if wxUSE_STATUSBAR + if (GetWindow()->IsKindOf(CLASSINFO(wxStatusBar))) + return wxACC_NOT_IMPLEMENTED; +#endif +#if wxUSE_TOOLBAR + if (GetWindow()->IsKindOf(CLASSINFO(wxToolBar))) + return wxACC_NOT_IMPLEMENTED; +#endif + + //*role = wxROLE_SYSTEM_CLIENT; + *role = wxROLE_SYSTEM_CLIENT; + return wxACC_OK; + + #if 0 + return wxACC_NOT_IMPLEMENTED; + #endif +} + +// Returns a state constant. +wxAccStatus wxWindowAccessible::GetState(int childId, long* state) +{ + wxASSERT( GetWindow() != NULL ); + if (!GetWindow()) + return wxACC_FAIL; + + // If a child, leave wxWidgets to call the function on the actual + // child object. + if (childId > 0) + return wxACC_NOT_IMPLEMENTED; + + if (GetWindow()->IsKindOf(CLASSINFO(wxControl))) + return wxACC_NOT_IMPLEMENTED; + +#if wxUSE_STATUSBAR + if (GetWindow()->IsKindOf(CLASSINFO(wxStatusBar))) + return wxACC_NOT_IMPLEMENTED; +#endif +#if wxUSE_TOOLBAR + if (GetWindow()->IsKindOf(CLASSINFO(wxToolBar))) + return wxACC_NOT_IMPLEMENTED; +#endif + + *state = 0; + return wxACC_OK; + + #if 0 + return wxACC_NOT_IMPLEMENTED; + #endif +} + +// Returns a localized string representing the value for the object +// or child. +wxAccStatus wxWindowAccessible::GetValue(int WXUNUSED(childId), wxString* WXUNUSED(strValue)) +{ + wxASSERT( GetWindow() != NULL ); + if (!GetWindow()) + return wxACC_FAIL; + + return wxACC_NOT_IMPLEMENTED; +} + +// Selects the object or child. +wxAccStatus wxWindowAccessible::Select(int WXUNUSED(childId), wxAccSelectionFlags WXUNUSED(selectFlags)) +{ + wxASSERT( GetWindow() != NULL ); + if (!GetWindow()) + return wxACC_FAIL; + + return wxACC_NOT_IMPLEMENTED; +} + +// Gets the window with the keyboard focus. +// If childId is 0 and child is NULL, no object in +// this subhierarchy has the focus. +// If this object has the focus, child should be 'this'. +wxAccStatus wxWindowAccessible::GetFocus(int* WXUNUSED(childId), wxAccessible** WXUNUSED(child)) +{ + wxASSERT( GetWindow() != NULL ); + if (!GetWindow()) + return wxACC_FAIL; + + return wxACC_NOT_IMPLEMENTED; +} + +#if wxUSE_VARIANT +// Gets a variant representing the selected children +// of this object. +// Acceptable values: +// - a null variant (IsNull() returns true) +// - a list variant (GetType() == wxT("list") +// - an integer representing the selected child element, +// or 0 if this object is selected (GetType() == wxT("long") +// - a "void*" pointer to a wxAccessible child object +wxAccStatus wxWindowAccessible::GetSelections(wxVariant* WXUNUSED(selections)) +{ + wxASSERT( GetWindow() != NULL ); + if (!GetWindow()) + return wxACC_FAIL; + + return wxACC_NOT_IMPLEMENTED; +} +#endif // wxUSE_VARIANT + +#endif // wxUSE_ACCESSIBILITY + +// ---------------------------------------------------------------------------- +// RTL support +// ---------------------------------------------------------------------------- + +wxCoord +wxWindowBase::AdjustForLayoutDirection(wxCoord x, + wxCoord width, + wxCoord widthTotal) const +{ + if ( GetLayoutDirection() == wxLayout_RightToLeft ) + { + x = widthTotal - x - width; + } + + return x; +} + diff --git a/Externals/wxWidgets/src/common/wxchar.cpp b/Externals/wxWidgets/src/common/wxchar.cpp new file mode 100644 index 0000000000..3a47ff0a5a --- /dev/null +++ b/Externals/wxWidgets/src/common/wxchar.cpp @@ -0,0 +1,2282 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/wxchar.cpp +// Purpose: wxChar implementation +// Author: Ove Kaven +// Modified by: Ron Lee, Francesco Montorsi +// Created: 09/04/99 +// RCS-ID: $Id: wxchar.cpp 49328 2007-10-22 11:32:59Z VZ $ +// Copyright: (c) wxWidgets copyright +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// =========================================================================== +// headers, declarations, constants +// =========================================================================== + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#include "wx/wxchar.h" + +#define _ISOC9X_SOURCE 1 // to get vsscanf() +#define _BSD_SOURCE 1 // to still get strdup() + +#include +#include +#include + +#ifndef __WXWINCE__ + #include + #include +#else + #include "wx/msw/wince/time.h" +#endif + +#ifndef WX_PRECOMP + #include "wx/string.h" + #include "wx/hash.h" + #include "wx/utils.h" // for wxMin and wxMax + #include "wx/log.h" +#endif + +#if defined(__WIN32__) && defined(wxNEED_WX_CTYPE_H) + #include + #include + #include + #include +#endif + +#if defined(__MWERKS__) && __MSL__ >= 0x6000 +namespace std {} +using namespace std ; +#endif + +#if wxUSE_WCHAR_T +size_t WXDLLEXPORT wxMB2WC(wchar_t *buf, const char *psz, size_t n) +{ + // assume that we have mbsrtowcs() too if we have wcsrtombs() +#ifdef HAVE_WCSRTOMBS + mbstate_t mbstate; + memset(&mbstate, 0, sizeof(mbstate_t)); +#endif + + if (buf) { + if (!n || !*psz) { + if (n) *buf = wxT('\0'); + return 0; + } +#ifdef HAVE_WCSRTOMBS + return mbsrtowcs(buf, &psz, n, &mbstate); +#else + return wxMbstowcs(buf, psz, n); +#endif + } + + // note that we rely on common (and required by Unix98 but unfortunately not + // C99) extension which allows to call mbs(r)towcs() with NULL output pointer + // to just get the size of the needed buffer -- this is needed as otherwise + // we have no idea about how much space we need and if the CRT doesn't + // support it (the only currently known example being Metrowerks, see + // wx/wxchar.h) we don't use its mbstowcs() at all +#ifdef HAVE_WCSRTOMBS + return mbsrtowcs((wchar_t *) NULL, &psz, 0, &mbstate); +#else + return wxMbstowcs((wchar_t *) NULL, psz, 0); +#endif +} + +size_t WXDLLEXPORT wxWC2MB(char *buf, const wchar_t *pwz, size_t n) +{ +#ifdef HAVE_WCSRTOMBS + mbstate_t mbstate; + memset(&mbstate, 0, sizeof(mbstate_t)); +#endif + + if (buf) { + if (!n || !*pwz) { + // glibc2.1 chokes on null input + if (n) *buf = '\0'; + return 0; + } +#ifdef HAVE_WCSRTOMBS + return wcsrtombs(buf, &pwz, n, &mbstate); +#else + return wxWcstombs(buf, pwz, n); +#endif + } + +#ifdef HAVE_WCSRTOMBS + return wcsrtombs((char *) NULL, &pwz, 0, &mbstate); +#else + return wxWcstombs((char *) NULL, pwz, 0); +#endif +} +#endif // wxUSE_WCHAR_T + +bool WXDLLEXPORT wxOKlibc() +{ +#if wxUSE_WCHAR_T && defined(__UNIX__) && defined(__GLIBC__) && !defined(__WINE__) + // glibc 2.0 uses UTF-8 even when it shouldn't + wchar_t res = 0; + if ((MB_CUR_MAX == 2) && + (wxMB2WC(&res, "\xdd\xa5", 1) == 1) && + (res==0x765)) { + // this is UTF-8 allright, check whether that's what we want + char *cur_locale = setlocale(LC_CTYPE, NULL); + if ((strlen(cur_locale) < 4) || + (strcasecmp(cur_locale + strlen(cur_locale) - 4, "utf8")) || + (strcasecmp(cur_locale + strlen(cur_locale) - 5, "utf-8"))) { + // nope, don't use libc conversion + return false; + } + } +#endif + return true; +} + +// ============================================================================ +// printf() functions business +// ============================================================================ + +// special test mode: define all functions below even if we don't really need +// them to be able to test them +#ifdef wxTEST_PRINTF + #undef wxFprintf + #undef wxPrintf + #undef wxSprintf + #undef wxVfprintf + #undef wxVsprintf + #undef wxVprintf + #undef wxVsnprintf_ + #undef wxSnprintf_ + + #define wxNEED_WPRINTF + + int wxVfprintf( FILE *stream, const wxChar *format, va_list argptr ); +#endif + +// ---------------------------------------------------------------------------- +// implement [v]snprintf() if the system doesn't provide a safe one +// or if the system's one does not support positional parameters +// (very useful for i18n purposes) +// ---------------------------------------------------------------------------- + +#if !defined(wxVsnprintf_) + +#if !wxUSE_WXVSNPRINTF + #error wxUSE_WXVSNPRINTF must be 1 if our wxVsnprintf_ is used +#endif + +// wxUSE_STRUTILS says our wxVsnprintf_ implementation to use or not to +// use wxStrlen and wxStrncpy functions over one-char processing loops. +// +// Some benchmarking revealed that wxUSE_STRUTILS == 1 has the following +// effects: +// -> on Windows: +// when in ANSI mode, this setting does not change almost anything +// when in Unicode mode, it gives ~ 50% of slowdown ! +// -> on Linux: +// both in ANSI and Unicode mode it gives ~ 60% of speedup ! +// +#if defined(WIN32) && wxUSE_UNICODE +#define wxUSE_STRUTILS 0 +#else +#define wxUSE_STRUTILS 1 +#endif + +// some limits of our implementation +#define wxMAX_SVNPRINTF_ARGUMENTS 64 +#define wxMAX_SVNPRINTF_FLAGBUFFER_LEN 32 +#define wxMAX_SVNPRINTF_SCRATCHBUFFER_LEN 512 + +// prefer snprintf over sprintf +#if defined(__VISUALC__) || \ + (defined(__BORLANDC__) && __BORLANDC__ >= 0x540) + #define system_sprintf(buff, max, flags, data) \ + ::_snprintf(buff, max, flags, data) +#elif defined(HAVE_SNPRINTF) + #define system_sprintf(buff, max, flags, data) \ + ::snprintf(buff, max, flags, data) +#else // NB: at least sprintf() should always be available + // since 'max' is not used in this case, wxVsnprintf() should always + // ensure that 'buff' is big enough for all common needs + // (see wxMAX_SVNPRINTF_FLAGBUFFER_LEN and wxMAX_SVNPRINTF_SCRATCHBUFFER_LEN) + #define system_sprintf(buff, max, flags, data) \ + ::sprintf(buff, flags, data) + + #define SYSTEM_SPRINTF_IS_UNSAFE +#endif + +// the conversion specifiers accepted by wxVsnprintf_ +enum wxPrintfArgType { + wxPAT_INVALID = -1, + + wxPAT_INT, // %d, %i, %o, %u, %x, %X + wxPAT_LONGINT, // %ld, etc +#ifdef wxLongLong_t + wxPAT_LONGLONGINT, // %Ld, etc +#endif + wxPAT_SIZET, // %Zd, etc + + wxPAT_DOUBLE, // %e, %E, %f, %g, %G + wxPAT_LONGDOUBLE, // %le, etc + + wxPAT_POINTER, // %p + + wxPAT_CHAR, // %hc (in ANSI mode: %c, too) + wxPAT_WCHAR, // %lc (in Unicode mode: %c, too) + + wxPAT_PCHAR, // %s (related to a char *) + wxPAT_PWCHAR, // %s (related to a wchar_t *) + + wxPAT_NINT, // %n + wxPAT_NSHORTINT, // %hn + wxPAT_NLONGINT // %ln +}; + +// an argument passed to wxVsnprintf_ +typedef union { + int pad_int; // %d, %i, %o, %u, %x, %X + long int pad_longint; // %ld, etc +#ifdef wxLongLong_t + wxLongLong_t pad_longlongint; // %Ld, etc +#endif + size_t pad_sizet; // %Zd, etc + + double pad_double; // %e, %E, %f, %g, %G + long double pad_longdouble; // %le, etc + + void *pad_pointer; // %p + + char pad_char; // %hc (in ANSI mode: %c, too) + wchar_t pad_wchar; // %lc (in Unicode mode: %c, too) + + char *pad_pchar; // %s (related to a char *) + wchar_t *pad_pwchar; // %s (related to a wchar_t *) + + int *pad_nint; // %n + short int *pad_nshortint; // %hn + long int *pad_nlongint; // %ln +} wxPrintfArg; + + +// Contains parsed data relative to a conversion specifier given to +// wxVsnprintf_ and parsed from the format string +// NOTE: in C++ there is almost no difference between struct & classes thus +// there is no performance gain by using a struct here... +class wxPrintfConvSpec +{ +public: + + // the position of the argument relative to this conversion specifier + size_t m_pos; + + // the type of this conversion specifier + wxPrintfArgType m_type; + + // the minimum and maximum width + // when one of this var is set to -1 it means: use the following argument + // in the stack as minimum/maximum width for this conversion specifier + int m_nMinWidth, m_nMaxWidth; + + // does the argument need to the be aligned to left ? + bool m_bAlignLeft; + + // pointer to the '%' of this conversion specifier in the format string + // NOTE: this points somewhere in the string given to the Parse() function - + // it's task of the caller ensure that memory is still valid ! + const wxChar *m_pArgPos; + + // pointer to the last character of this conversion specifier in the + // format string + // NOTE: this points somewhere in the string given to the Parse() function - + // it's task of the caller ensure that memory is still valid ! + const wxChar *m_pArgEnd; + + // a little buffer where formatting flags like #+\.hlqLZ are stored by Parse() + // for use in Process() + // NB: even if this buffer is used only for numeric conversion specifiers and + // thus could be safely declared as a char[] buffer, we want it to be wxChar + // so that in Unicode builds we can avoid to convert its contents to Unicode + // chars when copying it in user's buffer. + char m_szFlags[wxMAX_SVNPRINTF_FLAGBUFFER_LEN]; + + +public: + + // we don't declare this as a constructor otherwise it would be called + // automatically and we don't want this: to be optimized, wxVsnprintf_ + // calls this function only on really-used instances of this class. + void Init(); + + // Parses the first conversion specifier in the given string, which must + // begin with a '%'. Returns false if the first '%' does not introduce a + // (valid) conversion specifier and thus should be ignored. + bool Parse(const wxChar *format); + + // Process this conversion specifier and puts the result in the given + // buffer. Returns the number of characters written in 'buf' or -1 if + // there's not enough space. + int Process(wxChar *buf, size_t lenMax, wxPrintfArg *p, size_t written); + + // Loads the argument of this conversion specifier from given va_list. + bool LoadArg(wxPrintfArg *p, va_list &argptr); + +private: + // An helper function of LoadArg() which is used to handle the '*' flag + void ReplaceAsteriskWith(int w); +}; + +void wxPrintfConvSpec::Init() +{ + m_nMinWidth = 0; + m_nMaxWidth = 0xFFFF; + m_pos = 0; + m_bAlignLeft = false; + m_pArgPos = m_pArgEnd = NULL; + m_type = wxPAT_INVALID; + + // this character will never be removed from m_szFlags array and + // is important when calling sprintf() in wxPrintfConvSpec::Process() ! + m_szFlags[0] = '%'; +} + +bool wxPrintfConvSpec::Parse(const wxChar *format) +{ + bool done = false; + + // temporary parse data + size_t flagofs = 1; + bool in_prec, // true if we found the dot in some previous iteration + prec_dot; // true if the dot has been already added to m_szFlags + int ilen = 0; + + m_bAlignLeft = in_prec = prec_dot = false; + m_pArgPos = m_pArgEnd = format; + do + { +#define CHECK_PREC \ + if (in_prec && !prec_dot) \ + { \ + m_szFlags[flagofs++] = '.'; \ + prec_dot = true; \ + } + + // what follows '%'? + const wxChar ch = *(++m_pArgEnd); + switch ( ch ) + { + case wxT('\0'): + return false; // not really an argument + + case wxT('%'): + return false; // not really an argument + + case wxT('#'): + case wxT('0'): + case wxT(' '): + case wxT('+'): + case wxT('\''): + CHECK_PREC + m_szFlags[flagofs++] = char(ch); + break; + + case wxT('-'): + CHECK_PREC + m_bAlignLeft = true; + m_szFlags[flagofs++] = char(ch); + break; + + case wxT('.'): + CHECK_PREC + in_prec = true; + prec_dot = false; + m_nMaxWidth = 0; + // dot will be auto-added to m_szFlags if non-negative + // number follows + break; + + case wxT('h'): + ilen = -1; + CHECK_PREC + m_szFlags[flagofs++] = char(ch); + break; + + case wxT('l'): + // NB: it's safe to use flagofs-1 as flagofs always start from 1 + if (m_szFlags[flagofs-1] == 'l') // 'll' modifier is the same as 'L' or 'q' + ilen = 2; + else + ilen = 1; + CHECK_PREC + m_szFlags[flagofs++] = char(ch); + break; + + case wxT('q'): + case wxT('L'): + ilen = 2; + CHECK_PREC + m_szFlags[flagofs++] = char(ch); + break; +#ifdef __WXMSW__ + // under Windows we support the special '%I64' notation as longlong + // integer conversion specifier for MSVC compatibility + // (it behaves exactly as '%lli' or '%Li' or '%qi') + case wxT('I'): + if (*(m_pArgEnd+1) != wxT('6') || + *(m_pArgEnd+2) != wxT('4')) + return false; // bad format + + m_pArgEnd++; + m_pArgEnd++; + + ilen = 2; + CHECK_PREC + m_szFlags[flagofs++] = char(ch); + m_szFlags[flagofs++] = '6'; + m_szFlags[flagofs++] = '4'; + break; +#endif // __WXMSW__ + + case wxT('Z'): + ilen = 3; + CHECK_PREC + m_szFlags[flagofs++] = char(ch); + break; + + case wxT('*'): + if (in_prec) + { + CHECK_PREC + + // tell Process() to use the next argument + // in the stack as maxwidth... + m_nMaxWidth = -1; + } + else + { + // tell Process() to use the next argument + // in the stack as minwidth... + m_nMinWidth = -1; + } + + // save the * in our formatting buffer... + // will be replaced later by Process() + m_szFlags[flagofs++] = char(ch); + break; + + case wxT('1'): case wxT('2'): case wxT('3'): + case wxT('4'): case wxT('5'): case wxT('6'): + case wxT('7'): case wxT('8'): case wxT('9'): + { + int len = 0; + CHECK_PREC + while ( (*m_pArgEnd >= wxT('0')) && + (*m_pArgEnd <= wxT('9')) ) + { + m_szFlags[flagofs++] = char(*m_pArgEnd); + len = len*10 + (*m_pArgEnd - wxT('0')); + m_pArgEnd++; + } + + if (in_prec) + m_nMaxWidth = len; + else + m_nMinWidth = len; + + m_pArgEnd--; // the main loop pre-increments n again + } + break; + + case wxT('$'): // a positional parameter (e.g. %2$s) ? + { + if (m_nMinWidth <= 0) + break; // ignore this formatting flag as no + // numbers are preceding it + + // remove from m_szFlags all digits previously added + do { + flagofs--; + } while (m_szFlags[flagofs] >= '1' && + m_szFlags[flagofs] <= '9'); + + // re-adjust the offset making it point to the + // next free char of m_szFlags + flagofs++; + + m_pos = m_nMinWidth; + m_nMinWidth = 0; + } + break; + + case wxT('d'): + case wxT('i'): + case wxT('o'): + case wxT('u'): + case wxT('x'): + case wxT('X'): + CHECK_PREC + m_szFlags[flagofs++] = char(ch); + m_szFlags[flagofs] = '\0'; + if (ilen == 0) + m_type = wxPAT_INT; + else if (ilen == -1) + // NB: 'short int' value passed through '...' + // is promoted to 'int', so we have to get + // an int from stack even if we need a short + m_type = wxPAT_INT; + else if (ilen == 1) + m_type = wxPAT_LONGINT; + else if (ilen == 2) +#ifdef wxLongLong_t + m_type = wxPAT_LONGLONGINT; +#else // !wxLongLong_t + m_type = wxPAT_LONGINT; +#endif // wxLongLong_t/!wxLongLong_t + else if (ilen == 3) + m_type = wxPAT_SIZET; + done = true; + break; + + case wxT('e'): + case wxT('E'): + case wxT('f'): + case wxT('g'): + case wxT('G'): + CHECK_PREC + m_szFlags[flagofs++] = char(ch); + m_szFlags[flagofs] = '\0'; + if (ilen == 2) + m_type = wxPAT_LONGDOUBLE; + else + m_type = wxPAT_DOUBLE; + done = true; + break; + + case wxT('p'): + m_type = wxPAT_POINTER; + m_szFlags[flagofs++] = char(ch); + m_szFlags[flagofs] = '\0'; + done = true; + break; + + case wxT('c'): + if (ilen == -1) + { + // in Unicode mode %hc == ANSI character + // and in ANSI mode, %hc == %c == ANSI... + m_type = wxPAT_CHAR; + } + else if (ilen == 1) + { + // in ANSI mode %lc == Unicode character + // and in Unicode mode, %lc == %c == Unicode... + m_type = wxPAT_WCHAR; + } + else + { +#if wxUSE_UNICODE + // in Unicode mode, %c == Unicode character + m_type = wxPAT_WCHAR; +#else + // in ANSI mode, %c == ANSI character + m_type = wxPAT_CHAR; +#endif + } + done = true; + break; + + case wxT('s'): + if (ilen == -1) + { + // Unicode mode wx extension: we'll let %hs mean non-Unicode + // strings (when in ANSI mode, %s == %hs == ANSI string) + m_type = wxPAT_PCHAR; + } + else if (ilen == 1) + { + // in Unicode mode, %ls == %s == Unicode string + // in ANSI mode, %ls == Unicode string + m_type = wxPAT_PWCHAR; + } + else + { +#if wxUSE_UNICODE + m_type = wxPAT_PWCHAR; +#else + m_type = wxPAT_PCHAR; +#endif + } + done = true; + break; + + case wxT('n'): + if (ilen == 0) + m_type = wxPAT_NINT; + else if (ilen == -1) + m_type = wxPAT_NSHORTINT; + else if (ilen >= 1) + m_type = wxPAT_NLONGINT; + done = true; + break; + + default: + // bad format, don't consider this an argument; + // leave it unchanged + return false; + } + + if (flagofs == wxMAX_SVNPRINTF_FLAGBUFFER_LEN) + { + wxLogDebug(wxT("Too many flags specified for a single conversion specifier!")); + return false; + } + } + while (!done); + + return true; // parsing was successful +} + + +void wxPrintfConvSpec::ReplaceAsteriskWith(int width) +{ + char temp[wxMAX_SVNPRINTF_FLAGBUFFER_LEN]; + + // find the first * in our flag buffer + char *pwidth = strchr(m_szFlags, '*'); + wxCHECK_RET(pwidth, _T("field width must be specified")); + + // save what follows the * (the +1 is to skip the asterisk itself!) + strcpy(temp, pwidth+1); + if (width < 0) + { + pwidth[0] = wxT('-'); + pwidth++; + } + + // replace * with the actual integer given as width +#ifndef SYSTEM_SPRINTF_IS_UNSAFE + int maxlen = (m_szFlags + wxMAX_SVNPRINTF_FLAGBUFFER_LEN - pwidth) / + sizeof(*m_szFlags); +#endif + int offset = system_sprintf(pwidth, maxlen, "%d", abs(width)); + + // restore after the expanded * what was following it + strcpy(pwidth+offset, temp); +} + +bool wxPrintfConvSpec::LoadArg(wxPrintfArg *p, va_list &argptr) +{ + // did the '*' width/precision specifier was used ? + if (m_nMaxWidth == -1) + { + // take the maxwidth specifier from the stack + m_nMaxWidth = va_arg(argptr, int); + if (m_nMaxWidth < 0) + m_nMaxWidth = 0; + else + ReplaceAsteriskWith(m_nMaxWidth); + } + + if (m_nMinWidth == -1) + { + // take the minwidth specifier from the stack + m_nMinWidth = va_arg(argptr, int); + + ReplaceAsteriskWith(m_nMinWidth); + if (m_nMinWidth < 0) + { + m_bAlignLeft = !m_bAlignLeft; + m_nMinWidth = -m_nMinWidth; + } + } + + switch (m_type) { + case wxPAT_INT: + p->pad_int = va_arg(argptr, int); + break; + case wxPAT_LONGINT: + p->pad_longint = va_arg(argptr, long int); + break; +#ifdef wxLongLong_t + case wxPAT_LONGLONGINT: + p->pad_longlongint = va_arg(argptr, wxLongLong_t); + break; +#endif // wxLongLong_t + case wxPAT_SIZET: + p->pad_sizet = va_arg(argptr, size_t); + break; + case wxPAT_DOUBLE: + p->pad_double = va_arg(argptr, double); + break; + case wxPAT_LONGDOUBLE: + p->pad_longdouble = va_arg(argptr, long double); + break; + case wxPAT_POINTER: + p->pad_pointer = va_arg(argptr, void *); + break; + + case wxPAT_CHAR: + p->pad_char = (char)va_arg(argptr, int); // char is promoted to int when passed through '...' + break; + case wxPAT_WCHAR: + p->pad_wchar = (wchar_t)va_arg(argptr, int); // char is promoted to int when passed through '...' + break; + + case wxPAT_PCHAR: + p->pad_pchar = va_arg(argptr, char *); + break; + case wxPAT_PWCHAR: + p->pad_pwchar = va_arg(argptr, wchar_t *); + break; + + case wxPAT_NINT: + p->pad_nint = va_arg(argptr, int *); + break; + case wxPAT_NSHORTINT: + p->pad_nshortint = va_arg(argptr, short int *); + break; + case wxPAT_NLONGINT: + p->pad_nlongint = va_arg(argptr, long int *); + break; + + case wxPAT_INVALID: + default: + return false; + } + + return true; // loading was successful +} + +int wxPrintfConvSpec::Process(wxChar *buf, size_t lenMax, wxPrintfArg *p, size_t written) +{ + // buffer to avoid dynamic memory allocation each time for small strings; + // note that this buffer is used only to hold results of number formatting, + // %s directly writes user's string in buf, without using szScratch + char szScratch[wxMAX_SVNPRINTF_SCRATCHBUFFER_LEN]; + size_t lenScratch = 0, lenCur = 0; + +#define APPEND_CH(ch) \ + { \ + if ( lenCur == lenMax ) \ + return -1; \ + \ + buf[lenCur++] = ch; \ + } + +#define APPEND_STR(s) \ + { \ + for ( const wxChar *p = s; *p; p++ ) \ + { \ + APPEND_CH(*p); \ + } \ + } + + switch ( m_type ) + { + case wxPAT_INT: + lenScratch = system_sprintf(szScratch, wxMAX_SVNPRINTF_SCRATCHBUFFER_LEN, m_szFlags, p->pad_int); + break; + + case wxPAT_LONGINT: + lenScratch = system_sprintf(szScratch, wxMAX_SVNPRINTF_SCRATCHBUFFER_LEN, m_szFlags, p->pad_longint); + break; + +#ifdef wxLongLong_t + case wxPAT_LONGLONGINT: + lenScratch = system_sprintf(szScratch, wxMAX_SVNPRINTF_SCRATCHBUFFER_LEN, m_szFlags, p->pad_longlongint); + break; +#endif // SIZEOF_LONG_LONG + + case wxPAT_SIZET: + lenScratch = system_sprintf(szScratch, wxMAX_SVNPRINTF_SCRATCHBUFFER_LEN, m_szFlags, p->pad_sizet); + break; + + case wxPAT_LONGDOUBLE: + lenScratch = system_sprintf(szScratch, wxMAX_SVNPRINTF_SCRATCHBUFFER_LEN, m_szFlags, p->pad_longdouble); + break; + + case wxPAT_DOUBLE: + lenScratch = system_sprintf(szScratch, wxMAX_SVNPRINTF_SCRATCHBUFFER_LEN, m_szFlags, p->pad_double); + break; + + case wxPAT_POINTER: + lenScratch = system_sprintf(szScratch, wxMAX_SVNPRINTF_SCRATCHBUFFER_LEN, m_szFlags, p->pad_pointer); + break; + + case wxPAT_CHAR: + case wxPAT_WCHAR: + { + wxChar val = +#if wxUSE_UNICODE + p->pad_wchar; + + if (m_type == wxPAT_CHAR) + { + // user passed a character explicitely indicated as ANSI... + const char buf[2] = { p->pad_char, 0 }; + val = wxString(buf, wxConvLibc)[0u]; + + //wprintf(L"converting ANSI=>Unicode"); // for debug + } +#else + p->pad_char; + +#if wxUSE_WCHAR_T + if (m_type == wxPAT_WCHAR) + { + // user passed a character explicitely indicated as Unicode... + const wchar_t buf[2] = { p->pad_wchar, 0 }; + val = wxString(buf, wxConvLibc)[0u]; + + //printf("converting Unicode=>ANSI"); // for debug + } +#endif +#endif + + size_t i; + + if (!m_bAlignLeft) + for (i = 1; i < (size_t)m_nMinWidth; i++) + APPEND_CH(_T(' ')); + + APPEND_CH(val); + + if (m_bAlignLeft) + for (i = 1; i < (size_t)m_nMinWidth; i++) + APPEND_CH(_T(' ')); + } + break; + + case wxPAT_PCHAR: + case wxPAT_PWCHAR: + { + wxString s; + const wxChar *val = +#if wxUSE_UNICODE + p->pad_pwchar; + + if (m_type == wxPAT_PCHAR) + { + // user passed a string explicitely indicated as ANSI... + val = s = wxString(p->pad_pchar, wxConvLibc); + + //wprintf(L"converting ANSI=>Unicode"); // for debug + } +#else + p->pad_pchar; + +#if wxUSE_WCHAR_T + if (m_type == wxPAT_PWCHAR) + { + // user passed a string explicitely indicated as Unicode... + val = s = wxString(p->pad_pwchar, wxConvLibc); + + //printf("converting Unicode=>ANSI"); // for debug + } +#endif +#endif + int len; + + if (val) + { +#if wxUSE_STRUTILS + // at this point we are sure that m_nMaxWidth is positive or null + // (see top of wxPrintfConvSpec::LoadArg) + len = wxMin((unsigned int)m_nMaxWidth, wxStrlen(val)); +#else + for ( len = 0; val[len] && (len < m_nMaxWidth); len++ ) + ; +#endif + } + else if (m_nMaxWidth >= 6) + { + val = wxT("(null)"); + len = 6; + } + else + { + val = wxEmptyString; + len = 0; + } + + int i; + + if (!m_bAlignLeft) + { + for (i = len; i < m_nMinWidth; i++) + APPEND_CH(_T(' ')); + } + +#if wxUSE_STRUTILS + len = wxMin((unsigned int)len, lenMax-lenCur); + wxStrncpy(buf+lenCur, val, len); + lenCur += len; +#else + for (i = 0; i < len; i++) + APPEND_CH(val[i]); +#endif + + if (m_bAlignLeft) + { + for (i = len; i < m_nMinWidth; i++) + APPEND_CH(_T(' ')); + } + } + break; + + case wxPAT_NINT: + *p->pad_nint = written; + break; + + case wxPAT_NSHORTINT: + *p->pad_nshortint = (short int)written; + break; + + case wxPAT_NLONGINT: + *p->pad_nlongint = written; + break; + + case wxPAT_INVALID: + default: + return -1; + } + + // if we used system's sprintf() then we now need to append the s_szScratch + // buffer to the given one... + switch (m_type) + { + case wxPAT_INT: + case wxPAT_LONGINT: +#ifdef wxLongLong_t + case wxPAT_LONGLONGINT: +#endif + case wxPAT_SIZET: + case wxPAT_LONGDOUBLE: + case wxPAT_DOUBLE: + case wxPAT_POINTER: + wxASSERT(lenScratch < wxMAX_SVNPRINTF_SCRATCHBUFFER_LEN); +#if !wxUSE_UNICODE + { + if (lenMax < lenScratch) + { + // fill output buffer and then return -1 + wxStrncpy(buf, szScratch, lenMax); + return -1; + } + wxStrncpy(buf, szScratch, lenScratch); + lenCur += lenScratch; + } +#else + { + // Copy the char scratch to the wide output. This requires + // conversion, but we can optimise by making use of the fact + // that we are formatting numbers, this should mean only 7-bit + // ascii characters are involved. + wxChar *bufptr = buf; + const wxChar *bufend = buf + lenMax; + const char *scratchptr = szScratch; + + // Simply copy each char to a wxChar, stopping on the first + // null or non-ascii byte. Checking '(signed char)*scratchptr + // > 0' is an extra optimisation over '*scratchptr != 0 && + // isascii(*scratchptr)', though it assumes signed char is + // 8-bit 2 complement. + while ((signed char)*scratchptr > 0 && bufptr != bufend) + *bufptr++ = *scratchptr++; + + if (bufptr == bufend) + return -1; + + lenCur += bufptr - buf; + + // check if the loop stopped on a non-ascii char, if yes then + // fall back to wxMB2WX + if (*scratchptr) + { + size_t len = wxMB2WX(bufptr, scratchptr, bufend - bufptr); + + if (len && len != (size_t)(-1)) + if (bufptr[len - 1]) + return -1; + else + lenCur += len; + } + } +#endif + break; + + default: + break; // all other cases were completed previously + } + + return lenCur; +} + +// Copy chars from source to dest converting '%%' to '%'. Takes at most maxIn +// chars from source and write at most outMax chars to dest, returns the +// number of chars actually written. Does not treat null specially. +// +static int wxCopyStrWithPercents( + size_t maxOut, + wxChar *dest, + size_t maxIn, + const wxChar *source) +{ + size_t written = 0; + + if (maxIn == 0) + return 0; + + size_t i; + for ( i = 0; i < maxIn-1 && written < maxOut; source++, i++) + { + dest[written++] = *source; + if (*(source+1) == wxT('%')) + { + // skip this additional '%' character + source++; + i++; + } + } + + if (i < maxIn && written < maxOut) + // copy last character inconditionally + dest[written++] = *source; + + return written; +} + +int WXDLLEXPORT wxVsnprintf_(wxChar *buf, size_t lenMax, + const wxChar *format, va_list argptr) +{ + // useful for debugging, to understand if we are really using this function + // rather than the system implementation +#if 0 + wprintf(L"Using wxVsnprintf_\n"); +#endif + + // required memory: + wxPrintfConvSpec arg[wxMAX_SVNPRINTF_ARGUMENTS]; + wxPrintfArg argdata[wxMAX_SVNPRINTF_ARGUMENTS]; + wxPrintfConvSpec *pspec[wxMAX_SVNPRINTF_ARGUMENTS] = { NULL }; + + size_t i; + + // number of characters in the buffer so far, must be less than lenMax + size_t lenCur = 0; + + size_t nargs = 0; + const wxChar *toparse = format; + + // parse the format string + bool posarg_present = false, nonposarg_present = false; + for (; *toparse != wxT('\0'); toparse++) + { + if (*toparse == wxT('%') ) + { + arg[nargs].Init(); + + // let's see if this is a (valid) conversion specifier... + if (arg[nargs].Parse(toparse)) + { + // ...yes it is + wxPrintfConvSpec *current = &arg[nargs]; + + // make toparse point to the end of this specifier + toparse = current->m_pArgEnd; + + if (current->m_pos > 0) + { + // the positionals start from number 1... adjust the index + current->m_pos--; + posarg_present = true; + } + else + { + // not a positional argument... + current->m_pos = nargs; + nonposarg_present = true; + } + + // this conversion specifier is tied to the pos-th argument... + pspec[current->m_pos] = current; + nargs++; + + if (nargs == wxMAX_SVNPRINTF_ARGUMENTS) + { + wxLogDebug(wxT("A single call to wxVsnprintf() has more than %d arguments; ") + wxT("ignoring all remaining arguments."), wxMAX_SVNPRINTF_ARGUMENTS); + break; // cannot handle any additional conv spec + } + } + else + { + // it's safe to look in the next character of toparse as at worst + // we'll hit its \0 + if (*(toparse+1) == wxT('%')) + toparse++; // the Parse() returned false because we've found a %% + } + } + } + + if (posarg_present && nonposarg_present) + { + buf[0] = 0; + return -1; // format strings with both positional and + } // non-positional conversion specifier are unsupported !! + + // on platforms where va_list is an array type, it is necessary to make a + // copy to be able to pass it to LoadArg as a reference. + bool ok = true; + va_list ap; + wxVaCopy(ap, argptr); + + // now load arguments from stack + for (i=0; i < nargs && ok; i++) + { + // !pspec[i] means that the user forgot a positional parameter (e.g. %$1s %$3s); + // LoadArg == false means that wxPrintfConvSpec::Parse failed to set the + // conversion specifier 'type' to a valid value... + ok = pspec[i] && pspec[i]->LoadArg(&argdata[i], ap); + } + + va_end(ap); + + // something failed while loading arguments from the variable list... + // (e.g. the user repeated twice the same positional argument) + if (!ok) + { + buf[0] = 0; + return -1; + } + + // finally, process each conversion specifier with its own argument + toparse = format; + for (i=0; i < nargs; i++) + { + // copy in the output buffer the portion of the format string between + // last specifier and the current one + size_t tocopy = ( arg[i].m_pArgPos - toparse ); + + lenCur += wxCopyStrWithPercents(lenMax - lenCur, buf + lenCur, + tocopy, toparse); + if (lenCur == lenMax) + { + buf[lenMax - 1] = 0; + return lenMax+1; // not enough space in the output buffer ! + } + + // process this specifier directly in the output buffer + int n = arg[i].Process(buf+lenCur, lenMax - lenCur, &argdata[arg[i].m_pos], lenCur); + if (n == -1) + { + buf[lenMax-1] = wxT('\0'); // be sure to always NUL-terminate the string + return lenMax+1; // not enough space in the output buffer ! + } + lenCur += n; + + // the +1 is because wxPrintfConvSpec::m_pArgEnd points to the last character + // of the format specifier, but we are not interested to it... + toparse = arg[i].m_pArgEnd + 1; + } + + // copy portion of the format string after last specifier + // NOTE: toparse is pointing to the character just after the last processed + // conversion specifier + // NOTE2: the +1 is because we want to copy also the '\0' + size_t tocopy = wxStrlen(format) + 1 - ( toparse - format ) ; + + lenCur += wxCopyStrWithPercents(lenMax - lenCur, buf + lenCur, + tocopy, toparse) - 1; + if (buf[lenCur]) + { + buf[lenCur] = 0; + return lenMax+1; // not enough space in the output buffer ! + } + + // Don't do: + // wxASSERT(lenCur == wxStrlen(buf)); + // in fact if we embedded NULLs in the output buffer (using %c with a '\0') + // such check would fail + + return lenCur; +} + +#undef APPEND_CH +#undef APPEND_STR +#undef CHECK_PREC + +#else // wxVsnprintf_ is defined + +#if wxUSE_WXVSNPRINTF + #error wxUSE_WXVSNPRINTF must be 0 if our wxVsnprintf_ is not used +#endif + +#endif // !wxVsnprintf_ + +#if !defined(wxSnprintf_) +int WXDLLEXPORT wxSnprintf_(wxChar *buf, size_t len, const wxChar *format, ...) +{ + va_list argptr; + va_start(argptr, format); + + int iLen = wxVsnprintf_(buf, len, format, argptr); + + va_end(argptr); + + return iLen; +} +#endif // wxSnprintf_ + +#if defined(__DMC__) + /* Digital Mars adds count to _stprintf (C99) so convert */ + #if wxUSE_UNICODE + int wxSprintf (wchar_t * __RESTRICT s, const wchar_t * __RESTRICT format, ... ) + { + va_list arglist; + + va_start( arglist, format ); + int iLen = swprintf ( s, -1, format, arglist ); + va_end( arglist ); + return iLen ; + } + + #endif // wxUSE_UNICODE + +#endif //__DMC__ + +#if defined(__MINGW32__) && ( defined(_STLPORT_VERSION) && _STLPORT_VERSION >= 0x510 ) + /* MinGW with STLPort 5.1 has clashing defines for _stprintf so use swprintf */ + /* STLPort 5.1 defines standard (C99) vswprintf() and swprintf() that takes count. */ + int wxSprintf (wchar_t * s, const wchar_t * format, ... ) + { + va_list arglist; + + va_start( arglist, format ); + int iLen = swprintf ( s, -1, format, arglist ); + va_end( arglist ); + return iLen ; + } +#endif // MINGW32 _STLPORT_VERSION >= 0x510 + +// ---------------------------------------------------------------------------- +// implement the standard IO functions for wide char if libc doesn't have them +// ---------------------------------------------------------------------------- + +#ifdef wxNEED_FPUTS +int wxFputs(const wchar_t *ws, FILE *stream) +{ + wxCharBuffer buf(wxConvLibc.cWC2MB(ws)); + if ( !buf ) + return -1; + + // counting the number of wide characters written isn't worth the trouble, + // simply distinguish between ok and error + return fputs(buf, stream) == -1 ? -1 : 0; +} +#endif // wxNEED_FPUTS + +#ifdef wxNEED_PUTS +int wxPuts(const wxChar *ws) +{ + int rc = wxFputs(ws, stdout); + if ( rc != -1 ) + { + if ( wxFputs(L"\n", stdout) == -1 ) + return -1; + + rc++; + } + + return rc; +} +#endif // wxNEED_PUTS + +#ifdef wxNEED_PUTC +int /* not wint_t */ wxPutc(wchar_t wc, FILE *stream) +{ + wchar_t ws[2] = { wc, L'\0' }; + + return wxFputs(ws, stream); +} +#endif // wxNEED_PUTC + +// NB: we only implement va_list functions here, the ones taking ... are +// defined below for wxNEED_PRINTF_CONVERSION case anyhow and we reuse +// the definitions there to avoid duplicating them here +#ifdef wxNEED_WPRINTF + +// TODO: implement the scanf() functions +int vwscanf(const wxChar *format, va_list argptr) +{ + wxFAIL_MSG( _T("TODO") ); + + return -1; +} + +int vswscanf(const wxChar *ws, const wxChar *format, va_list argptr) +{ + // The best we can do without proper Unicode support in glibc is to + // convert the strings into MB representation and run ANSI version + // of the function. This doesn't work with %c and %s because of difference + // in size of char and wchar_t, though. + + wxCHECK_MSG( wxStrstr(format, _T("%s")) == NULL, -1, + _T("incomplete vswscanf implementation doesn't allow %s") ); + wxCHECK_MSG( wxStrstr(format, _T("%c")) == NULL, -1, + _T("incomplete vswscanf implementation doesn't allow %c") ); + + va_list argcopy; + wxVaCopy(argcopy, argptr); + return vsscanf(wxConvLibc.cWX2MB(ws), wxConvLibc.cWX2MB(format), argcopy); +} + +int vfwscanf(FILE *stream, const wxChar *format, va_list argptr) +{ + wxFAIL_MSG( _T("TODO") ); + + return -1; +} + +#define vswprintf wxVsnprintf_ + +int vfwprintf(FILE *stream, const wxChar *format, va_list argptr) +{ + wxString s; + int rc = s.PrintfV(format, argptr); + + if ( rc != -1 ) + { + // we can't do much better without Unicode support in libc... + if ( fprintf(stream, "%s", (const char*)s.mb_str() ) == -1 ) + return -1; + } + + return rc; +} + +int vwprintf(const wxChar *format, va_list argptr) +{ + return wxVfprintf(stdout, format, argptr); +} + +#endif // wxNEED_WPRINTF + +#ifdef wxNEED_PRINTF_CONVERSION + +// ---------------------------------------------------------------------------- +// wxFormatConverter: class doing the "%s" -> "%ls" conversion +// ---------------------------------------------------------------------------- + +/* + Here are the gory details. We want to follow the Windows/MS conventions, + that is to have + + In ANSI mode: + + format specifier results in + ----------------------------------- + %c, %hc, %hC char + %lc, %C, %lC wchar_t + + In Unicode mode: + + format specifier results in + ----------------------------------- + %hc, %C, %hC char + %c, %lc, %lC wchar_t + + + while on POSIX systems we have %C identical to %lc and %c always means char + (in any mode) while %lc always means wchar_t, + + So to use native functions in order to get our semantics we must do the + following translations in Unicode mode (nothing to do in ANSI mode): + + wxWidgets specifier POSIX specifier + ---------------------------------------- + + %hc, %C, %hC %c + %c %lc + + + And, of course, the same should be done for %s as well. +*/ + +class wxFormatConverter +{ +public: + wxFormatConverter(const wxChar *format); + + // notice that we only translated the string if m_fmtOrig == NULL (as set + // by CopyAllBefore()), otherwise we should simply use the original format + operator const wxChar *() const + { return m_fmtOrig ? m_fmtOrig : m_fmt.c_str(); } + +private: + // copy another character to the translated format: this function does the + // copy if we are translating but doesn't do anything at all if we don't, + // so we don't create the translated format string at all unless we really + // need to (i.e. InsertFmtChar() is called) + wxChar CopyFmtChar(wxChar ch) + { + if ( !m_fmtOrig ) + { + // we're translating, do copy + m_fmt += ch; + } + else + { + // simply increase the count which should be copied by + // CopyAllBefore() later if needed + m_nCopied++; + } + + return ch; + } + + // insert an extra character + void InsertFmtChar(wxChar ch) + { + if ( m_fmtOrig ) + { + // so far we haven't translated anything yet + CopyAllBefore(); + } + + m_fmt += ch; + } + + void CopyAllBefore() + { + wxASSERT_MSG( m_fmtOrig && m_fmt.empty(), _T("logic error") ); + + m_fmt = wxString(m_fmtOrig, m_nCopied); + + // we won't need it any longer + m_fmtOrig = NULL; + } + + static bool IsFlagChar(wxChar ch) + { + return ch == _T('-') || ch == _T('+') || + ch == _T('0') || ch == _T(' ') || ch == _T('#'); + } + + void SkipDigits(const wxChar **ptpc) + { + while ( **ptpc >= _T('0') && **ptpc <= _T('9') ) + CopyFmtChar(*(*ptpc)++); + } + + // the translated format + wxString m_fmt; + + // the original format + const wxChar *m_fmtOrig; + + // the number of characters already copied + size_t m_nCopied; +}; + +wxFormatConverter::wxFormatConverter(const wxChar *format) +{ + m_fmtOrig = format; + m_nCopied = 0; + + while ( *format ) + { + if ( CopyFmtChar(*format++) == _T('%') ) + { + // skip any flags + while ( IsFlagChar(*format) ) + CopyFmtChar(*format++); + + // and possible width + if ( *format == _T('*') ) + CopyFmtChar(*format++); + else + SkipDigits(&format); + + // precision? + if ( *format == _T('.') ) + { + CopyFmtChar(*format++); + if ( *format == _T('*') ) + CopyFmtChar(*format++); + else + SkipDigits(&format); + } + + // next we can have a size modifier + enum + { + Default, + Short, + Long + } size; + + switch ( *format ) + { + case _T('h'): + size = Short; + format++; + break; + + case _T('l'): + // "ll" has a different meaning! + if ( format[1] != _T('l') ) + { + size = Long; + format++; + break; + } + //else: fall through + + default: + size = Default; + } + + // and finally we should have the type + switch ( *format ) + { + case _T('C'): + case _T('S'): + // %C and %hC -> %c and %lC -> %lc + if ( size == Long ) + CopyFmtChar(_T('l')); + + InsertFmtChar(*format++ == _T('C') ? _T('c') : _T('s')); + break; + + case _T('c'): + case _T('s'): + // %c -> %lc but %hc stays %hc and %lc is still %lc + if ( size == Default) + InsertFmtChar(_T('l')); + // fall through + + default: + // nothing special to do + if ( size != Default ) + CopyFmtChar(*(format - 1)); + CopyFmtChar(*format++); + } + } + } +} + +#else // !wxNEED_PRINTF_CONVERSION + // no conversion necessary + #define wxFormatConverter(x) (x) +#endif // wxNEED_PRINTF_CONVERSION/!wxNEED_PRINTF_CONVERSION + +#ifdef __WXDEBUG__ +// For testing the format converter +wxString wxConvertFormat(const wxChar *format) +{ + return wxString(wxFormatConverter(format)); +} +#endif + +// ---------------------------------------------------------------------------- +// wxPrintf(), wxScanf() and relatives +// ---------------------------------------------------------------------------- + +#if defined(wxNEED_PRINTF_CONVERSION) || defined(wxNEED_WPRINTF) + +int wxScanf( const wxChar *format, ... ) +{ + va_list argptr; + va_start(argptr, format); + + int ret = vwscanf(wxFormatConverter(format), argptr ); + + va_end(argptr); + + return ret; +} + +int wxSscanf( const wxChar *str, const wxChar *format, ... ) +{ + va_list argptr; + va_start(argptr, format); + + int ret = vswscanf( str, wxFormatConverter(format), argptr ); + + va_end(argptr); + + return ret; +} + +int wxFscanf( FILE *stream, const wxChar *format, ... ) +{ + va_list argptr; + va_start(argptr, format); + int ret = vfwscanf(stream, wxFormatConverter(format), argptr); + + va_end(argptr); + + return ret; +} + +int wxPrintf( const wxChar *format, ... ) +{ + va_list argptr; + va_start(argptr, format); + + int ret = vwprintf( wxFormatConverter(format), argptr ); + + va_end(argptr); + + return ret; +} + +#ifndef wxSnprintf +int wxSnprintf( wxChar *str, size_t size, const wxChar *format, ... ) +{ + va_list argptr; + va_start(argptr, format); + + int ret = vswprintf( str, size, wxFormatConverter(format), argptr ); + + // VsnprintfTestCase reveals that glibc's implementation of vswprintf + // doesn't nul terminate on truncation. + str[size - 1] = 0; + + va_end(argptr); + + return ret; +} +#endif // wxSnprintf + +int wxSprintf( wxChar *str, const wxChar *format, ... ) +{ + va_list argptr; + va_start(argptr, format); + + // note that wxString::FormatV() uses wxVsnprintf(), not wxSprintf(), so + // it's safe to implement this one in terms of it + wxString s(wxString::FormatV(format, argptr)); + wxStrcpy(str, s); + + va_end(argptr); + + return s.length(); +} + +int wxFprintf( FILE *stream, const wxChar *format, ... ) +{ + va_list argptr; + va_start( argptr, format ); + + int ret = vfwprintf( stream, wxFormatConverter(format), argptr ); + + va_end(argptr); + + return ret; +} + +int wxVsscanf( const wxChar *str, const wxChar *format, va_list argptr ) +{ + return vswscanf( str, wxFormatConverter(format), argptr ); +} + +int wxVfprintf( FILE *stream, const wxChar *format, va_list argptr ) +{ + return vfwprintf( stream, wxFormatConverter(format), argptr ); +} + +int wxVprintf( const wxChar *format, va_list argptr ) +{ + return vwprintf( wxFormatConverter(format), argptr ); +} + +#ifndef wxVsnprintf +int wxVsnprintf( wxChar *str, size_t size, const wxChar *format, va_list argptr ) +{ + return vswprintf( str, size, wxFormatConverter(format), argptr ); +} +#endif // wxVsnprintf + +int wxVsprintf( wxChar *str, const wxChar *format, va_list argptr ) +{ + // same as for wxSprintf() + return vswprintf(str, INT_MAX / 4, wxFormatConverter(format), argptr); +} + +#endif // wxNEED_PRINTF_CONVERSION + +#if wxUSE_WCHAR_T + +// ---------------------------------------------------------------------------- +// ctype.h stuff (currently unused) +// ---------------------------------------------------------------------------- + +#if defined(__WIN32__) && defined(wxNEED_WX_CTYPE_H) +inline WORD wxMSW_ctype(wxChar ch) +{ + WORD ret; + GetStringTypeEx(LOCALE_USER_DEFAULT, CT_CTYPE1, &ch, 1, &ret); + return ret; +} + +WXDLLEXPORT int wxIsalnum(wxChar ch) { return IsCharAlphaNumeric(ch); } +WXDLLEXPORT int wxIsalpha(wxChar ch) { return IsCharAlpha(ch); } +WXDLLEXPORT int wxIscntrl(wxChar ch) { return wxMSW_ctype(ch) & C1_CNTRL; } +WXDLLEXPORT int wxIsdigit(wxChar ch) { return wxMSW_ctype(ch) & C1_DIGIT; } +WXDLLEXPORT int wxIsgraph(wxChar ch) { return wxMSW_ctype(ch) & (C1_DIGIT|C1_PUNCT|C1_ALPHA); } +WXDLLEXPORT int wxIslower(wxChar ch) { return IsCharLower(ch); } +WXDLLEXPORT int wxIsprint(wxChar ch) { return wxMSW_ctype(ch) & (C1_DIGIT|C1_SPACE|C1_PUNCT|C1_ALPHA); } +WXDLLEXPORT int wxIspunct(wxChar ch) { return wxMSW_ctype(ch) & C1_PUNCT; } +WXDLLEXPORT int wxIsspace(wxChar ch) { return wxMSW_ctype(ch) & C1_SPACE; } +WXDLLEXPORT int wxIsupper(wxChar ch) { return IsCharUpper(ch); } +WXDLLEXPORT int wxIsxdigit(wxChar ch) { return wxMSW_ctype(ch) & C1_XDIGIT; } +WXDLLEXPORT int wxTolower(wxChar ch) { return (wxChar)CharLower((LPTSTR)(ch)); } +WXDLLEXPORT int wxToupper(wxChar ch) { return (wxChar)CharUpper((LPTSTR)(ch)); } +#endif + +#ifdef wxNEED_WX_MBSTOWCS + +WXDLLEXPORT size_t wxMbstowcs (wchar_t * out, const char * in, size_t outlen) +{ + if (!out) + { + size_t outsize = 0; + while(*in++) + outsize++; + return outsize; + } + + const char* origin = in; + + while (outlen-- && *in) + { + *out++ = (wchar_t) *in++; + } + + *out = '\0'; + + return in - origin; +} + +WXDLLEXPORT size_t wxWcstombs (char * out, const wchar_t * in, size_t outlen) +{ + if (!out) + { + size_t outsize = 0; + while(*in++) + outsize++; + return outsize; + } + + const wchar_t* origin = in; + + while (outlen-- && *in) + { + *out++ = (char) *in++; + } + + *out = '\0'; + + return in - origin; +} + +#endif // wxNEED_WX_MBSTOWCS + +#if defined(wxNEED_WX_CTYPE_H) + +#include + +#define cfalnumset CFCharacterSetGetPredefined(kCFCharacterSetAlphaNumeric) +#define cfalphaset CFCharacterSetGetPredefined(kCFCharacterSetLetter) +#define cfcntrlset CFCharacterSetGetPredefined(kCFCharacterSetControl) +#define cfdigitset CFCharacterSetGetPredefined(kCFCharacterSetDecimalDigit) +//CFCharacterSetRef cfgraphset = kCFCharacterSetControl && !' ' +#define cflowerset CFCharacterSetGetPredefined(kCFCharacterSetLowercaseLetter) +//CFCharacterSetRef cfprintset = !kCFCharacterSetControl +#define cfpunctset CFCharacterSetGetPredefined(kCFCharacterSetPunctuation) +#define cfspaceset CFCharacterSetGetPredefined(kCFCharacterSetWhitespaceAndNewline) +#define cfupperset CFCharacterSetGetPredefined(kCFCharacterSetUppercaseLetter) + +WXDLLEXPORT int wxIsalnum(wxChar ch) { return CFCharacterSetIsCharacterMember(cfalnumset, ch); } +WXDLLEXPORT int wxIsalpha(wxChar ch) { return CFCharacterSetIsCharacterMember(cfalphaset, ch); } +WXDLLEXPORT int wxIscntrl(wxChar ch) { return CFCharacterSetIsCharacterMember(cfcntrlset, ch); } +WXDLLEXPORT int wxIsdigit(wxChar ch) { return CFCharacterSetIsCharacterMember(cfdigitset, ch); } +WXDLLEXPORT int wxIsgraph(wxChar ch) { return !CFCharacterSetIsCharacterMember(cfcntrlset, ch) && ch != ' '; } +WXDLLEXPORT int wxIslower(wxChar ch) { return CFCharacterSetIsCharacterMember(cflowerset, ch); } +WXDLLEXPORT int wxIsprint(wxChar ch) { return !CFCharacterSetIsCharacterMember(cfcntrlset, ch); } +WXDLLEXPORT int wxIspunct(wxChar ch) { return CFCharacterSetIsCharacterMember(cfpunctset, ch); } +WXDLLEXPORT int wxIsspace(wxChar ch) { return CFCharacterSetIsCharacterMember(cfspaceset, ch); } +WXDLLEXPORT int wxIsupper(wxChar ch) { return CFCharacterSetIsCharacterMember(cfupperset, ch); } +WXDLLEXPORT int wxIsxdigit(wxChar ch) { return wxIsdigit(ch) || (ch>='a' && ch<='f') || (ch>='A' && ch<='F'); } +WXDLLEXPORT int wxTolower(wxChar ch) { return (wxChar)tolower((char)(ch)); } +WXDLLEXPORT int wxToupper(wxChar ch) { return (wxChar)toupper((char)(ch)); } + +#endif // wxNEED_WX_CTYPE_H + +#ifndef wxStrdupA + +WXDLLEXPORT char *wxStrdupA(const char *s) +{ + return strcpy((char *)malloc(strlen(s) + 1), s); +} + +#endif // wxStrdupA + +#ifndef wxStrdupW + +WXDLLEXPORT wchar_t * wxStrdupW(const wchar_t *pwz) +{ + size_t size = (wxWcslen(pwz) + 1) * sizeof(wchar_t); + wchar_t *ret = (wchar_t *) malloc(size); + memcpy(ret, pwz, size); + return ret; +} + +#endif // wxStrdupW + +#ifndef wxStricmp +int WXDLLEXPORT wxStricmp(const wxChar *psz1, const wxChar *psz2) +{ + register wxChar c1, c2; + do { + c1 = wxTolower(*psz1++); + c2 = wxTolower(*psz2++); + } while ( c1 && (c1 == c2) ); + return c1 - c2; +} +#endif + +#ifndef wxStricmp +int WXDLLEXPORT wxStrnicmp(const wxChar *s1, const wxChar *s2, size_t n) +{ + // initialize the variables just to suppress stupid gcc warning + register wxChar c1 = 0, c2 = 0; + while (n && ((c1 = wxTolower(*s1)) == (c2 = wxTolower(*s2)) ) && c1) n--, s1++, s2++; + if (n) { + if (c1 < c2) return -1; + if (c1 > c2) return 1; + } + return 0; +} +#endif + +#ifndef wxSetlocale +WXDLLEXPORT wxWCharBuffer wxSetlocale(int category, const wxChar *locale) +{ + char *localeOld = setlocale(category, wxConvLibc.cWX2MB(locale)); + + return wxWCharBuffer(wxConvLibc.cMB2WC(localeOld)); +} +#endif + +#if wxUSE_WCHAR_T && !defined(HAVE_WCSLEN) +WXDLLEXPORT size_t wxWcslen(const wchar_t *s) +{ + size_t n = 0; + while ( *s++ ) + n++; + + return n; +} +#endif + +// ---------------------------------------------------------------------------- +// string.h functions +// ---------------------------------------------------------------------------- + +#ifdef wxNEED_WX_STRING_H + +// RN: These need to be c externed for the regex lib +#ifdef __cplusplus +extern "C" { +#endif + +WXDLLEXPORT wxChar * wxStrcat(wxChar *dest, const wxChar *src) +{ + wxChar *ret = dest; + while (*dest) dest++; + while ((*dest++ = *src++)); + return ret; +} + +WXDLLEXPORT const wxChar * wxStrchr(const wxChar *s, wxChar c) +{ + // be careful here as the terminating NUL makes part of the string + while ( *s != c ) + { + if ( !*s++ ) + return NULL; + } + + return s; +} + +WXDLLEXPORT int wxStrcmp(const wxChar *s1, const wxChar *s2) +{ + while ((*s1 == *s2) && *s1) s1++, s2++; + if ((wxUChar)*s1 < (wxUChar)*s2) return -1; + if ((wxUChar)*s1 > (wxUChar)*s2) return 1; + return 0; +} + +WXDLLEXPORT wxChar * wxStrcpy(wxChar *dest, const wxChar *src) +{ + wxChar *ret = dest; + while ((*dest++ = *src++)); + return ret; +} + +WXDLLEXPORT size_t wxStrlen_(const wxChar *s) +{ + size_t n = 0; + while ( *s++ ) + n++; + + return n; +} + + +WXDLLEXPORT wxChar * wxStrncat(wxChar *dest, const wxChar *src, size_t n) +{ + wxChar *ret = dest; + while (*dest) dest++; + while (n && (*dest++ = *src++)) n--; + return ret; +} + +WXDLLEXPORT int wxStrncmp(const wxChar *s1, const wxChar *s2, size_t n) +{ + while (n && (*s1 == *s2) && *s1) n--, s1++, s2++; + if (n) { + if ((wxUChar)*s1 < (wxUChar)*s2) return -1; + if ((wxUChar)*s1 > (wxUChar)*s2) return 1; + } + return 0; +} + +WXDLLEXPORT wxChar * wxStrncpy(wxChar *dest, const wxChar *src, size_t n) +{ + wxChar *ret = dest; + while (n && (*dest++ = *src++)) n--; + while (n) *dest++=0, n--; // the docs specify padding with zeroes + return ret; +} + +WXDLLEXPORT const wxChar * wxStrpbrk(const wxChar *s, const wxChar *accept) +{ + while (*s && !wxStrchr(accept, *s)) + s++; + + return *s ? s : NULL; +} + +WXDLLEXPORT const wxChar * wxStrrchr(const wxChar *s, wxChar c) +{ + const wxChar *ret = NULL; + do + { + if ( *s == c ) + ret = s; + s++; + } + while ( *s ); + + return ret; +} + +WXDLLEXPORT size_t wxStrspn(const wxChar *s, const wxChar *accept) +{ + size_t len = 0; + while (wxStrchr(accept, *s++)) len++; + return len; +} + +WXDLLEXPORT const wxChar *wxStrstr(const wxChar *haystack, const wxChar *needle) +{ + wxASSERT_MSG( needle != NULL, _T("NULL argument in wxStrstr") ); + + // VZ: this is not exactly the most efficient string search algorithm... + + const size_t len = wxStrlen(needle); + + while ( const wxChar *fnd = wxStrchr(haystack, *needle) ) + { + if ( !wxStrncmp(fnd, needle, len) ) + return fnd; + + haystack = fnd + 1; + } + + return NULL; +} + +#ifdef __cplusplus +} +#endif + +WXDLLEXPORT double wxStrtod(const wxChar *nptr, wxChar **endptr) +{ + const wxChar *start = nptr; + + // FIXME: only correct for C locale + while (wxIsspace(*nptr)) nptr++; + if (*nptr == wxT('+') || *nptr == wxT('-')) nptr++; + while (wxIsdigit(*nptr)) nptr++; + if (*nptr == wxT('.')) { + nptr++; + while (wxIsdigit(*nptr)) nptr++; + } + if (*nptr == wxT('E') || *nptr == wxT('e')) { + nptr++; + if (*nptr == wxT('+') || *nptr == wxT('-')) nptr++; + while (wxIsdigit(*nptr)) nptr++; + } + + wxString data(start, nptr-start); + wxWX2MBbuf dat = data.mb_str(wxConvLibc); + char *rdat = wxMBSTRINGCAST dat; + double ret = strtod(dat, &rdat); + + if (endptr) *endptr = (wxChar *)(start + (rdat - (const char *)dat)); + + return ret; +} + +WXDLLEXPORT long int wxStrtol(const wxChar *nptr, wxChar **endptr, int base) +{ + const wxChar *start = nptr; + + // FIXME: only correct for C locale + while (wxIsspace(*nptr)) nptr++; + if (*nptr == wxT('+') || *nptr == wxT('-')) nptr++; + if (((base == 0) || (base == 16)) && + (nptr[0] == wxT('0') && nptr[1] == wxT('x'))) { + nptr += 2; + base = 16; + } + else if ((base == 0) && (nptr[0] == wxT('0'))) base = 8; + else if (base == 0) base = 10; + + while ((wxIsdigit(*nptr) && (*nptr - wxT('0') < base)) || + (wxIsalpha(*nptr) && (wxToupper(*nptr) - wxT('A') + 10 < base))) nptr++; + + wxString data(start, nptr-start); + wxWX2MBbuf dat = data.mb_str(wxConvLibc); + char *rdat = wxMBSTRINGCAST dat; + long int ret = strtol(dat, &rdat, base); + + if (endptr) *endptr = (wxChar *)(start + (rdat - (const char *)dat)); + + return ret; +} + +WXDLLEXPORT unsigned long int wxStrtoul(const wxChar *nptr, wxChar **endptr, int base) +{ + return (unsigned long int) wxStrtol(nptr, endptr, base); +} + +#endif // wxNEED_WX_STRING_H + +#ifdef wxNEED_WX_STDIO_H +WXDLLEXPORT FILE * wxFopen(const wxChar *path, const wxChar *mode) +{ + char mode_buffer[10]; + for (size_t i = 0; i < wxStrlen(mode)+1; i++) + mode_buffer[i] = (char) mode[i]; + + return fopen( wxConvFile.cWX2MB(path), mode_buffer ); +} + +WXDLLEXPORT FILE * wxFreopen(const wxChar *path, const wxChar *mode, FILE *stream) +{ + char mode_buffer[10]; + for (size_t i = 0; i < wxStrlen(mode)+1; i++) + mode_buffer[i] = (char) mode[i]; + + return freopen( wxConvFile.cWX2MB(path), mode_buffer, stream ); +} + +WXDLLEXPORT int wxRemove(const wxChar *path) +{ + return remove( wxConvFile.cWX2MB(path) ); +} + +WXDLLEXPORT int wxRename(const wxChar *oldpath, const wxChar *newpath) +{ + return rename( wxConvFile.cWX2MB(oldpath), wxConvFile.cWX2MB(newpath) ); +} +#endif + +#ifndef wxAtof +double WXDLLEXPORT wxAtof(const wxChar *psz) +{ +#ifdef __WXWINCE__ + double d; + wxString str(psz); + if (str.ToDouble(& d)) + return d; + + return 0.0; +#else + return atof(wxConvLibc.cWX2MB(psz)); +#endif +} +#endif + +#ifdef wxNEED_WX_STDLIB_H +int WXDLLEXPORT wxAtoi(const wxChar *psz) +{ + return atoi(wxConvLibc.cWX2MB(psz)); +} + +long WXDLLEXPORT wxAtol(const wxChar *psz) +{ + return atol(wxConvLibc.cWX2MB(psz)); +} + +wxChar * WXDLLEXPORT wxGetenv(const wxChar *name) +{ +#if wxUSE_UNICODE + // NB: buffer returned by getenv() is allowed to be overwritten next + // time getenv() is called, so it is OK to use static string + // buffer to hold the data. + static wxWCharBuffer value((wxChar*)NULL); + value = wxConvLibc.cMB2WX(getenv(wxConvLibc.cWX2MB(name))); + return value.data(); +#else + return getenv(name); +#endif +} +#endif // wxNEED_WX_STDLIB_H + +#ifdef wxNEED_WXSYSTEM +int WXDLLEXPORT wxSystem(const wxChar *psz) +{ + return system(wxConvLibc.cWX2MB(psz)); +} +#endif // wxNEED_WXSYSTEM + +#ifdef wxNEED_WX_TIME_H +WXDLLEXPORT size_t +wxStrftime(wxChar *s, size_t maxsize, const wxChar *fmt, const struct tm *tm) +{ + if ( !maxsize ) + return 0; + + wxCharBuffer buf(maxsize); + + wxCharBuffer bufFmt(wxConvLibc.cWX2MB(fmt)); + if ( !bufFmt ) + return 0; + + size_t ret = strftime(buf.data(), maxsize, bufFmt, tm); + if ( !ret ) + return 0; + + wxWCharBuffer wbuf = wxConvLibc.cMB2WX(buf); + if ( !wbuf ) + return 0; + + wxStrncpy(s, wbuf, maxsize); + return wxStrlen(s); +} +#endif // wxNEED_WX_TIME_H + +#ifndef wxCtime +WXDLLEXPORT wxChar *wxCtime(const time_t *timep) +{ + // normally the string is 26 chars but give one more in case some broken + // DOS compiler decides to use "\r\n" instead of "\n" at the end + static wxChar buf[27]; + + // ctime() is guaranteed to return a string containing only ASCII + // characters, as its format is always the same for any locale + wxStrncpy(buf, wxString::FromAscii(ctime(timep)), WXSIZEOF(buf)); + buf[WXSIZEOF(buf) - 1] = _T('\0'); + + return buf; +} +#endif // wxCtime + +#endif // wxUSE_WCHAR_T + +// ---------------------------------------------------------------------------- +// functions which we may need even if !wxUSE_WCHAR_T +// ---------------------------------------------------------------------------- + +#ifndef wxStrtok + +WXDLLEXPORT wxChar * wxStrtok(wxChar *psz, const wxChar *delim, wxChar **save_ptr) +{ + if (!psz) + { + psz = *save_ptr; + if ( !psz ) + return NULL; + } + + psz += wxStrspn(psz, delim); + if (!*psz) + { + *save_ptr = (wxChar *)NULL; + return (wxChar *)NULL; + } + + wxChar *ret = psz; + psz = wxStrpbrk(psz, delim); + if (!psz) + { + *save_ptr = (wxChar*)NULL; + } + else + { + *psz = wxT('\0'); + *save_ptr = psz + 1; + } + + return ret; +} + +#endif // wxStrtok + +// ---------------------------------------------------------------------------- +// missing C RTL functions +// ---------------------------------------------------------------------------- + +#ifdef wxNEED_STRDUP + +char *strdup(const char *s) +{ + char *dest = (char*) malloc( strlen( s ) + 1 ) ; + if ( dest ) + strcpy( dest , s ) ; + return dest ; +} +#endif // wxNEED_STRDUP + +#if defined(__WXWINCE__) && (_WIN32_WCE <= 211) + +void *calloc( size_t num, size_t size ) +{ + void** ptr = (void **)malloc(num * size); + memset( ptr, 0, num * size); + return ptr; +} + +#endif // __WXWINCE__ <= 211 + +#ifdef __WXWINCE__ + +int wxRemove(const wxChar *path) +{ + return ::DeleteFile(path) == 0; +} + +#endif diff --git a/Externals/wxWidgets/src/common/xpmdecod.cpp b/Externals/wxWidgets/src/common/xpmdecod.cpp new file mode 100644 index 0000000000..813fbf017f --- /dev/null +++ b/Externals/wxWidgets/src/common/xpmdecod.cpp @@ -0,0 +1,814 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/xpmdecod.cpp +// Purpose: wxXPMDecoder +// Author: John Cristy, Vaclav Slavik +// RCS-ID: $Id: xpmdecod.cpp 41689 2006-10-08 08:04:49Z PC $ +// Copyright: (c) John Cristy, Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +/* + +This file is partially based on source code of ImageMagick by John Cristy. Its +license is as follows: + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % +% X X PPPP M M % +% X X P P MM MM % +% X PPPP M M M % +% X X P M M % +% X X P M M % +% % +% % +% Read/Write ImageMagick Image Format. % +% % +% % +% Software Design % +% John Cristy % +% July 1992 % +% % +% % +% Copyright (C) 2001 ImageMagick Studio, a non-profit organization dedicated % +% to making software imaging solutions freely available. % +% % +% Permission is hereby granted, free of charge, to any person obtaining a % +% copy of this software and associated documentation files ("ImageMagick"), % +% to deal in ImageMagick without restriction, including without limitation % +% the rights to use, copy, modify, merge, publish, distribute, sublicense, % +% and/or sell copies of ImageMagick, and to permit persons to whom the % +% ImageMagick is furnished to do so, subject to the following conditions: % +% % +% The above copyright notice and this permission notice shall be included in % +% all copies or substantial portions of ImageMagick. % +% % +% 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 % +% ImageMagick Studio 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 ImageMagick or the use or other dealings in % +% ImageMagick. % +% % +% Except as contained in this notice, the name of the ImageMagick Studio % +% shall not be used in advertising or otherwise to promote the sale, use or % +% other dealings in ImageMagick without prior written authorization from the % +% ImageMagick Studio. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +*/ + +/* + * Also contains some pieces from libxpm and its modification for win32 by + * HeDu : + * + * Copyright (C) 1989-95 GROUPE BULL + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * GROUPE BULL 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. + * + * Except as contained in this notice, the name of GROUPE BULL shall not be + * used in advertising or otherwise to promote the sale, use or other dealings + * in this Software without prior written authorization from GROUPE BULL. + */ + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_IMAGE && wxUSE_XPM + +#include "wx/xpmdecod.h" + +#ifndef WX_PRECOMP + #include "wx/intl.h" + #include "wx/log.h" + #include "wx/utils.h" + #include "wx/hashmap.h" + #include "wx/stream.h" + #include "wx/image.h" +#endif + +#include +#include + +#if wxUSE_STREAMS +bool wxXPMDecoder::CanRead(wxInputStream& stream) +{ + unsigned char buf[9]; + + if ( !stream.Read(buf, WXSIZEOF(buf)) ) + return false; + + stream.SeekI(-(wxFileOffset)WXSIZEOF(buf), wxFromCurrent); + + return memcmp(buf, "/* XPM */", WXSIZEOF(buf)) == 0; +} + +wxImage wxXPMDecoder::ReadFile(wxInputStream& stream) +{ + size_t length = stream.GetSize(); + wxCHECK_MSG( length != 0, wxNullImage, + wxT("Cannot read XPM from stream of unknown size") ); + + // use a smart buffer to be sure to free memory even when we return on + // error + wxCharBuffer buffer(length); + + char *xpm_buffer = (char *)buffer.data(); + if ( stream.Read(xpm_buffer, length).GetLastError() == wxSTREAM_READ_ERROR ) + return wxNullImage; + xpm_buffer[length] = '\0'; + + /* + * Remove comments from the file: + */ + char *p, *q; + for (p = xpm_buffer; *p != '\0'; p++) + { + if ( (*p == '"') || (*p == '\'') ) + { + if (*p == '"') + { + for (p++; *p != '\0'; p++) + if ( (*p == '"') && (*(p - 1) != '\\') ) + break; + } + else // *p == '\'' + { + for (p++; *p != '\0'; p++) + if ( (*p == '\'') && (*(p - 1) != '\\') ) + break; + } + if (*p == '\0') + break; + continue; + } + if ( (*p != '/') || (*(p + 1) != '*') ) + continue; + for (q = p + 2; *q != '\0'; q++) + { + if ( (*q == '*') && (*(q + 1) == '/') ) + break; + } + + // memmove allows overlaps (unlike strcpy): + size_t cpylen = strlen(q + 2) + 1; + memmove(p, q + 2, cpylen); + } + + /* + * Remove unquoted characters: + */ + size_t i = 0; + for (p = xpm_buffer; *p != '\0'; p++) + { + if ( *p != '"' ) + continue; + for (q = p + 1; *q != '\0'; q++) + if (*q == '"') + break; + strncpy(xpm_buffer + i, p + 1, q - p - 1); + i += q - p - 1; + xpm_buffer[i++] = '\n'; + p = q + 1; + } + xpm_buffer[i] = '\0'; + + /* + * Create array of lines and convert \n's to \0's: + */ + const char **xpm_lines; + size_t lines_cnt = 0; + size_t line; + + for (p = xpm_buffer; *p != '\0'; p++) + { + if ( *p == '\n' ) + lines_cnt++; + } + + if ( !lines_cnt ) + { + // this doesn't really look an XPM image + return wxNullImage; + } + + xpm_lines = new const char*[lines_cnt + 1]; + xpm_lines[0] = xpm_buffer; + line = 1; + for (p = xpm_buffer; (*p != '\0') && (line < lines_cnt); p++) + { + if ( *p == '\n' ) + { + xpm_lines[line] = p + 1; + *p = '\0'; + line++; + } + } + + xpm_lines[lines_cnt] = NULL; + + /* + * Read the image: + */ + wxImage img = ReadData(xpm_lines); + + delete[] xpm_lines; + + return img; +} +#endif // wxUSE_STREAMS + + +/*****************************************************************************\ +* rgbtab.h * +* * +* A hard coded rgb.txt. To keep it short I removed all colornames with * +* trailing numbers, Blue3 etc, except the GrayXX. Sorry Grey-lovers I prefer * +* Gray ;-). But Grey is recognized on lookups, only on save Gray will be * +* used, maybe you want to do some substitue there too. * +* * +* To save memory the RGBs are coded in one long value, as done by the RGB * +* macro. * +* * +* Developed by HeDu 3/94 (hedu@cul-ipn.uni-kiel.de) * +\*****************************************************************************/ + + +typedef struct +{ + const char *name; + wxUint32 rgb; +} rgbRecord; + +#define myRGB(r,g,b) ((wxUint32)r<<16|(wxUint32)g<<8|(wxUint32)b) + +static rgbRecord theRGBRecords[] = +{ + {"aliceblue", myRGB(240, 248, 255)}, + {"antiquewhite", myRGB(250, 235, 215)}, + {"aquamarine", myRGB(50, 191, 193)}, + {"azure", myRGB(240, 255, 255)}, + {"beige", myRGB(245, 245, 220)}, + {"bisque", myRGB(255, 228, 196)}, + {"black", myRGB(0, 0, 0)}, + {"blanchedalmond", myRGB(255, 235, 205)}, + {"blue", myRGB(0, 0, 255)}, + {"blueviolet", myRGB(138, 43, 226)}, + {"brown", myRGB(165, 42, 42)}, + {"burlywood", myRGB(222, 184, 135)}, + {"cadetblue", myRGB(95, 146, 158)}, + {"chartreuse", myRGB(127, 255, 0)}, + {"chocolate", myRGB(210, 105, 30)}, + {"coral", myRGB(255, 114, 86)}, + {"cornflowerblue", myRGB(34, 34, 152)}, + {"cornsilk", myRGB(255, 248, 220)}, + {"cyan", myRGB(0, 255, 255)}, + {"darkgoldenrod", myRGB(184, 134, 11)}, + {"darkgreen", myRGB(0, 86, 45)}, + {"darkkhaki", myRGB(189, 183, 107)}, + {"darkolivegreen", myRGB(85, 86, 47)}, + {"darkorange", myRGB(255, 140, 0)}, + {"darkorchid", myRGB(139, 32, 139)}, + {"darksalmon", myRGB(233, 150, 122)}, + {"darkseagreen", myRGB(143, 188, 143)}, + {"darkslateblue", myRGB(56, 75, 102)}, + {"darkslategray", myRGB(47, 79, 79)}, + {"darkturquoise", myRGB(0, 166, 166)}, + {"darkviolet", myRGB(148, 0, 211)}, + {"deeppink", myRGB(255, 20, 147)}, + {"deepskyblue", myRGB(0, 191, 255)}, + {"dimgray", myRGB(84, 84, 84)}, + {"dodgerblue", myRGB(30, 144, 255)}, + {"firebrick", myRGB(142, 35, 35)}, + {"floralwhite", myRGB(255, 250, 240)}, + {"forestgreen", myRGB(80, 159, 105)}, + {"gainsboro", myRGB(220, 220, 220)}, + {"ghostwhite", myRGB(248, 248, 255)}, + {"gold", myRGB(218, 170, 0)}, + {"goldenrod", myRGB(239, 223, 132)}, + {"gray", myRGB(126, 126, 126)}, + {"gray0", myRGB(0, 0, 0)}, + {"gray1", myRGB(3, 3, 3)}, + {"gray10", myRGB(26, 26, 26)}, + {"gray100", myRGB(255, 255, 255)}, + {"gray11", myRGB(28, 28, 28)}, + {"gray12", myRGB(31, 31, 31)}, + {"gray13", myRGB(33, 33, 33)}, + {"gray14", myRGB(36, 36, 36)}, + {"gray15", myRGB(38, 38, 38)}, + {"gray16", myRGB(41, 41, 41)}, + {"gray17", myRGB(43, 43, 43)}, + {"gray18", myRGB(46, 46, 46)}, + {"gray19", myRGB(48, 48, 48)}, + {"gray2", myRGB(5, 5, 5)}, + {"gray20", myRGB(51, 51, 51)}, + {"gray21", myRGB(54, 54, 54)}, + {"gray22", myRGB(56, 56, 56)}, + {"gray23", myRGB(59, 59, 59)}, + {"gray24", myRGB(61, 61, 61)}, + {"gray25", myRGB(64, 64, 64)}, + {"gray26", myRGB(66, 66, 66)}, + {"gray27", myRGB(69, 69, 69)}, + {"gray28", myRGB(71, 71, 71)}, + {"gray29", myRGB(74, 74, 74)}, + {"gray3", myRGB(8, 8, 8)}, + {"gray30", myRGB(77, 77, 77)}, + {"gray31", myRGB(79, 79, 79)}, + {"gray32", myRGB(82, 82, 82)}, + {"gray33", myRGB(84, 84, 84)}, + {"gray34", myRGB(87, 87, 87)}, + {"gray35", myRGB(89, 89, 89)}, + {"gray36", myRGB(92, 92, 92)}, + {"gray37", myRGB(94, 94, 94)}, + {"gray38", myRGB(97, 97, 97)}, + {"gray39", myRGB(99, 99, 99)}, + {"gray4", myRGB(10, 10, 10)}, + {"gray40", myRGB(102, 102, 102)}, + {"gray41", myRGB(105, 105, 105)}, + {"gray42", myRGB(107, 107, 107)}, + {"gray43", myRGB(110, 110, 110)}, + {"gray44", myRGB(112, 112, 112)}, + {"gray45", myRGB(115, 115, 115)}, + {"gray46", myRGB(117, 117, 117)}, + {"gray47", myRGB(120, 120, 120)}, + {"gray48", myRGB(122, 122, 122)}, + {"gray49", myRGB(125, 125, 125)}, + {"gray5", myRGB(13, 13, 13)}, + {"gray50", myRGB(127, 127, 127)}, + {"gray51", myRGB(130, 130, 130)}, + {"gray52", myRGB(133, 133, 133)}, + {"gray53", myRGB(135, 135, 135)}, + {"gray54", myRGB(138, 138, 138)}, + {"gray55", myRGB(140, 140, 140)}, + {"gray56", myRGB(143, 143, 143)}, + {"gray57", myRGB(145, 145, 145)}, + {"gray58", myRGB(148, 148, 148)}, + {"gray59", myRGB(150, 150, 150)}, + {"gray6", myRGB(15, 15, 15)}, + {"gray60", myRGB(153, 153, 153)}, + {"gray61", myRGB(156, 156, 156)}, + {"gray62", myRGB(158, 158, 158)}, + {"gray63", myRGB(161, 161, 161)}, + {"gray64", myRGB(163, 163, 163)}, + {"gray65", myRGB(166, 166, 166)}, + {"gray66", myRGB(168, 168, 168)}, + {"gray67", myRGB(171, 171, 171)}, + {"gray68", myRGB(173, 173, 173)}, + {"gray69", myRGB(176, 176, 176)}, + {"gray7", myRGB(18, 18, 18)}, + {"gray70", myRGB(179, 179, 179)}, + {"gray71", myRGB(181, 181, 181)}, + {"gray72", myRGB(184, 184, 184)}, + {"gray73", myRGB(186, 186, 186)}, + {"gray74", myRGB(189, 189, 189)}, + {"gray75", myRGB(191, 191, 191)}, + {"gray76", myRGB(194, 194, 194)}, + {"gray77", myRGB(196, 196, 196)}, + {"gray78", myRGB(199, 199, 199)}, + {"gray79", myRGB(201, 201, 201)}, + {"gray8", myRGB(20, 20, 20)}, + {"gray80", myRGB(204, 204, 204)}, + {"gray81", myRGB(207, 207, 207)}, + {"gray82", myRGB(209, 209, 209)}, + {"gray83", myRGB(212, 212, 212)}, + {"gray84", myRGB(214, 214, 214)}, + {"gray85", myRGB(217, 217, 217)}, + {"gray86", myRGB(219, 219, 219)}, + {"gray87", myRGB(222, 222, 222)}, + {"gray88", myRGB(224, 224, 224)}, + {"gray89", myRGB(227, 227, 227)}, + {"gray9", myRGB(23, 23, 23)}, + {"gray90", myRGB(229, 229, 229)}, + {"gray91", myRGB(232, 232, 232)}, + {"gray92", myRGB(235, 235, 235)}, + {"gray93", myRGB(237, 237, 237)}, + {"gray94", myRGB(240, 240, 240)}, + {"gray95", myRGB(242, 242, 242)}, + {"gray96", myRGB(245, 245, 245)}, + {"gray97", myRGB(247, 247, 247)}, + {"gray98", myRGB(250, 250, 250)}, + {"gray99", myRGB(252, 252, 252)}, + {"green", myRGB(0, 255, 0)}, + {"greenyellow", myRGB(173, 255, 47)}, + {"honeydew", myRGB(240, 255, 240)}, + {"hotpink", myRGB(255, 105, 180)}, + {"indianred", myRGB(107, 57, 57)}, + {"ivory", myRGB(255, 255, 240)}, + {"khaki", myRGB(179, 179, 126)}, + {"lavender", myRGB(230, 230, 250)}, + {"lavenderblush", myRGB(255, 240, 245)}, + {"lawngreen", myRGB(124, 252, 0)}, + {"lemonchiffon", myRGB(255, 250, 205)}, + {"lightblue", myRGB(176, 226, 255)}, + {"lightcoral", myRGB(240, 128, 128)}, + {"lightcyan", myRGB(224, 255, 255)}, + {"lightgoldenrod", myRGB(238, 221, 130)}, + {"lightgoldenrodyellow", myRGB(250, 250, 210)}, + {"lightgray", myRGB(168, 168, 168)}, + {"lightpink", myRGB(255, 182, 193)}, + {"lightsalmon", myRGB(255, 160, 122)}, + {"lightseagreen", myRGB(32, 178, 170)}, + {"lightskyblue", myRGB(135, 206, 250)}, + {"lightslateblue", myRGB(132, 112, 255)}, + {"lightslategray", myRGB(119, 136, 153)}, + {"lightsteelblue", myRGB(124, 152, 211)}, + {"lightyellow", myRGB(255, 255, 224)}, + {"limegreen", myRGB(0, 175, 20)}, + {"linen", myRGB(250, 240, 230)}, + {"magenta", myRGB(255, 0, 255)}, + {"maroon", myRGB(143, 0, 82)}, + {"mediumaquamarine", myRGB(0, 147, 143)}, + {"mediumblue", myRGB(50, 50, 204)}, + {"mediumforestgreen", myRGB(50, 129, 75)}, + {"mediumgoldenrod", myRGB(209, 193, 102)}, + {"mediumorchid", myRGB(189, 82, 189)}, + {"mediumpurple", myRGB(147, 112, 219)}, + {"mediumseagreen", myRGB(52, 119, 102)}, + {"mediumslateblue", myRGB(106, 106, 141)}, + {"mediumspringgreen", myRGB(35, 142, 35)}, + {"mediumturquoise", myRGB(0, 210, 210)}, + {"mediumvioletred", myRGB(213, 32, 121)}, + {"midnightblue", myRGB(47, 47, 100)}, + {"mintcream", myRGB(245, 255, 250)}, + {"mistyrose", myRGB(255, 228, 225)}, + {"moccasin", myRGB(255, 228, 181)}, + {"navajowhite", myRGB(255, 222, 173)}, + {"navy", myRGB(35, 35, 117)}, + {"navyblue", myRGB(35, 35, 117)}, + {"oldlace", myRGB(253, 245, 230)}, + {"olivedrab", myRGB(107, 142, 35)}, + {"orange", myRGB(255, 135, 0)}, + {"orangered", myRGB(255, 69, 0)}, + {"orchid", myRGB(239, 132, 239)}, + {"palegoldenrod", myRGB(238, 232, 170)}, + {"palegreen", myRGB(115, 222, 120)}, + {"paleturquoise", myRGB(175, 238, 238)}, + {"palevioletred", myRGB(219, 112, 147)}, + {"papayawhip", myRGB(255, 239, 213)}, + {"peachpuff", myRGB(255, 218, 185)}, + {"peru", myRGB(205, 133, 63)}, + {"pink", myRGB(255, 181, 197)}, + {"plum", myRGB(197, 72, 155)}, + {"powderblue", myRGB(176, 224, 230)}, + {"purple", myRGB(160, 32, 240)}, + {"red", myRGB(255, 0, 0)}, + {"rosybrown", myRGB(188, 143, 143)}, + {"royalblue", myRGB(65, 105, 225)}, + {"saddlebrown", myRGB(139, 69, 19)}, + {"salmon", myRGB(233, 150, 122)}, + {"sandybrown", myRGB(244, 164, 96)}, + {"seagreen", myRGB(82, 149, 132)}, + {"seashell", myRGB(255, 245, 238)}, + {"sienna", myRGB(150, 82, 45)}, + {"silver", myRGB(192, 192, 192)}, + {"skyblue", myRGB(114, 159, 255)}, + {"slateblue", myRGB(126, 136, 171)}, + {"slategray", myRGB(112, 128, 144)}, + {"snow", myRGB(255, 250, 250)}, + {"springgreen", myRGB(65, 172, 65)}, + {"steelblue", myRGB(84, 112, 170)}, + {"tan", myRGB(222, 184, 135)}, + {"thistle", myRGB(216, 191, 216)}, + {"tomato", myRGB(255, 99, 71)}, + {"transparent", myRGB(0, 0, 1)}, + {"turquoise", myRGB(25, 204, 223)}, + {"violet", myRGB(156, 62, 206)}, + {"violetred", myRGB(243, 62, 150)}, + {"wheat", myRGB(245, 222, 179)}, + {"white", myRGB(255, 255, 255)}, + {"whitesmoke", myRGB(245, 245, 245)}, + {"yellow", myRGB(255, 255, 0)}, + {"yellowgreen", myRGB(50, 216, 56)}, + {NULL, myRGB(0, 0, 0)} +}; +static int numTheRGBRecords = 235; + +static unsigned char ParseHexadecimal(char digit1, char digit2) +{ + unsigned char i1, i2; + + if (digit1 >= 'a') + i1 = (unsigned char)(digit1 - 'a' + 0x0A); + else if (digit1 >= 'A') + i1 = (unsigned char)(digit1 - 'A' + 0x0A); + else + i1 = (unsigned char)(digit1 - '0'); + if (digit2 >= 'a') + i2 = (unsigned char)(digit2 - 'a' + 0x0A); + else if (digit2 >= 'A') + i2 = (unsigned char)(digit2 - 'A' + 0x0A); + else + i2 = (unsigned char)(digit2 - '0'); + return (unsigned char)(0x10 * i1 + i2); +} + +static bool GetRGBFromName(const char *inname, bool *isNone, + unsigned char *r, unsigned char*g, unsigned char *b) +{ + int left, right, middle; + int cmp; + wxUint32 rgbVal; + char *name; + char *grey, *p; + + // Neither #rrggbb nor #rrrrggggbbbb are in database, we parse them directly + size_t inname_len = strlen(inname); + if ( *inname == '#' && (inname_len == 7 || inname_len == 13)) + { + size_t ofs = (inname_len == 7) ? 2 : 4; + *r = ParseHexadecimal(inname[1], inname[2]); + *g = ParseHexadecimal(inname[1*ofs+1], inname[1*ofs+2]); + *b = ParseHexadecimal(inname[2*ofs+1], inname[2*ofs+2]); + *isNone = false; + return true; + } + + name = wxStrdupA(inname); + + // theRGBRecords[] has no names with spaces, and no grey, but a + // lot of gray... + + // so first extract ' ' + while ((p = strchr(name, ' ')) != NULL) + { + while (*(p)) // till eof of string + { + *p = *(p + 1); // copy to the left + p++; + } + } + // fold to lower case + p = name; + while (*p) + { + *p = (char)tolower(*p); + p++; + } + + // substitute Grey with Gray, else rgbtab.h would have more than 100 + // 'duplicate' entries + if ( (grey = strstr(name, "grey")) != NULL ) + grey[2] = 'a'; + + // check for special 'none' colour: + bool found; + if ( strcmp(name, "none") == 0 ) + { + *isNone = true; + found = true; + } + else // not "None" + { + found = false; + + // binary search: + left = 0; + right = numTheRGBRecords - 1; + do + { + middle = (left + right) / 2; + cmp = strcmp(name, theRGBRecords[middle].name); + if ( cmp == 0 ) + { + rgbVal = theRGBRecords[middle].rgb; + *r = (unsigned char)((rgbVal >> 16) & 0xFF); + *g = (unsigned char)((rgbVal >> 8) & 0xFF); + *b = (unsigned char)((rgbVal) & 0xFF); + *isNone = false; + found = true; + break; + } + else if ( cmp < 0 ) + { + right = middle - 1; + } + else // cmp > 0 + { + left = middle + 1; + } + } while (left <= right); + } + + free(name); + + return found; +} + +static const char *ParseColor(const char *data) +{ + static const char *targets[] = + {"c ", "g ", "g4 ", "m ", "b ", "s ", NULL}; + + const char *p, *r; + const char *q; + int i; + + for (i = 0; targets[i] != NULL; i++) + { + r = data; + for (q = targets[i]; *r != '\0'; r++) + { + if ( *r != *q ) + continue; + if ( !isspace((int) (*(r - 1))) ) + continue; + p = r; + for (;;) + { + if ( *q == '\0' ) + return p; + if ( *p++ != *q++ ) + break; + } + q = targets[i]; + } + } + return NULL; +} + +struct wxXPMColourMapData +{ + wxXPMColourMapData() { R = G = B = 0; } + unsigned char R,G,B; +}; +WX_DECLARE_STRING_HASH_MAP(wxXPMColourMapData, wxXPMColourMap); + +wxImage wxXPMDecoder::ReadData(const char* const* xpm_data) +{ + wxCHECK_MSG(xpm_data, wxNullImage, wxT("NULL XPM data") ); + + wxImage img; + int count; + unsigned width, height, colors_cnt, chars_per_pixel; + size_t i, j, i_key; + wxChar key[64]; + const char *clr_def; + bool hasMask; + wxXPMColourMap clr_tbl; + wxXPMColourMap::iterator it; + wxString maskKey; + + /* + * Read hints and initialize structures: + */ + + count = sscanf(xpm_data[0], "%u %u %u %u", + &width, &height, &colors_cnt, &chars_per_pixel); + if ( count != 4 || width * height * colors_cnt == 0 ) + { + wxLogError(_("XPM: incorrect header format!")); + return wxNullImage; + } + + // VS: XPM color map this large would be insane, since XPMs are encoded with + // 92 possible values on each position, 92^64 is *way* larger space than + // 8bit RGB... + wxCHECK_MSG(chars_per_pixel < 64, wxNullImage, wxT("XPM colormaps this large not supported.")); + + if ( !img.Create(width, height) ) + return wxNullImage; + + img.SetMask(false); + key[chars_per_pixel] = wxT('\0'); + hasMask = false; + + /* + * Create colour map: + */ + wxXPMColourMapData clr_data; + for (i = 0; i < colors_cnt; i++) + { + const char *xmpColLine = xpm_data[1 + i]; + + // we must have at least " x y" after the colour index, hence +5 + if ( !xmpColLine || strlen(xmpColLine) < chars_per_pixel + 5 ) + { + wxLogError(_("XPM: incorrect colour description in line %d"), + (int)(1 + i)); + return wxNullImage; + } + + for (i_key = 0; i_key < chars_per_pixel; i_key++) + key[i_key] = (wxChar)xmpColLine[i_key]; + clr_def = ParseColor(xmpColLine + chars_per_pixel); + + if ( clr_def == NULL ) + { + wxLogError(_("XPM: malformed colour definition '%s' at line %d!"), + xmpColLine, (int)(1 + i)); + return wxNullImage; + } + + bool isNone = false; + if ( !GetRGBFromName(clr_def, &isNone, + &clr_data.R, &clr_data.G, &clr_data.B) ) + { + wxLogError(_("XPM: malformed colour definition '%s' at line %d!"), + xmpColLine, (int)(1 + i)); + return wxNullImage; + } + + if ( isNone ) + { + img.SetMask(true); + img.SetMaskColour(255, 0, 255); + clr_data.R = + clr_data.B = 255; + clr_data.G = 0; + hasMask = true; + maskKey = key; + } + + clr_tbl[key] = clr_data; + } + + /* + * Modify colour entries with RGB = (255,0,255) to (255,0,254) if + * mask colour is present (so that existing pixels with (255,0,255) + * magenta colour are not incorrectly made transparent): + */ + if (hasMask) + { + for (it = clr_tbl.begin(); it != clr_tbl.end(); ++it) + { + if (it->second.R == 255 && it->second.G == 0 && + it->second.B == 255 && + it->first != maskKey) + { + it->second.B = 254; + } + } + } + + /* + * Parse image data: + */ + + unsigned char *img_data = img.GetData(); + wxXPMColourMap::iterator entry; + wxXPMColourMap::iterator end = clr_tbl.end(); + + for (j = 0; j < height; j++) + { + for (i = 0; i < width; i++, img_data += 3) + { + const char *xpmImgLine = xpm_data[1 + colors_cnt + j]; + if ( !xpmImgLine || strlen(xpmImgLine) < width*chars_per_pixel ) + { + wxLogError(_("XPM: truncated image data at line %d!"), + (int)(1 + colors_cnt + j)); + return wxNullImage; + } + + for (i_key = 0; i_key < chars_per_pixel; i_key++) + { + key[i_key] = (wxChar)xpmImgLine[chars_per_pixel * i + i_key]; + } + + entry = clr_tbl.find(key); + if ( entry == end ) + { + wxLogError(_("XPM: Malformed pixel data!")); + + // better return right now as otherwise we risk to flood the + // user with error messages as something seems to be seriously + // wrong with the file and so we could give this message for + // each remaining pixel if we don't bail out + return wxNullImage; + } + else + { + img_data[0] = entry->second.R; + img_data[1] = entry->second.G; + img_data[2] = entry->second.B; + } + } + } + + return img; +} + +#endif // wxUSE_IMAGE && wxUSE_XPM diff --git a/Externals/wxWidgets/src/common/xti.cpp b/Externals/wxWidgets/src/common/xti.cpp new file mode 100644 index 0000000000..adbbd07bf3 --- /dev/null +++ b/Externals/wxWidgets/src/common/xti.cpp @@ -0,0 +1,767 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/xti.cpp +// Purpose: runtime metadata information (extended class info +// Author: Stefan Csomor +// Modified by: +// Created: 27/07/03 +// RCS-ID: $Id: xti.cpp 38857 2006-04-20 07:31:44Z ABX $ +// Copyright: (c) 1997 Julian Smart +// (c) 2003 Stefan Csomor +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_EXTENDED_RTTI + +#ifndef WX_PRECOMP + #include "wx/object.h" + #include "wx/list.h" + #include "wx/hash.h" +#endif + +#include "wx/xti.h" +#include "wx/xml/xml.h" +#include "wx/tokenzr.h" +#include + +#include "wx/beforestd.h" +#include +#include +#include +#include "wx/afterstd.h" + +using namespace std ; + +// ---------------------------------------------------------------------------- +// Enum Support +// ---------------------------------------------------------------------------- + +wxEnumData::wxEnumData( wxEnumMemberData* data ) +{ + m_members = data ; + for ( m_count = 0; m_members[m_count].m_name ; m_count++) + {} ; +} + +bool wxEnumData::HasEnumMemberValue(const wxChar *name, int *value) const +{ + int i; + for (i = 0; m_members[i].m_name ; i++ ) + { + if (!wxStrcmp(name, m_members[i].m_name)) + { + if ( value ) + *value = m_members[i].m_value; + return true ; + } + } + return false ; +} + +int wxEnumData::GetEnumMemberValue(const wxChar *name) const +{ + int i; + for (i = 0; m_members[i].m_name ; i++ ) + { + if (!wxStrcmp(name, m_members[i].m_name)) + { + return m_members[i].m_value; + } + } + return 0 ; +} + +const wxChar *wxEnumData::GetEnumMemberName(int value) const +{ + int i; + for (i = 0; m_members[i].m_name ; i++) + if (value == m_members[i].m_value) + return m_members[i].m_name; + + return wxEmptyString ; +} + +int wxEnumData::GetEnumMemberValueByIndex( int idx ) const +{ + // we should cache the count in order to avoid out-of-bounds errors + return m_members[idx].m_value ; +} + +const wxChar * wxEnumData::GetEnumMemberNameByIndex( int idx ) const +{ + // we should cache the count in order to avoid out-of-bounds errors + return m_members[idx].m_name ; +} + +// ---------------------------------------------------------------------------- +// Type Information +// ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- +// value streaming +// ---------------------------------------------------------------------------- + +// streamer specializations +// for all built-in types + +// bool + +template<> void wxStringReadValue(const wxString &s , bool &data ) +{ + int intdata ; + wxSscanf(s, _T("%d"), &intdata ) ; + data = (bool)intdata ; +} + +template<> void wxStringWriteValue(wxString &s , const bool &data ) +{ + s = wxString::Format(_T("%d"), data ) ; +} + +// char + +template<> void wxStringReadValue(const wxString &s , char &data ) +{ + int intdata ; + wxSscanf(s, _T("%d"), &intdata ) ; + data = char(intdata) ; +} + +template<> void wxStringWriteValue(wxString &s , const char &data ) +{ + s = wxString::Format(_T("%d"), data ) ; +} + +// unsigned char + +template<> void wxStringReadValue(const wxString &s , unsigned char &data ) +{ + int intdata ; + wxSscanf(s, _T("%d"), &intdata ) ; + data = (unsigned char)(intdata) ; +} + +template<> void wxStringWriteValue(wxString &s , const unsigned char &data ) +{ + s = wxString::Format(_T("%d"), data ) ; +} + +// int + +template<> void wxStringReadValue(const wxString &s , int &data ) +{ + wxSscanf(s, _T("%d"), &data ) ; +} + +template<> void wxStringWriteValue(wxString &s , const int &data ) +{ + s = wxString::Format(_T("%d"), data ) ; +} + +// unsigned int + +template<> void wxStringReadValue(const wxString &s , unsigned int &data ) +{ + wxSscanf(s, _T("%d"), &data ) ; +} + +template<> void wxStringWriteValue(wxString &s , const unsigned int &data ) +{ + s = wxString::Format(_T("%d"), data ) ; +} + +// long + +template<> void wxStringReadValue(const wxString &s , long &data ) +{ + wxSscanf(s, _T("%ld"), &data ) ; +} + +template<> void wxStringWriteValue(wxString &s , const long &data ) +{ + s = wxString::Format(_T("%ld"), data ) ; +} + +// unsigned long + +template<> void wxStringReadValue(const wxString &s , unsigned long &data ) +{ + wxSscanf(s, _T("%ld"), &data ) ; +} + +template<> void wxStringWriteValue(wxString &s , const unsigned long &data ) +{ + s = wxString::Format(_T("%ld"), data ) ; +} + +// float + +template<> void wxStringReadValue(const wxString &s , float &data ) +{ + wxSscanf(s, _T("%f"), &data ) ; +} + +template<> void wxStringWriteValue(wxString &s , const float &data ) +{ + s = wxString::Format(_T("%f"), data ) ; +} + +// double + +template<> void wxStringReadValue(const wxString &s , double &data ) +{ + wxSscanf(s, _T("%lf"), &data ) ; +} + +template<> void wxStringWriteValue(wxString &s , const double &data ) +{ + s = wxString::Format(_T("%lf"), data ) ; +} + +// wxString + +template<> void wxStringReadValue(const wxString &s , wxString &data ) +{ + data = s ; +} + +template<> void wxStringWriteValue(wxString &s , const wxString &data ) +{ + s = data ; +} + +// built-ins +// + +#if wxUSE_FUNC_TEMPLATE_POINTER +#define wxBUILTIN_TYPE_INFO( element , type ) \ + wxBuiltInTypeInfo s_typeInfo##type(element , &wxToStringConverter , &wxFromStringConverter , typeid(type).name()) ; +#else +#define wxBUILTIN_TYPE_INFO( element , type ) \ + void _toString##element( const wxxVariant& data , wxString &result ) { wxToStringConverter(data, result); } \ + void _fromString##element( const wxString& data , wxxVariant &result ) { wxFromStringConverter(data, result); } \ + wxBuiltInTypeInfo s_typeInfo##type(element , &_toString##element , &_fromString##element , typeid(type).name()) ; +#endif + +typedef unsigned char unsigned_char; +typedef unsigned int unsigned_int; +typedef unsigned long unsigned_long; + +wxBuiltInTypeInfo s_typeInfovoid( wxT_VOID , NULL , NULL , typeid(void).name()); +wxBUILTIN_TYPE_INFO( wxT_BOOL , bool); +wxBUILTIN_TYPE_INFO( wxT_CHAR , char); +wxBUILTIN_TYPE_INFO( wxT_UCHAR , unsigned_char); +wxBUILTIN_TYPE_INFO( wxT_INT , int); +wxBUILTIN_TYPE_INFO( wxT_UINT , unsigned_int); +wxBUILTIN_TYPE_INFO( wxT_LONG , long); +wxBUILTIN_TYPE_INFO( wxT_ULONG , unsigned_long); +wxBUILTIN_TYPE_INFO( wxT_FLOAT , float); +wxBUILTIN_TYPE_INFO( wxT_DOUBLE , double); +wxBUILTIN_TYPE_INFO( wxT_STRING , wxString); + + +// this are compiler induced specialization which are never used anywhere + +wxILLEGAL_TYPE_SPECIALIZATION( char const * ) +wxILLEGAL_TYPE_SPECIALIZATION( char * ) +wxILLEGAL_TYPE_SPECIALIZATION( unsigned char * ) +wxILLEGAL_TYPE_SPECIALIZATION( int * ) +wxILLEGAL_TYPE_SPECIALIZATION( bool * ) +wxILLEGAL_TYPE_SPECIALIZATION( long * ) +wxILLEGAL_TYPE_SPECIALIZATION( wxString * ) + +wxCOLLECTION_TYPE_INFO( wxString , wxArrayString ) ; + +template<> void wxCollectionToVariantArray( wxArrayString const &theArray, wxxVariantArray &value) +{ + wxArrayCollectionToVariantArray( theArray , value ) ; +} + +wxTypeInfoMap *wxTypeInfo::ms_typeTable = NULL ; + +wxTypeInfo *wxTypeInfo::FindType(const wxChar *typeName) +{ + wxTypeInfoMap::iterator iter = ms_typeTable->find(typeName) ; + wxASSERT_MSG( iter != ms_typeTable->end() , wxT("lookup for a non-existent type-info") ) ; + return (wxTypeInfo *)iter->second; +} + +#if wxUSE_UNICODE +wxClassTypeInfo::wxClassTypeInfo( wxTypeKind kind , wxClassInfo* classInfo , converterToString_t to , converterFromString_t from , const char *name) : +wxTypeInfo( kind , to , from , name) +{ wxASSERT_MSG( kind == wxT_OBJECT_PTR || kind == wxT_OBJECT , wxT("Illegal Kind for Enum Type")) ; m_classInfo = classInfo ;} +#endif + +wxClassTypeInfo::wxClassTypeInfo( wxTypeKind kind , wxClassInfo* classInfo , converterToString_t to , converterFromString_t from , const wxString &name) : +wxTypeInfo( kind , to , from , name) +{ wxASSERT_MSG( kind == wxT_OBJECT_PTR || kind == wxT_OBJECT , wxT("Illegal Kind for Enum Type")) ; m_classInfo = classInfo ;} + +wxDelegateTypeInfo::wxDelegateTypeInfo( int eventType , wxClassInfo* eventClass , converterToString_t to , converterFromString_t from ) : +wxTypeInfo ( wxT_DELEGATE , to , from , wxEmptyString ) +{ m_eventClass = eventClass ; m_eventType = eventType ; m_lastEventType = -1 ;} + +wxDelegateTypeInfo::wxDelegateTypeInfo( int eventType , int lastEventType , wxClassInfo* eventClass , converterToString_t to , converterFromString_t from ) : +wxTypeInfo ( wxT_DELEGATE , to , from , wxEmptyString ) +{ m_eventClass = eventClass ; m_eventType = eventType ; m_lastEventType = lastEventType; } + +void wxTypeInfo::Register() +{ + if ( ms_typeTable == NULL ) + ms_typeTable = new wxTypeInfoMap() ; + + if( !m_name.empty() ) + (*ms_typeTable)[m_name] = this ; +} + +void wxTypeInfo::Unregister() +{ + if( !m_name.empty() ) + ms_typeTable->erase(m_name); +} + +// removing header dependancy on string tokenizer + +void wxSetStringToArray( const wxString &s , wxArrayString &array ) +{ + wxStringTokenizer tokenizer(s, wxT("| \t\n"), wxTOKEN_STRTOK); + wxString flag; + array.Clear() ; + while (tokenizer.HasMoreTokens()) + { + array.Add(tokenizer.GetNextToken()) ; + } +} + +// ---------------------------------------------------------------------------- +// wxClassInfo +// ---------------------------------------------------------------------------- + +wxPropertyInfo::~wxPropertyInfo() +{ + if ( this == m_itsClass->m_firstProperty ) + { + m_itsClass->m_firstProperty = m_next; + } + else + { + wxPropertyInfo *info = m_itsClass->m_firstProperty; + while (info) + { + if ( info->m_next == this ) + { + info->m_next = m_next; + break; + } + + info = info->m_next; + } + } +} + +wxHandlerInfo::~wxHandlerInfo() +{ + if ( this == m_itsClass->m_firstHandler ) + { + m_itsClass->m_firstHandler = m_next; + } + else + { + wxHandlerInfo *info = m_itsClass->m_firstHandler; + while (info) + { + if ( info->m_next == this ) + { + info->m_next = m_next; + break; + } + + info = info->m_next; + } + } +} + +const wxPropertyAccessor *wxClassInfo::FindAccessor(const wxChar *PropertyName) const +{ + const wxPropertyInfo* info = FindPropertyInfo( PropertyName ) ; + + if ( info ) + return info->GetAccessor() ; + + return NULL ; +} + +wxPropertyInfo *wxClassInfo::FindPropertyInfoInThisClass (const wxChar *PropertyName) const +{ + wxPropertyInfo* info = m_firstProperty ; + + while( info ) + { + if ( wxStrcmp( info->GetName() , PropertyName ) == 0 ) + return info ; + info = info->GetNext() ; + } + + return 0; +} + +const wxPropertyInfo *wxClassInfo::FindPropertyInfo (const wxChar *PropertyName) const +{ + const wxPropertyInfo* info = FindPropertyInfoInThisClass( PropertyName ) ; + if ( info ) + return info ; + + const wxClassInfo** parents = GetParents() ; + for ( int i = 0 ; parents[i] ; ++ i ) + { + if ( ( info = parents[i]->FindPropertyInfo( PropertyName ) ) != NULL ) + return info ; + } + + return 0; +} + +wxHandlerInfo *wxClassInfo::FindHandlerInfoInThisClass (const wxChar *PropertyName) const +{ + wxHandlerInfo* info = m_firstHandler ; + + while( info ) + { + if ( wxStrcmp( info->GetName() , PropertyName ) == 0 ) + return info ; + info = info->GetNext() ; + } + + return 0; +} + +const wxHandlerInfo *wxClassInfo::FindHandlerInfo (const wxChar *PropertyName) const +{ + const wxHandlerInfo* info = FindHandlerInfoInThisClass( PropertyName ) ; + + if ( info ) + return info ; + + const wxClassInfo** parents = GetParents() ; + for ( int i = 0 ; parents[i] ; ++ i ) + { + if ( ( info = parents[i]->FindHandlerInfo( PropertyName ) ) != NULL ) + return info ; + } + + return 0; +} + +wxObjectStreamingCallback wxClassInfo::GetStreamingCallback() const +{ + if ( m_streamingCallback ) + return m_streamingCallback ; + + wxObjectStreamingCallback retval = NULL ; + const wxClassInfo** parents = GetParents() ; + for ( int i = 0 ; parents[i] && retval == NULL ; ++ i ) + { + retval = parents[i]->GetStreamingCallback() ; + } + return retval ; +} + +bool wxClassInfo::BeforeWriteObject( const wxObject *obj, wxWriter *streamer , wxPersister *persister , wxxVariantArray &metadata) const +{ + wxObjectStreamingCallback sb = GetStreamingCallback() ; + if ( sb ) + return (*sb)(obj , streamer , persister , metadata ) ; + + return true ; +} + +void wxClassInfo::SetProperty(wxObject *object, const wxChar *propertyName, const wxxVariant &value) const +{ + const wxPropertyAccessor *accessor; + + accessor = FindAccessor(propertyName); + wxASSERT(accessor->HasSetter()); + accessor->SetProperty( object , value ) ; +} + +wxxVariant wxClassInfo::GetProperty(wxObject *object, const wxChar *propertyName) const +{ + const wxPropertyAccessor *accessor; + + accessor = FindAccessor(propertyName); + wxASSERT(accessor->HasGetter()); + wxxVariant result ; + accessor->GetProperty(object,result); + return result ; +} + +wxxVariantArray wxClassInfo::GetPropertyCollection(wxObject *object, const wxChar *propertyName) const +{ + const wxPropertyAccessor *accessor; + + accessor = FindAccessor(propertyName); + wxASSERT(accessor->HasGetter()); + wxxVariantArray result ; + accessor->GetPropertyCollection(object,result); + return result ; +} + +void wxClassInfo::AddToPropertyCollection(wxObject *object, const wxChar *propertyName , const wxxVariant& value) const +{ + const wxPropertyAccessor *accessor; + + accessor = FindAccessor(propertyName); + wxASSERT(accessor->HasAdder()); + accessor->AddToPropertyCollection( object , value ) ; +} + +// void wxClassInfo::GetProperties( wxPropertyInfoMap &map ) const +// The map parameter (the name map that is) seems something special +// to MSVC and so we use a other name. +void wxClassInfo::GetProperties( wxPropertyInfoMap &infomap ) const +{ + const wxPropertyInfo *pi = GetFirstProperty() ; + while( pi ) + { + if ( infomap.find( pi->GetName() ) == infomap.end() ) + infomap[pi->GetName()] = (wxPropertyInfo*) pi ; + + pi = pi->GetNext() ; + } + + const wxClassInfo** parents = GetParents() ; + for ( int i = 0 ; parents[i] ; ++ i ) + { + parents[i]->GetProperties( infomap ) ; + } +} + +/* +VARIANT TO OBJECT +*/ + +wxObject* wxxVariant::GetAsObject() +{ + const wxClassTypeInfo *ti = dynamic_cast( m_data->GetTypeInfo() ) ; + if ( ti ) + return ti->GetClassInfo()->VariantToInstance(*this) ; + else + return NULL ; +} + +// ---------------------------------------------------------------------------- +// wxDynamicObject support +// ---------------------------------------------------------------------------- +// +// Dynamic Objects are objects that have a real superclass instance and carry their +// own attributes in a hash map. Like this it is possible to create the objects and +// stream them, as if their class information was already available from compiled data + +struct wxDynamicObject::wxDynamicObjectInternal +{ + wxDynamicObjectInternal() {} + +#if wxUSE_UNICODE + map m_properties ; +#else + map m_properties ; +#endif +} ; + +typedef list< wxDynamicObject* > wxDynamicObjectList ; + +struct wxDynamicClassInfo::wxDynamicClassInfoInternal +{ + wxDynamicObjectList m_dynamicObjects ; +} ; + +// instantiates this object with an instance of its superclass +wxDynamicObject::wxDynamicObject(wxObject* superClassInstance, const wxDynamicClassInfo *info) +{ + m_superClassInstance = superClassInstance ; + m_classInfo = info ; + m_data = new wxDynamicObjectInternal ; +} + +wxDynamicObject::~wxDynamicObject() +{ + dynamic_cast(m_classInfo)->m_data->m_dynamicObjects.remove( this ) ; + delete m_data ; + delete m_superClassInstance ; +} + +void wxDynamicObject::SetProperty (const wxChar *propertyName, const wxxVariant &value) +{ + wxASSERT_MSG(m_classInfo->FindPropertyInfoInThisClass(propertyName),wxT("Accessing Unknown Property in a Dynamic Object") ) ; + m_data->m_properties[propertyName] = value ; +} + +wxxVariant wxDynamicObject::GetProperty (const wxChar *propertyName) const +{ + wxASSERT_MSG(m_classInfo->FindPropertyInfoInThisClass(propertyName),wxT("Accessing Unknown Property in a Dynamic Object") ) ; + return m_data->m_properties[propertyName] ; +} + +void wxDynamicObject::RemoveProperty( const wxChar *propertyName ) +{ + wxASSERT_MSG(m_classInfo->FindPropertyInfoInThisClass(propertyName),wxT("Removing Unknown Property in a Dynamic Object") ) ; + m_data->m_properties.erase( propertyName ) ; +} + +void wxDynamicObject::RenameProperty( const wxChar *oldPropertyName , const wxChar *newPropertyName ) +{ + wxASSERT_MSG(m_classInfo->FindPropertyInfoInThisClass(oldPropertyName),wxT("Renaming Unknown Property in a Dynamic Object") ) ; + wxxVariant value = m_data->m_properties[oldPropertyName] ; + m_data->m_properties.erase( oldPropertyName ) ; + m_data->m_properties[newPropertyName] = value ; +} + + +// ---------------------------------------------------------------------------- +// wxDynamiClassInfo +// ---------------------------------------------------------------------------- + +wxDynamicClassInfo::wxDynamicClassInfo( const wxChar *unitName, const wxChar *className , const wxClassInfo* superClass ) : +wxClassInfo( unitName, className , new const wxClassInfo*[2]) +{ + GetParents()[0] = superClass ; + GetParents()[1] = NULL ; + m_data = new wxDynamicClassInfoInternal ; +} + +wxDynamicClassInfo::~wxDynamicClassInfo() +{ + delete[] GetParents() ; + delete m_data ; +} + +wxObject *wxDynamicClassInfo::AllocateObject() const +{ + wxObject* parent = GetParents()[0]->AllocateObject() ; + wxDynamicObject *obj = new wxDynamicObject( parent , this ) ; + m_data->m_dynamicObjects.push_back( obj ) ; + return obj ; +} + +void wxDynamicClassInfo::Create (wxObject *object, int paramCount, wxxVariant *params) const +{ + wxDynamicObject *dynobj = dynamic_cast< wxDynamicObject *>( object ) ; + wxASSERT_MSG( dynobj , wxT("cannot call wxDynamicClassInfo::Create on an object other than wxDynamicObject") ) ; + GetParents()[0]->Create( dynobj->GetSuperClassInstance() , paramCount , params ) ; +} + +// get number of parameters for constructor +int wxDynamicClassInfo::GetCreateParamCount() const +{ + return GetParents()[0]->GetCreateParamCount() ; +} + +// get i-th constructor parameter +const wxChar* wxDynamicClassInfo::GetCreateParamName(int i) const +{ + return GetParents()[0]->GetCreateParamName( i ) ; +} + +void wxDynamicClassInfo::SetProperty(wxObject *object, const wxChar *propertyName, const wxxVariant &value) const +{ + wxDynamicObject* dynobj = dynamic_cast< wxDynamicObject * >( object ) ; + wxASSERT_MSG( dynobj , wxT("cannot call wxDynamicClassInfo::SetProperty on an object other than wxDynamicObject") ) ; + if ( FindPropertyInfoInThisClass(propertyName) ) + dynobj->SetProperty( propertyName , value ) ; + else + GetParents()[0]->SetProperty( dynobj->GetSuperClassInstance() , propertyName , value ) ; +} + +wxxVariant wxDynamicClassInfo::GetProperty(wxObject *object, const wxChar *propertyName) const +{ + wxDynamicObject* dynobj = dynamic_cast< wxDynamicObject * >( object ) ; + wxASSERT_MSG( dynobj , wxT("cannot call wxDynamicClassInfo::SetProperty on an object other than wxDynamicObject") ) ; + if ( FindPropertyInfoInThisClass(propertyName) ) + return dynobj->GetProperty( propertyName ) ; + else + return GetParents()[0]->GetProperty( dynobj->GetSuperClassInstance() , propertyName ) ; +} + +void wxDynamicClassInfo::AddProperty( const wxChar *propertyName , const wxTypeInfo* typeInfo ) +{ + new wxPropertyInfo( m_firstProperty , this , propertyName , typeInfo->GetTypeName() , new wxGenericPropertyAccessor( propertyName ) , wxxVariant() ) ; +} + +void wxDynamicClassInfo::AddHandler( const wxChar *handlerName , wxObjectEventFunction address , const wxClassInfo* eventClassInfo ) +{ + new wxHandlerInfo( m_firstHandler , this , handlerName , address , eventClassInfo ) ; +} + +// removes an existing runtime-property +void wxDynamicClassInfo::RemoveProperty( const wxChar *propertyName ) +{ + for ( wxDynamicObjectList::iterator iter = m_data->m_dynamicObjects.begin() ; iter != m_data->m_dynamicObjects.end() ; ++iter ) + (*iter)->RemoveProperty( propertyName ) ; + delete FindPropertyInfoInThisClass(propertyName) ; +} + +// removes an existing runtime-handler +void wxDynamicClassInfo::RemoveHandler( const wxChar *handlerName ) +{ + delete FindHandlerInfoInThisClass(handlerName) ; +} + +// renames an existing runtime-property +void wxDynamicClassInfo::RenameProperty( const wxChar *oldPropertyName , const wxChar *newPropertyName ) +{ + wxPropertyInfo* pi = FindPropertyInfoInThisClass(oldPropertyName) ; + wxASSERT_MSG( pi ,wxT("not existing property") ) ; + pi->m_name = newPropertyName ; + dynamic_cast(pi->GetAccessor())->RenameProperty( oldPropertyName , newPropertyName ) ; + for ( wxDynamicObjectList::iterator iter = m_data->m_dynamicObjects.begin() ; iter != m_data->m_dynamicObjects.end() ; ++iter ) + (*iter)->RenameProperty( oldPropertyName , newPropertyName ) ; +} + +// renames an existing runtime-handler +void wxDynamicClassInfo::RenameHandler( const wxChar *oldHandlerName , const wxChar *newHandlerName ) +{ + wxASSERT_MSG(FindHandlerInfoInThisClass(oldHandlerName),wxT("not existing handler") ) ; + FindHandlerInfoInThisClass(oldHandlerName)->m_name = newHandlerName ; +} + +// ---------------------------------------------------------------------------- +// wxGenericPropertyAccessor +// ---------------------------------------------------------------------------- + +struct wxGenericPropertyAccessor::wxGenericPropertyAccessorInternal +{ + char filler ; +} ; + +wxGenericPropertyAccessor::wxGenericPropertyAccessor( const wxString& propertyName ) +: wxPropertyAccessor( NULL , NULL , NULL , NULL ) +{ + m_data = new wxGenericPropertyAccessorInternal ; + m_propertyName = propertyName ; + m_getterName = wxT("Get")+propertyName ; + m_setterName = wxT("Set")+propertyName ; +} + +wxGenericPropertyAccessor::~wxGenericPropertyAccessor() +{ + delete m_data ; +} +void wxGenericPropertyAccessor::SetProperty(wxObject *object, const wxxVariant &value) const +{ + wxDynamicObject* dynobj = dynamic_cast< wxDynamicObject * >( object ) ; + wxASSERT_MSG( dynobj , wxT("cannot call wxDynamicClassInfo::SetProperty on an object other than wxDynamicObject") ) ; + dynobj->SetProperty(m_propertyName , value ) ; +} + +void wxGenericPropertyAccessor::GetProperty(const wxObject *object, wxxVariant& value) const +{ + const wxDynamicObject* dynobj = dynamic_cast< const wxDynamicObject * >( object ) ; + wxASSERT_MSG( dynobj , wxT("cannot call wxDynamicClassInfo::SetProperty on an object other than wxDynamicObject") ) ; + value = dynobj->GetProperty( m_propertyName ) ; +} + +#endif // wxUSE_EXTENDED_RTTI diff --git a/Externals/wxWidgets/src/common/xtistrm.cpp b/Externals/wxWidgets/src/common/xtistrm.cpp new file mode 100644 index 0000000000..b1e7f53cba --- /dev/null +++ b/Externals/wxWidgets/src/common/xtistrm.cpp @@ -0,0 +1,847 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/xtistrm.cpp +// Purpose: streaming runtime metadata information +// Author: Stefan Csomor +// Modified by: +// Created: 27/07/03 +// RCS-ID: $Id: xtistrm.cpp 38939 2006-04-27 12:47:14Z ABX $ +// Copyright: (c) 2003 Stefan Csomor +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_EXTENDED_RTTI + +#include "wx/xtistrm.h" + +#ifndef WX_PRECOMP + #include "wx/object.h" + #include "wx/hash.h" + #include "wx/event.h" +#endif + +#include "wx/tokenzr.h" +#include "wx/txtstrm.h" + +#include "wx/beforestd.h" +#include +#include +#include +#include "wx/afterstd.h" + +using namespace std ; + +struct wxWriter::wxWriterInternal +{ + map< const wxObject* , int > m_writtenObjects ; + int m_nextId ; +} ; + +wxWriter::wxWriter() +{ + m_data = new wxWriterInternal ; + m_data->m_nextId = 0 ; +} + +wxWriter::~wxWriter() +{ + delete m_data ; +} + +struct wxWriter::wxWriterInternalPropertiesData +{ + char nothing ; +} ; + +void wxWriter::ClearObjectContext() +{ + delete m_data ; + m_data = new wxWriterInternal() ; + m_data->m_nextId = 0 ; +} + +void wxWriter::WriteObject(const wxObject *object, const wxClassInfo *classInfo , wxPersister *persister , const wxString &name , wxxVariantArray &metadata ) +{ + DoBeginWriteTopLevelEntry( name ) ; + WriteObject( object , classInfo , persister , false , metadata) ; + DoEndWriteTopLevelEntry( name ) ; +} + +void wxWriter::WriteObject(const wxObject *object, const wxClassInfo *classInfo , wxPersister *persister , bool isEmbedded, wxxVariantArray &metadata ) +{ + if ( !classInfo->BeforeWriteObject( object , this , persister , metadata) ) + return ; + + if ( persister->BeforeWriteObject( this , object , classInfo , metadata) ) + { + if ( object == NULL ) + DoWriteNullObject() ; + else if ( IsObjectKnown( object ) ) + DoWriteRepeatedObject( GetObjectID(object) ) ; + else + { + int oid = m_data->m_nextId++ ; + if ( !isEmbedded ) + m_data->m_writtenObjects[object] = oid ; + + // in case this object is a wxDynamicObject we also have to insert is superclass + // instance with the same id, so that object relations are streamed out correctly + const wxDynamicObject* dynobj = dynamic_cast( object ) ; + if ( !isEmbedded && dynobj ) + m_data->m_writtenObjects[dynobj->GetSuperClassInstance()] = oid ; + + DoBeginWriteObject( object , classInfo , oid , metadata ) ; + wxWriterInternalPropertiesData data ; + WriteAllProperties( object , classInfo , persister , &data ) ; + DoEndWriteObject( object , classInfo , oid ) ; + } + persister->AfterWriteObject( this ,object , classInfo ) ; + } +} + +void wxWriter::FindConnectEntry(const wxEvtHandler * evSource,const wxDelegateTypeInfo* dti, const wxObject* &sink , const wxHandlerInfo *&handler) +{ + wxList *dynamicEvents = evSource->GetDynamicEventTable() ; + + if ( dynamicEvents ) + { + wxList::compatibility_iterator node = dynamicEvents->GetFirst(); + while (node) + { + wxDynamicEventTableEntry *entry = (wxDynamicEventTableEntry*)node->GetData(); + + // find the match + if ( entry->m_fn && + (dti->GetEventType() == entry->m_eventType) && + (entry->m_id == -1 ) && + (entry->m_eventSink != NULL ) ) + { + sink = entry->m_eventSink ; + const wxClassInfo* sinkClassInfo = sink->GetClassInfo() ; + const wxHandlerInfo* sinkHandler = sinkClassInfo->GetFirstHandler() ; + while ( sinkHandler ) + { + if ( sinkHandler->GetEventFunction() == entry->m_fn ) + { + handler = sinkHandler ; + break ; + } + sinkHandler = sinkHandler->GetNext() ; + } + break ; + } + node = node->GetNext(); + } + } +} +void wxWriter::WriteAllProperties( const wxObject * obj , const wxClassInfo* ci , wxPersister *persister, wxWriterInternalPropertiesData * data ) +{ + wxPropertyInfoMap map ; + ci->GetProperties( map ) ; + for ( int i = 0 ; i < ci->GetCreateParamCount() ; ++i ) + { + wxString name = ci->GetCreateParamName(i) ; + const wxPropertyInfo* prop = map.find(name)->second ; + if ( prop ) + { + WriteOneProperty( obj , prop->GetDeclaringClass() , prop , persister , data ) ; + } + else + { + wxLogError( _("Create Parameter not found in declared RTTI Parameters") ) ; + } + map.erase( name ) ; + } + { // Extra block for broken compilers + for( wxPropertyInfoMap::iterator iter = map.begin() ; iter != map.end() ; ++iter ) + { + const wxPropertyInfo* prop = iter->second ; + if ( prop->GetFlags() & wxPROP_OBJECT_GRAPH ) + { + WriteOneProperty( obj , prop->GetDeclaringClass() , prop , persister , data ) ; + } + } + } + { // Extra block for broken compilers + for( wxPropertyInfoMap::iterator iter = map.begin() ; iter != map.end() ; ++iter ) + { + const wxPropertyInfo* prop = iter->second ; + if ( !(prop->GetFlags() & wxPROP_OBJECT_GRAPH) ) + { + WriteOneProperty( obj , prop->GetDeclaringClass() , prop , persister , data ) ; + } + } + } +} + +void wxWriter::WriteOneProperty( const wxObject *obj , const wxClassInfo* ci , const wxPropertyInfo* pi , wxPersister *persister , wxWriterInternalPropertiesData *WXUNUSED(data) ) +{ + if ( pi->GetFlags() & wxPROP_DONT_STREAM ) + return ; + + // make sure that we are picking the correct object for accessing the property + const wxDynamicObject* dynobj = dynamic_cast< const wxDynamicObject* > (obj ) ; + if ( dynobj && (dynamic_cast(ci) == NULL) ) + obj = dynobj->GetSuperClassInstance() ; + + if ( pi->GetTypeInfo()->GetKind() == wxT_COLLECTION ) + { + wxxVariantArray data ; + pi->GetAccessor()->GetPropertyCollection(obj, data) ; + const wxTypeInfo * elementType = dynamic_cast< const wxCollectionTypeInfo* >( pi->GetTypeInfo() )->GetElementType() ; + for ( size_t i = 0 ; i < data.GetCount() ; ++i ) + { + if ( i == 0 ) + DoBeginWriteProperty( pi ) ; + + DoBeginWriteElement() ; + wxxVariant value = data[i] ; + if ( persister->BeforeWriteProperty( this , obj, pi , value ) ) + { + const wxClassTypeInfo* cti = dynamic_cast< const wxClassTypeInfo* > ( elementType ) ; + if ( cti ) + { + const wxClassInfo* pci = cti->GetClassInfo() ; + wxObject *vobj = pci->VariantToInstance( value ) ; + wxxVariantArray md ; + WriteObject( vobj , (vobj ? vobj->GetClassInfo() : pci ) , persister , cti->GetKind()== wxT_OBJECT , md ) ; + } + else + { + DoWriteSimpleType( value ) ; + } + } + DoEndWriteElement() ; + if ( i == data.GetCount() - 1 ) + DoEndWriteProperty( pi ) ; + } + } + else + { + const wxDelegateTypeInfo* dti = dynamic_cast< const wxDelegateTypeInfo* > ( pi->GetTypeInfo() ) ; + if ( dti ) + { + const wxObject* sink = NULL ; + const wxHandlerInfo *handler = NULL ; + + const wxEvtHandler * evSource = dynamic_cast(obj) ; + if ( evSource ) + { + FindConnectEntry( evSource , dti , sink , handler ) ; + if ( persister->BeforeWriteDelegate( this , obj , ci , pi , sink , handler ) ) + { + if ( sink != NULL && handler != NULL ) + { + DoBeginWriteProperty( pi ) ; + if ( IsObjectKnown( sink ) ) + { + DoWriteDelegate( obj , ci , pi , sink , GetObjectID( sink ) , sink->GetClassInfo() , handler ) ; + DoEndWriteProperty( pi ) ; + } + else + { + wxLogError( _("Streaming delegates for not already streamed objects not yet supported") ) ; + } + } + } + } + else + { + wxLogError(_("Illegal Object Class (Non-wxEvtHandler) as Event Source") ) ; + } + } + else + { + wxxVariant value ; + pi->GetAccessor()->GetProperty(obj, value) ; + + // avoid streaming out void objects + if( value.IsEmpty() ) + return ; + + if ( pi->GetFlags() & wxPROP_ENUM_STORE_LONG ) + { + const wxEnumTypeInfo *eti = dynamic_cast( pi->GetTypeInfo() ) ; + if ( eti ) + { + eti->ConvertFromLong( value.wxTEMPLATED_MEMBER_CALL(Get , long) , value ) ; + } + else + { + wxLogError( _("Type must have enum - long conversion") ) ; + } + } + + // avoid streaming out default values + if ( pi->GetTypeInfo()->HasStringConverters() && !pi->GetDefaultValue().IsEmpty() ) + { + if ( value.GetAsString() == pi->GetDefaultValue().GetAsString() ) + return ; + } + + // avoid streaming out null objects + const wxClassTypeInfo* cti = dynamic_cast< const wxClassTypeInfo* > ( pi->GetTypeInfo() ) ; + + if ( cti && value.GetAsObject() == NULL ) + return ; + + if ( persister->BeforeWriteProperty( this , obj, pi , value ) ) + { + DoBeginWriteProperty( pi ) ; + if ( cti ) + { + const wxClassInfo* pci = cti->GetClassInfo() ; + wxObject *vobj = pci->VariantToInstance( value ) ; + if ( vobj && pi->GetTypeInfo()->HasStringConverters() ) + { + wxString stringValue ; + cti->ConvertToString( value , stringValue ) ; + wxxVariant convertedValue(stringValue) ; + DoWriteSimpleType( convertedValue ) ; + } + else + { + wxxVariantArray md ; + WriteObject( vobj , (vobj ? vobj->GetClassInfo() : pci ) , persister , cti->GetKind()== wxT_OBJECT , md) ; + } + } + else + { + DoWriteSimpleType( value ) ; + } + DoEndWriteProperty( pi ) ; + } + } + } +} + +int wxWriter::GetObjectID(const wxObject *obj) +{ + if ( !IsObjectKnown( obj ) ) + return wxInvalidObjectID ; + + return m_data->m_writtenObjects[obj] ; +} + +bool wxWriter::IsObjectKnown( const wxObject *obj ) +{ + return m_data->m_writtenObjects.find( obj ) != m_data->m_writtenObjects.end() ; +} + + +// ---------------------------------------------------------------------------- +// reading objects in +// ---------------------------------------------------------------------------- + +struct wxReader::wxReaderInternal +{ + map m_classInfos; +}; + +wxReader::wxReader() +{ + m_data = new wxReaderInternal; +} + +wxReader::~wxReader() +{ + delete m_data; +} + +wxClassInfo* wxReader::GetObjectClassInfo(int objectID) +{ + if ( objectID == wxNullObjectID || objectID == wxInvalidObjectID ) + { + wxLogError( _("Invalid or Null Object ID passed to GetObjectClassInfo" ) ) ; + return NULL ; + } + if ( m_data->m_classInfos.find(objectID) == m_data->m_classInfos.end() ) + { + wxLogError( _("Unknown Object passed to GetObjectClassInfo" ) ) ; + return NULL ; + } + return m_data->m_classInfos[objectID] ; +} + +void wxReader::SetObjectClassInfo(int objectID, wxClassInfo *classInfo ) +{ + if ( objectID == wxNullObjectID || objectID == wxInvalidObjectID ) + { + wxLogError( _("Invalid or Null Object ID passed to GetObjectClassInfo" ) ) ; + return ; + } + if ( m_data->m_classInfos.find(objectID) != m_data->m_classInfos.end() ) + { + wxLogError( _("Already Registered Object passed to SetObjectClassInfo" ) ) ; + return ; + } + m_data->m_classInfos[objectID] = classInfo ; +} + +bool wxReader::HasObjectClassInfo( int objectID ) +{ + if ( objectID == wxNullObjectID || objectID == wxInvalidObjectID ) + { + wxLogError( _("Invalid or Null Object ID passed to HasObjectClassInfo" ) ) ; + return NULL ; + } + return m_data->m_classInfos.find(objectID) != m_data->m_classInfos.end() ; +} + + +// ---------------------------------------------------------------------------- +// reading xml in +// ---------------------------------------------------------------------------- + +/* +Reading components has not to be extended for components +as properties are always sought by typeinfo over all levels +and create params are always toplevel class only +*/ + + +// ---------------------------------------------------------------------------- +// depersisting to memory +// ---------------------------------------------------------------------------- + +struct wxRuntimeDepersister::wxRuntimeDepersisterInternal +{ + map m_objects; + + void SetObject(int objectID, wxObject *obj ) + { + if ( m_objects.find(objectID) != m_objects.end() ) + { + wxLogError( _("Passing a already registered object to SetObject") ) ; + return ; + } + m_objects[objectID] = obj ; + } + wxObject* GetObject( int objectID ) + { + if ( objectID == wxNullObjectID ) + return NULL ; + if ( m_objects.find(objectID) == m_objects.end() ) + { + wxLogError( _("Passing an unkown object to GetObject") ) ; + return NULL ; + } + + return m_objects[objectID] ; + } +} ; + +wxRuntimeDepersister::wxRuntimeDepersister() +{ + m_data = new wxRuntimeDepersisterInternal() ; +} + +wxRuntimeDepersister::~wxRuntimeDepersister() +{ + delete m_data ; +} + +void wxRuntimeDepersister::AllocateObject(int objectID, wxClassInfo *classInfo , + wxxVariantArray &WXUNUSED(metadata)) +{ + wxObject *O; + O = classInfo->CreateObject(); + m_data->SetObject(objectID, O); +} + +void wxRuntimeDepersister::CreateObject(int objectID, + const wxClassInfo *classInfo, + int paramCount, + wxxVariant *params, + int *objectIdValues, + const wxClassInfo **objectClassInfos , + wxxVariantArray &WXUNUSED(metadata)) +{ + wxObject *o; + o = m_data->GetObject(objectID); + for ( int i = 0 ; i < paramCount ; ++i ) + { + if ( objectIdValues[i] != wxInvalidObjectID ) + { + wxObject *o; + o = m_data->GetObject(objectIdValues[i]); + // if this is a dynamic object and we are asked for another class + // than wxDynamicObject we cast it down manually. + wxDynamicObject *dyno = dynamic_cast< wxDynamicObject * > (o) ; + if ( dyno!=NULL && (objectClassInfos[i] != dyno->GetClassInfo()) ) + { + o = dyno->GetSuperClassInstance() ; + } + params[i] = objectClassInfos[i]->InstanceToVariant(o) ; + } + } + classInfo->Create(o, paramCount, params); +} + +void wxRuntimeDepersister::ConstructObject(int objectID, + const wxClassInfo *classInfo, + int paramCount, + wxxVariant *params, + int *objectIdValues, + const wxClassInfo **objectClassInfos , + wxxVariantArray &WXUNUSED(metadata)) +{ + wxObject *o; + for ( int i = 0 ; i < paramCount ; ++i ) + { + if ( objectIdValues[i] != wxInvalidObjectID ) + { + wxObject *o; + o = m_data->GetObject(objectIdValues[i]); + // if this is a dynamic object and we are asked for another class + // than wxDynamicObject we cast it down manually. + wxDynamicObject *dyno = dynamic_cast< wxDynamicObject * > (o) ; + if ( dyno!=NULL && (objectClassInfos[i] != dyno->GetClassInfo()) ) + { + o = dyno->GetSuperClassInstance() ; + } + params[i] = objectClassInfos[i]->InstanceToVariant(o) ; + } + } + o = classInfo->ConstructObject(paramCount, params); + m_data->SetObject(objectID, o); +} + + +void wxRuntimeDepersister::DestroyObject(int objectID, wxClassInfo *WXUNUSED(classInfo)) +{ + wxObject *o; + o = m_data->GetObject(objectID); + delete o ; +} + +void wxRuntimeDepersister::SetProperty(int objectID, + const wxClassInfo *classInfo, + const wxPropertyInfo* propertyInfo, + const wxxVariant &value) +{ + wxObject *o; + o = m_data->GetObject(objectID); + classInfo->SetProperty( o , propertyInfo->GetName() , value ) ; +} + +void wxRuntimeDepersister::SetPropertyAsObject(int objectID, + const wxClassInfo *classInfo, + const wxPropertyInfo* propertyInfo, + int valueObjectId) +{ + wxObject *o, *valo; + o = m_data->GetObject(objectID); + valo = m_data->GetObject(valueObjectId); + const wxClassInfo* valClassInfo = (dynamic_cast(propertyInfo->GetTypeInfo()))->GetClassInfo() ; + // if this is a dynamic object and we are asked for another class + // than wxDynamicObject we cast it down manually. + wxDynamicObject *dynvalo = dynamic_cast< wxDynamicObject * > (valo) ; + if ( dynvalo!=NULL && (valClassInfo != dynvalo->GetClassInfo()) ) + { + valo = dynvalo->GetSuperClassInstance() ; + } + + classInfo->SetProperty( o , propertyInfo->GetName() , valClassInfo->InstanceToVariant(valo) ) ; +} + +void wxRuntimeDepersister::SetConnect(int eventSourceObjectID, + const wxClassInfo *WXUNUSED(eventSourceClassInfo), + const wxPropertyInfo *delegateInfo , + const wxClassInfo *WXUNUSED(eventSinkClassInfo) , + const wxHandlerInfo* handlerInfo , + int eventSinkObjectID ) +{ + wxEvtHandler *ehsource = dynamic_cast< wxEvtHandler* >( m_data->GetObject( eventSourceObjectID ) ) ; + wxEvtHandler *ehsink = dynamic_cast< wxEvtHandler *>(m_data->GetObject(eventSinkObjectID) ) ; + + if ( ehsource && ehsink ) + { + const wxDelegateTypeInfo *delegateTypeInfo = dynamic_cast(delegateInfo->GetTypeInfo()); + if( delegateTypeInfo && delegateTypeInfo->GetLastEventType() == -1 ) + { + ehsource->Connect( -1 , delegateTypeInfo->GetEventType() , + handlerInfo->GetEventFunction() , NULL /*user data*/ , + ehsink ) ; + } + else + { + for ( wxEventType iter = delegateTypeInfo->GetEventType() ; iter <= delegateTypeInfo->GetLastEventType() ; ++iter ) + { + ehsource->Connect( -1 , iter , + handlerInfo->GetEventFunction() , NULL /*user data*/ , + ehsink ) ; + } + } + } +} + +wxObject *wxRuntimeDepersister::GetObject(int objectID) +{ + return m_data->GetObject( objectID ) ; +} + +// adds an element to a property collection +void wxRuntimeDepersister::AddToPropertyCollection( int objectID , + const wxClassInfo *classInfo, + const wxPropertyInfo* propertyInfo , + const wxxVariant &value) +{ + wxObject *o; + o = m_data->GetObject(objectID); + classInfo->AddToPropertyCollection( o , propertyInfo->GetName() , value ) ; +} + +// sets the corresponding property (value is an object) +void wxRuntimeDepersister::AddToPropertyCollectionAsObject(int objectID, + const wxClassInfo *classInfo, + const wxPropertyInfo* propertyInfo , + int valueObjectId) +{ + wxObject *o, *valo; + o = m_data->GetObject(objectID); + valo = m_data->GetObject(valueObjectId); + const wxCollectionTypeInfo * collectionTypeInfo = dynamic_cast< const wxCollectionTypeInfo * >(propertyInfo->GetTypeInfo() ) ; + const wxClassInfo* valClassInfo = (dynamic_cast(collectionTypeInfo->GetElementType()))->GetClassInfo() ; + // if this is a dynamic object and we are asked for another class + // than wxDynamicObject we cast it down manually. + wxDynamicObject *dynvalo = dynamic_cast< wxDynamicObject * > (valo) ; + if ( dynvalo!=NULL && (valClassInfo != dynvalo->GetClassInfo()) ) + { + valo = dynvalo->GetSuperClassInstance() ; + } + + classInfo->AddToPropertyCollection( o , propertyInfo->GetName() , valClassInfo->InstanceToVariant(valo) ) ; +} + +// ---------------------------------------------------------------------------- +// depersisting to code +// ---------------------------------------------------------------------------- + +struct wxCodeDepersister::wxCodeDepersisterInternal +{ +#if wxUSE_UNICODE + map m_objectNames ; +#else + map m_objectNames ; +#endif + + void SetObjectName(int objectID, const wxString &name ) + { + if ( m_objectNames.find(objectID) != m_objectNames.end() ) + { + wxLogError( _("Passing a already registered object to SetObjectName") ) ; + return ; + } + m_objectNames[objectID] = (const wxChar *)name; + } + + wxString GetObjectName( int objectID ) + { + if ( objectID == wxNullObjectID ) + return wxT("NULL") ; + + if ( m_objectNames.find(objectID) == m_objectNames.end() ) + { + wxLogError( _("Passing an unkown object to GetObject") ) ; + return wxEmptyString ; + } + return wxString( m_objectNames[objectID].c_str() ) ; + } +} ; + +wxCodeDepersister::wxCodeDepersister(wxTextOutputStream *out) +: m_fp(out) +{ + m_data = new wxCodeDepersisterInternal ; +} + +wxCodeDepersister::~wxCodeDepersister() +{ + delete m_data ; +} + +void wxCodeDepersister::AllocateObject(int objectID, wxClassInfo *classInfo , + wxxVariantArray &WXUNUSED(metadata)) +{ + wxString objectName = wxString::Format( wxT("LocalObject_%d") , objectID ) ; + m_fp->WriteString( wxString::Format( wxT("\t%s *%s = new %s;\n"), + classInfo->GetClassName(), + objectName.c_str(), + classInfo->GetClassName()) ); + m_data->SetObjectName( objectID , objectName ) ; +} + +void wxCodeDepersister::DestroyObject(int objectID, wxClassInfo *WXUNUSED(classInfo)) +{ + m_fp->WriteString( wxString::Format( wxT("\tdelete %s;\n"), + m_data->GetObjectName( objectID).c_str() ) ); +} + +wxString wxCodeDepersister::ValueAsCode( const wxxVariant ¶m ) +{ + wxString value ; + const wxTypeInfo* type = param.GetTypeInfo() ; + if ( type->GetKind() == wxT_CUSTOM ) + { + const wxCustomTypeInfo* cti = dynamic_cast(type) ; + if ( cti ) + { + value.Printf( wxT("%s(%s)"), cti->GetTypeName().c_str(),param.GetAsString().c_str() ); + } + else + { + wxLogError ( _("Internal error, illegal wxCustomTypeInfo") ) ; + } + } + else if ( type->GetKind() == wxT_STRING ) + { + value.Printf( wxT("\"%s\""),param.GetAsString().c_str() ); + } + else + { + value.Printf( wxT("%s"), param.GetAsString().c_str() ); + } + return value ; +} + +void wxCodeDepersister::CreateObject(int objectID, + const wxClassInfo *WXUNUSED(classInfo), + int paramCount, + wxxVariant *params, + int *objectIDValues, + const wxClassInfo **WXUNUSED(objectClassInfos) , + wxxVariantArray &WXUNUSED(metadata) + ) +{ + int i; + m_fp->WriteString( wxString::Format( wxT("\t%s->Create("), m_data->GetObjectName(objectID).c_str() ) ); + for (i = 0; i < paramCount; i++) + { + if ( objectIDValues[i] != wxInvalidObjectID ) + m_fp->WriteString( wxString::Format( wxT("%s"), m_data->GetObjectName( objectIDValues[i] ).c_str() ) ); + else + { + m_fp->WriteString( wxString::Format( wxT("%s"), ValueAsCode(params[i]).c_str() ) ); + } + if (i < paramCount - 1) + m_fp->WriteString( wxT(", ")); + } + m_fp->WriteString( wxT(");\n") ); +} + +void wxCodeDepersister::ConstructObject(int objectID, + const wxClassInfo *classInfo, + int paramCount, + wxxVariant *params, + int *objectIDValues, + const wxClassInfo **WXUNUSED(objectClassInfos) , + wxxVariantArray &WXUNUSED(metadata) + ) +{ + wxString objectName = wxString::Format( wxT("LocalObject_%d") , objectID ) ; + m_fp->WriteString( wxString::Format( wxT("\t%s *%s = new %s("), + classInfo->GetClassName(), + objectName.c_str(), + classInfo->GetClassName()) ); + m_data->SetObjectName( objectID , objectName ) ; + + int i; + for (i = 0; i < paramCount; i++) + { + if ( objectIDValues[i] != wxInvalidObjectID ) + m_fp->WriteString( wxString::Format( wxT("%s"), m_data->GetObjectName( objectIDValues[i] ).c_str() ) ); + else + { + m_fp->WriteString( wxString::Format( wxT("%s"), ValueAsCode(params[i]).c_str() ) ); + } + if (i < paramCount - 1) + m_fp->WriteString( wxT(", ") ); + } + m_fp->WriteString( wxT(");\n") ); +} + +void wxCodeDepersister::SetProperty(int objectID, + const wxClassInfo *WXUNUSED(classInfo), + const wxPropertyInfo* propertyInfo, + const wxxVariant &value) +{ + m_fp->WriteString( wxString::Format( wxT("\t%s->%s(%s);\n"), + m_data->GetObjectName(objectID).c_str(), + propertyInfo->GetAccessor()->GetSetterName().c_str(), + ValueAsCode(value).c_str()) ); +} + +void wxCodeDepersister::SetPropertyAsObject(int objectID, + const wxClassInfo *WXUNUSED(classInfo), + const wxPropertyInfo* propertyInfo, + int valueObjectId) +{ + if ( propertyInfo->GetTypeInfo()->GetKind() == wxT_OBJECT ) + m_fp->WriteString( wxString::Format( wxT("\t%s->%s(*%s);\n"), + m_data->GetObjectName(objectID).c_str(), + propertyInfo->GetAccessor()->GetSetterName().c_str(), + m_data->GetObjectName( valueObjectId).c_str() ) ); + else + m_fp->WriteString( wxString::Format( wxT("\t%s->%s(%s);\n"), + m_data->GetObjectName(objectID).c_str(), + propertyInfo->GetAccessor()->GetSetterName().c_str(), + m_data->GetObjectName( valueObjectId).c_str() ) ); +} + +void wxCodeDepersister::AddToPropertyCollection( int objectID , + const wxClassInfo *WXUNUSED(classInfo), + const wxPropertyInfo* propertyInfo , + const wxxVariant &value) +{ + m_fp->WriteString( wxString::Format( wxT("\t%s->%s(%s);\n"), + m_data->GetObjectName(objectID).c_str(), + propertyInfo->GetAccessor()->GetAdderName().c_str(), + ValueAsCode(value).c_str()) ); +} + +// sets the corresponding property (value is an object) +void wxCodeDepersister::AddToPropertyCollectionAsObject(int WXUNUSED(objectID), + const wxClassInfo *WXUNUSED(classInfo), + const wxPropertyInfo* WXUNUSED(propertyInfo) , + int WXUNUSED(valueObjectId)) +{ + // TODO +} + +void wxCodeDepersister::SetConnect(int eventSourceObjectID, + const wxClassInfo *WXUNUSED(eventSourceClassInfo), + const wxPropertyInfo *delegateInfo , + const wxClassInfo *eventSinkClassInfo , + const wxHandlerInfo* handlerInfo , + int eventSinkObjectID ) +{ + wxString ehsource = m_data->GetObjectName( eventSourceObjectID ) ; + wxString ehsink = m_data->GetObjectName(eventSinkObjectID) ; + wxString ehsinkClass = eventSinkClassInfo->GetClassName() ; + const wxDelegateTypeInfo *delegateTypeInfo = dynamic_cast(delegateInfo->GetTypeInfo()); + if ( delegateTypeInfo ) + { + int eventType = delegateTypeInfo->GetEventType() ; + wxString handlerName = handlerInfo->GetName() ; + + m_fp->WriteString( wxString::Format( wxT("\t%s->Connect( %s->GetId() , %d , (wxObjectEventFunction)(wxEventFunction) & %s::%s , NULL , %s ) ;") , + ehsource.c_str() , ehsource.c_str() , eventType , ehsinkClass.c_str() , handlerName.c_str() , ehsink.c_str() ) ); + } + else + { + wxLogError(_("delegate has no type info")); + } +} + +#include "wx/arrimpl.cpp" + +WX_DEFINE_OBJARRAY(wxxVariantArray); + +#endif // wxUSE_EXTENDED_RTTI diff --git a/Externals/wxWidgets/src/common/xtixml.cpp b/Externals/wxWidgets/src/common/xtixml.cpp new file mode 100644 index 0000000000..43a526046f --- /dev/null +++ b/Externals/wxWidgets/src/common/xtixml.cpp @@ -0,0 +1,538 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/xtixml.cpp +// Purpose: streaming runtime metadata information +// Author: Stefan Csomor +// Modified by: +// Created: 27/07/03 +// RCS-ID: $Id: xtixml.cpp 38939 2006-04-27 12:47:14Z ABX $ +// Copyright: (c) 2003 Stefan Csomor +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_EXTENDED_RTTI + +#include "wx/xtixml.h" + +#ifndef WX_PRECOMP + #include "wx/object.h" + #include "wx/hash.h" + #include "wx/event.h" +#endif + +#include "wx/xml/xml.h" +#include "wx/tokenzr.h" +#include "wx/txtstrm.h" + +#include "wx/xtistrm.h" + +#include "wx/beforestd.h" +#include +#include +#include +#include "wx/afterstd.h" + +using namespace std ; + +// +// XML Streaming +// + +// convenience functions + +void wxXmlAddContentToNode( wxXmlNode* node , const wxString& data ) +{ + node->AddChild(new wxXmlNode(wxXML_TEXT_NODE, wxT("value"), data ) ); +} + +wxString wxXmlGetContentFromNode( wxXmlNode *node ) +{ + if ( node->GetChildren() ) + return node->GetChildren()->GetContent() ; + else + return wxEmptyString ; +} + +struct wxXmlWriter::wxXmlWriterInternal +{ + wxXmlNode *m_root ; + wxXmlNode *m_current ; + vector< wxXmlNode * > m_objectStack ; + + void Push( wxXmlNode *newCurrent ) + { + m_objectStack.push_back( m_current ) ; + m_current = newCurrent ; + } + + void Pop() + { + m_current = m_objectStack.back() ; + m_objectStack.pop_back() ; + } +} ; + +wxXmlWriter::wxXmlWriter( wxXmlNode * rootnode ) +{ + m_data = new wxXmlWriterInternal() ; + m_data->m_root = rootnode ; + m_data->m_current = rootnode ; +} + +wxXmlWriter::~wxXmlWriter() +{ + delete m_data ; +} + +void wxXmlWriter::DoBeginWriteTopLevelEntry( const wxString &name ) +{ + wxXmlNode *pnode; + pnode = new wxXmlNode(wxXML_ELEMENT_NODE, wxT("entry")); + pnode->AddProperty(wxString(wxT("name")), name); + m_data->m_current->AddChild(pnode) ; + m_data->Push( pnode ) ; +} + +void wxXmlWriter::DoEndWriteTopLevelEntry( const wxString &WXUNUSED(name) ) +{ + m_data->Pop() ; +} + +void wxXmlWriter::DoBeginWriteObject(const wxObject *WXUNUSED(object), const wxClassInfo *classInfo, int objectID , wxxVariantArray &metadata ) +{ + wxXmlNode *pnode; + pnode = new wxXmlNode(wxXML_ELEMENT_NODE, wxT("object")); + pnode->AddProperty(wxT("class"), wxString(classInfo->GetClassName())); + pnode->AddProperty(wxT("id"), wxString::Format( wxT("%d") , objectID ) ); + + for ( size_t i = 0 ; i < metadata.GetCount() ; ++i ) + { + pnode->AddProperty( metadata[i].GetName() , metadata[i].GetAsString() ) ; + } + m_data->m_current->AddChild(pnode) ; + m_data->Push( pnode ) ; +} + +// end of writing the root object +void wxXmlWriter::DoEndWriteObject(const wxObject *WXUNUSED(object), const wxClassInfo *WXUNUSED(classInfo), int WXUNUSED(objectID) ) +{ + m_data->Pop() ; +} + +// writes a property in the stream format +void wxXmlWriter::DoWriteSimpleType( wxxVariant &value ) +{ + wxXmlAddContentToNode( m_data->m_current ,value.GetAsString() ) ; +} + +void wxXmlWriter::DoBeginWriteElement() +{ + wxXmlNode *pnode; + pnode = new wxXmlNode(wxXML_ELEMENT_NODE, wxT("element") ); + m_data->m_current->AddChild(pnode) ; + m_data->Push( pnode ) ; +} + +void wxXmlWriter::DoEndWriteElement() +{ + m_data->Pop() ; +} + +void wxXmlWriter::DoBeginWriteProperty(const wxPropertyInfo *pi ) +{ + wxXmlNode *pnode; + pnode = new wxXmlNode(wxXML_ELEMENT_NODE, wxT("prop") ); + pnode->AddProperty(wxT("name"), pi->GetName() ); + m_data->m_current->AddChild(pnode) ; + m_data->Push( pnode ) ; +} + +void wxXmlWriter::DoEndWriteProperty(const wxPropertyInfo *WXUNUSED(propInfo) ) +{ + m_data->Pop() ; +} + + + +// insert an object reference to an already written object +void wxXmlWriter::DoWriteRepeatedObject( int objectID ) +{ + wxXmlNode *pnode; + pnode = new wxXmlNode(wxXML_ELEMENT_NODE, wxT("object")); + pnode->AddProperty(wxString(wxT("href")), wxString::Format( wxT("%d") , objectID ) ); + m_data->m_current->AddChild(pnode) ; +} + +// insert a null reference +void wxXmlWriter::DoWriteNullObject() +{ + wxXmlNode *pnode; + pnode = new wxXmlNode(wxXML_ELEMENT_NODE, wxT("object")); + m_data->m_current->AddChild(pnode) ; +} + +// writes a delegate in the stream format +void wxXmlWriter::DoWriteDelegate( const wxObject *WXUNUSED(object), const wxClassInfo* WXUNUSED(classInfo) , const wxPropertyInfo *WXUNUSED(pi) , + const wxObject *eventSink, int sinkObjectID , const wxClassInfo* WXUNUSED(eventSinkClassInfo) , const wxHandlerInfo* handlerInfo ) +{ + if ( eventSink != NULL && handlerInfo != NULL ) + { + wxXmlAddContentToNode( m_data->m_current ,wxString::Format(wxT("%d.%s"), sinkObjectID , handlerInfo->GetName().c_str()) ) ; + } +} + +// ---------------------------------------------------------------------------- +// reading objects in +// ---------------------------------------------------------------------------- + + + +// ---------------------------------------------------------------------------- +// reading xml in +// ---------------------------------------------------------------------------- + +/* +Reading components has not to be extended for components +as properties are always sought by typeinfo over all levels +and create params are always toplevel class only +*/ + +int wxXmlReader::ReadComponent(wxXmlNode *node, wxDepersister *callbacks) +{ + wxASSERT_MSG( callbacks , wxT("Does not support reading without a Depersistor") ) ; + wxString className; + wxClassInfo *classInfo; + + wxxVariant *createParams ; + int *createParamOids ; + const wxClassInfo** createClassInfos ; + wxXmlNode *children; + int objectID; + wxString ObjectIdString ; + + children = node->GetChildren(); + if (!children) + { + // check for a null object or href + if (node->GetPropVal(wxT("href") , &ObjectIdString ) ) + { + objectID = atoi( ObjectIdString.ToAscii() ) ; + if ( HasObjectClassInfo( objectID ) ) + { + return objectID ; + } + else + { + wxLogError( _("Forward hrefs are not supported") ) ; + return wxInvalidObjectID ; + } + } + if ( !node->GetPropVal(wxT("id") , &ObjectIdString ) ) + { + return wxNullObjectID; + } + } + if (!node->GetPropVal(wxT("class"), &className)) + { + // No class name. Eek. FIXME: error handling + return wxInvalidObjectID; + } + classInfo = wxClassInfo::FindClass(className); + if ( classInfo == NULL ) + { + wxLogError( wxString::Format(_("unknown class %s"),className ) ) ; + return wxInvalidObjectID ; + } + + if ( children != NULL && children->GetType() == wxXML_TEXT_NODE ) + { + wxLogError(_("objects cannot have XML Text Nodes") ) ; + return wxInvalidObjectID; + } + if (!node->GetPropVal(wxT("id"), &ObjectIdString)) + { + wxLogError(_("Objects must have an id attribute") ) ; + // No object id. Eek. FIXME: error handling + return wxInvalidObjectID; + } + objectID = atoi( ObjectIdString.ToAscii() ) ; + // is this object already has been streamed in, return it here + if ( HasObjectClassInfo( objectID ) ) + { + wxLogError ( wxString::Format(_("Doubly used id : %d"), objectID ) ) ; + return wxInvalidObjectID ; + } + + // new object, start with allocation + // first make the object know to our internal registry + SetObjectClassInfo( objectID , classInfo ) ; + + wxxVariantArray metadata ; + wxXmlProperty *xp = node->GetProperties() ; + while ( xp ) + { + if ( xp->GetName() != wxString(wxT("class")) && xp->GetName() != wxString(wxT("id")) ) + { + metadata.Add( new wxxVariant( xp->GetValue() , xp->GetName() ) ) ; + } + xp = xp->GetNext() ; + } + if ( !classInfo->NeedsDirectConstruction() ) + callbacks->AllocateObject(objectID, classInfo, metadata); + + // + // stream back the Create parameters first + createParams = new wxxVariant[ classInfo->GetCreateParamCount() ] ; + createParamOids = new int[classInfo->GetCreateParamCount() ] ; + createClassInfos = new const wxClassInfo*[classInfo->GetCreateParamCount() ] ; + +#if wxUSE_UNICODE + typedef map PropertyNodes ; + typedef vector PropertyNames ; +#else + typedef map PropertyNodes ; + typedef vector PropertyNames ; +#endif + PropertyNodes propertyNodes ; + PropertyNames propertyNames ; + + while( children ) + { + wxString name ; + children->GetPropVal( wxT("name") , &name ) ; + propertyNames.push_back( name.c_str() ) ; + propertyNodes[name.c_str()] = children->GetChildren() ; + children = children->GetNext() ; + } + + for ( int i = 0 ; i GetCreateParamCount() ; ++i ) + { + const wxChar* paramName = classInfo->GetCreateParamName(i) ; + PropertyNodes::iterator propiter = propertyNodes.find( paramName ) ; + const wxPropertyInfo* pi = classInfo->FindPropertyInfo( paramName ) ; + if ( pi == 0 ) + { + wxLogError( wxString::Format(_("Unkown Property %s"),paramName) ) ; + } + // if we don't have the value of a create param set in the xml + // we use the default value + if ( propiter != propertyNodes.end() ) + { + wxXmlNode* prop = propiter->second ; + if ( pi->GetTypeInfo()->IsObjectType() ) + { + createParamOids[i] = ReadComponent( prop , callbacks ) ; + createClassInfos[i] = dynamic_cast(pi->GetTypeInfo())->GetClassInfo() ; + } + else + { + createParamOids[i] = wxInvalidObjectID ; + createParams[i] = ReadValue( prop , pi->GetTypeInfo() ) ; + if( pi->GetFlags() & wxPROP_ENUM_STORE_LONG ) + { + const wxEnumTypeInfo *eti = dynamic_cast( pi->GetTypeInfo() ) ; + if ( eti ) + { + long realval ; + eti->ConvertToLong( createParams[i] , realval ) ; + createParams[i] = wxxVariant( realval ) ; + } + else + { + wxLogError( _("Type must have enum - long conversion") ) ; + } + } + createClassInfos[i] = NULL ; + } + + for ( size_t j = 0 ; j < propertyNames.size() ; ++j ) + { + if ( propertyNames[j] == paramName ) + { + propertyNames[j] = wxEmptyString ; + break ; + } + } + } + else + { + if ( pi->GetTypeInfo()->IsObjectType() ) + { + createParamOids[i] = wxNullObjectID ; + createClassInfos[i] = dynamic_cast(pi->GetTypeInfo())->GetClassInfo() ; + } + else + { + createParams[i] = pi->GetDefaultValue() ; + createParamOids[i] = wxInvalidObjectID ; + } + } + } + + // got the parameters. Call the Create method + if ( classInfo->NeedsDirectConstruction() ) + callbacks->ConstructObject(objectID, classInfo, + classInfo->GetCreateParamCount(), + createParams, createParamOids, createClassInfos, metadata ); + else + callbacks->CreateObject(objectID, classInfo, + classInfo->GetCreateParamCount(), + createParams, createParamOids, createClassInfos, metadata ); + + // now stream in the rest of the properties, in the sequence their properties were written in the xml + for ( size_t j = 0 ; j < propertyNames.size() ; ++j ) + { + if ( propertyNames[j].length() ) + { + PropertyNodes::iterator propiter = propertyNodes.find( propertyNames[j] ) ; + if ( propiter != propertyNodes.end() ) + { + wxXmlNode* prop = propiter->second ; + const wxPropertyInfo* pi = classInfo->FindPropertyInfo( propertyNames[j].c_str() ) ; + if ( pi->GetTypeInfo()->GetKind() == wxT_COLLECTION ) + { + const wxCollectionTypeInfo* collType = dynamic_cast< const wxCollectionTypeInfo* >( pi->GetTypeInfo() ) ; + const wxTypeInfo * elementType = collType->GetElementType() ; + while( prop ) + { + if ( prop->GetName() != wxT("element") ) + { + wxLogError( _("A non empty collection must consist of 'element' nodes" ) ) ; + break ; + } + wxXmlNode* elementContent = prop->GetChildren() ; + if ( elementContent ) + { + // we skip empty elements + if ( elementType->IsObjectType() ) + { + int valueId = ReadComponent( elementContent , callbacks ) ; + if ( valueId != wxInvalidObjectID ) + { + if ( pi->GetAccessor()->HasAdder() ) + callbacks->AddToPropertyCollectionAsObject( objectID , classInfo , pi , valueId ) ; + // TODO for collections we must have a notation on taking over ownership or not + if ( elementType->GetKind() == wxT_OBJECT && valueId != wxNullObjectID ) + callbacks->DestroyObject( valueId , GetObjectClassInfo( valueId ) ) ; + } + } + else + { + wxxVariant elementValue = ReadValue( elementContent , elementType ) ; + if ( pi->GetAccessor()->HasAdder() ) + callbacks->AddToPropertyCollection( objectID , classInfo ,pi , elementValue ) ; + } + } + prop = prop->GetNext() ; + } + } + else if ( pi->GetTypeInfo()->IsObjectType() ) + { + // and object can either be streamed out a string or as an object + // in case we have no node, then the object's streaming out has been vetoed + if ( prop ) + { + if ( prop->GetName() == wxT("object") ) + { + int valueId = ReadComponent( prop , callbacks ) ; + if ( valueId != wxInvalidObjectID ) + { + callbacks->SetPropertyAsObject( objectID , classInfo , pi , valueId ) ; + if ( pi->GetTypeInfo()->GetKind() == wxT_OBJECT && valueId != wxNullObjectID ) + callbacks->DestroyObject( valueId , GetObjectClassInfo( valueId ) ) ; + } + } + else + { + wxASSERT( pi->GetTypeInfo()->HasStringConverters() ) ; + wxxVariant nodeval = ReadValue( prop , pi->GetTypeInfo() ) ; + callbacks->SetProperty( objectID, classInfo ,pi , nodeval ) ; + } + } + } + else if ( pi->GetTypeInfo()->IsDelegateType() ) + { + if ( prop ) + { + wxString resstring = prop->GetContent() ; + wxInt32 pos = resstring.Find('.') ; + if ( pos != wxNOT_FOUND ) + { + int sinkOid = atol(resstring.Left(pos).ToAscii()) ; + wxString handlerName = resstring.Mid(pos+1) ; + wxClassInfo* sinkClassInfo = GetObjectClassInfo( sinkOid ) ; + + callbacks->SetConnect( objectID , classInfo , pi , sinkClassInfo , + sinkClassInfo->FindHandlerInfo(handlerName) , sinkOid ) ; + } + else + { + wxLogError( _("incorrect event handler string, missing dot") ) ; + } + } + + } + else + { + wxxVariant nodeval = ReadValue( prop , pi->GetTypeInfo() ) ; + if( pi->GetFlags() & wxPROP_ENUM_STORE_LONG ) + { + const wxEnumTypeInfo *eti = dynamic_cast( pi->GetTypeInfo() ) ; + if ( eti ) + { + long realval ; + eti->ConvertToLong( nodeval , realval ) ; + nodeval = wxxVariant( realval ) ; + } + else + { + wxLogError( _("Type must have enum - long conversion") ) ; + } + } + callbacks->SetProperty( objectID, classInfo ,pi , nodeval ) ; + } + } + } + } + + delete[] createParams ; + delete[] createParamOids ; + delete[] createClassInfos ; + + return objectID; +} + +wxxVariant wxXmlReader::ReadValue(wxXmlNode *node, + const wxTypeInfo *type ) +{ + wxString content ; + if ( node ) + content = node->GetContent() ; + wxxVariant result ; + type->ConvertFromString( content , result ) ; + return result ; +} + +int wxXmlReader::ReadObject( const wxString &name , wxDepersister *callbacks) +{ + wxXmlNode *iter = m_parent->GetChildren() ; + while ( iter ) + { + wxString entryName ; + if ( iter->GetPropVal(wxT("name"), &entryName) ) + { + if ( entryName == name ) + return ReadComponent( iter->GetChildren() , callbacks ) ; + } + iter = iter->GetNext() ; + } + return wxInvalidObjectID ; +} + +#endif // wxUSE_EXTENDED_RTTI diff --git a/Externals/wxWidgets/src/common/zipstrm.cpp b/Externals/wxWidgets/src/common/zipstrm.cpp new file mode 100644 index 0000000000..4009fcbff9 --- /dev/null +++ b/Externals/wxWidgets/src/common/zipstrm.cpp @@ -0,0 +1,2425 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/common/zipstrm.cpp +// Purpose: Streams for Zip files +// Author: Mike Wetherell +// RCS-ID: $Id: zipstrm.cpp 44087 2007-01-01 22:27:42Z PC $ +// Copyright: (c) Mike Wetherell +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_ZIPSTREAM + +#include "wx/zipstrm.h" + +#ifndef WX_PRECOMP + #include "wx/hashmap.h" + #include "wx/intl.h" + #include "wx/log.h" + #include "wx/utils.h" +#endif + +#include "wx/datstrm.h" +#include "wx/zstream.h" +#include "wx/mstream.h" +#include "wx/ptr_scpd.h" +#include "wx/wfstream.h" +#include "zlib.h" + +// value for the 'version needed to extract' field (20 means 2.0) +enum { + VERSION_NEEDED_TO_EXTRACT = 20 +}; + +// signatures for the various records (PKxx) +enum { + CENTRAL_MAGIC = 0x02014b50, // central directory record + LOCAL_MAGIC = 0x04034b50, // local header + END_MAGIC = 0x06054b50, // end of central directory record + SUMS_MAGIC = 0x08074b50 // data descriptor (info-zip) +}; + +// unix file attributes. zip stores them in the high 16 bits of the +// 'external attributes' field, hence the extra zeros. +enum { + wxZIP_S_IFMT = 0xF0000000, + wxZIP_S_IFDIR = 0x40000000, + wxZIP_S_IFREG = 0x80000000 +}; + +// minimum sizes for the various records +enum { + CENTRAL_SIZE = 46, + LOCAL_SIZE = 30, + END_SIZE = 22, + SUMS_SIZE = 12 +}; + +// The number of bytes that must be written to an wxZipOutputStream before +// a zip entry is created. The purpose of this latency is so that +// OpenCompressor() can see a little data before deciding which compressor +// it should use. +enum { + OUTPUT_LATENCY = 4096 +}; + +// Some offsets into the local header +enum { + SUMS_OFFSET = 14 +}; + +IMPLEMENT_DYNAMIC_CLASS(wxZipEntry, wxArchiveEntry) +IMPLEMENT_DYNAMIC_CLASS(wxZipClassFactory, wxArchiveClassFactory) + + +///////////////////////////////////////////////////////////////////////////// +// Helpers + +// read a string of a given length +// +static wxString ReadString(wxInputStream& stream, wxUint16 len, wxMBConv& conv) +{ + if (len == 0) + return wxEmptyString; + +#if wxUSE_UNICODE + wxCharBuffer buf(len); + stream.Read(buf.data(), len); + wxString str(buf, conv); +#else + wxString str; + (void)conv; + { + wxStringBuffer buf(str, len); + stream.Read(buf, len); + } +#endif + + return str; +} + +// Decode a little endian wxUint32 number from a character array +// +static inline wxUint32 CrackUint32(const char *m) +{ + const unsigned char *n = (const unsigned char*)m; + return (n[3] << 24) | (n[2] << 16) | (n[1] << 8) | n[0]; +} + +// Decode a little endian wxUint16 number from a character array +// +static inline wxUint16 CrackUint16(const char *m) +{ + const unsigned char *n = (const unsigned char*)m; + return (n[1] << 8) | n[0]; +} + +// Temporarily lower the logging level in debug mode to avoid a warning +// from SeekI about seeking on a stream with data written back to it. +// +static wxFileOffset QuietSeek(wxInputStream& stream, wxFileOffset pos) +{ +#if defined(__WXDEBUG__) && wxUSE_LOG + wxLogLevel level = wxLog::GetLogLevel(); + wxLog::SetLogLevel(wxLOG_Debug - 1); + wxFileOffset result = stream.SeekI(pos); + wxLog::SetLogLevel(level); + return result; +#else + return stream.SeekI(pos); +#endif +} + + +///////////////////////////////////////////////////////////////////////////// +// Class factory + +wxZipClassFactory g_wxZipClassFactory; + +wxZipClassFactory::wxZipClassFactory() +{ + if (this == &g_wxZipClassFactory) + PushFront(); +} + +const wxChar * const * +wxZipClassFactory::GetProtocols(wxStreamProtocolType type) const +{ + static const wxChar *protocols[] = { _T("zip"), NULL }; + static const wxChar *mimetypes[] = { _T("application/zip"), NULL }; + static const wxChar *fileexts[] = { _T(".zip"), _T(".htb"), NULL }; + static const wxChar *empty[] = { NULL }; + + switch (type) { + case wxSTREAM_PROTOCOL: return protocols; + case wxSTREAM_MIMETYPE: return mimetypes; + case wxSTREAM_FILEEXT: return fileexts; + default: return empty; + } +} + + +///////////////////////////////////////////////////////////////////////////// +// Read a zip header + +class wxZipHeader +{ +public: + wxZipHeader(wxInputStream& stream, size_t size); + + inline wxUint8 Read8(); + inline wxUint16 Read16(); + inline wxUint32 Read32(); + + const char *GetData() const { return m_data; } + size_t GetSize() const { return m_size; } + operator bool() const { return m_ok; } + + size_t Seek(size_t pos) { m_pos = pos; return m_pos; } + size_t Skip(size_t size) { m_pos += size; return m_pos; } + + wxZipHeader& operator>>(wxUint8& n) { n = Read8(); return *this; } + wxZipHeader& operator>>(wxUint16& n) { n = Read16(); return *this; } + wxZipHeader& operator>>(wxUint32& n) { n = Read32(); return *this; } + +private: + char m_data[64]; + size_t m_size; + size_t m_pos; + bool m_ok; +}; + +wxZipHeader::wxZipHeader(wxInputStream& stream, size_t size) + : m_size(0), + m_pos(0), + m_ok(false) +{ + wxCHECK_RET(size <= sizeof(m_data), _T("buffer too small")); + m_size = stream.Read(m_data, size).LastRead(); + m_ok = m_size == size; +} + +inline wxUint8 wxZipHeader::Read8() +{ + wxASSERT(m_pos < m_size); + return m_data[m_pos++]; +} + +inline wxUint16 wxZipHeader::Read16() +{ + wxASSERT(m_pos + 2 <= m_size); + wxUint16 n = CrackUint16(m_data + m_pos); + m_pos += 2; + return n; +} + +inline wxUint32 wxZipHeader::Read32() +{ + wxASSERT(m_pos + 4 <= m_size); + wxUint32 n = CrackUint32(m_data + m_pos); + m_pos += 4; + return n; +} + + +///////////////////////////////////////////////////////////////////////////// +// Stored input stream +// Trival decompressor for files which are 'stored' in the zip file. + +class wxStoredInputStream : public wxFilterInputStream +{ +public: + wxStoredInputStream(wxInputStream& stream); + + void Open(wxFileOffset len) { Close(); m_len = len; } + void Close() { m_pos = 0; m_lasterror = wxSTREAM_NO_ERROR; } + + virtual char Peek() { return wxInputStream::Peek(); } + virtual wxFileOffset GetLength() const { return m_len; } + +protected: + virtual size_t OnSysRead(void *buffer, size_t size); + virtual wxFileOffset OnSysTell() const { return m_pos; } + +private: + wxFileOffset m_pos; + wxFileOffset m_len; + + DECLARE_NO_COPY_CLASS(wxStoredInputStream) +}; + +wxStoredInputStream::wxStoredInputStream(wxInputStream& stream) + : wxFilterInputStream(stream), + m_pos(0), + m_len(0) +{ +} + +size_t wxStoredInputStream::OnSysRead(void *buffer, size_t size) +{ + size_t count = wx_truncate_cast(size_t, + wxMin(size + wxFileOffset(0), m_len - m_pos + size_t(0))); + count = m_parent_i_stream->Read(buffer, count).LastRead(); + m_pos += count; + + if (count < size) + m_lasterror = m_pos == m_len ? wxSTREAM_EOF : wxSTREAM_READ_ERROR; + + return count; +} + + +///////////////////////////////////////////////////////////////////////////// +// Stored output stream +// Trival compressor for files which are 'stored' in the zip file. + +class wxStoredOutputStream : public wxFilterOutputStream +{ +public: + wxStoredOutputStream(wxOutputStream& stream) : + wxFilterOutputStream(stream), m_pos(0) { } + + bool Close() { + m_pos = 0; + m_lasterror = wxSTREAM_NO_ERROR; + return true; + } + +protected: + virtual size_t OnSysWrite(const void *buffer, size_t size); + virtual wxFileOffset OnSysTell() const { return m_pos; } + +private: + wxFileOffset m_pos; + DECLARE_NO_COPY_CLASS(wxStoredOutputStream) +}; + +size_t wxStoredOutputStream::OnSysWrite(const void *buffer, size_t size) +{ + if (!IsOk() || !size) + return 0; + size_t count = m_parent_o_stream->Write(buffer, size).LastWrite(); + if (count != size) + m_lasterror = wxSTREAM_WRITE_ERROR; + m_pos += count; + return count; +} + + +///////////////////////////////////////////////////////////////////////////// +// wxRawInputStream +// +// Used to handle the unusal case of raw copying an entry of unknown +// length. This can only happen when the zip being copied from is being +// read from a non-seekable stream, and also was original written to a +// non-seekable stream. +// +// In this case there's no option but to decompress the stream to find +// it's length, but we can still write the raw compressed data to avoid the +// compression overhead (which is the greater one). +// +// Usage is like this: +// m_rawin = new wxRawInputStream(*m_parent_i_stream); +// m_decomp = m_rawin->Open(OpenDecompressor(m_rawin->GetTee())); +// +// The wxRawInputStream owns a wxTeeInputStream object, the role of which +// is something like the unix 'tee' command; it is a transparent filter, but +// allows the data read to be read a second time via an extra method 'GetData'. +// +// The wxRawInputStream then draws data through the tee using a decompressor +// then instead of returning the decompressed data, retuns the raw data +// from wxTeeInputStream::GetData(). + +class wxTeeInputStream : public wxFilterInputStream +{ +public: + wxTeeInputStream(wxInputStream& stream); + + size_t GetCount() const { return m_end - m_start; } + size_t GetData(char *buffer, size_t size); + + void Open(); + bool Final(); + + wxInputStream& Read(void *buffer, size_t size); + +protected: + virtual size_t OnSysRead(void *buffer, size_t size); + virtual wxFileOffset OnSysTell() const { return m_pos; } + +private: + wxFileOffset m_pos; + wxMemoryBuffer m_buf; + size_t m_start; + size_t m_end; + + DECLARE_NO_COPY_CLASS(wxTeeInputStream) +}; + +wxTeeInputStream::wxTeeInputStream(wxInputStream& stream) + : wxFilterInputStream(stream), + m_pos(0), m_buf(8192), m_start(0), m_end(0) +{ +} + +void wxTeeInputStream::Open() +{ + m_pos = m_start = m_end = 0; + m_lasterror = wxSTREAM_NO_ERROR; +} + +bool wxTeeInputStream::Final() +{ + bool final = m_end == m_buf.GetDataLen(); + m_end = m_buf.GetDataLen(); + return final; +} + +wxInputStream& wxTeeInputStream::Read(void *buffer, size_t size) +{ + size_t count = wxInputStream::Read(buffer, size).LastRead(); + m_end = m_buf.GetDataLen(); + m_buf.AppendData(buffer, count); + return *this; +} + +size_t wxTeeInputStream::OnSysRead(void *buffer, size_t size) +{ + size_t count = m_parent_i_stream->Read(buffer, size).LastRead(); + if (count < size) + m_lasterror = m_parent_i_stream->GetLastError(); + return count; +} + +size_t wxTeeInputStream::GetData(char *buffer, size_t size) +{ + if (m_wbacksize) { + size_t len = m_buf.GetDataLen(); + len = len > m_wbacksize ? len - m_wbacksize : 0; + m_buf.SetDataLen(len); + if (m_end > len) { + wxFAIL; // we've already returned data that's now being ungot + m_end = len; + } + m_parent_i_stream->Reset(); + m_parent_i_stream->Ungetch(m_wback, m_wbacksize); + free(m_wback); + m_wback = NULL; + m_wbacksize = 0; + m_wbackcur = 0; + } + + if (size > GetCount()) + size = GetCount(); + if (size) { + memcpy(buffer, m_buf + m_start, size); + m_start += size; + wxASSERT(m_start <= m_end); + } + + if (m_start == m_end && m_start > 0 && m_buf.GetDataLen() > 0) { + size_t len = m_buf.GetDataLen(); + char *buf = (char*)m_buf.GetWriteBuf(len); + len -= m_end; + memmove(buf, buf + m_end, len); + m_buf.UngetWriteBuf(len); + m_start = m_end = 0; + } + + return size; +} + +class wxRawInputStream : public wxFilterInputStream +{ +public: + wxRawInputStream(wxInputStream& stream); + virtual ~wxRawInputStream() { delete m_tee; } + + wxInputStream* Open(wxInputStream *decomp); + wxInputStream& GetTee() const { return *m_tee; } + +protected: + virtual size_t OnSysRead(void *buffer, size_t size); + virtual wxFileOffset OnSysTell() const { return m_pos; } + +private: + wxFileOffset m_pos; + wxTeeInputStream *m_tee; + + enum { BUFSIZE = 8192 }; + wxCharBuffer m_dummy; + + DECLARE_NO_COPY_CLASS(wxRawInputStream) +}; + +wxRawInputStream::wxRawInputStream(wxInputStream& stream) + : wxFilterInputStream(stream), + m_pos(0), + m_tee(new wxTeeInputStream(stream)), + m_dummy(BUFSIZE) +{ +} + +wxInputStream *wxRawInputStream::Open(wxInputStream *decomp) +{ + if (decomp) { + m_parent_i_stream = decomp; + m_pos = 0; + m_lasterror = wxSTREAM_NO_ERROR; + m_tee->Open(); + return this; + } else { + return NULL; + } +} + +size_t wxRawInputStream::OnSysRead(void *buffer, size_t size) +{ + char *buf = (char*)buffer; + size_t count = 0; + + while (count < size && IsOk()) + { + while (m_parent_i_stream->IsOk() && m_tee->GetCount() == 0) + m_parent_i_stream->Read(m_dummy.data(), BUFSIZE); + + size_t n = m_tee->GetData(buf + count, size - count); + count += n; + + if (n == 0 && m_tee->Final()) + m_lasterror = m_parent_i_stream->GetLastError(); + } + + m_pos += count; + return count; +} + + +///////////////////////////////////////////////////////////////////////////// +// Zlib streams than can be reused without recreating. + +class wxZlibOutputStream2 : public wxZlibOutputStream +{ +public: + wxZlibOutputStream2(wxOutputStream& stream, int level) : + wxZlibOutputStream(stream, level, wxZLIB_NO_HEADER) { } + + bool Open(wxOutputStream& stream); + bool Close() { DoFlush(true); m_pos = wxInvalidOffset; return IsOk(); } +}; + +bool wxZlibOutputStream2::Open(wxOutputStream& stream) +{ + wxCHECK(m_pos == wxInvalidOffset, false); + + m_deflate->next_out = m_z_buffer; + m_deflate->avail_out = m_z_size; + m_pos = 0; + m_lasterror = wxSTREAM_NO_ERROR; + m_parent_o_stream = &stream; + + if (deflateReset(m_deflate) != Z_OK) { + wxLogError(_("can't re-initialize zlib deflate stream")); + m_lasterror = wxSTREAM_WRITE_ERROR; + return false; + } + + return true; +} + +class wxZlibInputStream2 : public wxZlibInputStream +{ +public: + wxZlibInputStream2(wxInputStream& stream) : + wxZlibInputStream(stream, wxZLIB_NO_HEADER) { } + + bool Open(wxInputStream& stream); +}; + +bool wxZlibInputStream2::Open(wxInputStream& stream) +{ + m_inflate->avail_in = 0; + m_pos = 0; + m_lasterror = wxSTREAM_NO_ERROR; + m_parent_i_stream = &stream; + + if (inflateReset(m_inflate) != Z_OK) { + wxLogError(_("can't re-initialize zlib inflate stream")); + m_lasterror = wxSTREAM_READ_ERROR; + return false; + } + + return true; +} + + +///////////////////////////////////////////////////////////////////////////// +// Class to hold wxZipEntry's Extra and LocalExtra fields + +class wxZipMemory +{ +public: + wxZipMemory() : m_data(NULL), m_size(0), m_capacity(0), m_ref(1) { } + + wxZipMemory *AddRef() { m_ref++; return this; } + void Release() { if (--m_ref == 0) delete this; } + + char *GetData() const { return m_data; } + size_t GetSize() const { return m_size; } + size_t GetCapacity() const { return m_capacity; } + + wxZipMemory *Unique(size_t size); + +private: + ~wxZipMemory() { delete [] m_data; } + + char *m_data; + size_t m_size; + size_t m_capacity; + int m_ref; + + wxSUPPRESS_GCC_PRIVATE_DTOR_WARNING(wxZipMemory) +}; + +wxZipMemory *wxZipMemory::Unique(size_t size) +{ + wxZipMemory *zm; + + if (m_ref > 1) { + --m_ref; + zm = new wxZipMemory; + } else { + zm = this; + } + + if (zm->m_capacity < size) { + delete [] zm->m_data; + zm->m_data = new char[size]; + zm->m_capacity = size; + } + + zm->m_size = size; + return zm; +} + +static inline wxZipMemory *AddRef(wxZipMemory *zm) +{ + if (zm) + zm->AddRef(); + return zm; +} + +static inline void Release(wxZipMemory *zm) +{ + if (zm) + zm->Release(); +} + +static void Copy(wxZipMemory*& dest, wxZipMemory *src) +{ + Release(dest); + dest = AddRef(src); +} + +static void Unique(wxZipMemory*& zm, size_t size) +{ + if (!zm && size) + zm = new wxZipMemory; + if (zm) + zm = zm->Unique(size); +} + + +///////////////////////////////////////////////////////////////////////////// +// Collection of weak references to entries + +WX_DECLARE_HASH_MAP(long, wxZipEntry*, wxIntegerHash, + wxIntegerEqual, wxOffsetZipEntryMap_); + +class wxZipWeakLinks +{ +public: + wxZipWeakLinks() : m_ref(1) { } + + void Release(const wxZipInputStream* WXUNUSED(x)) + { if (--m_ref == 0) delete this; } + void Release(wxFileOffset key) + { RemoveEntry(key); if (--m_ref == 0) delete this; } + + wxZipWeakLinks *AddEntry(wxZipEntry *entry, wxFileOffset key); + void RemoveEntry(wxFileOffset key) + { m_entries.erase(wx_truncate_cast(key_type, key)); } + wxZipEntry *GetEntry(wxFileOffset key) const; + bool IsEmpty() const { return m_entries.empty(); } + +private: + ~wxZipWeakLinks() { wxASSERT(IsEmpty()); } + + typedef wxOffsetZipEntryMap_::key_type key_type; + + int m_ref; + wxOffsetZipEntryMap_ m_entries; + + wxSUPPRESS_GCC_PRIVATE_DTOR_WARNING(wxZipWeakLinks) +}; + +wxZipWeakLinks *wxZipWeakLinks::AddEntry(wxZipEntry *entry, wxFileOffset key) +{ + m_entries[wx_truncate_cast(key_type, key)] = entry; + m_ref++; + return this; +} + +wxZipEntry *wxZipWeakLinks::GetEntry(wxFileOffset key) const +{ + wxOffsetZipEntryMap_::const_iterator it = + m_entries.find(wx_truncate_cast(key_type, key)); + return it != m_entries.end() ? it->second : NULL; +} + + +///////////////////////////////////////////////////////////////////////////// +// ZipEntry + +wxZipEntry::wxZipEntry( + const wxString& name /*=wxEmptyString*/, + const wxDateTime& dt /*=wxDateTime::Now()*/, + wxFileOffset size /*=wxInvalidOffset*/) + : + m_SystemMadeBy(wxZIP_SYSTEM_MSDOS), + m_VersionMadeBy(wxMAJOR_VERSION * 10 + wxMINOR_VERSION), + m_VersionNeeded(VERSION_NEEDED_TO_EXTRACT), + m_Flags(0), + m_Method(wxZIP_METHOD_DEFAULT), + m_DateTime(dt), + m_Crc(0), + m_CompressedSize(wxInvalidOffset), + m_Size(size), + m_Key(wxInvalidOffset), + m_Offset(wxInvalidOffset), + m_DiskStart(0), + m_InternalAttributes(0), + m_ExternalAttributes(0), + m_Extra(NULL), + m_LocalExtra(NULL), + m_zipnotifier(NULL), + m_backlink(NULL) +{ + if (!name.empty()) + SetName(name); +} + +wxZipEntry::~wxZipEntry() +{ + if (m_backlink) + m_backlink->Release(m_Key); + Release(m_Extra); + Release(m_LocalExtra); +} + +wxZipEntry::wxZipEntry(const wxZipEntry& e) + : wxArchiveEntry(e), + m_SystemMadeBy(e.m_SystemMadeBy), + m_VersionMadeBy(e.m_VersionMadeBy), + m_VersionNeeded(e.m_VersionNeeded), + m_Flags(e.m_Flags), + m_Method(e.m_Method), + m_DateTime(e.m_DateTime), + m_Crc(e.m_Crc), + m_CompressedSize(e.m_CompressedSize), + m_Size(e.m_Size), + m_Name(e.m_Name), + m_Key(e.m_Key), + m_Offset(e.m_Offset), + m_Comment(e.m_Comment), + m_DiskStart(e.m_DiskStart), + m_InternalAttributes(e.m_InternalAttributes), + m_ExternalAttributes(e.m_ExternalAttributes), + m_Extra(AddRef(e.m_Extra)), + m_LocalExtra(AddRef(e.m_LocalExtra)), + m_zipnotifier(NULL), + m_backlink(NULL) +{ +} + +wxZipEntry& wxZipEntry::operator=(const wxZipEntry& e) +{ + if (&e != this) { + m_SystemMadeBy = e.m_SystemMadeBy; + m_VersionMadeBy = e.m_VersionMadeBy; + m_VersionNeeded = e.m_VersionNeeded; + m_Flags = e.m_Flags; + m_Method = e.m_Method; + m_DateTime = e.m_DateTime; + m_Crc = e.m_Crc; + m_CompressedSize = e.m_CompressedSize; + m_Size = e.m_Size; + m_Name = e.m_Name; + m_Key = e.m_Key; + m_Offset = e.m_Offset; + m_Comment = e.m_Comment; + m_DiskStart = e.m_DiskStart; + m_InternalAttributes = e.m_InternalAttributes; + m_ExternalAttributes = e.m_ExternalAttributes; + Copy(m_Extra, e.m_Extra); + Copy(m_LocalExtra, e.m_LocalExtra); + m_zipnotifier = NULL; + if (m_backlink) { + m_backlink->Release(m_Key); + m_backlink = NULL; + } + } + return *this; +} + +wxString wxZipEntry::GetName(wxPathFormat format /*=wxPATH_NATIVE*/) const +{ + bool isDir = IsDir() && !m_Name.empty(); + + // optimisations for common (and easy) cases + switch (wxFileName::GetFormat(format)) { + case wxPATH_DOS: + { + wxString name(isDir ? m_Name + _T("\\") : m_Name); + for (size_t i = 0; i < name.length(); i++) + if (name[i] == _T('/')) + name[i] = _T('\\'); + return name; + } + + case wxPATH_UNIX: + return isDir ? m_Name + _T("/") : m_Name; + + default: + ; + } + + wxFileName fn; + + if (isDir) + fn.AssignDir(m_Name, wxPATH_UNIX); + else + fn.Assign(m_Name, wxPATH_UNIX); + + return fn.GetFullPath(format); +} + +// Static - Internally tars and zips use forward slashes for the path +// separator, absolute paths aren't allowed, and directory names have a +// trailing slash. This function converts a path into this internal format, +// but without a trailing slash for a directory. +// +wxString wxZipEntry::GetInternalName(const wxString& name, + wxPathFormat format /*=wxPATH_NATIVE*/, + bool *pIsDir /*=NULL*/) +{ + wxString internal; + + if (wxFileName::GetFormat(format) != wxPATH_UNIX) + internal = wxFileName(name, format).GetFullPath(wxPATH_UNIX); + else + internal = name; + + bool isDir = !internal.empty() && internal.Last() == '/'; + if (pIsDir) + *pIsDir = isDir; + if (isDir) + internal.erase(internal.length() - 1); + + while (!internal.empty() && *internal.begin() == '/') + internal.erase(0, 1); + while (!internal.empty() && internal.compare(0, 2, _T("./")) == 0) + internal.erase(0, 2); + if (internal == _T(".") || internal == _T("..")) + internal = wxEmptyString; + + return internal; +} + +void wxZipEntry::SetSystemMadeBy(int system) +{ + int mode = GetMode(); + bool wasUnix = IsMadeByUnix(); + + m_SystemMadeBy = (wxUint8)system; + + if (!wasUnix && IsMadeByUnix()) { + SetIsDir(IsDir()); + SetMode(mode); + } else if (wasUnix && !IsMadeByUnix()) { + m_ExternalAttributes &= 0xffff; + } +} + +void wxZipEntry::SetIsDir(bool isDir /*=true*/) +{ + if (isDir) + m_ExternalAttributes |= wxZIP_A_SUBDIR; + else + m_ExternalAttributes &= ~wxZIP_A_SUBDIR; + + if (IsMadeByUnix()) { + m_ExternalAttributes &= ~wxZIP_S_IFMT; + if (isDir) + m_ExternalAttributes |= wxZIP_S_IFDIR; + else + m_ExternalAttributes |= wxZIP_S_IFREG; + } +} + +// Return unix style permission bits +// +int wxZipEntry::GetMode() const +{ + // return unix permissions if present + if (IsMadeByUnix()) + return (m_ExternalAttributes >> 16) & 0777; + + // otherwise synthesize from the dos attribs + int mode = 0644; + if (m_ExternalAttributes & wxZIP_A_RDONLY) + mode &= ~0200; + if (m_ExternalAttributes & wxZIP_A_SUBDIR) + mode |= 0111; + + return mode; +} + +// Set unix permissions +// +void wxZipEntry::SetMode(int mode) +{ + // Set dos attrib bits to be compatible + if (mode & 0222) + m_ExternalAttributes &= ~wxZIP_A_RDONLY; + else + m_ExternalAttributes |= wxZIP_A_RDONLY; + + // set the actual unix permission bits if the system type allows + if (IsMadeByUnix()) { + m_ExternalAttributes &= ~(0777L << 16); + m_ExternalAttributes |= (mode & 0777L) << 16; + } +} + +const char *wxZipEntry::GetExtra() const +{ + return m_Extra ? m_Extra->GetData() : NULL; +} + +size_t wxZipEntry::GetExtraLen() const +{ + return m_Extra ? m_Extra->GetSize() : 0; +} + +void wxZipEntry::SetExtra(const char *extra, size_t len) +{ + Unique(m_Extra, len); + if (len) + memcpy(m_Extra->GetData(), extra, len); +} + +const char *wxZipEntry::GetLocalExtra() const +{ + return m_LocalExtra ? m_LocalExtra->GetData() : NULL; +} + +size_t wxZipEntry::GetLocalExtraLen() const +{ + return m_LocalExtra ? m_LocalExtra->GetSize() : 0; +} + +void wxZipEntry::SetLocalExtra(const char *extra, size_t len) +{ + Unique(m_LocalExtra, len); + if (len) + memcpy(m_LocalExtra->GetData(), extra, len); +} + +void wxZipEntry::SetNotifier(wxZipNotifier& notifier) +{ + wxArchiveEntry::UnsetNotifier(); + m_zipnotifier = ¬ifier; + m_zipnotifier->OnEntryUpdated(*this); +} + +void wxZipEntry::Notify() +{ + if (m_zipnotifier) + m_zipnotifier->OnEntryUpdated(*this); + else if (GetNotifier()) + GetNotifier()->OnEntryUpdated(*this); +} + +void wxZipEntry::UnsetNotifier() +{ + wxArchiveEntry::UnsetNotifier(); + m_zipnotifier = NULL; +} + +size_t wxZipEntry::ReadLocal(wxInputStream& stream, wxMBConv& conv) +{ + wxUint16 nameLen, extraLen; + wxUint32 compressedSize, size, crc; + + wxZipHeader ds(stream, LOCAL_SIZE - 4); + if (!ds) + return 0; + + ds >> m_VersionNeeded >> m_Flags >> m_Method; + SetDateTime(wxDateTime().SetFromDOS(ds.Read32())); + ds >> crc >> compressedSize >> size >> nameLen >> extraLen; + + bool sumsValid = (m_Flags & wxZIP_SUMS_FOLLOW) == 0; + + if (sumsValid || crc) + m_Crc = crc; + if ((sumsValid || compressedSize) || m_Method == wxZIP_METHOD_STORE) + m_CompressedSize = compressedSize; + if ((sumsValid || size) || m_Method == wxZIP_METHOD_STORE) + m_Size = size; + + SetName(ReadString(stream, nameLen, conv), wxPATH_UNIX); + if (stream.LastRead() != nameLen + 0u) + return 0; + + if (extraLen || GetLocalExtraLen()) { + Unique(m_LocalExtra, extraLen); + if (extraLen) { + stream.Read(m_LocalExtra->GetData(), extraLen); + if (stream.LastRead() != extraLen + 0u) + return 0; + } + } + + return LOCAL_SIZE + nameLen + extraLen; +} + +size_t wxZipEntry::WriteLocal(wxOutputStream& stream, wxMBConv& conv) const +{ + wxString unixName = GetName(wxPATH_UNIX); + const wxWX2MBbuf name_buf = conv.cWX2MB(unixName); + const char *name = name_buf; + if (!name) name = ""; + wxUint16 nameLen = wx_truncate_cast(wxUint16, strlen(name)); + + wxDataOutputStream ds(stream); + + ds << m_VersionNeeded << m_Flags << m_Method; + ds.Write32(GetDateTime().GetAsDOS()); + + ds.Write32(m_Crc); + ds.Write32(m_CompressedSize != wxInvalidOffset ? + wx_truncate_cast(wxUint32, m_CompressedSize) : 0); + ds.Write32(m_Size != wxInvalidOffset ? + wx_truncate_cast(wxUint32, m_Size) : 0); + + ds << nameLen; + wxUint16 extraLen = wx_truncate_cast(wxUint16, GetLocalExtraLen()); + ds.Write16(extraLen); + + stream.Write(name, nameLen); + if (extraLen) + stream.Write(m_LocalExtra->GetData(), extraLen); + + return LOCAL_SIZE + nameLen + extraLen; +} + +size_t wxZipEntry::ReadCentral(wxInputStream& stream, wxMBConv& conv) +{ + wxUint16 nameLen, extraLen, commentLen; + + wxZipHeader ds(stream, CENTRAL_SIZE - 4); + if (!ds) + return 0; + + ds >> m_VersionMadeBy >> m_SystemMadeBy; + + SetVersionNeeded(ds.Read16()); + SetFlags(ds.Read16()); + SetMethod(ds.Read16()); + SetDateTime(wxDateTime().SetFromDOS(ds.Read32())); + SetCrc(ds.Read32()); + SetCompressedSize(ds.Read32()); + SetSize(ds.Read32()); + + ds >> nameLen >> extraLen >> commentLen + >> m_DiskStart >> m_InternalAttributes >> m_ExternalAttributes; + SetOffset(ds.Read32()); + + SetName(ReadString(stream, nameLen, conv), wxPATH_UNIX); + if (stream.LastRead() != nameLen + 0u) + return 0; + + if (extraLen || GetExtraLen()) { + Unique(m_Extra, extraLen); + if (extraLen) { + stream.Read(m_Extra->GetData(), extraLen); + if (stream.LastRead() != extraLen + 0u) + return 0; + } + } + + if (commentLen) { + m_Comment = ReadString(stream, commentLen, conv); + if (stream.LastRead() != commentLen + 0u) + return 0; + } else { + m_Comment.clear(); + } + + return CENTRAL_SIZE + nameLen + extraLen + commentLen; +} + +size_t wxZipEntry::WriteCentral(wxOutputStream& stream, wxMBConv& conv) const +{ + wxString unixName = GetName(wxPATH_UNIX); + const wxWX2MBbuf name_buf = conv.cWX2MB(unixName); + const char *name = name_buf; + if (!name) name = ""; + wxUint16 nameLen = wx_truncate_cast(wxUint16, strlen(name)); + + const wxWX2MBbuf comment_buf = conv.cWX2MB(m_Comment); + const char *comment = comment_buf; + if (!comment) comment = ""; + wxUint16 commentLen = wx_truncate_cast(wxUint16, strlen(comment)); + + wxUint16 extraLen = wx_truncate_cast(wxUint16, GetExtraLen()); + + wxDataOutputStream ds(stream); + + ds << CENTRAL_MAGIC << m_VersionMadeBy << m_SystemMadeBy; + + ds.Write16(wx_truncate_cast(wxUint16, GetVersionNeeded())); + ds.Write16(wx_truncate_cast(wxUint16, GetFlags())); + ds.Write16(wx_truncate_cast(wxUint16, GetMethod())); + ds.Write32(GetDateTime().GetAsDOS()); + ds.Write32(GetCrc()); + ds.Write32(wx_truncate_cast(wxUint32, GetCompressedSize())); + ds.Write32(wx_truncate_cast(wxUint32, GetSize())); + ds.Write16(nameLen); + ds.Write16(extraLen); + + ds << commentLen << m_DiskStart << m_InternalAttributes + << m_ExternalAttributes << wx_truncate_cast(wxUint32, GetOffset()); + + stream.Write(name, nameLen); + if (extraLen) + stream.Write(GetExtra(), extraLen); + stream.Write(comment, commentLen); + + return CENTRAL_SIZE + nameLen + extraLen + commentLen; +} + +// Info-zip prefixes this record with a signature, but pkzip doesn't. So if +// the 1st value is the signature then it is probably an info-zip record, +// though there is a small chance that it is in fact a pkzip record which +// happens to have the signature as it's CRC. +// +size_t wxZipEntry::ReadDescriptor(wxInputStream& stream) +{ + wxZipHeader ds(stream, SUMS_SIZE); + if (!ds) + return 0; + + m_Crc = ds.Read32(); + m_CompressedSize = ds.Read32(); + m_Size = ds.Read32(); + + // if 1st value is the signature then this is probably an info-zip record + if (m_Crc == SUMS_MAGIC) + { + wxZipHeader buf(stream, 8); + wxUint32 u1 = buf.GetSize() >= 4 ? buf.Read32() : (wxUint32)LOCAL_MAGIC; + wxUint32 u2 = buf.GetSize() == 8 ? buf.Read32() : 0; + + // look for the signature of the following record to decide which + if ((u1 == LOCAL_MAGIC || u1 == CENTRAL_MAGIC) && + (u2 != LOCAL_MAGIC && u2 != CENTRAL_MAGIC)) + { + // it's a pkzip style record after all! + if (buf.GetSize() > 0) + stream.Ungetch(buf.GetData(), buf.GetSize()); + } + else + { + // it's an info-zip record as expected + if (buf.GetSize() > 4) + stream.Ungetch(buf.GetData() + 4, buf.GetSize() - 4); + m_Crc = wx_truncate_cast(wxUint32, m_CompressedSize); + m_CompressedSize = m_Size; + m_Size = u1; + return SUMS_SIZE + 4; + } + } + + return SUMS_SIZE; +} + +size_t wxZipEntry::WriteDescriptor(wxOutputStream& stream, wxUint32 crc, + wxFileOffset compressedSize, wxFileOffset size) +{ + m_Crc = crc; + m_CompressedSize = compressedSize; + m_Size = size; + + wxDataOutputStream ds(stream); + + ds.Write32(crc); + ds.Write32(wx_truncate_cast(wxUint32, compressedSize)); + ds.Write32(wx_truncate_cast(wxUint32, size)); + + return SUMS_SIZE; +} + + +///////////////////////////////////////////////////////////////////////////// +// wxZipEndRec - holds the end of central directory record + +class wxZipEndRec +{ +public: + wxZipEndRec(); + + int GetDiskNumber() const { return m_DiskNumber; } + int GetStartDisk() const { return m_StartDisk; } + int GetEntriesHere() const { return m_EntriesHere; } + int GetTotalEntries() const { return m_TotalEntries; } + wxFileOffset GetSize() const { return m_Size; } + wxFileOffset GetOffset() const { return m_Offset; } + wxString GetComment() const { return m_Comment; } + + void SetDiskNumber(int num) + { m_DiskNumber = wx_truncate_cast(wxUint16, num); } + void SetStartDisk(int num) + { m_StartDisk = wx_truncate_cast(wxUint16, num); } + void SetEntriesHere(int num) + { m_EntriesHere = wx_truncate_cast(wxUint16, num); } + void SetTotalEntries(int num) + { m_TotalEntries = wx_truncate_cast(wxUint16, num); } + void SetSize(wxFileOffset size) + { m_Size = wx_truncate_cast(wxUint32, size); } + void SetOffset(wxFileOffset offset) + { m_Offset = wx_truncate_cast(wxUint32, offset); } + void SetComment(const wxString& comment) + { m_Comment = comment; } + + bool Read(wxInputStream& stream, wxMBConv& conv); + bool Write(wxOutputStream& stream, wxMBConv& conv) const; + +private: + wxUint16 m_DiskNumber; + wxUint16 m_StartDisk; + wxUint16 m_EntriesHere; + wxUint16 m_TotalEntries; + wxUint32 m_Size; + wxUint32 m_Offset; + wxString m_Comment; +}; + +wxZipEndRec::wxZipEndRec() + : m_DiskNumber(0), + m_StartDisk(0), + m_EntriesHere(0), + m_TotalEntries(0), + m_Size(0), + m_Offset(0) +{ +} + +bool wxZipEndRec::Write(wxOutputStream& stream, wxMBConv& conv) const +{ + const wxWX2MBbuf comment_buf = conv.cWX2MB(m_Comment); + const char *comment = comment_buf; + if (!comment) comment = ""; + wxUint16 commentLen = (wxUint16)strlen(comment); + + wxDataOutputStream ds(stream); + + ds << END_MAGIC << m_DiskNumber << m_StartDisk << m_EntriesHere + << m_TotalEntries << m_Size << m_Offset << commentLen; + + stream.Write(comment, commentLen); + + return stream.IsOk(); +} + +bool wxZipEndRec::Read(wxInputStream& stream, wxMBConv& conv) +{ + wxZipHeader ds(stream, END_SIZE - 4); + if (!ds) + return false; + + wxUint16 commentLen; + + ds >> m_DiskNumber >> m_StartDisk >> m_EntriesHere + >> m_TotalEntries >> m_Size >> m_Offset >> commentLen; + + if (commentLen) { + m_Comment = ReadString(stream, commentLen, conv); + if (stream.LastRead() != commentLen + 0u) + return false; + } + + if (m_DiskNumber != 0 || m_StartDisk != 0 || + m_EntriesHere != m_TotalEntries) + wxLogWarning(_("assuming this is a multi-part zip concatenated")); + + return true; +} + + +///////////////////////////////////////////////////////////////////////////// +// A weak link from an input stream to an output stream + +class wxZipStreamLink +{ +public: + wxZipStreamLink(wxZipOutputStream *stream) : m_ref(1), m_stream(stream) { } + + wxZipStreamLink *AddRef() { m_ref++; return this; } + wxZipOutputStream *GetOutputStream() const { return m_stream; } + + void Release(class wxZipInputStream *WXUNUSED(s)) + { if (--m_ref == 0) delete this; } + void Release(class wxZipOutputStream *WXUNUSED(s)) + { m_stream = NULL; if (--m_ref == 0) delete this; } + +private: + ~wxZipStreamLink() { } + + int m_ref; + wxZipOutputStream *m_stream; + + wxSUPPRESS_GCC_PRIVATE_DTOR_WARNING(wxZipStreamLink) +}; + + +///////////////////////////////////////////////////////////////////////////// +// Input stream + +// leave the default wxZipEntryPtr free for users +wxDECLARE_SCOPED_PTR(wxZipEntry, wxZipEntryPtr_) +wxDEFINE_SCOPED_PTR (wxZipEntry, wxZipEntryPtr_) + +// constructor +// +wxZipInputStream::wxZipInputStream(wxInputStream& stream, + wxMBConv& conv /*=wxConvLocal*/) + : wxArchiveInputStream(stream, conv) +{ + Init(); +} + +wxZipInputStream::wxZipInputStream(wxInputStream *stream, + wxMBConv& conv /*=wxConvLocal*/) + : wxArchiveInputStream(stream, conv) +{ + Init(); +} + +#if WXWIN_COMPATIBILITY_2_6 && wxUSE_FFILE + +// Part of the compatibility constructor, which has been made inline to +// avoid a problem with it not being exported by mingw 3.2.3 +// +void wxZipInputStream::Init(const wxString& file) +{ + // no error messages + wxLogNull nolog; + Init(); + m_allowSeeking = true; + wxFFileInputStream *ffile; + ffile = wx_static_cast(wxFFileInputStream*, m_parent_i_stream); + wxZipEntryPtr_ entry; + + if (ffile->Ok()) { + do { + entry.reset(GetNextEntry()); + } + while (entry.get() != NULL && entry->GetInternalName() != file); + } + + if (entry.get() == NULL) + m_lasterror = wxSTREAM_READ_ERROR; +} + +wxInputStream* wxZipInputStream::OpenFile(const wxString& archive) +{ + wxLogNull nolog; + return new wxFFileInputStream(archive); +} + +#endif // WXWIN_COMPATIBILITY_2_6 && wxUSE_FFILE + +void wxZipInputStream::Init() +{ + m_store = new wxStoredInputStream(*m_parent_i_stream); + m_inflate = NULL; + m_rawin = NULL; + m_raw = false; + m_headerSize = 0; + m_decomp = NULL; + m_parentSeekable = false; + m_weaklinks = new wxZipWeakLinks; + m_streamlink = NULL; + m_offsetAdjustment = 0; + m_position = wxInvalidOffset; + m_signature = 0; + m_TotalEntries = 0; + m_lasterror = m_parent_i_stream->GetLastError(); +#if WXWIN_COMPATIBILITY_2_6 + m_allowSeeking = false; +#endif +} + +wxZipInputStream::~wxZipInputStream() +{ + CloseDecompressor(m_decomp); + + delete m_store; + delete m_inflate; + delete m_rawin; + + m_weaklinks->Release(this); + + if (m_streamlink) + m_streamlink->Release(this); +} + +wxString wxZipInputStream::GetComment() +{ + if (m_position == wxInvalidOffset) + if (!LoadEndRecord()) + return wxEmptyString; + + if (!m_parentSeekable && Eof() && m_signature) { + m_lasterror = wxSTREAM_NO_ERROR; + m_lasterror = ReadLocal(true); + } + + return m_Comment; +} + +int wxZipInputStream::GetTotalEntries() +{ + if (m_position == wxInvalidOffset) + LoadEndRecord(); + return m_TotalEntries; +} + +wxZipStreamLink *wxZipInputStream::MakeLink(wxZipOutputStream *out) +{ + wxZipStreamLink *link = NULL; + + if (!m_parentSeekable && (IsOpened() || !Eof())) { + link = new wxZipStreamLink(out); + if (m_streamlink) + m_streamlink->Release(this); + m_streamlink = link->AddRef(); + } + + return link; +} + +bool wxZipInputStream::LoadEndRecord() +{ + wxCHECK(m_position == wxInvalidOffset, false); + if (!IsOk()) + return false; + + m_position = 0; + + // First find the end-of-central-directory record. + if (!FindEndRecord()) { + // failed, so either this is a non-seekable stream (ok), or not a zip + if (m_parentSeekable) { + m_lasterror = wxSTREAM_READ_ERROR; + wxLogError(_("invalid zip file")); + return false; + } + else { + wxLogNull nolog; + wxFileOffset pos = m_parent_i_stream->TellI(); + if (pos != wxInvalidOffset) + m_offsetAdjustment = m_position = pos; + return true; + } + } + + wxZipEndRec endrec; + + // Read in the end record + wxFileOffset endPos = m_parent_i_stream->TellI() - 4; + if (!endrec.Read(*m_parent_i_stream, GetConv())) + return false; + + m_TotalEntries = endrec.GetTotalEntries(); + m_Comment = endrec.GetComment(); + + // Now find the central-directory. we have the file offset of + // the CD, so look there first. + if (m_parent_i_stream->SeekI(endrec.GetOffset()) != wxInvalidOffset && + ReadSignature() == CENTRAL_MAGIC) { + m_signature = CENTRAL_MAGIC; + m_position = endrec.GetOffset(); + m_offsetAdjustment = 0; + return true; + } + + // If it's not there, then it could be that the zip has been appended + // to a self extractor, so take the CD size (also in endrec), subtract + // it from the file offset of the end-central-directory and look there. + if (m_parent_i_stream->SeekI(endPos - endrec.GetSize()) + != wxInvalidOffset && ReadSignature() == CENTRAL_MAGIC) { + m_signature = CENTRAL_MAGIC; + m_position = endPos - endrec.GetSize(); + m_offsetAdjustment = m_position - endrec.GetOffset(); + return true; + } + + wxLogError(_("can't find central directory in zip")); + m_lasterror = wxSTREAM_READ_ERROR; + return false; +} + +// Find the end-of-central-directory record. +// If found the stream will be positioned just past the 4 signature bytes. +// +bool wxZipInputStream::FindEndRecord() +{ + if (!m_parent_i_stream->IsSeekable()) + return false; + + // usually it's 22 bytes in size and the last thing in the file + { + wxLogNull nolog; + if (m_parent_i_stream->SeekI(-END_SIZE, wxFromEnd) == wxInvalidOffset) + return false; + } + + m_parentSeekable = true; + m_signature = 0; + char magic[4]; + if (m_parent_i_stream->Read(magic, 4).LastRead() != 4) + return false; + if ((m_signature = CrackUint32(magic)) == END_MAGIC) + return true; + + // unfortunately, the record has a comment field that can be up to 65535 + // bytes in length, so if the signature not found then search backwards. + wxFileOffset pos = m_parent_i_stream->TellI(); + const int BUFSIZE = 1024; + wxCharBuffer buf(BUFSIZE); + + memcpy(buf.data(), magic, 3); + wxFileOffset minpos = wxMax(pos - 65535L, 0); + + while (pos > minpos) { + size_t len = wx_truncate_cast(size_t, + pos - wxMax(pos - (BUFSIZE - 3), minpos)); + memcpy(buf.data() + len, buf, 3); + pos -= len; + + if (m_parent_i_stream->SeekI(pos, wxFromStart) == wxInvalidOffset || + m_parent_i_stream->Read(buf.data(), len).LastRead() != len) + return false; + + char *p = buf.data() + len; + + while (p-- > buf.data()) { + if ((m_signature = CrackUint32(p)) == END_MAGIC) { + size_t remainder = buf.data() + len - p; + if (remainder > 4) + m_parent_i_stream->Ungetch(p + 4, remainder - 4); + return true; + } + } + } + + return false; +} + +wxZipEntry *wxZipInputStream::GetNextEntry() +{ + if (m_position == wxInvalidOffset) + if (!LoadEndRecord()) + return NULL; + + m_lasterror = m_parentSeekable ? ReadCentral() : ReadLocal(); + if (!IsOk()) + return NULL; + + wxZipEntryPtr_ entry(new wxZipEntry(m_entry)); + entry->m_backlink = m_weaklinks->AddEntry(entry.get(), entry->GetKey()); + return entry.release(); +} + +wxStreamError wxZipInputStream::ReadCentral() +{ + if (!AtHeader()) + CloseEntry(); + + if (m_signature == END_MAGIC) + return wxSTREAM_EOF; + + if (m_signature != CENTRAL_MAGIC) { + wxLogError(_("error reading zip central directory")); + return wxSTREAM_READ_ERROR; + } + + if (QuietSeek(*m_parent_i_stream, m_position + 4) == wxInvalidOffset) + return wxSTREAM_READ_ERROR; + + size_t size = m_entry.ReadCentral(*m_parent_i_stream, GetConv()); + if (!size) { + m_signature = 0; + return wxSTREAM_READ_ERROR; + } + + m_position += size; + m_signature = ReadSignature(); + + if (m_offsetAdjustment) + m_entry.SetOffset(m_entry.GetOffset() + m_offsetAdjustment); + m_entry.SetKey(m_entry.GetOffset()); + + return wxSTREAM_NO_ERROR; +} + +wxStreamError wxZipInputStream::ReadLocal(bool readEndRec /*=false*/) +{ + if (!AtHeader()) + CloseEntry(); + + if (!m_signature) + m_signature = ReadSignature(); + + if (m_signature == CENTRAL_MAGIC || m_signature == END_MAGIC) { + if (m_streamlink && !m_streamlink->GetOutputStream()) { + m_streamlink->Release(this); + m_streamlink = NULL; + } + } + + while (m_signature == CENTRAL_MAGIC) { + if (m_weaklinks->IsEmpty() && m_streamlink == NULL) + return wxSTREAM_EOF; + + size_t size = m_entry.ReadCentral(*m_parent_i_stream, GetConv()); + m_position += size; + m_signature = 0; + if (!size) + return wxSTREAM_READ_ERROR; + + wxZipEntry *entry = m_weaklinks->GetEntry(m_entry.GetOffset()); + if (entry) { + entry->SetSystemMadeBy(m_entry.GetSystemMadeBy()); + entry->SetVersionMadeBy(m_entry.GetVersionMadeBy()); + entry->SetComment(m_entry.GetComment()); + entry->SetDiskStart(m_entry.GetDiskStart()); + entry->SetInternalAttributes(m_entry.GetInternalAttributes()); + entry->SetExternalAttributes(m_entry.GetExternalAttributes()); + Copy(entry->m_Extra, m_entry.m_Extra); + entry->Notify(); + m_weaklinks->RemoveEntry(entry->GetOffset()); + } + + m_signature = ReadSignature(); + } + + if (m_signature == END_MAGIC) { + if (readEndRec || m_streamlink) { + wxZipEndRec endrec; + endrec.Read(*m_parent_i_stream, GetConv()); + m_Comment = endrec.GetComment(); + m_signature = 0; + if (m_streamlink) { + m_streamlink->GetOutputStream()->SetComment(endrec.GetComment()); + m_streamlink->Release(this); + m_streamlink = NULL; + } + } + return wxSTREAM_EOF; + } + + if (m_signature == LOCAL_MAGIC) { + m_headerSize = m_entry.ReadLocal(*m_parent_i_stream, GetConv()); + m_signature = 0; + m_entry.SetOffset(m_position); + m_entry.SetKey(m_position); + + if (m_headerSize) { + m_TotalEntries++; + return wxSTREAM_NO_ERROR; + } + } + + wxLogError(_("error reading zip local header")); + return wxSTREAM_READ_ERROR; +} + +wxUint32 wxZipInputStream::ReadSignature() +{ + char magic[4]; + m_parent_i_stream->Read(magic, 4); + return m_parent_i_stream->LastRead() == 4 ? CrackUint32(magic) : 0; +} + +bool wxZipInputStream::OpenEntry(wxArchiveEntry& entry) +{ + wxZipEntry *zipEntry = wxStaticCast(&entry, wxZipEntry); + return zipEntry ? OpenEntry(*zipEntry) : false; +} + +// Open an entry +// +bool wxZipInputStream::DoOpen(wxZipEntry *entry, bool raw) +{ + if (m_position == wxInvalidOffset) + if (!LoadEndRecord()) + return false; + if (m_lasterror == wxSTREAM_READ_ERROR) + return false; + if (IsOpened()) + CloseEntry(); + + m_raw = raw; + + if (entry) { + if (AfterHeader() && entry->GetKey() == m_entry.GetOffset()) + return true; + // can only open the current entry on a non-seekable stream + wxCHECK(m_parentSeekable, false); + } + + m_lasterror = wxSTREAM_READ_ERROR; + + if (entry) + m_entry = *entry; + + if (m_parentSeekable) { + if (QuietSeek(*m_parent_i_stream, m_entry.GetOffset()) + == wxInvalidOffset) + return false; + if (ReadSignature() != LOCAL_MAGIC) { + wxLogError(_("bad zipfile offset to entry")); + return false; + } + } + + if (m_parentSeekable || AtHeader()) { + m_headerSize = m_entry.ReadLocal(*m_parent_i_stream, GetConv()); + if (m_headerSize && m_parentSeekable) { + wxZipEntry *ref = m_weaklinks->GetEntry(m_entry.GetKey()); + if (ref) { + Copy(ref->m_LocalExtra, m_entry.m_LocalExtra); + ref->Notify(); + m_weaklinks->RemoveEntry(ref->GetKey()); + } + if (entry && entry != ref) { + Copy(entry->m_LocalExtra, m_entry.m_LocalExtra); + entry->Notify(); + } + } + } + + if (m_headerSize) + m_lasterror = wxSTREAM_NO_ERROR; + return IsOk(); +} + +bool wxZipInputStream::OpenDecompressor(bool raw /*=false*/) +{ + wxASSERT(AfterHeader()); + + wxFileOffset compressedSize = m_entry.GetCompressedSize(); + + if (raw) + m_raw = true; + + if (m_raw) { + if (compressedSize != wxInvalidOffset) { + m_store->Open(compressedSize); + m_decomp = m_store; + } else { + if (!m_rawin) + m_rawin = new wxRawInputStream(*m_parent_i_stream); + m_decomp = m_rawin->Open(OpenDecompressor(m_rawin->GetTee())); + } + } else { + if (compressedSize != wxInvalidOffset && + (m_entry.GetMethod() != wxZIP_METHOD_DEFLATE || + wxZlibInputStream::CanHandleGZip())) { + m_store->Open(compressedSize); + m_decomp = OpenDecompressor(*m_store); + } else { + m_decomp = OpenDecompressor(*m_parent_i_stream); + } + } + + m_crcAccumulator = crc32(0, Z_NULL, 0); + m_lasterror = m_decomp ? m_decomp->GetLastError() : wxSTREAM_READ_ERROR; + return IsOk(); +} + +// Can be overriden to add support for additional decompression methods +// +wxInputStream *wxZipInputStream::OpenDecompressor(wxInputStream& stream) +{ + switch (m_entry.GetMethod()) { + case wxZIP_METHOD_STORE: + if (m_entry.GetSize() == wxInvalidOffset) { + wxLogError(_("stored file length not in Zip header")); + break; + } + m_store->Open(m_entry.GetSize()); + return m_store; + + case wxZIP_METHOD_DEFLATE: + if (!m_inflate) + m_inflate = new wxZlibInputStream2(stream); + else + m_inflate->Open(stream); + return m_inflate; + + default: + wxLogError(_("unsupported Zip compression method")); + } + + return NULL; +} + +bool wxZipInputStream::CloseDecompressor(wxInputStream *decomp) +{ + if (decomp && decomp == m_rawin) + return CloseDecompressor(m_rawin->GetFilterInputStream()); + if (decomp != m_store && decomp != m_inflate) + delete decomp; + return true; +} + +// Closes the current entry and positions the underlying stream at the start +// of the next entry +// +bool wxZipInputStream::CloseEntry() +{ + if (AtHeader()) + return true; + if (m_lasterror == wxSTREAM_READ_ERROR) + return false; + + if (!m_parentSeekable) { + if (!IsOpened() && !OpenDecompressor(true)) + return false; + + const int BUFSIZE = 8192; + wxCharBuffer buf(BUFSIZE); + while (IsOk()) + Read(buf.data(), BUFSIZE); + + m_position += m_headerSize + m_entry.GetCompressedSize(); + } + + if (m_lasterror == wxSTREAM_EOF) + m_lasterror = wxSTREAM_NO_ERROR; + + CloseDecompressor(m_decomp); + m_decomp = NULL; + m_entry = wxZipEntry(); + m_headerSize = 0; + m_raw = false; + + return IsOk(); +} + +size_t wxZipInputStream::OnSysRead(void *buffer, size_t size) +{ + if (!IsOpened()) + if ((AtHeader() && !DoOpen()) || !OpenDecompressor()) + m_lasterror = wxSTREAM_READ_ERROR; + if (!IsOk() || !size) + return 0; + + size_t count = m_decomp->Read(buffer, size).LastRead(); + if (!m_raw) + m_crcAccumulator = crc32(m_crcAccumulator, (Byte*)buffer, count); + if (count < size) + m_lasterror = m_decomp->GetLastError(); + + if (Eof()) { + if ((m_entry.GetFlags() & wxZIP_SUMS_FOLLOW) != 0) { + m_headerSize += m_entry.ReadDescriptor(*m_parent_i_stream); + wxZipEntry *entry = m_weaklinks->GetEntry(m_entry.GetKey()); + + if (entry) { + entry->SetCrc(m_entry.GetCrc()); + entry->SetCompressedSize(m_entry.GetCompressedSize()); + entry->SetSize(m_entry.GetSize()); + entry->Notify(); + } + } + + if (!m_raw) { + m_lasterror = wxSTREAM_READ_ERROR; + + if (m_entry.GetSize() != TellI()) + wxLogError(_("reading zip stream (entry %s): bad length"), + m_entry.GetName().c_str()); + else if (m_crcAccumulator != m_entry.GetCrc()) + wxLogError(_("reading zip stream (entry %s): bad crc"), + m_entry.GetName().c_str()); + else + m_lasterror = wxSTREAM_EOF; + } + } + + return count; +} + +#if WXWIN_COMPATIBILITY_2_6 + +// Borrowed from VS's zip stream (c) 1999 Vaclav Slavik +// +wxFileOffset wxZipInputStream::OnSysSeek(wxFileOffset seek, wxSeekMode mode) +{ + // seeking works when the stream is created with the compatibility + // constructor + if (!m_allowSeeking) + return wxInvalidOffset; + if (!IsOpened()) + if ((AtHeader() && !DoOpen()) || !OpenDecompressor()) + m_lasterror = wxSTREAM_READ_ERROR; + if (!IsOk()) + return wxInvalidOffset; + + // NB: since ZIP files don't natively support seeking, we have to + // implement a brute force workaround -- reading all the data + // between current and the new position (or between beginning of + // the file and new position...) + + wxFileOffset nextpos; + wxFileOffset pos = TellI(); + + switch ( mode ) + { + case wxFromCurrent : nextpos = seek + pos; break; + case wxFromStart : nextpos = seek; break; + case wxFromEnd : nextpos = GetLength() + seek; break; + default : nextpos = pos; break; /* just to fool compiler, never happens */ + } + + wxFileOffset toskip wxDUMMY_INITIALIZE(0); + if ( nextpos >= pos ) + { + toskip = nextpos - pos; + } + else + { + wxZipEntry current(m_entry); + if (!OpenEntry(current)) + { + m_lasterror = wxSTREAM_READ_ERROR; + return pos; + } + toskip = nextpos; + } + + if ( toskip > 0 ) + { + const int BUFSIZE = 4096; + size_t sz; + char buffer[BUFSIZE]; + while ( toskip > 0 ) + { + sz = wx_truncate_cast(size_t, wxMin(toskip, BUFSIZE)); + Read(buffer, sz); + toskip -= sz; + } + } + + pos = nextpos; + return pos; +} + +#endif // WXWIN_COMPATIBILITY_2_6 + + +///////////////////////////////////////////////////////////////////////////// +// Output stream + +#include "wx/listimpl.cpp" +WX_DEFINE_LIST(wxZipEntryList_) + +wxZipOutputStream::wxZipOutputStream(wxOutputStream& stream, + int level /*=-1*/, + wxMBConv& conv /*=wxConvLocal*/) + : wxArchiveOutputStream(stream, conv) +{ + Init(level); +} + +wxZipOutputStream::wxZipOutputStream(wxOutputStream *stream, + int level /*=-1*/, + wxMBConv& conv /*=wxConvLocal*/) + : wxArchiveOutputStream(stream, conv) +{ + Init(level); +} + +void wxZipOutputStream::Init(int level) +{ + m_store = new wxStoredOutputStream(*m_parent_o_stream); + m_deflate = NULL; + m_backlink = NULL; + m_initialData = new char[OUTPUT_LATENCY]; + m_initialSize = 0; + m_pending = NULL; + m_raw = false; + m_headerOffset = 0; + m_headerSize = 0; + m_entrySize = 0; + m_comp = NULL; + m_level = level; + m_offsetAdjustment = wxInvalidOffset; +} + +wxZipOutputStream::~wxZipOutputStream() +{ + Close(); + WX_CLEAR_LIST(wxZipEntryList_, m_entries); + delete m_store; + delete m_deflate; + delete m_pending; + delete [] m_initialData; + if (m_backlink) + m_backlink->Release(this); +} + +bool wxZipOutputStream::PutNextEntry( + const wxString& name, + const wxDateTime& dt /*=wxDateTime::Now()*/, + wxFileOffset size /*=wxInvalidOffset*/) +{ + return PutNextEntry(new wxZipEntry(name, dt, size)); +} + +bool wxZipOutputStream::PutNextDirEntry( + const wxString& name, + const wxDateTime& dt /*=wxDateTime::Now()*/) +{ + wxZipEntry *entry = new wxZipEntry(name, dt); + entry->SetIsDir(); + return PutNextEntry(entry); +} + +bool wxZipOutputStream::CopyEntry(wxZipEntry *entry, + wxZipInputStream& inputStream) +{ + wxZipEntryPtr_ e(entry); + + return + inputStream.DoOpen(e.get(), true) && + DoCreate(e.release(), true) && + Write(inputStream).IsOk() && inputStream.Eof(); +} + +bool wxZipOutputStream::PutNextEntry(wxArchiveEntry *entry) +{ + wxZipEntry *zipEntry = wxStaticCast(entry, wxZipEntry); + if (!zipEntry) + delete entry; + return PutNextEntry(zipEntry); +} + +bool wxZipOutputStream::CopyEntry(wxArchiveEntry *entry, + wxArchiveInputStream& stream) +{ + wxZipEntry *zipEntry = wxStaticCast(entry, wxZipEntry); + + if (!zipEntry || !stream.OpenEntry(*zipEntry)) { + delete entry; + return false; + } + + return CopyEntry(zipEntry, wx_static_cast(wxZipInputStream&, stream)); +} + +bool wxZipOutputStream::CopyArchiveMetaData(wxZipInputStream& inputStream) +{ + m_Comment = inputStream.GetComment(); + if (m_backlink) + m_backlink->Release(this); + m_backlink = inputStream.MakeLink(this); + return true; +} + +bool wxZipOutputStream::CopyArchiveMetaData(wxArchiveInputStream& stream) +{ + return CopyArchiveMetaData(wx_static_cast(wxZipInputStream&, stream)); +} + +void wxZipOutputStream::SetLevel(int level) +{ + if (level != m_level) { + if (m_comp != m_deflate) + delete m_deflate; + m_deflate = NULL; + m_level = level; + } +} + +bool wxZipOutputStream::DoCreate(wxZipEntry *entry, bool raw /*=false*/) +{ + CloseEntry(); + + m_pending = entry; + if (!m_pending) + return false; + + // write the signature bytes right away + wxDataOutputStream ds(*m_parent_o_stream); + ds << LOCAL_MAGIC; + + // and if this is the first entry test for seekability + if (m_headerOffset == 0 && m_parent_o_stream->IsSeekable()) { +#if wxUSE_LOG + bool logging = wxLog::IsEnabled(); + wxLogNull nolog; +#endif // wxUSE_LOG + wxFileOffset here = m_parent_o_stream->TellO(); + + if (here != wxInvalidOffset && here >= 4) { + if (m_parent_o_stream->SeekO(here - 4) == here - 4) { + m_offsetAdjustment = here - 4; +#if wxUSE_LOG + wxLog::EnableLogging(logging); +#endif // wxUSE_LOG + m_parent_o_stream->SeekO(here); + } + } + } + + m_pending->SetOffset(m_headerOffset); + + m_crcAccumulator = crc32(0, Z_NULL, 0); + + if (raw) + m_raw = true; + + m_lasterror = wxSTREAM_NO_ERROR; + return true; +} + +// Can be overriden to add support for additional compression methods +// +wxOutputStream *wxZipOutputStream::OpenCompressor( + wxOutputStream& stream, + wxZipEntry& entry, + const Buffer bufs[]) +{ + if (entry.GetMethod() == wxZIP_METHOD_DEFAULT) { + if (GetLevel() == 0 + && (IsParentSeekable() + || entry.GetCompressedSize() != wxInvalidOffset + || entry.GetSize() != wxInvalidOffset)) { + entry.SetMethod(wxZIP_METHOD_STORE); + } else { + int size = 0; + for (int i = 0; bufs[i].m_data; ++i) + size += bufs[i].m_size; + entry.SetMethod(size <= 6 ? + wxZIP_METHOD_STORE : wxZIP_METHOD_DEFLATE); + } + } + + switch (entry.GetMethod()) { + case wxZIP_METHOD_STORE: + if (entry.GetCompressedSize() == wxInvalidOffset) + entry.SetCompressedSize(entry.GetSize()); + return m_store; + + case wxZIP_METHOD_DEFLATE: + { + int defbits = wxZIP_DEFLATE_NORMAL; + switch (GetLevel()) { + case 0: case 1: + defbits = wxZIP_DEFLATE_SUPERFAST; + break; + case 2: case 3: case 4: + defbits = wxZIP_DEFLATE_FAST; + break; + case 8: case 9: + defbits = wxZIP_DEFLATE_EXTRA; + break; + } + entry.SetFlags((entry.GetFlags() & ~wxZIP_DEFLATE_MASK) | + defbits | wxZIP_SUMS_FOLLOW); + + if (!m_deflate) + m_deflate = new wxZlibOutputStream2(stream, GetLevel()); + else + m_deflate->Open(stream); + + return m_deflate; + } + + default: + wxLogError(_("unsupported Zip compression method")); + } + + return NULL; +} + +bool wxZipOutputStream::CloseCompressor(wxOutputStream *comp) +{ + if (comp == m_deflate) + m_deflate->Close(); + else if (comp != m_store) + delete comp; + return true; +} + +// This is called when OUPUT_LATENCY bytes has been written to the +// wxZipOutputStream to actually create the zip entry. +// +void wxZipOutputStream::CreatePendingEntry(const void *buffer, size_t size) +{ + wxASSERT(IsOk() && m_pending && !m_comp); + wxZipEntryPtr_ spPending(m_pending); + m_pending = NULL; + + Buffer bufs[] = { + { m_initialData, m_initialSize }, + { (const char*)buffer, size }, + { NULL, 0 } + }; + + if (m_raw) + m_comp = m_store; + else + m_comp = OpenCompressor(*m_store, *spPending, + m_initialSize ? bufs : bufs + 1); + + if (IsParentSeekable() + || (spPending->m_Crc + && spPending->m_CompressedSize != wxInvalidOffset + && spPending->m_Size != wxInvalidOffset)) + spPending->m_Flags &= ~wxZIP_SUMS_FOLLOW; + else + if (spPending->m_CompressedSize != wxInvalidOffset) + spPending->m_Flags |= wxZIP_SUMS_FOLLOW; + + m_headerSize = spPending->WriteLocal(*m_parent_o_stream, GetConv()); + m_lasterror = m_parent_o_stream->GetLastError(); + + if (IsOk()) { + m_entries.push_back(spPending.release()); + OnSysWrite(m_initialData, m_initialSize); + } + + m_initialSize = 0; +} + +// This is called to write out the zip entry when Close has been called +// before OUTPUT_LATENCY bytes has been written to the wxZipOutputStream. +// +void wxZipOutputStream::CreatePendingEntry() +{ + wxASSERT(IsOk() && m_pending && !m_comp); + wxZipEntryPtr_ spPending(m_pending); + m_pending = NULL; + m_lasterror = wxSTREAM_WRITE_ERROR; + + if (!m_raw) { + // Initially compresses the data to memory, then fall back to 'store' + // if the compressor makes the data larger rather than smaller. + wxMemoryOutputStream mem; + Buffer bufs[] = { { m_initialData, m_initialSize }, { NULL, 0 } }; + wxOutputStream *comp = OpenCompressor(mem, *spPending, bufs); + + if (!comp) + return; + if (comp != m_store) { + bool ok = comp->Write(m_initialData, m_initialSize).IsOk(); + CloseCompressor(comp); + if (!ok) + return; + } + + m_entrySize = m_initialSize; + m_crcAccumulator = crc32(0, (Byte*)m_initialData, m_initialSize); + + if (mem.GetSize() > 0 && mem.GetSize() < m_initialSize) { + m_initialSize = mem.GetSize(); + mem.CopyTo(m_initialData, m_initialSize); + } else { + spPending->SetMethod(wxZIP_METHOD_STORE); + } + + spPending->SetSize(m_entrySize); + spPending->SetCrc(m_crcAccumulator); + spPending->SetCompressedSize(m_initialSize); + } + + spPending->m_Flags &= ~wxZIP_SUMS_FOLLOW; + m_headerSize = spPending->WriteLocal(*m_parent_o_stream, GetConv()); + + if (m_parent_o_stream->IsOk()) { + m_entries.push_back(spPending.release()); + m_comp = m_store; + m_store->Write(m_initialData, m_initialSize); + } + + m_initialSize = 0; + m_lasterror = m_parent_o_stream->GetLastError(); +} + +// Write the 'central directory' and the 'end-central-directory' records. +// +bool wxZipOutputStream::Close() +{ + CloseEntry(); + + if (m_lasterror == wxSTREAM_WRITE_ERROR || m_entries.size() == 0) { + wxFilterOutputStream::Close(); + return false; + } + + wxZipEndRec endrec; + + endrec.SetEntriesHere(m_entries.size()); + endrec.SetTotalEntries(m_entries.size()); + endrec.SetOffset(m_headerOffset); + endrec.SetComment(m_Comment); + + wxZipEntryList_::iterator it; + wxFileOffset size = 0; + + for (it = m_entries.begin(); it != m_entries.end(); ++it) { + size += (*it)->WriteCentral(*m_parent_o_stream, GetConv()); + delete *it; + } + m_entries.clear(); + + endrec.SetSize(size); + endrec.Write(*m_parent_o_stream, GetConv()); + + m_lasterror = m_parent_o_stream->GetLastError(); + + if (!wxFilterOutputStream::Close() || !IsOk()) + return false; + m_lasterror = wxSTREAM_EOF; + return true; +} + +// Finish writing the current entry +// +bool wxZipOutputStream::CloseEntry() +{ + if (IsOk() && m_pending) + CreatePendingEntry(); + if (!IsOk()) + return false; + if (!m_comp) + return true; + + CloseCompressor(m_comp); + m_comp = NULL; + + wxFileOffset compressedSize = m_store->TellO(); + + wxZipEntry& entry = *m_entries.back(); + + // When writing raw the crc and size can't be checked + if (m_raw) { + m_crcAccumulator = entry.GetCrc(); + m_entrySize = entry.GetSize(); + } + + // Write the sums in the trailing 'data descriptor' if necessary + if (entry.m_Flags & wxZIP_SUMS_FOLLOW) { + wxASSERT(!IsParentSeekable()); + m_headerOffset += + entry.WriteDescriptor(*m_parent_o_stream, m_crcAccumulator, + compressedSize, m_entrySize); + m_lasterror = m_parent_o_stream->GetLastError(); + } + + // If the local header didn't have the correct crc and size written to + // it then seek back and fix it + else if (m_crcAccumulator != entry.GetCrc() + || m_entrySize != entry.GetSize() + || compressedSize != entry.GetCompressedSize()) + { + if (IsParentSeekable()) { + wxFileOffset here = m_parent_o_stream->TellO(); + wxFileOffset headerOffset = m_headerOffset + m_offsetAdjustment; + m_parent_o_stream->SeekO(headerOffset + SUMS_OFFSET); + entry.WriteDescriptor(*m_parent_o_stream, m_crcAccumulator, + compressedSize, m_entrySize); + m_parent_o_stream->SeekO(here); + m_lasterror = m_parent_o_stream->GetLastError(); + } else { + m_lasterror = wxSTREAM_WRITE_ERROR; + } + } + + m_headerOffset += m_headerSize + compressedSize; + m_headerSize = 0; + m_entrySize = 0; + m_store->Close(); + m_raw = false; + + if (IsOk()) + m_lasterror = m_parent_o_stream->GetLastError(); + else + wxLogError(_("error writing zip entry '%s': bad crc or length"), + entry.GetName().c_str()); + return IsOk(); +} + +void wxZipOutputStream::Sync() +{ + if (IsOk() && m_pending) + CreatePendingEntry(NULL, 0); + if (!m_comp) + m_lasterror = wxSTREAM_WRITE_ERROR; + if (IsOk()) { + m_comp->Sync(); + m_lasterror = m_comp->GetLastError(); + } +} + +size_t wxZipOutputStream::OnSysWrite(const void *buffer, size_t size) +{ + if (IsOk() && m_pending) { + if (m_initialSize + size < OUTPUT_LATENCY) { + memcpy(m_initialData + m_initialSize, buffer, size); + m_initialSize += size; + return size; + } else { + CreatePendingEntry(buffer, size); + } + } + + if (!m_comp) + m_lasterror = wxSTREAM_WRITE_ERROR; + if (!IsOk() || !size) + return 0; + + if (m_comp->Write(buffer, size).LastWrite() != size) + m_lasterror = wxSTREAM_WRITE_ERROR; + m_crcAccumulator = crc32(m_crcAccumulator, (Byte*)buffer, size); + m_entrySize += m_comp->LastWrite(); + + return m_comp->LastWrite(); +} + +#endif // wxUSE_ZIPSTREAM diff --git a/Externals/wxWidgets/src/common/zstream.cpp b/Externals/wxWidgets/src/common/zstream.cpp new file mode 100644 index 0000000000..a3a4270071 --- /dev/null +++ b/Externals/wxWidgets/src/common/zstream.cpp @@ -0,0 +1,428 @@ +////////////////////////////////////////////////////////////////////////////// +// Name: src/common/zstream.cpp +// Purpose: Compressed stream classes +// Author: Guilhem Lavaux +// Modified by: Mike Wetherell +// Created: 11/07/98 +// RCS-ID: $Id: zstream.cpp 42621 2006-10-29 16:47:20Z MW $ +// Copyright: (c) Guilhem Lavaux +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_ZLIB && wxUSE_STREAMS + +#include "wx/zstream.h" + +#ifndef WX_PRECOMP + #include "wx/intl.h" + #include "wx/log.h" + #include "wx/utils.h" +#endif + + +// normally, the compiler options should contain -I../zlib, but it is +// apparently not the case for all MSW makefiles and so, unless we use +// configure (which defines __WX_SETUP_H__) or it is explicitly overridden by +// the user (who can define wxUSE_ZLIB_H_IN_PATH), we hardcode the path here +#if defined(__WXMSW__) && !defined(__WX_SETUP_H__) && !defined(wxUSE_ZLIB_H_IN_PATH) + #include "../zlib/zlib.h" +#else + #include "zlib.h" +#endif + +enum { + ZSTREAM_BUFFER_SIZE = 16384, + ZSTREAM_GZIP = 0x10, // gzip header + ZSTREAM_AUTO = 0x20 // auto detect between gzip and zlib +}; + + +///////////////////////////////////////////////////////////////////////////// +// Zlib Class factory + +IMPLEMENT_DYNAMIC_CLASS(wxZlibClassFactory, wxFilterClassFactory) + +static wxZlibClassFactory g_wxZlibClassFactory; + +wxZlibClassFactory::wxZlibClassFactory() +{ + if (this == &g_wxZlibClassFactory) + PushFront(); +} + +const wxChar * const * +wxZlibClassFactory::GetProtocols(wxStreamProtocolType type) const +{ + static const wxChar *mimes[] = { _T("application/x-deflate"), NULL }; + static const wxChar *encs[] = { _T("deflate"), NULL }; + static const wxChar *empty[] = { NULL }; + + switch (type) { + case wxSTREAM_MIMETYPE: return mimes; + case wxSTREAM_ENCODING: return encs; + default: return empty; + } +} + + +///////////////////////////////////////////////////////////////////////////// +// Gzip Class factory + +IMPLEMENT_DYNAMIC_CLASS(wxGzipClassFactory, wxFilterClassFactory) + +static wxGzipClassFactory g_wxGzipClassFactory; + +wxGzipClassFactory::wxGzipClassFactory() +{ + if (this == &g_wxGzipClassFactory && wxZlibInputStream::CanHandleGZip()) + PushFront(); +} + +const wxChar * const * +wxGzipClassFactory::GetProtocols(wxStreamProtocolType type) const +{ + static const wxChar *protos[] = + { _T("gzip"), NULL }; + static const wxChar *mimes[] = + { _T("application/gzip"), _T("application/x-gzip"), NULL }; + static const wxChar *encs[] = + { _T("gzip"), NULL }; + static const wxChar *exts[] = + { _T(".gz"), _T(".gzip"), NULL }; + static const wxChar *empty[] = + { NULL }; + + switch (type) { + case wxSTREAM_PROTOCOL: return protos; + case wxSTREAM_MIMETYPE: return mimes; + case wxSTREAM_ENCODING: return encs; + case wxSTREAM_FILEEXT: return exts; + default: return empty; + } +} + + +////////////////////// +// wxZlibInputStream +////////////////////// + +wxZlibInputStream::wxZlibInputStream(wxInputStream& stream, int flags) + : wxFilterInputStream(stream) +{ + Init(flags); +} + +wxZlibInputStream::wxZlibInputStream(wxInputStream *stream, int flags) + : wxFilterInputStream(stream) +{ + Init(flags); +} + +void wxZlibInputStream::Init(int flags) +{ + m_inflate = NULL; + m_z_buffer = new unsigned char[ZSTREAM_BUFFER_SIZE]; + m_z_size = ZSTREAM_BUFFER_SIZE; + m_pos = 0; + +#if WXWIN_COMPATIBILITY_2_4 + // treat compatibility mode as auto + m_24compatibilty = flags == wxZLIB_24COMPATIBLE; + if (m_24compatibilty) + flags = wxZLIB_AUTO; +#endif + + // if gzip is asked for but not supported... + if ((flags == wxZLIB_GZIP || flags == wxZLIB_AUTO) && !CanHandleGZip()) { + if (flags == wxZLIB_AUTO) { + // an error will come later if the input turns out not to be a zlib + flags = wxZLIB_ZLIB; + } + else { + wxLogError(_("Gzip not supported by this version of zlib")); + m_lasterror = wxSTREAM_READ_ERROR; + return; + } + } + + if (m_z_buffer) { + m_inflate = new z_stream_s; + + if (m_inflate) { + memset(m_inflate, 0, sizeof(z_stream_s)); + + // see zlib.h for documentation on windowBits + int windowBits = MAX_WBITS; + switch (flags) { + case wxZLIB_NO_HEADER: windowBits = -MAX_WBITS; break; + case wxZLIB_ZLIB: windowBits = MAX_WBITS; break; + case wxZLIB_GZIP: windowBits = MAX_WBITS | ZSTREAM_GZIP; break; + case wxZLIB_AUTO: windowBits = MAX_WBITS | ZSTREAM_AUTO; break; + default: wxFAIL_MSG(wxT("Invalid zlib flag")); + } + + if (inflateInit2(m_inflate, windowBits) == Z_OK) + return; + } + } + + wxLogError(_("Can't initialize zlib inflate stream.")); + m_lasterror = wxSTREAM_READ_ERROR; +} + +wxZlibInputStream::~wxZlibInputStream() +{ + inflateEnd(m_inflate); + delete m_inflate; + + delete [] m_z_buffer; +} + +size_t wxZlibInputStream::OnSysRead(void *buffer, size_t size) +{ + wxASSERT_MSG(m_inflate && m_z_buffer, wxT("Inflate stream not open")); + + if (!m_inflate || !m_z_buffer) + m_lasterror = wxSTREAM_READ_ERROR; + if (!IsOk() || !size) + return 0; + + int err = Z_OK; + m_inflate->next_out = (unsigned char *)buffer; + m_inflate->avail_out = size; + + while (err == Z_OK && m_inflate->avail_out > 0) { + if (m_inflate->avail_in == 0 && m_parent_i_stream->IsOk()) { + m_parent_i_stream->Read(m_z_buffer, m_z_size); + m_inflate->next_in = m_z_buffer; + m_inflate->avail_in = m_parent_i_stream->LastRead(); + } + err = inflate(m_inflate, Z_SYNC_FLUSH); + } + + switch (err) { + case Z_OK: + break; + + case Z_STREAM_END: + if (m_inflate->avail_out) { + // Unread any data taken from past the end of the deflate stream, so that + // any additional data can be read from the underlying stream (the crc + // in a gzip for example) + if (m_inflate->avail_in) { + m_parent_i_stream->Reset(); + m_parent_i_stream->Ungetch(m_inflate->next_in, m_inflate->avail_in); + m_inflate->avail_in = 0; + } + m_lasterror = wxSTREAM_EOF; + } + break; + + case Z_BUF_ERROR: + // Indicates that zlib was expecting more data, but the parent stream + // has none. Other than Eof the error will have been already reported + // by the parent strean, + m_lasterror = wxSTREAM_READ_ERROR; + if (m_parent_i_stream->Eof()) +#if WXWIN_COMPATIBILITY_2_4 + if (m_24compatibilty) + m_lasterror = wxSTREAM_EOF; + else +#endif + wxLogError(_("Can't read inflate stream: unexpected EOF in underlying stream.")); + break; + + default: + wxString msg(m_inflate->msg, *wxConvCurrent); + if (!msg) + msg = wxString::Format(_("zlib error %d"), err); + wxLogError(_("Can't read from inflate stream: %s"), msg.c_str()); + m_lasterror = wxSTREAM_READ_ERROR; + } + + size -= m_inflate->avail_out; + m_pos += size; + return size; +} + +/* static */ bool wxZlibInputStream::CanHandleGZip() +{ + const char *dot = strchr(zlibVersion(), '.'); + int major = atoi(zlibVersion()); + int minor = dot ? atoi(dot + 1) : 0; + return major > 1 || (major == 1 && minor >= 2); +} + + +////////////////////// +// wxZlibOutputStream +////////////////////// + +wxZlibOutputStream::wxZlibOutputStream(wxOutputStream& stream, + int level, + int flags) + : wxFilterOutputStream(stream) +{ + Init(level, flags); +} + +wxZlibOutputStream::wxZlibOutputStream(wxOutputStream *stream, + int level, + int flags) + : wxFilterOutputStream(stream) +{ + Init(level, flags); +} + +void wxZlibOutputStream::Init(int level, int flags) +{ + m_deflate = NULL; + m_z_buffer = new unsigned char[ZSTREAM_BUFFER_SIZE]; + m_z_size = ZSTREAM_BUFFER_SIZE; + m_pos = 0; + + if ( level == -1 ) + { + level = Z_DEFAULT_COMPRESSION; + } + else + { + wxASSERT_MSG(level >= 0 && level <= 9, wxT("wxZlibOutputStream compression level must be between 0 and 9!")); + } + + // if gzip is asked for but not supported... + if (flags == wxZLIB_GZIP && !CanHandleGZip()) { + wxLogError(_("Gzip not supported by this version of zlib")); + m_lasterror = wxSTREAM_WRITE_ERROR; + return; + } + + if (m_z_buffer) { + m_deflate = new z_stream_s; + + if (m_deflate) { + memset(m_deflate, 0, sizeof(z_stream_s)); + m_deflate->next_out = m_z_buffer; + m_deflate->avail_out = m_z_size; + + // see zlib.h for documentation on windowBits + int windowBits = MAX_WBITS; + switch (flags) { + case wxZLIB_NO_HEADER: windowBits = -MAX_WBITS; break; + case wxZLIB_ZLIB: windowBits = MAX_WBITS; break; + case wxZLIB_GZIP: windowBits = MAX_WBITS | ZSTREAM_GZIP; break; + default: wxFAIL_MSG(wxT("Invalid zlib flag")); + } + + if (deflateInit2(m_deflate, level, Z_DEFLATED, windowBits, + 8, Z_DEFAULT_STRATEGY) == Z_OK) + return; + } + } + + wxLogError(_("Can't initialize zlib deflate stream.")); + m_lasterror = wxSTREAM_WRITE_ERROR; +} + +bool wxZlibOutputStream::Close() + { + DoFlush(true); + deflateEnd(m_deflate); + delete m_deflate; + + m_deflate = NULL; + delete[] m_z_buffer; + m_z_buffer = NULL; + + return wxFilterOutputStream::Close() && IsOk(); + } + +void wxZlibOutputStream::DoFlush(bool final) +{ + if (!m_deflate || !m_z_buffer) + m_lasterror = wxSTREAM_WRITE_ERROR; + if (!IsOk()) + return; + + int err = Z_OK; + bool done = false; + + while (err == Z_OK || err == Z_STREAM_END) { + size_t len = m_z_size - m_deflate->avail_out; + if (len) { + if (m_parent_o_stream->Write(m_z_buffer, len).LastWrite() != len) { + m_lasterror = wxSTREAM_WRITE_ERROR; + wxLogDebug(wxT("wxZlibOutputStream: Error writing to underlying stream")); + break; + } + m_deflate->next_out = m_z_buffer; + m_deflate->avail_out = m_z_size; + } + + if (done) + break; + err = deflate(m_deflate, final ? Z_FINISH : Z_FULL_FLUSH); + done = m_deflate->avail_out != 0 || err == Z_STREAM_END; + } +} + +size_t wxZlibOutputStream::OnSysWrite(const void *buffer, size_t size) +{ + wxASSERT_MSG(m_deflate && m_z_buffer, wxT("Deflate stream not open")); + + if (!m_deflate || !m_z_buffer) + { + // notice that this will make IsOk() test just below return false + m_lasterror = wxSTREAM_WRITE_ERROR; + } + + if (!IsOk() || !size) + return 0; + + int err = Z_OK; + m_deflate->next_in = (unsigned char *)buffer; + m_deflate->avail_in = size; + + while (err == Z_OK && m_deflate->avail_in > 0) { + if (m_deflate->avail_out == 0) { + m_parent_o_stream->Write(m_z_buffer, m_z_size); + if (m_parent_o_stream->LastWrite() != m_z_size) { + m_lasterror = wxSTREAM_WRITE_ERROR; + wxLogDebug(wxT("wxZlibOutputStream: Error writing to underlying stream")); + break; + } + + m_deflate->next_out = m_z_buffer; + m_deflate->avail_out = m_z_size; + } + + err = deflate(m_deflate, Z_NO_FLUSH); + } + + if (err != Z_OK) { + m_lasterror = wxSTREAM_WRITE_ERROR; + wxString msg(m_deflate->msg, *wxConvCurrent); + if (!msg) + msg = wxString::Format(_("zlib error %d"), err); + wxLogError(_("Can't write to deflate stream: %s"), msg.c_str()); + } + + size -= m_deflate->avail_in; + m_pos += size; + return size; +} + +/* static */ bool wxZlibOutputStream::CanHandleGZip() +{ + return wxZlibInputStream::CanHandleGZip(); +} + +#endif + // wxUSE_ZLIB && wxUSE_STREAMS diff --git a/Externals/wxWidgets/src/generic/aboutdlgg.cpp b/Externals/wxWidgets/src/generic/aboutdlgg.cpp new file mode 100644 index 0000000000..e5e5535839 --- /dev/null +++ b/Externals/wxWidgets/src/generic/aboutdlgg.cpp @@ -0,0 +1,245 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/generic/aboutdlgg.cpp +// Purpose: implements wxGenericAboutBox() function +// Author: Vadim Zeitlin +// Created: 2006-10-08 +// RCS-ID: $Id: aboutdlgg.cpp 49560 2007-10-31 16:08:18Z VZ $ +// Copyright: (c) 2006 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// for compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_ABOUTDLG + +#ifndef WX_PRECOMP + #include "wx/sizer.h" + #include "wx/statbmp.h" + #include "wx/stattext.h" + #include "wx/button.h" +#endif //WX_PRECOMP + +#include "wx/aboutdlg.h" +#include "wx/generic/aboutdlgg.h" + +#include "wx/hyperlink.h" +#include "wx/collpane.h" + +// ============================================================================ +// implementation +// ============================================================================ + +// helper function: returns all array elements in a single comma-separated and +// newline-terminated string +static wxString AllAsString(const wxArrayString& a) +{ + wxString s; + const size_t count = a.size(); + s.reserve(20*count); + for ( size_t n = 0; n < count; n++ ) + { + s << a[n] << (n == count - 1 ? _T("\n") : _T(", ")); + } + + return s; +} + +// ---------------------------------------------------------------------------- +// wxAboutDialogInfo +// ---------------------------------------------------------------------------- + +wxString wxAboutDialogInfo::GetDescriptionAndCredits() const +{ + wxString s = GetDescription(); + if ( !s.empty() ) + s << _T('\n'); + + if ( HasDevelopers() ) + s << _T('\n') << _("Developed by ") << AllAsString(GetDevelopers()); + + if ( HasDocWriters() ) + s << _T('\n') << _("Documentation by ") << AllAsString(GetDocWriters()); + + if ( HasArtists() ) + s << _T('\n') << _("Graphics art by ") << AllAsString(GetArtists()); + + if ( HasTranslators() ) + s << _T('\n') << _("Translations by ") << AllAsString(GetTranslators()); + + return s; +} + +wxIcon wxAboutDialogInfo::GetIcon() const +{ + wxIcon icon = m_icon; + if ( !icon.Ok() && wxTheApp ) + { + const wxTopLevelWindow * const + tlw = wxDynamicCast(wxTheApp->GetTopWindow(), wxTopLevelWindow); + if ( tlw ) + icon = tlw->GetIcon(); + } + + return icon; +} + +// ---------------------------------------------------------------------------- +// wxGenericAboutDialog +// ---------------------------------------------------------------------------- + +bool wxGenericAboutDialog::Create(const wxAboutDialogInfo& info) +{ + // TODO: should we use main frame as parent by default here? + if ( !wxDialog::Create(NULL, wxID_ANY, _("About ") + info.GetName(), + wxDefaultPosition, wxDefaultSize, wxRESIZE_BORDER|wxDEFAULT_DIALOG_STYLE) ) + return false; + + m_sizerText = new wxBoxSizer(wxVERTICAL); + wxString nameAndVersion = info.GetName(); + if ( info.HasVersion() ) + nameAndVersion << _T(' ') << info.GetVersion(); + wxStaticText *label = new wxStaticText(this, wxID_ANY, nameAndVersion); + wxFont fontBig(*wxNORMAL_FONT); + fontBig.SetPointSize(fontBig.GetPointSize() + 2); + fontBig.SetWeight(wxFONTWEIGHT_BOLD); + label->SetFont(fontBig); + + m_sizerText->Add(label, wxSizerFlags().Centre().Border()); + m_sizerText->AddSpacer(5); + + AddText(info.GetCopyright()); + AddText(info.GetDescription()); + + if ( info.HasWebSite() ) + { +#if wxUSE_HYPERLINKCTRL + AddControl(new wxHyperlinkCtrl(this, wxID_ANY, + info.GetWebSiteDescription(), + info.GetWebSiteURL())); +#else + AddText(info.GetWebSiteURL()); +#endif // wxUSE_HYPERLINKCTRL/!wxUSE_HYPERLINKCTRL + } + +#if wxUSE_COLLPANE + if ( info.HasLicence() ) + AddCollapsiblePane(_("License"), info.GetLicence()); + + if ( info.HasDevelopers() ) + AddCollapsiblePane(_("Developers"), + AllAsString(info.GetDevelopers())); + + if ( info.HasDocWriters() ) + AddCollapsiblePane(_("Documentation writers"), + AllAsString(info.GetDocWriters())); + + if ( info.HasArtists() ) + AddCollapsiblePane(_("Artists"), + AllAsString(info.GetArtists())); + + if ( info.HasTranslators() ) + AddCollapsiblePane(_("Translators"), + AllAsString(info.GetTranslators())); +#endif // wxUSE_COLLPANE + + DoAddCustomControls(); + + + wxSizer *sizerIconAndText = new wxBoxSizer(wxHORIZONTAL); +#if wxUSE_STATBMP + wxIcon icon = info.GetIcon(); + if ( icon.Ok() ) + { + sizerIconAndText->Add(new wxStaticBitmap(this, wxID_ANY, icon), + wxSizerFlags().Border(wxRIGHT)); + } +#endif // wxUSE_STATBMP + sizerIconAndText->Add(m_sizerText, wxSizerFlags(1).Expand()); + + wxSizer *sizerTop = new wxBoxSizer(wxVERTICAL); + sizerTop->Add(sizerIconAndText, wxSizerFlags(1).Expand().Border()); + + wxSizer *sizerBtns = CreateButtonSizer(wxOK); + if ( sizerBtns ) + { + sizerTop->Add(sizerBtns, wxSizerFlags().Expand().Border()); + } + + SetSizerAndFit(sizerTop); + + CentreOnScreen(); + + return true; +} + +void wxGenericAboutDialog::AddControl(wxWindow *win, const wxSizerFlags& flags) +{ + wxCHECK_RET( m_sizerText, _T("can only be called after Create()") ); + wxASSERT_MSG( win, _T("can't add NULL window to about dialog") ); + + m_sizerText->Add(win, flags); +} + +void wxGenericAboutDialog::AddControl(wxWindow *win) +{ + AddControl(win, wxSizerFlags().Border(wxDOWN).Centre()); +} + +void wxGenericAboutDialog::AddText(const wxString& text) +{ + if ( !text.empty() ) + AddControl(new wxStaticText(this, wxID_ANY, text)); +} + +void wxGenericAboutDialog::AddCollapsiblePane(const wxString& title, + const wxString& text) +{ + wxCollapsiblePane *pane = new wxCollapsiblePane(this, wxID_ANY, title); + wxStaticText *txt = new wxStaticText(pane->GetPane(), wxID_ANY, text, + wxDefaultPosition, wxDefaultSize, + wxALIGN_CENTRE); + + // don't make the text unreasonably wide + static const int maxWidth = wxGetDisplaySize().x/3; + txt->Wrap(maxWidth); + + // NB: all the wxCollapsiblePanes must be added with a null proportion value + m_sizerText->Add(pane, wxSizerFlags(0).Expand().Border(wxBOTTOM)); +} + +// ---------------------------------------------------------------------------- +// public functions +// ---------------------------------------------------------------------------- + +void wxGenericAboutBox(const wxAboutDialogInfo& info) +{ + wxGenericAboutDialog dlg(info); + dlg.ShowModal(); +} + +// currently wxAboutBox is implemented natively only under these platforms, for +// the others we provide a generic fallback here +#if !defined(__WXMSW__) && !defined(__WXMAC__) && !defined(__WXGTK26__) + +void wxAboutBox(const wxAboutDialogInfo& info) +{ + wxGenericAboutBox(info); +} + +#endif // platforms without native about dialog + + +#endif // wxUSE_ABOUTDLG diff --git a/Externals/wxWidgets/src/generic/accel.cpp b/Externals/wxWidgets/src/generic/accel.cpp new file mode 100644 index 0000000000..232fa69e29 --- /dev/null +++ b/Externals/wxWidgets/src/generic/accel.cpp @@ -0,0 +1,220 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/generic/accel.cpp +// Purpose: generic implementation of wxAcceleratorTable class +// Author: Robert Roebling +// Modified: VZ pn 31.05.01: use typed lists, Unicode cleanup, Add/Remove +// Id: $Id: accel.cpp 41751 2006-10-08 21:56:55Z VZ $ +// Copyright: (c) 1998 Robert Roebling +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_ACCEL + +#ifndef WX_PRECOMP + #include "wx/list.h" + #include "wx/event.h" +#endif // WX_PRECOMP + +#include "wx/accel.h" + +#include + +// ---------------------------------------------------------------------------- +// wxAccelList: a list of wxAcceleratorEntries +// ---------------------------------------------------------------------------- + +WX_DECLARE_LIST(wxAcceleratorEntry, wxAccelList); +#include "wx/listimpl.cpp" +WX_DEFINE_LIST(wxAccelList) + +// ---------------------------------------------------------------------------- +// wxAccelRefData: the data used by wxAcceleratorTable +// ---------------------------------------------------------------------------- + +class wxAccelRefData : public wxObjectRefData +{ +public: + wxAccelRefData() + { + } + + wxAccelRefData(const wxAccelRefData& data) + : wxObjectRefData() + { + m_accels = data.m_accels; + } + + virtual ~wxAccelRefData() + { + WX_CLEAR_LIST(wxAccelList, m_accels); + } + + wxAccelList m_accels; +}; + +// macro which can be used to access wxAccelRefData from wxAcceleratorTable +#define M_ACCELDATA ((wxAccelRefData *)m_refData) + + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxAcceleratorTable ctors +// ---------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxAcceleratorTable, wxObject) + +wxAcceleratorTable::wxAcceleratorTable() +{ +} + +wxAcceleratorTable::wxAcceleratorTable(int n, const wxAcceleratorEntry entries[]) +{ + m_refData = new wxAccelRefData; + + for ( int i = 0; i < n; i++ ) + { + const wxAcceleratorEntry& entry = entries[i]; + + int keycode = entry.GetKeyCode(); + if ( isascii(keycode) ) + keycode = toupper(keycode); + + M_ACCELDATA->m_accels.Append(new wxAcceleratorEntry(entry.GetFlags(), + keycode, + entry.GetCommand())); + } +} + +wxAcceleratorTable::~wxAcceleratorTable() +{ +} + +bool wxAcceleratorTable::IsOk() const +{ + return m_refData != NULL; +} + +// ---------------------------------------------------------------------------- +// wxAcceleratorTable updating +// ---------------------------------------------------------------------------- + +void wxAcceleratorTable::Add(const wxAcceleratorEntry& entry) +{ + AllocExclusive(); + + if ( !m_refData ) + { + m_refData = new wxAccelRefData; + } + + M_ACCELDATA->m_accels.Append(new wxAcceleratorEntry(entry)); +} + +void wxAcceleratorTable::Remove(const wxAcceleratorEntry& entry) +{ + AllocExclusive(); + + wxAccelList::compatibility_iterator node = M_ACCELDATA->m_accels.GetFirst(); + while ( node ) + { + const wxAcceleratorEntry *entryCur = node->GetData(); + + // given entry contains only the information of the accelerator key + // because it was set that way during creation so do not use the + // comparison operator which also checks the command field + if ((entryCur->GetKeyCode() == entry.GetKeyCode()) && + (entryCur->GetFlags() == entry.GetFlags())) + { + delete node->GetData(); + M_ACCELDATA->m_accels.Erase(node); + + return; + } + + node = node->GetNext(); + } + + wxFAIL_MSG(_T("deleting inexistent accel from wxAcceleratorTable")); +} + +// ---------------------------------------------------------------------------- +// wxAcceleratorTable: find a command for the given key press +// ---------------------------------------------------------------------------- + +const wxAcceleratorEntry * +wxAcceleratorTable::GetEntry(const wxKeyEvent& event) const +{ + if ( !Ok() ) + { + // not an error, the accel table is just empty + return NULL; + } + + wxAccelList::compatibility_iterator node = M_ACCELDATA->m_accels.GetFirst(); + while ( node ) + { + const wxAcceleratorEntry *entry = node->GetData(); + + // is the key the same? + if ( event.m_keyCode == entry->GetKeyCode() ) + { + int flags = entry->GetFlags(); + + // now check flags + if ( (((flags & wxACCEL_CTRL) != 0) == event.ControlDown()) && + (((flags & wxACCEL_SHIFT) != 0) == event.ShiftDown()) && + (((flags & wxACCEL_ALT) != 0) == event.AltDown()) ) + { + return entry; + } + } + + node = node->GetNext(); + } + + return NULL; +} + +wxMenuItem *wxAcceleratorTable::GetMenuItem(const wxKeyEvent& event) const +{ + const wxAcceleratorEntry *entry = GetEntry(event); + + return entry ? entry->GetMenuItem() : NULL; +} + +int wxAcceleratorTable::GetCommand(const wxKeyEvent& event) const +{ + const wxAcceleratorEntry *entry = GetEntry(event); + + return entry ? entry->GetCommand() : -1; +} + +wxObjectRefData *wxAcceleratorTable::CreateRefData() const +{ + return new wxAccelRefData; +} + +wxObjectRefData *wxAcceleratorTable::CloneRefData(const wxObjectRefData *data) const +{ + return new wxAccelRefData(*(wxAccelRefData *)data); +} + +#endif // wxUSE_ACCEL diff --git a/Externals/wxWidgets/src/generic/animateg.cpp b/Externals/wxWidgets/src/generic/animateg.cpp new file mode 100644 index 0000000000..83ec4a7eab --- /dev/null +++ b/Externals/wxWidgets/src/generic/animateg.cpp @@ -0,0 +1,690 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: animateg.cpp +// Purpose: wxAnimation and wxAnimationCtrl +// Author: Julian Smart and Guillermo Rodriguez Garcia +// Modified by: Francesco Montorsi +// Created: 13/8/99 +// RCS-ID: $Id: animateg.cpp 48085 2007-08-15 11:36:50Z VZ $ +// Copyright: (c) Julian Smart and Guillermo Rodriguez Garcia +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif //__BORLANDC__ + +#if wxUSE_ANIMATIONCTRL && (!defined(__WXGTK20__) || defined(__WXUNIVERSAL__)) + +#include "wx/animate.h" + +#ifndef WX_PRECOMP + #include "wx/log.h" + #include "wx/image.h" + #include "wx/dcmemory.h" + #include "wx/dcclient.h" + #include "wx/module.h" +#endif + +#include "wx/wfstream.h" +#include "wx/gifdecod.h" +#include "wx/anidecod.h" + +#include "wx/listimpl.cpp" +WX_DEFINE_LIST(wxAnimationDecoderList) + +wxAnimationDecoderList wxAnimation::sm_handlers; + + +// ---------------------------------------------------------------------------- +// wxAnimation +// ---------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxAnimation, wxAnimationBase) +#define M_ANIMDATA wx_static_cast(wxAnimationDecoder*, m_refData) + +wxSize wxAnimation::GetSize() const +{ + wxCHECK_MSG( IsOk(), wxDefaultSize, wxT("invalid animation") ); + + return M_ANIMDATA->GetAnimationSize(); +} + +unsigned int wxAnimation::GetFrameCount() const +{ + wxCHECK_MSG( IsOk(), 0, wxT("invalid animation") ); + + return M_ANIMDATA->GetFrameCount(); +} + +wxImage wxAnimation::GetFrame(unsigned int i) const +{ + wxCHECK_MSG( IsOk(), wxNullImage, wxT("invalid animation") ); + + wxImage ret; + if (!M_ANIMDATA->ConvertToImage(i, &ret)) + return wxNullImage; + return ret; +} + +int wxAnimation::GetDelay(unsigned int i) const +{ + wxCHECK_MSG( IsOk(), 0, wxT("invalid animation") ); + + return M_ANIMDATA->GetDelay(i); +} + +wxPoint wxAnimation::GetFramePosition(unsigned int frame) const +{ + wxCHECK_MSG( IsOk(), wxDefaultPosition, wxT("invalid animation") ); + + return M_ANIMDATA->GetFramePosition(frame); +} + +wxSize wxAnimation::GetFrameSize(unsigned int frame) const +{ + wxCHECK_MSG( IsOk(), wxDefaultSize, wxT("invalid animation") ); + + return M_ANIMDATA->GetFrameSize(frame); +} + +wxAnimationDisposal wxAnimation::GetDisposalMethod(unsigned int frame) const +{ + wxCHECK_MSG( IsOk(), wxANIM_UNSPECIFIED, wxT("invalid animation") ); + + return M_ANIMDATA->GetDisposalMethod(frame); +} + +wxColour wxAnimation::GetTransparentColour(unsigned int frame) const +{ + wxCHECK_MSG( IsOk(), wxNullColour, wxT("invalid animation") ); + + return M_ANIMDATA->GetTransparentColour(frame); +} + +wxColour wxAnimation::GetBackgroundColour() const +{ + wxCHECK_MSG( IsOk(), wxNullColour, wxT("invalid animation") ); + + return M_ANIMDATA->GetBackgroundColour(); +} + +bool wxAnimation::LoadFile(const wxString& filename, wxAnimationType type) +{ + wxFileInputStream stream(filename); + if ( !stream.IsOk() ) + return false; + + return Load(stream, type); +} + +bool wxAnimation::Load(wxInputStream &stream, wxAnimationType type) +{ + UnRef(); + + const wxAnimationDecoder *handler; + if ( type == wxANIMATION_TYPE_ANY ) + { + for ( wxAnimationDecoderList::compatibility_iterator node = sm_handlers.GetFirst(); + node; node = node->GetNext() ) + { + handler=(const wxAnimationDecoder*)node->GetData(); + + if ( handler->CanRead(stream) ) + { + // do a copy of the handler from the static list which we will own + // as our reference data + m_refData = handler->Clone(); + return M_ANIMDATA->Load(stream); + } + + } + + wxLogWarning( _("No handler found for animation type.") ); + return false; + } + + handler = FindHandler(type); + + // do a copy of the handler from the static list which we will own + // as our reference data + m_refData = handler->Clone(); + + if (handler == NULL) + { + wxLogWarning( _("No animation handler for type %ld defined."), type ); + + return false; + } + + if (stream.IsSeekable() && !M_ANIMDATA->CanRead(stream)) + { + wxLogError(_("Animation file is not of type %ld."), type); + return false; + } + else + return M_ANIMDATA->Load(stream); +} + + +// ---------------------------------------------------------------------------- +// animation decoders +// ---------------------------------------------------------------------------- + +void wxAnimation::AddHandler( wxAnimationDecoder *handler ) +{ + // Check for an existing handler of the type being added. + if (FindHandler( handler->GetType() ) == 0) + { + sm_handlers.Append( handler ); + } + else + { + // This is not documented behaviour, merely the simplest 'fix' + // for preventing duplicate additions. If someone ever has + // a good reason to add and remove duplicate handlers (and they + // may) we should probably refcount the duplicates. + + wxLogDebug( _T("Adding duplicate animation handler for '%d' type"), + handler->GetType() ); + delete handler; + } +} + +void wxAnimation::InsertHandler( wxAnimationDecoder *handler ) +{ + // Check for an existing handler of the type being added. + if (FindHandler( handler->GetType() ) == 0) + { + sm_handlers.Insert( handler ); + } + else + { + // see AddHandler for additional comments. + wxLogDebug( _T("Inserting duplicate animation handler for '%d' type"), + handler->GetType() ); + delete handler; + } +} + +const wxAnimationDecoder *wxAnimation::FindHandler( wxAnimationType animType ) +{ + wxAnimationDecoderList::compatibility_iterator node = sm_handlers.GetFirst(); + while (node) + { + const wxAnimationDecoder *handler = (const wxAnimationDecoder *)node->GetData(); + if (handler->GetType() == animType) return handler; + node = node->GetNext(); + } + return 0; +} + +void wxAnimation::InitStandardHandlers() +{ +#if wxUSE_GIF + AddHandler(new wxGIFDecoder); +#endif // wxUSE_GIF +#if wxUSE_ICO_CUR + AddHandler(new wxANIDecoder); +#endif // wxUSE_ICO_CUR +} + +void wxAnimation::CleanUpHandlers() +{ + wxAnimationDecoderList::compatibility_iterator node = sm_handlers.GetFirst(); + while (node) + { + wxAnimationDecoder *handler = (wxAnimationDecoder *)node->GetData(); + wxAnimationDecoderList::compatibility_iterator next = node->GetNext(); + delete handler; + node = next; + } + + sm_handlers.Clear(); +} + + +// A module to allow wxAnimation initialization/cleanup +// without calling these functions from app.cpp or from +// the user's application. + +class wxAnimationModule: public wxModule +{ +DECLARE_DYNAMIC_CLASS(wxAnimationModule) +public: + wxAnimationModule() {} + bool OnInit() { wxAnimation::InitStandardHandlers(); return true; } + void OnExit() { wxAnimation::CleanUpHandlers(); } +}; + +IMPLEMENT_DYNAMIC_CLASS(wxAnimationModule, wxModule) + + +// ---------------------------------------------------------------------------- +// wxAnimationCtrl +// ---------------------------------------------------------------------------- + +IMPLEMENT_CLASS(wxAnimationCtrl, wxAnimationCtrlBase) +BEGIN_EVENT_TABLE(wxAnimationCtrl, wxAnimationCtrlBase) + EVT_PAINT(wxAnimationCtrl::OnPaint) + EVT_SIZE(wxAnimationCtrl::OnSize) + EVT_TIMER(wxID_ANY, wxAnimationCtrl::OnTimer) +END_EVENT_TABLE() + +void wxAnimationCtrl::Init() +{ + m_currentFrame = 0; + m_looped = false; + m_isPlaying = false; + + // use the window background colour by default to be consistent + // with the GTK+ native version + m_useWinBackgroundColour = true; +} + +bool wxAnimationCtrl::Create(wxWindow *parent, wxWindowID id, + const wxAnimation& animation, const wxPoint& pos, + const wxSize& size, long style, const wxString& name) +{ + m_timer.SetOwner(this); + + if (!base_type::Create(parent, id, pos, size, style, wxDefaultValidator, name)) + return false; + + // by default we get the same background colour of our parent + SetBackgroundColour(parent->GetBackgroundColour()); + + SetAnimation(animation); + + return true; +} + +wxAnimationCtrl::~wxAnimationCtrl() +{ + Stop(); +} + +bool wxAnimationCtrl::LoadFile(const wxString& filename, wxAnimationType type) +{ + wxAnimation anim; + if (!anim.LoadFile(filename, type) || + !anim.IsOk()) + return false; + + SetAnimation(anim); + return true; +} + +wxSize wxAnimationCtrl::DoGetBestSize() const +{ + if (m_animation.IsOk() && !this->HasFlag(wxAC_NO_AUTORESIZE)) + return m_animation.GetSize(); + + return wxSize(100, 100); +} + +void wxAnimationCtrl::SetAnimation(const wxAnimation& animation) +{ + if (IsPlaying()) + Stop(); + + // set new animation even if it's wxNullAnimation + m_animation = animation; + if (!m_animation.IsOk()) + { + DisplayStaticImage(); + return; + } + + if (m_animation.GetBackgroundColour() == wxNullColour) + SetUseWindowBackgroundColour(); + if (!this->HasFlag(wxAC_NO_AUTORESIZE)) + FitToAnimation(); + + DisplayStaticImage(); +} + +void wxAnimationCtrl::SetInactiveBitmap(const wxBitmap &bmp) +{ + // if the bitmap has an associated mask, we need to set our background to + // the colour of our parent otherwise when calling DrawCurrentFrame() + // (which uses the bitmap's mask), our background colour would be used for + // transparent areas - and that's not what we want (at least for + // consistency with the GTK version) + if ( bmp.GetMask() != NULL && GetParent() != NULL ) + SetBackgroundColour(GetParent()->GetBackgroundColour()); + + wxAnimationCtrlBase::SetInactiveBitmap(bmp); +} + +void wxAnimationCtrl::FitToAnimation() +{ + SetSize(m_animation.GetSize()); +} + +bool wxAnimationCtrl::SetBackgroundColour(const wxColour& colour) +{ + if ( !wxWindow::SetBackgroundColour(colour) ) + return false; + + // if not playing, then this change must be seen immediately (unless + // there's an inactive bitmap set which has higher priority than bg colour) + if ( !IsPlaying() ) + DisplayStaticImage(); + + return true; +} + + +// ---------------------------------------------------------------------------- +// wxAnimationCtrl - stop/play methods +// ---------------------------------------------------------------------------- + +void wxAnimationCtrl::Stop() +{ + m_timer.Stop(); + m_isPlaying = false; + + // reset frame counter + m_currentFrame = 0; + + DisplayStaticImage(); +} + +bool wxAnimationCtrl::Play(bool looped) +{ + if (!m_animation.IsOk()) + return false; + + m_looped = looped; + m_currentFrame = 0; + + if (!RebuildBackingStoreUpToFrame(0)) + return false; + + m_isPlaying = true; + + // do a ClearBackground() to avoid that e.g. the custom static bitmap which + // was eventually shown previously remains partially drawn + ClearBackground(); + + // DrawCurrentFrame() will use our updated backing store + wxClientDC clientDC(this); + DrawCurrentFrame(clientDC); + + // start the timer + int delay = m_animation.GetDelay(0); + if (delay == 0) + delay = 1; // 0 is invalid timeout for wxTimer. + m_timer.Start(delay, true); + + return true; +} + + + +// ---------------------------------------------------------------------------- +// wxAnimationCtrl - rendering methods +// ---------------------------------------------------------------------------- + +bool wxAnimationCtrl::RebuildBackingStoreUpToFrame(unsigned int frame) +{ + // if we've not created the backing store yet or it's too + // small, then recreate it + wxSize sz = m_animation.GetSize(), + winsz = GetClientSize(); + int w = wxMin(sz.GetWidth(), winsz.GetWidth()); + int h = wxMin(sz.GetHeight(), winsz.GetHeight()); + + if ( !m_backingStore.IsOk() || + m_backingStore.GetWidth() < w || m_backingStore.GetHeight() < h ) + { + if (!m_backingStore.Create(w, h)) + return false; + } + + wxMemoryDC dc; + dc.SelectObject(m_backingStore); + + // Draw the background + DisposeToBackground(dc); + + // Draw all intermediate frames that haven't been removed from the animation + for (unsigned int i = 0; i < frame; i++) + { + if (m_animation.GetDisposalMethod(i) == wxANIM_DONOTREMOVE || + m_animation.GetDisposalMethod(i) == wxANIM_UNSPECIFIED) + { + DrawFrame(dc, i); + } + else if (m_animation.GetDisposalMethod(i) == wxANIM_TOBACKGROUND) + DisposeToBackground(dc, m_animation.GetFramePosition(i), + m_animation.GetFrameSize(i)); + } + + // finally draw this frame + DrawFrame(dc, frame); + dc.SelectObject(wxNullBitmap); + + return true; +} + +void wxAnimationCtrl::IncrementalUpdateBackingStore() +{ + wxMemoryDC dc; + dc.SelectObject(m_backingStore); + + // OPTIMIZATION: + // since wxAnimationCtrl can only play animations forward, without skipping + // frames, we can be sure that m_backingStore contains the m_currentFrame-1 + // frame and thus we just need to dispose the m_currentFrame-1 frame and + // render the m_currentFrame-th one. + + if (m_currentFrame == 0) + { + // before drawing the first frame always dispose to bg colour + DisposeToBackground(dc); + } + else + { + switch (m_animation.GetDisposalMethod(m_currentFrame-1)) + { + case wxANIM_TOBACKGROUND: + DisposeToBackground(dc, m_animation.GetFramePosition(m_currentFrame-1), + m_animation.GetFrameSize(m_currentFrame-1)); + break; + + case wxANIM_TOPREVIOUS: + // this disposal should never be used too often. + // E.g. GIF specification explicitely say to keep the usage of this + // disposal limited to the minimum. + // In fact it may require a lot of time to restore + if (m_currentFrame == 1) + { + // if 0-th frame disposal is to restore to previous frame, + // the best we can do is to restore to background + DisposeToBackground(dc); + } + else + if (!RebuildBackingStoreUpToFrame(m_currentFrame-2)) + Stop(); + break; + + case wxANIM_DONOTREMOVE: + case wxANIM_UNSPECIFIED: + break; + } + } + + // now just draw the current frame on the top of the backing store + DrawFrame(dc, m_currentFrame); + dc.SelectObject(wxNullBitmap); +} + +void wxAnimationCtrl::DisplayStaticImage() +{ + wxASSERT(!IsPlaying()); + + // m_bmpStaticReal will be updated only if necessary... + UpdateStaticImage(); + + if (m_bmpStaticReal.IsOk()) + { + // copy the inactive bitmap in the backing store + // eventually using the mask if the static bitmap has one + if ( m_bmpStaticReal.GetMask() ) + { + wxMemoryDC temp; + temp.SelectObject(m_backingStore); + DisposeToBackground(temp); + temp.DrawBitmap(m_bmpStaticReal, 0, 0, true /* use mask */); + } + else + m_backingStore = m_bmpStaticReal; + } + else + { + // put in the backing store the first frame of the animation + if (!m_animation.IsOk() || + !RebuildBackingStoreUpToFrame(0)) + { + m_animation = wxNullAnimation; + DisposeToBackground(); + } + } + + Refresh(); +} + +void wxAnimationCtrl::DrawFrame(wxDC &dc, unsigned int frame) +{ + // PERFORMANCE NOTE: + // this draw stuff is not as fast as possible: the wxAnimationDecoder + // needs first to convert from its internal format to wxImage RGB24; + // the wxImage is then converted as a wxBitmap and finally blitted. + // If wxAnimationDecoder had a function to convert directly from its + // internal format to a port-specific wxBitmap, it would be somewhat faster. + wxBitmap bmp(m_animation.GetFrame(frame)); + dc.DrawBitmap(bmp, m_animation.GetFramePosition(frame), + true /* use mask */); +} + +void wxAnimationCtrl::DrawCurrentFrame(wxDC& dc) +{ + wxASSERT( m_backingStore.IsOk() ); + + // m_backingStore always contains the current frame + dc.DrawBitmap(m_backingStore, 0, 0, true /* use mask in case it's present */); +} + +void wxAnimationCtrl::DisposeToBackground() +{ + // clear the backing store + wxMemoryDC dc; + dc.SelectObject(m_backingStore); + if ( dc.IsOk() ) + DisposeToBackground(dc); +} + +void wxAnimationCtrl::DisposeToBackground(wxDC& dc) +{ + wxColour col = IsUsingWindowBackgroundColour() + ? GetBackgroundColour() + : m_animation.GetBackgroundColour(); + + wxBrush brush(col); + dc.SetBackground(brush); + dc.Clear(); +} + +void wxAnimationCtrl::DisposeToBackground(wxDC& dc, const wxPoint &pos, const wxSize &sz) +{ + wxColour col = IsUsingWindowBackgroundColour() + ? GetBackgroundColour() + : m_animation.GetBackgroundColour(); + wxBrush brush(col); + dc.SetBrush(brush); // SetBrush and not SetBackground !! + dc.SetPen(*wxTRANSPARENT_PEN); + dc.DrawRectangle(pos, sz); +} + +// ---------------------------------------------------------------------------- +// wxAnimationCtrl - event handlers +// ---------------------------------------------------------------------------- + +void wxAnimationCtrl::OnPaint(wxPaintEvent& WXUNUSED(event)) +{ + // VERY IMPORTANT: the wxPaintDC *must* be created in any case + wxPaintDC dc(this); + + if ( m_backingStore.IsOk() ) + { + // NOTE: we draw the bitmap explicitely ignoring the mask (if any); + // i.e. we don't want to combine the backing store with the + // possibly wrong preexisting contents of the window! + dc.DrawBitmap(m_backingStore, 0, 0, false /* no mask */); + } + else + { + // m_animation is not valid and thus we don't have a valid backing store... + // clear then our area to the background colour + DisposeToBackground(dc); + } +} + +void wxAnimationCtrl::OnTimer(wxTimerEvent &WXUNUSED(event)) +{ + m_currentFrame++; + if (m_currentFrame == m_animation.GetFrameCount()) + { + // Should a non-looped animation display the last frame? + if (!m_looped) + { + Stop(); + return; + } + else + m_currentFrame = 0; // let's restart + } + + IncrementalUpdateBackingStore(); + + wxClientDC dc(this); + DrawCurrentFrame(dc); + +#ifdef __WXMAC__ + // without this, the animation currently doesn't redraw under Mac + Refresh(); +#endif // __WXMAC__ + + // Set the timer for the next frame + int delay = m_animation.GetDelay(m_currentFrame); + if (delay == 0) + delay = 1; // 0 is invalid timeout for wxTimer. + m_timer.Start(delay, true); +} + +void wxAnimationCtrl::OnSize(wxSizeEvent &WXUNUSED(event)) +{ + // NB: resizing an animation control may take a lot of time + // for big animations as the backing store must be + // extended and rebuilt. Try to avoid it e.g. using + // a null proportion value for your wxAnimationCtrls + // when using them inside sizers. + if (m_animation.IsOk()) + { + // be careful to change the backing store *only* if we are + // playing the animation as otherwise we may be displaying + // the inactive bitmap and overwriting the backing store + // with the last played frame is wrong in this case + if (IsPlaying()) + { + if (!RebuildBackingStoreUpToFrame(m_currentFrame)) + Stop(); // in case we are playing + } + } +} + +#endif // wxUSE_ANIMATIONCTRL + diff --git a/Externals/wxWidgets/src/generic/bmpcboxg.cpp b/Externals/wxWidgets/src/generic/bmpcboxg.cpp new file mode 100644 index 0000000000..1689e9d173 --- /dev/null +++ b/Externals/wxWidgets/src/generic/bmpcboxg.cpp @@ -0,0 +1,477 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/generic/bmpcboxg.cpp +// Purpose: wxBitmapComboBox +// Author: Jaakko Salli +// Modified by: +// Created: Aug-31-2006 +// RCS-ID: $Id: bmpcboxg.cpp 44665 2007-03-07 23:29:03Z VZ $ +// Copyright: (c) 2005 Jaakko Salli +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_BITMAPCOMBOBOX + +#include "wx/bmpcbox.h" + +#if defined(wxGENERIC_BITMAPCOMBOBOX) + +#ifndef WX_PRECOMP + #include "wx/log.h" +#endif + +#include "wx/odcombo.h" +#include "wx/settings.h" +#include "wx/dc.h" + +#if wxUSE_IMAGE + #include "wx/image.h" +#endif + + +const wxChar wxBitmapComboBoxNameStr[] = wxT("bitmapComboBox"); + + +// These macros allow wxArrayPtrVoid to be used in more convenient manner +#define GetBitmapPtr(n) ((wxBitmap*)m_bitmaps[n]) + + +#define IMAGE_SPACING_RIGHT 4 // Space left of image + +#define IMAGE_SPACING_LEFT 4 // Space right of image, left of text + +#define IMAGE_SPACING_VERTICAL 2 // Space top and bottom of image + +#define IMAGE_SPACING_CTRL_VERTICAL 7 // Spacing used in control size calculation + +#define EXTRA_FONT_HEIGHT 0 // Add to increase min. height of list items + + +// ============================================================================ +// implementation +// ============================================================================ + + +BEGIN_EVENT_TABLE(wxBitmapComboBox, wxOwnerDrawnComboBox) + EVT_SIZE(wxBitmapComboBox::OnSize) +END_EVENT_TABLE() + + +IMPLEMENT_DYNAMIC_CLASS(wxBitmapComboBox, wxOwnerDrawnComboBox) + +void wxBitmapComboBox::Init() +{ + m_fontHeight = 0; + m_imgAreaWidth = 0; + m_inResize = false; +} + +wxBitmapComboBox::wxBitmapComboBox(wxWindow *parent, + wxWindowID id, + const wxString& value, + const wxPoint& pos, + const wxSize& size, + const wxArrayString& choices, + long style, + const wxValidator& validator, + const wxString& name) + : wxOwnerDrawnComboBox(), + wxBitmapComboBoxBase() +{ + Init(); + + Create(parent,id,value,pos,size,choices,style,validator,name); +} + +bool wxBitmapComboBox::Create(wxWindow *parent, + wxWindowID id, + const wxString& value, + const wxPoint& pos, + const wxSize& size, + const wxArrayString& choices, + long style, + const wxValidator& validator, + const wxString& name) +{ + if ( !wxOwnerDrawnComboBox::Create(parent, id, value, + pos, size, + choices, style, + validator, name) ) + { + return false; + } + + PostCreate(); + + return true; +} + +bool wxBitmapComboBox::Create(wxWindow *parent, + wxWindowID id, + const wxString& value, + const wxPoint& pos, + const wxSize& size, + int n, + const wxString choices[], + long style, + const wxValidator& validator, + const wxString& name) +{ + if ( !wxOwnerDrawnComboBox::Create(parent, id, value, + pos, size, n, + choices, style, + validator, name) ) + { + return false; + } + + PostCreate(); + + return true; +} + +void wxBitmapComboBox::PostCreate() +{ + m_fontHeight = GetCharHeight() + EXTRA_FONT_HEIGHT; + + while ( m_bitmaps.GetCount() < GetCount() ) + m_bitmaps.Add( new wxBitmap() ); +} + +wxBitmapComboBox::~wxBitmapComboBox() +{ + Clear(); +} + +// ---------------------------------------------------------------------------- +// Item manipulation +// ---------------------------------------------------------------------------- + +void wxBitmapComboBox::SetItemBitmap(unsigned int n, const wxBitmap& bitmap) +{ + wxCHECK_RET( n < GetCount(), wxT("invalid item index") ); + OnAddBitmap(bitmap); + *GetBitmapPtr(n) = bitmap; + + if ( (int)n == GetSelection() ) + Refresh(); +} + +wxBitmap wxBitmapComboBox::GetItemBitmap(unsigned int n) const +{ + wxCHECK_MSG( n < GetCount(), wxNullBitmap, wxT("invalid item index") ); + return *GetBitmapPtr(n); +} + +int wxBitmapComboBox::Insert(const wxString& item, const wxBitmap& bitmap, + unsigned int pos, void *clientData) +{ + int n = DoInsertWithImage(item, bitmap, pos); + if ( n != wxNOT_FOUND ) + SetClientData(n, clientData); + + return n; +} + +int wxBitmapComboBox::Insert(const wxString& item, const wxBitmap& bitmap, + unsigned int pos, wxClientData *clientData) +{ + int n = DoInsertWithImage(item, bitmap, pos); + if ( n != wxNOT_FOUND ) + SetClientObject(n, clientData); + + return n; +} + +bool wxBitmapComboBox::OnAddBitmap(const wxBitmap& bitmap) +{ + if ( bitmap.Ok() ) + { + int width = bitmap.GetWidth(); + int height = bitmap.GetHeight(); + + if ( m_usedImgSize.x <= 0 ) + { + // + // If size not yet determined, get it from this image. + m_usedImgSize.x = width; + m_usedImgSize.y = height; + + InvalidateBestSize(); + wxSize newSz = GetBestSize(); + wxSize sz = GetSize(); + if ( newSz.y > sz.y ) + SetSize(sz.x, newSz.y); + else + DetermineIndent(); + } + + wxCHECK_MSG(width == m_usedImgSize.x && height == m_usedImgSize.y, + false, + wxT("you can only add images of same size")); + } + + return true; +} + +bool wxBitmapComboBox::DoInsertBitmap(const wxBitmap& bitmap, unsigned int pos) +{ + if ( !OnAddBitmap(bitmap) ) + return false; + + // NB: We must try to set the image before DoInsert or + // DoAppend because OnMeasureItem might be called + // before it returns. + m_bitmaps.Insert( new wxBitmap(bitmap), pos); + + return true; +} + +int wxBitmapComboBox::DoAppendWithImage(const wxString& item, const wxBitmap& image) +{ + unsigned int pos = m_bitmaps.size(); + + if ( !DoInsertBitmap(image, pos) ) + return wxNOT_FOUND; + + int index = wxOwnerDrawnComboBox::DoAppend(item); + + if ( index < 0 ) + index = m_bitmaps.size(); + + // Need to re-check the index incase DoAppend sorted + if ( (unsigned int) index != pos ) + { + wxBitmap* bmp = GetBitmapPtr(pos); + m_bitmaps.RemoveAt(pos); + m_bitmaps.Insert(bmp, index); + } + + return index; +} + +int wxBitmapComboBox::DoInsertWithImage(const wxString& item, + const wxBitmap& image, + unsigned int pos) +{ + wxCHECK_MSG( IsValidInsert(pos), wxNOT_FOUND, wxT("invalid item index") ); + + if ( !DoInsertBitmap(image, pos) ) + return wxNOT_FOUND; + + return wxOwnerDrawnComboBox::DoInsert(item, pos); +} + +int wxBitmapComboBox::DoAppend(const wxString& item) +{ + return DoAppendWithImage(item, wxNullBitmap); +} + +int wxBitmapComboBox::DoInsert(const wxString& item, unsigned int pos) +{ + return DoInsertWithImage(item, wxNullBitmap, pos); +} + +void wxBitmapComboBox::Clear() +{ + wxOwnerDrawnComboBox::Clear(); + + unsigned int i; + + for ( i=0; i 0 ) + { + indent = m_usedImgSize.x + IMAGE_SPACING_LEFT + IMAGE_SPACING_RIGHT; + m_imgAreaWidth = indent; + + indent -= 3; + } + + SetCustomPaintWidth(indent); +} + +void wxBitmapComboBox::OnSize(wxSizeEvent& event) +{ + // Prevent infinite looping + if ( !m_inResize ) + { + m_inResize = true; + DetermineIndent(); + m_inResize = false; + } + + event.Skip(); +} + +wxSize wxBitmapComboBox::DoGetBestSize() const +{ + wxSize sz = wxOwnerDrawnComboBox::DoGetBestSize(); + + // Scale control to match height of highest image. + int h2 = m_usedImgSize.y + IMAGE_SPACING_CTRL_VERTICAL; + + if ( h2 > sz.y ) + sz.y = h2; + + CacheBestSize(sz); + return sz; +} + +// ---------------------------------------------------------------------------- +// wxBitmapComboBox miscellaneous +// ---------------------------------------------------------------------------- + +bool wxBitmapComboBox::SetFont(const wxFont& font) +{ + bool res = wxOwnerDrawnComboBox::SetFont(font); + m_fontHeight = GetCharHeight() + EXTRA_FONT_HEIGHT; + return res; +} + +// ---------------------------------------------------------------------------- +// wxBitmapComboBox item drawing and measuring +// ---------------------------------------------------------------------------- + +void wxBitmapComboBox::OnDrawBackground(wxDC& dc, + const wxRect& rect, + int item, + int flags) const +{ + if ( GetCustomPaintWidth() == 0 || + !(flags & wxODCB_PAINTING_SELECTED) || + item < 0 ) + { + wxOwnerDrawnComboBox::OnDrawBackground(dc, rect, item, flags); + return; + } + + // + // Just paint simple selection background under where is text + // (ie. emulate what MSW image choice does). + // + + int xPos = 0; // Starting x of selection rectangle + const int vSizeDec = 1; // Vertical size reduction of selection rectangle edges + + xPos = GetCustomPaintWidth() + 2; + + wxCoord x, y; + GetTextExtent(GetString(item), &x, &y, 0, 0); + + dc.SetTextForeground(wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT)); + + wxColour selCol = wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHT); + dc.SetPen(selCol); + dc.SetBrush(selCol); + dc.DrawRectangle(rect.x+xPos, + rect.y+vSizeDec, + x + 4, + rect.height-(vSizeDec*2)); +} + +void wxBitmapComboBox::OnDrawItem(wxDC& dc, + const wxRect& rect, + int item, + int flags) const +{ + wxString text; + int imgAreaWidth = m_imgAreaWidth; + bool drawText; + + if ( imgAreaWidth == 0 ) + { + wxOwnerDrawnComboBox::OnDrawItem(dc, rect, item, flags); + return; + } + + if ( flags & wxODCB_PAINTING_CONTROL ) + { + text = GetValue(); + if ( HasFlag(wxCB_READONLY) ) + drawText = true; + else + drawText = false; + } + else + { + text = GetString(item); + drawText = true; + } + + const wxBitmap& bmp = *GetBitmapPtr(item); + if ( bmp.Ok() ) + { + wxCoord w = bmp.GetWidth(); + wxCoord h = bmp.GetHeight(); + + // Draw the image centered + dc.DrawBitmap(bmp, + rect.x + (m_usedImgSize.x-w)/2 + IMAGE_SPACING_LEFT, + rect.y + (rect.height-h)/2, + true); + } + + if ( drawText ) + dc.DrawText(GetString(item), + rect.x + imgAreaWidth + 1, + rect.y + (rect.height-dc.GetCharHeight())/2); +} + +wxCoord wxBitmapComboBox::OnMeasureItem(size_t WXUNUSED(item)) const +{ + int imgHeightArea = m_usedImgSize.y + 2; + return imgHeightArea > m_fontHeight ? imgHeightArea : m_fontHeight; +} + +wxCoord wxBitmapComboBox::OnMeasureItemWidth(size_t item) const +{ + wxCoord x, y; + GetTextExtent(GetString(item), &x, &y, 0, 0); + x += m_imgAreaWidth; + return x; +} + +#endif // defined(wxGENERIC_BITMAPCOMBOBOX) + +#endif // wxUSE_BITMAPCOMBOBOX diff --git a/Externals/wxWidgets/src/generic/busyinfo.cpp b/Externals/wxWidgets/src/generic/busyinfo.cpp new file mode 100644 index 0000000000..257c233667 --- /dev/null +++ b/Externals/wxWidgets/src/generic/busyinfo.cpp @@ -0,0 +1,135 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/generic/busyinfo.cpp +// Purpose: Information window when app is busy +// Author: Vaclav Slavik +// Copyright: (c) 1999 Vaclav Slavik +// RCS-ID: $Id: busyinfo.cpp 44898 2007-03-18 20:39:13Z VZ $ +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ +#pragma hdrstop +#endif + +#if wxUSE_BUSYINFO + +// for all others, include the necessary headers +#ifndef WX_PRECOMP + #include "wx/frame.h" + #include "wx/stattext.h" + #include "wx/panel.h" + #include "wx/utils.h" +#endif + +#include "wx/busyinfo.h" + +class WXDLLEXPORT wxInfoFrame : public wxFrame +{ +public: + wxInfoFrame(wxWindow *parent, const wxString& message); + +private: + DECLARE_NO_COPY_CLASS(wxInfoFrame) +}; + + +wxInfoFrame::wxInfoFrame(wxWindow *parent, const wxString& message) + : wxFrame(parent, wxID_ANY, wxT("Busy"), + wxDefaultPosition, wxDefaultSize, +#if defined(__WXX11__) + wxRESIZE_BORDER +#else + wxSIMPLE_BORDER +#endif + | wxFRAME_TOOL_WINDOW) +{ + wxPanel *panel = new wxPanel( this ); + wxStaticText *text = new wxStaticText(panel, wxID_ANY, message); + + panel->SetCursor(*wxHOURGLASS_CURSOR); + text->SetCursor(*wxHOURGLASS_CURSOR); + + // make the frame of at least the standard size (400*80) but big enough + // for the text we show + wxSize sizeText = text->GetBestSize(); +#ifdef __WXPM__ + int nX = 0; + int nY = 0; + int nWidth = 0; + int nHeight = 0; + int nParentHeight = parent->GetClientSize().y; + int nParentWidth = parent->GetClientSize().x; + int nColor; + + SetBackgroundColour(wxT("WHITE")); + nColor = (LONG)GetBackgroundColour().GetPixel(); + + ::WinSetPresParam( GetHwnd() + ,PP_BACKGROUNDCOLOR + ,sizeof(LONG) + ,(PVOID)&nColor + ); + panel->SetBackgroundColour(wxT("WHITE")); + nColor = (LONG)panel->GetBackgroundColour().GetPixel(); + + ::WinSetPresParam( GetHwndOf(panel) + ,PP_BACKGROUNDCOLOR + ,sizeof(LONG) + ,(PVOID)&nColor + ); + nWidth = wxMax(sizeText.x, 340) + 60; + nHeight = wxMax(sizeText.y, 40) + 40; + nX = (nParentWidth - nWidth) / 2; + nY = (nParentHeight / 2) - (nHeight / 2); + nY = nParentHeight - (nY + nHeight); + ::WinSetWindowPos( m_hFrame + ,HWND_TOP + ,nX + ,nY + ,nWidth + ,nHeight + ,SWP_SIZE | SWP_MOVE | SWP_ACTIVATE + ); + text->SetBackgroundColour(wxT("WHITE")); + nColor = (LONG)text->GetBackgroundColour().GetPixel(); + + ::WinSetPresParam( GetHwndOf(text) + ,PP_BACKGROUNDCOLOR + ,sizeof(LONG) + ,(PVOID)&nColor + ); + text->Center(wxBOTH); +#else + SetClientSize(wxMax(sizeText.x, 340) + 60, wxMax(sizeText.y, 40) + 40); + + // need to size the panel correctly first so that text->Centre() works + panel->SetSize(GetClientSize()); + + text->Centre(wxBOTH); + Centre(wxBOTH); +#endif +} + +wxBusyInfo::wxBusyInfo(const wxString& message, wxWindow *parent) +{ + m_InfoFrame = new wxInfoFrame( parent, message); + if ( parent && parent->HasFlag(wxSTAY_ON_TOP) ) + { + // we must have this flag to be in front of our parent if it has it + m_InfoFrame->SetWindowStyleFlag(wxSTAY_ON_TOP); + } + + m_InfoFrame->Show(true); + m_InfoFrame->Refresh(); + m_InfoFrame->Update(); +} + +wxBusyInfo::~wxBusyInfo() +{ + m_InfoFrame->Show(false); + m_InfoFrame->Close(); +} + +#endif // wxUSE_BUSYINFO diff --git a/Externals/wxWidgets/src/generic/buttonbar.cpp b/Externals/wxWidgets/src/generic/buttonbar.cpp new file mode 100644 index 0000000000..b229d7275e --- /dev/null +++ b/Externals/wxWidgets/src/generic/buttonbar.cpp @@ -0,0 +1,555 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/generic/buttonbar.cpp +// Purpose: wxButtonToolBar implementation +// Author: Julian Smart, after Robert Roebling, Vadim Zeitlin, SciTech +// Modified by: +// Created: 2006-04-13 +// Id: $Id: buttonbar.cpp 42816 2006-10-31 08:50:17Z RD $ +// Copyright: (c) Julian Smart, Robert Roebling, Vadim Zeitlin, +// SciTech Software, Inc. +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +// Currently, only for Mac as a toolbar replacement. +#if defined(__WXMAC__) && wxUSE_TOOLBAR && wxUSE_BMPBUTTON + +#include "wx/generic/buttonbar.h" + +#ifndef WX_PRECOMP + #include "wx/utils.h" + #include "wx/app.h" + #include "wx/log.h" + #include "wx/frame.h" + #include "wx/dcclient.h" + #include "wx/settings.h" + #include "wx/image.h" +#endif + +// ---------------------------------------------------------------------------- +// wxButtonToolBarTool: our implementation of wxToolBarToolBase +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxButtonToolBarTool : public wxToolBarToolBase +{ +public: + wxButtonToolBarTool(wxButtonToolBar *tbar, + int id, + const wxString& label, + const wxBitmap& bmpNormal, + const wxBitmap& bmpDisabled, + wxItemKind kind, + wxObject *clientData, + const wxString& shortHelp, + const wxString& longHelp) + : wxToolBarToolBase(tbar, id, label, bmpNormal, bmpDisabled, kind, + clientData, shortHelp, longHelp) + { + m_x = m_y = wxDefaultCoord; + m_width = + m_height = 0; + + m_button = NULL; + } + + wxButtonToolBarTool(wxButtonToolBar *tbar, wxControl *control) + : wxToolBarToolBase(tbar, control) + { + m_x = m_y = wxDefaultCoord; + m_width = + m_height = 0; + m_button = NULL; + } + + wxBitmapButton* GetButton() const { return m_button; } + void SetButton(wxBitmapButton* button) { m_button = button; } + +public: + // the tool position (for controls) + wxCoord m_x; + wxCoord m_y; + wxCoord m_width; + wxCoord m_height; + +private: + // the control representing the button + wxBitmapButton* m_button; +}; + +// ============================================================================ +// wxButtonToolBar implementation +// ============================================================================ + +IMPLEMENT_DYNAMIC_CLASS(wxButtonToolBar, wxControl) + +BEGIN_EVENT_TABLE(wxButtonToolBar, wxControl) + EVT_BUTTON(wxID_ANY, wxButtonToolBar::OnCommand) + EVT_PAINT(wxButtonToolBar::OnPaint) + EVT_LEFT_UP(wxButtonToolBar::OnLeftUp) +END_EVENT_TABLE() + +// ---------------------------------------------------------------------------- +// wxButtonToolBar creation +// ---------------------------------------------------------------------------- + +void wxButtonToolBar::Init() +{ + // no tools yet + m_needsLayout = false; + + // unknown widths for the tools and separators + m_widthSeparator = wxDefaultCoord; + + m_maxWidth = m_maxHeight = 0; + + m_labelMargin = 2; + m_labelHeight = 0; + + SetMargins(8, 2); + SetToolPacking(8); +} + +bool wxButtonToolBar::Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + long style, + const wxString& name) +{ + if ( !wxToolBarBase::Create(parent, id, pos, size, style, + wxDefaultValidator, name) ) + { + return false; + } + + // wxColour lightBackground(244, 244, 244); + + wxFont font(wxSMALL_FONT->GetPointSize(), wxNORMAL_FONT->GetFamily(), wxNORMAL_FONT->GetStyle(), wxNORMAL); + SetFont(font); + + // Calculate the label height if necessary + if (GetWindowStyle() & wxTB_TEXT) + { + wxClientDC dc(this); + dc.SetFont(font); + int w, h; + dc.GetTextExtent(wxT("X"), & w, & h); + m_labelHeight = h; + } + return true; +} + +wxButtonToolBar::~wxButtonToolBar() +{ +} + +// ---------------------------------------------------------------------------- +// wxButtonToolBar tool-related methods +// ---------------------------------------------------------------------------- + +wxToolBarToolBase *wxButtonToolBar::FindToolForPosition(wxCoord x, wxCoord y) const +{ + // check the "other" direction first: it must be inside the toolbar or we + // don't risk finding anything + if ( IsVertical() ) + { + if ( x < 0 || x > m_maxWidth ) + return NULL; + + // we always use x, even for a vertical toolbar, this makes the code + // below simpler + x = y; + } + else // horizontal + { + if ( y < 0 || y > m_maxHeight ) + return NULL; + } + + for ( wxToolBarToolsList::compatibility_iterator node = m_tools.GetFirst(); + node; + node = node->GetNext() ) + { + wxButtonToolBarTool *tool = (wxButtonToolBarTool*) node->GetData(); + wxRect rectTool = GetToolRect(tool); + + wxCoord startTool, endTool; + GetRectLimits(rectTool, &startTool, &endTool); + + if ( x >= startTool && x <= endTool ) + { + // don't return the separators from here, they don't accept any + // input anyhow + return tool->IsSeparator() ? NULL : tool; + } + } + + return NULL; +} + +void wxButtonToolBar::GetRectLimits(const wxRect& rect, + wxCoord *start, + wxCoord *end) const +{ + wxCHECK_RET( start && end, _T("NULL pointer in GetRectLimits") ); + + if ( IsVertical() ) + { + *start = rect.GetTop(); + *end = rect.GetBottom(); + } + else // horizontal + { + *start = rect.GetLeft(); + *end = rect.GetRight(); + } +} + + +void wxButtonToolBar::SetToolShortHelp(int id, const wxString& help) +{ + wxToolBarToolBase *tool = FindById(id); + + wxCHECK_RET( tool, _T("SetToolShortHelp: no such tool") ); + + // TODO: set tooltip/short help + tool->SetShortHelp(help); +} + +bool wxButtonToolBar::DoInsertTool(size_t WXUNUSED(pos), + wxToolBarToolBase * WXUNUSED(tool)) +{ + return true; +} + +bool wxButtonToolBar::DoDeleteTool(size_t WXUNUSED(pos), + wxToolBarToolBase * WXUNUSED(tool)) +{ + // TODO + return true; +} + +void wxButtonToolBar::DoEnableTool(wxToolBarToolBase *WXUNUSED(tool), bool WXUNUSED(enable)) +{ + // TODO +} + +void wxButtonToolBar::DoToggleTool(wxToolBarToolBase *WXUNUSED(tool), bool WXUNUSED(toggle)) +{ + // TODO +} + +void wxButtonToolBar::DoSetToggle(wxToolBarToolBase *WXUNUSED(tool), bool WXUNUSED(toggle)) +{ + // TODO +} + +wxToolBarToolBase *wxButtonToolBar::CreateTool(int id, + const wxString& label, + const wxBitmap& bmpNormal, + const wxBitmap& bmpDisabled, + wxItemKind kind, + wxObject *clientData, + const wxString& shortHelp, + const wxString& longHelp) +{ + return new wxButtonToolBarTool(this, id, label, bmpNormal, bmpDisabled, kind, + clientData, shortHelp, longHelp); +} + +wxToolBarToolBase *wxButtonToolBar::CreateTool(wxControl *control) +{ + return new wxButtonToolBarTool(this, control); +} + +// ---------------------------------------------------------------------------- +// wxButtonToolBar geometry +// ---------------------------------------------------------------------------- + +wxRect wxButtonToolBar::GetToolRect(wxToolBarToolBase *toolBase) const +{ + const wxButtonToolBarTool *tool = (wxButtonToolBarTool *)toolBase; + + wxRect rect; + + wxCHECK_MSG( tool, rect, _T("GetToolRect: NULL tool") ); + + // ensure that we always have the valid tool position + if ( m_needsLayout ) + { + wxConstCast(this, wxButtonToolBar)->DoLayout(); + } + + rect.x = tool->m_x - (m_toolPacking/2); + rect.y = tool->m_y; + + if ( IsVertical() ) + { + if (tool->IsButton()) + { + rect.width = m_defaultWidth; + rect.height = m_defaultHeight; + if (tool->GetButton()) + rect.SetSize(wxSize(tool->m_width, tool->m_height)); + } + else if (tool->IsSeparator()) + { + rect.width = m_defaultWidth; + rect.height = m_widthSeparator; + } + else // control + { + rect.width = tool->m_width; + rect.height = tool->m_height; + } + } + else // horizontal + { + if (tool->IsButton()) + { + rect.width = m_defaultWidth; + rect.height = m_defaultHeight; + if (tool->GetButton()) + rect.SetSize(wxSize(tool->m_width, tool->m_height)); + } + else if (tool->IsSeparator()) + { + rect.width = m_widthSeparator; + rect.height = m_defaultHeight; + } + else // control + { + rect.width = tool->m_width; + rect.height = tool->m_height; + } + } + + rect.width += m_toolPacking; + + return rect; +} + +bool wxButtonToolBar::Realize() +{ + if ( !wxToolBarBase::Realize() ) + return false; + + m_needsLayout = true; + DoLayout(); + + SetInitialSize(wxSize(m_maxWidth, m_maxHeight)); + + return true; +} + +void wxButtonToolBar::DoLayout() +{ + m_needsLayout = false; + + wxCoord x = m_xMargin, + y = m_yMargin; + + int maxHeight = 0; + + const wxCoord widthTool = IsVertical() ? m_defaultHeight : m_defaultWidth; + wxCoord margin = IsVertical() ? m_xMargin : m_yMargin; + wxCoord *pCur = IsVertical() ? &y : &x; + + // calculate the positions of all elements + for ( wxToolBarToolsList::compatibility_iterator node = m_tools.GetFirst(); + node; + node = node->GetNext() ) + { + wxButtonToolBarTool *tool = (wxButtonToolBarTool *) node->GetData(); + + tool->m_x = x; + tool->m_y = y; + + if (tool->IsButton()) + { + if (!tool->GetButton()) + { + wxBitmapButton* bmpButton = new wxBitmapButton(this, tool->GetId(), tool->GetNormalBitmap(), wxPoint(tool->m_x, tool->m_y), wxDefaultSize, + wxBU_AUTODRAW|wxBORDER_NONE); + if (!tool->GetShortHelp().empty()) + bmpButton->SetLabel(tool->GetShortHelp()); + + tool->SetButton(bmpButton); + } + else + { + tool->GetButton()->Move(wxPoint(tool->m_x, tool->m_y)); + } + + int w = widthTool; + if (tool->GetButton()) + { + wxSize sz = tool->GetButton()->GetSize(); + w = sz.x; + + if (m_labelHeight > 0) + { + sz.y += (m_labelHeight + m_labelMargin); + + if (!tool->GetShortHelp().empty()) + { + wxClientDC dc(this); + dc.SetFont(GetFont()); + int tw, th; + dc.GetTextExtent(tool->GetShortHelp(), & tw, & th); + + // If the label is bigger than the icon, the label width + // becomes the new tool width, and we need to centre the + // the bitmap in this box. + if (tw > sz.x) + { + int newX = int(tool->m_x + (tw - sz.x)/2.0); + tool->GetButton()->Move(newX, tool->m_y); + sz.x = tw; + } + } + } + + maxHeight = wxMax(maxHeight, sz.y); + + tool->m_width = sz.x; + tool->m_height = sz.y; + w = sz.x; + } + + *pCur += (w + GetToolPacking()); + } + else if (tool->IsSeparator()) + { + *pCur += m_widthSeparator; + } + else if (!IsVertical()) // horizontal control + { + wxControl *control = tool->GetControl(); + wxSize size = control->GetSize(); + tool->m_y += (m_defaultHeight - size.y)/2; + tool->m_width = size.x; + tool->m_height = size.y; + + *pCur += tool->m_width; + + maxHeight = wxMax(maxHeight, size.y); + } + *pCur += margin; + } + + // calculate the total toolbar size + m_maxWidth = x + 2*m_xMargin; + m_maxHeight = maxHeight + 2*m_yMargin; + + if ((GetWindowStyle() & wxTB_NODIVIDER) == 0) + m_maxHeight += 2; + +} + +wxSize wxButtonToolBar::DoGetBestClientSize() const +{ + return wxSize(m_maxWidth, m_maxHeight); +} + +// receives button commands +void wxButtonToolBar::OnCommand(wxCommandEvent& event) +{ + wxButtonToolBarTool* tool = (wxButtonToolBarTool*) FindById(event.GetId()); + if (!tool) + { + event.Skip(); + return; + } + + if (tool->CanBeToggled()) + tool->Toggle(tool->IsToggled()); + + // TODO: handle toggle items + OnLeftClick(event.GetId(), false); + + if (tool->GetKind() == wxITEM_RADIO) + UnToggleRadioGroup(tool); + + if (tool->CanBeToggled()) + Refresh(); +} + +// paints a border +void wxButtonToolBar::OnPaint(wxPaintEvent& event) +{ + wxPaintDC dc(this); + + dc.SetFont(GetFont()); + dc.SetBackgroundMode(wxTRANSPARENT); + + for ( wxToolBarToolsList::compatibility_iterator node = m_tools.GetFirst(); + node; + node = node->GetNext() ) + { + wxButtonToolBarTool *tool = (wxButtonToolBarTool*) node->GetData(); + wxRect rectTool = GetToolRect(tool); + if (tool->IsToggled()) + { + wxRect backgroundRect = rectTool; + backgroundRect.y = -1; backgroundRect.height = GetClientSize().y + 1; + wxBrush brush(wxColour(219, 219, 219)); + wxPen pen(wxColour(159, 159, 159)); + dc.SetBrush(brush); + dc.SetPen(pen); + dc.DrawRectangle(backgroundRect); + } + + if (m_labelHeight > 0 && !tool->GetShortHelp().empty()) + { + int tw, th; + dc.GetTextExtent(tool->GetShortHelp(), & tw, & th); + + int x = tool->m_x; + dc.DrawText(tool->GetShortHelp(), x, tool->m_y + tool->GetButton()->GetSize().y + m_labelMargin); + } + } + + if ((GetWindowStyle() & wxTB_NODIVIDER) == 0) + { + wxPen pen(wxColour(159, 159, 159)); + dc.SetPen(pen); + int x1 = 0; + int y1 = GetClientSize().y-1; + int x2 = GetClientSize().x; + int y2 = y1; + dc.DrawLine(x1, y1, x2, y2); + } +} + +// detects mouse clicks outside buttons +void wxButtonToolBar::OnLeftUp(wxMouseEvent& event) +{ + if (m_labelHeight > 0) + { + wxButtonToolBarTool* tool = (wxButtonToolBarTool*) FindToolForPosition(event.GetX(), event.GetY()); + if (tool && tool->GetButton() && (event.GetY() > (tool->m_y + tool->GetButton()->GetSize().y))) + { + wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, tool->GetId()); + event.SetEventObject(tool->GetButton()); + if (!ProcessEvent(event)) + event.Skip(); + } + } +} + +#endif // wxUSE_TOOLBAR && wxUSE_BMPBUTTON diff --git a/Externals/wxWidgets/src/generic/calctrl.cpp b/Externals/wxWidgets/src/generic/calctrl.cpp new file mode 100644 index 0000000000..36518a089c --- /dev/null +++ b/Externals/wxWidgets/src/generic/calctrl.cpp @@ -0,0 +1,1834 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/generic/calctrl.cpp +// Purpose: implementation fo the generic wxCalendarCtrl +// Author: Vadim Zeitlin +// Modified by: +// Created: 29.12.99 +// RCS-ID: $Id: calctrl.cpp 43778 2006-12-03 21:30:23Z VZ $ +// Copyright: (c) 1999 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#ifndef WX_PRECOMP + #include "wx/dcclient.h" + #include "wx/settings.h" + #include "wx/brush.h" + #include "wx/combobox.h" + #include "wx/listbox.h" + #include "wx/stattext.h" + #include "wx/textctrl.h" +#endif //WX_PRECOMP + +#if wxUSE_CALENDARCTRL + +#include "wx/spinctrl.h" + +// if wxDatePickerCtrl code doesn't define the date event, do it here as we +// need it as well +#if !wxUSE_DATEPICKCTRL + #define _WX_DEFINE_DATE_EVENTS_ +#endif + +#include "wx/calctrl.h" + +#define DEBUG_PAINT 0 + +// ---------------------------------------------------------------------------- +// wxWin macros +// ---------------------------------------------------------------------------- + +BEGIN_EVENT_TABLE(wxCalendarCtrl, wxControl) + EVT_PAINT(wxCalendarCtrl::OnPaint) + + EVT_CHAR(wxCalendarCtrl::OnChar) + + EVT_LEFT_DOWN(wxCalendarCtrl::OnClick) + EVT_LEFT_DCLICK(wxCalendarCtrl::OnDClick) + + EVT_SYS_COLOUR_CHANGED(wxCalendarCtrl::OnSysColourChanged) +END_EVENT_TABLE() + +#if wxUSE_EXTENDED_RTTI +WX_DEFINE_FLAGS( wxCalendarCtrlStyle ) + +wxBEGIN_FLAGS( wxCalendarCtrlStyle ) + // new style border flags, we put them first to + // use them for streaming out + wxFLAGS_MEMBER(wxBORDER_SIMPLE) + wxFLAGS_MEMBER(wxBORDER_SUNKEN) + wxFLAGS_MEMBER(wxBORDER_DOUBLE) + wxFLAGS_MEMBER(wxBORDER_RAISED) + wxFLAGS_MEMBER(wxBORDER_STATIC) + wxFLAGS_MEMBER(wxBORDER_NONE) + + // old style border flags + wxFLAGS_MEMBER(wxSIMPLE_BORDER) + wxFLAGS_MEMBER(wxSUNKEN_BORDER) + wxFLAGS_MEMBER(wxDOUBLE_BORDER) + wxFLAGS_MEMBER(wxRAISED_BORDER) + wxFLAGS_MEMBER(wxSTATIC_BORDER) + wxFLAGS_MEMBER(wxBORDER) + + // standard window styles + wxFLAGS_MEMBER(wxTAB_TRAVERSAL) + wxFLAGS_MEMBER(wxCLIP_CHILDREN) + wxFLAGS_MEMBER(wxTRANSPARENT_WINDOW) + wxFLAGS_MEMBER(wxWANTS_CHARS) + wxFLAGS_MEMBER(wxFULL_REPAINT_ON_RESIZE) + wxFLAGS_MEMBER(wxALWAYS_SHOW_SB ) + wxFLAGS_MEMBER(wxVSCROLL) + wxFLAGS_MEMBER(wxHSCROLL) + + wxFLAGS_MEMBER(wxCAL_SUNDAY_FIRST) + wxFLAGS_MEMBER(wxCAL_MONDAY_FIRST) + wxFLAGS_MEMBER(wxCAL_SHOW_HOLIDAYS) + wxFLAGS_MEMBER(wxCAL_NO_YEAR_CHANGE) + wxFLAGS_MEMBER(wxCAL_NO_MONTH_CHANGE) + wxFLAGS_MEMBER(wxCAL_SEQUENTIAL_MONTH_SELECTION) + wxFLAGS_MEMBER(wxCAL_SHOW_SURROUNDING_WEEKS) + +wxEND_FLAGS( wxCalendarCtrlStyle ) + +IMPLEMENT_DYNAMIC_CLASS_XTI(wxCalendarCtrl, wxControl,"wx/calctrl.h") + +wxBEGIN_PROPERTIES_TABLE(wxCalendarCtrl) + wxEVENT_RANGE_PROPERTY( Updated , wxEVT_CALENDAR_SEL_CHANGED , wxEVT_CALENDAR_WEEKDAY_CLICKED , wxCalendarEvent ) + wxHIDE_PROPERTY( Children ) + wxPROPERTY( Date,wxDateTime, SetDate , GetDate, , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) + wxPROPERTY_FLAGS( WindowStyle , wxCalendarCtrlStyle , long , SetWindowStyleFlag , GetWindowStyleFlag , , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) // style +wxEND_PROPERTIES_TABLE() + +wxBEGIN_HANDLERS_TABLE(wxCalendarCtrl) +wxEND_HANDLERS_TABLE() + +wxCONSTRUCTOR_6( wxCalendarCtrl , wxWindow* , Parent , wxWindowID , Id , wxDateTime , Date , wxPoint , Position , wxSize , Size , long , WindowStyle ) +#else +IMPLEMENT_DYNAMIC_CLASS(wxCalendarCtrl, wxControl) +#endif +IMPLEMENT_DYNAMIC_CLASS(wxCalendarEvent, wxDateEvent) + +// ---------------------------------------------------------------------------- +// events +// ---------------------------------------------------------------------------- + +DEFINE_EVENT_TYPE(wxEVT_CALENDAR_SEL_CHANGED) +DEFINE_EVENT_TYPE(wxEVT_CALENDAR_DAY_CHANGED) +DEFINE_EVENT_TYPE(wxEVT_CALENDAR_MONTH_CHANGED) +DEFINE_EVENT_TYPE(wxEVT_CALENDAR_YEAR_CHANGED) +DEFINE_EVENT_TYPE(wxEVT_CALENDAR_DOUBLECLICKED) +DEFINE_EVENT_TYPE(wxEVT_CALENDAR_WEEKDAY_CLICKED) + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxCalendarCtrl +// ---------------------------------------------------------------------------- + +wxCalendarCtrl::wxCalendarCtrl(wxWindow *parent, + wxWindowID id, + const wxDateTime& date, + const wxPoint& pos, + const wxSize& size, + long style, + const wxString& name) +{ + Init(); + + (void)Create(parent, id, date, pos, size, style, name); +} + +void wxCalendarCtrl::Init() +{ + m_comboMonth = NULL; + m_spinYear = NULL; + m_staticYear = NULL; + m_staticMonth = NULL; + + m_userChangedYear = false; + + m_widthCol = + m_heightRow = 0; + + wxDateTime::WeekDay wd; + for ( wd = wxDateTime::Sun; wd < wxDateTime::Inv_WeekDay; wxNextWDay(wd) ) + { + m_weekdays[wd] = wxDateTime::GetWeekDayName(wd, wxDateTime::Name_Abbr); + } + + for ( size_t n = 0; n < WXSIZEOF(m_attrs); n++ ) + { + m_attrs[n] = NULL; + } + + InitColours(); +} + +void wxCalendarCtrl::InitColours() +{ + m_colHighlightFg = wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT); + m_colHighlightBg = wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHT); + m_colBackground = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW); + m_colSorrounding = wxSystemSettings::GetColour(wxSYS_COLOUR_GRAYTEXT); + + m_colHolidayFg = *wxRED; + // don't set m_colHolidayBg - by default, same as our bg colour + + m_colHeaderFg = *wxBLUE; + m_colHeaderBg = *wxLIGHT_GREY; +} + +bool wxCalendarCtrl::Create(wxWindow *parent, + wxWindowID id, + const wxDateTime& date, + const wxPoint& pos, + const wxSize& size, + long style, + const wxString& name) +{ + if ( !wxControl::Create(parent, id, pos, size, + style | wxCLIP_CHILDREN | wxWANTS_CHARS | wxFULL_REPAINT_ON_RESIZE, + wxDefaultValidator, name) ) + { + return false; + } + + // needed to get the arrow keys normally used for the dialog navigation + SetWindowStyle(style | wxWANTS_CHARS); + + m_date = date.IsValid() ? date : wxDateTime::Today(); + + m_lowdate = wxDefaultDateTime; + m_highdate = wxDefaultDateTime; + + if ( !HasFlag(wxCAL_SEQUENTIAL_MONTH_SELECTION) ) + { + CreateYearSpinCtrl(); + m_staticYear = new wxStaticText(GetParent(), wxID_ANY, m_date.Format(_T("%Y")), + wxDefaultPosition, wxDefaultSize, + wxALIGN_CENTRE); + + CreateMonthComboBox(); + m_staticMonth = new wxStaticText(GetParent(), wxID_ANY, m_date.Format(_T("%B")), + wxDefaultPosition, wxDefaultSize, + wxALIGN_CENTRE); + } + + ShowCurrentControls(); + + // we need to set the position as well because the main control position + // is not the same as the one specified in pos if we have the controls + // above it + SetInitialSize(size); + SetPosition(pos); + + // Since we don't paint the whole background make sure that the platform + // will use the right one. + SetBackgroundColour(m_colBackground); + + SetHolidayAttrs(); + + return true; +} + +wxCalendarCtrl::~wxCalendarCtrl() +{ + for ( size_t n = 0; n < WXSIZEOF(m_attrs); n++ ) + { + delete m_attrs[n]; + } + + if ( !HasFlag(wxCAL_SEQUENTIAL_MONTH_SELECTION) ) + { + delete m_comboMonth; + delete m_staticMonth; + delete m_spinYear; + delete m_staticYear; + } +} + +void wxCalendarCtrl::SetWindowStyleFlag(long style) +{ + // changing this style doesn't work because the controls are not + // created/shown/hidden accordingly + wxASSERT_MSG( (style & wxCAL_SEQUENTIAL_MONTH_SELECTION) == + (m_windowStyle & wxCAL_SEQUENTIAL_MONTH_SELECTION), + _T("wxCAL_SEQUENTIAL_MONTH_SELECTION can't be changed after creation") ); + + wxControl::SetWindowStyleFlag(style); +} + +// ---------------------------------------------------------------------------- +// Create the wxComboBox and wxSpinCtrl +// ---------------------------------------------------------------------------- + +void wxCalendarCtrl::CreateMonthComboBox() +{ + m_comboMonth = new wxComboBox(GetParent(), wxID_ANY, + wxEmptyString, + wxDefaultPosition, + wxDefaultSize, + 0, NULL, + wxCB_READONLY | wxCLIP_SIBLINGS); + + wxDateTime::Month m; + for ( m = wxDateTime::Jan; m < wxDateTime::Inv_Month; wxNextMonth(m) ) + { + m_comboMonth->Append(wxDateTime::GetMonthName(m)); + } + + m_comboMonth->SetSelection(GetDate().GetMonth()); + m_comboMonth->SetSize(wxDefaultCoord, + wxDefaultCoord, + wxDefaultCoord, + wxDefaultCoord, + wxSIZE_AUTO_WIDTH|wxSIZE_AUTO_HEIGHT); + + m_comboMonth->Connect(wxEVT_COMMAND_COMBOBOX_SELECTED, + wxCommandEventHandler(wxCalendarCtrl::OnMonthChange), + NULL, this); +} + +void wxCalendarCtrl::CreateYearSpinCtrl() +{ + m_spinYear = new wxSpinCtrl(GetParent(), wxID_ANY, + GetDate().Format(_T("%Y")), + wxDefaultPosition, + wxDefaultSize, + wxSP_ARROW_KEYS | wxCLIP_SIBLINGS, + -4300, 10000, GetDate().GetYear()); + + m_spinYear->Connect(wxEVT_COMMAND_TEXT_UPDATED, + wxCommandEventHandler(wxCalendarCtrl::OnYearTextChange), + NULL, this); + + m_spinYear->Connect(wxEVT_COMMAND_SPINCTRL_UPDATED, + wxCommandEventHandler(wxCalendarCtrl::OnYearChange), + NULL, this); +} + +// ---------------------------------------------------------------------------- +// forward wxWin functions to subcontrols +// ---------------------------------------------------------------------------- + +bool wxCalendarCtrl::Destroy() +{ + if ( m_staticYear ) + m_staticYear->Destroy(); + if ( m_spinYear ) + m_spinYear->Destroy(); + if ( m_comboMonth ) + m_comboMonth->Destroy(); + if ( m_staticMonth ) + m_staticMonth->Destroy(); + + m_staticYear = NULL; + m_spinYear = NULL; + m_comboMonth = NULL; + m_staticMonth = NULL; + + return wxControl::Destroy(); +} + +bool wxCalendarCtrl::Show(bool show) +{ + if ( !wxControl::Show(show) ) + { + return false; + } + + if ( !(GetWindowStyle() & wxCAL_SEQUENTIAL_MONTH_SELECTION) ) + { + if ( GetMonthControl() ) + { + GetMonthControl()->Show(show); + GetYearControl()->Show(show); + } + } + + return true; +} + +bool wxCalendarCtrl::Enable(bool enable) +{ + if ( !wxControl::Enable(enable) ) + { + return false; + } + + if ( !(GetWindowStyle() & wxCAL_SEQUENTIAL_MONTH_SELECTION) ) + { + GetMonthControl()->Enable(enable); + GetYearControl()->Enable(enable); + } + + return true; +} + +// ---------------------------------------------------------------------------- +// enable/disable month/year controls +// ---------------------------------------------------------------------------- + +void wxCalendarCtrl::ShowCurrentControls() +{ + if ( !HasFlag(wxCAL_SEQUENTIAL_MONTH_SELECTION) ) + { + if ( AllowMonthChange() ) + { + m_comboMonth->Show(); + m_staticMonth->Hide(); + + if ( AllowYearChange() ) + { + m_spinYear->Show(); + m_staticYear->Hide(); + + // skip the rest + return; + } + } + else + { + m_comboMonth->Hide(); + m_staticMonth->Show(); + } + + // year change not allowed here + m_spinYear->Hide(); + m_staticYear->Show(); + } + //else: these controls are not even created, don't show/hide them +} + +wxControl *wxCalendarCtrl::GetMonthControl() const +{ + return AllowMonthChange() ? (wxControl *)m_comboMonth : (wxControl *)m_staticMonth; +} + +wxControl *wxCalendarCtrl::GetYearControl() const +{ + return AllowYearChange() ? (wxControl *)m_spinYear : (wxControl *)m_staticYear; +} + +void wxCalendarCtrl::EnableYearChange(bool enable) +{ + if ( enable != AllowYearChange() ) + { + long style = GetWindowStyle(); + if ( enable ) + style &= ~wxCAL_NO_YEAR_CHANGE; + else + style |= wxCAL_NO_YEAR_CHANGE; + SetWindowStyle(style); + + ShowCurrentControls(); + if ( GetWindowStyle() & wxCAL_SEQUENTIAL_MONTH_SELECTION ) + { + Refresh(); + } + } +} + +void wxCalendarCtrl::EnableMonthChange(bool enable) +{ + if ( enable != AllowMonthChange() ) + { + long style = GetWindowStyle(); + if ( enable ) + style &= ~wxCAL_NO_MONTH_CHANGE; + else + style |= wxCAL_NO_MONTH_CHANGE; + SetWindowStyle(style); + + ShowCurrentControls(); + if ( GetWindowStyle() & wxCAL_SEQUENTIAL_MONTH_SELECTION ) + { + Refresh(); + } + } +} + +// ---------------------------------------------------------------------------- +// changing date +// ---------------------------------------------------------------------------- + +bool wxCalendarCtrl::SetDate(const wxDateTime& date) +{ + bool retval = true; + + bool sameMonth = m_date.GetMonth() == date.GetMonth(), + sameYear = m_date.GetYear() == date.GetYear(); + + if ( IsDateInRange(date) ) + { + if ( sameMonth && sameYear ) + { + // just change the day + ChangeDay(date); + } + else + { + if ( AllowMonthChange() && (AllowYearChange() || sameYear) ) + { + // change everything + m_date = date; + + if ( !(GetWindowStyle() & wxCAL_SEQUENTIAL_MONTH_SELECTION) ) + { + // update the controls + m_comboMonth->SetSelection(m_date.GetMonth()); + + if ( AllowYearChange() ) + { + if ( !m_userChangedYear ) + m_spinYear->SetValue(m_date.Format(_T("%Y"))); + } + } + + // as the month changed, holidays did too + SetHolidayAttrs(); + + // update the calendar + Refresh(); + } + else + { + // forbidden + retval = false; + } + } + } + + m_userChangedYear = false; + + return retval; +} + +void wxCalendarCtrl::ChangeDay(const wxDateTime& date) +{ + if ( m_date != date ) + { + // we need to refresh the row containing the old date and the one + // containing the new one + wxDateTime dateOld = m_date; + m_date = date; + + RefreshDate(dateOld); + + // if the date is in the same row, it was already drawn correctly + if ( GetWeek(m_date) != GetWeek(dateOld) ) + { + RefreshDate(m_date); + } + } +} + +void wxCalendarCtrl::SetDateAndNotify(const wxDateTime& date) +{ + wxDateTime::Tm tm1 = m_date.GetTm(), + tm2 = date.GetTm(); + + wxEventType type; + if ( tm1.year != tm2.year ) + type = wxEVT_CALENDAR_YEAR_CHANGED; + else if ( tm1.mon != tm2.mon ) + type = wxEVT_CALENDAR_MONTH_CHANGED; + else if ( tm1.mday != tm2.mday ) + type = wxEVT_CALENDAR_DAY_CHANGED; + else + return; + + if ( SetDate(date) ) + { + GenerateEvents(type, wxEVT_CALENDAR_SEL_CHANGED); + } +} + +// ---------------------------------------------------------------------------- +// date range +// ---------------------------------------------------------------------------- + +bool wxCalendarCtrl::SetLowerDateLimit(const wxDateTime& date /* = wxDefaultDateTime */) +{ + bool retval = true; + + if ( !(date.IsValid()) || ( ( m_highdate.IsValid() ) ? ( date <= m_highdate ) : true ) ) + { + m_lowdate = date; + } + else + { + retval = false; + } + + return retval; +} + +bool wxCalendarCtrl::SetUpperDateLimit(const wxDateTime& date /* = wxDefaultDateTime */) +{ + bool retval = true; + + if ( !(date.IsValid()) || ( ( m_lowdate.IsValid() ) ? ( date >= m_lowdate ) : true ) ) + { + m_highdate = date; + } + else + { + retval = false; + } + + return retval; +} + +bool wxCalendarCtrl::SetDateRange(const wxDateTime& lowerdate /* = wxDefaultDateTime */, const wxDateTime& upperdate /* = wxDefaultDateTime */) +{ + bool retval = true; + + if ( + ( !( lowerdate.IsValid() ) || ( ( upperdate.IsValid() ) ? ( lowerdate <= upperdate ) : true ) ) && + ( !( upperdate.IsValid() ) || ( ( lowerdate.IsValid() ) ? ( upperdate >= lowerdate ) : true ) ) ) + { + m_lowdate = lowerdate; + m_highdate = upperdate; + } + else + { + retval = false; + } + + return retval; +} + +// ---------------------------------------------------------------------------- +// date helpers +// ---------------------------------------------------------------------------- + +wxDateTime wxCalendarCtrl::GetStartDate() const +{ + wxDateTime::Tm tm = m_date.GetTm(); + + wxDateTime date = wxDateTime(1, tm.mon, tm.year); + + // rewind back + date.SetToPrevWeekDay(GetWindowStyle() & wxCAL_MONDAY_FIRST + ? wxDateTime::Mon : wxDateTime::Sun); + + if ( GetWindowStyle() & wxCAL_SHOW_SURROUNDING_WEEKS ) + { + // We want to offset the calendar if we start on the first.. + if ( date.GetDay() == 1 ) + { + date -= wxDateSpan::Week(); + } + } + + return date; +} + +bool wxCalendarCtrl::IsDateShown(const wxDateTime& date) const +{ + if ( !(GetWindowStyle() & wxCAL_SHOW_SURROUNDING_WEEKS) ) + { + return date.GetMonth() == m_date.GetMonth(); + } + else + { + return true; + } +} + +bool wxCalendarCtrl::IsDateInRange(const wxDateTime& date) const +{ + // Check if the given date is in the range specified + return ( ( ( m_lowdate.IsValid() ) ? ( date >= m_lowdate ) : true ) + && ( ( m_highdate.IsValid() ) ? ( date <= m_highdate ) : true ) ); +} + +bool wxCalendarCtrl::ChangeYear(wxDateTime* target) const +{ + bool retval = false; + + if ( !(IsDateInRange(*target)) ) + { + if ( target->GetYear() < m_date.GetYear() ) + { + if ( target->GetYear() >= GetLowerDateLimit().GetYear() ) + { + *target = GetLowerDateLimit(); + retval = true; + } + else + { + *target = m_date; + } + } + else + { + if ( target->GetYear() <= GetUpperDateLimit().GetYear() ) + { + *target = GetUpperDateLimit(); + retval = true; + } + else + { + *target = m_date; + } + } + } + else + { + retval = true; + } + + return retval; +} + +bool wxCalendarCtrl::ChangeMonth(wxDateTime* target) const +{ + bool retval = true; + + if ( !(IsDateInRange(*target)) ) + { + retval = false; + + if ( target->GetMonth() < m_date.GetMonth() ) + { + *target = GetLowerDateLimit(); + } + else + { + *target = GetUpperDateLimit(); + } + } + + return retval; +} + +size_t wxCalendarCtrl::GetWeek(const wxDateTime& date) const +{ + size_t retval = date.GetWeekOfMonth(GetWindowStyle() & wxCAL_MONDAY_FIRST + ? wxDateTime::Monday_First + : wxDateTime::Sunday_First); + + if ( (GetWindowStyle() & wxCAL_SHOW_SURROUNDING_WEEKS) ) + { + // we need to offset an extra week if we "start" on the 1st of the month + wxDateTime::Tm tm = date.GetTm(); + + wxDateTime datetest = wxDateTime(1, tm.mon, tm.year); + + // rewind back + datetest.SetToPrevWeekDay(GetWindowStyle() & wxCAL_MONDAY_FIRST + ? wxDateTime::Mon : wxDateTime::Sun); + + if ( datetest.GetDay() == 1 ) + { + retval += 1; + } + } + + return retval; +} + +// ---------------------------------------------------------------------------- +// size management +// ---------------------------------------------------------------------------- + +// this is a composite control and it must arrange its parts each time its +// size or position changes: the combobox and spinctrl are along the top of +// the available area and the calendar takes up therest of the space + +// the static controls are supposed to be always smaller than combo/spin so we +// always use the latter for size calculations and position the static to take +// the same space + +// the constants used for the layout +#define VERT_MARGIN 5 // distance between combo and calendar +#ifdef __WXMAC__ +#define HORZ_MARGIN 5 // spin +#else +#define HORZ_MARGIN 15 // spin +#endif +wxSize wxCalendarCtrl::DoGetBestSize() const +{ + // calc the size of the calendar + ((wxCalendarCtrl *)this)->RecalcGeometry(); // const_cast + + wxCoord width = 7*m_widthCol, + height = 7*m_heightRow + m_rowOffset + VERT_MARGIN; + + if ( !HasFlag(wxCAL_SEQUENTIAL_MONTH_SELECTION) ) + { + // the combobox doesn't report its height correctly (it returns the + // height including the drop down list) so don't use it + height += m_spinYear->GetBestSize().y; + + + wxCoord w2 = m_comboMonth->GetBestSize().x + HORZ_MARGIN + GetCharWidth()*6; + if (width < w2) + width = w2; + } + + if ( !HasFlag(wxBORDER_NONE) ) + { + // the border would clip the last line otherwise + height += 6; + width += 4; + } + + wxSize best(width, height); + CacheBestSize(best); + return best; +} + +void wxCalendarCtrl::DoSetSize(int x, int y, + int width, int height, + int sizeFlags) +{ + wxControl::DoSetSize(x, y, width, height, sizeFlags); +} + +void wxCalendarCtrl::DoMoveWindow(int x, int y, int width, int height) +{ + int yDiff; + + if ( !HasFlag(wxCAL_SEQUENTIAL_MONTH_SELECTION) && m_staticMonth ) + { + wxSize sizeCombo = m_comboMonth->GetEffectiveMinSize(); + wxSize sizeStatic = m_staticMonth->GetSize(); + wxSize sizeSpin = m_spinYear->GetSize(); + + // wxMSW sometimes reports the wrong combo height, + // so on this platform we'll use the spin control + // height instead. +#ifdef __WXMSW__ + int maxHeight = sizeSpin.y; + int requiredSpinHeight = -1; +#else + int maxHeight = sizeCombo.y; + int requiredSpinHeight = sizeCombo.y; +#endif + int dy = (maxHeight - sizeStatic.y) / 2; + m_comboMonth->Move(x, y); + m_staticMonth->SetSize(x, y + dy, sizeCombo.x, -1, sizeStatic.y); + + int xDiff = sizeCombo.x + HORZ_MARGIN; + + m_spinYear->SetSize(x + xDiff, y, width - xDiff, requiredSpinHeight); + m_staticYear->SetSize(x + xDiff, y + dy, width - xDiff, sizeStatic.y); + + yDiff = wxMax(sizeSpin.y, maxHeight) + VERT_MARGIN; + } + else // no controls on the top + { + yDiff = 0; + } + + wxControl::DoMoveWindow(x, y + yDiff, width, height - yDiff); +} + +void wxCalendarCtrl::DoGetPosition(int *x, int *y) const +{ + wxControl::DoGetPosition(x, y); +#ifndef __WXPM__ + if ( !HasFlag(wxCAL_SEQUENTIAL_MONTH_SELECTION) && GetMonthControl() ) + { + // our real top corner is not in this position + if ( y ) + { + *y -= GetMonthControl()->GetSize().y + VERT_MARGIN; + } + } +#endif +} + +void wxCalendarCtrl::DoGetSize(int *width, int *height) const +{ + wxControl::DoGetSize(width, height); +#ifndef __WXPM__ + if ( !HasFlag(wxCAL_SEQUENTIAL_MONTH_SELECTION) ) + { + // our real height is bigger + if ( height && GetMonthControl()) + { + *height += GetMonthControl()->GetSize().y + VERT_MARGIN; + } + } +#endif +} + +void wxCalendarCtrl::RecalcGeometry() +{ + wxClientDC dc(this); + + dc.SetFont(GetFont()); + + // determine the column width (weekday names are not necessarily wider + // than the numbers (in some languages), so let's not assume that they are) + m_widthCol = 0; + for ( int day = 10; day <= 31; day++) + { + wxCoord width; + dc.GetTextExtent(wxString::Format(wxT("%d"), day), &width, &m_heightRow); + if ( width > m_widthCol ) + { + // 1.5 times the width gives nice margins even if the weekday + // names are short + m_widthCol = width+width/2; + } + } + wxDateTime::WeekDay wd; + for ( wd = wxDateTime::Sun; wd < wxDateTime::Inv_WeekDay; wxNextWDay(wd) ) + { + wxCoord width; + dc.GetTextExtent(m_weekdays[wd], &width, &m_heightRow); + if ( width > m_widthCol ) + { + m_widthCol = width; + } + } + + // leave some margins + m_widthCol += 2; + m_heightRow += 2; + + m_rowOffset = HasFlag(wxCAL_SEQUENTIAL_MONTH_SELECTION) ? m_heightRow : 0; // conditional in relation to style +} + +// ---------------------------------------------------------------------------- +// drawing +// ---------------------------------------------------------------------------- + +void wxCalendarCtrl::OnPaint(wxPaintEvent& WXUNUSED(event)) +{ + wxPaintDC dc(this); + + dc.SetFont(GetFont()); + + RecalcGeometry(); + +#if DEBUG_PAINT + wxLogDebug("--- starting to paint, selection: %s, week %u\n", + m_date.Format("%a %d-%m-%Y %H:%M:%S").c_str(), + GetWeek(m_date)); +#endif + + wxCoord y = 0; + wxCoord x0 = wxMax( (GetSize().x - m_widthCol*7) /2 , 0 ); + + if ( HasFlag(wxCAL_SEQUENTIAL_MONTH_SELECTION) ) + { + // draw the sequential month-selector + + dc.SetBackgroundMode(wxTRANSPARENT); + dc.SetTextForeground(*wxBLACK); + dc.SetBrush(wxBrush(m_colHeaderBg, wxSOLID)); + dc.SetPen(wxPen(m_colHeaderBg, 1, wxSOLID)); + dc.DrawRectangle(0, y, GetClientSize().x, m_heightRow); + + // Get extent of month-name + year + wxCoord monthw, monthh; + wxString headertext = m_date.Format(wxT("%B %Y")); + dc.GetTextExtent(headertext, &monthw, &monthh); + + // draw month-name centered above weekdays + wxCoord monthx = ((m_widthCol * 7) - monthw) / 2 + x0; + wxCoord monthy = ((m_heightRow - monthh) / 2) + y; + dc.DrawText(headertext, monthx, monthy); + + // calculate the "month-arrows" + wxPoint leftarrow[3]; + wxPoint rightarrow[3]; + + int arrowheight = monthh / 2; + + leftarrow[0] = wxPoint(0, arrowheight / 2); + leftarrow[1] = wxPoint(arrowheight / 2, 0); + leftarrow[2] = wxPoint(arrowheight / 2, arrowheight - 1); + + rightarrow[0] = wxPoint(0,0); + rightarrow[1] = wxPoint(arrowheight / 2, arrowheight / 2); + rightarrow[2] = wxPoint(0, arrowheight - 1); + + // draw the "month-arrows" + + wxCoord arrowy = (m_heightRow - arrowheight) / 2; + wxCoord larrowx = (m_widthCol - (arrowheight / 2)) / 2 + x0; + wxCoord rarrowx = ((m_widthCol - (arrowheight / 2)) / 2) + m_widthCol*6 + x0; + m_leftArrowRect = m_rightArrowRect = wxRect(0,0,0,0); + + if ( AllowMonthChange() ) + { + wxDateTime ldpm = wxDateTime(1,m_date.GetMonth(), m_date.GetYear()) - wxDateSpan::Day(); // last day prev month + // Check if range permits change + if ( IsDateInRange(ldpm) && ( ( ldpm.GetYear() == m_date.GetYear() ) ? true : AllowYearChange() ) ) + { + m_leftArrowRect = wxRect(larrowx - 3, arrowy - 3, (arrowheight / 2) + 8, (arrowheight + 6)); + dc.SetBrush(*wxBLACK_BRUSH); + dc.SetPen(*wxBLACK_PEN); + dc.DrawPolygon(3, leftarrow, larrowx , arrowy, wxWINDING_RULE); + dc.SetBrush(*wxTRANSPARENT_BRUSH); + dc.DrawRectangle(m_leftArrowRect); + } + wxDateTime fdnm = wxDateTime(1,m_date.GetMonth(), m_date.GetYear()) + wxDateSpan::Month(); // first day next month + if ( IsDateInRange(fdnm) && ( ( fdnm.GetYear() == m_date.GetYear() ) ? true : AllowYearChange() ) ) + { + m_rightArrowRect = wxRect(rarrowx - 4, arrowy - 3, (arrowheight / 2) + 8, (arrowheight + 6)); + dc.SetBrush(*wxBLACK_BRUSH); + dc.SetPen(*wxBLACK_PEN); + dc.DrawPolygon(3, rightarrow, rarrowx , arrowy, wxWINDING_RULE); + dc.SetBrush(*wxTRANSPARENT_BRUSH); + dc.DrawRectangle(m_rightArrowRect); + } + } + + y += m_heightRow; + } + + // first draw the week days + if ( IsExposed(x0, y, x0 + 7*m_widthCol, m_heightRow) ) + { +#if DEBUG_PAINT + wxLogDebug("painting the header"); +#endif + + dc.SetBackgroundMode(wxTRANSPARENT); + dc.SetTextForeground(m_colHeaderFg); + dc.SetBrush(wxBrush(m_colHeaderBg, wxSOLID)); + dc.SetPen(wxPen(m_colHeaderBg, 1, wxSOLID)); + dc.DrawRectangle(0, y, GetClientSize().x, m_heightRow); + + bool startOnMonday = (GetWindowStyle() & wxCAL_MONDAY_FIRST) != 0; + for ( int wd = 0; wd < 7; wd++ ) + { + size_t n; + if ( startOnMonday ) + n = wd == 6 ? 0 : wd + 1; + else + n = wd; + wxCoord dayw, dayh; + dc.GetTextExtent(m_weekdays[n], &dayw, &dayh); + dc.DrawText(m_weekdays[n], x0 + (wd*m_widthCol) + ((m_widthCol- dayw) / 2), y); // center the day-name + } + } + + // then the calendar itself + dc.SetTextForeground(*wxBLACK); + //dc.SetFont(*wxNORMAL_FONT); + + y += m_heightRow; + wxDateTime date = GetStartDate(); + +#if DEBUG_PAINT + wxLogDebug("starting calendar from %s\n", + date.Format("%a %d-%m-%Y %H:%M:%S").c_str()); +#endif + + dc.SetBackgroundMode(wxSOLID); + for ( size_t nWeek = 1; nWeek <= 6; nWeek++, y += m_heightRow ) + { + // if the update region doesn't intersect this row, don't paint it + if ( !IsExposed(x0, y, x0 + 7*m_widthCol, m_heightRow - 1) ) + { + date += wxDateSpan::Week(); + + continue; + } + +#if DEBUG_PAINT + wxLogDebug("painting week %d at y = %d\n", nWeek, y); +#endif + + for ( int wd = 0; wd < 7; wd++ ) + { + dc.SetTextBackground(m_colBackground); + if ( IsDateShown(date) ) + { + // don't use wxDate::Format() which prepends 0s + unsigned int day = date.GetDay(); + wxString dayStr = wxString::Format(_T("%u"), day); + wxCoord width; + dc.GetTextExtent(dayStr, &width, (wxCoord *)NULL); + + bool changedColours = false, + changedFont = false; + + bool isSel = false; + wxCalendarDateAttr *attr = NULL; + + if ( date.GetMonth() != m_date.GetMonth() || !IsDateInRange(date) ) + { + // surrounding week or out-of-range + // draw "disabled" + dc.SetTextForeground(m_colSorrounding); + changedColours = true; + } + else + { + isSel = date.IsSameDate(m_date); + attr = m_attrs[day - 1]; + + if ( isSel ) + { + dc.SetTextForeground(m_colHighlightFg); + dc.SetTextBackground(m_colHighlightBg); + + changedColours = true; + } + else if ( attr ) + { + wxColour colFg, colBg; + + if ( attr->IsHoliday() ) + { + colFg = m_colHolidayFg; + colBg = m_colHolidayBg; + } + else + { + colFg = attr->GetTextColour(); + colBg = attr->GetBackgroundColour(); + } + + if ( colFg.Ok() ) + { + dc.SetTextForeground(colFg); + changedColours = true; + } + + if ( colBg.Ok() ) + { + dc.SetTextBackground(colBg); + changedColours = true; + } + + if ( attr->HasFont() ) + { + dc.SetFont(attr->GetFont()); + changedFont = true; + } + } + } + + wxCoord x = wd*m_widthCol + (m_widthCol - width) / 2 + x0; + dc.DrawText(dayStr, x, y + 1); + + if ( !isSel && attr && attr->HasBorder() ) + { + wxColour colBorder; + if ( attr->HasBorderColour() ) + { + colBorder = attr->GetBorderColour(); + } + else + { + colBorder = GetForegroundColour(); + } + + wxPen pen(colBorder, 1, wxSOLID); + dc.SetPen(pen); + dc.SetBrush(*wxTRANSPARENT_BRUSH); + + switch ( attr->GetBorder() ) + { + case wxCAL_BORDER_SQUARE: + dc.DrawRectangle(x - 2, y, + width + 4, m_heightRow); + break; + + case wxCAL_BORDER_ROUND: + dc.DrawEllipse(x - 2, y, + width + 4, m_heightRow); + break; + + default: + wxFAIL_MSG(_T("unknown border type")); + } + } + + if ( changedColours ) + { + dc.SetTextForeground(GetForegroundColour()); + dc.SetTextBackground(GetBackgroundColour()); + } + + if ( changedFont ) + { + dc.SetFont(GetFont()); + } + } + //else: just don't draw it + + date += wxDateSpan::Day(); + } + } + + // Greying out out-of-range background + bool showSurrounding = (GetWindowStyle() & wxCAL_SHOW_SURROUNDING_WEEKS) != 0; + + date = ( showSurrounding ) ? GetStartDate() : wxDateTime(1, m_date.GetMonth(), m_date.GetYear()); + if ( !IsDateInRange(date) ) + { + wxDateTime firstOOR = GetLowerDateLimit() - wxDateSpan::Day(); // first out-of-range + + wxBrush oorbrush = *wxLIGHT_GREY_BRUSH; + oorbrush.SetStyle(wxFDIAGONAL_HATCH); + + HighlightRange(&dc, date, firstOOR, wxTRANSPARENT_PEN, &oorbrush); + } + + date = ( showSurrounding ) ? GetStartDate() + wxDateSpan::Weeks(6) - wxDateSpan::Day() : wxDateTime().SetToLastMonthDay(m_date.GetMonth(), m_date.GetYear()); + if ( !IsDateInRange(date) ) + { + wxDateTime firstOOR = GetUpperDateLimit() + wxDateSpan::Day(); // first out-of-range + + wxBrush oorbrush = *wxLIGHT_GREY_BRUSH; + oorbrush.SetStyle(wxFDIAGONAL_HATCH); + + HighlightRange(&dc, firstOOR, date, wxTRANSPARENT_PEN, &oorbrush); + } + +#if DEBUG_PAINT + wxLogDebug("+++ finished painting"); +#endif +} + +void wxCalendarCtrl::RefreshDate(const wxDateTime& date) +{ + RecalcGeometry(); + + wxRect rect; + + // always refresh the whole row at once because our OnPaint() will draw + // the whole row anyhow - and this allows the small optimisation in + // OnClick() below to work + rect.x = wxMax( (GetSize().x - m_widthCol*7) /2 , 0 ); + + rect.y = (m_heightRow * GetWeek(date)) + m_rowOffset; + + rect.width = 7*m_widthCol; + rect.height = m_heightRow; + +#ifdef __WXMSW__ + // VZ: for some reason, the selected date seems to occupy more space under + // MSW - this is probably some bug in the font size calculations, but I + // don't know where exactly. This fix is ugly and leads to more + // refreshes than really needed, but without it the selected days + // leaves even more ugly underscores on screen. + rect.Inflate(0, 1); +#endif // MSW + +#if DEBUG_PAINT + wxLogDebug("*** refreshing week %d at (%d, %d)-(%d, %d)\n", + GetWeek(date), + rect.x, rect.y, + rect.x + rect.width, rect.y + rect.height); +#endif + + Refresh(true, &rect); +} + +void wxCalendarCtrl::HighlightRange(wxPaintDC* pDC, const wxDateTime& fromdate, const wxDateTime& todate, const wxPen* pPen, const wxBrush* pBrush) +{ + // Highlights the given range using pen and brush + // Does nothing if todate < fromdate + + +#if DEBUG_PAINT + wxLogDebug("+++ HighlightRange: (%s) - (%s) +++", fromdate.Format("%d %m %Y"), todate.Format("%d %m %Y")); +#endif + + if ( todate >= fromdate ) + { + // do stuff + // date-coordinates + int fd, fw; + int td, tw; + + // implicit: both dates must be currently shown - checked by GetDateCoord + if ( GetDateCoord(fromdate, &fd, &fw) && GetDateCoord(todate, &td, &tw) ) + { +#if DEBUG_PAINT + wxLogDebug("Highlight range: (%i, %i) - (%i, %i)", fd, fw, td, tw); +#endif + if ( ( (tw - fw) == 1 ) && ( td < fd ) ) + { + // special case: interval 7 days or less not in same week + // split in two separate intervals + wxDateTime tfd = fromdate + wxDateSpan::Days(7-fd); + wxDateTime ftd = tfd + wxDateSpan::Day(); +#if DEBUG_PAINT + wxLogDebug("Highlight: Separate segments"); +#endif + // draw separately + HighlightRange(pDC, fromdate, tfd, pPen, pBrush); + HighlightRange(pDC, ftd, todate, pPen, pBrush); + } + else + { + int numpoints; + wxPoint corners[8]; // potentially 8 corners in polygon + wxCoord x0 = wxMax( (GetSize().x - m_widthCol*7) /2 , 0 ); + + if ( fw == tw ) + { + // simple case: same week + numpoints = 4; + corners[0] = wxPoint(x0 + (fd - 1) * m_widthCol, (fw * m_heightRow) + m_rowOffset); + corners[1] = wxPoint(x0 + (fd - 1) * m_widthCol, ((fw + 1 ) * m_heightRow) + m_rowOffset); + corners[2] = wxPoint(x0 + td * m_widthCol, ((tw + 1) * m_heightRow) + m_rowOffset); + corners[3] = wxPoint(x0 + td * m_widthCol, (tw * m_heightRow) + m_rowOffset); + } + else + { + int cidx = 0; + // "complex" polygon + corners[cidx] = wxPoint(x0 + (fd - 1) * m_widthCol, (fw * m_heightRow) + m_rowOffset); cidx++; + + if ( fd > 1 ) + { + corners[cidx] = wxPoint(x0 + (fd - 1) * m_widthCol, ((fw + 1) * m_heightRow) + m_rowOffset); cidx++; + corners[cidx] = wxPoint(x0, ((fw + 1) * m_heightRow) + m_rowOffset); cidx++; + } + + corners[cidx] = wxPoint(x0, ((tw + 1) * m_heightRow) + m_rowOffset); cidx++; + corners[cidx] = wxPoint(x0 + td * m_widthCol, ((tw + 1) * m_heightRow) + m_rowOffset); cidx++; + + if ( td < 7 ) + { + corners[cidx] = wxPoint(x0 + td * m_widthCol, (tw * m_heightRow) + m_rowOffset); cidx++; + corners[cidx] = wxPoint(x0 + 7 * m_widthCol, (tw * m_heightRow) + m_rowOffset); cidx++; + } + + corners[cidx] = wxPoint(x0 + 7 * m_widthCol, (fw * m_heightRow) + m_rowOffset); cidx++; + + numpoints = cidx; + } + + // draw the polygon + pDC->SetBrush(*pBrush); + pDC->SetPen(*pPen); + pDC->DrawPolygon(numpoints, corners); + } + } + } + // else do nothing +#if DEBUG_PAINT + wxLogDebug("--- HighlightRange ---"); +#endif +} + +bool wxCalendarCtrl::GetDateCoord(const wxDateTime& date, int *day, int *week) const +{ + bool retval = true; + +#if DEBUG_PAINT + wxLogDebug("+++ GetDateCoord: (%s) +++", date.Format("%d %m %Y")); +#endif + + if ( IsDateShown(date) ) + { + bool startOnMonday = ( GetWindowStyle() & wxCAL_MONDAY_FIRST ) != 0; + + // Find day + *day = date.GetWeekDay(); + + if ( *day == 0 ) // sunday + { + *day = ( startOnMonday ) ? 7 : 1; + } + else + { + *day += ( startOnMonday ) ? 0 : 1; + } + + int targetmonth = date.GetMonth() + (12 * date.GetYear()); + int thismonth = m_date.GetMonth() + (12 * m_date.GetYear()); + + // Find week + if ( targetmonth == thismonth ) + { + *week = GetWeek(date); + } + else + { + if ( targetmonth < thismonth ) + { + *week = 1; // trivial + } + else // targetmonth > thismonth + { + wxDateTime ldcm; + int lastweek; + int lastday; + + // get the datecoord of the last day in the month currently shown +#if DEBUG_PAINT + wxLogDebug(" +++ LDOM +++"); +#endif + GetDateCoord(ldcm.SetToLastMonthDay(m_date.GetMonth(), m_date.GetYear()), &lastday, &lastweek); +#if DEBUG_PAINT + wxLogDebug(" --- LDOM ---"); +#endif + + wxTimeSpan span = date - ldcm; + + int daysfromlast = span.GetDays(); +#if DEBUG_PAINT + wxLogDebug("daysfromlast: %i", daysfromlast); +#endif + if ( daysfromlast + lastday > 7 ) // past week boundary + { + int wholeweeks = (daysfromlast / 7); + *week = wholeweeks + lastweek; + if ( (daysfromlast - (7 * wholeweeks) + lastday) > 7 ) + { + *week += 1; + } + } + else + { + *week = lastweek; + } + } + } + } + else + { + *day = -1; + *week = -1; + retval = false; + } + +#if DEBUG_PAINT + wxLogDebug("--- GetDateCoord: (%s) = (%i, %i) ---", date.Format("%d %m %Y"), *day, *week); +#endif + + return retval; +} + +// ---------------------------------------------------------------------------- +// mouse handling +// ---------------------------------------------------------------------------- + +void wxCalendarCtrl::OnDClick(wxMouseEvent& event) +{ + if ( HitTest(event.GetPosition()) != wxCAL_HITTEST_DAY ) + { + event.Skip(); + } + else + { + GenerateEvent(wxEVT_CALENDAR_DOUBLECLICKED); + } +} + +void wxCalendarCtrl::OnClick(wxMouseEvent& event) +{ + wxDateTime date; + wxDateTime::WeekDay wday; + switch ( HitTest(event.GetPosition(), &date, &wday) ) + { + case wxCAL_HITTEST_DAY: + if ( IsDateInRange(date) ) + { + ChangeDay(date); + + GenerateEvents(wxEVT_CALENDAR_DAY_CHANGED, + wxEVT_CALENDAR_SEL_CHANGED); + } + break; + + case wxCAL_HITTEST_HEADER: + { + wxCalendarEvent eventWd(this, wxEVT_CALENDAR_WEEKDAY_CLICKED); + eventWd.m_wday = wday; + (void)GetEventHandler()->ProcessEvent(eventWd); + } + break; + + case wxCAL_HITTEST_DECMONTH: + case wxCAL_HITTEST_INCMONTH: + case wxCAL_HITTEST_SURROUNDING_WEEK: + SetDateAndNotify(date); // we probably only want to refresh the control. No notification.. (maybe as an option?) + break; + + default: + wxFAIL_MSG(_T("unknown hittest code")); + // fall through + + case wxCAL_HITTEST_NOWHERE: + event.Skip(); + break; + } +} + +wxCalendarHitTestResult wxCalendarCtrl::HitTest(const wxPoint& pos, + wxDateTime *date, + wxDateTime::WeekDay *wd) +{ + RecalcGeometry(); + + // the position where the calendar really begins + wxCoord x0 = wxMax((GetSize().x - m_widthCol*7)/2, 0); + + if ( HasFlag(wxCAL_SEQUENTIAL_MONTH_SELECTION) ) + { + // Header: month + + // we need to find out if the hit is on left arrow, on month or on right arrow + // left arrow? + if ( m_leftArrowRect.Contains(pos) ) + { + if ( date ) + { + if ( IsDateInRange(m_date - wxDateSpan::Month()) ) + { + *date = m_date - wxDateSpan::Month(); + } + else + { + *date = GetLowerDateLimit(); + } + } + + return wxCAL_HITTEST_DECMONTH; + } + + if ( m_rightArrowRect.Contains(pos) ) + { + if ( date ) + { + if ( IsDateInRange(m_date + wxDateSpan::Month()) ) + { + *date = m_date + wxDateSpan::Month(); + } + else + { + *date = GetUpperDateLimit(); + } + } + + return wxCAL_HITTEST_INCMONTH; + } + + } + + // header: week days + int wday = (pos.x - x0) / m_widthCol; + if ( pos.y < (m_heightRow + m_rowOffset) ) + { + if ( pos.y > m_rowOffset ) + { + if ( wd ) + { + if ( GetWindowStyle() & wxCAL_MONDAY_FIRST ) + { + wday = wday == 6 ? 0 : wday + 1; + } + + *wd = (wxDateTime::WeekDay)wday; + } + + return wxCAL_HITTEST_HEADER; + } + else + { + return wxCAL_HITTEST_NOWHERE; + } + } + + int week = (pos.y - (m_heightRow + m_rowOffset)) / m_heightRow; + if ( week >= 6 || wday >= 7 ) + { + return wxCAL_HITTEST_NOWHERE; + } + + wxDateTime dt = GetStartDate() + wxDateSpan::Days(7*week + wday); + + if ( IsDateShown(dt) ) + { + if ( date ) + *date = dt; + + if ( dt.GetMonth() == m_date.GetMonth() ) + { + + return wxCAL_HITTEST_DAY; + } + else + { + return wxCAL_HITTEST_SURROUNDING_WEEK; + } + } + else + { + return wxCAL_HITTEST_NOWHERE; + } +} + +// ---------------------------------------------------------------------------- +// subcontrols events handling +// ---------------------------------------------------------------------------- + +void wxCalendarCtrl::OnMonthChange(wxCommandEvent& event) +{ + wxDateTime::Tm tm = m_date.GetTm(); + + wxDateTime::Month mon = (wxDateTime::Month)event.GetInt(); + if ( tm.mday > wxDateTime::GetNumberOfDays(mon, tm.year) ) + { + tm.mday = wxDateTime::GetNumberOfDays(mon, tm.year); + } + + wxDateTime target = wxDateTime(tm.mday, mon, tm.year); + + ChangeMonth(&target); + SetDateAndNotify(target); +} + +void wxCalendarCtrl::OnYearChange(wxCommandEvent& event) +{ + int year = (int)event.GetInt(); + if ( year == INT_MIN ) + { + // invalid year in the spin control, ignore it + return; + } + + wxDateTime::Tm tm = m_date.GetTm(); + + if ( tm.mday > wxDateTime::GetNumberOfDays(tm.mon, year) ) + { + tm.mday = wxDateTime::GetNumberOfDays(tm.mon, year); + } + + wxDateTime target = wxDateTime(tm.mday, tm.mon, year); + + if ( ChangeYear(&target) ) + { + SetDateAndNotify(target); + } + else + { + // In this case we don't want to change the date. That would put us + // inside the same year but a strange number of months forward/back.. + m_spinYear->SetValue(target.GetYear()); + } +} + +void wxCalendarCtrl::OnYearTextChange(wxCommandEvent& event) +{ + SetUserChangedYear(); + OnYearChange(event); +} + +// Responds to colour changes, and passes event on to children. +void wxCalendarCtrl::OnSysColourChanged(wxSysColourChangedEvent& event) +{ + // reinit colours + InitColours(); + + // Propagate the event to the children + wxControl::OnSysColourChanged(event); + + // Redraw control area + SetBackgroundColour(m_colBackground); + Refresh(); +} + +// ---------------------------------------------------------------------------- +// keyboard interface +// ---------------------------------------------------------------------------- + +void wxCalendarCtrl::OnChar(wxKeyEvent& event) +{ + wxDateTime target; + switch ( event.GetKeyCode() ) + { + case _T('+'): + case WXK_ADD: + target = m_date + wxDateSpan::Year(); + if ( ChangeYear(&target) ) + { + SetDateAndNotify(target); + } + break; + + case _T('-'): + case WXK_SUBTRACT: + target = m_date - wxDateSpan::Year(); + if ( ChangeYear(&target) ) + { + SetDateAndNotify(target); + } + break; + + case WXK_PAGEUP: + target = m_date - wxDateSpan::Month(); + ChangeMonth(&target); + SetDateAndNotify(target); // always + break; + + case WXK_PAGEDOWN: + target = m_date + wxDateSpan::Month(); + ChangeMonth(&target); + SetDateAndNotify(target); // always + break; + + case WXK_RIGHT: + if ( event.ControlDown() ) + { + target = wxDateTime(m_date).SetToNextWeekDay( + GetWindowStyle() & wxCAL_MONDAY_FIRST + ? wxDateTime::Sun : wxDateTime::Sat); + if ( !IsDateInRange(target) ) + { + target = GetUpperDateLimit(); + } + SetDateAndNotify(target); + } + else + SetDateAndNotify(m_date + wxDateSpan::Day()); + break; + + case WXK_LEFT: + if ( event.ControlDown() ) + { + target = wxDateTime(m_date).SetToPrevWeekDay( + GetWindowStyle() & wxCAL_MONDAY_FIRST + ? wxDateTime::Mon : wxDateTime::Sun); + if ( !IsDateInRange(target) ) + { + target = GetLowerDateLimit(); + } + SetDateAndNotify(target); + } + else + SetDateAndNotify(m_date - wxDateSpan::Day()); + break; + + case WXK_UP: + SetDateAndNotify(m_date - wxDateSpan::Week()); + break; + + case WXK_DOWN: + SetDateAndNotify(m_date + wxDateSpan::Week()); + break; + + case WXK_HOME: + if ( event.ControlDown() ) + SetDateAndNotify(wxDateTime::Today()); + else + SetDateAndNotify(wxDateTime(1, m_date.GetMonth(), m_date.GetYear())); + break; + + case WXK_END: + SetDateAndNotify(wxDateTime(m_date).SetToLastMonthDay()); + break; + + case WXK_RETURN: + GenerateEvent(wxEVT_CALENDAR_DOUBLECLICKED); + break; + + default: + event.Skip(); + } +} + +// ---------------------------------------------------------------------------- +// holidays handling +// ---------------------------------------------------------------------------- + +void wxCalendarCtrl::EnableHolidayDisplay(bool display) +{ + long style = GetWindowStyle(); + if ( display ) + style |= wxCAL_SHOW_HOLIDAYS; + else + style &= ~wxCAL_SHOW_HOLIDAYS; + + SetWindowStyle(style); + + if ( display ) + SetHolidayAttrs(); + else + ResetHolidayAttrs(); + + Refresh(); +} + +void wxCalendarCtrl::SetHolidayAttrs() +{ + if ( GetWindowStyle() & wxCAL_SHOW_HOLIDAYS ) + { + ResetHolidayAttrs(); + + wxDateTime::Tm tm = m_date.GetTm(); + wxDateTime dtStart(1, tm.mon, tm.year), + dtEnd = dtStart.GetLastMonthDay(); + + wxDateTimeArray hol; + wxDateTimeHolidayAuthority::GetHolidaysInRange(dtStart, dtEnd, hol); + + size_t count = hol.GetCount(); + for ( size_t n = 0; n < count; n++ ) + { + SetHoliday(hol[n].GetDay()); + } + } +} + +void wxCalendarCtrl::SetHoliday(size_t day) +{ + wxCHECK_RET( day > 0 && day < 32, _T("invalid day in SetHoliday") ); + + wxCalendarDateAttr *attr = GetAttr(day); + if ( !attr ) + { + attr = new wxCalendarDateAttr; + } + + attr->SetHoliday(true); + + // can't use SetAttr() because it would delete this pointer + m_attrs[day - 1] = attr; +} + +void wxCalendarCtrl::ResetHolidayAttrs() +{ + for ( size_t day = 0; day < 31; day++ ) + { + if ( m_attrs[day] ) + { + m_attrs[day]->SetHoliday(false); + } + } +} + + +//static +wxVisualAttributes +wxCalendarCtrl::GetClassDefaultAttributes(wxWindowVariant variant) +{ + // Use the same color scheme as wxListBox + return wxListBox::GetClassDefaultAttributes(variant); +} + +#endif // wxUSE_CALENDARCTRL diff --git a/Externals/wxWidgets/src/generic/caret.cpp b/Externals/wxWidgets/src/generic/caret.cpp new file mode 100644 index 0000000000..23d25abcbb --- /dev/null +++ b/Externals/wxWidgets/src/generic/caret.cpp @@ -0,0 +1,283 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: generic/caret.cpp +// Purpose: generic wxCaret class implementation +// Author: Vadim Zeitlin (original code by Robert Roebling) +// Modified by: +// Created: 25.05.99 +// RCS-ID: $Id: caret.cpp 42397 2006-10-25 12:12:56Z VS $ +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_CARET + +#ifndef WX_PRECOMP + #include "wx/window.h" + #include "wx/dcclient.h" + #include "wx/dcmemory.h" +#endif //WX_PRECOMP + +#include "wx/caret.h" + +// ---------------------------------------------------------------------------- +// global variables for this module +// ---------------------------------------------------------------------------- + +// the blink time (common to all carets for MSW compatibility) +static int gs_blinkTime = 500; // in milliseconds + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// timer stuff +// ---------------------------------------------------------------------------- + +wxCaretTimer::wxCaretTimer(wxCaret *caret) +{ + m_caret = caret; +} + +void wxCaretTimer::Notify() +{ + m_caret->OnTimer(); +} + +void wxCaret::OnTimer() +{ + // don't blink the caret when we don't have the focus + if ( m_hasFocus ) + Blink(); +} + +// ---------------------------------------------------------------------------- +// wxCaret static functions and data +// ---------------------------------------------------------------------------- + +int wxCaretBase::GetBlinkTime() +{ + return gs_blinkTime; +} + +void wxCaretBase::SetBlinkTime(int milliseconds) +{ + gs_blinkTime = milliseconds; +} + +// ---------------------------------------------------------------------------- +// initialization and destruction +// ---------------------------------------------------------------------------- + +void wxCaret::InitGeneric() +{ + m_hasFocus = true; + m_blinkedOut = true; +#ifndef wxHAS_CARET_USING_OVERLAYS + m_xOld = + m_yOld = -1; + m_bmpUnderCaret.Create(m_width, m_height); +#endif +} + +wxCaret::~wxCaret() +{ + if ( IsVisible() ) + { + // stop blinking + if ( m_timer.IsRunning() ) + m_timer.Stop(); + } +} + +// ---------------------------------------------------------------------------- +// showing/hiding/moving the caret (base class interface) +// ---------------------------------------------------------------------------- + +void wxCaret::DoShow() +{ + int blinkTime = GetBlinkTime(); + if ( blinkTime ) + m_timer.Start(blinkTime); + + if ( m_blinkedOut ) + Blink(); +} + +void wxCaret::DoHide() +{ + m_timer.Stop(); + + if ( !m_blinkedOut ) + { + Blink(); + } +} + +void wxCaret::DoMove() +{ +#ifdef wxHAS_CARET_USING_OVERLAYS + m_overlay.Reset(); +#endif + if ( IsVisible() ) + { + if ( !m_blinkedOut ) + { + // hide it right now and it will be shown the next time it blinks + Blink(); + + // but if the caret is not blinking, we should blink it back into + // visibility manually + if ( !m_timer.IsRunning() ) + Blink(); + } + } + //else: will be shown at the correct location when it is shown +} + +void wxCaret::DoSize() +{ + int countVisible = m_countVisible; + if (countVisible > 0) + { + m_countVisible = 0; + DoHide(); + } +#ifdef wxHAS_CARET_USING_OVERLAYS + m_overlay.Reset(); +#else + // Change bitmap size + m_bmpUnderCaret = wxBitmap(m_width, m_height); +#endif + if (countVisible > 0) + { + m_countVisible = countVisible; + DoShow(); + } +} + +// ---------------------------------------------------------------------------- +// handling the focus +// ---------------------------------------------------------------------------- + +void wxCaret::OnSetFocus() +{ + m_hasFocus = true; + + if ( IsVisible() ) + Refresh(); +} + +void wxCaret::OnKillFocus() +{ + m_hasFocus = false; + + if ( IsVisible() ) + { + // the caret must be shown - otherwise, if it is hidden now, it will + // stay so until the focus doesn't return because it won't blink any + // more + + // hide it first if it isn't hidden ... + if ( !m_blinkedOut ) + Blink(); + + // .. and show it in the new style + Blink(); + } +} + +// ---------------------------------------------------------------------------- +// drawing the caret +// ---------------------------------------------------------------------------- + +void wxCaret::Blink() +{ + m_blinkedOut = !m_blinkedOut; + + Refresh(); +} + +void wxCaret::Refresh() +{ + wxClientDC dcWin(GetWindow()); +// this is the new code, switch to 0 if this gives problems +#ifdef wxHAS_CARET_USING_OVERLAYS + wxDCOverlay dcOverlay( m_overlay, &dcWin, m_x, m_y, m_width , m_height ); + if ( m_blinkedOut ) + { + dcOverlay.Clear(); + } + else + { + DoDraw( &dcWin ); + } +#else + wxMemoryDC dcMem; + dcMem.SelectObject(m_bmpUnderCaret); + if ( m_blinkedOut ) + { + // restore the old image + dcWin.Blit(m_xOld, m_yOld, m_width, m_height, + &dcMem, 0, 0); + m_xOld = + m_yOld = -1; + } + else + { + if ( m_xOld == -1 && m_yOld == -1 ) + { + // save the part we're going to overdraw + + int x = m_x, + y = m_y; +#if defined(__WXGTK__) && !defined(__WX_DC_BLIT_FIXED__) + wxPoint pt = dcWin.GetDeviceOrigin(); + x += pt.x; + y += pt.y; +#endif // broken wxGTK wxDC::Blit + dcMem.Blit(0, 0, m_width, m_height, + &dcWin, x, y); + + m_xOld = m_x; + m_yOld = m_y; + } + //else: we already saved the image below the caret, don't do it any + // more + + // and draw the caret there + DoDraw(&dcWin); + } +#endif +} + +void wxCaret::DoDraw(wxDC *dc) +{ + dc->SetPen( *wxBLACK_PEN ); + + dc->SetBrush(*(m_hasFocus ? wxBLACK_BRUSH : wxTRANSPARENT_BRUSH)); + dc->SetPen(*wxBLACK_PEN); + + // VZ: unfortunately, the rectangle comes out a pixel smaller when this is + // done under wxGTK - no idea why + //dc->SetLogicalFunction(wxINVERT); + + dc->DrawRectangle(m_x, m_y, m_width, m_height); +} + +#endif // wxUSE_CARET diff --git a/Externals/wxWidgets/src/generic/choicbkg.cpp b/Externals/wxWidgets/src/generic/choicbkg.cpp new file mode 100644 index 0000000000..1e381baf2e --- /dev/null +++ b/Externals/wxWidgets/src/generic/choicbkg.cpp @@ -0,0 +1,327 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/generic/choicbkg.cpp +// Purpose: generic implementation of wxChoicebook +// Author: Vadim Zeitlin +// Modified by: Wlodzimierz ABX Skiba from generic/listbkg.cpp +// Created: 15.09.04 +// RCS-ID: $Id: choicbkg.cpp 49720 2007-11-07 18:16:37Z JS $ +// Copyright: (c) Vadim Zeitlin, Wlodzimierz Skiba +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_CHOICEBOOK + +#include "wx/choicebk.h" + +#ifndef WX_PRECOMP + #include "wx/settings.h" + #include "wx/choice.h" + #include "wx/sizer.h" +#endif + +#include "wx/imaglist.h" + +// ---------------------------------------------------------------------------- +// various wxWidgets macros +// ---------------------------------------------------------------------------- + +// check that the page index is valid +#define IS_VALID_PAGE(nPage) ((nPage) < GetPageCount()) + +// ---------------------------------------------------------------------------- +// event table +// ---------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxChoicebook, wxBookCtrlBase) +IMPLEMENT_DYNAMIC_CLASS(wxChoicebookEvent, wxNotifyEvent) + +#if !WXWIN_COMPATIBILITY_EVENT_TYPES +const wxEventType wxEVT_COMMAND_CHOICEBOOK_PAGE_CHANGING = wxNewEventType(); +const wxEventType wxEVT_COMMAND_CHOICEBOOK_PAGE_CHANGED = wxNewEventType(); +#endif + +BEGIN_EVENT_TABLE(wxChoicebook, wxBookCtrlBase) + EVT_CHOICE(wxID_ANY, wxChoicebook::OnChoiceSelected) +END_EVENT_TABLE() + +// ============================================================================ +// wxChoicebook implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxChoicebook creation +// ---------------------------------------------------------------------------- + +void wxChoicebook::Init() +{ + m_selection = wxNOT_FOUND; +} + +bool +wxChoicebook::Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + long style, + const wxString& name) +{ + if ( (style & wxBK_ALIGN_MASK) == wxBK_DEFAULT ) + { + style |= wxBK_TOP; + } + + // no border for this control, it doesn't look nice together with + // wxChoice border + style &= ~wxBORDER_MASK; + style |= wxBORDER_NONE; + + if ( !wxControl::Create(parent, id, pos, size, style, + wxDefaultValidator, name) ) + return false; + + m_bookctrl = new wxChoice + ( + this, + wxID_ANY, + wxDefaultPosition, + wxDefaultSize + ); + + wxSizer* mainSizer = new wxBoxSizer(IsVertical() ? wxVERTICAL : wxHORIZONTAL); + + if (style & wxBK_RIGHT || style & wxBK_BOTTOM) + mainSizer->Add(0, 0, 1, wxEXPAND, 0); + + m_controlSizer = new wxBoxSizer(IsVertical() ? wxHORIZONTAL : wxVERTICAL); + m_controlSizer->Add(m_bookctrl, 1, (IsVertical() ? wxALIGN_CENTRE_VERTICAL : wxALIGN_CENTRE) |wxGROW, 0); + mainSizer->Add(m_controlSizer, 0, (IsVertical() ? (int) wxGROW : (int) wxALIGN_CENTRE_VERTICAL)|wxALL, m_controlMargin); + SetSizer(mainSizer); + return true; +} + +// ---------------------------------------------------------------------------- +// wxChoicebook geometry management +// ---------------------------------------------------------------------------- + +wxSize wxChoicebook::GetControllerSize() const +{ + const wxSize sizeClient = GetClientSize(), + sizeChoice = m_controlSizer->CalcMin(); + + wxSize size; + if ( IsVertical() ) + { + size.x = sizeClient.x; + size.y = sizeChoice.y; + } + else // left/right aligned + { + size.x = sizeChoice.x; + size.y = sizeClient.y; + } + + return size; +} + +wxSize wxChoicebook::CalcSizeFromPage(const wxSize& sizePage) const +{ + // we need to add the size of the choice control and the border between + const wxSize sizeChoice = GetControllerSize(); + + wxSize size = sizePage; + if ( IsVertical() ) + { + size.y += sizeChoice.y + GetInternalBorder(); + } + else // left/right aligned + { + size.x += sizeChoice.x + GetInternalBorder(); + } + + return size; +} + + +// ---------------------------------------------------------------------------- +// accessing the pages +// ---------------------------------------------------------------------------- + +bool wxChoicebook::SetPageText(size_t n, const wxString& strText) +{ + GetChoiceCtrl()->SetString(n, strText); + + return true; +} + +wxString wxChoicebook::GetPageText(size_t n) const +{ + return GetChoiceCtrl()->GetString(n); +} + +int wxChoicebook::GetPageImage(size_t WXUNUSED(n)) const +{ + wxFAIL_MSG( _T("wxChoicebook::GetPageImage() not implemented") ); + + return wxNOT_FOUND; +} + +bool wxChoicebook::SetPageImage(size_t WXUNUSED(n), int WXUNUSED(imageId)) +{ + wxFAIL_MSG( _T("wxChoicebook::SetPageImage() not implemented") ); + + return false; +} + +// ---------------------------------------------------------------------------- +// image list stuff +// ---------------------------------------------------------------------------- + +void wxChoicebook::SetImageList(wxImageList *imageList) +{ + // TODO: can be implemented in form of static bitmap near choice control + + wxBookCtrlBase::SetImageList(imageList); +} + +// ---------------------------------------------------------------------------- +// selection +// ---------------------------------------------------------------------------- + +int wxChoicebook::GetSelection() const +{ + return m_selection; +} + +wxBookCtrlBaseEvent* wxChoicebook::CreatePageChangingEvent() const +{ + return new wxChoicebookEvent(wxEVT_COMMAND_CHOICEBOOK_PAGE_CHANGING, m_windowId); +} + +void wxChoicebook::MakeChangedEvent(wxBookCtrlBaseEvent &event) +{ + event.SetEventType(wxEVT_COMMAND_CHOICEBOOK_PAGE_CHANGED); +} + +// ---------------------------------------------------------------------------- +// adding/removing the pages +// ---------------------------------------------------------------------------- + +bool +wxChoicebook::InsertPage(size_t n, + wxWindow *page, + const wxString& text, + bool bSelect, + int imageId) +{ + if ( !wxBookCtrlBase::InsertPage(n, page, text, bSelect, imageId) ) + return false; + + GetChoiceCtrl()->Insert(text, n); + + // if the inserted page is before the selected one, we must update the + // index of the selected page + if ( int(n) <= m_selection ) + { + // one extra page added + m_selection++; + GetChoiceCtrl()->Select(m_selection); + } + + // some page should be selected: either this one or the first one if there + // is still no selection + int selNew = wxNOT_FOUND; + if ( bSelect ) + selNew = n; + else if ( m_selection == wxNOT_FOUND ) + selNew = 0; + + if ( selNew != m_selection ) + page->Hide(); + + if ( selNew != wxNOT_FOUND ) + SetSelection(selNew); + + return true; +} + +wxWindow *wxChoicebook::DoRemovePage(size_t page) +{ + const size_t page_count = GetPageCount(); + wxWindow *win = wxBookCtrlBase::DoRemovePage(page); + + if ( win ) + { + GetChoiceCtrl()->Delete(page); + + if (m_selection >= (int)page) + { + // force new sel valid if possible + int sel = m_selection - 1; + if (page_count == 1) + sel = wxNOT_FOUND; + else if ((page_count == 2) || (sel == -1)) + sel = 0; + + // force sel invalid if deleting current page - don't try to hide it + m_selection = (m_selection == (int)page) ? wxNOT_FOUND : m_selection - 1; + + if ((sel != wxNOT_FOUND) && (sel != m_selection)) + SetSelection(sel); + } + } + + return win; +} + + +bool wxChoicebook::DeleteAllPages() +{ + GetChoiceCtrl()->Clear(); + return wxBookCtrlBase::DeleteAllPages(); +} + +// ---------------------------------------------------------------------------- +// wxChoicebook events +// ---------------------------------------------------------------------------- + +void wxChoicebook::OnChoiceSelected(wxCommandEvent& eventChoice) +{ + if ( eventChoice.GetEventObject() != m_bookctrl ) + { + eventChoice.Skip(); + return; + } + + const int selNew = eventChoice.GetSelection(); + + if ( selNew == m_selection ) + { + // this event can only come from our own Select(m_selection) below + // which we call when the page change is vetoed, so we should simply + // ignore it + return; + } + + SetSelection(selNew); + + // change wasn't allowed, return to previous state + if (m_selection != selNew) + GetChoiceCtrl()->Select(m_selection); +} + +#endif // wxUSE_CHOICEBOOK diff --git a/Externals/wxWidgets/src/generic/choicdgg.cpp b/Externals/wxWidgets/src/generic/choicdgg.cpp new file mode 100644 index 0000000000..1caf90aa31 --- /dev/null +++ b/Externals/wxWidgets/src/generic/choicdgg.cpp @@ -0,0 +1,556 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/generic/choicdgg.cpp +// Purpose: Choice dialogs +// Author: Julian Smart +// Modified by: 03.11.00: VZ to add wxArrayString and multiple sel functions +// Created: 04/01/98 +// RCS-ID: $Id: choicdgg.cpp 44620 2007-03-06 09:56:43Z JS $ +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_CHOICEDLG + +#ifndef WX_PRECOMP + #include + #include "wx/utils.h" + #include "wx/dialog.h" + #include "wx/button.h" + #include "wx/listbox.h" + #include "wx/checklst.h" + #include "wx/stattext.h" + #include "wx/intl.h" + #include "wx/sizer.h" + #include "wx/arrstr.h" +#endif + +#include "wx/statline.h" +#include "wx/settings.h" +#include "wx/generic/choicdgg.h" + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +#define wxID_LISTBOX 3000 + +// ---------------------------------------------------------------------------- +// private functions +// ---------------------------------------------------------------------------- + +// convert wxArrayString into a wxString[] which must be delete[]d by caller +static int ConvertWXArrayToC(const wxArrayString& aChoices, wxString **choices); + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// helpers +// ---------------------------------------------------------------------------- + +int ConvertWXArrayToC(const wxArrayString& aChoices, wxString **choices) +{ + int n = aChoices.GetCount(); + *choices = new wxString[n]; + + for ( int i = 0; i < n; i++ ) + { + (*choices)[i] = aChoices[i]; + } + + return n; +} + +// ---------------------------------------------------------------------------- +// wrapper functions +// ---------------------------------------------------------------------------- + +wxString wxGetSingleChoice( const wxString& message, + const wxString& caption, + int n, const wxString *choices, + wxWindow *parent, + int WXUNUSED(x), int WXUNUSED(y), + bool WXUNUSED(centre), + int WXUNUSED(width), int WXUNUSED(height) ) +{ + wxSingleChoiceDialog dialog(parent, message, caption, n, choices); + wxString choice; + if ( dialog.ShowModal() == wxID_OK ) + choice = dialog.GetStringSelection(); + + return choice; +} + +wxString wxGetSingleChoice( const wxString& message, + const wxString& caption, + const wxArrayString& aChoices, + wxWindow *parent, + int x, int y, + bool centre, + int width, int height) +{ + wxString *choices; + int n = ConvertWXArrayToC(aChoices, &choices); + wxString res = wxGetSingleChoice(message, caption, n, choices, parent, + x, y, centre, width, height); + delete [] choices; + + return res; +} + +int wxGetSingleChoiceIndex( const wxString& message, + const wxString& caption, + int n, const wxString *choices, + wxWindow *parent, + int WXUNUSED(x), int WXUNUSED(y), + bool WXUNUSED(centre), + int WXUNUSED(width), int WXUNUSED(height) ) +{ + wxSingleChoiceDialog dialog(parent, message, caption, n, choices); + int choice; + if ( dialog.ShowModal() == wxID_OK ) + choice = dialog.GetSelection(); + else + choice = -1; + + return choice; +} + +int wxGetSingleChoiceIndex( const wxString& message, + const wxString& caption, + const wxArrayString& aChoices, + wxWindow *parent, + int x, int y, + bool centre, + int width, int height) +{ + wxString *choices; + int n = ConvertWXArrayToC(aChoices, &choices); + int res = wxGetSingleChoiceIndex(message, caption, n, choices, parent, + x, y, centre, width, height); + delete [] choices; + + return res; +} + +void *wxGetSingleChoiceData( const wxString& message, + const wxString& caption, + int n, const wxString *choices, + void **client_data, + wxWindow *parent, + int WXUNUSED(x), int WXUNUSED(y), + bool WXUNUSED(centre), + int WXUNUSED(width), int WXUNUSED(height) ) +{ + wxSingleChoiceDialog dialog(parent, message, caption, n, choices, + (char **)client_data); + void *data; + if ( dialog.ShowModal() == wxID_OK ) + data = dialog.GetSelectionClientData(); + else + data = NULL; + + return data; +} + +void *wxGetSingleChoiceData( const wxString& message, + const wxString& caption, + const wxArrayString& aChoices, + void **client_data, + wxWindow *parent, + int x, int y, + bool centre, + int width, int height) +{ + wxString *choices; + int n = ConvertWXArrayToC(aChoices, &choices); + void *res = wxGetSingleChoiceData(message, caption, n, choices, + client_data, parent, + x, y, centre, width, height); + delete [] choices; + + return res; +} + +size_t wxGetMultipleChoices(wxArrayInt& selections, + const wxString& message, + const wxString& caption, + int n, const wxString *choices, + wxWindow *parent, + int WXUNUSED(x), int WXUNUSED(y), + bool WXUNUSED(centre), + int WXUNUSED(width), int WXUNUSED(height)) +{ + wxMultiChoiceDialog dialog(parent, message, caption, n, choices); + + // call this even if selections array is empty and this then (correctly) + // deselects the first item which is selected by default + dialog.SetSelections(selections); + + if ( dialog.ShowModal() == wxID_OK ) + selections = dialog.GetSelections(); + else + selections.Empty(); + + return selections.GetCount(); +} + +size_t wxGetMultipleChoices(wxArrayInt& selections, + const wxString& message, + const wxString& caption, + const wxArrayString& aChoices, + wxWindow *parent, + int x, int y, + bool centre, + int width, int height) +{ + wxString *choices; + int n = ConvertWXArrayToC(aChoices, &choices); + size_t res = wxGetMultipleChoices(selections, message, caption, + n, choices, parent, + x, y, centre, width, height); + delete [] choices; + + return res; +} + +// ---------------------------------------------------------------------------- +// wxAnyChoiceDialog +// ---------------------------------------------------------------------------- + +bool wxAnyChoiceDialog::Create(wxWindow *parent, + const wxString& message, + const wxString& caption, + int n, const wxString *choices, + long styleDlg, + const wxPoint& pos, + long styleLbox) +{ +#ifdef __WXMAC__ + // FIXME: why?? + if ( !wxDialog::Create(parent, wxID_ANY, caption, pos, wxDefaultSize, styleDlg & (~wxCANCEL) ) ) + return false; +#else + if ( !wxDialog::Create(parent, wxID_ANY, caption, pos, wxDefaultSize, styleDlg) ) + return false; +#endif + + wxBoxSizer *topsizer = new wxBoxSizer( wxVERTICAL ); + + // 1) text message + topsizer-> + Add(CreateTextSizer(message), wxSizerFlags().Expand().TripleBorder()); + + // 2) list box + m_listbox = CreateList(n, choices, styleLbox); + + if ( n > 0 ) + m_listbox->SetSelection(0); + + topsizer-> + Add(m_listbox, wxSizerFlags().Expand().Proportion(1).TripleBorder(wxLEFT | wxRIGHT)); + + // 3) buttons if any + wxSizer * + buttonSizer = CreateSeparatedButtonSizer(styleDlg & ButtonSizerFlags); + if ( buttonSizer ) + { + topsizer->Add(buttonSizer, wxSizerFlags().Expand().DoubleBorder()); + } + + SetSizer( topsizer ); + + topsizer->SetSizeHints( this ); + topsizer->Fit( this ); + + if ( styleDlg & wxCENTRE ) + Centre(wxBOTH); + + m_listbox->SetFocus(); + + return true; +} + +bool wxAnyChoiceDialog::Create(wxWindow *parent, + const wxString& message, + const wxString& caption, + const wxArrayString& choices, + long styleDlg, + const wxPoint& pos, + long styleLbox) +{ + wxCArrayString chs(choices); + return Create(parent, message, caption, chs.GetCount(), chs.GetStrings(), + styleDlg, pos, styleLbox); +} + +wxListBoxBase *wxAnyChoiceDialog::CreateList(int n, const wxString *choices, long styleLbox) +{ + wxSize size = wxDefaultSize; + if (wxSystemSettings::GetScreenType() > wxSYS_SCREEN_PDA) + size = wxSize(300, 200); + return new wxListBox( this, wxID_LISTBOX, + wxDefaultPosition, size, + n, choices, + styleLbox ); +} + +// ---------------------------------------------------------------------------- +// wxSingleChoiceDialog +// ---------------------------------------------------------------------------- + +BEGIN_EVENT_TABLE(wxSingleChoiceDialog, wxDialog) + EVT_BUTTON(wxID_OK, wxSingleChoiceDialog::OnOK) +#ifndef __SMARTPHONE__ + EVT_LISTBOX_DCLICK(wxID_LISTBOX, wxSingleChoiceDialog::OnListBoxDClick) +#endif +#ifdef __WXWINCE__ + EVT_JOY_BUTTON_DOWN(wxSingleChoiceDialog::OnJoystickButtonDown) +#endif +END_EVENT_TABLE() + +IMPLEMENT_DYNAMIC_CLASS(wxSingleChoiceDialog, wxDialog) + +wxSingleChoiceDialog::wxSingleChoiceDialog(wxWindow *parent, + const wxString& message, + const wxString& caption, + int n, + const wxString *choices, + char **clientData, + long style, + const wxPoint& WXUNUSED(pos)) +{ + Create(parent, message, caption, n, choices, clientData, style); +} + +wxSingleChoiceDialog::wxSingleChoiceDialog(wxWindow *parent, + const wxString& message, + const wxString& caption, + const wxArrayString& choices, + char **clientData, + long style, + const wxPoint& WXUNUSED(pos)) +{ + Create(parent, message, caption, choices, clientData, style); +} + +bool wxSingleChoiceDialog::Create( wxWindow *parent, + const wxString& message, + const wxString& caption, + int n, + const wxString *choices, + char **clientData, + long style, + const wxPoint& pos ) +{ + if ( !wxAnyChoiceDialog::Create(parent, message, caption, + n, choices, + style, pos) ) + return false; + + m_selection = n > 0 ? 0 : -1; + + if (clientData) + { + for (int i = 0; i < n; i++) + m_listbox->SetClientData(i, clientData[i]); + } + + return true; +} + +bool wxSingleChoiceDialog::Create( wxWindow *parent, + const wxString& message, + const wxString& caption, + const wxArrayString& choices, + char **clientData, + long style, + const wxPoint& pos ) +{ + wxCArrayString chs(choices); + return Create( parent, message, caption, chs.GetCount(), chs.GetStrings(), + clientData, style, pos ); +} + +// Set the selection +void wxSingleChoiceDialog::SetSelection(int sel) +{ + m_listbox->SetSelection(sel); + m_selection = sel; +} + +void wxSingleChoiceDialog::OnOK(wxCommandEvent& WXUNUSED(event)) +{ + DoChoice(); +} + +#ifndef __SMARTPHONE__ +void wxSingleChoiceDialog::OnListBoxDClick(wxCommandEvent& WXUNUSED(event)) +{ + DoChoice(); +} +#endif + +#ifdef __WXWINCE__ +void wxSingleChoiceDialog::OnJoystickButtonDown(wxJoystickEvent& WXUNUSED(event)) +{ + DoChoice(); +} +#endif + +void wxSingleChoiceDialog::DoChoice() +{ + m_selection = m_listbox->GetSelection(); + m_stringSelection = m_listbox->GetStringSelection(); + + if ( m_listbox->HasClientUntypedData() ) + SetClientData(m_listbox->GetClientData(m_selection)); + + EndModal(wxID_OK); +} + +// ---------------------------------------------------------------------------- +// wxMultiChoiceDialog +// ---------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxMultiChoiceDialog, wxDialog) + +bool wxMultiChoiceDialog::Create( wxWindow *parent, + const wxString& message, + const wxString& caption, + int n, + const wxString *choices, + long style, + const wxPoint& pos ) +{ + long styleLbox; +#if wxUSE_CHECKLISTBOX + styleLbox = wxLB_ALWAYS_SB; +#else + styleLbox = wxLB_ALWAYS_SB | wxLB_EXTENDED; +#endif + + if ( !wxAnyChoiceDialog::Create(parent, message, caption, + n, choices, + style, pos, + styleLbox) ) + return false; + + return true; +} + +bool wxMultiChoiceDialog::Create( wxWindow *parent, + const wxString& message, + const wxString& caption, + const wxArrayString& choices, + long style, + const wxPoint& pos ) +{ + wxCArrayString chs(choices); + return Create( parent, message, caption, chs.GetCount(), + chs.GetStrings(), style, pos ); +} + +void wxMultiChoiceDialog::SetSelections(const wxArrayInt& selections) +{ +#if wxUSE_CHECKLISTBOX + wxCheckListBox* checkListBox = wxDynamicCast(m_listbox, wxCheckListBox); + if (checkListBox) + { + // first clear all currently selected items + size_t n, + count = checkListBox->GetCount(); + for ( n = 0; n < count; ++n ) + { + if (checkListBox->IsChecked(n)) + checkListBox->Check(n, false); + } + + // now select the ones which should be selected + count = selections.GetCount(); + for ( n = 0; n < count; n++ ) + { + checkListBox->Check(selections[n]); + } + + return; + } +#endif + + // first clear all currently selected items + size_t n, + count = m_listbox->GetCount(); + for ( n = 0; n < count; ++n ) + { + m_listbox->Deselect(n); + } + + // now select the ones which should be selected + count = selections.GetCount(); + for ( n = 0; n < count; n++ ) + { + m_listbox->Select(selections[n]); + } +} + +bool wxMultiChoiceDialog::TransferDataFromWindow() +{ + m_selections.Empty(); + +#if wxUSE_CHECKLISTBOX + wxCheckListBox* checkListBox = wxDynamicCast(m_listbox, wxCheckListBox); + if (checkListBox) + { + size_t count = checkListBox->GetCount(); + for ( size_t n = 0; n < count; n++ ) + { + if ( checkListBox->IsChecked(n) ) + m_selections.Add(n); + } + return true; + } +#endif + + size_t count = m_listbox->GetCount(); + for ( size_t n = 0; n < count; n++ ) + { + if ( m_listbox->IsSelected(n) ) + m_selections.Add(n); + } + + return true; +} + +#if wxUSE_CHECKLISTBOX + +wxListBoxBase *wxMultiChoiceDialog::CreateList(int n, const wxString *choices, long styleLbox) +{ + wxSize size = wxDefaultSize; + if (wxSystemSettings::GetScreenType() > wxSYS_SCREEN_PDA) + size = wxSize(300, 200); + + return new wxCheckListBox( this, wxID_LISTBOX, + wxDefaultPosition, size, + n, choices, + styleLbox ); +} + +#endif // wxUSE_CHECKLISTBOX + +#endif // wxUSE_CHOICEDLG diff --git a/Externals/wxWidgets/src/generic/clrpickerg.cpp b/Externals/wxWidgets/src/generic/clrpickerg.cpp new file mode 100644 index 0000000000..508d6cf538 --- /dev/null +++ b/Externals/wxWidgets/src/generic/clrpickerg.cpp @@ -0,0 +1,132 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/generic/clrpickerg.cpp +// Purpose: wxGenericColourButton class implementation +// Author: Francesco Montorsi (readapted code written by Vadim Zeitlin) +// Modified by: +// Created: 15/04/2006 +// RCS-ID: $Id: clrpickerg.cpp 40322 2006-07-25 11:41:53Z ABX $ +// Copyright: (c) Vadim Zeitlin, Francesco Montorsi +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_COLOURPICKERCTRL + +#include "wx/clrpicker.h" + +#include "wx/colordlg.h" + + +// ============================================================================ +// implementation +// ============================================================================ + +wxColourData wxGenericColourButton::ms_data; +IMPLEMENT_DYNAMIC_CLASS(wxGenericColourButton, wxButton) + +// ---------------------------------------------------------------------------- +// wxGenericColourButton +// ---------------------------------------------------------------------------- + +bool wxGenericColourButton::Create( wxWindow *parent, wxWindowID id, + const wxColour &col, const wxPoint &pos, + const wxSize &size, long style, + const wxValidator& validator, const wxString &name) +{ + // create this button + if (!wxButton::Create( parent, id, wxEmptyString, pos, + size, style, validator, name )) + { + wxFAIL_MSG( wxT("wxGenericColourButton creation failed") ); + return false; + } + + // and handle user clicks on it + Connect(wxEVT_COMMAND_BUTTON_CLICKED, + wxCommandEventHandler(wxGenericColourButton::OnButtonClick), + NULL, this); + + m_colour = col; + UpdateColour(); + InitColourData(); + + return true; +} + +void wxGenericColourButton::InitColourData() +{ + ms_data.SetChooseFull(true); + unsigned char grey = 0; + for (int i = 0; i < 16; i++, grey += 16) + { + // fill with grey tones the custom colors palette + wxColour colour(grey, grey, grey); + ms_data.SetCustomColour(i, colour); + } +} + +void wxGenericColourButton::OnButtonClick(wxCommandEvent& WXUNUSED(ev)) +{ + // update the wxColouData to be shown in the the dialog + ms_data.SetColour(m_colour); + + // create the colour dialog and display it + wxColourDialog dlg(this, &ms_data); + if (dlg.ShowModal() == wxID_OK) + { + ms_data = dlg.GetColourData(); + SetColour(ms_data.GetColour()); + + // fire an event + wxColourPickerEvent event(this, GetId(), m_colour); + GetEventHandler()->ProcessEvent(event); + } +} + +void wxGenericColourButton::UpdateColour() +{ + if ( !m_colour.Ok() ) + { + if ( HasFlag(wxCLRP_SHOW_LABEL) ) + SetLabel(wxEmptyString); + return; + } + + // some combinations of the fg/bg colours may be unreadable, so we invert + // the colour to make sure fg colour is different enough from m_colour + wxColour colFg(~m_colour.Red(), ~m_colour.Green(), ~m_colour.Blue()); + + SetForegroundColour(colFg); + SetBackgroundColour(m_colour); + + if ( HasFlag(wxCLRP_SHOW_LABEL) ) + SetLabel(m_colour.GetAsString(wxC2S_HTML_SYNTAX)); +} + +wxSize wxGenericColourButton::DoGetBestSize() const +{ + wxSize sz(wxButton::DoGetBestSize()); + if ( HasFlag(wxCLRP_SHOW_LABEL) ) + return sz; + + // if we have no label, then make this button a square + // (like e.g. native GTK version of this control) + sz.SetWidth(sz.GetHeight()); + return sz; +} + +#endif // wxUSE_COLOURPICKERCTRL diff --git a/Externals/wxWidgets/src/generic/collpaneg.cpp b/Externals/wxWidgets/src/generic/collpaneg.cpp new file mode 100644 index 0000000000..7f8848f4b7 --- /dev/null +++ b/Externals/wxWidgets/src/generic/collpaneg.cpp @@ -0,0 +1,307 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/generic/collpaneg.cpp +// Purpose: wxGenericCollapsiblePane +// Author: Francesco Montorsi +// Modified By: +// Created: 8/10/2006 +// Id: $Id: collpaneg.cpp 43371 2006-11-12 21:38:49Z VZ $ +// Copyright: (c) Francesco Montorsi +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" +#include "wx/defs.h" + +#if wxUSE_COLLPANE && wxUSE_BUTTON && wxUSE_STATLINE + +#include "wx/collpane.h" + +#ifndef WX_PRECOMP + #include "wx/toplevel.h" + #include "wx/button.h" + #include "wx/sizer.h" + #include "wx/panel.h" +#endif // !WX_PRECOMP + +#include "wx/statline.h" + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// ============================================================================ +// implementation +// ============================================================================ + +const wxChar wxCollapsiblePaneNameStr[] = wxT("collapsiblePane"); + +//----------------------------------------------------------------------------- +// wxGenericCollapsiblePane +//----------------------------------------------------------------------------- + +DEFINE_EVENT_TYPE(wxEVT_COMMAND_COLLPANE_CHANGED) +IMPLEMENT_DYNAMIC_CLASS(wxGenericCollapsiblePane, wxControl) +IMPLEMENT_DYNAMIC_CLASS(wxCollapsiblePaneEvent, wxCommandEvent) + +BEGIN_EVENT_TABLE(wxGenericCollapsiblePane, wxControl) + EVT_BUTTON(wxID_ANY, wxGenericCollapsiblePane::OnButton) + EVT_SIZE(wxGenericCollapsiblePane::OnSize) +END_EVENT_TABLE() + + +bool wxGenericCollapsiblePane::Create(wxWindow *parent, + wxWindowID id, + const wxString& label, + const wxPoint& pos, + const wxSize& size, + long style, + const wxValidator& val, + const wxString& name) +{ + if ( !wxControl::Create(parent, id, pos, size, style, val, name) ) + return false; + + m_strLabel = label; + + // create children and lay them out using a wxBoxSizer + // (so that we automatically get RTL features) + m_pButton = new wxButton(this, wxID_ANY, GetBtnLabel(), wxPoint(0, 0), + wxDefaultSize, wxBU_EXACTFIT); + m_pStaticLine = new wxStaticLine(this, wxID_ANY); +#ifdef __WXMAC__ + // on Mac we put the static libe above the button + m_sz = new wxBoxSizer(wxVERTICAL); + m_sz->Add(m_pStaticLine, 0, wxALL|wxGROW, GetBorder()); + m_sz->Add(m_pButton, 0, wxLEFT|wxRIGHT|wxBOTTOM, GetBorder()); +#else + // on other platforms we put the static line and the button horizontally + m_sz = new wxBoxSizer(wxHORIZONTAL); + m_sz->Add(m_pButton, 0, wxLEFT|wxTOP|wxBOTTOM, GetBorder()); + m_sz->Add(m_pStaticLine, 1, wxALIGN_CENTER|wxLEFT|wxRIGHT, GetBorder()); +#endif + + // FIXME: at least under wxCE and wxGTK1 the background is black if we don't do + // this, no idea why... +#if defined(__WXWINCE__) || (defined(__WXGTK__) && !defined(__WXGTK20__)) + SetBackgroundColour(parent->GetBackgroundColour()); +#endif + + // do not set sz as our sizers since we handle the pane window without using sizers + m_pPane = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, + wxTAB_TRAVERSAL|wxNO_BORDER); + + // start as collapsed: + m_pPane->Hide(); + + return true; +} + +wxGenericCollapsiblePane::~wxGenericCollapsiblePane() +{ + if (m_pButton && m_pStaticLine && m_sz) + { + m_pButton->SetContainingSizer(NULL); + m_pStaticLine->SetContainingSizer(NULL); + + // our sizer is not deleted automatically since we didn't use SetSizer()! + wxDELETE(m_sz); + } +} + +wxSize wxGenericCollapsiblePane::DoGetBestSize() const +{ + // NB: do not use GetSize() but rather GetMinSize() + wxSize sz = m_sz->GetMinSize(); + + // when expanded, we need more vertical space + if ( IsExpanded() ) + { + sz.SetWidth(wxMax( sz.GetWidth(), m_pPane->GetBestSize().x )); + sz.SetHeight(sz.y + GetBorder() + m_pPane->GetBestSize().y); + } + + return sz; +} + +wxString wxGenericCollapsiblePane::GetBtnLabel() const +{ + return m_strLabel + (IsCollapsed() ? wxT(" >>") : wxT(" <<")); +} + +void wxGenericCollapsiblePane::OnStateChange(const wxSize& sz) +{ + // minimal size has priority over the best size so set here our min size + SetMinSize(sz); + SetSize(sz); + + if (this->HasFlag(wxCP_NO_TLW_RESIZE)) + { + // the user asked to explicitely handle the resizing itself... + return; + } + + + // + // NB: the following block of code has been accurately designed to + // as much flicker-free as possible; be careful when modifying it! + // + + wxTopLevelWindow * + top = wxDynamicCast(wxGetTopLevelParent(this), wxTopLevelWindow); + if ( top ) + { + // NB: don't Layout() the 'top' window as its size has not been correctly + // updated yet and we don't want to do an initial Layout() with the old + // size immediately followed by a SetClientSize/Fit call for the new + // size; that would provoke flickering! + + if (top->GetSizer()) +#ifdef __WXGTK__ + // FIXME: the SetSizeHints() call would be required also for GTK+ for + // the expanded->collapsed transition. Unfortunately if we + // enable this line, then the GTK+ top window won't always be + // resized by the SetClientSize() call below! As a side effect + // of this dirty fix, the minimal size for the pane window is + // not set in GTK+ and the user can hide it shrinking the "top" + // window... + if (IsCollapsed()) +#endif + top->GetSizer()->SetSizeHints(top); + + + // we shouldn't attempt to resize a maximized window, whatever happens + if ( !top->IsMaximized() ) + { + if ( IsCollapsed() ) + { + // expanded -> collapsed transition + if (top->GetSizer()) + { + // we have just set the size hints... + wxSize sz = top->GetSizer()->CalcMin(); + + // use SetClientSize() and not SetSize() otherwise the size for + // e.g. a wxFrame with a menubar wouldn't be correctly set + top->SetClientSize(sz); + } + else + top->Layout(); + } + else + { + // collapsed -> expanded transition + + // force our parent to "fit", i.e. expand so that it can honour + // our minimal size + top->Fit(); + } + } + } +} + +void wxGenericCollapsiblePane::Collapse(bool collapse) +{ + // optimization + if ( IsCollapsed() == collapse ) + return; + + // update our state + m_pPane->Show(!collapse); + + // update button label + // NB: this must be done after updating our "state" + m_pButton->SetLabel(GetBtnLabel()); + + OnStateChange(GetBestSize()); +} + +void wxGenericCollapsiblePane::SetLabel(const wxString &label) +{ + m_strLabel = label; + m_pButton->SetLabel(GetBtnLabel()); + m_pButton->SetInitialSize(); + + Layout(); +} + +bool wxGenericCollapsiblePane::Layout() +{ + if (!m_pButton || !m_pStaticLine || !m_pPane || !m_sz) + return false; // we need to complete the creation first! + + wxSize oursz(GetSize()); + + // move & resize the button and the static line + m_sz->SetDimension(0, 0, oursz.GetWidth(), m_sz->GetMinSize().GetHeight()); + m_sz->Layout(); + + if ( IsExpanded() ) + { + // move & resize the container window + int yoffset = m_sz->GetSize().GetHeight() + GetBorder(); + m_pPane->SetSize(0, yoffset, + oursz.x, oursz.y - yoffset); + + // this is very important to make the pane window layout show correctly + m_pPane->Layout(); + } + + return true; +} + +int wxGenericCollapsiblePane::GetBorder() const +{ +#if defined( __WXMAC__ ) + return 6; +#elif defined(__WXGTK20__) + return 3; +#elif defined(__WXMSW__) + wxASSERT(m_pButton); + return m_pButton->ConvertDialogToPixels(wxSize(2, 0)).x; +#else + return 5; +#endif +} + + + +//----------------------------------------------------------------------------- +// wxGenericCollapsiblePane - event handlers +//----------------------------------------------------------------------------- + +void wxGenericCollapsiblePane::OnButton(wxCommandEvent& event) +{ + if ( event.GetEventObject() != m_pButton ) + { + event.Skip(); + return; + } + + Collapse(!IsCollapsed()); + + // this change was generated by the user - send the event + wxCollapsiblePaneEvent ev(this, GetId(), IsCollapsed()); + GetEventHandler()->ProcessEvent(ev); +} + +void wxGenericCollapsiblePane::OnSize(wxSizeEvent& WXUNUSED(event)) +{ +#if 0 // for debug only + wxClientDC dc(this); + dc.SetPen(*wxBLACK_PEN); + dc.SetBrush(*wxTRANSPARENT_BRUSH); + dc.DrawRectangle(wxPoint(0,0), GetSize()); + dc.SetPen(*wxRED_PEN); + dc.DrawRectangle(wxPoint(0,0), GetBestSize()); +#endif + + Layout(); +} + +#endif // wxUSE_COLLPANE && wxUSE_BUTTON && wxUSE_STATLINE diff --git a/Externals/wxWidgets/src/generic/colour.cpp b/Externals/wxWidgets/src/generic/colour.cpp new file mode 100644 index 0000000000..c90a7a7a7a --- /dev/null +++ b/Externals/wxWidgets/src/generic/colour.cpp @@ -0,0 +1,72 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/generic/colour.cpp +// Purpose: wxColour class +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: colour.cpp 41123 2006-09-10 02:00:24Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#include "wx/colour.h" + +#ifndef WX_PRECOMP + #include "wx/gdicmn.h" +#endif + +IMPLEMENT_DYNAMIC_CLASS(wxColour, wxObject) + +// Colour + +void wxColour::Init() +{ + m_red = + m_blue = + m_green = 0; + m_alpha = wxALPHA_OPAQUE; + m_isInit = false; +} + +wxColour::wxColour() +{ + Init(); +} + +wxColour::wxColour(const wxColour& col) +{ + *this = col; +} + +wxColour& wxColour::operator=(const wxColour& col) +{ + m_red = col.m_red; + m_green = col.m_green; + m_blue = col.m_blue; + m_alpha = col.m_alpha; + m_isInit = col.m_isInit; + return *this; +} + +wxColour::~wxColour() +{ +} + +void wxColour::InitRGBA(unsigned char r, + unsigned char g, + unsigned char b, + unsigned char a) +{ + m_red = r; + m_green = g; + m_blue = b; + m_alpha = a; + m_isInit = true; +} diff --git a/Externals/wxWidgets/src/generic/colrdlgg.cpp b/Externals/wxWidgets/src/generic/colrdlgg.cpp new file mode 100644 index 0000000000..c05fe38c3d --- /dev/null +++ b/Externals/wxWidgets/src/generic/colrdlgg.cpp @@ -0,0 +1,586 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/generic/colrdlgg.cpp +// Purpose: Choice dialogs +// Author: Julian Smart +// Modified by: +// Created: 04/01/98 +// RCS-ID: $Id: colrdlgg.cpp 41838 2006-10-09 21:08:45Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_COLOURDLG && (!defined(__WXGTK20__) || defined(__WXUNIVERSAL__)) + +#ifndef WX_PRECOMP + #include "wx/utils.h" + #include "wx/intl.h" + #include "wx/dialog.h" + #include "wx/listbox.h" + #include "wx/button.h" + #include "wx/stattext.h" + #include "wx/layout.h" + #include "wx/dcclient.h" + #include "wx/sizer.h" + #include "wx/slider.h" +#endif + +#if wxUSE_STATLINE + #include "wx/statline.h" +#endif + +#include "wx/generic/colrdlgg.h" + +IMPLEMENT_DYNAMIC_CLASS(wxGenericColourDialog, wxDialog) + +BEGIN_EVENT_TABLE(wxGenericColourDialog, wxDialog) + EVT_BUTTON(wxID_ADD_CUSTOM, wxGenericColourDialog::OnAddCustom) +#if wxUSE_SLIDER + EVT_SLIDER(wxID_RED_SLIDER, wxGenericColourDialog::OnRedSlider) + EVT_SLIDER(wxID_GREEN_SLIDER, wxGenericColourDialog::OnGreenSlider) + EVT_SLIDER(wxID_BLUE_SLIDER, wxGenericColourDialog::OnBlueSlider) +#endif + EVT_PAINT(wxGenericColourDialog::OnPaint) + EVT_MOUSE_EVENTS(wxGenericColourDialog::OnMouseEvent) + EVT_CLOSE(wxGenericColourDialog::OnCloseWindow) +END_EVENT_TABLE() + + +/* + * Generic wxColourDialog + */ + +// don't change the number of elements (48) in this array, the code below is +// hardcoded to use it +static const wxChar *wxColourDialogNames[] = +{ + wxT("ORANGE"), + wxT("GOLDENROD"), + wxT("WHEAT"), + wxT("SPRING GREEN"), + wxT("SKY BLUE"), + wxT("SLATE BLUE"), + wxT("MEDIUM VIOLET RED"), + wxT("PURPLE"), + + wxT("RED"), + wxT("YELLOW"), + wxT("MEDIUM SPRING GREEN"), + wxT("PALE GREEN"), + wxT("CYAN"), + wxT("LIGHT STEEL BLUE"), + wxT("ORCHID"), + wxT("LIGHT MAGENTA"), + + wxT("BROWN"), + wxT("YELLOW"), + wxT("GREEN"), + wxT("CADET BLUE"), + wxT("MEDIUM BLUE"), + wxT("MAGENTA"), + wxT("MAROON"), + wxT("ORANGE RED"), + + wxT("FIREBRICK"), + wxT("CORAL"), + wxT("FOREST GREEN"), + wxT("AQUAMARINE"), + wxT("BLUE"), + wxT("NAVY"), + wxT("THISTLE"), + wxT("MEDIUM VIOLET RED"), + + wxT("INDIAN RED"), + wxT("GOLD"), + wxT("MEDIUM SEA GREEN"), + wxT("MEDIUM BLUE"), + wxT("MIDNIGHT BLUE"), + wxT("GREY"), + wxT("PURPLE"), + wxT("KHAKI"), + + wxT("BLACK"), + wxT("MEDIUM FOREST GREEN"), + wxT("KHAKI"), + wxT("DARK GREY"), + wxT("SEA GREEN"), + wxT("LIGHT GREY"), + wxT("MEDIUM SLATE BLUE"), + wxT("WHITE") +}; + +wxGenericColourDialog::wxGenericColourDialog() +{ + dialogParent = NULL; + whichKind = 1; + colourSelection = -1; +} + +wxGenericColourDialog::wxGenericColourDialog(wxWindow *parent, + wxColourData *data) +{ + whichKind = 1; + colourSelection = -1; + Create(parent, data); +} + +wxGenericColourDialog::~wxGenericColourDialog() +{ +} + +void wxGenericColourDialog::OnCloseWindow(wxCloseEvent& WXUNUSED(event)) +{ + EndModal(wxID_CANCEL); +} + +bool wxGenericColourDialog::Create(wxWindow *parent, wxColourData *data) +{ + if ( !wxDialog::Create(parent, wxID_ANY, _("Choose colour"), + wxPoint(0,0), wxSize(900, 900)) ) + return false; + + dialogParent = parent; + + if (data) + colourData = *data; + + InitializeColours(); + CalculateMeasurements(); + CreateWidgets(); + + return true; +} + +int wxGenericColourDialog::ShowModal() +{ + return wxDialog::ShowModal(); +} + + +// Internal functions +void wxGenericColourDialog::OnMouseEvent(wxMouseEvent& event) +{ + if (event.ButtonDown(1)) + { + int x = (int)event.GetX(); + int y = (int)event.GetY(); + +#ifdef __WXPM__ + // Handle OS/2's reverse coordinate system and account for the dialog title + int nClientHeight; + + GetClientSize(NULL, &nClientHeight); + y = (nClientHeight - y) + 20; +#endif + if ((x >= standardColoursRect.x && x <= (standardColoursRect.x + standardColoursRect.width)) && + (y >= standardColoursRect.y && y <= (standardColoursRect.y + standardColoursRect.height))) + { + int selX = (int)(x - standardColoursRect.x)/(smallRectangleSize.x + gridSpacing); + int selY = (int)(y - standardColoursRect.y)/(smallRectangleSize.y + gridSpacing); + int ptr = (int)(selX + selY*8); + OnBasicColourClick(ptr); + } + else if ((x >= customColoursRect.x && x <= (customColoursRect.x + customColoursRect.width)) && + (y >= customColoursRect.y && y <= (customColoursRect.y + customColoursRect.height))) + { + int selX = (int)(x - customColoursRect.x)/(smallRectangleSize.x + gridSpacing); + int selY = (int)(y - customColoursRect.y)/(smallRectangleSize.y + gridSpacing); + int ptr = (int)(selX + selY*8); + OnCustomColourClick(ptr); + } + else + event.Skip(); + } + else + event.Skip(); +} + +void wxGenericColourDialog::OnPaint(wxPaintEvent& event) +{ +#if !defined(__WXMOTIF__) && !defined(__WXPM__) && !defined(__WXCOCOA__) + wxDialog::OnPaint(event); +#else + wxUnusedVar(event); +#endif + + wxPaintDC dc(this); + + PaintBasicColours(dc); + PaintCustomColours(dc); + PaintCustomColour(dc); + PaintHighlight(dc, true); +} + +void wxGenericColourDialog::CalculateMeasurements() +{ + smallRectangleSize.x = 18; + smallRectangleSize.y = 14; + customRectangleSize.x = 40; + customRectangleSize.y = 40; + + gridSpacing = 6; + sectionSpacing = 15; + + standardColoursRect.x = 10; +#ifdef __WXPM__ + standardColoursRect.y = 15 + 20; /* OS/2 needs to account for dialog titlebar */ +#else + standardColoursRect.y = 15; +#endif + standardColoursRect.width = (8*smallRectangleSize.x) + (7*gridSpacing); + standardColoursRect.height = (6*smallRectangleSize.y) + (5*gridSpacing); + + customColoursRect.x = standardColoursRect.x; + customColoursRect.y = standardColoursRect.y + standardColoursRect.height + 20; + customColoursRect.width = (8*smallRectangleSize.x) + (7*gridSpacing); + customColoursRect.height = (2*smallRectangleSize.y) + (1*gridSpacing); + + singleCustomColourRect.x = customColoursRect.width + customColoursRect.x + sectionSpacing; + singleCustomColourRect.y = 80; + singleCustomColourRect.width = customRectangleSize.x; + singleCustomColourRect.height = customRectangleSize.y; + + okButtonX = 10; + customButtonX = singleCustomColourRect.x ; + buttonY = customColoursRect.y + customColoursRect.height + 10; +} + +void wxGenericColourDialog::CreateWidgets() +{ + wxBeginBusyCursor(); + + wxBoxSizer *topSizer = new wxBoxSizer( wxVERTICAL ); + + const int sliderHeight = 160; + + // first sliders +#if wxUSE_SLIDER + const int sliderX = singleCustomColourRect.x + singleCustomColourRect.width + sectionSpacing; + + redSlider = new wxSlider(this, wxID_RED_SLIDER, colourData.m_dataColour.Red(), 0, 255, + wxDefaultPosition, wxSize(wxDefaultCoord, sliderHeight), wxSL_VERTICAL|wxSL_LABELS|wxSL_INVERSE); + greenSlider = new wxSlider(this, wxID_GREEN_SLIDER, colourData.m_dataColour.Green(), 0, 255, + wxDefaultPosition, wxSize(wxDefaultCoord, sliderHeight), wxSL_VERTICAL|wxSL_LABELS|wxSL_INVERSE); + blueSlider = new wxSlider(this, wxID_BLUE_SLIDER, colourData.m_dataColour.Blue(), 0, 255, + wxDefaultPosition, wxSize(wxDefaultCoord, sliderHeight), wxSL_VERTICAL|wxSL_LABELS|wxSL_INVERSE); + + wxBoxSizer *sliderSizer = new wxBoxSizer( wxHORIZONTAL ); + + sliderSizer->Add(sliderX, sliderHeight ); + + wxSizerFlags flagsRight; + flagsRight.Align(wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL).DoubleBorder(); + + sliderSizer->Add(redSlider, flagsRight); + sliderSizer->Add(greenSlider,flagsRight); + sliderSizer->Add(blueSlider,flagsRight); + + topSizer->Add(sliderSizer, wxSizerFlags().Centre().DoubleBorder()); +#else + topSizer->Add(1, sliderHeight, wxSizerFlags(1).Centre().TripleBorder()); +#endif // wxUSE_SLIDER + + // then the custom button + topSizer->Add(new wxButton(this, wxID_ADD_CUSTOM, + _("Add to custom colours") ), + wxSizerFlags().DoubleHorzBorder()); + + // then the standard buttons + wxSizer *buttonsizer = CreateSeparatedButtonSizer(wxOK | wxCANCEL); + if ( buttonsizer ) + { + topSizer->Add(buttonsizer, wxSizerFlags().Expand().DoubleBorder()); + } + + SetAutoLayout( true ); + SetSizer( topSizer ); + + topSizer->SetSizeHints( this ); + topSizer->Fit( this ); + + Centre( wxBOTH ); + + wxEndBusyCursor(); +} + +void wxGenericColourDialog::InitializeColours(void) +{ + size_t i; + + for (i = 0; i < WXSIZEOF(wxColourDialogNames); i++) + { + wxColour col = wxTheColourDatabase->Find(wxColourDialogNames[i]); + if (col.Ok()) + standardColours[i].Set(col.Red(), col.Green(), col.Blue()); + else + standardColours[i].Set(0, 0, 0); + } + + for (i = 0; i < WXSIZEOF(customColours); i++) + { + wxColour c = colourData.GetCustomColour(i); + if (c.Ok()) + customColours[i] = colourData.GetCustomColour(i); + else + customColours[i] = wxColour(255, 255, 255); + } + + wxColour curr = colourData.GetColour(); + if ( curr.Ok() ) + { + bool initColourFound = false; + + for (i = 0; i < WXSIZEOF(wxColourDialogNames); i++) + { + if ( standardColours[i] == curr && !initColourFound ) + { + whichKind = 1; + colourSelection = i; + initColourFound = true; + break; + } + } + if ( !initColourFound ) + { + for ( i = 0; i < WXSIZEOF(customColours); i++ ) + { + if ( customColours[i] == curr ) + { + whichKind = 2; + colourSelection = i; + break; + } + } + } + colourData.m_dataColour.Set( curr.Red(), curr.Green(), curr.Blue() ); + } + else + { + whichKind = 1; + colourSelection = 0; + colourData.m_dataColour.Set( 0, 0, 0 ); + } +} + +void wxGenericColourDialog::PaintBasicColours(wxDC& dc) +{ + int i; + for (i = 0; i < 6; i++) + { + int j; + for (j = 0; j < 8; j++) + { + int ptr = i*8 + j; + + int x = (j*(smallRectangleSize.x+gridSpacing) + standardColoursRect.x); + int y = (i*(smallRectangleSize.y+gridSpacing) + standardColoursRect.y); + + dc.SetPen(*wxBLACK_PEN); + wxBrush brush(standardColours[ptr], wxSOLID); + dc.SetBrush(brush); + + dc.DrawRectangle( x, y, smallRectangleSize.x, smallRectangleSize.y); + } + } +} + +void wxGenericColourDialog::PaintCustomColours(wxDC& dc) +{ + int i; + for (i = 0; i < 2; i++) + { + int j; + for (j = 0; j < 8; j++) + { + int ptr = i*8 + j; + + int x = (j*(smallRectangleSize.x+gridSpacing)) + customColoursRect.x; + int y = (i*(smallRectangleSize.y+gridSpacing)) + customColoursRect.y; + + dc.SetPen(*wxBLACK_PEN); + + wxBrush brush(customColours[ptr], wxSOLID); + dc.SetBrush(brush); + + dc.DrawRectangle( x, y, smallRectangleSize.x, smallRectangleSize.y); + } + } +} + +void wxGenericColourDialog::PaintHighlight(wxDC& dc, bool draw) +{ + if ( colourSelection < 0 ) + return; + + // Number of pixels bigger than the standard rectangle size + // for drawing a highlight + int deltaX = 2; + int deltaY = 2; + + if (whichKind == 1) + { + // Standard colours + int y = (int)(colourSelection / 8); + int x = (int)(colourSelection - (y*8)); + + x = (x*(smallRectangleSize.x + gridSpacing) + standardColoursRect.x) - deltaX; + y = (y*(smallRectangleSize.y + gridSpacing) + standardColoursRect.y) - deltaY; + + if (draw) + dc.SetPen(*wxBLACK_PEN); + else + dc.SetPen(*wxLIGHT_GREY_PEN); + + dc.SetBrush(*wxTRANSPARENT_BRUSH); + dc.DrawRectangle( x, y, (smallRectangleSize.x + (2*deltaX)), (smallRectangleSize.y + (2*deltaY))); + } + else + { + // User-defined colours + int y = (int)(colourSelection / 8); + int x = (int)(colourSelection - (y*8)); + + x = (x*(smallRectangleSize.x + gridSpacing) + customColoursRect.x) - deltaX; + y = (y*(smallRectangleSize.y + gridSpacing) + customColoursRect.y) - deltaY; + + if (draw) + dc.SetPen(*wxBLACK_PEN); + else + dc.SetPen(*wxLIGHT_GREY_PEN); + + dc.SetBrush(*wxTRANSPARENT_BRUSH); + dc.DrawRectangle( x, y, (smallRectangleSize.x + (2*deltaX)), (smallRectangleSize.y + (2*deltaY))); + } +} + +void wxGenericColourDialog::PaintCustomColour(wxDC& dc) +{ + dc.SetPen(*wxBLACK_PEN); + + wxBrush *brush = new wxBrush(colourData.m_dataColour, wxSOLID); + dc.SetBrush(*brush); + + dc.DrawRectangle( singleCustomColourRect.x, singleCustomColourRect.y, + customRectangleSize.x, customRectangleSize.y); + + dc.SetBrush(wxNullBrush); + delete brush; +} + +void wxGenericColourDialog::OnBasicColourClick(int which) +{ + wxClientDC dc(this); + + PaintHighlight(dc, false); + whichKind = 1; + colourSelection = which; + +#if wxUSE_SLIDER + redSlider->SetValue( standardColours[colourSelection].Red() ); + greenSlider->SetValue( standardColours[colourSelection].Green() ); + blueSlider->SetValue( standardColours[colourSelection].Blue() ); +#endif // wxUSE_SLIDER + + colourData.m_dataColour.Set(standardColours[colourSelection].Red(), + standardColours[colourSelection].Green(), + standardColours[colourSelection].Blue()); + + PaintCustomColour(dc); + PaintHighlight(dc, true); +} + +void wxGenericColourDialog::OnCustomColourClick(int which) +{ + wxClientDC dc(this); + PaintHighlight(dc, false); + whichKind = 2; + colourSelection = which; + +#if wxUSE_SLIDER + redSlider->SetValue( customColours[colourSelection].Red() ); + greenSlider->SetValue( customColours[colourSelection].Green() ); + blueSlider->SetValue( customColours[colourSelection].Blue() ); +#endif // wxUSE_SLIDER + + colourData.m_dataColour.Set(customColours[colourSelection].Red(), + customColours[colourSelection].Green(), + customColours[colourSelection].Blue()); + + PaintCustomColour(dc); + PaintHighlight(dc, true); +} + +/* +void wxGenericColourDialog::OnOk(void) +{ + Show(false); +} + +void wxGenericColourDialog::OnCancel(void) +{ + colourDialogCancelled = true; + Show(false); +} +*/ + +void wxGenericColourDialog::OnAddCustom(wxCommandEvent& WXUNUSED(event)) +{ + wxClientDC dc(this); + if (whichKind != 2) + { + PaintHighlight(dc, false); + whichKind = 2; + colourSelection = 0; + PaintHighlight(dc, true); + } + + customColours[colourSelection].Set(colourData.m_dataColour.Red(), + colourData.m_dataColour.Green(), + colourData.m_dataColour.Blue()); + + colourData.SetCustomColour(colourSelection, customColours[colourSelection]); + + PaintCustomColours(dc); +} + +#if wxUSE_SLIDER + +void wxGenericColourDialog::OnRedSlider(wxCommandEvent& WXUNUSED(event)) +{ + if (!redSlider) + return; + + wxClientDC dc(this); + colourData.m_dataColour.Set((unsigned char)redSlider->GetValue(), colourData.m_dataColour.Green(), colourData.m_dataColour.Blue()); + PaintCustomColour(dc); +} + +void wxGenericColourDialog::OnGreenSlider(wxCommandEvent& WXUNUSED(event)) +{ + if (!greenSlider) + return; + + wxClientDC dc(this); + colourData.m_dataColour.Set(colourData.m_dataColour.Red(), (unsigned char)greenSlider->GetValue(), colourData.m_dataColour.Blue()); + PaintCustomColour(dc); +} + +void wxGenericColourDialog::OnBlueSlider(wxCommandEvent& WXUNUSED(event)) +{ + if (!blueSlider) + return; + + wxClientDC dc(this); + colourData.m_dataColour.Set(colourData.m_dataColour.Red(), colourData.m_dataColour.Green(), (unsigned char)blueSlider->GetValue()); + PaintCustomColour(dc); +} + +#endif // wxUSE_SLIDER + +#endif // wxUSE_COLOURDLG && !defined(__WXGTK20__) diff --git a/Externals/wxWidgets/src/generic/combog.cpp b/Externals/wxWidgets/src/generic/combog.cpp new file mode 100644 index 0000000000..8f3fd9ef7a --- /dev/null +++ b/Externals/wxWidgets/src/generic/combog.cpp @@ -0,0 +1,483 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/generic/combog.cpp +// Purpose: Generic wxComboCtrl +// Author: Jaakko Salli +// Modified by: +// Created: Apr-30-2006 +// RCS-ID: $Id: combog.cpp 45232 2007-04-03 02:44:32Z PC $ +// Copyright: (c) 2005 Jaakko Salli +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_COMBOCTRL + +#include "wx/combo.h" + +#ifndef WX_PRECOMP + #include "wx/log.h" + #include "wx/combobox.h" + #include "wx/dcclient.h" + #include "wx/settings.h" +#endif + +#include "wx/dcbuffer.h" + +// ---------------------------------------------------------------------------- +// Some constant adjustments to make the generic more bearable + +#if defined(__WXUNIVERSAL__) + +#define TEXTCTRLXADJUST 0 // position adjustment for wxTextCtrl, with zero indent +#define TEXTCTRLYADJUST 0 +#define TEXTXADJUST 0 // how much is read-only text's x adjusted +#define DEFAULT_DROPBUTTON_WIDTH 19 + +#elif defined(__WXMSW__) + +#define TEXTCTRLXADJUST 2 // position adjustment for wxTextCtrl, with zero indent +#define TEXTCTRLYADJUST 3 +#define TEXTXADJUST 0 // how much is read-only text's x adjusted +#define DEFAULT_DROPBUTTON_WIDTH 17 + +#elif defined(__WXGTK__) + +#define TEXTCTRLXADJUST -1 // position adjustment for wxTextCtrl, with zero indent +#define TEXTCTRLYADJUST 0 +#define TEXTXADJUST 1 // how much is read-only text's x adjusted +#define DEFAULT_DROPBUTTON_WIDTH 23 + +#elif defined(__WXMAC__) + +#define TEXTCTRLXADJUST 0 // position adjustment for wxTextCtrl, with zero indent +#define TEXTCTRLYADJUST 0 +#define TEXTXADJUST 0 // how much is read-only text's x adjusted +#define DEFAULT_DROPBUTTON_WIDTH 22 + +#else + +#define TEXTCTRLXADJUST 0 // position adjustment for wxTextCtrl, with zero indent +#define TEXTCTRLYADJUST 0 +#define TEXTXADJUST 0 // how much is read-only text's x adjusted +#define DEFAULT_DROPBUTTON_WIDTH 19 + +#endif + + +// ============================================================================ +// implementation +// ============================================================================ + +// Only implement if no native or it wasn't fully featured +#ifndef wxCOMBOCONTROL_FULLY_FEATURED + + +// ---------------------------------------------------------------------------- +// wxGenericComboCtrl +// ---------------------------------------------------------------------------- + +BEGIN_EVENT_TABLE(wxGenericComboCtrl, wxComboCtrlBase) + EVT_PAINT(wxGenericComboCtrl::OnPaintEvent) + EVT_MOUSE_EVENTS(wxGenericComboCtrl::OnMouseEvent) +END_EVENT_TABLE() + + +IMPLEMENT_DYNAMIC_CLASS(wxGenericComboCtrl, wxComboCtrlBase) + +void wxGenericComboCtrl::Init() +{ +} + +bool wxGenericComboCtrl::Create(wxWindow *parent, + wxWindowID id, + const wxString& value, + const wxPoint& pos, + const wxSize& size, + long style, + const wxValidator& validator, + const wxString& name) +{ + // + // Note that technically we only support 'default' border and wxNO_BORDER. + long border = style & wxBORDER_MASK; + int tcBorder = wxNO_BORDER; + +#if defined(__WXUNIVERSAL__) + if ( !border ) + border = wxBORDER_SIMPLE; +#elif defined(__WXMSW__) + if ( !border ) + // For XP, have 1-width custom border, for older version use sunken + /*if ( wxUxThemeEngine::GetIfActive() ) + { + border = wxBORDER_NONE; + m_widthCustomBorder = 1; + } + else*/ + border = wxBORDER_SUNKEN; +#else + + // + // Generic version is optimized for wxGTK + // + + #define UNRELIABLE_TEXTCTRL_BORDER + + if ( !border ) + { + if ( style & wxCB_READONLY ) + { + m_widthCustomBorder = 1; + } + else + { + m_widthCustomBorder = 0; + tcBorder = 0; + } + } + else + { + // Have textctrl instead use the border given. + tcBorder = border; + } + + // Because we are going to have button outside the border, + // let's use wxBORDER_NONE for the whole control. + border = wxBORDER_NONE; + + Customize( wxCC_BUTTON_OUTSIDE_BORDER | + wxCC_NO_TEXT_AUTO_SELECT ); + +#endif + + style = (style & ~(wxBORDER_MASK)) | border; + if ( style & wxCC_STD_BUTTON ) + m_iFlags |= wxCC_POPUP_ON_MOUSE_UP; + + // create main window + if ( !wxComboCtrlBase::Create(parent, + id, + value, + pos, + size, + style | wxFULL_REPAINT_ON_RESIZE, + wxDefaultValidator, + name) ) + return false; + + // Create textctrl, if necessary + CreateTextCtrl( tcBorder, validator ); + + // Add keyboard input handlers for main control and textctrl + InstallInputHandlers(); + + // Set background + SetBackgroundStyle( wxBG_STYLE_CUSTOM ); // for double-buffering + + // SetInitialSize should be called last + SetInitialSize(size); + + return true; +} + +wxGenericComboCtrl::~wxGenericComboCtrl() +{ +} + +void wxGenericComboCtrl::OnResize() +{ + + // Recalculates button and textctrl areas + CalculateAreas(DEFAULT_DROPBUTTON_WIDTH); + +#if 0 + // Move separate button control, if any, to correct position + if ( m_btn ) + { + wxSize sz = GetClientSize(); + m_btn->SetSize( m_btnArea.x + m_btnSpacingX, + (sz.y-m_btnSize.y)/2, + m_btnSize.x, + m_btnSize.y ); + } +#endif + + // Move textctrl, if any, accordingly + PositionTextCtrl( TEXTCTRLXADJUST, TEXTCTRLYADJUST ); +} + +void wxGenericComboCtrl::OnPaintEvent( wxPaintEvent& WXUNUSED(event) ) +{ + wxSize sz = GetClientSize(); + wxAutoBufferedPaintDC dc(this); + + const wxRect& rectb = m_btnArea; + wxRect rect = m_tcArea; + + // artificial simple border + if ( m_widthCustomBorder ) + { + int customBorder = m_widthCustomBorder; + + // Set border colour + wxPen pen1( wxSystemSettings::GetColour(wxSYS_COLOUR_GRAYTEXT), + customBorder, + wxSOLID ); + dc.SetPen( pen1 ); + + // area around both controls + wxRect rect2(0,0,sz.x,sz.y); + if ( m_iFlags & wxCC_IFLAG_BUTTON_OUTSIDE ) + { + rect2 = m_tcArea; + if ( customBorder == 1 ) + { + rect2.Inflate(1); + } + else + { + #ifdef __WXGTK__ + rect2.x -= 1; + rect2.y -= 1; + #else + rect2.x -= customBorder; + rect2.y -= customBorder; + #endif + rect2.width += 1 + customBorder; + rect2.height += 1 + customBorder; + } + } + + dc.SetBrush( *wxTRANSPARENT_BRUSH ); + dc.DrawRectangle(rect2); + } + +#ifndef __WXMAC__ // see note in OnThemeChange + wxColour winCol = GetBackgroundColour(); +#else + wxColour winCol = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW); +#endif + dc.SetBrush(winCol); + dc.SetPen(winCol); + + //wxLogDebug(wxT("hei: %i tcy: %i tchei: %i"),GetClientSize().y,m_tcArea.y,m_tcArea.height); + //wxLogDebug(wxT("btnx: %i tcx: %i tcwid: %i"),m_btnArea.x,m_tcArea.x,m_tcArea.width); + + // clear main background + dc.DrawRectangle(rect); + + if ( !m_btn ) + { + // Standard button rendering + DrawButton(dc,rectb); + } + + // paint required portion on the control + if ( (!m_text || m_widthCustomPaint) ) + { + wxASSERT( m_widthCustomPaint >= 0 ); + + // this is intentionally here to allow drawed rectangle's + // right edge to be hidden + if ( m_text ) + rect.width = m_widthCustomPaint; + + dc.SetFont( GetFont() ); + + dc.SetClippingRegion(rect); + if ( m_popupInterface ) + m_popupInterface->PaintComboControl(dc,rect); + else + wxComboPopup::DefaultPaintComboControl(this,dc,rect); + } +} + +void wxGenericComboCtrl::OnMouseEvent( wxMouseEvent& event ) +{ + int mx = event.m_x; + bool isOnButtonArea = m_btnArea.Contains(mx,event.m_y); + int handlerFlags = isOnButtonArea ? wxCC_MF_ON_BUTTON : 0; + + if ( PreprocessMouseEvent(event,handlerFlags) ) + return; + + const bool ctrlIsButton = wxPlatformIs(wxOS_WINDOWS); + + if ( ctrlIsButton && + (m_windowStyle & (wxCC_SPECIAL_DCLICK|wxCB_READONLY)) == wxCB_READONLY ) + { + // if no textctrl and no special double-click, then the entire control acts + // as a button + handlerFlags |= wxCC_MF_ON_BUTTON; + if ( HandleButtonMouseEvent(event,handlerFlags) ) + return; + } + else + { + if ( isOnButtonArea || HasCapture() || + (m_widthCustomPaint && mx < (m_tcArea.x+m_widthCustomPaint)) ) + { + handlerFlags |= wxCC_MF_ON_CLICK_AREA; + + if ( HandleButtonMouseEvent(event,handlerFlags) ) + return; + } + else if ( m_btnState ) + { + // otherwise need to clear the hover status + m_btnState = 0; + RefreshRect(m_btnArea); + } + } + + // + // This will handle left_down and left_dclick events outside button in a Windows/GTK-like manner. + // See header file for further information on this method. + HandleNormalMouseEvent(event); + +} + +void wxGenericComboCtrl::SetCustomPaintWidth( int width ) +{ +#ifdef UNRELIABLE_TEXTCTRL_BORDER + // + // If starting/stopping to show an image in front + // of a writable text-field, then re-create textctrl + // with different kind of border (because we can't + // assume that textctrl fully supports wxNO_BORDER). + // + wxTextCtrl* tc = GetTextCtrl(); + + if ( tc && (m_iFlags & wxCC_BUTTON_OUTSIDE_BORDER) ) + { + int borderType = tc->GetWindowStyle() & wxBORDER_MASK; + int tcCreateStyle = -1; + + if ( width > 0 ) + { + // Re-create textctrl with no border + if ( borderType != wxNO_BORDER ) + { + m_widthCustomBorder = 1; + tcCreateStyle = wxNO_BORDER; + } + } + else if ( width == 0 ) + { + // Re-create textctrl with normal border + if ( borderType == wxNO_BORDER ) + { + m_widthCustomBorder = 0; + tcCreateStyle = 0; + } + } + + // Common textctrl re-creation code + if ( tcCreateStyle != -1 ) + { + tc->RemoveEventHandler(m_textEvtHandler); + delete m_textEvtHandler; + +#if wxUSE_VALIDATORS + wxValidator* pValidator = tc->GetValidator(); + if ( pValidator ) + { + pValidator = (wxValidator*) pValidator->Clone(); + CreateTextCtrl( tcCreateStyle, *pValidator ); + delete pValidator; + } + else +#endif + { + CreateTextCtrl( tcCreateStyle, wxDefaultValidator ); + } + + InstallInputHandlers(); + } + } +#endif // UNRELIABLE_TEXTCTRL_BORDER + + wxComboCtrlBase::SetCustomPaintWidth( width ); +} + +bool wxGenericComboCtrl::IsKeyPopupToggle(const wxKeyEvent& event) const +{ + int keycode = event.GetKeyCode(); + bool isPopupShown = IsPopupShown(); + + // This code is AFAIK appropriate for wxGTK. + + if ( isPopupShown ) + { + if ( keycode == WXK_ESCAPE || + ( keycode == WXK_UP && event.AltDown() ) ) + return true; + } + else + { + if ( keycode == WXK_DOWN && event.AltDown() ) + return true; + } + + return false; +} + +#ifdef __WXUNIVERSAL__ + +bool wxGenericComboCtrl::PerformAction(const wxControlAction& action, + long numArg, + const wxString& strArg) +{ + bool processed = false; + if ( action == wxACTION_COMBOBOX_POPUP ) + { + if ( !IsPopupShown() ) + { + ShowPopup(); + + processed = true; + } + } + else if ( action == wxACTION_COMBOBOX_DISMISS ) + { + if ( IsPopupShown() ) + { + HidePopup(); + + processed = true; + } + } + + if ( !processed ) + { + // pass along + return wxControl::PerformAction(action, numArg, strArg); + } + + return true; +} + +#endif // __WXUNIVERSAL__ + +// If native wxComboCtrl was not defined, then prepare a simple +// front-end so that wxRTTI works as expected. +#ifndef _WX_COMBOCONTROL_H_ +IMPLEMENT_DYNAMIC_CLASS(wxComboCtrl, wxGenericComboCtrl) +#endif + +#endif // !wxCOMBOCONTROL_FULLY_FEATURED + +#endif // wxUSE_COMBOCTRL diff --git a/Externals/wxWidgets/src/generic/datavgen.cpp b/Externals/wxWidgets/src/generic/datavgen.cpp new file mode 100644 index 0000000000..cabf70be82 --- /dev/null +++ b/Externals/wxWidgets/src/generic/datavgen.cpp @@ -0,0 +1,1911 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/generic/datavgen.cpp +// Purpose: wxDataViewCtrl generic implementation +// Author: Robert Roebling +// Id: $Id: datavgen.cpp 45498 2007-04-16 13:03:05Z VZ $ +// Copyright: (c) 1998 Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_DATAVIEWCTRL + +#include "wx/dataview.h" + +#ifdef wxUSE_GENERICDATAVIEWCTRL + +#ifndef WX_PRECOMP + #ifdef __WXMSW__ + #include "wx/msw/wrapwin.h" + #endif + #include "wx/sizer.h" + #include "wx/log.h" + #include "wx/dcclient.h" + #include "wx/timer.h" + #include "wx/settings.h" + #include "wx/msgdlg.h" +#endif + +#include "wx/stockitem.h" +#include "wx/calctrl.h" +#include "wx/popupwin.h" +#include "wx/renderer.h" +#include "wx/dcbuffer.h" +#include "wx/icon.h" + +//----------------------------------------------------------------------------- +// classes +//----------------------------------------------------------------------------- + +class wxDataViewCtrl; + +//----------------------------------------------------------------------------- +// wxDataViewHeaderWindow +//----------------------------------------------------------------------------- + +class wxDataViewHeaderWindow: public wxWindow +{ +public: + wxDataViewHeaderWindow( wxDataViewCtrl *parent, + wxWindowID id, + const wxPoint &pos = wxDefaultPosition, + const wxSize &size = wxDefaultSize, + const wxString &name = wxT("wxdataviewctrlheaderwindow") ); + virtual ~wxDataViewHeaderWindow(); + + void SetOwner( wxDataViewCtrl* owner ) { m_owner = owner; } + wxDataViewCtrl *GetOwner() { return m_owner; } + + void OnPaint( wxPaintEvent &event ); + void OnMouse( wxMouseEvent &event ); + void OnSetFocus( wxFocusEvent &event ); + +private: + wxDataViewCtrl *m_owner; + wxCursor *m_resizeCursor; + +private: + DECLARE_DYNAMIC_CLASS(wxDataViewHeaderWindow) + DECLARE_EVENT_TABLE() +}; + +//----------------------------------------------------------------------------- +// wxDataViewRenameTimer +//----------------------------------------------------------------------------- + +class wxDataViewRenameTimer: public wxTimer +{ +private: + wxDataViewMainWindow *m_owner; + +public: + wxDataViewRenameTimer( wxDataViewMainWindow *owner ); + void Notify(); +}; + +//----------------------------------------------------------------------------- +// wxDataViewTextCtrlWrapper: wraps a wxTextCtrl for inline editing +//----------------------------------------------------------------------------- + +class wxDataViewTextCtrlWrapper : public wxEvtHandler +{ +public: + // NB: text must be a valid object but not Create()d yet + wxDataViewTextCtrlWrapper( wxDataViewMainWindow *owner, + wxTextCtrl *text, + wxDataViewListModel *model, + unsigned int col, unsigned int row, + wxRect cellLabel ); + + wxTextCtrl *GetText() const { return m_text; } + + void AcceptChangesAndFinish(); + +protected: + void OnChar( wxKeyEvent &event ); + void OnKeyUp( wxKeyEvent &event ); + void OnKillFocus( wxFocusEvent &event ); + + bool AcceptChanges(); + void Finish(); + +private: + wxDataViewMainWindow *m_owner; + wxTextCtrl *m_text; + wxString m_startValue; + wxDataViewListModel *m_model; + unsigned int m_col; + unsigned int m_row; + bool m_finished; + bool m_aboutToFinish; + + DECLARE_EVENT_TABLE() +}; + +//----------------------------------------------------------------------------- +// wxDataViewMainWindow +//----------------------------------------------------------------------------- + +WX_DEFINE_SORTED_USER_EXPORTED_ARRAY_SIZE_T(unsigned int, wxDataViewSelection, WXDLLIMPEXP_ADV); + +class wxDataViewMainWindow: public wxWindow +{ +public: + wxDataViewMainWindow( wxDataViewCtrl *parent, + wxWindowID id, + const wxPoint &pos = wxDefaultPosition, + const wxSize &size = wxDefaultSize, + const wxString &name = wxT("wxdataviewctrlmainwindow") ); + virtual ~wxDataViewMainWindow(); + + // notifications from wxDataViewListModel + bool RowAppended(); + bool RowPrepended(); + bool RowInserted( unsigned int before ); + bool RowDeleted( unsigned int row ); + bool RowChanged( unsigned int row ); + bool ValueChanged( unsigned int col, unsigned int row ); + bool RowsReordered( unsigned int *new_order ); + bool Cleared(); + + void SetOwner( wxDataViewCtrl* owner ) { m_owner = owner; } + wxDataViewCtrl *GetOwner() { return m_owner; } + + void OnPaint( wxPaintEvent &event ); + void OnArrowChar(unsigned int newCurrent, const wxKeyEvent& event); + void OnChar( wxKeyEvent &event ); + void OnMouse( wxMouseEvent &event ); + void OnSetFocus( wxFocusEvent &event ); + void OnKillFocus( wxFocusEvent &event ); + + void UpdateDisplay(); + void RecalculateDisplay(); + void OnInternalIdle(); + + void OnRenameTimer(); + void FinishEditing( wxTextCtrl *text ); + + void ScrollWindow( int dx, int dy, const wxRect *rect ); + + bool HasCurrentRow() { return m_currentRow != (unsigned int)-1; } + void ChangeCurrentRow( unsigned int row ); + + bool IsSingleSel() const { return !GetParent()->HasFlag(wxDV_MULTIPLE); } + bool IsEmpty() { return GetRowCount() == 0; } + + int GetCountPerPage(); + int GetEndOfLastCol(); + unsigned int GetFirstVisibleRow(); + unsigned int GetLastVisibleRow(); + unsigned int GetRowCount(); + + void SelectAllRows( bool on ); + void SelectRow( unsigned int row, bool on ); + void SelectRows( unsigned int from, unsigned int to, bool on ); + void ReverseRowSelection( unsigned int row ); + bool IsRowSelected( unsigned int row ); + + void RefreshRow( unsigned int row ); + void RefreshRows( unsigned int from, unsigned int to ); + void RefreshRowsAfter( unsigned int firstRow ); + +private: + wxDataViewCtrl *m_owner; + int m_lineHeight; + bool m_dirty; + + wxDataViewColumn *m_currentCol; + unsigned int m_currentRow; + wxDataViewSelection m_selection; + + wxDataViewRenameTimer *m_renameTimer; + wxDataViewTextCtrlWrapper *m_textctrlWrapper; + bool m_lastOnSame; + + bool m_hasFocus; + + int m_dragCount; + wxPoint m_dragStart; + + // for double click logic + unsigned int m_lineLastClicked, + m_lineBeforeLastClicked, + m_lineSelectSingleOnUp; + +private: + DECLARE_DYNAMIC_CLASS(wxDataViewMainWindow) + DECLARE_EVENT_TABLE() +}; + +// --------------------------------------------------------- +// wxGenericDataViewListModelNotifier +// --------------------------------------------------------- + +class wxGenericDataViewListModelNotifier: public wxDataViewListModelNotifier +{ +public: + wxGenericDataViewListModelNotifier( wxDataViewMainWindow *mainWindow ) + { m_mainWindow = mainWindow; } + + virtual bool RowAppended() + { return m_mainWindow->RowAppended(); } + virtual bool RowPrepended() + { return m_mainWindow->RowPrepended(); } + virtual bool RowInserted( unsigned int before ) + { return m_mainWindow->RowInserted( before ); } + virtual bool RowDeleted( unsigned int row ) + { return m_mainWindow->RowDeleted( row ); } + virtual bool RowChanged( unsigned int row ) + { return m_mainWindow->RowChanged( row ); } + virtual bool ValueChanged( unsigned int col, unsigned int row ) + { return m_mainWindow->ValueChanged( col, row ); } + virtual bool RowsReordered( unsigned int *new_order ) + { return m_mainWindow->RowsReordered( new_order ); } + virtual bool Cleared() + { return m_mainWindow->Cleared(); } + + wxDataViewMainWindow *m_mainWindow; +}; + +// --------------------------------------------------------- +// wxDataViewRenderer +// --------------------------------------------------------- + +IMPLEMENT_ABSTRACT_CLASS(wxDataViewRenderer, wxDataViewRendererBase) + +wxDataViewRenderer::wxDataViewRenderer( const wxString &varianttype, wxDataViewCellMode mode ) : + wxDataViewRendererBase( varianttype, mode ) +{ + m_dc = NULL; +} + +wxDataViewRenderer::~wxDataViewRenderer() +{ + if (m_dc) + delete m_dc; +} + +wxDC *wxDataViewRenderer::GetDC() +{ + if (m_dc == NULL) + { + if (GetOwner() == NULL) + return NULL; + if (GetOwner()->GetOwner() == NULL) + return NULL; + m_dc = new wxClientDC( GetOwner()->GetOwner() ); + } + + return m_dc; +} + +// --------------------------------------------------------- +// wxDataViewCustomRenderer +// --------------------------------------------------------- + +IMPLEMENT_ABSTRACT_CLASS(wxDataViewCustomRenderer, wxDataViewRenderer) + +wxDataViewCustomRenderer::wxDataViewCustomRenderer( const wxString &varianttype, + wxDataViewCellMode mode ) : + wxDataViewRenderer( varianttype, mode ) +{ +} + +// --------------------------------------------------------- +// wxDataViewTextRenderer +// --------------------------------------------------------- + +IMPLEMENT_CLASS(wxDataViewTextRenderer, wxDataViewCustomRenderer) + +wxDataViewTextRenderer::wxDataViewTextRenderer( const wxString &varianttype, wxDataViewCellMode mode ) : + wxDataViewCustomRenderer( varianttype, mode ) +{ +} + +bool wxDataViewTextRenderer::SetValue( const wxVariant &value ) +{ + m_text = value.GetString(); + + return true; +} + +bool wxDataViewTextRenderer::GetValue( wxVariant& WXUNUSED(value) ) +{ + return false; +} + +bool wxDataViewTextRenderer::Render( wxRect cell, wxDC *dc, int WXUNUSED(state) ) +{ + dc->DrawText( m_text, cell.x, cell.y ); + + return true; +} + +wxSize wxDataViewTextRenderer::GetSize() +{ + return wxSize(80,20); +} + +// --------------------------------------------------------- +// wxDataViewBitmapRenderer +// --------------------------------------------------------- + +IMPLEMENT_CLASS(wxDataViewBitmapRenderer, wxDataViewCustomRenderer) + +wxDataViewBitmapRenderer::wxDataViewBitmapRenderer( const wxString &varianttype, wxDataViewCellMode mode ) : + wxDataViewCustomRenderer( varianttype, mode ) +{ +} + +bool wxDataViewBitmapRenderer::SetValue( const wxVariant &value ) +{ + if (value.GetType() == wxT("wxBitmap")) + m_bitmap << value; + if (value.GetType() == wxT("wxIcon")) + m_icon << value; + + return true; +} + +bool wxDataViewBitmapRenderer::GetValue( wxVariant& WXUNUSED(value) ) +{ + return false; +} + +bool wxDataViewBitmapRenderer::Render( wxRect cell, wxDC *dc, int WXUNUSED(state) ) +{ + if (m_bitmap.Ok()) + dc->DrawBitmap( m_bitmap, cell.x, cell.y ); + else if (m_icon.Ok()) + dc->DrawIcon( m_icon, cell.x, cell.y ); + + return true; +} + +wxSize wxDataViewBitmapRenderer::GetSize() +{ + if (m_bitmap.Ok()) + return wxSize( m_bitmap.GetWidth(), m_bitmap.GetHeight() ); + else if (m_icon.Ok()) + return wxSize( m_icon.GetWidth(), m_icon.GetHeight() ); + + return wxSize(16,16); +} + +// --------------------------------------------------------- +// wxDataViewToggleRenderer +// --------------------------------------------------------- + +IMPLEMENT_ABSTRACT_CLASS(wxDataViewToggleRenderer, wxDataViewCustomRenderer) + +wxDataViewToggleRenderer::wxDataViewToggleRenderer( const wxString &varianttype, + wxDataViewCellMode mode ) : + wxDataViewCustomRenderer( varianttype, mode ) +{ + m_toggle = false; +} + +bool wxDataViewToggleRenderer::SetValue( const wxVariant &value ) +{ + m_toggle = value.GetBool(); + + return true; +} + +bool wxDataViewToggleRenderer::GetValue( wxVariant &WXUNUSED(value) ) +{ + return false; +} + +bool wxDataViewToggleRenderer::Render( wxRect cell, wxDC *dc, int WXUNUSED(state) ) +{ + // User wxRenderer here + + wxRect rect; + rect.x = cell.x + cell.width/2 - 10; + rect.width = 20; + rect.y = cell.y + cell.height/2 - 10; + rect.height = 20; + + int flags = 0; + if (m_toggle) + flags |= wxCONTROL_CHECKED; + if (GetMode() != wxDATAVIEW_CELL_ACTIVATABLE) + flags |= wxCONTROL_DISABLED; + + wxRendererNative::Get().DrawCheckBox( + GetOwner()->GetOwner(), + *dc, + rect, + flags ); + + return true; +} + +bool wxDataViewToggleRenderer::Activate( wxRect WXUNUSED(cell), wxDataViewListModel *model, unsigned int col, unsigned int row ) +{ + bool value = !m_toggle; + wxVariant variant = value; + model->SetValue( variant, col, row ); + model->ValueChanged( col, row ); + return true; +} + +wxSize wxDataViewToggleRenderer::GetSize() +{ + return wxSize(20,20); +} + +// --------------------------------------------------------- +// wxDataViewProgressRenderer +// --------------------------------------------------------- + +IMPLEMENT_ABSTRACT_CLASS(wxDataViewProgressRenderer, wxDataViewCustomRenderer) + +wxDataViewProgressRenderer::wxDataViewProgressRenderer( const wxString &label, + const wxString &varianttype, wxDataViewCellMode mode ) : + wxDataViewCustomRenderer( varianttype, mode ) +{ + m_label = label; + m_value = 0; +} + +wxDataViewProgressRenderer::~wxDataViewProgressRenderer() +{ +} + +bool wxDataViewProgressRenderer::SetValue( const wxVariant &value ) +{ + m_value = (long) value; + + if (m_value < 0) m_value = 0; + if (m_value > 100) m_value = 100; + + return true; +} + +bool wxDataViewProgressRenderer::Render( wxRect cell, wxDC *dc, int WXUNUSED(state) ) +{ + double pct = (double)m_value / 100.0; + wxRect bar = cell; + bar.width = (int)(cell.width * pct); + dc->SetPen( *wxTRANSPARENT_PEN ); + dc->SetBrush( *wxBLUE_BRUSH ); + dc->DrawRectangle( bar ); + + dc->SetBrush( *wxTRANSPARENT_BRUSH ); + dc->SetPen( *wxBLACK_PEN ); + dc->DrawRectangle( cell ); + + return true; +} + +wxSize wxDataViewProgressRenderer::GetSize() +{ + return wxSize(40,12); +} + +// --------------------------------------------------------- +// wxDataViewDateRenderer +// --------------------------------------------------------- + +#define wxUSE_DATE_RENDERER_POPUP (wxUSE_CALENDARCTRL && wxUSE_POPUPWIN) + +#if wxUSE_DATE_RENDERER_POPUP + +class wxDataViewDateRendererPopupTransient: public wxPopupTransientWindow +{ +public: + wxDataViewDateRendererPopupTransient( wxWindow* parent, wxDateTime *value, + wxDataViewListModel *model, unsigned int col, unsigned int row ) : + wxPopupTransientWindow( parent, wxBORDER_SIMPLE ) + { + m_model = model; + m_col = col; + m_row = row; + m_cal = new wxCalendarCtrl( this, wxID_ANY, *value ); + wxBoxSizer *sizer = new wxBoxSizer( wxHORIZONTAL ); + sizer->Add( m_cal, 1, wxGROW ); + SetSizer( sizer ); + sizer->Fit( this ); + } + + void OnCalendar( wxCalendarEvent &event ); + + wxCalendarCtrl *m_cal; + wxDataViewListModel *m_model; + unsigned int m_col; + unsigned int m_row; + +protected: + virtual void OnDismiss() + { + } + +private: + DECLARE_EVENT_TABLE() +}; + +BEGIN_EVENT_TABLE(wxDataViewDateRendererPopupTransient,wxPopupTransientWindow) + EVT_CALENDAR( wxID_ANY, wxDataViewDateRendererPopupTransient::OnCalendar ) +END_EVENT_TABLE() + +void wxDataViewDateRendererPopupTransient::OnCalendar( wxCalendarEvent &event ) +{ + wxDateTime date = event.GetDate(); + wxVariant value = date; + m_model->SetValue( value, m_col, m_row ); + m_model->ValueChanged( m_col, m_row ); + DismissAndNotify(); +} + +#endif // wxUSE_DATE_RENDERER_POPUP + +IMPLEMENT_ABSTRACT_CLASS(wxDataViewDateRenderer, wxDataViewCustomRenderer) + +wxDataViewDateRenderer::wxDataViewDateRenderer( const wxString &varianttype, + wxDataViewCellMode mode ) : + wxDataViewCustomRenderer( varianttype, mode ) +{ +} + +bool wxDataViewDateRenderer::SetValue( const wxVariant &value ) +{ + m_date = value.GetDateTime(); + + return true; +} + +bool wxDataViewDateRenderer::Render( wxRect cell, wxDC *dc, int WXUNUSED(state) ) +{ + dc->SetFont( GetOwner()->GetOwner()->GetFont() ); + wxString tmp = m_date.FormatDate(); + dc->DrawText( tmp, cell.x, cell.y ); + + return true; +} + +wxSize wxDataViewDateRenderer::GetSize() +{ + wxDataViewCtrl* view = GetOwner()->GetOwner(); + wxString tmp = m_date.FormatDate(); + wxCoord x,y,d; + view->GetTextExtent( tmp, &x, &y, &d ); + return wxSize(x,y+d); +} + +bool wxDataViewDateRenderer::Activate( wxRect WXUNUSED(cell), wxDataViewListModel *model, unsigned int col, unsigned int row ) +{ + wxVariant variant; + model->GetValue( variant, col, row ); + wxDateTime value = variant.GetDateTime(); + +#if wxUSE_DATE_RENDERER_POPUP + wxDataViewDateRendererPopupTransient *popup = new wxDataViewDateRendererPopupTransient( + GetOwner()->GetOwner()->GetParent(), &value, model, col, row ); + wxPoint pos = wxGetMousePosition(); + popup->Move( pos ); + popup->Layout(); + popup->Popup( popup->m_cal ); +#else // !wxUSE_DATE_RENDERER_POPUP + wxMessageBox(value.Format()); +#endif // wxUSE_DATE_RENDERER_POPUP/!wxUSE_DATE_RENDERER_POPUP + return true; +} + +// --------------------------------------------------------- +// wxDataViewColumn +// --------------------------------------------------------- + +IMPLEMENT_ABSTRACT_CLASS(wxDataViewColumn, wxDataViewColumnBase) + +wxDataViewColumn::wxDataViewColumn( const wxString &title, wxDataViewRenderer *cell, unsigned int model_column, + int width, int flags ) : + wxDataViewColumnBase( title, cell, model_column, width, flags ) +{ + m_width = width; + if (m_width < 0) + m_width = 80; +} + +wxDataViewColumn::wxDataViewColumn( const wxBitmap &bitmap, wxDataViewRenderer *cell, unsigned int model_column, + int width, int flags ) : + wxDataViewColumnBase( bitmap, cell, model_column, width, flags ) +{ + m_width = width; + if (m_width < 0) + m_width = 30; +} + +void wxDataViewColumn::SetAlignment( wxAlignment WXUNUSED(align) ) +{ + // TODO +} + +void wxDataViewColumn::SetSortable( bool WXUNUSED(sortable) ) +{ + // TODO +} + +bool wxDataViewColumn::GetSortable() +{ + // TODO + return false; +} + +void wxDataViewColumn::SetSortOrder( bool WXUNUSED(ascending) ) +{ + // TODO +} + +bool wxDataViewColumn::IsSortOrderAscending() +{ + // TODO + return true; +} + + +wxDataViewColumn::~wxDataViewColumn() +{ +} + +void wxDataViewColumn::SetTitle( const wxString &title ) +{ + wxDataViewColumnBase::SetTitle( title ); + +} + +void wxDataViewColumn::SetBitmap( const wxBitmap &bitmap ) +{ + wxDataViewColumnBase::SetBitmap( bitmap ); + +} + +int wxDataViewColumn::GetWidth() +{ + return m_width; +} + +//----------------------------------------------------------------------------- +// wxDataViewHeaderWindow +//----------------------------------------------------------------------------- + +IMPLEMENT_ABSTRACT_CLASS(wxDataViewHeaderWindow, wxWindow) + +BEGIN_EVENT_TABLE(wxDataViewHeaderWindow,wxWindow) + EVT_PAINT (wxDataViewHeaderWindow::OnPaint) + EVT_MOUSE_EVENTS (wxDataViewHeaderWindow::OnMouse) + EVT_SET_FOCUS (wxDataViewHeaderWindow::OnSetFocus) +END_EVENT_TABLE() + +wxDataViewHeaderWindow::wxDataViewHeaderWindow( wxDataViewCtrl *parent, wxWindowID id, + const wxPoint &pos, const wxSize &size, const wxString &name ) : + wxWindow( parent, id, pos, size, 0, name ) +{ + SetOwner( parent ); + + m_resizeCursor = new wxCursor( wxCURSOR_SIZEWE ); + + wxVisualAttributes attr = wxPanel::GetClassDefaultAttributes(); + SetBackgroundStyle( wxBG_STYLE_CUSTOM ); + SetOwnForegroundColour( attr.colFg ); + SetOwnBackgroundColour( attr.colBg ); + if (!m_hasFont) + SetOwnFont( attr.font ); +} + +wxDataViewHeaderWindow::~wxDataViewHeaderWindow() +{ + delete m_resizeCursor; +} + +void wxDataViewHeaderWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) +{ + int w, h; + GetClientSize( &w, &h ); + + wxAutoBufferedPaintDC dc( this ); + + dc.SetBackground(GetBackgroundColour()); + dc.Clear(); + + int xpix; + m_owner->GetScrollPixelsPerUnit( &xpix, NULL ); + + int x; + m_owner->GetViewStart( &x, NULL ); + + // account for the horz scrollbar offset + dc.SetDeviceOrigin( -x * xpix, 0 ); + + dc.SetFont( GetFont() ); + + unsigned int cols = GetOwner()->GetNumberOfColumns(); + unsigned int i; + int xpos = 0; + for (i = 0; i < cols; i++) + { + wxDataViewColumn *col = GetOwner()->GetColumn( i ); + int width = col->GetWidth(); + + int cw = width; + int ch = h; + + wxRendererNative::Get().DrawHeaderButton + ( + this, + dc, + wxRect(xpos, 0, cw, ch-1), + m_parent->IsEnabled() ? 0 + : (int)wxCONTROL_DISABLED + ); + + dc.DrawText( col->GetTitle(), xpos+3, 3 ); + + xpos += width; + } +} + +void wxDataViewHeaderWindow::OnMouse( wxMouseEvent &WXUNUSED(event) ) +{ +} + +void wxDataViewHeaderWindow::OnSetFocus( wxFocusEvent &event ) +{ + GetParent()->SetFocus(); + event.Skip(); +} + +//----------------------------------------------------------------------------- +// wxDataViewRenameTimer +//----------------------------------------------------------------------------- + +wxDataViewRenameTimer::wxDataViewRenameTimer( wxDataViewMainWindow *owner ) +{ + m_owner = owner; +} + +void wxDataViewRenameTimer::Notify() +{ + m_owner->OnRenameTimer(); +} + +//----------------------------------------------------------------------------- +// wxDataViewTextCtrlWrapper: wraps a wxTextCtrl for inline editing +//----------------------------------------------------------------------------- + +BEGIN_EVENT_TABLE(wxDataViewTextCtrlWrapper, wxEvtHandler) + EVT_CHAR (wxDataViewTextCtrlWrapper::OnChar) + EVT_KEY_UP (wxDataViewTextCtrlWrapper::OnKeyUp) + EVT_KILL_FOCUS (wxDataViewTextCtrlWrapper::OnKillFocus) +END_EVENT_TABLE() + +wxDataViewTextCtrlWrapper::wxDataViewTextCtrlWrapper( + wxDataViewMainWindow *owner, + wxTextCtrl *text, + wxDataViewListModel *model, + unsigned int col, unsigned int row, + wxRect rectLabel ) +{ + m_owner = owner; + m_model = model; + m_row = row; + m_col = col; + m_text = text; + + m_finished = false; + m_aboutToFinish = false; + + wxVariant value; + model->GetValue( value, col, row ); + m_startValue = value.GetString(); + + m_owner->GetOwner()->CalcScrolledPosition( + rectLabel.x, rectLabel.y, &rectLabel.x, &rectLabel.y ); + + m_text->Create( owner, wxID_ANY, m_startValue, + wxPoint(rectLabel.x-2,rectLabel.y-2), + wxSize(rectLabel.width+7,rectLabel.height+4) ); + m_text->SetFocus(); + + m_text->PushEventHandler(this); +} + +void wxDataViewTextCtrlWrapper::AcceptChangesAndFinish() +{ + m_aboutToFinish = true; + + // Notify the owner about the changes + AcceptChanges(); + + // Even if vetoed, close the control (consistent with MSW) + Finish(); +} + +void wxDataViewTextCtrlWrapper::OnChar( wxKeyEvent &event ) +{ + switch ( event.m_keyCode ) + { + case WXK_RETURN: + AcceptChangesAndFinish(); + break; + + case WXK_ESCAPE: + // m_owner->OnRenameCancelled( m_itemEdited ); + Finish(); + break; + + default: + event.Skip(); + } +} + +void wxDataViewTextCtrlWrapper::OnKeyUp( wxKeyEvent &event ) +{ + if (m_finished) + { + event.Skip(); + return; + } + + // auto-grow the textctrl + wxSize parentSize = m_owner->GetSize(); + wxPoint myPos = m_text->GetPosition(); + wxSize mySize = m_text->GetSize(); + int sx, sy; + m_text->GetTextExtent(m_text->GetValue() + _T("MM"), &sx, &sy); + if (myPos.x + sx > parentSize.x) + sx = parentSize.x - myPos.x; + if (mySize.x > sx) + sx = mySize.x; + m_text->SetSize(sx, wxDefaultCoord); + + event.Skip(); +} + +void wxDataViewTextCtrlWrapper::OnKillFocus( wxFocusEvent &event ) +{ + if ( !m_finished && !m_aboutToFinish ) + { + AcceptChanges(); + //if ( !AcceptChanges() ) + // m_owner->OnRenameCancelled( m_itemEdited ); + + Finish(); + } + + // We must let the native text control handle focus + event.Skip(); +} + +bool wxDataViewTextCtrlWrapper::AcceptChanges() +{ + const wxString value = m_text->GetValue(); + + if ( value == m_startValue ) + // nothing changed, always accept + return true; + +// if ( !m_owner->OnRenameAccept(m_itemEdited, value) ) + // vetoed by the user +// return false; + + // accepted, do rename the item + wxVariant variant; + variant = value; + m_model->SetValue( variant, m_col, m_row ); + m_model->ValueChanged( m_col, m_row ); + + return true; +} + +void wxDataViewTextCtrlWrapper::Finish() +{ + if ( !m_finished ) + { + m_finished = true; + + m_text->RemoveEventHandler(this); + m_owner->FinishEditing(m_text); + + // delete later + wxPendingDelete.Append( this ); + } +} + +//----------------------------------------------------------------------------- +// wxDataViewMainWindow +//----------------------------------------------------------------------------- + +int LINKAGEMODE wxDataViewSelectionCmp( unsigned int row1, unsigned int row2 ) +{ + if (row1 > row2) return 1; + if (row1 == row2) return 0; + return -1; +} + + +IMPLEMENT_ABSTRACT_CLASS(wxDataViewMainWindow, wxWindow) + +BEGIN_EVENT_TABLE(wxDataViewMainWindow,wxWindow) + EVT_PAINT (wxDataViewMainWindow::OnPaint) + EVT_MOUSE_EVENTS (wxDataViewMainWindow::OnMouse) + EVT_SET_FOCUS (wxDataViewMainWindow::OnSetFocus) + EVT_KILL_FOCUS (wxDataViewMainWindow::OnKillFocus) + EVT_CHAR (wxDataViewMainWindow::OnChar) +END_EVENT_TABLE() + +wxDataViewMainWindow::wxDataViewMainWindow( wxDataViewCtrl *parent, wxWindowID id, + const wxPoint &pos, const wxSize &size, const wxString &name ) : + wxWindow( parent, id, pos, size, wxWANTS_CHARS, name ), + m_selection( wxDataViewSelectionCmp ) + +{ + SetOwner( parent ); + + m_lastOnSame = false; + m_renameTimer = new wxDataViewRenameTimer( this ); + m_textctrlWrapper = NULL; + + // TODO: user better initial values/nothing selected + m_currentCol = NULL; + m_currentRow = 0; + + // TODO: we need to calculate this smartly + m_lineHeight = 20; + + m_dragCount = 0; + m_dragStart = wxPoint(0,0); + m_lineLastClicked = (unsigned int) -1; + m_lineBeforeLastClicked = (unsigned int) -1; + m_lineSelectSingleOnUp = (unsigned int) -1; + + m_hasFocus = false; + + SetBackgroundStyle( wxBG_STYLE_CUSTOM ); + SetBackgroundColour( *wxWHITE ); + + UpdateDisplay(); +} + +wxDataViewMainWindow::~wxDataViewMainWindow() +{ + delete m_renameTimer; +} + +void wxDataViewMainWindow::OnRenameTimer() +{ + // We have to call this here because changes may just have + // been made and no screen update taken place. + if ( m_dirty ) + wxSafeYield(); + + + int xpos = 0; + unsigned int cols = GetOwner()->GetNumberOfColumns(); + unsigned int i; + for (i = 0; i < cols; i++) + { + wxDataViewColumn *c = GetOwner()->GetColumn( i ); + if (c == m_currentCol) + break; + xpos += c->GetWidth(); + } + wxRect labelRect( xpos, m_currentRow * m_lineHeight, m_currentCol->GetWidth(), m_lineHeight ); + + wxClassInfo *textControlClass = CLASSINFO(wxTextCtrl); + + wxTextCtrl * const text = (wxTextCtrl *)textControlClass->CreateObject(); + m_textctrlWrapper = new wxDataViewTextCtrlWrapper(this, text, GetOwner()->GetModel(), + m_currentCol->GetModelColumn(), m_currentRow, labelRect ); +} + +void wxDataViewMainWindow::FinishEditing( wxTextCtrl *text ) +{ + delete text; + m_textctrlWrapper = NULL; + SetFocus(); + // SetFocusIgnoringChildren(); +} + +bool wxDataViewMainWindow::RowAppended() +{ + return false; +} + +bool wxDataViewMainWindow::RowPrepended() +{ + return false; +} + +bool wxDataViewMainWindow::RowInserted( unsigned int WXUNUSED(before) ) +{ + return false; +} + +bool wxDataViewMainWindow::RowDeleted( unsigned int WXUNUSED(row) ) +{ + return false; +} + +bool wxDataViewMainWindow::RowChanged( unsigned int WXUNUSED(row) ) +{ + return false; +} + +bool wxDataViewMainWindow::ValueChanged( unsigned int WXUNUSED(col), unsigned int row ) +{ + wxRect rect( 0, row*m_lineHeight, 10000, m_lineHeight ); + m_owner->CalcScrolledPosition( rect.x, rect.y, &rect.x, &rect.y ); + Refresh( true, &rect ); + + return true; +} + +bool wxDataViewMainWindow::RowsReordered( unsigned int *WXUNUSED(new_order) ) +{ + Refresh(); + + return true; +} + +bool wxDataViewMainWindow::Cleared() +{ + return false; +} + +void wxDataViewMainWindow::UpdateDisplay() +{ + m_dirty = true; +} + +void wxDataViewMainWindow::OnInternalIdle() +{ + wxWindow::OnInternalIdle(); + + if (m_dirty) + { + RecalculateDisplay(); + m_dirty = false; + } +} + +void wxDataViewMainWindow::RecalculateDisplay() +{ + wxDataViewListModel *model = GetOwner()->GetModel(); + if (!model) + { + Refresh(); + return; + } + + int width = 0; + unsigned int cols = GetOwner()->GetNumberOfColumns(); + unsigned int i; + for (i = 0; i < cols; i++) + { + wxDataViewColumn *col = GetOwner()->GetColumn( i ); + width += col->GetWidth(); + } + + int height = model->GetNumberOfRows() * m_lineHeight; + + SetVirtualSize( width, height ); + GetOwner()->SetScrollRate( 10, m_lineHeight ); + + Refresh(); +} + +void wxDataViewMainWindow::ScrollWindow( int dx, int dy, const wxRect *rect ) +{ + wxWindow::ScrollWindow( dx, dy, rect ); + GetOwner()->m_headerArea->ScrollWindow( dx, 0 ); +} + +void wxDataViewMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) +{ + wxAutoBufferedPaintDC dc( this ); + + dc.SetBackground(GetBackgroundColour()); + dc.Clear(); + + GetOwner()->PrepareDC( dc ); + + dc.SetFont( GetFont() ); + + wxRect update = GetUpdateRegion().GetBox(); + m_owner->CalcUnscrolledPosition( update.x, update.y, &update.x, &update.y ); + + wxDataViewListModel *model = GetOwner()->GetModel(); + + unsigned int item_start = wxMax( 0, (update.y / m_lineHeight) ); + unsigned int item_count = wxMin( (int)(((update.y + update.height) / m_lineHeight) - item_start + 1), + (int)(model->GetNumberOfRows()-item_start) ); + + + + unsigned int item; + for (item = item_start; item < item_start+item_count; item++) + { + if (m_selection.Index( item ) != wxNOT_FOUND) + { + int flags = wxCONTROL_SELECTED; + if (item == m_currentRow) + flags |= wxCONTROL_CURRENT; + if (m_hasFocus) + flags |= wxCONTROL_FOCUSED; + wxRect rect( 0, item*m_lineHeight+1, GetEndOfLastCol(), m_lineHeight-2 ); + wxRendererNative::Get().DrawItemSelectionRect + ( + this, + dc, + rect, + flags + ); + } + else + { + if (item == m_currentRow) + { + int flags = wxCONTROL_CURRENT; + if (m_hasFocus) + flags |= wxCONTROL_FOCUSED; // should have no effect + wxRect rect( 0, item*m_lineHeight+1, GetEndOfLastCol(), m_lineHeight-2 ); + wxRendererNative::Get().DrawItemSelectionRect + ( + this, + dc, + rect, + flags + ); + + } + } + } + + wxRect cell_rect; + cell_rect.x = 0; + cell_rect.height = m_lineHeight; + unsigned int cols = GetOwner()->GetNumberOfColumns(); + unsigned int i; + for (i = 0; i < cols; i++) + { + wxDataViewColumn *col = GetOwner()->GetColumn( i ); + wxDataViewRenderer *cell = col->GetRenderer(); + cell_rect.width = col->GetWidth(); + + for (item = item_start; item < item_start+item_count; item++) + { + cell_rect.y = item*m_lineHeight; + wxVariant value; + model->GetValue( value, col->GetModelColumn(), item ); + cell->SetValue( value ); + wxSize size = cell->GetSize(); + // cannot be bigger than allocated space + size.x = wxMin( size.x, cell_rect.width ); + size.y = wxMin( size.y, cell_rect.height ); + // TODO: check for left/right/centre alignment here + wxRect item_rect; + // for now: centre + item_rect.x = cell_rect.x + (cell_rect.width / 2) - (size.x / 2); + item_rect.y = cell_rect.y + (cell_rect.height / 2) - (size.y / 2); + + item_rect.width = size.x; + item_rect.height= size.y; + + int state = 0; + if (item == m_currentRow) + state |= wxDATAVIEW_CELL_SELECTED; + cell->Render( item_rect, &dc, state ); + } + + cell_rect.x += cell_rect.width; + } +} + +int wxDataViewMainWindow::GetCountPerPage() +{ + wxSize size = GetClientSize(); + return size.y / m_lineHeight; +} + +int wxDataViewMainWindow::GetEndOfLastCol() +{ + int width = 0; + unsigned int i; + for (i = 0; i < GetOwner()->GetNumberOfColumns(); i++) + { + wxDataViewColumn *c = GetOwner()->GetColumn( i ); + width += c->GetWidth(); + } + return width; +} + +unsigned int wxDataViewMainWindow::GetFirstVisibleRow() +{ + int x = 0; + int y = 0; + m_owner->CalcUnscrolledPosition( x, y, &x, &y ); + + return y / m_lineHeight; +} + +unsigned int wxDataViewMainWindow::GetLastVisibleRow() +{ + wxSize client_size = GetClientSize(); + m_owner->CalcUnscrolledPosition( client_size.x, client_size.y, &client_size.x, &client_size.y ); + + return wxMin( GetRowCount()-1, ((unsigned)client_size.y/m_lineHeight)+1 ); +} + +unsigned int wxDataViewMainWindow::GetRowCount() +{ + return GetOwner()->GetModel()->GetNumberOfRows(); +} + +void wxDataViewMainWindow::ChangeCurrentRow( unsigned int row ) +{ + m_currentRow = row; + + // send event +} + +void wxDataViewMainWindow::SelectAllRows( bool on ) +{ + if (IsEmpty()) + return; + + if (on) + { + m_selection.Clear(); + for (unsigned int i = 0; i < GetRowCount(); i++) + m_selection.Add( i ); + Refresh(); + } + else + { + unsigned int first_visible = GetFirstVisibleRow(); + unsigned int last_visible = GetLastVisibleRow(); + unsigned int i; + for (i = 0; i < m_selection.GetCount(); i++) + { + unsigned int row = m_selection[i]; + if ((row >= first_visible) && (row <= last_visible)) + RefreshRow( row ); + } + m_selection.Clear(); + } +} + +void wxDataViewMainWindow::SelectRow( unsigned int row, bool on ) +{ + if (m_selection.Index( row ) == wxNOT_FOUND) + { + if (on) + { + m_selection.Add( row ); + RefreshRow( row ); + } + } + else + { + if (!on) + { + m_selection.Remove( row ); + RefreshRow( row ); + } + } +} + +void wxDataViewMainWindow::SelectRows( unsigned int from, unsigned int to, bool on ) +{ + if (from > to) + { + unsigned int tmp = from; + from = to; + to = tmp; + } + + unsigned int i; + for (i = from; i <= to; i++) + { + if (m_selection.Index( i ) == wxNOT_FOUND) + { + if (on) + m_selection.Add( i ); + } + else + { + if (!on) + m_selection.Remove( i ); + } + } + RefreshRows( from, to ); +} + +void wxDataViewMainWindow::ReverseRowSelection( unsigned int row ) +{ + if (m_selection.Index( row ) == wxNOT_FOUND) + m_selection.Add( row ); + else + m_selection.Remove( row ); + RefreshRow( row ); +} + +bool wxDataViewMainWindow::IsRowSelected( unsigned int row ) +{ + return (m_selection.Index( row ) != wxNOT_FOUND); +} + +void wxDataViewMainWindow::RefreshRow( unsigned int row ) +{ + wxRect rect( 0, row*m_lineHeight, GetEndOfLastCol(), m_lineHeight ); + m_owner->CalcScrolledPosition( rect.x, rect.y, &rect.x, &rect.y ); + + wxSize client_size = GetClientSize(); + wxRect client_rect( 0, 0, client_size.x, client_size.y ); + wxRect intersect_rect = client_rect.Intersect( rect ); + if (intersect_rect.width > 0) + Refresh( true, &intersect_rect ); +} + +void wxDataViewMainWindow::RefreshRows( unsigned int from, unsigned int to ) +{ + if (from > to) + { + unsigned int tmp = to; + to = from; + from = tmp; + } + + wxRect rect( 0, from*m_lineHeight, GetEndOfLastCol(), (to-from+1) * m_lineHeight ); + m_owner->CalcScrolledPosition( rect.x, rect.y, &rect.x, &rect.y ); + + wxSize client_size = GetClientSize(); + wxRect client_rect( 0, 0, client_size.x, client_size.y ); + wxRect intersect_rect = client_rect.Intersect( rect ); + if (intersect_rect.width > 0) + Refresh( true, &intersect_rect ); +} + +void wxDataViewMainWindow::RefreshRowsAfter( unsigned int firstRow ) +{ + unsigned int count = GetRowCount(); + if (firstRow > count) + return; + + wxRect rect( 0, firstRow*m_lineHeight, GetEndOfLastCol(), count * m_lineHeight ); + m_owner->CalcScrolledPosition( rect.x, rect.y, &rect.x, &rect.y ); + + wxSize client_size = GetClientSize(); + wxRect client_rect( 0, 0, client_size.x, client_size.y ); + wxRect intersect_rect = client_rect.Intersect( rect ); + if (intersect_rect.width > 0) + Refresh( true, &intersect_rect ); +} + +void wxDataViewMainWindow::OnArrowChar(unsigned int newCurrent, const wxKeyEvent& event) +{ + wxCHECK_RET( newCurrent < GetRowCount(), + _T("invalid item index in OnArrowChar()") ); + + // if there is no selection, we cannot move it anywhere + if (!HasCurrentRow()) + return; + + unsigned int oldCurrent = m_currentRow; + + // in single selection we just ignore Shift as we can't select several + // items anyhow + if ( event.ShiftDown() && !IsSingleSel() ) + { + RefreshRow( oldCurrent ); + + ChangeCurrentRow( newCurrent ); + + // select all the items between the old and the new one + if ( oldCurrent > newCurrent ) + { + newCurrent = oldCurrent; + oldCurrent = m_currentRow; + } + + SelectRows( oldCurrent, newCurrent, true ); + } + else // !shift + { + RefreshRow( oldCurrent ); + + // all previously selected items are unselected unless ctrl is held + if ( !event.ControlDown() ) + SelectAllRows(false); + + ChangeCurrentRow( newCurrent ); + + if ( !event.ControlDown() ) + SelectRow( m_currentRow, true ); + else + RefreshRow( m_currentRow ); + } + + // MoveToFocus(); +} + +void wxDataViewMainWindow::OnChar( wxKeyEvent &event ) +{ + if (event.GetKeyCode() == WXK_TAB) + { + wxNavigationKeyEvent nevent; + nevent.SetWindowChange( event.ControlDown() ); + nevent.SetDirection( !event.ShiftDown() ); + nevent.SetEventObject( GetParent()->GetParent() ); + nevent.SetCurrentFocus( m_parent ); + if (GetParent()->GetParent()->GetEventHandler()->ProcessEvent( nevent )) + return; + } + + // no item -> nothing to do + if (!HasCurrentRow()) + { + event.Skip(); + return; + } + + // don't use m_linesPerPage directly as it might not be computed yet + const int pageSize = GetCountPerPage(); + wxCHECK_RET( pageSize, _T("should have non zero page size") ); + + switch ( event.GetKeyCode() ) + { + case WXK_UP: + if ( m_currentRow > 0 ) + OnArrowChar( m_currentRow - 1, event ); + break; + + case WXK_DOWN: + if ( m_currentRow < GetRowCount() - 1 ) + OnArrowChar( m_currentRow + 1, event ); + break; + + case WXK_END: + if (!IsEmpty()) + OnArrowChar( GetRowCount() - 1, event ); + break; + + case WXK_HOME: + if (!IsEmpty()) + OnArrowChar( 0, event ); + break; + + case WXK_PAGEUP: + { + int steps = pageSize - 1; + int index = m_currentRow - steps; + if (index < 0) + index = 0; + + OnArrowChar( index, event ); + } + break; + + case WXK_PAGEDOWN: + { + int steps = pageSize - 1; + unsigned int index = m_currentRow + steps; + unsigned int count = GetRowCount(); + if ( index >= count ) + index = count - 1; + + OnArrowChar( index, event ); + } + break; + + default: + event.Skip(); + } +} + +void wxDataViewMainWindow::OnMouse( wxMouseEvent &event ) +{ + if (event.GetEventType() == wxEVT_MOUSEWHEEL) + { + // let the base handle mouse wheel events. + event.Skip(); + return; + } + + int x = event.GetX(); + int y = event.GetY(); + m_owner->CalcUnscrolledPosition( x, y, &x, &y ); + + wxDataViewColumn *col = NULL; + + int xpos = 0; + unsigned int cols = GetOwner()->GetNumberOfColumns(); + unsigned int i; + for (i = 0; i < cols; i++) + { + wxDataViewColumn *c = GetOwner()->GetColumn( i ); + if (x < xpos + c->GetWidth()) + { + col = c; + break; + } + xpos += c->GetWidth(); + } + if (!col) + return; + wxDataViewRenderer *cell = col->GetRenderer(); + + unsigned int current = y / m_lineHeight; + + if ((current > GetRowCount()) || (x > GetEndOfLastCol())) + { + // Unselect all if below the last row ? + return; + } + + wxDataViewListModel *model = GetOwner()->GetModel(); + + if (event.Dragging()) + { + if (m_dragCount == 0) + { + // we have to report the raw, physical coords as we want to be + // able to call HitTest(event.m_pointDrag) from the user code to + // get the item being dragged + m_dragStart = event.GetPosition(); + } + + m_dragCount++; + + if (m_dragCount != 3) + return; + + if (event.LeftIsDown()) + { + // Notify cell about drag + } + return; + } + else + { + m_dragCount = 0; + } + + bool forceClick = false; + + if (event.ButtonDClick()) + { + m_renameTimer->Stop(); + m_lastOnSame = false; + } + + if (event.LeftDClick()) + { + if ( current == m_lineLastClicked ) + { + if (cell->GetMode() == wxDATAVIEW_CELL_ACTIVATABLE) + { + wxVariant value; + model->GetValue( value, col->GetModelColumn(), current ); + cell->SetValue( value ); + wxRect cell_rect( xpos, current * m_lineHeight, col->GetWidth(), m_lineHeight ); + cell->Activate( cell_rect, model, col->GetModelColumn(), current ); + } + return; + } + else + { + // The first click was on another item, so don't interpret this as + // a double click, but as a simple click instead + forceClick = true; + } + } + + if (event.LeftUp()) + { + if (m_lineSelectSingleOnUp != (unsigned int)-1) + { + // select single line + SelectAllRows( false ); + SelectRow( m_lineSelectSingleOnUp, true ); + } + + if (m_lastOnSame) + { + if ((col == m_currentCol) && (current == m_currentRow) && + (cell->GetMode() == wxDATAVIEW_CELL_EDITABLE) ) + { + m_renameTimer->Start( 100, true ); + } + } + + m_lastOnSame = false; + m_lineSelectSingleOnUp = (unsigned int)-1; + } + else + { + // This is necessary, because after a DnD operation in + // from and to ourself, the up event is swallowed by the + // DnD code. So on next non-up event (which means here and + // now) m_lineSelectSingleOnUp should be reset. + m_lineSelectSingleOnUp = (unsigned int)-1; + } + + if (event.RightDown()) + { + m_lineBeforeLastClicked = m_lineLastClicked; + m_lineLastClicked = current; + + // If the item is already selected, do not update the selection. + // Multi-selections should not be cleared if a selected item is clicked. + if (!IsRowSelected(current)) + { + SelectAllRows(false); + ChangeCurrentRow(current); + SelectRow(m_currentRow,true); + } + + // notify cell about right click + // cell->... + + // Allow generation of context menu event + event.Skip(); + } + else if (event.MiddleDown()) + { + // notify cell about middle click + // cell->... + } + if (event.LeftDown() || forceClick) + { +#ifdef __WXMSW__ + SetFocus(); +#endif + + m_lineBeforeLastClicked = m_lineLastClicked; + m_lineLastClicked = current; + + unsigned int oldCurrentRow = m_currentRow; + bool oldWasSelected = IsRowSelected(m_currentRow); + + bool cmdModifierDown = event.CmdDown(); + if ( IsSingleSel() || !(cmdModifierDown || event.ShiftDown()) ) + { + if ( IsSingleSel() || !IsRowSelected(current) ) + { + SelectAllRows( false ); + + ChangeCurrentRow(current); + + SelectRow(m_currentRow,true); + } + else // multi sel & current is highlighted & no mod keys + { + m_lineSelectSingleOnUp = current; + ChangeCurrentRow(current); // change focus + } + } + else // multi sel & either ctrl or shift is down + { + if (cmdModifierDown) + { + ChangeCurrentRow(current); + + ReverseRowSelection(m_currentRow); + } + else if (event.ShiftDown()) + { + ChangeCurrentRow(current); + + unsigned int lineFrom = oldCurrentRow, + lineTo = current; + + if ( lineTo < lineFrom ) + { + lineTo = lineFrom; + lineFrom = m_currentRow; + } + + SelectRows(lineFrom, lineTo, true); + } + else // !ctrl, !shift + { + // test in the enclosing if should make it impossible + wxFAIL_MSG( _T("how did we get here?") ); + } + } + + if (m_currentRow != oldCurrentRow) + RefreshRow( oldCurrentRow ); + + wxDataViewColumn *oldCurrentCol = m_currentCol; + + // Update selection here... + m_currentCol = col; + + m_lastOnSame = !forceClick && ((col == oldCurrentCol) && (current == oldCurrentRow)) && oldWasSelected; + } +} + +void wxDataViewMainWindow::OnSetFocus( wxFocusEvent &event ) +{ + m_hasFocus = true; + + if (HasCurrentRow()) + Refresh(); + + event.Skip(); +} + +void wxDataViewMainWindow::OnKillFocus( wxFocusEvent &event ) +{ + m_hasFocus = false; + + if (HasCurrentRow()) + Refresh(); + + event.Skip(); +} + +//----------------------------------------------------------------------------- +// wxDataViewCtrl +//----------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxDataViewCtrl, wxDataViewCtrlBase) + +BEGIN_EVENT_TABLE(wxDataViewCtrl, wxDataViewCtrlBase) + EVT_SIZE(wxDataViewCtrl::OnSize) +END_EVENT_TABLE() + +wxDataViewCtrl::~wxDataViewCtrl() +{ + if (m_notifier) + GetModel()->RemoveNotifier( m_notifier ); +} + +void wxDataViewCtrl::Init() +{ + m_notifier = NULL; +} + +bool wxDataViewCtrl::Create(wxWindow *parent, wxWindowID id, + const wxPoint& pos, const wxSize& size, + long style, const wxValidator& validator ) +{ + if (!wxControl::Create( parent, id, pos, size, style | wxScrolledWindowStyle|wxSUNKEN_BORDER, validator)) + return false; + + Init(); + +#ifdef __WXMAC__ + MacSetClipChildren( true ) ; +#endif + + m_clientArea = new wxDataViewMainWindow( this, wxID_ANY ); +#ifdef __WXMSW__ + m_headerArea = new wxDataViewHeaderWindow( this, wxID_ANY, wxDefaultPosition, wxSize(wxDefaultCoord,22) ); +#else + m_headerArea = new wxDataViewHeaderWindow( this, wxID_ANY, wxDefaultPosition, wxSize(wxDefaultCoord,25) ); +#endif + + SetTargetWindow( m_clientArea ); + + wxBoxSizer *sizer = new wxBoxSizer( wxVERTICAL ); + sizer->Add( m_headerArea, 0, wxGROW ); + sizer->Add( m_clientArea, 1, wxGROW ); + SetSizer( sizer ); + + return true; +} + +#ifdef __WXMSW__ +WXLRESULT wxDataViewCtrl::MSWWindowProc(WXUINT nMsg, + WXWPARAM wParam, + WXLPARAM lParam) +{ + WXLRESULT rc = wxDataViewCtrlBase::MSWWindowProc(nMsg, wParam, lParam); + +#ifndef __WXWINCE__ + // we need to process arrows ourselves for scrolling + if ( nMsg == WM_GETDLGCODE ) + { + rc |= DLGC_WANTARROWS; + } +#endif + + return rc; +} +#endif + +void wxDataViewCtrl::OnSize( wxSizeEvent &WXUNUSED(event) ) +{ + // We need to override OnSize so that our scrolled + // window a) does call Layout() to use sizers for + // positioning the controls but b) does not query + // the sizer for their size and use that for setting + // the scrollable area as set that ourselves by + // calling SetScrollbar() further down. + + Layout(); + + AdjustScrollbars(); +} + +bool wxDataViewCtrl::AssociateModel( wxDataViewListModel *model ) +{ + if (!wxDataViewCtrlBase::AssociateModel( model )) + return false; + + m_notifier = new wxGenericDataViewListModelNotifier( m_clientArea ); + + model->AddNotifier( m_notifier ); + + m_clientArea->UpdateDisplay(); + + return true; +} + +bool wxDataViewCtrl::AppendColumn( wxDataViewColumn *col ) +{ + if (!wxDataViewCtrlBase::AppendColumn(col)) + return false; + + m_clientArea->UpdateDisplay(); + + return true; +} + +void wxDataViewCtrl::SetSelection( int WXUNUSED(row) ) +{ + // FIXME - TODO +} + +void wxDataViewCtrl::SetSelectionRange( unsigned int WXUNUSED(from), unsigned int WXUNUSED(to) ) +{ + // FIXME - TODO +} + +void wxDataViewCtrl::SetSelections( const wxArrayInt& WXUNUSED(aSelections) ) +{ + // FIXME - TODO +} + +void wxDataViewCtrl::Unselect( unsigned int WXUNUSED(row) ) +{ + // FIXME - TODO +} + +bool wxDataViewCtrl::IsSelected( unsigned int WXUNUSED(row) ) const +{ + // FIXME - TODO + + return false; +} + +int wxDataViewCtrl::GetSelection() const +{ + // FIXME - TODO + + return -1; +} + +int wxDataViewCtrl::GetSelections(wxArrayInt& WXUNUSED(aSelections) ) const +{ + // FIXME - TODO + + return 0; +} + +#endif + // !wxUSE_GENERICDATAVIEWCTRL + +#endif + // wxUSE_DATAVIEWCTRL diff --git a/Externals/wxWidgets/src/generic/datectlg.cpp b/Externals/wxWidgets/src/generic/datectlg.cpp new file mode 100644 index 0000000000..19577d18c0 --- /dev/null +++ b/Externals/wxWidgets/src/generic/datectlg.cpp @@ -0,0 +1,539 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/generic/datectlg.cpp +// Purpose: generic wxDatePickerCtrlGeneric implementation +// Author: Andreas Pflug +// Modified by: +// Created: 2005-01-19 +// RCS-ID: $Id: datectlg.cpp 46530 2007-06-18 19:34:56Z RD $ +// Copyright: (c) 2005 Andreas Pflug +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_DATEPICKCTRL + +#include "wx/datectrl.h" + +// use this version if we're explicitly requested to do it or if it's the only +// one we have +#if !defined(wxHAS_NATIVE_DATEPICKCTRL) || \ + (defined(wxUSE_DATEPICKCTRL_GENERIC) && wxUSE_DATEPICKCTRL_GENERIC) + +#ifndef WX_PRECOMP + #include "wx/dialog.h" + #include "wx/dcmemory.h" + #include "wx/panel.h" + #include "wx/textctrl.h" + #include "wx/valtext.h" +#endif + +#ifdef wxHAS_NATIVE_DATEPICKCTRL + // this header is not included from wx/datectrl.h if we have a native + // version, but we do need it here + #include "wx/generic/datectrl.h" +#else + // we need to define _WX_DEFINE_DATE_EVENTS_ before including wx/dateevt.h to + // define the event types we use if we're the only date picker control version + // being compiled -- otherwise it's defined in the native version implementation + #define _WX_DEFINE_DATE_EVENTS_ +#endif + +#include "wx/dateevt.h" + +#include "wx/calctrl.h" +#include "wx/combo.h" + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +#if defined(__WXMSW__) + #define CALBORDER 0 +#else + #define CALBORDER 4 +#endif + +// ---------------------------------------------------------------------------- +// global variables +// ---------------------------------------------------------------------------- + + +// ---------------------------------------------------------------------------- +// local classes +// ---------------------------------------------------------------------------- + +class wxCalendarComboPopup : public wxCalendarCtrl, + public wxComboPopup +{ +public: + + wxCalendarComboPopup() : wxCalendarCtrl(), + wxComboPopup() + { + } + + virtual void Init() + { + } + + // NB: Don't create lazily since it didn't work that way before + // wxComboCtrl was used, and changing behaviour would almost + // certainly introduce new bugs. + virtual bool Create(wxWindow* parent) + { + if ( !wxCalendarCtrl::Create(parent, wxID_ANY, wxDefaultDateTime, + wxPoint(0, 0), wxDefaultSize, + wxCAL_SHOW_HOLIDAYS | wxBORDER_SUNKEN) ) + return false; + + wxWindow *yearControl = wxCalendarCtrl::GetYearControl(); + + wxClientDC dc(yearControl); + dc.SetFont(yearControl->GetFont()); + wxCoord width, dummy; + dc.GetTextExtent(wxT("2000"), &width, &dummy); + width += ConvertDialogToPixels(wxSize(20, 0)).x; + + wxSize calSize = wxCalendarCtrl::GetBestSize(); + wxSize yearSize = yearControl->GetSize(); + yearSize.x = width; + + wxPoint yearPosition = yearControl->GetPosition(); + + SetFormat(wxT("%x")); + + width = yearPosition.x + yearSize.x+2+CALBORDER/2; + if (width < calSize.x-4) + width = calSize.x-4; + + int calPos = (width-calSize.x)/2; + if (calPos == -1) + { + calPos = 0; + width += 2; + } + wxCalendarCtrl::SetSize(calPos, 0, calSize.x, calSize.y); + yearControl->SetSize(width-yearSize.x-CALBORDER/2, yearPosition.y, + yearSize.x, yearSize.y); + wxCalendarCtrl::GetMonthControl()->Move(0, 0); + + m_useSize.x = width+CALBORDER/2; + m_useSize.y = calSize.y-2+CALBORDER; + + wxWindow* tx = m_combo->GetTextCtrl(); + if ( !tx ) + tx = m_combo; + + tx->Connect(wxEVT_KILL_FOCUS, + wxFocusEventHandler(wxCalendarComboPopup::OnKillTextFocus), + NULL, this); + + return true; + } + + virtual wxSize GetAdjustedSize(int WXUNUSED(minWidth), + int WXUNUSED(prefHeight), + int WXUNUSED(maxHeight)) + { + return m_useSize; + } + + virtual wxWindow *GetControl() { return this; } + + void SetDateValue(const wxDateTime& date) + { + if ( date.IsValid() ) + { + m_combo->SetText(date.Format(m_format)); + } + else // invalid date + { + wxASSERT_MSG( HasDPFlag(wxDP_ALLOWNONE), + _T("this control must have a valid date") ); + + m_combo->SetText(wxEmptyString); + } + + m_currentDate = date; + } + + const wxDateTime& GetDateValue() const + { + return m_currentDate; + } + + bool ParseDateTime(const wxString& s, wxDateTime* pDt) + { + wxASSERT(pDt); + + if ( !s.empty() ) + { + pDt->ParseFormat(s, m_format); + if ( !pDt->IsValid() ) + return false; + } + + return true; + } + + void SendDateEvent(const wxDateTime& dt) + { + // + // Sends both wxCalendarEvent and wxDateEvent + wxWindow* datePicker = m_combo->GetParent(); + + wxCalendarEvent cev((wxCalendarCtrl*) this, wxEVT_CALENDAR_SEL_CHANGED); + cev.SetEventObject(datePicker); + cev.SetId(datePicker->GetId()); + cev.SetDate(dt); + datePicker->GetEventHandler()->ProcessEvent(cev); + + wxDateEvent event(datePicker, dt, wxEVT_DATE_CHANGED); + datePicker->GetEventHandler()->ProcessEvent(event); + } + +private: + + void OnCalKey(wxKeyEvent & ev) + { + if (ev.GetKeyCode() == WXK_ESCAPE && !ev.HasModifiers()) + Dismiss(); + else + ev.Skip(); + } + + void OnSelChange(wxCalendarEvent &ev) + { + m_currentDate = wxCalendarCtrl::GetDate(); + m_combo->SetText(m_currentDate.Format(m_format)); + + if ( ev.GetEventType() == wxEVT_CALENDAR_DOUBLECLICKED ) + { + Dismiss(); + } + + SendDateEvent(m_currentDate); + } + + void OnKillTextFocus(wxFocusEvent &ev) + { + ev.Skip(); + + wxDateTime dt; + wxString value = m_combo->GetValue(); + if ( !ParseDateTime(value, &dt) ) + { + if ( !HasDPFlag(wxDP_ALLOWNONE) ) + dt = m_currentDate; + } + + if ( dt.IsValid() ) + m_combo->SetText(dt.Format(m_format)); + else + m_combo->SetText(wxEmptyString); + + // notify that we had to change the date after validation + if ( (dt.IsValid() && (!m_currentDate.IsValid() || m_currentDate != dt)) || + (!dt.IsValid() && m_currentDate.IsValid()) ) + { + m_currentDate = dt; + SendDateEvent(dt); + } + } + + bool HasDPFlag(int flag) + { + return m_combo->GetParent()->HasFlag(flag); + } + + bool SetFormat(const wxChar *fmt) + { + m_format.clear(); + + wxDateTime dt; + dt.ParseFormat(wxT("2003-10-13"), wxT("%Y-%m-%d")); + wxString str(dt.Format(fmt)); + + const wxChar *p = str.c_str(); + while ( *p ) + { + int n=wxAtoi(p); + if (n == dt.GetDay()) + { + m_format.Append(wxT("%d")); + p += 2; + } + else if (n == (int)dt.GetMonth()+1) + { + m_format.Append(wxT("%m")); + p += 2; + } + else if (n == dt.GetYear()) + { + m_format.Append(wxT("%Y")); + p += 4; + } + else if (n == (dt.GetYear() % 100)) + { + if ( HasDPFlag(wxDP_SHOWCENTURY) ) + m_format.Append(wxT("%Y")); + else + m_format.Append(wxT("%y")); + p += 2; + } + else + m_format.Append(*p++); + } + + if ( m_combo ) + { + wxArrayString allowedChars; + for ( wxChar c = _T('0'); c <= _T('9'); c++ ) + allowedChars.Add(wxString(c, 1)); + + const wxChar *p2 = m_format.c_str(); + while ( *p2 ) + { + if ( *p2 == '%') + p2 += 2; + else + allowedChars.Add(wxString(*p2++, 1)); + } + + #if wxUSE_VALIDATORS + wxTextValidator tv(wxFILTER_INCLUDE_CHAR_LIST); + tv.SetIncludes(allowedChars); + m_combo->SetValidator(tv); + #endif + + if (m_currentDate.IsValid()) + m_combo->SetText(m_currentDate.Format(m_format)); + } + + return true; + } + + virtual void SetStringValue(const wxString& s) + { + wxDateTime dt; + if ( ParseDateTime(s, &dt) ) + m_currentDate = dt; + else if ( HasDPFlag(wxDP_ALLOWNONE) ) + m_currentDate = dt; + } + + virtual wxString GetStringValue() const + { + if ( !m_currentDate.IsValid() ) + return wxEmptyString; + + return m_currentDate.Format(m_format); + } + +private: + + wxSize m_useSize; + wxString m_format; + wxDateTime m_currentDate; + + DECLARE_EVENT_TABLE() +}; + + +BEGIN_EVENT_TABLE(wxCalendarComboPopup, wxCalendarCtrl) + EVT_KEY_DOWN(wxCalendarComboPopup::OnCalKey) + EVT_CALENDAR_SEL_CHANGED(wxID_ANY, wxCalendarComboPopup::OnSelChange) + EVT_CALENDAR_DAY(wxID_ANY, wxCalendarComboPopup::OnSelChange) + EVT_CALENDAR_MONTH(wxID_ANY, wxCalendarComboPopup::OnSelChange) + EVT_CALENDAR_YEAR(wxID_ANY, wxCalendarComboPopup::OnSelChange) + EVT_CALENDAR(wxID_ANY, wxCalendarComboPopup::OnSelChange) +END_EVENT_TABLE() + + +// ============================================================================ +// wxDatePickerCtrlGeneric implementation +// ============================================================================ + +BEGIN_EVENT_TABLE(wxDatePickerCtrlGeneric, wxDatePickerCtrlBase) + EVT_TEXT(wxID_ANY, wxDatePickerCtrlGeneric::OnText) + EVT_SIZE(wxDatePickerCtrlGeneric::OnSize) + EVT_SET_FOCUS(wxDatePickerCtrlGeneric::OnFocus) +END_EVENT_TABLE() + +#ifndef wxHAS_NATIVE_DATEPICKCTRL + IMPLEMENT_DYNAMIC_CLASS(wxDatePickerCtrl, wxControl) +#endif + +// ---------------------------------------------------------------------------- +// creation +// ---------------------------------------------------------------------------- + +bool wxDatePickerCtrlGeneric::Create(wxWindow *parent, + wxWindowID id, + const wxDateTime& date, + const wxPoint& pos, + const wxSize& size, + long style, + const wxValidator& validator, + const wxString& name) +{ + wxASSERT_MSG( !(style & wxDP_SPIN), + _T("wxDP_SPIN style not supported, use wxDP_DEFAULT") ); + + if ( !wxControl::Create(parent, id, pos, size, + style | wxCLIP_CHILDREN | wxWANTS_CHARS | wxBORDER_NONE, + validator, name) ) + { + return false; + } + + InheritAttributes(); + + m_combo = new wxComboCtrl(this, -1, wxEmptyString, + wxDefaultPosition, wxDefaultSize); + + m_combo->SetCtrlMainWnd(this); + + m_popup = new wxCalendarComboPopup(); + +#if defined(__WXMSW__) + // without this keyboard navigation in month control doesn't work + m_combo->UseAltPopupWindow(); +#endif + m_combo->SetPopupControl(m_popup); + + m_cal = m_popup; + + m_popup->SetDateValue(date.IsValid() ? date : wxDateTime::Today()); + + SetInitialSize(size); + + return true; +} + + +void wxDatePickerCtrlGeneric::Init() +{ + m_combo = NULL; + m_cal = NULL; + m_popup = NULL; +} + +wxDatePickerCtrlGeneric::~wxDatePickerCtrlGeneric() +{ +} + +bool wxDatePickerCtrlGeneric::Destroy() +{ + if ( m_combo ) + m_combo->Destroy(); + + m_combo = NULL; + m_cal = NULL; + m_popup = NULL; + + return wxControl::Destroy(); +} + +// ---------------------------------------------------------------------------- +// overridden base class methods +// ---------------------------------------------------------------------------- + +wxSize wxDatePickerCtrlGeneric::DoGetBestSize() const +{ + return m_combo->GetBestSize(); +} + +// ---------------------------------------------------------------------------- +// wxDatePickerCtrlGeneric API +// ---------------------------------------------------------------------------- + +bool +wxDatePickerCtrlGeneric::SetDateRange(const wxDateTime& lowerdate, + const wxDateTime& upperdate) +{ + return m_cal->SetDateRange(lowerdate, upperdate); +} + + +wxDateTime wxDatePickerCtrlGeneric::GetValue() const +{ + return m_popup->GetDateValue(); +} + + +void wxDatePickerCtrlGeneric::SetValue(const wxDateTime& date) +{ + m_popup->SetDateValue(date); +} + + +bool wxDatePickerCtrlGeneric::GetRange(wxDateTime *dt1, wxDateTime *dt2) const +{ + if (dt1) + *dt1 = m_cal->GetLowerDateLimit(); + if (dt2) + *dt2 = m_cal->GetUpperDateLimit(); + return true; +} + + +void +wxDatePickerCtrlGeneric::SetRange(const wxDateTime &dt1, const wxDateTime &dt2) +{ + m_cal->SetDateRange(dt1, dt2); +} + +// ---------------------------------------------------------------------------- +// event handlers +// ---------------------------------------------------------------------------- + + +void wxDatePickerCtrlGeneric::OnSize(wxSizeEvent& event) +{ + if ( m_combo ) + m_combo->SetSize(GetClientSize()); + + event.Skip(); +} + + +void wxDatePickerCtrlGeneric::OnText(wxCommandEvent &ev) +{ + ev.SetEventObject(this); + ev.SetId(GetId()); + GetParent()->ProcessEvent(ev); + + // We'll create an additional event if the date is valid. + // If the date isn't valid, the user's probably in the middle of typing + wxDateTime dt; + if ( !m_popup->ParseDateTime(m_combo->GetValue(), &dt) ) + return; + + m_popup->SendDateEvent(dt); +} + + +void wxDatePickerCtrlGeneric::OnFocus(wxFocusEvent& WXUNUSED(event)) +{ + m_combo->SetFocus(); +} + + +#endif // wxUSE_DATEPICKCTRL_GENERIC + +#endif // wxUSE_DATEPICKCTRL + diff --git a/Externals/wxWidgets/src/generic/dbgrptg.cpp b/Externals/wxWidgets/src/generic/dbgrptg.cpp new file mode 100644 index 0000000000..b55ba61220 --- /dev/null +++ b/Externals/wxWidgets/src/generic/dbgrptg.cpp @@ -0,0 +1,525 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/generic/dbgrptg.cpp +// Purpose: implementation of wxDebugReportPreviewStd +// Author: Vadim Zeitlin, Andrej Putrin +// Modified by: +// Created: 2005-01-21 +// RCS-ID: $Id: dbgrptg.cpp 49242 2007-10-19 11:40:07Z JS $ +// Copyright: (c) 2005 Vadim Zeitlin +// License: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_DEBUGREPORT && wxUSE_XML + +#include "wx/debugrpt.h" + +#ifndef WX_PRECOMP + #include "wx/sizer.h" + #include "wx/checklst.h" + #include "wx/textctrl.h" + #include "wx/intl.h" + #include "wx/stattext.h" + #include "wx/filedlg.h" + #include "wx/valtext.h" + #include "wx/button.h" +#endif // WX_PRECOMP + +#include "wx/filename.h" +#include "wx/ffile.h" +#include "wx/mimetype.h" + +#include "wx/statline.h" + +#ifdef __WXMSW__ + #include "wx/evtloop.h" // for SetCriticalWindow() +#endif // __WXMSW__ + +// ---------------------------------------------------------------------------- +// wxDumpPreviewDlg: simple class for showing ASCII preview of dump files +// ---------------------------------------------------------------------------- + +class wxDumpPreviewDlg : public wxDialog +{ +public: + wxDumpPreviewDlg(wxWindow *parent, + const wxString& title, + const wxString& text); + +private: + // the text we show + wxTextCtrl *m_text; + + DECLARE_NO_COPY_CLASS(wxDumpPreviewDlg) +}; + +wxDumpPreviewDlg::wxDumpPreviewDlg(wxWindow *parent, + const wxString& title, + const wxString& text) + : wxDialog(parent, wxID_ANY, title, + wxDefaultPosition, wxDefaultSize, + wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER) +{ + // create controls + // --------------- + + // use wxTE_RICH2 style to avoid 64kB limit under MSW and display big files + // faster than with wxTE_RICH + m_text = new wxTextCtrl(this, wxID_ANY, wxEmptyString, + wxPoint(0, 0), wxDefaultSize, + wxTE_MULTILINE | + wxTE_READONLY | + wxTE_NOHIDESEL | + wxTE_RICH2); + m_text->SetValue(text); + + // use fixed-width font + m_text->SetFont(wxFont(12, wxFONTFAMILY_TELETYPE, + wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL)); + + wxButton *btnClose = new wxButton(this, wxID_CANCEL, _("Close")); + + + // layout them + // ----------- + + wxSizer *sizerTop = new wxBoxSizer(wxVERTICAL), + *sizerBtns = new wxBoxSizer(wxHORIZONTAL); + + sizerBtns->Add(btnClose, 0, 0, 1); + + sizerTop->Add(m_text, 1, wxEXPAND); + sizerTop->Add(sizerBtns, 0, wxALIGN_RIGHT | wxTOP | wxBOTTOM | wxRIGHT, 1); + + // set the sizer &c + // ---------------- + + // make the text window bigger to show more contents of the file + sizerTop->SetItemMinSize(m_text, 600, 300); + SetSizer(sizerTop); + + Layout(); + Fit(); + + m_text->SetFocus(); +} + +// ---------------------------------------------------------------------------- +// wxDumpOpenExternalDlg: choose a command for opening the given file +// ---------------------------------------------------------------------------- + +class wxDumpOpenExternalDlg : public wxDialog +{ +public: + wxDumpOpenExternalDlg(wxWindow *parent, const wxFileName& filename); + + // return the command chosed by user to open this file + const wxString& GetCommand() const { return m_command; } + + wxString m_command; + +private: + +#if wxUSE_FILEDLG + void OnBrowse(wxCommandEvent& event); +#endif // wxUSE_FILEDLG + + DECLARE_EVENT_TABLE() + DECLARE_NO_COPY_CLASS(wxDumpOpenExternalDlg) +}; + +BEGIN_EVENT_TABLE(wxDumpOpenExternalDlg, wxDialog) + +#if wxUSE_FILEDLG + EVT_BUTTON(wxID_MORE, wxDumpOpenExternalDlg::OnBrowse) +#endif + +END_EVENT_TABLE() + + +wxDumpOpenExternalDlg::wxDumpOpenExternalDlg(wxWindow *parent, + const wxFileName& filename) + : wxDialog(parent, + wxID_ANY, + wxString::Format + ( + _("Open file \"%s\""), + filename.GetFullPath().c_str() + )) +{ + // create controls + // --------------- + + wxSizer *sizerTop = new wxBoxSizer(wxVERTICAL); + sizerTop->Add(new wxStaticText(this, wxID_ANY, + wxString::Format + ( + _("Enter command to open file \"%s\":"), + filename.GetFullName().c_str() + )), + wxSizerFlags().Border()); + + wxSizer *sizerH = new wxBoxSizer(wxHORIZONTAL); + + wxTextCtrl *command = new wxTextCtrl + ( + this, + wxID_ANY, + wxEmptyString, + wxDefaultPosition, + wxSize(250, wxDefaultCoord), + 0 +#if wxUSE_VALIDATORS + ,wxTextValidator(wxFILTER_NONE, &m_command) +#endif + ); + sizerH->Add(command, + wxSizerFlags(1).Align(wxALIGN_CENTER_VERTICAL)); + +#if wxUSE_FILEDLG + + wxButton *browse = new wxButton(this, wxID_MORE, wxT(">>"), + wxDefaultPosition, wxDefaultSize, + wxBU_EXACTFIT); + sizerH->Add(browse, + wxSizerFlags(0).Align(wxALIGN_CENTER_VERTICAL). Border(wxLEFT)); + +#endif // wxUSE_FILEDLG + + sizerTop->Add(sizerH, wxSizerFlags(0).Expand().Border()); + + sizerTop->Add(new wxStaticLine(this), wxSizerFlags().Expand().Border()); + + sizerTop->Add(CreateStdDialogButtonSizer(wxOK | wxCANCEL), + wxSizerFlags().Align(wxALIGN_RIGHT).Border()); + + // set the sizer &c + // ---------------- + + SetSizer(sizerTop); + + Layout(); + Fit(); + + command->SetFocus(); +} + +#if wxUSE_FILEDLG + +void wxDumpOpenExternalDlg::OnBrowse(wxCommandEvent& ) +{ + wxFileName fname(m_command); + wxFileDialog dlg(this, + wxFileSelectorPromptStr, + fname.GetPathWithSep(), + fname.GetFullName() +#ifdef __WXMSW__ + , _("Executable files (*.exe)|*.exe|All files (*.*)|*.*||") +#endif // __WXMSW__ + ); + if ( dlg.ShowModal() == wxID_OK ) + { + m_command = dlg.GetPath(); + TransferDataToWindow(); + } +} + +#endif // wxUSE_FILEDLG + +// ---------------------------------------------------------------------------- +// wxDebugReportDialog: class showing debug report to the user +// ---------------------------------------------------------------------------- + +class wxDebugReportDialog : public wxDialog +{ +public: + wxDebugReportDialog(wxDebugReport& dbgrpt); + + virtual bool TransferDataToWindow(); + virtual bool TransferDataFromWindow(); + +private: + void OnView(wxCommandEvent& ); + void OnViewUpdate(wxUpdateUIEvent& ); + void OnOpen(wxCommandEvent& ); + + + // small helper: add wxEXPAND and wxALL flags + static wxSizerFlags SizerFlags(int proportion) + { + return wxSizerFlags(proportion).Expand().Border(); + } + + + wxDebugReport& m_dbgrpt; + + wxCheckListBox *m_checklst; + wxTextCtrl *m_notes; + + wxArrayString m_files; + + DECLARE_EVENT_TABLE() + DECLARE_NO_COPY_CLASS(wxDebugReportDialog) +}; + +// ============================================================================ +// wxDebugReportDialog implementation +// ============================================================================ + +BEGIN_EVENT_TABLE(wxDebugReportDialog, wxDialog) + EVT_BUTTON(wxID_VIEW_DETAILS, wxDebugReportDialog::OnView) + EVT_UPDATE_UI(wxID_VIEW_DETAILS, wxDebugReportDialog::OnViewUpdate) + EVT_BUTTON(wxID_OPEN, wxDebugReportDialog::OnOpen) + EVT_UPDATE_UI(wxID_OPEN, wxDebugReportDialog::OnViewUpdate) +END_EVENT_TABLE() + + +// ---------------------------------------------------------------------------- +// construction +// ---------------------------------------------------------------------------- + +wxDebugReportDialog::wxDebugReportDialog(wxDebugReport& dbgrpt) + : wxDialog(NULL, wxID_ANY, + wxString::Format(_("Debug report \"%s\""), + dbgrpt.GetReportName().c_str()), + wxDefaultPosition, + wxDefaultSize, + wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER), + m_dbgrpt(dbgrpt) +{ + // upper part of the dialog: explanatory message + wxString msg; + wxString debugDir = dbgrpt.GetDirectory(); + + // The temporary directory can be the short form on Windows; + // normalize it for the benefit of users. +#ifdef __WXMSW__ + wxFileName debugDirFilename(debugDir, wxEmptyString); + debugDirFilename.Normalize(wxPATH_NORM_LONG); + debugDir = debugDirFilename.GetPath(); +#endif + msg << _("A debug report has been generated in the directory\n") + << _T('\n') + << _T(" \"") << debugDir << _T("\"\n") + << _T('\n') + << _("The report contains the files listed below. If any of these files contain private information,\nplease uncheck them and they will be removed from the report.\n") + << _T('\n') + << _("If you wish to suppress this debug report completely, please choose the \"Cancel\" button,\nbut be warned that it may hinder improving the program, so if\nat all possible please do continue with the report generation.\n") + << _T('\n') + << _(" Thank you and we're sorry for the inconvenience!\n") + << _T("\n\n"); // just some white space to separate from other stuff + + const wxSizerFlags flagsFixed(SizerFlags(0)); + const wxSizerFlags flagsExpand(SizerFlags(1)); + const wxSizerFlags flagsExpand2(SizerFlags(2)); + + wxSizer *sizerPreview = + new wxStaticBoxSizer(wxVERTICAL, this, _("&Debug report preview:")); + sizerPreview->Add(CreateTextSizer(msg), SizerFlags(0).Centre()); + + // ... and the list of files in this debug report with buttons to view them + wxSizer *sizerFileBtns = new wxBoxSizer(wxVERTICAL); + sizerFileBtns->AddStretchSpacer(1); + sizerFileBtns->Add(new wxButton(this, wxID_VIEW_DETAILS, _T("&View...")), + wxSizerFlags().Border(wxBOTTOM)); + sizerFileBtns->Add(new wxButton(this, wxID_OPEN, _T("&Open...")), + wxSizerFlags().Border(wxTOP)); + sizerFileBtns->AddStretchSpacer(1); + + m_checklst = new wxCheckListBox(this, wxID_ANY); + + wxSizer *sizerFiles = new wxBoxSizer(wxHORIZONTAL); + sizerFiles->Add(m_checklst, flagsExpand); + sizerFiles->Add(sizerFileBtns, flagsFixed); + + sizerPreview->Add(sizerFiles, flagsExpand2); + + + // lower part of the dialog: notes field + wxSizer *sizerNotes = new wxStaticBoxSizer(wxVERTICAL, this, _("&Notes:")); + + msg = _("If you have any additional information pertaining to this bug\nreport, please enter it here and it will be joined to it:"); + + m_notes = new wxTextCtrl(this, wxID_ANY, wxEmptyString, + wxDefaultPosition, wxDefaultSize, + wxTE_MULTILINE); + + sizerNotes->Add(CreateTextSizer(msg), flagsFixed); + sizerNotes->Add(m_notes, flagsExpand); + + + wxSizer *sizerTop = new wxBoxSizer(wxVERTICAL); + sizerTop->Add(sizerPreview, flagsExpand2); + sizerTop->AddSpacer(5); + sizerTop->Add(sizerNotes, flagsExpand); + sizerTop->Add(CreateStdDialogButtonSizer(wxOK | wxCANCEL), flagsFixed); + + SetSizerAndFit(sizerTop); + Layout(); + CentreOnScreen(); +} + +// ---------------------------------------------------------------------------- +// data exchange +// ---------------------------------------------------------------------------- + +bool wxDebugReportDialog::TransferDataToWindow() +{ + // all files are included in the report by default + const size_t count = m_dbgrpt.GetFilesCount(); + for ( size_t n = 0; n < count; n++ ) + { + wxString name, + desc; + if ( m_dbgrpt.GetFile(n, &name, &desc) ) + { + m_checklst->Append(name + _T(" (") + desc + _T(')')); + m_checklst->Check(n); + + m_files.Add(name); + } + } + + return true; +} + +bool wxDebugReportDialog::TransferDataFromWindow() +{ + // any unchecked files should be removed from the report + const size_t count = m_checklst->GetCount(); + for ( size_t n = 0; n < count; n++ ) + { + if ( !m_checklst->IsChecked(n) ) + { + m_dbgrpt.RemoveFile(m_files[n]); + } + } + + // if the user entered any notes, add them to the report + const wxString notes = m_notes->GetValue(); + if ( !notes.empty() ) + { + // for now filename fixed, could make it configurable in the future... + m_dbgrpt.AddText(_T("notes.txt"), notes, _T("user notes")); + } + + return true; +} + +// ---------------------------------------------------------------------------- +// event handlers +// ---------------------------------------------------------------------------- + +void wxDebugReportDialog::OnView(wxCommandEvent& ) +{ + const int sel = m_checklst->GetSelection(); + wxCHECK_RET( sel != wxNOT_FOUND, _T("invalid selection in OnView()") ); + + wxFileName fn(m_dbgrpt.GetDirectory(), m_files[sel]); + wxString str; + + wxFFile file(fn.GetFullPath()); + if ( file.IsOpened() && file.ReadAll(&str) ) + { + wxDumpPreviewDlg dlg(this, m_files[sel], str); + dlg.ShowModal(); + } +} + +void wxDebugReportDialog::OnOpen(wxCommandEvent& ) +{ + const int sel = m_checklst->GetSelection(); + wxCHECK_RET( sel != wxNOT_FOUND, _T("invalid selection in OnOpen()") ); + + wxFileName fn(m_dbgrpt.GetDirectory(), m_files[sel]); + + // try to get the command to open this kind of files ourselves + wxString command; +#if wxUSE_MIMETYPE + wxFileType * + ft = wxTheMimeTypesManager->GetFileTypeFromExtension(fn.GetExt()); + if ( ft ) + { + command = ft->GetOpenCommand(fn.GetFullPath()); + delete ft; + } +#endif // wxUSE_MIMETYPE + + // if we couldn't, ask the user + if ( command.empty() ) + { + wxDumpOpenExternalDlg dlg(this, fn); + if ( dlg.ShowModal() == wxID_OK ) + { + // get the command chosen by the user and append file name to it + + // if we don't have place marker for file name in the command... + wxString cmd = dlg.GetCommand(); + if ( !cmd.empty() ) + { +#if wxUSE_MIMETYPE + if ( cmd.find(_T('%')) != wxString::npos ) + { + command = wxFileType::ExpandCommand(cmd, fn.GetFullPath()); + } + else // no %s nor %1 +#endif // wxUSE_MIMETYPE + { + // append the file name to the end + command << cmd << _T(" \"") << fn.GetFullPath() << _T('"'); + } + } + } + } + + if ( !command.empty() ) + ::wxExecute(command); +} + +void wxDebugReportDialog::OnViewUpdate(wxUpdateUIEvent& event) +{ + int sel = m_checklst->GetSelection(); + if (sel >= 0) + { + wxFileName fn(m_dbgrpt.GetDirectory(), m_files[sel]); + event.Enable(fn.FileExists()); + } + else + event.Enable(false); +} + + +// ============================================================================ +// wxDebugReportPreviewStd implementation +// ============================================================================ + +bool wxDebugReportPreviewStd::Show(wxDebugReport& dbgrpt) const +{ + if ( !dbgrpt.GetFilesCount() ) + return false; + + wxDebugReportDialog dlg(dbgrpt); + +#ifdef __WXMSW__ + // before entering the event loop (from ShowModal()), block the event + // handling for all other windows as this could result in more crashes + wxEventLoop::SetCriticalWindow(&dlg); +#endif // __WXMSW__ + + return dlg.ShowModal() == wxID_OK && dbgrpt.GetFilesCount() != 0; +} + +#endif // wxUSE_DEBUGREPORT && wxUSE_XML diff --git a/Externals/wxWidgets/src/generic/dcpsg.cpp b/Externals/wxWidgets/src/generic/dcpsg.cpp new file mode 100644 index 0000000000..60741cf5db --- /dev/null +++ b/Externals/wxWidgets/src/generic/dcpsg.cpp @@ -0,0 +1,2264 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/generic/dcpsg.cpp +// Purpose: Generic wxPostScriptDC implementation +// Author: Julian Smart, Robert Roebling, Markus Holzhem +// Modified by: +// Created: 04/01/98 +// RCS-ID: $Id: dcpsg.cpp 48979 2007-09-28 06:58:48Z RR $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_PRINTING_ARCHITECTURE && wxUSE_POSTSCRIPT + +#include "wx/generic/dcpsg.h" + +#ifndef WX_PRECOMP + #include "wx/intl.h" + #include "wx/log.h" + #include "wx/utils.h" + #include "wx/dcmemory.h" + #include "wx/math.h" + #include "wx/image.h" + #include "wx/icon.h" +#endif // WX_PRECOMP + +#include "wx/prntbase.h" +#include "wx/generic/prntdlgg.h" +#include "wx/paper.h" +#include "wx/filefn.h" +#include "wx/stdpaths.h" + +WXDLLIMPEXP_DATA_CORE(int) wxPageNumber; + +#ifdef __WXMSW__ + +#ifdef DrawText +#undef DrawText +#endif + +#ifdef StartDoc +#undef StartDoc +#endif + +#ifdef GetCharWidth +#undef GetCharWidth +#endif + +#ifdef FindWindow +#undef FindWindow +#endif + +#endif + +//----------------------------------------------------------------------------- +// start and end of document/page +//----------------------------------------------------------------------------- + +static const char *wxPostScriptHeaderConicTo = "\ +/conicto {\n\ + /to_y exch def\n\ + /to_x exch def\n\ + /conic_cntrl_y exch def\n\ + /conic_cntrl_x exch def\n\ + currentpoint\n\ + /p0_y exch def\n\ + /p0_x exch def\n\ + /p1_x p0_x conic_cntrl_x p0_x sub 2 3 div mul add def\n\ + /p1_y p0_y conic_cntrl_y p0_y sub 2 3 div mul add def\n\ + /p2_x p1_x to_x p0_x sub 1 3 div mul add def\n\ + /p2_y p1_y to_y p0_y sub 1 3 div mul add def\n\ + p1_x p1_y p2_x p2_y to_x to_y curveto\n\ +} bind def\n\ +"; + +static const char *wxPostScriptHeaderEllipse = "\ +/ellipsedict 8 dict def\n\ +ellipsedict /mtrx matrix put\n\ +/ellipse {\n\ + ellipsedict begin\n\ + /endangle exch def\n\ + /startangle exch def\n\ + /yrad exch def\n\ + /xrad exch def\n\ + /y exch def\n\ + /x exch def\n\ + /savematrix mtrx currentmatrix def\n\ + x y translate\n\ + xrad yrad scale\n\ + 0 0 1 startangle endangle arc\n\ + savematrix setmatrix\n\ + end\n\ + } def\n\ +"; + +static const char *wxPostScriptHeaderEllipticArc= "\ +/ellipticarcdict 8 dict def\n\ +ellipticarcdict /mtrx matrix put\n\ +/ellipticarc\n\ +{ ellipticarcdict begin\n\ + /do_fill exch def\n\ + /endangle exch def\n\ + /startangle exch def\n\ + /yrad exch def\n\ + /xrad exch def \n\ + /y exch def\n\ + /x exch def\n\ + /savematrix mtrx currentmatrix def\n\ + x y translate\n\ + xrad yrad scale\n\ + do_fill { 0 0 moveto } if\n\ + 0 0 1 startangle endangle arc\n\ + savematrix setmatrix\n\ + do_fill { fill }{ stroke } ifelse\n\ + end\n\ +} def\n"; + +static const char *wxPostScriptHeaderSpline = "\ +/DrawSplineSection {\n\ + /y3 exch def\n\ + /x3 exch def\n\ + /y2 exch def\n\ + /x2 exch def\n\ + /y1 exch def\n\ + /x1 exch def\n\ + /xa x1 x2 x1 sub 0.666667 mul add def\n\ + /ya y1 y2 y1 sub 0.666667 mul add def\n\ + /xb x3 x2 x3 sub 0.666667 mul add def\n\ + /yb y3 y2 y3 sub 0.666667 mul add def\n\ + x1 y1 lineto\n\ + xa ya xb yb x3 y3 curveto\n\ + } def\n\ +"; + +static const char *wxPostScriptHeaderColourImage = "\ +% define 'colorimage' if it isn't defined\n\ +% ('colortogray' and 'mergeprocs' come from xwd2ps\n\ +% via xgrab)\n\ +/colorimage where % do we know about 'colorimage'?\n\ + { pop } % yes: pop off the 'dict' returned\n\ + { % no: define one\n\ + /colortogray { % define an RGB->I function\n\ + /rgbdata exch store % call input 'rgbdata'\n\ + rgbdata length 3 idiv\n\ + /npixls exch store\n\ + /rgbindx 0 store\n\ + 0 1 npixls 1 sub {\n\ + grays exch\n\ + rgbdata rgbindx get 20 mul % Red\n\ + rgbdata rgbindx 1 add get 32 mul % Green\n\ + rgbdata rgbindx 2 add get 12 mul % Blue\n\ + add add 64 idiv % I = .5G + .31R + .18B\n\ + put\n\ + /rgbindx rgbindx 3 add store\n\ + } for\n\ + grays 0 npixls getinterval\n\ + } bind def\n\ +\n\ + % Utility procedure for colorimage operator.\n\ + % This procedure takes two procedures off the\n\ + % stack and merges them into a single procedure.\n\ +\n\ + /mergeprocs { % def\n\ + dup length\n\ + 3 -1 roll\n\ + dup\n\ + length\n\ + dup\n\ + 5 1 roll\n\ + 3 -1 roll\n\ + add\n\ + array cvx\n\ + dup\n\ + 3 -1 roll\n\ + 0 exch\n\ + putinterval\n\ + dup\n\ + 4 2 roll\n\ + putinterval\n\ + } bind def\n\ +\n\ + /colorimage { % def\n\ + pop pop % remove 'false 3' operands\n\ + {colortogray} mergeprocs\n\ + image\n\ + } bind def\n\ + } ifelse % end of 'false' case\n\ +"; + +static char wxPostScriptHeaderReencodeISO1[] = + "\n/reencodeISO {\n" +"dup dup findfont dup length dict begin\n" +"{ 1 index /FID ne { def }{ pop pop } ifelse } forall\n" +"/Encoding ISOLatin1Encoding def\n" +"currentdict end definefont\n" +"} def\n" +"/ISOLatin1Encoding [\n" +"/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef\n" +"/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef\n" +"/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef\n" +"/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef\n" +"/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright\n" +"/parenleft/parenright/asterisk/plus/comma/minus/period/slash\n" +"/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon\n" +"/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N\n" +"/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright\n" +"/asciicircum/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m\n" +"/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde\n" +"/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef\n" +"/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef\n" +"/.notdef/dotlessi/grave/acute/circumflex/tilde/macron/breve\n" +"/dotaccent/dieresis/.notdef/ring/cedilla/.notdef/hungarumlaut\n"; + +static char wxPostScriptHeaderReencodeISO2[] = +"/ogonek/caron/space/exclamdown/cent/sterling/currency/yen/brokenbar\n" +"/section/dieresis/copyright/ordfeminine/guillemotleft/logicalnot\n" +"/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior\n" +"/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine\n" +"/guillemotright/onequarter/onehalf/threequarters/questiondown\n" +"/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla\n" +"/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex\n" +"/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis\n" +"/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute\n" +"/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis\n" +"/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave\n" +"/iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex\n" +"/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis\n" +"/yacute/thorn/ydieresis\n" + "] def\n\n"; + +//------------------------------------------------------------------------------- +// wxPostScriptDC +//------------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxPostScriptDC, wxDC) + +float wxPostScriptDC::ms_PSScaleFactor = 1.0; + +void wxPostScriptDC::SetResolution(int ppi) +{ + ms_PSScaleFactor = (float)ppi / 72.0; +} + +int wxPostScriptDC::GetResolution() +{ + return (int)(ms_PSScaleFactor * 72.0); +} + +//------------------------------------------------------------------------------- + +wxPostScriptDC::wxPostScriptDC () +{ + m_pstream = (FILE*) NULL; + + m_currentRed = 0; + m_currentGreen = 0; + m_currentBlue = 0; + + m_pageNumber = 0; + + m_clipping = false; + + m_underlinePosition = 0.0; + m_underlineThickness = 0.0; + + m_signX = 1; // default x-axis left to right + m_signY = -1; // default y-axis bottom up -> top down +} + +wxPostScriptDC::wxPostScriptDC (const wxPrintData& printData) +{ + m_pstream = (FILE*) NULL; + + m_currentRed = 0; + m_currentGreen = 0; + m_currentBlue = 0; + + m_pageNumber = 0; + + m_clipping = false; + + m_underlinePosition = 0.0; + m_underlineThickness = 0.0; + + m_signX = 1; // default x-axis left to right + m_signY = -1; // default y-axis bottom up -> top down + + m_printData = printData; + + m_ok = true; +} + +wxPostScriptDC::~wxPostScriptDC () +{ + if (m_pstream) + { + fclose( m_pstream ); + m_pstream = (FILE*) NULL; + } +} + +bool wxPostScriptDC::IsOk() const +{ + return m_ok; +} + +void wxPostScriptDC::DoSetClippingRegion (wxCoord x, wxCoord y, wxCoord w, wxCoord h) +{ + wxCHECK_RET( m_ok , wxT("invalid postscript dc") ); + + if (m_clipping) DestroyClippingRegion(); + + wxDC::DoSetClippingRegion(x, y, w, h); + + m_clipping = true; + + PsPrintf( wxT("gsave\n newpath\n") + wxT("%d %d moveto\n") + wxT("%d %d lineto\n") + wxT("%d %d lineto\n") + wxT("%d %d lineto\n") + wxT("closepath clip newpath\n"), + LogicalToDeviceX(x), LogicalToDeviceY(y), + LogicalToDeviceX(x+w), LogicalToDeviceY(y), + LogicalToDeviceX(x+w), LogicalToDeviceY(y+h), + LogicalToDeviceX(x), LogicalToDeviceY(y+h) ); +} + + +void wxPostScriptDC::DestroyClippingRegion() +{ + wxCHECK_RET( m_ok , wxT("invalid postscript dc") ); + + if (m_clipping) + { + m_clipping = false; + PsPrint( "grestore\n" ); + } + + wxDC::DestroyClippingRegion(); +} + +void wxPostScriptDC::Clear() +{ + // This should fail silently to avoid unnecessary + // asserts + // wxFAIL_MSG( wxT("wxPostScriptDC::Clear not implemented.") ); +} + +bool wxPostScriptDC::DoFloodFill (wxCoord WXUNUSED(x), wxCoord WXUNUSED(y), const wxColour &WXUNUSED(col), int WXUNUSED(style)) +{ + wxFAIL_MSG( wxT("wxPostScriptDC::FloodFill not implemented.") ); + return false; +} + +bool wxPostScriptDC::DoGetPixel (wxCoord WXUNUSED(x), wxCoord WXUNUSED(y), wxColour * WXUNUSED(col)) const +{ + wxFAIL_MSG( wxT("wxPostScriptDC::GetPixel not implemented.") ); + return false; +} + +void wxPostScriptDC::DoCrossHair (wxCoord WXUNUSED(x), wxCoord WXUNUSED(y)) +{ + wxFAIL_MSG( wxT("wxPostScriptDC::CrossHair not implemented.") ); +} + +void wxPostScriptDC::DoDrawLine (wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2) +{ + wxCHECK_RET( m_ok, wxT("invalid postscript dc") ); + + if (m_pen.GetStyle() == wxTRANSPARENT) return; + + SetPen( m_pen ); + + PsPrintf( wxT("newpath\n") + wxT("%d %d moveto\n") + wxT("%d %d lineto\n") + wxT("stroke\n"), + LogicalToDeviceX(x1), LogicalToDeviceY(y1), + LogicalToDeviceX(x2), LogicalToDeviceY (y2) ); + + CalcBoundingBox( x1, y1 ); + CalcBoundingBox( x2, y2 ); +} + +#define RAD2DEG 57.29577951308 + +void wxPostScriptDC::DoDrawArc (wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2, wxCoord xc, wxCoord yc) +{ + wxCHECK_RET( m_ok, wxT("invalid postscript dc") ); + + wxCoord dx = x1 - xc; + wxCoord dy = y1 - yc; + wxCoord radius = (wxCoord) sqrt( (double)(dx*dx+dy*dy) ); + double alpha1, alpha2; + + if (x1 == x2 && y1 == y2) + { + alpha1 = 0.0; + alpha2 = 360.0; + } + else if ( wxIsNullDouble(radius) ) + { + alpha1 = + alpha2 = 0.0; + } + else + { + alpha1 = (x1 - xc == 0) ? + (y1 - yc < 0) ? 90.0 : -90.0 : + -atan2(double(y1-yc), double(x1-xc)) * RAD2DEG; + alpha2 = (x2 - xc == 0) ? + (y2 - yc < 0) ? 90.0 : -90.0 : + -atan2(double(y2-yc), double(x2-xc)) * RAD2DEG; + } + while (alpha1 <= 0) alpha1 += 360; + while (alpha2 <= 0) alpha2 += 360; // adjust angles to be between + while (alpha1 > 360) alpha1 -= 360; // 0 and 360 degree + while (alpha2 > 360) alpha2 -= 360; + + if (m_brush.GetStyle() != wxTRANSPARENT) + { + SetBrush( m_brush ); + + PsPrintf( wxT("newpath\n") + wxT("%d %d %d %d %d %d ellipse\n") + wxT("%d %d lineto\n") + wxT("closepath\n") + wxT("fill\n"), + LogicalToDeviceX(xc), LogicalToDeviceY(yc), LogicalToDeviceXRel(radius), LogicalToDeviceYRel(radius), (wxCoord)alpha1, (wxCoord) alpha2, + LogicalToDeviceX(xc), LogicalToDeviceY(yc) ); + + CalcBoundingBox( xc-radius, yc-radius ); + CalcBoundingBox( xc+radius, yc+radius ); + } + + if (m_pen.GetStyle() != wxTRANSPARENT) + { + SetPen( m_pen ); + + PsPrintf( wxT("newpath\n") + wxT("%d %d %d %d %d %d ellipse\n") + wxT("%d %d lineto\n") + wxT("closepath\n") + wxT("stroke\n"), + LogicalToDeviceX(xc), LogicalToDeviceY(yc), LogicalToDeviceXRel(radius), LogicalToDeviceYRel(radius), (wxCoord)alpha1, (wxCoord) alpha2, + LogicalToDeviceX(xc), LogicalToDeviceY(yc) ); + + CalcBoundingBox( xc-radius, yc-radius ); + CalcBoundingBox( xc+radius, yc+radius ); + } +} + +void wxPostScriptDC::DoDrawEllipticArc(wxCoord x,wxCoord y,wxCoord w,wxCoord h,double sa,double ea) +{ + wxCHECK_RET( m_ok, wxT("invalid postscript dc") ); + + if ( sa >= 360 || sa <= -360 ) + sa -= int(sa/360)*360; + if ( ea >= 360 || ea <=- 360 ) + ea -= int(ea/360)*360; + if ( sa < 0 ) + sa += 360; + if ( ea < 0 ) + ea += 360; + + if ( wxIsSameDouble(sa, ea) ) + { + DrawEllipse(x,y,w,h); + return; + } + + if (m_brush.GetStyle () != wxTRANSPARENT) + { + SetBrush( m_brush ); + + PsPrintf( wxT("newpath\n") + wxT("%d %d %d %d %d %d true ellipticarc\n"), + LogicalToDeviceX(x+w/2), LogicalToDeviceY(y+h/2), + LogicalToDeviceXRel(w/2), LogicalToDeviceYRel(h/2), + (wxCoord)sa, (wxCoord)ea ); + + CalcBoundingBox( x ,y ); + CalcBoundingBox( x+w, y+h ); + } + + if (m_pen.GetStyle () != wxTRANSPARENT) + { + SetPen( m_pen ); + + PsPrintf( wxT("newpath\n") + wxT("%d %d %d %d %d %d false ellipticarc\n"), + LogicalToDeviceX(x+w/2), LogicalToDeviceY(y+h/2), + LogicalToDeviceXRel(w/2), LogicalToDeviceYRel(h/2), + (wxCoord)sa, (wxCoord)ea ); + + CalcBoundingBox( x ,y ); + CalcBoundingBox( x+w, y+h ); + } +} + +void wxPostScriptDC::DoDrawPoint (wxCoord x, wxCoord y) +{ + wxCHECK_RET( m_ok, wxT("invalid postscript dc") ); + + if (m_pen.GetStyle() == wxTRANSPARENT) return; + + SetPen (m_pen); + + PsPrintf( wxT("newpath\n") + wxT("%d %d moveto\n") + wxT("%d %d lineto\n") + wxT("stroke\n"), + LogicalToDeviceX(x), LogicalToDeviceY(y), + LogicalToDeviceX(x+1), LogicalToDeviceY(y) ); + + CalcBoundingBox( x, y ); +} + +void wxPostScriptDC::DoDrawPolygon (int n, wxPoint points[], wxCoord xoffset, wxCoord yoffset, int fillStyle) +{ + wxCHECK_RET( m_ok, wxT("invalid postscript dc") ); + + if (n <= 0) return; + + if (m_brush.GetStyle () != wxTRANSPARENT) + { + SetBrush( m_brush ); + + PsPrint( "newpath\n" ); + + wxCoord xx = LogicalToDeviceX(points[0].x + xoffset); + wxCoord yy = LogicalToDeviceY(points[0].y + yoffset); + + PsPrintf( wxT("%d %d moveto\n"), xx, yy ); + + CalcBoundingBox( points[0].x + xoffset, points[0].y + yoffset ); + + for (int i = 1; i < n; i++) + { + xx = LogicalToDeviceX(points[i].x + xoffset); + yy = LogicalToDeviceY(points[i].y + yoffset); + + PsPrintf( wxT("%d %d lineto\n"), xx, yy ); + + CalcBoundingBox( points[i].x + xoffset, points[i].y + yoffset); + } + + PsPrint( (fillStyle == wxODDEVEN_RULE ? "eofill\n" : "fill\n") ); + } + + if (m_pen.GetStyle () != wxTRANSPARENT) + { + SetPen( m_pen ); + + PsPrint( "newpath\n" ); + + wxCoord xx = LogicalToDeviceX(points[0].x + xoffset); + wxCoord yy = LogicalToDeviceY(points[0].y + yoffset); + + PsPrintf( wxT("%d %d moveto\n"), xx, yy ); + + CalcBoundingBox( points[0].x + xoffset, points[0].y + yoffset ); + + for (int i = 1; i < n; i++) + { + xx = LogicalToDeviceX(points[i].x + xoffset); + yy = LogicalToDeviceY(points[i].y + yoffset); + + PsPrintf( wxT("%d %d lineto\n"), xx, yy ); + + CalcBoundingBox( points[i].x + xoffset, points[i].y + yoffset); + } + + PsPrint( "closepath\n" ); + PsPrint( "stroke\n" ); + } +} + +void wxPostScriptDC::DoDrawPolyPolygon (int n, int count[], wxPoint points[], wxCoord xoffset, wxCoord yoffset, int fillStyle) +{ + wxCHECK_RET( m_ok, wxT("invalid postscript dc") ); + + if (n <= 0) return; + + if (m_brush.GetStyle () != wxTRANSPARENT) + { + SetBrush( m_brush ); + + PsPrint( "newpath\n" ); + + int ofs = 0; + for (int i = 0; i < n; ofs += count[i++]) + { + wxCoord xx = LogicalToDeviceX(points[ofs].x + xoffset); + wxCoord yy = LogicalToDeviceY(points[ofs].y + yoffset); + + PsPrintf( wxT("%d %d moveto\n"), xx, yy ); + + CalcBoundingBox( points[ofs].x + xoffset, points[ofs].y + yoffset ); + + for (int j = 1; j < count[i]; j++) + { + xx = LogicalToDeviceX(points[ofs+j].x + xoffset); + yy = LogicalToDeviceY(points[ofs+j].y + yoffset); + + PsPrintf( wxT("%d %d lineto\n"), xx, yy ); + + CalcBoundingBox( points[ofs+j].x + xoffset, points[ofs+j].y + yoffset); + } + } + PsPrint( (fillStyle == wxODDEVEN_RULE ? "eofill\n" : "fill\n") ); + } + + if (m_pen.GetStyle () != wxTRANSPARENT) + { + SetPen( m_pen ); + + PsPrint( "newpath\n" ); + + int ofs = 0; + for (int i = 0; i < n; ofs += count[i++]) + { + wxCoord xx = LogicalToDeviceX(points[ofs].x + xoffset); + wxCoord yy = LogicalToDeviceY(points[ofs].y + yoffset); + + PsPrintf( wxT("%d %d moveto\n"), xx, yy ); + + CalcBoundingBox( points[ofs].x + xoffset, points[ofs].y + yoffset ); + + for (int j = 1; j < count[i]; j++) + { + xx = LogicalToDeviceX(points[ofs+j].x + xoffset); + yy = LogicalToDeviceY(points[ofs+j].y + yoffset); + + PsPrintf( wxT("%d %d lineto\n"), xx, yy ); + + CalcBoundingBox( points[ofs+j].x + xoffset, points[ofs+j].y + yoffset); + } + } + PsPrint( "closepath\n" ); + PsPrint( "stroke\n" ); + } +} + +void wxPostScriptDC::DoDrawLines (int n, wxPoint points[], wxCoord xoffset, wxCoord yoffset) +{ + wxCHECK_RET( m_ok, wxT("invalid postscript dc") ); + + if (m_pen.GetStyle() == wxTRANSPARENT) return; + + if (n <= 0) return; + + SetPen (m_pen); + + int i; + for ( i =0; i= 128 ) + { + /* Cope with character codes > 127 */ + PsPrintf( wxT("\\%o"), c); + } + else + { + PsPrint(c); + } + } + + PsPrint( ") show\n" ); + + if (m_font.GetUnderlined()) + { + wxCoord uy = (wxCoord)(y + size - m_underlinePosition); + char buffer[100]; + + sprintf( buffer, + "gsave\n" + "%d %d moveto\n" + "%f setlinewidth\n" + "%d %d lineto\n" + "stroke\n" + "grestore\n", + LogicalToDeviceX(x), LogicalToDeviceY(uy), + m_underlineThickness, + LogicalToDeviceX(x + text_w), LogicalToDeviceY(uy) ); + for (i = 0; i < 100; i++) + if (buffer[i] == ',') buffer[i] = '.'; + PsPrint( buffer ); + } + + CalcBoundingBox( x, y ); + CalcBoundingBox( x + size * text.length() * 2/3 , y ); +} + +void wxPostScriptDC::DoDrawRotatedText( const wxString& text, wxCoord x, wxCoord y, double angle ) +{ + if ( wxIsNullDouble(angle) ) + { + DoDrawText(text, x, y); + return; + } + + wxCHECK_RET( m_ok, wxT("invalid postscript dc") ); + + SetFont( m_font ); + + if (m_textForegroundColour.Ok()) + { + unsigned char red = m_textForegroundColour.Red(); + unsigned char blue = m_textForegroundColour.Blue(); + unsigned char green = m_textForegroundColour.Green(); + + if (!m_colour) + { + // Anything not white is black + if (! (red == (unsigned char) 255 && + blue == (unsigned char) 255 && + green == (unsigned char) 255)) + { + red = (unsigned char) 0; + green = (unsigned char) 0; + blue = (unsigned char) 0; + } + } + + // maybe setgray here ? + if (!(red == m_currentRed && green == m_currentGreen && blue == m_currentBlue)) + { + double redPS = (double)(red) / 255.0; + double bluePS = (double)(blue) / 255.0; + double greenPS = (double)(green) / 255.0; + + char buffer[100]; + sprintf( buffer, + "%.8f %.8f %.8f setrgbcolor\n", + redPS, greenPS, bluePS ); + for (int i = 0; i < 100; i++) + if (buffer[i] == ',') buffer[i] = '.'; + PsPrint( buffer ); + + m_currentRed = red; + m_currentBlue = blue; + m_currentGreen = green; + } + } + + int size = m_font.GetPointSize(); + + PsPrintf( wxT("%d %d moveto\n"), + LogicalToDeviceX(x), LogicalToDeviceY(y)); + + char buffer[100]; + sprintf(buffer, "%.8f rotate\n", angle); + size_t i; + for (i = 0; i < 100; i++) + { + if (buffer[i] == ',') buffer[i] = '.'; + } + PsPrint( buffer); + + PsPrint( "(" ); + const wxWX2MBbuf textbuf = text.mb_str(); + size_t len = strlen(textbuf); + for (i = 0; i < len; i++) + { + int c = (unsigned char) textbuf[i]; + if (c == ')' || c == '(' || c == '\\') + { + /* Cope with special characters */ + PsPrint( "\\" ); + PsPrint(c); + } + else if ( c >= 128 ) + { + /* Cope with character codes > 127 */ + PsPrintf( wxT("\\%o"), c); + } + else + { + PsPrint(c); + } + } + + PsPrint( ") show\n" ); + + sprintf( buffer, "%.8f rotate\n", -angle ); + for (i = 0; i < 100; i++) + { + if (buffer[i] == ',') buffer[i] = '.'; + } + PsPrint( buffer ); + + if (m_font.GetUnderlined()) + { + wxCoord uy = (wxCoord)(y + size - m_underlinePosition); + wxCoord w, h; + GetTextExtent(text, &w, &h); + + sprintf( buffer, + "gsave\n" + "%d %d moveto\n" + "%f setlinewidth\n" + "%d %d lineto\n" + "stroke\n" + "grestore\n", + LogicalToDeviceX(x), LogicalToDeviceY(uy), + m_underlineThickness, + LogicalToDeviceX(x + w), LogicalToDeviceY(uy) ); + for (i = 0; i < 100; i++) + { + if (buffer[i] == ',') buffer[i] = '.'; + } + PsPrint( buffer ); + } + + CalcBoundingBox( x, y ); + CalcBoundingBox( x + size * text.length() * 2/3 , y ); +} + +void wxPostScriptDC::SetBackground (const wxBrush& brush) +{ + m_backgroundBrush = brush; +} + +void wxPostScriptDC::SetLogicalFunction (int WXUNUSED(function)) +{ + wxFAIL_MSG( wxT("wxPostScriptDC::SetLogicalFunction not implemented.") ); +} + +#if wxUSE_SPLINES +void wxPostScriptDC::DoDrawSpline( wxList *points ) +{ + wxCHECK_RET( m_ok, wxT("invalid postscript dc") ); + + SetPen( m_pen ); + + // a and b are not used + //double a, b; + double c, d, x1, y1, x2, y2, x3, y3; + wxPoint *p, *q; + + wxList::compatibility_iterator node = points->GetFirst(); + p = (wxPoint *)node->GetData(); + x1 = p->x; + y1 = p->y; + + node = node->GetNext(); + p = (wxPoint *)node->GetData(); + c = p->x; + d = p->y; + x3 = + #if 0 + a = + #endif + (double)(x1 + c) / 2; + y3 = + #if 0 + b = + #endif + (double)(y1 + d) / 2; + + PsPrintf( wxT("newpath\n") + wxT("%d %d moveto\n") + wxT("%d %d lineto\n"), + LogicalToDeviceX((wxCoord)x1), LogicalToDeviceY((wxCoord)y1), + LogicalToDeviceX((wxCoord)x3), LogicalToDeviceY((wxCoord)y3) ); + + CalcBoundingBox( (wxCoord)x1, (wxCoord)y1 ); + CalcBoundingBox( (wxCoord)x3, (wxCoord)y3 ); + + node = node->GetNext(); + while (node) + { + q = (wxPoint *)node->GetData(); + + x1 = x3; + y1 = y3; + x2 = c; + y2 = d; + c = q->x; + d = q->y; + x3 = (double)(x2 + c) / 2; + y3 = (double)(y2 + d) / 2; + + PsPrintf( wxT("%d %d %d %d %d %d DrawSplineSection\n"), + LogicalToDeviceX((wxCoord)x1), LogicalToDeviceY((wxCoord)y1), + LogicalToDeviceX((wxCoord)x2), LogicalToDeviceY((wxCoord)y2), + LogicalToDeviceX((wxCoord)x3), LogicalToDeviceY((wxCoord)y3) ); + + CalcBoundingBox( (wxCoord)x1, (wxCoord)y1 ); + CalcBoundingBox( (wxCoord)x3, (wxCoord)y3 ); + + node = node->GetNext(); + } + + /* + At this point, (x2,y2) and (c,d) are the position of the + next-to-last and last point respectively, in the point list + */ + + PsPrintf( wxT("%d %d lineto\n") + wxT("stroke\n"), + LogicalToDeviceX((wxCoord)c), LogicalToDeviceY((wxCoord)d) ); +} +#endif // wxUSE_SPLINES + +wxCoord wxPostScriptDC::GetCharWidth() const +{ + // Chris Breeze: reasonable approximation using wxMODERN/Courier + return (wxCoord) (GetCharHeight() * 72.0 / 120.0); +} + + +void wxPostScriptDC::SetAxisOrientation( bool xLeftRight, bool yBottomUp ) +{ + wxCHECK_RET( m_ok, wxT("invalid postscript dc") ); + + m_signX = (xLeftRight ? 1 : -1); + m_signY = (yBottomUp ? 1 : -1); + + ComputeScaleAndOrigin(); +} + +void wxPostScriptDC::SetDeviceOrigin( wxCoord x, wxCoord y ) +{ + wxCHECK_RET( m_ok, wxT("invalid postscript dc") ); + + int h = 0; + int w = 0; + GetSize( &w, &h ); + + wxDC::SetDeviceOrigin( x, h-y ); +} + +void wxPostScriptDC::DoGetSize(int* width, int* height) const +{ + wxPaperSize id = m_printData.GetPaperId(); + + wxPrintPaperType *paper = wxThePrintPaperDatabase->FindPaperType(id); + + if (!paper) paper = wxThePrintPaperDatabase->FindPaperType(wxPAPER_A4); + + int w = 595; + int h = 842; + if (paper) + { + w = paper->GetSizeDeviceUnits().x; + h = paper->GetSizeDeviceUnits().y; + } + + if (m_printData.GetOrientation() == wxLANDSCAPE) + { + int tmp = w; + w = h; + h = tmp; + } + + if (width) *width = (int)(w * ms_PSScaleFactor); + if (height) *height = (int)(h * ms_PSScaleFactor); +} + +void wxPostScriptDC::DoGetSizeMM(int *width, int *height) const +{ + wxPaperSize id = m_printData.GetPaperId(); + + wxPrintPaperType *paper = wxThePrintPaperDatabase->FindPaperType(id); + + if (!paper) paper = wxThePrintPaperDatabase->FindPaperType(wxPAPER_A4); + + int w = 210; + int h = 297; + if (paper) + { + w = paper->GetWidth() / 10; + h = paper->GetHeight() / 10; + } + + if (m_printData.GetOrientation() == wxLANDSCAPE) + { + int tmp = w; + w = h; + h = tmp; + } + + if (width) *width = w; + if (height) *height = h; +} + +// Resolution in pixels per logical inch +wxSize wxPostScriptDC::GetPPI(void) const +{ + return wxSize((int)(72 * ms_PSScaleFactor), + (int)(72 * ms_PSScaleFactor)); +} + + +bool wxPostScriptDC::StartDoc( const wxString& message ) +{ + wxCHECK_MSG( m_ok, false, wxT("invalid postscript dc") ); + + if (m_printData.GetPrintMode() != wxPRINT_MODE_STREAM ) + { + if (m_printData.GetFilename() == wxEmptyString) + { + wxString filename = wxGetTempFileName( wxT("ps") ); + m_printData.SetFilename(filename); + } + + m_pstream = wxFopen( m_printData.GetFilename(), wxT("w+") ); + + if (!m_pstream) + { + wxLogError( _("Cannot open file for PostScript printing!")); + m_ok = false; + return false; + } + } + + m_ok = true; + m_title = message; + + PsPrint( "%!PS-Adobe-2.0\n" ); + PsPrintf( wxT("%%%%Title: %s\n"), m_title.c_str() ); + PsPrint( "%%Creator: wxWidgets PostScript renderer\n" ); + PsPrintf( wxT("%%%%CreationDate: %s\n"), wxNow().c_str() ); + if (m_printData.GetOrientation() == wxLANDSCAPE) + PsPrint( "%%Orientation: Landscape\n" ); + else + PsPrint( "%%Orientation: Portrait\n" ); + + // PsPrintf( wxT("%%%%Pages: %d\n"), (wxPageNumber - 1) ); + + const wxChar *paper; + switch (m_printData.GetPaperId()) + { + case wxPAPER_LETTER: paper = wxT("Letter"); break; // Letter: paper ""; 8 1/2 by 11 inches + case wxPAPER_LEGAL: paper = wxT("Legal"); break; // Legal, 8 1/2 by 14 inches + case wxPAPER_A4: paper = wxT("A4"); break; // A4 Sheet, 210 by 297 millimeters + case wxPAPER_TABLOID: paper = wxT("Tabloid"); break; // Tabloid, 11 by 17 inches + case wxPAPER_LEDGER: paper = wxT("Ledger"); break; // Ledger, 17 by 11 inches + case wxPAPER_STATEMENT: paper = wxT("Statement"); break; // Statement, 5 1/2 by 8 1/2 inches + case wxPAPER_EXECUTIVE: paper = wxT("Executive"); break; // Executive, 7 1/4 by 10 1/2 inches + case wxPAPER_A3: paper = wxT("A3"); break; // A3 sheet, 297 by 420 millimeters + case wxPAPER_A5: paper = wxT("A5"); break; // A5 sheet, 148 by 210 millimeters + case wxPAPER_B4: paper = wxT("B4"); break; // B4 sheet, 250 by 354 millimeters + case wxPAPER_B5: paper = wxT("B5"); break; // B5 sheet, 182-by-257-millimeter paper + case wxPAPER_FOLIO: paper = wxT("Folio"); break; // Folio, 8-1/2-by-13-inch paper + case wxPAPER_QUARTO: paper = wxT("Quaro"); break; // Quarto, 215-by-275-millimeter paper + case wxPAPER_10X14: paper = wxT("10x14"); break; // 10-by-14-inch sheet + default: paper = wxT("A4"); + } + PsPrintf( wxT("%%%%DocumentPaperSizes: %s\n"), paper ); + PsPrint( "%%EndComments\n\n" ); + + PsPrint( "%%BeginProlog\n" ); + PsPrint( wxPostScriptHeaderConicTo ); + PsPrint( wxPostScriptHeaderEllipse ); + PsPrint( wxPostScriptHeaderEllipticArc ); + PsPrint( wxPostScriptHeaderColourImage ); + PsPrint( wxPostScriptHeaderReencodeISO1 ); + PsPrint( wxPostScriptHeaderReencodeISO2 ); + if (wxPostScriptHeaderSpline) + PsPrint( wxPostScriptHeaderSpline ); + PsPrint( "%%EndProlog\n" ); + + SetBrush( *wxBLACK_BRUSH ); + SetPen( *wxBLACK_PEN ); + SetBackground( *wxWHITE_BRUSH ); + SetTextForeground( *wxBLACK ); + + // set origin according to paper size + SetDeviceOrigin( 0,0 ); + + wxPageNumber = 1; + m_pageNumber = 1; + return true; +} + +void wxPostScriptDC::EndDoc () +{ + wxCHECK_RET( m_ok, wxT("invalid postscript dc") ); + + if (m_clipping) + { + m_clipping = false; + PsPrint( "grestore\n" ); + } + + if ( m_pstream ) { + fclose( m_pstream ); + m_pstream = (FILE *) NULL; + } + +#if 0 + // THE FOLLOWING HAS BEEN CONTRIBUTED BY Andy Fyfe + wxCoord wx_printer_translate_x, wx_printer_translate_y; + double wx_printer_scale_x, wx_printer_scale_y; + + wx_printer_translate_x = (wxCoord)m_printData.GetPrinterTranslateX(); + wx_printer_translate_y = (wxCoord)m_printData.GetPrinterTranslateY(); + + wx_printer_scale_x = m_printData.GetPrinterScaleX(); + wx_printer_scale_y = m_printData.GetPrinterScaleY(); + + // Compute the bounding box. Note that it is in the default user + // coordinate system, thus we have to convert the values. + wxCoord minX = (wxCoord) LogicalToDeviceX(m_minX); + wxCoord minY = (wxCoord) LogicalToDeviceY(m_minY); + wxCoord maxX = (wxCoord) LogicalToDeviceX(m_maxX); + wxCoord maxY = (wxCoord) LogicalToDeviceY(m_maxY); + + // LOG2DEV may have changed the minimum to maximum vice versa + if ( minX > maxX ) { wxCoord tmp = minX; minX = maxX; maxX = tmp; } + if ( minY > maxY ) { wxCoord tmp = minY; minY = maxY; maxY = tmp; } + + // account for used scaling (boundingbox is before scaling in ps-file) + double scale_x = m_printData.GetPrinterScaleX() / ms_PSScaleFactor; + double scale_y = m_printData.GetPrinterScaleY() / ms_PSScaleFactor; + + wxCoord llx, lly, urx, ury; + llx = (wxCoord) ((minX+wx_printer_translate_x)*scale_x); + lly = (wxCoord) ((minY+wx_printer_translate_y)*scale_y); + urx = (wxCoord) ((maxX+wx_printer_translate_x)*scale_x); + ury = (wxCoord) ((maxY+wx_printer_translate_y)*scale_y); + // (end of bounding box computation) + + + // If we're landscape, our sense of "x" and "y" is reversed. + if (m_printData.GetOrientation() == wxLANDSCAPE) + { + wxCoord tmp; + tmp = llx; llx = lly; lly = tmp; + tmp = urx; urx = ury; ury = tmp; + + // We need either the two lines that follow, or we need to subtract + // min_x from real_translate_y, which is commented out below. + llx = llx - (wxCoord)(m_minX*wx_printer_scale_y); + urx = urx - (wxCoord)(m_minX*wx_printer_scale_y); + } + + // The Adobe specifications call for integers; we round as to make + // the bounding larger. + PsPrintf( wxT("%%%%BoundingBox: %d %d %d %d\n"), + (wxCoord)floor((double)llx), (wxCoord)floor((double)lly), + (wxCoord)ceil((double)urx), (wxCoord)ceil((double)ury) ); + + // To check the correctness of the bounding box, postscript commands + // to draw a box corresponding to the bounding box are generated below. + // But since we typically don't want to print such a box, the postscript + // commands are generated within comments. These lines appear before any + // adjustment of scale, rotation, or translation, and hence are in the + // default user coordinates. + PsPrint( "% newpath\n" ); + PsPrintf( wxT("%% %d %d moveto\n"), llx, lly ); + PsPrintf( wxT("%% %d %d lineto\n"), urx, lly ); + PsPrintf( wxT("%% %d %d lineto\n"), urx, ury ); + PsPrintf( wxT("%% %d %d lineto closepath stroke\n"), llx, ury ); +#endif + +#ifndef __WXMSW__ + wxPostScriptPrintNativeData *data = + (wxPostScriptPrintNativeData *) m_printData.GetNativeData(); + + if (m_ok && (m_printData.GetPrintMode() == wxPRINT_MODE_PRINTER)) + { + wxString command; + command += data->GetPrinterCommand(); + command += wxT(" "); + command += data->GetPrinterOptions(); + command += wxT(" "); + command += m_printData.GetFilename(); + + wxExecute( command, true ); + wxRemoveFile( m_printData.GetFilename() ); + } +#endif +} + +void wxPostScriptDC::StartPage() +{ + wxCHECK_RET( m_ok, wxT("invalid postscript dc") ); + + PsPrintf( wxT("%%%%Page: %d\n"), wxPageNumber++ ); + + // What is this one supposed to do? RR. +// *m_pstream << "matrix currentmatrix\n"; + + // Added by Chris Breeze + + // Each page starts with an "initgraphics" which resets the + // transformation and so we need to reset the origin + // (and rotate the page for landscape printing) + + // Output scaling + wxCoord translate_x, translate_y; + double scale_x, scale_y; + + wxPostScriptPrintNativeData *data = + (wxPostScriptPrintNativeData *) m_printData.GetNativeData(); + + translate_x = (wxCoord)data->GetPrinterTranslateX(); + translate_y = (wxCoord)data->GetPrinterTranslateY(); + + scale_x = data->GetPrinterScaleX(); + scale_y = data->GetPrinterScaleY(); + + if (m_printData.GetOrientation() == wxLANDSCAPE) + { + int h; + GetSize( (int*) NULL, &h ); + translate_y -= h; + PsPrint( "90 rotate\n" ); + // I copied this one from a PostScript tutorial, but to no avail. RR. + // PsPrint( "90 rotate llx neg ury nef translate\n" ); + } + + char buffer[100]; + sprintf( buffer, "%.8f %.8f scale\n", scale_x / ms_PSScaleFactor, + scale_y / ms_PSScaleFactor); + for (int i = 0; i < 100; i++) + if (buffer[i] == ',') buffer[i] = '.'; + PsPrint( buffer ); + + PsPrintf( wxT("%d %d translate\n"), translate_x, translate_y ); +} + +void wxPostScriptDC::EndPage () +{ + wxCHECK_RET( m_ok , wxT("invalid postscript dc") ); + + PsPrint( "showpage\n" ); +} + +bool wxPostScriptDC::DoBlit( wxCoord xdest, wxCoord ydest, + wxCoord fwidth, wxCoord fheight, + wxDC *source, + wxCoord xsrc, wxCoord ysrc, + int rop, bool WXUNUSED(useMask), wxCoord WXUNUSED(xsrcMask), wxCoord WXUNUSED(ysrcMask) ) +{ + wxCHECK_MSG( m_ok, false, wxT("invalid postscript dc") ); + + wxCHECK_MSG( source, false, wxT("invalid source dc") ); + + /* blit into a bitmap */ + wxBitmap bitmap( (int)fwidth, (int)fheight ); + wxMemoryDC memDC; + memDC.SelectObject(bitmap); + memDC.Blit(0, 0, fwidth, fheight, source, xsrc, ysrc, rop); /* TODO: Blit transparently? */ + memDC.SelectObject(wxNullBitmap); + + /* draw bitmap. scaling and positioning is done there */ + DrawBitmap( bitmap, xdest, ydest ); + + return true; +} + +wxCoord wxPostScriptDC::GetCharHeight() const +{ + if (m_font.Ok()) + return m_font.GetPointSize(); + else + return 12; +} + +void wxPostScriptDC::DoGetTextExtent(const wxString& string, + wxCoord *x, wxCoord *y, + wxCoord *descent, wxCoord *externalLeading, + wxFont *theFont ) const +{ + wxFont *fontToUse = theFont; + + if (!fontToUse) fontToUse = (wxFont*) &m_font; + + wxCHECK_RET( fontToUse, wxT("GetTextExtent: no font defined") ); + + if (string.empty()) + { + if (x) (*x) = 0; + if (y) (*y) = 0; + if (descent) (*descent) = 0; + if (externalLeading) (*externalLeading) = 0; + return; + } + + // GTK 2.0 + + const wxWX2MBbuf strbuf = string.mb_str(); + +#if !wxUSE_AFM_FOR_POSTSCRIPT + /* Provide a VERY rough estimate (avoid using it). + * Produces accurate results for mono-spaced font + * such as Courier (aka wxMODERN) */ + + int height = 12; + if (fontToUse) + { + height = fontToUse->GetPointSize(); + } + if ( x ) + *x = strlen (strbuf) * height * 72 / 120; + if ( y ) + *y = (wxCoord) (height * 1.32); /* allow for descender */ + if (descent) *descent = 0; + if (externalLeading) *externalLeading = 0; +#else + + /* method for calculating string widths in postscript: + / read in the AFM (adobe font metrics) file for the + / actual font, parse it and extract the character widths + / and also the descender. this may be improved, but for now + / it works well. the AFM file is only read in if the + / font is changed. this may be chached in the future. + / calls to GetTextExtent with the font unchanged are rather + / efficient!!! + / + / for each font and style used there is an AFM file necessary. + / currently i have only files for the roman font family. + / I try to get files for the other ones! + / + / CAVE: the size of the string is currently always calculated + / in 'points' (1/72 of an inch). this should later on be + / changed to depend on the mapping mode. + / CAVE: the path to the AFM files must be set before calling this + / function. this is usually done by a call like the following: + / wxSetAFMPath("d:\\wxw161\\afm\\"); + / + / example: + / + / wxPostScriptDC dc(NULL, true); + / if (dc.Ok()){ + / wxSetAFMPath("d:\\wxw161\\afm\\"); + / dc.StartDoc("Test"); + / dc.StartPage(); + / wxCoord w,h; + / dc.SetFont(new wxFont(10, wxROMAN, wxNORMAL, wxNORMAL)); + / dc.GetTextExtent("Hallo",&w,&h); + / dc.EndPage(); + / dc.EndDoc(); + / } + / + / by steve (stefan.hammes@urz.uni-heidelberg.de) + / created: 10.09.94 + / updated: 14.05.95 */ + + /* these static vars are for storing the state between calls */ + static int lastFamily= INT_MIN; + static int lastSize= INT_MIN; + static int lastStyle= INT_MIN; + static int lastWeight= INT_MIN; + static int lastDescender = INT_MIN; + static int lastWidths[256]; /* widths of the characters */ + + double UnderlinePosition = 0.0; + double UnderlineThickness = 0.0; + + // Get actual parameters + int Family = fontToUse->GetFamily(); + int Size = fontToUse->GetPointSize(); + int Style = fontToUse->GetStyle(); + int Weight = fontToUse->GetWeight(); + + // If we have another font, read the font-metrics + if (Family!=lastFamily || Size!=lastSize || Style!=lastStyle || Weight!=lastWeight) + { + // Store actual values + lastFamily = Family; + lastSize = Size; + lastStyle = Style; + lastWeight = Weight; + + const wxChar *name; + + switch (Family) + { + case wxMODERN: + case wxTELETYPE: + { + if ((Style == wxITALIC) && (Weight == wxBOLD)) name = wxT("CourBoO.afm"); + else if ((Style != wxITALIC) && (Weight == wxBOLD)) name = wxT("CourBo.afm"); + else if ((Style == wxITALIC) && (Weight != wxBOLD)) name = wxT("CourO.afm"); + else name = wxT("Cour.afm"); + break; + } + case wxROMAN: + { + if ((Style == wxITALIC) && (Weight == wxBOLD)) name = wxT("TimesBoO.afm"); + else if ((Style != wxITALIC) && (Weight == wxBOLD)) name = wxT("TimesBo.afm"); + else if ((Style == wxITALIC) && (Weight != wxBOLD)) name = wxT("TimesO.afm"); + else name = wxT("TimesRo.afm"); + break; + } + case wxSCRIPT: + { + name = wxT("Zapf.afm"); + break; + } + case wxSWISS: + default: + { + if ((Style == wxITALIC) && (Weight == wxBOLD)) name = wxT("HelvBoO.afm"); + else if ((Style != wxITALIC) && (Weight == wxBOLD)) name = wxT("HelvBo.afm"); + else if ((Style == wxITALIC) && (Weight != wxBOLD)) name = wxT("HelvO.afm"); + else name = wxT("Helv.afm"); + break; + } + } + + FILE *afmFile = NULL; + + // Get the directory of the AFM files + wxString afmName; + + // VZ: I don't know if the cast always works under Unix but it clearly + // never does under Windows where the pointer is + // wxWindowsPrintNativeData and so calling GetFontMetricPath() on + // it just crashes +#ifndef __WIN32__ + wxPostScriptPrintNativeData *data = + wxDynamicCast(m_printData.GetNativeData(), wxPostScriptPrintNativeData); + + if (data && !data->GetFontMetricPath().empty()) + { + afmName = data->GetFontMetricPath(); + afmName << wxFILE_SEP_PATH << name; + } +#endif // __WIN32__ + + if ( !afmName.empty() ) + afmFile = wxFopen(afmName, wxT("r")); + + if ( !afmFile ) + { +#if defined(__UNIX__) && !defined(__VMS__) + afmName = wxGetDataDir(); +#else // !__UNIX__ + afmName = wxStandardPaths::Get().GetDataDir(); +#endif // __UNIX__/!__UNIX__ + + afmName << wxFILE_SEP_PATH +#if defined(__LINUX__) || defined(__FREEBSD__) + << wxT("gs_afm") << wxFILE_SEP_PATH +#else + << wxT("afm") << wxFILE_SEP_PATH +#endif + << name; + afmFile = wxFopen(afmName,wxT("r")); + } + + /* 2. open and process the file + / a short explanation of the AFM format: + / we have for each character a line, which gives its size + / e.g.: + / + / C 63 ; WX 444 ; N question ; B 49 -14 395 676 ; + / + / that means, we have a character with ascii code 63, and width + / (444/1000 * fontSize) points. + / the other data is ignored for now! + / + / when the font has changed, we read in the right AFM file and store the + / character widths in an array, which is processed below (see point 3.). */ + if (afmFile==NULL) + { + wxLogDebug( wxT("GetTextExtent: can't open AFM file '%s'"), afmName.c_str() ); + wxLogDebug( wxT(" using approximate values")); + for (int i=0; i<256; i++) lastWidths[i] = 500; /* an approximate value */ + lastDescender = -150; /* dito. */ + } + else + { + /* init the widths array */ + for(int i=0; i<256; i++) lastWidths[i] = INT_MIN; + /* some variables for holding parts of a line */ + char cString[10], semiString[10], WXString[10]; + char descString[20]; + char upString[30], utString[30]; + char encString[50]; + char line[256]; + int ascii,cWidth; + /* read in the file and parse it */ + while(fgets(line,sizeof(line),afmFile)!=NULL) + { + /* A.) check for descender definition */ + if (strncmp(line,"Descender",9)==0) + { + if ((sscanf(line,"%s%d",descString,&lastDescender)!=2) || + (strcmp(descString,"Descender")!=0)) + { + wxLogDebug( wxT("AFM-file '%s': line '%s' has error (bad descender)"), afmName.c_str(),line ); + } + } + /* JC 1.) check for UnderlinePosition */ + else if(strncmp(line,"UnderlinePosition",17)==0) + { + if ((sscanf(line,"%s%lf",upString,&UnderlinePosition)!=2) || + (strcmp(upString,"UnderlinePosition")!=0)) + { + wxLogDebug( wxT("AFM-file '%s': line '%s' has error (bad UnderlinePosition)"), afmName.c_str(), line ); + } + } + /* JC 2.) check for UnderlineThickness */ + else if(strncmp(line,"UnderlineThickness",18)==0) + { + if ((sscanf(line,"%s%lf",utString,&UnderlineThickness)!=2) || + (strcmp(utString,"UnderlineThickness")!=0)) + { + wxLogDebug( wxT("AFM-file '%s': line '%s' has error (bad UnderlineThickness)"), afmName.c_str(), line ); + } + } + /* JC 3.) check for EncodingScheme */ + else if(strncmp(line,"EncodingScheme",14)==0) + { + if ((sscanf(line,"%s%s",utString,encString)!=2) || + (strcmp(utString,"EncodingScheme")!=0)) + { + wxLogDebug( wxT("AFM-file '%s': line '%s' has error (bad EncodingScheme)"), afmName.c_str(), line ); + } + else if (strncmp(encString, "AdobeStandardEncoding", 21)) + { + wxLogDebug( wxT("AFM-file '%s': line '%s' has error (unsupported EncodingScheme %s)"), + afmName.c_str(),line, encString); + } + } + /* B.) check for char-width */ + else if(strncmp(line,"C ",2)==0) + { + if (sscanf(line,"%s%d%s%s%d",cString,&ascii,semiString,WXString,&cWidth)!=5) + { + wxLogDebug(wxT("AFM-file '%s': line '%s' has an error (bad character width)"),afmName.c_str(),line); + } + if(strcmp(cString,"C")!=0 || strcmp(semiString,";")!=0 || strcmp(WXString,"WX")!=0) + { + wxLogDebug(wxT("AFM-file '%s': line '%s' has a format error"),afmName.c_str(),line); + } + /* printf(" char '%c'=%d has width '%d'\n",ascii,ascii,cWidth); */ + if (ascii>=0 && ascii<256) + { + lastWidths[ascii] = cWidth; /* store width */ + } + else + { + /* MATTHEW: this happens a lot; don't print an error */ + /* wxLogDebug("AFM-file '%s': ASCII value %d out of range",afmName.c_str(),ascii); */ + } + } + /* C.) ignore other entries. */ + } + fclose(afmFile); + } + /* hack to compute correct values for german 'Umlaute' + / the correct way would be to map the character names + / like 'adieresis' to corresp. positions of ISOEnc and read + / these values from AFM files, too. Maybe later ... */ + + // NB: casts to int are needed to suppress gcc 3.3 warnings + lastWidths[196] = lastWidths[(int)'A']; // Ä + lastWidths[228] = lastWidths[(int)'a']; // ä + lastWidths[214] = lastWidths[(int)'O']; // Ö + lastWidths[246] = lastWidths[(int)'o']; // ö + lastWidths[220] = lastWidths[(int)'U']; // Ü + lastWidths[252] = lastWidths[(int)'u']; // ü + lastWidths[223] = lastWidths[(int)251]; // ß + + /* JC: calculate UnderlineThickness/UnderlinePosition */ + + // VS: dirty, but is there any better solution? + double *pt; + pt = (double*) &m_underlinePosition; + *pt = LogicalToDeviceYRel((wxCoord)(UnderlinePosition * fontToUse->GetPointSize())) / 1000.0f; + pt = (double*) &m_underlineThickness; + *pt = LogicalToDeviceYRel((wxCoord)(UnderlineThickness * fontToUse->GetPointSize())) / 1000.0f; + + } + + + /* 3. now the font metrics are read in, calc size this + / is done by adding the widths of the characters in the + / string. they are given in 1/1000 of the size! */ + + long sum=0; + wxCoord height=Size; /* by default */ + unsigned char *p; + for(p=(unsigned char *)wxMBSTRINGCAST strbuf; *p; p++) + { + if(lastWidths[*p]== INT_MIN) + { + wxLogDebug(wxT("GetTextExtent: undefined width for character '%c' (%d)"), *p,*p); + sum += lastWidths[(unsigned char)' ']; /* assume space */ + } + else + { + sum += lastWidths[*p]; + } + } + + double widthSum = sum; + widthSum *= Size; + widthSum /= 1000.0F; + + /* add descender to height (it is usually a negative value) */ + //if (lastDescender != INT_MIN) + //{ + // height += (wxCoord)(((-lastDescender)/1000.0F) * Size); /* MATTHEW: forgot scale */ + //} + // - commented by V. Slavik - height already contains descender in it + // (judging from few experiments) + + /* return size values */ + if ( x ) + *x = (wxCoord)widthSum; + if ( y ) + *y = height; + + /* return other parameters */ + if (descent) + { + if(lastDescender!=INT_MIN) + { + *descent = (wxCoord)(((-lastDescender)/1000.0F) * Size); /* MATTHEW: forgot scale */ + } + else + { + *descent = 0; + } + } + + /* currently no idea how to calculate this! */ + if (externalLeading) *externalLeading = 0; +#endif + // Use AFM +} + +// print postscript datas via required method (file, stream) +void wxPostScriptDC::PsPrintf( const wxChar* fmt, ... ) +{ + va_list argptr; + va_start(argptr, fmt); + + PsPrint( wxString::FormatV( fmt, argptr ).c_str() ); +} + +void wxPostScriptDC::PsPrint( const char* psdata ) +{ + wxPostScriptPrintNativeData *data = + (wxPostScriptPrintNativeData *) m_printData.GetNativeData(); + + switch (m_printData.GetPrintMode()) + { +#if wxUSE_STREAMS + // append to output stream + case wxPRINT_MODE_STREAM: + { + wxOutputStream* outputstream = data->GetOutputStream(); + wxCHECK_RET( outputstream, wxT("invalid outputstream") ); + outputstream->Write( psdata, strlen( psdata ) ); + } + break; +#endif // wxUSE_STREAMS + + // save data into file + default: + wxCHECK_RET( m_pstream, wxT("invalid postscript dc") ); + fwrite( psdata, 1, strlen( psdata ), m_pstream ); + } +} + +void wxPostScriptDC::PsPrint( int ch ) +{ + wxPostScriptPrintNativeData *data = + (wxPostScriptPrintNativeData *) m_printData.GetNativeData(); + + switch (m_printData.GetPrintMode()) + { +#if wxUSE_STREAMS + // append to output stream + case wxPRINT_MODE_STREAM: + { + wxOutputStream* outputstream = data->GetOutputStream(); + wxCHECK_RET( outputstream, wxT("invalid outputstream") ); + outputstream->PutC( (char)ch ); + } + break; +#endif // wxUSE_STREAMS + + // save data into file + default: + wxCHECK_RET( m_pstream, wxT("invalid postscript dc") ); + fputc( ch, m_pstream ); + } +} + +#endif // wxUSE_PRINTING_ARCHITECTURE && wxUSE_POSTSCRIPT + +// vi:sts=4:sw=4:et diff --git a/Externals/wxWidgets/src/generic/descrip.mms b/Externals/wxWidgets/src/generic/descrip.mms new file mode 100644 index 0000000000..dc636de7b3 --- /dev/null +++ b/Externals/wxWidgets/src/generic/descrip.mms @@ -0,0 +1,276 @@ +#***************************************************************************** +# * +# Make file for VMS * +# Author : J.Jansen (joukj@hrem.nano.tudelft.nl) * +# Date : 31 October 2006 * +# * +#***************************************************************************** +.first + define wx [--.include.wx] + +.ifdef __WXMOTIF__ +CXX_DEFINE = /define=(__WXMOTIF__=1)/name=(as_is,short)\ + /assume=(nostdnew,noglobal_array_new) +CC_DEFINE = /define=(__WXMOTIF__=1)/name=(as_is,short) +.else +.ifdef __WXGTK__ +CXX_DEFINE = /define=(__WXGTK__=1)/float=ieee/name=(as_is,short)/ieee=denorm\ + /assume=(nostdnew,noglobal_array_new) +CC_DEFINE = /define=(__WXGTK__=1)/float=ieee/name=(as_is,short)/ieee=denorm +.else +.ifdef __WXX11__ +CXX_DEFINE = /define=(__WXX11__=1,__WXUNIVERSAL__==1)/float=ieee\ + /name=(as_is,short)/assume=(nostdnew,noglobal_array_new) +CC_DEFINE = /define=(__WXX11__=1,__WXUNIVERSAL__==1)/float=ieee\ + /name=(as_is,short) +.else +.ifdef __WXGTK2__ +CXX_DEFINE = /define=(__WXGTK__=1,VMS_GTK2==1)/float=ieee\ + /name=(as_is,short)/assume=(nostdnew,noglobal_array_new) +CC_DEFINE = /define=(__WX_GTK__=1,VMS_GTK2==1)/float=ieee\ + /name=(as_is,short) +.else +CXX_DEFINE = +CC_DEFINE = +.endif +.endif +.endif +.endif + +.suffixes : .cpp + +.cpp.obj : + cxx $(CXXFLAGS)$(CXX_DEFINE) $(MMS$TARGET_NAME).cpp +.c.obj : + cc $(CFLAGS)$(CC_DEFINE) $(MMS$TARGET_NAME).c + +OBJECTS = \ + aboutdlgg.obj,\ + animateg.obj,\ + busyinfo.obj,\ + calctrl.obj,\ + caret.obj,\ + choicbkg.obj,\ + choicdgg.obj,\ + colrdlgg.obj,\ + clrpickerg.obj,\ + datectlg.obj,\ + dcpsg.obj,\ + dirctrlg.obj,\ + dirdlgg.obj,\ + fdrepdlg.obj,\ + fontdlgg.obj,\ + fontpickerg.obj,\ + grid.obj,\ + gridctrl.obj,\ + gridsel.obj,\ + helpext.obj,\ + htmllbox.obj,\ + imaglist.obj,\ + laywin.obj,\ + listbkg.obj,\ + listctrl.obj,\ + logg.obj,\ + msgdlgg.obj,\ + numdlgg.obj,\ + odcombo.obj,\ + panelg.obj,\ + printps.obj,\ + prntdlgg.obj,\ + propdlg.obj,\ + progdlgg.obj,\ + renderg.obj,\ + sashwin.obj,\ + scrlwing.obj,\ + selstore.obj,\ + splitter.obj,\ + tabg.obj,\ + textdlgg.obj,\ + tipdlg.obj,\ + tipwin.obj,\ + toolbkg.obj,\ + treebkg.obj,\ + treectlg.obj,\ + wizard.obj,\ + hyperlink.obj,\ + filepickerg.obj,\ + bmpcboxg.obj + +SOURCES = \ + aboutdlgg.cpp,\ + accel.cpp,\ + animateg.cpp,\ + busyinfo.cpp,\ + calctrl.cpp,\ + caret.cpp,\ + choicbkg.cpp,\ + choicdgg.cpp,\ + collpaneg.cpp,\ + colrdlgg.cpp,\ + clrpickerg.cpp,\ + datectlg.cpp,\ + dcpsg.cpp,\ + dirctrlg.cpp,\ + dirdlgg.cpp,\ + filedlgg.cpp,\ + fdrepdlg.cpp,\ + fontdlgg.cpp,\ + fontpickerg.cpp,\ + grid.cpp,\ + gridctrl.cpp,\ + gridsel.cpp,\ + helpext.cpp,\ + htmllbox.cpp,\ + imaglist.cpp,\ + laywin.cpp,\ + listbkg.cpp,\ + listctrl.cpp,\ + logg.cpp,\ + msgdlgg.cpp,\ + notebook.cpp,\ + numdlgg.cpp,\ + odcombo.cpp,\ + paletteg.cpp,\ + panelg.cpp,\ + printps.cpp,\ + prntdlgg.cpp,\ + propdlg.cpp,\ + progdlgg.cpp,\ + renderg.cpp,\ + sashwin.cpp,\ + selstore.cpp,\ + splitter.cpp,\ + statline.cpp,\ + statusbr.cpp,\ + tabg.cpp,\ + textdlgg.cpp,\ + tipdlg.cpp,\ + tipwin.cpp,\ + toolbkg.cpp,\ + treebkg.cpp,\ + treectlg.cpp,\ + wizard.cpp,\ + dragimgg.cpp,\ + fdrepdlg.cpp,\ + htmllbox.cpp,\ + listbkg.cpp,\ + mdig.cpp,\ + scrlwing.cpp,\ + spinctlg.cpp,\ + splash.cpp,\ + timer.cpp,\ + vlbox.cpp,\ + hyperlink.cpp,\ + filepickerg.cpp,\ + vscroll.cpp,\ + icon.cpp,bmpcboxg.cpp + +.ifdef __WXMOTIF__ +OBJECTS0=,statusbr.obj,statline.obj,notebook.obj,spinctlg.obj,collpaneg.obj,\ + combog.obj +.else +.ifdef __WXX11__ +OBJECTS0=,accel.obj,filedlgg.obj,dragimgg.obj,fdrepdlg.obj,htmllbox.obj,\ + listbkg.obj,mdig.obj,spinctlg.obj,splash.obj,timer.obj,\ + vlbox.obj,vscroll.obj,combog.obj,icon.obj,collpaneg.obj +.else +.ifdef __WXGTK__ +OBJECTS0=,accel.obj,statusbr.obj,filedlgg.obj,paletteg.obj,vlbox.obj,\ + vscroll.obj,combog.obj,icon.obj,collpaneg.obj +.else +OBJECTS0=,accel.obj,statusbr.obj,filedlgg.obj,paletteg.obj,vlbox.obj,\ + vscroll.obj,combog.obj,icon.obj +.endif +.endif +.endif + +all : $(SOURCES) + $(MMS)$(MMSQUALIFIERS) $(OBJECTS)$(OBJECTS0) +.ifdef __WXMOTIF__ + library/crea [--.lib]libwx_motif.olb $(OBJECTS)$(OBJECTS0) +.else +.ifdef __WXGTK__ + library/crea [--.lib]libwx_gtk.olb $(OBJECTS)$(OBJECTS0) +.else +.ifdef __WXGTK2__ + library/crea [--.lib]libwx_gtk2.olb $(OBJECTS)$(OBJECTS0) +.else +.ifdef __WXX11__ + library/crea [--.lib]libwx_x11_univ.olb $(OBJECTS)$(OBJECTS0) +.endif +.endif +.endif +.endif + +aboutdlgg.obj : aboutdlgg.cpp +accel.obj : accel.cpp +animateg.obj : animateg.cpp +busyinfo.obj : busyinfo.cpp +calctrl.obj : calctrl.cpp +caret.obj : caret.cpp +choicdgg.obj : choicdgg.cpp +clrpickerg.obj : clrpickerg.cpp +collpaneg.obj : collpaneg.cpp +colrdlgg.obj : colrdlgg.cpp +datectlg.obj : datectlg.cpp +dcpsg.obj : dcpsg.cpp +dirctrlg.obj : dirctrlg.cpp +dirdlgg.obj : dirdlgg.cpp +filedlgg.obj : filedlgg.cpp +fontdlgg.obj : fontdlgg.cpp +fdrepdlg.obj : fdrepdlg.cpp +grid.obj : grid.cpp +gridctrl.obj : gridctrl.cpp +gridsel.obj : gridsel.cpp +helpext.obj : helpext.cpp +htmllbox.obj : htmllbox.cpp +icon.obj : icon.cpp +imaglist.obj : imaglist.cpp +laywin.obj : laywin.cpp +listctrl.obj : listctrl.cpp +logg.obj : logg.cpp +msgdlgg.obj : msgdlgg.cpp +notebook.obj : notebook.cpp +numdlgg.obj : numdlgg.cpp +odcombo.obj : odcombo.cpp +paletteg.obj : paletteg.cpp +panelg.obj : panelg.cpp +printps.obj : printps.cpp +prntdlgg.obj : prntdlgg.cpp +progdlgg.obj : progdlgg.cpp +propdlg.obj : propdlg.cpp +scrlwing.obj : scrlwing.cpp +spinctlg.obj : spinctlg.cpp +renderg.obj : renderg.cpp +sashwin.obj : sashwin.cpp +selstore.obj : selstore.cpp +splitter.obj : splitter.cpp +statline.obj : statline.cpp +statusbr.obj : statusbr.cpp +tabg.obj : tabg.cpp +textdlgg.obj : textdlgg.cpp +tipdlg.obj : tipdlg.cpp +tipwin.obj : tipwin.cpp +treectlg.obj : treectlg.cpp +wizard.obj : wizard.cpp +dragimgg.obj : dragimgg.cpp +fdrepdlg.obj : fdrepdlg.cpp +htmllbox.obj : htmllbox.cpp +listbkg.obj : listbkg.cpp +mdig.obj : mdig.cpp +scrlwing.obj : scrlwing.cpp +spinctlg.obj : spinctlg.cpp +splash.obj : splash.cpp +timer.obj : timer.cpp +vlbox.obj : vlbox.cpp +vscroll.obj : vscroll.cpp + cxx $(CXXFLAGS)$(CXX_DEFINE)/nowarn vscroll.cpp +listbkg.obj : listbkg.cpp +choicbkg.obj : choicbkg.cpp +toolbkg.obj : toolbkg.cpp +treebkg.obj : treebkg.cpp +combog.obj : combog.cpp +fontpickerg.obj : fontpickerg.cpp +hyperlink.obj : hyperlink.cpp +filepickerg.obj : filepickerg.cpp +bmpcboxg.obj : bmpcboxg.cpp diff --git a/Externals/wxWidgets/src/generic/dirctrlg.cpp b/Externals/wxWidgets/src/generic/dirctrlg.cpp new file mode 100644 index 0000000000..e2e3af3ee2 --- /dev/null +++ b/Externals/wxWidgets/src/generic/dirctrlg.cpp @@ -0,0 +1,1707 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/generic/dirctrlg.cpp +// Purpose: wxGenericDirCtrl +// Author: Harm van der Heijden, Robert Roebling, Julian Smart +// Modified by: +// Created: 12/12/98 +// RCS-ID: $Id: dirctrlg.cpp 46614 2007-06-22 12:12:10Z JS $ +// Copyright: (c) Harm van der Heijden, Robert Roebling and Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_DIRDLG || wxUSE_FILEDLG + +#include "wx/generic/dirctrlg.h" + +#ifndef WX_PRECOMP + #include "wx/hash.h" + #include "wx/intl.h" + #include "wx/log.h" + #include "wx/utils.h" + #include "wx/button.h" + #include "wx/icon.h" + #include "wx/settings.h" + #include "wx/msgdlg.h" + #include "wx/cmndata.h" + #include "wx/choice.h" + #include "wx/textctrl.h" + #include "wx/layout.h" + #include "wx/sizer.h" + #include "wx/textdlg.h" + #include "wx/gdicmn.h" + #include "wx/image.h" + #include "wx/module.h" +#endif + +#include "wx/filefn.h" +#include "wx/imaglist.h" +#include "wx/tokenzr.h" +#include "wx/dir.h" +#include "wx/artprov.h" +#include "wx/mimetype.h" + +#if wxUSE_STATLINE + #include "wx/statline.h" +#endif + +#if defined(__WXMAC__) + #include "wx/mac/private.h" // includes mac headers +#endif + +#ifdef __WXMSW__ +#include +#include "wx/msw/winundef.h" + +// FIXME - Mingw32 1.0 has both _getdrive() and _chdrive(). For now, let's assume +// older releases don't, but it should be verified and the checks modified +// accordingly. +#if !defined(__GNUWIN32__) || (defined(__MINGW32_MAJOR_VERSION) && __MINGW32_MAJOR_VERSION >= 1) +#if !defined(__WXWINCE__) + #include +#endif + #include + #include +#endif + +#endif + +#if defined(__OS2__) || defined(__DOS__) + #ifdef __OS2__ + #define INCL_BASE + #include + #ifndef __EMX__ + #include + #endif + #include + #include + #endif + extern bool wxIsDriveAvailable(const wxString& dirName); +#endif // __OS2__ + +#if defined(__WXMAC__) + #include "MoreFilesX.h" +#endif + +#ifdef __BORLANDC__ + #include "dos.h" +#endif + +// If compiled under Windows, this macro can cause problems +#ifdef GetFirstChild +#undef GetFirstChild +#endif + +// ---------------------------------------------------------------------------- +// wxGetAvailableDrives, for WINDOWS, DOS, OS2, MAC, UNIX (returns "/") +// ---------------------------------------------------------------------------- + +size_t wxGetAvailableDrives(wxArrayString &paths, wxArrayString &names, wxArrayInt &icon_ids) +{ +#if defined(__WINDOWS__) || defined(__DOS__) || defined(__OS2__) + +#ifdef __WXWINCE__ + // No logical drives; return "\" + paths.Add(wxT("\\")); + names.Add(wxT("\\")); + icon_ids.Add(wxFileIconsTable::computer); +#elif defined(__WIN32__) + wxChar driveBuffer[256]; + size_t n = (size_t) GetLogicalDriveStrings(255, driveBuffer); + size_t i = 0; + while (i < n) + { + wxString path, name; + path.Printf(wxT("%c:\\"), driveBuffer[i]); + name.Printf(wxT("%c:"), driveBuffer[i]); + + // Do not use GetVolumeInformation to further decorate the + // name, since it can cause severe delays on network drives. + + int imageId; + int driveType = ::GetDriveType(path); + switch (driveType) + { + case DRIVE_REMOVABLE: + if (path == wxT("a:\\") || path == wxT("b:\\")) + imageId = wxFileIconsTable::floppy; + else + imageId = wxFileIconsTable::removeable; + break; + case DRIVE_CDROM: + imageId = wxFileIconsTable::cdrom; + break; + case DRIVE_REMOTE: + case DRIVE_FIXED: + default: + imageId = wxFileIconsTable::drive; + break; + } + + paths.Add(path); + names.Add(name); + icon_ids.Add(imageId); + + while (driveBuffer[i] != wxT('\0')) + i ++; + i ++; + if (driveBuffer[i] == wxT('\0')) + break; + } +#elif defined(__OS2__) + APIRET rc; + ULONG ulDriveNum = 0; + ULONG ulDriveMap = 0; + rc = ::DosQueryCurrentDisk(&ulDriveNum, &ulDriveMap); + if ( rc == 0) + { + size_t i = 0; + while (i < 26) + { + if (ulDriveMap & ( 1 << i )) + { + wxString path, name; + path.Printf(wxT("%c:\\"), 'A' + i); + name.Printf(wxT("%c:"), 'A' + i); + + // Note: If _filesys is unsupported by some compilers, + // we can always replace it by DosQueryFSAttach + char filesysname[20]; +#ifdef __WATCOMC__ + ULONG cbBuffer = sizeof(filesysname); + PFSQBUFFER2 pfsqBuffer = (PFSQBUFFER2)filesysname; + APIRET rc = ::DosQueryFSAttach(name.fn_str(),0,FSAIL_QUERYNAME,pfsqBuffer,&cbBuffer); + if (rc != NO_ERROR) + { + filesysname[0] = '\0'; + } +#else + _filesys(name.fn_str(), filesysname, sizeof(filesysname)); +#endif + /* FAT, LAN, HPFS, CDFS, NFS */ + int imageId; + if (path == wxT("A:\\") || path == wxT("B:\\")) + imageId = wxFileIconsTable::floppy; + else if (!strcmp(filesysname, "CDFS")) + imageId = wxFileIconsTable::cdrom; + else if (!strcmp(filesysname, "LAN") || + !strcmp(filesysname, "NFS")) + imageId = wxFileIconsTable::drive; + else + imageId = wxFileIconsTable::drive; + paths.Add(path); + names.Add(name); + icon_ids.Add(imageId); + } + i ++; + } + } +#else // !__WIN32__, !__OS2__ + int drive; + + /* If we can switch to the drive, it exists. */ + for( drive = 1; drive <= 26; drive++ ) + { + wxString path, name; + path.Printf(wxT("%c:\\"), (char) (drive + 'a' - 1)); + name.Printf(wxT("%c:"), (char) (drive + 'A' - 1)); + + if (wxIsDriveAvailable(path)) + { + paths.Add(path); + names.Add(name); + icon_ids.Add((drive <= 2) ? wxFileIconsTable::floppy : wxFileIconsTable::drive); + } + } +#endif // __WIN32__/!__WIN32__ + +#elif defined(__WXMAC__) + + ItemCount volumeIndex = 1; + OSErr err = noErr ; + + while( noErr == err ) + { + HFSUniStr255 volumeName ; + FSRef fsRef ; + FSVolumeInfo volumeInfo ; + err = FSGetVolumeInfo(0, volumeIndex, NULL, kFSVolInfoFlags , &volumeInfo , &volumeName, &fsRef); + if( noErr == err ) + { + wxString path = wxMacFSRefToPath( &fsRef ) ; + wxString name = wxMacHFSUniStrToString( &volumeName ) ; + + if ( (volumeInfo.flags & kFSVolFlagSoftwareLockedMask) || (volumeInfo.flags & kFSVolFlagHardwareLockedMask) ) + { + icon_ids.Add(wxFileIconsTable::cdrom); + } + else + { + icon_ids.Add(wxFileIconsTable::drive); + } + // todo other removable + + paths.Add(path); + names.Add(name); + volumeIndex++ ; + } + } + +#elif defined(__UNIX__) + paths.Add(wxT("/")); + names.Add(wxT("/")); + icon_ids.Add(wxFileIconsTable::computer); +#else + #error "Unsupported platform in wxGenericDirCtrl!" +#endif + wxASSERT_MSG( (paths.GetCount() == names.GetCount()), wxT("The number of paths and their human readable names should be equal in number.")); + wxASSERT_MSG( (paths.GetCount() == icon_ids.GetCount()), wxT("Wrong number of icons for available drives.")); + return paths.GetCount(); +} + +// ---------------------------------------------------------------------------- +// wxIsDriveAvailable +// ---------------------------------------------------------------------------- + +#if defined(__DOS__) + +bool wxIsDriveAvailable(const wxString& dirName) +{ + // FIXME_MGL - this method leads to hang up under Watcom for some reason +#ifdef __WATCOMC__ + wxUnusedVar(dirName); +#else + if ( dirName.length() == 3 && dirName[1u] == wxT(':') ) + { + wxString dirNameLower(dirName.Lower()); + // VS: always return true for removable media, since Win95 doesn't + // like it when MS-DOS app accesses empty floppy drive + return (dirNameLower[0u] == wxT('a') || + dirNameLower[0u] == wxT('b') || + wxDirExists(dirNameLower)); + } + else +#endif + return true; +} + +#elif defined(__WINDOWS__) || defined(__OS2__) + +int setdrive(int WXUNUSED_IN_WINCE(drive)) +{ +#ifdef __WXWINCE__ + return 0; +#elif defined(__GNUWIN32__) && \ + (defined(__MINGW32_MAJOR_VERSION) && __MINGW32_MAJOR_VERSION >= 1) + return _chdrive(drive); +#else + wxChar newdrive[4]; + + if (drive < 1 || drive > 31) + return -1; + newdrive[0] = (wxChar)(wxT('A') + drive - 1); + newdrive[1] = wxT(':'); +#ifdef __OS2__ + newdrive[2] = wxT('\\'); + newdrive[3] = wxT('\0'); +#else + newdrive[2] = wxT('\0'); +#endif +#if defined(__WXMSW__) + if (::SetCurrentDirectory(newdrive)) +#else + // VA doesn't know what LPSTR is and has its own set + if (!DosSetCurrentDir((PSZ)newdrive)) +#endif + return 0; + else + return -1; +#endif // !GNUWIN32 +} + +bool wxIsDriveAvailable(const wxString& WXUNUSED_IN_WINCE(dirName)) +{ +#ifdef __WXWINCE__ + return false; +#else +#ifdef __WIN32__ + UINT errorMode = SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX); +#endif + bool success = true; + + // Check if this is a root directory and if so, + // whether the drive is available. + if (dirName.length() == 3 && dirName[(size_t)1] == wxT(':')) + { + wxString dirNameLower(dirName.Lower()); +#if defined(__GNUWIN32__) && !(defined(__MINGW32_MAJOR_VERSION) && __MINGW32_MAJOR_VERSION >= 1) + success = wxDirExists(dirNameLower); +#else + #if defined(__OS2__) + // Avoid changing to drive since no media may be inserted. + if (dirNameLower[(size_t)0] == 'a' || dirNameLower[(size_t)0] == 'b') + return success; + #endif + int currentDrive = _getdrive(); + int thisDrive = (int) (dirNameLower[(size_t)0] - 'a' + 1) ; + int err = setdrive( thisDrive ) ; + setdrive( currentDrive ); + + if (err == -1) + { + success = false; + } +#endif + } +#ifdef __WIN32__ + (void) SetErrorMode(errorMode); +#endif + + return success; +#endif +} +#endif // __WINDOWS__ || __OS2__ + +#endif // wxUSE_DIRDLG || wxUSE_FILEDLG + + + +#if wxUSE_DIRDLG + +// Function which is called by quick sort. We want to override the default wxArrayString behaviour, +// and sort regardless of case. +static int wxCMPFUNC_CONV wxDirCtrlStringCompareFunction(const wxString& strFirst, const wxString& strSecond) +{ + return strFirst.CmpNoCase(strSecond); +} + +//----------------------------------------------------------------------------- +// wxDirItemData +//----------------------------------------------------------------------------- + +wxDirItemData::wxDirItemData(const wxString& path, const wxString& name, + bool isDir) +{ + m_path = path; + m_name = name; + /* Insert logic to detect hidden files here + * In UnixLand we just check whether the first char is a dot + * For FileNameFromPath read LastDirNameInThisPath ;-) */ + // m_isHidden = (bool)(wxFileNameFromPath(*m_path)[0] == '.'); + m_isHidden = false; + m_isExpanded = false; + m_isDir = isDir; +} + +void wxDirItemData::SetNewDirName(const wxString& path) +{ + m_path = path; + m_name = wxFileNameFromPath(path); +} + +bool wxDirItemData::HasSubDirs() const +{ + if (m_path.empty()) + return false; + + wxDir dir; + { + wxLogNull nolog; + if ( !dir.Open(m_path) ) + return false; + } + + return dir.HasSubDirs(); +} + +bool wxDirItemData::HasFiles(const wxString& WXUNUSED(spec)) const +{ + if (m_path.empty()) + return false; + + wxDir dir; + { + wxLogNull nolog; + if ( !dir.Open(m_path) ) + return false; + } + + return dir.HasFiles(); +} + +//----------------------------------------------------------------------------- +// wxGenericDirCtrl +//----------------------------------------------------------------------------- + + +#if wxUSE_EXTENDED_RTTI +WX_DEFINE_FLAGS( wxGenericDirCtrlStyle ) + +wxBEGIN_FLAGS( wxGenericDirCtrlStyle ) + // new style border flags, we put them first to + // use them for streaming out + wxFLAGS_MEMBER(wxBORDER_SIMPLE) + wxFLAGS_MEMBER(wxBORDER_SUNKEN) + wxFLAGS_MEMBER(wxBORDER_DOUBLE) + wxFLAGS_MEMBER(wxBORDER_RAISED) + wxFLAGS_MEMBER(wxBORDER_STATIC) + wxFLAGS_MEMBER(wxBORDER_NONE) + + // old style border flags + wxFLAGS_MEMBER(wxSIMPLE_BORDER) + wxFLAGS_MEMBER(wxSUNKEN_BORDER) + wxFLAGS_MEMBER(wxDOUBLE_BORDER) + wxFLAGS_MEMBER(wxRAISED_BORDER) + wxFLAGS_MEMBER(wxSTATIC_BORDER) + wxFLAGS_MEMBER(wxBORDER) + + // standard window styles + wxFLAGS_MEMBER(wxTAB_TRAVERSAL) + wxFLAGS_MEMBER(wxCLIP_CHILDREN) + wxFLAGS_MEMBER(wxTRANSPARENT_WINDOW) + wxFLAGS_MEMBER(wxWANTS_CHARS) + wxFLAGS_MEMBER(wxFULL_REPAINT_ON_RESIZE) + wxFLAGS_MEMBER(wxALWAYS_SHOW_SB ) + wxFLAGS_MEMBER(wxVSCROLL) + wxFLAGS_MEMBER(wxHSCROLL) + + wxFLAGS_MEMBER(wxDIRCTRL_DIR_ONLY) + wxFLAGS_MEMBER(wxDIRCTRL_3D_INTERNAL) + wxFLAGS_MEMBER(wxDIRCTRL_SELECT_FIRST) + wxFLAGS_MEMBER(wxDIRCTRL_SHOW_FILTERS) + +wxEND_FLAGS( wxGenericDirCtrlStyle ) + +IMPLEMENT_DYNAMIC_CLASS_XTI(wxGenericDirCtrl, wxControl,"wx/dirctrl.h") + +wxBEGIN_PROPERTIES_TABLE(wxGenericDirCtrl) + wxHIDE_PROPERTY( Children ) + wxPROPERTY( DefaultPath , wxString , SetDefaultPath , GetDefaultPath , EMPTY_MACROVALUE , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) + wxPROPERTY( Filter , wxString , SetFilter , GetFilter , EMPTY_MACROVALUE , 0 /*flags*/ , wxT("Helpstring") , wxT("group") ) + wxPROPERTY( DefaultFilter , int , SetFilterIndex, GetFilterIndex, EMPTY_MACROVALUE , 0 /*flags*/ , wxT("Helpstring") , wxT("group") ) + wxPROPERTY_FLAGS( WindowStyle, wxGenericDirCtrlStyle, long, SetWindowStyleFlag, GetWindowStyleFlag, EMPTY_MACROVALUE , 0, wxT("Helpstring"), wxT("group") ) +wxEND_PROPERTIES_TABLE() + +wxBEGIN_HANDLERS_TABLE(wxGenericDirCtrl) +wxEND_HANDLERS_TABLE() + +wxCONSTRUCTOR_8( wxGenericDirCtrl , wxWindow* , Parent , wxWindowID , Id , wxString , DefaultPath , + wxPoint , Position , wxSize , Size , long , WindowStyle , wxString , Filter , int , DefaultFilter ) +#else +IMPLEMENT_DYNAMIC_CLASS(wxGenericDirCtrl, wxControl) +#endif + +BEGIN_EVENT_TABLE(wxGenericDirCtrl, wxControl) + EVT_TREE_ITEM_EXPANDING (wxID_TREECTRL, wxGenericDirCtrl::OnExpandItem) + EVT_TREE_ITEM_COLLAPSED (wxID_TREECTRL, wxGenericDirCtrl::OnCollapseItem) + EVT_TREE_BEGIN_LABEL_EDIT (wxID_TREECTRL, wxGenericDirCtrl::OnBeginEditItem) + EVT_TREE_END_LABEL_EDIT (wxID_TREECTRL, wxGenericDirCtrl::OnEndEditItem) + EVT_SIZE (wxGenericDirCtrl::OnSize) +END_EVENT_TABLE() + +wxGenericDirCtrl::wxGenericDirCtrl(void) +{ + Init(); +} + +void wxGenericDirCtrl::ExpandRoot() +{ + ExpandDir(m_rootId); // automatically expand first level + + // Expand and select the default path + if (!m_defaultPath.empty()) + { + ExpandPath(m_defaultPath); + } +#ifdef __UNIX__ + else + { + // On Unix, there's only one node under the (hidden) root node. It + // represents the / path, so the user would always have to expand it; + // let's do it ourselves + ExpandPath( wxT("/") ); + } +#endif +} + +bool wxGenericDirCtrl::Create(wxWindow *parent, + const wxWindowID id, + const wxString& dir, + const wxPoint& pos, + const wxSize& size, + long style, + const wxString& filter, + int defaultFilter, + const wxString& name) +{ + if (!wxControl::Create(parent, id, pos, size, style, wxDefaultValidator, name)) + return false; + + SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE)); + SetForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT)); + + Init(); + + long treeStyle = wxTR_HAS_BUTTONS; + + // On Windows CE, if you hide the root, you get a crash when + // attempting to access data for children of the root item. +#ifndef __WXWINCE__ + treeStyle |= wxTR_HIDE_ROOT; +#endif + +#ifdef __WXGTK20__ + treeStyle |= wxTR_NO_LINES; +#endif + + if (style & wxDIRCTRL_EDIT_LABELS) + treeStyle |= wxTR_EDIT_LABELS; + + if ((style & wxDIRCTRL_3D_INTERNAL) == 0) + treeStyle |= wxNO_BORDER; + else + treeStyle |= wxBORDER_SUNKEN; + + long filterStyle = 0; + if ((style & wxDIRCTRL_3D_INTERNAL) == 0) + filterStyle |= wxNO_BORDER; + else + filterStyle |= wxBORDER_SUNKEN; + + m_treeCtrl = CreateTreeCtrl(this, wxID_TREECTRL, + wxPoint(0,0), GetClientSize(), treeStyle); + + if (!filter.empty() && (style & wxDIRCTRL_SHOW_FILTERS)) + m_filterListCtrl = new wxDirFilterListCtrl(this, wxID_FILTERLISTCTRL, wxDefaultPosition, wxDefaultSize, filterStyle); + + m_defaultPath = dir; + m_filter = filter; + + if (m_filter.empty()) +#ifdef __UNIX__ + m_filter = wxT("*"); +#else + m_filter = wxT("*.*"); +#endif + + SetFilterIndex(defaultFilter); + + if (m_filterListCtrl) + m_filterListCtrl->FillFilterList(filter, defaultFilter); + + m_treeCtrl->SetImageList(wxTheFileIconsTable->GetSmallImageList()); + + m_showHidden = false; + wxDirItemData* rootData = new wxDirItemData(wxEmptyString, wxEmptyString, true); + + wxString rootName; + +#if defined(__WINDOWS__) || defined(__OS2__) || defined(__DOS__) + rootName = _("Computer"); +#else + rootName = _("Sections"); +#endif + + m_rootId = m_treeCtrl->AddRoot( rootName, 3, -1, rootData); + m_treeCtrl->SetItemHasChildren(m_rootId); + + ExpandRoot(); + + SetInitialSize(size); + DoResize(); + + return true; +} + +wxGenericDirCtrl::~wxGenericDirCtrl() +{ +} + +void wxGenericDirCtrl::Init() +{ + m_showHidden = false; + m_currentFilter = 0; + m_currentFilterStr = wxEmptyString; // Default: any file + m_treeCtrl = NULL; + m_filterListCtrl = NULL; +} + +wxTreeCtrl* wxGenericDirCtrl::CreateTreeCtrl(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long treeStyle) +{ + return new wxTreeCtrl(parent, id, pos, size, treeStyle); +} + +void wxGenericDirCtrl::ShowHidden( bool show ) +{ + m_showHidden = show; + + wxString path = GetPath(); + ReCreateTree(); + SetPath(path); +} + +const wxTreeItemId +wxGenericDirCtrl::AddSection(const wxString& path, const wxString& name, int imageId) +{ + wxDirItemData *dir_item = new wxDirItemData(path,name,true); + + wxTreeItemId id = AppendItem( m_rootId, name, imageId, -1, dir_item); + + m_treeCtrl->SetItemHasChildren(id); + + return id; +} + +void wxGenericDirCtrl::SetupSections() +{ + wxArrayString paths, names; + wxArrayInt icons; + + size_t n, count = wxGetAvailableDrives(paths, names, icons); + +#ifdef __WXGTK20__ + wxString home = wxGetHomeDir(); + AddSection( home, _("Home directory"), 1); + home += wxT("/Desktop"); + AddSection( home, _("Desktop"), 1); +#endif + + for (n = 0; n < count; n++) + AddSection(paths[n], names[n], icons[n]); +} + +void wxGenericDirCtrl::OnBeginEditItem(wxTreeEvent &event) +{ + // don't rename the main entry "Sections" + if (event.GetItem() == m_rootId) + { + event.Veto(); + return; + } + + // don't rename the individual sections + if (m_treeCtrl->GetItemParent( event.GetItem() ) == m_rootId) + { + event.Veto(); + return; + } +} + +void wxGenericDirCtrl::OnEndEditItem(wxTreeEvent &event) +{ + if (event.IsEditCancelled()) + return; + + if ((event.GetLabel().empty()) || + (event.GetLabel() == wxT(".")) || + (event.GetLabel() == wxT("..")) || + (event.GetLabel().Find(wxT('/')) != wxNOT_FOUND) || + (event.GetLabel().Find(wxT('\\')) != wxNOT_FOUND) || + (event.GetLabel().Find(wxT('|')) != wxNOT_FOUND)) + { + wxMessageDialog dialog(this, _("Illegal directory name."), _("Error"), wxOK | wxICON_ERROR ); + dialog.ShowModal(); + event.Veto(); + return; + } + + wxTreeItemId id = event.GetItem(); + wxDirItemData *data = (wxDirItemData*)m_treeCtrl->GetItemData( id ); + wxASSERT( data ); + + wxString new_name( wxPathOnly( data->m_path ) ); + new_name += wxString(wxFILE_SEP_PATH); + new_name += event.GetLabel(); + + wxLogNull log; + + if (wxFileExists(new_name)) + { + wxMessageDialog dialog(this, _("File name exists already."), _("Error"), wxOK | wxICON_ERROR ); + dialog.ShowModal(); + event.Veto(); + } + + if (wxRenameFile(data->m_path,new_name)) + { + data->SetNewDirName( new_name ); + } + else + { + wxMessageDialog dialog(this, _("Operation not permitted."), _("Error"), wxOK | wxICON_ERROR ); + dialog.ShowModal(); + event.Veto(); + } +} + +void wxGenericDirCtrl::OnExpandItem(wxTreeEvent &event) +{ + wxTreeItemId parentId = event.GetItem(); + + // VS: this is needed because the event handler is called from wxTreeCtrl + // ctor when wxTR_HIDE_ROOT was specified + + if (!m_rootId.IsOk()) + + m_rootId = m_treeCtrl->GetRootItem(); + + ExpandDir(parentId); +} + +void wxGenericDirCtrl::OnCollapseItem(wxTreeEvent &event ) +{ + CollapseDir(event.GetItem()); +} + +void wxGenericDirCtrl::CollapseDir(wxTreeItemId parentId) +{ + wxTreeItemId child; + + wxDirItemData *data = (wxDirItemData *) m_treeCtrl->GetItemData(parentId); + if (!data->m_isExpanded) + return; + + data->m_isExpanded = false; + wxTreeItemIdValue cookie; + /* Workaround because DeleteChildren has disapeared (why?) and + * CollapseAndReset doesn't work as advertised (deletes parent too) */ + child = m_treeCtrl->GetFirstChild(parentId, cookie); + while (child.IsOk()) + { + m_treeCtrl->Delete(child); + /* Not GetNextChild below, because the cookie mechanism can't + * handle disappearing children! */ + child = m_treeCtrl->GetFirstChild(parentId, cookie); + } + if (parentId != m_treeCtrl->GetRootItem()) + m_treeCtrl->Collapse(parentId); +} + +void wxGenericDirCtrl::ExpandDir(wxTreeItemId parentId) +{ + wxDirItemData *data = (wxDirItemData *) m_treeCtrl->GetItemData(parentId); + + if (data->m_isExpanded) + return; + + data->m_isExpanded = true; + + if (parentId == m_treeCtrl->GetRootItem()) + { + SetupSections(); + return; + } + + wxASSERT(data); + + wxString search,path,filename; + + wxString dirName(data->m_path); + +#if (defined(__WINDOWS__) && !defined(__WXWINCE__)) || defined(__DOS__) || defined(__OS2__) + // Check if this is a root directory and if so, + // whether the drive is avaiable. + if (!wxIsDriveAvailable(dirName)) + { + data->m_isExpanded = false; + //wxMessageBox(wxT("Sorry, this drive is not available.")); + return; + } +#endif + + // This may take a longish time. Go to busy cursor + wxBusyCursor busy; + +#if defined(__WINDOWS__) || defined(__DOS__) || defined(__OS2__) + if (dirName.Last() == ':') + dirName += wxString(wxFILE_SEP_PATH); +#endif + + wxArrayString dirs; + wxArrayString filenames; + + wxDir d; + wxString eachFilename; + + wxLogNull log; + d.Open(dirName); + + if (d.IsOpened()) + { + int style = wxDIR_DIRS; + if (m_showHidden) style |= wxDIR_HIDDEN; + if (d.GetFirst(& eachFilename, wxEmptyString, style)) + { + do + { + if ((eachFilename != wxT(".")) && (eachFilename != wxT(".."))) + { + dirs.Add(eachFilename); + } + } + while (d.GetNext(&eachFilename)); + } + } + dirs.Sort(wxDirCtrlStringCompareFunction); + + // Now do the filenames -- but only if we're allowed to + if ((GetWindowStyle() & wxDIRCTRL_DIR_ONLY) == 0) + { + d.Open(dirName); + + if (d.IsOpened()) + { + int style = wxDIR_FILES; + if (m_showHidden) style |= wxDIR_HIDDEN; + // Process each filter (ex: "JPEG Files (*.jpg;*.jpeg)|*.jpg;*.jpeg") + wxStringTokenizer strTok; + wxString curFilter; + strTok.SetString(m_currentFilterStr,wxT(";")); + while(strTok.HasMoreTokens()) + { + curFilter = strTok.GetNextToken(); + if (d.GetFirst(& eachFilename, curFilter, style)) + { + do + { + if ((eachFilename != wxT(".")) && (eachFilename != wxT(".."))) + { + filenames.Add(eachFilename); + } + } + while (d.GetNext(& eachFilename)); + } + } + } + filenames.Sort(wxDirCtrlStringCompareFunction); + } + + // Add the sorted dirs + size_t i; + for (i = 0; i < dirs.Count(); i++) + { + eachFilename = dirs[i]; + path = dirName; + if (!wxEndsWithPathSeparator(path)) + path += wxString(wxFILE_SEP_PATH); + path += eachFilename; + + wxDirItemData *dir_item = new wxDirItemData(path,eachFilename,true); + wxTreeItemId id = AppendItem( parentId, eachFilename, + wxFileIconsTable::folder, -1, dir_item); + m_treeCtrl->SetItemImage( id, wxFileIconsTable::folder_open, + wxTreeItemIcon_Expanded ); + + // Has this got any children? If so, make it expandable. + // (There are two situations when a dir has children: either it + // has subdirectories or it contains files that weren't filtered + // out. The latter only applies to dirctrl with files.) + if ( dir_item->HasSubDirs() || + (((GetWindowStyle() & wxDIRCTRL_DIR_ONLY) == 0) && + dir_item->HasFiles(m_currentFilterStr)) ) + { + m_treeCtrl->SetItemHasChildren(id); + } + } + + // Add the sorted filenames + if ((GetWindowStyle() & wxDIRCTRL_DIR_ONLY) == 0) + { + for (i = 0; i < filenames.Count(); i++) + { + eachFilename = filenames[i]; + path = dirName; + if (!wxEndsWithPathSeparator(path)) + path += wxString(wxFILE_SEP_PATH); + path += eachFilename; + //path = dirName + wxString(wxT("/")) + eachFilename; + wxDirItemData *dir_item = new wxDirItemData(path,eachFilename,false); + int image_id = wxFileIconsTable::file; + if (eachFilename.Find(wxT('.')) != wxNOT_FOUND) + image_id = wxTheFileIconsTable->GetIconID(eachFilename.AfterLast(wxT('.'))); + (void) AppendItem( parentId, eachFilename, image_id, -1, dir_item); + } + } +} + +void wxGenericDirCtrl::ReCreateTree() +{ + CollapseDir(m_treeCtrl->GetRootItem()); + ExpandRoot(); +} + +void wxGenericDirCtrl::CollapseTree() +{ + wxTreeItemIdValue cookie; + wxTreeItemId child = m_treeCtrl->GetFirstChild(m_rootId, cookie); + while (child.IsOk()) + { + CollapseDir(child); + child = m_treeCtrl->GetNextChild(m_rootId, cookie); + } +} + +// Find the child that matches the first part of 'path'. +// E.g. if a child path is "/usr" and 'path' is "/usr/include" +// then the child for /usr is returned. +wxTreeItemId wxGenericDirCtrl::FindChild(wxTreeItemId parentId, const wxString& path, bool& done) +{ + wxString path2(path); + + // Make sure all separators are as per the current platform + path2.Replace(wxT("\\"), wxString(wxFILE_SEP_PATH)); + path2.Replace(wxT("/"), wxString(wxFILE_SEP_PATH)); + + // Append a separator to foil bogus substring matching + path2 += wxString(wxFILE_SEP_PATH); + + // In MSW or PM, case is not significant +#if defined(__WINDOWS__) || defined(__DOS__) || defined(__OS2__) + path2.MakeLower(); +#endif + + wxTreeItemIdValue cookie; + wxTreeItemId childId = m_treeCtrl->GetFirstChild(parentId, cookie); + while (childId.IsOk()) + { + wxDirItemData* data = (wxDirItemData*) m_treeCtrl->GetItemData(childId); + + if (data && !data->m_path.empty()) + { + wxString childPath(data->m_path); + if (!wxEndsWithPathSeparator(childPath)) + childPath += wxString(wxFILE_SEP_PATH); + + // In MSW and PM, case is not significant +#if defined(__WINDOWS__) || defined(__DOS__) || defined(__OS2__) + childPath.MakeLower(); +#endif + + if (childPath.length() <= path2.length()) + { + wxString path3 = path2.Mid(0, childPath.length()); + if (childPath == path3) + { + if (path3.length() == path2.length()) + done = true; + else + done = false; + return childId; + } + } + } + + childId = m_treeCtrl->GetNextChild(parentId, cookie); + } + wxTreeItemId invalid; + return invalid; +} + +// Try to expand as much of the given path as possible, +// and select the given tree item. +bool wxGenericDirCtrl::ExpandPath(const wxString& path) +{ + bool done = false; + wxTreeItemId id = FindChild(m_rootId, path, done); + wxTreeItemId lastId = id; // The last non-zero id + while (id.IsOk() && !done) + { + ExpandDir(id); + + id = FindChild(id, path, done); + if (id.IsOk()) + lastId = id; + } + if (!lastId.IsOk()) + return false; + + wxDirItemData *data = (wxDirItemData *) m_treeCtrl->GetItemData(lastId); + if (data->m_isDir) + { + m_treeCtrl->Expand(lastId); + } + if ((GetWindowStyle() & wxDIRCTRL_SELECT_FIRST) && data->m_isDir) + { + // Find the first file in this directory + wxTreeItemIdValue cookie; + wxTreeItemId childId = m_treeCtrl->GetFirstChild(lastId, cookie); + bool selectedChild = false; + while (childId.IsOk()) + { + data = (wxDirItemData*) m_treeCtrl->GetItemData(childId); + + if (data && data->m_path != wxEmptyString && !data->m_isDir) + { + m_treeCtrl->SelectItem(childId); + m_treeCtrl->EnsureVisible(childId); + selectedChild = true; + break; + } + childId = m_treeCtrl->GetNextChild(lastId, cookie); + } + if (!selectedChild) + { + m_treeCtrl->SelectItem(lastId); + m_treeCtrl->EnsureVisible(lastId); + } + } + else + { + m_treeCtrl->SelectItem(lastId); + m_treeCtrl->EnsureVisible(lastId); + } + + return true; +} + + +bool wxGenericDirCtrl::CollapsePath(const wxString& path) +{ + bool done = false; + wxTreeItemId id = FindChild(m_rootId, path, done); + wxTreeItemId lastId = id; // The last non-zero id + + while ( id.IsOk() && !done ) + { + CollapseDir(id); + + id = FindChild(id, path, done); + + if ( id.IsOk() ) + lastId = id; + } + + if ( !lastId.IsOk() ) + return false; + + m_treeCtrl->SelectItem(lastId); + m_treeCtrl->EnsureVisible(lastId); + + return true; +} + + +wxString wxGenericDirCtrl::GetPath() const +{ + wxTreeItemId id = m_treeCtrl->GetSelection(); + if (id) + { + wxDirItemData* data = (wxDirItemData*) m_treeCtrl->GetItemData(id); + return data->m_path; + } + else + return wxEmptyString; +} + +wxString wxGenericDirCtrl::GetFilePath() const +{ + wxTreeItemId id = m_treeCtrl->GetSelection(); + if (id) + { + wxDirItemData* data = (wxDirItemData*) m_treeCtrl->GetItemData(id); + if (data->m_isDir) + return wxEmptyString; + else + return data->m_path; + } + else + return wxEmptyString; +} + +void wxGenericDirCtrl::SetPath(const wxString& path) +{ + m_defaultPath = path; + if (m_rootId) + ExpandPath(path); +} + +// Not used +#if 0 +void wxGenericDirCtrl::FindChildFiles(wxTreeItemId id, int dirFlags, wxArrayString& filenames) +{ + wxDirItemData *data = (wxDirItemData *) m_treeCtrl->GetItemData(id); + + // This may take a longish time. Go to busy cursor + wxBusyCursor busy; + + wxASSERT(data); + + wxString search,path,filename; + + wxString dirName(data->m_path); + +#if defined(__WXMSW__) || defined(__OS2__) + if (dirName.Last() == ':') + dirName += wxString(wxFILE_SEP_PATH); +#endif + + wxDir d; + wxString eachFilename; + + wxLogNull log; + d.Open(dirName); + + if (d.IsOpened()) + { + if (d.GetFirst(& eachFilename, m_currentFilterStr, dirFlags)) + { + do + { + if ((eachFilename != wxT(".")) && (eachFilename != wxT(".."))) + { + filenames.Add(eachFilename); + } + } + while (d.GetNext(& eachFilename)) ; + } + } +} +#endif + +void wxGenericDirCtrl::SetFilterIndex(int n) +{ + m_currentFilter = n; + + wxString f, d; + if (ExtractWildcard(m_filter, n, f, d)) + m_currentFilterStr = f; + else +#ifdef __UNIX__ + m_currentFilterStr = wxT("*"); +#else + m_currentFilterStr = wxT("*.*"); +#endif +} + +void wxGenericDirCtrl::SetFilter(const wxString& filter) +{ + m_filter = filter; + + wxString f, d; + if (ExtractWildcard(m_filter, m_currentFilter, f, d)) + m_currentFilterStr = f; + else +#ifdef __UNIX__ + m_currentFilterStr = wxT("*"); +#else + m_currentFilterStr = wxT("*.*"); +#endif + + // current filter index is meaningless after filter change, set it to zero + SetFilterIndex(0); + if (m_filterListCtrl) + m_filterListCtrl->FillFilterList(m_filter, 0); +} + +// Extract description and actual filter from overall filter string +bool wxGenericDirCtrl::ExtractWildcard(const wxString& filterStr, int n, wxString& filter, wxString& description) +{ + wxArrayString filters, descriptions; + int count = wxParseCommonDialogsFilter(filterStr, descriptions, filters); + if (count > 0 && n < count) + { + filter = filters[n]; + description = descriptions[n]; + return true; + } + + return false; +} + +#if WXWIN_COMPATIBILITY_2_4 +// Parses the global filter, returning the number of filters. +// Returns 0 if none or if there's a problem. +// filterStr is in the form: "All files (*.*)|*.*|JPEG Files (*.jpeg)|*.jpg" +int wxGenericDirCtrl::ParseFilter(const wxString& filterStr, wxArrayString& filters, wxArrayString& descriptions) +{ + return wxParseCommonDialogsFilter(filterStr, descriptions, filters ); +} +#endif // WXWIN_COMPATIBILITY_2_4 + +void wxGenericDirCtrl::DoResize() +{ + wxSize sz = GetClientSize(); + int verticalSpacing = 3; + if (m_treeCtrl) + { + wxSize filterSz ; + if (m_filterListCtrl) + { + filterSz = m_filterListCtrl->GetSize(); + sz.y -= (filterSz.y + verticalSpacing); + } + m_treeCtrl->SetSize(0, 0, sz.x, sz.y); + if (m_filterListCtrl) + { + m_filterListCtrl->SetSize(0, sz.y + verticalSpacing, sz.x, filterSz.y); + // Don't know why, but this needs refreshing after a resize (wxMSW) + m_filterListCtrl->Refresh(); + } + } +} + + +void wxGenericDirCtrl::OnSize(wxSizeEvent& WXUNUSED(event)) +{ + DoResize(); +} + +wxTreeItemId wxGenericDirCtrl::AppendItem (const wxTreeItemId & parent, + const wxString & text, + int image, int selectedImage, + wxTreeItemData * data) +{ + wxTreeCtrl *treeCtrl = GetTreeCtrl (); + + wxASSERT (treeCtrl); + + if (treeCtrl) + { + return treeCtrl->AppendItem (parent, text, image, selectedImage, data); + } + else + { + return wxTreeItemId(); + } +} + + +//----------------------------------------------------------------------------- +// wxDirFilterListCtrl +//----------------------------------------------------------------------------- + +IMPLEMENT_CLASS(wxDirFilterListCtrl, wxChoice) + +BEGIN_EVENT_TABLE(wxDirFilterListCtrl, wxChoice) + EVT_CHOICE(wxID_ANY, wxDirFilterListCtrl::OnSelFilter) +END_EVENT_TABLE() + +bool wxDirFilterListCtrl::Create(wxGenericDirCtrl* parent, const wxWindowID id, + const wxPoint& pos, + const wxSize& size, + long style) +{ + m_dirCtrl = parent; + return wxChoice::Create(parent, id, pos, size, 0, NULL, style); +} + +void wxDirFilterListCtrl::Init() +{ + m_dirCtrl = NULL; +} + +void wxDirFilterListCtrl::OnSelFilter(wxCommandEvent& WXUNUSED(event)) +{ + int sel = GetSelection(); + + wxString currentPath = m_dirCtrl->GetPath(); + + m_dirCtrl->SetFilterIndex(sel); + + // If the filter has changed, the view is out of date, so + // collapse the tree. + m_dirCtrl->ReCreateTree(); + + // Try to restore the selection, or at least the directory + m_dirCtrl->ExpandPath(currentPath); +} + +void wxDirFilterListCtrl::FillFilterList(const wxString& filter, int defaultFilter) +{ + Clear(); + wxArrayString descriptions, filters; + size_t n = (size_t) wxParseCommonDialogsFilter(filter, descriptions, filters); + + if (n > 0 && defaultFilter < (int) n) + { + for (size_t i = 0; i < n; i++) + Append(descriptions[i]); + SetSelection(defaultFilter); + } +} +#endif // wxUSE_DIRDLG + +#if wxUSE_DIRDLG || wxUSE_FILEDLG + +// ---------------------------------------------------------------------------- +// wxFileIconsTable icons +// ---------------------------------------------------------------------------- + +#ifndef __WXGTK24__ +/* Computer (c) Julian Smart */ +static const char * file_icons_tbl_computer_xpm[] = { +/* columns rows colors chars-per-pixel */ +"16 16 42 1", +"r c #4E7FD0", +"$ c #7198D9", +"; c #DCE6F6", +"q c #FFFFFF", +"u c #4A7CCE", +"# c #779DDB", +"w c #95B2E3", +"y c #7FA2DD", +"f c #3263B4", +"= c #EAF0FA", +"< c #B1C7EB", +"% c #6992D7", +"9 c #D9E4F5", +"o c #9BB7E5", +"6 c #F7F9FD", +", c #BED0EE", +"3 c #F0F5FC", +"1 c #A8C0E8", +" c None", +"0 c #FDFEFF", +"4 c #C4D5F0", +"@ c #81A4DD", +"e c #4377CD", +"- c #E2EAF8", +"i c #9FB9E5", +"> c #CCDAF2", +"+ c #89A9DF", +"s c #5584D1", +"t c #5D89D3", +": c #D2DFF4", +"5 c #FAFCFE", +"2 c #F5F8FD", +"8 c #DFE8F7", +"& c #5E8AD4", +"X c #638ED5", +"a c #CEDCF2", +"p c #90AFE2", +"d c #2F5DA9", +"* c #5282D0", +"7 c #E5EDF9", +". c #A2BCE6", +"O c #8CACE0", +/* pixels */ +" ", +" .XXXXXXXXXXX ", +" oXO++@#$%&*X ", +" oX=-;:>,<1%X ", +" oX23=-;:4,$X ", +" oX5633789:@X ", +" oX05623=78+X ", +" oXqq05623=OX ", +" oX,,,,,<<<$X ", +" wXXXXXXXXXXe ", +" XrtX%$$y@+O,, ", +" uyiiiiiiiii@< ", +" ouiiiiiiiiiipAdd(wxArtProvider::GetBitmap(wxART_FOLDER, + wxART_CMN_DIALOG, + wxSize(16, 16))); + // folder_open + m_smallImageList->Add(wxArtProvider::GetBitmap(wxART_FOLDER_OPEN, + wxART_CMN_DIALOG, + wxSize(16, 16))); + // computer +#ifdef __WXGTK24__ + // GTK24 uses this icon in the file open dialog + m_smallImageList->Add(wxArtProvider::GetBitmap(wxART_HARDDISK, + wxART_CMN_DIALOG, + wxSize(16, 16))); +#else + m_smallImageList->Add(wxIcon(file_icons_tbl_computer_xpm)); +#endif + // drive + m_smallImageList->Add(wxArtProvider::GetBitmap(wxART_HARDDISK, + wxART_CMN_DIALOG, + wxSize(16, 16))); + // cdrom + m_smallImageList->Add(wxArtProvider::GetBitmap(wxART_CDROM, + wxART_CMN_DIALOG, + wxSize(16, 16))); + // floppy + m_smallImageList->Add(wxArtProvider::GetBitmap(wxART_FLOPPY, + wxART_CMN_DIALOG, + wxSize(16, 16))); + // removeable + m_smallImageList->Add(wxArtProvider::GetBitmap(wxART_REMOVABLE, + wxART_CMN_DIALOG, + wxSize(16, 16))); + // file + m_smallImageList->Add(wxArtProvider::GetBitmap(wxART_NORMAL_FILE, + wxART_CMN_DIALOG, + wxSize(16, 16))); + // executable + if (GetIconID(wxEmptyString, _T("application/x-executable")) == file) + { + m_smallImageList->Add(wxArtProvider::GetBitmap(wxART_EXECUTABLE_FILE, + wxART_CMN_DIALOG, + wxSize(16, 16))); + delete m_HashTable->Get(_T("exe")); + m_HashTable->Delete(_T("exe")); + m_HashTable->Put(_T("exe"), new wxFileIconEntry(executable)); + } + /* else put into list by GetIconID + (KDE defines application/x-executable for *.exe and has nice icon) + */ +} + +wxImageList *wxFileIconsTable::GetSmallImageList() +{ + if (!m_smallImageList) + Create(); + + return m_smallImageList; +} + +#if wxUSE_MIMETYPE && wxUSE_IMAGE && (!defined(__WXMSW__) || wxUSE_WXDIB) +// VS: we don't need this function w/o wxMimeTypesManager because we'll only have +// one icon and we won't resize it + +static wxBitmap CreateAntialiasedBitmap(const wxImage& img) +{ + const unsigned int size = 16; + + wxImage smallimg (size, size); + unsigned char *p1, *p2, *ps; + unsigned char mr = img.GetMaskRed(), + mg = img.GetMaskGreen(), + mb = img.GetMaskBlue(); + + unsigned x, y; + unsigned sr, sg, sb, smask; + + p1 = img.GetData(), p2 = img.GetData() + 3 * size*2, ps = smallimg.GetData(); + smallimg.SetMaskColour(mr, mr, mr); + + for (y = 0; y < size; y++) + { + for (x = 0; x < size; x++) + { + sr = sg = sb = smask = 0; + if (p1[0] != mr || p1[1] != mg || p1[2] != mb) + sr += p1[0], sg += p1[1], sb += p1[2]; + else smask++; + p1 += 3; + if (p1[0] != mr || p1[1] != mg || p1[2] != mb) + sr += p1[0], sg += p1[1], sb += p1[2]; + else smask++; + p1 += 3; + if (p2[0] != mr || p2[1] != mg || p2[2] != mb) + sr += p2[0], sg += p2[1], sb += p2[2]; + else smask++; + p2 += 3; + if (p2[0] != mr || p2[1] != mg || p2[2] != mb) + sr += p2[0], sg += p2[1], sb += p2[2]; + else smask++; + p2 += 3; + + if (smask > 2) + ps[0] = ps[1] = ps[2] = mr; + else + { + ps[0] = (unsigned char)(sr >> 2); + ps[1] = (unsigned char)(sg >> 2); + ps[2] = (unsigned char)(sb >> 2); + } + ps += 3; + } + p1 += size*2 * 3, p2 += size*2 * 3; + } + + return wxBitmap(smallimg); +} + +// This function is currently not unused anymore +#if 0 +// finds empty borders and return non-empty area of image: +static wxImage CutEmptyBorders(const wxImage& img) +{ + unsigned char mr = img.GetMaskRed(), + mg = img.GetMaskGreen(), + mb = img.GetMaskBlue(); + unsigned char *dt = img.GetData(), *dttmp; + unsigned w = img.GetWidth(), h = img.GetHeight(); + + unsigned top, bottom, left, right, i; + bool empt; + +#define MK_DTTMP(x,y) dttmp = dt + ((x + y * w) * 3) +#define NOEMPTY_PIX(empt) if (dttmp[0] != mr || dttmp[1] != mg || dttmp[2] != mb) {empt = false; break;} + + for (empt = true, top = 0; empt && top < h; top++) + { + MK_DTTMP(0, top); + for (i = 0; i < w; i++, dttmp+=3) + NOEMPTY_PIX(empt) + } + for (empt = true, bottom = h-1; empt && bottom > top; bottom--) + { + MK_DTTMP(0, bottom); + for (i = 0; i < w; i++, dttmp+=3) + NOEMPTY_PIX(empt) + } + for (empt = true, left = 0; empt && left < w; left++) + { + MK_DTTMP(left, 0); + for (i = 0; i < h; i++, dttmp+=3*w) + NOEMPTY_PIX(empt) + } + for (empt = true, right = w-1; empt && right > left; right--) + { + MK_DTTMP(right, 0); + for (i = 0; i < h; i++, dttmp+=3*w) + NOEMPTY_PIX(empt) + } + top--, left--, bottom++, right++; + + return img.GetSubImage(wxRect(left, top, right - left + 1, bottom - top + 1)); +} +#endif // #if 0 + +#endif // wxUSE_MIMETYPE + +int wxFileIconsTable::GetIconID(const wxString& extension, const wxString& mime) +{ + if (!m_smallImageList) + Create(); + +#if wxUSE_MIMETYPE + if (!extension.empty()) + { + wxFileIconEntry *entry = (wxFileIconEntry*) m_HashTable->Get(extension); + if (entry) return (entry -> id); + } + + wxFileType *ft = (mime.empty()) ? + wxTheMimeTypesManager -> GetFileTypeFromExtension(extension) : + wxTheMimeTypesManager -> GetFileTypeFromMimeType(mime); + + wxIconLocation iconLoc; + wxIcon ic; + + { + wxLogNull logNull; + if ( ft && ft->GetIcon(&iconLoc) ) + { + ic = wxIcon( iconLoc ); + } + } + + delete ft; + + if ( !ic.Ok() ) + { + int newid = file; + m_HashTable->Put(extension, new wxFileIconEntry(newid)); + return newid; + } + + wxBitmap bmp; + bmp.CopyFromIcon(ic); + + if ( !bmp.Ok() ) + { + int newid = file; + m_HashTable->Put(extension, new wxFileIconEntry(newid)); + return newid; + } + + const unsigned int size = 16; + + int id = m_smallImageList->GetImageCount(); + if ((bmp.GetWidth() == (int) size) && (bmp.GetHeight() == (int) size)) + { + m_smallImageList->Add(bmp); + } +#if wxUSE_IMAGE && (!defined(__WXMSW__) || wxUSE_WXDIB) + else + { + wxImage img = bmp.ConvertToImage(); + + if ((img.GetWidth() != size*2) || (img.GetHeight() != size*2)) +// m_smallImageList->Add(CreateAntialiasedBitmap(CutEmptyBorders(img).Rescale(size*2, size*2))); + m_smallImageList->Add(CreateAntialiasedBitmap(img.Rescale(size*2, size*2))); + else + m_smallImageList->Add(CreateAntialiasedBitmap(img)); + } +#endif // wxUSE_IMAGE + + m_HashTable->Put(extension, new wxFileIconEntry(id)); + return id; + +#else // !wxUSE_MIMETYPE + + wxUnusedVar(mime); + if (extension == wxT("exe")) + return executable; + else + return file; +#endif // wxUSE_MIMETYPE/!wxUSE_MIMETYPE +} + +#endif // wxUSE_DIRDLG || wxUSE_FILEDLG diff --git a/Externals/wxWidgets/src/generic/dirdlgg.cpp b/Externals/wxWidgets/src/generic/dirdlgg.cpp new file mode 100644 index 0000000000..103f341e4c --- /dev/null +++ b/Externals/wxWidgets/src/generic/dirdlgg.cpp @@ -0,0 +1,369 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/generic/dirdlg.cpp +// Purpose: wxDirDialog +// Author: Harm van der Heijden, Robert Roebling & Julian Smart +// Modified by: +// Created: 12/12/98 +// RCS-ID: $Id: dirdlgg.cpp 41838 2006-10-09 21:08:45Z VZ $ +// Copyright: (c) Harm van der Heijden, Robert Roebling, Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_DIRDLG + +#ifndef WX_PRECOMP + #include "wx/textctrl.h" + #include "wx/button.h" + #include "wx/checkbox.h" + #include "wx/sizer.h" + #include "wx/intl.h" + #include "wx/log.h" + #include "wx/msgdlg.h" + #include "wx/bmpbuttn.h" +#endif + +#include "wx/statline.h" +#include "wx/dirctrl.h" +#include "wx/generic/dirdlgg.h" +#include "wx/artprov.h" + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +static const int ID_DIRCTRL = 1000; +static const int ID_TEXTCTRL = 1001; +static const int ID_NEW = 1004; +static const int ID_SHOW_HIDDEN = 1005; +static const int ID_GO_HOME = 1006; + +//----------------------------------------------------------------------------- +// wxGenericDirDialog +//----------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxGenericDirDialog, wxDialog) + +BEGIN_EVENT_TABLE(wxGenericDirDialog, wxDialog) + EVT_CLOSE (wxGenericDirDialog::OnCloseWindow) + EVT_BUTTON (wxID_OK, wxGenericDirDialog::OnOK) + EVT_BUTTON (ID_NEW, wxGenericDirDialog::OnNew) + EVT_BUTTON (ID_GO_HOME, wxGenericDirDialog::OnGoHome) + EVT_TREE_KEY_DOWN (wxID_ANY, wxGenericDirDialog::OnTreeKeyDown) + EVT_TREE_SEL_CHANGED (wxID_ANY, wxGenericDirDialog::OnTreeSelected) + EVT_TEXT_ENTER (ID_TEXTCTRL, wxGenericDirDialog::OnOK) + EVT_CHECKBOX (ID_SHOW_HIDDEN, wxGenericDirDialog::OnShowHidden) +END_EVENT_TABLE() + +wxGenericDirDialog::wxGenericDirDialog(wxWindow* parent, const wxString& title, + const wxString& defaultPath, long style, + const wxPoint& pos, const wxSize& sz, + const wxString& name) +{ + Create(parent, title, defaultPath, style, pos, sz, name); +} + +bool wxGenericDirDialog::Create(wxWindow* parent, + const wxString& title, + const wxString& defaultPath, long style, + const wxPoint& pos, + const wxSize& sz, + const wxString& name) +{ + wxBusyCursor cursor; + + if (!wxDirDialogBase::Create(parent, title, defaultPath, style, pos, sz, name)) + return false; + + m_path = defaultPath; + if (m_path == wxT("~")) + wxGetHomeDir(&m_path); + if (m_path == wxT(".")) + m_path = wxGetCwd(); + + wxBoxSizer *topsizer = new wxBoxSizer( wxVERTICAL ); + + // smartphones does not support or do not waste space for wxButtons +#if defined(__SMARTPHONE__) + + wxMenu *dirMenu = new wxMenu; + dirMenu->Append(ID_GO_HOME, _("Home")); + + if (!HasFlag(wxDD_DIR_MUST_EXIST)) + { + dirMenu->Append(ID_NEW, _("New directory")); + } + + dirMenu->AppendCheckItem(ID_SHOW_HIDDEN, _("Show hidden directories")); + dirMenu->AppendSeparator(); + dirMenu->Append(wxID_CANCEL, _("Cancel")); + +#else + + // 0) 'New' and 'Home' Buttons + wxSizer* buttonsizer = new wxBoxSizer( wxHORIZONTAL ); + + // VS: 'Home directory' concept is unknown to MS-DOS +#if !defined(__DOS__) + wxBitmapButton* homeButton = + new wxBitmapButton(this, ID_GO_HOME, + wxArtProvider::GetBitmap(wxART_GO_HOME, wxART_BUTTON)); + buttonsizer->Add( homeButton, 0, wxLEFT|wxRIGHT, 10 ); +#endif + + // I'm not convinced we need a New button, and we tend to get annoying + // accidental-editing with label editing enabled. + if (!HasFlag(wxDD_DIR_MUST_EXIST)) + { + wxBitmapButton* newButton = + new wxBitmapButton(this, ID_NEW, + wxArtProvider::GetBitmap(wxART_NEW_DIR, wxART_BUTTON)); + buttonsizer->Add( newButton, 0, wxRIGHT, 10 ); +#if wxUSE_TOOLTIPS + newButton->SetToolTip(_("Create new directory")); +#endif + } + +#if wxUSE_TOOLTIPS + homeButton->SetToolTip(_("Go to home directory")); +#endif + + topsizer->Add( buttonsizer, 0, wxTOP | wxALIGN_RIGHT, 10 ); + +#endif // __SMARTPHONE__/!__SMARTPHONE__ + + // 1) dir ctrl + m_dirCtrl = NULL; // this is necessary, event handler called from + // wxGenericDirCtrl would crash otherwise! + long dirStyle = wxDIRCTRL_DIR_ONLY | wxDEFAULT_CONTROL_BORDER; + +#ifdef __WXMSW__ + if (!HasFlag(wxDD_DIR_MUST_EXIST)) + { + // Only under Windows do we need the wxTR_EDIT_LABEL tree control style + // before we can call EditLabel (required for "New directory") + dirStyle |= wxDIRCTRL_EDIT_LABELS; + } +#endif + + m_dirCtrl = new wxGenericDirCtrl(this, ID_DIRCTRL, + m_path, wxDefaultPosition, + wxSize(300, 200), + dirStyle); + + wxSizerFlags flagsBorder2; + flagsBorder2.DoubleBorder(wxTOP | wxLEFT | wxRIGHT); + + topsizer->Add(m_dirCtrl, wxSizerFlags(flagsBorder2).Proportion(1).Expand()); + +#ifndef __SMARTPHONE__ + // Make the an option depending on a flag? + wxCheckBox * + check = new wxCheckBox(this, ID_SHOW_HIDDEN, _("Show &hidden directories")); + topsizer->Add(check, wxSizerFlags(flagsBorder2).Right()); +#endif // !__SMARTPHONE__ + + // 2) text ctrl + m_input = new wxTextCtrl( this, ID_TEXTCTRL, m_path, wxDefaultPosition ); + topsizer->Add(m_input, wxSizerFlags(flagsBorder2).Expand()); + + // 3) buttons if any + wxSizer *buttonSizer = CreateSeparatedButtonSizer(wxOK | wxCANCEL); + if ( buttonSizer ) + { + topsizer->Add(buttonSizer, wxSizerFlags().Expand().DoubleBorder()); + } + +#ifdef __SMARTPHONE__ + // overwrite menu set by CreateSeparatedButtonSizer() call above + SetRightMenu(wxID_ANY, _("Options"), dirMenu); +#endif + + m_input->SetFocus(); + + SetAutoLayout( true ); + SetSizer( topsizer ); + + topsizer->SetSizeHints( this ); + topsizer->Fit( this ); + + Centre( wxBOTH ); + + return true; +} + +void wxGenericDirDialog::EndModal(int retCode) +{ + // before proceeding, change the current working directory if user asked so + if (retCode == wxID_OK && HasFlag(wxDD_CHANGE_DIR)) + wxSetWorkingDirectory(m_path); + + wxDialog::EndModal(retCode); +} + +void wxGenericDirDialog::OnCloseWindow(wxCloseEvent& WXUNUSED(event)) +{ + EndModal(wxID_CANCEL); +} + +void wxGenericDirDialog::OnOK(wxCommandEvent& WXUNUSED(event)) +{ + m_path = m_input->GetValue(); + + // Does the path exist? (User may have typed anything in m_input) + if (wxDirExists(m_path)) + { + // OK, path exists, we're done. + EndModal(wxID_OK); + return; + } + + // Interact with user, find out if the dir is a typo or to be created + wxString msg; + msg.Printf(_("The directory '%s' does not exist\nCreate it now?"), + m_path.c_str()); + wxMessageDialog dialog(this, msg, _("Directory does not exist"), + wxYES_NO | wxICON_WARNING); + + if ( dialog.ShowModal() == wxID_YES ) + { + // Okay, let's make it + wxLogNull log; + if (wxMkdir(m_path)) + { + // The new dir was created okay. + EndModal(wxID_OK); + return; + } + else + { + // Trouble... + msg.Printf(_("Failed to create directory '%s'\n(Do you have the required permissions?)"), + m_path.c_str()); + wxMessageDialog errmsg(this, msg, _("Error creating directory"), wxOK | wxICON_ERROR); + errmsg.ShowModal(); + // We still don't have a valid dir. Back to the main dialog. + } + } + // User has answered NO to create dir. +} + +void wxGenericDirDialog::SetPath(const wxString& path) +{ + m_dirCtrl->SetPath(path); + m_path = path; +} + +wxString wxGenericDirDialog::GetPath(void) const +{ + return m_path; +} + +int wxGenericDirDialog::ShowModal() +{ + m_input->SetValue( m_path ); + return wxDialog::ShowModal(); +} + +void wxGenericDirDialog::OnTreeSelected( wxTreeEvent &event ) +{ + if (!m_dirCtrl) + return; + + wxTreeItemId item = event.GetItem(); + + wxDirItemData *data = NULL; + + if(item.IsOk()) + data = (wxDirItemData*)m_dirCtrl->GetTreeCtrl()->GetItemData(item); + + if (data) + m_input->SetValue( data->m_path ); +} + +void wxGenericDirDialog::OnTreeKeyDown( wxTreeEvent &WXUNUSED(event) ) +{ + if (!m_dirCtrl) + return; + + wxDirItemData *data = (wxDirItemData*)m_dirCtrl->GetTreeCtrl()->GetItemData(m_dirCtrl->GetTreeCtrl()->GetSelection()); + if (data) + m_input->SetValue( data->m_path ); +} + +void wxGenericDirDialog::OnShowHidden( wxCommandEvent& event ) +{ + if (!m_dirCtrl) + return; + + m_dirCtrl->ShowHidden( event.GetInt() != 0 ); +} + +void wxGenericDirDialog::OnNew( wxCommandEvent& WXUNUSED(event) ) +{ + wxTreeItemId id = m_dirCtrl->GetTreeCtrl()->GetSelection(); + if ((id == m_dirCtrl->GetTreeCtrl()->GetRootItem()) || + (m_dirCtrl->GetTreeCtrl()->GetItemParent(id) == m_dirCtrl->GetTreeCtrl()->GetRootItem())) + { + wxMessageDialog msg(this, _("You cannot add a new directory to this section."), + _("Create directory"), wxOK | wxICON_INFORMATION ); + msg.ShowModal(); + return; + } + + wxTreeItemId parent = id ; // m_dirCtrl->GetTreeCtrl()->GetItemParent( id ); + wxDirItemData *data = (wxDirItemData*)m_dirCtrl->GetTreeCtrl()->GetItemData( parent ); + wxASSERT( data ); + + wxString new_name( _("NewName") ); + wxString path( data->m_path ); + if (!wxEndsWithPathSeparator(path)) + path += wxFILE_SEP_PATH; + path += new_name; + if (wxDirExists(path)) + { + // try NewName0, NewName1 etc. + int i = 0; + do { + new_name = _("NewName"); + wxString num; + num.Printf( wxT("%d"), i ); + new_name += num; + + path = data->m_path; + if (!wxEndsWithPathSeparator(path)) + path += wxFILE_SEP_PATH; + path += new_name; + i++; + } while (wxDirExists(path)); + } + + wxLogNull log; + if (!wxMkdir(path)) + { + wxMessageDialog dialog(this, _("Operation not permitted."), _("Error"), wxOK | wxICON_ERROR ); + dialog.ShowModal(); + return; + } + + wxDirItemData *new_data = new wxDirItemData( path, new_name, true ); + + // TODO: THIS CODE DOESN'T WORK YET. We need to avoid duplication of the first child + // of the parent. + wxTreeItemId new_id = m_dirCtrl->GetTreeCtrl()->AppendItem( parent, new_name, 0, 0, new_data ); + m_dirCtrl->GetTreeCtrl()->EnsureVisible( new_id ); + m_dirCtrl->GetTreeCtrl()->EditLabel( new_id ); +} + +void wxGenericDirDialog::OnGoHome(wxCommandEvent& WXUNUSED(event)) +{ + SetPath(wxGetUserHome()); +} + +#endif // wxUSE_DIRDLG diff --git a/Externals/wxWidgets/src/generic/dragimgg.cpp b/Externals/wxWidgets/src/generic/dragimgg.cpp new file mode 100644 index 0000000000..d3c8ac474a --- /dev/null +++ b/Externals/wxWidgets/src/generic/dragimgg.cpp @@ -0,0 +1,574 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/generic/dragimgg.cpp +// Purpose: Generic wxDragImage implementation +// Author: Julian Smart +// Modified by: +// Created: 29/2/2000 +// RCS-ID: $Id: dragimgg.cpp 42397 2006-10-25 12:12:56Z VS $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_DRAGIMAGE + +#ifndef WX_PRECOMP + #include + #include "wx/window.h" + #include "wx/frame.h" + #include "wx/dcclient.h" + #include "wx/dcscreen.h" + #include "wx/dcmemory.h" + #include "wx/settings.h" + #include "wx/intl.h" + #include "wx/log.h" + #include "wx/image.h" +#endif + +#define wxUSE_IMAGE_IN_DRAGIMAGE 1 + +#include "wx/generic/dragimgg.h" + +// ---------------------------------------------------------------------------- +// macros +// ---------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxGenericDragImage, wxObject) + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxGenericDragImage ctors/dtor +// ---------------------------------------------------------------------------- + +wxGenericDragImage::~wxGenericDragImage() +{ + if (m_windowDC) + { + delete m_windowDC; + } +} + +void wxGenericDragImage::Init() +{ + m_isDirty = false; + m_isShown = false; + m_windowDC = (wxDC*) NULL; + m_window = (wxWindow*) NULL; + m_fullScreen = false; +#ifdef wxHAS_NATIVE_OVERLAY + m_dcOverlay = NULL; +#else + m_pBackingBitmap = (wxBitmap*) NULL; +#endif +} + +#if WXWIN_COMPATIBILITY_2_6 +wxGenericDragImage::wxGenericDragImage(const wxCursor& cursor, const wxPoint& WXUNUSED(cursorHotspot)) +{ + Init(); + Create(cursor); +} + +wxGenericDragImage::wxGenericDragImage(const wxBitmap& image, const wxCursor& cursor, const wxPoint& WXUNUSED(cursorHotspot)) +{ + Init(); + + Create(image, cursor); +} + +wxGenericDragImage::wxGenericDragImage(const wxIcon& image, const wxCursor& cursor, const wxPoint& WXUNUSED(cursorHotspot)) +{ + Init(); + + Create(image, cursor); +} + +wxGenericDragImage::wxGenericDragImage(const wxString& str, const wxCursor& cursor, const wxPoint& WXUNUSED(cursorHotspot)) +{ + Init(); + + Create(str, cursor); +} + +bool wxGenericDragImage::Create(const wxCursor& cursor, const wxPoint& WXUNUSED(cursorHotspot)) +{ + return Create(cursor); +} + +bool wxGenericDragImage::Create(const wxBitmap& image, const wxCursor& cursor, const wxPoint& WXUNUSED(cursorHotspot)) +{ + return Create(image, cursor); +} + +bool wxGenericDragImage::Create(const wxIcon& image, const wxCursor& cursor, const wxPoint& WXUNUSED(cursorHotspot)) +{ + return Create(image, cursor); +} + +bool wxGenericDragImage::Create(const wxString& str, const wxCursor& cursor, const wxPoint& WXUNUSED(cursorHotspot)) +{ + return Create(str, cursor); +} +#endif // WXWIN_COMPATIBILITY_2_6 + +// Attributes +//////////////////////////////////////////////////////////////////////////// + + +// Operations +//////////////////////////////////////////////////////////////////////////// + +// Create a drag image with a virtual image (need to override DoDrawImage, GetImageRect) +bool wxGenericDragImage::Create(const wxCursor& cursor) +{ + m_cursor = cursor; + + return true; +} + +// Create a drag image from a bitmap and optional cursor +bool wxGenericDragImage::Create(const wxBitmap& image, const wxCursor& cursor) +{ + // We don't have to combine the cursor explicitly since we simply show the cursor + // as we drag. This currently will only work within one window. + + m_cursor = cursor; + m_bitmap = image; + + return true ; +} + +// Create a drag image from an icon and optional cursor +bool wxGenericDragImage::Create(const wxIcon& image, const wxCursor& cursor) +{ + // We don't have to combine the cursor explicitly since we simply show the cursor + // as we drag. This currently will only work within one window. + + m_cursor = cursor; + m_icon = image; + + return true ; +} + +// Create a drag image from a string and optional cursor +bool wxGenericDragImage::Create(const wxString& str, const wxCursor& cursor) +{ + wxFont font(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT)); + + long w = 0, h = 0; + wxScreenDC dc; + dc.SetFont(font); + dc.GetTextExtent(str, & w, & h); + dc.SetFont(wxNullFont); + + wxMemoryDC dc2; + + // Sometimes GetTextExtent isn't accurate enough, so make it longer + wxBitmap bitmap((int) ((w+2) * 1.5), (int) h+2); + dc2.SelectObject(bitmap); + + dc2.SetFont(font); + dc2.SetBackground(* wxWHITE_BRUSH); + dc2.Clear(); + dc2.SetBackgroundMode(wxTRANSPARENT); + dc2.SetTextForeground(* wxLIGHT_GREY); + dc2.DrawText(str, 0, 0); + dc2.DrawText(str, 1, 0); + dc2.DrawText(str, 2, 0); + dc2.DrawText(str, 1, 1); + dc2.DrawText(str, 2, 1); + dc2.DrawText(str, 1, 2); + dc2.DrawText(str, 2, 2); + + dc2.SetTextForeground(* wxBLACK); + dc2.DrawText(str, 1, 1); + + dc2.SelectObject(wxNullBitmap); + +#if wxUSE_IMAGE_IN_DRAGIMAGE && (!defined(__WXMSW__) || wxUSE_WXDIB) + // Make the bitmap masked + wxImage image = bitmap.ConvertToImage(); + image.SetMaskColour(255, 255, 255); + bitmap = wxBitmap(image); +#endif + + return Create(bitmap, cursor); +} + +#if wxUSE_TREECTRL +// Create a drag image for the given tree control item +bool wxGenericDragImage::Create(const wxTreeCtrl& treeCtrl, wxTreeItemId& id) +{ + wxString str = treeCtrl.GetItemText(id); + return Create(str); +} +#endif + +#if wxUSE_LISTCTRL +// Create a drag image for the given list control item +bool wxGenericDragImage::Create(const wxListCtrl& listCtrl, long id) +{ + wxString str = listCtrl.GetItemText(id); + return Create(str); +} +#endif + +// Begin drag +bool wxGenericDragImage::BeginDrag(const wxPoint& hotspot, + wxWindow* window, + bool fullScreen, + wxRect* rect) +{ + wxASSERT_MSG( (window != 0), wxT("Window must not be null in BeginDrag.")); + + // The image should be offset by this amount + m_offset = hotspot; + m_window = window; + m_fullScreen = fullScreen; + + if (rect) + m_boundingRect = * rect; + + m_isDirty = false; + m_isDirty = false; + + if (window) + { + window->CaptureMouse(); + + if (m_cursor.Ok()) + { + m_oldCursor = window->GetCursor(); + window->SetCursor(m_cursor); + } + } + + // Make a copy of the window so we can repair damage done as the image is + // dragged. + + wxSize clientSize; + wxPoint pt; + if (!m_fullScreen) + { + clientSize = window->GetClientSize(); + m_boundingRect.x = 0; m_boundingRect.y = 0; + m_boundingRect.width = clientSize.x; m_boundingRect.height = clientSize.y; + } + else + { + int w, h; + wxDisplaySize(& w, & h); + clientSize.x = w; clientSize.y = h; + if (rect) + { + pt.x = m_boundingRect.x; pt.y = m_boundingRect.y; + clientSize.x = m_boundingRect.width; clientSize.y = m_boundingRect.height; + } + else + { + m_boundingRect.x = 0; m_boundingRect.y = 0; + m_boundingRect.width = w; m_boundingRect.height = h; + } + } + +#ifndef wxHAS_NATIVE_OVERLAY + wxBitmap* backing = (m_pBackingBitmap ? m_pBackingBitmap : (wxBitmap*) & m_backingBitmap); + + if (!backing->Ok() || (backing->GetWidth() < clientSize.x || backing->GetHeight() < clientSize.y)) + (*backing) = wxBitmap(clientSize.x, clientSize.y); +#endif // !wxHAS_NATIVE_OVERLAY + + if (!m_fullScreen) + { + m_windowDC = new wxClientDC(window); + } + else + { + m_windowDC = new wxScreenDC; + +#if 0 + // Use m_boundingRect to limit the area considered. + ((wxScreenDC*) m_windowDC)->StartDrawingOnTop(rect); +#endif + + m_windowDC->SetClippingRegion(m_boundingRect.x, m_boundingRect.y, + m_boundingRect.width, m_boundingRect.height); + } + + return true; +} + +// Begin drag. hotspot is the location of the drag position relative to the upper-left +// corner of the image. This is full screen only. fullScreenRect gives the +// position of the window on the screen, to restrict the drag to. +bool wxGenericDragImage::BeginDrag(const wxPoint& hotspot, wxWindow* window, wxWindow* fullScreenRect) +{ + wxRect rect; + + int x = fullScreenRect->GetPosition().x; + int y = fullScreenRect->GetPosition().y; + + wxSize sz = fullScreenRect->GetSize(); + + if (fullScreenRect->GetParent() && !fullScreenRect->IsKindOf(CLASSINFO(wxFrame))) + fullScreenRect->GetParent()->ClientToScreen(& x, & y); + + rect.x = x; rect.y = y; + rect.width = sz.x; rect.height = sz.y; + + return BeginDrag(hotspot, window, true, & rect); +} + +// End drag +bool wxGenericDragImage::EndDrag() +{ + if (m_window) + { +#ifdef __WXMSW__ + // Under Windows we can be pretty sure this test will give + // the correct results + if (wxWindow::GetCapture() == m_window) +#endif + m_window->ReleaseMouse(); + + if (m_cursor.Ok() && m_oldCursor.Ok()) + { + m_window->SetCursor(m_oldCursor); + } + } + + if (m_windowDC) + { +#ifdef wxHAS_NATIVE_OVERLAY + m_overlay.Reset(); +#else + m_windowDC->DestroyClippingRegion(); +#endif + delete m_windowDC; + m_windowDC = (wxDC*) NULL; + } + +#ifndef wxHAS_NATIVE_OVERLAY + m_repairBitmap = wxNullBitmap; +#endif + + return true; +} + +// Move the image: call from OnMouseMove. Pt is in window client coordinates if window +// is non-NULL, or in screen coordinates if NULL. +bool wxGenericDragImage::Move(const wxPoint& pt) +{ + wxASSERT_MSG( (m_windowDC != (wxDC*) NULL), wxT("No window DC in wxGenericDragImage::Move()") ); + + wxPoint pt2(pt); + if (m_fullScreen) + pt2 = m_window->ClientToScreen(pt); + + // Erase at old position, then show at the current position + wxPoint oldPos = m_position; + + bool eraseOldImage = (m_isDirty && m_isShown); + + if (m_isShown) + RedrawImage(oldPos - m_offset, pt2 - m_offset, eraseOldImage, true); + + m_position = pt2; + + if (m_isShown) + m_isDirty = true; + + return true; +} + +bool wxGenericDragImage::Show() +{ + wxASSERT_MSG( (m_windowDC != (wxDC*) NULL), wxT("No window DC in wxGenericDragImage::Show()") ); + + // Show at the current position + + if (!m_isShown) + { + // This is where we restore the backing bitmap, in case + // something has changed on the window. + +#ifndef wxHAS_NATIVE_OVERLAY + wxBitmap* backing = (m_pBackingBitmap ? m_pBackingBitmap : (wxBitmap*) & m_backingBitmap); + wxMemoryDC memDC; + memDC.SelectObject(* backing); + + UpdateBackingFromWindow(* m_windowDC, memDC, m_boundingRect, wxRect(0, 0, m_boundingRect.width, m_boundingRect.height)); + + //memDC.Blit(0, 0, m_boundingRect.width, m_boundingRect.height, m_windowDC, m_boundingRect.x, m_boundingRect.y); + memDC.SelectObject(wxNullBitmap); +#endif // !wxHAS_NATIVE_OVERLAY + + RedrawImage(m_position - m_offset, m_position - m_offset, false, true); + } + + m_isShown = true; + m_isDirty = true; + + return true; +} + +bool wxGenericDragImage::UpdateBackingFromWindow(wxDC& windowDC, wxMemoryDC& destDC, + const wxRect& sourceRect, const wxRect& destRect) const +{ + return destDC.Blit(destRect.x, destRect.y, destRect.width, destRect.height, & windowDC, + sourceRect.x, sourceRect.y); +} + +bool wxGenericDragImage::Hide() +{ + wxASSERT_MSG( (m_windowDC != (wxDC*) NULL), wxT("No window DC in wxGenericDragImage::Hide()") ); + + // Repair the old position + + if (m_isShown && m_isDirty) + { + RedrawImage(m_position - m_offset, m_position - m_offset, true, false); + } + + m_isShown = false; + m_isDirty = false; + + return true; +} + +// More efficient: erase and redraw simultaneously if possible +bool wxGenericDragImage::RedrawImage(const wxPoint& oldPos, const wxPoint& newPos, + bool eraseOld, bool drawNew) +{ + if (!m_windowDC) + return false; + +#ifdef wxHAS_NATIVE_OVERLAY + wxDCOverlay dcoverlay( m_overlay, (wxWindowDC*) m_windowDC ) ; + if ( eraseOld ) + dcoverlay.Clear() ; + if (drawNew) + DoDrawImage(*m_windowDC, newPos); +#else // !wxHAS_NATIVE_OVERLAY + wxBitmap* backing = (m_pBackingBitmap ? m_pBackingBitmap : (wxBitmap*) & m_backingBitmap); + if (!backing->Ok()) + return false; + + wxRect oldRect(GetImageRect(oldPos)); + wxRect newRect(GetImageRect(newPos)); + + wxRect fullRect; + + // Full rect: the combination of both rects + if (eraseOld && drawNew) + { + int oldRight = oldRect.GetRight(); + int oldBottom = oldRect.GetBottom(); + int newRight = newRect.GetRight(); + int newBottom = newRect.GetBottom(); + + wxPoint topLeft = wxPoint(wxMin(oldPos.x, newPos.x), wxMin(oldPos.y, newPos.y)); + wxPoint bottomRight = wxPoint(wxMax(oldRight, newRight), wxMax(oldBottom, newBottom)); + + fullRect.x = topLeft.x; fullRect.y = topLeft.y; + fullRect.SetRight(bottomRight.x); + fullRect.SetBottom(bottomRight.y); + } + else if (eraseOld) + fullRect = oldRect; + else if (drawNew) + fullRect = newRect; + + // Make the bitmap bigger than it need be, so we don't + // keep reallocating all the time. + int excess = 50; + + if (!m_repairBitmap.Ok() || (m_repairBitmap.GetWidth() < fullRect.GetWidth() || m_repairBitmap.GetHeight() < fullRect.GetHeight())) + { + m_repairBitmap = wxBitmap(fullRect.GetWidth() + excess, fullRect.GetHeight() + excess); + } + + wxMemoryDC memDC; + memDC.SelectObject(* backing); + + wxMemoryDC memDCTemp; + memDCTemp.SelectObject(m_repairBitmap); + + // Draw the backing bitmap onto the repair bitmap. + // If full-screen, we may have specified the rect on the + // screen that we're using for our backing bitmap. + // So subtract this when we're blitting from the backing bitmap + // (translate from screen to backing-bitmap coords). + + memDCTemp.Blit(0, 0, fullRect.GetWidth(), fullRect.GetHeight(), & memDC, fullRect.x - m_boundingRect.x, fullRect.y - m_boundingRect.y); + + // If drawing, draw the image onto the mem DC + if (drawNew) + { + wxPoint pos(newPos.x - fullRect.x, newPos.y - fullRect.y) ; + DoDrawImage(memDCTemp, pos); + } + + // Now blit to the window + // Finally, blit the temp mem DC to the window. + m_windowDC->Blit(fullRect.x, fullRect.y, fullRect.width, fullRect.height, & memDCTemp, 0, 0); + + memDCTemp.SelectObject(wxNullBitmap); + memDC.SelectObject(wxNullBitmap); +#endif // wxHAS_NATIVE_OVERLAY/!wxHAS_NATIVE_OVERLAY + + return true; +} + +// Override this if you are using a virtual image (drawing your own image) +bool wxGenericDragImage::DoDrawImage(wxDC& dc, const wxPoint& pos) const +{ + if (m_bitmap.Ok()) + { + dc.DrawBitmap(m_bitmap, pos.x, pos.y, (m_bitmap.GetMask() != 0)); + return true; + } + else if (m_icon.Ok()) + { + dc.DrawIcon(m_icon, pos.x, pos.y); + return true; + } + else + return false; +} + +// Override this if you are using a virtual image (drawing your own image) +wxRect wxGenericDragImage::GetImageRect(const wxPoint& pos) const +{ + if (m_bitmap.Ok()) + { + return wxRect(pos.x, pos.y, m_bitmap.GetWidth(), m_bitmap.GetHeight()); + } + else if (m_icon.Ok()) + { + return wxRect(pos.x, pos.y, m_icon.GetWidth(), m_icon.GetHeight()); + } + else + { + return wxRect(pos.x, pos.y, 0, 0); + } +} + +#endif // wxUSE_DRAGIMAGE diff --git a/Externals/wxWidgets/src/generic/fdrepdlg.cpp b/Externals/wxWidgets/src/generic/fdrepdlg.cpp new file mode 100644 index 0000000000..cadfbd0ced --- /dev/null +++ b/Externals/wxWidgets/src/generic/fdrepdlg.cpp @@ -0,0 +1,291 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/generic/fdrepgg.cpp +// Purpose: Find/Replace dialogs +// Author: Markus Greither and Vadim Zeitlin +// Modified by: +// Created: 05/25/01 +// RCS-ID: +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_FINDREPLDLG + +#ifndef WX_PRECOMP + #include "wx/intl.h" + #include "wx/log.h" + + #include "wx/sizer.h" + + #include "wx/button.h" + #include "wx/checkbox.h" + #include "wx/radiobox.h" + #include "wx/stattext.h" + #include "wx/textctrl.h" + #include "wx/settings.h" +#endif + +#include "wx/fdrepdlg.h" + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// ============================================================================ +// implementation +// ============================================================================ + +IMPLEMENT_DYNAMIC_CLASS(wxGenericFindReplaceDialog, wxDialog) + +BEGIN_EVENT_TABLE(wxGenericFindReplaceDialog, wxDialog) + EVT_BUTTON(wxID_FIND, wxGenericFindReplaceDialog::OnFind) + EVT_BUTTON(wxID_REPLACE, wxGenericFindReplaceDialog::OnReplace) + EVT_BUTTON(wxID_REPLACE_ALL, wxGenericFindReplaceDialog::OnReplaceAll) + EVT_BUTTON(wxID_CANCEL, wxGenericFindReplaceDialog::OnCancel) + + EVT_UPDATE_UI(wxID_FIND, wxGenericFindReplaceDialog::OnUpdateFindUI) + EVT_UPDATE_UI(wxID_REPLACE, wxGenericFindReplaceDialog::OnUpdateFindUI) + EVT_UPDATE_UI(wxID_REPLACE_ALL, wxGenericFindReplaceDialog::OnUpdateFindUI) + + EVT_CLOSE(wxGenericFindReplaceDialog::OnCloseWindow) +END_EVENT_TABLE() + +// ---------------------------------------------------------------------------- +// wxGenericFindReplaceDialog +// ---------------------------------------------------------------------------- + +void wxGenericFindReplaceDialog::Init() +{ + m_FindReplaceData = NULL; + + m_chkWord = + m_chkCase = NULL; + + m_radioDir = NULL; + + m_textFind = + m_textRepl = NULL; +} + +bool wxGenericFindReplaceDialog::Create(wxWindow *parent, + wxFindReplaceData *data, + const wxString& title, + int style) +{ + if ( !wxDialog::Create(parent, wxID_ANY, title, + wxDefaultPosition, wxDefaultSize, + wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER + | style) ) + { + return false; + } + + SetData(data); + + wxCHECK_MSG( m_FindReplaceData, false, + _T("can't create dialog without data") ); + + bool isPda = (wxSystemSettings::GetScreenType() <= wxSYS_SCREEN_PDA); + + wxBoxSizer *leftsizer = new wxBoxSizer( wxVERTICAL ); + + // 3 columns because there is a spacer in the middle + wxFlexGridSizer *sizer2Col = new wxFlexGridSizer(3); + sizer2Col->AddGrowableCol(2); + + sizer2Col->Add(new wxStaticText(this, wxID_ANY, _("Search for:"), + wxDefaultPosition, wxSize(80, wxDefaultCoord)), + 0, + wxALIGN_CENTRE_VERTICAL | wxALIGN_RIGHT); + + sizer2Col->Add(10, 0); + + m_textFind = new wxTextCtrl(this, wxID_ANY, m_FindReplaceData->GetFindString()); + sizer2Col->Add(m_textFind, 1, wxALIGN_CENTRE_VERTICAL | wxEXPAND); + + if ( style & wxFR_REPLACEDIALOG ) + { + sizer2Col->Add(new wxStaticText(this, wxID_ANY, _("Replace with:"), + wxDefaultPosition, wxSize(80, wxDefaultCoord)), + 0, + wxALIGN_CENTRE_VERTICAL | + wxALIGN_RIGHT | wxTOP, 5); + + sizer2Col->Add(isPda ? 2 : 10, 0); + + m_textRepl = new wxTextCtrl(this, wxID_ANY, + m_FindReplaceData->GetReplaceString()); + sizer2Col->Add(m_textRepl, 1, + wxALIGN_CENTRE_VERTICAL | wxEXPAND | wxTOP, 5); + } + + leftsizer->Add(sizer2Col, 0, wxEXPAND | wxALL, 5); + + wxBoxSizer *optsizer = new wxBoxSizer( isPda ? wxVERTICAL : wxHORIZONTAL ); + + wxBoxSizer *chksizer = new wxBoxSizer( wxVERTICAL); + + m_chkWord = new wxCheckBox(this, wxID_ANY, _("Whole word")); + chksizer->Add(m_chkWord, 0, wxALL, 3); + + m_chkCase = new wxCheckBox(this, wxID_ANY, _("Match case")); + chksizer->Add(m_chkCase, 0, wxALL, 3); + + optsizer->Add(chksizer, 0, wxALL, 10); + + static const wxString searchDirections[] = {_("Up"), _("Down")}; + int majorDimension = 0; + int rbStyle ; + if (isPda) + rbStyle = wxRA_SPECIFY_ROWS; + else + rbStyle = wxRA_SPECIFY_COLS; + + m_radioDir = new wxRadioBox(this, wxID_ANY, _("Search direction"), + wxDefaultPosition, wxDefaultSize, + WXSIZEOF(searchDirections), searchDirections, + majorDimension, rbStyle); + + optsizer->Add(m_radioDir, 0, wxALL, isPda ? 5 : 10); + + leftsizer->Add(optsizer); + + wxBoxSizer *bttnsizer = new wxBoxSizer(wxVERTICAL); + + wxButton* btn = new wxButton(this, wxID_FIND); + btn->SetDefault(); + bttnsizer->Add(btn, 0, wxALL, 3); + + bttnsizer->Add(new wxButton(this, wxID_CANCEL), 0, wxALL, 3); + + if ( style & wxFR_REPLACEDIALOG ) + { + bttnsizer->Add(new wxButton(this, wxID_REPLACE, _("&Replace")), + 0, wxALL, 3); + + bttnsizer->Add(new wxButton(this, wxID_REPLACE_ALL, _("Replace &all")), + 0, wxALL, 3); + } + + wxBoxSizer *topsizer = new wxBoxSizer( wxHORIZONTAL ); + + topsizer->Add(leftsizer, 1, wxALL, isPda ? 0 : 5); + topsizer->Add(bttnsizer, 0, wxALL, isPda ? 0 : 5); + + int flags = m_FindReplaceData->GetFlags(); + + if ( flags & wxFR_MATCHCASE ) + m_chkCase->SetValue(true); + + if ( flags & wxFR_WHOLEWORD ) + m_chkWord->SetValue(true); + + m_radioDir->SetSelection( flags & wxFR_DOWN ); + + if ( style & wxFR_NOMATCHCASE ) + m_chkCase->Enable(false); + + if ( style & wxFR_NOWHOLEWORD ) + m_chkWord->Enable(false); + + if ( style & wxFR_NOUPDOWN) + m_radioDir->Enable(false); + + SetAutoLayout( true ); + SetSizer( topsizer ); + + topsizer->SetSizeHints( this ); + topsizer->Fit( this ); + + Centre( wxBOTH ); + + m_textFind->SetFocus(); + + return true; +} + +// ---------------------------------------------------------------------------- +// send the notification event +// ---------------------------------------------------------------------------- + +void wxGenericFindReplaceDialog::SendEvent(const wxEventType& evtType) +{ + wxFindDialogEvent event(evtType, GetId()); + event.SetEventObject(this); + event.SetFindString(m_textFind->GetValue()); + if ( HasFlag(wxFR_REPLACEDIALOG) ) + { + event.SetReplaceString(m_textRepl->GetValue()); + } + + int flags = 0; + + if ( m_chkCase->GetValue() ) + flags |= wxFR_MATCHCASE; + + if ( m_chkWord->GetValue() ) + flags |= wxFR_WHOLEWORD; + + if ( !m_radioDir || m_radioDir->GetSelection() == 1 ) + { + flags |= wxFR_DOWN; + } + + event.SetFlags(flags); + + wxFindReplaceDialogBase::Send(event); +} + +// ---------------------------------------------------------------------------- +// event handlers +// ---------------------------------------------------------------------------- + +void wxGenericFindReplaceDialog::OnFind(wxCommandEvent& WXUNUSED(event)) +{ + SendEvent(wxEVT_COMMAND_FIND_NEXT); +} + +void wxGenericFindReplaceDialog::OnReplace(wxCommandEvent& WXUNUSED(event)) +{ + SendEvent(wxEVT_COMMAND_FIND_REPLACE); +} + +void wxGenericFindReplaceDialog::OnReplaceAll(wxCommandEvent& WXUNUSED(event)) +{ + SendEvent(wxEVT_COMMAND_FIND_REPLACE_ALL); +} + +void wxGenericFindReplaceDialog::OnCancel(wxCommandEvent& WXUNUSED(event)) +{ + SendEvent(wxEVT_COMMAND_FIND_CLOSE); + + Show(false); +} + +void wxGenericFindReplaceDialog::OnUpdateFindUI(wxUpdateUIEvent &event) +{ + // we can't search for empty strings + event.Enable( !m_textFind->GetValue().empty() ); +} + +void wxGenericFindReplaceDialog::OnCloseWindow(wxCloseEvent &) +{ + SendEvent(wxEVT_COMMAND_FIND_CLOSE); +} + +#endif // wxUSE_FINDREPLDLG diff --git a/Externals/wxWidgets/src/generic/filedlgg.cpp b/Externals/wxWidgets/src/generic/filedlgg.cpp new file mode 100644 index 0000000000..71bb8c12b9 --- /dev/null +++ b/Externals/wxWidgets/src/generic/filedlgg.cpp @@ -0,0 +1,1645 @@ +////////////////////////////////////////////////////////////////////////////// +// Name: src/generic/filedlgg.cpp +// Purpose: wxGenericFileDialog +// Author: Robert Roebling +// Modified by: +// Created: 12/12/98 +// RCS-ID: $Id: filedlgg.cpp 45836 2007-05-05 17:13:30Z PC $ +// Copyright: (c) Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_FILEDLG + +// NOTE : it probably also supports MAC, untested +#if !defined(__UNIX__) && !defined(__DOS__) && !defined(__WIN32__) && !defined(__OS2__) +#error wxGenericFileDialog currently only supports Unix, win32 and DOS +#endif + +#ifndef WX_PRECOMP + #ifdef __WXMSW__ + #include "wx/msw/wrapwin.h" + #endif + #include "wx/hash.h" + #include "wx/intl.h" + #include "wx/settings.h" + #include "wx/log.h" + #include "wx/msgdlg.h" + #include "wx/bmpbuttn.h" + #include "wx/checkbox.h" + #include "wx/choice.h" + #include "wx/stattext.h" + #include "wx/textctrl.h" + #include "wx/sizer.h" + #include "wx/filedlg.h" // wxFD_OPEN, wxFD_SAVE... +#endif + +#include "wx/longlong.h" +#include "wx/tokenzr.h" +#include "wx/config.h" +#include "wx/imaglist.h" +#include "wx/dir.h" +#include "wx/artprov.h" +#include "wx/filefn.h" +#include "wx/file.h" // for wxS_IXXX constants only +#include "wx/generic/filedlgg.h" +#include "wx/generic/dirctrlg.h" // for wxFileIconsTable + +#if wxUSE_TOOLTIPS + #include "wx/tooltip.h" +#endif + +#ifndef __WXWINCE__ + #include + #include +#endif + +#ifdef __UNIX__ + #include + #include + #ifndef __VMS + # include + #endif +#endif + +#ifdef __WINDOWS__ + #include "wx/msw/mslu.h" +#endif + +#ifdef __WATCOMC__ + #include +#endif + +#ifndef __WXWINCE__ +#include +#endif + +#if defined(__UNIX__) || defined(__DOS__) +#include +#endif + +// ---------------------------------------------------------------------------- +// private functions +// ---------------------------------------------------------------------------- + +static +int wxCALLBACK wxFileDataNameCompare( long data1, long data2, long sortOrder) +{ + wxFileData *fd1 = (wxFileData *)wxUIntToPtr(data1); + wxFileData *fd2 = (wxFileData *)wxUIntToPtr(data2); + + if (fd1->GetFileName() == wxT("..")) + return -sortOrder; + if (fd2->GetFileName() == wxT("..")) + return sortOrder; + if (fd1->IsDir() && !fd2->IsDir()) + return -sortOrder; + if (fd2->IsDir() && !fd1->IsDir()) + return sortOrder; + + return sortOrder*wxStrcmp( fd1->GetFileName(), fd2->GetFileName() ); +} + +static +int wxCALLBACK wxFileDataSizeCompare(long data1, long data2, long sortOrder) +{ + wxFileData *fd1 = (wxFileData *)wxUIntToPtr(data1); + wxFileData *fd2 = (wxFileData *)wxUIntToPtr(data2); + + if (fd1->GetFileName() == wxT("..")) + return -sortOrder; + if (fd2->GetFileName() == wxT("..")) + return sortOrder; + if (fd1->IsDir() && !fd2->IsDir()) + return -sortOrder; + if (fd2->IsDir() && !fd1->IsDir()) + return sortOrder; + if (fd1->IsLink() && !fd2->IsLink()) + return -sortOrder; + if (fd2->IsLink() && !fd1->IsLink()) + return sortOrder; + + return fd1->GetSize() > fd2->GetSize() ? sortOrder : -sortOrder; +} + +static +int wxCALLBACK wxFileDataTypeCompare(long data1, long data2, long sortOrder) +{ + wxFileData *fd1 = (wxFileData *)wxUIntToPtr(data1); + wxFileData *fd2 = (wxFileData *)wxUIntToPtr(data2); + + if (fd1->GetFileName() == wxT("..")) + return -sortOrder; + if (fd2->GetFileName() == wxT("..")) + return sortOrder; + if (fd1->IsDir() && !fd2->IsDir()) + return -sortOrder; + if (fd2->IsDir() && !fd1->IsDir()) + return sortOrder; + if (fd1->IsLink() && !fd2->IsLink()) + return -sortOrder; + if (fd2->IsLink() && !fd1->IsLink()) + return sortOrder; + + return sortOrder*wxStrcmp( fd1->GetFileType(), fd2->GetFileType() ); +} + +static +int wxCALLBACK wxFileDataTimeCompare(long data1, long data2, long sortOrder) +{ + wxFileData *fd1 = (wxFileData *)wxUIntToPtr(data1); + wxFileData *fd2 = (wxFileData *)wxUIntToPtr(data2); + + if (fd1->GetFileName() == wxT("..")) + return -sortOrder; + if (fd2->GetFileName() == wxT("..")) + return sortOrder; + if (fd1->IsDir() && !fd2->IsDir()) + return -sortOrder; + if (fd2->IsDir() && !fd1->IsDir()) + return sortOrder; + + return fd1->GetDateTime().IsLaterThan(fd2->GetDateTime()) ? sortOrder : -sortOrder; +} + +#if defined(__WXWINCE__) +#define IsTopMostDir(dir) (dir == wxT("\\") || dir == wxT("/")) +#elif (defined(__DOS__) || defined(__WINDOWS__) || defined (__OS2__)) +#define IsTopMostDir(dir) (dir.empty()) +#else +#define IsTopMostDir(dir) (dir == wxT("/")) +#endif + +// defined in src/generic/dirctrlg.cpp +extern size_t wxGetAvailableDrives(wxArrayString &paths, wxArrayString &names, wxArrayInt &icon_ids); + +//----------------------------------------------------------------------------- +// wxFileData +//----------------------------------------------------------------------------- + +wxFileData::wxFileData( const wxString &filePath, const wxString &fileName, fileType type, int image_id ) +{ + Init(); + m_fileName = fileName; + m_filePath = filePath; + m_type = type; + m_image = image_id; + + ReadData(); +} + +void wxFileData::Init() +{ + m_size = 0; + m_type = wxFileData::is_file; + m_image = wxFileIconsTable::file; +} + +void wxFileData::Copy( const wxFileData& fileData ) +{ + m_fileName = fileData.GetFileName(); + m_filePath = fileData.GetFilePath(); + m_size = fileData.GetSize(); + m_dateTime = fileData.GetDateTime(); + m_permissions = fileData.GetPermissions(); + m_type = fileData.GetType(); + m_image = fileData.GetImageId(); +} + +void wxFileData::ReadData() +{ + if (IsDrive()) + { + m_size = 0; + return; + } + +#if defined(__DOS__) || (defined(__WINDOWS__) && !defined(__WXWINCE__)) || defined(__OS2__) + // c:\.. is a drive don't stat it + if ((m_fileName == wxT("..")) && (m_filePath.length() <= 5)) + { + m_type = is_drive; + m_size = 0; + return; + } +#endif // __DOS__ || __WINDOWS__ + +#ifdef __WXWINCE__ + + // WinCE + + DWORD fileAttribs = GetFileAttributes(m_filePath.fn_str()); + m_type |= (fileAttribs & FILE_ATTRIBUTE_DIRECTORY) != 0 ? is_dir : 0; + + wxString p, f, ext; + wxSplitPath(m_filePath, & p, & f, & ext); + if (wxStricmp(ext, wxT("exe")) == 0) + m_type |= is_exe; + + // Find out size + m_size = 0; + HANDLE fileHandle = CreateFile(m_filePath.fn_str(), + GENERIC_READ, + FILE_SHARE_READ, + NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, + NULL); + + if (fileHandle != INVALID_HANDLE_VALUE) + { + m_size = GetFileSize(fileHandle, 0); + CloseHandle(fileHandle); + } + + m_dateTime = wxFileModificationTime(m_filePath); + +#else + + // OTHER PLATFORMS + + wxStructStat buff; + +#if defined(__UNIX__) && (!defined( __OS2__ ) && !defined(__VMS)) + lstat( m_filePath.fn_str(), &buff ); + m_type |= S_ISLNK( buff.st_mode ) != 0 ? is_link : 0; +#else // no lstat() + // only translate to file charset if we don't go by our + // wxStat implementation +#ifndef wxNEED_WX_UNISTD_H + wxStat( m_filePath.fn_str() , &buff ); +#else + wxStat( m_filePath, &buff ); +#endif +#endif + + m_type |= (buff.st_mode & S_IFDIR) != 0 ? is_dir : 0; + m_type |= (buff.st_mode & wxS_IXUSR) != 0 ? is_exe : 0; + + m_size = buff.st_size; + + m_dateTime = buff.st_mtime; +#endif + // __WXWINCE__ + +#if defined(__UNIX__) + m_permissions.Printf(_T("%c%c%c%c%c%c%c%c%c"), + buff.st_mode & wxS_IRUSR ? _T('r') : _T('-'), + buff.st_mode & wxS_IWUSR ? _T('w') : _T('-'), + buff.st_mode & wxS_IXUSR ? _T('x') : _T('-'), + buff.st_mode & wxS_IRGRP ? _T('r') : _T('-'), + buff.st_mode & wxS_IWGRP ? _T('w') : _T('-'), + buff.st_mode & wxS_IXGRP ? _T('x') : _T('-'), + buff.st_mode & wxS_IROTH ? _T('r') : _T('-'), + buff.st_mode & wxS_IWOTH ? _T('w') : _T('-'), + buff.st_mode & wxS_IXOTH ? _T('x') : _T('-')); +#elif defined(__WIN32__) + DWORD attribs = ::GetFileAttributes(m_filePath.c_str()); + if (attribs != (DWORD)-1) + { + m_permissions.Printf(_T("%c%c%c%c"), + attribs & FILE_ATTRIBUTE_ARCHIVE ? _T('A') : _T(' '), + attribs & FILE_ATTRIBUTE_READONLY ? _T('R') : _T(' '), + attribs & FILE_ATTRIBUTE_HIDDEN ? _T('H') : _T(' '), + attribs & FILE_ATTRIBUTE_SYSTEM ? _T('S') : _T(' ')); + } +#endif + + // try to get a better icon + if (m_image == wxFileIconsTable::file) + { + if (m_fileName.Find(wxT('.'), true) != wxNOT_FOUND) + { + m_image = wxTheFileIconsTable->GetIconID( m_fileName.AfterLast(wxT('.'))); + } else if (IsExe()) + { + m_image = wxFileIconsTable::executable; + } + } +} + +wxString wxFileData::GetFileType() const +{ + if (IsDir()) + return _(""); + else if (IsLink()) + return _(""); + else if (IsDrive()) + return _(""); + else if (m_fileName.Find(wxT('.'), true) != wxNOT_FOUND) + return m_fileName.AfterLast(wxT('.')); + + return wxEmptyString; +} + +wxString wxFileData::GetModificationTime() const +{ + // want time as 01:02 so they line up nicely, no %r in WIN32 + return m_dateTime.FormatDate() + wxT(" ") + m_dateTime.Format(wxT("%I:%M:%S %p")); +} + +wxString wxFileData::GetHint() const +{ + wxString s = m_filePath; + s += wxT(" "); + + if (IsDir()) + s += _(""); + else if (IsLink()) + s += _(""); + else if (IsDrive()) + s += _(""); + else // plain file + s += wxString::Format(wxPLURAL("%ld byte", "%ld bytes", m_size), + wxLongLong(m_size).ToString().c_str()); + + s += wxT(' '); + + if ( !IsDrive() ) + { + s << GetModificationTime() + << wxT(" ") + << m_permissions; + } + + return s; +} + +wxString wxFileData::GetEntry( fileListFieldType num ) const +{ + wxString s; + switch ( num ) + { + case FileList_Name: + s = m_fileName; + break; + + case FileList_Size: + if (!IsDir() && !IsLink() && !IsDrive()) + s = wxLongLong(m_size).ToString(); + break; + + case FileList_Type: + s = GetFileType(); + break; + + case FileList_Time: + if (!IsDrive()) + s = GetModificationTime(); + break; + +#if defined(__UNIX__) || defined(__WIN32__) + case FileList_Perm: + s = m_permissions; + break; +#endif // defined(__UNIX__) || defined(__WIN32__) + + default: + wxFAIL_MSG( _T("unexpected field in wxFileData::GetEntry()") ); + } + + return s; +} + +void wxFileData::SetNewName( const wxString &filePath, const wxString &fileName ) +{ + m_fileName = fileName; + m_filePath = filePath; +} + +void wxFileData::MakeItem( wxListItem &item ) +{ + item.m_text = m_fileName; + item.ClearAttributes(); + if (IsExe()) + item.SetTextColour(*wxRED); + if (IsDir()) + item.SetTextColour(*wxBLUE); + + item.m_image = m_image; + + if (IsLink()) + { + wxColour dg = wxTheColourDatabase->Find( _T("MEDIUM GREY") ); + if ( dg.Ok() ) + item.SetTextColour(dg); + } + item.m_data = wxPtrToUInt(this); +} + +//----------------------------------------------------------------------------- +// wxFileCtrl +//----------------------------------------------------------------------------- + +static bool ignoreChanges = false; + +IMPLEMENT_DYNAMIC_CLASS(wxFileCtrl,wxListCtrl) + +BEGIN_EVENT_TABLE(wxFileCtrl,wxListCtrl) + EVT_LIST_DELETE_ITEM(wxID_ANY, wxFileCtrl::OnListDeleteItem) + EVT_LIST_DELETE_ALL_ITEMS(wxID_ANY, wxFileCtrl::OnListDeleteAllItems) + EVT_LIST_END_LABEL_EDIT(wxID_ANY, wxFileCtrl::OnListEndLabelEdit) + EVT_LIST_COL_CLICK(wxID_ANY, wxFileCtrl::OnListColClick) +END_EVENT_TABLE() + + +wxFileCtrl::wxFileCtrl() +{ + m_showHidden = false; + m_sort_foward = 1; + m_sort_field = wxFileData::FileList_Name; +} + +wxFileCtrl::wxFileCtrl(wxWindow *win, + wxWindowID id, + const wxString& wild, + bool showHidden, + const wxPoint& pos, + const wxSize& size, + long style, + const wxValidator &validator, + const wxString &name) + : wxListCtrl(win, id, pos, size, style, validator, name), + m_wild(wild) +{ + wxImageList *imageList = wxTheFileIconsTable->GetSmallImageList(); + + SetImageList( imageList, wxIMAGE_LIST_SMALL ); + + m_showHidden = showHidden; + + m_sort_foward = 1; + m_sort_field = wxFileData::FileList_Name; + + m_dirName = wxT("*"); + + if (style & wxLC_REPORT) + ChangeToReportMode(); +} + +void wxFileCtrl::ChangeToListMode() +{ + ClearAll(); + SetSingleStyle( wxLC_LIST ); + UpdateFiles(); +} + +void wxFileCtrl::ChangeToReportMode() +{ + ClearAll(); + SetSingleStyle( wxLC_REPORT ); + + // do this since WIN32 does mm/dd/yy UNIX does mm/dd/yyyy + // don't hardcode since mm/dd is dd/mm elsewhere + int w, h; + wxDateTime dt(22, wxDateTime::Dec, 2002, 22, 22, 22); + wxString txt = dt.FormatDate() + wxT("22") + dt.Format(wxT("%I:%M:%S %p")); + GetTextExtent(txt, &w, &h); + + InsertColumn( 0, _("Name"), wxLIST_FORMAT_LEFT, w ); + InsertColumn( 1, _("Size"), wxLIST_FORMAT_LEFT, w/2 ); + InsertColumn( 2, _("Type"), wxLIST_FORMAT_LEFT, w/2 ); + InsertColumn( 3, _("Modified"), wxLIST_FORMAT_LEFT, w ); +#if defined(__UNIX__) + GetTextExtent(wxT("Permissions 2"), &w, &h); + InsertColumn( 4, _("Permissions"), wxLIST_FORMAT_LEFT, w ); +#elif defined(__WIN32__) + GetTextExtent(wxT("Attributes 2"), &w, &h); + InsertColumn( 4, _("Attributes"), wxLIST_FORMAT_LEFT, w ); +#endif + + UpdateFiles(); +} + +void wxFileCtrl::ChangeToSmallIconMode() +{ + ClearAll(); + SetSingleStyle( wxLC_SMALL_ICON ); + UpdateFiles(); +} + +void wxFileCtrl::ShowHidden( bool show ) +{ + m_showHidden = show; + UpdateFiles(); +} + +long wxFileCtrl::Add( wxFileData *fd, wxListItem &item ) +{ + long ret = -1; + item.m_mask = wxLIST_MASK_TEXT + wxLIST_MASK_DATA + wxLIST_MASK_IMAGE; + fd->MakeItem( item ); + long my_style = GetWindowStyleFlag(); + if (my_style & wxLC_REPORT) + { + ret = InsertItem( item ); + for (int i = 1; i < wxFileData::FileList_Max; i++) + SetItem( item.m_itemId, i, fd->GetEntry((wxFileData::fileListFieldType)i) ); + } + else if ((my_style & wxLC_LIST) || (my_style & wxLC_SMALL_ICON)) + { + ret = InsertItem( item ); + } + return ret; +} + +void wxFileCtrl::UpdateItem(const wxListItem &item) +{ + wxFileData *fd = (wxFileData*)GetItemData(item); + wxCHECK_RET(fd, wxT("invalid filedata")); + + fd->ReadData(); + + SetItemText(item, fd->GetFileName()); + SetItemImage(item, fd->GetImageId()); + + if (GetWindowStyleFlag() & wxLC_REPORT) + { + for (int i = 1; i < wxFileData::FileList_Max; i++) + SetItem( item.m_itemId, i, fd->GetEntry((wxFileData::fileListFieldType)i) ); + } +} + +void wxFileCtrl::UpdateFiles() +{ + // don't do anything before ShowModal() call which sets m_dirName + if ( m_dirName == wxT("*") ) + return; + + wxBusyCursor bcur; // this may take a while... + + DeleteAllItems(); + + wxListItem item; + item.m_itemId = 0; + item.m_col = 0; + +#if (defined(__WINDOWS__) || defined(__DOS__) || defined(__WXMAC__) || defined(__OS2__)) && !defined(__WXWINCE__) + if ( IsTopMostDir(m_dirName) ) + { + wxArrayString names, paths; + wxArrayInt icons; + size_t n, count = wxGetAvailableDrives(paths, names, icons); + + for (n=0; nGetFilePath() ) ); + new_name += wxFILE_SEP_PATH; + new_name += event.GetLabel(); + + wxLogNull log; + + if (wxFileExists(new_name)) + { + wxMessageDialog dialog(this, _("File name exists already."), _("Error"), wxOK | wxICON_ERROR ); + dialog.ShowModal(); + event.Veto(); + } + + if (wxRenameFile(fd->GetFilePath(),new_name)) + { + fd->SetNewName( new_name, event.GetLabel() ); + + ignoreChanges = true; + SetItemState( event.GetItem(), wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED ); + ignoreChanges = false; + + UpdateItem( event.GetItem() ); + EnsureVisible( event.GetItem() ); + } + else + { + wxMessageDialog dialog(this, _("Operation not permitted."), _("Error"), wxOK | wxICON_ERROR ); + dialog.ShowModal(); + event.Veto(); + } +} + +void wxFileCtrl::OnListColClick( wxListEvent &event ) +{ + int col = event.GetColumn(); + + switch (col) + { + case wxFileData::FileList_Name : + case wxFileData::FileList_Size : + case wxFileData::FileList_Type : + case wxFileData::FileList_Time : break; + default : return; + } + + if ((wxFileData::fileListFieldType)col == m_sort_field) + m_sort_foward = !m_sort_foward; + else + m_sort_field = (wxFileData::fileListFieldType)col; + + SortItems(m_sort_field, m_sort_foward); +} + +void wxFileCtrl::SortItems(wxFileData::fileListFieldType field, bool forward) +{ + m_sort_field = field; + m_sort_foward = forward; + const long sort_dir = forward ? 1 : -1; + + switch (m_sort_field) + { + case wxFileData::FileList_Size : + wxListCtrl::SortItems(wxFileDataSizeCompare, sort_dir); + break; + + case wxFileData::FileList_Type : + wxListCtrl::SortItems(wxFileDataTypeCompare, sort_dir); + break; + + case wxFileData::FileList_Time : + wxListCtrl::SortItems(wxFileDataTimeCompare, sort_dir); + break; + + case wxFileData::FileList_Name : + default : + wxListCtrl::SortItems(wxFileDataNameCompare, sort_dir); + break; + } +} + +wxFileCtrl::~wxFileCtrl() +{ + // Normally the data are freed via an EVT_LIST_DELETE_ALL_ITEMS event and + // wxFileCtrl::OnListDeleteAllItems. But if the event is generated after + // the destruction of the wxFileCtrl we need to free any data here: + FreeAllItemsData(); +} + +//----------------------------------------------------------------------------- +// wxGenericFileDialog +//----------------------------------------------------------------------------- + +#define ID_LIST_MODE (wxID_FILEDLGG ) +#define ID_REPORT_MODE (wxID_FILEDLGG + 1) +#define ID_UP_DIR (wxID_FILEDLGG + 5) +#define ID_PARENT_DIR (wxID_FILEDLGG + 6) +#define ID_NEW_DIR (wxID_FILEDLGG + 7) +#define ID_CHOICE (wxID_FILEDLGG + 8) +#define ID_TEXT (wxID_FILEDLGG + 9) +#define ID_LIST_CTRL (wxID_FILEDLGG + 10) +#define ID_CHECK (wxID_FILEDLGG + 12) + +IMPLEMENT_DYNAMIC_CLASS(wxGenericFileDialog, wxFileDialogBase) + +BEGIN_EVENT_TABLE(wxGenericFileDialog,wxDialog) + EVT_BUTTON(ID_LIST_MODE, wxGenericFileDialog::OnList) + EVT_BUTTON(ID_REPORT_MODE, wxGenericFileDialog::OnReport) + EVT_BUTTON(ID_UP_DIR, wxGenericFileDialog::OnUp) + EVT_BUTTON(ID_PARENT_DIR, wxGenericFileDialog::OnHome) + EVT_BUTTON(ID_NEW_DIR, wxGenericFileDialog::OnNew) + EVT_BUTTON(wxID_OK, wxGenericFileDialog::OnListOk) + EVT_LIST_ITEM_SELECTED(ID_LIST_CTRL, wxGenericFileDialog::OnSelected) + EVT_LIST_ITEM_ACTIVATED(ID_LIST_CTRL, wxGenericFileDialog::OnActivated) + EVT_CHOICE(ID_CHOICE,wxGenericFileDialog::OnChoiceFilter) + EVT_TEXT_ENTER(ID_TEXT,wxGenericFileDialog::OnTextEnter) + EVT_TEXT(ID_TEXT,wxGenericFileDialog::OnTextChange) + EVT_CHECKBOX(ID_CHECK,wxGenericFileDialog::OnCheck) +END_EVENT_TABLE() + +long wxGenericFileDialog::ms_lastViewStyle = wxLC_LIST; +bool wxGenericFileDialog::ms_lastShowHidden = false; + +void wxGenericFileDialog::Init() +{ + m_bypassGenericImpl = false; + + m_choice = NULL; + m_text = NULL; + m_list = NULL; + m_check = NULL; + m_static = NULL; + m_upDirButton = NULL; + m_newDirButton = NULL; +} + +wxGenericFileDialog::wxGenericFileDialog(wxWindow *parent, + const wxString& message, + const wxString& defaultDir, + const wxString& defaultFile, + const wxString& wildCard, + long style, + const wxPoint& pos, + const wxSize& sz, + const wxString& name, + bool bypassGenericImpl ) : wxFileDialogBase() +{ + Init(); + Create( parent, message, defaultDir, defaultFile, wildCard, style, pos, sz, name, bypassGenericImpl ); +} + +bool wxGenericFileDialog::Create( wxWindow *parent, + const wxString& message, + const wxString& defaultDir, + const wxString& defaultFile, + const wxString& wildCard, + long style, + const wxPoint& pos, + const wxSize& sz, + const wxString& name, + bool bypassGenericImpl ) +{ + m_bypassGenericImpl = bypassGenericImpl; + + if (!wxFileDialogBase::Create(parent, message, defaultDir, defaultFile, + wildCard, style, pos, sz, name)) + { + return false; + } + + if (m_bypassGenericImpl) + return true; + + if (!wxDialog::Create( parent, wxID_ANY, message, pos, sz, + wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER | style, name + )) + { + return false; + } + + ignoreChanges = true; + +#if wxUSE_CONFIG + if (wxConfig::Get(false)) + { + wxConfig::Get()->Read(wxT("/wxWindows/wxFileDialog/ViewStyle"), + &ms_lastViewStyle); + wxConfig::Get()->Read(wxT("/wxWindows/wxFileDialog/ShowHidden"), + &ms_lastShowHidden); + } +#endif + + if ((m_dir.empty()) || (m_dir == wxT("."))) + { + m_dir = wxGetCwd(); + if (m_dir.empty()) + m_dir = wxFILE_SEP_PATH; + } + + size_t len = m_dir.length(); + if ((len > 1) && (wxEndsWithPathSeparator(m_dir))) + m_dir.Remove( len-1, 1 ); + + m_path = m_dir; + m_path += wxFILE_SEP_PATH; + m_path += defaultFile; + m_filterExtension = wxEmptyString; + + // layout + + bool is_pda = (wxSystemSettings::GetScreenType() <= wxSYS_SCREEN_PDA); + + wxBoxSizer *mainsizer = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer *buttonsizer = new wxBoxSizer( wxHORIZONTAL ); + + wxBitmapButton *but; + + but = new wxBitmapButton(this, ID_LIST_MODE, + wxArtProvider::GetBitmap(wxART_LIST_VIEW, wxART_BUTTON)); +#if wxUSE_TOOLTIPS + but->SetToolTip( _("View files as a list view") ); +#endif + buttonsizer->Add( but, 0, wxALL, 5 ); + + but = new wxBitmapButton(this, ID_REPORT_MODE, + wxArtProvider::GetBitmap(wxART_REPORT_VIEW, wxART_BUTTON)); +#if wxUSE_TOOLTIPS + but->SetToolTip( _("View files as a detailed view") ); +#endif + buttonsizer->Add( but, 0, wxALL, 5 ); + + buttonsizer->Add( 30, 5, 1 ); + + m_upDirButton = new wxBitmapButton(this, ID_UP_DIR, + wxArtProvider::GetBitmap(wxART_GO_DIR_UP, wxART_BUTTON)); +#if wxUSE_TOOLTIPS + m_upDirButton->SetToolTip( _("Go to parent directory") ); +#endif + buttonsizer->Add( m_upDirButton, 0, wxALL, 5 ); + +#ifndef __DOS__ // VS: Home directory is meaningless in MS-DOS... + but = new wxBitmapButton(this, ID_PARENT_DIR, + wxArtProvider::GetBitmap(wxART_GO_HOME, wxART_BUTTON)); +#if wxUSE_TOOLTIPS + but->SetToolTip( _("Go to home directory") ); +#endif + buttonsizer->Add( but, 0, wxALL, 5); + + buttonsizer->Add( 20, 20 ); +#endif //!__DOS__ + + m_newDirButton = new wxBitmapButton(this, ID_NEW_DIR, + wxArtProvider::GetBitmap(wxART_NEW_DIR, wxART_BUTTON)); +#if wxUSE_TOOLTIPS + m_newDirButton->SetToolTip( _("Create new directory") ); +#endif + buttonsizer->Add( m_newDirButton, 0, wxALL, 5 ); + + if (is_pda) + mainsizer->Add( buttonsizer, 0, wxALL | wxEXPAND, 0 ); + else + mainsizer->Add( buttonsizer, 0, wxALL | wxEXPAND, 5 ); + + wxBoxSizer *staticsizer = new wxBoxSizer( wxHORIZONTAL ); + if (is_pda) + staticsizer->Add( new wxStaticText( this, wxID_ANY, _("Current directory:") ), 0, wxRIGHT, 10 ); + m_static = new wxStaticText( this, wxID_ANY, m_dir ); + staticsizer->Add( m_static, 1 ); + mainsizer->Add( staticsizer, 0, wxEXPAND | wxLEFT|wxRIGHT|wxBOTTOM, 10 ); + + long style2 = ms_lastViewStyle; + if ( !HasFdFlag(wxFD_MULTIPLE) ) + style2 |= wxLC_SINGLE_SEL; + +#ifdef __WXWINCE__ + style2 |= wxSIMPLE_BORDER; +#else + style2 |= wxSUNKEN_BORDER; +#endif + + m_list = new wxFileCtrl( this, ID_LIST_CTRL, + wxEmptyString, ms_lastShowHidden, + wxDefaultPosition, wxSize(540,200), + style2); + + m_text = new wxTextCtrl(this, ID_TEXT, m_fileName, + wxDefaultPosition, wxDefaultSize, + wxTE_PROCESS_ENTER); + m_choice = new wxChoice(this, ID_CHOICE); + + if (is_pda) + { + // PDAs have a different screen layout + mainsizer->Add(m_list, wxSizerFlags(1).Expand().HorzBorder()); + + wxBoxSizer *textsizer = new wxBoxSizer(wxHORIZONTAL); + textsizer->Add(m_text, wxSizerFlags(1).Centre().Border()); + mainsizer->Add(textsizer, wxSizerFlags().Expand()); + + m_check = NULL; + textsizer->Add(m_choice, wxSizerFlags(1).Centre().Border()); + + wxSizer *bsizer = CreateButtonSizer(wxOK | wxCANCEL); + if ( bsizer ) + mainsizer->Add(bsizer, wxSizerFlags().Expand().Border()); + } + else // !is_pda + { + mainsizer->Add(m_list, wxSizerFlags(1).Expand().DoubleHorzBorder()); + + wxBoxSizer *textsizer = new wxBoxSizer(wxHORIZONTAL); + textsizer->Add(m_text, wxSizerFlags(1).Centre(). + DoubleBorder(wxLEFT | wxRIGHT | wxTOP)); + textsizer->Add(new wxButton(this, wxID_OK), wxSizerFlags().Centre(). + DoubleBorder(wxLEFT | wxRIGHT | wxTOP)); + mainsizer->Add(textsizer, wxSizerFlags().Expand()); + + wxSizerFlags flagsCentre; + flagsCentre.Centre().DoubleBorder(); + + wxBoxSizer *choicesizer = new wxBoxSizer(wxHORIZONTAL); + choicesizer->Add(m_choice, wxSizerFlags(flagsCentre).Proportion(1)); + + m_check = new wxCheckBox(this, ID_CHECK, _("Show &hidden files")); + m_check->SetValue(ms_lastShowHidden); + + choicesizer->Add(m_check, flagsCentre); + choicesizer->Add(new wxButton(this, wxID_CANCEL), flagsCentre); + mainsizer->Add(choicesizer, wxSizerFlags().Expand()); + } + + SetWildcard(wildCard); + + SetAutoLayout( true ); + SetSizer( mainsizer ); + + if (!is_pda) + { + mainsizer->Fit( this ); + mainsizer->SetSizeHints( this ); + + Centre( wxBOTH ); + } + + m_text->SetFocus(); + + ignoreChanges = false; + + return true; +} + +wxGenericFileDialog::~wxGenericFileDialog() +{ + ignoreChanges = true; + + if (!m_bypassGenericImpl) + { +#if wxUSE_CONFIG + if (wxConfig::Get(false)) + { + wxConfig::Get()->Write(wxT("/wxWindows/wxFileDialog/ViewStyle"), + ms_lastViewStyle); + wxConfig::Get()->Write(wxT("/wxWindows/wxFileDialog/ShowHidden"), + ms_lastShowHidden); + } +#endif + + const int count = m_choice->GetCount(); + for ( int i = 0; i < count; i++ ) + { + delete (wxString *)m_choice->GetClientData(i); + } + } +} + +int wxGenericFileDialog::ShowModal() +{ + ignoreChanges = true; + + m_list->GoToDir(m_dir); + UpdateControls(); + m_text->SetValue(m_fileName); + + ignoreChanges = false; + + return wxDialog::ShowModal(); +} + +bool wxGenericFileDialog::Show( bool show ) +{ + // Called by ShowModal, so don't repeate the update +#ifndef __WIN32__ + if (show) + { + m_list->GoToDir(m_dir); + UpdateControls(); + m_text->SetValue(m_fileName); + } +#endif + + return wxDialog::Show( show ); +} + +void wxGenericFileDialog::DoSetFilterIndex(int filterindex) +{ + wxString *str = (wxString*) m_choice->GetClientData( filterindex ); + m_list->SetWild( *str ); + m_filterIndex = filterindex; + if ( str->Left(2) == wxT("*.") ) + { + m_filterExtension = str->Mid(1); + if (m_filterExtension == _T(".*")) + m_filterExtension.clear(); + } + else + { + m_filterExtension.clear(); + } +} + +void wxGenericFileDialog::SetWildcard(const wxString& wildCard) +{ + wxFileDialogBase::SetWildcard(wildCard); + + wxArrayString wildDescriptions, wildFilters; + const size_t count = wxParseCommonDialogsFilter(m_wildCard, + wildDescriptions, + wildFilters); + wxCHECK_RET( count, wxT("wxFileDialog: bad wildcard string") ); + + const size_t countOld = m_choice->GetCount(); + size_t n; + for ( n = 0; n < countOld; n++ ) + { + delete (wxString *)m_choice->GetClientData(n); + } + + for ( n = 0; n < count; n++ ) + { + m_choice->Append( wildDescriptions[n], new wxString( wildFilters[n] ) ); + } + + SetFilterIndex( 0 ); +} + +void wxGenericFileDialog::SetFilterIndex( int filterindex ) +{ + m_choice->SetSelection( filterindex ); + + DoSetFilterIndex(filterindex); +} + +void wxGenericFileDialog::OnChoiceFilter( wxCommandEvent &event ) +{ + DoSetFilterIndex((int)event.GetInt()); +} + +void wxGenericFileDialog::OnCheck( wxCommandEvent &event ) +{ + m_list->ShowHidden( (ms_lastShowHidden = event.GetInt() != 0) ); +} + +void wxGenericFileDialog::OnActivated( wxListEvent &event ) +{ + HandleAction( event.m_item.m_text ); +} + +void wxGenericFileDialog::OnTextEnter( wxCommandEvent &WXUNUSED(event) ) +{ + HandleAction( m_text->GetValue() ); +} + +void wxGenericFileDialog::OnTextChange( wxCommandEvent &WXUNUSED(event) ) +{ + if (!ignoreChanges) + { + // Clear selections. Otherwise when the user types in a value they may + // not get the file whose name they typed. + if (m_list->GetSelectedItemCount() > 0) + { + long item = m_list->GetNextItem(-1, wxLIST_NEXT_ALL, + wxLIST_STATE_SELECTED); + while ( item != -1 ) + { + m_list->SetItemState(item,0, wxLIST_STATE_SELECTED); + item = m_list->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); + } + } + } +} + +void wxGenericFileDialog::OnSelected( wxListEvent &event ) +{ + static bool inSelected = false; + + if (inSelected) + return; + + inSelected = true; + wxString filename( event.m_item.m_text ); + +#ifdef __WXWINCE__ + // No double-click on most WinCE devices, so do action immediately. + HandleAction( filename ); +#else + if (filename == wxT("..")) + { + inSelected = false; + return; + } + + wxString dir = m_list->GetDir(); + if (!IsTopMostDir(dir)) + dir += wxFILE_SEP_PATH; + dir += filename; + if (wxDirExists(dir)) + { + inSelected = false; + return; + } + + ignoreChanges = true; + m_text->SetValue( filename ); + ignoreChanges = false; +#endif + inSelected = false; +} + +void wxGenericFileDialog::HandleAction( const wxString &fn ) +{ + if (ignoreChanges) + return; + + wxString filename( fn ); + if (filename.empty()) + { +#ifdef __WXWINCE__ + EndModal(wxID_CANCEL); +#endif + return; + } + if (filename == wxT(".")) return; + + wxString dir = m_list->GetDir(); + + // "some/place/" means they want to chdir not try to load "place" + bool want_dir = filename.Last() == wxFILE_SEP_PATH; + if (want_dir) + filename = filename.RemoveLast(); + + if (filename == wxT("..")) + { + ignoreChanges = true; + m_list->GoToParentDir(); + m_list->SetFocus(); + UpdateControls(); + ignoreChanges = false; + return; + } + +#ifdef __UNIX__ + if (filename == wxT("~")) + { + ignoreChanges = true; + m_list->GoToHomeDir(); + m_list->SetFocus(); + UpdateControls(); + ignoreChanges = false; + return; + } + + if (filename.BeforeFirst(wxT('/')) == wxT("~")) + { + filename = wxString(wxGetUserHome()) + filename.Remove(0, 1); + } +#endif // __UNIX__ + + if (!HasFdFlag(wxFD_SAVE)) + { + if ((filename.Find(wxT('*')) != wxNOT_FOUND) || + (filename.Find(wxT('?')) != wxNOT_FOUND)) + { + if (filename.Find(wxFILE_SEP_PATH) != wxNOT_FOUND) + { + wxMessageBox(_("Illegal file specification."), _("Error"), wxOK | wxICON_ERROR ); + return; + } + m_list->SetWild( filename ); + return; + } + } + + if (!IsTopMostDir(dir)) + dir += wxFILE_SEP_PATH; + if (!wxIsAbsolutePath(filename)) + { + dir += filename; + filename = dir; + } + + if (wxDirExists(filename)) + { + ignoreChanges = true; + m_list->GoToDir( filename ); + UpdateControls(); + ignoreChanges = false; + return; + } + + // they really wanted a dir, but it doesn't exist + if (want_dir) + { + wxMessageBox(_("Directory doesn't exist."), _("Error"), + wxOK | wxICON_ERROR ); + return; + } + + // append the default extension to the filename if it doesn't have any + // + // VZ: the logic of testing for !wxFileExists() only for the open file + // dialog is not entirely clear to me, why don't we allow saving to a + // file without extension as well? + if ( !HasFdFlag(wxFD_OPEN) || !wxFileExists(filename) ) + { + filename = AppendExtension(filename, m_filterExtension); + } + + // check that the file [doesn't] exist if necessary + if ( HasFdFlag(wxFD_SAVE) && HasFdFlag(wxFD_OVERWRITE_PROMPT) && + wxFileExists( filename ) ) + { + wxString msg; + msg.Printf( _("File '%s' already exists, do you really want to overwrite it?"), filename.c_str() ); + + if (wxMessageBox(msg, _("Confirm"), wxYES_NO) != wxYES) + return; + } + else if ( HasFdFlag(wxFD_OPEN) && HasFdFlag(wxFD_FILE_MUST_EXIST) && + !wxFileExists(filename) ) + { + wxMessageBox(_("Please choose an existing file."), _("Error"), + wxOK | wxICON_ERROR ); + return; + } + + SetPath( filename ); + + // change to the directory where the user went if asked + if ( HasFdFlag(wxFD_CHANGE_DIR) ) + { + wxString cwd; + wxSplitPath(filename, &cwd, NULL, NULL); + + if ( cwd != wxGetCwd() ) + { + wxSetWorkingDirectory(cwd); + } + } + + EndModal(wxID_OK); +} + +void wxGenericFileDialog::OnListOk( wxCommandEvent &WXUNUSED(event) ) +{ + HandleAction( m_text->GetValue() ); +} + +void wxGenericFileDialog::OnList( wxCommandEvent &WXUNUSED(event) ) +{ + ignoreChanges = true; + m_list->ChangeToListMode(); + ms_lastViewStyle = wxLC_LIST; + m_list->SetFocus(); + ignoreChanges = false; +} + +void wxGenericFileDialog::OnReport( wxCommandEvent &WXUNUSED(event) ) +{ + ignoreChanges = true; + m_list->ChangeToReportMode(); + ms_lastViewStyle = wxLC_REPORT; + m_list->SetFocus(); + ignoreChanges = false; +} + +void wxGenericFileDialog::OnUp( wxCommandEvent &WXUNUSED(event) ) +{ + ignoreChanges = true; + m_list->GoToParentDir(); + m_list->SetFocus(); + UpdateControls(); + ignoreChanges = false; +} + +void wxGenericFileDialog::OnHome( wxCommandEvent &WXUNUSED(event) ) +{ + ignoreChanges = true; + m_list->GoToHomeDir(); + m_list->SetFocus(); + UpdateControls(); + ignoreChanges = false; +} + +void wxGenericFileDialog::OnNew( wxCommandEvent &WXUNUSED(event) ) +{ + ignoreChanges = true; + + m_list->MakeDir(); + + ignoreChanges = false; +} + +void wxGenericFileDialog::SetPath( const wxString& path ) +{ + // not only set the full path but also update filename and dir + m_path = path; + +#ifdef __WXWINCE__ + if (m_path.empty()) + m_path = wxFILE_SEP_PATH; +#endif + + if ( !path.empty() ) + { + wxString ext; + wxSplitPath(path, &m_dir, &m_fileName, &ext); + if (!ext.empty()) + { + m_fileName += wxT("."); + m_fileName += ext; + } + } +} + +void wxGenericFileDialog::GetPaths( wxArrayString& paths ) const +{ + paths.Empty(); + if (m_list->GetSelectedItemCount() == 0) + { + paths.Add( GetPath() ); + return; + } + + paths.Alloc( m_list->GetSelectedItemCount() ); + + wxString dir = m_list->GetDir(); +#ifdef __UNIX__ + if (dir != wxT("/")) +#endif +#ifdef __WXWINCE__ + if (dir != wxT("/") && dir != wxT("\\")) +#endif + dir += wxFILE_SEP_PATH; + + wxListItem item; + item.m_mask = wxLIST_MASK_TEXT; + + item.m_itemId = m_list->GetNextItem( -1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); + while ( item.m_itemId != -1 ) + { + m_list->GetItem( item ); + paths.Add( dir + item.m_text ); + item.m_itemId = m_list->GetNextItem( item.m_itemId, + wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); + } +} + +void wxGenericFileDialog::GetFilenames(wxArrayString& files) const +{ + files.Empty(); + if (m_list->GetSelectedItemCount() == 0) + { + files.Add( GetFilename() ); + return; + } + files.Alloc( m_list->GetSelectedItemCount() ); + + wxListItem item; + item.m_mask = wxLIST_MASK_TEXT; + + item.m_itemId = m_list->GetNextItem( -1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); + while ( item.m_itemId != -1 ) + { + m_list->GetItem( item ); + files.Add( item.m_text ); + item.m_itemId = m_list->GetNextItem( item.m_itemId, + wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); + } +} + +void wxGenericFileDialog::UpdateControls() +{ + wxString dir = m_list->GetDir(); + m_static->SetLabel(dir); + + bool enable = !IsTopMostDir(dir); + m_upDirButton->Enable(enable); + +#if defined(__DOS__) || defined(__WINDOWS__) || defined(__OS2__) + m_newDirButton->Enable(enable); +#endif // defined(__DOS__) || defined(__WINDOWS__) || defined(__OS2__) +} + +#ifdef wxUSE_GENERIC_FILEDIALOG + +IMPLEMENT_DYNAMIC_CLASS(wxFileDialog, wxGenericFileDialog) + +#endif // wxUSE_GENERIC_FILEDIALOG + +#endif // wxUSE_FILEDLG diff --git a/Externals/wxWidgets/src/generic/filepickerg.cpp b/Externals/wxWidgets/src/generic/filepickerg.cpp new file mode 100644 index 0000000000..61675eebab --- /dev/null +++ b/Externals/wxWidgets/src/generic/filepickerg.cpp @@ -0,0 +1,86 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/generic/filepickerg.cpp +// Purpose: wxGenericFileDirButton class implementation +// Author: Francesco Montorsi +// Modified by: +// Created: 15/04/2006 +// RCS-ID: $Id: filepickerg.cpp 39538 2006-06-03 19:20:23Z PC $ +// Copyright: (c) Francesco Montorsi +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_FILEPICKERCTRL || wxUSE_DIRPICKERCTRL + +#include "wx/filepicker.h" + + +// ============================================================================ +// implementation +// ============================================================================ + +IMPLEMENT_DYNAMIC_CLASS(wxGenericFileButton, wxButton) +IMPLEMENT_DYNAMIC_CLASS(wxGenericDirButton, wxButton) + +// ---------------------------------------------------------------------------- +// wxGenericFileButton +// ---------------------------------------------------------------------------- + +bool wxGenericFileDirButton::Create( wxWindow *parent, wxWindowID id, + const wxString &label, const wxString &path, + const wxString &message, const wxString &wildcard, + const wxPoint &pos, const wxSize &size, long style, + const wxValidator& validator, const wxString &name) +{ + // create this button + if (!wxButton::Create(parent, id, label, pos, size, style, + validator, name)) + { + wxFAIL_MSG( wxT("wxGenericFileButton creation failed") ); + return false; + } + + // and handle user clicks on it + Connect(wxEVT_COMMAND_BUTTON_CLICKED, + wxCommandEventHandler(wxGenericFileDirButton::OnButtonClick), + NULL, this); + + // create the dialog associated with this button + m_path = path; + m_message = message; + m_wildcard = wildcard; + + return true; +} + +void wxGenericFileDirButton::OnButtonClick(wxCommandEvent& WXUNUSED(ev)) +{ + wxDialog *p = CreateDialog(); + if (p->ShowModal() == wxID_OK) + { + // save updated path in m_path + UpdatePathFromDialog(p); + + // fire an event + wxFileDirPickerEvent event(GetEventType(), this, GetId(), m_path); + GetEventHandler()->ProcessEvent(event); + } + + wxDELETE(p); +} + +#endif // wxUSE_FILEPICKERCTRL || wxUSE_DIRPICKERCTRL diff --git a/Externals/wxWidgets/src/generic/fontdlgg.cpp b/Externals/wxWidgets/src/generic/fontdlgg.cpp new file mode 100644 index 0000000000..0151c14f1d --- /dev/null +++ b/Externals/wxWidgets/src/generic/fontdlgg.cpp @@ -0,0 +1,623 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/generic/fontdlgg.cpp +// Purpose: Generic font dialog +// Author: Julian Smart +// Modified by: +// Created: 04/01/98 +// RCS-ID: $Id: fontdlgg.cpp 39627 2006-06-08 06:57:39Z ABX $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ +#pragma hdrstop +#endif + +#if wxUSE_FONTDLG && (!defined(__WXGTK__) || defined(__WXGPE__) || defined(__WXUNIVERSAL__)) + +#ifndef WX_PRECOMP + #include + #include "wx/utils.h" + #include "wx/dialog.h" + #include "wx/listbox.h" + #include "wx/button.h" + #include "wx/stattext.h" + #include "wx/layout.h" + #include "wx/dcclient.h" + #include "wx/choice.h" + #include "wx/checkbox.h" + #include "wx/intl.h" + #include "wx/settings.h" + #include "wx/cmndata.h" + #include "wx/sizer.h" +#endif + +#include +#include + +#include "wx/fontdlg.h" +#include "wx/generic/fontdlgg.h" + +#if USE_SPINCTRL_FOR_POINT_SIZE +#include "wx/spinctrl.h" +#endif + +//----------------------------------------------------------------------------- +// helper class - wxFontPreviewer +//----------------------------------------------------------------------------- + +class WXDLLEXPORT wxFontPreviewer : public wxWindow +{ +public: + wxFontPreviewer(wxWindow *parent, const wxSize& sz = wxDefaultSize) : wxWindow(parent, wxID_ANY, wxDefaultPosition, sz) + { + } + +private: + void OnPaint(wxPaintEvent& event); + DECLARE_EVENT_TABLE() +}; + +BEGIN_EVENT_TABLE(wxFontPreviewer, wxWindow) + EVT_PAINT(wxFontPreviewer::OnPaint) +END_EVENT_TABLE() + +void wxFontPreviewer::OnPaint(wxPaintEvent& WXUNUSED(event)) +{ + wxPaintDC dc(this); + + wxSize size = GetSize(); + wxFont font = GetFont(); + + dc.SetPen(*wxBLACK_PEN); + dc.SetBrush(*wxWHITE_BRUSH); + dc.DrawRectangle(0, 0, size.x, size.y); + + if ( font.Ok() ) + { + dc.SetFont(font); + // Calculate vertical centre + long w = 0, h = 0; + dc.GetTextExtent( wxT("X"), &w, &h); + dc.SetTextForeground(GetForegroundColour()); + dc.SetClippingRegion(2, 2, size.x-4, size.y-4); + dc.DrawText(_("ABCDEFGabcdefg12345"), + 10, size.y/2 - h/2); + dc.DestroyClippingRegion(); + } +} + +//----------------------------------------------------------------------------- +// wxGenericFontDialog +//----------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxGenericFontDialog, wxDialog) + +BEGIN_EVENT_TABLE(wxGenericFontDialog, wxDialog) + EVT_CHECKBOX(wxID_FONT_UNDERLINE, wxGenericFontDialog::OnChangeFont) + EVT_CHOICE(wxID_FONT_STYLE, wxGenericFontDialog::OnChangeFont) + EVT_CHOICE(wxID_FONT_WEIGHT, wxGenericFontDialog::OnChangeFont) + EVT_CHOICE(wxID_FONT_FAMILY, wxGenericFontDialog::OnChangeFont) + EVT_CHOICE(wxID_FONT_COLOUR, wxGenericFontDialog::OnChangeFont) +#if USE_SPINCTRL_FOR_POINT_SIZE + EVT_SPINCTRL(wxID_FONT_SIZE, wxGenericFontDialog::OnChangeSize) + EVT_TEXT(wxID_FONT_SIZE, wxGenericFontDialog::OnChangeFont) +#else + EVT_CHOICE(wxID_FONT_SIZE, wxGenericFontDialog::OnChangeFont) +#endif + EVT_CLOSE(wxGenericFontDialog::OnCloseWindow) +END_EVENT_TABLE() + + +#define NUM_COLS 48 +static wxString wxColourDialogNames[NUM_COLS]={wxT("ORANGE"), + wxT("GOLDENROD"), + wxT("WHEAT"), + wxT("SPRING GREEN"), + wxT("SKY BLUE"), + wxT("SLATE BLUE"), + wxT("MEDIUM VIOLET RED"), + wxT("PURPLE"), + + wxT("RED"), + wxT("YELLOW"), + wxT("MEDIUM SPRING GREEN"), + wxT("PALE GREEN"), + wxT("CYAN"), + wxT("LIGHT STEEL BLUE"), + wxT("ORCHID"), + wxT("LIGHT MAGENTA"), + + wxT("BROWN"), + wxT("YELLOW"), + wxT("GREEN"), + wxT("CADET BLUE"), + wxT("MEDIUM BLUE"), + wxT("MAGENTA"), + wxT("MAROON"), + wxT("ORANGE RED"), + + wxT("FIREBRICK"), + wxT("CORAL"), + wxT("FOREST GREEN"), + wxT("AQUARAMINE"), + wxT("BLUE"), + wxT("NAVY"), + wxT("THISTLE"), + wxT("MEDIUM VIOLET RED"), + + wxT("INDIAN RED"), + wxT("GOLD"), + wxT("MEDIUM SEA GREEN"), + wxT("MEDIUM BLUE"), + wxT("MIDNIGHT BLUE"), + wxT("GREY"), + wxT("PURPLE"), + wxT("KHAKI"), + + wxT("BLACK"), + wxT("MEDIUM FOREST GREEN"), + wxT("KHAKI"), + wxT("DARK GREY"), + wxT("SEA GREEN"), + wxT("LIGHT GREY"), + wxT("MEDIUM SLATE BLUE"), + wxT("WHITE") + }; + +/* + * Generic wxFontDialog + */ + +void wxGenericFontDialog::Init() +{ + m_useEvents = false; + m_previewer = NULL; + Create( m_parent ) ; +} + +wxGenericFontDialog::~wxGenericFontDialog() +{ +} + +void wxGenericFontDialog::OnCloseWindow(wxCloseEvent& WXUNUSED(event)) +{ + EndModal(wxID_CANCEL); +} + +bool wxGenericFontDialog::DoCreate(wxWindow *parent) +{ + if ( !wxDialog::Create( parent , wxID_ANY , _T("Choose Font") , wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE, + _T("fontdialog") ) ) + { + wxFAIL_MSG( wxT("wxFontDialog creation failed") ); + return false; + } + + InitializeFont(); + CreateWidgets(); + + // sets initial font in preview area + DoChangeFont(); + + return true; +} + +int wxGenericFontDialog::ShowModal() +{ + int ret = wxDialog::ShowModal(); + + if (ret != wxID_CANCEL) + { + m_fontData.m_chosenFont = m_dialogFont; + } + + return ret; +} + +// This should be application-settable +static bool ShowToolTips() { return false; } + +void wxGenericFontDialog::CreateWidgets() +{ + wxString *families = new wxString[6], + *styles = new wxString[3], + *weights = new wxString[3]; + families[0] = _("Roman"); + families[1] = _("Decorative"); + families[2] = _("Modern"); + families[3] = _("Script"); + families[4] = _("Swiss" ); + families[5] = _("Teletype" ); + styles[0] = _("Normal"); + styles[1] = _("Italic"); + styles[2] = _("Slant"); + weights[0] = _("Normal"); + weights[1] = _("Light"); + weights[2] = _("Bold"); + +#if !USE_SPINCTRL_FOR_POINT_SIZE + wxString *pointSizes = new wxString[40]; + int i; + for ( i = 0; i < 40; i++) + { + wxChar buf[5]; + wxSprintf(buf, wxT("%d"), i + 1); + pointSizes[i] = buf; + } +#endif + + // layout + + bool is_pda = (wxSystemSettings::GetScreenType() <= wxSYS_SCREEN_PDA); + int noCols, noRows; + if (is_pda) + { + noCols = 2; noRows = 3; + } + else + { + noCols = 3; noRows = 2; + } + + wxBoxSizer* itemBoxSizer2 = new wxBoxSizer(wxVERTICAL); + this->SetSizer(itemBoxSizer2); + this->SetAutoLayout(true); + + wxBoxSizer* itemBoxSizer3 = new wxBoxSizer(wxVERTICAL); + itemBoxSizer2->Add(itemBoxSizer3, 1, wxGROW|wxALL, 5); + + wxFlexGridSizer* itemGridSizer4 = new wxFlexGridSizer(noRows, noCols, 0, 0); + itemBoxSizer3->Add(itemGridSizer4, 0, wxGROW, 5); + + wxBoxSizer* itemBoxSizer5 = new wxBoxSizer(wxVERTICAL); + itemGridSizer4->Add(itemBoxSizer5, 0, wxALIGN_CENTER_HORIZONTAL|wxGROW, 5); + wxStaticText* itemStaticText6 = new wxStaticText( this, wxID_STATIC, _("&Font family:"), wxDefaultPosition, wxDefaultSize, 0 ); + itemBoxSizer5->Add(itemStaticText6, 0, wxALIGN_LEFT|wxLEFT|wxRIGHT|wxTOP|wxADJUST_MINSIZE, 5); + + wxChoice* itemChoice7 = new wxChoice( this, wxID_FONT_FAMILY, wxDefaultPosition, wxDefaultSize, 5, families, 0 ); + itemChoice7->SetHelpText(_("The font family.")); + if (ShowToolTips()) + itemChoice7->SetToolTip(_("The font family.")); + itemBoxSizer5->Add(itemChoice7, 0, wxALIGN_LEFT|wxALL, 5); + + wxBoxSizer* itemBoxSizer8 = new wxBoxSizer(wxVERTICAL); + itemGridSizer4->Add(itemBoxSizer8, 0, wxALIGN_CENTER_HORIZONTAL|wxGROW, 5); + wxStaticText* itemStaticText9 = new wxStaticText( this, wxID_STATIC, _("&Style:"), wxDefaultPosition, wxDefaultSize, 0 ); + itemBoxSizer8->Add(itemStaticText9, 0, wxALIGN_LEFT|wxLEFT|wxRIGHT|wxTOP|wxADJUST_MINSIZE, 5); + + wxChoice* itemChoice10 = new wxChoice( this, wxID_FONT_STYLE, wxDefaultPosition, wxDefaultSize, 3, styles, 0 ); + itemChoice10->SetHelpText(_("The font style.")); + if (ShowToolTips()) + itemChoice10->SetToolTip(_("The font style.")); + itemBoxSizer8->Add(itemChoice10, 0, wxALIGN_LEFT|wxALL, 5); + + wxBoxSizer* itemBoxSizer11 = new wxBoxSizer(wxVERTICAL); + itemGridSizer4->Add(itemBoxSizer11, 0, wxALIGN_CENTER_HORIZONTAL|wxGROW, 5); + wxStaticText* itemStaticText12 = new wxStaticText( this, wxID_STATIC, _("&Weight:"), wxDefaultPosition, wxDefaultSize, 0 ); + itemBoxSizer11->Add(itemStaticText12, 0, wxALIGN_LEFT|wxLEFT|wxRIGHT|wxTOP|wxADJUST_MINSIZE, 5); + + wxChoice* itemChoice13 = new wxChoice( this, wxID_FONT_WEIGHT, wxDefaultPosition, wxDefaultSize, 3, weights, 0 ); + itemChoice13->SetHelpText(_("The font weight.")); + if (ShowToolTips()) + itemChoice13->SetToolTip(_("The font weight.")); + itemBoxSizer11->Add(itemChoice13, 0, wxALIGN_LEFT|wxALL, 5); + + wxBoxSizer* itemBoxSizer14 = new wxBoxSizer(wxVERTICAL); + itemGridSizer4->Add(itemBoxSizer14, 0, wxALIGN_CENTER_HORIZONTAL|wxGROW, 5); + if (m_fontData.GetEnableEffects()) + { + wxStaticText* itemStaticText15 = new wxStaticText( this, wxID_STATIC, _("C&olour:"), wxDefaultPosition, wxDefaultSize, 0 ); + itemBoxSizer14->Add(itemStaticText15, 0, wxALIGN_LEFT|wxLEFT|wxRIGHT|wxTOP|wxADJUST_MINSIZE, 5); + + wxSize colourSize = wxDefaultSize; + if (is_pda) + colourSize.x = 100; + + wxChoice* itemChoice16 = new wxChoice( this, wxID_FONT_COLOUR, wxDefaultPosition, colourSize, NUM_COLS, wxColourDialogNames, 0 ); + itemChoice16->SetHelpText(_("The font colour.")); + if (ShowToolTips()) + itemChoice16->SetToolTip(_("The font colour.")); + itemBoxSizer14->Add(itemChoice16, 0, wxALIGN_LEFT|wxALL, 5); + } + + wxBoxSizer* itemBoxSizer17 = new wxBoxSizer(wxVERTICAL); + itemGridSizer4->Add(itemBoxSizer17, 0, wxALIGN_CENTER_HORIZONTAL|wxGROW, 5); + wxStaticText* itemStaticText18 = new wxStaticText( this, wxID_STATIC, _("&Point size:"), wxDefaultPosition, wxDefaultSize, 0 ); + itemBoxSizer17->Add(itemStaticText18, 0, wxALIGN_LEFT|wxLEFT|wxRIGHT|wxTOP|wxADJUST_MINSIZE, 5); + +#if USE_SPINCTRL_FOR_POINT_SIZE + wxSpinCtrl* spinCtrl = new wxSpinCtrl(this, wxID_FONT_SIZE, wxT("12"), wxDefaultPosition, wxSize(80, wxDefaultCoord), wxSP_ARROW_KEYS, 1, 500, 12); + spinCtrl->SetHelpText(_("The font point size.")); + if (ShowToolTips()) + spinCtrl->SetToolTip(_("The font point size.")); + + itemBoxSizer17->Add(spinCtrl, 0, wxALIGN_LEFT|wxALL, 5); +#else + wxChoice* itemChoice19 = new wxChoice( this, wxID_FONT_SIZE, wxDefaultPosition, wxDefaultSize, 40, pointSizes, 0 ); + itemChoice19->SetHelpText(_("The font point size.")); + if (ShowToolTips()) + itemChoice19->SetToolTip(_("The font point size.")); + itemBoxSizer17->Add(itemChoice19, 0, wxALIGN_LEFT|wxALL, 5); +#endif + + if (m_fontData.GetEnableEffects()) + { + wxBoxSizer* itemBoxSizer20 = new wxBoxSizer(wxVERTICAL); + itemGridSizer4->Add(itemBoxSizer20, 0, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL, 5); + wxCheckBox* itemCheckBox21 = new wxCheckBox( this, wxID_FONT_UNDERLINE, _("&Underline"), wxDefaultPosition, wxDefaultSize, 0 ); + itemCheckBox21->SetValue(false); + itemCheckBox21->SetHelpText(_("Whether the font is underlined.")); + if (ShowToolTips()) + itemCheckBox21->SetToolTip(_("Whether the font is underlined.")); + itemBoxSizer20->Add(itemCheckBox21, 0, wxALIGN_LEFT|wxALL, 5); + } + + if (!is_pda) + itemBoxSizer3->Add(5, 5, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5); + + wxStaticText* itemStaticText23 = new wxStaticText( this, wxID_STATIC, _("Preview:"), wxDefaultPosition, wxDefaultSize, 0 ); + itemBoxSizer3->Add(itemStaticText23, 0, wxALIGN_LEFT|wxLEFT|wxRIGHT|wxTOP|wxADJUST_MINSIZE, 5); + + wxFontPreviewer* itemWindow24 = new wxFontPreviewer( this ); + m_previewer = itemWindow24; + itemWindow24->SetHelpText(_("Shows the font preview.")); + if (ShowToolTips()) + itemWindow24->SetToolTip(_("Shows the font preview.")); + itemBoxSizer3->Add(itemWindow24, 1, wxGROW|wxALL, 5); + + wxBoxSizer* itemBoxSizer25 = new wxBoxSizer(wxHORIZONTAL); + itemBoxSizer3->Add(itemBoxSizer25, 0, wxGROW, 5); + itemBoxSizer25->Add(5, 5, 1, wxGROW|wxALL, 5); + +#ifdef __WXMAC__ + wxButton* itemButton28 = new wxButton( this, wxID_CANCEL, _("&Cancel"), wxDefaultPosition, wxDefaultSize, 0 ); + if (ShowToolTips()) + itemButton28->SetToolTip(_("Click to cancel the font selection.")); + itemBoxSizer25->Add(itemButton28, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5); + + wxButton* itemButton27 = new wxButton( this, wxID_OK, _("&OK"), wxDefaultPosition, wxDefaultSize, 0 ); + itemButton27->SetDefault(); + itemButton27->SetHelpText(_("Click to confirm the font selection.")); + if (ShowToolTips()) + itemButton27->SetToolTip(_("Click to confirm the font selection.")); + itemBoxSizer25->Add(itemButton27, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5); +#else + wxButton* itemButton27 = new wxButton( this, wxID_OK, _("&OK"), wxDefaultPosition, wxDefaultSize, 0 ); + itemButton27->SetDefault(); + itemButton27->SetHelpText(_("Click to confirm the font selection.")); + if (ShowToolTips()) + itemButton27->SetToolTip(_("Click to confirm the font selection.")); + itemBoxSizer25->Add(itemButton27, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5); + + wxButton* itemButton28 = new wxButton( this, wxID_CANCEL, _("&Cancel"), wxDefaultPosition, wxDefaultSize, 0 ); + if (ShowToolTips()) + itemButton28->SetToolTip(_("Click to cancel the font selection.")); + itemBoxSizer25->Add(itemButton28, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5); +#endif + + m_familyChoice = (wxChoice*) FindWindow(wxID_FONT_FAMILY); + m_styleChoice = (wxChoice*) FindWindow(wxID_FONT_STYLE); + m_weightChoice = (wxChoice*) FindWindow(wxID_FONT_WEIGHT); + m_colourChoice = (wxChoice*) FindWindow(wxID_FONT_COLOUR); + m_underLineCheckBox = (wxCheckBox*) FindWindow(wxID_FONT_UNDERLINE); + + m_familyChoice->SetStringSelection( wxFontFamilyIntToString(m_dialogFont.GetFamily()) ); + m_styleChoice->SetStringSelection(wxFontStyleIntToString(m_dialogFont.GetStyle())); + m_weightChoice->SetStringSelection(wxFontWeightIntToString(m_dialogFont.GetWeight())); + + if (m_colourChoice) + { + wxString name(wxTheColourDatabase->FindName(m_fontData.GetColour())); + if (name.length()) + m_colourChoice->SetStringSelection(name); + else + m_colourChoice->SetStringSelection(wxT("BLACK")); + } + + if (m_underLineCheckBox) + { + m_underLineCheckBox->SetValue(m_dialogFont.GetUnderlined()); + } + +#if USE_SPINCTRL_FOR_POINT_SIZE + spinCtrl->SetValue(m_dialogFont.GetPointSize()); +#else + m_pointSizeChoice = (wxChoice*) FindWindow(wxID_FONT_SIZE); + m_pointSizeChoice->SetSelection(m_dialogFont.GetPointSize()-1); +#endif + + GetSizer()->SetItemMinSize(m_previewer, is_pda ? 100 : 430, is_pda ? 40 : 100); + GetSizer()->SetSizeHints(this); + GetSizer()->Fit(this); + + Centre(wxBOTH); + + delete[] families; + delete[] styles; + delete[] weights; +#if !USE_SPINCTRL_FOR_POINT_SIZE + delete[] pointSizes; +#endif + + // Don't block events any more + m_useEvents = true; + +} + +void wxGenericFontDialog::InitializeFont() +{ + int fontFamily = wxSWISS; + int fontWeight = wxNORMAL; + int fontStyle = wxNORMAL; + int fontSize = 12; + bool fontUnderline = false; + + if (m_fontData.m_initialFont.Ok()) + { + fontFamily = m_fontData.m_initialFont.GetFamily(); + fontWeight = m_fontData.m_initialFont.GetWeight(); + fontStyle = m_fontData.m_initialFont.GetStyle(); + fontSize = m_fontData.m_initialFont.GetPointSize(); + fontUnderline = m_fontData.m_initialFont.GetUnderlined(); + } + + m_dialogFont = wxFont(fontSize, fontFamily, fontStyle, + fontWeight, fontUnderline); + + if (m_previewer) + m_previewer->SetFont(m_dialogFont); +} + +void wxGenericFontDialog::OnChangeFont(wxCommandEvent& WXUNUSED(event)) +{ + DoChangeFont(); +} + +void wxGenericFontDialog::DoChangeFont() +{ + if (!m_useEvents) return; + + int fontFamily = wxFontFamilyStringToInt(WXSTRINGCAST m_familyChoice->GetStringSelection()); + int fontWeight = wxFontWeightStringToInt(WXSTRINGCAST m_weightChoice->GetStringSelection()); + int fontStyle = wxFontStyleStringToInt(WXSTRINGCAST m_styleChoice->GetStringSelection()); +#if USE_SPINCTRL_FOR_POINT_SIZE + wxSpinCtrl* fontSizeCtrl = wxDynamicCast(FindWindow(wxID_FONT_SIZE), wxSpinCtrl); + int fontSize = fontSizeCtrl->GetValue(); +#else + int fontSize = wxAtoi(m_pointSizeChoice->GetStringSelection()); +#endif + + // Start with previous underline setting, we want to retain it even if we can't edit it + // m_dialogFont is always initialized because of the call to InitializeFont + int fontUnderline = m_dialogFont.GetUnderlined(); + + if (m_underLineCheckBox) + { + fontUnderline = m_underLineCheckBox->GetValue(); + } + + m_dialogFont = wxFont(fontSize, fontFamily, fontStyle, fontWeight, (fontUnderline != 0)); + m_previewer->SetFont(m_dialogFont); + + if ( m_colourChoice ) + { + if ( !m_colourChoice->GetStringSelection().empty() ) + { + wxColour col = wxTheColourDatabase->Find(m_colourChoice->GetStringSelection()); + if (col.Ok()) + { + m_fontData.m_fontColour = col; + } + } + } + // Update color here so that we can also use the color originally passed in + // (EnableEffects may be false) + if (m_fontData.m_fontColour.Ok()) + m_previewer->SetForegroundColour(m_fontData.m_fontColour); + + m_previewer->Refresh(); +} + +#if USE_SPINCTRL_FOR_POINT_SIZE +void wxGenericFontDialog::OnChangeSize(wxSpinEvent& WXUNUSED(event)) +{ + DoChangeFont(); +} +#endif + +const wxChar *wxFontWeightIntToString(int weight) +{ + switch (weight) + { + case wxLIGHT: + return wxT("Light"); + case wxBOLD: + return wxT("Bold"); + case wxNORMAL: + default: + return wxT("Normal"); + } +} + +const wxChar *wxFontStyleIntToString(int style) +{ + switch (style) + { + case wxITALIC: + return wxT("Italic"); + case wxSLANT: + return wxT("Slant"); + case wxNORMAL: + default: + return wxT("Normal"); + } +} + +const wxChar *wxFontFamilyIntToString(int family) +{ + switch (family) + { + case wxROMAN: + return wxT("Roman"); + case wxDECORATIVE: + return wxT("Decorative"); + case wxMODERN: + return wxT("Modern"); + case wxSCRIPT: + return wxT("Script"); + case wxTELETYPE: + return wxT("Teletype"); + case wxSWISS: + default: + return wxT("Swiss"); + } +} + +int wxFontFamilyStringToInt(wxChar *family) +{ + if (!family) + return wxSWISS; + + if (wxStrcmp(family, wxT("Roman")) == 0) + return wxROMAN; + else if (wxStrcmp(family, wxT("Decorative")) == 0) + return wxDECORATIVE; + else if (wxStrcmp(family, wxT("Modern")) == 0) + return wxMODERN; + else if (wxStrcmp(family, wxT("Script")) == 0) + return wxSCRIPT; + else if (wxStrcmp(family, wxT("Teletype")) == 0) + return wxTELETYPE; + else return wxSWISS; +} + +int wxFontStyleStringToInt(wxChar *style) +{ + if (!style) + return wxNORMAL; + if (wxStrcmp(style, wxT("Italic")) == 0) + return wxITALIC; + else if (wxStrcmp(style, wxT("Slant")) == 0) + return wxSLANT; + else + return wxNORMAL; +} + +int wxFontWeightStringToInt(wxChar *weight) +{ + if (!weight) + return wxNORMAL; + if (wxStrcmp(weight, wxT("Bold")) == 0) + return wxBOLD; + else if (wxStrcmp(weight, wxT("Light")) == 0) + return wxLIGHT; + else + return wxNORMAL; +} + +#endif + // wxUSE_FONTDLG diff --git a/Externals/wxWidgets/src/generic/fontpickerg.cpp b/Externals/wxWidgets/src/generic/fontpickerg.cpp new file mode 100644 index 0000000000..cde6821bba --- /dev/null +++ b/Externals/wxWidgets/src/generic/fontpickerg.cpp @@ -0,0 +1,120 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/generic/fontpickerg.cpp +// Purpose: wxGenericFontButton class implementation +// Author: Francesco Montorsi +// Modified by: +// Created: 15/04/2006 +// RCS-ID: $Id: fontpickerg.cpp 42999 2006-11-03 21:54:13Z VZ $ +// Copyright: (c) Francesco Montorsi +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_FONTPICKERCTRL + +#include "wx/fontpicker.h" + +#include "wx/fontdlg.h" + + +// ============================================================================ +// implementation +// ============================================================================ + +wxFontData wxGenericFontButton::ms_data; +IMPLEMENT_DYNAMIC_CLASS(wxGenericFontButton, wxButton) + +// ---------------------------------------------------------------------------- +// wxGenericFontButton +// ---------------------------------------------------------------------------- + +bool wxGenericFontButton::Create( wxWindow *parent, wxWindowID id, + const wxFont &initial, const wxPoint &pos, + const wxSize &size, long style, + const wxValidator& validator, const wxString &name) +{ + wxString label = (style & wxFNTP_FONTDESC_AS_LABEL) ? + wxEmptyString : // label will be updated by UpdateFont + wxT("Choose font"); + + // create this button + if (!wxButton::Create( parent, id, label, pos, + size, style, validator, name )) + { + wxFAIL_MSG( wxT("wxGenericFontButton creation failed") ); + return false; + } + + // and handle user clicks on it + Connect(wxEVT_COMMAND_BUTTON_CLICKED, + wxCommandEventHandler(wxGenericFontButton::OnButtonClick), + NULL, this); + + m_selectedFont = initial.IsOk() ? initial : *wxNORMAL_FONT; + UpdateFont(); + InitFontData(); + + return true; +} + +void wxGenericFontButton::InitFontData() +{ + ms_data.SetAllowSymbols(true); + ms_data.SetColour(*wxBLACK); + ms_data.EnableEffects(true); +} + +void wxGenericFontButton::OnButtonClick(wxCommandEvent& WXUNUSED(ev)) +{ + // update the wxFontData to be shown in the the dialog + ms_data.SetInitialFont(m_selectedFont); + + // create the font dialog and display it + wxFontDialog dlg(this, ms_data); + if (dlg.ShowModal() == wxID_OK) + { + ms_data = dlg.GetFontData(); + SetSelectedFont(ms_data.GetChosenFont()); + + // fire an event + wxFontPickerEvent event(this, GetId(), m_selectedFont); + GetEventHandler()->ProcessEvent(event); + } +} + +void wxGenericFontButton::UpdateFont() +{ + if ( !m_selectedFont.Ok() ) + return; + + SetForegroundColour(ms_data.GetColour()); + + if (HasFlag(wxFNTP_USEFONT_FOR_LABEL)) + { + // use currently selected font for the label... + wxButton::SetFont(m_selectedFont); + } + + if (HasFlag(wxFNTP_FONTDESC_AS_LABEL)) + { + SetLabel(wxString::Format(wxT("%s, %d"), + m_selectedFont.GetFaceName().c_str(), + m_selectedFont.GetPointSize())); + } +} + +#endif // wxUSE_FONTPICKERCTRL diff --git a/Externals/wxWidgets/src/generic/graphicc.cpp b/Externals/wxWidgets/src/generic/graphicc.cpp new file mode 100644 index 0000000000..f203e70498 --- /dev/null +++ b/Externals/wxWidgets/src/generic/graphicc.cpp @@ -0,0 +1,1510 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/generic/graphicc.cpp +// Purpose: cairo device context class +// Author: Stefan Csomor +// Modified by: +// Created: 2006-10-03 +// RCS-ID: $Id: graphicc.cpp 44597 2007-03-02 16:39:21Z RD $ +// Copyright: (c) 2006 Stefan Csomor +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#include "wx/wxprec.h" + +#include "wx/dc.h" + +#ifdef __BORLANDC__ +#pragma hdrstop +#endif + +#ifndef WX_PRECOMP +#include "wx/image.h" +#include "wx/window.h" +#include "wx/dc.h" +#include "wx/utils.h" +#include "wx/dialog.h" +#include "wx/app.h" +#include "wx/bitmap.h" +#include "wx/dcmemory.h" +#include "wx/log.h" +#include "wx/icon.h" +#include "wx/dcprint.h" +#include "wx/module.h" +#endif + +#ifdef __WXGTK__ +#include "wx/gtk/win_gtk.h" +#endif + +#include "wx/graphics.h" +#include "wx/rawbmp.h" + +#if wxUSE_GRAPHICS_CONTEXT + +#include + +using namespace std; + +//----------------------------------------------------------------------------- +// constants +//----------------------------------------------------------------------------- + +const double RAD2DEG = 180.0 / M_PI; + +//----------------------------------------------------------------------------- +// Local functions +//----------------------------------------------------------------------------- + +static inline double dmin(double a, double b) +{ + return a < b ? a : b; +} +static inline double dmax(double a, double b) +{ + return a > b ? a : b; +} + +static inline double DegToRad(double deg) +{ + return (deg * M_PI) / 180.0; +} +static inline double RadToDeg(double deg) +{ + return (deg * 180.0) / M_PI; +} + +//----------------------------------------------------------------------------- +// device context implementation +// +// more and more of the dc functionality should be implemented by calling +// the appropricate wxCairoContext, but we will have to do that step by step +// also coordinate conversions should be moved to native matrix ops +//----------------------------------------------------------------------------- + +// we always stock two context states, one at entry, to be able to preserve the +// state we were called with, the other one after changing to HI Graphics orientation +// (this one is used for getting back clippings etc) + +//----------------------------------------------------------------------------- +// wxGraphicsPath implementation +//----------------------------------------------------------------------------- + +// TODO remove this dependency (gdiplus needs the macros) + +#ifndef max +#define max(a,b) (((a) > (b)) ? (a) : (b)) +#endif + +#ifndef min +#define min(a,b) (((a) < (b)) ? (a) : (b)) +#endif + +#include +#ifdef __WXGTK__ +#include +#endif + +class WXDLLIMPEXP_CORE wxCairoPathData : public wxGraphicsPathData +{ +public : + wxCairoPathData(wxGraphicsRenderer* renderer, cairo_t* path = NULL); + ~wxCairoPathData(); + + virtual wxGraphicsObjectRefData *Clone() const; + + // + // These are the path primitives from which everything else can be constructed + // + + // begins a new subpath at (x,y) + virtual void MoveToPoint( wxDouble x, wxDouble y ); + + // adds a straight line from the current point to (x,y) + virtual void AddLineToPoint( wxDouble x, wxDouble y ); + + // adds a cubic Bezier curve from the current point, using two control points and an end point + virtual void AddCurveToPoint( wxDouble cx1, wxDouble cy1, wxDouble cx2, wxDouble cy2, wxDouble x, wxDouble y ); + + + // adds an arc of a circle centering at (x,y) with radius (r) from startAngle to endAngle + virtual void AddArc( wxDouble x, wxDouble y, wxDouble r, wxDouble startAngle, wxDouble endAngle, bool clockwise ) ; + + // gets the last point of the current path, (0,0) if not yet set + virtual void GetCurrentPoint( wxDouble* x, wxDouble* y) const; + + // adds another path + virtual void AddPath( const wxGraphicsPathData* path ); + + // closes the current sub-path + virtual void CloseSubpath(); + + // + // These are convenience functions which - if not available natively will be assembled + // using the primitives from above + // + + /* + + // appends a rectangle as a new closed subpath + virtual void AddRectangle( wxDouble x, wxDouble y, wxDouble w, wxDouble h ) ; + // appends an ellipsis as a new closed subpath fitting the passed rectangle + virtual void AddEllipsis( wxDouble x, wxDouble y, wxDouble w , wxDouble h ) ; + + // draws a an arc to two tangents connecting (current) to (x1,y1) and (x1,y1) to (x2,y2), also a straight line from (current) to (x1,y1) + virtual void AddArcToPoint( wxDouble x1, wxDouble y1 , wxDouble x2, wxDouble y2, wxDouble r ) ; + */ + + // returns the native path + virtual void * GetNativePath() const ; + + // give the native path returned by GetNativePath() back (there might be some deallocations necessary) + virtual void UnGetNativePath(void *p) const; + + // transforms each point of this path by the matrix + virtual void Transform( const wxGraphicsMatrixData* matrix ) ; + + // gets the bounding box enclosing all points (possibly including control points) + virtual void GetBox(wxDouble *x, wxDouble *y, wxDouble *w, wxDouble *h) const; + + virtual bool Contains( wxDouble x, wxDouble y, int fillStyle = wxWINDING_RULE) const; + +private : + cairo_t* m_pathContext; +}; + +class WXDLLIMPEXP_CORE wxCairoMatrixData : public wxGraphicsMatrixData +{ +public : + wxCairoMatrixData(wxGraphicsRenderer* renderer, const cairo_matrix_t* matrix = NULL ) ; + virtual ~wxCairoMatrixData() ; + + virtual wxGraphicsObjectRefData *Clone() const ; + + // concatenates the matrix + virtual void Concat( const wxGraphicsMatrixData *t ); + + // sets the matrix to the respective values + virtual void Set(wxDouble a=1.0, wxDouble b=0.0, wxDouble c=0.0, wxDouble d=1.0, + wxDouble tx=0.0, wxDouble ty=0.0); + + // gets the component valuess of the matrix + virtual void Get(wxDouble* a=NULL, wxDouble* b=NULL, wxDouble* c=NULL, + wxDouble* d=NULL, wxDouble* tx=NULL, wxDouble* ty=NULL) const; + + // makes this the inverse matrix + virtual void Invert(); + + // returns true if the elements of the transformation matrix are equal ? + virtual bool IsEqual( const wxGraphicsMatrixData* t) const ; + + // return true if this is the identity matrix + virtual bool IsIdentity() const; + + // + // transformation + // + + // add the translation to this matrix + virtual void Translate( wxDouble dx , wxDouble dy ); + + // add the scale to this matrix + virtual void Scale( wxDouble xScale , wxDouble yScale ); + + // add the rotation to this matrix (radians) + virtual void Rotate( wxDouble angle ); + + // + // apply the transforms + // + + // applies that matrix to the point + virtual void TransformPoint( wxDouble *x, wxDouble *y ) const; + + // applies the matrix except for translations + virtual void TransformDistance( wxDouble *dx, wxDouble *dy ) const; + + // returns the native representation + virtual void * GetNativeMatrix() const; +private: + cairo_matrix_t m_matrix ; +} ; + +class WXDLLIMPEXP_CORE wxCairoPenData : public wxGraphicsObjectRefData +{ +public: + wxCairoPenData( wxGraphicsRenderer* renderer, const wxPen &pen ); + ~wxCairoPenData(); + + void Init(); + + virtual void Apply( wxGraphicsContext* context ); + virtual wxDouble GetWidth() { return m_width; } + +private : + double m_width; + + double m_red; + double m_green; + double m_blue; + double m_alpha; + + cairo_line_cap_t m_cap; + cairo_line_join_t m_join; + + int m_count; + const double *m_lengths; + double *m_userLengths; + + wxPen m_pen; +}; + +class WXDLLIMPEXP_CORE wxCairoBrushData : public wxGraphicsObjectRefData +{ +public: + wxCairoBrushData( wxGraphicsRenderer* renderer ); + wxCairoBrushData( wxGraphicsRenderer* renderer, const wxBrush &brush ); + ~wxCairoBrushData (); + + virtual void Apply( wxGraphicsContext* context ); + void CreateLinearGradientBrush( wxDouble x1, wxDouble y1, wxDouble x2, wxDouble y2, + const wxColour&c1, const wxColour&c2 ); + void CreateRadialGradientBrush( wxDouble xo, wxDouble yo, wxDouble xc, wxDouble yc, wxDouble radius, + const wxColour &oColor, const wxColour &cColor ); + +protected: + virtual void Init(); + +private : + double m_red; + double m_green; + double m_blue; + double m_alpha; + + cairo_pattern_t* m_brushPattern; +}; + +class wxCairoFontData : public wxGraphicsObjectRefData +{ +public: + wxCairoFontData( wxGraphicsRenderer* renderer, const wxFont &font, const wxColour& col ); + ~wxCairoFontData(); + + virtual void Apply( wxGraphicsContext* context ); +private : + wxCharBuffer m_fontName; + double m_size; + cairo_font_slant_t m_slant; + cairo_font_weight_t m_weight; + double m_red; + double m_green; + double m_blue; + double m_alpha; +}; + +class WXDLLIMPEXP_CORE wxCairoContext : public wxGraphicsContext +{ + DECLARE_NO_COPY_CLASS(wxCairoContext) + +public: + wxCairoContext( wxGraphicsRenderer* renderer, const wxWindowDC& dc ); +#ifdef __WXGTK__ + wxCairoContext( wxGraphicsRenderer* renderer, GdkDrawable *drawable ); +#endif + wxCairoContext( wxGraphicsRenderer* renderer, cairo_t *context ); + wxCairoContext( wxGraphicsRenderer* renderer, wxWindow *window); + wxCairoContext(); + virtual ~wxCairoContext(); + + virtual void Clip( const wxRegion ®ion ); + + // clips drawings to the rect + virtual void Clip( wxDouble x, wxDouble y, wxDouble w, wxDouble h ); + + // resets the clipping to original extent + virtual void ResetClip(); + + virtual void * GetNativeContext(); + + virtual void StrokePath( const wxGraphicsPath& p ); + virtual void FillPath( const wxGraphicsPath& p , int fillStyle = wxWINDING_RULE ); + + virtual void Translate( wxDouble dx , wxDouble dy ); + virtual void Scale( wxDouble xScale , wxDouble yScale ); + virtual void Rotate( wxDouble angle ); + + // concatenates this transform with the current transform of this context + virtual void ConcatTransform( const wxGraphicsMatrix& matrix ); + + // sets the transform of this context + virtual void SetTransform( const wxGraphicsMatrix& matrix ); + + // gets the matrix of this context + virtual wxGraphicsMatrix GetTransform() const; + + virtual void DrawBitmap( const wxBitmap &bmp, wxDouble x, wxDouble y, wxDouble w, wxDouble h ); + virtual void DrawIcon( const wxIcon &icon, wxDouble x, wxDouble y, wxDouble w, wxDouble h ); + virtual void PushState(); + virtual void PopState(); + + virtual void DrawText( const wxString &str, wxDouble x, wxDouble y); + virtual void GetTextExtent( const wxString &str, wxDouble *width, wxDouble *height, + wxDouble *descent, wxDouble *externalLeading ) const; + virtual void GetPartialTextExtents(const wxString& text, wxArrayDouble& widths) const; + +private: + cairo_t* m_context; +}; + +//----------------------------------------------------------------------------- +// wxCairoPenData implementation +//----------------------------------------------------------------------------- + +wxCairoPenData::~wxCairoPenData() +{ + delete[] m_userLengths; +} + +void wxCairoPenData::Init() +{ + m_lengths = NULL; + m_userLengths = NULL; + m_width = 0; + m_count = 0; +} + +wxCairoPenData::wxCairoPenData( wxGraphicsRenderer* renderer, const wxPen &pen ) +: wxGraphicsObjectRefData(renderer) +{ + Init(); + m_pen = pen; + m_width = m_pen.GetWidth(); + if (m_width <= 0.0) + m_width = 0.1; + + m_red = m_pen.GetColour().Red()/255.0; + m_green = m_pen.GetColour().Green()/255.0; + m_blue = m_pen.GetColour().Blue()/255.0; + m_alpha = m_pen.GetColour().Alpha()/255.0; + + switch ( m_pen.GetCap() ) + { + case wxCAP_ROUND : + m_cap = CAIRO_LINE_CAP_ROUND; + break; + + case wxCAP_PROJECTING : + m_cap = CAIRO_LINE_CAP_SQUARE; + break; + + case wxCAP_BUTT : + m_cap = CAIRO_LINE_CAP_BUTT; + break; + + default : + m_cap = CAIRO_LINE_CAP_BUTT; + break; + } + + switch ( m_pen.GetJoin() ) + { + case wxJOIN_BEVEL : + m_join = CAIRO_LINE_JOIN_BEVEL; + break; + + case wxJOIN_MITER : + m_join = CAIRO_LINE_JOIN_MITER; + break; + + case wxJOIN_ROUND : + m_join = CAIRO_LINE_JOIN_ROUND; + break; + + default : + m_join = CAIRO_LINE_JOIN_MITER; + break; + } + + const double dashUnit = m_width < 1.0 ? 1.0 : m_width; + const double dotted[] = + { + dashUnit , dashUnit + 2.0 + }; + static const double short_dashed[] = + { + 9.0 , 6.0 + }; + static const double dashed[] = + { + 19.0 , 9.0 + }; + static const double dotted_dashed[] = + { + 9.0 , 6.0 , 3.0 , 3.0 + }; + + switch ( m_pen.GetStyle() ) + { + case wxSOLID : + break; + + case wxDOT : + m_count = WXSIZEOF(dotted); + m_userLengths = new double[ m_count ] ; + memcpy( m_userLengths, dotted, sizeof(dotted) ); + m_lengths = m_userLengths; + break; + + case wxLONG_DASH : + m_lengths = dotted ; + m_count = WXSIZEOF(dashed); + break; + + case wxSHORT_DASH : + m_lengths = dotted ; + m_count = WXSIZEOF(short_dashed); + break; + + case wxDOT_DASH : + m_lengths = dotted ; + m_count = WXSIZEOF(dotted_dashed); + break; + + case wxUSER_DASH : + { + wxDash *wxdashes ; + m_count = m_pen.GetDashes( &wxdashes ) ; + if ((wxdashes != NULL) && (m_count > 0)) + { + m_userLengths = new double[m_count] ; + for ( int i = 0 ; i < m_count ; ++i ) + { + m_userLengths[i] = wxdashes[i] * dashUnit ; + + if ( i % 2 == 1 && m_userLengths[i] < dashUnit + 2.0 ) + m_userLengths[i] = dashUnit + 2.0 ; + else if ( i % 2 == 0 && m_userLengths[i] < dashUnit ) + m_userLengths[i] = dashUnit ; + } + } + m_lengths = m_userLengths ; + } + break; + case wxSTIPPLE : + { + /* + wxBitmap* bmp = pen.GetStipple(); + if ( bmp && bmp->Ok() ) + { + wxDELETE( m_penImage ); + wxDELETE( m_penBrush ); + m_penImage = Bitmap::FromHBITMAP((HBITMAP)bmp->GetHBITMAP(),(HPALETTE)bmp->GetPalette()->GetHPALETTE()); + m_penBrush = new TextureBrush(m_penImage); + m_pen->SetBrush( m_penBrush ); + } + */ + } + break; + default : + if ( m_pen.GetStyle() >= wxFIRST_HATCH && m_pen.GetStyle() <= wxLAST_HATCH ) + { + /* + wxDELETE( m_penBrush ); + HatchStyle style = HatchStyleHorizontal; + switch( pen.GetStyle() ) + { + case wxBDIAGONAL_HATCH : + style = HatchStyleBackwardDiagonal; + break ; + case wxCROSSDIAG_HATCH : + style = HatchStyleDiagonalCross; + break ; + case wxFDIAGONAL_HATCH : + style = HatchStyleForwardDiagonal; + break ; + case wxCROSS_HATCH : + style = HatchStyleCross; + break ; + case wxHORIZONTAL_HATCH : + style = HatchStyleHorizontal; + break ; + case wxVERTICAL_HATCH : + style = HatchStyleVertical; + break ; + + } + m_penBrush = new HatchBrush(style,Color( pen.GetColour().Alpha() , pen.GetColour().Red() , + pen.GetColour().Green() , pen.GetColour().Blue() ), Color.Transparent ); + m_pen->SetBrush( m_penBrush ) + */ + } + break; + } +} + +void wxCairoPenData::Apply( wxGraphicsContext* context ) +{ + cairo_t * ctext = (cairo_t*) context->GetNativeContext(); + cairo_set_line_width(ctext,m_width); + cairo_set_source_rgba(ctext,m_red,m_green, m_blue,m_alpha); + cairo_set_line_cap(ctext,m_cap); + cairo_set_line_join(ctext,m_join); + cairo_set_dash(ctext,(double*)m_lengths,m_count,0.0); +} + +//----------------------------------------------------------------------------- +// wxCairoBrushData implementation +//----------------------------------------------------------------------------- + +wxCairoBrushData::wxCairoBrushData( wxGraphicsRenderer* renderer ) + : wxGraphicsObjectRefData( renderer ) +{ + Init(); +} + +wxCairoBrushData::wxCairoBrushData( wxGraphicsRenderer* renderer, const wxBrush &brush ) + : wxGraphicsObjectRefData(renderer) +{ + Init(); + + m_red = brush.GetColour().Red()/255.0; + m_green = brush.GetColour().Green()/255.0; + m_blue = brush.GetColour().Blue()/255.0; + m_alpha = brush.GetColour().Alpha()/255.0; + /* + if ( brush.GetStyle() == wxSOLID) + { + m_brush = new SolidBrush( Color( brush.GetColour().Alpha() , brush.GetColour().Red() , + brush.GetColour().Green() , brush.GetColour().Blue() ) ); + } + else if ( brush.IsHatch() ) + { + HatchStyle style = HatchStyleHorizontal; + switch( brush.GetStyle() ) + { + case wxBDIAGONAL_HATCH : + style = HatchStyleBackwardDiagonal; + break ; + case wxCROSSDIAG_HATCH : + style = HatchStyleDiagonalCross; + break ; + case wxFDIAGONAL_HATCH : + style = HatchStyleForwardDiagonal; + break ; + case wxCROSS_HATCH : + style = HatchStyleCross; + break ; + case wxHORIZONTAL_HATCH : + style = HatchStyleHorizontal; + break ; + case wxVERTICAL_HATCH : + style = HatchStyleVertical; + break ; + + } + m_brush = new HatchBrush(style,Color( brush.GetColour().Alpha() , brush.GetColour().Red() , + brush.GetColour().Green() , brush.GetColour().Blue() ), Color.Transparent ); + } + else + { + wxBitmap* bmp = brush.GetStipple(); + if ( bmp && bmp->Ok() ) + { + wxDELETE( m_brushImage ); + m_brushImage = Bitmap::FromHBITMAP((HBITMAP)bmp->GetHBITMAP(),(HPALETTE)bmp->GetPalette()->GetHPALETTE()); + m_brush = new TextureBrush(m_brushImage); + } + } + */ +} + +wxCairoBrushData::~wxCairoBrushData () +{ + if (m_brushPattern) + cairo_pattern_destroy(m_brushPattern); +} + +void wxCairoBrushData::Apply( wxGraphicsContext* context ) +{ + cairo_t * ctext = (cairo_t*) context->GetNativeContext(); + if ( m_brushPattern ) + { + cairo_set_source(ctext,m_brushPattern); + } + else + { + cairo_set_source_rgba(ctext,m_red,m_green, m_blue,m_alpha); + } +} + +void wxCairoBrushData::CreateLinearGradientBrush( wxDouble x1, wxDouble y1, wxDouble x2, wxDouble y2, + const wxColour&c1, const wxColour&c2 ) +{ + m_brushPattern = cairo_pattern_create_linear(x1,y1,x2,y2); + cairo_pattern_add_color_stop_rgba(m_brushPattern,0.0,c1.Red()/255.0, + c1.Green()/255.0, c1.Blue()/255.0,c1.Alpha()/255.0); + cairo_pattern_add_color_stop_rgba(m_brushPattern,1.0,c2.Red()/255.0, + c2.Green()/255.0, c2.Blue()/255.0,c2.Alpha()/255.0); + wxASSERT_MSG(cairo_pattern_status(m_brushPattern) == CAIRO_STATUS_SUCCESS, wxT("Couldn't create cairo pattern")); +} + +void wxCairoBrushData::CreateRadialGradientBrush( wxDouble xo, wxDouble yo, wxDouble xc, wxDouble yc, wxDouble radius, + const wxColour &oColor, const wxColour &cColor ) +{ + m_brushPattern = cairo_pattern_create_radial(xo,yo,0.0,xc,yc,radius); + cairo_pattern_add_color_stop_rgba(m_brushPattern,0.0,oColor.Red()/255.0, + oColor.Green()/255.0, oColor.Blue()/255.0,oColor.Alpha()/255.0); + cairo_pattern_add_color_stop_rgba(m_brushPattern,1.0,cColor.Red()/255.0, + cColor.Green()/255.0, cColor.Blue()/255.0,cColor.Alpha()/255.0); + wxASSERT_MSG(cairo_pattern_status(m_brushPattern) == CAIRO_STATUS_SUCCESS, wxT("Couldn't create cairo pattern")); +} + +void wxCairoBrushData::Init() +{ + m_brushPattern = NULL; +} + +//----------------------------------------------------------------------------- +// wxCairoFontData implementation +//----------------------------------------------------------------------------- + +wxCairoFontData::wxCairoFontData( wxGraphicsRenderer* renderer, const wxFont &font, + const wxColour& col ) : wxGraphicsObjectRefData(renderer) +{ + m_red = col.Red()/255.0; + m_green = col.Green()/255.0; + m_blue = col.Blue()/255.0; + m_alpha = col.Alpha()/255.0; + + m_size = font.GetPointSize(); + m_fontName = font.GetFaceName().mb_str(wxConvUTF8); + m_slant = font.GetStyle() == wxFONTSTYLE_ITALIC ? CAIRO_FONT_SLANT_ITALIC:CAIRO_FONT_SLANT_NORMAL; + m_weight = font.GetWeight() == wxFONTWEIGHT_BOLD ? CAIRO_FONT_WEIGHT_BOLD:CAIRO_FONT_WEIGHT_NORMAL; +} + +wxCairoFontData::~wxCairoFontData() +{ +} + +void wxCairoFontData::Apply( wxGraphicsContext* context ) +{ + cairo_t * ctext = (cairo_t*) context->GetNativeContext(); + cairo_set_source_rgba(ctext,m_red,m_green, m_blue,m_alpha); + cairo_select_font_face(ctext,m_fontName,m_slant,m_weight); + cairo_set_font_size(ctext,m_size); + // TODO UNDERLINE + // TODO FIX SIZE +} + +//----------------------------------------------------------------------------- +// wxCairoPathData implementation +//----------------------------------------------------------------------------- + +wxCairoPathData::wxCairoPathData( wxGraphicsRenderer* renderer, cairo_t* pathcontext) + : wxGraphicsPathData(renderer) +{ + if (pathcontext) + { + m_pathContext = pathcontext; + } + else + { + cairo_surface_t* surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32,1,1); + m_pathContext = cairo_create(surface); + cairo_surface_destroy (surface); + } +} + +wxCairoPathData::~wxCairoPathData() +{ + cairo_destroy(m_pathContext); +} + +wxGraphicsObjectRefData *wxCairoPathData::Clone() const +{ + cairo_surface_t* surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32,1,1); + cairo_t* pathcontext = cairo_create(surface); + cairo_surface_destroy (surface); + + cairo_path_t* path = cairo_copy_path(m_pathContext); + cairo_append_path(pathcontext, path); + cairo_path_destroy(path); + return new wxCairoPathData( GetRenderer() ,pathcontext); +} + + +void* wxCairoPathData::GetNativePath() const +{ + return cairo_copy_path(m_pathContext) ; +} + +void wxCairoPathData::UnGetNativePath(void *p) const +{ + cairo_path_destroy((cairo_path_t*)p); +} + +// +// The Primitives +// + +void wxCairoPathData::MoveToPoint( wxDouble x , wxDouble y ) +{ + cairo_move_to(m_pathContext,x,y); +} + +void wxCairoPathData::AddLineToPoint( wxDouble x , wxDouble y ) +{ + cairo_line_to(m_pathContext,x,y); +} + +void wxCairoPathData::AddPath( const wxGraphicsPathData* path ) +{ + cairo_path_t* p = (cairo_path_t*)path->GetNativePath(); + cairo_append_path(m_pathContext, p); + UnGetNativePath(p); +} + +void wxCairoPathData::CloseSubpath() +{ + cairo_close_path(m_pathContext); +} + +void wxCairoPathData::AddCurveToPoint( wxDouble cx1, wxDouble cy1, wxDouble cx2, wxDouble cy2, wxDouble x, wxDouble y ) +{ + cairo_curve_to(m_pathContext,cx1,cy1,cx2,cy2,x,y); +} + +// gets the last point of the current path, (0,0) if not yet set +void wxCairoPathData::GetCurrentPoint( wxDouble* x, wxDouble* y) const +{ + double dx,dy; + cairo_get_current_point(m_pathContext,&dx,&dy); + if (x) + *x = dx; + if (y) + *y = dy; +} + +void wxCairoPathData::AddArc( wxDouble x, wxDouble y, wxDouble r, double startAngle, double endAngle, bool clockwise ) +{ + // as clockwise means positive in our system (y pointing downwards) + // TODO make this interpretation dependent of the + // real device trans + if ( clockwise||(endAngle-startAngle)>=2*M_PI) + cairo_arc(m_pathContext,x,y,r,startAngle,endAngle); + else + cairo_arc_negative(m_pathContext,x,y,r,startAngle,endAngle); +} + +// transforms each point of this path by the matrix +void wxCairoPathData::Transform( const wxGraphicsMatrixData* matrix ) +{ + // as we don't have a true path object, we have to apply the inverse + // matrix to the context + cairo_matrix_t m = *((cairo_matrix_t*) matrix->GetNativeMatrix()); + cairo_matrix_invert( &m ); + cairo_transform(m_pathContext,&m); +} + +// gets the bounding box enclosing all points (possibly including control points) +void wxCairoPathData::GetBox(wxDouble *x, wxDouble *y, wxDouble *w, wxDouble *h) const +{ + double x1,y1,x2,y2; + + cairo_stroke_extents( m_pathContext, &x1, &y1, &x2, &y2 ); + if ( x2 < x1 ) + { + *x = x2; + *w = x1-x2; + } + else + { + *x = x1; + *w = x2-x1; + } + + if( y2 < y1 ) + { + *y = y2; + *h = y1-y2; + } + else + { + *y = y1; + *h = y2-y1; + } +} + +bool wxCairoPathData::Contains( wxDouble x, wxDouble y, int fillStyle ) const +{ + return cairo_in_stroke( m_pathContext, x, y) != 0; +} + +//----------------------------------------------------------------------------- +// wxCairoMatrixData implementation +//----------------------------------------------------------------------------- + +wxCairoMatrixData::wxCairoMatrixData(wxGraphicsRenderer* renderer, const cairo_matrix_t* matrix ) + : wxGraphicsMatrixData(renderer) +{ + if ( matrix ) + m_matrix = *matrix; +} + +wxCairoMatrixData::~wxCairoMatrixData() +{ + // nothing to do +} + +wxGraphicsObjectRefData *wxCairoMatrixData::Clone() const +{ + return new wxCairoMatrixData(GetRenderer(),&m_matrix); +} + +// concatenates the matrix +void wxCairoMatrixData::Concat( const wxGraphicsMatrixData *t ) +{ + cairo_matrix_multiply( &m_matrix, &m_matrix, (cairo_matrix_t*) t->GetNativeMatrix()); +} + +// sets the matrix to the respective values +void wxCairoMatrixData::Set(wxDouble a, wxDouble b, wxDouble c, wxDouble d, + wxDouble tx, wxDouble ty) +{ + cairo_matrix_init( &m_matrix, a, b, c, d, tx, ty); +} + +// gets the component valuess of the matrix +void wxCairoMatrixData::Get(wxDouble* a, wxDouble* b, wxDouble* c, + wxDouble* d, wxDouble* tx, wxDouble* ty) const +{ + if (a) *a = m_matrix.xx; + if (b) *b = m_matrix.yx; + if (c) *c = m_matrix.xy; + if (d) *d = m_matrix.yy; + if (tx) *tx= m_matrix.x0; + if (ty) *ty= m_matrix.y0; +} + +// makes this the inverse matrix +void wxCairoMatrixData::Invert() +{ + cairo_matrix_invert( &m_matrix ); +} + +// returns true if the elements of the transformation matrix are equal ? +bool wxCairoMatrixData::IsEqual( const wxGraphicsMatrixData* t) const +{ + const cairo_matrix_t* tm = (cairo_matrix_t*) t->GetNativeMatrix(); + return ( + m_matrix.xx == tm->xx && + m_matrix.yx == tm->yx && + m_matrix.xy == tm->xy && + m_matrix.yy == tm->yy && + m_matrix.x0 == tm->x0 && + m_matrix.y0 == tm->y0 ) ; +} + +// return true if this is the identity matrix +bool wxCairoMatrixData::IsIdentity() const +{ + return ( m_matrix.xx == 1 && m_matrix.yy == 1 && + m_matrix.yx == 0 && m_matrix.xy == 0 && m_matrix.x0 == 0 && m_matrix.y0 == 0); +} + +// +// transformation +// + +// add the translation to this matrix +void wxCairoMatrixData::Translate( wxDouble dx , wxDouble dy ) +{ + cairo_matrix_translate( &m_matrix, dx, dy) ; +} + +// add the scale to this matrix +void wxCairoMatrixData::Scale( wxDouble xScale , wxDouble yScale ) +{ + cairo_matrix_scale( &m_matrix, xScale, yScale) ; +} + +// add the rotation to this matrix (radians) +void wxCairoMatrixData::Rotate( wxDouble angle ) +{ + cairo_matrix_rotate( &m_matrix, angle) ; +} + +// +// apply the transforms +// + +// applies that matrix to the point +void wxCairoMatrixData::TransformPoint( wxDouble *x, wxDouble *y ) const +{ + double lx = *x, ly = *y ; + cairo_matrix_transform_point( &m_matrix, &lx, &ly); + *x = lx; + *y = ly; +} + +// applies the matrix except for translations +void wxCairoMatrixData::TransformDistance( wxDouble *dx, wxDouble *dy ) const +{ + double lx = *dx, ly = *dy ; + cairo_matrix_transform_distance( &m_matrix, &lx, &ly); + *dx = lx; + *dy = ly; +} + +// returns the native representation +void * wxCairoMatrixData::GetNativeMatrix() const +{ + return (void*) &m_matrix; +} + +//----------------------------------------------------------------------------- +// wxCairoContext implementation +//----------------------------------------------------------------------------- + +wxCairoContext::wxCairoContext( wxGraphicsRenderer* renderer, const wxWindowDC& dc ) +: wxGraphicsContext(renderer) +{ +#ifdef __WXGTK__ + m_context = gdk_cairo_create( dc.m_window ) ; +#endif + PushState(); + PushState(); +} + +#ifdef __WXGTK__ +wxCairoContext::wxCairoContext( wxGraphicsRenderer* renderer, GdkDrawable *drawable ) +: wxGraphicsContext(renderer) +{ + m_context = gdk_cairo_create( drawable ) ; + PushState(); + PushState(); +} +#endif + +wxCairoContext::wxCairoContext( wxGraphicsRenderer* renderer, cairo_t *context ) +: wxGraphicsContext(renderer) +{ + m_context = context ; + PushState(); + PushState(); +} + +wxCairoContext::wxCairoContext( wxGraphicsRenderer* renderer, wxWindow *window) +: wxGraphicsContext(renderer) +{ +#ifdef __WXGTK__ + // something along these lines (copied from dcclient) + + GtkWidget *widget = window->m_wxwindow; + + // Some controls don't have m_wxwindow - like wxStaticBox, but the user + // code should still be able to create wxClientDCs for them, so we will + // use the parent window here then. + if ( !widget ) + { + window = window->GetParent(); + widget = window->m_wxwindow; + } + + wxASSERT_MSG( widget, wxT("wxCairoContext needs a widget") ); + + GtkPizza *pizza = GTK_PIZZA( widget ); + GdkDrawable* drawable = pizza->bin_window; + m_context = gdk_cairo_create( drawable ) ; +#endif + PushState(); + PushState(); +} + +wxCairoContext::~wxCairoContext() +{ + if ( m_context ) + { + PopState(); + PopState(); + cairo_destroy(m_context); + } +} + + +void wxCairoContext::Clip( const wxRegion& region ) +{ + // Create a path with all the rectangles in the region + wxGraphicsPath path = GetRenderer()->CreatePath(); + wxRegionIterator ri(region); + while (ri) + { + path.AddRectangle(ri.GetX(), ri.GetY(), ri.GetW(), ri.GetH()); + ri++; + } + + // Put it in the context + cairo_path_t* cp = (cairo_path_t*) path.GetNativePath() ; + cairo_append_path(m_context, cp); + + // clip to that path + cairo_clip(m_context); + path.UnGetNativePath(cp); +} + +void wxCairoContext::Clip( wxDouble x, wxDouble y, wxDouble w, wxDouble h ) +{ + // Create a path with this rectangle + wxGraphicsPath path = GetRenderer()->CreatePath(); + path.AddRectangle(x,y,w,h); + + // Put it in the context + cairo_path_t* cp = (cairo_path_t*) path.GetNativePath() ; + cairo_append_path(m_context, cp); + + // clip to that path + cairo_clip(m_context); + path.UnGetNativePath(cp); +} + +void wxCairoContext::ResetClip() +{ + cairo_reset_clip(m_context); +} + + +void wxCairoContext::StrokePath( const wxGraphicsPath& path ) +{ + if ( !m_pen.IsNull() ) + { + cairo_path_t* cp = (cairo_path_t*) path.GetNativePath() ; + cairo_append_path(m_context,cp); + ((wxCairoPenData*)m_pen.GetRefData())->Apply(this); + cairo_stroke(m_context); + path.UnGetNativePath(cp); + } +} + +void wxCairoContext::FillPath( const wxGraphicsPath& path , int fillStyle ) +{ + if ( !m_brush.IsNull() ) + { + cairo_path_t* cp = (cairo_path_t*) path.GetNativePath() ; + cairo_append_path(m_context,cp); + ((wxCairoBrushData*)m_brush.GetRefData())->Apply(this); + cairo_set_fill_rule(m_context,fillStyle==wxODDEVEN_RULE ? CAIRO_FILL_RULE_EVEN_ODD : CAIRO_FILL_RULE_WINDING); + cairo_fill(m_context); + path.UnGetNativePath(cp); + } +} + +void wxCairoContext::Rotate( wxDouble angle ) +{ + cairo_rotate(m_context,angle); +} + +void wxCairoContext::Translate( wxDouble dx , wxDouble dy ) +{ + cairo_translate(m_context,dx,dy); +} + +void wxCairoContext::Scale( wxDouble xScale , wxDouble yScale ) +{ + cairo_scale(m_context,xScale,yScale); +} + +// concatenates this transform with the current transform of this context +void wxCairoContext::ConcatTransform( const wxGraphicsMatrix& matrix ) +{ + cairo_transform(m_context,(const cairo_matrix_t *) matrix.GetNativeMatrix()); +} + +// sets the transform of this context +void wxCairoContext::SetTransform( const wxGraphicsMatrix& matrix ) +{ + cairo_set_matrix(m_context,(const cairo_matrix_t*) matrix.GetNativeMatrix()); +} + +// gets the matrix of this context +wxGraphicsMatrix wxCairoContext::GetTransform() const +{ + wxGraphicsMatrix matrix = CreateMatrix(); + cairo_get_matrix(m_context,(cairo_matrix_t*) matrix.GetNativeMatrix()); + return matrix; +} + + + +void wxCairoContext::PushState() +{ + cairo_save(m_context); +} + +void wxCairoContext::PopState() +{ + cairo_restore(m_context); +} + +void wxCairoContext::DrawBitmap( const wxBitmap &bmp, wxDouble x, wxDouble y, wxDouble w, wxDouble h ) +{ + wxCHECK_RET( bmp.IsOk(), wxT("Invalid bitmap in wxCairoContext::DrawBitmap")); + + cairo_surface_t* surface; + int bw = bmp.GetWidth(); + int bh = bmp.GetHeight(); + wxBitmap bmpSource = bmp; // we need a non-const instance + unsigned char* buffer = new unsigned char[bw*bh*4]; + wxUint32* data = (wxUint32*)buffer; + + // Create a surface object and copy the bitmap pixel data to it. if the + // image has alpha (or a mask represented as alpha) then we'll use a + // different format and iterator than if it doesn't... + if (bmpSource.HasAlpha() || bmpSource.GetMask()) + { + surface = cairo_image_surface_create_for_data( + buffer, CAIRO_FORMAT_ARGB32, bw, bh, bw*4); + wxAlphaPixelData pixData(bmpSource, wxPoint(0,0), wxSize(bw, bh)); + wxCHECK_RET( pixData, wxT("Failed to gain raw access to bitmap data.")); + + wxAlphaPixelData::Iterator p(pixData); + for (int y=0; yApply(this); + + // Cairo's x,y for drawing text is at the baseline, so we need to adjust + // the position we move to by the ascent. + cairo_font_extents_t fe; + cairo_font_extents(m_context, &fe); + cairo_move_to(m_context, x, y+fe.ascent); + + const wxWX2MBbuf buf(str.mb_str(wxConvUTF8)); + cairo_show_text(m_context,buf); +} + +void wxCairoContext::GetTextExtent( const wxString &str, wxDouble *width, wxDouble *height, + wxDouble *descent, wxDouble *externalLeading ) const +{ + if ( m_font.IsNull() || str.empty()) + return; + + ((wxCairoFontData*)m_font.GetRefData())->Apply((wxCairoContext*)this); + + if (width) + { + const wxWX2MBbuf buf(str.mb_str(wxConvUTF8)); + cairo_text_extents_t te; + cairo_text_extents(m_context, buf, &te); + *width = te.width; + } + + if (height || descent || externalLeading) + { + cairo_font_extents_t fe; + cairo_font_extents(m_context, &fe); + + if (height) + *height = fe.height; + if ( descent ) + *descent = fe.descent; + if ( externalLeading ) + *externalLeading = wxMax(0, fe.height - (fe.ascent + fe.descent)); + } +} + +void wxCairoContext::GetPartialTextExtents(const wxString& text, wxArrayDouble& widths) const +{ + widths.Empty(); + widths.Add(0, text.length()); + + if (text.empty()) + return; + + // TODO +} + +void * wxCairoContext::GetNativeContext() +{ + return m_context; +} + +//----------------------------------------------------------------------------- +// wxCairoRenderer declaration +//----------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxCairoRenderer : public wxGraphicsRenderer +{ +public : + wxCairoRenderer() {} + + virtual ~wxCairoRenderer() {} + + // Context + + virtual wxGraphicsContext * CreateContext( const wxWindowDC& dc); + +#ifdef __WXMSW__ + virtual wxGraphicsContext * CreateContext( const wxMemoryDC& dc); +#endif + + virtual wxGraphicsContext * CreateContextFromNativeContext( void * context ); + + virtual wxGraphicsContext * CreateContextFromNativeWindow( void * window ); + + virtual wxGraphicsContext * CreateContext( wxWindow* window ); + + virtual wxGraphicsContext * CreateMeasuringContext(); + + // Path + + virtual wxGraphicsPath CreatePath(); + + // Matrix + + virtual wxGraphicsMatrix CreateMatrix( wxDouble a=1.0, wxDouble b=0.0, wxDouble c=0.0, wxDouble d=1.0, + wxDouble tx=0.0, wxDouble ty=0.0); + + + virtual wxGraphicsPen CreatePen(const wxPen& pen) ; + + virtual wxGraphicsBrush CreateBrush(const wxBrush& brush ) ; + + // sets the brush to a linear gradient, starting at (x1,y1) with color c1 to (x2,y2) with color c2 + virtual wxGraphicsBrush CreateLinearGradientBrush( wxDouble x1, wxDouble y1, wxDouble x2, wxDouble y2, + const wxColour&c1, const wxColour&c2) ; + + // sets the brush to a radial gradient originating at (xo,yc) with color oColor and ends on a circle around (xc,yc) + // with radius r and color cColor + virtual wxGraphicsBrush CreateRadialGradientBrush( wxDouble xo, wxDouble yo, wxDouble xc, wxDouble yc, wxDouble radius, + const wxColour &oColor, const wxColour &cColor) ; + + // sets the font + virtual wxGraphicsFont CreateFont( const wxFont &font , const wxColour &col = *wxBLACK ) ; + +private : + DECLARE_DYNAMIC_CLASS_NO_COPY(wxCairoRenderer) +} ; + +//----------------------------------------------------------------------------- +// wxCairoRenderer implementation +//----------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxCairoRenderer,wxGraphicsRenderer) + +static wxCairoRenderer gs_cairoGraphicsRenderer; + +#ifdef __WXGTK__ +wxGraphicsRenderer* wxGraphicsRenderer::GetDefaultRenderer() +{ + return &gs_cairoGraphicsRenderer; +} +#endif + +wxGraphicsContext * wxCairoRenderer::CreateContext( const wxWindowDC& dc) +{ + return new wxCairoContext(this,dc); +} + +#ifdef __WXMSW__ +wxGraphicsContext * wxCairoRenderer::CreateContext( const wxMemoryDC& dc) +{ + return NULL; +} +#endif + +wxGraphicsContext * wxCairoRenderer::CreateContextFromNativeContext( void * context ) +{ + return new wxCairoContext(this,(cairo_t*)context); +} + + +wxGraphicsContext * wxCairoRenderer::CreateContextFromNativeWindow( void * window ) +{ +#ifdef __WXGTK__ + return new wxCairoContext(this,(GdkDrawable*)window); +#else + return NULL; +#endif +} + +wxGraphicsContext * wxCairoRenderer::CreateMeasuringContext() +{ + return NULL; + // TODO +} + +wxGraphicsContext * wxCairoRenderer::CreateContext( wxWindow* window ) +{ + return new wxCairoContext(this, window ); +} + +// Path + +wxGraphicsPath wxCairoRenderer::CreatePath() +{ + wxGraphicsPath path; + path.SetRefData( new wxCairoPathData(this) ); + return path; +} + + +// Matrix + +wxGraphicsMatrix wxCairoRenderer::CreateMatrix( wxDouble a, wxDouble b, wxDouble c, wxDouble d, + wxDouble tx, wxDouble ty) + +{ + wxGraphicsMatrix m; + wxCairoMatrixData* data = new wxCairoMatrixData( this ); + data->Set( a,b,c,d,tx,ty ) ; + m.SetRefData(data); + return m; +} + +wxGraphicsPen wxCairoRenderer::CreatePen(const wxPen& pen) +{ + if ( !pen.Ok() || pen.GetStyle() == wxTRANSPARENT ) + return wxNullGraphicsPen; + else + { + wxGraphicsPen p; + p.SetRefData(new wxCairoPenData( this, pen )); + return p; + } +} + +wxGraphicsBrush wxCairoRenderer::CreateBrush(const wxBrush& brush ) +{ + if ( !brush.Ok() || brush.GetStyle() == wxTRANSPARENT ) + return wxNullGraphicsBrush; + else + { + wxGraphicsBrush p; + p.SetRefData(new wxCairoBrushData( this, brush )); + return p; + } +} + +// sets the brush to a linear gradient, starting at (x1,y1) with color c1 to (x2,y2) with color c2 +wxGraphicsBrush wxCairoRenderer::CreateLinearGradientBrush( wxDouble x1, wxDouble y1, wxDouble x2, wxDouble y2, + const wxColour&c1, const wxColour&c2) +{ + wxGraphicsBrush p; + wxCairoBrushData* d = new wxCairoBrushData( this ); + d->CreateLinearGradientBrush(x1, y1, x2, y2, c1, c2); + p.SetRefData(d); + return p; +} + +// sets the brush to a radial gradient originating at (xo,yc) with color oColor and ends on a circle around (xc,yc) +// with radius r and color cColor +wxGraphicsBrush wxCairoRenderer::CreateRadialGradientBrush( wxDouble xo, wxDouble yo, wxDouble xc, wxDouble yc, wxDouble radius, + const wxColour &oColor, const wxColour &cColor) +{ + wxGraphicsBrush p; + wxCairoBrushData* d = new wxCairoBrushData( this ); + d->CreateRadialGradientBrush(xo,yo,xc,yc,radius,oColor,cColor); + p.SetRefData(d); + return p; +} + +// sets the font +wxGraphicsFont wxCairoRenderer::CreateFont( const wxFont &font , const wxColour &col ) +{ + if ( font.Ok() ) + { + wxGraphicsFont p; + p.SetRefData(new wxCairoFontData( this , font, col )); + return p; + } + else + return wxNullGraphicsFont; +} + +#endif // wxUSE_GRAPHICS_CONTEXT diff --git a/Externals/wxWidgets/src/generic/grid.cpp b/Externals/wxWidgets/src/generic/grid.cpp new file mode 100644 index 0000000000..48a44ad9fc --- /dev/null +++ b/Externals/wxWidgets/src/generic/grid.cpp @@ -0,0 +1,11138 @@ +/////////////////////////////////////////////////////////////////////////// +// Name: src/generic/grid.cpp +// Purpose: wxGrid and related classes +// Author: Michael Bedward (based on code by Julian Smart, Robin Dunn) +// Modified by: Robin Dunn, Vadim Zeitlin, Santiago Palacios +// Created: 1/08/1999 +// RCS-ID: $Id: grid.cpp 47330 2007-07-11 08:32:10Z JS $ +// Copyright: (c) Michael Bedward (mbedward@ozemail.com.au) +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx/wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_GRID + +#include "wx/grid.h" + +#ifndef WX_PRECOMP + #include "wx/utils.h" + #include "wx/dcclient.h" + #include "wx/settings.h" + #include "wx/log.h" + #include "wx/textctrl.h" + #include "wx/checkbox.h" + #include "wx/combobox.h" + #include "wx/valtext.h" + #include "wx/intl.h" + #include "wx/math.h" + #include "wx/listbox.h" +#endif + +#include "wx/textfile.h" +#include "wx/spinctrl.h" +#include "wx/tokenzr.h" +#include "wx/renderer.h" + +#include "wx/generic/gridsel.h" + +const wxChar wxGridNameStr[] = wxT("grid"); + +#if defined(__WXMOTIF__) + #define WXUNUSED_MOTIF(identifier) WXUNUSED(identifier) +#else + #define WXUNUSED_MOTIF(identifier) identifier +#endif + +#if defined(__WXGTK__) + #define WXUNUSED_GTK(identifier) WXUNUSED(identifier) +#else + #define WXUNUSED_GTK(identifier) identifier +#endif + +// Required for wxIs... functions +#include + +// ---------------------------------------------------------------------------- +// array classes +// ---------------------------------------------------------------------------- + +WX_DEFINE_ARRAY_WITH_DECL_PTR(wxGridCellAttr *, wxArrayAttrs, + class WXDLLIMPEXP_ADV); + +struct wxGridCellWithAttr +{ + wxGridCellWithAttr(int row, int col, wxGridCellAttr *attr_) + : coords(row, col), attr(attr_) + { + } + + ~wxGridCellWithAttr() + { + attr->DecRef(); + } + + wxGridCellCoords coords; + wxGridCellAttr *attr; + +// Cannot do this: +// DECLARE_NO_COPY_CLASS(wxGridCellWithAttr) +// without rewriting the macros, which require a public copy constructor. +}; + +WX_DECLARE_OBJARRAY_WITH_DECL(wxGridCellWithAttr, wxGridCellWithAttrArray, + class WXDLLIMPEXP_ADV); + +#include "wx/arrimpl.cpp" + +WX_DEFINE_OBJARRAY(wxGridCellCoordsArray) +WX_DEFINE_OBJARRAY(wxGridCellWithAttrArray) + +// ---------------------------------------------------------------------------- +// events +// ---------------------------------------------------------------------------- + +DEFINE_EVENT_TYPE(wxEVT_GRID_CELL_LEFT_CLICK) +DEFINE_EVENT_TYPE(wxEVT_GRID_CELL_RIGHT_CLICK) +DEFINE_EVENT_TYPE(wxEVT_GRID_CELL_LEFT_DCLICK) +DEFINE_EVENT_TYPE(wxEVT_GRID_CELL_RIGHT_DCLICK) +DEFINE_EVENT_TYPE(wxEVT_GRID_CELL_BEGIN_DRAG) +DEFINE_EVENT_TYPE(wxEVT_GRID_LABEL_LEFT_CLICK) +DEFINE_EVENT_TYPE(wxEVT_GRID_LABEL_RIGHT_CLICK) +DEFINE_EVENT_TYPE(wxEVT_GRID_LABEL_LEFT_DCLICK) +DEFINE_EVENT_TYPE(wxEVT_GRID_LABEL_RIGHT_DCLICK) +DEFINE_EVENT_TYPE(wxEVT_GRID_ROW_SIZE) +DEFINE_EVENT_TYPE(wxEVT_GRID_COL_SIZE) +DEFINE_EVENT_TYPE(wxEVT_GRID_COL_MOVE) +DEFINE_EVENT_TYPE(wxEVT_GRID_RANGE_SELECT) +DEFINE_EVENT_TYPE(wxEVT_GRID_CELL_CHANGE) +DEFINE_EVENT_TYPE(wxEVT_GRID_SELECT_CELL) +DEFINE_EVENT_TYPE(wxEVT_GRID_EDITOR_SHOWN) +DEFINE_EVENT_TYPE(wxEVT_GRID_EDITOR_HIDDEN) +DEFINE_EVENT_TYPE(wxEVT_GRID_EDITOR_CREATED) + +// ---------------------------------------------------------------------------- +// private classes +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxGridRowLabelWindow : public wxWindow +{ +public: + wxGridRowLabelWindow() { m_owner = (wxGrid *)NULL; } + wxGridRowLabelWindow( wxGrid *parent, wxWindowID id, + const wxPoint &pos, const wxSize &size ); + +private: + wxGrid *m_owner; + + void OnPaint( wxPaintEvent& event ); + void OnMouseEvent( wxMouseEvent& event ); + void OnMouseWheel( wxMouseEvent& event ); + void OnKeyDown( wxKeyEvent& event ); + void OnKeyUp( wxKeyEvent& ); + void OnChar( wxKeyEvent& ); + + DECLARE_DYNAMIC_CLASS(wxGridRowLabelWindow) + DECLARE_EVENT_TABLE() + DECLARE_NO_COPY_CLASS(wxGridRowLabelWindow) +}; + + +class WXDLLIMPEXP_ADV wxGridColLabelWindow : public wxWindow +{ +public: + wxGridColLabelWindow() { m_owner = (wxGrid *)NULL; } + wxGridColLabelWindow( wxGrid *parent, wxWindowID id, + const wxPoint &pos, const wxSize &size ); + +private: + wxGrid *m_owner; + + void OnPaint( wxPaintEvent& event ); + void OnMouseEvent( wxMouseEvent& event ); + void OnMouseWheel( wxMouseEvent& event ); + void OnKeyDown( wxKeyEvent& event ); + void OnKeyUp( wxKeyEvent& ); + void OnChar( wxKeyEvent& ); + + DECLARE_DYNAMIC_CLASS(wxGridColLabelWindow) + DECLARE_EVENT_TABLE() + DECLARE_NO_COPY_CLASS(wxGridColLabelWindow) +}; + + +class WXDLLIMPEXP_ADV wxGridCornerLabelWindow : public wxWindow +{ +public: + wxGridCornerLabelWindow() { m_owner = (wxGrid *)NULL; } + wxGridCornerLabelWindow( wxGrid *parent, wxWindowID id, + const wxPoint &pos, const wxSize &size ); + +private: + wxGrid *m_owner; + + void OnMouseEvent( wxMouseEvent& event ); + void OnMouseWheel( wxMouseEvent& event ); + void OnKeyDown( wxKeyEvent& event ); + void OnKeyUp( wxKeyEvent& ); + void OnChar( wxKeyEvent& ); + void OnPaint( wxPaintEvent& event ); + + DECLARE_DYNAMIC_CLASS(wxGridCornerLabelWindow) + DECLARE_EVENT_TABLE() + DECLARE_NO_COPY_CLASS(wxGridCornerLabelWindow) +}; + +class WXDLLIMPEXP_ADV wxGridWindow : public wxWindow +{ +public: + wxGridWindow() + { + m_owner = NULL; + m_rowLabelWin = NULL; + m_colLabelWin = NULL; + } + + wxGridWindow( wxGrid *parent, + wxGridRowLabelWindow *rowLblWin, + wxGridColLabelWindow *colLblWin, + wxWindowID id, const wxPoint &pos, const wxSize &size ); + virtual ~wxGridWindow() {} + + void ScrollWindow( int dx, int dy, const wxRect *rect ); + + wxGrid* GetOwner() { return m_owner; } + +private: + wxGrid *m_owner; + wxGridRowLabelWindow *m_rowLabelWin; + wxGridColLabelWindow *m_colLabelWin; + + void OnPaint( wxPaintEvent &event ); + void OnMouseWheel( wxMouseEvent& event ); + void OnMouseEvent( wxMouseEvent& event ); + void OnKeyDown( wxKeyEvent& ); + void OnKeyUp( wxKeyEvent& ); + void OnChar( wxKeyEvent& ); + void OnEraseBackground( wxEraseEvent& ); + void OnFocus( wxFocusEvent& ); + + DECLARE_DYNAMIC_CLASS(wxGridWindow) + DECLARE_EVENT_TABLE() + DECLARE_NO_COPY_CLASS(wxGridWindow) +}; + + +class wxGridCellEditorEvtHandler : public wxEvtHandler +{ +public: + wxGridCellEditorEvtHandler(wxGrid* grid, wxGridCellEditor* editor) + : m_grid(grid), + m_editor(editor), + m_inSetFocus(false) + { + } + + void OnKillFocus(wxFocusEvent& event); + void OnKeyDown(wxKeyEvent& event); + void OnChar(wxKeyEvent& event); + + void SetInSetFocus(bool inSetFocus) { m_inSetFocus = inSetFocus; } + +private: + wxGrid *m_grid; + wxGridCellEditor *m_editor; + + // Work around the fact that a focus kill event can be sent to + // a combobox within a set focus event. + bool m_inSetFocus; + + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS(wxGridCellEditorEvtHandler) + DECLARE_NO_COPY_CLASS(wxGridCellEditorEvtHandler) +}; + + +IMPLEMENT_ABSTRACT_CLASS(wxGridCellEditorEvtHandler, wxEvtHandler) + +BEGIN_EVENT_TABLE( wxGridCellEditorEvtHandler, wxEvtHandler ) + EVT_KILL_FOCUS( wxGridCellEditorEvtHandler::OnKillFocus ) + EVT_KEY_DOWN( wxGridCellEditorEvtHandler::OnKeyDown ) + EVT_CHAR( wxGridCellEditorEvtHandler::OnChar ) +END_EVENT_TABLE() + + +// ---------------------------------------------------------------------------- +// the internal data representation used by wxGridCellAttrProvider +// ---------------------------------------------------------------------------- + +// this class stores attributes set for cells +class WXDLLIMPEXP_ADV wxGridCellAttrData +{ +public: + void SetAttr(wxGridCellAttr *attr, int row, int col); + wxGridCellAttr *GetAttr(int row, int col) const; + void UpdateAttrRows( size_t pos, int numRows ); + void UpdateAttrCols( size_t pos, int numCols ); + +private: + // searches for the attr for given cell, returns wxNOT_FOUND if not found + int FindIndex(int row, int col) const; + + wxGridCellWithAttrArray m_attrs; +}; + +// this class stores attributes set for rows or columns +class WXDLLIMPEXP_ADV wxGridRowOrColAttrData +{ +public: + // empty ctor to suppress warnings + wxGridRowOrColAttrData() {} + ~wxGridRowOrColAttrData(); + + void SetAttr(wxGridCellAttr *attr, int rowOrCol); + wxGridCellAttr *GetAttr(int rowOrCol) const; + void UpdateAttrRowsOrCols( size_t pos, int numRowsOrCols ); + +private: + wxArrayInt m_rowsOrCols; + wxArrayAttrs m_attrs; +}; + +// NB: this is just a wrapper around 3 objects: one which stores cell +// attributes, and 2 others for row/col ones +class WXDLLIMPEXP_ADV wxGridCellAttrProviderData +{ +public: + wxGridCellAttrData m_cellAttrs; + wxGridRowOrColAttrData m_rowAttrs, + m_colAttrs; +}; + + +// ---------------------------------------------------------------------------- +// data structures used for the data type registry +// ---------------------------------------------------------------------------- + +struct wxGridDataTypeInfo +{ + wxGridDataTypeInfo(const wxString& typeName, + wxGridCellRenderer* renderer, + wxGridCellEditor* editor) + : m_typeName(typeName), m_renderer(renderer), m_editor(editor) + {} + + ~wxGridDataTypeInfo() + { + wxSafeDecRef(m_renderer); + wxSafeDecRef(m_editor); + } + + wxString m_typeName; + wxGridCellRenderer* m_renderer; + wxGridCellEditor* m_editor; + + DECLARE_NO_COPY_CLASS(wxGridDataTypeInfo) +}; + + +WX_DEFINE_ARRAY_WITH_DECL_PTR(wxGridDataTypeInfo*, wxGridDataTypeInfoArray, + class WXDLLIMPEXP_ADV); + + +class WXDLLIMPEXP_ADV wxGridTypeRegistry +{ +public: + wxGridTypeRegistry() {} + ~wxGridTypeRegistry(); + + void RegisterDataType(const wxString& typeName, + wxGridCellRenderer* renderer, + wxGridCellEditor* editor); + + // find one of already registered data types + int FindRegisteredDataType(const wxString& typeName); + + // try to FindRegisteredDataType(), if this fails and typeName is one of + // standard typenames, register it and return its index + int FindDataType(const wxString& typeName); + + // try to FindDataType(), if it fails see if it is not one of already + // registered data types with some params in which case clone the + // registered data type and set params for it + int FindOrCloneDataType(const wxString& typeName); + + wxGridCellRenderer* GetRenderer(int index); + wxGridCellEditor* GetEditor(int index); + +private: + wxGridDataTypeInfoArray m_typeinfo; +}; + + +// ---------------------------------------------------------------------------- +// conditional compilation +// ---------------------------------------------------------------------------- + +#ifndef WXGRID_DRAW_LINES +#define WXGRID_DRAW_LINES 1 +#endif + +// ---------------------------------------------------------------------------- +// globals +// ---------------------------------------------------------------------------- + +//#define DEBUG_ATTR_CACHE +#ifdef DEBUG_ATTR_CACHE + static size_t gs_nAttrCacheHits = 0; + static size_t gs_nAttrCacheMisses = 0; +#endif + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +wxGridCellCoords wxGridNoCellCoords( -1, -1 ); +wxRect wxGridNoCellRect( -1, -1, -1, -1 ); + +// scroll line size +// TODO: this doesn't work at all, grid cells have different sizes and approx +// calculations don't work as because of the size mismatch scrollbars +// sometimes fail to be shown when they should be or vice versa +// +// The scroll bars may be a little flakey once in a while, but that is +// surely much less horrible than having scroll lines of only 1!!! +// -- Robin +// +// Well, it's still seriously broken so it might be better but needs +// fixing anyhow +// -- Vadim +static const size_t GRID_SCROLL_LINE_X = 15; // 1; +static const size_t GRID_SCROLL_LINE_Y = GRID_SCROLL_LINE_X; + +// the size of hash tables used a bit everywhere (the max number of elements +// in these hash tables is the number of rows/columns) +static const int GRID_HASH_SIZE = 100; + +#if 0 +// ---------------------------------------------------------------------------- +// private functions +// ---------------------------------------------------------------------------- + +static inline int GetScrollX(int x) +{ + return (x + GRID_SCROLL_LINE_X - 1) / GRID_SCROLL_LINE_X; +} + +static inline int GetScrollY(int y) +{ + return (y + GRID_SCROLL_LINE_Y - 1) / GRID_SCROLL_LINE_Y; +} +#endif + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxGridCellEditor +// ---------------------------------------------------------------------------- + +wxGridCellEditor::wxGridCellEditor() +{ + m_control = NULL; + m_attr = NULL; +} + +wxGridCellEditor::~wxGridCellEditor() +{ + Destroy(); +} + +void wxGridCellEditor::Create(wxWindow* WXUNUSED(parent), + wxWindowID WXUNUSED(id), + wxEvtHandler* evtHandler) +{ + if ( evtHandler ) + m_control->PushEventHandler(evtHandler); +} + +void wxGridCellEditor::PaintBackground(const wxRect& rectCell, + wxGridCellAttr *attr) +{ + // erase the background because we might not fill the cell + wxClientDC dc(m_control->GetParent()); + wxGridWindow* gridWindow = wxDynamicCast(m_control->GetParent(), wxGridWindow); + if (gridWindow) + gridWindow->GetOwner()->PrepareDC(dc); + + dc.SetPen(*wxTRANSPARENT_PEN); + dc.SetBrush(wxBrush(attr->GetBackgroundColour(), wxSOLID)); + dc.DrawRectangle(rectCell); + + // redraw the control we just painted over + m_control->Refresh(); +} + +void wxGridCellEditor::Destroy() +{ + if (m_control) + { + m_control->PopEventHandler( true /* delete it*/ ); + + m_control->Destroy(); + m_control = NULL; + } +} + +void wxGridCellEditor::Show(bool show, wxGridCellAttr *attr) +{ + wxASSERT_MSG(m_control, wxT("The wxGridCellEditor must be created first!")); + + m_control->Show(show); + + if ( show ) + { + // set the colours/fonts if we have any + if ( attr ) + { + m_colFgOld = m_control->GetForegroundColour(); + m_control->SetForegroundColour(attr->GetTextColour()); + + m_colBgOld = m_control->GetBackgroundColour(); + m_control->SetBackgroundColour(attr->GetBackgroundColour()); + +// Workaround for GTK+1 font setting problem on some platforms +#if !defined(__WXGTK__) || defined(__WXGTK20__) + m_fontOld = m_control->GetFont(); + m_control->SetFont(attr->GetFont()); +#endif + + // can't do anything more in the base class version, the other + // attributes may only be used by the derived classes + } + } + else + { + // restore the standard colours fonts + if ( m_colFgOld.Ok() ) + { + m_control->SetForegroundColour(m_colFgOld); + m_colFgOld = wxNullColour; + } + + if ( m_colBgOld.Ok() ) + { + m_control->SetBackgroundColour(m_colBgOld); + m_colBgOld = wxNullColour; + } + +// Workaround for GTK+1 font setting problem on some platforms +#if !defined(__WXGTK__) || defined(__WXGTK20__) + if ( m_fontOld.Ok() ) + { + m_control->SetFont(m_fontOld); + m_fontOld = wxNullFont; + } +#endif + } +} + +void wxGridCellEditor::SetSize(const wxRect& rect) +{ + wxASSERT_MSG(m_control, wxT("The wxGridCellEditor must be created first!")); + + m_control->SetSize(rect, wxSIZE_ALLOW_MINUS_ONE); +} + +void wxGridCellEditor::HandleReturn(wxKeyEvent& event) +{ + event.Skip(); +} + +bool wxGridCellEditor::IsAcceptedKey(wxKeyEvent& event) +{ + bool ctrl = event.ControlDown(); + bool alt = event.AltDown(); + +#ifdef __WXMAC__ + // On the Mac the Alt key is more like shift and is used for entry of + // valid characters, so check for Ctrl and Meta instead. + alt = event.MetaDown(); +#endif + + // Assume it's not a valid char if ctrl or alt is down, but if both are + // down then it may be because of an AltGr key combination, so let them + // through in that case. + if ((ctrl || alt) && !(ctrl && alt)) + return false; + + int key = 0; + bool keyOk = true; + +#ifdef __WXGTK20__ + // If it's a F-Key or other special key then it shouldn't start the + // editor. + if (event.GetKeyCode() >= WXK_START) + return false; +#endif +#if wxUSE_UNICODE + // if the unicode key code is not really a unicode character (it may + // be a function key or etc., the platforms appear to always give us a + // small value in this case) then fallback to the ASCII key code but + // don't do anything for function keys or etc. + key = event.GetUnicodeKey(); + if (key <= 127) + { + key = event.GetKeyCode(); + keyOk = (key <= 127); + } +#else + key = event.GetKeyCode(); + keyOk = (key <= 255); +#endif + + return keyOk; +} + +void wxGridCellEditor::StartingKey(wxKeyEvent& event) +{ + event.Skip(); +} + +void wxGridCellEditor::StartingClick() +{ +} + +#if wxUSE_TEXTCTRL + +// ---------------------------------------------------------------------------- +// wxGridCellTextEditor +// ---------------------------------------------------------------------------- + +wxGridCellTextEditor::wxGridCellTextEditor() +{ + m_maxChars = 0; +} + +void wxGridCellTextEditor::Create(wxWindow* parent, + wxWindowID id, + wxEvtHandler* evtHandler) +{ + m_control = new wxTextCtrl(parent, id, wxEmptyString, + wxDefaultPosition, wxDefaultSize +#if defined(__WXMSW__) + , + wxTE_PROCESS_ENTER | + wxTE_PROCESS_TAB | + wxTE_AUTO_SCROLL | + wxNO_BORDER +#endif + ); + + // set max length allowed in the textctrl, if the parameter was set + if (m_maxChars != 0) + { + ((wxTextCtrl*)m_control)->SetMaxLength(m_maxChars); + } + + wxGridCellEditor::Create(parent, id, evtHandler); +} + +void wxGridCellTextEditor::PaintBackground(const wxRect& WXUNUSED(rectCell), + wxGridCellAttr * WXUNUSED(attr)) +{ + // as we fill the entire client area, + // don't do anything here to minimize flicker +} + +void wxGridCellTextEditor::SetSize(const wxRect& rectOrig) +{ + wxRect rect(rectOrig); + + // Make the edit control large enough to allow for internal margins + // + // TODO: remove this if the text ctrl sizing is improved esp. for unix + // +#if defined(__WXGTK__) + if (rect.x != 0) + { + rect.x += 1; + rect.y += 1; + rect.width -= 1; + rect.height -= 1; + } +#elif defined(__WXMSW__) + if ( rect.x == 0 ) + rect.x += 2; + else + rect.x += 3; + + if ( rect.y == 0 ) + rect.y += 2; + else + rect.y += 3; + + rect.width -= 2; + rect.height -= 2; +#else + int extra_x = ( rect.x > 2 ) ? 2 : 1; + int extra_y = ( rect.y > 2 ) ? 2 : 1; + + #if defined(__WXMOTIF__) + extra_x *= 2; + extra_y *= 2; + #endif + + rect.SetLeft( wxMax(0, rect.x - extra_x) ); + rect.SetTop( wxMax(0, rect.y - extra_y) ); + rect.SetRight( rect.GetRight() + 2 * extra_x ); + rect.SetBottom( rect.GetBottom() + 2 * extra_y ); +#endif + + wxGridCellEditor::SetSize(rect); +} + +void wxGridCellTextEditor::BeginEdit(int row, int col, wxGrid* grid) +{ + wxASSERT_MSG(m_control, wxT("The wxGridCellEditor must be created first!")); + + m_startValue = grid->GetTable()->GetValue(row, col); + + DoBeginEdit(m_startValue); +} + +void wxGridCellTextEditor::DoBeginEdit(const wxString& startValue) +{ + Text()->SetValue(startValue); + Text()->SetInsertionPointEnd(); + Text()->SetSelection(-1, -1); + Text()->SetFocus(); +} + +bool wxGridCellTextEditor::EndEdit(int row, int col, wxGrid* grid) +{ + wxASSERT_MSG(m_control, wxT("The wxGridCellEditor must be created first!")); + + bool changed = false; + wxString value = Text()->GetValue(); + if (value != m_startValue) + changed = true; + + if (changed) + grid->GetTable()->SetValue(row, col, value); + + m_startValue = wxEmptyString; + + // No point in setting the text of the hidden control + //Text()->SetValue(m_startValue); + + return changed; +} + +void wxGridCellTextEditor::Reset() +{ + wxASSERT_MSG(m_control, wxT("The wxGridCellEditor must be created first!")); + + DoReset(m_startValue); +} + +void wxGridCellTextEditor::DoReset(const wxString& startValue) +{ + Text()->SetValue(startValue); + Text()->SetInsertionPointEnd(); +} + +bool wxGridCellTextEditor::IsAcceptedKey(wxKeyEvent& event) +{ + return wxGridCellEditor::IsAcceptedKey(event); +} + +void wxGridCellTextEditor::StartingKey(wxKeyEvent& event) +{ + // Since this is now happening in the EVT_CHAR event EmulateKeyPress is no + // longer an appropriate way to get the character into the text control. + // Do it ourselves instead. We know that if we get this far that we have + // a valid character, so not a whole lot of testing needs to be done. + + wxTextCtrl* tc = Text(); + wxChar ch; + long pos; + +#if wxUSE_UNICODE + ch = event.GetUnicodeKey(); + if (ch <= 127) + ch = (wxChar)event.GetKeyCode(); +#else + ch = (wxChar)event.GetKeyCode(); +#endif + + switch (ch) + { + case WXK_DELETE: + // delete the character at the cursor + pos = tc->GetInsertionPoint(); + if (pos < tc->GetLastPosition()) + tc->Remove(pos, pos + 1); + break; + + case WXK_BACK: + // delete the character before the cursor + pos = tc->GetInsertionPoint(); + if (pos > 0) + tc->Remove(pos - 1, pos); + break; + + default: + tc->WriteText(ch); + break; + } +} + +void wxGridCellTextEditor::HandleReturn( wxKeyEvent& + WXUNUSED_GTK(WXUNUSED_MOTIF(event)) ) +{ +#if defined(__WXMOTIF__) || defined(__WXGTK__) + // wxMotif needs a little extra help... + size_t pos = (size_t)( Text()->GetInsertionPoint() ); + wxString s( Text()->GetValue() ); + s = s.Left(pos) + wxT("\n") + s.Mid(pos); + Text()->SetValue(s); + Text()->SetInsertionPoint( pos ); +#else + // the other ports can handle a Return key press + // + event.Skip(); +#endif +} + +void wxGridCellTextEditor::SetParameters(const wxString& params) +{ + if ( !params ) + { + // reset to default + m_maxChars = 0; + } + else + { + long tmp; + if ( params.ToLong(&tmp) ) + { + m_maxChars = (size_t)tmp; + } + else + { + wxLogDebug( _T("Invalid wxGridCellTextEditor parameter string '%s' ignored"), params.c_str() ); + } + } +} + +// return the value in the text control +wxString wxGridCellTextEditor::GetValue() const +{ + return Text()->GetValue(); +} + +// ---------------------------------------------------------------------------- +// wxGridCellNumberEditor +// ---------------------------------------------------------------------------- + +wxGridCellNumberEditor::wxGridCellNumberEditor(int min, int max) +{ + m_min = min; + m_max = max; +} + +void wxGridCellNumberEditor::Create(wxWindow* parent, + wxWindowID id, + wxEvtHandler* evtHandler) +{ +#if wxUSE_SPINCTRL + if ( HasRange() ) + { + // create a spin ctrl + m_control = new wxSpinCtrl(parent, wxID_ANY, wxEmptyString, + wxDefaultPosition, wxDefaultSize, + wxSP_ARROW_KEYS, + m_min, m_max); + + wxGridCellEditor::Create(parent, id, evtHandler); + } + else +#endif + { + // just a text control + wxGridCellTextEditor::Create(parent, id, evtHandler); + +#if wxUSE_VALIDATORS + Text()->SetValidator(wxTextValidator(wxFILTER_NUMERIC)); +#endif + } +} + +void wxGridCellNumberEditor::BeginEdit(int row, int col, wxGrid* grid) +{ + // first get the value + wxGridTableBase *table = grid->GetTable(); + if ( table->CanGetValueAs(row, col, wxGRID_VALUE_NUMBER) ) + { + m_valueOld = table->GetValueAsLong(row, col); + } + else + { + m_valueOld = 0; + wxString sValue = table->GetValue(row, col); + if (! sValue.ToLong(&m_valueOld) && ! sValue.empty()) + { + wxFAIL_MSG( _T("this cell doesn't have numeric value") ); + return; + } + } + +#if wxUSE_SPINCTRL + if ( HasRange() ) + { + Spin()->SetValue((int)m_valueOld); + Spin()->SetFocus(); + } + else +#endif + { + DoBeginEdit(GetString()); + } +} + +bool wxGridCellNumberEditor::EndEdit(int row, int col, + wxGrid* grid) +{ + bool changed; + long value = 0; + wxString text; + +#if wxUSE_SPINCTRL + if ( HasRange() ) + { + value = Spin()->GetValue(); + changed = value != m_valueOld; + if (changed) + text = wxString::Format(wxT("%ld"), value); + } + else +#endif + { + text = Text()->GetValue(); + changed = (text.empty() || text.ToLong(&value)) && (value != m_valueOld); + } + + if ( changed ) + { + if (grid->GetTable()->CanSetValueAs(row, col, wxGRID_VALUE_NUMBER)) + grid->GetTable()->SetValueAsLong(row, col, value); + else + grid->GetTable()->SetValue(row, col, text); + } + + return changed; +} + +void wxGridCellNumberEditor::Reset() +{ +#if wxUSE_SPINCTRL + if ( HasRange() ) + { + Spin()->SetValue((int)m_valueOld); + } + else +#endif + { + DoReset(GetString()); + } +} + +bool wxGridCellNumberEditor::IsAcceptedKey(wxKeyEvent& event) +{ + if ( wxGridCellEditor::IsAcceptedKey(event) ) + { + int keycode = event.GetKeyCode(); + if ( (keycode < 128) && + (wxIsdigit(keycode) || keycode == '+' || keycode == '-')) + { + return true; + } + } + + return false; +} + +void wxGridCellNumberEditor::StartingKey(wxKeyEvent& event) +{ + int keycode = event.GetKeyCode(); + if ( !HasRange() ) + { + if ( wxIsdigit(keycode) || keycode == '+' || keycode == '-') + { + wxGridCellTextEditor::StartingKey(event); + + // skip Skip() below + return; + } + } +#if wxUSE_SPINCTRL + else + { + if ( wxIsdigit(keycode) ) + { + wxSpinCtrl* spin = (wxSpinCtrl*)m_control; + spin->SetValue(keycode - '0'); + spin->SetSelection(1,1); + return; + } + } +#endif + + event.Skip(); +} + +void wxGridCellNumberEditor::SetParameters(const wxString& params) +{ + if ( !params ) + { + // reset to default + m_min = + m_max = -1; + } + else + { + long tmp; + if ( params.BeforeFirst(_T(',')).ToLong(&tmp) ) + { + m_min = (int)tmp; + + if ( params.AfterFirst(_T(',')).ToLong(&tmp) ) + { + m_max = (int)tmp; + + // skip the error message below + return; + } + } + + wxLogDebug(_T("Invalid wxGridCellNumberEditor parameter string '%s' ignored"), params.c_str()); + } +} + +// return the value in the spin control if it is there (the text control otherwise) +wxString wxGridCellNumberEditor::GetValue() const +{ + wxString s; + +#if wxUSE_SPINCTRL + if ( HasRange() ) + { + long value = Spin()->GetValue(); + s.Printf(wxT("%ld"), value); + } + else +#endif + { + s = Text()->GetValue(); + } + + return s; +} + +// ---------------------------------------------------------------------------- +// wxGridCellFloatEditor +// ---------------------------------------------------------------------------- + +wxGridCellFloatEditor::wxGridCellFloatEditor(int width, int precision) +{ + m_width = width; + m_precision = precision; +} + +void wxGridCellFloatEditor::Create(wxWindow* parent, + wxWindowID id, + wxEvtHandler* evtHandler) +{ + wxGridCellTextEditor::Create(parent, id, evtHandler); + +#if wxUSE_VALIDATORS + Text()->SetValidator(wxTextValidator(wxFILTER_NUMERIC)); +#endif +} + +void wxGridCellFloatEditor::BeginEdit(int row, int col, wxGrid* grid) +{ + // first get the value + wxGridTableBase *table = grid->GetTable(); + if ( table->CanGetValueAs(row, col, wxGRID_VALUE_FLOAT) ) + { + m_valueOld = table->GetValueAsDouble(row, col); + } + else + { + m_valueOld = 0.0; + wxString sValue = table->GetValue(row, col); + if (! sValue.ToDouble(&m_valueOld) && ! sValue.empty()) + { + wxFAIL_MSG( _T("this cell doesn't have float value") ); + return; + } + } + + DoBeginEdit(GetString()); +} + +bool wxGridCellFloatEditor::EndEdit(int row, int col, + wxGrid* grid) +{ + double value = 0.0; + wxString text(Text()->GetValue()); + + if ( (text.empty() || text.ToDouble(&value)) && + !wxIsSameDouble(value, m_valueOld) ) + { + if (grid->GetTable()->CanSetValueAs(row, col, wxGRID_VALUE_FLOAT)) + grid->GetTable()->SetValueAsDouble(row, col, value); + else + grid->GetTable()->SetValue(row, col, text); + + return true; + } + + return false; +} + +void wxGridCellFloatEditor::Reset() +{ + DoReset(GetString()); +} + +void wxGridCellFloatEditor::StartingKey(wxKeyEvent& event) +{ + int keycode = event.GetKeyCode(); + char tmpbuf[2]; + tmpbuf[0] = (char) keycode; + tmpbuf[1] = '\0'; + wxString strbuf(tmpbuf, *wxConvCurrent); + +#if wxUSE_INTL + bool is_decimal_point = ( strbuf == + wxLocale::GetInfo(wxLOCALE_DECIMAL_POINT, wxLOCALE_CAT_NUMBER) ); +#else + bool is_decimal_point = ( strbuf == _T(".") ); +#endif + + if ( wxIsdigit(keycode) || keycode == '+' || keycode == '-' + || is_decimal_point ) + { + wxGridCellTextEditor::StartingKey(event); + + // skip Skip() below + return; + } + + event.Skip(); +} + +void wxGridCellFloatEditor::SetParameters(const wxString& params) +{ + if ( !params ) + { + // reset to default + m_width = + m_precision = -1; + } + else + { + long tmp; + if ( params.BeforeFirst(_T(',')).ToLong(&tmp) ) + { + m_width = (int)tmp; + + if ( params.AfterFirst(_T(',')).ToLong(&tmp) ) + { + m_precision = (int)tmp; + + // skip the error message below + return; + } + } + + wxLogDebug(_T("Invalid wxGridCellFloatEditor parameter string '%s' ignored"), params.c_str()); + } +} + +wxString wxGridCellFloatEditor::GetString() const +{ + wxString fmt; + if ( m_precision == -1 && m_width != -1) + { + // default precision + fmt.Printf(_T("%%%d.f"), m_width); + } + else if ( m_precision != -1 && m_width == -1) + { + // default width + fmt.Printf(_T("%%.%df"), m_precision); + } + else if ( m_precision != -1 && m_width != -1 ) + { + fmt.Printf(_T("%%%d.%df"), m_width, m_precision); + } + else + { + // default width/precision + fmt = _T("%f"); + } + + return wxString::Format(fmt, m_valueOld); +} + +bool wxGridCellFloatEditor::IsAcceptedKey(wxKeyEvent& event) +{ + if ( wxGridCellEditor::IsAcceptedKey(event) ) + { + const int keycode = event.GetKeyCode(); + if ( isascii(keycode) ) + { + char tmpbuf[2]; + tmpbuf[0] = (char) keycode; + tmpbuf[1] = '\0'; + wxString strbuf(tmpbuf, *wxConvCurrent); + +#if wxUSE_INTL + const wxString decimalPoint = + wxLocale::GetInfo(wxLOCALE_DECIMAL_POINT, wxLOCALE_CAT_NUMBER); +#else + const wxString decimalPoint(_T('.')); +#endif + + // accept digits, 'e' as in '1e+6', also '-', '+', and '.' + if ( wxIsdigit(keycode) || + tolower(keycode) == 'e' || + keycode == decimalPoint || + keycode == '+' || + keycode == '-' ) + { + return true; + } + } + } + + return false; +} + +#endif // wxUSE_TEXTCTRL + +#if wxUSE_CHECKBOX + +// ---------------------------------------------------------------------------- +// wxGridCellBoolEditor +// ---------------------------------------------------------------------------- + +// the default values for GetValue() +wxString wxGridCellBoolEditor::ms_stringValues[2] = { _T(""), _T("1") }; + +void wxGridCellBoolEditor::Create(wxWindow* parent, + wxWindowID id, + wxEvtHandler* evtHandler) +{ + m_control = new wxCheckBox(parent, id, wxEmptyString, + wxDefaultPosition, wxDefaultSize, + wxNO_BORDER); + + wxGridCellEditor::Create(parent, id, evtHandler); +} + +void wxGridCellBoolEditor::SetSize(const wxRect& r) +{ + bool resize = false; + wxSize size = m_control->GetSize(); + wxCoord minSize = wxMin(r.width, r.height); + + // check if the checkbox is not too big/small for this cell + wxSize sizeBest = m_control->GetBestSize(); + if ( !(size == sizeBest) ) + { + // reset to default size if it had been made smaller + size = sizeBest; + + resize = true; + } + + if ( size.x >= minSize || size.y >= minSize ) + { + // leave 1 pixel margin + size.x = size.y = minSize - 2; + + resize = true; + } + + if ( resize ) + { + m_control->SetSize(size); + } + + // position it in the centre of the rectangle (TODO: support alignment?) + +#if defined(__WXGTK__) || defined (__WXMOTIF__) + // the checkbox without label still has some space to the right in wxGTK, + // so shift it to the right + size.x -= 8; +#elif defined(__WXMSW__) + // here too, but in other way + size.x += 1; + size.y -= 2; +#endif + + int hAlign = wxALIGN_CENTRE; + int vAlign = wxALIGN_CENTRE; + if (GetCellAttr()) + GetCellAttr()->GetAlignment(& hAlign, & vAlign); + + int x = 0, y = 0; + if (hAlign == wxALIGN_LEFT) + { + x = r.x + 2; + +#ifdef __WXMSW__ + x += 2; +#endif + + y = r.y + r.height / 2 - size.y / 2; + } + else if (hAlign == wxALIGN_RIGHT) + { + x = r.x + r.width - size.x - 2; + y = r.y + r.height / 2 - size.y / 2; + } + else if (hAlign == wxALIGN_CENTRE) + { + x = r.x + r.width / 2 - size.x / 2; + y = r.y + r.height / 2 - size.y / 2; + } + + m_control->Move(x, y); +} + +void wxGridCellBoolEditor::Show(bool show, wxGridCellAttr *attr) +{ + m_control->Show(show); + + if ( show ) + { + wxColour colBg = attr ? attr->GetBackgroundColour() : *wxLIGHT_GREY; + CBox()->SetBackgroundColour(colBg); + } +} + +void wxGridCellBoolEditor::BeginEdit(int row, int col, wxGrid* grid) +{ + wxASSERT_MSG(m_control, + wxT("The wxGridCellEditor must be created first!")); + + if (grid->GetTable()->CanGetValueAs(row, col, wxGRID_VALUE_BOOL)) + { + m_startValue = grid->GetTable()->GetValueAsBool(row, col); + } + else + { + wxString cellval( grid->GetTable()->GetValue(row, col) ); + + if ( cellval == ms_stringValues[false] ) + m_startValue = false; + else if ( cellval == ms_stringValues[true] ) + m_startValue = true; + else + { + // do not try to be smart here and convert it to true or false + // because we'll still overwrite it with something different and + // this risks to be very surprising for the user code, let them + // know about it + wxFAIL_MSG( _T("invalid value for a cell with bool editor!") ); + } + } + + CBox()->SetValue(m_startValue); + CBox()->SetFocus(); +} + +bool wxGridCellBoolEditor::EndEdit(int row, int col, + wxGrid* grid) +{ + wxASSERT_MSG(m_control, + wxT("The wxGridCellEditor must be created first!")); + + bool changed = false; + bool value = CBox()->GetValue(); + if ( value != m_startValue ) + changed = true; + + if ( changed ) + { + wxGridTableBase * const table = grid->GetTable(); + if ( table->CanGetValueAs(row, col, wxGRID_VALUE_BOOL) ) + table->SetValueAsBool(row, col, value); + else + table->SetValue(row, col, GetValue()); + } + + return changed; +} + +void wxGridCellBoolEditor::Reset() +{ + wxASSERT_MSG(m_control, + wxT("The wxGridCellEditor must be created first!")); + + CBox()->SetValue(m_startValue); +} + +void wxGridCellBoolEditor::StartingClick() +{ + CBox()->SetValue(!CBox()->GetValue()); +} + +bool wxGridCellBoolEditor::IsAcceptedKey(wxKeyEvent& event) +{ + if ( wxGridCellEditor::IsAcceptedKey(event) ) + { + int keycode = event.GetKeyCode(); + switch ( keycode ) + { + case WXK_SPACE: + case '+': + case '-': + return true; + } + } + + return false; +} + +void wxGridCellBoolEditor::StartingKey(wxKeyEvent& event) +{ + int keycode = event.GetKeyCode(); + switch ( keycode ) + { + case WXK_SPACE: + CBox()->SetValue(!CBox()->GetValue()); + break; + + case '+': + CBox()->SetValue(true); + break; + + case '-': + CBox()->SetValue(false); + break; + } +} + +wxString wxGridCellBoolEditor::GetValue() const +{ + return ms_stringValues[CBox()->GetValue()]; +} + +/* static */ void +wxGridCellBoolEditor::UseStringValues(const wxString& valueTrue, + const wxString& valueFalse) +{ + ms_stringValues[false] = valueFalse; + ms_stringValues[true] = valueTrue; +} + +/* static */ bool +wxGridCellBoolEditor::IsTrueValue(const wxString& value) +{ + return value == ms_stringValues[true]; +} + +#endif // wxUSE_CHECKBOX + +#if wxUSE_COMBOBOX + +// ---------------------------------------------------------------------------- +// wxGridCellChoiceEditor +// ---------------------------------------------------------------------------- + +wxGridCellChoiceEditor::wxGridCellChoiceEditor(const wxArrayString& choices, + bool allowOthers) + : m_choices(choices), + m_allowOthers(allowOthers) { } + +wxGridCellChoiceEditor::wxGridCellChoiceEditor(size_t count, + const wxString choices[], + bool allowOthers) + : m_allowOthers(allowOthers) +{ + if ( count ) + { + m_choices.Alloc(count); + for ( size_t n = 0; n < count; n++ ) + { + m_choices.Add(choices[n]); + } + } +} + +wxGridCellEditor *wxGridCellChoiceEditor::Clone() const +{ + wxGridCellChoiceEditor *editor = new wxGridCellChoiceEditor; + editor->m_allowOthers = m_allowOthers; + editor->m_choices = m_choices; + + return editor; +} + +void wxGridCellChoiceEditor::Create(wxWindow* parent, + wxWindowID id, + wxEvtHandler* evtHandler) +{ + m_control = new wxComboBox(parent, id, wxEmptyString, + wxDefaultPosition, wxDefaultSize, + m_choices, + m_allowOthers ? 0 : wxCB_READONLY); + + wxGridCellEditor::Create(parent, id, evtHandler); +} + +void wxGridCellChoiceEditor::PaintBackground(const wxRect& rectCell, + wxGridCellAttr * attr) +{ + // as we fill the entire client area, don't do anything here to minimize + // flicker + + // TODO: It doesn't actually fill the client area since the height of a + // combo always defaults to the standard. Until someone has time to + // figure out the right rectangle to paint, just do it the normal way. + wxGridCellEditor::PaintBackground(rectCell, attr); +} + +void wxGridCellChoiceEditor::BeginEdit(int row, int col, wxGrid* grid) +{ + wxASSERT_MSG(m_control, + wxT("The wxGridCellEditor must be created first!")); + + wxGridCellEditorEvtHandler* evtHandler = NULL; + if (m_control) + evtHandler = wxDynamicCast(m_control->GetEventHandler(), wxGridCellEditorEvtHandler); + + // Don't immediately end if we get a kill focus event within BeginEdit + if (evtHandler) + evtHandler->SetInSetFocus(true); + + m_startValue = grid->GetTable()->GetValue(row, col); + + if (m_allowOthers) + { + Combo()->SetValue(m_startValue); + } + else + { + // find the right position, or default to the first if not found + int pos = Combo()->FindString(m_startValue); + if (pos == wxNOT_FOUND) + pos = 0; + Combo()->SetSelection(pos); + } + + Combo()->SetInsertionPointEnd(); + Combo()->SetFocus(); + + if (evtHandler) + { + // When dropping down the menu, a kill focus event + // happens after this point, so we can't reset the flag yet. +#if !defined(__WXGTK20__) + evtHandler->SetInSetFocus(false); +#endif + } +} + +bool wxGridCellChoiceEditor::EndEdit(int row, int col, + wxGrid* grid) +{ + wxString value = Combo()->GetValue(); + if ( value == m_startValue ) + return false; + + grid->GetTable()->SetValue(row, col, value); + + return true; +} + +void wxGridCellChoiceEditor::Reset() +{ + Combo()->SetValue(m_startValue); + Combo()->SetInsertionPointEnd(); +} + +void wxGridCellChoiceEditor::SetParameters(const wxString& params) +{ + if ( !params ) + { + // what can we do? + return; + } + + m_choices.Empty(); + + wxStringTokenizer tk(params, _T(',')); + while ( tk.HasMoreTokens() ) + { + m_choices.Add(tk.GetNextToken()); + } +} + +// return the value in the text control +wxString wxGridCellChoiceEditor::GetValue() const +{ + return Combo()->GetValue(); +} + +#endif // wxUSE_COMBOBOX + +// ---------------------------------------------------------------------------- +// wxGridCellEditorEvtHandler +// ---------------------------------------------------------------------------- + +void wxGridCellEditorEvtHandler::OnKillFocus(wxFocusEvent& event) +{ + // Don't disable the cell if we're just starting to edit it + if (m_inSetFocus) + return; + + // accept changes + m_grid->DisableCellEditControl(); + + event.Skip(); +} + +void wxGridCellEditorEvtHandler::OnKeyDown(wxKeyEvent& event) +{ + switch ( event.GetKeyCode() ) + { + case WXK_ESCAPE: + m_editor->Reset(); + m_grid->DisableCellEditControl(); + break; + + case WXK_TAB: + m_grid->GetEventHandler()->ProcessEvent( event ); + break; + + case WXK_RETURN: + case WXK_NUMPAD_ENTER: + if (!m_grid->GetEventHandler()->ProcessEvent(event)) + m_editor->HandleReturn(event); + break; + + default: + event.Skip(); + break; + } +} + +void wxGridCellEditorEvtHandler::OnChar(wxKeyEvent& event) +{ + int row = m_grid->GetGridCursorRow(); + int col = m_grid->GetGridCursorCol(); + wxRect rect = m_grid->CellToRect( row, col ); + int cw, ch; + m_grid->GetGridWindow()->GetClientSize( &cw, &ch ); + + // if cell width is smaller than grid client area, cell is wholly visible + bool wholeCellVisible = (rect.GetWidth() < cw); + + switch ( event.GetKeyCode() ) + { + case WXK_ESCAPE: + case WXK_TAB: + case WXK_RETURN: + case WXK_NUMPAD_ENTER: + break; + + case WXK_HOME: + { + if ( wholeCellVisible ) + { + // no special processing needed... + event.Skip(); + break; + } + + // do special processing for partly visible cell... + + // get the widths of all cells previous to this one + int colXPos = 0; + for ( int i = 0; i < col; i++ ) + { + colXPos += m_grid->GetColSize(i); + } + + int xUnit = 1, yUnit = 1; + m_grid->GetScrollPixelsPerUnit(&xUnit, &yUnit); + if (col != 0) + { + m_grid->Scroll(colXPos / xUnit - 1, m_grid->GetScrollPos(wxVERTICAL)); + } + else + { + m_grid->Scroll(colXPos / xUnit, m_grid->GetScrollPos(wxVERTICAL)); + } + event.Skip(); + break; + } + + case WXK_END: + { + if ( wholeCellVisible ) + { + // no special processing needed... + event.Skip(); + break; + } + + // do special processing for partly visible cell... + + int textWidth = 0; + wxString value = m_grid->GetCellValue(row, col); + if ( wxEmptyString != value ) + { + // get width of cell CONTENTS (text) + int y; + wxFont font = m_grid->GetCellFont(row, col); + m_grid->GetTextExtent(value, &textWidth, &y, NULL, NULL, &font); + + // try to RIGHT align the text by scrolling + int client_right = m_grid->GetGridWindow()->GetClientSize().GetWidth(); + + // (m_grid->GetScrollLineX()*2) is a factor for not scrolling to far, + // otherwise the last part of the cell content might be hidden below the scroll bar + // FIXME: maybe there is a more suitable correction? + textWidth -= (client_right - (m_grid->GetScrollLineX() * 2)); + if ( textWidth < 0 ) + { + textWidth = 0; + } + } + + // get the widths of all cells previous to this one + int colXPos = 0; + for ( int i = 0; i < col; i++ ) + { + colXPos += m_grid->GetColSize(i); + } + + // and add the (modified) text width of the cell contents + // as we'd like to see the last part of the cell contents + colXPos += textWidth; + + int xUnit = 1, yUnit = 1; + m_grid->GetScrollPixelsPerUnit(&xUnit, &yUnit); + m_grid->Scroll(colXPos / xUnit - 1, m_grid->GetScrollPos(wxVERTICAL)); + event.Skip(); + break; + } + + default: + event.Skip(); + break; + } +} + +// ---------------------------------------------------------------------------- +// wxGridCellWorker is an (almost) empty common base class for +// wxGridCellRenderer and wxGridCellEditor managing ref counting +// ---------------------------------------------------------------------------- + +void wxGridCellWorker::SetParameters(const wxString& WXUNUSED(params)) +{ + // nothing to do +} + +wxGridCellWorker::~wxGridCellWorker() +{ +} + +// ============================================================================ +// renderer classes +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxGridCellRenderer +// ---------------------------------------------------------------------------- + +void wxGridCellRenderer::Draw(wxGrid& grid, + wxGridCellAttr& attr, + wxDC& dc, + const wxRect& rect, + int WXUNUSED(row), int WXUNUSED(col), + bool isSelected) +{ + dc.SetBackgroundMode( wxSOLID ); + + // grey out fields if the grid is disabled + if ( grid.IsEnabled() ) + { + if ( isSelected ) + { + dc.SetBrush( wxBrush(grid.GetSelectionBackground(), wxSOLID) ); + } + else + { + dc.SetBrush( wxBrush(attr.GetBackgroundColour(), wxSOLID) ); + } + } + else + { + dc.SetBrush(wxBrush(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE), wxSOLID)); + } + + dc.SetPen( *wxTRANSPARENT_PEN ); + dc.DrawRectangle(rect); +} + +// ---------------------------------------------------------------------------- +// wxGridCellStringRenderer +// ---------------------------------------------------------------------------- + +void wxGridCellStringRenderer::SetTextColoursAndFont(const wxGrid& grid, + const wxGridCellAttr& attr, + wxDC& dc, + bool isSelected) +{ + dc.SetBackgroundMode( wxTRANSPARENT ); + + // TODO some special colours for attr.IsReadOnly() case? + + // different coloured text when the grid is disabled + if ( grid.IsEnabled() ) + { + if ( isSelected ) + { + dc.SetTextBackground( grid.GetSelectionBackground() ); + dc.SetTextForeground( grid.GetSelectionForeground() ); + } + else + { + dc.SetTextBackground( attr.GetBackgroundColour() ); + dc.SetTextForeground( attr.GetTextColour() ); + } + } + else + { + dc.SetTextBackground(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE)); + dc.SetTextForeground(wxSystemSettings::GetColour(wxSYS_COLOUR_GRAYTEXT)); + } + + dc.SetFont( attr.GetFont() ); +} + +wxSize wxGridCellStringRenderer::DoGetBestSize(const wxGridCellAttr& attr, + wxDC& dc, + const wxString& text) +{ + wxCoord x = 0, y = 0, max_x = 0; + dc.SetFont(attr.GetFont()); + wxStringTokenizer tk(text, _T('\n')); + while ( tk.HasMoreTokens() ) + { + dc.GetTextExtent(tk.GetNextToken(), &x, &y); + max_x = wxMax(max_x, x); + } + + y *= 1 + text.Freq(wxT('\n')); // multiply by the number of lines. + + return wxSize(max_x, y); +} + +wxSize wxGridCellStringRenderer::GetBestSize(wxGrid& grid, + wxGridCellAttr& attr, + wxDC& dc, + int row, int col) +{ + return DoGetBestSize(attr, dc, grid.GetCellValue(row, col)); +} + +void wxGridCellStringRenderer::Draw(wxGrid& grid, + wxGridCellAttr& attr, + wxDC& dc, + const wxRect& rectCell, + int row, int col, + bool isSelected) +{ + wxRect rect = rectCell; + rect.Inflate(-1); + + // erase only this cells background, overflow cells should have been erased + wxGridCellRenderer::Draw(grid, attr, dc, rectCell, row, col, isSelected); + + int hAlign, vAlign; + attr.GetAlignment(&hAlign, &vAlign); + + int overflowCols = 0; + + if (attr.GetOverflow()) + { + int cols = grid.GetNumberCols(); + int best_width = GetBestSize(grid,attr,dc,row,col).GetWidth(); + int cell_rows, cell_cols; + attr.GetSize( &cell_rows, &cell_cols ); // shouldn't get here if <= 0 + if ((best_width > rectCell.width) && (col < cols) && grid.GetTable()) + { + int i, c_cols, c_rows; + for (i = col+cell_cols; i < cols; i++) + { + bool is_empty = true; + for (int j=row; j < row + cell_rows; j++) + { + // check w/ anchor cell for multicell block + grid.GetCellSize(j, i, &c_rows, &c_cols); + if (c_rows > 0) + c_rows = 0; + if (!grid.GetTable()->IsEmptyCell(j + c_rows, i)) + { + is_empty = false; + break; + } + } + + if (is_empty) + { + rect.width += grid.GetColSize(i); + } + else + { + i--; + break; + } + + if (rect.width >= best_width) + break; + } + + overflowCols = i - col - cell_cols + 1; + if (overflowCols >= cols) + overflowCols = cols - 1; + } + + if (overflowCols > 0) // redraw overflow cells w/ proper hilight + { + hAlign = wxALIGN_LEFT; // if oveflowed then it's left aligned + wxRect clip = rect; + clip.x += rectCell.width; + // draw each overflow cell individually + int col_end = col + cell_cols + overflowCols; + if (col_end >= grid.GetNumberCols()) + col_end = grid.GetNumberCols() - 1; + for (int i = col + cell_cols; i <= col_end; i++) + { + clip.width = grid.GetColSize(i) - 1; + dc.DestroyClippingRegion(); + dc.SetClippingRegion(clip); + + SetTextColoursAndFont(grid, attr, dc, + grid.IsInSelection(row,i)); + + grid.DrawTextRectangle(dc, grid.GetCellValue(row, col), + rect, hAlign, vAlign); + clip.x += grid.GetColSize(i) - 1; + } + + rect = rectCell; + rect.Inflate(-1); + rect.width++; + dc.DestroyClippingRegion(); + } + } + + // now we only have to draw the text + SetTextColoursAndFont(grid, attr, dc, isSelected); + + grid.DrawTextRectangle(dc, grid.GetCellValue(row, col), + rect, hAlign, vAlign); +} + +// ---------------------------------------------------------------------------- +// wxGridCellNumberRenderer +// ---------------------------------------------------------------------------- + +wxString wxGridCellNumberRenderer::GetString(const wxGrid& grid, int row, int col) +{ + wxGridTableBase *table = grid.GetTable(); + wxString text; + if ( table->CanGetValueAs(row, col, wxGRID_VALUE_NUMBER) ) + { + text.Printf(_T("%ld"), table->GetValueAsLong(row, col)); + } + else + { + text = table->GetValue(row, col); + } + + return text; +} + +void wxGridCellNumberRenderer::Draw(wxGrid& grid, + wxGridCellAttr& attr, + wxDC& dc, + const wxRect& rectCell, + int row, int col, + bool isSelected) +{ + wxGridCellRenderer::Draw(grid, attr, dc, rectCell, row, col, isSelected); + + SetTextColoursAndFont(grid, attr, dc, isSelected); + + // draw the text right aligned by default + int hAlign, vAlign; + attr.GetAlignment(&hAlign, &vAlign); + hAlign = wxALIGN_RIGHT; + + wxRect rect = rectCell; + rect.Inflate(-1); + + grid.DrawTextRectangle(dc, GetString(grid, row, col), rect, hAlign, vAlign); +} + +wxSize wxGridCellNumberRenderer::GetBestSize(wxGrid& grid, + wxGridCellAttr& attr, + wxDC& dc, + int row, int col) +{ + return DoGetBestSize(attr, dc, GetString(grid, row, col)); +} + +// ---------------------------------------------------------------------------- +// wxGridCellFloatRenderer +// ---------------------------------------------------------------------------- + +wxGridCellFloatRenderer::wxGridCellFloatRenderer(int width, int precision) +{ + SetWidth(width); + SetPrecision(precision); +} + +wxGridCellRenderer *wxGridCellFloatRenderer::Clone() const +{ + wxGridCellFloatRenderer *renderer = new wxGridCellFloatRenderer; + renderer->m_width = m_width; + renderer->m_precision = m_precision; + renderer->m_format = m_format; + + return renderer; +} + +wxString wxGridCellFloatRenderer::GetString(const wxGrid& grid, int row, int col) +{ + wxGridTableBase *table = grid.GetTable(); + + bool hasDouble; + double val; + wxString text; + if ( table->CanGetValueAs(row, col, wxGRID_VALUE_FLOAT) ) + { + val = table->GetValueAsDouble(row, col); + hasDouble = true; + } + else + { + text = table->GetValue(row, col); + hasDouble = text.ToDouble(&val); + } + + if ( hasDouble ) + { + if ( !m_format ) + { + if ( m_width == -1 ) + { + if ( m_precision == -1 ) + { + // default width/precision + m_format = _T("%f"); + } + else + { + m_format.Printf(_T("%%.%df"), m_precision); + } + } + else if ( m_precision == -1 ) + { + // default precision + m_format.Printf(_T("%%%d.f"), m_width); + } + else + { + m_format.Printf(_T("%%%d.%df"), m_width, m_precision); + } + } + + text.Printf(m_format, val); + + } + //else: text already contains the string + + return text; +} + +void wxGridCellFloatRenderer::Draw(wxGrid& grid, + wxGridCellAttr& attr, + wxDC& dc, + const wxRect& rectCell, + int row, int col, + bool isSelected) +{ + wxGridCellRenderer::Draw(grid, attr, dc, rectCell, row, col, isSelected); + + SetTextColoursAndFont(grid, attr, dc, isSelected); + + // draw the text right aligned by default + int hAlign, vAlign; + attr.GetAlignment(&hAlign, &vAlign); + hAlign = wxALIGN_RIGHT; + + wxRect rect = rectCell; + rect.Inflate(-1); + + grid.DrawTextRectangle(dc, GetString(grid, row, col), rect, hAlign, vAlign); +} + +wxSize wxGridCellFloatRenderer::GetBestSize(wxGrid& grid, + wxGridCellAttr& attr, + wxDC& dc, + int row, int col) +{ + return DoGetBestSize(attr, dc, GetString(grid, row, col)); +} + +void wxGridCellFloatRenderer::SetParameters(const wxString& params) +{ + if ( !params ) + { + // reset to defaults + SetWidth(-1); + SetPrecision(-1); + } + else + { + wxString tmp = params.BeforeFirst(_T(',')); + if ( !tmp.empty() ) + { + long width; + if ( tmp.ToLong(&width) ) + { + SetWidth((int)width); + } + else + { + wxLogDebug(_T("Invalid wxGridCellFloatRenderer width parameter string '%s ignored"), params.c_str()); + } + } + + tmp = params.AfterFirst(_T(',')); + if ( !tmp.empty() ) + { + long precision; + if ( tmp.ToLong(&precision) ) + { + SetPrecision((int)precision); + } + else + { + wxLogDebug(_T("Invalid wxGridCellFloatRenderer precision parameter string '%s ignored"), params.c_str()); + } + } + } +} + +// ---------------------------------------------------------------------------- +// wxGridCellBoolRenderer +// ---------------------------------------------------------------------------- + +wxSize wxGridCellBoolRenderer::ms_sizeCheckMark; + +// FIXME these checkbox size calculations are really ugly... + +// between checkmark and box +static const wxCoord wxGRID_CHECKMARK_MARGIN = 2; + +wxSize wxGridCellBoolRenderer::GetBestSize(wxGrid& grid, + wxGridCellAttr& WXUNUSED(attr), + wxDC& WXUNUSED(dc), + int WXUNUSED(row), + int WXUNUSED(col)) +{ + // compute it only once (no locks for MT safeness in GUI thread...) + if ( !ms_sizeCheckMark.x ) + { + // get checkbox size + wxCheckBox *checkbox = new wxCheckBox(&grid, wxID_ANY, wxEmptyString); + wxSize size = checkbox->GetBestSize(); + wxCoord checkSize = size.y + 2 * wxGRID_CHECKMARK_MARGIN; + + // FIXME wxGTK::wxCheckBox::GetBestSize() gives "wrong" result +#if defined(__WXGTK__) || defined(__WXMOTIF__) + checkSize -= size.y / 2; +#endif + + delete checkbox; + + ms_sizeCheckMark.x = ms_sizeCheckMark.y = checkSize; + } + + return ms_sizeCheckMark; +} + +void wxGridCellBoolRenderer::Draw(wxGrid& grid, + wxGridCellAttr& attr, + wxDC& dc, + const wxRect& rect, + int row, int col, + bool isSelected) +{ + wxGridCellRenderer::Draw(grid, attr, dc, rect, row, col, isSelected); + + // draw a check mark in the centre (ignoring alignment - TODO) + wxSize size = GetBestSize(grid, attr, dc, row, col); + + // don't draw outside the cell + wxCoord minSize = wxMin(rect.width, rect.height); + if ( size.x >= minSize || size.y >= minSize ) + { + // and even leave (at least) 1 pixel margin + size.x = size.y = minSize - 2; + } + + // draw a border around checkmark + int vAlign, hAlign; + attr.GetAlignment(&hAlign, &vAlign); + + wxRect rectBorder; + if (hAlign == wxALIGN_CENTRE) + { + rectBorder.x = rect.x + rect.width / 2 - size.x / 2; + rectBorder.y = rect.y + rect.height / 2 - size.y / 2; + rectBorder.width = size.x; + rectBorder.height = size.y; + } + else if (hAlign == wxALIGN_LEFT) + { + rectBorder.x = rect.x + 2; + rectBorder.y = rect.y + rect.height / 2 - size.y / 2; + rectBorder.width = size.x; + rectBorder.height = size.y; + } + else if (hAlign == wxALIGN_RIGHT) + { + rectBorder.x = rect.x + rect.width - size.x - 2; + rectBorder.y = rect.y + rect.height / 2 - size.y / 2; + rectBorder.width = size.x; + rectBorder.height = size.y; + } + + bool value; + if ( grid.GetTable()->CanGetValueAs(row, col, wxGRID_VALUE_BOOL) ) + { + value = grid.GetTable()->GetValueAsBool(row, col); + } + else + { + wxString cellval( grid.GetTable()->GetValue(row, col) ); + value = wxGridCellBoolEditor::IsTrueValue(cellval); + } + + if ( value ) + { + wxRect rectMark = rectBorder; + +#ifdef __WXMSW__ + // MSW DrawCheckMark() is weird (and should probably be changed...) + rectMark.Inflate(-wxGRID_CHECKMARK_MARGIN / 2); + rectMark.x++; + rectMark.y++; +#else + rectMark.Inflate(-wxGRID_CHECKMARK_MARGIN); +#endif + + dc.SetTextForeground(attr.GetTextColour()); + dc.DrawCheckMark(rectMark); + } + + dc.SetBrush(*wxTRANSPARENT_BRUSH); + dc.SetPen(wxPen(attr.GetTextColour(), 1, wxSOLID)); + dc.DrawRectangle(rectBorder); +} + +// ---------------------------------------------------------------------------- +// wxGridCellAttr +// ---------------------------------------------------------------------------- + +void wxGridCellAttr::Init(wxGridCellAttr *attrDefault) +{ + m_nRef = 1; + + m_isReadOnly = Unset; + + m_renderer = NULL; + m_editor = NULL; + + m_attrkind = wxGridCellAttr::Cell; + + m_sizeRows = m_sizeCols = 1; + m_overflow = UnsetOverflow; + + SetDefAttr(attrDefault); +} + +wxGridCellAttr *wxGridCellAttr::Clone() const +{ + wxGridCellAttr *attr = new wxGridCellAttr(m_defGridAttr); + + if ( HasTextColour() ) + attr->SetTextColour(GetTextColour()); + if ( HasBackgroundColour() ) + attr->SetBackgroundColour(GetBackgroundColour()); + if ( HasFont() ) + attr->SetFont(GetFont()); + if ( HasAlignment() ) + attr->SetAlignment(m_hAlign, m_vAlign); + + attr->SetSize( m_sizeRows, m_sizeCols ); + + if ( m_renderer ) + { + attr->SetRenderer(m_renderer); + m_renderer->IncRef(); + } + if ( m_editor ) + { + attr->SetEditor(m_editor); + m_editor->IncRef(); + } + + if ( IsReadOnly() ) + attr->SetReadOnly(); + + attr->SetOverflow( m_overflow == Overflow ); + attr->SetKind( m_attrkind ); + + return attr; +} + +void wxGridCellAttr::MergeWith(wxGridCellAttr *mergefrom) +{ + if ( !HasTextColour() && mergefrom->HasTextColour() ) + SetTextColour(mergefrom->GetTextColour()); + if ( !HasBackgroundColour() && mergefrom->HasBackgroundColour() ) + SetBackgroundColour(mergefrom->GetBackgroundColour()); + if ( !HasFont() && mergefrom->HasFont() ) + SetFont(mergefrom->GetFont()); + if ( !HasAlignment() && mergefrom->HasAlignment() ) + { + int hAlign, vAlign; + mergefrom->GetAlignment( &hAlign, &vAlign); + SetAlignment(hAlign, vAlign); + } + if ( !HasSize() && mergefrom->HasSize() ) + mergefrom->GetSize( &m_sizeRows, &m_sizeCols ); + + // Directly access member functions as GetRender/Editor don't just return + // m_renderer/m_editor + // + // Maybe add support for merge of Render and Editor? + if (!HasRenderer() && mergefrom->HasRenderer() ) + { + m_renderer = mergefrom->m_renderer; + m_renderer->IncRef(); + } + if ( !HasEditor() && mergefrom->HasEditor() ) + { + m_editor = mergefrom->m_editor; + m_editor->IncRef(); + } + if ( !HasReadWriteMode() && mergefrom->HasReadWriteMode() ) + SetReadOnly(mergefrom->IsReadOnly()); + + if (!HasOverflowMode() && mergefrom->HasOverflowMode() ) + SetOverflow(mergefrom->GetOverflow()); + + SetDefAttr(mergefrom->m_defGridAttr); +} + +void wxGridCellAttr::SetSize(int num_rows, int num_cols) +{ + // The size of a cell is normally 1,1 + + // If this cell is larger (2,2) then this is the top left cell + // the other cells that will be covered (lower right cells) must be + // set to negative or zero values such that + // row + num_rows of the covered cell points to the larger cell (this cell) + // same goes for the col + num_cols. + + // Size of 0,0 is NOT valid, neither is <=0 and any positive value + + wxASSERT_MSG( (!((num_rows > 0) && (num_cols <= 0)) || + !((num_rows <= 0) && (num_cols > 0)) || + !((num_rows == 0) && (num_cols == 0))), + wxT("wxGridCellAttr::SetSize only takes two postive values or negative/zero values")); + + m_sizeRows = num_rows; + m_sizeCols = num_cols; +} + +const wxColour& wxGridCellAttr::GetTextColour() const +{ + if (HasTextColour()) + { + return m_colText; + } + else if (m_defGridAttr && m_defGridAttr != this) + { + return m_defGridAttr->GetTextColour(); + } + else + { + wxFAIL_MSG(wxT("Missing default cell attribute")); + return wxNullColour; + } +} + +const wxColour& wxGridCellAttr::GetBackgroundColour() const +{ + if (HasBackgroundColour()) + { + return m_colBack; + } + else if (m_defGridAttr && m_defGridAttr != this) + { + return m_defGridAttr->GetBackgroundColour(); + } + else + { + wxFAIL_MSG(wxT("Missing default cell attribute")); + return wxNullColour; + } +} + +const wxFont& wxGridCellAttr::GetFont() const +{ + if (HasFont()) + { + return m_font; + } + else if (m_defGridAttr && m_defGridAttr != this) + { + return m_defGridAttr->GetFont(); + } + else + { + wxFAIL_MSG(wxT("Missing default cell attribute")); + return wxNullFont; + } +} + +void wxGridCellAttr::GetAlignment(int *hAlign, int *vAlign) const +{ + if (HasAlignment()) + { + if ( hAlign ) + *hAlign = m_hAlign; + if ( vAlign ) + *vAlign = m_vAlign; + } + else if (m_defGridAttr && m_defGridAttr != this) + { + m_defGridAttr->GetAlignment(hAlign, vAlign); + } + else + { + wxFAIL_MSG(wxT("Missing default cell attribute")); + } +} + +void wxGridCellAttr::GetSize( int *num_rows, int *num_cols ) const +{ + if ( num_rows ) + *num_rows = m_sizeRows; + if ( num_cols ) + *num_cols = m_sizeCols; +} + +// GetRenderer and GetEditor use a slightly different decision path about +// which attribute to use. If a non-default attr object has one then it is +// used, otherwise the default editor or renderer is fetched from the grid and +// used. It should be the default for the data type of the cell. If it is +// NULL (because the table has a type that the grid does not have in its +// registry), then the grid's default editor or renderer is used. + +wxGridCellRenderer* wxGridCellAttr::GetRenderer(wxGrid* grid, int row, int col) const +{ + wxGridCellRenderer *renderer = NULL; + + if ( m_renderer && this != m_defGridAttr ) + { + // use the cells renderer if it has one + renderer = m_renderer; + renderer->IncRef(); + } + else // no non-default cell renderer + { + // get default renderer for the data type + if ( grid ) + { + // GetDefaultRendererForCell() will do IncRef() for us + renderer = grid->GetDefaultRendererForCell(row, col); + } + + if ( renderer == NULL ) + { + if ( (m_defGridAttr != NULL) && (m_defGridAttr != this) ) + { + // if we still don't have one then use the grid default + // (no need for IncRef() here neither) + renderer = m_defGridAttr->GetRenderer(NULL, 0, 0); + } + else // default grid attr + { + // use m_renderer which we had decided not to use initially + renderer = m_renderer; + if ( renderer ) + renderer->IncRef(); + } + } + } + + // we're supposed to always find something + wxASSERT_MSG(renderer, wxT("Missing default cell renderer")); + + return renderer; +} + +// same as above, except for s/renderer/editor/g +wxGridCellEditor* wxGridCellAttr::GetEditor(wxGrid* grid, int row, int col) const +{ + wxGridCellEditor *editor = NULL; + + if ( m_editor && this != m_defGridAttr ) + { + // use the cells editor if it has one + editor = m_editor; + editor->IncRef(); + } + else // no non default cell editor + { + // get default editor for the data type + if ( grid ) + { + // GetDefaultEditorForCell() will do IncRef() for us + editor = grid->GetDefaultEditorForCell(row, col); + } + + if ( editor == NULL ) + { + if ( (m_defGridAttr != NULL) && (m_defGridAttr != this) ) + { + // if we still don't have one then use the grid default + // (no need for IncRef() here neither) + editor = m_defGridAttr->GetEditor(NULL, 0, 0); + } + else // default grid attr + { + // use m_editor which we had decided not to use initially + editor = m_editor; + if ( editor ) + editor->IncRef(); + } + } + } + + // we're supposed to always find something + wxASSERT_MSG(editor, wxT("Missing default cell editor")); + + return editor; +} + +// ---------------------------------------------------------------------------- +// wxGridCellAttrData +// ---------------------------------------------------------------------------- + +void wxGridCellAttrData::SetAttr(wxGridCellAttr *attr, int row, int col) +{ + int n = FindIndex(row, col); + if ( n == wxNOT_FOUND ) + { + // add the attribute + m_attrs.Add(new wxGridCellWithAttr(row, col, attr)); + } + else + { + // free the old attribute + m_attrs[(size_t)n].attr->DecRef(); + + if ( attr ) + { + // change the attribute + m_attrs[(size_t)n].attr = attr; + } + else + { + // remove this attribute + m_attrs.RemoveAt((size_t)n); + } + } +} + +wxGridCellAttr *wxGridCellAttrData::GetAttr(int row, int col) const +{ + wxGridCellAttr *attr = (wxGridCellAttr *)NULL; + + int n = FindIndex(row, col); + if ( n != wxNOT_FOUND ) + { + attr = m_attrs[(size_t)n].attr; + attr->IncRef(); + } + + return attr; +} + +void wxGridCellAttrData::UpdateAttrRows( size_t pos, int numRows ) +{ + size_t count = m_attrs.GetCount(); + for ( size_t n = 0; n < count; n++ ) + { + wxGridCellCoords& coords = m_attrs[n].coords; + wxCoord row = coords.GetRow(); + if ((size_t)row >= pos) + { + if (numRows > 0) + { + // If rows inserted, include row counter where necessary + coords.SetRow(row + numRows); + } + else if (numRows < 0) + { + // If rows deleted ... + if ((size_t)row >= pos - numRows) + { + // ...either decrement row counter (if row still exists)... + coords.SetRow(row + numRows); + } + else + { + // ...or remove the attribute + // No need to DecRef the attribute itself since this is + // done be wxGridCellWithAttr's destructor! + m_attrs.RemoveAt(n); + n--; + count--; + } + } + } + } +} + +void wxGridCellAttrData::UpdateAttrCols( size_t pos, int numCols ) +{ + size_t count = m_attrs.GetCount(); + for ( size_t n = 0; n < count; n++ ) + { + wxGridCellCoords& coords = m_attrs[n].coords; + wxCoord col = coords.GetCol(); + if ( (size_t)col >= pos ) + { + if ( numCols > 0 ) + { + // If rows inserted, include row counter where necessary + coords.SetCol(col + numCols); + } + else if (numCols < 0) + { + // If rows deleted ... + if ((size_t)col >= pos - numCols) + { + // ...either decrement row counter (if row still exists)... + coords.SetCol(col + numCols); + } + else + { + // ...or remove the attribute + // No need to DecRef the attribute itself since this is + // done be wxGridCellWithAttr's destructor! + m_attrs.RemoveAt(n); + n--; + count--; + } + } + } + } +} + +int wxGridCellAttrData::FindIndex(int row, int col) const +{ + size_t count = m_attrs.GetCount(); + for ( size_t n = 0; n < count; n++ ) + { + const wxGridCellCoords& coords = m_attrs[n].coords; + if ( (coords.GetRow() == row) && (coords.GetCol() == col) ) + { + return n; + } + } + + return wxNOT_FOUND; +} + +// ---------------------------------------------------------------------------- +// wxGridRowOrColAttrData +// ---------------------------------------------------------------------------- + +wxGridRowOrColAttrData::~wxGridRowOrColAttrData() +{ + size_t count = m_attrs.Count(); + for ( size_t n = 0; n < count; n++ ) + { + m_attrs[n]->DecRef(); + } +} + +wxGridCellAttr *wxGridRowOrColAttrData::GetAttr(int rowOrCol) const +{ + wxGridCellAttr *attr = (wxGridCellAttr *)NULL; + + int n = m_rowsOrCols.Index(rowOrCol); + if ( n != wxNOT_FOUND ) + { + attr = m_attrs[(size_t)n]; + attr->IncRef(); + } + + return attr; +} + +void wxGridRowOrColAttrData::SetAttr(wxGridCellAttr *attr, int rowOrCol) +{ + int i = m_rowsOrCols.Index(rowOrCol); + if ( i == wxNOT_FOUND ) + { + // add the attribute + m_rowsOrCols.Add(rowOrCol); + m_attrs.Add(attr); + } + else + { + size_t n = (size_t)i; + if ( attr ) + { + // change the attribute + m_attrs[n]->DecRef(); + m_attrs[n] = attr; + } + else + { + // remove this attribute + m_attrs[n]->DecRef(); + m_rowsOrCols.RemoveAt(n); + m_attrs.RemoveAt(n); + } + } +} + +void wxGridRowOrColAttrData::UpdateAttrRowsOrCols( size_t pos, int numRowsOrCols ) +{ + size_t count = m_attrs.GetCount(); + for ( size_t n = 0; n < count; n++ ) + { + int & rowOrCol = m_rowsOrCols[n]; + if ( (size_t)rowOrCol >= pos ) + { + if ( numRowsOrCols > 0 ) + { + // If rows inserted, include row counter where necessary + rowOrCol += numRowsOrCols; + } + else if ( numRowsOrCols < 0) + { + // If rows deleted, either decrement row counter (if row still exists) + if ((size_t)rowOrCol >= pos - numRowsOrCols) + rowOrCol += numRowsOrCols; + else + { + m_rowsOrCols.RemoveAt(n); + m_attrs[n]->DecRef(); + m_attrs.RemoveAt(n); + n--; + count--; + } + } + } + } +} + +// ---------------------------------------------------------------------------- +// wxGridCellAttrProvider +// ---------------------------------------------------------------------------- + +wxGridCellAttrProvider::wxGridCellAttrProvider() +{ + m_data = (wxGridCellAttrProviderData *)NULL; +} + +wxGridCellAttrProvider::~wxGridCellAttrProvider() +{ + delete m_data; +} + +void wxGridCellAttrProvider::InitData() +{ + m_data = new wxGridCellAttrProviderData; +} + +wxGridCellAttr *wxGridCellAttrProvider::GetAttr(int row, int col, + wxGridCellAttr::wxAttrKind kind ) const +{ + wxGridCellAttr *attr = (wxGridCellAttr *)NULL; + if ( m_data ) + { + switch (kind) + { + case (wxGridCellAttr::Any): + // Get cached merge attributes. + // Currently not used as no cache implemented as not mutable + // attr = m_data->m_mergeAttr.GetAttr(row, col); + if (!attr) + { + // Basically implement old version. + // Also check merge cache, so we don't have to re-merge every time.. + wxGridCellAttr *attrcell = m_data->m_cellAttrs.GetAttr(row, col); + wxGridCellAttr *attrrow = m_data->m_rowAttrs.GetAttr(row); + wxGridCellAttr *attrcol = m_data->m_colAttrs.GetAttr(col); + + if ((attrcell != attrrow) && (attrrow != attrcol) && (attrcell != attrcol)) + { + // Two or more are non NULL + attr = new wxGridCellAttr; + attr->SetKind(wxGridCellAttr::Merged); + + // Order is important.. + if (attrcell) + { + attr->MergeWith(attrcell); + attrcell->DecRef(); + } + if (attrcol) + { + attr->MergeWith(attrcol); + attrcol->DecRef(); + } + if (attrrow) + { + attr->MergeWith(attrrow); + attrrow->DecRef(); + } + + // store merge attr if cache implemented + //attr->IncRef(); + //m_data->m_mergeAttr.SetAttr(attr, row, col); + } + else + { + // one or none is non null return it or null. + if (attrrow) + attr = attrrow; + if (attrcol) + { + if (attr) + attr->DecRef(); + attr = attrcol; + } + if (attrcell) + { + if (attr) + attr->DecRef(); + attr = attrcell; + } + } + } + break; + + case (wxGridCellAttr::Cell): + attr = m_data->m_cellAttrs.GetAttr(row, col); + break; + + case (wxGridCellAttr::Col): + attr = m_data->m_colAttrs.GetAttr(col); + break; + + case (wxGridCellAttr::Row): + attr = m_data->m_rowAttrs.GetAttr(row); + break; + + default: + // unused as yet... + // (wxGridCellAttr::Default): + // (wxGridCellAttr::Merged): + break; + } + } + + return attr; +} + +void wxGridCellAttrProvider::SetAttr(wxGridCellAttr *attr, + int row, int col) +{ + if ( !m_data ) + InitData(); + + m_data->m_cellAttrs.SetAttr(attr, row, col); +} + +void wxGridCellAttrProvider::SetRowAttr(wxGridCellAttr *attr, int row) +{ + if ( !m_data ) + InitData(); + + m_data->m_rowAttrs.SetAttr(attr, row); +} + +void wxGridCellAttrProvider::SetColAttr(wxGridCellAttr *attr, int col) +{ + if ( !m_data ) + InitData(); + + m_data->m_colAttrs.SetAttr(attr, col); +} + +void wxGridCellAttrProvider::UpdateAttrRows( size_t pos, int numRows ) +{ + if ( m_data ) + { + m_data->m_cellAttrs.UpdateAttrRows( pos, numRows ); + + m_data->m_rowAttrs.UpdateAttrRowsOrCols( pos, numRows ); + } +} + +void wxGridCellAttrProvider::UpdateAttrCols( size_t pos, int numCols ) +{ + if ( m_data ) + { + m_data->m_cellAttrs.UpdateAttrCols( pos, numCols ); + + m_data->m_colAttrs.UpdateAttrRowsOrCols( pos, numCols ); + } +} + +// ---------------------------------------------------------------------------- +// wxGridTypeRegistry +// ---------------------------------------------------------------------------- + +wxGridTypeRegistry::~wxGridTypeRegistry() +{ + size_t count = m_typeinfo.Count(); + for ( size_t i = 0; i < count; i++ ) + delete m_typeinfo[i]; +} + +void wxGridTypeRegistry::RegisterDataType(const wxString& typeName, + wxGridCellRenderer* renderer, + wxGridCellEditor* editor) +{ + wxGridDataTypeInfo* info = new wxGridDataTypeInfo(typeName, renderer, editor); + + // is it already registered? + int loc = FindRegisteredDataType(typeName); + if ( loc != wxNOT_FOUND ) + { + delete m_typeinfo[loc]; + m_typeinfo[loc] = info; + } + else + { + m_typeinfo.Add(info); + } +} + +int wxGridTypeRegistry::FindRegisteredDataType(const wxString& typeName) +{ + size_t count = m_typeinfo.GetCount(); + for ( size_t i = 0; i < count; i++ ) + { + if ( typeName == m_typeinfo[i]->m_typeName ) + { + return i; + } + } + + return wxNOT_FOUND; +} + +int wxGridTypeRegistry::FindDataType(const wxString& typeName) +{ + int index = FindRegisteredDataType(typeName); + if ( index == wxNOT_FOUND ) + { + // check whether this is one of the standard ones, in which case + // register it "on the fly" +#if wxUSE_TEXTCTRL + if ( typeName == wxGRID_VALUE_STRING ) + { + RegisterDataType(wxGRID_VALUE_STRING, + new wxGridCellStringRenderer, + new wxGridCellTextEditor); + } + else +#endif // wxUSE_TEXTCTRL +#if wxUSE_CHECKBOX + if ( typeName == wxGRID_VALUE_BOOL ) + { + RegisterDataType(wxGRID_VALUE_BOOL, + new wxGridCellBoolRenderer, + new wxGridCellBoolEditor); + } + else +#endif // wxUSE_CHECKBOX +#if wxUSE_TEXTCTRL + if ( typeName == wxGRID_VALUE_NUMBER ) + { + RegisterDataType(wxGRID_VALUE_NUMBER, + new wxGridCellNumberRenderer, + new wxGridCellNumberEditor); + } + else if ( typeName == wxGRID_VALUE_FLOAT ) + { + RegisterDataType(wxGRID_VALUE_FLOAT, + new wxGridCellFloatRenderer, + new wxGridCellFloatEditor); + } + else +#endif // wxUSE_TEXTCTRL +#if wxUSE_COMBOBOX + if ( typeName == wxGRID_VALUE_CHOICE ) + { + RegisterDataType(wxGRID_VALUE_CHOICE, + new wxGridCellStringRenderer, + new wxGridCellChoiceEditor); + } + else +#endif // wxUSE_COMBOBOX + { + return wxNOT_FOUND; + } + + // we get here only if just added the entry for this type, so return + // the last index + index = m_typeinfo.GetCount() - 1; + } + + return index; +} + +int wxGridTypeRegistry::FindOrCloneDataType(const wxString& typeName) +{ + int index = FindDataType(typeName); + if ( index == wxNOT_FOUND ) + { + // the first part of the typename is the "real" type, anything after ':' + // are the parameters for the renderer + index = FindDataType(typeName.BeforeFirst(_T(':'))); + if ( index == wxNOT_FOUND ) + { + return wxNOT_FOUND; + } + + wxGridCellRenderer *renderer = GetRenderer(index); + wxGridCellRenderer *rendererOld = renderer; + renderer = renderer->Clone(); + rendererOld->DecRef(); + + wxGridCellEditor *editor = GetEditor(index); + wxGridCellEditor *editorOld = editor; + editor = editor->Clone(); + editorOld->DecRef(); + + // do it even if there are no parameters to reset them to defaults + wxString params = typeName.AfterFirst(_T(':')); + renderer->SetParameters(params); + editor->SetParameters(params); + + // register the new typename + RegisterDataType(typeName, renderer, editor); + + // we just registered it, it's the last one + index = m_typeinfo.GetCount() - 1; + } + + return index; +} + +wxGridCellRenderer* wxGridTypeRegistry::GetRenderer(int index) +{ + wxGridCellRenderer* renderer = m_typeinfo[index]->m_renderer; + if (renderer) + renderer->IncRef(); + + return renderer; +} + +wxGridCellEditor* wxGridTypeRegistry::GetEditor(int index) +{ + wxGridCellEditor* editor = m_typeinfo[index]->m_editor; + if (editor) + editor->IncRef(); + + return editor; +} + +// ---------------------------------------------------------------------------- +// wxGridTableBase +// ---------------------------------------------------------------------------- + +IMPLEMENT_ABSTRACT_CLASS( wxGridTableBase, wxObject ) + +wxGridTableBase::wxGridTableBase() +{ + m_view = (wxGrid *) NULL; + m_attrProvider = (wxGridCellAttrProvider *) NULL; +} + +wxGridTableBase::~wxGridTableBase() +{ + delete m_attrProvider; +} + +void wxGridTableBase::SetAttrProvider(wxGridCellAttrProvider *attrProvider) +{ + delete m_attrProvider; + m_attrProvider = attrProvider; +} + +bool wxGridTableBase::CanHaveAttributes() +{ + if ( ! GetAttrProvider() ) + { + // use the default attr provider by default + SetAttrProvider(new wxGridCellAttrProvider); + } + + return true; +} + +wxGridCellAttr *wxGridTableBase::GetAttr(int row, int col, wxGridCellAttr::wxAttrKind kind) +{ + if ( m_attrProvider ) + return m_attrProvider->GetAttr(row, col, kind); + else + return (wxGridCellAttr *)NULL; +} + +void wxGridTableBase::SetAttr(wxGridCellAttr* attr, int row, int col) +{ + if ( m_attrProvider ) + { + attr->SetKind(wxGridCellAttr::Cell); + m_attrProvider->SetAttr(attr, row, col); + } + else + { + // as we take ownership of the pointer and don't store it, we must + // free it now + wxSafeDecRef(attr); + } +} + +void wxGridTableBase::SetRowAttr(wxGridCellAttr *attr, int row) +{ + if ( m_attrProvider ) + { + attr->SetKind(wxGridCellAttr::Row); + m_attrProvider->SetRowAttr(attr, row); + } + else + { + // as we take ownership of the pointer and don't store it, we must + // free it now + wxSafeDecRef(attr); + } +} + +void wxGridTableBase::SetColAttr(wxGridCellAttr *attr, int col) +{ + if ( m_attrProvider ) + { + attr->SetKind(wxGridCellAttr::Col); + m_attrProvider->SetColAttr(attr, col); + } + else + { + // as we take ownership of the pointer and don't store it, we must + // free it now + wxSafeDecRef(attr); + } +} + +bool wxGridTableBase::InsertRows( size_t WXUNUSED(pos), + size_t WXUNUSED(numRows) ) +{ + wxFAIL_MSG( wxT("Called grid table class function InsertRows\nbut your derived table class does not override this function") ); + + return false; +} + +bool wxGridTableBase::AppendRows( size_t WXUNUSED(numRows) ) +{ + wxFAIL_MSG( wxT("Called grid table class function AppendRows\nbut your derived table class does not override this function")); + + return false; +} + +bool wxGridTableBase::DeleteRows( size_t WXUNUSED(pos), + size_t WXUNUSED(numRows) ) +{ + wxFAIL_MSG( wxT("Called grid table class function DeleteRows\nbut your derived table class does not override this function")); + + return false; +} + +bool wxGridTableBase::InsertCols( size_t WXUNUSED(pos), + size_t WXUNUSED(numCols) ) +{ + wxFAIL_MSG( wxT("Called grid table class function InsertCols\nbut your derived table class does not override this function")); + + return false; +} + +bool wxGridTableBase::AppendCols( size_t WXUNUSED(numCols) ) +{ + wxFAIL_MSG(wxT("Called grid table class function AppendCols\nbut your derived table class does not override this function")); + + return false; +} + +bool wxGridTableBase::DeleteCols( size_t WXUNUSED(pos), + size_t WXUNUSED(numCols) ) +{ + wxFAIL_MSG( wxT("Called grid table class function DeleteCols\nbut your derived table class does not override this function")); + + return false; +} + +wxString wxGridTableBase::GetRowLabelValue( int row ) +{ + wxString s; + + // RD: Starting the rows at zero confuses users, + // no matter how much it makes sense to us geeks. + s << row + 1; + + return s; +} + +wxString wxGridTableBase::GetColLabelValue( int col ) +{ + // default col labels are: + // cols 0 to 25 : A-Z + // cols 26 to 675 : AA-ZZ + // etc. + + wxString s; + unsigned int i, n; + for ( n = 1; ; n++ ) + { + s += (wxChar) (_T('A') + (wxChar)(col % 26)); + col = col / 26 - 1; + if ( col < 0 ) + break; + } + + // reverse the string... + wxString s2; + for ( i = 0; i < n; i++ ) + { + s2 += s[n - i - 1]; + } + + return s2; +} + +wxString wxGridTableBase::GetTypeName( int WXUNUSED(row), int WXUNUSED(col) ) +{ + return wxGRID_VALUE_STRING; +} + +bool wxGridTableBase::CanGetValueAs( int WXUNUSED(row), int WXUNUSED(col), + const wxString& typeName ) +{ + return typeName == wxGRID_VALUE_STRING; +} + +bool wxGridTableBase::CanSetValueAs( int row, int col, const wxString& typeName ) +{ + return CanGetValueAs(row, col, typeName); +} + +long wxGridTableBase::GetValueAsLong( int WXUNUSED(row), int WXUNUSED(col) ) +{ + return 0; +} + +double wxGridTableBase::GetValueAsDouble( int WXUNUSED(row), int WXUNUSED(col) ) +{ + return 0.0; +} + +bool wxGridTableBase::GetValueAsBool( int WXUNUSED(row), int WXUNUSED(col) ) +{ + return false; +} + +void wxGridTableBase::SetValueAsLong( int WXUNUSED(row), int WXUNUSED(col), + long WXUNUSED(value) ) +{ +} + +void wxGridTableBase::SetValueAsDouble( int WXUNUSED(row), int WXUNUSED(col), + double WXUNUSED(value) ) +{ +} + +void wxGridTableBase::SetValueAsBool( int WXUNUSED(row), int WXUNUSED(col), + bool WXUNUSED(value) ) +{ +} + +void* wxGridTableBase::GetValueAsCustom( int WXUNUSED(row), int WXUNUSED(col), + const wxString& WXUNUSED(typeName) ) +{ + return NULL; +} + +void wxGridTableBase::SetValueAsCustom( int WXUNUSED(row), int WXUNUSED(col), + const wxString& WXUNUSED(typeName), + void* WXUNUSED(value) ) +{ +} + +////////////////////////////////////////////////////////////////////// +// +// Message class for the grid table to send requests and notifications +// to the grid view +// + +wxGridTableMessage::wxGridTableMessage() +{ + m_table = (wxGridTableBase *) NULL; + m_id = -1; + m_comInt1 = -1; + m_comInt2 = -1; +} + +wxGridTableMessage::wxGridTableMessage( wxGridTableBase *table, int id, + int commandInt1, int commandInt2 ) +{ + m_table = table; + m_id = id; + m_comInt1 = commandInt1; + m_comInt2 = commandInt2; +} + +////////////////////////////////////////////////////////////////////// +// +// A basic grid table for string data. An object of this class will +// created by wxGrid if you don't specify an alternative table class. +// + +WX_DEFINE_OBJARRAY(wxGridStringArray) + +IMPLEMENT_DYNAMIC_CLASS( wxGridStringTable, wxGridTableBase ) + +wxGridStringTable::wxGridStringTable() + : wxGridTableBase() +{ +} + +wxGridStringTable::wxGridStringTable( int numRows, int numCols ) + : wxGridTableBase() +{ + m_data.Alloc( numRows ); + + wxArrayString sa; + sa.Alloc( numCols ); + sa.Add( wxEmptyString, numCols ); + + m_data.Add( sa, numRows ); +} + +wxGridStringTable::~wxGridStringTable() +{ +} + +int wxGridStringTable::GetNumberRows() +{ + return m_data.GetCount(); +} + +int wxGridStringTable::GetNumberCols() +{ + if ( m_data.GetCount() > 0 ) + return m_data[0].GetCount(); + else + return 0; +} + +wxString wxGridStringTable::GetValue( int row, int col ) +{ + wxCHECK_MSG( (row < GetNumberRows()) && (col < GetNumberCols()), + wxEmptyString, + _T("invalid row or column index in wxGridStringTable") ); + + return m_data[row][col]; +} + +void wxGridStringTable::SetValue( int row, int col, const wxString& value ) +{ + wxCHECK_RET( (row < GetNumberRows()) && (col < GetNumberCols()), + _T("invalid row or column index in wxGridStringTable") ); + + m_data[row][col] = value; +} + +bool wxGridStringTable::IsEmptyCell( int row, int col ) +{ + wxCHECK_MSG( (row < GetNumberRows()) && (col < GetNumberCols()), + true, + _T("invalid row or column index in wxGridStringTable") ); + + return (m_data[row][col] == wxEmptyString); +} + +void wxGridStringTable::Clear() +{ + int row, col; + int numRows, numCols; + + numRows = m_data.GetCount(); + if ( numRows > 0 ) + { + numCols = m_data[0].GetCount(); + + for ( row = 0; row < numRows; row++ ) + { + for ( col = 0; col < numCols; col++ ) + { + m_data[row][col] = wxEmptyString; + } + } + } +} + +bool wxGridStringTable::InsertRows( size_t pos, size_t numRows ) +{ + size_t curNumRows = m_data.GetCount(); + size_t curNumCols = ( curNumRows > 0 ? m_data[0].GetCount() : + ( GetView() ? GetView()->GetNumberCols() : 0 ) ); + + if ( pos >= curNumRows ) + { + return AppendRows( numRows ); + } + + wxArrayString sa; + sa.Alloc( curNumCols ); + sa.Add( wxEmptyString, curNumCols ); + m_data.Insert( sa, pos, numRows ); + + if ( GetView() ) + { + wxGridTableMessage msg( this, + wxGRIDTABLE_NOTIFY_ROWS_INSERTED, + pos, + numRows ); + + GetView()->ProcessTableMessage( msg ); + } + + return true; +} + +bool wxGridStringTable::AppendRows( size_t numRows ) +{ + size_t curNumRows = m_data.GetCount(); + size_t curNumCols = ( curNumRows > 0 + ? m_data[0].GetCount() + : ( GetView() ? GetView()->GetNumberCols() : 0 ) ); + + wxArrayString sa; + if ( curNumCols > 0 ) + { + sa.Alloc( curNumCols ); + sa.Add( wxEmptyString, curNumCols ); + } + + m_data.Add( sa, numRows ); + + if ( GetView() ) + { + wxGridTableMessage msg( this, + wxGRIDTABLE_NOTIFY_ROWS_APPENDED, + numRows ); + + GetView()->ProcessTableMessage( msg ); + } + + return true; +} + +bool wxGridStringTable::DeleteRows( size_t pos, size_t numRows ) +{ + size_t curNumRows = m_data.GetCount(); + + if ( pos >= curNumRows ) + { + wxFAIL_MSG( wxString::Format + ( + wxT("Called wxGridStringTable::DeleteRows(pos=%lu, N=%lu)\nPos value is invalid for present table with %lu rows"), + (unsigned long)pos, + (unsigned long)numRows, + (unsigned long)curNumRows + ) ); + + return false; + } + + if ( numRows > curNumRows - pos ) + { + numRows = curNumRows - pos; + } + + if ( numRows >= curNumRows ) + { + m_data.Clear(); + } + else + { + m_data.RemoveAt( pos, numRows ); + } + + if ( GetView() ) + { + wxGridTableMessage msg( this, + wxGRIDTABLE_NOTIFY_ROWS_DELETED, + pos, + numRows ); + + GetView()->ProcessTableMessage( msg ); + } + + return true; +} + +bool wxGridStringTable::InsertCols( size_t pos, size_t numCols ) +{ + size_t row, col; + + size_t curNumRows = m_data.GetCount(); + size_t curNumCols = ( curNumRows > 0 + ? m_data[0].GetCount() + : ( GetView() ? GetView()->GetNumberCols() : 0 ) ); + + if ( pos >= curNumCols ) + { + return AppendCols( numCols ); + } + + if ( !m_colLabels.IsEmpty() ) + { + m_colLabels.Insert( wxEmptyString, pos, numCols ); + + size_t i; + for ( i = pos; i < pos + numCols; i++ ) + m_colLabels[i] = wxGridTableBase::GetColLabelValue( i ); + } + + for ( row = 0; row < curNumRows; row++ ) + { + for ( col = pos; col < pos + numCols; col++ ) + { + m_data[row].Insert( wxEmptyString, col ); + } + } + + if ( GetView() ) + { + wxGridTableMessage msg( this, + wxGRIDTABLE_NOTIFY_COLS_INSERTED, + pos, + numCols ); + + GetView()->ProcessTableMessage( msg ); + } + + return true; +} + +bool wxGridStringTable::AppendCols( size_t numCols ) +{ + size_t row; + + size_t curNumRows = m_data.GetCount(); + +#if 0 + if ( !curNumRows ) + { + // TODO: something better than this ? + // + wxFAIL_MSG( wxT("Unable to append cols to a grid table with no rows.\nCall AppendRows() first") ); + return false; + } +#endif + + for ( row = 0; row < curNumRows; row++ ) + { + m_data[row].Add( wxEmptyString, numCols ); + } + + if ( GetView() ) + { + wxGridTableMessage msg( this, + wxGRIDTABLE_NOTIFY_COLS_APPENDED, + numCols ); + + GetView()->ProcessTableMessage( msg ); + } + + return true; +} + +bool wxGridStringTable::DeleteCols( size_t pos, size_t numCols ) +{ + size_t row; + + size_t curNumRows = m_data.GetCount(); + size_t curNumCols = ( curNumRows > 0 ? m_data[0].GetCount() : + ( GetView() ? GetView()->GetNumberCols() : 0 ) ); + + if ( pos >= curNumCols ) + { + wxFAIL_MSG( wxString::Format + ( + wxT("Called wxGridStringTable::DeleteCols(pos=%lu, N=%lu)\nPos value is invalid for present table with %lu cols"), + (unsigned long)pos, + (unsigned long)numCols, + (unsigned long)curNumCols + ) ); + return false; + } + + int colID; + if ( GetView() ) + colID = GetView()->GetColAt( pos ); + else + colID = pos; + + if ( numCols > curNumCols - colID ) + { + numCols = curNumCols - colID; + } + + if ( !m_colLabels.IsEmpty() ) + { + // m_colLabels stores just as many elements as it needs, e.g. if only + // the label of the first column had been set it would have only one + // element and not numCols, so account for it + int nToRm = m_colLabels.size() - colID; + if ( nToRm > 0 ) + m_colLabels.RemoveAt( colID, nToRm ); + } + + for ( row = 0; row < curNumRows; row++ ) + { + if ( numCols >= curNumCols ) + { + m_data[row].Clear(); + } + else + { + m_data[row].RemoveAt( colID, numCols ); + } + } + + if ( GetView() ) + { + wxGridTableMessage msg( this, + wxGRIDTABLE_NOTIFY_COLS_DELETED, + pos, + numCols ); + + GetView()->ProcessTableMessage( msg ); + } + + return true; +} + +wxString wxGridStringTable::GetRowLabelValue( int row ) +{ + if ( row > (int)(m_rowLabels.GetCount()) - 1 ) + { + // using default label + // + return wxGridTableBase::GetRowLabelValue( row ); + } + else + { + return m_rowLabels[row]; + } +} + +wxString wxGridStringTable::GetColLabelValue( int col ) +{ + if ( col > (int)(m_colLabels.GetCount()) - 1 ) + { + // using default label + // + return wxGridTableBase::GetColLabelValue( col ); + } + else + { + return m_colLabels[col]; + } +} + +void wxGridStringTable::SetRowLabelValue( int row, const wxString& value ) +{ + if ( row > (int)(m_rowLabels.GetCount()) - 1 ) + { + int n = m_rowLabels.GetCount(); + int i; + + for ( i = n; i <= row; i++ ) + { + m_rowLabels.Add( wxGridTableBase::GetRowLabelValue(i) ); + } + } + + m_rowLabels[row] = value; +} + +void wxGridStringTable::SetColLabelValue( int col, const wxString& value ) +{ + if ( col > (int)(m_colLabels.GetCount()) - 1 ) + { + int n = m_colLabels.GetCount(); + int i; + + for ( i = n; i <= col; i++ ) + { + m_colLabels.Add( wxGridTableBase::GetColLabelValue(i) ); + } + } + + m_colLabels[col] = value; +} + + +////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////// + +IMPLEMENT_DYNAMIC_CLASS( wxGridRowLabelWindow, wxWindow ) + +BEGIN_EVENT_TABLE( wxGridRowLabelWindow, wxWindow ) + EVT_PAINT( wxGridRowLabelWindow::OnPaint ) + EVT_MOUSEWHEEL( wxGridRowLabelWindow::OnMouseWheel ) + EVT_MOUSE_EVENTS( wxGridRowLabelWindow::OnMouseEvent ) + EVT_KEY_DOWN( wxGridRowLabelWindow::OnKeyDown ) + EVT_KEY_UP( wxGridRowLabelWindow::OnKeyUp ) + EVT_CHAR( wxGridRowLabelWindow::OnChar ) +END_EVENT_TABLE() + +wxGridRowLabelWindow::wxGridRowLabelWindow( wxGrid *parent, + wxWindowID id, + const wxPoint &pos, const wxSize &size ) + : wxWindow( parent, id, pos, size, wxWANTS_CHARS | wxBORDER_NONE | wxFULL_REPAINT_ON_RESIZE ) +{ + m_owner = parent; +} + +void wxGridRowLabelWindow::OnPaint( wxPaintEvent& WXUNUSED(event) ) +{ + wxPaintDC dc(this); + + // NO - don't do this because it will set both the x and y origin + // coords to match the parent scrolled window and we just want to + // set the y coord - MB + // + // m_owner->PrepareDC( dc ); + + int x, y; + m_owner->CalcUnscrolledPosition( 0, 0, &x, &y ); + wxPoint pt = dc.GetDeviceOrigin(); + dc.SetDeviceOrigin( pt.x, pt.y-y ); + + wxArrayInt rows = m_owner->CalcRowLabelsExposed( GetUpdateRegion() ); + m_owner->DrawRowLabels( dc, rows ); +} + +void wxGridRowLabelWindow::OnMouseEvent( wxMouseEvent& event ) +{ + m_owner->ProcessRowLabelMouseEvent( event ); +} + +void wxGridRowLabelWindow::OnMouseWheel( wxMouseEvent& event ) +{ + m_owner->GetEventHandler()->ProcessEvent( event ); +} + +// This seems to be required for wxMotif otherwise the mouse +// cursor must be in the cell edit control to get key events +// +void wxGridRowLabelWindow::OnKeyDown( wxKeyEvent& event ) +{ + if ( !m_owner->GetEventHandler()->ProcessEvent( event ) ) + event.Skip(); +} + +void wxGridRowLabelWindow::OnKeyUp( wxKeyEvent& event ) +{ + if ( !m_owner->GetEventHandler()->ProcessEvent( event ) ) + event.Skip(); +} + +void wxGridRowLabelWindow::OnChar( wxKeyEvent& event ) +{ + if ( !m_owner->GetEventHandler()->ProcessEvent( event ) ) + event.Skip(); +} + +////////////////////////////////////////////////////////////////////// + +IMPLEMENT_DYNAMIC_CLASS( wxGridColLabelWindow, wxWindow ) + +BEGIN_EVENT_TABLE( wxGridColLabelWindow, wxWindow ) + EVT_PAINT( wxGridColLabelWindow::OnPaint ) + EVT_MOUSEWHEEL( wxGridColLabelWindow::OnMouseWheel ) + EVT_MOUSE_EVENTS( wxGridColLabelWindow::OnMouseEvent ) + EVT_KEY_DOWN( wxGridColLabelWindow::OnKeyDown ) + EVT_KEY_UP( wxGridColLabelWindow::OnKeyUp ) + EVT_CHAR( wxGridColLabelWindow::OnChar ) +END_EVENT_TABLE() + +wxGridColLabelWindow::wxGridColLabelWindow( wxGrid *parent, + wxWindowID id, + const wxPoint &pos, const wxSize &size ) + : wxWindow( parent, id, pos, size, wxWANTS_CHARS | wxBORDER_NONE | wxFULL_REPAINT_ON_RESIZE ) +{ + m_owner = parent; +} + +void wxGridColLabelWindow::OnPaint( wxPaintEvent& WXUNUSED(event) ) +{ + wxPaintDC dc(this); + + // NO - don't do this because it will set both the x and y origin + // coords to match the parent scrolled window and we just want to + // set the x coord - MB + // + // m_owner->PrepareDC( dc ); + + int x, y; + m_owner->CalcUnscrolledPosition( 0, 0, &x, &y ); + wxPoint pt = dc.GetDeviceOrigin(); + if (GetLayoutDirection() == wxLayout_RightToLeft) + dc.SetDeviceOrigin( pt.x+x, pt.y ); + else + dc.SetDeviceOrigin( pt.x-x, pt.y ); + + wxArrayInt cols = m_owner->CalcColLabelsExposed( GetUpdateRegion() ); + m_owner->DrawColLabels( dc, cols ); +} + +void wxGridColLabelWindow::OnMouseEvent( wxMouseEvent& event ) +{ + m_owner->ProcessColLabelMouseEvent( event ); +} + +void wxGridColLabelWindow::OnMouseWheel( wxMouseEvent& event ) +{ + m_owner->GetEventHandler()->ProcessEvent( event ); +} + +// This seems to be required for wxMotif otherwise the mouse +// cursor must be in the cell edit control to get key events +// +void wxGridColLabelWindow::OnKeyDown( wxKeyEvent& event ) +{ + if ( !m_owner->GetEventHandler()->ProcessEvent( event ) ) + event.Skip(); +} + +void wxGridColLabelWindow::OnKeyUp( wxKeyEvent& event ) +{ + if ( !m_owner->GetEventHandler()->ProcessEvent( event ) ) + event.Skip(); +} + +void wxGridColLabelWindow::OnChar( wxKeyEvent& event ) +{ + if ( !m_owner->GetEventHandler()->ProcessEvent( event ) ) + event.Skip(); +} + +////////////////////////////////////////////////////////////////////// + +IMPLEMENT_DYNAMIC_CLASS( wxGridCornerLabelWindow, wxWindow ) + +BEGIN_EVENT_TABLE( wxGridCornerLabelWindow, wxWindow ) + EVT_MOUSEWHEEL( wxGridCornerLabelWindow::OnMouseWheel ) + EVT_MOUSE_EVENTS( wxGridCornerLabelWindow::OnMouseEvent ) + EVT_PAINT( wxGridCornerLabelWindow::OnPaint ) + EVT_KEY_DOWN( wxGridCornerLabelWindow::OnKeyDown ) + EVT_KEY_UP( wxGridCornerLabelWindow::OnKeyUp ) + EVT_CHAR( wxGridCornerLabelWindow::OnChar ) +END_EVENT_TABLE() + +wxGridCornerLabelWindow::wxGridCornerLabelWindow( wxGrid *parent, + wxWindowID id, + const wxPoint &pos, const wxSize &size ) + : wxWindow( parent, id, pos, size, wxWANTS_CHARS | wxBORDER_NONE | wxFULL_REPAINT_ON_RESIZE ) +{ + m_owner = parent; +} + +void wxGridCornerLabelWindow::OnPaint( wxPaintEvent& WXUNUSED(event) ) +{ + wxPaintDC dc(this); + + int client_height = 0; + int client_width = 0; + GetClientSize( &client_width, &client_height ); + + // VZ: any reason for this ifdef? (FIXME) +#if 0 +def __WXGTK__ + wxRect rect; + rect.SetX( 1 ); + rect.SetY( 1 ); + rect.SetWidth( client_width - 2 ); + rect.SetHeight( client_height - 2 ); + + wxRendererNative::Get().DrawHeaderButton( this, dc, rect, 0 ); +#else // !__WXGTK__ + dc.SetPen( wxPen(wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW), 1, wxSOLID) ); + dc.DrawLine( client_width - 1, client_height - 1, client_width - 1, 0 ); + dc.DrawLine( client_width - 1, client_height - 1, 0, client_height - 1 ); + dc.DrawLine( 0, 0, client_width, 0 ); + dc.DrawLine( 0, 0, 0, client_height ); + + dc.SetPen( *wxWHITE_PEN ); + dc.DrawLine( 1, 1, client_width - 1, 1 ); + dc.DrawLine( 1, 1, 1, client_height - 1 ); +#endif +} + +void wxGridCornerLabelWindow::OnMouseEvent( wxMouseEvent& event ) +{ + m_owner->ProcessCornerLabelMouseEvent( event ); +} + +void wxGridCornerLabelWindow::OnMouseWheel( wxMouseEvent& event ) +{ + m_owner->GetEventHandler()->ProcessEvent(event); +} + +// This seems to be required for wxMotif otherwise the mouse +// cursor must be in the cell edit control to get key events +// +void wxGridCornerLabelWindow::OnKeyDown( wxKeyEvent& event ) +{ + if ( !m_owner->GetEventHandler()->ProcessEvent( event ) ) + event.Skip(); +} + +void wxGridCornerLabelWindow::OnKeyUp( wxKeyEvent& event ) +{ + if ( !m_owner->GetEventHandler()->ProcessEvent( event ) ) + event.Skip(); +} + +void wxGridCornerLabelWindow::OnChar( wxKeyEvent& event ) +{ + if ( !m_owner->GetEventHandler()->ProcessEvent( event ) ) + event.Skip(); +} + +////////////////////////////////////////////////////////////////////// + +IMPLEMENT_DYNAMIC_CLASS( wxGridWindow, wxWindow ) + +BEGIN_EVENT_TABLE( wxGridWindow, wxWindow ) + EVT_PAINT( wxGridWindow::OnPaint ) + EVT_MOUSEWHEEL( wxGridWindow::OnMouseWheel ) + EVT_MOUSE_EVENTS( wxGridWindow::OnMouseEvent ) + EVT_KEY_DOWN( wxGridWindow::OnKeyDown ) + EVT_KEY_UP( wxGridWindow::OnKeyUp ) + EVT_CHAR( wxGridWindow::OnChar ) + EVT_SET_FOCUS( wxGridWindow::OnFocus ) + EVT_KILL_FOCUS( wxGridWindow::OnFocus ) + EVT_ERASE_BACKGROUND( wxGridWindow::OnEraseBackground ) +END_EVENT_TABLE() + +wxGridWindow::wxGridWindow( wxGrid *parent, + wxGridRowLabelWindow *rowLblWin, + wxGridColLabelWindow *colLblWin, + wxWindowID id, + const wxPoint &pos, + const wxSize &size ) + : wxWindow( + parent, id, pos, size, + wxWANTS_CHARS | wxBORDER_NONE | wxCLIP_CHILDREN | wxFULL_REPAINT_ON_RESIZE, + wxT("grid window") ) +{ + m_owner = parent; + m_rowLabelWin = rowLblWin; + m_colLabelWin = colLblWin; +} + +void wxGridWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) +{ + wxPaintDC dc( this ); + m_owner->PrepareDC( dc ); + wxRegion reg = GetUpdateRegion(); + wxGridCellCoordsArray dirtyCells = m_owner->CalcCellsExposed( reg ); + m_owner->DrawGridCellArea( dc, dirtyCells ); + +#if WXGRID_DRAW_LINES + m_owner->DrawAllGridLines( dc, reg ); +#endif + + m_owner->DrawGridSpace( dc ); + m_owner->DrawHighlight( dc, dirtyCells ); +} + +void wxGridWindow::ScrollWindow( int dx, int dy, const wxRect *rect ) +{ + wxWindow::ScrollWindow( dx, dy, rect ); + m_rowLabelWin->ScrollWindow( 0, dy, rect ); + m_colLabelWin->ScrollWindow( dx, 0, rect ); +} + +void wxGridWindow::OnMouseEvent( wxMouseEvent& event ) +{ + if (event.ButtonDown(wxMOUSE_BTN_LEFT) && FindFocus() != this) + SetFocus(); + + m_owner->ProcessGridCellMouseEvent( event ); +} + +void wxGridWindow::OnMouseWheel( wxMouseEvent& event ) +{ + m_owner->GetEventHandler()->ProcessEvent( event ); +} + +// This seems to be required for wxMotif/wxGTK otherwise the mouse +// cursor must be in the cell edit control to get key events +// +void wxGridWindow::OnKeyDown( wxKeyEvent& event ) +{ + if ( !m_owner->GetEventHandler()->ProcessEvent( event ) ) + event.Skip(); +} + +void wxGridWindow::OnKeyUp( wxKeyEvent& event ) +{ + if ( !m_owner->GetEventHandler()->ProcessEvent( event ) ) + event.Skip(); +} + +void wxGridWindow::OnChar( wxKeyEvent& event ) +{ + if ( !m_owner->GetEventHandler()->ProcessEvent( event ) ) + event.Skip(); +} + +void wxGridWindow::OnEraseBackground( wxEraseEvent& WXUNUSED(event) ) +{ +} + +void wxGridWindow::OnFocus(wxFocusEvent& event) +{ + if ( !m_owner->GetEventHandler()->ProcessEvent( event ) ) + event.Skip(); +} + +////////////////////////////////////////////////////////////////////// + +// Internal Helper function for computing row or column from some +// (unscrolled) coordinate value, using either +// m_defaultRowHeight/m_defaultColWidth or binary search on array +// of m_rowBottoms/m_ColRights to speed up the search! + +// Internal helper macros for simpler use of that function + +static int CoordToRowOrCol(int coord, int defaultDist, int minDist, + const wxArrayInt& BorderArray, int nMax, + bool clipToMinMax); + +#define internalXToCol(x) XToCol(x, true) +#define internalYToRow(y) CoordToRowOrCol(y, m_defaultRowHeight, \ + m_minAcceptableRowHeight, \ + m_rowBottoms, m_numRows, true) + +///////////////////////////////////////////////////////////////////// + +#if wxUSE_EXTENDED_RTTI +WX_DEFINE_FLAGS( wxGridStyle ) + +wxBEGIN_FLAGS( wxGridStyle ) + // new style border flags, we put them first to + // use them for streaming out + wxFLAGS_MEMBER(wxBORDER_SIMPLE) + wxFLAGS_MEMBER(wxBORDER_SUNKEN) + wxFLAGS_MEMBER(wxBORDER_DOUBLE) + wxFLAGS_MEMBER(wxBORDER_RAISED) + wxFLAGS_MEMBER(wxBORDER_STATIC) + wxFLAGS_MEMBER(wxBORDER_NONE) + + // old style border flags + wxFLAGS_MEMBER(wxSIMPLE_BORDER) + wxFLAGS_MEMBER(wxSUNKEN_BORDER) + wxFLAGS_MEMBER(wxDOUBLE_BORDER) + wxFLAGS_MEMBER(wxRAISED_BORDER) + wxFLAGS_MEMBER(wxSTATIC_BORDER) + wxFLAGS_MEMBER(wxBORDER) + + // standard window styles + wxFLAGS_MEMBER(wxTAB_TRAVERSAL) + wxFLAGS_MEMBER(wxCLIP_CHILDREN) + wxFLAGS_MEMBER(wxTRANSPARENT_WINDOW) + wxFLAGS_MEMBER(wxWANTS_CHARS) + wxFLAGS_MEMBER(wxFULL_REPAINT_ON_RESIZE) + wxFLAGS_MEMBER(wxALWAYS_SHOW_SB) + wxFLAGS_MEMBER(wxVSCROLL) + wxFLAGS_MEMBER(wxHSCROLL) + +wxEND_FLAGS( wxGridStyle ) + +IMPLEMENT_DYNAMIC_CLASS_XTI(wxGrid, wxScrolledWindow,"wx/grid.h") + +wxBEGIN_PROPERTIES_TABLE(wxGrid) + wxHIDE_PROPERTY( Children ) + wxPROPERTY_FLAGS( WindowStyle , wxGridStyle , long , SetWindowStyleFlag , GetWindowStyleFlag , EMPTY_MACROVALUE, 0 /*flags*/ , wxT("Helpstring") , wxT("group")) // style +wxEND_PROPERTIES_TABLE() + +wxBEGIN_HANDLERS_TABLE(wxGrid) +wxEND_HANDLERS_TABLE() + +wxCONSTRUCTOR_5( wxGrid , wxWindow* , Parent , wxWindowID , Id , wxPoint , Position , wxSize , Size , long , WindowStyle ) + +/* + TODO : Expose more information of a list's layout, etc. via appropriate objects (e.g., NotebookPageInfo) +*/ +#else +IMPLEMENT_DYNAMIC_CLASS( wxGrid, wxScrolledWindow ) +#endif + +BEGIN_EVENT_TABLE( wxGrid, wxScrolledWindow ) + EVT_PAINT( wxGrid::OnPaint ) + EVT_SIZE( wxGrid::OnSize ) + EVT_KEY_DOWN( wxGrid::OnKeyDown ) + EVT_KEY_UP( wxGrid::OnKeyUp ) + EVT_CHAR ( wxGrid::OnChar ) + EVT_ERASE_BACKGROUND( wxGrid::OnEraseBackground ) +END_EVENT_TABLE() + +wxGrid::wxGrid() +{ + // in order to make sure that a size event is not + // trigerred in a unfinished state + m_cornerLabelWin = NULL; + m_rowLabelWin = NULL; + m_colLabelWin = NULL; + m_gridWin = NULL; +} + +wxGrid::wxGrid( wxWindow *parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + long style, + const wxString& name ) + : wxScrolledWindow( parent, id, pos, size, (style | wxWANTS_CHARS), name ), + m_colMinWidths(GRID_HASH_SIZE), + m_rowMinHeights(GRID_HASH_SIZE) +{ + Create(); + SetInitialSize(size); +} + +bool wxGrid::Create(wxWindow *parent, wxWindowID id, + const wxPoint& pos, const wxSize& size, + long style, const wxString& name) +{ + if (!wxScrolledWindow::Create(parent, id, pos, size, + style | wxWANTS_CHARS, name)) + return false; + + m_colMinWidths = wxLongToLongHashMap(GRID_HASH_SIZE); + m_rowMinHeights = wxLongToLongHashMap(GRID_HASH_SIZE); + + Create(); + SetInitialSize(size); + CalcDimensions(); + + return true; +} + +wxGrid::~wxGrid() +{ + // Must do this or ~wxScrollHelper will pop the wrong event handler + SetTargetWindow(this); + ClearAttrCache(); + wxSafeDecRef(m_defaultCellAttr); + +#ifdef DEBUG_ATTR_CACHE + size_t total = gs_nAttrCacheHits + gs_nAttrCacheMisses; + wxPrintf(_T("wxGrid attribute cache statistics: " + "total: %u, hits: %u (%u%%)\n"), + total, gs_nAttrCacheHits, + total ? (gs_nAttrCacheHits*100) / total : 0); +#endif + + // if we own the table, just delete it, otherwise at least don't leave it + // with dangling view pointer + if ( m_ownTable ) + delete m_table; + else if ( m_table && m_table->GetView() == this ) + m_table->SetView(NULL); + + delete m_typeRegistry; + delete m_selection; +} + +// +// ----- internal init and update functions +// + +// NOTE: If using the default visual attributes works everywhere then this can +// be removed as well as the #else cases below. +#define _USE_VISATTR 0 + +void wxGrid::Create() +{ + // set to true by CreateGrid + m_created = false; + + // create the type registry + m_typeRegistry = new wxGridTypeRegistry; + m_selection = NULL; + + m_table = (wxGridTableBase *) NULL; + m_ownTable = false; + + m_cellEditCtrlEnabled = false; + + m_defaultCellAttr = new wxGridCellAttr(); + + // Set default cell attributes + m_defaultCellAttr->SetDefAttr(m_defaultCellAttr); + m_defaultCellAttr->SetKind(wxGridCellAttr::Default); + m_defaultCellAttr->SetFont(GetFont()); + m_defaultCellAttr->SetAlignment(wxALIGN_LEFT, wxALIGN_TOP); + m_defaultCellAttr->SetRenderer(new wxGridCellStringRenderer); + m_defaultCellAttr->SetEditor(new wxGridCellTextEditor); + +#if _USE_VISATTR + wxVisualAttributes gva = wxListBox::GetClassDefaultAttributes(); + wxVisualAttributes lva = wxPanel::GetClassDefaultAttributes(); + + m_defaultCellAttr->SetTextColour(gva.colFg); + m_defaultCellAttr->SetBackgroundColour(gva.colBg); + +#else + m_defaultCellAttr->SetTextColour( + wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT)); + m_defaultCellAttr->SetBackgroundColour( + wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW)); +#endif + + m_numRows = 0; + m_numCols = 0; + m_currentCellCoords = wxGridNoCellCoords; + + m_rowLabelWidth = WXGRID_DEFAULT_ROW_LABEL_WIDTH; + m_colLabelHeight = WXGRID_DEFAULT_COL_LABEL_HEIGHT; + + // subwindow components that make up the wxGrid + m_rowLabelWin = new wxGridRowLabelWindow( this, + wxID_ANY, + wxDefaultPosition, + wxDefaultSize ); + + m_colLabelWin = new wxGridColLabelWindow( this, + wxID_ANY, + wxDefaultPosition, + wxDefaultSize ); + + m_cornerLabelWin = new wxGridCornerLabelWindow( this, + wxID_ANY, + wxDefaultPosition, + wxDefaultSize ); + + m_gridWin = new wxGridWindow( this, + m_rowLabelWin, + m_colLabelWin, + wxID_ANY, + wxDefaultPosition, + wxDefaultSize ); + + SetTargetWindow( m_gridWin ); + +#if _USE_VISATTR + wxColour gfg = gva.colFg; + wxColour gbg = gva.colBg; + wxColour lfg = lva.colFg; + wxColour lbg = lva.colBg; +#else + wxColour gfg = wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOWTEXT ); + wxColour gbg = wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ); + wxColour lfg = wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOWTEXT ); + wxColour lbg = wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ); +#endif + + m_cornerLabelWin->SetOwnForegroundColour(lfg); + m_cornerLabelWin->SetOwnBackgroundColour(lbg); + m_rowLabelWin->SetOwnForegroundColour(lfg); + m_rowLabelWin->SetOwnBackgroundColour(lbg); + m_colLabelWin->SetOwnForegroundColour(lfg); + m_colLabelWin->SetOwnBackgroundColour(lbg); + + m_gridWin->SetOwnForegroundColour(gfg); + m_gridWin->SetOwnBackgroundColour(gbg); + + Init(); +} + +bool wxGrid::CreateGrid( int numRows, int numCols, + wxGrid::wxGridSelectionModes selmode ) +{ + wxCHECK_MSG( !m_created, + false, + wxT("wxGrid::CreateGrid or wxGrid::SetTable called more than once") ); + + m_numRows = numRows; + m_numCols = numCols; + + m_table = new wxGridStringTable( m_numRows, m_numCols ); + m_table->SetView( this ); + m_ownTable = true; + m_selection = new wxGridSelection( this, selmode ); + + CalcDimensions(); + + m_created = true; + + return m_created; +} + +void wxGrid::SetSelectionMode(wxGrid::wxGridSelectionModes selmode) +{ + wxCHECK_RET( m_created, + wxT("Called wxGrid::SetSelectionMode() before calling CreateGrid()") ); + + m_selection->SetSelectionMode( selmode ); +} + +wxGrid::wxGridSelectionModes wxGrid::GetSelectionMode() const +{ + wxCHECK_MSG( m_created, wxGrid::wxGridSelectCells, + wxT("Called wxGrid::GetSelectionMode() before calling CreateGrid()") ); + + return m_selection->GetSelectionMode(); +} + +bool wxGrid::SetTable( wxGridTableBase *table, bool takeOwnership, + wxGrid::wxGridSelectionModes selmode ) +{ + bool checkSelection = false; + if ( m_created ) + { + // stop all processing + m_created = false; + + if (m_table) + { + m_table->SetView(0); + if( m_ownTable ) + delete m_table; + m_table = NULL; + } + + delete m_selection; + m_selection = NULL; + + m_ownTable = false; + m_numRows = 0; + m_numCols = 0; + checkSelection = true; + + // kill row and column size arrays + m_colWidths.Empty(); + m_colRights.Empty(); + m_rowHeights.Empty(); + m_rowBottoms.Empty(); + } + + if (table) + { + m_numRows = table->GetNumberRows(); + m_numCols = table->GetNumberCols(); + + m_table = table; + m_table->SetView( this ); + m_ownTable = takeOwnership; + m_selection = new wxGridSelection( this, selmode ); + if (checkSelection) + { + // If the newly set table is smaller than the + // original one current cell and selection regions + // might be invalid, + m_selectingKeyboard = wxGridNoCellCoords; + m_currentCellCoords = + wxGridCellCoords(wxMin(m_numRows, m_currentCellCoords.GetRow()), + wxMin(m_numCols, m_currentCellCoords.GetCol())); + if (m_selectingTopLeft.GetRow() >= m_numRows || + m_selectingTopLeft.GetCol() >= m_numCols) + { + m_selectingTopLeft = wxGridNoCellCoords; + m_selectingBottomRight = wxGridNoCellCoords; + } + else + m_selectingBottomRight = + wxGridCellCoords(wxMin(m_numRows, + m_selectingBottomRight.GetRow()), + wxMin(m_numCols, + m_selectingBottomRight.GetCol())); + } + CalcDimensions(); + + m_created = true; + } + + return m_created; +} + +void wxGrid::Init() +{ + m_rowLabelWidth = WXGRID_DEFAULT_ROW_LABEL_WIDTH; + m_colLabelHeight = WXGRID_DEFAULT_COL_LABEL_HEIGHT; + + if ( m_rowLabelWin ) + { + m_labelBackgroundColour = m_rowLabelWin->GetBackgroundColour(); + } + else + { + m_labelBackgroundColour = *wxWHITE; + } + + m_labelTextColour = *wxBLACK; + + // init attr cache + m_attrCache.row = -1; + m_attrCache.col = -1; + m_attrCache.attr = NULL; + + // TODO: something better than this ? + // + m_labelFont = this->GetFont(); + m_labelFont.SetWeight( wxBOLD ); + + m_rowLabelHorizAlign = wxALIGN_CENTRE; + m_rowLabelVertAlign = wxALIGN_CENTRE; + + m_colLabelHorizAlign = wxALIGN_CENTRE; + m_colLabelVertAlign = wxALIGN_CENTRE; + m_colLabelTextOrientation = wxHORIZONTAL; + + m_defaultColWidth = WXGRID_DEFAULT_COL_WIDTH; + m_defaultRowHeight = m_gridWin->GetCharHeight(); + + m_minAcceptableColWidth = WXGRID_MIN_COL_WIDTH; + m_minAcceptableRowHeight = WXGRID_MIN_ROW_HEIGHT; + +#if defined(__WXMOTIF__) || defined(__WXGTK__) // see also text ctrl sizing in ShowCellEditControl() + m_defaultRowHeight += 8; +#else + m_defaultRowHeight += 4; +#endif + + m_gridLineColour = wxColour( 192,192,192 ); + m_gridLinesEnabled = true; + m_cellHighlightColour = *wxBLACK; + m_cellHighlightPenWidth = 2; + m_cellHighlightROPenWidth = 1; + + m_canDragColMove = false; + + m_cursorMode = WXGRID_CURSOR_SELECT_CELL; + m_winCapture = (wxWindow *)NULL; + m_canDragRowSize = true; + m_canDragColSize = true; + m_canDragGridSize = true; + m_canDragCell = false; + m_dragLastPos = -1; + m_dragRowOrCol = -1; + m_isDragging = false; + m_startDragPos = wxDefaultPosition; + + m_waitForSlowClick = false; + + m_rowResizeCursor = wxCursor( wxCURSOR_SIZENS ); + m_colResizeCursor = wxCursor( wxCURSOR_SIZEWE ); + + m_currentCellCoords = wxGridNoCellCoords; + + ClearSelection(); + + m_selectionBackground = wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHT); + m_selectionForeground = wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT); + + m_editable = true; // default for whole grid + + m_inOnKeyDown = false; + m_batchCount = 0; + + m_extraWidth = + m_extraHeight = 0; + + m_scrollLineX = GRID_SCROLL_LINE_X; + m_scrollLineY = GRID_SCROLL_LINE_Y; +} + +// ---------------------------------------------------------------------------- +// the idea is to call these functions only when necessary because they create +// quite big arrays which eat memory mostly unnecessary - in particular, if +// default widths/heights are used for all rows/columns, we may not use these +// arrays at all +// +// with some extra code, it should be possible to only store the widths/heights +// different from default ones (resulting in space savings for huge grids) but +// this is not done currently +// ---------------------------------------------------------------------------- + +void wxGrid::InitRowHeights() +{ + m_rowHeights.Empty(); + m_rowBottoms.Empty(); + + m_rowHeights.Alloc( m_numRows ); + m_rowBottoms.Alloc( m_numRows ); + + m_rowHeights.Add( m_defaultRowHeight, m_numRows ); + + int rowBottom = 0; + for ( int i = 0; i < m_numRows; i++ ) + { + rowBottom += m_defaultRowHeight; + m_rowBottoms.Add( rowBottom ); + } +} + +void wxGrid::InitColWidths() +{ + m_colWidths.Empty(); + m_colRights.Empty(); + + m_colWidths.Alloc( m_numCols ); + m_colRights.Alloc( m_numCols ); + + m_colWidths.Add( m_defaultColWidth, m_numCols ); + + int colRight = 0; + for ( int i = 0; i < m_numCols; i++ ) + { + colRight = ( GetColPos( i ) + 1 ) * m_defaultColWidth; + m_colRights.Add( colRight ); + } +} + +int wxGrid::GetColWidth(int col) const +{ + return m_colWidths.IsEmpty() ? m_defaultColWidth : m_colWidths[col]; +} + +int wxGrid::GetColLeft(int col) const +{ + return m_colRights.IsEmpty() ? GetColPos( col ) * m_defaultColWidth + : m_colRights[col] - m_colWidths[col]; +} + +int wxGrid::GetColRight(int col) const +{ + return m_colRights.IsEmpty() ? (GetColPos( col ) + 1) * m_defaultColWidth + : m_colRights[col]; +} + +int wxGrid::GetRowHeight(int row) const +{ + return m_rowHeights.IsEmpty() ? m_defaultRowHeight : m_rowHeights[row]; +} + +int wxGrid::GetRowTop(int row) const +{ + return m_rowBottoms.IsEmpty() ? row * m_defaultRowHeight + : m_rowBottoms[row] - m_rowHeights[row]; +} + +int wxGrid::GetRowBottom(int row) const +{ + return m_rowBottoms.IsEmpty() ? (row + 1) * m_defaultRowHeight + : m_rowBottoms[row]; +} + +void wxGrid::CalcDimensions() +{ + // compute the size of the scrollable area + int w = m_numCols > 0 ? GetColRight(GetColAt(m_numCols - 1)) : 0; + int h = m_numRows > 0 ? GetRowBottom(m_numRows - 1) : 0; + + w += m_extraWidth; + h += m_extraHeight; + + // take into account editor if shown + if ( IsCellEditControlShown() ) + { + int w2, h2; + int r = m_currentCellCoords.GetRow(); + int c = m_currentCellCoords.GetCol(); + int x = GetColLeft(c); + int y = GetRowTop(r); + + // how big is the editor + wxGridCellAttr* attr = GetCellAttr(r, c); + wxGridCellEditor* editor = attr->GetEditor(this, r, c); + editor->GetControl()->GetSize(&w2, &h2); + w2 += x; + h2 += y; + if ( w2 > w ) + w = w2; + if ( h2 > h ) + h = h2; + editor->DecRef(); + attr->DecRef(); + } + + // preserve (more or less) the previous position + int x, y; + GetViewStart( &x, &y ); + + // ensure the position is valid for the new scroll ranges + if ( x >= w ) + x = wxMax( w - 1, 0 ); + if ( y >= h ) + y = wxMax( h - 1, 0 ); + + // do set scrollbar parameters + SetScrollbars( m_scrollLineX, m_scrollLineY, + GetScrollX(w), GetScrollY(h), + x, y, + GetBatchCount() != 0); + + // if our OnSize() hadn't been called (it would if we have scrollbars), we + // still must reposition the children + CalcWindowSizes(); +} + +void wxGrid::CalcWindowSizes() +{ + // escape if the window is has not been fully created yet + + if ( m_cornerLabelWin == NULL ) + return; + + int cw, ch; + GetClientSize( &cw, &ch ); + + // this block of code tries to work around the following problem: the grid + // could have been just resized to have enough space to show the full grid + // window contents without the scrollbars, but its client size could be + // not big enough because the grid has the scrollbars right now and so the + // scrollbars would remain even though we don't need them any more + // + // to prevent this from happening, check if we have enough space for + // everything without the scrollbars and explicitly disable them then + wxSize size = GetSize() - GetWindowBorderSize(); + if ( size != wxSize(cw, ch) ) + { + // check if we have enough space for grid window after accounting for + // the fixed size elements + size.x -= m_rowLabelWidth; + size.y -= m_colLabelHeight; + + const wxSize vsize = m_gridWin->GetVirtualSize(); + + if ( size.x >= vsize.x && size.y >= vsize.y ) + { + // yes, we do, so remove the scrollbars and use the new client size + // (which should be the same as full window size - borders now) + SetScrollbars(0, 0, 0, 0); + GetClientSize(&cw, &ch); + } + } + + if ( m_cornerLabelWin && m_cornerLabelWin->IsShown() ) + m_cornerLabelWin->SetSize( 0, 0, m_rowLabelWidth, m_colLabelHeight ); + + if ( m_colLabelWin && m_colLabelWin->IsShown() ) + m_colLabelWin->SetSize( m_rowLabelWidth, 0, cw - m_rowLabelWidth, m_colLabelHeight ); + + if ( m_rowLabelWin && m_rowLabelWin->IsShown() ) + m_rowLabelWin->SetSize( 0, m_colLabelHeight, m_rowLabelWidth, ch - m_colLabelHeight ); + + if ( m_gridWin && m_gridWin->IsShown() ) + m_gridWin->SetSize( m_rowLabelWidth, m_colLabelHeight, cw - m_rowLabelWidth, ch - m_colLabelHeight ); +} + +// this is called when the grid table sends a message +// to indicate that it has been redimensioned +// +bool wxGrid::Redimension( wxGridTableMessage& msg ) +{ + int i; + bool result = false; + + // Clear the attribute cache as the attribute might refer to a different + // cell than stored in the cache after adding/removing rows/columns. + ClearAttrCache(); + + // By the same reasoning, the editor should be dismissed if columns are + // added or removed. And for consistency, it should IMHO always be + // removed, not only if the cell "underneath" it actually changes. + // For now, I intentionally do not save the editor's content as the + // cell it might want to save that stuff to might no longer exist. + HideCellEditControl(); + +#if 0 + // if we were using the default widths/heights so far, we must change them + // now + if ( m_colWidths.IsEmpty() ) + { + InitColWidths(); + } + + if ( m_rowHeights.IsEmpty() ) + { + InitRowHeights(); + } +#endif + + switch ( msg.GetId() ) + { + case wxGRIDTABLE_NOTIFY_ROWS_INSERTED: + { + size_t pos = msg.GetCommandInt(); + int numRows = msg.GetCommandInt2(); + + m_numRows += numRows; + + if ( !m_rowHeights.IsEmpty() ) + { + m_rowHeights.Insert( m_defaultRowHeight, pos, numRows ); + m_rowBottoms.Insert( 0, pos, numRows ); + + int bottom = 0; + if ( pos > 0 ) + bottom = m_rowBottoms[pos - 1]; + + for ( i = pos; i < m_numRows; i++ ) + { + bottom += m_rowHeights[i]; + m_rowBottoms[i] = bottom; + } + } + + if ( m_currentCellCoords == wxGridNoCellCoords ) + { + // if we have just inserted cols into an empty grid the current + // cell will be undefined... + // + SetCurrentCell( 0, 0 ); + } + + if ( m_selection ) + m_selection->UpdateRows( pos, numRows ); + wxGridCellAttrProvider * attrProvider = m_table->GetAttrProvider(); + if (attrProvider) + attrProvider->UpdateAttrRows( pos, numRows ); + + if ( !GetBatchCount() ) + { + CalcDimensions(); + m_rowLabelWin->Refresh(); + } + } + result = true; + break; + + case wxGRIDTABLE_NOTIFY_ROWS_APPENDED: + { + int numRows = msg.GetCommandInt(); + int oldNumRows = m_numRows; + m_numRows += numRows; + + if ( !m_rowHeights.IsEmpty() ) + { + m_rowHeights.Add( m_defaultRowHeight, numRows ); + m_rowBottoms.Add( 0, numRows ); + + int bottom = 0; + if ( oldNumRows > 0 ) + bottom = m_rowBottoms[oldNumRows - 1]; + + for ( i = oldNumRows; i < m_numRows; i++ ) + { + bottom += m_rowHeights[i]; + m_rowBottoms[i] = bottom; + } + } + + if ( m_currentCellCoords == wxGridNoCellCoords ) + { + // if we have just inserted cols into an empty grid the current + // cell will be undefined... + // + SetCurrentCell( 0, 0 ); + } + + if ( !GetBatchCount() ) + { + CalcDimensions(); + m_rowLabelWin->Refresh(); + } + } + result = true; + break; + + case wxGRIDTABLE_NOTIFY_ROWS_DELETED: + { + size_t pos = msg.GetCommandInt(); + int numRows = msg.GetCommandInt2(); + m_numRows -= numRows; + + if ( !m_rowHeights.IsEmpty() ) + { + m_rowHeights.RemoveAt( pos, numRows ); + m_rowBottoms.RemoveAt( pos, numRows ); + + int h = 0; + for ( i = 0; i < m_numRows; i++ ) + { + h += m_rowHeights[i]; + m_rowBottoms[i] = h; + } + } + + if ( !m_numRows ) + { + m_currentCellCoords = wxGridNoCellCoords; + } + else + { + if ( m_currentCellCoords.GetRow() >= m_numRows ) + m_currentCellCoords.Set( 0, 0 ); + } + + if ( m_selection ) + m_selection->UpdateRows( pos, -((int)numRows) ); + wxGridCellAttrProvider * attrProvider = m_table->GetAttrProvider(); + if (attrProvider) + { + attrProvider->UpdateAttrRows( pos, -((int)numRows) ); + +// ifdef'd out following patch from Paul Gammans +#if 0 + // No need to touch column attributes, unless we + // removed _all_ rows, in this case, we remove + // all column attributes. + // I hate to do this here, but the + // needed data is not available inside UpdateAttrRows. + if ( !GetNumberRows() ) + attrProvider->UpdateAttrCols( 0, -GetNumberCols() ); +#endif + } + + if ( !GetBatchCount() ) + { + CalcDimensions(); + m_rowLabelWin->Refresh(); + } + } + result = true; + break; + + case wxGRIDTABLE_NOTIFY_COLS_INSERTED: + { + size_t pos = msg.GetCommandInt(); + int numCols = msg.GetCommandInt2(); + m_numCols += numCols; + + if ( !m_colAt.IsEmpty() ) + { + //Shift the column IDs + int i; + for ( i = 0; i < m_numCols - numCols; i++ ) + { + if ( m_colAt[i] >= (int)pos ) + m_colAt[i] += numCols; + } + + m_colAt.Insert( pos, pos, numCols ); + + //Set the new columns' positions + for ( i = pos + 1; i < (int)pos + numCols; i++ ) + { + m_colAt[i] = i; + } + } + + if ( !m_colWidths.IsEmpty() ) + { + m_colWidths.Insert( m_defaultColWidth, pos, numCols ); + m_colRights.Insert( 0, pos, numCols ); + + int right = 0; + if ( pos > 0 ) + right = m_colRights[GetColAt( pos - 1 )]; + + int colPos; + for ( colPos = pos; colPos < m_numCols; colPos++ ) + { + i = GetColAt( colPos ); + + right += m_colWidths[i]; + m_colRights[i] = right; + } + } + + if ( m_currentCellCoords == wxGridNoCellCoords ) + { + // if we have just inserted cols into an empty grid the current + // cell will be undefined... + // + SetCurrentCell( 0, 0 ); + } + + if ( m_selection ) + m_selection->UpdateCols( pos, numCols ); + wxGridCellAttrProvider * attrProvider = m_table->GetAttrProvider(); + if (attrProvider) + attrProvider->UpdateAttrCols( pos, numCols ); + if ( !GetBatchCount() ) + { + CalcDimensions(); + m_colLabelWin->Refresh(); + } + } + result = true; + break; + + case wxGRIDTABLE_NOTIFY_COLS_APPENDED: + { + int numCols = msg.GetCommandInt(); + int oldNumCols = m_numCols; + m_numCols += numCols; + + if ( !m_colAt.IsEmpty() ) + { + m_colAt.Add( 0, numCols ); + + //Set the new columns' positions + int i; + for ( i = oldNumCols; i < m_numCols; i++ ) + { + m_colAt[i] = i; + } + } + + if ( !m_colWidths.IsEmpty() ) + { + m_colWidths.Add( m_defaultColWidth, numCols ); + m_colRights.Add( 0, numCols ); + + int right = 0; + if ( oldNumCols > 0 ) + right = m_colRights[GetColAt( oldNumCols - 1 )]; + + int colPos; + for ( colPos = oldNumCols; colPos < m_numCols; colPos++ ) + { + i = GetColAt( colPos ); + + right += m_colWidths[i]; + m_colRights[i] = right; + } + } + + if ( m_currentCellCoords == wxGridNoCellCoords ) + { + // if we have just inserted cols into an empty grid the current + // cell will be undefined... + // + SetCurrentCell( 0, 0 ); + } + if ( !GetBatchCount() ) + { + CalcDimensions(); + m_colLabelWin->Refresh(); + } + } + result = true; + break; + + case wxGRIDTABLE_NOTIFY_COLS_DELETED: + { + size_t pos = msg.GetCommandInt(); + int numCols = msg.GetCommandInt2(); + m_numCols -= numCols; + + if ( !m_colAt.IsEmpty() ) + { + int colID = GetColAt( pos ); + + m_colAt.RemoveAt( pos, numCols ); + + //Shift the column IDs + int colPos; + for ( colPos = 0; colPos < m_numCols; colPos++ ) + { + if ( m_colAt[colPos] > colID ) + m_colAt[colPos] -= numCols; + } + } + + if ( !m_colWidths.IsEmpty() ) + { + m_colWidths.RemoveAt( pos, numCols ); + m_colRights.RemoveAt( pos, numCols ); + + int w = 0; + int colPos; + for ( colPos = 0; colPos < m_numCols; colPos++ ) + { + i = GetColAt( colPos ); + + w += m_colWidths[i]; + m_colRights[i] = w; + } + } + + if ( !m_numCols ) + { + m_currentCellCoords = wxGridNoCellCoords; + } + else + { + if ( m_currentCellCoords.GetCol() >= m_numCols ) + m_currentCellCoords.Set( 0, 0 ); + } + + if ( m_selection ) + m_selection->UpdateCols( pos, -((int)numCols) ); + wxGridCellAttrProvider * attrProvider = m_table->GetAttrProvider(); + if (attrProvider) + { + attrProvider->UpdateAttrCols( pos, -((int)numCols) ); + +// ifdef'd out following patch from Paul Gammans +#if 0 + // No need to touch row attributes, unless we + // removed _all_ columns, in this case, we remove + // all row attributes. + // I hate to do this here, but the + // needed data is not available inside UpdateAttrCols. + if ( !GetNumberCols() ) + attrProvider->UpdateAttrRows( 0, -GetNumberRows() ); +#endif + } + + if ( !GetBatchCount() ) + { + CalcDimensions(); + m_colLabelWin->Refresh(); + } + } + result = true; + break; + } + + if (result && !GetBatchCount() ) + m_gridWin->Refresh(); + + return result; +} + +wxArrayInt wxGrid::CalcRowLabelsExposed( const wxRegion& reg ) +{ + wxRegionIterator iter( reg ); + wxRect r; + + wxArrayInt rowlabels; + + int top, bottom; + while ( iter ) + { + r = iter.GetRect(); + + // TODO: remove this when we can... + // There is a bug in wxMotif that gives garbage update + // rectangles if you jump-scroll a long way by clicking the + // scrollbar with middle button. This is a work-around + // +#if defined(__WXMOTIF__) + int cw, ch; + m_gridWin->GetClientSize( &cw, &ch ); + if ( r.GetTop() > ch ) + r.SetTop( 0 ); + r.SetBottom( wxMin( r.GetBottom(), ch ) ); +#endif + + // logical bounds of update region + // + int dummy; + CalcUnscrolledPosition( 0, r.GetTop(), &dummy, &top ); + CalcUnscrolledPosition( 0, r.GetBottom(), &dummy, &bottom ); + + // find the row labels within these bounds + // + int row; + for ( row = internalYToRow(top); row < m_numRows; row++ ) + { + if ( GetRowBottom(row) < top ) + continue; + + if ( GetRowTop(row) > bottom ) + break; + + rowlabels.Add( row ); + } + + ++iter; + } + + return rowlabels; +} + +wxArrayInt wxGrid::CalcColLabelsExposed( const wxRegion& reg ) +{ + wxRegionIterator iter( reg ); + wxRect r; + + wxArrayInt colLabels; + + int left, right; + while ( iter ) + { + r = iter.GetRect(); + + // TODO: remove this when we can... + // There is a bug in wxMotif that gives garbage update + // rectangles if you jump-scroll a long way by clicking the + // scrollbar with middle button. This is a work-around + // +#if defined(__WXMOTIF__) + int cw, ch; + m_gridWin->GetClientSize( &cw, &ch ); + if ( r.GetLeft() > cw ) + r.SetLeft( 0 ); + r.SetRight( wxMin( r.GetRight(), cw ) ); +#endif + + // logical bounds of update region + // + int dummy; + CalcUnscrolledPosition( r.GetLeft(), 0, &left, &dummy ); + CalcUnscrolledPosition( r.GetRight(), 0, &right, &dummy ); + + // find the cells within these bounds + // + int col; + int colPos; + for ( colPos = GetColPos( internalXToCol(left) ); colPos < m_numCols; colPos++ ) + { + col = GetColAt( colPos ); + + if ( GetColRight(col) < left ) + continue; + + if ( GetColLeft(col) > right ) + break; + + colLabels.Add( col ); + } + + ++iter; + } + + return colLabels; +} + +wxGridCellCoordsArray wxGrid::CalcCellsExposed( const wxRegion& reg ) +{ + wxRegionIterator iter( reg ); + wxRect r; + + wxGridCellCoordsArray cellsExposed; + + int left, top, right, bottom; + while ( iter ) + { + r = iter.GetRect(); + + // TODO: remove this when we can... + // There is a bug in wxMotif that gives garbage update + // rectangles if you jump-scroll a long way by clicking the + // scrollbar with middle button. This is a work-around + // +#if defined(__WXMOTIF__) + int cw, ch; + m_gridWin->GetClientSize( &cw, &ch ); + if ( r.GetTop() > ch ) r.SetTop( 0 ); + if ( r.GetLeft() > cw ) r.SetLeft( 0 ); + r.SetRight( wxMin( r.GetRight(), cw ) ); + r.SetBottom( wxMin( r.GetBottom(), ch ) ); +#endif + + // logical bounds of update region + // + CalcUnscrolledPosition( r.GetLeft(), r.GetTop(), &left, &top ); + CalcUnscrolledPosition( r.GetRight(), r.GetBottom(), &right, &bottom ); + + // find the cells within these bounds + // + int row, col; + for ( row = internalYToRow(top); row < m_numRows; row++ ) + { + if ( GetRowBottom(row) <= top ) + continue; + + if ( GetRowTop(row) > bottom ) + break; + + int colPos; + for ( colPos = GetColPos( internalXToCol(left) ); colPos < m_numCols; colPos++ ) + { + col = GetColAt( colPos ); + + if ( GetColRight(col) <= left ) + continue; + + if ( GetColLeft(col) > right ) + break; + + cellsExposed.Add( wxGridCellCoords( row, col ) ); + } + } + + ++iter; + } + + return cellsExposed; +} + + +void wxGrid::ProcessRowLabelMouseEvent( wxMouseEvent& event ) +{ + int x, y, row; + wxPoint pos( event.GetPosition() ); + CalcUnscrolledPosition( pos.x, pos.y, &x, &y ); + + if ( event.Dragging() ) + { + if (!m_isDragging) + { + m_isDragging = true; + m_rowLabelWin->CaptureMouse(); + } + + if ( event.LeftIsDown() ) + { + switch ( m_cursorMode ) + { + case WXGRID_CURSOR_RESIZE_ROW: + { + int cw, ch, left, dummy; + m_gridWin->GetClientSize( &cw, &ch ); + CalcUnscrolledPosition( 0, 0, &left, &dummy ); + + wxClientDC dc( m_gridWin ); + PrepareDC( dc ); + y = wxMax( y, + GetRowTop(m_dragRowOrCol) + + GetRowMinimalHeight(m_dragRowOrCol) ); + dc.SetLogicalFunction(wxINVERT); + if ( m_dragLastPos >= 0 ) + { + dc.DrawLine( left, m_dragLastPos, left+cw, m_dragLastPos ); + } + dc.DrawLine( left, y, left+cw, y ); + m_dragLastPos = y; + } + break; + + case WXGRID_CURSOR_SELECT_ROW: + { + if ( (row = YToRow( y )) >= 0 ) + { + if ( m_selection ) + { + m_selection->SelectRow( row, + event.ControlDown(), + event.ShiftDown(), + event.AltDown(), + event.MetaDown() ); + } + } + } + break; + + // default label to suppress warnings about "enumeration value + // 'xxx' not handled in switch + default: + break; + } + } + return; + } + + if ( m_isDragging && (event.Entering() || event.Leaving()) ) + return; + + if (m_isDragging) + { + if (m_rowLabelWin->HasCapture()) + m_rowLabelWin->ReleaseMouse(); + m_isDragging = false; + } + + // ------------ Entering or leaving the window + // + if ( event.Entering() || event.Leaving() ) + { + ChangeCursorMode(WXGRID_CURSOR_SELECT_CELL, m_rowLabelWin); + } + + // ------------ Left button pressed + // + else if ( event.LeftDown() ) + { + // don't send a label click event for a hit on the + // edge of the row label - this is probably the user + // wanting to resize the row + // + if ( YToEdgeOfRow(y) < 0 ) + { + row = YToRow(y); + if ( row >= 0 && + !SendEvent( wxEVT_GRID_LABEL_LEFT_CLICK, row, -1, event ) ) + { + if ( !event.ShiftDown() && !event.CmdDown() ) + ClearSelection(); + if ( m_selection ) + { + if ( event.ShiftDown() ) + { + m_selection->SelectBlock( m_currentCellCoords.GetRow(), + 0, + row, + GetNumberCols() - 1, + event.ControlDown(), + event.ShiftDown(), + event.AltDown(), + event.MetaDown() ); + } + else + { + m_selection->SelectRow( row, + event.ControlDown(), + event.ShiftDown(), + event.AltDown(), + event.MetaDown() ); + } + } + + ChangeCursorMode(WXGRID_CURSOR_SELECT_ROW, m_rowLabelWin); + } + } + else + { + // starting to drag-resize a row + if ( CanDragRowSize() ) + ChangeCursorMode(WXGRID_CURSOR_RESIZE_ROW, m_rowLabelWin); + } + } + + // ------------ Left double click + // + else if (event.LeftDClick() ) + { + row = YToEdgeOfRow(y); + if ( row < 0 ) + { + row = YToRow(y); + if ( row >=0 && + !SendEvent( wxEVT_GRID_LABEL_LEFT_DCLICK, row, -1, event ) ) + { + // no default action at the moment + } + } + else + { + // adjust row height depending on label text + AutoSizeRowLabelSize( row ); + + ChangeCursorMode(WXGRID_CURSOR_SELECT_CELL, m_colLabelWin); + m_dragLastPos = -1; + } + } + + // ------------ Left button released + // + else if ( event.LeftUp() ) + { + if ( m_cursorMode == WXGRID_CURSOR_RESIZE_ROW ) + { + DoEndDragResizeRow(); + + // Note: we are ending the event *after* doing + // default processing in this case + // + SendEvent( wxEVT_GRID_ROW_SIZE, m_dragRowOrCol, -1, event ); + } + + ChangeCursorMode(WXGRID_CURSOR_SELECT_CELL, m_rowLabelWin); + m_dragLastPos = -1; + } + + // ------------ Right button down + // + else if ( event.RightDown() ) + { + row = YToRow(y); + if ( row >=0 && + !SendEvent( wxEVT_GRID_LABEL_RIGHT_CLICK, row, -1, event ) ) + { + // no default action at the moment + } + } + + // ------------ Right double click + // + else if ( event.RightDClick() ) + { + row = YToRow(y); + if ( row >= 0 && + !SendEvent( wxEVT_GRID_LABEL_RIGHT_DCLICK, row, -1, event ) ) + { + // no default action at the moment + } + } + + // ------------ No buttons down and mouse moving + // + else if ( event.Moving() ) + { + m_dragRowOrCol = YToEdgeOfRow( y ); + if ( m_dragRowOrCol >= 0 ) + { + if ( m_cursorMode == WXGRID_CURSOR_SELECT_CELL ) + { + // don't capture the mouse yet + if ( CanDragRowSize() ) + ChangeCursorMode(WXGRID_CURSOR_RESIZE_ROW, m_rowLabelWin, false); + } + } + else if ( m_cursorMode != WXGRID_CURSOR_SELECT_CELL ) + { + ChangeCursorMode(WXGRID_CURSOR_SELECT_CELL, m_rowLabelWin, false); + } + } +} + +void wxGrid::ProcessColLabelMouseEvent( wxMouseEvent& event ) +{ + int x, y, col; + wxPoint pos( event.GetPosition() ); + CalcUnscrolledPosition( pos.x, pos.y, &x, &y ); + + if ( event.Dragging() ) + { + if (!m_isDragging) + { + m_isDragging = true; + m_colLabelWin->CaptureMouse(); + + if ( m_cursorMode == WXGRID_CURSOR_MOVE_COL ) + m_dragRowOrCol = XToCol( x ); + } + + if ( event.LeftIsDown() ) + { + switch ( m_cursorMode ) + { + case WXGRID_CURSOR_RESIZE_COL: + { + int cw, ch, dummy, top; + m_gridWin->GetClientSize( &cw, &ch ); + CalcUnscrolledPosition( 0, 0, &dummy, &top ); + + wxClientDC dc( m_gridWin ); + PrepareDC( dc ); + + x = wxMax( x, GetColLeft(m_dragRowOrCol) + + GetColMinimalWidth(m_dragRowOrCol)); + dc.SetLogicalFunction(wxINVERT); + if ( m_dragLastPos >= 0 ) + { + dc.DrawLine( m_dragLastPos, top, m_dragLastPos, top + ch ); + } + dc.DrawLine( x, top, x, top + ch ); + m_dragLastPos = x; + } + break; + + case WXGRID_CURSOR_SELECT_COL: + { + if ( (col = XToCol( x )) >= 0 ) + { + if ( m_selection ) + { + m_selection->SelectCol( col, + event.ControlDown(), + event.ShiftDown(), + event.AltDown(), + event.MetaDown() ); + } + } + } + break; + + case WXGRID_CURSOR_MOVE_COL: + { + if ( x < 0 ) + m_moveToCol = GetColAt( 0 ); + else + m_moveToCol = XToCol( x ); + + int markerX; + + if ( m_moveToCol < 0 ) + markerX = GetColRight( GetColAt( m_numCols - 1 ) ); + else + markerX = GetColLeft( m_moveToCol ); + + if ( markerX != m_dragLastPos ) + { + wxClientDC dc( m_colLabelWin ); + + int cw, ch; + m_colLabelWin->GetClientSize( &cw, &ch ); + + markerX++; + + //Clean up the last indicator + if ( m_dragLastPos >= 0 ) + { + wxPen pen( m_colLabelWin->GetBackgroundColour(), 2 ); + dc.SetPen(pen); + dc.DrawLine( m_dragLastPos + 1, 0, m_dragLastPos + 1, ch ); + dc.SetPen(wxNullPen); + + if ( XToCol( m_dragLastPos ) != -1 ) + DrawColLabel( dc, XToCol( m_dragLastPos ) ); + } + + //Moving to the same place? Don't draw a marker + if ( (m_moveToCol == m_dragRowOrCol) + || (GetColPos( m_moveToCol ) == GetColPos( m_dragRowOrCol ) + 1) + || (m_moveToCol < 0 && m_dragRowOrCol == GetColAt( m_numCols - 1 ))) + { + m_dragLastPos = -1; + return; + } + + //Draw the marker + wxPen pen( *wxBLUE, 2 ); + dc.SetPen(pen); + + dc.DrawLine( markerX, 0, markerX, ch ); + + dc.SetPen(wxNullPen); + + m_dragLastPos = markerX - 1; + } + } + break; + + // default label to suppress warnings about "enumeration value + // 'xxx' not handled in switch + default: + break; + } + } + return; + } + + if ( m_isDragging && (event.Entering() || event.Leaving()) ) + return; + + if (m_isDragging) + { + if (m_colLabelWin->HasCapture()) + m_colLabelWin->ReleaseMouse(); + m_isDragging = false; + } + + // ------------ Entering or leaving the window + // + if ( event.Entering() || event.Leaving() ) + { + ChangeCursorMode(WXGRID_CURSOR_SELECT_CELL, m_colLabelWin); + } + + // ------------ Left button pressed + // + else if ( event.LeftDown() ) + { + // don't send a label click event for a hit on the + // edge of the col label - this is probably the user + // wanting to resize the col + // + if ( XToEdgeOfCol(x) < 0 ) + { + col = XToCol(x); + if ( col >= 0 && + !SendEvent( wxEVT_GRID_LABEL_LEFT_CLICK, -1, col, event ) ) + { + if ( m_canDragColMove ) + { + //Show button as pressed + wxClientDC dc( m_colLabelWin ); + int colLeft = GetColLeft( col ); + int colRight = GetColRight( col ) - 1; + dc.SetPen( wxPen( m_colLabelWin->GetBackgroundColour(), 1 ) ); + dc.DrawLine( colLeft, 1, colLeft, m_colLabelHeight-1 ); + dc.DrawLine( colLeft, 1, colRight, 1 ); + + ChangeCursorMode(WXGRID_CURSOR_MOVE_COL, m_colLabelWin); + } + else + { + if ( !event.ShiftDown() && !event.CmdDown() ) + ClearSelection(); + if ( m_selection ) + { + if ( event.ShiftDown() ) + { + m_selection->SelectBlock( 0, + m_currentCellCoords.GetCol(), + GetNumberRows() - 1, col, + event.ControlDown(), + event.ShiftDown(), + event.AltDown(), + event.MetaDown() ); + } + else + { + m_selection->SelectCol( col, + event.ControlDown(), + event.ShiftDown(), + event.AltDown(), + event.MetaDown() ); + } + } + + ChangeCursorMode(WXGRID_CURSOR_SELECT_COL, m_colLabelWin); + } + } + } + else + { + // starting to drag-resize a col + // + if ( CanDragColSize() ) + ChangeCursorMode(WXGRID_CURSOR_RESIZE_COL, m_colLabelWin); + } + } + + // ------------ Left double click + // + if ( event.LeftDClick() ) + { + col = XToEdgeOfCol(x); + if ( col < 0 ) + { + col = XToCol(x); + if ( col >= 0 && + ! SendEvent( wxEVT_GRID_LABEL_LEFT_DCLICK, -1, col, event ) ) + { + // no default action at the moment + } + } + else + { + // adjust column width depending on label text + AutoSizeColLabelSize( col ); + + ChangeCursorMode(WXGRID_CURSOR_SELECT_CELL, m_colLabelWin); + m_dragLastPos = -1; + } + } + + // ------------ Left button released + // + else if ( event.LeftUp() ) + { + switch ( m_cursorMode ) + { + case WXGRID_CURSOR_RESIZE_COL: + DoEndDragResizeCol(); + + // Note: we are ending the event *after* doing + // default processing in this case + // + SendEvent( wxEVT_GRID_COL_SIZE, -1, m_dragRowOrCol, event ); + break; + + case WXGRID_CURSOR_MOVE_COL: + DoEndDragMoveCol(); + + SendEvent( wxEVT_GRID_COL_MOVE, -1, m_dragRowOrCol, event ); + break; + + case WXGRID_CURSOR_SELECT_COL: + case WXGRID_CURSOR_SELECT_CELL: + case WXGRID_CURSOR_RESIZE_ROW: + case WXGRID_CURSOR_SELECT_ROW: + // nothing to do (?) + break; + } + + ChangeCursorMode(WXGRID_CURSOR_SELECT_CELL, m_colLabelWin); + m_dragLastPos = -1; + } + + // ------------ Right button down + // + else if ( event.RightDown() ) + { + col = XToCol(x); + if ( col >= 0 && + !SendEvent( wxEVT_GRID_LABEL_RIGHT_CLICK, -1, col, event ) ) + { + // no default action at the moment + } + } + + // ------------ Right double click + // + else if ( event.RightDClick() ) + { + col = XToCol(x); + if ( col >= 0 && + !SendEvent( wxEVT_GRID_LABEL_RIGHT_DCLICK, -1, col, event ) ) + { + // no default action at the moment + } + } + + // ------------ No buttons down and mouse moving + // + else if ( event.Moving() ) + { + m_dragRowOrCol = XToEdgeOfCol( x ); + if ( m_dragRowOrCol >= 0 ) + { + if ( m_cursorMode == WXGRID_CURSOR_SELECT_CELL ) + { + // don't capture the cursor yet + if ( CanDragColSize() ) + ChangeCursorMode(WXGRID_CURSOR_RESIZE_COL, m_colLabelWin, false); + } + } + else if ( m_cursorMode != WXGRID_CURSOR_SELECT_CELL ) + { + ChangeCursorMode(WXGRID_CURSOR_SELECT_CELL, m_colLabelWin, false); + } + } +} + +void wxGrid::ProcessCornerLabelMouseEvent( wxMouseEvent& event ) +{ + if ( event.LeftDown() ) + { + // indicate corner label by having both row and + // col args == -1 + // + if ( !SendEvent( wxEVT_GRID_LABEL_LEFT_CLICK, -1, -1, event ) ) + { + SelectAll(); + } + } + else if ( event.LeftDClick() ) + { + SendEvent( wxEVT_GRID_LABEL_LEFT_DCLICK, -1, -1, event ); + } + else if ( event.RightDown() ) + { + if ( !SendEvent( wxEVT_GRID_LABEL_RIGHT_CLICK, -1, -1, event ) ) + { + // no default action at the moment + } + } + else if ( event.RightDClick() ) + { + if ( !SendEvent( wxEVT_GRID_LABEL_RIGHT_DCLICK, -1, -1, event ) ) + { + // no default action at the moment + } + } +} + +void wxGrid::ChangeCursorMode(CursorMode mode, + wxWindow *win, + bool captureMouse) +{ +#ifdef __WXDEBUG__ + static const wxChar *cursorModes[] = + { + _T("SELECT_CELL"), + _T("RESIZE_ROW"), + _T("RESIZE_COL"), + _T("SELECT_ROW"), + _T("SELECT_COL"), + _T("MOVE_COL"), + }; + + wxLogTrace(_T("grid"), + _T("wxGrid cursor mode (mouse capture for %s): %s -> %s"), + win == m_colLabelWin ? _T("colLabelWin") + : win ? _T("rowLabelWin") + : _T("gridWin"), + cursorModes[m_cursorMode], cursorModes[mode]); +#endif + + if ( mode == m_cursorMode && + win == m_winCapture && + captureMouse == (m_winCapture != NULL)) + return; + + if ( !win ) + { + // by default use the grid itself + win = m_gridWin; + } + + if ( m_winCapture ) + { + if (m_winCapture->HasCapture()) + m_winCapture->ReleaseMouse(); + m_winCapture = (wxWindow *)NULL; + } + + m_cursorMode = mode; + + switch ( m_cursorMode ) + { + case WXGRID_CURSOR_RESIZE_ROW: + win->SetCursor( m_rowResizeCursor ); + break; + + case WXGRID_CURSOR_RESIZE_COL: + win->SetCursor( m_colResizeCursor ); + break; + + case WXGRID_CURSOR_MOVE_COL: + win->SetCursor( wxCursor(wxCURSOR_HAND) ); + break; + + default: + win->SetCursor( *wxSTANDARD_CURSOR ); + break; + } + + // we need to capture mouse when resizing + bool resize = m_cursorMode == WXGRID_CURSOR_RESIZE_ROW || + m_cursorMode == WXGRID_CURSOR_RESIZE_COL; + + if ( captureMouse && resize ) + { + win->CaptureMouse(); + m_winCapture = win; + } +} + +void wxGrid::ProcessGridCellMouseEvent( wxMouseEvent& event ) +{ + int x, y; + wxPoint pos( event.GetPosition() ); + CalcUnscrolledPosition( pos.x, pos.y, &x, &y ); + + wxGridCellCoords coords; + XYToCell( x, y, coords ); + + int cell_rows, cell_cols; + bool isFirstDrag = !m_isDragging; + GetCellSize( coords.GetRow(), coords.GetCol(), &cell_rows, &cell_cols ); + if ((cell_rows < 0) || (cell_cols < 0)) + { + coords.SetRow(coords.GetRow() + cell_rows); + coords.SetCol(coords.GetCol() + cell_cols); + } + + if ( event.Dragging() ) + { + //wxLogDebug("pos(%d, %d) coords(%d, %d)", pos.x, pos.y, coords.GetRow(), coords.GetCol()); + + // Don't start doing anything until the mouse has been dragged at + // least 3 pixels in any direction... + if (! m_isDragging) + { + if (m_startDragPos == wxDefaultPosition) + { + m_startDragPos = pos; + return; + } + if (abs(m_startDragPos.x - pos.x) < 4 && abs(m_startDragPos.y - pos.y) < 4) + return; + } + + m_isDragging = true; + if ( m_cursorMode == WXGRID_CURSOR_SELECT_CELL ) + { + // Hide the edit control, so it + // won't interfere with drag-shrinking. + if ( IsCellEditControlShown() ) + { + HideCellEditControl(); + SaveEditControlValue(); + } + + if ( coords != wxGridNoCellCoords ) + { + if ( event.CmdDown() ) + { + if ( m_selectingKeyboard == wxGridNoCellCoords) + m_selectingKeyboard = coords; + HighlightBlock( m_selectingKeyboard, coords ); + } + else if ( CanDragCell() ) + { + if ( isFirstDrag ) + { + if ( m_selectingKeyboard == wxGridNoCellCoords) + m_selectingKeyboard = coords; + + SendEvent( wxEVT_GRID_CELL_BEGIN_DRAG, + coords.GetRow(), + coords.GetCol(), + event ); + return; + } + } + else + { + if ( !IsSelection() ) + { + HighlightBlock( coords, coords ); + } + else + { + HighlightBlock( m_currentCellCoords, coords ); + } + } + + if (! IsVisible(coords)) + { + MakeCellVisible(coords); + // TODO: need to introduce a delay or something here. The + // scrolling is way to fast, at least on MSW - also on GTK. + } + } + // Have we captured the mouse yet? + if (! m_winCapture) + { + m_winCapture = m_gridWin; + m_winCapture->CaptureMouse(); + } + + + } + else if ( m_cursorMode == WXGRID_CURSOR_RESIZE_ROW ) + { + int cw, ch, left, dummy; + m_gridWin->GetClientSize( &cw, &ch ); + CalcUnscrolledPosition( 0, 0, &left, &dummy ); + + wxClientDC dc( m_gridWin ); + PrepareDC( dc ); + y = wxMax( y, GetRowTop(m_dragRowOrCol) + + GetRowMinimalHeight(m_dragRowOrCol) ); + dc.SetLogicalFunction(wxINVERT); + if ( m_dragLastPos >= 0 ) + { + dc.DrawLine( left, m_dragLastPos, left+cw, m_dragLastPos ); + } + dc.DrawLine( left, y, left+cw, y ); + m_dragLastPos = y; + } + else if ( m_cursorMode == WXGRID_CURSOR_RESIZE_COL ) + { + int cw, ch, dummy, top; + m_gridWin->GetClientSize( &cw, &ch ); + CalcUnscrolledPosition( 0, 0, &dummy, &top ); + + wxClientDC dc( m_gridWin ); + PrepareDC( dc ); + x = wxMax( x, GetColLeft(m_dragRowOrCol) + + GetColMinimalWidth(m_dragRowOrCol) ); + dc.SetLogicalFunction(wxINVERT); + if ( m_dragLastPos >= 0 ) + { + dc.DrawLine( m_dragLastPos, top, m_dragLastPos, top + ch ); + } + dc.DrawLine( x, top, x, top + ch ); + m_dragLastPos = x; + } + + return; + } + + m_isDragging = false; + m_startDragPos = wxDefaultPosition; + + // VZ: if we do this, the mode is reset to WXGRID_CURSOR_SELECT_CELL + // immediately after it becomes WXGRID_CURSOR_RESIZE_ROW/COL under + // wxGTK +#if 0 + if ( event.Entering() || event.Leaving() ) + { + ChangeCursorMode(WXGRID_CURSOR_SELECT_CELL); + m_gridWin->SetCursor( *wxSTANDARD_CURSOR ); + } + else +#endif // 0 + + // ------------ Left button pressed + // + if ( event.LeftDown() && coords != wxGridNoCellCoords ) + { + if ( !SendEvent( wxEVT_GRID_CELL_LEFT_CLICK, + coords.GetRow(), + coords.GetCol(), + event ) ) + { + if ( !event.CmdDown() ) + ClearSelection(); + if ( event.ShiftDown() ) + { + if ( m_selection ) + { + m_selection->SelectBlock( m_currentCellCoords.GetRow(), + m_currentCellCoords.GetCol(), + coords.GetRow(), + coords.GetCol(), + event.ControlDown(), + event.ShiftDown(), + event.AltDown(), + event.MetaDown() ); + } + } + else if ( XToEdgeOfCol(x) < 0 && + YToEdgeOfRow(y) < 0 ) + { + DisableCellEditControl(); + MakeCellVisible( coords ); + + if ( event.CmdDown() ) + { + if ( m_selection ) + { + m_selection->ToggleCellSelection( coords.GetRow(), + coords.GetCol(), + event.ControlDown(), + event.ShiftDown(), + event.AltDown(), + event.MetaDown() ); + } + m_selectingTopLeft = wxGridNoCellCoords; + m_selectingBottomRight = wxGridNoCellCoords; + m_selectingKeyboard = coords; + } + else + { + m_waitForSlowClick = m_currentCellCoords == coords && coords != wxGridNoCellCoords; + SetCurrentCell( coords ); + if ( m_selection ) + { + if ( m_selection->GetSelectionMode() != + wxGrid::wxGridSelectCells ) + { + HighlightBlock( coords, coords ); + } + } + } + } + } + } + + // ------------ Left double click + // + else if ( event.LeftDClick() && coords != wxGridNoCellCoords ) + { + DisableCellEditControl(); + + if ( XToEdgeOfCol(x) < 0 && YToEdgeOfRow(y) < 0 ) + { + if ( !SendEvent( wxEVT_GRID_CELL_LEFT_DCLICK, + coords.GetRow(), + coords.GetCol(), + event ) ) + { + // we want double click to select a cell and start editing + // (i.e. to behave in same way as sequence of two slow clicks): + m_waitForSlowClick = true; + } + } + } + + // ------------ Left button released + // + else if ( event.LeftUp() ) + { + if ( m_cursorMode == WXGRID_CURSOR_SELECT_CELL ) + { + if (m_winCapture) + { + if (m_winCapture->HasCapture()) + m_winCapture->ReleaseMouse(); + m_winCapture = NULL; + } + + if ( coords == m_currentCellCoords && m_waitForSlowClick && CanEnableCellControl() ) + { + ClearSelection(); + EnableCellEditControl(); + + wxGridCellAttr *attr = GetCellAttr(coords); + wxGridCellEditor *editor = attr->GetEditor(this, coords.GetRow(), coords.GetCol()); + editor->StartingClick(); + editor->DecRef(); + attr->DecRef(); + + m_waitForSlowClick = false; + } + else if ( m_selectingTopLeft != wxGridNoCellCoords && + m_selectingBottomRight != wxGridNoCellCoords ) + { + if ( m_selection ) + { + m_selection->SelectBlock( m_selectingTopLeft.GetRow(), + m_selectingTopLeft.GetCol(), + m_selectingBottomRight.GetRow(), + m_selectingBottomRight.GetCol(), + event.ControlDown(), + event.ShiftDown(), + event.AltDown(), + event.MetaDown() ); + } + + m_selectingTopLeft = wxGridNoCellCoords; + m_selectingBottomRight = wxGridNoCellCoords; + + // Show the edit control, if it has been hidden for + // drag-shrinking. + ShowCellEditControl(); + } + } + else if ( m_cursorMode == WXGRID_CURSOR_RESIZE_ROW ) + { + ChangeCursorMode(WXGRID_CURSOR_SELECT_CELL); + DoEndDragResizeRow(); + + // Note: we are ending the event *after* doing + // default processing in this case + // + SendEvent( wxEVT_GRID_ROW_SIZE, m_dragRowOrCol, -1, event ); + } + else if ( m_cursorMode == WXGRID_CURSOR_RESIZE_COL ) + { + ChangeCursorMode(WXGRID_CURSOR_SELECT_CELL); + DoEndDragResizeCol(); + + // Note: we are ending the event *after* doing + // default processing in this case + // + SendEvent( wxEVT_GRID_COL_SIZE, -1, m_dragRowOrCol, event ); + } + + m_dragLastPos = -1; + } + + // ------------ Right button down + // + else if ( event.RightDown() && coords != wxGridNoCellCoords ) + { + DisableCellEditControl(); + if ( !SendEvent( wxEVT_GRID_CELL_RIGHT_CLICK, + coords.GetRow(), + coords.GetCol(), + event ) ) + { + // no default action at the moment + } + } + + // ------------ Right double click + // + else if ( event.RightDClick() && coords != wxGridNoCellCoords ) + { + DisableCellEditControl(); + if ( !SendEvent( wxEVT_GRID_CELL_RIGHT_DCLICK, + coords.GetRow(), + coords.GetCol(), + event ) ) + { + // no default action at the moment + } + } + + // ------------ Moving and no button action + // + else if ( event.Moving() && !event.IsButton() ) + { + if ( coords.GetRow() < 0 || coords.GetCol() < 0 ) + { + // out of grid cell area + ChangeCursorMode(WXGRID_CURSOR_SELECT_CELL); + return; + } + + int dragRow = YToEdgeOfRow( y ); + int dragCol = XToEdgeOfCol( x ); + + // Dragging on the corner of a cell to resize in both + // directions is not implemented yet... + // + if ( dragRow >= 0 && dragCol >= 0 ) + { + ChangeCursorMode(WXGRID_CURSOR_SELECT_CELL); + return; + } + + if ( dragRow >= 0 ) + { + m_dragRowOrCol = dragRow; + + if ( m_cursorMode == WXGRID_CURSOR_SELECT_CELL ) + { + if ( CanDragRowSize() && CanDragGridSize() ) + ChangeCursorMode(WXGRID_CURSOR_RESIZE_ROW); + } + } + else if ( dragCol >= 0 ) + { + m_dragRowOrCol = dragCol; + + if ( m_cursorMode == WXGRID_CURSOR_SELECT_CELL ) + { + if ( CanDragColSize() && CanDragGridSize() ) + ChangeCursorMode(WXGRID_CURSOR_RESIZE_COL); + } + } + else // Neither on a row or col edge + { + if ( m_cursorMode != WXGRID_CURSOR_SELECT_CELL ) + { + ChangeCursorMode(WXGRID_CURSOR_SELECT_CELL); + } + } + } +} + +void wxGrid::DoEndDragResizeRow() +{ + if ( m_dragLastPos >= 0 ) + { + // erase the last line and resize the row + // + int cw, ch, left, dummy; + m_gridWin->GetClientSize( &cw, &ch ); + CalcUnscrolledPosition( 0, 0, &left, &dummy ); + + wxClientDC dc( m_gridWin ); + PrepareDC( dc ); + dc.SetLogicalFunction( wxINVERT ); + dc.DrawLine( left, m_dragLastPos, left + cw, m_dragLastPos ); + HideCellEditControl(); + SaveEditControlValue(); + + int rowTop = GetRowTop(m_dragRowOrCol); + SetRowSize( m_dragRowOrCol, + wxMax( m_dragLastPos - rowTop, m_minAcceptableRowHeight ) ); + + if ( !GetBatchCount() ) + { + // Only needed to get the correct rect.y: + wxRect rect ( CellToRect( m_dragRowOrCol, 0 ) ); + rect.x = 0; + CalcScrolledPosition(0, rect.y, &dummy, &rect.y); + rect.width = m_rowLabelWidth; + rect.height = ch - rect.y; + m_rowLabelWin->Refresh( true, &rect ); + rect.width = cw; + + // if there is a multicell block, paint all of it + if (m_table) + { + int i, cell_rows, cell_cols, subtract_rows = 0; + int leftCol = XToCol(left); + int rightCol = internalXToCol(left + cw); + if (leftCol >= 0) + { + for (i=leftCol; iRefresh( false, &rect ); + } + + ShowCellEditControl(); + } +} + + +void wxGrid::DoEndDragResizeCol() +{ + if ( m_dragLastPos >= 0 ) + { + // erase the last line and resize the col + // + int cw, ch, dummy, top; + m_gridWin->GetClientSize( &cw, &ch ); + CalcUnscrolledPosition( 0, 0, &dummy, &top ); + + wxClientDC dc( m_gridWin ); + PrepareDC( dc ); + dc.SetLogicalFunction( wxINVERT ); + dc.DrawLine( m_dragLastPos, top, m_dragLastPos, top + ch ); + HideCellEditControl(); + SaveEditControlValue(); + + int colLeft = GetColLeft(m_dragRowOrCol); + SetColSize( m_dragRowOrCol, + wxMax( m_dragLastPos - colLeft, + GetColMinimalWidth(m_dragRowOrCol) ) ); + + if ( !GetBatchCount() ) + { + // Only needed to get the correct rect.x: + wxRect rect ( CellToRect( 0, m_dragRowOrCol ) ); + rect.y = 0; + CalcScrolledPosition(rect.x, 0, &rect.x, &dummy); + rect.width = cw - rect.x; + rect.height = m_colLabelHeight; + m_colLabelWin->Refresh( true, &rect ); + rect.height = ch; + + // if there is a multicell block, paint all of it + if (m_table) + { + int i, cell_rows, cell_cols, subtract_cols = 0; + int topRow = YToRow(top); + int bottomRow = internalYToRow(top + cw); + if (topRow >= 0) + { + for (i=topRow; iRefresh( false, &rect ); + } + + ShowCellEditControl(); + } +} + +void wxGrid::DoEndDragMoveCol() +{ + //The user clicked on the column but didn't actually drag + if ( m_dragLastPos < 0 ) + { + m_colLabelWin->Refresh(); //Do this to "unpress" the column + return; + } + + int newPos; + if ( m_moveToCol == -1 ) + newPos = m_numCols - 1; + else + { + newPos = GetColPos( m_moveToCol ); + if ( newPos > GetColPos( m_dragRowOrCol ) ) + newPos--; + } + + SetColPos( m_dragRowOrCol, newPos ); +} + +void wxGrid::SetColPos( int colID, int newPos ) +{ + if ( m_colAt.IsEmpty() ) + { + m_colAt.Alloc( m_numCols ); + + int i; + for ( i = 0; i < m_numCols; i++ ) + { + m_colAt.Add( i ); + } + } + + int oldPos = GetColPos( colID ); + + //Reshuffle the m_colAt array + if ( newPos > oldPos ) + { + int i; + for ( i = oldPos; i < newPos; i++ ) + { + m_colAt[i] = m_colAt[i+1]; + } + } + else + { + int i; + for ( i = oldPos; i > newPos; i-- ) + { + m_colAt[i] = m_colAt[i-1]; + } + } + + m_colAt[newPos] = colID; + + //Recalculate the column rights + if ( !m_colWidths.IsEmpty() ) + { + int colRight = 0; + int colPos; + for ( colPos = 0; colPos < m_numCols; colPos++ ) + { + int colID = GetColAt( colPos ); + + colRight += m_colWidths[colID]; + m_colRights[colID] = colRight; + } + } + + m_colLabelWin->Refresh(); + m_gridWin->Refresh(); +} + + + +void wxGrid::EnableDragColMove( bool enable ) +{ + if ( m_canDragColMove == enable ) + return; + + m_canDragColMove = enable; + + if ( !m_canDragColMove ) + { + m_colAt.Clear(); + + //Recalculate the column rights + if ( !m_colWidths.IsEmpty() ) + { + int colRight = 0; + int colPos; + for ( colPos = 0; colPos < m_numCols; colPos++ ) + { + colRight += m_colWidths[colPos]; + m_colRights[colPos] = colRight; + } + } + + m_colLabelWin->Refresh(); + m_gridWin->Refresh(); + } +} + + +// +// ------ interaction with data model +// +bool wxGrid::ProcessTableMessage( wxGridTableMessage& msg ) +{ + switch ( msg.GetId() ) + { + case wxGRIDTABLE_REQUEST_VIEW_GET_VALUES: + return GetModelValues(); + + case wxGRIDTABLE_REQUEST_VIEW_SEND_VALUES: + return SetModelValues(); + + case wxGRIDTABLE_NOTIFY_ROWS_INSERTED: + case wxGRIDTABLE_NOTIFY_ROWS_APPENDED: + case wxGRIDTABLE_NOTIFY_ROWS_DELETED: + case wxGRIDTABLE_NOTIFY_COLS_INSERTED: + case wxGRIDTABLE_NOTIFY_COLS_APPENDED: + case wxGRIDTABLE_NOTIFY_COLS_DELETED: + return Redimension( msg ); + + default: + return false; + } +} + +// The behaviour of this function depends on the grid table class +// Clear() function. For the default wxGridStringTable class the +// behavious is to replace all cell contents with wxEmptyString but +// not to change the number of rows or cols. +// +void wxGrid::ClearGrid() +{ + if ( m_table ) + { + if (IsCellEditControlEnabled()) + DisableCellEditControl(); + + m_table->Clear(); + if (!GetBatchCount()) + m_gridWin->Refresh(); + } +} + +bool wxGrid::InsertRows( int pos, int numRows, bool WXUNUSED(updateLabels) ) +{ + // TODO: something with updateLabels flag + + if ( !m_created ) + { + wxFAIL_MSG( wxT("Called wxGrid::InsertRows() before calling CreateGrid()") ); + return false; + } + + if ( m_table ) + { + if (IsCellEditControlEnabled()) + DisableCellEditControl(); + + bool done = m_table->InsertRows( pos, numRows ); + return done; + + // the table will have sent the results of the insert row + // operation to this view object as a grid table message + } + + return false; +} + +bool wxGrid::AppendRows( int numRows, bool WXUNUSED(updateLabels) ) +{ + // TODO: something with updateLabels flag + + if ( !m_created ) + { + wxFAIL_MSG( wxT("Called wxGrid::AppendRows() before calling CreateGrid()") ); + return false; + } + + if ( m_table ) + { + bool done = m_table && m_table->AppendRows( numRows ); + return done; + + // the table will have sent the results of the append row + // operation to this view object as a grid table message + } + + return false; +} + +bool wxGrid::DeleteRows( int pos, int numRows, bool WXUNUSED(updateLabels) ) +{ + // TODO: something with updateLabels flag + + if ( !m_created ) + { + wxFAIL_MSG( wxT("Called wxGrid::DeleteRows() before calling CreateGrid()") ); + return false; + } + + if ( m_table ) + { + if (IsCellEditControlEnabled()) + DisableCellEditControl(); + + bool done = m_table->DeleteRows( pos, numRows ); + return done; + // the table will have sent the results of the delete row + // operation to this view object as a grid table message + } + + return false; +} + +bool wxGrid::InsertCols( int pos, int numCols, bool WXUNUSED(updateLabels) ) +{ + // TODO: something with updateLabels flag + + if ( !m_created ) + { + wxFAIL_MSG( wxT("Called wxGrid::InsertCols() before calling CreateGrid()") ); + return false; + } + + if ( m_table ) + { + if (IsCellEditControlEnabled()) + DisableCellEditControl(); + + bool done = m_table->InsertCols( pos, numCols ); + return done; + // the table will have sent the results of the insert col + // operation to this view object as a grid table message + } + + return false; +} + +bool wxGrid::AppendCols( int numCols, bool WXUNUSED(updateLabels) ) +{ + // TODO: something with updateLabels flag + + if ( !m_created ) + { + wxFAIL_MSG( wxT("Called wxGrid::AppendCols() before calling CreateGrid()") ); + return false; + } + + if ( m_table ) + { + bool done = m_table->AppendCols( numCols ); + return done; + // the table will have sent the results of the append col + // operation to this view object as a grid table message + } + + return false; +} + +bool wxGrid::DeleteCols( int pos, int numCols, bool WXUNUSED(updateLabels) ) +{ + // TODO: something with updateLabels flag + + if ( !m_created ) + { + wxFAIL_MSG( wxT("Called wxGrid::DeleteCols() before calling CreateGrid()") ); + return false; + } + + if ( m_table ) + { + if (IsCellEditControlEnabled()) + DisableCellEditControl(); + + bool done = m_table->DeleteCols( pos, numCols ); + return done; + // the table will have sent the results of the delete col + // operation to this view object as a grid table message + } + + return false; +} + +// +// ----- event handlers +// + +// Generate a grid event based on a mouse event and +// return the result of ProcessEvent() +// +int wxGrid::SendEvent( const wxEventType type, + int row, int col, + wxMouseEvent& mouseEv ) +{ + bool claimed, vetoed; + + if ( type == wxEVT_GRID_ROW_SIZE || type == wxEVT_GRID_COL_SIZE ) + { + int rowOrCol = (row == -1 ? col : row); + + wxGridSizeEvent gridEvt( GetId(), + type, + this, + rowOrCol, + mouseEv.GetX() + GetRowLabelSize(), + mouseEv.GetY() + GetColLabelSize(), + mouseEv.ControlDown(), + mouseEv.ShiftDown(), + mouseEv.AltDown(), + mouseEv.MetaDown() ); + + claimed = GetEventHandler()->ProcessEvent(gridEvt); + vetoed = !gridEvt.IsAllowed(); + } + else if ( type == wxEVT_GRID_RANGE_SELECT ) + { + // Right now, it should _never_ end up here! + wxGridRangeSelectEvent gridEvt( GetId(), + type, + this, + m_selectingTopLeft, + m_selectingBottomRight, + true, + mouseEv.ControlDown(), + mouseEv.ShiftDown(), + mouseEv.AltDown(), + mouseEv.MetaDown() ); + + claimed = GetEventHandler()->ProcessEvent(gridEvt); + vetoed = !gridEvt.IsAllowed(); + } + else if ( type == wxEVT_GRID_LABEL_LEFT_CLICK || + type == wxEVT_GRID_LABEL_LEFT_DCLICK || + type == wxEVT_GRID_LABEL_RIGHT_CLICK || + type == wxEVT_GRID_LABEL_RIGHT_DCLICK ) + { + wxPoint pos = mouseEv.GetPosition(); + + if ( mouseEv.GetEventObject() == GetGridRowLabelWindow() ) + pos.y += GetColLabelSize(); + if ( mouseEv.GetEventObject() == GetGridColLabelWindow() ) + pos.x += GetRowLabelSize(); + + wxGridEvent gridEvt( GetId(), + type, + this, + row, col, + pos.x, + pos.y, + false, + mouseEv.ControlDown(), + mouseEv.ShiftDown(), + mouseEv.AltDown(), + mouseEv.MetaDown() ); + claimed = GetEventHandler()->ProcessEvent(gridEvt); + vetoed = !gridEvt.IsAllowed(); + } + else + { + wxGridEvent gridEvt( GetId(), + type, + this, + row, col, + mouseEv.GetX() + GetRowLabelSize(), + mouseEv.GetY() + GetColLabelSize(), + false, + mouseEv.ControlDown(), + mouseEv.ShiftDown(), + mouseEv.AltDown(), + mouseEv.MetaDown() ); + claimed = GetEventHandler()->ProcessEvent(gridEvt); + vetoed = !gridEvt.IsAllowed(); + } + + // A Veto'd event may not be `claimed' so test this first + if (vetoed) + return -1; + + return claimed ? 1 : 0; +} + +// Generate a grid event of specified type and return the result +// of ProcessEvent(). +// +int wxGrid::SendEvent( const wxEventType type, + int row, int col ) +{ + bool claimed, vetoed; + + if ( type == wxEVT_GRID_ROW_SIZE || type == wxEVT_GRID_COL_SIZE ) + { + int rowOrCol = (row == -1 ? col : row); + + wxGridSizeEvent gridEvt( GetId(), type, this, rowOrCol ); + + claimed = GetEventHandler()->ProcessEvent(gridEvt); + vetoed = !gridEvt.IsAllowed(); + } + else + { + wxGridEvent gridEvt( GetId(), type, this, row, col ); + + claimed = GetEventHandler()->ProcessEvent(gridEvt); + vetoed = !gridEvt.IsAllowed(); + } + + // A Veto'd event may not be `claimed' so test this first + if (vetoed) + return -1; + + return claimed ? 1 : 0; +} + +void wxGrid::OnPaint( wxPaintEvent& WXUNUSED(event) ) +{ + // needed to prevent zillions of paint events on MSW + wxPaintDC dc(this); +} + +void wxGrid::Refresh(bool eraseb, const wxRect* rect) +{ + // Don't do anything if between Begin/EndBatch... + // EndBatch() will do all this on the last nested one anyway. + if (! GetBatchCount()) + { + // Refresh to get correct scrolled position: + wxScrolledWindow::Refresh(eraseb, rect); + + if (rect) + { + int rect_x, rect_y, rectWidth, rectHeight; + int width_label, width_cell, height_label, height_cell; + int x, y; + + // Copy rectangle can get scroll offsets.. + rect_x = rect->GetX(); + rect_y = rect->GetY(); + rectWidth = rect->GetWidth(); + rectHeight = rect->GetHeight(); + + width_label = m_rowLabelWidth - rect_x; + if (width_label > rectWidth) + width_label = rectWidth; + + height_label = m_colLabelHeight - rect_y; + if (height_label > rectHeight) + height_label = rectHeight; + + if (rect_x > m_rowLabelWidth) + { + x = rect_x - m_rowLabelWidth; + width_cell = rectWidth; + } + else + { + x = 0; + width_cell = rectWidth - (m_rowLabelWidth - rect_x); + } + + if (rect_y > m_colLabelHeight) + { + y = rect_y - m_colLabelHeight; + height_cell = rectHeight; + } + else + { + y = 0; + height_cell = rectHeight - (m_colLabelHeight - rect_y); + } + + // Paint corner label part intersecting rect. + if ( width_label > 0 && height_label > 0 ) + { + wxRect anotherrect(rect_x, rect_y, width_label, height_label); + m_cornerLabelWin->Refresh(eraseb, &anotherrect); + } + + // Paint col labels part intersecting rect. + if ( width_cell > 0 && height_label > 0 ) + { + wxRect anotherrect(x, rect_y, width_cell, height_label); + m_colLabelWin->Refresh(eraseb, &anotherrect); + } + + // Paint row labels part intersecting rect. + if ( width_label > 0 && height_cell > 0 ) + { + wxRect anotherrect(rect_x, y, width_label, height_cell); + m_rowLabelWin->Refresh(eraseb, &anotherrect); + } + + // Paint cell area part intersecting rect. + if ( width_cell > 0 && height_cell > 0 ) + { + wxRect anotherrect(x, y, width_cell, height_cell); + m_gridWin->Refresh(eraseb, &anotherrect); + } + } + else + { + m_cornerLabelWin->Refresh(eraseb, NULL); + m_colLabelWin->Refresh(eraseb, NULL); + m_rowLabelWin->Refresh(eraseb, NULL); + m_gridWin->Refresh(eraseb, NULL); + } + } +} + +void wxGrid::OnSize( wxSizeEvent& WXUNUSED(event) ) +{ + if (m_targetWindow != this) // check whether initialisation has been done + { + // update our children window positions and scrollbars + CalcDimensions(); + } +} + +void wxGrid::OnKeyDown( wxKeyEvent& event ) +{ + if ( m_inOnKeyDown ) + { + // shouldn't be here - we are going round in circles... + // + wxFAIL_MSG( wxT("wxGrid::OnKeyDown called while already active") ); + } + + m_inOnKeyDown = true; + + // propagate the event up and see if it gets processed + wxWindow *parent = GetParent(); + wxKeyEvent keyEvt( event ); + keyEvt.SetEventObject( parent ); + + if ( !parent->GetEventHandler()->ProcessEvent( keyEvt ) ) + { + if (GetLayoutDirection() == wxLayout_RightToLeft) + { + if (event.GetKeyCode() == WXK_RIGHT) + event.m_keyCode = WXK_LEFT; + else if (event.GetKeyCode() == WXK_LEFT) + event.m_keyCode = WXK_RIGHT; + } + + // try local handlers + switch ( event.GetKeyCode() ) + { + case WXK_UP: + if ( event.ControlDown() ) + MoveCursorUpBlock( event.ShiftDown() ); + else + MoveCursorUp( event.ShiftDown() ); + break; + + case WXK_DOWN: + if ( event.ControlDown() ) + MoveCursorDownBlock( event.ShiftDown() ); + else + MoveCursorDown( event.ShiftDown() ); + break; + + case WXK_LEFT: + if ( event.ControlDown() ) + MoveCursorLeftBlock( event.ShiftDown() ); + else + MoveCursorLeft( event.ShiftDown() ); + break; + + case WXK_RIGHT: + if ( event.ControlDown() ) + MoveCursorRightBlock( event.ShiftDown() ); + else + MoveCursorRight( event.ShiftDown() ); + break; + + case WXK_RETURN: + case WXK_NUMPAD_ENTER: + if ( event.ControlDown() ) + { + event.Skip(); // to let the edit control have the return + } + else + { + if ( GetGridCursorRow() < GetNumberRows()-1 ) + { + MoveCursorDown( event.ShiftDown() ); + } + else + { + // at the bottom of a column + DisableCellEditControl(); + } + } + break; + + case WXK_ESCAPE: + ClearSelection(); + break; + + case WXK_TAB: + if (event.ShiftDown()) + { + if ( GetGridCursorCol() > 0 ) + { + MoveCursorLeft( false ); + } + else + { + // at left of grid + DisableCellEditControl(); + } + } + else + { + if ( GetGridCursorCol() < GetNumberCols() - 1 ) + { + MoveCursorRight( false ); + } + else + { + // at right of grid + DisableCellEditControl(); + } + } + break; + + case WXK_HOME: + if ( event.ControlDown() ) + { + MakeCellVisible( 0, 0 ); + SetCurrentCell( 0, 0 ); + } + else + { + event.Skip(); + } + break; + + case WXK_END: + if ( event.ControlDown() ) + { + MakeCellVisible( m_numRows - 1, m_numCols - 1 ); + SetCurrentCell( m_numRows - 1, m_numCols - 1 ); + } + else + { + event.Skip(); + } + break; + + case WXK_PAGEUP: + MovePageUp(); + break; + + case WXK_PAGEDOWN: + MovePageDown(); + break; + + case WXK_SPACE: + if ( event.ControlDown() ) + { + if ( m_selection ) + { + m_selection->ToggleCellSelection( + m_currentCellCoords.GetRow(), + m_currentCellCoords.GetCol(), + event.ControlDown(), + event.ShiftDown(), + event.AltDown(), + event.MetaDown() ); + } + break; + } + + if ( !IsEditable() ) + MoveCursorRight( false ); + else + event.Skip(); + break; + + default: + event.Skip(); + break; + } + } + + m_inOnKeyDown = false; +} + +void wxGrid::OnKeyUp( wxKeyEvent& event ) +{ + // try local handlers + // + if ( event.GetKeyCode() == WXK_SHIFT ) + { + if ( m_selectingTopLeft != wxGridNoCellCoords && + m_selectingBottomRight != wxGridNoCellCoords ) + { + if ( m_selection ) + { + m_selection->SelectBlock( + m_selectingTopLeft.GetRow(), + m_selectingTopLeft.GetCol(), + m_selectingBottomRight.GetRow(), + m_selectingBottomRight.GetCol(), + event.ControlDown(), + true, + event.AltDown(), + event.MetaDown() ); + } + } + + m_selectingTopLeft = wxGridNoCellCoords; + m_selectingBottomRight = wxGridNoCellCoords; + m_selectingKeyboard = wxGridNoCellCoords; + } +} + +void wxGrid::OnChar( wxKeyEvent& event ) +{ + // is it possible to edit the current cell at all? + if ( !IsCellEditControlEnabled() && CanEnableCellControl() ) + { + // yes, now check whether the cells editor accepts the key + int row = m_currentCellCoords.GetRow(); + int col = m_currentCellCoords.GetCol(); + wxGridCellAttr *attr = GetCellAttr(row, col); + wxGridCellEditor *editor = attr->GetEditor(this, row, col); + + // is special and will always start editing, for + // other keys - ask the editor itself + if ( (event.GetKeyCode() == WXK_F2 && !event.HasModifiers()) + || editor->IsAcceptedKey(event) ) + { + // ensure cell is visble + MakeCellVisible(row, col); + EnableCellEditControl(); + + // a problem can arise if the cell is not completely + // visible (even after calling MakeCellVisible the + // control is not created and calling StartingKey will + // crash the app + if ( event.GetKeyCode() != WXK_F2 && editor->IsCreated() && m_cellEditCtrlEnabled ) + editor->StartingKey(event); + } + else + { + event.Skip(); + } + + editor->DecRef(); + attr->DecRef(); + } + else + { + event.Skip(); + } +} + +void wxGrid::OnEraseBackground(wxEraseEvent&) +{ +} + +void wxGrid::SetCurrentCell( const wxGridCellCoords& coords ) +{ + if ( SendEvent( wxEVT_GRID_SELECT_CELL, coords.GetRow(), coords.GetCol() ) ) + { + // the event has been intercepted - do nothing + return; + } + +#if !(defined(__WXMAC__) && wxMAC_USE_CORE_GRAPHICS) + wxClientDC dc( m_gridWin ); + PrepareDC( dc ); +#endif + + if ( m_currentCellCoords != wxGridNoCellCoords ) + { + DisableCellEditControl(); + + if ( IsVisible( m_currentCellCoords, false ) ) + { + wxRect r; + r = BlockToDeviceRect( m_currentCellCoords, m_currentCellCoords ); + if ( !m_gridLinesEnabled ) + { + r.x--; + r.y--; + r.width++; + r.height++; + } + + wxGridCellCoordsArray cells = CalcCellsExposed( r ); + + // Otherwise refresh redraws the highlight! + m_currentCellCoords = coords; + +#if defined(__WXMAC__) && wxMAC_USE_CORE_GRAPHICS + m_gridWin->Refresh(true /*, & r */); +#else + DrawGridCellArea( dc, cells ); + DrawAllGridLines( dc, r ); +#endif + } + } + + m_currentCellCoords = coords; + + wxGridCellAttr *attr = GetCellAttr( coords ); +#if !(defined(__WXMAC__) && wxMAC_USE_CORE_GRAPHICS) + DrawCellHighlight( dc, attr ); +#endif + attr->DecRef(); +} + +void wxGrid::HighlightBlock( int topRow, int leftCol, int bottomRow, int rightCol ) +{ + int temp; + wxGridCellCoords updateTopLeft, updateBottomRight; + + if ( m_selection ) + { + if ( m_selection->GetSelectionMode() == wxGrid::wxGridSelectRows ) + { + leftCol = 0; + rightCol = GetNumberCols() - 1; + } + else if ( m_selection->GetSelectionMode() == wxGrid::wxGridSelectColumns ) + { + topRow = 0; + bottomRow = GetNumberRows() - 1; + } + } + + if ( topRow > bottomRow ) + { + temp = topRow; + topRow = bottomRow; + bottomRow = temp; + } + + if ( leftCol > rightCol ) + { + temp = leftCol; + leftCol = rightCol; + rightCol = temp; + } + + updateTopLeft = wxGridCellCoords( topRow, leftCol ); + updateBottomRight = wxGridCellCoords( bottomRow, rightCol ); + + // First the case that we selected a completely new area + if ( m_selectingTopLeft == wxGridNoCellCoords || + m_selectingBottomRight == wxGridNoCellCoords ) + { + wxRect rect; + rect = BlockToDeviceRect( wxGridCellCoords ( topRow, leftCol ), + wxGridCellCoords ( bottomRow, rightCol ) ); + m_gridWin->Refresh( false, &rect ); + } + + // Now handle changing an existing selection area. + else if ( m_selectingTopLeft != updateTopLeft || + m_selectingBottomRight != updateBottomRight ) + { + // Compute two optimal update rectangles: + // Either one rectangle is a real subset of the + // other, or they are (almost) disjoint! + wxRect rect[4]; + bool need_refresh[4]; + need_refresh[0] = + need_refresh[1] = + need_refresh[2] = + need_refresh[3] = false; + int i; + + // Store intermediate values + wxCoord oldLeft = m_selectingTopLeft.GetCol(); + wxCoord oldTop = m_selectingTopLeft.GetRow(); + wxCoord oldRight = m_selectingBottomRight.GetCol(); + wxCoord oldBottom = m_selectingBottomRight.GetRow(); + + // Determine the outer/inner coordinates. + if (oldLeft > leftCol) + { + temp = oldLeft; + oldLeft = leftCol; + leftCol = temp; + } + if (oldTop > topRow ) + { + temp = oldTop; + oldTop = topRow; + topRow = temp; + } + if (oldRight < rightCol ) + { + temp = oldRight; + oldRight = rightCol; + rightCol = temp; + } + if (oldBottom < bottomRow) + { + temp = oldBottom; + oldBottom = bottomRow; + bottomRow = temp; + } + + // Now, either the stuff marked old is the outer + // rectangle or we don't have a situation where one + // is contained in the other. + + if ( oldLeft < leftCol ) + { + // Refresh the newly selected or deselected + // area to the left of the old or new selection. + need_refresh[0] = true; + rect[0] = BlockToDeviceRect( + wxGridCellCoords( oldTop, oldLeft ), + wxGridCellCoords( oldBottom, leftCol - 1 ) ); + } + + if ( oldTop < topRow ) + { + // Refresh the newly selected or deselected + // area above the old or new selection. + need_refresh[1] = true; + rect[1] = BlockToDeviceRect( + wxGridCellCoords( oldTop, leftCol ), + wxGridCellCoords( topRow - 1, rightCol ) ); + } + + if ( oldRight > rightCol ) + { + // Refresh the newly selected or deselected + // area to the right of the old or new selection. + need_refresh[2] = true; + rect[2] = BlockToDeviceRect( + wxGridCellCoords( oldTop, rightCol + 1 ), + wxGridCellCoords( oldBottom, oldRight ) ); + } + + if ( oldBottom > bottomRow ) + { + // Refresh the newly selected or deselected + // area below the old or new selection. + need_refresh[3] = true; + rect[3] = BlockToDeviceRect( + wxGridCellCoords( bottomRow + 1, leftCol ), + wxGridCellCoords( oldBottom, rightCol ) ); + } + + // various Refresh() calls + for (i = 0; i < 4; i++ ) + if ( need_refresh[i] && rect[i] != wxGridNoCellRect ) + m_gridWin->Refresh( false, &(rect[i]) ); + } + + // change selection + m_selectingTopLeft = updateTopLeft; + m_selectingBottomRight = updateBottomRight; +} + +// +// ------ functions to get/send data (see also public functions) +// + +bool wxGrid::GetModelValues() +{ + // Hide the editor, so it won't hide a changed value. + HideCellEditControl(); + + if ( m_table ) + { + // all we need to do is repaint the grid + // + m_gridWin->Refresh(); + return true; + } + + return false; +} + +bool wxGrid::SetModelValues() +{ + int row, col; + + // Disable the editor, so it won't hide a changed value. + // Do we also want to save the current value of the editor first? + // I think so ... + DisableCellEditControl(); + + if ( m_table ) + { + for ( row = 0; row < m_numRows; row++ ) + { + for ( col = 0; col < m_numCols; col++ ) + { + m_table->SetValue( row, col, GetCellValue(row, col) ); + } + } + + return true; + } + + return false; +} + +// Note - this function only draws cells that are in the list of +// exposed cells (usually set from the update region by +// CalcExposedCells) +// +void wxGrid::DrawGridCellArea( wxDC& dc, const wxGridCellCoordsArray& cells ) +{ + if ( !m_numRows || !m_numCols ) + return; + + int i, numCells = cells.GetCount(); + int row, col, cell_rows, cell_cols; + wxGridCellCoordsArray redrawCells; + + for ( i = numCells - 1; i >= 0; i-- ) + { + row = cells[i].GetRow(); + col = cells[i].GetCol(); + GetCellSize( row, col, &cell_rows, &cell_cols ); + + // If this cell is part of a multicell block, find owner for repaint + if ( cell_rows <= 0 || cell_cols <= 0 ) + { + wxGridCellCoords cell( row + cell_rows, col + cell_cols ); + bool marked = false; + for ( int j = 0; j < numCells; j++ ) + { + if ( cell == cells[j] ) + { + marked = true; + break; + } + } + + if (!marked) + { + int count = redrawCells.GetCount(); + for (int j = 0; j < count; j++) + { + if ( cell == redrawCells[j] ) + { + marked = true; + break; + } + } + + if (!marked) + redrawCells.Add( cell ); + } + + // don't bother drawing this cell + continue; + } + + // If this cell is empty, find cell to left that might want to overflow + if (m_table && m_table->IsEmptyCell(row, col)) + { + for ( int l = 0; l < cell_rows; l++ ) + { + // find a cell in this row to leave already marked for repaint + int left = col; + for (int k = 0; k < int(redrawCells.GetCount()); k++) + if ((redrawCells[k].GetCol() < left) && + (redrawCells[k].GetRow() == row)) + { + left = redrawCells[k].GetCol(); + } + + if (left == col) + left = 0; // oh well + + for (int j = col - 1; j >= left; j--) + { + if (!m_table->IsEmptyCell(row + l, j)) + { + if (GetCellOverflow(row + l, j)) + { + wxGridCellCoords cell(row + l, j); + bool marked = false; + + for (int k = 0; k < numCells; k++) + { + if ( cell == cells[k] ) + { + marked = true; + break; + } + } + + if (!marked) + { + int count = redrawCells.GetCount(); + for (int k = 0; k < count; k++) + { + if ( cell == redrawCells[k] ) + { + marked = true; + break; + } + } + if (!marked) + redrawCells.Add( cell ); + } + } + break; + } + } + } + } + + DrawCell( dc, cells[i] ); + } + + numCells = redrawCells.GetCount(); + + for ( i = numCells - 1; i >= 0; i-- ) + { + DrawCell( dc, redrawCells[i] ); + } +} + +void wxGrid::DrawGridSpace( wxDC& dc ) +{ + int cw, ch; + m_gridWin->GetClientSize( &cw, &ch ); + + int right, bottom; + CalcUnscrolledPosition( cw, ch, &right, &bottom ); + + int rightCol = m_numCols > 0 ? GetColRight(GetColAt( m_numCols - 1 )) : 0; + int bottomRow = m_numRows > 0 ? GetRowBottom(m_numRows - 1) : 0; + + if ( right > rightCol || bottom > bottomRow ) + { + int left, top; + CalcUnscrolledPosition( 0, 0, &left, &top ); + + dc.SetBrush( wxBrush(GetDefaultCellBackgroundColour(), wxSOLID) ); + dc.SetPen( *wxTRANSPARENT_PEN ); + + if ( right > rightCol ) + { + dc.DrawRectangle( rightCol, top, right - rightCol, ch ); + } + + if ( bottom > bottomRow ) + { + dc.DrawRectangle( left, bottomRow, cw, bottom - bottomRow ); + } + } +} + +void wxGrid::DrawCell( wxDC& dc, const wxGridCellCoords& coords ) +{ + int row = coords.GetRow(); + int col = coords.GetCol(); + + if ( GetColWidth(col) <= 0 || GetRowHeight(row) <= 0 ) + return; + + // we draw the cell border ourselves +#if !WXGRID_DRAW_LINES + if ( m_gridLinesEnabled ) + DrawCellBorder( dc, coords ); +#endif + + wxGridCellAttr* attr = GetCellAttr(row, col); + + bool isCurrent = coords == m_currentCellCoords; + + wxRect rect = CellToRect( row, col ); + + // if the editor is shown, we should use it and not the renderer + // Note: However, only if it is really _shown_, i.e. not hidden! + if ( isCurrent && IsCellEditControlShown() ) + { + // NB: this "#if..." is temporary and fixes a problem where the + // edit control is erased by this code after being rendered. + // On wxMac (QD build only), the cell editor is a wxTextCntl and is rendered + // implicitly, causing this out-of order render. +#if !defined(__WXMAC__) + wxGridCellEditor *editor = attr->GetEditor(this, row, col); + editor->PaintBackground(rect, attr); + editor->DecRef(); +#endif + } + else + { + // but all the rest is drawn by the cell renderer and hence may be customized + wxGridCellRenderer *renderer = attr->GetRenderer(this, row, col); + renderer->Draw(*this, *attr, dc, rect, row, col, IsInSelection(coords)); + renderer->DecRef(); + } + + attr->DecRef(); +} + +void wxGrid::DrawCellHighlight( wxDC& dc, const wxGridCellAttr *attr ) +{ + int row = m_currentCellCoords.GetRow(); + int col = m_currentCellCoords.GetCol(); + + if ( GetColWidth(col) <= 0 || GetRowHeight(row) <= 0 ) + return; + + wxRect rect = CellToRect(row, col); + + // hmmm... what could we do here to show that the cell is disabled? + // for now, I just draw a thinner border than for the other ones, but + // it doesn't look really good + + int penWidth = attr->IsReadOnly() ? m_cellHighlightROPenWidth : m_cellHighlightPenWidth; + + if (penWidth > 0) + { + // The center of the drawn line is where the position/width/height of + // the rectangle is actually at (on wxMSW at least), so the + // size of the rectangle is reduced to compensate for the thickness of + // the line. If this is too strange on non-wxMSW platforms then + // please #ifdef this appropriately. + rect.x += penWidth / 2; + rect.y += penWidth / 2; + rect.width -= penWidth - 1; + rect.height -= penWidth - 1; + + // Now draw the rectangle + // use the cellHighlightColour if the cell is inside a selection, this + // will ensure the cell is always visible. + dc.SetPen(wxPen(IsInSelection(row,col) ? m_selectionForeground : m_cellHighlightColour, penWidth, wxSOLID)); + dc.SetBrush(*wxTRANSPARENT_BRUSH); + dc.DrawRectangle(rect); + } + +#if 0 + // VZ: my experiments with 3D borders... + + // how to properly set colours for arbitrary bg? + wxCoord x1 = rect.x, + y1 = rect.y, + x2 = rect.x + rect.width - 1, + y2 = rect.y + rect.height - 1; + + dc.SetPen(*wxWHITE_PEN); + dc.DrawLine(x1, y1, x2, y1); + dc.DrawLine(x1, y1, x1, y2); + + dc.DrawLine(x1 + 1, y2 - 1, x2 - 1, y2 - 1); + dc.DrawLine(x2 - 1, y1 + 1, x2 - 1, y2); + + dc.SetPen(*wxBLACK_PEN); + dc.DrawLine(x1, y2, x2, y2); + dc.DrawLine(x2, y1, x2, y2 + 1); +#endif +} + +wxPen wxGrid::GetDefaultGridLinePen() +{ + return wxPen(GetGridLineColour(), 1, wxSOLID); +} + +wxPen wxGrid::GetRowGridLinePen(int WXUNUSED(row)) +{ + return GetDefaultGridLinePen(); +} + +wxPen wxGrid::GetColGridLinePen(int WXUNUSED(col)) +{ + return GetDefaultGridLinePen(); +} + +void wxGrid::DrawCellBorder( wxDC& dc, const wxGridCellCoords& coords ) +{ + int row = coords.GetRow(); + int col = coords.GetCol(); + if ( GetColWidth(col) <= 0 || GetRowHeight(row) <= 0 ) + return; + + + wxRect rect = CellToRect( row, col ); + + // right hand border + dc.SetPen( GetColGridLinePen(col) ); + dc.DrawLine( rect.x + rect.width, rect.y, + rect.x + rect.width, rect.y + rect.height + 1 ); + + // bottom border + dc.SetPen( GetRowGridLinePen(row) ); + dc.DrawLine( rect.x, rect.y + rect.height, + rect.x + rect.width, rect.y + rect.height); +} + +void wxGrid::DrawHighlight(wxDC& dc, const wxGridCellCoordsArray& cells) +{ + // This if block was previously in wxGrid::OnPaint but that doesn't + // seem to get called under wxGTK - MB + // + if ( m_currentCellCoords == wxGridNoCellCoords && + m_numRows && m_numCols ) + { + m_currentCellCoords.Set(0, 0); + } + + if ( IsCellEditControlShown() ) + { + // don't show highlight when the edit control is shown + return; + } + + // if the active cell was repainted, repaint its highlight too because it + // might have been damaged by the grid lines + size_t count = cells.GetCount(); + for ( size_t n = 0; n < count; n++ ) + { + if ( cells[n] == m_currentCellCoords ) + { + wxGridCellAttr* attr = GetCellAttr(m_currentCellCoords); + DrawCellHighlight(dc, attr); + attr->DecRef(); + + break; + } + } +} + +// TODO: remove this ??? +// This is used to redraw all grid lines e.g. when the grid line colour +// has been changed +// +void wxGrid::DrawAllGridLines( wxDC& dc, const wxRegion & WXUNUSED(reg) ) +{ +#if !WXGRID_DRAW_LINES + return; +#endif + + if ( !m_gridLinesEnabled || !m_numRows || !m_numCols ) + return; + + int top, bottom, left, right; + +#if 0 //#ifndef __WXGTK__ + if (reg.IsEmpty()) + { + int cw, ch; + m_gridWin->GetClientSize(&cw, &ch); + + // virtual coords of visible area + // + CalcUnscrolledPosition( 0, 0, &left, &top ); + CalcUnscrolledPosition( cw, ch, &right, &bottom ); + } + else + { + wxCoord x, y, w, h; + reg.GetBox(x, y, w, h); + CalcUnscrolledPosition( x, y, &left, &top ); + CalcUnscrolledPosition( x + w, y + h, &right, &bottom ); + } +#else + int cw, ch; + m_gridWin->GetClientSize(&cw, &ch); + CalcUnscrolledPosition( 0, 0, &left, &top ); + CalcUnscrolledPosition( cw, ch, &right, &bottom ); +#endif + + // avoid drawing grid lines past the last row and col + // + right = wxMin( right, GetColRight(GetColAt( m_numCols - 1 )) ); + bottom = wxMin( bottom, GetRowBottom(m_numRows - 1) ); + + // no gridlines inside multicells, clip them out + int leftCol = GetColPos( internalXToCol(left) ); + int topRow = internalYToRow(top); + int rightCol = GetColPos( internalXToCol(right) ); + int bottomRow = internalYToRow(bottom); + +#if !defined(__WXMAC__) || wxMAC_USE_CORE_GRAPHICS + wxRegion clippedcells(0, 0, cw, ch); + + int i, j, cell_rows, cell_cols; + wxRect rect; + + for (j=topRow; j<=bottomRow; j++) + { + int colPos; + for (colPos=leftCol; colPos<=rightCol; colPos++) + { + i = GetColAt( colPos ); + + GetCellSize( j, i, &cell_rows, &cell_cols ); + if ((cell_rows > 1) || (cell_cols > 1)) + { + rect = CellToRect(j,i); + CalcScrolledPosition( rect.x, rect.y, &rect.x, &rect.y ); + clippedcells.Subtract(rect); + } + else if ((cell_rows < 0) || (cell_cols < 0)) + { + rect = CellToRect(j + cell_rows, i + cell_cols); + CalcScrolledPosition( rect.x, rect.y, &rect.x, &rect.y ); + clippedcells.Subtract(rect); + } + } + } +#else + wxRegion clippedcells( left, top, right - left, bottom - top ); + + int i, j, cell_rows, cell_cols; + wxRect rect; + + for (j=topRow; j<=bottomRow; j++) + { + for (i=leftCol; i<=rightCol; i++) + { + GetCellSize( j, i, &cell_rows, &cell_cols ); + if ((cell_rows > 1) || (cell_cols > 1)) + { + rect = CellToRect(j, i); + clippedcells.Subtract(rect); + } + else if ((cell_rows < 0) || (cell_cols < 0)) + { + rect = CellToRect(j + cell_rows, i + cell_cols); + clippedcells.Subtract(rect); + } + } + } +#endif + + dc.SetClippingRegion( clippedcells ); + + + // horizontal grid lines + // + // already declared above - int i; + for ( i = internalYToRow(top); i < m_numRows; i++ ) + { + int bot = GetRowBottom(i) - 1; + + if ( bot > bottom ) + { + break; + } + + if ( bot >= top ) + { + dc.SetPen( GetRowGridLinePen(i) ); + dc.DrawLine( left, bot, right, bot ); + } + } + + // vertical grid lines + // + int colPos; + for ( colPos = leftCol; colPos < m_numCols; colPos++ ) + { + i = GetColAt( colPos ); + + int colRight = GetColRight(i); +#ifdef __WXGTK__ + if (GetLayoutDirection() != wxLayout_RightToLeft) +#endif + colRight--; + + if ( colRight > right ) + { + break; + } + + if ( colRight >= left ) + { + dc.SetPen( GetColGridLinePen(i) ); + dc.DrawLine( colRight, top, colRight, bottom ); + } + } + + dc.DestroyClippingRegion(); +} + +void wxGrid::DrawRowLabels( wxDC& dc, const wxArrayInt& rows) +{ + if ( !m_numRows ) + return; + + size_t i; + size_t numLabels = rows.GetCount(); + + for ( i = 0; i < numLabels; i++ ) + { + DrawRowLabel( dc, rows[i] ); + } +} + +void wxGrid::DrawRowLabel( wxDC& dc, int row ) +{ + if ( GetRowHeight(row) <= 0 || m_rowLabelWidth <= 0 ) + return; + + wxRect rect; + +#if 0 +def __WXGTK20__ + rect.SetX( 1 ); + rect.SetY( GetRowTop(row) + 1 ); + rect.SetWidth( m_rowLabelWidth - 2 ); + rect.SetHeight( GetRowHeight(row) - 2 ); + + CalcScrolledPosition( 0, rect.y, NULL, &rect.y ); + + wxWindowDC *win_dc = (wxWindowDC*) &dc; + + wxRendererNative::Get().DrawHeaderButton( win_dc->m_owner, dc, rect, 0 ); +#else + int rowTop = GetRowTop(row), + rowBottom = GetRowBottom(row) - 1; + + dc.SetPen( wxPen(wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW), 1, wxSOLID) ); + dc.DrawLine( m_rowLabelWidth - 1, rowTop, m_rowLabelWidth - 1, rowBottom ); + dc.DrawLine( 0, rowTop, 0, rowBottom ); + dc.DrawLine( 0, rowBottom, m_rowLabelWidth, rowBottom ); + + dc.SetPen( *wxWHITE_PEN ); + dc.DrawLine( 1, rowTop, 1, rowBottom ); + dc.DrawLine( 1, rowTop, m_rowLabelWidth - 1, rowTop ); +#endif + + dc.SetBackgroundMode( wxTRANSPARENT ); + dc.SetTextForeground( GetLabelTextColour() ); + dc.SetFont( GetLabelFont() ); + + int hAlign, vAlign; + GetRowLabelAlignment( &hAlign, &vAlign ); + + rect.SetX( 2 ); + rect.SetY( GetRowTop(row) + 2 ); + rect.SetWidth( m_rowLabelWidth - 4 ); + rect.SetHeight( GetRowHeight(row) - 4 ); + DrawTextRectangle( dc, GetRowLabelValue( row ), rect, hAlign, vAlign ); +} + +void wxGrid::DrawColLabels( wxDC& dc,const wxArrayInt& cols ) +{ + if ( !m_numCols ) + return; + + size_t i; + size_t numLabels = cols.GetCount(); + + for ( i = 0; i < numLabels; i++ ) + { + DrawColLabel( dc, cols[i] ); + } +} + +void wxGrid::DrawColLabel( wxDC& dc, int col ) +{ + if ( GetColWidth(col) <= 0 || m_colLabelHeight <= 0 ) + return; + + int colLeft = GetColLeft(col); + + wxRect rect; + +#if 0 +def __WXGTK20__ + rect.SetX( colLeft + 1 ); + rect.SetY( 1 ); + rect.SetWidth( GetColWidth(col) - 2 ); + rect.SetHeight( m_colLabelHeight - 2 ); + + wxWindowDC *win_dc = (wxWindowDC*) &dc; + + wxRendererNative::Get().DrawHeaderButton( win_dc->m_owner, dc, rect, 0 ); +#else + int colRight = GetColRight(col) - 1; + + dc.SetPen( wxPen(wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW), 1, wxSOLID) ); + dc.DrawLine( colRight, 0, colRight, m_colLabelHeight - 1 ); + dc.DrawLine( colLeft, 0, colRight, 0 ); + dc.DrawLine( colLeft, m_colLabelHeight - 1, + colRight + 1, m_colLabelHeight - 1 ); + + dc.SetPen( *wxWHITE_PEN ); + dc.DrawLine( colLeft, 1, colLeft, m_colLabelHeight - 1 ); + dc.DrawLine( colLeft, 1, colRight, 1 ); +#endif + + dc.SetBackgroundMode( wxTRANSPARENT ); + dc.SetTextForeground( GetLabelTextColour() ); + dc.SetFont( GetLabelFont() ); + + int hAlign, vAlign, orient; + GetColLabelAlignment( &hAlign, &vAlign ); + orient = GetColLabelTextOrientation(); + + rect.SetX( colLeft + 2 ); + rect.SetY( 2 ); + rect.SetWidth( GetColWidth(col) - 4 ); + rect.SetHeight( m_colLabelHeight - 4 ); + DrawTextRectangle( dc, GetColLabelValue( col ), rect, hAlign, vAlign, orient ); +} + +void wxGrid::DrawTextRectangle( wxDC& dc, + const wxString& value, + const wxRect& rect, + int horizAlign, + int vertAlign, + int textOrientation ) +{ + wxArrayString lines; + + StringToLines( value, lines ); + + // Forward to new API. + DrawTextRectangle( dc, + lines, + rect, + horizAlign, + vertAlign, + textOrientation ); +} + +// VZ: this should be replaced with wxDC::DrawLabel() to which we just have to +// add textOrientation support +void wxGrid::DrawTextRectangle(wxDC& dc, + const wxArrayString& lines, + const wxRect& rect, + int horizAlign, + int vertAlign, + int textOrientation) +{ + if ( lines.empty() ) + return; + + wxDCClipper clip(dc, rect); + + long textWidth, + textHeight; + + if ( textOrientation == wxHORIZONTAL ) + GetTextBoxSize( dc, lines, &textWidth, &textHeight ); + else + GetTextBoxSize( dc, lines, &textHeight, &textWidth ); + + int x = 0, + y = 0; + switch ( vertAlign ) + { + case wxALIGN_BOTTOM: + if ( textOrientation == wxHORIZONTAL ) + y = rect.y + (rect.height - textHeight - 1); + else + x = rect.x + rect.width - textWidth; + break; + + case wxALIGN_CENTRE: + if ( textOrientation == wxHORIZONTAL ) + y = rect.y + ((rect.height - textHeight) / 2); + else + x = rect.x + ((rect.width - textWidth) / 2); + break; + + case wxALIGN_TOP: + default: + if ( textOrientation == wxHORIZONTAL ) + y = rect.y + 1; + else + x = rect.x + 1; + break; + } + + // Align each line of a multi-line label + size_t nLines = lines.GetCount(); + for ( size_t l = 0; l < nLines; l++ ) + { + const wxString& line = lines[l]; + + if ( line.empty() ) + { + *(textOrientation == wxHORIZONTAL ? &y : &x) += dc.GetCharHeight(); + continue; + } + + long lineWidth = 0, + lineHeight = 0; + dc.GetTextExtent(line, &lineWidth, &lineHeight); + + switch ( horizAlign ) + { + case wxALIGN_RIGHT: + if ( textOrientation == wxHORIZONTAL ) + x = rect.x + (rect.width - lineWidth - 1); + else + y = rect.y + lineWidth + 1; + break; + + case wxALIGN_CENTRE: + if ( textOrientation == wxHORIZONTAL ) + x = rect.x + ((rect.width - lineWidth) / 2); + else + y = rect.y + rect.height - ((rect.height - lineWidth) / 2); + break; + + case wxALIGN_LEFT: + default: + if ( textOrientation == wxHORIZONTAL ) + x = rect.x + 1; + else + y = rect.y + rect.height - 1; + break; + } + + if ( textOrientation == wxHORIZONTAL ) + { + dc.DrawText( line, x, y ); + y += lineHeight; + } + else + { + dc.DrawRotatedText( line, x, y, 90.0 ); + x += lineHeight; + } + } +} + +// Split multi-line text up into an array of strings. +// Any existing contents of the string array are preserved. +// +void wxGrid::StringToLines( const wxString& value, wxArrayString& lines ) +{ + int startPos = 0; + int pos; + wxString eol = wxTextFile::GetEOL( wxTextFileType_Unix ); + wxString tVal = wxTextFile::Translate( value, wxTextFileType_Unix ); + + while ( startPos < (int)tVal.length() ) + { + pos = tVal.Mid(startPos).Find( eol ); + if ( pos < 0 ) + { + break; + } + else if ( pos == 0 ) + { + lines.Add( wxEmptyString ); + } + else + { + lines.Add( value.Mid(startPos, pos) ); + } + + startPos += pos + 1; + } + + if ( startPos < (int)value.length() ) + { + lines.Add( value.Mid( startPos ) ); + } +} + +void wxGrid::GetTextBoxSize( const wxDC& dc, + const wxArrayString& lines, + long *width, long *height ) +{ + long w = 0; + long h = 0; + long lineW = 0, lineH = 0; + + size_t i; + for ( i = 0; i < lines.GetCount(); i++ ) + { + dc.GetTextExtent( lines[i], &lineW, &lineH ); + w = wxMax( w, lineW ); + h += lineH; + } + + *width = w; + *height = h; +} + +// +// ------ Batch processing. +// +void wxGrid::EndBatch() +{ + if ( m_batchCount > 0 ) + { + m_batchCount--; + if ( !m_batchCount ) + { + CalcDimensions(); + m_rowLabelWin->Refresh(); + m_colLabelWin->Refresh(); + m_cornerLabelWin->Refresh(); + m_gridWin->Refresh(); + } + } +} + +// Use this, rather than wxWindow::Refresh(), to force an immediate +// repainting of the grid. Has no effect if you are already inside a +// BeginBatch / EndBatch block. +// +void wxGrid::ForceRefresh() +{ + BeginBatch(); + EndBatch(); +} + +bool wxGrid::Enable(bool enable) +{ + if ( !wxScrolledWindow::Enable(enable) ) + return false; + + // redraw in the new state + m_gridWin->Refresh(); + + return true; +} + +// +// ------ Edit control functions +// + +void wxGrid::EnableEditing( bool edit ) +{ + // TODO: improve this ? + // + if ( edit != m_editable ) + { + if (!edit) + EnableCellEditControl(edit); + m_editable = edit; + } +} + +void wxGrid::EnableCellEditControl( bool enable ) +{ + if (! m_editable) + return; + + if ( enable != m_cellEditCtrlEnabled ) + { + if ( enable ) + { + if (SendEvent( wxEVT_GRID_EDITOR_SHOWN) <0) + return; + + // this should be checked by the caller! + wxASSERT_MSG( CanEnableCellControl(), _T("can't enable editing for this cell!") ); + + // do it before ShowCellEditControl() + m_cellEditCtrlEnabled = enable; + + ShowCellEditControl(); + } + else + { + //FIXME:add veto support + SendEvent( wxEVT_GRID_EDITOR_HIDDEN ); + + HideCellEditControl(); + SaveEditControlValue(); + + // do it after HideCellEditControl() + m_cellEditCtrlEnabled = enable; + } + } +} + +bool wxGrid::IsCurrentCellReadOnly() const +{ + // const_cast + wxGridCellAttr* attr = ((wxGrid *)this)->GetCellAttr(m_currentCellCoords); + bool readonly = attr->IsReadOnly(); + attr->DecRef(); + + return readonly; +} + +bool wxGrid::CanEnableCellControl() const +{ + return m_editable && (m_currentCellCoords != wxGridNoCellCoords) && + !IsCurrentCellReadOnly(); +} + +bool wxGrid::IsCellEditControlEnabled() const +{ + // the cell edit control might be disable for all cells or just for the + // current one if it's read only + return m_cellEditCtrlEnabled ? !IsCurrentCellReadOnly() : false; +} + +bool wxGrid::IsCellEditControlShown() const +{ + bool isShown = false; + + if ( m_cellEditCtrlEnabled ) + { + int row = m_currentCellCoords.GetRow(); + int col = m_currentCellCoords.GetCol(); + wxGridCellAttr* attr = GetCellAttr(row, col); + wxGridCellEditor* editor = attr->GetEditor((wxGrid*) this, row, col); + attr->DecRef(); + + if ( editor ) + { + if ( editor->IsCreated() ) + { + isShown = editor->GetControl()->IsShown(); + } + + editor->DecRef(); + } + } + + return isShown; +} + +void wxGrid::ShowCellEditControl() +{ + if ( IsCellEditControlEnabled() ) + { + if ( !IsVisible( m_currentCellCoords, false ) ) + { + m_cellEditCtrlEnabled = false; + return; + } + else + { + wxRect rect = CellToRect( m_currentCellCoords ); + int row = m_currentCellCoords.GetRow(); + int col = m_currentCellCoords.GetCol(); + + // if this is part of a multicell, find owner (topleft) + int cell_rows, cell_cols; + GetCellSize( row, col, &cell_rows, &cell_cols ); + if ( cell_rows <= 0 || cell_cols <= 0 ) + { + row += cell_rows; + col += cell_cols; + m_currentCellCoords.SetRow( row ); + m_currentCellCoords.SetCol( col ); + } + + // erase the highlight and the cell contents because the editor + // might not cover the entire cell + wxClientDC dc( m_gridWin ); + PrepareDC( dc ); + wxGridCellAttr* attr = GetCellAttr(row, col); + dc.SetBrush(wxBrush(attr->GetBackgroundColour(), wxSOLID)); + dc.SetPen(*wxTRANSPARENT_PEN); + dc.DrawRectangle(rect); + + // convert to scrolled coords + CalcScrolledPosition( rect.x, rect.y, &rect.x, &rect.y ); + + int nXMove = 0; + if (rect.x < 0) + nXMove = rect.x; + + // cell is shifted by one pixel + // However, don't allow x or y to become negative + // since the SetSize() method interprets that as + // "don't change." + if (rect.x > 0) + rect.x--; + if (rect.y > 0) + rect.y--; + + wxGridCellEditor* editor = attr->GetEditor(this, row, col); + if ( !editor->IsCreated() ) + { + editor->Create(m_gridWin, wxID_ANY, + new wxGridCellEditorEvtHandler(this, editor)); + + wxGridEditorCreatedEvent evt(GetId(), + wxEVT_GRID_EDITOR_CREATED, + this, + row, + col, + editor->GetControl()); + GetEventHandler()->ProcessEvent(evt); + } + + // resize editor to overflow into righthand cells if allowed + int maxWidth = rect.width; + wxString value = GetCellValue(row, col); + if ( (value != wxEmptyString) && (attr->GetOverflow()) ) + { + int y; + GetTextExtent(value, &maxWidth, &y, NULL, NULL, &attr->GetFont()); + if (maxWidth < rect.width) + maxWidth = rect.width; + } + + int client_right = m_gridWin->GetClientSize().GetWidth(); + if (rect.x + maxWidth > client_right) + maxWidth = client_right - rect.x; + + if ((maxWidth > rect.width) && (col < m_numCols) && m_table) + { + GetCellSize( row, col, &cell_rows, &cell_cols ); + // may have changed earlier + for (int i = col + cell_cols; i < m_numCols; i++) + { + int c_rows, c_cols; + GetCellSize( row, i, &c_rows, &c_cols ); + + // looks weird going over a multicell + if (m_table->IsEmptyCell( row, i ) && + (rect.width < maxWidth) && (c_rows == 1)) + { + rect.width += GetColWidth( i ); + } + else + break; + } + + if (rect.GetRight() > client_right) + rect.SetRight( client_right - 1 ); + } + + editor->SetCellAttr( attr ); + editor->SetSize( rect ); + if (nXMove != 0) + editor->GetControl()->Move( + editor->GetControl()->GetPosition().x + nXMove, + editor->GetControl()->GetPosition().y ); + editor->Show( true, attr ); + + // recalc dimensions in case we need to + // expand the scrolled window to account for editor + CalcDimensions(); + + editor->BeginEdit(row, col, this); + editor->SetCellAttr(NULL); + + editor->DecRef(); + attr->DecRef(); + } + } +} + +void wxGrid::HideCellEditControl() +{ + if ( IsCellEditControlEnabled() ) + { + int row = m_currentCellCoords.GetRow(); + int col = m_currentCellCoords.GetCol(); + + wxGridCellAttr *attr = GetCellAttr(row, col); + wxGridCellEditor *editor = attr->GetEditor(this, row, col); + editor->Show( false ); + editor->DecRef(); + attr->DecRef(); + + m_gridWin->SetFocus(); + + // refresh whole row to the right + wxRect rect( CellToRect(row, col) ); + CalcScrolledPosition(rect.x, rect.y, &rect.x, &rect.y ); + rect.width = m_gridWin->GetClientSize().GetWidth() - rect.x; + +#ifdef __WXMAC__ + // ensure that the pixels under the focus ring get refreshed as well + rect.Inflate(10, 10); +#endif + + m_gridWin->Refresh( false, &rect ); + } +} + +void wxGrid::SaveEditControlValue() +{ + if ( IsCellEditControlEnabled() ) + { + int row = m_currentCellCoords.GetRow(); + int col = m_currentCellCoords.GetCol(); + + wxString oldval = GetCellValue(row, col); + + wxGridCellAttr* attr = GetCellAttr(row, col); + wxGridCellEditor* editor = attr->GetEditor(this, row, col); + bool changed = editor->EndEdit(row, col, this); + + editor->DecRef(); + attr->DecRef(); + + if (changed) + { + if ( SendEvent( wxEVT_GRID_CELL_CHANGE, + m_currentCellCoords.GetRow(), + m_currentCellCoords.GetCol() ) < 0 ) + { + // Event has been vetoed, set the data back. + SetCellValue(row, col, oldval); + } + } + } +} + +// +// ------ Grid location functions +// Note that all of these functions work with the logical coordinates of +// grid cells and labels so you will need to convert from device +// coordinates for mouse events etc. +// + +void wxGrid::XYToCell( int x, int y, wxGridCellCoords& coords ) +{ + int row = YToRow(y); + int col = XToCol(x); + + if ( row == -1 || col == -1 ) + { + coords = wxGridNoCellCoords; + } + else + { + coords.Set( row, col ); + } +} + +// Internal Helper function for computing row or column from some +// (unscrolled) coordinate value, using either +// m_defaultRowHeight/m_defaultColWidth or binary search on array +// of m_rowBottoms/m_ColRights to speed up the search! + +static int CoordToRowOrCol(int coord, int defaultDist, int minDist, + const wxArrayInt& BorderArray, int nMax, + bool clipToMinMax) +{ + if (coord < 0) + return clipToMinMax && (nMax > 0) ? 0 : -1; + + if (!defaultDist) + defaultDist = 1; + + size_t i_max = coord / defaultDist, + i_min = 0; + + if (BorderArray.IsEmpty()) + { + if ((int) i_max < nMax) + return i_max; + return clipToMinMax ? nMax - 1 : -1; + } + + if ( i_max >= BorderArray.GetCount()) + { + i_max = BorderArray.GetCount() - 1; + } + else + { + if ( coord >= BorderArray[i_max]) + { + i_min = i_max; + if (minDist) + i_max = coord / minDist; + else + i_max = BorderArray.GetCount() - 1; + } + + if ( i_max >= BorderArray.GetCount()) + i_max = BorderArray.GetCount() - 1; + } + + if ( coord >= BorderArray[i_max]) + return clipToMinMax ? (int)i_max : -1; + if ( coord < BorderArray[0] ) + return 0; + + while ( i_max - i_min > 0 ) + { + wxCHECK_MSG(BorderArray[i_min] <= coord && coord < BorderArray[i_max], + 0, _T("wxGrid: internal error in CoordToRowOrCol")); + if (coord >= BorderArray[ i_max - 1]) + return i_max; + else + i_max--; + int median = i_min + (i_max - i_min + 1) / 2; + if (coord < BorderArray[median]) + i_max = median; + else + i_min = median; + } + + return i_max; +} + +int wxGrid::YToRow( int y ) +{ + return CoordToRowOrCol(y, m_defaultRowHeight, + m_minAcceptableRowHeight, m_rowBottoms, m_numRows, false); +} + +int wxGrid::XToCol( int x, bool clipToMinMax ) +{ + if (x < 0) + return clipToMinMax && (m_numCols > 0) ? GetColAt( 0 ) : -1; + + if (!m_defaultColWidth) + m_defaultColWidth = 1; + + int maxPos = x / m_defaultColWidth; + int minPos = 0; + + if (m_colRights.IsEmpty()) + { + if(maxPos < m_numCols) + return GetColAt( maxPos ); + return clipToMinMax ? GetColAt( m_numCols - 1 ) : -1; + } + + if ( maxPos >= m_numCols) + maxPos = m_numCols - 1; + else + { + if ( x >= m_colRights[GetColAt( maxPos )]) + { + minPos = maxPos; + if (m_minAcceptableColWidth) + maxPos = x / m_minAcceptableColWidth; + else + maxPos = m_numCols - 1; + } + if ( maxPos >= m_numCols) + maxPos = m_numCols - 1; + } + + //X is beyond the last column + if ( x >= m_colRights[GetColAt( maxPos )]) + return clipToMinMax ? GetColAt( maxPos ) : -1; + + //X is before the first column + if ( x < m_colRights[GetColAt( 0 )] ) + return GetColAt( 0 ); + + //Perform a binary search + while ( maxPos - minPos > 0 ) + { + wxCHECK_MSG(m_colRights[GetColAt( minPos )] <= x && x < m_colRights[GetColAt( maxPos )], + 0, _T("wxGrid: internal error in XToCol")); + + if (x >= m_colRights[GetColAt( maxPos - 1 )]) + return GetColAt( maxPos ); + else + maxPos--; + int median = minPos + (maxPos - minPos + 1) / 2; + if (x < m_colRights[GetColAt( median )]) + maxPos = median; + else + minPos = median; + } + return GetColAt( maxPos ); +} + +// return the row number that that the y coord is near +// the edge of, or -1 if not near an edge. +// coords can only possibly be near an edge if +// (a) the row/column is large enough to still allow for an "inner" area +// that is _not_ nead the edge (i.e., if the height/width is smaller +// than WXGRID_LABEL_EDGE_ZONE, coords are _never_ considered to be +// near the edge). +// and +// (b) resizing rows/columns (the thing for which edge detection is +// relevant at all) is enabled. +// +int wxGrid::YToEdgeOfRow( int y ) +{ + int i; + i = internalYToRow(y); + + if ( GetRowHeight(i) > WXGRID_LABEL_EDGE_ZONE && CanDragRowSize() ) + { + // We know that we are in row i, test whether we are + // close enough to lower or upper border, respectively. + if ( abs(GetRowBottom(i) - y) < WXGRID_LABEL_EDGE_ZONE ) + return i; + else if ( i > 0 && y - GetRowTop(i) < WXGRID_LABEL_EDGE_ZONE ) + return i - 1; + } + + return -1; +} + +// return the col number that that the x coord is near the edge of, or +// -1 if not near an edge +// See comment at YToEdgeOfRow for conditions on edge detection. +// +int wxGrid::XToEdgeOfCol( int x ) +{ + int i; + i = internalXToCol(x); + + if ( GetColWidth(i) > WXGRID_LABEL_EDGE_ZONE && CanDragColSize() ) + { + // We know that we are in column i; test whether we are + // close enough to right or left border, respectively. + if ( abs(GetColRight(i) - x) < WXGRID_LABEL_EDGE_ZONE ) + return i; + else if ( i > 0 && x - GetColLeft(i) < WXGRID_LABEL_EDGE_ZONE ) + return i - 1; + } + + return -1; +} + +wxRect wxGrid::CellToRect( int row, int col ) +{ + wxRect rect( -1, -1, -1, -1 ); + + if ( row >= 0 && row < m_numRows && + col >= 0 && col < m_numCols ) + { + int i, cell_rows, cell_cols; + rect.width = rect.height = 0; + GetCellSize( row, col, &cell_rows, &cell_cols ); + // if negative then find multicell owner + if (cell_rows < 0) + row += cell_rows; + if (cell_cols < 0) + col += cell_cols; + GetCellSize( row, col, &cell_rows, &cell_cols ); + + rect.x = GetColLeft(col); + rect.y = GetRowTop(row); + for (i=col; i < col + cell_cols; i++) + rect.width += GetColWidth(i); + for (i=row; i < row + cell_rows; i++) + rect.height += GetRowHeight(i); + } + + // if grid lines are enabled, then the area of the cell is a bit smaller + if (m_gridLinesEnabled) + { + rect.width -= 1; + rect.height -= 1; + } + + return rect; +} + +bool wxGrid::IsVisible( int row, int col, bool wholeCellVisible ) +{ + // get the cell rectangle in logical coords + // + wxRect r( CellToRect( row, col ) ); + + // convert to device coords + // + int left, top, right, bottom; + CalcScrolledPosition( r.GetLeft(), r.GetTop(), &left, &top ); + CalcScrolledPosition( r.GetRight(), r.GetBottom(), &right, &bottom ); + + // check against the client area of the grid window + int cw, ch; + m_gridWin->GetClientSize( &cw, &ch ); + + if ( wholeCellVisible ) + { + // is the cell wholly visible ? + return ( left >= 0 && right <= cw && + top >= 0 && bottom <= ch ); + } + else + { + // is the cell partly visible ? + // + return ( ((left >= 0 && left < cw) || (right > 0 && right <= cw)) && + ((top >= 0 && top < ch) || (bottom > 0 && bottom <= ch)) ); + } +} + +// make the specified cell location visible by doing a minimal amount +// of scrolling +// +void wxGrid::MakeCellVisible( int row, int col ) +{ + int i; + int xpos = -1, ypos = -1; + + if ( row >= 0 && row < m_numRows && + col >= 0 && col < m_numCols ) + { + // get the cell rectangle in logical coords + wxRect r( CellToRect( row, col ) ); + + // convert to device coords + int left, top, right, bottom; + CalcScrolledPosition( r.GetLeft(), r.GetTop(), &left, &top ); + CalcScrolledPosition( r.GetRight(), r.GetBottom(), &right, &bottom ); + + int cw, ch; + m_gridWin->GetClientSize( &cw, &ch ); + + if ( top < 0 ) + { + ypos = r.GetTop(); + } + else if ( bottom > ch ) + { + int h = r.GetHeight(); + ypos = r.GetTop(); + for ( i = row - 1; i >= 0; i-- ) + { + int rowHeight = GetRowHeight(i); + if ( h + rowHeight > ch ) + break; + + h += rowHeight; + ypos -= rowHeight; + } + + // we divide it later by GRID_SCROLL_LINE, make sure that we don't + // have rounding errors (this is important, because if we do, + // we might not scroll at all and some cells won't be redrawn) + // + // Sometimes GRID_SCROLL_LINE / 2 is not enough, + // so just add a full scroll unit... + ypos += m_scrollLineY; + } + + // special handling for wide cells - show always left part of the cell! + // Otherwise, e.g. when stepping from row to row, it would jump between + // left and right part of the cell on every step! +// if ( left < 0 ) + if ( left < 0 || (right - left) >= cw ) + { + xpos = r.GetLeft(); + } + else if ( right > cw ) + { + // position the view so that the cell is on the right + int x0, y0; + CalcUnscrolledPosition(0, 0, &x0, &y0); + xpos = x0 + (right - cw); + + // see comment for ypos above + xpos += m_scrollLineX; + } + + if ( xpos != -1 || ypos != -1 ) + { + if ( xpos != -1 ) + xpos /= m_scrollLineX; + if ( ypos != -1 ) + ypos /= m_scrollLineY; + Scroll( xpos, ypos ); + AdjustScrollbars(); + } + } +} + +// +// ------ Grid cursor movement functions +// + +bool wxGrid::MoveCursorUp( bool expandSelection ) +{ + if ( m_currentCellCoords != wxGridNoCellCoords && + m_currentCellCoords.GetRow() >= 0 ) + { + if ( expandSelection ) + { + if ( m_selectingKeyboard == wxGridNoCellCoords ) + m_selectingKeyboard = m_currentCellCoords; + if ( m_selectingKeyboard.GetRow() > 0 ) + { + m_selectingKeyboard.SetRow( m_selectingKeyboard.GetRow() - 1 ); + MakeCellVisible( m_selectingKeyboard.GetRow(), + m_selectingKeyboard.GetCol() ); + HighlightBlock( m_currentCellCoords, m_selectingKeyboard ); + } + } + else if ( m_currentCellCoords.GetRow() > 0 ) + { + int row = m_currentCellCoords.GetRow() - 1; + int col = m_currentCellCoords.GetCol(); + ClearSelection(); + MakeCellVisible( row, col ); + SetCurrentCell( row, col ); + } + else + return false; + + return true; + } + + return false; +} + +bool wxGrid::MoveCursorDown( bool expandSelection ) +{ + if ( m_currentCellCoords != wxGridNoCellCoords && + m_currentCellCoords.GetRow() < m_numRows ) + { + if ( expandSelection ) + { + if ( m_selectingKeyboard == wxGridNoCellCoords ) + m_selectingKeyboard = m_currentCellCoords; + if ( m_selectingKeyboard.GetRow() < m_numRows - 1 ) + { + m_selectingKeyboard.SetRow( m_selectingKeyboard.GetRow() + 1 ); + MakeCellVisible( m_selectingKeyboard.GetRow(), + m_selectingKeyboard.GetCol() ); + HighlightBlock( m_currentCellCoords, m_selectingKeyboard ); + } + } + else if ( m_currentCellCoords.GetRow() < m_numRows - 1 ) + { + int row = m_currentCellCoords.GetRow() + 1; + int col = m_currentCellCoords.GetCol(); + ClearSelection(); + MakeCellVisible( row, col ); + SetCurrentCell( row, col ); + } + else + return false; + + return true; + } + + return false; +} + +bool wxGrid::MoveCursorLeft( bool expandSelection ) +{ + if ( m_currentCellCoords != wxGridNoCellCoords && + m_currentCellCoords.GetCol() >= 0 ) + { + if ( expandSelection ) + { + if ( m_selectingKeyboard == wxGridNoCellCoords ) + m_selectingKeyboard = m_currentCellCoords; + if ( m_selectingKeyboard.GetCol() > 0 ) + { + m_selectingKeyboard.SetCol( m_selectingKeyboard.GetCol() - 1 ); + MakeCellVisible( m_selectingKeyboard.GetRow(), + m_selectingKeyboard.GetCol() ); + HighlightBlock( m_currentCellCoords, m_selectingKeyboard ); + } + } + else if ( GetColPos( m_currentCellCoords.GetCol() ) > 0 ) + { + int row = m_currentCellCoords.GetRow(); + int col = GetColAt( GetColPos( m_currentCellCoords.GetCol() ) - 1 ); + ClearSelection(); + + MakeCellVisible( row, col ); + SetCurrentCell( row, col ); + } + else + return false; + + return true; + } + + return false; +} + +bool wxGrid::MoveCursorRight( bool expandSelection ) +{ + if ( m_currentCellCoords != wxGridNoCellCoords && + m_currentCellCoords.GetCol() < m_numCols ) + { + if ( expandSelection ) + { + if ( m_selectingKeyboard == wxGridNoCellCoords ) + m_selectingKeyboard = m_currentCellCoords; + if ( m_selectingKeyboard.GetCol() < m_numCols - 1 ) + { + m_selectingKeyboard.SetCol( m_selectingKeyboard.GetCol() + 1 ); + MakeCellVisible( m_selectingKeyboard.GetRow(), + m_selectingKeyboard.GetCol() ); + HighlightBlock( m_currentCellCoords, m_selectingKeyboard ); + } + } + else if ( GetColPos( m_currentCellCoords.GetCol() ) < m_numCols - 1 ) + { + int row = m_currentCellCoords.GetRow(); + int col = GetColAt( GetColPos( m_currentCellCoords.GetCol() ) + 1 ); + ClearSelection(); + + MakeCellVisible( row, col ); + SetCurrentCell( row, col ); + } + else + return false; + + return true; + } + + return false; +} + +bool wxGrid::MovePageUp() +{ + if ( m_currentCellCoords == wxGridNoCellCoords ) + return false; + + int row = m_currentCellCoords.GetRow(); + if ( row > 0 ) + { + int cw, ch; + m_gridWin->GetClientSize( &cw, &ch ); + + int y = GetRowTop(row); + int newRow = internalYToRow( y - ch + 1 ); + + if ( newRow == row ) + { + // row > 0, so newRow can never be less than 0 here. + newRow = row - 1; + } + + MakeCellVisible( newRow, m_currentCellCoords.GetCol() ); + SetCurrentCell( newRow, m_currentCellCoords.GetCol() ); + + return true; + } + + return false; +} + +bool wxGrid::MovePageDown() +{ + if ( m_currentCellCoords == wxGridNoCellCoords ) + return false; + + int row = m_currentCellCoords.GetRow(); + if ( (row + 1) < m_numRows ) + { + int cw, ch; + m_gridWin->GetClientSize( &cw, &ch ); + + int y = GetRowTop(row); + int newRow = internalYToRow( y + ch ); + if ( newRow == row ) + { + // row < m_numRows, so newRow can't overflow here. + newRow = row + 1; + } + + MakeCellVisible( newRow, m_currentCellCoords.GetCol() ); + SetCurrentCell( newRow, m_currentCellCoords.GetCol() ); + + return true; + } + + return false; +} + +bool wxGrid::MoveCursorUpBlock( bool expandSelection ) +{ + if ( m_table && + m_currentCellCoords != wxGridNoCellCoords && + m_currentCellCoords.GetRow() > 0 ) + { + int row = m_currentCellCoords.GetRow(); + int col = m_currentCellCoords.GetCol(); + + if ( m_table->IsEmptyCell(row, col) ) + { + // starting in an empty cell: find the next block of + // non-empty cells + // + while ( row > 0 ) + { + row--; + if ( !(m_table->IsEmptyCell(row, col)) ) + break; + } + } + else if ( m_table->IsEmptyCell(row - 1, col) ) + { + // starting at the top of a block: find the next block + // + row--; + while ( row > 0 ) + { + row--; + if ( !(m_table->IsEmptyCell(row, col)) ) + break; + } + } + else + { + // starting within a block: find the top of the block + // + while ( row > 0 ) + { + row--; + if ( m_table->IsEmptyCell(row, col) ) + { + row++; + break; + } + } + } + + MakeCellVisible( row, col ); + if ( expandSelection ) + { + m_selectingKeyboard = wxGridCellCoords( row, col ); + HighlightBlock( m_currentCellCoords, m_selectingKeyboard ); + } + else + { + ClearSelection(); + SetCurrentCell( row, col ); + } + + return true; + } + + return false; +} + +bool wxGrid::MoveCursorDownBlock( bool expandSelection ) +{ + if ( m_table && + m_currentCellCoords != wxGridNoCellCoords && + m_currentCellCoords.GetRow() < m_numRows - 1 ) + { + int row = m_currentCellCoords.GetRow(); + int col = m_currentCellCoords.GetCol(); + + if ( m_table->IsEmptyCell(row, col) ) + { + // starting in an empty cell: find the next block of + // non-empty cells + // + while ( row < m_numRows - 1 ) + { + row++; + if ( !(m_table->IsEmptyCell(row, col)) ) + break; + } + } + else if ( m_table->IsEmptyCell(row + 1, col) ) + { + // starting at the bottom of a block: find the next block + // + row++; + while ( row < m_numRows - 1 ) + { + row++; + if ( !(m_table->IsEmptyCell(row, col)) ) + break; + } + } + else + { + // starting within a block: find the bottom of the block + // + while ( row < m_numRows - 1 ) + { + row++; + if ( m_table->IsEmptyCell(row, col) ) + { + row--; + break; + } + } + } + + MakeCellVisible( row, col ); + if ( expandSelection ) + { + m_selectingKeyboard = wxGridCellCoords( row, col ); + HighlightBlock( m_currentCellCoords, m_selectingKeyboard ); + } + else + { + ClearSelection(); + SetCurrentCell( row, col ); + } + + return true; + } + + return false; +} + +bool wxGrid::MoveCursorLeftBlock( bool expandSelection ) +{ + if ( m_table && + m_currentCellCoords != wxGridNoCellCoords && + m_currentCellCoords.GetCol() > 0 ) + { + int row = m_currentCellCoords.GetRow(); + int col = m_currentCellCoords.GetCol(); + + if ( m_table->IsEmptyCell(row, col) ) + { + // starting in an empty cell: find the next block of + // non-empty cells + // + while ( col > 0 ) + { + col--; + if ( !(m_table->IsEmptyCell(row, col)) ) + break; + } + } + else if ( m_table->IsEmptyCell(row, col - 1) ) + { + // starting at the left of a block: find the next block + // + col--; + while ( col > 0 ) + { + col--; + if ( !(m_table->IsEmptyCell(row, col)) ) + break; + } + } + else + { + // starting within a block: find the left of the block + // + while ( col > 0 ) + { + col--; + if ( m_table->IsEmptyCell(row, col) ) + { + col++; + break; + } + } + } + + MakeCellVisible( row, col ); + if ( expandSelection ) + { + m_selectingKeyboard = wxGridCellCoords( row, col ); + HighlightBlock( m_currentCellCoords, m_selectingKeyboard ); + } + else + { + ClearSelection(); + SetCurrentCell( row, col ); + } + + return true; + } + + return false; +} + +bool wxGrid::MoveCursorRightBlock( bool expandSelection ) +{ + if ( m_table && + m_currentCellCoords != wxGridNoCellCoords && + m_currentCellCoords.GetCol() < m_numCols - 1 ) + { + int row = m_currentCellCoords.GetRow(); + int col = m_currentCellCoords.GetCol(); + + if ( m_table->IsEmptyCell(row, col) ) + { + // starting in an empty cell: find the next block of + // non-empty cells + // + while ( col < m_numCols - 1 ) + { + col++; + if ( !(m_table->IsEmptyCell(row, col)) ) + break; + } + } + else if ( m_table->IsEmptyCell(row, col + 1) ) + { + // starting at the right of a block: find the next block + // + col++; + while ( col < m_numCols - 1 ) + { + col++; + if ( !(m_table->IsEmptyCell(row, col)) ) + break; + } + } + else + { + // starting within a block: find the right of the block + // + while ( col < m_numCols - 1 ) + { + col++; + if ( m_table->IsEmptyCell(row, col) ) + { + col--; + break; + } + } + } + + MakeCellVisible( row, col ); + if ( expandSelection ) + { + m_selectingKeyboard = wxGridCellCoords( row, col ); + HighlightBlock( m_currentCellCoords, m_selectingKeyboard ); + } + else + { + ClearSelection(); + SetCurrentCell( row, col ); + } + + return true; + } + + return false; +} + +// +// ------ Label values and formatting +// + +void wxGrid::GetRowLabelAlignment( int *horiz, int *vert ) +{ + if ( horiz ) + *horiz = m_rowLabelHorizAlign; + if ( vert ) + *vert = m_rowLabelVertAlign; +} + +void wxGrid::GetColLabelAlignment( int *horiz, int *vert ) +{ + if ( horiz ) + *horiz = m_colLabelHorizAlign; + if ( vert ) + *vert = m_colLabelVertAlign; +} + +int wxGrid::GetColLabelTextOrientation() +{ + return m_colLabelTextOrientation; +} + +wxString wxGrid::GetRowLabelValue( int row ) +{ + if ( m_table ) + { + return m_table->GetRowLabelValue( row ); + } + else + { + wxString s; + s << row; + return s; + } +} + +wxString wxGrid::GetColLabelValue( int col ) +{ + if ( m_table ) + { + return m_table->GetColLabelValue( col ); + } + else + { + wxString s; + s << col; + return s; + } +} + +void wxGrid::SetRowLabelSize( int width ) +{ + width = wxMax( width, 0 ); + if ( width != m_rowLabelWidth ) + { + if ( width == 0 ) + { + m_rowLabelWin->Show( false ); + m_cornerLabelWin->Show( false ); + } + else if ( m_rowLabelWidth == 0 ) + { + m_rowLabelWin->Show( true ); + if ( m_colLabelHeight > 0 ) + m_cornerLabelWin->Show( true ); + } + + m_rowLabelWidth = width; + CalcWindowSizes(); + wxScrolledWindow::Refresh( true ); + } +} + +void wxGrid::SetColLabelSize( int height ) +{ + height = wxMax( height, 0 ); + if ( height != m_colLabelHeight ) + { + if ( height == 0 ) + { + m_colLabelWin->Show( false ); + m_cornerLabelWin->Show( false ); + } + else if ( m_colLabelHeight == 0 ) + { + m_colLabelWin->Show( true ); + if ( m_rowLabelWidth > 0 ) + m_cornerLabelWin->Show( true ); + } + + m_colLabelHeight = height; + CalcWindowSizes(); + wxScrolledWindow::Refresh( true ); + } +} + +void wxGrid::SetLabelBackgroundColour( const wxColour& colour ) +{ + if ( m_labelBackgroundColour != colour ) + { + m_labelBackgroundColour = colour; + m_rowLabelWin->SetBackgroundColour( colour ); + m_colLabelWin->SetBackgroundColour( colour ); + m_cornerLabelWin->SetBackgroundColour( colour ); + + if ( !GetBatchCount() ) + { + m_rowLabelWin->Refresh(); + m_colLabelWin->Refresh(); + m_cornerLabelWin->Refresh(); + } + } +} + +void wxGrid::SetLabelTextColour( const wxColour& colour ) +{ + if ( m_labelTextColour != colour ) + { + m_labelTextColour = colour; + if ( !GetBatchCount() ) + { + m_rowLabelWin->Refresh(); + m_colLabelWin->Refresh(); + } + } +} + +void wxGrid::SetLabelFont( const wxFont& font ) +{ + m_labelFont = font; + if ( !GetBatchCount() ) + { + m_rowLabelWin->Refresh(); + m_colLabelWin->Refresh(); + } +} + +void wxGrid::SetRowLabelAlignment( int horiz, int vert ) +{ + // allow old (incorrect) defs to be used + switch ( horiz ) + { + case wxLEFT: horiz = wxALIGN_LEFT; break; + case wxRIGHT: horiz = wxALIGN_RIGHT; break; + case wxCENTRE: horiz = wxALIGN_CENTRE; break; + } + + switch ( vert ) + { + case wxTOP: vert = wxALIGN_TOP; break; + case wxBOTTOM: vert = wxALIGN_BOTTOM; break; + case wxCENTRE: vert = wxALIGN_CENTRE; break; + } + + if ( horiz == wxALIGN_LEFT || horiz == wxALIGN_CENTRE || horiz == wxALIGN_RIGHT ) + { + m_rowLabelHorizAlign = horiz; + } + + if ( vert == wxALIGN_TOP || vert == wxALIGN_CENTRE || vert == wxALIGN_BOTTOM ) + { + m_rowLabelVertAlign = vert; + } + + if ( !GetBatchCount() ) + { + m_rowLabelWin->Refresh(); + } +} + +void wxGrid::SetColLabelAlignment( int horiz, int vert ) +{ + // allow old (incorrect) defs to be used + switch ( horiz ) + { + case wxLEFT: horiz = wxALIGN_LEFT; break; + case wxRIGHT: horiz = wxALIGN_RIGHT; break; + case wxCENTRE: horiz = wxALIGN_CENTRE; break; + } + + switch ( vert ) + { + case wxTOP: vert = wxALIGN_TOP; break; + case wxBOTTOM: vert = wxALIGN_BOTTOM; break; + case wxCENTRE: vert = wxALIGN_CENTRE; break; + } + + if ( horiz == wxALIGN_LEFT || horiz == wxALIGN_CENTRE || horiz == wxALIGN_RIGHT ) + { + m_colLabelHorizAlign = horiz; + } + + if ( vert == wxALIGN_TOP || vert == wxALIGN_CENTRE || vert == wxALIGN_BOTTOM ) + { + m_colLabelVertAlign = vert; + } + + if ( !GetBatchCount() ) + { + m_colLabelWin->Refresh(); + } +} + +// Note: under MSW, the default column label font must be changed because it +// does not support vertical printing +// +// Example: wxFont font(9, wxSWISS, wxNORMAL, wxBOLD); +// pGrid->SetLabelFont(font); +// pGrid->SetColLabelTextOrientation(wxVERTICAL); +// +void wxGrid::SetColLabelTextOrientation( int textOrientation ) +{ + if ( textOrientation == wxHORIZONTAL || textOrientation == wxVERTICAL ) + m_colLabelTextOrientation = textOrientation; + + if ( !GetBatchCount() ) + m_colLabelWin->Refresh(); +} + +void wxGrid::SetRowLabelValue( int row, const wxString& s ) +{ + if ( m_table ) + { + m_table->SetRowLabelValue( row, s ); + if ( !GetBatchCount() ) + { + wxRect rect = CellToRect( row, 0 ); + if ( rect.height > 0 ) + { + CalcScrolledPosition(0, rect.y, &rect.x, &rect.y); + rect.x = 0; + rect.width = m_rowLabelWidth; + m_rowLabelWin->Refresh( true, &rect ); + } + } + } +} + +void wxGrid::SetColLabelValue( int col, const wxString& s ) +{ + if ( m_table ) + { + m_table->SetColLabelValue( col, s ); + if ( !GetBatchCount() ) + { + wxRect rect = CellToRect( 0, col ); + if ( rect.width > 0 ) + { + CalcScrolledPosition(rect.x, 0, &rect.x, &rect.y); + rect.y = 0; + rect.height = m_colLabelHeight; + m_colLabelWin->Refresh( true, &rect ); + } + } + } +} + +void wxGrid::SetGridLineColour( const wxColour& colour ) +{ + if ( m_gridLineColour != colour ) + { + m_gridLineColour = colour; + + wxClientDC dc( m_gridWin ); + PrepareDC( dc ); + DrawAllGridLines( dc, wxRegion() ); + } +} + +void wxGrid::SetCellHighlightColour( const wxColour& colour ) +{ + if ( m_cellHighlightColour != colour ) + { + m_cellHighlightColour = colour; + + wxClientDC dc( m_gridWin ); + PrepareDC( dc ); + wxGridCellAttr* attr = GetCellAttr(m_currentCellCoords); + DrawCellHighlight(dc, attr); + attr->DecRef(); + } +} + +void wxGrid::SetCellHighlightPenWidth(int width) +{ + if (m_cellHighlightPenWidth != width) + { + m_cellHighlightPenWidth = width; + + // Just redrawing the cell highlight is not enough since that won't + // make any visible change if the the thickness is getting smaller. + int row = m_currentCellCoords.GetRow(); + int col = m_currentCellCoords.GetCol(); + if ( row == -1 || col == -1 || GetColWidth(col) <= 0 || GetRowHeight(row) <= 0 ) + return; + + wxRect rect = CellToRect(row, col); + m_gridWin->Refresh(true, &rect); + } +} + +void wxGrid::SetCellHighlightROPenWidth(int width) +{ + if (m_cellHighlightROPenWidth != width) + { + m_cellHighlightROPenWidth = width; + + // Just redrawing the cell highlight is not enough since that won't + // make any visible change if the the thickness is getting smaller. + int row = m_currentCellCoords.GetRow(); + int col = m_currentCellCoords.GetCol(); + if ( GetColWidth(col) <= 0 || GetRowHeight(row) <= 0 ) + return; + + wxRect rect = CellToRect(row, col); + m_gridWin->Refresh(true, &rect); + } +} + +void wxGrid::EnableGridLines( bool enable ) +{ + if ( enable != m_gridLinesEnabled ) + { + m_gridLinesEnabled = enable; + + if ( !GetBatchCount() ) + { + if ( enable ) + { + wxClientDC dc( m_gridWin ); + PrepareDC( dc ); + DrawAllGridLines( dc, wxRegion() ); + } + else + { + m_gridWin->Refresh(); + } + } + } +} + +int wxGrid::GetDefaultRowSize() +{ + return m_defaultRowHeight; +} + +int wxGrid::GetRowSize( int row ) +{ + wxCHECK_MSG( row >= 0 && row < m_numRows, 0, _T("invalid row index") ); + + return GetRowHeight(row); +} + +int wxGrid::GetDefaultColSize() +{ + return m_defaultColWidth; +} + +int wxGrid::GetColSize( int col ) +{ + wxCHECK_MSG( col >= 0 && col < m_numCols, 0, _T("invalid column index") ); + + return GetColWidth(col); +} + +// ============================================================================ +// access to the grid attributes: each of them has a default value in the grid +// itself and may be overidden on a per-cell basis +// ============================================================================ + +// ---------------------------------------------------------------------------- +// setting default attributes +// ---------------------------------------------------------------------------- + +void wxGrid::SetDefaultCellBackgroundColour( const wxColour& col ) +{ + m_defaultCellAttr->SetBackgroundColour(col); +#ifdef __WXGTK__ + m_gridWin->SetBackgroundColour(col); +#endif +} + +void wxGrid::SetDefaultCellTextColour( const wxColour& col ) +{ + m_defaultCellAttr->SetTextColour(col); +} + +void wxGrid::SetDefaultCellAlignment( int horiz, int vert ) +{ + m_defaultCellAttr->SetAlignment(horiz, vert); +} + +void wxGrid::SetDefaultCellOverflow( bool allow ) +{ + m_defaultCellAttr->SetOverflow(allow); +} + +void wxGrid::SetDefaultCellFont( const wxFont& font ) +{ + m_defaultCellAttr->SetFont(font); +} + +// For editors and renderers the type registry takes precedence over the +// default attr, so we need to register the new editor/renderer for the string +// data type in order to make setting a default editor/renderer appear to +// work correctly. + +void wxGrid::SetDefaultRenderer(wxGridCellRenderer *renderer) +{ + RegisterDataType(wxGRID_VALUE_STRING, + renderer, + GetDefaultEditorForType(wxGRID_VALUE_STRING)); +} + +void wxGrid::SetDefaultEditor(wxGridCellEditor *editor) +{ + RegisterDataType(wxGRID_VALUE_STRING, + GetDefaultRendererForType(wxGRID_VALUE_STRING), + editor); +} + +// ---------------------------------------------------------------------------- +// access to the default attrbiutes +// ---------------------------------------------------------------------------- + +wxColour wxGrid::GetDefaultCellBackgroundColour() +{ + return m_defaultCellAttr->GetBackgroundColour(); +} + +wxColour wxGrid::GetDefaultCellTextColour() +{ + return m_defaultCellAttr->GetTextColour(); +} + +wxFont wxGrid::GetDefaultCellFont() +{ + return m_defaultCellAttr->GetFont(); +} + +void wxGrid::GetDefaultCellAlignment( int *horiz, int *vert ) +{ + m_defaultCellAttr->GetAlignment(horiz, vert); +} + +bool wxGrid::GetDefaultCellOverflow() +{ + return m_defaultCellAttr->GetOverflow(); +} + +wxGridCellRenderer *wxGrid::GetDefaultRenderer() const +{ + return m_defaultCellAttr->GetRenderer(NULL, 0, 0); +} + +wxGridCellEditor *wxGrid::GetDefaultEditor() const +{ + return m_defaultCellAttr->GetEditor(NULL, 0, 0); +} + +// ---------------------------------------------------------------------------- +// access to cell attributes +// ---------------------------------------------------------------------------- + +wxColour wxGrid::GetCellBackgroundColour(int row, int col) +{ + wxGridCellAttr *attr = GetCellAttr(row, col); + wxColour colour = attr->GetBackgroundColour(); + attr->DecRef(); + + return colour; +} + +wxColour wxGrid::GetCellTextColour( int row, int col ) +{ + wxGridCellAttr *attr = GetCellAttr(row, col); + wxColour colour = attr->GetTextColour(); + attr->DecRef(); + + return colour; +} + +wxFont wxGrid::GetCellFont( int row, int col ) +{ + wxGridCellAttr *attr = GetCellAttr(row, col); + wxFont font = attr->GetFont(); + attr->DecRef(); + + return font; +} + +void wxGrid::GetCellAlignment( int row, int col, int *horiz, int *vert ) +{ + wxGridCellAttr *attr = GetCellAttr(row, col); + attr->GetAlignment(horiz, vert); + attr->DecRef(); +} + +bool wxGrid::GetCellOverflow( int row, int col ) +{ + wxGridCellAttr *attr = GetCellAttr(row, col); + bool allow = attr->GetOverflow(); + attr->DecRef(); + + return allow; +} + +void wxGrid::GetCellSize( int row, int col, int *num_rows, int *num_cols ) +{ + wxGridCellAttr *attr = GetCellAttr(row, col); + attr->GetSize( num_rows, num_cols ); + attr->DecRef(); +} + +wxGridCellRenderer* wxGrid::GetCellRenderer(int row, int col) +{ + wxGridCellAttr* attr = GetCellAttr(row, col); + wxGridCellRenderer* renderer = attr->GetRenderer(this, row, col); + attr->DecRef(); + + return renderer; +} + +wxGridCellEditor* wxGrid::GetCellEditor(int row, int col) +{ + wxGridCellAttr* attr = GetCellAttr(row, col); + wxGridCellEditor* editor = attr->GetEditor(this, row, col); + attr->DecRef(); + + return editor; +} + +bool wxGrid::IsReadOnly(int row, int col) const +{ + wxGridCellAttr* attr = GetCellAttr(row, col); + bool isReadOnly = attr->IsReadOnly(); + attr->DecRef(); + + return isReadOnly; +} + +// ---------------------------------------------------------------------------- +// attribute support: cache, automatic provider creation, ... +// ---------------------------------------------------------------------------- + +bool wxGrid::CanHaveAttributes() +{ + if ( !m_table ) + { + return false; + } + + return m_table->CanHaveAttributes(); +} + +void wxGrid::ClearAttrCache() +{ + if ( m_attrCache.row != -1 ) + { + wxSafeDecRef(m_attrCache.attr); + m_attrCache.attr = NULL; + m_attrCache.row = -1; + } +} + +void wxGrid::CacheAttr(int row, int col, wxGridCellAttr *attr) const +{ + if ( attr != NULL ) + { + wxGrid *self = (wxGrid *)this; // const_cast + + self->ClearAttrCache(); + self->m_attrCache.row = row; + self->m_attrCache.col = col; + self->m_attrCache.attr = attr; + wxSafeIncRef(attr); + } +} + +bool wxGrid::LookupAttr(int row, int col, wxGridCellAttr **attr) const +{ + if ( row == m_attrCache.row && col == m_attrCache.col ) + { + *attr = m_attrCache.attr; + wxSafeIncRef(m_attrCache.attr); + +#ifdef DEBUG_ATTR_CACHE + gs_nAttrCacheHits++; +#endif + + return true; + } + else + { +#ifdef DEBUG_ATTR_CACHE + gs_nAttrCacheMisses++; +#endif + + return false; + } +} + +wxGridCellAttr *wxGrid::GetCellAttr(int row, int col) const +{ + wxGridCellAttr *attr = NULL; + // Additional test to avoid looking at the cache e.g. for + // wxNoCellCoords, as this will confuse memory management. + if ( row >= 0 ) + { + if ( !LookupAttr(row, col, &attr) ) + { + attr = m_table ? m_table->GetAttr(row, col, wxGridCellAttr::Any) + : (wxGridCellAttr *)NULL; + CacheAttr(row, col, attr); + } + } + + if (attr) + { + attr->SetDefAttr(m_defaultCellAttr); + } + else + { + attr = m_defaultCellAttr; + attr->IncRef(); + } + + return attr; +} + +wxGridCellAttr *wxGrid::GetOrCreateCellAttr(int row, int col) const +{ + wxGridCellAttr *attr = (wxGridCellAttr *)NULL; + bool canHave = ((wxGrid*)this)->CanHaveAttributes(); + + wxCHECK_MSG( canHave, attr, _T("Cell attributes not allowed")); + wxCHECK_MSG( m_table, attr, _T("must have a table") ); + + attr = m_table->GetAttr(row, col, wxGridCellAttr::Cell); + if ( !attr ) + { + attr = new wxGridCellAttr(m_defaultCellAttr); + + // artificially inc the ref count to match DecRef() in caller + attr->IncRef(); + m_table->SetAttr(attr, row, col); + } + + return attr; +} + +// ---------------------------------------------------------------------------- +// setting column attributes (wrappers around SetColAttr) +// ---------------------------------------------------------------------------- + +void wxGrid::SetColFormatBool(int col) +{ + SetColFormatCustom(col, wxGRID_VALUE_BOOL); +} + +void wxGrid::SetColFormatNumber(int col) +{ + SetColFormatCustom(col, wxGRID_VALUE_NUMBER); +} + +void wxGrid::SetColFormatFloat(int col, int width, int precision) +{ + wxString typeName = wxGRID_VALUE_FLOAT; + if ( (width != -1) || (precision != -1) ) + { + typeName << _T(':') << width << _T(',') << precision; + } + + SetColFormatCustom(col, typeName); +} + +void wxGrid::SetColFormatCustom(int col, const wxString& typeName) +{ + wxGridCellAttr *attr = m_table->GetAttr(-1, col, wxGridCellAttr::Col ); + if (!attr) + attr = new wxGridCellAttr; + wxGridCellRenderer *renderer = GetDefaultRendererForType(typeName); + attr->SetRenderer(renderer); + + SetColAttr(col, attr); + +} + +// ---------------------------------------------------------------------------- +// setting cell attributes: this is forwarded to the table +// ---------------------------------------------------------------------------- + +void wxGrid::SetAttr(int row, int col, wxGridCellAttr *attr) +{ + if ( CanHaveAttributes() ) + { + m_table->SetAttr(attr, row, col); + ClearAttrCache(); + } + else + { + wxSafeDecRef(attr); + } +} + +void wxGrid::SetRowAttr(int row, wxGridCellAttr *attr) +{ + if ( CanHaveAttributes() ) + { + m_table->SetRowAttr(attr, row); + ClearAttrCache(); + } + else + { + wxSafeDecRef(attr); + } +} + +void wxGrid::SetColAttr(int col, wxGridCellAttr *attr) +{ + if ( CanHaveAttributes() ) + { + m_table->SetColAttr(attr, col); + ClearAttrCache(); + } + else + { + wxSafeDecRef(attr); + } +} + +void wxGrid::SetCellBackgroundColour( int row, int col, const wxColour& colour ) +{ + if ( CanHaveAttributes() ) + { + wxGridCellAttr *attr = GetOrCreateCellAttr(row, col); + attr->SetBackgroundColour(colour); + attr->DecRef(); + } +} + +void wxGrid::SetCellTextColour( int row, int col, const wxColour& colour ) +{ + if ( CanHaveAttributes() ) + { + wxGridCellAttr *attr = GetOrCreateCellAttr(row, col); + attr->SetTextColour(colour); + attr->DecRef(); + } +} + +void wxGrid::SetCellFont( int row, int col, const wxFont& font ) +{ + if ( CanHaveAttributes() ) + { + wxGridCellAttr *attr = GetOrCreateCellAttr(row, col); + attr->SetFont(font); + attr->DecRef(); + } +} + +void wxGrid::SetCellAlignment( int row, int col, int horiz, int vert ) +{ + if ( CanHaveAttributes() ) + { + wxGridCellAttr *attr = GetOrCreateCellAttr(row, col); + attr->SetAlignment(horiz, vert); + attr->DecRef(); + } +} + +void wxGrid::SetCellOverflow( int row, int col, bool allow ) +{ + if ( CanHaveAttributes() ) + { + wxGridCellAttr *attr = GetOrCreateCellAttr(row, col); + attr->SetOverflow(allow); + attr->DecRef(); + } +} + +void wxGrid::SetCellSize( int row, int col, int num_rows, int num_cols ) +{ + if ( CanHaveAttributes() ) + { + int cell_rows, cell_cols; + + wxGridCellAttr *attr = GetOrCreateCellAttr(row, col); + attr->GetSize(&cell_rows, &cell_cols); + attr->SetSize(num_rows, num_cols); + attr->DecRef(); + + // Cannot set the size of a cell to 0 or negative values + // While it is perfectly legal to do that, this function cannot + // handle all the possibilies, do it by hand by getting the CellAttr. + // You can only set the size of a cell to 1,1 or greater with this fn + wxASSERT_MSG( !((cell_rows < 1) || (cell_cols < 1)), + wxT("wxGrid::SetCellSize setting cell size that is already part of another cell")); + wxASSERT_MSG( !((num_rows < 1) || (num_cols < 1)), + wxT("wxGrid::SetCellSize setting cell size to < 1")); + + // if this was already a multicell then "turn off" the other cells first + if ((cell_rows > 1) || (cell_rows > 1)) + { + int i, j; + for (j=row; j < row + cell_rows; j++) + { + for (i=col; i < col + cell_cols; i++) + { + if ((i != col) || (j != row)) + { + wxGridCellAttr *attr_stub = GetOrCreateCellAttr(j, i); + attr_stub->SetSize( 1, 1 ); + attr_stub->DecRef(); + } + } + } + } + + // mark the cells that will be covered by this cell to + // negative or zero values to point back at this cell + if (((num_rows > 1) || (num_cols > 1)) && (num_rows >= 1) && (num_cols >= 1)) + { + int i, j; + for (j=row; j < row + num_rows; j++) + { + for (i=col; i < col + num_cols; i++) + { + if ((i != col) || (j != row)) + { + wxGridCellAttr *attr_stub = GetOrCreateCellAttr(j, i); + attr_stub->SetSize( row - j, col - i ); + attr_stub->DecRef(); + } + } + } + } + } +} + +void wxGrid::SetCellRenderer(int row, int col, wxGridCellRenderer *renderer) +{ + if ( CanHaveAttributes() ) + { + wxGridCellAttr *attr = GetOrCreateCellAttr(row, col); + attr->SetRenderer(renderer); + attr->DecRef(); + } +} + +void wxGrid::SetCellEditor(int row, int col, wxGridCellEditor* editor) +{ + if ( CanHaveAttributes() ) + { + wxGridCellAttr *attr = GetOrCreateCellAttr(row, col); + attr->SetEditor(editor); + attr->DecRef(); + } +} + +void wxGrid::SetReadOnly(int row, int col, bool isReadOnly) +{ + if ( CanHaveAttributes() ) + { + wxGridCellAttr *attr = GetOrCreateCellAttr(row, col); + attr->SetReadOnly(isReadOnly); + attr->DecRef(); + } +} + +// ---------------------------------------------------------------------------- +// Data type registration +// ---------------------------------------------------------------------------- + +void wxGrid::RegisterDataType(const wxString& typeName, + wxGridCellRenderer* renderer, + wxGridCellEditor* editor) +{ + m_typeRegistry->RegisterDataType(typeName, renderer, editor); +} + + +wxGridCellEditor * wxGrid::GetDefaultEditorForCell(int row, int col) const +{ + wxString typeName = m_table->GetTypeName(row, col); + return GetDefaultEditorForType(typeName); +} + +wxGridCellRenderer * wxGrid::GetDefaultRendererForCell(int row, int col) const +{ + wxString typeName = m_table->GetTypeName(row, col); + return GetDefaultRendererForType(typeName); +} + +wxGridCellEditor * wxGrid::GetDefaultEditorForType(const wxString& typeName) const +{ + int index = m_typeRegistry->FindOrCloneDataType(typeName); + if ( index == wxNOT_FOUND ) + { + wxString errStr; + + errStr.Printf(wxT("Unknown data type name [%s]"), typeName.c_str()); + wxFAIL_MSG(errStr.c_str()); + + return NULL; + } + + return m_typeRegistry->GetEditor(index); +} + +wxGridCellRenderer * wxGrid::GetDefaultRendererForType(const wxString& typeName) const +{ + int index = m_typeRegistry->FindOrCloneDataType(typeName); + if ( index == wxNOT_FOUND ) + { + wxString errStr; + + errStr.Printf(wxT("Unknown data type name [%s]"), typeName.c_str()); + wxFAIL_MSG(errStr.c_str()); + + return NULL; + } + + return m_typeRegistry->GetRenderer(index); +} + +// ---------------------------------------------------------------------------- +// row/col size +// ---------------------------------------------------------------------------- + +void wxGrid::EnableDragRowSize( bool enable ) +{ + m_canDragRowSize = enable; +} + +void wxGrid::EnableDragColSize( bool enable ) +{ + m_canDragColSize = enable; +} + +void wxGrid::EnableDragGridSize( bool enable ) +{ + m_canDragGridSize = enable; +} + +void wxGrid::EnableDragCell( bool enable ) +{ + m_canDragCell = enable; +} + +void wxGrid::SetDefaultRowSize( int height, bool resizeExistingRows ) +{ + m_defaultRowHeight = wxMax( height, m_minAcceptableRowHeight ); + + if ( resizeExistingRows ) + { + // since we are resizing all rows to the default row size, + // we can simply clear the row heights and row bottoms + // arrays (which also allows us to take advantage of + // some speed optimisations) + m_rowHeights.Empty(); + m_rowBottoms.Empty(); + if ( !GetBatchCount() ) + CalcDimensions(); + } +} + +void wxGrid::SetRowSize( int row, int height ) +{ + wxCHECK_RET( row >= 0 && row < m_numRows, _T("invalid row index") ); + + // See comment in SetColSize + if ( height < GetRowMinimalAcceptableHeight()) + return; + + if ( m_rowHeights.IsEmpty() ) + { + // need to really create the array + InitRowHeights(); + } + + int h = wxMax( 0, height ); + int diff = h - m_rowHeights[row]; + + m_rowHeights[row] = h; + for ( int i = row; i < m_numRows; i++ ) + { + m_rowBottoms[i] += diff; + } + + if ( !GetBatchCount() ) + CalcDimensions(); +} + +void wxGrid::SetDefaultColSize( int width, bool resizeExistingCols ) +{ + m_defaultColWidth = wxMax( width, m_minAcceptableColWidth ); + + if ( resizeExistingCols ) + { + // since we are resizing all columns to the default column size, + // we can simply clear the col widths and col rights + // arrays (which also allows us to take advantage of + // some speed optimisations) + m_colWidths.Empty(); + m_colRights.Empty(); + if ( !GetBatchCount() ) + CalcDimensions(); + } +} + +void wxGrid::SetColSize( int col, int width ) +{ + wxCHECK_RET( col >= 0 && col < m_numCols, _T("invalid column index") ); + + // should we check that it's bigger than GetColMinimalWidth(col) here? + // (VZ) + // No, because it is reasonable to assume the library user know's + // what he is doing. However we should test against the weaker + // constraint of minimalAcceptableWidth, as this breaks rendering + // + // This test then fixes sf.net bug #645734 + + if ( width < GetColMinimalAcceptableWidth() ) + return; + + if ( m_colWidths.IsEmpty() ) + { + // need to really create the array + InitColWidths(); + } + + // if < 0 then calculate new width from label + if ( width < 0 ) + { + long w, h; + wxArrayString lines; + wxClientDC dc(m_colLabelWin); + dc.SetFont(GetLabelFont()); + StringToLines(GetColLabelValue(col), lines); + GetTextBoxSize(dc, lines, &w, &h); + width = w + 6; + } + + int w = wxMax( 0, width ); + int diff = w - m_colWidths[col]; + m_colWidths[col] = w; + + for ( int colPos = GetColPos(col); colPos < m_numCols; colPos++ ) + { + m_colRights[GetColAt(colPos)] += diff; + } + + if ( !GetBatchCount() ) + CalcDimensions(); +} + +void wxGrid::SetColMinimalWidth( int col, int width ) +{ + if (width > GetColMinimalAcceptableWidth()) + { + wxLongToLongHashMap::key_type key = (wxLongToLongHashMap::key_type)col; + m_colMinWidths[key] = width; + } +} + +void wxGrid::SetRowMinimalHeight( int row, int width ) +{ + if (width > GetRowMinimalAcceptableHeight()) + { + wxLongToLongHashMap::key_type key = (wxLongToLongHashMap::key_type)row; + m_rowMinHeights[key] = width; + } +} + +int wxGrid::GetColMinimalWidth(int col) const +{ + wxLongToLongHashMap::key_type key = (wxLongToLongHashMap::key_type)col; + wxLongToLongHashMap::const_iterator it = m_colMinWidths.find(key); + + return it != m_colMinWidths.end() ? (int)it->second : m_minAcceptableColWidth; +} + +int wxGrid::GetRowMinimalHeight(int row) const +{ + wxLongToLongHashMap::key_type key = (wxLongToLongHashMap::key_type)row; + wxLongToLongHashMap::const_iterator it = m_rowMinHeights.find(key); + + return it != m_rowMinHeights.end() ? (int)it->second : m_minAcceptableRowHeight; +} + +void wxGrid::SetColMinimalAcceptableWidth( int width ) +{ + // We do allow a width of 0 since this gives us + // an easy way to temporarily hiding columns. + if ( width >= 0 ) + m_minAcceptableColWidth = width; +} + +void wxGrid::SetRowMinimalAcceptableHeight( int height ) +{ + // We do allow a height of 0 since this gives us + // an easy way to temporarily hiding rows. + if ( height >= 0 ) + m_minAcceptableRowHeight = height; +} + +int wxGrid::GetColMinimalAcceptableWidth() const +{ + return m_minAcceptableColWidth; +} + +int wxGrid::GetRowMinimalAcceptableHeight() const +{ + return m_minAcceptableRowHeight; +} + +// ---------------------------------------------------------------------------- +// auto sizing +// ---------------------------------------------------------------------------- + +void wxGrid::AutoSizeColOrRow( int colOrRow, bool setAsMin, bool column ) +{ + wxClientDC dc(m_gridWin); + + // cancel editing of cell + HideCellEditControl(); + SaveEditControlValue(); + + // init both of them to avoid compiler warnings, even if we only need one + int row = -1, + col = -1; + if ( column ) + col = colOrRow; + else + row = colOrRow; + + wxCoord extent, extentMax = 0; + int max = column ? m_numRows : m_numCols; + for ( int rowOrCol = 0; rowOrCol < max; rowOrCol++ ) + { + if ( column ) + row = rowOrCol; + else + col = rowOrCol; + + wxGridCellAttr *attr = GetCellAttr(row, col); + wxGridCellRenderer *renderer = attr->GetRenderer(this, row, col); + if ( renderer ) + { + wxSize size = renderer->GetBestSize(*this, *attr, dc, row, col); + extent = column ? size.x : size.y; + if ( extent > extentMax ) + extentMax = extent; + + renderer->DecRef(); + } + + attr->DecRef(); + } + + // now also compare with the column label extent + wxCoord w, h; + dc.SetFont( GetLabelFont() ); + + if ( column ) + { + dc.GetMultiLineTextExtent( GetColLabelValue(col), &w, &h ); + if ( GetColLabelTextOrientation() == wxVERTICAL ) + w = h; + } + else + dc.GetMultiLineTextExtent( GetRowLabelValue(row), &w, &h ); + + extent = column ? w : h; + if ( extent > extentMax ) + extentMax = extent; + + if ( !extentMax ) + { + // empty column - give default extent (notice that if extentMax is less + // than default extent but != 0, it's OK) + extentMax = column ? m_defaultColWidth : m_defaultRowHeight; + } + else + { + if ( column ) + // leave some space around text + extentMax += 10; + else + extentMax += 6; + } + + if ( column ) + { + SetColSize( col, extentMax ); + if ( !GetBatchCount() ) + { + int cw, ch, dummy; + m_gridWin->GetClientSize( &cw, &ch ); + wxRect rect ( CellToRect( 0, col ) ); + rect.y = 0; + CalcScrolledPosition(rect.x, 0, &rect.x, &dummy); + rect.width = cw - rect.x; + rect.height = m_colLabelHeight; + m_colLabelWin->Refresh( true, &rect ); + } + } + else + { + SetRowSize(row, extentMax); + if ( !GetBatchCount() ) + { + int cw, ch, dummy; + m_gridWin->GetClientSize( &cw, &ch ); + wxRect rect( CellToRect( row, 0 ) ); + rect.x = 0; + CalcScrolledPosition(0, rect.y, &dummy, &rect.y); + rect.width = m_rowLabelWidth; + rect.height = ch - rect.y; + m_rowLabelWin->Refresh( true, &rect ); + } + } + + if ( setAsMin ) + { + if ( column ) + SetColMinimalWidth(col, extentMax); + else + SetRowMinimalHeight(row, extentMax); + } +} + +int wxGrid::SetOrCalcColumnSizes(bool calcOnly, bool setAsMin) +{ + int width = m_rowLabelWidth; + + if ( !calcOnly ) + BeginBatch(); + + for ( int col = 0; col < m_numCols; col++ ) + { + if ( !calcOnly ) + AutoSizeColumn(col, setAsMin); + + width += GetColWidth(col); + } + + if ( !calcOnly ) + EndBatch(); + + return width; +} + +int wxGrid::SetOrCalcRowSizes(bool calcOnly, bool setAsMin) +{ + int height = m_colLabelHeight; + + if ( !calcOnly ) + BeginBatch(); + + for ( int row = 0; row < m_numRows; row++ ) + { + if ( !calcOnly ) + AutoSizeRow(row, setAsMin); + + height += GetRowHeight(row); + } + + if ( !calcOnly ) + EndBatch(); + + return height; +} + +void wxGrid::AutoSize() +{ + BeginBatch(); + + // we need to round up the size of the scrollable area to a multiple of + // scroll step to ensure that we don't get the scrollbars when we're sized + // exactly to fit our contents + wxSize size(SetOrCalcColumnSizes(false) - m_rowLabelWidth + m_extraWidth, + SetOrCalcRowSizes(false) - m_colLabelHeight + m_extraHeight); + wxSize sizeFit(GetScrollX(size.x) * GetScrollLineX(), + GetScrollY(size.y) * GetScrollLineY()); + + // distribute the extra space between the columns/rows to avoid having + // extra white space + wxCoord diff = sizeFit.x - size.x; + if ( diff && m_numCols ) + { + // try to resize the columns uniformly + wxCoord diffPerCol = diff / m_numCols; + if ( diffPerCol ) + { + for ( int col = 0; col < m_numCols; col++ ) + { + SetColSize(col, GetColWidth(col) + diffPerCol); + } + } + + // add remaining amount to the last columns + diff -= diffPerCol * m_numCols; + if ( diff ) + { + for ( int col = m_numCols - 1; col >= m_numCols - diff; col-- ) + { + SetColSize(col, GetColWidth(col) + 1); + } + } + } + + // same for rows + diff = sizeFit.y - size.y; + if ( diff && m_numRows ) + { + // try to resize the columns uniformly + wxCoord diffPerRow = diff / m_numRows; + if ( diffPerRow ) + { + for ( int row = 0; row < m_numRows; row++ ) + { + SetRowSize(row, GetRowHeight(row) + diffPerRow); + } + } + + // add remaining amount to the last rows + diff -= diffPerRow * m_numRows; + if ( diff ) + { + for ( int row = m_numRows - 1; row >= m_numRows - diff; row-- ) + { + SetRowSize(row, GetRowHeight(row) + 1); + } + } + } + + // we know that we're not going to have scrollbars so disable them now to + // avoid trouble in SetClientSize() which can otherwise set the correct + // client size but also leave space for (not needed any more) scrollbars + SetScrollbars(0, 0, 0, 0, 0, 0, true); + SetClientSize(sizeFit.x + m_rowLabelWidth, sizeFit.y + m_colLabelHeight); + + EndBatch(); +} + +void wxGrid::AutoSizeRowLabelSize( int row ) +{ + wxArrayString lines; + long w, h; + + // Hide the edit control, so it + // won't interfere with drag-shrinking. + if ( IsCellEditControlShown() ) + { + HideCellEditControl(); + SaveEditControlValue(); + } + + // autosize row height depending on label text + StringToLines( GetRowLabelValue( row ), lines ); + wxClientDC dc( m_rowLabelWin ); + GetTextBoxSize( dc, lines, &w, &h ); + if ( h < m_defaultRowHeight ) + h = m_defaultRowHeight; + SetRowSize(row, h); + ForceRefresh(); +} + +void wxGrid::AutoSizeColLabelSize( int col ) +{ + wxArrayString lines; + long w, h; + + // Hide the edit control, so it + // won't interfere with drag-shrinking. + if ( IsCellEditControlShown() ) + { + HideCellEditControl(); + SaveEditControlValue(); + } + + // autosize column width depending on label text + StringToLines( GetColLabelValue( col ), lines ); + wxClientDC dc( m_colLabelWin ); + if ( GetColLabelTextOrientation() == wxHORIZONTAL ) + GetTextBoxSize( dc, lines, &w, &h ); + else + GetTextBoxSize( dc, lines, &h, &w ); + if ( w < m_defaultColWidth ) + w = m_defaultColWidth; + SetColSize(col, w); + ForceRefresh(); +} + +wxSize wxGrid::DoGetBestSize() const +{ + wxGrid *self = (wxGrid *)this; // const_cast + + // we do the same as in AutoSize() here with the exception that we don't + // change the column/row sizes, only calculate them + wxSize size(self->SetOrCalcColumnSizes(true) - m_rowLabelWidth + m_extraWidth, + self->SetOrCalcRowSizes(true) - m_colLabelHeight + m_extraHeight); + wxSize sizeFit(GetScrollX(size.x) * GetScrollLineX(), + GetScrollY(size.y) * GetScrollLineY()); + + // NOTE: This size should be cached, but first we need to add calls to + // InvalidateBestSize everywhere that could change the results of this + // calculation. + // CacheBestSize(size); + + return wxSize(sizeFit.x + m_rowLabelWidth, sizeFit.y + m_colLabelHeight) + + GetWindowBorderSize(); +} + +void wxGrid::Fit() +{ + AutoSize(); +} + +wxPen& wxGrid::GetDividerPen() const +{ + return wxNullPen; +} + +// ---------------------------------------------------------------------------- +// cell value accessor functions +// ---------------------------------------------------------------------------- + +void wxGrid::SetCellValue( int row, int col, const wxString& s ) +{ + if ( m_table ) + { + m_table->SetValue( row, col, s ); + if ( !GetBatchCount() ) + { + int dummy; + wxRect rect( CellToRect( row, col ) ); + rect.x = 0; + rect.width = m_gridWin->GetClientSize().GetWidth(); + CalcScrolledPosition(0, rect.y, &dummy, &rect.y); + m_gridWin->Refresh( false, &rect ); + } + + if ( m_currentCellCoords.GetRow() == row && + m_currentCellCoords.GetCol() == col && + IsCellEditControlShown()) + // Note: If we are using IsCellEditControlEnabled, + // this interacts badly with calling SetCellValue from + // an EVT_GRID_CELL_CHANGE handler. + { + HideCellEditControl(); + ShowCellEditControl(); // will reread data from table + } + } +} + +// ---------------------------------------------------------------------------- +// block, row and column selection +// ---------------------------------------------------------------------------- + +void wxGrid::SelectRow( int row, bool addToSelected ) +{ + if ( IsSelection() && !addToSelected ) + ClearSelection(); + + if ( m_selection ) + m_selection->SelectRow( row, false, addToSelected ); +} + +void wxGrid::SelectCol( int col, bool addToSelected ) +{ + if ( IsSelection() && !addToSelected ) + ClearSelection(); + + if ( m_selection ) + m_selection->SelectCol( col, false, addToSelected ); +} + +void wxGrid::SelectBlock( int topRow, int leftCol, int bottomRow, int rightCol, + bool addToSelected ) +{ + if ( IsSelection() && !addToSelected ) + ClearSelection(); + + if ( m_selection ) + m_selection->SelectBlock( topRow, leftCol, bottomRow, rightCol, + false, addToSelected ); +} + +void wxGrid::SelectAll() +{ + if ( m_numRows > 0 && m_numCols > 0 ) + { + if ( m_selection ) + m_selection->SelectBlock( 0, 0, m_numRows - 1, m_numCols - 1 ); + } +} + +// ---------------------------------------------------------------------------- +// cell, row and col deselection +// ---------------------------------------------------------------------------- + +void wxGrid::DeselectRow( int row ) +{ + if ( !m_selection ) + return; + + if ( m_selection->GetSelectionMode() == wxGrid::wxGridSelectRows ) + { + if ( m_selection->IsInSelection(row, 0 ) ) + m_selection->ToggleCellSelection(row, 0); + } + else + { + int nCols = GetNumberCols(); + for ( int i = 0; i < nCols; i++ ) + { + if ( m_selection->IsInSelection(row, i ) ) + m_selection->ToggleCellSelection(row, i); + } + } +} + +void wxGrid::DeselectCol( int col ) +{ + if ( !m_selection ) + return; + + if ( m_selection->GetSelectionMode() == wxGrid::wxGridSelectColumns ) + { + if ( m_selection->IsInSelection(0, col ) ) + m_selection->ToggleCellSelection(0, col); + } + else + { + int nRows = GetNumberRows(); + for ( int i = 0; i < nRows; i++ ) + { + if ( m_selection->IsInSelection(i, col ) ) + m_selection->ToggleCellSelection(i, col); + } + } +} + +void wxGrid::DeselectCell( int row, int col ) +{ + if ( m_selection && m_selection->IsInSelection(row, col) ) + m_selection->ToggleCellSelection(row, col); +} + +bool wxGrid::IsSelection() +{ + return ( m_selection && (m_selection->IsSelection() || + ( m_selectingTopLeft != wxGridNoCellCoords && + m_selectingBottomRight != wxGridNoCellCoords) ) ); +} + +bool wxGrid::IsInSelection( int row, int col ) const +{ + return ( m_selection && (m_selection->IsInSelection( row, col ) || + ( row >= m_selectingTopLeft.GetRow() && + col >= m_selectingTopLeft.GetCol() && + row <= m_selectingBottomRight.GetRow() && + col <= m_selectingBottomRight.GetCol() )) ); +} + +wxGridCellCoordsArray wxGrid::GetSelectedCells() const +{ + if (!m_selection) + { + wxGridCellCoordsArray a; + return a; + } + + return m_selection->m_cellSelection; +} + +wxGridCellCoordsArray wxGrid::GetSelectionBlockTopLeft() const +{ + if (!m_selection) + { + wxGridCellCoordsArray a; + return a; + } + + return m_selection->m_blockSelectionTopLeft; +} + +wxGridCellCoordsArray wxGrid::GetSelectionBlockBottomRight() const +{ + if (!m_selection) + { + wxGridCellCoordsArray a; + return a; + } + + return m_selection->m_blockSelectionBottomRight; +} + +wxArrayInt wxGrid::GetSelectedRows() const +{ + if (!m_selection) + { + wxArrayInt a; + return a; + } + + return m_selection->m_rowSelection; +} + +wxArrayInt wxGrid::GetSelectedCols() const +{ + if (!m_selection) + { + wxArrayInt a; + return a; + } + + return m_selection->m_colSelection; +} + +void wxGrid::ClearSelection() +{ + m_selectingTopLeft = + m_selectingBottomRight = + m_selectingKeyboard = wxGridNoCellCoords; + if ( m_selection ) + m_selection->ClearSelection(); +} + +// This function returns the rectangle that encloses the given block +// in device coords clipped to the client size of the grid window. +// +wxRect wxGrid::BlockToDeviceRect( const wxGridCellCoords &topLeft, + const wxGridCellCoords &bottomRight ) +{ + wxRect rect( wxGridNoCellRect ); + wxRect cellRect; + + cellRect = CellToRect( topLeft ); + if ( cellRect != wxGridNoCellRect ) + { + rect = cellRect; + } + else + { + rect = wxRect(0, 0, 0, 0); + } + + cellRect = CellToRect( bottomRight ); + if ( cellRect != wxGridNoCellRect ) + { + rect += cellRect; + } + else + { + return wxGridNoCellRect; + } + + int i, j; + int left = rect.GetLeft(); + int top = rect.GetTop(); + int right = rect.GetRight(); + int bottom = rect.GetBottom(); + + int leftCol = topLeft.GetCol(); + int topRow = topLeft.GetRow(); + int rightCol = bottomRight.GetCol(); + int bottomRow = bottomRight.GetRow(); + + if (left > right) + { + i = left; + left = right; + right = i; + i = leftCol; + leftCol = rightCol; + rightCol = i; + } + + if (top > bottom) + { + i = top; + top = bottom; + bottom = i; + i = topRow; + topRow = bottomRow; + bottomRow = i; + } + + for ( j = topRow; j <= bottomRow; j++ ) + { + for ( i = leftCol; i <= rightCol; i++ ) + { + if ((j == topRow) || (j == bottomRow) || (i == leftCol) || (i == rightCol)) + { + cellRect = CellToRect( j, i ); + + if (cellRect.x < left) + left = cellRect.x; + if (cellRect.y < top) + top = cellRect.y; + if (cellRect.x + cellRect.width > right) + right = cellRect.x + cellRect.width; + if (cellRect.y + cellRect.height > bottom) + bottom = cellRect.y + cellRect.height; + } + else + { + i = rightCol; // jump over inner cells. + } + } + } + + // convert to scrolled coords + // + CalcScrolledPosition( left, top, &left, &top ); + CalcScrolledPosition( right, bottom, &right, &bottom ); + + int cw, ch; + m_gridWin->GetClientSize( &cw, &ch ); + + if (right < 0 || bottom < 0 || left > cw || top > ch) + return wxRect(0,0,0,0); + + rect.SetLeft( wxMax(0, left) ); + rect.SetTop( wxMax(0, top) ); + rect.SetRight( wxMin(cw, right) ); + rect.SetBottom( wxMin(ch, bottom) ); + + return rect; +} + +// ---------------------------------------------------------------------------- +// grid event classes +// ---------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS( wxGridEvent, wxNotifyEvent ) + +wxGridEvent::wxGridEvent( int id, wxEventType type, wxObject* obj, + int row, int col, int x, int y, bool sel, + bool control, bool shift, bool alt, bool meta ) + : wxNotifyEvent( type, id ) +{ + m_row = row; + m_col = col; + m_x = x; + m_y = y; + m_selecting = sel; + m_control = control; + m_shift = shift; + m_alt = alt; + m_meta = meta; + + SetEventObject(obj); +} + + +IMPLEMENT_DYNAMIC_CLASS( wxGridSizeEvent, wxNotifyEvent ) + +wxGridSizeEvent::wxGridSizeEvent( int id, wxEventType type, wxObject* obj, + int rowOrCol, int x, int y, + bool control, bool shift, bool alt, bool meta ) + : wxNotifyEvent( type, id ) +{ + m_rowOrCol = rowOrCol; + m_x = x; + m_y = y; + m_control = control; + m_shift = shift; + m_alt = alt; + m_meta = meta; + + SetEventObject(obj); +} + + +IMPLEMENT_DYNAMIC_CLASS( wxGridRangeSelectEvent, wxNotifyEvent ) + +wxGridRangeSelectEvent::wxGridRangeSelectEvent(int id, wxEventType type, wxObject* obj, + const wxGridCellCoords& topLeft, + const wxGridCellCoords& bottomRight, + bool sel, bool control, + bool shift, bool alt, bool meta ) + : wxNotifyEvent( type, id ) +{ + m_topLeft = topLeft; + m_bottomRight = bottomRight; + m_selecting = sel; + m_control = control; + m_shift = shift; + m_alt = alt; + m_meta = meta; + + SetEventObject(obj); +} + + +IMPLEMENT_DYNAMIC_CLASS(wxGridEditorCreatedEvent, wxCommandEvent) + +wxGridEditorCreatedEvent::wxGridEditorCreatedEvent(int id, wxEventType type, + wxObject* obj, int row, + int col, wxControl* ctrl) + : wxCommandEvent(type, id) +{ + SetEventObject(obj); + m_row = row; + m_col = col; + m_ctrl = ctrl; +} + +#endif // wxUSE_GRID diff --git a/Externals/wxWidgets/src/generic/gridctrl.cpp b/Externals/wxWidgets/src/generic/gridctrl.cpp new file mode 100644 index 0000000000..e847fb9673 --- /dev/null +++ b/Externals/wxWidgets/src/generic/gridctrl.cpp @@ -0,0 +1,405 @@ +/////////////////////////////////////////////////////////////////////////// +// Name: generic/gridctrl.cpp +// Purpose: wxGrid controls +// Author: Paul Gammans, Roger Gammans +// Modified by: +// Created: 11/04/2001 +// RCS-ID: $Id: gridctrl.cpp 41587 2006-10-03 14:28:36Z PC $ +// Copyright: (c) The Computer Surgery (paul@compsurg.co.uk) +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_GRID + +#include "wx/generic/gridctrl.h" + +#ifndef WX_PRECOMP + #include "wx/textctrl.h" + #include "wx/dc.h" + #include "wx/combobox.h" +#endif // WX_PRECOMP + +#include "wx/tokenzr.h" + +// ---------------------------------------------------------------------------- +// wxGridCellDateTimeRenderer +// ---------------------------------------------------------------------------- + +#if wxUSE_DATETIME + +// Enables a grid cell to display a formatted date and or time + +wxGridCellDateTimeRenderer::wxGridCellDateTimeRenderer(const wxString& outformat, const wxString& informat) +{ + m_iformat = informat; + m_oformat = outformat; + m_tz = wxDateTime::Local; + m_dateDef = wxDefaultDateTime; +} + +wxGridCellRenderer *wxGridCellDateTimeRenderer::Clone() const +{ + wxGridCellDateTimeRenderer *renderer = new wxGridCellDateTimeRenderer; + renderer->m_iformat = m_iformat; + renderer->m_oformat = m_oformat; + renderer->m_dateDef = m_dateDef; + renderer->m_tz = m_tz; + + return renderer; +} + +wxString wxGridCellDateTimeRenderer::GetString(const wxGrid& grid, int row, int col) +{ + wxGridTableBase *table = grid.GetTable(); + + bool hasDatetime = false; + wxDateTime val; + wxString text; + if ( table->CanGetValueAs(row, col, wxGRID_VALUE_DATETIME) ) + { + void * tempval = table->GetValueAsCustom(row, col,wxGRID_VALUE_DATETIME); + + if (tempval){ + val = *((wxDateTime *)tempval); + hasDatetime = true; + delete (wxDateTime *)tempval; + } + + } + + if (!hasDatetime ) + { + text = table->GetValue(row, col); + hasDatetime = (val.ParseFormat( text, m_iformat, m_dateDef ) != (wxChar *)NULL) ; + } + + if ( hasDatetime ) + text = val.Format(m_oformat, m_tz ); + + //If we faild to parse string just show what we where given? + return text; +} + +void wxGridCellDateTimeRenderer::Draw(wxGrid& grid, + wxGridCellAttr& attr, + wxDC& dc, + const wxRect& rectCell, + int row, int col, + bool isSelected) +{ + wxGridCellRenderer::Draw(grid, attr, dc, rectCell, row, col, isSelected); + + SetTextColoursAndFont(grid, attr, dc, isSelected); + + // draw the text right aligned by default + int hAlign, vAlign; + attr.GetAlignment(&hAlign, &vAlign); + hAlign = wxRIGHT; + + wxRect rect = rectCell; + rect.Inflate(-1); + + grid.DrawTextRectangle(dc, GetString(grid, row, col), rect, hAlign, vAlign); +} + +wxSize wxGridCellDateTimeRenderer::GetBestSize(wxGrid& grid, + wxGridCellAttr& attr, + wxDC& dc, + int row, int col) +{ + return DoGetBestSize(attr, dc, GetString(grid, row, col)); +} + +void wxGridCellDateTimeRenderer::SetParameters(const wxString& params) +{ + if (!params.empty()) + m_oformat=params; +} + +#endif // wxUSE_DATETIME + +// ---------------------------------------------------------------------------- +// wxGridCellChoiceNumberRenderer +// ---------------------------------------------------------------------------- +// Renders a number as a textual equivalent. +// eg data in cell is 0,1,2 ... n the cell could be rendered as "John","Fred"..."Bob" + + +wxGridCellEnumRenderer::wxGridCellEnumRenderer(const wxString& choices) +{ + if (!choices.empty()) + SetParameters(choices); +} + +wxGridCellRenderer *wxGridCellEnumRenderer::Clone() const +{ + wxGridCellEnumRenderer *renderer = new wxGridCellEnumRenderer; + renderer->m_choices = m_choices; + return renderer; +} + +wxString wxGridCellEnumRenderer::GetString(const wxGrid& grid, int row, int col) +{ + wxGridTableBase *table = grid.GetTable(); + wxString text; + if ( table->CanGetValueAs(row, col, wxGRID_VALUE_NUMBER) ) + { + int choiceno = table->GetValueAsLong(row, col); + text.Printf(_T("%s"), m_choices[ choiceno ].c_str() ); + } + else + { + text = table->GetValue(row, col); + } + + + //If we faild to parse string just show what we where given? + return text; +} + +void wxGridCellEnumRenderer::Draw(wxGrid& grid, + wxGridCellAttr& attr, + wxDC& dc, + const wxRect& rectCell, + int row, int col, + bool isSelected) +{ + wxGridCellRenderer::Draw(grid, attr, dc, rectCell, row, col, isSelected); + + SetTextColoursAndFont(grid, attr, dc, isSelected); + + // draw the text right aligned by default + int hAlign, vAlign; + attr.GetAlignment(&hAlign, &vAlign); + hAlign = wxRIGHT; + + wxRect rect = rectCell; + rect.Inflate(-1); + + grid.DrawTextRectangle(dc, GetString(grid, row, col), rect, hAlign, vAlign); +} + +wxSize wxGridCellEnumRenderer::GetBestSize(wxGrid& grid, + wxGridCellAttr& attr, + wxDC& dc, + int row, int col) +{ + return DoGetBestSize(attr, dc, GetString(grid, row, col)); +} + +void wxGridCellEnumRenderer::SetParameters(const wxString& params) +{ + if ( !params ) + { + // what can we do? + return; + } + + m_choices.Empty(); + + wxStringTokenizer tk(params, _T(',')); + while ( tk.HasMoreTokens() ) + { + m_choices.Add(tk.GetNextToken()); + } +} + +#if wxUSE_COMBOBOX + +// ---------------------------------------------------------------------------- +// wxGridCellEnumEditor +// ---------------------------------------------------------------------------- + +// A cell editor which displays an enum number as a textual equivalent. eg +// data in cell is 0,1,2 ... n the cell could be displayed as +// "John","Fred"..."Bob" in the combo choice box + +wxGridCellEnumEditor::wxGridCellEnumEditor(const wxString& choices) + :wxGridCellChoiceEditor() +{ + m_startint = -1; + + if (!choices.empty()) + SetParameters(choices); +} + +wxGridCellEditor *wxGridCellEnumEditor::Clone() const +{ + wxGridCellEnumEditor *editor = new wxGridCellEnumEditor(); + editor->m_startint = m_startint; + return editor; +} + +void wxGridCellEnumEditor::BeginEdit(int row, int col, wxGrid* grid) +{ + wxASSERT_MSG(m_control, + wxT("The wxGridCellEnumEditor must be Created first!")); + + wxGridTableBase *table = grid->GetTable(); + + if ( table->CanGetValueAs(row, col, wxGRID_VALUE_NUMBER) ) + { + m_startint = table->GetValueAsLong(row, col); + } + else + { + wxString startValue = table->GetValue(row, col); + if (startValue.IsNumber() && !startValue.empty()) + { + startValue.ToLong(&m_startint); + } + else + { + m_startint=-1; + } + } + + Combo()->SetSelection(m_startint); + Combo()->SetInsertionPointEnd(); + Combo()->SetFocus(); + +} + +bool wxGridCellEnumEditor::EndEdit(int row, int col, wxGrid* grid) +{ + int pos = Combo()->GetSelection(); + bool changed = (pos != m_startint); + if (changed) + { + if (grid->GetTable()->CanSetValueAs(row, col, wxGRID_VALUE_NUMBER)) + grid->GetTable()->SetValueAsLong(row, col, pos); + else + grid->GetTable()->SetValue(row, col,wxString::Format(wxT("%i"),pos)); + } + + return changed; +} + +#endif // wxUSE_COMBOBOX + +// ---------------------------------------------------------------------------- +// wxGridCellAutoWrapStringEditor +// ---------------------------------------------------------------------------- + +void +wxGridCellAutoWrapStringEditor::Create(wxWindow* parent, + wxWindowID id, + wxEvtHandler* evtHandler) +{ + m_control = new wxTextCtrl(parent, id, wxEmptyString, + wxDefaultPosition, wxDefaultSize, + wxTE_MULTILINE | wxTE_RICH); + + + wxGridCellEditor::Create(parent, id, evtHandler); +} + +void +wxGridCellAutoWrapStringRenderer::Draw(wxGrid& grid, + wxGridCellAttr& attr, + wxDC& dc, + const wxRect& rectCell, + int row, int col, + bool isSelected) { + + + wxGridCellRenderer::Draw(grid, attr, dc, rectCell, row, col, isSelected); + + // now we only have to draw the text + SetTextColoursAndFont(grid, attr, dc, isSelected); + + int horizAlign, vertAlign; + attr.GetAlignment(&horizAlign, &vertAlign); + + wxRect rect = rectCell; + rect.Inflate(-1); + + grid.DrawTextRectangle(dc, GetTextLines(grid,dc,attr,rect,row,col), + rect, horizAlign, vertAlign); +} + + +wxArrayString +wxGridCellAutoWrapStringRenderer::GetTextLines(wxGrid& grid, + wxDC& dc, + const wxGridCellAttr& attr, + const wxRect& rect, + int row, int col) +{ + wxString data = grid.GetCellValue(row, col); + + wxArrayString lines; + dc.SetFont(attr.GetFont()); + + //Taken from wxGrid again! + wxCoord x = 0, y = 0, curr_x = 0; + wxCoord max_x = rect.GetWidth(); + + dc.SetFont(attr.GetFont()); + wxStringTokenizer tk(data , _T(" \n\t\r")); + wxString thisline = wxEmptyString; + + while ( tk.HasMoreTokens() ) + { + wxString tok = tk.GetNextToken(); + //FIXME: this causes us to print an extra unnecesary + // space at the end of the line. But it + // is invisible , simplifies the size calculation + // and ensures tokens are separated in the display + tok += _T(" "); + + dc.GetTextExtent(tok, &x, &y); + if ( curr_x + x > max_x) + { + lines.Add( wxString(thisline) ); + thisline = tok; + curr_x=x; + } + else + { + thisline+= tok; + curr_x += x; + } + } + //Add last line + lines.Add( wxString(thisline) ); + + return lines; +} + + +wxSize +wxGridCellAutoWrapStringRenderer::GetBestSize(wxGrid& grid, + wxGridCellAttr& attr, + wxDC& dc, + int row, int col) +{ + wxCoord x,y, height , width = grid.GetColSize(col) -10; + int count = 250; //Limit iterations.. + + wxRect rect(0,0,width,10); + + // M is a nice large character 'y' gives descender!. + dc.GetTextExtent(wxT("My"), &x, &y); + + do + { + width+=10; + rect.SetWidth(width); + height = y * (wx_truncate_cast(wxCoord, GetTextLines(grid,dc,attr,rect,row,col).GetCount())); + count--; + // Search for a shape no taller than the golden ratio. + } while (count && (width < (height*1.68)) ); + + + return wxSize(width,height); +} + +#endif // wxUSE_GRID + diff --git a/Externals/wxWidgets/src/generic/gridsel.cpp b/Externals/wxWidgets/src/generic/gridsel.cpp new file mode 100644 index 0000000000..7385a0e5f3 --- /dev/null +++ b/Externals/wxWidgets/src/generic/gridsel.cpp @@ -0,0 +1,1177 @@ +/////////////////////////////////////////////////////////////////////////// +// Name: src/generic/gridsel.cpp +// Purpose: wxGridSelection +// Author: Stefan Neis +// Modified by: +// Created: 20/02/1999 +// RCS-ID: $Id: gridsel.cpp 38788 2006-04-18 08:11:26Z ABX $ +// Copyright: (c) Stefan Neis (Stefan.Neis@t-online.de) +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx/wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#if wxUSE_GRID + +#include "wx/generic/gridsel.h" + + +// Some explanation for the members of the class: +// m_cellSelection stores individual selected cells +// -- this is only used if m_selectionMode == wxGridSelectCells +// m_blockSelectionTopLeft and m_blockSelectionBottomRight +// store the upper left and lower right corner of selected Blocks +// m_rowSelection and m_colSelection store individual selected +// rows and columns; maybe those are superfluous and should be +// treated as blocks? + +wxGridSelection::wxGridSelection( wxGrid * grid, + wxGrid::wxGridSelectionModes sel ) +{ + m_grid = grid; + m_selectionMode = sel; +} + +bool wxGridSelection::IsSelection() +{ + return ( m_cellSelection.GetCount() || m_blockSelectionTopLeft.GetCount() || + m_rowSelection.GetCount() || m_colSelection.GetCount() ); +} + +bool wxGridSelection::IsInSelection( int row, int col ) +{ + size_t count; + + // First check whether the given cell is individually selected + // (if m_selectionMode is wxGridSelectCells). + if ( m_selectionMode == wxGrid::wxGridSelectCells ) + { + count = m_cellSelection.GetCount(); + for ( size_t n = 0; n < count; n++ ) + { + wxGridCellCoords& coords = m_cellSelection[n]; + if ( row == coords.GetRow() && col == coords.GetCol() ) + return true; + } + } + + // Now check whether the given cell is + // contained in one of the selected blocks. + count = m_blockSelectionTopLeft.GetCount(); + for ( size_t n = 0; n < count; n++ ) + { + wxGridCellCoords& coords1 = m_blockSelectionTopLeft[n]; + wxGridCellCoords& coords2 = m_blockSelectionBottomRight[n]; + if ( BlockContainsCell(coords1.GetRow(), coords1.GetCol(), + coords2.GetRow(), coords2.GetCol(), + row, col ) ) + return true; + } + + // Now check whether the given cell is + // contained in one of the selected rows + // (unless we are in column selection mode). + if ( m_selectionMode != wxGrid::wxGridSelectColumns ) + { + count = m_rowSelection.GetCount(); + for ( size_t n = 0; n < count; n++ ) + { + if ( row == m_rowSelection[n] ) + return true; + } + } + + // Now check whether the given cell is + // contained in one of the selected columns + // (unless we are in row selection mode). + if ( m_selectionMode != wxGrid::wxGridSelectRows ) + { + count = m_colSelection.GetCount(); + for ( size_t n = 0; n < count; n++ ) + { + if ( col == m_colSelection[n] ) + return true; + } + } + + return false; +} + +// Change the selection mode +void wxGridSelection::SetSelectionMode( wxGrid::wxGridSelectionModes selmode ) +{ + // if selection mode is unchanged return immediately + if (selmode == m_selectionMode) + return; + + if ( m_selectionMode != wxGrid::wxGridSelectCells ) + { + // if changing form row to column selection + // or vice versa, clear the selection. + if ( selmode != wxGrid::wxGridSelectCells ) + ClearSelection(); + + m_selectionMode = selmode; + } + else + { + // if changing from cell selection to something else, + // promote selected cells/blocks to whole rows/columns. + size_t n; + while ( ( n = m_cellSelection.GetCount() ) > 0 ) + { + n--; + wxGridCellCoords& coords = m_cellSelection[n]; + int row = coords.GetRow(); + int col = coords.GetCol(); + m_cellSelection.RemoveAt(n); + if (selmode == wxGrid::wxGridSelectRows) + SelectRow( row ); + else // selmode == wxGridSelectColumns) + SelectCol( col ); + } + + // Note that m_blockSelectionTopLeft's size may be changing! + for (n = 0; n < m_blockSelectionTopLeft.GetCount(); n++) + { + wxGridCellCoords& coords = m_blockSelectionTopLeft[n]; + int topRow = coords.GetRow(); + int leftCol = coords.GetCol(); + coords = m_blockSelectionBottomRight[n]; + int bottomRow = coords.GetRow(); + int rightCol = coords.GetCol(); + + if (selmode == wxGrid::wxGridSelectRows) + { + if (leftCol != 0 || rightCol != m_grid->GetNumberCols() - 1 ) + { + m_blockSelectionTopLeft.RemoveAt(n); + m_blockSelectionBottomRight.RemoveAt(n); + SelectBlock( topRow, 0, + bottomRow, m_grid->GetNumberCols() - 1, + false, false, false, false, false ); + } + } + else // selmode == wxGridSelectColumns) + { + if (topRow != 0 || bottomRow != m_grid->GetNumberRows() - 1 ) + { + m_blockSelectionTopLeft.RemoveAt(n); + m_blockSelectionBottomRight.RemoveAt(n); + SelectBlock( 0, leftCol, + m_grid->GetNumberRows() - 1, rightCol, + false, false, false, false, false ); + } + } + } + + m_selectionMode = selmode; + } +} + +void wxGridSelection::SelectRow( int row, + bool ControlDown, bool ShiftDown, + bool AltDown, bool MetaDown ) +{ + if ( m_selectionMode == wxGrid::wxGridSelectColumns ) + return; + + size_t count, n; + + // Remove single cells contained in newly selected block. + if ( m_selectionMode == wxGrid::wxGridSelectCells ) + { + count = m_cellSelection.GetCount(); + for ( n = 0; n < count; n++ ) + { + wxGridCellCoords& coords = m_cellSelection[n]; + if ( BlockContainsCell( row, 0, row, m_grid->GetNumberCols() - 1, + coords.GetRow(), coords.GetCol() ) ) + { + m_cellSelection.RemoveAt(n); + n--; + count--; + } + } + } + + // Simplify list of selected blocks (if possible) + count = m_blockSelectionTopLeft.GetCount(); + bool done = false; + + for ( n = 0; n < count; n++ ) + { + wxGridCellCoords& coords1 = m_blockSelectionTopLeft[n]; + wxGridCellCoords& coords2 = m_blockSelectionBottomRight[n]; + + // Remove block if it is a subset of the row + if ( coords1.GetRow() == row && row == coords2.GetRow() ) + { + m_blockSelectionTopLeft.RemoveAt(n); + m_blockSelectionBottomRight.RemoveAt(n); + n--; + count--; + } + else if ( coords1.GetCol() == 0 && + coords2.GetCol() == m_grid->GetNumberCols() - 1 ) + { + // silently return, if row is contained in block + if ( coords1.GetRow() <= row && row <= coords2.GetRow() ) + return; + // expand block, if it touched row + else if ( coords1.GetRow() == row + 1) + { + coords1.SetRow(row); + done = true; + } + else if ( coords2.GetRow() == row - 1) + { + coords2.SetRow(row); + done = true; + } + } + } + + // Unless we successfully handled the row, + // check whether row is already selected. + if ( !done ) + { + count = m_rowSelection.GetCount(); + for ( n = 0; n < count; n++ ) + { + if ( row == m_rowSelection[n] ) + return; + } + + // Add row to selection + m_rowSelection.Add(row); + } + + // Update View: + if ( !m_grid->GetBatchCount() ) + { + wxRect r = m_grid->BlockToDeviceRect( wxGridCellCoords( row, 0 ), + wxGridCellCoords( row, m_grid->GetNumberCols() - 1 ) ); + ((wxWindow *)m_grid->m_gridWin)->Refresh( false, &r ); + } + + // Send Event + wxGridRangeSelectEvent gridEvt( m_grid->GetId(), + wxEVT_GRID_RANGE_SELECT, + m_grid, + wxGridCellCoords( row, 0 ), + wxGridCellCoords( row, m_grid->GetNumberCols() - 1 ), + true, + ControlDown, ShiftDown, + AltDown, MetaDown ); + + m_grid->GetEventHandler()->ProcessEvent( gridEvt ); +} + +void wxGridSelection::SelectCol( int col, + bool ControlDown, bool ShiftDown, + bool AltDown, bool MetaDown ) +{ + if ( m_selectionMode == wxGrid::wxGridSelectRows ) + return; + size_t count, n; + + // Remove single cells contained in newly selected block. + if ( m_selectionMode == wxGrid::wxGridSelectCells ) + { + count = m_cellSelection.GetCount(); + for ( n = 0; n < count; n++ ) + { + wxGridCellCoords& coords = m_cellSelection[n]; + if ( BlockContainsCell( 0, col, m_grid->GetNumberRows() - 1, col, + coords.GetRow(), coords.GetCol() ) ) + { + m_cellSelection.RemoveAt(n); + n--; + count--; + } + } + } + + // Simplify list of selected blocks (if possible) + count = m_blockSelectionTopLeft.GetCount(); + bool done = false; + for ( n = 0; n < count; n++ ) + { + wxGridCellCoords& coords1 = m_blockSelectionTopLeft[n]; + wxGridCellCoords& coords2 = m_blockSelectionBottomRight[n]; + + // Remove block if it is a subset of the column + if ( coords1.GetCol() == col && col == coords2.GetCol() ) + { + m_blockSelectionTopLeft.RemoveAt(n); + m_blockSelectionBottomRight.RemoveAt(n); + n--; + count--; + } + else if ( coords1.GetRow() == 0 && + coords2.GetRow() == m_grid->GetNumberRows() - 1 ) + { + // silently return, if row is contained in block + if ( coords1.GetCol() <= col && col <= coords2.GetCol() ) + return; + // expand block, if it touched col + else if ( coords1.GetCol() == col + 1) + { + coords1.SetCol(col); + done = true; + } + else if ( coords2.GetCol() == col - 1) + { + coords2.SetCol(col); + done = true; + } + } + } + + // Unless we successfully handled the column, + // Check whether col is already selected. + if ( !done ) + { + count = m_colSelection.GetCount(); + for ( n = 0; n < count; n++ ) + { + if ( col == m_colSelection[n] ) + return; + } + + // Add col to selection + m_colSelection.Add(col); + } + + // Update View: + if ( !m_grid->GetBatchCount() ) + { + wxRect r = m_grid->BlockToDeviceRect( wxGridCellCoords( 0, col ), + wxGridCellCoords( m_grid->GetNumberRows() - 1, col ) ); + ((wxWindow *)m_grid->m_gridWin)->Refresh( false, &r ); + } + + // Send Event + wxGridRangeSelectEvent gridEvt( m_grid->GetId(), + wxEVT_GRID_RANGE_SELECT, + m_grid, + wxGridCellCoords( 0, col ), + wxGridCellCoords( m_grid->GetNumberRows() - 1, col ), + true, + ControlDown, ShiftDown, + AltDown, MetaDown ); + + m_grid->GetEventHandler()->ProcessEvent( gridEvt ); +} + +void wxGridSelection::SelectBlock( int topRow, int leftCol, + int bottomRow, int rightCol, + bool ControlDown, bool ShiftDown, + bool AltDown, bool MetaDown, + bool sendEvent ) +{ + // Fix the coordinates of the block if needed. + if ( m_selectionMode == wxGrid::wxGridSelectRows ) + { + leftCol = 0; + rightCol = m_grid->GetNumberCols() - 1; + } + else if ( m_selectionMode == wxGrid::wxGridSelectColumns ) + { + topRow = 0; + bottomRow = m_grid->GetNumberRows() - 1; + } + + if ( topRow > bottomRow ) + { + int temp = topRow; + topRow = bottomRow; + bottomRow = temp; + } + + if ( leftCol > rightCol ) + { + int temp = leftCol; + leftCol = rightCol; + rightCol = temp; + } + + // Handle single cell selection in SelectCell. + // (MB: added check for selection mode here to prevent + // crashes if, for example, we are select rows and the + // grid only has 1 col) + if ( m_selectionMode == wxGrid::wxGridSelectCells && + topRow == bottomRow && leftCol == rightCol ) + { + SelectCell( topRow, leftCol, ControlDown, ShiftDown, + AltDown, MetaDown, sendEvent ); + } + + size_t count, n; + + // Remove single cells contained in newly selected block. + if ( m_selectionMode == wxGrid::wxGridSelectCells ) + { + count = m_cellSelection.GetCount(); + for ( n = 0; n < count; n++ ) + { + wxGridCellCoords& coords = m_cellSelection[n]; + if ( BlockContainsCell( topRow, leftCol, bottomRow, rightCol, + coords.GetRow(), coords.GetCol() ) ) + { + m_cellSelection.RemoveAt(n); + n--; + count--; + } + } + } + + // If a block containing the selection is already selected, return, + // if a block contained in the selection is found, remove it. + + count = m_blockSelectionTopLeft.GetCount(); + for ( n = 0; n < count; n++ ) + { + wxGridCellCoords& coords1 = m_blockSelectionTopLeft[n]; + wxGridCellCoords& coords2 = m_blockSelectionBottomRight[n]; + + switch ( BlockContain( coords1.GetRow(), coords1.GetCol(), + coords2.GetRow(), coords2.GetCol(), + topRow, leftCol, bottomRow, rightCol ) ) + { + case 1: + return; + + case -1: + m_blockSelectionTopLeft.RemoveAt(n); + m_blockSelectionBottomRight.RemoveAt(n); + n--; + count--; + break; + + default: + break; + } + } + + // If a row containing the selection is already selected, return, + // if a row contained in newly selected block is found, remove it. + if ( m_selectionMode != wxGrid::wxGridSelectColumns ) + { + count = m_rowSelection.GetCount(); + for ( n = 0; n < count; n++ ) + { + switch ( BlockContain( m_rowSelection[n], 0, + m_rowSelection[n], m_grid->GetNumberCols() - 1, + topRow, leftCol, bottomRow, rightCol ) ) + { + case 1: + return; + + case -1: + m_rowSelection.RemoveAt(n); + n--; + count--; + break; + + default: + break; + } + } + } + + if ( m_selectionMode != wxGrid::wxGridSelectRows ) + { + count = m_colSelection.GetCount(); + for ( n = 0; n < count; n++ ) + { + switch ( BlockContain( 0, m_colSelection[n], + m_grid->GetNumberRows() - 1, m_colSelection[n], + topRow, leftCol, bottomRow, rightCol ) ) + { + case 1: + return; + + case -1: + m_colSelection.RemoveAt(n); + n--; + count--; + break; + + default: + break; + } + } + } + + m_blockSelectionTopLeft.Add( wxGridCellCoords( topRow, leftCol ) ); + m_blockSelectionBottomRight.Add( wxGridCellCoords( bottomRow, rightCol ) ); + + // Update View: + if ( !m_grid->GetBatchCount() ) + { + wxRect r = m_grid->BlockToDeviceRect( wxGridCellCoords( topRow, leftCol ), + wxGridCellCoords( bottomRow, rightCol ) ); + ((wxWindow *)m_grid->m_gridWin)->Refresh( false, &r ); + } + + // Send Event, if not disabled. + if ( sendEvent ) + { + wxGridRangeSelectEvent gridEvt( m_grid->GetId(), + wxEVT_GRID_RANGE_SELECT, + m_grid, + wxGridCellCoords( topRow, leftCol ), + wxGridCellCoords( bottomRow, rightCol ), + true, + ControlDown, ShiftDown, + AltDown, MetaDown ); + m_grid->GetEventHandler()->ProcessEvent( gridEvt ); + } +} + +void wxGridSelection::SelectCell( int row, int col, + bool ControlDown, bool ShiftDown, + bool AltDown, bool MetaDown, + bool sendEvent ) +{ + if ( m_selectionMode == wxGrid::wxGridSelectRows ) + { + SelectBlock(row, 0, row, m_grid->GetNumberCols() - 1, + ControlDown, ShiftDown, AltDown, MetaDown, sendEvent); + + return; + } + else if ( m_selectionMode == wxGrid::wxGridSelectColumns ) + { + SelectBlock(0, col, m_grid->GetNumberRows() - 1, col, + ControlDown, ShiftDown, AltDown, MetaDown, sendEvent); + + return; + } + else if ( IsInSelection ( row, col ) ) + return; + + m_cellSelection.Add( wxGridCellCoords( row, col ) ); + + // Update View: + if ( !m_grid->GetBatchCount() ) + { + wxRect r = m_grid->BlockToDeviceRect( + wxGridCellCoords( row, col ), + wxGridCellCoords( row, col ) ); + ((wxWindow *)m_grid->m_gridWin)->Refresh( false, &r ); + } + + // Send event + if (sendEvent) + { + wxGridRangeSelectEvent gridEvt( m_grid->GetId(), + wxEVT_GRID_RANGE_SELECT, + m_grid, + wxGridCellCoords( row, col ), + wxGridCellCoords( row, col ), + true, + ControlDown, ShiftDown, + AltDown, MetaDown ); + m_grid->GetEventHandler()->ProcessEvent( gridEvt ); + } +} + +void wxGridSelection::ToggleCellSelection( int row, int col, + bool ControlDown, bool ShiftDown, + bool AltDown, bool MetaDown ) +{ + // if the cell is not selected, select it + if ( !IsInSelection ( row, col ) ) + { + SelectCell( row, col, ControlDown, ShiftDown, AltDown, MetaDown ); + + return; + } + + // otherwise deselect it. This can be simple or more or + // less difficult, depending on how the cell is selected. + size_t count, n; + + // The simplest case: The cell is contained in m_cellSelection + // Then it can't be contained in rows/cols/block (since those + // would remove the cell from m_cellSelection on creation), so + // we just have to remove it from m_cellSelection. + + if ( m_selectionMode == wxGrid::wxGridSelectCells ) + { + count = m_cellSelection.GetCount(); + for ( n = 0; n < count; n++ ) + { + const wxGridCellCoords& sel = m_cellSelection[n]; + if ( row == sel.GetRow() && col == sel.GetCol() ) + { + wxGridCellCoords coords = m_cellSelection[n]; + m_cellSelection.RemoveAt(n); + if ( !m_grid->GetBatchCount() ) + { + wxRect r = m_grid->BlockToDeviceRect( coords, coords ); + ((wxWindow *)m_grid->m_gridWin)->Refresh( false, &r ); + } + + // Send event + wxGridRangeSelectEvent gridEvt( m_grid->GetId(), + wxEVT_GRID_RANGE_SELECT, + m_grid, + wxGridCellCoords( row, col ), + wxGridCellCoords( row, col ), + false, + ControlDown, ShiftDown, + AltDown, MetaDown ); + m_grid->GetEventHandler()->ProcessEvent( gridEvt ); + + return; + } + } + } + + // The most difficult case: The cell is member of one or even several + // blocks. Split each such block in up to 4 new parts, that don't + // contain the cell to be selected, like this: + // |---------------------------| + // | | + // | part 1 | + // | | + // |---------------------------| + // | part 3 |x| part 4 | + // |---------------------------| + // | | + // | part 2 | + // | | + // |---------------------------| + // (The x marks the newly deselected cell). + // Note: in row selection mode, we only need part1 and part2; + // in column selection mode, we only need part 3 and part4, + // which are expanded to whole columns automatically! + + count = m_blockSelectionTopLeft.GetCount(); + for ( n = 0; n < count; n++ ) + { + wxGridCellCoords& coords1 = m_blockSelectionTopLeft[n]; + wxGridCellCoords& coords2 = m_blockSelectionBottomRight[n]; + int topRow = coords1.GetRow(); + int leftCol = coords1.GetCol(); + int bottomRow = coords2.GetRow(); + int rightCol = coords2.GetCol(); + + if ( BlockContainsCell( topRow, leftCol, bottomRow, rightCol, row, col ) ) + { + // remove the block + m_blockSelectionTopLeft.RemoveAt(n); + m_blockSelectionBottomRight.RemoveAt(n); + n--; + count--; + + // add up to 4 smaller blocks and set update region + if ( m_selectionMode != wxGrid::wxGridSelectColumns ) + { + if ( topRow < row ) + SelectBlock( topRow, leftCol, row - 1, rightCol, + false, false, false, false, false ); + if ( bottomRow > row ) + SelectBlock( row + 1, leftCol, bottomRow, rightCol, + false, false, false, false, false ); + } + + if ( m_selectionMode != wxGrid::wxGridSelectRows ) + { + if ( leftCol < col ) + SelectBlock( row, leftCol, row, col - 1, + false, false, false, false, false ); + if ( rightCol > col ) + SelectBlock( row, col + 1, row, rightCol, + false, false, false, false, false ); + } + } + } + + // remove a cell from a row, adding up to two new blocks + if ( m_selectionMode != wxGrid::wxGridSelectColumns ) + { + count = m_rowSelection.GetCount(); + for ( n = 0; n < count; n++ ) + { + if ( m_rowSelection[n] == row ) + { + m_rowSelection.RemoveAt(n); + n--; + count--; + + if (m_selectionMode == wxGrid::wxGridSelectCells) + { + if ( col > 0 ) + SelectBlock( row, 0, row, col - 1, + false, false, false, false, false ); + if ( col < m_grid->GetNumberCols() - 1 ) + SelectBlock( row, col + 1, + row, m_grid->GetNumberCols() - 1, + false, false, false, false, false ); + } + } + } + } + + // remove a cell from a column, adding up to two new blocks + if ( m_selectionMode != wxGrid::wxGridSelectRows ) + { + count = m_colSelection.GetCount(); + for ( n = 0; n < count; n++ ) + { + if ( m_colSelection[n] == col ) + { + m_colSelection.RemoveAt(n); + n--; + count--; + + if (m_selectionMode == wxGrid::wxGridSelectCells) + { + if ( row > 0 ) + SelectBlock( 0, col, row - 1, col, + false, false, false, false, false ); + if ( row < m_grid->GetNumberRows() - 1 ) + SelectBlock( row + 1, col, + m_grid->GetNumberRows() - 1, col, + false, false, false, false, false ); + } + } + } + } + + // Refresh the screen and send the event; according to m_selectionMode, + // we need to either update only the cell, or the whole row/column. + wxRect r; + switch (m_selectionMode) + { + case wxGrid::wxGridSelectCells: + { + if ( !m_grid->GetBatchCount() ) + { + r = m_grid->BlockToDeviceRect( + wxGridCellCoords( row, col ), + wxGridCellCoords( row, col ) ); + ((wxWindow *)m_grid->m_gridWin)->Refresh( false, &r ); + } + + wxGridRangeSelectEvent gridEvt( m_grid->GetId(), + wxEVT_GRID_RANGE_SELECT, + m_grid, + wxGridCellCoords( row, col ), + wxGridCellCoords( row, col ), + false, + ControlDown, ShiftDown, + AltDown, MetaDown ); + m_grid->GetEventHandler()->ProcessEvent( gridEvt ); + } + break; + + case wxGrid::wxGridSelectRows: + { + if ( !m_grid->GetBatchCount() ) + { + r = m_grid->BlockToDeviceRect( + wxGridCellCoords( row, 0 ), + wxGridCellCoords( row, m_grid->GetNumberCols() - 1 ) ); + ((wxWindow *)m_grid->m_gridWin)->Refresh( false, &r ); + } + + wxGridRangeSelectEvent gridEvt( m_grid->GetId(), + wxEVT_GRID_RANGE_SELECT, + m_grid, + wxGridCellCoords( row, 0 ), + wxGridCellCoords( row, m_grid->GetNumberCols() - 1 ), + false, + ControlDown, ShiftDown, + AltDown, MetaDown ); + m_grid->GetEventHandler()->ProcessEvent( gridEvt ); + } + break; + + case wxGrid::wxGridSelectColumns: + { + if ( !m_grid->GetBatchCount() ) + { + r = m_grid->BlockToDeviceRect( + wxGridCellCoords( 0, col ), + wxGridCellCoords( m_grid->GetNumberRows() - 1, col ) ); + ((wxWindow *)m_grid->m_gridWin)->Refresh( false, &r ); + } + + wxGridRangeSelectEvent gridEvt( m_grid->GetId(), + wxEVT_GRID_RANGE_SELECT, + m_grid, + wxGridCellCoords( 0, col ), + wxGridCellCoords( m_grid->GetNumberRows() - 1, col ), + false, + ControlDown, ShiftDown, + AltDown, MetaDown ); + m_grid->GetEventHandler()->ProcessEvent( gridEvt ); + } + break; + + default: + break; + } +} + +void wxGridSelection::ClearSelection() +{ + size_t n; + wxRect r; + wxGridCellCoords coords1, coords2; + + // deselect all individual cells and update the screen + if ( m_selectionMode == wxGrid::wxGridSelectCells ) + { + while ( ( n = m_cellSelection.GetCount() ) > 0) + { + n--; + coords1 = m_cellSelection[n]; + m_cellSelection.RemoveAt(n); + if ( !m_grid->GetBatchCount() ) + { + r = m_grid->BlockToDeviceRect( coords1, coords1 ); + ((wxWindow *)m_grid->m_gridWin)->Refresh( false, &r ); + +#ifdef __WXMAC__ + ((wxWindow *)m_grid->m_gridWin)->Update(); +#endif + } + } + } + + // deselect all blocks and update the screen + while ( ( n = m_blockSelectionTopLeft.GetCount() ) > 0) + { + n--; + coords1 = m_blockSelectionTopLeft[n]; + coords2 = m_blockSelectionBottomRight[n]; + m_blockSelectionTopLeft.RemoveAt(n); + m_blockSelectionBottomRight.RemoveAt(n); + if ( !m_grid->GetBatchCount() ) + { + r = m_grid->BlockToDeviceRect( coords1, coords2 ); + ((wxWindow *)m_grid->m_gridWin)->Refresh( false, &r ); + +#ifdef __WXMAC__ + ((wxWindow *)m_grid->m_gridWin)->Update(); +#endif + } + } + + // deselect all rows and update the screen + if ( m_selectionMode != wxGrid::wxGridSelectColumns ) + { + while ( ( n = m_rowSelection.GetCount() ) > 0) + { + n--; + int row = m_rowSelection[n]; + m_rowSelection.RemoveAt(n); + if ( !m_grid->GetBatchCount() ) + { + r = m_grid->BlockToDeviceRect( wxGridCellCoords( row, 0 ), + wxGridCellCoords( row, m_grid->GetNumberCols() - 1 ) ); + ((wxWindow *)m_grid->m_gridWin)->Refresh( false, &r ); + +#ifdef __WXMAC__ + ((wxWindow *)m_grid->m_gridWin)->Update(); +#endif + } + } + } + + // deselect all columns and update the screen + if ( m_selectionMode != wxGrid::wxGridSelectRows ) + { + while ( ( n = m_colSelection.GetCount() ) > 0) + { + n--; + int col = m_colSelection[n]; + m_colSelection.RemoveAt(n); + if ( !m_grid->GetBatchCount() ) + { + r = m_grid->BlockToDeviceRect( wxGridCellCoords( 0, col ), + wxGridCellCoords( m_grid->GetNumberRows() - 1, col ) ); + ((wxWindow *)m_grid->m_gridWin)->Refresh( false, &r ); + +#ifdef __WXMAC__ + ((wxWindow *)m_grid->m_gridWin)->Update(); +#endif + } + } + } + + // One deselection event, indicating deselection of _all_ cells. + // (No finer grained events for each of the smaller regions + // deselected above!) + wxGridRangeSelectEvent gridEvt( m_grid->GetId(), + wxEVT_GRID_RANGE_SELECT, + m_grid, + wxGridCellCoords( 0, 0 ), + wxGridCellCoords( + m_grid->GetNumberRows() - 1, + m_grid->GetNumberCols() - 1 ), + false ); + + m_grid->GetEventHandler()->ProcessEvent(gridEvt); +} + + +void wxGridSelection::UpdateRows( size_t pos, int numRows ) +{ + size_t count = m_cellSelection.GetCount(); + size_t n; + for ( n = 0; n < count; n++ ) + { + wxGridCellCoords& coords = m_cellSelection[n]; + wxCoord row = coords.GetRow(); + if ((size_t)row >= pos) + { + if (numRows > 0) + { + // If rows inserted, increase row counter where necessary + coords.SetRow(row + numRows); + } + else if (numRows < 0) + { + // If rows deleted ... + if ((size_t)row >= pos - numRows) + { + // ...either decrement row counter (if row still exists)... + coords.SetRow(row + numRows); + } + else + { + // ...or remove the attribute + m_cellSelection.RemoveAt(n); + n--; + count--; + } + } + } + } + + count = m_blockSelectionTopLeft.GetCount(); + for ( n = 0; n < count; n++ ) + { + wxGridCellCoords& coords1 = m_blockSelectionTopLeft[n]; + wxGridCellCoords& coords2 = m_blockSelectionBottomRight[n]; + wxCoord row1 = coords1.GetRow(); + wxCoord row2 = coords2.GetRow(); + + if ((size_t)row2 >= pos) + { + if (numRows > 0) + { + // If rows inserted, increase row counter where necessary + coords2.SetRow( row2 + numRows ); + if ((size_t)row1 >= pos) + coords1.SetRow( row1 + numRows ); + } + else if (numRows < 0) + { + // If rows deleted ... + if ((size_t)row2 >= pos - numRows) + { + // ...either decrement row counter (if row still exists)... + coords2.SetRow( row2 + numRows ); + if ((size_t)row1 >= pos) + coords1.SetRow( wxMax(row1 + numRows, (int)pos) ); + + } + else + { + if ((size_t)row1 >= pos) + { + // ...or remove the attribute + m_blockSelectionTopLeft.RemoveAt(n); + m_blockSelectionBottomRight.RemoveAt(n); + n--; + count--; + } + else + coords2.SetRow( pos ); + } + } + } + } + + count = m_rowSelection.GetCount(); + for ( n = 0; n < count; n++ ) + { + int rowOrCol_ = m_rowSelection[n]; + + if ((size_t) rowOrCol_ >= pos) + { + if ( numRows > 0 ) + { + m_rowSelection[n] += numRows; + } + else if ( numRows < 0 ) + { + if ((size_t)rowOrCol_ >= (pos - numRows)) + m_rowSelection[n] += numRows; + else + { + m_rowSelection.RemoveAt( n ); + n--; + count--; + } + } + } + } + // No need to touch selected columns, unless we removed _all_ + // rows, in this case, we remove all columns from the selection. + + if ( !m_grid->GetNumberRows() ) + m_colSelection.Clear(); +} + + +void wxGridSelection::UpdateCols( size_t pos, int numCols ) +{ + size_t count = m_cellSelection.GetCount(); + size_t n; + + for ( n = 0; n < count; n++ ) + { + wxGridCellCoords& coords = m_cellSelection[n]; + wxCoord col = coords.GetCol(); + if ((size_t)col >= pos) + { + if (numCols > 0) + { + // If rows inserted, increase row counter where necessary + coords.SetCol(col + numCols); + } + else if (numCols < 0) + { + // If rows deleted ... + if ((size_t)col >= pos - numCols) + { + // ...either decrement row counter (if row still exists)... + coords.SetCol(col + numCols); + } + else + { + // ...or remove the attribute + m_cellSelection.RemoveAt(n); + n--; + count--; + } + } + } + } + + count = m_blockSelectionTopLeft.GetCount(); + for ( n = 0; n < count; n++ ) + { + wxGridCellCoords& coords1 = m_blockSelectionTopLeft[n]; + wxGridCellCoords& coords2 = m_blockSelectionBottomRight[n]; + wxCoord col1 = coords1.GetCol(); + wxCoord col2 = coords2.GetCol(); + + if ((size_t)col2 >= pos) + { + if (numCols > 0) + { + // If rows inserted, increase row counter where necessary + coords2.SetCol(col2 + numCols); + if ((size_t)col1 >= pos) + coords1.SetCol(col1 + numCols); + } + else if (numCols < 0) + { + // If cols deleted ... + if ((size_t)col2 >= pos - numCols) + { + // ...either decrement col counter (if col still exists)... + coords2.SetCol(col2 + numCols); + if ( (size_t) col1 >= pos) + coords1.SetCol( wxMax(col1 + numCols, (int)pos) ); + + } + else + { + if ((size_t)col1 >= pos) + { + // ...or remove the attribute + m_blockSelectionTopLeft.RemoveAt(n); + m_blockSelectionBottomRight.RemoveAt(n); + n--; + count--; + } + else + coords2.SetCol(pos); + } + } + } + } + + count = m_colSelection.GetCount(); + for ( n = 0; n < count; n++ ) + { + int rowOrCol = m_colSelection[n]; + + if ((size_t)rowOrCol >= pos) + { + if ( numCols > 0 ) + m_colSelection[n] += numCols; + else if ( numCols < 0 ) + { + if ((size_t)rowOrCol >= (pos - numCols)) + m_colSelection[n] += numCols; + else + { + m_colSelection.RemoveAt( n ); + n--; + count--; + } + } + } + } + + // No need to touch selected rows, unless we removed _all_ + // columns, in this case, we remove all rows from the selection. + if ( !m_grid->GetNumberCols() ) + m_rowSelection.Clear(); +} + +int wxGridSelection::BlockContain( int topRow1, int leftCol1, + int bottomRow1, int rightCol1, + int topRow2, int leftCol2, + int bottomRow2, int rightCol2 ) +// returns 1, if Block1 contains Block2, +// -1, if Block2 contains Block1, +// 0, otherwise +{ + if ( topRow1 <= topRow2 && bottomRow2 <= bottomRow1 && + leftCol1 <= leftCol2 && rightCol2 <= rightCol1 ) + return 1; + else if ( topRow2 <= topRow1 && bottomRow1 <= bottomRow2 && + leftCol2 <= leftCol1 && rightCol1 <= rightCol2 ) + return -1; + + return 0; +} + +#endif diff --git a/Externals/wxWidgets/src/generic/helpext.cpp b/Externals/wxWidgets/src/generic/helpext.cpp new file mode 100644 index 0000000000..97100ed3ca --- /dev/null +++ b/Externals/wxWidgets/src/generic/helpext.cpp @@ -0,0 +1,485 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/generic/helpext.cpp +// Purpose: an external help controller for wxWidgets +// Author: Karsten Ballueder +// Modified by: +// Created: 04/01/98 +// RCS-ID: $Id: helpext.cpp 38857 2006-04-20 07:31:44Z ABX $ +// Copyright: (c) Karsten Ballueder +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_HELP && !defined(__WXWINCE__) && (!defined(__WXMAC__) || defined(__WXMAC_OSX__)) + +#ifndef WX_PRECOMP + #include "wx/list.h" + #include "wx/string.h" + #include "wx/utils.h" + #include "wx/intl.h" + #include "wx/msgdlg.h" + #include "wx/choicdlg.h" + #include "wx/log.h" +#endif + +#include "wx/filename.h" +#include "wx/textfile.h" +#include "wx/generic/helpext.h" + +#include +#include +#include + +#if !defined(__WINDOWS__) && !defined(__OS2__) + #include +#endif + +#ifdef __WINDOWS__ +#include "wx/msw/mslu.h" +#endif + +#ifdef __WXMSW__ +#include +#include "wx/msw/winundef.h" +#endif + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +/// Name for map file. +#define WXEXTHELP_MAPFILE _T("wxhelp.map") + +/// Character introducing comments/documentation field in map file. +#define WXEXTHELP_COMMENTCHAR ';' + +#define CONTENTS_ID 0 + +IMPLEMENT_CLASS(wxExtHelpController, wxHelpControllerBase) + +/// Name of environment variable to set help browser. +#define WXEXTHELP_ENVVAR_BROWSER wxT("WX_HELPBROWSER") +/// Is browser a netscape browser? +#define WXEXTHELP_ENVVAR_BROWSERISNETSCAPE wxT("WX_HELPBROWSER_NS") + +/** + This class implements help via an external browser. + It requires the name of a directory containing the documentation + and a file mapping numerical Section numbers to relative URLS. +*/ + +wxExtHelpController::wxExtHelpController(wxWindow* parentWindow) + : wxHelpControllerBase(parentWindow) +{ + m_MapList = NULL; + m_NumOfEntries = 0; + m_BrowserIsNetscape = false; + + wxChar *browser = wxGetenv(WXEXTHELP_ENVVAR_BROWSER); + if (browser) + { + m_BrowserName = browser; + browser = wxGetenv(WXEXTHELP_ENVVAR_BROWSERISNETSCAPE); + m_BrowserIsNetscape = browser && (wxAtoi(browser) != 0); + } +} + +wxExtHelpController::~wxExtHelpController() +{ + DeleteList(); +} + +void wxExtHelpController::SetBrowser(const wxString& browsername, bool isNetscape) +{ + m_BrowserName = browsername; + m_BrowserIsNetscape = isNetscape; +} + +// Set viewer: new, generic name for SetBrowser +void wxExtHelpController::SetViewer(const wxString& viewer, long flags) +{ + SetBrowser(viewer, (flags & wxHELP_NETSCAPE) != 0); +} + +bool wxExtHelpController::DisplayHelp(const wxString &relativeURL) +{ + // construct hte URL to open -- it's just a file + wxString url(_T("file://") + m_helpDir); + url << wxFILE_SEP_PATH << relativeURL; + + // use the explicit browser program if specified + if ( !m_BrowserName.empty() ) + { + if ( m_BrowserIsNetscape ) + { + wxString command; + command << m_BrowserName + << wxT(" -remote openURL(") << url << wxT(')'); + if ( wxExecute(command, wxEXEC_SYNC) != -1 ) + return true; + } + + if ( wxExecute(m_BrowserName + _T(' ') + url, wxEXEC_SYNC) != -1 ) + return true; + } + //else: either no browser explicitly specified or we failed to open it + + // just use default browser + return wxLaunchDefaultBrowser(url); +} + +class wxExtHelpMapEntry : public wxObject +{ +public: + int id; + wxString url; + wxString doc; + wxExtHelpMapEntry(int iid, wxString const &iurl, wxString const &idoc) + { id = iid; url = iurl; doc = idoc; } +}; + +void wxExtHelpController::DeleteList() +{ + if (m_MapList) + { + wxList::compatibility_iterator node = m_MapList->GetFirst(); + while (node) + { + delete (wxExtHelpMapEntry *)node->GetData(); + m_MapList->Erase(node); + node = m_MapList->GetFirst(); + } + + delete m_MapList; + m_MapList = (wxList*) NULL; + } +} + +// This must be called to tell the controller where to find the documentation. +// @param file - NOT a filename, but a directory name. +// @return true on success +bool wxExtHelpController::Initialize(const wxString& file) +{ + return LoadFile(file); +} + +bool wxExtHelpController::ParseMapFileLine(const wxString& line) +{ + const wxChar *p = line.c_str(); + + // skip whitespace + while ( isascii(*p) && isspace(*p) ) + p++; + + // skip empty lines and comments + if ( *p == _T('\0') || *p == WXEXTHELP_COMMENTCHAR ) + return true; + + // the line is of the form "num url" so we must have an integer now + wxChar *end; + const unsigned long id = wxStrtoul(p, &end, 0); + + if ( end == p ) + return false; + + p = end; + while ( isascii(*p) && isspace(*p) ) + p++; + + // next should be the URL + wxString url; + url.reserve(line.length()); + while ( isascii(*p) && !isspace(*p) ) + url += *p++; + + while ( isascii(*p) && isspace(*p) ) + p++; + + // and finally the optional description of the entry after comment + wxString doc; + if ( *p == WXEXTHELP_COMMENTCHAR ) + { + p++; + while ( isascii(*p) && isspace(*p) ) + p++; + doc = p; + } + + m_MapList->Append(new wxExtHelpMapEntry(id, url, doc)); + m_NumOfEntries++; + + return true; +} + +// file is a misnomer as it's the name of the base help directory +bool wxExtHelpController::LoadFile(const wxString& file) +{ + wxFileName helpDir(wxFileName::DirName(file)); + helpDir.MakeAbsolute(); + + bool dirExists = false; + +#if wxUSE_INTL + // If a locale is set, look in file/localename, i.e. If passed + // "/usr/local/myapp/help" and the current wxLocale is set to be "de", then + // look in "/usr/local/myapp/help/de/" first and fall back to + // "/usr/local/myapp/help" if that doesn't exist. + const wxLocale * const loc = wxGetLocale(); + if ( loc ) + { + wxString locName = loc->GetName(); + + // the locale is in general of the form xx_YY.zzzz, try the full firm + // first and then also more general ones + wxFileName helpDirLoc(helpDir); + helpDirLoc.AppendDir(locName); + dirExists = helpDirLoc.DirExists(); + + if ( ! dirExists ) + { + // try without encoding + const wxString locNameWithoutEncoding = locName.BeforeLast(_T('.')); + if ( !locNameWithoutEncoding.empty() ) + { + helpDirLoc = helpDir; + helpDirLoc.AppendDir(locNameWithoutEncoding); + dirExists = helpDirLoc.DirExists(); + } + } + + if ( !dirExists ) + { + // try without country part + wxString locNameWithoutCountry = locName.BeforeLast(_T('_')); + if ( !locNameWithoutCountry.empty() ) + { + helpDirLoc = helpDir; + helpDirLoc.AppendDir(locNameWithoutCountry); + dirExists = helpDirLoc.DirExists(); + } + } + + if ( dirExists ) + helpDir = helpDirLoc; + } +#endif // wxUSE_INTL + + if ( ! dirExists && !helpDir.DirExists() ) + { + wxLogError(_("Help directory \"%s\" not found."), + helpDir.GetFullPath().c_str()); + return false; + } + + const wxFileName mapFile(helpDir.GetFullPath(), WXEXTHELP_MAPFILE); + if ( ! mapFile.FileExists() ) + { + wxLogError(_("Help file \"%s\" not found."), + mapFile.GetFullPath().c_str()); + return false; + } + + DeleteList(); + m_MapList = new wxList; + m_NumOfEntries = 0; + + wxTextFile input; + if ( !input.Open(mapFile.GetFullPath()) ) + return false; + + for ( wxString& line = input.GetFirstLine(); + !input.Eof(); + line = input.GetNextLine() ) + { + if ( !ParseMapFileLine(line) ) + { + wxLogWarning(_("Line %lu of map file \"%s\" has invalid syntax, skipped."), + (unsigned long)input.GetCurrentLine(), + mapFile.GetFullPath().c_str()); + } + } + + if ( !m_NumOfEntries ) + { + wxLogError(_("No valid mappings found in the file \"%s\"."), + mapFile.GetFullPath().c_str()); + return false; + } + + m_helpDir = helpDir.GetFullPath(); // now it's valid + return true; +} + + +bool wxExtHelpController::DisplayContents() +{ + if (! m_NumOfEntries) + return false; + + wxString contents; + wxList::compatibility_iterator node = m_MapList->GetFirst(); + wxExtHelpMapEntry *entry; + while (node) + { + entry = (wxExtHelpMapEntry *)node->GetData(); + if (entry->id == CONTENTS_ID) + { + contents = entry->url; + break; + } + + node = node->GetNext(); + } + + bool rc = false; + wxString file; + file << m_helpDir << wxFILE_SEP_PATH << contents; + if (file.Contains(wxT('#'))) + file = file.BeforeLast(wxT('#')); + if (contents.length() && wxFileExists(file)) + rc = DisplaySection(CONTENTS_ID); + + // if not found, open homemade toc: + return rc ? true : KeywordSearch(wxEmptyString); +} + +bool wxExtHelpController::DisplaySection(int sectionNo) +{ + if (! m_NumOfEntries) + return false; + + wxBusyCursor b; // display a busy cursor + wxList::compatibility_iterator node = m_MapList->GetFirst(); + wxExtHelpMapEntry *entry; + while (node) + { + entry = (wxExtHelpMapEntry *)node->GetData(); + if (entry->id == sectionNo) + return DisplayHelp(entry->url); + node = node->GetNext(); + } + + return false; +} + +bool wxExtHelpController::DisplaySection(const wxString& section) +{ + bool isFilename = (section.Find(wxT(".htm")) != -1); + + if (isFilename) + return DisplayHelp(section); + else + return KeywordSearch(section); +} + +bool wxExtHelpController::DisplayBlock(long blockNo) +{ + return DisplaySection((int)blockNo); +} + +bool wxExtHelpController::KeywordSearch(const wxString& k, + wxHelpSearchMode WXUNUSED(mode)) +{ + if (! m_NumOfEntries) + return false; + + wxString *choices = new wxString[m_NumOfEntries]; + wxString *urls = new wxString[m_NumOfEntries]; + + int idx = 0; + bool rc = false; + bool showAll = k.empty(); + + wxList::compatibility_iterator node = m_MapList->GetFirst(); + + { + // display a busy cursor + wxBusyCursor b; + wxString compA, compB; + wxExtHelpMapEntry *entry; + + // we compare case insensitive + if (! showAll) + { + compA = k; + compA.LowerCase(); + } + + while (node) + { + entry = (wxExtHelpMapEntry *)node->GetData(); + compB = entry->doc; + + bool testTarget = ! compB.empty(); + if (testTarget && ! showAll) + { + compB.LowerCase(); + testTarget = compB.Contains(compA); + } + + if (testTarget) + { + urls[idx] = entry->url; + // doesn't work: + // choices[idx] = (**i).doc.Contains((**i).doc.Before(WXEXTHELP_COMMENTCHAR)); + //if (choices[idx].empty()) // didn't contain the ';' + // choices[idx] = (**i).doc; + choices[idx] = wxEmptyString; + for (int j=0; ; j++) + { + wxChar targetChar = entry->doc.c_str()[j]; + if ((targetChar == 0) || (targetChar == WXEXTHELP_COMMENTCHAR)) + break; + + choices[idx] << targetChar; + } + + idx++; + } + + node = node->GetNext(); + } + } + + switch (idx) + { + case 0: + wxMessageBox(_("No entries found.")); + break; + + case 1: + rc = DisplayHelp(urls[0]); + break; + + default: + idx = wxGetSingleChoiceIndex( + showAll ? _("Help Index") : _("Relevant entries:"), + showAll ? _("Help Index") : _("Entries found"), + idx, choices); + if (idx >= 0) + rc = DisplayHelp(urls[idx]); + break; + } + + delete [] urls; + delete [] choices; + + return rc; +} + + +bool wxExtHelpController::Quit() +{ + return true; +} + +void wxExtHelpController::OnQuit() +{ +} + +#endif // wxUSE_HELP diff --git a/Externals/wxWidgets/src/generic/htmllbox.cpp b/Externals/wxWidgets/src/generic/htmllbox.cpp new file mode 100644 index 0000000000..a560d4ffc3 --- /dev/null +++ b/Externals/wxWidgets/src/generic/htmllbox.cpp @@ -0,0 +1,682 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: generic/htmllbox.cpp +// Purpose: implementation of wxHtmlListBox +// Author: Vadim Zeitlin +// Modified by: +// Created: 31.05.03 +// RCS-ID: $Id: htmllbox.cpp 44026 2006-12-21 18:24:27Z VS $ +// Copyright: (c) 2003 Vadim Zeitlin +// License: wxWindows license +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#ifndef WX_PRECOMP + #include "wx/dcclient.h" +#endif //WX_PRECOMP + +#if wxUSE_HTML + +#include "wx/htmllbox.h" + +#include "wx/html/htmlcell.h" +#include "wx/html/winpars.h" + +// this hack forces the linker to always link in m_* files +#include "wx/html/forcelnk.h" +FORCE_WXHTML_MODULES() + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// small border always added to the cells: +static const wxCoord CELL_BORDER = 2; + +const wxChar wxHtmlListBoxNameStr[] = wxT("htmlListBox"); +const wxChar wxSimpleHtmlListBoxNameStr[] = wxT("simpleHtmlListBox"); + +// ============================================================================ +// private classes +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxHtmlListBoxCache +// ---------------------------------------------------------------------------- + +// this class is used by wxHtmlListBox to cache the parsed representation of +// the items to avoid doing it anew each time an item must be drawn +class wxHtmlListBoxCache +{ +private: + // invalidate a single item, used by Clear() and InvalidateRange() + void InvalidateItem(size_t n) + { + m_items[n] = (size_t)-1; + delete m_cells[n]; + m_cells[n] = NULL; + } + +public: + wxHtmlListBoxCache() + { + for ( size_t n = 0; n < SIZE; n++ ) + { + m_items[n] = (size_t)-1; + m_cells[n] = NULL; + } + + m_next = 0; + } + + ~wxHtmlListBoxCache() + { + for ( size_t n = 0; n < SIZE; n++ ) + { + delete m_cells[n]; + } + } + + // completely invalidate the cache + void Clear() + { + for ( size_t n = 0; n < SIZE; n++ ) + { + InvalidateItem(n); + } + } + + // return the cached cell for this index or NULL if none + wxHtmlCell *Get(size_t item) const + { + for ( size_t n = 0; n < SIZE; n++ ) + { + if ( m_items[n] == item ) + return m_cells[n]; + } + + return NULL; + } + + // returns true if we already have this item cached + bool Has(size_t item) const { return Get(item) != NULL; } + + // ensure that the item is cached + void Store(size_t item, wxHtmlCell *cell) + { + delete m_cells[m_next]; + m_cells[m_next] = cell; + m_items[m_next] = item; + + // advance to the next item wrapping around if there are no more + if ( ++m_next == SIZE ) + m_next = 0; + } + + // forget the cached value of the item(s) between the given ones (inclusive) + void InvalidateRange(size_t from, size_t to) + { + for ( size_t n = 0; n < SIZE; n++ ) + { + if ( m_items[n] >= from && m_items[n] <= to ) + { + InvalidateItem(n); + } + } + } + +private: + // the max number of the items we cache + enum { SIZE = 50 }; + + // the index of the LRU (oldest) cell + size_t m_next; + + // the parsed representation of the cached item or NULL + wxHtmlCell *m_cells[SIZE]; + + // the index of the currently cached item (only valid if m_cells != NULL) + size_t m_items[SIZE]; +}; + +// ---------------------------------------------------------------------------- +// wxHtmlListBoxStyle +// ---------------------------------------------------------------------------- + +// just forward wxDefaultHtmlRenderingStyle callbacks to the main class so that +// they could be overridden by the user code +class wxHtmlListBoxStyle : public wxDefaultHtmlRenderingStyle +{ +public: + wxHtmlListBoxStyle(const wxHtmlListBox& hlbox) : m_hlbox(hlbox) { } + + virtual wxColour GetSelectedTextColour(const wxColour& colFg) + { + return m_hlbox.GetSelectedTextColour(colFg); + } + + virtual wxColour GetSelectedTextBgColour(const wxColour& colBg) + { + return m_hlbox.GetSelectedTextBgColour(colBg); + } + +private: + const wxHtmlListBox& m_hlbox; + + DECLARE_NO_COPY_CLASS(wxHtmlListBoxStyle) +}; + +// ---------------------------------------------------------------------------- +// event tables +// ---------------------------------------------------------------------------- + +BEGIN_EVENT_TABLE(wxHtmlListBox, wxVListBox) + EVT_SIZE(wxHtmlListBox::OnSize) + EVT_MOTION(wxHtmlListBox::OnMouseMove) + EVT_LEFT_DOWN(wxHtmlListBox::OnLeftDown) +END_EVENT_TABLE() + +// ============================================================================ +// implementation +// ============================================================================ + +IMPLEMENT_ABSTRACT_CLASS(wxHtmlListBox, wxVListBox) + + +// ---------------------------------------------------------------------------- +// wxHtmlListBox creation +// ---------------------------------------------------------------------------- + +wxHtmlListBox::wxHtmlListBox() + : wxHtmlWindowMouseHelper(this) +{ + Init(); +} + +// normal constructor which calls Create() internally +wxHtmlListBox::wxHtmlListBox(wxWindow *parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + long style, + const wxString& name) + : wxHtmlWindowMouseHelper(this) +{ + Init(); + + (void)Create(parent, id, pos, size, style, name); +} + +void wxHtmlListBox::Init() +{ + m_htmlParser = NULL; + m_htmlRendStyle = new wxHtmlListBoxStyle(*this); + m_cache = new wxHtmlListBoxCache; +} + +bool wxHtmlListBox::Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + long style, + const wxString& name) +{ + return wxVListBox::Create(parent, id, pos, size, style, name); +} + +wxHtmlListBox::~wxHtmlListBox() +{ + delete m_cache; + + if ( m_htmlParser ) + { + delete m_htmlParser->GetDC(); + delete m_htmlParser; + } + + delete m_htmlRendStyle; +} + +// ---------------------------------------------------------------------------- +// wxHtmlListBox appearance +// ---------------------------------------------------------------------------- + +wxColour wxHtmlListBox::GetSelectedTextColour(const wxColour& colFg) const +{ + return m_htmlRendStyle-> + wxDefaultHtmlRenderingStyle::GetSelectedTextColour(colFg); +} + +wxColour +wxHtmlListBox::GetSelectedTextBgColour(const wxColour& WXUNUSED(colBg)) const +{ + return GetSelectionBackground(); +} + +// ---------------------------------------------------------------------------- +// wxHtmlListBox items markup +// ---------------------------------------------------------------------------- + +wxString wxHtmlListBox::OnGetItemMarkup(size_t n) const +{ + // we don't even need to wrap the value returned by OnGetItem() inside + // "" and "" because wxHTML can parse it even + // without these tags + return OnGetItem(n); +} + +// ---------------------------------------------------------------------------- +// wxHtmlListBox cache handling +// ---------------------------------------------------------------------------- + +void wxHtmlListBox::CacheItem(size_t n) const +{ + if ( !m_cache->Has(n) ) + { + if ( !m_htmlParser ) + { + wxHtmlListBox *self = wxConstCast(this, wxHtmlListBox); + + self->m_htmlParser = new wxHtmlWinParser(self); + m_htmlParser->SetDC(new wxClientDC(self)); + m_htmlParser->SetFS(&self->m_filesystem); +#if !wxUSE_UNICODE + if (GetFont().Ok()) + m_htmlParser->SetInputEncoding(GetFont().GetEncoding()); +#endif + // use system's default GUI font by default: + m_htmlParser->SetStandardFonts(); + } + + wxHtmlContainerCell *cell = (wxHtmlContainerCell *)m_htmlParser-> + Parse(OnGetItemMarkup(n)); + wxCHECK_RET( cell, _T("wxHtmlParser::Parse() returned NULL?") ); + + // set the cell's ID to item's index so that CellCoordsToPhysical() + // can quickly find the item: + cell->SetId(wxString::Format(_T("%lu"), (unsigned long)n)); + + cell->Layout(GetClientSize().x - 2*GetMargins().x); + + m_cache->Store(n, cell); + } +} + +void wxHtmlListBox::OnSize(wxSizeEvent& event) +{ + // we need to relayout all the cached cells + m_cache->Clear(); + + event.Skip(); +} + +void wxHtmlListBox::RefreshLine(size_t line) +{ + m_cache->InvalidateRange(line, line); + + wxVListBox::RefreshLine(line); +} + +void wxHtmlListBox::RefreshLines(size_t from, size_t to) +{ + m_cache->InvalidateRange(from, to); + + wxVListBox::RefreshLines(from, to); +} + +void wxHtmlListBox::RefreshAll() +{ + m_cache->Clear(); + + wxVListBox::RefreshAll(); +} + +void wxHtmlListBox::SetItemCount(size_t count) +{ + // the items are going to change, forget the old ones + m_cache->Clear(); + + wxVListBox::SetItemCount(count); +} + +// ---------------------------------------------------------------------------- +// wxHtmlListBox implementation of wxVListBox pure virtuals +// ---------------------------------------------------------------------------- + +void wxHtmlListBox::OnDrawItem(wxDC& dc, const wxRect& rect, size_t n) const +{ + CacheItem(n); + + wxHtmlCell *cell = m_cache->Get(n); + wxCHECK_RET( cell, _T("this cell should be cached!") ); + + wxHtmlRenderingInfo htmlRendInfo; + + // draw the selected cell in selected state + if ( IsSelected(n) ) + { + wxHtmlSelection htmlSel; + htmlSel.Set(wxPoint(0,0), cell, wxPoint(INT_MAX, INT_MAX), cell); + htmlRendInfo.SetSelection(&htmlSel); + if ( m_htmlRendStyle ) + htmlRendInfo.SetStyle(m_htmlRendStyle); + htmlRendInfo.GetState().SetSelectionState(wxHTML_SEL_IN); + } + + // note that we can't stop drawing exactly at the window boundary as then + // even the visible cells part could be not drawn, so always draw the + // entire cell + cell->Draw(dc, + rect.x + CELL_BORDER, rect.y + CELL_BORDER, + 0, INT_MAX, htmlRendInfo); +} + +wxCoord wxHtmlListBox::OnMeasureItem(size_t n) const +{ + CacheItem(n); + + wxHtmlCell *cell = m_cache->Get(n); + wxCHECK_MSG( cell, 0, _T("this cell should be cached!") ); + + return cell->GetHeight() + cell->GetDescent() + 4; +} + +// ---------------------------------------------------------------------------- +// wxHtmlListBox implementation of wxHtmlListBoxWinInterface +// ---------------------------------------------------------------------------- + +void wxHtmlListBox::SetHTMLWindowTitle(const wxString& WXUNUSED(title)) +{ + // nothing to do +} + +void wxHtmlListBox::OnHTMLLinkClicked(const wxHtmlLinkInfo& link) +{ + OnLinkClicked(GetItemForCell(link.GetHtmlCell()), link); +} + +void wxHtmlListBox::OnLinkClicked(size_t WXUNUSED(n), + const wxHtmlLinkInfo& link) +{ + wxHtmlLinkEvent event(GetId(), link); + GetEventHandler()->ProcessEvent(event); +} + +wxHtmlOpeningStatus +wxHtmlListBox::OnHTMLOpeningURL(wxHtmlURLType WXUNUSED(type), + const wxString& WXUNUSED(url), + wxString *WXUNUSED(redirect)) const +{ + return wxHTML_OPEN; +} + +wxPoint wxHtmlListBox::HTMLCoordsToWindow(wxHtmlCell *cell, + const wxPoint& pos) const +{ + return CellCoordsToPhysical(pos, cell); +} + +wxWindow* wxHtmlListBox::GetHTMLWindow() { return this; } + +wxColour wxHtmlListBox::GetHTMLBackgroundColour() const +{ + return GetBackgroundColour(); +} + +void wxHtmlListBox::SetHTMLBackgroundColour(const wxColour& WXUNUSED(clr)) +{ + // nothing to do +} + +void wxHtmlListBox::SetHTMLBackgroundImage(const wxBitmap& WXUNUSED(bmpBg)) +{ + // nothing to do +} + +void wxHtmlListBox::SetHTMLStatusText(const wxString& WXUNUSED(text)) +{ + // nothing to do +} + +wxCursor wxHtmlListBox::GetHTMLCursor(HTMLCursor type) const +{ + // we don't want to show text selection cursor in listboxes + if (type == HTMLCursor_Text) + return wxHtmlWindow::GetDefaultHTMLCursor(HTMLCursor_Default); + + // in all other cases, use the same cursor as wxHtmlWindow: + return wxHtmlWindow::GetDefaultHTMLCursor(type); +} + +// ---------------------------------------------------------------------------- +// wxHtmlListBox handling of HTML links +// ---------------------------------------------------------------------------- + +wxPoint wxHtmlListBox::GetRootCellCoords(size_t n) const +{ + wxPoint pos(CELL_BORDER, CELL_BORDER); + pos += GetMargins(); + pos.y += GetLinesHeight(GetFirstVisibleLine(), n); + return pos; +} + +bool wxHtmlListBox::PhysicalCoordsToCell(wxPoint& pos, wxHtmlCell*& cell) const +{ + int n = HitTest(pos); + if ( n == wxNOT_FOUND ) + return false; + + // convert mouse coordinates to coords relative to item's wxHtmlCell: + pos -= GetRootCellCoords(n); + + CacheItem(n); + cell = m_cache->Get(n); + + return true; +} + +size_t wxHtmlListBox::GetItemForCell(const wxHtmlCell *cell) const +{ + wxCHECK_MSG( cell, 0, _T("no cell") ); + + cell = cell->GetRootCell(); + + wxCHECK_MSG( cell, 0, _T("no root cell") ); + + // the cell's ID contains item index, see CacheItem(): + unsigned long n; + if ( !cell->GetId().ToULong(&n) ) + { + wxFAIL_MSG( _T("unexpected root cell's ID") ); + return 0; + } + + return n; +} + +wxPoint +wxHtmlListBox::CellCoordsToPhysical(const wxPoint& pos, wxHtmlCell *cell) const +{ + return pos + GetRootCellCoords(GetItemForCell(cell)); +} + +void wxHtmlListBox::OnInternalIdle() +{ + wxVListBox::OnInternalIdle(); + + if ( wxHtmlWindowMouseHelper::DidMouseMove() ) + { + wxPoint pos = ScreenToClient(wxGetMousePosition()); + wxHtmlCell *cell; + + if ( !PhysicalCoordsToCell(pos, cell) ) + return; + + wxHtmlWindowMouseHelper::HandleIdle(cell, pos); + } +} + +void wxHtmlListBox::OnMouseMove(wxMouseEvent& event) +{ + wxHtmlWindowMouseHelper::HandleMouseMoved(); + event.Skip(); +} + +void wxHtmlListBox::OnLeftDown(wxMouseEvent& event) +{ + wxPoint pos = event.GetPosition(); + wxHtmlCell *cell; + + if ( !PhysicalCoordsToCell(pos, cell) ) + { + event.Skip(); + return; + } + + if ( !wxHtmlWindowMouseHelper::HandleMouseClick(cell, pos, event) ) + { + // no link was clicked, so let the listbox code handle the click (e.g. + // by selecting another item in the list): + event.Skip(); + } +} + + +// ---------------------------------------------------------------------------- +// wxSimpleHtmlListBox +// ---------------------------------------------------------------------------- + +bool wxSimpleHtmlListBox::Create(wxWindow *parent, wxWindowID id, + const wxPoint& pos, + const wxSize& size, + int n, const wxString choices[], + long style, + const wxValidator& validator, + const wxString& name) +{ + if (!wxHtmlListBox::Create(parent, id, pos, size, style, name)) + return false; + +#if wxUSE_VALIDATORS + SetValidator(validator); +#endif + for (int i=0; iIsFrozen()) + RefreshAll(); +} + +#endif // wxUSE_HTML diff --git a/Externals/wxWidgets/src/generic/hyperlink.cpp b/Externals/wxWidgets/src/generic/hyperlink.cpp new file mode 100644 index 0000000000..ec0e122fed --- /dev/null +++ b/Externals/wxWidgets/src/generic/hyperlink.cpp @@ -0,0 +1,284 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/generic/hyperlink.cpp +// Purpose: Hyperlink control +// Author: David Norris , Otto Wyss +// Modified by: Ryan Norton, Francesco Montorsi +// Created: 04/02/2005 +// RCS-ID: $Id: hyperlink.cpp 42816 2006-10-31 08:50:17Z RD $ +// Copyright: (c) 2005 David Norris +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +//--------------------------------------------------------------------------- +// Pre-compiled header stuff +//--------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_HYPERLINKCTRL + +//--------------------------------------------------------------------------- +// Includes +//--------------------------------------------------------------------------- + +#include "wx/hyperlink.h" + +#ifndef WX_PRECOMP + #include "wx/utils.h" // for wxLaunchDefaultBrowser + #include "wx/dcclient.h" + #include "wx/menu.h" + #include "wx/log.h" + #include "wx/dataobj.h" +#endif + +#include "wx/clipbrd.h" + +// ============================================================================ +// implementation +// ============================================================================ + +IMPLEMENT_DYNAMIC_CLASS(wxHyperlinkCtrl, wxControl) +IMPLEMENT_DYNAMIC_CLASS(wxHyperlinkEvent, wxCommandEvent) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_HYPERLINK) + +// reserved for internal use only +#define wxHYPERLINKCTRL_POPUP_COPY_ID 16384 + +const wxChar wxHyperlinkCtrlNameStr[] = wxT("hyperlink"); + +// ---------------------------------------------------------------------------- +// wxHyperlinkCtrl +// ---------------------------------------------------------------------------- + +BEGIN_EVENT_TABLE(wxHyperlinkCtrl, wxControl) + EVT_PAINT(wxHyperlinkCtrl::OnPaint) + EVT_LEFT_DOWN(wxHyperlinkCtrl::OnLeftDown) + EVT_LEFT_UP(wxHyperlinkCtrl::OnLeftUp) + EVT_RIGHT_UP(wxHyperlinkCtrl::OnRightUp) + EVT_MOTION(wxHyperlinkCtrl::OnMotion) + EVT_LEAVE_WINDOW(wxHyperlinkCtrl::OnLeaveWindow) + EVT_SIZE(wxHyperlinkCtrl::OnSize) + + // for the context menu + EVT_MENU(wxHYPERLINKCTRL_POPUP_COPY_ID, wxHyperlinkCtrl::OnPopUpCopy) +END_EVENT_TABLE() + +bool wxHyperlinkCtrl::Create(wxWindow *parent, wxWindowID id, + const wxString& label, const wxString& url, const wxPoint& pos, + const wxSize& size, long style, const wxString& name) +{ + wxASSERT_MSG(!url.empty() || !label.empty(), + wxT("Both URL and label are empty ?")); + +#ifdef __WXDEBUG__ + int alignment = (int)((style & wxHL_ALIGN_LEFT) != 0) + + (int)((style & wxHL_ALIGN_CENTRE) != 0) + + (int)((style & wxHL_ALIGN_RIGHT) != 0); + wxASSERT_MSG(alignment == 1, + wxT("Specify exactly one align flag!")); +#endif + + if (!wxControl::Create(parent, id, pos, size, style, wxDefaultValidator, name)) + return false; + + // set to non empty strings both the url and the label + if(url.empty()) + SetURL(label); + else + SetURL(url); + + if(label.empty()) + SetLabel(url); + else + SetLabel(label); + + m_rollover = false; + m_clicking = false; + m_visited = false; + + // colours + m_normalColour = *wxBLUE; + m_hoverColour = *wxRED; + SetForegroundColour(m_normalColour); + + // by default the font of an hyperlink control is underlined + wxFont f = GetFont(); + f.SetUnderlined(true); + SetFont(f); + + SetInitialSize(size); + + return true; +} + +wxSize wxHyperlinkCtrl::DoGetBestSize() const +{ + int w, h; + + wxClientDC dc((wxWindow *)this); + dc.SetFont(GetFont()); + dc.GetTextExtent(GetLabel(), &w, &h); + + wxSize best(w, h); + CacheBestSize(best); + return best; +} + + +void wxHyperlinkCtrl::SetNormalColour(const wxColour &colour) +{ + m_normalColour = colour; + if (!m_visited) + { + SetForegroundColour(m_normalColour); + Refresh(); + } +} + +void wxHyperlinkCtrl::SetVisitedColour(const wxColour &colour) +{ + m_visitedColour = colour; + if (m_visited) + { + SetForegroundColour(m_visitedColour); + Refresh(); + } +} + +void wxHyperlinkCtrl::DoContextMenu(const wxPoint &pos) +{ + wxMenu *menuPopUp = new wxMenu(wxEmptyString, wxMENU_TEAROFF); + menuPopUp->Append(wxHYPERLINKCTRL_POPUP_COPY_ID, wxT("Copy URL")); + PopupMenu( menuPopUp, pos ); + delete menuPopUp; +} + +wxRect wxHyperlinkCtrl::GetLabelRect() const +{ + // our best size is always the size of the label without borders + wxSize c(GetClientSize()), b(GetBestSize()); + wxPoint offset; + + // the label is always centered vertically + offset.y = (c.GetHeight()-b.GetHeight())/2; + + if (HasFlag(wxHL_ALIGN_CENTRE)) + offset.x = (c.GetWidth()-b.GetWidth())/2; + else if (HasFlag(wxHL_ALIGN_RIGHT)) + offset.x = c.GetWidth()-b.GetWidth(); + else if (HasFlag(wxHL_ALIGN_LEFT)) + offset.x = 0; + return wxRect(offset, b); +} + + + +// ---------------------------------------------------------------------------- +// wxHyperlinkCtrl - event handlers +// ---------------------------------------------------------------------------- + +void wxHyperlinkCtrl::OnPaint(wxPaintEvent& WXUNUSED(event)) +{ + wxPaintDC dc(this); + dc.SetFont(GetFont()); + dc.SetTextForeground(GetForegroundColour()); + dc.SetTextBackground(GetBackgroundColour()); + + dc.DrawText(GetLabel(), GetLabelRect().GetTopLeft()); +} + +void wxHyperlinkCtrl::OnLeftDown(wxMouseEvent& event) +{ + // the left click must start from the hyperlink rect + m_clicking = GetLabelRect().Contains(event.GetPosition()); +} + +void wxHyperlinkCtrl::OnLeftUp(wxMouseEvent& event) +{ + // the click must be started and ended in the hyperlink rect + if (!m_clicking || !GetLabelRect().Contains(event.GetPosition())) + return; + + SetForegroundColour(m_visitedColour); + m_visited = true; + m_clicking = false; + + // send the event + wxHyperlinkEvent linkEvent(this, GetId(), m_url); + if (!GetEventHandler()->ProcessEvent(linkEvent)) // was the event skipped ? + if (!wxLaunchDefaultBrowser(m_url)) + wxLogWarning(wxT("Could not launch the default browser with url '%s' !"), m_url.c_str()); +} + +void wxHyperlinkCtrl::OnRightUp(wxMouseEvent& event) +{ + if( GetWindowStyle() & wxHL_CONTEXTMENU ) + if ( GetLabelRect().Contains(event.GetPosition()) ) + DoContextMenu(wxPoint(event.m_x, event.m_y)); +} + +void wxHyperlinkCtrl::OnMotion(wxMouseEvent& event) +{ + wxRect textrc = GetLabelRect(); + + if (textrc.Contains(event.GetPosition())) + { + SetCursor(wxCursor(wxCURSOR_HAND)); + SetForegroundColour(m_hoverColour); + m_rollover = true; + Refresh(); + } + else if (m_rollover) + { + SetCursor(*wxSTANDARD_CURSOR); + SetForegroundColour(!m_visited ? m_normalColour : m_visitedColour); + m_rollover = false; + Refresh(); + } +} + +void wxHyperlinkCtrl::OnLeaveWindow(wxMouseEvent& WXUNUSED(event) ) +{ + // NB: when the label rect and the client size rect have the same + // height this function is indispensable to remove the "rollover" + // effect as the OnMotion() event handler could not be called + // in that case moving the mouse out of the label vertically... + + if (m_rollover) + { + SetCursor(*wxSTANDARD_CURSOR); + SetForegroundColour(!m_visited ? m_normalColour : m_visitedColour); + m_rollover = false; + Refresh(); + } +} + +void wxHyperlinkCtrl::OnPopUpCopy( wxCommandEvent& WXUNUSED(event) ) +{ +#if wxUSE_CLIPBOARD + if (!wxTheClipboard->Open()) + return; + + wxTextDataObject *data = new wxTextDataObject( m_url ); + wxTheClipboard->SetData( data ); + wxTheClipboard->Close(); +#endif // wxUSE_CLIPBOARD +} + +void wxHyperlinkCtrl::OnSize(wxSizeEvent& WXUNUSED(event)) +{ + // update the position of the label in the screen respecting + // the selected align flag + Refresh(); +} + +#endif // wxUSE_HYPERLINKCTRL diff --git a/Externals/wxWidgets/src/generic/icon.cpp b/Externals/wxWidgets/src/generic/icon.cpp new file mode 100644 index 0000000000..d1c18d57da --- /dev/null +++ b/Externals/wxWidgets/src/generic/icon.cpp @@ -0,0 +1,45 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/generic/icon.cpp +// Purpose: wxIcon implementation for ports where it's same as wxBitmap +// Author: Julian Smart +// Modified by: +// Created: 17/09/98 +// RCS-ID: $Id: icon.cpp 40531 2006-08-09 17:59:30Z VS $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// for compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#include "wx/icon.h" + +//----------------------------------------------------------------------------- +// wxIcon +//----------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxIcon, wxBitmap) + +wxIcon::wxIcon( const char **bits, int WXUNUSED(width), int WXUNUSED(height) ) : + wxBitmap( bits ) +{ +} + +wxIcon::wxIcon( char **bits, int WXUNUSED(width), int WXUNUSED(height) ) : + wxBitmap( bits ) +{ +} + +wxIcon::wxIcon() : wxBitmap() +{ +} + +void wxIcon::CopyFromBitmap(const wxBitmap& bmp) +{ + wxIcon *icon = (wxIcon*)(&bmp); + *this = *icon; +} diff --git a/Externals/wxWidgets/src/generic/imaglist.cpp b/Externals/wxWidgets/src/generic/imaglist.cpp new file mode 100644 index 0000000000..97a82e0a8e --- /dev/null +++ b/Externals/wxWidgets/src/generic/imaglist.cpp @@ -0,0 +1,276 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/generic/imaglist.cpp +// Purpose: +// Author: Robert Roebling +// Id: $id$ +// Copyright: (c) 1998 Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_IMAGLIST && !defined(wxHAS_NATIVE_IMAGELIST) + +#ifndef __WXPALMOS__ + +#include "wx/imaglist.h" + +#ifndef WX_PRECOMP + #include "wx/dc.h" + #include "wx/icon.h" + #include "wx/image.h" +#endif + +//----------------------------------------------------------------------------- +// wxImageList +//----------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxGenericImageList, wxObject) +IMPLEMENT_DYNAMIC_CLASS(wxImageList, wxGenericImageList) + +wxGenericImageList::wxGenericImageList( int width, int height, bool mask, int initialCount ) +{ + (void)Create(width, height, mask, initialCount); +} + +wxGenericImageList::~wxGenericImageList() +{ + (void)RemoveAll(); +} + +int wxGenericImageList::GetImageCount() const +{ + return m_images.GetCount(); +} + +bool wxGenericImageList::Create( int width, int height, bool WXUNUSED(mask), int WXUNUSED(initialCount) ) +{ + m_width = width; + m_height = height; + + return Create(); +} + +bool wxGenericImageList::Create() +{ + return true; +} + +int wxGenericImageList::Add( const wxBitmap &bitmap ) +{ + wxASSERT_MSG( (bitmap.GetWidth() >= m_width && bitmap.GetHeight() == m_height) + || (m_width == 0 && m_height == 0), + _T("invalid bitmap size in wxImageList: this might work ") + _T("on this platform but definitely won't under Windows.") ); + + if (bitmap.IsKindOf(CLASSINFO(wxIcon))) + { + m_images.Append( new wxIcon( (const wxIcon&) bitmap ) ); + } + else + { + // Mimic behavior of Windows ImageList_Add that automatically breaks up the added + // bitmap into sub-images of the correct size + if (m_width > 0 && bitmap.GetWidth() > m_width && bitmap.GetHeight() >= m_height) + { + int numImages = bitmap.GetWidth() / m_width; + for (int subIndex = 0; subIndex < numImages; subIndex++) + { + wxRect rect(m_width * subIndex, 0, m_width, m_height); + wxBitmap tmpBmp = bitmap.GetSubBitmap(rect); + m_images.Append( new wxBitmap(tmpBmp) ); + } + } + else + { + m_images.Append( new wxBitmap(bitmap) ); + } + } + + if (m_width == 0 && m_height == 0) + { + m_width = bitmap.GetWidth(); + m_height = bitmap.GetHeight(); + } + + return m_images.GetCount()-1; +} + +int wxGenericImageList::Add( const wxBitmap& bitmap, const wxBitmap& mask ) +{ + wxBitmap bmp(bitmap); + if (mask.Ok()) + bmp.SetMask(new wxMask(mask)); + return Add(bmp); +} + +int wxGenericImageList::Add( const wxBitmap& bitmap, const wxColour& maskColour ) +{ + wxImage img = bitmap.ConvertToImage(); + img.SetMaskColour(maskColour.Red(), maskColour.Green(), maskColour.Blue()); + return Add(wxBitmap(img)); +} + +const wxBitmap *wxGenericImageList::GetBitmapPtr( int index ) const +{ + wxList::compatibility_iterator node = m_images.Item( index ); + + wxCHECK_MSG( node, (wxBitmap *) NULL, wxT("wrong index in image list") ); + + return (wxBitmap*)node->GetData(); +} + +// Get the bitmap +wxBitmap wxGenericImageList::GetBitmap(int index) const +{ + const wxBitmap* bmp = GetBitmapPtr(index); + if (bmp) + return *bmp; + else + return wxNullBitmap; +} + +// Get the icon +wxIcon wxGenericImageList::GetIcon(int index) const +{ + const wxBitmap* bmp = GetBitmapPtr(index); + if (bmp) + { + wxIcon icon; + icon.CopyFromBitmap(*bmp); + return icon; + } + else + return wxNullIcon; +} + +bool wxGenericImageList::Replace( int index, const wxBitmap &bitmap ) +{ + wxList::compatibility_iterator node = m_images.Item( index ); + + wxCHECK_MSG( node, false, wxT("wrong index in image list") ); + + wxBitmap* newBitmap = (bitmap.IsKindOf(CLASSINFO(wxIcon))) ? + #if defined(__VISAGECPP__) + //just can't do this in VisualAge now, with all this new Bitmap-Icon stuff + //so construct it from a bitmap object until I can figure this nonsense out. (DW) + new wxBitmap(bitmap) + #else + new wxBitmap( (const wxIcon&) bitmap ) + #endif + : new wxBitmap(bitmap) ; + + if (index == (int) m_images.GetCount() - 1) + { + delete node->GetData(); + m_images.Erase( node ); + m_images.Append( newBitmap ); + } + else + { + wxList::compatibility_iterator next = node->GetNext(); + delete node->GetData(); + m_images.Erase( node ); + m_images.Insert( next, newBitmap ); + } + + return true; +} + +bool wxGenericImageList::Replace( int index, const wxBitmap &bitmap, const wxBitmap &mask ) +{ + wxList::compatibility_iterator node = m_images.Item( index ); + + wxCHECK_MSG( node, false, wxT("wrong index in image list") ); + + wxBitmap* newBitmap = (bitmap.IsKindOf(CLASSINFO(wxIcon))) ? + #if defined(__VISAGECPP__) + //just can't do this in VisualAge now, with all this new Bitmap-Icon stuff + //so construct it from a bitmap object until I can figure this nonsense out. (DW) + new wxBitmap(bitmap) + #else + new wxBitmap( (const wxIcon&) bitmap ) + #endif + : new wxBitmap(bitmap) ; + + if (index == (int) m_images.GetCount() - 1) + { + delete node->GetData(); + m_images.Erase( node ); + m_images.Append( newBitmap ); + } + else + { + wxList::compatibility_iterator next = node->GetNext(); + delete node->GetData(); + m_images.Erase( node ); + m_images.Insert( next, newBitmap ); + } + + if (mask.Ok()) + newBitmap->SetMask(new wxMask(mask)); + + return true; +} + +bool wxGenericImageList::Remove( int index ) +{ + wxList::compatibility_iterator node = m_images.Item( index ); + + wxCHECK_MSG( node, false, wxT("wrong index in image list") ); + + delete node->GetData(); + m_images.Erase( node ); + + return true; +} + +bool wxGenericImageList::RemoveAll() +{ + WX_CLEAR_LIST(wxList, m_images); + m_images.Clear(); + + return true; +} + +bool wxGenericImageList::GetSize( int index, int &width, int &height ) const +{ + width = 0; + height = 0; + + wxList::compatibility_iterator node = m_images.Item( index ); + + wxCHECK_MSG( node, false, wxT("wrong index in image list") ); + + wxBitmap *bm = (wxBitmap*)node->GetData(); + width = bm->GetWidth(); + height = bm->GetHeight(); + + return true; +} + +bool wxGenericImageList::Draw( int index, wxDC &dc, int x, int y, + int flags, bool WXUNUSED(solidBackground) ) +{ + wxList::compatibility_iterator node = m_images.Item( index ); + + wxCHECK_MSG( node, false, wxT("wrong index in image list") ); + + wxBitmap *bm = (wxBitmap*)node->GetData(); + + if (bm->IsKindOf(CLASSINFO(wxIcon))) + dc.DrawIcon( * ((wxIcon*) bm), x, y); + else + dc.DrawBitmap( *bm, x, y, (flags & wxIMAGELIST_DRAW_TRANSPARENT) > 0 ); + + return true; +} + +#endif // __WXPALMOS__ + +#endif // wxUSE_IMAGLIST diff --git a/Externals/wxWidgets/src/generic/laywin.cpp b/Externals/wxWidgets/src/generic/laywin.cpp new file mode 100644 index 0000000000..e7e501b5d0 --- /dev/null +++ b/Externals/wxWidgets/src/generic/laywin.cpp @@ -0,0 +1,341 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: laywin.cpp +// Purpose: Implements a simple layout algorithm, plus +// wxSashLayoutWindow which is an example of a window with +// layout-awareness (via event handlers). This is suited to +// IDE-style window layout. +// Author: Julian Smart +// Modified by: +// Created: 04/01/98 +// RCS-ID: $Id: laywin.cpp 35688 2005-09-25 19:59:19Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx/wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ +#pragma hdrstop +#endif + +#ifndef WX_PRECOMP + #include "wx/frame.h" + #include "wx/mdi.h" +#endif + +#include "wx/laywin.h" + +IMPLEMENT_DYNAMIC_CLASS(wxQueryLayoutInfoEvent, wxEvent) +IMPLEMENT_DYNAMIC_CLASS(wxCalculateLayoutEvent, wxEvent) + +DEFINE_EVENT_TYPE(wxEVT_QUERY_LAYOUT_INFO) +DEFINE_EVENT_TYPE(wxEVT_CALCULATE_LAYOUT) + +#if wxUSE_SASH +IMPLEMENT_CLASS(wxSashLayoutWindow, wxSashWindow) + +BEGIN_EVENT_TABLE(wxSashLayoutWindow, wxSashWindow) + EVT_CALCULATE_LAYOUT(wxSashLayoutWindow::OnCalculateLayout) + EVT_QUERY_LAYOUT_INFO(wxSashLayoutWindow::OnQueryLayoutInfo) +END_EVENT_TABLE() + +bool wxSashLayoutWindow::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, + const wxSize& size, long style, const wxString& name) +{ + return wxSashWindow::Create(parent, id, pos, size, style, name); +} + +void wxSashLayoutWindow::Init() +{ + m_orientation = wxLAYOUT_HORIZONTAL; + m_alignment = wxLAYOUT_TOP; +#ifdef __WXMAC__ + MacSetClipChildren( true ) ; +#endif +} + +// This is the function that wxLayoutAlgorithm calls to ascertain the window +// dimensions. +void wxSashLayoutWindow::OnQueryLayoutInfo(wxQueryLayoutInfoEvent& event) +{ + // int flags = event.GetFlags(); + int requestedLength = event.GetRequestedLength(); + + event.SetOrientation(m_orientation); + event.SetAlignment(m_alignment); + + if (m_orientation == wxLAYOUT_HORIZONTAL) + event.SetSize(wxSize(requestedLength, m_defaultSize.y)); + else + event.SetSize(wxSize(m_defaultSize.x, requestedLength)); +} + +// Called by parent to allow window to take a bit out of the +// client rectangle, and size itself if not in wxLAYOUT_QUERY mode. + +void wxSashLayoutWindow::OnCalculateLayout(wxCalculateLayoutEvent& event) +{ + wxRect clientSize(event.GetRect()); + + int flags = event.GetFlags(); + + if (!IsShown()) + return; + + // Let's assume that all windows stretch the full extent of the window in + // the direction of that window orientation. This will work for non-docking toolbars, + // and the status bar. Note that the windows have to have been created in a certain + // order to work, else you might get a left-aligned window going to the bottom + // of the window, and the status bar appearing to the right of it. The + // status bar would have to be created after or before the toolbar(s). + + wxRect thisRect; + + // Try to stretch + int length = (GetOrientation() == wxLAYOUT_HORIZONTAL) ? clientSize.width : clientSize.height; + wxLayoutOrientation orient = GetOrientation(); + + // We assume that a window that says it's horizontal, wants to be stretched in that + // direction. Is this distinction too fine? Do we assume that any horizontal + // window needs to be stretched in that direction? Possibly. + int whichDimension = (GetOrientation() == wxLAYOUT_HORIZONTAL) ? wxLAYOUT_LENGTH_X : wxLAYOUT_LENGTH_Y; + + wxQueryLayoutInfoEvent infoEvent(GetId()); + infoEvent.SetEventObject(this); + infoEvent.SetRequestedLength(length); + infoEvent.SetFlags(orient | whichDimension); + + if (!GetEventHandler()->ProcessEvent(infoEvent)) + return; + + wxSize sz = infoEvent.GetSize(); + + if (sz.x == 0 && sz.y == 0) // Assume it's invisible + return; + + // Now we know the size it wants to be. We wish to decide where to place it, i.e. + // how it's aligned. + switch (GetAlignment()) + { + case wxLAYOUT_TOP: + { + thisRect.x = clientSize.x; thisRect.y = clientSize.y; + thisRect.width = sz.x; thisRect.height = sz.y; + clientSize.y += thisRect.height; + clientSize.height -= thisRect.height; + break; + } + case wxLAYOUT_LEFT: + { + thisRect.x = clientSize.x; thisRect.y = clientSize.y; + thisRect.width = sz.x; thisRect.height = sz.y; + clientSize.x += thisRect.width; + clientSize.width -= thisRect.width; + break; + } + case wxLAYOUT_RIGHT: + { + thisRect.x = clientSize.x + (clientSize.width - sz.x); thisRect.y = clientSize.y; + thisRect.width = sz.x; thisRect.height = sz.y; + clientSize.width -= thisRect.width; + break; + } + case wxLAYOUT_BOTTOM: + { + thisRect.x = clientSize.x; thisRect.y = clientSize.y + (clientSize.height - sz.y); + thisRect.width = sz.x; thisRect.height = sz.y; + clientSize.height -= thisRect.height; + break; + } + case wxLAYOUT_NONE: + { + break; + } + + } + + if ((flags & wxLAYOUT_QUERY) == 0) + { + // If not in query mode, resize the window. + // TODO: add wxRect& form to wxWindow::SetSize + wxSize sz2 = GetSize(); + wxPoint pos = GetPosition(); + SetSize(thisRect.x, thisRect.y, thisRect.width, thisRect.height); + + // Make sure the sash is erased when the window is resized + if ((pos.x != thisRect.x || pos.y != thisRect.y || sz2.x != thisRect.width || sz2.y != thisRect.height) && + (GetSashVisible(wxSASH_TOP) || GetSashVisible(wxSASH_RIGHT) || GetSashVisible(wxSASH_BOTTOM) || GetSashVisible(wxSASH_LEFT))) + Refresh(true); + + } + + event.SetRect(clientSize); +} +#endif // wxUSE_SASH + +/* + * wxLayoutAlgorithm + */ + +#if wxUSE_MDI_ARCHITECTURE + +// Lays out windows for an MDI frame. The MDI client area gets what's left +// over. +bool wxLayoutAlgorithm::LayoutMDIFrame(wxMDIParentFrame* frame, wxRect* r) +{ + int cw, ch; + frame->GetClientSize(& cw, & ch); + + wxRect rect(0, 0, cw, ch); + if (r) + rect = * r; + + wxCalculateLayoutEvent event; + event.SetRect(rect); + + wxWindowList::compatibility_iterator node = frame->GetChildren().GetFirst(); + while (node) + { + wxWindow* win = node->GetData(); + + event.SetId(win->GetId()); + event.SetEventObject(win); + event.SetFlags(0); // ?? + + win->GetEventHandler()->ProcessEvent(event); + + node = node->GetNext(); + } + + wxWindow* clientWindow = frame->GetClientWindow(); + + rect = event.GetRect(); + + clientWindow->SetSize(rect.x, rect.y, rect.width, rect.height); + + return true; +} + +#endif // wxUSE_MDI_ARCHITECTURE + +bool wxLayoutAlgorithm::LayoutFrame(wxFrame* frame, wxWindow* mainWindow) +{ + return LayoutWindow(frame, mainWindow); +} + +// Layout algorithm for any window. mainWindow gets what's left over. +bool wxLayoutAlgorithm::LayoutWindow(wxWindow* parent, wxWindow* mainWindow) +{ + // Test if the parent is a sash window, and if so, + // reduce the available space to allow space for any active edges. + + int leftMargin = 0, rightMargin = 0, topMargin = 0, bottomMargin = 0; +#if wxUSE_SASH + if (parent->IsKindOf(CLASSINFO(wxSashWindow))) + { + wxSashWindow* sashWindow = (wxSashWindow*) parent; + + leftMargin = sashWindow->GetExtraBorderSize(); + rightMargin = sashWindow->GetExtraBorderSize(); + topMargin = sashWindow->GetExtraBorderSize(); + bottomMargin = sashWindow->GetExtraBorderSize(); + + if (sashWindow->GetSashVisible(wxSASH_LEFT)) + leftMargin += sashWindow->GetDefaultBorderSize(); + if (sashWindow->GetSashVisible(wxSASH_RIGHT)) + rightMargin += sashWindow->GetDefaultBorderSize(); + if (sashWindow->GetSashVisible(wxSASH_TOP)) + topMargin += sashWindow->GetDefaultBorderSize(); + if (sashWindow->GetSashVisible(wxSASH_BOTTOM)) + bottomMargin += sashWindow->GetDefaultBorderSize(); + } +#endif // wxUSE_SASH + + int cw, ch; + parent->GetClientSize(& cw, & ch); + + wxRect rect(leftMargin, topMargin, cw - leftMargin - rightMargin, ch - topMargin - bottomMargin); + + wxCalculateLayoutEvent event; + event.SetRect(rect); + + // Find the last layout-aware window, so we can make it fill all remaining + // space. + wxWindow *lastAwareWindow = NULL; + wxWindowList::compatibility_iterator node = parent->GetChildren().GetFirst(); + + while (node) + { + wxWindow* win = node->GetData(); + + if (win->IsShown()) + { + wxCalculateLayoutEvent tempEvent(win->GetId()); + tempEvent.SetEventObject(win); + tempEvent.SetFlags(wxLAYOUT_QUERY); + tempEvent.SetRect(event.GetRect()); + if (win->GetEventHandler()->ProcessEvent(tempEvent)) + lastAwareWindow = win; + } + + node = node->GetNext(); + } + + // Now do a dummy run to see if we have any space left for the final window (fail if not) + node = parent->GetChildren().GetFirst(); + while (node) + { + wxWindow* win = node->GetData(); + + // If mainWindow is NULL and we're at the last window, + // skip this, because we'll simply make it fit the remaining space. + if (win->IsShown() && (win != mainWindow) && (mainWindow != NULL || win != lastAwareWindow)) + { + event.SetId(win->GetId()); + event.SetEventObject(win); + event.SetFlags(wxLAYOUT_QUERY); + + win->GetEventHandler()->ProcessEvent(event); + } + + node = node->GetNext(); + } + + if (event.GetRect().GetWidth() < 0 || event.GetRect().GetHeight() < 0) + return false; + + event.SetRect(rect); + + node = parent->GetChildren().GetFirst(); + while (node) + { + wxWindow* win = node->GetData(); + + // If mainWindow is NULL and we're at the last window, + // skip this, because we'll simply make it fit the remaining space. + if (win->IsShown() && (win != mainWindow) && (mainWindow != NULL || win != lastAwareWindow)) + { + event.SetId(win->GetId()); + event.SetEventObject(win); + event.SetFlags(0); // ?? + + win->GetEventHandler()->ProcessEvent(event); + } + + node = node->GetNext(); + } + + rect = event.GetRect(); + + if (mainWindow) + mainWindow->SetSize(rect.x, rect.y, wxMax(0, rect.width), wxMax(0, rect.height)); + else if (lastAwareWindow) + { + // Fit the remaining space + lastAwareWindow->SetSize(rect.x, rect.y, wxMax(0, rect.width), wxMax(0, rect.height)); + } + + return true; +} + diff --git a/Externals/wxWidgets/src/generic/listbkg.cpp b/Externals/wxWidgets/src/generic/listbkg.cpp new file mode 100644 index 0000000000..50a6ea40e9 --- /dev/null +++ b/Externals/wxWidgets/src/generic/listbkg.cpp @@ -0,0 +1,416 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/generic/listbkg.cpp +// Purpose: generic implementation of wxListbook +// Author: Vadim Zeitlin +// Modified by: +// Created: 19.08.03 +// RCS-ID: $Id: listbkg.cpp 48783 2007-09-19 11:24:38Z RR $ +// Copyright: (c) 2003 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_LISTBOOK + +#include "wx/listbook.h" + +#ifndef WX_PRECOMP + #include "wx/settings.h" +#endif + +#include "wx/listctrl.h" +#include "wx/statline.h" +#include "wx/imaglist.h" + +// ---------------------------------------------------------------------------- +// various wxWidgets macros +// ---------------------------------------------------------------------------- + +// check that the page index is valid +#define IS_VALID_PAGE(nPage) ((nPage) < GetPageCount()) + +// ---------------------------------------------------------------------------- +// event table +// ---------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxListbook, wxBookCtrlBase) +IMPLEMENT_DYNAMIC_CLASS(wxListbookEvent, wxNotifyEvent) + +#if !WXWIN_COMPATIBILITY_EVENT_TYPES +const wxEventType wxEVT_COMMAND_LISTBOOK_PAGE_CHANGING = wxNewEventType(); +const wxEventType wxEVT_COMMAND_LISTBOOK_PAGE_CHANGED = wxNewEventType(); +#endif + +BEGIN_EVENT_TABLE(wxListbook, wxBookCtrlBase) + EVT_SIZE(wxListbook::OnSize) + EVT_LIST_ITEM_SELECTED(wxID_ANY, wxListbook::OnListSelected) +END_EVENT_TABLE() + +// ============================================================================ +// wxListbook implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxListbook creation +// ---------------------------------------------------------------------------- + +void wxListbook::Init() +{ + m_selection = wxNOT_FOUND; +} + +bool +wxListbook::Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + long style, + const wxString& name) +{ + if ( (style & wxBK_ALIGN_MASK) == wxBK_DEFAULT ) + { +#ifdef __WXMAC__ + style |= wxBK_TOP; +#else // !__WXMAC__ + style |= wxBK_LEFT; +#endif // __WXMAC__/!__WXMAC__ + } + + // no border for this control, it doesn't look nice together with + // wxListCtrl border + style &= ~wxBORDER_MASK; + style |= wxBORDER_NONE; + + if ( !wxControl::Create(parent, id, pos, size, style, + wxDefaultValidator, name) ) + return false; + + m_bookctrl = new wxListView + ( + this, + wxID_ANY, + wxDefaultPosition, + wxDefaultSize, + wxLC_ICON | wxLC_SINGLE_SEL | + (IsVertical() ? wxLC_ALIGN_LEFT : wxLC_ALIGN_TOP) + ); + +#ifdef __WXMSW__ + // On XP with themes enabled the GetViewRect used in GetControllerSize() to + // determine the space needed for the list view will incorrectly return + // (0,0,0,0) the first time. So send a pending event so OnSize will be + // called again after the window is ready to go. Technically we don't + // need to do this on non-XP windows, but if things are already sized + // correctly then nothing changes and so there is no harm. + wxSizeEvent evt; + GetEventHandler()->AddPendingEvent(evt); +#endif + return true; +} + +// ---------------------------------------------------------------------------- +// wxListbook geometry management +// ---------------------------------------------------------------------------- + +wxSize wxListbook::GetControllerSize() const +{ + const wxSize sizeClient = GetClientSize(), + sizeBorder = m_bookctrl->GetSize() - m_bookctrl->GetClientSize(), + sizeList = GetListView()->GetViewRect().GetSize() + sizeBorder; + + wxSize size; + + if ( IsVertical() ) + { + size.x = sizeClient.x; + size.y = sizeList.y; + } + else // left/right aligned + { + size.x = sizeList.x; + size.y = sizeClient.y; + } + + return size; +} + +void wxListbook::OnSize(wxSizeEvent& event) +{ + // arrange the icons before calling SetClientSize(), otherwise it wouldn't + // account for the scrollbars the list control might need and, at least + // under MSW, we'd finish with an ugly looking list control with both + // vertical and horizontal scrollbar (with one of them being added because + // the other one is not accounted for in client size computations) + wxListView *list = GetListView(); + if (list) list->Arrange(); + wxBookCtrlBase::OnSize(event); +} + +int wxListbook::HitTest(const wxPoint& pt, long *flags) const +{ + int pagePos = wxNOT_FOUND; + + if ( flags ) + *flags = wxBK_HITTEST_NOWHERE; + + // convert from listbook control coordinates to list control coordinates + const wxListView * const list = GetListView(); + const wxPoint listPt = list->ScreenToClient(ClientToScreen(pt)); + + // is the point inside list control? + if ( wxRect(list->GetSize()).Contains(listPt) ) + { + int flagsList; + pagePos = list->HitTest(listPt, flagsList); + + if ( flags ) + { + if ( pagePos != wxNOT_FOUND ) + *flags = 0; + + if ( flagsList & (wxLIST_HITTEST_ONITEMICON | + wxLIST_HITTEST_ONITEMSTATEICON ) ) + *flags |= wxBK_HITTEST_ONICON; + + if ( flagsList & wxLIST_HITTEST_ONITEMLABEL ) + *flags |= wxBK_HITTEST_ONLABEL; + } + } + else // not over list control at all + { + if ( flags && GetPageRect().Contains(pt) ) + *flags |= wxBK_HITTEST_ONPAGE; + } + + return pagePos; +} + +wxSize wxListbook::CalcSizeFromPage(const wxSize& sizePage) const +{ + // we need to add the size of the list control and the border between + const wxSize sizeList = GetControllerSize(); + + wxSize size = sizePage; + if ( IsVertical() ) + { + size.y += sizeList.y + GetInternalBorder(); + } + else // left/right aligned + { + size.x += sizeList.x + GetInternalBorder(); + } + + return size; +} + + +// ---------------------------------------------------------------------------- +// accessing the pages +// ---------------------------------------------------------------------------- + +bool wxListbook::SetPageText(size_t n, const wxString& strText) +{ + GetListView()->SetItemText(n, strText); + + return true; +} + +wxString wxListbook::GetPageText(size_t n) const +{ + return GetListView()->GetItemText(n); +} + +int wxListbook::GetPageImage(size_t WXUNUSED(n)) const +{ + wxFAIL_MSG( _T("wxListbook::GetPageImage() not implemented") ); + + return wxNOT_FOUND; +} + +bool wxListbook::SetPageImage(size_t n, int imageId) +{ + return GetListView()->SetItemImage(n, imageId); +} + +// ---------------------------------------------------------------------------- +// image list stuff +// ---------------------------------------------------------------------------- + +void wxListbook::SetImageList(wxImageList *imageList) +{ + GetListView()->SetImageList(imageList, wxIMAGE_LIST_NORMAL); + + wxBookCtrlBase::SetImageList(imageList); +} + +// ---------------------------------------------------------------------------- +// selection +// ---------------------------------------------------------------------------- + +void wxListbook::UpdateSelectedPage(size_t newsel) +{ + m_selection = newsel; + GetListView()->Select(newsel); + GetListView()->Focus(newsel); +} + +int wxListbook::GetSelection() const +{ + return m_selection; +} + +wxBookCtrlBaseEvent* wxListbook::CreatePageChangingEvent() const +{ + return new wxListbookEvent(wxEVT_COMMAND_LISTBOOK_PAGE_CHANGING, m_windowId); +} + +void wxListbook::MakeChangedEvent(wxBookCtrlBaseEvent &event) +{ + event.SetEventType(wxEVT_COMMAND_LISTBOOK_PAGE_CHANGED); +} + + +// ---------------------------------------------------------------------------- +// adding/removing the pages +// ---------------------------------------------------------------------------- + +bool +wxListbook::InsertPage(size_t n, + wxWindow *page, + const wxString& text, + bool bSelect, + int imageId) +{ + if ( !wxBookCtrlBase::InsertPage(n, page, text, bSelect, imageId) ) + return false; + + GetListView()->InsertItem(n, text, imageId); + + // if the inserted page is before the selected one, we must update the + // index of the selected page + if ( int(n) <= m_selection ) + { + // one extra page added + m_selection++; + GetListView()->Select(m_selection); + GetListView()->Focus(m_selection); + } + + // some page should be selected: either this one or the first one if there + // is still no selection + int selNew = -1; + if ( bSelect ) + selNew = n; + else if ( m_selection == -1 ) + selNew = 0; + + if ( selNew != m_selection ) + page->Hide(); + + if ( selNew != -1 ) + SetSelection(selNew); + + wxSizeEvent sz(GetSize(), GetId()); + GetEventHandler()->ProcessEvent(sz); + + return true; +} + +wxWindow *wxListbook::DoRemovePage(size_t page) +{ + const size_t page_count = GetPageCount(); + wxWindow *win = wxBookCtrlBase::DoRemovePage(page); + + if ( win ) + { + GetListView()->DeleteItem(page); + + if (m_selection >= (int)page) + { + // force new sel valid if possible + int sel = m_selection - 1; + if (page_count == 1) + sel = wxNOT_FOUND; + else if ((page_count == 2) || (sel == -1)) + sel = 0; + + // force sel invalid if deleting current page - don't try to hide it + m_selection = (m_selection == (int)page) ? wxNOT_FOUND : m_selection - 1; + + if ((sel != wxNOT_FOUND) && (sel != m_selection)) + SetSelection(sel); + } + + GetListView()->Arrange(); + if (GetPageCount() == 0) + { + wxSizeEvent sz(GetSize(), GetId()); + ProcessEvent(sz); + } + } + + return win; +} + + +bool wxListbook::DeleteAllPages() +{ + GetListView()->DeleteAllItems(); + if (!wxBookCtrlBase::DeleteAllPages()) + return false; + + m_selection = -1; + + wxSizeEvent sz(GetSize(), GetId()); + ProcessEvent(sz); + + return true; +} + +// ---------------------------------------------------------------------------- +// wxListbook events +// ---------------------------------------------------------------------------- + +void wxListbook::OnListSelected(wxListEvent& eventList) +{ + if ( eventList.GetEventObject() != m_bookctrl ) + { + eventList.Skip(); + return; + } + + const int selNew = eventList.GetIndex(); + + if ( selNew == m_selection ) + { + // this event can only come from our own Select(m_selection) below + // which we call when the page change is vetoed, so we should simply + // ignore it + return; + } + + SetSelection(selNew); + + // change wasn't allowed, return to previous state + if (m_selection != selNew) + { + GetListView()->Select(m_selection); + GetListView()->Focus(m_selection); + } +} + +#endif // wxUSE_LISTBOOK diff --git a/Externals/wxWidgets/src/generic/listctrl.cpp b/Externals/wxWidgets/src/generic/listctrl.cpp new file mode 100644 index 0000000000..6e765a0625 --- /dev/null +++ b/Externals/wxWidgets/src/generic/listctrl.cpp @@ -0,0 +1,5904 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/generic/listctrl.cpp +// Purpose: generic implementation of wxListCtrl +// Author: Robert Roebling +// Vadim Zeitlin (virtual list control support) +// Id: $Id: listctrl.cpp 49590 2007-11-01 20:41:30Z VZ $ +// Copyright: (c) 1998 Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// TODO +// +// 1. we need to implement searching/sorting for virtual controls somehow +// 2. when changing selection the lines are refreshed twice + + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_LISTCTRL + +#include "wx/listctrl.h" + +#if (!defined(__WXMSW__) || defined(__WXUNIVERSAL__)) && (!defined(__WXMAC__)|| defined(__WXUNIVERSAL__)) + // if we have a native version, its implementation file does all this + IMPLEMENT_DYNAMIC_CLASS(wxListItem, wxObject) + IMPLEMENT_DYNAMIC_CLASS(wxListView, wxListCtrl) + IMPLEMENT_DYNAMIC_CLASS(wxListEvent, wxNotifyEvent) + + IMPLEMENT_DYNAMIC_CLASS(wxListCtrl, wxGenericListCtrl) +#endif + +#ifndef WX_PRECOMP + #include "wx/scrolwin.h" + #include "wx/timer.h" + #include "wx/settings.h" + #include "wx/dynarray.h" + #include "wx/dcclient.h" + #include "wx/dcscreen.h" + #include "wx/math.h" +#endif + +#include "wx/imaglist.h" +#include "wx/selstore.h" +#include "wx/renderer.h" + +#ifdef __WXMAC__ + #include "wx/mac/private.h" +#endif + + +// NOTE: If using the wxListBox visual attributes works everywhere then this can +// be removed, as well as the #else case below. +#define _USE_VISATTR 0 + + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// // the height of the header window (FIXME: should depend on its font!) +// static const int HEADER_HEIGHT = 23; + +static const int SCROLL_UNIT_X = 15; + +// the spacing between the lines (in report mode) +static const int LINE_SPACING = 0; + +// extra margins around the text label +#ifdef __WXGTK__ +static const int EXTRA_WIDTH = 6; +#else +static const int EXTRA_WIDTH = 4; +#endif +static const int EXTRA_HEIGHT = 4; + +// margin between the window and the items +static const int EXTRA_BORDER_X = 2; +static const int EXTRA_BORDER_Y = 2; + +// offset for the header window +static const int HEADER_OFFSET_X = 0; +static const int HEADER_OFFSET_Y = 0; + +// margin between rows of icons in [small] icon view +static const int MARGIN_BETWEEN_ROWS = 6; + +// when autosizing the columns, add some slack +static const int AUTOSIZE_COL_MARGIN = 10; + +// default width for the header columns +static const int WIDTH_COL_DEFAULT = 80; + +// the space between the image and the text in the report mode +static const int IMAGE_MARGIN_IN_REPORT_MODE = 5; + +// the space between the image and the text in the report mode in header +static const int HEADER_IMAGE_MARGIN_IN_REPORT_MODE = 2; + +// ============================================================================ +// private classes +// ============================================================================ + +//----------------------------------------------------------------------------- +// wxColWidthInfo (internal) +//----------------------------------------------------------------------------- + +struct wxColWidthInfo +{ + int nMaxWidth; + bool bNeedsUpdate; // only set to true when an item whose + // width == nMaxWidth is removed + + wxColWidthInfo(int w = 0, bool needsUpdate = false) + { + nMaxWidth = w; + bNeedsUpdate = needsUpdate; + } +}; + +WX_DEFINE_ARRAY_PTR(wxColWidthInfo *, ColWidthArray); + +//----------------------------------------------------------------------------- +// wxListItemData (internal) +//----------------------------------------------------------------------------- + +class wxListItemData +{ +public: + wxListItemData(wxListMainWindow *owner); + ~wxListItemData(); + + void SetItem( const wxListItem &info ); + void SetImage( int image ) { m_image = image; } + void SetData( wxUIntPtr data ) { m_data = data; } + void SetPosition( int x, int y ); + void SetSize( int width, int height ); + + bool HasText() const { return !m_text.empty(); } + const wxString& GetText() const { return m_text; } + void SetText(const wxString& text) { m_text = text; } + + // we can't use empty string for measuring the string width/height, so + // always return something + wxString GetTextForMeasuring() const + { + wxString s = GetText(); + if ( s.empty() ) + s = _T('H'); + + return s; + } + + bool IsHit( int x, int y ) const; + + int GetX() const; + int GetY() const; + int GetWidth() const; + int GetHeight() const; + + int GetImage() const { return m_image; } + bool HasImage() const { return GetImage() != -1; } + + void GetItem( wxListItem &info ) const; + + void SetAttr(wxListItemAttr *attr) { m_attr = attr; } + wxListItemAttr *GetAttr() const { return m_attr; } + +public: + // the item image or -1 + int m_image; + + // user data associated with the item + wxUIntPtr m_data; + + // the item coordinates are not used in report mode; instead this pointer is + // NULL and the owner window is used to retrieve the item position and size + wxRect *m_rect; + + // the list ctrl we are in + wxListMainWindow *m_owner; + + // custom attributes or NULL + wxListItemAttr *m_attr; + +protected: + // common part of all ctors + void Init(); + + wxString m_text; +}; + +//----------------------------------------------------------------------------- +// wxListHeaderData (internal) +//----------------------------------------------------------------------------- + +class wxListHeaderData : public wxObject +{ +public: + wxListHeaderData(); + wxListHeaderData( const wxListItem &info ); + void SetItem( const wxListItem &item ); + void SetPosition( int x, int y ); + void SetWidth( int w ); + void SetState( int state ); + void SetFormat( int format ); + void SetHeight( int h ); + bool HasImage() const; + + bool HasText() const { return !m_text.empty(); } + const wxString& GetText() const { return m_text; } + void SetText(const wxString& text) { m_text = text; } + + void GetItem( wxListItem &item ); + + bool IsHit( int x, int y ) const; + int GetImage() const; + int GetWidth() const; + int GetFormat() const; + int GetState() const; + +protected: + long m_mask; + int m_image; + wxString m_text; + int m_format; + int m_width; + int m_xpos, + m_ypos; + int m_height; + int m_state; + +private: + void Init(); +}; + +//----------------------------------------------------------------------------- +// wxListLineData (internal) +//----------------------------------------------------------------------------- + +WX_DECLARE_EXPORTED_LIST(wxListItemData, wxListItemDataList); +#include "wx/listimpl.cpp" +WX_DEFINE_LIST(wxListItemDataList) + +class wxListLineData +{ +public: + // the list of subitems: only may have more than one item in report mode + wxListItemDataList m_items; + + // this is not used in report view + struct GeometryInfo + { + // total item rect + wxRect m_rectAll; + + // label only + wxRect m_rectLabel; + + // icon only + wxRect m_rectIcon; + + // the part to be highlighted + wxRect m_rectHighlight; + + // extend all our rects to be centered inside the one of given width + void ExtendWidth(wxCoord w) + { + wxASSERT_MSG( m_rectAll.width <= w, + _T("width can only be increased") ); + + m_rectAll.width = w; + m_rectLabel.x = m_rectAll.x + (w - m_rectLabel.width) / 2; + m_rectIcon.x = m_rectAll.x + (w - m_rectIcon.width) / 2; + m_rectHighlight.x = m_rectAll.x + (w - m_rectHighlight.width) / 2; + } + } + *m_gi; + + // is this item selected? [NB: not used in virtual mode] + bool m_highlighted; + + // back pointer to the list ctrl + wxListMainWindow *m_owner; + +public: + wxListLineData(wxListMainWindow *owner); + + ~wxListLineData() + { + WX_CLEAR_LIST(wxListItemDataList, m_items); + delete m_gi; + } + + // are we in report mode? + inline bool InReportView() const; + + // are we in virtual report mode? + inline bool IsVirtual() const; + + // these 2 methods shouldn't be called for report view controls, in that + // case we determine our position/size ourselves + + // calculate the size of the line + void CalculateSize( wxDC *dc, int spacing ); + + // remember the position this line appears at + void SetPosition( int x, int y, int spacing ); + + // wxListCtrl API + + void SetImage( int image ) { SetImage(0, image); } + int GetImage() const { return GetImage(0); } + void SetImage( int index, int image ); + int GetImage( int index ) const; + + bool HasImage() const { return GetImage() != -1; } + bool HasText() const { return !GetText(0).empty(); } + + void SetItem( int index, const wxListItem &info ); + void GetItem( int index, wxListItem &info ); + + wxString GetText(int index) const; + void SetText( int index, const wxString& s ); + + wxListItemAttr *GetAttr() const; + void SetAttr(wxListItemAttr *attr); + + // return true if the highlighting really changed + bool Highlight( bool on ); + + void ReverseHighlight(); + + bool IsHighlighted() const + { + wxASSERT_MSG( !IsVirtual(), _T("unexpected call to IsHighlighted") ); + + return m_highlighted; + } + + // draw the line on the given DC in icon/list mode + void Draw( wxDC *dc ); + + // the same in report mode + void DrawInReportMode( wxDC *dc, + const wxRect& rect, + const wxRect& rectHL, + bool highlighted ); + +private: + // set the line to contain num items (only can be > 1 in report mode) + void InitItems( int num ); + + // get the mode (i.e. style) of the list control + inline int GetMode() const; + + // prepare the DC for drawing with these item's attributes, return true if + // we need to draw the items background to highlight it, false otherwise + bool SetAttributes(wxDC *dc, + const wxListItemAttr *attr, + bool highlight); + + // draw the text on the DC with the correct justification; also add an + // ellipsis if the text is too large to fit in the current width + void DrawTextFormatted(wxDC *dc, + const wxString &text, + int col, + int x, + int yMid, // this is middle, not top, of the text + int width); +}; + +WX_DECLARE_EXPORTED_OBJARRAY(wxListLineData, wxListLineDataArray); +#include "wx/arrimpl.cpp" +WX_DEFINE_OBJARRAY(wxListLineDataArray) + +//----------------------------------------------------------------------------- +// wxListHeaderWindow (internal) +//----------------------------------------------------------------------------- + +class wxListHeaderWindow : public wxWindow +{ +protected: + wxListMainWindow *m_owner; + const wxCursor *m_currentCursor; + wxCursor *m_resizeCursor; + bool m_isDragging; + + // column being resized or -1 + int m_column; + + // divider line position in logical (unscrolled) coords + int m_currentX; + + // minimal position beyond which the divider line + // can't be dragged in logical coords + int m_minX; + +public: + wxListHeaderWindow(); + + wxListHeaderWindow( wxWindow *win, + wxWindowID id, + wxListMainWindow *owner, + const wxPoint &pos = wxDefaultPosition, + const wxSize &size = wxDefaultSize, + long style = 0, + const wxString &name = wxT("wxlistctrlcolumntitles") ); + + virtual ~wxListHeaderWindow(); + + void DrawCurrent(); + void AdjustDC( wxDC& dc ); + + void OnPaint( wxPaintEvent &event ); + void OnMouse( wxMouseEvent &event ); + void OnSetFocus( wxFocusEvent &event ); + + // needs refresh + bool m_dirty; + +private: + // common part of all ctors + void Init(); + + // generate and process the list event of the given type, return true if + // it wasn't vetoed, i.e. if we should proceed + bool SendListEvent(wxEventType type, const wxPoint& pos); + + DECLARE_DYNAMIC_CLASS(wxListHeaderWindow) + DECLARE_EVENT_TABLE() +}; + +//----------------------------------------------------------------------------- +// wxListRenameTimer (internal) +//----------------------------------------------------------------------------- + +class wxListRenameTimer: public wxTimer +{ +private: + wxListMainWindow *m_owner; + +public: + wxListRenameTimer( wxListMainWindow *owner ); + void Notify(); +}; + +//----------------------------------------------------------------------------- +// wxListTextCtrlWrapper: wraps a wxTextCtrl to make it work for inline editing +//----------------------------------------------------------------------------- + +class wxListTextCtrlWrapper : public wxEvtHandler +{ +public: + // NB: text must be a valid object but not Create()d yet + wxListTextCtrlWrapper(wxListMainWindow *owner, + wxTextCtrl *text, + size_t itemEdit); + + wxTextCtrl *GetText() const { return m_text; } + + void AcceptChangesAndFinish(); + +protected: + void OnChar( wxKeyEvent &event ); + void OnKeyUp( wxKeyEvent &event ); + void OnKillFocus( wxFocusEvent &event ); + + bool AcceptChanges(); + void Finish(); + +private: + wxListMainWindow *m_owner; + wxTextCtrl *m_text; + wxString m_startValue; + size_t m_itemEdited; + bool m_finished; + bool m_aboutToFinish; + + DECLARE_EVENT_TABLE() +}; + +//----------------------------------------------------------------------------- +// wxListMainWindow (internal) +//----------------------------------------------------------------------------- + +WX_DECLARE_EXPORTED_LIST(wxListHeaderData, wxListHeaderDataList); +#include "wx/listimpl.cpp" +WX_DEFINE_LIST(wxListHeaderDataList) + +class wxListMainWindow : public wxScrolledWindow +{ +public: + wxListMainWindow(); + wxListMainWindow( wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxString &name = _T("listctrlmainwindow") ); + + virtual ~wxListMainWindow(); + + bool HasFlag(int flag) const { return m_parent->HasFlag(flag); } + + // return true if this is a virtual list control + bool IsVirtual() const { return HasFlag(wxLC_VIRTUAL); } + + // return true if the control is in report mode + bool InReportView() const { return HasFlag(wxLC_REPORT); } + + // return true if we are in single selection mode, false if multi sel + bool IsSingleSel() const { return HasFlag(wxLC_SINGLE_SEL); } + + // do we have a header window? + bool HasHeader() const + { return InReportView() && !HasFlag(wxLC_NO_HEADER); } + + void HighlightAll( bool on ); + + // all these functions only do something if the line is currently visible + + // change the line "selected" state, return true if it really changed + bool HighlightLine( size_t line, bool highlight = true); + + // as HighlightLine() but do it for the range of lines: this is incredibly + // more efficient for virtual list controls! + // + // NB: unlike HighlightLine() this one does refresh the lines on screen + void HighlightLines( size_t lineFrom, size_t lineTo, bool on = true ); + + // toggle the line state and refresh it + void ReverseHighlight( size_t line ) + { HighlightLine(line, !IsHighlighted(line)); RefreshLine(line); } + + // return true if the line is highlighted + bool IsHighlighted(size_t line) const; + + // refresh one or several lines at once + void RefreshLine( size_t line ); + void RefreshLines( size_t lineFrom, size_t lineTo ); + + // refresh all selected items + void RefreshSelected(); + + // refresh all lines below the given one: the difference with + // RefreshLines() is that the index here might not be a valid one (happens + // when the last line is deleted) + void RefreshAfter( size_t lineFrom ); + + // the methods which are forwarded to wxListLineData itself in list/icon + // modes but are here because the lines don't store their positions in the + // report mode + + // get the bound rect for the entire line + wxRect GetLineRect(size_t line) const; + + // get the bound rect of the label + wxRect GetLineLabelRect(size_t line) const; + + // get the bound rect of the items icon (only may be called if we do have + // an icon!) + wxRect GetLineIconRect(size_t line) const; + + // get the rect to be highlighted when the item has focus + wxRect GetLineHighlightRect(size_t line) const; + + // get the size of the total line rect + wxSize GetLineSize(size_t line) const + { return GetLineRect(line).GetSize(); } + + // return the hit code for the corresponding position (in this line) + long HitTestLine(size_t line, int x, int y) const; + + // bring the selected item into view, scrolling to it if necessary + void MoveToItem(size_t item); + + // bring the current item into view + void MoveToFocus() { MoveToItem(m_current); } + + // start editing the label of the given item + wxTextCtrl *EditLabel(long item, + wxClassInfo* textControlClass = CLASSINFO(wxTextCtrl)); + wxTextCtrl *GetEditControl() const + { + return m_textctrlWrapper ? m_textctrlWrapper->GetText() : NULL; + } + + void FinishEditing(wxTextCtrl *text) + { + delete text; + m_textctrlWrapper = NULL; + SetFocusIgnoringChildren(); + } + + // suspend/resume redrawing the control + void Freeze(); + void Thaw(); + + void OnRenameTimer(); + bool OnRenameAccept(size_t itemEdit, const wxString& value); + void OnRenameCancelled(size_t itemEdit); + + void OnMouse( wxMouseEvent &event ); + + // called to switch the selection from the current item to newCurrent, + void OnArrowChar( size_t newCurrent, const wxKeyEvent& event ); + + void OnChar( wxKeyEvent &event ); + void OnKeyDown( wxKeyEvent &event ); + void OnKeyUp( wxKeyEvent &event ); + void OnSetFocus( wxFocusEvent &event ); + void OnKillFocus( wxFocusEvent &event ); + void OnScroll( wxScrollWinEvent& event ); + + void OnPaint( wxPaintEvent &event ); + + void DrawImage( int index, wxDC *dc, int x, int y ); + void GetImageSize( int index, int &width, int &height ) const; + int GetTextLength( const wxString &s ) const; + + void SetImageList( wxImageList *imageList, int which ); + void SetItemSpacing( int spacing, bool isSmall = false ); + int GetItemSpacing( bool isSmall = false ); + + void SetColumn( int col, wxListItem &item ); + void SetColumnWidth( int col, int width ); + void GetColumn( int col, wxListItem &item ) const; + int GetColumnWidth( int col ) const; + int GetColumnCount() const { return m_columns.GetCount(); } + + // returns the sum of the heights of all columns + int GetHeaderWidth() const; + + int GetCountPerPage() const; + + void SetItem( wxListItem &item ); + void GetItem( wxListItem &item ) const; + void SetItemState( long item, long state, long stateMask ); + void SetItemStateAll( long state, long stateMask ); + int GetItemState( long item, long stateMask ) const; + void GetItemRect( long index, wxRect &rect ) const; + wxRect GetViewRect() const; + bool GetItemPosition( long item, wxPoint& pos ) const; + int GetSelectedItemCount() const; + + wxString GetItemText(long item) const + { + wxListItem info; + info.m_mask = wxLIST_MASK_TEXT; + info.m_itemId = item; + GetItem( info ); + return info.m_text; + } + + void SetItemText(long item, const wxString& value) + { + wxListItem info; + info.m_mask = wxLIST_MASK_TEXT; + info.m_itemId = item; + info.m_text = value; + SetItem( info ); + } + + // set the scrollbars and update the positions of the items + void RecalculatePositions(bool noRefresh = false); + + // refresh the window and the header + void RefreshAll(); + + long GetNextItem( long item, int geometry, int state ) const; + void DeleteItem( long index ); + void DeleteAllItems(); + void DeleteColumn( int col ); + void DeleteEverything(); + void EnsureVisible( long index ); + long FindItem( long start, const wxString& str, bool partial = false ); + long FindItem( long start, wxUIntPtr data); + long FindItem( const wxPoint& pt ); + long HitTest( int x, int y, int &flags ) const; + void InsertItem( wxListItem &item ); + void InsertColumn( long col, wxListItem &item ); + int GetItemWidthWithImage(wxListItem * item); + void SortItems( wxListCtrlCompare fn, long data ); + + size_t GetItemCount() const; + bool IsEmpty() const { return GetItemCount() == 0; } + void SetItemCount(long count); + + // change the current (== focused) item, send a notification event + void ChangeCurrent(size_t current); + void ResetCurrent() { ChangeCurrent((size_t)-1); } + bool HasCurrent() const { return m_current != (size_t)-1; } + + // send out a wxListEvent + void SendNotify( size_t line, + wxEventType command, + const wxPoint& point = wxDefaultPosition ); + + // override base class virtual to reset m_lineHeight when the font changes + virtual bool SetFont(const wxFont& font) + { + if ( !wxScrolledWindow::SetFont(font) ) + return false; + + m_lineHeight = 0; + + return true; + } + + // these are for wxListLineData usage only + + // get the backpointer to the list ctrl + wxGenericListCtrl *GetListCtrl() const + { + return wxStaticCast(GetParent(), wxGenericListCtrl); + } + + // get the height of all lines (assuming they all do have the same height) + wxCoord GetLineHeight() const; + + // get the y position of the given line (only for report view) + wxCoord GetLineY(size_t line) const; + + // get the brush to use for the item highlighting + wxBrush *GetHighlightBrush() const + { + return m_hasFocus ? m_highlightBrush : m_highlightUnfocusedBrush; + } + + bool HasFocus() const + { + return m_hasFocus; + } + +//protected: + // the array of all line objects for a non virtual list control (for the + // virtual list control we only ever use m_lines[0]) + wxListLineDataArray m_lines; + + // the list of column objects + wxListHeaderDataList m_columns; + + // currently focused item or -1 + size_t m_current; + + // the number of lines per page + int m_linesPerPage; + + // this flag is set when something which should result in the window + // redrawing happens (i.e. an item was added or deleted, or its appearance + // changed) and OnPaint() doesn't redraw the window while it is set which + // allows to minimize the number of repaintings when a lot of items are + // being added. The real repainting occurs only after the next OnIdle() + // call + bool m_dirty; + + wxColour *m_highlightColour; + wxImageList *m_small_image_list; + wxImageList *m_normal_image_list; + int m_small_spacing; + int m_normal_spacing; + bool m_hasFocus; + + bool m_lastOnSame; + wxTimer *m_renameTimer; + bool m_isCreated; + int m_dragCount; + wxPoint m_dragStart; + ColWidthArray m_aColWidths; + + // for double click logic + size_t m_lineLastClicked, + m_lineBeforeLastClicked, + m_lineSelectSingleOnUp; + +protected: + wxWindow *GetMainWindowOfCompositeControl() { return GetParent(); } + + // the total count of items in a virtual list control + size_t m_countVirt; + + // the object maintaining the items selection state, only used in virtual + // controls + wxSelectionStore m_selStore; + + // common part of all ctors + void Init(); + + // get the line data for the given index + wxListLineData *GetLine(size_t n) const + { + wxASSERT_MSG( n != (size_t)-1, _T("invalid line index") ); + + if ( IsVirtual() ) + { + wxConstCast(this, wxListMainWindow)->CacheLineData(n); + n = 0; + } + + return &m_lines[n]; + } + + // get a dummy line which can be used for geometry calculations and such: + // you must use GetLine() if you want to really draw the line + wxListLineData *GetDummyLine() const; + + // cache the line data of the n-th line in m_lines[0] + void CacheLineData(size_t line); + + // get the range of visible lines + void GetVisibleLinesRange(size_t *from, size_t *to); + + // force us to recalculate the range of visible lines + void ResetVisibleLinesRange() { m_lineFrom = (size_t)-1; } + + // get the colour to be used for drawing the rules + wxColour GetRuleColour() const + { + return wxSystemSettings::GetColour(wxSYS_COLOUR_3DLIGHT); + } + +private: + // initialize the current item if needed + void UpdateCurrent(); + + // delete all items but don't refresh: called from dtor + void DoDeleteAllItems(); + + // the height of one line using the current font + wxCoord m_lineHeight; + + // the total header width or 0 if not calculated yet + wxCoord m_headerWidth; + + // the first and last lines being shown on screen right now (inclusive), + // both may be -1 if they must be calculated so never access them directly: + // use GetVisibleLinesRange() above instead + size_t m_lineFrom, + m_lineTo; + + // the brushes to use for item highlighting when we do/don't have focus + wxBrush *m_highlightBrush, + *m_highlightUnfocusedBrush; + + // if this is > 0, the control is frozen and doesn't redraw itself + size_t m_freezeCount; + + // wrapper around the text control currently used for in place editing or + // NULL if no item is being edited + wxListTextCtrlWrapper *m_textctrlWrapper; + + + DECLARE_DYNAMIC_CLASS(wxListMainWindow) + DECLARE_EVENT_TABLE() + + friend class wxGenericListCtrl; +}; + + +wxListItemData::~wxListItemData() +{ + // in the virtual list control the attributes are managed by the main + // program, so don't delete them + if ( !m_owner->IsVirtual() ) + delete m_attr; + + delete m_rect; +} + +void wxListItemData::Init() +{ + m_image = -1; + m_data = 0; + + m_attr = NULL; +} + +wxListItemData::wxListItemData(wxListMainWindow *owner) +{ + Init(); + + m_owner = owner; + + if ( owner->InReportView() ) + m_rect = NULL; + else + m_rect = new wxRect; +} + +void wxListItemData::SetItem( const wxListItem &info ) +{ + if ( info.m_mask & wxLIST_MASK_TEXT ) + SetText(info.m_text); + if ( info.m_mask & wxLIST_MASK_IMAGE ) + m_image = info.m_image; + if ( info.m_mask & wxLIST_MASK_DATA ) + m_data = info.m_data; + + if ( info.HasAttributes() ) + { + if ( m_attr ) + m_attr->AssignFrom(*info.GetAttributes()); + else + m_attr = new wxListItemAttr(*info.GetAttributes()); + } + + if ( m_rect ) + { + m_rect->x = + m_rect->y = + m_rect->height = 0; + m_rect->width = info.m_width; + } +} + +void wxListItemData::SetPosition( int x, int y ) +{ + wxCHECK_RET( m_rect, _T("unexpected SetPosition() call") ); + + m_rect->x = x; + m_rect->y = y; +} + +void wxListItemData::SetSize( int width, int height ) +{ + wxCHECK_RET( m_rect, _T("unexpected SetSize() call") ); + + if ( width != -1 ) + m_rect->width = width; + if ( height != -1 ) + m_rect->height = height; +} + +bool wxListItemData::IsHit( int x, int y ) const +{ + wxCHECK_MSG( m_rect, false, _T("can't be called in this mode") ); + + return wxRect(GetX(), GetY(), GetWidth(), GetHeight()).Contains(x, y); +} + +int wxListItemData::GetX() const +{ + wxCHECK_MSG( m_rect, 0, _T("can't be called in this mode") ); + + return m_rect->x; +} + +int wxListItemData::GetY() const +{ + wxCHECK_MSG( m_rect, 0, _T("can't be called in this mode") ); + + return m_rect->y; +} + +int wxListItemData::GetWidth() const +{ + wxCHECK_MSG( m_rect, 0, _T("can't be called in this mode") ); + + return m_rect->width; +} + +int wxListItemData::GetHeight() const +{ + wxCHECK_MSG( m_rect, 0, _T("can't be called in this mode") ); + + return m_rect->height; +} + +void wxListItemData::GetItem( wxListItem &info ) const +{ + long mask = info.m_mask; + if ( !mask ) + // by default, get everything for backwards compatibility + mask = -1; + + if ( mask & wxLIST_MASK_TEXT ) + info.m_text = m_text; + if ( mask & wxLIST_MASK_IMAGE ) + info.m_image = m_image; + if ( mask & wxLIST_MASK_DATA ) + info.m_data = m_data; + + if ( m_attr ) + { + if ( m_attr->HasTextColour() ) + info.SetTextColour(m_attr->GetTextColour()); + if ( m_attr->HasBackgroundColour() ) + info.SetBackgroundColour(m_attr->GetBackgroundColour()); + if ( m_attr->HasFont() ) + info.SetFont(m_attr->GetFont()); + } +} + +//----------------------------------------------------------------------------- +// wxListHeaderData +//----------------------------------------------------------------------------- + +void wxListHeaderData::Init() +{ + m_mask = 0; + m_image = -1; + m_format = 0; + m_width = 0; + m_xpos = 0; + m_ypos = 0; + m_height = 0; + m_state = 0; +} + +wxListHeaderData::wxListHeaderData() +{ + Init(); +} + +wxListHeaderData::wxListHeaderData( const wxListItem &item ) +{ + Init(); + + SetItem( item ); +} + +void wxListHeaderData::SetItem( const wxListItem &item ) +{ + m_mask = item.m_mask; + + if ( m_mask & wxLIST_MASK_TEXT ) + m_text = item.m_text; + + if ( m_mask & wxLIST_MASK_IMAGE ) + m_image = item.m_image; + + if ( m_mask & wxLIST_MASK_FORMAT ) + m_format = item.m_format; + + if ( m_mask & wxLIST_MASK_WIDTH ) + SetWidth(item.m_width); + + if ( m_mask & wxLIST_MASK_STATE ) + SetState(item.m_state); +} + +void wxListHeaderData::SetPosition( int x, int y ) +{ + m_xpos = x; + m_ypos = y; +} + +void wxListHeaderData::SetHeight( int h ) +{ + m_height = h; +} + +void wxListHeaderData::SetWidth( int w ) +{ + m_width = w < 0 ? WIDTH_COL_DEFAULT : w; +} + +void wxListHeaderData::SetState( int flag ) +{ + m_state = flag; +} + +void wxListHeaderData::SetFormat( int format ) +{ + m_format = format; +} + +bool wxListHeaderData::HasImage() const +{ + return m_image != -1; +} + +bool wxListHeaderData::IsHit( int x, int y ) const +{ + return ((x >= m_xpos) && (x <= m_xpos+m_width) && (y >= m_ypos) && (y <= m_ypos+m_height)); +} + +void wxListHeaderData::GetItem( wxListItem& item ) +{ + item.m_mask = m_mask; + item.m_text = m_text; + item.m_image = m_image; + item.m_format = m_format; + item.m_width = m_width; + item.m_state = m_state; +} + +int wxListHeaderData::GetImage() const +{ + return m_image; +} + +int wxListHeaderData::GetWidth() const +{ + return m_width; +} + +int wxListHeaderData::GetFormat() const +{ + return m_format; +} + +int wxListHeaderData::GetState() const +{ + return m_state; +} + +//----------------------------------------------------------------------------- +// wxListLineData +//----------------------------------------------------------------------------- + +inline int wxListLineData::GetMode() const +{ + return m_owner->GetListCtrl()->GetWindowStyleFlag() & wxLC_MASK_TYPE; +} + +inline bool wxListLineData::InReportView() const +{ + return m_owner->HasFlag(wxLC_REPORT); +} + +inline bool wxListLineData::IsVirtual() const +{ + return m_owner->IsVirtual(); +} + +wxListLineData::wxListLineData( wxListMainWindow *owner ) +{ + m_owner = owner; + + if ( InReportView() ) + m_gi = NULL; + else // !report + m_gi = new GeometryInfo; + + m_highlighted = false; + + InitItems( GetMode() == wxLC_REPORT ? m_owner->GetColumnCount() : 1 ); +} + +void wxListLineData::CalculateSize( wxDC *dc, int spacing ) +{ + wxListItemDataList::compatibility_iterator node = m_items.GetFirst(); + wxCHECK_RET( node, _T("no subitems at all??") ); + + wxListItemData *item = node->GetData(); + + wxString s; + wxCoord lw, lh; + + switch ( GetMode() ) + { + case wxLC_ICON: + case wxLC_SMALL_ICON: + m_gi->m_rectAll.width = spacing; + + s = item->GetText(); + + if ( s.empty() ) + { + lh = + m_gi->m_rectLabel.width = + m_gi->m_rectLabel.height = 0; + } + else // has label + { + dc->GetTextExtent( s, &lw, &lh ); + lw += EXTRA_WIDTH; + lh += EXTRA_HEIGHT; + + m_gi->m_rectAll.height = spacing + lh; + if (lw > spacing) + m_gi->m_rectAll.width = lw; + + m_gi->m_rectLabel.width = lw; + m_gi->m_rectLabel.height = lh; + } + + if (item->HasImage()) + { + int w, h; + m_owner->GetImageSize( item->GetImage(), w, h ); + m_gi->m_rectIcon.width = w + 8; + m_gi->m_rectIcon.height = h + 8; + + if ( m_gi->m_rectIcon.width > m_gi->m_rectAll.width ) + m_gi->m_rectAll.width = m_gi->m_rectIcon.width; + if ( m_gi->m_rectIcon.height + lh > m_gi->m_rectAll.height - 4 ) + m_gi->m_rectAll.height = m_gi->m_rectIcon.height + lh + 4; + } + + if ( item->HasText() ) + { + m_gi->m_rectHighlight.width = m_gi->m_rectLabel.width; + m_gi->m_rectHighlight.height = m_gi->m_rectLabel.height; + } + else // no text, highlight the icon + { + m_gi->m_rectHighlight.width = m_gi->m_rectIcon.width; + m_gi->m_rectHighlight.height = m_gi->m_rectIcon.height; + } + break; + + case wxLC_LIST: + s = item->GetTextForMeasuring(); + + dc->GetTextExtent( s, &lw, &lh ); + lw += EXTRA_WIDTH; + lh += EXTRA_HEIGHT; + + m_gi->m_rectLabel.width = lw; + m_gi->m_rectLabel.height = lh; + + m_gi->m_rectAll.width = lw; + m_gi->m_rectAll.height = lh; + + if (item->HasImage()) + { + int w, h; + m_owner->GetImageSize( item->GetImage(), w, h ); + m_gi->m_rectIcon.width = w; + m_gi->m_rectIcon.height = h; + + m_gi->m_rectAll.width += 4 + w; + if (h > m_gi->m_rectAll.height) + m_gi->m_rectAll.height = h; + } + + m_gi->m_rectHighlight.width = m_gi->m_rectAll.width; + m_gi->m_rectHighlight.height = m_gi->m_rectAll.height; + break; + + case wxLC_REPORT: + wxFAIL_MSG( _T("unexpected call to SetSize") ); + break; + + default: + wxFAIL_MSG( _T("unknown mode") ); + break; + } +} + +void wxListLineData::SetPosition( int x, int y, int spacing ) +{ + wxListItemDataList::compatibility_iterator node = m_items.GetFirst(); + wxCHECK_RET( node, _T("no subitems at all??") ); + + wxListItemData *item = node->GetData(); + + switch ( GetMode() ) + { + case wxLC_ICON: + case wxLC_SMALL_ICON: + m_gi->m_rectAll.x = x; + m_gi->m_rectAll.y = y; + + if ( item->HasImage() ) + { + m_gi->m_rectIcon.x = m_gi->m_rectAll.x + 4 + + (m_gi->m_rectAll.width - m_gi->m_rectIcon.width) / 2; + m_gi->m_rectIcon.y = m_gi->m_rectAll.y + 4; + } + + if ( item->HasText() ) + { + if (m_gi->m_rectAll.width > spacing) + m_gi->m_rectLabel.x = m_gi->m_rectAll.x + (EXTRA_WIDTH/2); + else + m_gi->m_rectLabel.x = m_gi->m_rectAll.x + (EXTRA_WIDTH/2) + (spacing / 2) - (m_gi->m_rectLabel.width / 2); + m_gi->m_rectLabel.y = m_gi->m_rectAll.y + m_gi->m_rectAll.height + 2 - m_gi->m_rectLabel.height; + m_gi->m_rectHighlight.x = m_gi->m_rectLabel.x - 2; + m_gi->m_rectHighlight.y = m_gi->m_rectLabel.y - 2; + } + else // no text, highlight the icon + { + m_gi->m_rectHighlight.x = m_gi->m_rectIcon.x - 4; + m_gi->m_rectHighlight.y = m_gi->m_rectIcon.y - 4; + } + break; + + case wxLC_LIST: + m_gi->m_rectAll.x = x; + m_gi->m_rectAll.y = y; + + m_gi->m_rectHighlight.x = m_gi->m_rectAll.x; + m_gi->m_rectHighlight.y = m_gi->m_rectAll.y; + m_gi->m_rectLabel.y = m_gi->m_rectAll.y + 2; + + if (item->HasImage()) + { + m_gi->m_rectIcon.x = m_gi->m_rectAll.x + 2; + m_gi->m_rectIcon.y = m_gi->m_rectAll.y + 2; + m_gi->m_rectLabel.x = m_gi->m_rectAll.x + 4 + (EXTRA_WIDTH/2) + m_gi->m_rectIcon.width; + } + else + { + m_gi->m_rectLabel.x = m_gi->m_rectAll.x + (EXTRA_WIDTH/2); + } + break; + + case wxLC_REPORT: + wxFAIL_MSG( _T("unexpected call to SetPosition") ); + break; + + default: + wxFAIL_MSG( _T("unknown mode") ); + break; + } +} + +void wxListLineData::InitItems( int num ) +{ + for (int i = 0; i < num; i++) + m_items.Append( new wxListItemData(m_owner) ); +} + +void wxListLineData::SetItem( int index, const wxListItem &info ) +{ + wxListItemDataList::compatibility_iterator node = m_items.Item( index ); + wxCHECK_RET( node, _T("invalid column index in SetItem") ); + + wxListItemData *item = node->GetData(); + item->SetItem( info ); +} + +void wxListLineData::GetItem( int index, wxListItem &info ) +{ + wxListItemDataList::compatibility_iterator node = m_items.Item( index ); + if (node) + { + wxListItemData *item = node->GetData(); + item->GetItem( info ); + } +} + +wxString wxListLineData::GetText(int index) const +{ + wxString s; + + wxListItemDataList::compatibility_iterator node = m_items.Item( index ); + if (node) + { + wxListItemData *item = node->GetData(); + s = item->GetText(); + } + + return s; +} + +void wxListLineData::SetText( int index, const wxString& s ) +{ + wxListItemDataList::compatibility_iterator node = m_items.Item( index ); + if (node) + { + wxListItemData *item = node->GetData(); + item->SetText( s ); + } +} + +void wxListLineData::SetImage( int index, int image ) +{ + wxListItemDataList::compatibility_iterator node = m_items.Item( index ); + wxCHECK_RET( node, _T("invalid column index in SetImage()") ); + + wxListItemData *item = node->GetData(); + item->SetImage(image); +} + +int wxListLineData::GetImage( int index ) const +{ + wxListItemDataList::compatibility_iterator node = m_items.Item( index ); + wxCHECK_MSG( node, -1, _T("invalid column index in GetImage()") ); + + wxListItemData *item = node->GetData(); + return item->GetImage(); +} + +wxListItemAttr *wxListLineData::GetAttr() const +{ + wxListItemDataList::compatibility_iterator node = m_items.GetFirst(); + wxCHECK_MSG( node, NULL, _T("invalid column index in GetAttr()") ); + + wxListItemData *item = node->GetData(); + return item->GetAttr(); +} + +void wxListLineData::SetAttr(wxListItemAttr *attr) +{ + wxListItemDataList::compatibility_iterator node = m_items.GetFirst(); + wxCHECK_RET( node, _T("invalid column index in SetAttr()") ); + + wxListItemData *item = node->GetData(); + item->SetAttr(attr); +} + +bool wxListLineData::SetAttributes(wxDC *dc, + const wxListItemAttr *attr, + bool highlighted) +{ + wxWindow *listctrl = m_owner->GetParent(); + + // fg colour + + // don't use foreground colour for drawing highlighted items - this might + // make them completely invisible (and there is no way to do bit + // arithmetics on wxColour, unfortunately) + wxColour colText; + if ( highlighted ) +#ifdef __WXMAC__ + { + if (m_owner->HasFocus() +#ifdef __WXMAC__ + && IsControlActive( (ControlRef)m_owner->GetHandle() ) +#endif + ) + colText = *wxWHITE; + else + colText = *wxBLACK; + } +#else + colText = wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT); +#endif + else if ( attr && attr->HasTextColour() ) + colText = attr->GetTextColour(); + else + colText = listctrl->GetForegroundColour(); + + dc->SetTextForeground(colText); + + // font + wxFont font; + if ( attr && attr->HasFont() ) + font = attr->GetFont(); + else + font = listctrl->GetFont(); + + dc->SetFont(font); + + // bg colour + bool hasBgCol = attr && attr->HasBackgroundColour(); + if ( highlighted || hasBgCol ) + { + if ( highlighted ) + dc->SetBrush( *m_owner->GetHighlightBrush() ); + else + dc->SetBrush(wxBrush(attr->GetBackgroundColour(), wxSOLID)); + + dc->SetPen( *wxTRANSPARENT_PEN ); + + return true; + } + + return false; +} + +void wxListLineData::Draw( wxDC *dc ) +{ + wxListItemDataList::compatibility_iterator node = m_items.GetFirst(); + wxCHECK_RET( node, _T("no subitems at all??") ); + + bool highlighted = IsHighlighted(); + + wxListItemAttr *attr = GetAttr(); + + if ( SetAttributes(dc, attr, highlighted) ) +#if ( !defined(__WXGTK20__) && !defined(__WXMAC__) ) + { + dc->DrawRectangle( m_gi->m_rectHighlight ); + } +#else + { + if (highlighted) + { + int flags = wxCONTROL_SELECTED; + if (m_owner->HasFocus() +#ifdef __WXMAC__ + && IsControlActive( (ControlRef)m_owner->GetHandle() ) +#endif + ) + flags |= wxCONTROL_FOCUSED; + wxRendererNative::Get().DrawItemSelectionRect( m_owner, *dc, m_gi->m_rectHighlight, flags ); + + } + else + { + dc->DrawRectangle( m_gi->m_rectHighlight ); + } + } +#endif + + // just for debugging to better see where the items are +#if 0 + dc->SetPen(*wxRED_PEN); + dc->SetBrush(*wxTRANSPARENT_BRUSH); + dc->DrawRectangle( m_gi->m_rectAll ); + dc->SetPen(*wxGREEN_PEN); + dc->DrawRectangle( m_gi->m_rectIcon ); +#endif + + wxListItemData *item = node->GetData(); + if (item->HasImage()) + { + // centre the image inside our rectangle, this looks nicer when items + // ae aligned in a row + const wxRect& rectIcon = m_gi->m_rectIcon; + + m_owner->DrawImage(item->GetImage(), dc, rectIcon.x, rectIcon.y); + } + + if (item->HasText()) + { + const wxRect& rectLabel = m_gi->m_rectLabel; + + wxDCClipper clipper(*dc, rectLabel); + dc->DrawText(item->GetText(), rectLabel.x, rectLabel.y); + } +} + +void wxListLineData::DrawInReportMode( wxDC *dc, + const wxRect& rect, + const wxRect& rectHL, + bool highlighted ) +{ + // TODO: later we should support setting different attributes for + // different columns - to do it, just add "col" argument to + // GetAttr() and move these lines into the loop below + wxListItemAttr *attr = GetAttr(); + if ( SetAttributes(dc, attr, highlighted) ) +#if ( !defined(__WXGTK20__) && !defined(__WXMAC__) ) + { + dc->DrawRectangle( rectHL ); + } +#else + { + if (highlighted) + { + int flags = wxCONTROL_SELECTED; + if (m_owner->HasFocus() +#ifdef __WXMAC__ + && IsControlActive( (ControlRef)m_owner->GetHandle() ) +#endif + ) + flags |= wxCONTROL_FOCUSED; + wxRendererNative::Get().DrawItemSelectionRect( m_owner, *dc, rectHL, flags ); + } + else + { + dc->DrawRectangle( rectHL ); + } + } +#endif + + wxCoord x = rect.x + HEADER_OFFSET_X, + yMid = rect.y + rect.height/2; +#ifdef __WXGTK__ + // This probably needs to be done + // on all platforms as the icons + // otherwise nearly touch the border + x += 2; +#endif + + size_t col = 0; + for ( wxListItemDataList::compatibility_iterator node = m_items.GetFirst(); + node; + node = node->GetNext(), col++ ) + { + wxListItemData *item = node->GetData(); + + int width = m_owner->GetColumnWidth(col); + int xOld = x; + x += width; + + if ( item->HasImage() ) + { + int ix, iy; + m_owner->GetImageSize( item->GetImage(), ix, iy ); + m_owner->DrawImage( item->GetImage(), dc, xOld, yMid - iy/2 ); + + ix += IMAGE_MARGIN_IN_REPORT_MODE; + + xOld += ix; + width -= ix; + } + + if ( item->HasText() ) + DrawTextFormatted(dc, item->GetText(), col, xOld, yMid, width - 8); + } +} + +void wxListLineData::DrawTextFormatted(wxDC *dc, + const wxString& textOrig, + int col, + int x, + int yMid, + int width) +{ + // we don't support displaying multiple lines currently (and neither does + // wxMSW FWIW) so just merge all the lines + wxString text(textOrig); + text.Replace(_T("\n"), _T(" ")); + + wxCoord w, h; + dc->GetTextExtent(text, &w, &h); + + const wxCoord y = yMid - (h + 1)/2; + + wxDCClipper clipper(*dc, x, y, width, h); + + // determine if the string can fit inside the current width + if (w <= width) + { + // it can, draw it using the items alignment + wxListItem item; + m_owner->GetColumn(col, item); + switch ( item.GetAlign() ) + { + case wxLIST_FORMAT_LEFT: + // nothing to do + break; + + case wxLIST_FORMAT_RIGHT: + x += width - w; + break; + + case wxLIST_FORMAT_CENTER: + x += (width - w) / 2; + break; + + default: + wxFAIL_MSG( _T("unknown list item format") ); + break; + } + + dc->DrawText(text, x, y); + } + else // otherwise, truncate and add an ellipsis if possible + { + // determine the base width + wxString ellipsis(wxT("...")); + wxCoord base_w; + dc->GetTextExtent(ellipsis, &base_w, &h); + + // continue until we have enough space or only one character left + wxCoord w_c, h_c; + size_t len = text.length(); + wxString drawntext = text.Left(len); + while (len > 1) + { + dc->GetTextExtent(drawntext.Last(), &w_c, &h_c); + drawntext.RemoveLast(); + len--; + w -= w_c; + if (w + base_w <= width) + break; + } + + // if still not enough space, remove ellipsis characters + while (ellipsis.length() > 0 && w + base_w > width) + { + ellipsis = ellipsis.Left(ellipsis.length() - 1); + dc->GetTextExtent(ellipsis, &base_w, &h); + } + + // now draw the text + dc->DrawText(drawntext, x, y); + dc->DrawText(ellipsis, x + w, y); + } +} + +bool wxListLineData::Highlight( bool on ) +{ + wxCHECK_MSG( !IsVirtual(), false, _T("unexpected call to Highlight") ); + + if ( on == m_highlighted ) + return false; + + m_highlighted = on; + + return true; +} + +void wxListLineData::ReverseHighlight( void ) +{ + Highlight(!IsHighlighted()); +} + +//----------------------------------------------------------------------------- +// wxListHeaderWindow +//----------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxListHeaderWindow,wxWindow) + +BEGIN_EVENT_TABLE(wxListHeaderWindow,wxWindow) + EVT_PAINT (wxListHeaderWindow::OnPaint) + EVT_MOUSE_EVENTS (wxListHeaderWindow::OnMouse) + EVT_SET_FOCUS (wxListHeaderWindow::OnSetFocus) +END_EVENT_TABLE() + +void wxListHeaderWindow::Init() +{ + m_currentCursor = (wxCursor *) NULL; + m_isDragging = false; + m_dirty = false; +} + +wxListHeaderWindow::wxListHeaderWindow() +{ + Init(); + + m_owner = (wxListMainWindow *) NULL; + m_resizeCursor = (wxCursor *) NULL; +} + +wxListHeaderWindow::wxListHeaderWindow( wxWindow *win, + wxWindowID id, + wxListMainWindow *owner, + const wxPoint& pos, + const wxSize& size, + long style, + const wxString &name ) + : wxWindow( win, id, pos, size, style, name ) +{ + Init(); + + m_owner = owner; + m_resizeCursor = new wxCursor( wxCURSOR_SIZEWE ); + +#if _USE_VISATTR + wxVisualAttributes attr = wxPanel::GetClassDefaultAttributes(); + SetOwnForegroundColour( attr.colFg ); + SetOwnBackgroundColour( attr.colBg ); + if (!m_hasFont) + SetOwnFont( attr.font ); +#else + SetOwnForegroundColour( wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT)); + SetOwnBackgroundColour( wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE)); + if (!m_hasFont) + SetOwnFont( wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT )); +#endif +} + +wxListHeaderWindow::~wxListHeaderWindow() +{ + delete m_resizeCursor; +} + +#ifdef __WXUNIVERSAL__ +#include "wx/univ/renderer.h" +#include "wx/univ/theme.h" +#endif + +// shift the DC origin to match the position of the main window horz +// scrollbar: this allows us to always use logical coords +void wxListHeaderWindow::AdjustDC(wxDC& dc) +{ + int xpix; + m_owner->GetScrollPixelsPerUnit( &xpix, NULL ); + + int view_start; + m_owner->GetViewStart( &view_start, NULL ); + + + int org_x = 0; + int org_y = 0; + dc.GetDeviceOrigin( &org_x, &org_y ); + + // account for the horz scrollbar offset +#ifdef __WXGTK__ + if (GetLayoutDirection() == wxLayout_RightToLeft) + { + // Maybe we just have to check for m_signX + // in the DC, but I leave the #ifdef __WXGTK__ + // for now + dc.SetDeviceOrigin( org_x + (view_start * xpix), org_y ); + } + else +#endif + dc.SetDeviceOrigin( org_x - (view_start * xpix), org_y ); +} + +void wxListHeaderWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) +{ + wxPaintDC dc( this ); + + PrepareDC( dc ); + AdjustDC( dc ); + + dc.SetFont( GetFont() ); + + // width and height of the entire header window + int w, h; + GetClientSize( &w, &h ); + m_owner->CalcUnscrolledPosition(w, 0, &w, NULL); + + dc.SetBackgroundMode(wxTRANSPARENT); + dc.SetTextForeground(GetForegroundColour()); + + int x = HEADER_OFFSET_X; + int numColumns = m_owner->GetColumnCount(); + wxListItem item; + for ( int i = 0; i < numColumns && x < w; i++ ) + { + m_owner->GetColumn( i, item ); + int wCol = item.m_width; + + int cw = wCol; + int ch = h; + + int flags = 0; + if (!m_parent->IsEnabled()) + flags |= wxCONTROL_DISABLED; + +// NB: The code below is not really Mac-specific, but since we are close +// to 2.8 release and I don't have time to test on other platforms, I +// defined this only for wxMac. If this behavior is desired on +// other platforms, please go ahead and revise or remove the #ifdef. +#ifdef __WXMAC__ + if ( !m_owner->IsVirtual() && (item.m_mask & wxLIST_MASK_STATE) && + (item.m_state & wxLIST_STATE_SELECTED) ) + flags |= wxCONTROL_SELECTED; +#endif + + wxRendererNative::Get().DrawHeaderButton + ( + this, + dc, + wxRect(x, HEADER_OFFSET_Y, cw, ch), + flags + ); + + // see if we have enough space for the column label + + // for this we need the width of the text + wxCoord wLabel; + wxCoord hLabel; + dc.GetTextExtent(item.GetText(), &wLabel, &hLabel); + wLabel += 2 * EXTRA_WIDTH; + + // and the width of the icon, if any + int ix = 0, iy = 0; // init them just to suppress the compiler warnings + const int image = item.m_image; + wxImageList *imageList; + if ( image != -1 ) + { + imageList = m_owner->m_small_image_list; + if ( imageList ) + { + imageList->GetSize(image, ix, iy); + wLabel += ix + HEADER_IMAGE_MARGIN_IN_REPORT_MODE; + } + } + else + { + imageList = NULL; + } + + // ignore alignment if there is not enough space anyhow + int xAligned; + switch ( wLabel < cw ? item.GetAlign() : wxLIST_FORMAT_LEFT ) + { + default: + wxFAIL_MSG( _T("unknown list item format") ); + // fall through + + case wxLIST_FORMAT_LEFT: + xAligned = x; + break; + + case wxLIST_FORMAT_RIGHT: + xAligned = x + cw - wLabel; + break; + + case wxLIST_FORMAT_CENTER: + xAligned = x + (cw - wLabel) / 2; + break; + } + + // draw the text and image clipping them so that they + // don't overwrite the column boundary + wxDCClipper clipper(dc, x, HEADER_OFFSET_Y, cw, h ); + + // if we have an image, draw it on the right of the label + if ( imageList ) + { + imageList->Draw + ( + image, + dc, + xAligned + wLabel - ix - HEADER_IMAGE_MARGIN_IN_REPORT_MODE, + HEADER_OFFSET_Y + (h - 4 - iy)/2, + wxIMAGELIST_DRAW_TRANSPARENT + ); + } + + dc.DrawText( item.GetText(), + xAligned + EXTRA_WIDTH, h / 2 - hLabel / 2 ); //HEADER_OFFSET_Y + EXTRA_HEIGHT ); + + x += wCol; + } +} + +void wxListHeaderWindow::DrawCurrent() +{ +#if 1 + m_owner->SetColumnWidth( m_column, m_currentX - m_minX ); +#else + int x1 = m_currentX; + int y1 = 0; + m_owner->ClientToScreen( &x1, &y1 ); + + int x2 = m_currentX; + int y2 = 0; + m_owner->GetClientSize( NULL, &y2 ); + m_owner->ClientToScreen( &x2, &y2 ); + + wxScreenDC dc; + dc.SetLogicalFunction( wxINVERT ); + dc.SetPen( wxPen( *wxBLACK, 2, wxSOLID ) ); + dc.SetBrush( *wxTRANSPARENT_BRUSH ); + + AdjustDC(dc); + + dc.DrawLine( x1, y1, x2, y2 ); + + dc.SetLogicalFunction( wxCOPY ); + + dc.SetPen( wxNullPen ); + dc.SetBrush( wxNullBrush ); +#endif +} + +void wxListHeaderWindow::OnMouse( wxMouseEvent &event ) +{ + // we want to work with logical coords + int x; + m_owner->CalcUnscrolledPosition(event.GetX(), 0, &x, NULL); + int y = event.GetY(); + + if (m_isDragging) + { + SendListEvent(wxEVT_COMMAND_LIST_COL_DRAGGING, event.GetPosition()); + + // we don't draw the line beyond our window, but we allow dragging it + // there + int w = 0; + GetClientSize( &w, NULL ); + m_owner->CalcUnscrolledPosition(w, 0, &w, NULL); + w -= 6; + + // erase the line if it was drawn + if ( m_currentX < w ) + DrawCurrent(); + + if (event.ButtonUp()) + { + ReleaseMouse(); + m_isDragging = false; + m_dirty = true; + m_owner->SetColumnWidth( m_column, m_currentX - m_minX ); + SendListEvent(wxEVT_COMMAND_LIST_COL_END_DRAG, event.GetPosition()); + } + else + { + if (x > m_minX + 7) + m_currentX = x; + else + m_currentX = m_minX + 7; + + // draw in the new location + if ( m_currentX < w ) + DrawCurrent(); + } + } + else // not dragging + { + m_minX = 0; + bool hit_border = false; + + // end of the current column + int xpos = 0; + + // find the column where this event occurred + int col, + countCol = m_owner->GetColumnCount(); + for (col = 0; col < countCol; col++) + { + xpos += m_owner->GetColumnWidth( col ); + m_column = col; + + if ( (abs(x-xpos) < 3) && (y < 22) ) + { + // near the column border + hit_border = true; + break; + } + + if ( x < xpos ) + { + // inside the column + break; + } + + m_minX = xpos; + } + + if ( col == countCol ) + m_column = -1; + + if (event.LeftDown() || event.RightUp()) + { + if (hit_border && event.LeftDown()) + { + if ( SendListEvent(wxEVT_COMMAND_LIST_COL_BEGIN_DRAG, + event.GetPosition()) ) + { + m_isDragging = true; + m_currentX = x; + CaptureMouse(); + DrawCurrent(); + } + //else: column resizing was vetoed by the user code + } + else // click on a column + { + // record the selected state of the columns + if (event.LeftDown()) + { + for (int i=0; i < m_owner->GetColumnCount(); i++) + { + wxListItem colItem; + m_owner->GetColumn(i, colItem); + long state = colItem.GetState(); + if (i == m_column) + colItem.SetState(state | wxLIST_STATE_SELECTED); + else + colItem.SetState(state & ~wxLIST_STATE_SELECTED); + m_owner->SetColumn(i, colItem); + } + } + + SendListEvent( event.LeftDown() + ? wxEVT_COMMAND_LIST_COL_CLICK + : wxEVT_COMMAND_LIST_COL_RIGHT_CLICK, + event.GetPosition()); + } + } + else if (event.Moving()) + { + bool setCursor; + if (hit_border) + { + setCursor = m_currentCursor == wxSTANDARD_CURSOR; + m_currentCursor = m_resizeCursor; + } + else + { + setCursor = m_currentCursor != wxSTANDARD_CURSOR; + m_currentCursor = wxSTANDARD_CURSOR; + } + + if ( setCursor ) + SetCursor(*m_currentCursor); + } + } +} + +void wxListHeaderWindow::OnSetFocus( wxFocusEvent &WXUNUSED(event) ) +{ + m_owner->SetFocus(); + m_owner->Update(); +} + +bool wxListHeaderWindow::SendListEvent(wxEventType type, const wxPoint& pos) +{ + wxWindow *parent = GetParent(); + wxListEvent le( type, parent->GetId() ); + le.SetEventObject( parent ); + le.m_pointDrag = pos; + + // the position should be relative to the parent window, not + // this one for compatibility with MSW and common sense: the + // user code doesn't know anything at all about this header + // window, so why should it get positions relative to it? + le.m_pointDrag.y -= GetSize().y; + + le.m_col = m_column; + return !parent->GetEventHandler()->ProcessEvent( le ) || le.IsAllowed(); +} + +//----------------------------------------------------------------------------- +// wxListRenameTimer (internal) +//----------------------------------------------------------------------------- + +wxListRenameTimer::wxListRenameTimer( wxListMainWindow *owner ) +{ + m_owner = owner; +} + +void wxListRenameTimer::Notify() +{ + m_owner->OnRenameTimer(); +} + +//----------------------------------------------------------------------------- +// wxListTextCtrlWrapper (internal) +//----------------------------------------------------------------------------- + +BEGIN_EVENT_TABLE(wxListTextCtrlWrapper, wxEvtHandler) + EVT_CHAR (wxListTextCtrlWrapper::OnChar) + EVT_KEY_UP (wxListTextCtrlWrapper::OnKeyUp) + EVT_KILL_FOCUS (wxListTextCtrlWrapper::OnKillFocus) +END_EVENT_TABLE() + +wxListTextCtrlWrapper::wxListTextCtrlWrapper(wxListMainWindow *owner, + wxTextCtrl *text, + size_t itemEdit) + : m_startValue(owner->GetItemText(itemEdit)), + m_itemEdited(itemEdit) +{ + m_owner = owner; + m_text = text; + m_finished = false; + m_aboutToFinish = false; + + wxRect rectLabel = owner->GetLineLabelRect(itemEdit); + + m_owner->CalcScrolledPosition(rectLabel.x, rectLabel.y, + &rectLabel.x, &rectLabel.y); + + m_text->Create(owner, wxID_ANY, m_startValue, + wxPoint(rectLabel.x-4,rectLabel.y-4), + wxSize(rectLabel.width+11,rectLabel.height+8)); + m_text->SetFocus(); + + m_text->PushEventHandler(this); +} + +void wxListTextCtrlWrapper::Finish() +{ + if ( !m_finished ) + { + m_finished = true; + + m_text->RemoveEventHandler(this); + m_owner->FinishEditing(m_text); + + wxPendingDelete.Append( this ); + } +} + +bool wxListTextCtrlWrapper::AcceptChanges() +{ + const wxString value = m_text->GetValue(); + + // notice that we should always call OnRenameAccept() to generate the "end + // label editing" event, even if the user hasn't really changed anything + if ( !m_owner->OnRenameAccept(m_itemEdited, value) ) + { + // vetoed by the user + return false; + } + + // accepted, do rename the item (unless nothing changed) + if ( value != m_startValue ) + m_owner->SetItemText(m_itemEdited, value); + + return true; +} + +void wxListTextCtrlWrapper::AcceptChangesAndFinish() +{ + m_aboutToFinish = true; + + // Notify the owner about the changes + AcceptChanges(); + + // Even if vetoed, close the control (consistent with MSW) + Finish(); +} + +void wxListTextCtrlWrapper::OnChar( wxKeyEvent &event ) +{ + switch ( event.m_keyCode ) + { + case WXK_RETURN: + AcceptChangesAndFinish(); + break; + + case WXK_ESCAPE: + m_owner->OnRenameCancelled( m_itemEdited ); + Finish(); + break; + + default: + event.Skip(); + } +} + +void wxListTextCtrlWrapper::OnKeyUp( wxKeyEvent &event ) +{ + if (m_finished) + { + event.Skip(); + return; + } + + // auto-grow the textctrl: + wxSize parentSize = m_owner->GetSize(); + wxPoint myPos = m_text->GetPosition(); + wxSize mySize = m_text->GetSize(); + int sx, sy; + m_text->GetTextExtent(m_text->GetValue() + _T("MM"), &sx, &sy); + if (myPos.x + sx > parentSize.x) + sx = parentSize.x - myPos.x; + if (mySize.x > sx) + sx = mySize.x; + m_text->SetSize(sx, wxDefaultCoord); + + event.Skip(); +} + +void wxListTextCtrlWrapper::OnKillFocus( wxFocusEvent &event ) +{ + if ( !m_finished && !m_aboutToFinish ) + { + if ( !AcceptChanges() ) + m_owner->OnRenameCancelled( m_itemEdited ); + + Finish(); + } + + // We must let the native text control handle focus + event.Skip(); +} + +//----------------------------------------------------------------------------- +// wxListMainWindow +//----------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxListMainWindow,wxScrolledWindow) + +BEGIN_EVENT_TABLE(wxListMainWindow,wxScrolledWindow) + EVT_PAINT (wxListMainWindow::OnPaint) + EVT_MOUSE_EVENTS (wxListMainWindow::OnMouse) + EVT_CHAR (wxListMainWindow::OnChar) + EVT_KEY_DOWN (wxListMainWindow::OnKeyDown) + EVT_KEY_UP (wxListMainWindow::OnKeyUp) + EVT_SET_FOCUS (wxListMainWindow::OnSetFocus) + EVT_KILL_FOCUS (wxListMainWindow::OnKillFocus) + EVT_SCROLLWIN (wxListMainWindow::OnScroll) +END_EVENT_TABLE() + +void wxListMainWindow::Init() +{ + m_dirty = true; + m_countVirt = 0; + m_lineFrom = + m_lineTo = (size_t)-1; + m_linesPerPage = 0; + + m_headerWidth = + m_lineHeight = 0; + + m_small_image_list = (wxImageList *) NULL; + m_normal_image_list = (wxImageList *) NULL; + + m_small_spacing = 30; + m_normal_spacing = 40; + + m_hasFocus = false; + m_dragCount = 0; + m_isCreated = false; + + m_lastOnSame = false; + m_renameTimer = new wxListRenameTimer( this ); + m_textctrlWrapper = NULL; + + m_current = + m_lineLastClicked = + m_lineSelectSingleOnUp = + m_lineBeforeLastClicked = (size_t)-1; + + m_freezeCount = 0; +} + +wxListMainWindow::wxListMainWindow() +{ + Init(); + + m_highlightBrush = + m_highlightUnfocusedBrush = (wxBrush *) NULL; +} + +wxListMainWindow::wxListMainWindow( wxWindow *parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + long style, + const wxString &name ) + : wxScrolledWindow( parent, id, pos, size, + style | wxHSCROLL | wxVSCROLL, name ) +{ + Init(); + + m_highlightBrush = new wxBrush + ( + wxSystemSettings::GetColour + ( + wxSYS_COLOUR_HIGHLIGHT + ), + wxSOLID + ); + + m_highlightUnfocusedBrush = new wxBrush + ( + wxSystemSettings::GetColour + ( + wxSYS_COLOUR_BTNSHADOW + ), + wxSOLID + ); + + SetScrollbars( 0, 0, 0, 0, 0, 0 ); + + wxVisualAttributes attr = wxGenericListCtrl::GetClassDefaultAttributes(); + SetOwnForegroundColour( attr.colFg ); + SetOwnBackgroundColour( attr.colBg ); + if (!m_hasFont) + SetOwnFont( attr.font ); +} + +wxListMainWindow::~wxListMainWindow() +{ + DoDeleteAllItems(); + WX_CLEAR_LIST(wxListHeaderDataList, m_columns); + WX_CLEAR_ARRAY(m_aColWidths); + + delete m_highlightBrush; + delete m_highlightUnfocusedBrush; + delete m_renameTimer; +} + +void wxListMainWindow::CacheLineData(size_t line) +{ + wxGenericListCtrl *listctrl = GetListCtrl(); + + wxListLineData *ld = GetDummyLine(); + + size_t countCol = GetColumnCount(); + for ( size_t col = 0; col < countCol; col++ ) + { + ld->SetText(col, listctrl->OnGetItemText(line, col)); + ld->SetImage(col, listctrl->OnGetItemColumnImage(line, col)); + } + + ld->SetAttr(listctrl->OnGetItemAttr(line)); +} + +wxListLineData *wxListMainWindow::GetDummyLine() const +{ + wxASSERT_MSG( !IsEmpty(), _T("invalid line index") ); + wxASSERT_MSG( IsVirtual(), _T("GetDummyLine() shouldn't be called") ); + + wxListMainWindow *self = wxConstCast(this, wxListMainWindow); + + // we need to recreate the dummy line if the number of columns in the + // control changed as it would have the incorrect number of fields + // otherwise + if ( !m_lines.IsEmpty() && + m_lines[0].m_items.GetCount() != (size_t)GetColumnCount() ) + { + self->m_lines.Clear(); + } + + if ( m_lines.IsEmpty() ) + { + wxListLineData *line = new wxListLineData(self); + self->m_lines.Add(line); + + // don't waste extra memory -- there never going to be anything + // else/more in this array + self->m_lines.Shrink(); + } + + return &m_lines[0]; +} + +// ---------------------------------------------------------------------------- +// line geometry (report mode only) +// ---------------------------------------------------------------------------- + +wxCoord wxListMainWindow::GetLineHeight() const +{ + // we cache the line height as calling GetTextExtent() is slow + if ( !m_lineHeight ) + { + wxListMainWindow *self = wxConstCast(this, wxListMainWindow); + + wxClientDC dc( self ); + dc.SetFont( GetFont() ); + + wxCoord y; + dc.GetTextExtent(_T("H"), NULL, &y); + + if ( m_small_image_list && m_small_image_list->GetImageCount() ) + { + int iw = 0, ih = 0; + m_small_image_list->GetSize(0, iw, ih); + y = wxMax(y, ih); + } + + y += EXTRA_HEIGHT; + self->m_lineHeight = y + LINE_SPACING; + } + + return m_lineHeight; +} + +wxCoord wxListMainWindow::GetLineY(size_t line) const +{ + wxASSERT_MSG( InReportView(), _T("only works in report mode") ); + + return LINE_SPACING + line * GetLineHeight(); +} + +wxRect wxListMainWindow::GetLineRect(size_t line) const +{ + if ( !InReportView() ) + return GetLine(line)->m_gi->m_rectAll; + + wxRect rect; + rect.x = HEADER_OFFSET_X; + rect.y = GetLineY(line); + rect.width = GetHeaderWidth(); + rect.height = GetLineHeight(); + + return rect; +} + +wxRect wxListMainWindow::GetLineLabelRect(size_t line) const +{ + if ( !InReportView() ) + return GetLine(line)->m_gi->m_rectLabel; + + int image_x = 0; + wxListLineData *data = GetLine(line); + wxListItemDataList::compatibility_iterator node = data->m_items.GetFirst(); + if (node) + { + wxListItemData *item = node->GetData(); + if ( item->HasImage() ) + { + int ix, iy; + GetImageSize( item->GetImage(), ix, iy ); + image_x = 3 + ix + IMAGE_MARGIN_IN_REPORT_MODE; + } + } + + wxRect rect; + rect.x = image_x + HEADER_OFFSET_X; + rect.y = GetLineY(line); + rect.width = GetColumnWidth(0) - image_x; + rect.height = GetLineHeight(); + + return rect; +} + +wxRect wxListMainWindow::GetLineIconRect(size_t line) const +{ + if ( !InReportView() ) + return GetLine(line)->m_gi->m_rectIcon; + + wxListLineData *ld = GetLine(line); + wxASSERT_MSG( ld->HasImage(), _T("should have an image") ); + + wxRect rect; + rect.x = HEADER_OFFSET_X; + rect.y = GetLineY(line); + GetImageSize(ld->GetImage(), rect.width, rect.height); + + return rect; +} + +wxRect wxListMainWindow::GetLineHighlightRect(size_t line) const +{ + return InReportView() ? GetLineRect(line) + : GetLine(line)->m_gi->m_rectHighlight; +} + +long wxListMainWindow::HitTestLine(size_t line, int x, int y) const +{ + wxASSERT_MSG( line < GetItemCount(), _T("invalid line in HitTestLine") ); + + wxListLineData *ld = GetLine(line); + + if ( ld->HasImage() && GetLineIconRect(line).Contains(x, y) ) + return wxLIST_HITTEST_ONITEMICON; + + // VS: Testing for "ld->HasText() || InReportView()" instead of + // "ld->HasText()" is needed to make empty lines in report view + // possible + if ( ld->HasText() || InReportView() ) + { + wxRect rect = InReportView() ? GetLineRect(line) + : GetLineLabelRect(line); + + if ( rect.Contains(x, y) ) + return wxLIST_HITTEST_ONITEMLABEL; + } + + return 0; +} + +// ---------------------------------------------------------------------------- +// highlight (selection) handling +// ---------------------------------------------------------------------------- + +bool wxListMainWindow::IsHighlighted(size_t line) const +{ + if ( IsVirtual() ) + { + return m_selStore.IsSelected(line); + } + else // !virtual + { + wxListLineData *ld = GetLine(line); + wxCHECK_MSG( ld, false, _T("invalid index in IsHighlighted") ); + + return ld->IsHighlighted(); + } +} + +void wxListMainWindow::HighlightLines( size_t lineFrom, + size_t lineTo, + bool highlight ) +{ + if ( IsVirtual() ) + { + wxArrayInt linesChanged; + if ( !m_selStore.SelectRange(lineFrom, lineTo, highlight, + &linesChanged) ) + { + // meny items changed state, refresh everything + RefreshLines(lineFrom, lineTo); + } + else // only a few items changed state, refresh only them + { + size_t count = linesChanged.GetCount(); + for ( size_t n = 0; n < count; n++ ) + { + RefreshLine(linesChanged[n]); + } + } + } + else // iterate over all items in non report view + { + for ( size_t line = lineFrom; line <= lineTo; line++ ) + { + if ( HighlightLine(line, highlight) ) + RefreshLine(line); + } + } +} + +bool wxListMainWindow::HighlightLine( size_t line, bool highlight ) +{ + bool changed; + + if ( IsVirtual() ) + { + changed = m_selStore.SelectItem(line, highlight); + } + else // !virtual + { + wxListLineData *ld = GetLine(line); + wxCHECK_MSG( ld, false, _T("invalid index in HighlightLine") ); + + changed = ld->Highlight(highlight); + } + + if ( changed ) + { + SendNotify( line, highlight ? wxEVT_COMMAND_LIST_ITEM_SELECTED + : wxEVT_COMMAND_LIST_ITEM_DESELECTED ); + } + + return changed; +} + +void wxListMainWindow::RefreshLine( size_t line ) +{ + if ( InReportView() ) + { + size_t visibleFrom, visibleTo; + GetVisibleLinesRange(&visibleFrom, &visibleTo); + + if ( line < visibleFrom || line > visibleTo ) + return; + } + + wxRect rect = GetLineRect(line); + + CalcScrolledPosition( rect.x, rect.y, &rect.x, &rect.y ); + RefreshRect( rect ); +} + +void wxListMainWindow::RefreshLines( size_t lineFrom, size_t lineTo ) +{ + // we suppose that they are ordered by caller + wxASSERT_MSG( lineFrom <= lineTo, _T("indices in disorder") ); + + wxASSERT_MSG( lineTo < GetItemCount(), _T("invalid line range") ); + + if ( InReportView() ) + { + size_t visibleFrom, visibleTo; + GetVisibleLinesRange(&visibleFrom, &visibleTo); + + if ( lineFrom < visibleFrom ) + lineFrom = visibleFrom; + if ( lineTo > visibleTo ) + lineTo = visibleTo; + + wxRect rect; + rect.x = 0; + rect.y = GetLineY(lineFrom); + rect.width = GetClientSize().x; + rect.height = GetLineY(lineTo) - rect.y + GetLineHeight(); + + CalcScrolledPosition( rect.x, rect.y, &rect.x, &rect.y ); + RefreshRect( rect ); + } + else // !report + { + // TODO: this should be optimized... + for ( size_t line = lineFrom; line <= lineTo; line++ ) + { + RefreshLine(line); + } + } +} + +void wxListMainWindow::RefreshAfter( size_t lineFrom ) +{ + if ( InReportView() ) + { + size_t visibleFrom, visibleTo; + GetVisibleLinesRange(&visibleFrom, &visibleTo); + + if ( lineFrom < visibleFrom ) + lineFrom = visibleFrom; + else if ( lineFrom > visibleTo ) + return; + + wxRect rect; + rect.x = 0; + rect.y = GetLineY(lineFrom); + CalcScrolledPosition( rect.x, rect.y, &rect.x, &rect.y ); + + wxSize size = GetClientSize(); + rect.width = size.x; + + // refresh till the bottom of the window + rect.height = size.y - rect.y; + + RefreshRect( rect ); + } + else // !report + { + // TODO: how to do it more efficiently? + m_dirty = true; + } +} + +void wxListMainWindow::RefreshSelected() +{ + if ( IsEmpty() ) + return; + + size_t from, to; + if ( InReportView() ) + { + GetVisibleLinesRange(&from, &to); + } + else // !virtual + { + from = 0; + to = GetItemCount() - 1; + } + + if ( HasCurrent() && m_current >= from && m_current <= to ) + RefreshLine(m_current); + + for ( size_t line = from; line <= to; line++ ) + { + // NB: the test works as expected even if m_current == -1 + if ( line != m_current && IsHighlighted(line) ) + RefreshLine(line); + } +} + +void wxListMainWindow::Freeze() +{ + m_freezeCount++; +} + +void wxListMainWindow::Thaw() +{ + wxCHECK_RET( m_freezeCount > 0, _T("thawing unfrozen list control?") ); + + if ( --m_freezeCount == 0 ) + Refresh(); +} + +void wxListMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) +{ + // Note: a wxPaintDC must be constructed even if no drawing is + // done (a Windows requirement). + wxPaintDC dc( this ); + + if ( IsEmpty() || m_freezeCount ) + // nothing to draw or not the moment to draw it + return; + + if ( m_dirty ) + // delay the repainting until we calculate all the items positions + return; + + PrepareDC( dc ); + + int dev_x, dev_y; + CalcScrolledPosition( 0, 0, &dev_x, &dev_y ); + + dc.SetFont( GetFont() ); + + if ( InReportView() ) + { + int lineHeight = GetLineHeight(); + + size_t visibleFrom, visibleTo; + GetVisibleLinesRange(&visibleFrom, &visibleTo); + + wxRect rectLine; + int xOrig = dc.LogicalToDeviceX( 0 ); + int yOrig = dc.LogicalToDeviceY( 0 ); + + // tell the caller cache to cache the data + if ( IsVirtual() ) + { + wxListEvent evCache(wxEVT_COMMAND_LIST_CACHE_HINT, + GetParent()->GetId()); + evCache.SetEventObject( GetParent() ); + evCache.m_oldItemIndex = visibleFrom; + evCache.m_itemIndex = visibleTo; + GetParent()->GetEventHandler()->ProcessEvent( evCache ); + } + + for ( size_t line = visibleFrom; line <= visibleTo; line++ ) + { + rectLine = GetLineRect(line); + + + if ( !IsExposed(rectLine.x + xOrig, rectLine.y + yOrig, + rectLine.width, rectLine.height) ) + { + // don't redraw unaffected lines to avoid flicker + continue; + } + + GetLine(line)->DrawInReportMode( &dc, + rectLine, + GetLineHighlightRect(line), + IsHighlighted(line) ); + } + + if ( HasFlag(wxLC_HRULES) ) + { + wxPen pen(GetRuleColour(), 1, wxSOLID); + wxSize clientSize = GetClientSize(); + + size_t i = visibleFrom; + if (i == 0) i = 1; // Don't draw the first one + for ( ; i <= visibleTo; i++ ) + { + dc.SetPen(pen); + dc.SetBrush( *wxTRANSPARENT_BRUSH ); + dc.DrawLine(0 - dev_x, i * lineHeight, + clientSize.x - dev_x, i * lineHeight); + } + + // Draw last horizontal rule + if ( visibleTo == GetItemCount() - 1 ) + { + dc.SetPen( pen ); + dc.SetBrush( *wxTRANSPARENT_BRUSH ); + dc.DrawLine(0 - dev_x, (m_lineTo + 1) * lineHeight, + clientSize.x - dev_x , (m_lineTo + 1) * lineHeight ); + } + } + + // Draw vertical rules if required + if ( HasFlag(wxLC_VRULES) && !IsEmpty() ) + { + wxPen pen(GetRuleColour(), 1, wxSOLID); + wxRect firstItemRect, lastItemRect; + + GetItemRect(visibleFrom, firstItemRect); + GetItemRect(visibleTo, lastItemRect); + int x = firstItemRect.GetX(); + dc.SetPen(pen); + dc.SetBrush(* wxTRANSPARENT_BRUSH); + + for (int col = 0; col < GetColumnCount(); col++) + { + int colWidth = GetColumnWidth(col); + x += colWidth; + int x_pos = x - dev_x; + if (col < GetColumnCount()-1) x_pos -= 2; + dc.DrawLine(x_pos, firstItemRect.GetY() - 1 - dev_y, + x_pos, lastItemRect.GetBottom() + 1 - dev_y); + } + } + } + else // !report + { + size_t count = GetItemCount(); + for ( size_t i = 0; i < count; i++ ) + { + GetLine(i)->Draw( &dc ); + } + } + +#ifndef __WXMAC__ + // Don't draw rect outline under Mac at all. + if ( HasCurrent() ) + { + if ( m_hasFocus ) + { + wxRect rect( GetLineHighlightRect( m_current ) ); +#ifndef __WXGTK20__ + dc.SetPen( *wxBLACK_PEN ); + dc.SetBrush( *wxTRANSPARENT_BRUSH ); + dc.DrawRectangle( rect ); +#else + wxRendererNative::Get().DrawItemSelectionRect( this, dc, rect, wxCONTROL_CURRENT|wxCONTROL_FOCUSED ); + +#endif + } + } +#endif +} + +void wxListMainWindow::HighlightAll( bool on ) +{ + if ( IsSingleSel() ) + { + wxASSERT_MSG( !on, _T("can't do this in a single selection control") ); + + // we just have one item to turn off + if ( HasCurrent() && IsHighlighted(m_current) ) + { + HighlightLine(m_current, false); + RefreshLine(m_current); + } + } + else // multi selection + { + if ( !IsEmpty() ) + HighlightLines(0, GetItemCount() - 1, on); + } +} + +void wxListMainWindow::SendNotify( size_t line, + wxEventType command, + const wxPoint& point ) +{ + wxListEvent le( command, GetParent()->GetId() ); + le.SetEventObject( GetParent() ); + + le.m_itemIndex = line; + + // set only for events which have position + if ( point != wxDefaultPosition ) + le.m_pointDrag = point; + + // don't try to get the line info for virtual list controls: the main + // program has it anyhow and if we did it would result in accessing all + // the lines, even those which are not visible now and this is precisely + // what we're trying to avoid + if ( !IsVirtual() ) + { + if ( line != (size_t)-1 ) + { + GetLine(line)->GetItem( 0, le.m_item ); + } + //else: this happens for wxEVT_COMMAND_LIST_ITEM_FOCUSED event + } + //else: there may be no more such item + + GetParent()->GetEventHandler()->ProcessEvent( le ); +} + +void wxListMainWindow::ChangeCurrent(size_t current) +{ + m_current = current; + + // as the current item changed, we shouldn't start editing it when the + // "slow click" timer expires as the click happened on another item + if ( m_renameTimer->IsRunning() ) + m_renameTimer->Stop(); + + SendNotify(current, wxEVT_COMMAND_LIST_ITEM_FOCUSED); +} + +wxTextCtrl *wxListMainWindow::EditLabel(long item, wxClassInfo* textControlClass) +{ + wxCHECK_MSG( (item >= 0) && ((size_t)item < GetItemCount()), NULL, + wxT("wrong index in wxGenericListCtrl::EditLabel()") ); + + wxASSERT_MSG( textControlClass->IsKindOf(CLASSINFO(wxTextCtrl)), + wxT("EditLabel() needs a text control") ); + + size_t itemEdit = (size_t)item; + + wxListEvent le( wxEVT_COMMAND_LIST_BEGIN_LABEL_EDIT, GetParent()->GetId() ); + le.SetEventObject( GetParent() ); + le.m_itemIndex = item; + wxListLineData *data = GetLine(itemEdit); + wxCHECK_MSG( data, NULL, _T("invalid index in EditLabel()") ); + data->GetItem( 0, le.m_item ); + + if ( GetParent()->GetEventHandler()->ProcessEvent( le ) && !le.IsAllowed() ) + { + // vetoed by user code + return NULL; + } + + // We have to call this here because the label in question might just have + // been added and no screen update taken place. + if ( m_dirty ) + { + wxSafeYield(); + + // Pending events dispatched by wxSafeYield might have changed the item + // count + if ( (size_t)item >= GetItemCount() ) + return NULL; + } + + wxTextCtrl * const text = (wxTextCtrl *)textControlClass->CreateObject(); + m_textctrlWrapper = new wxListTextCtrlWrapper(this, text, item); + return m_textctrlWrapper->GetText(); +} + +void wxListMainWindow::OnRenameTimer() +{ + wxCHECK_RET( HasCurrent(), wxT("unexpected rename timer") ); + + EditLabel( m_current ); +} + +bool wxListMainWindow::OnRenameAccept(size_t itemEdit, const wxString& value) +{ + wxListEvent le( wxEVT_COMMAND_LIST_END_LABEL_EDIT, GetParent()->GetId() ); + le.SetEventObject( GetParent() ); + le.m_itemIndex = itemEdit; + + wxListLineData *data = GetLine(itemEdit); + + wxCHECK_MSG( data, false, _T("invalid index in OnRenameAccept()") ); + + data->GetItem( 0, le.m_item ); + le.m_item.m_text = value; + return !GetParent()->GetEventHandler()->ProcessEvent( le ) || + le.IsAllowed(); +} + +void wxListMainWindow::OnRenameCancelled(size_t itemEdit) +{ + // let owner know that the edit was cancelled + wxListEvent le( wxEVT_COMMAND_LIST_END_LABEL_EDIT, GetParent()->GetId() ); + + le.SetEditCanceled(true); + + le.SetEventObject( GetParent() ); + le.m_itemIndex = itemEdit; + + wxListLineData *data = GetLine(itemEdit); + wxCHECK_RET( data, _T("invalid index in OnRenameCancelled()") ); + + data->GetItem( 0, le.m_item ); + GetEventHandler()->ProcessEvent( le ); +} + +void wxListMainWindow::OnMouse( wxMouseEvent &event ) +{ + +#ifdef __WXMAC__ + // On wxMac we can't depend on the EVT_KILL_FOCUS event to properly + // shutdown the edit control when the mouse is clicked elsewhere on the + // listctrl because the order of events is different (or something like + // that), so explicitly end the edit if it is active. + if ( event.LeftDown() && m_textctrlWrapper ) + m_textctrlWrapper->AcceptChangesAndFinish(); +#endif // __WXMAC__ + + if ( event.LeftDown() ) + SetFocusIgnoringChildren(); + + event.SetEventObject( GetParent() ); + if ( GetParent()->GetEventHandler()->ProcessEvent( event) ) + return; + + if (event.GetEventType() == wxEVT_MOUSEWHEEL) + { + // let the base handle mouse wheel events. + event.Skip(); + return; + } + + if ( !HasCurrent() || IsEmpty() ) + { + if (event.RightDown()) + { + SendNotify( (size_t)-1, wxEVT_COMMAND_LIST_ITEM_RIGHT_CLICK, event.GetPosition() ); + // Allow generation of context menu event + event.Skip(); + } + return; + } + + if (m_dirty) + return; + + if ( !(event.Dragging() || event.ButtonDown() || event.LeftUp() || + event.ButtonDClick()) ) + return; + + int x = event.GetX(); + int y = event.GetY(); + CalcUnscrolledPosition( x, y, &x, &y ); + + // where did we hit it (if we did)? + long hitResult = 0; + + size_t count = GetItemCount(), + current; + + if ( InReportView() ) + { + current = y / GetLineHeight(); + if ( current < count ) + hitResult = HitTestLine(current, x, y); + } + else // !report + { + // TODO: optimize it too! this is less simple than for report view but + // enumerating all items is still not a way to do it!! + for ( current = 0; current < count; current++ ) + { + hitResult = HitTestLine(current, x, y); + if ( hitResult ) + break; + } + } + + if (event.Dragging()) + { + if (m_dragCount == 0) + { + // we have to report the raw, physical coords as we want to be + // able to call HitTest(event.m_pointDrag) from the user code to + // get the item being dragged + m_dragStart = event.GetPosition(); + } + + m_dragCount++; + + if (m_dragCount != 3) + return; + + int command = event.RightIsDown() ? wxEVT_COMMAND_LIST_BEGIN_RDRAG + : wxEVT_COMMAND_LIST_BEGIN_DRAG; + + wxListEvent le( command, GetParent()->GetId() ); + le.SetEventObject( GetParent() ); + le.m_itemIndex = m_lineLastClicked; + le.m_pointDrag = m_dragStart; + GetParent()->GetEventHandler()->ProcessEvent( le ); + + return; + } + else + { + m_dragCount = 0; + } + + if ( !hitResult ) + { + // outside of any item + if (event.RightDown()) + { + SendNotify( (size_t) -1, wxEVT_COMMAND_LIST_ITEM_RIGHT_CLICK, event.GetPosition() ); + + wxContextMenuEvent evtCtx( + wxEVT_CONTEXT_MENU, + GetParent()->GetId(), + ClientToScreen(event.GetPosition())); + evtCtx.SetEventObject(GetParent()); + GetParent()->GetEventHandler()->ProcessEvent(evtCtx); + } + else + { + // reset the selection and bail out + HighlightAll(false); + } + + return; + } + + bool forceClick = false; + if (event.ButtonDClick()) + { + if ( m_renameTimer->IsRunning() ) + m_renameTimer->Stop(); + + m_lastOnSame = false; + + if ( current == m_lineLastClicked ) + { + SendNotify( current, wxEVT_COMMAND_LIST_ITEM_ACTIVATED ); + + return; + } + else + { + // The first click was on another item, so don't interpret this as + // a double click, but as a simple click instead + forceClick = true; + } + } + + if (event.LeftUp()) + { + if (m_lineSelectSingleOnUp != (size_t)-1) + { + // select single line + HighlightAll( false ); + ReverseHighlight(m_lineSelectSingleOnUp); + } + + if (m_lastOnSame) + { + if ((current == m_current) && + (hitResult == wxLIST_HITTEST_ONITEMLABEL) && + HasFlag(wxLC_EDIT_LABELS) ) + { + if (InReportView()) + { + wxRect label = GetLineLabelRect( current ); + if (label.Contains( x, y )) + m_renameTimer->Start( 250, true ); + + } + else + m_renameTimer->Start( 250, true ); + } + } + + m_lastOnSame = false; + m_lineSelectSingleOnUp = (size_t)-1; + } + else + { + // This is necessary, because after a DnD operation in + // from and to ourself, the up event is swallowed by the + // DnD code. So on next non-up event (which means here and + // now) m_lineSelectSingleOnUp should be reset. + m_lineSelectSingleOnUp = (size_t)-1; + } + if (event.RightDown()) + { + m_lineBeforeLastClicked = m_lineLastClicked; + m_lineLastClicked = current; + + // If the item is already selected, do not update the selection. + // Multi-selections should not be cleared if a selected item is clicked. + if (!IsHighlighted(current)) + { + HighlightAll(false); + ChangeCurrent(current); + ReverseHighlight(m_current); + } + + SendNotify( current, wxEVT_COMMAND_LIST_ITEM_RIGHT_CLICK, event.GetPosition() ); + + wxContextMenuEvent evtCtx( + wxEVT_CONTEXT_MENU, + GetParent()->GetId(), + ClientToScreen(event.GetPosition())); + evtCtx.SetEventObject(GetParent()); + GetParent()->GetEventHandler()->ProcessEvent(evtCtx); + } + else if (event.MiddleDown()) + { + SendNotify( current, wxEVT_COMMAND_LIST_ITEM_MIDDLE_CLICK ); + } + else if ( event.LeftDown() || forceClick ) + { + m_lineBeforeLastClicked = m_lineLastClicked; + m_lineLastClicked = current; + + size_t oldCurrent = m_current; + bool oldWasSelected = IsHighlighted(m_current); + + bool cmdModifierDown = event.CmdDown(); + if ( IsSingleSel() || !(cmdModifierDown || event.ShiftDown()) ) + { + if ( IsSingleSel() || !IsHighlighted(current) ) + { + HighlightAll( false ); + + ChangeCurrent(current); + + ReverseHighlight(m_current); + } + else // multi sel & current is highlighted & no mod keys + { + m_lineSelectSingleOnUp = current; + ChangeCurrent(current); // change focus + } + } + else // multi sel & either ctrl or shift is down + { + if (cmdModifierDown) + { + ChangeCurrent(current); + + ReverseHighlight(m_current); + } + else if (event.ShiftDown()) + { + ChangeCurrent(current); + + size_t lineFrom = oldCurrent, + lineTo = current; + + if ( lineTo < lineFrom ) + { + lineTo = lineFrom; + lineFrom = m_current; + } + + HighlightLines(lineFrom, lineTo); + } + else // !ctrl, !shift + { + // test in the enclosing if should make it impossible + wxFAIL_MSG( _T("how did we get here?") ); + } + } + + if (m_current != oldCurrent) + RefreshLine( oldCurrent ); + + // forceClick is only set if the previous click was on another item + m_lastOnSame = !forceClick && (m_current == oldCurrent) && oldWasSelected; + } +} + +void wxListMainWindow::MoveToItem(size_t item) +{ + if ( item == (size_t)-1 ) + return; + + wxRect rect = GetLineRect(item); + + int client_w, client_h; + GetClientSize( &client_w, &client_h ); + + const int hLine = GetLineHeight(); + + int view_x = SCROLL_UNIT_X * GetScrollPos( wxHORIZONTAL ); + int view_y = hLine * GetScrollPos( wxVERTICAL ); + + if ( InReportView() ) + { + // the next we need the range of lines shown it might be different, + // so recalculate it + ResetVisibleLinesRange(); + + if (rect.y < view_y) + Scroll( -1, rect.y / hLine ); + if (rect.y + rect.height + 5 > view_y + client_h) + Scroll( -1, (rect.y + rect.height - client_h + hLine) / hLine ); + +#ifdef __WXMAC__ + // At least on Mac the visible lines value will get reset inside of + // Scroll *before* it actually scrolls the window because of the + // Update() that happens there, so it will still have the wrong value. + // So let's reset it again and wait for it to be recalculated in the + // next paint event. I would expect this problem to show up in wxGTK + // too but couldn't duplicate it there. Perhaps the order of events + // is different... --Robin + ResetVisibleLinesRange(); +#endif + } + else // !report + { + if (rect.x-view_x < 5) + Scroll( (rect.x - 5) / SCROLL_UNIT_X, -1 ); + if (rect.x + rect.width - 5 > view_x + client_w) + Scroll( (rect.x + rect.width - client_w + SCROLL_UNIT_X) / SCROLL_UNIT_X, -1 ); + } +} + +// ---------------------------------------------------------------------------- +// keyboard handling +// ---------------------------------------------------------------------------- + +void wxListMainWindow::OnArrowChar(size_t newCurrent, const wxKeyEvent& event) +{ + wxCHECK_RET( newCurrent < (size_t)GetItemCount(), + _T("invalid item index in OnArrowChar()") ); + + size_t oldCurrent = m_current; + + // in single selection we just ignore Shift as we can't select several + // items anyhow + if ( event.ShiftDown() && !IsSingleSel() ) + { + ChangeCurrent(newCurrent); + + // refresh the old focus to remove it + RefreshLine( oldCurrent ); + + // select all the items between the old and the new one + if ( oldCurrent > newCurrent ) + { + newCurrent = oldCurrent; + oldCurrent = m_current; + } + + HighlightLines(oldCurrent, newCurrent); + } + else // !shift + { + // all previously selected items are unselected unless ctrl is held + // in a multiselection control + if ( !event.ControlDown() || IsSingleSel() ) + HighlightAll(false); + + ChangeCurrent(newCurrent); + + // refresh the old focus to remove it + RefreshLine( oldCurrent ); + + // in single selection mode we must always have a selected item + if ( !event.ControlDown() || IsSingleSel() ) + HighlightLine( m_current, true ); + } + + RefreshLine( m_current ); + + MoveToFocus(); +} + +void wxListMainWindow::OnKeyDown( wxKeyEvent &event ) +{ + wxWindow *parent = GetParent(); + + // propagate the key event upwards + wxKeyEvent ke( wxEVT_KEY_DOWN ); + ke.m_shiftDown = event.m_shiftDown; + ke.m_controlDown = event.m_controlDown; + ke.m_altDown = event.m_altDown; + ke.m_metaDown = event.m_metaDown; + ke.m_keyCode = event.m_keyCode; + ke.m_x = event.m_x; + ke.m_y = event.m_y; + ke.SetEventObject( parent ); + if (parent->GetEventHandler()->ProcessEvent( ke )) return; + + event.Skip(); +} + +void wxListMainWindow::OnKeyUp( wxKeyEvent &event ) +{ + wxWindow *parent = GetParent(); + + // propagate the key event upwards + wxKeyEvent ke( wxEVT_KEY_UP ); + ke.m_shiftDown = event.m_shiftDown; + ke.m_controlDown = event.m_controlDown; + ke.m_altDown = event.m_altDown; + ke.m_metaDown = event.m_metaDown; + ke.m_keyCode = event.m_keyCode; + ke.m_x = event.m_x; + ke.m_y = event.m_y; + ke.SetEventObject( parent ); + if (parent->GetEventHandler()->ProcessEvent( ke )) return; + + event.Skip(); +} + +void wxListMainWindow::OnChar( wxKeyEvent &event ) +{ + wxWindow *parent = GetParent(); + + // send a list_key event up + if ( HasCurrent() ) + { + wxListEvent le( wxEVT_COMMAND_LIST_KEY_DOWN, GetParent()->GetId() ); + le.m_itemIndex = m_current; + GetLine(m_current)->GetItem( 0, le.m_item ); + le.m_code = event.GetKeyCode(); + le.SetEventObject( parent ); + parent->GetEventHandler()->ProcessEvent( le ); + } + + // propagate the char event upwards + wxKeyEvent ke( wxEVT_CHAR ); + ke.m_shiftDown = event.m_shiftDown; + ke.m_controlDown = event.m_controlDown; + ke.m_altDown = event.m_altDown; + ke.m_metaDown = event.m_metaDown; + ke.m_keyCode = event.m_keyCode; + ke.m_x = event.m_x; + ke.m_y = event.m_y; + ke.SetEventObject( parent ); + if (parent->GetEventHandler()->ProcessEvent( ke )) return; + + if (event.GetKeyCode() == WXK_TAB) + { + wxNavigationKeyEvent nevent; + nevent.SetWindowChange( event.ControlDown() ); + nevent.SetDirection( !event.ShiftDown() ); + nevent.SetEventObject( GetParent()->GetParent() ); + nevent.SetCurrentFocus( m_parent ); + if (GetParent()->GetParent()->GetEventHandler()->ProcessEvent( nevent )) + return; + } + + // no item -> nothing to do + if (!HasCurrent()) + { + event.Skip(); + return; + } + + // don't use m_linesPerPage directly as it might not be computed yet + const int pageSize = GetCountPerPage(); + wxCHECK_RET( pageSize, _T("should have non zero page size") ); + + if (GetLayoutDirection() == wxLayout_RightToLeft) + { + if (event.GetKeyCode() == WXK_RIGHT) + event.m_keyCode = WXK_LEFT; + else if (event.GetKeyCode() == WXK_LEFT) + event.m_keyCode = WXK_RIGHT; + } + + switch ( event.GetKeyCode() ) + { + case WXK_UP: + if ( m_current > 0 ) + OnArrowChar( m_current - 1, event ); + break; + + case WXK_DOWN: + if ( m_current < (size_t)GetItemCount() - 1 ) + OnArrowChar( m_current + 1, event ); + break; + + case WXK_END: + if (!IsEmpty()) + OnArrowChar( GetItemCount() - 1, event ); + break; + + case WXK_HOME: + if (!IsEmpty()) + OnArrowChar( 0, event ); + break; + + case WXK_PAGEUP: + { + int steps = InReportView() ? pageSize - 1 + : m_current % pageSize; + + int index = m_current - steps; + if (index < 0) + index = 0; + + OnArrowChar( index, event ); + } + break; + + case WXK_PAGEDOWN: + { + int steps = InReportView() + ? pageSize - 1 + : pageSize - (m_current % pageSize) - 1; + + size_t index = m_current + steps; + size_t count = GetItemCount(); + if ( index >= count ) + index = count - 1; + + OnArrowChar( index, event ); + } + break; + + case WXK_LEFT: + if ( !InReportView() ) + { + int index = m_current - pageSize; + if (index < 0) + index = 0; + + OnArrowChar( index, event ); + } + break; + + case WXK_RIGHT: + if ( !InReportView() ) + { + size_t index = m_current + pageSize; + + size_t count = GetItemCount(); + if ( index >= count ) + index = count - 1; + + OnArrowChar( index, event ); + } + break; + + case WXK_SPACE: + if ( IsSingleSel() ) + { + if ( event.ControlDown() ) + { + ReverseHighlight(m_current); + } + else // normal space press + { + SendNotify( m_current, wxEVT_COMMAND_LIST_ITEM_ACTIVATED ); + } + } + else // multiple selection + { + ReverseHighlight(m_current); + } + break; + + case WXK_RETURN: + case WXK_EXECUTE: + SendNotify( m_current, wxEVT_COMMAND_LIST_ITEM_ACTIVATED ); + break; + + default: + event.Skip(); + } +} + +// ---------------------------------------------------------------------------- +// focus handling +// ---------------------------------------------------------------------------- + +void wxListMainWindow::OnSetFocus( wxFocusEvent &WXUNUSED(event) ) +{ + if ( GetParent() ) + { + wxFocusEvent event( wxEVT_SET_FOCUS, GetParent()->GetId() ); + event.SetEventObject( GetParent() ); + if ( GetParent()->GetEventHandler()->ProcessEvent( event) ) + return; + } + + // wxGTK sends us EVT_SET_FOCUS events even if we had never got + // EVT_KILL_FOCUS before which means that we finish by redrawing the items + // which are already drawn correctly resulting in horrible flicker - avoid + // it + if ( !m_hasFocus ) + { + m_hasFocus = true; + + RefreshSelected(); + } +} + +void wxListMainWindow::OnKillFocus( wxFocusEvent &WXUNUSED(event) ) +{ + if ( GetParent() ) + { + wxFocusEvent event( wxEVT_KILL_FOCUS, GetParent()->GetId() ); + event.SetEventObject( GetParent() ); + if ( GetParent()->GetEventHandler()->ProcessEvent( event) ) + return; + } + + m_hasFocus = false; + RefreshSelected(); +} + +void wxListMainWindow::DrawImage( int index, wxDC *dc, int x, int y ) +{ + if ( HasFlag(wxLC_ICON) && (m_normal_image_list)) + { + m_normal_image_list->Draw( index, *dc, x, y, wxIMAGELIST_DRAW_TRANSPARENT ); + } + else if ( HasFlag(wxLC_SMALL_ICON) && (m_small_image_list)) + { + m_small_image_list->Draw( index, *dc, x, y, wxIMAGELIST_DRAW_TRANSPARENT ); + } + else if ( HasFlag(wxLC_LIST) && (m_small_image_list)) + { + m_small_image_list->Draw( index, *dc, x, y, wxIMAGELIST_DRAW_TRANSPARENT ); + } + else if ( InReportView() && (m_small_image_list)) + { + m_small_image_list->Draw( index, *dc, x, y, wxIMAGELIST_DRAW_TRANSPARENT ); + } +} + +void wxListMainWindow::GetImageSize( int index, int &width, int &height ) const +{ + if ( HasFlag(wxLC_ICON) && m_normal_image_list ) + { + m_normal_image_list->GetSize( index, width, height ); + } + else if ( HasFlag(wxLC_SMALL_ICON) && m_small_image_list ) + { + m_small_image_list->GetSize( index, width, height ); + } + else if ( HasFlag(wxLC_LIST) && m_small_image_list ) + { + m_small_image_list->GetSize( index, width, height ); + } + else if ( InReportView() && m_small_image_list ) + { + m_small_image_list->GetSize( index, width, height ); + } + else + { + width = + height = 0; + } +} + +int wxListMainWindow::GetTextLength( const wxString &s ) const +{ + wxClientDC dc( wxConstCast(this, wxListMainWindow) ); + dc.SetFont( GetFont() ); + + wxCoord lw; + dc.GetTextExtent( s, &lw, NULL ); + + return lw + AUTOSIZE_COL_MARGIN; +} + +void wxListMainWindow::SetImageList( wxImageList *imageList, int which ) +{ + m_dirty = true; + + // calc the spacing from the icon size + int width = 0, height = 0; + + if ((imageList) && (imageList->GetImageCount()) ) + imageList->GetSize(0, width, height); + + if (which == wxIMAGE_LIST_NORMAL) + { + m_normal_image_list = imageList; + m_normal_spacing = width + 8; + } + + if (which == wxIMAGE_LIST_SMALL) + { + m_small_image_list = imageList; + m_small_spacing = width + 14; + m_lineHeight = 0; // ensure that the line height will be recalc'd + } +} + +void wxListMainWindow::SetItemSpacing( int spacing, bool isSmall ) +{ + m_dirty = true; + if (isSmall) + m_small_spacing = spacing; + else + m_normal_spacing = spacing; +} + +int wxListMainWindow::GetItemSpacing( bool isSmall ) +{ + return isSmall ? m_small_spacing : m_normal_spacing; +} + +// ---------------------------------------------------------------------------- +// columns +// ---------------------------------------------------------------------------- + +void wxListMainWindow::SetColumn( int col, wxListItem &item ) +{ + wxListHeaderDataList::compatibility_iterator node = m_columns.Item( col ); + + wxCHECK_RET( node, _T("invalid column index in SetColumn") ); + + if ( item.m_width == wxLIST_AUTOSIZE_USEHEADER ) + item.m_width = GetTextLength( item.m_text ); + + wxListHeaderData *column = node->GetData(); + column->SetItem( item ); + + wxListHeaderWindow *headerWin = GetListCtrl()->m_headerWin; + if ( headerWin ) + headerWin->m_dirty = true; + + m_dirty = true; + + // invalidate it as it has to be recalculated + m_headerWidth = 0; +} + +void wxListMainWindow::SetColumnWidth( int col, int width ) +{ + wxCHECK_RET( col >= 0 && col < GetColumnCount(), + _T("invalid column index") ); + + wxCHECK_RET( InReportView(), + _T("SetColumnWidth() can only be called in report mode.") ); + + m_dirty = true; + wxListHeaderWindow *headerWin = GetListCtrl()->m_headerWin; + if ( headerWin ) + headerWin->m_dirty = true; + + wxListHeaderDataList::compatibility_iterator node = m_columns.Item( col ); + wxCHECK_RET( node, _T("no column?") ); + + wxListHeaderData *column = node->GetData(); + + size_t count = GetItemCount(); + + if (width == wxLIST_AUTOSIZE_USEHEADER) + { + width = GetTextLength(column->GetText()); + width += 2*EXTRA_WIDTH; + + // check for column header's image availability + const int image = column->GetImage(); + if ( image != -1 ) + { + if ( m_small_image_list ) + { + int ix = 0, iy = 0; + m_small_image_list->GetSize(image, ix, iy); + width += ix + HEADER_IMAGE_MARGIN_IN_REPORT_MODE; + } + } + } + else if ( width == wxLIST_AUTOSIZE ) + { + if ( IsVirtual() ) + { + // TODO: determine the max width somehow... + width = WIDTH_COL_DEFAULT; + } + else // !virtual + { + wxClientDC dc(this); + dc.SetFont( GetFont() ); + + int max = AUTOSIZE_COL_MARGIN; + + // if the cached column width isn't valid then recalculate it + if (m_aColWidths.Item(col)->bNeedsUpdate) + { + for (size_t i = 0; i < count; i++) + { + wxListLineData *line = GetLine( i ); + wxListItemDataList::compatibility_iterator n = line->m_items.Item( col ); + + wxCHECK_RET( n, _T("no subitem?") ); + + wxListItemData *itemData = n->GetData(); + wxListItem item; + + itemData->GetItem(item); + int itemWidth = GetItemWidthWithImage(&item); + if (itemWidth > max) + max = itemWidth; + } + + m_aColWidths.Item(col)->bNeedsUpdate = false; + m_aColWidths.Item(col)->nMaxWidth = max; + } + + max = m_aColWidths.Item(col)->nMaxWidth; + width = max + AUTOSIZE_COL_MARGIN; + } + } + + column->SetWidth( width ); + + // invalidate it as it has to be recalculated + m_headerWidth = 0; +} + +int wxListMainWindow::GetHeaderWidth() const +{ + if ( !m_headerWidth ) + { + wxListMainWindow *self = wxConstCast(this, wxListMainWindow); + + size_t count = GetColumnCount(); + for ( size_t col = 0; col < count; col++ ) + { + self->m_headerWidth += GetColumnWidth(col); + } + } + + return m_headerWidth; +} + +void wxListMainWindow::GetColumn( int col, wxListItem &item ) const +{ + wxListHeaderDataList::compatibility_iterator node = m_columns.Item( col ); + wxCHECK_RET( node, _T("invalid column index in GetColumn") ); + + wxListHeaderData *column = node->GetData(); + column->GetItem( item ); +} + +int wxListMainWindow::GetColumnWidth( int col ) const +{ + wxListHeaderDataList::compatibility_iterator node = m_columns.Item( col ); + wxCHECK_MSG( node, 0, _T("invalid column index") ); + + wxListHeaderData *column = node->GetData(); + return column->GetWidth(); +} + +// ---------------------------------------------------------------------------- +// item state +// ---------------------------------------------------------------------------- + +void wxListMainWindow::SetItem( wxListItem &item ) +{ + long id = item.m_itemId; + wxCHECK_RET( id >= 0 && (size_t)id < GetItemCount(), + _T("invalid item index in SetItem") ); + + if ( !IsVirtual() ) + { + wxListLineData *line = GetLine((size_t)id); + line->SetItem( item.m_col, item ); + + // Set item state if user wants + if ( item.m_mask & wxLIST_MASK_STATE ) + SetItemState( item.m_itemId, item.m_state, item.m_state ); + + if (InReportView()) + { + // update the Max Width Cache if needed + int width = GetItemWidthWithImage(&item); + + if (width > m_aColWidths.Item(item.m_col)->nMaxWidth) + m_aColWidths.Item(item.m_col)->nMaxWidth = width; + } + } + + // update the item on screen + wxRect rectItem; + GetItemRect(id, rectItem); + RefreshRect(rectItem); +} + +void wxListMainWindow::SetItemStateAll(long state, long stateMask) +{ + if ( IsEmpty() ) + return; + + // first deal with selection + if ( stateMask & wxLIST_STATE_SELECTED ) + { + // set/clear select state + if ( IsVirtual() ) + { + // optimized version for virtual listctrl. + m_selStore.SelectRange(0, GetItemCount() - 1, state == wxLIST_STATE_SELECTED); + Refresh(); + } + else if ( state & wxLIST_STATE_SELECTED ) + { + const long count = GetItemCount(); + for( long i = 0; i < count; i++ ) + { + SetItemState( i, wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED ); + } + + } + else + { + // clear for non virtual (somewhat optimized by using GetNextItem()) + long i = -1; + while ( (i = GetNextItem(i, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED)) != -1 ) + { + SetItemState( i, 0, wxLIST_STATE_SELECTED ); + } + } + } + + if ( HasCurrent() && (state == 0) && (stateMask & wxLIST_STATE_FOCUSED) ) + { + // unfocus all: only one item can be focussed, so clearing focus for + // all items is simply clearing focus of the focussed item. + SetItemState(m_current, state, stateMask); + } + //(setting focus to all items makes no sense, so it is not handled here.) +} + +void wxListMainWindow::SetItemState( long litem, long state, long stateMask ) +{ + if ( litem == -1 ) + { + SetItemStateAll(state, stateMask); + return; + } + + wxCHECK_RET( litem >= 0 && (size_t)litem < GetItemCount(), + _T("invalid list ctrl item index in SetItem") ); + + size_t oldCurrent = m_current; + size_t item = (size_t)litem; // safe because of the check above + + // do we need to change the focus? + if ( stateMask & wxLIST_STATE_FOCUSED ) + { + if ( state & wxLIST_STATE_FOCUSED ) + { + // don't do anything if this item is already focused + if ( item != m_current ) + { + ChangeCurrent(item); + + if ( oldCurrent != (size_t)-1 ) + { + if ( IsSingleSel() ) + { + HighlightLine(oldCurrent, false); + } + + RefreshLine(oldCurrent); + } + + RefreshLine( m_current ); + } + } + else // unfocus + { + // don't do anything if this item is not focused + if ( item == m_current ) + { + ResetCurrent(); + + if ( IsSingleSel() ) + { + // we must unselect the old current item as well or we + // might end up with more than one selected item in a + // single selection control + HighlightLine(oldCurrent, false); + } + + RefreshLine( oldCurrent ); + } + } + } + + // do we need to change the selection state? + if ( stateMask & wxLIST_STATE_SELECTED ) + { + bool on = (state & wxLIST_STATE_SELECTED) != 0; + + if ( IsSingleSel() ) + { + if ( on ) + { + // selecting the item also makes it the focused one in the + // single sel mode + if ( m_current != item ) + { + ChangeCurrent(item); + + if ( oldCurrent != (size_t)-1 ) + { + HighlightLine( oldCurrent, false ); + RefreshLine( oldCurrent ); + } + } + } + else // off + { + // only the current item may be selected anyhow + if ( item != m_current ) + return; + } + } + + if ( HighlightLine(item, on) ) + { + RefreshLine(item); + } + } +} + +int wxListMainWindow::GetItemState( long item, long stateMask ) const +{ + wxCHECK_MSG( item >= 0 && (size_t)item < GetItemCount(), 0, + _T("invalid list ctrl item index in GetItemState()") ); + + int ret = wxLIST_STATE_DONTCARE; + + if ( stateMask & wxLIST_STATE_FOCUSED ) + { + if ( (size_t)item == m_current ) + ret |= wxLIST_STATE_FOCUSED; + } + + if ( stateMask & wxLIST_STATE_SELECTED ) + { + if ( IsHighlighted(item) ) + ret |= wxLIST_STATE_SELECTED; + } + + return ret; +} + +void wxListMainWindow::GetItem( wxListItem &item ) const +{ + wxCHECK_RET( item.m_itemId >= 0 && (size_t)item.m_itemId < GetItemCount(), + _T("invalid item index in GetItem") ); + + wxListLineData *line = GetLine((size_t)item.m_itemId); + line->GetItem( item.m_col, item ); + + // Get item state if user wants it + if ( item.m_mask & wxLIST_MASK_STATE ) + item.m_state = GetItemState( item.m_itemId, wxLIST_STATE_SELECTED | + wxLIST_STATE_FOCUSED ); +} + +// ---------------------------------------------------------------------------- +// item count +// ---------------------------------------------------------------------------- + +size_t wxListMainWindow::GetItemCount() const +{ + return IsVirtual() ? m_countVirt : m_lines.GetCount(); +} + +void wxListMainWindow::SetItemCount(long count) +{ + m_selStore.SetItemCount(count); + m_countVirt = count; + + ResetVisibleLinesRange(); + + // scrollbars must be reset + m_dirty = true; +} + +int wxListMainWindow::GetSelectedItemCount() const +{ + // deal with the quick case first + if ( IsSingleSel() ) + return HasCurrent() ? IsHighlighted(m_current) : false; + + // virtual controls remmebers all its selections itself + if ( IsVirtual() ) + return m_selStore.GetSelectedCount(); + + // TODO: we probably should maintain the number of items selected even for + // non virtual controls as enumerating all lines is really slow... + size_t countSel = 0; + size_t count = GetItemCount(); + for ( size_t line = 0; line < count; line++ ) + { + if ( GetLine(line)->IsHighlighted() ) + countSel++; + } + + return countSel; +} + +// ---------------------------------------------------------------------------- +// item position/size +// ---------------------------------------------------------------------------- + +wxRect wxListMainWindow::GetViewRect() const +{ + wxASSERT_MSG( !HasFlag(wxLC_REPORT | wxLC_LIST), + _T("wxListCtrl::GetViewRect() only works in icon mode") ); + + // we need to find the longest/tallest label + wxCoord xMax = 0, yMax = 0; + const int count = GetItemCount(); + if ( count ) + { + for ( int i = 0; i < count; i++ ) + { + wxRect r; + GetItemRect(i, r); + + wxCoord x = r.GetRight(), + y = r.GetBottom(); + + if ( x > xMax ) + xMax = x; + if ( y > yMax ) + yMax = y; + } + } + + // some fudge needed to make it look prettier + xMax += 2 * EXTRA_BORDER_X; + yMax += 2 * EXTRA_BORDER_Y; + + // account for the scrollbars if necessary + const wxSize sizeAll = GetClientSize(); + if ( xMax > sizeAll.x ) + yMax += wxSystemSettings::GetMetric(wxSYS_HSCROLL_Y); + if ( yMax > sizeAll.y ) + xMax += wxSystemSettings::GetMetric(wxSYS_VSCROLL_X); + + return wxRect(0, 0, xMax, yMax); +} + +void wxListMainWindow::GetItemRect( long index, wxRect &rect ) const +{ + wxCHECK_RET( index >= 0 && (size_t)index < GetItemCount(), + _T("invalid index in GetItemRect") ); + + // ensure that we're laid out, otherwise we could return nonsense + if ( m_dirty ) + { + wxConstCast(this, wxListMainWindow)-> + RecalculatePositions(true /* no refresh */); + } + + rect = GetLineRect((size_t)index); + + CalcScrolledPosition(rect.x, rect.y, &rect.x, &rect.y); +} + +bool wxListMainWindow::GetItemPosition(long item, wxPoint& pos) const +{ + wxRect rect; + GetItemRect(item, rect); + + pos.x = rect.x; + pos.y = rect.y; + + return true; +} + +// ---------------------------------------------------------------------------- +// geometry calculation +// ---------------------------------------------------------------------------- + +void wxListMainWindow::RecalculatePositions(bool noRefresh) +{ + const int lineHeight = GetLineHeight(); + + wxClientDC dc( this ); + dc.SetFont( GetFont() ); + + const size_t count = GetItemCount(); + + int iconSpacing; + if ( HasFlag(wxLC_ICON) ) + iconSpacing = m_normal_spacing; + else if ( HasFlag(wxLC_SMALL_ICON) ) + iconSpacing = m_small_spacing; + else + iconSpacing = 0; + + // Note that we do not call GetClientSize() here but + // GetSize() and subtract the border size for sunken + // borders manually. This is technically incorrect, + // but we need to know the client area's size WITHOUT + // scrollbars here. Since we don't know if there are + // any scrollbars, we use GetSize() instead. Another + // solution would be to call SetScrollbars() here to + // remove the scrollbars and call GetClientSize() then, + // but this might result in flicker and - worse - will + // reset the scrollbars to 0 which is not good at all + // if you resize a dialog/window, but don't want to + // reset the window scrolling. RR. + // Furthermore, we actually do NOT subtract the border + // width as 2 pixels is just the extra space which we + // need around the actual content in the window. Other- + // wise the text would e.g. touch the upper border. RR. + int clientWidth, + clientHeight; + GetSize( &clientWidth, &clientHeight ); + + if ( InReportView() ) + { + // all lines have the same height and we scroll one line per step + int entireHeight = count * lineHeight + LINE_SPACING; + + m_linesPerPage = clientHeight / lineHeight; + + ResetVisibleLinesRange(); + + SetScrollbars( SCROLL_UNIT_X, lineHeight, + GetHeaderWidth() / SCROLL_UNIT_X, + (entireHeight + lineHeight - 1) / lineHeight, + GetScrollPos(wxHORIZONTAL), + GetScrollPos(wxVERTICAL), + true ); + } + else // !report + { + // we have 3 different layout strategies: either layout all items + // horizontally/vertically (wxLC_ALIGN_XXX styles explicitly given) or + // to arrange them in top to bottom, left to right (don't ask me why + // not the other way round...) order + if ( HasFlag(wxLC_ALIGN_LEFT | wxLC_ALIGN_TOP) ) + { + int x = EXTRA_BORDER_X; + int y = EXTRA_BORDER_Y; + + wxCoord widthMax = 0; + + size_t i; + for ( i = 0; i < count; i++ ) + { + wxListLineData *line = GetLine(i); + line->CalculateSize( &dc, iconSpacing ); + line->SetPosition( x, y, iconSpacing ); + + wxSize sizeLine = GetLineSize(i); + + if ( HasFlag(wxLC_ALIGN_TOP) ) + { + if ( sizeLine.x > widthMax ) + widthMax = sizeLine.x; + + y += sizeLine.y; + } + else // wxLC_ALIGN_LEFT + { + x += sizeLine.x + MARGIN_BETWEEN_ROWS; + } + } + + if ( HasFlag(wxLC_ALIGN_TOP) ) + { + // traverse the items again and tweak their sizes so that they are + // all the same in a row + for ( i = 0; i < count; i++ ) + { + wxListLineData *line = GetLine(i); + line->m_gi->ExtendWidth(widthMax); + } + } + + SetScrollbars + ( + SCROLL_UNIT_X, + lineHeight, + (x + SCROLL_UNIT_X) / SCROLL_UNIT_X, + (y + lineHeight) / lineHeight, + GetScrollPos( wxHORIZONTAL ), + GetScrollPos( wxVERTICAL ), + true + ); + } + else // "flowed" arrangement, the most complicated case + { + // at first we try without any scrollbars, if the items don't fit into + // the window, we recalculate after subtracting the space taken by the + // scrollbar + + int entireWidth = 0; + + for (int tries = 0; tries < 2; tries++) + { + entireWidth = 2 * EXTRA_BORDER_X; + + if (tries == 1) + { + // Now we have decided that the items do not fit into the + // client area, so we need a scrollbar + entireWidth += SCROLL_UNIT_X; + } + + int x = EXTRA_BORDER_X; + int y = EXTRA_BORDER_Y; + int maxWidthInThisRow = 0; + + m_linesPerPage = 0; + int currentlyVisibleLines = 0; + + for (size_t i = 0; i < count; i++) + { + currentlyVisibleLines++; + wxListLineData *line = GetLine( i ); + line->CalculateSize( &dc, iconSpacing ); + line->SetPosition( x, y, iconSpacing ); + + wxSize sizeLine = GetLineSize( i ); + + if ( maxWidthInThisRow < sizeLine.x ) + maxWidthInThisRow = sizeLine.x; + + y += sizeLine.y; + if (currentlyVisibleLines > m_linesPerPage) + m_linesPerPage = currentlyVisibleLines; + + if ( y + sizeLine.y >= clientHeight ) + { + currentlyVisibleLines = 0; + y = EXTRA_BORDER_Y; + maxWidthInThisRow += MARGIN_BETWEEN_ROWS; + x += maxWidthInThisRow; + entireWidth += maxWidthInThisRow; + maxWidthInThisRow = 0; + } + + // We have reached the last item. + if ( i == count - 1 ) + entireWidth += maxWidthInThisRow; + + if ( (tries == 0) && + (entireWidth + SCROLL_UNIT_X > clientWidth) ) + { + clientHeight -= wxSystemSettings:: + GetMetric(wxSYS_HSCROLL_Y); + m_linesPerPage = 0; + break; + } + + if ( i == count - 1 ) + tries = 1; // Everything fits, no second try required. + } + } + + SetScrollbars + ( + SCROLL_UNIT_X, + lineHeight, + (entireWidth + SCROLL_UNIT_X) / SCROLL_UNIT_X, + 0, + GetScrollPos( wxHORIZONTAL ), + 0, + true + ); + } + } + + if ( !noRefresh ) + { + // FIXME: why should we call it from here? + UpdateCurrent(); + + RefreshAll(); + } +} + +void wxListMainWindow::RefreshAll() +{ + m_dirty = false; + Refresh(); + + wxListHeaderWindow *headerWin = GetListCtrl()->m_headerWin; + if ( headerWin && headerWin->m_dirty ) + { + headerWin->m_dirty = false; + headerWin->Refresh(); + } +} + +void wxListMainWindow::UpdateCurrent() +{ + if ( !HasCurrent() && !IsEmpty() ) + ChangeCurrent(0); +} + +long wxListMainWindow::GetNextItem( long item, + int WXUNUSED(geometry), + int state ) const +{ + long ret = item, + max = GetItemCount(); + wxCHECK_MSG( (ret == -1) || (ret < max), -1, + _T("invalid listctrl index in GetNextItem()") ); + + // notice that we start with the next item (or the first one if item == -1) + // and this is intentional to allow writing a simple loop to iterate over + // all selected items + ret++; + if ( ret == max ) + // this is not an error because the index was OK initially, + // just no such item + return -1; + + if ( !state ) + // any will do + return (size_t)ret; + + size_t count = GetItemCount(); + for ( size_t line = (size_t)ret; line < count; line++ ) + { + if ( (state & wxLIST_STATE_FOCUSED) && (line == m_current) ) + return line; + + if ( (state & wxLIST_STATE_SELECTED) && IsHighlighted(line) ) + return line; + } + + return -1; +} + +// ---------------------------------------------------------------------------- +// deleting stuff +// ---------------------------------------------------------------------------- + +void wxListMainWindow::DeleteItem( long lindex ) +{ + size_t count = GetItemCount(); + + wxCHECK_RET( (lindex >= 0) && ((size_t)lindex < count), + _T("invalid item index in DeleteItem") ); + + size_t index = (size_t)lindex; + + // we don't need to adjust the index for the previous items + if ( HasCurrent() && m_current >= index ) + { + // if the current item is being deleted, we want the next one to + // become selected - unless there is no next one - so don't adjust + // m_current in this case + if ( m_current != index || m_current == count - 1 ) + m_current--; + } + + if ( InReportView() ) + { + // mark the Column Max Width cache as dirty if the items in the line + // we're deleting contain the Max Column Width + wxListLineData * const line = GetLine(index); + wxListItemDataList::compatibility_iterator n; + wxListItemData *itemData; + wxListItem item; + int itemWidth; + + for (size_t i = 0; i < m_columns.GetCount(); i++) + { + n = line->m_items.Item( i ); + itemData = n->GetData(); + itemData->GetItem(item); + + itemWidth = GetItemWidthWithImage(&item); + + if (itemWidth >= m_aColWidths.Item(i)->nMaxWidth) + m_aColWidths.Item(i)->bNeedsUpdate = true; + } + + ResetVisibleLinesRange(); + } + + SendNotify( index, wxEVT_COMMAND_LIST_DELETE_ITEM, wxDefaultPosition ); + + if ( IsVirtual() ) + { + m_countVirt--; + m_selStore.OnItemDelete(index); + } + else + { + m_lines.RemoveAt( index ); + } + + // we need to refresh the (vert) scrollbar as the number of items changed + m_dirty = true; + + RefreshAfter(index); +} + +void wxListMainWindow::DeleteColumn( int col ) +{ + wxListHeaderDataList::compatibility_iterator node = m_columns.Item( col ); + + wxCHECK_RET( node, wxT("invalid column index in DeleteColumn()") ); + + m_dirty = true; + delete node->GetData(); + m_columns.Erase( node ); + + if ( !IsVirtual() ) + { + // update all the items + for ( size_t i = 0; i < m_lines.GetCount(); i++ ) + { + wxListLineData * const line = GetLine(i); + wxListItemDataList::compatibility_iterator n = line->m_items.Item( col ); + delete n->GetData(); + line->m_items.Erase(n); + } + } + + if ( InReportView() ) // we only cache max widths when in Report View + { + delete m_aColWidths.Item(col); + m_aColWidths.RemoveAt(col); + } + + // invalidate it as it has to be recalculated + m_headerWidth = 0; +} + +void wxListMainWindow::DoDeleteAllItems() +{ + if ( IsEmpty() ) + // nothing to do - in particular, don't send the event + return; + + ResetCurrent(); + + // to make the deletion of all items faster, we don't send the + // notifications for each item deletion in this case but only one event + // for all of them: this is compatible with wxMSW and documented in + // DeleteAllItems() description + + wxListEvent event( wxEVT_COMMAND_LIST_DELETE_ALL_ITEMS, GetParent()->GetId() ); + event.SetEventObject( GetParent() ); + GetParent()->GetEventHandler()->ProcessEvent( event ); + + if ( IsVirtual() ) + { + m_countVirt = 0; + m_selStore.Clear(); + } + + if ( InReportView() ) + { + ResetVisibleLinesRange(); + for (size_t i = 0; i < m_aColWidths.GetCount(); i++) + { + m_aColWidths.Item(i)->bNeedsUpdate = true; + } + } + + m_lines.Clear(); +} + +void wxListMainWindow::DeleteAllItems() +{ + DoDeleteAllItems(); + + RecalculatePositions(); +} + +void wxListMainWindow::DeleteEverything() +{ + WX_CLEAR_LIST(wxListHeaderDataList, m_columns); + WX_CLEAR_ARRAY(m_aColWidths); + + DeleteAllItems(); +} + +// ---------------------------------------------------------------------------- +// scanning for an item +// ---------------------------------------------------------------------------- + +void wxListMainWindow::EnsureVisible( long index ) +{ + wxCHECK_RET( index >= 0 && (size_t)index < GetItemCount(), + _T("invalid index in EnsureVisible") ); + + // We have to call this here because the label in question might just have + // been added and its position is not known yet + if ( m_dirty ) + RecalculatePositions(true /* no refresh */); + + MoveToItem((size_t)index); +} + +long wxListMainWindow::FindItem(long start, const wxString& str, bool partial ) +{ + if (str.empty()) + return wxNOT_FOUND; + + long pos = start; + wxString str_upper = str.Upper(); + if (pos < 0) + pos = 0; + + size_t count = GetItemCount(); + for ( size_t i = (size_t)pos; i < count; i++ ) + { + wxListLineData *line = GetLine(i); + wxString line_upper = line->GetText(0).Upper(); + if (!partial) + { + if (line_upper == str_upper ) + return i; + } + else + { + if (line_upper.find(str_upper) == 0) + return i; + } + } + + return wxNOT_FOUND; +} + +long wxListMainWindow::FindItem(long start, wxUIntPtr data) +{ + long pos = start; + if (pos < 0) + pos = 0; + + size_t count = GetItemCount(); + for (size_t i = (size_t)pos; i < count; i++) + { + wxListLineData *line = GetLine(i); + wxListItem item; + line->GetItem( 0, item ); + if (item.m_data == data) + return i; + } + + return wxNOT_FOUND; +} + +long wxListMainWindow::FindItem( const wxPoint& pt ) +{ + size_t topItem; + GetVisibleLinesRange( &topItem, NULL ); + + wxPoint p; + GetItemPosition( GetItemCount() - 1, p ); + if ( p.y == 0 ) + return topItem; + + long id = (long)floor( pt.y * double(GetItemCount() - topItem - 1) / p.y + topItem ); + if ( id >= 0 && id < (long)GetItemCount() ) + return id; + + return wxNOT_FOUND; +} + +long wxListMainWindow::HitTest( int x, int y, int &flags ) const +{ + CalcUnscrolledPosition( x, y, &x, &y ); + + size_t count = GetItemCount(); + + if ( InReportView() ) + { + size_t current = y / GetLineHeight(); + if ( current < count ) + { + flags = HitTestLine(current, x, y); + if ( flags ) + return current; + } + } + else // !report + { + // TODO: optimize it too! this is less simple than for report view but + // enumerating all items is still not a way to do it!! + for ( size_t current = 0; current < count; current++ ) + { + flags = HitTestLine(current, x, y); + if ( flags ) + return current; + } + } + + return wxNOT_FOUND; +} + +// ---------------------------------------------------------------------------- +// adding stuff +// ---------------------------------------------------------------------------- + +void wxListMainWindow::InsertItem( wxListItem &item ) +{ + wxASSERT_MSG( !IsVirtual(), _T("can't be used with virtual control") ); + + int count = GetItemCount(); + wxCHECK_RET( item.m_itemId >= 0, _T("invalid item index") ); + + if (item.m_itemId > count) + item.m_itemId = count; + + size_t id = item.m_itemId; + + m_dirty = true; + + if ( InReportView() ) + { + ResetVisibleLinesRange(); + + // calculate the width of the item and adjust the max column width + wxColWidthInfo *pWidthInfo = m_aColWidths.Item(item.GetColumn()); + int width = GetItemWidthWithImage(&item); + item.SetWidth(width); + if (width > pWidthInfo->nMaxWidth) + pWidthInfo->nMaxWidth = width; + } + + wxListLineData *line = new wxListLineData(this); + + line->SetItem( item.m_col, item ); + + m_lines.Insert( line, id ); + + m_dirty = true; + + // If an item is selected at or below the point of insertion, we need to + // increment the member variables because the current row's index has gone + // up by one + if ( HasCurrent() && m_current >= id ) + m_current++; + + SendNotify(id, wxEVT_COMMAND_LIST_INSERT_ITEM); + + RefreshLines(id, GetItemCount() - 1); +} + +void wxListMainWindow::InsertColumn( long col, wxListItem &item ) +{ + m_dirty = true; + if ( InReportView() ) + { + if (item.m_width == wxLIST_AUTOSIZE_USEHEADER) + item.m_width = GetTextLength( item.m_text ); + + wxListHeaderData *column = new wxListHeaderData( item ); + wxColWidthInfo *colWidthInfo = new wxColWidthInfo(); + + bool insert = (col >= 0) && ((size_t)col < m_columns.GetCount()); + if ( insert ) + { + wxListHeaderDataList::compatibility_iterator + node = m_columns.Item( col ); + m_columns.Insert( node, column ); + m_aColWidths.Insert( colWidthInfo, col ); + } + else + { + m_columns.Append( column ); + m_aColWidths.Add( colWidthInfo ); + } + + if ( !IsVirtual() ) + { + // update all the items + for ( size_t i = 0; i < m_lines.GetCount(); i++ ) + { + wxListLineData * const line = GetLine(i); + wxListItemData * const data = new wxListItemData(this); + if ( insert ) + line->m_items.Insert(col, data); + else + line->m_items.Append(data); + } + } + + // invalidate it as it has to be recalculated + m_headerWidth = 0; + } +} + +int wxListMainWindow::GetItemWidthWithImage(wxListItem * item) +{ + int width = 0; + wxClientDC dc(this); + + dc.SetFont( GetFont() ); + + if (item->GetImage() != -1) + { + int ix, iy; + GetImageSize( item->GetImage(), ix, iy ); + width += ix + 5; + } + + if (!item->GetText().empty()) + { + wxCoord w; + dc.GetTextExtent( item->GetText(), &w, NULL ); + width += w; + } + + return width; +} + +// ---------------------------------------------------------------------------- +// sorting +// ---------------------------------------------------------------------------- + +wxListCtrlCompare list_ctrl_compare_func_2; +long list_ctrl_compare_data; + +int LINKAGEMODE list_ctrl_compare_func_1( wxListLineData **arg1, wxListLineData **arg2 ) +{ + wxListLineData *line1 = *arg1; + wxListLineData *line2 = *arg2; + wxListItem item; + line1->GetItem( 0, item ); + wxUIntPtr data1 = item.m_data; + line2->GetItem( 0, item ); + wxUIntPtr data2 = item.m_data; + return list_ctrl_compare_func_2( data1, data2, list_ctrl_compare_data ); +} + +void wxListMainWindow::SortItems( wxListCtrlCompare fn, long data ) +{ + // selections won't make sense any more after sorting the items so reset + // them + HighlightAll(false); + ResetCurrent(); + + list_ctrl_compare_func_2 = fn; + list_ctrl_compare_data = data; + m_lines.Sort( list_ctrl_compare_func_1 ); + m_dirty = true; +} + +// ---------------------------------------------------------------------------- +// scrolling +// ---------------------------------------------------------------------------- + +void wxListMainWindow::OnScroll(wxScrollWinEvent& event) +{ + // FIXME +#if ( defined(__WXGTK__) || defined(__WXMAC__) ) && !defined(__WXUNIVERSAL__) + wxScrolledWindow::OnScroll(event); +#else + HandleOnScroll( event ); +#endif + + // update our idea of which lines are shown when we redraw the window the + // next time + ResetVisibleLinesRange(); + + if ( event.GetOrientation() == wxHORIZONTAL && HasHeader() ) + { + wxGenericListCtrl* lc = GetListCtrl(); + wxCHECK_RET( lc, _T("no listctrl window?") ); + + lc->m_headerWin->Refresh(); + lc->m_headerWin->Update(); + } +} + +int wxListMainWindow::GetCountPerPage() const +{ + if ( !m_linesPerPage ) + { + wxConstCast(this, wxListMainWindow)-> + m_linesPerPage = GetClientSize().y / GetLineHeight(); + } + + return m_linesPerPage; +} + +void wxListMainWindow::GetVisibleLinesRange(size_t *from, size_t *to) +{ + wxASSERT_MSG( InReportView(), _T("this is for report mode only") ); + + if ( m_lineFrom == (size_t)-1 ) + { + size_t count = GetItemCount(); + if ( count ) + { + m_lineFrom = GetScrollPos(wxVERTICAL); + + // this may happen if SetScrollbars() hadn't been called yet + if ( m_lineFrom >= count ) + m_lineFrom = count - 1; + + // we redraw one extra line but this is needed to make the redrawing + // logic work when there is a fractional number of lines on screen + m_lineTo = m_lineFrom + m_linesPerPage; + if ( m_lineTo >= count ) + m_lineTo = count - 1; + } + else // empty control + { + m_lineFrom = 0; + m_lineTo = (size_t)-1; + } + } + + wxASSERT_MSG( IsEmpty() || + (m_lineFrom <= m_lineTo && m_lineTo < GetItemCount()), + _T("GetVisibleLinesRange() returns incorrect result") ); + + if ( from ) + *from = m_lineFrom; + if ( to ) + *to = m_lineTo; +} + +// ------------------------------------------------------------------------------------- +// wxGenericListCtrl +// ------------------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxGenericListCtrl, wxControl) + +BEGIN_EVENT_TABLE(wxGenericListCtrl,wxControl) + EVT_SIZE(wxGenericListCtrl::OnSize) +END_EVENT_TABLE() + +wxGenericListCtrl::wxGenericListCtrl() +{ + m_imageListNormal = (wxImageList *) NULL; + m_imageListSmall = (wxImageList *) NULL; + m_imageListState = (wxImageList *) NULL; + + m_ownsImageListNormal = + m_ownsImageListSmall = + m_ownsImageListState = false; + + m_mainWin = (wxListMainWindow*) NULL; + m_headerWin = (wxListHeaderWindow*) NULL; + m_headerHeight = 0; +} + +wxGenericListCtrl::~wxGenericListCtrl() +{ + if (m_ownsImageListNormal) + delete m_imageListNormal; + if (m_ownsImageListSmall) + delete m_imageListSmall; + if (m_ownsImageListState) + delete m_imageListState; +} + +void wxGenericListCtrl::CalculateAndSetHeaderHeight() +{ + if ( m_headerWin ) + { +#ifdef __WXMAC__ + SInt32 h; + GetThemeMetric( kThemeMetricListHeaderHeight, &h ); +#else + // we use 'g' to get the descent, too + int w, h, d; + m_headerWin->GetTextExtent(wxT("Hg"), &w, &h, &d); + h += d + 2 * HEADER_OFFSET_Y + EXTRA_HEIGHT; +#endif + + // only update if changed + if ( h != m_headerHeight ) + { + m_headerHeight = h; + + if ( HasHeader() ) + ResizeReportView(true); + else //why is this needed if it doesn't have a header? + m_headerWin->SetSize(m_headerWin->GetSize().x, m_headerHeight); + } + } +} + +void wxGenericListCtrl::CreateHeaderWindow() +{ + m_headerWin = new wxListHeaderWindow + ( + this, wxID_ANY, m_mainWin, + wxPoint(0,0), + wxSize(GetClientSize().x, m_headerHeight), + wxTAB_TRAVERSAL + ); + CalculateAndSetHeaderHeight(); +} + +bool wxGenericListCtrl::Create(wxWindow *parent, + wxWindowID id, + const wxPoint &pos, + const wxSize &size, + long style, + const wxValidator &validator, + const wxString &name) +{ + m_imageListNormal = + m_imageListSmall = + m_imageListState = (wxImageList *) NULL; + m_ownsImageListNormal = + m_ownsImageListSmall = + m_ownsImageListState = false; + + m_mainWin = (wxListMainWindow*) NULL; + m_headerWin = (wxListHeaderWindow*) NULL; + + m_headerHeight = 0; + + if ( !(style & wxLC_MASK_TYPE) ) + { + style = style | wxLC_LIST; + } + + // add more styles here that should only appear + // in the main window + unsigned long only_main_window_style = wxALWAYS_SHOW_SB; + + if ( !wxControl::Create( parent, id, pos, size, style & ~only_main_window_style, validator, name ) ) + return false; + + // don't create the inner window with the border + style &= ~wxBORDER_MASK; + + m_mainWin = new wxListMainWindow( this, wxID_ANY, wxPoint(0, 0), size, style ); + +#ifdef __WXMAC_CARBON__ + // Human Interface Guidelines ask us for a special font in this case + if ( GetWindowVariant() == wxWINDOW_VARIANT_NORMAL ) + { + wxFont font; + font.MacCreateThemeFont( kThemeViewsFont ); + SetFont( font ); + } +#endif + + if ( InReportView() ) + { + CreateHeaderWindow(); + +#ifdef __WXMAC_CARBON__ + if (m_headerWin) + { + wxFont font; + font.MacCreateThemeFont( kThemeSmallSystemFont ); + m_headerWin->SetFont( font ); + CalculateAndSetHeaderHeight(); + } +#endif + + if ( HasFlag(wxLC_NO_HEADER) ) + // VZ: why do we create it at all then? + m_headerWin->Show( false ); + } + + SetInitialSize(size); + + return true; +} + +void wxGenericListCtrl::SetSingleStyle( long style, bool add ) +{ + wxASSERT_MSG( !(style & wxLC_VIRTUAL), + _T("wxLC_VIRTUAL can't be [un]set") ); + + long flag = GetWindowStyle(); + + if (add) + { + if (style & wxLC_MASK_TYPE) + flag &= ~(wxLC_MASK_TYPE | wxLC_VIRTUAL); + if (style & wxLC_MASK_ALIGN) + flag &= ~wxLC_MASK_ALIGN; + if (style & wxLC_MASK_SORT) + flag &= ~wxLC_MASK_SORT; + } + + if (add) + flag |= style; + else + flag &= ~style; + + SetWindowStyleFlag( flag ); +} + +void wxGenericListCtrl::SetWindowStyleFlag( long flag ) +{ + if (m_mainWin) + { + m_mainWin->DeleteEverything(); + + // has the header visibility changed? + bool hasHeader = HasHeader(); + bool willHaveHeader = (flag & wxLC_REPORT) && !(flag & wxLC_NO_HEADER); + + if ( hasHeader != willHaveHeader ) + { + // toggle it + if ( hasHeader ) + { + if ( m_headerWin ) + { + // don't delete, just hide, as we can reuse it later + m_headerWin->Show(false); + } + //else: nothing to do + } + else // must show header + { + if (!m_headerWin) + { + CreateHeaderWindow(); + } + else // already have it, just show + { + m_headerWin->Show( true ); + } + } + + ResizeReportView(willHaveHeader); + } + } + + wxWindow::SetWindowStyleFlag( flag ); +} + +bool wxGenericListCtrl::GetColumn(int col, wxListItem &item) const +{ + m_mainWin->GetColumn( col, item ); + return true; +} + +bool wxGenericListCtrl::SetColumn( int col, wxListItem& item ) +{ + m_mainWin->SetColumn( col, item ); + return true; +} + +int wxGenericListCtrl::GetColumnWidth( int col ) const +{ + return m_mainWin->GetColumnWidth( col ); +} + +bool wxGenericListCtrl::SetColumnWidth( int col, int width ) +{ + m_mainWin->SetColumnWidth( col, width ); + return true; +} + +int wxGenericListCtrl::GetCountPerPage() const +{ + return m_mainWin->GetCountPerPage(); // different from Windows ? +} + +bool wxGenericListCtrl::GetItem( wxListItem &info ) const +{ + m_mainWin->GetItem( info ); + return true; +} + +bool wxGenericListCtrl::SetItem( wxListItem &info ) +{ + m_mainWin->SetItem( info ); + return true; +} + +long wxGenericListCtrl::SetItem( long index, int col, const wxString& label, int imageId ) +{ + wxListItem info; + info.m_text = label; + info.m_mask = wxLIST_MASK_TEXT; + info.m_itemId = index; + info.m_col = col; + if ( imageId > -1 ) + { + info.m_image = imageId; + info.m_mask |= wxLIST_MASK_IMAGE; + } + + m_mainWin->SetItem(info); + return true; +} + +int wxGenericListCtrl::GetItemState( long item, long stateMask ) const +{ + return m_mainWin->GetItemState( item, stateMask ); +} + +bool wxGenericListCtrl::SetItemState( long item, long state, long stateMask ) +{ + m_mainWin->SetItemState( item, state, stateMask ); + return true; +} + +bool +wxGenericListCtrl::SetItemImage( long item, int image, int WXUNUSED(selImage) ) +{ + return SetItemColumnImage(item, 0, image); +} + +bool +wxGenericListCtrl::SetItemColumnImage( long item, long column, int image ) +{ + wxListItem info; + info.m_image = image; + info.m_mask = wxLIST_MASK_IMAGE; + info.m_itemId = item; + info.m_col = column; + m_mainWin->SetItem( info ); + return true; +} + +wxString wxGenericListCtrl::GetItemText( long item ) const +{ + return m_mainWin->GetItemText(item); +} + +void wxGenericListCtrl::SetItemText( long item, const wxString& str ) +{ + m_mainWin->SetItemText(item, str); +} + +wxUIntPtr wxGenericListCtrl::GetItemData( long item ) const +{ + wxListItem info; + info.m_mask = wxLIST_MASK_DATA; + info.m_itemId = item; + m_mainWin->GetItem( info ); + return info.m_data; +} + +bool wxGenericListCtrl::SetItemPtrData( long item, wxUIntPtr data ) +{ + wxListItem info; + info.m_mask = wxLIST_MASK_DATA; + info.m_itemId = item; + info.m_data = data; + m_mainWin->SetItem( info ); + return true; +} + +bool wxGenericListCtrl::SetItemData(long item, long data) +{ + return SetItemPtrData(item, data); +} + +wxRect wxGenericListCtrl::GetViewRect() const +{ + return m_mainWin->GetViewRect(); +} + +bool wxGenericListCtrl::GetItemRect( long item, wxRect &rect, int WXUNUSED(code) ) const +{ + m_mainWin->GetItemRect( item, rect ); + if ( m_mainWin->HasHeader() ) + rect.y += m_headerHeight + 1; + return true; +} + +bool wxGenericListCtrl::GetItemPosition( long item, wxPoint& pos ) const +{ + m_mainWin->GetItemPosition( item, pos ); + return true; +} + +bool wxGenericListCtrl::SetItemPosition( long WXUNUSED(item), const wxPoint& WXUNUSED(pos) ) +{ + return 0; +} + +int wxGenericListCtrl::GetItemCount() const +{ + return m_mainWin->GetItemCount(); +} + +int wxGenericListCtrl::GetColumnCount() const +{ + return m_mainWin->GetColumnCount(); +} + +void wxGenericListCtrl::SetItemSpacing( int spacing, bool isSmall ) +{ + m_mainWin->SetItemSpacing( spacing, isSmall ); +} + +wxSize wxGenericListCtrl::GetItemSpacing() const +{ + const int spacing = m_mainWin->GetItemSpacing(HasFlag(wxLC_SMALL_ICON)); + + return wxSize(spacing, spacing); +} + +#if WXWIN_COMPATIBILITY_2_6 +int wxGenericListCtrl::GetItemSpacing( bool isSmall ) const +{ + return m_mainWin->GetItemSpacing( isSmall ); +} +#endif // WXWIN_COMPATIBILITY_2_6 + +void wxGenericListCtrl::SetItemTextColour( long item, const wxColour &col ) +{ + wxListItem info; + info.m_itemId = item; + info.SetTextColour( col ); + m_mainWin->SetItem( info ); +} + +wxColour wxGenericListCtrl::GetItemTextColour( long item ) const +{ + wxListItem info; + info.m_itemId = item; + m_mainWin->GetItem( info ); + return info.GetTextColour(); +} + +void wxGenericListCtrl::SetItemBackgroundColour( long item, const wxColour &col ) +{ + wxListItem info; + info.m_itemId = item; + info.SetBackgroundColour( col ); + m_mainWin->SetItem( info ); +} + +wxColour wxGenericListCtrl::GetItemBackgroundColour( long item ) const +{ + wxListItem info; + info.m_itemId = item; + m_mainWin->GetItem( info ); + return info.GetBackgroundColour(); +} + +int wxGenericListCtrl::GetScrollPos( int orient ) const +{ + return m_mainWin->GetScrollPos( orient ); +} + +void wxGenericListCtrl::SetScrollPos( int orient, int pos, bool refresh ) +{ + m_mainWin->SetScrollPos( orient, pos, refresh ); +} + +void wxGenericListCtrl::SetItemFont( long item, const wxFont &f ) +{ + wxListItem info; + info.m_itemId = item; + info.SetFont( f ); + m_mainWin->SetItem( info ); +} + +wxFont wxGenericListCtrl::GetItemFont( long item ) const +{ + wxListItem info; + info.m_itemId = item; + m_mainWin->GetItem( info ); + return info.GetFont(); +} + +int wxGenericListCtrl::GetSelectedItemCount() const +{ + return m_mainWin->GetSelectedItemCount(); +} + +wxColour wxGenericListCtrl::GetTextColour() const +{ + return GetForegroundColour(); +} + +void wxGenericListCtrl::SetTextColour(const wxColour& col) +{ + SetForegroundColour(col); +} + +long wxGenericListCtrl::GetTopItem() const +{ + size_t top; + m_mainWin->GetVisibleLinesRange(&top, NULL); + return (long)top; +} + +long wxGenericListCtrl::GetNextItem( long item, int geom, int state ) const +{ + return m_mainWin->GetNextItem( item, geom, state ); +} + +wxImageList *wxGenericListCtrl::GetImageList(int which) const +{ + if (which == wxIMAGE_LIST_NORMAL) + return m_imageListNormal; + else if (which == wxIMAGE_LIST_SMALL) + return m_imageListSmall; + else if (which == wxIMAGE_LIST_STATE) + return m_imageListState; + + return (wxImageList *) NULL; +} + +void wxGenericListCtrl::SetImageList( wxImageList *imageList, int which ) +{ + if ( which == wxIMAGE_LIST_NORMAL ) + { + if (m_ownsImageListNormal) + delete m_imageListNormal; + m_imageListNormal = imageList; + m_ownsImageListNormal = false; + } + else if ( which == wxIMAGE_LIST_SMALL ) + { + if (m_ownsImageListSmall) + delete m_imageListSmall; + m_imageListSmall = imageList; + m_ownsImageListSmall = false; + } + else if ( which == wxIMAGE_LIST_STATE ) + { + if (m_ownsImageListState) + delete m_imageListState; + m_imageListState = imageList; + m_ownsImageListState = false; + } + + m_mainWin->SetImageList( imageList, which ); +} + +void wxGenericListCtrl::AssignImageList(wxImageList *imageList, int which) +{ + SetImageList(imageList, which); + if ( which == wxIMAGE_LIST_NORMAL ) + m_ownsImageListNormal = true; + else if ( which == wxIMAGE_LIST_SMALL ) + m_ownsImageListSmall = true; + else if ( which == wxIMAGE_LIST_STATE ) + m_ownsImageListState = true; +} + +bool wxGenericListCtrl::Arrange( int WXUNUSED(flag) ) +{ + return 0; +} + +bool wxGenericListCtrl::DeleteItem( long item ) +{ + m_mainWin->DeleteItem( item ); + return true; +} + +bool wxGenericListCtrl::DeleteAllItems() +{ + m_mainWin->DeleteAllItems(); + return true; +} + +bool wxGenericListCtrl::DeleteAllColumns() +{ + size_t count = m_mainWin->m_columns.GetCount(); + for ( size_t n = 0; n < count; n++ ) + DeleteColumn( 0 ); + return true; +} + +void wxGenericListCtrl::ClearAll() +{ + m_mainWin->DeleteEverything(); +} + +bool wxGenericListCtrl::DeleteColumn( int col ) +{ + m_mainWin->DeleteColumn( col ); + + // if we don't have the header any longer, we need to relayout the window + if ( !GetColumnCount() ) + ResizeReportView(false /* no header */); + return true; +} + +wxTextCtrl *wxGenericListCtrl::EditLabel(long item, + wxClassInfo* textControlClass) +{ + return m_mainWin->EditLabel( item, textControlClass ); +} + +wxTextCtrl *wxGenericListCtrl::GetEditControl() const +{ + return m_mainWin->GetEditControl(); +} + +bool wxGenericListCtrl::EnsureVisible( long item ) +{ + m_mainWin->EnsureVisible( item ); + return true; +} + +long wxGenericListCtrl::FindItem( long start, const wxString& str, bool partial ) +{ + return m_mainWin->FindItem( start, str, partial ); +} + +long wxGenericListCtrl::FindItem( long start, wxUIntPtr data ) +{ + return m_mainWin->FindItem( start, data ); +} + +long wxGenericListCtrl::FindItem( long WXUNUSED(start), const wxPoint& pt, + int WXUNUSED(direction)) +{ + return m_mainWin->FindItem( pt ); +} + +// TODO: sub item hit testing +long wxGenericListCtrl::HitTest(const wxPoint& point, int& flags, long *) const +{ + return m_mainWin->HitTest( (int)point.x, (int)point.y, flags ); +} + +long wxGenericListCtrl::InsertItem( wxListItem& info ) +{ + m_mainWin->InsertItem( info ); + return info.m_itemId; +} + +long wxGenericListCtrl::InsertItem( long index, const wxString &label ) +{ + wxListItem info; + info.m_text = label; + info.m_mask = wxLIST_MASK_TEXT; + info.m_itemId = index; + return InsertItem( info ); +} + +long wxGenericListCtrl::InsertItem( long index, int imageIndex ) +{ + wxListItem info; + info.m_mask = wxLIST_MASK_IMAGE; + info.m_image = imageIndex; + info.m_itemId = index; + return InsertItem( info ); +} + +long wxGenericListCtrl::InsertItem( long index, const wxString &label, int imageIndex ) +{ + wxListItem info; + info.m_text = label; + info.m_image = imageIndex; + info.m_mask = wxLIST_MASK_TEXT | wxLIST_MASK_IMAGE; + info.m_itemId = index; + return InsertItem( info ); +} + +long wxGenericListCtrl::InsertColumn( long col, wxListItem &item ) +{ + wxCHECK_MSG( m_headerWin, -1, _T("can't add column in non report mode") ); + + m_mainWin->InsertColumn( col, item ); + + // if we hadn't had a header before but have one now + // then we need to relayout the window + if ( GetColumnCount() == 1 && m_mainWin->HasHeader() ) + ResizeReportView(true /* have header */); + + m_headerWin->Refresh(); + + return 0; +} + +long wxGenericListCtrl::InsertColumn( long col, const wxString &heading, + int format, int width ) +{ + wxListItem item; + item.m_mask = wxLIST_MASK_TEXT | wxLIST_MASK_FORMAT; + item.m_text = heading; + if (width >= -2) + { + item.m_mask |= wxLIST_MASK_WIDTH; + item.m_width = width; + } + + item.m_format = format; + + return InsertColumn( col, item ); +} + +bool wxGenericListCtrl::ScrollList( int WXUNUSED(dx), int WXUNUSED(dy) ) +{ + return 0; +} + +// Sort items. +// fn is a function which takes 3 long arguments: item1, item2, data. +// item1 is the long data associated with a first item (NOT the index). +// item2 is the long data associated with a second item (NOT the index). +// data is the same value as passed to SortItems. +// The return value is a negative number if the first item should precede the second +// item, a positive number of the second item should precede the first, +// or zero if the two items are equivalent. +// data is arbitrary data to be passed to the sort function. + +bool wxGenericListCtrl::SortItems( wxListCtrlCompare fn, long data ) +{ + m_mainWin->SortItems( fn, data ); + return true; +} + +// ---------------------------------------------------------------------------- +// event handlers +// ---------------------------------------------------------------------------- + +void wxGenericListCtrl::OnSize(wxSizeEvent& WXUNUSED(event)) +{ + if ( !m_mainWin ) + return; + + ResizeReportView(m_mainWin->HasHeader()); + m_mainWin->RecalculatePositions(); +} + +void wxGenericListCtrl::ResizeReportView(bool showHeader) +{ + int cw, ch; + GetClientSize( &cw, &ch ); + + if ( showHeader ) + { + m_headerWin->SetSize( 0, 0, cw, m_headerHeight ); + if(ch > m_headerHeight) + m_mainWin->SetSize( 0, m_headerHeight + 1, + cw, ch - m_headerHeight - 1 ); + else + m_mainWin->SetSize( 0, m_headerHeight + 1, + cw, 0); + } + else // no header window + { + m_mainWin->SetSize( 0, 0, cw, ch ); + } +} + +void wxGenericListCtrl::OnInternalIdle() +{ + wxWindow::OnInternalIdle(); + + // do it only if needed + if ( !m_mainWin->m_dirty ) + return; + + m_mainWin->RecalculatePositions(); +} + +// ---------------------------------------------------------------------------- +// font/colours +// ---------------------------------------------------------------------------- + +bool wxGenericListCtrl::SetBackgroundColour( const wxColour &colour ) +{ + if (m_mainWin) + { + m_mainWin->SetBackgroundColour( colour ); + m_mainWin->m_dirty = true; + } + + return true; +} + +bool wxGenericListCtrl::SetForegroundColour( const wxColour &colour ) +{ + if ( !wxWindow::SetForegroundColour( colour ) ) + return false; + + if (m_mainWin) + { + m_mainWin->SetForegroundColour( colour ); + m_mainWin->m_dirty = true; + } + + if (m_headerWin) + m_headerWin->SetForegroundColour( colour ); + + return true; +} + +bool wxGenericListCtrl::SetFont( const wxFont &font ) +{ + if ( !wxWindow::SetFont( font ) ) + return false; + + if (m_mainWin) + { + m_mainWin->SetFont( font ); + m_mainWin->m_dirty = true; + } + + if (m_headerWin) + { + m_headerWin->SetFont( font ); + CalculateAndSetHeaderHeight(); + } + + Refresh(); + + return true; +} + +// static +wxVisualAttributes +wxGenericListCtrl::GetClassDefaultAttributes(wxWindowVariant variant) +{ +#if _USE_VISATTR + // Use the same color scheme as wxListBox + return wxListBox::GetClassDefaultAttributes(variant); +#else + wxUnusedVar(variant); + wxVisualAttributes attr; + attr.colFg = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT); + attr.colBg = wxSystemSettings::GetColour(wxSYS_COLOUR_LISTBOX); + attr.font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT); + return attr; +#endif +} + +// ---------------------------------------------------------------------------- +// methods forwarded to m_mainWin +// ---------------------------------------------------------------------------- + +#if wxUSE_DRAG_AND_DROP + +void wxGenericListCtrl::SetDropTarget( wxDropTarget *dropTarget ) +{ + m_mainWin->SetDropTarget( dropTarget ); +} + +wxDropTarget *wxGenericListCtrl::GetDropTarget() const +{ + return m_mainWin->GetDropTarget(); +} + +#endif + +bool wxGenericListCtrl::SetCursor( const wxCursor &cursor ) +{ + return m_mainWin ? m_mainWin->wxWindow::SetCursor(cursor) : false; +} + +wxColour wxGenericListCtrl::GetBackgroundColour() const +{ + return m_mainWin ? m_mainWin->GetBackgroundColour() : wxColour(); +} + +wxColour wxGenericListCtrl::GetForegroundColour() const +{ + return m_mainWin ? m_mainWin->GetForegroundColour() : wxColour(); +} + +bool wxGenericListCtrl::DoPopupMenu( wxMenu *menu, int x, int y ) +{ +#if wxUSE_MENUS + return m_mainWin->PopupMenu( menu, x, y ); +#else + return false; +#endif +} + +void wxGenericListCtrl::DoClientToScreen( int *x, int *y ) const +{ + m_mainWin->DoClientToScreen(x, y); +} + +void wxGenericListCtrl::DoScreenToClient( int *x, int *y ) const +{ + m_mainWin->DoScreenToClient(x, y); +} + +void wxGenericListCtrl::SetFocus() +{ + // The test in window.cpp fails as we are a composite + // window, so it checks against "this", but not m_mainWin. + if ( DoFindFocus() != this ) + m_mainWin->SetFocus(); +} + +wxSize wxGenericListCtrl::DoGetBestSize() const +{ + // Something is better than nothing... + // 100x80 is what the MSW version will get from the default + // wxControl::DoGetBestSize + return wxSize(100, 80); +} + +// ---------------------------------------------------------------------------- +// virtual list control support +// ---------------------------------------------------------------------------- + +wxString wxGenericListCtrl::OnGetItemText(long WXUNUSED(item), long WXUNUSED(col)) const +{ + // this is a pure virtual function, in fact - which is not really pure + // because the controls which are not virtual don't need to implement it + wxFAIL_MSG( _T("wxGenericListCtrl::OnGetItemText not supposed to be called") ); + + return wxEmptyString; +} + +int wxGenericListCtrl::OnGetItemImage(long WXUNUSED(item)) const +{ + wxCHECK_MSG(!GetImageList(wxIMAGE_LIST_SMALL), + -1, + wxT("List control has an image list, OnGetItemImage or OnGetItemColumnImage should be overridden.")); + return -1; +} + +int wxGenericListCtrl::OnGetItemColumnImage(long item, long column) const +{ + if (!column) + return OnGetItemImage(item); + + return -1; +} + +wxListItemAttr * +wxGenericListCtrl::OnGetItemAttr(long WXUNUSED_UNLESS_DEBUG(item)) const +{ + wxASSERT_MSG( item >= 0 && item < GetItemCount(), + _T("invalid item index in OnGetItemAttr()") ); + + // no attributes by default + return NULL; +} + +void wxGenericListCtrl::SetItemCount(long count) +{ + wxASSERT_MSG( IsVirtual(), _T("this is for virtual controls only") ); + + m_mainWin->SetItemCount(count); +} + +void wxGenericListCtrl::RefreshItem(long item) +{ + m_mainWin->RefreshLine(item); +} + +void wxGenericListCtrl::RefreshItems(long itemFrom, long itemTo) +{ + m_mainWin->RefreshLines(itemFrom, itemTo); +} + +// Generic wxListCtrl is more or less a container for two other +// windows which drawings are done upon. These are namely +// 'm_headerWin' and 'm_mainWin'. +// Here we override 'virtual wxWindow::Refresh()' to mimic the +// behaviour wxListCtrl has under wxMSW. +// +void wxGenericListCtrl::Refresh(bool eraseBackground, const wxRect *rect) +{ + if (!rect) + { + // The easy case, no rectangle specified. + if (m_headerWin) + m_headerWin->Refresh(eraseBackground); + + if (m_mainWin) + m_mainWin->Refresh(eraseBackground); + } + else + { + // Refresh the header window + if (m_headerWin) + { + wxRect rectHeader = m_headerWin->GetRect(); + rectHeader.Intersect(*rect); + if (rectHeader.GetWidth() && rectHeader.GetHeight()) + { + int x, y; + m_headerWin->GetPosition(&x, &y); + rectHeader.Offset(-x, -y); + m_headerWin->Refresh(eraseBackground, &rectHeader); + } + } + + // Refresh the main window + if (m_mainWin) + { + wxRect rectMain = m_mainWin->GetRect(); + rectMain.Intersect(*rect); + if (rectMain.GetWidth() && rectMain.GetHeight()) + { + int x, y; + m_mainWin->GetPosition(&x, &y); + rectMain.Offset(-x, -y); + m_mainWin->Refresh(eraseBackground, &rectMain); + } + } + } +} + +void wxGenericListCtrl::Freeze() +{ + m_mainWin->Freeze(); +} + +void wxGenericListCtrl::Thaw() +{ + m_mainWin->Thaw(); +} + +#endif // wxUSE_LISTCTRL diff --git a/Externals/wxWidgets/src/generic/logg.cpp b/Externals/wxWidgets/src/generic/logg.cpp new file mode 100644 index 0000000000..e370dc4eac --- /dev/null +++ b/Externals/wxWidgets/src/generic/logg.cpp @@ -0,0 +1,1229 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/generic/logg.cpp +// Purpose: wxLog-derived classes which need GUI support (the rest is in +// src/common/log.cpp) +// Author: Vadim Zeitlin +// Modified by: +// Created: 20.09.99 (extracted from src/common/log.cpp) +// RCS-ID: $Id: logg.cpp 43078 2006-11-04 23:46:02Z VZ $ +// Copyright: (c) 1998 Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#ifndef WX_PRECOMP + #include "wx/app.h" + #include "wx/button.h" + #include "wx/intl.h" + #include "wx/log.h" + #include "wx/menu.h" + #include "wx/frame.h" + #include "wx/filedlg.h" + #include "wx/msgdlg.h" + #include "wx/textctrl.h" + #include "wx/sizer.h" + #include "wx/statbmp.h" + #include "wx/settings.h" +#endif // WX_PRECOMP + +#if wxUSE_LOGGUI || wxUSE_LOGWINDOW + +#include "wx/file.h" +#include "wx/textfile.h" +#include "wx/statline.h" +#include "wx/artprov.h" + +#ifdef __WXMSW__ + // for OutputDebugString() + #include "wx/msw/private.h" +#endif // Windows + +#ifdef __WXPM__ + #include +#endif + +#if wxUSE_LOG_DIALOG + #include "wx/listctrl.h" + #include "wx/imaglist.h" + #include "wx/image.h" +#endif // wxUSE_LOG_DIALOG/!wxUSE_LOG_DIALOG + +#if defined(__MWERKS__) && wxUSE_UNICODE + #include +#endif + +#include "wx/datetime.h" + +// the suffix we add to the button to show that the dialog can be expanded +#define EXPAND_SUFFIX _T(" >>") + +// ---------------------------------------------------------------------------- +// private classes +// ---------------------------------------------------------------------------- + +#if wxUSE_LOG_DIALOG + +// this function is a wrapper around strftime(3) +// allows to exclude the usage of wxDateTime +static wxString TimeStamp(const wxChar *format, time_t t) +{ +#if wxUSE_DATETIME + wxChar buf[4096]; + struct tm tm; + if ( !wxStrftime(buf, WXSIZEOF(buf), format, wxLocaltime_r(&t, &tm)) ) + { + // buffer is too small? + wxFAIL_MSG(_T("strftime() failed")); + } + return wxString(buf); +#else // !wxUSE_DATETIME + return wxEmptyString; +#endif // wxUSE_DATETIME/!wxUSE_DATETIME +} + + +class wxLogDialog : public wxDialog +{ +public: + wxLogDialog(wxWindow *parent, + const wxArrayString& messages, + const wxArrayInt& severity, + const wxArrayLong& timess, + const wxString& caption, + long style); + virtual ~wxLogDialog(); + + // event handlers + void OnOk(wxCommandEvent& event); + void OnDetails(wxCommandEvent& event); +#if wxUSE_FILE + void OnSave(wxCommandEvent& event); +#endif // wxUSE_FILE + void OnListSelect(wxListEvent& event); + +private: + // create controls needed for the details display + void CreateDetailsControls(); + + // the data for the listctrl + wxArrayString m_messages; + wxArrayInt m_severity; + wxArrayLong m_times; + + // the "toggle" button and its state +#ifndef __SMARTPHONE__ + wxButton *m_btnDetails; +#endif + bool m_showingDetails; + + // the controls which are not shown initially (but only when details + // button is pressed) + wxListCtrl *m_listctrl; +#ifndef __SMARTPHONE__ +#if wxUSE_STATLINE + wxStaticLine *m_statline; +#endif // wxUSE_STATLINE +#if wxUSE_FILE + wxButton *m_btnSave; +#endif // wxUSE_FILE +#endif // __SMARTPHONE__ + + // the translated "Details" string + static wxString ms_details; + + DECLARE_EVENT_TABLE() + DECLARE_NO_COPY_CLASS(wxLogDialog) +}; + +BEGIN_EVENT_TABLE(wxLogDialog, wxDialog) + EVT_BUTTON(wxID_OK, wxLogDialog::OnOk) + EVT_BUTTON(wxID_MORE, wxLogDialog::OnDetails) +#if wxUSE_FILE + EVT_BUTTON(wxID_SAVE, wxLogDialog::OnSave) +#endif // wxUSE_FILE + EVT_LIST_ITEM_SELECTED(wxID_ANY, wxLogDialog::OnListSelect) +END_EVENT_TABLE() + +#endif // wxUSE_LOG_DIALOG + +// ---------------------------------------------------------------------------- +// private functions +// ---------------------------------------------------------------------------- + +#if wxUSE_FILE && wxUSE_FILEDLG + +// pass an uninitialized file object, the function will ask the user for the +// filename and try to open it, returns true on success (file was opened), +// false if file couldn't be opened/created and -1 if the file selection +// dialog was cancelled +static int OpenLogFile(wxFile& file, wxString *filename = NULL, wxWindow *parent = NULL); + +#endif // wxUSE_FILE + +// ---------------------------------------------------------------------------- +// global variables +// ---------------------------------------------------------------------------- + +// we use a global variable to store the frame pointer for wxLogStatus - bad, +// but it's the easiest way +static wxFrame *gs_pFrame = NULL; // FIXME MT-unsafe + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// global functions +// ---------------------------------------------------------------------------- + +// accepts an additional argument which tells to which frame the output should +// be directed +void wxVLogStatus(wxFrame *pFrame, const wxChar *szFormat, va_list argptr) +{ + wxString msg; + + wxLog *pLog = wxLog::GetActiveTarget(); + if ( pLog != NULL ) { + msg.PrintfV(szFormat, argptr); + + wxASSERT( gs_pFrame == NULL ); // should be reset! + gs_pFrame = pFrame; +#ifdef __WXWINCE__ + wxLog::OnLog(wxLOG_Status, msg, 0); +#else + wxLog::OnLog(wxLOG_Status, msg, time(NULL)); +#endif + gs_pFrame = (wxFrame *) NULL; + } +} + +void wxLogStatus(wxFrame *pFrame, const wxChar *szFormat, ...) +{ + va_list argptr; + va_start(argptr, szFormat); + wxVLogStatus(pFrame, szFormat, argptr); + va_end(argptr); +} + +// ---------------------------------------------------------------------------- +// wxLogGui implementation (FIXME MT-unsafe) +// ---------------------------------------------------------------------------- + +#if wxUSE_LOGGUI + +wxLogGui::wxLogGui() +{ + Clear(); +} + +void wxLogGui::Clear() +{ + m_bErrors = + m_bWarnings = + m_bHasMessages = false; + + m_aMessages.Empty(); + m_aSeverity.Empty(); + m_aTimes.Empty(); +} + +void wxLogGui::Flush() +{ + if ( !m_bHasMessages ) + return; + + // do it right now to block any new calls to Flush() while we're here + m_bHasMessages = false; + + unsigned repeatCount = 0; + if ( wxLog::GetRepetitionCounting() ) + { + repeatCount = wxLog::DoLogNumberOfRepeats(); + } + + wxString appName = wxTheApp->GetAppName(); + if ( !appName.empty() ) + appName[0u] = (wxChar)wxToupper(appName[0u]); + + long style; + wxString titleFormat; + if ( m_bErrors ) { + titleFormat = _("%s Error"); + style = wxICON_STOP; + } + else if ( m_bWarnings ) { + titleFormat = _("%s Warning"); + style = wxICON_EXCLAMATION; + } + else { + titleFormat = _("%s Information"); + style = wxICON_INFORMATION; + } + + wxString title; + title.Printf(titleFormat, appName.c_str()); + + size_t nMsgCount = m_aMessages.Count(); + + // avoid showing other log dialogs until we're done with the dialog we're + // showing right now: nested modal dialogs make for really bad UI! + Suspend(); + + wxString str; + if ( nMsgCount == 1 ) + { + str = m_aMessages[0]; + } + else // more than one message + { +#if wxUSE_LOG_DIALOG + + if ( repeatCount > 0 ) + m_aMessages[nMsgCount-1] += wxString::Format(wxT(" (%s)"), m_aMessages[nMsgCount-2].c_str()); + wxLogDialog dlg(NULL, + m_aMessages, m_aSeverity, m_aTimes, + title, style); + + // clear the message list before showing the dialog because while it's + // shown some new messages may appear + Clear(); + + (void)dlg.ShowModal(); +#else // !wxUSE_LOG_DIALOG + // concatenate all strings (but not too many to not overfill the msg box) + size_t nLines = 0; + + // start from the most recent message + for ( size_t n = nMsgCount; n > 0; n-- ) { + // for Windows strings longer than this value are wrapped (NT 4.0) + const size_t nMsgLineWidth = 156; + + nLines += (m_aMessages[n - 1].Len() + nMsgLineWidth - 1) / nMsgLineWidth; + + if ( nLines > 25 ) // don't put too many lines in message box + break; + + str << m_aMessages[n - 1] << wxT("\n"); + } +#endif // wxUSE_LOG_DIALOG/!wxUSE_LOG_DIALOG + } + + // this catches both cases of 1 message with wxUSE_LOG_DIALOG and any + // situation without it + if ( !str.empty() ) + { + wxMessageBox(str, title, wxOK | style); + + // no undisplayed messages whatsoever + Clear(); + } + + // allow flushing the logs again + Resume(); +} + +// log all kinds of messages +void wxLogGui::DoLog(wxLogLevel level, const wxChar *szString, time_t t) +{ + switch ( level ) { + case wxLOG_Info: + if ( GetVerbose() ) + case wxLOG_Message: + { + m_aMessages.Add(szString); + m_aSeverity.Add(wxLOG_Message); + m_aTimes.Add((long)t); + m_bHasMessages = true; + } + break; + + case wxLOG_Status: +#if wxUSE_STATUSBAR + { + // find the top window and set it's status text if it has any + wxFrame *pFrame = gs_pFrame; + if ( pFrame == NULL ) { + wxWindow *pWin = wxTheApp->GetTopWindow(); + if ( pWin != NULL && pWin->IsKindOf(CLASSINFO(wxFrame)) ) { + pFrame = (wxFrame *)pWin; + } + } + + if ( pFrame && pFrame->GetStatusBar() ) + pFrame->SetStatusText(szString); + } +#endif // wxUSE_STATUSBAR + break; + + case wxLOG_Trace: + case wxLOG_Debug: + #ifdef __WXDEBUG__ + { + wxString str; + TimeStamp(&str); + str += szString; + + #if defined(__WXMSW__) && !defined(__WXMICROWIN__) + // don't prepend debug/trace here: it goes to the + // debug window anyhow + str += wxT("\r\n"); + OutputDebugString(str); + #else + // send them to stderr + wxFprintf(stderr, wxT("[%s] %s\n"), + level == wxLOG_Trace ? wxT("Trace") + : wxT("Debug"), + str.c_str()); + fflush(stderr); + #endif + } + #endif // __WXDEBUG__ + + break; + + case wxLOG_FatalError: + // show this one immediately + wxMessageBox(szString, _("Fatal error"), wxICON_HAND); + wxExit(); + break; + + case wxLOG_Error: + if ( !m_bErrors ) { +#if !wxUSE_LOG_DIALOG + // discard earlier informational messages if this is the 1st + // error because they might not make sense any more and showing + // them in a message box might be confusing + m_aMessages.Empty(); + m_aSeverity.Empty(); + m_aTimes.Empty(); +#endif // wxUSE_LOG_DIALOG + m_bErrors = true; + } + // fall through + + case wxLOG_Warning: + if ( !m_bErrors ) { + // for the warning we don't discard the info messages + m_bWarnings = true; + } + + m_aMessages.Add(szString); + m_aSeverity.Add((int)level); + m_aTimes.Add((long)t); + m_bHasMessages = true; + break; + } +} + +#endif // wxUSE_LOGGUI + +// ---------------------------------------------------------------------------- +// wxLogWindow and wxLogFrame implementation +// ---------------------------------------------------------------------------- + +#if wxUSE_LOGWINDOW + +// log frame class +// --------------- +class wxLogFrame : public wxFrame +{ +public: + // ctor & dtor + wxLogFrame(wxWindow *pParent, wxLogWindow *log, const wxChar *szTitle); + virtual ~wxLogFrame(); + + // menu callbacks + void OnClose(wxCommandEvent& event); + void OnCloseWindow(wxCloseEvent& event); +#if wxUSE_FILE + void OnSave (wxCommandEvent& event); +#endif // wxUSE_FILE + void OnClear(wxCommandEvent& event); + + // accessors + wxTextCtrl *TextCtrl() const { return m_pTextCtrl; } + +private: + // use standard ids for our commands! + enum + { + Menu_Close = wxID_CLOSE, + Menu_Save = wxID_SAVE, + Menu_Clear = wxID_CLEAR + }; + + // common part of OnClose() and OnCloseWindow() + void DoClose(); + + wxTextCtrl *m_pTextCtrl; + wxLogWindow *m_log; + + DECLARE_EVENT_TABLE() + DECLARE_NO_COPY_CLASS(wxLogFrame) +}; + +BEGIN_EVENT_TABLE(wxLogFrame, wxFrame) + // wxLogWindow menu events + EVT_MENU(Menu_Close, wxLogFrame::OnClose) +#if wxUSE_FILE + EVT_MENU(Menu_Save, wxLogFrame::OnSave) +#endif // wxUSE_FILE + EVT_MENU(Menu_Clear, wxLogFrame::OnClear) + + EVT_CLOSE(wxLogFrame::OnCloseWindow) +END_EVENT_TABLE() + +wxLogFrame::wxLogFrame(wxWindow *pParent, wxLogWindow *log, const wxChar *szTitle) + : wxFrame(pParent, wxID_ANY, szTitle) +{ + m_log = log; + + m_pTextCtrl = new wxTextCtrl(this, wxID_ANY, wxEmptyString, wxDefaultPosition, + wxDefaultSize, + wxTE_MULTILINE | + wxHSCROLL | + // needed for Win32 to avoid 65Kb limit but it doesn't work well + // when using RichEdit 2.0 which we always do in the Unicode build +#if !wxUSE_UNICODE + wxTE_RICH | +#endif // !wxUSE_UNICODE + wxTE_READONLY); + +#if wxUSE_MENUS + // create menu + wxMenuBar *pMenuBar = new wxMenuBar; + wxMenu *pMenu = new wxMenu; +#if wxUSE_FILE + pMenu->Append(Menu_Save, _("&Save..."), _("Save log contents to file")); +#endif // wxUSE_FILE + pMenu->Append(Menu_Clear, _("C&lear"), _("Clear the log contents")); + pMenu->AppendSeparator(); + pMenu->Append(Menu_Close, _("&Close"), _("Close this window")); + pMenuBar->Append(pMenu, _("&Log")); + SetMenuBar(pMenuBar); +#endif // wxUSE_MENUS + +#if wxUSE_STATUSBAR + // status bar for menu prompts + CreateStatusBar(); +#endif // wxUSE_STATUSBAR + + m_log->OnFrameCreate(this); +} + +void wxLogFrame::DoClose() +{ + if ( m_log->OnFrameClose(this) ) + { + // instead of closing just hide the window to be able to Show() it + // later + Show(false); + } +} + +void wxLogFrame::OnClose(wxCommandEvent& WXUNUSED(event)) +{ + DoClose(); +} + +void wxLogFrame::OnCloseWindow(wxCloseEvent& WXUNUSED(event)) +{ + DoClose(); +} + +#if wxUSE_FILE +void wxLogFrame::OnSave(wxCommandEvent& WXUNUSED(event)) +{ +#if wxUSE_FILEDLG + wxString filename; + wxFile file; + int rc = OpenLogFile(file, &filename, this); + if ( rc == -1 ) + { + // cancelled + return; + } + + bool bOk = rc != 0; + + // retrieve text and save it + // ------------------------- + int nLines = m_pTextCtrl->GetNumberOfLines(); + for ( int nLine = 0; bOk && nLine < nLines; nLine++ ) { + bOk = file.Write(m_pTextCtrl->GetLineText(nLine) + + wxTextFile::GetEOL()); + } + + if ( bOk ) + bOk = file.Close(); + + if ( !bOk ) { + wxLogError(_("Can't save log contents to file.")); + } + else { + wxLogStatus(this, _("Log saved to the file '%s'."), filename.c_str()); + } +#endif +} +#endif // wxUSE_FILE + +void wxLogFrame::OnClear(wxCommandEvent& WXUNUSED(event)) +{ + m_pTextCtrl->Clear(); +} + +wxLogFrame::~wxLogFrame() +{ + m_log->OnFrameDelete(this); +} + +// wxLogWindow +// ----------- + +wxLogWindow::wxLogWindow(wxWindow *pParent, + const wxChar *szTitle, + bool bShow, + bool bDoPass) +{ + PassMessages(bDoPass); + + m_pLogFrame = new wxLogFrame(pParent, this, szTitle); + + if ( bShow ) + m_pLogFrame->Show(); +} + +void wxLogWindow::Show(bool bShow) +{ + m_pLogFrame->Show(bShow); +} + +void wxLogWindow::DoLog(wxLogLevel level, const wxChar *szString, time_t t) +{ + // first let the previous logger show it + wxLogPassThrough::DoLog(level, szString, t); + + if ( m_pLogFrame ) { + switch ( level ) { + case wxLOG_Status: + // by default, these messages are ignored by wxLog, so process + // them ourselves + if ( !wxIsEmpty(szString) ) + { + wxString str; + str << _("Status: ") << szString; + DoLogString(str, t); + } + break; + + // don't put trace messages in the text window for 2 reasons: + // 1) there are too many of them + // 2) they may provoke other trace messages thus sending a program + // into an infinite loop + case wxLOG_Trace: + break; + + default: + // and this will format it nicely and call our DoLogString() + wxLog::DoLog(level, szString, t); + } + } +} + +void wxLogWindow::DoLogString(const wxChar *szString, time_t WXUNUSED(t)) +{ + // put the text into our window + wxTextCtrl *pText = m_pLogFrame->TextCtrl(); + + // remove selection (WriteText is in fact ReplaceSelection) +#ifdef __WXMSW__ + wxTextPos nLen = pText->GetLastPosition(); + pText->SetSelection(nLen, nLen); +#endif // Windows + + wxString msg; + TimeStamp(&msg); + msg << szString << wxT('\n'); + + pText->AppendText(msg); + + // TODO ensure that the line can be seen +} + +wxFrame *wxLogWindow::GetFrame() const +{ + return m_pLogFrame; +} + +void wxLogWindow::OnFrameCreate(wxFrame * WXUNUSED(frame)) +{ +} + +bool wxLogWindow::OnFrameClose(wxFrame * WXUNUSED(frame)) +{ + // allow to close + return true; +} + +void wxLogWindow::OnFrameDelete(wxFrame * WXUNUSED(frame)) +{ + m_pLogFrame = (wxLogFrame *)NULL; +} + +wxLogWindow::~wxLogWindow() +{ + // may be NULL if log frame already auto destroyed itself + delete m_pLogFrame; +} + +#endif // wxUSE_LOGWINDOW + +// ---------------------------------------------------------------------------- +// wxLogDialog +// ---------------------------------------------------------------------------- + +#if wxUSE_LOG_DIALOG + +#ifndef __SMARTPHONE__ +static const size_t MARGIN = 10; +#else +static const size_t MARGIN = 0; +#endif + +wxString wxLogDialog::ms_details; + +wxLogDialog::wxLogDialog(wxWindow *parent, + const wxArrayString& messages, + const wxArrayInt& severity, + const wxArrayLong& times, + const wxString& caption, + long style) + : wxDialog(parent, wxID_ANY, caption, + wxDefaultPosition, wxDefaultSize, + wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER) +{ + if ( ms_details.empty() ) + { + // ensure that we won't loop here if wxGetTranslation() + // happens to pop up a Log message while translating this :-) + ms_details = wxTRANSLATE("&Details"); + ms_details = wxGetTranslation(ms_details); +#ifdef __SMARTPHONE__ + ms_details = wxStripMenuCodes(ms_details); +#endif + } + + size_t count = messages.GetCount(); + m_messages.Alloc(count); + m_severity.Alloc(count); + m_times.Alloc(count); + + for ( size_t n = 0; n < count; n++ ) + { + wxString msg = messages[n]; + msg.Replace(wxT("\n"), wxT(" ")); + m_messages.Add(msg); + m_severity.Add(severity[n]); + m_times.Add(times[n]); + } + + m_showingDetails = false; // not initially + m_listctrl = (wxListCtrl *)NULL; + +#ifndef __SMARTPHONE__ + +#if wxUSE_STATLINE + m_statline = (wxStaticLine *)NULL; +#endif // wxUSE_STATLINE + +#if wxUSE_FILE + m_btnSave = (wxButton *)NULL; +#endif // wxUSE_FILE + +#endif // __SMARTPHONE__ + + bool isPda = (wxSystemSettings::GetScreenType() <= wxSYS_SCREEN_PDA); + + // create the controls which are always shown and layout them: we use + // sizers even though our window is not resizeable to calculate the size of + // the dialog properly + wxBoxSizer *sizerTop = new wxBoxSizer(wxVERTICAL); +#ifndef __SMARTPHONE__ + wxBoxSizer *sizerButtons = new wxBoxSizer(isPda ? wxHORIZONTAL : wxVERTICAL); +#endif + wxBoxSizer *sizerAll = new wxBoxSizer(isPda ? wxVERTICAL : wxHORIZONTAL); + +#ifdef __SMARTPHONE__ + SetLeftMenu(wxID_OK); + SetRightMenu(wxID_MORE, ms_details + EXPAND_SUFFIX); +#else + wxButton *btnOk = new wxButton(this, wxID_OK); + sizerButtons->Add(btnOk, 0, isPda ? wxCENTRE : wxCENTRE|wxBOTTOM, MARGIN/2); + m_btnDetails = new wxButton(this, wxID_MORE, ms_details + EXPAND_SUFFIX); + sizerButtons->Add(m_btnDetails, 0, isPda ? wxCENTRE|wxLEFT : wxCENTRE | wxTOP, MARGIN/2 - 1); +#endif + + wxBitmap bitmap; + switch ( style & wxICON_MASK ) + { + case wxICON_ERROR: + bitmap = wxArtProvider::GetBitmap(wxART_ERROR, wxART_MESSAGE_BOX); +#ifdef __WXPM__ + bitmap.SetId(wxICON_SMALL_ERROR); +#endif + break; + + case wxICON_INFORMATION: + bitmap = wxArtProvider::GetBitmap(wxART_INFORMATION, wxART_MESSAGE_BOX); +#ifdef __WXPM__ + bitmap.SetId(wxICON_SMALL_INFO); +#endif + break; + + case wxICON_WARNING: + bitmap = wxArtProvider::GetBitmap(wxART_WARNING, wxART_MESSAGE_BOX); +#ifdef __WXPM__ + bitmap.SetId(wxICON_SMALL_WARNING); +#endif + break; + + default: + wxFAIL_MSG(_T("incorrect log style")); + } + + if (!isPda) + sizerAll->Add(new wxStaticBitmap(this, wxID_ANY, bitmap), 0, + wxALIGN_CENTRE_VERTICAL); + + const wxString& message = messages.Last(); + sizerAll->Add(CreateTextSizer(message), 1, + wxALIGN_CENTRE_VERTICAL | wxLEFT | wxRIGHT, MARGIN); +#ifndef __SMARTPHONE__ + sizerAll->Add(sizerButtons, 0, isPda ? wxCENTRE|wxTOP|wxBOTTOM : (wxALIGN_RIGHT | wxLEFT), MARGIN); +#endif + + sizerTop->Add(sizerAll, 0, wxALL | wxEXPAND, MARGIN); + + SetSizer(sizerTop); + + // see comments in OnDetails() + // + // Note: Doing this, this way, triggered a nasty bug in + // wxTopLevelWindowGTK::GtkOnSize which took -1 literally once + // either of maxWidth or maxHeight was set. This symptom has been + // fixed there, but it is a problem that remains as long as we allow + // unchecked access to the internal size members. We really need to + // encapuslate window sizes more cleanly and make it clear when -1 will + // be substituted and when it will not. + + wxSize size = sizerTop->Fit(this); + m_maxHeight = size.y; + SetSizeHints(size.x, size.y, m_maxWidth, m_maxHeight); + +#ifndef __SMARTPHONE__ + btnOk->SetFocus(); +#endif + + Centre(); + + if (isPda) + { + // Move up the screen so that when we expand the dialog, + // there's enough space. + Move(wxPoint(GetPosition().x, GetPosition().y / 2)); + } +} + +void wxLogDialog::CreateDetailsControls() +{ +#ifndef __SMARTPHONE__ + // create the save button and separator line if possible +#if wxUSE_FILE + m_btnSave = new wxButton(this, wxID_SAVE); +#endif // wxUSE_FILE + +#if wxUSE_STATLINE + m_statline = new wxStaticLine(this, wxID_ANY); +#endif // wxUSE_STATLINE + +#endif // __SMARTPHONE__ + + // create the list ctrl now + m_listctrl = new wxListCtrl(this, wxID_ANY, + wxDefaultPosition, wxDefaultSize, + wxSUNKEN_BORDER | + wxLC_REPORT | + wxLC_NO_HEADER | + wxLC_SINGLE_SEL); +#ifdef __WXWINCE__ + // This maks a big aesthetic difference on WinCE but I + // don't want to risk problems on other platforms + m_listctrl->Hide(); +#endif + + // no need to translate these strings as they're not shown to the + // user anyhow (we use wxLC_NO_HEADER style) + m_listctrl->InsertColumn(0, _T("Message")); + m_listctrl->InsertColumn(1, _T("Time")); + + // prepare the imagelist + static const int ICON_SIZE = 16; + wxImageList *imageList = new wxImageList(ICON_SIZE, ICON_SIZE); + + // order should be the same as in the switch below! + static const wxChar* icons[] = + { + wxART_ERROR, + wxART_WARNING, + wxART_INFORMATION + }; + + bool loadedIcons = true; + + for ( size_t icon = 0; icon < WXSIZEOF(icons); icon++ ) + { + wxBitmap bmp = wxArtProvider::GetBitmap(icons[icon], wxART_MESSAGE_BOX, + wxSize(ICON_SIZE, ICON_SIZE)); + + // This may very well fail if there are insufficient colours available. + // Degrade gracefully. + if ( !bmp.Ok() ) + { + loadedIcons = false; + + break; + } + + imageList->Add(bmp); + } + + m_listctrl->SetImageList(imageList, wxIMAGE_LIST_SMALL); + + // and fill it + wxString fmt = wxLog::GetTimestamp(); + if ( !fmt ) + { + // default format + fmt = _T("%c"); + } + + size_t count = m_messages.GetCount(); + for ( size_t n = 0; n < count; n++ ) + { + int image; + + if ( loadedIcons ) + { + switch ( m_severity[n] ) + { + case wxLOG_Error: + image = 0; + break; + + case wxLOG_Warning: + image = 1; + break; + + default: + image = 2; + } + } + else // failed to load images + { + image = -1; + } + + m_listctrl->InsertItem(n, m_messages[n], image); + m_listctrl->SetItem(n, 1, TimeStamp(fmt, (time_t)m_times[n])); + } + + // let the columns size themselves + m_listctrl->SetColumnWidth(0, wxLIST_AUTOSIZE); + m_listctrl->SetColumnWidth(1, wxLIST_AUTOSIZE); + + // calculate an approximately nice height for the listctrl + int height = GetCharHeight()*(count + 4); + + // but check that the dialog won't fall fown from the screen + // + // we use GetMinHeight() to get the height of the dialog part without the + // details and we consider that the "Save" button below and the separator + // line (and the margins around it) take about as much, hence double it + int heightMax = wxGetDisplaySize().y - GetPosition().y - 2*GetMinHeight(); + + // we should leave a margin + heightMax *= 9; + heightMax /= 10; + + m_listctrl->SetSize(wxDefaultCoord, wxMin(height, heightMax)); +} + +void wxLogDialog::OnListSelect(wxListEvent& event) +{ + // we can't just disable the control because this looks ugly under Windows + // (wrong bg colour, no scrolling...), but we still want to disable + // selecting items - it makes no sense here + m_listctrl->SetItemState(event.GetIndex(), 0, wxLIST_STATE_SELECTED); +} + +void wxLogDialog::OnOk(wxCommandEvent& WXUNUSED(event)) +{ + EndModal(wxID_OK); +} + +#if wxUSE_FILE + +void wxLogDialog::OnSave(wxCommandEvent& WXUNUSED(event)) +{ +#if wxUSE_FILEDLG + wxFile file; + int rc = OpenLogFile(file, NULL, this); + if ( rc == -1 ) + { + // cancelled + return; + } + + bool ok = rc != 0; + + wxString fmt = wxLog::GetTimestamp(); + if ( !fmt ) + { + // default format + fmt = _T("%c"); + } + + size_t count = m_messages.GetCount(); + for ( size_t n = 0; ok && (n < count); n++ ) + { + wxString line; + line << TimeStamp(fmt, (time_t)m_times[n]) + << _T(": ") + << m_messages[n] + << wxTextFile::GetEOL(); + + ok = file.Write(line); + } + + if ( ok ) + ok = file.Close(); + + if ( !ok ) + wxLogError(_("Can't save log contents to file.")); +#endif // wxUSE_FILEDLG +} + +#endif // wxUSE_FILE + +void wxLogDialog::OnDetails(wxCommandEvent& WXUNUSED(event)) +{ + wxSizer *sizer = GetSizer(); + + if ( m_showingDetails ) + { +#ifdef __SMARTPHONE__ + SetRightMenu(wxID_MORE, ms_details + EXPAND_SUFFIX); +#else + m_btnDetails->SetLabel(ms_details + EXPAND_SUFFIX); +#endif + + sizer->Detach( m_listctrl ); + +#ifndef __SMARTPHONE__ + +#if wxUSE_STATLINE + sizer->Detach( m_statline ); +#endif // wxUSE_STATLINE + +#if wxUSE_FILE + sizer->Detach( m_btnSave ); +#endif // wxUSE_FILE + +#endif // __SMARTPHONE__ + } + else // show details now + { +#ifdef __SMARTPHONE__ + SetRightMenu(wxID_MORE, wxString(_T("<< ")) + ms_details); +#else + m_btnDetails->SetLabel(wxString(_T("<< ")) + ms_details); +#endif + + if ( !m_listctrl ) + { + CreateDetailsControls(); + } + +#if wxUSE_STATLINE && !defined(__SMARTPHONE__) + bool isPda = (wxSystemSettings::GetScreenType() <= wxSYS_SCREEN_PDA); + if (!isPda) + sizer->Add(m_statline, 0, wxEXPAND | (wxALL & ~wxTOP), MARGIN); +#endif // wxUSE_STATLINE + + sizer->Add(m_listctrl, 1, wxEXPAND | (wxALL & ~wxTOP), MARGIN); + + // VZ: this doesn't work as this becomes the initial (and not only + // minimal) listctrl height as well - why? +#if 0 + // allow the user to make the dialog shorter than its initial height - + // without this it wouldn't work as the list ctrl would have been + // incompressible + sizer->SetItemMinSize(m_listctrl, 100, 3*GetCharHeight()); +#endif // 0 + +#if wxUSE_FILE && !defined(__SMARTPHONE__) + sizer->Add(m_btnSave, 0, wxALIGN_RIGHT | (wxALL & ~wxTOP), MARGIN); +#endif // wxUSE_FILE + } + + m_showingDetails = !m_showingDetails; + + // in any case, our size changed - relayout everything and set new hints + // --------------------------------------------------------------------- + + // we have to reset min size constraints or Fit() would never reduce the + // dialog size when collapsing it and we have to reset max constraint + // because it wouldn't expand it otherwise + + m_minHeight = + m_maxHeight = -1; + + // wxSizer::FitSize() is private, otherwise we might use it directly... + wxSize sizeTotal = GetSize(), + sizeClient = GetClientSize(); + + wxSize size = sizer->GetMinSize(); + size.x += sizeTotal.x - sizeClient.x; + size.y += sizeTotal.y - sizeClient.y; + + // we don't want to allow expanding the dialog in vertical direction as + // this would show the "hidden" details but we can resize the dialog + // vertically while the details are shown + if ( !m_showingDetails ) + m_maxHeight = size.y; + + SetSizeHints(size.x, size.y, m_maxWidth, m_maxHeight); + +#ifdef __WXWINCE__ + if (m_showingDetails) + m_listctrl->Show(); +#endif + + // don't change the width when expanding/collapsing + SetSize(wxDefaultCoord, size.y); + +#ifdef __WXGTK__ + // VS: this is necessary in order to force frame redraw under + // WindowMaker or fvwm2 (and probably other broken WMs). + // Otherwise, detailed list wouldn't be displayed. + Show(); +#endif // wxGTK +} + +wxLogDialog::~wxLogDialog() +{ + if ( m_listctrl ) + { + delete m_listctrl->GetImageList(wxIMAGE_LIST_SMALL); + } +} + +#endif // wxUSE_LOG_DIALOG + +#if wxUSE_FILE && wxUSE_FILEDLG + +// pass an uninitialized file object, the function will ask the user for the +// filename and try to open it, returns true on success (file was opened), +// false if file couldn't be opened/created and -1 if the file selection +// dialog was cancelled +static int OpenLogFile(wxFile& file, wxString *pFilename, wxWindow *parent) +{ + // get the file name + // ----------------- + wxString filename = wxSaveFileSelector(wxT("log"), wxT("txt"), wxT("log.txt"), parent); + if ( !filename ) { + // cancelled + return -1; + } + + // open file + // --------- + bool bOk wxDUMMY_INITIALIZE(false); + if ( wxFile::Exists(filename) ) { + bool bAppend = false; + wxString strMsg; + strMsg.Printf(_("Append log to file '%s' (choosing [No] will overwrite it)?"), + filename.c_str()); + switch ( wxMessageBox(strMsg, _("Question"), + wxICON_QUESTION | wxYES_NO | wxCANCEL) ) { + case wxYES: + bAppend = true; + break; + + case wxNO: + bAppend = false; + break; + + case wxCANCEL: + return -1; + + default: + wxFAIL_MSG(_("invalid message box return value")); + } + + if ( bAppend ) { + bOk = file.Open(filename, wxFile::write_append); + } + else { + bOk = file.Create(filename, true /* overwrite */); + } + } + else { + bOk = file.Create(filename); + } + + if ( pFilename ) + *pFilename = filename; + + return bOk; +} + +#endif // wxUSE_FILE + +#endif // !(wxUSE_LOGGUI || wxUSE_LOGWINDOW) + +#if wxUSE_LOG && wxUSE_TEXTCTRL + +// ---------------------------------------------------------------------------- +// wxLogTextCtrl implementation +// ---------------------------------------------------------------------------- + +wxLogTextCtrl::wxLogTextCtrl(wxTextCtrl *pTextCtrl) +{ + m_pTextCtrl = pTextCtrl; +} + +void wxLogTextCtrl::DoLogString(const wxChar *szString, time_t WXUNUSED(t)) +{ + wxString msg; + TimeStamp(&msg); + + msg << szString << wxT('\n'); + m_pTextCtrl->AppendText(msg); +} + +#endif // wxUSE_LOG && wxUSE_TEXTCTRL diff --git a/Externals/wxWidgets/src/generic/mask.cpp b/Externals/wxWidgets/src/generic/mask.cpp new file mode 100644 index 0000000000..19e7124bed --- /dev/null +++ b/Externals/wxWidgets/src/generic/mask.cpp @@ -0,0 +1,76 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/generic/mask.cpp +// Purpose: generic wxMask implementation +// Author: Vadim Zeitlin +// Created: 2006-09-28 +// RCS-ID: $Id: mask.cpp 41495 2006-09-28 23:02:39Z VZ $ +// Copyright: (c) 2006 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// for compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#ifndef WX_PRECOMP + #include "wx/bitmap.h" + #include "wx/image.h" +#endif // WX_PRECOMP + +#if wxUSE_GENERIC_MASK + +// ============================================================================ +// wxMask implementation +// ============================================================================ + +IMPLEMENT_DYNAMIC_CLASS(wxMask, wxObject) + +void wxMask::FreeData() +{ + m_bitmap = wxNullBitmap; +} + +bool wxMask::InitFromColour(const wxBitmap& bitmap, const wxColour& colour) +{ +#if wxUSE_IMAGE + const wxColour clr(bitmap.QuantizeColour(colour)); + + wxImage imgSrc(bitmap.ConvertToImage()); + imgSrc.SetMask(false); + wxImage image(imgSrc.ConvertToMono(clr.Red(), clr.Green(), clr.Blue())); + if ( !image.Ok() ) + return false; + + m_bitmap = wxBitmap(image, 1); + + return m_bitmap.Ok(); +#else // !wxUSE_IMAGE + wxUnusedVar(bitmap); + wxUnusedVar(colour); + + return false; +#endif // wxUSE_IMAGE/!wxUSE_IMAGE +} + +bool wxMask::InitFromMonoBitmap(const wxBitmap& bitmap) +{ + wxCHECK_MSG( bitmap.Ok(), false, wxT("Invalid bitmap") ); + wxCHECK_MSG( bitmap.GetDepth() == 1, false, wxT("Cannot create mask from colour bitmap") ); + + m_bitmap = bitmap; + + return true; +} + +#endif // wxUSE_GENERIC_MASK diff --git a/Externals/wxWidgets/src/generic/mdig.cpp b/Externals/wxWidgets/src/generic/mdig.cpp new file mode 100644 index 0000000000..675df58be6 --- /dev/null +++ b/Externals/wxWidgets/src/generic/mdig.cpp @@ -0,0 +1,820 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/generic/mdig.cpp +// Purpose: Generic MDI (Multiple Document Interface) classes +// Author: Hans Van Leemputten +// Modified by: +// Created: 29/07/2002 +// RCS-ID: $Id: mdig.cpp 41069 2006-09-08 14:38:49Z VS $ +// Copyright: (c) Hans Van Leemputten +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// =========================================================================== +// declarations +// =========================================================================== + +// --------------------------------------------------------------------------- +// headers +// --------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_MDI + +#include "wx/generic/mdig.h" + +#ifndef WX_PRECOMP + #include "wx/panel.h" + #include "wx/menu.h" + #include "wx/intl.h" + #include "wx/log.h" +#endif //WX_PRECOMP + +#include "wx/stockitem.h" + +enum MDI_MENU_ID +{ + wxWINDOWCLOSE = 4001, + wxWINDOWCLOSEALL, + wxWINDOWNEXT, + wxWINDOWPREV +}; + +//----------------------------------------------------------------------------- +// wxGenericMDIParentFrame +//----------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxGenericMDIParentFrame, wxFrame) + +BEGIN_EVENT_TABLE(wxGenericMDIParentFrame, wxFrame) +#if wxUSE_MENUS + EVT_MENU (wxID_ANY, wxGenericMDIParentFrame::DoHandleMenu) +#endif +END_EVENT_TABLE() + +wxGenericMDIParentFrame::wxGenericMDIParentFrame() +{ + Init(); +} + +wxGenericMDIParentFrame::wxGenericMDIParentFrame(wxWindow *parent, + wxWindowID id, + const wxString& title, + const wxPoint& pos, + const wxSize& size, + long style, + const wxString& name) +{ + Init(); + + (void)Create(parent, id, title, pos, size, style, name); +} + +wxGenericMDIParentFrame::~wxGenericMDIParentFrame() +{ + // Make sure the client window is destructed before the menu bars are! + wxDELETE(m_pClientWindow); + +#if wxUSE_MENUS + if (m_pMyMenuBar) + { + delete m_pMyMenuBar; + m_pMyMenuBar = (wxMenuBar *) NULL; + } + + RemoveWindowMenu(GetMenuBar()); + + if (m_pWindowMenu) + { + delete m_pWindowMenu; + m_pWindowMenu = (wxMenu*) NULL; + } +#endif // wxUSE_MENUS +} + +bool wxGenericMDIParentFrame::Create(wxWindow *parent, + wxWindowID id, + const wxString& title, + const wxPoint& pos, + const wxSize& size, + long style, + const wxString& name) +{ + // this style can be used to prevent a window from having the standard MDI + // "Window" menu + if ( !(style & wxFRAME_NO_WINDOW_MENU) ) + { +#if wxUSE_MENUS + m_pWindowMenu = new wxMenu; + + m_pWindowMenu->Append(wxWINDOWCLOSE, _("Cl&ose")); + m_pWindowMenu->Append(wxWINDOWCLOSEALL, _("Close All")); + m_pWindowMenu->AppendSeparator(); + m_pWindowMenu->Append(wxWINDOWNEXT, _("&Next")); + m_pWindowMenu->Append(wxWINDOWPREV, _("&Previous")); +#endif // wxUSE_MENUS + } + + wxFrame::Create( parent, id, title, pos, size, style, name ); + + OnCreateClient(); + + return true; +} + +#if wxUSE_MENUS +void wxGenericMDIParentFrame::SetWindowMenu(wxMenu* pMenu) +{ + // Replace the window menu from the currently loaded menu bar. + wxMenuBar *pMenuBar = GetMenuBar(); + + if (m_pWindowMenu) + { + RemoveWindowMenu(pMenuBar); + + wxDELETE(m_pWindowMenu); + } + + if (pMenu) + { + m_pWindowMenu = pMenu; + + AddWindowMenu(pMenuBar); + } +} + +void wxGenericMDIParentFrame::SetMenuBar(wxMenuBar *pMenuBar) +{ + // Remove the Window menu from the old menu bar + RemoveWindowMenu(GetMenuBar()); + // Add the Window menu to the new menu bar. + AddWindowMenu(pMenuBar); + + wxFrame::SetMenuBar(pMenuBar); +} +#endif // wxUSE_MENUS + +void wxGenericMDIParentFrame::SetChildMenuBar(wxGenericMDIChildFrame *pChild) +{ +#if wxUSE_MENUS + if (pChild == (wxGenericMDIChildFrame *) NULL) + { + // No Child, set Our menu bar back. + SetMenuBar(m_pMyMenuBar); + + // Make sure we know our menu bar is in use + m_pMyMenuBar = (wxMenuBar*) NULL; + } + else + { + if (pChild->GetMenuBar() == (wxMenuBar*) NULL) + return; + + // Do we need to save the current bar? + if (m_pMyMenuBar == NULL) + m_pMyMenuBar = GetMenuBar(); + + SetMenuBar(pChild->GetMenuBar()); + } +#endif // wxUSE_MENUS +} + +bool wxGenericMDIParentFrame::ProcessEvent(wxEvent& event) +{ + /* + * Redirect events to active child first. + */ + + // Stops the same event being processed repeatedly + static wxEventType inEvent = wxEVT_NULL; + if (inEvent == event.GetEventType()) + return false; + + inEvent = event.GetEventType(); + + // Let the active child (if any) process the event first. + bool res = false; + if (m_pActiveChild && event.IsKindOf(CLASSINFO(wxCommandEvent)) +#if 0 + /* This is sure to not give problems... */ + && (event.GetEventType() == wxEVT_COMMAND_MENU_SELECTED || + event.GetEventType() == wxEVT_UPDATE_UI ) +#else + /* This was tested on wxMSW and worked... */ + && event.GetEventObject() != m_pClientWindow + && !(event.GetEventType() == wxEVT_ACTIVATE || + event.GetEventType() == wxEVT_SET_FOCUS || + event.GetEventType() == wxEVT_KILL_FOCUS || + event.GetEventType() == wxEVT_CHILD_FOCUS || + event.GetEventType() == wxEVT_COMMAND_SET_FOCUS || + event.GetEventType() == wxEVT_COMMAND_KILL_FOCUS ) +#endif + ) + { + res = m_pActiveChild->GetEventHandler()->ProcessEvent(event); + } + + // If the event was not handled this frame will handle it! + if (!res) + { + res = GetEventHandler()->wxEvtHandler::ProcessEvent(event); + } + + inEvent = wxEVT_NULL; + + return res; +} + +wxGenericMDIChildFrame *wxGenericMDIParentFrame::GetActiveChild() const +{ + return m_pActiveChild; +} + +void wxGenericMDIParentFrame::SetActiveChild(wxGenericMDIChildFrame* pChildFrame) +{ + m_pActiveChild = pChildFrame; +} + +wxGenericMDIClientWindow *wxGenericMDIParentFrame::GetClientWindow() const +{ + return m_pClientWindow; +} + +wxGenericMDIClientWindow *wxGenericMDIParentFrame::OnCreateClient() +{ +#if wxUSE_GENERIC_MDI_AS_NATIVE + m_pClientWindow = new wxMDIClientWindow( this ); +#else + m_pClientWindow = new wxGenericMDIClientWindow( this ); +#endif + return m_pClientWindow; +} + +void wxGenericMDIParentFrame::ActivateNext() +{ + if (m_pClientWindow && m_pClientWindow->GetSelection() != -1) + { + size_t active = m_pClientWindow->GetSelection() + 1; + if (active >= m_pClientWindow->GetPageCount()) + active = 0; + + m_pClientWindow->SetSelection(active); + } +} + +void wxGenericMDIParentFrame::ActivatePrevious() +{ + if (m_pClientWindow && m_pClientWindow->GetSelection() != -1) + { + int active = m_pClientWindow->GetSelection() - 1; + if (active < 0) + active = m_pClientWindow->GetPageCount() - 1; + + m_pClientWindow->SetSelection(active); + } +} + +void wxGenericMDIParentFrame::Init() +{ + m_pClientWindow = (wxGenericMDIClientWindow *) NULL; + m_pActiveChild = (wxGenericMDIChildFrame *) NULL; +#if wxUSE_MENUS + m_pWindowMenu = (wxMenu *) NULL; + m_pMyMenuBar = (wxMenuBar*) NULL; +#endif // wxUSE_MENUS +} + +#if wxUSE_MENUS +void wxGenericMDIParentFrame::RemoveWindowMenu(wxMenuBar *pMenuBar) +{ + if (pMenuBar && m_pWindowMenu) + { + // Remove old window menu + int pos = pMenuBar->FindMenu(_("&Window")); + if (pos != wxNOT_FOUND) + { + wxASSERT(m_pWindowMenu == pMenuBar->GetMenu(pos)); // DBG:: We're going to delete the wrong menu!!! + pMenuBar->Remove(pos); + } + } +} + +void wxGenericMDIParentFrame::AddWindowMenu(wxMenuBar *pMenuBar) +{ + if (pMenuBar && m_pWindowMenu) + { + int pos = pMenuBar->FindMenu(wxGetStockLabel(wxID_HELP,false)); + if (pos == wxNOT_FOUND) + { + pMenuBar->Append(m_pWindowMenu, _("&Window")); + } + else + { + pMenuBar->Insert(pos, m_pWindowMenu, _("&Window")); + } + } +} + +void wxGenericMDIParentFrame::DoHandleMenu(wxCommandEvent &event) +{ + switch (event.GetId()) + { + case wxWINDOWCLOSE: + if (m_pActiveChild) + { + m_pActiveChild->Close(); + } + break; + case wxWINDOWCLOSEALL: + { +#if 0 // code is only needed if next #if is set to 0! + wxGenericMDIChildFrame *pFirstActiveChild = m_pActiveChild; +#endif + while (m_pActiveChild) + { + if (!m_pActiveChild->Close()) + { + return; // We failed... + } + else + { +#if 1 // What's best? Delayed deleting or immediate deleting? + delete m_pActiveChild; + m_pActiveChild = NULL; +#else + ActivateNext(); + + if (pFirstActiveChild == m_pActiveChild) + return; // We've called Close on all items, no need to continue. +#endif + } + } + } + break; + case wxWINDOWNEXT: + ActivateNext(); + break; + case wxWINDOWPREV: + ActivatePrevious(); + break; + default : + event.Skip(); + } +} +#endif // wxUSE_MENUS + +void wxGenericMDIParentFrame::DoGetClientSize(int *width, int *height) const +{ + wxFrame::DoGetClientSize( width, height ); +} + + +//----------------------------------------------------------------------------- +// wxGenericMDIChildFrame +//----------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxGenericMDIChildFrame, wxPanel) + +BEGIN_EVENT_TABLE(wxGenericMDIChildFrame, wxPanel) + EVT_MENU_HIGHLIGHT_ALL(wxGenericMDIChildFrame::OnMenuHighlight) + EVT_ACTIVATE(wxGenericMDIChildFrame::OnActivate) + + EVT_CLOSE(wxGenericMDIChildFrame::OnCloseWindow) + EVT_SIZE(wxGenericMDIChildFrame::OnSize) +END_EVENT_TABLE() + +wxGenericMDIChildFrame::wxGenericMDIChildFrame() +{ + Init(); +} + +wxGenericMDIChildFrame::wxGenericMDIChildFrame( wxGenericMDIParentFrame *parent, + wxWindowID id, const wxString& title, + const wxPoint& WXUNUSED(pos), const wxSize& size, + long style, const wxString& name ) +{ + Init(); + + Create( parent, id, title, wxDefaultPosition, size, style, name ); +} + +wxGenericMDIChildFrame::~wxGenericMDIChildFrame() +{ + wxGenericMDIParentFrame *pParentFrame = GetMDIParentFrame(); + + if (pParentFrame != NULL) + { + bool bActive = false; + if (pParentFrame->GetActiveChild() == this) + { + pParentFrame->SetActiveChild((wxGenericMDIChildFrame*) NULL); + pParentFrame->SetChildMenuBar((wxGenericMDIChildFrame*) NULL); + bActive = true; + } + + wxGenericMDIClientWindow *pClientWindow = pParentFrame->GetClientWindow(); + + // Remove page if still there + size_t pos; + for (pos = 0; pos < pClientWindow->GetPageCount(); pos++) + { + if (pClientWindow->GetPage(pos) == this) + { + if (pClientWindow->RemovePage(pos)) + pClientWindow->Refresh(); + break; + } + } + + if (bActive) + { + // Set the new selection to the a remaining page + if (pClientWindow->GetPageCount() > pos) + { + pClientWindow->SetSelection(pos); + } + else + { + if ((int)pClientWindow->GetPageCount() - 1 >= 0) + pClientWindow->SetSelection(pClientWindow->GetPageCount() - 1); + } + } + } + +#if wxUSE_MENUS + wxDELETE(m_pMenuBar); +#endif // wxUSE_MENUS +} + +bool wxGenericMDIChildFrame::Create( wxGenericMDIParentFrame *parent, + wxWindowID id, const wxString& title, + const wxPoint& WXUNUSED(pos), const wxSize& size, + long style, const wxString& name ) +{ + wxGenericMDIClientWindow* pClientWindow = parent->GetClientWindow(); + + wxASSERT_MSG((pClientWindow != (wxWindow*) NULL), wxT("Missing MDI client window.") ); + + wxPanel::Create(pClientWindow, id, wxDefaultPosition, size, style, name); + + SetMDIParentFrame(parent); + + // This is the currently active child + parent->SetActiveChild(this); + + m_Title = title; + + pClientWindow->AddPage(this, title, true); + ApplyMDIChildFrameRect(); // Ok confirme the size change! + pClientWindow->Refresh(); + + return true; +} + +#if wxUSE_MENUS +void wxGenericMDIChildFrame::SetMenuBar( wxMenuBar *menu_bar ) +{ + wxMenuBar *pOldMenuBar = m_pMenuBar; + m_pMenuBar = menu_bar; + + if (m_pMenuBar) + { + wxGenericMDIParentFrame *pParentFrame = GetMDIParentFrame(); + + if (pParentFrame != NULL) + { + m_pMenuBar->SetParent(pParentFrame); + + if (pParentFrame->GetActiveChild() == this) + { + // Replace current menu bars + if (pOldMenuBar) + pParentFrame->SetChildMenuBar((wxGenericMDIChildFrame*) NULL); + pParentFrame->SetChildMenuBar((wxGenericMDIChildFrame*) this); + } + } + } +} + +wxMenuBar *wxGenericMDIChildFrame::GetMenuBar() const +{ + return m_pMenuBar; +} +#endif // wxUSE_MENUS + +void wxGenericMDIChildFrame::SetTitle(const wxString& title) +{ + m_Title = title; + + wxGenericMDIParentFrame *pParentFrame = GetMDIParentFrame(); + + if (pParentFrame != NULL) + { + wxGenericMDIClientWindow * pClientWindow = pParentFrame->GetClientWindow(); + + if (pClientWindow != NULL) + { + size_t pos; + for (pos = 0; pos < pClientWindow->GetPageCount(); pos++) + { + if (pClientWindow->GetPage(pos) == this) + { + pClientWindow->SetPageText(pos, m_Title); + break; + } + } + } + } +} + +wxString wxGenericMDIChildFrame::GetTitle() const +{ + return m_Title; +} + +void wxGenericMDIChildFrame::Activate() +{ + wxGenericMDIParentFrame *pParentFrame = GetMDIParentFrame(); + + if (pParentFrame != NULL) + { + wxGenericMDIClientWindow * pClientWindow = pParentFrame->GetClientWindow(); + + if (pClientWindow != NULL) + { + size_t pos; + for (pos = 0; pos < pClientWindow->GetPageCount(); pos++) + { + if (pClientWindow->GetPage(pos) == this) + { + pClientWindow->SetSelection(pos); + break; + } + } + } + } +} + +void wxGenericMDIChildFrame::OnMenuHighlight(wxMenuEvent& event) +{ +#if wxUSE_STATUSBAR + if ( m_pMDIParentFrame) + { + // we don't have any help text for this item, + // but may be the MDI frame does? + m_pMDIParentFrame->OnMenuHighlight(event); + } +#else + wxUnusedVar(event); +#endif // wxUSE_STATUSBAR +} + +void wxGenericMDIChildFrame::OnActivate(wxActivateEvent& WXUNUSED(event)) +{ + // Do mothing. +} + +/*** Copied from top level..! ***/ +// default resizing behaviour - if only ONE subwindow, resize to fill the +// whole client area +void wxGenericMDIChildFrame::OnSize(wxSizeEvent& WXUNUSED(event)) +{ + // if we're using constraints or sizers - do use them + if ( GetAutoLayout() ) + { + Layout(); + } + else + { + // do we have _exactly_ one child? + wxWindow *child = (wxWindow *)NULL; + for ( wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); + node; + node = node->GetNext() ) + { + wxWindow *win = node->GetData(); + + // exclude top level and managed windows (status bar isn't + // currently in the children list except under wxMac anyhow, but + // it makes no harm to test for it) + if ( !win->IsTopLevel() /*&& !IsOneOfBars(win)*/ ) + { + if ( child ) + { + return; // it's our second subwindow - nothing to do + } + + child = win; + } + } + + // do we have any children at all? + if ( child ) + { + // exactly one child - set it's size to fill the whole frame + int clientW, clientH; + DoGetClientSize(&clientW, &clientH); + + // for whatever reasons, wxGTK wants to have a small offset - it + // probably looks better with it? +#ifdef __WXGTK__ + static const int ofs = 1; +#else + static const int ofs = 0; +#endif + + child->SetSize(ofs, ofs, clientW - 2*ofs, clientH - 2*ofs); + } + } +} + +/*** Copied from top level..! ***/ +// The default implementation for the close window event. +void wxGenericMDIChildFrame::OnCloseWindow(wxCloseEvent& WXUNUSED(event)) +{ + Destroy(); +} + +void wxGenericMDIChildFrame::SetMDIParentFrame(wxGenericMDIParentFrame* parentFrame) +{ + m_pMDIParentFrame = parentFrame; +} + +wxGenericMDIParentFrame* wxGenericMDIChildFrame::GetMDIParentFrame() const +{ + return m_pMDIParentFrame; +} + +void wxGenericMDIChildFrame::Init() +{ + m_pMDIParentFrame = (wxGenericMDIParentFrame *) NULL; +#if wxUSE_MENUS + m_pMenuBar = (wxMenuBar *) NULL; +#endif // wxUSE_MENUS +} + +void wxGenericMDIChildFrame::DoMoveWindow(int x, int y, int width, int height) +{ + m_MDIRect = wxRect(x, y, width, height); +} + +void wxGenericMDIChildFrame::ApplyMDIChildFrameRect() +{ + wxPanel::DoMoveWindow(m_MDIRect.x, m_MDIRect.y, m_MDIRect.width, m_MDIRect.height); +} + +//----------------------------------------------------------------------------- +// wxGenericMDIClientWindow +//----------------------------------------------------------------------------- + +#define wxID_NOTEBOOK_CLIENT_AREA wxID_HIGHEST + 100 + +IMPLEMENT_DYNAMIC_CLASS(wxGenericMDIClientWindow, wxNotebook) + +BEGIN_EVENT_TABLE(wxGenericMDIClientWindow, wxNotebook) + EVT_NOTEBOOK_PAGE_CHANGED(wxID_NOTEBOOK_CLIENT_AREA, wxGenericMDIClientWindow::OnPageChanged) + EVT_SIZE(wxGenericMDIClientWindow::OnSize) +END_EVENT_TABLE() + + +wxGenericMDIClientWindow::wxGenericMDIClientWindow() +{ +} + +wxGenericMDIClientWindow::wxGenericMDIClientWindow( wxGenericMDIParentFrame *parent, long style ) +{ + CreateClient( parent, style ); +} + +wxGenericMDIClientWindow::~wxGenericMDIClientWindow() +{ + DestroyChildren(); +} + +bool wxGenericMDIClientWindow::CreateClient( wxGenericMDIParentFrame *parent, long style ) +{ + SetWindowStyleFlag(style); + + bool success = wxNotebook::Create(parent, wxID_NOTEBOOK_CLIENT_AREA, wxPoint(0,0), wxSize(100, 100), 0); + if (success) + { + /* + wxFont font(10, wxSWISS, wxNORMAL, wxNORMAL); + wxFont selFont(10, wxSWISS, wxNORMAL, wxBOLD); + GetTabView()->SetTabFont(font); + GetTabView()->SetSelectedTabFont(selFont); + GetTabView()->SetTabSize(120, 18); + GetTabView()->SetTabSelectionHeight(20); + */ + return true; + } + else + return false; +} + +int wxGenericMDIClientWindow::SetSelection(size_t nPage) +{ + int oldSelection = wxNotebook::SetSelection(nPage); + +#if !defined(__WXMSW__) // No need to do this for wxMSW as wxNotebook::SetSelection() + // will already cause this to be done! + // Handle the page change. + PageChanged(oldSelection, nPage); +#endif + + return oldSelection; +} + +void wxGenericMDIClientWindow::PageChanged(int OldSelection, int newSelection) +{ + // Don't do to much work, only when something realy should change! + if (OldSelection == newSelection) + return; + // Again check if we realy need to do this... + if (newSelection != -1) + { + wxGenericMDIChildFrame* child = (wxGenericMDIChildFrame *)GetPage(newSelection); + + if (child->GetMDIParentFrame()->GetActiveChild() == child) + return; + } + + // Notify old active child that it has been deactivated + if (OldSelection != -1) + { + wxGenericMDIChildFrame* oldChild = (wxGenericMDIChildFrame *)GetPage(OldSelection); + if (oldChild) + { + wxActivateEvent event(wxEVT_ACTIVATE, false, oldChild->GetId()); + event.SetEventObject( oldChild ); + oldChild->GetEventHandler()->ProcessEvent(event); + } + } + + // Notify new active child that it has been activated + if (newSelection != -1) + { + wxGenericMDIChildFrame* activeChild = (wxGenericMDIChildFrame *)GetPage(newSelection); + if (activeChild) + { + wxActivateEvent event(wxEVT_ACTIVATE, true, activeChild->GetId()); + event.SetEventObject( activeChild ); + activeChild->GetEventHandler()->ProcessEvent(event); + + if (activeChild->GetMDIParentFrame()) + { + activeChild->GetMDIParentFrame()->SetActiveChild(activeChild); + activeChild->GetMDIParentFrame()->SetChildMenuBar(activeChild); + } + } + } +} + +void wxGenericMDIClientWindow::OnPageChanged(wxNotebookEvent& event) +{ + PageChanged(event.GetOldSelection(), event.GetSelection()); + + event.Skip(); +} + +void wxGenericMDIClientWindow::OnSize(wxSizeEvent& event) +{ + wxNotebook::OnSize(event); + + size_t pos; + for (pos = 0; pos < GetPageCount(); pos++) + { + ((wxGenericMDIChildFrame *)GetPage(pos))->ApplyMDIChildFrameRect(); + } +} + + +/* + * Define normal wxMDI classes based on wxGenericMDI + */ + +#if wxUSE_GENERIC_MDI_AS_NATIVE + +wxMDIChildFrame * wxMDIParentFrame::GetActiveChild() const + { + wxGenericMDIChildFrame *pGFrame = wxGenericMDIParentFrame::GetActiveChild(); + wxMDIChildFrame *pFrame = wxDynamicCast(pGFrame, wxMDIChildFrame); + + wxASSERT_MSG(!(pFrame == NULL && pGFrame != NULL), wxT("Active frame is class not derived from wxMDIChildFrame!")); + + return pFrame; + } + +IMPLEMENT_DYNAMIC_CLASS(wxMDIParentFrame, wxGenericMDIParentFrame) +IMPLEMENT_DYNAMIC_CLASS(wxMDIChildFrame, wxGenericMDIChildFrame) +IMPLEMENT_DYNAMIC_CLASS(wxMDIClientWindow, wxGenericMDIClientWindow) + +#endif // wxUSE_GENERIC_MDI_AS_NATIVE + +#endif // wxUSE_MDI + diff --git a/Externals/wxWidgets/src/generic/msgdlgg.cpp b/Externals/wxWidgets/src/generic/msgdlgg.cpp new file mode 100644 index 0000000000..8887f131b0 --- /dev/null +++ b/Externals/wxWidgets/src/generic/msgdlgg.cpp @@ -0,0 +1,159 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/generic/msgdlgg.cpp +// Purpose: wxGenericMessageDialog +// Author: Julian Smart, Robert Roebling +// Modified by: +// Created: 04/01/98 +// RCS-ID: $Id: msgdlgg.cpp 41838 2006-10-09 21:08:45Z VZ $ +// Copyright: (c) Julian Smart and Robert Roebling +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ +#pragma hdrstop +#endif + +#if wxUSE_MSGDLG && (!defined(__WXGTK20__) || defined(__WXUNIVERSAL__) || defined(__WXGPE__)) + +#ifndef WX_PRECOMP + #include "wx/utils.h" + #include "wx/dialog.h" + #include "wx/button.h" + #include "wx/stattext.h" + #include "wx/statbmp.h" + #include "wx/layout.h" + #include "wx/intl.h" + #include "wx/icon.h" + #include "wx/sizer.h" + #include "wx/app.h" + #include "wx/settings.h" +#endif + +#include +#include + +#define __WX_COMPILING_MSGDLGG_CPP__ 1 +#include "wx/msgdlg.h" +#include "wx/artprov.h" + +#if wxUSE_STATLINE + #include "wx/statline.h" +#endif + +// ---------------------------------------------------------------------------- +// icons +// ---------------------------------------------------------------------------- + +BEGIN_EVENT_TABLE(wxGenericMessageDialog, wxDialog) + EVT_BUTTON(wxID_YES, wxGenericMessageDialog::OnYes) + EVT_BUTTON(wxID_NO, wxGenericMessageDialog::OnNo) + EVT_BUTTON(wxID_CANCEL, wxGenericMessageDialog::OnCancel) +END_EVENT_TABLE() + +IMPLEMENT_CLASS(wxGenericMessageDialog, wxDialog) + +wxGenericMessageDialog::wxGenericMessageDialog( wxWindow *parent, + const wxString& message, + const wxString& caption, + long style, + const wxPoint& pos) + : wxDialog( parent, wxID_ANY, caption, pos, wxDefaultSize, wxDEFAULT_DIALOG_STYLE ) +{ + SetMessageDialogStyle(style); + + bool is_pda = (wxSystemSettings::GetScreenType() <= wxSYS_SCREEN_PDA); + + wxBoxSizer *topsizer = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer *icon_text = new wxBoxSizer( wxHORIZONTAL ); + +#if wxUSE_STATBMP + // 1) icon + if (style & wxICON_MASK) + { + wxBitmap bitmap; + switch ( style & wxICON_MASK ) + { + default: + wxFAIL_MSG(_T("incorrect log style")); + // fall through + + case wxICON_ERROR: + bitmap = wxArtProvider::GetIcon(wxART_ERROR, wxART_MESSAGE_BOX); + break; + + case wxICON_INFORMATION: + bitmap = wxArtProvider::GetIcon(wxART_INFORMATION, wxART_MESSAGE_BOX); + break; + + case wxICON_WARNING: + bitmap = wxArtProvider::GetIcon(wxART_WARNING, wxART_MESSAGE_BOX); + break; + + case wxICON_QUESTION: + bitmap = wxArtProvider::GetIcon(wxART_QUESTION, wxART_MESSAGE_BOX); + break; + } + wxStaticBitmap *icon = new wxStaticBitmap(this, wxID_ANY, bitmap); + if (is_pda) + topsizer->Add( icon, 0, wxTOP|wxLEFT|wxRIGHT | wxALIGN_LEFT, 10 ); + else + icon_text->Add( icon, 0, wxCENTER ); + } +#endif // wxUSE_STATBMP + +#if wxUSE_STATTEXT + // 2) text + icon_text->Add( CreateTextSizer( message ), 0, wxALIGN_CENTER | wxLEFT, 10 ); + + topsizer->Add( icon_text, 1, wxCENTER | wxLEFT|wxRIGHT|wxTOP, 10 ); +#endif // wxUSE_STATTEXT + + // 3) buttons + int center_flag = wxEXPAND; + if (style & wxYES_NO) + center_flag = wxALIGN_CENTRE; + wxSizer *sizerBtn = CreateSeparatedButtonSizer(style & ButtonSizerFlags); + if ( sizerBtn ) + topsizer->Add(sizerBtn, 0, center_flag | wxALL, 10 ); + + SetAutoLayout( true ); + SetSizer( topsizer ); + + topsizer->SetSizeHints( this ); + topsizer->Fit( this ); + wxSize size( GetSize() ); + if (size.x < size.y*3/2) + { + size.x = size.y*3/2; + SetSize( size ); + } + + Centre( wxBOTH | wxCENTER_FRAME); +} + +void wxGenericMessageDialog::OnYes(wxCommandEvent& WXUNUSED(event)) +{ + EndModal( wxID_YES ); +} + +void wxGenericMessageDialog::OnNo(wxCommandEvent& WXUNUSED(event)) +{ + EndModal( wxID_NO ); +} + +void wxGenericMessageDialog::OnCancel(wxCommandEvent& WXUNUSED(event)) +{ + // Allow cancellation via ESC/Close button except if + // only YES and NO are specified. + const long style = GetMessageDialogStyle(); + if ( (style & wxYES_NO) != wxYES_NO || (style & wxCANCEL) ) + { + EndModal( wxID_CANCEL ); + } +} + +#endif // wxUSE_MSGDLG && !defined(__WXGTK20__) diff --git a/Externals/wxWidgets/src/generic/notebook.cpp b/Externals/wxWidgets/src/generic/notebook.cpp new file mode 100644 index 0000000000..1fff13c229 --- /dev/null +++ b/Externals/wxWidgets/src/generic/notebook.cpp @@ -0,0 +1,762 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/generic/notebook.cpp +// Purpose: generic implementation of wxNotebook +// Author: Julian Smart +// Modified by: +// Created: 17/09/98 +// RCS-ID: $Id: notebook.cpp 41766 2006-10-08 23:53:34Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_NOTEBOOK + +#include "wx/notebook.h" + +#ifndef WX_PRECOMP + #include "wx/string.h" + #include "wx/log.h" + #include "wx/dcclient.h" + #include "wx/settings.h" +#endif + +#include "wx/imaglist.h" +#include "wx/generic/tabg.h" + +// ---------------------------------------------------------------------------- +// macros +// ---------------------------------------------------------------------------- + +// check that the page index is valid +#define IS_VALID_PAGE(nPage) ((nPage) < GetPageCount()) + +// ---------------------------------------------------------------------------- +// event table +// ---------------------------------------------------------------------------- + +DEFINE_EVENT_TYPE(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING) + +BEGIN_EVENT_TABLE(wxNotebook, wxControl) + EVT_NOTEBOOK_PAGE_CHANGED(wxID_ANY, wxNotebook::OnSelChange) + EVT_SIZE(wxNotebook::OnSize) + EVT_PAINT(wxNotebook::OnPaint) + EVT_MOUSE_EVENTS(wxNotebook::OnMouseEvent) + EVT_SET_FOCUS(wxNotebook::OnSetFocus) + EVT_NAVIGATION_KEY(wxNotebook::OnNavigationKey) +END_EVENT_TABLE() + +IMPLEMENT_DYNAMIC_CLASS(wxNotebook, wxControl) +IMPLEMENT_DYNAMIC_CLASS(wxNotebookEvent, wxCommandEvent) + +// ============================================================================ +// implementation +// ============================================================================ + +// ============================================================================ +// Private class +// ============================================================================ + +WX_DECLARE_HASH_MAP(int, wxNotebookPage*, wxIntegerHash, wxIntegerEqual, + wxIntToNotebookPageHashMap); + +WX_DECLARE_HASH_MAP(wxNotebookPage*, int, wxPointerHash, wxPointerEqual, + wxNotebookPageToIntHashMap); + +// This reuses wxTabView to draw the tabs. +class WXDLLEXPORT wxNotebookTabView: public wxTabView +{ +DECLARE_DYNAMIC_CLASS(wxNotebookTabView) +public: + wxNotebookTabView(wxNotebook* notebook, long style = wxTAB_STYLE_DRAW_BOX | wxTAB_STYLE_COLOUR_INTERIOR); + virtual ~wxNotebookTabView(void); + + // Called when a tab is activated + virtual void OnTabActivate(int activateId, int deactivateId); + // Allows vetoing + virtual bool OnTabPreActivate(int activateId, int deactivateId); + + // map integer ids used by wxTabView to wxNotebookPage pointers + int GetId(wxNotebookPage *page); + wxNotebookPage *GetPage(int id) { return m_idToPage[id]; } + +protected: + wxNotebook* m_notebook; + +private: + wxIntToNotebookPageHashMap m_idToPage; + wxNotebookPageToIntHashMap m_pageToId; + int m_nextid; +}; + +static int GetPageId(wxTabView *tabview, wxNotebookPage *page) +{ + return wx_static_cast(wxNotebookTabView*, tabview)->GetId(page); +} + +// ---------------------------------------------------------------------------- +// wxNotebook construction +// ---------------------------------------------------------------------------- + +// common part of all ctors +void wxNotebook::Init() +{ + m_tabView = (wxNotebookTabView*) NULL; + m_nSelection = -1; +} + +// default for dynamic class +wxNotebook::wxNotebook() +{ + Init(); +} + +// the same arguments as for wxControl +wxNotebook::wxNotebook(wxWindow *parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + long style, + const wxString& name) +{ + Init(); + + Create(parent, id, pos, size, style, name); +} + +// Create() function +bool wxNotebook::Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + long style, + const wxString& name) +{ + // base init + SetName(name); + + if ( (style & wxBK_ALIGN_MASK) == wxBK_DEFAULT ) + style |= wxBK_TOP; + + m_windowId = id == wxID_ANY ? NewControlId() : id; + + if (!wxControl::Create(parent, id, pos, size, style|wxNO_BORDER, wxDefaultValidator, name)) + return false; + + SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE)); + + SetTabView(new wxNotebookTabView(this)); + + return true; +} + +// dtor +wxNotebook::~wxNotebook() +{ + delete m_tabView; +} + +// ---------------------------------------------------------------------------- +// wxNotebook accessors +// ---------------------------------------------------------------------------- +int wxNotebook::GetRowCount() const +{ + // TODO + return 0; +} + +int wxNotebook::SetSelection(size_t nPage) +{ + wxASSERT( IS_VALID_PAGE(nPage) ); + + wxNotebookPage* pPage = GetPage(nPage); + + m_tabView->SetTabSelection(GetPageId(m_tabView, pPage)); + + // TODO + return 0; +} + +int wxNotebook::ChangeSelection(size_t nPage) +{ + // FIXME: currently it does generate events too + return SetSelection(nPage); +} + +#if 0 +void wxNotebook::AdvanceSelection(bool bForward) +{ + int nSel = GetSelection(); + int nMax = GetPageCount() - 1; + if ( bForward ) + SetSelection(nSel == nMax ? 0 : nSel + 1); + else + SetSelection(nSel == 0 ? nMax : nSel - 1); +} +#endif + +bool wxNotebook::SetPageText(size_t nPage, const wxString& strText) +{ + wxASSERT( IS_VALID_PAGE(nPage) ); + + wxNotebookPage* page = GetPage(nPage); + if (page) + { + m_tabView->SetTabText(GetPageId(m_tabView, page), strText); + Refresh(); + return true; + } + + return false; +} + +wxString wxNotebook::GetPageText(size_t nPage) const +{ + wxASSERT( IS_VALID_PAGE(nPage) ); + + wxNotebookPage* page = ((wxNotebook*)this)->GetPage(nPage); + if (page) + return m_tabView->GetTabText(GetPageId(m_tabView, page)); + else + return wxEmptyString; +} + +int wxNotebook::GetPageImage(size_t WXUNUSED_UNLESS_DEBUG(nPage)) const +{ + wxASSERT( IS_VALID_PAGE(nPage) ); + + // TODO + return 0; +} + +bool wxNotebook::SetPageImage(size_t WXUNUSED_UNLESS_DEBUG(nPage), + int WXUNUSED(nImage)) +{ + wxASSERT( IS_VALID_PAGE(nPage) ); + + // TODO + return false; +} + +// set the size (the same for all pages) +void wxNotebook::SetPageSize(const wxSize& WXUNUSED(size)) +{ + // TODO +} + +// set the padding between tabs (in pixels) +void wxNotebook::SetPadding(const wxSize& WXUNUSED(padding)) +{ + // TODO +} + +// set the size of the tabs for wxNB_FIXEDWIDTH controls +void wxNotebook::SetTabSize(const wxSize& WXUNUSED(sz)) +{ + // TODO +} + +// ---------------------------------------------------------------------------- +// wxNotebook operations +// ---------------------------------------------------------------------------- + +// remove one page from the notebook and delete it +bool wxNotebook::DeletePage(size_t nPage) +{ + wxCHECK( IS_VALID_PAGE(nPage), false ); + + if (m_nSelection != -1) + { + m_pages[m_nSelection]->Show(false); + m_pages[m_nSelection]->Lower(); + } + + wxNotebookPage* pPage = GetPage(nPage); + + m_tabView->RemoveTab(GetPageId(m_tabView, pPage)); + + m_pages.Remove(pPage); + delete pPage; + + if (m_pages.GetCount() == 0) + { + m_nSelection = -1; + m_tabView->SetTabSelection(-1, false); + } + else if (m_nSelection > -1) + { + m_nSelection = -1; + + m_tabView->SetTabSelection(GetPageId(m_tabView, GetPage(0)), false); + + if (m_nSelection != 0) + ChangePage(-1, 0); + } + + RefreshLayout(false); + + return true; +} + +bool wxNotebook::DeletePage(wxNotebookPage* page) +{ + int pagePos = FindPagePosition(page); + if (pagePos > -1) + return DeletePage(pagePos); + else + return false; +} + +bool wxNotebook::RemovePage(size_t nPage) +{ + return DoRemovePage(nPage) != NULL; +} + +// remove one page from the notebook +wxWindow* wxNotebook::DoRemovePage(size_t nPage) +{ + wxCHECK( IS_VALID_PAGE(nPage), NULL ); + + m_pages[nPage]->Show(false); + // m_pages[nPage]->Lower(); + + wxNotebookPage* pPage = GetPage(nPage); + + m_tabView->RemoveTab(GetPageId(m_tabView, pPage)); + + m_pages.Remove(pPage); + + if (m_pages.GetCount() == 0) + { + m_nSelection = -1; + m_tabView->SetTabSelection(-1, true); + } + else if (m_nSelection > -1) + { + // Only change the selection if the page we + // deleted was the selection. + if (nPage == (size_t)m_nSelection) + { + m_nSelection = -1; + // Select the first tab. Generates a ChangePage. + m_tabView->SetTabSelection(0, true); + } + else + { + // We must adjust which tab we think is selected. + // If greater than the page we deleted, it must be moved down + // a notch. + if (size_t(m_nSelection) > nPage) + m_nSelection -- ; + } + } + + RefreshLayout(false); + + return pPage; +} + +bool wxNotebook::RemovePage(wxNotebookPage* page) +{ + int pagePos = FindPagePosition(page); + if (pagePos > -1) + return RemovePage(pagePos); + else + return false; +} + +// Find the position of the wxNotebookPage, -1 if not found. +int wxNotebook::FindPagePosition(wxNotebookPage* page) const +{ + size_t nPageCount = GetPageCount(); + size_t nPage; + for ( nPage = 0; nPage < nPageCount; nPage++ ) + if (m_pages[nPage] == page) + return nPage; + return -1; +} + +// remove all pages +bool wxNotebook::DeleteAllPages() +{ + m_tabView->ClearTabs(true); + + size_t nPageCount = GetPageCount(); + size_t nPage; + for ( nPage = 0; nPage < nPageCount; nPage++ ) + delete m_pages[nPage]; + + m_pages.Clear(); + + return true; +} + +// same as AddPage() but does it at given position +bool wxNotebook::InsertPage(size_t nPage, + wxNotebookPage *pPage, + const wxString& strText, + bool bSelect, + int WXUNUSED(imageId)) +{ + wxASSERT( pPage != NULL ); + wxCHECK( IS_VALID_PAGE(nPage) || nPage == GetPageCount(), false ); + + m_tabView->AddTab(GetPageId(m_tabView, pPage), strText); + + if (!bSelect) + pPage->Show(false); + + // save the pointer to the page + m_pages.Insert(pPage, nPage); + + if (bSelect) + { + // This will cause ChangePage to be called, via OnSelPage + + m_tabView->SetTabSelection(GetPageId(m_tabView, pPage), true); + } + + // some page must be selected: either this one or the first one if there is + // still no selection + if ( m_nSelection == -1 ) + ChangePage(-1, 0); + + RefreshLayout(false); + + return true; +} + +// ---------------------------------------------------------------------------- +// wxNotebook callbacks +// ---------------------------------------------------------------------------- + +// @@@ OnSize() is used for setting the font when it's called for the first +// time because doing it in ::Create() doesn't work (for unknown reasons) +void wxNotebook::OnSize(wxSizeEvent& event) +{ + static bool s_bFirstTime = true; + if ( s_bFirstTime ) { + // TODO: any first-time-size processing. + s_bFirstTime = false; + } + + RefreshLayout(); + + // Processing continues to next OnSize + event.Skip(); +} + +// This was supposed to cure the non-display of the notebook +// until the user resizes the window. +// What's going on? +void wxNotebook::OnInternalIdle() +{ + wxWindow::OnInternalIdle(); + +#if 0 + static bool s_bFirstTime = true; + if ( s_bFirstTime ) { + /* + wxSize sz(GetSize()); + sz.x ++; + SetSize(sz); + sz.x --; + SetSize(sz); + */ + + /* + wxSize sz(GetSize()); + wxSizeEvent sizeEvent(sz, GetId()); + sizeEvent.SetEventObject(this); + GetEventHandler()->ProcessEvent(sizeEvent); + Refresh(); + */ + s_bFirstTime = false; + } +#endif +} + +// Implementation: calculate the layout of the view rect +// and resize the children if required +bool wxNotebook::RefreshLayout(bool force) +{ + if (m_tabView) + { + wxRect oldRect = m_tabView->GetViewRect(); + + int cw, ch; + GetClientSize(& cw, & ch); + + int tabHeight = m_tabView->GetTotalTabHeight(); + wxRect rect; + rect.x = 4; + rect.y = tabHeight + 4; + rect.width = cw - 8; + rect.height = ch - 4 - rect.y ; + + m_tabView->SetViewRect(rect); + + m_tabView->LayoutTabs(); + + // Need to do it a 2nd time to get the tab height with + // the new view width, since changing the view width changes the + // tab layout. + tabHeight = m_tabView->GetTotalTabHeight(); + rect.x = 4; + rect.y = tabHeight + 4; + rect.width = cw - 8; + rect.height = ch - 4 - rect.y ; + + m_tabView->SetViewRect(rect); + + m_tabView->LayoutTabs(); + + if (!force && (rect == oldRect)) + return false; + + // fit the notebook page to the tab control's display area + + size_t nCount = m_pages.Count(); + for ( size_t nPage = 0; nPage < nCount; nPage++ ) { + wxNotebookPage *pPage = m_pages[nPage]; + wxRect clientRect = GetAvailableClientSize(); + if (pPage->IsShown()) + { + pPage->SetSize(clientRect.x, clientRect.y, clientRect.width, clientRect.height); + if ( pPage->GetAutoLayout() ) + pPage->Layout(); + } + } + Refresh(); + } + return true; +} + +void wxNotebook::OnSelChange(wxNotebookEvent& event) +{ + // is it our tab control? + if ( event.GetEventObject() == this ) + { + if (event.GetSelection() != m_nSelection) + ChangePage(event.GetOldSelection(), event.GetSelection()); + } + + // we want to give others a chance to process this message as well + event.Skip(); +} + +void wxNotebook::OnSetFocus(wxFocusEvent& event) +{ + // set focus to the currently selected page if any + if ( m_nSelection != -1 ) + m_pages[m_nSelection]->SetFocus(); + + event.Skip(); +} + +void wxNotebook::OnNavigationKey(wxNavigationKeyEvent& event) +{ + if ( event.IsWindowChange() ) { + // change pages + AdvanceSelection(event.GetDirection()); + } + else { + // pass to the parent + if ( GetParent() ) { + event.SetCurrentFocus(this); + GetParent()->ProcessEvent(event); + } + } +} + +// ---------------------------------------------------------------------------- +// wxNotebook base class virtuals +// ---------------------------------------------------------------------------- + +// override these 2 functions to do nothing: everything is done in OnSize + +void wxNotebook::SetConstraintSizes(bool /* recurse */) +{ + // don't set the sizes of the pages - their correct size is not yet known + wxControl::SetConstraintSizes(false); +} + +bool wxNotebook::DoPhase(int /* nPhase */) +{ + return true; +} + +void wxNotebook::Command(wxCommandEvent& WXUNUSED(event)) +{ + wxFAIL_MSG(wxT("wxNotebook::Command not implemented")); +} + +// ---------------------------------------------------------------------------- +// wxNotebook helper functions +// ---------------------------------------------------------------------------- + +// hide the currently active panel and show the new one +void wxNotebook::ChangePage(int nOldSel, int nSel) +{ + // cout << "ChangePage: " << nOldSel << ", " << nSel << "\n"; + wxASSERT( nOldSel != nSel ); // impossible + + if ( nOldSel != -1 ) { + m_pages[nOldSel]->Show(false); + m_pages[nOldSel]->Lower(); + } + + wxNotebookPage *pPage = m_pages[nSel]; + + wxRect clientRect = GetAvailableClientSize(); + pPage->SetSize(clientRect.x, clientRect.y, clientRect.width, clientRect.height); + + Refresh(); + + pPage->Show(true); + pPage->Raise(); + pPage->SetFocus(); + + m_nSelection = nSel; +} + +void wxNotebook::OnMouseEvent(wxMouseEvent& event) +{ + if (m_tabView) + m_tabView->OnEvent(event); +} + +void wxNotebook::OnPaint(wxPaintEvent& WXUNUSED(event) ) +{ + wxPaintDC dc(this); + if (m_tabView) + m_tabView->Draw(dc); +} + +wxSize wxNotebook::CalcSizeFromPage(const wxSize& sizePage) const +{ + // MBN: since the total tab height is really a function of the + // width, this should really call + // GetTotalTabHeightPretendingWidthIs(), but the current + // implementation will suffice, provided the wxNotebook has been + // created with a sensible initial width. + return wxSize( sizePage.x + 12, + sizePage.y + m_tabView->GetTotalTabHeight() + 6 + 4 ); +} + +wxRect wxNotebook::GetAvailableClientSize() +{ + int cw, ch; + GetClientSize(& cw, & ch); + + int tabHeight = m_tabView->GetTotalTabHeight(); + + // TODO: these margins should be configurable. + wxRect rect; + rect.x = 6; + rect.y = tabHeight + 6; + rect.width = cw - 12; + rect.height = ch - 4 - rect.y ; + + return rect; +} + +/* + * wxNotebookTabView + */ + +IMPLEMENT_CLASS(wxNotebookTabView, wxTabView) + +wxNotebookTabView::wxNotebookTabView(wxNotebook *notebook, long style) + : wxTabView(style), m_nextid(1) +{ + m_notebook = notebook; + + m_notebook->SetTabView(this); + + SetWindow(m_notebook); +} + +wxNotebookTabView::~wxNotebookTabView(void) +{ +} + +int wxNotebookTabView::GetId(wxNotebookPage *page) +{ + int& id = m_pageToId[page]; + + if (!id) + { + id = m_nextid++; + m_idToPage[id] = page; + } + + return id; +} + +// Called when a tab is activated +void wxNotebookTabView::OnTabActivate(int activateId, int deactivateId) +{ + if (!m_notebook) + return; + + wxNotebookEvent event(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED, m_notebook->GetId()); + + // Translate from wxTabView's ids (which aren't position-dependent) + // to wxNotebook's (which are). + wxNotebookPage* pActive = GetPage(activateId); + wxNotebookPage* pDeactive = GetPage(deactivateId); + + int activatePos = m_notebook->FindPagePosition(pActive); + int deactivatePos = m_notebook->FindPagePosition(pDeactive); + + event.SetEventObject(m_notebook); + event.SetSelection(activatePos); + event.SetOldSelection(deactivatePos); + m_notebook->GetEventHandler()->ProcessEvent(event); +} + +// Allows Vetoing +bool wxNotebookTabView::OnTabPreActivate(int activateId, int deactivateId) +{ + bool retval = true; + + if (m_notebook) + { + wxNotebookEvent event(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING, m_notebook->GetId()); + + // Translate from wxTabView's ids (which aren't position-dependent) + // to wxNotebook's (which are). + wxNotebookPage* pActive = GetPage(activateId); + wxNotebookPage* pDeactive = GetPage(deactivateId); + + int activatePos = m_notebook->FindPagePosition(pActive); + int deactivatePos = m_notebook->FindPagePosition(pDeactive); + + event.SetEventObject(m_notebook); + event.SetSelection(activatePos); + event.SetOldSelection(deactivatePos); + if (m_notebook->GetEventHandler()->ProcessEvent(event)) + { + retval = event.IsAllowed(); + } + } + return retval; +} + +#endif // wxUSE_NOTEBOOK diff --git a/Externals/wxWidgets/src/generic/numdlgg.cpp b/Externals/wxWidgets/src/generic/numdlgg.cpp new file mode 100644 index 0000000000..0317bc0e69 --- /dev/null +++ b/Externals/wxWidgets/src/generic/numdlgg.cpp @@ -0,0 +1,184 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/generic/numdlgg.cpp +// Purpose: wxGetNumberFromUser implementation +// Author: Vadim Zeitlin +// Modified by: +// Created: 23.07.99 +// RCS-ID: $Id: numdlgg.cpp 41838 2006-10-09 21:08:45Z VZ $ +// Copyright: (c) Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_NUMBERDLG + +#ifndef WX_PRECOMP + #include + + #include "wx/utils.h" + #include "wx/dialog.h" + #include "wx/button.h" + #include "wx/stattext.h" + #include "wx/textctrl.h" + #include "wx/intl.h" + #include "wx/sizer.h" +#endif + +#if wxUSE_STATLINE + #include "wx/statline.h" +#endif + +#if wxUSE_SPINCTRL +#include "wx/spinctrl.h" +#endif + +// this is where wxGetNumberFromUser() is declared +#include "wx/numdlg.h" + +#if !wxUSE_SPINCTRL + // wxTextCtrl will do instead of wxSpinCtrl if we don't have it + #define wxSpinCtrl wxTextCtrl +#endif + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxNumberEntryDialog +// ---------------------------------------------------------------------------- + +BEGIN_EVENT_TABLE(wxNumberEntryDialog, wxDialog) + EVT_BUTTON(wxID_OK, wxNumberEntryDialog::OnOK) + EVT_BUTTON(wxID_CANCEL, wxNumberEntryDialog::OnCancel) +END_EVENT_TABLE() + +IMPLEMENT_CLASS(wxNumberEntryDialog, wxDialog) + +wxNumberEntryDialog::wxNumberEntryDialog(wxWindow *parent, + const wxString& message, + const wxString& prompt, + const wxString& caption, + long value, + long min, + long max, + const wxPoint& pos) + : wxDialog(parent, wxID_ANY, caption, + pos, wxDefaultSize) +{ + m_value = value; + m_max = max; + m_min = min; + + wxBeginBusyCursor(); + + wxBoxSizer *topsizer = new wxBoxSizer( wxVERTICAL ); +#if wxUSE_STATTEXT + // 1) text message + topsizer->Add( CreateTextSizer( message ), 0, wxALL, 10 ); +#endif + + // 2) prompt and text ctrl + wxBoxSizer *inputsizer = new wxBoxSizer( wxHORIZONTAL ); + +#if wxUSE_STATTEXT + // prompt if any + if (!prompt.empty()) + inputsizer->Add( new wxStaticText( this, wxID_ANY, prompt ), 0, wxCENTER | wxLEFT, 10 ); +#endif + + // spin ctrl + wxString valStr; + valStr.Printf(wxT("%ld"), m_value); + m_spinctrl = new wxSpinCtrl(this, wxID_ANY, valStr, wxDefaultPosition, wxSize( 140, wxDefaultCoord ) ); +#if wxUSE_SPINCTRL + m_spinctrl->SetRange((int)m_min, (int)m_max); +#endif + inputsizer->Add( m_spinctrl, 1, wxCENTER | wxLEFT | wxRIGHT, 10 ); + // add both + topsizer->Add( inputsizer, 0, wxEXPAND | wxLEFT|wxRIGHT, 5 ); + + // 3) buttons if any + wxSizer *buttonSizer = CreateSeparatedButtonSizer(wxOK | wxCANCEL); + if ( buttonSizer ) + { + topsizer->Add(buttonSizer, wxSizerFlags().Expand().DoubleBorder()); + } + + SetSizer( topsizer ); + SetAutoLayout( true ); + + topsizer->SetSizeHints( this ); + topsizer->Fit( this ); + + Centre( wxBOTH ); + + m_spinctrl->SetSelection(-1, -1); + m_spinctrl->SetFocus(); + + wxEndBusyCursor(); +} + +void wxNumberEntryDialog::OnOK(wxCommandEvent& WXUNUSED(event)) +{ +#if !wxUSE_SPINCTRL + wxString tmp = m_spinctrl->GetValue(); + if ( wxSscanf(tmp, _T("%ld"), &m_value) != 1 ) + EndModal(wxID_CANCEL); + else +#else + m_value = m_spinctrl->GetValue(); +#endif + if ( m_value < m_min || m_value > m_max ) + { + // not a number or out of range + m_value = -1; + EndModal(wxID_CANCEL); + } + + EndModal(wxID_OK); +} + +void wxNumberEntryDialog::OnCancel(wxCommandEvent& WXUNUSED(event)) +{ + EndModal(wxID_CANCEL); +} + +// ---------------------------------------------------------------------------- +// global functions +// ---------------------------------------------------------------------------- + +// wxGetTextFromUser is in utilscmn.cpp + +long wxGetNumberFromUser(const wxString& msg, + const wxString& prompt, + const wxString& title, + long value, + long min, + long max, + wxWindow *parent, + const wxPoint& pos) +{ + wxNumberEntryDialog dialog(parent, msg, prompt, title, + value, min, max, pos); + if (dialog.ShowModal() == wxID_OK) + return dialog.GetValue(); + + return -1; +} + +#endif // wxUSE_NUMBERDLG diff --git a/Externals/wxWidgets/src/generic/odcombo.cpp b/Externals/wxWidgets/src/generic/odcombo.cpp new file mode 100644 index 0000000000..aaec5a2fe1 --- /dev/null +++ b/Externals/wxWidgets/src/generic/odcombo.cpp @@ -0,0 +1,1094 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/generic/odcombo.cpp +// Purpose: wxOwnerDrawnComboBox, wxVListBoxComboPopup +// Author: Jaakko Salli +// Modified by: +// Created: Apr-30-2006 +// RCS-ID: $Id: odcombo.cpp 46186 2007-05-24 00:03:26Z VZ $ +// Copyright: (c) 2005 Jaakko Salli +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_ODCOMBOBOX + +#include "wx/odcombo.h" + +#ifndef WX_PRECOMP + #include "wx/log.h" + #include "wx/combobox.h" + #include "wx/dcclient.h" + #include "wx/settings.h" + #include "wx/dialog.h" +#endif + +#include "wx/combo.h" + +// ============================================================================ +// implementation +// ============================================================================ + +// time in milliseconds before partial completion buffer drops +#define wxODCB_PARTIAL_COMPLETION_TIME 1000 + +// ---------------------------------------------------------------------------- +// wxVListBoxComboPopup is a wxVListBox customized to act as a popup control +// +// ---------------------------------------------------------------------------- + + +BEGIN_EVENT_TABLE(wxVListBoxComboPopup, wxVListBox) + EVT_MOTION(wxVListBoxComboPopup::OnMouseMove) + EVT_KEY_DOWN(wxVListBoxComboPopup::OnKey) + EVT_LEFT_UP(wxVListBoxComboPopup::OnLeftClick) +END_EVENT_TABLE() + + +void wxVListBoxComboPopup::Init() +{ + m_widestWidth = 0; + m_widestItem = -1; + m_widthsDirty = false; + m_findWidest = false; + m_itemHeight = 0; + m_value = -1; + m_itemHover = -1; + m_clientDataItemsType = wxClientData_None; + m_partialCompletionString = wxEmptyString; +} + +bool wxVListBoxComboPopup::Create(wxWindow* parent) +{ + if ( !wxVListBox::Create(parent, + wxID_ANY, + wxDefaultPosition, + wxDefaultSize, + wxBORDER_SIMPLE | wxLB_INT_HEIGHT | wxWANTS_CHARS) ) + return false; + + m_useFont = m_combo->GetFont(); + + wxVListBox::SetItemCount(m_strings.GetCount()); + + // TODO: Move this to SetFont + m_itemHeight = GetCharHeight() + 0; + + return true; +} + +wxVListBoxComboPopup::~wxVListBoxComboPopup() +{ + Clear(); +} + +bool wxVListBoxComboPopup::LazyCreate() +{ + // NB: There is a bug with wxVListBox that can be avoided by creating + // it later (bug causes empty space to be shown if initial selection + // is at the end of a list longer than the control can show at once). + return true; +} + +// paint the control itself +void wxVListBoxComboPopup::PaintComboControl( wxDC& dc, const wxRect& rect ) +{ + if ( !(m_combo->GetWindowStyle() & wxODCB_STD_CONTROL_PAINT) ) + { + int flags = wxODCB_PAINTING_CONTROL; + + if ( m_combo->ShouldDrawFocus() ) + flags |= wxODCB_PAINTING_SELECTED; + + OnDrawBg(dc, rect, m_value, flags); + + if ( m_value >= 0 ) + { + OnDrawItem(dc,rect,m_value,flags); + return; + } + } + + wxComboPopup::PaintComboControl(dc,rect); +} + +void wxVListBoxComboPopup::OnDrawItem(wxDC& dc, const wxRect& rect, size_t n) const +{ + // TODO: Maybe this code could be moved to wxVListBox::OnPaint? + dc.SetFont(m_useFont); + + int flags = 0; + + // Set correct text colour for selected items + if ( wxVListBox::GetSelection() == (int) n ) + { + dc.SetTextForeground( wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT) ); + flags |= wxODCB_PAINTING_SELECTED; + } + else + { + dc.SetTextForeground( wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT) ); + } + + OnDrawItem(dc,rect,(int)n,flags); +} + +wxCoord wxVListBoxComboPopup::OnMeasureItem(size_t n) const +{ + wxOwnerDrawnComboBox* combo = (wxOwnerDrawnComboBox*) m_combo; + + wxASSERT_MSG( combo->IsKindOf(CLASSINFO(wxOwnerDrawnComboBox)), + wxT("you must subclass wxVListBoxComboPopup for drawing and measuring methods") ); + + wxCoord h = combo->OnMeasureItem(n); + if ( h < 0 ) + h = m_itemHeight; + return h; +} + +wxCoord wxVListBoxComboPopup::OnMeasureItemWidth(size_t n) const +{ + wxOwnerDrawnComboBox* combo = (wxOwnerDrawnComboBox*) m_combo; + + wxASSERT_MSG( combo->IsKindOf(CLASSINFO(wxOwnerDrawnComboBox)), + wxT("you must subclass wxVListBoxComboPopup for drawing and measuring methods") ); + + return combo->OnMeasureItemWidth(n); +} + +void wxVListBoxComboPopup::OnDrawBg( wxDC& dc, + const wxRect& rect, + int item, + int flags ) const +{ + wxOwnerDrawnComboBox* combo = (wxOwnerDrawnComboBox*) m_combo; + + wxASSERT_MSG( combo->IsKindOf(CLASSINFO(wxOwnerDrawnComboBox)), + wxT("you must subclass wxVListBoxComboPopup for drawing and measuring methods") ); + + if ( IsCurrent((size_t)item) && !(flags & wxODCB_PAINTING_CONTROL) ) + flags |= wxODCB_PAINTING_SELECTED; + + combo->OnDrawBackground(dc,rect,item,flags); +} + +void wxVListBoxComboPopup::OnDrawBackground(wxDC& dc, const wxRect& rect, size_t n) const +{ + OnDrawBg(dc,rect,(int)n,0); +} + +// This is called from wxVListBoxComboPopup::OnDrawItem, with text colour and font prepared +void wxVListBoxComboPopup::OnDrawItem( wxDC& dc, const wxRect& rect, int item, int flags ) const +{ + wxOwnerDrawnComboBox* combo = (wxOwnerDrawnComboBox*) m_combo; + + wxASSERT_MSG( combo->IsKindOf(CLASSINFO(wxOwnerDrawnComboBox)), + wxT("you must subclass wxVListBoxComboPopup for drawing and measuring methods") ); + + combo->OnDrawItem(dc,rect,item,flags); +} + +void wxVListBoxComboPopup::DismissWithEvent() +{ + StopPartialCompletion(); + + int selection = wxVListBox::GetSelection(); + + Dismiss(); + + wxString valStr; + if ( selection != wxNOT_FOUND ) + valStr = m_strings[selection]; + else + valStr = wxEmptyString; + + m_value = selection; + + if ( valStr != m_combo->GetValue() ) + m_combo->SetValueWithEvent(valStr); + + SendComboBoxEvent(selection); +} + +void wxVListBoxComboPopup::SendComboBoxEvent( int selection ) +{ + wxCommandEvent evt(wxEVT_COMMAND_COMBOBOX_SELECTED,m_combo->GetId()); + + evt.SetEventObject(m_combo); + + evt.SetInt(selection); + + // Set client data, if any + if ( selection >= 0 && (int)m_clientDatas.GetCount() > selection ) + { + void* clientData = m_clientDatas[selection]; + if ( m_clientDataItemsType == wxClientData_Object ) + evt.SetClientObject((wxClientData*)clientData); + else + evt.SetClientData(clientData); + } + + m_combo->GetEventHandler()->AddPendingEvent(evt); +} + +// returns true if key was consumed +bool wxVListBoxComboPopup::HandleKey( int keycode, bool saturate, wxChar unicode ) +{ + int value = m_value; + int itemCount = GetCount(); + int comboStyle = m_combo->GetWindowStyle(); + + // this is the character equivalent of the code + wxChar keychar=0; + if ((keycode >= WXK_SPACE) && (keycode <=255) && (keycode != WXK_DELETE) && wxIsprint(keycode)) + { + keychar = (wxChar)keycode; + } + else if (unicode>0) + { + keychar = unicode; + } + + if ( keycode == WXK_DOWN || keycode == WXK_RIGHT ) + { + value++; + StopPartialCompletion(); + } + else if ( keycode == WXK_UP || keycode == WXK_LEFT ) + { + value--; + StopPartialCompletion(); + } + else if ( keycode == WXK_PAGEDOWN ) + { + value+=10; + StopPartialCompletion(); + } + else if ( keycode == WXK_PAGEUP ) + { + value-=10; + StopPartialCompletion(); + } + else if ( comboStyle & wxCB_READONLY ) + { + // Try partial completion + + // find the new partial completion string +#if wxUSE_TIMER + if (m_partialCompletionTimer.IsRunning()) + m_partialCompletionString+=wxString(keychar); + else +#endif // wxUSE_TIMER + m_partialCompletionString=wxString(keychar); + + // now search through the values to see if this is found + int found = -1; + unsigned int length=m_partialCompletionString.length(); + int i; + for (i=0; i= length) && (! m_partialCompletionString.CmpNoCase(item.Left(length)))) + { + found=i; + break; + } + } + + if (found<0) + { + StopPartialCompletion(); + ::wxBell(); + return true; // to stop the first value being set + } + else + { + value=i; +#if wxUSE_TIMER + m_partialCompletionTimer.Start(wxODCB_PARTIAL_COMPLETION_TIME, true); +#endif // wxUSE_TIMER + } + } + else + return false; + + if ( saturate ) + { + if ( value >= itemCount ) + value = itemCount - 1; + else if ( value < 0 ) + value = 0; + } + else + { + if ( value >= itemCount ) + value -= itemCount; + else if ( value < 0 ) + value += itemCount; + } + + if ( value == m_value ) + // Even if value was same, don't skip the event + // (good for consistency) + return true; + + m_value = value; + + if ( value >= 0 ) + m_combo->SetValue(m_strings[value]); + + SendComboBoxEvent(m_value); + + return true; +} + +// stop partial completion +void wxVListBoxComboPopup::StopPartialCompletion() +{ + m_partialCompletionString = wxEmptyString; +#if wxUSE_TIMER + m_partialCompletionTimer.Stop(); +#endif // wxUSE_TIMER +} + +void wxVListBoxComboPopup::OnComboDoubleClick() +{ + // Cycle on dclick (disable saturation to allow true cycling). + if ( !::wxGetKeyState(WXK_SHIFT) ) + HandleKey(WXK_DOWN,false); + else + HandleKey(WXK_UP,false); +} + +void wxVListBoxComboPopup::OnComboKeyEvent( wxKeyEvent& event ) +{ + // Saturated key movement on + if ( !HandleKey(event.GetKeyCode(),true, +#if wxUSE_UNICODE + event.GetUnicodeKey() +#else + 0 +#endif + ) ) + event.Skip(); +} + +void wxVListBoxComboPopup::OnPopup() +{ + // *must* set value after size is set (this is because of a vlbox bug) + wxVListBox::SetSelection(m_value); +} + +void wxVListBoxComboPopup::OnMouseMove(wxMouseEvent& event) +{ + event.Skip(); + + // Move selection to cursor if it is inside the popup + + int y = event.GetPosition().y; + int fromBottom = GetClientSize().y - y; + + // Since in any case we need to find out if the last item is only + // partially visible, we might just as well replicate the HitTest + // loop here. + const size_t lineMax = GetVisibleEnd(); + for ( size_t line = GetVisibleBegin(); line < lineMax; line++ ) + { + y -= OnGetLineHeight(line); + if ( y < 0 ) + { + // Only change selection if item is fully visible + if ( (y + fromBottom) >= 0 ) + { + wxVListBox::SetSelection((int)line); + return; + } + } + } +} + +void wxVListBoxComboPopup::OnLeftClick(wxMouseEvent& WXUNUSED(event)) +{ + DismissWithEvent(); +} + +void wxVListBoxComboPopup::OnKey(wxKeyEvent& event) +{ + // Hide popup if certain key or key combination was pressed + if ( m_combo->IsKeyPopupToggle(event) ) + { + StopPartialCompletion(); + Dismiss(); + } + else if ( event.AltDown() ) + { + // On both wxGTK and wxMSW, pressing Alt down seems to + // completely freeze things in popup (ie. arrow keys and + // enter won't work). + return; + } + // Select item if ENTER is pressed + else if ( event.GetKeyCode() == WXK_RETURN || event.GetKeyCode() == WXK_NUMPAD_ENTER ) + { + DismissWithEvent(); + } + else + { + int comboStyle = m_combo->GetWindowStyle(); + int keycode = event.GetKeyCode(); + // Process partial completion key codes here, but not the arrow keys as the base class will do that for us + if ((comboStyle & wxCB_READONLY) && + (keycode >= WXK_SPACE) && (keycode <=255) && (keycode != WXK_DELETE) && wxIsprint(keycode)) + { + OnComboKeyEvent(event); + SetSelection(m_value); // ensure the highlight bar moves + } + else + event.Skip(); + } +} + +void wxVListBoxComboPopup::Insert( const wxString& item, int pos ) +{ + // Need to change selection? + wxString strValue; + if ( !(m_combo->GetWindowStyle() & wxCB_READONLY) && + m_combo->GetValue() == item ) + { + m_value = pos; + } + + m_strings.Insert(item,pos); + m_widths.Insert(-1,pos); + m_widthsDirty = true; + + if ( IsCreated() ) + wxVListBox::SetItemCount( wxVListBox::GetItemCount()+1 ); +} + +int wxVListBoxComboPopup::Append(const wxString& item) +{ + int pos = (int)m_strings.GetCount(); + + if ( m_combo->GetWindowStyle() & wxCB_SORT ) + { + // Find position + // TODO: Could be optimized with binary search + wxArrayString strings = m_strings; + unsigned int i; + + for ( i=0; i n ) + return m_clientDatas[n]; + + return NULL; +} + +void wxVListBoxComboPopup::Delete( unsigned int item ) +{ + // Remove client data, if set + if ( m_clientDatas.GetCount() ) + { + if ( m_clientDataItemsType == wxClientData_Object ) + delete (wxClientData*) m_clientDatas[item]; + + m_clientDatas.RemoveAt(item); + } + + m_strings.RemoveAt(item); + m_widths.RemoveAt(item); + + if ( (int)item == m_widestItem ) + m_findWidest = true; + + int sel = GetSelection(); + + if ( IsCreated() ) + wxVListBox::SetItemCount( wxVListBox::GetItemCount()-1 ); + + // Fix selection + if ( (int)item < sel ) + SetSelection(sel-1); + else if ( (int)item == sel ) + SetSelection(wxNOT_FOUND); +} + +int wxVListBoxComboPopup::FindString(const wxString& s, bool bCase) const +{ + return m_strings.Index(s, bCase); +} + +unsigned int wxVListBoxComboPopup::GetCount() const +{ + return m_strings.GetCount(); +} + +wxString wxVListBoxComboPopup::GetString( int item ) const +{ + return m_strings[item]; +} + +void wxVListBoxComboPopup::SetString( int item, const wxString& str ) +{ + m_strings[item] = str; + ItemWidthChanged(item); +} + +wxString wxVListBoxComboPopup::GetStringValue() const +{ + if ( m_value >= 0 ) + return m_strings[m_value]; + return wxEmptyString; +} + +void wxVListBoxComboPopup::SetSelection( int item ) +{ + wxCHECK_RET( item == wxNOT_FOUND || ((unsigned int)item < GetCount()), + wxT("invalid index in wxVListBoxComboPopup::SetSelection") ); + + m_value = item; + + if ( IsCreated() ) + wxVListBox::SetSelection(item); +} + +int wxVListBoxComboPopup::GetSelection() const +{ + return m_value; +} + +void wxVListBoxComboPopup::SetStringValue( const wxString& value ) +{ + int index = m_strings.Index(value); + + m_value = index; + + if ( index >= -1 && index < (int)wxVListBox::GetItemCount() ) + wxVListBox::SetSelection(index); +} + +void wxVListBoxComboPopup::CalcWidths() +{ + bool doFindWidest = m_findWidest; + + // Measure items with dirty width. + if ( m_widthsDirty ) + { + unsigned int i; + unsigned int n = m_widths.GetCount(); + int dirtyHandled = 0; + wxArrayInt& widths = m_widths; + + // I think using wxDC::GetTextExtent is faster than + // wxWindow::GetTextExtent (assuming same dc is used + // for all calls, as we do here). + wxClientDC dc(m_combo); + dc.SetFont(m_useFont); + + for ( i=0; i= m_widestWidth ) + { + m_widestWidth = x; + m_widestItem = (int)i; + } + else if ( (int)i == m_widestItem ) + { + // Width of previously widest item has been decreased, so + // we'll have to check all to find current widest item. + doFindWidest = true; + } + + dirtyHandled++; + } + } + + m_widthsDirty = false; + } + + if ( doFindWidest ) + { + unsigned int i; + unsigned int n = m_widths.GetCount(); + + int bestWidth = -1; + int bestIndex = -1; + + for ( i=0; i bestWidth ) + { + bestIndex = (int)i; + bestWidth = w; + } + } + + m_widestWidth = bestWidth; + m_widestItem = bestIndex; + + m_findWidest = false; + } +} + +wxSize wxVListBoxComboPopup::GetAdjustedSize( int minWidth, int prefHeight, int maxHeight ) +{ + int height = 250; + + maxHeight -= 2; // Must take borders into account + + if ( m_strings.GetCount() ) + { + if ( prefHeight > 0 ) + height = prefHeight; + + if ( height > maxHeight ) + height = maxHeight; + + int totalHeight = GetTotalHeight(); // + 3; + if ( height >= totalHeight ) + { + height = totalHeight; + } + else + { + // Adjust height to a multiple of the height of the first item + // NB: Calculations that take variable height into account + // are unnecessary. + int fih = GetLineHeight(0); + height -= height % fih; + } + } + else + height = 50; + + CalcWidths(); + + // Take scrollbar into account in width calculations + int widestWidth = m_widestWidth + wxSystemSettings::GetMetric(wxSYS_VSCROLL_X); + return wxSize(minWidth > widestWidth ? minWidth : widestWidth, + height+2); +} + +//void wxVListBoxComboPopup::Populate( int n, const wxString choices[] ) +void wxVListBoxComboPopup::Populate( const wxArrayString& choices ) +{ + int i; + + int n = choices.GetCount(); + + for ( i=0; iGetWindowStyle() & wxCB_SORT ) + m_strings.Sort(); + + // Find initial selection + wxString strValue = m_combo->GetValue(); + if ( strValue.length() ) + m_value = m_strings.Index(strValue); +} + +// ---------------------------------------------------------------------------- +// wxOwnerDrawnComboBox +// ---------------------------------------------------------------------------- + + +BEGIN_EVENT_TABLE(wxOwnerDrawnComboBox, wxComboCtrl) +END_EVENT_TABLE() + + +IMPLEMENT_DYNAMIC_CLASS2(wxOwnerDrawnComboBox, wxComboCtrl, wxControlWithItems) + +void wxOwnerDrawnComboBox::Init() +{ +} + +bool wxOwnerDrawnComboBox::Create(wxWindow *parent, + wxWindowID id, + const wxString& value, + const wxPoint& pos, + const wxSize& size, + long style, + const wxValidator& validator, + const wxString& name) +{ + return wxComboCtrl::Create(parent,id,value,pos,size,style,validator,name); +} + +wxOwnerDrawnComboBox::wxOwnerDrawnComboBox(wxWindow *parent, + wxWindowID id, + const wxString& value, + const wxPoint& pos, + const wxSize& size, + const wxArrayString& choices, + long style, + const wxValidator& validator, + const wxString& name) + : wxComboCtrl() +{ + Init(); + + Create(parent,id,value,pos,size,choices,style, validator, name); +} + +bool wxOwnerDrawnComboBox::Create(wxWindow *parent, + wxWindowID id, + const wxString& value, + const wxPoint& pos, + const wxSize& size, + const wxArrayString& choices, + long style, + const wxValidator& validator, + const wxString& name) +{ + m_initChs = choices; + //wxCArrayString chs(choices); + + //return Create(parent, id, value, pos, size, chs.GetCount(), + // chs.GetStrings(), style, validator, name); + return Create(parent, id, value, pos, size, 0, + NULL, style, validator, name); +} + +bool wxOwnerDrawnComboBox::Create(wxWindow *parent, + wxWindowID id, + const wxString& value, + const wxPoint& pos, + const wxSize& size, + int n, + const wxString choices[], + long style, + const wxValidator& validator, + const wxString& name) +{ + + if ( !Create(parent, id, value, pos, size, style, + validator, name) ) + { + return false; + } + + int i; + for ( i=0; iClearClientDatas(); +} + +void wxOwnerDrawnComboBox::DoSetPopupControl(wxComboPopup* popup) +{ + if ( !popup ) + { + popup = new wxVListBoxComboPopup(); + } + + wxComboCtrl::DoSetPopupControl(popup); + + wxASSERT(popup); + + // Add initial choices to the wxVListBox + if ( !GetVListBoxComboPopup()->GetCount() ) + { + GetVListBoxComboPopup()->Populate(m_initChs); + m_initChs.Clear(); + } +} + +// ---------------------------------------------------------------------------- +// wxOwnerDrawnComboBox item manipulation methods +// ---------------------------------------------------------------------------- + +void wxOwnerDrawnComboBox::Clear() +{ + EnsurePopupControl(); + + GetVListBoxComboPopup()->Clear(); + + SetValue(wxEmptyString); +} + +void wxOwnerDrawnComboBox::Delete(unsigned int n) +{ + wxCHECK_RET( IsValid(n), _T("invalid index in wxOwnerDrawnComboBox::Delete") ); + + if ( GetSelection() == (int) n ) + SetValue(wxEmptyString); + + GetVListBoxComboPopup()->Delete(n); +} + +unsigned int wxOwnerDrawnComboBox::GetCount() const +{ + if ( !m_popupInterface ) + return m_initChs.GetCount(); + + return GetVListBoxComboPopup()->GetCount(); +} + +wxString wxOwnerDrawnComboBox::GetString(unsigned int n) const +{ + wxCHECK_MSG( IsValid(n), wxEmptyString, _T("invalid index in wxOwnerDrawnComboBox::GetString") ); + + if ( !m_popupInterface ) + return m_initChs.Item(n); + + return GetVListBoxComboPopup()->GetString(n); +} + +void wxOwnerDrawnComboBox::SetString(unsigned int n, const wxString& s) +{ + EnsurePopupControl(); + + wxCHECK_RET( IsValid(n), _T("invalid index in wxOwnerDrawnComboBox::SetString") ); + + GetVListBoxComboPopup()->SetString(n,s); +} + +int wxOwnerDrawnComboBox::FindString(const wxString& s, bool bCase) const +{ + if ( !m_popupInterface ) + return m_initChs.Index(s, bCase); + + return GetVListBoxComboPopup()->FindString(s, bCase); +} + +void wxOwnerDrawnComboBox::Select(int n) +{ + EnsurePopupControl(); + + wxCHECK_RET( (n == wxNOT_FOUND) || IsValid(n), _T("invalid index in wxOwnerDrawnComboBox::Select") ); + + GetVListBoxComboPopup()->SetSelection(n); + + wxString str; + if ( n >= 0 ) + str = GetVListBoxComboPopup()->GetString(n); + + // Refresh text portion in control + if ( m_text ) + m_text->SetValue( str ); + else + m_valueString = str; + + Refresh(); +} + +int wxOwnerDrawnComboBox::GetSelection() const +{ + if ( !m_popupInterface ) + return m_initChs.Index(m_valueString); + + return GetVListBoxComboPopup()->GetSelection(); +} + +int wxOwnerDrawnComboBox::DoAppend(const wxString& item) +{ + EnsurePopupControl(); + wxASSERT(m_popupInterface); + + return GetVListBoxComboPopup()->Append(item); +} + +int wxOwnerDrawnComboBox::DoInsert(const wxString& item, unsigned int pos) +{ + EnsurePopupControl(); + + wxCHECK_MSG(!(GetWindowStyle() & wxCB_SORT), -1, wxT("can't insert into sorted list")); + wxCHECK_MSG(IsValidInsert(pos), -1, wxT("invalid index")); + + GetVListBoxComboPopup()->Insert(item,pos); + + return pos; +} + +void wxOwnerDrawnComboBox::DoSetItemClientData(unsigned int n, void* clientData) +{ + EnsurePopupControl(); + + GetVListBoxComboPopup()->SetItemClientData(n,clientData,m_clientDataItemsType); +} + +void* wxOwnerDrawnComboBox::DoGetItemClientData(unsigned int n) const +{ + if ( !m_popupInterface ) + return NULL; + + return GetVListBoxComboPopup()->GetItemClientData(n); +} + +void wxOwnerDrawnComboBox::DoSetItemClientObject(unsigned int n, wxClientData* clientData) +{ + DoSetItemClientData(n, (void*) clientData); +} + +wxClientData* wxOwnerDrawnComboBox::DoGetItemClientObject(unsigned int n) const +{ + return (wxClientData*) DoGetItemClientData(n); +} + +// ---------------------------------------------------------------------------- +// wxOwnerDrawnComboBox item drawing and measuring default implementations +// ---------------------------------------------------------------------------- + +void wxOwnerDrawnComboBox::OnDrawItem( wxDC& dc, + const wxRect& rect, + int item, + int flags ) const +{ + if ( flags & wxODCB_PAINTING_CONTROL ) + { + dc.DrawText( GetValue(), + rect.x + GetTextIndent(), + (rect.height-dc.GetCharHeight())/2 + rect.y ); + } + else + { + dc.DrawText( GetVListBoxComboPopup()->GetString(item), rect.x + 2, rect.y ); + } +} + +wxCoord wxOwnerDrawnComboBox::OnMeasureItem( size_t WXUNUSED(item) ) const +{ + return -1; +} + +wxCoord wxOwnerDrawnComboBox::OnMeasureItemWidth( size_t WXUNUSED(item) ) const +{ + return -1; +} + +void wxOwnerDrawnComboBox::OnDrawBackground(wxDC& dc, + const wxRect& rect, + int WXUNUSED(item), + int flags) const +{ + // We need only to explicitly draw background for items + // that should have selected background. Also, call PrepareBackground + // always when painting the control so that clipping is done properly. + + if ( (flags & wxODCB_PAINTING_SELECTED) || + ((flags & wxODCB_PAINTING_CONTROL) && HasFlag(wxCB_READONLY)) ) + { + int bgFlags = wxCONTROL_SELECTED; + + if ( !(flags & wxODCB_PAINTING_CONTROL) ) + bgFlags |= wxCONTROL_ISSUBMENU; + + PrepareBackground(dc, rect, bgFlags); + } +} + +#endif // wxUSE_ODCOMBOBOX diff --git a/Externals/wxWidgets/src/generic/paletteg.cpp b/Externals/wxWidgets/src/generic/paletteg.cpp new file mode 100644 index 0000000000..93ad6324c2 --- /dev/null +++ b/Externals/wxWidgets/src/generic/paletteg.cpp @@ -0,0 +1,145 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/generic/paletteg.cpp +// Purpose: +// Author: Robert Roebling +// Created: 01/02/97 +// RCS-ID: $Id: paletteg.cpp 42752 2006-10-30 19:26:48Z VZ $ +// Copyright: (c) 1998 Robert Roebling and Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#if defined(__BORLANDC__) + #pragma hdrstop +#endif + +#if wxUSE_PALETTE + +#include "wx/palette.h" + +//----------------------------------------------------------------------------- +// wxPalette +//----------------------------------------------------------------------------- + +struct wxPaletteEntry +{ + unsigned char red, green, blue; +}; + +class wxPaletteRefData: public wxObjectRefData +{ + public: + + wxPaletteRefData(void); + virtual ~wxPaletteRefData(void); + + int m_count; + wxPaletteEntry *m_entries; +}; + +wxPaletteRefData::wxPaletteRefData() +{ + m_count = 0; + m_entries = NULL; +} + +wxPaletteRefData::~wxPaletteRefData() +{ + delete[] m_entries; +} + +//----------------------------------------------------------------------------- + +#define M_PALETTEDATA ((wxPaletteRefData *)m_refData) + +IMPLEMENT_DYNAMIC_CLASS(wxPalette,wxGDIObject) + +wxPalette::wxPalette() +{ + m_refData = NULL; +} + +wxPalette::wxPalette(int n, const unsigned char *red, const unsigned char *green, const unsigned char *blue) +{ + Create(n, red, green, blue); +} + +wxPalette::~wxPalette() +{ +} + +bool wxPalette::IsOk() const +{ + return (m_refData != NULL); +} + +int wxPalette::GetColoursCount() const +{ + if (m_refData) + return M_PALETTEDATA->m_count; + + return 0; +} + +bool wxPalette::Create(int n, + const unsigned char *red, + const unsigned char *green, + const unsigned char *blue) +{ + UnRef(); + m_refData = new wxPaletteRefData(); + + M_PALETTEDATA->m_count = n; + M_PALETTEDATA->m_entries = new wxPaletteEntry[n]; + + wxPaletteEntry *e = M_PALETTEDATA->m_entries; + for (int i = 0; i < n; i++, e++) + { + e->red = red[i]; + e->green = green[i]; + e->blue = blue[i]; + } + + return true; +} + +int wxPalette::GetPixel( unsigned char red, + unsigned char green, + unsigned char blue ) const +{ + if (!m_refData) return wxNOT_FOUND; + + int closest = 0; + double d,distance = 1000.0; // max. dist is 256 + + wxPaletteEntry *e = M_PALETTEDATA->m_entries; + for (int i = 0; i < M_PALETTEDATA->m_count; i++, e++) + { + if ((d = 0.299 * abs(red - e->red) + + 0.587 * abs(green - e->green) + + 0.114 * abs(blue - e->blue)) < distance) { + distance = d; + closest = i; + } + } + return closest; +} + +bool wxPalette::GetRGB(int pixel, + unsigned char *red, + unsigned char *green, + unsigned char *blue) const +{ + if (!m_refData) return false; + if (pixel >= M_PALETTEDATA->m_count) return false; + + wxPaletteEntry& p = M_PALETTEDATA->m_entries[pixel]; + if (red) *red = p.red; + if (green) *green = p.green; + if (blue) *blue = p.blue; + return true; +} + +#endif // wxUSE_PALETTE diff --git a/Externals/wxWidgets/src/generic/panelg.cpp b/Externals/wxWidgets/src/generic/panelg.cpp new file mode 100644 index 0000000000..5a92972120 --- /dev/null +++ b/Externals/wxWidgets/src/generic/panelg.cpp @@ -0,0 +1,180 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/generic/panelg.cpp +// Purpose: wxPanel and the keyboard handling code +// Author: Julian Smart, Robert Roebling, Vadim Zeitlin +// Modified by: +// Created: 04/01/98 +// RCS-ID: $Id: panelg.cpp 40307 2006-07-25 01:31:13Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#ifndef WX_PRECOMP + #include "wx/object.h" + #include "wx/font.h" + #include "wx/colour.h" + #include "wx/settings.h" + #include "wx/log.h" + #include "wx/panel.h" + #include "wx/containr.h" +#endif + +// ---------------------------------------------------------------------------- +// wxWin macros +// ---------------------------------------------------------------------------- + +#if wxUSE_EXTENDED_RTTI +WX_DEFINE_FLAGS( wxPanelStyle ) + +wxBEGIN_FLAGS( wxPanelStyle ) + // new style border flags, we put them first to + // use them for streaming out + wxFLAGS_MEMBER(wxBORDER_SIMPLE) + wxFLAGS_MEMBER(wxBORDER_SUNKEN) + wxFLAGS_MEMBER(wxBORDER_DOUBLE) + wxFLAGS_MEMBER(wxBORDER_RAISED) + wxFLAGS_MEMBER(wxBORDER_STATIC) + wxFLAGS_MEMBER(wxBORDER_NONE) + + // old style border flags + wxFLAGS_MEMBER(wxSIMPLE_BORDER) + wxFLAGS_MEMBER(wxSUNKEN_BORDER) + wxFLAGS_MEMBER(wxDOUBLE_BORDER) + wxFLAGS_MEMBER(wxRAISED_BORDER) + wxFLAGS_MEMBER(wxSTATIC_BORDER) + wxFLAGS_MEMBER(wxBORDER) + + // standard window styles + wxFLAGS_MEMBER(wxTAB_TRAVERSAL) + wxFLAGS_MEMBER(wxCLIP_CHILDREN) + wxFLAGS_MEMBER(wxTRANSPARENT_WINDOW) + wxFLAGS_MEMBER(wxWANTS_CHARS) + wxFLAGS_MEMBER(wxFULL_REPAINT_ON_RESIZE) + wxFLAGS_MEMBER(wxALWAYS_SHOW_SB ) + wxFLAGS_MEMBER(wxVSCROLL) + wxFLAGS_MEMBER(wxHSCROLL) + +wxEND_FLAGS( wxPanelStyle ) + +IMPLEMENT_DYNAMIC_CLASS_XTI(wxPanel, wxWindow,"wx/panel.h") + +wxBEGIN_PROPERTIES_TABLE(wxPanel) + wxPROPERTY_FLAGS( WindowStyle , wxPanelStyle , long , SetWindowStyleFlag , GetWindowStyleFlag , EMPTY_MACROVALUE, 0 /*flags*/ , wxT("Helpstring") , wxT("group")) // style +// style wxTAB_TRAVERSAL +wxEND_PROPERTIES_TABLE() + +wxBEGIN_HANDLERS_TABLE(wxPanel) +wxEND_HANDLERS_TABLE() + +wxCONSTRUCTOR_5( wxPanel , wxWindow* , Parent , wxWindowID , Id , wxPoint , Position , wxSize , Size , long , WindowStyle ) + +#else +IMPLEMENT_DYNAMIC_CLASS(wxPanel, wxWindow) +#endif + +BEGIN_EVENT_TABLE(wxPanel, wxWindow) + EVT_SIZE(wxPanel::OnSize) + + WX_EVENT_TABLE_CONTROL_CONTAINER(wxPanel) +END_EVENT_TABLE() + +// ============================================================================ +// implementation +// ============================================================================ + +WX_DELEGATE_TO_CONTROL_CONTAINER(wxPanel, wxWindow) + +// ---------------------------------------------------------------------------- +// wxPanel creation +// ---------------------------------------------------------------------------- + +void wxPanel::Init() +{ + m_container.SetContainerWindow(this); +} + +bool wxPanel::Create(wxWindow *parent, wxWindowID id, + const wxPoint& pos, + const wxSize& size, + long style, + const wxString& name) +{ + if ( !wxWindow::Create(parent, id, pos, size, style, name) ) + return false; + + // so that non-solid background renders correctly under GTK+: + SetThemeEnabled(true); + +#if defined(__WXWINCE__) && (defined(__POCKETPC__) || defined(__SMARTPHONE__)) + // Required to get solid control backgrounds under WinCE + SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW)); +#endif + + return true; +} + +wxPanel::~wxPanel() +{ +} + +void wxPanel::InitDialog() +{ + wxInitDialogEvent event(GetId()); + event.SetEventObject(this); + GetEventHandler()->ProcessEvent(event); +} + +// ---------------------------------------------------------------------------- +// event handlers +// ---------------------------------------------------------------------------- + +void wxPanel::OnSize(wxSizeEvent& event) +{ + if (GetAutoLayout()) + Layout(); +#if wxUSE_CONSTRAINTS +#if defined(__WXPM__) && 0 + else + { + // Need to properly move child windows under OS/2 + + PSWP pWinSwp = GetSwp(); + + if (pWinSwp->cx == 0 && pWinSwp->cy == 0 && pWinSwp->fl == 0) + { + // Uninitialized + + ::WinQueryWindowPos(GetHWND(), pWinSwp); + } + else + { + SWP vSwp; + int nYDiff; + + ::WinQueryWindowPos(GetHWND(), &vSwp); + nYDiff = pWinSwp->cy - vSwp.cy; + MoveChildren(nYDiff); + pWinSwp->cx = vSwp.cx; + pWinSwp->cy = vSwp.cy; + } + } +#endif +#endif // wxUSE_CONSTRAINTS + + event.Skip(); +} diff --git a/Externals/wxWidgets/src/generic/printps.cpp b/Externals/wxWidgets/src/generic/printps.cpp new file mode 100644 index 0000000000..fafc3d8f17 --- /dev/null +++ b/Externals/wxWidgets/src/generic/printps.cpp @@ -0,0 +1,370 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/generic/printps.cpp +// Purpose: Postscript print/preview framework +// Author: Julian Smart +// Modified by: +// Created: 04/01/98 +// RCS-ID: $Id: printps.cpp 42522 2006-10-27 13:07:40Z JS $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#if wxUSE_PRINTING_ARCHITECTURE && wxUSE_POSTSCRIPT && (!defined(__WXMSW__) || wxUSE_POSTSCRIPT_ARCHITECTURE_IN_MSW) + +#ifndef WX_PRECOMP + #include "wx/utils.h" + #include "wx/dc.h" + #include "wx/app.h" + #include "wx/msgdlg.h" + #include "wx/intl.h" + #include "wx/progdlg.h" + #include "wx/log.h" + #include "wx/dcprint.h" +#endif + +#include "wx/generic/printps.h" +#include "wx/printdlg.h" +#include "wx/generic/prntdlgg.h" +#include "wx/generic/progdlgg.h" +#include "wx/paper.h" + +#include + +// ---------------------------------------------------------------------------- +// wxWin macros +// ---------------------------------------------------------------------------- + + IMPLEMENT_DYNAMIC_CLASS(wxPostScriptPrinter, wxPrinterBase) + IMPLEMENT_CLASS(wxPostScriptPrintPreview, wxPrintPreviewBase) + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// Printer +// ---------------------------------------------------------------------------- + +wxPostScriptPrinter::wxPostScriptPrinter(wxPrintDialogData *data) + : wxPrinterBase(data) +{ +} + +wxPostScriptPrinter::~wxPostScriptPrinter() +{ +} + +bool wxPostScriptPrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt) +{ + sm_abortIt = false; + sm_abortWindow = (wxWindow *) NULL; + + if (!printout) + { + sm_lastError = wxPRINTER_ERROR; + return false; + } + + printout->SetIsPreview(false); + + if (m_printDialogData.GetMinPage() < 1) + m_printDialogData.SetMinPage(1); + if (m_printDialogData.GetMaxPage() < 1) + m_printDialogData.SetMaxPage(9999); + + // Create a suitable device context + wxDC *dc; + if (prompt) + { + dc = PrintDialog(parent); + if (!dc) + return false; + } + else + { + dc = new wxPostScriptDC(GetPrintDialogData().GetPrintData()); + } + + // May have pressed cancel. + if (!dc || !dc->Ok()) + { + if (dc) delete dc; + sm_lastError = wxPRINTER_ERROR; + return false; + } + + wxSize ScreenPixels = wxGetDisplaySize(); + wxSize ScreenMM = wxGetDisplaySizeMM(); + + printout->SetPPIScreen( (int) ((ScreenPixels.GetWidth() * 25.4) / ScreenMM.GetWidth()), + (int) ((ScreenPixels.GetHeight() * 25.4) / ScreenMM.GetHeight()) ); + printout->SetPPIPrinter( wxPostScriptDC::GetResolution(), + wxPostScriptDC::GetResolution() ); + + // Set printout parameters + printout->SetDC(dc); + + int w, h; + dc->GetSize(&w, &h); + printout->SetPageSizePixels((int)w, (int)h); + printout->SetPaperRectPixels(wxRect(0, 0, w, h)); + int mw, mh; + dc->GetSizeMM(&mw, &mh); + printout->SetPageSizeMM((int)mw, (int)mh); + + // Create an abort window + wxBeginBusyCursor(); + + printout->OnPreparePrinting(); + + // Get some parameters from the printout, if defined + int fromPage, toPage; + int minPage, maxPage; + printout->GetPageInfo(&minPage, &maxPage, &fromPage, &toPage); + + if (maxPage == 0) + { + sm_lastError = wxPRINTER_ERROR; + wxEndBusyCursor(); + return false; + } + + // Only set min and max, because from and to have been + // set by the user + m_printDialogData.SetMinPage(minPage); + m_printDialogData.SetMaxPage(maxPage); + + if (m_printDialogData.GetFromPage() < minPage) + m_printDialogData.SetFromPage( minPage ); + if (m_printDialogData.GetToPage() > maxPage) + m_printDialogData.SetToPage( maxPage ); + + int + pagesPerCopy = m_printDialogData.GetToPage()-m_printDialogData.GetFromPage()+1, + totalPages = pagesPerCopy * m_printDialogData.GetNoCopies(), + printedPages = 0; + // Open the progress bar dialog + wxProgressDialog *progressDialog = new wxProgressDialog ( + printout->GetTitle(), + _("Printing..."), + totalPages, + parent, + wxPD_CAN_ABORT|wxPD_AUTO_HIDE|wxPD_APP_MODAL); + + printout->OnBeginPrinting(); + + sm_lastError = wxPRINTER_NO_ERROR; + + bool keepGoing = true; + + int copyCount; + for (copyCount = 1; copyCount <= m_printDialogData.GetNoCopies(); copyCount ++) + { + if (!printout->OnBeginDocument(m_printDialogData.GetFromPage(), m_printDialogData.GetToPage())) + { + wxEndBusyCursor(); + wxLogError(_("Could not start printing.")); + sm_lastError = wxPRINTER_ERROR; + break; + } + if (sm_abortIt) + { + sm_lastError = wxPRINTER_CANCELLED; + break; + } + + int pn; + for (pn = m_printDialogData.GetFromPage(); keepGoing && (pn <= m_printDialogData.GetToPage()) && printout->HasPage(pn); + pn++) + { + if (sm_abortIt) + { + keepGoing = false; + sm_lastError = wxPRINTER_CANCELLED; + break; + } + else + { + wxString msg; + msg.Printf(_("Printing page %d..."), printedPages+1); + if(progressDialog->Update(printedPages++, msg)) + { + dc->StartPage(); + printout->OnPrintPage(pn); + dc->EndPage(); + } + else + { + sm_abortIt = true; + sm_lastError = wxPRINTER_CANCELLED; + keepGoing = false; + } + } + wxYield(); + } + printout->OnEndDocument(); + } + + printout->OnEndPrinting(); + delete progressDialog; + + wxEndBusyCursor(); + + delete dc; + + return (sm_lastError == wxPRINTER_NO_ERROR); +} + +wxDC* wxPostScriptPrinter::PrintDialog(wxWindow *parent) +{ + wxDC* dc = (wxDC*) NULL; + + wxGenericPrintDialog dialog( parent, &m_printDialogData ); + if (dialog.ShowModal() == wxID_OK) + { + dc = dialog.GetPrintDC(); + m_printDialogData = dialog.GetPrintDialogData(); + + if (dc == NULL) + sm_lastError = wxPRINTER_ERROR; + else + sm_lastError = wxPRINTER_NO_ERROR; + } + else + sm_lastError = wxPRINTER_CANCELLED; + + return dc; +} + +bool wxPostScriptPrinter::Setup(wxWindow *WXUNUSED(parent)) +{ +#if 0 + wxGenericPrintDialog* dialog = new wxGenericPrintDialog(parent, & m_printDialogData); + dialog->GetPrintDialogData().SetSetupDialog(true); + + int ret = dialog->ShowModal(); + + if (ret == wxID_OK) + { + m_printDialogData = dialog->GetPrintDialogData(); + } + + dialog->Destroy(); + + return (ret == wxID_OK); +#endif + + return false; +} + +// ---------------------------------------------------------------------------- +// Print preview +// ---------------------------------------------------------------------------- + +void wxPostScriptPrintPreview::Init(wxPrintout * WXUNUSED(printout), + wxPrintout * WXUNUSED(printoutForPrinting)) +{ + // Have to call it here since base constructor can't call it + DetermineScaling(); +} + +wxPostScriptPrintPreview::wxPostScriptPrintPreview(wxPrintout *printout, + wxPrintout *printoutForPrinting, + wxPrintDialogData *data) + : wxPrintPreviewBase(printout, printoutForPrinting, data) +{ + Init(printout, printoutForPrinting); +} + +wxPostScriptPrintPreview::wxPostScriptPrintPreview(wxPrintout *printout, + wxPrintout *printoutForPrinting, + wxPrintData *data) + : wxPrintPreviewBase(printout, printoutForPrinting, data) +{ + Init(printout, printoutForPrinting); +} + +wxPostScriptPrintPreview::~wxPostScriptPrintPreview() +{ +} + +bool wxPostScriptPrintPreview::Print(bool interactive) +{ + if (!m_printPrintout) + return false; + + // Assume that on Unix, the preview may use the PostScript + // (generic) version, but printing using the native system is required. + // TODO: make a generic print preview class from which wxPostScriptPrintPreview + // is derived. +#ifdef __UNIX__ + wxPrinter printer(& m_printDialogData); +#else + wxPostScriptPrinter printer(& m_printDialogData); +#endif + return printer.Print(m_previewFrame, m_printPrintout, interactive); +} + +void wxPostScriptPrintPreview::DetermineScaling() +{ + wxPaperSize paperType = m_printDialogData.GetPrintData().GetPaperId(); + if (paperType == wxPAPER_NONE) + paperType = wxPAPER_NONE; + + wxPrintPaperType *paper = wxThePrintPaperDatabase->FindPaperType(paperType); + if (!paper) + paper = wxThePrintPaperDatabase->FindPaperType(wxPAPER_A4); + + if (paper) + { + wxSize ScreenPixels = wxGetDisplaySize(); + wxSize ScreenMM = wxGetDisplaySizeMM(); + + m_previewPrintout->SetPPIScreen( (int) ((ScreenPixels.GetWidth() * 25.4) / ScreenMM.GetWidth()), + (int) ((ScreenPixels.GetHeight() * 25.4) / ScreenMM.GetHeight()) ); + m_previewPrintout->SetPPIPrinter(wxPostScriptDC::GetResolution(), wxPostScriptDC::GetResolution()); + + wxSize sizeDevUnits(paper->GetSizeDeviceUnits()); + sizeDevUnits.x = (wxCoord)((float)sizeDevUnits.x * wxPostScriptDC::GetResolution() / 72.0); + sizeDevUnits.y = (wxCoord)((float)sizeDevUnits.y * wxPostScriptDC::GetResolution() / 72.0); + wxSize sizeTenthsMM(paper->GetSize()); + wxSize sizeMM(sizeTenthsMM.x / 10, sizeTenthsMM.y / 10); + + // If in landscape mode, we need to swap the width and height. + if ( m_printDialogData.GetPrintData().GetOrientation() == wxLANDSCAPE ) + { + m_pageWidth = sizeDevUnits.y; + m_pageHeight = sizeDevUnits.x; + m_previewPrintout->SetPageSizeMM(sizeMM.y, sizeMM.x); + } + else + { + m_pageWidth = sizeDevUnits.x; + m_pageHeight = sizeDevUnits.y; + m_previewPrintout->SetPageSizeMM(sizeMM.x, sizeMM.y); + } + m_previewPrintout->SetPageSizePixels(m_pageWidth, m_pageHeight); + m_previewPrintout->SetPaperRectPixels(wxRect(0, 0, m_pageWidth, m_pageHeight)); + + // At 100%, the page should look about page-size on the screen. + m_previewScaleX = (float)0.8 * 72.0 / (float)wxPostScriptDC::GetResolution(); + m_previewScaleY = m_previewScaleX; + } +} + +#endif diff --git a/Externals/wxWidgets/src/generic/prntdlgg.cpp b/Externals/wxWidgets/src/generic/prntdlgg.cpp new file mode 100644 index 0000000000..435b6b8d1c --- /dev/null +++ b/Externals/wxWidgets/src/generic/prntdlgg.cpp @@ -0,0 +1,1096 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/generic/prntdlgg.cpp +// Purpose: Generic print dialogs +// Author: Julian Smart +// Modified by: +// Created: 04/01/98 +// RCS-ID: $Id: prntdlgg.cpp 44226 2007-01-15 01:26:05Z PC $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_PRINTING_ARCHITECTURE && (!defined(__WXMSW__) || wxUSE_POSTSCRIPT_ARCHITECTURE_IN_MSW) + +#include "wx/generic/prntdlgg.h" + +#ifndef WX_PRECOMP + #include "wx/utils.h" + #include "wx/dc.h" + #include "wx/stattext.h" + #include "wx/statbox.h" + #include "wx/button.h" + #include "wx/checkbox.h" + #include "wx/textctrl.h" + #include "wx/radiobox.h" + #include "wx/filedlg.h" + #include "wx/combobox.h" + #include "wx/intl.h" + #include "wx/sizer.h" + #include "wx/cmndata.h" +#endif + +#if wxUSE_STATLINE + #include "wx/statline.h" +#endif + +#if wxUSE_POSTSCRIPT + #include "wx/generic/dcpsg.h" +#endif + +#include "wx/prntbase.h" +#include "wx/printdlg.h" +#include "wx/paper.h" +#include "wx/filename.h" +#include "wx/tokenzr.h" +#include "wx/imaglist.h" + +#include +#include + +#if wxUSE_LIBGNOMEPRINT + #include "wx/link.h" + wxFORCE_LINK_MODULE(gnome_print) +#endif + +// ---------------------------------------------------------------------------- +// global vars +// ---------------------------------------------------------------------------- + +extern wxPrintPaperDatabase *wxThePrintPaperDatabase; + +#if wxUSE_POSTSCRIPT + +//---------------------------------------------------------------------------- +// wxPostScriptNativeData +//---------------------------------------------------------------------------- + +IMPLEMENT_CLASS(wxPostScriptPrintNativeData, wxPrintNativeDataBase) + +wxPostScriptPrintNativeData::wxPostScriptPrintNativeData() +{ + m_previewCommand = wxEmptyString; +#ifdef __VMS__ + m_printerCommand = wxT("print"); + m_printerOptions = wxT("/nonotify/queue=psqueue"); + m_afmPath = wxT("sys$ps_font_metrics:"); +#endif + +#ifdef __WXMSW__ + m_printerCommand = wxT("print"); + m_printerOptions = wxEmptyString; + m_afmPath = wxT("c:\\windows\\system\\"); +#endif + +#if !defined(__VMS__) && !defined(__WXMSW__) + m_printerCommand = wxT("lpr"); + m_printerOptions = wxEmptyString; + m_afmPath = wxEmptyString; +#endif + + m_printerScaleX = 1.0; + m_printerScaleY = 1.0; + m_printerTranslateX = 0; + m_printerTranslateY = 0; +} + +wxPostScriptPrintNativeData::~wxPostScriptPrintNativeData() +{ +} + +bool wxPostScriptPrintNativeData::TransferTo( wxPrintData &WXUNUSED(data) ) +{ + return true; +} + +bool wxPostScriptPrintNativeData::TransferFrom( const wxPrintData &WXUNUSED(data) ) +{ + return true; +} + +// ---------------------------------------------------------------------------- +// Generic print dialog for non-Windows printing use. +// ---------------------------------------------------------------------------- + +IMPLEMENT_CLASS(wxGenericPrintDialog, wxPrintDialogBase) + +BEGIN_EVENT_TABLE(wxGenericPrintDialog, wxPrintDialogBase) + EVT_BUTTON(wxID_OK, wxGenericPrintDialog::OnOK) + EVT_BUTTON(wxPRINTID_SETUP, wxGenericPrintDialog::OnSetup) + EVT_RADIOBOX(wxPRINTID_RANGE, wxGenericPrintDialog::OnRange) +END_EVENT_TABLE() + +wxGenericPrintDialog::wxGenericPrintDialog(wxWindow *parent, + wxPrintDialogData* data) + : wxPrintDialogBase(parent, wxID_ANY, _("Print"), + wxPoint(0,0), wxSize(600, 600), + wxDEFAULT_DIALOG_STYLE | + wxTAB_TRAVERSAL) +{ + if ( data ) + m_printDialogData = *data; + + Init(parent); +} + +wxGenericPrintDialog::wxGenericPrintDialog(wxWindow *parent, + wxPrintData* data) + : wxPrintDialogBase(parent, wxID_ANY, _("Print"), + wxPoint(0,0), wxSize(600, 600), + wxDEFAULT_DIALOG_STYLE | + wxTAB_TRAVERSAL) +{ + if ( data ) + m_printDialogData = *data; + + Init(parent); +} + +void wxGenericPrintDialog::Init(wxWindow * WXUNUSED(parent)) +{ + // wxDialog::Create(parent, wxID_ANY, _("Print"), wxPoint(0,0), wxSize(600, 600), + // wxDEFAULT_DIALOG_STYLE | wxTAB_TRAVERSAL); + + wxBoxSizer *mainsizer = new wxBoxSizer( wxVERTICAL ); + + // 1) top row + + wxPrintFactory* factory = wxPrintFactory::GetFactory(); + + wxStaticBoxSizer *topsizer = new wxStaticBoxSizer( + new wxStaticBox( this, wxID_ANY, _( "Printer options" ) ), wxHORIZONTAL ); + wxFlexGridSizer *flex = new wxFlexGridSizer( 2 ); + flex->AddGrowableCol( 1 ); + topsizer->Add( flex, 1, wxGROW ); + + m_printToFileCheckBox = new wxCheckBox( this, wxPRINTID_PRINTTOFILE, _("Print to File") ); + flex->Add( m_printToFileCheckBox, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + m_setupButton = new wxButton(this, wxPRINTID_SETUP, _("Setup...") ); + flex->Add( m_setupButton, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 5 ); + + if (!factory->HasPrintSetupDialog()) + m_setupButton->Enable( false ); + + if (factory->HasPrinterLine()) + { + flex->Add( new wxStaticText( this, wxID_ANY, _("Printer:") ), + 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + flex->Add( new wxStaticText( this, wxID_ANY, factory->CreatePrinterLine() ), + 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + } + + if (factory->HasStatusLine()) + { + flex->Add( new wxStaticText( this, wxID_ANY, _("Status:") ), + 0, wxALIGN_CENTER_VERTICAL|wxALL-wxTOP, 5 ); + flex->Add( new wxStaticText( this, wxID_ANY, factory->CreateStatusLine() ), + 0, wxALIGN_CENTER_VERTICAL|wxALL-wxTOP, 5 ); + } + + mainsizer->Add( topsizer, 0, wxLEFT|wxTOP|wxRIGHT|wxGROW, 10 ); + + // 2) middle row with radio box + + wxString *choices = new wxString[2]; + choices[0] = _("All"); + choices[1] = _("Pages"); + + m_fromText = (wxTextCtrl*)NULL; + m_toText = (wxTextCtrl*)NULL; + m_rangeRadioBox = (wxRadioBox *)NULL; + + if (m_printDialogData.GetFromPage() != 0) + { + m_rangeRadioBox = new wxRadioBox(this, wxPRINTID_RANGE, _("Print Range"), + wxDefaultPosition, wxDefaultSize, + 2, choices, + 1, wxRA_VERTICAL); + m_rangeRadioBox->SetSelection(1); + + mainsizer->Add( m_rangeRadioBox, 0, wxLEFT|wxTOP|wxRIGHT, 10 ); + } + + // 3) bottom row + + wxBoxSizer *bottomsizer = new wxBoxSizer( wxHORIZONTAL ); + + if (m_printDialogData.GetFromPage() != 0) + { + bottomsizer->Add( new wxStaticText(this, wxPRINTID_STATIC, _("From:") ), 0, wxCENTER|wxALL, 5 ); + m_fromText = new wxTextCtrl(this, wxPRINTID_FROM, wxEmptyString, wxDefaultPosition, wxSize(40, wxDefaultCoord)); + bottomsizer->Add( m_fromText, 1, wxCENTER|wxRIGHT, 10 ); + + bottomsizer->Add( new wxStaticText(this, wxPRINTID_STATIC, _("To:") ), 0, wxCENTER|wxALL, 5); + m_toText = new wxTextCtrl(this, wxPRINTID_TO, wxEmptyString, wxDefaultPosition, wxSize(40, wxDefaultCoord)); + bottomsizer->Add( m_toText, 1, wxCENTER|wxRIGHT, 10 ); + } + + bottomsizer->Add( new wxStaticText(this, wxPRINTID_STATIC, _("Copies:") ), 0, wxCENTER|wxALL, 5 ); + m_noCopiesText = new wxTextCtrl(this, wxPRINTID_COPIES, wxEmptyString, wxPoint(252, 130), wxSize(40, wxDefaultCoord)); + bottomsizer->Add( m_noCopiesText, 1, wxCENTER|wxRIGHT, 10 ); + + mainsizer->Add( bottomsizer, 0, wxTOP|wxLEFT|wxRIGHT, 12 ); + + // 4) buttons + + wxSizer *sizerBtn = CreateSeparatedButtonSizer( wxOK|wxCANCEL); + if ( sizerBtn ) + mainsizer->Add(sizerBtn, 0, wxEXPAND|wxALL, 10 ); + + SetAutoLayout( true ); + SetSizer( mainsizer ); + + mainsizer->Fit( this ); + Centre(wxBOTH); + + // Calls wxWindow::OnInitDialog and then wxGenericPrintDialog::TransferDataToWindow + InitDialog(); + delete[] choices; +} + +int wxGenericPrintDialog::ShowModal() +{ + return wxDialog::ShowModal(); +} + +wxGenericPrintDialog::~wxGenericPrintDialog() +{ +} + +void wxGenericPrintDialog::OnOK(wxCommandEvent& WXUNUSED(event)) +{ + TransferDataFromWindow(); + + // An empty 'to' field signals printing just the + // 'from' page. + if (m_printDialogData.GetToPage() < 1) + m_printDialogData.SetToPage(m_printDialogData.GetFromPage()); + + // There are some interactions between the global setup data + // and the standard print dialog. The global printing 'mode' + // is determined by whether the user checks Print to file + // or not. + if (m_printDialogData.GetPrintToFile()) + { + m_printDialogData.GetPrintData().SetPrintMode(wxPRINT_MODE_FILE); + + wxFileName fname( m_printDialogData.GetPrintData().GetFilename() ); + + wxFileDialog dialog( this, _("PostScript file"), + fname.GetPath(), fname.GetFullName(), wxT("*.ps"), wxFD_SAVE | wxFD_OVERWRITE_PROMPT ); + if (dialog.ShowModal() != wxID_OK) return; + + m_printDialogData.GetPrintData().SetFilename( dialog.GetPath() ); + } + else + { + m_printDialogData.GetPrintData().SetPrintMode(wxPRINT_MODE_PRINTER); + } + + EndModal(wxID_OK); +} + +void wxGenericPrintDialog::OnRange(wxCommandEvent& event) +{ + if (!m_fromText) return; + + if (event.GetInt() == 0) + { + m_fromText->Enable(false); + m_toText->Enable(false); + } + else if (event.GetInt() == 1) + { + m_fromText->Enable(true); + m_toText->Enable(true); + } +} + +void wxGenericPrintDialog::OnSetup(wxCommandEvent& WXUNUSED(event)) +{ + wxPrintFactory* factory = wxPrintFactory::GetFactory(); + + if (factory->HasPrintSetupDialog()) + { + // The print setup dialog should change the + // print data in-place if not cancelled. + wxDialog *dialog = factory->CreatePrintSetupDialog( this, &m_printDialogData.GetPrintData() ); + dialog->ShowModal(); + dialog->Destroy(); + } +} + +bool wxGenericPrintDialog::TransferDataToWindow() +{ + if(m_printDialogData.GetFromPage() != 0) + { + if(m_fromText) + { + if (m_printDialogData.GetEnablePageNumbers()) + { + m_fromText->Enable(true); + m_toText->Enable(true); + if (m_printDialogData.GetFromPage() > 0) + m_fromText->SetValue(wxString::Format(_T("%d"), m_printDialogData.GetFromPage())); + if (m_printDialogData.GetToPage() > 0) + m_toText->SetValue(wxString::Format(_T("%d"), m_printDialogData.GetToPage())); + if(m_rangeRadioBox) + if (m_printDialogData.GetAllPages() || m_printDialogData.GetFromPage() == 0) + m_rangeRadioBox->SetSelection(0); + else + m_rangeRadioBox->SetSelection(1); + } + else + { + m_fromText->Enable(false); + m_toText->Enable(false); + if(m_rangeRadioBox) + { + m_rangeRadioBox->SetSelection(0); + m_rangeRadioBox->wxRadioBox::Enable(1, false); + } + } + } + } + m_noCopiesText->SetValue( + wxString::Format(_T("%d"), m_printDialogData.GetNoCopies())); + + m_printToFileCheckBox->SetValue(m_printDialogData.GetPrintToFile()); + m_printToFileCheckBox->Enable(m_printDialogData.GetEnablePrintToFile()); + return true; +} + +bool wxGenericPrintDialog::TransferDataFromWindow() +{ + long res = 0; + if(m_printDialogData.GetFromPage() != -1) + { + if (m_printDialogData.GetEnablePageNumbers()) + { + if(m_fromText) + { + wxString value = m_fromText->GetValue(); + if (value.ToLong( &res )) + m_printDialogData.SetFromPage( res ); + } + if(m_toText) + { + wxString value = m_toText->GetValue(); + if (value.ToLong( &res )) + m_printDialogData.SetToPage( res ); + } + } + if(m_rangeRadioBox) + { + if (m_rangeRadioBox->GetSelection() == 0) + { + m_printDialogData.SetAllPages(true); + + // This means all pages, more or less + m_printDialogData.SetFromPage(1); + m_printDialogData.SetToPage(32000); + } + else + m_printDialogData.SetAllPages(false); + } + } + else + { // continuous printing + m_printDialogData.SetFromPage(1); + m_printDialogData.SetToPage(32000); + } + + wxString value = m_noCopiesText->GetValue(); + if (value.ToLong( &res )) + m_printDialogData.SetNoCopies( res ); + + m_printDialogData.SetPrintToFile(m_printToFileCheckBox->GetValue()); + + return true; +} + +wxDC *wxGenericPrintDialog::GetPrintDC() +{ + return new wxPostScriptDC(GetPrintDialogData().GetPrintData()); +} + +// ---------------------------------------------------------------------------- +// Generic print setup dialog +// ---------------------------------------------------------------------------- + +IMPLEMENT_CLASS(wxGenericPrintSetupDialog, wxDialog) + +BEGIN_EVENT_TABLE(wxGenericPrintSetupDialog, wxDialog) + EVT_LIST_ITEM_ACTIVATED(wxPRINTID_PRINTER, wxGenericPrintSetupDialog::OnPrinter) +END_EVENT_TABLE() + +wxGenericPrintSetupDialog::wxGenericPrintSetupDialog(wxWindow *parent, wxPrintData* data): +wxDialog(parent, wxID_ANY, _("Print Setup"), wxPoint(0,0), wxSize(600, 600), wxDEFAULT_DIALOG_STYLE|wxTAB_TRAVERSAL) +{ + Init(data); +} + +/* XPM */ +static const char * check_xpm[] = { +/* width height ncolors chars_per_pixel */ +"16 16 3 1", +/* colors */ +" s None c None", +"X c #000000", +". c #808080", +/* pixels */ +" ", +" ", +" ", +" .. ", +" XX ", +" XX. ", +" .XX ", +" XX ", +" X XX. ", +" XX .XX ", +" XX XX ", +" XXXX. ", +" XX. ", +" . ", +" ", +" " +}; + + +void wxGenericPrintSetupDialog::Init(wxPrintData* data) +{ + if ( data ) + m_printData = *data; + + m_targetData = data; + + wxBoxSizer *main_sizer = new wxBoxSizer( wxVERTICAL ); + + // printer selection + + wxStaticBoxSizer *printer_sizer = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Printer") ), wxVERTICAL ); + main_sizer->Add( printer_sizer, 0, wxALL|wxGROW, 10 ); + + m_printerListCtrl = new wxListCtrl( this, wxPRINTID_PRINTER, + wxDefaultPosition, wxSize(wxDefaultCoord,100), wxLC_REPORT|wxLC_SINGLE_SEL|wxSUNKEN_BORDER ); + wxImageList *image_list = new wxImageList; + image_list->Add( wxBitmap(check_xpm) ); + m_printerListCtrl->AssignImageList( image_list, wxIMAGE_LIST_SMALL ); + + m_printerListCtrl->InsertColumn( 0, wxT(" "), wxLIST_FORMAT_LEFT, 20 ); + m_printerListCtrl->InsertColumn( 1, wxT("Printer"), wxLIST_FORMAT_LEFT, 150 ); + m_printerListCtrl->InsertColumn( 2, wxT("Device"), wxLIST_FORMAT_LEFT, 150 ); + m_printerListCtrl->InsertColumn( 3, wxT("Status"), wxLIST_FORMAT_LEFT, 80 ); + + wxListItem item; + item.SetMask( wxLIST_MASK_TEXT ); + item.SetColumn( 1 ); + item.SetText( _("Default printer") ); + item.SetId( m_printerListCtrl->InsertItem( item ) ); + + if (data->GetPrinterName().empty()) + { + wxListItem item2; + item2.SetId( item.GetId() ); + item2.SetMask( wxLIST_MASK_IMAGE ); + item2.SetImage( 0 ); + m_printerListCtrl->SetItem( item2 ); + // also select item + m_printerListCtrl->SetItemState( item.GetId(), wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED ); + } + + item.SetId( 1+ item.GetId() ); + + wxArrayString errors; + wxArrayString output; + long res = wxExecute( wxT("lpstat -v"), output, errors, wxEXEC_NODISABLE ); + if (res >= 0 && errors.GetCount() == 0) + { + size_t i; + for (i = 0; i < output.GetCount(); i++) + { + wxStringTokenizer tok( output[i], wxT(" ") ); + wxString tmp = tok.GetNextToken(); // "device" + if (tmp != wxT("device")) + break; // the lpstat syntax must have changed. + tmp = tok.GetNextToken(); // "for" + if (tmp != wxT("for")) + break; // the lpstat syntax must have changed. + tmp = tok.GetNextToken(); // "hp_deskjet930c:" + if (tmp[tmp.length()-1] == wxT(':')) + tmp.Remove(tmp.length()-1,1); + wxString name = tmp; + item.SetText( name ); + item.SetId( m_printerListCtrl->InsertItem( item ) ); + tmp = tok.GetNextToken(); // "parallel:/dev/lp0" + item.SetColumn( 2 ); + item.SetText( tmp ); + m_printerListCtrl->SetItem( item ); + if (data->GetPrinterName() == name) + { + wxListItem item2; + item2.SetId( item.GetId() ); + item2.SetMask( wxLIST_MASK_IMAGE ); + item2.SetImage( 0 ); + m_printerListCtrl->SetItem( item2 ); + // also select item + m_printerListCtrl->SetItemState( item.GetId(), wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED ); + } + + wxString command = wxT("lpstat -p "); + command += name; + wxArrayString errors2; + wxArrayString output2; + res = wxExecute( command, output2, errors2, wxEXEC_NODISABLE ); + if (res >= 0 && errors2.GetCount() == 0 && output2.GetCount() > 0) + { + tmp = output2[0]; // "printer hp_deskjet930c is idle. enable since ..." + int pos = tmp.Find( wxT('.') ); + if (pos != wxNOT_FOUND) + tmp.Remove( (size_t)pos, tmp.length()-(size_t)pos ); + wxStringTokenizer tok2( tmp, wxT(" ") ); + tmp = tok2.GetNextToken(); // "printer" + tmp = tok2.GetNextToken(); // "hp_deskjet930c" + tmp = wxEmptyString; + while (tok2.HasMoreTokens()) + { + tmp += tok2.GetNextToken(); + tmp += wxT(" "); + } + item.SetColumn( 3 ); + item.SetText( tmp ); + m_printerListCtrl->SetItem( item ); + } + + item.SetColumn( 1 ); + item.SetId( 1+ item.GetId() ); + } + } + + + printer_sizer->Add( m_printerListCtrl, 0, wxALL|wxGROW, 5 ); + + wxBoxSizer *item1 = new wxBoxSizer( wxHORIZONTAL ); + main_sizer->Add( item1, 0, wxALL, 5 ); + + // printer options (on the left) + + wxBoxSizer *item2 = new wxBoxSizer( wxVERTICAL ); + + wxStaticBox *item4 = new wxStaticBox( this, wxPRINTID_STATIC, _("Paper size") ); + wxStaticBoxSizer *item3 = new wxStaticBoxSizer( item4, wxVERTICAL ); + + m_paperTypeChoice = CreatePaperTypeChoice(); + item3->Add( m_paperTypeChoice, 0, wxALIGN_CENTER|wxALL, 5 ); + + item2->Add( item3, 0, wxALIGN_CENTER|wxALL, 5 ); + + wxString strs6[] = + { + _("Portrait"), + _("Landscape") + }; + m_orientationRadioBox= new wxRadioBox( this, wxPRINTID_ORIENTATION, _("Orientation"), wxDefaultPosition, wxDefaultSize, 2, strs6, 1, wxRA_SPECIFY_ROWS ); + item2->Add( m_orientationRadioBox, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxStaticBox *item8 = new wxStaticBox( this, wxID_ANY, _("Options") ); + wxStaticBoxSizer *item7 = new wxStaticBoxSizer( item8, wxHORIZONTAL ); + + m_colourCheckBox = new wxCheckBox( this, wxPRINTID_PRINTCOLOUR, _("Print in colour") ); + item7->Add( m_colourCheckBox, 0, wxALIGN_CENTER|wxALL, 5 ); + + item2->Add( item7, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + item1->Add( item2, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + // spooling options (on the right) + + wxStaticBox *item11 = new wxStaticBox( this, wxID_ANY, _("Print spooling") ); + wxStaticBoxSizer *item10 = new wxStaticBoxSizer( item11, wxVERTICAL ); + + wxStaticText *item12 = new wxStaticText( this, wxID_ANY, _("Printer command:") ); + item10->Add( item12, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxBoxSizer *item13 = new wxBoxSizer( wxHORIZONTAL ); + + item13->Add( 20, 20, 0, wxALIGN_CENTER|wxALL, 5 ); + + m_printerCommandText = new wxTextCtrl( this, wxPRINTID_COMMAND, wxEmptyString, wxDefaultPosition, wxSize(160,wxDefaultCoord) ); + item13->Add( m_printerCommandText, 0, wxALIGN_CENTER|wxALL, 5 ); + + item10->Add( item13, 0, wxALIGN_CENTER|wxALL, 0 ); + + wxStaticText *item15 = new wxStaticText( this, wxID_ANY, _("Printer options:") ); + item10->Add( item15, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxBoxSizer *item16 = new wxBoxSizer( wxHORIZONTAL ); + + item16->Add( 20, 20, 0, wxALIGN_CENTER|wxALL, 5 ); + + m_printerOptionsText = new wxTextCtrl( this, wxPRINTID_OPTIONS, wxEmptyString, wxDefaultPosition, wxSize(160,wxDefaultCoord) ); + item16->Add( m_printerOptionsText, 0, wxALIGN_CENTER|wxALL, 5 ); + + item10->Add( item16, 0, wxALIGN_CENTER|wxALL, 0 ); + + item1->Add( item10, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); + + +#if wxUSE_STATLINE + // static line + main_sizer->Add( new wxStaticLine( this, wxID_ANY ), 0, wxEXPAND | wxLEFT|wxRIGHT|wxTOP, 10 ); +#endif + + // buttons + + main_sizer->Add( CreateButtonSizer( wxOK|wxCANCEL), 0, wxEXPAND|wxALL, 10 ); + + SetAutoLayout( true ); + SetSizer( main_sizer ); + + main_sizer->Fit( this ); + Centre(wxBOTH); + + + Fit(); + Centre(wxBOTH); + + InitDialog(); +} + +wxGenericPrintSetupDialog::~wxGenericPrintSetupDialog() +{ +} + +void wxGenericPrintSetupDialog::OnPrinter(wxListEvent& event) +{ + // Delete check mark + for (long item = 0; item < m_printerListCtrl->GetItemCount(); item++) + m_printerListCtrl->SetItemImage( item, -1 ); + + m_printerListCtrl->SetItemImage( event.GetIndex(), 0 ); + + if (event.GetIndex() == 0) + { + m_printerCommandText->SetValue( wxT("lpr") ); + } + else + { + wxListItem li; + li.SetColumn( 1 ); + li.SetMask( wxLIST_MASK_TEXT ); + li.SetId( event.GetIndex() ); + m_printerListCtrl->GetItem( li ); + m_printerCommandText->SetValue( _T("lpr -P") + li.GetText() ); + } +} + +bool wxGenericPrintSetupDialog::TransferDataToWindow() +{ + wxPostScriptPrintNativeData *data = + (wxPostScriptPrintNativeData *) m_printData.GetNativeData(); + + if (m_printerCommandText && data->GetPrinterCommand()) + m_printerCommandText->SetValue(data->GetPrinterCommand()); + if (m_printerOptionsText && data->GetPrinterOptions()) + m_printerOptionsText->SetValue(data->GetPrinterOptions()); + if (m_colourCheckBox) + m_colourCheckBox->SetValue(m_printData.GetColour()); + + if (m_orientationRadioBox) + { + if (m_printData.GetOrientation() == wxPORTRAIT) + m_orientationRadioBox->SetSelection(0); + else + m_orientationRadioBox->SetSelection(1); + } + return true; +} + +bool wxGenericPrintSetupDialog::TransferDataFromWindow() +{ + wxPostScriptPrintNativeData *data = + (wxPostScriptPrintNativeData *) m_printData.GetNativeData(); + + // find selected printer + long id = m_printerListCtrl->GetNextItem( -1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); + if (id == 0) + { + m_printData.SetPrinterName( wxEmptyString ); + } + else + { + wxListItem item; + item.SetId( id ); + item.SetMask( wxLIST_MASK_TEXT ); + item.SetColumn( 1 ); + m_printerListCtrl->GetItem( item ); + m_printData.SetPrinterName( item.GetText() ); + } + + if (m_printerCommandText) + data->SetPrinterCommand(m_printerCommandText->GetValue()); + if (m_printerOptionsText) + data->SetPrinterOptions(m_printerOptionsText->GetValue()); + if (m_colourCheckBox) + m_printData.SetColour(m_colourCheckBox->GetValue()); + if (m_orientationRadioBox) + { + int sel = m_orientationRadioBox->GetSelection(); + if (sel == 0) + m_printData.SetOrientation(wxPORTRAIT); + else + m_printData.SetOrientation(wxLANDSCAPE); + } + if (m_paperTypeChoice) + { + int selectedItem = m_paperTypeChoice->GetSelection(); + if (selectedItem != -1) + { + wxPrintPaperType *paper = wxThePrintPaperDatabase->Item(selectedItem); + if (paper != NULL) + m_printData.SetPaperId( paper->GetId()); + } + } + + if (m_targetData) + *m_targetData = m_printData; + + return true; +} + +wxComboBox *wxGenericPrintSetupDialog::CreatePaperTypeChoice() +{ + size_t n = wxThePrintPaperDatabase->GetCount(); + wxString *choices = new wxString [n]; + size_t sel = 0; + + for (size_t i = 0; i < n; i++) + { + wxPrintPaperType *paper = wxThePrintPaperDatabase->Item(i); + choices[i] = paper->GetName(); + if (m_printData.GetPaperId() == paper->GetId()) + sel = i; + } + + int width = 250; + + wxComboBox *choice = new wxComboBox( this, + wxPRINTID_PAPERSIZE, + _("Paper Size"), + wxDefaultPosition, + wxSize(width, wxDefaultCoord), + n, choices ); + + delete[] choices; + + choice->SetSelection(sel); + return choice; +} + +#endif // wxUSE_POSTSCRIPT + +// ---------------------------------------------------------------------------- +// Generic page setup dialog +// ---------------------------------------------------------------------------- + +IMPLEMENT_CLASS(wxGenericPageSetupDialog, wxPageSetupDialogBase) + +BEGIN_EVENT_TABLE(wxGenericPageSetupDialog, wxPageSetupDialogBase) + EVT_BUTTON(wxPRINTID_SETUP, wxGenericPageSetupDialog::OnPrinter) +END_EVENT_TABLE() + +wxGenericPageSetupDialog::wxGenericPageSetupDialog( wxWindow *parent, + wxPageSetupDialogData* data) + : wxPageSetupDialogBase( parent, + wxID_ANY, + _("Page Setup"), + wxPoint(0,0), + wxSize(600, 600), + wxDEFAULT_DIALOG_STYLE|wxTAB_TRAVERSAL ) +{ + if (data) + m_pageData = *data; + + int textWidth = 80; + + wxBoxSizer *mainsizer = new wxBoxSizer( wxVERTICAL ); + + // 1) top + wxStaticBoxSizer *topsizer = new wxStaticBoxSizer( + new wxStaticBox(this,wxPRINTID_STATIC, _("Paper size")), wxHORIZONTAL ); + + size_t n = wxThePrintPaperDatabase->GetCount(); + wxString *choices = new wxString [n]; + + for (size_t i = 0; i < n; i++) + { + wxPrintPaperType *paper = wxThePrintPaperDatabase->Item(i); + choices[i] = paper->GetName(); + } + + m_paperTypeChoice = new wxComboBox( this, + wxPRINTID_PAPERSIZE, + _("Paper Size"), + wxDefaultPosition, + wxSize(300, wxDefaultCoord), + n, choices ); + topsizer->Add( m_paperTypeChoice, 1, wxEXPAND|wxALL, 5 ); +// m_paperTypeChoice->SetSelection(sel); + + mainsizer->Add( topsizer, 0, wxTOP|wxLEFT|wxRIGHT | wxEXPAND, 10 ); + + // 2) middle sizer with radio box + + wxString *choices2 = new wxString[2]; + choices2[0] = _("Portrait"); + choices2[1] = _("Landscape"); + m_orientationRadioBox = new wxRadioBox(this, wxPRINTID_ORIENTATION, _("Orientation"), + wxDefaultPosition, wxDefaultSize, 2, choices2, 2); + m_orientationRadioBox->SetSelection(0); + + mainsizer->Add( m_orientationRadioBox, 0, wxTOP|wxLEFT|wxRIGHT, 10 ); + + // 3) margins + + wxBoxSizer *table = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer *column1 = new wxBoxSizer( wxVERTICAL ); + column1->Add( new wxStaticText(this, wxPRINTID_STATIC, _("Left margin (mm):")),1,wxALL|wxALIGN_RIGHT,5 ); + column1->Add( new wxStaticText(this, wxPRINTID_STATIC, _("Top margin (mm):")),1,wxALL|wxALIGN_RIGHT,5 ); + table->Add( column1, 0, wxALL | wxEXPAND, 5 ); + + wxBoxSizer *column2 = new wxBoxSizer( wxVERTICAL ); + m_marginLeftText = new wxTextCtrl(this, wxPRINTID_LEFTMARGIN, wxEmptyString, wxDefaultPosition, wxSize(textWidth, wxDefaultCoord)); + m_marginTopText = new wxTextCtrl(this, wxPRINTID_TOPMARGIN, wxEmptyString, wxDefaultPosition, wxSize(textWidth, wxDefaultCoord)); + column2->Add( m_marginLeftText, 1, wxALL, 5 ); + column2->Add( m_marginTopText, 1, wxALL, 5 ); + table->Add( column2, 0, wxRIGHT|wxTOP|wxBOTTOM | wxEXPAND, 5 ); + + wxBoxSizer *column3 = new wxBoxSizer( wxVERTICAL ); + column3->Add( new wxStaticText(this, wxPRINTID_STATIC, _("Right margin (mm):")),1,wxALL|wxALIGN_RIGHT,5 ); + column3->Add( new wxStaticText(this, wxPRINTID_STATIC, _("Bottom margin (mm):")),1,wxALL|wxALIGN_RIGHT,5 ); + table->Add( column3, 0, wxALL | wxEXPAND, 5 ); + + wxBoxSizer *column4 = new wxBoxSizer( wxVERTICAL ); + m_marginRightText = new wxTextCtrl(this, wxPRINTID_RIGHTMARGIN, wxEmptyString, wxDefaultPosition, wxSize(textWidth, wxDefaultCoord)); + m_marginBottomText = new wxTextCtrl(this, wxPRINTID_BOTTOMMARGIN, wxEmptyString, wxDefaultPosition, wxSize(textWidth, wxDefaultCoord)); + column4->Add( m_marginRightText, 1, wxALL, 5 ); + column4->Add( m_marginBottomText, 1, wxALL, 5 ); + table->Add( column4, 0, wxRIGHT|wxTOP|wxBOTTOM | wxEXPAND, 5 ); + + mainsizer->Add( table, 0 ); + +#if wxUSE_STATLINE + // 5) static line + mainsizer->Add( new wxStaticLine( this, wxID_ANY ), 0, wxEXPAND | wxLEFT|wxRIGHT|wxTOP, 10 ); +#endif + + // 6) buttons + + wxSizer* buttonsizer = CreateButtonSizer( wxOK|wxCANCEL); + + if (wxPrintFactory::GetFactory()->HasPrintSetupDialog()) + { + m_printerButton = new wxButton(this, wxPRINTID_SETUP, _("Printer...") ); + buttonsizer->Add( m_printerButton, 0, wxLEFT|wxRIGHT, 10 ); + if ( !m_pageData.GetEnablePrinter() ) + m_printerButton->Enable(false); + } + else + { + m_printerButton = NULL; + } + + // if (m_printData.GetEnableHelp()) + // wxButton *helpButton = new wxButton(this, (wxFunction)wxGenericPageSetupHelpProc, _("Help"), wxDefaultCoord, wxDefaultCoord, buttonWidth, buttonHeight); + mainsizer->Add( buttonsizer, 0, wxEXPAND|wxALL, 10 ); + + + SetAutoLayout( true ); + SetSizer( mainsizer ); + + mainsizer->Fit( this ); + Centre(wxBOTH); + + InitDialog(); + + delete[] choices; + delete [] choices2; +} + +wxGenericPageSetupDialog::~wxGenericPageSetupDialog() +{ +} + +wxPageSetupDialogData& wxGenericPageSetupDialog::GetPageSetupDialogData() +{ + return m_pageData; +} + +bool wxGenericPageSetupDialog::TransferDataToWindow() +{ + if (m_marginLeftText) + m_marginLeftText->SetValue(wxString::Format(wxT("%d"), m_pageData.GetMarginTopLeft().x)); + if (m_marginTopText) + m_marginTopText->SetValue(wxString::Format(wxT("%d"), m_pageData.GetMarginTopLeft().y)); + if (m_marginRightText) + m_marginRightText->SetValue(wxString::Format(wxT("%d"), m_pageData.GetMarginBottomRight().x)); + if (m_marginBottomText) + m_marginBottomText->SetValue(wxString::Format(wxT("%d"), m_pageData.GetMarginBottomRight().y)); + + if (m_orientationRadioBox) + { + if (m_pageData.GetPrintData().GetOrientation() == wxPORTRAIT) + m_orientationRadioBox->SetSelection(0); + else + m_orientationRadioBox->SetSelection(1); + } + + // Find the paper type from either the current paper size in the wxPageSetupDialogData, or + // failing that, the id in the wxPrintData object. + + wxPrintPaperType* type = wxThePrintPaperDatabase->FindPaperType( + wxSize(m_pageData.GetPaperSize().x * 10, m_pageData.GetPaperSize().y * 10)); + + if (!type && m_pageData.GetPrintData().GetPaperId() != wxPAPER_NONE) + type = wxThePrintPaperDatabase->FindPaperType(m_pageData.GetPrintData().GetPaperId()); + + if (type) + { + m_paperTypeChoice->SetStringSelection(type->GetName()); + } + + return true; +} + +bool wxGenericPageSetupDialog::TransferDataFromWindow() +{ + if (m_marginLeftText && m_marginTopText) + { + int left = wxAtoi( m_marginLeftText->GetValue().c_str() ); + int top = wxAtoi( m_marginTopText->GetValue().c_str() ); + m_pageData.SetMarginTopLeft( wxPoint(left,top) ); + } + if (m_marginRightText && m_marginBottomText) + { + int right = wxAtoi( m_marginRightText->GetValue().c_str() ); + int bottom = wxAtoi( m_marginBottomText->GetValue().c_str() ); + m_pageData.SetMarginBottomRight( wxPoint(right,bottom) ); + } + + if (m_orientationRadioBox) + { + int sel = m_orientationRadioBox->GetSelection(); + if (sel == 0) + { + m_pageData.GetPrintData().SetOrientation(wxPORTRAIT); + } + else + { + m_pageData.GetPrintData().SetOrientation(wxLANDSCAPE); + } + } + + if (m_paperTypeChoice) + { + int selectedItem = m_paperTypeChoice->GetSelection(); + if (selectedItem != -1) + { + wxPrintPaperType *paper = wxThePrintPaperDatabase->Item(selectedItem); + if ( paper ) + { + m_pageData.SetPaperSize(wxSize(paper->GetWidth()/10, paper->GetHeight()/10)); + m_pageData.GetPrintData().SetPaperId(paper->GetId()); + } + } + } + + return true; +} + +wxComboBox *wxGenericPageSetupDialog::CreatePaperTypeChoice(int *x, int *y) +{ +/* + if (!wxThePrintPaperDatabase) + { + wxThePrintPaperDatabase = new wxPrintPaperDatabase; + wxThePrintPaperDatabase->CreateDatabase(); + } +*/ + + size_t n = wxThePrintPaperDatabase->GetCount(); + wxString *choices = new wxString [n]; + + for (size_t i = 0; i < n; i++) + { + wxPrintPaperType *paper = wxThePrintPaperDatabase->Item(i); + choices[i] = paper->GetName(); + } + + (void) new wxStaticText(this, wxPRINTID_STATIC, _("Paper size"), wxPoint(*x, *y)); + *y += 25; + + wxComboBox *choice = new wxComboBox( this, + wxPRINTID_PAPERSIZE, + _("Paper Size"), + wxPoint(*x, *y), + wxSize(300, wxDefaultCoord), + n, choices ); + *y += 35; + delete[] choices; + +// choice->SetSelection(sel); + return choice; +} + +void wxGenericPageSetupDialog::OnPrinter(wxCommandEvent& WXUNUSED(event)) +{ + // We no longer query GetPrintMode, so we can eliminate the need + // to call SetPrintMode. + // This has the limitation that we can't explicitly call the PostScript + // print setup dialog from the generic Page Setup dialog under Windows, + // but since this choice would only happen when trying to do PostScript + // printing under Windows (and only in 16-bit Windows which + // doesn't have a Windows-specific page setup dialog) it's worth it. + + // First save the current settings, so the wxPrintData object is up to date. + TransferDataFromWindow(); + + // Transfer the current print settings from this dialog to the page setup dialog. + +#if 0 + // Use print factory later + + wxPrintDialogData data; + data = GetPageSetupData().GetPrintData(); + data.SetSetupDialog(true); + wxPrintDialog printDialog(this, & data); + printDialog.ShowModal(); + + // Transfer the page setup print settings from the page dialog to this dialog again, in case + // the page setup dialog changed something. + GetPageSetupData().GetPrintData() = printDialog.GetPrintDialogData().GetPrintData(); + GetPageSetupData().CalculatePaperSizeFromId(); // Make sure page size reflects the id in wxPrintData + + // Now update the dialog in case the page setup dialog changed some of our settings. + TransferDataToWindow(); +#endif +} + +#endif diff --git a/Externals/wxWidgets/src/generic/progdlgg.cpp b/Externals/wxWidgets/src/generic/progdlgg.cpp new file mode 100644 index 0000000000..4240921877 --- /dev/null +++ b/Externals/wxWidgets/src/generic/progdlgg.cpp @@ -0,0 +1,673 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/generic/progdlgg.cpp +// Purpose: wxProgressDialog class +// Author: Karsten Ballüder +// Modified by: +// Created: 09.05.1999 +// RCS-ID: $Id: progdlgg.cpp 49601 2007-11-02 16:11:08Z VZ $ +// Copyright: (c) Karsten Ballüder +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_PROGRESSDLG + +#ifndef WX_PRECOMP + #include "wx/utils.h" + #include "wx/frame.h" + #include "wx/button.h" + #include "wx/stattext.h" + #include "wx/sizer.h" + #include "wx/event.h" + #include "wx/gauge.h" + #include "wx/intl.h" + #include "wx/dcclient.h" + #include "wx/timer.h" + #include "wx/settings.h" +#endif + +#include "wx/progdlg.h" + +// --------------------------------------------------------------------------- +// macros +// --------------------------------------------------------------------------- + +/* Macro for avoiding #ifdefs when value have to be different depending on size of + device we display on - take it from something like wxDesktopPolicy in the future + */ + +#if defined(__SMARTPHONE__) + #define wxLARGESMALL(large,small) small +#else + #define wxLARGESMALL(large,small) large +#endif + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +#define LAYOUT_MARGIN wxLARGESMALL(8,2) + +static const int wxID_SKIP = 32000; // whatever + +// ---------------------------------------------------------------------------- +// private functions +// ---------------------------------------------------------------------------- + +// update the label to show the given time (in seconds) +static void SetTimeLabel(unsigned long val, wxStaticText *label); + +// ---------------------------------------------------------------------------- +// event tables +// ---------------------------------------------------------------------------- + +BEGIN_EVENT_TABLE(wxProgressDialog, wxDialog) + EVT_BUTTON(wxID_CANCEL, wxProgressDialog::OnCancel) + EVT_BUTTON(wxID_SKIP, wxProgressDialog::OnSkip) + + EVT_CLOSE(wxProgressDialog::OnClose) +END_EVENT_TABLE() + +IMPLEMENT_CLASS(wxProgressDialog, wxDialog) + +// ============================================================================ +// wxProgressDialog implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxProgressDialog creation +// ---------------------------------------------------------------------------- + +wxProgressDialog::wxProgressDialog(wxString const &title, + wxString const &message, + int maximum, + wxWindow *parent, + int style) + : wxDialog(parent, wxID_ANY, title), + m_skip(false), + m_delay(3), + m_hasAbortButton(false), + m_hasSkipButton(false) +{ + // we may disappear at any moment, let the others know about it + SetExtraStyle(GetExtraStyle() | wxWS_EX_TRANSIENT); + m_windowStyle |= style; + + m_hasAbortButton = (style & wxPD_CAN_ABORT) != 0; + m_hasSkipButton = (style & wxPD_CAN_SKIP) != 0; + + bool isPda = (wxSystemSettings::GetScreenType() <= wxSYS_SCREEN_PDA); + +#if defined(__WXMSW__) && !defined(__WXUNIVERSAL__) + // we have to remove the "Close" button from the title bar then as it is + // confusing to have it - it doesn't work anyhow + // + // FIXME: should probably have a (extended?) window style for this + if ( !m_hasAbortButton ) + { + EnableCloseButton(false); + } +#endif // wxMSW + +#if defined(__SMARTPHONE__) + SetLeftMenu(); +#endif + + m_state = m_hasAbortButton ? Continue : Uncancelable; + m_maximum = maximum; + +#if defined(__WXMSW__) || defined(__WXPM__) + // we can't have values > 65,536 in the progress control under Windows, so + // scale everything down + m_factor = m_maximum / 65536 + 1; + m_maximum /= m_factor; +#endif // __WXMSW__ + + m_parentTop = wxGetTopLevelParent(parent); + + wxClientDC dc(this); + dc.SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT)); + long widthText = 0; + dc.GetTextExtent(message, &widthText, NULL, NULL, NULL, NULL); + + wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL); + + m_msg = new wxStaticText(this, wxID_ANY, message); + sizer->Add(m_msg, 0, wxLEFT | wxTOP, 2*LAYOUT_MARGIN); + + wxSize sizeDlg, + sizeLabel = m_msg->GetSize(); + sizeDlg.y = 2*LAYOUT_MARGIN + sizeLabel.y; + + if ( maximum > 0 ) + { + int gauge_style = wxGA_HORIZONTAL; + if ( ( style & wxPD_SMOOTH ) == wxPD_SMOOTH ) + gauge_style |= wxGA_SMOOTH; + m_gauge = new wxGauge(this, wxID_ANY, m_maximum, + wxDefaultPosition, wxDefaultSize, + gauge_style ); + + sizer->Add(m_gauge, 0, wxLEFT | wxRIGHT | wxTOP | wxEXPAND, 2*LAYOUT_MARGIN); + m_gauge->SetValue(0); + + wxSize sizeGauge = m_gauge->GetSize(); + sizeDlg.y += 2*LAYOUT_MARGIN + sizeGauge.y; + } + else + m_gauge = (wxGauge *)NULL; + + // create the estimated/remaining/total time zones if requested + m_elapsed = m_estimated = m_remaining = (wxStaticText*)NULL; + m_display_estimated = m_last_timeupdate = m_break = 0; + m_ctdelay = 0; + + // if we are going to have at least one label, remember it in this var + wxStaticText *label = NULL; + + // also count how many labels we really have + size_t nTimeLabels = 0; + + if ( style & wxPD_ELAPSED_TIME ) + { + nTimeLabels++; + + label = + m_elapsed = CreateLabel(_("Elapsed time : "), sizer); + } + + if ( style & wxPD_ESTIMATED_TIME ) + { + nTimeLabels++; + + label = + m_estimated = CreateLabel(_("Estimated time : "), sizer); + } + + if ( style & wxPD_REMAINING_TIME ) + { + nTimeLabels++; + + label = + m_remaining = CreateLabel(_("Remaining time : "), sizer); + } + + if ( nTimeLabels > 0 ) + { + // set it to the current time + m_timeStart = wxGetCurrentTime(); + sizeDlg.y += nTimeLabels * (label->GetSize().y + LAYOUT_MARGIN); + } + +#if defined(__SMARTPHONE__) + if ( m_hasSkipButton ) + SetRightMenu(wxID_SKIP, _("Skip")); + if ( m_hasAbortButton ) + SetLeftMenu(wxID_CANCEL); +#else + m_btnAbort = m_btnSkip = (wxButton *)NULL; + bool sizeDlgModified = false; + wxBoxSizer *buttonSizer = new wxBoxSizer(wxHORIZONTAL); + + const int sizerFlags = +#if defined(__WXMSW__) || defined(__WXPM__) + wxALIGN_RIGHT | wxALL +#else // !MSW + wxALIGN_CENTER_HORIZONTAL | wxBOTTOM | wxTOP +#endif // MSW/!MSW + ; + + if ( m_hasSkipButton ) + { + m_btnSkip = new wxButton(this, wxID_SKIP, _("Skip")); + + // Windows dialogs usually have buttons in the lower right corner + buttonSizer->Add(m_btnSkip, 0, sizerFlags, LAYOUT_MARGIN); + sizeDlg.y += 2*LAYOUT_MARGIN + wxButton::GetDefaultSize().y; + sizeDlgModified = true; + } + + if ( m_hasAbortButton ) + { + m_btnAbort = new wxButton(this, wxID_CANCEL); + + // Windows dialogs usually have buttons in the lower right corner + buttonSizer->Add(m_btnAbort, 0, sizerFlags, LAYOUT_MARGIN); + if(!sizeDlgModified) + sizeDlg.y += 2*LAYOUT_MARGIN + wxButton::GetDefaultSize().y; + } + + sizer->Add(buttonSizer, 0, sizerFlags, LAYOUT_MARGIN ); +#endif // __SMARTPHONE__/!__SMARTPHONE__ + + SetSizerAndFit(sizer); + + if (!isPda) + { + sizeDlg.y += 2*LAYOUT_MARGIN; + + // try to make the dialog not square but rectangular of reasonable width + sizeDlg.x = (wxCoord)wxMax(3*widthText/2, 4*sizeDlg.y/3); + SetClientSize(sizeDlg); + } + + Centre(wxCENTER_FRAME | wxBOTH); + + if ( style & wxPD_APP_MODAL ) + { + m_winDisabler = new wxWindowDisabler(this); + } + else + { + if ( m_parentTop ) + m_parentTop->Disable(); + m_winDisabler = NULL; + } + + Show(); + Enable(); + + // this one can be initialized even if the others are unknown for now + // + // NB: do it after calling Layout() to keep the labels correctly aligned + if ( m_elapsed ) + { + SetTimeLabel(0, m_elapsed); + } + + Update(); +} + +wxStaticText *wxProgressDialog::CreateLabel(const wxString& text, + wxSizer *sizer) +{ + wxBoxSizer *locsizer = new wxBoxSizer(wxLARGESMALL(wxHORIZONTAL,wxVERTICAL)); + + wxStaticText *dummy = new wxStaticText(this, wxID_ANY, text); + wxStaticText *label = new wxStaticText(this, wxID_ANY, _("unknown")); + + // select placement most native or nice on target GUI +#if defined(__SMARTPHONE__) + // label and time to the left in two rows + locsizer->Add(dummy, 1, wxALIGN_LEFT); + locsizer->Add(label, 1, wxALIGN_LEFT); + sizer->Add(locsizer, 0, wxALIGN_LEFT | wxTOP | wxLEFT, LAYOUT_MARGIN); +#elif defined(__WXMSW__) || defined(__WXPM__) || defined(__WXMAC__) || defined(__WXGTK20__) + // label and time centered in one row + locsizer->Add(dummy, 1, wxLARGESMALL(wxALIGN_RIGHT,wxALIGN_LEFT)); + locsizer->Add(label, 1, wxALIGN_LEFT | wxLEFT, LAYOUT_MARGIN); + sizer->Add(locsizer, 0, wxALIGN_CENTER_HORIZONTAL | wxTOP, LAYOUT_MARGIN); +#else + // label and time to the right in one row + sizer->Add(locsizer, 0, wxALIGN_RIGHT | wxRIGHT | wxTOP, LAYOUT_MARGIN); + locsizer->Add(dummy); + locsizer->Add(label, 0, wxLEFT, LAYOUT_MARGIN); +#endif + + return label; +} + +// ---------------------------------------------------------------------------- +// wxProgressDialog operations +// ---------------------------------------------------------------------------- + +bool +wxProgressDialog::Update(int value, const wxString& newmsg, bool *skip) +{ + wxASSERT_MSG( value == -1 || m_gauge, wxT("cannot update non existent dialog") ); + +#ifdef __WXMSW__ + value /= m_factor; +#endif // __WXMSW__ + + wxASSERT_MSG( value <= m_maximum, wxT("invalid progress value") ); + + if ( m_gauge ) + m_gauge->SetValue(value); + + UpdateMessage(newmsg); + + if ( (m_elapsed || m_remaining || m_estimated) && (value != 0) ) + { + unsigned long elapsed = wxGetCurrentTime() - m_timeStart; + if ( m_last_timeupdate < elapsed + || value == m_maximum + ) + { + m_last_timeupdate = elapsed; + unsigned long estimated = m_break + + (unsigned long)(( (double) (elapsed-m_break) * m_maximum ) / ((double)value)) ; + if ( estimated > m_display_estimated + && m_ctdelay >= 0 + ) + { + ++m_ctdelay; + } + else if ( estimated < m_display_estimated + && m_ctdelay <= 0 + ) + { + --m_ctdelay; + } + else + { + m_ctdelay = 0; + } + if ( m_ctdelay >= m_delay // enough confirmations for a higher value + || m_ctdelay <= (m_delay*-1) // enough confirmations for a lower value + || value == m_maximum // to stay consistent + || elapsed > m_display_estimated // to stay consistent + || ( elapsed > 0 && elapsed < 4 ) // additional updates in the beginning + ) + { + m_display_estimated = estimated; + m_ctdelay = 0; + } + } + + long display_remaining = m_display_estimated - elapsed; + if ( display_remaining < 0 ) + { + display_remaining = 0; + } + + SetTimeLabel(elapsed, m_elapsed); + SetTimeLabel(m_display_estimated, m_estimated); + SetTimeLabel(display_remaining, m_remaining); + } + + if ( value == m_maximum ) + { + if ( m_state == Finished ) + { + // ignore multiple calls to Update(m_maximum): it may sometimes be + // troublesome to ensure that Update() is not called twice with the + // same value (e.g. because of the rounding errors) and if we don't + // return now we're going to generate asserts below + return true; + } + + // so that we return true below and that out [Cancel] handler knew what + // to do + m_state = Finished; + if( !(GetWindowStyle() & wxPD_AUTO_HIDE) ) + { + EnableClose(); + DisableSkip(); +#if defined(__WXMSW__) && !defined(__WXUNIVERSAL__) + EnableCloseButton(); +#endif // __WXMSW__ + + if ( newmsg.empty() ) + { + // also provide the finishing message if the application didn't + m_msg->SetLabel(_("Done.")); + } + + wxYieldIfNeeded() ; + + (void)ShowModal(); + } + else // auto hide + { + // reenable other windows before hiding this one because otherwise + // Windows wouldn't give the focus back to the window which had + // been previously focused because it would still be disabled + ReenableOtherWindows(); + + Hide(); + } + } + else // not at maximum yet + { + return DoAfterUpdate(skip); + } + + // update the display in case yielding above didn't do it + Update(); + + return m_state != Canceled; +} + +bool wxProgressDialog::Pulse(const wxString& newmsg, bool *skip) +{ + wxASSERT_MSG( m_gauge, wxT("cannot update non existent dialog") ); + + // show a bit of progress + m_gauge->Pulse(); + + UpdateMessage(newmsg); + + if (m_elapsed || m_remaining || m_estimated) + { + unsigned long elapsed = wxGetCurrentTime() - m_timeStart; + + SetTimeLabel(elapsed, m_elapsed); + SetTimeLabel((unsigned long)-1, m_estimated); + SetTimeLabel((unsigned long)-1, m_remaining); + } + + return DoAfterUpdate(skip); +} + +bool wxProgressDialog::DoAfterUpdate(bool *skip) +{ + // we have to yield because not only we want to update the display but + // also to process the clicks on the cancel and skip buttons + wxYieldIfNeeded(); + + Update(); + + if ( m_skip && skip && !*skip ) + { + *skip = true; + m_skip = false; + EnableSkip(); + } + + return m_state != Canceled; +} + +void wxProgressDialog::Resume() +{ + m_state = Continue; + m_ctdelay = m_delay; // force an update of the elapsed/estimated/remaining time + m_break += wxGetCurrentTime()-m_timeStop; + + EnableAbort(); + EnableSkip(); + m_skip = false; +} + +bool wxProgressDialog::Show( bool show ) +{ + // reenable other windows before hiding this one because otherwise + // Windows wouldn't give the focus back to the window which had + // been previously focused because it would still be disabled + if(!show) + ReenableOtherWindows(); + + return wxDialog::Show(show); +} + +// ---------------------------------------------------------------------------- +// event handlers +// ---------------------------------------------------------------------------- + +void wxProgressDialog::OnCancel(wxCommandEvent& event) +{ + if ( m_state == Finished ) + { + // this means that the count down is already finished and we're being + // shown as a modal dialog - so just let the default handler do the job + event.Skip(); + } + else + { + // request to cancel was received, the next time Update() is called we + // will handle it + m_state = Canceled; + + // update the buttons state immediately so that the user knows that the + // request has been noticed + DisableAbort(); + DisableSkip(); + + // save the time when the dialog was stopped + m_timeStop = wxGetCurrentTime(); + } +} + +void wxProgressDialog::OnSkip(wxCommandEvent& WXUNUSED(event)) +{ + DisableSkip(); + m_skip = true; +} + +void wxProgressDialog::OnClose(wxCloseEvent& event) +{ + if ( m_state == Uncancelable ) + { + // can't close this dialog + event.Veto(); + } + else if ( m_state == Finished ) + { + // let the default handler close the window as we already terminated + event.Skip(); + } + else + { + // next Update() will notice it + m_state = Canceled; + DisableAbort(); + DisableSkip(); + + m_timeStop = wxGetCurrentTime(); + } +} + +// ---------------------------------------------------------------------------- +// destruction +// ---------------------------------------------------------------------------- + +wxProgressDialog::~wxProgressDialog() +{ + // normally this should have been already done, but just in case + ReenableOtherWindows(); +} + +void wxProgressDialog::ReenableOtherWindows() +{ + if ( GetWindowStyle() & wxPD_APP_MODAL ) + { + delete m_winDisabler; + m_winDisabler = (wxWindowDisabler *)NULL; + } + else + { + if ( m_parentTop ) + m_parentTop->Enable(); + } +} + +// ---------------------------------------------------------------------------- +// private functions +// ---------------------------------------------------------------------------- + +static void SetTimeLabel(unsigned long val, wxStaticText *label) +{ + if ( label ) + { + wxString s; + + if (val != (unsigned long)-1) + { + unsigned long hours = val / 3600; + unsigned long minutes = (val % 3600) / 60; + unsigned long seconds = val % 60; + s.Printf(wxT("%lu:%02lu:%02lu"), hours, minutes, seconds); + } + else + { + s = _("Unknown"); + } + + if ( s != label->GetLabel() ) + label->SetLabel(s); + } +} + +void wxProgressDialog::EnableSkip(bool enable) +{ + if(m_hasSkipButton) + { +#ifdef __SMARTPHONE__ + if(enable) + SetRightMenu(wxID_SKIP, _("Skip")); + else + SetRightMenu(); +#else + if(m_btnSkip) + m_btnSkip->Enable(enable); +#endif + } +} + +void wxProgressDialog::EnableAbort(bool enable) +{ + if(m_hasAbortButton) + { +#ifdef __SMARTPHONE__ + if(enable) + SetLeftMenu(wxID_CANCEL); // stock buttons makes Cancel label + else + SetLeftMenu(); +#else + if(m_btnAbort) + m_btnAbort->Enable(enable); +#endif + } +} + +void wxProgressDialog::EnableClose() +{ + if(m_hasAbortButton) + { +#ifdef __SMARTPHONE__ + SetLeftMenu(wxID_CANCEL, _("Close")); +#else + if(m_btnAbort) + { + m_btnAbort->Enable(); + m_btnAbort->SetLabel(_("Close")); + } +#endif + } +} + +void wxProgressDialog::UpdateMessage(const wxString &newmsg) +{ + if ( !newmsg.empty() && newmsg != m_msg->GetLabel() ) + { + m_msg->SetLabel(newmsg); + + wxYieldIfNeeded() ; + } +} + +#endif // wxUSE_PROGRESSDLG diff --git a/Externals/wxWidgets/src/generic/propdlg.cpp b/Externals/wxWidgets/src/generic/propdlg.cpp new file mode 100644 index 0000000000..e529b2ca3f --- /dev/null +++ b/Externals/wxWidgets/src/generic/propdlg.cpp @@ -0,0 +1,226 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/generic/propdlg.cpp +// Purpose: wxPropertySheetDialog +// Author: Julian Smart +// Modified by: +// Created: 2005-03-12 +// RCS-ID: $Id: propdlg.cpp 41838 2006-10-09 21:08:45Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_BOOKCTRL + +#ifndef WX_PRECOMP + #include "wx/button.h" + #include "wx/sizer.h" + #include "wx/intl.h" + #include "wx/log.h" + #include "wx/msgdlg.h" +#endif + +#include "wx/bookctrl.h" + +#if wxUSE_NOTEBOOK +#include "wx/notebook.h" +#endif +#if wxUSE_CHOICEBOOK +#include "wx/choicebk.h" +#endif +#if wxUSE_TOOLBOOK +#include "wx/toolbook.h" +#endif +#if wxUSE_LISTBOOK +#include "wx/listbook.h" +#endif +#if wxUSE_TREEBOOK +#include "wx/treebook.h" +#endif + +#include "wx/generic/propdlg.h" +#include "wx/sysopt.h" + +//----------------------------------------------------------------------------- +// wxPropertySheetDialog +//----------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxPropertySheetDialog, wxDialog) + +BEGIN_EVENT_TABLE(wxPropertySheetDialog, wxDialog) + EVT_ACTIVATE(wxPropertySheetDialog::OnActivate) + EVT_IDLE(wxPropertySheetDialog::OnIdle) +END_EVENT_TABLE() + +bool wxPropertySheetDialog::Create(wxWindow* parent, wxWindowID id, const wxString& title, + const wxPoint& pos, const wxSize& sz, long style, + const wxString& name) +{ + if (!wxDialog::Create(parent, id, title, pos, sz, style|wxCLIP_CHILDREN, name)) + return false; + + wxBoxSizer *topSizer = new wxBoxSizer( wxVERTICAL ); + SetSizer(topSizer); + + // This gives more space around the edges + m_innerSizer = new wxBoxSizer( wxVERTICAL ); + +#if defined(__SMARTPHONE__) || defined(__POCKETPC__) + m_sheetOuterBorder = 0; +#endif + topSizer->Add(m_innerSizer, 1, wxGROW|wxALL, m_sheetOuterBorder); + + m_bookCtrl = CreateBookCtrl(); + AddBookCtrl(m_innerSizer); + + return true; +} + +void wxPropertySheetDialog::Init() +{ + m_sheetStyle = wxPROPSHEET_DEFAULT; + m_innerSizer = NULL; + m_bookCtrl = NULL; + m_sheetOuterBorder = 2; + m_sheetInnerBorder = 5; +} + +// Layout the dialog, to be called after pages have been created +void wxPropertySheetDialog::LayoutDialog(int centreFlags) +{ +#if !defined(__SMARTPHONE__) && !defined(__POCKETPC__) + GetSizer()->Fit(this); + GetSizer()->SetSizeHints(this); + if (centreFlags) + Centre(centreFlags); +#else + wxUnusedVar(centreFlags); +#endif +#if defined(__SMARTPHONE__) + if (m_bookCtrl) + m_bookCtrl->SetFocus(); +#endif +} + +// Creates the buttons, if any +void wxPropertySheetDialog::CreateButtons(int flags) +{ +#ifdef __POCKETPC__ + // keep system option status + const wxChar *optionName = wxT("wince.dialog.real-ok-cancel"); + const int status = wxSystemOptions::GetOptionInt(optionName); + wxSystemOptions::SetOption(optionName,0); +#endif + + wxSizer *buttonSizer = CreateButtonSizer( flags & ButtonSizerFlags ); + if( buttonSizer ) + { + m_innerSizer->Add( buttonSizer, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT|wxRIGHT, 2); + m_innerSizer->AddSpacer(2); + } + +#ifdef __POCKETPC__ + // restore system option + wxSystemOptions::SetOption(optionName,status); +#endif +} + +// Creates the book control +wxBookCtrlBase* wxPropertySheetDialog::CreateBookCtrl() +{ + int style = wxCLIP_CHILDREN | wxBK_DEFAULT; + + wxBookCtrlBase* bookCtrl = NULL; + +#if wxUSE_NOTEBOOK + if (GetSheetStyle() & wxPROPSHEET_NOTEBOOK) + bookCtrl = new wxNotebook(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, style ); +#endif +#if wxUSE_CHOICEBOOK + if (GetSheetStyle() & wxPROPSHEET_CHOICEBOOK) + bookCtrl = new wxChoicebook(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, style ); +#endif +#if wxUSE_TOOLBOOK +#if defined(__WXMAC__) && wxUSE_TOOLBAR && wxUSE_BMPBUTTON + if (GetSheetStyle() & wxPROPSHEET_BUTTONTOOLBOOK) + bookCtrl = new wxToolbook(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, style|wxBK_BUTTONBAR ); + else +#endif + if ((GetSheetStyle() & wxPROPSHEET_TOOLBOOK) || (GetSheetStyle() & wxPROPSHEET_BUTTONTOOLBOOK)) + bookCtrl = new wxToolbook(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, style ); +#endif +#if wxUSE_LISTBOOK + if (GetSheetStyle() & wxPROPSHEET_LISTBOOK) + bookCtrl = new wxListbook(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, style ); +#endif +#if wxUSE_TREEBOOK + if (GetSheetStyle() & wxPROPSHEET_TREEBOOK) + bookCtrl = new wxTreebook(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, style ); +#endif + if (!bookCtrl) + bookCtrl = new wxBookCtrl(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, style ); + + if (GetSheetStyle() & wxPROPSHEET_SHRINKTOFIT) + bookCtrl->SetFitToCurrentPage(true); + + return bookCtrl; +} + +// Adds the book control to the inner sizer. +void wxPropertySheetDialog::AddBookCtrl(wxSizer* sizer) +{ +#if defined(__POCKETPC__) && wxUSE_NOTEBOOK + // The book control has to be sized larger than the dialog because of a border bug + // in WinCE + int borderSize = -2; + sizer->Add( m_bookCtrl, 1, wxGROW|wxALIGN_CENTER_VERTICAL|wxLEFT|wxTOP|wxRIGHT, borderSize ); +#else + sizer->Add( m_bookCtrl, 1, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, m_sheetInnerBorder ); +#endif +} + +void wxPropertySheetDialog::OnActivate(wxActivateEvent& event) +{ +#if defined(__SMARTPHONE__) + // Attempt to focus the choice control: not yet working, but might + // be a step in the right direction. OnActivate overrides the default + // handler in toplevel.cpp that sets the focus for the first child of + // of the dialog (the choicebook). + if (event.GetActive()) + { + wxChoicebook* choiceBook = wxDynamicCast(GetBookCtrl(), wxChoicebook); + if (choiceBook) + choiceBook->SetFocus(); + } + else +#endif + event.Skip(); +} + +// Resize dialog if necessary +void wxPropertySheetDialog::OnIdle(wxIdleEvent& event) +{ + event.Skip(); + + if ((GetSheetStyle() & wxPROPSHEET_SHRINKTOFIT) && GetBookCtrl()) + { + int sel = GetBookCtrl()->GetSelection(); + if (sel != -1 && sel != m_selectedPage) + { + GetBookCtrl()->InvalidateBestSize(); + InvalidateBestSize(); + SetSizeHints(-1, -1, -1, -1); + + m_selectedPage = sel; + LayoutDialog(0); + } + } +} + +#endif // wxUSE_BOOKCTRL diff --git a/Externals/wxWidgets/src/generic/regiong.cpp b/Externals/wxWidgets/src/generic/regiong.cpp new file mode 100644 index 0000000000..7e48ae4039 --- /dev/null +++ b/Externals/wxWidgets/src/generic/regiong.cpp @@ -0,0 +1,1919 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/generic/region.cpp +// Purpose: generic wxRegion class +// Author: David Elliott +// Modified by: +// Created: 2004/04/12 +// RCS-ID: $Id: regiong.cpp 41444 2006-09-25 18:18:26Z VZ $ +// Copyright: (c) 2004 David Elliott +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#include "wx/region.h" + +#ifndef WX_PRECOMP + #include "wx/utils.h" +#endif + +// ======================================================================== +// Classes to interface with X.org code +// ======================================================================== + +typedef struct Box +{ + wxCoord x1, x2, y1, y2; +} Box, BOX, BoxRec, *BoxPtr; + +typedef struct REGION *Region; + +struct REGION +{ +public: + // Default constructor initializes nothing + REGION() {} + + REGION(const wxRect& rect) + { + rects = &extents; + numRects = 1; + extents.x1 = rect.x; + extents.y1 = rect.y; + extents.x2 = rect.x + rect.width; + extents.y2 = rect.y + rect.height; + size = 1; + } + + BoxPtr GetBox(int i) + { + return i < numRects ? rects + i : NULL; + } + + // X.org methods + static bool XClipBox( + Region r, + wxRect *rect); + static bool XOffsetRegion( + register Region pRegion, + register int x, + register int y); + static bool XIntersectRegion( + Region reg1, + Region reg2, /* source regions */ + register Region newReg); /* destination Region */ + static bool XUnionRegion( + Region reg1, + Region reg2, /* source regions */ + Region newReg); /* destination Region */ + static bool XSubtractRegion( + Region regM, + Region regS, + register Region regD); + static bool XXorRegion(Region sra, Region srb, Region dr); + static bool XEmptyRegion( + Region r); + static bool XEqualRegion(Region r1, Region r2); + static bool XPointInRegion( + Region pRegion, + int x, int y); + static wxRegionContain XRectInRegion( + register Region region, + int rx, int ry, + unsigned int rwidth, unsigned int rheight); + +protected: + static Region XCreateRegion(void); + static void miSetExtents ( + Region pReg); + static bool XDestroyRegion(Region r); + static int miIntersectO ( + register Region pReg, + register BoxPtr r1, + BoxPtr r1End, + register BoxPtr r2, + BoxPtr r2End, + wxCoord y1, + wxCoord y2); + static void miRegionCopy( + register Region dstrgn, + register Region rgn); + static int miCoalesce( + register Region pReg, /* Region to coalesce */ + int prevStart, /* Index of start of previous band */ + int curStart); /* Index of start of current band */ + static void miRegionOp( + register Region newReg, /* Place to store result */ + Region reg1, /* First region in operation */ + Region reg2, /* 2d region in operation */ + int (*overlapFunc)( + register Region pReg, + register BoxPtr r1, + BoxPtr r1End, + register BoxPtr r2, + BoxPtr r2End, + wxCoord y1, + wxCoord y2), /* Function to call for over- + * lapping bands */ + int (*nonOverlap1Func)( + register Region pReg, + register BoxPtr r, + BoxPtr rEnd, + register wxCoord y1, + register wxCoord y2), /* Function to call for non- + * overlapping bands in region + * 1 */ + int (*nonOverlap2Func)( + register Region pReg, + register BoxPtr r, + BoxPtr rEnd, + register wxCoord y1, + register wxCoord y2)); /* Function to call for non- + * overlapping bands in region + * 2 */ + static int miUnionNonO ( + register Region pReg, + register BoxPtr r, + BoxPtr rEnd, + register wxCoord y1, + register wxCoord y2); + static int miUnionO ( + register Region pReg, + register BoxPtr r1, + BoxPtr r1End, + register BoxPtr r2, + BoxPtr r2End, + register wxCoord y1, + register wxCoord y2); + static int miSubtractNonO1 ( + register Region pReg, + register BoxPtr r, + BoxPtr rEnd, + register wxCoord y1, + register wxCoord y2); + static int miSubtractO ( + register Region pReg, + register BoxPtr r1, + BoxPtr r1End, + register BoxPtr r2, + BoxPtr r2End, + register wxCoord y1, + register wxCoord y2); +protected: + long size; + long numRects; + Box *rects; + Box extents; +}; + +// ======================================================================== +// wxRegionRefData +// ======================================================================== + +class wxRegionRefData : public wxObjectRefData, + public REGION +{ +public: + wxRegionRefData() + : wxObjectRefData(), + REGION() + { + size = 1; + numRects = 0; + rects = ( BOX * )malloc( (unsigned) sizeof( BOX )); + extents.x1 = 0; + extents.x2 = 0; + extents.y1 = 0; + extents.y2 = 0; + } + + wxRegionRefData(const wxPoint& topLeft, const wxPoint& bottomRight) + : wxObjectRefData(), + REGION() + { + rects = (BOX*)malloc(sizeof(BOX)); + size = 1; + numRects = 1; + extents.x1 = topLeft.x; + extents.y1 = topLeft.y; + extents.x2 = bottomRight.x; + extents.y2 = bottomRight.y; + *rects = extents; + } + + wxRegionRefData(const wxRect& rect) + : wxObjectRefData(), + REGION(rect) + { + rects = (BOX*)malloc(sizeof(BOX)); + *rects = extents; + } + + wxRegionRefData(const wxRegionRefData& refData) + : wxObjectRefData(), + REGION() + { + size = refData.size; + numRects = refData.numRects; + rects = (Box*)malloc(numRects*sizeof(Box)); + memcpy(rects, refData.rects, numRects*sizeof(Box)); + extents = refData.extents; + } + + virtual ~wxRegionRefData() + { + free(rects); + } + +private: + // Don't allow this + wxRegionRefData(const REGION&); +}; + +// ======================================================================== +// wxRegionGeneric +// ======================================================================== +//IMPLEMENT_DYNAMIC_CLASS(wxRegionGeneric, wxGDIObject) + +#define M_REGIONDATA ((wxRegionRefData *)m_refData) +#define M_REGIONDATA_OF(rgn) ((wxRegionRefData *)(rgn.m_refData)) + +// ---------------------------------------------------------------------------- +// wxRegionGeneric construction +// ---------------------------------------------------------------------------- + +wxRegionGeneric::wxRegionGeneric() +{ +} + +wxRegionGeneric::~wxRegionGeneric() +{ +} + +wxRegionGeneric::wxRegionGeneric(wxCoord x, wxCoord y, wxCoord w, wxCoord h) +{ + m_refData = new wxRegionRefData(wxRect(x,y,w,h)); +} + +wxRegionGeneric::wxRegionGeneric(const wxRect& rect) +{ + m_refData = new wxRegionRefData(rect); +} + +wxRegionGeneric::wxRegionGeneric(const wxPoint& topLeft, const wxPoint& bottomRight) +{ + m_refData = new wxRegionRefData(topLeft, bottomRight); +} + +void wxRegionGeneric::Clear() +{ + UnRef(); +} + +wxObjectRefData *wxRegionGeneric::CreateRefData() const +{ + return new wxRegionRefData; +} + +wxObjectRefData *wxRegionGeneric::CloneRefData(const wxObjectRefData *data) const +{ + return new wxRegionRefData(*(wxRegionRefData *)data); +} + +bool wxRegionGeneric::DoIsEqual(const wxRegion& region) const +{ + return REGION::XEqualRegion(M_REGIONDATA,M_REGIONDATA_OF(region)); +} + +bool wxRegionGeneric::DoGetBox(wxCoord& x, wxCoord& y, wxCoord&w, wxCoord &h) const +{ + if ( !m_refData ) + return false; + + wxRect rect; + REGION::XClipBox(M_REGIONDATA,&rect); + x = rect.x; + y = rect.y; + w = rect.width; + h = rect.height; + return true; +} + +// ---------------------------------------------------------------------------- +// wxRegionGeneric operations +// ---------------------------------------------------------------------------- + +bool wxRegionGeneric::DoUnionWithRect(const wxRect& rect) +{ + if ( rect.IsEmpty() ) + { + // nothing to do + return true; + } + + AllocExclusive(); + REGION region(rect); + return REGION::XUnionRegion(®ion,M_REGIONDATA,M_REGIONDATA); +} + +bool wxRegionGeneric::DoUnionWithRegion(const wxRegion& region) +{ + AllocExclusive(); + return REGION::XUnionRegion(M_REGIONDATA_OF(region),M_REGIONDATA,M_REGIONDATA); +} + +bool wxRegionGeneric::DoIntersect(const wxRegion& region) +{ + AllocExclusive(); + return REGION::XIntersectRegion(M_REGIONDATA_OF(region),M_REGIONDATA,M_REGIONDATA); +} + +bool wxRegionGeneric::DoSubtract(const wxRegion& region) +{ + if ( region.IsEmpty() ) + { + // nothing to do + return true; + } + + return REGION::XSubtractRegion(M_REGIONDATA_OF(region),M_REGIONDATA,M_REGIONDATA); +} + +bool wxRegionGeneric::DoXor(const wxRegion& region) +{ + AllocExclusive(); + return REGION::XXorRegion(M_REGIONDATA_OF(region),M_REGIONDATA,M_REGIONDATA); +} + +bool wxRegionGeneric::DoOffset(wxCoord x, wxCoord y) +{ + AllocExclusive(); + return REGION::XOffsetRegion(M_REGIONDATA, x, y); +} + +// ---------------------------------------------------------------------------- +// wxRegionGeneric comparison +// ---------------------------------------------------------------------------- + +bool wxRegionGeneric::IsEmpty() const +{ + wxASSERT(m_refData); + return REGION::XEmptyRegion(M_REGIONDATA); +} + +// Does the region contain the point (x,y)? +wxRegionContain wxRegionGeneric::DoContainsPoint(wxCoord x, wxCoord y) const +{ + wxASSERT(m_refData); + return REGION::XPointInRegion(M_REGIONDATA,x,y) ? wxInRegion : wxOutRegion; +} + +// Does the region contain the rectangle rect? +wxRegionContain wxRegionGeneric::DoContainsRect(const wxRect& rect) const +{ + wxASSERT(m_refData); + return REGION::XRectInRegion(M_REGIONDATA,rect.x,rect.y,rect.width,rect.height); +} + +// ======================================================================== +// wxRegionIteratorGeneric +// ======================================================================== +//IMPLEMENT_DYNAMIC_CLASS(wxRegionIteratorGeneric,wxObject) + +wxRegionIteratorGeneric::wxRegionIteratorGeneric() +{ + m_current = 0; +} + +wxRegionIteratorGeneric::wxRegionIteratorGeneric(const wxRegionGeneric& region) +: m_region(region) +{ + m_current = 0; +} + +wxRegionIteratorGeneric::wxRegionIteratorGeneric(const wxRegionIteratorGeneric& iterator) +: m_region(iterator.m_region) +{ + m_current = iterator.m_current; +} + +void wxRegionIteratorGeneric::Reset(const wxRegionGeneric& region) +{ + m_region = region; + m_current = 0; +} + +bool wxRegionIteratorGeneric::HaveRects() const +{ + return M_REGIONDATA_OF(m_region)->GetBox(m_current); +} + +wxRegionIteratorGeneric& wxRegionIteratorGeneric::operator++() +{ + ++m_current; + return *this; +} + +wxRegionIteratorGeneric wxRegionIteratorGeneric::operator++(int) +{ + wxRegionIteratorGeneric copy(*this); + ++*this; + return copy; +} + +wxRect wxRegionIteratorGeneric::GetRect() const +{ + wxASSERT(m_region.m_refData); + const Box *box = M_REGIONDATA_OF(m_region)->GetBox(m_current); + wxASSERT(box); + return wxRect + ( box->x1 + , box->y1 + , box->x2 - box->x1 + , box->y2 - box->y1 + ); +} + +long wxRegionIteratorGeneric::GetX() const +{ + wxASSERT(m_region.m_refData); + const Box *box = M_REGIONDATA_OF(m_region)->GetBox(m_current); + wxASSERT(box); + return box->x1; +} + +long wxRegionIteratorGeneric::GetY() const +{ + wxASSERT(m_region.m_refData); + const Box *box = M_REGIONDATA_OF(m_region)->GetBox(m_current); + wxASSERT(box); + return box->y1; +} + +long wxRegionIteratorGeneric::GetW() const +{ + wxASSERT(m_region.m_refData); + const Box *box = M_REGIONDATA_OF(m_region)->GetBox(m_current); + wxASSERT(box); + return box->x2 - box->x1; +} + +long wxRegionIteratorGeneric::GetH() const +{ + wxASSERT(m_region.m_refData); + const Box *box = M_REGIONDATA_OF(m_region)->GetBox(m_current); + wxASSERT(box); + return box->y2 - box->y1; +} + +wxRegionIteratorGeneric::~wxRegionIteratorGeneric() +{ +} + + +// ======================================================================== +// The guts (from X.org) +// ======================================================================== + +/************************************************************************ + +Copyright 1987, 1988, 1998 The Open Group + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation. + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +OPEN GROUP 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. + +Except as contained in this notice, the name of The Open Group shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from The Open Group. + + +Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of Digital not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +************************************************************************/ + +/* 1 if two BOXs overlap. + * 0 if two BOXs do not overlap. + * Remember, x2 and y2 are not in the region + */ +#define EXTENTCHECK(r1, r2) \ + ((r1)->x2 > (r2)->x1 && \ + (r1)->x1 < (r2)->x2 && \ + (r1)->y2 > (r2)->y1 && \ + (r1)->y1 < (r2)->y2) + +/* + * Check to see if there is enough memory in the present region. + */ +#define MEMCHECK(reg, rect, firstrect){\ + if ((reg)->numRects >= ((reg)->size - 1)){\ + (firstrect) = (BOX *) realloc \ + ((char *)(firstrect), (unsigned) (2 * (sizeof(BOX)) * ((reg)->size)));\ + if ((firstrect) == 0)\ + return(0);\ + (reg)->size *= 2;\ + (rect) = &(firstrect)[(reg)->numRects];\ + }\ + } + +#define EMPTY_REGION(pReg) pReg->numRects = 0 + +#define REGION_NOT_EMPTY(pReg) pReg->numRects + +#define INBOX(r, x, y) \ + ( ( ((r).x2 > x)) && \ + ( ((r).x1 <= x)) && \ + ( ((r).y2 > y)) && \ + ( ((r).y1 <= y)) ) + +/* + * The functions in this file implement the Region abstraction, similar to one + * used in the X11 sample server. A Region is simply an area, as the name + * implies, and is implemented as a "y-x-banded" array of rectangles. To + * explain: Each Region is made up of a certain number of rectangles sorted + * by y coordinate first, and then by x coordinate. + * + * Furthermore, the rectangles are banded such that every rectangle with a + * given upper-left y coordinate (y1) will have the same lower-right y + * coordinate (y2) and vice versa. If a rectangle has scanlines in a band, it + * will span the entire vertical distance of the band. This means that some + * areas that could be merged into a taller rectangle will be represented as + * several shorter rectangles to account for shorter rectangles to its left + * or right but within its "vertical scope". + * + * An added constraint on the rectangles is that they must cover as much + * horizontal area as possible. E.g. no two rectangles in a band are allowed + * to touch. + * + * Whenever possible, bands will be merged together to cover a greater vertical + * distance (and thus reduce the number of rectangles). Two bands can be merged + * only if the bottom of one touches the top of the other and they have + * rectangles in the same places (of the same width, of course). This maintains + * the y-x-banding that's so nice to have... + */ + +/* Create a new empty region */ +Region REGION::XCreateRegion(void) +{ + Region temp = new REGION; + + if (!temp) + return (Region) NULL; + + temp->rects = ( BOX * )malloc( (unsigned) sizeof( BOX )); + + if (!temp->rects) + { + free((char *) temp); + return (Region) NULL; + } + temp->numRects = 0; + temp->extents.x1 = 0; + temp->extents.y1 = 0; + temp->extents.x2 = 0; + temp->extents.y2 = 0; + temp->size = 1; + return( temp ); +} + +bool REGION::XClipBox(Region r, wxRect *rect) +{ + rect->x = r->extents.x1; + rect->y = r->extents.y1; + rect->width = r->extents.x2 - r->extents.x1; + rect->height = r->extents.y2 - r->extents.y1; + return true; +} + +/*- + *----------------------------------------------------------------------- + * miSetExtents -- + * Reset the extents of a region to what they should be. Called by + * miSubtract and miIntersect b/c they can't figure it out along the + * way or do so easily, as miUnion can. + * + * Results: + * None. + * + * Side Effects: + * The region's 'extents' structure is overwritten. + * + *----------------------------------------------------------------------- + */ +void REGION:: +miSetExtents (Region pReg) +{ + register BoxPtr pBox, + pBoxEnd, + pExtents; + + if (pReg->numRects == 0) + { + pReg->extents.x1 = 0; + pReg->extents.y1 = 0; + pReg->extents.x2 = 0; + pReg->extents.y2 = 0; + return; + } + + pExtents = &pReg->extents; + pBox = pReg->rects; + pBoxEnd = &pBox[pReg->numRects - 1]; + + /* + * Since pBox is the first rectangle in the region, it must have the + * smallest y1 and since pBoxEnd is the last rectangle in the region, + * it must have the largest y2, because of banding. Initialize x1 and + * x2 from pBox and pBoxEnd, resp., as good things to initialize them + * to... + */ + pExtents->x1 = pBox->x1; + pExtents->y1 = pBox->y1; + pExtents->x2 = pBoxEnd->x2; + pExtents->y2 = pBoxEnd->y2; + + assert(pExtents->y1 < pExtents->y2); + while (pBox <= pBoxEnd) + { + if (pBox->x1 < pExtents->x1) + { + pExtents->x1 = pBox->x1; + } + if (pBox->x2 > pExtents->x2) + { + pExtents->x2 = pBox->x2; + } + pBox++; + } + assert(pExtents->x1 < pExtents->x2); +} + +bool REGION:: +XDestroyRegion( + Region r) +{ + free( (char *) r->rects ); + delete r; + return true; +} + +/* TranslateRegion(pRegion, x, y) + translates in place + added by raymond +*/ + +bool REGION:: +XOffsetRegion( + register Region pRegion, + register int x, + register int y) +{ + register int nbox; + register BOX *pbox; + + pbox = pRegion->rects; + nbox = pRegion->numRects; + + while(nbox--) + { + pbox->x1 += x; + pbox->x2 += x; + pbox->y1 += y; + pbox->y2 += y; + pbox++; + } + pRegion->extents.x1 += x; + pRegion->extents.x2 += x; + pRegion->extents.y1 += y; + pRegion->extents.y2 += y; + return 1; +} + +/*====================================================================== + * Region Intersection + *====================================================================*/ +/*- + *----------------------------------------------------------------------- + * miIntersectO -- + * Handle an overlapping band for miIntersect. + * + * Results: + * None. + * + * Side Effects: + * Rectangles may be added to the region. + * + *----------------------------------------------------------------------- + */ +/* static void*/ +int REGION:: +miIntersectO ( + register Region pReg, + register BoxPtr r1, + BoxPtr r1End, + register BoxPtr r2, + BoxPtr r2End, + wxCoord y1, + wxCoord y2) +{ + register wxCoord x1; + register wxCoord x2; + register BoxPtr pNextRect; + + pNextRect = &pReg->rects[pReg->numRects]; + + while ((r1 != r1End) && (r2 != r2End)) + { + x1 = wxMax(r1->x1,r2->x1); + x2 = wxMin(r1->x2,r2->x2); + + /* + * If there's any overlap between the two rectangles, add that + * overlap to the new region. + * There's no need to check for subsumption because the only way + * such a need could arise is if some region has two rectangles + * right next to each other. Since that should never happen... + */ + if (x1 < x2) + { + assert(y1rects); + pNextRect->x1 = x1; + pNextRect->y1 = y1; + pNextRect->x2 = x2; + pNextRect->y2 = y2; + pReg->numRects += 1; + pNextRect++; + assert(pReg->numRects <= pReg->size); + } + + /* + * Need to advance the pointers. Shift the one that extends + * to the right the least, since the other still has a chance to + * overlap with that region's next rectangle, if you see what I mean. + */ + if (r1->x2 < r2->x2) + { + r1++; + } + else if (r2->x2 < r1->x2) + { + r2++; + } + else + { + r1++; + r2++; + } + } + return 0; /* lint */ +} + +bool REGION:: +XIntersectRegion( + Region reg1, + Region reg2, /* source regions */ + register Region newReg) /* destination Region */ +{ + /* check for trivial reject */ + if ( (!(reg1->numRects)) || (!(reg2->numRects)) || + (!EXTENTCHECK(®1->extents, ®2->extents))) + newReg->numRects = 0; + else + miRegionOp (newReg, reg1, reg2, + miIntersectO, NULL, NULL); + + /* + * Can't alter newReg's extents before we call miRegionOp because + * it might be one of the source regions and miRegionOp depends + * on the extents of those regions being the same. Besides, this + * way there's no checking against rectangles that will be nuked + * due to coalescing, so we have to examine fewer rectangles. + */ + miSetExtents(newReg); + return 1; +} + +void REGION:: +miRegionCopy( + register Region dstrgn, + register Region rgn) + +{ + if (dstrgn != rgn) /* don't want to copy to itself */ + { + if (dstrgn->size < rgn->numRects) + { + if (dstrgn->rects) + { + BOX *prevRects = dstrgn->rects; + + dstrgn->rects = (BOX *) + realloc((char *) dstrgn->rects, + (unsigned) rgn->numRects * (sizeof(BOX))); + if (!dstrgn->rects) + { + free(prevRects); + return; + } + } + dstrgn->size = rgn->numRects; + } + dstrgn->numRects = rgn->numRects; + dstrgn->extents.x1 = rgn->extents.x1; + dstrgn->extents.y1 = rgn->extents.y1; + dstrgn->extents.x2 = rgn->extents.x2; + dstrgn->extents.y2 = rgn->extents.y2; + + memcpy((char *) dstrgn->rects, (char *) rgn->rects, + (int) (rgn->numRects * sizeof(BOX))); + } +} + +/*====================================================================== + * Generic Region Operator + *====================================================================*/ + +/*- + *----------------------------------------------------------------------- + * miCoalesce -- + * Attempt to merge the boxes in the current band with those in the + * previous one. Used only by miRegionOp. + * + * Results: + * The new index for the previous band. + * + * Side Effects: + * If coalescing takes place: + * - rectangles in the previous band will have their y2 fields + * altered. + * - pReg->numRects will be decreased. + * + *----------------------------------------------------------------------- + */ +/* static int*/ +int REGION:: +miCoalesce( + register Region pReg, /* Region to coalesce */ + int prevStart, /* Index of start of previous band */ + int curStart) /* Index of start of current band */ +{ + register BoxPtr pPrevBox; /* Current box in previous band */ + register BoxPtr pCurBox; /* Current box in current band */ + register BoxPtr pRegEnd; /* End of region */ + int curNumRects; /* Number of rectangles in current + * band */ + int prevNumRects; /* Number of rectangles in previous + * band */ + int bandY1; /* Y1 coordinate for current band */ + + pRegEnd = &pReg->rects[pReg->numRects]; + + pPrevBox = &pReg->rects[prevStart]; + prevNumRects = curStart - prevStart; + + /* + * Figure out how many rectangles are in the current band. Have to do + * this because multiple bands could have been added in miRegionOp + * at the end when one region has been exhausted. + */ + pCurBox = &pReg->rects[curStart]; + bandY1 = pCurBox->y1; + for (curNumRects = 0; + (pCurBox != pRegEnd) && (pCurBox->y1 == bandY1); + curNumRects++) + { + pCurBox++; + } + + if (pCurBox != pRegEnd) + { + /* + * If more than one band was added, we have to find the start + * of the last band added so the next coalescing job can start + * at the right place... (given when multiple bands are added, + * this may be pointless -- see above). + */ + pRegEnd--; + while (pRegEnd[-1].y1 == pRegEnd->y1) + { + pRegEnd--; + } + curStart = pRegEnd - pReg->rects; + pRegEnd = pReg->rects + pReg->numRects; + } + + if ((curNumRects == prevNumRects) && (curNumRects != 0)) + { + pCurBox -= curNumRects; + /* + * The bands may only be coalesced if the bottom of the previous + * matches the top scanline of the current. + */ + if (pPrevBox->y2 == pCurBox->y1) + { + /* + * Make sure the bands have boxes in the same places. This + * assumes that boxes have been added in such a way that they + * cover the most area possible. I.e. two boxes in a band must + * have some horizontal space between them. + */ + do + { + if ((pPrevBox->x1 != pCurBox->x1) || + (pPrevBox->x2 != pCurBox->x2)) + { + /* + * The bands don't line up so they can't be coalesced. + */ + return (curStart); + } + pPrevBox++; + pCurBox++; + prevNumRects -= 1; + } while (prevNumRects != 0); + + pReg->numRects -= curNumRects; + pCurBox -= curNumRects; + pPrevBox -= curNumRects; + + /* + * The bands may be merged, so set the bottom y of each box + * in the previous band to that of the corresponding box in + * the current band. + */ + do + { + pPrevBox->y2 = pCurBox->y2; + pPrevBox++; + pCurBox++; + curNumRects -= 1; + } while (curNumRects != 0); + + /* + * If only one band was added to the region, we have to backup + * curStart to the start of the previous band. + * + * If more than one band was added to the region, copy the + * other bands down. The assumption here is that the other bands + * came from the same region as the current one and no further + * coalescing can be done on them since it's all been done + * already... curStart is already in the right place. + */ + if (pCurBox == pRegEnd) + { + curStart = prevStart; + } + else + { + do + { + *pPrevBox++ = *pCurBox++; + } while (pCurBox != pRegEnd); + } + + } + } + return (curStart); +} + +/*- + *----------------------------------------------------------------------- + * miRegionOp -- + * Apply an operation to two regions. Called by miUnion, miInverse, + * miSubtract, miIntersect... + * + * Results: + * None. + * + * Side Effects: + * The new region is overwritten. + * + * Notes: + * The idea behind this function is to view the two regions as sets. + * Together they cover a rectangle of area that this function divides + * into horizontal bands where points are covered only by one region + * or by both. For the first case, the nonOverlapFunc is called with + * each the band and the band's upper and lower extents. For the + * second, the overlapFunc is called to process the entire band. It + * is responsible for clipping the rectangles in the band, though + * this function provides the boundaries. + * At the end of each band, the new region is coalesced, if possible, + * to reduce the number of rectangles in the region. + * + *----------------------------------------------------------------------- + */ +/* static void*/ +void REGION:: +miRegionOp( + register Region newReg, /* Place to store result */ + Region reg1, /* First region in operation */ + Region reg2, /* 2d region in operation */ + int (*overlapFunc)( + register Region pReg, + register BoxPtr r1, + BoxPtr r1End, + register BoxPtr r2, + BoxPtr r2End, + wxCoord y1, + wxCoord y2), /* Function to call for over- + * lapping bands */ + int (*nonOverlap1Func)( + register Region pReg, + register BoxPtr r, + BoxPtr rEnd, + register wxCoord y1, + register wxCoord y2), /* Function to call for non- + * overlapping bands in region + * 1 */ + int (*nonOverlap2Func)( + register Region pReg, + register BoxPtr r, + BoxPtr rEnd, + register wxCoord y1, + register wxCoord y2)) /* Function to call for non- + * overlapping bands in region + * 2 */ +{ + register BoxPtr r1; /* Pointer into first region */ + register BoxPtr r2; /* Pointer into 2d region */ + BoxPtr r1End; /* End of 1st region */ + BoxPtr r2End; /* End of 2d region */ + register wxCoord ybot; /* Bottom of intersection */ + register wxCoord ytop; /* Top of intersection */ + BoxPtr oldRects; /* Old rects for newReg */ + int prevBand; /* Index of start of + * previous band in newReg */ + int curBand; /* Index of start of current + * band in newReg */ + register BoxPtr r1BandEnd; /* End of current band in r1 */ + register BoxPtr r2BandEnd; /* End of current band in r2 */ + wxCoord top; /* Top of non-overlapping + * band */ + wxCoord bot; /* Bottom of non-overlapping + * band */ + + /* + * Initialization: + * set r1, r2, r1End and r2End appropriately, preserve the important + * parts of the destination region until the end in case it's one of + * the two source regions, then mark the "new" region empty, allocating + * another array of rectangles for it to use. + */ + r1 = reg1->rects; + r2 = reg2->rects; + r1End = r1 + reg1->numRects; + r2End = r2 + reg2->numRects; + + oldRects = newReg->rects; + + EMPTY_REGION(newReg); + + /* + * Allocate a reasonable number of rectangles for the new region. The idea + * is to allocate enough so the individual functions don't need to + * reallocate and copy the array, which is time consuming, yet we don't + * have to worry about using too much memory. I hope to be able to + * nuke the realloc() at the end of this function eventually. + */ + newReg->size = wxMax(reg1->numRects,reg2->numRects) * 2; + + newReg->rects = (BoxPtr)malloc((unsigned) (sizeof(BoxRec) * newReg->size)); + + if (!newReg->rects) + { + newReg->size = 0; + return; + } + + /* + * Initialize ybot and ytop. + * In the upcoming loop, ybot and ytop serve different functions depending + * on whether the band being handled is an overlapping or non-overlapping + * band. + * In the case of a non-overlapping band (only one of the regions + * has points in the band), ybot is the bottom of the most recent + * intersection and thus clips the top of the rectangles in that band. + * ytop is the top of the next intersection between the two regions and + * serves to clip the bottom of the rectangles in the current band. + * For an overlapping band (where the two regions intersect), ytop clips + * the top of the rectangles of both regions and ybot clips the bottoms. + */ + if (reg1->extents.y1 < reg2->extents.y1) + ybot = reg1->extents.y1; + else + ybot = reg2->extents.y1; + + /* + * prevBand serves to mark the start of the previous band so rectangles + * can be coalesced into larger rectangles. qv. miCoalesce, above. + * In the beginning, there is no previous band, so prevBand == curBand + * (curBand is set later on, of course, but the first band will always + * start at index 0). prevBand and curBand must be indices because of + * the possible expansion, and resultant moving, of the new region's + * array of rectangles. + */ + prevBand = 0; + + do + { + curBand = newReg->numRects; + + /* + * This algorithm proceeds one source-band (as opposed to a + * destination band, which is determined by where the two regions + * intersect) at a time. r1BandEnd and r2BandEnd serve to mark the + * rectangle after the last one in the current band for their + * respective regions. + */ + r1BandEnd = r1; + while ((r1BandEnd != r1End) && (r1BandEnd->y1 == r1->y1)) + { + r1BandEnd++; + } + + r2BandEnd = r2; + while ((r2BandEnd != r2End) && (r2BandEnd->y1 == r2->y1)) + { + r2BandEnd++; + } + + /* + * First handle the band that doesn't intersect, if any. + * + * Note that attention is restricted to one band in the + * non-intersecting region at once, so if a region has n + * bands between the current position and the next place it overlaps + * the other, this entire loop will be passed through n times. + */ + if (r1->y1 < r2->y1) + { + top = wxMax(r1->y1,ybot); + bot = wxMin(r1->y2,r2->y1); + + if ((top != bot) && (nonOverlap1Func != NULL)) + { + (* nonOverlap1Func) (newReg, r1, r1BandEnd, top, bot); + } + + ytop = r2->y1; + } + else if (r2->y1 < r1->y1) + { + top = wxMax(r2->y1,ybot); + bot = wxMin(r2->y2,r1->y1); + + if ((top != bot) && (nonOverlap2Func != NULL)) + { + (* nonOverlap2Func) (newReg, r2, r2BandEnd, top, bot); + } + + ytop = r1->y1; + } + else + { + ytop = r1->y1; + } + + /* + * If any rectangles got added to the region, try and coalesce them + * with rectangles from the previous band. Note we could just do + * this test in miCoalesce, but some machines incur a not + * inconsiderable cost for function calls, so... + */ + if (newReg->numRects != curBand) + { + prevBand = miCoalesce (newReg, prevBand, curBand); + } + + /* + * Now see if we've hit an intersecting band. The two bands only + * intersect if ybot > ytop + */ + ybot = wxMin(r1->y2, r2->y2); + curBand = newReg->numRects; + if (ybot > ytop) + { + (* overlapFunc) (newReg, r1, r1BandEnd, r2, r2BandEnd, ytop, ybot); + + } + + if (newReg->numRects != curBand) + { + prevBand = miCoalesce (newReg, prevBand, curBand); + } + + /* + * If we've finished with a band (y2 == ybot) we skip forward + * in the region to the next band. + */ + if (r1->y2 == ybot) + { + r1 = r1BandEnd; + } + if (r2->y2 == ybot) + { + r2 = r2BandEnd; + } + } while ((r1 != r1End) && (r2 != r2End)); + + /* + * Deal with whichever region still has rectangles left. + */ + curBand = newReg->numRects; + if (r1 != r1End) + { + if (nonOverlap1Func != NULL) + { + do + { + r1BandEnd = r1; + while ((r1BandEnd < r1End) && (r1BandEnd->y1 == r1->y1)) + { + r1BandEnd++; + } + (* nonOverlap1Func) (newReg, r1, r1BandEnd, + wxMax(r1->y1,ybot), r1->y2); + r1 = r1BandEnd; + } while (r1 != r1End); + } + } + else if ((r2 != r2End) && (nonOverlap2Func != NULL)) + { + do + { + r2BandEnd = r2; + while ((r2BandEnd < r2End) && (r2BandEnd->y1 == r2->y1)) + { + r2BandEnd++; + } + (* nonOverlap2Func) (newReg, r2, r2BandEnd, + wxMax(r2->y1,ybot), r2->y2); + r2 = r2BandEnd; + } while (r2 != r2End); + } + + if (newReg->numRects != curBand) + { + (void) miCoalesce (newReg, prevBand, curBand); + } + + /* + * A bit of cleanup. To keep regions from growing without bound, + * we shrink the array of rectangles to match the new number of + * rectangles in the region. This never goes to 0, however... + * + * Only do this stuff if the number of rectangles allocated is more than + * twice the number of rectangles in the region (a simple optimization...). + */ + if (newReg->numRects < (newReg->size >> 1)) + { + if (REGION_NOT_EMPTY(newReg)) + { + BoxPtr prev_rects = newReg->rects; + newReg->size = newReg->numRects; + newReg->rects = (BoxPtr) realloc ((char *) newReg->rects, + (unsigned) (sizeof(BoxRec) * newReg->size)); + if (! newReg->rects) + newReg->rects = prev_rects; + } + else + { + /* + * No point in doing the extra work involved in an realloc if + * the region is empty + */ + newReg->size = 1; + free((char *) newReg->rects); + newReg->rects = (BoxPtr) malloc(sizeof(BoxRec)); + } + } + free ((char *) oldRects); + return; +} + +/*====================================================================== + * Region Union + *====================================================================*/ + +/*- + *----------------------------------------------------------------------- + * miUnionNonO -- + * Handle a non-overlapping band for the union operation. Just + * Adds the rectangles into the region. Doesn't have to check for + * subsumption or anything. + * + * Results: + * None. + * + * Side Effects: + * pReg->numRects is incremented and the final rectangles overwritten + * with the rectangles we're passed. + * + *----------------------------------------------------------------------- + */ +/* static void*/ +int REGION:: +miUnionNonO ( + register Region pReg, + register BoxPtr r, + BoxPtr rEnd, + register wxCoord y1, + register wxCoord y2) +{ + register BoxPtr pNextRect; + + pNextRect = &pReg->rects[pReg->numRects]; + + assert(y1 < y2); + + while (r != rEnd) + { + assert(r->x1 < r->x2); + MEMCHECK(pReg, pNextRect, pReg->rects); + pNextRect->x1 = r->x1; + pNextRect->y1 = y1; + pNextRect->x2 = r->x2; + pNextRect->y2 = y2; + pReg->numRects += 1; + pNextRect++; + + assert(pReg->numRects<=pReg->size); + r++; + } + return 0; /* lint */ +} + + +/*- + *----------------------------------------------------------------------- + * miUnionO -- + * Handle an overlapping band for the union operation. Picks the + * left-most rectangle each time and merges it into the region. + * + * Results: + * None. + * + * Side Effects: + * Rectangles are overwritten in pReg->rects and pReg->numRects will + * be changed. + * + *----------------------------------------------------------------------- + */ + +/* static void*/ +int REGION:: +miUnionO ( + register Region pReg, + register BoxPtr r1, + BoxPtr r1End, + register BoxPtr r2, + BoxPtr r2End, + register wxCoord y1, + register wxCoord y2) +{ + register BoxPtr pNextRect; + + pNextRect = &pReg->rects[pReg->numRects]; + +#define MERGERECT(r) \ + if ((pReg->numRects != 0) && \ + (pNextRect[-1].y1 == y1) && \ + (pNextRect[-1].y2 == y2) && \ + (pNextRect[-1].x2 >= r->x1)) \ + { \ + if (pNextRect[-1].x2 < r->x2) \ + { \ + pNextRect[-1].x2 = r->x2; \ + assert(pNextRect[-1].x1rects); \ + pNextRect->y1 = y1; \ + pNextRect->y2 = y2; \ + pNextRect->x1 = r->x1; \ + pNextRect->x2 = r->x2; \ + pReg->numRects += 1; \ + pNextRect += 1; \ + } \ + assert(pReg->numRects<=pReg->size);\ + r++; + + assert (y1x1 < r2->x1) + { + MERGERECT(r1); + } + else + { + MERGERECT(r2); + } + } + + if (r1 != r1End) + { + do + { + MERGERECT(r1); + } while (r1 != r1End); + } + else while (r2 != r2End) + { + MERGERECT(r2); + } + return 0; /* lint */ +} + +bool REGION:: +XUnionRegion( + Region reg1, + Region reg2, /* source regions */ + Region newReg) /* destination Region */ +{ + /* checks all the simple cases */ + + /* + * Region 1 and 2 are the same or region 1 is empty + */ + if ( (reg1 == reg2) || (!(reg1->numRects)) ) + { + if (newReg != reg2) + miRegionCopy(newReg, reg2); + return 1; + } + + /* + * if nothing to union (region 2 empty) + */ + if (!(reg2->numRects)) + { + if (newReg != reg1) + miRegionCopy(newReg, reg1); + return 1; + } + + /* + * Region 1 completely subsumes region 2 + */ + if ((reg1->numRects == 1) && + (reg1->extents.x1 <= reg2->extents.x1) && + (reg1->extents.y1 <= reg2->extents.y1) && + (reg1->extents.x2 >= reg2->extents.x2) && + (reg1->extents.y2 >= reg2->extents.y2)) + { + if (newReg != reg1) + miRegionCopy(newReg, reg1); + return 1; + } + + /* + * Region 2 completely subsumes region 1 + */ + if ((reg2->numRects == 1) && + (reg2->extents.x1 <= reg1->extents.x1) && + (reg2->extents.y1 <= reg1->extents.y1) && + (reg2->extents.x2 >= reg1->extents.x2) && + (reg2->extents.y2 >= reg1->extents.y2)) + { + if (newReg != reg2) + miRegionCopy(newReg, reg2); + return 1; + } + + miRegionOp (newReg, reg1, reg2, miUnionO, + miUnionNonO, miUnionNonO); + + newReg->extents.x1 = wxMin(reg1->extents.x1, reg2->extents.x1); + newReg->extents.y1 = wxMin(reg1->extents.y1, reg2->extents.y1); + newReg->extents.x2 = wxMax(reg1->extents.x2, reg2->extents.x2); + newReg->extents.y2 = wxMax(reg1->extents.y2, reg2->extents.y2); + + return 1; +} + +/*====================================================================== + * Region Subtraction + *====================================================================*/ + +/*- + *----------------------------------------------------------------------- + * miSubtractNonO -- + * Deal with non-overlapping band for subtraction. Any parts from + * region 2 we discard. Anything from region 1 we add to the region. + * + * Results: + * None. + * + * Side Effects: + * pReg may be affected. + * + *----------------------------------------------------------------------- + */ +/* static void*/ +int REGION:: +miSubtractNonO1 ( + register Region pReg, + register BoxPtr r, + BoxPtr rEnd, + register wxCoord y1, + register wxCoord y2) +{ + register BoxPtr pNextRect; + + pNextRect = &pReg->rects[pReg->numRects]; + + assert(y1x1x2); + MEMCHECK(pReg, pNextRect, pReg->rects); + pNextRect->x1 = r->x1; + pNextRect->y1 = y1; + pNextRect->x2 = r->x2; + pNextRect->y2 = y2; + pReg->numRects += 1; + pNextRect++; + + assert(pReg->numRects <= pReg->size); + + r++; + } + return 0; /* lint */ +} + +/*- + *----------------------------------------------------------------------- + * miSubtractO -- + * Overlapping band subtraction. x1 is the left-most point not yet + * checked. + * + * Results: + * None. + * + * Side Effects: + * pReg may have rectangles added to it. + * + *----------------------------------------------------------------------- + */ +/* static void*/ +int REGION:: +miSubtractO ( + register Region pReg, + register BoxPtr r1, + BoxPtr r1End, + register BoxPtr r2, + BoxPtr r2End, + register wxCoord y1, + register wxCoord y2) +{ + register BoxPtr pNextRect; + register int x1; + + x1 = r1->x1; + + assert(y1rects[pReg->numRects]; + + while ((r1 != r1End) && (r2 != r2End)) + { + if (r2->x2 <= x1) + { + /* + * Subtrahend missed the boat: go to next subtrahend. + */ + r2++; + } + else if (r2->x1 <= x1) + { + /* + * Subtrahend preceeds minuend: nuke left edge of minuend. + */ + x1 = r2->x2; + if (x1 >= r1->x2) + { + /* + * Minuend completely covered: advance to next minuend and + * reset left fence to edge of new minuend. + */ + r1++; + if (r1 != r1End) + x1 = r1->x1; + } + else + { + /* + * Subtrahend now used up since it doesn't extend beyond + * minuend + */ + r2++; + } + } + else if (r2->x1 < r1->x2) + { + /* + * Left part of subtrahend covers part of minuend: add uncovered + * part of minuend to region and skip to next subtrahend. + */ + assert(x1x1); + MEMCHECK(pReg, pNextRect, pReg->rects); + pNextRect->x1 = x1; + pNextRect->y1 = y1; + pNextRect->x2 = r2->x1; + pNextRect->y2 = y2; + pReg->numRects += 1; + pNextRect++; + + assert(pReg->numRects<=pReg->size); + + x1 = r2->x2; + if (x1 >= r1->x2) + { + /* + * Minuend used up: advance to new... + */ + r1++; + if (r1 != r1End) + x1 = r1->x1; + } + else + { + /* + * Subtrahend used up + */ + r2++; + } + } + else + { + /* + * Minuend used up: add any remaining piece before advancing. + */ + if (r1->x2 > x1) + { + MEMCHECK(pReg, pNextRect, pReg->rects); + pNextRect->x1 = x1; + pNextRect->y1 = y1; + pNextRect->x2 = r1->x2; + pNextRect->y2 = y2; + pReg->numRects += 1; + pNextRect++; + assert(pReg->numRects<=pReg->size); + } + r1++; + if (r1 != r1End) + x1 = r1->x1; + } + } + + /* + * Add remaining minuend rectangles to region. + */ + while (r1 != r1End) + { + assert(x1x2); + MEMCHECK(pReg, pNextRect, pReg->rects); + pNextRect->x1 = x1; + pNextRect->y1 = y1; + pNextRect->x2 = r1->x2; + pNextRect->y2 = y2; + pReg->numRects += 1; + pNextRect++; + + assert(pReg->numRects<=pReg->size); + + r1++; + if (r1 != r1End) + { + x1 = r1->x1; + } + } + return 0; /* lint */ +} + +/*- + *----------------------------------------------------------------------- + * miSubtract -- + * Subtract regS from regM and leave the result in regD. + * S stands for subtrahend, M for minuend and D for difference. + * + * Results: + * true. + * + * Side Effects: + * regD is overwritten. + * + *----------------------------------------------------------------------- + */ + +bool REGION::XSubtractRegion(Region regM, Region regS, register Region regD) +{ + /* check for trivial reject */ + if ( (!(regM->numRects)) || (!(regS->numRects)) || + (!EXTENTCHECK(®M->extents, ®S->extents)) ) + { + miRegionCopy(regD, regM); + return true; + } + + miRegionOp (regD, regM, regS, miSubtractO, + miSubtractNonO1, NULL); + + /* + * Can't alter newReg's extents before we call miRegionOp because + * it might be one of the source regions and miRegionOp depends + * on the extents of those regions being the unaltered. Besides, this + * way there's no checking against rectangles that will be nuked + * due to coalescing, so we have to examine fewer rectangles. + */ + miSetExtents (regD); + return true; +} + +bool REGION::XXorRegion(Region sra, Region srb, Region dr) +{ + Region tra = XCreateRegion(); + + wxCHECK_MSG( tra, false, wxT("region not created") ); + + Region trb = XCreateRegion(); + + wxCHECK_MSG( trb, false, wxT("region not created") ); + + (void) XSubtractRegion(sra,srb,tra); + (void) XSubtractRegion(srb,sra,trb); + (void) XUnionRegion(tra,trb,dr); + XDestroyRegion(tra); + XDestroyRegion(trb); + return 0; +} + +/* + * Check to see if the region is empty. Assumes a region is passed + * as a parameter + */ +bool REGION::XEmptyRegion(Region r) +{ + if( r->numRects == 0 ) return true; + else return false; +} + +/* + * Check to see if two regions are equal + */ +bool REGION::XEqualRegion(Region r1, Region r2) +{ + int i; + + if( r1->numRects != r2->numRects ) return false; + else if( r1->numRects == 0 ) return true; + else if ( r1->extents.x1 != r2->extents.x1 ) return false; + else if ( r1->extents.x2 != r2->extents.x2 ) return false; + else if ( r1->extents.y1 != r2->extents.y1 ) return false; + else if ( r1->extents.y2 != r2->extents.y2 ) return false; + else for( i=0; i < r1->numRects; i++ ) { + if ( r1->rects[i].x1 != r2->rects[i].x1 ) return false; + else if ( r1->rects[i].x2 != r2->rects[i].x2 ) return false; + else if ( r1->rects[i].y1 != r2->rects[i].y1 ) return false; + else if ( r1->rects[i].y2 != r2->rects[i].y2 ) return false; + } + return true; +} + +bool REGION::XPointInRegion(Region pRegion, int x, int y) +{ + int i; + + if (pRegion->numRects == 0) + return false; + if (!INBOX(pRegion->extents, x, y)) + return false; + for (i=0; inumRects; i++) + { + if (INBOX (pRegion->rects[i], x, y)) + return true; + } + return false; +} + +wxRegionContain REGION::XRectInRegion(register Region region, + int rx, int ry, + unsigned int rwidth, + unsigned int rheight) +{ + register BoxPtr pbox; + register BoxPtr pboxEnd; + Box rect; + register BoxPtr prect = ▭ + int partIn, partOut; + + prect->x1 = rx; + prect->y1 = ry; + prect->x2 = rwidth + rx; + prect->y2 = rheight + ry; + + /* this is (just) a useful optimization */ + if ((region->numRects == 0) || !EXTENTCHECK(®ion->extents, prect)) + return(wxOutRegion); + + partOut = false; + partIn = false; + + /* can stop when both partOut and partIn are true, or we reach prect->y2 */ + for (pbox = region->rects, pboxEnd = pbox + region->numRects; + pbox < pboxEnd; + pbox++) + { + + if (pbox->y2 <= ry) + continue; /* getting up to speed or skipping remainder of band */ + + if (pbox->y1 > ry) + { + partOut = true; /* missed part of rectangle above */ + if (partIn || (pbox->y1 >= prect->y2)) + break; + ry = pbox->y1; /* x guaranteed to be == prect->x1 */ + } + + if (pbox->x2 <= rx) + continue; /* not far enough over yet */ + + if (pbox->x1 > rx) + { + partOut = true; /* missed part of rectangle to left */ + if (partIn) + break; + } + + if (pbox->x1 < prect->x2) + { + partIn = true; /* definitely overlap */ + if (partOut) + break; + } + + if (pbox->x2 >= prect->x2) + { + ry = pbox->y2; /* finished with this band */ + if (ry >= prect->y2) + break; + rx = prect->x1; /* reset x out to left again */ + } else + { + /* + * Because boxes in a band are maximal width, if the first box + * to overlap the rectangle doesn't completely cover it in that + * band, the rectangle must be partially out, since some of it + * will be uncovered in that band. partIn will have been set true + * by now... + */ + break; + } + + } + + return(partIn ? ((ry < prect->y2) ? wxPartRegion : wxInRegion) : + wxOutRegion); +} diff --git a/Externals/wxWidgets/src/generic/renderg.cpp b/Externals/wxWidgets/src/generic/renderg.cpp new file mode 100644 index 0000000000..8c36e31d19 --- /dev/null +++ b/Externals/wxWidgets/src/generic/renderg.cpp @@ -0,0 +1,678 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/generic/renderg.cpp +// Purpose: generic implementation of wxRendererNative (for any platform) +// Author: Vadim Zeitlin +// Modified by: +// Created: 20.07.2003 +// RCS-ID: $Id: renderg.cpp 45498 2007-04-16 13:03:05Z VZ $ +// Copyright: (c) 2003 Vadim Zeitlin +// License: wxWindows license +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// for compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#include "wx/renderer.h" + +#ifndef WX_PRECOMP + #include "wx/string.h" + #include "wx/dc.h" + #include "wx/settings.h" + #include "wx/gdicmn.h" + #include "wx/module.h" +#endif //WX_PRECOMP + +#include "wx/splitter.h" +#include "wx/dcmirror.h" + +// ---------------------------------------------------------------------------- +// wxRendererGeneric: our wxRendererNative implementation +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxRendererGeneric : public wxRendererNative +{ +public: + wxRendererGeneric(); + + virtual int DrawHeaderButton(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags = 0, + wxHeaderSortIconType sortArrow = wxHDR_SORT_ICON_NONE, + wxHeaderButtonParams* params = NULL); + + virtual int DrawHeaderButtonContents(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags = 0, + wxHeaderSortIconType sortArrow = wxHDR_SORT_ICON_NONE, + wxHeaderButtonParams* params = NULL); + + virtual int GetHeaderButtonHeight(wxWindow *win); + + virtual void DrawTreeItemButton(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags = 0); + + virtual void DrawSplitterBorder(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags = 0); + + virtual void DrawSplitterSash(wxWindow *win, + wxDC& dc, + const wxSize& size, + wxCoord position, + wxOrientation orient, + int flags = 0); + + virtual void DrawComboBoxDropButton(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags = 0); + + virtual void DrawDropArrow(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags = 0); + + virtual void DrawCheckBox(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags = 0); + + virtual void DrawPushButton(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags = 0); + + virtual void DrawItemSelectionRect(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags = 0); + + virtual wxSplitterRenderParams GetSplitterParams(const wxWindow *win); + + virtual wxRendererVersion GetVersion() const + { + return wxRendererVersion(wxRendererVersion::Current_Version, + wxRendererVersion::Current_Age); + } + + + // Cleanup by deleting standard renderer + static void Cleanup(); + + // Get the generic object + static wxRendererGeneric* DoGetGeneric(); + +protected: + // draw the rectange using the first pen for the left and top sides and + // the second one for the bottom and right ones + void DrawShadedRect(wxDC& dc, wxRect *rect, + const wxPen& pen1, const wxPen& pen2); + + // the standard pens + wxPen m_penBlack, + m_penDarkGrey, + m_penLightGrey, + m_penHighlight; + + static wxRendererGeneric* sm_rendererGeneric; +}; + +// ============================================================================ +// wxRendererGeneric implementation +// ============================================================================ + +// Get the generic object +wxRendererGeneric* wxRendererGeneric::DoGetGeneric() +{ + if (!sm_rendererGeneric) + sm_rendererGeneric = new wxRendererGeneric; + return sm_rendererGeneric; +} + +// ---------------------------------------------------------------------------- +// wxRendererGeneric creation +// ---------------------------------------------------------------------------- + +/* static */ +wxRendererNative& wxRendererNative::GetGeneric() +{ + return * wxRendererGeneric::DoGetGeneric(); +} + +void wxRendererGeneric::Cleanup() +{ + if (sm_rendererGeneric) + delete sm_rendererGeneric; + + sm_rendererGeneric = NULL; +} + +wxRendererGeneric* wxRendererGeneric::sm_rendererGeneric = NULL; + +wxRendererGeneric::wxRendererGeneric() + : m_penBlack(wxSystemSettings::GetColour(wxSYS_COLOUR_3DDKSHADOW)), + m_penDarkGrey(wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW)), + m_penLightGrey(wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE)), + m_penHighlight(wxSystemSettings::GetColour(wxSYS_COLOUR_3DHIGHLIGHT)) +{ +} + +// ---------------------------------------------------------------------------- +// wxRendererGeneric helpers +// ---------------------------------------------------------------------------- + +void +wxRendererGeneric::DrawShadedRect(wxDC& dc, + wxRect *rect, + const wxPen& pen1, + const wxPen& pen2) +{ + // draw the rectangle + dc.SetPen(pen1); + dc.DrawLine(rect->GetLeft(), rect->GetTop(), + rect->GetLeft(), rect->GetBottom()); + dc.DrawLine(rect->GetLeft() + 1, rect->GetTop(), + rect->GetRight(), rect->GetTop()); + dc.SetPen(pen2); + dc.DrawLine(rect->GetRight(), rect->GetTop(), + rect->GetRight(), rect->GetBottom()); + dc.DrawLine(rect->GetLeft(), rect->GetBottom(), + rect->GetRight() + 1, rect->GetBottom()); + + // adjust the rect + rect->Inflate(-1); +} + +// ---------------------------------------------------------------------------- +// tree/list ctrl drawing +// ---------------------------------------------------------------------------- + +int +wxRendererGeneric::DrawHeaderButton(wxWindow* win, + wxDC& dc, + const wxRect& rect, + int flags, + wxHeaderSortIconType sortArrow, + wxHeaderButtonParams* params) +{ + const int CORNER = 1; + + const wxCoord x = rect.x, + y = rect.y, + w = rect.width, + h = rect.height; + + dc.SetBrush(wxBrush(wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE))); + dc.SetPen(*wxTRANSPARENT_PEN); + dc.DrawRectangle(rect); + + dc.SetBrush(*wxTRANSPARENT_BRUSH); + + dc.SetPen(m_penBlack); + dc.DrawLine( x+w-CORNER+1, y, x+w, y+h ); // right (outer) + dc.DrawRectangle( x, y+h, w+1, 1 ); // bottom (outer) + + dc.SetPen(m_penDarkGrey); + dc.DrawLine( x+w-CORNER, y, x+w-1, y+h ); // right (inner) + dc.DrawRectangle( x+1, y+h-1, w-2, 1 ); // bottom (inner) + + dc.SetPen(m_penHighlight); + dc.DrawRectangle( x, y, w-CORNER+1, 1 ); // top (outer) + dc.DrawRectangle( x, y, 1, h ); // left (outer) + dc.DrawLine( x, y+h-1, x+1, y+h-1 ); + dc.DrawLine( x+w-1, y, x+w-1, y+1 ); + + return DrawHeaderButtonContents(win, dc, rect, flags, sortArrow, params); +} + + +int +wxRendererGeneric::DrawHeaderButtonContents(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags, + wxHeaderSortIconType sortArrow, + wxHeaderButtonParams* params) +{ + int labelWidth = 0; + + // Mark this item as selected. For the generic version we'll just draw an + // underline + if ( flags & wxCONTROL_SELECTED ) + { + // draw a line at the bottom of the header button, overlaying the + // native hot-tracking line (on XP) + const int penwidth = 3; + int y = rect.y + rect.height + 1 - penwidth; + wxColour c = (params && params->m_selectionColour.Ok()) ? + params->m_selectionColour : wxColour(0x66, 0x66, 0x66); + wxPen pen(c, penwidth); + pen.SetCap(wxCAP_BUTT); + dc.SetPen(pen); + dc.DrawLine(rect.x, y, rect.x + rect.width, y); + } + + // Draw an up or down arrow + int arrowSpace = 0; + if (sortArrow != wxHDR_SORT_ICON_NONE ) + { + wxRect ar = rect; + + // make a rect for the arrow + ar.height = 4; + ar.width = 8; + ar.y += (rect.height - ar.height)/2; + ar.x = ar.x + rect.width - 3*ar.width/2; + arrowSpace = 3*ar.width/2; // space to preserve when drawing the label + + wxPoint triPt[3]; + if ( sortArrow & wxHDR_SORT_ICON_UP ) + { + triPt[0].x = ar.width / 2; + triPt[0].y = 0; + triPt[1].x = ar.width; + triPt[1].y = ar.height; + triPt[2].x = 0; + triPt[2].y = ar.height; + } + else + { + triPt[0].x = 0; + triPt[0].y = 0; + triPt[1].x = ar.width; + triPt[1].y = 0; + triPt[2].x = ar.width / 2; + triPt[2].y = ar.height; + } + + wxColour c = (params && params->m_arrowColour.Ok()) ? + params->m_arrowColour : wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW); + dc.SetPen(wxPen(c)); + dc.SetBrush(wxBrush(c)); + dc.DrawPolygon( 3, triPt, ar.x, ar.y); + } + labelWidth += arrowSpace; + + const int margin = 5; // number of pixels to reserve on either side of the label + int bmpWidth = 0; + int txtEnd = 0; + + if ( params && params->m_labelBitmap.Ok() ) + bmpWidth = params->m_labelBitmap.GetWidth() + 2; + + labelWidth += bmpWidth + 2*margin; + + // Draw a label if one is given + if ( params && !params->m_labelText.empty() ) + { + wxFont font = params->m_labelFont.Ok() ? + params->m_labelFont : win->GetFont(); + wxColour clr = params->m_labelColour.Ok() ? + params->m_labelColour : win->GetForegroundColour(); + + wxString label( params->m_labelText ); + + dc.SetFont(font); + dc.SetTextForeground(clr); + dc.SetBackgroundMode(wxTRANSPARENT); + + int tw, th, td, x, y; + dc.GetTextExtent( label, &tw, &th, &td); + labelWidth += tw; + y = rect.y + wxMax(0, (rect.height - (th+td)) / 2); + + // truncate and add an ellipsis (...) if the text is too wide. + int targetWidth = rect.width - arrowSpace - bmpWidth - 2*margin; + if ( tw > targetWidth ) + { + int ellipsisWidth; + dc.GetTextExtent( wxT("..."), &ellipsisWidth, NULL); + do { + label.Truncate( label.length() - 1 ); + dc.GetTextExtent( label, &tw, &th); + } while (tw + ellipsisWidth > targetWidth && label.length() ); + label.append( wxT("...") ); + tw += ellipsisWidth; + } + + switch (params->m_labelAlignment) + { + default: + case wxALIGN_LEFT: + x = rect.x + margin; + break; + case wxALIGN_CENTER: + x = rect.x + wxMax(0, (rect.width - arrowSpace - tw - bmpWidth)/2); + break; + case wxALIGN_RIGHT: + x = rect.x + wxMax(0, rect.width - arrowSpace - margin - tw - bmpWidth); + break; + } + + dc.DrawText(label, x, y); + txtEnd = x + tw + 2; + } + + // draw the bitmap if there is one + if ( params && params->m_labelBitmap.Ok() ) + { + int w, h, x, y; + w = params->m_labelBitmap.GetWidth(); + h = params->m_labelBitmap.GetHeight(); + + y = rect.y + wxMax(1, (rect.height - h) / 2); + + // if there is a text label, then put the bitmap at the end of the label + if ( txtEnd != 0 ) + { + x = txtEnd; + } + // otherwise use the alignment flags + else + { + switch (params->m_labelAlignment) + { + default: + case wxALIGN_LEFT: + x = rect.x + margin; + break; + case wxALIGN_CENTER: + x = rect.x + wxMax(1, (rect.width - arrowSpace - w)/2); + break; + case wxALIGN_RIGHT: + x = rect.x + wxMax(1, rect.width - arrowSpace - margin - w); + break; + } + } + dc.DrawBitmap(params->m_labelBitmap, x, y, true); + } + return labelWidth; +} + + +int wxRendererGeneric::GetHeaderButtonHeight(wxWindow *win) +{ + // Copied and adapted from src/generic/listctrl.cpp + const int HEADER_OFFSET_Y = 1; + const int EXTRA_HEIGHT = 4; + + int w=0, h=14, d=0; + if (win) + win->GetTextExtent(wxT("Hg"), &w, &h, &d); + + return h + d + 2 * HEADER_OFFSET_Y + EXTRA_HEIGHT; +} + + +// draw the plus or minus sign +void +wxRendererGeneric::DrawTreeItemButton(wxWindow * WXUNUSED(win), + wxDC& dc, + const wxRect& rect, + int flags) +{ + // store settings + wxDCPenChanger penChanger(dc, *wxGREY_PEN); + wxDCBrushChanger brushChanger(dc, *wxWHITE_BRUSH); + + dc.DrawRectangle(rect); + + // black lines + const wxCoord xMiddle = rect.x + rect.width/2; + const wxCoord yMiddle = rect.y + rect.height/2; + + // half of the length of the horz lines in "-" and "+" + const wxCoord halfWidth = rect.width/2 - 2; + dc.SetPen(*wxBLACK_PEN); + dc.DrawLine(xMiddle - halfWidth, yMiddle, + xMiddle + halfWidth + 1, yMiddle); + + if ( !(flags & wxCONTROL_EXPANDED) ) + { + // turn "-" into "+" + const wxCoord halfHeight = rect.height/2 - 2; + dc.DrawLine(xMiddle, yMiddle - halfHeight, + xMiddle, yMiddle + halfHeight + 1); + } +} + +// ---------------------------------------------------------------------------- +// sash drawing +// ---------------------------------------------------------------------------- + +wxSplitterRenderParams +wxRendererGeneric::GetSplitterParams(const wxWindow *win) +{ + // see below + wxCoord sashWidth, + border; + + if ( win->HasFlag(wxSP_3DSASH) ) + sashWidth = 7; + else if ( win->HasFlag(wxSP_NOSASH) ) + sashWidth = 0; + else // no 3D effect + sashWidth = 3; + + if ( win->HasFlag(wxSP_3DBORDER) ) + border = 2; + else // no 3D effect + border = 0; + + return wxSplitterRenderParams(sashWidth, border, false); +} + +void +wxRendererGeneric::DrawSplitterBorder(wxWindow *win, + wxDC& dc, + const wxRect& rectOrig, + int WXUNUSED(falgs)) +{ + if ( win->HasFlag(wxSP_3DBORDER) ) + { + wxRect rect = rectOrig; + DrawShadedRect(dc, &rect, m_penDarkGrey, m_penHighlight); + DrawShadedRect(dc, &rect, m_penBlack, m_penLightGrey); + } +} + +void +wxRendererGeneric::DrawSplitterSash(wxWindow *win, + wxDC& dcReal, + const wxSize& sizeReal, + wxCoord position, + wxOrientation orient, + int WXUNUSED(flags)) +{ + // to avoid duplicating the same code for horizontal and vertical sashes, + // simply mirror the DC instead if needed (i.e. if horz splitter) + wxMirrorDC dc(dcReal, orient != wxVERTICAL); + wxSize size = dc.Reflect(sizeReal); + + + // we draw a Win32-like grey sash with possible 3D border here: + // + // ---- this is position + // / + // v + // dWGGGDd + // GWGGGDB + // GWGGGDB where G is light grey (face) + // GWGGGDB W white (light) + // GWGGGDB D dark grey (shadow) + // GWGGGDB B black (dark shadow) + // GWGGGDB + // GWGGGDB and lower letters are our border (already drawn) + // GWGGGDB + // wWGGGDd + // + // only the middle 3 columns are drawn unless wxSP_3D is specified + + const wxCoord h = size.y; + wxCoord offset = 0; + + // If we're drawing the border, draw the sash 3d lines shorter + if ( win->HasFlag(wxSP_3DBORDER) ) + { + offset = 1; + } + + dc.SetPen(*wxTRANSPARENT_PEN); + dc.SetBrush(wxBrush(wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE))); + + if ( win->HasFlag(wxSP_3DSASH) ) + { + // Draw the 3D sash + dc.DrawRectangle(position + 2, 0, 3, h); + + dc.SetPen(m_penLightGrey); + dc.DrawLine(position, offset, position, h - offset); + + dc.SetPen(m_penHighlight); + dc.DrawLine(position + 1, 0, position + 1, h); + + dc.SetPen(m_penDarkGrey); + dc.DrawLine(position + 5, 0, position + 5, h); + + dc.SetPen(m_penBlack); + dc.DrawLine(position + 6, offset, position + 6, h - offset); + } + else + { + // Draw a flat sash + dc.DrawRectangle(position, 0, 3, h); + } +} + +// ---------------------------------------------------------------------------- +// button drawing +// ---------------------------------------------------------------------------- + +void +wxRendererGeneric::DrawComboBoxDropButton(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags) +{ + DrawPushButton(win,dc,rect,flags); + DrawDropArrow(win,dc,rect,flags); +} + +void +wxRendererGeneric::DrawDropArrow(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int WXUNUSED(flags)) +{ + // This generic implementation should be good + // enough for Windows platforms (including XP). + + int arrowHalf = rect.width/5; + int rectMid = rect.width / 2; + int arrowTopY = (rect.height/2) - (arrowHalf/2); + + // This should always result in arrow with odd width. + wxPoint pt[] = + { + wxPoint(rectMid - arrowHalf, arrowTopY), + wxPoint(rectMid + arrowHalf, arrowTopY), + wxPoint(rectMid, arrowTopY + arrowHalf) + }; + dc.SetBrush(wxBrush(win->GetForegroundColour())); + dc.SetPen(wxPen(win->GetForegroundColour())); + dc.DrawPolygon(WXSIZEOF(pt), pt, rect.x, rect.y); +} + +void +wxRendererGeneric::DrawCheckBox(wxWindow *WXUNUSED(win), + wxDC& dc, + const wxRect& rect, + int flags) +{ + dc.SetPen(*(flags & wxCONTROL_DISABLED ? wxGREY_PEN : wxBLACK_PEN)); + dc.SetBrush( *wxTRANSPARENT_BRUSH ); + dc.DrawRectangle(rect); + + if ( flags & wxCONTROL_CHECKED ) + { + dc.DrawCheckMark(rect.Deflate(2, 2)); + } +} + +void +wxRendererGeneric::DrawPushButton(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags) +{ + // Don't try anything too fancy. It'll just turn out looking + // out-of-place on most platforms. + wxColour bgCol = flags & wxCONTROL_DISABLED ? + wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE) : + win->GetBackgroundColour(); + dc.SetBrush(wxBrush(bgCol)); + dc.SetPen(wxPen(bgCol)); + dc.DrawRectangle(rect); +} + +void +wxRendererGeneric::DrawItemSelectionRect(wxWindow * WXUNUSED(win), + wxDC& dc, + const wxRect& rect, + int flags) +{ + wxBrush brush; + if ( flags & wxCONTROL_SELECTED ) + { + if ( flags & wxCONTROL_FOCUSED ) + { + brush = wxBrush(wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHT)); + } + else // !focused + { + brush = wxBrush(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNSHADOW)); + } + } + else // !selected + { + brush = *wxTRANSPARENT_BRUSH; + } + + dc.SetBrush(brush); + dc.SetPen(flags & wxCONTROL_CURRENT ? *wxBLACK_PEN : *wxTRANSPARENT_PEN); + + dc.DrawRectangle( rect ); +} + + +// ---------------------------------------------------------------------------- +// A module to allow cleanup of generic renderer. +// ---------------------------------------------------------------------------- + +class wxGenericRendererModule: public wxModule +{ +DECLARE_DYNAMIC_CLASS(wxGenericRendererModule) +public: + wxGenericRendererModule() {} + bool OnInit() { return true; } + void OnExit() { wxRendererGeneric::Cleanup(); } +}; + +IMPLEMENT_DYNAMIC_CLASS(wxGenericRendererModule, wxModule) diff --git a/Externals/wxWidgets/src/generic/sashwin.cpp b/Externals/wxWidgets/src/generic/sashwin.cpp new file mode 100644 index 0000000000..258f116b79 --- /dev/null +++ b/Externals/wxWidgets/src/generic/sashwin.cpp @@ -0,0 +1,708 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/generic/sashwin.cpp +// Purpose: wxSashWindow implementation. A sash window has an optional +// sash on each edge, allowing it to be dragged. An event +// is generated when the sash is released. +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: sashwin.cpp 39745 2006-06-15 17:58:49Z ABX $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_SASH + +#include "wx/sashwin.h" + +#ifndef WX_PRECOMP + #include "wx/dialog.h" + #include "wx/frame.h" + #include "wx/settings.h" + #include "wx/dcclient.h" + #include "wx/dcscreen.h" + #include "wx/math.h" +#endif + +#include + +#include "wx/laywin.h" + +DEFINE_EVENT_TYPE(wxEVT_SASH_DRAGGED) + +IMPLEMENT_DYNAMIC_CLASS(wxSashWindow, wxWindow) +IMPLEMENT_DYNAMIC_CLASS(wxSashEvent, wxCommandEvent) + +BEGIN_EVENT_TABLE(wxSashWindow, wxWindow) + EVT_PAINT(wxSashWindow::OnPaint) + EVT_SIZE(wxSashWindow::OnSize) + EVT_MOUSE_EVENTS(wxSashWindow::OnMouseEvent) +#if defined( __WXMSW__ ) || defined( __WXMAC__) + EVT_SET_CURSOR(wxSashWindow::OnSetCursor) +#endif // __WXMSW__ || __WXMAC__ + +END_EVENT_TABLE() + +bool wxSashWindow::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, + const wxSize& size, long style, const wxString& name) +{ + return wxWindow::Create(parent, id, pos, size, style, name); +} + +wxSashWindow::~wxSashWindow() +{ + delete m_sashCursorWE; + delete m_sashCursorNS; +} + +void wxSashWindow::Init() +{ + m_draggingEdge = wxSASH_NONE; + m_dragMode = wxSASH_DRAG_NONE; + m_oldX = 0; + m_oldY = 0; + m_firstX = 0; + m_firstY = 0; + m_borderSize = 3; + m_extraBorderSize = 0; + m_minimumPaneSizeX = 0; + m_minimumPaneSizeY = 0; + m_maximumPaneSizeX = 10000; + m_maximumPaneSizeY = 10000; + m_sashCursorWE = new wxCursor(wxCURSOR_SIZEWE); + m_sashCursorNS = new wxCursor(wxCURSOR_SIZENS); + m_mouseCaptured = false; + m_currentCursor = NULL; + + // Eventually, we'll respond to colour change messages + InitColours(); +} + +void wxSashWindow::OnPaint(wxPaintEvent& WXUNUSED(event)) +{ + wxPaintDC dc(this); + + DrawBorders(dc); + DrawSashes(dc); +} + +void wxSashWindow::OnMouseEvent(wxMouseEvent& event) +{ + wxCoord x = 0, y = 0; + event.GetPosition(&x, &y); + + wxSashEdgePosition sashHit = SashHitTest(x, y); + + if (event.LeftDown()) + { + CaptureMouse(); + m_mouseCaptured = true; + + if ( sashHit != wxSASH_NONE ) + { + // Required for X to specify that + // that we wish to draw on top of all windows + // - and we optimise by specifying the area + // for creating the overlap window. + // Find the first frame or dialog and use this to specify + // the area to draw on. + wxWindow* parent = this; + + while (parent && !parent->IsKindOf(CLASSINFO(wxDialog)) && + !parent->IsKindOf(CLASSINFO(wxFrame))) + parent = parent->GetParent(); + + wxScreenDC::StartDrawingOnTop(parent); + + // We don't say we're dragging yet; we leave that + // decision for the Dragging() branch, to ensure + // the user has dragged a little bit. + m_dragMode = wxSASH_DRAG_LEFT_DOWN; + m_draggingEdge = sashHit; + m_firstX = x; + m_firstY = y; + + if ( (sashHit == wxSASH_LEFT) || (sashHit == wxSASH_RIGHT) ) + { + if (m_currentCursor != m_sashCursorWE) + { + SetCursor(*m_sashCursorWE); + } + m_currentCursor = m_sashCursorWE; + } + else + { + if (m_currentCursor != m_sashCursorNS) + { + SetCursor(*m_sashCursorNS); + } + m_currentCursor = m_sashCursorNS; + } + } + } + else if ( event.LeftUp() && m_dragMode == wxSASH_DRAG_LEFT_DOWN ) + { + // Wasn't a proper drag + if (m_mouseCaptured) + ReleaseMouse(); + m_mouseCaptured = false; + + wxScreenDC::EndDrawingOnTop(); + m_dragMode = wxSASH_DRAG_NONE; + m_draggingEdge = wxSASH_NONE; + } + else if (event.LeftUp() && m_dragMode == wxSASH_DRAG_DRAGGING) + { + // We can stop dragging now and see what we've got. + m_dragMode = wxSASH_DRAG_NONE; + if (m_mouseCaptured) + ReleaseMouse(); + m_mouseCaptured = false; + + // Erase old tracker + DrawSashTracker(m_draggingEdge, m_oldX, m_oldY); + + // End drawing on top (frees the window used for drawing + // over the screen) + wxScreenDC::EndDrawingOnTop(); + + int w, h; + GetSize(&w, &h); + int xp, yp; + GetPosition(&xp, &yp); + + wxSashEdgePosition edge = m_draggingEdge; + m_draggingEdge = wxSASH_NONE; + + wxRect dragRect; + wxSashDragStatus status = wxSASH_STATUS_OK; + + // the new height and width of the window - if -1, it didn't change + int newHeight = wxDefaultCoord, + newWidth = wxDefaultCoord; + + // NB: x and y may be negative and they're relative to the sash window + // upper left corner, while xp and yp are expressed in the parent + // window system of coordinates, so adjust them! After this + // adjustment, all coordinates are relative to the parent window. + y += yp; + x += xp; + + switch (edge) + { + case wxSASH_TOP: + if ( y > yp + h ) + { + // top sash shouldn't get below the bottom one + status = wxSASH_STATUS_OUT_OF_RANGE; + } + else + { + newHeight = h - (y - yp); + } + break; + + case wxSASH_BOTTOM: + if ( y < yp ) + { + // bottom sash shouldn't get above the top one + status = wxSASH_STATUS_OUT_OF_RANGE; + } + else + { + newHeight = y - yp; + } + break; + + case wxSASH_LEFT: + if ( x > xp + w ) + { + // left sash shouldn't get beyond the right one + status = wxSASH_STATUS_OUT_OF_RANGE; + } + else + { + newWidth = w - (x - xp); + } + break; + + case wxSASH_RIGHT: + if ( x < xp ) + { + // and the right sash, finally, shouldn't be beyond the + // left one + status = wxSASH_STATUS_OUT_OF_RANGE; + } + else + { + newWidth = x - xp; + } + break; + + case wxSASH_NONE: + // can this happen at all? + break; + } + + if ( newHeight == wxDefaultCoord ) + { + // didn't change + newHeight = h; + } + else + { + // make sure it's in m_minimumPaneSizeY..m_maximumPaneSizeY range + newHeight = wxMax(newHeight, m_minimumPaneSizeY); + newHeight = wxMin(newHeight, m_maximumPaneSizeY); + } + + if ( newWidth == wxDefaultCoord ) + { + // didn't change + newWidth = w; + } + else + { + // make sure it's in m_minimumPaneSizeY..m_maximumPaneSizeY range + newWidth = wxMax(newWidth, m_minimumPaneSizeX); + newWidth = wxMin(newWidth, m_maximumPaneSizeX); + } + + dragRect = wxRect(x, y, newWidth, newHeight); + + wxSashEvent eventSash(GetId(), edge); + eventSash.SetEventObject(this); + eventSash.SetDragStatus(status); + eventSash.SetDragRect(dragRect); + GetEventHandler()->ProcessEvent(eventSash); + } + else if ( event.LeftUp() ) + { + if (m_mouseCaptured) + ReleaseMouse(); + m_mouseCaptured = false; + } + else if (event.Moving() && !event.Dragging()) + { + // Just change the cursor if required + if ( sashHit != wxSASH_NONE ) + { + if ( (sashHit == wxSASH_LEFT) || (sashHit == wxSASH_RIGHT) ) + { + if (m_currentCursor != m_sashCursorWE) + { + SetCursor(*m_sashCursorWE); + } + m_currentCursor = m_sashCursorWE; + } + else + { + if (m_currentCursor != m_sashCursorNS) + { + SetCursor(*m_sashCursorNS); + } + m_currentCursor = m_sashCursorNS; + } + } + else + { + SetCursor(wxNullCursor); + m_currentCursor = NULL; + } + } + else if ( event.Dragging() && + ((m_dragMode == wxSASH_DRAG_DRAGGING) || + (m_dragMode == wxSASH_DRAG_LEFT_DOWN)) ) + { + if ( (m_draggingEdge == wxSASH_LEFT) || (m_draggingEdge == wxSASH_RIGHT) ) + { + if (m_currentCursor != m_sashCursorWE) + { + SetCursor(*m_sashCursorWE); + } + m_currentCursor = m_sashCursorWE; + } + else + { + if (m_currentCursor != m_sashCursorNS) + { + SetCursor(*m_sashCursorNS); + } + m_currentCursor = m_sashCursorNS; + } + + if (m_dragMode == wxSASH_DRAG_LEFT_DOWN) + { + m_dragMode = wxSASH_DRAG_DRAGGING; + DrawSashTracker(m_draggingEdge, x, y); + } + else + { + if ( m_dragMode == wxSASH_DRAG_DRAGGING ) + { + // Erase old tracker + DrawSashTracker(m_draggingEdge, m_oldX, m_oldY); + + // Draw new one + DrawSashTracker(m_draggingEdge, x, y); + } + } + m_oldX = x; + m_oldY = y; + } + else if ( event.LeftDClick() ) + { + // Nothing + } + else + { + } +} + +void wxSashWindow::OnSize(wxSizeEvent& WXUNUSED(event)) +{ + SizeWindows(); +} + +wxSashEdgePosition wxSashWindow::SashHitTest(int x, int y, int WXUNUSED(tolerance)) +{ + int cx, cy; + GetClientSize(& cx, & cy); + + int i; + for (i = 0; i < 4; i++) + { + wxSashEdge& edge = m_sashes[i]; + wxSashEdgePosition position = (wxSashEdgePosition) i ; + + if (edge.m_show) + { + switch (position) + { + case wxSASH_TOP: + { + if (y >= 0 && y <= GetEdgeMargin(position)) + return wxSASH_TOP; + break; + } + case wxSASH_RIGHT: + { + if ((x >= cx - GetEdgeMargin(position)) && (x <= cx)) + return wxSASH_RIGHT; + break; + } + case wxSASH_BOTTOM: + { + if ((y >= cy - GetEdgeMargin(position)) && (y <= cy)) + return wxSASH_BOTTOM; + break; + } + case wxSASH_LEFT: + { + if ((x <= GetEdgeMargin(position)) && (x >= 0)) + return wxSASH_LEFT; + break; + } + case wxSASH_NONE: + { + break; + } + } + } + } + return wxSASH_NONE; +} + +// Draw 3D effect borders +void wxSashWindow::DrawBorders(wxDC& dc) +{ + int w, h; + GetClientSize(&w, &h); + + wxPen mediumShadowPen(m_mediumShadowColour, 1, wxSOLID); + wxPen darkShadowPen(m_darkShadowColour, 1, wxSOLID); + wxPen lightShadowPen(m_lightShadowColour, 1, wxSOLID); + wxPen hilightPen(m_hilightColour, 1, wxSOLID); + + if ( GetWindowStyleFlag() & wxSW_3DBORDER ) + { + dc.SetPen(mediumShadowPen); + dc.DrawLine(0, 0, w-1, 0); + dc.DrawLine(0, 0, 0, h - 1); + + dc.SetPen(darkShadowPen); + dc.DrawLine(1, 1, w-2, 1); + dc.DrawLine(1, 1, 1, h-2); + + dc.SetPen(hilightPen); + dc.DrawLine(0, h-1, w-1, h-1); + dc.DrawLine(w-1, 0, w-1, h); // Surely the maximum y pos. should be h - 1. + /// Anyway, h is required for MSW. + + dc.SetPen(lightShadowPen); + dc.DrawLine(w-2, 1, w-2, h-2); // Right hand side + dc.DrawLine(1, h-2, w-1, h-2); // Bottom + } + else if ( GetWindowStyleFlag() & wxSW_BORDER ) + { + dc.SetBrush(*wxTRANSPARENT_BRUSH); + dc.SetPen(*wxBLACK_PEN); + dc.DrawRectangle(0, 0, w-1, h-1); + } + + dc.SetPen(wxNullPen); + dc.SetBrush(wxNullBrush); +} + +void wxSashWindow::DrawSashes(wxDC& dc) +{ + int i; + for (i = 0; i < 4; i++) + if (m_sashes[i].m_show) + DrawSash((wxSashEdgePosition) i, dc); +} + +// Draw the sash +void wxSashWindow::DrawSash(wxSashEdgePosition edge, wxDC& dc) +{ + int w, h; + GetClientSize(&w, &h); + + wxPen facePen(m_faceColour, 1, wxSOLID); + wxBrush faceBrush(m_faceColour, wxSOLID); + wxPen mediumShadowPen(m_mediumShadowColour, 1, wxSOLID); + wxPen darkShadowPen(m_darkShadowColour, 1, wxSOLID); + wxPen lightShadowPen(m_lightShadowColour, 1, wxSOLID); + wxPen hilightPen(m_hilightColour, 1, wxSOLID); + wxColour blackClr(0, 0, 0); + wxColour whiteClr(255, 255, 255); + wxPen blackPen(blackClr, 1, wxSOLID); + wxPen whitePen(whiteClr, 1, wxSOLID); + + if ( edge == wxSASH_LEFT || edge == wxSASH_RIGHT ) + { + int sashPosition = (edge == wxSASH_LEFT) ? 0 : ( w - GetEdgeMargin(edge) ); + + dc.SetPen(facePen); + dc.SetBrush(faceBrush); + dc.DrawRectangle(sashPosition, 0, GetEdgeMargin(edge), h); + + if (GetWindowStyleFlag() & wxSW_3DSASH) + { + if (edge == wxSASH_LEFT) + { + // Draw a dark grey line on the left to indicate that the + // sash is raised + dc.SetPen(mediumShadowPen); + dc.DrawLine(GetEdgeMargin(edge), 0, GetEdgeMargin(edge), h); + } + else + { + // Draw a highlight line on the right to indicate that the + // sash is raised + dc.SetPen(hilightPen); + dc.DrawLine(w - GetEdgeMargin(edge), 0, w - GetEdgeMargin(edge), h); + } + } + } + else // top or bottom + { + int sashPosition = (edge == wxSASH_TOP) ? 0 : ( h - GetEdgeMargin(edge) ); + + dc.SetPen(facePen); + dc.SetBrush(faceBrush); + dc.DrawRectangle(0, sashPosition, w, GetEdgeMargin(edge)); + + if (GetWindowStyleFlag() & wxSW_3DSASH) + { + if (edge == wxSASH_BOTTOM) + { + // Draw a highlight line on the bottom to indicate that the + // sash is raised + dc.SetPen(hilightPen); + dc.DrawLine(0, h - GetEdgeMargin(edge), w, h - GetEdgeMargin(edge)); + } + else + { + // Draw a drak grey line on the top to indicate that the + // sash is raised + dc.SetPen(mediumShadowPen); + dc.DrawLine(1, GetEdgeMargin(edge), w-1, GetEdgeMargin(edge)); + } + } + } + + dc.SetPen(wxNullPen); + dc.SetBrush(wxNullBrush); +} + +// Draw the sash tracker (for whilst moving the sash) +void wxSashWindow::DrawSashTracker(wxSashEdgePosition edge, int x, int y) +{ + int w, h; + GetClientSize(&w, &h); + + wxScreenDC screenDC; + int x1, y1; + int x2, y2; + + if ( edge == wxSASH_LEFT || edge == wxSASH_RIGHT ) + { + x1 = x; y1 = 2; + x2 = x; y2 = h-2; + + if ( (edge == wxSASH_LEFT) && (x1 > w) ) + { + x1 = w; x2 = w; + } + else if ( (edge == wxSASH_RIGHT) && (x1 < 0) ) + { + x1 = 0; x2 = 0; + } + } + else + { + x1 = 2; y1 = y; + x2 = w-2; y2 = y; + + if ( (edge == wxSASH_TOP) && (y1 > h) ) + { + y1 = h; + y2 = h; + } + else if ( (edge == wxSASH_BOTTOM) && (y1 < 0) ) + { + y1 = 0; + y2 = 0; + } + } + + ClientToScreen(&x1, &y1); + ClientToScreen(&x2, &y2); + + wxPen sashTrackerPen(*wxBLACK, 2, wxSOLID); + + screenDC.SetLogicalFunction(wxINVERT); + screenDC.SetPen(sashTrackerPen); + screenDC.SetBrush(*wxTRANSPARENT_BRUSH); + + screenDC.DrawLine(x1, y1, x2, y2); + + screenDC.SetLogicalFunction(wxCOPY); + + screenDC.SetPen(wxNullPen); + screenDC.SetBrush(wxNullBrush); +} + +// Position and size subwindows. +// Note that the border size applies to each subwindow, not +// including the edges next to the sash. +void wxSashWindow::SizeWindows() +{ + int cw, ch; + GetClientSize(&cw, &ch); + + if (GetChildren().GetCount() == 1) + { + wxWindow* child = GetChildren().GetFirst()->GetData(); + + int x = 0; + int y = 0; + int width = cw; + int height = ch; + + // Top + if (m_sashes[0].m_show) + { + y = m_borderSize; + height -= m_borderSize; + } + y += m_extraBorderSize; + + // Left + if (m_sashes[3].m_show) + { + x = m_borderSize; + width -= m_borderSize; + } + x += m_extraBorderSize; + + // Right + if (m_sashes[1].m_show) + { + width -= m_borderSize; + } + width -= 2*m_extraBorderSize; + + // Bottom + if (m_sashes[2].m_show) + { + height -= m_borderSize; + } + height -= 2*m_extraBorderSize; + + child->SetSize(x, y, width, height); + } + else if (GetChildren().GetCount() > 1) + { + // Perhaps multiple children are themselves sash windows. + // TODO: this doesn't really work because the subwindows sizes/positions + // must be set to leave a gap for the parent's sash (hit-test and decorations). + // Perhaps we can allow for this within LayoutWindow, testing whether the parent + // is a sash window, and if so, allowing some space for the edges. + wxLayoutAlgorithm layout; + layout.LayoutWindow(this); + } + + wxClientDC dc(this); + DrawBorders(dc); + DrawSashes(dc); +} + +// Initialize colours +void wxSashWindow::InitColours() +{ + // Shadow colours + m_faceColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE); + m_mediumShadowColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW); + m_darkShadowColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DDKSHADOW); + m_lightShadowColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DLIGHT); + m_hilightColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DHILIGHT); +} + +void wxSashWindow::SetSashVisible(wxSashEdgePosition edge, bool sash) +{ + m_sashes[edge].m_show = sash; + if (sash) + m_sashes[edge].m_margin = m_borderSize; + else + m_sashes[edge].m_margin = 0; +} + +#if defined( __WXMSW__ ) || defined( __WXMAC__) + +// this is currently called (and needed) under MSW only... +void wxSashWindow::OnSetCursor(wxSetCursorEvent& event) +{ + // if we don't do it, the resizing cursor might be set for child window: + // and like this we explicitly say that our cursor should not be used for + // children windows which overlap us + + if ( SashHitTest(event.GetX(), event.GetY()) != wxSASH_NONE) + { + // default processing is ok + event.Skip(); + } + //else: do nothing, in particular, don't call Skip() +} + +#endif // __WXMSW__ || __WXMAC__ + +#endif // wxUSE_SASH diff --git a/Externals/wxWidgets/src/generic/scrlwing.cpp b/Externals/wxWidgets/src/generic/scrlwing.cpp new file mode 100644 index 0000000000..15406767ef --- /dev/null +++ b/Externals/wxWidgets/src/generic/scrlwing.cpp @@ -0,0 +1,1400 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/generic/scrlwing.cpp +// Purpose: wxScrolledWindow implementation +// Author: Julian Smart +// Modified by: Vadim Zeitlin on 31.08.00: wxScrollHelper allows to implement. +// Ron Lee on 10.4.02: virtual size / auto scrollbars et al. +// Created: 01/02/97 +// RCS-ID: $Id: scrlwing.cpp 47783 2007-07-28 16:55:01Z RD $ +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#ifdef __VMS +#define XtDisplay XTDISPLAY +#endif + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#include "wx/scrolwin.h" + +#ifndef WX_PRECOMP + #include "wx/utils.h" + #include "wx/panel.h" + #include "wx/dcclient.h" + #if wxUSE_TIMER + #include "wx/timer.h" + #endif + #include "wx/sizer.h" +#endif + +#ifdef __WXMAC__ +#include "wx/scrolbar.h" +#endif + +#include "wx/recguard.h" + +#ifdef __WXMSW__ + #include // for DLGC_WANTARROWS + #include "wx/msw/winundef.h" +#endif + +#ifdef __WXMOTIF__ +// For wxRETAINED implementation +#ifdef __VMS__ //VMS's Xm.h is not (yet) compatible with C++ + //This code switches off the compiler warnings +# pragma message disable nosimpint +#endif +#include +#ifdef __VMS__ +# pragma message enable nosimpint +#endif +#endif + +/* + TODO PROPERTIES + style wxHSCROLL | wxVSCROLL +*/ + +// ---------------------------------------------------------------------------- +// wxScrollHelperEvtHandler: intercept the events from the window and forward +// them to wxScrollHelper +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxScrollHelperEvtHandler : public wxEvtHandler +{ +public: + wxScrollHelperEvtHandler(wxScrollHelper *scrollHelper) + { + m_scrollHelper = scrollHelper; + } + + virtual bool ProcessEvent(wxEvent& event); + + void ResetDrawnFlag() { m_hasDrawnWindow = false; } + +private: + wxScrollHelper *m_scrollHelper; + + bool m_hasDrawnWindow; + + DECLARE_NO_COPY_CLASS(wxScrollHelperEvtHandler) +}; + +#if wxUSE_TIMER +// ---------------------------------------------------------------------------- +// wxAutoScrollTimer: the timer used to generate a stream of scroll events when +// a captured mouse is held outside the window +// ---------------------------------------------------------------------------- + +class wxAutoScrollTimer : public wxTimer +{ +public: + wxAutoScrollTimer(wxWindow *winToScroll, wxScrollHelper *scroll, + wxEventType eventTypeToSend, + int pos, int orient); + + virtual void Notify(); + +private: + wxWindow *m_win; + wxScrollHelper *m_scrollHelper; + wxEventType m_eventType; + int m_pos, + m_orient; + + DECLARE_NO_COPY_CLASS(wxAutoScrollTimer) +}; + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxAutoScrollTimer +// ---------------------------------------------------------------------------- + +wxAutoScrollTimer::wxAutoScrollTimer(wxWindow *winToScroll, + wxScrollHelper *scroll, + wxEventType eventTypeToSend, + int pos, int orient) +{ + m_win = winToScroll; + m_scrollHelper = scroll; + m_eventType = eventTypeToSend; + m_pos = pos; + m_orient = orient; +} + +void wxAutoScrollTimer::Notify() +{ + // only do all this as long as the window is capturing the mouse + if ( wxWindow::GetCapture() != m_win ) + { + Stop(); + } + else // we still capture the mouse, continue generating events + { + // first scroll the window if we are allowed to do it + wxScrollWinEvent event1(m_eventType, m_pos, m_orient); + event1.SetEventObject(m_win); + if ( m_scrollHelper->SendAutoScrollEvents(event1) && + m_win->GetEventHandler()->ProcessEvent(event1) ) + { + // and then send a pseudo mouse-move event to refresh the selection + wxMouseEvent event2(wxEVT_MOTION); + wxGetMousePosition(&event2.m_x, &event2.m_y); + + // the mouse event coordinates should be client, not screen as + // returned by wxGetMousePosition + wxWindow *parentTop = m_win; + while ( parentTop->GetParent() ) + parentTop = parentTop->GetParent(); + wxPoint ptOrig = parentTop->GetPosition(); + event2.m_x -= ptOrig.x; + event2.m_y -= ptOrig.y; + + event2.SetEventObject(m_win); + + // FIXME: we don't fill in the other members - ok? + + m_win->GetEventHandler()->ProcessEvent(event2); + } + else // can't scroll further, stop + { + Stop(); + } + } +} +#endif + +// ---------------------------------------------------------------------------- +// wxScrollHelperEvtHandler +// ---------------------------------------------------------------------------- + +bool wxScrollHelperEvtHandler::ProcessEvent(wxEvent& event) +{ + wxEventType evType = event.GetEventType(); + + // the explanation of wxEVT_PAINT processing hack: for historic reasons + // there are 2 ways to process this event in classes deriving from + // wxScrolledWindow. The user code may + // + // 1. override wxScrolledWindow::OnDraw(dc) + // 2. define its own OnPaint() handler + // + // In addition, in wxUniversal wxWindow defines OnPaint() itself and + // always processes the draw event, so we can't just try the window + // OnPaint() first and call our HandleOnPaint() if it doesn't process it + // (the latter would never be called in wxUniversal). + // + // So the solution is to have a flag telling us whether the user code drew + // anything in the window. We set it to true here but reset it to false in + // wxScrolledWindow::OnPaint() handler (which wouldn't be called if the + // user code defined OnPaint() in the derived class) + m_hasDrawnWindow = true; + + // pass it on to the real handler + bool processed = wxEvtHandler::ProcessEvent(event); + + // always process the size events ourselves, even if the user code handles + // them as well, as we need to AdjustScrollbars() + // + // NB: it is important to do it after processing the event in the normal + // way as HandleOnSize() may generate a wxEVT_SIZE itself if the + // scrollbar[s] (dis)appear and it should be seen by the user code + // after this one + if ( evType == wxEVT_SIZE ) + { + m_scrollHelper->HandleOnSize((wxSizeEvent &)event); + + return true; + } + + if ( processed ) + { + // normally, nothing more to do here - except if it was a paint event + // which wasn't really processed, then we'll try to call our + // OnDraw() below (from HandleOnPaint) + if ( m_hasDrawnWindow || event.IsCommandEvent() ) + { + return true; + } + } + + // reset the skipped flag to false as it might have been set to true in + // ProcessEvent() above + event.Skip(false); + + if ( evType == wxEVT_PAINT ) + { + m_scrollHelper->HandleOnPaint((wxPaintEvent &)event); + return true; + } + + if ( evType == wxEVT_SCROLLWIN_TOP || + evType == wxEVT_SCROLLWIN_BOTTOM || + evType == wxEVT_SCROLLWIN_LINEUP || + evType == wxEVT_SCROLLWIN_LINEDOWN || + evType == wxEVT_SCROLLWIN_PAGEUP || + evType == wxEVT_SCROLLWIN_PAGEDOWN || + evType == wxEVT_SCROLLWIN_THUMBTRACK || + evType == wxEVT_SCROLLWIN_THUMBRELEASE ) + { + m_scrollHelper->HandleOnScroll((wxScrollWinEvent &)event); + return !event.GetSkipped(); + } + + if ( evType == wxEVT_ENTER_WINDOW ) + { + m_scrollHelper->HandleOnMouseEnter((wxMouseEvent &)event); + } + else if ( evType == wxEVT_LEAVE_WINDOW ) + { + m_scrollHelper->HandleOnMouseLeave((wxMouseEvent &)event); + } +#if wxUSE_MOUSEWHEEL + else if ( evType == wxEVT_MOUSEWHEEL ) + { + m_scrollHelper->HandleOnMouseWheel((wxMouseEvent &)event); + return true; + } +#endif // wxUSE_MOUSEWHEEL + else if ( evType == wxEVT_CHAR ) + { + m_scrollHelper->HandleOnChar((wxKeyEvent &)event); + return !event.GetSkipped(); + } + + return false; +} + +// ---------------------------------------------------------------------------- +// wxScrollHelper construction +// ---------------------------------------------------------------------------- + +wxScrollHelper::wxScrollHelper(wxWindow *win) +{ + wxASSERT_MSG( win, _T("associated window can't be NULL in wxScrollHelper") ); + + m_xScrollPixelsPerLine = + m_yScrollPixelsPerLine = + m_xScrollPosition = + m_yScrollPosition = + m_xScrollLines = + m_yScrollLines = + m_xScrollLinesPerPage = + m_yScrollLinesPerPage = 0; + + m_xScrollingEnabled = + m_yScrollingEnabled = true; + + m_scaleX = + m_scaleY = 1.0; +#if wxUSE_MOUSEWHEEL + m_wheelRotation = 0; +#endif + + m_win = + m_targetWindow = (wxWindow *)NULL; + + m_timerAutoScroll = (wxTimer *)NULL; + + m_handler = NULL; + + m_win = win; + + m_win->SetScrollHelper( this ); + + // by default, the associated window is also the target window + DoSetTargetWindow(win); +} + +wxScrollHelper::~wxScrollHelper() +{ + StopAutoScrolling(); + + DeleteEvtHandler(); +} + +// ---------------------------------------------------------------------------- +// setting scrolling parameters +// ---------------------------------------------------------------------------- + +void wxScrollHelper::SetScrollbars(int pixelsPerUnitX, + int pixelsPerUnitY, + int noUnitsX, + int noUnitsY, + int xPos, + int yPos, + bool noRefresh) +{ + int xpos, ypos; + + CalcUnscrolledPosition(xPos, yPos, &xpos, &ypos); + bool do_refresh = + ( + (noUnitsX != 0 && m_xScrollLines == 0) || + (noUnitsX < m_xScrollLines && xpos > pixelsPerUnitX * noUnitsX) || + + (noUnitsY != 0 && m_yScrollLines == 0) || + (noUnitsY < m_yScrollLines && ypos > pixelsPerUnitY * noUnitsY) || + (xPos != m_xScrollPosition) || + (yPos != m_yScrollPosition) + ); + + m_xScrollPixelsPerLine = pixelsPerUnitX; + m_yScrollPixelsPerLine = pixelsPerUnitY; + m_xScrollPosition = xPos; + m_yScrollPosition = yPos; + + int w = noUnitsX * pixelsPerUnitX; + int h = noUnitsY * pixelsPerUnitY; + + // For better backward compatibility we set persisting limits + // here not just the size. It makes SetScrollbars 'sticky' + // emulating the old non-autoscroll behaviour. + // m_targetWindow->SetVirtualSizeHints( w, h ); + + // The above should arguably be deprecated, this however we still need. + + // take care not to set 0 virtual size, 0 means that we don't have any + // scrollbars and hence we should use the real size instead of the virtual + // one which is indicated by using wxDefaultCoord + m_targetWindow->SetVirtualSize( w ? w : wxDefaultCoord, + h ? h : wxDefaultCoord); + + if (do_refresh && !noRefresh) + m_targetWindow->Refresh(true, GetScrollRect()); + +#ifndef __WXUNIVERSAL__ + // If the target is not the same as the window with the scrollbars, + // then we need to update the scrollbars here, since they won't have + // been updated by SetVirtualSize(). + if ( m_targetWindow != m_win ) +#endif // !__WXUNIVERSAL__ + { + AdjustScrollbars(); + } +#ifndef __WXUNIVERSAL__ + else + { + // otherwise this has been done by AdjustScrollbars, above + } +#endif // !__WXUNIVERSAL__ +} + +// ---------------------------------------------------------------------------- +// [target] window handling +// ---------------------------------------------------------------------------- + +void wxScrollHelper::DeleteEvtHandler() +{ + // search for m_handler in the handler list + if ( m_win && m_handler ) + { + if ( m_win->RemoveEventHandler(m_handler) ) + { + delete m_handler; + } + //else: something is very wrong, so better [maybe] leak memory than + // risk a crash because of double deletion + + m_handler = NULL; + } +} + +void wxScrollHelper::DoSetTargetWindow(wxWindow *target) +{ + m_targetWindow = target; +#ifdef __WXMAC__ + target->MacSetClipChildren( true ) ; +#endif + + // install the event handler which will intercept the events we're + // interested in (but only do it for our real window, not the target window + // which we scroll - we don't need to hijack its events) + if ( m_targetWindow == m_win ) + { + // if we already have a handler, delete it first + DeleteEvtHandler(); + + m_handler = new wxScrollHelperEvtHandler(this); + m_targetWindow->PushEventHandler(m_handler); + } +} + +void wxScrollHelper::SetTargetWindow(wxWindow *target) +{ + wxCHECK_RET( target, wxT("target window must not be NULL") ); + + if ( target == m_targetWindow ) + return; + + DoSetTargetWindow(target); +} + +wxWindow *wxScrollHelper::GetTargetWindow() const +{ + return m_targetWindow; +} + +// ---------------------------------------------------------------------------- +// scrolling implementation itself +// ---------------------------------------------------------------------------- + +void wxScrollHelper::HandleOnScroll(wxScrollWinEvent& event) +{ + int nScrollInc = CalcScrollInc(event); + if ( nScrollInc == 0 ) + { + // can't scroll further + event.Skip(); + + return; + } + + bool needsRefresh = false; + + int dx = 0, + dy = 0; + int orient = event.GetOrientation(); + if (orient == wxHORIZONTAL) + { + if ( m_xScrollingEnabled ) + { + dx = -m_xScrollPixelsPerLine * nScrollInc; + } + else + { + needsRefresh = true; + } + } + else + { + if ( m_yScrollingEnabled ) + { + dy = -m_yScrollPixelsPerLine * nScrollInc; + } + else + { + needsRefresh = true; + } + } + + if ( !needsRefresh ) + { + // flush all pending repaints before we change m_{x,y}ScrollPosition, as + // otherwise invalidated area could be updated incorrectly later when + // ScrollWindow() makes sure they're repainted before scrolling them +#ifdef __WXMAC__ + // wxWindowMac is taking care of making sure the update area is correctly + // set up, while not forcing an immediate redraw +#else + m_targetWindow->Update(); +#endif + } + + if (orient == wxHORIZONTAL) + { + m_xScrollPosition += nScrollInc; + m_win->SetScrollPos(wxHORIZONTAL, m_xScrollPosition); + } + else + { + m_yScrollPosition += nScrollInc; + m_win->SetScrollPos(wxVERTICAL, m_yScrollPosition); + } + + if ( needsRefresh ) + { + m_targetWindow->Refresh(true, GetScrollRect()); + } + else + { + m_targetWindow->ScrollWindow(dx, dy, GetScrollRect()); + } +} + +int wxScrollHelper::CalcScrollInc(wxScrollWinEvent& event) +{ + int pos = event.GetPosition(); + int orient = event.GetOrientation(); + + int nScrollInc = 0; + if (event.GetEventType() == wxEVT_SCROLLWIN_TOP) + { + if (orient == wxHORIZONTAL) + nScrollInc = - m_xScrollPosition; + else + nScrollInc = - m_yScrollPosition; + } else + if (event.GetEventType() == wxEVT_SCROLLWIN_BOTTOM) + { + if (orient == wxHORIZONTAL) + nScrollInc = m_xScrollLines - m_xScrollPosition; + else + nScrollInc = m_yScrollLines - m_yScrollPosition; + } else + if (event.GetEventType() == wxEVT_SCROLLWIN_LINEUP) + { + nScrollInc = -1; + } else + if (event.GetEventType() == wxEVT_SCROLLWIN_LINEDOWN) + { + nScrollInc = 1; + } else + if (event.GetEventType() == wxEVT_SCROLLWIN_PAGEUP) + { + if (orient == wxHORIZONTAL) + nScrollInc = -GetScrollPageSize(wxHORIZONTAL); + else + nScrollInc = -GetScrollPageSize(wxVERTICAL); + } else + if (event.GetEventType() == wxEVT_SCROLLWIN_PAGEDOWN) + { + if (orient == wxHORIZONTAL) + nScrollInc = GetScrollPageSize(wxHORIZONTAL); + else + nScrollInc = GetScrollPageSize(wxVERTICAL); + } else + if ((event.GetEventType() == wxEVT_SCROLLWIN_THUMBTRACK) || + (event.GetEventType() == wxEVT_SCROLLWIN_THUMBRELEASE)) + { + if (orient == wxHORIZONTAL) + nScrollInc = pos - m_xScrollPosition; + else + nScrollInc = pos - m_yScrollPosition; + } + + if (orient == wxHORIZONTAL) + { + if (m_xScrollPixelsPerLine > 0) + { + if ( m_xScrollPosition + nScrollInc < 0 ) + { + // As -ve as we can go + nScrollInc = -m_xScrollPosition; + } + else // check for the other bound + { + const int posMax = m_xScrollLines - m_xScrollLinesPerPage; + if ( m_xScrollPosition + nScrollInc > posMax ) + { + // As +ve as we can go + nScrollInc = posMax - m_xScrollPosition; + } + } + } + else + m_targetWindow->Refresh(true, GetScrollRect()); + } + else + { + if ( m_yScrollPixelsPerLine > 0 ) + { + if ( m_yScrollPosition + nScrollInc < 0 ) + { + // As -ve as we can go + nScrollInc = -m_yScrollPosition; + } + else // check for the other bound + { + const int posMax = m_yScrollLines - m_yScrollLinesPerPage; + if ( m_yScrollPosition + nScrollInc > posMax ) + { + // As +ve as we can go + nScrollInc = posMax - m_yScrollPosition; + } + } + } + else + { + // VZ: why do we do this? (FIXME) + m_targetWindow->Refresh(true, GetScrollRect()); + } + } + + return nScrollInc; +} + +// Adjust the scrollbars - new version. +void wxScrollHelper::AdjustScrollbars() +{ + static wxRecursionGuardFlag s_flagReentrancy; + wxRecursionGuard guard(s_flagReentrancy); + if ( guard.IsInside() ) + { + // don't reenter AdjustScrollbars() while another call to + // AdjustScrollbars() is in progress because this may lead to calling + // ScrollWindow() twice and this can really happen under MSW if + // SetScrollbar() call below adds or removes the scrollbar which + // changes the window size and hence results in another + // AdjustScrollbars() call + return; + } + + int w = 0, h = 0; + int oldw, oldh; + + int oldXScroll = m_xScrollPosition; + int oldYScroll = m_yScrollPosition; + + // VZ: at least under Windows this loop is useless because when scrollbars + // [dis]appear we get a WM_SIZE resulting in another call to + // AdjustScrollbars() anyhow. As it doesn't seem to do any harm I leave + // it here for now but it would be better to ensure that all ports + // generate EVT_SIZE when scrollbars [dis]appear, emulating it if + // necessary, and remove it later + // JACS: Stop potential infinite loop by limiting number of iterations + int iterationCount = 0; + const int iterationMax = 5; + do + { + iterationCount ++; + + GetTargetSize(&w, 0); + + // scroll lines per page: if 0, no scrolling is needed + int linesPerPage; + + if ( m_xScrollPixelsPerLine == 0 ) + { + // scrolling is disabled + m_xScrollLines = 0; + m_xScrollPosition = 0; + linesPerPage = 0; + } + else // might need scrolling + { + // Round up integer division to catch any "leftover" client space. + const int wVirt = m_targetWindow->GetVirtualSize().GetWidth(); + m_xScrollLines = (wVirt + m_xScrollPixelsPerLine - 1) / m_xScrollPixelsPerLine; + + // Calculate page size i.e. number of scroll units you get on the + // current client window. + linesPerPage = w / m_xScrollPixelsPerLine; + + // Special case. When client and virtual size are very close but + // the client is big enough, kill scrollbar. + if ((linesPerPage < m_xScrollLines) && (w >= wVirt)) ++linesPerPage; + + if (linesPerPage >= m_xScrollLines) + { + // we're big enough to not need scrolling + linesPerPage = + m_xScrollLines = + m_xScrollPosition = 0; + } + else // we do need a scrollbar + { + if ( linesPerPage < 1 ) + linesPerPage = 1; + + // Correct position if greater than extent of canvas minus + // the visible portion of it or if below zero + const int posMax = m_xScrollLines - linesPerPage; + if ( m_xScrollPosition > posMax ) + m_xScrollPosition = posMax; + else if ( m_xScrollPosition < 0 ) + m_xScrollPosition = 0; + } + } + + m_win->SetScrollbar(wxHORIZONTAL, m_xScrollPosition, + linesPerPage, m_xScrollLines); + + // The amount by which we scroll when paging + SetScrollPageSize(wxHORIZONTAL, linesPerPage); + + GetTargetSize(0, &h); + + if ( m_yScrollPixelsPerLine == 0 ) + { + // scrolling is disabled + m_yScrollLines = 0; + m_yScrollPosition = 0; + linesPerPage = 0; + } + else // might need scrolling + { + // Round up integer division to catch any "leftover" client space. + const int hVirt = m_targetWindow->GetVirtualSize().GetHeight(); + m_yScrollLines = ( hVirt + m_yScrollPixelsPerLine - 1 ) / m_yScrollPixelsPerLine; + + // Calculate page size i.e. number of scroll units you get on the + // current client window. + linesPerPage = h / m_yScrollPixelsPerLine; + + // Special case. When client and virtual size are very close but + // the client is big enough, kill scrollbar. + if ((linesPerPage < m_yScrollLines) && (h >= hVirt)) ++linesPerPage; + + if (linesPerPage >= m_yScrollLines) + { + // we're big enough to not need scrolling + linesPerPage = + m_yScrollLines = + m_yScrollPosition = 0; + } + else // we do need a scrollbar + { + if ( linesPerPage < 1 ) + linesPerPage = 1; + + // Correct position if greater than extent of canvas minus + // the visible portion of it or if below zero + const int posMax = m_yScrollLines - linesPerPage; + if ( m_yScrollPosition > posMax ) + m_yScrollPosition = posMax; + else if ( m_yScrollPosition < 0 ) + m_yScrollPosition = 0; + } + } + + m_win->SetScrollbar(wxVERTICAL, m_yScrollPosition, + linesPerPage, m_yScrollLines); + + // The amount by which we scroll when paging + SetScrollPageSize(wxVERTICAL, linesPerPage); + + + // If a scrollbar (dis)appeared as a result of this, adjust them again. + oldw = w; + oldh = h; + + GetTargetSize( &w, &h ); + } while ( (w != oldw || h != oldh) && (iterationCount < iterationMax) ); + +#ifdef __WXMOTIF__ + // Sorry, some Motif-specific code to implement a backing pixmap + // for the wxRETAINED style. Implementing a backing store can't + // be entirely generic because it relies on the wxWindowDC implementation + // to duplicate X drawing calls for the backing pixmap. + + if ( m_targetWindow->GetWindowStyle() & wxRETAINED ) + { + Display* dpy = XtDisplay((Widget)m_targetWindow->GetMainWidget()); + + int totalPixelWidth = m_xScrollLines * m_xScrollPixelsPerLine; + int totalPixelHeight = m_yScrollLines * m_yScrollPixelsPerLine; + if (m_targetWindow->GetBackingPixmap() && + !((m_targetWindow->GetPixmapWidth() == totalPixelWidth) && + (m_targetWindow->GetPixmapHeight() == totalPixelHeight))) + { + XFreePixmap (dpy, (Pixmap) m_targetWindow->GetBackingPixmap()); + m_targetWindow->SetBackingPixmap((WXPixmap) 0); + } + + if (!m_targetWindow->GetBackingPixmap() && + (m_xScrollLines != 0) && (m_yScrollLines != 0)) + { + int depth = wxDisplayDepth(); + m_targetWindow->SetPixmapWidth(totalPixelWidth); + m_targetWindow->SetPixmapHeight(totalPixelHeight); + m_targetWindow->SetBackingPixmap((WXPixmap) XCreatePixmap (dpy, RootWindow (dpy, DefaultScreen (dpy)), + m_targetWindow->GetPixmapWidth(), m_targetWindow->GetPixmapHeight(), depth)); + } + + } +#endif // Motif + + if (oldXScroll != m_xScrollPosition) + { + if (m_xScrollingEnabled) + m_targetWindow->ScrollWindow( m_xScrollPixelsPerLine * (oldXScroll - m_xScrollPosition), 0, + GetScrollRect() ); + else + m_targetWindow->Refresh(true, GetScrollRect()); + } + + if (oldYScroll != m_yScrollPosition) + { + if (m_yScrollingEnabled) + m_targetWindow->ScrollWindow( 0, m_yScrollPixelsPerLine * (oldYScroll-m_yScrollPosition), + GetScrollRect() ); + else + m_targetWindow->Refresh(true, GetScrollRect()); + } +} + +void wxScrollHelper::DoPrepareDC(wxDC& dc) +{ + wxPoint pt = dc.GetDeviceOrigin(); +#ifdef __WXGTK__ + // It may actually be correct to always query + // the m_sign from the DC here, but I leve the + // #ifdef GTK for now. + if (m_win->GetLayoutDirection() == wxLayout_RightToLeft) + dc.SetDeviceOrigin( pt.x + m_xScrollPosition * m_xScrollPixelsPerLine, + pt.y - m_yScrollPosition * m_yScrollPixelsPerLine ); + else +#endif + dc.SetDeviceOrigin( pt.x - m_xScrollPosition * m_xScrollPixelsPerLine, + pt.y - m_yScrollPosition * m_yScrollPixelsPerLine ); + dc.SetUserScale( m_scaleX, m_scaleY ); +} + +void wxScrollHelper::SetScrollRate( int xstep, int ystep ) +{ + int old_x = m_xScrollPixelsPerLine * m_xScrollPosition; + int old_y = m_yScrollPixelsPerLine * m_yScrollPosition; + + m_xScrollPixelsPerLine = xstep; + m_yScrollPixelsPerLine = ystep; + + int new_x = m_xScrollPixelsPerLine * m_xScrollPosition; + int new_y = m_yScrollPixelsPerLine * m_yScrollPosition; + + m_win->SetScrollPos( wxHORIZONTAL, m_xScrollPosition ); + m_win->SetScrollPos( wxVERTICAL, m_yScrollPosition ); + m_targetWindow->ScrollWindow( old_x - new_x, old_y - new_y ); + + AdjustScrollbars(); +} + +void wxScrollHelper::GetScrollPixelsPerUnit (int *x_unit, int *y_unit) const +{ + if ( x_unit ) + *x_unit = m_xScrollPixelsPerLine; + if ( y_unit ) + *y_unit = m_yScrollPixelsPerLine; +} + + +int wxScrollHelper::GetScrollLines( int orient ) const +{ + if ( orient == wxHORIZONTAL ) + return m_xScrollLines; + else + return m_yScrollLines; +} + +int wxScrollHelper::GetScrollPageSize(int orient) const +{ + if ( orient == wxHORIZONTAL ) + return m_xScrollLinesPerPage; + else + return m_yScrollLinesPerPage; +} + +void wxScrollHelper::SetScrollPageSize(int orient, int pageSize) +{ + if ( orient == wxHORIZONTAL ) + m_xScrollLinesPerPage = pageSize; + else + m_yScrollLinesPerPage = pageSize; +} + +/* + * Scroll to given position (scroll position, not pixel position) + */ +void wxScrollHelper::Scroll( int x_pos, int y_pos ) +{ + if (!m_targetWindow) + return; + + if (((x_pos == -1) || (x_pos == m_xScrollPosition)) && + ((y_pos == -1) || (y_pos == m_yScrollPosition))) return; + + int w = 0, h = 0; + GetTargetSize(&w, &h); + + // compute new position: + int new_x = m_xScrollPosition; + int new_y = m_yScrollPosition; + + if ((x_pos != -1) && (m_xScrollPixelsPerLine)) + { + new_x = x_pos; + + // Calculate page size i.e. number of scroll units you get on the + // current client window + int noPagePositions = w/m_xScrollPixelsPerLine; + if (noPagePositions < 1) noPagePositions = 1; + + // Correct position if greater than extent of canvas minus + // the visible portion of it or if below zero + new_x = wxMin( m_xScrollLines-noPagePositions, new_x ); + new_x = wxMax( 0, new_x ); + } + if ((y_pos != -1) && (m_yScrollPixelsPerLine)) + { + new_y = y_pos; + + // Calculate page size i.e. number of scroll units you get on the + // current client window + int noPagePositions = h/m_yScrollPixelsPerLine; + if (noPagePositions < 1) noPagePositions = 1; + + // Correct position if greater than extent of canvas minus + // the visible portion of it or if below zero + new_y = wxMin( m_yScrollLines-noPagePositions, new_y ); + new_y = wxMax( 0, new_y ); + } + + if ( new_x == m_xScrollPosition && new_y == m_yScrollPosition ) + return; // nothing to do, the position didn't change + + // flush all pending repaints before we change m_{x,y}ScrollPosition, as + // otherwise invalidated area could be updated incorrectly later when + // ScrollWindow() makes sure they're repainted before scrolling them + m_targetWindow->Update(); + + // update the position and scroll the window now: + if (m_xScrollPosition != new_x) + { + int old_x = m_xScrollPosition; + m_xScrollPosition = new_x; + m_win->SetScrollPos( wxHORIZONTAL, new_x ); + m_targetWindow->ScrollWindow( (old_x-new_x)*m_xScrollPixelsPerLine, 0, + GetScrollRect() ); + } + + if (m_yScrollPosition != new_y) + { + int old_y = m_yScrollPosition; + m_yScrollPosition = new_y; + m_win->SetScrollPos( wxVERTICAL, new_y ); + m_targetWindow->ScrollWindow( 0, (old_y-new_y)*m_yScrollPixelsPerLine, + GetScrollRect() ); + } +} + +void wxScrollHelper::EnableScrolling (bool x_scroll, bool y_scroll) +{ + m_xScrollingEnabled = x_scroll; + m_yScrollingEnabled = y_scroll; +} + +// Where the current view starts from +void wxScrollHelper::GetViewStart (int *x, int *y) const +{ + if ( x ) + *x = m_xScrollPosition; + if ( y ) + *y = m_yScrollPosition; +} + +void wxScrollHelper::DoCalcScrolledPosition(int x, int y, int *xx, int *yy) const +{ + if ( xx ) + *xx = x - m_xScrollPosition * m_xScrollPixelsPerLine; + if ( yy ) + *yy = y - m_yScrollPosition * m_yScrollPixelsPerLine; +} + +void wxScrollHelper::DoCalcUnscrolledPosition(int x, int y, int *xx, int *yy) const +{ + if ( xx ) + *xx = x + m_xScrollPosition * m_xScrollPixelsPerLine; + if ( yy ) + *yy = y + m_yScrollPosition * m_yScrollPixelsPerLine; +} + +// ---------------------------------------------------------------------------- +// geometry +// ---------------------------------------------------------------------------- + +bool wxScrollHelper::ScrollLayout() +{ + if ( m_win->GetSizer() && m_targetWindow == m_win ) + { + // If we're the scroll target, take into account the + // virtual size and scrolled position of the window. + + int x = 0, y = 0, w = 0, h = 0; + CalcScrolledPosition(0,0, &x,&y); + m_win->GetVirtualSize(&w, &h); + m_win->GetSizer()->SetDimension(x, y, w, h); + return true; + } + + // fall back to default for LayoutConstraints + return m_win->wxWindow::Layout(); +} + +void wxScrollHelper::ScrollDoSetVirtualSize(int x, int y) +{ + m_win->wxWindow::DoSetVirtualSize( x, y ); + AdjustScrollbars(); + + if (m_win->GetAutoLayout()) + m_win->Layout(); +} + +// wxWindow's GetBestVirtualSize returns the actual window size, +// whereas we want to return the virtual size +wxSize wxScrollHelper::ScrollGetBestVirtualSize() const +{ + wxSize clientSize(m_win->GetClientSize()); + if ( m_win->GetSizer() ) + clientSize.IncTo(m_win->GetSizer()->CalcMin()); + + return clientSize; +} + +// return the window best size from the given best virtual size +wxSize +wxScrollHelper::ScrollGetWindowSizeForVirtualSize(const wxSize& size) const +{ + // Only use the content to set the window size in the direction + // where there's no scrolling; otherwise we're going to get a huge + // window in the direction in which scrolling is enabled + int ppuX, ppuY; + GetScrollPixelsPerUnit(&ppuX, &ppuY); + + wxSize minSize = m_win->GetMinSize(); + if ( !minSize.IsFullySpecified() ) + minSize = m_win->GetSize(); + + wxSize best(size); + if (ppuX > 0) + best.x = minSize.x; + if (ppuY > 0) + best.y = minSize.y; + + return best; +} + +// ---------------------------------------------------------------------------- +// event handlers +// ---------------------------------------------------------------------------- + +// Default OnSize resets scrollbars, if any +void wxScrollHelper::HandleOnSize(wxSizeEvent& WXUNUSED(event)) +{ + if ( m_targetWindow->GetAutoLayout() ) + { + wxSize size = m_targetWindow->GetBestVirtualSize(); + + // This will call ::Layout() and ::AdjustScrollbars() + m_win->SetVirtualSize( size ); + } + else + { + AdjustScrollbars(); + } +} + +// This calls OnDraw, having adjusted the origin according to the current +// scroll position +void wxScrollHelper::HandleOnPaint(wxPaintEvent& WXUNUSED(event)) +{ + // don't use m_targetWindow here, this is always called for ourselves + wxPaintDC dc(m_win); + DoPrepareDC(dc); + + OnDraw(dc); +} + +// kbd handling: notice that we use OnChar() and not OnKeyDown() for +// compatibility here - if we used OnKeyDown(), the programs which process +// arrows themselves in their OnChar() would never get the message and like +// this they always have the priority +void wxScrollHelper::HandleOnChar(wxKeyEvent& event) +{ + int stx = 0, sty = 0, // view origin + szx = 0, szy = 0, // view size (total) + clix = 0, cliy = 0; // view size (on screen) + + GetViewStart(&stx, &sty); + GetTargetSize(&clix, &cliy); + m_targetWindow->GetVirtualSize(&szx, &szy); + + if( m_xScrollPixelsPerLine ) + { + clix /= m_xScrollPixelsPerLine; + szx /= m_xScrollPixelsPerLine; + } + else + { + clix = 0; + szx = -1; + } + if( m_yScrollPixelsPerLine ) + { + cliy /= m_yScrollPixelsPerLine; + szy /= m_yScrollPixelsPerLine; + } + else + { + cliy = 0; + szy = -1; + } + + int xScrollOld = m_xScrollPosition, + yScrollOld = m_yScrollPosition; + + int dsty; + switch ( event.GetKeyCode() ) + { + case WXK_PAGEUP: + dsty = sty - (5 * cliy / 6); + Scroll(-1, (dsty == -1) ? 0 : dsty); + break; + + case WXK_PAGEDOWN: + Scroll(-1, sty + (5 * cliy / 6)); + break; + + case WXK_HOME: + Scroll(0, event.ControlDown() ? 0 : -1); + break; + + case WXK_END: + Scroll(szx - clix, event.ControlDown() ? szy - cliy : -1); + break; + + case WXK_UP: + Scroll(-1, sty - 1); + break; + + case WXK_DOWN: + Scroll(-1, sty + 1); + break; + + case WXK_LEFT: + Scroll(stx - 1, -1); + break; + + case WXK_RIGHT: + Scroll(stx + 1, -1); + break; + + default: + // not for us + event.Skip(); + } + + if ( m_xScrollPosition != xScrollOld ) + { + wxScrollWinEvent event(wxEVT_SCROLLWIN_THUMBTRACK, m_xScrollPosition, + wxHORIZONTAL); + event.SetEventObject(m_win); + m_win->GetEventHandler()->ProcessEvent(event); + } + + if ( m_yScrollPosition != yScrollOld ) + { + wxScrollWinEvent event(wxEVT_SCROLLWIN_THUMBTRACK, m_yScrollPosition, + wxVERTICAL); + event.SetEventObject(m_win); + m_win->GetEventHandler()->ProcessEvent(event); + } +} + +// ---------------------------------------------------------------------------- +// autoscroll stuff: these functions deal with sending fake scroll events when +// a captured mouse is being held outside the window +// ---------------------------------------------------------------------------- + +bool wxScrollHelper::SendAutoScrollEvents(wxScrollWinEvent& event) const +{ + // only send the event if the window is scrollable in this direction + wxWindow *win = (wxWindow *)event.GetEventObject(); + return win->HasScrollbar(event.GetOrientation()); +} + +void wxScrollHelper::StopAutoScrolling() +{ +#if wxUSE_TIMER + if ( m_timerAutoScroll ) + { + delete m_timerAutoScroll; + m_timerAutoScroll = (wxTimer *)NULL; + } +#endif +} + +void wxScrollHelper::HandleOnMouseEnter(wxMouseEvent& event) +{ + StopAutoScrolling(); + + event.Skip(); +} + +void wxScrollHelper::HandleOnMouseLeave(wxMouseEvent& event) +{ + // don't prevent the usual processing of the event from taking place + event.Skip(); + + // when a captured mouse leave a scrolled window we start generate + // scrolling events to allow, for example, extending selection beyond the + // visible area in some controls + if ( wxWindow::GetCapture() == m_targetWindow ) + { + // where is the mouse leaving? + int pos, orient; + wxPoint pt = event.GetPosition(); + if ( pt.x < 0 ) + { + orient = wxHORIZONTAL; + pos = 0; + } + else if ( pt.y < 0 ) + { + orient = wxVERTICAL; + pos = 0; + } + else // we're lower or to the right of the window + { + wxSize size = m_targetWindow->GetClientSize(); + if ( pt.x > size.x ) + { + orient = wxHORIZONTAL; + pos = m_xScrollLines; + } + else if ( pt.y > size.y ) + { + orient = wxVERTICAL; + pos = m_yScrollLines; + } + else // this should be impossible + { + // but seems to happen sometimes under wxMSW - maybe it's a bug + // there but for now just ignore it + + //wxFAIL_MSG( _T("can't understand where has mouse gone") ); + + return; + } + } + + // only start the auto scroll timer if the window can be scrolled in + // this direction + if ( !m_targetWindow->HasScrollbar(orient) ) + return; + +#if wxUSE_TIMER + delete m_timerAutoScroll; + m_timerAutoScroll = new wxAutoScrollTimer + ( + m_targetWindow, this, + pos == 0 ? wxEVT_SCROLLWIN_LINEUP + : wxEVT_SCROLLWIN_LINEDOWN, + pos, + orient + ); + m_timerAutoScroll->Start(50); // FIXME: make configurable +#else + wxUnusedVar(pos); +#endif + } +} + +#if wxUSE_MOUSEWHEEL + +void wxScrollHelper::HandleOnMouseWheel(wxMouseEvent& event) +{ + m_wheelRotation += event.GetWheelRotation(); + int lines = m_wheelRotation / event.GetWheelDelta(); + m_wheelRotation -= lines * event.GetWheelDelta(); + + if (lines != 0) + { + + wxScrollWinEvent newEvent; + + newEvent.SetPosition(0); + newEvent.SetOrientation(wxVERTICAL); + newEvent.SetEventObject(m_win); + + if (event.IsPageScroll()) + { + if (lines > 0) + newEvent.SetEventType(wxEVT_SCROLLWIN_PAGEUP); + else + newEvent.SetEventType(wxEVT_SCROLLWIN_PAGEDOWN); + + m_win->GetEventHandler()->ProcessEvent(newEvent); + } + else + { + lines *= event.GetLinesPerAction(); + if (lines > 0) + newEvent.SetEventType(wxEVT_SCROLLWIN_LINEUP); + else + newEvent.SetEventType(wxEVT_SCROLLWIN_LINEDOWN); + + int times = abs(lines); + for (; times > 0; times--) + m_win->GetEventHandler()->ProcessEvent(newEvent); + } + } +} + +#endif // wxUSE_MOUSEWHEEL + +// ---------------------------------------------------------------------------- +// wxScrolledWindow implementation +// ---------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxScrolledWindow, wxPanel) + +BEGIN_EVENT_TABLE(wxScrolledWindow, wxPanel) + EVT_PAINT(wxScrolledWindow::OnPaint) +END_EVENT_TABLE() + +bool wxScrolledWindow::Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + long style, + const wxString& name) +{ + m_targetWindow = this; +#ifdef __WXMAC__ + MacSetClipChildren( true ) ; +#endif + + bool ok = wxPanel::Create(parent, id, pos, size, style|wxHSCROLL|wxVSCROLL, name); + + return ok; +} + +wxScrolledWindow::~wxScrolledWindow() +{ +} + +void wxScrolledWindow::OnPaint(wxPaintEvent& event) +{ + // the user code didn't really draw the window if we got here, so set this + // flag to try to call OnDraw() later + m_handler->ResetDrawnFlag(); + + event.Skip(); +} + +#ifdef __WXMSW__ +WXLRESULT wxScrolledWindow::MSWWindowProc(WXUINT nMsg, + WXWPARAM wParam, + WXLPARAM lParam) +{ + WXLRESULT rc = wxPanel::MSWWindowProc(nMsg, wParam, lParam); + +#ifndef __WXWINCE__ + // we need to process arrows ourselves for scrolling + if ( nMsg == WM_GETDLGCODE ) + { + rc |= DLGC_WANTARROWS; + } +#endif + + return rc; +} + +#endif // __WXMSW__ diff --git a/Externals/wxWidgets/src/generic/selstore.cpp b/Externals/wxWidgets/src/generic/selstore.cpp new file mode 100644 index 0000000000..653de15114 --- /dev/null +++ b/Externals/wxWidgets/src/generic/selstore.cpp @@ -0,0 +1,216 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: generic/selstore.cpp +// Purpose: wxSelectionStore implementation +// Author: Vadim Zeitlin +// Modified by: +// Created: 08.06.03 (extracted from src/generic/listctrl.cpp) +// RCS-ID: $Id: selstore.cpp 27853 2004-06-17 16:22:36Z ABX $ +// Copyright: (c) 2000-2003 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#include "wx/selstore.h" + +// ============================================================================ +// wxSelectionStore +// ============================================================================ + +// ---------------------------------------------------------------------------- +// tests +// ---------------------------------------------------------------------------- + +bool wxSelectionStore::IsSelected(size_t item) const +{ + bool isSel = m_itemsSel.Index(item) != wxNOT_FOUND; + + // if the default state is to be selected, being in m_itemsSel means that + // the item is not selected, so we have to inverse the logic + return m_defaultState ? !isSel : isSel; +} + +// ---------------------------------------------------------------------------- +// Select*() +// ---------------------------------------------------------------------------- + +bool wxSelectionStore::SelectItem(size_t item, bool select) +{ + // search for the item ourselves as like this we get the index where to + // insert it later if needed, so we do only one search in the array instead + // of two (adding item to a sorted array requires a search) + size_t index = m_itemsSel.IndexForInsert(item); + bool isSel = index < m_itemsSel.GetCount() && m_itemsSel[index] == item; + + if ( select != m_defaultState ) + { + if ( !isSel ) + { + m_itemsSel.AddAt(item, index); + + return true; + } + } + else // reset to default state + { + if ( isSel ) + { + m_itemsSel.RemoveAt(index); + return true; + } + } + + return false; +} + +bool wxSelectionStore::SelectRange(size_t itemFrom, size_t itemTo, + bool select, + wxArrayInt *itemsChanged) +{ + // 100 is hardcoded but it shouldn't matter much: the important thing is + // that we don't refresh everything when really few (e.g. 1 or 2) items + // change state + static const size_t MANY_ITEMS = 100; + + wxASSERT_MSG( itemFrom <= itemTo, _T("should be in order") ); + + // are we going to have more [un]selected items than the other ones? + if ( itemTo - itemFrom > m_count/2 ) + { + if ( select != m_defaultState ) + { + // the default state now becomes the same as 'select' + m_defaultState = select; + + // so all the old selections (which had state select) shouldn't be + // selected any more, but all the other ones should + wxSelectedIndices selOld = m_itemsSel; + m_itemsSel.Empty(); + + // TODO: it should be possible to optimize the searches a bit + // knowing the possible range + + size_t item; + for ( item = 0; item < itemFrom; item++ ) + { + if ( selOld.Index(item) == wxNOT_FOUND ) + m_itemsSel.Add(item); + } + + for ( item = itemTo + 1; item < m_count; item++ ) + { + if ( selOld.Index(item) == wxNOT_FOUND ) + m_itemsSel.Add(item); + } + + // many items (> half) changed state + itemsChanged = NULL; + } + else // select == m_defaultState + { + // get the inclusive range of items between itemFrom and itemTo + size_t count = m_itemsSel.GetCount(), + start = m_itemsSel.IndexForInsert(itemFrom), + end = m_itemsSel.IndexForInsert(itemTo); + + if ( start == count || m_itemsSel[start] < itemFrom ) + { + start++; + } + + if ( end == count || m_itemsSel[end] > itemTo ) + { + end--; + } + + if ( start <= end ) + { + // delete all of them (from end to avoid changing indices) + for ( int i = end; i >= (int)start; i-- ) + { + if ( itemsChanged ) + { + if ( itemsChanged->GetCount() > MANY_ITEMS ) + { + // stop counting (see comment below) + itemsChanged = NULL; + } + else + { + itemsChanged->Add(m_itemsSel[i]); + } + } + + m_itemsSel.RemoveAt(i); + } + } + } + } + else // "few" items change state + { + if ( itemsChanged ) + { + itemsChanged->Empty(); + } + + // just add the items to the selection + for ( size_t item = itemFrom; item <= itemTo; item++ ) + { + if ( SelectItem(item, select) && itemsChanged ) + { + itemsChanged->Add(item); + + if ( itemsChanged->GetCount() > MANY_ITEMS ) + { + // stop counting them, we'll just eat gobs of memory + // for nothing at all - faster to refresh everything in + // this case + itemsChanged = NULL; + } + } + } + } + + // we set it to NULL if there are many items changing state + return itemsChanged != NULL; +} + +// ---------------------------------------------------------------------------- +// callbacks +// ---------------------------------------------------------------------------- + +void wxSelectionStore::OnItemDelete(size_t item) +{ + size_t count = m_itemsSel.GetCount(), + i = m_itemsSel.IndexForInsert(item); + + if ( i < count && m_itemsSel[i] == item ) + { + // this item itself was in m_itemsSel, remove it from there + m_itemsSel.RemoveAt(i); + + count--; + } + + // and adjust the index of all which follow it + while ( i < count ) + { + // all following elements must be greater than the one we deleted + wxASSERT_MSG( m_itemsSel[i] > item, _T("logic error") ); + + m_itemsSel[i++]--; + } +} + diff --git a/Externals/wxWidgets/src/generic/spinctlg.cpp b/Externals/wxWidgets/src/generic/spinctlg.cpp new file mode 100644 index 0000000000..a57cc36e65 --- /dev/null +++ b/Externals/wxWidgets/src/generic/spinctlg.cpp @@ -0,0 +1,364 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/generic/spinctlg.cpp +// Purpose: implements wxSpinCtrl as a composite control +// Author: Vadim Zeitlin +// Modified by: +// Created: 29.01.01 +// RCS-ID: $Id: spinctlg.cpp 42816 2006-10-31 08:50:17Z RD $ +// Copyright: (c) 2001 Vadim Zeitlin +// License: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +// There are port-specific versions for MSW, GTK, OS/2 and Mac, so exclude the +// contents of this file in those cases +#if !(defined(__WXMSW__) || defined(__WXGTK__) || defined(__WXPM__) || \ + defined(__WXMAC__)) || defined(__WXUNIVERSAL__) + +#ifndef WX_PRECOMP + #include "wx/textctrl.h" +#endif //WX_PRECOMP + +#if wxUSE_SPINCTRL + +#include "wx/spinbutt.h" +#include "wx/spinctrl.h" + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// the margin between the text control and the spin +static const wxCoord MARGIN = 2; + +// ---------------------------------------------------------------------------- +// wxSpinCtrlText: text control used by spin control +// ---------------------------------------------------------------------------- + +class wxSpinCtrlText : public wxTextCtrl +{ +public: + wxSpinCtrlText(wxSpinCtrl *spin, const wxString& value) + : wxTextCtrl(spin->GetParent(), wxID_ANY, value) + { + m_spin = spin; + + // remove the default minsize, the spinctrl will have one instead + SetSizeHints(wxDefaultCoord,wxDefaultCoord); + } + +protected: + void OnTextChange(wxCommandEvent& event) + { + int val; + if ( m_spin->GetTextValue(&val) ) + { + m_spin->GetSpinButton()->SetValue(val); + } + + event.Skip(); + } + + bool ProcessEvent(wxEvent &event) + { + // Hand button down events to wxSpinCtrl. Doesn't work. + if (event.GetEventType() == wxEVT_LEFT_DOWN && m_spin->ProcessEvent( event )) + return true; + + return wxTextCtrl::ProcessEvent( event ); + } + +private: + wxSpinCtrl *m_spin; + + DECLARE_EVENT_TABLE() +}; + +BEGIN_EVENT_TABLE(wxSpinCtrlText, wxTextCtrl) + EVT_TEXT(wxID_ANY, wxSpinCtrlText::OnTextChange) +END_EVENT_TABLE() + +// ---------------------------------------------------------------------------- +// wxSpinCtrlButton: spin button used by spin control +// ---------------------------------------------------------------------------- + +class wxSpinCtrlButton : public wxSpinButton +{ +public: + wxSpinCtrlButton(wxSpinCtrl *spin, int style) + : wxSpinButton(spin->GetParent()) + { + m_spin = spin; + + SetWindowStyle(style | wxSP_VERTICAL); + + // remove the default minsize, the spinctrl will have one instead + SetSizeHints(wxDefaultCoord,wxDefaultCoord); + } + +protected: + void OnSpinButton(wxSpinEvent& eventSpin) + { + m_spin->SetTextValue(eventSpin.GetPosition()); + + wxCommandEvent event(wxEVT_COMMAND_SPINCTRL_UPDATED, m_spin->GetId()); + event.SetEventObject(m_spin); + event.SetInt(eventSpin.GetPosition()); + + m_spin->GetEventHandler()->ProcessEvent(event); + + eventSpin.Skip(); + } + +private: + wxSpinCtrl *m_spin; + + DECLARE_EVENT_TABLE() +}; + +BEGIN_EVENT_TABLE(wxSpinCtrlButton, wxSpinButton) + EVT_SPIN(wxID_ANY, wxSpinCtrlButton::OnSpinButton) +END_EVENT_TABLE() + +IMPLEMENT_DYNAMIC_CLASS(wxSpinCtrl, wxControl) + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxSpinCtrl creation +// ---------------------------------------------------------------------------- + +void wxSpinCtrl::Init() +{ + m_text = NULL; + m_btn = NULL; +} + +bool wxSpinCtrl::Create(wxWindow *parent, + wxWindowID id, + const wxString& value, + const wxPoint& pos, + const wxSize& size, + long style, + int min, + int max, + int initial, + const wxString& name) +{ + if ( !wxControl::Create(parent, id, wxDefaultPosition, wxDefaultSize, style, + wxDefaultValidator, name) ) + { + return false; + } + + // the string value overrides the numeric one (for backwards compatibility + // reasons and also because it is simpler to satisfy the string value which + // comes much sooner in the list of arguments and leave the initial + // parameter unspecified) + if ( !value.empty() ) + { + long l; + if ( value.ToLong(&l) ) + initial = l; + } + + m_text = new wxSpinCtrlText(this, value); + m_btn = new wxSpinCtrlButton(this, style); + + m_btn->SetRange(min, max); + m_btn->SetValue(initial); + SetInitialSize(size); + Move(pos); + + // have to disable this window to avoid interfering it with message + // processing to the text and the button... but pretend it is enabled to + // make IsEnabled() return true + wxControl::Enable(false); // don't use non virtual Disable() here! + m_isEnabled = true; + + // we don't even need to show this window itself - and not doing it avoids + // that it overwrites the text control + wxControl::Show(false); + m_isShown = true; + return true; +} + +wxSpinCtrl::~wxSpinCtrl() +{ + // delete the controls now, don't leave them alive even though they would + // still be eventually deleted by our parent - but it will be too late, the + // user code expects them to be gone now + delete m_text; + m_text = NULL ; + delete m_btn; + m_btn = NULL ; +} + +// ---------------------------------------------------------------------------- +// geometry +// ---------------------------------------------------------------------------- + +wxSize wxSpinCtrl::DoGetBestSize() const +{ + wxSize sizeBtn = m_btn->GetBestSize(), + sizeText = m_text->GetBestSize(); + + return wxSize(sizeBtn.x + sizeText.x + MARGIN, sizeText.y); +} + +void wxSpinCtrl::DoMoveWindow(int x, int y, int width, int height) +{ + wxControl::DoMoveWindow(x, y, width, height); + + // position the subcontrols inside the client area + wxSize sizeBtn = m_btn->GetSize(); + + wxCoord wText = width - sizeBtn.x; + m_text->SetSize(x, y, wText, height); + m_btn->SetSize(x + wText + MARGIN, y, wxDefaultCoord, height); +} + +// ---------------------------------------------------------------------------- +// operations forwarded to the subcontrols +// ---------------------------------------------------------------------------- + +bool wxSpinCtrl::Enable(bool enable) +{ + if ( !wxControl::Enable(enable) ) + return false; + + m_btn->Enable(enable); + m_text->Enable(enable); + + return true; +} + +bool wxSpinCtrl::Show(bool show) +{ + if ( !wxControl::Show(show) ) + return false; + + // under GTK Show() is called the first time before we are fully + // constructed + if ( m_btn ) + { + m_btn->Show(show); + m_text->Show(show); + } + + return true; +} + +// ---------------------------------------------------------------------------- +// value and range access +// ---------------------------------------------------------------------------- + +bool wxSpinCtrl::GetTextValue(int *val) const +{ + long l; + if ( !m_text->GetValue().ToLong(&l) ) + { + // not a number at all + return false; + } + + if ( l < GetMin() || l > GetMax() ) + { + // out of range + return false; + } + + *val = l; + + return true; +} + +int wxSpinCtrl::GetValue() const +{ + return m_btn ? m_btn->GetValue() : 0; +} + +int wxSpinCtrl::GetMin() const +{ + return m_btn ? m_btn->GetMin() : 0; +} + +int wxSpinCtrl::GetMax() const +{ + return m_btn ? m_btn->GetMax() : 0; +} + +// ---------------------------------------------------------------------------- +// changing value and range +// ---------------------------------------------------------------------------- + +void wxSpinCtrl::SetTextValue(int val) +{ + wxCHECK_RET( m_text, _T("invalid call to wxSpinCtrl::SetTextValue") ); + + m_text->SetValue(wxString::Format(_T("%d"), val)); + + // select all text + m_text->SetSelection(0, -1); + + // and give focus to the control! + // m_text->SetFocus(); Why???? TODO. +} + +void wxSpinCtrl::SetValue(int val) +{ + wxCHECK_RET( m_btn, _T("invalid call to wxSpinCtrl::SetValue") ); + + SetTextValue(val); + + m_btn->SetValue(val); +} + +void wxSpinCtrl::SetValue(const wxString& text) +{ + wxCHECK_RET( m_text, _T("invalid call to wxSpinCtrl::SetValue") ); + + long val; + if ( text.ToLong(&val) && ((val > INT_MIN) && (val < INT_MAX)) ) + { + SetValue((int)val); + } + else // not a number at all or out of range + { + m_text->SetValue(text); + m_text->SetSelection(0, -1); + } +} + +void wxSpinCtrl::SetRange(int min, int max) +{ + wxCHECK_RET( m_btn, _T("invalid call to wxSpinCtrl::SetRange") ); + + m_btn->SetRange(min, max); +} + +void wxSpinCtrl::SetSelection(long from, long to) +{ + wxCHECK_RET( m_text, _T("invalid call to wxSpinCtrl::SetSelection") ); + + m_text->SetSelection(from, to); +} + +#endif // wxUSE_SPINCTRL +#endif // !wxPort-with-native-spinctrl diff --git a/Externals/wxWidgets/src/generic/splash.cpp b/Externals/wxWidgets/src/generic/splash.cpp new file mode 100644 index 0000000000..74512a9976 --- /dev/null +++ b/Externals/wxWidgets/src/generic/splash.cpp @@ -0,0 +1,201 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/generic/splash.cpp +// Purpose: wxSplashScreen class +// Author: Julian Smart +// Modified by: +// Created: 28/6/2000 +// RCS-ID: $Id: splash.cpp 42755 2006-10-30 19:41:46Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx/wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_SPLASH + +#ifdef __WXGTK20__ + #include +#endif + +#include "wx/splash.h" + +#ifndef WX_PRECOMP + #include "wx/dcmemory.h" + #include "wx/dcclient.h" +#endif + +/* + * wxSplashScreen + */ + +#define wxSPLASH_TIMER_ID 9999 + +IMPLEMENT_DYNAMIC_CLASS(wxSplashScreen, wxFrame) + +BEGIN_EVENT_TABLE(wxSplashScreen, wxFrame) + EVT_TIMER(wxSPLASH_TIMER_ID, wxSplashScreen::OnNotify) + EVT_CLOSE(wxSplashScreen::OnCloseWindow) +END_EVENT_TABLE() + +/* Note that unless we pass a non-default size to the frame, SetClientSize + * won't work properly under Windows, and the splash screen frame is sized + * slightly too small. + */ + +wxSplashScreen::wxSplashScreen(const wxBitmap& bitmap, long splashStyle, int milliseconds, wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style): + wxFrame(parent, id, wxEmptyString, wxPoint(0,0), wxSize(100, 100), style) +{ + // At least for GTK+ 2.0, this hint is not available. +#if defined(__WXGTK20__) +#if GTK_CHECK_VERSION(2,2,0) + gtk_window_set_type_hint(GTK_WINDOW(m_widget), + GDK_WINDOW_TYPE_HINT_SPLASHSCREEN); +#endif +#endif + + m_window = NULL; + m_splashStyle = splashStyle; + m_milliseconds = milliseconds; + + m_window = new wxSplashScreenWindow(bitmap, this, wxID_ANY, pos, size, wxNO_BORDER); + + SetClientSize(bitmap.GetWidth(), bitmap.GetHeight()); + + if (m_splashStyle & wxSPLASH_CENTRE_ON_PARENT) + CentreOnParent(); + else if (m_splashStyle & wxSPLASH_CENTRE_ON_SCREEN) + CentreOnScreen(); + + if (m_splashStyle & wxSPLASH_TIMEOUT) + { + m_timer.SetOwner(this, wxSPLASH_TIMER_ID); + m_timer.Start(milliseconds, true); + } + + Show(true); + m_window->SetFocus(); +#if defined( __WXMSW__ ) || defined(__WXMAC__) + Update(); // Without this, you see a blank screen for an instant +#else + wxYieldIfNeeded(); // Should eliminate this +#endif +} + +wxSplashScreen::~wxSplashScreen() +{ + m_timer.Stop(); +} + +void wxSplashScreen::OnNotify(wxTimerEvent& WXUNUSED(event)) +{ + Close(true); +} + +void wxSplashScreen::OnCloseWindow(wxCloseEvent& WXUNUSED(event)) +{ + m_timer.Stop(); + this->Destroy(); +} + +/* + * wxSplashScreenWindow + */ + +BEGIN_EVENT_TABLE(wxSplashScreenWindow, wxWindow) +#ifdef __WXGTK__ + EVT_PAINT(wxSplashScreenWindow::OnPaint) +#endif + EVT_ERASE_BACKGROUND(wxSplashScreenWindow::OnEraseBackground) + EVT_CHAR(wxSplashScreenWindow::OnChar) + EVT_MOUSE_EVENTS(wxSplashScreenWindow::OnMouseEvent) +END_EVENT_TABLE() + +wxSplashScreenWindow::wxSplashScreenWindow(const wxBitmap& bitmap, wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style): + wxWindow(parent, id, pos, size, style) +{ + m_bitmap = bitmap; + +#if !defined(__WXGTK__) && wxUSE_PALETTE + bool hiColour = (wxDisplayDepth() >= 16) ; + + if (bitmap.GetPalette() && !hiColour) + { + SetPalette(* bitmap.GetPalette()); + } +#endif + +} + +// VZ: why don't we do it under wxGTK? +#if !defined(__WXGTK__) && wxUSE_PALETTE + #define USE_PALETTE_IN_SPLASH +#endif + +static void wxDrawSplashBitmap(wxDC& dc, const wxBitmap& bitmap, int WXUNUSED(x), int WXUNUSED(y)) +{ + wxMemoryDC dcMem; + +#ifdef USE_PALETTE_IN_SPLASH + bool hiColour = (wxDisplayDepth() >= 16) ; + + if (bitmap.GetPalette() && !hiColour) + { + dcMem.SetPalette(* bitmap.GetPalette()); + } +#endif // USE_PALETTE_IN_SPLASH + + dcMem.SelectObjectAsSource(bitmap); + dc.Blit(0, 0, bitmap.GetWidth(), bitmap.GetHeight(), & dcMem, 0, 0); + dcMem.SelectObject(wxNullBitmap); + +#ifdef USE_PALETTE_IN_SPLASH + if (bitmap.GetPalette() && !hiColour) + { + dcMem.SetPalette(wxNullPalette); + } +#endif // USE_PALETTE_IN_SPLASH +} + +void wxSplashScreenWindow::OnPaint(wxPaintEvent& WXUNUSED(event)) +{ + wxPaintDC dc(this); + if (m_bitmap.Ok()) + wxDrawSplashBitmap(dc, m_bitmap, 0, 0); +} + +void wxSplashScreenWindow::OnEraseBackground(wxEraseEvent& event) +{ + if (event.GetDC()) + { + if (m_bitmap.Ok()) + { + wxDrawSplashBitmap(* event.GetDC(), m_bitmap, 0, 0); + } + } + else + { + wxClientDC dc(this); + if (m_bitmap.Ok()) + { + wxDrawSplashBitmap(dc, m_bitmap, 0, 0); + } + } +} + +void wxSplashScreenWindow::OnMouseEvent(wxMouseEvent& event) +{ + if (event.LeftDown() || event.RightDown()) + GetParent()->Close(true); +} + +void wxSplashScreenWindow::OnChar(wxKeyEvent& WXUNUSED(event)) +{ + GetParent()->Close(true); +} + +#endif // wxUSE_SPLASH diff --git a/Externals/wxWidgets/src/generic/splitter.cpp b/Externals/wxWidgets/src/generic/splitter.cpp new file mode 100644 index 0000000000..b72014c38c --- /dev/null +++ b/Externals/wxWidgets/src/generic/splitter.cpp @@ -0,0 +1,1049 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/generic/splitter.cpp +// Purpose: wxSplitterWindow implementation +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: splitter.cpp 42816 2006-10-31 08:50:17Z RD $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_SPLITTER + +#include "wx/splitter.h" + +#ifndef WX_PRECOMP + #include "wx/string.h" + #include "wx/utils.h" + #include "wx/log.h" + + #include "wx/dcclient.h" + #include "wx/dcscreen.h" + + #include "wx/window.h" + #include "wx/dialog.h" + #include "wx/frame.h" + + #include "wx/settings.h" +#endif + +#include "wx/renderer.h" + +#include + +DEFINE_EVENT_TYPE(wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGED) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGING) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_SPLITTER_DOUBLECLICKED) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_SPLITTER_UNSPLIT) + +IMPLEMENT_DYNAMIC_CLASS(wxSplitterWindow, wxWindow) + +/* + TODO PROPERTIES + style wxSP_3D + sashpos (long , 0 ) + minsize (long -1 ) + object, object_ref + orientation +*/ + +IMPLEMENT_DYNAMIC_CLASS(wxSplitterEvent, wxNotifyEvent) + +BEGIN_EVENT_TABLE(wxSplitterWindow, wxWindow) + EVT_PAINT(wxSplitterWindow::OnPaint) + EVT_SIZE(wxSplitterWindow::OnSize) + EVT_MOUSE_EVENTS(wxSplitterWindow::OnMouseEvent) + +#if defined( __WXMSW__ ) || defined( __WXMAC__) + EVT_SET_CURSOR(wxSplitterWindow::OnSetCursor) +#endif // wxMSW + + WX_EVENT_TABLE_CONTROL_CONTAINER(wxSplitterWindow) +END_EVENT_TABLE() + +WX_DELEGATE_TO_CONTROL_CONTAINER(wxSplitterWindow, wxWindow) + +bool wxSplitterWindow::Create(wxWindow *parent, wxWindowID id, + const wxPoint& pos, + const wxSize& size, + long style, + const wxString& name) +{ + // allow TABbing from one window to the other + style |= wxTAB_TRAVERSAL; + + // we draw our border ourselves to blend the sash with it + style &= ~wxBORDER_MASK; + style |= wxBORDER_NONE; + + if ( !wxWindow::Create(parent, id, pos, size, style, name) ) + return false; + + if (size.x >= 0) + m_lastSize.x = size.x; + if (size.y >= 0) + m_lastSize.y = size.y; + + m_permitUnsplitAlways = (style & wxSP_PERMIT_UNSPLIT) != 0; + + // FIXME: with this line the background is not erased at all under GTK1, + // so temporary avoid it there +#if !defined(__WXGTK__) || defined(__WXGTK20__) + // don't erase the splitter background, it's pointless as we overwrite it + // anyhow + SetBackgroundStyle(wxBG_STYLE_CUSTOM); +#endif + + return true; +} + +void wxSplitterWindow::Init() +{ + m_container.SetContainerWindow(this); + + m_splitMode = wxSPLIT_VERTICAL; + m_permitUnsplitAlways = true; + m_windowOne = (wxWindow *) NULL; + m_windowTwo = (wxWindow *) NULL; + m_dragMode = wxSPLIT_DRAG_NONE; + m_oldX = 0; + m_oldY = 0; + m_firstX = 0; + m_firstY = 0; + m_sashPosition = m_requestedSashPosition = 0; + m_sashGravity = 0.0; + m_sashSize = -1; // -1 means use the native sash size + m_lastSize = wxSize(0,0); + m_checkRequestedSashPosition = false; + m_minimumPaneSize = 0; + m_sashCursorWE = wxCursor(wxCURSOR_SIZEWE); + m_sashCursorNS = wxCursor(wxCURSOR_SIZENS); + m_sashTrackerPen = new wxPen(*wxBLACK, 2, wxSOLID); + + m_needUpdating = false; + m_isHot = false; +} + +wxSplitterWindow::~wxSplitterWindow() +{ + delete m_sashTrackerPen; +} + +// ---------------------------------------------------------------------------- +// entering/leaving sash +// ---------------------------------------------------------------------------- + +void wxSplitterWindow::RedrawIfHotSensitive(bool isHot) +{ + if ( wxRendererNative::Get().GetSplitterParams(this).isHotSensitive ) + { + m_isHot = isHot; + + wxClientDC dc(this); + DrawSash(dc); + } + //else: we don't change our appearance, don't redraw to avoid flicker +} + +void wxSplitterWindow::OnEnterSash() +{ + SetResizeCursor(); + + RedrawIfHotSensitive(true); +} + +void wxSplitterWindow::OnLeaveSash() +{ + SetCursor(*wxSTANDARD_CURSOR); + + RedrawIfHotSensitive(false); +} + +void wxSplitterWindow::SetResizeCursor() +{ + SetCursor(m_splitMode == wxSPLIT_VERTICAL ? m_sashCursorWE + : m_sashCursorNS); +} + +// ---------------------------------------------------------------------------- +// other event handlers +// ---------------------------------------------------------------------------- + +void wxSplitterWindow::OnPaint(wxPaintEvent& WXUNUSED(event)) +{ + wxPaintDC dc(this); + + DrawSash(dc); +} + +void wxSplitterWindow::OnInternalIdle() +{ + wxWindow::OnInternalIdle(); + + // if this is the first idle time after a sash position has potentially + // been set, allow SizeWindows to check for a requested size. + if (!m_checkRequestedSashPosition) + { + m_checkRequestedSashPosition = true; + SizeWindows(); + return; // it won't needUpdating in this case + } + + if (m_needUpdating) + SizeWindows(); +} + +void wxSplitterWindow::OnMouseEvent(wxMouseEvent& event) +{ + int x = (int)event.GetX(), + y = (int)event.GetY(); + + if (GetWindowStyle() & wxSP_NOSASH) + return; + + // with wxSP_LIVE_UPDATE style the splitter windows are always resized + // following the mouse movement while it drags the sash, without it we only + // draw the sash at the new position but only resize the windows when the + // dragging is finished +#if defined( __WXMAC__ ) && defined(TARGET_API_MAC_OSX) && TARGET_API_MAC_OSX == 1 + bool isLive = true ; // FIXME: why? +#else + bool isLive = HasFlag(wxSP_LIVE_UPDATE); +#endif + if (event.LeftDown()) + { + if ( SashHitTest(x, y) ) + { + // Start the drag now + m_dragMode = wxSPLIT_DRAG_DRAGGING; + + // Capture mouse and set the cursor + CaptureMouse(); + SetResizeCursor(); + + if ( !isLive ) + { + // remember the initial sash position and draw the initial + // shadow sash + m_sashPositionCurrent = m_sashPosition; + + DrawSashTracker(x, y); + } + + m_oldX = x; + m_oldY = y; + + SetResizeCursor(); + return; + } + } + else if (event.LeftUp() && m_dragMode == wxSPLIT_DRAG_DRAGGING) + { + // We can stop dragging now and see what we've got. + m_dragMode = wxSPLIT_DRAG_NONE; + + // Release mouse and unset the cursor + ReleaseMouse(); + SetCursor(* wxSTANDARD_CURSOR); + + // exit if unsplit after doubleclick + if ( !IsSplit() ) + { + return; + } + + // Erase old tracker + if ( !isLive ) + { + DrawSashTracker(m_oldX, m_oldY); + } + + // the position of the click doesn't exactly correspond to + // m_sashPosition, rather it changes it by the distance by which the + // mouse has moved + int diff = m_splitMode == wxSPLIT_VERTICAL ? x - m_oldX : y - m_oldY; + + int posSashOld = isLive ? m_sashPosition : m_sashPositionCurrent; + int posSashNew = OnSashPositionChanging(posSashOld + diff); + if ( posSashNew == -1 ) + { + // change not allowed + return; + } + + if ( m_permitUnsplitAlways || m_minimumPaneSize == 0 ) + { + // Deal with possible unsplit scenarios + if ( posSashNew == 0 ) + { + // We remove the first window from the view + wxWindow *removedWindow = m_windowOne; + m_windowOne = m_windowTwo; + m_windowTwo = (wxWindow *) NULL; + OnUnsplit(removedWindow); + wxSplitterEvent eventUnsplit(wxEVT_COMMAND_SPLITTER_UNSPLIT, this); + eventUnsplit.m_data.win = removedWindow; + (void)DoSendEvent(eventUnsplit); + SetSashPositionAndNotify(0); + } + else if ( posSashNew == GetWindowSize() ) + { + // We remove the second window from the view + wxWindow *removedWindow = m_windowTwo; + m_windowTwo = (wxWindow *) NULL; + OnUnsplit(removedWindow); + wxSplitterEvent eventUnsplit(wxEVT_COMMAND_SPLITTER_UNSPLIT, this); + eventUnsplit.m_data.win = removedWindow; + (void)DoSendEvent(eventUnsplit); + SetSashPositionAndNotify(0); + } + else + { + SetSashPositionAndNotify(posSashNew); + } + } + else + { + SetSashPositionAndNotify(posSashNew); + } + + SizeWindows(); + } // left up && dragging + else if ((event.Moving() || event.Leaving() || event.Entering()) && (m_dragMode == wxSPLIT_DRAG_NONE)) + { + if ( event.Leaving() || !SashHitTest(x, y) ) + OnLeaveSash(); + else + OnEnterSash(); + } + else if (event.Dragging() && (m_dragMode == wxSPLIT_DRAG_DRAGGING)) + { + int diff = m_splitMode == wxSPLIT_VERTICAL ? x - m_oldX : y - m_oldY; + if ( !diff ) + { + // nothing to do, mouse didn't really move far enough + return; + } + + int posSashOld = isLive ? m_sashPosition : m_sashPositionCurrent; + int posSashNew = OnSashPositionChanging(posSashOld + diff); + if ( posSashNew == -1 ) + { + // change not allowed + return; + } + + if ( posSashNew == m_sashPosition ) + return; + + // Erase old tracker + if ( !isLive ) + { + DrawSashTracker(m_oldX, m_oldY); + } + + if (m_splitMode == wxSPLIT_VERTICAL) + x = posSashNew; + else + y = posSashNew; + + // Remember old positions + m_oldX = x; + m_oldY = y; + +#ifdef __WXMSW__ + // As we captured the mouse, we may get the mouse events from outside + // our window - for example, negative values in x, y. This has a weird + // consequence under MSW where we use unsigned values sometimes and + // signed ones other times: the coordinates turn as big positive + // numbers and so the sash is drawn on the *right* side of the window + // instead of the left (or bottom instead of top). Correct this. + if ( (short)m_oldX < 0 ) + m_oldX = 0; + if ( (short)m_oldY < 0 ) + m_oldY = 0; +#endif // __WXMSW__ + + // Draw new one + if ( !isLive ) + { + m_sashPositionCurrent = posSashNew; + + DrawSashTracker(m_oldX, m_oldY); + } + else + { + DoSetSashPosition(posSashNew); + m_needUpdating = true; + } + } + else if ( event.LeftDClick() && m_windowTwo ) + { + OnDoubleClickSash(x, y); + } +} + +void wxSplitterWindow::OnSize(wxSizeEvent& event) +{ + // only process this message if we're not iconized - otherwise iconizing + // and restoring a window containing the splitter has a funny side effect + // of changing the splitter position! + wxWindow *parent = wxGetTopLevelParent(this); + bool iconized; + + wxTopLevelWindow *winTop = wxDynamicCast(parent, wxTopLevelWindow); + if ( winTop ) + { + iconized = winTop->IsIconized(); + } + else + { + wxFAIL_MSG(wxT("should have a top level parent!")); + + iconized = false; + } + + if ( iconized ) + { + m_lastSize = wxSize(0,0); + + event.Skip(); + + return; + } + + if ( m_windowTwo ) + { + int w, h; + GetClientSize(&w, &h); + + int size = m_splitMode == wxSPLIT_VERTICAL ? w : h; + + int old_size = m_splitMode == wxSPLIT_VERTICAL ? m_lastSize.x : m_lastSize.y; + if ( old_size != 0 ) + { + int delta = (int) ( (size - old_size)*m_sashGravity ); + if ( delta != 0 ) + { + int newPosition = m_sashPosition + delta; + if( newPosition < m_minimumPaneSize ) + newPosition = m_minimumPaneSize; + SetSashPositionAndNotify(newPosition); + } + } + + if ( m_sashPosition >= size - 5 ) + SetSashPositionAndNotify(wxMax(10, size - 40)); + m_lastSize = wxSize(w,h); + } + + SizeWindows(); +} + +void wxSplitterWindow::SetSashGravity(double gravity) +{ + wxCHECK_RET( gravity >= 0. && gravity <= 1., + _T("invalid gravity value") ); + + m_sashGravity = gravity; +} + +bool wxSplitterWindow::SashHitTest(int x, int y, int tolerance) +{ + if ( m_windowTwo == NULL || m_sashPosition == 0) + return false; // No sash + + int z = m_splitMode == wxSPLIT_VERTICAL ? x : y; + int hitMin = m_sashPosition - tolerance; + int hitMax = m_sashPosition + GetSashSize() + tolerance; + + return z >= hitMin && z <= hitMax; +} + +int wxSplitterWindow::GetSashSize() const +{ + return m_sashSize > -1 ? m_sashSize : wxRendererNative::Get().GetSplitterParams(this).widthSash; +} + +int wxSplitterWindow::GetBorderSize() const +{ + return wxRendererNative::Get().GetSplitterParams(this).border; +} + +// Draw the sash +void wxSplitterWindow::DrawSash(wxDC& dc) +{ + if (HasFlag(wxSP_3DBORDER)) + wxRendererNative::Get().DrawSplitterBorder + ( + this, + dc, + GetClientRect() + ); + + // don't draw sash if we're not split + if ( m_sashPosition == 0 || !m_windowTwo ) + return; + + // nor if we're configured to not show it + if ( HasFlag(wxSP_NOSASH) ) + return; + + wxRendererNative::Get().DrawSplitterSash + ( + this, + dc, + GetClientSize(), + m_sashPosition, + m_splitMode == wxSPLIT_VERTICAL ? wxVERTICAL + : wxHORIZONTAL, + m_isHot ? (int)wxCONTROL_CURRENT : 0 + ); +} + +// Draw the sash tracker (for whilst moving the sash) +void wxSplitterWindow::DrawSashTracker(int x, int y) +{ + int w, h; + GetClientSize(&w, &h); + + wxScreenDC screenDC; + int x1, y1; + int x2, y2; + + if ( m_splitMode == wxSPLIT_VERTICAL ) + { + x1 = x; y1 = 2; + x2 = x; y2 = h-2; + + if ( x1 > w ) + { + x1 = w; x2 = w; + } + else if ( x1 < 0 ) + { + x1 = 0; x2 = 0; + } + } + else + { + x1 = 2; y1 = y; + x2 = w-2; y2 = y; + + if ( y1 > h ) + { + y1 = h; + y2 = h; + } + else if ( y1 < 0 ) + { + y1 = 0; + y2 = 0; + } + } + + ClientToScreen(&x1, &y1); + ClientToScreen(&x2, &y2); + + screenDC.SetLogicalFunction(wxINVERT); + screenDC.SetPen(*m_sashTrackerPen); + screenDC.SetBrush(*wxTRANSPARENT_BRUSH); + + screenDC.DrawLine(x1, y1, x2, y2); + + screenDC.SetLogicalFunction(wxCOPY); +} + +int wxSplitterWindow::GetWindowSize() const +{ + wxSize size = GetClientSize(); + + return m_splitMode == wxSPLIT_VERTICAL ? size.x : size.y; +} + +int wxSplitterWindow::AdjustSashPosition(int sashPos) const +{ + wxWindow *win; + + win = GetWindow1(); + if ( win ) + { + // the window shouldn't be smaller than its own minimal size nor + // smaller than the minimual pane size specified for this splitter + int minSize = m_splitMode == wxSPLIT_VERTICAL ? win->GetMinWidth() + : win->GetMinHeight(); + + if ( minSize == -1 || m_minimumPaneSize > minSize ) + minSize = m_minimumPaneSize; + + minSize += GetBorderSize(); + + if ( sashPos < minSize ) + sashPos = minSize; + } + + win = GetWindow2(); + if ( win ) + { + int minSize = m_splitMode == wxSPLIT_VERTICAL ? win->GetMinWidth() + : win->GetMinHeight(); + + if ( minSize == -1 || m_minimumPaneSize > minSize ) + minSize = m_minimumPaneSize; + + int maxSize = GetWindowSize() - minSize - GetBorderSize() - GetSashSize(); + if ( maxSize > 0 && sashPos > maxSize ) + sashPos = maxSize; + } + + return sashPos; +} + +bool wxSplitterWindow::DoSetSashPosition(int sashPos) +{ + int newSashPosition = AdjustSashPosition(sashPos); + + if ( newSashPosition == m_sashPosition ) + return false; + + m_sashPosition = newSashPosition; + + return true; +} + +void wxSplitterWindow::SetSashPositionAndNotify(int sashPos) +{ + // we must reset the request here, otherwise the sash would be stuck at + // old position if the user attempted to move the sash after invalid + // (e.g. smaller than minsize) sash position was requested using + // SetSashPosition(): + m_requestedSashPosition = INT_MAX; + + // note that we must send the event in any case, i.e. even if the sash + // position hasn't changed and DoSetSashPosition() returns false because we + // must generate a CHANGED event at the end of resizing + DoSetSashPosition(sashPos); + + wxSplitterEvent event(wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGED, this); + event.m_data.pos = m_sashPosition; + + (void)DoSendEvent(event); +} + +// Position and size subwindows. +// Note that the border size applies to each subwindow, not +// including the edges next to the sash. +void wxSplitterWindow::SizeWindows() +{ + // check if we have delayed setting the real sash position + if ( m_checkRequestedSashPosition && m_requestedSashPosition != INT_MAX ) + { + int newSashPosition = ConvertSashPosition(m_requestedSashPosition); + if ( newSashPosition != m_sashPosition ) + { + DoSetSashPosition(newSashPosition); + } + + if ( newSashPosition <= m_sashPosition + && newSashPosition >= m_sashPosition - GetBorderSize() ) + { + // don't update it any more + m_requestedSashPosition = INT_MAX; + } + } + + int w, h; + GetClientSize(&w, &h); + + if ( GetWindow1() && !GetWindow2() ) + { + GetWindow1()->SetSize(GetBorderSize(), GetBorderSize(), + w - 2*GetBorderSize(), h - 2*GetBorderSize()); + } + else if ( GetWindow1() && GetWindow2() ) + { + const int border = GetBorderSize(), + sash = GetSashSize(); + + int size1 = GetSashPosition() - border, + size2 = GetSashPosition() + sash; + + int x2, y2, w1, h1, w2, h2; + if ( GetSplitMode() == wxSPLIT_VERTICAL ) + { + w1 = size1; + w2 = w - 2*border - sash - w1; + if (w2 < 0) + w2 = 0; + h2 = h - 2*border; + if (h2 < 0) + h2 = 0; + h1 = h2; + x2 = size2; + y2 = border; + } + else // horz splitter + { + w2 = w - 2*border; + if (w2 < 0) + w2 = 0; + w1 = w2; + h1 = size1; + h2 = h - 2*border - sash - h1; + if (h2 < 0) + h2 = 0; + x2 = border; + y2 = size2; + } + + GetWindow2()->SetSize(x2, y2, w2, h2); + GetWindow1()->SetSize(border, border, w1, h1); + } + + wxClientDC dc(this); + DrawSash(dc); + + SetNeedUpdating(false); +} + +// Set pane for unsplit window +void wxSplitterWindow::Initialize(wxWindow *window) +{ + wxASSERT_MSG( (!window || (window && window->GetParent() == this)), + _T("windows in the splitter should have it as parent!") ); + + if (window && !window->IsShown()) + window->Show(); + + m_windowOne = window; + m_windowTwo = (wxWindow *) NULL; + DoSetSashPosition(0); +} + +// Associates the given window with window 2, drawing the appropriate sash +// and changing the split mode. +// Does nothing and returns false if the window is already split. +bool wxSplitterWindow::DoSplit(wxSplitMode mode, + wxWindow *window1, wxWindow *window2, + int sashPosition) +{ + if ( IsSplit() ) + return false; + + wxCHECK_MSG( window1 && window2, false, + _T("can not split with NULL window(s)") ); + + wxCHECK_MSG( window1->GetParent() == this && window2->GetParent() == this, false, + _T("windows in the splitter should have it as parent!") ); + + if (! window1->IsShown()) + window1->Show(); + if (! window2->IsShown()) + window2->Show(); + + m_splitMode = mode; + m_windowOne = window1; + m_windowTwo = window2; + + // remember the sash position we want to set for later if we can't set it + // right now (e.g. because the window is too small) + m_requestedSashPosition = sashPosition; + m_checkRequestedSashPosition = false; + + DoSetSashPosition(ConvertSashPosition(sashPosition)); + + SizeWindows(); + + return true; +} + +int wxSplitterWindow::ConvertSashPosition(int sashPosition) const +{ + if ( sashPosition > 0 ) + { + return sashPosition; + } + else if ( sashPosition < 0 ) + { + // It's negative so adding is subtracting + return GetWindowSize() + sashPosition; + } + else // sashPosition == 0 + { + // default, put it in the centre + return GetWindowSize() / 2; + } +} + +// Remove the specified (or second) window from the view +// Doesn't actually delete the window. +bool wxSplitterWindow::Unsplit(wxWindow *toRemove) +{ + if ( ! IsSplit() ) + return false; + + wxWindow *win; + if ( toRemove == NULL || toRemove == m_windowTwo) + { + win = m_windowTwo ; + m_windowTwo = (wxWindow *) NULL; + } + else if ( toRemove == m_windowOne ) + { + win = m_windowOne ; + m_windowOne = m_windowTwo; + m_windowTwo = (wxWindow *) NULL; + } + else + { + wxFAIL_MSG(wxT("splitter: attempt to remove a non-existent window")); + + return false; + } + + OnUnsplit(win); + DoSetSashPosition(0); + SizeWindows(); + + return true; +} + +// Replace a window with another one +bool wxSplitterWindow::ReplaceWindow(wxWindow *winOld, wxWindow *winNew) +{ + wxCHECK_MSG( winOld, false, wxT("use one of Split() functions instead") ); + wxCHECK_MSG( winNew, false, wxT("use Unsplit() functions instead") ); + + if ( winOld == m_windowTwo ) + { + m_windowTwo = winNew; + } + else if ( winOld == m_windowOne ) + { + m_windowOne = winNew; + } + else + { + wxFAIL_MSG(wxT("splitter: attempt to replace a non-existent window")); + + return false; + } + + SizeWindows(); + + return true; +} + +void wxSplitterWindow::SetMinimumPaneSize(int min) +{ + m_minimumPaneSize = min; + int pos = m_requestedSashPosition != INT_MAX ? m_requestedSashPosition : m_sashPosition; + SetSashPosition(pos); // re-check limits +} + +void wxSplitterWindow::SetSashPosition(int position, bool redraw) +{ + // remember the sash position we want to set for later if we can't set it + // right now (e.g. because the window is too small) + m_requestedSashPosition = position; + m_checkRequestedSashPosition = false; + + DoSetSashPosition(ConvertSashPosition(position)); + + if ( redraw ) + { + SizeWindows(); + } +} + +// Make sure the child window sizes are updated. This is useful +// for reducing flicker by updating the sizes before a +// window is shown, if you know the overall size is correct. +void wxSplitterWindow::UpdateSize() +{ + m_checkRequestedSashPosition = true; + SizeWindows(); + m_checkRequestedSashPosition = false; +} + +bool wxSplitterWindow::DoSendEvent(wxSplitterEvent& event) +{ + return !GetEventHandler()->ProcessEvent(event) || event.IsAllowed(); +} + +wxSize wxSplitterWindow::DoGetBestSize() const +{ + // get best sizes of subwindows + wxSize size1, size2; + if ( m_windowOne ) + size1 = m_windowOne->GetEffectiveMinSize(); + if ( m_windowTwo ) + size2 = m_windowTwo->GetEffectiveMinSize(); + + // sum them + // + // pSash points to the size component to which sash size must be added + int *pSash; + wxSize sizeBest; + if ( m_splitMode == wxSPLIT_VERTICAL ) + { + sizeBest.y = wxMax(size1.y, size2.y); + sizeBest.x = wxMax(size1.x, m_minimumPaneSize) + + wxMax(size2.x, m_minimumPaneSize); + + pSash = &sizeBest.x; + } + else // wxSPLIT_HORIZONTAL + { + sizeBest.x = wxMax(size1.x, size2.x); + sizeBest.y = wxMax(size1.y, m_minimumPaneSize) + + wxMax(size2.y, m_minimumPaneSize); + + pSash = &sizeBest.y; + } + + // account for the border and the sash + int border = 2*GetBorderSize(); + *pSash += GetSashSize(); + sizeBest.x += border; + sizeBest.y += border; + + return sizeBest; +} + +// --------------------------------------------------------------------------- +// wxSplitterWindow virtual functions: they now just generate the events +// --------------------------------------------------------------------------- + +bool wxSplitterWindow::OnSashPositionChange(int WXUNUSED(newSashPosition)) +{ + // always allow by default + return true; +} + +int wxSplitterWindow::OnSashPositionChanging(int newSashPosition) +{ + // If within UNSPLIT_THRESHOLD from edge, set to edge to cause closure. + const int UNSPLIT_THRESHOLD = 4; + + // first of all, check if OnSashPositionChange() doesn't forbid this change + if ( !OnSashPositionChange(newSashPosition) ) + { + // it does + return -1; + } + + // Obtain relevant window dimension for bottom / right threshold check + int window_size = GetWindowSize(); + + bool unsplit_scenario = false; + if ( m_permitUnsplitAlways || m_minimumPaneSize == 0 ) + { + // Do edge detection if unsplit premitted + if ( newSashPosition <= UNSPLIT_THRESHOLD ) + { + // threshold top / left check + newSashPosition = 0; + unsplit_scenario = true; + } + if ( newSashPosition >= window_size - UNSPLIT_THRESHOLD ) + { + // threshold bottom/right check + newSashPosition = window_size; + unsplit_scenario = true; + } + } + + if ( !unsplit_scenario ) + { + // If resultant pane would be too small, enlarge it + newSashPosition = AdjustSashPosition(newSashPosition); + } + + // If the result is out of bounds it means minimum size is too big, + // so split window in half as best compromise. + if ( newSashPosition < 0 || newSashPosition > window_size ) + newSashPosition = window_size / 2; + + // now let the event handler have it + // + // FIXME: shouldn't we do it before the adjustments above so as to ensure + // that the sash position is always reasonable? + wxSplitterEvent event(wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGING, this); + event.m_data.pos = newSashPosition; + + if ( !DoSendEvent(event) ) + { + // the event handler vetoed the change + newSashPosition = -1; + } + else + { + // it could have been changed by it + newSashPosition = event.GetSashPosition(); + } + + return newSashPosition; +} + +// Called when the sash is double-clicked. The default behaviour is to remove +// the sash if the minimum pane size is zero. +void wxSplitterWindow::OnDoubleClickSash(int x, int y) +{ + wxCHECK_RET(m_windowTwo, wxT("splitter: no window to remove")); + + // new code should handle events instead of using the virtual functions + wxSplitterEvent event(wxEVT_COMMAND_SPLITTER_DOUBLECLICKED, this); + event.m_data.pt.x = x; + event.m_data.pt.y = y; + if ( DoSendEvent(event) ) + { + if ( GetMinimumPaneSize() == 0 || m_permitUnsplitAlways ) + { + wxWindow* win = m_windowTwo; + if ( Unsplit(win) ) + { + wxSplitterEvent unsplitEvent(wxEVT_COMMAND_SPLITTER_UNSPLIT, this); + unsplitEvent.m_data.win = win; + (void)DoSendEvent(unsplitEvent); + } + } + } + //else: blocked by user +} + +void wxSplitterWindow::OnUnsplit(wxWindow *winRemoved) +{ + // call this before calling the event handler which may delete the window + winRemoved->Show(false); +} + +#if defined( __WXMSW__ ) || defined( __WXMAC__) + +// this is currently called (and needed) under MSW only... +void wxSplitterWindow::OnSetCursor(wxSetCursorEvent& event) +{ + // if we don't do it, the resizing cursor might be set for child window: + // and like this we explicitly say that our cursor should not be used for + // children windows which overlap us + + if ( SashHitTest(event.GetX(), event.GetY(), 0) ) + { + // default processing is ok + event.Skip(); + } + //else: do nothing, in particular, don't call Skip() +} + +#endif // wxMSW || wxMac + +#endif // wxUSE_SPLITTER + diff --git a/Externals/wxWidgets/src/generic/srchctlg.cpp b/Externals/wxWidgets/src/generic/srchctlg.cpp new file mode 100644 index 0000000000..8b7edad0dc --- /dev/null +++ b/Externals/wxWidgets/src/generic/srchctlg.cpp @@ -0,0 +1,1216 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/generic/srchctlg.cpp +// Purpose: implements wxSearchCtrl as a composite control +// Author: Vince Harron +// Created: 2006-02-19 +// RCS-ID: $Id: srchctlg.cpp 47962 2007-08-08 12:38:13Z JS $ +// Copyright: Vince Harron +// License: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_SEARCHCTRL + +#include "wx/srchctrl.h" + +#ifndef WX_PRECOMP + #include "wx/button.h" + #include "wx/dcclient.h" + #include "wx/menu.h" + #include "wx/dcmemory.h" +#endif //WX_PRECOMP + +#if !wxUSE_NATIVE_SEARCH_CONTROL + +#include "wx/image.h" + +#define WXMAX(a,b) ((a)>(b)?(a):(b)) + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// the margin between the text control and the search/cancel buttons +static const wxCoord MARGIN = 2; + +// border around all controls to compensate for wxSIMPLE_BORDER +#if defined(__WXMSW__) +static const wxCoord BORDER = 0; +static const wxCoord ICON_MARGIN = 2; +static const wxCoord ICON_OFFSET = 2; +#else +static const wxCoord BORDER = 2; +static const wxCoord ICON_MARGIN = 0; +static const wxCoord ICON_OFFSET = 0; +#endif + +// ---------------------------------------------------------------------------- +// TODO: These functions or something like them should probably be made +// public. There are similar functions in src/aui/dockart.cpp... + +static double wxBlendColour(double fg, double bg, double alpha) +{ + double result = bg + (alpha * (fg - bg)); + if (result < 0.0) + result = 0.0; + if (result > 255) + result = 255; + return result; +} + +static wxColor wxStepColour(const wxColor& c, int ialpha) +{ + if (ialpha == 100) + return c; + + double r = c.Red(), g = c.Green(), b = c.Blue(); + double bg; + + // ialpha is 0..200 where 0 is completely black + // and 200 is completely white and 100 is the same + // convert that to normal alpha 0.0 - 1.0 + ialpha = wxMin(ialpha, 200); + ialpha = wxMax(ialpha, 0); + double alpha = ((double)(ialpha - 100.0))/100.0; + + if (ialpha > 100) + { + // blend with white + bg = 255.0; + alpha = 1.0 - alpha; // 0 = transparent fg; 1 = opaque fg + } + else + { + // blend with black + bg = 0.0; + alpha = 1.0 + alpha; // 0 = transparent fg; 1 = opaque fg + } + + r = wxBlendColour(r, bg, alpha); + g = wxBlendColour(g, bg, alpha); + b = wxBlendColour(b, bg, alpha); + + return wxColour((unsigned char)r, (unsigned char)g, (unsigned char)b); +} + +#define LIGHT_STEP 160 + +// ---------------------------------------------------------------------------- +// wxSearchTextCtrl: text control used by search control +// ---------------------------------------------------------------------------- + +class wxSearchTextCtrl : public wxTextCtrl +{ +public: + wxSearchTextCtrl(wxSearchCtrl *search, const wxString& value, int style) + : wxTextCtrl(search, wxID_ANY, value, wxDefaultPosition, wxDefaultSize, + style | wxNO_BORDER) + { + m_search = search; + m_defaultFG = GetForegroundColour(); + + // remove the default minsize, the searchctrl will have one instead + SetSizeHints(wxDefaultCoord,wxDefaultCoord); + } + + void SetDescriptiveText(const wxString& text) + { + if ( GetValue() == m_descriptiveText ) + { + ChangeValue(wxEmptyString); + } + + m_descriptiveText = text; + } + + wxString GetDescriptiveText() const + { + return m_descriptiveText; + } + +protected: + void OnText(wxCommandEvent& eventText) + { + wxCommandEvent event(eventText); + event.SetEventObject(m_search); + event.SetId(m_search->GetId()); + + m_search->GetEventHandler()->ProcessEvent(event); + } + + void OnTextUrl(wxTextUrlEvent& eventText) + { + // copy constructor is disabled for some reason? + //wxTextUrlEvent event(eventText); + wxTextUrlEvent event( + m_search->GetId(), + eventText.GetMouseEvent(), + eventText.GetURLStart(), + eventText.GetURLEnd() + ); + event.SetEventObject(m_search); + + m_search->GetEventHandler()->ProcessEvent(event); + } + + void OnIdle(wxIdleEvent& WXUNUSED(event)) + { + if ( IsEmpty() && !(wxWindow::FindFocus() == this) ) + { + ChangeValue(m_descriptiveText); + SetInsertionPoint(0); + SetForegroundColour(wxStepColour(m_defaultFG, LIGHT_STEP)); + } + } + + void OnFocus(wxFocusEvent& event) + { + event.Skip(); + if ( GetValue() == m_descriptiveText ) + { + ChangeValue(wxEmptyString); + SetForegroundColour(m_defaultFG); + } + } + +private: + wxSearchCtrl* m_search; + wxString m_descriptiveText; + wxColour m_defaultFG; + + DECLARE_EVENT_TABLE() +}; + +BEGIN_EVENT_TABLE(wxSearchTextCtrl, wxTextCtrl) + EVT_TEXT(wxID_ANY, wxSearchTextCtrl::OnText) + EVT_TEXT_ENTER(wxID_ANY, wxSearchTextCtrl::OnText) + EVT_TEXT_URL(wxID_ANY, wxSearchTextCtrl::OnTextUrl) + EVT_TEXT_MAXLEN(wxID_ANY, wxSearchTextCtrl::OnText) + EVT_IDLE(wxSearchTextCtrl::OnIdle) + EVT_SET_FOCUS(wxSearchTextCtrl::OnFocus) +END_EVENT_TABLE() + +// ---------------------------------------------------------------------------- +// wxSearchButton: search button used by search control +// ---------------------------------------------------------------------------- + +class wxSearchButton : public wxControl +{ +public: + wxSearchButton(wxSearchCtrl *search, int eventType, const wxBitmap& bmp) + : wxControl(search, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER), + m_search(search), + m_eventType(eventType), + m_bmp(bmp) + { } + + void SetBitmapLabel(const wxBitmap& label) { m_bmp = label; } + + +protected: + wxSize DoGetBestSize() const + { + return wxSize(m_bmp.GetWidth(), m_bmp.GetHeight()); + } + + void OnLeftUp(wxMouseEvent&) + { + wxCommandEvent event(m_eventType, m_search->GetId()); + event.SetEventObject(m_search); + + GetEventHandler()->ProcessEvent(event); + + m_search->SetFocus(); + +#if wxUSE_MENUS + if ( m_eventType == wxEVT_COMMAND_SEARCHCTRL_SEARCH_BTN ) + { + // this happens automatically, just like on Mac OS X + m_search->PopupSearchMenu(); + } +#endif // wxUSE_MENUS + } + + void OnPaint(wxPaintEvent&) + { + wxPaintDC dc(this); + dc.DrawBitmap(m_bmp, 0,0, true); + } + + +private: + wxSearchCtrl *m_search; + wxEventType m_eventType; + wxBitmap m_bmp; + + DECLARE_EVENT_TABLE() +}; + +BEGIN_EVENT_TABLE(wxSearchButton, wxControl) + EVT_LEFT_UP(wxSearchButton::OnLeftUp) + EVT_PAINT(wxSearchButton::OnPaint) +END_EVENT_TABLE() + +BEGIN_EVENT_TABLE(wxSearchCtrl, wxSearchCtrlBase) + EVT_SEARCHCTRL_SEARCH_BTN(wxID_ANY, wxSearchCtrl::OnSearchButton) + EVT_SET_FOCUS(wxSearchCtrl::OnSetFocus) + EVT_SIZE(wxSearchCtrl::OnSize) +END_EVENT_TABLE() + +IMPLEMENT_DYNAMIC_CLASS(wxSearchCtrl, wxSearchCtrlBase) + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxSearchCtrl creation +// ---------------------------------------------------------------------------- + +// creation +// -------- + +wxSearchCtrl::wxSearchCtrl() +{ + Init(); +} + +wxSearchCtrl::wxSearchCtrl(wxWindow *parent, wxWindowID id, + const wxString& value, + const wxPoint& pos, + const wxSize& size, + long style, + const wxValidator& validator, + const wxString& name) +{ + Init(); + + Create(parent, id, value, pos, size, style, validator, name); +} + +void wxSearchCtrl::Init() +{ + m_text = NULL; + m_searchButton = NULL; + m_cancelButton = NULL; +#if wxUSE_MENUS + m_menu = NULL; +#endif // wxUSE_MENUS + + m_searchButtonVisible = true; + m_cancelButtonVisible = false; + + m_searchBitmapUser = false; + m_cancelBitmapUser = false; +#if wxUSE_MENUS + m_searchMenuBitmapUser = false; +#endif // wxUSE_MENUS +} + +bool wxSearchCtrl::Create(wxWindow *parent, wxWindowID id, + const wxString& value, + const wxPoint& pos, + const wxSize& size, + long style, + const wxValidator& validator, + const wxString& name) +{ + int borderStyle = wxBORDER_SIMPLE; + +#if defined(__WXMSW__) + borderStyle = GetThemedBorderStyle(); + if (borderStyle == wxBORDER_SUNKEN) + borderStyle = wxBORDER_SIMPLE; +#elif defined(__WXGTK__) + borderStyle = wxBORDER_SUNKEN; +#endif + + if ( !wxTextCtrlBase::Create(parent, id, pos, size, borderStyle | (style & ~wxBORDER_MASK), validator, name) ) + { + return false; + } + + m_text = new wxSearchTextCtrl(this, value, style & ~wxBORDER_MASK); + m_text->SetDescriptiveText(_("Search")); + + wxSize sizeText = m_text->GetBestSize(); + + m_searchButton = new wxSearchButton(this,wxEVT_COMMAND_SEARCHCTRL_SEARCH_BTN,m_searchBitmap); + m_cancelButton = new wxSearchButton(this,wxEVT_COMMAND_SEARCHCTRL_CANCEL_BTN,m_cancelBitmap); + + SetForegroundColour( m_text->GetForegroundColour() ); + m_searchButton->SetForegroundColour( m_text->GetForegroundColour() ); + m_cancelButton->SetForegroundColour( m_text->GetForegroundColour() ); + + SetBackgroundColour( m_text->GetBackgroundColour() ); + m_searchButton->SetBackgroundColour( m_text->GetBackgroundColour() ); + m_cancelButton->SetBackgroundColour( m_text->GetBackgroundColour() ); + + RecalcBitmaps(); + + SetInitialSize(size); + Move(pos); + return true; +} + +wxSearchCtrl::~wxSearchCtrl() +{ + delete m_text; + delete m_searchButton; + delete m_cancelButton; +#if wxUSE_MENUS + delete m_menu; +#endif // wxUSE_MENUS +} + + +// search control specific interfaces +#if wxUSE_MENUS + +void wxSearchCtrl::SetMenu( wxMenu* menu ) +{ + if ( menu == m_menu ) + { + // no change + return; + } + bool hadMenu = (m_menu != NULL); + delete m_menu; + m_menu = menu; + + if ( m_menu && !hadMenu ) + { + m_searchButton->SetBitmapLabel(m_searchMenuBitmap); + m_searchButton->Refresh(); + } + else if ( !m_menu && hadMenu ) + { + m_searchButton->SetBitmapLabel(m_searchBitmap); + if ( m_searchButtonVisible ) + { + m_searchButton->Refresh(); + } + } + wxRect rect = GetRect(); + LayoutControls(0, 0, rect.GetWidth(), rect.GetHeight()); +} + +wxMenu* wxSearchCtrl::GetMenu() +{ + return m_menu; +} + +#endif // wxUSE_MENUS + +void wxSearchCtrl::ShowSearchButton( bool show ) +{ + if ( m_searchButtonVisible == show ) + { + // no change + return; + } + m_searchButtonVisible = show; + if ( m_searchButtonVisible ) + { + RecalcBitmaps(); + } + + wxRect rect = GetRect(); + LayoutControls(0, 0, rect.GetWidth(), rect.GetHeight()); +} + +bool wxSearchCtrl::IsSearchButtonVisible() const +{ + return m_searchButtonVisible; +} + + +void wxSearchCtrl::ShowCancelButton( bool show ) +{ + if ( m_cancelButtonVisible == show ) + { + // no change + return; + } + m_cancelButtonVisible = show; + + wxRect rect = GetRect(); + LayoutControls(0, 0, rect.GetWidth(), rect.GetHeight()); +} + +bool wxSearchCtrl::IsCancelButtonVisible() const +{ + return m_cancelButtonVisible; +} + +void wxSearchCtrl::SetDescriptiveText(const wxString& text) +{ + m_text->SetDescriptiveText(text); +} + +wxString wxSearchCtrl::GetDescriptiveText() const +{ + return m_text->GetDescriptiveText(); +} + +// ---------------------------------------------------------------------------- +// geometry +// ---------------------------------------------------------------------------- + +wxSize wxSearchCtrl::DoGetBestSize() const +{ + wxSize sizeText = m_text->GetBestSize(); + wxSize sizeSearch(0,0); + wxSize sizeCancel(0,0); + int searchMargin = 0; + int cancelMargin = 0; + if ( m_searchButtonVisible || HasMenu() ) + { + sizeSearch = m_searchButton->GetBestSize(); + searchMargin = MARGIN; + } + if ( m_cancelButtonVisible ) + { + sizeCancel = m_cancelButton->GetBestSize(); + cancelMargin = MARGIN; + } + + int horizontalBorder = 1 + ( sizeText.y - sizeText.y * 14 / 21 ) / 2; + + // buttons are square and equal to the height of the text control + int height = sizeText.y; + return wxSize(sizeSearch.x + searchMargin + sizeText.x + cancelMargin + sizeCancel.x + 2*horizontalBorder, + height + 2*BORDER); +} + +void wxSearchCtrl::DoMoveWindow(int x, int y, int width, int height) +{ + wxSearchCtrlBase::DoMoveWindow(x, y, width, height); + + LayoutControls(0, 0, width, height); +} + +void wxSearchCtrl::LayoutControls(int x, int y, int width, int height) +{ + if ( !m_text ) + return; + + wxSize sizeText = m_text->GetBestSize(); + // make room for the search menu & clear button + int horizontalBorder = ( sizeText.y - sizeText.y * 14 / 21 ) / 2; + x += horizontalBorder; + y += BORDER; + width -= horizontalBorder*2; + height -= BORDER*2; + + wxSize sizeSearch(0,0); + wxSize sizeCancel(0,0); + int searchMargin = 0; + int cancelMargin = 0; + if ( m_searchButtonVisible || HasMenu() ) + { + sizeSearch = m_searchButton->GetBestSize(); + searchMargin = MARGIN; + } + if ( m_cancelButtonVisible ) + { + sizeCancel = m_cancelButton->GetBestSize(); + cancelMargin = MARGIN; + } + m_searchButton->Show( m_searchButtonVisible || HasMenu() ); + m_cancelButton->Show( m_cancelButtonVisible ); + + if ( sizeSearch.x + sizeCancel.x > width ) + { + sizeSearch.x = width/2; + sizeCancel.x = width/2; + searchMargin = 0; + cancelMargin = 0; + } + wxCoord textWidth = width - sizeSearch.x - sizeCancel.x - searchMargin - cancelMargin - 1; + + // position the subcontrols inside the client area + + m_searchButton->SetSize(x, y + ICON_OFFSET - 1, sizeSearch.x, height); + m_text->SetSize( x + sizeSearch.x + searchMargin, + y + ICON_OFFSET - BORDER, + textWidth, + height); + m_cancelButton->SetSize(x + sizeSearch.x + searchMargin + textWidth + cancelMargin, + y + ICON_OFFSET - 1, sizeCancel.x, height); +} + + +// accessors +// --------- + +wxString wxSearchCtrl::GetValue() const +{ + wxString value = m_text->GetValue(); + if (value == m_text->GetDescriptiveText()) + return wxEmptyString; + else + return value; +} +void wxSearchCtrl::SetValue(const wxString& value) +{ + m_text->SetValue(value); +} + +wxString wxSearchCtrl::GetRange(long from, long to) const +{ + return m_text->GetRange(from, to); +} + +int wxSearchCtrl::GetLineLength(long lineNo) const +{ + return m_text->GetLineLength(lineNo); +} +wxString wxSearchCtrl::GetLineText(long lineNo) const +{ + return m_text->GetLineText(lineNo); +} +int wxSearchCtrl::GetNumberOfLines() const +{ + return m_text->GetNumberOfLines(); +} + +bool wxSearchCtrl::IsModified() const +{ + return m_text->IsModified(); +} +bool wxSearchCtrl::IsEditable() const +{ + return m_text->IsEditable(); +} + +// more readable flag testing methods +bool wxSearchCtrl::IsSingleLine() const +{ + return m_text->IsSingleLine(); +} +bool wxSearchCtrl::IsMultiLine() const +{ + return m_text->IsMultiLine(); +} + +// If the return values from and to are the same, there is no selection. +void wxSearchCtrl::GetSelection(long* from, long* to) const +{ + m_text->GetSelection(from, to); +} + +wxString wxSearchCtrl::GetStringSelection() const +{ + return m_text->GetStringSelection(); +} + +// operations +// ---------- + +// editing +void wxSearchCtrl::Clear() +{ + m_text->Clear(); +} +void wxSearchCtrl::Replace(long from, long to, const wxString& value) +{ + m_text->Replace(from, to, value); +} +void wxSearchCtrl::Remove(long from, long to) +{ + m_text->Remove(from, to); +} + +// load/save the controls contents from/to the file +bool wxSearchCtrl::LoadFile(const wxString& file) +{ + return m_text->LoadFile(file); +} +bool wxSearchCtrl::SaveFile(const wxString& file) +{ + return m_text->SaveFile(file); +} + +// sets/clears the dirty flag +void wxSearchCtrl::MarkDirty() +{ + m_text->MarkDirty(); +} +void wxSearchCtrl::DiscardEdits() +{ + m_text->DiscardEdits(); +} + +// set the max number of characters which may be entered in a single line +// text control +void wxSearchCtrl::SetMaxLength(unsigned long len) +{ + m_text->SetMaxLength(len); +} + +// writing text inserts it at the current position, appending always +// inserts it at the end +void wxSearchCtrl::WriteText(const wxString& text) +{ + m_text->WriteText(text); +} +void wxSearchCtrl::AppendText(const wxString& text) +{ + m_text->AppendText(text); +} + +// insert the character which would have resulted from this key event, +// return true if anything has been inserted +bool wxSearchCtrl::EmulateKeyPress(const wxKeyEvent& event) +{ + return m_text->EmulateKeyPress(event); +} + +// text control under some platforms supports the text styles: these +// methods allow to apply the given text style to the given selection or to +// set/get the style which will be used for all appended text +bool wxSearchCtrl::SetStyle(long start, long end, const wxTextAttr& style) +{ + return m_text->SetStyle(start, end, style); +} +bool wxSearchCtrl::GetStyle(long position, wxTextAttr& style) +{ + return m_text->GetStyle(position, style); +} +bool wxSearchCtrl::SetDefaultStyle(const wxTextAttr& style) +{ + return m_text->SetDefaultStyle(style); +} +const wxTextAttr& wxSearchCtrl::GetDefaultStyle() const +{ + return m_text->GetDefaultStyle(); +} + +// translate between the position (which is just an index in the text ctrl +// considering all its contents as a single strings) and (x, y) coordinates +// which represent column and line. +long wxSearchCtrl::XYToPosition(long x, long y) const +{ + return m_text->XYToPosition(x, y); +} +bool wxSearchCtrl::PositionToXY(long pos, long *x, long *y) const +{ + return m_text->PositionToXY(pos, x, y); +} + +void wxSearchCtrl::ShowPosition(long pos) +{ + m_text->ShowPosition(pos); +} + +// find the character at position given in pixels +// +// NB: pt is in device coords (not adjusted for the client area origin nor +// scrolling) +wxTextCtrlHitTestResult wxSearchCtrl::HitTest(const wxPoint& pt, long *pos) const +{ + return m_text->HitTest(pt, pos); +} +wxTextCtrlHitTestResult wxSearchCtrl::HitTest(const wxPoint& pt, + wxTextCoord *col, + wxTextCoord *row) const +{ + return m_text->HitTest(pt, col, row); +} + +// Clipboard operations +void wxSearchCtrl::Copy() +{ + m_text->Copy(); +} +void wxSearchCtrl::Cut() +{ + m_text->Cut(); +} +void wxSearchCtrl::Paste() +{ + m_text->Paste(); +} + +bool wxSearchCtrl::CanCopy() const +{ + return m_text->CanCopy(); +} +bool wxSearchCtrl::CanCut() const +{ + return m_text->CanCut(); +} +bool wxSearchCtrl::CanPaste() const +{ + return m_text->CanPaste(); +} + +// Undo/redo +void wxSearchCtrl::Undo() +{ + m_text->Undo(); +} +void wxSearchCtrl::Redo() +{ + m_text->Redo(); +} + +bool wxSearchCtrl::CanUndo() const +{ + return m_text->CanUndo(); +} +bool wxSearchCtrl::CanRedo() const +{ + return m_text->CanRedo(); +} + +// Insertion point +void wxSearchCtrl::SetInsertionPoint(long pos) +{ + m_text->SetInsertionPoint(pos); +} +void wxSearchCtrl::SetInsertionPointEnd() +{ + m_text->SetInsertionPointEnd(); +} +long wxSearchCtrl::GetInsertionPoint() const +{ + return m_text->GetInsertionPoint(); +} +wxTextPos wxSearchCtrl::GetLastPosition() const +{ + return m_text->GetLastPosition(); +} + +void wxSearchCtrl::SetSelection(long from, long to) +{ + m_text->SetSelection(from, to); +} +void wxSearchCtrl::SelectAll() +{ + m_text->SelectAll(); +} + +void wxSearchCtrl::SetEditable(bool editable) +{ + m_text->SetEditable(editable); +} + +bool wxSearchCtrl::SetFont(const wxFont& font) +{ + bool result = wxSearchCtrlBase::SetFont(font); + if ( result && m_text ) + { + result = m_text->SetFont(font); + } + RecalcBitmaps(); + return result; +} + +// search control generic only +void wxSearchCtrl::SetSearchBitmap( const wxBitmap& bitmap ) +{ + m_searchBitmap = bitmap; + m_searchBitmapUser = bitmap.Ok(); + if ( m_searchBitmapUser ) + { + if ( m_searchButton && !HasMenu() ) + { + m_searchButton->SetBitmapLabel( m_searchBitmap ); + } + } + else + { + // the user bitmap was just cleared, generate one + RecalcBitmaps(); + } +} + +#if wxUSE_MENUS + +void wxSearchCtrl::SetSearchMenuBitmap( const wxBitmap& bitmap ) +{ + m_searchMenuBitmap = bitmap; + m_searchMenuBitmapUser = bitmap.Ok(); + if ( m_searchMenuBitmapUser ) + { + if ( m_searchButton && m_menu ) + { + m_searchButton->SetBitmapLabel( m_searchMenuBitmap ); + } + } + else + { + // the user bitmap was just cleared, generate one + RecalcBitmaps(); + } +} + +#endif // wxUSE_MENUS + +void wxSearchCtrl::SetCancelBitmap( const wxBitmap& bitmap ) +{ + m_cancelBitmap = bitmap; + m_cancelBitmapUser = bitmap.Ok(); + if ( m_cancelBitmapUser ) + { + if ( m_cancelButton ) + { + m_cancelButton->SetBitmapLabel( m_cancelBitmap ); + } + } + else + { + // the user bitmap was just cleared, generate one + RecalcBitmaps(); + } +} + +#if 0 + +// override streambuf method +#if wxHAS_TEXT_WINDOW_STREAM +int overflow(int i); +#endif // wxHAS_TEXT_WINDOW_STREAM + +// stream-like insertion operators: these are always available, whether we +// were, or not, compiled with streambuf support +wxTextCtrl& operator<<(const wxString& s); +wxTextCtrl& operator<<(int i); +wxTextCtrl& operator<<(long i); +wxTextCtrl& operator<<(float f); +wxTextCtrl& operator<<(double d); +wxTextCtrl& operator<<(const wxChar c); +#endif + +void wxSearchCtrl::DoSetValue(const wxString& value, int flags) +{ + m_text->ChangeValue( value ); + if ( flags & SetValue_SendEvent ) + SendTextUpdatedEvent(); +} + +// do the window-specific processing after processing the update event +void wxSearchCtrl::DoUpdateWindowUI(wxUpdateUIEvent& event) +{ + wxSearchCtrlBase::DoUpdateWindowUI(event); +} + +bool wxSearchCtrl::ShouldInheritColours() const +{ + return true; +} + +// icons are rendered at 3-8 times larger than necessary and downscaled for +// antialiasing +static int GetMultiplier() +{ +#ifdef __WXWINCE__ + // speed up bitmap generation by using a small bitmap + return 3; +#else + int depth = ::wxDisplayDepth(); + + if ( depth >= 24 ) + { + return 8; + } + return 6; +#endif +} + +wxBitmap wxSearchCtrl::RenderSearchBitmap( int x, int y, bool renderDrop ) +{ + wxColour bg = GetBackgroundColour(); + wxColour fg = wxStepColour(GetForegroundColour(), LIGHT_STEP-20); + + //=============================================================================== + // begin drawing code + //=============================================================================== + // image stats + + // force width:height ratio + if ( 14*x > y*20 ) + { + // x is too big + x = y*20/14; + } + else + { + // y is too big + y = x*14/20; + } + + // glass 11x11, top left corner + // handle (9,9)-(13,13) + // drop (13,16)-(19,6)-(16,9) + + int multiplier = GetMultiplier(); + int penWidth = multiplier * 2; + + penWidth = penWidth * x / 20; + + wxBitmap bitmap( multiplier*x, multiplier*y ); + wxMemoryDC mem; + mem.SelectObject(bitmap); + + // clear background + mem.SetBrush( wxBrush(bg) ); + mem.SetPen( wxPen(bg) ); + mem.DrawRectangle(0,0,bitmap.GetWidth(),bitmap.GetHeight()); + + // draw drop glass + mem.SetBrush( wxBrush(fg) ); + mem.SetPen( wxPen(fg) ); + int glassBase = 5 * x / 20; + int glassFactor = 2*glassBase + 1; + int radius = multiplier*glassFactor/2; + mem.DrawCircle(radius,radius,radius); + mem.SetBrush( wxBrush(bg) ); + mem.SetPen( wxPen(bg) ); + mem.DrawCircle(radius,radius,radius-penWidth); + + // draw handle + int lineStart = radius + (radius-penWidth/2) * 707 / 1000; // 707 / 1000 = 0.707 = 1/sqrt(2); + + mem.SetPen( wxPen(fg) ); + mem.SetBrush( wxBrush(fg) ); + int handleCornerShift = penWidth * 707 / 1000 / 2; // 707 / 1000 = 0.707 = 1/sqrt(2); + handleCornerShift = WXMAX( handleCornerShift, 1 ); + int handleBase = 4 * x / 20; + int handleLength = 2*handleBase+1; + wxPoint handlePolygon[] = + { + wxPoint(-handleCornerShift,+handleCornerShift), + wxPoint(+handleCornerShift,-handleCornerShift), + wxPoint(multiplier*handleLength/2+handleCornerShift,multiplier*handleLength/2-handleCornerShift), + wxPoint(multiplier*handleLength/2-handleCornerShift,multiplier*handleLength/2+handleCornerShift), + }; + mem.DrawPolygon(WXSIZEOF(handlePolygon),handlePolygon,lineStart,lineStart); + + // draw drop triangle + int triangleX = 13 * x / 20; + int triangleY = 5 * x / 20; + int triangleBase = 3 * x / 20; + int triangleFactor = triangleBase*2+1; + if ( renderDrop ) + { + wxPoint dropPolygon[] = + { + wxPoint(multiplier*0,multiplier*0), // triangle left + wxPoint(multiplier*triangleFactor-1,multiplier*0), // triangle right + wxPoint(multiplier*triangleFactor/2,multiplier*triangleFactor/2), // triangle bottom + }; + mem.DrawPolygon(WXSIZEOF(dropPolygon),dropPolygon,multiplier*triangleX,multiplier*triangleY); + } + mem.SelectObject(wxNullBitmap); + + //=============================================================================== + // end drawing code + //=============================================================================== + + if ( multiplier != 1 ) + { + wxImage image = bitmap.ConvertToImage(); + image.Rescale(x,y); + bitmap = wxBitmap( image ); + } + if ( !renderDrop ) + { + // Trim the edge where the arrow would have gone + bitmap = bitmap.GetSubBitmap(wxRect(0,0, y,y)); + } + + return bitmap; +} + +wxBitmap wxSearchCtrl::RenderCancelBitmap( int x, int y ) +{ + wxColour bg = GetBackgroundColour(); + wxColour fg = wxStepColour(GetForegroundColour(), LIGHT_STEP); + + //=============================================================================== + // begin drawing code + //=============================================================================== + // image stats + + // total size 14x14 + // force 1:1 ratio + if ( x > y ) + { + // x is too big + x = y; + } + else + { + // y is too big + y = x; + } + + // 14x14 circle + // cross line starts (4,4)-(10,10) + // drop (13,16)-(19,6)-(16,9) + + int multiplier = GetMultiplier(); + + int penWidth = multiplier * x / 14; + + wxBitmap bitmap( multiplier*x, multiplier*y ); + wxMemoryDC mem; + mem.SelectObject(bitmap); + + // clear background + mem.SetBrush( wxBrush(bg) ); + mem.SetPen( wxPen(bg) ); + mem.DrawRectangle(0,0,bitmap.GetWidth(),bitmap.GetHeight()); + + // draw drop glass + mem.SetBrush( wxBrush(fg) ); + mem.SetPen( wxPen(fg) ); + int radius = multiplier*x/2; + mem.DrawCircle(radius,radius,radius); + + // draw cross + int lineStartBase = 4 * x / 14; + int lineLength = x - 2*lineStartBase; + + mem.SetPen( wxPen(bg) ); + mem.SetBrush( wxBrush(bg) ); + int handleCornerShift = penWidth/2; + handleCornerShift = WXMAX( handleCornerShift, 1 ); + wxPoint handlePolygon[] = + { + wxPoint(-handleCornerShift,+handleCornerShift), + wxPoint(+handleCornerShift,-handleCornerShift), + wxPoint(multiplier*lineLength+handleCornerShift,multiplier*lineLength-handleCornerShift), + wxPoint(multiplier*lineLength-handleCornerShift,multiplier*lineLength+handleCornerShift), + }; + mem.DrawPolygon(WXSIZEOF(handlePolygon),handlePolygon,multiplier*lineStartBase,multiplier*lineStartBase); + wxPoint handlePolygon2[] = + { + wxPoint(+handleCornerShift,+handleCornerShift), + wxPoint(-handleCornerShift,-handleCornerShift), + wxPoint(multiplier*lineLength-handleCornerShift,-multiplier*lineLength-handleCornerShift), + wxPoint(multiplier*lineLength+handleCornerShift,-multiplier*lineLength+handleCornerShift), + }; + mem.DrawPolygon(WXSIZEOF(handlePolygon2),handlePolygon2,multiplier*lineStartBase,multiplier*(x-lineStartBase)); + + //=============================================================================== + // end drawing code + //=============================================================================== + + if ( multiplier != 1 ) + { + wxImage image = bitmap.ConvertToImage(); + image.Rescale(x,y); + bitmap = wxBitmap( image ); + } + + return bitmap; +} + +void wxSearchCtrl::RecalcBitmaps() +{ + if ( !m_text ) + { + return; + } + wxSize sizeText = m_text->GetBestSize(); + + int bitmapHeight = sizeText.y - 2 * ICON_MARGIN; + int bitmapWidth = sizeText.y * 20 / 14; + + if ( !m_searchBitmapUser ) + { + if ( + !m_searchBitmap.Ok() || + m_searchBitmap.GetHeight() != bitmapHeight || + m_searchBitmap.GetWidth() != bitmapWidth + ) + { + m_searchBitmap = RenderSearchBitmap(bitmapWidth,bitmapHeight,false); + if ( !HasMenu() ) + { + m_searchButton->SetBitmapLabel(m_searchBitmap); + } + } + // else this bitmap was set by user, don't alter + } + +#if wxUSE_MENUS + if ( !m_searchMenuBitmapUser ) + { + if ( + !m_searchMenuBitmap.Ok() || + m_searchMenuBitmap.GetHeight() != bitmapHeight || + m_searchMenuBitmap.GetWidth() != bitmapWidth + ) + { + m_searchMenuBitmap = RenderSearchBitmap(bitmapWidth,bitmapHeight,true); + if ( m_menu ) + { + m_searchButton->SetBitmapLabel(m_searchMenuBitmap); + } + } + // else this bitmap was set by user, don't alter + } +#endif // wxUSE_MENUS + + if ( !m_cancelBitmapUser ) + { + if ( + !m_cancelBitmap.Ok() || + m_cancelBitmap.GetHeight() != bitmapHeight || + m_cancelBitmap.GetWidth() != bitmapHeight + ) + { + m_cancelBitmap = RenderCancelBitmap(bitmapHeight-BORDER-1,bitmapHeight-BORDER-1); // square + m_cancelButton->SetBitmapLabel(m_cancelBitmap); + } + // else this bitmap was set by user, don't alter + } +} + +void wxSearchCtrl::OnSearchButton( wxCommandEvent& event ) +{ + event.Skip(); +} + +void wxSearchCtrl::OnSetFocus( wxFocusEvent& /*event*/ ) +{ + if ( m_text ) + { + m_text->SetFocus(); + } +} + +void wxSearchCtrl::OnSize( wxSizeEvent& WXUNUSED(event) ) +{ + int width, height; + GetSize(&width, &height); + LayoutControls(0, 0, width, height); +} + +#if wxUSE_MENUS + +void wxSearchCtrl::PopupSearchMenu() +{ + if ( m_menu ) + { + wxSize size = GetSize(); + PopupMenu( m_menu, 0, size.y ); + } +} + +#endif // wxUSE_MENUS + +#endif // !wxUSE_NATIVE_SEARCH_CONTROL + +#endif // wxUSE_SEARCHCTRL diff --git a/Externals/wxWidgets/src/generic/statline.cpp b/Externals/wxWidgets/src/generic/statline.cpp new file mode 100644 index 0000000000..b5f7ab11cc --- /dev/null +++ b/Externals/wxWidgets/src/generic/statline.cpp @@ -0,0 +1,88 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/generic/statline.cpp +// Purpose: a generic wxStaticLine class +// Author: Vadim Zeitlin +// Created: 28.06.99 +// Version: $Id: statline.cpp 39487 2006-05-31 18:27:51Z ABX $ +// Copyright: (c) 1998 Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/wxprec.h" + +// For compilers that support precompilation, includes "wx.h". + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_STATLINE + +#include "wx/statline.h" + +#ifndef WX_PRECOMP + #include "wx/statbox.h" +#endif + +// ============================================================================ +// implementation +// ============================================================================ + +IMPLEMENT_DYNAMIC_CLASS(wxStaticLine, wxControl) + +// ---------------------------------------------------------------------------- +// wxStaticLine +// ---------------------------------------------------------------------------- + +bool wxStaticLine::Create( wxWindow *parent, + wxWindowID id, + const wxPoint &pos, + const wxSize &size, + long style, + const wxString &name) +{ + m_statbox = NULL; + + if ( !CreateBase(parent, id, pos, size, style, wxDefaultValidator, name) ) + return false; + + // ok, this is ugly but it's better than nothing: use a thin static box to + // emulate static line + + wxSize sizeReal = AdjustSize(size); + + m_statbox = new wxStaticBox(parent, id, wxEmptyString, pos, sizeReal, style, name); + + return true; +} + +wxStaticLine::~wxStaticLine() +{ + delete m_statbox; +} + +WXWidget wxStaticLine::GetMainWidget() const +{ + return m_statbox->GetMainWidget(); +} + +void wxStaticLine::DoSetSize(int x, int y, int width, int height, int sizeFlags) +{ + m_statbox->SetSize(x, y, width, height, sizeFlags); +} + +void wxStaticLine::DoMoveWindow(int x, int y, int width, int height) +{ + m_statbox->SetSize(x, y, width, height); +} + +#endif + // wxUSE_STATLINE diff --git a/Externals/wxWidgets/src/generic/statusbr.cpp b/Externals/wxWidgets/src/generic/statusbr.cpp new file mode 100644 index 0000000000..2a38d4b2ea --- /dev/null +++ b/Externals/wxWidgets/src/generic/statusbr.cpp @@ -0,0 +1,494 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/generic/statusbr.cpp +// Purpose: wxStatusBarGeneric class implementation +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: statusbr.cpp 42157 2006-10-20 11:01:50Z SC $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_STATUSBAR + +#include "wx/statusbr.h" + +#ifndef WX_PRECOMP + #include "wx/settings.h" + #include "wx/dcclient.h" +#endif + +#ifdef __WXGTK20__ + #include + #include "wx/gtk/win_gtk.h" +#endif + +// we only have to do it here when we use wxStatusBarGeneric in addition to the +// standard wxStatusBar class, if wxStatusBarGeneric is the same as +// wxStatusBar, then the corresponding IMPLEMENT_DYNAMIC_CLASS is already in +// common/statbar.cpp +#if defined(__WXMAC__) || \ + (defined(wxUSE_NATIVE_STATUSBAR) && wxUSE_NATIVE_STATUSBAR) + #include "wx/generic/statusbr.h" + + IMPLEMENT_DYNAMIC_CLASS(wxStatusBarGeneric, wxWindow) +#endif // wxUSE_NATIVE_STATUSBAR + +BEGIN_EVENT_TABLE(wxStatusBarGeneric, wxWindow) + EVT_PAINT(wxStatusBarGeneric::OnPaint) + EVT_LEFT_DOWN(wxStatusBarGeneric::OnLeftDown) + EVT_RIGHT_DOWN(wxStatusBarGeneric::OnRightDown) + EVT_SYS_COLOUR_CHANGED(wxStatusBarGeneric::OnSysColourChanged) +END_EVENT_TABLE() + +// Default status border dimensions +#define wxTHICK_LINE_BORDER 2 + +void wxStatusBarGeneric::Init() +{ + m_borderX = wxTHICK_LINE_BORDER; + m_borderY = wxTHICK_LINE_BORDER; +} + +wxStatusBarGeneric::~wxStatusBarGeneric() +{ +} + +bool wxStatusBarGeneric::Create(wxWindow *parent, + wxWindowID id, + long style, + const wxString& name) +{ + style |= wxTAB_TRAVERSAL | wxFULL_REPAINT_ON_RESIZE; + if ( !wxWindow::Create(parent, id, + wxDefaultPosition, wxDefaultSize, + style, name) ) + return false; + + // The status bar should have a themed background + SetThemeEnabled( true ); + + InitColours(); + +#ifdef __WXPM__ + SetFont(*wxSMALL_FONT); +#endif + + wxCoord y; + { + // Set the height according to the font and the border size + wxClientDC dc(this); + dc.SetFont(GetFont()); + + dc.GetTextExtent(_T("X"), NULL, &y ); + } + int height = (int)( (11*y)/10 + 2*GetBorderY()); + + SetSize(wxDefaultCoord, wxDefaultCoord, wxDefaultCoord, height); + + SetFieldsCount(1); + + return true; +} + + +wxSize wxStatusBarGeneric::DoGetBestSize() const +{ + int width, height; + + // best width is the width of the parent + GetParent()->GetClientSize(&width, NULL); + + // best height is as calculated above in Create + wxClientDC dc((wxWindow*)this); + dc.SetFont(GetFont()); + wxCoord y; + dc.GetTextExtent(_T("X"), NULL, &y ); + height = (int)( (11*y)/10 + 2*GetBorderY()); + + return wxSize(width, height); +} + +void wxStatusBarGeneric::SetFieldsCount(int number, const int *widths) +{ + wxASSERT_MSG( number >= 0, _T("negative number of fields in wxStatusBar?") ); + + int i; + for(i = m_nFields; i < number; ++i) + m_statusStrings.Add( wxEmptyString ); + + for (i = m_nFields - 1; i >= number; --i) + m_statusStrings.RemoveAt(i); + + // forget the old cached pixel widths + m_widthsAbs.Empty(); + + wxStatusBarBase::SetFieldsCount(number, widths); + + wxASSERT_MSG( m_nFields == (int)m_statusStrings.GetCount(), + _T("This really should never happen, can we do away with m_nFields here?") ); +} + +void wxStatusBarGeneric::SetStatusText(const wxString& text, int number) +{ + wxCHECK_RET( (number >= 0) && (number < m_nFields), + _T("invalid status bar field index") ); + + wxString oldText = m_statusStrings[number]; + if (oldText != text) + { + m_statusStrings[number] = text; + + wxRect rect; + GetFieldRect(number, rect); + + Refresh(true, &rect); + + // it's common to show some text in the status bar before starting a + // relatively lengthy operation, ensure that the text is shown to the + // user immediately and not after the lengthy operation end + Update(); + } +} + +wxString wxStatusBarGeneric::GetStatusText(int n) const +{ + wxCHECK_MSG( (n >= 0) && (n < m_nFields), wxEmptyString, + _T("invalid status bar field index") ); + + return m_statusStrings[n]; +} + +void wxStatusBarGeneric::SetStatusWidths(int n, const int widths_field[]) +{ + // only set status widths, when n == number of statuswindows + wxCHECK_RET( n == m_nFields, _T("status bar field count mismatch") ); + + // delete the old widths in any case - this function may be used to reset + // the widths to the default (all equal) + // MBN: this is incompatible with at least wxMSW and wxMAC and not + // documented, but let's keep it for now + ReinitWidths(); + + // forget the old cached pixel widths + m_widthsAbs.Empty(); + + if ( !widths_field ) + { + // not an error, see the comment above + Refresh(); + return; + } + + wxStatusBarBase::SetStatusWidths(n, widths_field); +} + +void wxStatusBarGeneric::OnPaint(wxPaintEvent& WXUNUSED(event) ) +{ + wxPaintDC dc(this); + +#ifdef __WXGTK20__ + // Draw grip first + if (HasFlag( wxST_SIZEGRIP )) + { + int width, height; + GetClientSize(&width, &height); + + if (GetLayoutDirection() == wxLayout_RightToLeft) + { + gtk_paint_resize_grip( m_widget->style, + GTK_PIZZA(m_wxwindow)->bin_window, + (GtkStateType) GTK_WIDGET_STATE (m_widget), + NULL, + m_widget, + "statusbar", + GDK_WINDOW_EDGE_SOUTH_WEST, + 2, 2, height-2, height-4 ); + } + else + { + gtk_paint_resize_grip( m_widget->style, + GTK_PIZZA(m_wxwindow)->bin_window, + (GtkStateType) GTK_WIDGET_STATE (m_widget), + NULL, + m_widget, + "statusbar", + GDK_WINDOW_EDGE_SOUTH_EAST, + width-height-2, 2, height-2, height-4 ); + } + } +#endif + + if (GetFont().Ok()) + dc.SetFont(GetFont()); + + dc.SetBackgroundMode(wxTRANSPARENT); + +#ifdef __WXPM__ + wxColour vColor; + + vColor = wxSystemSettings::GetColour(wxSYS_COLOUR_MENUBAR); + ::WinFillRect(dc.m_hPS, &dc.m_vRclPaint, vColor.GetPixel()); +#endif + + for (int i = 0; i < m_nFields; i ++) + DrawField(dc, i); +} + +void wxStatusBarGeneric::DrawFieldText(wxDC& dc, int i) +{ + int leftMargin = 2; + + wxRect rect; + GetFieldRect(i, rect); + + wxString text(GetStatusText(i)); + + long x = 0, y = 0; + + dc.GetTextExtent(text, &x, &y); + + int xpos = rect.x + leftMargin; + int ypos = (int) (((rect.height - y) / 2 ) + rect.y + 0.5) ; + +#if defined( __WXGTK__ ) || defined(__WXMAC__) + xpos++; + ypos++; +#endif + + dc.SetClippingRegion(rect.x, rect.y, rect.width, rect.height); + + dc.DrawText(text, xpos, ypos); + + dc.DestroyClippingRegion(); +} + +void wxStatusBarGeneric::DrawField(wxDC& dc, int i) +{ + wxRect rect; + GetFieldRect(i, rect); + + int style = wxSB_NORMAL; + if (m_statusStyles) + style = m_statusStyles[i]; + + if (style != wxSB_FLAT) + { + // Draw border + // For wxSB_NORMAL: + // Have grey background, plus 3-d border - + // One black rectangle. + // Inside this, left and top sides - dark grey. Bottom and right - + // white. + // Reverse it for wxSB_RAISED + + dc.SetPen((style == wxSB_RAISED) ? m_mediumShadowPen : m_hilightPen); + + #ifndef __WXPM__ + + // Right and bottom lines + dc.DrawLine(rect.x + rect.width, rect.y, + rect.x + rect.width, rect.y + rect.height); + dc.DrawLine(rect.x + rect.width, rect.y + rect.height, + rect.x, rect.y + rect.height); + + dc.SetPen((style == wxSB_RAISED) ? m_hilightPen : m_mediumShadowPen); + + // Left and top lines + dc.DrawLine(rect.x, rect.y + rect.height, + rect.x, rect.y); + dc.DrawLine(rect.x, rect.y, + rect.x + rect.width, rect.y); + #else + + dc.DrawLine(rect.x + rect.width, rect.height + 2, + rect.x, rect.height + 2); + dc.DrawLine(rect.x + rect.width, rect.y, + rect.x + rect.width, rect.y + rect.height); + + dc.SetPen((style == wxSB_RAISED) ? m_hilightPen : m_mediumShadowPen); + dc.DrawLine(rect.x, rect.y, + rect.x + rect.width, rect.y); + dc.DrawLine(rect.x, rect.y + rect.height, + rect.x, rect.y); + +#endif + } + + DrawFieldText(dc, i); +} + + // Get the position and size of the field's internal bounding rectangle +bool wxStatusBarGeneric::GetFieldRect(int n, wxRect& rect) const +{ + wxCHECK_MSG( (n >= 0) && (n < m_nFields), false, + _T("invalid status bar field index") ); + + // FIXME: workarounds for OS/2 bugs have nothing to do here (VZ) + int width, height; +#ifdef __WXPM__ + GetSize(&width, &height); +#else + GetClientSize(&width, &height); +#endif + + // we cache m_widthsAbs between calls and recompute it if client + // width has changed (or when it is initially empty) + if ( m_widthsAbs.IsEmpty() || (m_lastClientWidth != width) ) + { + wxConstCast(this, wxStatusBarGeneric)-> + m_widthsAbs = CalculateAbsWidths(width); + // remember last width for which we have recomputed the widths in pixels + wxConstCast(this, wxStatusBarGeneric)-> + m_lastClientWidth = width; + } + + rect.x = 0; + for ( int i = 0; i < n; i++ ) + { + rect.x += m_widthsAbs[i]; + } + + rect.x += m_borderX; + rect.y = m_borderY; + + rect.width = m_widthsAbs[n] - 2*m_borderX; + rect.height = height - 2*m_borderY; + + return true; +} + +// Initialize colours +void wxStatusBarGeneric::InitColours() +{ + // Shadow colours +#if defined(__WXMSW__) || defined(__WXMAC__) + wxColour mediumShadowColour(wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW)); + m_mediumShadowPen = wxPen(mediumShadowColour, 1, wxSOLID); + + wxColour hilightColour(wxSystemSettings::GetColour(wxSYS_COLOUR_3DHILIGHT)); + m_hilightPen = wxPen(hilightColour, 1, wxSOLID); +#elif defined(__WXPM__) + m_mediumShadowPen = wxPen(wxColour(127, 127, 127), 1, wxSOLID); + m_hilightPen = *wxWHITE_PEN; + + SetBackgroundColour(*wxLIGHT_GREY); + SetForegroundColour(*wxBLACK); +#else + m_mediumShadowPen = *wxGREY_PEN; + m_hilightPen = *wxWHITE_PEN; +#endif +} + +// Responds to colour changes, and passes event on to children. +void wxStatusBarGeneric::OnSysColourChanged(wxSysColourChangedEvent& event) +{ + InitColours(); + + // Propagate the event to the non-top-level children + wxWindow::OnSysColourChanged(event); +} + +void wxStatusBarGeneric::SetMinHeight(int height) +{ + // check that this min height is not less than minimal height for the + // current font + wxClientDC dc(this); + wxCoord y; + dc.GetTextExtent( wxT("X"), NULL, &y ); + + if ( height > (11*y)/10 ) + { + SetSize(wxDefaultCoord, wxDefaultCoord, wxDefaultCoord, height + 2*m_borderY); + } +} + +void wxStatusBarGeneric::OnLeftDown(wxMouseEvent& event) +{ +#ifdef __WXGTK20__ + int width, height; + GetClientSize(&width, &height); + + if (HasFlag( wxST_SIZEGRIP ) && (event.GetX() > width-height)) + { + GtkWidget *ancestor = gtk_widget_get_toplevel( m_widget ); + + if (!GTK_IS_WINDOW (ancestor)) + return; + + GdkWindow *source = GTK_PIZZA(m_wxwindow)->bin_window; + + int org_x = 0; + int org_y = 0; + gdk_window_get_origin( source, &org_x, &org_y ); + + if (GetLayoutDirection() == wxLayout_RightToLeft) + { + gtk_window_begin_resize_drag (GTK_WINDOW (ancestor), + GDK_WINDOW_EDGE_SOUTH_WEST, + 1, + org_x - event.GetX() + GetSize().x , + org_y + event.GetY(), + 0); + } + else + { + gtk_window_begin_resize_drag (GTK_WINDOW (ancestor), + GDK_WINDOW_EDGE_SOUTH_EAST, + 1, + org_x + event.GetX(), + org_y + event.GetY(), + 0); + } + } + else + { + event.Skip( true ); + } +#else + event.Skip( true ); +#endif +} + +void wxStatusBarGeneric::OnRightDown(wxMouseEvent& event) +{ +#ifdef __WXGTK20__ + int width, height; + GetClientSize(&width, &height); + + if (HasFlag( wxST_SIZEGRIP ) && (event.GetX() > width-height)) + { + GtkWidget *ancestor = gtk_widget_get_toplevel( m_widget ); + + if (!GTK_IS_WINDOW (ancestor)) + return; + + GdkWindow *source = GTK_PIZZA(m_wxwindow)->bin_window; + + int org_x = 0; + int org_y = 0; + gdk_window_get_origin( source, &org_x, &org_y ); + + gtk_window_begin_move_drag (GTK_WINDOW (ancestor), + 2, + org_x + event.GetX(), + org_y + event.GetY(), + 0); + } + else + { + event.Skip( true ); + } +#else + event.Skip( true ); +#endif +} + +#endif // wxUSE_STATUSBAR diff --git a/Externals/wxWidgets/src/generic/tabg.cpp b/Externals/wxWidgets/src/generic/tabg.cpp new file mode 100644 index 0000000000..49bf88d839 --- /dev/null +++ b/Externals/wxWidgets/src/generic/tabg.cpp @@ -0,0 +1,1290 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/generic/tabg.cpp +// Purpose: Generic tabbed dialogs +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id: tabg.cpp 39745 2006-06-15 17:58:49Z ABX $ +// Copyright: (c) +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_TAB_DIALOG + +#ifndef WX_PRECOMP + #include "wx/settings.h" + #include "wx/intl.h" + #include "wx/dcclient.h" + #include "wx/math.h" +#endif + +#include +#include +#include + +#include "wx/tab.h" +#include "wx/listimpl.cpp" + +WX_DEFINE_LIST(wxTabLayerList) + +// not defined: use old, square tab implementation (fills in tabs) +// defined: use new, rounded tab implementation (doesn't colour in tabs) +// #define wxUSE_NEW_METHOD + +IMPLEMENT_DYNAMIC_CLASS(wxTabControl, wxObject) + +// IMPLEMENT_DYNAMIC_CLASS(wxTabLayer, wxList) + +wxTabControl::wxTabControl(wxTabView *v) +{ + m_view = v; + m_isSelected = false; + m_offsetX = 0; + m_offsetY = 0; + m_width = 0; + m_height = 0; + m_id = 0; + m_rowPosition = 0; + m_colPosition = 0; +} + +wxTabControl::~wxTabControl(void) +{ +} + +void wxTabControl::OnDraw(wxDC& dc, bool lastInRow) +{ + // Old, but in some ways better (drawing opaque tabs) +#ifndef wxUSE_NEW_METHOD + if (!m_view) + return; + + // Top-left of tab view area + int viewX = m_view->GetViewRect().x; + int viewY = m_view->GetViewRect().y; + + // Top-left of tab control + int tabX = GetX() + viewX; + int tabY = GetY() + viewY; + int tabHeightInc = 0; + if (m_isSelected) + { + tabHeightInc = (m_view->GetTabSelectionHeight() - m_view->GetTabHeight()); + tabY -= tabHeightInc; + } + + dc.SetPen(*wxTRANSPARENT_PEN); + + // Draw grey background + if (m_view->GetTabStyle() & wxTAB_STYLE_COLOUR_INTERIOR) + { + dc.SetBrush(*m_view->GetBackgroundBrush()); + + // Add 1 because the pen is transparent. Under Motif, may be different. +#ifdef __WXMOTIF__ + dc.DrawRectangle(tabX, tabY, (GetWidth()+1), (GetHeight() + tabHeightInc)); +#else + dc.DrawRectangle(tabX, tabY, (GetWidth()+1), (GetHeight() + 1 + tabHeightInc)); +#endif + } + + // Draw highlight and shadow + dc.SetPen(*m_view->GetHighlightPen()); + + // Calculate the top of the tab beneath. It's the height of the tab, MINUS + // a bit if the tab below happens to be selected. Check. + wxTabControl *tabBeneath = NULL; + int subtractThis = 0; + if (GetColPosition() > 0) + tabBeneath = m_view->FindTabControlForPosition(GetColPosition() - 1, GetRowPosition()); + if (tabBeneath && tabBeneath->IsSelected()) + subtractThis = (m_view->GetTabSelectionHeight() - m_view->GetTabHeight()); + + // Vertical highlight: if first tab, draw to bottom of view + if (tabX == m_view->GetViewRect().x && (m_view->GetTabStyle() & wxTAB_STYLE_DRAW_BOX)) + dc.DrawLine(tabX, tabY, tabX, (m_view->GetViewRect().y + m_view->GetViewRect().height)); + else if (tabX == m_view->GetViewRect().x) + // Not box drawing, just to top of view. + dc.DrawLine(tabX, tabY, tabX, (m_view->GetViewRect().y)); + else + dc.DrawLine(tabX, tabY, tabX, (tabY + GetHeight() + tabHeightInc - subtractThis)); + + dc.DrawLine(tabX, tabY, (tabX + GetWidth()), tabY); + dc.SetPen(*m_view->GetShadowPen()); + + // Test if we're outside the right-hand edge of the view area + if (((tabX + GetWidth()) >= m_view->GetViewRect().x + m_view->GetViewRect().width) && (m_view->GetTabStyle() & wxTAB_STYLE_DRAW_BOX)) + { + int bottomY = m_view->GetViewRect().y + m_view->GetViewRect().height + GetY() + m_view->GetTabHeight() + m_view->GetTopMargin(); + // Add a tab height since we wish to draw to the bottom of the view. + dc.DrawLine((tabX + GetWidth()), tabY, + (tabX + GetWidth()), bottomY); + + // Calculate the far-right of the view, since we don't wish to + // draw inside that + int rightOfView = m_view->GetViewRect().x + m_view->GetViewRect().width + 1; + + // Draw the horizontal bit to connect to the view rectangle + dc.DrawLine((wxMax((tabX + GetWidth() - m_view->GetHorizontalTabOffset()), rightOfView)), (bottomY-1), + (tabX + GetWidth()), (bottomY-1)); + + // Draw black line to emphasize shadow + dc.SetPen(*wxBLACK_PEN); + dc.DrawLine((tabX + GetWidth() + 1), (tabY+1), + (tabX + GetWidth() + 1), bottomY); + + // Draw the horizontal bit to connect to the view rectangle + dc.DrawLine((wxMax((tabX + GetWidth() - m_view->GetHorizontalTabOffset()), rightOfView)), (bottomY), + (tabX + GetWidth() + 1), (bottomY)); + } + else + { + if (lastInRow) + { + // 25/5/97 UNLESS it's less than the max number of positions in this row + + int topY = m_view->GetViewRect().y - m_view->GetTopMargin(); + + int maxPositions = ((wxTabLayer *)m_view->GetLayers().Item(0)->GetData())->GetCount(); + + // Only down to the bottom of the tab, not to the top of the view + if ( GetRowPosition() < (maxPositions - 1) ) + topY = tabY + GetHeight() + tabHeightInc; + +#ifdef __WXMOTIF__ + topY -= 1; +#endif + + // Shadow + dc.DrawLine((tabX + GetWidth()), tabY, (tabX + GetWidth()), topY); + // Draw black line to emphasize shadow + dc.SetPen(*wxBLACK_PEN); + dc.DrawLine((tabX + GetWidth() + 1), (tabY+1), (tabX + GetWidth() + 1), + topY); + } + else + { + // Calculate the top of the tab beneath. It's the height of the tab, MINUS + // a bit if the tab below (and next col along) happens to be selected. Check. + wxTabControl *tabBeneath = NULL; + int subtractThis = 0; + if (GetColPosition() > 0) + tabBeneath = m_view->FindTabControlForPosition(GetColPosition() - 1, GetRowPosition() + 1); + if (tabBeneath && tabBeneath->IsSelected()) + subtractThis = (m_view->GetTabSelectionHeight() - m_view->GetTabHeight()); + +#ifdef __WXMOTIF__ + subtractThis += 1; +#endif + + // Draw only to next tab down. + dc.DrawLine((tabX + GetWidth()), tabY, + (tabX + GetWidth()), (tabY + GetHeight() + tabHeightInc - subtractThis)); + + // Draw black line to emphasize shadow + dc.SetPen(*wxBLACK_PEN); + dc.DrawLine((tabX + GetWidth() + 1), (tabY+1), (tabX + GetWidth() + 1), + (tabY + GetHeight() + tabHeightInc - subtractThis)); + } + } + + // Draw centered text + int textY = tabY + m_view->GetVerticalTabTextSpacing() + tabHeightInc; + + if (m_isSelected) + dc.SetFont(* m_view->GetSelectedTabFont()); + else + dc.SetFont(* GetFont()); + + wxColour col(m_view->GetTextColour()); + dc.SetTextForeground(col); + dc.SetBackgroundMode(wxTRANSPARENT); + long textWidth, textHeight; + dc.GetTextExtent(GetLabel(), &textWidth, &textHeight); + + int textX = (int)(tabX + (GetWidth() - textWidth)/2.0); + if (textX < (tabX + 2)) + textX = (tabX + 2); + + dc.SetClippingRegion(tabX, tabY, GetWidth(), GetHeight()); + dc.DrawText(GetLabel(), textX, textY); + dc.DestroyClippingRegion(); + + if (m_isSelected) + { + dc.SetPen(*m_view->GetHighlightPen()); + + // Draw white highlight from the tab's left side to the left hand edge of the view + dc.DrawLine(m_view->GetViewRect().x, (tabY + GetHeight() + tabHeightInc), + tabX, (tabY + GetHeight() + tabHeightInc)); + + // Draw white highlight from the tab's right side to the right hand edge of the view + dc.DrawLine((tabX + GetWidth()), (tabY + GetHeight() + tabHeightInc), + m_view->GetViewRect().x + m_view->GetViewRect().width, (tabY + GetHeight() + tabHeightInc)); + } +#else + // New HEL version with rounder tabs + + if (!m_view) return; + + int tabInc = 0; + if (m_isSelected) + { + tabInc = m_view->GetTabSelectionHeight() - m_view->GetTabHeight(); + } + int tabLeft = GetX() + m_view->GetViewRect().x; + int tabTop = GetY() + m_view->GetViewRect().y - tabInc; + int tabRight = tabLeft + m_view->GetTabWidth(); + int left = m_view->GetViewRect().x; + int top = tabTop + m_view->GetTabHeight() + tabInc; + int right = left + m_view->GetViewRect().width; + int bottom = top + m_view->GetViewRect().height; + + if (m_isSelected) + { + // TAB is selected - draw TAB and the View's full outline + + dc.SetPen(*(m_view->GetHighlightPen())); + wxPoint pnts[10]; + int n = 0; + pnts[n].x = left; pnts[n++].y = bottom; + pnts[n].x = left; pnts[n++].y = top; + pnts[n].x = tabLeft; pnts[n++].y = top; + pnts[n].x = tabLeft; pnts[n++].y = tabTop + 2; + pnts[n].x = tabLeft + 2; pnts[n++].y = tabTop; + pnts[n].x = tabRight - 1; pnts[n++].y = tabTop; + dc.DrawLines(n, pnts); + if (!lastInRow) + { + dc.DrawLine( + (tabRight + 2), + top, + right, + top + ); + } + + dc.SetPen(*(m_view->GetShadowPen())); + dc.DrawLine( + tabRight, + tabTop + 2, + tabRight, + top + ); + dc.DrawLine( + right, + top, + right, + bottom + ); + dc.DrawLine( + right, + bottom, + left, + bottom + ); + + dc.SetPen(*wxBLACK_PEN); + dc.DrawPoint( + tabRight, + tabTop + 1 + ); + dc.DrawPoint( + tabRight + 1, + tabTop + 2 + ); + if (lastInRow) + { + dc.DrawLine( + tabRight + 1, + bottom, + tabRight + 1, + tabTop + 1 + ); + } + else + { + dc.DrawLine( + tabRight + 1, + tabTop + 2, + tabRight + 1, + top + ); + dc.DrawLine( + right + 1, + top, + right + 1, + bottom + 1 + ); + } + dc.DrawLine( + right + 1, + bottom + 1, + left + 1, + bottom + 1 + ); + } + else + { + // TAB is not selected - just draw TAB outline and RH edge + // if the TAB is the last in the row + + int maxPositions = ((wxTabLayer*)m_view->GetLayers().Item(0)->GetData())->GetCount(); + wxTabControl* tabBelow = 0; + wxTabControl* tabBelowRight = 0; + if (GetColPosition() > 0) + { + tabBelow = m_view->FindTabControlForPosition( + GetColPosition() - 1, + GetRowPosition() + ); + } + if (!lastInRow && GetColPosition() > 0) + { + tabBelowRight = m_view->FindTabControlForPosition( + GetColPosition() - 1, + GetRowPosition() + 1 + ); + } + + float raisedTop = top - m_view->GetTabSelectionHeight() + + m_view->GetTabHeight(); + + dc.SetPen(*(m_view->GetHighlightPen())); + wxPoint pnts[10]; + int n = 0; + + pnts[n].x = tabLeft; + + if (tabBelow && tabBelow->IsSelected()) + { + pnts[n++].y = (long)raisedTop; + } + else + { + pnts[n++].y = top; + } + pnts[n].x = tabLeft; pnts[n++].y = tabTop + 2; + pnts[n].x = tabLeft + 2; pnts[n++].y = tabTop; + pnts[n].x = tabRight - 1; pnts[n++].y = tabTop; + dc.DrawLines(n, pnts); + + dc.SetPen(*(m_view->GetShadowPen())); + if (GetRowPosition() >= maxPositions - 1) + { + dc.DrawLine( + tabRight, + (tabTop + 2), + tabRight, + bottom + ); + dc.DrawLine( + tabRight, + bottom, + (tabRight - m_view->GetHorizontalTabOffset()), + bottom + ); + } + else + { + if (tabBelowRight && tabBelowRight->IsSelected()) + { + dc.DrawLine( + tabRight, + (long)raisedTop, + tabRight, + tabTop + 1 + ); + } + else + { + dc.DrawLine( + tabRight, + top - 1, + tabRight, + tabTop + 1 + ); + } + } + + dc.SetPen(*wxBLACK_PEN); + dc.DrawPoint( + tabRight, + tabTop + 1 + ); + dc.DrawPoint( + tabRight + 1, + tabTop + 2 + ); + if (GetRowPosition() >= maxPositions - 1) + { + // draw right hand edge to bottom of view + dc.DrawLine( + tabRight + 1, + bottom + 1, + tabRight + 1, + tabTop + 2 + ); + dc.DrawLine( + tabRight + 1, + bottom + 1, + (tabRight - m_view->GetHorizontalTabOffset()), + bottom + 1 + ); + } + else + { + // draw right hand edge of TAB + if (tabBelowRight && tabBelowRight->IsSelected()) + { + dc.DrawLine( + tabRight + 1, + (long)(raisedTop - 1), + tabRight + 1, + tabTop + 2 + ); + } + else + { + dc.DrawLine( + tabRight + 1, + top - 1, + tabRight + 1, + tabTop + 2 + ); + } + } + } + + // Draw centered text + dc.SetPen(*wxBLACK_PEN); + if (m_isSelected) + { + dc.SetFont(*(m_view->GetSelectedTabFont())); + } + else + { + dc.SetFont(*(GetFont())); + } + + wxColour col(m_view->GetTextColour()); + dc.SetTextForeground(col); + dc.SetBackgroundMode(wxTRANSPARENT); + long textWidth, textHeight; + dc.GetTextExtent(GetLabel(), &textWidth, &textHeight); + + float textX = (tabLeft + tabRight - textWidth) / 2; + float textY = (tabInc + tabTop + m_view->GetVerticalTabTextSpacing()); + + dc.DrawText(GetLabel(), (long)textX, (long)textY); +#endif +} + +bool wxTabControl::HitTest(int x, int y) const +{ + // Top-left of tab control + int tabX1 = GetX() + m_view->GetViewRect().x; + int tabY1 = GetY() + m_view->GetViewRect().y; + + // Bottom-right + int tabX2 = tabX1 + GetWidth(); + int tabY2 = tabY1 + GetHeight(); + + if (x >= tabX1 && y >= tabY1 && x <= tabX2 && y <= tabY2) + return true; + else + return false; +} + +IMPLEMENT_DYNAMIC_CLASS(wxTabView, wxObject) + +wxTabView::wxTabView(long style) +{ + m_noTabs = 0; + m_tabStyle = style; + m_tabSelection = -1; + m_tabHeight = 20; + m_tabSelectionHeight = m_tabHeight + 2; + m_tabWidth = 80; + m_tabHorizontalOffset = 10; + m_tabHorizontalSpacing = 2; + m_tabVerticalTextSpacing = 3; + m_topMargin = 5; + m_tabViewRect.x = 20; + m_tabViewRect.y = 20; + m_tabViewRect.width = 300; + m_tabViewRect.x = 300; + m_highlightColour = *wxWHITE; + m_shadowColour = wxColour(128, 128, 128); + m_backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE); + m_textColour = *wxBLACK; + m_highlightPen = wxWHITE_PEN; + m_shadowPen = wxGREY_PEN; + SetBackgroundColour(m_backgroundColour); + m_tabFont = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT); + m_tabSelectedFont = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT); + m_window = (wxWindow *) NULL; +} + +wxTabView::~wxTabView() +{ + ClearTabs(true); +} + +// Automatically positions tabs +// TODO: this should just add the tab to a list, and then +// a layout function (e.g. Realize) should be called when all tabs have been added. +// The view rect could easily change as the view window is resized. +wxTabControl *wxTabView::AddTab(int id, const wxString& label, wxTabControl *existingTab) +{ + // First, find which layer we should be adding to. + wxTabLayerList::compatibility_iterator node = m_layers.GetLast(); + if (!node) + { + wxTabLayer *newLayer = new wxTabLayer; + node = m_layers.Append(newLayer); + } + // Check if adding another tab control would go off the + // right-hand edge of the layer. + wxTabLayer *tabLayer = (wxTabLayer *)node->GetData(); + wxList::compatibility_iterator lastTabNode = tabLayer->GetLast(); + if (lastTabNode) + { + wxTabControl *lastTab = (wxTabControl *)lastTabNode->GetData(); + // Start another layer (row). + // Tricky choice: can't just check if will be overlapping the edge, because + // this happens anyway for 2nd and subsequent rows. + // Should check this for 1st row, and then subsequent rows should not exceed 1st + // in length. + if (((tabLayer == m_layers.GetFirst()->GetData()) && ((lastTab->GetX() + 2*lastTab->GetWidth() + GetHorizontalTabSpacing()) + > GetViewRect().width)) || + ((tabLayer != m_layers.GetFirst()->GetData()) && (tabLayer->GetCount() == ((wxTabLayer *)m_layers.GetFirst()->GetData())->GetCount()))) + { + tabLayer = new wxTabLayer; + m_layers.Append(tabLayer); + lastTabNode = wxList::compatibility_iterator(); + } + } + int layer = m_layers.GetCount() - 1; + + wxTabControl *tabControl = existingTab; + if (!existingTab) + tabControl = OnCreateTabControl(); + tabControl->SetRowPosition(tabLayer->GetCount()); + tabControl->SetColPosition(layer); + + wxTabControl *lastTab = (wxTabControl *) NULL; + if (lastTabNode) + lastTab = (wxTabControl *)lastTabNode->GetData(); + + // Top of new tab + int verticalOffset = (- GetTopMargin()) - ((layer+1)*GetTabHeight()); + // Offset from view top-left + int horizontalOffset = 0; + if (!lastTab) + horizontalOffset = layer*GetHorizontalTabOffset(); + else + horizontalOffset = lastTab->GetX() + GetTabWidth() + GetHorizontalTabSpacing(); + + tabControl->SetPosition(horizontalOffset, verticalOffset); + tabControl->SetSize(GetTabWidth(), GetTabHeight()); + tabControl->SetId(id); + tabControl->SetLabel(label); + tabControl->SetFont(* GetTabFont()); + + tabLayer->Append(tabControl); + m_noTabs ++; + + return tabControl; +} + +// Remove the tab without deleting the window +bool wxTabView::RemoveTab(int id) +{ + wxTabLayerList::compatibility_iterator layerNode = m_layers.GetFirst(); + while (layerNode) + { + wxTabLayer *layer = (wxTabLayer *)layerNode->GetData(); + wxList::compatibility_iterator tabNode = layer->GetFirst(); + while (tabNode) + { + wxTabControl *tab = (wxTabControl *)tabNode->GetData(); + if (tab->GetId() == id) + { + if (id == m_tabSelection) + m_tabSelection = -1; + delete tab; + layer->Erase(tabNode); + m_noTabs --; + + // The layout has changed + LayoutTabs(); + return true; + } + tabNode = tabNode->GetNext(); + } + layerNode = layerNode->GetNext(); + } + return false; +} + +bool wxTabView::SetTabText(int id, const wxString& label) +{ + wxTabControl* control = FindTabControlForId(id); + if (!control) + return false; + control->SetLabel(label); + return true; +} + +wxString wxTabView::GetTabText(int id) const +{ + wxTabControl* control = FindTabControlForId(id); + if (!control) + return wxEmptyString; + else + return control->GetLabel(); +} + +// Returns the total height of the tabs component -- this may be several +// times the height of a tab, if there are several tab layers (rows). +int wxTabView::GetTotalTabHeight() +{ + int minY = 0; + + wxTabLayerList::compatibility_iterator layerNode = m_layers.GetFirst(); + while (layerNode) + { + wxTabLayer *layer = (wxTabLayer *)layerNode->GetData(); + wxList::compatibility_iterator tabNode = layer->GetFirst(); + while (tabNode) + { + wxTabControl *tab = (wxTabControl *)tabNode->GetData(); + + if (tab->GetY() < minY) + minY = tab->GetY(); + + tabNode = tabNode->GetNext(); + } + layerNode = layerNode->GetNext(); + } + + return - minY; +} + +void wxTabView::ClearTabs(bool deleteTabs) +{ + wxTabLayerList::compatibility_iterator layerNode = m_layers.GetFirst(); + while (layerNode) + { + wxTabLayer *layer = (wxTabLayer *)layerNode->GetData(); + wxList::compatibility_iterator tabNode = layer->GetFirst(); + while (tabNode) + { + wxTabControl *tab = (wxTabControl *)tabNode->GetData(); + if (deleteTabs) + delete tab; + wxList::compatibility_iterator next = tabNode->GetNext(); + layer->Erase(tabNode); + tabNode = next; + } + wxTabLayerList::compatibility_iterator nextLayerNode = layerNode->GetNext(); + delete layer; + m_layers.Erase(layerNode); + layerNode = nextLayerNode; + } + m_noTabs = 0; + m_tabSelection = -1; +} + + +// Layout tabs (optional, e.g. if resizing window) +void wxTabView::LayoutTabs(void) +{ + // Make a list of the tab controls, deleting the wxTabLayers. + wxList controls; + + wxTabLayerList::compatibility_iterator layerNode = m_layers.GetFirst(); + while (layerNode) + { + wxTabLayer *layer = (wxTabLayer *)layerNode->GetData(); + wxList::compatibility_iterator tabNode = layer->GetFirst(); + while (tabNode) + { + wxTabControl *tab = (wxTabControl *)tabNode->GetData(); + controls.Append(tab); + wxList::compatibility_iterator next = tabNode->GetNext(); + layer->Erase(tabNode); + tabNode = next; + } + wxTabLayerList::compatibility_iterator nextLayerNode = layerNode->GetNext(); + delete layer; + m_layers.Erase(layerNode); + layerNode = nextLayerNode; + } + + wxTabControl *lastTab = (wxTabControl *) NULL; + + wxTabLayer *currentLayer = new wxTabLayer; + m_layers.Append(currentLayer); + + wxList::compatibility_iterator node = controls.GetFirst(); + while (node) + { + wxTabControl *tabControl = (wxTabControl *)node->GetData(); + if (lastTab) + { + // Start another layer (row). + // Tricky choice: can't just check if will be overlapping the edge, because + // this happens anyway for 2nd and subsequent rows. + // Should check this for 1st row, and then subsequent rows should not exceed 1st + // in length. + if (((currentLayer == m_layers.GetFirst()->GetData()) && ((lastTab->GetX() + 2*lastTab->GetWidth() + GetHorizontalTabSpacing()) + > GetViewRect().width)) || + ((currentLayer != m_layers.GetFirst()->GetData()) && (currentLayer->GetCount() == ((wxTabLayer *)m_layers.GetFirst()->GetData())->GetCount()))) + { + currentLayer = new wxTabLayer; + m_layers.Append(currentLayer); + lastTab = (wxTabControl *) NULL; + } + } + + int layer = m_layers.GetCount() - 1; + + tabControl->SetRowPosition(currentLayer->GetCount()); + tabControl->SetColPosition(layer); + + // Top of new tab + int verticalOffset = (- GetTopMargin()) - ((layer+1)*GetTabHeight()); + // Offset from view top-left + int horizontalOffset = 0; + if (!lastTab) + horizontalOffset = layer*GetHorizontalTabOffset(); + else + horizontalOffset = lastTab->GetX() + GetTabWidth() + GetHorizontalTabSpacing(); + + tabControl->SetPosition(horizontalOffset, verticalOffset); + tabControl->SetSize(GetTabWidth(), GetTabHeight()); + + currentLayer->Append(tabControl); + lastTab = tabControl; + + node = node->GetNext(); + } + + // Move the selected tab to the bottom + wxTabControl *control = FindTabControlForId(m_tabSelection); + if (control) + MoveSelectionTab(control); + +} + +// Draw all tabs +void wxTabView::Draw(wxDC& dc) +{ + // Don't draw anything if there are no tabs. + if (GetNumberOfTabs() == 0) + return; + + // Draw top margin area (beneath tabs and above view area) + if (GetTabStyle() & wxTAB_STYLE_COLOUR_INTERIOR) + { + dc.SetPen(*wxTRANSPARENT_PEN); + dc.SetBrush(*GetBackgroundBrush()); + + // Add 1 because the pen is transparent. Under Motif, may be different. + dc.DrawRectangle( + m_tabViewRect.x, + (m_tabViewRect.y - m_topMargin), + (m_tabViewRect.width + 1), + (m_topMargin + 1) + ); + } + + // Draw layers in reverse order + wxTabLayerList::compatibility_iterator node = m_layers.GetLast(); + while (node) + { + wxTabLayer *layer = (wxTabLayer *)node->GetData(); + wxList::compatibility_iterator node2 = layer->GetFirst(); + while (node2) + { + wxTabControl *control = (wxTabControl *)node2->GetData(); + control->OnDraw(dc, (!node2->GetNext())); + node2 = node2->GetNext(); + } + + node = node->GetPrevious(); + } + + +#ifndef wxUSE_NEW_METHOD + if (GetTabStyle() & wxTAB_STYLE_DRAW_BOX) + { + dc.SetPen(* GetShadowPen()); + + // Draw bottom line + dc.DrawLine( + (GetViewRect().x + 1), + (GetViewRect().y + GetViewRect().height), + (GetViewRect().x + GetViewRect().width + 1), + (GetViewRect().y + GetViewRect().height) + ); + + // Draw right line + dc.DrawLine( + (GetViewRect().x + GetViewRect().width), + (GetViewRect().y - GetTopMargin() + 1), + (GetViewRect().x + GetViewRect().width), + (GetViewRect().y + GetViewRect().height) + ); + + dc.SetPen(* wxBLACK_PEN); + + // Draw bottom line + dc.DrawLine( + (GetViewRect().x), + (GetViewRect().y + GetViewRect().height + 1), +#if defined(__WXMOTIF__) + (GetViewRect().x + GetViewRect().width + 1), +#else + (GetViewRect().x + GetViewRect().width + 2), +#endif + + (GetViewRect().y + GetViewRect().height + 1) + ); + + // Draw right line + dc.DrawLine( + (GetViewRect().x + GetViewRect().width + 1), + (GetViewRect().y - GetTopMargin()), + (GetViewRect().x + GetViewRect().width + 1), + (GetViewRect().y + GetViewRect().height + 1) + ); + } +#endif +} + +// Process mouse event, return false if we didn't process it +bool wxTabView::OnEvent(wxMouseEvent& event) +{ + if (!event.LeftDown()) + return false; + + wxCoord x, y; + event.GetPosition(&x, &y); + + wxTabControl *hitControl = (wxTabControl *) NULL; + + wxTabLayerList::compatibility_iterator node = m_layers.GetFirst(); + while (node) + { + wxTabLayer *layer = (wxTabLayer *)node->GetData(); + wxList::compatibility_iterator node2 = layer->GetFirst(); + while (node2) + { + wxTabControl *control = (wxTabControl *)node2->GetData(); + if (control->HitTest((int)x, (int)y)) + { + hitControl = control; + node = wxTabLayerList::compatibility_iterator(); + node2 = wxList::compatibility_iterator(); + } + else + node2 = node2->GetNext(); + } + + if (node) + node = node->GetNext(); + } + + if (!hitControl) + return false; + + wxTabControl *currentTab = FindTabControlForId(m_tabSelection); + + if (hitControl == currentTab) + return false; + + ChangeTab(hitControl); + + return true; +} + +bool wxTabView::ChangeTab(wxTabControl *control) +{ + wxTabControl *currentTab = FindTabControlForId(m_tabSelection); + int oldTab = -1; + if (currentTab) + oldTab = currentTab->GetId(); + + if (control == currentTab) + return true; + + if (m_layers.GetCount() == 0) + return false; + + if (!OnTabPreActivate(control->GetId(), oldTab)) + return false; + + // Move the tab to the bottom + MoveSelectionTab(control); + + if (currentTab) + currentTab->SetSelected(false); + + control->SetSelected(true); + m_tabSelection = control->GetId(); + + OnTabActivate(control->GetId(), oldTab); + + // Leave window refresh for the implementing window + + return true; +} + +// Move the selected tab to the bottom layer, if necessary, +// without calling app activation code +bool wxTabView::MoveSelectionTab(wxTabControl *control) +{ + if (m_layers.GetCount() == 0) + return false; + + wxTabLayer *firstLayer = (wxTabLayer *)m_layers.GetFirst()->GetData(); + + // Find what column this tab is at, so we can swap with the one at the bottom. + // If we're on the bottom layer, then no need to swap. + if (!firstLayer->Member(control)) + { + // Do a swap + int col = 0; + wxList::compatibility_iterator thisNode = FindTabNodeAndColumn(control, &col); + if (!thisNode) + return false; + wxList::compatibility_iterator otherNode = firstLayer->Item(col); + if (!otherNode) + return false; + + // If this is already in the bottom layer, return now + if (otherNode == thisNode) + return true; + + wxTabControl *otherTab = (wxTabControl *)otherNode->GetData(); + + // We now have pointers to the tab to be changed to, + // and the tab on the first layer. Swap tab structures and + // position details. + + int thisX = control->GetX(); + int thisY = control->GetY(); + int thisColPos = control->GetColPosition(); + int otherX = otherTab->GetX(); + int otherY = otherTab->GetY(); + int otherColPos = otherTab->GetColPosition(); + + control->SetPosition(otherX, otherY); + control->SetColPosition(otherColPos); + otherTab->SetPosition(thisX, thisY); + otherTab->SetColPosition(thisColPos); + + // Swap the data for the nodes + thisNode->SetData(otherTab); + otherNode->SetData(control); + } + return true; +} + +// Called when a tab is activated +void wxTabView::OnTabActivate(int /*activateId*/, int /*deactivateId*/) +{ +} + +void wxTabView::SetHighlightColour(const wxColour& col) +{ + m_highlightColour = col; + m_highlightPen = wxThePenList->FindOrCreatePen(col, 1, wxSOLID); +} + +void wxTabView::SetShadowColour(const wxColour& col) +{ + m_shadowColour = col; + m_shadowPen = wxThePenList->FindOrCreatePen(col, 1, wxSOLID); +} + +void wxTabView::SetBackgroundColour(const wxColour& col) +{ + m_backgroundColour = col; + m_backgroundPen = wxThePenList->FindOrCreatePen(col, 1, wxSOLID); + m_backgroundBrush = wxTheBrushList->FindOrCreateBrush(col, wxSOLID); +} + +// this may be called with sel = zero (which doesn't match any page) +// when wxMotif deletes a page +// so return the first tab... + +void wxTabView::SetTabSelection(int sel, bool activateTool) +{ + if ( sel==m_tabSelection ) + return; + + int oldSel = m_tabSelection; + wxTabControl *control = FindTabControlForId(sel); + if (sel == 0) sel=control->GetId(); + wxTabControl *oldControl = FindTabControlForId(m_tabSelection); + + if (!OnTabPreActivate(sel, oldSel)) + return; + + if (control) + control->SetSelected((sel != -1)); // TODO ?? + else if (sel != -1) + { + wxFAIL_MSG(_("Could not find tab for id")); + return; + } + + if (oldControl) + oldControl->SetSelected(false); + + m_tabSelection = sel; + + if (control) + MoveSelectionTab(control); + + if (activateTool) + OnTabActivate(sel, oldSel); +} + +// Find tab control for id +// this may be called with zero (which doesn't match any page) +// so return the first control... +wxTabControl *wxTabView::FindTabControlForId(int id) const +{ + wxTabLayerList::compatibility_iterator node1 = m_layers.GetFirst(); + while (node1) + { + wxTabLayer *layer = (wxTabLayer *)node1->GetData(); + wxList::compatibility_iterator node2 = layer->GetFirst(); + while (node2) + { + wxTabControl *control = (wxTabControl *)node2->GetData(); + if (control->GetId() == id || id == 0) + return control; + node2 = node2->GetNext(); + } + node1 = node1->GetNext(); + } + return (wxTabControl *) NULL; +} + +// Find tab control for layer, position (starting from zero) +wxTabControl *wxTabView::FindTabControlForPosition(int layer, int position) const +{ + wxTabLayerList::compatibility_iterator node1 = m_layers.Item(layer); + if (!node1) + return (wxTabControl *) NULL; + wxTabLayer *tabLayer = (wxTabLayer *)node1->GetData(); + wxList::compatibility_iterator node2 = tabLayer->Item(position); + if (!node2) + return (wxTabControl *) NULL; + return (wxTabControl *)node2->GetData(); +} + +// Find the node and the column at which this control is positioned. +wxList::compatibility_iterator wxTabView::FindTabNodeAndColumn(wxTabControl *control, int *col) const +{ + wxTabLayerList::compatibility_iterator node1 = m_layers.GetFirst(); + while (node1) + { + wxTabLayer *layer = (wxTabLayer *)node1->GetData(); + int c = 0; + wxList::compatibility_iterator node2 = layer->GetFirst(); + while (node2) + { + wxTabControl *cnt = (wxTabControl *)node2->GetData(); + if (cnt == control) + { + *col = c; + return node2; + } + node2 = node2->GetNext(); + c ++; + } + node1 = node1->GetNext(); + } + return wxList::compatibility_iterator(); +} + +int wxTabView::CalculateTabWidth(int noTabs, bool adjustView) +{ + m_tabWidth = (int)((m_tabViewRect.width - ((noTabs - 1)*GetHorizontalTabSpacing()))/noTabs); + if (adjustView) + { + m_tabViewRect.width = noTabs*m_tabWidth + ((noTabs-1)*GetHorizontalTabSpacing()); + } + return m_tabWidth; +} + +/* + * wxTabbedDialog + */ + +IMPLEMENT_CLASS(wxTabbedDialog, wxDialog) + +BEGIN_EVENT_TABLE(wxTabbedDialog, wxDialog) + EVT_CLOSE(wxTabbedDialog::OnCloseWindow) + EVT_MOUSE_EVENTS(wxTabbedDialog::OnMouseEvent) + EVT_PAINT(wxTabbedDialog::OnPaint) +END_EVENT_TABLE() + +wxTabbedDialog::wxTabbedDialog(wxWindow *parent, wxWindowID id, + const wxString& title, + const wxPoint& pos, const wxSize& size, + long windowStyle, const wxString& name): + wxDialog(parent, id, title, pos, size, windowStyle, name) +{ + m_tabView = (wxTabView *) NULL; +} + +wxTabbedDialog::~wxTabbedDialog(void) +{ + if (m_tabView) + delete m_tabView; +} + +void wxTabbedDialog::OnCloseWindow(wxCloseEvent& WXUNUSED(event) ) +{ + Destroy(); +} + +void wxTabbedDialog::OnMouseEvent(wxMouseEvent& event ) +{ + if (m_tabView) + m_tabView->OnEvent(event); +} + +void wxTabbedDialog::OnPaint(wxPaintEvent& WXUNUSED(event) ) +{ + wxPaintDC dc(this); + if (m_tabView) + m_tabView->Draw(dc); +} + +/* + * wxTabbedPanel + */ + +IMPLEMENT_CLASS(wxTabbedPanel, wxPanel) + +BEGIN_EVENT_TABLE(wxTabbedPanel, wxPanel) + EVT_MOUSE_EVENTS(wxTabbedPanel::OnMouseEvent) + EVT_PAINT(wxTabbedPanel::OnPaint) +END_EVENT_TABLE() + +wxTabbedPanel::wxTabbedPanel(wxWindow *parent, wxWindowID id, const wxPoint& pos, + const wxSize& size, long windowStyle, const wxString& name): + wxPanel(parent, id, pos, size, windowStyle, name) +{ + m_tabView = (wxTabView *) NULL; +} + +wxTabbedPanel::~wxTabbedPanel(void) +{ + delete m_tabView; +} + +void wxTabbedPanel::OnMouseEvent(wxMouseEvent& event) +{ + if (m_tabView) + m_tabView->OnEvent(event); +} + +void wxTabbedPanel::OnPaint(wxPaintEvent& WXUNUSED(event) ) +{ + wxPaintDC dc(this); + if (m_tabView) + m_tabView->Draw(dc); +} + +/* + * wxPanelTabView + */ + +IMPLEMENT_CLASS(wxPanelTabView, wxTabView) + +wxPanelTabView::wxPanelTabView(wxPanel *pan, long style) + : wxTabView(style) +{ + m_panel = pan; + m_currentWindow = (wxWindow *) NULL; + + if (m_panel->IsKindOf(CLASSINFO(wxTabbedDialog))) + ((wxTabbedDialog *)m_panel)->SetTabView(this); + else if (m_panel->IsKindOf(CLASSINFO(wxTabbedPanel))) + ((wxTabbedPanel *)m_panel)->SetTabView(this); + + SetWindow(m_panel); +} + +wxPanelTabView::~wxPanelTabView(void) +{ + ClearWindows(true); +} + +// Called when a tab is activated +void wxPanelTabView::OnTabActivate(int activateId, int deactivateId) +{ + if (!m_panel) + return; + + wxWindow *oldWindow = ((deactivateId == -1) ? 0 : GetTabWindow(deactivateId)); + wxWindow *newWindow = GetTabWindow(activateId); + + if (oldWindow) + oldWindow->Show(false); + if (newWindow) + newWindow->Show(true); + + m_panel->Refresh(); +} + + +void wxPanelTabView::AddTabWindow(int id, wxWindow *window) +{ + wxASSERT(m_tabWindows.find(id) == m_tabWindows.end()); + m_tabWindows[id] = window; + window->Show(false); +} + +wxWindow *wxPanelTabView::GetTabWindow(int id) const +{ + wxIntToWindowHashMap::const_iterator it = m_tabWindows.find(id); + return it == m_tabWindows.end() ? NULL : it->second; +} + +void wxPanelTabView::ClearWindows(bool deleteWindows) +{ + if (deleteWindows) + WX_CLEAR_HASH_MAP(wxIntToWindowHashMap, m_tabWindows); + m_tabWindows.clear(); +} + +void wxPanelTabView::ShowWindowForTab(int id) +{ + wxWindow *newWindow = GetTabWindow(id); + if (newWindow == m_currentWindow) + return; + if (m_currentWindow) + m_currentWindow->Show(false); + newWindow->Show(true); + newWindow->Refresh(); +} + +#endif // wxUSE_TAB_DIALOG diff --git a/Externals/wxWidgets/src/generic/textdlgg.cpp b/Externals/wxWidgets/src/generic/textdlgg.cpp new file mode 100644 index 0000000000..f1c8aa64bc --- /dev/null +++ b/Externals/wxWidgets/src/generic/textdlgg.cpp @@ -0,0 +1,185 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/generic/textdlgg.cpp +// Purpose: wxTextEntryDialog +// Author: Julian Smart +// Modified by: +// Created: 04/01/98 +// RCS-ID: $Id: textdlgg.cpp 41838 2006-10-09 21:08:45Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_TEXTDLG + +#include "wx/generic/textdlgg.h" + +#ifndef WX_PRECOMP + #include "wx/utils.h" + #include "wx/dialog.h" + #include "wx/button.h" + #include "wx/stattext.h" + #include "wx/textctrl.h" + #include "wx/intl.h" + #include "wx/sizer.h" +#endif + +#if wxUSE_STATLINE + #include "wx/statline.h" +#endif + +const wxChar wxGetTextFromUserPromptStr[] = wxT("Input Text"); +const wxChar wxGetPasswordFromUserPromptStr[] = wxT("Enter Password"); + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +static const int wxID_TEXT = 3000; + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxTextEntryDialog +// ---------------------------------------------------------------------------- + +BEGIN_EVENT_TABLE(wxTextEntryDialog, wxDialog) + EVT_BUTTON(wxID_OK, wxTextEntryDialog::OnOK) +END_EVENT_TABLE() + +IMPLEMENT_CLASS(wxTextEntryDialog, wxDialog) + +wxTextEntryDialog::wxTextEntryDialog(wxWindow *parent, + const wxString& message, + const wxString& caption, + const wxString& value, + long style, + const wxPoint& pos) + : wxDialog(parent, wxID_ANY, caption, pos, wxDefaultSize, + wxDEFAULT_DIALOG_STYLE), + m_value(value) +{ + m_dialogStyle = style; + m_value = value; + + wxBeginBusyCursor(); + + wxBoxSizer *topsizer = new wxBoxSizer( wxVERTICAL ); + + wxSizerFlags flagsBorder2; + flagsBorder2.DoubleBorder(); + +#if wxUSE_STATTEXT + // 1) text message + topsizer->Add(CreateTextSizer(message), flagsBorder2); +#endif + + // 2) text ctrl + m_textctrl = new wxTextCtrl(this, wxID_TEXT, value, + wxDefaultPosition, wxSize(300, wxDefaultCoord), + style & ~wxTextEntryDialogStyle); + + topsizer->Add(m_textctrl, + wxSizerFlags(style & wxTE_MULTILINE ? 1 : 0). + Expand(). + TripleBorder(wxLEFT | wxRIGHT)); + +#if wxUSE_VALIDATORS + wxTextValidator validator( wxFILTER_NONE, &m_value ); + m_textctrl->SetValidator( validator ); +#endif // wxUSE_VALIDATORS + + // 3) buttons if any + wxSizer *buttonSizer = CreateSeparatedButtonSizer(style & ButtonSizerFlags); + if ( buttonSizer ) + { + topsizer->Add(buttonSizer, wxSizerFlags(flagsBorder2).Expand()); + } + + SetAutoLayout( true ); + SetSizer( topsizer ); + + topsizer->SetSizeHints( this ); + topsizer->Fit( this ); + + if ( style & wxCENTRE ) + Centre( wxBOTH ); + + m_textctrl->SetSelection(-1, -1); + m_textctrl->SetFocus(); + + wxEndBusyCursor(); +} + +void wxTextEntryDialog::OnOK(wxCommandEvent& WXUNUSED(event) ) +{ +#if wxUSE_VALIDATORS + if( Validate() && TransferDataFromWindow() ) + { + EndModal( wxID_OK ); + } +#else + m_value = m_textctrl->GetValue(); + + EndModal(wxID_OK); +#endif + // wxUSE_VALIDATORS +} + +void wxTextEntryDialog::SetValue(const wxString& val) +{ + m_value = val; + + m_textctrl->SetValue(val); +} + +#if wxUSE_VALIDATORS +void wxTextEntryDialog::SetTextValidator( long style ) +{ + wxTextValidator validator( style, &m_value ); + m_textctrl->SetValidator( validator ); +} + +void wxTextEntryDialog::SetTextValidator( const wxTextValidator& validator ) +{ + m_textctrl->SetValidator( validator ); +} + +#endif + // wxUSE_VALIDATORS + +// ---------------------------------------------------------------------------- +// wxPasswordEntryDialog +// ---------------------------------------------------------------------------- + +IMPLEMENT_CLASS(wxPasswordEntryDialog, wxTextEntryDialog) + +wxPasswordEntryDialog::wxPasswordEntryDialog(wxWindow *parent, + const wxString& message, + const wxString& caption, + const wxString& value, + long style, + const wxPoint& pos) + : wxTextEntryDialog(parent, message, caption, value, + style | wxTE_PASSWORD, pos) +{ + // Only change from wxTextEntryDialog is the password style +} + +#endif // wxUSE_TEXTDLG diff --git a/Externals/wxWidgets/src/generic/timer.cpp b/Externals/wxWidgets/src/generic/timer.cpp new file mode 100644 index 0000000000..1fad2018bd --- /dev/null +++ b/Externals/wxWidgets/src/generic/timer.cpp @@ -0,0 +1,283 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/generic/timer.cpp +// Purpose: wxTimer implementation +// Author: Vaclav Slavik +// Id: $Id: timer.cpp 40943 2006-08-31 19:31:43Z ABX $ +// Copyright: (c) Vaclav Slavik +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +// ---------------------------------------------------------------------------- +// NB: when using generic wxTimer implementation in your port, you *must* call +// wxTimer::NotifyTimers() often enough. The ideal place for this +// is in wxEventLoop::Dispatch(). +// ---------------------------------------------------------------------------- + +#if wxUSE_TIMER + +#include "wx/timer.h" + +#ifndef WX_PRECOMP + #include "wx/log.h" + #include "wx/module.h" +#endif + +// ---------------------------------------------------------------------------- +// Time input function +// ---------------------------------------------------------------------------- + +#ifdef __WXMGL__ + // We take advantage of wxMGL's _EVT_getTicks because it is faster + // (especially under MS-DOS!) and more precise than wxGetLocalTimeMillis + // if we are unlucky and the latter combines information from two sources. + #include "wx/mgl/private.h" + extern "C" ulong _EVT_getTicks(); + #define GetMillisecondsTime _EVT_getTicks + + typedef ulong wxTimerTick_t; + + #define wxTimerTickFmtSpec _T("lu") + #define wxTimerTickPrintfArg(tt) (tt) + + #ifdef __DOS__ + // Under DOS the MGL timer has a 24hr period, so consider the 12 hours + // before y to be 'less' and the the 12 hours after 'greater' modulo + // 24 hours. + inline bool wxTickGreaterEqual(wxTimerTick_t x, wxTimerTick_t y) + { + // _EVT_getTicks wraps at 1573040 * 55 + const wxTimerTick_t modulus = 1573040 * 55; + return (2 * modulus + x - y) % modulus < modulus / 2; + } + #else + // If wxTimerTick_t is 32-bits then it'll wrap in around 50 days. So + // let the 25 days before y be 'less' and 25 days after be 'greater'. + inline bool wxTickGreaterEqual(wxTimerTick_t x, wxTimerTick_t y) + { + // This code assumes wxTimerTick_t is an unsigned type. + // Set half_modulus with top bit set and the rest zeros. + const wxTimerTick_t half_modulus = ~((~(wxTimerTick_t)0) >> 1); + return x - y < half_modulus; + } + #endif +#else // !__WXMGL__ + #define GetMillisecondsTime wxGetLocalTimeMillis + + typedef wxLongLong wxTimerTick_t; + + #if wxUSE_LONGLONG_WX + #define wxTimerTickFmtSpec wxLongLongFmtSpec _T("d") + #define wxTimerTickPrintfArg(tt) (tt.GetValue()) + #else // using native wxLongLong + #define wxTimerTickFmtSpec _T("s") + #define wxTimerTickPrintfArg(tt) (tt.ToString().c_str()) + #endif // wx/native long long + + inline bool wxTickGreaterEqual(wxTimerTick_t x, wxTimerTick_t y) + { + return x >= y; + } +#endif // __WXMGL__/!__WXMGL__ + +// ---------------------------------------------------------------------------- +// helper structures and wxTimerScheduler +// ---------------------------------------------------------------------------- + +class wxTimerDesc +{ +public: + wxTimerDesc(wxTimer *t) : + timer(t), running(false), next(NULL), prev(NULL), + shotTime(0), deleteFlag(NULL) {} + + wxTimer *timer; + bool running; + wxTimerDesc *next, *prev; + wxTimerTick_t shotTime; + volatile bool *deleteFlag; // see comment in ~wxTimer +}; + +class wxTimerScheduler +{ +public: + wxTimerScheduler() : m_timers(NULL) {} + + void QueueTimer(wxTimerDesc *desc, wxTimerTick_t when = 0); + void RemoveTimer(wxTimerDesc *desc); + void NotifyTimers(); + +private: + wxTimerDesc *m_timers; +}; + +void wxTimerScheduler::QueueTimer(wxTimerDesc *desc, wxTimerTick_t when) +{ + if ( desc->running ) + return; // already scheduled + + if ( when == 0 ) + when = GetMillisecondsTime() + desc->timer->GetInterval(); + desc->shotTime = when; + desc->running = true; + + wxLogTrace( wxT("timer"), + wxT("queued timer %p at tick %") wxTimerTickFmtSpec, + desc->timer, wxTimerTickPrintfArg(when)); + + if ( m_timers ) + { + wxTimerDesc *d = m_timers; + while ( d->next && d->next->shotTime < when ) d = d->next; + desc->next = d->next; + desc->prev = d; + if ( d->next ) + d->next->prev = desc; + d->next = desc; + } + else + { + m_timers = desc; + desc->prev = desc->next = NULL; + } +} + +void wxTimerScheduler::RemoveTimer(wxTimerDesc *desc) +{ + desc->running = false; + if ( desc == m_timers ) + m_timers = desc->next; + if ( desc->prev ) + desc->prev->next = desc->next; + if ( desc->next ) + desc->next->prev = desc->prev; + desc->prev = desc->next = NULL; +} + +void wxTimerScheduler::NotifyTimers() +{ + if ( m_timers ) + { + bool oneShot; + volatile bool timerDeleted; + wxTimerTick_t now = GetMillisecondsTime(); + + for ( wxTimerDesc *desc = m_timers; desc; desc = desc->next ) + { + if ( desc->running && wxTickGreaterEqual(now, desc->shotTime) ) + { + oneShot = desc->timer->IsOneShot(); + RemoveTimer(desc); + + timerDeleted = false; + desc->deleteFlag = &timerDeleted; + desc->timer->Notify(); + + if ( !timerDeleted ) + { + wxLogTrace( wxT("timer"), + wxT("notified timer %p sheduled for %") + wxTimerTickFmtSpec, + desc->timer, + wxTimerTickPrintfArg(desc->shotTime) ); + + desc->deleteFlag = NULL; + if ( !oneShot ) + QueueTimer(desc, now + desc->timer->GetInterval()); + } + else + { + desc = m_timers; + if (!desc) + break; + } + } + } + } +} + + +// ---------------------------------------------------------------------------- +// wxTimer +// ---------------------------------------------------------------------------- + +IMPLEMENT_ABSTRACT_CLASS(wxTimer, wxEvtHandler) + +wxTimerScheduler *gs_scheduler = NULL; + +void wxTimer::Init() +{ + if ( !gs_scheduler ) + gs_scheduler = new wxTimerScheduler; + m_desc = new wxTimerDesc(this); +} + +wxTimer::~wxTimer() +{ + wxLogTrace( wxT("timer"), wxT("destroying timer %p..."), this); + if ( IsRunning() ) + Stop(); + + // NB: this is a hack: wxTimerScheduler must have some way of knowing + // that wxTimer object was deleted under its hands -- this may + // happen if somebody is really nasty and deletes the timer + // from wxTimer::Notify() + if ( m_desc->deleteFlag != NULL ) + *m_desc->deleteFlag = true; + + delete m_desc; + wxLogTrace( wxT("timer"), wxT(" ...done destroying timer %p..."), this); +} + +bool wxTimer::IsRunning() const +{ + return m_desc->running; +} + +bool wxTimer::Start(int millisecs, bool oneShot) +{ + wxLogTrace( wxT("timer"), wxT("started timer %p: %i ms, oneshot=%i"), + this, millisecs, oneShot); + + if ( !wxTimerBase::Start(millisecs, oneShot) ) + return false; + + gs_scheduler->QueueTimer(m_desc); + return true; +} + +void wxTimer::Stop() +{ + if ( !m_desc->running ) return; + + gs_scheduler->RemoveTimer(m_desc); +} + +/*static*/ void wxTimer::NotifyTimers() +{ + if ( gs_scheduler ) + gs_scheduler->NotifyTimers(); +} + + + +// A module to deallocate memory properly: +class wxTimerModule: public wxModule +{ +DECLARE_DYNAMIC_CLASS(wxTimerModule) +public: + wxTimerModule() {} + bool OnInit() { return true; } + void OnExit() { delete gs_scheduler; gs_scheduler = NULL; } +}; + +IMPLEMENT_DYNAMIC_CLASS(wxTimerModule, wxModule) + + +#endif //wxUSE_TIMER diff --git a/Externals/wxWidgets/src/generic/tipdlg.cpp b/Externals/wxWidgets/src/generic/tipdlg.cpp new file mode 100644 index 0000000000..2874d72871 --- /dev/null +++ b/Externals/wxWidgets/src/generic/tipdlg.cpp @@ -0,0 +1,345 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/generic/tipdlg.cpp +// Purpose: implementation of wxTipDialog +// Author: Vadim Zeitlin +// Modified by: +// Created: 28.06.99 +// RCS-ID: $Id: tipdlg.cpp 40703 2006-08-20 10:52:52Z VZ $ +// Copyright: (c) Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_STARTUP_TIPS + +#ifndef WX_PRECOMP + #include "wx/button.h" + #include "wx/checkbox.h" + #include "wx/statbox.h" + #include "wx/dialog.h" + #include "wx/icon.h" + #include "wx/intl.h" + #include "wx/textctrl.h" + #include "wx/statbmp.h" + #include "wx/stattext.h" + #include "wx/sizer.h" + #include "wx/settings.h" +#endif // WX_PRECOMP + +#include "wx/statline.h" +#include "wx/artprov.h" + +#include "wx/tipdlg.h" + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +static const int wxID_NEXT_TIP = 32000; // whatever + +// --------------------------------------------------------------------------- +// macros +// --------------------------------------------------------------------------- + +/* Macro for avoiding #ifdefs when value have to be different depending on size of + device we display on - take it from something like wxDesktopPolicy in the future + */ + +#if defined(__SMARTPHONE__) + #define wxLARGESMALL(large,small) small +#else + #define wxLARGESMALL(large,small) large +#endif + +// ---------------------------------------------------------------------------- +// private classes +// ---------------------------------------------------------------------------- + +// an implementation which takes the tips from the text file - each line +// represents a tip +class WXDLLIMPEXP_ADV wxFileTipProvider : public wxTipProvider +{ +public: + wxFileTipProvider(const wxString& filename, size_t currentTip); + + virtual wxString GetTip(); + +private: + wxTextFile m_textfile; + + DECLARE_NO_COPY_CLASS(wxFileTipProvider) +}; + +#ifdef __WIN32__ +// TODO an implementation which takes the tips from the given registry key +class WXDLLIMPEXP_ADV wxRegTipProvider : public wxTipProvider +{ +public: + wxRegTipProvider(const wxString& keyname); + + virtual wxString GetTip(); +}; + +// Empty implementation for now to keep the linker happy +wxString wxRegTipProvider::GetTip() +{ + return wxEmptyString; +} + +#endif // __WIN32__ + +// the dialog we show in wxShowTip() +class WXDLLIMPEXP_ADV wxTipDialog : public wxDialog +{ +public: + wxTipDialog(wxWindow *parent, + wxTipProvider *tipProvider, + bool showAtStartup); + + // the tip dialog has "Show tips on startup" checkbox - return true if it + // was checked (or wasn't unchecked) + bool ShowTipsOnStartup() const { return m_checkbox->GetValue(); } + + // sets the (next) tip text + void SetTipText() { m_text->SetValue(m_tipProvider->GetTip()); } + + // "Next" button handler + void OnNextTip(wxCommandEvent& WXUNUSED(event)) { SetTipText(); } + +private: + wxTipProvider *m_tipProvider; + + wxTextCtrl *m_text; + wxCheckBox *m_checkbox; + + DECLARE_EVENT_TABLE() + DECLARE_NO_COPY_CLASS(wxTipDialog) +}; + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxFileTipProvider +// ---------------------------------------------------------------------------- + +wxFileTipProvider::wxFileTipProvider(const wxString& filename, + size_t currentTip) + : wxTipProvider(currentTip), m_textfile(filename) +{ + m_textfile.Open(); +} + +wxString wxFileTipProvider::GetTip() +{ + size_t count = m_textfile.GetLineCount(); + if ( !count ) + { + return _("Tips not available, sorry!"); + } + + wxString tip; + + // Comments start with a # symbol. + // Loop reading lines until get the first one that isn't a comment. + // The max number of loop executions is the number of lines in the + // textfile so that can't go into an eternal loop in the [oddball] + // case of a comment-only tips file, or the developer has vetoed + // them all via PreprecessTip(). + for ( size_t i=0; i < count; i++ ) + { + // The current tip may be at the last line of the textfile, (or + // past it, if the number of lines in the textfile changed, such + // as changing to a different textfile, with less tips). So check + // to see at last line of text file, (or past it)... + if ( m_currentTip >= count ) + { + // .. and if so, wrap back to line 0. + m_currentTip = 0; + } + + // Read the tip, and increment the current tip counter. + tip = m_textfile.GetLine(m_currentTip++); + + // Allow a derived class's overrided virtual to modify the tip + // now if so desired. + tip = PreprocessTip(tip); + + // Break if tip isn't a comment, and isn't an empty string + // (or only stray space characters). + if ( !tip.StartsWith(wxT("#")) && (tip.Trim() != wxEmptyString) ) + { + break; + } + } + + // If tip starts with '_(', then it is a gettext string of format + // _("My \"global\" tip text") so first strip off the leading '_("'... + if ( tip.StartsWith(wxT("_(\"" ), &tip)) + { + //...and strip off the trailing '")'... + tip = tip.BeforeLast(wxT('\"')); + // ...and replace escaped quotes + tip.Replace(wxT("\\\""), wxT("\"")); + + // and translate it as requested + tip = wxGetTranslation(tip); + } + + return tip; +} + +// ---------------------------------------------------------------------------- +// wxTipDialog +// ---------------------------------------------------------------------------- + +BEGIN_EVENT_TABLE(wxTipDialog, wxDialog) + EVT_BUTTON(wxID_NEXT_TIP, wxTipDialog::OnNextTip) +END_EVENT_TABLE() + +wxTipDialog::wxTipDialog(wxWindow *parent, + wxTipProvider *tipProvider, + bool showAtStartup) + : wxDialog(parent, wxID_ANY, _("Tip of the Day"), + wxDefaultPosition, wxDefaultSize, + wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER + ) +{ + m_tipProvider = tipProvider; + bool isPda = (wxSystemSettings::GetScreenType() <= wxSYS_SCREEN_PDA); + + // 1) create all controls in tab order + + // smart phones does not support or do not waste space for wxButtons +#ifndef __SMARTPHONE__ + wxButton *btnClose = new wxButton(this, wxID_CLOSE); + SetAffirmativeId(wxID_CLOSE); +#endif + + m_checkbox = new wxCheckBox(this, wxID_ANY, _("&Show tips at startup")); + m_checkbox->SetValue(showAtStartup); + + // smart phones does not support or do not waste space for wxButtons +#ifndef __SMARTPHONE__ + wxButton *btnNext = new wxButton(this, wxID_NEXT_TIP, _("&Next Tip")); +#endif + + wxStaticText *text = new wxStaticText(this, wxID_ANY, _("Did you know...")); + + if (!isPda) + { + wxFont font = text->GetFont(); + font.SetPointSize(int(1.6 * font.GetPointSize())); + font.SetWeight(wxFONTWEIGHT_BOLD); + text->SetFont(font); + } + + m_text = new wxTextCtrl(this, wxID_ANY, wxEmptyString, + wxDefaultPosition, wxSize(200, 160), + wxTE_MULTILINE | + wxTE_READONLY | + wxTE_NO_VSCROLL | + wxTE_RICH2 | // a hack to get rid of vert scrollbar + wxDEFAULT_CONTROL_BORDER + ); +#if defined(__WXMSW__) + m_text->SetFont(wxFont(12, wxSWISS, wxNORMAL, wxNORMAL)); +#endif + +//#if defined(__WXPM__) + // + // The only way to get icons into an OS/2 static bitmap control + // +// wxBitmap vBitmap; + +// vBitmap.SetId(wxICON_TIP); // OS/2 specific bitmap method--OS/2 wxBitmaps all have an ID. +// // and for StatBmp's under OS/2 it MUST be a valid resource ID. +// +// wxStaticBitmap* bmp = new wxStaticBitmap(this, wxID_ANY, vBitmap); +// +//#else + + wxIcon icon = wxArtProvider::GetIcon(wxART_TIP, wxART_CMN_DIALOG); + wxStaticBitmap *bmp = new wxStaticBitmap(this, wxID_ANY, icon); + +//#endif + + // 2) put them in boxes + + wxBoxSizer *topsizer = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer *icon_text = new wxBoxSizer( wxHORIZONTAL ); + icon_text->Add( bmp, 0, wxCENTER ); + icon_text->Add( text, 1, wxCENTER | wxLEFT, wxLARGESMALL(20,0) ); + topsizer->Add( icon_text, 0, wxEXPAND | wxALL, wxLARGESMALL(10,0) ); + + topsizer->Add( m_text, 1, wxEXPAND | wxLEFT|wxRIGHT, wxLARGESMALL(10,0) ); + + wxBoxSizer *bottom = new wxBoxSizer( wxHORIZONTAL ); + if (isPda) + topsizer->Add( m_checkbox, 0, wxCENTER|wxTOP ); + else + bottom->Add( m_checkbox, 0, wxCENTER ); + + // smart phones does not support or do not waste space for wxButtons +#ifdef __SMARTPHONE__ + SetRightMenu(wxID_NEXT_TIP, _("Next")); + SetLeftMenu(wxID_CLOSE); +#else + if (!isPda) + bottom->Add( 10,10,1 ); + bottom->Add( btnNext, 0, wxCENTER | wxLEFT, wxLARGESMALL(10,0) ); + bottom->Add( btnClose, 0, wxCENTER | wxLEFT, wxLARGESMALL(10,0) ); +#endif + + if (isPda) + topsizer->Add( bottom, 0, wxCENTER | wxALL, 5 ); + else + topsizer->Add( bottom, 0, wxEXPAND | wxALL, wxLARGESMALL(10,0) ); + + SetTipText(); + + SetSizer( topsizer ); + + topsizer->SetSizeHints( this ); + topsizer->Fit( this ); + + Centre(wxBOTH | wxCENTER_FRAME); +} + +// ---------------------------------------------------------------------------- +// our public interface +// ---------------------------------------------------------------------------- + +wxTipProvider *wxCreateFileTipProvider(const wxString& filename, + size_t currentTip) +{ + return new wxFileTipProvider(filename, currentTip); +} + +bool wxShowTip(wxWindow *parent, + wxTipProvider *tipProvider, + bool showAtStartup) +{ + wxTipDialog dlg(parent, tipProvider, showAtStartup); + dlg.ShowModal(); + + return dlg.ShowTipsOnStartup(); +} + +#endif // wxUSE_STARTUP_TIPS diff --git a/Externals/wxWidgets/src/generic/tipwin.cpp b/Externals/wxWidgets/src/generic/tipwin.cpp new file mode 100644 index 0000000000..0f2f2bb184 --- /dev/null +++ b/Externals/wxWidgets/src/generic/tipwin.cpp @@ -0,0 +1,380 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/generic/tipwin.cpp +// Purpose: implementation of wxTipWindow +// Author: Vadim Zeitlin +// Modified by: +// Created: 10.09.00 +// RCS-ID: $Id: tipwin.cpp 43033 2006-11-04 13:31:10Z VZ $ +// Copyright: (c) 2000 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx/wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_TIPWINDOW + +#include "wx/tipwin.h" + +#ifndef WX_PRECOMP + #include "wx/dcclient.h" + #include "wx/timer.h" + #include "wx/settings.h" +#endif // WX_PRECOMP + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +static const wxCoord TEXT_MARGIN_X = 3; +static const wxCoord TEXT_MARGIN_Y = 3; + +// ---------------------------------------------------------------------------- +// wxTipWindowView +// ---------------------------------------------------------------------------- + +// Viewer window to put in the frame +class WXDLLEXPORT wxTipWindowView : public wxWindow +{ +public: + wxTipWindowView(wxWindow *parent); + + // event handlers + void OnPaint(wxPaintEvent& event); + void OnMouseClick(wxMouseEvent& event); + void OnMouseMove(wxMouseEvent& event); + +#if !wxUSE_POPUPWIN + void OnKillFocus(wxFocusEvent& event); +#endif // wxUSE_POPUPWIN + + // calculate the client rect we need to display the text + void Adjust(const wxString& text, wxCoord maxLength); + +private: + wxTipWindow* m_parent; + +#if !wxUSE_POPUPWIN + long m_creationTime; +#endif // !wxUSE_POPUPWIN + + DECLARE_EVENT_TABLE() + DECLARE_NO_COPY_CLASS(wxTipWindowView) +}; + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// event tables +// ---------------------------------------------------------------------------- + +BEGIN_EVENT_TABLE(wxTipWindow, wxTipWindowBase) + EVT_LEFT_DOWN(wxTipWindow::OnMouseClick) + EVT_RIGHT_DOWN(wxTipWindow::OnMouseClick) + EVT_MIDDLE_DOWN(wxTipWindow::OnMouseClick) + +#if !wxUSE_POPUPWIN + EVT_KILL_FOCUS(wxTipWindow::OnKillFocus) + EVT_ACTIVATE(wxTipWindow::OnActivate) +#endif // !wxUSE_POPUPWIN +END_EVENT_TABLE() + +BEGIN_EVENT_TABLE(wxTipWindowView, wxWindow) + EVT_PAINT(wxTipWindowView::OnPaint) + + EVT_LEFT_DOWN(wxTipWindowView::OnMouseClick) + EVT_RIGHT_DOWN(wxTipWindowView::OnMouseClick) + EVT_MIDDLE_DOWN(wxTipWindowView::OnMouseClick) + + EVT_MOTION(wxTipWindowView::OnMouseMove) + +#if !wxUSE_POPUPWIN + EVT_KILL_FOCUS(wxTipWindowView::OnKillFocus) +#endif // !wxUSE_POPUPWIN +END_EVENT_TABLE() + +// ---------------------------------------------------------------------------- +// wxTipWindow +// ---------------------------------------------------------------------------- + +wxTipWindow::wxTipWindow(wxWindow *parent, + const wxString& text, + wxCoord maxLength, + wxTipWindow** windowPtr, + wxRect *rectBounds) +#if wxUSE_POPUPWIN + : wxPopupTransientWindow(parent) +#else + : wxFrame(parent, wxID_ANY, wxEmptyString, + wxDefaultPosition, wxDefaultSize, + wxNO_BORDER | wxFRAME_NO_TASKBAR ) +#endif +{ + SetTipWindowPtr(windowPtr); + if ( rectBounds ) + { + SetBoundingRect(*rectBounds); + } + + // set colours + SetForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_INFOTEXT)); + SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_INFOBK)); + + // set size, position and show it + m_view = new wxTipWindowView(this); + m_view->Adjust(text, maxLength); + m_view->SetFocus(); + + int x, y; + wxGetMousePosition(&x, &y); + + // we want to show the tip below the mouse, not over it + // + // NB: the reason we use "/ 2" here is that we don't know where the current + // cursors hot spot is... it would be nice if we could find this out + // though + y += wxSystemSettings::GetMetric(wxSYS_CURSOR_Y) / 2; + +#if wxUSE_POPUPWIN + Position(wxPoint(x, y), wxSize(0,0)); + Popup(m_view); + #ifdef __WXGTK__ + m_view->CaptureMouse(); + #endif +#else + Move(x, y); + Show(true); +#endif +} + +wxTipWindow::~wxTipWindow() +{ + if ( m_windowPtr ) + { + *m_windowPtr = NULL; + } + #ifdef wxUSE_POPUPWIN + #ifdef __WXGTK__ + if ( m_view->HasCapture() ) + m_view->ReleaseMouse(); + #endif + #endif +} + +void wxTipWindow::OnMouseClick(wxMouseEvent& WXUNUSED(event)) +{ + Close(); +} + +#if wxUSE_POPUPWIN + +void wxTipWindow::OnDismiss() +{ + Close(); +} + +#else // !wxUSE_POPUPWIN + +void wxTipWindow::OnActivate(wxActivateEvent& event) +{ + if (!event.GetActive()) + Close(); +} + +void wxTipWindow::OnKillFocus(wxFocusEvent& WXUNUSED(event)) +{ + // Under Windows at least, we will get this immediately + // because when the view window is focussed, the + // tip window goes out of focus. +#ifdef __WXGTK__ + Close(); +#endif +} + +#endif // wxUSE_POPUPWIN // !wxUSE_POPUPWIN + +void wxTipWindow::SetBoundingRect(const wxRect& rectBound) +{ + m_rectBound = rectBound; +} + +void wxTipWindow::Close() +{ + if ( m_windowPtr ) + { + *m_windowPtr = NULL; + m_windowPtr = NULL; + } + +#if wxUSE_POPUPWIN + Show(false); + #ifdef __WXGTK__ + if ( m_view->HasCapture() ) + m_view->ReleaseMouse(); + #endif + Destroy(); +#else + wxFrame::Close(); +#endif +} + +// ---------------------------------------------------------------------------- +// wxTipWindowView +// ---------------------------------------------------------------------------- + +wxTipWindowView::wxTipWindowView(wxWindow *parent) + : wxWindow(parent, wxID_ANY, + wxDefaultPosition, wxDefaultSize, + wxNO_BORDER) +{ + // set colours + SetForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_INFOTEXT)); + SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_INFOBK)); + +#if !wxUSE_POPUPWIN + m_creationTime = wxGetLocalTime(); +#endif // !wxUSE_POPUPWIN + + m_parent = (wxTipWindow*)parent; +} + +void wxTipWindowView::Adjust(const wxString& text, wxCoord maxLength) +{ + wxClientDC dc(this); + dc.SetFont(GetFont()); + + // calculate the length: we want each line be no longer than maxLength + // pixels and we only break lines at words boundary + wxString current; + wxCoord height, width, + widthMax = 0; + m_parent->m_heightLine = 0; + + bool breakLine = false; + for ( const wxChar *p = text.c_str(); ; p++ ) + { + if ( *p == _T('\n') || *p == _T('\0') ) + { + dc.GetTextExtent(current, &width, &height); + if ( width > widthMax ) + widthMax = width; + + if ( height > m_parent->m_heightLine ) + m_parent->m_heightLine = height; + + m_parent->m_textLines.Add(current); + + if ( !*p ) + { + // end of text + break; + } + + current.clear(); + breakLine = false; + } + else if ( breakLine && (*p == _T(' ') || *p == _T('\t')) ) + { + // word boundary - break the line here + m_parent->m_textLines.Add(current); + current.clear(); + breakLine = false; + } + else // line goes on + { + current += *p; + dc.GetTextExtent(current, &width, &height); + if ( width > maxLength ) + breakLine = true; + + if ( width > widthMax ) + widthMax = width; + + if ( height > m_parent->m_heightLine ) + m_parent->m_heightLine = height; + } + } + + // take into account the border size and the margins + width = 2*(TEXT_MARGIN_X + 1) + widthMax; + height = 2*(TEXT_MARGIN_Y + 1) + wx_truncate_cast(wxCoord, m_parent->m_textLines.GetCount())*m_parent->m_heightLine; + m_parent->SetClientSize(width, height); + SetSize(0, 0, width, height); +} + +void wxTipWindowView::OnPaint(wxPaintEvent& WXUNUSED(event)) +{ + wxPaintDC dc(this); + + wxRect rect; + wxSize size = GetClientSize(); + rect.width = size.x; + rect.height = size.y; + + // first filll the background + dc.SetBrush(wxBrush(GetBackgroundColour(), wxSOLID)); + dc.SetPen( wxPen(GetForegroundColour(), 1, wxSOLID) ); + dc.DrawRectangle(rect); + + // and then draw the text line by line + dc.SetTextBackground(GetBackgroundColour()); + dc.SetTextForeground(GetForegroundColour()); + dc.SetFont(GetFont()); + + wxPoint pt; + pt.x = TEXT_MARGIN_X; + pt.y = TEXT_MARGIN_Y; + size_t count = m_parent->m_textLines.GetCount(); + for ( size_t n = 0; n < count; n++ ) + { + dc.DrawText(m_parent->m_textLines[n], pt); + + pt.y += m_parent->m_heightLine; + } +} + +void wxTipWindowView::OnMouseClick(wxMouseEvent& WXUNUSED(event)) +{ + m_parent->Close(); +} + +void wxTipWindowView::OnMouseMove(wxMouseEvent& event) +{ + const wxRect& rectBound = m_parent->m_rectBound; + + if ( rectBound.width && + !rectBound.Contains(ClientToScreen(event.GetPosition())) ) + { + // mouse left the bounding rect, disappear + m_parent->Close(); + } + else + { + event.Skip(); + } +} + +#if !wxUSE_POPUPWIN +void wxTipWindowView::OnKillFocus(wxFocusEvent& WXUNUSED(event)) +{ + // Workaround the kill focus event happening just after creation in wxGTK + if (wxGetLocalTime() > m_creationTime + 1) + m_parent->Close(); +} +#endif // !wxUSE_POPUPWIN + +#endif // wxUSE_TIPWINDOW diff --git a/Externals/wxWidgets/src/generic/toolbkg.cpp b/Externals/wxWidgets/src/generic/toolbkg.cpp new file mode 100644 index 0000000000..fa3bbdf97f --- /dev/null +++ b/Externals/wxWidgets/src/generic/toolbkg.cpp @@ -0,0 +1,442 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/generic/toolbkg.cpp +// Purpose: generic implementation of wxToolbook +// Author: Julian Smart +// Modified by: +// Created: 2006-01-29 +// RCS-ID: $Id: toolbkg.cpp 44271 2007-01-21 00:52:05Z VZ $ +// Copyright: (c) 2006 Julian Smart +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_TOOLBOOK + +#ifndef WX_PRECOMP + #include "wx/icon.h" + #include "wx/settings.h" + #include "wx/toolbar.h" +#endif + +#include "wx/imaglist.h" +#include "wx/sysopt.h" +#include "wx/toolbook.h" + +#if defined(__WXMAC__) && wxUSE_TOOLBAR && wxUSE_BMPBUTTON +#include "wx/generic/buttonbar.h" +#endif + +// ---------------------------------------------------------------------------- +// various wxWidgets macros +// ---------------------------------------------------------------------------- + +// check that the page index is valid +#define IS_VALID_PAGE(nPage) ((nPage) < GetPageCount()) + +// ---------------------------------------------------------------------------- +// event table +// ---------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxToolbook, wxBookCtrlBase) +IMPLEMENT_DYNAMIC_CLASS(wxToolbookEvent, wxNotifyEvent) + +#if !WXWIN_COMPATIBILITY_EVENT_TYPES +const wxEventType wxEVT_COMMAND_TOOLBOOK_PAGE_CHANGING = wxNewEventType(); +const wxEventType wxEVT_COMMAND_TOOLBOOK_PAGE_CHANGED = wxNewEventType(); +#endif + +BEGIN_EVENT_TABLE(wxToolbook, wxBookCtrlBase) + EVT_SIZE(wxToolbook::OnSize) + EVT_TOOL_RANGE(1, 50, wxToolbook::OnToolSelected) + EVT_IDLE(wxToolbook::OnIdle) +END_EVENT_TABLE() + +// ============================================================================ +// wxToolbook implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxToolbook creation +// ---------------------------------------------------------------------------- + +void wxToolbook::Init() +{ + m_selection = wxNOT_FOUND; + m_needsRealizing = false; +} + +bool wxToolbook::Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + long style, + const wxString& name) +{ + if ( (style & wxBK_ALIGN_MASK) == wxBK_DEFAULT ) + style |= wxBK_TOP; + + // no border for this control + style &= ~wxBORDER_MASK; + style |= wxBORDER_NONE; + + if ( !wxControl::Create(parent, id, pos, size, style, + wxDefaultValidator, name) ) + return false; + + int orient = wxTB_HORIZONTAL; + if ( (style & (wxBK_LEFT | wxBK_RIGHT)) != 0) + orient = wxTB_VERTICAL; + + // TODO: make more configurable + +#if defined(__WXMAC__) && wxUSE_TOOLBAR && wxUSE_BMPBUTTON + if (style & wxBK_BUTTONBAR) + { + m_bookctrl = new wxButtonToolBar + ( + this, + wxID_ANY, + wxDefaultPosition, + wxDefaultSize, + orient|wxTB_TEXT|wxTB_FLAT|wxNO_BORDER + ); + } + else +#endif + { + m_bookctrl = new wxToolBar + ( + this, + wxID_ANY, + wxDefaultPosition, + wxDefaultSize, + orient|wxTB_TEXT|wxTB_FLAT|wxTB_NODIVIDER|wxNO_BORDER + ); + } + + return true; +} + +// ---------------------------------------------------------------------------- +// wxToolbook geometry management +// ---------------------------------------------------------------------------- + +wxSize wxToolbook::GetControllerSize() const +{ + const wxSize sizeClient = GetClientSize(), + sizeBorder = m_bookctrl->GetSize() - m_bookctrl->GetClientSize(), + sizeToolBar = GetToolBar()->GetSize() + sizeBorder; + + wxSize size; + + if ( IsVertical() ) + { + size.x = sizeClient.x; + size.y = sizeToolBar.y; + } + else // left/right aligned + { + size.x = sizeToolBar.x; + size.y = sizeClient.y; + } + + return size; +} + +void wxToolbook::OnSize(wxSizeEvent& event) +{ + if (m_needsRealizing) + Realize(); + + wxBookCtrlBase::OnSize(event); +} + +wxSize wxToolbook::CalcSizeFromPage(const wxSize& sizePage) const +{ + // we need to add the size of the list control and the border between + const wxSize sizeToolBar = GetControllerSize(); + + wxSize size = sizePage; + if ( IsVertical() ) + { + size.y += sizeToolBar.y + GetInternalBorder(); + } + else // left/right aligned + { + size.x += sizeToolBar.x + GetInternalBorder(); + } + + return size; +} + +// ---------------------------------------------------------------------------- +// accessing the pages +// ---------------------------------------------------------------------------- + +bool wxToolbook::SetPageText(size_t n, const wxString& strText) +{ + // Assume tool ids start from 1 + wxToolBarToolBase* tool = GetToolBar()->FindById(n + 1); + if (tool) + { + tool->SetLabel(strText); + return true; + } + else + return false; +} + +wxString wxToolbook::GetPageText(size_t n) const +{ + wxToolBarToolBase* tool = GetToolBar()->FindById(n + 1); + if (tool) + return tool->GetLabel(); + else + return wxEmptyString; +} + +int wxToolbook::GetPageImage(size_t WXUNUSED(n)) const +{ + wxFAIL_MSG( _T("wxToolbook::GetPageImage() not implemented") ); + + return wxNOT_FOUND; +} + +bool wxToolbook::SetPageImage(size_t n, int imageId) +{ + wxASSERT( GetImageList() != NULL ); + if (!GetImageList()) + return false; + + wxToolBarToolBase* tool = GetToolBar()->FindById(n + 1); + if (tool) + { + // Find the image list index for this tool + wxBitmap bitmap = GetImageList()->GetBitmap(imageId); + tool->SetNormalBitmap(bitmap); + return true; + } + else + return false; +} + +// ---------------------------------------------------------------------------- +// image list stuff +// ---------------------------------------------------------------------------- + +void wxToolbook::SetImageList(wxImageList *imageList) +{ + wxBookCtrlBase::SetImageList(imageList); +} + +// ---------------------------------------------------------------------------- +// selection +// ---------------------------------------------------------------------------- + +int wxToolbook::GetSelection() const +{ + return m_selection; +} + +wxBookCtrlBaseEvent* wxToolbook::CreatePageChangingEvent() const +{ + return new wxToolbookEvent(wxEVT_COMMAND_TOOLBOOK_PAGE_CHANGING, m_windowId); +} + +void wxToolbook::MakeChangedEvent(wxBookCtrlBaseEvent &event) +{ + event.SetEventType(wxEVT_COMMAND_TOOLBOOK_PAGE_CHANGED); +} + +void wxToolbook::UpdateSelectedPage(size_t newsel) +{ + m_selection = newsel; + GetToolBar()->ToggleTool(newsel + 1, true); +} + +// Not part of the wxBookctrl API, but must be called in OnIdle or +// by application to realize the toolbar and select the initial page. +void wxToolbook::Realize() +{ + if (m_needsRealizing) + { + GetToolBar()->SetToolBitmapSize(m_maxBitmapSize); + + int remap = wxSystemOptions::GetOptionInt(wxT("msw.remap")); + wxSystemOptions::SetOption(wxT("msw.remap"), 0); + GetToolBar()->Realize(); + wxSystemOptions::SetOption(wxT("msw.remap"), remap); + } + + m_needsRealizing = false; + + if (m_selection == -1) + m_selection = 0; + + if (GetPageCount() > 0) + { + int sel = m_selection; + m_selection = -1; + SetSelection(sel); + } + + DoSize(); +} + +int wxToolbook::HitTest(const wxPoint& pt, long *flags) const +{ + int pagePos = wxNOT_FOUND; + + if ( flags ) + *flags = wxBK_HITTEST_NOWHERE; + + // convert from wxToolbook coordinates to wxToolBar ones + const wxToolBarBase * const tbar = GetToolBar(); + const wxPoint tbarPt = tbar->ScreenToClient(ClientToScreen(pt)); + + // is the point over the toolbar? + if ( wxRect(tbar->GetSize()).Contains(tbarPt) ) + { + const wxToolBarToolBase * const + tool = tbar->FindToolForPosition(tbarPt.x, tbarPt.y); + + if ( tool ) + { + pagePos = tbar->GetToolPos(tool->GetId()); + if ( flags ) + *flags = wxBK_HITTEST_ONICON | wxBK_HITTEST_ONLABEL; + } + } + else // not over the toolbar + { + if ( flags && GetPageRect().Contains(pt) ) + *flags |= wxBK_HITTEST_ONPAGE; + } + + return pagePos; +} + +void wxToolbook::OnIdle(wxIdleEvent& event) +{ + if (m_needsRealizing) + Realize(); + event.Skip(); +} + +// ---------------------------------------------------------------------------- +// adding/removing the pages +// ---------------------------------------------------------------------------- + +bool wxToolbook::InsertPage(size_t n, + wxWindow *page, + const wxString& text, + bool bSelect, + int imageId) +{ + if ( !wxBookCtrlBase::InsertPage(n, page, text, bSelect, imageId) ) + return false; + + m_needsRealizing = true; + + wxASSERT(GetImageList() != NULL); + + if (!GetImageList()) + return false; + + // TODO: make sure all platforms can convert between icon and bitmap, + // and/or test whether the image is a bitmap or an icon. +#ifdef __WXMAC__ + wxBitmap bitmap = GetImageList()->GetBitmap(imageId); +#else + // On Windows, we can lose information by using GetBitmap, so extract icon instead + wxIcon icon = GetImageList()->GetIcon(imageId); + wxBitmap bitmap; + bitmap.CopyFromIcon(icon); +#endif + + m_maxBitmapSize.x = wxMax(bitmap.GetWidth(), m_maxBitmapSize.x); + m_maxBitmapSize.y = wxMax(bitmap.GetHeight(), m_maxBitmapSize.y); + + GetToolBar()->SetToolBitmapSize(m_maxBitmapSize); + GetToolBar()->AddRadioTool(n + 1, text, bitmap, wxNullBitmap, text); + + if (bSelect) + { + GetToolBar()->ToggleTool(n, true); + m_selection = n; + } + else + page->Hide(); + + InvalidateBestSize(); + return true; +} + +wxWindow *wxToolbook::DoRemovePage(size_t page) +{ + const size_t page_count = GetPageCount(); + wxWindow *win = wxBookCtrlBase::DoRemovePage(page); + + if ( win ) + { + GetToolBar()->DeleteTool(page + 1); + + if (m_selection >= (int)page) + { + // force new sel valid if possible + int sel = m_selection - 1; + if (page_count == 1) + sel = wxNOT_FOUND; + else if ((page_count == 2) || (sel == -1)) + sel = 0; + + // force sel invalid if deleting current page - don't try to hide it + m_selection = (m_selection == (int)page) ? wxNOT_FOUND : m_selection - 1; + + if ((sel != wxNOT_FOUND) && (sel != m_selection)) + SetSelection(sel); + } + } + + return win; +} + + +bool wxToolbook::DeleteAllPages() +{ + GetToolBar()->ClearTools(); + return wxBookCtrlBase::DeleteAllPages(); +} + +// ---------------------------------------------------------------------------- +// wxToolbook events +// ---------------------------------------------------------------------------- + +void wxToolbook::OnToolSelected(wxCommandEvent& event) +{ + const int selNew = event.GetId() - 1; + + if ( selNew == m_selection ) + { + // this event can only come from our own Select(m_selection) below + // which we call when the page change is vetoed, so we should simply + // ignore it + return; + } + + SetSelection(selNew); + + // change wasn't allowed, return to previous state + if (m_selection != selNew) + { + GetToolBar()->ToggleTool(m_selection, false); + } +} + +#endif // wxUSE_TOOLBOOK diff --git a/Externals/wxWidgets/src/generic/treebkg.cpp b/Externals/wxWidgets/src/generic/treebkg.cpp new file mode 100644 index 0000000000..a1c59ed03d --- /dev/null +++ b/Externals/wxWidgets/src/generic/treebkg.cpp @@ -0,0 +1,791 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/generic/treebkg.cpp +// Purpose: generic implementation of wxTreebook +// Author: Evgeniy Tarassov, Vadim Zeitlin +// Modified by: +// Created: 2005-09-15 +// RCS-ID: $Id: treebkg.cpp 44271 2007-01-21 00:52:05Z VZ $ +// Copyright: (c) 2005 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_TREEBOOK + +#include "wx/treebook.h" + +#ifndef WX_PRECOMP + #include "wx/settings.h" +#endif + +#include "wx/imaglist.h" + +// ---------------------------------------------------------------------------- +// various wxWidgets macros +// ---------------------------------------------------------------------------- + +// check that the page index is valid +#define IS_VALID_PAGE(nPage) ((nPage) < DoInternalGetPageCount()) + +// ---------------------------------------------------------------------------- +// event table +// ---------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxTreebook, wxBookCtrlBase) +IMPLEMENT_DYNAMIC_CLASS(wxTreebookEvent, wxNotifyEvent) + +#if !WXWIN_COMPATIBILITY_EVENT_TYPES +const wxEventType wxEVT_COMMAND_TREEBOOK_PAGE_CHANGING = wxNewEventType(); +const wxEventType wxEVT_COMMAND_TREEBOOK_PAGE_CHANGED = wxNewEventType(); +const wxEventType wxEVT_COMMAND_TREEBOOK_NODE_COLLAPSED = wxNewEventType(); +const wxEventType wxEVT_COMMAND_TREEBOOK_NODE_EXPANDED = wxNewEventType(); +#endif + +BEGIN_EVENT_TABLE(wxTreebook, wxBookCtrlBase) + EVT_TREE_SEL_CHANGED (wxID_ANY, wxTreebook::OnTreeSelectionChange) + EVT_TREE_ITEM_EXPANDED (wxID_ANY, wxTreebook::OnTreeNodeExpandedCollapsed) + EVT_TREE_ITEM_COLLAPSED(wxID_ANY, wxTreebook::OnTreeNodeExpandedCollapsed) + + WX_EVENT_TABLE_CONTROL_CONTAINER(wxTreebook) +END_EVENT_TABLE() + +// ============================================================================ +// wxTreebook implementation +// ============================================================================ + +WX_DELEGATE_TO_CONTROL_CONTAINER(wxTreebook, wxControl) + +// ---------------------------------------------------------------------------- +// wxTreebook creation +// ---------------------------------------------------------------------------- + +void wxTreebook::Init() +{ + m_container.SetContainerWindow(this); + + m_selection = + m_actualSelection = wxNOT_FOUND; +} + +bool +wxTreebook::Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + long style, + const wxString& name) +{ + // Check the style flag to have either wxTBK_RIGHT or wxTBK_LEFT + if ( (style & wxBK_ALIGN_MASK) == wxBK_DEFAULT ) + { + style |= wxBK_LEFT; + } + style |= wxTAB_TRAVERSAL; + + // no border for this control, it doesn't look nice together with the tree + style &= ~wxBORDER_MASK; + style |= wxBORDER_NONE; + + if ( !wxControl::Create(parent, id, pos, size, + style, wxDefaultValidator, name) ) + return false; + + m_bookctrl = new wxTreeCtrl + ( + this, + wxID_ANY, + wxDefaultPosition, + wxDefaultSize, +#ifndef __WXMSW__ + wxBORDER_SIMPLE | // On wxMSW this produces a black border which is wrong +#endif + wxTR_DEFAULT_STYLE | + wxTR_HIDE_ROOT | + wxTR_SINGLE + ); + GetTreeCtrl()->SetQuickBestSize(false); // do full size calculation + GetTreeCtrl()->AddRoot(wxEmptyString); // label doesn't matter, it's hidden + +#ifdef __WXMSW__ + // We need to add dummy size event to force possible scrollbar hiding + wxSizeEvent evt; + GetEventHandler()->AddPendingEvent(evt); +#endif + + return true; +} + + +// insert a new page just before the pagePos +bool wxTreebook::InsertPage(size_t pagePos, + wxWindow *page, + const wxString& text, + bool bSelect, + int imageId) +{ + return DoInsertPage(pagePos, page, text, bSelect, imageId); +} + +bool wxTreebook::InsertSubPage(size_t pagePos, + wxWindow *page, + const wxString& text, + bool bSelect, + int imageId) +{ + return DoInsertSubPage(pagePos, page, text, bSelect, imageId); +} + +bool wxTreebook::AddPage(wxWindow *page, const wxString& text, bool bSelect, + int imageId) +{ + return DoInsertPage(m_treeIds.GetCount(), page, text, bSelect, imageId); +} + +// insertion time is linear to the number of top-pages +bool wxTreebook::AddSubPage(wxWindow *page, const wxString& text, bool bSelect, int imageId) +{ + return DoAddSubPage(page, text, bSelect, imageId); +} + + +bool wxTreebook::DoInsertPage(size_t pagePos, + wxWindow *page, + const wxString& text, + bool bSelect, + int imageId) +{ + wxCHECK_MSG( pagePos <= DoInternalGetPageCount(), false, + wxT("Invalid treebook page position") ); + + if ( !wxBookCtrlBase::InsertPage(pagePos, page, text, bSelect, imageId) ) + return false; + + wxTreeCtrl *tree = GetTreeCtrl(); + wxTreeItemId newId; + if ( pagePos == DoInternalGetPageCount() ) + { + // append the page to the end + wxTreeItemId rootId = tree->GetRootItem(); + + newId = tree->AppendItem(rootId, text, imageId); + } + else // insert the new page before the given one + { + wxTreeItemId nodeId = m_treeIds[pagePos]; + + wxTreeItemId previousId = tree->GetPrevSibling(nodeId); + wxTreeItemId parentId = tree->GetItemParent(nodeId); + + if ( previousId.IsOk() ) + { + // insert before the sibling - previousId + newId = tree->InsertItem(parentId, previousId, text, imageId); + } + else // no prev siblings -- insert as a first child + { + wxASSERT_MSG( parentId.IsOk(), wxT( "Tree has no root node?" ) ); + + newId = tree->PrependItem(parentId, text, imageId); + } + } + + if ( !newId.IsOk() ) + { + //something wrong -> cleaning and returning with false + (void)wxBookCtrlBase::DoRemovePage(pagePos); + + wxFAIL_MSG( wxT("Failed to insert treebook page") ); + return false; + } + + DoInternalAddPage(pagePos, page, newId); + + DoUpdateSelection(bSelect, pagePos); + + return true; +} + +bool wxTreebook::DoAddSubPage(wxWindow *page, const wxString& text, bool bSelect, int imageId) +{ + wxTreeCtrl *tree = GetTreeCtrl(); + + wxTreeItemId rootId = tree->GetRootItem(); + + wxTreeItemId lastNodeId = tree->GetLastChild(rootId); + + wxCHECK_MSG( lastNodeId.IsOk(), false, + _T("Can't insert sub page when there are no pages") ); + + // now calculate its position (should we save/update it too?) + size_t newPos = tree->GetCount() - + (tree->GetChildrenCount(lastNodeId, true) + 1); + + return DoInsertSubPage(newPos, page, text, bSelect, imageId); +} + +bool wxTreebook::DoInsertSubPage(size_t pagePos, + wxTreebookPage *page, + const wxString& text, + bool bSelect, + int imageId) +{ + wxTreeItemId parentId = DoInternalGetPage(pagePos); + wxCHECK_MSG( parentId.IsOk(), false, wxT("invalid tree item") ); + + wxTreeCtrl *tree = GetTreeCtrl(); + + size_t newPos = pagePos + tree->GetChildrenCount(parentId, true) + 1; + wxASSERT_MSG( newPos <= DoInternalGetPageCount(), + wxT("Internal error in tree insert point calculation") ); + + if ( !wxBookCtrlBase::InsertPage(newPos, page, text, bSelect, imageId) ) + return false; + + wxTreeItemId newId = tree->AppendItem(parentId, text, imageId); + + if ( !newId.IsOk() ) + { + (void)wxBookCtrlBase::DoRemovePage(newPos); + + wxFAIL_MSG( wxT("Failed to insert treebook page") ); + return false; + } + + DoInternalAddPage(newPos, page, newId); + + DoUpdateSelection(bSelect, newPos); + + return true; +} + +bool wxTreebook::DeletePage(size_t pagePos) +{ + wxCHECK_MSG( IS_VALID_PAGE(pagePos), false, wxT("Invalid tree index") ); + + wxTreebookPage *oldPage = DoRemovePage(pagePos); + if ( !oldPage ) + return false; + + delete oldPage; + + return true; +} + +wxTreebookPage *wxTreebook::DoRemovePage(size_t pagePos) +{ + wxTreeItemId pageId = DoInternalGetPage(pagePos); + wxCHECK_MSG( pageId.IsOk(), NULL, wxT("Invalid tree index") ); + + wxTreebookPage * oldPage = GetPage(pagePos); + wxTreeCtrl *tree = GetTreeCtrl(); + + size_t subCount = tree->GetChildrenCount(pageId, true); + wxASSERT_MSG ( IS_VALID_PAGE(pagePos + subCount), + wxT("Internal error in wxTreebook::DoRemovePage") ); + + // here we are going to delete ALL the pages in the range + // [pagePos, pagePos + subCount] -- the page and its children + + // deleting all the pages from the base class + for ( size_t i = 0; i <= subCount; ++i ) + { + wxTreebookPage *page = wxBookCtrlBase::DoRemovePage(pagePos); + + // don't delete the page itself though -- it will be deleted in + // DeletePage() when we return + if ( i ) + { + delete page; + } + } + + DoInternalRemovePageRange(pagePos, subCount); + + tree->DeleteChildren( pageId ); + tree->Delete( pageId ); + + return oldPage; +} + +bool wxTreebook::DeleteAllPages() +{ + wxBookCtrlBase::DeleteAllPages(); + m_treeIds.Clear(); + m_selection = + m_actualSelection = wxNOT_FOUND; + + wxTreeCtrl *tree = GetTreeCtrl(); + tree->DeleteChildren(tree->GetRootItem()); + + return true; +} + +void wxTreebook::DoInternalAddPage(size_t newPos, + wxTreebookPage *page, + wxTreeItemId pageId) +{ + wxASSERT_MSG( newPos <= m_treeIds.GetCount(), wxT("Ivalid index passed to wxTreebook::DoInternalAddPage") ); + + // hide newly inserted page initially (it will be shown when selected) + if ( page ) + page->Hide(); + + if ( newPos == m_treeIds.GetCount() ) + { + // append + m_treeIds.Add(pageId); + } + else // insert + { + m_treeIds.Insert(pageId, newPos); + + if ( m_selection != wxNOT_FOUND && newPos <= (size_t)m_selection ) + { + // selection has been moved one unit toward the end + ++m_selection; + if ( m_actualSelection != wxNOT_FOUND ) + ++m_actualSelection; + } + else if ( m_actualSelection != wxNOT_FOUND && + newPos <= (size_t)m_actualSelection ) + { + DoSetSelection(m_selection); + } + } +} + +void wxTreebook::DoInternalRemovePageRange(size_t pagePos, size_t subCount) +{ + // Attention: this function is only for a situation when we delete a node + // with all its children so pagePos is the node's index and subCount is the + // node children count + wxASSERT_MSG( pagePos + subCount < m_treeIds.GetCount(), + wxT("Ivalid page index") ); + + wxTreeItemId pageId = m_treeIds[pagePos]; + + m_treeIds.RemoveAt(pagePos, subCount + 1); + + if ( m_selection != wxNOT_FOUND ) + { + if ( (size_t)m_selection > pagePos + subCount) + { + // selection is far after the deleted page, so just update the index and move on + m_selection -= 1 + subCount; + if ( m_actualSelection != wxNOT_FOUND) + { + m_actualSelection -= subCount + 1; + } + } + else if ( (size_t)m_selection >= pagePos ) + { + wxTreeCtrl *tree = GetTreeCtrl(); + + // as selected page is going to be deleted, try to select the next + // sibling if exists, if not then the parent + wxTreeItemId nodeId = tree->GetNextSibling(pageId); + + m_selection = wxNOT_FOUND; + m_actualSelection = wxNOT_FOUND; + + if ( nodeId.IsOk() ) + { + // selecting next siblings + tree->SelectItem(nodeId); + } + else // no next sibling, select the parent + { + wxTreeItemId parentId = tree->GetItemParent(pageId); + + if ( parentId.IsOk() && parentId != tree->GetRootItem() ) + { + tree->SelectItem(parentId); + } + else // parent is root + { + // we can't select it as it's hidden + DoUpdateSelection(false, wxNOT_FOUND); + } + } + } + else if ( m_actualSelection != wxNOT_FOUND && + (size_t)m_actualSelection >= pagePos ) + { + // nothing to do -- selection is before the deleted node, but + // actually shown page (the first (sub)child with page != NULL) is + // already deleted + m_actualSelection = m_selection; + + // send event as documented + DoSetSelection(m_selection, SetSelection_SendEvent); + } + //else: nothing to do -- selection is before the deleted node + } + else + { + DoUpdateSelection(false, wxNOT_FOUND); + } +} + + +void wxTreebook::DoUpdateSelection(bool bSelect, int newPos) +{ + int newSelPos; + if ( bSelect ) + { + newSelPos = newPos; + } + else if ( m_selection == wxNOT_FOUND && DoInternalGetPageCount() > 0 ) + { + newSelPos = 0; + } + else + { + newSelPos = wxNOT_FOUND; + } + + if ( newSelPos != wxNOT_FOUND ) + { + SetSelection((size_t)newSelPos); + } +} + +wxTreeItemId wxTreebook::DoInternalGetPage(size_t pagePos) const +{ + if ( pagePos >= m_treeIds.GetCount() ) + { + // invalid position but ok here, in this internal function, don't assert + // (the caller will do it) + return wxTreeItemId(); + } + + return m_treeIds[pagePos]; +} + +int wxTreebook::DoInternalFindPageById(wxTreeItemId pageId) const +{ + const size_t count = m_treeIds.GetCount(); + for ( size_t i = 0; i < count; ++i ) + { + if ( m_treeIds[i] == pageId ) + return i; + } + + return wxNOT_FOUND; +} + +bool wxTreebook::IsNodeExpanded(size_t pagePos) const +{ + wxTreeItemId pageId = DoInternalGetPage(pagePos); + + wxCHECK_MSG( pageId.IsOk(), false, wxT("invalid tree item") ); + + return GetTreeCtrl()->IsExpanded(pageId); +} + +bool wxTreebook::ExpandNode(size_t pagePos, bool expand) +{ + wxTreeItemId pageId = DoInternalGetPage(pagePos); + + wxCHECK_MSG( pageId.IsOk(), false, wxT("invalid tree item") ); + + if ( expand ) + { + GetTreeCtrl()->Expand( pageId ); + } + else // collapse + { + GetTreeCtrl()->Collapse( pageId ); + + // rely on the events generated by wxTreeCtrl to update selection + } + + return true; +} + +int wxTreebook::GetPageParent(size_t pagePos) const +{ + wxTreeItemId nodeId = DoInternalGetPage( pagePos ); + wxCHECK_MSG( nodeId.IsOk(), wxNOT_FOUND, wxT("Invalid page index spacified!") ); + + const wxTreeItemId parent = GetTreeCtrl()->GetItemParent( nodeId ); + + return parent.IsOk() ? DoInternalFindPageById(parent) : wxNOT_FOUND; +} + +bool wxTreebook::SetPageText(size_t n, const wxString& strText) +{ + wxTreeItemId pageId = DoInternalGetPage(n); + + wxCHECK_MSG( pageId.IsOk(), false, wxT("invalid tree item") ); + + GetTreeCtrl()->SetItemText(pageId, strText); + + return true; +} + +wxString wxTreebook::GetPageText(size_t n) const +{ + wxTreeItemId pageId = DoInternalGetPage(n); + + wxCHECK_MSG( pageId.IsOk(), wxString(), wxT("invalid tree item") ); + + return GetTreeCtrl()->GetItemText(pageId); +} + +int wxTreebook::GetPageImage(size_t n) const +{ + wxTreeItemId pageId = DoInternalGetPage(n); + + wxCHECK_MSG( pageId.IsOk(), wxNOT_FOUND, wxT("invalid tree item") ); + + return GetTreeCtrl()->GetItemImage(pageId); +} + +bool wxTreebook::SetPageImage(size_t n, int imageId) +{ + wxTreeItemId pageId = DoInternalGetPage(n); + + wxCHECK_MSG( pageId.IsOk(), false, wxT("invalid tree item") ); + + GetTreeCtrl()->SetItemImage(pageId, imageId); + + return true; +} + +wxSize wxTreebook::CalcSizeFromPage(const wxSize& sizePage) const +{ + const wxSize sizeTree = GetControllerSize(); + + wxSize size = sizePage; + size.x += sizeTree.x; + + return size; +} + +int wxTreebook::GetSelection() const +{ + return m_selection; +} + +int wxTreebook::DoSetSelection(size_t pagePos, int flags) +{ + wxCHECK_MSG( IS_VALID_PAGE(pagePos), wxNOT_FOUND, + wxT("invalid page index in wxListbook::DoSetSelection()") ); + wxASSERT_MSG( GetPageCount() == DoInternalGetPageCount(), + wxT("wxTreebook logic error: m_treeIds and m_pages not in sync!")); + + wxTreebookEvent event(wxEVT_COMMAND_TREEBOOK_PAGE_CHANGING, m_windowId); + const int oldSel = m_selection; + wxTreeCtrl *tree = GetTreeCtrl(); + bool allowed = false; + + if (flags & SetSelection_SendEvent) + { + event.SetEventObject(this); + event.SetSelection(pagePos); + event.SetOldSelection(m_selection); + + // don't send the event if the old and new pages are the same; do send it + // otherwise and be prepared for it to be vetoed + allowed = (int)pagePos == m_selection || + !GetEventHandler()->ProcessEvent(event) || + event.IsAllowed(); + } + + if ( !(flags & SetSelection_SendEvent) || allowed ) + { + // hide the previously shown page + wxTreebookPage * const oldPage = DoGetCurrentPage(); + if ( oldPage ) + oldPage->Hide(); + + // then show the new one + m_selection = pagePos; + wxTreebookPage *page = wxBookCtrlBase::GetPage(m_selection); + if ( !page ) + { + // find the next page suitable to be shown: the first (grand)child + // of this one with a non-NULL associated page + wxTreeItemId childId = m_treeIds[pagePos]; + int actualPagePos = pagePos; + while ( !page && childId.IsOk() ) + { + wxTreeItemIdValue cookie; + childId = tree->GetFirstChild( childId, cookie ); + if ( childId.IsOk() ) + { + page = wxBookCtrlBase::GetPage(++actualPagePos); + } + } + + m_actualSelection = page ? actualPagePos : m_selection; + } + + if ( page ) + page->Show(); + + tree->SelectItem(DoInternalGetPage(pagePos)); + + if (flags & SetSelection_SendEvent) + { + // notify about the (now completed) page change + event.SetEventType(wxEVT_COMMAND_TREEBOOK_PAGE_CHANGED); + (void)GetEventHandler()->ProcessEvent(event); + } + } + else if ( (flags & SetSelection_SendEvent) && !allowed) // page change vetoed + { + // tree selection might have already had changed + if ( oldSel != wxNOT_FOUND ) + tree->SelectItem(DoInternalGetPage(oldSel)); + } + + return oldSel; +} + +wxTreebookPage *wxTreebook::DoGetCurrentPage() const +{ + if ( m_selection == wxNOT_FOUND ) + return NULL; + + wxTreebookPage *page = wxBookCtrlBase::GetPage(m_selection); + if ( !page && m_actualSelection != wxNOT_FOUND ) + { + page = wxBookCtrlBase::GetPage(m_actualSelection); + } + + return page; +} + +void wxTreebook::SetImageList(wxImageList *imageList) +{ + wxBookCtrlBase::SetImageList(imageList); + GetTreeCtrl()->SetImageList(imageList); +} + +void wxTreebook::AssignImageList(wxImageList *imageList) +{ + wxBookCtrlBase::AssignImageList(imageList); + GetTreeCtrl()->SetImageList(imageList); +} + +// ---------------------------------------------------------------------------- +// event handlers +// ---------------------------------------------------------------------------- + +void wxTreebook::OnTreeSelectionChange(wxTreeEvent& event) +{ + if ( event.GetEventObject() != m_bookctrl ) + { + event.Skip(); + return; + } + + wxTreeItemId newId = event.GetItem(); + + if ( (m_selection == wxNOT_FOUND && + (!newId.IsOk() || newId == GetTreeCtrl()->GetRootItem())) || + (m_selection != wxNOT_FOUND && newId == m_treeIds[m_selection]) ) + { + // this event can only come when we modify the tree selection ourselves + // so we should simply ignore it + return; + } + + int newPos = DoInternalFindPageById(newId); + + if ( newPos != wxNOT_FOUND ) + SetSelection( newPos ); +} + +void wxTreebook::OnTreeNodeExpandedCollapsed(wxTreeEvent & event) +{ + if ( event.GetEventObject() != m_bookctrl ) + { + event.Skip(); + return; + } + + wxTreeItemId nodeId = event.GetItem(); + if ( !nodeId.IsOk() || nodeId == GetTreeCtrl()->GetRootItem() ) + return; + int pagePos = DoInternalFindPageById(nodeId); + wxCHECK_RET( pagePos != wxNOT_FOUND, wxT("Internal problem in wxTreebook!..") ); + + wxTreebookEvent ev(GetTreeCtrl()->IsExpanded(nodeId) + ? wxEVT_COMMAND_TREEBOOK_NODE_EXPANDED + : wxEVT_COMMAND_TREEBOOK_NODE_COLLAPSED, + m_windowId); + + ev.SetSelection(pagePos); + ev.SetOldSelection(pagePos); + ev.SetEventObject(this); + + GetEventHandler()->ProcessEvent(ev); +} + +// ---------------------------------------------------------------------------- +// wxTreebook geometry management +// ---------------------------------------------------------------------------- + +int wxTreebook::HitTest(wxPoint const & pt, long * flags) const +{ + int pagePos = wxNOT_FOUND; + + if ( flags ) + *flags = wxBK_HITTEST_NOWHERE; + + // convert from wxTreebook coorindates to wxTreeCtrl ones + const wxTreeCtrl * const tree = GetTreeCtrl(); + const wxPoint treePt = tree->ScreenToClient(ClientToScreen(pt)); + + // is it over the tree? + if ( wxRect(tree->GetSize()).Contains(treePt) ) + { + int flagsTree; + wxTreeItemId id = tree->HitTest(treePt, flagsTree); + + if ( id.IsOk() && (flagsTree & wxTREE_HITTEST_ONITEM) ) + { + pagePos = DoInternalFindPageById(id); + } + + if ( flags ) + { + if ( pagePos != wxNOT_FOUND ) + *flags = 0; + + if ( flagsTree & (wxTREE_HITTEST_ONITEMBUTTON | + wxTREE_HITTEST_ONITEMICON | + wxTREE_HITTEST_ONITEMSTATEICON) ) + *flags |= wxBK_HITTEST_ONICON; + + if ( flagsTree & wxTREE_HITTEST_ONITEMLABEL ) + *flags |= wxBK_HITTEST_ONLABEL; + } + } + else // not over the tree + { + if ( flags && GetPageRect().Contains( pt ) ) + *flags |= wxBK_HITTEST_ONPAGE; + } + + return pagePos; +} + +#endif // wxUSE_TREEBOOK diff --git a/Externals/wxWidgets/src/generic/treectlg.cpp b/Externals/wxWidgets/src/generic/treectlg.cpp new file mode 100644 index 0000000000..afcbcd3f61 --- /dev/null +++ b/Externals/wxWidgets/src/generic/treectlg.cpp @@ -0,0 +1,3696 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/generic/treectlg.cpp +// Purpose: generic tree control implementation +// Author: Robert Roebling +// Created: 01/02/97 +// Modified: 22/10/98 - almost total rewrite, simpler interface (VZ) +// Id: $Id: treectlg.cpp 47614 2007-07-21 11:41:34Z VZ $ +// Copyright: (c) 1998 Robert Roebling and Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================= +// declarations +// ============================================================================= + +// ----------------------------------------------------------------------------- +// headers +// ----------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_TREECTRL + +#include "wx/treectrl.h" + +#ifndef WX_PRECOMP + #include "wx/dcclient.h" + #include "wx/timer.h" + #include "wx/settings.h" + #include "wx/listbox.h" + #include "wx/textctrl.h" +#endif + +#include "wx/generic/treectlg.h" +#include "wx/imaglist.h" + +#include "wx/renderer.h" + +#ifdef __WXMAC__ + #include "wx/mac/private.h" +#endif + +// ----------------------------------------------------------------------------- +// array types +// ----------------------------------------------------------------------------- + +class WXDLLEXPORT wxGenericTreeItem; + +WX_DEFINE_EXPORTED_ARRAY_PTR(wxGenericTreeItem *, wxArrayGenericTreeItems); + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +static const int NO_IMAGE = -1; + +static const int PIXELS_PER_UNIT = 10; + +// the margin between the item image and the item text +static const int MARGIN_BETWEEN_IMAGE_AND_TEXT = 4; + +// ----------------------------------------------------------------------------- +// private classes +// ----------------------------------------------------------------------------- + +// timer used for enabling in-place edit +class WXDLLEXPORT wxTreeRenameTimer: public wxTimer +{ +public: + // start editing the current item after half a second (if the mouse hasn't + // been clicked/moved) + enum { DELAY = 250 }; + + wxTreeRenameTimer( wxGenericTreeCtrl *owner ); + + virtual void Notify(); + +private: + wxGenericTreeCtrl *m_owner; + + DECLARE_NO_COPY_CLASS(wxTreeRenameTimer) +}; + +// control used for in-place edit +class WXDLLEXPORT wxTreeTextCtrl: public wxTextCtrl +{ +public: + wxTreeTextCtrl(wxGenericTreeCtrl *owner, wxGenericTreeItem *item); + + void EndEdit(bool discardChanges = false) + { + if ( discardChanges ) + { + StopEditing(); + } + else + { + m_aboutToFinish = true; + + // Notify the owner about the changes + AcceptChanges(); + + // Even if vetoed, close the control (consistent with MSW) + Finish(); + } + } + + void StopEditing() + { + Finish(); + m_owner->OnRenameCancelled(m_itemEdited); + } + const wxGenericTreeItem* item() const { return m_itemEdited; } + +protected: + void OnChar( wxKeyEvent &event ); + void OnKeyUp( wxKeyEvent &event ); + void OnKillFocus( wxFocusEvent &event ); + + bool AcceptChanges(); + void Finish(); + +private: + wxGenericTreeCtrl *m_owner; + wxGenericTreeItem *m_itemEdited; + wxString m_startValue; + bool m_finished; + bool m_aboutToFinish; + + DECLARE_EVENT_TABLE() + DECLARE_NO_COPY_CLASS(wxTreeTextCtrl) +}; + +// timer used to clear wxGenericTreeCtrl::m_findPrefix if no key was pressed +// for a sufficiently long time +class WXDLLEXPORT wxTreeFindTimer : public wxTimer +{ +public: + // reset the current prefix after half a second of inactivity + enum { DELAY = 500 }; + + wxTreeFindTimer( wxGenericTreeCtrl *owner ) { m_owner = owner; } + + virtual void Notify() { m_owner->m_findPrefix.clear(); } + +private: + wxGenericTreeCtrl *m_owner; + + DECLARE_NO_COPY_CLASS(wxTreeFindTimer) +}; + +// a tree item +class WXDLLEXPORT wxGenericTreeItem +{ +public: + // ctors & dtor + wxGenericTreeItem() { m_data = NULL; } + wxGenericTreeItem( wxGenericTreeItem *parent, + const wxString& text, + int image, + int selImage, + wxTreeItemData *data ); + + ~wxGenericTreeItem(); + + // trivial accessors + wxArrayGenericTreeItems& GetChildren() { return m_children; } + + const wxString& GetText() const { return m_text; } + int GetImage(wxTreeItemIcon which = wxTreeItemIcon_Normal) const + { return m_images[which]; } + wxTreeItemData *GetData() const { return m_data; } + + // returns the current image for the item (depending on its + // selected/expanded/whatever state) + int GetCurrentImage() const; + + void SetText( const wxString &text ); + void SetImage(int image, wxTreeItemIcon which) { m_images[which] = image; } + void SetData(wxTreeItemData *data) { m_data = data; } + + void SetHasPlus(bool has = true) { m_hasPlus = has; } + + void SetBold(bool bold) { m_isBold = bold; } + + int GetX() const { return m_x; } + int GetY() const { return m_y; } + + void SetX(int x) { m_x = x; } + void SetY(int y) { m_y = y; } + + int GetHeight() const { return m_height; } + int GetWidth() const { return m_width; } + + void SetHeight(int h) { m_height = h; } + void SetWidth(int w) { m_width = w; } + + wxGenericTreeItem *GetParent() const { return m_parent; } + + // operations + + // deletes all children notifying the treectrl about it + void DeleteChildren(wxGenericTreeCtrl *tree); + + // get count of all children (and grand children if 'recursively') + size_t GetChildrenCount(bool recursively = true) const; + + void Insert(wxGenericTreeItem *child, size_t index) + { m_children.Insert(child, index); } + + void GetSize( int &x, int &y, const wxGenericTreeCtrl* ); + + // return the item at given position (or NULL if no item), onButton is + // true if the point belongs to the item's button, otherwise it lies + // on the item's label + wxGenericTreeItem *HitTest( const wxPoint& point, + const wxGenericTreeCtrl *, + int &flags, + int level ); + + void Expand() { m_isCollapsed = false; } + void Collapse() { m_isCollapsed = true; } + + void SetHilight( bool set = true ) { m_hasHilight = set; } + + // status inquiries + bool HasChildren() const { return !m_children.IsEmpty(); } + bool IsSelected() const { return m_hasHilight != 0; } + bool IsExpanded() const { return !m_isCollapsed; } + bool HasPlus() const { return m_hasPlus || HasChildren(); } + bool IsBold() const { return m_isBold != 0; } + + // attributes + // get them - may be NULL + wxTreeItemAttr *GetAttributes() const { return m_attr; } + // get them ensuring that the pointer is not NULL + wxTreeItemAttr& Attr() + { + if ( !m_attr ) + { + m_attr = new wxTreeItemAttr; + m_ownsAttr = true; + } + return *m_attr; + } + // set them + void SetAttributes(wxTreeItemAttr *attr) + { + if ( m_ownsAttr ) delete m_attr; + m_attr = attr; + m_ownsAttr = false; + } + // set them and delete when done + void AssignAttributes(wxTreeItemAttr *attr) + { + SetAttributes(attr); + m_ownsAttr = true; + } + +private: + // since there can be very many of these, we save size by chosing + // the smallest representation for the elements and by ordering + // the members to avoid padding. + wxString m_text; // label to be rendered for item + + wxTreeItemData *m_data; // user-provided data + + wxArrayGenericTreeItems m_children; // list of children + wxGenericTreeItem *m_parent; // parent of this item + + wxTreeItemAttr *m_attr; // attributes??? + + // tree ctrl images for the normal, selected, expanded and + // expanded+selected states + int m_images[wxTreeItemIcon_Max]; + + wxCoord m_x; // (virtual) offset from top + wxCoord m_y; // (virtual) offset from left + int m_width; // width of this item + int m_height; // height of this item + + // use bitfields to save size + unsigned int m_isCollapsed :1; + unsigned int m_hasHilight :1; // same as focused + unsigned int m_hasPlus :1; // used for item which doesn't have + // children but has a [+] button + unsigned int m_isBold :1; // render the label in bold font + unsigned int m_ownsAttr :1; // delete attribute when done + + DECLARE_NO_COPY_CLASS(wxGenericTreeItem) +}; + +// ============================================================================= +// implementation +// ============================================================================= + +// ---------------------------------------------------------------------------- +// private functions +// ---------------------------------------------------------------------------- + +// translate the key or mouse event flags to the type of selection we're +// dealing with +static void EventFlagsToSelType(long style, + bool shiftDown, + bool ctrlDown, + bool &is_multiple, + bool &extended_select, + bool &unselect_others) +{ + is_multiple = (style & wxTR_MULTIPLE) != 0; + extended_select = shiftDown && is_multiple; + unselect_others = !(extended_select || (ctrlDown && is_multiple)); +} + +// check if the given item is under another one +static bool IsDescendantOf(const wxGenericTreeItem *parent, const wxGenericTreeItem *item) +{ + while ( item ) + { + if ( item == parent ) + { + // item is a descendant of parent + return true; + } + + item = item->GetParent(); + } + + return false; +} + +// ----------------------------------------------------------------------------- +// wxTreeRenameTimer (internal) +// ----------------------------------------------------------------------------- + +wxTreeRenameTimer::wxTreeRenameTimer( wxGenericTreeCtrl *owner ) +{ + m_owner = owner; +} + +void wxTreeRenameTimer::Notify() +{ + m_owner->OnRenameTimer(); +} + +//----------------------------------------------------------------------------- +// wxTreeTextCtrl (internal) +//----------------------------------------------------------------------------- + +BEGIN_EVENT_TABLE(wxTreeTextCtrl,wxTextCtrl) + EVT_CHAR (wxTreeTextCtrl::OnChar) + EVT_KEY_UP (wxTreeTextCtrl::OnKeyUp) + EVT_KILL_FOCUS (wxTreeTextCtrl::OnKillFocus) +END_EVENT_TABLE() + +wxTreeTextCtrl::wxTreeTextCtrl(wxGenericTreeCtrl *owner, + wxGenericTreeItem *item) + : m_itemEdited(item), m_startValue(item->GetText()) +{ + m_owner = owner; + m_finished = false; + m_aboutToFinish = false; + + int w = m_itemEdited->GetWidth(), + h = m_itemEdited->GetHeight(); + + int x, y; + m_owner->CalcScrolledPosition(item->GetX(), item->GetY(), &x, &y); + + int image_h = 0, + image_w = 0; + + int image = item->GetCurrentImage(); + if ( image != NO_IMAGE ) + { + if ( m_owner->m_imageListNormal ) + { + m_owner->m_imageListNormal->GetSize( image, image_w, image_h ); + image_w += MARGIN_BETWEEN_IMAGE_AND_TEXT; + } + else + { + wxFAIL_MSG(_T("you must create an image list to use images!")); + } + } + + // FIXME: what are all these hardcoded 4, 8 and 11s really? + x += image_w; + w -= image_w + 4; +#ifdef __WXMAC__ + wxSize bs = DoGetBestSize() ; + // edit control height + if ( h > bs.y - 8 ) + { + int diff = h - ( bs.y - 8 ) ; + h -= diff ; + y += diff / 2 ; + } +#endif + + (void)Create(m_owner, wxID_ANY, m_startValue, + wxPoint(x - 4, y - 4), wxSize(w + 11, h + 8)); +} + +bool wxTreeTextCtrl::AcceptChanges() +{ + const wxString value = GetValue(); + + if ( value == m_startValue ) + { + // nothing changed, always accept + // when an item remains unchanged, the owner + // needs to be notified that the user decided + // not to change the tree item label, and that + // the edit has been cancelled + + m_owner->OnRenameCancelled(m_itemEdited); + return true; + } + + if ( !m_owner->OnRenameAccept(m_itemEdited, value) ) + { + // vetoed by the user + return false; + } + + // accepted, do rename the item + m_owner->SetItemText(m_itemEdited, value); + + return true; +} + +void wxTreeTextCtrl::Finish() +{ + if ( !m_finished ) + { + m_owner->ResetTextControl(); + + wxPendingDelete.Append(this); + + m_finished = true; + + m_owner->SetFocus(); + } +} + +void wxTreeTextCtrl::OnChar( wxKeyEvent &event ) +{ + switch ( event.m_keyCode ) + { + case WXK_RETURN: + EndEdit(); + break; + + case WXK_ESCAPE: + StopEditing(); + break; + + default: + event.Skip(); + } +} + +void wxTreeTextCtrl::OnKeyUp( wxKeyEvent &event ) +{ + if ( !m_finished ) + { + // auto-grow the textctrl: + wxSize parentSize = m_owner->GetSize(); + wxPoint myPos = GetPosition(); + wxSize mySize = GetSize(); + int sx, sy; + GetTextExtent(GetValue() + _T("M"), &sx, &sy); + if (myPos.x + sx > parentSize.x) + sx = parentSize.x - myPos.x; + if (mySize.x > sx) + sx = mySize.x; + SetSize(sx, wxDefaultCoord); + } + + event.Skip(); +} + +void wxTreeTextCtrl::OnKillFocus( wxFocusEvent &event ) +{ + if ( !m_finished && !m_aboutToFinish ) + { + // We must finish regardless of success, otherwise we'll get + // focus problems: + Finish(); + + if ( !AcceptChanges() ) + m_owner->OnRenameCancelled( m_itemEdited ); + } + + // We must let the native text control handle focus, too, otherwise + // it could have problems with the cursor (e.g., in wxGTK). + event.Skip(); +} + +// ----------------------------------------------------------------------------- +// wxGenericTreeItem +// ----------------------------------------------------------------------------- + +wxGenericTreeItem::wxGenericTreeItem(wxGenericTreeItem *parent, + const wxString& text, + int image, int selImage, + wxTreeItemData *data) + : m_text(text) +{ + m_images[wxTreeItemIcon_Normal] = image; + m_images[wxTreeItemIcon_Selected] = selImage; + m_images[wxTreeItemIcon_Expanded] = NO_IMAGE; + m_images[wxTreeItemIcon_SelectedExpanded] = NO_IMAGE; + + m_data = data; + m_x = m_y = 0; + + m_isCollapsed = true; + m_hasHilight = false; + m_hasPlus = false; + m_isBold = false; + + m_parent = parent; + + m_attr = (wxTreeItemAttr *)NULL; + m_ownsAttr = false; + + // We don't know the height here yet. + m_width = 0; + m_height = 0; +} + +wxGenericTreeItem::~wxGenericTreeItem() +{ + delete m_data; + + if (m_ownsAttr) delete m_attr; + + wxASSERT_MSG( m_children.IsEmpty(), + wxT("please call DeleteChildren() before deleting the item") ); +} + +void wxGenericTreeItem::DeleteChildren(wxGenericTreeCtrl *tree) +{ + size_t count = m_children.Count(); + for ( size_t n = 0; n < count; n++ ) + { + wxGenericTreeItem *child = m_children[n]; + tree->SendDeleteEvent(child); + + child->DeleteChildren(tree); + if ( child == tree->m_select_me ) + tree->m_select_me = NULL; + delete child; + } + + m_children.Empty(); +} + +void wxGenericTreeItem::SetText( const wxString &text ) +{ + m_text = text; +} + +size_t wxGenericTreeItem::GetChildrenCount(bool recursively) const +{ + size_t count = m_children.Count(); + if ( !recursively ) + return count; + + size_t total = count; + for (size_t n = 0; n < count; ++n) + { + total += m_children[n]->GetChildrenCount(); + } + + return total; +} + +void wxGenericTreeItem::GetSize( int &x, int &y, + const wxGenericTreeCtrl *theButton ) +{ + int bottomY=m_y+theButton->GetLineHeight(this); + if ( y < bottomY ) y = bottomY; + int width = m_x + m_width; + if ( x < width ) x = width; + + if (IsExpanded()) + { + size_t count = m_children.Count(); + for ( size_t n = 0; n < count; ++n ) + { + m_children[n]->GetSize( x, y, theButton ); + } + } +} + +wxGenericTreeItem *wxGenericTreeItem::HitTest(const wxPoint& point, + const wxGenericTreeCtrl *theCtrl, + int &flags, + int level) +{ + // for a hidden root node, don't evaluate it, but do evaluate children + if ( !(level == 0 && theCtrl->HasFlag(wxTR_HIDE_ROOT)) ) + { + // evaluate the item + int h = theCtrl->GetLineHeight(this); + if ((point.y > m_y) && (point.y < m_y + h)) + { + int y_mid = m_y + h/2; + if (point.y < y_mid ) + flags |= wxTREE_HITTEST_ONITEMUPPERPART; + else + flags |= wxTREE_HITTEST_ONITEMLOWERPART; + + int xCross = m_x - theCtrl->GetSpacing(); +#ifdef __WXMAC__ + // according to the drawing code the triangels are drawn + // at -4 , -4 from the position up to +10/+10 max + if ((point.x > xCross-4) && (point.x < xCross+10) && + (point.y > y_mid-4) && (point.y < y_mid+10) && + HasPlus() && theCtrl->HasButtons() ) +#else + // 5 is the size of the plus sign + if ((point.x > xCross-6) && (point.x < xCross+6) && + (point.y > y_mid-6) && (point.y < y_mid+6) && + HasPlus() && theCtrl->HasButtons() ) +#endif + { + flags |= wxTREE_HITTEST_ONITEMBUTTON; + return this; + } + + if ((point.x >= m_x) && (point.x <= m_x+m_width)) + { + int image_w = -1; + int image_h; + + // assuming every image (normal and selected) has the same size! + if ( (GetImage() != NO_IMAGE) && theCtrl->m_imageListNormal ) + theCtrl->m_imageListNormal->GetSize(GetImage(), + image_w, image_h); + + if ((image_w != -1) && (point.x <= m_x + image_w + 1)) + flags |= wxTREE_HITTEST_ONITEMICON; + else + flags |= wxTREE_HITTEST_ONITEMLABEL; + + return this; + } + + if (point.x < m_x) + flags |= wxTREE_HITTEST_ONITEMINDENT; + if (point.x > m_x+m_width) + flags |= wxTREE_HITTEST_ONITEMRIGHT; + + return this; + } + + // if children are expanded, fall through to evaluate them + if (m_isCollapsed) return (wxGenericTreeItem*) NULL; + } + + // evaluate children + size_t count = m_children.Count(); + for ( size_t n = 0; n < count; n++ ) + { + wxGenericTreeItem *res = m_children[n]->HitTest( point, + theCtrl, + flags, + level + 1 ); + if ( res != NULL ) + return res; + } + + return (wxGenericTreeItem*) NULL; +} + +int wxGenericTreeItem::GetCurrentImage() const +{ + int image = NO_IMAGE; + if ( IsExpanded() ) + { + if ( IsSelected() ) + { + image = GetImage(wxTreeItemIcon_SelectedExpanded); + } + + if ( image == NO_IMAGE ) + { + // we usually fall back to the normal item, but try just the + // expanded one (and not selected) first in this case + image = GetImage(wxTreeItemIcon_Expanded); + } + } + else // not expanded + { + if ( IsSelected() ) + image = GetImage(wxTreeItemIcon_Selected); + } + + // maybe it doesn't have the specific image we want, + // try the default one instead + if ( image == NO_IMAGE ) image = GetImage(); + + return image; +} + +// ----------------------------------------------------------------------------- +// wxGenericTreeCtrl implementation +// ----------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxGenericTreeCtrl, wxControl) + +BEGIN_EVENT_TABLE(wxGenericTreeCtrl, wxTreeCtrlBase) + EVT_PAINT (wxGenericTreeCtrl::OnPaint) + EVT_SIZE (wxGenericTreeCtrl::OnSize) + EVT_MOUSE_EVENTS (wxGenericTreeCtrl::OnMouse) + EVT_CHAR (wxGenericTreeCtrl::OnChar) + EVT_SET_FOCUS (wxGenericTreeCtrl::OnSetFocus) + EVT_KILL_FOCUS (wxGenericTreeCtrl::OnKillFocus) + EVT_TREE_ITEM_GETTOOLTIP(wxID_ANY, wxGenericTreeCtrl::OnGetToolTip) +END_EVENT_TABLE() + +#if !defined(__WXMSW__) || defined(__WXUNIVERSAL__) +/* + * wxTreeCtrl has to be a real class or we have problems with + * the run-time information. + */ + +IMPLEMENT_DYNAMIC_CLASS(wxTreeCtrl, wxGenericTreeCtrl) +#endif + +// ----------------------------------------------------------------------------- +// construction/destruction +// ----------------------------------------------------------------------------- + +void wxGenericTreeCtrl::Init() +{ + m_current = + m_key_current = + m_anchor = + m_select_me = (wxGenericTreeItem *) NULL; + m_hasFocus = false; + m_dirty = false; + + m_lineHeight = 10; + m_indent = 15; + m_spacing = 18; + + m_hilightBrush = new wxBrush + ( + wxSystemSettings::GetColour + ( + wxSYS_COLOUR_HIGHLIGHT + ), + wxSOLID + ); + + m_hilightUnfocusedBrush = new wxBrush + ( + wxSystemSettings::GetColour + ( + wxSYS_COLOUR_BTNSHADOW + ), + wxSOLID + ); + + m_imageListButtons = NULL; + m_ownsImageListButtons = false; + + m_dragCount = 0; + m_isDragging = false; + m_dropTarget = m_oldSelection = NULL; + m_underMouse = NULL; + m_textCtrl = NULL; + + m_renameTimer = NULL; + m_freezeCount = 0; + + m_findTimer = NULL; + + m_dropEffectAboveItem = false; + + m_lastOnSame = false; + +#ifdef __WXMAC_CARBON__ + m_normalFont.MacCreateThemeFont( kThemeViewsFont ) ; +#else + m_normalFont = wxSystemSettings::GetFont( wxSYS_DEFAULT_GUI_FONT ); +#endif + m_boldFont = wxFont(m_normalFont.GetPointSize(), + m_normalFont.GetFamily(), + m_normalFont.GetStyle(), + wxBOLD, + m_normalFont.GetUnderlined(), + m_normalFont.GetFaceName(), + m_normalFont.GetEncoding()); +} + +bool wxGenericTreeCtrl::Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + long style, + const wxValidator& validator, + const wxString& name ) +{ +#ifdef __WXMAC__ + int major,minor; + wxGetOsVersion( &major, &minor ); + + style &= ~wxTR_LINES_AT_ROOT; + style |= wxTR_NO_LINES; + if (major < 10) + style |= wxTR_ROW_LINES; + + if (style == 0 || style & wxTR_DEFAULT_STYLE) + style |= wxTR_FULL_ROW_HIGHLIGHT; + +#endif // __WXMAC__ +#ifdef __WXGTK20__ + style |= wxTR_NO_LINES; +#endif + + if ( !wxControl::Create( parent, id, pos, size, + style|wxHSCROLL|wxVSCROLL, + validator, + name ) ) + return false; + + // If the tree display has no buttons, but does have + // connecting lines, we can use a narrower layout. + // It may not be a good idea to force this... + if (!HasButtons() && !HasFlag(wxTR_NO_LINES)) + { + m_indent= 10; + m_spacing = 10; + } + + wxVisualAttributes attr = GetDefaultAttributes(); + SetOwnForegroundColour( attr.colFg ); + SetOwnBackgroundColour( attr.colBg ); + if (!m_hasFont) + SetOwnFont(attr.font); + + m_dottedPen = wxPen( wxT("grey"), 0, 0 ); + + SetInitialSize(size); + + return true; +} + +wxGenericTreeCtrl::~wxGenericTreeCtrl() +{ + delete m_hilightBrush; + delete m_hilightUnfocusedBrush; + + DeleteAllItems(); + + delete m_renameTimer; + delete m_findTimer; + + if (m_ownsImageListButtons) + delete m_imageListButtons; +} + +// ----------------------------------------------------------------------------- +// accessors +// ----------------------------------------------------------------------------- + +unsigned int wxGenericTreeCtrl::GetCount() const +{ + if ( !m_anchor ) + { + // the tree is empty + return 0; + } + + unsigned int count = m_anchor->GetChildrenCount(); + if ( !HasFlag(wxTR_HIDE_ROOT) ) + { + // take the root itself into account + count++; + } + + return count; +} + +void wxGenericTreeCtrl::SetIndent(unsigned int indent) +{ + m_indent = (unsigned short) indent; + m_dirty = true; +} + +size_t +wxGenericTreeCtrl::GetChildrenCount(const wxTreeItemId& item, + bool recursively) const +{ + wxCHECK_MSG( item.IsOk(), 0u, wxT("invalid tree item") ); + + return ((wxGenericTreeItem*) item.m_pItem)->GetChildrenCount(recursively); +} + +void wxGenericTreeCtrl::SetWindowStyle(const long styles) +{ + // Do not try to expand the root node if it hasn't been created yet + if (m_anchor && !HasFlag(wxTR_HIDE_ROOT) && (styles & wxTR_HIDE_ROOT)) + { + // if we will hide the root, make sure children are visible + m_anchor->SetHasPlus(); + m_anchor->Expand(); + CalculatePositions(); + } + + // right now, just sets the styles. Eventually, we may + // want to update the inherited styles, but right now + // none of the parents has updatable styles + m_windowStyle = styles; + m_dirty = true; +} + +// ----------------------------------------------------------------------------- +// functions to work with tree items +// ----------------------------------------------------------------------------- + +wxString wxGenericTreeCtrl::GetItemText(const wxTreeItemId& item) const +{ + wxCHECK_MSG( item.IsOk(), wxEmptyString, wxT("invalid tree item") ); + + return ((wxGenericTreeItem*) item.m_pItem)->GetText(); +} + +int wxGenericTreeCtrl::GetItemImage(const wxTreeItemId& item, + wxTreeItemIcon which) const +{ + wxCHECK_MSG( item.IsOk(), -1, wxT("invalid tree item") ); + + return ((wxGenericTreeItem*) item.m_pItem)->GetImage(which); +} + +wxTreeItemData *wxGenericTreeCtrl::GetItemData(const wxTreeItemId& item) const +{ + wxCHECK_MSG( item.IsOk(), NULL, wxT("invalid tree item") ); + + return ((wxGenericTreeItem*) item.m_pItem)->GetData(); +} + +wxColour wxGenericTreeCtrl::GetItemTextColour(const wxTreeItemId& item) const +{ + wxCHECK_MSG( item.IsOk(), wxNullColour, wxT("invalid tree item") ); + + wxGenericTreeItem *pItem = (wxGenericTreeItem*) item.m_pItem; + return pItem->Attr().GetTextColour(); +} + +wxColour wxGenericTreeCtrl::GetItemBackgroundColour(const wxTreeItemId& item) const +{ + wxCHECK_MSG( item.IsOk(), wxNullColour, wxT("invalid tree item") ); + + wxGenericTreeItem *pItem = (wxGenericTreeItem*) item.m_pItem; + return pItem->Attr().GetBackgroundColour(); +} + +wxFont wxGenericTreeCtrl::GetItemFont(const wxTreeItemId& item) const +{ + wxCHECK_MSG( item.IsOk(), wxNullFont, wxT("invalid tree item") ); + + wxGenericTreeItem *pItem = (wxGenericTreeItem*) item.m_pItem; + return pItem->Attr().GetFont(); +} + +void wxGenericTreeCtrl::SetItemText(const wxTreeItemId& item, const wxString& text) +{ + wxCHECK_RET( item.IsOk(), wxT("invalid tree item") ); + + wxClientDC dc(this); + wxGenericTreeItem *pItem = (wxGenericTreeItem*) item.m_pItem; + pItem->SetText(text); + CalculateSize(pItem, dc); + RefreshLine(pItem); +} + +void wxGenericTreeCtrl::SetItemImage(const wxTreeItemId& item, + int image, + wxTreeItemIcon which) +{ + wxCHECK_RET( item.IsOk(), wxT("invalid tree item") ); + + wxGenericTreeItem *pItem = (wxGenericTreeItem*) item.m_pItem; + pItem->SetImage(image, which); + + wxClientDC dc(this); + CalculateSize(pItem, dc); + RefreshLine(pItem); +} + +void wxGenericTreeCtrl::SetItemData(const wxTreeItemId& item, wxTreeItemData *data) +{ + wxCHECK_RET( item.IsOk(), wxT("invalid tree item") ); + + if (data) + data->SetId( item ); + + ((wxGenericTreeItem*) item.m_pItem)->SetData(data); +} + +void wxGenericTreeCtrl::SetItemHasChildren(const wxTreeItemId& item, bool has) +{ + wxCHECK_RET( item.IsOk(), wxT("invalid tree item") ); + + wxGenericTreeItem *pItem = (wxGenericTreeItem*) item.m_pItem; + pItem->SetHasPlus(has); + RefreshLine(pItem); +} + +void wxGenericTreeCtrl::SetItemBold(const wxTreeItemId& item, bool bold) +{ + wxCHECK_RET( item.IsOk(), wxT("invalid tree item") ); + + // avoid redrawing the tree if no real change + wxGenericTreeItem *pItem = (wxGenericTreeItem*) item.m_pItem; + if ( pItem->IsBold() != bold ) + { + pItem->SetBold(bold); + + // recalculate the item size as bold and non bold fonts have different + // widths + wxClientDC dc(this); + CalculateSize(pItem, dc); + + RefreshLine(pItem); + } +} + +void wxGenericTreeCtrl::SetItemDropHighlight(const wxTreeItemId& item, + bool highlight) +{ + wxCHECK_RET( item.IsOk(), wxT("invalid tree item") ); + + wxColour fg, bg; + + if (highlight) + { + bg = wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHT); + fg = wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT); + } + + wxGenericTreeItem *pItem = (wxGenericTreeItem*) item.m_pItem; + pItem->Attr().SetTextColour(fg); + pItem->Attr().SetBackgroundColour(bg); + RefreshLine(pItem); +} + +void wxGenericTreeCtrl::SetItemTextColour(const wxTreeItemId& item, + const wxColour& col) +{ + wxCHECK_RET( item.IsOk(), wxT("invalid tree item") ); + + wxGenericTreeItem *pItem = (wxGenericTreeItem*) item.m_pItem; + pItem->Attr().SetTextColour(col); + RefreshLine(pItem); +} + +void wxGenericTreeCtrl::SetItemBackgroundColour(const wxTreeItemId& item, + const wxColour& col) +{ + wxCHECK_RET( item.IsOk(), wxT("invalid tree item") ); + + wxGenericTreeItem *pItem = (wxGenericTreeItem*) item.m_pItem; + pItem->Attr().SetBackgroundColour(col); + RefreshLine(pItem); +} + +void wxGenericTreeCtrl::SetItemFont(const wxTreeItemId& item, const wxFont& font) +{ + wxCHECK_RET( item.IsOk(), wxT("invalid tree item") ); + + wxGenericTreeItem *pItem = (wxGenericTreeItem*) item.m_pItem; + pItem->Attr().SetFont(font); + RefreshLine(pItem); +} + +bool wxGenericTreeCtrl::SetFont( const wxFont &font ) +{ + wxTreeCtrlBase::SetFont(font); + + m_normalFont = font ; + m_boldFont = wxFont(m_normalFont.GetPointSize(), + m_normalFont.GetFamily(), + m_normalFont.GetStyle(), + wxBOLD, + m_normalFont.GetUnderlined(), + m_normalFont.GetFaceName(), + m_normalFont.GetEncoding()); + + return true; +} + + +// ----------------------------------------------------------------------------- +// item status inquiries +// ----------------------------------------------------------------------------- + +bool wxGenericTreeCtrl::IsVisible(const wxTreeItemId& item) const +{ + wxCHECK_MSG( item.IsOk(), false, wxT("invalid tree item") ); + + // An item is only visible if it's not a descendant of a collapsed item + wxGenericTreeItem *pItem = (wxGenericTreeItem*) item.m_pItem; + wxGenericTreeItem* parent = pItem->GetParent(); + while (parent) + { + if (!parent->IsExpanded()) + return false; + parent = parent->GetParent(); + } + + int startX, startY; + GetViewStart(& startX, & startY); + + wxSize clientSize = GetClientSize(); + + wxRect rect; + if (!GetBoundingRect(item, rect)) + return false; + if (rect.GetWidth() == 0 || rect.GetHeight() == 0) + return false; + if (rect.GetBottom() < 0 || rect.GetTop() > clientSize.y) + return false; + if (rect.GetRight() < 0 || rect.GetLeft() > clientSize.x) + return false; + + return true; +} + +bool wxGenericTreeCtrl::ItemHasChildren(const wxTreeItemId& item) const +{ + wxCHECK_MSG( item.IsOk(), false, wxT("invalid tree item") ); + + // consider that the item does have children if it has the "+" button: it + // might not have them (if it had never been expanded yet) but then it + // could have them as well and it's better to err on this side rather than + // disabling some operations which are restricted to the items with + // children for an item which does have them + return ((wxGenericTreeItem*) item.m_pItem)->HasPlus(); +} + +bool wxGenericTreeCtrl::IsExpanded(const wxTreeItemId& item) const +{ + wxCHECK_MSG( item.IsOk(), false, wxT("invalid tree item") ); + + return ((wxGenericTreeItem*) item.m_pItem)->IsExpanded(); +} + +bool wxGenericTreeCtrl::IsSelected(const wxTreeItemId& item) const +{ + wxCHECK_MSG( item.IsOk(), false, wxT("invalid tree item") ); + + return ((wxGenericTreeItem*) item.m_pItem)->IsSelected(); +} + +bool wxGenericTreeCtrl::IsBold(const wxTreeItemId& item) const +{ + wxCHECK_MSG( item.IsOk(), false, wxT("invalid tree item") ); + + return ((wxGenericTreeItem*) item.m_pItem)->IsBold(); +} + +// ----------------------------------------------------------------------------- +// navigation +// ----------------------------------------------------------------------------- + +wxTreeItemId wxGenericTreeCtrl::GetItemParent(const wxTreeItemId& item) const +{ + wxCHECK_MSG( item.IsOk(), wxTreeItemId(), wxT("invalid tree item") ); + + return ((wxGenericTreeItem*) item.m_pItem)->GetParent(); +} + +wxTreeItemId wxGenericTreeCtrl::GetFirstChild(const wxTreeItemId& item, + wxTreeItemIdValue& cookie) const +{ + wxCHECK_MSG( item.IsOk(), wxTreeItemId(), wxT("invalid tree item") ); + + cookie = 0; + return GetNextChild(item, cookie); +} + +wxTreeItemId wxGenericTreeCtrl::GetNextChild(const wxTreeItemId& item, + wxTreeItemIdValue& cookie) const +{ + wxCHECK_MSG( item.IsOk(), wxTreeItemId(), wxT("invalid tree item") ); + + wxArrayGenericTreeItems& children = ((wxGenericTreeItem*) item.m_pItem)->GetChildren(); + + // it's ok to cast cookie to size_t, we never have indices big enough to + // overflow "void *" + size_t *pIndex = (size_t *)&cookie; + if ( *pIndex < children.Count() ) + { + return children.Item((*pIndex)++); + } + else + { + // there are no more of them + return wxTreeItemId(); + } +} + +#if WXWIN_COMPATIBILITY_2_4 + +wxTreeItemId wxGenericTreeCtrl::GetFirstChild(const wxTreeItemId& item, + long& cookie) const +{ + wxCHECK_MSG( item.IsOk(), wxTreeItemId(), wxT("invalid tree item") ); + + cookie = 0; + return GetNextChild(item, cookie); +} + +wxTreeItemId wxGenericTreeCtrl::GetNextChild(const wxTreeItemId& item, + long& cookie) const +{ + wxCHECK_MSG( item.IsOk(), wxTreeItemId(), wxT("invalid tree item") ); + + wxArrayGenericTreeItems& children = ((wxGenericTreeItem*) item.m_pItem)->GetChildren(); + if ( (size_t)cookie < children.Count() ) + { + return children.Item((size_t)cookie++); + } + else + { + // there are no more of them + return wxTreeItemId(); + } +} + +#endif // WXWIN_COMPATIBILITY_2_4 + +wxTreeItemId wxGenericTreeCtrl::GetLastChild(const wxTreeItemId& item) const +{ + wxCHECK_MSG( item.IsOk(), wxTreeItemId(), wxT("invalid tree item") ); + + wxArrayGenericTreeItems& children = ((wxGenericTreeItem*) item.m_pItem)->GetChildren(); + return (children.IsEmpty() ? wxTreeItemId() : wxTreeItemId(children.Last())); +} + +wxTreeItemId wxGenericTreeCtrl::GetNextSibling(const wxTreeItemId& item) const +{ + wxCHECK_MSG( item.IsOk(), wxTreeItemId(), wxT("invalid tree item") ); + + wxGenericTreeItem *i = (wxGenericTreeItem*) item.m_pItem; + wxGenericTreeItem *parent = i->GetParent(); + if ( parent == NULL ) + { + // root item doesn't have any siblings + return wxTreeItemId(); + } + + wxArrayGenericTreeItems& siblings = parent->GetChildren(); + int index = siblings.Index(i); + wxASSERT( index != wxNOT_FOUND ); // I'm not a child of my parent? + + size_t n = (size_t)(index + 1); + return n == siblings.Count() ? wxTreeItemId() : wxTreeItemId(siblings[n]); +} + +wxTreeItemId wxGenericTreeCtrl::GetPrevSibling(const wxTreeItemId& item) const +{ + wxCHECK_MSG( item.IsOk(), wxTreeItemId(), wxT("invalid tree item") ); + + wxGenericTreeItem *i = (wxGenericTreeItem*) item.m_pItem; + wxGenericTreeItem *parent = i->GetParent(); + if ( parent == NULL ) + { + // root item doesn't have any siblings + return wxTreeItemId(); + } + + wxArrayGenericTreeItems& siblings = parent->GetChildren(); + int index = siblings.Index(i); + wxASSERT( index != wxNOT_FOUND ); // I'm not a child of my parent? + + return index == 0 ? wxTreeItemId() + : wxTreeItemId(siblings[(size_t)(index - 1)]); +} + +// Only for internal use right now, but should probably be public +wxTreeItemId wxGenericTreeCtrl::GetNext(const wxTreeItemId& item) const +{ + wxCHECK_MSG( item.IsOk(), wxTreeItemId(), wxT("invalid tree item") ); + + wxGenericTreeItem *i = (wxGenericTreeItem*) item.m_pItem; + + // First see if there are any children. + wxArrayGenericTreeItems& children = i->GetChildren(); + if (children.GetCount() > 0) + { + return children.Item(0); + } + else + { + // Try a sibling of this or ancestor instead + wxTreeItemId p = item; + wxTreeItemId toFind; + do + { + toFind = GetNextSibling(p); + p = GetItemParent(p); + } while (p.IsOk() && !toFind.IsOk()); + return toFind; + } +} + +wxTreeItemId wxGenericTreeCtrl::GetFirstVisibleItem() const +{ + wxTreeItemId id = GetRootItem(); + if (!id.IsOk()) + return id; + + do + { + if (IsVisible(id)) + return id; + id = GetNext(id); + } while (id.IsOk()); + + return wxTreeItemId(); +} + +wxTreeItemId wxGenericTreeCtrl::GetNextVisible(const wxTreeItemId& item) const +{ + wxCHECK_MSG( item.IsOk(), wxTreeItemId(), wxT("invalid tree item") ); + + wxTreeItemId id = item; + if (id.IsOk()) + { + while (id = GetNext(id), id.IsOk()) + { + if (IsVisible(id)) + return id; + } + } + return wxTreeItemId(); +} + +wxTreeItemId wxGenericTreeCtrl::GetPrevVisible(const wxTreeItemId& item) const +{ + wxCHECK_MSG( item.IsOk(), wxTreeItemId(), wxT("invalid tree item") ); + + wxFAIL_MSG(wxT("not implemented")); + + return wxTreeItemId(); +} + +// called by wxTextTreeCtrl when it marks itself for deletion +void wxGenericTreeCtrl::ResetTextControl() +{ + m_textCtrl = NULL; +} + +// find the first item starting with the given prefix after the given item +wxTreeItemId wxGenericTreeCtrl::FindItem(const wxTreeItemId& idParent, + const wxString& prefixOrig) const +{ + // match is case insensitive as this is more convenient to the user: having + // to press Shift-letter to go to the item starting with a capital letter + // would be too bothersome + wxString prefix = prefixOrig.Lower(); + + // determine the starting point: we shouldn't take the current item (this + // allows to switch between two items starting with the same letter just by + // pressing it) but we shouldn't jump to the next one if the user is + // continuing to type as otherwise he might easily skip the item he wanted + wxTreeItemId id = idParent; + if ( prefix.length() == 1 ) + { + id = GetNext(id); + } + + // look for the item starting with the given prefix after it + while ( id.IsOk() && !GetItemText(id).Lower().StartsWith(prefix) ) + { + id = GetNext(id); + } + + // if we haven't found anything... + if ( !id.IsOk() ) + { + // ... wrap to the beginning + id = GetRootItem(); + if ( HasFlag(wxTR_HIDE_ROOT) ) + { + // can't select virtual root + id = GetNext(id); + } + + // and try all the items (stop when we get to the one we started from) + while (id.IsOk() && id != idParent && !GetItemText(id).Lower().StartsWith(prefix) ) + { + id = GetNext(id); + } + // If we haven't found the item, id.IsOk() will be false, as per + // documentation + } + + return id; +} + +// ----------------------------------------------------------------------------- +// operations +// ----------------------------------------------------------------------------- + +wxTreeItemId wxGenericTreeCtrl::DoInsertItem(const wxTreeItemId& parentId, + size_t previous, + const wxString& text, + int image, + int selImage, + wxTreeItemData *data) +{ + wxGenericTreeItem *parent = (wxGenericTreeItem*) parentId.m_pItem; + if ( !parent ) + { + // should we give a warning here? + return AddRoot(text, image, selImage, data); + } + + m_dirty = true; // do this first so stuff below doesn't cause flicker + + wxGenericTreeItem *item = + new wxGenericTreeItem( parent, text, image, selImage, data ); + + if ( data != NULL ) + { + data->m_pItem = item; + } + + parent->Insert( item, previous == (size_t)-1 ? parent->GetChildren().size() + : previous ); + + InvalidateBestSize(); + return item; +} + +wxTreeItemId wxGenericTreeCtrl::AddRoot(const wxString& text, + int image, + int selImage, + wxTreeItemData *data) +{ + wxCHECK_MSG( !m_anchor, wxTreeItemId(), wxT("tree can have only one root") ); + + m_dirty = true; // do this first so stuff below doesn't cause flicker + + m_anchor = new wxGenericTreeItem((wxGenericTreeItem *)NULL, text, + image, selImage, data); + if ( data != NULL ) + { + data->m_pItem = m_anchor; + } + + if (HasFlag(wxTR_HIDE_ROOT)) + { + // if root is hidden, make sure we can navigate + // into children + m_anchor->SetHasPlus(); + m_anchor->Expand(); + CalculatePositions(); + } + + if (!HasFlag(wxTR_MULTIPLE)) + { + m_current = m_key_current = m_anchor; + m_current->SetHilight( true ); + } + + InvalidateBestSize(); + return m_anchor; +} + +wxTreeItemId wxGenericTreeCtrl::DoInsertAfter(const wxTreeItemId& parentId, + const wxTreeItemId& idPrevious, + const wxString& text, + int image, int selImage, + wxTreeItemData *data) +{ + wxGenericTreeItem *parent = (wxGenericTreeItem*) parentId.m_pItem; + if ( !parent ) + { + // should we give a warning here? + return AddRoot(text, image, selImage, data); + } + + int index = -1; + if (idPrevious.IsOk()) + { + index = parent->GetChildren().Index((wxGenericTreeItem*) idPrevious.m_pItem); + wxASSERT_MSG( index != wxNOT_FOUND, + wxT("previous item in wxGenericTreeCtrl::InsertItem() is not a sibling") ); + } + + return DoInsertItem(parentId, (size_t)++index, text, image, selImage, data); +} + + +void wxGenericTreeCtrl::SendDeleteEvent(wxGenericTreeItem *item) +{ + wxTreeEvent event(wxEVT_COMMAND_TREE_DELETE_ITEM, this, item); + ProcessEvent( event ); +} + +// Don't leave edit or selection on a child which is about to disappear +void wxGenericTreeCtrl::ChildrenClosing(wxGenericTreeItem* item) +{ + if (m_textCtrl != NULL && item != m_textCtrl->item() && IsDescendantOf(item, m_textCtrl->item())) { + m_textCtrl->StopEditing(); + } + if (item != m_key_current && IsDescendantOf(item, m_key_current)) { + m_key_current = NULL; + } + if (IsDescendantOf(item, m_select_me)) { + m_select_me = item; + } + if (item != m_current && IsDescendantOf(item, m_current)) { + m_current->SetHilight( false ); + m_current = NULL; + m_select_me = item; + } +} + +void wxGenericTreeCtrl::DeleteChildren(const wxTreeItemId& itemId) +{ + m_dirty = true; // do this first so stuff below doesn't cause flicker + + wxGenericTreeItem *item = (wxGenericTreeItem*) itemId.m_pItem; + ChildrenClosing(item); + item->DeleteChildren(this); + InvalidateBestSize(); +} + +void wxGenericTreeCtrl::Delete(const wxTreeItemId& itemId) +{ + m_dirty = true; // do this first so stuff below doesn't cause flicker + + wxGenericTreeItem *item = (wxGenericTreeItem*) itemId.m_pItem; + + if (m_textCtrl != NULL && IsDescendantOf(item, m_textCtrl->item())) + { + // can't delete the item being edited, cancel editing it first + m_textCtrl->StopEditing(); + } + + wxGenericTreeItem *parent = item->GetParent(); + + // don't keep stale pointers around! + if ( IsDescendantOf(item, m_key_current) ) + { + // Don't silently change the selection: + // do it properly in idle time, so event + // handlers get called. + + // m_key_current = parent; + m_key_current = NULL; + } + + // m_select_me records whether we need to select + // a different item, in idle time. + if ( m_select_me && IsDescendantOf(item, m_select_me) ) + { + m_select_me = parent; + } + + if ( IsDescendantOf(item, m_current) ) + { + // Don't silently change the selection: + // do it properly in idle time, so event + // handlers get called. + + // m_current = parent; + m_current = NULL; + m_select_me = parent; + } + + // remove the item from the tree + if ( parent ) + { + parent->GetChildren().Remove( item ); // remove by value + } + else // deleting the root + { + // nothing will be left in the tree + m_anchor = NULL; + } + + // and delete all of its children and the item itself now + item->DeleteChildren(this); + SendDeleteEvent(item); + + if (item == m_select_me) + m_select_me = NULL; + + delete item; + + InvalidateBestSize(); +} + +void wxGenericTreeCtrl::DeleteAllItems() +{ + if ( m_anchor ) + { + Delete(m_anchor); + } +} + +void wxGenericTreeCtrl::Expand(const wxTreeItemId& itemId) +{ + wxGenericTreeItem *item = (wxGenericTreeItem*) itemId.m_pItem; + + wxCHECK_RET( item, _T("invalid item in wxGenericTreeCtrl::Expand") ); + wxCHECK_RET( !HasFlag(wxTR_HIDE_ROOT) || itemId != GetRootItem(), + _T("can't expand hidden root") ); + + if ( !item->HasPlus() ) + return; + + if ( item->IsExpanded() ) + return; + + wxTreeEvent event(wxEVT_COMMAND_TREE_ITEM_EXPANDING, this, item); + + if ( ProcessEvent( event ) && !event.IsAllowed() ) + { + // cancelled by program + return; + } + + item->Expand(); + CalculatePositions(); + + RefreshSubtree(item); + + event.SetEventType(wxEVT_COMMAND_TREE_ITEM_EXPANDED); + ProcessEvent( event ); +} + +void wxGenericTreeCtrl::Collapse(const wxTreeItemId& itemId) +{ + wxCHECK_RET( !HasFlag(wxTR_HIDE_ROOT) || itemId != GetRootItem(), + _T("can't collapse hidden root") ); + + wxGenericTreeItem *item = (wxGenericTreeItem*) itemId.m_pItem; + + if ( !item->IsExpanded() ) + return; + + wxTreeEvent event(wxEVT_COMMAND_TREE_ITEM_COLLAPSING, this, item); + if ( ProcessEvent( event ) && !event.IsAllowed() ) + { + // cancelled by program + return; + } + + ChildrenClosing(item); + item->Collapse(); + +#if 0 // TODO why should items be collapsed recursively? + wxArrayGenericTreeItems& children = item->GetChildren(); + size_t count = children.Count(); + for ( size_t n = 0; n < count; n++ ) + { + Collapse(children[n]); + } +#endif + + CalculatePositions(); + + RefreshSubtree(item); + + event.SetEventType(wxEVT_COMMAND_TREE_ITEM_COLLAPSED); + ProcessEvent( event ); +} + +void wxGenericTreeCtrl::CollapseAndReset(const wxTreeItemId& item) +{ + Collapse(item); + DeleteChildren(item); +} + +void wxGenericTreeCtrl::Toggle(const wxTreeItemId& itemId) +{ + wxGenericTreeItem *item = (wxGenericTreeItem*) itemId.m_pItem; + + if (item->IsExpanded()) + Collapse(itemId); + else + Expand(itemId); +} + +void wxGenericTreeCtrl::Unselect() +{ + if (m_current) + { + m_current->SetHilight( false ); + RefreshLine( m_current ); + + m_current = NULL; + m_select_me = NULL; + } +} + +void wxGenericTreeCtrl::UnselectAllChildren(wxGenericTreeItem *item) +{ + if (item->IsSelected()) + { + item->SetHilight(false); + RefreshLine(item); + } + + if (item->HasChildren()) + { + wxArrayGenericTreeItems& children = item->GetChildren(); + size_t count = children.Count(); + for ( size_t n = 0; n < count; ++n ) + { + UnselectAllChildren(children[n]); + } + } +} + +void wxGenericTreeCtrl::UnselectAll() +{ + wxTreeItemId rootItem = GetRootItem(); + + // the tree might not have the root item at all + if ( rootItem ) + { + UnselectAllChildren((wxGenericTreeItem*) rootItem.m_pItem); + } +} + +// Recursive function ! +// To stop we must have crt_itemGetParent(); + + if (parent == NULL) // This is root item + return TagAllChildrenUntilLast(crt_item, last_item, select); + + wxArrayGenericTreeItems& children = parent->GetChildren(); + int index = children.Index(crt_item); + wxASSERT( index != wxNOT_FOUND ); // I'm not a child of my parent? + + size_t count = children.Count(); + for (size_t n=(size_t)(index+1); nSetHilight(select); + RefreshLine(crt_item); + + if (crt_item==last_item) + return true; + + if (crt_item->HasChildren()) + { + wxArrayGenericTreeItems& children = crt_item->GetChildren(); + size_t count = children.Count(); + for ( size_t n = 0; n < count; ++n ) + { + if (TagAllChildrenUntilLast(children[n], last_item, select)) + return true; + } + } + + return false; +} + +void wxGenericTreeCtrl::SelectItemRange(wxGenericTreeItem *item1, wxGenericTreeItem *item2) +{ + m_select_me = NULL; + + // item2 is not necessary after item1 + // choice first' and 'last' between item1 and item2 + wxGenericTreeItem *first= (item1->GetY()GetY()) ? item1 : item2; + wxGenericTreeItem *last = (item1->GetY()GetY()) ? item2 : item1; + + bool select = m_current->IsSelected(); + + if ( TagAllChildrenUntilLast(first,last,select) ) + return; + + TagNextChildren(first,last,select); +} + +void wxGenericTreeCtrl::DoSelectItem(const wxTreeItemId& itemId, + bool unselect_others, + bool extended_select) +{ + wxCHECK_RET( itemId.IsOk(), wxT("invalid tree item") ); + + m_select_me = NULL; + + bool is_single=!(GetWindowStyleFlag() & wxTR_MULTIPLE); + wxGenericTreeItem *item = (wxGenericTreeItem*) itemId.m_pItem; + + //wxCHECK_RET( ( (!unselect_others) && is_single), + // wxT("this is a single selection tree") ); + + // to keep going anyhow !!! + if (is_single) + { + if (item->IsSelected()) + return; // nothing to do + unselect_others = true; + extended_select = false; + } + else if ( unselect_others && item->IsSelected() ) + { + // selection change if there is more than one item currently selected + wxArrayTreeItemIds selected_items; + if ( GetSelections(selected_items) == 1 ) + return; + } + + wxTreeEvent event(wxEVT_COMMAND_TREE_SEL_CHANGING, this, item); + event.m_itemOld = m_current; + // TODO : Here we don't send any selection mode yet ! + + if ( GetEventHandler()->ProcessEvent( event ) && !event.IsAllowed() ) + return; + + wxTreeItemId parent = GetItemParent( itemId ); + while (parent.IsOk()) + { + if (!IsExpanded(parent)) + Expand( parent ); + + parent = GetItemParent( parent ); + } + + // ctrl press + if (unselect_others) + { + if (is_single) Unselect(); // to speed up thing + else UnselectAll(); + } + + // shift press + if (extended_select) + { + if ( !m_current ) + { + m_current = m_key_current = (wxGenericTreeItem*) GetRootItem().m_pItem; + } + + // don't change the mark (m_current) + SelectItemRange(m_current, item); + } + else + { + bool select = true; // the default + + // Check if we need to toggle hilight (ctrl mode) + if (!unselect_others) + select=!item->IsSelected(); + + m_current = m_key_current = item; + m_current->SetHilight(select); + RefreshLine( m_current ); + } + + // This can cause idle processing to select the root + // if no item is selected, so it must be after the + // selection is set + EnsureVisible( itemId ); + + event.SetEventType(wxEVT_COMMAND_TREE_SEL_CHANGED); + GetEventHandler()->ProcessEvent( event ); +} + +void wxGenericTreeCtrl::SelectItem(const wxTreeItemId& itemId, bool select) +{ + if ( select ) + { + DoSelectItem(itemId, !HasFlag(wxTR_MULTIPLE)); + } + else // deselect + { + wxGenericTreeItem *item = (wxGenericTreeItem*) itemId.m_pItem; + wxCHECK_RET( item, wxT("SelectItem(): invalid tree item") ); + + wxTreeEvent event(wxEVT_COMMAND_TREE_SEL_CHANGING, this, item); + if ( GetEventHandler()->ProcessEvent( event ) && !event.IsAllowed() ) + return; + + item->SetHilight(false); + RefreshLine(item); + + event.SetEventType(wxEVT_COMMAND_TREE_SEL_CHANGED); + GetEventHandler()->ProcessEvent( event ); + } +} + +void wxGenericTreeCtrl::FillArray(wxGenericTreeItem *item, + wxArrayTreeItemIds &array) const +{ + if ( item->IsSelected() ) + array.Add(wxTreeItemId(item)); + + if ( item->HasChildren() ) + { + wxArrayGenericTreeItems& children = item->GetChildren(); + size_t count = children.GetCount(); + for ( size_t n = 0; n < count; ++n ) + FillArray(children[n], array); + } +} + +size_t wxGenericTreeCtrl::GetSelections(wxArrayTreeItemIds &array) const +{ + array.Empty(); + wxTreeItemId idRoot = GetRootItem(); + if ( idRoot.IsOk() ) + { + FillArray((wxGenericTreeItem*) idRoot.m_pItem, array); + } + //else: the tree is empty, so no selections + + return array.Count(); +} + +void wxGenericTreeCtrl::EnsureVisible(const wxTreeItemId& item) +{ + wxCHECK_RET( item.IsOk(), wxT("invalid tree item") ); + + if (!item.IsOk()) return; + + wxGenericTreeItem *gitem = (wxGenericTreeItem*) item.m_pItem; + + // first expand all parent branches + wxGenericTreeItem *parent = gitem->GetParent(); + + if ( HasFlag(wxTR_HIDE_ROOT) ) + { + while ( parent && parent != m_anchor ) + { + Expand(parent); + parent = parent->GetParent(); + } + } + else + { + while ( parent ) + { + Expand(parent); + parent = parent->GetParent(); + } + } + + //if (parent) CalculatePositions(); + + ScrollTo(item); +} + +void wxGenericTreeCtrl::ScrollTo(const wxTreeItemId &item) +{ + if (!item.IsOk()) return; + + // We have to call this here because the label in + // question might just have been added and no screen + // update taken place. + if (m_dirty) +#if defined( __WXMSW__ ) || defined(__WXMAC__) + Update(); +#else + DoDirtyProcessing(); +#endif + wxGenericTreeItem *gitem = (wxGenericTreeItem*) item.m_pItem; + + // now scroll to the item + int item_y = gitem->GetY(); + + int start_x = 0; + int start_y = 0; + GetViewStart( &start_x, &start_y ); + start_y *= PIXELS_PER_UNIT; + + int client_h = 0; + int client_w = 0; + GetClientSize( &client_w, &client_h ); + + if (item_y < start_y+3) + { + // going down + int x = 0; + int y = 0; + m_anchor->GetSize( x, y, this ); + y += PIXELS_PER_UNIT+2; // one more scrollbar unit + 2 pixels + x += PIXELS_PER_UNIT+2; // one more scrollbar unit + 2 pixels + int x_pos = GetScrollPos( wxHORIZONTAL ); + // Item should appear at top + SetScrollbars( PIXELS_PER_UNIT, PIXELS_PER_UNIT, x/PIXELS_PER_UNIT, y/PIXELS_PER_UNIT, x_pos, item_y/PIXELS_PER_UNIT ); + } + else if (item_y+GetLineHeight(gitem) > start_y+client_h) + { + // going up + int x = 0; + int y = 0; + m_anchor->GetSize( x, y, this ); + y += PIXELS_PER_UNIT+2; // one more scrollbar unit + 2 pixels + x += PIXELS_PER_UNIT+2; // one more scrollbar unit + 2 pixels + item_y += PIXELS_PER_UNIT+2; + int x_pos = GetScrollPos( wxHORIZONTAL ); + // Item should appear at bottom + SetScrollbars( PIXELS_PER_UNIT, PIXELS_PER_UNIT, x/PIXELS_PER_UNIT, y/PIXELS_PER_UNIT, x_pos, (item_y+GetLineHeight(gitem)-client_h)/PIXELS_PER_UNIT ); + } +} + +// FIXME: tree sorting functions are not reentrant and not MT-safe! +static wxGenericTreeCtrl *s_treeBeingSorted = NULL; + +static int LINKAGEMODE tree_ctrl_compare_func(wxGenericTreeItem **item1, + wxGenericTreeItem **item2) +{ + wxCHECK_MSG( s_treeBeingSorted, 0, wxT("bug in wxGenericTreeCtrl::SortChildren()") ); + + return s_treeBeingSorted->OnCompareItems(*item1, *item2); +} + +void wxGenericTreeCtrl::SortChildren(const wxTreeItemId& itemId) +{ + wxCHECK_RET( itemId.IsOk(), wxT("invalid tree item") ); + + wxGenericTreeItem *item = (wxGenericTreeItem*) itemId.m_pItem; + + wxCHECK_RET( !s_treeBeingSorted, + wxT("wxGenericTreeCtrl::SortChildren is not reentrant") ); + + wxArrayGenericTreeItems& children = item->GetChildren(); + if ( children.Count() > 1 ) + { + m_dirty = true; + + s_treeBeingSorted = this; + children.Sort(tree_ctrl_compare_func); + s_treeBeingSorted = NULL; + } + //else: don't make the tree dirty as nothing changed +} + +void wxGenericTreeCtrl::CalculateLineHeight() +{ + wxClientDC dc(this); + m_lineHeight = (int)(dc.GetCharHeight() + 4); + + if ( m_imageListNormal ) + { + // Calculate a m_lineHeight value from the normal Image sizes. + // May be toggle off. Then wxGenericTreeCtrl will spread when + // necessary (which might look ugly). + int n = m_imageListNormal->GetImageCount(); + for (int i = 0; i < n ; i++) + { + int width = 0, height = 0; + m_imageListNormal->GetSize(i, width, height); + if (height > m_lineHeight) m_lineHeight = height; + } + } + + if (m_imageListButtons) + { + // Calculate a m_lineHeight value from the Button image sizes. + // May be toggle off. Then wxGenericTreeCtrl will spread when + // necessary (which might look ugly). + int n = m_imageListButtons->GetImageCount(); + for (int i = 0; i < n ; i++) + { + int width = 0, height = 0; + m_imageListButtons->GetSize(i, width, height); + if (height > m_lineHeight) m_lineHeight = height; + } + } + + if (m_lineHeight < 30) + m_lineHeight += 2; // at least 2 pixels + else + m_lineHeight += m_lineHeight/10; // otherwise 10% extra spacing +} + +void wxGenericTreeCtrl::SetImageList(wxImageList *imageList) +{ + if (m_ownsImageListNormal) delete m_imageListNormal; + m_imageListNormal = imageList; + m_ownsImageListNormal = false; + m_dirty = true; + // Don't do any drawing if we're setting the list to NULL, + // since we may be in the process of deleting the tree control. + if (imageList) + CalculateLineHeight(); +} + +void wxGenericTreeCtrl::SetStateImageList(wxImageList *imageList) +{ + if (m_ownsImageListState) delete m_imageListState; + m_imageListState = imageList; + m_ownsImageListState = false; +} + +void wxGenericTreeCtrl::SetButtonsImageList(wxImageList *imageList) +{ + if (m_ownsImageListButtons) delete m_imageListButtons; + m_imageListButtons = imageList; + m_ownsImageListButtons = false; + m_dirty = true; + CalculateLineHeight(); +} + +void wxGenericTreeCtrl::AssignButtonsImageList(wxImageList *imageList) +{ + SetButtonsImageList(imageList); + m_ownsImageListButtons = true; +} + +// ----------------------------------------------------------------------------- +// helpers +// ----------------------------------------------------------------------------- + +void wxGenericTreeCtrl::AdjustMyScrollbars() +{ + if (m_anchor) + { + int x = 0, y = 0; + m_anchor->GetSize( x, y, this ); + y += PIXELS_PER_UNIT+2; // one more scrollbar unit + 2 pixels + x += PIXELS_PER_UNIT+2; // one more scrollbar unit + 2 pixels + int x_pos = GetScrollPos( wxHORIZONTAL ); + int y_pos = GetScrollPos( wxVERTICAL ); + SetScrollbars( PIXELS_PER_UNIT, PIXELS_PER_UNIT, x/PIXELS_PER_UNIT, y/PIXELS_PER_UNIT, x_pos, y_pos ); + } + else + { + SetScrollbars( 0, 0, 0, 0 ); + } +} + +int wxGenericTreeCtrl::GetLineHeight(wxGenericTreeItem *item) const +{ + if (GetWindowStyleFlag() & wxTR_HAS_VARIABLE_ROW_HEIGHT) + return item->GetHeight(); + else + return m_lineHeight; +} + +void wxGenericTreeCtrl::PaintItem(wxGenericTreeItem *item, wxDC& dc) +{ + // TODO implement "state" icon on items + + wxTreeItemAttr *attr = item->GetAttributes(); + if ( attr && attr->HasFont() ) + dc.SetFont(attr->GetFont()); + else if (item->IsBold()) + dc.SetFont(m_boldFont); + + long text_w = 0, text_h = 0; + dc.GetTextExtent( item->GetText(), &text_w, &text_h ); + + int image_h = 0, image_w = 0; + int image = item->GetCurrentImage(); + if ( image != NO_IMAGE ) + { + if ( m_imageListNormal ) + { + m_imageListNormal->GetSize( image, image_w, image_h ); + image_w += MARGIN_BETWEEN_IMAGE_AND_TEXT; + } + else + { + image = NO_IMAGE; + } + } + + int total_h = GetLineHeight(item); + bool drawItemBackground = false; + + if ( item->IsSelected() ) + { + dc.SetBrush(*(m_hasFocus ? m_hilightBrush : m_hilightUnfocusedBrush)); + drawItemBackground = true; + } + else + { + wxColour colBg; + if ( attr && attr->HasBackgroundColour() ) + { + drawItemBackground = true; + colBg = attr->GetBackgroundColour(); + } + else + { + colBg = GetBackgroundColour(); + } + dc.SetBrush(wxBrush(colBg, wxSOLID)); + } + + int offset = HasFlag(wxTR_ROW_LINES) ? 1 : 0; + + if ( HasFlag(wxTR_FULL_ROW_HIGHLIGHT) ) + { + int x = 0, w = 0, h = 0; + GetVirtualSize(&w, &h); + wxRect rect( x, item->GetY()+offset, w, total_h-offset); +#if !defined(__WXGTK20__) && !defined(__WXMAC__) + dc.DrawRectangle(rect); +#else + if (!item->IsSelected()) + { + dc.DrawRectangle(rect); + } + else + { + int flags = wxCONTROL_SELECTED; + if (m_hasFocus +#ifdef __WXMAC__ + && IsControlActive( (ControlRef)GetHandle() ) +#endif + ) + flags |= wxCONTROL_FOCUSED; + if ((item == m_current) && (m_hasFocus)) + flags |= wxCONTROL_CURRENT; + wxRendererNative::Get().DrawItemSelectionRect( this, dc, rect, flags ); + } +#endif + } + else + { + if ( item->IsSelected() && image != NO_IMAGE ) + { + // If it's selected, and there's an image, then we should + // take care to leave the area under the image painted in the + // background colour. + wxRect rect( item->GetX() + image_w - 2, item->GetY()+offset, + item->GetWidth() - image_w + 2, total_h-offset ); +#if !defined(__WXGTK20__) && !defined(__WXMAC__) + dc.DrawRectangle( rect ); +#else + rect.x -= 1; + rect.width += 2; + + int flags = wxCONTROL_SELECTED; + if (m_hasFocus) + flags |= wxCONTROL_FOCUSED; + if ((item == m_current) && (m_hasFocus)) + flags |= wxCONTROL_CURRENT; + wxRendererNative::Get().DrawItemSelectionRect( this, dc, rect, flags ); +#endif + } + // On GTK+ 2, drawing a 'normal' background is wrong for themes that + // don't allow backgrounds to be customized. Not drawing the background, + // except for custom item backgrounds, works for both kinds of theme. + else if (drawItemBackground) + { + wxRect rect( item->GetX()-2, item->GetY()+offset, + item->GetWidth()+2, total_h-offset ); +#if !defined(__WXGTK20__) && !defined(__WXMAC__) + dc.DrawRectangle( rect ); +#else + if ( attr && attr->HasBackgroundColour() ) + { + dc.DrawRectangle( rect ); + } + else + { + rect.x -= 1; + rect.width += 2; + + int flags = wxCONTROL_SELECTED; + if (m_hasFocus) + flags |= wxCONTROL_FOCUSED; + if ((item == m_current) && (m_hasFocus)) + flags |= wxCONTROL_CURRENT; + wxRendererNative::Get().DrawItemSelectionRect( this, dc, rect, flags ); + } +#endif + } + } + + if ( image != NO_IMAGE ) + { + dc.SetClippingRegion( item->GetX(), item->GetY(), image_w-2, total_h ); + m_imageListNormal->Draw( image, dc, + item->GetX(), + item->GetY() +((total_h > image_h)?((total_h-image_h)/2):0), + wxIMAGELIST_DRAW_TRANSPARENT ); + dc.DestroyClippingRegion(); + } + + dc.SetBackgroundMode(wxTRANSPARENT); + int extraH = (total_h > text_h) ? (total_h - text_h)/2 : 0; + dc.DrawText( item->GetText(), + (wxCoord)(image_w + item->GetX()), + (wxCoord)(item->GetY() + extraH)); + + // restore normal font + dc.SetFont( m_normalFont ); +} + +// Now y stands for the top of the item, whereas it used to stand for middle ! +void wxGenericTreeCtrl::PaintLevel( wxGenericTreeItem *item, wxDC &dc, int level, int &y ) +{ + int x = level*m_indent; + if (!HasFlag(wxTR_HIDE_ROOT)) + { + x += m_indent; + } + else if (level == 0) + { + // always expand hidden root + int origY = y; + wxArrayGenericTreeItems& children = item->GetChildren(); + int count = children.Count(); + if (count > 0) + { + int n = 0, oldY; + do { + oldY = y; + PaintLevel(children[n], dc, 1, y); + } while (++n < count); + + if (!HasFlag(wxTR_NO_LINES) && HasFlag(wxTR_LINES_AT_ROOT) && count > 0) + { + // draw line down to last child + origY += GetLineHeight(children[0])>>1; + oldY += GetLineHeight(children[n-1])>>1; + dc.DrawLine(3, origY, 3, oldY); + } + } + return; + } + + item->SetX(x+m_spacing); + item->SetY(y); + + int h = GetLineHeight(item); + int y_top = y; + int y_mid = y_top + (h>>1); + y += h; + + int exposed_x = dc.LogicalToDeviceX(0); + int exposed_y = dc.LogicalToDeviceY(y_top); + + if (IsExposed(exposed_x, exposed_y, 10000, h)) // 10000 = very much + { + const wxPen *pen = +#ifndef __WXMAC__ + // don't draw rect outline if we already have the + // background color under Mac + (item->IsSelected() && m_hasFocus) ? wxBLACK_PEN : +#endif // !__WXMAC__ + wxTRANSPARENT_PEN; + + wxColour colText; + if ( item->IsSelected() +#ifdef __WXMAC__ + // On wxMac, if the tree doesn't have the focus we draw an empty + // rectangle, so we want to make sure that the text is visible + // against the normal background, not the highlightbackground, so + // don't use the highlight text colour unless we have the focus. + && m_hasFocus && IsControlActive( (ControlRef)GetHandle() ) +#endif + ) + { +#ifdef __WXMAC__ + colText = *wxWHITE; +#else + colText = wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT); +#endif + } + else + { + wxTreeItemAttr *attr = item->GetAttributes(); + if (attr && attr->HasTextColour()) + colText = attr->GetTextColour(); + else + colText = GetForegroundColour(); + } + + // prepare to draw + dc.SetTextForeground(colText); + dc.SetPen(*pen); + + // draw + PaintItem(item, dc); + + if (HasFlag(wxTR_ROW_LINES)) + { + // if the background colour is white, choose a + // contrasting color for the lines + dc.SetPen(*((GetBackgroundColour() == *wxWHITE) + ? wxMEDIUM_GREY_PEN : wxWHITE_PEN)); + dc.DrawLine(0, y_top, 10000, y_top); + dc.DrawLine(0, y, 10000, y); + } + + // restore DC objects + dc.SetBrush(*wxWHITE_BRUSH); + dc.SetPen(m_dottedPen); + dc.SetTextForeground(*wxBLACK); + + if ( !HasFlag(wxTR_NO_LINES) ) + { + // draw the horizontal line here + int x_start = x; + if (x > (signed)m_indent) + x_start -= m_indent; + else if (HasFlag(wxTR_LINES_AT_ROOT)) + x_start = 3; + dc.DrawLine(x_start, y_mid, x + m_spacing, y_mid); + } + + // should the item show a button? + if ( item->HasPlus() && HasButtons() ) + { + if ( m_imageListButtons ) + { + // draw the image button here + int image_h = 0, + image_w = 0; + int image = item->IsExpanded() ? wxTreeItemIcon_Expanded + : wxTreeItemIcon_Normal; + if ( item->IsSelected() ) + image += wxTreeItemIcon_Selected - wxTreeItemIcon_Normal; + + m_imageListButtons->GetSize(image, image_w, image_h); + int xx = x - image_w/2; + int yy = y_mid - image_h/2; + + wxDCClipper clip(dc, xx, yy, image_w, image_h); + m_imageListButtons->Draw(image, dc, xx, yy, + wxIMAGELIST_DRAW_TRANSPARENT); + } + else // no custom buttons + { + static const int wImage = 9; + static const int hImage = 9; + + int flag = 0; + if (item->IsExpanded()) + flag |= wxCONTROL_EXPANDED; + if (item == m_underMouse) + flag |= wxCONTROL_CURRENT; + + wxRendererNative::Get().DrawTreeItemButton + ( + this, + dc, + wxRect(x - wImage/2, + y_mid - hImage/2, + wImage, hImage), + flag + ); + } + } + } + + if (item->IsExpanded()) + { + wxArrayGenericTreeItems& children = item->GetChildren(); + int count = children.Count(); + if (count > 0) + { + int n = 0, oldY; + ++level; + do { + oldY = y; + PaintLevel(children[n], dc, level, y); + } while (++n < count); + + if (!HasFlag(wxTR_NO_LINES) && count > 0) + { + // draw line down to last child + oldY += GetLineHeight(children[n-1])>>1; + if (HasButtons()) y_mid += 5; + + // Only draw the portion of the line that is visible, in case it is huge + wxCoord xOrigin=0, yOrigin=0, width, height; + dc.GetDeviceOrigin(&xOrigin, &yOrigin); + yOrigin = abs(yOrigin); + GetClientSize(&width, &height); + + // Move end points to the begining/end of the view? + if (y_mid < yOrigin) + y_mid = yOrigin; + if (oldY > yOrigin + height) + oldY = yOrigin + height; + + // after the adjustments if y_mid is larger than oldY then the line + // isn't visible at all so don't draw anything + if (y_mid < oldY) + dc.DrawLine(x, y_mid, x, oldY); + } + } + } +} + +void wxGenericTreeCtrl::DrawDropEffect(wxGenericTreeItem *item) +{ + if ( item ) + { + if ( item->HasPlus() ) + { + // it's a folder, indicate it by a border + DrawBorder(item); + } + else + { + // draw a line under the drop target because the item will be + // dropped there + DrawLine(item, !m_dropEffectAboveItem ); + } + + SetCursor(wxCURSOR_BULLSEYE); + } + else + { + // can't drop here + SetCursor(wxCURSOR_NO_ENTRY); + } +} + +void wxGenericTreeCtrl::DrawBorder(const wxTreeItemId &item) +{ + wxCHECK_RET( item.IsOk(), _T("invalid item in wxGenericTreeCtrl::DrawLine") ); + + wxGenericTreeItem *i = (wxGenericTreeItem*) item.m_pItem; + + wxClientDC dc(this); + PrepareDC( dc ); + dc.SetLogicalFunction(wxINVERT); + dc.SetBrush(*wxTRANSPARENT_BRUSH); + + int w = i->GetWidth() + 2; + int h = GetLineHeight(i) + 2; + + dc.DrawRectangle( i->GetX() - 1, i->GetY() - 1, w, h); +} + +void wxGenericTreeCtrl::DrawLine(const wxTreeItemId &item, bool below) +{ + wxCHECK_RET( item.IsOk(), _T("invalid item in wxGenericTreeCtrl::DrawLine") ); + + wxGenericTreeItem *i = (wxGenericTreeItem*) item.m_pItem; + + wxClientDC dc(this); + PrepareDC( dc ); + dc.SetLogicalFunction(wxINVERT); + + int x = i->GetX(), + y = i->GetY(); + if ( below ) + { + y += GetLineHeight(i) - 1; + } + + dc.DrawLine( x, y, x + i->GetWidth(), y); +} + +// ----------------------------------------------------------------------------- +// wxWidgets callbacks +// ----------------------------------------------------------------------------- + +void wxGenericTreeCtrl::OnSize( wxSizeEvent &event ) +{ +#ifdef __WXGTK__ + if (HasFlag( wxTR_FULL_ROW_HIGHLIGHT) && m_current) + RefreshLine( m_current ); +#endif + + event.Skip(true); +} + +void wxGenericTreeCtrl::OnPaint( wxPaintEvent &WXUNUSED(event) ) +{ + wxPaintDC dc(this); + PrepareDC( dc ); + + if ( !m_anchor) + return; + + dc.SetFont( m_normalFont ); + dc.SetPen( m_dottedPen ); + + // this is now done dynamically + //if(GetImageList() == NULL) + // m_lineHeight = (int)(dc.GetCharHeight() + 4); + + int y = 2; + PaintLevel( m_anchor, dc, 0, y ); +} + +void wxGenericTreeCtrl::OnSetFocus( wxFocusEvent &event ) +{ + m_hasFocus = true; + + RefreshSelected(); + + event.Skip(); +} + +void wxGenericTreeCtrl::OnKillFocus( wxFocusEvent &event ) +{ + m_hasFocus = false; + + RefreshSelected(); + + event.Skip(); +} + +void wxGenericTreeCtrl::OnChar( wxKeyEvent &event ) +{ + wxTreeEvent te( wxEVT_COMMAND_TREE_KEY_DOWN, this); + te.m_evtKey = event; + if ( GetEventHandler()->ProcessEvent( te ) ) + { + // intercepted by the user code + return; + } + + if ( (m_current == 0) || (m_key_current == 0) ) + { + event.Skip(); + return; + } + + // how should the selection work for this event? + bool is_multiple, extended_select, unselect_others; + EventFlagsToSelType(GetWindowStyleFlag(), + event.ShiftDown(), + event.CmdDown(), + is_multiple, extended_select, unselect_others); + + if (GetLayoutDirection() == wxLayout_RightToLeft) + { + if (event.GetKeyCode() == WXK_RIGHT) + event.m_keyCode = WXK_LEFT; + else if (event.GetKeyCode() == WXK_LEFT) + event.m_keyCode = WXK_RIGHT; + } + + // + : Expand + // - : Collaspe + // * : Expand all/Collapse all + // ' ' | return : activate + // up : go up (not last children!) + // down : go down + // left : go to parent + // right : open if parent and go next + // home : go to root + // end : go to last item without opening parents + // alnum : start or continue searching for the item with this prefix + int keyCode = event.GetKeyCode(); + switch ( keyCode ) + { + case '+': + case WXK_ADD: + if (m_current->HasPlus() && !IsExpanded(m_current)) + { + Expand(m_current); + } + break; + + case '*': + case WXK_MULTIPLY: + if ( !IsExpanded(m_current) ) + { + // expand all + ExpandAllChildren(m_current); + break; + } + //else: fall through to Collapse() it + + case '-': + case WXK_SUBTRACT: + if (IsExpanded(m_current)) + { + Collapse(m_current); + } + break; + + case WXK_MENU: + { + // Use the item's bounding rectangle to determine position for the event + wxRect ItemRect; + GetBoundingRect(m_current, ItemRect, true); + + wxTreeEvent eventMenu(wxEVT_COMMAND_TREE_ITEM_MENU, this, m_current); + // Use the left edge, vertical middle + eventMenu.m_pointDrag = wxPoint(ItemRect.GetX(), + ItemRect.GetY() + ItemRect.GetHeight() / 2); + GetEventHandler()->ProcessEvent( eventMenu ); + } + break; + + case ' ': + case WXK_RETURN: + if ( !event.HasModifiers() ) + { + wxTreeEvent eventAct(wxEVT_COMMAND_TREE_ITEM_ACTIVATED, this, m_current); + GetEventHandler()->ProcessEvent( eventAct ); + } + + // in any case, also generate the normal key event for this key, + // even if we generated the ACTIVATED event above: this is what + // wxMSW does and it makes sense because you might not want to + // process ACTIVATED event at all and handle Space and Return + // directly (and differently) which would be impossible otherwise + event.Skip(); + break; + + // up goes to the previous sibling or to the last + // of its children if it's expanded + case WXK_UP: + { + wxTreeItemId prev = GetPrevSibling( m_key_current ); + if (!prev) + { + prev = GetItemParent( m_key_current ); + if ((prev == GetRootItem()) && HasFlag(wxTR_HIDE_ROOT)) + { + break; // don't go to root if it is hidden + } + if (prev) + { + wxTreeItemIdValue cookie; + wxTreeItemId current = m_key_current; + // TODO: Huh? If we get here, we'd better be the first child of our parent. How else could it be? + if (current == GetFirstChild( prev, cookie )) + { + // otherwise we return to where we came from + DoSelectItem( prev, unselect_others, extended_select ); + m_key_current= (wxGenericTreeItem*) prev.m_pItem; + break; + } + } + } + if (prev) + { + while ( IsExpanded(prev) && HasChildren(prev) ) + { + wxTreeItemId child = GetLastChild(prev); + if ( child ) + { + prev = child; + } + } + + DoSelectItem( prev, unselect_others, extended_select ); + m_key_current=(wxGenericTreeItem*) prev.m_pItem; + } + } + break; + + // left arrow goes to the parent + case WXK_LEFT: + { + wxTreeItemId prev = GetItemParent( m_current ); + if ((prev == GetRootItem()) && HasFlag(wxTR_HIDE_ROOT)) + { + // don't go to root if it is hidden + prev = GetPrevSibling( m_current ); + } + if (prev) + { + DoSelectItem( prev, unselect_others, extended_select ); + } + } + break; + + case WXK_RIGHT: + // this works the same as the down arrow except that we + // also expand the item if it wasn't expanded yet + if (m_current != GetRootItem().m_pItem || !HasFlag(wxTR_HIDE_ROOT)) + Expand(m_current); + //else: don't try to expand hidden root item (which can be the + // current one when the tree is empty) + + // fall through + + case WXK_DOWN: + { + if (IsExpanded(m_key_current) && HasChildren(m_key_current)) + { + wxTreeItemIdValue cookie; + wxTreeItemId child = GetFirstChild( m_key_current, cookie ); + if ( !child ) + break; + + DoSelectItem( child, unselect_others, extended_select ); + m_key_current=(wxGenericTreeItem*) child.m_pItem; + } + else + { + wxTreeItemId next = GetNextSibling( m_key_current ); + if (!next) + { + wxTreeItemId current = m_key_current; + while (current.IsOk() && !next) + { + current = GetItemParent( current ); + if (current) next = GetNextSibling( current ); + } + } + if (next) + { + DoSelectItem( next, unselect_others, extended_select ); + m_key_current=(wxGenericTreeItem*) next.m_pItem; + } + } + } + break; + + // selects the last visible tree item + case WXK_END: + { + wxTreeItemId last = GetRootItem(); + + while ( last.IsOk() && IsExpanded(last) ) + { + wxTreeItemId lastChild = GetLastChild(last); + + // it may happen if the item was expanded but then all of + // its children have been deleted - so IsExpanded() returned + // true, but GetLastChild() returned invalid item + if ( !lastChild ) + break; + + last = lastChild; + } + + if ( last.IsOk() ) + { + DoSelectItem( last, unselect_others, extended_select ); + } + } + break; + + // selects the root item + case WXK_HOME: + { + wxTreeItemId prev = GetRootItem(); + if (!prev) + break; + + if ( HasFlag(wxTR_HIDE_ROOT) ) + { + wxTreeItemIdValue cookie; + prev = GetFirstChild(prev, cookie); + if (!prev) + break; + } + + DoSelectItem( prev, unselect_others, extended_select ); + } + break; + + default: + // do not use wxIsalnum() here + if ( !event.HasModifiers() && + ((keyCode >= '0' && keyCode <= '9') || + (keyCode >= 'a' && keyCode <= 'z') || + (keyCode >= 'A' && keyCode <= 'Z' ))) + { + // find the next item starting with the given prefix + wxChar ch = (wxChar)keyCode; + + wxTreeItemId id = FindItem(m_current, m_findPrefix + ch); + if ( !id.IsOk() ) + { + // no such item + break; + } + + SelectItem(id); + + m_findPrefix += ch; + + // also start the timer to reset the current prefix if the user + // doesn't press any more alnum keys soon -- we wouldn't want + // to use this prefix for a new item search + if ( !m_findTimer ) + { + m_findTimer = new wxTreeFindTimer(this); + } + + m_findTimer->Start(wxTreeFindTimer::DELAY, wxTIMER_ONE_SHOT); + } + else + { + event.Skip(); + } + } +} + +wxTreeItemId +wxGenericTreeCtrl::DoTreeHitTest(const wxPoint& point, int& flags) const +{ + int w, h; + GetSize(&w, &h); + flags=0; + if (point.x<0) flags |= wxTREE_HITTEST_TOLEFT; + if (point.x>w) flags |= wxTREE_HITTEST_TORIGHT; + if (point.y<0) flags |= wxTREE_HITTEST_ABOVE; + if (point.y>h) flags |= wxTREE_HITTEST_BELOW; + if (flags) return wxTreeItemId(); + + if (m_anchor == NULL) + { + flags = wxTREE_HITTEST_NOWHERE; + return wxTreeItemId(); + } + + wxGenericTreeItem *hit = m_anchor->HitTest(CalcUnscrolledPosition(point), + this, flags, 0); + if (hit == NULL) + { + flags = wxTREE_HITTEST_NOWHERE; + return wxTreeItemId(); + } + return hit; +} + +// get the bounding rectangle of the item (or of its label only) +bool wxGenericTreeCtrl::GetBoundingRect(const wxTreeItemId& item, + wxRect& rect, + bool textOnly) const +{ + wxCHECK_MSG( item.IsOk(), false, _T("invalid item in wxGenericTreeCtrl::GetBoundingRect") ); + + wxGenericTreeItem *i = (wxGenericTreeItem*) item.m_pItem; + + if ( textOnly ) + { + rect.x = i->GetX(); + rect.width = i->GetWidth(); + + if ( m_imageListNormal ) + { + int image_w, image_h; + m_imageListNormal->GetSize( 0, image_w, image_h ); + rect.width += image_w + MARGIN_BETWEEN_IMAGE_AND_TEXT; + } + } + else // the entire line + { + rect.x = 0; + rect.width = GetClientSize().x; + } + + rect.y = i->GetY(); + rect.height = GetLineHeight(i); + + // we have to return the logical coordinates, not physical ones + rect.SetTopLeft(CalcScrolledPosition(rect.GetTopLeft())); + + return true; +} + +wxTextCtrl *wxGenericTreeCtrl::EditLabel(const wxTreeItemId& item, + wxClassInfo * WXUNUSED(textCtrlClass)) +{ + wxCHECK_MSG( item.IsOk(), NULL, _T("can't edit an invalid item") ); + + wxGenericTreeItem *itemEdit = (wxGenericTreeItem *)item.m_pItem; + + wxTreeEvent te(wxEVT_COMMAND_TREE_BEGIN_LABEL_EDIT, this, itemEdit); + if ( GetEventHandler()->ProcessEvent( te ) && !te.IsAllowed() ) + { + // vetoed by user + return NULL; + } + + // We have to call this here because the label in + // question might just have been added and no screen + // update taken place. + if ( m_dirty ) +#if defined( __WXMSW__ ) || defined(__WXMAC__) + Update(); +#else + DoDirtyProcessing(); +#endif + + // TODO: use textCtrlClass here to create the control of correct class + m_textCtrl = new wxTreeTextCtrl(this, itemEdit); + + m_textCtrl->SetFocus(); + + return m_textCtrl; +} + +// returns a pointer to the text edit control if the item is being +// edited, NULL otherwise (it's assumed that no more than one item may +// be edited simultaneously) +wxTextCtrl* wxGenericTreeCtrl::GetEditControl() const +{ + return m_textCtrl; +} + +void wxGenericTreeCtrl::EndEditLabel(const wxTreeItemId& WXUNUSED(item), + bool discardChanges) +{ + wxCHECK_RET( m_textCtrl, _T("not editing label") ); + + m_textCtrl->EndEdit(discardChanges); +} + +bool wxGenericTreeCtrl::OnRenameAccept(wxGenericTreeItem *item, + const wxString& value) +{ + wxTreeEvent le(wxEVT_COMMAND_TREE_END_LABEL_EDIT, this, item); + le.m_label = value; + le.m_editCancelled = false; + + return !GetEventHandler()->ProcessEvent( le ) || le.IsAllowed(); +} + +void wxGenericTreeCtrl::OnRenameCancelled(wxGenericTreeItem *item) +{ + // let owner know that the edit was cancelled + wxTreeEvent le(wxEVT_COMMAND_TREE_END_LABEL_EDIT, this, item); + le.m_label = wxEmptyString; + le.m_editCancelled = true; + + GetEventHandler()->ProcessEvent( le ); +} + +void wxGenericTreeCtrl::OnRenameTimer() +{ + EditLabel( m_current ); +} + +void wxGenericTreeCtrl::OnMouse( wxMouseEvent &event ) +{ + if ( !m_anchor )return; + + wxPoint pt = CalcUnscrolledPosition(event.GetPosition()); + + // Is the mouse over a tree item button? + int flags = 0; + wxGenericTreeItem *thisItem = m_anchor->HitTest(pt, this, flags, 0); + wxGenericTreeItem *underMouse = thisItem; +#if wxUSE_TOOLTIPS + bool underMouseChanged = (underMouse != m_underMouse) ; +#endif // wxUSE_TOOLTIPS + + if ((underMouse) && + (flags & wxTREE_HITTEST_ONITEMBUTTON) && + (!event.LeftIsDown()) && + (!m_isDragging) && + (!m_renameTimer || !m_renameTimer->IsRunning())) + { + } + else + { + underMouse = NULL; + } + + if (underMouse != m_underMouse) + { + if (m_underMouse) + { + // unhighlight old item + wxGenericTreeItem *tmp = m_underMouse; + m_underMouse = NULL; + RefreshLine( tmp ); + } + + m_underMouse = underMouse; + if (m_underMouse) + RefreshLine( m_underMouse ); + } + +#if wxUSE_TOOLTIPS + // Determines what item we are hovering over and need a tooltip for + wxTreeItemId hoverItem = thisItem; + + // We do not want a tooltip if we are dragging, or if the rename timer is running + if (underMouseChanged && hoverItem.IsOk() && !m_isDragging && (!m_renameTimer || !m_renameTimer->IsRunning())) + { + // Ask the tree control what tooltip (if any) should be shown + wxTreeEvent hevent(wxEVT_COMMAND_TREE_ITEM_GETTOOLTIP, this, hoverItem); + + if ( GetEventHandler()->ProcessEvent(hevent) && hevent.IsAllowed() ) + { + SetToolTip(hevent.m_label); + } + } +#endif + + // we process left mouse up event (enables in-place edit), middle/right down + // (pass to the user code), left dbl click (activate item) and + // dragging/moving events for items drag-and-drop + if ( !(event.LeftDown() || + event.LeftUp() || + event.MiddleDown() || + event.RightDown() || + event.LeftDClick() || + event.Dragging() || + ((event.Moving() || event.RightUp()) && m_isDragging)) ) + { + event.Skip(); + + return; + } + + + flags = 0; + wxGenericTreeItem *item = m_anchor->HitTest(pt, this, flags, 0); + + if ( event.Dragging() && !m_isDragging ) + { + if (m_dragCount == 0) + m_dragStart = pt; + + m_dragCount++; + + if (m_dragCount != 3) + { + // wait until user drags a bit further... + return; + } + + wxEventType command = event.RightIsDown() + ? wxEVT_COMMAND_TREE_BEGIN_RDRAG + : wxEVT_COMMAND_TREE_BEGIN_DRAG; + + wxTreeEvent nevent(command, this, m_current); + nevent.SetPoint(CalcScrolledPosition(pt)); + + // by default the dragging is not supported, the user code must + // explicitly allow the event for it to take place + nevent.Veto(); + + if ( GetEventHandler()->ProcessEvent(nevent) && nevent.IsAllowed() ) + { + // we're going to drag this item + m_isDragging = true; + + // remember the old cursor because we will change it while + // dragging + m_oldCursor = m_cursor; + + // in a single selection control, hide the selection temporarily + if ( !(GetWindowStyleFlag() & wxTR_MULTIPLE) ) + { + m_oldSelection = (wxGenericTreeItem*) GetSelection().m_pItem; + + if ( m_oldSelection ) + { + m_oldSelection->SetHilight(false); + RefreshLine(m_oldSelection); + } + } + + CaptureMouse(); + } + } + else if ( event.Dragging() ) + { + if ( item != m_dropTarget ) + { + // unhighlight the previous drop target + DrawDropEffect(m_dropTarget); + + m_dropTarget = item; + + // highlight the current drop target if any + DrawDropEffect(m_dropTarget); + +#if defined(__WXMSW__) || defined(__WXMAC__) || defined(__WXGTK20__) + Update(); +#else + wxYieldIfNeeded(); +#endif + } + } + else if ( (event.LeftUp() || event.RightUp()) && m_isDragging ) + { + ReleaseMouse(); + + // erase the highlighting + DrawDropEffect(m_dropTarget); + + if ( m_oldSelection ) + { + m_oldSelection->SetHilight(true); + RefreshLine(m_oldSelection); + m_oldSelection = (wxGenericTreeItem *)NULL; + } + + // generate the drag end event + wxTreeEvent eventEndDrag(wxEVT_COMMAND_TREE_END_DRAG, this, item); + + eventEndDrag.m_pointDrag = CalcScrolledPosition(pt); + + (void)GetEventHandler()->ProcessEvent(eventEndDrag); + + m_isDragging = false; + m_dropTarget = (wxGenericTreeItem *)NULL; + + SetCursor(m_oldCursor); + +#if defined( __WXMSW__ ) || defined(__WXMAC__) + Update(); +#else + wxYieldIfNeeded(); +#endif + } + else + { + // If we got to this point, we are not dragging or moving the mouse. + // Because the code in carbon/toplevel.cpp will only set focus to the tree + // if we skip for EVT_LEFT_DOWN, we MUST skip this event here for focus to work. + // We skip even if we didn't hit an item because we still should + // restore focus to the tree control even if we didn't exactly hit an item. + if ( event.LeftDown() ) + { + event.Skip(); + } + + // here we process only the messages which happen on tree items + + m_dragCount = 0; + + if (item == NULL) return; /* we hit the blank area */ + + if ( event.RightDown() ) + { + // If the item is already selected, do not update the selection. + // Multi-selections should not be cleared if a selected item is clicked. + if (!IsSelected(item)) + { + DoSelectItem(item, true, false); + } + + wxTreeEvent nevent(wxEVT_COMMAND_TREE_ITEM_RIGHT_CLICK, this, item); + nevent.m_pointDrag = CalcScrolledPosition(pt); + event.Skip(!GetEventHandler()->ProcessEvent(nevent)); + + // Consistent with MSW (for now), send the ITEM_MENU *after* + // the RIGHT_CLICK event. TODO: This behavior may change. + wxTreeEvent nevent2(wxEVT_COMMAND_TREE_ITEM_MENU, this, item); + nevent2.m_pointDrag = CalcScrolledPosition(pt); + GetEventHandler()->ProcessEvent(nevent2); + } + else if ( event.MiddleDown() ) + { + wxTreeEvent nevent(wxEVT_COMMAND_TREE_ITEM_MIDDLE_CLICK, this, item); + nevent.m_pointDrag = CalcScrolledPosition(pt); + event.Skip(!GetEventHandler()->ProcessEvent(nevent)); + } + else if ( event.LeftUp() ) + { + // this facilitates multiple-item drag-and-drop + + if ( /* item && */ HasFlag(wxTR_MULTIPLE)) + { + wxArrayTreeItemIds selections; + size_t count = GetSelections(selections); + + if (count > 1 && + !event.CmdDown() && + !event.ShiftDown()) + { + DoSelectItem(item, true, false); + } + } + + if ( m_lastOnSame ) + { + if ( (item == m_current) && + (flags & wxTREE_HITTEST_ONITEMLABEL) && + HasFlag(wxTR_EDIT_LABELS) ) + { + if ( m_renameTimer ) + { + if ( m_renameTimer->IsRunning() ) + m_renameTimer->Stop(); + } + else + { + m_renameTimer = new wxTreeRenameTimer( this ); + } + + m_renameTimer->Start( wxTreeRenameTimer::DELAY, true ); + } + + m_lastOnSame = false; + } + } + else // !RightDown() && !MiddleDown() && !LeftUp() ==> LeftDown() || LeftDClick() + { + if ( event.LeftDown() ) + { + m_lastOnSame = item == m_current; + } + + if ( flags & wxTREE_HITTEST_ONITEMBUTTON ) + { + // only toggle the item for a single click, double click on + // the button doesn't do anything (it toggles the item twice) + if ( event.LeftDown() ) + { + Toggle( item ); + } + + // don't select the item if the button was clicked + return; + } + + + // clear the previously selected items, if the + // user clicked outside of the present selection. + // otherwise, perform the deselection on mouse-up. + // this allows multiple drag and drop to work. + // but if Cmd is down, toggle selection of the clicked item + if (!IsSelected(item) || event.CmdDown()) + { + // how should the selection work for this event? + bool is_multiple, extended_select, unselect_others; + EventFlagsToSelType(GetWindowStyleFlag(), + event.ShiftDown(), + event.CmdDown(), + is_multiple, extended_select, unselect_others); + + DoSelectItem(item, unselect_others, extended_select); + } + + + // For some reason, Windows isn't recognizing a left double-click, + // so we need to simulate it here. Allow 200 milliseconds for now. + if ( event.LeftDClick() ) + { + // double clicking should not start editing the item label + if ( m_renameTimer ) + m_renameTimer->Stop(); + + m_lastOnSame = false; + + // send activate event first + wxTreeEvent nevent(wxEVT_COMMAND_TREE_ITEM_ACTIVATED, this, item); + nevent.m_pointDrag = CalcScrolledPosition(pt); + if ( !GetEventHandler()->ProcessEvent( nevent ) ) + { + // if the user code didn't process the activate event, + // handle it ourselves by toggling the item when it is + // double clicked + if ( item->HasPlus() ) + { + Toggle(item); + } + } + } + } + } +} + +void wxGenericTreeCtrl::OnInternalIdle() +{ + wxWindow::OnInternalIdle(); + + // Check if we need to select the root item + // because nothing else has been selected. + // Delaying it means that we can invoke event handlers + // as required, when a first item is selected. + if (!HasFlag(wxTR_MULTIPLE) && !GetSelection().IsOk()) + { + if (m_select_me) + SelectItem(m_select_me); + else if (GetRootItem().IsOk()) + SelectItem(GetRootItem()); + } + + // after all changes have been done to the tree control, + // actually redraw the tree when everything is over + if (m_dirty) + DoDirtyProcessing(); +} + +void wxGenericTreeCtrl::CalculateSize( wxGenericTreeItem *item, wxDC &dc ) +{ + wxCoord text_w = 0; + wxCoord text_h = 0; + + wxTreeItemAttr *attr = item->GetAttributes(); + if ( attr && attr->HasFont() ) + dc.SetFont(attr->GetFont()); + else if ( item->IsBold() ) + dc.SetFont(m_boldFont); + else + dc.SetFont(m_normalFont); + + dc.GetTextExtent( item->GetText(), &text_w, &text_h ); + text_h+=2; + + // restore normal font + dc.SetFont( m_normalFont ); + + int image_h = 0; + int image_w = 0; + int image = item->GetCurrentImage(); + if ( image != NO_IMAGE ) + { + if ( m_imageListNormal ) + { + m_imageListNormal->GetSize( image, image_w, image_h ); + image_w += MARGIN_BETWEEN_IMAGE_AND_TEXT; + } + } + + int total_h = (image_h > text_h) ? image_h : text_h; + + if (total_h < 30) + total_h += 2; // at least 2 pixels + else + total_h += total_h/10; // otherwise 10% extra spacing + + item->SetHeight(total_h); + if (total_h>m_lineHeight) + m_lineHeight=total_h; + + item->SetWidth(image_w+text_w+2); +} + +// ----------------------------------------------------------------------------- +// for developper : y is now the top of the level +// not the middle of it ! +void wxGenericTreeCtrl::CalculateLevel( wxGenericTreeItem *item, wxDC &dc, int level, int &y ) +{ + int x = level*m_indent; + if (!HasFlag(wxTR_HIDE_ROOT)) + { + x += m_indent; + } + else if (level == 0) + { + // a hidden root is not evaluated, but its + // children are always calculated + goto Recurse; + } + + CalculateSize( item, dc ); + + // set its position + item->SetX( x+m_spacing ); + item->SetY( y ); + y += GetLineHeight(item); + + if ( !item->IsExpanded() ) + { + // we don't need to calculate collapsed branches + return; + } + + Recurse: + wxArrayGenericTreeItems& children = item->GetChildren(); + size_t n, count = children.Count(); + ++level; + for (n = 0; n < count; ++n ) + CalculateLevel( children[n], dc, level, y ); // recurse +} + +void wxGenericTreeCtrl::CalculatePositions() +{ + if ( !m_anchor ) return; + + wxClientDC dc(this); + PrepareDC( dc ); + + dc.SetFont( m_normalFont ); + + dc.SetPen( m_dottedPen ); + //if(GetImageList() == NULL) + // m_lineHeight = (int)(dc.GetCharHeight() + 4); + + int y = 2; + CalculateLevel( m_anchor, dc, 0, y ); // start recursion +} + +void wxGenericTreeCtrl::Refresh(bool eraseBackground, const wxRect *rect) +{ + if ( !m_freezeCount ) + wxTreeCtrlBase::Refresh(eraseBackground, rect); +} + +void wxGenericTreeCtrl::RefreshSubtree(wxGenericTreeItem *item) +{ + if (m_dirty || m_freezeCount) + return; + + wxSize client = GetClientSize(); + + wxRect rect; + CalcScrolledPosition(0, item->GetY(), NULL, &rect.y); + rect.width = client.x; + rect.height = client.y; + + Refresh(true, &rect); + + AdjustMyScrollbars(); +} + +void wxGenericTreeCtrl::RefreshLine( wxGenericTreeItem *item ) +{ + if (m_dirty || m_freezeCount) + return; + + wxRect rect; + CalcScrolledPosition(0, item->GetY(), NULL, &rect.y); + rect.width = GetClientSize().x; + rect.height = GetLineHeight(item); //dc.GetCharHeight() + 6; + + Refresh(true, &rect); +} + +void wxGenericTreeCtrl::RefreshSelected() +{ + if (m_freezeCount) + return; + + // TODO: this is awfully inefficient, we should keep the list of all + // selected items internally, should be much faster + if ( m_anchor ) + RefreshSelectedUnder(m_anchor); +} + +void wxGenericTreeCtrl::RefreshSelectedUnder(wxGenericTreeItem *item) +{ + if (m_freezeCount) + return; + + if ( item->IsSelected() ) + RefreshLine(item); + + const wxArrayGenericTreeItems& children = item->GetChildren(); + size_t count = children.GetCount(); + for ( size_t n = 0; n < count; n++ ) + { + RefreshSelectedUnder(children[n]); + } +} + +void wxGenericTreeCtrl::Freeze() +{ + m_freezeCount++; +} + +void wxGenericTreeCtrl::Thaw() +{ + wxCHECK_RET( m_freezeCount > 0, _T("thawing unfrozen tree control?") ); + + if ( --m_freezeCount == 0 ) + { + Refresh(); + } +} + +// ---------------------------------------------------------------------------- +// changing colours: we need to refresh the tree control +// ---------------------------------------------------------------------------- + +bool wxGenericTreeCtrl::SetBackgroundColour(const wxColour& colour) +{ + if ( !wxWindow::SetBackgroundColour(colour) ) + return false; + + Refresh(); + + return true; +} + +bool wxGenericTreeCtrl::SetForegroundColour(const wxColour& colour) +{ + if ( !wxWindow::SetForegroundColour(colour) ) + return false; + + Refresh(); + + return true; +} + +// Process the tooltip event, to speed up event processing. +// Doesn't actually get a tooltip. +void wxGenericTreeCtrl::OnGetToolTip( wxTreeEvent &event ) +{ + event.Veto(); +} + + +// NOTE: If using the wxListBox visual attributes works everywhere then this can +// be removed, as well as the #else case below. +#define _USE_VISATTR 0 + +//static +wxVisualAttributes +#if _USE_VISATTR +wxGenericTreeCtrl::GetClassDefaultAttributes(wxWindowVariant variant) +#else +wxGenericTreeCtrl::GetClassDefaultAttributes(wxWindowVariant WXUNUSED(variant)) +#endif +{ +#if _USE_VISATTR + // Use the same color scheme as wxListBox + return wxListBox::GetClassDefaultAttributes(variant); +#else + wxVisualAttributes attr; + attr.colFg = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT); + attr.colBg = wxSystemSettings::GetColour(wxSYS_COLOUR_LISTBOX); + attr.font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT); + return attr; +#endif +} + +#if WXWIN_COMPATIBILITY_2_4 + +int wxGenericTreeCtrl::GetItemSelectedImage(const wxTreeItemId& item) const +{ + return GetItemImage(item, wxTreeItemIcon_Selected); +} + +void wxGenericTreeCtrl::SetItemSelectedImage(const wxTreeItemId& item, int image) +{ + SetItemImage(item, image, wxTreeItemIcon_Selected); +} + +#endif // WXWIN_COMPATIBILITY_2_4 + +void wxGenericTreeCtrl::DoDirtyProcessing() +{ + if (m_freezeCount) + return; + + m_dirty = false; + + CalculatePositions(); + Refresh(); + AdjustMyScrollbars(); +} + +wxSize wxGenericTreeCtrl::DoGetBestSize() const +{ + // make sure all positions are calculated as normally this only done during + // idle time but we need them for base class DoGetBestSize() to return the + // correct result + wxConstCast(this, wxGenericTreeCtrl)->CalculatePositions(); + + wxSize size = wxTreeCtrlBase::DoGetBestSize(); + + // there seems to be an implicit extra border around the items, although + // I'm not really sure where does it come from -- but without this, the + // scrollbars appear in a tree with default/best size + size.IncBy(4, 4); + + // and the border has to be rounded up to a multiple of PIXELS_PER_UNIT or + // scrollbars still appear + const wxSize& borderSize = GetWindowBorderSize(); + + int dx = (size.x - borderSize.x) % PIXELS_PER_UNIT; + if ( dx ) + size.x += PIXELS_PER_UNIT - dx; + int dy = (size.y - borderSize.y) % PIXELS_PER_UNIT; + if ( dy ) + size.y += PIXELS_PER_UNIT - dy; + + // we need to update the cache too as the base class cached its own value + CacheBestSize(size); + + return size; +} + +#endif // wxUSE_TREECTRL diff --git a/Externals/wxWidgets/src/generic/vlbox.cpp b/Externals/wxWidgets/src/generic/vlbox.cpp new file mode 100644 index 0000000000..34742968e8 --- /dev/null +++ b/Externals/wxWidgets/src/generic/vlbox.cpp @@ -0,0 +1,649 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/generic/vlbox.cpp +// Purpose: implementation of wxVListBox +// Author: Vadim Zeitlin +// Modified by: +// Created: 31.05.03 +// RCS-ID: $Id: vlbox.cpp 41810 2006-10-09 16:39:34Z VZ $ +// Copyright: (c) 2003 Vadim Zeitlin +// License: wxWindows license +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_LISTBOX + +#include "wx/vlbox.h" + +#ifndef WX_PRECOMP + #include "wx/settings.h" + #include "wx/dcclient.h" + #include "wx/listbox.h" +#endif //WX_PRECOMP + +#include "wx/dcbuffer.h" +#include "wx/selstore.h" + +// ---------------------------------------------------------------------------- +// event tables +// ---------------------------------------------------------------------------- + +BEGIN_EVENT_TABLE(wxVListBox, wxVScrolledWindow) + EVT_PAINT(wxVListBox::OnPaint) + + EVT_KEY_DOWN(wxVListBox::OnKeyDown) + EVT_LEFT_DOWN(wxVListBox::OnLeftDown) + EVT_LEFT_DCLICK(wxVListBox::OnLeftDClick) +END_EVENT_TABLE() + +// ============================================================================ +// implementation +// ============================================================================ + +IMPLEMENT_ABSTRACT_CLASS(wxVListBox, wxVScrolledWindow) + +// ---------------------------------------------------------------------------- +// wxVListBox creation +// ---------------------------------------------------------------------------- + +void wxVListBox::Init() +{ + m_current = + m_anchor = wxNOT_FOUND; + m_selStore = NULL; +} + +bool wxVListBox::Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + long style, + const wxString& name) +{ + style |= wxWANTS_CHARS | wxFULL_REPAINT_ON_RESIZE; + if ( !wxVScrolledWindow::Create(parent, id, pos, size, style, name) ) + return false; + + if ( style & wxLB_MULTIPLE ) + m_selStore = new wxSelectionStore; + + // make sure the native widget has the right colour since we do + // transparent drawing by default + SetBackgroundColour(GetBackgroundColour()); + m_colBgSel = wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHT); + + // flicker-free drawing requires this + SetBackgroundStyle(wxBG_STYLE_CUSTOM); + + return true; +} + +wxVListBox::~wxVListBox() +{ + delete m_selStore; +} + +void wxVListBox::SetItemCount(size_t count) +{ + if ( m_selStore ) + { + // tell the selection store that our number of items has changed + m_selStore->SetItemCount(count); + } + + SetLineCount(count); +} + +// ---------------------------------------------------------------------------- +// selection handling +// ---------------------------------------------------------------------------- + +bool wxVListBox::IsSelected(size_t line) const +{ + return m_selStore ? m_selStore->IsSelected(line) : (int)line == m_current; +} + +bool wxVListBox::Select(size_t item, bool select) +{ + wxCHECK_MSG( m_selStore, false, + _T("Select() may only be used with multiselection listbox") ); + + wxCHECK_MSG( item < GetItemCount(), false, + _T("Select(): invalid item index") ); + + bool changed = m_selStore->SelectItem(item, select); + if ( changed ) + { + // selection really changed + RefreshLine(item); + } + + DoSetCurrent(item); + + return changed; +} + +bool wxVListBox::SelectRange(size_t from, size_t to) +{ + wxCHECK_MSG( m_selStore, false, + _T("SelectRange() may only be used with multiselection listbox") ); + + // make sure items are in correct order + if ( from > to ) + { + size_t tmp = from; + from = to; + to = tmp; + } + + wxCHECK_MSG( to < GetItemCount(), false, + _T("SelectRange(): invalid item index") ); + + wxArrayInt changed; + if ( !m_selStore->SelectRange(from, to, true, &changed) ) + { + // too many items have changed, we didn't record them in changed array + // so we have no choice but to refresh everything between from and to + RefreshLines(from, to); + } + else // we've got the indices of the changed items + { + const size_t count = changed.GetCount(); + if ( !count ) + { + // nothing changed + return false; + } + + // refresh just the lines which have really changed + for ( size_t n = 0; n < count; n++ ) + { + RefreshLine(changed[n]); + } + } + + // something changed + return true; +} + +bool wxVListBox::DoSelectAll(bool select) +{ + wxCHECK_MSG( m_selStore, false, + _T("SelectAll may only be used with multiselection listbox") ); + + size_t count = GetItemCount(); + if ( count ) + { + wxArrayInt changed; + if ( !m_selStore->SelectRange(0, count - 1, select) || + !changed.IsEmpty() ) + { + Refresh(); + + // something changed + return true; + } + } + + return false; +} + +bool wxVListBox::DoSetCurrent(int current) +{ + wxASSERT_MSG( current == wxNOT_FOUND || + (current >= 0 && (size_t)current < GetItemCount()), + _T("wxVListBox::DoSetCurrent(): invalid item index") ); + + if ( current == m_current ) + { + // nothing to do + return false; + } + + if ( m_current != wxNOT_FOUND ) + RefreshLine(m_current); + + m_current = current; + + if ( m_current != wxNOT_FOUND ) + { + // if the line is not visible at all, we scroll it into view but we + // don't need to refresh it -- it will be redrawn anyhow + if ( !IsVisible(m_current) ) + { + ScrollToLine(m_current); + } + else // line is at least partly visible + { + // it is, indeed, only partly visible, so scroll it into view to + // make it entirely visible + while ( (size_t)m_current == GetLastVisibleLine() && + ScrollToLine(GetVisibleBegin()+1) ) ; + + // but in any case refresh it as even if it was only partly visible + // before we need to redraw it entirely as its background changed + RefreshLine(m_current); + } + } + + return true; +} + +void wxVListBox::SendSelectedEvent() +{ + wxASSERT_MSG( m_current != wxNOT_FOUND, + _T("SendSelectedEvent() shouldn't be called") ); + + wxCommandEvent event(wxEVT_COMMAND_LISTBOX_SELECTED, GetId()); + event.SetEventObject(this); + event.SetInt(m_current); + + (void)GetEventHandler()->ProcessEvent(event); +} + +void wxVListBox::SetSelection(int selection) +{ + wxCHECK_RET( selection == wxNOT_FOUND || + (selection >= 0 && (size_t)selection < GetItemCount()), + _T("wxVListBox::SetSelection(): invalid item index") ); + + if ( HasMultipleSelection() ) + { + if (selection != wxNOT_FOUND) + Select(selection); + else + DeselectAll(); + m_anchor = selection; + } + + DoSetCurrent(selection); +} + +size_t wxVListBox::GetSelectedCount() const +{ + return m_selStore ? m_selStore->GetSelectedCount() + : m_current == wxNOT_FOUND ? 0 : 1; +} + +int wxVListBox::GetFirstSelected(unsigned long& cookie) const +{ + cookie = 0; + + return GetNextSelected(cookie); +} + +int wxVListBox::GetNextSelected(unsigned long& cookie) const +{ + wxCHECK_MSG( m_selStore, wxNOT_FOUND, + _T("GetFirst/NextSelected() may only be used with multiselection listboxes") ); + + while ( cookie < GetItemCount() ) + { + if ( IsSelected(cookie++) ) + return cookie - 1; + } + + return wxNOT_FOUND; +} + +// ---------------------------------------------------------------------------- +// wxVListBox appearance parameters +// ---------------------------------------------------------------------------- + +void wxVListBox::SetMargins(const wxPoint& pt) +{ + if ( pt != m_ptMargins ) + { + m_ptMargins = pt; + + Refresh(); + } +} + +void wxVListBox::SetSelectionBackground(const wxColour& col) +{ + m_colBgSel = col; +} + +// ---------------------------------------------------------------------------- +// wxVListBox painting +// ---------------------------------------------------------------------------- + +wxCoord wxVListBox::OnGetLineHeight(size_t line) const +{ + return OnMeasureItem(line) + 2*m_ptMargins.y; +} + +void wxVListBox::OnDrawSeparator(wxDC& WXUNUSED(dc), + wxRect& WXUNUSED(rect), + size_t WXUNUSED(n)) const +{ +} + +void wxVListBox::OnDrawBackground(wxDC& dc, const wxRect& rect, size_t n) const +{ + // we need to render selected and current items differently + const bool isSelected = IsSelected(n), + isCurrent = IsCurrent(n); + if ( isSelected || isCurrent ) + { + if ( isSelected ) + { + dc.SetBrush(wxBrush(m_colBgSel, wxSOLID)); + } + else // !selected + { + dc.SetBrush(*wxTRANSPARENT_BRUSH); + } + + dc.SetPen(*(isCurrent ? wxBLACK_PEN : wxTRANSPARENT_PEN)); + + dc.DrawRectangle(rect); + } + //else: do nothing for the normal items +} + +void wxVListBox::OnPaint(wxPaintEvent& WXUNUSED(event)) +{ + wxSize clientSize = GetClientSize(); + + wxAutoBufferedPaintDC dc(this); + + // the update rectangle + wxRect rectUpdate = GetUpdateClientRect(); + + // fill it with background colour + dc.SetBackground(GetBackgroundColour()); + dc.Clear(); + + // the bounding rectangle of the current line + wxRect rectLine; + rectLine.width = clientSize.x; + + // iterate over all visible lines + const size_t lineMax = GetVisibleEnd(); + for ( size_t line = GetFirstVisibleLine(); line < lineMax; line++ ) + { + const wxCoord hLine = OnGetLineHeight(line); + + rectLine.height = hLine; + + // and draw the ones which intersect the update rect + if ( rectLine.Intersects(rectUpdate) ) + { + // don't allow drawing outside of the lines rectangle + wxDCClipper clip(dc, rectLine); + + wxRect rect = rectLine; + OnDrawBackground(dc, rect, line); + + OnDrawSeparator(dc, rect, line); + + rect.Deflate(m_ptMargins.x, m_ptMargins.y); + OnDrawItem(dc, rect, line); + } + else // no intersection + { + if ( rectLine.GetTop() > rectUpdate.GetBottom() ) + { + // we are already below the update rect, no need to continue + // further + break; + } + //else: the next line may intersect the update rect + } + + rectLine.y += hLine; + } +} + +// ============================================================================ +// wxVListBox keyboard/mouse handling +// ============================================================================ + +void wxVListBox::DoHandleItemClick(int item, int flags) +{ + // has anything worth telling the client code about happened? + bool notify = false; + + if ( HasMultipleSelection() ) + { + // select the iteem clicked? + bool select = true; + + // NB: the keyboard interface we implement here corresponds to + // wxLB_EXTENDED rather than wxLB_MULTIPLE but this one makes more + // sense IMHO + if ( flags & ItemClick_Shift ) + { + if ( m_current != wxNOT_FOUND ) + { + if ( m_anchor == wxNOT_FOUND ) + m_anchor = m_current; + + select = false; + + // only the range from the selection anchor to new m_current + // must be selected + if ( DeselectAll() ) + notify = true; + + if ( SelectRange(m_anchor, item) ) + notify = true; + } + //else: treat it as ordinary click/keypress + } + else // Shift not pressed + { + m_anchor = item; + + if ( flags & ItemClick_Ctrl ) + { + select = false; + + if ( !(flags & ItemClick_Kbd) ) + { + Toggle(item); + + // the status of the item has definitely changed + notify = true; + } + //else: Ctrl-arrow pressed, don't change selection + } + //else: behave as in single selection case + } + + if ( select ) + { + // make the clicked item the only selection + if ( DeselectAll() ) + notify = true; + + if ( Select(item) ) + notify = true; + } + } + + // in any case the item should become the current one + if ( DoSetCurrent(item) ) + { + if ( !HasMultipleSelection() ) + { + // this has also changed the selection for single selection case + notify = true; + } + } + + if ( notify ) + { + // notify the user about the selection change + SendSelectedEvent(); + } + //else: nothing changed at all +} + +// ---------------------------------------------------------------------------- +// keyboard handling +// ---------------------------------------------------------------------------- + +void wxVListBox::OnKeyDown(wxKeyEvent& event) +{ + // flags for DoHandleItemClick() + int flags = ItemClick_Kbd; + + int current; + switch ( event.GetKeyCode() ) + { + case WXK_HOME: + current = 0; + break; + + case WXK_END: + current = GetLineCount() - 1; + break; + + case WXK_DOWN: + if ( m_current == (int)GetLineCount() - 1 ) + return; + + current = m_current + 1; + break; + + case WXK_UP: + if ( m_current == wxNOT_FOUND ) + current = GetLineCount() - 1; + else if ( m_current != 0 ) + current = m_current - 1; + else // m_current == 0 + return; + break; + + case WXK_PAGEDOWN: + PageDown(); + current = GetFirstVisibleLine(); + break; + + case WXK_PAGEUP: + if ( m_current == (int)GetFirstVisibleLine() ) + { + PageUp(); + } + + current = GetFirstVisibleLine(); + break; + + case WXK_SPACE: + // hack: pressing space should work like a mouse click rather than + // like a keyboard arrow press, so trick DoHandleItemClick() in + // thinking we were clicked + flags &= ~ItemClick_Kbd; + current = m_current; + break; + +#ifdef __WXMSW__ + case WXK_TAB: + // Since we are using wxWANTS_CHARS we need to send navigation + // events for the tabs on MSW + { + wxNavigationKeyEvent ne; + ne.SetDirection(!event.ShiftDown()); + ne.SetCurrentFocus(this); + ne.SetEventObject(this); + GetParent()->GetEventHandler()->ProcessEvent(ne); + } + // fall through to default +#endif + default: + event.Skip(); + current = 0; // just to silent the stupid compiler warnings + wxUnusedVar(current); + return; + } + + if ( event.ShiftDown() ) + flags |= ItemClick_Shift; + if ( event.ControlDown() ) + flags |= ItemClick_Ctrl; + + DoHandleItemClick(current, flags); +} + +// ---------------------------------------------------------------------------- +// wxVListBox mouse handling +// ---------------------------------------------------------------------------- + +void wxVListBox::OnLeftDown(wxMouseEvent& event) +{ + SetFocus(); + + int item = HitTest(event.GetPosition()); + + if ( item != wxNOT_FOUND ) + { + int flags = 0; + if ( event.ShiftDown() ) + flags |= ItemClick_Shift; + + // under Mac Apple-click is used in the same way as Ctrl-click + // elsewhere +#ifdef __WXMAC__ + if ( event.MetaDown() ) +#else + if ( event.ControlDown() ) +#endif + flags |= ItemClick_Ctrl; + + DoHandleItemClick(item, flags); + } +} + +void wxVListBox::OnLeftDClick(wxMouseEvent& eventMouse) +{ + int item = HitTest(eventMouse.GetPosition()); + if ( item != wxNOT_FOUND ) + { + + // if item double-clicked was not yet selected, then treat + // this event as a left-click instead + if ( item == m_current ) + { + wxCommandEvent event(wxEVT_COMMAND_LISTBOX_DOUBLECLICKED, GetId()); + event.SetEventObject(this); + event.SetInt(item); + + (void)GetEventHandler()->ProcessEvent(event); + } + else + { + OnLeftDown(eventMouse); + } + + } +} + + +// ---------------------------------------------------------------------------- +// use the same default attributes as wxListBox +// ---------------------------------------------------------------------------- + +//static +wxVisualAttributes +wxVListBox::GetClassDefaultAttributes(wxWindowVariant variant) +{ + return wxListBox::GetClassDefaultAttributes(variant); +} + +#endif diff --git a/Externals/wxWidgets/src/generic/vscroll.cpp b/Externals/wxWidgets/src/generic/vscroll.cpp new file mode 100644 index 0000000000..a01e001431 --- /dev/null +++ b/Externals/wxWidgets/src/generic/vscroll.cpp @@ -0,0 +1,513 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/generic/vscroll.cpp +// Purpose: wxVScrolledWindow implementation +// Author: Vadim Zeitlin +// Modified by: +// Created: 30.05.03 +// RCS-ID: $Id: vscroll.cpp 40624 2006-08-16 12:17:05Z MW $ +// Copyright: (c) 2003 Vadim Zeitlin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ +#pragma hdrstop +#endif + +#ifndef WX_PRECOMP + #include "wx/sizer.h" +#endif + +#include "wx/vscroll.h" + +// ---------------------------------------------------------------------------- +// event tables +// ---------------------------------------------------------------------------- + +BEGIN_EVENT_TABLE(wxVScrolledWindow, wxPanel) + EVT_SIZE(wxVScrolledWindow::OnSize) + EVT_SCROLLWIN(wxVScrolledWindow::OnScroll) +#if wxUSE_MOUSEWHEEL + EVT_MOUSEWHEEL(wxVScrolledWindow::OnMouseWheel) +#endif +END_EVENT_TABLE() + + +// ============================================================================ +// implementation +// ============================================================================ + +IMPLEMENT_ABSTRACT_CLASS(wxVScrolledWindow, wxPanel) + +// ---------------------------------------------------------------------------- +// initialization +// ---------------------------------------------------------------------------- + +void wxVScrolledWindow::Init() +{ + // we're initially empty + m_lineMax = + m_lineFirst = 0; + + // this one should always be strictly positive + m_nVisible = 1; + + m_heightTotal = 0; + +#if wxUSE_MOUSEWHEEL + m_sumWheelRotation = 0; +#endif +} + +// ---------------------------------------------------------------------------- +// various helpers +// ---------------------------------------------------------------------------- + +wxCoord wxVScrolledWindow::EstimateTotalHeight() const +{ + // estimate the total height: it is impossible to call + // OnGetLineHeight() for every line because there may be too many of + // them, so we just make a guess using some lines in the beginning, + // some in the end and some in the middle + static const size_t NUM_LINES_TO_SAMPLE = 10; + + wxCoord heightTotal; + if ( m_lineMax < 3*NUM_LINES_TO_SAMPLE ) + { + // in this case calculating exactly is faster and more correct than + // guessing + heightTotal = GetLinesHeight(0, m_lineMax); + } + else // too many lines to calculate exactly + { + // look at some lines in the beginning/middle/end + heightTotal = + GetLinesHeight(0, NUM_LINES_TO_SAMPLE) + + GetLinesHeight(m_lineMax - NUM_LINES_TO_SAMPLE, m_lineMax) + + GetLinesHeight(m_lineMax/2 - NUM_LINES_TO_SAMPLE/2, + m_lineMax/2 + NUM_LINES_TO_SAMPLE/2); + + // use the height of the lines we looked as the average + heightTotal = (wxCoord) + (((float)heightTotal / (3*NUM_LINES_TO_SAMPLE)) * m_lineMax); + } + + return heightTotal; +} + +wxCoord wxVScrolledWindow::GetLinesHeight(size_t lineMin, size_t lineMax) const +{ + if ( lineMin == lineMax ) + return 0; + else if ( lineMin > lineMax ) + return -GetLinesHeight(lineMax, lineMin); + //else: lineMin < lineMax + + // let the user code know that we're going to need all these lines + OnGetLinesHint(lineMin, lineMax); + + // do sum up their heights + wxCoord height = 0; + for ( size_t line = lineMin; line < lineMax; line++ ) + { + height += OnGetLineHeight(line); + } + + return height; +} + +size_t wxVScrolledWindow::FindFirstFromBottom(size_t lineLast, bool full) +{ + const wxCoord hWindow = GetClientSize().y; + + // go upwards until we arrive at a line such that lineLast is not visible + // any more when it is shown + size_t lineFirst = lineLast; + wxCoord h = 0; + for ( ;; ) + { + h += OnGetLineHeight(lineFirst); + + if ( h > hWindow ) + { + // for this line to be fully visible we need to go one line + // down, but if it is enough for it to be only partly visible then + // this line will do as well + if ( full ) + { + lineFirst++; + } + + break; + } + + if ( !lineFirst ) + break; + + lineFirst--; + } + + return lineFirst; +} + +void wxVScrolledWindow::RemoveScrollbar() +{ + m_lineFirst = 0; + m_nVisible = m_lineMax; + SetScrollbar(wxVERTICAL, 0, 0, 0); +} + +void wxVScrolledWindow::UpdateScrollbar() +{ + // see how many lines can we fit on screen + const wxCoord hWindow = GetClientSize().y; + + wxCoord h = 0; + size_t line; + for ( line = m_lineFirst; line < m_lineMax; line++ ) + { + if ( h > hWindow ) + break; + + h += OnGetLineHeight(line); + } + + // if we still have remaining space below, maybe we can fit everything? + if ( h < hWindow ) + { + wxCoord hAll = h; + for ( size_t lineFirst = m_lineFirst; lineFirst > 0; lineFirst-- ) + { + hAll += OnGetLineHeight(m_lineFirst - 1); + if ( hAll > hWindow ) + break; + } + + if ( hAll < hWindow ) + { + // we don't need scrollbar at all + RemoveScrollbar(); + return; + } + } + + m_nVisible = line - m_lineFirst; + + int pageSize = m_nVisible; + if ( h > hWindow ) + { + // last line is only partially visible, we still need the scrollbar and + // so we have to "fix" pageSize because if it is equal to m_lineMax the + // scrollbar is not shown at all under MSW + pageSize--; + } + + // set the scrollbar parameters to reflect this + SetScrollbar(wxVERTICAL, m_lineFirst, pageSize, m_lineMax); +} + +// ---------------------------------------------------------------------------- +// operations +// ---------------------------------------------------------------------------- + +void wxVScrolledWindow::SetLineCount(size_t count) +{ + // save the number of lines + m_lineMax = count; + + // and our estimate for their total height + m_heightTotal = EstimateTotalHeight(); + + // recalculate the scrollbars parameters + if ( count ) + { + m_lineFirst = 1; // make sure it is != 0 + ScrollToLine(0); + } + else // no items + { + RemoveScrollbar(); + } +} + +void wxVScrolledWindow::RefreshLine(size_t line) +{ + // is this line visible? + if ( !IsVisible(line) ) + { + // no, it is useless to do anything + return; + } + + // calculate the rect occupied by this line on screen + wxRect rect; + rect.width = GetClientSize().x; + rect.height = OnGetLineHeight(line); + for ( size_t n = GetVisibleBegin(); n < line; n++ ) + { + rect.y += OnGetLineHeight(n); + } + + // do refresh it + RefreshRect(rect); +} + +void wxVScrolledWindow::RefreshLines(size_t from, size_t to) +{ + wxASSERT_MSG( from <= to, _T("RefreshLines(): empty range") ); + + // clump the range to just the visible lines -- it is useless to refresh + // the other ones + if ( from < GetVisibleBegin() ) + from = GetVisibleBegin(); + + if ( to >= GetVisibleEnd() ) + to = GetVisibleEnd(); + else + to++; + + // calculate the rect occupied by these lines on screen + wxRect rect; + rect.width = GetClientSize().x; + for ( size_t nBefore = GetVisibleBegin(); nBefore < from; nBefore++ ) + { + rect.y += OnGetLineHeight(nBefore); + } + + for ( size_t nBetween = from; nBetween < to; nBetween++ ) + { + rect.height += OnGetLineHeight(nBetween); + } + + // do refresh it + RefreshRect(rect); +} + +void wxVScrolledWindow::RefreshAll() +{ + UpdateScrollbar(); + + Refresh(); +} + +bool wxVScrolledWindow::Layout() +{ + if ( GetSizer() ) + { + // adjust the sizer dimensions/position taking into account the + // virtual size and scrolled position of the window. + + int w = 0, h = 0; + GetVirtualSize(&w, &h); + + // x is always 0 so no variable needed + int y = -GetLinesHeight(0, GetFirstVisibleLine()); + + GetSizer()->SetDimension(0, y, w, h); + return true; + } + + // fall back to default for LayoutConstraints + return wxPanel::Layout(); +} + +int wxVScrolledWindow::HitTest(wxCoord WXUNUSED(x), wxCoord y) const +{ + const size_t lineMax = GetVisibleEnd(); + for ( size_t line = GetVisibleBegin(); line < lineMax; line++ ) + { + y -= OnGetLineHeight(line); + if ( y < 0 ) + return line; + } + + return wxNOT_FOUND; +} + +// ---------------------------------------------------------------------------- +// scrolling +// ---------------------------------------------------------------------------- + +bool wxVScrolledWindow::ScrollToLine(size_t line) +{ + if ( !m_lineMax ) + { + // we're empty, code below doesn't make sense in this case + return false; + } + + // determine the real first line to scroll to: we shouldn't scroll beyond + // the end + size_t lineFirstLast = FindFirstFromBottom(m_lineMax - 1, true); + if ( line > lineFirstLast ) + line = lineFirstLast; + + // anything to do? + if ( line == m_lineFirst ) + { + // no + return false; + } + + + // remember the currently shown lines for the refresh code below + size_t lineFirstOld = GetVisibleBegin(), + lineLastOld = GetVisibleEnd(); + + m_lineFirst = line; + + + // the size of scrollbar thumb could have changed + UpdateScrollbar(); + + + // finally refresh the display -- but only redraw as few lines as possible + // to avoid flicker + if ( GetVisibleBegin() >= lineLastOld || + GetVisibleEnd() <= lineFirstOld ) + { + // the simplest case: we don't have any old lines left, just redraw + // everything + Refresh(); + } + else // overlap between the lines we showed before and should show now + { + ScrollWindow(0, GetLinesHeight(GetVisibleBegin(), lineFirstOld)); + } + + return true; +} + +bool wxVScrolledWindow::ScrollLines(int lines) +{ + lines += m_lineFirst; + if ( lines < 0 ) + lines = 0; + + return ScrollToLine(lines); +} + +bool wxVScrolledWindow::ScrollPages(int pages) +{ + bool didSomething = false; + + while ( pages ) + { + int line; + if ( pages > 0 ) + { + line = GetVisibleEnd(); + if ( line ) + line--; + pages--; + } + else // pages < 0 + { + line = FindFirstFromBottom(GetVisibleBegin()); + pages++; + } + + didSomething = ScrollToLine(line); + } + + return didSomething; +} + +// ---------------------------------------------------------------------------- +// event handling +// ---------------------------------------------------------------------------- + +void wxVScrolledWindow::OnSize(wxSizeEvent& event) +{ + UpdateScrollbar(); + + event.Skip(); +} + +void wxVScrolledWindow::OnScroll(wxScrollWinEvent& event) +{ + size_t lineFirstNew; + + const wxEventType evtType = event.GetEventType(); + + if ( evtType == wxEVT_SCROLLWIN_TOP ) + { + lineFirstNew = 0; + } + else if ( evtType == wxEVT_SCROLLWIN_BOTTOM ) + { + lineFirstNew = m_lineMax; + } + else if ( evtType == wxEVT_SCROLLWIN_LINEUP ) + { + lineFirstNew = m_lineFirst ? m_lineFirst - 1 : 0; + } + else if ( evtType == wxEVT_SCROLLWIN_LINEDOWN ) + { + lineFirstNew = m_lineFirst + 1; + } + else if ( evtType == wxEVT_SCROLLWIN_PAGEUP ) + { + lineFirstNew = FindFirstFromBottom(m_lineFirst); + } + else if ( evtType == wxEVT_SCROLLWIN_PAGEDOWN ) + { + lineFirstNew = GetVisibleEnd(); + if ( lineFirstNew ) + lineFirstNew--; + } + else if ( evtType == wxEVT_SCROLLWIN_THUMBRELEASE ) + { + lineFirstNew = event.GetPosition(); + } + else if ( evtType == wxEVT_SCROLLWIN_THUMBTRACK ) + { + lineFirstNew = event.GetPosition(); + } + + else // unknown scroll event? + { + wxFAIL_MSG( _T("unknown scroll event type?") ); + return; + } + + ScrollToLine(lineFirstNew); + +#ifdef __WXMAC__ + Update(); +#endif // __WXMAC__ +} + +#if wxUSE_MOUSEWHEEL + +void wxVScrolledWindow::OnMouseWheel(wxMouseEvent& event) +{ + m_sumWheelRotation += event.GetWheelRotation(); + int delta = event.GetWheelDelta(); + + // how much to scroll this time + int units_to_scroll = -(m_sumWheelRotation/delta); + if ( !units_to_scroll ) + return; + + m_sumWheelRotation += units_to_scroll*delta; + + if ( !event.IsPageScroll() ) + ScrollLines( units_to_scroll*event.GetLinesPerAction() ); + else + // scroll pages instead of lines + ScrollPages( units_to_scroll ); +} + +#endif // wxUSE_MOUSEWHEEL + diff --git a/Externals/wxWidgets/src/generic/wizard.cpp b/Externals/wxWidgets/src/generic/wizard.cpp new file mode 100644 index 0000000000..d7d6affe9e --- /dev/null +++ b/Externals/wxWidgets/src/generic/wizard.cpp @@ -0,0 +1,877 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/generic/wizard.cpp +// Purpose: generic implementation of wxWizard class +// Author: Vadim Zeitlin +// Modified by: Robert Cavanaugh +// 1) Added capability for wxWizardPage to accept resources +// 2) Added "Help" button handler stub +// 3) Fixed ShowPage() bug on displaying bitmaps +// Robert Vazan (sizers) +// Created: 15.08.99 +// RCS-ID: $Id: wizard.cpp 47065 2007-07-02 08:00:17Z JS $ +// Copyright: (c) 1999 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_WIZARDDLG + +#ifndef WX_PRECOMP + #include "wx/dynarray.h" + #include "wx/intl.h" + #include "wx/statbmp.h" + #include "wx/button.h" + #include "wx/settings.h" + #include "wx/sizer.h" +#endif //WX_PRECOMP + +#include "wx/statline.h" + +#include "wx/wizard.h" + +// ---------------------------------------------------------------------------- +// wxWizardSizer +// ---------------------------------------------------------------------------- + +class wxWizardSizer : public wxSizer +{ +public: + wxWizardSizer(wxWizard *owner); + + virtual wxSizerItem *Insert(size_t index, wxSizerItem *item); + + virtual void RecalcSizes(); + virtual wxSize CalcMin(); + + // get the max size of all wizard pages + wxSize GetMaxChildSize(); + + // return the border which can be either set using wxWizard::SetBorder() or + // have default value + int GetBorder() const; + + // hide the pages which we temporarily "show" when they're added to this + // sizer (see Insert()) + void HidePages(); + +private: + wxSize SiblingSize(wxSizerItem *child); + + wxWizard *m_owner; + wxSize m_childSize; +}; + +// ---------------------------------------------------------------------------- +// event tables and such +// ---------------------------------------------------------------------------- + +DEFINE_EVENT_TYPE(wxEVT_WIZARD_PAGE_CHANGED) +DEFINE_EVENT_TYPE(wxEVT_WIZARD_PAGE_CHANGING) +DEFINE_EVENT_TYPE(wxEVT_WIZARD_CANCEL) +DEFINE_EVENT_TYPE(wxEVT_WIZARD_FINISHED) +DEFINE_EVENT_TYPE(wxEVT_WIZARD_HELP) + +BEGIN_EVENT_TABLE(wxWizard, wxDialog) + EVT_BUTTON(wxID_CANCEL, wxWizard::OnCancel) + EVT_BUTTON(wxID_BACKWARD, wxWizard::OnBackOrNext) + EVT_BUTTON(wxID_FORWARD, wxWizard::OnBackOrNext) + EVT_BUTTON(wxID_HELP, wxWizard::OnHelp) + + EVT_WIZARD_PAGE_CHANGED(wxID_ANY, wxWizard::OnWizEvent) + EVT_WIZARD_PAGE_CHANGING(wxID_ANY, wxWizard::OnWizEvent) + EVT_WIZARD_CANCEL(wxID_ANY, wxWizard::OnWizEvent) + EVT_WIZARD_FINISHED(wxID_ANY, wxWizard::OnWizEvent) + EVT_WIZARD_HELP(wxID_ANY, wxWizard::OnWizEvent) +END_EVENT_TABLE() + +IMPLEMENT_DYNAMIC_CLASS(wxWizard, wxDialog) + +/* + TODO PROPERTIES : + wxWizard + extstyle + title +*/ + +IMPLEMENT_ABSTRACT_CLASS(wxWizardPage, wxPanel) +IMPLEMENT_DYNAMIC_CLASS(wxWizardPageSimple, wxWizardPage) +IMPLEMENT_DYNAMIC_CLASS(wxWizardEvent, wxNotifyEvent) + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxWizardPage +// ---------------------------------------------------------------------------- + +void wxWizardPage::Init() +{ + m_bitmap = wxNullBitmap; +} + +wxWizardPage::wxWizardPage(wxWizard *parent, + const wxBitmap& bitmap, + const wxChar *resource) +{ + Create(parent, bitmap, resource); +} + +bool wxWizardPage::Create(wxWizard *parent, + const wxBitmap& bitmap, + const wxChar *resource) +{ + if ( !wxPanel::Create(parent, wxID_ANY) ) + return false; + + if ( resource != NULL ) + { +#if wxUSE_WX_RESOURCES +#if 0 + if ( !LoadFromResource(this, resource) ) + { + wxFAIL_MSG(wxT("wxWizardPage LoadFromResource failed!!!!")); + } +#endif +#endif // wxUSE_RESOURCES + } + + m_bitmap = bitmap; + + // initially the page is hidden, it's shown only when it becomes current + Hide(); + + return true; +} + +// ---------------------------------------------------------------------------- +// wxWizardPageSimple +// ---------------------------------------------------------------------------- + +wxWizardPage *wxWizardPageSimple::GetPrev() const +{ + return m_prev; +} + +wxWizardPage *wxWizardPageSimple::GetNext() const +{ + return m_next; +} + +// ---------------------------------------------------------------------------- +// wxWizardSizer +// ---------------------------------------------------------------------------- + +wxWizardSizer::wxWizardSizer(wxWizard *owner) + : m_owner(owner), + m_childSize(wxDefaultSize) +{ +} + +wxSizerItem *wxWizardSizer::Insert(size_t index, wxSizerItem *item) +{ + m_owner->m_usingSizer = true; + + if ( item->IsWindow() ) + { + // we must pretend that the window is shown as otherwise it wouldn't be + // taken into account for the layout -- but avoid really showing it, so + // just set the internal flag instead of calling wxWindow::Show() + item->GetWindow()->wxWindowBase::Show(); + } + + return wxSizer::Insert(index, item); +} + +void wxWizardSizer::HidePages() +{ + for ( wxSizerItemList::compatibility_iterator node = GetChildren().GetFirst(); + node; + node = node->GetNext() ) + { + wxSizerItem * const item = node->GetData(); + if ( item->IsWindow() ) + item->GetWindow()->wxWindowBase::Show(false); + } +} + +void wxWizardSizer::RecalcSizes() +{ + // Effect of this function depends on m_owner->m_page and + // it should be called whenever it changes (wxWizard::ShowPage) + if ( m_owner->m_page ) + { + m_owner->m_page->SetSize(wxRect(m_position, m_size)); + } +} + +wxSize wxWizardSizer::CalcMin() +{ + return m_owner->GetPageSize(); +} + +wxSize wxWizardSizer::GetMaxChildSize() +{ +#if !defined(__WXDEBUG__) + if ( m_childSize.IsFullySpecified() ) + return m_childSize; +#endif + + wxSize maxOfMin; + + for ( wxSizerItemList::compatibility_iterator childNode = m_children.GetFirst(); + childNode; + childNode = childNode->GetNext() ) + { + wxSizerItem *child = childNode->GetData(); + maxOfMin.IncTo(child->CalcMin()); + maxOfMin.IncTo(SiblingSize(child)); + } + +#ifdef __WXDEBUG__ + if ( m_childSize.IsFullySpecified() && m_childSize != maxOfMin ) + { + wxFAIL_MSG( _T("Size changed in wxWizard::GetPageAreaSizer()") + _T("after RunWizard().\n") + _T("Did you forget to call GetSizer()->Fit(this) ") + _T("for some page?")) ; + + return m_childSize; + } +#endif // __WXDEBUG__ + + if ( m_owner->m_started ) + { + m_childSize = maxOfMin; + } + + return maxOfMin; +} + +int wxWizardSizer::GetBorder() const +{ + return m_owner->m_border; +} + +wxSize wxWizardSizer::SiblingSize(wxSizerItem *child) +{ + wxSize maxSibling; + + if ( child->IsWindow() ) + { + wxWizardPage *page = wxDynamicCast(child->GetWindow(), wxWizardPage); + if ( page ) + { + for ( wxWizardPage *sibling = page->GetNext(); + sibling; + sibling = sibling->GetNext() ) + { + if ( sibling->GetSizer() ) + { + maxSibling.IncTo(sibling->GetSizer()->CalcMin()); + } + } + } + } + + return maxSibling; +} + +// ---------------------------------------------------------------------------- +// generic wxWizard implementation +// ---------------------------------------------------------------------------- + +void wxWizard::Init() +{ + m_posWizard = wxDefaultPosition; + m_page = (wxWizardPage *)NULL; + m_btnPrev = m_btnNext = NULL; + m_statbmp = NULL; + m_sizerBmpAndPage = NULL; + m_sizerPage = NULL; + m_border = 5; + m_started = false; + m_wasModal = false; + m_usingSizer = false; +} + +bool wxWizard::Create(wxWindow *parent, + int id, + const wxString& title, + const wxBitmap& bitmap, + const wxPoint& pos, + long style) +{ + bool result = wxDialog::Create(parent,id,title,pos,wxDefaultSize,style); + + m_posWizard = pos; + m_bitmap = bitmap ; + + DoCreateControls(); + + return result; +} + +wxWizard::~wxWizard() +{ + // normally we don't have to delete this sizer as it's deleted by the + // associated window but if we never used it or didn't set it as the window + // sizer yet, do delete it manually + if ( !m_usingSizer || !m_started ) + delete m_sizerPage; +} + +void wxWizard::AddBitmapRow(wxBoxSizer *mainColumn) +{ + m_sizerBmpAndPage = new wxBoxSizer(wxHORIZONTAL); + mainColumn->Add( + m_sizerBmpAndPage, + 1, // Vertically stretchable + wxEXPAND // Horizonal stretching, no border + ); + mainColumn->Add(0,5, + 0, // No vertical stretching + wxEXPAND // No border, (mostly useless) horizontal stretching + ); + +#if wxUSE_STATBMP + if ( m_bitmap.Ok() ) + { + m_statbmp = new wxStaticBitmap(this, wxID_ANY, m_bitmap); + m_sizerBmpAndPage->Add( + m_statbmp, + 0, // No horizontal stretching + wxALL, // Border all around, top alignment + 5 // Border width + ); + m_sizerBmpAndPage->Add( + 5,0, + 0, // No horizontal stretching + wxEXPAND // No border, (mostly useless) vertical stretching + ); + } +#endif + + // Added to m_sizerBmpAndPage later + m_sizerPage = new wxWizardSizer(this); +} + +void wxWizard::AddStaticLine(wxBoxSizer *mainColumn) +{ +#if wxUSE_STATLINE + mainColumn->Add( + new wxStaticLine(this, wxID_ANY), + 0, // Vertically unstretchable + wxEXPAND | wxALL, // Border all around, horizontally stretchable + 5 // Border width + ); + mainColumn->Add(0,5, + 0, // No vertical stretching + wxEXPAND // No border, (mostly useless) horizontal stretching + ); +#else + (void)mainColumn; +#endif // wxUSE_STATLINE +} + +void wxWizard::AddBackNextPair(wxBoxSizer *buttonRow) +{ + wxASSERT_MSG( m_btnNext && m_btnPrev, + _T("You must create the buttons before calling ") + _T("wxWizard::AddBackNextPair") ); + + // margin between Back and Next buttons +#ifdef __WXMAC__ + static const int BACKNEXT_MARGIN = 10; +#else + static const int BACKNEXT_MARGIN = 0; +#endif + + wxBoxSizer *backNextPair = new wxBoxSizer(wxHORIZONTAL); + buttonRow->Add( + backNextPair, + 0, // No horizontal stretching + wxALL, // Border all around + 5 // Border width + ); + + backNextPair->Add(m_btnPrev); + backNextPair->Add(BACKNEXT_MARGIN,0, + 0, // No horizontal stretching + wxEXPAND // No border, (mostly useless) vertical stretching + ); + backNextPair->Add(m_btnNext); +} + +void wxWizard::AddButtonRow(wxBoxSizer *mainColumn) +{ + // the order in which the buttons are created determines the TAB order - at least under MSWindows... + // although the 'back' button appears before the 'next' button, a more userfriendly tab order is + // to activate the 'next' button first (create the next button before the back button). + // The reason is: The user will repeatedly enter information in the wizard pages and then wants to + // press 'next'. If a user uses mostly the keyboard, he would have to skip the 'back' button + // everytime. This is annoying. There is a second reason: RETURN acts as TAB. If the 'next' + // button comes first in the TAB order, the user can enter information very fast using the RETURN + // key to TAB to the next entry field and page. This would not be possible, if the 'back' button + // was created before the 'next' button. + + bool isPda = (wxSystemSettings::GetScreenType() <= wxSYS_SCREEN_PDA); + int buttonStyle = isPda ? wxBU_EXACTFIT : 0; + + wxBoxSizer *buttonRow = new wxBoxSizer(wxHORIZONTAL); +#ifdef __WXMAC__ + if (GetExtraStyle() & wxWIZARD_EX_HELPBUTTON) + mainColumn->Add( + buttonRow, + 0, // Vertically unstretchable + wxGROW|wxALIGN_CENTRE + ); + else +#endif + mainColumn->Add( + buttonRow, + 0, // Vertically unstretchable + wxALIGN_RIGHT // Right aligned, no border + ); + + // Desired TAB order is 'next', 'cancel', 'help', 'back'. This makes the 'back' button the last control on the page. + // Create the buttons in the right order... + wxButton *btnHelp=0; +#ifdef __WXMAC__ + if (GetExtraStyle() & wxWIZARD_EX_HELPBUTTON) + btnHelp=new wxButton(this, wxID_HELP, _("&Help"), wxDefaultPosition, wxDefaultSize, buttonStyle); +#endif + + m_btnNext = new wxButton(this, wxID_FORWARD, _("&Next >")); + wxButton *btnCancel=new wxButton(this, wxID_CANCEL, _("&Cancel"), wxDefaultPosition, wxDefaultSize, buttonStyle); +#ifndef __WXMAC__ + if (GetExtraStyle() & wxWIZARD_EX_HELPBUTTON) + btnHelp=new wxButton(this, wxID_HELP, _("&Help"), wxDefaultPosition, wxDefaultSize, buttonStyle); +#endif + m_btnPrev = new wxButton(this, wxID_BACKWARD, _("< &Back"), wxDefaultPosition, wxDefaultSize, buttonStyle); + + if (btnHelp) + { + buttonRow->Add( + btnHelp, + 0, // Horizontally unstretchable + wxALL, // Border all around, top aligned + 5 // Border width + ); +#ifdef __WXMAC__ + // Put stretchable space between help button and others + buttonRow->Add(0, 0, 1, wxALIGN_CENTRE, 0); +#endif + } + + AddBackNextPair(buttonRow); + + buttonRow->Add( + btnCancel, + 0, // Horizontally unstretchable + wxALL, // Border all around, top aligned + 5 // Border width + ); +} + +void wxWizard::DoCreateControls() +{ + // do nothing if the controls were already created + if ( WasCreated() ) + return; + + bool isPda = (wxSystemSettings::GetScreenType() <= wxSYS_SCREEN_PDA); + + // Horizontal stretching, and if not PDA, border all around + int mainColumnSizerFlags = isPda ? wxEXPAND : wxALL|wxEXPAND ; + + // wxWindow::SetSizer will be called at end + wxBoxSizer *windowSizer = new wxBoxSizer(wxVERTICAL); + + wxBoxSizer *mainColumn = new wxBoxSizer(wxVERTICAL); + windowSizer->Add( + mainColumn, + 1, // Vertical stretching + mainColumnSizerFlags, + 5 // Border width + ); + + AddBitmapRow(mainColumn); + + if (!isPda) + AddStaticLine(mainColumn); + + AddButtonRow(mainColumn); + + SetSizer(windowSizer); +} + +void wxWizard::SetPageSize(const wxSize& size) +{ + wxCHECK_RET(!m_started, wxT("wxWizard::SetPageSize after RunWizard")); + m_sizePage = size; +} + +void wxWizard::FitToPage(const wxWizardPage *page) +{ + wxCHECK_RET(!m_started, wxT("wxWizard::FitToPage after RunWizard")); + + while ( page ) + { + wxSize size = page->GetBestSize(); + + m_sizePage.IncTo(size); + + page = page->GetNext(); + } +} + +bool wxWizard::ShowPage(wxWizardPage *page, bool goingForward) +{ + wxASSERT_MSG( page != m_page, wxT("this is useless") ); + + wxSizerFlags flags(1); + flags.Border(wxALL, m_border).Expand(); + + if ( !m_started ) + { + if ( m_usingSizer ) + { + m_sizerBmpAndPage->Add(m_sizerPage, flags); + + // now that our layout is computed correctly, hide the pages + // artificially shown in wxWizardSizer::Insert() back again + m_sizerPage->HidePages(); + } + } + + + // we'll use this to decide whether we have to change the label of this + // button or not (initially the label is "Next") + bool btnLabelWasNext = true; + + // remember the old bitmap (if any) to compare with the new one later + wxBitmap bmpPrev; + + // check for previous page + if ( m_page ) + { + // send the event to the old page + wxWizardEvent event(wxEVT_WIZARD_PAGE_CHANGING, GetId(), + goingForward, m_page); + if ( m_page->GetEventHandler()->ProcessEvent(event) && + !event.IsAllowed() ) + { + // vetoed by the page + return false; + } + + m_page->Hide(); + + btnLabelWasNext = HasNextPage(m_page); + + bmpPrev = m_page->GetBitmap(); + + if ( !m_usingSizer ) + m_sizerBmpAndPage->Detach(m_page); + } + + // set the new page + m_page = page; + + // is this the end? + if ( !m_page ) + { + // terminate successfully + if ( IsModal() ) + { + EndModal(wxID_OK); + } + else + { + SetReturnCode(wxID_OK); + Hide(); + } + + // and notify the user code (this is especially useful for modeless + // wizards) + wxWizardEvent event(wxEVT_WIZARD_FINISHED, GetId(), false, 0); + (void)GetEventHandler()->ProcessEvent(event); + + return true; + } + + // position and show the new page + (void)m_page->TransferDataToWindow(); + + if ( m_usingSizer ) + { + // wxWizardSizer::RecalcSizes wants to be called when m_page changes + m_sizerPage->RecalcSizes(); + } + else // pages are not managed by the sizer + { + m_sizerBmpAndPage->Add(m_page, flags); + m_sizerBmpAndPage->SetItemMinSize(m_page, GetPageSize()); + } + +#if wxUSE_STATBMP + // update the bitmap if:it changed + if ( m_statbmp ) + { + wxBitmap bmp = m_page->GetBitmap(); + if ( !bmp.Ok() ) + bmp = m_bitmap; + + if ( !bmpPrev.Ok() ) + bmpPrev = m_bitmap; + + if ( !bmp.IsSameAs(bmpPrev) ) + m_statbmp->SetBitmap(bmp); + } +#endif // wxUSE_STATBMP + + + // and update the buttons state + m_btnPrev->Enable(HasPrevPage(m_page)); + + bool hasNext = HasNextPage(m_page); + if ( btnLabelWasNext != hasNext ) + { + m_btnNext->SetLabel(hasNext ? _("&Next >") : _("&Finish")); + } + // nothing to do: the label was already correct + + m_btnNext->SetDefault(); + + + // send the change event to the new page now + wxWizardEvent event(wxEVT_WIZARD_PAGE_CHANGED, GetId(), goingForward, m_page); + (void)m_page->GetEventHandler()->ProcessEvent(event); + + // and finally show it + m_page->Show(); + m_page->SetFocus(); + + if ( !m_usingSizer ) + m_sizerBmpAndPage->Layout(); + + if ( !m_started ) + { + m_started = true; + + if ( wxSystemSettings::GetScreenType() > wxSYS_SCREEN_PDA ) + { + GetSizer()->SetSizeHints(this); + if ( m_posWizard == wxDefaultPosition ) + CentreOnScreen(); + } + } + + return true; +} + +bool wxWizard::RunWizard(wxWizardPage *firstPage) +{ + wxCHECK_MSG( firstPage, false, wxT("can't run empty wizard") ); + + // can't return false here because there is no old page + (void)ShowPage(firstPage, true /* forward */); + + m_wasModal = true; + + return ShowModal() == wxID_OK; +} + +wxWizardPage *wxWizard::GetCurrentPage() const +{ + return m_page; +} + +wxSize wxWizard::GetPageSize() const +{ + // default width and height of the page + int DEFAULT_PAGE_WIDTH, + DEFAULT_PAGE_HEIGHT; + if ( wxSystemSettings::GetScreenType() <= wxSYS_SCREEN_PDA ) + { + // Make the default page size small enough to fit on screen + DEFAULT_PAGE_WIDTH = wxSystemSettings::GetMetric(wxSYS_SCREEN_X) / 2; + DEFAULT_PAGE_HEIGHT = wxSystemSettings::GetMetric(wxSYS_SCREEN_Y) / 2; + } + else // !PDA + { + DEFAULT_PAGE_WIDTH = + DEFAULT_PAGE_HEIGHT = 270; + } + + // start with default minimal size + wxSize pageSize(DEFAULT_PAGE_WIDTH, DEFAULT_PAGE_HEIGHT); + + // make the page at least as big as specified by user + pageSize.IncTo(m_sizePage); + + if ( m_statbmp ) + { + // make the page at least as tall as the bitmap + pageSize.IncTo(wxSize(0, m_bitmap.GetHeight())); + } + + if ( m_usingSizer ) + { + // make it big enough to contain all pages added to the sizer + pageSize.IncTo(m_sizerPage->GetMaxChildSize()); + } + + return pageSize; +} + +wxSizer *wxWizard::GetPageAreaSizer() const +{ + return m_sizerPage; +} + +void wxWizard::SetBorder(int border) +{ + wxCHECK_RET(!m_started, wxT("wxWizard::SetBorder after RunWizard")); + + m_border = border; +} + +void wxWizard::OnCancel(wxCommandEvent& WXUNUSED(eventUnused)) +{ + // this function probably can never be called when we don't have an active + // page, but a small extra check won't hurt + wxWindow *win = m_page ? (wxWindow *)m_page : (wxWindow *)this; + + wxWizardEvent event(wxEVT_WIZARD_CANCEL, GetId(), false, m_page); + if ( !win->GetEventHandler()->ProcessEvent(event) || event.IsAllowed() ) + { + // no objections - close the dialog + if(IsModal()) + { + EndModal(wxID_CANCEL); + } + else + { + SetReturnCode(wxID_CANCEL); + Hide(); + } + } + //else: request to Cancel ignored +} + +void wxWizard::OnBackOrNext(wxCommandEvent& event) +{ + wxASSERT_MSG( (event.GetEventObject() == m_btnNext) || + (event.GetEventObject() == m_btnPrev), + wxT("unknown button") ); + + wxCHECK_RET( m_page, _T("should have a valid current page") ); + + // ask the current page first: notice that we do it before calling + // GetNext/Prev() because the data transfered from the controls of the page + // may change the value returned by these methods + if ( !m_page->Validate() || !m_page->TransferDataFromWindow() ) + { + // the page data is incorrect, don't do anything + return; + } + + bool forward = event.GetEventObject() == m_btnNext; + + wxWizardPage *page; + if ( forward ) + { + page = m_page->GetNext(); + } + else // back + { + page = m_page->GetPrev(); + + wxASSERT_MSG( page, wxT("\"GetEventHandler()->ProcessEvent(eventHelp); + } +} + +void wxWizard::OnWizEvent(wxWizardEvent& event) +{ + // the dialogs have wxWS_EX_BLOCK_EVENTS style on by default but we want to + // propagate wxEVT_WIZARD_XXX to the parent (if any), so do it manually + if ( !(GetExtraStyle() & wxWS_EX_BLOCK_EVENTS) ) + { + // the event will be propagated anyhow + event.Skip(); + } + else + { + wxWindow *parent = GetParent(); + + if ( !parent || !parent->GetEventHandler()->ProcessEvent(event) ) + { + event.Skip(); + } + } + + if ( ( !m_wasModal ) && + event.IsAllowed() && + ( event.GetEventType() == wxEVT_WIZARD_FINISHED || + event.GetEventType() == wxEVT_WIZARD_CANCEL + ) + ) + { + Destroy(); + } +} + +void wxWizard::SetBitmap(const wxBitmap& bitmap) +{ + m_bitmap = bitmap; + if (m_statbmp) + m_statbmp->SetBitmap(m_bitmap); +} + +// ---------------------------------------------------------------------------- +// wxWizardEvent +// ---------------------------------------------------------------------------- + +wxWizardEvent::wxWizardEvent(wxEventType type, int id, bool direction, wxWizardPage* page) + : wxNotifyEvent(type, id) +{ + // Modified 10-20-2001 Robert Cavanaugh + // add the active page to the event data + m_direction = direction; + m_page = page; +} + +#endif // wxUSE_WIZARDDLG diff --git a/Externals/wxWidgets/src/msw/aboutdlg.cpp b/Externals/wxWidgets/src/msw/aboutdlg.cpp new file mode 100644 index 0000000000..0a87b310b4 --- /dev/null +++ b/Externals/wxWidgets/src/msw/aboutdlg.cpp @@ -0,0 +1,70 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/msw/aboutdlg.cpp +// Purpose: implementation of wxAboutBox() for wxMSW +// Author: Vadim Zeitlin +// Created: 2006-10-07 +// RCS-ID: $Id: aboutdlg.cpp 45979 2007-05-11 22:39:15Z VZ $ +// Copyright: (c) 2006 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// for compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_ABOUTDLG + +#ifndef WX_PRECOMP + #include "wx/msgdlg.h" +#endif //WX_PRECOMP + +#include "wx/aboutdlg.h" +#include "wx/generic/aboutdlgg.h" + +// ============================================================================ +// implementation +// ============================================================================ + +// our public entry point +void wxAboutBox(const wxAboutDialogInfo& info) +{ + // we prefer to show a simple message box if we don't have any fields which + // can't be shown in it because as much as there is a standard about box + // under MSW at all, this is it + if ( info.IsSimple() ) + { + // build the text to show in the box + const wxString name = info.GetName(); + wxString msg; + msg << name; + if ( info.HasVersion() ) + msg << _(" Version ") << info.GetVersion(); + msg << _T('\n'); + + if ( info.HasCopyright() ) + msg << info.GetCopyright() << _T('\n'); + + // add everything remaining + msg << info.GetDescriptionAndCredits(); + + wxMessageBox(msg, _("About ") + name); + } + else // simple "native" version is not enough + { + // we need to use the full-blown generic version + wxGenericAboutBox(info); + } +} + +#endif // wxUSE_ABOUTDLG diff --git a/Externals/wxWidgets/src/msw/accel.cpp b/Externals/wxWidgets/src/msw/accel.cpp new file mode 100644 index 0000000000..f10f83fa31 --- /dev/null +++ b/Externals/wxWidgets/src/msw/accel.cpp @@ -0,0 +1,167 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: msw/accel.cpp +// Purpose: wxAcceleratorTable +// Author: Julian Smart +// Modified by: +// Created: 04/01/98 +// RCS-ID: $Id: accel.cpp 49804 2007-11-10 01:09:42Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_ACCEL + +#ifndef WX_PRECOMP + #include "wx/window.h" +#endif + +#include "wx/accel.h" + +#include "wx/msw/private.h" + +extern WXWORD wxCharCodeWXToMSW(int id, bool *isVirtual); + +IMPLEMENT_DYNAMIC_CLASS(wxAcceleratorTable, wxObject) + +// ---------------------------------------------------------------------------- +// data defining wxAcceleratorTable +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxAcceleratorRefData: public wxObjectRefData +{ + friend class WXDLLIMPEXP_FWD_CORE wxAcceleratorTable; +public: + wxAcceleratorRefData(); + virtual ~wxAcceleratorRefData(); + + inline HACCEL GetHACCEL() const { return m_hAccel; } +protected: + HACCEL m_hAccel; + bool m_ok; + + DECLARE_NO_COPY_CLASS(wxAcceleratorRefData) +}; + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxAcceleratorRefData +// ---------------------------------------------------------------------------- + +#define M_ACCELDATA ((wxAcceleratorRefData *)m_refData) + +wxAcceleratorRefData::wxAcceleratorRefData() +{ + m_ok = false; + m_hAccel = 0; +} + +wxAcceleratorRefData::~wxAcceleratorRefData() +{ + if (m_hAccel) + { + DestroyAcceleratorTable((HACCEL) m_hAccel); + } +} + +// ---------------------------------------------------------------------------- +// wxAcceleratorTable +// ---------------------------------------------------------------------------- + +// Load from .rc resource +wxAcceleratorTable::wxAcceleratorTable(const wxString& resource) +{ + m_refData = new wxAcceleratorRefData; + + HACCEL hAccel = ::LoadAccelerators(wxGetInstance(), resource); + M_ACCELDATA->m_hAccel = hAccel; + M_ACCELDATA->m_ok = hAccel != 0; +} + +// Create from an array +wxAcceleratorTable::wxAcceleratorTable(int n, const wxAcceleratorEntry entries[]) +{ + m_refData = new wxAcceleratorRefData; + + ACCEL* arr = new ACCEL[n]; + for ( int i = 0; i < n; i++ ) + { + int flags = entries[i].GetFlags(); + + BYTE fVirt = 0; + if ( flags & wxACCEL_ALT ) + fVirt |= FALT | FVIRTKEY; + if ( flags & wxACCEL_SHIFT ) + fVirt |= FSHIFT | FVIRTKEY; + if ( flags & wxACCEL_CTRL ) + fVirt |= FCONTROL | FVIRTKEY; + + bool isVirtual; + + WORD key = wxCharCodeWXToMSW(entries[i].GetKeyCode(), &isVirtual); + if (isVirtual) + fVirt |= FVIRTKEY; + + arr[i].fVirt = fVirt; + arr[i].key = key; + arr[i].cmd = (WORD)entries[i].GetCommand(); + } + + M_ACCELDATA->m_hAccel = ::CreateAcceleratorTable(arr, n); + delete[] arr; + + M_ACCELDATA->m_ok = (M_ACCELDATA->m_hAccel != 0); +} + +bool wxAcceleratorTable::IsOk() const +{ + return (M_ACCELDATA && (M_ACCELDATA->m_ok)); +} + +void wxAcceleratorTable::SetHACCEL(WXHACCEL hAccel) +{ + if (!M_ACCELDATA) + m_refData = new wxAcceleratorRefData; + + M_ACCELDATA->m_hAccel = (HACCEL) hAccel; +} + +WXHACCEL wxAcceleratorTable::GetHACCEL() const +{ + if (!M_ACCELDATA) + return 0; + return (WXHACCEL) M_ACCELDATA->m_hAccel; +} + +bool wxAcceleratorTable::Translate(wxWindow *window, WXMSG *wxmsg) const +{ +#if 0 + // calling TranslateAccelerator() with child window doesn't do anything so + // it's probably a bug + wxASSERT_MSG( window->IsTopLevel(), + _T("TranslateAccelerator() needs a top level window") ); +#endif + + MSG *msg = (MSG *)wxmsg; + return Ok() && ::TranslateAccelerator(GetHwndOf(window), GetHaccel(), msg); +} + +#endif // wxUSE_ACCEL + diff --git a/Externals/wxWidgets/src/msw/app.cpp b/Externals/wxWidgets/src/msw/app.cpp new file mode 100644 index 0000000000..d7b8c56fe7 --- /dev/null +++ b/Externals/wxWidgets/src/msw/app.cpp @@ -0,0 +1,781 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/msw/app.cpp +// Purpose: wxApp +// Author: Julian Smart +// Modified by: +// Created: 04/01/98 +// RCS-ID: $Id: app.cpp 41054 2006-09-07 19:01:45Z ABX $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// =========================================================================== +// declarations +// =========================================================================== + +// --------------------------------------------------------------------------- +// headers +// --------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#if defined(__BORLANDC__) + #pragma hdrstop +#endif + +#ifndef WX_PRECOMP + #include "wx/msw/wrapcctl.h" + #include "wx/dynarray.h" + #include "wx/frame.h" + #include "wx/app.h" + #include "wx/utils.h" + #include "wx/gdicmn.h" + #include "wx/pen.h" + #include "wx/brush.h" + #include "wx/cursor.h" + #include "wx/icon.h" + #include "wx/palette.h" + #include "wx/dc.h" + #include "wx/dialog.h" + #include "wx/msgdlg.h" + #include "wx/intl.h" + #include "wx/wxchar.h" + #include "wx/log.h" + #include "wx/module.h" +#endif + +#include "wx/apptrait.h" +#include "wx/filename.h" +#include "wx/dynlib.h" +#include "wx/evtloop.h" + +#include "wx/msw/private.h" +#include "wx/msw/ole/oleutils.h" + +#if wxUSE_TOOLTIPS + #include "wx/tooltip.h" +#endif // wxUSE_TOOLTIPS + +// OLE is used for drag-and-drop, clipboard, OLE Automation..., but some +// compilers don't support it (missing headers, libs, ...) +#if defined(__GNUWIN32_OLD__) || defined(__SYMANTEC__) || defined(__SALFORDC__) + #undef wxUSE_OLE + + #define wxUSE_OLE 0 +#endif // broken compilers + +#if defined(__POCKETPC__) || defined(__SMARTPHONE__) + #include + #include +#endif + +#if wxUSE_OLE + #include +#endif + +#include +#include + +// For MB_TASKMODAL +#ifdef __WXWINCE__ +#include "wx/msw/wince/missing.h" +#endif + +// instead of including which is not part of the core SDK and not +// shipped at all with other compilers, we always define the parts of it we +// need here ourselves +// +// NB: DLLVER_PLATFORM_WINDOWS will be defined if shlwapi.h had been somehow +// included already +#ifndef DLLVER_PLATFORM_WINDOWS + // hopefully we don't need to change packing as DWORDs should be already + // correctly aligned + struct DLLVERSIONINFO + { + DWORD cbSize; + DWORD dwMajorVersion; // Major version + DWORD dwMinorVersion; // Minor version + DWORD dwBuildNumber; // Build number + DWORD dwPlatformID; // DLLVER_PLATFORM_* + }; + + typedef HRESULT (CALLBACK* DLLGETVERSIONPROC)(DLLVERSIONINFO *); +#endif // defined(DLLVERSIONINFO) + + +// --------------------------------------------------------------------------- +// global variables +// --------------------------------------------------------------------------- + +#if !defined(__WXMICROWIN__) && !defined(__WXWINCE__) +extern void wxSetKeyboardHook(bool doIt); +#endif + +// NB: all "NoRedraw" classes must have the same names as the "normal" classes +// with NR suffix - wxWindow::MSWCreate() supposes this +#ifdef __WXWINCE__ +WXDLLIMPEXP_CORE wxChar *wxCanvasClassName; +WXDLLIMPEXP_CORE wxChar *wxCanvasClassNameNR; +#else +WXDLLIMPEXP_CORE const wxChar *wxCanvasClassName = wxT("wxWindowClass"); +WXDLLIMPEXP_CORE const wxChar *wxCanvasClassNameNR = wxT("wxWindowClassNR"); +#endif +WXDLLIMPEXP_CORE const wxChar *wxMDIFrameClassName = wxT("wxMDIFrameClass"); +WXDLLIMPEXP_CORE const wxChar *wxMDIFrameClassNameNoRedraw = wxT("wxMDIFrameClassNR"); +WXDLLIMPEXP_CORE const wxChar *wxMDIChildFrameClassName = wxT("wxMDIChildFrameClass"); +WXDLLIMPEXP_CORE const wxChar *wxMDIChildFrameClassNameNoRedraw = wxT("wxMDIChildFrameClassNR"); + +// ---------------------------------------------------------------------------- +// private functions +// ---------------------------------------------------------------------------- + +LRESULT WXDLLEXPORT APIENTRY wxWndProc(HWND, UINT, WPARAM, LPARAM); + +// =========================================================================== +// wxGUIAppTraits implementation +// =========================================================================== + +// private class which we use to pass parameters from BeforeChildWaitLoop() to +// AfterChildWaitLoop() +struct ChildWaitLoopData +{ + ChildWaitLoopData(wxWindowDisabler *wd_, wxWindow *winActive_) + { + wd = wd_; + winActive = winActive_; + } + + wxWindowDisabler *wd; + wxWindow *winActive; +}; + +void *wxGUIAppTraits::BeforeChildWaitLoop() +{ + /* + We use a dirty hack here to disable all application windows (which we + must do because otherwise the calls to wxYield() could lead to some very + unexpected reentrancies in the users code) but to avoid losing + focus/activation entirely when the child process terminates which would + happen if we simply disabled everything using wxWindowDisabler. Indeed, + remember that Windows will never activate a disabled window and when the + last childs window is closed and Windows looks for a window to activate + all our windows are still disabled. There is no way to enable them in + time because we don't know when the childs windows are going to be + closed, so the solution we use here is to keep one special tiny frame + enabled all the time. Then when the child terminates it will get + activated and when we close it below -- after reenabling all the other + windows! -- the previously active window becomes activated again and + everything is ok. + */ + wxBeginBusyCursor(); + + // first disable all existing windows + wxWindowDisabler *wd = new wxWindowDisabler; + + // then create an "invisible" frame: it has minimal size, is positioned + // (hopefully) outside the screen and doesn't appear on the taskbar + wxWindow *winActive = new wxFrame + ( + wxTheApp->GetTopWindow(), + wxID_ANY, + wxEmptyString, + wxPoint(32600, 32600), + wxSize(1, 1), + wxDEFAULT_FRAME_STYLE | wxFRAME_NO_TASKBAR + ); + winActive->Show(); + + return new ChildWaitLoopData(wd, winActive); +} + +void wxGUIAppTraits::AlwaysYield() +{ + wxYield(); +} + +void wxGUIAppTraits::AfterChildWaitLoop(void *dataOrig) +{ + wxEndBusyCursor(); + + ChildWaitLoopData * const data = (ChildWaitLoopData *)dataOrig; + + delete data->wd; + + // finally delete the dummy frame and, as wd has been already destroyed and + // the other windows reenabled, the activation is going to return to the + // window which had had it before + data->winActive->Destroy(); + + // also delete the temporary data object itself + delete data; +} + +bool wxGUIAppTraits::DoMessageFromThreadWait() +{ + // we should return false only if the app should exit, i.e. only if + // Dispatch() determines that the main event loop should terminate + wxEventLoop *evtLoop = wxEventLoop::GetActive(); + if ( !evtLoop || !evtLoop->Pending() ) + { + // no events means no quit event + return true; + } + + return evtLoop->Dispatch(); +} + +wxPortId wxGUIAppTraits::GetToolkitVersion(int *majVer, int *minVer) const +{ + OSVERSIONINFO info; + wxZeroMemory(info); + + // on Windows, the toolkit version is the same of the OS version + // as Windows integrates the OS kernel with the GUI toolkit. + info.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + if ( ::GetVersionEx(&info) ) + { + if ( majVer ) + *majVer = info.dwMajorVersion; + if ( minVer ) + *minVer = info.dwMinorVersion; + } + +#if defined(__WXHANDHELD__) || defined(__WXWINCE__) + return wxPORT_WINCE; +#else + return wxPORT_MSW; +#endif +} + +// =========================================================================== +// wxApp implementation +// =========================================================================== + +int wxApp::m_nCmdShow = SW_SHOWNORMAL; + +// --------------------------------------------------------------------------- +// wxWin macros +// --------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxApp, wxEvtHandler) + +BEGIN_EVENT_TABLE(wxApp, wxEvtHandler) + EVT_IDLE(wxApp::OnIdle) + EVT_END_SESSION(wxApp::OnEndSession) + EVT_QUERY_END_SESSION(wxApp::OnQueryEndSession) +END_EVENT_TABLE() + +// class to ensure that wxAppBase::CleanUp() is called if our Initialize() +// fails +class wxCallBaseCleanup +{ +public: + wxCallBaseCleanup(wxApp *app) : m_app(app) { } + ~wxCallBaseCleanup() { if ( m_app ) m_app->wxAppBase::CleanUp(); } + + void Dismiss() { m_app = NULL; } + +private: + wxApp *m_app; +}; + +//// Initialize +bool wxApp::Initialize(int& argc, wxChar **argv) +{ + if ( !wxAppBase::Initialize(argc, argv) ) + return false; + + // ensure that base cleanup is done if we return too early + wxCallBaseCleanup callBaseCleanup(this); + +#ifdef __WXWINCE__ + wxString tmp = GetAppName(); + tmp += wxT("ClassName"); + wxCanvasClassName = wxStrdup( tmp.c_str() ); + tmp += wxT("NR"); + wxCanvasClassNameNR = wxStrdup( tmp.c_str() ); + HWND hWnd = FindWindow( wxCanvasClassNameNR, NULL ); + if (hWnd) + { + SetForegroundWindow( (HWND)(((DWORD)hWnd)|0x01) ); + return false; + } +#endif + +#if !defined(__WXMICROWIN__) + InitCommonControls(); +#endif // !defined(__WXMICROWIN__) + +#if defined(__SMARTPHONE__) || defined(__POCKETPC__) + SHInitExtraControls(); +#endif + +#ifndef __WXWINCE__ + // Don't show a message box if a function such as SHGetFileInfo + // fails to find a device. + SetErrorMode(SEM_FAILCRITICALERRORS|SEM_NOOPENFILEERRORBOX); +#endif + + wxOleInitialize(); + + RegisterWindowClasses(); + + wxWinHandleHash = new wxWinHashTable(wxKEY_INTEGER, 100); + +#if !defined(__WXMICROWIN__) && !defined(__WXWINCE__) + wxSetKeyboardHook(true); +#endif + + callBaseCleanup.Dismiss(); + + return true; +} + +// --------------------------------------------------------------------------- +// RegisterWindowClasses +// --------------------------------------------------------------------------- + +// TODO we should only register classes really used by the app. For this it +// would be enough to just delay the class registration until an attempt +// to create a window of this class is made. +bool wxApp::RegisterWindowClasses() +{ + WNDCLASS wndclass; + wxZeroMemory(wndclass); + + // for each class we register one with CS_(V|H)REDRAW style and one + // without for windows created with wxNO_FULL_REDRAW_ON_REPAINT flag + static const long styleNormal = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS; + static const long styleNoRedraw = CS_DBLCLKS; + + // the fields which are common to all classes + wndclass.lpfnWndProc = (WNDPROC)wxWndProc; + wndclass.hInstance = wxhInstance; + wndclass.hCursor = ::LoadCursor((HINSTANCE)NULL, IDC_ARROW); + + // register the class for all normal windows + wndclass.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1); + wndclass.lpszClassName = wxCanvasClassName; + wndclass.style = styleNormal; + + if ( !RegisterClass(&wndclass) ) + { + wxLogLastError(wxT("RegisterClass(frame)")); + } + + // "no redraw" frame + wndclass.lpszClassName = wxCanvasClassNameNR; + wndclass.style = styleNoRedraw; + + if ( !RegisterClass(&wndclass) ) + { + wxLogLastError(wxT("RegisterClass(no redraw frame)")); + } + + // Register the MDI frame window class. + wndclass.hbrBackground = (HBRUSH)NULL; // paint MDI frame ourselves + wndclass.lpszClassName = wxMDIFrameClassName; + wndclass.style = styleNormal; + + if ( !RegisterClass(&wndclass) ) + { + wxLogLastError(wxT("RegisterClass(MDI parent)")); + } + + // "no redraw" MDI frame + wndclass.lpszClassName = wxMDIFrameClassNameNoRedraw; + wndclass.style = styleNoRedraw; + + if ( !RegisterClass(&wndclass) ) + { + wxLogLastError(wxT("RegisterClass(no redraw MDI parent frame)")); + } + + // Register the MDI child frame window class. + wndclass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); + wndclass.lpszClassName = wxMDIChildFrameClassName; + wndclass.style = styleNormal; + + if ( !RegisterClass(&wndclass) ) + { + wxLogLastError(wxT("RegisterClass(MDI child)")); + } + + // "no redraw" MDI child frame + wndclass.lpszClassName = wxMDIChildFrameClassNameNoRedraw; + wndclass.style = styleNoRedraw; + + if ( !RegisterClass(&wndclass) ) + { + wxLogLastError(wxT("RegisterClass(no redraw MDI child)")); + } + + return true; +} + +// --------------------------------------------------------------------------- +// UnregisterWindowClasses +// --------------------------------------------------------------------------- + +bool wxApp::UnregisterWindowClasses() +{ + bool retval = true; + +#ifndef __WXMICROWIN__ + // MDI frame window class. + if ( !::UnregisterClass(wxMDIFrameClassName, wxhInstance) ) + { + wxLogLastError(wxT("UnregisterClass(MDI parent)")); + + retval = false; + } + + // "no redraw" MDI frame + if ( !::UnregisterClass(wxMDIFrameClassNameNoRedraw, wxhInstance) ) + { + wxLogLastError(wxT("UnregisterClass(no redraw MDI parent frame)")); + + retval = false; + } + + // MDI child frame window class. + if ( !::UnregisterClass(wxMDIChildFrameClassName, wxhInstance) ) + { + wxLogLastError(wxT("UnregisterClass(MDI child)")); + + retval = false; + } + + // "no redraw" MDI child frame + if ( !::UnregisterClass(wxMDIChildFrameClassNameNoRedraw, wxhInstance) ) + { + wxLogLastError(wxT("UnregisterClass(no redraw MDI child)")); + + retval = false; + } + + // canvas class name + if ( !::UnregisterClass(wxCanvasClassName, wxhInstance) ) + { + wxLogLastError(wxT("UnregisterClass(canvas)")); + + retval = false; + } + + if ( !::UnregisterClass(wxCanvasClassNameNR, wxhInstance) ) + { + wxLogLastError(wxT("UnregisterClass(no redraw canvas)")); + + retval = false; + } +#endif // __WXMICROWIN__ + + return retval; +} + +void wxApp::CleanUp() +{ + // all objects pending for deletion must be deleted first, otherwise we + // would crash when they use wxWinHandleHash (and UnregisterWindowClasses() + // call wouldn't succeed as long as any windows still exist), so call the + // base class method first and only then do our clean up + wxAppBase::CleanUp(); + +#if !defined(__WXMICROWIN__) && !defined(__WXWINCE__) + wxSetKeyboardHook(false); +#endif + + wxOleUninitialize(); + + // for an EXE the classes are unregistered when it terminates but DLL may + // be loaded several times (load/unload/load) into the same process in + // which case the registration will fail after the first time if we don't + // unregister the classes now + UnregisterWindowClasses(); + + delete wxWinHandleHash; + wxWinHandleHash = NULL; + +#ifdef __WXWINCE__ + free( wxCanvasClassName ); + free( wxCanvasClassNameNR ); +#endif +} + +// ---------------------------------------------------------------------------- +// wxApp ctor/dtor +// ---------------------------------------------------------------------------- + +wxApp::wxApp() +{ + m_printMode = wxPRINT_WINDOWS; +} + +wxApp::~wxApp() +{ +} + +// ---------------------------------------------------------------------------- +// wxApp idle handling +// ---------------------------------------------------------------------------- + +void wxApp::OnIdle(wxIdleEvent& event) +{ + wxAppBase::OnIdle(event); + +#if wxUSE_DC_CACHEING + // automated DC cache management: clear the cached DCs and bitmap + // if it's likely that the app has finished with them, that is, we + // get an idle event and we're not dragging anything. + if (!::GetKeyState(MK_LBUTTON) && !::GetKeyState(MK_MBUTTON) && !::GetKeyState(MK_RBUTTON)) + wxDC::ClearCache(); +#endif // wxUSE_DC_CACHEING +} + +void wxApp::WakeUpIdle() +{ + // Send the top window a dummy message so idle handler processing will + // start up again. Doing it this way ensures that the idle handler + // wakes up in the right thread (see also wxWakeUpMainThread() which does + // the same for the main app thread only) + wxWindow *topWindow = wxTheApp->GetTopWindow(); + if ( topWindow ) + { + if ( !::PostMessage(GetHwndOf(topWindow), WM_NULL, 0, 0) ) + { + // should never happen + wxLogLastError(wxT("PostMessage(WM_NULL)")); + } + } +} + +// ---------------------------------------------------------------------------- +// other wxApp event hanlders +// ---------------------------------------------------------------------------- + +void wxApp::OnEndSession(wxCloseEvent& WXUNUSED(event)) +{ + if (GetTopWindow()) + GetTopWindow()->Close(true); +} + +// Default behaviour: close the application with prompts. The +// user can veto the close, and therefore the end session. +void wxApp::OnQueryEndSession(wxCloseEvent& event) +{ + if (GetTopWindow()) + { + if (!GetTopWindow()->Close(!event.CanVeto())) + event.Veto(true); + } +} + +// ---------------------------------------------------------------------------- +// miscellaneous +// ---------------------------------------------------------------------------- + +/* static */ +int wxApp::GetComCtl32Version() +{ +#if defined(__WXMICROWIN__) || defined(__WXWINCE__) + return 0; +#else + // cache the result + // + // NB: this is MT-ok as in the worst case we'd compute s_verComCtl32 twice, + // but as its value should be the same both times it doesn't matter + static int s_verComCtl32 = -1; + + if ( s_verComCtl32 == -1 ) + { + // initally assume no comctl32.dll at all + s_verComCtl32 = 0; + + // we're prepared to handle the errors + wxLogNull noLog; + +#if wxUSE_DYNLIB_CLASS + // do we have it? + wxDynamicLibrary dllComCtl32(_T("comctl32.dll"), wxDL_VERBATIM); + + // if so, then we can check for the version + if ( dllComCtl32.IsLoaded() ) + { + // now check if the function is available during run-time + wxDYNLIB_FUNCTION( DLLGETVERSIONPROC, DllGetVersion, dllComCtl32 ); + if ( pfnDllGetVersion ) + { + DLLVERSIONINFO dvi; + dvi.cbSize = sizeof(dvi); + + HRESULT hr = (*pfnDllGetVersion)(&dvi); + if ( FAILED(hr) ) + { + wxLogApiError(_T("DllGetVersion"), hr); + } + else + { + // this is incompatible with _WIN32_IE values, but + // compatible with the other values returned by + // GetComCtl32Version() + s_verComCtl32 = 100*dvi.dwMajorVersion + + dvi.dwMinorVersion; + } + } + + // if DllGetVersion() is unavailable either during compile or + // run-time, try to guess the version otherwise + if ( !s_verComCtl32 ) + { + // InitCommonControlsEx is unique to 4.70 and later + void *pfn = dllComCtl32.GetSymbol(_T("InitCommonControlsEx")); + if ( !pfn ) + { + // not found, must be 4.00 + s_verComCtl32 = 400; + } + else // 4.70+ + { + // many symbols appeared in comctl32 4.71, could use any of + // them except may be DllInstall() + pfn = dllComCtl32.GetSymbol(_T("InitializeFlatSB")); + if ( !pfn ) + { + // not found, must be 4.70 + s_verComCtl32 = 470; + } + else + { + // found, must be 4.71 or later + s_verComCtl32 = 471; + } + } + } + } +#endif + } + + return s_verComCtl32; +#endif // Microwin/!Microwin +} + +// Yield to incoming messages + +bool wxApp::Yield(bool onlyIfNeeded) +{ + // MT-FIXME + static bool s_inYield = false; + +#if wxUSE_LOG + // disable log flushing from here because a call to wxYield() shouldn't + // normally result in message boxes popping up &c + wxLog::Suspend(); +#endif // wxUSE_LOG + + if ( s_inYield ) + { + if ( !onlyIfNeeded ) + { + wxFAIL_MSG( wxT("wxYield called recursively" ) ); + } + + return false; + } + + s_inYield = true; + + // we don't want to process WM_QUIT from here - it should be processed in + // the main event loop in order to stop it + MSG msg; + while ( PeekMessage(&msg, (HWND)0, 0, 0, PM_NOREMOVE) && + msg.message != WM_QUIT ) + { +#if wxUSE_THREADS + wxMutexGuiLeaveOrEnter(); +#endif // wxUSE_THREADS + + if ( !wxTheApp->Dispatch() ) + break; + } + + // if there are pending events, we must process them. + ProcessPendingEvents(); + +#if wxUSE_LOG + // let the logs be flashed again + wxLog::Resume(); +#endif // wxUSE_LOG + + s_inYield = false; + + return true; +} + +#if wxUSE_EXCEPTIONS + +// ---------------------------------------------------------------------------- +// exception handling +// ---------------------------------------------------------------------------- + +bool wxApp::OnExceptionInMainLoop() +{ + // ask the user about what to do: use the Win32 API function here as it + // could be dangerous to use any wxWidgets code in this state + switch ( + ::MessageBox + ( + NULL, + _T("An unhandled exception occurred. Press \"Abort\" to \ +terminate the program,\r\n\ +\"Retry\" to exit the program normally and \"Ignore\" to try to continue."), + _T("Unhandled exception"), + MB_ABORTRETRYIGNORE | + MB_ICONERROR| + MB_TASKMODAL + ) + ) + { + case IDABORT: + throw; + + default: + wxFAIL_MSG( _T("unexpected MessageBox() return code") ); + // fall through + + case IDRETRY: + return false; + + case IDIGNORE: + return true; + } +} + +#endif // wxUSE_EXCEPTIONS + +// ---------------------------------------------------------------------------- +// deprecated event loop functions +// ---------------------------------------------------------------------------- + +#if WXWIN_COMPATIBILITY_2_4 + +void wxApp::DoMessage(WXMSG *pMsg) +{ + wxEventLoop *evtLoop = wxEventLoop::GetActive(); + if ( evtLoop ) + evtLoop->ProcessMessage(pMsg); +} + +bool wxApp::DoMessage() +{ + wxEventLoop *evtLoop = wxEventLoop::GetActive(); + return evtLoop ? evtLoop->Dispatch() : false; +} + +bool wxApp::ProcessMessage(WXMSG* pMsg) +{ + wxEventLoop *evtLoop = wxEventLoop::GetActive(); + return evtLoop && evtLoop->PreProcessMessage(pMsg); +} + +#endif // WXWIN_COMPATIBILITY_2_4 diff --git a/Externals/wxWidgets/src/msw/basemsw.cpp b/Externals/wxWidgets/src/msw/basemsw.cpp new file mode 100644 index 0000000000..5c820d4de2 --- /dev/null +++ b/Externals/wxWidgets/src/msw/basemsw.cpp @@ -0,0 +1,73 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: msw/basemsw.cpp +// Purpose: misc stuff only used in console applications under MSW +// Author: Vadim Zeitlin +// Modified by: +// Created: 22.06.2003 +// RCS-ID: $Id: basemsw.cpp 39831 2006-06-25 23:53:53Z VZ $ +// Copyright: (c) 2003 Vadim Zeitlin +// License: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// for compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#ifndef WX_PRECOMP +#endif //WX_PRECOMP + +#include "wx/apptrait.h" +// MBN: this is a workaround for MSVC 5: if it is not #included in +// some wxBase file, wxRecursionGuard methods won't be exported from +// wxBase.dll, and MSVC 5 will give linker errors +#include "wx/recguard.h" + +#include "wx/msw/private.h" + +// ============================================================================ +// wxConsoleAppTraits implementation +// ============================================================================ + +void wxConsoleAppTraits::AlwaysYield() +{ + // we need to use special logic to deal with WM_PAINT: as this pseudo + // message is generated automatically as long as there are invalidated + // windows belonging to this thread, we'd never return if we waited here + // until we have no more of them left. OTOH, this message is always the + // last one in the queue, so we can safely return as soon as we detect it + MSG msg; + while ( ::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) ) + { + if ( msg.message == WM_PAINT ) + break; + } +} + +void *wxConsoleAppTraits::BeforeChildWaitLoop() +{ + // nothing to do here + return NULL; +} + +void wxConsoleAppTraits::AfterChildWaitLoop(void * WXUNUSED(data)) +{ + // nothing to do here +} + +bool wxConsoleAppTraits::DoMessageFromThreadWait() +{ + // nothing to process here + return true; +} + diff --git a/Externals/wxWidgets/src/msw/bitmap.cpp b/Externals/wxWidgets/src/msw/bitmap.cpp new file mode 100644 index 0000000000..188a7fe44d --- /dev/null +++ b/Externals/wxWidgets/src/msw/bitmap.cpp @@ -0,0 +1,1806 @@ +//////////////////////////////////////////////////////////////////////////// +// Name: src/msw/bitmap.cpp +// Purpose: wxBitmap +// Author: Julian Smart +// Modified by: +// Created: 04/01/98 +// RCS-ID: $Id: bitmap.cpp 48236 2007-08-20 23:43:32Z KO $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#include "wx/bitmap.h" + +#ifndef WX_PRECOMP + #include + + #include "wx/list.h" + #include "wx/utils.h" + #include "wx/app.h" + #include "wx/palette.h" + #include "wx/dcmemory.h" + #include "wx/icon.h" + #include "wx/log.h" + #include "wx/image.h" +#endif + +#include "wx/msw/private.h" + +#if wxUSE_WXDIB + #include "wx/msw/dib.h" +#endif + +#ifdef wxHAVE_RAW_BITMAP + #include "wx/rawbmp.h" +#endif + +// missing from mingw32 header +#ifndef CLR_INVALID + #define CLR_INVALID ((COLORREF)-1) +#endif // no CLR_INVALID + +// ---------------------------------------------------------------------------- +// Bitmap data +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxBitmapRefData : public wxGDIImageRefData +{ +public: + wxBitmapRefData(); + wxBitmapRefData(const wxBitmapRefData& data); + virtual ~wxBitmapRefData() { Free(); } + + virtual void Free(); + + // set the mask object to use as the mask, we take ownership of it + void SetMask(wxMask *mask) + { + delete m_bitmapMask; + m_bitmapMask = mask; + } + + // set the HBITMAP to use as the mask + void SetMask(HBITMAP hbmpMask) + { + SetMask(new wxMask((WXHBITMAP)hbmpMask)); + } + + // return the mask + wxMask *GetMask() const { return m_bitmapMask; } + +public: +#if wxUSE_PALETTE + wxPalette m_bitmapPalette; +#endif // wxUSE_PALETTE + + // MSW-specific + // ------------ + +#ifdef __WXDEBUG__ + // this field is solely for error checking: we detect selecting a bitmap + // into more than one DC at once or deleting a bitmap still selected into a + // DC (both are serious programming errors under Windows) + wxDC *m_selectedInto; +#endif // __WXDEBUG__ + +#if wxUSE_WXDIB + // when GetRawData() is called for a DDB we need to convert it to a DIB + // first to be able to provide direct access to it and we cache that DIB + // here and convert it back to DDB when UngetRawData() is called + wxDIB *m_dib; +#endif + + // true if we have alpha transparency info and can be drawn using + // AlphaBlend() + bool m_hasAlpha; + + // true if our HBITMAP is a DIB section, false if it is a DDB + bool m_isDIB; + +private: + // optional mask for transparent drawing + wxMask *m_bitmapMask; + + + // not implemented + wxBitmapRefData& operator=(const wxBitmapRefData&); +}; + +// ---------------------------------------------------------------------------- +// macros +// ---------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxBitmap, wxGDIObject) +IMPLEMENT_DYNAMIC_CLASS(wxMask, wxObject) + +IMPLEMENT_DYNAMIC_CLASS(wxBitmapHandler, wxObject) + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// helper functions +// ---------------------------------------------------------------------------- + +// decide whether we should create a DIB or a DDB for the given parameters +// +// NB: we always use DIBs under Windows CE as this is much simpler (even if +// also less efficient...) and we obviously can't use them if there is no +// DIB support compiled in at all +#ifdef __WXWINCE__ + static inline bool wxShouldCreateDIB(int, int, int, WXHDC) { return true; } + + #define ALWAYS_USE_DIB +#elif !wxUSE_WXDIB + // no sense in defining wxShouldCreateDIB() as we can't compile code + // executed if it is true, so we have to use #if's anyhow + #define NEVER_USE_DIB +#else // wxUSE_WXDIB && !__WXWINCE__ + static inline bool wxShouldCreateDIB(int w, int h, int d, WXHDC hdc) + { + // here is the logic: + // + // (a) if hdc is specified, the caller explicitly wants DDB + // (b) otherwise, create a DIB if depth >= 24 (we don't support 16bpp + // or less DIBs anyhow) + // (c) finally, create DIBs under Win9x even if the depth hasn't been + // explicitly specified but the current display depth is 24 or + // more and the image is "big", i.e. > 16Mb which is the + // theoretical limit for DDBs under Win9x + // + // consequences (all of which seem to make sense): + // + // (i) by default, DDBs are created (depth == -1 usually) + // (ii) DIBs can be created by explicitly specifying the depth + // (iii) using a DC always forces creating a DDB + return !hdc && + (d >= 24 || + (d == -1 && + wxDIB::GetLineSize(w, wxDisplayDepth())*h > 16*1024*1024)); + } + + #define SOMETIMES_USE_DIB +#endif // different DIB usage scenarious + +// ---------------------------------------------------------------------------- +// wxBitmapRefData +// ---------------------------------------------------------------------------- + +wxBitmapRefData::wxBitmapRefData() +{ +#ifdef __WXDEBUG__ + m_selectedInto = NULL; +#endif + m_bitmapMask = NULL; + + m_hBitmap = (WXHBITMAP) NULL; +#if wxUSE_WXDIB + m_dib = NULL; +#endif + + m_isDIB = + m_hasAlpha = false; +} + +wxBitmapRefData::wxBitmapRefData(const wxBitmapRefData& data) + : wxGDIImageRefData(data) +{ +#ifdef __WXDEBUG__ + m_selectedInto = NULL; +#endif + + // (deep) copy the mask if present + m_bitmapMask = NULL; + if (data.m_bitmapMask) + m_bitmapMask = new wxMask(*data.m_bitmapMask); + + // FIXME: we don't copy m_hBitmap currently but we should, see wxBitmap:: + // CloneRefData() + + wxASSERT_MSG( !data.m_isDIB, + _T("can't copy bitmap locked for raw access!") ); + m_isDIB = false; + + m_hasAlpha = data.m_hasAlpha; +} + +void wxBitmapRefData::Free() +{ + wxASSERT_MSG( !m_selectedInto, + wxT("deleting bitmap still selected into wxMemoryDC") ); + +#if wxUSE_WXDIB + wxASSERT_MSG( !m_dib, _T("forgot to call wxBitmap::UngetRawData()!") ); +#endif + + if ( m_hBitmap) + { + if ( !::DeleteObject((HBITMAP)m_hBitmap) ) + { + wxLogLastError(wxT("DeleteObject(hbitmap)")); + } + } + + delete m_bitmapMask; + m_bitmapMask = NULL; +} + +// ---------------------------------------------------------------------------- +// wxBitmap creation +// ---------------------------------------------------------------------------- + +wxGDIImageRefData *wxBitmap::CreateData() const +{ + return new wxBitmapRefData; +} + +wxObjectRefData *wxBitmap::CloneRefData(const wxObjectRefData *dataOrig) const +{ + const wxBitmapRefData * + data = wx_static_cast(const wxBitmapRefData *, dataOrig); + if ( !data ) + return NULL; + + // FIXME: this method is backwards, it should just create a new + // wxBitmapRefData using its copy ctor but instead it modifies this + // bitmap itself and then returns its m_refData -- which works, of + // course (except in !wxUSE_WXDIB), but is completely illogical + wxBitmap *self = wx_const_cast(wxBitmap *, this); + +#if wxUSE_WXDIB + // copy the other bitmap + if ( data->m_hBitmap ) + { + wxDIB dib((HBITMAP)(data->m_hBitmap)); + self->CopyFromDIB(dib); + } + else +#endif // wxUSE_WXDIB + { + // copy the bitmap data + self->m_refData = new wxBitmapRefData(*data); + } + + // copy also the mask + wxMask * const maskSrc = data->GetMask(); + if ( maskSrc ) + { + wxBitmapRefData *selfdata = wx_static_cast(wxBitmapRefData *, m_refData); + + selfdata->SetMask(new wxMask(*maskSrc)); + } + + return m_refData; +} + +#ifdef __WIN32__ + +bool wxBitmap::CopyFromIconOrCursor(const wxGDIImage& icon) +{ +#if !defined(__WXMICROWIN__) && !defined(__WXWINCE__) + // it may be either HICON or HCURSOR + HICON hicon = (HICON)icon.GetHandle(); + + ICONINFO iconInfo; + if ( !::GetIconInfo(hicon, &iconInfo) ) + { + wxLogLastError(wxT("GetIconInfo")); + + return false; + } + + wxBitmapRefData *refData = new wxBitmapRefData; + m_refData = refData; + + int w = icon.GetWidth(), + h = icon.GetHeight(); + + refData->m_width = w; + refData->m_height = h; + refData->m_depth = wxDisplayDepth(); + + refData->m_hBitmap = (WXHBITMAP)iconInfo.hbmColor; + +#if wxUSE_WXDIB + // If the icon is 32 bits per pixel then it may have alpha channel data, + // although there are some icons that are 32 bpp but have no alpha... So + // convert to a DIB and manually check the 4th byte for each pixel. + BITMAP bm; + if ( ::GetObject(iconInfo.hbmColor, sizeof(BITMAP), (LPVOID)&bm) + && bm.bmBitsPixel == 32) + { + wxDIB dib(iconInfo.hbmColor); + if (dib.IsOk()) + { + unsigned char* pixels = dib.GetData(); + for (int idx=0; idxm_hasAlpha = true; + break; + } + } + } + } +#endif + if ( !refData->m_hasAlpha ) + { + // the mask returned by GetIconInfo() is inverted compared to the usual + // wxWin convention + refData->SetMask(wxInvertMask(iconInfo.hbmMask, w, h)); + } + + // delete the old one now as we don't need it any more + ::DeleteObject(iconInfo.hbmMask); + + return true; +#else + wxUnusedVar(icon); + return false; +#endif +} + +#endif // Win32 + +bool wxBitmap::CopyFromCursor(const wxCursor& cursor) +{ + UnRef(); + + if ( !cursor.Ok() ) + return false; + + return CopyFromIconOrCursor(cursor); +} + +bool wxBitmap::CopyFromIcon(const wxIcon& icon) +{ + UnRef(); + + if ( !icon.Ok() ) + return false; + + return CopyFromIconOrCursor(icon); +} + +#ifndef NEVER_USE_DIB + +bool wxBitmap::CopyFromDIB(const wxDIB& dib) +{ + wxCHECK_MSG( dib.IsOk(), false, _T("invalid DIB in CopyFromDIB") ); + +#ifdef SOMETIMES_USE_DIB + HBITMAP hbitmap = dib.CreateDDB(); + if ( !hbitmap ) + return false; +#else // ALWAYS_USE_DIB + HBITMAP hbitmap = ((wxDIB &)dib).Detach(); // const_cast +#endif // SOMETIMES_USE_DIB/ALWAYS_USE_DIB + + UnRef(); + + wxBitmapRefData *refData = new wxBitmapRefData; + m_refData = refData; + + refData->m_width = dib.GetWidth(); + refData->m_height = dib.GetHeight(); + refData->m_depth = dib.GetDepth(); + + refData->m_hBitmap = (WXHBITMAP)hbitmap; + +#if wxUSE_PALETTE + wxPalette *palette = dib.CreatePalette(); + if ( palette ) + { + refData->m_bitmapPalette = *palette; + } + + delete palette; +#endif // wxUSE_PALETTE + + return true; +} + +#endif // NEVER_USE_DIB + +wxBitmap::~wxBitmap() +{ +} + +wxBitmap::wxBitmap(const char bits[], int width, int height, int depth) +{ +#ifndef __WXMICROWIN__ + wxBitmapRefData *refData = new wxBitmapRefData; + m_refData = refData; + + refData->m_width = width; + refData->m_height = height; + refData->m_depth = depth; + + char *data; + if ( depth == 1 ) + { + // we assume that it is in XBM format which is not quite the same as + // the format CreateBitmap() wants because the order of bytes in the + // line is reversed! + const size_t bytesPerLine = (width + 7) / 8; + const size_t padding = bytesPerLine % 2; + const size_t len = height * ( padding + bytesPerLine ); + data = (char *)malloc(len); + const char *src = bits; + char *dst = data; + + for ( int rows = 0; rows < height; rows++ ) + { + for ( size_t cols = 0; cols < bytesPerLine; cols++ ) + { + unsigned char val = *src++; + unsigned char reversed = 0; + + for ( int bits = 0; bits < 8; bits++) + { + reversed <<= 1; + reversed |= (unsigned char)(val & 0x01); + val >>= 1; + } + *dst++ = ~reversed; + } + + if ( padding ) + *dst++ = 0; + } + } + else + { + // bits should already be in Windows standard format + data = (char *)bits; // const_cast is harmless + } + + HBITMAP hbmp = ::CreateBitmap(width, height, 1, depth, data); + if ( !hbmp ) + { + wxLogLastError(wxT("CreateBitmap")); + } + + if ( data != bits ) + { + free(data); + } + + SetHBITMAP((WXHBITMAP)hbmp); +#endif +} + +wxBitmap::wxBitmap(int w, int h, int d) +{ + (void)Create(w, h, d); +} + +wxBitmap::wxBitmap(int w, int h, const wxDC& dc) +{ + (void)Create(w, h, dc); +} + +wxBitmap::wxBitmap(const void* data, long type, int width, int height, int depth) +{ + (void)Create(data, type, width, height, depth); +} + +wxBitmap::wxBitmap(const wxString& filename, wxBitmapType type) +{ + LoadFile(filename, (int)type); +} + +bool wxBitmap::Create(int width, int height, int depth) +{ + return DoCreate(width, height, depth, 0); +} + +bool wxBitmap::Create(int width, int height, const wxDC& dc) +{ + wxCHECK_MSG( dc.Ok(), false, _T("invalid HDC in wxBitmap::Create()") ); + + return DoCreate(width, height, -1, dc.GetHDC()); +} + +bool wxBitmap::DoCreate(int w, int h, int d, WXHDC hdc) +{ + UnRef(); + + m_refData = new wxBitmapRefData; + + GetBitmapData()->m_width = w; + GetBitmapData()->m_height = h; + + HBITMAP hbmp wxDUMMY_INITIALIZE(0); + +#ifndef NEVER_USE_DIB + if ( wxShouldCreateDIB(w, h, d, hdc) ) + { + if ( d == -1 ) + { + // create DIBs without alpha channel by default + d = 24; + } + + wxDIB dib(w, h, d); + if ( !dib.IsOk() ) + return false; + + // don't delete the DIB section in dib object dtor + hbmp = dib.Detach(); + + GetBitmapData()->m_isDIB = true; + GetBitmapData()->m_depth = d; + } + else // create a DDB +#endif // NEVER_USE_DIB + { +#ifndef ALWAYS_USE_DIB +#ifndef __WXMICROWIN__ + if ( d > 0 ) + { + hbmp = ::CreateBitmap(w, h, 1, d, NULL); + if ( !hbmp ) + { + wxLogLastError(wxT("CreateBitmap")); + } + + GetBitmapData()->m_depth = d; + } + else // d == 0, create bitmap compatible with the screen +#endif // !__WXMICROWIN__ + { + ScreenHDC dc; + hbmp = ::CreateCompatibleBitmap(dc, w, h); + if ( !hbmp ) + { + wxLogLastError(wxT("CreateCompatibleBitmap")); + } + + GetBitmapData()->m_depth = wxDisplayDepth(); + } +#endif // !ALWAYS_USE_DIB + } + + SetHBITMAP((WXHBITMAP)hbmp); + + return Ok(); +} + +#if wxUSE_IMAGE + +// ---------------------------------------------------------------------------- +// wxImage to/from conversions for Microwin +// ---------------------------------------------------------------------------- + +// Microwin versions are so different from normal ones that it really doesn't +// make sense to use #ifdefs inside the function bodies +#ifdef __WXMICROWIN__ + +bool wxBitmap::CreateFromImage(const wxImage& image, int depth, const wxDC& dc) +{ + // Set this to 1 to experiment with mask code, + // which currently doesn't work + #define USE_MASKS 0 + + m_refData = new wxBitmapRefData(); + + // Initial attempt at a simple-minded implementation. + // The bitmap will always be created at the screen depth, + // so the 'depth' argument is ignored. + + HDC hScreenDC = ::GetDC(NULL); + int screenDepth = ::GetDeviceCaps(hScreenDC, BITSPIXEL); + + HBITMAP hBitmap = ::CreateCompatibleBitmap(hScreenDC, image.GetWidth(), image.GetHeight()); + HBITMAP hMaskBitmap = NULL; + HBITMAP hOldMaskBitmap = NULL; + HDC hMaskDC = NULL; + unsigned char maskR = 0; + unsigned char maskG = 0; + unsigned char maskB = 0; + + // printf("Created bitmap %d\n", (int) hBitmap); + if (hBitmap == NULL) + { + ::ReleaseDC(NULL, hScreenDC); + return false; + } + HDC hMemDC = ::CreateCompatibleDC(hScreenDC); + + HBITMAP hOldBitmap = ::SelectObject(hMemDC, hBitmap); + ::ReleaseDC(NULL, hScreenDC); + + // created an mono-bitmap for the possible mask + bool hasMask = image.HasMask(); + + if ( hasMask ) + { +#if USE_MASKS + // FIXME: we should be able to pass bpp = 1, but + // GdBlit can't handle a different depth +#if 0 + hMaskBitmap = ::CreateBitmap( (WORD)image.GetWidth(), (WORD)image.GetHeight(), 1, 1, NULL ); +#else + hMaskBitmap = ::CreateCompatibleBitmap( hMemDC, (WORD)image.GetWidth(), (WORD)image.GetHeight()); +#endif + maskR = image.GetMaskRed(); + maskG = image.GetMaskGreen(); + maskB = image.GetMaskBlue(); + + if (!hMaskBitmap) + { + hasMask = false; + } + else + { + hScreenDC = ::GetDC(NULL); + hMaskDC = ::CreateCompatibleDC(hScreenDC); + ::ReleaseDC(NULL, hScreenDC); + + hOldMaskBitmap = ::SelectObject( hMaskDC, hMaskBitmap); + } +#else + hasMask = false; +#endif + } + + int i, j; + for (i = 0; i < image.GetWidth(); i++) + { + for (j = 0; j < image.GetHeight(); j++) + { + unsigned char red = image.GetRed(i, j); + unsigned char green = image.GetGreen(i, j); + unsigned char blue = image.GetBlue(i, j); + + ::SetPixel(hMemDC, i, j, PALETTERGB(red, green, blue)); + + if (hasMask) + { + // scan the bitmap for the transparent colour and set the corresponding + // pixels in the mask to BLACK and the rest to WHITE + if (maskR == red && maskG == green && maskB == blue) + ::SetPixel(hMaskDC, i, j, PALETTERGB(0, 0, 0)); + else + ::SetPixel(hMaskDC, i, j, PALETTERGB(255, 255, 255)); + } + } + } + + ::SelectObject(hMemDC, hOldBitmap); + ::DeleteDC(hMemDC); + if (hasMask) + { + ::SelectObject(hMaskDC, hOldMaskBitmap); + ::DeleteDC(hMaskDC); + + ((wxBitmapRefData*)m_refData)->SetMask(hMaskBitmap); + } + + SetWidth(image.GetWidth()); + SetHeight(image.GetHeight()); + SetDepth(screenDepth); + SetHBITMAP( (WXHBITMAP) hBitmap ); + +#if wxUSE_PALETTE + // Copy the palette from the source image + SetPalette(image.GetPalette()); +#endif // wxUSE_PALETTE + + return true; +} + +wxImage wxBitmap::ConvertToImage() const +{ + // Initial attempt at a simple-minded implementation. + // The bitmap will always be created at the screen depth, + // so the 'depth' argument is ignored. + // TODO: transparency (create a mask image) + + if (!Ok()) + { + wxFAIL_MSG( wxT("bitmap is invalid") ); + return wxNullImage; + } + + wxImage image; + + wxCHECK_MSG( Ok(), wxNullImage, wxT("invalid bitmap") ); + + // create an wxImage object + int width = GetWidth(); + int height = GetHeight(); + image.Create( width, height ); + unsigned char *data = image.GetData(); + if( !data ) + { + wxFAIL_MSG( wxT("could not allocate data for image") ); + return wxNullImage; + } + + HDC hScreenDC = ::GetDC(NULL); + + HDC hMemDC = ::CreateCompatibleDC(hScreenDC); + ::ReleaseDC(NULL, hScreenDC); + + HBITMAP hBitmap = (HBITMAP) GetHBITMAP(); + + HBITMAP hOldBitmap = ::SelectObject(hMemDC, hBitmap); + + int i, j; + for (i = 0; i < GetWidth(); i++) + { + for (j = 0; j < GetHeight(); j++) + { + COLORREF color = ::GetPixel(hMemDC, i, j); + unsigned char red = GetRValue(color); + unsigned char green = GetGValue(color); + unsigned char blue = GetBValue(color); + + image.SetRGB(i, j, red, green, blue); + } + } + + ::SelectObject(hMemDC, hOldBitmap); + ::DeleteDC(hMemDC); + +#if wxUSE_PALETTE + // Copy the palette from the source image + if (GetPalette()) + image.SetPalette(* GetPalette()); +#endif // wxUSE_PALETTE + + return image; +} + +#endif // __WXMICROWIN__ + +// ---------------------------------------------------------------------------- +// wxImage to/from conversions +// ---------------------------------------------------------------------------- + +bool wxBitmap::CreateFromImage(const wxImage& image, int depth) +{ + return CreateFromImage(image, depth, 0); +} + +bool wxBitmap::CreateFromImage(const wxImage& image, const wxDC& dc) +{ + wxCHECK_MSG( dc.Ok(), false, + _T("invalid HDC in wxBitmap::CreateFromImage()") ); + + return CreateFromImage(image, -1, dc.GetHDC()); +} + +#if wxUSE_WXDIB + +bool wxBitmap::CreateFromImage(const wxImage& image, int depth, WXHDC hdc) +{ + wxCHECK_MSG( image.Ok(), false, wxT("invalid image") ); + + UnRef(); + + // first convert the image to DIB + const int h = image.GetHeight(); + const int w = image.GetWidth(); + + wxDIB dib(image); + if ( !dib.IsOk() ) + return false; + + if ( depth == -1 ) + depth = dib.GetDepth(); // Get depth from image if none specified + + // store the bitmap parameters + wxBitmapRefData *refData = new wxBitmapRefData; + refData->m_width = w; + refData->m_height = h; + refData->m_hasAlpha = image.HasAlpha(); + + m_refData = refData; + + + // next either store DIB as is or create a DDB from it + HBITMAP hbitmap wxDUMMY_INITIALIZE(0); + + // are we going to use DIB? + // + // NB: DDBs don't support alpha so if we have alpha channel we must use DIB + if ( image.HasAlpha() || wxShouldCreateDIB(w, h, depth, hdc) ) + { + // don't delete the DIB section in dib object dtor + hbitmap = dib.Detach(); + + refData->m_isDIB = true; + refData->m_depth = depth; + } +#ifndef ALWAYS_USE_DIB + else // we need to convert DIB to DDB + { + hbitmap = dib.CreateDDB((HDC)hdc); + + refData->m_depth = depth; + } +#endif // !ALWAYS_USE_DIB + + // validate this object + SetHBITMAP((WXHBITMAP)hbitmap); + + // finally also set the mask if we have one + if ( image.HasMask() ) + { + const size_t len = 2*((w+15)/16); + BYTE *src = image.GetData(); + BYTE *data = new BYTE[h*len]; + memset(data, 0, h*len); + BYTE r = image.GetMaskRed(), + g = image.GetMaskGreen(), + b = image.GetMaskBlue(); + BYTE *dst = data; + for ( int y = 0; y < h; y++, dst += len ) + { + BYTE *dstLine = dst; + BYTE mask = 0x80; + for ( int x = 0; x < w; x++, src += 3 ) + { + if (src[0] != r || src[1] != g || src[2] != b) + *dstLine |= mask; + + if ( (mask >>= 1) == 0 ) + { + dstLine++; + mask = 0x80; + } + } + } + + hbitmap = ::CreateBitmap(w, h, 1, 1, data); + if ( !hbitmap ) + { + wxLogLastError(_T("CreateBitmap(mask)")); + } + else + { + SetMask(new wxMask((WXHBITMAP)hbitmap)); + } + + delete[] data; + } + + return true; +} + +wxImage wxBitmap::ConvertToImage() const +{ + // convert DDB to DIB + wxDIB dib(*this); + + if ( !dib.IsOk() ) + { + return wxNullImage; + } + + // and then DIB to our wxImage + wxImage image = dib.ConvertToImage(); + if ( !image.Ok() ) + { + return wxNullImage; + } + + // now do the same for the mask, if we have any + HBITMAP hbmpMask = GetMask() ? (HBITMAP) GetMask()->GetMaskBitmap() : NULL; + if ( hbmpMask ) + { + wxDIB dibMask(hbmpMask); + if ( dibMask.IsOk() ) + { + // TODO: use wxRawBitmap to iterate over DIB + + // we hard code the mask colour for now but we could also make an + // effort (and waste time) to choose a colour not present in the + // image already to avoid having to fudge the pixels below -- + // whether it's worth to do it is unclear however + static const int MASK_RED = 1; + static const int MASK_GREEN = 2; + static const int MASK_BLUE = 3; + static const int MASK_BLUE_REPLACEMENT = 2; + + const int h = dibMask.GetHeight(); + const int w = dibMask.GetWidth(); + const int bpp = dibMask.GetDepth(); + const int maskBytesPerPixel = bpp >> 3; + const int maskBytesPerLine = wxDIB::GetLineSize(w, bpp); + unsigned char *data = image.GetData(); + + // remember that DIBs are stored in bottom to top order + unsigned char * + maskLineStart = dibMask.GetData() + ((h - 1) * maskBytesPerLine); + + for ( int y = 0; y < h; y++, maskLineStart -= maskBytesPerLine ) + { + // traverse one mask DIB line + unsigned char *mask = maskLineStart; + for ( int x = 0; x < w; x++, mask += maskBytesPerPixel ) + { + // should this pixel be transparent? + if ( *mask ) + { + // no, check that it isn't transparent by accident + if ( (data[0] == MASK_RED) && + (data[1] == MASK_GREEN) && + (data[2] == MASK_BLUE) ) + { + // we have to fudge the colour a bit to prevent + // this pixel from appearing transparent + data[2] = MASK_BLUE_REPLACEMENT; + } + + data += 3; + } + else // yes, transparent pixel + { + *data++ = MASK_RED; + *data++ = MASK_GREEN; + *data++ = MASK_BLUE; + } + } + } + + image.SetMaskColour(MASK_RED, MASK_GREEN, MASK_BLUE); + } + } + + return image; +} + +#else // !wxUSE_WXDIB + +bool +wxBitmap::CreateFromImage(const wxImage& WXUNUSED(image), + int WXUNUSED(depth), + WXHDC WXUNUSED(hdc)) +{ + return false; +} + +wxImage wxBitmap::ConvertToImage() const +{ + return wxImage(); +} + +#endif // wxUSE_WXDIB/!wxUSE_WXDIB + +#endif // wxUSE_IMAGE + +// ---------------------------------------------------------------------------- +// loading and saving bitmaps +// ---------------------------------------------------------------------------- + +bool wxBitmap::LoadFile(const wxString& filename, long type) +{ + UnRef(); + + wxBitmapHandler *handler = wxDynamicCast(FindHandler(type), wxBitmapHandler); + + if ( handler ) + { + m_refData = new wxBitmapRefData; + + return handler->LoadFile(this, filename, type, -1, -1); + } +#if wxUSE_IMAGE && wxUSE_WXDIB + else // no bitmap handler found + { + wxImage image; + if ( image.LoadFile( filename, type ) && image.Ok() ) + { + *this = wxBitmap(image); + + return true; + } + } +#endif // wxUSE_IMAGE + + return false; +} + +bool wxBitmap::Create(const void* data, long type, int width, int height, int depth) +{ + UnRef(); + + wxBitmapHandler *handler = wxDynamicCast(FindHandler(type), wxBitmapHandler); + + if ( !handler ) + { + wxLogDebug(wxT("Failed to create bitmap: no bitmap handler for type %ld defined."), type); + + return false; + } + + m_refData = new wxBitmapRefData; + + return handler->Create(this, data, type, width, height, depth); +} + +bool wxBitmap::SaveFile(const wxString& filename, + int type, + const wxPalette *palette) +{ + wxBitmapHandler *handler = wxDynamicCast(FindHandler(type), wxBitmapHandler); + + if ( handler ) + { + return handler->SaveFile(this, filename, type, palette); + } +#if wxUSE_IMAGE && wxUSE_WXDIB + else // no bitmap handler found + { + // FIXME what about palette? shouldn't we use it? + wxImage image = ConvertToImage(); + if ( image.Ok() ) + { + return image.SaveFile(filename, type); + } + } +#endif // wxUSE_IMAGE + + return false; +} + +// ---------------------------------------------------------------------------- +// sub bitmap extraction +// ---------------------------------------------------------------------------- +wxBitmap wxBitmap::GetSubBitmap( const wxRect& rect ) const +{ + MemoryHDC dcSrc; + SelectInHDC selectSrc(dcSrc, GetHbitmap()); + return GetSubBitmapOfHDC( rect, (WXHDC)dcSrc ); +} + +wxBitmap wxBitmap::GetSubBitmapOfHDC( const wxRect& rect, WXHDC hdc ) const +{ + wxCHECK_MSG( Ok() && + (rect.x >= 0) && (rect.y >= 0) && + (rect.x+rect.width <= GetWidth()) && + (rect.y+rect.height <= GetHeight()), + wxNullBitmap, wxT("Invalid bitmap or bitmap region") ); + + wxBitmap ret( rect.width, rect.height, GetDepth() ); + wxASSERT_MSG( ret.Ok(), wxT("GetSubBitmap error") ); + +#ifndef __WXMICROWIN__ + // handle alpha channel, if any + if (HasAlpha()) + ret.UseAlpha(); + + // copy bitmap data + MemoryHDC dcSrc, + dcDst; + + { + SelectInHDC selectDst(dcDst, GetHbitmapOf(ret)); + + if ( !selectDst ) + { + wxLogLastError(_T("SelectObject(destBitmap)")); + } + + if ( !::BitBlt(dcDst, 0, 0, rect.width, rect.height, + (HDC)hdc, rect.x, rect.y, SRCCOPY) ) + { + wxLogLastError(_T("BitBlt")); + } + } + + // copy mask if there is one + if ( GetMask() ) + { + HBITMAP hbmpMask = ::CreateBitmap(rect.width, rect.height, 1, 1, 0); + + SelectInHDC selectSrc(dcSrc, (HBITMAP) GetMask()->GetMaskBitmap()), + selectDst(dcDst, hbmpMask); + + if ( !::BitBlt(dcDst, 0, 0, rect.width, rect.height, + dcSrc, rect.x, rect.y, SRCCOPY) ) + { + wxLogLastError(_T("BitBlt")); + } + + wxMask *mask = new wxMask((WXHBITMAP) hbmpMask); + ret.SetMask(mask); + } +#endif // !__WXMICROWIN__ + + return ret; +} + +// ---------------------------------------------------------------------------- +// wxBitmap accessors +// ---------------------------------------------------------------------------- + +#if wxUSE_PALETTE +wxPalette* wxBitmap::GetPalette() const +{ + return GetBitmapData() ? &GetBitmapData()->m_bitmapPalette + : (wxPalette *) NULL; +} +#endif + +wxMask *wxBitmap::GetMask() const +{ + return GetBitmapData() ? GetBitmapData()->GetMask() : (wxMask *) NULL; +} + +wxBitmap wxBitmap::GetMaskBitmap() const +{ + wxBitmap bmp; + wxMask *mask = GetMask(); + if ( mask ) + bmp.SetHBITMAP(mask->GetMaskBitmap()); + return bmp; +} + +#ifdef __WXDEBUG__ + +wxDC *wxBitmap::GetSelectedInto() const +{ + return GetBitmapData() ? GetBitmapData()->m_selectedInto : (wxDC *) NULL; +} + +#endif + +#if WXWIN_COMPATIBILITY_2_4 + +int wxBitmap::GetQuality() const +{ + return 0; +} + +#endif // WXWIN_COMPATIBILITY_2_4 + +void wxBitmap::UseAlpha() +{ + if ( GetBitmapData() ) + GetBitmapData()->m_hasAlpha = true; +} + +bool wxBitmap::HasAlpha() const +{ + return GetBitmapData() && GetBitmapData()->m_hasAlpha; +} + +// ---------------------------------------------------------------------------- +// wxBitmap setters +// ---------------------------------------------------------------------------- + +#ifdef __WXDEBUG__ + +void wxBitmap::SetSelectedInto(wxDC *dc) +{ + if ( GetBitmapData() ) + GetBitmapData()->m_selectedInto = dc; +} + +#endif + +#if wxUSE_PALETTE + +void wxBitmap::SetPalette(const wxPalette& palette) +{ + AllocExclusive(); + + GetBitmapData()->m_bitmapPalette = palette; +} + +#endif // wxUSE_PALETTE + +void wxBitmap::SetMask(wxMask *mask) +{ + AllocExclusive(); + + GetBitmapData()->SetMask(mask); +} + +#if WXWIN_COMPATIBILITY_2_4 + +void wxBitmap::SetQuality(int WXUNUSED(quality)) +{ +} + +#endif // WXWIN_COMPATIBILITY_2_4 + +// ---------------------------------------------------------------------------- +// raw bitmap access support +// ---------------------------------------------------------------------------- + +#ifdef wxHAVE_RAW_BITMAP +void *wxBitmap::GetRawData(wxPixelDataBase& data, int bpp) +{ +#if wxUSE_WXDIB + if ( !Ok() ) + { + // no bitmap, no data (raw or otherwise) + return NULL; + } + + // if we're already a DIB we can access our data directly, but if not we + // need to convert this DDB to a DIB section and use it for raw access and + // then convert it back + HBITMAP hDIB; + if ( !GetBitmapData()->m_isDIB ) + { + wxCHECK_MSG( !GetBitmapData()->m_dib, NULL, + _T("GetRawData() may be called only once") ); + + wxDIB *dib = new wxDIB(*this); + if ( !dib->IsOk() ) + { + delete dib; + + return NULL; + } + + // we'll free it in UngetRawData() + GetBitmapData()->m_dib = dib; + + hDIB = dib->GetHandle(); + } + else // we're a DIB + { + hDIB = GetHbitmap(); + } + + DIBSECTION ds; + if ( ::GetObject(hDIB, sizeof(ds), &ds) != sizeof(DIBSECTION) ) + { + wxFAIL_MSG( _T("failed to get DIBSECTION from a DIB?") ); + + return NULL; + } + + // check that the bitmap is in correct format + if ( ds.dsBm.bmBitsPixel != bpp ) + { + wxFAIL_MSG( _T("incorrect bitmap type in wxBitmap::GetRawData()") ); + + return NULL; + } + + // ok, store the relevant info in wxPixelDataBase + const LONG h = ds.dsBm.bmHeight; + + data.m_width = ds.dsBm.bmWidth; + data.m_height = h; + + // remember that DIBs are stored in top to bottom order! + // (We can't just use ds.dsBm.bmWidthBytes here, because it isn't always a + // multiple of 2, as required by the documentation. So we use the official + // formula, which we already use elsewhere.) + const LONG bytesPerRow = + wxDIB::GetLineSize(ds.dsBm.bmWidth, ds.dsBm.bmBitsPixel); + data.m_stride = -bytesPerRow; + + char *bits = (char *)ds.dsBm.bmBits; + if ( h > 1 ) + { + bits += (h - 1)*bytesPerRow; + } + + return bits; +#else + return NULL; +#endif +} + +void wxBitmap::UngetRawData(wxPixelDataBase& dataBase) +{ +#if wxUSE_WXDIB + if ( !Ok() ) + return; + + if ( !&dataBase ) + { + // invalid data, don't crash -- but don't assert neither as we're + // called automatically from wxPixelDataBase dtor and so there is no + // way to prevent this from happening + return; + } + + // if we're a DDB we need to convert DIB back to DDB now to make the + // changes made via raw bitmap access effective + if ( !GetBitmapData()->m_isDIB ) + { + wxDIB *dib = GetBitmapData()->m_dib; + GetBitmapData()->m_dib = NULL; + + // TODO: convert + + delete dib; + } +#endif // wxUSE_WXDIB +} +#endif // #ifdef wxHAVE_RAW_BITMAP + +// ---------------------------------------------------------------------------- +// wxMask +// ---------------------------------------------------------------------------- + +wxMask::wxMask() +{ + m_maskBitmap = 0; +} + +// Copy constructor +wxMask::wxMask(const wxMask &mask) + : wxObject() +{ + BITMAP bmp; + + HDC srcDC = CreateCompatibleDC(0); + HDC destDC = CreateCompatibleDC(0); + + // GetBitmapDimensionEx won't work if SetBitmapDimensionEx wasn't used + // so we'll use GetObject() API here: + if (::GetObject((HGDIOBJ)mask.m_maskBitmap, sizeof(bmp), &bmp) == 0) + { + wxFAIL_MSG(wxT("Cannot retrieve the dimensions of the wxMask to copy")); + return; + } + + // create our HBITMAP + int w = bmp.bmWidth, h = bmp.bmHeight; + m_maskBitmap = (WXHBITMAP)CreateCompatibleBitmap(srcDC, w, h); + + // copy the mask's HBITMAP into our HBITMAP + SelectObject(srcDC, (HBITMAP) mask.m_maskBitmap); + SelectObject(destDC, (HBITMAP) m_maskBitmap); + + BitBlt(destDC, 0, 0, w, h, srcDC, 0, 0, SRCCOPY); + + SelectObject(srcDC, 0); + DeleteDC(srcDC); + SelectObject(destDC, 0); + DeleteDC(destDC); +} + +// Construct a mask from a bitmap and a colour indicating +// the transparent area +wxMask::wxMask(const wxBitmap& bitmap, const wxColour& colour) +{ + m_maskBitmap = 0; + Create(bitmap, colour); +} + +// Construct a mask from a bitmap and a palette index indicating +// the transparent area +wxMask::wxMask(const wxBitmap& bitmap, int paletteIndex) +{ + m_maskBitmap = 0; + Create(bitmap, paletteIndex); +} + +// Construct a mask from a mono bitmap (copies the bitmap). +wxMask::wxMask(const wxBitmap& bitmap) +{ + m_maskBitmap = 0; + Create(bitmap); +} + +wxMask::~wxMask() +{ + if ( m_maskBitmap ) + ::DeleteObject((HBITMAP) m_maskBitmap); +} + +// Create a mask from a mono bitmap (copies the bitmap). +bool wxMask::Create(const wxBitmap& bitmap) +{ +#ifndef __WXMICROWIN__ + wxCHECK_MSG( bitmap.Ok() && bitmap.GetDepth() == 1, false, + _T("can't create mask from invalid or not monochrome bitmap") ); + + if ( m_maskBitmap ) + { + ::DeleteObject((HBITMAP) m_maskBitmap); + m_maskBitmap = 0; + } + + m_maskBitmap = (WXHBITMAP) CreateBitmap( + bitmap.GetWidth(), + bitmap.GetHeight(), + 1, 1, 0 + ); + HDC srcDC = CreateCompatibleDC(0); + SelectObject(srcDC, (HBITMAP) bitmap.GetHBITMAP()); + HDC destDC = CreateCompatibleDC(0); + SelectObject(destDC, (HBITMAP) m_maskBitmap); + BitBlt(destDC, 0, 0, bitmap.GetWidth(), bitmap.GetHeight(), srcDC, 0, 0, SRCCOPY); + SelectObject(srcDC, 0); + DeleteDC(srcDC); + SelectObject(destDC, 0); + DeleteDC(destDC); + return true; +#else + wxUnusedVar(bitmap); + return false; +#endif +} + +// Create a mask from a bitmap and a palette index indicating +// the transparent area +bool wxMask::Create(const wxBitmap& bitmap, int paletteIndex) +{ + if ( m_maskBitmap ) + { + ::DeleteObject((HBITMAP) m_maskBitmap); + m_maskBitmap = 0; + } + +#if wxUSE_PALETTE + if (bitmap.Ok() && bitmap.GetPalette()->Ok()) + { + unsigned char red, green, blue; + if (bitmap.GetPalette()->GetRGB(paletteIndex, &red, &green, &blue)) + { + wxColour transparentColour(red, green, blue); + return Create(bitmap, transparentColour); + } + } +#endif // wxUSE_PALETTE + + return false; +} + +// Create a mask from a bitmap and a colour indicating +// the transparent area +bool wxMask::Create(const wxBitmap& bitmap, const wxColour& colour) +{ +#ifndef __WXMICROWIN__ + wxCHECK_MSG( bitmap.Ok(), false, _T("invalid bitmap in wxMask::Create") ); + + if ( m_maskBitmap ) + { + ::DeleteObject((HBITMAP) m_maskBitmap); + m_maskBitmap = 0; + } + + int width = bitmap.GetWidth(), + height = bitmap.GetHeight(); + + // scan the bitmap for the transparent colour and set the corresponding + // pixels in the mask to BLACK and the rest to WHITE + COLORREF maskColour = wxColourToPalRGB(colour); + m_maskBitmap = (WXHBITMAP)::CreateBitmap(width, height, 1, 1, 0); + + HDC srcDC = ::CreateCompatibleDC(NULL); + HDC destDC = ::CreateCompatibleDC(NULL); + if ( !srcDC || !destDC ) + { + wxLogLastError(wxT("CreateCompatibleDC")); + } + + bool ok = true; + + // SelectObject() will fail + wxASSERT_MSG( !bitmap.GetSelectedInto(), + _T("bitmap can't be selected in another DC") ); + + HGDIOBJ hbmpSrcOld = ::SelectObject(srcDC, GetHbitmapOf(bitmap)); + if ( !hbmpSrcOld ) + { + wxLogLastError(wxT("SelectObject")); + + ok = false; + } + + HGDIOBJ hbmpDstOld = ::SelectObject(destDC, (HBITMAP)m_maskBitmap); + if ( !hbmpDstOld ) + { + wxLogLastError(wxT("SelectObject")); + + ok = false; + } + + if ( ok ) + { + // this will create a monochrome bitmap with 0 points for the pixels + // which have the same value as the background colour and 1 for the + // others + ::SetBkColor(srcDC, maskColour); + ::BitBlt(destDC, 0, 0, width, height, srcDC, 0, 0, NOTSRCCOPY); + } + + ::SelectObject(srcDC, hbmpSrcOld); + ::DeleteDC(srcDC); + ::SelectObject(destDC, hbmpDstOld); + ::DeleteDC(destDC); + + return ok; +#else // __WXMICROWIN__ + wxUnusedVar(bitmap); + wxUnusedVar(colour); + return false; +#endif // __WXMICROWIN__/!__WXMICROWIN__ +} + +// ---------------------------------------------------------------------------- +// wxBitmapHandler +// ---------------------------------------------------------------------------- + +bool wxBitmapHandler::Create(wxGDIImage *image, + const void* data, + long flags, + int width, int height, int depth) +{ + wxBitmap *bitmap = wxDynamicCast(image, wxBitmap); + + return bitmap && Create(bitmap, data, flags, width, height, depth); +} + +bool wxBitmapHandler::Load(wxGDIImage *image, + const wxString& name, + long flags, + int width, int height) +{ + wxBitmap *bitmap = wxDynamicCast(image, wxBitmap); + + return bitmap && LoadFile(bitmap, name, flags, width, height); +} + +bool wxBitmapHandler::Save(wxGDIImage *image, + const wxString& name, + int type) +{ + wxBitmap *bitmap = wxDynamicCast(image, wxBitmap); + + return bitmap && SaveFile(bitmap, name, type); +} + +bool wxBitmapHandler::Create(wxBitmap *WXUNUSED(bitmap), + const void* WXUNUSED(data), + long WXUNUSED(type), + int WXUNUSED(width), + int WXUNUSED(height), + int WXUNUSED(depth)) +{ + return false; +} + +bool wxBitmapHandler::LoadFile(wxBitmap *WXUNUSED(bitmap), + const wxString& WXUNUSED(name), + long WXUNUSED(type), + int WXUNUSED(desiredWidth), + int WXUNUSED(desiredHeight)) +{ + return false; +} + +bool wxBitmapHandler::SaveFile(wxBitmap *WXUNUSED(bitmap), + const wxString& WXUNUSED(name), + int WXUNUSED(type), + const wxPalette *WXUNUSED(palette)) +{ + return false; +} + +// ---------------------------------------------------------------------------- +// DIB functions +// ---------------------------------------------------------------------------- + +#ifndef __WXMICROWIN__ +bool wxCreateDIB(long xSize, long ySize, long bitsPerPixel, + HPALETTE hPal, LPBITMAPINFO* lpDIBHeader) +{ + unsigned long i, headerSize; + + // Allocate space for a DIB header + headerSize = (sizeof(BITMAPINFOHEADER) + (256 * sizeof(PALETTEENTRY))); + LPBITMAPINFO lpDIBheader = (BITMAPINFO *) malloc(headerSize); + LPPALETTEENTRY lpPe = (PALETTEENTRY *)((BYTE*)lpDIBheader + sizeof(BITMAPINFOHEADER)); + + GetPaletteEntries(hPal, 0, 256, lpPe); + + memset(lpDIBheader, 0x00, sizeof(BITMAPINFOHEADER)); + + // Fill in the static parts of the DIB header + lpDIBheader->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + lpDIBheader->bmiHeader.biWidth = xSize; + lpDIBheader->bmiHeader.biHeight = ySize; + lpDIBheader->bmiHeader.biPlanes = 1; + + // this value must be 1, 4, 8 or 24 so PixelDepth can only be + lpDIBheader->bmiHeader.biBitCount = (WORD)(bitsPerPixel); + lpDIBheader->bmiHeader.biCompression = BI_RGB; + lpDIBheader->bmiHeader.biSizeImage = (xSize * abs((int)ySize) * bitsPerPixel) >> 3; + lpDIBheader->bmiHeader.biClrUsed = 256; + + + // Initialize the DIB palette + for (i = 0; i < 256; i++) { + lpDIBheader->bmiColors[i].rgbReserved = lpPe[i].peFlags; + lpDIBheader->bmiColors[i].rgbRed = lpPe[i].peRed; + lpDIBheader->bmiColors[i].rgbGreen = lpPe[i].peGreen; + lpDIBheader->bmiColors[i].rgbBlue = lpPe[i].peBlue; + } + + *lpDIBHeader = lpDIBheader; + + return true; +} + +void wxFreeDIB(LPBITMAPINFO lpDIBHeader) +{ + free(lpDIBHeader); +} +#endif + +// ---------------------------------------------------------------------------- +// global helper functions implemented here +// ---------------------------------------------------------------------------- + +// helper of wxBitmapToHICON/HCURSOR +static +HICON wxBitmapToIconOrCursor(const wxBitmap& bmp, + bool iconWanted, + int hotSpotX, + int hotSpotY) +{ + if ( !bmp.Ok() ) + { + // we can't create an icon/cursor form nothing + return 0; + } + + if ( bmp.HasAlpha() ) + { + // Create an empty mask bitmap. + // it doesn't seem to work if we mess with the mask at all. + HBITMAP hMonoBitmap = CreateBitmap(bmp.GetWidth(),bmp.GetHeight(),1,1,NULL); + + ICONINFO iconInfo; + wxZeroMemory(iconInfo); + iconInfo.fIcon = iconWanted; // do we want an icon or a cursor? + if ( !iconWanted ) + { + iconInfo.xHotspot = hotSpotX; + iconInfo.yHotspot = hotSpotY; + } + + iconInfo.hbmMask = hMonoBitmap; + iconInfo.hbmColor = GetHbitmapOf(bmp); + + HICON hicon = ::CreateIconIndirect(&iconInfo); + + ::DeleteObject(hMonoBitmap); + + return hicon; + } + + wxMask* mask = bmp.GetMask(); + + if ( !mask ) + { + // we must have a mask for an icon, so even if it's probably incorrect, + // do create it (grey is the "standard" transparent colour) + mask = new wxMask(bmp, *wxLIGHT_GREY); + } + + ICONINFO iconInfo; + wxZeroMemory(iconInfo); + iconInfo.fIcon = iconWanted; // do we want an icon or a cursor? + if ( !iconWanted ) + { + iconInfo.xHotspot = hotSpotX; + iconInfo.yHotspot = hotSpotY; + } + + iconInfo.hbmMask = wxInvertMask((HBITMAP)mask->GetMaskBitmap()); + iconInfo.hbmColor = GetHbitmapOf(bmp); + + // black out the transparent area to preserve background colour, because + // Windows blits the original bitmap using SRCINVERT (XOR) after applying + // the mask to the dest rect. + { + MemoryHDC dcSrc, dcDst; + SelectInHDC selectMask(dcSrc, (HBITMAP)mask->GetMaskBitmap()), + selectBitmap(dcDst, iconInfo.hbmColor); + + if ( !::BitBlt(dcDst, 0, 0, bmp.GetWidth(), bmp.GetHeight(), + dcSrc, 0, 0, SRCAND) ) + { + wxLogLastError(_T("BitBlt")); + } + } + + HICON hicon = ::CreateIconIndirect(&iconInfo); + + if ( !bmp.GetMask() && !bmp.HasAlpha() ) + { + // we created the mask, now delete it + delete mask; + } + + // delete the inverted mask bitmap we created as well + ::DeleteObject(iconInfo.hbmMask); + + return hicon; +} + +HICON wxBitmapToHICON(const wxBitmap& bmp) +{ + return wxBitmapToIconOrCursor(bmp, true, 0, 0); +} + +HCURSOR wxBitmapToHCURSOR(const wxBitmap& bmp, int hotSpotX, int hotSpotY) +{ + return (HCURSOR)wxBitmapToIconOrCursor(bmp, false, hotSpotX, hotSpotY); +} + +HBITMAP wxInvertMask(HBITMAP hbmpMask, int w, int h) +{ +#ifndef __WXMICROWIN__ + wxCHECK_MSG( hbmpMask, 0, _T("invalid bitmap in wxInvertMask") ); + + // get width/height from the bitmap if not given + if ( !w || !h ) + { + BITMAP bm; + ::GetObject(hbmpMask, sizeof(BITMAP), (LPVOID)&bm); + w = bm.bmWidth; + h = bm.bmHeight; + } + + HDC hdcSrc = ::CreateCompatibleDC(NULL); + HDC hdcDst = ::CreateCompatibleDC(NULL); + if ( !hdcSrc || !hdcDst ) + { + wxLogLastError(wxT("CreateCompatibleDC")); + } + + HBITMAP hbmpInvMask = ::CreateBitmap(w, h, 1, 1, 0); + if ( !hbmpInvMask ) + { + wxLogLastError(wxT("CreateBitmap")); + } + + HGDIOBJ srcTmp = ::SelectObject(hdcSrc, hbmpMask); + HGDIOBJ dstTmp = ::SelectObject(hdcDst, hbmpInvMask); + if ( !::BitBlt(hdcDst, 0, 0, w, h, + hdcSrc, 0, 0, + NOTSRCCOPY) ) + { + wxLogLastError(wxT("BitBlt")); + } + + // Deselect objects + SelectObject(hdcSrc,srcTmp); + SelectObject(hdcDst,dstTmp); + + ::DeleteDC(hdcSrc); + ::DeleteDC(hdcDst); + + return hbmpInvMask; +#else + return 0; +#endif +} diff --git a/Externals/wxWidgets/src/msw/bmpbuttn.cpp b/Externals/wxWidgets/src/msw/bmpbuttn.cpp new file mode 100644 index 0000000000..6797659107 --- /dev/null +++ b/Externals/wxWidgets/src/msw/bmpbuttn.cpp @@ -0,0 +1,646 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/msw/bmpbuttn.cpp +// Purpose: wxBitmapButton +// Author: Julian Smart +// Modified by: +// Created: 04/01/98 +// RCS-ID: $Id: bmpbuttn.cpp 42816 2006-10-31 08:50:17Z RD $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_BMPBUTTON + +#include "wx/bmpbuttn.h" + +#ifndef WX_PRECOMP + #include "wx/log.h" + #include "wx/dcmemory.h" + #include "wx/image.h" +#endif + +#include "wx/msw/private.h" + +#include "wx/msw/uxtheme.h" + +#if wxUSE_UXTHEME + // no need to include tmschema.h + #ifndef BP_PUSHBUTTON + #define BP_PUSHBUTTON 1 + + #define PBS_NORMAL 1 + #define PBS_HOT 2 + #define PBS_PRESSED 3 + #define PBS_DISABLED 4 + #define PBS_DEFAULTED 5 + + #define TMT_CONTENTMARGINS 3602 + #endif +#endif // wxUSE_UXTHEME + +#ifndef ODS_NOFOCUSRECT + #define ODS_NOFOCUSRECT 0x0200 +#endif + +// ---------------------------------------------------------------------------- +// macros +// ---------------------------------------------------------------------------- + +#if wxUSE_EXTENDED_RTTI + +WX_DEFINE_FLAGS( wxBitmapButtonStyle ) + +wxBEGIN_FLAGS( wxBitmapButtonStyle ) + // new style border flags, we put them first to + // use them for streaming out + wxFLAGS_MEMBER(wxBORDER_SIMPLE) + wxFLAGS_MEMBER(wxBORDER_SUNKEN) + wxFLAGS_MEMBER(wxBORDER_DOUBLE) + wxFLAGS_MEMBER(wxBORDER_RAISED) + wxFLAGS_MEMBER(wxBORDER_STATIC) + wxFLAGS_MEMBER(wxBORDER_NONE) + + // old style border flags + wxFLAGS_MEMBER(wxSIMPLE_BORDER) + wxFLAGS_MEMBER(wxSUNKEN_BORDER) + wxFLAGS_MEMBER(wxDOUBLE_BORDER) + wxFLAGS_MEMBER(wxRAISED_BORDER) + wxFLAGS_MEMBER(wxSTATIC_BORDER) + wxFLAGS_MEMBER(wxBORDER) + + // standard window styles + wxFLAGS_MEMBER(wxTAB_TRAVERSAL) + wxFLAGS_MEMBER(wxCLIP_CHILDREN) + wxFLAGS_MEMBER(wxTRANSPARENT_WINDOW) + wxFLAGS_MEMBER(wxWANTS_CHARS) + wxFLAGS_MEMBER(wxFULL_REPAINT_ON_RESIZE) + wxFLAGS_MEMBER(wxALWAYS_SHOW_SB ) + wxFLAGS_MEMBER(wxVSCROLL) + wxFLAGS_MEMBER(wxHSCROLL) + + wxFLAGS_MEMBER(wxBU_AUTODRAW) + wxFLAGS_MEMBER(wxBU_LEFT) + wxFLAGS_MEMBER(wxBU_RIGHT) + wxFLAGS_MEMBER(wxBU_TOP) + wxFLAGS_MEMBER(wxBU_BOTTOM) +wxEND_FLAGS( wxBitmapButtonStyle ) + +IMPLEMENT_DYNAMIC_CLASS_XTI(wxBitmapButton, wxButton,"wx/bmpbuttn.h") + +wxBEGIN_PROPERTIES_TABLE(wxBitmapButton) + wxPROPERTY_FLAGS( WindowStyle , wxBitmapButtonStyle , long , SetWindowStyleFlag , GetWindowStyleFlag , EMPTY_MACROVALUE, 0 /*flags*/ , wxT("Helpstring") , wxT("group")) // style +wxEND_PROPERTIES_TABLE() + +wxBEGIN_HANDLERS_TABLE(wxBitmapButton) +wxEND_HANDLERS_TABLE() + +wxCONSTRUCTOR_5( wxBitmapButton , wxWindow* , Parent , wxWindowID , Id , wxBitmap , Bitmap , wxPoint , Position , wxSize , Size ) + +#else +IMPLEMENT_DYNAMIC_CLASS(wxBitmapButton, wxButton) +#endif + +BEGIN_EVENT_TABLE(wxBitmapButton, wxBitmapButtonBase) + EVT_SYS_COLOUR_CHANGED(wxBitmapButton::OnSysColourChanged) + EVT_ENTER_WINDOW(wxBitmapButton::OnMouseEnterOrLeave) + EVT_LEAVE_WINDOW(wxBitmapButton::OnMouseEnterOrLeave) +END_EVENT_TABLE() + +/* +TODO PROPERTIES : + +long "style" , wxBU_AUTODRAW +bool "default" , 0 +bitmap "selected" , +bitmap "focus" , +bitmap "disabled" , +*/ + +bool wxBitmapButton::Create(wxWindow *parent, wxWindowID id, + const wxBitmap& bitmap, + const wxPoint& pos, + const wxSize& size, long style, + const wxValidator& wxVALIDATOR_PARAM(validator), + const wxString& name) +{ + m_bmpNormal = bitmap; + SetName(name); + +#if wxUSE_VALIDATORS + SetValidator(validator); +#endif // wxUSE_VALIDATORS + + parent->AddChild(this); + + m_windowStyle = style; + + if ( style & wxBU_AUTODRAW ) + { + m_marginX = + m_marginY = 4; + } + + if (id == wxID_ANY) + m_windowId = NewControlId(); + else + m_windowId = id; + + long msStyle = WS_VISIBLE | WS_TABSTOP | WS_CHILD | BS_OWNERDRAW ; + + if ( m_windowStyle & wxCLIP_SIBLINGS ) + msStyle |= WS_CLIPSIBLINGS; + +#ifdef __WIN32__ + if(m_windowStyle & wxBU_LEFT) + msStyle |= BS_LEFT; + if(m_windowStyle & wxBU_RIGHT) + msStyle |= BS_RIGHT; + if(m_windowStyle & wxBU_TOP) + msStyle |= BS_TOP; + if(m_windowStyle & wxBU_BOTTOM) + msStyle |= BS_BOTTOM; +#endif + + m_hWnd = (WXHWND) CreateWindowEx( + 0, + wxT("BUTTON"), + wxEmptyString, + msStyle, + 0, 0, 0, 0, + GetWinHwnd(parent), + (HMENU)m_windowId, + wxGetInstance(), + NULL + ); + + // Subclass again for purposes of dialog editing mode + SubclassWin(m_hWnd); + + SetPosition(pos); + SetInitialSize(size); + + return true; +} + +bool wxBitmapButton::SetBackgroundColour(const wxColour& colour) +{ + if ( !wxBitmapButtonBase::SetBackgroundColour(colour) ) + { + // didn't change + return false; + } + + // invalidate the brush, it will be recreated the next time it's needed + m_brushDisabled = wxNullBrush; + + return true; +} + +void wxBitmapButton::OnSysColourChanged(wxSysColourChangedEvent& event) +{ + m_brushDisabled = wxNullBrush; + + if ( !IsEnabled() ) + { + // this change affects our current state + Refresh(); + } + + event.Skip(); +} + +void wxBitmapButton::OnMouseEnterOrLeave(wxMouseEvent& event) +{ + if ( IsEnabled() && m_bmpHover.Ok() ) + Refresh(); + + event.Skip(); +} + +void wxBitmapButton::OnSetBitmap() +{ + // if the focus bitmap is specified but hover one isn't, use the focus + // bitmap for hovering as well if this is consistent with the current + // Windows version look and feel + // + // rationale: this is compatible with the old wxGTK behaviour and also + // makes it much easier to do "the right thing" for all platforms (some of + // them, such as Windows XP, have "hot" buttons while others don't) + if ( !m_bmpHover.Ok() && + m_bmpFocus.Ok() && + wxUxThemeEngine::GetIfActive() ) + { + m_bmpHover = m_bmpFocus; + } + + // this will redraw us + wxBitmapButtonBase::OnSetBitmap(); +} + +#if wxUSE_UXTHEME +static +void MSWDrawXPBackground(wxButton *button, WXDRAWITEMSTRUCT *wxdis) +{ + LPDRAWITEMSTRUCT lpDIS = (LPDRAWITEMSTRUCT)wxdis; + HDC hdc = lpDIS->hDC; + UINT state = lpDIS->itemState; + RECT rectBtn; + CopyRect(&rectBtn, &lpDIS->rcItem); + + wxUxThemeHandle theme(button, L"BUTTON"); + int iState; + + if ( state & ODS_SELECTED ) + { + iState = PBS_PRESSED; + } + else if ( button->HasCapture() || button->IsMouseInWindow() ) + { + iState = PBS_HOT; + } + else if ( state & ODS_FOCUS ) + { + iState = PBS_DEFAULTED; + } + else if ( state & ODS_DISABLED ) + { + iState = PBS_DISABLED; + } + else + { + iState = PBS_NORMAL; + } + + // draw parent background if needed + if ( wxUxThemeEngine::Get()->IsThemeBackgroundPartiallyTransparent(theme, + BP_PUSHBUTTON, + iState) ) + { + wxUxThemeEngine::Get()->DrawThemeParentBackground(GetHwndOf(button), hdc, &rectBtn); + } + + // draw background + wxUxThemeEngine::Get()->DrawThemeBackground(theme, hdc, BP_PUSHBUTTON, iState, + &rectBtn, NULL); + + // calculate content area margins + MARGINS margins; + wxUxThemeEngine::Get()->GetThemeMargins(theme, hdc, BP_PUSHBUTTON, iState, + TMT_CONTENTMARGINS, &rectBtn, &margins); + RECT rectClient; + ::CopyRect(&rectClient, &rectBtn); + ::InflateRect(&rectClient, -margins.cxLeftWidth, -margins.cyTopHeight); + + // if focused and !nofocus rect + if ( (state & ODS_FOCUS) && !(state & ODS_NOFOCUSRECT) ) + { + DrawFocusRect(hdc, &rectClient); + } + + if ( button->UseBgCol() ) + { + COLORREF colBg = wxColourToRGB(button->GetBackgroundColour()); + HBRUSH hbrushBackground = ::CreateSolidBrush(colBg); + + // don't overwrite the focus rect + ::InflateRect(&rectClient, -1, -1); + FillRect(hdc, &rectClient, hbrushBackground); + ::DeleteObject(hbrushBackground); + } +} +#endif // wxUSE_UXTHEME + +// VZ: should be at the very least less than wxDEFAULT_BUTTON_MARGIN +#define FOCUS_MARGIN 3 + +bool wxBitmapButton::MSWOnDraw(WXDRAWITEMSTRUCT *item) +{ +#ifndef __WXWINCE__ + long style = GetWindowLong((HWND) GetHWND(), GWL_STYLE); + if (style & BS_BITMAP) + { + // Let default procedure draw the bitmap, which is defined + // in the Windows resource. + return false; + } +#endif + + LPDRAWITEMSTRUCT lpDIS = (LPDRAWITEMSTRUCT) item; + HDC hDC = lpDIS->hDC; + UINT state = lpDIS->itemState; + bool isSelected = (state & ODS_SELECTED) != 0; + bool autoDraw = (GetWindowStyleFlag() & wxBU_AUTODRAW) != 0; + + + // choose the bitmap to use depending on the button state + wxBitmap *bitmap; + + if ( isSelected && m_bmpSelected.Ok() ) + bitmap = &m_bmpSelected; + else if ( m_bmpHover.Ok() && IsMouseInWindow() ) + bitmap = &m_bmpHover; + else if ((state & ODS_FOCUS) && m_bmpFocus.Ok()) + bitmap = &m_bmpFocus; + else if ((state & ODS_DISABLED) && m_bmpDisabled.Ok()) + bitmap = &m_bmpDisabled; + else + bitmap = &m_bmpNormal; + + if ( !bitmap->Ok() ) + return false; + + // centre the bitmap in the control area + int x = lpDIS->rcItem.left; + int y = lpDIS->rcItem.top; + int width = lpDIS->rcItem.right - x; + int height = lpDIS->rcItem.bottom - y; + int wBmp = bitmap->GetWidth(); + int hBmp = bitmap->GetHeight(); + +#if wxUSE_UXTHEME + if ( autoDraw && wxUxThemeEngine::GetIfActive() ) + { + MSWDrawXPBackground(this, item); + wxUxThemeHandle theme(this, L"BUTTON"); + + // calculate content area margins + // assuming here that each state is the same size + MARGINS margins; + wxUxThemeEngine::Get()->GetThemeMargins(theme, NULL, + BP_PUSHBUTTON, PBS_NORMAL, + TMT_CONTENTMARGINS, NULL, + &margins); + int marginX = margins.cxLeftWidth + 1; + int marginY = margins.cyTopHeight + 1; + int x1,y1; + + if ( m_windowStyle & wxBU_LEFT ) + { + x1 = x + marginX; + } + else if ( m_windowStyle & wxBU_RIGHT ) + { + x1 = x + (width - wBmp) - marginX; + } + else + { + x1 = x + (width - wBmp) / 2; + } + + if ( m_windowStyle & wxBU_TOP ) + { + y1 = y + marginY; + } + else if ( m_windowStyle & wxBU_BOTTOM ) + { + y1 = y + (height - hBmp) - marginY; + } + else + { + y1 = y + (height - hBmp) / 2; + } + + // draw the bitmap + wxDCTemp dst((WXHDC)hDC); + dst.DrawBitmap(*bitmap, x1, y1, true); + + return true; + } +#endif // wxUSE_UXTHEME + + int x1,y1; + + if(m_windowStyle & wxBU_LEFT) + x1 = x + (FOCUS_MARGIN+1); + else if(m_windowStyle & wxBU_RIGHT) + x1 = x + (width - wBmp) - (FOCUS_MARGIN+1); + else + x1 = x + (width - wBmp) / 2; + + if(m_windowStyle & wxBU_TOP) + y1 = y + (FOCUS_MARGIN+1); + else if(m_windowStyle & wxBU_BOTTOM) + y1 = y + (height - hBmp) - (FOCUS_MARGIN+1); + else + y1 = y + (height - hBmp) / 2; + + if ( isSelected && autoDraw ) + { + x1++; + y1++; + } + + // draw the face, if auto-drawing + if ( autoDraw ) + { + DrawFace((WXHDC) hDC, + lpDIS->rcItem.left, lpDIS->rcItem.top, + lpDIS->rcItem.right, lpDIS->rcItem.bottom, + isSelected); + } + + // draw the bitmap + wxDCTemp dst((WXHDC)hDC); + dst.DrawBitmap(*bitmap, x1, y1, true); + + // draw focus / disabled state, if auto-drawing + if ( (state & ODS_DISABLED) && autoDraw ) + { + DrawButtonDisable((WXHDC) hDC, + lpDIS->rcItem.left, lpDIS->rcItem.top, + lpDIS->rcItem.right, lpDIS->rcItem.bottom, + true); + } + else if ( (state & ODS_FOCUS) && autoDraw ) + { + DrawButtonFocus((WXHDC) hDC, + lpDIS->rcItem.left, + lpDIS->rcItem.top, + lpDIS->rcItem.right, + lpDIS->rcItem.bottom, + isSelected); + } + + return true; +} + +// GRG Feb/2000, support for bmp buttons with Win95/98 standard LNF + +void wxBitmapButton::DrawFace( WXHDC dc, int left, int top, + int right, int bottom, bool sel ) +{ + HPEN oldp; + HPEN penHiLight; + HPEN penLight; + HPEN penShadow; + HPEN penDkShadow; + HBRUSH brushFace; + + // create needed pens and brush + penHiLight = CreatePen(PS_SOLID, 0, GetSysColor(COLOR_3DHILIGHT)); + penLight = CreatePen(PS_SOLID, 0, GetSysColor(COLOR_3DLIGHT)); + penShadow = CreatePen(PS_SOLID, 0, GetSysColor(COLOR_3DSHADOW)); + penDkShadow = CreatePen(PS_SOLID, 0, GetSysColor(COLOR_3DDKSHADOW)); + brushFace = CreateSolidBrush(GetSysColor(COLOR_BTNFACE)); + + // draw the rectangle + RECT rect; + rect.left = left; + rect.right = right; + rect.top = top; + rect.bottom = bottom; + FillRect((HDC) dc, &rect, brushFace); + + // draw the border + oldp = (HPEN) SelectObject( (HDC) dc, sel? penDkShadow : penHiLight); + + wxDrawLine((HDC) dc, left, top, right-1, top); + wxDrawLine((HDC) dc, left, top+1, left, bottom-1); + + SelectObject( (HDC) dc, sel? penShadow : penLight); + wxDrawLine((HDC) dc, left+1, top+1, right-2, top+1); + wxDrawLine((HDC) dc, left+1, top+2, left+1, bottom-2); + + SelectObject( (HDC) dc, sel? penLight : penShadow); + wxDrawLine((HDC) dc, left+1, bottom-2, right-1, bottom-2); + wxDrawLine((HDC) dc, right-2, bottom-3, right-2, top); + + SelectObject( (HDC) dc, sel? penHiLight : penDkShadow); + wxDrawLine((HDC) dc, left, bottom-1, right+2, bottom-1); + wxDrawLine((HDC) dc, right-1, bottom-2, right-1, top-1); + + // delete allocated resources + SelectObject((HDC) dc,oldp); + DeleteObject(penHiLight); + DeleteObject(penLight); + DeleteObject(penShadow); + DeleteObject(penDkShadow); + DeleteObject(brushFace); +} + +void wxBitmapButton::DrawButtonFocus( WXHDC dc, int left, int top, int right, + int bottom, bool WXUNUSED(sel) ) +{ + RECT rect; + rect.left = left; + rect.top = top; + rect.right = right; + rect.bottom = bottom; + InflateRect( &rect, - FOCUS_MARGIN, - FOCUS_MARGIN ); + + // GRG: the focus rectangle should not move when the button is pushed! +/* + if ( sel ) + OffsetRect( &rect, 1, 1 ); +*/ + + DrawFocusRect( (HDC) dc, &rect ); +} + +void +wxBitmapButton::DrawButtonDisable( WXHDC dc, + int left, int top, int right, int bottom, + bool with_marg ) +{ + if ( !m_brushDisabled.Ok() ) + { + // draw a bitmap with two black and two background colour pixels + wxBitmap bmp(2, 2); + wxMemoryDC dc; + dc.SelectObject(bmp); + dc.SetPen(*wxBLACK_PEN); + dc.DrawPoint(0, 0); + dc.DrawPoint(1, 1); + dc.SetPen(GetBackgroundColour()); + dc.DrawPoint(0, 1); + dc.DrawPoint(1, 0); + + m_brushDisabled = wxBrush(bmp); + } + + SelectInHDC selectBrush((HDC)dc, GetHbrushOf(m_brushDisabled)); + + // ROP for "dest |= pattern" operation -- as it doesn't have a standard + // name, give it our own + static const DWORD PATTERNPAINT = 0xFA0089UL; + + if ( with_marg ) + { + left += m_marginX; + top += m_marginY; + right -= 2 * m_marginX; + bottom -= 2 * m_marginY; + } + + ::PatBlt( (HDC) dc, left, top, right, bottom, PATTERNPAINT); +} + +void wxBitmapButton::SetDefault() +{ + wxButton::SetDefault(); +} + +wxSize wxBitmapButton::DoGetBestSize() const +{ + if ( m_bmpNormal.Ok() ) + { + int width = m_bmpNormal.GetWidth(), + height = m_bmpNormal.GetHeight(); + int marginH = 0, + marginV = 0; + +#if wxUSE_UXTHEME + if ( wxUxThemeEngine::GetIfActive() ) + { + wxUxThemeHandle theme((wxBitmapButton *)this, L"BUTTON"); + + MARGINS margins; + wxUxThemeEngine::Get()->GetThemeMargins(theme, NULL, + BP_PUSHBUTTON, PBS_NORMAL, + TMT_CONTENTMARGINS, NULL, + &margins); + + // XP doesn't draw themed buttons correctly when the client area is + // smaller than 8x8 - enforce this minimum size for small bitmaps + if ( width < 8 ) + width = 8; + if ( height < 8 ) + height = 8; + + // don't add margins for the borderless buttons, they don't need + // them and it just makes them appear larger than needed + if ( !HasFlag(wxBORDER_NONE) ) + { + // we need 2 extra pixels for the focus rectangle, without them + // it's overwritten by the bitmap itself + marginH = margins.cxLeftWidth + margins.cxRightWidth + 2; + marginV = margins.cyTopHeight + margins.cyBottomHeight + 2; + } + } + else +#endif // wxUSE_UXTHEME + { + if ( !HasFlag(wxBORDER_NONE) ) + { + marginH = 2*m_marginX; + marginV = 2*m_marginY; + } + } + + wxSize best(width + marginH, height + marginV); + CacheBestSize(best); + return best; + } + + // no idea what our best size should be, defer to the base class + return wxBitmapButtonBase::DoGetBestSize(); +} + +#endif // wxUSE_BMPBUTTON diff --git a/Externals/wxWidgets/src/msw/brush.cpp b/Externals/wxWidgets/src/msw/brush.cpp new file mode 100644 index 0000000000..ac03729cb2 --- /dev/null +++ b/Externals/wxWidgets/src/msw/brush.cpp @@ -0,0 +1,327 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/msw/brush.cpp +// Purpose: wxBrush +// Author: Julian Smart +// Modified by: +// Created: 04/01/98 +// RCS-ID: $Id: brush.cpp 42776 2006-10-30 22:03:53Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#include "wx/brush.h" + +#ifndef WX_PRECOMP + #include "wx/list.h" + #include "wx/utils.h" + #include "wx/app.h" +#endif // WX_PRECOMP + +#include "wx/msw/private.h" + +// ---------------------------------------------------------------------------- +// private classes +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxBrushRefData: public wxGDIRefData +{ +public: + wxBrushRefData(const wxColour& colour = wxNullColour, int style = wxSOLID); + wxBrushRefData(const wxBitmap& stipple); + wxBrushRefData(const wxBrushRefData& data); + virtual ~wxBrushRefData(); + + bool operator==(const wxBrushRefData& data) const; + + HBRUSH GetHBRUSH(); + void Free(); + + const wxColour& GetColour() const { return m_colour; } + int GetStyle() const { return m_style; } + wxBitmap *GetStipple() { return &m_stipple; } + + void SetColour(const wxColour& colour) { Free(); m_colour = colour; } + void SetStyle(int style) { Free(); m_style = style; } + void SetStipple(const wxBitmap& stipple) { Free(); DoSetStipple(stipple); } + +private: + void DoSetStipple(const wxBitmap& stipple); + + int m_style; + wxBitmap m_stipple; + wxColour m_colour; + HBRUSH m_hBrush; + + // no assignment operator, the objects of this class are shared and never + // assigned after being created once + wxBrushRefData& operator=(const wxBrushRefData&); +}; + +#define M_BRUSHDATA ((wxBrushRefData *)m_refData) + +// ============================================================================ +// wxBrushRefData implementation +// ============================================================================ + +IMPLEMENT_DYNAMIC_CLASS(wxBrush, wxGDIObject) + +// ---------------------------------------------------------------------------- +// wxBrushRefData ctors/dtor +// ---------------------------------------------------------------------------- + +wxBrushRefData::wxBrushRefData(const wxColour& colour, int style) + : m_colour(colour) +{ + m_style = style; + + m_hBrush = NULL; +} + +wxBrushRefData::wxBrushRefData(const wxBitmap& stipple) +{ + DoSetStipple(stipple); + + m_hBrush = NULL; +} + +wxBrushRefData::wxBrushRefData(const wxBrushRefData& data) + : wxGDIRefData(), + m_stipple(data.m_stipple), + m_colour(data.m_colour) +{ + m_style = data.m_style; + + // we can't share HBRUSH, we'd need to create another one ourselves + m_hBrush = NULL; +} + +wxBrushRefData::~wxBrushRefData() +{ + Free(); +} + +// ---------------------------------------------------------------------------- +// wxBrushRefData accesors +// ---------------------------------------------------------------------------- + +bool wxBrushRefData::operator==(const wxBrushRefData& data) const +{ + // don't compare HBRUSHes + return m_style == data.m_style && + m_colour == data.m_colour && + m_stipple.IsSameAs(data.m_stipple); +} + +void wxBrushRefData::DoSetStipple(const wxBitmap& stipple) +{ + m_stipple = stipple; + m_style = stipple.GetMask() ? wxSTIPPLE_MASK_OPAQUE : wxSTIPPLE; +} + +// ---------------------------------------------------------------------------- +// wxBrushRefData resource handling +// ---------------------------------------------------------------------------- + +void wxBrushRefData::Free() +{ + if ( m_hBrush ) + { + ::DeleteObject(m_hBrush); + + m_hBrush = NULL; + } +} + +#if !defined(__WXMICROWIN__) && !defined(__WXWINCE__) + +static int TranslateHatchStyle(int style) +{ + switch ( style ) + { + case wxBDIAGONAL_HATCH: return HS_BDIAGONAL; + case wxCROSSDIAG_HATCH: return HS_DIAGCROSS; + case wxFDIAGONAL_HATCH: return HS_FDIAGONAL; + case wxCROSS_HATCH: return HS_CROSS; + case wxHORIZONTAL_HATCH:return HS_HORIZONTAL; + case wxVERTICAL_HATCH: return HS_VERTICAL; + default: return -1; + } +} + +#endif // !__WXMICROWIN__ && !__WXWINCE__ + +HBRUSH wxBrushRefData::GetHBRUSH() +{ + if ( !m_hBrush ) + { +#if !defined(__WXMICROWIN__) && !defined(__WXWINCE__) + int hatchStyle = TranslateHatchStyle(m_style); + if ( hatchStyle == -1 ) +#endif // !__WXMICROWIN__ && !__WXWINCE__ + { + switch ( m_style ) + { + case wxTRANSPARENT: + m_hBrush = (HBRUSH)::GetStockObject(NULL_BRUSH); + break; + + case wxSTIPPLE: + m_hBrush = ::CreatePatternBrush(GetHbitmapOf(m_stipple)); + break; + + case wxSTIPPLE_MASK_OPAQUE: + m_hBrush = ::CreatePatternBrush((HBITMAP)m_stipple.GetMask() + ->GetMaskBitmap()); + break; + + default: + wxFAIL_MSG( _T("unknown brush style") ); + // fall through + + case wxSOLID: + m_hBrush = ::CreateSolidBrush(m_colour.GetPixel()); + break; + } + } +#ifndef __WXWINCE__ + else // create a hatched brush + { + m_hBrush = ::CreateHatchBrush(hatchStyle, m_colour.GetPixel()); + } +#endif + + if ( !m_hBrush ) + { + wxLogLastError(_T("CreateXXXBrush()")); + } + } + + return m_hBrush; +} + +// ============================================================================ +// wxBrush implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxBrush ctors/dtor +// ---------------------------------------------------------------------------- + +wxBrush::wxBrush() +{ +} + +wxBrush::wxBrush(const wxColour& col, int style) +{ + m_refData = new wxBrushRefData(col, style); +} + +wxBrush::wxBrush(const wxBitmap& stipple) +{ + m_refData = new wxBrushRefData(stipple); +} + +wxBrush::~wxBrush() +{ +} + +// ---------------------------------------------------------------------------- +// wxBrush house keeping stuff +// ---------------------------------------------------------------------------- + +bool wxBrush::operator==(const wxBrush& brush) const +{ + const wxBrushRefData *brushData = (wxBrushRefData *)brush.m_refData; + + // an invalid brush is considered to be only equal to another invalid brush + return m_refData ? (brushData && *M_BRUSHDATA == *brushData) : !brushData; +} + +wxObjectRefData *wxBrush::CreateRefData() const +{ + return new wxBrushRefData; +} + +wxObjectRefData *wxBrush::CloneRefData(const wxObjectRefData *data) const +{ + return new wxBrushRefData(*(const wxBrushRefData *)data); +} + +// ---------------------------------------------------------------------------- +// wxBrush accessors +// ---------------------------------------------------------------------------- + +wxColour wxBrush::GetColour() const +{ + wxCHECK_MSG( Ok(), wxNullColour, _T("invalid brush") ); + + return M_BRUSHDATA->GetColour(); +} + +int wxBrush::GetStyle() const +{ + wxCHECK_MSG( Ok(), 0, _T("invalid brush") ); + + return M_BRUSHDATA->GetStyle(); +} + +wxBitmap *wxBrush::GetStipple() const +{ + wxCHECK_MSG( Ok(), NULL, _T("invalid brush") ); + + return M_BRUSHDATA->GetStipple(); +} + +WXHANDLE wxBrush::GetResourceHandle() const +{ + wxCHECK_MSG( Ok(), FALSE, _T("invalid brush") ); + + return (WXHANDLE)M_BRUSHDATA->GetHBRUSH(); +} + +// ---------------------------------------------------------------------------- +// wxBrush setters +// ---------------------------------------------------------------------------- + +void wxBrush::SetColour(const wxColour& col) +{ + AllocExclusive(); + + M_BRUSHDATA->SetColour(col); +} + +void wxBrush::SetColour(unsigned char r, unsigned char g, unsigned char b) +{ + AllocExclusive(); + + M_BRUSHDATA->SetColour(wxColour(r, g, b)); +} + +void wxBrush::SetStyle(int style) +{ + AllocExclusive(); + + M_BRUSHDATA->SetStyle(style); +} + +void wxBrush::SetStipple(const wxBitmap& stipple) +{ + AllocExclusive(); + + M_BRUSHDATA->SetStipple(stipple); +} diff --git a/Externals/wxWidgets/src/msw/button.cpp b/Externals/wxWidgets/src/msw/button.cpp new file mode 100644 index 0000000000..df899b7e4e --- /dev/null +++ b/Externals/wxWidgets/src/msw/button.cpp @@ -0,0 +1,883 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/msw/button.cpp +// Purpose: wxButton +// Author: Julian Smart +// Modified by: +// Created: 04/01/98 +// RCS-ID: $Id: button.cpp 45958 2007-05-11 13:04:33Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_BUTTON + +#include "wx/button.h" + +#ifndef WX_PRECOMP + #include "wx/app.h" + #include "wx/brush.h" + #include "wx/panel.h" + #include "wx/bmpbuttn.h" + #include "wx/settings.h" + #include "wx/dcscreen.h" + #include "wx/dcclient.h" + #include "wx/toplevel.h" +#endif + +#include "wx/stockitem.h" +#include "wx/tokenzr.h" +#include "wx/msw/private.h" + +#if wxUSE_UXTHEME + #include "wx/msw/uxtheme.h" + + // no need to include tmschema.h + #ifndef BP_PUSHBUTTON + #define BP_PUSHBUTTON 1 + + #define PBS_NORMAL 1 + #define PBS_HOT 2 + #define PBS_PRESSED 3 + #define PBS_DISABLED 4 + #define PBS_DEFAULTED 5 + + #define TMT_CONTENTMARGINS 3602 + #endif +#endif // wxUSE_UXTHEME + +#ifndef WM_THEMECHANGED + #define WM_THEMECHANGED 0x031A +#endif + +#ifndef ODS_NOACCEL + #define ODS_NOACCEL 0x0100 +#endif + +#ifndef ODS_NOFOCUSRECT + #define ODS_NOFOCUSRECT 0x0200 +#endif + +// ---------------------------------------------------------------------------- +// macros +// ---------------------------------------------------------------------------- + +#if wxUSE_EXTENDED_RTTI + +WX_DEFINE_FLAGS( wxButtonStyle ) + +wxBEGIN_FLAGS( wxButtonStyle ) + // new style border flags, we put them first to + // use them for streaming out + wxFLAGS_MEMBER(wxBORDER_SIMPLE) + wxFLAGS_MEMBER(wxBORDER_SUNKEN) + wxFLAGS_MEMBER(wxBORDER_DOUBLE) + wxFLAGS_MEMBER(wxBORDER_RAISED) + wxFLAGS_MEMBER(wxBORDER_STATIC) + wxFLAGS_MEMBER(wxBORDER_NONE) + + // old style border flags + wxFLAGS_MEMBER(wxSIMPLE_BORDER) + wxFLAGS_MEMBER(wxSUNKEN_BORDER) + wxFLAGS_MEMBER(wxDOUBLE_BORDER) + wxFLAGS_MEMBER(wxRAISED_BORDER) + wxFLAGS_MEMBER(wxSTATIC_BORDER) + wxFLAGS_MEMBER(wxBORDER) + + // standard window styles + wxFLAGS_MEMBER(wxTAB_TRAVERSAL) + wxFLAGS_MEMBER(wxCLIP_CHILDREN) + wxFLAGS_MEMBER(wxTRANSPARENT_WINDOW) + wxFLAGS_MEMBER(wxWANTS_CHARS) + wxFLAGS_MEMBER(wxFULL_REPAINT_ON_RESIZE) + wxFLAGS_MEMBER(wxALWAYS_SHOW_SB ) + wxFLAGS_MEMBER(wxVSCROLL) + wxFLAGS_MEMBER(wxHSCROLL) + + wxFLAGS_MEMBER(wxBU_LEFT) + wxFLAGS_MEMBER(wxBU_RIGHT) + wxFLAGS_MEMBER(wxBU_TOP) + wxFLAGS_MEMBER(wxBU_BOTTOM) + wxFLAGS_MEMBER(wxBU_EXACTFIT) +wxEND_FLAGS( wxButtonStyle ) + +IMPLEMENT_DYNAMIC_CLASS_XTI(wxButton, wxControl,"wx/button.h") + +wxBEGIN_PROPERTIES_TABLE(wxButton) + wxEVENT_PROPERTY( Click , wxEVT_COMMAND_BUTTON_CLICKED , wxCommandEvent) + + wxPROPERTY( Font , wxFont , SetFont , GetFont , EMPTY_MACROVALUE, 0 /*flags*/ , wxT("Helpstring") , wxT("group")) + wxPROPERTY( Label, wxString , SetLabel, GetLabel, wxString(), 0 /*flags*/ , wxT("Helpstring") , wxT("group") ) + + wxPROPERTY_FLAGS( WindowStyle , wxButtonStyle , long , SetWindowStyleFlag , GetWindowStyleFlag , EMPTY_MACROVALUE , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) // style + +wxEND_PROPERTIES_TABLE() + +wxBEGIN_HANDLERS_TABLE(wxButton) +wxEND_HANDLERS_TABLE() + +wxCONSTRUCTOR_6( wxButton , wxWindow* , Parent , wxWindowID , Id , wxString , Label , wxPoint , Position , wxSize , Size , long , WindowStyle ) + + +#else +IMPLEMENT_DYNAMIC_CLASS(wxButton, wxControl) +#endif + +// this macro tries to adjust the default button height to a reasonable value +// using the char height as the base +#define BUTTON_HEIGHT_FROM_CHAR_HEIGHT(cy) (11*EDIT_HEIGHT_FROM_CHAR_HEIGHT(cy)/10) + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// creation/destruction +// ---------------------------------------------------------------------------- + +bool wxButton::Create(wxWindow *parent, + wxWindowID id, + const wxString& lbl, + const wxPoint& pos, + const wxSize& size, + long style, + const wxValidator& validator, + const wxString& name) +{ + wxString label(lbl); + if (label.empty() && wxIsStockID(id)) + { + // On Windows, some buttons aren't supposed to have + // mnemonics, so strip them out. + + label = wxGetStockLabel(id +#if defined(__WXMSW__) || defined(__WXWINCE__) + , ( id != wxID_OK && + id != wxID_CANCEL && + id != wxID_CLOSE ) +#endif + ); + } + + if ( !CreateControl(parent, id, pos, size, style, validator, name) ) + return false; + + WXDWORD exstyle; + WXDWORD msStyle = MSWGetStyle(style, &exstyle); + +#ifdef __WIN32__ + // if the label contains several lines we must explicitly tell the button + // about it or it wouldn't draw it correctly ("\n"s would just appear as + // black boxes) + // + // NB: we do it here and not in MSWGetStyle() because we need the label + // value and m_label is not set yet when MSWGetStyle() is called; + // besides changing BS_MULTILINE during run-time is pointless anyhow + if ( label.find(_T('\n')) != wxString::npos ) + { + msStyle |= BS_MULTILINE; + } +#endif // __WIN32__ + + return MSWCreateControl(_T("BUTTON"), msStyle, pos, size, label, exstyle); +} + +wxButton::~wxButton() +{ + wxTopLevelWindow *tlw = wxDynamicCast(wxGetTopLevelParent(this), wxTopLevelWindow); + if ( tlw && tlw->GetTmpDefaultItem() == this ) + { + UnsetTmpDefault(); + } +} + +// ---------------------------------------------------------------------------- +// flags +// ---------------------------------------------------------------------------- + +WXDWORD wxButton::MSWGetStyle(long style, WXDWORD *exstyle) const +{ + // buttons never have an external border, they draw their own one + WXDWORD msStyle = wxControl::MSWGetStyle + ( + (style & ~wxBORDER_MASK) | wxBORDER_NONE, exstyle + ); + + // we must use WS_CLIPSIBLINGS with the buttons or they would draw over + // each other in any resizeable dialog which has more than one button in + // the bottom + msStyle |= WS_CLIPSIBLINGS; + +#ifdef __WIN32__ + // don't use "else if" here: weird as it is, but you may combine wxBU_LEFT + // and wxBU_RIGHT to get BS_CENTER! + if ( style & wxBU_LEFT ) + msStyle |= BS_LEFT; + if ( style & wxBU_RIGHT ) + msStyle |= BS_RIGHT; + if ( style & wxBU_TOP ) + msStyle |= BS_TOP; + if ( style & wxBU_BOTTOM ) + msStyle |= BS_BOTTOM; +#ifndef __WXWINCE__ + // flat 2d buttons + if ( style & wxNO_BORDER ) + msStyle |= BS_FLAT; +#endif // __WXWINCE__ +#endif // __WIN32__ + + return msStyle; +} + +// ---------------------------------------------------------------------------- +// size management including autosizing +// ---------------------------------------------------------------------------- + +wxSize wxButton::DoGetBestSize() const +{ + wxClientDC dc(wx_const_cast(wxButton *, this)); + dc.SetFont(GetFont()); + + wxCoord wBtn, + hBtn; + dc.GetMultiLineTextExtent(GetLabelText(), &wBtn, &hBtn); + + // add a margin -- the button is wider than just its label + wBtn += 3*GetCharWidth(); + hBtn = BUTTON_HEIGHT_FROM_CHAR_HEIGHT(hBtn); + + // all buttons have at least the standard size unless the user explicitly + // wants them to be of smaller size and used wxBU_EXACTFIT style when + // creating the button + if ( !HasFlag(wxBU_EXACTFIT) ) + { + wxSize sz = GetDefaultSize(); + if (wBtn > sz.x) + sz.x = wBtn; + if (hBtn > sz.y) + sz.y = hBtn; + + return sz; + } + + wxSize best(wBtn, hBtn); + CacheBestSize(best); + return best; +} + +/* static */ +wxSize wxButtonBase::GetDefaultSize() +{ + static wxSize s_sizeBtn; + + if ( s_sizeBtn.x == 0 ) + { + wxScreenDC dc; + dc.SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT)); + + // the size of a standard button in the dialog units is 50x14, + // translate this to pixels + // NB1: the multipliers come from the Windows convention + // NB2: the extra +1/+2 were needed to get the size be the same as the + // size of the buttons in the standard dialog - I don't know how + // this happens, but on my system this size is 75x23 in pixels and + // 23*8 isn't even divisible by 14... Would be nice to understand + // why these constants are needed though! + s_sizeBtn.x = (50 * (dc.GetCharWidth() + 1))/4; + s_sizeBtn.y = ((14 * dc.GetCharHeight()) + 2)/8; + } + + return s_sizeBtn; +} + +// ---------------------------------------------------------------------------- +// default button handling +// ---------------------------------------------------------------------------- + +/* + "Everything you ever wanted to know about the default buttons" or "Why do we + have to do all this?" + + In MSW the default button should be activated when the user presses Enter + and the current control doesn't process Enter itself somehow. This is + handled by ::DefWindowProc() (or maybe ::DefDialogProc()) using DM_SETDEFID + Another aspect of "defaultness" is that the default button has different + appearance: this is due to BS_DEFPUSHBUTTON style which is completely + separate from DM_SETDEFID stuff (!). Also note that BS_DEFPUSHBUTTON should + be unset if our parent window is not active so it should be unset whenever + we lose activation and set back when we regain it. + + Final complication is that when a button is active, it should be the default + one, i.e. pressing Enter on a button always activates it and not another + one. + + We handle this by maintaining a permanent and a temporary default items in + wxControlContainer (both may be NULL). When a button becomes the current + control (i.e. gets focus) it sets itself as the temporary default which + ensures that it has the right appearance and that Enter will be redirected + to it. When the button loses focus, it unsets the temporary default and so + the default item will be the permanent default -- that is the default button + if any had been set or none otherwise, which is just what we want. + + NB: all this is quite complicated by now and the worst is that normally + it shouldn't be necessary at all as for the normal Windows programs + DefWindowProc() and IsDialogMessage() take care of all this + automatically -- however in wxWidgets programs this doesn't work for + nested hierarchies (i.e. a notebook inside a notebook) for unknown + reason and so we have to reproduce all this code ourselves. It would be + very nice if we could avoid doing it. + */ + +// set this button as the (permanently) default one in its panel +void wxButton::SetDefault() +{ + wxTopLevelWindow *tlw = wxDynamicCast(wxGetTopLevelParent(this), wxTopLevelWindow); + + wxCHECK_RET( tlw, _T("button without top level window?") ); + + // set this one as the default button both for wxWidgets ... + wxWindow *winOldDefault = tlw->SetDefaultItem(this); + + // ... and Windows + SetDefaultStyle(wxDynamicCast(winOldDefault, wxButton), false); + SetDefaultStyle(this, true); +} + +// special version of wxGetTopLevelParent() which is safe to call when the +// parent is being destroyed: wxGetTopLevelParent() would just return NULL in +// this case because wxWindow version of IsTopLevel() is used when it's called +// during window destruction instead of wxTLW one, but we want to distinguish +// between these cases +static wxTopLevelWindow *GetTLWParentIfNotBeingDeleted(wxWindow *win) +{ + for ( ; win; win = win->GetParent() ) + { + if ( win->IsBeingDeleted() ) + return NULL; + + if ( win->IsTopLevel() ) + break; + } + + wxASSERT_MSG( win, _T("button without top level parent?") ); + + return wxDynamicCast(win, wxTopLevelWindow); +} + +// set this button as being currently default +void wxButton::SetTmpDefault() +{ + wxTopLevelWindow * const tlw = GetTLWParentIfNotBeingDeleted(GetParent()); + if ( !tlw ) + return; + + wxWindow *winOldDefault = tlw->GetDefaultItem(); + tlw->SetTmpDefaultItem(this); + + SetDefaultStyle(wxDynamicCast(winOldDefault, wxButton), false); + SetDefaultStyle(this, true); +} + +// unset this button as currently default, it may still stay permanent default +void wxButton::UnsetTmpDefault() +{ + wxTopLevelWindow * const tlw = GetTLWParentIfNotBeingDeleted(GetParent()); + if ( !tlw ) + return; + + tlw->SetTmpDefaultItem(NULL); + + wxWindow *winOldDefault = tlw->GetDefaultItem(); + + SetDefaultStyle(this, false); + SetDefaultStyle(wxDynamicCast(winOldDefault, wxButton), true); +} + +/* static */ +void +wxButton::SetDefaultStyle(wxButton *btn, bool on) +{ + // we may be called with NULL pointer -- simpler to do the check here than + // in the caller which does wxDynamicCast() + if ( !btn ) + return; + + // first, let DefDlgProc() know about the new default button + if ( on ) + { + // we shouldn't set BS_DEFPUSHBUTTON for any button if we don't have + // focus at all any more + if ( !wxTheApp->IsActive() ) + return; + + wxWindow * const tlw = wxGetTopLevelParent(btn); + wxCHECK_RET( tlw, _T("button without top level window?") ); + + ::SendMessage(GetHwndOf(tlw), DM_SETDEFID, btn->GetId(), 0L); + + // sending DM_SETDEFID also changes the button style to + // BS_DEFPUSHBUTTON so there is nothing more to do + } + + // then also change the style as needed + long style = ::GetWindowLong(GetHwndOf(btn), GWL_STYLE); + if ( !(style & BS_DEFPUSHBUTTON) == on ) + { + // don't do it with the owner drawn buttons because it will + // reset BS_OWNERDRAW style bit too (as BS_OWNERDRAW & + // BS_DEFPUSHBUTTON != 0)! + if ( (style & BS_OWNERDRAW) != BS_OWNERDRAW ) + { + ::SendMessage(GetHwndOf(btn), BM_SETSTYLE, + on ? style | BS_DEFPUSHBUTTON + : style & ~BS_DEFPUSHBUTTON, + 1L /* redraw */); + } + else // owner drawn + { + // redraw the button - it will notice itself that it's + // [not] the default one [any longer] + btn->Refresh(); + } + } + //else: already has correct style +} + +// ---------------------------------------------------------------------------- +// helpers +// ---------------------------------------------------------------------------- + +bool wxButton::SendClickEvent() +{ + wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, GetId()); + event.SetEventObject(this); + + return ProcessCommand(event); +} + +void wxButton::Command(wxCommandEvent & event) +{ + ProcessCommand(event); +} + +// ---------------------------------------------------------------------------- +// event/message handlers +// ---------------------------------------------------------------------------- + +bool wxButton::MSWCommand(WXUINT param, WXWORD WXUNUSED(id)) +{ + bool processed = false; + switch ( param ) + { + // NOTE: Apparently older versions (NT 4?) of the common controls send + // BN_DOUBLECLICKED but not a second BN_CLICKED for owner-drawn + // buttons, so in order to send two EVT_BUTTON events we should + // catch both types. Currently (Feb 2003) up-to-date versions of + // win98, win2k and winXP all send two BN_CLICKED messages for + // all button types, so we don't catch BN_DOUBLECLICKED anymore + // in order to not get 3 EVT_BUTTON events. If this is a problem + // then we need to figure out which version of the comctl32 changed + // this behaviour and test for it. + + case 1: // message came from an accelerator + case BN_CLICKED: // normal buttons send this + processed = SendClickEvent(); + break; + } + + return processed; +} + +WXLRESULT wxButton::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) +{ + // when we receive focus, we want to temporarily become the default button in + // our parent panel so that pressing "Enter" would activate us -- and when + // losing it we should restore the previous default button as well + if ( nMsg == WM_SETFOCUS ) + { + SetTmpDefault(); + + // let the default processing take place too + } + else if ( nMsg == WM_KILLFOCUS ) + { + UnsetTmpDefault(); + } + else if ( nMsg == WM_LBUTTONDBLCLK ) + { + // emulate a click event to force an owner-drawn button to change its + // appearance - without this, it won't do it + (void)wxControl::MSWWindowProc(WM_LBUTTONDOWN, wParam, lParam); + + // and continue with processing the message normally as well + } +#if wxUSE_UXTHEME + else if ( nMsg == WM_THEMECHANGED ) + { + // need to recalculate the best size here + // as the theme size might have changed + InvalidateBestSize(); + } + else if ( wxUxThemeEngine::GetIfActive() ) + { + // we need to Refresh() if mouse has entered or left window + // so we can update the hot tracking state + // must use m_mouseInWindow here instead of IsMouseInWindow() + // since we need to know the first time the mouse enters the window + // and IsMouseInWindow() would return true in this case + if ( ( nMsg == WM_MOUSEMOVE && !m_mouseInWindow ) || + nMsg == WM_MOUSELEAVE ) + { + Refresh(); + } + } +#endif // wxUSE_UXTHEME + + // let the base class do all real processing + return wxControl::MSWWindowProc(nMsg, wParam, lParam); +} + +// ---------------------------------------------------------------------------- +// owner-drawn buttons support +// ---------------------------------------------------------------------------- + +#ifdef __WIN32__ + +// drawing helpers + +static void DrawButtonText(HDC hdc, + RECT *pRect, + const wxString& text, + COLORREF col) +{ + COLORREF colOld = SetTextColor(hdc, col); + int modeOld = SetBkMode(hdc, TRANSPARENT); + + if ( text.find(_T('\n')) != wxString::npos ) + { + // draw multiline label + + // first we need to compute its bounding rect + RECT rc; + ::CopyRect(&rc, pRect); + ::DrawText(hdc, text, text.length(), &rc, DT_CENTER | DT_CALCRECT); + + // now center this rect inside the entire button area + const LONG w = rc.right - rc.left; + const LONG h = rc.bottom - rc.top; + rc.left = (pRect->right - pRect->left)/2 - w/2; + rc.right = rc.left+w; + rc.top = (pRect->bottom - pRect->top)/2 - h/2; + rc.bottom = rc.top+h; + + ::DrawText(hdc, text, text.length(), &rc, DT_CENTER); + } + else // single line label + { + // Note: we must have DT_SINGLELINE for DT_VCENTER to work. + ::DrawText(hdc, text, text.length(), pRect, + DT_SINGLELINE | DT_CENTER | DT_VCENTER); + } + + SetBkMode(hdc, modeOld); + SetTextColor(hdc, colOld); +} + +static void DrawRect(HDC hdc, const RECT& r) +{ + wxDrawLine(hdc, r.left, r.top, r.right, r.top); + wxDrawLine(hdc, r.right, r.top, r.right, r.bottom); + wxDrawLine(hdc, r.right, r.bottom, r.left, r.bottom); + wxDrawLine(hdc, r.left, r.bottom, r.left, r.top); +} + +void wxButton::MakeOwnerDrawn() +{ + long style = GetWindowLong(GetHwnd(), GWL_STYLE); + if ( (style & BS_OWNERDRAW) != BS_OWNERDRAW ) + { + // make it so + style |= BS_OWNERDRAW; + SetWindowLong(GetHwnd(), GWL_STYLE, style); + } +} + +bool wxButton::SetBackgroundColour(const wxColour &colour) +{ + if ( !wxControl::SetBackgroundColour(colour) ) + { + // nothing to do + return false; + } + + MakeOwnerDrawn(); + + Refresh(); + + return true; +} + +bool wxButton::SetForegroundColour(const wxColour &colour) +{ + if ( !wxControl::SetForegroundColour(colour) ) + { + // nothing to do + return false; + } + + MakeOwnerDrawn(); + + Refresh(); + + return true; +} + +/* + The button frame looks like this normally: + + WWWWWWWWWWWWWWWWWWB + WHHHHHHHHHHHHHHHHGB W = white (HILIGHT) + WH GB H = light grey (LIGHT) + WH GB G = dark grey (SHADOW) + WH GB B = black (DKSHADOW) + WH GB + WGGGGGGGGGGGGGGGGGB + BBBBBBBBBBBBBBBBBBB + + When the button is selected, the button becomes like this (the total button + size doesn't change): + + BBBBBBBBBBBBBBBBBBB + BWWWWWWWWWWWWWWWWBB + BWHHHHHHHHHHHHHHGBB + BWH GBB + BWH GBB + BWGGGGGGGGGGGGGGGBB + BBBBBBBBBBBBBBBBBBB + BBBBBBBBBBBBBBBBBBB + + When the button is pushed (while selected) it is like: + + BBBBBBBBBBBBBBBBBBB + BGGGGGGGGGGGGGGGGGB + BG GB + BG GB + BG GB + BG GB + BGGGGGGGGGGGGGGGGGB + BBBBBBBBBBBBBBBBBBB +*/ + +static void DrawButtonFrame(HDC hdc, const RECT& rectBtn, + bool selected, bool pushed) +{ + RECT r; + CopyRect(&r, &rectBtn); + + HPEN hpenBlack = CreatePen(PS_SOLID, 1, GetSysColor(COLOR_3DDKSHADOW)), + hpenGrey = CreatePen(PS_SOLID, 1, GetSysColor(COLOR_3DSHADOW)), + hpenLightGr = CreatePen(PS_SOLID, 1, GetSysColor(COLOR_3DLIGHT)), + hpenWhite = CreatePen(PS_SOLID, 1, GetSysColor(COLOR_3DHILIGHT)); + + HPEN hpenOld = (HPEN)SelectObject(hdc, hpenBlack); + + r.right--; + r.bottom--; + + if ( pushed ) + { + DrawRect(hdc, r); + + (void)SelectObject(hdc, hpenGrey); + ::InflateRect(&r, -1, -1); + + DrawRect(hdc, r); + } + else // !pushed + { + if ( selected ) + { + DrawRect(hdc, r); + + ::InflateRect(&r, -1, -1); + } + + wxDrawLine(hdc, r.left, r.bottom, r.right, r.bottom); + wxDrawLine(hdc, r.right, r.bottom, r.right, r.top - 1); + + (void)SelectObject(hdc, hpenWhite); + wxDrawLine(hdc, r.left, r.bottom - 1, r.left, r.top); + wxDrawLine(hdc, r.left, r.top, r.right, r.top); + + (void)SelectObject(hdc, hpenLightGr); + wxDrawLine(hdc, r.left + 1, r.bottom - 2, r.left + 1, r.top + 1); + wxDrawLine(hdc, r.left + 1, r.top + 1, r.right - 1, r.top + 1); + + (void)SelectObject(hdc, hpenGrey); + wxDrawLine(hdc, r.left + 1, r.bottom - 1, r.right - 1, r.bottom - 1); + wxDrawLine(hdc, r.right - 1, r.bottom - 1, r.right - 1, r.top); + } + + (void)SelectObject(hdc, hpenOld); + DeleteObject(hpenWhite); + DeleteObject(hpenLightGr); + DeleteObject(hpenGrey); + DeleteObject(hpenBlack); +} + +#if wxUSE_UXTHEME +static +void MSWDrawXPBackground(wxButton *button, WXDRAWITEMSTRUCT *wxdis) +{ + LPDRAWITEMSTRUCT lpDIS = (LPDRAWITEMSTRUCT)wxdis; + HDC hdc = lpDIS->hDC; + UINT state = lpDIS->itemState; + RECT rectBtn; + CopyRect(&rectBtn, &lpDIS->rcItem); + + wxUxThemeHandle theme(button, L"BUTTON"); + int iState; + + if ( state & ODS_SELECTED ) + { + iState = PBS_PRESSED; + } + else if ( button->HasCapture() || button->IsMouseInWindow() ) + { + iState = PBS_HOT; + } + else if ( state & ODS_FOCUS ) + { + iState = PBS_DEFAULTED; + } + else if ( state & ODS_DISABLED ) + { + iState = PBS_DISABLED; + } + else + { + iState = PBS_NORMAL; + } + + // draw parent background if needed + if ( wxUxThemeEngine::Get()->IsThemeBackgroundPartiallyTransparent(theme, + BP_PUSHBUTTON, + iState) ) + { + wxUxThemeEngine::Get()->DrawThemeParentBackground(GetHwndOf(button), hdc, &rectBtn); + } + + // draw background + wxUxThemeEngine::Get()->DrawThemeBackground(theme, hdc, BP_PUSHBUTTON, iState, + &rectBtn, NULL); + + // calculate content area margins + MARGINS margins; + wxUxThemeEngine::Get()->GetThemeMargins(theme, hdc, BP_PUSHBUTTON, iState, + TMT_CONTENTMARGINS, &rectBtn, &margins); + RECT rectClient; + ::CopyRect(&rectClient, &rectBtn); + ::InflateRect(&rectClient, -margins.cxLeftWidth, -margins.cyTopHeight); + + // if focused and !nofocus rect + if ( (state & ODS_FOCUS) && !(state & ODS_NOFOCUSRECT) ) + { + DrawFocusRect(hdc, &rectClient); + } + + if ( button->UseBgCol() ) + { + COLORREF colBg = wxColourToRGB(button->GetBackgroundColour()); + HBRUSH hbrushBackground = ::CreateSolidBrush(colBg); + + // don't overwrite the focus rect + ::InflateRect(&rectClient, -1, -1); + FillRect(hdc, &rectClient, hbrushBackground); + ::DeleteObject(hbrushBackground); + } +} +#endif // wxUSE_UXTHEME + +bool wxButton::MSWOnDraw(WXDRAWITEMSTRUCT *wxdis) +{ + LPDRAWITEMSTRUCT lpDIS = (LPDRAWITEMSTRUCT)wxdis; + HDC hdc = lpDIS->hDC; + UINT state = lpDIS->itemState; + RECT rectBtn; + CopyRect(&rectBtn, &lpDIS->rcItem); + +#if wxUSE_UXTHEME + if ( wxUxThemeEngine::GetIfActive() ) + { + MSWDrawXPBackground(this, wxdis); + } + else +#endif // wxUSE_UXTHEME + { + COLORREF colBg = wxColourToRGB(GetBackgroundColour()); + + // first, draw the background + HBRUSH hbrushBackground = ::CreateSolidBrush(colBg); + FillRect(hdc, &rectBtn, hbrushBackground); + ::DeleteObject(hbrushBackground); + + // draw the border for the current state + bool selected = (state & ODS_SELECTED) != 0; + if ( !selected ) + { + wxTopLevelWindow *tlw = wxDynamicCast(wxGetTopLevelParent(this), wxTopLevelWindow); + if ( tlw ) + { + selected = tlw->GetDefaultItem() == this; + } + } + bool pushed = (SendMessage(GetHwnd(), BM_GETSTATE, 0, 0) & BST_PUSHED) != 0; + + DrawButtonFrame(hdc, rectBtn, selected, pushed); + + // if focused and !nofocus rect + if ( (state & ODS_FOCUS) && !(state & ODS_NOFOCUSRECT) ) + { + RECT rectFocus; + CopyRect(&rectFocus, &rectBtn); + + // I don't know where does this constant come from, but this is how + // Windows draws them + InflateRect(&rectFocus, -4, -4); + + DrawFocusRect(hdc, &rectFocus); + } + + if ( pushed ) + { + // the label is shifted by 1 pixel to create "pushed" effect + OffsetRect(&rectBtn, 1, 1); + } + } + + COLORREF colFg = wxColourToRGB(GetForegroundColour()); + if ( state & ODS_DISABLED ) colFg = GetSysColor(COLOR_GRAYTEXT) ; + wxString label = GetLabel(); + if ( state & ODS_NOACCEL ) label = GetLabelText() ; + DrawButtonText(hdc, &rectBtn, label, colFg); + + return true; +} + +#endif // __WIN32__ + +#endif // wxUSE_BUTTON diff --git a/Externals/wxWidgets/src/msw/caret.cpp b/Externals/wxWidgets/src/msw/caret.cpp new file mode 100644 index 0000000000..9c43cdf618 --- /dev/null +++ b/Externals/wxWidgets/src/msw/caret.cpp @@ -0,0 +1,188 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: msw/caret.cpp +// Purpose: MSW implementation of wxCaret +// Author: Vadim Zeitlin +// Modified by: +// Created: 23.05.99 +// RCS-ID: $Id: caret.cpp 35650 2005-09-23 12:56:45Z MR $ +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// =========================================================================== +// declarations +// =========================================================================== + +// --------------------------------------------------------------------------- +// headers +// --------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#ifndef WX_PRECOMP + #include "wx/window.h" + #include "wx/log.h" +#endif // WX_PRECOMP + +#include "wx/caret.h" + +#if wxUSE_CARET + +#include "wx/msw/private.h" + +// --------------------------------------------------------------------------- +// macros +// --------------------------------------------------------------------------- + +#define CALL_CARET_API(api, args) \ + if ( !api args ) \ + wxLogLastError(_T(#api)) + +// =========================================================================== +// implementation +// =========================================================================== + +// --------------------------------------------------------------------------- +// blink time +// --------------------------------------------------------------------------- + +//static +int wxCaretBase::GetBlinkTime() +{ + int blinkTime = ::GetCaretBlinkTime(); + if ( !blinkTime ) + { + wxLogLastError(wxT("GetCaretBlinkTime")); + } + + return blinkTime; +} + +//static +void wxCaretBase::SetBlinkTime(int milliseconds) +{ + CALL_CARET_API(SetCaretBlinkTime, (milliseconds)); +} + +// --------------------------------------------------------------------------- +// creating/destroying the caret +// --------------------------------------------------------------------------- + +bool wxCaret::MSWCreateCaret() +{ + wxASSERT_MSG( GetWindow(), wxT("caret without window cannot be created") ); + wxASSERT_MSG( IsOk(), wxT("caret of zero size cannot be created") ); + + if ( !m_hasCaret ) + { + CALL_CARET_API(CreateCaret, (GetWinHwnd(GetWindow()), 0, + m_width, m_height)); + + m_hasCaret = true; + } + + return m_hasCaret; +} + +void wxCaret::OnSetFocus() +{ + if ( m_countVisible > 0 ) + { + if ( MSWCreateCaret() ) + { + // the caret was recreated but it doesn't remember its position and + // it's not shown + + DoMove(); + DoShow(); + } + } + //else: caret is invisible, don't waste time creating it +} + +void wxCaret::OnKillFocus() +{ + if ( m_hasCaret ) + { + m_hasCaret = false; + + CALL_CARET_API(DestroyCaret, ()); + } +} + +// --------------------------------------------------------------------------- +// showing/hiding the caret +// --------------------------------------------------------------------------- + +void wxCaret::DoShow() +{ + wxASSERT_MSG( GetWindow(), wxT("caret without window cannot be shown") ); + wxASSERT_MSG( IsOk(), wxT("caret of zero size cannot be shown") ); + + // we might not have created the caret yet if we had got the focus first + // and the caret was shown later - so do it now if we have the focus but + // not the caret + if ( !m_hasCaret && (wxWindow::FindFocus() == GetWindow()) ) + { + if ( MSWCreateCaret() ) + { + DoMove(); + } + } + + if ( m_hasCaret ) + { + CALL_CARET_API(ShowCaret, (GetWinHwnd(GetWindow()))); + } + //else: will be shown when we get the focus +} + +void wxCaret::DoHide() +{ + if ( m_hasCaret ) + { + CALL_CARET_API(HideCaret, (GetWinHwnd(GetWindow()))); + } +} + +// --------------------------------------------------------------------------- +// moving the caret +// --------------------------------------------------------------------------- + +void wxCaret::DoMove() +{ + if ( m_hasCaret ) + { + wxASSERT_MSG( wxWindow::FindFocus() == GetWindow(), + wxT("how did we lose focus?") ); + + // for compatibility with the generic version, the coordinates are + // client ones + wxPoint pt = GetWindow()->GetClientAreaOrigin(); + CALL_CARET_API(SetCaretPos, (m_x + pt.x, m_y + pt.y)); + } + //else: we don't have caret right now, nothing to do (this does happen) +} + + +// --------------------------------------------------------------------------- +// resizing the caret +// --------------------------------------------------------------------------- + +void wxCaret::DoSize() +{ + if ( m_hasCaret ) + { + m_hasCaret = false; + CALL_CARET_API(DestroyCaret, ()); + MSWCreateCaret(); + OnSetFocus(); + } +} + +#endif diff --git a/Externals/wxWidgets/src/msw/checkbox.cpp b/Externals/wxWidgets/src/msw/checkbox.cpp new file mode 100644 index 0000000000..550afd7404 --- /dev/null +++ b/Externals/wxWidgets/src/msw/checkbox.cpp @@ -0,0 +1,588 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/msw/checkbox.cpp +// Purpose: wxCheckBox +// Author: Julian Smart +// Modified by: +// Created: 04/01/98 +// RCS-ID: $Id: checkbox.cpp 40331 2006-07-25 18:47:39Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_CHECKBOX + +#include "wx/checkbox.h" + +#ifndef WX_PRECOMP + #include "wx/brush.h" + #include "wx/dcscreen.h" + #include "wx/settings.h" +#endif + +#include "wx/msw/uxtheme.h" +#include "wx/msw/private.h" + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +#ifndef BST_UNCHECKED + #define BST_UNCHECKED 0x0000 +#endif + +#ifndef BST_CHECKED + #define BST_CHECKED 0x0001 +#endif + +#ifndef BST_INDETERMINATE + #define BST_INDETERMINATE 0x0002 +#endif + +#ifndef DFCS_HOT + #define DFCS_HOT 0x1000 +#endif + +#ifndef DT_HIDEPREFIX + #define DT_HIDEPREFIX 0x00100000 +#endif + +#ifndef BP_CHECKBOX + #define BP_CHECKBOX 3 +#endif + +// these values are defined in tmschema.h (except the first one) +enum +{ + CBS_INVALID, + CBS_UNCHECKEDNORMAL, + CBS_UNCHECKEDHOT, + CBS_UNCHECKEDPRESSED, + CBS_UNCHECKEDDISABLED, + CBS_CHECKEDNORMAL, + CBS_CHECKEDHOT, + CBS_CHECKEDPRESSED, + CBS_CHECKEDDISABLED, + CBS_MIXEDNORMAL, + CBS_MIXEDHOT, + CBS_MIXEDPRESSED, + CBS_MIXEDDISABLED +}; + +// these are our own +enum +{ + CBS_HOT_OFFSET = 1, + CBS_PRESSED_OFFSET = 2, + CBS_DISABLED_OFFSET = 3 +}; + +// ============================================================================ +// implementation +// ============================================================================ + +#if wxUSE_EXTENDED_RTTI +WX_DEFINE_FLAGS( wxCheckBoxStyle ) + +wxBEGIN_FLAGS( wxCheckBoxStyle ) + // new style border flags, we put them first to + // use them for streaming out + wxFLAGS_MEMBER(wxBORDER_SIMPLE) + wxFLAGS_MEMBER(wxBORDER_SUNKEN) + wxFLAGS_MEMBER(wxBORDER_DOUBLE) + wxFLAGS_MEMBER(wxBORDER_RAISED) + wxFLAGS_MEMBER(wxBORDER_STATIC) + wxFLAGS_MEMBER(wxBORDER_NONE) + + // old style border flags + wxFLAGS_MEMBER(wxSIMPLE_BORDER) + wxFLAGS_MEMBER(wxSUNKEN_BORDER) + wxFLAGS_MEMBER(wxDOUBLE_BORDER) + wxFLAGS_MEMBER(wxRAISED_BORDER) + wxFLAGS_MEMBER(wxSTATIC_BORDER) + wxFLAGS_MEMBER(wxNO_BORDER) + + // standard window styles + wxFLAGS_MEMBER(wxTAB_TRAVERSAL) + wxFLAGS_MEMBER(wxCLIP_CHILDREN) + wxFLAGS_MEMBER(wxTRANSPARENT_WINDOW) + wxFLAGS_MEMBER(wxWANTS_CHARS) + wxFLAGS_MEMBER(wxNO_FULL_REPAINT_ON_RESIZE) + wxFLAGS_MEMBER(wxALWAYS_SHOW_SB ) + wxFLAGS_MEMBER(wxVSCROLL) + wxFLAGS_MEMBER(wxHSCROLL) + +wxEND_FLAGS( wxCheckBoxStyle ) + +IMPLEMENT_DYNAMIC_CLASS_XTI(wxCheckBox, wxControl,"wx/checkbox.h") + +wxBEGIN_PROPERTIES_TABLE(wxCheckBox) + wxEVENT_PROPERTY( Click , wxEVT_COMMAND_CHECKBOX_CLICKED , wxCommandEvent ) + + wxPROPERTY( Font , wxFont , SetFont , GetFont , EMPTY_MACROVALUE , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) + wxPROPERTY( Label,wxString, SetLabel, GetLabel, wxString() , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) + wxPROPERTY( Value ,bool, SetValue, GetValue, EMPTY_MACROVALUE, 0 /*flags*/ , wxT("Helpstring") , wxT("group")) + wxPROPERTY_FLAGS( WindowStyle , wxCheckBoxStyle , long , SetWindowStyleFlag , GetWindowStyleFlag , EMPTY_MACROVALUE, 0 /*flags*/ , wxT("Helpstring") , wxT("group")) // style +wxEND_PROPERTIES_TABLE() + +wxBEGIN_HANDLERS_TABLE(wxCheckBox) +wxEND_HANDLERS_TABLE() + +wxCONSTRUCTOR_6( wxCheckBox , wxWindow* , Parent , wxWindowID , Id , wxString , Label , wxPoint , Position , wxSize , Size , long , WindowStyle ) +#else +IMPLEMENT_DYNAMIC_CLASS(wxCheckBox, wxControl) +#endif + + +// ---------------------------------------------------------------------------- +// wxCheckBox creation +// ---------------------------------------------------------------------------- + +void wxCheckBox::Init() +{ + m_state = wxCHK_UNCHECKED; + m_isPressed = + m_isHot = false; +} + +bool wxCheckBox::Create(wxWindow *parent, + wxWindowID id, + const wxString& label, + const wxPoint& pos, + const wxSize& size, long style, + const wxValidator& validator, + const wxString& name) +{ + Init(); + + if ( !CreateControl(parent, id, pos, size, style, validator, name) ) + return false; + + long msStyle = WS_TABSTOP; + + if ( style & wxCHK_3STATE ) + { + msStyle |= BS_3STATE; + } + else + { + wxASSERT_MSG( !Is3rdStateAllowedForUser(), + wxT("Using wxCH_ALLOW_3RD_STATE_FOR_USER") + wxT(" style flag for a 2-state checkbox is useless") ); + msStyle |= BS_CHECKBOX; + } + + if ( style & wxALIGN_RIGHT ) + { + msStyle |= BS_LEFTTEXT | BS_RIGHT; + } + + return MSWCreateControl(wxT("BUTTON"), msStyle, pos, size, label, 0); +} + +// ---------------------------------------------------------------------------- +// wxCheckBox geometry +// ---------------------------------------------------------------------------- + +wxSize wxCheckBox::DoGetBestSize() const +{ + static int s_checkSize = 0; + + if ( !s_checkSize ) + { + wxScreenDC dc; + dc.SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT)); + + s_checkSize = dc.GetCharHeight(); + } + + wxString str = wxGetWindowText(GetHWND()); + + int wCheckbox, hCheckbox; + if ( !str.empty() ) + { + GetTextExtent(GetLabelText(str), &wCheckbox, &hCheckbox); + wCheckbox += s_checkSize + GetCharWidth(); + + if ( hCheckbox < s_checkSize ) + hCheckbox = s_checkSize; + } + else + { + wCheckbox = s_checkSize; + hCheckbox = s_checkSize; + } +#ifdef __WXWINCE__ + hCheckbox += 1; +#endif + + wxSize best(wCheckbox, hCheckbox); + CacheBestSize(best); + return best; +} + +// ---------------------------------------------------------------------------- +// wxCheckBox operations +// ---------------------------------------------------------------------------- + +void wxCheckBox::SetValue(bool val) +{ + Set3StateValue(val ? wxCHK_CHECKED : wxCHK_UNCHECKED); +} + +bool wxCheckBox::GetValue() const +{ + return Get3StateValue() != wxCHK_UNCHECKED; +} + +void wxCheckBox::Command(wxCommandEvent& event) +{ + int state = event.GetInt(); + wxCHECK_RET( (state == wxCHK_UNCHECKED) || (state == wxCHK_CHECKED) + || (state == wxCHK_UNDETERMINED), + wxT("event.GetInt() returned an invalid checkbox state") ); + + Set3StateValue((wxCheckBoxState) state); + ProcessCommand(event); +} + +wxCOMPILE_TIME_ASSERT(wxCHK_UNCHECKED == BST_UNCHECKED + && wxCHK_CHECKED == BST_CHECKED + && wxCHK_UNDETERMINED == BST_INDETERMINATE, EnumValuesIncorrect); + +void wxCheckBox::DoSet3StateValue(wxCheckBoxState state) +{ + m_state = state; + if ( !IsOwnerDrawn() ) + ::SendMessage(GetHwnd(), BM_SETCHECK, (WPARAM) state, 0); + else // owner drawn buttons don't react to this message + Refresh(); +} + +wxCheckBoxState wxCheckBox::DoGet3StateValue() const +{ + return m_state; +} + +bool wxCheckBox::MSWCommand(WXUINT cmd, WXWORD WXUNUSED(id)) +{ + if ( cmd != BN_CLICKED && cmd != BN_DBLCLK ) + return false; + + // first update the value so that user event handler gets the new checkbox + // value + + // ownerdrawn buttons don't manage their state themselves unlike usual + // auto checkboxes so do it ourselves in any case + wxCheckBoxState state; + if ( Is3rdStateAllowedForUser() ) + { + state = (wxCheckBoxState)((m_state + 1) % 3); + } + else // 2 state checkbox (at least from users point of view) + { + // note that wxCHK_UNDETERMINED also becomes unchecked when clicked + state = m_state == wxCHK_UNCHECKED ? wxCHK_CHECKED : wxCHK_UNCHECKED; + } + + DoSet3StateValue(state); + + + // generate the event + wxCommandEvent event(wxEVT_COMMAND_CHECKBOX_CLICKED, m_windowId); + + event.SetInt(state); + event.SetEventObject(this); + ProcessCommand(event); + + return true; +} + +// ---------------------------------------------------------------------------- +// owner drawn checkboxes stuff +// ---------------------------------------------------------------------------- + +bool wxCheckBox::SetForegroundColour(const wxColour& colour) +{ + if ( !wxCheckBoxBase::SetForegroundColour(colour) ) + return false; + + // the only way to change the checkbox foreground colour under Windows XP + // is to owner draw it + if ( wxUxThemeEngine::GetIfActive() ) + MakeOwnerDrawn(colour.Ok()); + + return true; +} + +bool wxCheckBox::IsOwnerDrawn() const +{ + return + (::GetWindowLong(GetHwnd(), GWL_STYLE) & BS_OWNERDRAW) == BS_OWNERDRAW; +} + +void wxCheckBox::MakeOwnerDrawn(bool ownerDrawn) +{ + long style = ::GetWindowLong(GetHwnd(), GWL_STYLE); + + // note that BS_CHECKBOX & BS_OWNERDRAW != 0 so we can't operate on + // them as on independent style bits + if ( ownerDrawn ) + { + style &= ~(BS_CHECKBOX | BS_3STATE); + style |= BS_OWNERDRAW; + + Connect(wxEVT_ENTER_WINDOW, + wxMouseEventHandler(wxCheckBox::OnMouseEnterOrLeave)); + Connect(wxEVT_LEAVE_WINDOW, + wxMouseEventHandler(wxCheckBox::OnMouseEnterOrLeave)); + Connect(wxEVT_LEFT_DOWN, wxMouseEventHandler(wxCheckBox::OnMouseLeft)); + Connect(wxEVT_LEFT_UP, wxMouseEventHandler(wxCheckBox::OnMouseLeft)); + Connect(wxEVT_SET_FOCUS, wxFocusEventHandler(wxCheckBox::OnFocus)); + Connect(wxEVT_KILL_FOCUS, wxFocusEventHandler(wxCheckBox::OnFocus)); + } + else // reset to default colour + { + style &= ~BS_OWNERDRAW; + style |= HasFlag(wxCHK_3STATE) ? BS_3STATE : BS_CHECKBOX; + + Disconnect(wxEVT_ENTER_WINDOW, + wxMouseEventHandler(wxCheckBox::OnMouseEnterOrLeave)); + Disconnect(wxEVT_LEAVE_WINDOW, + wxMouseEventHandler(wxCheckBox::OnMouseEnterOrLeave)); + Disconnect(wxEVT_LEFT_DOWN, wxMouseEventHandler(wxCheckBox::OnMouseLeft)); + Disconnect(wxEVT_LEFT_UP, wxMouseEventHandler(wxCheckBox::OnMouseLeft)); + Disconnect(wxEVT_SET_FOCUS, wxFocusEventHandler(wxCheckBox::OnFocus)); + Disconnect(wxEVT_KILL_FOCUS, wxFocusEventHandler(wxCheckBox::OnFocus)); + } + + ::SetWindowLong(GetHwnd(), GWL_STYLE, style); + + if ( !ownerDrawn ) + { + // ensure that controls state is consistent with internal state + DoSet3StateValue(m_state); + } +} + +void wxCheckBox::OnMouseEnterOrLeave(wxMouseEvent& event) +{ + m_isHot = event.GetEventType() == wxEVT_ENTER_WINDOW; + if ( !m_isHot ) + m_isPressed = false; + + Refresh(); + + event.Skip(); +} + +void wxCheckBox::OnMouseLeft(wxMouseEvent& event) +{ + // TODO: we should capture the mouse here to be notified about left up + // event but this interferes with BN_CLICKED generation so if we + // want to do this we'd need to generate them ourselves + m_isPressed = event.GetEventType() == wxEVT_LEFT_DOWN; + Refresh(); + + event.Skip(); +} + +void wxCheckBox::OnFocus(wxFocusEvent& event) +{ + Refresh(); + + event.Skip(); +} + +bool wxCheckBox::MSWOnDraw(WXDRAWITEMSTRUCT *item) +{ + DRAWITEMSTRUCT *dis = (DRAWITEMSTRUCT *)item; + + if ( !IsOwnerDrawn() || dis->CtlType != ODT_BUTTON ) + return wxCheckBoxBase::MSWOnDraw(item); + + // calculate the rectangles for the check mark itself and the label + HDC hdc = dis->hDC; + RECT& rect = dis->rcItem; + RECT rectCheck, + rectLabel; + rectCheck.top = + rectLabel.top = rect.top; + rectCheck.bottom = + rectLabel.bottom = rect.bottom; + const int checkSize = GetBestSize().y; + const int MARGIN = 3; + + const bool isRightAligned = HasFlag(wxALIGN_RIGHT); + if ( isRightAligned ) + { + rectCheck.right = rect.right; + rectCheck.left = rectCheck.right - checkSize; + + rectLabel.right = rectCheck.left - MARGIN; + rectLabel.left = rect.left; + } + else // normal, left-aligned checkbox + { + rectCheck.left = rect.left; + rectCheck.right = rectCheck.left + checkSize; + + rectLabel.left = rectCheck.right + MARGIN; + rectLabel.right = rect.right; + } + + // show we draw a focus rect? + const bool isFocused = m_isPressed || FindFocus() == this; + + + // draw the checkbox itself: note that this should really, really be in + // wxRendererNative but unfortunately we can't add a new virtual function + // to it without breaking backwards compatibility + + // classic Win32 version -- this can be useful when we move this into + // wxRendererNative +#if defined(__WXWINCE__) || !wxUSE_UXTHEME + UINT state = DFCS_BUTTONCHECK; + if ( !IsEnabled() ) + state |= DFCS_INACTIVE; + switch ( Get3StateValue() ) + { + case wxCHK_CHECKED: + state |= DFCS_CHECKED; + break; + + case wxCHK_UNDETERMINED: + state |= DFCS_PUSHED; + break; + + default: + wxFAIL_MSG( _T("unexpected Get3StateValue() return value") ); + // fall through + + case wxCHK_UNCHECKED: + // no extra styles needed + break; + } + + if ( wxFindWindowAtPoint(wxGetMousePosition()) == this ) + state |= DFCS_HOT; + + if ( !::DrawFrameControl(hdc, &rectCheck, DFC_BUTTON, state) ) + { + wxLogLastError(_T("DrawFrameControl(DFC_BUTTON)")); + } +#else // XP version + wxUxThemeEngine *themeEngine = wxUxThemeEngine::GetIfActive(); + if ( !themeEngine ) + return false; + + wxUxThemeHandle theme(this, L"BUTTON"); + if ( !theme ) + return false; + + int state; + switch ( Get3StateValue() ) + { + case wxCHK_CHECKED: + state = CBS_CHECKEDNORMAL; + break; + + case wxCHK_UNDETERMINED: + state = CBS_MIXEDNORMAL; + break; + + default: + wxFAIL_MSG( _T("unexpected Get3StateValue() return value") ); + // fall through + + case wxCHK_UNCHECKED: + state = CBS_UNCHECKEDNORMAL; + break; + } + + if ( !IsEnabled() ) + state += CBS_DISABLED_OFFSET; + else if ( m_isPressed ) + state += CBS_PRESSED_OFFSET; + else if ( m_isHot ) + state += CBS_HOT_OFFSET; + + HRESULT hr = themeEngine->DrawThemeBackground + ( + theme, + hdc, + BP_CHECKBOX, + state, + &rectCheck, + NULL + ); + if ( FAILED(hr) ) + { + wxLogApiError(_T("DrawThemeBackground(BP_CHECKBOX)"), hr); + } +#endif // 0/1 + + // draw the text + const wxString& label = GetLabel(); + + // first we need to measure it + UINT fmt = DT_NOCLIP; + + // drawing underlying doesn't look well with focus rect (and the native + // control doesn't do it) + if ( isFocused ) + fmt |= DT_HIDEPREFIX; + if ( isRightAligned ) + fmt |= DT_RIGHT; + // TODO: also use DT_HIDEPREFIX if the system is configured so + + // we need to get the label real size first if we have to draw a focus rect + // around it + if ( isFocused ) + { + if ( !::DrawText(hdc, label, label.length(), &rectLabel, + fmt | DT_CALCRECT) ) + { + wxLogLastError(_T("DrawText(DT_CALCRECT)")); + } + } + + if ( !IsEnabled() ) + { + ::SetTextColor(hdc, ::GetSysColor(COLOR_GRAYTEXT)); + } + + if ( !::DrawText(hdc, label, label.length(), &rectLabel, fmt) ) + { + wxLogLastError(_T("DrawText()")); + } + + // finally draw the focus + if ( isFocused ) + { + rectLabel.left--; + rectLabel.right++; + if ( !::DrawFocusRect(hdc, &rectLabel) ) + { + wxLogLastError(_T("DrawFocusRect()")); + } + } + + return true; +} + +#endif // wxUSE_CHECKBOX diff --git a/Externals/wxWidgets/src/msw/checklst.cpp b/Externals/wxWidgets/src/msw/checklst.cpp new file mode 100644 index 0000000000..951ee82d70 --- /dev/null +++ b/Externals/wxWidgets/src/msw/checklst.cpp @@ -0,0 +1,538 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/msw/checklst.cpp +// Purpose: implementation of wxCheckListBox class +// Author: Vadim Zeitlin +// Modified by: +// Created: 16.11.97 +// RCS-ID: $Id: checklst.cpp 49804 2007-11-10 01:09:42Z VZ $ +// Copyright: (c) 1998 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_CHECKLISTBOX && wxUSE_OWNER_DRAWN + +#include "wx/checklst.h" + +#ifndef WX_PRECOMP + #include "wx/msw/wrapwin.h" + #include "wx/object.h" + #include "wx/colour.h" + #include "wx/font.h" + #include "wx/bitmap.h" + #include "wx/window.h" + #include "wx/listbox.h" + #include "wx/dcmemory.h" + #include "wx/settings.h" + #include "wx/log.h" +#endif + +#include "wx/ownerdrw.h" + +#include + +#include "wx/msw/private.h" + +// ---------------------------------------------------------------------------- +// private functions +// ---------------------------------------------------------------------------- + +// get item (converted to right type) +#define GetItem(n) ((wxCheckListBoxItem *)(GetItem(n))) + +// ============================================================================ +// implementation +// ============================================================================ + + +#if wxUSE_EXTENDED_RTTI +WX_DEFINE_FLAGS( wxCheckListBoxStyle ) + +wxBEGIN_FLAGS( wxCheckListBoxStyle ) + // new style border flags, we put them first to + // use them for streaming out + wxFLAGS_MEMBER(wxBORDER_SIMPLE) + wxFLAGS_MEMBER(wxBORDER_SUNKEN) + wxFLAGS_MEMBER(wxBORDER_DOUBLE) + wxFLAGS_MEMBER(wxBORDER_RAISED) + wxFLAGS_MEMBER(wxBORDER_STATIC) + wxFLAGS_MEMBER(wxBORDER_NONE) + + // old style border flags + wxFLAGS_MEMBER(wxSIMPLE_BORDER) + wxFLAGS_MEMBER(wxSUNKEN_BORDER) + wxFLAGS_MEMBER(wxDOUBLE_BORDER) + wxFLAGS_MEMBER(wxRAISED_BORDER) + wxFLAGS_MEMBER(wxSTATIC_BORDER) + wxFLAGS_MEMBER(wxBORDER) + + // standard window styles + wxFLAGS_MEMBER(wxTAB_TRAVERSAL) + wxFLAGS_MEMBER(wxCLIP_CHILDREN) + wxFLAGS_MEMBER(wxTRANSPARENT_WINDOW) + wxFLAGS_MEMBER(wxWANTS_CHARS) + wxFLAGS_MEMBER(wxFULL_REPAINT_ON_RESIZE) + wxFLAGS_MEMBER(wxALWAYS_SHOW_SB ) + wxFLAGS_MEMBER(wxVSCROLL) + wxFLAGS_MEMBER(wxHSCROLL) + + wxFLAGS_MEMBER(wxLB_SINGLE) + wxFLAGS_MEMBER(wxLB_MULTIPLE) + wxFLAGS_MEMBER(wxLB_EXTENDED) + wxFLAGS_MEMBER(wxLB_HSCROLL) + wxFLAGS_MEMBER(wxLB_ALWAYS_SB) + wxFLAGS_MEMBER(wxLB_NEEDED_SB) + wxFLAGS_MEMBER(wxLB_SORT) + wxFLAGS_MEMBER(wxLB_OWNERDRAW) + +wxEND_FLAGS( wxCheckListBoxStyle ) + +IMPLEMENT_DYNAMIC_CLASS_XTI(wxCheckListBox, wxListBox,"wx/checklst.h") + +wxBEGIN_PROPERTIES_TABLE(wxCheckListBox) + wxEVENT_PROPERTY( Toggle , wxEVT_COMMAND_CHECKLISTBOX_TOGGLED , wxCommandEvent ) + wxPROPERTY_FLAGS( WindowStyle , wxCheckListBoxStyle , long , SetWindowStyleFlag , GetWindowStyleFlag , EMPTY_MACROVALUE , wxLB_OWNERDRAW /*flags*/ , wxT("Helpstring") , wxT("group")) // style +wxEND_PROPERTIES_TABLE() + +wxBEGIN_HANDLERS_TABLE(wxCheckListBox) +wxEND_HANDLERS_TABLE() + +wxCONSTRUCTOR_4( wxCheckListBox , wxWindow* , Parent , wxWindowID , Id , wxPoint , Position , wxSize , Size ) + +#else +IMPLEMENT_DYNAMIC_CLASS(wxCheckListBox, wxListBox) +#endif + +// ---------------------------------------------------------------------------- +// declaration and implementation of wxCheckListBoxItem class +// ---------------------------------------------------------------------------- + +class wxCheckListBoxItem : public wxOwnerDrawn +{ +friend class WXDLLIMPEXP_FWD_CORE wxCheckListBox; +public: + // ctor + wxCheckListBoxItem(wxCheckListBox *pParent, size_t nIndex); + + // drawing functions + virtual bool OnDrawItem(wxDC& dc, const wxRect& rc, wxODAction act, wxODStatus stat); + + // simple accessors and operations + bool IsChecked() const { return m_bChecked; } + + void Check(bool bCheck); + void Toggle() { Check(!IsChecked()); } + + void SendEvent(); + +private: + bool m_bChecked; + wxCheckListBox *m_pParent; + size_t m_nIndex; + + DECLARE_NO_COPY_CLASS(wxCheckListBoxItem) +}; + +wxCheckListBoxItem::wxCheckListBoxItem(wxCheckListBox *pParent, size_t nIndex) + : wxOwnerDrawn(wxEmptyString, true) // checkable +{ + m_bChecked = false; + m_pParent = pParent; + m_nIndex = nIndex; + + // we don't initialize m_nCheckHeight/Width vars because it's + // done in OnMeasure while they are used only in OnDraw and we + // know that there will always be OnMeasure before OnDraw + + // fix appearance for check list boxes: they don't look quite the same as + // menu icons + SetMarginWidth(::GetSystemMetrics(SM_CXMENUCHECK) - + 2*wxSystemSettings::GetMetric(wxSYS_EDGE_X) + 1); + SetBackgroundColour(pParent->GetBackgroundColour()); +} + +bool wxCheckListBoxItem::OnDrawItem(wxDC& dc, const wxRect& rc, + wxODAction act, wxODStatus stat) +{ + // first draw the label + if ( IsChecked() ) + stat = (wxOwnerDrawn::wxODStatus)(stat | wxOwnerDrawn::wxODChecked); + + if ( !wxOwnerDrawn::OnDrawItem(dc, rc, act, stat) ) + return false; + + + // now draw the check mark part + size_t nCheckWidth = GetDefaultMarginWidth(), + nCheckHeight = m_pParent->GetItemHeight(); + + int x = rc.GetX(), + y = rc.GetY(); + + HDC hdc = (HDC)dc.GetHDC(); + + // create pens, brushes &c + COLORREF colBg = ::GetSysColor(COLOR_WINDOW); + AutoHPEN hpenBack(colBg), + hpenGray(RGB(0xc0, 0xc0, 0xc0)); + + SelectInHDC selPen(hdc, (HGDIOBJ)hpenBack); + AutoHBRUSH hbrBack(colBg); + SelectInHDC selBrush(hdc, hbrBack); + + // erase the background: it could have been filled with the selected colour + Rectangle(hdc, x, y, x + nCheckWidth + 1, rc.GetBottom() + 1); + + // shift check mark 1 pixel to the right, looks better like this + x++; + + if ( IsChecked() ) + { + // first create a monochrome bitmap in a memory DC + MemoryHDC hdcMem(hdc); + MonoBitmap hbmpCheck(nCheckWidth, nCheckHeight); + SelectInHDC selBmp(hdcMem, hbmpCheck); + + // then draw a check mark into it + RECT rect = { 0, 0, nCheckWidth, nCheckHeight }; + ::DrawFrameControl(hdcMem, &rect, +#ifdef __WXWINCE__ + DFC_BUTTON, DFCS_BUTTONCHECK +#else + DFC_MENU, DFCS_MENUCHECK +#endif + ); + + // finally copy it to screen DC + ::BitBlt(hdc, x, y, nCheckWidth, nCheckHeight, hdcMem, 0, 0, SRCCOPY); + } + + // now we draw the smaller rectangle + y++; + nCheckWidth -= 2; + nCheckHeight -= 2; + + // draw hollow gray rectangle + (void)::SelectObject(hdc, (HGDIOBJ)hpenGray); + + SelectInHDC selBrush2(hdc, ::GetStockObject(NULL_BRUSH)); + Rectangle(hdc, x, y, x + nCheckWidth, y + nCheckHeight); + + return true; +} + +// change the state of the item and redraw it +void wxCheckListBoxItem::Check(bool check) +{ + m_bChecked = check; + + // index may be changed because new items were added/deleted + if ( m_pParent->GetItemIndex(this) != (int)m_nIndex ) + { + // update it + int index = m_pParent->GetItemIndex(this); + + wxASSERT_MSG( index != wxNOT_FOUND, wxT("what does this item do here?") ); + + m_nIndex = (size_t)index; + } + + HWND hwndListbox = (HWND)m_pParent->GetHWND(); + + RECT rcUpdate; + + if ( ::SendMessage(hwndListbox, LB_GETITEMRECT, + m_nIndex, (LPARAM)&rcUpdate) == LB_ERR ) + { + wxLogDebug(wxT("LB_GETITEMRECT failed")); + } + + ::InvalidateRect(hwndListbox, &rcUpdate, FALSE); +} + +// send an "item checked" event +void wxCheckListBoxItem::SendEvent() +{ + wxCommandEvent event(wxEVT_COMMAND_CHECKLISTBOX_TOGGLED, m_pParent->GetId()); + event.SetInt(m_nIndex); + event.SetEventObject(m_pParent); + m_pParent->ProcessCommand(event); +} + +// ---------------------------------------------------------------------------- +// implementation of wxCheckListBox class +// ---------------------------------------------------------------------------- + +// define event table +// ------------------ +BEGIN_EVENT_TABLE(wxCheckListBox, wxListBox) + EVT_KEY_DOWN(wxCheckListBox::OnKeyDown) + EVT_LEFT_DOWN(wxCheckListBox::OnLeftClick) +END_EVENT_TABLE() + +// control creation +// ---------------- + +// def ctor: use Create() to really create the control +wxCheckListBox::wxCheckListBox() +{ +} + +// ctor which creates the associated control +wxCheckListBox::wxCheckListBox(wxWindow *parent, wxWindowID id, + const wxPoint& pos, const wxSize& size, + int nStrings, const wxString choices[], + long style, const wxValidator& val, + const wxString& name) +{ + Create(parent, id, pos, size, nStrings, choices, style, val, name); +} + +wxCheckListBox::wxCheckListBox(wxWindow *parent, wxWindowID id, + const wxPoint& pos, const wxSize& size, + const wxArrayString& choices, + long style, const wxValidator& val, + const wxString& name) +{ + Create(parent, id, pos, size, choices, style, val, name); +} + +bool wxCheckListBox::Create(wxWindow *parent, wxWindowID id, + const wxPoint& pos, const wxSize& size, + int n, const wxString choices[], + long style, + const wxValidator& validator, const wxString& name) +{ + return wxListBox::Create(parent, id, pos, size, n, choices, + style | wxLB_OWNERDRAW, validator, name); +} + +bool wxCheckListBox::Create(wxWindow *parent, wxWindowID id, + const wxPoint& pos, const wxSize& size, + const wxArrayString& choices, + long style, + const wxValidator& validator, const wxString& name) +{ + return wxListBox::Create(parent, id, pos, size, choices, + style | wxLB_OWNERDRAW, validator, name); +} + +// misc overloaded methods +// ----------------------- + +void wxCheckListBox::Delete(unsigned int n) +{ + wxCHECK_RET( IsValid(n), + wxT("invalid index in wxListBox::Delete") ); + + wxListBox::Delete(n); + + // free memory + delete m_aItems[n]; + + m_aItems.RemoveAt(n); +} + +bool wxCheckListBox::SetFont( const wxFont &font ) +{ + unsigned int i; + for ( i = 0; i < m_aItems.GetCount(); i++ ) + m_aItems[i]->SetFont(font); + + wxListBox::SetFont(font); + + return true; +} + +// create/retrieve item +// -------------------- + +// create a check list box item +wxOwnerDrawn *wxCheckListBox::CreateLboxItem(size_t nIndex) +{ + wxCheckListBoxItem *pItem = new wxCheckListBoxItem(this, nIndex); + return pItem; +} + +// return item size +// ---------------- +bool wxCheckListBox::MSWOnMeasure(WXMEASUREITEMSTRUCT *item) +{ + if ( wxListBox::MSWOnMeasure(item) ) { + MEASUREITEMSTRUCT *pStruct = (MEASUREITEMSTRUCT *)item; + + // save item height + m_nItemHeight = pStruct->itemHeight; + + // add place for the check mark + pStruct->itemWidth += wxOwnerDrawn::GetDefaultMarginWidth(); + + return true; + } + + return false; +} + +// check items +// ----------- + +bool wxCheckListBox::IsChecked(unsigned int uiIndex) const +{ + wxCHECK_MSG( IsValid(uiIndex), false, _T("bad wxCheckListBox index") ); + + return GetItem(uiIndex)->IsChecked(); +} + +void wxCheckListBox::Check(unsigned int uiIndex, bool bCheck) +{ + wxCHECK_RET( IsValid(uiIndex), _T("bad wxCheckListBox index") ); + + GetItem(uiIndex)->Check(bCheck); +} + +// process events +// -------------- + +void wxCheckListBox::OnKeyDown(wxKeyEvent& event) +{ + // what do we do? + enum + { + None, + Toggle, + Set, + Clear + } oper; + + switch ( event.GetKeyCode() ) + { + case WXK_SPACE: + oper = Toggle; + break; + + case WXK_NUMPAD_ADD: + case '+': + oper = Set; + break; + + case WXK_NUMPAD_SUBTRACT: + case '-': + oper = Clear; + break; + + default: + oper = None; + } + + if ( oper != None ) + { + wxArrayInt selections; + int count = 0; + if ( HasMultipleSelection() ) + { + count = GetSelections(selections); + } + else + { + int sel = GetSelection(); + if (sel != -1) + { + count = 1; + selections.Add(sel); + } + } + + for ( int i = 0; i < count; i++ ) + { + wxCheckListBoxItem *item = GetItem(selections[i]); + if ( !item ) + { + wxFAIL_MSG( _T("no wxCheckListBoxItem?") ); + continue; + } + + switch ( oper ) + { + case Toggle: + item->Toggle(); + break; + + case Set: + case Clear: + item->Check( oper == Set ); + break; + + default: + wxFAIL_MSG( _T("what should this key do?") ); + } + + // we should send an event as this has been done by the user and + // not by the program + item->SendEvent(); + } + } + else // nothing to do + { + event.Skip(); + } +} + +void wxCheckListBox::OnLeftClick(wxMouseEvent& event) +{ + // clicking on the item selects it, clicking on the checkmark toggles + if ( event.GetX() <= wxOwnerDrawn::GetDefaultMarginWidth() ) + { + int nItem = HitTest(event.GetX(), event.GetY()); + + if ( nItem != wxNOT_FOUND ) + { + wxCheckListBoxItem *item = GetItem(nItem); + item->Toggle(); + item->SendEvent(); + } + //else: it's not an error, just click outside of client zone + } + else + { + // implement default behaviour: clicking on the item selects it + event.Skip(); + } +} + +int wxCheckListBox::DoHitTestItem(wxCoord x, wxCoord y) const +{ + int nItem = (int)::SendMessage + ( + (HWND)GetHWND(), + LB_ITEMFROMPOINT, + 0, + MAKELPARAM(x, y) + ); + + return nItem >= (int)m_noItems ? wxNOT_FOUND : nItem; +} + + +wxSize wxCheckListBox::DoGetBestSize() const +{ + wxSize best = wxListBox::DoGetBestSize(); + best.x += wxOwnerDrawn::GetDefaultMarginWidth(); // add room for the checkbox + CacheBestSize(best); + return best; +} + +#endif diff --git a/Externals/wxWidgets/src/msw/choice.cpp b/Externals/wxWidgets/src/msw/choice.cpp new file mode 100644 index 0000000000..d981d8ebc2 --- /dev/null +++ b/Externals/wxWidgets/src/msw/choice.cpp @@ -0,0 +1,787 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/msw/choice.cpp +// Purpose: wxChoice +// Author: Julian Smart +// Modified by: Vadim Zeitlin to derive from wxChoiceBase +// Created: 04/01/98 +// RCS-ID: $Id: choice.cpp 45011 2007-03-22 02:46:21Z VZ $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_CHOICE && !(defined(__SMARTPHONE__) && defined(__WXWINCE__)) + +#include "wx/choice.h" + +#ifndef WX_PRECOMP + #include "wx/utils.h" + #include "wx/log.h" + #include "wx/brush.h" + #include "wx/settings.h" +#endif + +#include "wx/msw/private.h" + +#if wxUSE_EXTENDED_RTTI +WX_DEFINE_FLAGS( wxChoiceStyle ) + +wxBEGIN_FLAGS( wxChoiceStyle ) + // new style border flags, we put them first to + // use them for streaming out + wxFLAGS_MEMBER(wxBORDER_SIMPLE) + wxFLAGS_MEMBER(wxBORDER_SUNKEN) + wxFLAGS_MEMBER(wxBORDER_DOUBLE) + wxFLAGS_MEMBER(wxBORDER_RAISED) + wxFLAGS_MEMBER(wxBORDER_STATIC) + wxFLAGS_MEMBER(wxBORDER_NONE) + + // old style border flags + wxFLAGS_MEMBER(wxSIMPLE_BORDER) + wxFLAGS_MEMBER(wxSUNKEN_BORDER) + wxFLAGS_MEMBER(wxDOUBLE_BORDER) + wxFLAGS_MEMBER(wxRAISED_BORDER) + wxFLAGS_MEMBER(wxSTATIC_BORDER) + wxFLAGS_MEMBER(wxBORDER) + + // standard window styles + wxFLAGS_MEMBER(wxTAB_TRAVERSAL) + wxFLAGS_MEMBER(wxCLIP_CHILDREN) + wxFLAGS_MEMBER(wxTRANSPARENT_WINDOW) + wxFLAGS_MEMBER(wxWANTS_CHARS) + wxFLAGS_MEMBER(wxFULL_REPAINT_ON_RESIZE) + wxFLAGS_MEMBER(wxALWAYS_SHOW_SB ) + wxFLAGS_MEMBER(wxVSCROLL) + wxFLAGS_MEMBER(wxHSCROLL) + +wxEND_FLAGS( wxChoiceStyle ) + +IMPLEMENT_DYNAMIC_CLASS_XTI(wxChoice, wxControl,"wx/choice.h") + +wxBEGIN_PROPERTIES_TABLE(wxChoice) + wxEVENT_PROPERTY( Select , wxEVT_COMMAND_CHOICE_SELECTED , wxCommandEvent ) + + wxPROPERTY( Font , wxFont , SetFont , GetFont , EMPTY_MACROVALUE , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) + wxPROPERTY_COLLECTION( Choices , wxArrayString , wxString , AppendString , GetStrings , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) + wxPROPERTY( Selection ,int, SetSelection, GetSelection, EMPTY_MACROVALUE , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) + wxPROPERTY_FLAGS( WindowStyle , wxChoiceStyle , long , SetWindowStyleFlag , GetWindowStyleFlag , EMPTY_MACROVALUE , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) // style +wxEND_PROPERTIES_TABLE() + +wxBEGIN_HANDLERS_TABLE(wxChoice) +wxEND_HANDLERS_TABLE() + +wxCONSTRUCTOR_4( wxChoice , wxWindow* , Parent , wxWindowID , Id , wxPoint , Position , wxSize , Size ) +#else +IMPLEMENT_DYNAMIC_CLASS(wxChoice, wxControl) +#endif +/* + TODO PROPERTIES + selection (long) + content (list) + item +*/ + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// creation +// ---------------------------------------------------------------------------- + +bool wxChoice::Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + int n, const wxString choices[], + long style, + const wxValidator& validator, + const wxString& name) +{ + // Experience shows that wxChoice vs. wxComboBox distinction confuses + // quite a few people - try to help them + wxASSERT_MSG( !(style & wxCB_DROPDOWN) && + !(style & wxCB_READONLY) && + !(style & wxCB_SIMPLE), + _T("this style flag is ignored by wxChoice, you ") + _T("probably want to use a wxComboBox") ); + + return CreateAndInit(parent, id, pos, size, n, choices, style, + validator, name); +} + +bool wxChoice::CreateAndInit(wxWindow *parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + int n, const wxString choices[], + long style, + const wxValidator& validator, + const wxString& name) +{ + // initialize wxControl + if ( !CreateControl(parent, id, pos, size, style, validator, name) ) + return false; + + // now create the real HWND + if ( !MSWCreateControl(wxT("COMBOBOX"), wxEmptyString, pos, size) ) + return false; + + + // choice/combobox normally has "white" (depends on colour scheme, of + // course) background rather than inheriting the parent's background + SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW)); + + // initialize the controls contents + for ( int i = 0; i < n; i++ ) + { + Append(choices[i]); + } + + // and now we may finally size the control properly (if needed) + SetInitialSize(size); + + return true; +} + +bool wxChoice::Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + const wxArrayString& choices, + long style, + const wxValidator& validator, + const wxString& name) +{ + wxCArrayString chs(choices); + return Create(parent, id, pos, size, chs.GetCount(), chs.GetStrings(), + style, validator, name); +} + +bool wxChoice::MSWShouldPreProcessMessage(WXMSG *pMsg) +{ + MSG *msg = (MSG *) pMsg; + + // if the dropdown list is visible, don't preprocess certain keys + if ( msg->message == WM_KEYDOWN + && (msg->wParam == VK_ESCAPE || msg->wParam == VK_RETURN) ) + { + if (::SendMessage(GetHwndOf(this), CB_GETDROPPEDSTATE, 0, 0)) + { + return false; + } + } + + return wxControl::MSWShouldPreProcessMessage(pMsg); +} + +WXDWORD wxChoice::MSWGetStyle(long style, WXDWORD *exstyle) const +{ + // we never have an external border + WXDWORD msStyle = wxControl::MSWGetStyle + ( + (style & ~wxBORDER_MASK) | wxBORDER_NONE, exstyle + ); + + // WS_CLIPSIBLINGS is useful with wxChoice and doesn't seem to result in + // any problems + msStyle |= WS_CLIPSIBLINGS; + + // wxChoice-specific styles + msStyle |= CBS_DROPDOWNLIST | WS_HSCROLL | WS_VSCROLL; + if ( style & wxCB_SORT ) + msStyle |= CBS_SORT; + + return msStyle; +} + +wxChoice::~wxChoice() +{ + Free(); +} + +// ---------------------------------------------------------------------------- +// adding/deleting items to/from the list +// ---------------------------------------------------------------------------- + +int wxChoice::DoAppend(const wxString& item) +{ + int n = (int)SendMessage(GetHwnd(), CB_ADDSTRING, 0, (LPARAM)item.c_str()); + if ( n == CB_ERR ) + { + wxLogLastError(wxT("SendMessage(CB_ADDSTRING)")); + } + else // ok + { + // we need to refresh our size in order to have enough space for the + // newly added items + if ( !IsFrozen() ) + UpdateVisibleHeight(); + } + + InvalidateBestSize(); + return n; +} + +int wxChoice::DoInsert(const wxString& item, unsigned int pos) +{ + wxCHECK_MSG(!(GetWindowStyle() & wxCB_SORT), -1, wxT("can't insert into sorted list")); + wxCHECK_MSG(IsValidInsert(pos), -1, wxT("invalid index")); + + int n = (int)SendMessage(GetHwnd(), CB_INSERTSTRING, pos, (LPARAM)item.c_str()); + if ( n == CB_ERR ) + { + wxLogLastError(wxT("SendMessage(CB_INSERTSTRING)")); + } + else // ok + { + if ( !IsFrozen() ) + UpdateVisibleHeight(); + } + + InvalidateBestSize(); + return n; +} + +void wxChoice::Delete(unsigned int n) +{ + wxCHECK_RET( IsValid(n), wxT("invalid item index in wxChoice::Delete") ); + + if ( HasClientObjectData() ) + { + delete GetClientObject(n); + } + + SendMessage(GetHwnd(), CB_DELETESTRING, n, 0); + + if ( !IsFrozen() ) + UpdateVisibleHeight(); + + InvalidateBestSize(); +} + +void wxChoice::Clear() +{ + Free(); + + SendMessage(GetHwnd(), CB_RESETCONTENT, 0, 0); + + if ( !IsFrozen() ) + UpdateVisibleHeight(); + + InvalidateBestSize(); +} + +void wxChoice::Free() +{ + if ( HasClientObjectData() ) + { + unsigned int count = GetCount(); + for ( unsigned int n = 0; n < count; n++ ) + { + delete GetClientObject(n); + } + } +} + +// ---------------------------------------------------------------------------- +// selection +// ---------------------------------------------------------------------------- + +int wxChoice::GetSelection() const +{ + // if m_lastAcceptedSelection is set, it means that the dropdown is + // currently shown and that we want to use the last "permanent" selection + // instead of whatever is under the mouse pointer currently + // + // otherwise, get the selection from the control + return m_lastAcceptedSelection == wxID_NONE ? GetCurrentSelection() + : m_lastAcceptedSelection; +} + +int wxChoice::GetCurrentSelection() const +{ + return (int)SendMessage(GetHwnd(), CB_GETCURSEL, 0, 0); +} + +void wxChoice::SetSelection(int n) +{ + SendMessage(GetHwnd(), CB_SETCURSEL, n, 0); +} + +// ---------------------------------------------------------------------------- +// string list functions +// ---------------------------------------------------------------------------- + +unsigned int wxChoice::GetCount() const +{ + return (unsigned int)SendMessage(GetHwnd(), CB_GETCOUNT, 0, 0); +} + +int wxChoice::FindString(const wxString& s, bool bCase) const +{ +#if defined(__WATCOMC__) && defined(__WIN386__) + // For some reason, Watcom in WIN386 mode crashes in the CB_FINDSTRINGEXACT message. + // wxChoice::Do it the long way instead. + unsigned int count = GetCount(); + for ( unsigned int i = 0; i < count; i++ ) + { + // as CB_FINDSTRINGEXACT is case insensitive, be case insensitive too + if (GetString(i).IsSameAs(s, bCase)) + return i; + } + + return wxNOT_FOUND; +#else // !Watcom + //TODO: Evidently some MSW versions (all?) don't like empty strings + //passed to SendMessage, so we have to do it ourselves in that case + if ( s.empty() ) + { + unsigned int count = GetCount(); + for ( unsigned int i = 0; i < count; i++ ) + { + if (GetString(i).empty()) + return i; + } + + return wxNOT_FOUND; + } + else if (bCase) + { + // back to base class search for not native search type + return wxItemContainerImmutable::FindString( s, bCase ); + } + else + { + int pos = (int)SendMessage(GetHwnd(), CB_FINDSTRINGEXACT, + (WPARAM)-1, (LPARAM)s.c_str()); + + return pos == LB_ERR ? wxNOT_FOUND : pos; + } +#endif // Watcom/!Watcom +} + +void wxChoice::SetString(unsigned int n, const wxString& s) +{ + wxCHECK_RET( IsValid(n), wxT("invalid item index in wxChoice::SetString") ); + + // we have to delete and add back the string as there is no way to change a + // string in place + + // we need to preserve the client data + void *data; + if ( m_clientDataItemsType != wxClientData_None ) + { + data = DoGetItemClientData(n); + } + else // no client data + { + data = NULL; + } + + ::SendMessage(GetHwnd(), CB_DELETESTRING, n, 0); + ::SendMessage(GetHwnd(), CB_INSERTSTRING, n, (LPARAM)s.c_str() ); + + if ( data ) + { + DoSetItemClientData(n, data); + } + //else: it's already NULL by default + + InvalidateBestSize(); +} + +wxString wxChoice::GetString(unsigned int n) const +{ + int len = (int)::SendMessage(GetHwnd(), CB_GETLBTEXTLEN, n, 0); + + wxString str; + if ( len != CB_ERR && len > 0 ) + { + if ( ::SendMessage + ( + GetHwnd(), + CB_GETLBTEXT, + n, + (LPARAM)(wxChar *)wxStringBuffer(str, len) + ) == CB_ERR ) + { + wxLogLastError(wxT("SendMessage(CB_GETLBTEXT)")); + } + } + + return str; +} + +// ---------------------------------------------------------------------------- +// client data +// ---------------------------------------------------------------------------- + +void wxChoice::DoSetItemClientData(unsigned int n, void* clientData) +{ + if ( ::SendMessage(GetHwnd(), CB_SETITEMDATA, + n, (LPARAM)clientData) == CB_ERR ) + { + wxLogLastError(wxT("CB_SETITEMDATA")); + } +} + +void* wxChoice::DoGetItemClientData(unsigned int n) const +{ + LPARAM rc = SendMessage(GetHwnd(), CB_GETITEMDATA, n, 0); + if ( rc == CB_ERR ) + { + wxLogLastError(wxT("CB_GETITEMDATA")); + + // unfortunately, there is no way to return an error code to the user + rc = (LPARAM) NULL; + } + + return (void *)rc; +} + +void wxChoice::DoSetItemClientObject(unsigned int n, wxClientData* clientData) +{ + DoSetItemClientData(n, clientData); +} + +wxClientData* wxChoice::DoGetItemClientObject(unsigned int n) const +{ + return (wxClientData *)DoGetItemClientData(n); +} + +// ---------------------------------------------------------------------------- +// wxMSW specific helpers +// ---------------------------------------------------------------------------- + +void wxChoice::UpdateVisibleHeight() +{ + // be careful to not change the width here + DoSetSize(wxDefaultCoord, wxDefaultCoord, wxDefaultCoord, GetSize().y, wxSIZE_USE_EXISTING); +} + +void wxChoice::DoMoveWindow(int x, int y, int width, int height) +{ + // here is why this is necessary: if the width is negative, the combobox + // window proc makes the window of the size width*height instead of + // interpreting height in the usual manner (meaning the height of the drop + // down list - usually the height specified in the call to MoveWindow() + // will not change the height of combo box per se) + // + // this behaviour is not documented anywhere, but this is just how it is + // here (NT 4.4) and, anyhow, the check shouldn't hurt - however without + // the check, constraints/sizers using combos may break the height + // constraint will have not at all the same value as expected + if ( width < 0 ) + return; + + wxControl::DoMoveWindow(x, y, width, height); +} + +void wxChoice::DoGetSize(int *w, int *h) const +{ + // this is weird: sometimes, the height returned by Windows is clearly the + // total height of the control including the drop down list -- but only + // sometimes, and normally it isn't... I have no idea about what to do with + // this + wxControl::DoGetSize(w, h); +} + +void wxChoice::DoSetSize(int x, int y, + int width, int height, + int sizeFlags) +{ + int heightOrig = height; + + // the height which we must pass to Windows should be the total height of + // the control including the drop down list while the height given to us + // is, of course, just the height of the permanently visible part of it + if ( height != wxDefaultCoord ) + { + // don't make the drop down list too tall, arbitrarily limit it to 40 + // items max and also don't leave it empty + size_t nItems = GetCount(); + if ( !nItems ) + nItems = 9; + else if ( nItems > 24 ) + nItems = 24; + + // add space for the drop down list + const int hItem = SendMessage(GetHwnd(), CB_GETITEMHEIGHT, 0, 0); + height += hItem*(nItems + 1); + } + else + { + // We cannot pass wxDefaultCoord as height to wxControl. wxControl uses + // wxGetWindowRect() to determine the current height of the combobox, + // and then again sets the combobox's height to that value. Unfortunately, + // wxGetWindowRect doesn't include the dropdown list's height (at least + // on Win2K), so this would result in a combobox with dropdown height of + // 1 pixel. We have to determine the default height ourselves and call + // wxControl with that value instead. + int w, h; + RECT r; + DoGetSize(&w, &h); + if (::SendMessage(GetHwnd(), CB_GETDROPPEDCONTROLRECT, 0, (LPARAM) &r) != 0) + { + height = h + r.bottom - r.top; + } + } + + wxControl::DoSetSize(x, y, width, height, sizeFlags); + + // If we're storing a pending size, make sure we store + // the original size for reporting back to the app. + if (m_pendingSize != wxDefaultSize) + m_pendingSize = wxSize(width, heightOrig); + + // This solution works on XP, but causes choice/combobox lists to be + // too short on W2K and earlier. +#if 0 + int widthCurrent, heightCurrent; + DoGetSize(&widthCurrent, &heightCurrent); + + // the height which we must pass to Windows should be the total height of + // the control including the drop down list while the height given to us + // is, of course, just the height of the permanently visible part of it + if ( height != wxDefaultCoord && height != heightCurrent ) + { + // don't make the drop down list too tall, arbitrarily limit it to 40 + // items max and also don't leave it empty + unsigned int nItems = GetCount(); + if ( !nItems ) + nItems = 9; + else if ( nItems > 24 ) + nItems = 24; + + // add space for the drop down list + const int hItem = SendMessage(GetHwnd(), CB_GETITEMHEIGHT, 0, 0); + height += hItem*(nItems + 1); + } + else // keep the same height as now + { + // normally wxWindow::DoSetSize() checks if we set the same size as the + // window already has and does nothing in this case, but for us the + // check fails as the size we pass to it includes the dropdown while + // the size returned by our GetSize() does not, so test if the size + // didn't really change ourselves here + if ( width == wxDefaultCoord || width == widthCurrent ) + { + // size doesn't change, what about position? + int xCurrent, yCurrent; + DoGetPosition(&xCurrent, &yCurrent); + const bool defMeansUnchanged = !(sizeFlags & wxSIZE_ALLOW_MINUS_ONE); + if ( ((x == wxDefaultCoord && defMeansUnchanged) || x == xCurrent) + && + ((y == wxDefaultCoord && defMeansUnchanged) || y == yCurrent) ) + { + // nothing changes, nothing to do + return; + } + } + + // We cannot pass wxDefaultCoord as height to wxControl. wxControl uses + // wxGetWindowRect() to determine the current height of the combobox, + // and then again sets the combobox's height to that value. Unfortunately, + // wxGetWindowRect doesn't include the dropdown list's height (at least + // on Win2K), so this would result in a combobox with dropdown height of + // 1 pixel. We have to determine the default height ourselves and call + // wxControl with that value instead. + // + // Also notice that sometimes CB_GETDROPPEDCONTROLRECT seems to return + // wildly incorrect values (~32000) which looks like a bug in it, just + // ignore them in this case + RECT r; + if ( ::SendMessage(GetHwnd(), CB_GETDROPPEDCONTROLRECT, 0, (LPARAM) &r) + && r.bottom < 30000 ) + { + height = heightCurrent + r.bottom - r.top; + } + } + + wxControl::DoSetSize(x, y, width, height, sizeFlags); +#endif +} + +wxSize wxChoice::DoGetBestSize() const +{ + // find the widest string + int wChoice = 0; + const unsigned int nItems = GetCount(); + for ( unsigned int i = 0; i < nItems; i++ ) + { + int wLine; + GetTextExtent(GetString(i), &wLine, NULL); + if ( wLine > wChoice ) + wChoice = wLine; + } + + // give it some reasonable default value if there are no strings in the + // list + if ( wChoice == 0 ) + wChoice = 100; + + // the combobox should be slightly larger than the widest string + wChoice += 5*GetCharWidth(); + + wxSize best(wChoice, EDIT_HEIGHT_FROM_CHAR_HEIGHT(GetCharHeight())); + CacheBestSize(best); + return best; +} + +WXLRESULT wxChoice::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) +{ + switch ( nMsg ) + { + case WM_LBUTTONUP: + { + int x = (int)LOWORD(lParam); + int y = (int)HIWORD(lParam); + + // Ok, this is truly weird, but if a panel with a wxChoice + // loses the focus, then you get a *fake* WM_LBUTTONUP message + // with x = 65535 and y = 65535. Filter out this nonsense. + // + // VZ: I'd like to know how to reproduce this please... + if ( x == 65535 && y == 65535 ) + return 0; + } + break; + + // we have to handle both: one for the normal case and the other + // for readonly + case WM_CTLCOLOREDIT: + case WM_CTLCOLORLISTBOX: + case WM_CTLCOLORSTATIC: + { + WXHDC hdc; + WXHWND hwnd; + UnpackCtlColor(wParam, lParam, &hdc, &hwnd); + + WXHBRUSH hbr = MSWControlColor((WXHDC)hdc, hwnd); + if ( hbr ) + return (WXLRESULT)hbr; + //else: fall through to default window proc + } + } + + return wxWindow::MSWWindowProc(nMsg, wParam, lParam); +} + +bool wxChoice::MSWCommand(WXUINT param, WXWORD WXUNUSED(id)) +{ + /* + The native control provides a great variety in the events it sends in + the different selection scenarios (undoubtedly for greater amusement of + the programmers using it). For the reference, here are the cases when + the final selection is accepted (things are quite interesting when it + is cancelled too): + + A. Selecting with just the arrows without opening the dropdown: + 1. CBN_SELENDOK + 2. CBN_SELCHANGE + + B. Opening dropdown with F4 and selecting with arrows: + 1. CBN_DROPDOWN + 2. many CBN_SELCHANGE while changing selection in the list + 3. CBN_SELENDOK + 4. CBN_CLOSEUP + + C. Selecting with the mouse: + 1. CBN_DROPDOWN + -- no intermediate CBN_SELCHANGEs -- + 2. CBN_SELENDOK + 3. CBN_CLOSEUP + 4. CBN_SELCHANGE + + Admire the different order of messages in all of those cases, it must + surely have taken a lot of effort to Microsoft developers to achieve + such originality. + */ + switch ( param ) + { + case CBN_DROPDOWN: + // we use this value both because we don't want to track selection + // using CB_GETCURSEL while the dropdown is opened and because we + // need to reset the selection back to it if it's eventually + // cancelled by user + m_lastAcceptedSelection = GetCurrentSelection(); + if ( m_lastAcceptedSelection == -1 ) + { + // no current selection so no need to restore it later (this + // happens when opening a combobox containing text not from its + // list of items and we shouldn't erase this text) + m_lastAcceptedSelection = wxID_NONE; + } + break; + + case CBN_CLOSEUP: + // if the selection was accepted by the user, it should have been + // reset to wxID_NONE by CBN_SELENDOK, otherwise the selection was + // cancelled and we must restore the old one + if ( m_lastAcceptedSelection != wxID_NONE ) + { + SetSelection(m_lastAcceptedSelection); + m_lastAcceptedSelection = wxID_NONE; + } + break; + + case CBN_SELENDOK: + // reset it to prevent CBN_CLOSEUP from undoing the selection (it's + // ok to reset it now as GetCurrentSelection() will now return the + // same thing anyhow) + m_lastAcceptedSelection = wxID_NONE; + + { + const int n = GetSelection(); + + wxCommandEvent event(wxEVT_COMMAND_CHOICE_SELECTED, m_windowId); + event.SetInt(n); + event.SetEventObject(this); + + if ( n > -1 ) + { + event.SetString(GetStringSelection()); + InitCommandEventWithItems(event, n); + } + + ProcessCommand(event); + } + break; + + // don't handle CBN_SELENDCANCEL: just leave m_lastAcceptedSelection + // valid and the selection will be undone in CBN_CLOSEUP above + + // don't handle CBN_SELCHANGE neither, we don't want to generate events + // while the dropdown is opened -- but do add it if we ever need this + + default: + return false; + } + + return true; +} + +WXHBRUSH wxChoice::MSWControlColor(WXHDC hDC, WXHWND hWnd) +{ + if ( !IsEnabled() ) + return MSWControlColorDisabled(hDC); + + return wxChoiceBase::MSWControlColor(hDC, hWnd); +} + +#endif // wxUSE_CHOICE && !(__SMARTPHONE__ && __WXWINCE__) diff --git a/Externals/wxWidgets/src/msw/clipbrd.cpp b/Externals/wxWidgets/src/msw/clipbrd.cpp new file mode 100644 index 0000000000..8091f2dd6d --- /dev/null +++ b/Externals/wxWidgets/src/msw/clipbrd.cpp @@ -0,0 +1,931 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/msw/clipbrd.cpp +// Purpose: Clipboard functionality +// Author: Julian Smart +// Modified by: +// Created: 04/01/98 +// RCS-ID: $Id: clipbrd.cpp 43884 2006-12-09 19:49:40Z PC $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// =========================================================================== +// declarations +// =========================================================================== + +// --------------------------------------------------------------------------- +// headers +// --------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_CLIPBOARD + +#include "wx/clipbrd.h" + +#ifndef WX_PRECOMP + #include "wx/object.h" + #include "wx/event.h" + #include "wx/app.h" + #include "wx/frame.h" + #include "wx/bitmap.h" + #include "wx/utils.h" + #include "wx/intl.h" + #include "wx/log.h" + #include "wx/dataobj.h" +#endif + +#if wxUSE_METAFILE + #include "wx/metafile.h" +#endif + + +#include + +#include "wx/msw/private.h" +#include "wx/msw/ole/oleutils.h" + +#if wxUSE_WXDIB + #include "wx/msw/dib.h" +#endif + +// wxDataObject is tied to OLE/drag and drop implementation, therefore so are +// the functions using wxDataObject in wxClipboard +//#define wxUSE_DATAOBJ wxUSE_DRAG_AND_DROP + +#if wxUSE_OLE && !defined(__WXWINCE__) + // use OLE clipboard + #define wxUSE_OLE_CLIPBOARD 1 +#else // !wxUSE_DATAOBJ + // use Win clipboard API + #define wxUSE_OLE_CLIPBOARD 0 +#endif + +#if wxUSE_OLE_CLIPBOARD + #include +#endif // wxUSE_OLE_CLIPBOARD + +// =========================================================================== +// implementation +// =========================================================================== + +// --------------------------------------------------------------------------- +// old-style clipboard functions using Windows API +// --------------------------------------------------------------------------- + +static bool gs_wxClipboardIsOpen = false; + +bool wxOpenClipboard() +{ + wxCHECK_MSG( !gs_wxClipboardIsOpen, true, wxT("clipboard already opened.") ); + + wxWindow *win = wxTheApp->GetTopWindow(); + if ( win ) + { + gs_wxClipboardIsOpen = ::OpenClipboard((HWND)win->GetHWND()) != 0; + + if ( !gs_wxClipboardIsOpen ) + wxLogSysError(_("Failed to open the clipboard.")); + + return gs_wxClipboardIsOpen; + } + else + { + wxLogDebug(wxT("Can not open clipboard without a main window.")); + + return false; + } +} + +bool wxCloseClipboard() +{ + wxCHECK_MSG( gs_wxClipboardIsOpen, false, wxT("clipboard is not opened") ); + + gs_wxClipboardIsOpen = false; + + if ( ::CloseClipboard() == 0 ) + { + wxLogSysError(_("Failed to close the clipboard.")); + + return false; + } + + return true; +} + +bool wxEmptyClipboard() +{ + if ( ::EmptyClipboard() == 0 ) + { + wxLogSysError(_("Failed to empty the clipboard.")); + + return false; + } + + return true; +} + +bool wxIsClipboardOpened() +{ + return gs_wxClipboardIsOpen; +} + +bool wxIsClipboardFormatAvailable(wxDataFormat dataFormat) +{ + wxDataFormat::NativeFormat cf = dataFormat.GetFormatId(); + + if ( ::IsClipboardFormatAvailable(cf) ) + { + // ok from the first try + return true; + } + + // for several standard formats, we can convert from some other ones too + switch ( cf ) + { + // for bitmaps, DIBs will also do + case CF_BITMAP: + return ::IsClipboardFormatAvailable(CF_DIB) != 0; + +#if wxUSE_ENH_METAFILE && !defined(__WXWINCE__) + case CF_METAFILEPICT: + return ::IsClipboardFormatAvailable(CF_ENHMETAFILE) != 0; +#endif // wxUSE_ENH_METAFILE + + default: + return false; + } +} + + +bool wxSetClipboardData(wxDataFormat dataFormat, + const void *data, + int width, int height) +{ + HANDLE handle = 0; // return value of SetClipboardData + + switch (dataFormat) + { + case wxDF_BITMAP: + { + wxBitmap *bitmap = (wxBitmap *)data; + + HDC hdcMem = CreateCompatibleDC((HDC) NULL); + HDC hdcSrc = CreateCompatibleDC((HDC) NULL); + HBITMAP old = (HBITMAP) + ::SelectObject(hdcSrc, (HBITMAP)bitmap->GetHBITMAP()); + HBITMAP hBitmap = CreateCompatibleBitmap(hdcSrc, + bitmap->GetWidth(), + bitmap->GetHeight()); + if (!hBitmap) + { + SelectObject(hdcSrc, old); + DeleteDC(hdcMem); + DeleteDC(hdcSrc); + return false; + } + + HBITMAP old1 = (HBITMAP) SelectObject(hdcMem, hBitmap); + BitBlt(hdcMem, 0, 0, bitmap->GetWidth(), bitmap->GetHeight(), + hdcSrc, 0, 0, SRCCOPY); + + // Select new bitmap out of memory DC + SelectObject(hdcMem, old1); + + // Set the data + handle = ::SetClipboardData(CF_BITMAP, hBitmap); + + // Clean up + SelectObject(hdcSrc, old); + DeleteDC(hdcSrc); + DeleteDC(hdcMem); + break; + } + +#if wxUSE_WXDIB + case wxDF_DIB: + { + wxBitmap *bitmap = (wxBitmap *)data; + + if ( bitmap && bitmap->Ok() ) + { + wxDIB dib(*bitmap); + if ( dib.IsOk() ) + { + handle = ::SetClipboardData(CF_DIB, dib.Detach()); + } + } + break; + } +#endif + + // VZ: I'm told that this code works, but it doesn't seem to work for me + // and, anyhow, I'd be highly surprised if it did. So I leave it here + // but IMNSHO it is completely broken. +#if wxUSE_METAFILE && !defined(wxMETAFILE_IS_ENH) && !defined(__WXWINCE__) + case wxDF_METAFILE: + { + wxMetafile *wxMF = (wxMetafile *)data; + HANDLE data = GlobalAlloc(GHND, sizeof(METAFILEPICT) + 1); + METAFILEPICT *mf = (METAFILEPICT *)GlobalLock(data); + + mf->mm = wxMF->GetWindowsMappingMode(); + mf->xExt = width; + mf->yExt = height; + mf->hMF = (HMETAFILE) wxMF->GetHMETAFILE(); + GlobalUnlock(data); + wxMF->SetHMETAFILE((WXHANDLE) NULL); + + handle = SetClipboardData(CF_METAFILEPICT, data); + break; + } +#endif // wxUSE_METAFILE + +#if wxUSE_ENH_METAFILE && !defined(__WXWINCE__) + case wxDF_ENHMETAFILE: + { + wxEnhMetaFile *emf = (wxEnhMetaFile *)data; + wxEnhMetaFile emfCopy = *emf; + + handle = SetClipboardData(CF_ENHMETAFILE, + (void *)emfCopy.GetHENHMETAFILE()); + } + break; +#endif // wxUSE_ENH_METAFILE + + case CF_SYLK: + case CF_DIF: + case CF_TIFF: + case CF_PALETTE: + default: + { + wxLogError(_("Unsupported clipboard format.")); + return false; + } + + case wxDF_OEMTEXT: + dataFormat = wxDF_TEXT; + // fall through + + case wxDF_TEXT: + { + char *s = (char *)data; + + width = strlen(s) + 1; + height = 1; + DWORD l = (width * height); + HANDLE hGlobalMemory = GlobalAlloc(GHND, l); + if ( hGlobalMemory ) + { + LPSTR lpGlobalMemory = (LPSTR)GlobalLock(hGlobalMemory); + + memcpy(lpGlobalMemory, s, l); + + GlobalUnlock(hGlobalMemory); + } + + handle = SetClipboardData(dataFormat, hGlobalMemory); + break; + } + // Only tested with Visual C++ 6.0 so far +#if defined(__VISUALC__) + case wxDF_HTML: + { + char* html = (char *)data; + + // Create temporary buffer for HTML header... + char *buf = new char [400 + strlen(html)]; + if(!buf) return false; + + // Get clipboard id for HTML format... + static int cfid = 0; + if(!cfid) cfid = RegisterClipboardFormat(wxT("HTML Format")); + + // Create a template string for the HTML header... + strcpy(buf, + "Version:0.9\r\n" + "StartHTML:00000000\r\n" + "EndHTML:00000000\r\n" + "StartFragment:00000000\r\n" + "EndFragment:00000000\r\n" + "\r\n" + "\r\n"); + + // Append the HTML... + strcat(buf, html); + strcat(buf, "\r\n"); + // Finish up the HTML format... + strcat(buf, + "\r\n" + "\r\n" + ""); + + // Now go back, calculate all the lengths, and write out the + // necessary header information. Note, wsprintf() truncates the + // string when you overwrite it so you follow up with code to replace + // the 0 appended at the end with a '\r'... + char *ptr = strstr(buf, "StartHTML"); + sprintf(ptr+10, "%08u", strstr(buf, "") - buf); + *(ptr+10+8) = '\r'; + + ptr = strstr(buf, "EndHTML"); + sprintf(ptr+8, "%08u", strlen(buf)); + *(ptr+8+8) = '\r'; + + ptr = strstr(buf, "StartFragment"); + sprintf(ptr+14, "%08u", strstr(buf, "%s", debugger->getDescription(offs).c_str()); + dc.SetTextForeground(_T("#600060")); + } + else + { + dc.SetTextForeground(_T("#000000")); + } + + dc.DrawText(wxString::FromAscii(dis2), 126, rowY1); + } + + if (strcmp(dis, "blr")) + { + dc.SetTextForeground(_T("#007000")); + } + else + { + dc.SetTextForeground(_T("#8000FF")); + } + + dc.DrawText(wxString::FromAscii(dis), 70, rowY1); + + if (desc[0] == 0) + { + strcpy(desc, debugger->getDescription(address).c_str()); + } + + dc.SetTextForeground(_T("#0000FF")); + + //char temp[256]; + //UnDecorateSymbolName(desc,temp,255,UNDNAME_COMPLETE); + if (strlen(desc)) + { + dc.DrawText(wxString::FromAscii(desc), 235, rowY1); + } + + if (debugger->isBreakpoint(address)) + { + dc.SetBrush(bpBrush); + dc.DrawRectangle(2, rowY1, 7, 7); +// DrawIconEx(hdc, 2, rowY1, breakPoint, 32, 32, 0, 0, DI_NORMAL); + } + } + } + + dc.SetPen(currentPen); + /* + for (i = 0; i < numBranches; i++) + { + int x = 250 + (branches[i].srcAddr % 9) * 8; + MoveToEx(hdc, x-2, branches[i].src, 0); + + if (branches[i].dst < rect.bottom + 200 && branches[i].dst > -200) + { + LineTo(hdc, x+2, branches[i].src); + LineTo(hdc, x+2, branches[i].dst); + LineTo(hdc, x-4, branches[i].dst); + + MoveToEx(hdc, x, branches[i].dst - 4,0); + LineTo(hdc, x-4, branches[i].dst); + LineTo(hdc, x+1, branches[i].dst+5); + } + else + { + LineTo(hdc, x+4, branches[i].src); + //MoveToEx(hdc,x+2,branches[i].dst-4,0); + //LineTo(hdc,x+6,branches[i].dst); + //LineTo(hdc,x+1,branches[i].dst+5); + } + //LineTo(hdc,x,branches[i].dst+4); + + //LineTo(hdc,x-2,branches[i].dst); + }*/ +} + + diff --git a/Source/Core/DebuggerWX/src/CodeView.h b/Source/Core/DebuggerWX/src/CodeView.h new file mode 100644 index 0000000000..506dcb2c99 --- /dev/null +++ b/Source/Core/DebuggerWX/src/CodeView.h @@ -0,0 +1,77 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef CODEVIEW_H_ +#define CODEVIEW_H_ + +#include "Debugger.h" +#include "Common.h" +#include "Debugger/DebugInterface.h" + +#include + +class CCodeView + : public wxControl +{ + public: + + CCodeView(DebugInterface* debuginterface, wxWindow* parent, wxWindowID Id = -1, const wxSize& Size = wxDefaultSize); + wxSize DoGetBestSize() const; + void OnPaint(wxPaintEvent& event); + void OnErase(wxEraseEvent& event); + void OnMouseDown(wxMouseEvent& event); + void OnMouseMove(wxMouseEvent& event); + void OnMouseUpL(wxMouseEvent& event); + void OnMouseUpR(wxMouseEvent& event); + void OnPopupMenu(wxCommandEvent& event); + + + u32 GetSelection() {return(selection);} + + + void Center(u32 addr) + { + curAddress = addr; + redraw(); + } + + + private: + + int YToAddress(int y); + + + void redraw() {Refresh();} + + + DebugInterface* debugger; + + int curAddress; + int align; + int rowHeight; + + u32 selection; + u32 oldSelection; + bool selectionChanged; + bool selecting; + bool hasFocus; + bool showHex; + + DECLARE_EVENT_TABLE() +}; + +#endif /*CODEVIEW_H_*/ diff --git a/Source/Core/DebuggerWX/src/CodeWindow.cpp b/Source/Core/DebuggerWX/src/CodeWindow.cpp new file mode 100644 index 0000000000..54a3a2f4f3 --- /dev/null +++ b/Source/Core/DebuggerWX/src/CodeWindow.cpp @@ -0,0 +1,453 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "Debugger.h" + +#include "RegisterWindow.h" +#include "LogWindow.h" + +#include "wx/button.h" +#include "wx/textctrl.h" +#include "wx/listctrl.h" +#include "wx/thread.h" +#include "wx/listctrl.h" +#include "CodeWindow.h" +#include "HW/CPU.h" +#include "PowerPC/PowerPC.h" +#include "Host.h" + +#include "Debugger/PPCDebugInterface.h" +#include "Debugger/Debugger_SymbolMap.h" + +#include "Core.h" +#include "LogManager.h" + +// ugly that this lib included code from the main +#include "../../DolphinWX/src/globals.h" + +class SymbolList + : public wxListCtrl +{ + wxString OnGetItemText(long item, long column) + { + return(_T("hello")); + } +}; + +enum +{ + IDM_DEBUG_GO = 350, + IDM_STEP, + IDM_STEPOVER, + IDM_SKIP, + IDM_SETPC, + IDM_GOTOPC, + IDM_ADDRBOX, + IDM_CALLSTACKLIST, + IDM_SYMBOLLIST, + IDM_INTERPRETER, + IDM_DUALCORE, + IDM_LOGWINDOW, + IDM_REGISTERWINDOW +}; + +BEGIN_EVENT_TABLE(CCodeWindow, wxFrame) +EVT_BUTTON(IDM_DEBUG_GO, CCodeWindow::OnCodeStep) +EVT_BUTTON(IDM_STEP, CCodeWindow::OnCodeStep) +EVT_BUTTON(IDM_STEPOVER, CCodeWindow::OnCodeStep) +EVT_BUTTON(IDM_SKIP, CCodeWindow::OnCodeStep) +EVT_BUTTON(IDM_SETPC, CCodeWindow::OnCodeStep) +EVT_BUTTON(IDM_GOTOPC, CCodeWindow::OnCodeStep) +EVT_TEXT(IDM_ADDRBOX, CCodeWindow::OnAddrBoxChange) +EVT_LISTBOX(IDM_SYMBOLLIST, CCodeWindow::OnSymolListChange) +EVT_LISTBOX(IDM_CALLSTACKLIST, CCodeWindow::OnCallstackListChange) +EVT_HOST_COMMAND(wxID_ANY, CCodeWindow::OnHostMessage) +EVT_MENU(IDM_LOGWINDOW, CCodeWindow::OnToggleLogWindow) +EVT_MENU(IDM_REGISTERWINDOW, CCodeWindow::OnToggleRegisterWindow) +END_EVENT_TABLE() + + +CCodeWindow::CCodeWindow(const SCoreStartupParameter& _LocalCoreStartupParameter, wxWindow* parent, wxWindowID id, + const wxString& title, const wxPoint& pos, const wxSize& size, long style) + : wxFrame(parent, id, title, pos, size, style) + , m_RegisterWindow(NULL) + , m_logwindow(NULL) +{ + CreateMenu(_LocalCoreStartupParameter); + + wxBoxSizer* sizerBig = new wxBoxSizer(wxHORIZONTAL); + wxBoxSizer* sizerRight = new wxBoxSizer(wxVERTICAL); + wxBoxSizer* sizerLeft = new wxBoxSizer(wxVERTICAL); + + DebugInterface* di = new PPCDebugInterface(); + + sizerLeft->Add(callstack = new wxListBox(this, IDM_CALLSTACKLIST, wxDefaultPosition, wxSize(90, 100)), 0, wxEXPAND); + sizerLeft->Add(symbols = new wxListBox(this, IDM_SYMBOLLIST, wxDefaultPosition, wxSize(90, 100), 0, NULL, wxLB_SORT), 1, wxEXPAND); + codeview = new CCodeView(di, this, wxID_ANY); + sizerBig->Add(sizerLeft, 2, wxEXPAND); + sizerBig->Add(codeview, 5, wxEXPAND); + sizerBig->Add(sizerRight, 0, wxEXPAND | wxALL, 3); + sizerRight->Add(buttonGo = new wxButton(this, IDM_DEBUG_GO, _T("&Go"))); + sizerRight->Add(buttonStep = new wxButton(this, IDM_STEP, _T("&Step"))); + sizerRight->Add(buttonStepOver = new wxButton(this, IDM_STEPOVER, _T("Step &Over"))); + sizerRight->Add(buttonSkip = new wxButton(this, IDM_SKIP, _T("Ski&p"))); + sizerRight->Add(buttonGotoPC = new wxButton(this, IDM_GOTOPC, _T("G&oto PC"))); + sizerRight->Add(addrbox = new wxTextCtrl(this, IDM_ADDRBOX, _T(""))); + sizerRight->Add(new wxButton(this, IDM_SETPC, _T("S&et PC"))); + + SetSizer(sizerBig); + + sizerLeft->SetSizeHints(this); + sizerLeft->Fit(this); + sizerRight->SetSizeHints(this); + sizerRight->Fit(this); + sizerBig->SetSizeHints(this); + sizerBig->Fit(this); + + sync_event.Init(); + + // additional dialogs + if (IsLoggingActivated()) + { + m_logwindow = new CLogWindow(this); + m_logwindow->Show(true); + } + + m_RegisterWindow = new CRegisterWindow(this); + m_RegisterWindow->Show(true); + + + UpdateButtonStates(); +} + + +void CCodeWindow::CreateMenu(const SCoreStartupParameter& _LocalCoreStartupParameter) +{ + wxMenuBar* pMenuBar = new wxMenuBar(wxMB_DOCKABLE); + + { + wxMenu* pDebugMenu = new wxMenu; + wxMenuItem* interpreter = pDebugMenu->Append(IDM_INTERPRETER, _T("&Interpreter"), wxEmptyString, wxITEM_CHECK); + interpreter->Check(!_LocalCoreStartupParameter.bUseDynarec); + + wxMenuItem* dualcore = pDebugMenu->Append(IDM_DUALCORE, _T("&DualCore"), wxEmptyString, wxITEM_CHECK); + dualcore->Check(_LocalCoreStartupParameter.bUseDualCore); + + pMenuBar->Append(pDebugMenu, _T("&Core Startup")); + } + + { + wxMenu* pDebugDialogs = new wxMenu; + + if (IsLoggingActivated()) + { + wxMenuItem* pLogWindow = pDebugDialogs->Append(IDM_LOGWINDOW, _T("&LogManager"), wxEmptyString, wxITEM_CHECK); + pLogWindow->Check(true); + } + + wxMenuItem* pRegister = pDebugDialogs->Append(IDM_REGISTERWINDOW, _T("&Registers"), wxEmptyString, wxITEM_CHECK); + pRegister->Check(true); + + pMenuBar->Append(pDebugDialogs, _T("&Dialogs")); + } + + SetMenuBar(pMenuBar); +} + + +bool CCodeWindow::UseInterpreter() +{ + return(GetMenuBar()->IsChecked(IDM_INTERPRETER)); +} + + +bool CCodeWindow::UseDualCore() +{ + return(GetMenuBar()->IsChecked(IDM_DUALCORE)); +} + + +void CCodeWindow::OnCodeStep(wxCommandEvent& event) +{ + switch (event.GetId()) + { + case IDM_DEBUG_GO: + { + // [F|RES] prolly we should disable the other buttons in go mode too ... + codeview->Center(PC); + + if (CCPU::IsStepping()) + { + CCPU::EnableStepping(false); + } + else + { + CCPU::EnableStepping(true); + Host_UpdateLogDisplay(); + } + + Update(); + } + break; + + case IDM_STEP: + { + CCPU::StepOpcode(&sync_event); +// if (CCPU::IsStepping()) +// sync_event.Wait(); + wxThread::Sleep(20); + // need a short wait here + codeview->Center(PC); + Update(); + Host_UpdateLogDisplay(); + } + break; + + case IDM_STEPOVER: + CCPU::EnableStepping(true); + break; + + case IDM_SKIP: + PC += 4; + Update(); + break; + + case IDM_SETPC: + PC = codeview->GetSelection(); + Update(); + break; + + case IDM_GOTOPC: + codeview->Center(PC); + break; + } + + UpdateButtonStates(); +} + + +void CCodeWindow::OnAddrBoxChange(wxCommandEvent& event) +{ + wxString txt = addrbox->GetValue(); + + if (txt.size() == 8) + { + u32 addr; + sscanf(txt.mb_str(), "%08x", &addr); + codeview->Center(addr); + } + + event.Skip(1); +} + + +void CCodeWindow::Update() +{ + codeview->Refresh(); + + callstack->Clear(); + + std::vectorstack; + + if (Debugger::GetCallstack(stack)) + { + for (size_t i = 0; i < stack.size(); i++) + { + int idx = callstack->Append(wxString::FromAscii(stack[i].Name.c_str())); + callstack->SetClientData(idx, (void*)(u64)stack[i].vAddress); + } + } + else + { + callstack->Append("invalid callstack"); + } + + UpdateButtonStates(); + + codeview->Center(PC); + + Host_UpdateLogDisplay(); +} + + +void CCodeWindow::NotifyMapLoaded() +{ + symbols->Show(false); // hide it for faster filling + symbols->Clear(); +#ifdef _WIN32 + const Debugger::XVectorSymbol& syms = Debugger::AccessSymbols(); + + for (int i = 0; i < (int)syms.size(); i++) + { + int idx = symbols->Append(syms[i].GetName().c_str()); + symbols->SetClientData(idx, (void*)&syms[i]); + } + + // +#endif + + symbols->Show(true); + Update(); +} + + +void CCodeWindow::UpdateButtonStates() +{ + if (Core::GetState() == Core::CORE_UNINITIALIZED) + { + buttonGo->Enable(false); + buttonStep->Enable(false); + buttonStepOver->Enable(false); + buttonSkip->Enable(false); + } + else + { + if (!CCPU::IsStepping()) + { + buttonGo->SetLabel(_T("&Pause")); + buttonGo->Enable(true); + buttonStep->Enable(false); + buttonStepOver->Enable(false); + buttonSkip->Enable(false); + } + else + { + buttonGo->SetLabel(_T("&Go")); + buttonGo->Enable(true); + buttonStep->Enable(true); + buttonStepOver->Enable(true); + buttonSkip->Enable(true); + } + } +} + + +void CCodeWindow::OnSymolListChange(wxCommandEvent& event) +{ + int index = symbols->GetSelection(); + Debugger::CSymbol* pSymbol = static_cast(symbols->GetClientData(index)); + + if (pSymbol != NULL) + { + codeview->Center(pSymbol->vaddress); + } +} + + +void CCodeWindow::OnCallstackListChange(wxCommandEvent& event) +{ + int index = callstack->GetSelection(); + u32 address = (u32)(u64)(callstack->GetClientData(index)); + + if (address != 0x00) + { + codeview->Center(address); + } +} + + +void CCodeWindow::OnToggleLogWindow(wxCommandEvent& event) +{ + if (IsLoggingActivated()) + { + bool show = GetMenuBar()->IsChecked(event.GetId()); + + if (show) + { + if (!m_logwindow) + { + m_logwindow = new CLogWindow(this); + } + + m_logwindow->Show(true); + } + else // hide + { + // If m_dialog is NULL, then possibly the system + // didn't report the checked menu item status correctly. + // It should be true just after the menu item was selected, + // if there was no modeless dialog yet. + wxASSERT(m_logwindow != NULL); + + if (m_logwindow) + { + m_logwindow->Hide(); + } + } + } +} + + +void CCodeWindow::OnToggleRegisterWindow(wxCommandEvent& event) +{ + bool show = GetMenuBar()->IsChecked(event.GetId()); + + if (show) + { + if (!m_RegisterWindow) + { + m_RegisterWindow = new CRegisterWindow(this); + } + + m_RegisterWindow->Show(true); + } + else // hide + { + // If m_dialog is NULL, then possibly the system + // didn't report the checked menu item status correctly. + // It should be true just after the menu item was selected, + // if there was no modeless dialog yet. + wxASSERT(m_RegisterWindow != NULL); + + if (m_RegisterWindow) + { + m_RegisterWindow->Hide(); + } + } +} + + +void CCodeWindow::OnHostMessage(wxCommandEvent& event) +{ + switch (event.GetId()) + { + case IDM_NOTIFYMAPLOADED: + NotifyMapLoaded(); + break; + + case IDM_UPDATELOGDISPLAY: + + if (m_logwindow) + { + m_logwindow->NotifyUpdate(); + } + + break; + + case IDM_UPDATEDISASMDIALOG: + Update(); + + if (m_RegisterWindow) + { + m_RegisterWindow->NotifyUpdate(); + } + + break; + } +} + + diff --git a/Source/Core/DebuggerWX/src/CodeWindow.h b/Source/Core/DebuggerWX/src/CodeWindow.h new file mode 100644 index 0000000000..46d840ad65 --- /dev/null +++ b/Source/Core/DebuggerWX/src/CodeWindow.h @@ -0,0 +1,86 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef CODEWINDOW_H_ +#define CODEWINDOW_H_ + +#include "wx/dialog.h" +#include "wx/textctrl.h" +#include "wx/listbox.h" +#include "Debugger.h" +#include "CodeView.h" +#include "Thread.h" + +#include "CoreParameter.h" + +class CRegisterWindow; +class CLogWindow; + +class CCodeWindow + : public wxFrame +{ + public: + + CCodeWindow(const SCoreStartupParameter& _LocalCoreStartupParameter, wxWindow* parent, + wxWindowID id = wxID_ANY, + const wxString& title = _T("Dolphin-Debugger"), + const wxPoint& pos = wxPoint(950, 100), + const wxSize& size = wxSize(400, 500), + long style = wxDEFAULT_FRAME_STYLE | wxCLIP_CHILDREN | wxNO_FULL_REPAINT_ON_RESIZE); + + void Update(); + void NotifyMapLoaded(); + + bool UseInterpreter(); + bool UseDualCore(); + + + private: + + // sub dialogs + CLogWindow* m_logwindow; + CRegisterWindow* m_RegisterWindow; + + CCodeView* codeview; + wxListBox* callstack; + wxListBox* symbols; + Common::Event sync_event; + + wxButton* buttonGo; + wxButton* buttonStep; + wxButton* buttonStepOver; + wxButton* buttonSkip; + wxButton* buttonGotoPC; + + wxTextCtrl* addrbox; + DECLARE_EVENT_TABLE() + + void OnSymolListChange(wxCommandEvent& event); + void OnCallstackListChange(wxCommandEvent& event); + void OnCodeStep(wxCommandEvent& event); + void OnAddrBoxChange(wxCommandEvent& event); + + void OnToggleRegisterWindow(wxCommandEvent& event); + void OnToggleLogWindow(wxCommandEvent& event); + void OnHostMessage(wxCommandEvent& event); + + void CreateMenu(const SCoreStartupParameter& _LocalCoreStartupParameter); + + void UpdateButtonStates(); +}; + +#endif /*CODEWINDOW_*/ diff --git a/Source/Core/DebuggerWX/src/Debugger.cpp b/Source/Core/DebuggerWX/src/Debugger.cpp new file mode 100644 index 0000000000..8f263d774d --- /dev/null +++ b/Source/Core/DebuggerWX/src/Debugger.cpp @@ -0,0 +1,19 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "Debugger.h" + diff --git a/Source/Core/DebuggerWX/src/Debugger.h b/Source/Core/DebuggerWX/src/Debugger.h new file mode 100644 index 0000000000..67df2cf93e --- /dev/null +++ b/Source/Core/DebuggerWX/src/Debugger.h @@ -0,0 +1,42 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef _DEBUGGER_H +#define _DEBUGGER_H + +enum +{ + IDM_LOG, + IDM_UPDATELOG, + IDM_CLEARLOG, + IDM_LOGCHECKS, + IDM_SUBMITCMD = 300, +}; + +#define wxUSE_XPM_IN_MSW 1 +#define USE_XPM_BITMAPS 1 + +#include "wx/wx.h" + +// define this to use XPMs everywhere (by default, BMPs are used under Win) +// BMPs use less space, but aren't compiled into the executable on other platforms + +#if USE_XPM_BITMAPS && defined (__WXMSW__) && !wxUSE_XPM_IN_MSW +#error You need to enable XPM support to use XPM bitmaps with toolbar! +#endif // USE_XPM_BITMAPS + +#endif diff --git a/Source/Core/DebuggerWX/src/LogWindow.cpp b/Source/Core/DebuggerWX/src/LogWindow.cpp new file mode 100644 index 0000000000..cb47b64d91 --- /dev/null +++ b/Source/Core/DebuggerWX/src/LogWindow.cpp @@ -0,0 +1,225 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "Debugger.h" +#include "LogManager.h" + +#include "wx/button.h" +#include "wx/textctrl.h" +#include "wx/listbox.h" +#include "wx/checklst.h" + +#include "LogWindow.h" +#include "Console.h" +#include "IniFile.h" + +BEGIN_EVENT_TABLE(CLogWindow, wxDialog) +EVT_BUTTON(IDM_SUBMITCMD, CLogWindow::OnSubmit) +EVT_BUTTON(IDM_UPDATELOG, CLogWindow::OnUpdateLog) +EVT_BUTTON(IDM_CLEARLOG, CLogWindow::OnClear) +EVT_CHECKLISTBOX(IDM_LOGCHECKS, CLogWindow::OnLogCheck) +END_EVENT_TABLE() + + +CLogWindow::CLogWindow(wxWindow* parent) + : wxDialog(parent, wxID_ANY, _T("Log/Console"), wxPoint(100, 700), wxSize(800, 270), + wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER) +{ + wxBoxSizer* sizerTop = new wxBoxSizer(wxHORIZONTAL), + * sizerUber = new wxBoxSizer(wxHORIZONTAL), + * sizerBig = new wxBoxSizer(wxVERTICAL), + * sizerBottom = new wxBoxSizer(wxHORIZONTAL); + + m_log = new wxTextCtrl(this, IDM_LOG, _T(""), wxDefaultPosition, wxSize(600, 120), wxTE_MULTILINE | wxTE_READONLY | wxTE_DONTWRAP); + m_cmdline = new wxTextCtrl(this, wxID_ANY, _T(""), wxDefaultPosition); + wxButton* btn = new wxButton(this, IDM_SUBMITCMD, _T("Submit")); + + sizerTop->Add(new wxButton(this, IDM_UPDATELOG, _T("Update"))); + sizerTop->Add(new wxButton(this, IDM_CLEARLOG, _T("Clear"))); + m_checks = new wxCheckListBox(this, IDM_LOGCHECKS, wxDefaultPosition, wxSize(120, 280)); + sizerBottom->Add(m_cmdline, 8, wxGROW | wxRIGHT, 5); + sizerBottom->Add(btn, 1, wxGROW, 0); + + sizerBig->Add(sizerTop, 0, wxGROW); + sizerBig->Add(m_log, 1, wxGROW | wxSHRINK); + sizerBig->Add(sizerBottom, 0, wxGROW); + + sizerUber->Add(m_checks, 0, wxGROW); + sizerUber->Add(sizerBig, 1, wxGROW); + + SetSizer(sizerUber); + SetAffirmativeId(IDM_SUBMITCMD); + + //sizerTop->SetSizeHints(this); + //sizerTop->Fit(this); + UpdateChecks(); + m_cmdline->SetFocus(); + m_bCheckDirty = false; +} + + +void CLogWindow::OnSubmit(wxCommandEvent& event) +{ + Console_Submit(m_cmdline->GetValue().c_str()); + m_cmdline->SetValue(_T("")); + NotifyUpdate(); +} + + +void CLogWindow::OnClear(wxCommandEvent& event) +{ + LogManager::Clear(); + LOG(MASTER_LOG, "(log cleared)."); + NotifyUpdate(); +} + + +void CLogWindow::OnLogCheck(wxCommandEvent& event) +{ + if (!LogManager::m_bInitialized) + { + return; + } + + IniFile ini; + ini.Load("Dolphin.ini"); + + for (int i = 0; i < LogTypes::NUMBER_OF_LOGS; i++) + { + bool Enabled = m_checks->IsChecked(i); + LogManager::m_Log[i]->m_bEnable = Enabled; + LogManager::m_Log[i]->m_bShowInLog = Enabled; + + ini.Set("LogManager", LogManager::m_Log[i]->m_szShortName, Enabled); + } + + ini.Save("Dolphin.ini"); + + m_bCheckDirty = true; + UpdateLog(); +} + + +void CLogWindow::UpdateChecks() +{ + if (!LogManager::m_bInitialized) + { + return; + } + + if (m_checks->GetCount() == 0) + { + // [F|RES] hide the window while we fill it... wxwidgets gets trouble if you don't do it (at least the win version) + m_checks->Show(false); + + for (int i = 0; i < LogTypes::NUMBER_OF_LOGS; i++) + { + m_checks->Append(LogManager::m_Log[i]->m_szName); + } + + m_checks->Show(true); + } + + IniFile ini; + ini.Load("Dolphin.ini"); + + for (int i = 0; i < LogTypes::NUMBER_OF_LOGS; i++) + { + bool Enabled = false; + ini.Get("LogManager", LogManager::m_Log[i]->m_szShortName, &Enabled, false); + + m_checks->Check(i, Enabled); + + LogManager::m_Log[i]->m_bEnable = Enabled; + LogManager::m_Log[i]->m_bShowInLog = Enabled; + } + + m_bCheckDirty = true; + UpdateLog(); +} + + +void CLogWindow::OnUpdateLog(wxCommandEvent& event) +{ + NotifyUpdate(); +} + + +void CLogWindow::NotifyUpdate() +{ + UpdateChecks(); + UpdateLog(); +} + + +void CLogWindow::UpdateLog() +{ + static int last = -1; + int i = LogManager::m_nextMessages; + + if ((last == i) && !m_bCheckDirty) + { + return; + } + + m_bCheckDirty = false; + last = i; + //bash together a log buffer really fast (no slow strcpy here, just memcpys) + int count = 0; + char* p = m_logBuffer; + + while (count < MAX_MESSAGES) + { + count++; + const LogManager::SMessage& message = LogManager::m_Messages[i]; + + if (message.m_bInUse) + { + int len = message.m_dwMsgLen; + + if (LogManager::m_activeLog == LogTypes::MASTER_LOG) + { + if (LogManager::m_Log[message.m_type]->m_bShowInLog) + { + memcpy(p, message.m_szMessage, len); + p += len; + } + } + else + { + if (message.m_type == LogManager::m_activeLog) + { + memcpy(p, message.m_szMessage, len); + p += len; + } + } + } + + i++; + + if (i >= MAX_MESSAGES) + { + i = 0; + } + } + + *p = 0; //end the string + m_log->SetValue(m_logBuffer); + m_log->SetInsertionPoint(p - m_logBuffer - 1); +} + + diff --git a/Source/Core/DebuggerWX/src/LogWindow.h b/Source/Core/DebuggerWX/src/LogWindow.h new file mode 100644 index 0000000000..ebd0f35198 --- /dev/null +++ b/Source/Core/DebuggerWX/src/LogWindow.h @@ -0,0 +1,53 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef LOGWINDOW_H_ +#define LOGWINDOW_H_ + +#include "wx/dialog.h" +#include "wx/textctrl.h" +#include "wx/checklst.h" +#include "Debugger.h" + +class CLogWindow + : public wxDialog +{ + public: + + CLogWindow(wxWindow* parent); + void NotifyUpdate(); + + + private: + + enum { LogBufferSize = 8 * 1024 * 1024}; + char m_logBuffer[LogBufferSize]; + wxTextCtrl* m_log, * m_cmdline; + wxCheckListBox* m_checks; + bool m_bCheckDirty; + DECLARE_EVENT_TABLE() + + void OnSubmit(wxCommandEvent& event); + void OnUpdateLog(wxCommandEvent& event); + void OnLogCheck(wxCommandEvent& event); + void OnClear(wxCommandEvent& event); + + void UpdateChecks(); + void UpdateLog(); +}; + +#endif /*LOGWINDOW_H_*/ diff --git a/Source/Core/DebuggerWX/src/RegisterView.cpp b/Source/Core/DebuggerWX/src/RegisterView.cpp new file mode 100644 index 0000000000..2373d09a31 --- /dev/null +++ b/Source/Core/DebuggerWX/src/RegisterView.cpp @@ -0,0 +1,140 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "Debugger.h" +#include "RegisterView.h" +#include "PowerPC/PowerPC.h" + +extern const char* GetGRPName(unsigned int index); + + +BEGIN_EVENT_TABLE(CRegisterView, wxListCtrl) + +END_EVENT_TABLE() + +CRegisterView::CRegisterView(wxWindow* parent, const wxWindowID id, const wxPoint& pos, const wxSize& size, long style) + : wxListCtrl(parent, id, pos, size, style) +{ + InsertColumn(1, wxT("Reg 16-31"), wxLIST_FORMAT_LEFT, 100); + InsertColumn(0, wxT("Value"), wxLIST_FORMAT_CENTER, 80); + InsertColumn(0, wxT("Reg 0-15"), wxLIST_FORMAT_LEFT, 100); + InsertColumn(0, wxT("Value"), wxLIST_FORMAT_CENTER, 80); + + SetFont(wxFont(9, wxSWISS, wxNORMAL, wxNORMAL, false, wxT("Segoe UI"))); + + for (int i = 0; i < 16; i++) + { + // 0-15 + int Item = InsertItem(0, GetGRPName(i)); + + // 16-31 + SetItem(Item, 2, GetGRPName(16 + i)); + + // just for easy sort + + wxListItem item; + item.SetId(Item); + item.SetBackgroundColour(0xFFFFFF); + item.SetData(i); + SetItem(item); + } + + Refresh(); +} + + +void +CRegisterView::Update() +{ + for (size_t i = 0; i < 16; i++) + { + // 0-15 + if (m_CachedRegs[i] != GPR(i)) + { + m_CachedRegHasChanged[i] = true; + } + else + { + m_CachedRegHasChanged[i] = false; + } + + m_CachedRegs[i] = GPR(i); + + // 16-31 + if (m_CachedRegs[16 + i] != GPR(16 + i)) + { + m_CachedRegHasChanged[16 + i] = true; + } + else + { + m_CachedRegHasChanged[16 + i] = false; + } + + m_CachedRegs[16 + i] = GPR(16 + i); + } + + Refresh(); +} + + +bool +CRegisterView::MSWDrawSubItem(wxPaintDC& rPainDC, int item, int subitem) +{ + bool Result = false; + +#ifdef __WXMSW__ + switch (subitem) + { + case 1: + case 3: + { + int Register = (subitem == 1) ? item : item + 16; + + const wxChar* bgColor = _T("#ffffff"); + wxBrush bgBrush(bgColor); + wxPen bgPen(bgColor); + + wxRect SubItemRect; + this->GetSubItemRect(item, subitem, SubItemRect); + rPainDC.SetBrush(bgBrush); + rPainDC.SetPen(bgPen); + rPainDC.DrawRectangle(SubItemRect); + + if (m_CachedRegHasChanged[Register]) + { + rPainDC.SetTextForeground(_T("#FF0000")); + } + else + { + rPainDC.SetTextForeground(_T("#000000")); + } + + wxString text; + text.Printf(wxT("0x%08x"), m_CachedRegs[Register]); + rPainDC.DrawText(text, SubItemRect.GetLeft() + 10, SubItemRect.GetTop() + 4); + return(true); + } + break; + } + + // +#endif + + return(Result); +} + + diff --git a/Source/Core/DebuggerWX/src/RegisterView.h b/Source/Core/DebuggerWX/src/RegisterView.h new file mode 100644 index 0000000000..912ae48c1a --- /dev/null +++ b/Source/Core/DebuggerWX/src/RegisterView.h @@ -0,0 +1,45 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef __REGISTERVIEW_h__ +#define __REGISTERVIEW_h__ + +#include + +#include "Common.h" + +class CRegisterView + : public wxListCtrl +{ + public: + + CRegisterView(wxWindow* parent, const wxWindowID id, const wxPoint& pos, const wxSize& size, long style); + + void Update(); + + + private: + + DECLARE_EVENT_TABLE() + + u32 m_CachedRegs[32]; + bool m_CachedRegHasChanged[32]; + + virtual bool MSWDrawSubItem(wxPaintDC& rPainDC, int item, int subitem); +}; + +#endif diff --git a/Source/Core/DebuggerWX/src/RegisterWindow.cpp b/Source/Core/DebuggerWX/src/RegisterWindow.cpp new file mode 100644 index 0000000000..f54bdb1079 --- /dev/null +++ b/Source/Core/DebuggerWX/src/RegisterWindow.cpp @@ -0,0 +1,70 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "Debugger.h" +#include "RegisterWindow.h" +#include "PowerPC/PowerPC.h" +#include "RegisterView.h" + +extern const char* GetGRPName(unsigned int index); + + +BEGIN_EVENT_TABLE(CRegisterWindow, wxDialog) +EVT_CLOSE(CRegisterWindow::OnClose) +END_EVENT_TABLE() + +CRegisterWindow::CRegisterWindow(wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& position, const wxSize& size, long style) + : wxDialog(parent, id, title, position, size, style) + , m_GPRListView(NULL) +{ + CreateGUIControls(); +} + + +CRegisterWindow::~CRegisterWindow() +{} + + +void CRegisterWindow::CreateGUIControls() +{ + SetTitle(wxT("Registers")); + SetIcon(wxNullIcon); + SetSize(8, 8, 400, 370); + Center(); + + m_GPRListView = new CRegisterView(this, ID_GPR, wxDefaultPosition, GetSize(), + wxLC_REPORT | wxSUNKEN_BORDER | wxLC_ALIGN_LEFT | wxLC_SINGLE_SEL | wxLC_SORT_ASCENDING); + + NotifyUpdate(); +} + + +void CRegisterWindow::OnClose(wxCloseEvent& /*event*/) +{ + Hide(); +} + + +void CRegisterWindow::NotifyUpdate() +{ + if (m_GPRListView != NULL) + { + m_GPRListView->Update(); + } +} + + diff --git a/Source/Core/DebuggerWX/src/RegisterWindow.h b/Source/Core/DebuggerWX/src/RegisterWindow.h new file mode 100644 index 0000000000..426d19dda5 --- /dev/null +++ b/Source/Core/DebuggerWX/src/RegisterWindow.h @@ -0,0 +1,54 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef __REGISTERWINDOW_h__ +#define __REGISTERWINDOW_h__ + +class CRegisterView; + +#undef RegisterWindow_STYLE +#define RegisterWindow_STYLE wxCAPTION | wxSYSTEM_MENU | wxCLOSE_BOX + +class CRegisterWindow + : public wxDialog +{ + private: + + DECLARE_EVENT_TABLE(); + + public: + + CRegisterWindow(wxWindow* parent, wxWindowID id = 1, const wxString& title = wxT("Registers"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = RegisterWindow_STYLE); + virtual ~CRegisterWindow(); + + void NotifyUpdate(); + + + private: + + enum + { + ID_GPR = 1002 + }; + + CRegisterView* m_GPRListView; + + void OnClose(wxCloseEvent& event); + void CreateGUIControls(); +}; + +#endif diff --git a/Source/Core/DebuggerWX/src/SConscript b/Source/Core/DebuggerWX/src/SConscript new file mode 100644 index 0000000000..6386758b1c --- /dev/null +++ b/Source/Core/DebuggerWX/src/SConscript @@ -0,0 +1,13 @@ +Import('env') + +files = ["LogWindow.cpp", + "CodeWindow.cpp", + "CodeView.cpp", + "Debugger.cpp", + "RegisterWindow.cpp", + "RegisterView.cpp", + ] +wxenv = env.Copy(CXXFLAGS = "`wx-config --cppflags --debug` -DUSE_XPM_BITMAPS -DwxNEEDS_CHARPP", + LINKFLAGS = "-L/usr/local/lib -pthread `wx-config --libs --debug`") + +wxenv.StaticLibrary("debwx", files, LIBS = ["common"]) diff --git a/Source/Core/DiscIO/DiscIO.vcproj b/Source/Core/DiscIO/DiscIO.vcproj new file mode 100644 index 0000000000..345b8243ba --- /dev/null +++ b/Source/Core/DiscIO/DiscIO.vcproj @@ -0,0 +1,1172 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Source/Core/DiscIO/Src/AES/aes.h b/Source/Core/DiscIO/Src/AES/aes.h new file mode 100644 index 0000000000..8d5059e1be --- /dev/null +++ b/Source/Core/DiscIO/Src/AES/aes.h @@ -0,0 +1,143 @@ +/* crypto/aes/aes.h -*- mode:C; c-file-style: "eay" -*- */ +/* ==================================================================== + * Copyright (c) 1998-2002 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + */ + +#ifndef HEADER_AES_H +#define HEADER_AES_H + +// #include + +#ifdef OPENSSL_NO_AES +#error AES is disabled. +#endif + +#define AES_ENCRYPT 1 +#define AES_DECRYPT 0 + +/* Because array size can't be a const in C, the following two are macros. + Both sizes are in bytes. */ +#define AES_MAXNR 14 +#define AES_BLOCK_SIZE 16 + +#ifdef __cplusplus +extern "C" { +#endif + +/* This should be a hidden type, but EVP requires that the size be known */ +struct aes_key_st +{ +#ifdef AES_LONG + unsigned long rd_key[4 * (AES_MAXNR + 1)]; +#else + unsigned int rd_key[4 * (AES_MAXNR + 1)]; +#endif + int rounds; +}; +typedef struct aes_key_st AES_KEY; + +const char* AES_options(void); + +int AES_set_encrypt_key(const unsigned char* userKey, const int bits, + AES_KEY* key); +int AES_set_decrypt_key(const unsigned char* userKey, const int bits, + AES_KEY* key); + +void AES_encrypt(const unsigned char* in, unsigned char* out, + const AES_KEY* key); +void AES_decrypt(const unsigned char* in, unsigned char* out, + const AES_KEY* key); + +void AES_ecb_encrypt(const unsigned char* in, unsigned char* out, + const AES_KEY* key, const int enc); +void AES_cbc_encrypt(const unsigned char* in, unsigned char* out, + const unsigned long length, const AES_KEY* key, + unsigned char* ivec, const int enc); +void AES_cfb128_encrypt(const unsigned char* in, unsigned char* out, + const unsigned long length, const AES_KEY* key, + unsigned char* ivec, int* num, const int enc); +void AES_cfb1_encrypt(const unsigned char* in, unsigned char* out, + const unsigned long length, const AES_KEY* key, + unsigned char* ivec, int* num, const int enc); +void AES_cfb8_encrypt(const unsigned char* in, unsigned char* out, + const unsigned long length, const AES_KEY* key, + unsigned char* ivec, int* num, const int enc); +void AES_cfbr_encrypt_block(const unsigned char* in, unsigned char* out, + const int nbits, const AES_KEY* key, + unsigned char* ivec, const int enc); +void AES_ofb128_encrypt(const unsigned char* in, unsigned char* out, + const unsigned long length, const AES_KEY* key, + unsigned char* ivec, int* num); + + +void AES_ctr128_encrypt(const unsigned char* in, unsigned char* out, + const unsigned long length, const AES_KEY * key, + unsigned char ivec[AES_BLOCK_SIZE], + unsigned char ecount_buf[AES_BLOCK_SIZE], + unsigned int* num); + +/* For IGE, see also http://www.links.org/files/openssl-ige.pdf + NB: the IV is _two_ blocks long */ +void AES_ige_encrypt(const unsigned char* in, unsigned char* out, + const unsigned long length, const AES_KEY* key, + unsigned char* ivec, const int enc); + + +/* NB: the IV is _four_ blocks long */ +void AES_bi_ige_encrypt(const unsigned char* in, unsigned char* out, + const unsigned long length, const AES_KEY* key, + const AES_KEY* key2, const unsigned char* ivec, + const int enc); + + +#ifdef __cplusplus +} +#endif + +#endif /* !HEADER_AES_H */ diff --git a/Source/Core/DiscIO/Src/AES/aes_cbc.c b/Source/Core/DiscIO/Src/AES/aes_cbc.c new file mode 100644 index 0000000000..780c35a88d --- /dev/null +++ b/Source/Core/DiscIO/Src/AES/aes_cbc.c @@ -0,0 +1,131 @@ +/* crypto/aes/aes_cbc.c -*- mode:C; c-file-style: "eay" -*- */ +/* ==================================================================== + * Copyright (c) 1998-2002 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + */ + +#ifndef AES_DEBUG +# ifndef NDEBUG +# define NDEBUG +# endif +#endif +#include + +#include "aes.h" +#include "aes_locl.h" + +void AES_cbc_encrypt(const unsigned char *in, unsigned char *out, + const unsigned long length, const AES_KEY *key, + unsigned char *ivec, const int enc) { + + unsigned long n; + unsigned long len = length; + unsigned char tmp[AES_BLOCK_SIZE]; + const unsigned char *iv = ivec; + + assert(in && out && key && ivec); + assert((AES_ENCRYPT == enc)||(AES_DECRYPT == enc)); + + if (AES_ENCRYPT == enc) { + while (len >= AES_BLOCK_SIZE) { + for(n=0; n < AES_BLOCK_SIZE; ++n) + out[n] = in[n] ^ iv[n]; + AES_encrypt(out, out, key); + iv = out; + len -= AES_BLOCK_SIZE; + in += AES_BLOCK_SIZE; + out += AES_BLOCK_SIZE; + } + if (len) { + for(n=0; n < len; ++n) + out[n] = in[n] ^ iv[n]; + for(n=len; n < AES_BLOCK_SIZE; ++n) + out[n] = iv[n]; + AES_encrypt(out, out, key); + iv = out; + } + memcpy(ivec,iv,AES_BLOCK_SIZE); + } else if (in != out) { + while (len >= AES_BLOCK_SIZE) { + AES_decrypt(in, out, key); + for(n=0; n < AES_BLOCK_SIZE; ++n) + out[n] ^= iv[n]; + iv = in; + len -= AES_BLOCK_SIZE; + in += AES_BLOCK_SIZE; + out += AES_BLOCK_SIZE; + } + if (len) { + AES_decrypt(in,tmp,key); + for(n=0; n < len; ++n) + out[n] = tmp[n] ^ iv[n]; + iv = in; + } + memcpy(ivec,iv,AES_BLOCK_SIZE); + } else { + while (len >= AES_BLOCK_SIZE) { + memcpy(tmp, in, AES_BLOCK_SIZE); + AES_decrypt(in, out, key); + for(n=0; n < AES_BLOCK_SIZE; ++n) + out[n] ^= ivec[n]; + memcpy(ivec, tmp, AES_BLOCK_SIZE); + len -= AES_BLOCK_SIZE; + in += AES_BLOCK_SIZE; + out += AES_BLOCK_SIZE; + } + if (len) { + memcpy(tmp, in, AES_BLOCK_SIZE); + AES_decrypt(tmp, out, key); + for(n=0; n < len; ++n) + out[n] ^= ivec[n]; + for(n=len; n < AES_BLOCK_SIZE; ++n) + out[n] = tmp[n]; + memcpy(ivec, tmp, AES_BLOCK_SIZE); + } + } +} diff --git a/Source/Core/DiscIO/Src/AES/aes_core.c b/Source/Core/DiscIO/Src/AES/aes_core.c new file mode 100644 index 0000000000..11f7b0e43c --- /dev/null +++ b/Source/Core/DiscIO/Src/AES/aes_core.c @@ -0,0 +1,1159 @@ +/* crypto/aes/aes_core.c -*- mode:C; c-file-style: "eay" -*- */ +/** + * rijndael-alg-fst.c + * + * @version 3.0 (December 2000) + * + * Optimised ANSI C code for the Rijndael cipher (now AES) + * + * @author Vincent Rijmen + * @author Antoon Bosselaers + * @author Paulo Barreto + * + * This code is hereby placed in the public domain. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* Note: rewritten a little bit to provide error control and an OpenSSL- + compatible API */ + +#ifndef AES_DEBUG +# ifndef NDEBUG +# define NDEBUG +# endif +#endif +#include + +#include +#include "aes.h" +#include "aes_locl.h" + +/* +Te0[x] = S [x].[02, 01, 01, 03]; +Te1[x] = S [x].[03, 02, 01, 01]; +Te2[x] = S [x].[01, 03, 02, 01]; +Te3[x] = S [x].[01, 01, 03, 02]; + +Td0[x] = Si[x].[0e, 09, 0d, 0b]; +Td1[x] = Si[x].[0b, 0e, 09, 0d]; +Td2[x] = Si[x].[0d, 0b, 0e, 09]; +Td3[x] = Si[x].[09, 0d, 0b, 0e]; +Td4[x] = Si[x].[01]; +*/ + +static const u32 Te0[256] = { + 0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU, + 0xfff2f20dU, 0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U, + 0x60303050U, 0x02010103U, 0xce6767a9U, 0x562b2b7dU, + 0xe7fefe19U, 0xb5d7d762U, 0x4dababe6U, 0xec76769aU, + 0x8fcaca45U, 0x1f82829dU, 0x89c9c940U, 0xfa7d7d87U, + 0xeffafa15U, 0xb25959ebU, 0x8e4747c9U, 0xfbf0f00bU, + 0x41adadecU, 0xb3d4d467U, 0x5fa2a2fdU, 0x45afafeaU, + 0x239c9cbfU, 0x53a4a4f7U, 0xe4727296U, 0x9bc0c05bU, + 0x75b7b7c2U, 0xe1fdfd1cU, 0x3d9393aeU, 0x4c26266aU, + 0x6c36365aU, 0x7e3f3f41U, 0xf5f7f702U, 0x83cccc4fU, + 0x6834345cU, 0x51a5a5f4U, 0xd1e5e534U, 0xf9f1f108U, + 0xe2717193U, 0xabd8d873U, 0x62313153U, 0x2a15153fU, + 0x0804040cU, 0x95c7c752U, 0x46232365U, 0x9dc3c35eU, + 0x30181828U, 0x379696a1U, 0x0a05050fU, 0x2f9a9ab5U, + 0x0e070709U, 0x24121236U, 0x1b80809bU, 0xdfe2e23dU, + 0xcdebeb26U, 0x4e272769U, 0x7fb2b2cdU, 0xea75759fU, + 0x1209091bU, 0x1d83839eU, 0x582c2c74U, 0x341a1a2eU, + 0x361b1b2dU, 0xdc6e6eb2U, 0xb45a5aeeU, 0x5ba0a0fbU, + 0xa45252f6U, 0x763b3b4dU, 0xb7d6d661U, 0x7db3b3ceU, + 0x5229297bU, 0xdde3e33eU, 0x5e2f2f71U, 0x13848497U, + 0xa65353f5U, 0xb9d1d168U, 0x00000000U, 0xc1eded2cU, + 0x40202060U, 0xe3fcfc1fU, 0x79b1b1c8U, 0xb65b5bedU, + 0xd46a6abeU, 0x8dcbcb46U, 0x67bebed9U, 0x7239394bU, + 0x944a4adeU, 0x984c4cd4U, 0xb05858e8U, 0x85cfcf4aU, + 0xbbd0d06bU, 0xc5efef2aU, 0x4faaaae5U, 0xedfbfb16U, + 0x864343c5U, 0x9a4d4dd7U, 0x66333355U, 0x11858594U, + 0x8a4545cfU, 0xe9f9f910U, 0x04020206U, 0xfe7f7f81U, + 0xa05050f0U, 0x783c3c44U, 0x259f9fbaU, 0x4ba8a8e3U, + 0xa25151f3U, 0x5da3a3feU, 0x804040c0U, 0x058f8f8aU, + 0x3f9292adU, 0x219d9dbcU, 0x70383848U, 0xf1f5f504U, + 0x63bcbcdfU, 0x77b6b6c1U, 0xafdada75U, 0x42212163U, + 0x20101030U, 0xe5ffff1aU, 0xfdf3f30eU, 0xbfd2d26dU, + 0x81cdcd4cU, 0x180c0c14U, 0x26131335U, 0xc3ecec2fU, + 0xbe5f5fe1U, 0x359797a2U, 0x884444ccU, 0x2e171739U, + 0x93c4c457U, 0x55a7a7f2U, 0xfc7e7e82U, 0x7a3d3d47U, + 0xc86464acU, 0xba5d5de7U, 0x3219192bU, 0xe6737395U, + 0xc06060a0U, 0x19818198U, 0x9e4f4fd1U, 0xa3dcdc7fU, + 0x44222266U, 0x542a2a7eU, 0x3b9090abU, 0x0b888883U, + 0x8c4646caU, 0xc7eeee29U, 0x6bb8b8d3U, 0x2814143cU, + 0xa7dede79U, 0xbc5e5ee2U, 0x160b0b1dU, 0xaddbdb76U, + 0xdbe0e03bU, 0x64323256U, 0x743a3a4eU, 0x140a0a1eU, + 0x924949dbU, 0x0c06060aU, 0x4824246cU, 0xb85c5ce4U, + 0x9fc2c25dU, 0xbdd3d36eU, 0x43acacefU, 0xc46262a6U, + 0x399191a8U, 0x319595a4U, 0xd3e4e437U, 0xf279798bU, + 0xd5e7e732U, 0x8bc8c843U, 0x6e373759U, 0xda6d6db7U, + 0x018d8d8cU, 0xb1d5d564U, 0x9c4e4ed2U, 0x49a9a9e0U, + 0xd86c6cb4U, 0xac5656faU, 0xf3f4f407U, 0xcfeaea25U, + 0xca6565afU, 0xf47a7a8eU, 0x47aeaee9U, 0x10080818U, + 0x6fbabad5U, 0xf0787888U, 0x4a25256fU, 0x5c2e2e72U, + 0x381c1c24U, 0x57a6a6f1U, 0x73b4b4c7U, 0x97c6c651U, + 0xcbe8e823U, 0xa1dddd7cU, 0xe874749cU, 0x3e1f1f21U, + 0x964b4bddU, 0x61bdbddcU, 0x0d8b8b86U, 0x0f8a8a85U, + 0xe0707090U, 0x7c3e3e42U, 0x71b5b5c4U, 0xcc6666aaU, + 0x904848d8U, 0x06030305U, 0xf7f6f601U, 0x1c0e0e12U, + 0xc26161a3U, 0x6a35355fU, 0xae5757f9U, 0x69b9b9d0U, + 0x17868691U, 0x99c1c158U, 0x3a1d1d27U, 0x279e9eb9U, + 0xd9e1e138U, 0xebf8f813U, 0x2b9898b3U, 0x22111133U, + 0xd26969bbU, 0xa9d9d970U, 0x078e8e89U, 0x339494a7U, + 0x2d9b9bb6U, 0x3c1e1e22U, 0x15878792U, 0xc9e9e920U, + 0x87cece49U, 0xaa5555ffU, 0x50282878U, 0xa5dfdf7aU, + 0x038c8c8fU, 0x59a1a1f8U, 0x09898980U, 0x1a0d0d17U, + 0x65bfbfdaU, 0xd7e6e631U, 0x844242c6U, 0xd06868b8U, + 0x824141c3U, 0x299999b0U, 0x5a2d2d77U, 0x1e0f0f11U, + 0x7bb0b0cbU, 0xa85454fcU, 0x6dbbbbd6U, 0x2c16163aU, +}; +static const u32 Te1[256] = { + 0xa5c66363U, 0x84f87c7cU, 0x99ee7777U, 0x8df67b7bU, + 0x0dfff2f2U, 0xbdd66b6bU, 0xb1de6f6fU, 0x5491c5c5U, + 0x50603030U, 0x03020101U, 0xa9ce6767U, 0x7d562b2bU, + 0x19e7fefeU, 0x62b5d7d7U, 0xe64dababU, 0x9aec7676U, + 0x458fcacaU, 0x9d1f8282U, 0x4089c9c9U, 0x87fa7d7dU, + 0x15effafaU, 0xebb25959U, 0xc98e4747U, 0x0bfbf0f0U, + 0xec41adadU, 0x67b3d4d4U, 0xfd5fa2a2U, 0xea45afafU, + 0xbf239c9cU, 0xf753a4a4U, 0x96e47272U, 0x5b9bc0c0U, + 0xc275b7b7U, 0x1ce1fdfdU, 0xae3d9393U, 0x6a4c2626U, + 0x5a6c3636U, 0x417e3f3fU, 0x02f5f7f7U, 0x4f83ccccU, + 0x5c683434U, 0xf451a5a5U, 0x34d1e5e5U, 0x08f9f1f1U, + 0x93e27171U, 0x73abd8d8U, 0x53623131U, 0x3f2a1515U, + 0x0c080404U, 0x5295c7c7U, 0x65462323U, 0x5e9dc3c3U, + 0x28301818U, 0xa1379696U, 0x0f0a0505U, 0xb52f9a9aU, + 0x090e0707U, 0x36241212U, 0x9b1b8080U, 0x3ddfe2e2U, + 0x26cdebebU, 0x694e2727U, 0xcd7fb2b2U, 0x9fea7575U, + 0x1b120909U, 0x9e1d8383U, 0x74582c2cU, 0x2e341a1aU, + 0x2d361b1bU, 0xb2dc6e6eU, 0xeeb45a5aU, 0xfb5ba0a0U, + 0xf6a45252U, 0x4d763b3bU, 0x61b7d6d6U, 0xce7db3b3U, + 0x7b522929U, 0x3edde3e3U, 0x715e2f2fU, 0x97138484U, + 0xf5a65353U, 0x68b9d1d1U, 0x00000000U, 0x2cc1ededU, + 0x60402020U, 0x1fe3fcfcU, 0xc879b1b1U, 0xedb65b5bU, + 0xbed46a6aU, 0x468dcbcbU, 0xd967bebeU, 0x4b723939U, + 0xde944a4aU, 0xd4984c4cU, 0xe8b05858U, 0x4a85cfcfU, + 0x6bbbd0d0U, 0x2ac5efefU, 0xe54faaaaU, 0x16edfbfbU, + 0xc5864343U, 0xd79a4d4dU, 0x55663333U, 0x94118585U, + 0xcf8a4545U, 0x10e9f9f9U, 0x06040202U, 0x81fe7f7fU, + 0xf0a05050U, 0x44783c3cU, 0xba259f9fU, 0xe34ba8a8U, + 0xf3a25151U, 0xfe5da3a3U, 0xc0804040U, 0x8a058f8fU, + 0xad3f9292U, 0xbc219d9dU, 0x48703838U, 0x04f1f5f5U, + 0xdf63bcbcU, 0xc177b6b6U, 0x75afdadaU, 0x63422121U, + 0x30201010U, 0x1ae5ffffU, 0x0efdf3f3U, 0x6dbfd2d2U, + 0x4c81cdcdU, 0x14180c0cU, 0x35261313U, 0x2fc3ececU, + 0xe1be5f5fU, 0xa2359797U, 0xcc884444U, 0x392e1717U, + 0x5793c4c4U, 0xf255a7a7U, 0x82fc7e7eU, 0x477a3d3dU, + 0xacc86464U, 0xe7ba5d5dU, 0x2b321919U, 0x95e67373U, + 0xa0c06060U, 0x98198181U, 0xd19e4f4fU, 0x7fa3dcdcU, + 0x66442222U, 0x7e542a2aU, 0xab3b9090U, 0x830b8888U, + 0xca8c4646U, 0x29c7eeeeU, 0xd36bb8b8U, 0x3c281414U, + 0x79a7dedeU, 0xe2bc5e5eU, 0x1d160b0bU, 0x76addbdbU, + 0x3bdbe0e0U, 0x56643232U, 0x4e743a3aU, 0x1e140a0aU, + 0xdb924949U, 0x0a0c0606U, 0x6c482424U, 0xe4b85c5cU, + 0x5d9fc2c2U, 0x6ebdd3d3U, 0xef43acacU, 0xa6c46262U, + 0xa8399191U, 0xa4319595U, 0x37d3e4e4U, 0x8bf27979U, + 0x32d5e7e7U, 0x438bc8c8U, 0x596e3737U, 0xb7da6d6dU, + 0x8c018d8dU, 0x64b1d5d5U, 0xd29c4e4eU, 0xe049a9a9U, + 0xb4d86c6cU, 0xfaac5656U, 0x07f3f4f4U, 0x25cfeaeaU, + 0xafca6565U, 0x8ef47a7aU, 0xe947aeaeU, 0x18100808U, + 0xd56fbabaU, 0x88f07878U, 0x6f4a2525U, 0x725c2e2eU, + 0x24381c1cU, 0xf157a6a6U, 0xc773b4b4U, 0x5197c6c6U, + 0x23cbe8e8U, 0x7ca1ddddU, 0x9ce87474U, 0x213e1f1fU, + 0xdd964b4bU, 0xdc61bdbdU, 0x860d8b8bU, 0x850f8a8aU, + 0x90e07070U, 0x427c3e3eU, 0xc471b5b5U, 0xaacc6666U, + 0xd8904848U, 0x05060303U, 0x01f7f6f6U, 0x121c0e0eU, + 0xa3c26161U, 0x5f6a3535U, 0xf9ae5757U, 0xd069b9b9U, + 0x91178686U, 0x5899c1c1U, 0x273a1d1dU, 0xb9279e9eU, + 0x38d9e1e1U, 0x13ebf8f8U, 0xb32b9898U, 0x33221111U, + 0xbbd26969U, 0x70a9d9d9U, 0x89078e8eU, 0xa7339494U, + 0xb62d9b9bU, 0x223c1e1eU, 0x92158787U, 0x20c9e9e9U, + 0x4987ceceU, 0xffaa5555U, 0x78502828U, 0x7aa5dfdfU, + 0x8f038c8cU, 0xf859a1a1U, 0x80098989U, 0x171a0d0dU, + 0xda65bfbfU, 0x31d7e6e6U, 0xc6844242U, 0xb8d06868U, + 0xc3824141U, 0xb0299999U, 0x775a2d2dU, 0x111e0f0fU, + 0xcb7bb0b0U, 0xfca85454U, 0xd66dbbbbU, 0x3a2c1616U, +}; +static const u32 Te2[256] = { + 0x63a5c663U, 0x7c84f87cU, 0x7799ee77U, 0x7b8df67bU, + 0xf20dfff2U, 0x6bbdd66bU, 0x6fb1de6fU, 0xc55491c5U, + 0x30506030U, 0x01030201U, 0x67a9ce67U, 0x2b7d562bU, + 0xfe19e7feU, 0xd762b5d7U, 0xabe64dabU, 0x769aec76U, + 0xca458fcaU, 0x829d1f82U, 0xc94089c9U, 0x7d87fa7dU, + 0xfa15effaU, 0x59ebb259U, 0x47c98e47U, 0xf00bfbf0U, + 0xadec41adU, 0xd467b3d4U, 0xa2fd5fa2U, 0xafea45afU, + 0x9cbf239cU, 0xa4f753a4U, 0x7296e472U, 0xc05b9bc0U, + 0xb7c275b7U, 0xfd1ce1fdU, 0x93ae3d93U, 0x266a4c26U, + 0x365a6c36U, 0x3f417e3fU, 0xf702f5f7U, 0xcc4f83ccU, + 0x345c6834U, 0xa5f451a5U, 0xe534d1e5U, 0xf108f9f1U, + 0x7193e271U, 0xd873abd8U, 0x31536231U, 0x153f2a15U, + 0x040c0804U, 0xc75295c7U, 0x23654623U, 0xc35e9dc3U, + 0x18283018U, 0x96a13796U, 0x050f0a05U, 0x9ab52f9aU, + 0x07090e07U, 0x12362412U, 0x809b1b80U, 0xe23ddfe2U, + 0xeb26cdebU, 0x27694e27U, 0xb2cd7fb2U, 0x759fea75U, + 0x091b1209U, 0x839e1d83U, 0x2c74582cU, 0x1a2e341aU, + 0x1b2d361bU, 0x6eb2dc6eU, 0x5aeeb45aU, 0xa0fb5ba0U, + 0x52f6a452U, 0x3b4d763bU, 0xd661b7d6U, 0xb3ce7db3U, + 0x297b5229U, 0xe33edde3U, 0x2f715e2fU, 0x84971384U, + 0x53f5a653U, 0xd168b9d1U, 0x00000000U, 0xed2cc1edU, + 0x20604020U, 0xfc1fe3fcU, 0xb1c879b1U, 0x5bedb65bU, + 0x6abed46aU, 0xcb468dcbU, 0xbed967beU, 0x394b7239U, + 0x4ade944aU, 0x4cd4984cU, 0x58e8b058U, 0xcf4a85cfU, + 0xd06bbbd0U, 0xef2ac5efU, 0xaae54faaU, 0xfb16edfbU, + 0x43c58643U, 0x4dd79a4dU, 0x33556633U, 0x85941185U, + 0x45cf8a45U, 0xf910e9f9U, 0x02060402U, 0x7f81fe7fU, + 0x50f0a050U, 0x3c44783cU, 0x9fba259fU, 0xa8e34ba8U, + 0x51f3a251U, 0xa3fe5da3U, 0x40c08040U, 0x8f8a058fU, + 0x92ad3f92U, 0x9dbc219dU, 0x38487038U, 0xf504f1f5U, + 0xbcdf63bcU, 0xb6c177b6U, 0xda75afdaU, 0x21634221U, + 0x10302010U, 0xff1ae5ffU, 0xf30efdf3U, 0xd26dbfd2U, + 0xcd4c81cdU, 0x0c14180cU, 0x13352613U, 0xec2fc3ecU, + 0x5fe1be5fU, 0x97a23597U, 0x44cc8844U, 0x17392e17U, + 0xc45793c4U, 0xa7f255a7U, 0x7e82fc7eU, 0x3d477a3dU, + 0x64acc864U, 0x5de7ba5dU, 0x192b3219U, 0x7395e673U, + 0x60a0c060U, 0x81981981U, 0x4fd19e4fU, 0xdc7fa3dcU, + 0x22664422U, 0x2a7e542aU, 0x90ab3b90U, 0x88830b88U, + 0x46ca8c46U, 0xee29c7eeU, 0xb8d36bb8U, 0x143c2814U, + 0xde79a7deU, 0x5ee2bc5eU, 0x0b1d160bU, 0xdb76addbU, + 0xe03bdbe0U, 0x32566432U, 0x3a4e743aU, 0x0a1e140aU, + 0x49db9249U, 0x060a0c06U, 0x246c4824U, 0x5ce4b85cU, + 0xc25d9fc2U, 0xd36ebdd3U, 0xacef43acU, 0x62a6c462U, + 0x91a83991U, 0x95a43195U, 0xe437d3e4U, 0x798bf279U, + 0xe732d5e7U, 0xc8438bc8U, 0x37596e37U, 0x6db7da6dU, + 0x8d8c018dU, 0xd564b1d5U, 0x4ed29c4eU, 0xa9e049a9U, + 0x6cb4d86cU, 0x56faac56U, 0xf407f3f4U, 0xea25cfeaU, + 0x65afca65U, 0x7a8ef47aU, 0xaee947aeU, 0x08181008U, + 0xbad56fbaU, 0x7888f078U, 0x256f4a25U, 0x2e725c2eU, + 0x1c24381cU, 0xa6f157a6U, 0xb4c773b4U, 0xc65197c6U, + 0xe823cbe8U, 0xdd7ca1ddU, 0x749ce874U, 0x1f213e1fU, + 0x4bdd964bU, 0xbddc61bdU, 0x8b860d8bU, 0x8a850f8aU, + 0x7090e070U, 0x3e427c3eU, 0xb5c471b5U, 0x66aacc66U, + 0x48d89048U, 0x03050603U, 0xf601f7f6U, 0x0e121c0eU, + 0x61a3c261U, 0x355f6a35U, 0x57f9ae57U, 0xb9d069b9U, + 0x86911786U, 0xc15899c1U, 0x1d273a1dU, 0x9eb9279eU, + 0xe138d9e1U, 0xf813ebf8U, 0x98b32b98U, 0x11332211U, + 0x69bbd269U, 0xd970a9d9U, 0x8e89078eU, 0x94a73394U, + 0x9bb62d9bU, 0x1e223c1eU, 0x87921587U, 0xe920c9e9U, + 0xce4987ceU, 0x55ffaa55U, 0x28785028U, 0xdf7aa5dfU, + 0x8c8f038cU, 0xa1f859a1U, 0x89800989U, 0x0d171a0dU, + 0xbfda65bfU, 0xe631d7e6U, 0x42c68442U, 0x68b8d068U, + 0x41c38241U, 0x99b02999U, 0x2d775a2dU, 0x0f111e0fU, + 0xb0cb7bb0U, 0x54fca854U, 0xbbd66dbbU, 0x163a2c16U, +}; +static const u32 Te3[256] = { + 0x6363a5c6U, 0x7c7c84f8U, 0x777799eeU, 0x7b7b8df6U, + 0xf2f20dffU, 0x6b6bbdd6U, 0x6f6fb1deU, 0xc5c55491U, + 0x30305060U, 0x01010302U, 0x6767a9ceU, 0x2b2b7d56U, + 0xfefe19e7U, 0xd7d762b5U, 0xababe64dU, 0x76769aecU, + 0xcaca458fU, 0x82829d1fU, 0xc9c94089U, 0x7d7d87faU, + 0xfafa15efU, 0x5959ebb2U, 0x4747c98eU, 0xf0f00bfbU, + 0xadadec41U, 0xd4d467b3U, 0xa2a2fd5fU, 0xafafea45U, + 0x9c9cbf23U, 0xa4a4f753U, 0x727296e4U, 0xc0c05b9bU, + 0xb7b7c275U, 0xfdfd1ce1U, 0x9393ae3dU, 0x26266a4cU, + 0x36365a6cU, 0x3f3f417eU, 0xf7f702f5U, 0xcccc4f83U, + 0x34345c68U, 0xa5a5f451U, 0xe5e534d1U, 0xf1f108f9U, + 0x717193e2U, 0xd8d873abU, 0x31315362U, 0x15153f2aU, + 0x04040c08U, 0xc7c75295U, 0x23236546U, 0xc3c35e9dU, + 0x18182830U, 0x9696a137U, 0x05050f0aU, 0x9a9ab52fU, + 0x0707090eU, 0x12123624U, 0x80809b1bU, 0xe2e23ddfU, + 0xebeb26cdU, 0x2727694eU, 0xb2b2cd7fU, 0x75759feaU, + 0x09091b12U, 0x83839e1dU, 0x2c2c7458U, 0x1a1a2e34U, + 0x1b1b2d36U, 0x6e6eb2dcU, 0x5a5aeeb4U, 0xa0a0fb5bU, + 0x5252f6a4U, 0x3b3b4d76U, 0xd6d661b7U, 0xb3b3ce7dU, + 0x29297b52U, 0xe3e33eddU, 0x2f2f715eU, 0x84849713U, + 0x5353f5a6U, 0xd1d168b9U, 0x00000000U, 0xeded2cc1U, + 0x20206040U, 0xfcfc1fe3U, 0xb1b1c879U, 0x5b5bedb6U, + 0x6a6abed4U, 0xcbcb468dU, 0xbebed967U, 0x39394b72U, + 0x4a4ade94U, 0x4c4cd498U, 0x5858e8b0U, 0xcfcf4a85U, + 0xd0d06bbbU, 0xefef2ac5U, 0xaaaae54fU, 0xfbfb16edU, + 0x4343c586U, 0x4d4dd79aU, 0x33335566U, 0x85859411U, + 0x4545cf8aU, 0xf9f910e9U, 0x02020604U, 0x7f7f81feU, + 0x5050f0a0U, 0x3c3c4478U, 0x9f9fba25U, 0xa8a8e34bU, + 0x5151f3a2U, 0xa3a3fe5dU, 0x4040c080U, 0x8f8f8a05U, + 0x9292ad3fU, 0x9d9dbc21U, 0x38384870U, 0xf5f504f1U, + 0xbcbcdf63U, 0xb6b6c177U, 0xdada75afU, 0x21216342U, + 0x10103020U, 0xffff1ae5U, 0xf3f30efdU, 0xd2d26dbfU, + 0xcdcd4c81U, 0x0c0c1418U, 0x13133526U, 0xecec2fc3U, + 0x5f5fe1beU, 0x9797a235U, 0x4444cc88U, 0x1717392eU, + 0xc4c45793U, 0xa7a7f255U, 0x7e7e82fcU, 0x3d3d477aU, + 0x6464acc8U, 0x5d5de7baU, 0x19192b32U, 0x737395e6U, + 0x6060a0c0U, 0x81819819U, 0x4f4fd19eU, 0xdcdc7fa3U, + 0x22226644U, 0x2a2a7e54U, 0x9090ab3bU, 0x8888830bU, + 0x4646ca8cU, 0xeeee29c7U, 0xb8b8d36bU, 0x14143c28U, + 0xdede79a7U, 0x5e5ee2bcU, 0x0b0b1d16U, 0xdbdb76adU, + 0xe0e03bdbU, 0x32325664U, 0x3a3a4e74U, 0x0a0a1e14U, + 0x4949db92U, 0x06060a0cU, 0x24246c48U, 0x5c5ce4b8U, + 0xc2c25d9fU, 0xd3d36ebdU, 0xacacef43U, 0x6262a6c4U, + 0x9191a839U, 0x9595a431U, 0xe4e437d3U, 0x79798bf2U, + 0xe7e732d5U, 0xc8c8438bU, 0x3737596eU, 0x6d6db7daU, + 0x8d8d8c01U, 0xd5d564b1U, 0x4e4ed29cU, 0xa9a9e049U, + 0x6c6cb4d8U, 0x5656faacU, 0xf4f407f3U, 0xeaea25cfU, + 0x6565afcaU, 0x7a7a8ef4U, 0xaeaee947U, 0x08081810U, + 0xbabad56fU, 0x787888f0U, 0x25256f4aU, 0x2e2e725cU, + 0x1c1c2438U, 0xa6a6f157U, 0xb4b4c773U, 0xc6c65197U, + 0xe8e823cbU, 0xdddd7ca1U, 0x74749ce8U, 0x1f1f213eU, + 0x4b4bdd96U, 0xbdbddc61U, 0x8b8b860dU, 0x8a8a850fU, + 0x707090e0U, 0x3e3e427cU, 0xb5b5c471U, 0x6666aaccU, + 0x4848d890U, 0x03030506U, 0xf6f601f7U, 0x0e0e121cU, + 0x6161a3c2U, 0x35355f6aU, 0x5757f9aeU, 0xb9b9d069U, + 0x86869117U, 0xc1c15899U, 0x1d1d273aU, 0x9e9eb927U, + 0xe1e138d9U, 0xf8f813ebU, 0x9898b32bU, 0x11113322U, + 0x6969bbd2U, 0xd9d970a9U, 0x8e8e8907U, 0x9494a733U, + 0x9b9bb62dU, 0x1e1e223cU, 0x87879215U, 0xe9e920c9U, + 0xcece4987U, 0x5555ffaaU, 0x28287850U, 0xdfdf7aa5U, + 0x8c8c8f03U, 0xa1a1f859U, 0x89898009U, 0x0d0d171aU, + 0xbfbfda65U, 0xe6e631d7U, 0x4242c684U, 0x6868b8d0U, + 0x4141c382U, 0x9999b029U, 0x2d2d775aU, 0x0f0f111eU, + 0xb0b0cb7bU, 0x5454fca8U, 0xbbbbd66dU, 0x16163a2cU, +}; + +static const u32 Td0[256] = { + 0x51f4a750U, 0x7e416553U, 0x1a17a4c3U, 0x3a275e96U, + 0x3bab6bcbU, 0x1f9d45f1U, 0xacfa58abU, 0x4be30393U, + 0x2030fa55U, 0xad766df6U, 0x88cc7691U, 0xf5024c25U, + 0x4fe5d7fcU, 0xc52acbd7U, 0x26354480U, 0xb562a38fU, + 0xdeb15a49U, 0x25ba1b67U, 0x45ea0e98U, 0x5dfec0e1U, + 0xc32f7502U, 0x814cf012U, 0x8d4697a3U, 0x6bd3f9c6U, + 0x038f5fe7U, 0x15929c95U, 0xbf6d7aebU, 0x955259daU, + 0xd4be832dU, 0x587421d3U, 0x49e06929U, 0x8ec9c844U, + 0x75c2896aU, 0xf48e7978U, 0x99583e6bU, 0x27b971ddU, + 0xbee14fb6U, 0xf088ad17U, 0xc920ac66U, 0x7dce3ab4U, + 0x63df4a18U, 0xe51a3182U, 0x97513360U, 0x62537f45U, + 0xb16477e0U, 0xbb6bae84U, 0xfe81a01cU, 0xf9082b94U, + 0x70486858U, 0x8f45fd19U, 0x94de6c87U, 0x527bf8b7U, + 0xab73d323U, 0x724b02e2U, 0xe31f8f57U, 0x6655ab2aU, + 0xb2eb2807U, 0x2fb5c203U, 0x86c57b9aU, 0xd33708a5U, + 0x302887f2U, 0x23bfa5b2U, 0x02036abaU, 0xed16825cU, + 0x8acf1c2bU, 0xa779b492U, 0xf307f2f0U, 0x4e69e2a1U, + 0x65daf4cdU, 0x0605bed5U, 0xd134621fU, 0xc4a6fe8aU, + 0x342e539dU, 0xa2f355a0U, 0x058ae132U, 0xa4f6eb75U, + 0x0b83ec39U, 0x4060efaaU, 0x5e719f06U, 0xbd6e1051U, + 0x3e218af9U, 0x96dd063dU, 0xdd3e05aeU, 0x4de6bd46U, + 0x91548db5U, 0x71c45d05U, 0x0406d46fU, 0x605015ffU, + 0x1998fb24U, 0xd6bde997U, 0x894043ccU, 0x67d99e77U, + 0xb0e842bdU, 0x07898b88U, 0xe7195b38U, 0x79c8eedbU, + 0xa17c0a47U, 0x7c420fe9U, 0xf8841ec9U, 0x00000000U, + 0x09808683U, 0x322bed48U, 0x1e1170acU, 0x6c5a724eU, + 0xfd0efffbU, 0x0f853856U, 0x3daed51eU, 0x362d3927U, + 0x0a0fd964U, 0x685ca621U, 0x9b5b54d1U, 0x24362e3aU, + 0x0c0a67b1U, 0x9357e70fU, 0xb4ee96d2U, 0x1b9b919eU, + 0x80c0c54fU, 0x61dc20a2U, 0x5a774b69U, 0x1c121a16U, + 0xe293ba0aU, 0xc0a02ae5U, 0x3c22e043U, 0x121b171dU, + 0x0e090d0bU, 0xf28bc7adU, 0x2db6a8b9U, 0x141ea9c8U, + 0x57f11985U, 0xaf75074cU, 0xee99ddbbU, 0xa37f60fdU, + 0xf701269fU, 0x5c72f5bcU, 0x44663bc5U, 0x5bfb7e34U, + 0x8b432976U, 0xcb23c6dcU, 0xb6edfc68U, 0xb8e4f163U, + 0xd731dccaU, 0x42638510U, 0x13972240U, 0x84c61120U, + 0x854a247dU, 0xd2bb3df8U, 0xaef93211U, 0xc729a16dU, + 0x1d9e2f4bU, 0xdcb230f3U, 0x0d8652ecU, 0x77c1e3d0U, + 0x2bb3166cU, 0xa970b999U, 0x119448faU, 0x47e96422U, + 0xa8fc8cc4U, 0xa0f03f1aU, 0x567d2cd8U, 0x223390efU, + 0x87494ec7U, 0xd938d1c1U, 0x8ccaa2feU, 0x98d40b36U, + 0xa6f581cfU, 0xa57ade28U, 0xdab78e26U, 0x3fadbfa4U, + 0x2c3a9de4U, 0x5078920dU, 0x6a5fcc9bU, 0x547e4662U, + 0xf68d13c2U, 0x90d8b8e8U, 0x2e39f75eU, 0x82c3aff5U, + 0x9f5d80beU, 0x69d0937cU, 0x6fd52da9U, 0xcf2512b3U, + 0xc8ac993bU, 0x10187da7U, 0xe89c636eU, 0xdb3bbb7bU, + 0xcd267809U, 0x6e5918f4U, 0xec9ab701U, 0x834f9aa8U, + 0xe6956e65U, 0xaaffe67eU, 0x21bccf08U, 0xef15e8e6U, + 0xbae79bd9U, 0x4a6f36ceU, 0xea9f09d4U, 0x29b07cd6U, + 0x31a4b2afU, 0x2a3f2331U, 0xc6a59430U, 0x35a266c0U, + 0x744ebc37U, 0xfc82caa6U, 0xe090d0b0U, 0x33a7d815U, + 0xf104984aU, 0x41ecdaf7U, 0x7fcd500eU, 0x1791f62fU, + 0x764dd68dU, 0x43efb04dU, 0xccaa4d54U, 0xe49604dfU, + 0x9ed1b5e3U, 0x4c6a881bU, 0xc12c1fb8U, 0x4665517fU, + 0x9d5eea04U, 0x018c355dU, 0xfa877473U, 0xfb0b412eU, + 0xb3671d5aU, 0x92dbd252U, 0xe9105633U, 0x6dd64713U, + 0x9ad7618cU, 0x37a10c7aU, 0x59f8148eU, 0xeb133c89U, + 0xcea927eeU, 0xb761c935U, 0xe11ce5edU, 0x7a47b13cU, + 0x9cd2df59U, 0x55f2733fU, 0x1814ce79U, 0x73c737bfU, + 0x53f7cdeaU, 0x5ffdaa5bU, 0xdf3d6f14U, 0x7844db86U, + 0xcaaff381U, 0xb968c43eU, 0x3824342cU, 0xc2a3405fU, + 0x161dc372U, 0xbce2250cU, 0x283c498bU, 0xff0d9541U, + 0x39a80171U, 0x080cb3deU, 0xd8b4e49cU, 0x6456c190U, + 0x7bcb8461U, 0xd532b670U, 0x486c5c74U, 0xd0b85742U, +}; +static const u32 Td1[256] = { + 0x5051f4a7U, 0x537e4165U, 0xc31a17a4U, 0x963a275eU, + 0xcb3bab6bU, 0xf11f9d45U, 0xabacfa58U, 0x934be303U, + 0x552030faU, 0xf6ad766dU, 0x9188cc76U, 0x25f5024cU, + 0xfc4fe5d7U, 0xd7c52acbU, 0x80263544U, 0x8fb562a3U, + 0x49deb15aU, 0x6725ba1bU, 0x9845ea0eU, 0xe15dfec0U, + 0x02c32f75U, 0x12814cf0U, 0xa38d4697U, 0xc66bd3f9U, + 0xe7038f5fU, 0x9515929cU, 0xebbf6d7aU, 0xda955259U, + 0x2dd4be83U, 0xd3587421U, 0x2949e069U, 0x448ec9c8U, + 0x6a75c289U, 0x78f48e79U, 0x6b99583eU, 0xdd27b971U, + 0xb6bee14fU, 0x17f088adU, 0x66c920acU, 0xb47dce3aU, + 0x1863df4aU, 0x82e51a31U, 0x60975133U, 0x4562537fU, + 0xe0b16477U, 0x84bb6baeU, 0x1cfe81a0U, 0x94f9082bU, + 0x58704868U, 0x198f45fdU, 0x8794de6cU, 0xb7527bf8U, + 0x23ab73d3U, 0xe2724b02U, 0x57e31f8fU, 0x2a6655abU, + 0x07b2eb28U, 0x032fb5c2U, 0x9a86c57bU, 0xa5d33708U, + 0xf2302887U, 0xb223bfa5U, 0xba02036aU, 0x5ced1682U, + 0x2b8acf1cU, 0x92a779b4U, 0xf0f307f2U, 0xa14e69e2U, + 0xcd65daf4U, 0xd50605beU, 0x1fd13462U, 0x8ac4a6feU, + 0x9d342e53U, 0xa0a2f355U, 0x32058ae1U, 0x75a4f6ebU, + 0x390b83ecU, 0xaa4060efU, 0x065e719fU, 0x51bd6e10U, + 0xf93e218aU, 0x3d96dd06U, 0xaedd3e05U, 0x464de6bdU, + 0xb591548dU, 0x0571c45dU, 0x6f0406d4U, 0xff605015U, + 0x241998fbU, 0x97d6bde9U, 0xcc894043U, 0x7767d99eU, + 0xbdb0e842U, 0x8807898bU, 0x38e7195bU, 0xdb79c8eeU, + 0x47a17c0aU, 0xe97c420fU, 0xc9f8841eU, 0x00000000U, + 0x83098086U, 0x48322bedU, 0xac1e1170U, 0x4e6c5a72U, + 0xfbfd0effU, 0x560f8538U, 0x1e3daed5U, 0x27362d39U, + 0x640a0fd9U, 0x21685ca6U, 0xd19b5b54U, 0x3a24362eU, + 0xb10c0a67U, 0x0f9357e7U, 0xd2b4ee96U, 0x9e1b9b91U, + 0x4f80c0c5U, 0xa261dc20U, 0x695a774bU, 0x161c121aU, + 0x0ae293baU, 0xe5c0a02aU, 0x433c22e0U, 0x1d121b17U, + 0x0b0e090dU, 0xadf28bc7U, 0xb92db6a8U, 0xc8141ea9U, + 0x8557f119U, 0x4caf7507U, 0xbbee99ddU, 0xfda37f60U, + 0x9ff70126U, 0xbc5c72f5U, 0xc544663bU, 0x345bfb7eU, + 0x768b4329U, 0xdccb23c6U, 0x68b6edfcU, 0x63b8e4f1U, + 0xcad731dcU, 0x10426385U, 0x40139722U, 0x2084c611U, + 0x7d854a24U, 0xf8d2bb3dU, 0x11aef932U, 0x6dc729a1U, + 0x4b1d9e2fU, 0xf3dcb230U, 0xec0d8652U, 0xd077c1e3U, + 0x6c2bb316U, 0x99a970b9U, 0xfa119448U, 0x2247e964U, + 0xc4a8fc8cU, 0x1aa0f03fU, 0xd8567d2cU, 0xef223390U, + 0xc787494eU, 0xc1d938d1U, 0xfe8ccaa2U, 0x3698d40bU, + 0xcfa6f581U, 0x28a57adeU, 0x26dab78eU, 0xa43fadbfU, + 0xe42c3a9dU, 0x0d507892U, 0x9b6a5fccU, 0x62547e46U, + 0xc2f68d13U, 0xe890d8b8U, 0x5e2e39f7U, 0xf582c3afU, + 0xbe9f5d80U, 0x7c69d093U, 0xa96fd52dU, 0xb3cf2512U, + 0x3bc8ac99U, 0xa710187dU, 0x6ee89c63U, 0x7bdb3bbbU, + 0x09cd2678U, 0xf46e5918U, 0x01ec9ab7U, 0xa8834f9aU, + 0x65e6956eU, 0x7eaaffe6U, 0x0821bccfU, 0xe6ef15e8U, + 0xd9bae79bU, 0xce4a6f36U, 0xd4ea9f09U, 0xd629b07cU, + 0xaf31a4b2U, 0x312a3f23U, 0x30c6a594U, 0xc035a266U, + 0x37744ebcU, 0xa6fc82caU, 0xb0e090d0U, 0x1533a7d8U, + 0x4af10498U, 0xf741ecdaU, 0x0e7fcd50U, 0x2f1791f6U, + 0x8d764dd6U, 0x4d43efb0U, 0x54ccaa4dU, 0xdfe49604U, + 0xe39ed1b5U, 0x1b4c6a88U, 0xb8c12c1fU, 0x7f466551U, + 0x049d5eeaU, 0x5d018c35U, 0x73fa8774U, 0x2efb0b41U, + 0x5ab3671dU, 0x5292dbd2U, 0x33e91056U, 0x136dd647U, + 0x8c9ad761U, 0x7a37a10cU, 0x8e59f814U, 0x89eb133cU, + 0xeecea927U, 0x35b761c9U, 0xede11ce5U, 0x3c7a47b1U, + 0x599cd2dfU, 0x3f55f273U, 0x791814ceU, 0xbf73c737U, + 0xea53f7cdU, 0x5b5ffdaaU, 0x14df3d6fU, 0x867844dbU, + 0x81caaff3U, 0x3eb968c4U, 0x2c382434U, 0x5fc2a340U, + 0x72161dc3U, 0x0cbce225U, 0x8b283c49U, 0x41ff0d95U, + 0x7139a801U, 0xde080cb3U, 0x9cd8b4e4U, 0x906456c1U, + 0x617bcb84U, 0x70d532b6U, 0x74486c5cU, 0x42d0b857U, +}; +static const u32 Td2[256] = { + 0xa75051f4U, 0x65537e41U, 0xa4c31a17U, 0x5e963a27U, + 0x6bcb3babU, 0x45f11f9dU, 0x58abacfaU, 0x03934be3U, + 0xfa552030U, 0x6df6ad76U, 0x769188ccU, 0x4c25f502U, + 0xd7fc4fe5U, 0xcbd7c52aU, 0x44802635U, 0xa38fb562U, + 0x5a49deb1U, 0x1b6725baU, 0x0e9845eaU, 0xc0e15dfeU, + 0x7502c32fU, 0xf012814cU, 0x97a38d46U, 0xf9c66bd3U, + 0x5fe7038fU, 0x9c951592U, 0x7aebbf6dU, 0x59da9552U, + 0x832dd4beU, 0x21d35874U, 0x692949e0U, 0xc8448ec9U, + 0x896a75c2U, 0x7978f48eU, 0x3e6b9958U, 0x71dd27b9U, + 0x4fb6bee1U, 0xad17f088U, 0xac66c920U, 0x3ab47dceU, + 0x4a1863dfU, 0x3182e51aU, 0x33609751U, 0x7f456253U, + 0x77e0b164U, 0xae84bb6bU, 0xa01cfe81U, 0x2b94f908U, + 0x68587048U, 0xfd198f45U, 0x6c8794deU, 0xf8b7527bU, + 0xd323ab73U, 0x02e2724bU, 0x8f57e31fU, 0xab2a6655U, + 0x2807b2ebU, 0xc2032fb5U, 0x7b9a86c5U, 0x08a5d337U, + 0x87f23028U, 0xa5b223bfU, 0x6aba0203U, 0x825ced16U, + 0x1c2b8acfU, 0xb492a779U, 0xf2f0f307U, 0xe2a14e69U, + 0xf4cd65daU, 0xbed50605U, 0x621fd134U, 0xfe8ac4a6U, + 0x539d342eU, 0x55a0a2f3U, 0xe132058aU, 0xeb75a4f6U, + 0xec390b83U, 0xefaa4060U, 0x9f065e71U, 0x1051bd6eU, + 0x8af93e21U, 0x063d96ddU, 0x05aedd3eU, 0xbd464de6U, + 0x8db59154U, 0x5d0571c4U, 0xd46f0406U, 0x15ff6050U, + 0xfb241998U, 0xe997d6bdU, 0x43cc8940U, 0x9e7767d9U, + 0x42bdb0e8U, 0x8b880789U, 0x5b38e719U, 0xeedb79c8U, + 0x0a47a17cU, 0x0fe97c42U, 0x1ec9f884U, 0x00000000U, + 0x86830980U, 0xed48322bU, 0x70ac1e11U, 0x724e6c5aU, + 0xfffbfd0eU, 0x38560f85U, 0xd51e3daeU, 0x3927362dU, + 0xd9640a0fU, 0xa621685cU, 0x54d19b5bU, 0x2e3a2436U, + 0x67b10c0aU, 0xe70f9357U, 0x96d2b4eeU, 0x919e1b9bU, + 0xc54f80c0U, 0x20a261dcU, 0x4b695a77U, 0x1a161c12U, + 0xba0ae293U, 0x2ae5c0a0U, 0xe0433c22U, 0x171d121bU, + 0x0d0b0e09U, 0xc7adf28bU, 0xa8b92db6U, 0xa9c8141eU, + 0x198557f1U, 0x074caf75U, 0xddbbee99U, 0x60fda37fU, + 0x269ff701U, 0xf5bc5c72U, 0x3bc54466U, 0x7e345bfbU, + 0x29768b43U, 0xc6dccb23U, 0xfc68b6edU, 0xf163b8e4U, + 0xdccad731U, 0x85104263U, 0x22401397U, 0x112084c6U, + 0x247d854aU, 0x3df8d2bbU, 0x3211aef9U, 0xa16dc729U, + 0x2f4b1d9eU, 0x30f3dcb2U, 0x52ec0d86U, 0xe3d077c1U, + 0x166c2bb3U, 0xb999a970U, 0x48fa1194U, 0x642247e9U, + 0x8cc4a8fcU, 0x3f1aa0f0U, 0x2cd8567dU, 0x90ef2233U, + 0x4ec78749U, 0xd1c1d938U, 0xa2fe8ccaU, 0x0b3698d4U, + 0x81cfa6f5U, 0xde28a57aU, 0x8e26dab7U, 0xbfa43fadU, + 0x9de42c3aU, 0x920d5078U, 0xcc9b6a5fU, 0x4662547eU, + 0x13c2f68dU, 0xb8e890d8U, 0xf75e2e39U, 0xaff582c3U, + 0x80be9f5dU, 0x937c69d0U, 0x2da96fd5U, 0x12b3cf25U, + 0x993bc8acU, 0x7da71018U, 0x636ee89cU, 0xbb7bdb3bU, + 0x7809cd26U, 0x18f46e59U, 0xb701ec9aU, 0x9aa8834fU, + 0x6e65e695U, 0xe67eaaffU, 0xcf0821bcU, 0xe8e6ef15U, + 0x9bd9bae7U, 0x36ce4a6fU, 0x09d4ea9fU, 0x7cd629b0U, + 0xb2af31a4U, 0x23312a3fU, 0x9430c6a5U, 0x66c035a2U, + 0xbc37744eU, 0xcaa6fc82U, 0xd0b0e090U, 0xd81533a7U, + 0x984af104U, 0xdaf741ecU, 0x500e7fcdU, 0xf62f1791U, + 0xd68d764dU, 0xb04d43efU, 0x4d54ccaaU, 0x04dfe496U, + 0xb5e39ed1U, 0x881b4c6aU, 0x1fb8c12cU, 0x517f4665U, + 0xea049d5eU, 0x355d018cU, 0x7473fa87U, 0x412efb0bU, + 0x1d5ab367U, 0xd25292dbU, 0x5633e910U, 0x47136dd6U, + 0x618c9ad7U, 0x0c7a37a1U, 0x148e59f8U, 0x3c89eb13U, + 0x27eecea9U, 0xc935b761U, 0xe5ede11cU, 0xb13c7a47U, + 0xdf599cd2U, 0x733f55f2U, 0xce791814U, 0x37bf73c7U, + 0xcdea53f7U, 0xaa5b5ffdU, 0x6f14df3dU, 0xdb867844U, + 0xf381caafU, 0xc43eb968U, 0x342c3824U, 0x405fc2a3U, + 0xc372161dU, 0x250cbce2U, 0x498b283cU, 0x9541ff0dU, + 0x017139a8U, 0xb3de080cU, 0xe49cd8b4U, 0xc1906456U, + 0x84617bcbU, 0xb670d532U, 0x5c74486cU, 0x5742d0b8U, +}; +static const u32 Td3[256] = { + 0xf4a75051U, 0x4165537eU, 0x17a4c31aU, 0x275e963aU, + 0xab6bcb3bU, 0x9d45f11fU, 0xfa58abacU, 0xe303934bU, + 0x30fa5520U, 0x766df6adU, 0xcc769188U, 0x024c25f5U, + 0xe5d7fc4fU, 0x2acbd7c5U, 0x35448026U, 0x62a38fb5U, + 0xb15a49deU, 0xba1b6725U, 0xea0e9845U, 0xfec0e15dU, + 0x2f7502c3U, 0x4cf01281U, 0x4697a38dU, 0xd3f9c66bU, + 0x8f5fe703U, 0x929c9515U, 0x6d7aebbfU, 0x5259da95U, + 0xbe832dd4U, 0x7421d358U, 0xe0692949U, 0xc9c8448eU, + 0xc2896a75U, 0x8e7978f4U, 0x583e6b99U, 0xb971dd27U, + 0xe14fb6beU, 0x88ad17f0U, 0x20ac66c9U, 0xce3ab47dU, + 0xdf4a1863U, 0x1a3182e5U, 0x51336097U, 0x537f4562U, + 0x6477e0b1U, 0x6bae84bbU, 0x81a01cfeU, 0x082b94f9U, + 0x48685870U, 0x45fd198fU, 0xde6c8794U, 0x7bf8b752U, + 0x73d323abU, 0x4b02e272U, 0x1f8f57e3U, 0x55ab2a66U, + 0xeb2807b2U, 0xb5c2032fU, 0xc57b9a86U, 0x3708a5d3U, + 0x2887f230U, 0xbfa5b223U, 0x036aba02U, 0x16825cedU, + 0xcf1c2b8aU, 0x79b492a7U, 0x07f2f0f3U, 0x69e2a14eU, + 0xdaf4cd65U, 0x05bed506U, 0x34621fd1U, 0xa6fe8ac4U, + 0x2e539d34U, 0xf355a0a2U, 0x8ae13205U, 0xf6eb75a4U, + 0x83ec390bU, 0x60efaa40U, 0x719f065eU, 0x6e1051bdU, + 0x218af93eU, 0xdd063d96U, 0x3e05aeddU, 0xe6bd464dU, + 0x548db591U, 0xc45d0571U, 0x06d46f04U, 0x5015ff60U, + 0x98fb2419U, 0xbde997d6U, 0x4043cc89U, 0xd99e7767U, + 0xe842bdb0U, 0x898b8807U, 0x195b38e7U, 0xc8eedb79U, + 0x7c0a47a1U, 0x420fe97cU, 0x841ec9f8U, 0x00000000U, + 0x80868309U, 0x2bed4832U, 0x1170ac1eU, 0x5a724e6cU, + 0x0efffbfdU, 0x8538560fU, 0xaed51e3dU, 0x2d392736U, + 0x0fd9640aU, 0x5ca62168U, 0x5b54d19bU, 0x362e3a24U, + 0x0a67b10cU, 0x57e70f93U, 0xee96d2b4U, 0x9b919e1bU, + 0xc0c54f80U, 0xdc20a261U, 0x774b695aU, 0x121a161cU, + 0x93ba0ae2U, 0xa02ae5c0U, 0x22e0433cU, 0x1b171d12U, + 0x090d0b0eU, 0x8bc7adf2U, 0xb6a8b92dU, 0x1ea9c814U, + 0xf1198557U, 0x75074cafU, 0x99ddbbeeU, 0x7f60fda3U, + 0x01269ff7U, 0x72f5bc5cU, 0x663bc544U, 0xfb7e345bU, + 0x4329768bU, 0x23c6dccbU, 0xedfc68b6U, 0xe4f163b8U, + 0x31dccad7U, 0x63851042U, 0x97224013U, 0xc6112084U, + 0x4a247d85U, 0xbb3df8d2U, 0xf93211aeU, 0x29a16dc7U, + 0x9e2f4b1dU, 0xb230f3dcU, 0x8652ec0dU, 0xc1e3d077U, + 0xb3166c2bU, 0x70b999a9U, 0x9448fa11U, 0xe9642247U, + 0xfc8cc4a8U, 0xf03f1aa0U, 0x7d2cd856U, 0x3390ef22U, + 0x494ec787U, 0x38d1c1d9U, 0xcaa2fe8cU, 0xd40b3698U, + 0xf581cfa6U, 0x7ade28a5U, 0xb78e26daU, 0xadbfa43fU, + 0x3a9de42cU, 0x78920d50U, 0x5fcc9b6aU, 0x7e466254U, + 0x8d13c2f6U, 0xd8b8e890U, 0x39f75e2eU, 0xc3aff582U, + 0x5d80be9fU, 0xd0937c69U, 0xd52da96fU, 0x2512b3cfU, + 0xac993bc8U, 0x187da710U, 0x9c636ee8U, 0x3bbb7bdbU, + 0x267809cdU, 0x5918f46eU, 0x9ab701ecU, 0x4f9aa883U, + 0x956e65e6U, 0xffe67eaaU, 0xbccf0821U, 0x15e8e6efU, + 0xe79bd9baU, 0x6f36ce4aU, 0x9f09d4eaU, 0xb07cd629U, + 0xa4b2af31U, 0x3f23312aU, 0xa59430c6U, 0xa266c035U, + 0x4ebc3774U, 0x82caa6fcU, 0x90d0b0e0U, 0xa7d81533U, + 0x04984af1U, 0xecdaf741U, 0xcd500e7fU, 0x91f62f17U, + 0x4dd68d76U, 0xefb04d43U, 0xaa4d54ccU, 0x9604dfe4U, + 0xd1b5e39eU, 0x6a881b4cU, 0x2c1fb8c1U, 0x65517f46U, + 0x5eea049dU, 0x8c355d01U, 0x877473faU, 0x0b412efbU, + 0x671d5ab3U, 0xdbd25292U, 0x105633e9U, 0xd647136dU, + 0xd7618c9aU, 0xa10c7a37U, 0xf8148e59U, 0x133c89ebU, + 0xa927eeceU, 0x61c935b7U, 0x1ce5ede1U, 0x47b13c7aU, + 0xd2df599cU, 0xf2733f55U, 0x14ce7918U, 0xc737bf73U, + 0xf7cdea53U, 0xfdaa5b5fU, 0x3d6f14dfU, 0x44db8678U, + 0xaff381caU, 0x68c43eb9U, 0x24342c38U, 0xa3405fc2U, + 0x1dc37216U, 0xe2250cbcU, 0x3c498b28U, 0x0d9541ffU, + 0xa8017139U, 0x0cb3de08U, 0xb4e49cd8U, 0x56c19064U, + 0xcb84617bU, 0x32b670d5U, 0x6c5c7448U, 0xb85742d0U, +}; +static const u8 Td4[256] = { + 0x52U, 0x09U, 0x6aU, 0xd5U, 0x30U, 0x36U, 0xa5U, 0x38U, + 0xbfU, 0x40U, 0xa3U, 0x9eU, 0x81U, 0xf3U, 0xd7U, 0xfbU, + 0x7cU, 0xe3U, 0x39U, 0x82U, 0x9bU, 0x2fU, 0xffU, 0x87U, + 0x34U, 0x8eU, 0x43U, 0x44U, 0xc4U, 0xdeU, 0xe9U, 0xcbU, + 0x54U, 0x7bU, 0x94U, 0x32U, 0xa6U, 0xc2U, 0x23U, 0x3dU, + 0xeeU, 0x4cU, 0x95U, 0x0bU, 0x42U, 0xfaU, 0xc3U, 0x4eU, + 0x08U, 0x2eU, 0xa1U, 0x66U, 0x28U, 0xd9U, 0x24U, 0xb2U, + 0x76U, 0x5bU, 0xa2U, 0x49U, 0x6dU, 0x8bU, 0xd1U, 0x25U, + 0x72U, 0xf8U, 0xf6U, 0x64U, 0x86U, 0x68U, 0x98U, 0x16U, + 0xd4U, 0xa4U, 0x5cU, 0xccU, 0x5dU, 0x65U, 0xb6U, 0x92U, + 0x6cU, 0x70U, 0x48U, 0x50U, 0xfdU, 0xedU, 0xb9U, 0xdaU, + 0x5eU, 0x15U, 0x46U, 0x57U, 0xa7U, 0x8dU, 0x9dU, 0x84U, + 0x90U, 0xd8U, 0xabU, 0x00U, 0x8cU, 0xbcU, 0xd3U, 0x0aU, + 0xf7U, 0xe4U, 0x58U, 0x05U, 0xb8U, 0xb3U, 0x45U, 0x06U, + 0xd0U, 0x2cU, 0x1eU, 0x8fU, 0xcaU, 0x3fU, 0x0fU, 0x02U, + 0xc1U, 0xafU, 0xbdU, 0x03U, 0x01U, 0x13U, 0x8aU, 0x6bU, + 0x3aU, 0x91U, 0x11U, 0x41U, 0x4fU, 0x67U, 0xdcU, 0xeaU, + 0x97U, 0xf2U, 0xcfU, 0xceU, 0xf0U, 0xb4U, 0xe6U, 0x73U, + 0x96U, 0xacU, 0x74U, 0x22U, 0xe7U, 0xadU, 0x35U, 0x85U, + 0xe2U, 0xf9U, 0x37U, 0xe8U, 0x1cU, 0x75U, 0xdfU, 0x6eU, + 0x47U, 0xf1U, 0x1aU, 0x71U, 0x1dU, 0x29U, 0xc5U, 0x89U, + 0x6fU, 0xb7U, 0x62U, 0x0eU, 0xaaU, 0x18U, 0xbeU, 0x1bU, + 0xfcU, 0x56U, 0x3eU, 0x4bU, 0xc6U, 0xd2U, 0x79U, 0x20U, + 0x9aU, 0xdbU, 0xc0U, 0xfeU, 0x78U, 0xcdU, 0x5aU, 0xf4U, + 0x1fU, 0xddU, 0xa8U, 0x33U, 0x88U, 0x07U, 0xc7U, 0x31U, + 0xb1U, 0x12U, 0x10U, 0x59U, 0x27U, 0x80U, 0xecU, 0x5fU, + 0x60U, 0x51U, 0x7fU, 0xa9U, 0x19U, 0xb5U, 0x4aU, 0x0dU, + 0x2dU, 0xe5U, 0x7aU, 0x9fU, 0x93U, 0xc9U, 0x9cU, 0xefU, + 0xa0U, 0xe0U, 0x3bU, 0x4dU, 0xaeU, 0x2aU, 0xf5U, 0xb0U, + 0xc8U, 0xebU, 0xbbU, 0x3cU, 0x83U, 0x53U, 0x99U, 0x61U, + 0x17U, 0x2bU, 0x04U, 0x7eU, 0xbaU, 0x77U, 0xd6U, 0x26U, + 0xe1U, 0x69U, 0x14U, 0x63U, 0x55U, 0x21U, 0x0cU, 0x7dU, +}; +static const u32 rcon[] = { + 0x01000000, 0x02000000, 0x04000000, 0x08000000, + 0x10000000, 0x20000000, 0x40000000, 0x80000000, + 0x1B000000, 0x36000000, /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */ +}; + +/** + * Expand the cipher key into the encryption key schedule. + */ +int AES_set_encrypt_key(const unsigned char *userKey, const int bits, + AES_KEY *key) { + + u32 *rk; + int i = 0; + u32 temp; + + if (!userKey || !key) + return -1; + if (bits != 128 && bits != 192 && bits != 256) + return -2; + + rk = key->rd_key; + + if (bits==128) + key->rounds = 10; + else if (bits==192) + key->rounds = 12; + else + key->rounds = 14; + + rk[0] = GETU32(userKey ); + rk[1] = GETU32(userKey + 4); + rk[2] = GETU32(userKey + 8); + rk[3] = GETU32(userKey + 12); + if (bits == 128) { + while (1) { + temp = rk[3]; + rk[4] = rk[0] ^ + (Te2[(temp >> 16) & 0xff] & 0xff000000) ^ + (Te3[(temp >> 8) & 0xff] & 0x00ff0000) ^ + (Te0[(temp ) & 0xff] & 0x0000ff00) ^ + (Te1[(temp >> 24) ] & 0x000000ff) ^ + rcon[i]; + rk[5] = rk[1] ^ rk[4]; + rk[6] = rk[2] ^ rk[5]; + rk[7] = rk[3] ^ rk[6]; + if (++i == 10) { + return 0; + } + rk += 4; + } + } + rk[4] = GETU32(userKey + 16); + rk[5] = GETU32(userKey + 20); + if (bits == 192) { + while (1) { + temp = rk[ 5]; + rk[ 6] = rk[ 0] ^ + (Te2[(temp >> 16) & 0xff] & 0xff000000) ^ + (Te3[(temp >> 8) & 0xff] & 0x00ff0000) ^ + (Te0[(temp ) & 0xff] & 0x0000ff00) ^ + (Te1[(temp >> 24) ] & 0x000000ff) ^ + rcon[i]; + rk[ 7] = rk[ 1] ^ rk[ 6]; + rk[ 8] = rk[ 2] ^ rk[ 7]; + rk[ 9] = rk[ 3] ^ rk[ 8]; + if (++i == 8) { + return 0; + } + rk[10] = rk[ 4] ^ rk[ 9]; + rk[11] = rk[ 5] ^ rk[10]; + rk += 6; + } + } + rk[6] = GETU32(userKey + 24); + rk[7] = GETU32(userKey + 28); + if (bits == 256) { + while (1) { + temp = rk[ 7]; + rk[ 8] = rk[ 0] ^ + (Te2[(temp >> 16) & 0xff] & 0xff000000) ^ + (Te3[(temp >> 8) & 0xff] & 0x00ff0000) ^ + (Te0[(temp ) & 0xff] & 0x0000ff00) ^ + (Te1[(temp >> 24) ] & 0x000000ff) ^ + rcon[i]; + rk[ 9] = rk[ 1] ^ rk[ 8]; + rk[10] = rk[ 2] ^ rk[ 9]; + rk[11] = rk[ 3] ^ rk[10]; + if (++i == 7) { + return 0; + } + temp = rk[11]; + rk[12] = rk[ 4] ^ + (Te2[(temp >> 24) ] & 0xff000000) ^ + (Te3[(temp >> 16) & 0xff] & 0x00ff0000) ^ + (Te0[(temp >> 8) & 0xff] & 0x0000ff00) ^ + (Te1[(temp ) & 0xff] & 0x000000ff); + rk[13] = rk[ 5] ^ rk[12]; + rk[14] = rk[ 6] ^ rk[13]; + rk[15] = rk[ 7] ^ rk[14]; + + rk += 8; + } + } + return 0; +} + +/** + * Expand the cipher key into the decryption key schedule. + */ +int AES_set_decrypt_key(const unsigned char *userKey, const int bits, + AES_KEY *key) { + + u32 *rk; + int i, j, status; + u32 temp; + + /* first, start with an encryption schedule */ + status = AES_set_encrypt_key(userKey, bits, key); + if (status < 0) + return status; + + rk = key->rd_key; + + /* invert the order of the round keys: */ + for (i = 0, j = 4*(key->rounds); i < j; i += 4, j -= 4) { + temp = rk[i ]; rk[i ] = rk[j ]; rk[j ] = temp; + temp = rk[i + 1]; rk[i + 1] = rk[j + 1]; rk[j + 1] = temp; + temp = rk[i + 2]; rk[i + 2] = rk[j + 2]; rk[j + 2] = temp; + temp = rk[i + 3]; rk[i + 3] = rk[j + 3]; rk[j + 3] = temp; + } + /* apply the inverse MixColumn transform to all round keys but the first and the last: */ + for (i = 1; i < (key->rounds); i++) { + rk += 4; + rk[0] = + Td0[Te1[(rk[0] >> 24) ] & 0xff] ^ + Td1[Te1[(rk[0] >> 16) & 0xff] & 0xff] ^ + Td2[Te1[(rk[0] >> 8) & 0xff] & 0xff] ^ + Td3[Te1[(rk[0] ) & 0xff] & 0xff]; + rk[1] = + Td0[Te1[(rk[1] >> 24) ] & 0xff] ^ + Td1[Te1[(rk[1] >> 16) & 0xff] & 0xff] ^ + Td2[Te1[(rk[1] >> 8) & 0xff] & 0xff] ^ + Td3[Te1[(rk[1] ) & 0xff] & 0xff]; + rk[2] = + Td0[Te1[(rk[2] >> 24) ] & 0xff] ^ + Td1[Te1[(rk[2] >> 16) & 0xff] & 0xff] ^ + Td2[Te1[(rk[2] >> 8) & 0xff] & 0xff] ^ + Td3[Te1[(rk[2] ) & 0xff] & 0xff]; + rk[3] = + Td0[Te1[(rk[3] >> 24) ] & 0xff] ^ + Td1[Te1[(rk[3] >> 16) & 0xff] & 0xff] ^ + Td2[Te1[(rk[3] >> 8) & 0xff] & 0xff] ^ + Td3[Te1[(rk[3] ) & 0xff] & 0xff]; + } + return 0; +} + +#ifndef AES_ASM +/* + * Encrypt a single block + * in and out can overlap + */ +void AES_encrypt(const unsigned char *in, unsigned char *out, + const AES_KEY *key) { + + const u32 *rk; + u32 s0, s1, s2, s3, t0, t1, t2, t3; +#ifndef FULL_UNROLL + int r; +#endif /* ?FULL_UNROLL */ + + assert(in && out && key); + rk = key->rd_key; + + /* + * map byte array block to cipher state + * and add initial round key: + */ + s0 = GETU32(in ) ^ rk[0]; + s1 = GETU32(in + 4) ^ rk[1]; + s2 = GETU32(in + 8) ^ rk[2]; + s3 = GETU32(in + 12) ^ rk[3]; +#ifdef FULL_UNROLL + /* round 1: */ + t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[ 4]; + t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[ 5]; + t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[ 6]; + t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[ 7]; + /* round 2: */ + s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[ 8]; + s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[ 9]; + s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[10]; + s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[11]; + /* round 3: */ + t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[12]; + t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[13]; + t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[14]; + t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[15]; + /* round 4: */ + s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[16]; + s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[17]; + s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[18]; + s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[19]; + /* round 5: */ + t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[20]; + t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[21]; + t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[22]; + t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[23]; + /* round 6: */ + s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[24]; + s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[25]; + s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[26]; + s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[27]; + /* round 7: */ + t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[28]; + t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[29]; + t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[30]; + t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[31]; + /* round 8: */ + s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[32]; + s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[33]; + s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[34]; + s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[35]; + /* round 9: */ + t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[36]; + t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[37]; + t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[38]; + t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[39]; + if (key->rounds > 10) { + /* round 10: */ + s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[40]; + s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[41]; + s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[42]; + s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[43]; + /* round 11: */ + t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[44]; + t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[45]; + t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[46]; + t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[47]; + if (key->rounds > 12) { + /* round 12: */ + s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[48]; + s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[49]; + s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[50]; + s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[51]; + /* round 13: */ + t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[52]; + t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[53]; + t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[54]; + t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[55]; + } + } + rk += key->rounds << 2; +#else /* !FULL_UNROLL */ + /* + * Nr - 1 full rounds: + */ + r = key->rounds >> 1; + for (;;) { + t0 = + Te0[(s0 >> 24) ] ^ + Te1[(s1 >> 16) & 0xff] ^ + Te2[(s2 >> 8) & 0xff] ^ + Te3[(s3 ) & 0xff] ^ + rk[4]; + t1 = + Te0[(s1 >> 24) ] ^ + Te1[(s2 >> 16) & 0xff] ^ + Te2[(s3 >> 8) & 0xff] ^ + Te3[(s0 ) & 0xff] ^ + rk[5]; + t2 = + Te0[(s2 >> 24) ] ^ + Te1[(s3 >> 16) & 0xff] ^ + Te2[(s0 >> 8) & 0xff] ^ + Te3[(s1 ) & 0xff] ^ + rk[6]; + t3 = + Te0[(s3 >> 24) ] ^ + Te1[(s0 >> 16) & 0xff] ^ + Te2[(s1 >> 8) & 0xff] ^ + Te3[(s2 ) & 0xff] ^ + rk[7]; + + rk += 8; + if (--r == 0) { + break; + } + + s0 = + Te0[(t0 >> 24) ] ^ + Te1[(t1 >> 16) & 0xff] ^ + Te2[(t2 >> 8) & 0xff] ^ + Te3[(t3 ) & 0xff] ^ + rk[0]; + s1 = + Te0[(t1 >> 24) ] ^ + Te1[(t2 >> 16) & 0xff] ^ + Te2[(t3 >> 8) & 0xff] ^ + Te3[(t0 ) & 0xff] ^ + rk[1]; + s2 = + Te0[(t2 >> 24) ] ^ + Te1[(t3 >> 16) & 0xff] ^ + Te2[(t0 >> 8) & 0xff] ^ + Te3[(t1 ) & 0xff] ^ + rk[2]; + s3 = + Te0[(t3 >> 24) ] ^ + Te1[(t0 >> 16) & 0xff] ^ + Te2[(t1 >> 8) & 0xff] ^ + Te3[(t2 ) & 0xff] ^ + rk[3]; + } +#endif /* ?FULL_UNROLL */ + /* + * apply last round and + * map cipher state to byte array block: + */ + s0 = + (Te2[(t0 >> 24) ] & 0xff000000) ^ + (Te3[(t1 >> 16) & 0xff] & 0x00ff0000) ^ + (Te0[(t2 >> 8) & 0xff] & 0x0000ff00) ^ + (Te1[(t3 ) & 0xff] & 0x000000ff) ^ + rk[0]; + PUTU32(out , s0); + s1 = + (Te2[(t1 >> 24) ] & 0xff000000) ^ + (Te3[(t2 >> 16) & 0xff] & 0x00ff0000) ^ + (Te0[(t3 >> 8) & 0xff] & 0x0000ff00) ^ + (Te1[(t0 ) & 0xff] & 0x000000ff) ^ + rk[1]; + PUTU32(out + 4, s1); + s2 = + (Te2[(t2 >> 24) ] & 0xff000000) ^ + (Te3[(t3 >> 16) & 0xff] & 0x00ff0000) ^ + (Te0[(t0 >> 8) & 0xff] & 0x0000ff00) ^ + (Te1[(t1 ) & 0xff] & 0x000000ff) ^ + rk[2]; + PUTU32(out + 8, s2); + s3 = + (Te2[(t3 >> 24) ] & 0xff000000) ^ + (Te3[(t0 >> 16) & 0xff] & 0x00ff0000) ^ + (Te0[(t1 >> 8) & 0xff] & 0x0000ff00) ^ + (Te1[(t2 ) & 0xff] & 0x000000ff) ^ + rk[3]; + PUTU32(out + 12, s3); +} + +/* + * Decrypt a single block + * in and out can overlap + */ +void AES_decrypt(const unsigned char *in, unsigned char *out, + const AES_KEY *key) { + + const u32 *rk; + u32 s0, s1, s2, s3, t0, t1, t2, t3; +#ifndef FULL_UNROLL + int r; +#endif /* ?FULL_UNROLL */ + + assert(in && out && key); + rk = key->rd_key; + + /* + * map byte array block to cipher state + * and add initial round key: + */ + s0 = GETU32(in ) ^ rk[0]; + s1 = GETU32(in + 4) ^ rk[1]; + s2 = GETU32(in + 8) ^ rk[2]; + s3 = GETU32(in + 12) ^ rk[3]; +#ifdef FULL_UNROLL + /* round 1: */ + t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[ 4]; + t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[ 5]; + t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[ 6]; + t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[ 7]; + /* round 2: */ + s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[ 8]; + s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[ 9]; + s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[10]; + s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[11]; + /* round 3: */ + t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[12]; + t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[13]; + t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[14]; + t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[15]; + /* round 4: */ + s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[16]; + s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[17]; + s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[18]; + s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[19]; + /* round 5: */ + t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[20]; + t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[21]; + t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[22]; + t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[23]; + /* round 6: */ + s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[24]; + s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[25]; + s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[26]; + s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[27]; + /* round 7: */ + t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[28]; + t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[29]; + t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[30]; + t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[31]; + /* round 8: */ + s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[32]; + s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[33]; + s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[34]; + s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[35]; + /* round 9: */ + t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[36]; + t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[37]; + t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[38]; + t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[39]; + if (key->rounds > 10) { + /* round 10: */ + s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[40]; + s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[41]; + s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[42]; + s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[43]; + /* round 11: */ + t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[44]; + t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[45]; + t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[46]; + t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[47]; + if (key->rounds > 12) { + /* round 12: */ + s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[48]; + s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[49]; + s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[50]; + s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[51]; + /* round 13: */ + t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[52]; + t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[53]; + t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[54]; + t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[55]; + } + } + rk += key->rounds << 2; +#else /* !FULL_UNROLL */ + /* + * Nr - 1 full rounds: + */ + r = key->rounds >> 1; + for (;;) { + t0 = + Td0[(s0 >> 24) ] ^ + Td1[(s3 >> 16) & 0xff] ^ + Td2[(s2 >> 8) & 0xff] ^ + Td3[(s1 ) & 0xff] ^ + rk[4]; + t1 = + Td0[(s1 >> 24) ] ^ + Td1[(s0 >> 16) & 0xff] ^ + Td2[(s3 >> 8) & 0xff] ^ + Td3[(s2 ) & 0xff] ^ + rk[5]; + t2 = + Td0[(s2 >> 24) ] ^ + Td1[(s1 >> 16) & 0xff] ^ + Td2[(s0 >> 8) & 0xff] ^ + Td3[(s3 ) & 0xff] ^ + rk[6]; + t3 = + Td0[(s3 >> 24) ] ^ + Td1[(s2 >> 16) & 0xff] ^ + Td2[(s1 >> 8) & 0xff] ^ + Td3[(s0 ) & 0xff] ^ + rk[7]; + + rk += 8; + if (--r == 0) { + break; + } + + s0 = + Td0[(t0 >> 24) ] ^ + Td1[(t3 >> 16) & 0xff] ^ + Td2[(t2 >> 8) & 0xff] ^ + Td3[(t1 ) & 0xff] ^ + rk[0]; + s1 = + Td0[(t1 >> 24) ] ^ + Td1[(t0 >> 16) & 0xff] ^ + Td2[(t3 >> 8) & 0xff] ^ + Td3[(t2 ) & 0xff] ^ + rk[1]; + s2 = + Td0[(t2 >> 24) ] ^ + Td1[(t1 >> 16) & 0xff] ^ + Td2[(t0 >> 8) & 0xff] ^ + Td3[(t3 ) & 0xff] ^ + rk[2]; + s3 = + Td0[(t3 >> 24) ] ^ + Td1[(t2 >> 16) & 0xff] ^ + Td2[(t1 >> 8) & 0xff] ^ + Td3[(t0 ) & 0xff] ^ + rk[3]; + } +#endif /* ?FULL_UNROLL */ + /* + * apply last round and + * map cipher state to byte array block: + */ + s0 = + (Td4[(t0 >> 24) ] << 24) ^ + (Td4[(t3 >> 16) & 0xff] << 16) ^ + (Td4[(t2 >> 8) & 0xff] << 8) ^ + (Td4[(t1 ) & 0xff]) ^ + rk[0]; + PUTU32(out , s0); + s1 = + (Td4[(t1 >> 24) ] << 24) ^ + (Td4[(t0 >> 16) & 0xff] << 16) ^ + (Td4[(t3 >> 8) & 0xff] << 8) ^ + (Td4[(t2 ) & 0xff]) ^ + rk[1]; + PUTU32(out + 4, s1); + s2 = + (Td4[(t2 >> 24) ] << 24) ^ + (Td4[(t1 >> 16) & 0xff] << 16) ^ + (Td4[(t0 >> 8) & 0xff] << 8) ^ + (Td4[(t3 ) & 0xff]) ^ + rk[2]; + PUTU32(out + 8, s2); + s3 = + (Td4[(t3 >> 24) ] << 24) ^ + (Td4[(t2 >> 16) & 0xff] << 16) ^ + (Td4[(t1 >> 8) & 0xff] << 8) ^ + (Td4[(t0 ) & 0xff]) ^ + rk[3]; + PUTU32(out + 12, s3); +} + +#endif /* AES_ASM */ diff --git a/Source/Core/DiscIO/Src/AES/aes_locl.h b/Source/Core/DiscIO/Src/AES/aes_locl.h new file mode 100644 index 0000000000..c222ed744b --- /dev/null +++ b/Source/Core/DiscIO/Src/AES/aes_locl.h @@ -0,0 +1,88 @@ +/* crypto/aes/aes.h -*- mode:C; c-file-style: "eay" -*- */ +/* ==================================================================== + * Copyright (c) 1998-2002 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + */ + +#ifndef HEADER_AES_LOCL_H +#define HEADER_AES_LOCL_H + + +#ifdef OPENSSL_NO_AES +#error AES is disabled. +#endif + +#include +#include +#include + +#if defined (_MSC_VER) && (defined (_M_IX86) || defined (_M_AMD64) || defined (_M_X64)) +# define SWAP(x) (_lrotl(x, 8) & 0x00ff00ff | _lrotr(x, 8) & 0xff00ff00) +# define GETU32(p) SWAP(*((u32*)(p))) +# define PUTU32(ct, st) {*((u32*)(ct)) = SWAP((st));} +#else +# define GETU32(pt) (((u32)(pt)[0] << 24) ^ ((u32)(pt)[1] << 16) ^ ((u32)(pt)[2] << 8) ^ ((u32)(pt)[3])) +# define PUTU32(ct, st) {(ct)[0] = (u8)((st) >> 24); (ct)[1] = (u8)((st) >> 16); (ct)[2] = (u8)((st) >> 8); (ct)[3] = (u8)(st);} +#endif + +#ifdef AES_LONG +typedef unsigned long u32; +#else +typedef unsigned int u32; +#endif +typedef unsigned short u16; +typedef unsigned char u8; + +#define MAXKC (256 / 32) +#define MAXKB (256 / 8) +#define MAXNR 14 + +/* This controls loop-unrolling in aes_core.c */ +#undef FULL_UNROLL + +#endif /* !HEADER_AES_LOCL_H */ diff --git a/Source/Core/DiscIO/Src/BannerLoader.cpp b/Source/Core/DiscIO/Src/BannerLoader.cpp new file mode 100644 index 0000000000..16cf58c035 --- /dev/null +++ b/Source/Core/DiscIO/Src/BannerLoader.cpp @@ -0,0 +1,102 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ +#include "stdafx.h" + +#include "BannerLoader.h" +#include "BannerLoaderWii.h" +#include "BannerLoaderGC.h" + +#include "VolumeCreator.h" + +namespace DiscIO +{ +bool IBannerLoader::CopyToStringAndCheck(std::string& _rDestination, const char* _src) +{ + static bool bValidChars[256]; + static bool bInitialized = false; + + if (!bInitialized) + { + for (int i = 0; i < 256; i++) + { + bValidChars[i] = false; + } + + // generate valid chars + for (unsigned char c = 0x20; c <= 0x80; c++) + { + bValidChars[c] = true; + } + + bValidChars[0x0a] = true; + bValidChars[0xa9] = true; + bValidChars[0xe9] = true; + + bInitialized = true; + } + + bool bResult = true; + char destBuffer[2048]; + char* dest = destBuffer; + const char* src = _src; + + // copy the string and check for "unknown" characters + while (*src != 0x00) + { + u8 c = *src; + + if (c == 0x0a){c = 0x20;} + + if (bValidChars[c] == false) + { + bResult = false; + break; + } + + *dest = c; + dest++; + src++; + } + + // finalize the string + if (bResult) + { + *dest = 0x00; + } + else + { + dest[0] = ' '; + dest[1] = 0x00; + } + + _rDestination = destBuffer; + + return(bResult); +} + + +IBannerLoader* CreateBannerLoader(DiscIO::IFileSystem& _rFileSystem) +{ + if (IsVolumeWiiDisc(_rFileSystem.GetVolume())) + { + return(new CBannerLoaderWii(_rFileSystem)); + } + + return(new CBannerLoaderGC(_rFileSystem)); +} +} // namespace + diff --git a/Source/Core/DiscIO/Src/BannerLoader.h b/Source/Core/DiscIO/Src/BannerLoader.h new file mode 100644 index 0000000000..e7a6e8dea2 --- /dev/null +++ b/Source/Core/DiscIO/Src/BannerLoader.h @@ -0,0 +1,57 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef _BANNER_LOADER_H_ +#define _BANNER_LOADER_H_ + +#include "Filesystem.h" + +namespace DiscIO +{ +class IBannerLoader +{ + public: + + IBannerLoader() + {} + + + virtual ~IBannerLoader() + {} + + + virtual bool IsValid() = 0; + + virtual bool GetBanner(u32* _pBannerImage) = 0; + + virtual bool GetName(std::string& _rName) = 0; + + virtual bool GetCompany(std::string& _rCompany) = 0; + + virtual bool GetDescription(std::string& _rDescription) = 0; + + + protected: + + bool CopyToStringAndCheck(std::string& _rDestination, const char* _src); +}; + +IBannerLoader* CreateBannerLoader(DiscIO::IFileSystem& _rFileSystem); +} // namespace + +#endif + diff --git a/Source/Core/DiscIO/Src/BannerLoaderGC.cpp b/Source/Core/DiscIO/Src/BannerLoaderGC.cpp new file mode 100644 index 0000000000..0707cb2053 --- /dev/null +++ b/Source/Core/DiscIO/Src/BannerLoaderGC.cpp @@ -0,0 +1,192 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "stdafx.h" + +#include "BannerLoaderGC.h" + +namespace DiscIO +{ +CBannerLoaderGC::CBannerLoaderGC(DiscIO::IFileSystem& _rFileSystem) + : m_pBannerFile(NULL), + m_IsValid(false) +{ + // build LUT Table + for (int i = 0; i < 8; i++) + { + lut3to8[i] = (i * 255) / 7; + } + + for (int i = 0; i < 16; i++) + { + lut4to8[i] = (i * 255) / 15; + } + + for (int i = 0; i < 32; i++) + { + lut5to8[i] = (i * 255) / 31; + } + + // load the opening.bnr + size_t FileSize = _rFileSystem.GetFileSize("opening.bnr"); + + if (FileSize > 0) + { + m_pBannerFile = new u8[FileSize]; + _rFileSystem.ReadFile("opening.bnr", m_pBannerFile, FileSize); + m_IsValid = true; + } +} + + +CBannerLoaderGC::~CBannerLoaderGC() +{ + delete[] m_pBannerFile; +} + + +bool +CBannerLoaderGC::IsValid() +{ + return(m_IsValid); +} + + +bool +CBannerLoaderGC::GetBanner(u32* _pBannerImage) +{ + if (!IsValid()) + { + return(false); + } + + DVDBanner2* pBanner = (DVDBanner2*)m_pBannerFile; + decode5A3image(_pBannerImage, pBanner->image, DVD_BANNER_WIDTH, DVD_BANNER_HEIGHT); + + return(true); +} + + +bool +CBannerLoaderGC::GetName(std::string& _rName) +{ + _rName = "invalid image"; + + if (!IsValid()) + { + return(false); + } + + DVDBanner2* pBanner = (DVDBanner2*)m_pBannerFile; + + if (!CopyToStringAndCheck(_rName, pBanner->comment[0].longTitle)) + { + return(false); + } + + return(true); +} + + +bool +CBannerLoaderGC::GetCompany(std::string& _rCompany) +{ + _rCompany = "invalid images"; + + if (!IsValid()) + { + return(false); + } + + DVDBanner2* pBanner = (DVDBanner2*)m_pBannerFile; + + if (!CopyToStringAndCheck(_rCompany, pBanner->comment[0].shortMaker)) + { + return(false); + } + + return(true); +} + + +bool +CBannerLoaderGC::GetDescription(std::string& _rDescription) +{ + _rDescription = "invalid images"; + + if (!IsValid()) + { + return(false); + } + + DVDBanner2* pBanner = (DVDBanner2*)m_pBannerFile; + + if (!CopyToStringAndCheck(_rDescription, pBanner->comment[0].comment)) + { + _rDescription = ""; + } + + return(true); +} + + +u32 +CBannerLoaderGC::decode5A3(u16 val) +{ + u32 bannerBGColor = 0x00000000; + + int r, g, b, a; + + if ((val & 0x8000)) + { + r = lut5to8[(val >> 10) & 0x1f]; + g = lut5to8[(val >> 5) & 0x1f]; + b = lut5to8[(val) & 0x1f]; + a = 0xFF; + } + else + { + a = lut3to8[(val >> 12) & 0x7]; + r = (lut4to8[(val >> 8) & 0xf] * a + (bannerBGColor & 0xFF) * (255 - a)) / 255; + g = (lut4to8[(val >> 4) & 0xf] * a + ((bannerBGColor >> 8) & 0xFF) * (255 - a)) / 255; + b = (lut4to8[(val) & 0xf] * a + ((bannerBGColor >> 16) & 0xFF) * (255 - a)) / 255; + a = 0xFF; + } + + return((a << 24) | (r << 16) | (g << 8) | b); +} + + +void +CBannerLoaderGC::decode5A3image(u32* dst, u16* src, int width, int height) +{ + for (int y = 0; y < height; y += 4) + { + for (int x = 0; x < width; x += 4) + { + for (int iy = 0; iy < 4; iy++, src += 4) + { + for (int ix = 0; ix < 4; ix++) + { + u32 RGBA = decode5A3(Common::swap16(src[ix])); + dst[(y + iy) * 96 + (x + ix)] = RGBA; + } + } + } + } +} +} // namespace diff --git a/Source/Core/DiscIO/Src/BannerLoaderGC.h b/Source/Core/DiscIO/Src/BannerLoaderGC.h new file mode 100644 index 0000000000..eedb5c4715 --- /dev/null +++ b/Source/Core/DiscIO/Src/BannerLoaderGC.h @@ -0,0 +1,97 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef _BANNER_LOADER_GC_H_ +#define _BANNER_LOADER_GC_H_ + +#include "BannerLoader.h" + +namespace DiscIO +{ +class CBannerLoaderGC + : public IBannerLoader +{ + public: + + CBannerLoaderGC(DiscIO::IFileSystem& _rFileSystem); + + virtual ~CBannerLoaderGC(); + + virtual bool IsValid(); + + virtual bool GetBanner(u32* _pBannerImage); + + virtual bool GetName(std::string& _rName); + + virtual bool GetCompany(std::string& _rCompany); + + virtual bool GetDescription(std::string& _rDescription); + + + private: + + enum + { + DVD_BANNER_WIDTH = 96, + DVD_BANNER_HEIGHT = 32 + }; + + // Banner Comment + struct DVDBannerComment + { + char shortTitle[32]; // Short game title shown in IPL menu + char shortMaker[32]; // Short developer, publisher names shown in IPL menu + char longTitle[64]; // Long game title shown in IPL game start screen + char longMaker[64]; // Long developer, publisher names shown in IPL game start screen + char comment[128]; // Game description shown in IPL game start screen in two lines. + }; + + // "opening.bnr" file format for JP/US console + struct DVDBanner + { + u32 id; // 'BNR1' + u32 padding[7]; + u16 image[DVD_BANNER_WIDTH * DVD_BANNER_HEIGHT]; // RGB5A3 96x32 texture image + DVDBannerComment comment; + }; + + // "opening.bnr" file format for EU console + struct DVDBanner2 + { + u32 id; // 'BNR2' + u32 padding[7]; + u16 image[DVD_BANNER_WIDTH * DVD_BANNER_HEIGHT]; // RGB5A3 96x32 texture image + DVDBannerComment comment[6]; // Comments in six languages + }; + + + // for banner decoding + int lut3to8[8]; + int lut4to8[16]; + int lut5to8[32]; + + u8* m_pBannerFile; + + bool m_IsValid; + + u32 decode5A3(u16 val); + void decode5A3image(u32* dst, u16* src, int width, int height); +}; +} // namespace + +#endif + diff --git a/Source/Core/DiscIO/Src/BannerLoaderWii.cpp b/Source/Core/DiscIO/Src/BannerLoaderWii.cpp new file mode 100644 index 0000000000..3759d00a0b --- /dev/null +++ b/Source/Core/DiscIO/Src/BannerLoaderWii.cpp @@ -0,0 +1,112 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "stdafx.h" + +#include + +#include "Common.h" +#include "BannerLoaderWii.h" +#include "FileHandlerARC.h" +// #include "FileHandlerLZ77.h" + +namespace DiscIO +{ +CBannerLoaderWii::CBannerLoaderWii(DiscIO::IFileSystem& _rFileSystem) + : m_pBuffer(NULL) +{ + FILE* pFile = fopen("e:\\opening.bnr", "rb"); + + if (pFile) + { + fseek(pFile, 0, SEEK_END); + int insize = ftell(pFile); + fseek(pFile, 0, SEEK_SET); + + m_pBuffer = new u8[insize]; + + fread(m_pBuffer, 1, insize, pFile); + + fclose(pFile); + + CARCFile ArcFile(m_pBuffer + 0x600, insize - 0x600); + + size_t BannerSize = ArcFile.GetFileSize("meta\\banner.bin"); + + if (BannerSize > 0) + { + u8* TempBuffer = new u8[BannerSize]; + ArcFile.ReadFile("meta\\banner.bin", TempBuffer, BannerSize); + +// CLZ77File File(TempBuffer + 0x20 + 4, BannerSize - 0x20 - 4); + delete[] TempBuffer; + +// CARCFile IconFile(File.GetBuffer(), File.GetSize()); + +// IconFile.ExportFile("arc\\anim\\banner_loop.brlan", "e:\\banner_loop.brlan"); + + //IconFile.ReadFile("meta\\icon.bin", TempBuffer, BannerSize); + } + } + + + m_Name = std::string("Wii: ") + _rFileSystem.GetVolume().GetName(); +} + + +CBannerLoaderWii::~CBannerLoaderWii() +{ + delete m_pBuffer; +} + + +bool +CBannerLoaderWii::IsValid() +{ + return(true); +} + + +bool +CBannerLoaderWii::GetBanner(u32* _pBannerImage) +{ + return(false); +} + + +bool +CBannerLoaderWii::GetName(std::string& _rName) +{ + _rName = m_Name; + return(true); +} + + +bool +CBannerLoaderWii::GetCompany(std::string& _rCompany) +{ + return(false); +} + + +bool +CBannerLoaderWii::GetDescription(std::string& _rDescription) +{ + return(false); +} +} // namespace + diff --git a/Source/Core/DiscIO/Src/BannerLoaderWii.h b/Source/Core/DiscIO/Src/BannerLoaderWii.h new file mode 100644 index 0000000000..425d6a5291 --- /dev/null +++ b/Source/Core/DiscIO/Src/BannerLoaderWii.h @@ -0,0 +1,54 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef _BANNER_LOADER_WII_H_ +#define _BANNER_LOADER_WII_H_ + +#include "BannerLoader.h" + +namespace DiscIO +{ +class CBannerLoaderWii + : public IBannerLoader +{ + public: + + CBannerLoaderWii(DiscIO::IFileSystem& _rFileSystem); + + virtual ~CBannerLoaderWii(); + + virtual bool IsValid(); + + virtual bool GetBanner(u32* _pBannerImage); + + virtual bool GetName(std::string& _rName); + + virtual bool GetCompany(std::string& _rCompany); + + virtual bool GetDescription(std::string& _rDescription); + + + private: + + std::string m_Name; + + u8* m_pBuffer; +}; +} // namespace + +#endif + diff --git a/Source/Core/DiscIO/Src/Blob.cpp b/Source/Core/DiscIO/Src/Blob.cpp new file mode 100644 index 0000000000..200a3bcf2f --- /dev/null +++ b/Source/Core/DiscIO/Src/Blob.cpp @@ -0,0 +1,567 @@ +#ifdef WIN32 +#include +#include +#endif + +#include "stdafx.h" + +#include "../../../../Externals/zlib/zlib.h" + +#include "Blob.h" +#include "MappedFile.h" + +namespace DiscIO +{ +const u32 kBlobCookie = 0xB10BC001; + +// A blob file structure: +// BlobHeader +// u64 offsetsToBlocks[n], top bit specifies whether the block is compressed, or not. +// compressed data + +// Blocks that won't compress to less than 97% of the original size are stored as-is. + +struct BlobHeader // 32 bytes +{ + u32 magic_cookie; //0xB10BB10B + u32 sub_type; // gc image, whatever + u64 compressed_data_size; + u64 data_size; + u32 block_size; + u32 num_blocks; +}; + +#ifdef _WIN32 +class PlainFileReader + : public IBlobReader +{ + HANDLE hFile; + s64 size; + public: + + PlainFileReader(const char* filename) + { + hFile = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS, NULL); + DWORD size_low, size_high; + size_low = GetFileSize(hFile, &size_high); + size = ((u64)size_low) | ((u64)size_high << 32); + } + + + ~PlainFileReader() + { + if (hFile) + { + CloseHandle(hFile); + hFile = INVALID_HANDLE_VALUE; + } + } + + + bool IsValid() const {return(hFile != INVALID_HANDLE_VALUE);} + + + u64 GetDataSize() const {return(size);} + + + u64 GetRawSize() const {return(size);} + + + bool Read(u64 offset, u64 size, u8* out_ptr) + { + LONG offset_high = (LONG)(offset >> 32); + SetFilePointer(hFile, (DWORD)(offset & 0xFFFFFFFF), &offset_high, FILE_BEGIN); + + if (size >= 0x100000000ULL) + { + return(false); // WTF, does windows really have this limitation? + } + + DWORD unused; + + if (!ReadFile(hFile, out_ptr, DWORD(size & 0xFFFFFFFF), &unused, NULL)) + { + return(false); + } + else + { + return(true); + } + } +}; + +#else // linux, 64-bit. We do not yet care about linux32 +// Not optimal - will keep recreating mappings. +class PlainFileReader + : public IBlobReader +{ + FILE* file_; + s64 size; + public: + + PlainFileReader(const char* filename) + { + file_ = fopen(filename, "rb"); + fseek64(file_, 0, SEEK_END); + size = ftell(file_); + fseek(file_, 0, SEEK_SET); + } + + + ~PlainFileReader() + { + if (file_) + { + fclose(file_); + } + } + + + bool IsValid() const + { + return(file_ != 0); + } + + + u64 GetDataSize() const + { + return(size); + } + + + u64 GetRawSize() const + { + return(size); + } + + + bool Read(u64 offset, u64 size, u8* out_ptr) + { + fseek(file_, offset, SEEK_SET); + fread(out_ptr, size, 1, file_); + return(true); + } +}; +#endif + + + +class CompressedBlobReader + : public IBlobReader +{ + enum { CACHE_SIZE = 32 }; + + BlobHeader header; + u64* block_pointers; + int data_offset; + u8* cache[CACHE_SIZE]; + u64 cache_tags[CACHE_SIZE]; + int cache_age[CACHE_SIZE]; + u64 counter; + Common::IMappedFile* mapped_file; + + public: + + CompressedBlobReader(const char* filename) + { + counter = 0; + mapped_file = Common::IMappedFile::CreateMappedFile(); + + if (mapped_file) + { + mapped_file->Open(filename); + u8* start = mapped_file->Lock(0, sizeof(BlobHeader)); + memcpy(&header, start, sizeof(BlobHeader)); + mapped_file->Unlock(start); + + block_pointers = (u64*)mapped_file->Lock(sizeof(BlobHeader), sizeof(u64) * header.num_blocks); + data_offset = sizeof(BlobHeader) + sizeof(u64) * header.num_blocks; + + for (int i = 0; i < CACHE_SIZE; i++) + { + cache[i] = new u8[header.block_size]; + cache_tags[i] = (u64)(s64) - 1; + } + } + } + + + const BlobHeader& GetHeader() const + { + return(header); + } + + + bool IsValid() const + { + return(mapped_file != 0); + } + + + ~CompressedBlobReader() + { + for (int i = 0; i < CACHE_SIZE; i++) + { + delete[] cache[i]; + } + + mapped_file->Unlock((u8*)block_pointers); + + if (mapped_file) + { + mapped_file->Close(); + } + + mapped_file = 0; + } + + + u64 GetDataSize() const + { + return(header.data_size); + } + + + u64 GetRawSize() const + { + return(mapped_file->GetSize()); + } + + + u64 GetBlockCompressedSize(u64 block_num) const + { + u64 start = block_pointers[block_num]; + + if (block_num != header.num_blocks - 1) + { + return(block_pointers[block_num + 1] - start); + } + else + { + return(header.compressed_data_size - start); + } + } + + + // IMPORTANT: Calling this function invalidates all earlier pointers gotten from this function. + u8* GetBlock(u64 block_num) + { + if (cache_tags[0] != block_num) + { + cache_tags[0] = block_num; + //PanicAlert("here2"); + // let's begin with a super naive implementation. + // let's just use the start of the cache for now. + bool uncompressed = false; + u32 comp_block_size = (u32)GetBlockCompressedSize(block_num); + u64 offset = block_pointers[block_num] + data_offset; + + if (offset & (1ULL << 63)) + { + if (comp_block_size != header.block_size) + { + PanicAlert("Uncompressed block with wrong size"); + } + + uncompressed = true; + offset &= ~(1ULL << 63); + } + + u8* source = mapped_file->Lock(offset, comp_block_size); + u8* dest = cache[0]; + + if (uncompressed) + { + memcpy(dest, source, comp_block_size); + } + else + { + z_stream z; + memset(&z, 0, sizeof(z)); + z.next_in = source; + z.avail_in = comp_block_size; + + if (z.avail_in > header.block_size) + { + PanicAlert("We have a problem"); + } + + z.next_out = dest; + z.avail_out = header.block_size; + inflateInit(&z); + int status = inflate(&z, Z_FULL_FLUSH); + int uncomp_size = header.block_size - z.avail_out; + + if (status != Z_STREAM_END) + { + // this seem to fire wrongly from time to time + // to be sure, don't use compressed isos :P + //PanicAlert("Failure reading block %i", block_num); + } + + if (uncomp_size != header.block_size) + { + PanicAlert("Wrong block size"); + } + + inflateEnd(&z); + } + + mapped_file->Unlock(source); + } + + //PanicAlert("here3"); + return(cache[0]); + } + + + bool Read(u64 offset, u64 size, u8* out_ptr) + { + u64 startingBlock = offset / header.block_size; + u64 remain = size; + + int positionInBlock = (int)(offset % header.block_size); + u64 block = startingBlock; + + while (remain > 0) + { + u8* data = GetBlock(block); + + if (!data) + { + return(false); + } + + int toCopy = header.block_size - positionInBlock; + + if (toCopy >= remain) + { + // yay, we are done! + memcpy(out_ptr, data + positionInBlock, (size_t)remain); + return(true); + } + else + { + memcpy(out_ptr, data + positionInBlock, toCopy); + out_ptr += toCopy; + remain -= toCopy; + positionInBlock = 0; + block++; + } + } + + PanicAlert("here4"); + return(true); + } +}; + + + +bool CompressFileToBlob(const char* infile, const char* outfile, u32 sub_type, int block_size, + CompressCB callback, void* arg) +{ + //Common::IMappedFile *in = Common::IMappedFile::CreateMappedFile(); + if (IsCompressedBlob(infile)) + { + PanicAlert("%s is already compressed!", infile); + return(false); + } + + FILE* inf = fopen(infile, "rb"); + + if (!inf) + { + return(false); + } + + FILE* f = fopen(outfile, "wb"); + + if (!f) + { + return(false); + } + + callback("Files opened, ready to compress.", 0, arg); + + fseek(inf, 0, SEEK_END); + int insize = ftell(inf); + fseek(inf, 0, SEEK_SET); + BlobHeader header; + header.magic_cookie = kBlobCookie; + header.sub_type = sub_type; + header.block_size = block_size; + header.data_size = insize; + + // round upwards! + header.num_blocks = (u32)((header.data_size + (block_size - 1)) / block_size); + + u64* offsets = new u64[header.num_blocks]; + u8* out_buf = new u8[block_size]; + u8* in_buf = new u8[block_size]; + + // seek past the header (we will write it at the end) + fseek(f, sizeof(BlobHeader), SEEK_CUR); + // seek past the offset table (we will write it at the end) + fseek(f, sizeof(u64) * header.num_blocks, SEEK_CUR); + // Now we are ready to write compressed data! + u64 position = 0; + int num_compressed = 0; + int num_stored = 0; + + for (u32 i = 0; i < header.num_blocks; i++) + { + if (i % (header.num_blocks / 100) == 0) + { + u64 inpos = ftell(inf); + int ratio = (int)(100 * position / inpos); + char temp[512]; + sprintf(temp, "%i of %i blocks. compression ratio %i%%", i, header.num_blocks, ratio); + callback(temp, (float)i / (float)header.num_blocks, arg); + } + + offsets[i] = position; + // u64 start = i * header.block_size; + // u64 size = header.block_size; + memset(in_buf, 0, header.block_size); + fread(in_buf, header.block_size, 1, inf); + z_stream z; + memset(&z, 0, sizeof(z)); + z.zalloc = Z_NULL; + z.zfree = Z_NULL; + z.opaque = Z_NULL; + z.next_in = in_buf; + z.avail_in = header.block_size; + z.next_out = out_buf; + z.avail_out = block_size; + int retval = deflateInit(&z, 9); + + if (retval != Z_OK) + { + PanicAlert("Deflate failed"); + goto cleanup; + } + + int status = deflate(&z, Z_FINISH); + int comp_size = block_size - z.avail_out; + + if ((status != Z_STREAM_END) || (z.avail_out < 10)) + { + //PanicAlert("%i %i Store %i", i*block_size, position, comp_size); + // let's store uncompressed + offsets[i] |= 0x8000000000000000ULL; + fwrite(in_buf, block_size, 1, f); + position += block_size; + num_stored++; + } + else + { + // let's store compressed + //PanicAlert("Comp %i to %i", block_size, comp_size); + fwrite(out_buf, comp_size, 1, f); + position += comp_size; + num_compressed++; + } + + deflateEnd(&z); + } + + header.compressed_data_size = position; + + // Okay, go back and fill in headers + fseek(f, 0, SEEK_SET); + fwrite(&header, sizeof(header), 1, f); + fwrite(offsets, sizeof(u64), header.num_blocks, f); + +cleanup: + // Cleanup + delete[] in_buf; + delete[] out_buf; + delete[] offsets; + fclose(f); + fclose(inf); + callback("Done.", 1.0f, arg); + + return(true); +} + + +bool DecompressBlobToFile(const char* infile, const char* outfile, + CompressCB callback, void* arg) +{ + if (!IsCompressedBlob(infile)) + { + PanicAlert("File not compressed"); + return(false); + } + + CompressedBlobReader* reader = new CompressedBlobReader(infile); + + FILE* f = fopen(outfile, "wb"); + const BlobHeader& header = reader->GetHeader(); + u8* buffer = new u8[header.block_size]; + + for (u64 i = 0; i < header.num_blocks; i++) + { + if (i % (header.num_blocks / 100) == 0) + { + callback("Unpacking", (float)i / (float)header.num_blocks, arg); + } + + reader->Read(i * header.block_size, header.block_size, buffer); + fwrite(buffer, header.block_size, 1, f); + } + + delete[] buffer; +#ifdef _WIN32 + // TODO(ector): _chsize sucks, not 64-bit safe + // F|RES: changed to _chsize_s. i think it is 64-bit safe + _chsize_s(_fileno(f), (long)header.data_size); +#else + ftruncate(fileno(f), header.data_size); +#endif + fclose(f); + return(true); +} + + +bool IsCompressedBlob(const char* filename) +{ + FILE* f = fopen(filename, "rb"); + + if (!f) + { + return(0); + } + + BlobHeader header; + fread(&header, sizeof(header), 1, f); + fclose(f); + return(header.magic_cookie == kBlobCookie); +} + + +IBlobReader* CreateBlobReader(const char* filename) +{ + IBlobReader* reader; + + if (IsCompressedBlob(filename)) + { + reader = new CompressedBlobReader(filename); + } + else + { + reader = new PlainFileReader(filename); + } + + if (reader->IsValid()) + { + return(reader); + } + else + { + delete reader; + return(0); + } +} +} // namespace diff --git a/Source/Core/DiscIO/Src/Blob.h b/Source/Core/DiscIO/Src/Blob.h new file mode 100644 index 0000000000..68201e2efc --- /dev/null +++ b/Source/Core/DiscIO/Src/Blob.h @@ -0,0 +1,63 @@ +#ifndef _BLOB_H +#define _BLOB_H + +/* + Code not big-endian safe. + + BLOB + + Blobs are Binary Large OBjects. For example, a typical DVD image. + Often, you may want to store these things in a highly compressed format, but still + allow random access. + + Always read your BLOBs using an interface returned by CreateBlobReader(). It will + detect whether the file is a compressed blob, or just a big hunk of data, and + automatically do the right thing. + + To create new BLOBs, use CompressFileToBlob. + + Right now caching of decompressed chunks doesn't work, so it's a bit slow. +*/ + +#include "Common.h" + +namespace DiscIO +{ +class IBlobReader +{ + public: + + virtual ~IBlobReader() {} + + + virtual u64 GetRawSize() const = 0; + virtual u64 GetDataSize() const = 0; + virtual bool Read(u64 offset, u64 size, u8* out_ptr) = 0; + virtual bool IsValid() const = 0; + + + protected: + + IBlobReader() {} + + + private: + + IBlobReader(const IBlobReader& other) {} +}; + + +IBlobReader* CreateBlobReader(const char* filename); +bool IsCompressedBlob(const char* filename); + + +typedef void (*CompressCB)(const char* text, float percent, void* arg); + +bool CompressFileToBlob(const char* infile, const char* outfile, u32 sub_type = 0, int sector_size = 16384, + CompressCB callback = 0, void* arg = 0); +bool DecompressBlobToFile(const char* infile, const char* outfile, + CompressCB callback = 0, void* arg = 0); +} + +#endif + diff --git a/Source/Core/DiscIO/Src/FileHandlerARC.cpp b/Source/Core/DiscIO/Src/FileHandlerARC.cpp new file mode 100644 index 0000000000..faa43147c0 --- /dev/null +++ b/Source/Core/DiscIO/Src/FileHandlerARC.cpp @@ -0,0 +1,236 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "stdafx.h" + +#include "FileHandlerARC.h" +#include "StringUtil.h" + + +#define ARC_ID 0x55aa382d + +namespace DiscIO +{ +CARCFile::CARCFile(const u8* _pBuffer, size_t _BufferSize) + : m_pBuffer(NULL), + m_Initialized(false) +{ + m_pBuffer = new u8[_BufferSize]; + + if (m_pBuffer) + { + memcpy(m_pBuffer, _pBuffer, _BufferSize); + m_Initialized = ParseBuffer(); + } +} + + +CARCFile::~CARCFile() +{ + delete m_pBuffer; +} + + +bool +CARCFile::IsInitialized() +{ + return(m_Initialized); +} + + +size_t +CARCFile::GetFileSize(const std::string& _rFullPath) +{ + if (!m_Initialized) + { + return(0); + } + + const SFileInfo* pFileInfo = FindFileInfo(_rFullPath); + + if (pFileInfo != NULL) + { + return(pFileInfo->m_FileSize); + } + + return(0); +} + + +size_t +CARCFile::ReadFile(const std::string& _rFullPath, u8* _pBuffer, size_t _MaxBufferSize) +{ + if (!m_Initialized) + { + return(0); + } + + const SFileInfo* pFileInfo = FindFileInfo(_rFullPath); + + if (pFileInfo == NULL) + { + return(0); + } + + if (pFileInfo->m_FileSize > _MaxBufferSize) + { + return(0); + } + + memcpy(_pBuffer, &m_pBuffer[pFileInfo->m_Offset], pFileInfo->m_FileSize); + return(pFileInfo->m_FileSize); +} + + +bool +CARCFile::ExportFile(const std::string& _rFullPath, const std::string& _rExportFilename) +{ + if (!m_Initialized) + { + return(false); + } + + const SFileInfo* pFileInfo = FindFileInfo(_rFullPath); + + if (pFileInfo == NULL) + { + return(false); + } + + FILE* pFile = fopen(_rExportFilename.c_str(), "wb"); + + if (pFile == NULL) + { + return(false); + } + + fwrite(&m_pBuffer[pFileInfo->m_Offset], pFileInfo->m_FileSize, 1, pFile); + fclose(pFile); + return(true); +} + + +bool +CARCFile::ExportAllFiles(const std::string& _rFullPath) +{ + return(false); +} + + +bool +CARCFile::ParseBuffer() +{ + // check ID + u32 ID = Common::swap32(*(u32*)(m_pBuffer)); + + if (ID != ARC_ID) + { + return(false); + } + + // read header + u32 FSTOffset = Common::swap32(*(u32*)(m_pBuffer + 0x4)); + u32 FSTSize = Common::swap32(*(u32*)(m_pBuffer + 0x8)); + u32 FileOffset = Common::swap32(*(u32*)(m_pBuffer + 0xC)); + + // read all file infos + SFileInfo Root; + Root.m_NameOffset = Common::swap32(*(u32*)(m_pBuffer + FSTOffset + 0x0)); + Root.m_Offset = Common::swap32(*(u32*)(m_pBuffer + FSTOffset + 0x4)); + Root.m_FileSize = Common::swap32(*(u32*)(m_pBuffer + FSTOffset + 0x8)); + + if (Root.IsDirectory()) + { + m_FileInfoVector.resize(Root.m_FileSize); + const char* szNameTable = (char*)(m_pBuffer + FSTOffset); + + for (size_t i = 0; i < m_FileInfoVector.size(); i++) + { + u8* Offset = m_pBuffer + FSTOffset + (i * 0xC); + m_FileInfoVector[i].m_NameOffset = Common::swap32(*(u32*)(Offset + 0x0)); + m_FileInfoVector[i].m_Offset = Common::swap32(*(u32*)(Offset + 0x4)); + m_FileInfoVector[i].m_FileSize = Common::swap32(*(u32*)(Offset + 0x8)); + + szNameTable += 0xC; + } + + BuildFilenames(1, m_FileInfoVector.size(), NULL, szNameTable); + } + + return(true); +} + + +size_t +CARCFile::BuildFilenames(const size_t _FirstIndex, const size_t _LastIndex, const char* _szDirectory, const char* _szNameTable) +{ + size_t CurrentIndex = _FirstIndex; + + while (CurrentIndex < _LastIndex) + { + SFileInfo& rFileInfo = m_FileInfoVector[CurrentIndex]; + int uOffset = rFileInfo.m_NameOffset & 0xFFFFFF; + + // check next index + if (rFileInfo.IsDirectory()) + { + // this is a directory, build up the new szDirectory + if (_szDirectory != NULL) + { + rFileInfo.m_FullPath = StringFromFormat("%s%s\\", _szDirectory, &_szNameTable[uOffset]); + } + else + { + rFileInfo.m_FullPath = StringFromFormat("%s\\", &_szNameTable[uOffset]); + } + + CurrentIndex = BuildFilenames(CurrentIndex + 1, rFileInfo.m_FileSize, rFileInfo.m_FullPath.c_str(), _szNameTable); + } + else + { + // this is a filename + if (_szDirectory != NULL) + { + rFileInfo.m_FullPath = StringFromFormat("%s%s", _szDirectory, &_szNameTable[uOffset]); + } + else + { + rFileInfo.m_FullPath = StringFromFormat("%s", &_szNameTable[uOffset]); + } + + CurrentIndex++; + } + } + + return(CurrentIndex); +} + + +const CARCFile::SFileInfo* +CARCFile::FindFileInfo(std::string _rFullPath) const +{ + for (size_t i = 0; i < m_FileInfoVector.size(); i++) + { + if (!stricmp(m_FileInfoVector[i].m_FullPath.c_str(), _rFullPath.c_str())) + { + return(&m_FileInfoVector[i]); + } + } + + return(NULL); +} +} // namespace diff --git a/Source/Core/DiscIO/Src/FileHandlerARC.h b/Source/Core/DiscIO/Src/FileHandlerARC.h new file mode 100644 index 0000000000..b8e47c45f9 --- /dev/null +++ b/Source/Core/DiscIO/Src/FileHandlerARC.h @@ -0,0 +1,77 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef _ARC_FILE_H +#define _ARC_FILE_H + +#include +#include + +#include "Common.h" +#include "Filesystem.h" + +namespace DiscIO +{ +class CARCFile +{ + public: + + CARCFile(const u8* _pBuffer, size_t _BufferSize); + + virtual ~CARCFile(); + + bool IsInitialized(); + + size_t GetFileSize(const std::string& _rFullPath); + + size_t ReadFile(const std::string& _rFullPath, u8* _pBuffer, size_t _MaxBufferSize); + + bool ExportFile(const std::string& _rFullPath, const std::string& _rExportFilename); + + bool ExportAllFiles(const std::string& _rFullPath); + + + private: + + u8* m_pBuffer; + + bool m_Initialized; + + struct SFileInfo + { + u32 m_NameOffset; + u32 m_Offset; + u32 m_FileSize; + + std::string m_FullPath; + + bool IsDirectory() {return((m_NameOffset& 0xFF000000) != 0 ? true : false);} + }; + + typedef std::vectorCFileInfoVector; + CFileInfoVector m_FileInfoVector; + + bool ParseBuffer(); + + size_t BuildFilenames(const size_t _FirstIndex, const size_t _LastIndex, const char* _szDirectory, const char* _szNameTable); + + const SFileInfo* FindFileInfo(std::string _rFullPath) const; +}; +} // namespace + +#endif + diff --git a/Source/Core/DiscIO/Src/FileSystemGCWii.cpp b/Source/Core/DiscIO/Src/FileSystemGCWii.cpp new file mode 100644 index 0000000000..1a76bb1814 --- /dev/null +++ b/Source/Core/DiscIO/Src/FileSystemGCWii.cpp @@ -0,0 +1,276 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "stdafx.h" + +#include + +#include "FileSystemGCWii.h" +#include "StringUtil.h" + +namespace DiscIO +{ +CFileSystemGCWii::CFileSystemGCWii(const IVolume& _rVolume) + : IFileSystem(_rVolume), + m_Initialized(false), + m_OffsetShift(0) +{ + m_Initialized = InitFileSystem(); +} + + +CFileSystemGCWii::~CFileSystemGCWii() +{} + + +bool +CFileSystemGCWii::IsInitialized() +{ + return(m_Initialized); +} + + +size_t +CFileSystemGCWii::GetFileSize(const char* _rFullPath) +{ + if (!m_Initialized) + { + return(0); + } + + const SFileInfo* pFileInfo = FindFileInfo(_rFullPath); + + if (pFileInfo != NULL) + { + return(pFileInfo->m_FileSize); + } + + return(0); +} + + +const char* +CFileSystemGCWii::GetFileName(u64 _Address) +{ + for (size_t i = 0; i < m_FileInfoVector.size(); i++) + { + if ((m_FileInfoVector[i].m_Offset <= _Address) && + ((m_FileInfoVector[i].m_Offset + m_FileInfoVector[i].m_FileSize) > _Address)) + { + return(m_FileInfoVector[i].m_FullPath); + } + } + + return(NULL); +} + + +size_t +CFileSystemGCWii::ReadFile(const char* _rFullPath, u8* _pBuffer, size_t _MaxBufferSize) +{ + if (!m_Initialized) + { + return(0); + } + + const SFileInfo* pFileInfo = FindFileInfo(_rFullPath); + + if (pFileInfo == NULL) + { + return(0); + } + + if (pFileInfo->m_FileSize > _MaxBufferSize) + { + return(0); + } + + m_rVolume.Read(pFileInfo->m_Offset, pFileInfo->m_FileSize, _pBuffer); + return(pFileInfo->m_FileSize); +} + + +bool +CFileSystemGCWii::ExportFile(const char* _rFullPath, const char* _rExportFilename) +{ + size_t filesize = GetFileSize(_rFullPath); + + if (filesize == 0) + { + return(false); + } + + u8* buffer = new u8[filesize]; + + if (!ReadFile(_rFullPath, buffer, filesize)) + { + delete[] buffer; + return(false); + } + + FILE* f = fopen(_rExportFilename, "wb"); + + if (f) + { + fwrite(buffer, filesize, 1, f); + fclose(f); + delete[] buffer; + return(true); + } + + delete[] buffer; + return(false); +} + + +bool +CFileSystemGCWii::ExportAllFiles(const char* _rFullPath) +{ + return(false); +} + + +u32 +CFileSystemGCWii::Read32(u64 _Offset) const +{ + u32 Temp = 0; + m_rVolume.Read(_Offset, 4, (u8*)&Temp); + return(Common::swap32(Temp)); +} + + +void CFileSystemGCWii::GetStringFromOffset(u64 _Offset, char* Filename) const +{ + m_rVolume.Read(_Offset, 255, (u8*)Filename); +} + + +const CFileSystemGCWii::SFileInfo* +CFileSystemGCWii::FindFileInfo(const char* _rFullPath) const +{ + for (size_t i = 0; i < m_FileInfoVector.size(); i++) + { + if (!stricmp(m_FileInfoVector[i].m_FullPath, _rFullPath)) + { + return(&m_FileInfoVector[i]); + } + } + + return(NULL); +} + + +bool +CFileSystemGCWii::InitFileSystem() +{ + if (Read32(0x18) == 0x5D1C9EA3) + { + m_OffsetShift = 2; + } + else if (Read32(0x1c) == 0xC2339F3D) + { + m_OffsetShift = 0; + } + else + { + return(false); + } + + // read the whole FST + u32 FSTOffset = Read32(0x424) << m_OffsetShift; + // u32 FSTSize = Read32(0x428); + // u32 FSTMaxSize = Read32(0x42C); + + + // read all fileinfos + SFileInfo Root; + Root.m_NameOffset = Read32(FSTOffset + 0x0); + Root.m_Offset = (u64)Read32(FSTOffset + 0x4) << m_OffsetShift; + Root.m_FileSize = Read32(FSTOffset + 0x8); + + if (Root.IsDirectory()) + { + m_FileInfoVector.resize(Root.m_FileSize); + u64 NameTableOffset = FSTOffset; + + for (size_t i = 0; i < m_FileInfoVector.size(); i++) + { + u64 Offset = FSTOffset + (i * 0xC); + m_FileInfoVector[i].m_NameOffset = Read32(Offset + 0x0); + m_FileInfoVector[i].m_Offset = (u64)Read32(Offset + 0x4) << m_OffsetShift; + m_FileInfoVector[i].m_FileSize = Read32(Offset + 0x8); + NameTableOffset += 0xC; + } + + BuildFilenames(1, m_FileInfoVector.size(), NULL, NameTableOffset); + } + + return(true); +} + + +// __________________________________________________________________________________________________ +// +// Changed this stuff from C++ string to C strings for speed in debug mode. Doesn't matter in release, but +// std::string is SLOW in debug mode. +size_t +CFileSystemGCWii::BuildFilenames(const size_t _FirstIndex, const size_t _LastIndex, const char* _szDirectory, u64 _NameTableOffset) +{ + size_t CurrentIndex = _FirstIndex; + + while (CurrentIndex < _LastIndex) + { + SFileInfo& rFileInfo = m_FileInfoVector[CurrentIndex]; + u64 uOffset = _NameTableOffset + (rFileInfo.m_NameOffset & 0xFFFFFF); + char filename[512]; + GetStringFromOffset(uOffset, filename); + + // check next index + if (rFileInfo.IsDirectory()) + { + // this is a directory, build up the new szDirectory + if (_szDirectory != NULL) + { + CharArrayFromFormat(rFileInfo.m_FullPath, "%s%s\\", _szDirectory, filename); + } + else + { + CharArrayFromFormat(rFileInfo.m_FullPath, "%s\\", filename); + } + + CurrentIndex = BuildFilenames(CurrentIndex + 1, rFileInfo.m_FileSize, rFileInfo.m_FullPath, _NameTableOffset); + } + else + { + // this is a filename + if (_szDirectory != NULL) + { + CharArrayFromFormat(rFileInfo.m_FullPath, "%s%s", _szDirectory, filename); + } + else + { + CharArrayFromFormat(rFileInfo.m_FullPath, "%s", filename); + } + + CurrentIndex++; + } + } + + return(CurrentIndex); +} +} // namespace + diff --git a/Source/Core/DiscIO/Src/FileSystemGCWii.h b/Source/Core/DiscIO/Src/FileSystemGCWii.h new file mode 100644 index 0000000000..caadabe45d --- /dev/null +++ b/Source/Core/DiscIO/Src/FileSystemGCWii.h @@ -0,0 +1,82 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef _FILESYSTEM_GC_WII_H +#define _FILESYSTEM_GC_WII_H + +#include + +#include "Filesystem.h" + +namespace DiscIO +{ +class CFileSystemGCWii + : public IFileSystem +{ + public: + + CFileSystemGCWii(const IVolume& _rVolume); + + virtual ~CFileSystemGCWii(); + + virtual bool IsInitialized(); + + virtual size_t GetFileSize(const char* _rFullPath); + + virtual const char* GetFileName(u64 _Address); + + virtual size_t ReadFile(const char* _rFullPath, u8* _pBuffer, size_t _MaxBufferSize); + + virtual bool ExportFile(const char* _rFullPath, const char* _rExportFilename); + + virtual bool ExportAllFiles(const char* _rFullPath); + + + private: + + // file info of an FST entry + struct SFileInfo + { + u32 m_NameOffset; + u64 m_Offset; + u32 m_FileSize; + char m_FullPath[512]; + + bool IsDirectory() {return((m_NameOffset& 0xFF000000) != 0 ? true : false);} + }; + + typedef std::vectorCFileInfoVector; + CFileInfoVector m_FileInfoVector; + + bool m_Initialized; + + u32 m_OffsetShift; // WII offsets are all shifted + + u32 Read32(u64 _Offset) const; + + void GetStringFromOffset(u64 _Offset, char* Filename) const; + + const SFileInfo* FindFileInfo(const char* _rFullPath) const; + + bool InitFileSystem(); + + size_t BuildFilenames(const size_t _FirstIndex, const size_t _LastIndex, const char* _szDirectory, u64 _NameTableOffset); +}; +} // namespace + +#endif + diff --git a/Source/Core/DiscIO/Src/Filesystem.cpp b/Source/Core/DiscIO/Src/Filesystem.cpp new file mode 100644 index 0000000000..3c92056cee --- /dev/null +++ b/Source/Core/DiscIO/Src/Filesystem.cpp @@ -0,0 +1,50 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "stdafx.h" +#include "Filesystem.h" + +#include "VolumeCreator.h" +#include "FileSystemGCWii.h" + +namespace DiscIO +{ +IFileSystem::IFileSystem(const IVolume& _rVolume) + : m_rVolume(_rVolume) +{} + + +IFileSystem::~IFileSystem() +{} + + +IFileSystem* CreateFileSystem(const IVolume& _rVolume) +{ + IFileSystem* pFileSystem = new CFileSystemGCWii(_rVolume); + + if (pFileSystem) + { + if (!pFileSystem->IsInitialized()) + { + delete pFileSystem; + pFileSystem = NULL; + } + } + + return(pFileSystem); +} +} // namespace diff --git a/Source/Core/DiscIO/Src/Filesystem.h b/Source/Core/DiscIO/Src/Filesystem.h new file mode 100644 index 0000000000..98ac81cf0e --- /dev/null +++ b/Source/Core/DiscIO/Src/Filesystem.h @@ -0,0 +1,60 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef _FILESYSTEM_H +#define _FILESYSTEM_H + +#include "Volume.h" + +namespace DiscIO +{ +class IFileSystem +{ + public: + + IFileSystem(const IVolume& _rVolume); + + virtual ~IFileSystem(); + + virtual bool IsInitialized() = 0; + + +// virtual size_t GetFileList(std::vector _rFilenames) = 0; + + virtual size_t GetFileSize(const char* _rFullPath) = 0; + + virtual size_t ReadFile(const char* _rFullPath, u8* _pBuffer, size_t _MaxBufferSize) = 0; + + virtual bool ExportFile(const char* _rFullPath, const char* _rExportFilename) = 0; + + virtual bool ExportAllFiles(const char* _rFullPath) = 0; + + virtual const char* GetFileName(u64 _Address) = 0; + + + virtual const IVolume& GetVolume() {return(m_rVolume);} + + + protected: + + const IVolume& m_rVolume; +}; + +IFileSystem* CreateFileSystem(const IVolume& _rVolume); +} // namespace + +#endif diff --git a/Source/Core/DiscIO/Src/SConscript b/Source/Core/DiscIO/Src/SConscript new file mode 100644 index 0000000000..597d757cf1 --- /dev/null +++ b/Source/Core/DiscIO/Src/SConscript @@ -0,0 +1,23 @@ +Import('env') + +files = ["BannerLoader.cpp", + "BannerLoaderGC.cpp", + "BannerLoaderWii.cpp", + "Blob.cpp", + "FileHandlerARC.cpp", + "FileHandlerLZ77.cpp", + "Filesystem.cpp", + "FileSystemGCWii.cpp", + "VolumeCreator.cpp", + "VolumeGC.cpp", + "VolumeWiiCrypted.cpp", + "AES/aes_cbc.c", + "AES/aes_cfb.c", + "AES/aes_core.c", + "AES/aes_ctr.c", + "AES/aes_ecb.c", + "AES/aes_ige.c", + "AES/aes_misc.c", + "AES/aes_ofb.c", + ] +env.StaticLibrary("discio", files, LIBS = ["common"]) diff --git a/Source/Core/DiscIO/Src/Volume.h b/Source/Core/DiscIO/Src/Volume.h new file mode 100644 index 0000000000..3807e08098 --- /dev/null +++ b/Source/Core/DiscIO/Src/Volume.h @@ -0,0 +1,59 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ +#ifndef _VOLUME_H +#define _VOLUME_H + +#include + +#include "Common.h" + +namespace DiscIO +{ +class IVolume +{ + public: + + IVolume() + {} + + + virtual ~IVolume() + {} + + + virtual bool Read(u64 _Offset, u64 _Length, u8* _pBuffer) const = 0; + virtual std::string GetName() const = 0; + virtual std::string GetUniqueID() const = 0; + + + enum ECountry + { + COUNTRY_EUROPE = 0, + COUNTRY_FRANCE = 1, + COUNTRY_USA = 2, + COUNTRY_JAP, + COUNTRY_UNKNOWN, + NUMBER_OF_COUNTRIES + }; + + virtual ECountry GetCountry() const = 0; + virtual u64 GetSize() const = 0; +}; +} // namespace + +#endif + diff --git a/Source/Core/DiscIO/Src/VolumeCreator.cpp b/Source/Core/DiscIO/Src/VolumeCreator.cpp new file mode 100644 index 0000000000..e7f6251cd3 --- /dev/null +++ b/Source/Core/DiscIO/Src/VolumeCreator.cpp @@ -0,0 +1,232 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include + +#include "AES/aes.h" + +#include "VolumeCreator.h" + +#include "Volume.h" +#include "VolumeGC.h" +#include "VolumeWiiCrypted.h" + +#include "Hash.h" + + +namespace DiscIO +{ +enum EDiscType +{ + DISC_TYPE_UNK, + DISC_TYPE_WII, + DISC_TYPE_WII_CONTAINER, + DISC_TYPE_GC +}; + +class CBlobBigEndianReader +{ + public: + + CBlobBigEndianReader(IBlobReader& _rReader) + : m_rReader(_rReader) + {} + + + u32 Read32(u64 _Offset) + { + u32 Temp; + m_rReader.Read(_Offset, 4, (u8*)&Temp); + return(Common::swap32(Temp)); + } + + + private: + + IBlobReader& m_rReader; +}; + +unsigned char g_MasterKey[16]; +bool g_MasterKeyInit = false; + +IVolume* CreateVolumeFromCryptedWiiImage(IBlobReader& _rReader, int _VolumeType); +EDiscType GetDiscType(IBlobReader& _rReader); + + +IVolume* CreateVolumeFromFilename(const std::string& _rFilename) +{ + IBlobReader* pReader = CreateBlobReader(_rFilename.c_str()); + + if (pReader == NULL) + { + return(NULL); + } + + switch (GetDiscType(*pReader)) + { + case DISC_TYPE_WII: + case DISC_TYPE_GC: + return(new CVolumeGC(pReader)); + + case DISC_TYPE_WII_CONTAINER: + { + IVolume* pVolume = CreateVolumeFromCryptedWiiImage(*pReader, 0); + + if (pVolume == NULL) + { + delete pReader; + } + + return(pVolume); + } + break; + + case DISC_TYPE_UNK: + default: + delete pReader; + return(NULL); + } + + // unreachable code + return(NULL); +} + + +bool IsVolumeWiiDisc(const IVolume& _rVolume) +{ + u32 MagicWord = 0; + _rVolume.Read(0x18, 4, (u8*)&MagicWord); + + if (Common::swap32(MagicWord) == 0x5D1C9EA3) + { + return(true); + } + + return(false); +} + + +IVolume* CreateVolumeFromCryptedWiiImage(IBlobReader& _rReader, int _VolumeType) +{ + if (!g_MasterKeyInit) + { + FILE* pT = fopen("WII/masterkey.bin", "rb"); + + if (pT == NULL) + { + return(NULL); + } + + fread(g_MasterKey, 16, 1, pT); + fclose(pT); + const u32 keyhash = 0x4bc30936; + u32 hash = HashAdler32(g_MasterKey, 16); + + if (hash != keyhash) + { + PanicAlert("Your Wii disc decryption key is bad.", keyhash, hash); + } + else + { + g_MasterKeyInit = true; + } + } + + CBlobBigEndianReader Reader(_rReader); + + u32 numPartitions = Reader.Read32(0x40000); + u64 PartitionsOffset = (u64)Reader.Read32(0x40004) << 2; + + struct SPartition + { + u64 Offset; + u32 Type; + }; + std::vectorPartitionsVec; + + // read all partitions + for (u32 i = 0; i < numPartitions; i++) + { + SPartition Partition; + Partition.Offset = ((u64)Reader.Read32(PartitionsOffset + (i * 8) + 0)) << 2; + Partition.Type = Reader.Read32(PartitionsOffset + (i * 8) + 4); + PartitionsVec.push_back(Partition); + } + + // find the partition with the game... type == 1 is prolly the firmware update partition + for (size_t i = 0; i < PartitionsVec.size(); i++) + { + const SPartition& rPartition = PartitionsVec[i]; + + if (rPartition.Type == _VolumeType) + { + u8 SubKey[16]; + _rReader.Read(rPartition.Offset + 0x1bf, 16, SubKey); + + u8 IV[16]; + memset(IV, 0, 16); + _rReader.Read(rPartition.Offset + 0x44c, 8, IV); + + AES_KEY AES_KEY; + AES_set_decrypt_key(g_MasterKey, 128, &AES_KEY); + + u8 VolumeKey[16]; + AES_cbc_encrypt(SubKey, VolumeKey, 16, &AES_KEY, IV, AES_DECRYPT); + + return(new CVolumeWiiCrypted(&_rReader, rPartition.Offset + 0x20000, VolumeKey)); + } + } + + return(NULL); +} + + +EDiscType GetDiscType(IBlobReader& _rReader) +{ + CBlobBigEndianReader Reader(_rReader); + + // check for wii + { + u32 MagicWord = Reader.Read32(0x18); + + if (MagicWord == 0x5D1C9EA3) + { + if (Reader.Read32(0x60) != 0) + { + return(DISC_TYPE_WII); + } + else + { + return(DISC_TYPE_WII_CONTAINER); + } + } + } + + // check for GC + { + u32 MagicWord = Reader.Read32(0x1C); + + if (MagicWord == 0xC2339F3D) + { + return(DISC_TYPE_GC); + } + } + + return(DISC_TYPE_UNK); +} +} // namespace + diff --git a/Source/Core/DiscIO/Src/VolumeCreator.h b/Source/Core/DiscIO/Src/VolumeCreator.h new file mode 100644 index 0000000000..0975f567c9 --- /dev/null +++ b/Source/Core/DiscIO/Src/VolumeCreator.h @@ -0,0 +1,30 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef _VOLUME_CREATOR_H +#define _VOLUME_CREATOR_H + +#include "Volume.h" + +namespace DiscIO +{ +IVolume* CreateVolumeFromFilename(const std::string& _rFilename); +bool IsVolumeWiiDisc(const IVolume& _rVolume); +} // namespace + +#endif + diff --git a/Source/Core/DiscIO/Src/VolumeGC.cpp b/Source/Core/DiscIO/Src/VolumeGC.cpp new file mode 100644 index 0000000000..1e337bed9b --- /dev/null +++ b/Source/Core/DiscIO/Src/VolumeGC.cpp @@ -0,0 +1,157 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "stdafx.h" + +#include "VolumeGC.h" +#include "StringUtil.h" + +namespace DiscIO +{ +CVolumeGC::CVolumeGC(IBlobReader* _pReader) + : m_pReader(_pReader) +{} + + +CVolumeGC::~CVolumeGC() +{ + delete m_pReader; +} + + +bool +CVolumeGC::Read(u64 _Offset, u64 _Length, u8* _pBuffer) const +{ + if (m_pReader == NULL) + { + return(false); + } + + return(m_pReader->Read(_Offset, _Length, _pBuffer)); +} + + +std::string +CVolumeGC::GetName() const +{ + if (m_pReader == NULL) + { + return(false); + } + + char Name[128]; + + if (!Read(0x20, 0x60, (u8*)&Name)) + { + return(false); + } + + return(Name); +} + + +std::string +CVolumeGC::GetUniqueID() const +{ + if (m_pReader == NULL) + { + return(false); + } + + char ID[7]; + + if (!Read(0, 6, (u8*)ID)) + { + return(false); + } + + ID[6] = 0; + + return(ID); +} + + +IVolume::ECountry +CVolumeGC::GetCountry() const +{ + if (!m_pReader) + { + return(COUNTRY_UNKNOWN); + } + + u8 CountryCode; + m_pReader->Read(3, 1, &CountryCode); + + ECountry country = COUNTRY_UNKNOWN; + + switch (CountryCode) + { + case 'S': + country = COUNTRY_EUROPE; + break; // PAL // <- that is shitty :) zelda demo disc + + case 'P': + country = COUNTRY_EUROPE; + break; // PAL + + case 'D': + country = COUNTRY_EUROPE; + break; // PAL + + case 'F': + country = COUNTRY_FRANCE; + break; // PAL + + case 'X': + country = COUNTRY_EUROPE; + break; // XIII <- uses X but is PAL rip + + case 'E': + country = COUNTRY_USA; + break; // USA + + case 'J': + country = COUNTRY_JAP; + break; // JAP + + case 'O': + country = COUNTRY_UNKNOWN; + break; // SDK + + default: + // PanicAlert(StringFromFormat("Unknown Country Code!").c_str()); + country = COUNTRY_UNKNOWN; + break; + } + + return(country); +} + + +u64 +CVolumeGC::GetSize() const +{ + if (m_pReader) + { + return((size_t)m_pReader->GetDataSize()); + } + else + { + return(0); + } +} +} // namespace diff --git a/Source/Core/DiscIO/Src/VolumeGC.h b/Source/Core/DiscIO/Src/VolumeGC.h new file mode 100644 index 0000000000..d481c7818b --- /dev/null +++ b/Source/Core/DiscIO/Src/VolumeGC.h @@ -0,0 +1,54 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#pragma once + +#include "Volume.h" +#include "Blob.h" + +// +// --- this volume type is used for GC and for decrypted Wii images --- +// + +namespace DiscIO +{ +class CVolumeGC + : public IVolume +{ + public: + + CVolumeGC(IBlobReader* _pReader); + + ~CVolumeGC(); + + bool Read(u64 _Offset, u64 _Length, u8* _pBuffer) const; + + std::string GetName() const; + + std::string GetUniqueID() const; + + ECountry GetCountry() const; + + u64 GetSize() const; + + + private: + + IBlobReader* m_pReader; +}; +} // namespace + diff --git a/Source/Core/DiscIO/Src/VolumeWiiCrypted.cpp b/Source/Core/DiscIO/Src/VolumeWiiCrypted.cpp new file mode 100644 index 0000000000..51f0f862cb --- /dev/null +++ b/Source/Core/DiscIO/Src/VolumeWiiCrypted.cpp @@ -0,0 +1,196 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "stdafx.h" + +#include "VolumeWiiCrypted.h" +#include "StringUtil.h" + +namespace DiscIO +{ +CVolumeWiiCrypted::CVolumeWiiCrypted(IBlobReader* _pReader, u64 _VolumeOffset, const unsigned char* _pVolumeKey) + : m_pReader(_pReader), + m_pBuffer(0), + m_VolumeOffset(_VolumeOffset), + m_LastDecryptedBlockOffset(-1) +{ + AES_set_decrypt_key(_pVolumeKey, 128, &m_AES_KEY); + m_pBuffer = new u8[0x8000]; +} + + +CVolumeWiiCrypted::~CVolumeWiiCrypted() +{ + delete m_pReader; // is this really our responsibility? + delete[] m_pBuffer; +} + + +bool +CVolumeWiiCrypted::Read(u64 _ReadOffset, u64 _Length, u8* _pBuffer) const +{ + if (m_pReader == NULL) + { + return(false); + } + + while (_Length > 0) + { + static unsigned char IV[16]; + + // math block offset + u64 Block = _ReadOffset / 0x7C00; + u64 Offset = _ReadOffset % 0x7C00; + + // read current block + if (!m_pReader->Read(m_VolumeOffset + Block * 0x8000, 0x8000, m_pBuffer)) + { + return(false); + } + + if (m_LastDecryptedBlockOffset != Block) + { + memcpy(IV, m_pBuffer + 0x3d0, 16); + AES_cbc_encrypt(m_pBuffer + 0x400, m_LastDecryptedBlock, 0x7C00, &m_AES_KEY, IV, AES_DECRYPT); + + m_LastDecryptedBlockOffset = Block; + } + + // copy the encrypted data + u64 MaxSizeToCopy = 0x7C00 - Offset; + u64 CopySize = (_Length > MaxSizeToCopy) ? MaxSizeToCopy : _Length; + memcpy(_pBuffer, &m_LastDecryptedBlock[Offset], (size_t)CopySize); + + // increase buffers + _Length -= CopySize; + _pBuffer += CopySize; + _ReadOffset += CopySize; + } + + return(true); +} + + +std::string +CVolumeWiiCrypted::GetName() const +{ + if (m_pReader == NULL) + { + return(false); + } + + char Name[0xFF]; + + if (!Read(0x20, 0x60, (u8*)&Name)) + { + return(false); + } + + return(Name); +} + + +std::string +CVolumeWiiCrypted::GetUniqueID() const +{ + if (m_pReader == NULL) + { + return(false); + } + + char ID[7]; + + if (!Read(0, 6, (u8*)ID)) + { + return(false); + } + + ID[6] = 0; + + return(ID); +} + + +IVolume::ECountry +CVolumeWiiCrypted::GetCountry() const +{ + if (!m_pReader) + { + return(COUNTRY_UNKNOWN); + } + + u8 CountryCode; + m_pReader->Read(3, 1, &CountryCode); + + ECountry country = COUNTRY_UNKNOWN; + + switch (CountryCode) + { + case 'S': + country = COUNTRY_EUROPE; + break; // PAL // <- that is shitty :) zelda demo disc + + case 'P': + country = COUNTRY_EUROPE; + break; // PAL + + case 'D': + country = COUNTRY_EUROPE; + break; // PAL + + case 'F': + country = COUNTRY_FRANCE; + break; // PAL + + case 'X': + country = COUNTRY_EUROPE; + break; // XIII <- uses X but is PAL rip + + case 'E': + country = COUNTRY_USA; + break; // USA + + case 'J': + country = COUNTRY_JAP; + break; // JAP + + case 'O': + country = COUNTRY_UNKNOWN; + break; // SDK + + default: + PanicAlert(StringFromFormat("Unknown Country Code!").c_str()); + break; + } + + return(country); +} + + +u64 +CVolumeWiiCrypted::GetSize() const +{ + if (m_pReader) + { + return(m_pReader->GetDataSize()); + } + else + { + return(0); + } +} +} // namespace diff --git a/Source/Core/DiscIO/Src/VolumeWiiCrypted.h b/Source/Core/DiscIO/Src/VolumeWiiCrypted.h new file mode 100644 index 0000000000..aef579b0e8 --- /dev/null +++ b/Source/Core/DiscIO/Src/VolumeWiiCrypted.h @@ -0,0 +1,65 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef _VOLUME_WII_CRYPTED +#define _VOLUME_WII_CRYPTED + +#include "Volume.h" +#include "Blob.h" +#include "AES/aes.h" + +// +// --- this volume type is used for encrypted Wii images --- +// +namespace DiscIO +{ +class CVolumeWiiCrypted + : public IVolume +{ + public: + + CVolumeWiiCrypted(IBlobReader* _pReader, u64 _VolumeOffset, const unsigned char* _pVolumeKey); + + ~CVolumeWiiCrypted(); + + bool Read(u64 _Offset, u64 _Length, u8* _pBuffer) const; + + std::string GetName() const; + + std::string GetUniqueID() const; + + ECountry GetCountry() const; + + u64 GetSize() const; + + + private: + + IBlobReader* m_pReader; + + u8* m_pBuffer; + AES_KEY m_AES_KEY; + + u64 m_VolumeOffset; + + mutable u64 m_LastDecryptedBlockOffset; + mutable unsigned char m_LastDecryptedBlock[0x8000]; +}; +} // namespace + +#endif + diff --git a/Source/Core/DiscIO/Src/stdafx.cpp b/Source/Core/DiscIO/Src/stdafx.cpp new file mode 100644 index 0000000000..80a57737ae --- /dev/null +++ b/Source/Core/DiscIO/Src/stdafx.cpp @@ -0,0 +1,21 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "stdafx.h" + +// TODO: reference any additional headers you need in STDAFX.H +// and not in this file diff --git a/Source/Core/DiscIO/Src/stdafx.h b/Source/Core/DiscIO/Src/stdafx.h new file mode 100644 index 0000000000..531bd7ef53 --- /dev/null +++ b/Source/Core/DiscIO/Src/stdafx.h @@ -0,0 +1,30 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#pragma once + +#ifndef _WIN32_WINNT // Allow use of features specific to Windows XP or later. +#define _WIN32_WINNT 0x0501 // Change this to the appropriate value to target other versions of Windows. +#endif + +#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers + +#define _CRT_SECURE_NO_DEPRECATE +#define _SCL_SECURE_NO_DEPRECATE + + +// TODO: reference additional headers your program requires here diff --git a/Source/Core/DolphinWX/Dolphin.ini b/Source/Core/DolphinWX/Dolphin.ini new file mode 100644 index 0000000000..abb4239975 --- /dev/null +++ b/Source/Core/DolphinWX/Dolphin.ini @@ -0,0 +1,12 @@ +[General] +LastFilename = +GCMPathes = 0 +[Core] +GFXPlugin = +DSPPlugin = +PadPlugin = +HLEBios = False +UseDynarec = False +UseDualCore = False +Throttle = True +DefaultGCM = diff --git a/Source/Core/DolphinWX/DolphinWX.vcproj b/Source/Core/DolphinWX/DolphinWX.vcproj new file mode 100644 index 0000000000..5e5e5d0cdc --- /dev/null +++ b/Source/Core/DolphinWX/DolphinWX.vcproj @@ -0,0 +1,878 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Source/Core/DolphinWX/resources/Dolphin.c b/Source/Core/DolphinWX/resources/Dolphin.c new file mode 100644 index 0000000000..809ef68053 --- /dev/null +++ b/Source/Core/DolphinWX/resources/Dolphin.c @@ -0,0 +1,105 @@ +static const unsigned char dolphin_png[] = { +0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, +0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, +0x08, 0x03, 0x00, 0x00, 0x00, 0x44, 0xa4, 0x8a, 0xc6, 0x00, 0x00, 0x00, +0x01, 0x73, 0x52, 0x47, 0x42, 0x00, 0xae, 0xce, 0x1c, 0xe9, 0x00, 0x00, +0x03, 0x00, 0x50, 0x4c, 0x54, 0x45, 0x1a, 0x49, 0x6c, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x09, 0x1a, 0x27, 0x3a, 0xa4, 0xf0, 0x3a, 0xa3, 0xef, +0x3c, 0xa1, 0xea, 0x1a, 0x4a, 0x6d, 0x3a, 0xa2, 0xed, 0xf7, 0xfa, 0xfa, +0xff, 0xff, 0xff, 0xfd, 0xfd, 0xfd, 0x49, 0xa1, 0xe0, 0x3b, 0xa2, 0xec, +0xfb, 0xfd, 0xfc, 0xfe, 0xff, 0xfd, 0x4e, 0xa3, 0xe0, 0x3d, 0xa1, 0xe9, +0xd1, 0xe1, 0xeb, 0x8a, 0xbb, 0xde, 0xf2, 0xf6, 0xf7, 0xfa, 0xfb, 0xfc, +0xce, 0xde, 0xea, 0xe5, 0xee, 0xf2, 0xbb, 0xd2, 0xe1, 0xb3, 0xcf, 0xe5, +0xff, 0xff, 0xfe, 0xfe, 0xff, 0xfe, 0xe8, 0xf0, 0xf3, 0xe4, 0xec, 0xf1, +0xe5, 0xed, 0xf0, 0xe9, 0xf0, 0xf3, 0xfe, 0xfe, 0xfe, 0xf9, 0xfb, 0xfb, +0xb0, 0xcc, 0xe0, 0xfe, 0xfe, 0xff, 0xf9, 0xfa, 0xfb, 0x43, 0xa1, 0xe4, +0xef, 0xf3, 0xf6, 0xf0, 0xf5, 0xf7, 0x97, 0xc1, 0xde, 0xfe, 0xfe, 0xfd, +0xfd, 0xfd, 0xfc, 0x97, 0xbe, 0xdb, 0xfb, 0xfc, 0xfc, 0xed, 0xf3, 0xf6, +0x6e, 0xad, 0xda, 0xf3, 0xf6, 0xf8, 0x3b, 0xa1, 0xea, 0x6e, 0xad, 0xdb, +0xf4, 0xf8, 0xf9, 0xf1, 0xf6, 0xf7, 0x3f, 0xa1, 0xe7, 0x9b, 0xc1, 0xdd, +0xfc, 0xfd, 0xfc, 0xfb, 0xfd, 0xfb, 0xb9, 0xd1, 0xe1, 0xe0, 0xeb, 0xf2, +0xd3, 0xe3, 0xef, 0xff, 0xfe, 0xfe, 0xf2, 0xf7, 0xf7, 0xd5, 0xe4, 0xf0, +0xf6, 0xf9, 0xf9, 0xbd, 0xd5, 0xe5, 0xeb, 0xf1, 0xf4, 0xde, 0xea, 0xf2, +0xaa, 0xc9, 0xde, 0xfe, 0xff, 0xff, 0xef, 0xf4, 0xf6, 0xf8, 0xfa, 0xfb, +0xa0, 0xc4, 0xe1, 0xd6, 0xe5, 0xf0, 0xfa, 0xfc, 0xfc, 0xbd, 0xd5, 0xe7, +0xee, 0xf3, 0xf7, 0xf3, 0xf7, 0xfa, 0xc7, 0xd8, 0xe4, 0xcd, 0xde, 0xec, +0xda, 0xe6, 0xed, 0x9a, 0xc2, 0xdf, 0xe8, 0xef, 0xf4, 0xac, 0xcd, 0xe3, +0x8d, 0xbb, 0xdc, 0xd5, 0xe3, 0xeb, 0xfd, 0xff, 0xfe, 0xfc, 0xfd, 0xfd, +0xfe, 0xfd, 0xfd, 0xf7, 0xf9, 0xfa, 0xfd, 0xfe, 0xfd, 0xe7, 0xef, 0xf4, +0xa4, 0xc7, 0xe0, 0xf9, 0xfd, 0xfb, 0xf6, 0xfb, 0xfc, 0xb8, 0xd1, 0xe3, +0x5c, 0x2d, 0x00, 0x50, 0x45, 0x00, 0x72, 0x36, 0x00, 0x6f, 0x37, 0x00, +0x67, 0x35, 0x00, 0x72, 0x30, 0x00, 0x61, 0x00, 0x00, 0x6d, 0x55, 0x00, +0x20, 0x53, 0x00, 0x46, 0x45, 0x00, 0x69, 0x52, 0x00, 0x6c, 0x4e, 0x00, +0x65, 0x41, 0x00, 0x73, 0x4d, 0x00, 0x20, 0x45, 0x00, 0x28, 0x3d, 0x00, +0x78, 0x46, 0x00, 0x38, 0x69, 0x00, 0x36, 0x52, 0x00, 0x29, 0x45, 0x00, +0x00, 0x53, 0x00, 0x50, 0x00, 0x00, 0x72, 0x55, 0x00, 0x6f, 0x53, 0x00, +0x67, 0x45, 0x00, 0x72, 0x52, 0x00, 0x61, 0x50, 0x00, 0x6d, 0x52, 0x00, +0x57, 0x4f, 0x00, 0x36, 0x46, 0x00, 0x34, 0x49, 0x00, 0x33, 0x4c, 0x00, +0x32, 0x45, 0x00, 0x3d, 0x3d, 0x00, 0x43, 0x43, 0x00, 0x3a, 0x3a, 0x00, +0x5c, 0x5c, 0x00, 0x50, 0x55, 0x00, 0x72, 0x73, 0x00, 0x6f, 0x65, 0x00, +0x67, 0x72, 0x00, 0x72, 0x73, 0x00, 0x61, 0x5c, 0x00, 0x6d, 0x46, 0x00, +0x20, 0x69, 0x00, 0x46, 0x52, 0x00, 0x69, 0x45, 0x00, 0x6c, 0x53, 0x00, +0x65, 0x00, 0x00, 0x73, 0x56, 0x00, 0x00, 0x53, 0x00, 0x50, 0x38, 0x00, +0x55, 0x30, 0x00, 0x42, 0x43, 0x00, 0x4c, 0x4f, 0x00, 0x49, 0x4d, 0x00, +0x43, 0x4e, 0x00, 0x3d, 0x54, 0x00, 0x43, 0x4f, 0x00, 0x3a, 0x4f, 0x00, +0x5c, 0x4c, 0x00, 0x55, 0x53, 0x00, 0x73, 0x3d, 0x00, 0x65, 0x43, 0x00, +0x72, 0x3a, 0x00, 0x73, 0x5c, 0x00, 0x5c, 0x50, 0x00, 0x50, 0x72, 0x00, +0x75, 0x6f, 0x00, 0x62, 0x67, 0x00, 0x6c, 0x72, 0x00, 0x69, 0x61, 0x00, +0x63, 0x6d, 0x00, 0x00, 0x20, 0x00, 0x51, 0x46, 0x00, 0x54, 0x69, 0x00, +0x4a, 0x6c, 0x00, 0x41, 0x65, 0x00, 0x56, 0x73, 0x00, 0x41, 0x20, 0x00, +0x3d, 0x28, 0x00, 0x43, 0x78, 0x00, 0x3a, 0x38, 0x00, 0x5c, 0x36, 0x00, +0x50, 0x29, 0x00, 0x72, 0x5c, 0x00, 0x6f, 0x4d, 0x00, 0x67, 0x69, 0x00, +0x72, 0x63, 0x00, 0x61, 0x72, 0x00, 0x6d, 0x6f, 0x00, 0x20, 0x73, 0x00, +0x46, 0x6f, 0x00, 0x69, 0x66, 0x00, 0x6c, 0x74, 0x00, 0x65, 0x20, 0x00, +0x73, 0x56, 0x00, 0x20, 0x69, 0x00, 0x28, 0x73, 0x00, 0x78, 0x75, 0x00, +0x38, 0x61, 0x00, 0x36, 0x6c, 0x00, 0x29, 0x20, 0x00, 0x5c, 0x53, 0x00, +0x51, 0x74, 0x00, 0x75, 0x75, 0x00, 0x69, 0x64, 0x00, 0x63, 0x69, 0x00, +0x6b, 0x6f, 0x00, 0x54, 0x20, 0x00, 0x69, 0x38, 0x00, 0x6d, 0x5c, 0x00, +0x65, 0x43, 0x00, 0x5c, 0x6f, 0x00, 0x51, 0x6d, 0x00, 0x54, 0x6d, 0x00, +0x53, 0x6f, 0x00, 0x79, 0x6e, 0x00, 0x73, 0x37, 0x00, 0x74, 0x5c, 0x00, +0x65, 0x54, 0x00, 0x6d, 0x6f, 0x00, 0x5c, 0x6f, 0x00, 0x51, 0x6c, 0x00, +0x54, 0x73, 0x00, 0x4a, 0x5c, 0x00, 0x61, 0x00, 0x00, 0x76, 0x56, 0x00, +0x61, 0x54, 0x00, 0x2e, 0x55, 0x00, 0x7a, 0x4e, 0x00, 0x69, 0x45, 0x00, +0x70, 0x5f, 0x00, 0x00, 0x47, 0x00, 0x53, 0x4c, 0x00, 0x79, 0x4f, 0x00, +0x73, 0x42, 0x00, 0x74, 0x41, 0x00, 0x65, 0x4c, 0x00, 0x6d, 0x5f, 0x00, +0x44, 0x44, 0x00, 0x72, 0x49, 0x00, 0x69, 0x52, 0x00, 0x76, 0x3d, 0x00, +0x65, 0x43, 0x00, 0x3d, 0x3a, 0x00, 0x43, 0x5c, 0x00, 0x3a, 0x50, 0x00, +0x00, 0x72, 0x00, 0x53, 0x6f, 0x00, 0x79, 0x67, 0x00, 0x73, 0x72, 0x00, +0x74, 0x61, 0x00, 0x65, 0x6d, 0x00, 0x6d, 0x20, 0x00, 0x52, 0x46, 0x00, +0x6f, 0x69, 0x00, 0x6f, 0x6c, 0x00, 0x74, 0x65, 0x00, 0x3d, 0x73, 0x00, +0x43, 0x20, 0x00, 0x3a, 0x28, 0x00, 0x5f, 0x14, 0x5a, 0x5b, 0x00, 0x00, +0x00, 0x01, 0x74, 0x52, 0x4e, 0x53, 0x00, 0x40, 0xe6, 0xd8, 0x66, 0x00, +0x00, 0x00, 0x01, 0x62, 0x4b, 0x47, 0x44, 0x00, 0x88, 0x05, 0x1d, 0x48, +0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, +0x00, 0x00, 0x0b, 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, +0x07, 0x74, 0x49, 0x4d, 0x45, 0x07, 0xd8, 0x03, 0x17, 0x09, 0x38, 0x11, +0xca, 0x29, 0x86, 0x92, 0x00, 0x00, 0x01, 0x37, 0x49, 0x44, 0x41, 0x54, +0x38, 0xcb, 0x8d, 0xd3, 0xd7, 0x52, 0xc3, 0x30, 0x10, 0x05, 0xd0, 0x70, +0xc7, 0x66, 0x88, 0x8c, 0x31, 0xa1, 0x23, 0x53, 0x1c, 0x42, 0xef, 0x84, +0x12, 0x7a, 0x27, 0xa1, 0xf7, 0x5e, 0xfe, 0xff, 0x37, 0xd8, 0x38, 0x96, +0x90, 0xec, 0x85, 0x61, 0x67, 0xfc, 0x74, 0xcf, 0xac, 0x8a, 0xb5, 0xb9, +0xdc, 0x7f, 0xca, 0xf9, 0xa5, 0x98, 0xd8, 0x45, 0xbd, 0x9a, 0x6d, 0x62, +0xe4, 0x2d, 0xc8, 0x0b, 0x21, 0x3c, 0xb4, 0x9a, 0xc0, 0xc8, 0x7d, 0xb4, +0x05, 0x04, 0x44, 0x80, 0x76, 0x43, 0xe8, 0xde, 0xf4, 0x79, 0x22, 0x29, +0x14, 0x6c, 0x40, 0xeb, 0x76, 0x74, 0x02, 0x5d, 0x81, 0x02, 0xdd, 0xb0, +0x00, 0x7a, 0x7a, 0xd1, 0xd7, 0x0f, 0xc8, 0x50, 0x01, 0x89, 0x54, 0x87, +0x81, 0xc1, 0xa1, 0x61, 0x20, 0x52, 0xb9, 0x28, 0xc2, 0xb5, 0xc1, 0x88, +0x0c, 0x4b, 0x26, 0x18, 0xc5, 0x98, 0x0d, 0xc6, 0x75, 0xf3, 0xa4, 0x22, +0xd8, 0x60, 0x22, 0x10, 0xd2, 0x02, 0x5e, 0x0a, 0x4c, 0xe6, 0xa7, 0x22, +0x33, 0x9f, 0x56, 0xe7, 0x54, 0xf7, 0x40, 0xe7, 0x9c, 0x99, 0xfd, 0xc9, +0xe7, 0xe0, 0xa7, 0x2f, 0x8a, 0xcc, 0xfc, 0x82, 0xca, 0x03, 0x2c, 0x3a, +0x59, 0xe0, 0x60, 0xa9, 0x9c, 0x80, 0x70, 0x19, 0x2b, 0x0c, 0x70, 0xb0, +0xaa, 0xcf, 0xb2, 0xa6, 0xd6, 0xb0, 0x80, 0x0b, 0x0d, 0xa2, 0x0a, 0xb8, +0x0e, 0xeb, 0x7a, 0x97, 0x61, 0xb4, 0x01, 0x06, 0x6c, 0x6a, 0xb0, 0xb5, +0xcd, 0x76, 0xd8, 0xd1, 0x60, 0x17, 0xec, 0x26, 0xf7, 0xf4, 0x6d, 0xee, +0xb3, 0xc0, 0x05, 0xbd, 0x87, 0x86, 0x39, 0xe0, 0x3b, 0x1c, 0x1e, 0x11, +0x38, 0x3e, 0x21, 0x50, 0xe5, 0x41, 0x8d, 0xa2, 0x53, 0x9c, 0x09, 0x71, +0x0e, 0x87, 0x05, 0x17, 0x04, 0x2e, 0x71, 0x25, 0xe4, 0x35, 0x0b, 0x70, +0x13, 0x3f, 0x57, 0xdc, 0xd2, 0x83, 0xba, 0x4b, 0xbd, 0xa8, 0x38, 0xbf, +0xaf, 0x34, 0x40, 0xfd, 0x9f, 0x95, 0xca, 0xc8, 0x0c, 0x06, 0x1e, 0x1e, +0xa5, 0x7c, 0x7a, 0x06, 0x8a, 0x2f, 0x9e, 0x78, 0x7d, 0x43, 0x66, 0xb2, +0xf0, 0xfe, 0xf1, 0xf9, 0x05, 0x14, 0xfc, 0x78, 0xfa, 0xc0, 0x4c, 0x67, +0x13, 0x15, 0x3b, 0xbc, 0x7f, 0xd7, 0x37, 0x18, 0xac, 0x24, 0xa2, 0x38, +0x41, 0xd3, 0xc8, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, +0x42, 0x60, 0x82, +}; diff --git a/Source/Core/DolphinWX/resources/Dolphin.xpm b/Source/Core/DolphinWX/resources/Dolphin.xpm new file mode 100644 index 0000000000..229eeb0a6a --- /dev/null +++ b/Source/Core/DolphinWX/resources/Dolphin.xpm @@ -0,0 +1,129 @@ +/* XPM */ +static const char *Dolphin_xpm[] = { +"32 32 94 2", +" c None", +". c #000000", +"+ c #1A496C", +"@ c #091A27", +"# c #3AA4F0", +"$ c #3AA3EF", +"% c #3CA1EA", +"& c #1A4A6D", +"* c #3AA2ED", +"= c #F7FAFA", +"- c #FFFFFF", +"; c #FDFDFD", +"> c #49A1E0", +", c #3BA2EC", +"' c #FBFDFC", +") c #FEFFFD", +"! c #4EA3E0", +"~ c #3DA1E9", +"{ c #D1E1EB", +"] c #8ABBDE", +"^ c #F2F6F7", +"/ c #FAFBFC", +"( c #CEDEEA", +"_ c #E5EEF2", +": c #BBD2E1", +"< c #B3CFE5", +"[ c #FFFFFE", +"} c #FEFFFE", +"| c #E8F0F3", +"1 c #E4ECF1", +"2 c #E5EDF0", +"3 c #E9F0F3", +"4 c #FEFEFE", +"5 c #F9FBFB", +"6 c #B0CCE0", +"7 c #FEFEFF", +"8 c #F9FAFB", +"9 c #43A1E4", +"0 c #EFF3F6", +"a c #F0F5F7", +"b c #97C1DE", +"c c #FEFEFD", +"d c #FDFDFC", +"e c #97BEDB", +"f c #FBFCFC", +"g c #EDF3F6", +"h c #6EADDA", +"i c #F3F6F8", +"j c #3BA1EA", +"k c #6EADDB", +"l c #F4F8F9", +"m c #F1F6F7", +"n c #3FA1E7", +"o c #9BC1DD", +"p c #FCFDFC", +"q c #FBFDFB", +"r c #B9D1E1", +"s c #E0EBF2", +"t c #D3E3EF", +"u c #FFFEFE", +"v c #F2F7F7", +"w c #D5E4F0", +"x c #F6F9F9", +"y c #BDD5E5", +"z c #EBF1F4", +"A c #DEEAF2", +"B c #AAC9DE", +"C c #FEFFFF", +"D c #EFF4F6", +"E c #F8FAFB", +"F c #A0C4E1", +"G c #D6E5F0", +"H c #FAFCFC", +"I c #BDD5E7", +"J c #EEF3F7", +"K c #F3F7FA", +"L c #C7D8E4", +"M c #CDDEEC", +"N c #DAE6ED", +"O c #9AC2DF", +"P c #E8EFF4", +"Q c #ACCDE3", +"R c #8DBBDC", +"S c #D5E3EB", +"T c #FDFFFE", +"U c #FCFDFD", +"V c #FEFDFD", +"W c #F7F9FA", +"X c #FDFEFD", +"Y c #E7EFF4", +"Z c #A4C7E0", +"` c #F9FDFB", +" . c #F6FBFC", +".. c #B8D1E3", +" . . + . . . . . . . . . . . . . . . . . . . . . . . . ", +". @ . . # # # # # # # # # # # # # # # # # # # # # # # # . . ", +". . # # # # # # # # # # # # $ . . . . . % # # # # # # # # # . ", +"& . # # # # # # # # # # # * . = - - - ; . > # # # # # # # # . ", +". # # # # # # # # # # # , . ' ) - - - - ) . ! # # # # # # # # . ", +". # # # # # # $ . . # $ . ; - - - - - - - - . ~ # # # # # # # . ", +". # # # # . . . { ] . . ^ ) - - - - - - - - / . # # # # # # # . ", +". # # # . ( _ . : < . . [ } - - - - - - - - [ . # # # # # # # . ", +". # # # # . | 1 2 3 . . 4 - - - - - - - - - 5 . $ # # # # # # . ", +". # # # # . 6 [ } 7 . . 4 - - - - - - - - - 8 . 9 # # # # # # . ", +". # # # # . 0 } - - - - - - - - - - - - - - - 4 . # # # # # # . ", +". # # # # . a ) - [ - - - - - - - - - - - - - ; . # # # # # # . ", +". # # # # . b = c 4 - - - - - - - - - - - - d . ~ # # # # # # . ", +". # # # # # . . . e f - - - - - - - - - - g . , # # # # # # # . ", +". # # # # # # # # . h i - - - - - - - - ) . j # # # # # # # # . ", +". # # # # # # # # # . k l - - - - - - - } m . n # # # # # # # . ", +". # # # # # # # # # # . o } - - - - - - - - p . , # # # # # # . ", +". # # # # # # # # # # $ . } - - - - - - - - 4 q . # # # # # # . ", +". # # # # # # # # # # . r - - - - - - - - - } 4 s . # # # # # . ", +". # # # # # # # # # # . t - - - - - - - - - u v . # # # # # # . ", +". # # # # # # # # # # . w - - - - - - - - - x . # # # # # # # . ", +". # # # # # # # # # # . y [ - - - - - - - - z . # # # # # # # . ", +". # # # # # # # # # # $ . ) - - [ - - - - - A . # # # # # # # . ", +". # # # # # # # # # # . B C - - [ D E - - - F . # # # # # # # . ", +". # # # # # # # # # # . G - - - H . I - - J . # # # # # # # # . ", +". # # # # # # # # # # . K - - - L . M - [ N . # # # # # # # # . ", +". # # # # # # # # # . O - - - - . . P - - 5 Q . $ # # # # # # . ", +". # # # # # # # # . R q - - - - . . i - - - 7 l . # # # # # # . ", +" . # # # # # # # . S T [ [ U V . . 5 W ; - X Y . # # # # # . ", +" . # # # # # # # . Z ` .... . ~ , . . . . . . # # # # # # . ", +" . . # # # # # # . . . . # # # # # # # # # # # # # # . . ", +" . . . . . . . . . . . . . . . . . . . . . . . . "}; diff --git a/Source/Core/DolphinWX/resources/Flag_Europe.xpm b/Source/Core/DolphinWX/resources/Flag_Europe.xpm new file mode 100644 index 0000000000..49ff790a9f --- /dev/null +++ b/Source/Core/DolphinWX/resources/Flag_Europe.xpm @@ -0,0 +1,83 @@ +/* XPM */ +static const char *const Flag_Europe_xpm[] = { +"96 32 48 1", +" c None", +". c #000000", +"+ c #0000FD", +"@ c #0000FF", +"# c #0808F7", +"$ c #5C5CA3", +"% c #1717E8", +"& c #767680", +"* c #EDED00", +"= c #A5A54D", +"- c #2E2EB9", +"; c #96961A", +"> c #4A4A8E", +", c #0000FB", +"' c #0000F4", +") c #0808EC", +"! c #5C5C9B", +"~ c #1717DD", +"{ c #0000EE", +"] c #767677", +"^ c #A5A547", +"/ c #0000DD", +"( c #2E2EA0", +"_ c #969616", +": c #4A4A7B", +"< c #0000D2", +"[ c #0000C6", +"} c #0808BF", +"| c #5C5C7E", +"1 c #1717B4", +"2 c #0000B9", +"3 c #76765C", +"4 c #A5A537", +"5 c #0808B3", +"6 c #5C5C76", +"7 c #1717A8", +"8 c #0000A9", +"9 c #2E2E7A", +"0 c #969611", +"a c #4A4A5E", +"b c #767654", +"c c #A5A533", +"d c #000097", +"e c #2E2E6D", +"f c #96960F", +"g c #4A4A54", +"h c #000081", +"i c #000077", +" ", +" ", +" ", +" ", +" ", +"................................ ", +".++++++++++++++++++++++++++++++. ", +".@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@. ", +".@@@@@@@@@@@@@#$%@@@@@@@@@@@@@@. ", +".@@@@@@@@@#$%@&*=@#$%@@@@@@@@@@. ", +".@@@@@@@@@&*=@-;>@&*=@@@@@@@@@@. ", +".@@@@@@@@@-;>@@@@@-;>@@@@@@@@@@. ", +".,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,. ", +".''''''')!~''''''''')!~''''''''. ", +".{{{{{{{]*^{{{{{{{{{]*^{{{{{{{{. ", +".///////(_://///////(_:////////. ", +".<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<. ", +".[[[[[[[[[}|1[[[[[}|1[[[[[[[[[[. ", +".2222222223*4256723*42222222222. ", +".88888888890a8b*c890a8888888888. ", +".dddddddddddddefgdddddddddddddd. ", +".hhhhhhhhhhhhhhhhhhhhhhhhhhhhhh. ", +".iiiiiiiiiiiiiiiiiiiiiiiiiiiiii. ", +".iiiiiiiiiiiiiiiiiiiiiiiiiiiiii. ", +"................................ ", +" ", +" ", +" ", +" ", +" ", +" ", +" "}; diff --git a/Source/Core/DolphinWX/resources/Flag_France.xpm b/Source/Core/DolphinWX/resources/Flag_France.xpm new file mode 100644 index 0000000000..157277efec --- /dev/null +++ b/Source/Core/DolphinWX/resources/Flag_France.xpm @@ -0,0 +1,80 @@ +/* XPM */ +static const char *const Flag_France_xpm[] = { +"96 32 45 1", +" c None", +". c #000000", +"+ c #0000FF", +"@ c #FFFFFF", +"# c #FF0000", +"$ c #0000FC", +"% c #0000F8", +"& c #FCFCFC", +"* c #FC0000", +"= c #0000F2", +"- c #F8F8F8", +"; c #F80000", +"> c #0000EC", +", c #F2F2F2", +"' c #F20000", +") c #0000E3", +"! c #ECECEC", +"~ c #EC0000", +"{ c #0000DB", +"] c #E3E3E3", +"^ c #E30000", +"/ c #0000D2", +"( c #DBDBDB", +"_ c #DB0000", +": c #0000C8", +"< c #D2D2D2", +"[ c #D20000", +"} c #0000BD", +"| c #C8C8C8", +"1 c #C80000", +"2 c #0000B1", +"3 c #BDBDBD", +"4 c #BD0000", +"5 c #0000A3", +"6 c #B1B1B1", +"7 c #B10000", +"8 c #000093", +"9 c #A3A3A3", +"0 c #A30000", +"a c #000080", +"b c #939393", +"c c #930000", +"d c #000077", +"e c #808080", +"f c #800000", +" ", +" ", +" ", +" ", +" ", +"................................ ", +".++++++++++@@@@@@@@@@@#########. ", +".++++++++++@@@@@@@@@@@#########. ", +".++++++++++@@@@@@@@@@@#########. ", +".++++++++++@@@@@@@@@@@#########. ", +".$$$$$$$$$$@@@@@@@@@@@#########. ", +".%%%%%%%%%%&&&&&&&&&&&*********. ", +".==========-----------;;;;;;;;;. ", +".>>>>>>>>>>,,,,,,,,,,,'''''''''. ", +".))))))))))!!!!!!!!!!!~~~~~~~~~. ", +".{{{{{{{{{{]]]]]]]]]]]^^^^^^^^^. ", +".//////////(((((((((((_________. ", +".::::::::::<<<<<<<<<<<[[[[[[[[[. ", +".}}}}}}}}}}|||||||||||111111111. ", +".222222222233333333333444444444. ", +".555555555566666666666777777777. ", +".888888888899999999999000000000. ", +".aaaaaaaaaabbbbbbbbbbbccccccccc. ", +".ddddddddddeeeeeeeeeeefffffffff. ", +"................................ ", +" ", +" ", +" ", +" ", +" ", +" ", +" "}; diff --git a/Source/Core/DolphinWX/resources/Flag_Japan.xpm b/Source/Core/DolphinWX/resources/Flag_Japan.xpm new file mode 100644 index 0000000000..794bbc0b78 --- /dev/null +++ b/Source/Core/DolphinWX/resources/Flag_Japan.xpm @@ -0,0 +1,102 @@ +/* XPM */ +static const char * const Flag_Japan_xpm[] = { +"96 32 67 1", +" c None", +". c #000000", +"+ c #FFFFFF", +"@ c #FECACA", +"# c #FD8080", +"$ c #FD6161", +"% c #FD7676", +"& c #FEB6B6", +"* c #FEFEFE", +"= c #FFEDED", +"- c #FF4C4C", +"; c #FF0000", +"> c #FF2F2F", +", c #FFD7D7", +"' c #FEF5F5", +") c #FE2E2E", +"! c #FE1313", +"~ c #FEDDDD", +"{ c #F9F9F9", +"] c #FC7777", +"^ c #FD4545", +"/ c #F4F4F4", +"( c #F4F3F3", +"_ c #FA1313", +": c #FB0000", +"< c #FA0000", +"[ c #F4D4D4", +"} c #EFEFEF", +"| c #EFCFCF", +"1 c #F10000", +"2 c #EF9F9F", +"3 c #E4E4E4", +"4 c #E2BEBE", +"5 c #DD0000", +"6 c #E19090", +"7 c #D9D9D9", +"8 c #D8D0D0", +"9 c #CA0404", +"0 c #CA0000", +"a c #D5A9A9", +"b c #D0D0D0", +"c c #BC4242", +"d c #B40000", +"e c #B71A1A", +"f c #CFCFCF", +"g c #C6C6C6", +"h c #BEA7A7", +"i c #990808", +"j c #980000", +"k c #B78787", +"l c #BBBBBB", +"m c #A88989", +"n c #7B0B0B", +"o c #770000", +"p c #780202", +"q c #9E6B6B", +"r c #AEAEAE", +"s c #A89C9C", +"t c #8F4E4E", +"u c #7F1B1B", +"v c #7A0A0A", +"w c #7D1515", +"x c #8B4242", +"y c #A48F8F", +"z c #A0A0A0", +"A c #8F8F8F", +"B c #7C7C7C", +" ", +" ", +" ", +" ", +" ", +"................................ ", +".++++++++++++++++++++++++++++++. ", +".++++++++++++++++++++++++++++++. ", +".++++++++++++++++++++++++++++++. ", +".++++++++++++@#$%&*++++++++++++. ", +".++++++++++=-;;;;;>,+++++++++++. ", +".*********');;;;;;;!~**********. ", +".{{{{{{{{{];;;;;;;;;^{{{{{{{{{{. ", +".////////(_:::::::::<[/////////. ", +".}}}}}}}}|111111111112}}}}}}}}}. ", +".333333334555555555556333333333. ", +".77777777890000000000a777777777. ", +".bbbbbbbbbcdddddddddefbbbbbbbbb. ", +".ggggggggghijjjjjjjjkgggggggggg. ", +".llllllllllmnooooopqlllllllllll. ", +".rrrrrrrrrrrstuvwxyrrrrrrrrrrrr. ", +".zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz. ", +".AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA. ", +".BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB. ", +"................................ ", +" ", +" ", +" ", +" ", +" ", +" ", +" "}; diff --git a/Source/Core/DolphinWX/resources/Flag_USA.xpm b/Source/Core/DolphinWX/resources/Flag_USA.xpm new file mode 100644 index 0000000000..90ccbedd8d --- /dev/null +++ b/Source/Core/DolphinWX/resources/Flag_USA.xpm @@ -0,0 +1,65 @@ +/* XPM */ +static const char * Flag_USA_xpm[] = { +"96 32 30 1", +" c None", +". c #000000", +"+ c #0000FF", +"@ c #CE7070", +"# c #B0BF99", +"$ c #F1F1F1", +"% c #FFFFFF", +"& c #0000FD", +"* c #CF8484", +"= c #DA9090", +"- c #0000F3", +"; c #B0BF96", +"> c #0000DF", +", c #0000CB", +"' c #B0BF8C", +") c #D98E8E", +"! c #0000B5", +"~ c #CA6C6C", +"{ c #000098", +"] c #B0BF80", +"^ c #000077", +"/ c #C26464", +"( c #DBDBDB", +"_ c #C17676", +": c #B55757", +"< c #BBBBBB", +"[ c #AC6161", +"} c #A34545", +"| c #8B8B8B", +"1 c #8E4343", +" ", +" ", +" ", +" ", +" ", +"................................ ", +".++++++++++++++@@@@@@@@@@@@@@@@. ", +".+#+#+#+#+#+#++$%%%%%%%%%%%%%%%. ", +".&&&&&&&&&&&&&&*===============. ", +".-;-;-;-;-;-;--@@@@@@@@@@@@@@@@. ", +".>>>>>>>>>>>>>>$%%%%%%%%%%%%%%%. ", +".,',',',',',',,*))))))))))))))). ", +".!!!!!!!!!!!!!!@~~~~~~~~~~~~~~~. ", +".{]{]{]{]{]{]{{$$$$$$$$$$$$$$$$. ", +".^^^^^^^^^^^^^^****************. ", +".^^^^^^^^^^^^^^@///////////////. ", +".((((((((((((((((((((((((((((((. ", +".______________________________. ", +".::::::::::::::::::::::::::::::. ", +".<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<. ", +".[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[. ", +".}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}. ", +".||||||||||||||||||||||||||||||. ", +".111111111111111111111111111111. ", +"................................ ", +" ", +" ", +" ", +" ", +" ", +" ", +" "}; diff --git a/Source/Core/DolphinWX/resources/toolbar_browse.c b/Source/Core/DolphinWX/resources/toolbar_browse.c new file mode 100644 index 0000000000..1f2c0368dc --- /dev/null +++ b/Source/Core/DolphinWX/resources/toolbar_browse.c @@ -0,0 +1,303 @@ +static const unsigned char toolbar_browse_png[] = { +0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, +0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, +0x08, 0x06, 0x00, 0x00, 0x00, 0x57, 0x02, 0xf9, 0x87, 0x00, 0x00, 0x00, +0x04, 0x73, 0x42, 0x49, 0x54, 0x08, 0x08, 0x08, 0x08, 0x7c, 0x08, 0x64, +0x88, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, +0x12, 0x00, 0x00, 0x0b, 0x12, 0x01, 0xd2, 0xdd, 0x7e, 0xfc, 0x00, 0x00, +0x00, 0x25, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, +0x72, 0x65, 0x00, 0x4d, 0x61, 0x63, 0x72, 0x6f, 0x6d, 0x65, 0x64, 0x69, +0x61, 0x20, 0x46, 0x69, 0x72, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, +0x4d, 0x58, 0x20, 0x32, 0x30, 0x30, 0x34, 0x87, 0x76, 0xac, 0xcf, 0x00, +0x00, 0x00, 0x14, 0x74, 0x45, 0x58, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, +0x69, 0x6f, 0x6e, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x00, 0x39, 0x2f, 0x37, +0x2f, 0x30, 0x34, 0x6b, 0xeb, 0x0c, 0x3b, 0x00, 0x00, 0x0d, 0x67, 0x49, +0x44, 0x41, 0x54, 0x78, 0x9c, 0xd5, 0x9a, 0x6b, 0x6c, 0x5c, 0xd7, 0x71, +0xc7, 0x7f, 0xe7, 0xdc, 0xe7, 0x3e, 0xb9, 0x94, 0x44, 0xbd, 0x2c, 0x59, +0xb4, 0x1d, 0x07, 0xae, 0x15, 0xcb, 0x8c, 0x1b, 0x07, 0x89, 0xfb, 0x30, +0x8d, 0xe6, 0x4b, 0x01, 0x07, 0x16, 0x90, 0x0f, 0xaa, 0x11, 0xb4, 0x92, +0x11, 0x34, 0xfa, 0x50, 0xa0, 0x56, 0x9a, 0xf6, 0x83, 0xe1, 0xc6, 0xa2, +0x13, 0xa4, 0x89, 0x61, 0x3b, 0xb6, 0xf3, 0x4d, 0x42, 0x52, 0x4b, 0x49, +0x1c, 0x47, 0x68, 0x0b, 0xdb, 0x40, 0xd1, 0x3a, 0x68, 0x0a, 0x33, 0x45, +0x5a, 0xa7, 0x8e, 0x1f, 0xb4, 0x1d, 0xcb, 0x0f, 0x89, 0x12, 0x25, 0x5a, +0xa4, 0x44, 0x8a, 0xe2, 0x63, 0x49, 0xee, 0xee, 0xbd, 0xf7, 0xcc, 0xf4, +0xc3, 0x5d, 0x52, 0x0f, 0x4b, 0xa2, 0x02, 0xb1, 0x2d, 0x32, 0xc0, 0xe1, +0x1e, 0xec, 0xf2, 0x9e, 0xf9, 0xff, 0xcf, 0xcc, 0x9c, 0x33, 0x33, 0xbb, +0x46, 0x55, 0xf9, 0x6d, 0x16, 0xfb, 0xff, 0x0d, 0xe0, 0x6a, 0xc5, 0xff, +0xdf, 0x58, 0xf4, 0x5f, 0xbf, 0x65, 0x6a, 0x22, 0x3c, 0x29, 0xc2, 0x76, +0x11, 0x10, 0x61, 0x40, 0x94, 0xaf, 0x7c, 0xe1, 0xeb, 0xda, 0xbf, 0xdc, +0xba, 0xcc, 0x72, 0xbb, 0xd0, 0x4f, 0x1f, 0x31, 0x35, 0x11, 0x5e, 0x12, +0xa1, 0x47, 0x04, 0x44, 0xa1, 0x4d, 0x02, 0x11, 0xee, 0x7b, 0xe7, 0x10, +0xfb, 0xfa, 0x0e, 0x2c, 0x9f, 0xce, 0x65, 0x77, 0x21, 0x03, 0x4f, 0x1b, +0xe8, 0x31, 0x06, 0xe2, 0xb2, 0x21, 0x8a, 0xcc, 0xb9, 0x1f, 0x3e, 0xfd, +0x3b, 0x1f, 0x63, 0x2b, 0xec, 0x5d, 0x3e, 0x7d, 0xcb, 0x69, 0x81, 0x9f, +0x3d, 0x6a, 0xee, 0x17, 0xe1, 0x49, 0x51, 0xe8, 0xea, 0x36, 0x74, 0xac, +0xb6, 0x64, 0x2d, 0xc3, 0x89, 0xc3, 0xca, 0xd4, 0xb8, 0x20, 0xaa, 0x88, +0x30, 0x25, 0xc2, 0x75, 0xf7, 0x7e, 0x4b, 0xa7, 0x96, 0x43, 0xe7, 0xb2, +0x59, 0xe0, 0xa5, 0xc7, 0x4d, 0x0d, 0x43, 0x1f, 0x06, 0x56, 0x6c, 0x30, +0x6c, 0xd8, 0x72, 0x17, 0xd7, 0xff, 0xe1, 0xbf, 0xd0, 0xfd, 0xfb, 0xdf, +0xe3, 0xda, 0x5b, 0x36, 0x11, 0x95, 0x3c, 0xc0, 0x00, 0xd4, 0x80, 0xfb, +0x97, 0xcb, 0x0a, 0xcb, 0x46, 0x40, 0xe1, 0x69, 0x94, 0x5a, 0x10, 0xc1, +0x35, 0xb7, 0xdc, 0xc4, 0x9a, 0x9b, 0x1f, 0xc1, 0xfa, 0x1d, 0xc4, 0x95, +0x1b, 0xd9, 0xf8, 0xbb, 0x7d, 0xac, 0xd9, 0x54, 0xc0, 0xd8, 0x45, 0x75, +0xbb, 0x86, 0x0e, 0x7e, 0xb0, 0x2c, 0x7a, 0x97, 0x85, 0x40, 0xff, 0x13, +0xa6, 0x17, 0xd8, 0x0a, 0x70, 0x6d, 0x0f, 0x74, 0xdd, 0xf8, 0x30, 0xf9, +0x01, 0xe7, 0x33, 0x7d, 0xea, 0x75, 0x8e, 0xfc, 0xea, 0x51, 0x2a, 0xab, +0x2a, 0x94, 0x3a, 0x42, 0x30, 0xb9, 0x15, 0xfe, 0x73, 0xff, 0xe3, 0xf7, +0x2c, 0x87, 0x15, 0x96, 0x85, 0x80, 0x2a, 0xbb, 0x55, 0xa1, 0xdc, 0x05, +0x6b, 0x37, 0xff, 0x05, 0x61, 0x71, 0x33, 0xe0, 0xd3, 0xac, 0x1f, 0x67, +0x68, 0xe0, 0xbb, 0x38, 0xb1, 0x88, 0xad, 0xd1, 0xb5, 0xb1, 0x82, 0x35, +0x8b, 0x27, 0xf7, 0xd6, 0xe5, 0xd0, 0x7d, 0xd5, 0x04, 0xfa, 0x9f, 0x30, +0xbd, 0x28, 0xbd, 0x00, 0x1b, 0x7b, 0xaa, 0x14, 0x57, 0x7c, 0x89, 0x85, +0xdd, 0x1f, 0x3e, 0xf8, 0x14, 0x4a, 0x08, 0xb6, 0x00, 0xb6, 0x4a, 0xa5, +0xab, 0x83, 0xb8, 0x12, 0xa2, 0x18, 0x14, 0xb6, 0x8e, 0x0d, 0x8f, 0x5c, +0xad, 0xfa, 0xab, 0x27, 0xa0, 0xca, 0x6e, 0x51, 0x08, 0x4a, 0xd0, 0x75, +0xc3, 0x97, 0x30, 0x76, 0x05, 0xe0, 0x33, 0x31, 0xfc, 0xf7, 0x34, 0x67, +0x8f, 0x81, 0x09, 0xc0, 0xc6, 0xe0, 0x95, 0xc0, 0xab, 0xd1, 0xb9, 0xb6, +0x84, 0xb5, 0x1e, 0x28, 0xb5, 0x17, 0x9f, 0x7a, 0xb8, 0xe7, 0x6a, 0xdd, +0xe8, 0xaa, 0x08, 0xbc, 0xf4, 0x1d, 0xd3, 0xab, 0x4a, 0xaf, 0x2a, 0x74, +0xdf, 0xde, 0x41, 0x50, 0xde, 0x09, 0xf8, 0x88, 0x9b, 0x67, 0xfa, 0xd4, +0x01, 0x8c, 0xb5, 0x18, 0xeb, 0x61, 0xbd, 0x00, 0xeb, 0x17, 0xb0, 0x7e, +0x95, 0x55, 0x1b, 0x6a, 0x18, 0x7f, 0xd1, 0x8d, 0x6e, 0xbd, 0x2a, 0xf4, +0xfc, 0x86, 0xa9, 0x44, 0xff, 0x77, 0x4c, 0x2f, 0x50, 0x53, 0xe8, 0x41, +0x41, 0x94, 0x3b, 0x55, 0xc1, 0x0b, 0x61, 0xfd, 0xe6, 0x3f, 0xc6, 0x98, +0x15, 0x80, 0x63, 0x7e, 0x72, 0x3f, 0xe8, 0x0c, 0xc6, 0xab, 0x61, 0x14, +0x8c, 0xb5, 0x78, 0x9e, 0x8f, 0x31, 0x05, 0x82, 0x42, 0x99, 0x4a, 0x2d, +0xe6, 0x4c, 0xa3, 0x85, 0xa2, 0x3b, 0x9e, 0xfe, 0xab, 0x9d, 0x9d, 0x22, +0x3b, 0x07, 0x44, 0x98, 0xfa, 0xf3, 0xef, 0xea, 0x00, 0x40, 0xdf, 0x36, +0x73, 0x9e, 0xde, 0xcb, 0xdd, 0xdc, 0x97, 0xbd, 0xc8, 0x7e, 0xf6, 0xa8, +0xe9, 0x31, 0x86, 0x1d, 0xc0, 0x9d, 0xc6, 0xd0, 0xb3, 0xf0, 0xfe, 0xc2, +0x23, 0xaa, 0xf9, 0xd8, 0xd0, 0x03, 0x37, 0x7d, 0xee, 0x17, 0x18, 0x7b, +0x33, 0x2a, 0x67, 0x98, 0x18, 0xba, 0x9d, 0xb9, 0x69, 0x47, 0x63, 0xbe, +0x46, 0x96, 0xae, 0xc4, 0x8f, 0x56, 0xe2, 0x07, 0x45, 0xac, 0x51, 0xc8, +0x26, 0x38, 0x3d, 0x74, 0x94, 0x0f, 0xde, 0x18, 0x27, 0x4b, 0xb3, 0x0b, +0x53, 0x8d, 0x85, 0xbc, 0xe9, 0x4d, 0x11, 0x06, 0x44, 0x78, 0xde, 0x16, +0x57, 0x0f, 0xc5, 0xc5, 0x02, 0x23, 0x47, 0x8e, 0x5d, 0x94, 0xcc, 0x45, +0x2d, 0xf0, 0xe2, 0xb7, 0xcd, 0x0e, 0x63, 0xd8, 0x6d, 0xa0, 0xdb, 0x18, +0xc0, 0x80, 0x39, 0xe7, 0x39, 0x6d, 0xff, 0x51, 0xcd, 0xe7, 0x1b, 0x7b, +0xb6, 0x60, 0xec, 0x27, 0x01, 0x47, 0x96, 0xbc, 0x08, 0xcc, 0xe0, 0xf9, +0x05, 0x7c, 0x3f, 0x03, 0x4d, 0x30, 0xb4, 0x40, 0xbd, 0xfc, 0x08, 0x35, +0x96, 0x8e, 0xae, 0x02, 0x7e, 0x18, 0x21, 0x02, 0x9a, 0xb9, 0xb3, 0x0b, +0xe5, 0xd2, 0x83, 0xd2, 0x83, 0xb2, 0x1d, 0x78, 0x22, 0x9b, 0x1d, 0x1b, +0x98, 0x99, 0x61, 0x7f, 0x31, 0x66, 0xdf, 0xa7, 0xef, 0xbe, 0x7b, 0x2a, +0x8f, 0x99, 0x2f, 0x5f, 0xdc, 0x02, 0x7d, 0xdb, 0x0c, 0xb7, 0x6f, 0xe1, +0x39, 0x63, 0xd8, 0x6a, 0x4c, 0x5b, 0x9f, 0x81, 0x6a, 0x17, 0x94, 0x56, +0x40, 0x5c, 0x85, 0x4a, 0x17, 0xc4, 0xd5, 0xdf, 0xa3, 0xb2, 0xc6, 0x60, +0x3d, 0x83, 0xb1, 0x9d, 0x60, 0xfe, 0x12, 0x63, 0xff, 0x00, 0x48, 0x69, +0x4c, 0x7c, 0x86, 0x46, 0xfd, 0x20, 0x49, 0x23, 0xa6, 0xd5, 0x28, 0x92, +0x26, 0x1d, 0x60, 0x6b, 0x18, 0x53, 0xc0, 0x5a, 0x8b, 0x71, 0x4d, 0x34, +0x9d, 0x42, 0x9a, 0x93, 0x04, 0xd1, 0x6a, 0x20, 0x60, 0xae, 0x9e, 0x31, +0x3b, 0x7e, 0x8a, 0x99, 0xf1, 0x71, 0xea, 0xb3, 0x86, 0xb9, 0xa6, 0x61, +0x6e, 0xde, 0x30, 0xdf, 0x50, 0x44, 0x14, 0x27, 0x20, 0x4e, 0xa7, 0x44, +0x78, 0xf8, 0xde, 0x07, 0xbe, 0xfa, 0x64, 0xf7, 0xcd, 0x8f, 0x7d, 0x94, +0x40, 0xdf, 0x36, 0xc3, 0x6d, 0x9f, 0x60, 0xb7, 0x31, 0xf4, 0x59, 0x03, +0x61, 0xd1, 0xb0, 0xee, 0x63, 0xb0, 0xea, 0xba, 0xf5, 0x94, 0x57, 0x7f, +0x8e, 0xb0, 0x74, 0x07, 0x41, 0xe1, 0x0e, 0x8c, 0x5d, 0xd5, 0x36, 0x5c, +0x70, 0xc1, 0x48, 0x11, 0xf7, 0x1a, 0x8d, 0xf1, 0xcf, 0x92, 0xb4, 0x2c, +0x59, 0x2b, 0x20, 0x69, 0x46, 0x64, 0x69, 0x09, 0x91, 0x32, 0x86, 0x08, +0x55, 0x83, 0x91, 0x0c, 0x49, 0xe7, 0xd1, 0x64, 0x8e, 0x35, 0x9b, 0xef, +0xa7, 0xbc, 0xf6, 0x36, 0x20, 0x5d, 0x1c, 0x73, 0xa7, 0x8f, 0x30, 0x37, +0x71, 0x9c, 0xe9, 0x91, 0xc3, 0x8c, 0x0d, 0x1e, 0x64, 0x62, 0xbc, 0xce, +0xd0, 0xf1, 0x84, 0xc6, 0x7c, 0x86, 0x88, 0x22, 0xc2, 0xbe, 0x07, 0x9f, +0xd9, 0x73, 0xdf, 0x82, 0x15, 0xce, 0x23, 0xf0, 0xc9, 0x9b, 0x99, 0x34, +0x86, 0x5a, 0x47, 0x97, 0x65, 0xe3, 0x96, 0x2a, 0xab, 0x3f, 0xfe, 0x55, +0xca, 0x5d, 0x5b, 0x2f, 0x01, 0x38, 0x40, 0xb2, 0x97, 0xdb, 0x9f, 0x19, +0x54, 0x26, 0x49, 0xe7, 0x9f, 0x22, 0x6d, 0xfc, 0x02, 0xd7, 0x32, 0x64, +0xa9, 0x47, 0x96, 0x04, 0x64, 0x49, 0x84, 0x4a, 0x84, 0x48, 0x00, 0x62, +0xd0, 0xcc, 0x21, 0x59, 0x82, 0x24, 0x2d, 0xc2, 0xd2, 0xc7, 0x29, 0x76, +0x7d, 0x8a, 0xb8, 0xba, 0x11, 0x11, 0x87, 0x8a, 0x23, 0xaa, 0x74, 0x12, +0x57, 0x2b, 0x80, 0x03, 0xe0, 0xe4, 0x7b, 0xaf, 0xf2, 0xe1, 0xab, 0x3f, +0xe5, 0xad, 0x81, 0x31, 0x4e, 0x9d, 0x6a, 0xe1, 0x9c, 0x22, 0xca, 0x5d, +0x0f, 0x3d, 0x9b, 0xd7, 0x16, 0xfe, 0x02, 0x78, 0x00, 0x51, 0x6a, 0x06, +0xc3, 0xea, 0x6e, 0x8f, 0xb5, 0x37, 0x3f, 0x42, 0xb1, 0xf3, 0x53, 0x0b, +0x1e, 0x4f, 0xd6, 0x3a, 0x41, 0x63, 0xe6, 0x3f, 0xc8, 0x5a, 0xaf, 0x90, +0xb5, 0xfe, 0x0b, 0xeb, 0x4f, 0xe3, 0x07, 0x82, 0xb5, 0x8a, 0xb1, 0xed, +0x88, 0x16, 0x50, 0x97, 0xcf, 0x0d, 0x82, 0x25, 0xc3, 0x33, 0x8a, 0xe0, +0x40, 0x3d, 0xc4, 0x81, 0x3a, 0x41, 0x52, 0x87, 0x4b, 0x1d, 0x33, 0x27, +0xdf, 0x62, 0x62, 0xe8, 0x4d, 0x92, 0x96, 0x25, 0x49, 0x7c, 0x32, 0x17, +0xa3, 0xb6, 0x8c, 0x1f, 0x95, 0xe8, 0x58, 0xbb, 0x91, 0x4a, 0xd7, 0x1a, +0x3a, 0x56, 0xaf, 0xe1, 0xc6, 0xbb, 0xfe, 0x84, 0xb4, 0xf9, 0x7d, 0xc6, +0xc6, 0x53, 0xd4, 0x39, 0x54, 0xb9, 0x13, 0x38, 0x4b, 0x00, 0x60, 0xc5, +0xda, 0xd5, 0xa8, 0x8e, 0xe5, 0xc1, 0x89, 0x47, 0xb1, 0x73, 0x0b, 0xa0, +0xb8, 0x6c, 0x96, 0x93, 0x87, 0xbe, 0xc7, 0xcc, 0xe9, 0x7f, 0xc3, 0xf3, +0x1c, 0x9e, 0x9f, 0xe1, 0x05, 0x42, 0x10, 0x14, 0xf1, 0xc3, 0x0c, 0x3f, +0x70, 0x58, 0xcf, 0x61, 0x8d, 0x00, 0x8a, 0x3a, 0xcd, 0x81, 0x8a, 0x82, +0x3a, 0x0c, 0x8a, 0xc1, 0x61, 0xc4, 0xa2, 0x19, 0x48, 0x0a, 0x59, 0x0a, +0x69, 0x4b, 0x49, 0x5b, 0x96, 0x24, 0xf5, 0xc8, 0x5c, 0x80, 0xd3, 0x18, +0xf5, 0x8b, 0x78, 0x51, 0x95, 0xa0, 0x58, 0x21, 0x73, 0x4a, 0x7d, 0x62, +0x9c, 0xb9, 0x89, 0x13, 0x68, 0x6b, 0x9a, 0x20, 0x0c, 0xf2, 0x80, 0xcc, +0xf7, 0x73, 0x31, 0x15, 0x5f, 0x24, 0xe0, 0xf9, 0x1e, 0x22, 0xf4, 0x1b, +0x43, 0x6f, 0x7d, 0x12, 0x26, 0x86, 0x5e, 0x60, 0x65, 0xf7, 0x17, 0x18, +0x7a, 0xe3, 0x51, 0x66, 0xa7, 0x0f, 0x61, 0x6d, 0x8d, 0xcc, 0x09, 0x5e, +0x96, 0x61, 0xb3, 0x94, 0x2c, 0x4b, 0x08, 0xb2, 0x84, 0x20, 0x4c, 0xf0, +0x83, 0x04, 0xcf, 0x66, 0x18, 0xe3, 0x40, 0x04, 0x71, 0x8a, 0x66, 0x8a, +0x4a, 0x7b, 0x64, 0xe0, 0x32, 0x90, 0xcc, 0x90, 0x25, 0x96, 0xac, 0x69, +0x48, 0x5a, 0x3e, 0x69, 0x16, 0x90, 0xba, 0x08, 0x31, 0x05, 0x4c, 0x5c, +0x24, 0x08, 0x2b, 0x84, 0x85, 0x32, 0x51, 0xa9, 0x4c, 0x18, 0x85, 0x18, +0x23, 0x90, 0x29, 0xae, 0xe5, 0x98, 0x98, 0x4c, 0xf3, 0x75, 0x73, 0x03, +0xf7, 0x9f, 0x47, 0xa0, 0xef, 0x80, 0xb2, 0xf7, 0x81, 0x6e, 0x44, 0x19, +0x30, 0x68, 0xef, 0xe8, 0xa0, 0xa3, 0x58, 0xdd, 0x4b, 0xd2, 0xac, 0x33, +0x37, 0x7d, 0x14, 0x6b, 0x2b, 0x60, 0x7d, 0x30, 0x06, 0x51, 0x87, 0xba, +0x14, 0x68, 0x81, 0xce, 0x63, 0xb4, 0x01, 0xda, 0x00, 0xaf, 0x99, 0x9f, +0xf3, 0xaa, 0xb9, 0x22, 0x07, 0x92, 0x81, 0x64, 0xb9, 0x45, 0x24, 0x03, +0x97, 0x1a, 0xb2, 0xd4, 0xd0, 0x4a, 0x03, 0xd2, 0x2c, 0x22, 0xd3, 0x02, +0xf8, 0x45, 0xac, 0x57, 0xc6, 0x0f, 0xcb, 0x84, 0xc5, 0x32, 0x61, 0xa1, +0x48, 0x10, 0x45, 0x58, 0x0b, 0xb8, 0x26, 0xce, 0x35, 0x69, 0xd6, 0xa7, +0x79, 0xf7, 0xdd, 0x79, 0x44, 0x04, 0x55, 0x86, 0xfa, 0x0e, 0xec, 0x79, +0xf3, 0x23, 0x16, 0x18, 0x39, 0x72, 0x8c, 0xea, 0x0d, 0x3c, 0x6f, 0x0c, +0xbb, 0x92, 0x24, 0xe3, 0xe8, 0xaf, 0xe7, 0x51, 0xfe, 0x09, 0xbf, 0xb8, +0x0a, 0xf1, 0x3c, 0xac, 0x57, 0xc0, 0xd8, 0x00, 0x63, 0x0d, 0x18, 0x87, +0xd1, 0x26, 0x4a, 0x84, 0x53, 0x1f, 0x9b, 0x81, 0xa8, 0x03, 0xe3, 0x00, +0x87, 0x64, 0x2c, 0x12, 0x50, 0x77, 0x76, 0xee, 0x32, 0x43, 0x9a, 0x7a, +0x64, 0x59, 0x80, 0xd3, 0x22, 0x78, 0x15, 0xbc, 0xa0, 0x42, 0x10, 0x57, +0x09, 0x0a, 0x25, 0xc2, 0x28, 0xc6, 0x0f, 0x03, 0xac, 0x69, 0x83, 0x6f, +0x4d, 0x31, 0x3b, 0x3e, 0xc2, 0x6b, 0xaf, 0x9e, 0x66, 0x7e, 0xae, 0x85, +0x88, 0x02, 0xec, 0xe2, 0x1c, 0x39, 0x2f, 0x17, 0x8a, 0x37, 0x7c, 0xf6, +0xe7, 0xaa, 0xf4, 0x8b, 0x53, 0x1a, 0xb3, 0x2d, 0x8e, 0x0c, 0x4c, 0xd3, +0x9c, 0x99, 0x20, 0xb0, 0x33, 0x58, 0x93, 0x60, 0x3d, 0x8b, 0x17, 0xc4, +0x04, 0x61, 0x11, 0x3f, 0x2c, 0xe3, 0x79, 0x65, 0xac, 0x29, 0xe6, 0xa7, +0x8c, 0xf3, 0x11, 0x67, 0x91, 0xd4, 0x22, 0x69, 0x7b, 0xf7, 0xdd, 0x39, +0xa3, 0x4d, 0x40, 0x9c, 0x87, 0x12, 0x83, 0x57, 0xc4, 0x8f, 0xaa, 0x44, +0xa5, 0x1a, 0x51, 0xa9, 0x42, 0x5c, 0x2c, 0x11, 0x44, 0x21, 0x16, 0x87, +0xa6, 0x75, 0xd2, 0xfa, 0x28, 0xe3, 0xc7, 0x86, 0xf8, 0xef, 0x97, 0x47, +0x99, 0x3c, 0x3d, 0x87, 0x73, 0x02, 0xca, 0xbe, 0xdd, 0x3f, 0xd9, 0xf3, +0xc2, 0x45, 0x09, 0xf4, 0x1d, 0x50, 0xd2, 0x56, 0x82, 0x08, 0xbb, 0x54, +0x99, 0x12, 0xa7, 0x34, 0x1b, 0x4d, 0x0e, 0xbf, 0x71, 0x86, 0x13, 0xef, +0x9e, 0x80, 0xd6, 0x28, 0x56, 0xcf, 0x60, 0x69, 0x60, 0x11, 0xac, 0x35, +0x58, 0x6b, 0x81, 0xbc, 0x54, 0x54, 0x97, 0x03, 0x77, 0xa9, 0xb6, 0x5d, +0xe7, 0x82, 0x21, 0x06, 0x71, 0x06, 0x55, 0x0f, 0x8c, 0x8f, 0xf5, 0x22, +0xfc, 0x30, 0x26, 0x88, 0x63, 0xc2, 0x28, 0xc4, 0xb3, 0x8a, 0x71, 0xf3, +0xb8, 0xb9, 0x31, 0xe6, 0x4e, 0x1d, 0xe1, 0x9d, 0x57, 0x07, 0x79, 0xe5, +0x97, 0xa3, 0xd4, 0xa7, 0xe7, 0x70, 0xb9, 0xeb, 0x0c, 0xe8, 0xe2, 0xee, +0x5f, 0xe2, 0x26, 0x06, 0x78, 0xe7, 0x97, 0x3b, 0x19, 0x78, 0x6e, 0xef, +0x76, 0x0c, 0xfb, 0x16, 0x52, 0x2a, 0xeb, 0x79, 0x78, 0x61, 0xc4, 0x9a, +0xee, 0x2a, 0x6b, 0xaf, 0x5b, 0x49, 0x50, 0xac, 0x60, 0x6c, 0x88, 0x41, +0x30, 0xcc, 0x62, 0x64, 0x1a, 0x64, 0x06, 0x5c, 0x03, 0x95, 0x16, 0xe2, +0xa4, 0x1d, 0xc0, 0x67, 0x5d, 0x28, 0x4b, 0x0c, 0x49, 0xe2, 0x93, 0x64, +0x25, 0x9c, 0x56, 0xc0, 0xef, 0x24, 0x2a, 0xad, 0x24, 0x88, 0x8b, 0x78, +0x56, 0x21, 0x6b, 0xd0, 0xaa, 0x4f, 0x72, 0xec, 0xc8, 0x38, 0xc7, 0x8e, +0x4c, 0xd1, 0x6a, 0x34, 0x49, 0x33, 0x97, 0x5b, 0x4f, 0x19, 0x50, 0xa1, +0xf7, 0xa1, 0x9f, 0xec, 0x99, 0x3e, 0x17, 0xfc, 0x45, 0x09, 0x00, 0xf4, +0xff, 0xc3, 0xe7, 0xf9, 0xf0, 0x57, 0xff, 0x7c, 0x4f, 0x9b, 0x44, 0x8d, +0x73, 0x89, 0x04, 0x31, 0xab, 0xae, 0x29, 0xb2, 0x62, 0x5d, 0x99, 0xda, +0x9a, 0x02, 0x46, 0x53, 0x54, 0xe6, 0x40, 0xe6, 0x91, 0xb4, 0x89, 0xb8, +0x0c, 0x75, 0x9a, 0x27, 0x7c, 0x92, 0xe7, 0x38, 0x2a, 0x8a, 0x4b, 0x21, +0x4d, 0x7c, 0x52, 0x57, 0x44, 0x4c, 0x15, 0xbc, 0x0e, 0x82, 0x62, 0x27, +0x81, 0xef, 0x31, 0x73, 0x66, 0x92, 0xb1, 0x91, 0xd3, 0x8c, 0x0c, 0xcf, +0xd0, 0x9c, 0x6f, 0x90, 0x26, 0x59, 0x7e, 0xad, 0xe4, 0x7d, 0xa5, 0x01, +0x11, 0x7a, 0x1f, 0x7a, 0xf6, 0xa3, 0xe0, 0x2f, 0x49, 0x20, 0x97, 0xbd, +0xfc, 0xe0, 0x6f, 0x76, 0x6e, 0x32, 0xb0, 0x0f, 0xf2, 0x8a, 0x0b, 0x03, +0x28, 0x58, 0xcf, 0xa7, 0x63, 0x75, 0x89, 0x2d, 0x77, 0x74, 0x21, 0xd9, +0x2c, 0x92, 0xb5, 0x70, 0x2e, 0xc5, 0xa5, 0x0e, 0x97, 0x29, 0x22, 0x06, +0xd4, 0xe4, 0x97, 0x99, 0x51, 0x10, 0x87, 0x3a, 0x21, 0x4d, 0x3c, 0x32, +0x57, 0x40, 0x28, 0x83, 0x5f, 0xc5, 0x8b, 0xaa, 0xf8, 0x1e, 0x1c, 0x7a, +0x67, 0x94, 0x91, 0xe3, 0x63, 0xb4, 0x9a, 0xad, 0x45, 0xe0, 0xed, 0xd7, +0x7d, 0xa2, 0xec, 0xfa, 0xda, 0x8f, 0x2f, 0x0e, 0x7e, 0x09, 0x02, 0x67, +0x89, 0xec, 0xff, 0xeb, 0x9d, 0x77, 0x02, 0x3b, 0xc8, 0xeb, 0xd8, 0x9a, +0xb1, 0x96, 0x5b, 0xee, 0xd8, 0xc4, 0xad, 0x77, 0xef, 0x65, 0x76, 0xec, +0x65, 0xce, 0x1c, 0xfd, 0x47, 0x66, 0x27, 0x0e, 0x93, 0x65, 0x16, 0x27, +0x3e, 0xe0, 0x61, 0x8c, 0xc5, 0x1a, 0xc1, 0x23, 0xc3, 0x68, 0x0a, 0x2e, +0x25, 0x4d, 0xc0, 0xb9, 0x10, 0x67, 0x4a, 0x60, 0x2b, 0xd8, 0xb0, 0x8c, +0xef, 0x5b, 0x26, 0xc7, 0x4e, 0xf3, 0xf6, 0xc0, 0x79, 0x04, 0x86, 0x44, +0xd9, 0xf5, 0xe0, 0x8f, 0xf6, 0xbc, 0x70, 0x29, 0xe0, 0x8b, 0x5e, 0xb1, +0x04, 0x7a, 0xe0, 0xcb, 0x6c, 0x7f, 0x4c, 0x7f, 0xbe, 0xfd, 0xb1, 0x3d, +0xf7, 0x2d, 0xe4, 0xec, 0xd6, 0x28, 0x9b, 0xb6, 0x7c, 0x1e, 0xeb, 0xc7, +0x54, 0xd7, 0xdf, 0x45, 0xd2, 0xc8, 0x68, 0x36, 0x3c, 0x9a, 0xad, 0x98, +0x56, 0x52, 0x26, 0x75, 0x1d, 0x08, 0x1d, 0x28, 0x55, 0x44, 0x4b, 0x88, +0x44, 0x88, 0xf8, 0xed, 0x98, 0x10, 0x34, 0x75, 0x48, 0x96, 0xe6, 0x43, +0xa0, 0x5a, 0x0d, 0x09, 0xa3, 0x76, 0x4e, 0x95, 0x5f, 0x25, 0x4f, 0x5e, +0x09, 0xf8, 0x2b, 0x24, 0x90, 0xcb, 0xf7, 0x77, 0xed, 0xec, 0x51, 0xa5, +0x26, 0x02, 0x6b, 0xaf, 0x29, 0xd1, 0xb1, 0xf1, 0x8f, 0x80, 0x94, 0xfa, +0xd8, 0x6b, 0x4c, 0x9e, 0x3c, 0x46, 0xab, 0x15, 0x93, 0xb9, 0x0a, 0x6a, +0x6b, 0xd8, 0x70, 0x25, 0x26, 0x5c, 0x85, 0x09, 0x3a, 0x51, 0xaf, 0x8c, +0x52, 0x40, 0x24, 0x40, 0xc5, 0xe6, 0x97, 0x9c, 0x38, 0x54, 0x04, 0x11, +0x87, 0x13, 0x30, 0x7e, 0xcc, 0xda, 0x75, 0x05, 0x8c, 0xf5, 0xf2, 0xb0, +0x51, 0x7a, 0xaf, 0xb4, 0x6f, 0x74, 0xc5, 0x04, 0x44, 0xd9, 0xee, 0xda, +0xcd, 0xda, 0x1b, 0x6e, 0xfb, 0x0c, 0x5e, 0x10, 0x03, 0x29, 0xc7, 0x5f, +0x7f, 0x86, 0x24, 0x29, 0x90, 0x69, 0x19, 0xfc, 0x1a, 0x61, 0x61, 0x15, +0x61, 0x69, 0x25, 0x51, 0xb1, 0x13, 0x2f, 0xac, 0x62, 0xfd, 0x12, 0x98, +0x18, 0xd5, 0x10, 0xc9, 0xbc, 0xfc, 0x52, 0x13, 0x45, 0x55, 0x72, 0x5f, +0xc7, 0x82, 0x5f, 0x64, 0xdd, 0xfa, 0x2a, 0x36, 0x08, 0xd0, 0x5c, 0xc7, +0xd6, 0x1f, 0x7c, 0xe3, 0xf1, 0xda, 0x95, 0x14, 0xfc, 0x4b, 0xd6, 0xc4, +0x0b, 0x99, 0xea, 0xfa, 0xd5, 0x79, 0x1f, 0xa7, 0x56, 0x83, 0x6b, 0x7a, +0xee, 0x05, 0x52, 0xa6, 0x47, 0xdf, 0xe5, 0xf4, 0x87, 0xc7, 0x50, 0xaf, +0x8a, 0x17, 0xd6, 0x08, 0x8b, 0x9d, 0x44, 0xe5, 0x6a, 0x9e, 0xc7, 0x68, +0x4a, 0x26, 0x09, 0x99, 0x5a, 0x54, 0xfd, 0xdc, 0x02, 0x78, 0x08, 0x20, +0x6a, 0x40, 0x0c, 0xa8, 0x45, 0xf1, 0xc0, 0x8b, 0x89, 0xca, 0x55, 0xd6, +0xad, 0x9b, 0x66, 0x68, 0x30, 0x41, 0x33, 0x87, 0x2a, 0xf7, 0x00, 0xfb, +0x97, 0xc2, 0x77, 0x59, 0x0b, 0x2c, 0x80, 0x5f, 0xbb, 0x8a, 0x1e, 0x11, +0xba, 0x45, 0x0d, 0x37, 0xf6, 0x6c, 0x21, 0x2c, 0x77, 0x02, 0x29, 0xc3, +0x6f, 0xff, 0x3b, 0xea, 0xd5, 0xf0, 0xe3, 0x95, 0xc4, 0xa5, 0x95, 0x14, +0x2a, 0x9d, 0xc4, 0xa5, 0x0a, 0x41, 0x14, 0x63, 0x8d, 0xa3, 0x7e, 0x66, +0x8a, 0x99, 0x89, 0x59, 0x54, 0x04, 0x35, 0x1e, 0x6a, 0x02, 0xc4, 0x84, +0x28, 0xf9, 0xab, 0xf1, 0x42, 0x8c, 0x1f, 0x63, 0xc3, 0x02, 0x36, 0xaa, +0x71, 0xed, 0xa6, 0x1a, 0xd6, 0x0f, 0x16, 0xe2, 0x60, 0xc7, 0x52, 0xe0, +0x97, 0x24, 0x00, 0x50, 0xeb, 0x5a, 0x89, 0x28, 0x77, 0x8a, 0x42, 0x18, +0x5a, 0xd6, 0x6f, 0xee, 0x05, 0x32, 0x9a, 0xf5, 0x71, 0x26, 0x46, 0x86, +0x09, 0x8a, 0xab, 0x88, 0x2b, 0x2b, 0x28, 0x54, 0x6b, 0xc4, 0xa5, 0x12, +0x41, 0xe0, 0x63, 0x24, 0x25, 0x9d, 0x3d, 0xcd, 0xd1, 0xf7, 0x47, 0x38, +0xfc, 0xde, 0x38, 0x59, 0xd2, 0xc8, 0x41, 0x99, 0x30, 0xef, 0x11, 0xf9, +0x05, 0x4c, 0x50, 0xc0, 0x86, 0x05, 0xbc, 0xa8, 0x80, 0x1f, 0x16, 0xf0, +0xe2, 0x0a, 0xd5, 0x95, 0x35, 0xaa, 0x1d, 0x31, 0xed, 0x26, 0x70, 0x6f, +0xdf, 0xb6, 0x9d, 0xdd, 0x57, 0x4d, 0x20, 0x88, 0x42, 0x44, 0xd8, 0x21, +0x6a, 0x58, 0xb7, 0xa1, 0x83, 0x35, 0x37, 0x7d, 0x1a, 0x48, 0x19, 0x79, +0xff, 0x15, 0xa2, 0xca, 0x2a, 0x0a, 0xd5, 0x1c, 0x7c, 0x54, 0x28, 0xe2, +0xf9, 0x1e, 0x2a, 0x4d, 0xd2, 0xfa, 0x28, 0x47, 0xdf, 0x1b, 0x66, 0xe2, +0xd4, 0x19, 0x66, 0xa6, 0xea, 0x0c, 0x1e, 0xaa, 0x83, 0x24, 0xa8, 0xf1, +0xc0, 0x8b, 0x30, 0x7e, 0x11, 0x2f, 0x28, 0x12, 0x44, 0x25, 0xc2, 0xb8, +0x44, 0x10, 0x17, 0x09, 0x0b, 0x45, 0xfc, 0x42, 0x95, 0xeb, 0xae, 0x2f, +0xe1, 0xf9, 0xde, 0x82, 0xfa, 0x7b, 0xae, 0x9a, 0x80, 0xab, 0x8f, 0xd6, +0x44, 0xe8, 0x51, 0x2c, 0xeb, 0xae, 0xeb, 0x06, 0x32, 0x20, 0x63, 0xf2, +0xe4, 0x71, 0xe2, 0x4a, 0x07, 0x85, 0x72, 0x89, 0x30, 0x8e, 0xf0, 0x3c, +0x20, 0x9d, 0x23, 0x9d, 0x3a, 0xc1, 0xe1, 0x5f, 0x0f, 0x72, 0xf4, 0x83, +0x31, 0x92, 0x66, 0x42, 0x9a, 0xa4, 0x8c, 0x8c, 0xce, 0x33, 0x38, 0x38, +0x8f, 0xc5, 0x61, 0xfd, 0x00, 0x2f, 0x88, 0xf0, 0xa3, 0x02, 0x7e, 0x5c, +0x20, 0x88, 0x22, 0xbc, 0x30, 0xc0, 0x7a, 0x7e, 0x7e, 0xcb, 0x77, 0x15, +0xb0, 0xde, 0x22, 0x81, 0x25, 0xfb, 0xa7, 0x4b, 0x12, 0x58, 0x70, 0x1f, +0x55, 0x43, 0x10, 0x7a, 0x40, 0x4a, 0xfd, 0xf4, 0x30, 0x7e, 0xe0, 0x11, +0xc6, 0x21, 0x7e, 0xe0, 0x61, 0x48, 0x71, 0xad, 0x19, 0x92, 0xa9, 0x61, +0x0e, 0xbd, 0x35, 0xc8, 0xe0, 0xfb, 0xa7, 0x68, 0x36, 0x9a, 0x38, 0xd1, +0x29, 0x11, 0x48, 0x93, 0x8c, 0xe1, 0xe1, 0x06, 0x47, 0x8e, 0xcc, 0xe1, +0xd1, 0xc2, 0xf7, 0x0d, 0x41, 0xe8, 0xe3, 0x07, 0x7e, 0x9e, 0x14, 0xa2, +0xa0, 0x19, 0xa0, 0xc4, 0xe1, 0x79, 0x4d, 0xad, 0xde, 0xbe, 0x6d, 0xa6, +0x76, 0x71, 0x64, 0xb9, 0x2c, 0x79, 0x0a, 0x89, 0x2c, 0xa4, 0x11, 0xca, +0xdc, 0xf4, 0x19, 0x40, 0x98, 0x3e, 0x39, 0x84, 0x67, 0x05, 0xab, 0x09, +0x9a, 0x26, 0x48, 0x3a, 0x47, 0x52, 0x1f, 0xe7, 0xe0, 0xdb, 0x27, 0x19, +0x1d, 0x9e, 0x22, 0x6d, 0x25, 0x0b, 0x95, 0xd3, 0x80, 0xb6, 0x1b, 0xbf, +0x59, 0xe6, 0x38, 0x76, 0x7c, 0x9e, 0x46, 0x0b, 0x36, 0x7f, 0xc2, 0x62, +0xc2, 0x00, 0xe3, 0x42, 0x70, 0x16, 0xc1, 0xa2, 0xae, 0x85, 0x24, 0x73, +0x34, 0xe6, 0x9b, 0xa8, 0xc8, 0xb9, 0x10, 0xee, 0x04, 0x5e, 0xe0, 0x12, +0xb2, 0x34, 0x01, 0xcd, 0x3b, 0x72, 0x2a, 0xca, 0x89, 0xa3, 0x27, 0xa9, +0x9f, 0x3a, 0x46, 0xe3, 0xcc, 0x87, 0x68, 0x73, 0x92, 0x2c, 0x31, 0xe0, +0x1a, 0x9c, 0x3e, 0x39, 0xc5, 0x7b, 0x07, 0x27, 0x99, 0xad, 0xcf, 0x23, +0x79, 0xd1, 0xbd, 0xd0, 0xbd, 0xdb, 0xa7, 0xca, 0x90, 0x2a, 0x3b, 0x54, +0x41, 0xc5, 0x31, 0x3a, 0x32, 0xc7, 0xd4, 0xb4, 0xe3, 0xa6, 0x9b, 0x12, +0xae, 0xd9, 0xd4, 0x80, 0xb4, 0x82, 0xe7, 0xf9, 0xa0, 0x29, 0xae, 0x31, +0xc9, 0xa9, 0xd1, 0x3a, 0xce, 0xb9, 0x73, 0x21, 0xf4, 0x5c, 0x1d, 0x01, +0x69, 0x67, 0xa3, 0x22, 0x0c, 0x1e, 0x69, 0x12, 0xfc, 0x70, 0x2f, 0x9d, +0x9d, 0x05, 0x9c, 0xcb, 0x98, 0x9f, 0xcf, 0x18, 0x1e, 0x6e, 0x32, 0x33, +0xd3, 0xc2, 0xa5, 0xe9, 0x42, 0xc5, 0xb4, 0x08, 0xfe, 0x81, 0x1f, 0xee, +0xd9, 0xff, 0xcd, 0x2f, 0xee, 0x7c, 0x5e, 0xa1, 0x47, 0x95, 0x1e, 0x55, +0x40, 0x85, 0xd9, 0x99, 0x06, 0xaf, 0xbf, 0x96, 0x32, 0x38, 0x38, 0xcb, +0xf5, 0xd7, 0x17, 0xa8, 0x56, 0x02, 0x54, 0x84, 0xa9, 0xa9, 0xf9, 0xc5, +0xd2, 0xf1, 0x02, 0x02, 0x97, 0x94, 0x25, 0x93, 0xb9, 0x6f, 0xff, 0x99, +0x79, 0x8e, 0x76, 0x30, 0x19, 0x63, 0xf2, 0x46, 0xad, 0xef, 0x63, 0x0c, +0x88, 0x08, 0x2e, 0x73, 0x88, 0x3b, 0xab, 0xb0, 0xdd, 0x25, 0xdc, 0xf7, +0xe0, 0x8f, 0xce, 0x36, 0x9f, 0xbe, 0x7e, 0xaf, 0xe9, 0x00, 0xfa, 0x17, +0x49, 0xb4, 0xc5, 0x5a, 0x8b, 0x17, 0xf8, 0x58, 0x6b, 0x51, 0x55, 0xc4, +0x39, 0x5c, 0xe6, 0xb8, 0x00, 0xd3, 0x8e, 0xbe, 0x03, 0x7a, 0xc9, 0x0b, +0x6d, 0x49, 0x02, 0x7f, 0xf7, 0xa7, 0xe6, 0x56, 0xa0, 0xff, 0xdc, 0xba, +0x40, 0x2f, 0x98, 0xe8, 0xd9, 0xf9, 0x90, 0xc2, 0xae, 0xbf, 0x7d, 0x46, +0x2f, 0x6a, 0xf2, 0xbe, 0x6d, 0x66, 0x37, 0x79, 0x55, 0x75, 0xd9, 0xc0, +0x3c, 0x47, 0xfa, 0xfb, 0x0e, 0xe8, 0x5d, 0x97, 0xfb, 0x87, 0x2b, 0xfa, +0x9a, 0xf5, 0x9b, 0x5f, 0x34, 0xb7, 0x02, 0x7d, 0x5c, 0x70, 0xac, 0xb5, +0x81, 0x4f, 0x01, 0xfd, 0x0a, 0xcf, 0x7f, 0xed, 0xc7, 0x97, 0xde, 0xa9, +0x05, 0xe9, 0xdb, 0x66, 0x3a, 0xc8, 0x53, 0xf3, 0x1d, 0x5c, 0xde, 0x3d, +0x9e, 0xec, 0x3b, 0xa0, 0x5f, 0x59, 0x6a, 0xbd, 0xdf, 0xe8, 0x7b, 0xe2, +0x6f, 0xe4, 0xae, 0x90, 0x07, 0x75, 0xfe, 0xd6, 0xd4, 0x43, 0xcf, 0xea, +0x9b, 0x97, 0x79, 0xe4, 0xb2, 0xd2, 0xb7, 0xcd, 0x6c, 0x6a, 0xaf, 0x77, +0x2e, 0x91, 0x01, 0xf2, 0x9d, 0x9f, 0xbe, 0x92, 0x35, 0x96, 0xfd, 0xa7, +0x06, 0xff, 0xd7, 0xf2, 0x5b, 0xff, 0x6b, 0x95, 0xff, 0x01, 0x3a, 0xbb, +0x29, 0xfe, 0x9c, 0xd4, 0x1a, 0x60, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, +0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, +}; diff --git a/Source/Core/DolphinWX/resources/toolbar_browse.xpm b/Source/Core/DolphinWX/resources/toolbar_browse.xpm new file mode 100644 index 0000000000..aad717ae28 --- /dev/null +++ b/Source/Core/DolphinWX/resources/toolbar_browse.xpm @@ -0,0 +1,202 @@ +/* XPM */ +static char *toolbar_browse_xpm[] = { +/* columns rows colors chars-per-pixel */ +"48 48 148 2", +" c #14100F", +". c #161211", +"X c #191614", +"o c #1C1816", +"O c #1E1C1B", +"+ c #24211F", +"@ c #252322", +"# c #292524", +"$ c #242628", +"% c #272829", +"& c #2C2D2D", +"* c #323233", +"= c #3C3E3F", +"- c #3D3F40", +"; c #414345", +": c #4A4D4F", +"> c #4B4E50", +", c #4E5153", +"< c #505456", +"1 c #50585D", +"2 c #425C69", +"3 c #4A626E", +"4 c #54636B", +"5 c #5E656A", +"6 c #4D6672", +"7 c #4F6A77", +"8 c #516A76", +"9 c #546D7B", +"0 c #596D79", +"q c #5D727D", +"w c #6A6C6E", +"e c #656E73", +"r c #6F7274", +"t c #61727C", +"y c #5D7684", +"u c #5D7E90", +"i c #617783", +"p c #617986", +"a c #647C89", +"s c #67808D", +"d c #6C828E", +"f c #738087", +"g c #778288", +"h c #628294", +"j c #698594", +"k c #6D8897", +"l c #678799", +"z c #6C8B9D", +"x c #728691", +"c c #758995", +"v c #7A8C95", +"b c #738C9A", +"n c #798E9B", +"m c #75909F", +"M c #7B909C", +"N c #6F8FA0", +"B c #708FA0", +"V c #7492A4", +"C c #7A95A6", +"Z c #7997A9", +"A c #7D9AAA", +"S c #869094", +"D c #84949D", +"F c #89969F", +"G c #8597A1", +"H c #8798A2", +"J c #8C9BA5", +"K c #829DAC", +"L c #8B9EAA", +"P c #939EA5", +"I c #839FB0", +"U c #8EA1AC", +"Y c #91A2AD", +"T c #9BA6AC", +"R c #85A1B3", +"E c #8AA4B4", +"W c #8EA8B8", +"Q c #93A5B1", +"! c #96A8B3", +"~ c #9BAAB2", +"^ c #94ACBC", +"/ c #9DAFBB", +"( c #9CB0BD", +") c #A2AEB4", +"_ c #A0AFB8", +"` c #A7B2B7", +"' c #ADB1B3", +"] c #A4B3BC", +"[ c #AAB5BC", +"{ c #AEB9BF", +"} c #B0B9BF", +"| c #BDBEBF", +" . c #9DB3C2", +".. c #A2B6C4", +"X. c #A3B9C7", +"o. c #ACBAC2", +"O. c #A6BBC9", +"+. c #AABECB", +"@. c #B3BDC3", +"#. c #B1BFC8", +"$. c #AEC2CE", +"%. c #B6C0C6", +"&. c #B9C2C6", +"*. c #B4C2CC", +"=. c #BDC5CB", +"-. c #BEC8CE", +";. c #AEC2D0", +":. c #B2C5D1", +">. c #B9C7D0", +",. c #B5C8D3", +"<. c #BBCBD5", +"1. c #B7CBD9", +"2. c #BECED8", +"3. c #C1C3C5", +"4. c #C0C7CB", +"5. c #C2CACE", +"6. c #C4CDD2", +"7. c #C8CFD3", +"8. c #C0CFD9", +"9. c #C5D1D7", +"0. c #CCD2D6", +"q. c #C4D2DB", +"w. c #CBD6DD", +"e. c #CED8DF", +"r. c #D1D6D9", +"t. c #D4D9DD", +"y. c #D8DCDF", +"u. c #C5D6E1", +"i. c #CBD7E0", +"p. c #CDD9E1", +"a. c #D3DDE3", +"s. c #DADFE2", +"d. c #D6E0E7", +"f. c #DCE2E6", +"g. c #D5E1E9", +"h. c #DBE4E9", +"j. c #E1E4E6", +"k. c #E1E6EA", +"l. c #E4E9ED", +"z. c #E9ECEE", +"x. c #E6ECF1", +"c. c #EAEEF1", +"v. c #EDF1F4", +"b. c #F2F4F6", +"n. c #F5F7F8", +"m. c #F7F8FA", +"M. c #FBFCFC", +"N. c None", +/* pixels */ +"N.N.N.N.N.N.N.N.N.N.N.N.N.N.` @.&.=.5.7.5.4.=.@.[ N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.", +"N.N.N.N.N.N.N.N.` 7.f.k.k.j.s.r.0.6.5.5.5.6.7.0.y.j.k.k.f.0.} N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.", +"N.N.N.N.N.} f.l.t.5.{ [ [ { %.=.5.6.6.-.*.*.o.[ _ ~ T ~ ` &.r.k.j.&.N.N.N.N.N.N.N.N.N.N.N.N.N.N.", +"N.N.N.@.b.s.o.) @.6.f.x.n.M.M.m.n.v.c.x.h.d.a.p.i.q.<.:.O.( Q U ) 0.b.5.N.N.N.N.N.N.N.N.N.N.N.N.", +"N.N.7.b.[ ] 9.h.x.c.v.b.n.M.M.n.v.v.l.k.h.a.a.p.w.q.<.,.:.;.$.O.( L T z.s.N.N.N.N.N.N.N.N.N.N.N.", +"N.N.M.@.>.d.d.h.k.l.c.v.n.M.M.n.v.v.l.k.h.a.a.p.w.q.<.,.:.$.+.O.X.X.^ Q m.N.N.N.N.N.N.N.N.N.N.N.", +"N.>.M.a.w.p.a.h.k.l.c.v.b.n.n.b.v.c.l.k.h.a.a.w.q.8.<.,.$.$.+.O.X. .^ ..m.x.N.N.N.N.N.N.N.N.N.N.", +"N.N.8.M.h.i.a.d.h.l.z.c.v.v.v.v.v.x.l.h.d.a.p.w.q.2.<.,.$.$.+.O. .( +.c.v.N.N.N.N.N.N.N.N.N.N.N.", +"N.N.u +.n.m.l.d.d.h.l.l.c.v.v.c.c.x.l.h.d.a.p.i.q.2.,.:.+.O.X.O.:.d.M.l.+.N.N.N.N.N.N.N.N.N.N.N.", +"N.N.u u V $.k.m.m.b.c.x.l.l.c.l.a.9.6.6.6.-.=.*.<.2.<.<.2.i.h.v.m.c.w.+.X.N.N.N.N.N.N.N.N.N.N.N.", +"N.N.h h h h B E *.a.z.b.M.M.f.6.7.0.5.=.=.4.7.0.5.6.l.M.M.M.b.l.a.q.<.$.O.N.N.N.N.N.N.N.N.N.N.N.", +"N.N.h h l z z N B Z K ^ .%.r.6.@.@.-.7.0.7.&.@.&.0.0.y.b.x.h.d.a.w.<.$.O.N.N.N.N.N.N.N.N.N.N.N.", +"N.N.h h l z B V Z A I K ] r.@.%.k.M.M.M.M.M.M.m.a.{ =.0.6.x.l.h.a.w.<.$.O.N.N.N.N.N.N.N.N.N.N.N.", +"N.N.h h l z B V Z A Z [ t.[ t.M.M.M.M.M.M.M.M.M.M.m.-.{ r.5.l.h.a.w.<.$.O.N.N.N.N.N.N.N.N.N.N.N.", +"N.N.h h l z B V Z Z ! y.[ s.M.M.M.M.M.M.M.M.M.M.M.M.M.6.@.r.6.h.a.w.<.$.O.N.N.N.N.N.N.N.N.N.N.N.", +"N.N.N.h l l B V Z C r.@.w.n.M.M.M.M.M.M.M.M.M.M.M.M.M.v.@.=.6.e.a.w.<.:.N.N.N.N.N.N.N.N.N.N.N.N.", +"N.N.N.N.b A V V V o.7.-.f.M.M.M.M.M.M.M.M.M.M.M.M.M.M.n.t.[ 0.-.h.g.*.N.N.N.N.N.N.N.N.N.N.N.N.N.", +"N.N.N.[ b.0.c h b 0.@.s.k.m.m.m.M.M.M.M.M.M.M.m.m.n.n.b.a.-.&.=.T 5.b.%.N.N.N.N.N.N.N.N.N.N.N.N.", +"N.N.5.n.T q 6 2 v 0.-.f.k.b.m.m.m.M.M.M.M.M.m.m.n.b.b.v.a.e.@.7.6 8 F z.y.N.N.N.N.N.N.N.N.N.N.N.", +"N.N.M.Y 8 9 9 7 ) 6.w.f.k.b.n.m.M.M.M.M.M.M.m.m.n.b.b.l.a.a.#.0.x 8 8 v m.N.N.N.N.N.N.N.N.N.N.N.", +"N.6.M.J y d d a @.=.s.j.l.c.n.m.M.M.M.M.M.M.M.m.n.b.v.f.s.a.=.0.L a a c n.v.N.N.N.N.N.N.N.N.N.N.", +"N.N.w.b.! n M n &.=.f.k.z.v.b.m.M.M.M.M.M.M.m.m.n.b.z.j.f.s.5.7.~ c L f.b.N.N.N.N.N.N.N.N.N.N.N.", +"N.N.h -.m.f.@.Y &.=.f.l.z.b.n.m.m.M.M.M.M.M.M.m.n.v.z.k.f.s.5.6.o.0.m.x.+.N.N.N.N.N.N.N.N.N.N.N.", +"N.N.u u A >.c.z.0.=.s.l.c.b.n.m.M.M.M.M.M.M.m.m.n.v.z.k.f.f.=.5.t.n.i.+.X.N.N.N.N.N.N.N.N.N.N.N.", +"N.N.h h h h V ^ o.5.0.c.c.b.n.m.m.M.M.M.M.M.m.m.n.b.z.l.f.f.%.0.<.i.<.$.O.N.N.N.N.N.N.N.N.N.N.N.", +"N.N.h h l z z z C 0.=.b.c.b.n.m.M.M.M.M.M.M.m.m.n.b.z.k.j.f.%.7.q.i.<.$.O.N.N.N.N.N.N.N.N.N.N.N.", +"N.N.h h l z B V B =.=.k.b.b.n.m.m.M.M.M.M.m.m.n.b.v.z.k.c.6.6.-.a.w.<.$.O.N.N.N.N.N.N.N.N.N.N.N.", +"N.N.h h l z B V V U t.=.m.n.n.n.n.m.m.m.m.m.n.n.b.c.z.v.k.@.0.6.d.w.<.$.O.N.N.N.N.N.N.N.N.N.N.N.", +"N.N.h h l z B V Z V @.7.0.M.m.m.m.m.m.m.m.n.n.n.b.b.n.v.@.0.-.h.a.w.<.$.O.N.N.N.N.N.N.N.N.N.N.N.", +"N.N.N.h l z N V Z A C 7.5.0.m.M.M.M.M.M.M.M.M.m.m.m.c.%.0.=.=.h.a.w.<.:.N.N.N.N.N.N.N.N.N.N.N.N.", +"N.N.N.N.z C V V Z A K K 7.7.=.z.M.M.M.M.M.m.m.m.n.t.@.0.&.t.6.w.a.g.*.N.N.N.N.N.N.N.N.N.N.N.N.N.", +"N.N.N.` z.0.n j B A R W E =.t.=.6.s.z.v.v.c.k.r.=.5.y.=.@.6.f.w * ' b.@.N.N.N.N.N.N.N.N.N.N.N.N.", +"N.N.=.m.) t 3 2 3 9 a k C A ! 5.r.0.5.5.5.5.6.0.0.@.[ o.n ~ r . % S v.r.N.N.N.N.N.N.N.N.N.N.N.", +"N.N.M.Y 6 8 8 9 9 8 8 8 8 9 9 9 d Y { %.&.@.` H i 9 9 6 7 4 & ; - o $ g M.N.N.N.N.N.N.N.N.N.N.N.", +"N.9.M.G y a a a a a a a a a a a p y y p p p y y p a a a s 0 & : e = o & 3.M.N.N.N.N.N.N.N.N.N.N.", +"N.N.t.c.L c b n n n n n n n n n n n n n n n n n n n n n n C t @ > e = X = 5 N.N.N.N.N.N.N.N.N.N.", +"N.N.h 8.m.t.] Y L L U U Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y U U L Q f # : e = o @ N.N.N.N.N.N.N.N.N.N.", +"N.N.u u K 8.v.v.f.6.#.o.] ( ( / / / / / / / / / ( ( ( ..o.-.t.n.| # : e = O & N.N.N.N.N.N.N.N.N.", +"N.N.h h h h V ( 8.h.v.b.v.x.k.f.a.a.a.e.e.a.a.a.h.k.c.b.M.M.m.c.x.T # : e = O & N.N.N.N.N.N.N.N.", +"N.N.h h l z z z B Z E .*.2.p.h.l.x.v.b.n.m.M.M.M.M.M.M.b.x.h.d.a.g.P # : e = O & N.N.N.N.N.N.N.", +"N.N.h h l z B V C A K R E W ^ .X.+.:.8.i.a.h.c.b.M.M.n.v.x.k.h.a.w.u.F # > e = O & N.N.N.N.N.N.", +"N.u h h l z B V Z A I E W ^ ...O.$.,.q.p.d.k.c.n.M.M.n.v.x.k.h.a.w.<.1.D % , e = O & N.N.N.N.N.", +"N.N.h h l z B V Z A I E W ^ ...O.$.,.q.p.d.k.c.n.M.M.n.v.x.k.h.a.w.<.$.,.1 o < e = O & N.N.N.N.", +"N.N.x h l z B V Z A I E W ^ ...O.$.,.q.p.d.k.c.n.M.M.n.v.x.k.h.a.w.2.:.Q N.N.+ < e = O & N.N.N.", +"N.N.N.c k z N V Z A I E W ^ ...O.$.,.q.p.d.k.c.n.M.M.n.v.x.l.h.d.w.o.H N.N.N.N.@ < e = + @ N.N.", +"N.N.N.N.N.c b m C A R E ^ ^ .X.O.$.,.q.p.d.l.v.m.M.M.M.n.c.h.9.[ H N.N.N.N.N.N.N.@ < 5 * o N.N.", +"N.N.N.N.N.N.N.N.v n C K E ^ / ..O.$.<.q.a.d.l.x.c.v.k.0.@.~ F N.N.N.N.N.N.N.N.N.N.N.# ; & X N.N.", +"N.N.N.N.N.N.N.N.N.N.N.N.N.N.v D D G H J J J J J F N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.& N.N.N.N." +}; diff --git a/Source/Core/DolphinWX/resources/toolbar_file_open.c b/Source/Core/DolphinWX/resources/toolbar_file_open.c new file mode 100644 index 0000000000..d2f8741931 --- /dev/null +++ b/Source/Core/DolphinWX/resources/toolbar_file_open.c @@ -0,0 +1,214 @@ +static const unsigned char toolbar_file_open_png[] = { +0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, +0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, +0x08, 0x06, 0x00, 0x00, 0x00, 0x57, 0x02, 0xf9, 0x87, 0x00, 0x00, 0x00, +0x04, 0x73, 0x42, 0x49, 0x54, 0x08, 0x08, 0x08, 0x08, 0x7c, 0x08, 0x64, +0x88, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, +0x12, 0x00, 0x00, 0x0b, 0x12, 0x01, 0xd2, 0xdd, 0x7e, 0xfc, 0x00, 0x00, +0x00, 0x25, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, +0x72, 0x65, 0x00, 0x4d, 0x61, 0x63, 0x72, 0x6f, 0x6d, 0x65, 0x64, 0x69, +0x61, 0x20, 0x46, 0x69, 0x72, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, +0x4d, 0x58, 0x20, 0x32, 0x30, 0x30, 0x34, 0x87, 0x76, 0xac, 0xcf, 0x00, +0x00, 0x00, 0x14, 0x74, 0x45, 0x58, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, +0x69, 0x6f, 0x6e, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x00, 0x39, 0x2f, 0x34, +0x2f, 0x30, 0x34, 0x79, 0x5e, 0xa3, 0xd5, 0x00, 0x00, 0x09, 0x40, 0x49, +0x44, 0x41, 0x54, 0x78, 0x9c, 0xed, 0x99, 0x6b, 0x6c, 0x5b, 0xe5, 0x19, +0xc7, 0x7f, 0xc7, 0x97, 0x24, 0x4d, 0xda, 0x24, 0xae, 0xe3, 0xd8, 0x0d, +0x2d, 0x71, 0xc5, 0x56, 0x21, 0x40, 0x34, 0xd0, 0x31, 0x09, 0x6d, 0x12, +0x01, 0xa1, 0x49, 0x9b, 0x18, 0xec, 0xc3, 0x24, 0x3e, 0x82, 0x98, 0x60, +0x1b, 0x91, 0xa6, 0xa1, 0x49, 0x1b, 0xbb, 0x68, 0x21, 0x9a, 0xa6, 0x4d, +0x1a, 0xdb, 0x90, 0x36, 0x36, 0xb4, 0x0f, 0x5b, 0x87, 0xd8, 0x97, 0x7d, +0x21, 0x6c, 0x93, 0x26, 0x31, 0x09, 0x8a, 0xd6, 0x01, 0x83, 0x96, 0xa6, +0xd5, 0x68, 0x97, 0x40, 0x49, 0xda, 0x38, 0x8d, 0x6f, 0xc7, 0xb1, 0x8f, +0xe3, 0xbb, 0xfd, 0xbe, 0xfb, 0xf0, 0x9e, 0x9b, 0xed, 0xe3, 0xd4, 0xe5, +0x22, 0x86, 0xc4, 0x23, 0xbd, 0x3a, 0xc7, 0xc7, 0xf6, 0xf1, 0xff, 0xff, +0x7f, 0x6e, 0xef, 0x73, 0xac, 0x49, 0x29, 0xf9, 0x28, 0x9b, 0xef, 0xc3, +0x06, 0xf0, 0x5e, 0xed, 0x63, 0x02, 0x1f, 0xb6, 0x7d, 0x4c, 0xe0, 0xc3, +0xb6, 0x40, 0x3f, 0x1f, 0xfa, 0xd7, 0xaf, 0xb5, 0xb8, 0x90, 0xc4, 0x85, +0x20, 0x2e, 0x25, 0xea, 0x5c, 0x12, 0x97, 0x92, 0xc3, 0x42, 0x30, 0x2e, +0x25, 0x4b, 0x42, 0xb2, 0xf0, 0x85, 0xef, 0xc8, 0xc5, 0x0f, 0x1a, 0x70, +0xa7, 0x69, 0x9d, 0x65, 0xf4, 0xf5, 0xa7, 0xb4, 0xfb, 0x25, 0xcc, 0x4a, +0x05, 0x70, 0xda, 0x04, 0x8a, 0x90, 0x20, 0x04, 0xd8, 0xe7, 0x12, 0xa4, +0x70, 0x9d, 0xab, 0xe3, 0xed, 0x77, 0x3d, 0x2a, 0x8f, 0xf5, 0xf3, 0xc3, +0x4f, 0x7f, 0x4f, 0x9b, 0x11, 0x92, 0x19, 0x21, 0x89, 0x9b, 0xf7, 0x39, +0xf6, 0xe0, 0xcf, 0xfa, 0xfb, 0x6e, 0x4f, 0x02, 0xff, 0xfe, 0xad, 0x76, +0x0a, 0x98, 0x01, 0x07, 0xa8, 0x34, 0xd7, 0x68, 0x6c, 0x9a, 0x91, 0xd0, +0x04, 0x23, 0xa1, 0x30, 0x43, 0x23, 0xc3, 0x8c, 0x47, 0x23, 0x20, 0xea, +0xa4, 0xd7, 0xde, 0xe1, 0xcc, 0x3f, 0x5f, 0xa5, 0x56, 0x6b, 0x20, 0x05, +0x4f, 0xdc, 0xf5, 0x5d, 0xf9, 0x48, 0xe7, 0x8f, 0xfc, 0xf9, 0x31, 0x6d, +0xd6, 0x14, 0x62, 0x46, 0x08, 0x66, 0x84, 0xe4, 0x36, 0x17, 0x69, 0xb7, +0x30, 0x0b, 0x5f, 0x7d, 0x5c, 0x3e, 0xf6, 0xae, 0x08, 0xbc, 0xfc, 0xa4, +0x76, 0x1f, 0x70, 0x54, 0x03, 0x24, 0xb0, 0xef, 0xc6, 0x59, 0xc6, 0xf6, +0x1d, 0x64, 0x38, 0x34, 0xc9, 0xd0, 0xc8, 0x08, 0x88, 0xba, 0x5a, 0xb2, +0xe1, 0x9c, 0x8b, 0x3a, 0x88, 0x06, 0x6f, 0xbd, 0xb1, 0xc4, 0xca, 0xa9, +0xb3, 0x08, 0xc9, 0x92, 0x94, 0x3c, 0x22, 0x4c, 0xa0, 0x52, 0x72, 0x58, +0x48, 0x66, 0xdc, 0x40, 0x2d, 0xe0, 0xe3, 0x63, 0x3e, 0xa2, 0x11, 0x08, +0xfa, 0x05, 0x2b, 0xab, 0x60, 0x6c, 0xdb, 0x9f, 0x39, 0xf8, 0xf5, 0x5f, +0xc8, 0x35, 0x4e, 0x6a, 0xdd, 0x68, 0x8f, 0x74, 0x37, 0x5d, 0x3b, 0x07, +0x84, 0x20, 0x8e, 0x06, 0x1a, 0x70, 0xed, 0xe7, 0x1f, 0x22, 0x1c, 0xbf, +0xde, 0x04, 0x6b, 0x2e, 0xcb, 0x3c, 0x3a, 0xf7, 0xde, 0x58, 0x04, 0xf3, +0xea, 0x8c, 0x94, 0xbc, 0x68, 0x7d, 0x44, 0xba, 0xbe, 0x32, 0x3c, 0x1c, +0x60, 0x72, 0x72, 0x80, 0xc9, 0x89, 0x00, 0xfb, 0xa7, 0x34, 0x06, 0xfc, +0xa6, 0x10, 0x52, 0x70, 0xd3, 0xf5, 0xf0, 0xb7, 0x17, 0x60, 0x23, 0x09, +0xc0, 0x7d, 0x9c, 0xd4, 0x16, 0x3c, 0xe5, 0x76, 0x93, 0x32, 0xc9, 0x38, +0x04, 0xa4, 0xfa, 0xc5, 0xe0, 0xe0, 0x2e, 0xc2, 0xd3, 0xd7, 0x2a, 0xf0, +0xb2, 0xe5, 0x2c, 0x84, 0xb9, 0x5c, 0x71, 0x65, 0xc2, 0x0c, 0xc7, 0x26, +0xec, 0x4b, 0xd6, 0xd5, 0xc0, 0x80, 0x9f, 0x89, 0xc8, 0x6e, 0xa6, 0xf6, +0xef, 0x21, 0x12, 0x09, 0x32, 0xb2, 0x4b, 0x9a, 0x62, 0xd4, 0xcd, 0x63, +0x3b, 0xb6, 0x1b, 0x0e, 0x41, 0x42, 0x11, 0x88, 0x7b, 0x61, 0xff, 0xf9, +0xef, 0x19, 0x37, 0xbd, 0xba, 0xf4, 0xed, 0x07, 0xc9, 0x73, 0x52, 0x83, +0x23, 0xb2, 0xcd, 0x03, 0x79, 0x34, 0xa8, 0x55, 0x2b, 0xea, 0x47, 0x10, +0x2a, 0x4b, 0x65, 0xd3, 0x45, 0xc4, 0xbc, 0x66, 0x91, 0x91, 0xc2, 0x26, +0x33, 0x1a, 0x1a, 0x65, 0xd7, 0xc8, 0x10, 0xe1, 0xe8, 0x18, 0x13, 0x91, +0xdd, 0x8c, 0x8d, 0x07, 0x5d, 0x80, 0xcd, 0xd0, 0x43, 0x76, 0x2c, 0xc7, +0xa6, 0x26, 0x6d, 0xaf, 0xc5, 0x01, 0x7e, 0xf5, 0x34, 0xb3, 0x66, 0xf8, +0xcd, 0x06, 0x02, 0x1c, 0x09, 0x8f, 0xb2, 0xbf, 0x56, 0x87, 0x7c, 0x89, +0xfc, 0x4f, 0x7f, 0xc7, 0xed, 0x8f, 0x3e, 0xc4, 0x52, 0xa7, 0x07, 0x96, +0xec, 0x7b, 0x8a, 0x9a, 0xa9, 0xb4, 0x30, 0x81, 0x37, 0x41, 0x34, 0xbd, +0xc9, 0x98, 0xde, 0xb9, 0xed, 0xee, 0xcf, 0x3a, 0xe1, 0x66, 0x03, 0xf6, +0xf0, 0x9a, 0x74, 0x13, 0x70, 0xdc, 0x30, 0x30, 0x60, 0xbf, 0x35, 0xfb, +0x9b, 0x67, 0x90, 0x7b, 0x86, 0x61, 0x78, 0x10, 0x76, 0x8f, 0x40, 0xd0, +0x0f, 0x43, 0xbb, 0x86, 0x08, 0x85, 0xc6, 0xb8, 0xb0, 0xb1, 0x3d, 0x7e, +0x66, 0xb9, 0xf4, 0x2c, 0x70, 0xb0, 0x9d, 0x80, 0xcb, 0xa5, 0x5b, 0x89, +0x15, 0x42, 0x53, 0xd3, 0x2e, 0x90, 0x6e, 0xf0, 0x1d, 0x47, 0x2c, 0x92, +0xb2, 0xa7, 0x77, 0x1c, 0xb0, 0x5e, 0x64, 0x94, 0x19, 0x45, 0x18, 0x1b, +0x81, 0x91, 0x5d, 0x30, 0x32, 0x04, 0x03, 0x83, 0x03, 0x84, 0x26, 0x22, +0x84, 0xc2, 0x21, 0xc2, 0x93, 0x61, 0x76, 0x0d, 0x05, 0xa8, 0x94, 0x8b, +0xb4, 0xb8, 0xc8, 0x99, 0xe5, 0x52, 0xfc, 0xc7, 0x4f, 0x71, 0xcf, 0xf7, +0xbf, 0xa6, 0x3d, 0x67, 0x13, 0xb8, 0xf3, 0x5b, 0xf2, 0xa5, 0xe7, 0x1f, +0x57, 0x49, 0x22, 0x5b, 0x0d, 0x68, 0xd5, 0x4c, 0x20, 0xd2, 0xa5, 0x7a, +0xd3, 0xe5, 0x0d, 0xf3, 0x9a, 0xfb, 0xbc, 0x87, 0x77, 0x9c, 0x6b, 0x0e, +0xc9, 0x46, 0x43, 0x90, 0x4c, 0x49, 0xf4, 0x1c, 0xa4, 0x33, 0xd0, 0x12, +0x70, 0x30, 0x1e, 0x25, 0x1c, 0xbd, 0x8a, 0xc9, 0xa9, 0x29, 0xc6, 0x43, +0x63, 0x20, 0xca, 0x14, 0x72, 0x9b, 0x5c, 0xba, 0xb0, 0x4a, 0x7a, 0x33, +0x4d, 0xb9, 0x54, 0xa5, 0xde, 0xb4, 0x83, 0x6f, 0x16, 0x78, 0xae, 0xad, +0x13, 0x5b, 0x5e, 0xc8, 0x25, 0xd6, 0xd8, 0x1b, 0x8b, 0x7a, 0x10, 0xe8, +0x24, 0xd1, 0xf0, 0x00, 0xdf, 0x91, 0xf8, 0x2e, 0xef, 0xe8, 0x7a, 0x8d, +0xe4, 0x66, 0x05, 0x5d, 0x6f, 0x62, 0x18, 0x82, 0xe0, 0xe0, 0x08, 0xb1, +0xe9, 0x9b, 0xb9, 0xfe, 0x93, 0xd3, 0x4c, 0x1e, 0xb8, 0x86, 0xa0, 0xaf, +0x4e, 0xa5, 0x78, 0x89, 0x42, 0xf6, 0x3c, 0xe7, 0xde, 0x39, 0x45, 0x31, +0x9f, 0xa6, 0xd5, 0x6c, 0x20, 0x24, 0xb4, 0x5a, 0xe0, 0xf3, 0x81, 0x51, +0xb2, 0x9d, 0x37, 0xd3, 0x16, 0x42, 0x76, 0x1e, 0xc0, 0x4c, 0xbd, 0x5a, +0xee, 0xc8, 0x03, 0xe1, 0x01, 0xb0, 0xe1, 0xe4, 0x45, 0x57, 0x7e, 0xa8, +0x55, 0x2e, 0x55, 0x49, 0x25, 0x0c, 0xf4, 0x4c, 0x19, 0x5d, 0xaf, 0xd2, +0x68, 0x48, 0xc2, 0x57, 0xdd, 0xc4, 0x81, 0x1b, 0x6f, 0x25, 0x3c, 0x75, +0x88, 0xd1, 0xbd, 0x53, 0x20, 0x4a, 0xe4, 0x36, 0x4e, 0x71, 0xfe, 0xf4, +0x3f, 0x30, 0xb2, 0x6f, 0x53, 0x29, 0xa6, 0x09, 0x04, 0xc0, 0xef, 0x57, +0x80, 0xfd, 0x7e, 0x47, 0x47, 0x21, 0x60, 0x33, 0x67, 0x27, 0x3b, 0xdd, +0x04, 0x04, 0x79, 0x80, 0x42, 0x26, 0xa3, 0x08, 0x58, 0xf1, 0x6b, 0xc5, +0x76, 0x57, 0xd8, 0x58, 0x1e, 0x50, 0x04, 0x1a, 0xb5, 0x1a, 0x7a, 0x7a, +0x0b, 0x3d, 0x65, 0x90, 0xda, 0x28, 0x50, 0x2e, 0x37, 0x18, 0x1e, 0x3b, +0x40, 0xf4, 0x9a, 0xbb, 0x39, 0xfc, 0xe9, 0x9b, 0x09, 0x4f, 0xdd, 0x40, +0x30, 0x18, 0xa0, 0x5c, 0x58, 0x43, 0x5f, 0x7f, 0x9d, 0x95, 0xd7, 0x9e, +0x41, 0xdf, 0x7c, 0x13, 0xd9, 0xaa, 0x10, 0xf0, 0x43, 0x20, 0x80, 0x0d, +0xde, 0xef, 0x53, 0x04, 0xac, 0x54, 0x11, 0x1a, 0x54, 0x6b, 0x50, 0xae, +0xda, 0xd7, 0x16, 0xbd, 0x3c, 0xb0, 0x06, 0x50, 0xab, 0xd5, 0xcc, 0x1c, +0xa0, 0x3d, 0x8c, 0x3c, 0x48, 0x18, 0xb9, 0x3c, 0x7a, 0x32, 0x47, 0x32, +0xa1, 0xa3, 0xa7, 0x0d, 0x82, 0x83, 0x63, 0x84, 0xa7, 0x6f, 0xe7, 0xe0, +0xad, 0x9f, 0x21, 0x7a, 0xcd, 0x9d, 0x0c, 0x8f, 0x46, 0x40, 0x54, 0x30, +0x52, 0xa7, 0x58, 0x3d, 0xf5, 0x27, 0x92, 0xe7, 0x5f, 0xc4, 0xc8, 0x9e, +0x07, 0x40, 0xd3, 0xd4, 0x0a, 0x98, 0x6a, 0xfb, 0x7c, 0x0a, 0xb8, 0xdf, +0x54, 0x5e, 0xd3, 0x1c, 0xe5, 0x01, 0x2e, 0xe9, 0xb8, 0x7b, 0xcd, 0xb1, +0x2e, 0x02, 0x2d, 0xa1, 0x08, 0x6c, 0x65, 0xf2, 0x66, 0x2f, 0xb0, 0x3c, +0xd0, 0x4d, 0x60, 0xfd, 0xed, 0x0d, 0x4e, 0xbf, 0x72, 0x0e, 0x80, 0xd1, +0xc8, 0x75, 0x84, 0xaf, 0xbe, 0x97, 0x43, 0x77, 0x7c, 0x91, 0xf0, 0xd5, +0xb3, 0xa0, 0x69, 0x34, 0xaa, 0x59, 0x92, 0xcb, 0x8b, 0xac, 0x5c, 0x3c, +0x4e, 0xf2, 0xfc, 0xf3, 0x34, 0x6b, 0x45, 0xbc, 0xcc, 0xa7, 0x81, 0xe6, +0x73, 0x08, 0xb8, 0x17, 0x38, 0x85, 0xaa, 0xd9, 0x82, 0x4c, 0xde, 0x56, +0x7f, 0xed, 0x87, 0x0f, 0x73, 0xda, 0xcb, 0x03, 0x79, 0xeb, 0xbc, 0x51, +0xdd, 0x26, 0x38, 0x10, 0xf0, 0x0c, 0x23, 0x23, 0x67, 0x70, 0xfa, 0x95, +0x73, 0x1c, 0xb8, 0xee, 0x2e, 0x0e, 0x7f, 0xee, 0x27, 0xe0, 0x1b, 0x04, +0x6d, 0x10, 0x23, 0xb3, 0xcc, 0xca, 0xf1, 0x05, 0x92, 0x6f, 0xfd, 0x1d, +0x23, 0x73, 0xd6, 0x13, 0xb0, 0x65, 0x96, 0xfa, 0x9a, 0x66, 0x92, 0xd0, +0xda, 0xc1, 0x5b, 0xea, 0x5b, 0x2b, 0x67, 0x28, 0x12, 0x12, 0xc0, 0x0c, +0x9f, 0xb6, 0x4e, 0x0c, 0x20, 0x84, 0xea, 0x6e, 0x00, 0xf9, 0x8c, 0x4e, +0x64, 0x5f, 0xc8, 0x24, 0x20, 0x5c, 0xc7, 0x16, 0xc9, 0xf5, 0x34, 0xa3, +0x91, 0x4f, 0x70, 0xf8, 0xce, 0x1f, 0x80, 0x6c, 0xd0, 0xa8, 0x6c, 0x73, +0xe2, 0xaf, 0xdf, 0x40, 0x4f, 0xbc, 0xbe, 0x23, 0x68, 0x4f, 0x12, 0xbe, +0xf6, 0xf0, 0xb1, 0xc0, 0x5b, 0x66, 0x6d, 0x04, 0xd7, 0x93, 0x2e, 0x42, +0x70, 0xd4, 0x7a, 0xdf, 0xb3, 0x8c, 0x02, 0xd4, 0xab, 0xd5, 0xee, 0x3c, +0xb0, 0x09, 0xe8, 0xc4, 0x0e, 0x7d, 0x19, 0xa4, 0x0a, 0xb3, 0x13, 0x7f, +0x99, 0x43, 0xdf, 0x78, 0xe3, 0xca, 0xc1, 0x9b, 0xea, 0x5b, 0xe0, 0x35, +0x9f, 0xe3, 0x0d, 0xc0, 0x9e, 0x37, 0xb6, 0xcb, 0x60, 0x94, 0x6d, 0x02, +0xf9, 0xf9, 0x39, 0x15, 0x3e, 0xd0, 0x31, 0x52, 0xde, 0xbb, 0x20, 0x5f, +0xb2, 0x06, 0x94, 0x9c, 0x95, 0x07, 0xa2, 0xe6, 0x1c, 0x5b, 0x35, 0xca, +0xc5, 0x6d, 0x8c, 0x7c, 0x99, 0x58, 0xfc, 0x16, 0x10, 0x55, 0xd6, 0xdf, +0x7c, 0xf6, 0xdd, 0x81, 0xc7, 0x01, 0xef, 0x73, 0x85, 0x8f, 0xe6, 0x8a, +0x7d, 0x6b, 0x68, 0xda, 0xd4, 0xcd, 0x6c, 0x54, 0xf9, 0x60, 0x87, 0x0f, +0x78, 0x8c, 0x94, 0x96, 0x17, 0xea, 0xd5, 0xba, 0xab, 0x17, 0x38, 0x79, +0x90, 0x4a, 0xe4, 0x18, 0xde, 0x13, 0x61, 0x74, 0xef, 0x3e, 0x10, 0x65, +0x56, 0x5e, 0x3b, 0x7a, 0xe5, 0xe0, 0x5d, 0xa1, 0xe3, 0xf7, 0x3b, 0x35, +0xbf, 0x4d, 0x7d, 0xb3, 0xfa, 0xb4, 0x04, 0x6c, 0x64, 0xda, 0xaa, 0x4f, +0xdb, 0xd8, 0xda, 0x35, 0xd4, 0x0b, 0x35, 0xdf, 0x92, 0xd5, 0x4b, 0x2e, +0xf5, 0x1d, 0x4f, 0xac, 0xaf, 0xe5, 0x89, 0x4e, 0xcf, 0x80, 0xac, 0xa0, +0x27, 0x4e, 0x50, 0x29, 0xa6, 0xfb, 0x03, 0xac, 0xb5, 0xc7, 0xba, 0x55, +0xf7, 0x2d, 0x02, 0x16, 0x09, 0x0d, 0x47, 0x33, 0x21, 0x20, 0xa5, 0x43, +0xa3, 0xe9, 0x54, 0xa3, 0xf9, 0x39, 0x9e, 0x73, 0xdf, 0xdf, 0xcb, 0x03, +0x79, 0x80, 0x5a, 0xb5, 0x69, 0xee, 0x2a, 0x9d, 0xdd, 0x63, 0xb9, 0xd4, +0xc0, 0x28, 0xd4, 0x98, 0xb9, 0xe3, 0x16, 0x10, 0x65, 0xd6, 0x97, 0x5f, +0xe8, 0x09, 0xba, 0x8b, 0x80, 0xeb, 0xdc, 0xe7, 0x77, 0x6a, 0x7d, 0xa7, +0xfa, 0x12, 0xd7, 0xf4, 0x26, 0x20, 0x91, 0x75, 0xc0, 0xd3, 0x11, 0x3e, +0xde, 0x04, 0x24, 0x6b, 0x12, 0xc8, 0xea, 0xf5, 0xae, 0x24, 0x4e, 0x5d, +0x2a, 0x31, 0xbc, 0x3b, 0xc4, 0x68, 0x68, 0x2f, 0x8d, 0x4a, 0x96, 0xc4, +0xca, 0xcb, 0x3b, 0x83, 0x76, 0x03, 0xf7, 0x75, 0x24, 0xad, 0x5f, 0x79, +0xc1, 0x56, 0xde, 0x1d, 0xfb, 0x42, 0xed, 0x7d, 0xca, 0x55, 0xc8, 0x15, +0xda, 0xe0, 0x75, 0x3d, 0xf5, 0xe8, 0x22, 0x60, 0x35, 0x33, 0x80, 0xa2, +0x51, 0x61, 0xcf, 0x6e, 0x1f, 0x96, 0x4f, 0xf5, 0x6c, 0x85, 0xe8, 0x81, +0x9b, 0x41, 0x94, 0x48, 0xac, 0xbc, 0x7a, 0x45, 0xa0, 0xbd, 0xc2, 0xc8, +0xef, 0xea, 0xc0, 0x16, 0x78, 0x29, 0x9c, 0xd8, 0xbf, 0x98, 0xea, 0x44, +0xc7, 0x62, 0xe7, 0x5c, 0xdc, 0x33, 0x84, 0x14, 0x81, 0x2a, 0x7b, 0x86, +0xfd, 0x20, 0x25, 0x8d, 0x86, 0x24, 0x99, 0x6c, 0xf0, 0xa9, 0x6b, 0x63, +0x20, 0xb6, 0x59, 0x3d, 0xfb, 0x72, 0x5f, 0xa0, 0xad, 0xba, 0xde, 0x59, +0x36, 0xed, 0xe5, 0x4a, 0x5a, 0xa4, 0x02, 0xde, 0x32, 0x49, 0xe4, 0xda, +0x9b, 0xf7, 0xe2, 0xfc, 0x1c, 0xed, 0xfe, 0xf0, 0x24, 0x20, 0x9d, 0x66, +0x56, 0x2c, 0xd6, 0x61, 0x52, 0x11, 0x48, 0x25, 0x5b, 0x0c, 0x0c, 0x0e, +0x10, 0x9b, 0x8a, 0x92, 0xbb, 0xf4, 0x5f, 0xea, 0xd5, 0x82, 0xda, 0xaf, +0xd0, 0x5b, 0xe9, 0xce, 0x4e, 0xdb, 0xf6, 0x9e, 0x0b, 0x3c, 0x66, 0x85, +0xb1, 0x42, 0xa7, 0xd5, 0x84, 0xcd, 0xac, 0xaa, 0xff, 0x6d, 0xea, 0x7b, +0x58, 0xcf, 0x32, 0x0a, 0x60, 0x18, 0x4d, 0x75, 0x37, 0x24, 0xa9, 0x34, +0xc4, 0xf6, 0x1f, 0x04, 0x61, 0x70, 0x69, 0xed, 0x3f, 0xf6, 0x66, 0xab, +0x5f, 0xd0, 0xee, 0x65, 0x3d, 0xfd, 0xb0, 0x92, 0xd3, 0x9d, 0xb4, 0xad, +0x16, 0xac, 0xa7, 0x60, 0x79, 0xbd, 0x0d, 0xd6, 0xda, 0xfc, 0x1c, 0x7f, +0xf4, 0x7a, 0xac, 0xd2, 0x55, 0x46, 0x1f, 0xfe, 0xa5, 0xd3, 0xcc, 0x0a, +0xdb, 0xca, 0xaf, 0x8d, 0x26, 0x64, 0xb2, 0x10, 0xdb, 0x17, 0xa6, 0x51, +0xdb, 0x22, 0x99, 0x58, 0xb5, 0x4b, 0xa1, 0xbf, 0x63, 0x1b, 0x1c, 0x70, +0x25, 0x67, 0x57, 0x89, 0x74, 0x77, 0x58, 0x13, 0x6c, 0xb3, 0xa9, 0xca, +0x64, 0xa9, 0xac, 0xea, 0xfd, 0xf1, 0x33, 0x5d, 0xe0, 0x01, 0x1e, 0xf3, +0x52, 0xdf, 0xd3, 0x03, 0x96, 0x17, 0x24, 0x90, 0x37, 0xd4, 0xeb, 0x54, +0x1a, 0x82, 0x03, 0x01, 0x26, 0xa3, 0xbb, 0x59, 0x5f, 0x7d, 0xdb, 0xde, +0xb3, 0xb8, 0x37, 0x5e, 0x9d, 0x8a, 0x43, 0x7b, 0x53, 0xb2, 0x8e, 0x56, +0x43, 0x6a, 0x36, 0x21, 0xb3, 0x05, 0xa9, 0x1c, 0xa4, 0xb6, 0x7a, 0xc1, +0x03, 0xe0, 0x58, 0x2f, 0xf5, 0x7b, 0x13, 0x90, 0x2c, 0x49, 0x98, 0x29, +0x6c, 0xab, 0xd7, 0xe9, 0x2c, 0x44, 0x63, 0x63, 0x20, 0x8a, 0x24, 0x2e, +0xac, 0xb7, 0x55, 0x0f, 0x37, 0x81, 0x4e, 0x73, 0xef, 0x26, 0xa5, 0x84, +0x46, 0x0b, 0xf4, 0xbc, 0x09, 0x3a, 0xe7, 0x4c, 0x55, 0x3b, 0xd8, 0x12, +0xf0, 0xa5, 0x9d, 0x3e, 0xe0, 0x49, 0xa0, 0x65, 0x56, 0x22, 0xcb, 0x03, +0x19, 0x1d, 0x6e, 0x3a, 0x32, 0x4c, 0x3e, 0x9b, 0xa1, 0x5e, 0xab, 0xb7, +0x4d, 0x4c, 0x6e, 0xc5, 0xc1, 0xde, 0xee, 0x3a, 0x93, 0x94, 0x84, 0x74, +0x0e, 0xd2, 0x5b, 0x0e, 0xe8, 0x3e, 0xff, 0x96, 0x3b, 0x0a, 0x7c, 0x73, +0x7e, 0x8e, 0x42, 0x2f, 0xf5, 0x7b, 0x12, 0x10, 0xae, 0x5e, 0x70, 0x71, +0x43, 0x25, 0xdc, 0xe4, 0x84, 0xc6, 0xb9, 0x73, 0xba, 0xb3, 0x5f, 0xe9, +0xd8, 0xf2, 0xba, 0x81, 0x0b, 0x09, 0x7a, 0xc1, 0x0c, 0x91, 0x2d, 0x15, +0xe3, 0x56, 0xa5, 0xb9, 0x8c, 0xad, 0xa1, 0xaa, 0xcd, 0x13, 0xf3, 0x73, +0x5c, 0x00, 0x3c, 0x9f, 0x87, 0x5e, 0x9e, 0x80, 0x74, 0x08, 0x54, 0xeb, +0x10, 0x0a, 0x05, 0x41, 0x94, 0x49, 0x6e, 0x96, 0xf0, 0xfb, 0x5d, 0x0d, +0xc7, 0x45, 0x44, 0x4a, 0x15, 0x1e, 0x99, 0xbc, 0x02, 0xdd, 0x6c, 0xf6, +0xad, 0xf6, 0x12, 0x6a, 0x3c, 0x3c, 0x6a, 0x6f, 0x93, 0x2f, 0x03, 0xfa, +0xf2, 0x04, 0x5c, 0x1e, 0x38, 0xb3, 0x02, 0xf1, 0x58, 0x8b, 0x2d, 0xbd, +0x68, 0x97, 0x58, 0x29, 0x41, 0x9a, 0xe0, 0xb7, 0x0c, 0xc8, 0x16, 0xda, +0x41, 0xf7, 0xa1, 0xf6, 0x12, 0x2a, 0x44, 0x16, 0xfb, 0x55, 0xfa, 0xca, +0x08, 0xa8, 0x91, 0x2d, 0x0f, 0x8c, 0x2f, 0xaf, 0x42, 0x36, 0x2b, 0x88, +0x4d, 0xd6, 0xd4, 0x03, 0x60, 0x01, 0x5b, 0x45, 0xd0, 0x0d, 0xa5, 0x76, +0xb3, 0xd5, 0x17, 0x60, 0x50, 0xa1, 0xb1, 0x88, 0xaa, 0x2a, 0xef, 0x09, +0xb4, 0xdb, 0xba, 0xfe, 0xa1, 0xb1, 0xec, 0x47, 0x5f, 0xd1, 0xee, 0x91, +0x5e, 0xdd, 0xaf, 0x3f, 0xb0, 0xa0, 0x04, 0x58, 0x44, 0x85, 0x87, 0xb3, +0x0d, 0x78, 0x1f, 0x40, 0xbb, 0xad, 0x27, 0x01, 0x80, 0x85, 0x07, 0xb4, +0x79, 0x76, 0x68, 0x22, 0x1e, 0x66, 0x81, 0x5e, 0x6c, 0xdb, 0xb7, 0xbf, +0xcf, 0xa0, 0xdd, 0xb6, 0x23, 0x01, 0x4e, 0x6a, 0x2c, 0x3c, 0xc9, 0x1f, +0x80, 0xfb, 0x77, 0xb8, 0xc7, 0x1a, 0x0a, 0xf4, 0x51, 0xf7, 0xac, 0xfa, +0x41, 0x82, 0x76, 0xdb, 0xce, 0x04, 0x4c, 0x5b, 0x78, 0x40, 0xbb, 0x8f, +0xf6, 0x3f, 0x1e, 0xf2, 0xa8, 0x44, 0xcc, 0xbf, 0x9b, 0xca, 0xf1, 0x7e, +0x5a, 0x5f, 0x04, 0xfe, 0x9f, 0xed, 0x23, 0xff, 0x47, 0xf7, 0x47, 0x9e, +0xc0, 0xff, 0x00, 0x3b, 0x1c, 0x36, 0x87, 0xb9, 0x4b, 0x27, 0xd9, 0x00, +0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, +}; diff --git a/Source/Core/DolphinWX/resources/toolbar_file_open.xpm b/Source/Core/DolphinWX/resources/toolbar_file_open.xpm new file mode 100644 index 0000000000..eae6ab97bb --- /dev/null +++ b/Source/Core/DolphinWX/resources/toolbar_file_open.xpm @@ -0,0 +1,141 @@ +/* XPM */ +static char *toolbar_file_open_xpm[] = { +/* columns rows colors chars-per-pixel */ +"48 48 87 1", +" c #B09454", +". c #B69B5C", +"X c #BA9F5E", +"o c #BFA45D", +"O c #B59A65", +"+ c #BEA263", +"@ c #BDA269", +"# c #C2A551", +"$ c #C5A955", +"% c #C9AE57", +"& c #C2A65D", +"* c #C5A95E", +"= c #C8AC5B", +"- c #CDB25C", +"; c #D1B45F", +": c #C6AB60", +"> c #CBAF64", +", c #C4A96A", +"< c #CBB165", +"1 c #CDB36D", +"2 c #D2B661", +"3 c #D6B962", +"4 c #DABD65", +"5 c #D4B86F", +"6 c #C4AF79", +"7 c #D0B971", +"8 c #D2B978", +"9 c #DEC167", +"0 c #DFC272", +"q c #DEC37A", +"w c #E6C265", +"e c #E3C46A", +"r c #E7C86C", +"t c #EACC6E", +"y c #FBD465", +"u c #FAD56C", +"i c #FDD96F", +"p c #E5C772", +"a c #E6C975", +"s c #EECF70", +"d c #E6CB7A", +"f c #E9CE7D", +"g c #EFD071", +"h c #F4D474", +"j c #FAD771", +"k c #FAD976", +"l c #F6D778", +"z c #F7DA7B", +"x c #FADB7B", +"c c #FEE07D", +"v c #DCCC8E", +"b c #DECE91", +"n c #DFD099", +"m c #E7CD81", +"M c #EAD284", +"N c #EAD48B", +"B c #F7DB83", +"V c #FBDE83", +"C c #F4DD8E", +"Z c #E1D395", +"A c #EBD791", +"S c #EBD995", +"D c #E6D89C", +"F c #ECDC9C", +"G c #F6DF90", +"H c #FBE086", +"J c #FBE28B", +"K c #FFE98E", +"L c #F7E091", +"P c #FCE592", +"I c #FFE995", +"U c #FCEA9B", +"Y c #ECDFA2", +"T c #ECE0A5", +"R c #ECE1A8", +"E c #FDEEA3", +"W c #FDEFA8", +"Q c #FFF1A5", +"! c #FEF2AC", +"~ c #F6EEB9", +"^ c #FEF4B2", +"/ c #FFF9B7", +"( c #FFF6BA", +") c #FFF8BD", +"_ c #FFFBC3", +"` c #FFFEC9", +"' c None", +/* pixels */ +"'''''''''''''''''''''''''''''''''''''. 6''''''''", +"'''''''''''''''''''''''''''''.Xo&&=$#*b_`'''''''", +"'''''''''''''''''''''+:><2222----%$fHJJJJJJJJJ'''''''", +"''''''''CPJJHVVVxxxkhhtree432;&fHHHHHHHHH'''''''", +"'''''''OLPJJHVVVxxxkhhtree432;*dHVVVVVVVV'''''''", +"'''''''OLPJJHVVVxxxkhhtree432;*dHVVVVVVVV'''''''", +"'''''''OLPJJHVVVxxxkhhtree432;*aHxxxxxxxx'''''''", +"'''''''OLPJJHVVVxxxkhhtree432;*axxxxxxxxx'''''''", +"'''''''OLPJJJHVVxxxkhhtrre4432*pxxxxxxxxx'''''''", +"'''''''OLPJJJHVVxxxkhhtrre4432*pxxxxxxxxx'''''''", +"'''''''OLPJJJHVVxxxkhhtrre4432*pkkkkkkkkk'''''''", +"'''''''OGPJJJHVVxxxkhhtrre9432*rkkkkkkkkk'''''''", +"'''''''OGPJJJHVVxxxkhhtrre9432*ekjjjjjjj''''''''", +"'''''''OGPJJJHVVxxxkhhttre9432*ejjjjjjjj''''''''", +"'''''''OGPJJJHVVxxxkhhttre9432*eiuuuuuu'''''''''", +"''''''''CPJJJHVVxxxkhhttee4''''eiuuuuu''''''''''", +"''''''''NIJJJHVVxxxkhht''''''''wuuuu''''''''''''", +"'''''''''CPJJHVVzzl''''''''''''wyyy'''''''''''''", +"'''''''''''MJBB''''''''''''''''wyy''''''''''''''", +"'''''''''''''''''''''''''''''''wy'''''''''''''''", +"'''''''''''''''''''''''''''''''3''''''''''''''''" +}; diff --git a/Source/Core/DolphinWX/resources/toolbar_fullscreen.c b/Source/Core/DolphinWX/resources/toolbar_fullscreen.c new file mode 100644 index 0000000000..d810c8c884 --- /dev/null +++ b/Source/Core/DolphinWX/resources/toolbar_fullscreen.c @@ -0,0 +1,209 @@ +static const unsigned char toolbar_fullscreen_png[] = { +0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, +0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, +0x08, 0x06, 0x00, 0x00, 0x00, 0x57, 0x02, 0xf9, 0x87, 0x00, 0x00, 0x00, +0x04, 0x73, 0x42, 0x49, 0x54, 0x08, 0x08, 0x08, 0x08, 0x7c, 0x08, 0x64, +0x88, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, +0x12, 0x00, 0x00, 0x0b, 0x12, 0x01, 0xd2, 0xdd, 0x7e, 0xfc, 0x00, 0x00, +0x00, 0x25, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, +0x72, 0x65, 0x00, 0x4d, 0x61, 0x63, 0x72, 0x6f, 0x6d, 0x65, 0x64, 0x69, +0x61, 0x20, 0x46, 0x69, 0x72, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, +0x4d, 0x58, 0x20, 0x32, 0x30, 0x30, 0x34, 0x87, 0x76, 0xac, 0xcf, 0x00, +0x00, 0x00, 0x15, 0x74, 0x45, 0x58, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, +0x69, 0x6f, 0x6e, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x00, 0x39, 0x2f, 0x31, +0x32, 0x2f, 0x30, 0x34, 0x1c, 0xf3, 0x42, 0xbb, 0x00, 0x00, 0x08, 0xfd, +0x49, 0x44, 0x41, 0x54, 0x78, 0x9c, 0xed, 0x99, 0x6d, 0x8c, 0x5c, 0x55, +0x19, 0xc7, 0x7f, 0xe7, 0xdc, 0x3b, 0xb3, 0xd3, 0x7d, 0x9d, 0xdd, 0xae, +0xdb, 0x97, 0xa5, 0x20, 0x45, 0x5b, 0x88, 0x06, 0x96, 0xa2, 0x89, 0x01, +0x02, 0x09, 0x24, 0x46, 0x43, 0xd0, 0xf2, 0x45, 0xa3, 0x92, 0x40, 0x62, +0xf4, 0x03, 0x31, 0xa1, 0x26, 0x4a, 0x8c, 0x7e, 0x32, 0xc6, 0x17, 0x34, +0xc4, 0x7e, 0xd2, 0x4f, 0x06, 0x05, 0x85, 0xc4, 0x48, 0x42, 0x69, 0x08, +0x46, 0x01, 0x13, 0x10, 0x50, 0x69, 0xa5, 0xa5, 0x4b, 0xb1, 0x2d, 0x76, +0xdf, 0xcb, 0xbe, 0xbf, 0xce, 0xce, 0xdc, 0x3b, 0x33, 0xe7, 0x3c, 0x7e, +0x38, 0x77, 0x66, 0xee, 0xbd, 0x3b, 0xb3, 0x2d, 0x12, 0x68, 0x9a, 0xf4, +0x49, 0xce, 0x3e, 0xe7, 0x9e, 0x73, 0x77, 0xef, 0xf3, 0x3c, 0xff, 0xe7, +0xed, 0x9c, 0x55, 0x22, 0xc2, 0xa5, 0x4c, 0xfa, 0x62, 0x0b, 0xf0, 0x7e, +0xe9, 0xb2, 0x02, 0x17, 0x9b, 0x2e, 0x2b, 0x70, 0xb1, 0xe9, 0x92, 0x57, +0xc0, 0x6f, 0xb5, 0xf1, 0xb7, 0x47, 0x54, 0xde, 0x0a, 0x07, 0xc4, 0xf2, +0x45, 0x2b, 0x0c, 0x89, 0x80, 0xb5, 0x90, 0xe0, 0x02, 0x62, 0x23, 0x9e, +0x5e, 0xdf, 0x6c, 0xef, 0xc2, 0xd7, 0x8f, 0x59, 0xe1, 0x90, 0x58, 0x0e, +0x7e, 0xf7, 0x31, 0x59, 0x6e, 0x26, 0xa7, 0x6a, 0x56, 0x07, 0x5e, 0x7c, +0x44, 0xdd, 0x8f, 0xf0, 0x4b, 0x11, 0xf2, 0xff, 0xb7, 0x30, 0xb1, 0xe7, +0xf7, 0xa1, 0x40, 0x6d, 0x7d, 0x59, 0x84, 0x6f, 0x3f, 0xf4, 0xb8, 0xfc, +0x36, 0x2d, 0xeb, 0x06, 0x17, 0x7a, 0xfe, 0x17, 0xea, 0x7e, 0xb1, 0x3c, +0x6a, 0x85, 0x7c, 0xed, 0xe3, 0x22, 0x20, 0x00, 0xd1, 0x3c, 0x9a, 0x46, +0x3f, 0x5a, 0x50, 0x6c, 0xaf, 0xe5, 0xef, 0x5c, 0x78, 0x0d, 0xcd, 0x0b, +0x3c, 0xfa, 0xb3, 0x7b, 0xd5, 0xfd, 0xe9, 0x8d, 0x04, 0x02, 0x7f, 0x79, +0x58, 0xe5, 0x15, 0x8c, 0x00, 0xf9, 0xda, 0xdf, 0xcf, 0xe5, 0xe0, 0xca, +0x2b, 0x60, 0x6b, 0x3f, 0x64, 0x33, 0xce, 0x32, 0xd6, 0x82, 0x31, 0x49, +0xbe, 0x61, 0x6e, 0xc1, 0x9a, 0x88, 0xbf, 0xc7, 0x79, 0x18, 0xc2, 0xf2, +0x2a, 0xcc, 0x2f, 0xb9, 0x79, 0x1c, 0x09, 0x2b, 0x5c, 0xfd, 0xfd, 0x27, +0x1a, 0xee, 0x94, 0x88, 0x01, 0xb1, 0x3c, 0x28, 0xca, 0x09, 0x0f, 0xd0, +0xd5, 0x09, 0x37, 0xed, 0x83, 0x4c, 0xef, 0x6d, 0xb0, 0xed, 0x01, 0x74, +0xfe, 0x4e, 0xc4, 0x96, 0x40, 0x4a, 0x20, 0x01, 0x62, 0x4b, 0x88, 0x04, +0x60, 0x43, 0x44, 0x4a, 0x88, 0x0d, 0x62, 0xa3, 0x8c, 0x98, 0x10, 0x6b, +0x03, 0xc4, 0x86, 0x58, 0x13, 0x52, 0x5a, 0x1c, 0x41, 0x6c, 0x85, 0x6a, +0xb8, 0x4e, 0xb0, 0x3a, 0x87, 0xb5, 0x42, 0xa5, 0x58, 0x20, 0x2c, 0xae, +0x63, 0x05, 0xd6, 0xe7, 0x67, 0x00, 0xc8, 0x64, 0x60, 0x6b, 0xde, 0x7d, +0x7f, 0x74, 0x02, 0x4a, 0x41, 0x03, 0x09, 0xe0, 0x41, 0xe0, 0x87, 0x4d, +0x15, 0xb0, 0xc2, 0xfe, 0x1a, 0xac, 0xb9, 0x1c, 0x0c, 0xdd, 0x00, 0xde, +0xb6, 0x7b, 0xd1, 0xd7, 0x3c, 0x0e, 0x52, 0x74, 0x43, 0x69, 0x10, 0xe5, +0x14, 0x36, 0x05, 0xaa, 0x6b, 0xc3, 0x4e, 0xa8, 0xe2, 0x04, 0xd5, 0xe2, +0x39, 0xc4, 0x56, 0xa9, 0xac, 0x4f, 0x53, 0x29, 0xcd, 0x63, 0xad, 0x25, +0x5c, 0x39, 0x47, 0xb5, 0x1c, 0x24, 0x50, 0x69, 0x35, 0x4f, 0x93, 0xa7, +0xe1, 0xca, 0x41, 0xf8, 0xef, 0x18, 0x94, 0x2b, 0x75, 0x8f, 0xdb, 0xdf, +0x5a, 0x01, 0xcb, 0x90, 0x72, 0xb2, 0x31, 0xb8, 0x13, 0xfc, 0xfc, 0x2d, +0xf8, 0xbb, 0x7f, 0x0d, 0x12, 0x10, 0x14, 0x97, 0x78, 0xfd, 0xd0, 0x77, +0x78, 0xeb, 0xb5, 0x43, 0xac, 0xad, 0x94, 0x50, 0x8a, 0xc4, 0x80, 0x26, +0x73, 0x00, 0x15, 0x9b, 0xd7, 0x9e, 0x23, 0x1e, 0x63, 0xa0, 0x9c, 0xe5, +0xbb, 0x3b, 0xa1, 0xa7, 0xb3, 0x21, 0x93, 0x56, 0xd0, 0xdb, 0x03, 0xd3, +0x73, 0xf5, 0xa5, 0xa1, 0xb8, 0xcc, 0x49, 0x17, 0x8a, 0x05, 0x69, 0x5f, +0x2f, 0xe8, 0x6d, 0x5f, 0x8f, 0x84, 0x5f, 0xe3, 0x89, 0x1f, 0xdd, 0xc6, +0xfc, 0xbb, 0x93, 0x4e, 0x18, 0xed, 0x3e, 0xdc, 0x4a, 0x81, 0xda, 0x5e, +0x5c, 0xd8, 0xa6, 0x3c, 0x35, 0x37, 0x55, 0x58, 0x5a, 0x86, 0xf5, 0x22, +0x6c, 0xef, 0xa7, 0x6e, 0xf2, 0xae, 0x8e, 0x86, 0x02, 0xe9, 0xa4, 0x99, +0x46, 0x20, 0x61, 0x0d, 0xaf, 0xef, 0x0e, 0xc4, 0x86, 0xbc, 0x7e, 0xe8, +0x7b, 0x75, 0xe1, 0x3f, 0x7e, 0xd3, 0x0d, 0xdc, 0xbc, 0xff, 0x6e, 0x06, +0xae, 0x18, 0xac, 0xe3, 0x2f, 0x36, 0x16, 0xbd, 0x31, 0x9f, 0x90, 0xfa, +0x3c, 0x16, 0xa5, 0xd6, 0x22, 0xe9, 0x35, 0x63, 0x59, 0x98, 0x9b, 0xe5, +0x8d, 0xa3, 0xff, 0x62, 0x7c, 0x7c, 0x84, 0x6a, 0x15, 0xd6, 0xd6, 0xa1, +0xab, 0x43, 0xa1, 0xb4, 0x26, 0xe3, 0xbb, 0x9c, 0xda, 0xac, 0xf3, 0x4f, +0xc7, 0x40, 0xa4, 0x66, 0xa4, 0x8c, 0x84, 0x40, 0x95, 0xe1, 0xd7, 0x0e, +0x3b, 0xe1, 0xf7, 0x5d, 0xcf, 0xfe, 0x07, 0xbe, 0x09, 0x7a, 0x1f, 0xe8, +0x1b, 0x5d, 0x12, 0xf6, 0x03, 0x94, 0x94, 0x81, 0x30, 0x7a, 0x3f, 0x04, +0x29, 0x83, 0x84, 0x6e, 0x5d, 0xca, 0x48, 0xc4, 0xb1, 0x65, 0x90, 0x0a, +0x2a, 0xe2, 0x58, 0x37, 0xa4, 0x52, 0xa2, 0xbf, 0xbd, 0x83, 0x3b, 0x7b, +0xfb, 0x78, 0xf1, 0x85, 0xe7, 0x18, 0x1f, 0x1f, 0xa5, 0x58, 0x82, 0xee, +0x2e, 0x1f, 0x4f, 0x67, 0xb0, 0x52, 0x41, 0xa8, 0x6c, 0x94, 0xbe, 0x15, +0x02, 0x0a, 0x97, 0x12, 0xc5, 0x06, 0xa0, 0x7c, 0x0a, 0x6b, 0xce, 0xe7, +0x6f, 0xbe, 0xeb, 0xf3, 0xa0, 0x3e, 0x01, 0xfa, 0x93, 0x80, 0x05, 0x0c, +0x88, 0x71, 0x1c, 0x1b, 0x61, 0x2e, 0x14, 0x96, 0xa6, 0x38, 0xf2, 0xcc, +0xcf, 0x19, 0x7f, 0xeb, 0x25, 0xfc, 0x5c, 0x27, 0xd7, 0xdd, 0xfc, 0x05, +0x86, 0xee, 0xf8, 0x52, 0xea, 0xd3, 0x8d, 0x22, 0xa3, 0x3c, 0x0f, 0xe9, +0xea, 0x46, 0x99, 0x2a, 0x43, 0xd7, 0xdf, 0xc4, 0xe4, 0xc4, 0x28, 0xd6, +0x82, 0xf6, 0xb3, 0x78, 0xd9, 0x0e, 0x8c, 0x59, 0x07, 0x2a, 0xe7, 0x47, +0x20, 0x5e, 0x70, 0xea, 0x08, 0x48, 0xa5, 0xee, 0xdb, 0x1f, 0xd9, 0xb9, +0x1d, 0xf4, 0x6e, 0x90, 0x00, 0x50, 0x48, 0xf5, 0x38, 0x54, 0x4e, 0x3a, +0xcb, 0x46, 0x2e, 0x51, 0x2e, 0x16, 0x79, 0xf6, 0x57, 0x0f, 0x13, 0x06, +0x01, 0x22, 0x50, 0x2e, 0x16, 0x38, 0xf6, 0xd7, 0x27, 0x58, 0x9b, 0x1a, +0xe6, 0xd6, 0xcf, 0xde, 0x95, 0x72, 0x9f, 0x86, 0x0b, 0x49, 0x54, 0x7a, +0xfb, 0xfa, 0xb6, 0xa2, 0xa2, 0xf2, 0xaa, 0x74, 0x06, 0xaf, 0xad, 0x1d, +0x1d, 0x94, 0x9b, 0x0a, 0x0f, 0xa9, 0x4a, 0x9c, 0x70, 0x63, 0x03, 0x62, +0x43, 0x2a, 0xab, 0xc3, 0x8d, 0x2c, 0x62, 0x23, 0xab, 0x53, 0x42, 0xca, +0x47, 0x20, 0x3c, 0x06, 0x26, 0x8c, 0xf9, 0xb9, 0x70, 0xf4, 0xf9, 0xc3, +0x94, 0x23, 0xe1, 0x85, 0xc6, 0x38, 0x33, 0xfc, 0x26, 0x8b, 0xb3, 0xd3, +0x8d, 0x95, 0x44, 0x89, 0x8f, 0x59, 0x50, 0x04, 0xad, 0x5c, 0xf6, 0x51, +0x5e, 0x96, 0x4c, 0x5b, 0x27, 0xda, 0xcb, 0x36, 0x97, 0x3e, 0x8d, 0x80, +0xb5, 0xd4, 0x53, 0x82, 0x31, 0x20, 0x12, 0x62, 0xca, 0x0b, 0x8d, 0xac, +0x62, 0x0c, 0x48, 0x40, 0x25, 0x28, 0x70, 0xe2, 0xcf, 0x3f, 0x65, 0x69, +0x7a, 0x82, 0x81, 0x5d, 0xbb, 0xd9, 0xf3, 0xa9, 0x5b, 0xc8, 0xb6, 0xe5, +0xc0, 0x0a, 0xd3, 0x63, 0x23, 0xce, 0x5a, 0x71, 0x19, 0x23, 0x39, 0x47, +0xcf, 0x9c, 0xa1, 0xb7, 0xaf, 0x1f, 0xac, 0xb0, 0xb6, 0xb2, 0xc2, 0x91, +0x7f, 0xbc, 0xca, 0xda, 0xca, 0x2a, 0x7b, 0xf6, 0x5e, 0xcb, 0xde, 0x3d, +0x7b, 0xea, 0x2e, 0xa0, 0x23, 0xb3, 0x6a, 0x2f, 0x83, 0x97, 0xed, 0x44, +0xf9, 0x4b, 0x2d, 0x11, 0xd8, 0x18, 0xc4, 0x12, 0x53, 0xc0, 0x06, 0x04, +0x0b, 0x47, 0x1b, 0xa9, 0xd2, 0x18, 0x2a, 0xa5, 0x39, 0x5e, 0xfc, 0xcd, +0x37, 0x58, 0x3c, 0x77, 0x0a, 0x11, 0x98, 0x1e, 0x3d, 0xcb, 0xc4, 0xa9, +0xb7, 0xf8, 0xdc, 0x7d, 0xdf, 0x02, 0xb1, 0x14, 0x96, 0x97, 0x1a, 0xe9, +0x38, 0xa5, 0x48, 0xad, 0x27, 0x58, 0x98, 0x9d, 0xe5, 0xf0, 0x53, 0x7f, +0x24, 0x08, 0x42, 0x44, 0x60, 0x72, 0x72, 0x8a, 0xa9, 0xc9, 0x49, 0xee, +0xb8, 0xfd, 0x76, 0x17, 0x13, 0x91, 0x11, 0xb5, 0x9f, 0xc3, 0x6f, 0xeb, +0x40, 0xe9, 0x4c, 0x4b, 0x04, 0x12, 0x2e, 0x24, 0xb1, 0xee, 0xd1, 0x58, +0xe7, 0x42, 0xd6, 0x9a, 0xba, 0x02, 0x62, 0x2c, 0xa7, 0x5e, 0x79, 0x8c, +0x85, 0xa9, 0x53, 0x09, 0xeb, 0x2e, 0xce, 0xbc, 0xcb, 0xd9, 0x37, 0x8f, +0x82, 0xb5, 0x74, 0x74, 0xe7, 0x93, 0x96, 0x4f, 0x0c, 0x37, 0x39, 0xfa, +0xcf, 0x57, 0x09, 0x83, 0x30, 0xa1, 0xe0, 0xdb, 0x6f, 0x9f, 0x62, 0x7e, +0x6e, 0xbe, 0x8e, 0x80, 0xd6, 0xe0, 0x65, 0xdb, 0xf1, 0x32, 0xed, 0xa8, +0xd6, 0x5d, 0x7f, 0x2a, 0x06, 0x24, 0x19, 0x5b, 0x62, 0x03, 0x4a, 0x73, +0x6f, 0x02, 0x91, 0x67, 0x19, 0xc3, 0xcc, 0xd9, 0x23, 0x1b, 0x5b, 0x65, +0x81, 0xf1, 0xd3, 0x27, 0xc1, 0x58, 0x06, 0x06, 0xaf, 0xda, 0xe0, 0x3a, +0x35, 0xda, 0x31, 0xb8, 0x0b, 0xac, 0x65, 0x6a, 0x72, 0xb2, 0x11, 0x23, +0x31, 0x25, 0xce, 0x8e, 0x8c, 0xba, 0x6f, 0x45, 0x06, 0xf3, 0xb3, 0x9d, +0x68, 0x2f, 0x87, 0x6c, 0x72, 0xee, 0x3a, 0x6f, 0x10, 0x57, 0xc3, 0x42, +0xbd, 0xaa, 0x62, 0x0d, 0xd6, 0xda, 0x84, 0xe0, 0xb5, 0xb3, 0x42, 0x39, +0x28, 0x81, 0x35, 0x5c, 0x77, 0xe3, 0xa7, 0x13, 0xc2, 0xc7, 0x95, 0xe9, +0xec, 0xe8, 0x04, 0x6b, 0x09, 0x83, 0xb0, 0xb1, 0xc7, 0xc6, 0xae, 0xba, +0x16, 0xc4, 0x5e, 0xb6, 0x0b, 0x2f, 0xd3, 0x8e, 0x34, 0xea, 0xf6, 0xf9, +0x11, 0xa8, 0xbb, 0x90, 0x01, 0x6b, 0xcb, 0x94, 0x56, 0x26, 0x12, 0x31, +0xd0, 0x91, 0xef, 0x6f, 0x58, 0x3f, 0x76, 0x00, 0xd9, 0x75, 0xf5, 0x1e, +0x30, 0x96, 0x97, 0x9f, 0x3b, 0xec, 0x90, 0x6c, 0xe2, 0x42, 0x4f, 0x3d, +0xf9, 0x7b, 0xca, 0x41, 0x89, 0x1d, 0x3b, 0x07, 0x9b, 0xba, 0x58, 0xff, +0xd6, 0xad, 0x0e, 0x01, 0xed, 0x46, 0x26, 0xd7, 0x83, 0xf6, 0xb7, 0xa4, +0xc5, 0x6c, 0xad, 0x80, 0xa4, 0xba, 0x81, 0xca, 0xfa, 0x39, 0x4c, 0xd4, +0x25, 0xd6, 0x5c, 0x68, 0xf7, 0x0d, 0xb7, 0x26, 0xad, 0x1f, 0xcd, 0x07, +0x76, 0xee, 0xe2, 0xcc, 0xf0, 0x71, 0x16, 0x66, 0x67, 0x9a, 0x9f, 0xc2, +0x04, 0xc2, 0x20, 0xe4, 0x95, 0x97, 0x5e, 0x62, 0xef, 0xde, 0x6b, 0x37, +0x66, 0x29, 0x81, 0xc1, 0x9d, 0x3b, 0x12, 0x08, 0x64, 0xb6, 0xe4, 0xf1, +0x32, 0x9d, 0x88, 0xb4, 0x56, 0x60, 0xd3, 0x34, 0x5a, 0x2e, 0xcc, 0x62, +0x4d, 0xa3, 0x31, 0x13, 0x63, 0x78, 0xe7, 0xe8, 0xcb, 0xf5, 0x6c, 0x25, +0x34, 0xf8, 0x0b, 0xcf, 0x3c, 0xe5, 0x8c, 0x90, 0xf2, 0xff, 0xf8, 0x33, +0x02, 0x23, 0x67, 0x47, 0x98, 0x9b, 0x9d, 0xdf, 0x88, 0x10, 0xf0, 0xa7, +0xa7, 0x9f, 0xe5, 0x6b, 0x5f, 0xbe, 0x07, 0xad, 0xdd, 0xb3, 0xdf, 0xd6, +0x83, 0xf6, 0xdb, 0x11, 0x69, 0xed, 0x42, 0x9b, 0xa6, 0xd1, 0xd2, 0xf2, +0x78, 0x02, 0x81, 0xe9, 0xf1, 0x31, 0x4e, 0xff, 0xfb, 0xef, 0x1b, 0x84, +0x07, 0x58, 0x5b, 0x59, 0x69, 0x54, 0xf2, 0x16, 0x4a, 0x20, 0x10, 0x04, +0x21, 0xc5, 0x52, 0x98, 0xc8, 0xeb, 0xb5, 0x77, 0x66, 0xe7, 0x17, 0x38, +0xf9, 0x9f, 0x33, 0xf5, 0xc2, 0x99, 0xc9, 0xf5, 0xa2, 0xb4, 0xbf, 0x69, +0x10, 0x6f, 0x40, 0xa0, 0xa6, 0xab, 0x35, 0x50, 0x09, 0x0a, 0x18, 0xd3, +0x58, 0x3b, 0x79, 0xfc, 0x88, 0x4b, 0xb5, 0xb5, 0x0f, 0xcb, 0x46, 0x9e, +0x3e, 0x3f, 0x37, 0x43, 0x22, 0xde, 0xb6, 0xa7, 0xd7, 0x86, 0x4f, 0x9e, +0xa6, 0x63, 0x8b, 0xdb, 0xcb, 0xe4, 0x7a, 0xb0, 0x56, 0x36, 0x75, 0xa1, +0x64, 0x0c, 0x44, 0xfe, 0x6a, 0xc5, 0xc5, 0x40, 0x61, 0x7e, 0x14, 0x53, +0x73, 0x2b, 0x05, 0x85, 0xd5, 0xb5, 0x8d, 0xb7, 0x06, 0x31, 0x9e, 0x8e, +0x8b, 0xd6, 0xf5, 0xa0, 0xf5, 0x7b, 0xeb, 0xc5, 0x62, 0x2c, 0x8d, 0xf6, +0xa0, 0x74, 0x16, 0xa5, 0xde, 0x4b, 0x0c, 0x44, 0x64, 0x0c, 0x84, 0x85, +0x65, 0x8c, 0x81, 0x6c, 0x16, 0xaa, 0x15, 0x10, 0xab, 0x92, 0xd6, 0xab, +0x59, 0x3a, 0xcd, 0x63, 0x56, 0x4f, 0x3f, 0x9f, 0x0f, 0x95, 0x9d, 0xdb, +0xb3, 0x88, 0x71, 0x29, 0x34, 0xb3, 0xa5, 0x8f, 0x72, 0x50, 0x42, 0xea, +0x7d, 0xfe, 0x79, 0x10, 0xa8, 0x59, 0xdf, 0x4a, 0x4d, 0x81, 0x55, 0xac, +0x81, 0xbe, 0x1e, 0xb7, 0x3f, 0x33, 0x3b, 0xc3, 0xc0, 0xc0, 0x76, 0xba, +0xbb, 0xf3, 0xc9, 0x7b, 0x9c, 0x88, 0x67, 0xfc, 0x6c, 0xa2, 0x36, 0xc4, +0x11, 0xad, 0x09, 0x98, 0xcd, 0x66, 0x9b, 0x0a, 0xde, 0xd7, 0xdb, 0xc3, +0xbe, 0xeb, 0xb7, 0x81, 0xcc, 0xa1, 0x34, 0x6c, 0xfd, 0xe8, 0xed, 0x64, +0x73, 0xbd, 0x54, 0xc2, 0x22, 0xc6, 0x94, 0xdf, 0x3b, 0x02, 0x41, 0xe8, +0xae, 0x51, 0x00, 0x7a, 0xf3, 0xb0, 0x5a, 0x80, 0xb0, 0x0c, 0x33, 0x33, +0xd3, 0x0e, 0x5e, 0x2f, 0xea, 0x18, 0xb5, 0x83, 0x5b, 0x2b, 0x50, 0xaa, +0x4c, 0xae, 0xcd, 0xb5, 0x01, 0x35, 0x37, 0x88, 0xbf, 0xe3, 0x9e, 0xcb, +0x89, 0xa3, 0x68, 0x7d, 0x9f, 0x15, 0xaa, 0x95, 0x15, 0xb4, 0x82, 0x6c, +0xc7, 0x0e, 0xae, 0xf9, 0xcc, 0x83, 0x88, 0x68, 0xd6, 0x97, 0xce, 0x51, +0x2a, 0xac, 0x5d, 0x18, 0x02, 0xf1, 0x5e, 0x68, 0x79, 0xc5, 0xa1, 0x60, +0x8c, 0x73, 0x83, 0x5d, 0x3b, 0xa0, 0x3f, 0x0f, 0x99, 0x48, 0xe5, 0x7a, +0x75, 0x6e, 0xb0, 0xc6, 0x7a, 0x0b, 0x4a, 0xbf, 0x17, 0x3f, 0x37, 0x3b, +0x9f, 0xef, 0xa2, 0xff, 0x63, 0x77, 0x33, 0x74, 0xcf, 0x1f, 0xc8, 0xf5, +0x5c, 0xc9, 0xea, 0xdc, 0x18, 0x8b, 0x93, 0x27, 0x58, 0x5e, 0x5c, 0x68, +0xf9, 0x37, 0x5b, 0xa6, 0xd1, 0xd9, 0x05, 0x77, 0x2f, 0xe3, 0xc5, 0x54, +0xec, 0xe9, 0x56, 0xe4, 0x7b, 0x5c, 0xa7, 0xa5, 0xb4, 0x46, 0x29, 0x0f, +0xa5, 0xb5, 0xb3, 0x83, 0x72, 0xcf, 0x68, 0x1f, 0xa5, 0x7d, 0x77, 0x18, +0xc9, 0x6c, 0x41, 0xfb, 0x6d, 0x28, 0xdd, 0x86, 0x9f, 0xed, 0x40, 0x67, +0xb6, 0xa0, 0xfd, 0x76, 0xfc, 0x5c, 0x0f, 0x9e, 0xdf, 0x8e, 0x97, 0xe9, +0x20, 0x93, 0xeb, 0xc5, 0x6f, 0xeb, 0xc6, 0xf3, 0x3b, 0x68, 0xeb, 0xdc, +0x46, 0x5b, 0xfb, 0x00, 0xd6, 0x08, 0x8b, 0x13, 0x27, 0x98, 0x7a, 0xfb, +0x2f, 0x2c, 0x4c, 0x9e, 0x60, 0x69, 0xb9, 0x78, 0x81, 0x0a, 0x58, 0x8e, +0x11, 0x5d, 0x5b, 0x84, 0x21, 0x9c, 0x1d, 0x83, 0xab, 0xae, 0x68, 0x28, +0xa1, 0x14, 0x68, 0xdf, 0x43, 0x2b, 0x1f, 0xe5, 0xf9, 0x78, 0x7e, 0x16, +0xe5, 0x39, 0x81, 0xb5, 0x9f, 0x41, 0x7b, 0x59, 0xb4, 0xdf, 0x86, 0xf6, +0x73, 0x68, 0xaf, 0x0d, 0xe5, 0x65, 0xd1, 0x5e, 0x16, 0xa5, 0x6b, 0x6b, +0x6e, 0x5d, 0xfb, 0xed, 0xd1, 0x3c, 0xe7, 0xf2, 0xbc, 0x15, 0x4c, 0xb5, +0x4c, 0x69, 0x65, 0x9a, 0xb5, 0xb9, 0x71, 0xd6, 0x16, 0xc6, 0x59, 0x18, +0x7f, 0x83, 0xf9, 0xc9, 0xe3, 0x8c, 0x8d, 0xcd, 0x50, 0xad, 0x26, 0x82, +0xf8, 0xd8, 0x66, 0x08, 0x3c, 0x4d, 0xec, 0xde, 0xa5, 0x18, 0xc0, 0x3b, +0xa3, 0xee, 0x96, 0xac, 0xb3, 0xdd, 0x65, 0x23, 0x51, 0x0e, 0x24, 0x55, +0x05, 0x94, 0x8b, 0x56, 0xad, 0x0d, 0x56, 0x34, 0xca, 0x54, 0xf0, 0x8c, +0x46, 0x1b, 0x05, 0xda, 0x00, 0x21, 0x28, 0x0f, 0x88, 0x86, 0xf2, 0x80, +0x5a, 0x61, 0xf2, 0x41, 0xf9, 0x80, 0x46, 0x29, 0x1f, 0xa5, 0x32, 0xa0, +0x34, 0xa6, 0x5a, 0x61, 0x6d, 0x61, 0x8a, 0xe9, 0xf1, 0xd3, 0xcc, 0xcd, +0xcc, 0x51, 0xa9, 0x5a, 0x52, 0xf4, 0x74, 0x4b, 0x05, 0xc4, 0x72, 0x10, +0x38, 0x00, 0x8d, 0xeb, 0xc5, 0x72, 0x19, 0xce, 0xcd, 0xd6, 0xdf, 0x00, +0x29, 0x23, 0x94, 0x1b, 0x8f, 0xb5, 0x9d, 0x54, 0x51, 0xfb, 0x80, 0x68, +0x19, 0x38, 0x18, 0x5f, 0x48, 0x04, 0xf1, 0x43, 0x8f, 0xcb, 0x8a, 0x15, +0x0e, 0xd4, 0xd3, 0x69, 0xd4, 0xd8, 0x49, 0x34, 0xe2, 0xc5, 0x2a, 0x3d, +0x8f, 0xd7, 0x87, 0x0f, 0x90, 0x0e, 0xfc, 0xe0, 0x49, 0x59, 0x89, 0x2f, +0x34, 0xfd, 0xff, 0xc0, 0x4f, 0xbe, 0xaa, 0xee, 0xc3, 0x69, 0x9a, 0x8f, +0xaf, 0x7f, 0x08, 0x02, 0xb6, 0xa2, 0x65, 0x9c, 0xf0, 0xbf, 0x4b, 0x6f, +0x34, 0x55, 0x00, 0xe0, 0xc7, 0x5f, 0x51, 0x3d, 0x38, 0x77, 0xda, 0x4f, +0xea, 0x3e, 0xf2, 0x43, 0xa4, 0x63, 0x38, 0x9f, 0x3f, 0x98, 0xb6, 0x7c, +0x8d, 0x5a, 0x2a, 0x70, 0xa9, 0xd0, 0x25, 0xff, 0x4f, 0xbe, 0xcb, 0x0a, +0x5c, 0x6c, 0xba, 0xac, 0xc0, 0xc5, 0xa6, 0xff, 0x01, 0x9c, 0xeb, 0xc5, +0xd9, 0xf7, 0xbc, 0x76, 0xb6, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, +0x44, 0xae, 0x42, 0x60, 0x82, +}; diff --git a/Source/Core/DolphinWX/resources/toolbar_fullscreen.xpm b/Source/Core/DolphinWX/resources/toolbar_fullscreen.xpm new file mode 100644 index 0000000000..1d548ea8cb --- /dev/null +++ b/Source/Core/DolphinWX/resources/toolbar_fullscreen.xpm @@ -0,0 +1,132 @@ +/* XPM */ +static char *toolbar_fullscreen_xpm[] = { +/* columns rows colors chars-per-pixel */ +"48 48 78 1", +" c #0EA437", +". c #0EA539", +"X c #3FAD34", +"o c #74BC1D", +"O c #7BBE1D", +"+ c #54B332", +"@ c #64B72E", +"# c #6FBB29", +"$ c #76BD25", +"% c #7BBF24", +"& c #73BD2A", +"* c #7ABF29", +"= c #7EC027", +"- c #7DC02F", +"; c #80C125", +": c #83C32E", +"> c #82C337", +", c #88C537", +"< c #88C53C", +"1 c #8CC742", +"2 c #95CB56", +"3 c #95CC5E", +"4 c #97CD63", +"5 c #98CD62", +"6 c #A3D274", +"7 c #7FC1E3", +"8 c #ACD78D", +"9 c #AED88F", +"0 c #ADD891", +"q c #B0D994", +"w c #B5DC9F", +"e c #B9DDA4", +"r c #BBDEAB", +"t c #BDDFB0", +"y c #BFE0B3", +"u c #C1E1B5", +"i c #C2E2BB", +"p c #80C1E3", +"a c #8BC6E5", +"s c #8FC9E6", +"d c #92CAE7", +"f c #96CCE8", +"g c #9BCEE8", +"h c #9FD0EA", +"j c #A3D2EB", +"k c #ABD6EC", +"l c #AFD8ED", +"z c #B3DAEE", +"x c #B8DCEF", +"c c #B4DBF0", +"v c #BBDEF0", +"b c #BFE0F1", +"n c #D1D0D0", +"m c #C6E3C2", +"M c #CBE6CD", +"N c #C5E9CF", +"B c #D3EBCE", +"V c #DCEECC", +"C c #CDE7D3", +"Z c #CFE8D8", +"A c #D2EFDE", +"S c #D6ECE6", +"D c #D7ECE9", +"F c #DAEDEE", +"G c #C4E2F3", +"H c #CAE6F6", +"J c #D6EBF6", +"K c #DCEFF6", +"L c #D4EBF9", +"P c #DCEFFC", +"I c #DFF0FC", +"U c #E1E0E0", +"Y c #ECF6EC", +"T c #E2F1FD", +"R c #EAF5FA", +"E c #F4FBF7", +"W c #F3F9FD", +"Q c gray100", +/* pixels */ +"nUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUn", +"UQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQU", +"UQWJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJWQU", +"UQT77pppppppppppppppppppppppppppppppppppppp77TQU", +"UQTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTQU", +"UQTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTQU", +"UQTssddddddddddddddddddddddddddddddddddddddssTQU", +"UQTddddddddddddddddddddddddddddddddddddddddddTQU", +"UQRffffffffffffffffffffffffffffffffffffffffffRQU", +"UQRgggggggggggggggggfffgjfgggggggggggggggggggRQU", +"UQRgggggggggggggggggkHHHPcgggggggggggggggggggRQU", +"UQRhhjjjjjjjjjjjjjhjLTTTTTvjjhjjjjjjjjjjjjjhhRQU", +"UQRjjjjjjjjjjjjjjjjkITIIITPPLjjjjjjjjjjjjjjjjRQU", +"UQRjjjjkkkkkkkkkkjjvPIIIIITTTGkjjkkkkkkkkkkjjRQU", +"UQRkkjkjkkkkkkkkkkHTIIIIIIIIIIPHkkkkkkkkkkjkGWQU", +"UQRkkGLGlkkkklkzzlLTIIIIIIIIIITPzkllllllkzGLTWQU", +"UQWHGTTTGzHHvlGPPLLTIIIIIIIIIITPzlzzzzzzlLTTPWQU", +"UQWIIIITLLTTIHPTTTTIIIIIIIIIIIIPGzzzzzzzzLTIPWQU", +"UQWPIIIITTIITTIIIIIIIIIIIIIIIIITTGzxxxxvLPTIPWQU", +"UQWPIIIIIIIIIIIIIIIIIIIIIIIIIIIITGxvvvvbITIIPWQU", +"UQWPIIIIIIIIIIIIIIIIIIIIIIIIIIITPGvvvvvHTIIIPWQU", +"UQWPIIIIIIIIIIIIIIIIIIIIIIIIIIIIIILGGGGPTIIIPWQU", +"UQWPIIIIIIIIIIIIIIIIIIIIIIIIIIIIIITHGPPPIIIIPWQU", +"UQWPIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIPPPTIIIIIPWQU", +"UQWPIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIITTIIIIIIIPWQU", +"UQWPIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIPWQU", +"UQWPIIIIIIIIIIIIITTTTTTTTTTTTTTTTTTTTTIIIIIIPWQU", +"UQWPIIIIIIIITTTTTTKSZMmureeweryimMADKTTTTTTIPWQU", +"UQWPIIIITTTTFCt9621,:=OOOOOOOOOOO;:,126qyCFTTWQU", +"UQWPITTTDi83<=OOOO%%%=============%%%OOOO=<50YQU", +"UQWTTAw4>$oo%%***************************%%ooVQU", +"UQEr3-oo$***********************************$VQU", +"UQVoo$*************************************$$VQU", +"UQV&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&VQU", +"UQV&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&VQU", +"UQV##&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&##VQU", +"UQV@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@VQU", +"UQB++++++++++++++++++++++++++++++++++++++++++BQU", +"UQBXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXBQU", +"UQN ...................................... NQU", +"UQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEQU", +"UQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQU", +"UQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQU", +"UQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQU", +"UQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQU", +"UQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQU", +"UQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQU", +"nUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUn" +}; diff --git a/Source/Core/DolphinWX/resources/toolbar_help.c b/Source/Core/DolphinWX/resources/toolbar_help.c new file mode 100644 index 0000000000..cc0ee5979c --- /dev/null +++ b/Source/Core/DolphinWX/resources/toolbar_help.c @@ -0,0 +1,306 @@ +static const unsigned char toolbar_help_png[] = { +0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, +0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, +0x08, 0x06, 0x00, 0x00, 0x00, 0x57, 0x02, 0xf9, 0x87, 0x00, 0x00, 0x00, +0x04, 0x73, 0x42, 0x49, 0x54, 0x08, 0x08, 0x08, 0x08, 0x7c, 0x08, 0x64, +0x88, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, +0x12, 0x00, 0x00, 0x0b, 0x12, 0x01, 0xd2, 0xdd, 0x7e, 0xfc, 0x00, 0x00, +0x00, 0x25, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, +0x72, 0x65, 0x00, 0x4d, 0x61, 0x63, 0x72, 0x6f, 0x6d, 0x65, 0x64, 0x69, +0x61, 0x20, 0x46, 0x69, 0x72, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, +0x4d, 0x58, 0x20, 0x32, 0x30, 0x30, 0x34, 0x87, 0x76, 0xac, 0xcf, 0x00, +0x00, 0x00, 0x14, 0x74, 0x45, 0x58, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, +0x69, 0x6f, 0x6e, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x00, 0x39, 0x2f, 0x34, +0x2f, 0x30, 0x34, 0x79, 0x5e, 0xa3, 0xd5, 0x00, 0x00, 0x0d, 0x87, 0x49, +0x44, 0x41, 0x54, 0x78, 0x9c, 0xd5, 0x9a, 0x79, 0x8c, 0x5e, 0xd5, 0x79, +0xc6, 0x7f, 0xef, 0x39, 0x77, 0xf9, 0x96, 0xd9, 0xbc, 0x60, 0xb0, 0x01, +0x63, 0xb3, 0x43, 0xb0, 0xec, 0xb6, 0x41, 0xcd, 0x62, 0xc0, 0x04, 0x04, +0xaa, 0x48, 0x30, 0x25, 0x8d, 0x02, 0x6e, 0xab, 0xd8, 0x21, 0xa4, 0x49, +0x93, 0x02, 0x8a, 0xd4, 0x26, 0x55, 0xdb, 0x64, 0xa0, 0x8b, 0x5b, 0x45, +0x6a, 0x9c, 0x45, 0x28, 0x49, 0x17, 0x4c, 0x5a, 0xfa, 0x47, 0x91, 0x5a, +0x20, 0x0d, 0x90, 0x88, 0x76, 0x6c, 0x52, 0xb6, 0x84, 0x80, 0x5d, 0x1b, +0x82, 0xeb, 0x05, 0x0f, 0xe3, 0x05, 0xc6, 0xc6, 0xf6, 0xd8, 0x33, 0xdf, +0x72, 0xef, 0x39, 0xe7, 0xed, 0x1f, 0xf7, 0x7e, 0x9f, 0xc7, 0xe3, 0x05, +0x1b, 0xa2, 0x46, 0x1c, 0xcd, 0xd1, 0x77, 0x46, 0x73, 0xe7, 0xdc, 0xe7, +0x39, 0xcf, 0xf3, 0xbe, 0xe7, 0x3d, 0x67, 0x46, 0x54, 0x95, 0x77, 0x73, +0x33, 0xbf, 0x6c, 0x00, 0xef, 0xb4, 0x45, 0xbf, 0xcc, 0x97, 0xff, 0xe3, +0xc7, 0x7a, 0xa4, 0x33, 0xfe, 0xe4, 0x83, 0xe3, 0x6f, 0xcb, 0x0a, 0xf2, +0x8b, 0xb2, 0xd0, 0x0f, 0x7f, 0x57, 0xe6, 0xa9, 0xb2, 0x24, 0xc0, 0x92, +0x10, 0x98, 0x17, 0x60, 0x61, 0x50, 0x06, 0x82, 0x82, 0x0f, 0x10, 0x94, +0xed, 0x41, 0x19, 0x0e, 0xca, 0x1a, 0xaf, 0xac, 0x77, 0xb6, 0xfe, 0xf0, +0x31, 0xa6, 0x51, 0x38, 0x35, 0x32, 0xef, 0x88, 0xc0, 0xd0, 0x72, 0x19, +0x50, 0xb8, 0x29, 0x28, 0x77, 0xaa, 0xb2, 0x28, 0x28, 0x1c, 0xab, 0xfb, +0xc9, 0xe3, 0xd0, 0x1d, 0x1f, 0xf0, 0xca, 0x23, 0x41, 0xe5, 0x9f, 0x4c, +0x52, 0x5b, 0x5b, 0x82, 0xef, 0x74, 0x00, 0x3d, 0x19, 0x22, 0x6f, 0x9b, +0xc0, 0x93, 0x9f, 0x94, 0x41, 0x2d, 0x80, 0x0f, 0x04, 0xa0, 0x12, 0x43, +0x4f, 0x05, 0xfa, 0x6b, 0x45, 0x60, 0xd5, 0x62, 0xd0, 0x50, 0xf4, 0xcc, +0xc1, 0x78, 0x1b, 0x0e, 0xb6, 0x60, 0x7f, 0x13, 0xf6, 0xb5, 0x21, 0xf3, +0x87, 0xc9, 0x78, 0xe5, 0x49, 0x45, 0xfe, 0x30, 0x4e, 0x6b, 0xeb, 0x4a, +0x02, 0xa1, 0x43, 0xe6, 0xad, 0x48, 0x9c, 0x72, 0x0c, 0x3c, 0x75, 0x9b, +0x2c, 0x01, 0xee, 0x33, 0xc2, 0x3c, 0x63, 0x60, 0x5a, 0x0f, 0xcc, 0x3e, +0xf7, 0x02, 0xaa, 0xf3, 0x3e, 0x80, 0x9d, 0x71, 0x09, 0x26, 0xe9, 0xc3, +0x24, 0x75, 0x70, 0x2d, 0xc8, 0x1b, 0xb8, 0x7d, 0xdb, 0x70, 0xfb, 0x87, +0xe9, 0xdd, 0xb3, 0x95, 0x81, 0xdd, 0x5b, 0x98, 0x93, 0xb5, 0x69, 0x67, +0xb0, 0xb7, 0x09, 0x5b, 0xc7, 0xa0, 0xe1, 0x04, 0x81, 0x2b, 0x83, 0xf2, +0x5c, 0xbb, 0xd5, 0xf8, 0xab, 0xb4, 0x52, 0xfb, 0x73, 0x40, 0x4a, 0x12, +0x1d, 0x22, 0xc7, 0x6d, 0xa7, 0xa4, 0xc0, 0xd3, 0xb7, 0xc9, 0xa0, 0x08, +0x5f, 0x01, 0x98, 0xd1, 0x0f, 0x67, 0x7f, 0xe0, 0x66, 0xd2, 0x4b, 0x6f, +0xc1, 0xf4, 0xce, 0x05, 0xd7, 0x80, 0xbc, 0x59, 0xf4, 0x13, 0x8c, 0x1b, +0x23, 0x1b, 0x18, 0xdb, 0xf6, 0x02, 0xd9, 0xc4, 0x04, 0xde, 0x0b, 0x23, +0x87, 0x60, 0xdb, 0x21, 0x68, 0x97, 0x16, 0x53, 0xe5, 0xc7, 0x62, 0xec, +0xc7, 0x2b, 0x69, 0xfa, 0x26, 0xe0, 0x81, 0x70, 0x22, 0x15, 0x4e, 0x5a, +0x81, 0xa7, 0x6e, 0x93, 0xfb, 0xac, 0xb0, 0x3c, 0x89, 0xe1, 0xbc, 0x85, +0x97, 0xd1, 0x7b, 0xdd, 0x57, 0x31, 0xfd, 0xe7, 0x96, 0xc0, 0x9a, 0x84, +0xfd, 0x9b, 0x71, 0x23, 0x6b, 0xf1, 0x6f, 0xac, 0x23, 0x1c, 0x1a, 0xc5, +0x4d, 0xec, 0x45, 0x3d, 0x84, 0x00, 0xa6, 0x76, 0x3a, 0xb6, 0x3a, 0x93, +0xa8, 0xf7, 0x74, 0x2a, 0x33, 0xe7, 0x52, 0x9b, 0x31, 0x87, 0x83, 0xaf, +0xbd, 0xc4, 0xde, 0xcd, 0x2f, 0x31, 0xa7, 0x0e, 0x03, 0x09, 0x6c, 0xdc, +0x0f, 0x07, 0x1d, 0x28, 0x5c, 0xe1, 0xbd, 0xff, 0x61, 0xb3, 0xd5, 0xbe, +0xbe, 0x5a, 0x49, 0xdf, 0xe4, 0xc8, 0xb8, 0x78, 0x7b, 0x0a, 0xfc, 0xf7, +0x6d, 0x72, 0x9f, 0x11, 0x96, 0xd7, 0x53, 0xb8, 0xe8, 0x23, 0x9f, 0xa1, +0xb2, 0xf8, 0xcb, 0x85, 0x45, 0x5c, 0x0b, 0xbf, 0xe9, 0x5f, 0x71, 0x9b, +0xfe, 0x99, 0xb0, 0x6f, 0x0b, 0x68, 0x01, 0xb8, 0xe3, 0xfd, 0x50, 0x12, +0x50, 0x5f, 0x8c, 0x7d, 0xf9, 0x99, 0xce, 0x98, 0x47, 0xdf, 0xec, 0xf3, +0xf0, 0xcd, 0x71, 0x46, 0x36, 0xbc, 0x80, 0xcb, 0x1d, 0xc1, 0xc3, 0x2b, +0x07, 0x61, 0x77, 0xab, 0x1b, 0xec, 0x1b, 0xac, 0xb5, 0xd7, 0xd5, 0xab, +0xe9, 0x5e, 0xc0, 0x1f, 0x4f, 0x85, 0xb7, 0x54, 0xe0, 0xc9, 0x15, 0x72, +0x9f, 0x31, 0x2c, 0xef, 0xab, 0xc3, 0x45, 0xbf, 0xfd, 0x35, 0xe2, 0x8b, +0x3f, 0x06, 0xae, 0x8d, 0xee, 0xf9, 0x1f, 0xdc, 0xd3, 0x5f, 0x44, 0x0f, +0x6c, 0x42, 0x14, 0x8c, 0x2d, 0x40, 0x1b, 0x0a, 0xe3, 0xa2, 0x20, 0x52, +0x74, 0x2d, 0x3f, 0xa5, 0xfc, 0x61, 0x63, 0xcf, 0x30, 0x87, 0x76, 0x0f, +0xd3, 0x7b, 0xc6, 0x7c, 0xce, 0xbe, 0xf4, 0x52, 0xb6, 0x6f, 0x78, 0x99, +0xe0, 0x3d, 0x17, 0xd4, 0xa1, 0xe9, 0x95, 0x7d, 0x19, 0x00, 0x0b, 0x72, +0xe7, 0xff, 0x0e, 0xf8, 0x2d, 0x4e, 0x10, 0x0b, 0x27, 0xdc, 0x89, 0x87, +0x96, 0xcb, 0x9d, 0x0a, 0xcb, 0x2b, 0x09, 0x5c, 0x78, 0xcb, 0xdf, 0x10, +0x5f, 0x70, 0x23, 0xb8, 0x26, 0x7e, 0xe3, 0x77, 0x71, 0x8f, 0xdd, 0x84, +0x1c, 0xdc, 0x84, 0xb1, 0x74, 0xbb, 0xd8, 0x02, 0xa4, 0x48, 0x31, 0x73, +0x67, 0x2c, 0x02, 0x48, 0x11, 0x99, 0x42, 0x49, 0x0a, 0xd8, 0xb7, 0xf3, +0x55, 0x76, 0x6d, 0xdb, 0xca, 0x9c, 0x73, 0xcf, 0x29, 0x7c, 0x22, 0x70, +0x49, 0x8f, 0x50, 0x39, 0x8c, 0xea, 0xc3, 0xfb, 0x0e, 0x36, 0xee, 0x00, +0xcc, 0xe4, 0x4d, 0x6f, 0x72, 0x3b, 0xae, 0x85, 0x9e, 0xf8, 0x84, 0x2c, +0x32, 0xc2, 0x8b, 0xb1, 0x85, 0x5f, 0xbb, 0xee, 0x46, 0x6a, 0x57, 0xff, +0x25, 0x20, 0xe4, 0x4f, 0xff, 0x09, 0x3a, 0xfc, 0x70, 0x01, 0xb8, 0x04, +0xa8, 0x0a, 0xad, 0x4c, 0xd8, 0x30, 0x92, 0xb0, 0x65, 0x34, 0x66, 0xcf, +0xb8, 0xa5, 0xed, 0x0e, 0xbf, 0x6f, 0x76, 0xaf, 0x63, 0x46, 0xea, 0x79, +0xcf, 0x8c, 0x36, 0x35, 0x13, 0x70, 0x5e, 0xc8, 0x1d, 0x38, 0x07, 0xce, +0x0b, 0x71, 0x52, 0xa5, 0xd2, 0xd3, 0xc3, 0xe8, 0xce, 0x3d, 0x10, 0x60, +0x2c, 0x83, 0xf5, 0x87, 0x14, 0x1f, 0xc0, 0x2b, 0x63, 0x22, 0x72, 0xf9, +0xf4, 0xde, 0xea, 0x96, 0x63, 0xd9, 0xe8, 0xb8, 0x16, 0x52, 0xe5, 0x3e, +0x05, 0x2e, 0x38, 0x6f, 0x36, 0xd5, 0xcb, 0xff, 0x00, 0x5c, 0x93, 0xec, +0x99, 0x7b, 0xd0, 0xe1, 0xff, 0xc0, 0xd8, 0x92, 0xbd, 0x14, 0x2b, 0xff, +0x93, 0x2d, 0x29, 0x4f, 0x6d, 0xae, 0x20, 0xe9, 0x00, 0x0b, 0xae, 0x5d, +0xc6, 0x95, 0xef, 0xbb, 0x81, 0xd3, 0xe7, 0x2f, 0x20, 0xad, 0xf7, 0x75, +0xe7, 0x7b, 0x6d, 0xe3, 0x53, 0x8c, 0x6e, 0xdb, 0xc0, 0xd6, 0xb5, 0x5f, +0xe7, 0x12, 0x36, 0x15, 0xef, 0x28, 0xde, 0x43, 0xa3, 0xd1, 0xc4, 0x05, +0x21, 0x4a, 0x53, 0xb2, 0x66, 0x46, 0x5f, 0xa4, 0xcc, 0x4a, 0x84, 0xdd, +0x6d, 0x05, 0xa5, 0xdf, 0x05, 0xfd, 0x33, 0x60, 0x39, 0xc7, 0xb0, 0xd1, +0x31, 0x15, 0x78, 0xfc, 0x77, 0xe4, 0x13, 0x46, 0x58, 0x3d, 0xbd, 0x07, +0x16, 0xde, 0x7a, 0x0f, 0xf1, 0xdc, 0x2b, 0x71, 0xaf, 0x3e, 0x4e, 0xfe, +0xfc, 0x5f, 0x23, 0x93, 0x2d, 0x63, 0xe0, 0xb1, 0x0d, 0x35, 0x36, 0xee, +0x48, 0xb8, 0x7c, 0xe9, 0x67, 0xb9, 0x62, 0xd9, 0x97, 0x48, 0x6a, 0x7d, +0x47, 0xcd, 0x37, 0xb5, 0xbd, 0xf2, 0xd8, 0xbd, 0x54, 0x1e, 0xff, 0x3c, +0xb9, 0x83, 0xdc, 0x09, 0xce, 0x17, 0x4a, 0x88, 0x58, 0x5c, 0xe6, 0x91, +0xa0, 0x64, 0x1e, 0x9e, 0x3d, 0x58, 0xaa, 0x10, 0x14, 0x55, 0x39, 0xff, +0x8f, 0x9f, 0x08, 0x5b, 0x4f, 0x4a, 0x81, 0x00, 0x83, 0x00, 0xe7, 0x5e, +0x7a, 0x19, 0xf1, 0x19, 0xbf, 0x4a, 0x18, 0xdb, 0x4e, 0xfb, 0x85, 0x6f, +0x22, 0x0a, 0x52, 0xe4, 0x6a, 0x34, 0xc0, 0xc6, 0x9d, 0x09, 0x1b, 0x77, +0x24, 0xdc, 0x70, 0xd7, 0xbd, 0x2c, 0xb8, 0xe6, 0xd6, 0x62, 0x55, 0x0f, +0x0e, 0x93, 0x3f, 0xbf, 0x0a, 0x37, 0xbc, 0x06, 0xbf, 0x6b, 0x1d, 0xc1, +0x83, 0xc6, 0x03, 0xd8, 0xb9, 0x4b, 0xc8, 0xdf, 0xfb, 0x05, 0xa6, 0x5f, +0x74, 0x05, 0x17, 0xff, 0xc6, 0xef, 0xb3, 0xf7, 0x8c, 0xb3, 0xd9, 0xff, +0xf7, 0x4b, 0xcb, 0x1c, 0x29, 0x28, 0xe0, 0x9c, 0x2f, 0xe6, 0x10, 0x43, +0x22, 0x81, 0x19, 0x91, 0x30, 0x9a, 0x29, 0x20, 0x04, 0xf4, 0x0e, 0xe0, +0xce, 0xa9, 0x58, 0x8f, 0x0a, 0xe2, 0xef, 0x2f, 0x93, 0xa5, 0xaa, 0xcc, +0x9b, 0x51, 0x87, 0xfa, 0xfc, 0x2b, 0xc0, 0xb5, 0x68, 0x3d, 0x7f, 0x2f, +0xda, 0x9e, 0xe8, 0x02, 0xef, 0xa4, 0xc5, 0x9f, 0x6d, 0x4f, 0x59, 0x70, +0xcd, 0xb2, 0x2e, 0x78, 0xff, 0xd2, 0xfd, 0xb4, 0x57, 0x2f, 0x22, 0xff, +0xe9, 0x2a, 0xc2, 0xee, 0x75, 0xc5, 0xb3, 0x0a, 0xa1, 0x79, 0x80, 0xec, +0xe5, 0x87, 0xf0, 0xab, 0xaf, 0xe4, 0x67, 0x0f, 0xae, 0x04, 0x60, 0xe6, +0xaf, 0x7c, 0x84, 0xde, 0x5f, 0x5f, 0x0e, 0xe5, 0x82, 0x04, 0x04, 0xc5, +0xa0, 0x65, 0x60, 0xa9, 0x18, 0x66, 0xc6, 0x9d, 0x0c, 0x00, 0x28, 0x4b, +0x8f, 0x15, 0xc8, 0x47, 0x11, 0x50, 0x58, 0xae, 0x0a, 0xa7, 0x0d, 0xd4, +0x48, 0xcf, 0x7e, 0x1f, 0x6e, 0xf7, 0x8b, 0xe4, 0x3b, 0x7f, 0xd2, 0x05, +0x1f, 0x26, 0xe5, 0xf8, 0x3d, 0xe3, 0x96, 0xcb, 0x97, 0x7e, 0xb6, 0x50, +0x6d, 0x6c, 0x98, 0x6d, 0xff, 0xf2, 0x29, 0x7c, 0xf3, 0x40, 0x17, 0x78, +0xa7, 0x33, 0x49, 0xb5, 0x3d, 0x8f, 0xde, 0xc3, 0xe8, 0xab, 0x1b, 0x01, +0x98, 0xf6, 0xa1, 0x3b, 0x8b, 0xdd, 0x97, 0x22, 0xd7, 0x86, 0x12, 0x78, +0x41, 0xc2, 0x30, 0x23, 0x12, 0x8c, 0x08, 0x22, 0x82, 0xc2, 0x39, 0x3b, +0xf6, 0x4e, 0x2c, 0x3a, 0x21, 0x81, 0x7f, 0xbb, 0x45, 0x06, 0x82, 0x72, +0x53, 0x1c, 0xc1, 0xf4, 0x39, 0xe7, 0x83, 0x6b, 0xd1, 0x7e, 0x75, 0xe8, +0x08, 0xe0, 0x93, 0xc7, 0x00, 0xb3, 0xe6, 0x5f, 0x06, 0xc0, 0xe6, 0xb5, +0x0f, 0xf0, 0x83, 0xad, 0x67, 0xf2, 0xa2, 0x5c, 0x7f, 0xd4, 0xf3, 0x53, +0x89, 0xfc, 0xef, 0xb3, 0x3f, 0x00, 0x20, 0x3d, 0x6b, 0x61, 0x37, 0x90, +0x15, 0x83, 0x88, 0x01, 0xb1, 0x88, 0xb1, 0x60, 0x2d, 0xd6, 0x1a, 0x7a, +0xad, 0xe9, 0x46, 0x6e, 0x80, 0xa5, 0x27, 0x24, 0xa0, 0xca, 0x55, 0xaa, +0xd0, 0x13, 0x43, 0x34, 0x7d, 0x3e, 0xda, 0xdc, 0x4f, 0x6b, 0xfb, 0xd3, +0x47, 0xee, 0xac, 0x93, 0xfa, 0xc5, 0xb3, 0xb2, 0xee, 0xef, 0xfa, 0x9e, +0xf9, 0x5c, 0x73, 0xfb, 0x4a, 0x16, 0xff, 0xd1, 0xe3, 0xa4, 0x1f, 0x5e, +0x7d, 0x18, 0xfc, 0x14, 0x22, 0x5b, 0xc6, 0x92, 0x23, 0x00, 0x84, 0x20, +0x85, 0x7d, 0xc4, 0xa0, 0x62, 0xc1, 0x46, 0x88, 0x8d, 0x11, 0xb1, 0x88, +0x58, 0x2a, 0x46, 0x90, 0x32, 0x46, 0x80, 0x85, 0x27, 0x24, 0x10, 0xca, +0x9a, 0xbe, 0x2f, 0x81, 0xa8, 0xe7, 0x34, 0xb2, 0xd7, 0x5f, 0x3a, 0xbc, +0x9a, 0x9e, 0xa3, 0x88, 0x7c, 0x70, 0x6e, 0x93, 0xad, 0x3f, 0x7e, 0x00, +0x80, 0x4b, 0x3f, 0x74, 0x2b, 0x17, 0xbe, 0xff, 0x06, 0x00, 0x24, 0x1d, +0xe8, 0xd6, 0x41, 0x9d, 0xdf, 0x69, 0x3b, 0xe1, 0x3f, 0x77, 0xd4, 0x99, +0x70, 0x86, 0x05, 0xd7, 0x2c, 0x03, 0xa0, 0x35, 0xb2, 0xbe, 0x78, 0x06, +0x5b, 0xd8, 0xc6, 0x44, 0x88, 0x8d, 0x90, 0x28, 0x46, 0xa2, 0x08, 0x31, +0x86, 0xde, 0xc8, 0x80, 0x74, 0xf3, 0xe7, 0xc0, 0x89, 0x15, 0x80, 0x25, +0x41, 0x21, 0x16, 0x48, 0xfa, 0x67, 0x93, 0x8d, 0x6e, 0x3e, 0xc2, 0x36, +0x1d, 0xe0, 0x9d, 0x20, 0x8e, 0x51, 0x4e, 0x7b, 0xe6, 0xf3, 0x34, 0xb7, +0x3d, 0x59, 0x58, 0xa2, 0xd6, 0x87, 0xb6, 0xc6, 0x68, 0xfc, 0xd7, 0xe0, +0x11, 0xe0, 0x37, 0xed, 0x4f, 0x78, 0x70, 0x4b, 0x1f, 0xa3, 0x3a, 0x93, +0x8f, 0xfe, 0xe9, 0x03, 0xf4, 0xcf, 0x3a, 0x1b, 0x80, 0x7d, 0x4f, 0xdd, +0x4f, 0xa0, 0x50, 0x00, 0xb1, 0x18, 0x6b, 0x31, 0x51, 0x8c, 0x89, 0x22, +0xc4, 0x94, 0x56, 0x12, 0x41, 0xb5, 0xcb, 0x60, 0xc9, 0x54, 0x02, 0x47, +0xa4, 0xd1, 0xa0, 0x0c, 0x08, 0x50, 0xb5, 0x80, 0x6b, 0x91, 0x1f, 0xd8, +0x49, 0x08, 0xe5, 0xf6, 0xaf, 0xe5, 0xce, 0xab, 0x47, 0x96, 0x06, 0x7e, +0xfc, 0x00, 0x7e, 0xf5, 0x55, 0x64, 0x67, 0x2c, 0xc2, 0x54, 0x06, 0xc8, +0xb6, 0xad, 0xe9, 0x06, 0xec, 0xae, 0xf1, 0x88, 0xe7, 0x5e, 0xaf, 0xb2, +0xaf, 0x65, 0x59, 0x70, 0xcd, 0x32, 0xae, 0xbd, 0x7d, 0x65, 0x77, 0x73, +0x6b, 0x8d, 0xac, 0xe7, 0xf5, 0x1f, 0x7d, 0x83, 0x10, 0x2c, 0x6a, 0x0d, +0x18, 0x8b, 0xd8, 0x08, 0x63, 0x23, 0xac, 0x08, 0x6a, 0x02, 0x2a, 0xbe, +0xfb, 0xa2, 0xe3, 0x95, 0x9c, 0x53, 0x09, 0x2c, 0x32, 0x02, 0x56, 0x80, +0xbc, 0x49, 0x6b, 0xcf, 0x08, 0xc6, 0x14, 0xd2, 0x50, 0x7e, 0xea, 0x94, +0xda, 0xa6, 0xd3, 0xfc, 0xce, 0x75, 0xdd, 0x20, 0x45, 0xe1, 0x85, 0xd1, +0x0a, 0x2f, 0xee, 0xa9, 0x30, 0x77, 0xc1, 0x62, 0x6e, 0xba, 0x7d, 0x65, +0x37, 0xd8, 0x01, 0xc6, 0xd7, 0x3d, 0xc2, 0xf0, 0x3f, 0xac, 0x28, 0x4e, +0x64, 0x08, 0x5a, 0x06, 0xae, 0xb1, 0x31, 0x36, 0x8a, 0x8b, 0x82, 0xd0, +0x7a, 0x10, 0xd3, 0xad, 0x9b, 0x8e, 0xc7, 0x60, 0x2a, 0x81, 0x62, 0xf5, +0x7c, 0xa1, 0x80, 0x86, 0xa2, 0x0c, 0xec, 0x2a, 0xd0, 0x01, 0x7e, 0x0c, +0x02, 0x9d, 0x97, 0xa8, 0xc2, 0x73, 0xaf, 0x57, 0x79, 0x79, 0x7f, 0xca, +0xe2, 0x65, 0x5f, 0x62, 0xf1, 0xad, 0x5f, 0xec, 0x3e, 0xd3, 0xda, 0xbc, +0x96, 0x3d, 0x8f, 0xdc, 0xcd, 0xd8, 0xcf, 0xd7, 0xd2, 0xf6, 0x42, 0x50, +0x43, 0x30, 0xa6, 0xb0, 0x4b, 0x09, 0xde, 0x46, 0x11, 0x26, 0x14, 0x72, +0x7b, 0x84, 0x56, 0x27, 0x8b, 0x9d, 0xa4, 0x02, 0x18, 0x81, 0xa0, 0x02, +0xae, 0x45, 0x50, 0x41, 0x3a, 0x16, 0x42, 0x8f, 0x28, 0x8f, 0x8f, 0x47, +0x60, 0x3c, 0x33, 0xbc, 0xbc, 0x3f, 0xe5, 0xda, 0xdb, 0x57, 0xf2, 0xde, +0x1b, 0x3f, 0xd3, 0x05, 0x3e, 0xfa, 0xbd, 0x15, 0xb4, 0x46, 0xb7, 0x93, +0x7b, 0xc1, 0x79, 0xc1, 0xa9, 0xe0, 0xd5, 0x10, 0x24, 0x22, 0xb2, 0x31, +0x51, 0x7c, 0x98, 0x80, 0x38, 0x87, 0x22, 0x18, 0x85, 0x86, 0x87, 0x70, +0xb8, 0xdc, 0x59, 0xf7, 0x96, 0x04, 0x44, 0x84, 0x56, 0x2e, 0xb4, 0xf6, +0x8e, 0x40, 0x30, 0x65, 0x81, 0xaf, 0xc5, 0x76, 0x2f, 0xe5, 0xa6, 0xdf, +0x21, 0x32, 0x65, 0x32, 0x55, 0x18, 0x3e, 0x14, 0xd3, 0x3f, 0x6b, 0x6e, +0x17, 0xfc, 0xf8, 0xb3, 0xf7, 0x33, 0x7a, 0xff, 0x0a, 0xbc, 0x07, 0x17, +0x84, 0x3c, 0x40, 0x1e, 0xc0, 0x63, 0x50, 0x13, 0x61, 0x6c, 0x8c, 0x89, +0x13, 0xa2, 0x24, 0x25, 0x8a, 0x13, 0x22, 0x31, 0xa8, 0x0f, 0x84, 0x72, +0x83, 0xd8, 0xe7, 0x94, 0x49, 0xf5, 0xda, 0x81, 0xa9, 0x04, 0xa6, 0xa6, +0xd1, 0x35, 0x8a, 0xd0, 0x74, 0x42, 0x36, 0xf6, 0x66, 0x91, 0xde, 0x88, +0x08, 0x6a, 0x09, 0x18, 0x82, 0x0a, 0x5e, 0x05, 0xef, 0xc1, 0xbb, 0xe2, +0x84, 0xd5, 0xed, 0xe5, 0xf7, 0x2d, 0x27, 0xdd, 0x74, 0x0a, 0xf0, 0xe6, +0xf7, 0xef, 0x26, 0x77, 0x90, 0x79, 0x21, 0xf3, 0x65, 0xf1, 0x86, 0x25, +0x48, 0x84, 0xda, 0x18, 0x1b, 0x57, 0x88, 0xd3, 0x94, 0x38, 0x49, 0x89, +0xe3, 0x18, 0x63, 0x2c, 0x52, 0xde, 0x4b, 0x4c, 0xe4, 0x5a, 0xac, 0xfe, +0xe1, 0x95, 0x5a, 0xf3, 0x56, 0x0a, 0x1c, 0x08, 0x0a, 0x07, 0x9c, 0x61, +0xfc, 0x8d, 0x5d, 0x24, 0xf5, 0x7e, 0xb2, 0x66, 0x83, 0xee, 0x8c, 0x21, +0xa0, 0xc1, 0x13, 0xca, 0xca, 0x65, 0x6a, 0x53, 0x85, 0x99, 0xb1, 0x27, +0xf4, 0x1c, 0xae, 0x48, 0x1b, 0x6f, 0x6c, 0xc7, 0x07, 0xc1, 0x05, 0xc8, +0xd5, 0x90, 0x63, 0x08, 0xc4, 0x60, 0x63, 0xa2, 0xa4, 0x4a, 0x5c, 0xa9, +0x92, 0xa4, 0x55, 0xe2, 0x24, 0xc5, 0x1a, 0x83, 0x66, 0x39, 0x1a, 0x02, +0x78, 0xcf, 0xee, 0xcc, 0xe3, 0x83, 0x3f, 0xa1, 0x85, 0xa6, 0x2a, 0xb0, +0xde, 0x2b, 0x8c, 0xe5, 0x42, 0x7b, 0xa2, 0x05, 0x2a, 0x88, 0x49, 0xc0, +0xa6, 0x60, 0x52, 0xd4, 0x24, 0x04, 0x49, 0x50, 0x8d, 0xf0, 0xc1, 0xe2, +0x82, 0xc1, 0x39, 0x21, 0x77, 0x42, 0x9e, 0x0b, 0xce, 0x09, 0xd3, 0xac, +0xe3, 0xcc, 0x1d, 0x3f, 0x22, 0x34, 0xc7, 0x68, 0x8d, 0xac, 0x27, 0x73, +0x42, 0x16, 0x0c, 0xb9, 0x5a, 0x1c, 0x11, 0x6a, 0x12, 0x24, 0x4e, 0x88, +0xd3, 0x1a, 0x49, 0xb5, 0x46, 0x5a, 0xad, 0x93, 0x56, 0xaa, 0xc4, 0x49, +0x82, 0x35, 0x16, 0x09, 0x8a, 0x3a, 0x4f, 0xc8, 0x3d, 0x3b, 0x32, 0x4f, +0xe8, 0x64, 0x96, 0x93, 0x51, 0x00, 0x31, 0x0f, 0x05, 0xe5, 0x2b, 0xfb, +0xbd, 0xe0, 0x82, 0x21, 0xcf, 0x3d, 0xd8, 0x42, 0xd6, 0xd0, 0x39, 0xb1, +0x93, 0xa3, 0xe4, 0xa8, 0x77, 0x04, 0x0d, 0x04, 0xf5, 0xc5, 0x61, 0xbe, +0xf4, 0x6c, 0x3b, 0x08, 0xaf, 0x3c, 0xff, 0x0c, 0x2f, 0xac, 0x98, 0xcd, +0x99, 0xa9, 0x47, 0x24, 0x2a, 0xfd, 0x6e, 0xc1, 0x94, 0x69, 0x32, 0xa9, +0x10, 0xa7, 0x15, 0xd2, 0x6a, 0xad, 0x00, 0x1f, 0xc7, 0x88, 0x2a, 0x21, +0xcf, 0x08, 0xb9, 0x23, 0x64, 0x39, 0x3b, 0xda, 0x39, 0x2d, 0xef, 0x08, +0x3e, 0x74, 0xb4, 0x7e, 0x68, 0x70, 0x48, 0xc7, 0x4e, 0xa8, 0xc0, 0xa7, +0x1f, 0xf6, 0xeb, 0x42, 0x60, 0x38, 0x04, 0x65, 0x57, 0x0b, 0x9c, 0x13, +0x90, 0x18, 0x89, 0x52, 0x4c, 0x5c, 0xc3, 0x26, 0x35, 0x4c, 0x5a, 0x47, +0x92, 0x1a, 0x44, 0x55, 0xd4, 0x54, 0x50, 0x5b, 0xc1, 0x4b, 0x42, 0x90, +0x18, 0x47, 0xcc, 0x4f, 0xc7, 0xea, 0x6c, 0xe3, 0x74, 0x7a, 0xaf, 0xbd, +0x8b, 0xfc, 0xaa, 0x2f, 0x20, 0xbd, 0xb3, 0x20, 0xae, 0x20, 0x49, 0x0d, +0x5b, 0xad, 0x11, 0xd7, 0x7a, 0xa9, 0xf6, 0xf4, 0x52, 0xeb, 0xe9, 0xa3, +0x5a, 0xef, 0x21, 0xad, 0x54, 0xb0, 0x36, 0x2a, 0xce, 0x19, 0xb9, 0xc3, +0xb7, 0x33, 0xf2, 0x56, 0xc6, 0xd6, 0xa6, 0xc3, 0xfb, 0x30, 0x39, 0x80, +0x57, 0x1f, 0xe5, 0xd9, 0xa3, 0x14, 0x00, 0x14, 0x79, 0xd8, 0x07, 0xbd, +0x63, 0x67, 0x5b, 0x99, 0xe3, 0x15, 0xab, 0x02, 0x12, 0x61, 0xe2, 0xb8, +0x48, 0x3d, 0x21, 0x20, 0x3e, 0xc7, 0x59, 0x87, 0xfa, 0x42, 0x09, 0xf1, +0x1e, 0x2d, 0x2f, 0x3c, 0xf7, 0xe5, 0xca, 0xb2, 0x7b, 0x1e, 0x60, 0xee, +0x65, 0x1f, 0x04, 0xe0, 0xd0, 0xe6, 0x1b, 0xd9, 0xfc, 0xcd, 0x8f, 0x23, +0x51, 0x5c, 0x64, 0x9a, 0x24, 0x25, 0x49, 0x8b, 0xc0, 0x8d, 0xa2, 0x18, +0x01, 0xd4, 0x39, 0x7c, 0x96, 0xe3, 0x5a, 0x2d, 0x42, 0xb3, 0xc5, 0xcf, +0x27, 0x32, 0x1a, 0x2e, 0x9f, 0x4c, 0x60, 0xfb, 0xe0, 0x90, 0x1e, 0xeb, +0x32, 0xf8, 0x68, 0x02, 0x62, 0xec, 0x2a, 0x1f, 0xc2, 0x1d, 0x2d, 0x17, +0x78, 0xad, 0x11, 0x38, 0x3f, 0x51, 0x54, 0x05, 0x31, 0x51, 0x51, 0xa7, +0x88, 0x10, 0x54, 0x91, 0xc4, 0x61, 0x5c, 0x8e, 0x71, 0x0e, 0xe7, 0x3c, +0x12, 0x3c, 0xa2, 0xca, 0x8c, 0xea, 0x44, 0x17, 0x3c, 0x40, 0xef, 0x05, +0xef, 0xa7, 0xd2, 0xdb, 0x8f, 0x4d, 0x12, 0xa2, 0x38, 0x21, 0x4e, 0xd2, +0x22, 0xe7, 0xdb, 0x08, 0x50, 0x42, 0x96, 0x13, 0xda, 0x19, 0xae, 0xd1, +0xc4, 0x35, 0x9a, 0x8c, 0x4c, 0xb4, 0xd8, 0xd5, 0xce, 0x70, 0xb9, 0x27, +0x84, 0xae, 0x7d, 0x06, 0x8f, 0x05, 0xfe, 0x28, 0x0b, 0x01, 0xfc, 0xde, +0xa7, 0x3f, 0xb5, 0xdd, 0x07, 0xfd, 0x5e, 0xe6, 0x3c, 0x23, 0x4d, 0xc7, +0xfe, 0x66, 0x8e, 0xcf, 0x5d, 0x71, 0xc5, 0x2c, 0x06, 0x13, 0xa7, 0x44, +0x95, 0x1a, 0x49, 0xbd, 0x8f, 0xb4, 0x77, 0x80, 0xb4, 0x6f, 0x1a, 0xd5, +0xfe, 0x69, 0x54, 0xfa, 0x8a, 0xbe, 0xf8, 0xc2, 0x39, 0xec, 0xdb, 0xfc, +0x5c, 0x77, 0xbe, 0xd6, 0x6b, 0x2f, 0xd2, 0x33, 0x30, 0x9d, 0x7a, 0xdf, +0x00, 0xb5, 0xde, 0x3e, 0x2a, 0xb5, 0x3a, 0x49, 0x92, 0x62, 0x44, 0xc0, +0xf9, 0xc2, 0x32, 0x13, 0x0d, 0xdc, 0xc4, 0x04, 0xaf, 0x8f, 0x37, 0x78, +0x79, 0xa2, 0x4d, 0x96, 0xe5, 0x78, 0xef, 0x3b, 0xab, 0xbf, 0x6e, 0x70, +0x48, 0xef, 0x3f, 0x1e, 0x81, 0x63, 0x1e, 0xea, 0xbf, 0x73, 0x73, 0xed, +0xdc, 0x3c, 0xcf, 0x5f, 0x48, 0xe2, 0xb8, 0xbf, 0xa7, 0x5a, 0x61, 0x61, +0x7f, 0x8d, 0xde, 0xde, 0x3a, 0x51, 0xbd, 0x4e, 0x94, 0x56, 0x31, 0x69, +0x82, 0xd8, 0x42, 0x3c, 0xa5, 0xd8, 0x29, 0x55, 0xb5, 0xbb, 0xe5, 0x9b, +0x4a, 0x2f, 0xd5, 0x4b, 0xaf, 0x47, 0x44, 0x68, 0x6e, 0x7a, 0x02, 0xc9, +0x5b, 0x88, 0x31, 0x48, 0x79, 0x07, 0xa3, 0xbe, 0x04, 0xde, 0x6c, 0x92, +0x8f, 0x4f, 0x90, 0x8f, 0x8f, 0xb3, 0xfb, 0xe0, 0x38, 0xeb, 0xc7, 0x9a, +0xb4, 0xda, 0x2d, 0xb2, 0xcc, 0xe1, 0x43, 0xd7, 0x3e, 0x8b, 0x06, 0x87, +0x74, 0xfd, 0x29, 0x11, 0xe0, 0xd1, 0xcf, 0xc9, 0x37, 0xee, 0xfd, 0xee, +0x5d, 0x22, 0xf2, 0xb7, 0x95, 0x24, 0xa1, 0xde, 0x25, 0xd1, 0x43, 0x5c, +0xab, 0x63, 0xab, 0x15, 0x6c, 0x92, 0x16, 0x35, 0xbb, 0xb5, 0x80, 0x14, +0x35, 0x48, 0x77, 0x77, 0x90, 0xf2, 0x6b, 0xf2, 0x99, 0x56, 0x09, 0xde, +0x13, 0x5c, 0x19, 0xa8, 0x8d, 0x06, 0x6e, 0xa2, 0x41, 0x3e, 0x3e, 0xce, +0xd6, 0x83, 0x0d, 0x36, 0x8f, 0x37, 0x69, 0xb5, 0x8b, 0xd5, 0x0f, 0x3e, +0x74, 0x72, 0xff, 0x5d, 0x83, 0x43, 0xfa, 0xf5, 0xe3, 0x81, 0x3f, 0x3e, +0x81, 0x92, 0xc4, 0xaa, 0x6f, 0x7d, 0xe7, 0x21, 0x6b, 0xed, 0x8d, 0x69, +0x9a, 0xd0, 0x53, 0xa9, 0xf0, 0x9e, 0xbe, 0x1a, 0x03, 0x3d, 0x75, 0xa2, +0x5a, 0x8d, 0xa8, 0x5a, 0xc1, 0xa6, 0x15, 0x4c, 0x1c, 0x23, 0xd6, 0x22, +0xc6, 0x94, 0xd5, 0x63, 0x59, 0xfe, 0x6a, 0x07, 0x77, 0xb1, 0xe2, 0xc1, +0x39, 0x7c, 0xee, 0xf0, 0xad, 0x16, 0x79, 0xb3, 0x85, 0x6b, 0x4c, 0x70, +0x68, 0xbc, 0xc1, 0xcb, 0x07, 0x9b, 0xec, 0x69, 0x36, 0x69, 0xb7, 0x32, +0x72, 0xe7, 0xbb, 0xd6, 0x51, 0x58, 0x3d, 0x38, 0xa4, 0x2b, 0x4e, 0x04, +0xfe, 0xc4, 0x04, 0x80, 0x6f, 0x7f, 0xb4, 0x77, 0x5a, 0xa3, 0xd1, 0x1c, +0xb2, 0xd6, 0x2e, 0x4c, 0xd2, 0x98, 0x6a, 0x9a, 0x72, 0x4e, 0xbd, 0xca, +0x59, 0x3d, 0x35, 0xd2, 0x5a, 0x15, 0x5b, 0xa9, 0x10, 0xa5, 0x29, 0x26, +0x4e, 0xca, 0x43, 0x88, 0xa1, 0xa8, 0xbf, 0x41, 0x83, 0xa2, 0x21, 0x10, +0x82, 0x27, 0xe4, 0x0e, 0x9f, 0x65, 0xf8, 0x76, 0x1b, 0xd7, 0x6a, 0xd1, +0x98, 0x68, 0x32, 0x3c, 0xd1, 0x62, 0x64, 0xa2, 0x45, 0xb3, 0xdd, 0x26, +0x6b, 0xe7, 0xe4, 0x9d, 0x9c, 0x7f, 0x0a, 0xe0, 0xdf, 0x92, 0x00, 0xc0, +0xbd, 0x37, 0xf7, 0x4e, 0x9b, 0x68, 0x34, 0x87, 0x22, 0x6b, 0x16, 0xc6, +0x51, 0x4c, 0x92, 0xc4, 0xf4, 0x54, 0x53, 0xce, 0xaa, 0x56, 0x99, 0x55, +0x4d, 0xa9, 0xa4, 0x29, 0x36, 0x2d, 0x09, 0x44, 0x51, 0x79, 0x30, 0x2f, +0x08, 0x04, 0xef, 0x8b, 0x14, 0x99, 0x67, 0xf8, 0x76, 0xc6, 0xfe, 0x56, +0xc6, 0x68, 0xb3, 0xcd, 0x8e, 0x46, 0xbb, 0x6b, 0x97, 0xdc, 0x39, 0x9c, +0x2f, 0x76, 0xdc, 0x12, 0xcb, 0x49, 0x83, 0x3f, 0x29, 0x02, 0x00, 0xdf, +0xfa, 0xcd, 0xde, 0x69, 0x8d, 0x46, 0xe3, 0xdf, 0x8d, 0x98, 0xab, 0xa2, +0xc8, 0x12, 0xc5, 0x31, 0x69, 0x5c, 0x90, 0x99, 0x9e, 0xc6, 0xf4, 0xc7, +0x31, 0xfd, 0x71, 0x44, 0x6a, 0x2d, 0xb1, 0x29, 0x3c, 0x9f, 0xab, 0xd2, +0xf6, 0x81, 0xf1, 0xdc, 0x73, 0x20, 0xcb, 0x79, 0xb3, 0xed, 0x68, 0xe4, +0x39, 0x59, 0x9e, 0x93, 0x67, 0x79, 0xd7, 0x2e, 0x3e, 0x04, 0x74, 0x52, +0xba, 0x1c, 0x1c, 0xd2, 0xbb, 0x4f, 0x16, 0xfc, 0x49, 0x13, 0x00, 0xe0, +0xd1, 0xcf, 0xc9, 0xca, 0xaf, 0x7d, 0x7b, 0x50, 0x84, 0x2f, 0x5b, 0x53, +0x5c, 0x79, 0xd8, 0x28, 0x22, 0xb2, 0x96, 0x28, 0xb2, 0x58, 0x6b, 0x31, +0xc6, 0x74, 0x83, 0x56, 0x55, 0xf1, 0x41, 0xf1, 0xde, 0xe3, 0xbc, 0xc7, +0x3b, 0x7f, 0x18, 0xb4, 0x0f, 0x84, 0x50, 0x06, 0x6a, 0x61, 0x99, 0xed, +0xc0, 0xf2, 0xc1, 0x21, 0x5d, 0x7b, 0x2a, 0xe0, 0x4f, 0x8d, 0x40, 0xd9, +0xfe, 0xe2, 0x5a, 0xbb, 0x48, 0x55, 0x57, 0x19, 0x23, 0x57, 0x19, 0x63, +0x30, 0x62, 0x30, 0x46, 0x8a, 0x34, 0x49, 0x71, 0x09, 0x05, 0x9d, 0x8b, +0x5b, 0x2d, 0x80, 0x86, 0x40, 0x08, 0xda, 0x05, 0xad, 0xda, 0xb5, 0xcb, +0x01, 0x60, 0xd5, 0xa9, 0xae, 0xfa, 0x3b, 0x22, 0xd0, 0x69, 0x83, 0x57, +0xcb, 0x55, 0x46, 0x64, 0x85, 0x18, 0x59, 0x2a, 0x22, 0x03, 0x66, 0x0a, +0x01, 0x80, 0xa0, 0xa1, 0x4b, 0xa2, 0x58, 0xec, 0x2e, 0xf0, 0x75, 0xc0, +0x2a, 0x8e, 0x53, 0xa0, 0xfd, 0xbf, 0x10, 0x98, 0xdc, 0x06, 0xaf, 0x96, +0xa5, 0xc0, 0x22, 0x8a, 0x6b, 0x8f, 0x79, 0x65, 0xef, 0xb4, 0x03, 0x14, +0x80, 0xb7, 0x53, 0x94, 0xc3, 0x6b, 0x06, 0x87, 0x74, 0xf8, 0x1d, 0xbf, +0xb4, 0x6c, 0xbf, 0xb0, 0xbf, 0xd4, 0xff, 0xb2, 0xda, 0xbb, 0xfe, 0x9f, +0x3d, 0xde, 0xf5, 0x04, 0xfe, 0x0f, 0x54, 0x13, 0xec, 0xcc, 0x99, 0x7c, +0x3d, 0x8f, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, +0x60, 0x82, +}; diff --git a/Source/Core/DolphinWX/resources/toolbar_help.xpm b/Source/Core/DolphinWX/resources/toolbar_help.xpm new file mode 100644 index 0000000000..4f6a4a5c09 --- /dev/null +++ b/Source/Core/DolphinWX/resources/toolbar_help.xpm @@ -0,0 +1,283 @@ +/* XPM */ +static char *toolbar_help_xpm[] = { +/* columns rows colors chars-per-pixel */ +"48 48 229 2", +" c #121F74", +". c #0F2276", +"X c #062D7C", +"o c #092D7C", +"O c #132376", +"+ c #192677", +"@ c #152678", +"# c #192678", +"$ c #132D7C", +"% c #1C2E7D", +"& c #04307F", +"* c #08317F", +"= c #16317F", +"- c #232F7E", +"; c #292D7E", +": c #362F7F", +"> c #22317E", +", c #012F83", +"< c #0A2E81", +"1 c #023483", +"2 c #093384", +"3 c #00398A", +"4 c #163C87", +"5 c #143D8A", +"6 c #013F90", +"7 c #233482", +"8 c #2B3581", +"9 c #2D3D87", +"0 c #223C88", +"q c #293F88", +"w c #373784", +"e c #303C86", +"r c #473E89", +"t c #00408D", +"y c #0E4089", +"u c #03488F", +"i c #16438B", +"p c #014493", +"a c #014B94", +"s c #0B4D92", +"d c #004F9A", +"f c #134F93", +"g c #055097", +"h c #0B5094", +"j c #01559C", +"k c #00589E", +"l c #085A9E", +"z c #125094", +"x c #115698", +"c c #22458D", +"v c #2C448B", +"b c #2D4A8F", +"n c #33478D", +"m c #3B448B", +"M c #35498F", +"N c #224F95", +"B c #255596", +"V c #2A5194", +"C c #245C9D", +"Z c #2C5E9D", +"A c #395495", +"S c #375798", +"D c #355A9A", +"F c #3A5B9A", +"G c #2D619E", +"H c #3E639E", +"J c #005CA3", +"K c #0D5EA1", +"L c #0262A6", +"P c #0065AB", +"I c #0069AE", +"U c #1563A5", +"Y c #1C66A5", +"T c #1F68A6", +"R c #176BAB", +"E c #0064B2", +"W c #006DB2", +"Q c #106FB0", +"! c #0071B6", +"~ c #0C73B5", +"^ c #0074B9", +"/ c #1273B3", +"( c #1C79B6", +") c #2666A3", +"_ c #2C65A2", +"` c #2569A6", +"' c #2A6AA6", +"] c #266EA9", +"[ c #2C6EA9", +"{ c #3567A2", +"} c #3A65A1", +"| c #336BA5", +" . c #3A69A3", +".. c #336EA8", +"X. c #2C71AA", +"o. c #3373AB", +"O. c #3579AF", +"+. c #3D79AF", +"@. c #2176B2", +"#. c #297DB7", +"$. c #207FBB", +"%. c #3577B0", +"&. c #347AB2", +"*. c #3D7CB2", +"=. c #4F4A91", +"-. c #5B4E92", +";. c #435495", +":. c #465E9B", +">. c #4A5D9B", +",. c #555597", +"<. c #644E91", +"1. c #665898", +"2. c #43629E", +"3. c #49609D", +"4. c #55639E", +"5. c #4165A0", +"6. c #4B6DA5", +"7. c #566FA7", +"8. c #5A6BA4", +"9. c #536FAA", +"0. c #5670A7", +"q. c #5778AC", +"w. c #427CB1", +"e. c #517EB0", +"r. c #6E69A3", +"t. c #6B76AA", +"y. c #7174A9", +"u. c #8272A7", +"i. c #8476AA", +"p. c #8872A8", +"a. c #2580BB", +"s. c #2C83BD", +"d. c #3386BD", +"f. c #3488BF", +"g. c #398ABF", +"h. c #4585B7", +"j. c #4884B7", +"k. c #448BBD", +"l. c #488DBF", +"z. c #5282B3", +"x. c #5B81B1", +"c. c #5688B7", +"v. c #5488B8", +"b. c #7C89B6", +"n. c #738DB8", +"m. c #6091BD", +"M. c #348AC0", +"N. c #3692C8", +"B. c #3E95C9", +"V. c #428DC1", +"C. c #569ECA", +"Z. c #6295C0", +"A. c #679AC4", +"S. c #729CC5", +"D. c #7C9BC2", +"F. c #60A3CE", +"G. c #7DACCF", +"H. c #6CA7D1", +"J. c #6FABD3", +"K. c #8F84B4", +"L. c #998AB7", +"P. c #9B8FB9", +"I. c #A397BE", +"U. c #83ACCE", +"Y. c #8FAFCE", +"T. c #94A7C9", +"R. c #9DA7C9", +"E. c #97AECE", +"W. c #9BABCB", +"Q. c #92B4D2", +"!. c #93BFDC", +"~. c #99BFDA", +"^. c #A2A5C8", +"/. c #A0ABCB", +"(. c #B2A7C9", +"). c #B6AECD", +"_. c #A3B1CF", +"`. c #A6B4D1", +"'. c #AAB5D1", +"]. c #A7B8D4", +"[. c #ABBAD5", +"{. c #A0BED9", +"}. c #AEBFD8", +"|. c #B2BED7", +" X c #95C3DF", +".X c #A3C4DD", +"XX c #B7C2D9", +"oX c #B9C4DC", +"OX c #95C4E0", +"+X c #9DC7E2", +"@X c #9DC9E4", +"#X c #A2C7E0", +"$X c #A5CAE2", +"%X c #AECDE3", +"&X c #B0CCE2", +"*X c #BACCE0", +"=X c #BFD7E8", +"-X c #CDCCCC", +";X c #D0CFCF", +":X c #C7C5DB", +">X c #CDC4DB", +",X c #D4D3D3", +" O # % > > > > % + O > 4.'.gXhXdXqX-XjXjXjXjXjXjXjXjXjXjX", +"jXjXjXjXjXjXjXjXjX.>.>.>.;.;.M 9 > O O ;.'.hXhXrX,XjXjXjXjXjXjXjXjXjX", +"jXjXjXjXjXjXjXjXqXdXhX7X8.@ @ 7 M ;.>.>.>.>.>.>.>.>.>.>.>.>.;.M 7 @ @ 8.7XhXsX,XjXjXjXjXjXjXjXjX", +"jXjXjXjXjXjXjXqXhXhXXXv . 7 M >.>.>.:.:.:.:.:.:.:.:.:.:.:.:.>.>.>.M 7 . v XXhXsX.;.q @ % _.hXsX,XjXjXjXjXjXjX", +"jXjXjXjXjXXw D } H 2.2.c o 7.hXdX,XjXjXjX", +"jXjXjXsXhX[.o 4 F 5.} } { G e.gXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhX(.7 { } } 5.F 4 o [.hXwXjXjXjX", +"jXjXqXhXgXD 2 V } } { { { _ *XhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhX-.V | { } 5.V * S gXdX,XjXjX", +"jXjXsXhX].& i } .{ { | _ z.hXhXhXhXhXhXhXhXeX^.E.3XhXhXhXhXhXhXhXhXI.7 ..{ { } } i X ].hXqXjXjX", +"jXX; ..| { { .B 1 6.hXsX-XjX", +"jXwXhX6Xy j _ { | | | | _ 3XhXhXhXhXhXhXhX1.N O.o.' m.hXhXhXhXhXhXhX4X; | | | | { { j y 6XhX,XjX", +"jXrXhXE.1 / %.{ | .........X6XuXgXhXhXhXiX: [ o.X.T U.hXhXhXhXhXhXhX>X; o...| | { O.Q 1 E.hXqXjX", +"jXdXhXx.t ( d...| ....o.o.[ o.w.v.Z.S.U.D.5 l l d *.pXhXhXhXhXhXhXhXL.0 o.....| ..d.( t x.hXrXjX", +" c #BB221B", +", c #9C2721", +"< c #9F2821", +"1 c #A32821", +"2 c #AA2821", +"3 c #B32821", +"4 c #BC2821", +"5 c #A2312A", +"6 c #AB312A", +"7 c #B3312A", +"8 c #BC312A", +"9 c #C7150D", +"0 c #C41B13", +"q c #CB1E16", +"w c #D31D15", +"e c #C3231B", +"r c #CB241C", +"t c #D1221A", +"y c #C42921", +"u c #CB2921", +"i c #D32921", +"p c #C1322A", +"a c #AE544F", +"s c #AF5751", +"d c #B05954", +"f c #B25D58", +"g c #B5645F", +"h c #CB5A55", +"j c #CF5D58", +"k c #D25A55", +"l c #D15D58", +"z c #D5615B", +"x c #CC6762", +"c c #CFA9A6", +"v c #D3AEAB", +"b c #DAAEAC", +"n c #DBB0AE", +"m c #D5BAB9", +"M c #E3B1AF", +"N c #E4B6B4", +"B c #EAB6B4", +"V c #CDCCCC", +"C c #D0CFCF", +"Z c #DFCAC9", +"A c #D4D3D3", +"S c #D8D7D7", +"D c #D7D8D6", +"F c #D8D8D7", +"G c #DCDCDB", +"H c #E6C5C4", +"J c #E9C5C4", +"K c #E2CECD", +"L c #EBCECC", +"P c #E5D0CF", +"I c #EED0CE", +"U c #E4D3D1", +"Y c #EED3D2", +"T c #E0DFDF", +"R c #F0DCDB", +"E c #E0E0DF", +"W c #E8E0DF", +"Q c #E3E3E3", +"! c #EBE4E4", +"~ c #E7E8E7", +"^ c #E8E8E7", +"/ c #E8E7E8", +"( c #E6EBEA", +") c #ECECEC", +"_ c #F1E7E7", +"` c #F0E8E7", +"' c #F3EAEA", +"] c #E9F0EF", +"[ c #F0F0EF", +"{ c #ECF2F2", +"} c #F2F2F2", +"| c #F5FBFB", +" . c #FAFCFC", +".. c None", +/* pixels */ +"....................................F D V V V V V V V V D F ....................................", +"..............................F V V A S G Q Q Q ~ Q Q G F A V V F ..............................", +"..........................A V A G ~ ^ ) ) ) ) ^ ^ ) ) ) ) ^ ~ G A V A ..........................", +"......................F V D Q ^ ) ^ ^ ) ) ) ) ) ) ) ) ) ) ^ ^ ) ^ Q S V S ......................", +"....................V A Q ) ^ ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ^ ^ ^ ) Q A V ....................", +"................G V F ^ ) ^ ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ^ ^ ^ G V G ................", +"..............F V Q ) ^ ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ^ ) Q V S ..............", +"............F V Q ) / ) ) ) ) ) ) ) ) ) ) [ [ [ [ [ [ ) ) ) ) ) ) ) ) ) ) ^ ) Q V S ............", +"..........G V Q ) ^ ) ) ) ) ) ) ) ) [ } } } } } } } } } [ ) ) ) ) ) ) ) ) ) ^ ^ Q V G ..........", +"..........V T ) ^ ) ) ) ) ) ) ) } } } } } } } } } } } } } } } [ ) ) ) ) ) ) ) ^ ) Q V ..........", +"........V F ) ^ ) ) ) ) ) ) ) } } } } } } } } } } } } } } } } } } [ ) ) ) ) ) ) ^ ) G V ........", +"......G C ^ ^ ) ) ) ) ) ) } } } } } } } } } } } } } } } } } } } } } [ ) ) ) ) ) ) ^ ^ A F ......", +"......V Q ) ) ) ) ) ) ) } } } } } } } } } } } } } } } } } } } } } } } [ ) ) ) ) ) ) ^ Q V ......", +"....D A ) ^ ) ) ) ) ) } } } } | | | | | | } } } } } } | | | | | | } } } [ ) ) ) ) ) ^ ) S A ....", +"....V Q ) ) ) ) ) ) [ } } | J k l l j h x ' | } } | R z k l j j h H | } } ) ) ) ) ) ) ^ Q V ....", +"..G A ^ ) ) ) ) ) [ } } } | M 9 0 0 0 O 4 ` | | | .Y q 9 0 0 & O M | } } } [ ) ) ) ) ^ ) A G ..", +"..V G ) ) ) ) ) ) } } } } | B q r r e e p ' .| | .Y i r r r e & b { ~ ~ ^ ) ) ) ) ) ^ ) T V ..", +"..V ~ ) ) ) ) ) ) } } } } | B w t r r e p ' .} } | L i t r r e & b { Q Q Q G G Q ^ ) ) ^ ^ V ..", +"G A ^ ) ) ) ) ) [ } } } } | B w t r r e p ' | } } | I i t r r e & b { ~ Q Q Q G G G G ~ ) ) A G ", +"S S ) ) ) ) ) ) } } } } } .B w r r e e p _ | } } | Y i t r r e & b { ~ Q Q Q G G G F D G / G D ", +"V G ) ) ) ) ) [ } } } } } .B q r r e > 8 _ | } } | Y u r r e e & b { ~ Q Q Q E G G G F A A F V ", +"V Q ) ) ) ) ) [ } } } } } .B 0 e e e > 8 ' .| | .Y u e e e > & b { ~ Q Q Q E G G G F A A V V ", +"V Q ) ) ) ) ) [ } } } } } .N 0 e e > > 8 ' . . . .Y y e e > > % b { ^ ~ Q Q Q G G G F A A V V ", +"V Q ) ) ) ) ) [ } } } } } .N & > > > * 8 ' . . . .Y 4 > > > : % b { ^ ~ Q Q Q G G G F A A C V ", +"V Q ) ) ) ) ) [ } } } } } .N % > : : * 7 ' . . . .Y 4 > > : : @ b { ^ ~ Q Q Q G G G F A A C V ", +"V Q ) ) ) ) ) [ } } } } } | n % : : : $ 7 ' . . . .Y 3 : : : ; @ b { ^ ~ Q Q Q G G G F A A V V ", +"V Q ) ) ) ) ) [ } } } } } { b @ ; ; ; $ 6 ' .| | .Y 3 ; ; ; ; + v { ~ ~ Q Q Q G G G F A A V V ", +"C G ) ) ) ) ) [ } } } } ) { b + ; ; - # 6 ` | | | .U 2 ; ; ; - + v { ~ Q Q Q E G G G F A A V V ", +"S S ) ) ) ) ) [ } } } } ^ { v + - - - # 5 ! | } } .U 2 - - - - X v { ~ Q Q Q E G G G D A A V S ", +"G A ^ ) ) ) ) ) } } } ) ~ { v X - = = o 5 ! | } } | P 1 - - = = X v { ~ Q Q Q G G G G D A C V G ", +"..V ~ ) ) ) ) ) [ } } Q Q { v X = = = o 5 ! } } } | K < = = = = X v { Q Q Q Q G G G F A A C V ..", +"..C G ) ) ) ) ) ) } ) Q Q { v X = = = o 5 ! } } [ } K < = = = = X v ] Q Q Q E G G G F A A V C ..", +"..G A ) ) ) ) ) ) } ~ Q Q ) c . . . , W } ) ) } Z o . . . c ) Q Q E G G G G D A A V G ..", +"....V Q ) ) ) ) ) ) Q Q Q ( m a d d d s g ! ) ) ) { U f d d d d a m ( Q Q G G G G F A A V V ....", +"....D D ) ) ) ) ) ) G E Q Q ~ ( ) ) { { { ) ) ) ) ^ ) { { { ) ) ( Q Q Q G G G G F D A A V D ....", +"......V Q ) ) ) ) ^ G G Q Q Q Q Q ~ ~ ~ ^ ^ ^ ^ ^ ^ ^ ~ ~ ~ Q Q Q Q Q G G G G G D A A V V ......", +"......G A ^ ) ) ) Q G G G E Q Q Q Q Q Q ~ ~ ~ ~ ~ ~ ~ ~ Q Q Q Q Q Q G G G G G F A A C V G ......", +"........V G ) ) ) Q G G G G G Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q E G G G G G F D A A V V ........", +"..........V Q ) ) E F G G G G G Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q G G G G G G F D A A V V ..........", +"..........G V Q ) G D F G G G G G G E Q Q Q Q Q Q Q Q Q E G G G G G G G F D A A V V G ..........", +"............F V Q G A D F G G G G G G G G G G G G G G G G G G G G G G F A A A V V F ............", +"..............F V S A A A D F G G G G G G G G G G G G G G G G G G F D A A A V V F ..............", +"................G V V A A A A D F G G G G G G G G G G G G G G F D A A A A V V G ................", +"....................V V C A A A A D F F F G G G G G G F F D D A A A A C V V ....................", +"......................G V V C A A A A A A D D D D D D A A A A A A C V V G ......................", +"..........................A V V V A A A A A A A A A A A A A C V V V A ..........................", +"..............................G A V V V V A A A A A A V V V V A G ..............................", +"....................................G F A V V V V V V A F G ...................................." +}; diff --git a/Source/Core/DolphinWX/resources/toolbar_play.c b/Source/Core/DolphinWX/resources/toolbar_play.c new file mode 100644 index 0000000000..c77e26af54 --- /dev/null +++ b/Source/Core/DolphinWX/resources/toolbar_play.c @@ -0,0 +1,278 @@ +static const unsigned char toolbar_play_png[] = { +0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, +0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, +0x08, 0x06, 0x00, 0x00, 0x00, 0x57, 0x02, 0xf9, 0x87, 0x00, 0x00, 0x00, +0x04, 0x73, 0x42, 0x49, 0x54, 0x08, 0x08, 0x08, 0x08, 0x7c, 0x08, 0x64, +0x88, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, +0x12, 0x00, 0x00, 0x0b, 0x12, 0x01, 0xd2, 0xdd, 0x7e, 0xfc, 0x00, 0x00, +0x00, 0x25, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, +0x72, 0x65, 0x00, 0x4d, 0x61, 0x63, 0x72, 0x6f, 0x6d, 0x65, 0x64, 0x69, +0x61, 0x20, 0x46, 0x69, 0x72, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, +0x4d, 0x58, 0x20, 0x32, 0x30, 0x30, 0x34, 0x87, 0x76, 0xac, 0xcf, 0x00, +0x00, 0x00, 0x14, 0x74, 0x45, 0x58, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, +0x69, 0x6f, 0x6e, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x00, 0x39, 0x2f, 0x34, +0x2f, 0x30, 0x34, 0x79, 0x5e, 0xa3, 0xd5, 0x00, 0x00, 0x0c, 0x3b, 0x49, +0x44, 0x41, 0x54, 0x78, 0x9c, 0xd5, 0x9a, 0x5b, 0x8c, 0x5d, 0xd5, 0x79, +0xc7, 0x7f, 0x6b, 0xad, 0xbd, 0xf7, 0x39, 0x67, 0x8e, 0xc7, 0x3e, 0x33, +0xe3, 0xb1, 0x31, 0xc1, 0xc6, 0xc4, 0x02, 0xcb, 0x15, 0xc1, 0x6e, 0x22, +0x45, 0xb2, 0xaa, 0x82, 0x93, 0x87, 0xf8, 0x05, 0xc5, 0x48, 0x3c, 0x54, +0x02, 0xa1, 0x38, 0x8a, 0x5a, 0x72, 0x91, 0xb8, 0x3c, 0xf0, 0xe4, 0x54, +0x71, 0x84, 0x52, 0x22, 0x24, 0x0a, 0x76, 0x2b, 0x55, 0x69, 0x1f, 0x8c, +0x54, 0xcd, 0x6b, 0x45, 0xda, 0x07, 0xd2, 0x44, 0x45, 0xb6, 0xd3, 0x48, +0xb4, 0x02, 0xc9, 0x24, 0x10, 0xf0, 0x05, 0x18, 0xdb, 0x83, 0x2f, 0x33, +0x73, 0xe6, 0x7e, 0x2e, 0xfb, 0xb2, 0xbe, 0xaf, 0x0f, 0x7b, 0x9f, 0xcb, +0xd8, 0x33, 0xe3, 0x31, 0x44, 0x45, 0x2c, 0x69, 0xe9, 0xdc, 0xf7, 0xfe, +0xff, 0xbf, 0xff, 0xb7, 0xfe, 0xdf, 0xb7, 0xd6, 0x8c, 0x51, 0x55, 0xbe, +0xc8, 0xc3, 0x7e, 0xde, 0x00, 0x3e, 0xeb, 0x08, 0x3e, 0xcf, 0x9b, 0x3f, +0xf9, 0xe4, 0x3f, 0x9b, 0xce, 0xf3, 0x5f, 0xfc, 0xe2, 0x6f, 0x3e, 0x55, +0x2a, 0x98, 0x3f, 0x55, 0x0a, 0xfd, 0xfc, 0xe7, 0xbf, 0xda, 0xa9, 0xaa, +0x07, 0x54, 0xe5, 0x80, 0x88, 0xec, 0x14, 0xd1, 0xbd, 0xaa, 0x52, 0x13, +0x11, 0x44, 0x04, 0x55, 0x19, 0x17, 0x91, 0x8b, 0x22, 0x72, 0x52, 0x44, +0xde, 0x99, 0x9f, 0x6f, 0xfe, 0x72, 0x85, 0xcb, 0x28, 0xdc, 0x1e, 0x99, +0xcf, 0x44, 0xe0, 0xa5, 0x97, 0xde, 0xa8, 0xa9, 0xca, 0x23, 0xaa, 0xfa, +0xb4, 0xaa, 0xee, 0xcb, 0x81, 0x2a, 0x7d, 0xa0, 0xbb, 0xcf, 0x97, 0xbf, +0xf6, 0x88, 0xc8, 0x9c, 0x88, 0xfc, 0xbb, 0xf7, 0xf2, 0xaf, 0xad, 0x56, +0x76, 0xaa, 0x00, 0xdf, 0x99, 0x00, 0xba, 0x1e, 0x22, 0x9f, 0x9a, 0xc0, +0xcb, 0x2f, 0x9f, 0x3c, 0x0a, 0xfa, 0xb4, 0x88, 0xd6, 0x54, 0x95, 0x72, +0xb9, 0x44, 0xb5, 0x5a, 0x65, 0x70, 0x70, 0x10, 0x63, 0x0c, 0x51, 0x54, +0xea, 0x82, 0x4d, 0xd3, 0x94, 0x66, 0x73, 0x89, 0xa5, 0xa5, 0x26, 0x8b, +0x8b, 0xf3, 0x2c, 0x2e, 0x2e, 0x92, 0x65, 0x69, 0x3f, 0xb9, 0xd3, 0xde, +0xfb, 0xe7, 0x92, 0x84, 0x33, 0x05, 0x01, 0xe9, 0x90, 0xb9, 0x15, 0x89, +0xdb, 0x5e, 0x03, 0xc7, 0x8e, 0x9d, 0x3e, 0x60, 0x8c, 0x39, 0x61, 0xad, +0xdd, 0x69, 0xad, 0x65, 0x78, 0x78, 0x98, 0xbb, 0xef, 0xbe, 0x83, 0x91, +0x91, 0x0a, 0x03, 0x03, 0x01, 0x41, 0x60, 0x09, 0x02, 0x87, 0xf7, 0x20, +0x02, 0x8d, 0x46, 0xc2, 0xd2, 0x52, 0xcc, 0xfc, 0x7c, 0x93, 0x7a, 0x7d, +0x81, 0xe1, 0xe1, 0x21, 0x92, 0x24, 0x61, 0x7e, 0x7e, 0x96, 0xab, 0x57, +0xaf, 0x11, 0xc7, 0x31, 0xc0, 0x83, 0xc6, 0x98, 0xff, 0x09, 0x43, 0xff, +0x77, 0x69, 0x6a, 0x9f, 0x07, 0x4c, 0x41, 0xa2, 0x43, 0x64, 0xd5, 0x71, +0x5b, 0x0a, 0x1c, 0x3f, 0xfe, 0xdf, 0x47, 0x8d, 0x31, 0x3f, 0x01, 0xd8, +0xb2, 0x65, 0x94, 0xfb, 0xef, 0xdf, 0xce, 0x96, 0x2d, 0x25, 0x4a, 0x25, +0x8b, 0x08, 0x5d, 0xd0, 0x6b, 0x3d, 0x9f, 0x9c, 0x9c, 0x63, 0x62, 0xe2, +0x1a, 0xcd, 0x66, 0x0b, 0x91, 0x8c, 0xa9, 0xa9, 0x29, 0x26, 0x27, 0x27, +0xbb, 0x8a, 0xa8, 0xca, 0x6f, 0xbd, 0xd7, 0xbf, 0x52, 0x0d, 0xea, 0x80, +0x07, 0x64, 0x2d, 0x15, 0xd6, 0xad, 0xc0, 0xf1, 0xe3, 0xbf, 0x3d, 0x61, +0xad, 0x3d, 0x5c, 0x2a, 0x95, 0x78, 0xe0, 0x81, 0xdd, 0xdc, 0x77, 0xdf, +0x06, 0xca, 0x65, 0xd3, 0x05, 0xd7, 0x6a, 0x79, 0x66, 0x66, 0x12, 0x16, +0x16, 0x52, 0xda, 0xed, 0x7c, 0x7a, 0xef, 0x11, 0xf1, 0x44, 0x91, 0xa3, +0x54, 0x0a, 0xa9, 0x54, 0x4a, 0xd4, 0x6a, 0x83, 0x0c, 0x0d, 0xd5, 0xb8, +0x7a, 0x75, 0x92, 0x8f, 0x3f, 0xbe, 0xc8, 0xd0, 0xd0, 0x30, 0x95, 0x4a, +0x85, 0x89, 0x89, 0xcb, 0xb4, 0x5a, 0x2d, 0x80, 0xbf, 0x34, 0x46, 0xff, +0x53, 0x35, 0x3b, 0x08, 0x41, 0x9d, 0xe5, 0xeb, 0xe2, 0xa6, 0xb1, 0x2e, +0x05, 0x8e, 0x1d, 0x3b, 0x7d, 0xc2, 0x5a, 0x7b, 0xb8, 0x5a, 0xad, 0xf2, +0xe0, 0x83, 0xf7, 0xb3, 0x63, 0x47, 0xd8, 0x8d, 0x68, 0xbd, 0xee, 0xb9, +0x76, 0x2d, 0xa1, 0xd9, 0xcc, 0x10, 0xf1, 0x78, 0x2f, 0xc5, 0xa3, 0xef, +0x7b, 0x14, 0xbc, 0xf7, 0x78, 0x9f, 0x91, 0x65, 0x42, 0xad, 0xb6, 0x81, +0xad, 0x5b, 0xb7, 0x92, 0x24, 0x19, 0xef, 0xbe, 0xfb, 0x1e, 0x69, 0x1a, +0xe3, 0xbd, 0xe7, 0xea, 0xd5, 0x2b, 0xcc, 0xcf, 0xcf, 0x75, 0xd6, 0xc5, +0x1f, 0x54, 0xcd, 0xb7, 0x8c, 0x89, 0xa6, 0x01, 0xbf, 0x9a, 0x0a, 0xb7, +0x2c, 0x64, 0x2f, 0xbf, 0x7c, 0xf2, 0x04, 0x70, 0x78, 0xd3, 0xa6, 0x1a, +0x07, 0x0f, 0x7e, 0x85, 0xed, 0xdb, 0xc3, 0x22, 0xe2, 0x70, 0xfe, 0x7c, +0xc6, 0xc4, 0x44, 0x46, 0x1c, 0x2b, 0xc6, 0x18, 0xc0, 0x60, 0x0a, 0x67, +0xcf, 0x1f, 0x4d, 0x31, 0xbb, 0xf1, 0x02, 0xa0, 0x5e, 0x9f, 0xe5, 0xf7, +0xbf, 0x7f, 0x97, 0xd9, 0xd9, 0x59, 0xf6, 0xec, 0xf9, 0x33, 0xac, 0x75, +0x88, 0x28, 0x5b, 0xb6, 0x6c, 0xa5, 0x5c, 0x1e, 0xe8, 0xfc, 0xee, 0x2b, +0xaa, 0xfe, 0x5f, 0x00, 0x77, 0xc3, 0x45, 0xd6, 0x4f, 0xe0, 0xa5, 0x97, +0xfe, 0xeb, 0x69, 0x55, 0x3d, 0x5c, 0x2e, 0x97, 0xf9, 0xc6, 0x37, 0x76, +0x33, 0x3c, 0x1c, 0x20, 0x02, 0xd3, 0xd3, 0xca, 0x87, 0x1f, 0x2a, 0xed, +0xf6, 0xad, 0xe8, 0xd3, 0x25, 0x94, 0x3f, 0xef, 0xbd, 0x50, 0x85, 0x4f, +0x3e, 0x99, 0xe0, 0xc2, 0x85, 0x0b, 0xec, 0xda, 0x75, 0x5f, 0xd7, 0x7e, +0xb7, 0x6e, 0xdd, 0x4a, 0x10, 0x74, 0x33, 0xfb, 0xe1, 0x2c, 0x6b, 0x3c, +0x05, 0xd8, 0xfe, 0xa2, 0xb7, 0x2e, 0x02, 0x2f, 0xbe, 0xf8, 0x9b, 0x7d, +0xaa, 0xfa, 0x8a, 0x73, 0x8e, 0xfd, 0xfb, 0xef, 0x67, 0x78, 0x38, 0x8f, +0xfc, 0xa5, 0x4b, 0x9e, 0x2b, 0x57, 0x72, 0xfb, 0x03, 0xa5, 0x93, 0x81, +0x2b, 0xa7, 0x62, 0xef, 0xf3, 0xce, 0xeb, 0x1e, 0x87, 0xfc, 0xb3, 0x66, +0x73, 0x91, 0x4b, 0x97, 0xc6, 0xd9, 0xb6, 0xed, 0x4b, 0xa8, 0x2a, 0xc6, +0x58, 0x46, 0x47, 0x47, 0xe9, 0x4b, 0xfb, 0x23, 0x69, 0xba, 0x74, 0xcf, +0x6a, 0x38, 0xd7, 0x50, 0x40, 0x4f, 0xa8, 0xc2, 0x9e, 0x3d, 0xf7, 0xb2, +0x7d, 0x7b, 0x05, 0x11, 0xb8, 0x78, 0x31, 0x61, 0x66, 0x26, 0x2b, 0x0a, +0x91, 0xef, 0x16, 0xa7, 0x5f, 0xff, 0xfa, 0x37, 0x34, 0x1a, 0x4b, 0xa8, +0x6a, 0x97, 0x48, 0x0f, 0x78, 0x8f, 0x41, 0xfe, 0x9e, 0x2e, 0xfb, 0x4c, +0x15, 0x16, 0x17, 0x17, 0x98, 0x9b, 0x9b, 0x25, 0x0c, 0xcb, 0xa8, 0x0a, +0xa5, 0x52, 0x99, 0x0d, 0x1b, 0x06, 0x3b, 0x5f, 0xda, 0xa4, 0x2a, 0x7f, +0xcb, 0x2a, 0x69, 0xb4, 0x22, 0x81, 0x17, 0x5e, 0x78, 0xfd, 0x3b, 0xaa, +0xba, 0x6f, 0xe3, 0xc6, 0x8d, 0xdc, 0x7b, 0xef, 0x08, 0xc6, 0x18, 0xa6, +0xa7, 0x53, 0xea, 0xf5, 0x14, 0xef, 0xa5, 0x3b, 0x3b, 0x85, 0xe8, 0xfa, +0xf5, 0xeb, 0xbc, 0xfe, 0xfa, 0xaf, 0x38, 0x7b, 0xf6, 0x5c, 0x97, 0x44, +0x3e, 0x3b, 0xc0, 0x6f, 0x34, 0x12, 0x2d, 0xc0, 0xf7, 0xde, 0x5f, 0x5c, +0x5c, 0x20, 0x4d, 0x63, 0x44, 0xf2, 0xf7, 0x6b, 0xb5, 0x21, 0x54, 0xbb, +0xca, 0x3e, 0x11, 0xc7, 0x73, 0x2b, 0xaa, 0xb0, 0x22, 0x01, 0x55, 0x3d, +0xaa, 0xaa, 0xec, 0xd9, 0xf3, 0x65, 0x36, 0x6e, 0x8c, 0x68, 0xb7, 0x85, +0x89, 0x89, 0x56, 0x5f, 0x1b, 0xd0, 0x53, 0x20, 0x4f, 0x25, 0x38, 0x78, +0xf0, 0x01, 0xce, 0x9d, 0xfb, 0x23, 0xa7, 0x4e, 0x9d, 0x5e, 0xa6, 0xc6, +0x72, 0x32, 0x5a, 0xa4, 0x89, 0x29, 0xc0, 0xd1, 0x05, 0x2c, 0xa2, 0xa4, +0x69, 0xa7, 0x16, 0x28, 0xce, 0x39, 0xaa, 0xd5, 0x2a, 0xc6, 0x74, 0xbe, +0xc7, 0x53, 0xeb, 0x22, 0xf0, 0xfc, 0xf3, 0xff, 0x71, 0x48, 0x55, 0x77, +0x0e, 0x0d, 0xd5, 0x18, 0x1d, 0xad, 0x22, 0x02, 0x97, 0x2f, 0x37, 0x49, +0xd3, 0x1e, 0xe0, 0x0e, 0x81, 0x8e, 0x45, 0x02, 0x3c, 0xfc, 0xf0, 0xd7, +0xf8, 0xf1, 0x8f, 0x1f, 0x65, 0x68, 0x28, 0xe2, 0x8d, 0x37, 0x4e, 0xf1, +0xe1, 0x87, 0x1f, 0xa1, 0x2a, 0x37, 0x11, 0xe9, 0x57, 0xa4, 0xa3, 0x50, +0x4e, 0x42, 0x6e, 0x50, 0xcc, 0x30, 0x30, 0x50, 0x2d, 0xf2, 0x46, 0x01, +0x39, 0xb4, 0xd2, 0x42, 0xbe, 0x89, 0x80, 0xaa, 0x1e, 0x56, 0x15, 0x36, +0x6f, 0x1e, 0x61, 0x68, 0xa8, 0xc2, 0xc2, 0x42, 0xc2, 0xec, 0x6c, 0xeb, +0x06, 0xe0, 0xd2, 0xf5, 0xfb, 0x99, 0x99, 0x3a, 0x77, 0xdd, 0x35, 0x82, +0x08, 0x0c, 0x0d, 0x0d, 0xf2, 0xec, 0xb3, 0x0f, 0xf3, 0xd8, 0x63, 0x7f, +0xc1, 0x47, 0x1f, 0x5d, 0xe0, 0xcd, 0x37, 0xff, 0x97, 0x66, 0xb3, 0xd9, +0x8d, 0x7c, 0x47, 0x89, 0x4e, 0xd4, 0x3b, 0xcd, 0x9d, 0xaa, 0x14, 0x37, +0x17, 0x50, 0xc5, 0x1a, 0x83, 0x41, 0xa9, 0x0e, 0x54, 0x00, 0xd3, 0x49, +0xfe, 0xbb, 0x1b, 0x8d, 0xe9, 0x7d, 0x6b, 0x12, 0x38, 0x7a, 0xf4, 0xdf, +0x6a, 0xaa, 0xf2, 0x48, 0x10, 0x84, 0x8c, 0x8e, 0x0e, 0x17, 0x96, 0xd9, +0xa2, 0xbf, 0xa3, 0xec, 0x00, 0xef, 0xa4, 0x50, 0x1c, 0x27, 0x54, 0x2a, +0x51, 0xb7, 0xb0, 0x89, 0xc0, 0xd7, 0xbf, 0x7e, 0x1f, 0xcf, 0x3f, 0xff, +0x18, 0x77, 0xdd, 0xb5, 0x91, 0xdf, 0xfd, 0xee, 0x4d, 0xc6, 0xc7, 0x2f, +0xf5, 0xa9, 0xd1, 0xe9, 0x4a, 0x57, 0x56, 0xc5, 0x98, 0xa2, 0x0a, 0x18, +0x70, 0xce, 0x51, 0x2a, 0x95, 0xa1, 0x9b, 0x72, 0x7a, 0xe8, 0x46, 0x02, +0xcb, 0x5a, 0x09, 0x11, 0x7d, 0xc8, 0x5a, 0xa5, 0x5a, 0x1d, 0xa0, 0x5a, +0x8d, 0x48, 0x53, 0x61, 0x7a, 0xba, 0x51, 0xf8, 0x77, 0x6e, 0x71, 0xd0, +0xf3, 0xf3, 0x1e, 0xa0, 0xbc, 0xdf, 0xe9, 0x1f, 0x51, 0x14, 0xf1, 0xbd, +0xef, 0x7d, 0x8b, 0xf3, 0xe7, 0xaf, 0x30, 0x36, 0x76, 0x8a, 0xc9, 0xc9, +0x29, 0x76, 0xef, 0xbe, 0x97, 0x30, 0x74, 0xcb, 0xa2, 0x2f, 0x22, 0xa8, +0x68, 0x01, 0xda, 0x60, 0x8c, 0xc1, 0x1a, 0x83, 0xa8, 0x20, 0x0a, 0x41, +0xe0, 0x30, 0x3d, 0x03, 0xd8, 0xbb, 0xa6, 0x02, 0xaa, 0xba, 0x4f, 0x55, +0x18, 0x18, 0x18, 0xa0, 0x5c, 0x0e, 0x59, 0x58, 0x88, 0x97, 0x45, 0x7e, +0x79, 0x5b, 0xe0, 0xbb, 0xef, 0xe7, 0xe4, 0x57, 0x9e, 0xbb, 0x76, 0xdd, +0xc9, 0x73, 0xcf, 0x3d, 0xca, 0xde, 0xbd, 0x3b, 0x78, 0xfb, 0xed, 0x33, +0x4c, 0x4c, 0x5c, 0x2d, 0xae, 0xd9, 0x59, 0xbc, 0xd2, 0x8b, 0x3e, 0x86, +0xc0, 0x5a, 0x02, 0x67, 0x71, 0xd6, 0x61, 0x2d, 0x94, 0xcb, 0xa5, 0x3e, +0x85, 0xa8, 0xdd, 0x82, 0x80, 0x1c, 0x10, 0x51, 0x82, 0x20, 0x60, 0x60, +0xa0, 0xcc, 0xc2, 0x42, 0xeb, 0x26, 0xc7, 0x59, 0xee, 0x42, 0x9e, 0x46, +0xa3, 0x41, 0xb9, 0x5c, 0xc2, 0x7b, 0x56, 0x9d, 0x51, 0x14, 0xf1, 0xed, +0x6f, 0xef, 0xe7, 0xa9, 0xa7, 0x0e, 0x91, 0xa6, 0x0d, 0x3e, 0xf8, 0xe0, +0x3c, 0xed, 0x76, 0xdc, 0x33, 0x01, 0xcd, 0xc1, 0x3b, 0x9b, 0xcf, 0xc0, +0x5a, 0x9c, 0x31, 0x58, 0x63, 0xb1, 0x26, 0x8f, 0x7f, 0x91, 0x69, 0x07, +0x6e, 0xa5, 0x40, 0x2d, 0x2f, 0x24, 0xa5, 0xa2, 0x97, 0x6f, 0xaf, 0xe8, +0x3c, 0xbd, 0x5a, 0xe0, 0x69, 0x36, 0x1b, 0x6c, 0xdb, 0x36, 0xb2, 0xaa, +0x02, 0xfd, 0x73, 0xdb, 0xb6, 0x11, 0x9e, 0x79, 0xe6, 0x51, 0xf6, 0xef, +0xdf, 0xcd, 0xc4, 0xc4, 0x65, 0xea, 0xf5, 0xd9, 0x5c, 0x09, 0x04, 0x6b, +0xc8, 0x09, 0x38, 0x5b, 0x4c, 0x83, 0xb5, 0x79, 0x4a, 0xf5, 0x9c, 0xe8, +0xe6, 0x71, 0xc3, 0x1a, 0x90, 0x7d, 0x9d, 0x3c, 0x14, 0x81, 0x85, 0x85, +0x06, 0xc6, 0xd8, 0x6e, 0x6e, 0xc2, 0xf2, 0x7e, 0x26, 0xff, 0x8d, 0xae, +0xb8, 0x06, 0xd6, 0x1a, 0xdf, 0xfc, 0xe6, 0xd7, 0xf8, 0xea, 0x57, 0x77, +0xf3, 0xc6, 0x1b, 0xef, 0x30, 0x39, 0x39, 0x87, 0x35, 0xa6, 0x20, 0xe0, +0x08, 0x5d, 0x80, 0x35, 0xf9, 0x75, 0xad, 0x91, 0xa2, 0x66, 0xac, 0xde, +0x51, 0x2f, 0x23, 0x90, 0xdb, 0x99, 0x2d, 0x22, 0x0e, 0x22, 0x82, 0x31, +0xfd, 0x9d, 0xe6, 0x72, 0x12, 0xcb, 0xad, 0x71, 0xfd, 0x04, 0x00, 0xca, +0xe5, 0x32, 0x43, 0x43, 0x83, 0x4c, 0x5e, 0x9f, 0xc3, 0x18, 0x83, 0x2b, +0x72, 0x3f, 0x70, 0x16, 0x03, 0x38, 0x2b, 0x64, 0x62, 0x48, 0xd3, 0x64, +0x95, 0x3e, 0x6b, 0x05, 0x02, 0x22, 0x8a, 0x31, 0xd2, 0x23, 0xe0, 0xf3, +0x08, 0x50, 0x28, 0xd0, 0x6b, 0x91, 0x7b, 0xa3, 0xd5, 0x6a, 0x22, 0x32, +0x74, 0x5b, 0x0a, 0xbc, 0xff, 0xfe, 0x25, 0xde, 0x7e, 0xfb, 0x1c, 0xad, +0x56, 0x8c, 0x2b, 0x52, 0x27, 0x74, 0x8e, 0x28, 0x0c, 0x08, 0x83, 0xdc, +0xa5, 0x8c, 0xcf, 0xad, 0x34, 0x4d, 0x53, 0xa4, 0x47, 0xe0, 0xcc, 0x9a, +0x04, 0x54, 0x05, 0x83, 0x21, 0x8e, 0x63, 0x16, 0x16, 0x1a, 0x85, 0x22, +0xbd, 0x9e, 0x5e, 0xc4, 0x70, 0x43, 0x06, 0xd1, 0x6c, 0xb6, 0xb9, 0xe3, +0x8e, 0x91, 0x75, 0x29, 0x30, 0x35, 0x35, 0xc7, 0x5b, 0x6f, 0x9d, 0x63, +0x6a, 0x6a, 0x96, 0x2c, 0xcb, 0x30, 0x08, 0xd6, 0xd8, 0x1c, 0x7c, 0x10, +0x10, 0x05, 0x8e, 0xc0, 0x39, 0x52, 0x9f, 0x61, 0xac, 0xc1, 0x60, 0xba, +0x6d, 0x49, 0x31, 0xe6, 0xd6, 0x24, 0x20, 0x22, 0x27, 0x8d, 0xb5, 0x07, +0x92, 0xb8, 0x4d, 0xb3, 0xd1, 0xa2, 0x93, 0x77, 0xa6, 0x53, 0x3d, 0xa1, +0xdb, 0xcb, 0x40, 0xaf, 0xf8, 0x84, 0x61, 0xb4, 0xa6, 0x02, 0xcd, 0x66, +0xcc, 0x3b, 0xef, 0x5c, 0xe0, 0xf2, 0xe5, 0xeb, 0xa4, 0x69, 0x4a, 0x96, +0x79, 0x50, 0xc1, 0x19, 0x43, 0x14, 0x38, 0xca, 0x51, 0x40, 0xb9, 0x14, +0x12, 0x05, 0x0e, 0x80, 0xcc, 0xe7, 0xe0, 0xe3, 0x24, 0x2e, 0xa2, 0xdf, +0x25, 0x70, 0xf2, 0x56, 0x04, 0xe6, 0x72, 0xd6, 0x8b, 0xcc, 0xd4, 0x67, +0xa8, 0x94, 0x4b, 0x24, 0x71, 0x82, 0xa8, 0x60, 0xc8, 0x15, 0x52, 0x01, +0x51, 0xed, 0x1d, 0xde, 0xdc, 0x62, 0x0d, 0x9c, 0x3d, 0x7b, 0x89, 0xf3, +0xe7, 0x2f, 0xd3, 0x6a, 0xb5, 0xc9, 0xb2, 0x0c, 0xdf, 0x05, 0x6f, 0x29, +0x85, 0x01, 0x03, 0xa5, 0x88, 0x4a, 0x14, 0x51, 0x0e, 0x03, 0x9c, 0x73, +0x64, 0xe2, 0xbb, 0xd7, 0x9d, 0x9d, 0x9b, 0xc3, 0x7b, 0xed, 0x57, 0xe0, +0x56, 0x29, 0xa4, 0x67, 0x14, 0x7d, 0xa4, 0xb1, 0xd4, 0xa0, 0xdd, 0x6e, +0x52, 0xad, 0x0e, 0x80, 0x0a, 0x81, 0x31, 0x39, 0x68, 0x35, 0x18, 0x3c, +0x5e, 0xa4, 0x78, 0xdd, 0xe9, 0x20, 0x6f, 0x76, 0xa1, 0x7a, 0x7d, 0x9e, +0x33, 0x67, 0xce, 0xb2, 0xb8, 0xd8, 0xe8, 0x15, 0x3e, 0xef, 0x31, 0x28, +0xce, 0x5a, 0xa2, 0xc0, 0x51, 0x89, 0xa2, 0x9c, 0x40, 0x29, 0x22, 0x0a, +0x1d, 0xaa, 0x90, 0x79, 0x8f, 0xa0, 0x78, 0x15, 0xe6, 0xe6, 0x66, 0x97, +0x35, 0x79, 0xeb, 0x51, 0xe0, 0x35, 0x63, 0xcc, 0xd1, 0x46, 0xa3, 0x81, +0xcf, 0x32, 0xd2, 0x38, 0xc5, 0x19, 0x8a, 0xf2, 0x0e, 0x06, 0x21, 0xf3, +0x79, 0x4a, 0x21, 0x79, 0x15, 0x6d, 0x36, 0x5b, 0xc5, 0x21, 0x56, 0x7e, +0x8d, 0x56, 0xab, 0xcd, 0x7b, 0xef, 0x7d, 0xc8, 0x95, 0x2b, 0x93, 0x85, +0xc5, 0x7a, 0xb4, 0x28, 0x56, 0xce, 0x1a, 0x9c, 0xc9, 0xc1, 0x97, 0xc2, +0x80, 0x6a, 0xb9, 0xc4, 0x40, 0x29, 0x22, 0x0c, 0x02, 0xac, 0x85, 0x24, +0xf3, 0x78, 0x15, 0x32, 0x2f, 0xd4, 0x67, 0x66, 0x89, 0x93, 0x14, 0x2f, +0xdd, 0xc8, 0xbc, 0x36, 0x36, 0x76, 0x64, 0xfe, 0x46, 0x02, 0xcb, 0x0a, +0xd9, 0xf1, 0xe3, 0x7f, 0xfd, 0x8e, 0x78, 0x3f, 0xee, 0xc5, 0x53, 0xaf, +0x4f, 0xe3, 0xb3, 0x04, 0x63, 0x20, 0xb0, 0x10, 0x58, 0x4b, 0xe4, 0x1c, +0x91, 0xb3, 0x84, 0xce, 0x10, 0x58, 0x70, 0x46, 0xd9, 0xba, 0x65, 0x33, +0x23, 0x23, 0x23, 0x78, 0x0f, 0x67, 0xcf, 0x8e, 0x73, 0xfa, 0xd4, 0x5b, +0x5c, 0xbb, 0x32, 0x09, 0x2a, 0x18, 0x15, 0xac, 0xe6, 0x37, 0x89, 0xac, +0xa5, 0x12, 0x06, 0x54, 0xcb, 0x11, 0x1b, 0x2a, 0x65, 0x36, 0x55, 0x07, +0x18, 0xac, 0x94, 0xf3, 0xe8, 0x07, 0xf9, 0xbe, 0x5d, 0x44, 0x49, 0x33, +0x4f, 0x9c, 0xa6, 0x5c, 0x9f, 0xbc, 0x8e, 0x97, 0xac, 0x3f, 0xfa, 0xaf, +0xde, 0x08, 0xfe, 0x26, 0x05, 0x8a, 0x44, 0xfa, 0xa5, 0x78, 0x79, 0x7a, +0x7a, 0x7a, 0x9a, 0xcd, 0xc3, 0x9b, 0x89, 0x02, 0x8b, 0xc1, 0x12, 0xd8, +0xdc, 0x8d, 0x9c, 0xc9, 0x01, 0xa5, 0x05, 0xfb, 0x5d, 0x77, 0x7f, 0x89, +0xb9, 0xd9, 0x05, 0xde, 0x7f, 0xf7, 0x2c, 0xcd, 0x56, 0x0b, 0x15, 0xcd, +0xdb, 0x00, 0x0c, 0xb8, 0xbc, 0x2d, 0x76, 0xc6, 0x75, 0xd3, 0xa6, 0x14, +0x06, 0x94, 0xa3, 0x90, 0x52, 0x18, 0x12, 0x85, 0x0e, 0x63, 0x0c, 0x99, +0x17, 0xbc, 0x08, 0x49, 0x96, 0x91, 0x64, 0x9e, 0x4f, 0xae, 0x4c, 0xd0, +0x8e, 0x63, 0x7c, 0xb7, 0x4f, 0x62, 0x7c, 0x6c, 0xec, 0xc8, 0x4a, 0x87, +0xc1, 0x37, 0x13, 0x50, 0xd5, 0x57, 0xbc, 0xf8, 0xa7, 0x93, 0x34, 0x61, +0x6a, 0xfa, 0x3a, 0xa5, 0x3b, 0xef, 0x24, 0xb0, 0x79, 0x9b, 0x1b, 0x38, +0x43, 0xa8, 0x01, 0xa1, 0xb3, 0x64, 0xce, 0x92, 0x7a, 0x4b, 0x92, 0x19, +0xce, 0xbf, 0xfb, 0x01, 0xc6, 0x0b, 0xe5, 0x20, 0x40, 0x34, 0xef, 0x2e, +0xc1, 0x61, 0x01, 0xe7, 0x0c, 0x81, 0x75, 0x84, 0x81, 0xcd, 0xad, 0x32, +0x0c, 0x88, 0x82, 0x80, 0xc0, 0x59, 0xc0, 0x90, 0x89, 0x27, 0x13, 0x4f, +0x3b, 0x49, 0x69, 0xa7, 0x29, 0x53, 0xf5, 0x69, 0xea, 0x33, 0x73, 0xa4, +0x59, 0x86, 0x48, 0x37, 0xfc, 0x47, 0x57, 0x02, 0x0f, 0xab, 0x1c, 0x6c, +0xfd, 0xe8, 0x47, 0xff, 0xf4, 0x6a, 0x18, 0x04, 0xdf, 0x29, 0x47, 0x21, +0xf7, 0x7e, 0xf9, 0x1e, 0x86, 0x36, 0xd5, 0x28, 0x87, 0x01, 0xa5, 0x30, +0x20, 0x28, 0xfc, 0x59, 0x54, 0xf1, 0xde, 0x93, 0x79, 0x21, 0xf3, 0x9e, +0xcc, 0xfb, 0xc2, 0x31, 0x84, 0x7c, 0x3f, 0x05, 0xd6, 0xe4, 0xbd, 0x4d, +0xe8, 0x2c, 0x81, 0x73, 0xc5, 0x2c, 0x1a, 0x34, 0x55, 0x52, 0x9f, 0xa7, +0x4b, 0x33, 0x4e, 0x69, 0xc4, 0x31, 0xd7, 0xa7, 0xa7, 0xf9, 0xf8, 0xe2, +0x38, 0xad, 0x38, 0xee, 0x27, 0x70, 0x66, 0x6c, 0xec, 0xc8, 0x9f, 0xaf, +0x46, 0x60, 0xc5, 0xa3, 0xc5, 0xd0, 0xd9, 0x9f, 0x66, 0x59, 0x7a, 0x28, +0x81, 0xda, 0xf8, 0xa5, 0xcb, 0x04, 0xf7, 0x04, 0xd8, 0xc1, 0x0d, 0x79, +0xd5, 0x0c, 0x43, 0x9c, 0xb3, 0x04, 0x06, 0x28, 0xaa, 0xa6, 0x14, 0xae, +0x24, 0xa2, 0xfd, 0xc7, 0x11, 0xf9, 0xce, 0xca, 0x80, 0x2d, 0xba, 0x4b, +0x63, 0x0c, 0x8a, 0xe2, 0x45, 0x0a, 0xf0, 0x19, 0xcd, 0x38, 0xa5, 0x19, +0xc7, 0x4c, 0xd5, 0xeb, 0x5c, 0xbc, 0x7c, 0x89, 0x38, 0xc9, 0xc8, 0xbc, +0xef, 0xb7, 0xce, 0xc3, 0xab, 0x81, 0x5f, 0x55, 0x01, 0x80, 0x1f, 0xfe, +0xe0, 0x1f, 0x9f, 0x35, 0xc6, 0xfe, 0x7d, 0x39, 0x8a, 0xa8, 0x56, 0xca, +0xec, 0xba, 0x67, 0x27, 0xb5, 0xc1, 0x41, 0x2a, 0x51, 0x58, 0x28, 0x61, +0x71, 0xd6, 0x62, 0xad, 0xe9, 0xd6, 0x99, 0x1c, 0x5e, 0x31, 0x0a, 0x19, +0x3a, 0x85, 0x5b, 0x35, 0x07, 0x9e, 0xf9, 0x3c, 0xd7, 0xf3, 0xc8, 0x27, +0x34, 0xe3, 0x84, 0x89, 0x2b, 0x57, 0xb9, 0x3a, 0x79, 0x8d, 0x76, 0x9c, +0x90, 0xa4, 0x69, 0x7f, 0xee, 0x3f, 0x33, 0x36, 0x76, 0xe4, 0xd8, 0xa7, +0x22, 0x00, 0xf0, 0xfd, 0x27, 0x8f, 0xbf, 0x16, 0x38, 0x77, 0xa8, 0x54, +0x90, 0xd8, 0xb9, 0x63, 0x07, 0x43, 0x1b, 0x7b, 0x24, 0xa2, 0x20, 0xc0, +0x15, 0x44, 0x3a, 0x3b, 0xaa, 0x6e, 0xfe, 0x14, 0xc5, 0x4e, 0x8a, 0xed, +0x63, 0x9e, 0x6a, 0xf9, 0x22, 0x6d, 0x27, 0x29, 0xad, 0x24, 0x61, 0x61, +0x69, 0x89, 0x8b, 0x13, 0x13, 0xcc, 0x2d, 0x2c, 0xd0, 0x8e, 0x13, 0x32, +0x9f, 0x91, 0xf9, 0x2e, 0xf8, 0x57, 0xc7, 0xc6, 0x8e, 0x7c, 0x77, 0x2d, +0xf0, 0x70, 0x8b, 0xd3, 0xe9, 0xc0, 0xb9, 0xc3, 0x71, 0x9a, 0x9e, 0x54, +0xd5, 0xbd, 0x22, 0x9e, 0xf3, 0x1f, 0x7d, 0xc4, 0xd6, 0xcd, 0xa3, 0xdc, +0xb1, 0x65, 0x94, 0x81, 0x52, 0x89, 0x28, 0xf4, 0x44, 0x81, 0x23, 0x74, +0x0e, 0x67, 0xf3, 0x0d, 0x48, 0xe7, 0x18, 0x44, 0xc9, 0x81, 0x7b, 0x2f, +0x64, 0x22, 0x24, 0x69, 0x56, 0xb8, 0x4c, 0xc6, 0x52, 0xb3, 0xc5, 0xb5, +0xa9, 0x49, 0xa6, 0xa6, 0xa7, 0x69, 0xb6, 0x13, 0x92, 0x34, 0xc9, 0xd7, +0x90, 0xdc, 0x1e, 0xf8, 0x5b, 0x2a, 0x00, 0xf0, 0xc3, 0xef, 0xff, 0x43, +0x2d, 0xc9, 0xb2, 0x93, 0x81, 0x73, 0x7b, 0xc3, 0xc0, 0x51, 0x0a, 0x43, +0x06, 0x2a, 0x65, 0xb6, 0x8c, 0x6c, 0x66, 0xb8, 0x56, 0xa3, 0x52, 0x2e, +0x11, 0x76, 0x17, 0x67, 0x4e, 0x00, 0xcd, 0xdb, 0x0d, 0xd1, 0x7c, 0xe3, +0x93, 0x7a, 0x4f, 0x92, 0x66, 0xcc, 0x2f, 0x2e, 0x32, 0x3b, 0x3f, 0xc7, +0xf4, 0xcc, 0x0c, 0xad, 0x38, 0x07, 0x9e, 0x66, 0x45, 0x95, 0xee, 0x55, +0xdc, 0x75, 0x83, 0x5f, 0x17, 0x01, 0x80, 0x1f, 0x3c, 0x79, 0xbc, 0x16, +0x27, 0xc9, 0x6b, 0xd6, 0xda, 0x87, 0xa2, 0xd0, 0x11, 0x06, 0x01, 0x61, +0x10, 0x10, 0x85, 0x21, 0x1b, 0x37, 0x6c, 0xa0, 0x3a, 0x50, 0x65, 0x43, +0x75, 0x80, 0x28, 0x8c, 0x70, 0x2e, 0x6f, 0xc8, 0xbc, 0xcf, 0x88, 0x93, +0x94, 0x76, 0xbb, 0xcd, 0x52, 0x63, 0x89, 0xf9, 0xc5, 0x45, 0xe2, 0x24, +0xa1, 0x9d, 0xa4, 0xa4, 0x59, 0xde, 0xd0, 0x79, 0x29, 0xda, 0x92, 0x3e, +0xbb, 0x1c, 0x1b, 0x3b, 0xf2, 0xd3, 0xf5, 0x82, 0x5f, 0x37, 0x81, 0xce, +0xf8, 0xee, 0xe1, 0x17, 0x8f, 0x1a, 0x63, 0x7e, 0xe2, 0xac, 0xc5, 0xb9, +0xbc, 0x38, 0x05, 0x85, 0xa7, 0xe7, 0x1b, 0x11, 0xd7, 0x4d, 0x21, 0xc8, +0x17, 0xac, 0x48, 0xc7, 0x66, 0xb3, 0xae, 0xdd, 0x8a, 0x48, 0x37, 0x5d, +0x8a, 0xdb, 0x8f, 0x03, 0x87, 0xc7, 0xc6, 0x8e, 0x9c, 0xba, 0x1d, 0xf0, +0xb7, 0x4d, 0x00, 0xe0, 0x89, 0x27, 0x5e, 0xd8, 0x6b, 0x8c, 0x79, 0xc5, +0x1a, 0x73, 0xc0, 0xd8, 0xde, 0xc6, 0xdb, 0x16, 0x95, 0xda, 0x16, 0xb6, +0xd3, 0x39, 0xd7, 0x14, 0x95, 0x6e, 0x94, 0x65, 0xd9, 0x49, 0x1d, 0x90, +0xf7, 0xf7, 0xaf, 0xdc, 0x6e, 0xd4, 0x3f, 0x13, 0x81, 0xce, 0x78, 0xfc, +0xf1, 0x9f, 0x3d, 0x64, 0x0c, 0x87, 0xad, 0xb1, 0x8f, 0x18, 0x63, 0x6a, +0xbd, 0x0d, 0x78, 0x6f, 0xc7, 0xd3, 0x01, 0x9c, 0xef, 0x25, 0x96, 0x01, +0x3f, 0x03, 0xbc, 0xc2, 0x2a, 0x0d, 0xda, 0xff, 0x0b, 0x81, 0xfe, 0xf1, +0xf8, 0xe3, 0x3f, 0x3b, 0x04, 0xec, 0x23, 0x3f, 0xf6, 0xd8, 0x59, 0xcc, +0xce, 0x98, 0x23, 0x07, 0x3c, 0x4e, 0xde, 0x0e, 0x9f, 0x1c, 0x1b, 0x3b, +0x72, 0xf1, 0x33, 0xdf, 0xb4, 0x18, 0x7f, 0xb2, 0xbf, 0xd4, 0x7f, 0x5e, +0xe3, 0x0b, 0xff, 0xcf, 0x1e, 0x5f, 0x78, 0x02, 0xff, 0x07, 0xe2, 0x1a, +0xeb, 0x6e, 0x4b, 0x67, 0x61, 0x8b, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, +0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, +}; diff --git a/Source/Core/DolphinWX/resources/toolbar_play.xpm b/Source/Core/DolphinWX/resources/toolbar_play.xpm new file mode 100644 index 0000000000..eecd985e2b --- /dev/null +++ b/Source/Core/DolphinWX/resources/toolbar_play.xpm @@ -0,0 +1,149 @@ +/* XPM */ +static char *toolbar_play_xpm[] = { +/* columns rows colors chars-per-pixel */ +"48 48 95 2", +" c #9D0F08", +". c #A5160F", +"X c #AE170F", +"o c #B5160F", +"O c #A31710", +"+ c #A51A12", +"@ c #AA1B14", +"# c #A11E18", +"$ c #A81F18", +"% c #B31A13", +"& c #BC1A11", +"* c #A5211A", +"= c #AD231C", +"- c #B3231C", +"; c #BC241C", +": c #AA2B24", +"> c #AE322B", +", c #B9322B", +"< c #B03933", +"1 c #CA1006", +"2 c #CE170E", +"3 c #D1180F", +"4 c #C31B12", +"5 c #CC1A12", +"6 c #D11A11", +"7 c #C3241C", +"8 c #CB241C", +"9 c #D3231B", +"0 c #D32C25", +"q c #D23B34", +"w c #B4403B", +"e c #AF4B45", +"r c #B84C46", +"t c #B6534E", +"y c #B65F5A", +"u c #BA635E", +"i c #BE6560", +"p c #BE6C67", +"a c #D24E47", +"s c #C0625D", +"d c #CE625C", +"f c #D7635E", +"g c #C46661", +"h c #CA6662", +"j c #CE6862", +"k c #D36762", +"l c #D36863", +"z c #DC6964", +"x c #DE716B", +"c c #C67874", +"v c #D07874", +"b c #C98581", +"n c #CD918D", +"m c #D2918D", +"M c #D39D9B", +"N c #E38985", +"B c #E6A39F", +"V c #D3A5A2", +"C c #DCB6B3", +"Z c #D7B9B6", +"A c #D8B9B6", +"S c #D8BBB9", +"D c #E3B5B2", +"F c #CDCCCC", +"G c #D9C4C2", +"H c #D0CFCF", +"J c #DBCBCA", +"K c #D4D3D3", +"L c #D8D7D7", +"P c #D7D8D6", +"I c #D8D8D7", +"U c #DCDCDB", +"Y c #EBC5C3", +"T c #E4CAC8", +"R c #E2D1D0", +"E c #EDD5D4", +"W c #E0DFDF", +"Q c #E9DBDA", +"! c #F1D9D8", +"~ c #E0E0DF", +"^ c #E4E3E3", +"/ c #EAE5E4", +"( c #E8E8E7", +") c #E8E7E8", +"_ c #E6E9E8", +"` c #ECECEC", +"' c #F2EDEC", +"] c #EEF0EF", +"[ c #F0F0EF", +"{ c #EDF2F2", +"} c #F2F3F2", +"| c #F1F8F7", +" . c #F4FBFB", +".. c #F9FEFE", +"X. c None", +/* pixels */ +"X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.I P F F F F F F F F P I X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.", +"X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.I F F K L U ^ ^ ^ ^ ^ ^ U I K F F I X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.", +"X.X.X.X.X.X.X.X.X.X.X.X.X.K F K U ( ( ` ` ` ` ( ( ` ` ` ` ( ( U K F K X.X.X.X.X.X.X.X.X.X.X.X.X.", +"X.X.X.X.X.X.X.X.X.X.X.I F P ^ ( ` ( ( ` ` ` ` ` ` ` ` ` ` ( ( ` ( ^ L F L X.X.X.X.X.X.X.X.X.X.X.", +"X.X.X.X.X.X.X.X.X.X.F K ^ ` ( ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ( ( ( ` ^ K F X.X.X.X.X.X.X.X.X.X.", +"X.X.X.X.X.X.X.X.U F I ( ` ( ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ( ( ( U F U X.X.X.X.X.X.X.X.", +"X.X.X.X.X.X.X.I F ^ ` ( ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ( ` ^ F L X.X.X.X.X.X.X.", +"X.X.X.X.X.X.I F ^ ` ) ` ` ` ` ` ` ` ` ` ` [ [ [ [ [ [ ` ` ` ` ` ` ` ` ` ` ( ` ^ F L X.X.X.X.X.X.", +"X.X.X.X.X.U F ^ ` ( ` ` ` ` ` ` ` ` [ } } } } } } } } } [ ` ` ` ` ` ` ` ` ` ( ( ^ F U X.X.X.X.X.", +"X.X.X.X.X.F W ` ( ` ` ` ` ` ` ` } } } } } } } } } } } } } } } [ ` ` ` ` ` ` ` ( ` ^ F X.X.X.X.X.", +"X.X.X.X.F I ` ( ` ` ` ` ` ` ` } } } } } } } } } } } } } } } } } } [ ` ` ` ` ` ` ( ` U F X.X.X.X.", +"X.X.X.U H ( ( ` ` ` ` ` ` } } } } | } } } } } } } } } } } } } } } } [ ` ` ` ` ` ` ( ( K I X.X.X.", +"X.X.X.F ^ ` ` ` ` ` ` ` } } } } } E } .} } } } } } } } } } } } } } } [ ` ` ` ` ` ` ( ^ F X.X.X.", +"X.X.P K ` ( ` ` ` ` ` } } } } } .f a Y .. .} } } } } } } } } } } } } } [ ` ` ` ` ` ( ` L K X.X.", +"X.X.F ^ ` ` ` ` ` ` [ } } } } } .z 1 9 x ! .. .| | } } } } } } } } } } } ` ` ` ` ` ` ( ^ F X.X.", +"X.U K ( ` ` ` ` ` [ } } } } } } ..z 5 9 3 0 N ' .. .| | | } } } } } } } } } [ ` ` ` ` ( ` K U X.", +"X.F U ` ` ` ` ` ` } } } } } } } ..z 6 9 9 9 2 q B | ..} ` ` ` ( ( ( ( ( ( ( ` ` ` ` ` ( ` W F X.", +"X.F ^ ` ` ` ` ` ` } } } } } } } ..z 6 9 9 9 9 5 5 a D | | ` ` ` ( ( ( ^ ^ ^ U U ^ ( ` ` ( ( F X.", +"U K ( ` ` ` ` ` [ } } } } } } } ..z 6 9 9 9 8 8 8 4 4 d T .{ ` ` ( ( ( ^ ^ ^ U U U U ( ` ` K U ", +"L L ` ` ` ` ` ` } } } } } } } | ..z 5 9 9 8 8 8 8 7 7 & ; v Q .` ( ( ( ^ ^ ^ U U U I P U ) U P ", +"F U ` ` ` ` ` [ } } } } } } } | ..z 5 8 8 8 8 8 7 7 7 ; ; o , m / { _ ( ^ ^ ^ ~ U U U I K K I F ", +"F ^ ` ` ` ` ` [ } } } } } } | | ..l 4 8 8 8 8 7 7 7 ; ; ; - % X w V ` { ^ ^ ^ ~ U U U I K K F F ", +"F ^ ` ` ` ` ` [ } } } } } } | | .k 4 7 7 7 7 7 7 7 ; ; ; - - - @ + t A ` _ ^ ^ U U U I K K F F ", +"F ^ ` ` ` ` ` [ } } } } } } | } | l 4 7 7 7 7 7 ; ; ; ; - - - = = * + # y J _ ^ U U U I K K H F ", +"F ^ ` ` ` ` ` [ } } } } } | } ` | l & 7 7 7 ; ; ; ; ; - - - = = = * + # y J _ ^ U U U I K K H F ", +"F ^ ` ` ` ` ` [ } } } } } } ` ` | j & ; ; ; ; ; ; ; - - - - = = + + t Z ` _ ^ ^ U U U I K K F F ", +"F ^ ` ` ` ` ` [ } } } } } ` ` ` | h % ; ; ; ; ; - - - - - = $ . w V ` { ( ^ ^ ^ U U U I K K F F ", +"H U ` ` ` ` ` [ } } } } ` ( ` ` | h % - - - - - - - - = = . > n / { _ ( ^ ^ ^ ~ U U U I K K F F ", +"L L ` ` ` ` ` [ } } } } ( ( ( ` | g % - - - - - - - = @ = c Q .] ( ( ( ^ ^ ^ ~ U U U P K K F L ", +"U K ( ` ` ` ` ` } } } ` ( ( ( ` | g @ - - - - = = @ @ s T .} ` ` ( ( ( ^ ^ ^ U U U U P K H F U ", +"X.F ( ` ` ` ` ` [ } } ^ ^ ( ( ( { g @ = = = = @ + r C | | ` ` ` ( ( ( ^ ^ ^ ^ U U U I K K H F X.", +"X.H U ` ` ` ` ` ` } ` ^ ^ ( ( ( { i + = = $ . < M ' .] ` ` ` ( ( ( ( ^ ^ ^ ~ U U U I K K F H X.", +"X.U K ` ` ` ` ` ` } ( ^ ^ ^ ( ( { i + * O : b / .{ ` ` ` ` ( ( ( ( ^ ^ ^ ~ U U U U P K K F U X.", +"X.X.F ^ ` ` ` ` ` ` ^ ^ ^ ^ ^ ( { u * p R | { ` ` ` ` ( ( ( ( ( ^ ^ ^ ^ U U U U I K K F F X.X.", +"X.X.P P ` ` ` ` ` ` U ~ ^ ^ ^ ^ ` y e S { { ` ` ` ` ( ( ( ( ( ( ^ ^ ^ ^ U U U U I P K K F P X.X.", +"X.X.X.F ^ ` ` ` ` ( U U ^ ^ ^ ^ ^ G ^ { ( ( ( ( ( ( ( ( ( ( ^ ^ ^ ^ ^ U U U U U P K K F F X.X.X.", +"X.X.X.U K ( ` ` ` ^ U U U ~ ^ ^ ^ _ _ ^ ( ( ( ( ( ( ( ( ^ ^ ^ ^ ^ ^ U U U U U I K K H F U X.X.X.", +"X.X.X.X.F U ` ` ` ^ U U U U U ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ~ U U U U U I P K K F F X.X.X.X.", +"X.X.X.X.X.F ^ ` ` ~ I U U U U U ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ U U U U U U I P K K F F X.X.X.X.X.", +"X.X.X.X.X.U F ^ ` U P I U U U U U U ~ ^ ^ ^ ^ ^ ^ ^ ^ ^ ~ U U U U U U U I P K K F F U X.X.X.X.X.", +"X.X.X.X.X.X.I F ^ U K P I U U U U U U U U U U U U U U U U U U U U U U I K K K F F I X.X.X.X.X.X.", +"X.X.X.X.X.X.X.I F L K K K P I U U U U U U U U U U U U U U U U U U I P K K K F F I X.X.X.X.X.X.X.", +"X.X.X.X.X.X.X.X.U F F K K K K P I U U U U U U U U U U U U U U I P K K K K F F U X.X.X.X.X.X.X.X.", +"X.X.X.X.X.X.X.X.X.X.F F H K K K K P I I I U U U U U U I I P P K K K K H F F X.X.X.X.X.X.X.X.X.X.", +"X.X.X.X.X.X.X.X.X.X.X.U F F H K K K K K K P P P P P P K K K K K K H F F U X.X.X.X.X.X.X.X.X.X.X.", +"X.X.X.X.X.X.X.X.X.X.X.X.X.K F F F K K K K K K K K K K K K K H F F F K X.X.X.X.X.X.X.X.X.X.X.X.X.", +"X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.U K F F F F K K K K K K F F F F K U X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.", +"X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.U I K F F F F F F K I U X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X." +}; diff --git a/Source/Core/DolphinWX/resources/toolbar_play_dis.c b/Source/Core/DolphinWX/resources/toolbar_play_dis.c new file mode 100644 index 0000000000..224495ed2b --- /dev/null +++ b/Source/Core/DolphinWX/resources/toolbar_play_dis.c @@ -0,0 +1,221 @@ +static const unsigned char toolbar_play_dis_png[] = { +0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, +0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, +0x08, 0x06, 0x00, 0x00, 0x00, 0x57, 0x02, 0xf9, 0x87, 0x00, 0x00, 0x00, +0x01, 0x73, 0x52, 0x47, 0x42, 0x00, 0xae, 0xce, 0x1c, 0xe9, 0x00, 0x00, +0x00, 0x06, 0x62, 0x4b, 0x47, 0x44, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, +0xa0, 0xbd, 0xa7, 0x93, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, +0x00, 0x00, 0x0b, 0x12, 0x00, 0x00, 0x0b, 0x12, 0x01, 0xd2, 0xdd, 0x7e, +0xfc, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4d, 0x45, 0x07, 0xd8, 0x03, +0x16, 0x0a, 0x1e, 0x20, 0xe2, 0xd3, 0xdc, 0xb0, 0x00, 0x00, 0x09, 0xc0, +0x49, 0x44, 0x41, 0x54, 0x68, 0xde, 0xed, 0x5a, 0x4b, 0x68, 0x1c, 0x47, +0x1a, 0xfe, 0xaa, 0xbb, 0xa7, 0xbb, 0x67, 0x46, 0x9a, 0x69, 0x4b, 0x19, +0x89, 0x3c, 0x2d, 0x83, 0x13, 0x83, 0xc1, 0xb1, 0x36, 0x24, 0x97, 0x98, +0x5d, 0x0b, 0x02, 0xbb, 0x10, 0x16, 0xec, 0x4b, 0xd8, 0xd3, 0x3a, 0x32, +0x04, 0x72, 0x8b, 0xb4, 0x01, 0x9f, 0x8c, 0x22, 0x89, 0x85, 0x3d, 0x2e, +0xbd, 0xa7, 0x1c, 0x7c, 0x90, 0xc1, 0x24, 0x04, 0xe7, 0xe2, 0x6c, 0x0e, +0x61, 0xc9, 0x45, 0xde, 0x85, 0x18, 0x9f, 0xe2, 0x45, 0x49, 0x9c, 0x84, +0x28, 0x91, 0xb0, 0x22, 0x45, 0xd6, 0x68, 0x1e, 0x9a, 0xee, 0xe9, 0xe9, +0x47, 0x55, 0xed, 0x61, 0xa7, 0x8a, 0x9a, 0x56, 0x4b, 0x1a, 0xd9, 0xc9, +0x2e, 0x81, 0x14, 0x14, 0xd3, 0x6a, 0xfa, 0xf1, 0x7d, 0xff, 0xff, 0xfd, +0x8f, 0xaa, 0x16, 0xe1, 0x9c, 0xe3, 0xe7, 0x3c, 0x34, 0xfc, 0xcc, 0x87, +0xf1, 0xff, 0x7c, 0xf9, 0xfc, 0xfc, 0x3c, 0x11, 0xc7, 0xb3, 0xb3, 0xb3, +0x0f, 0x24, 0x05, 0xf2, 0x63, 0x49, 0xe8, 0xea, 0xd5, 0xab, 0x63, 0x9c, +0xf3, 0x09, 0xce, 0xf9, 0x04, 0x63, 0x6c, 0x8c, 0x31, 0x76, 0x9a, 0x73, +0xee, 0x30, 0xc6, 0xd0, 0x9d, 0x2b, 0x8c, 0xb1, 0x55, 0xc6, 0xd8, 0x22, +0x63, 0xec, 0xdf, 0x9e, 0xe7, 0x7d, 0x90, 0xf1, 0x18, 0x7e, 0x58, 0x32, +0x0f, 0x45, 0xe0, 0xdd, 0x77, 0xdf, 0x75, 0x18, 0x63, 0xe7, 0x39, 0xe7, +0x53, 0x9c, 0xf3, 0x71, 0xc6, 0x18, 0x38, 0xe7, 0x02, 0x70, 0xcf, 0x71, +0xc6, 0x6c, 0x30, 0xc6, 0xfe, 0x4e, 0x29, 0xbd, 0x16, 0x45, 0xd1, 0xcd, +0x2e, 0x78, 0x31, 0x01, 0x80, 0xf7, 0x43, 0xe4, 0x81, 0x09, 0xbc, 0xf7, +0xde, 0x7b, 0x73, 0x5d, 0xe0, 0x0e, 0xe7, 0x1c, 0x96, 0x65, 0xa1, 0x58, +0x2c, 0x62, 0x70, 0x70, 0x10, 0x84, 0x10, 0x58, 0x96, 0x05, 0xc6, 0x18, +0x28, 0xa5, 0x88, 0xe3, 0x18, 0xbe, 0xef, 0xc3, 0xf7, 0x7d, 0xec, 0xec, +0xec, 0xa0, 0xd5, 0x6a, 0x21, 0x49, 0x12, 0x95, 0xcc, 0x3f, 0x29, 0xa5, +0x97, 0x28, 0xa5, 0x77, 0xba, 0x04, 0x98, 0x20, 0x73, 0x10, 0x89, 0x43, +0xc7, 0xc0, 0xf5, 0xeb, 0xd7, 0x27, 0x08, 0x21, 0x0b, 0x9a, 0xa6, 0x8d, +0x69, 0x9a, 0x86, 0xa1, 0xa1, 0x21, 0x3c, 0xfe, 0xf8, 0xe3, 0x28, 0x95, +0x4a, 0xb0, 0x2c, 0x0b, 0xba, 0xae, 0xc3, 0x30, 0x0c, 0xe9, 0x81, 0x4e, +0xa7, 0x83, 0x76, 0xbb, 0x0d, 0xcf, 0xf3, 0x50, 0xaf, 0xd7, 0x31, 0x34, +0x34, 0x84, 0x28, 0x8a, 0xd0, 0x68, 0x34, 0xb0, 0xb1, 0xb1, 0x81, 0x30, +0x0c, 0x01, 0xe0, 0x37, 0x84, 0x90, 0xdb, 0x84, 0x90, 0xbf, 0x70, 0xce, +0xff, 0x0c, 0x80, 0x74, 0x49, 0x30, 0xc5, 0x23, 0x0f, 0xef, 0x81, 0xf7, +0xdf, 0x7f, 0x7f, 0x8e, 0x10, 0x32, 0x0b, 0x00, 0x23, 0x23, 0x23, 0x38, +0x7e, 0xfc, 0x38, 0xca, 0xe5, 0x32, 0x0c, 0xc3, 0x00, 0xe7, 0xbc, 0x67, +0x0a, 0x02, 0xe9, 0xb9, 0xbd, 0xbd, 0x8d, 0xf5, 0xf5, 0x75, 0xb4, 0xdb, +0x6d, 0x50, 0x4a, 0xb1, 0xb5, 0xb5, 0x85, 0xfb, 0xf7, 0xef, 0xab, 0x1e, +0xf9, 0x17, 0x63, 0xec, 0x0f, 0x9a, 0xa6, 0x6d, 0x03, 0xa0, 0x00, 0xd8, +0x7e, 0x5e, 0x30, 0x0e, 0x01, 0x7e, 0x41, 0xd3, 0xb4, 0x49, 0xcb, 0xb2, +0x70, 0xf2, 0xe4, 0x49, 0x3c, 0xfa, 0xe8, 0xa3, 0xc8, 0xe5, 0x72, 0x12, +0x68, 0x14, 0x45, 0xf0, 0x3c, 0x0f, 0x41, 0x10, 0x20, 0x0c, 0x43, 0x44, +0x51, 0x04, 0x4a, 0x29, 0x28, 0xa5, 0xc8, 0xe5, 0x72, 0x30, 0x4d, 0x13, +0xb6, 0x6d, 0xa3, 0x54, 0x2a, 0xc1, 0x71, 0x1c, 0x6c, 0x6e, 0x6e, 0x62, +0x65, 0x65, 0x05, 0x43, 0x43, 0x43, 0xc8, 0xe7, 0xf3, 0x58, 0x5b, 0x5b, +0x43, 0x10, 0x04, 0x00, 0xf0, 0x6b, 0x00, 0xff, 0x60, 0x8c, 0xfd, 0xae, +0x4b, 0x82, 0xef, 0xe7, 0x85, 0xbe, 0x3c, 0x70, 0xfd, 0xfa, 0xf5, 0x05, +0x4d, 0xd3, 0x26, 0x8b, 0xc5, 0x22, 0x5e, 0x78, 0xe1, 0x05, 0x1c, 0x39, +0x72, 0x44, 0x5a, 0xd4, 0xf7, 0x7d, 0x34, 0x9b, 0x4d, 0x84, 0x61, 0x28, +0x35, 0x2f, 0x7e, 0xc5, 0x4c, 0xff, 0x5d, 0x2a, 0x95, 0x30, 0x3a, 0x3a, +0x8a, 0x38, 0x8e, 0xf1, 0xd9, 0x67, 0x9f, 0x49, 0xb2, 0x1b, 0x1b, 0x1b, +0x68, 0x34, 0x1a, 0xc2, 0x13, 0x4b, 0x00, 0x7e, 0x6b, 0x18, 0x46, 0x15, +0x00, 0xdd, 0xcb, 0x0b, 0x5a, 0x1f, 0xc1, 0xba, 0x00, 0x60, 0xb2, 0x5c, +0x2e, 0xe3, 0xc5, 0x17, 0x5f, 0x94, 0xe0, 0x93, 0x24, 0x41, 0xb5, 0x5a, +0x45, 0xa3, 0xd1, 0x40, 0x92, 0x24, 0x20, 0xe4, 0xbf, 0x29, 0x5d, 0xfc, +0x8a, 0x63, 0xf5, 0x6f, 0x31, 0x6a, 0xb5, 0x1a, 0x96, 0x96, 0x96, 0x50, +0xaf, 0xd7, 0x71, 0xf2, 0xe4, 0x49, 0xe8, 0xba, 0x0e, 0xce, 0x39, 0x46, +0x46, 0x46, 0x90, 0xcf, 0xe7, 0xc5, 0x7d, 0xa7, 0x18, 0x63, 0x57, 0x00, +0xe8, 0xdd, 0x98, 0x38, 0x7c, 0x25, 0x7e, 0xe7, 0x9d, 0x77, 0xa6, 0x38, +0xe7, 0x93, 0xb6, 0x6d, 0xe3, 0xf9, 0xe7, 0x9f, 0x47, 0xb1, 0x58, 0x04, +0xe7, 0x1c, 0xed, 0x76, 0x1b, 0xb5, 0x5a, 0x0d, 0x49, 0x92, 0x1c, 0xae, +0xe8, 0x28, 0x64, 0x38, 0xe7, 0x58, 0x5b, 0x5b, 0xc3, 0x37, 0xdf, 0x7c, +0x83, 0xe3, 0xc7, 0x8f, 0xcb, 0xb8, 0x19, 0x1d, 0x1d, 0x85, 0x61, 0x48, +0x65, 0xff, 0xbe, 0xd3, 0xe9, 0xbc, 0x01, 0x40, 0x53, 0x8b, 0x5e, 0x5f, +0x04, 0xae, 0x5d, 0xbb, 0x36, 0xce, 0x39, 0x77, 0x75, 0x5d, 0xc7, 0x73, +0xcf, 0x3d, 0x87, 0x81, 0x81, 0x01, 0x70, 0xce, 0x51, 0xaf, 0xd7, 0xb1, +0xb3, 0xb3, 0x23, 0xb5, 0xaf, 0x02, 0xda, 0x55, 0x95, 0xfa, 0x90, 0xa7, +0xe7, 0x79, 0x58, 0x5d, 0x5d, 0xc5, 0x63, 0x8f, 0x3d, 0x06, 0xce, 0x39, +0x34, 0x4d, 0x43, 0xa5, 0x52, 0x51, 0xef, 0xbd, 0x1c, 0x04, 0xc1, 0xb1, +0x43, 0x7b, 0x80, 0x73, 0xbe, 0x00, 0x00, 0x27, 0x4e, 0x9c, 0xc0, 0xf0, +0xf0, 0xb0, 0xcc, 0x20, 0xbe, 0xef, 0xf7, 0x68, 0x9b, 0x31, 0x86, 0x8f, +0x3f, 0xfe, 0x18, 0xbe, 0xef, 0xcb, 0xb8, 0xd8, 0x8b, 0x84, 0x38, 0x4e, +0xff, 0xb6, 0x5a, 0x2d, 0xd4, 0xeb, 0x75, 0x59, 0x3b, 0x2c, 0xcb, 0xc2, +0xe0, 0xe0, 0xa0, 0xb8, 0xad, 0xcc, 0x39, 0x9f, 0xd9, 0x4b, 0x46, 0x99, +0x04, 0x16, 0x16, 0x16, 0x5e, 0xe5, 0x9c, 0x8f, 0x97, 0x4a, 0x25, 0x3c, +0xf1, 0xc4, 0x13, 0x20, 0x84, 0xa0, 0xd5, 0x6a, 0xc1, 0xf3, 0xbc, 0xcc, +0xaa, 0xba, 0xb9, 0xb9, 0x89, 0x8f, 0x3e, 0xfa, 0x08, 0x5f, 0x7f, 0xfd, +0x75, 0x4f, 0xca, 0x3c, 0xc8, 0x3b, 0xea, 0x75, 0xad, 0x56, 0x0b, 0x51, +0x14, 0xc9, 0x73, 0x8e, 0xe3, 0xa8, 0xf7, 0xfe, 0xd1, 0xf3, 0xbc, 0x63, +0x7d, 0x13, 0xe0, 0x9c, 0xcf, 0x71, 0xce, 0xf1, 0xf4, 0xd3, 0x4f, 0xa3, +0x50, 0x28, 0x20, 0x8e, 0x63, 0xd4, 0x6a, 0xb5, 0xcc, 0xec, 0xc2, 0x18, +0x03, 0x00, 0x9c, 0x39, 0x73, 0x06, 0x5f, 0x7e, 0xf9, 0x25, 0x6e, 0xde, +0xbc, 0x09, 0xcf, 0xf3, 0x32, 0x6b, 0x80, 0x00, 0x94, 0x8e, 0x05, 0xa1, +0xff, 0x38, 0x8e, 0xa5, 0x34, 0x75, 0x5d, 0x47, 0xb1, 0x58, 0x04, 0x21, +0x44, 0x5c, 0xf3, 0x46, 0x5f, 0x04, 0xae, 0x5c, 0xb9, 0x72, 0x8e, 0x73, +0x3e, 0x76, 0xe4, 0xc8, 0x11, 0x38, 0x8e, 0x23, 0xa5, 0x93, 0x2a, 0xfd, +0x3d, 0x29, 0x13, 0x00, 0xce, 0x9e, 0x3d, 0x8b, 0xd7, 0x5f, 0x7f, 0x1d, +0x03, 0x03, 0x03, 0x58, 0x5c, 0x5c, 0xc4, 0xf2, 0xf2, 0x72, 0x66, 0x31, +0xcb, 0xb2, 0xbe, 0x7a, 0x9d, 0x4a, 0xb2, 0x50, 0x28, 0xa8, 0x44, 0xcf, +0x65, 0x05, 0xb2, 0x96, 0x61, 0xfd, 0x49, 0xce, 0x39, 0x86, 0x87, 0x87, +0x31, 0x38, 0x38, 0x88, 0x76, 0xbb, 0x8d, 0x56, 0xab, 0xb5, 0x0b, 0xb8, +0x00, 0x5f, 0xab, 0xd5, 0x30, 0x3a, 0x3a, 0x0a, 0xce, 0x39, 0xca, 0xe5, +0x32, 0x2e, 0x5c, 0xb8, 0x80, 0x97, 0x5f, 0x7e, 0x19, 0xcb, 0xcb, 0xcb, +0xb8, 0x7d, 0xfb, 0x36, 0xda, 0xed, 0xf6, 0x2e, 0xd0, 0x2a, 0x60, 0x35, +0x19, 0x88, 0x73, 0xc2, 0xea, 0x2a, 0x01, 0x00, 0x47, 0x1b, 0x8d, 0xc6, +0xf8, 0xbe, 0x04, 0xde, 0x7e, 0xfb, 0x6d, 0x87, 0x73, 0x7e, 0xde, 0x30, +0x0c, 0x3c, 0xf2, 0xc8, 0x23, 0xe0, 0x9c, 0xa3, 0xd9, 0x6c, 0x66, 0x5a, +0x5d, 0xcc, 0x30, 0x0c, 0x61, 0xdb, 0x76, 0x0f, 0xc0, 0x67, 0x9f, 0x7d, +0x16, 0x53, 0x53, 0x53, 0xa8, 0x54, 0x2a, 0xb8, 0x75, 0xeb, 0x16, 0x56, +0x57, 0x57, 0x33, 0x25, 0x95, 0xe5, 0x15, 0x35, 0xe5, 0xea, 0xba, 0x0e, +0xdb, 0xb6, 0xa5, 0xe4, 0x38, 0xe7, 0xe7, 0xf6, 0x6d, 0x25, 0x38, 0xe7, +0x67, 0x39, 0xe7, 0x28, 0x16, 0x8b, 0xb0, 0x6d, 0x1b, 0x94, 0x52, 0x34, +0x9b, 0x4d, 0x69, 0x11, 0x4d, 0xd3, 0x7a, 0xf2, 0x79, 0x16, 0x10, 0x31, +0x4c, 0xd3, 0xc4, 0x2b, 0xaf, 0xbc, 0x82, 0x95, 0x95, 0x15, 0x7c, 0xf8, +0xe1, 0x87, 0xb8, 0x7f, 0xff, 0x3e, 0x9e, 0x79, 0xe6, 0x19, 0xd9, 0x37, +0xa5, 0xe5, 0xa8, 0x16, 0x3e, 0x45, 0xf7, 0xb2, 0xc8, 0x75, 0xc7, 0xe9, +0x7d, 0x3d, 0x20, 0x7a, 0xfa, 0x42, 0xa1, 0x00, 0xcb, 0xb2, 0xe0, 0xfb, +0x7e, 0xa6, 0xf5, 0xd3, 0x2d, 0x42, 0x16, 0x19, 0x31, 0x8f, 0x1e, 0x3d, +0x8a, 0xd7, 0x5e, 0x7b, 0x0d, 0x27, 0x4e, 0x9c, 0xc0, 0xa7, 0x9f, 0x7e, +0x8a, 0xf5, 0xf5, 0xf5, 0x4c, 0x09, 0x09, 0xe9, 0x68, 0x9a, 0x06, 0x5d, +0xd7, 0xa1, 0x69, 0x1a, 0x08, 0x21, 0xb0, 0x6d, 0x5b, 0xcd, 0x46, 0xce, +0xbe, 0x04, 0x18, 0x63, 0x13, 0x9c, 0x73, 0x18, 0x86, 0x81, 0x7c, 0x3e, +0x9f, 0x99, 0xf3, 0xd5, 0x2c, 0x44, 0x29, 0x85, 0xef, 0xfb, 0xb0, 0x6d, +0x7b, 0xbf, 0x85, 0x0b, 0x4c, 0xd3, 0xc4, 0x4b, 0x2f, 0xbd, 0x84, 0x0b, +0x17, 0x2e, 0xa0, 0xd3, 0xe9, 0xe0, 0xab, 0xaf, 0xbe, 0x42, 0xa7, 0xd3, +0x91, 0xcf, 0x15, 0xe0, 0x05, 0x01, 0x01, 0x5e, 0xfc, 0x2a, 0x04, 0x26, +0x0e, 0xf2, 0x80, 0x23, 0x0a, 0x89, 0x68, 0x19, 0xb2, 0x80, 0xab, 0xe7, +0xda, 0xed, 0x36, 0x46, 0x46, 0x46, 0xf6, 0xd5, 0xb8, 0x98, 0x23, 0x23, +0x23, 0xb8, 0x78, 0xf1, 0x22, 0xc6, 0xc7, 0xc7, 0xb1, 0xb6, 0xb6, 0x26, +0x53, 0xb3, 0x90, 0x88, 0x00, 0xaf, 0x92, 0xc8, 0xea, 0xa5, 0xf6, 0x8c, +0x01, 0xc6, 0xd8, 0xb8, 0xaa, 0x41, 0xcf, 0xf3, 0x7a, 0x74, 0x99, 0xee, +0x67, 0xb2, 0x52, 0x60, 0x3f, 0xe3, 0xcc, 0x99, 0x33, 0x38, 0x75, 0xea, +0x14, 0x6e, 0xdd, 0xba, 0x85, 0xed, 0xed, 0xed, 0x1e, 0xeb, 0x8b, 0x3e, +0x48, 0xc8, 0x4b, 0x8d, 0x87, 0x03, 0x09, 0xa4, 0xf3, 0xb2, 0x78, 0x40, +0x1a, 0x7c, 0x3a, 0x88, 0xfb, 0xed, 0x7b, 0xd4, 0x61, 0xdb, 0x36, 0xca, +0xe5, 0xb2, 0x24, 0xa0, 0x6a, 0x5f, 0x60, 0x20, 0x84, 0xc8, 0xea, 0xdc, +0xaf, 0x07, 0x40, 0x08, 0x91, 0x04, 0x28, 0xa5, 0x3d, 0x1e, 0xc8, 0x72, +0x67, 0x10, 0x04, 0x92, 0x6c, 0xbf, 0x63, 0x79, 0x79, 0x19, 0x4b, 0x4b, +0x4b, 0xe8, 0x74, 0x3a, 0xf2, 0xb9, 0x62, 0x29, 0x2a, 0xb2, 0x94, 0x78, +0x77, 0x1c, 0xc7, 0x2a, 0x81, 0x3b, 0x7d, 0x79, 0x20, 0x0c, 0x43, 0xb4, +0x5a, 0xad, 0xcc, 0x7e, 0x26, 0x4d, 0x22, 0x08, 0x82, 0x74, 0xf7, 0xb8, +0xe7, 0x10, 0xeb, 0x00, 0x51, 0xd9, 0x45, 0xf0, 0xaa, 0xe0, 0x75, 0x5d, +0xef, 0x59, 0x5f, 0x88, 0x26, 0xb1, 0x3b, 0x1a, 0x07, 0x79, 0x60, 0x51, +0xd3, 0xb4, 0x09, 0xb1, 0x10, 0xdf, 0xab, 0x93, 0x4c, 0x4b, 0xc8, 0x34, +0xcd, 0x7d, 0x09, 0x04, 0x41, 0x80, 0xbb, 0x77, 0xef, 0x62, 0x7d, 0x7d, +0x1d, 0x71, 0x1c, 0xcb, 0xb6, 0x84, 0x10, 0x02, 0xc3, 0x30, 0xe4, 0x92, +0x53, 0xd7, 0xf5, 0x9e, 0x7a, 0x90, 0x21, 0x9f, 0xc5, 0x83, 0x08, 0x34, +0x44, 0x8f, 0x5e, 0xab, 0xd5, 0x60, 0xdb, 0xb6, 0x5c, 0x2a, 0x66, 0xf5, +0x30, 0x7b, 0x9d, 0x4b, 0xcb, 0xe5, 0xbb, 0xef, 0xbe, 0x43, 0xa7, 0xd3, +0x41, 0x92, 0x24, 0xd2, 0xf2, 0x22, 0x60, 0x2d, 0xcb, 0x82, 0x69, 0x9a, +0xd2, 0xfa, 0xea, 0xbb, 0xc4, 0xf2, 0xf2, 0x30, 0x12, 0xba, 0x03, 0xe0, +0xbc, 0xef, 0xfb, 0x08, 0x82, 0x00, 0x85, 0x42, 0xa1, 0xa7, 0x37, 0x11, +0x0f, 0xa6, 0x94, 0x4a, 0xd0, 0x42, 0xa3, 0xe9, 0x18, 0xa8, 0xd7, 0xeb, +0xf8, 0xfc, 0xf3, 0xcf, 0xe1, 0x79, 0x5e, 0x4f, 0x0a, 0x16, 0xe9, 0x52, +0xd7, 0x75, 0x98, 0xa6, 0x09, 0xd3, 0x34, 0x61, 0x59, 0x56, 0x8f, 0xf6, +0xc5, 0xf3, 0xea, 0xf5, 0x7a, 0x9a, 0xc0, 0x81, 0x1e, 0xb8, 0x41, 0x08, +0x99, 0xf3, 0x7d, 0x1f, 0x49, 0x92, 0x20, 0x8a, 0xa2, 0x5d, 0x59, 0x47, +0xb5, 0x3c, 0x63, 0x0c, 0x41, 0x10, 0xc8, 0xba, 0x01, 0x40, 0x16, 0xaa, +0x1f, 0x7e, 0xf8, 0xa1, 0xa7, 0x98, 0xa9, 0x95, 0x56, 0xe8, 0xdd, 0xb6, +0x6d, 0x69, 0x7d, 0x42, 0xc8, 0x2e, 0xf0, 0xa2, 0xbd, 0xee, 0x8e, 0x1b, +0xae, 0xeb, 0x36, 0xf7, 0x2d, 0x64, 0x97, 0x2f, 0x5f, 0xfe, 0x37, 0xa5, +0x74, 0x85, 0x52, 0x8a, 0x6a, 0xb5, 0x8a, 0x38, 0x8e, 0x7b, 0x72, 0xb4, +0x48, 0x73, 0x6a, 0x85, 0xac, 0x54, 0x2a, 0x72, 0xc5, 0xb6, 0xbc, 0xbc, +0x8c, 0x4f, 0x3e, 0xf9, 0x44, 0x82, 0x57, 0x09, 0x6b, 0x9a, 0x86, 0x5c, +0x2e, 0x07, 0xcb, 0xb2, 0x60, 0xdb, 0xb6, 0xec, 0xb7, 0x84, 0xf5, 0x45, +0xf6, 0x4b, 0x92, 0x04, 0x71, 0x1c, 0x63, 0x73, 0x73, 0x53, 0x12, 0x12, +0xdb, 0xaf, 0x7d, 0xed, 0x0b, 0x71, 0xce, 0x3f, 0x60, 0x8c, 0x4d, 0x55, +0xab, 0x55, 0x0c, 0x0f, 0x0f, 0xf7, 0x80, 0xce, 0xca, 0x42, 0x4f, 0x3e, +0xf9, 0x24, 0x1a, 0x8d, 0x06, 0xee, 0xde, 0xbd, 0x8b, 0x20, 0x08, 0x7a, +0x6a, 0x87, 0xb8, 0xd6, 0x30, 0x0c, 0x69, 0x80, 0x5c, 0x2e, 0x27, 0xa7, +0x0a, 0x5c, 0x80, 0xa7, 0x94, 0xe2, 0xfb, 0xef, 0xbf, 0x97, 0xb1, 0xd7, +0x25, 0xb0, 0xe2, 0xba, 0xee, 0x07, 0xfd, 0x12, 0x70, 0x29, 0xa5, 0x53, +0x71, 0x1c, 0x63, 0x6b, 0x6b, 0x4b, 0x2e, 0xb6, 0xd3, 0xa5, 0x5e, 0x68, +0x3a, 0x49, 0x12, 0x7c, 0xf1, 0xc5, 0x17, 0x60, 0x8c, 0xf5, 0x6c, 0x29, +0xaa, 0x96, 0x17, 0xe0, 0x45, 0xc6, 0x11, 0x84, 0x84, 0x6c, 0x28, 0xa5, +0x88, 0xa2, 0x08, 0x71, 0x1c, 0xa3, 0x5a, 0xad, 0xa2, 0x5e, 0xaf, 0xcb, +0x4c, 0xd5, 0x1d, 0x73, 0x87, 0xda, 0xd8, 0x9a, 0x9f, 0x9f, 0xbf, 0x6a, +0x18, 0xc6, 0xab, 0xa6, 0x69, 0xe2, 0xd8, 0xb1, 0x63, 0x70, 0x1c, 0x47, +0xbe, 0x5c, 0x6d, 0x35, 0xd2, 0x8d, 0x5d, 0x1a, 0xbc, 0x2a, 0x3d, 0x31, +0x05, 0x70, 0x71, 0x7f, 0x1c, 0xc7, 0x88, 0xa2, 0x08, 0x61, 0x18, 0xa2, +0x5a, 0xad, 0x62, 0x75, 0x75, 0x15, 0x61, 0x18, 0xaa, 0x04, 0xee, 0xb8, +0xae, 0xfb, 0xab, 0x43, 0x6d, 0x2d, 0xea, 0xba, 0x3e, 0x9f, 0x24, 0xc9, +0x39, 0x00, 0xce, 0xbd, 0x7b, 0xf7, 0x60, 0x18, 0x06, 0x06, 0x06, 0x06, +0x40, 0x08, 0x41, 0x2e, 0x97, 0x93, 0x72, 0x12, 0xbd, 0x7a, 0x7a, 0xe9, +0x98, 0xde, 0x07, 0x4a, 0x37, 0x66, 0xa2, 0x11, 0x14, 0x89, 0x22, 0x0c, +0x43, 0x6c, 0x6f, 0x6f, 0xe3, 0xde, 0xbd, 0x7b, 0x88, 0xe3, 0x38, 0xad, +0xfd, 0xc9, 0x07, 0xda, 0xdc, 0x9d, 0x9d, 0x9d, 0xfd, 0x13, 0x21, 0xe4, +0xaf, 0xa6, 0x69, 0x22, 0x9f, 0xcf, 0x63, 0x6c, 0x6c, 0x0c, 0x83, 0x83, +0x83, 0x32, 0x6b, 0xa8, 0x72, 0xda, 0x6b, 0xd7, 0x21, 0xbd, 0x78, 0x57, +0x81, 0xab, 0x96, 0xdf, 0xd8, 0xd8, 0xc0, 0xe6, 0xe6, 0x26, 0xc2, 0x30, +0xec, 0x59, 0xd8, 0x03, 0x98, 0x76, 0x5d, 0xf7, 0x6f, 0x0f, 0xbc, 0x3b, +0x3d, 0x33, 0x33, 0x73, 0x43, 0xd7, 0xf5, 0x73, 0x62, 0x63, 0xf6, 0xa9, +0xa7, 0x9e, 0x42, 0xa9, 0x54, 0xea, 0x09, 0xc2, 0x74, 0x80, 0xa7, 0xeb, +0x86, 0xda, 0x57, 0xa5, 0xc1, 0x7b, 0x9e, 0x87, 0xb5, 0xb5, 0x35, 0xec, +0xec, 0xec, 0x20, 0x0c, 0x43, 0x79, 0x4d, 0xf7, 0xde, 0xab, 0xae, 0xeb, +0x5e, 0x7c, 0xa8, 0x6f, 0x64, 0xba, 0xae, 0x4f, 0xc6, 0x71, 0xbc, 0xc8, +0x39, 0x3f, 0x4d, 0x29, 0xc5, 0xb7, 0xdf, 0x7e, 0x8b, 0x4a, 0xa5, 0x82, +0x4a, 0xa5, 0x02, 0xcb, 0xb2, 0x90, 0xcb, 0xe5, 0x76, 0x69, 0x5b, 0x6d, +0x7f, 0x05, 0x70, 0x91, 0x61, 0xc4, 0x6c, 0xb7, 0xdb, 0xd8, 0xda, 0xda, +0x42, 0xb5, 0x5a, 0xed, 0xd9, 0xc9, 0x56, 0x2c, 0xdf, 0x17, 0xf8, 0xbe, +0x76, 0xa7, 0xdf, 0x7a, 0xeb, 0x2d, 0x27, 0x49, 0x92, 0x45, 0x5d, 0xd7, +0x4f, 0x8b, 0x34, 0x98, 0xcf, 0xe7, 0x31, 0x3c, 0x3c, 0x0c, 0xc7, 0x71, +0x60, 0xdb, 0xf6, 0xae, 0x54, 0xab, 0x4a, 0x46, 0xfd, 0x4a, 0xd3, 0x6a, +0xb5, 0xd0, 0x6c, 0x36, 0x51, 0xab, 0xd5, 0xa4, 0x5c, 0x44, 0xea, 0x54, +0xe2, 0xa7, 0x6f, 0xf0, 0x7d, 0x6f, 0xaf, 0xcf, 0xcc, 0xcc, 0x38, 0x51, +0x14, 0xdd, 0xd0, 0x34, 0xed, 0xac, 0xa8, 0xa2, 0x22, 0x2b, 0x0d, 0x0c, +0x0c, 0xa0, 0x50, 0x28, 0xa0, 0x58, 0x2c, 0x4a, 0x8f, 0x00, 0x90, 0xa9, +0xb1, 0xd3, 0xe9, 0xc0, 0xf7, 0x7d, 0xb9, 0xf3, 0x16, 0x45, 0x91, 0xf4, +0x44, 0x7a, 0x51, 0x0f, 0x60, 0xce, 0x75, 0xdd, 0xf9, 0x9f, 0xec, 0x2b, +0xe5, 0xa5, 0x4b, 0x97, 0xe6, 0x08, 0x21, 0xb3, 0x6a, 0x55, 0x16, 0x4d, +0x58, 0x96, 0x07, 0xb2, 0xbe, 0x0d, 0xa8, 0x4b, 0x52, 0xc5, 0xea, 0x2b, +0x00, 0x26, 0x5d, 0xd7, 0xbd, 0xf9, 0x93, 0x7f, 0x66, 0x7d, 0xf3, 0xcd, +0x37, 0x4f, 0x13, 0x42, 0x5c, 0x42, 0xc8, 0x84, 0xaa, 0xfb, 0xfd, 0xb6, +0x5c, 0xd2, 0x80, 0x15, 0xe0, 0x0d, 0x00, 0xee, 0x61, 0xad, 0xfe, 0xa3, +0x7c, 0xa5, 0x9c, 0x9e, 0x9e, 0x3e, 0x4b, 0x08, 0x99, 0x24, 0x84, 0x9c, +0x27, 0x84, 0x38, 0x6a, 0x7f, 0x94, 0xb5, 0xef, 0x99, 0x5a, 0x82, 0xde, +0x01, 0xe0, 0xee, 0xd5, 0xa0, 0xfd, 0xcf, 0x3f, 0x74, 0x4f, 0x4f, 0x4f, +0x9f, 0x03, 0x30, 0xde, 0xdd, 0xf6, 0x18, 0xeb, 0x4e, 0x75, 0x15, 0x75, +0xa7, 0x2b, 0x93, 0x45, 0x00, 0x8b, 0xae, 0xeb, 0xae, 0xfe, 0x58, 0x5f, +0xfb, 0xc9, 0x2f, 0xff, 0xec, 0xf1, 0x0b, 0x81, 0x87, 0x1b, 0xff, 0x01, +0x0f, 0xf8, 0x50, 0x14, 0x3e, 0x57, 0xf8, 0x0d, 0x00, 0x00, 0x00, 0x00, +0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, +}; diff --git a/Source/Core/DolphinWX/resources/toolbar_play_dis.xpm b/Source/Core/DolphinWX/resources/toolbar_play_dis.xpm new file mode 100644 index 0000000000..a845bfb44d --- /dev/null +++ b/Source/Core/DolphinWX/resources/toolbar_play_dis.xpm @@ -0,0 +1,136 @@ +/* XPM */ +static char *toolbar_play_dis_xpm[] = { +/* columns rows colors chars-per-pixel */ +"48 48 82 1", +" c #566067", +". c #576168", +"X c #5C666C", +"o c #5E686E", +"O c #5F6A70", +"+ c #616C72", +"@ c #657077", +"# c #66727A", +"$ c #69757C", +"% c #6D787F", +"& c #6B7780", +"* c #6D7A83", +"= c #717D84", +"- c #727F88", +"; c #798287", +": c #74838C", +"> c #768691", +", c #788791", +"< c #7B8B95", +"1 c #7F8E98", +"2 c #838D93", +"3 c #808F98", +"4 c #8A9297", +"5 c #84939D", +"6 c #8C969D", +"7 c #8696A0", +"8 c #8896A0", +"9 c #8B9AA4", +"0 c #8E9EA8", +"q c #939CA2", +"w c #909FA9", +"e c #96A0A6", +"r c #94A2AB", +"t c #9AA6AD", +"y c #9FA8AE", +"u c #97A6B0", +"i c #9DAAB2", +"p c #A1AEB6", +"a c #A5B0B7", +"s c #A6B2BA", +"d c #ABB5BC", +"f c #ACB8BF", +"g c #B1BABF", +"h c #AEB9C1", +"j c #B3BDC5", +"k c #B6C0C7", +"l c #BBC2C6", +"z c #B7C1C8", +"x c #BBC5CB", +"c c #BFC8CF", +"v c #C2C7CB", +"b c #C2C9CE", +"n c #CDCCCC", +"m c #D0CFCF", +"M c #C4CDD3", +"N c #C8CFD5", +"B c #C7D0D5", +"V c #C9D1D7", +"C c #CDD5DB", +"Z c #CFD8DD", +"A c #D4D3D3", +"S c #D1D7DB", +"D c #D2D9DE", +"F c #DCDBDB", +"G c #E0DFDF", +"H c #D6DCE1", +"J c #D8DFE3", +"K c #DCE1E5", +"L c #DFE4E8", +"P c #E3E3E3", +"I c #E8E7E7", +"U c #E1E6E9", +"Y c #E6EAED", +"T c #EAECED", +"R c #EAEEF0", +"E c #EEF1F3", +"W c #F3F4F4", +"Q c #F8F7F7", +"! c #F5F7F8", +"~ c #F7F8F9", +"^ c #FDFEFE", +"/ c None", +/* pixels */ +"////////////////////AAAAAAmn////////////////////", +"////////////////AFPTW~^^^^QWTPAn////////////////", +"//////////////FIW^^^^~WTTW~^^^^WPA//////////////", +"////////////FT^^^TVdr53<<35rdVT^^QIA////////////", +"//////////AI^^^Si1::><111<<>::1iS^^QPn//////////", +"/////////FW^^Sr>>180rttiittr081>>rS^^TA/////////", +"////////P~^Ea,<5rippppppppppppir5<,pW^WA////////", +"///////P^^J9<7rpaaassssssssssaappr5,9J^WF///////", +"//////P^^S55wpssdddfhhhhhhhhfddsssi055S^WA//////", +"/////F~^D57tsdfhhjjjjjjjjjjjjjhhhddst75S^WA/////", +"////AQ^K99idhhjjjkzzxxxxxxxzzzjjjjhfdi88K^Tn////", +"////T^Wt9ihjjjkzxxxxcccccccxxxxxzkjjhhi9rW^G////", +"///G^^j9ijjjzxxccbMMMMMMMMMMMMccxxzzjjhi9j^QA///", +"///W^KwijkzxxcMMMVCVVVVVVVVVVNMMMccxzzjhi0K^I///", +"//P^^dufzxxcMMNVCldDDCCZZCCCCCVVNMMMcxzzdrs^QA//", +"//W^KuszxcMMNVVCHdX2xJDZZZZZZZZCCVVNMcxxkarK^P//", +"/F^^zijccMNVCCZZHgX +qNJDZZZZZZZZCCVVMMcxjiz^Wn/", +"/I^WsxcMMVVCZZZZHgXXX.#yCHDZZZZZZZZZCVNMccxaW^A/", +"/T^JsZCMVCCZZZZZHgXXooX.=dDHDDSZZZZZZCVVMCZsJ^P/", +"/Q^MjHJVCZZZZZSDJjXXooo+oO2jDDDDDZZZZZCVVJHhM^T/", +"F^^xxJKHCZZZZDDSDdXXoo++#$@#6lCCSDSZZZZCHKHxz^Wn", +"F^~zMJKLHCZSDDCBVdXXo++#%**&#%qbCCDDZZCHKKJMj^Qn", +"P^~xVJKLLHZDZVMMCdXXo+#%*-:-*$+%yNCCDZDLKKJNk~~A", +"P^WxVJKLLLHCNMNNCdXXo+#*-:>:=*#O.=sVCHLLKKJVxW^A", +"P^WcVJKLLUUCMNBBCdXXo+$*-:,:-*#+.=sNCLULKKJVxW^A", +"P^~MVJKLLLKLDBNBCdXXo+#&=:::*$+%yBCDKKKLKKJVM~~A", +"P^^NVJKLKJKKUKSNCdXXo+@$**=*#*ebCSKUKJJKKKJVN^QA", +"G^^CMHKKJJKKLUYLJfXXoo+@$$#$6xDHLUULKJHHKKHMC^Wm", +"/Q^HMHKJDHJKLUUYEbXXooo+O+2xKUYTYULKKJHDHKHMH^T/", +"/W^YMDJDDHJKKLUUEbXXooX ;vEWERTYUULKKJHDDJZMY^I/", +"/I^!MCDDDHJKKKUURbXXX $dR!ERTTYUULKKJHHDZDVM!^F/", +"/P^^DMCSDHHJKKLURvX +tL!ERTTYYUUULKKJHHDZCMD^WA/", +"//W^TMCZDDHHKKKLYl.4SWRTTTYYYUUULKKJHHDDCVMT^I//", +"//I^^CNCZDHHJKKKUVlTRYYYYYYUUULLKKJHHDDZCNC^^F//", +"///Q^RMVZDDHHJJKKLYUUUUUUUUUULKKKJHHHDDCVMT^T///", +"///I^^DMCZDDHHJKKKKLLLLULLLLKKKKJHHHDSZCMD^^F///", +"////W^~VBCZDDHHHJKKKKKKKKKKKKKJJHHHDDZCBV~^I////", +"////G^^ENVCZDDHHHJJJKKKKKKKKJJJHHDDDZCVNE^WA////", +"/////I^^TMVCZDDDHHHJJJJJJJJJHHHHDDZZCVMT^~F/////", +"//////T^^TBVCCZDDDHHHHHHHHHHHDDDDZCCVNT^^P//////", +"///////T^^ECNCCZSDDDDHHHHHDDDDDZCCCNCE^^P///////", +"////////T^^~HNVCCZZDDDDDDDDDDZCCCVNH~^~P////////", +"/////////I^^^RDVVCCCCZCZZCZCCCCVVDR^^WF/////////", +"//////////PW^^^RHVVVVCCCCCCVVVVHR^^^TA//////////", +"////////////IQ^^^!TKDCCCCCCDKT!^^^WG////////////", +"//////////////IW^^^^^^~!!~^^^^^~WP//////////////", +"////////////////PIWQ^^^^^^^^QTIF////////////////", +"////////////////////PPPPPPGF////////////////////" +}; diff --git a/Source/Core/DolphinWX/resources/toolbar_plugin_dsp.c b/Source/Core/DolphinWX/resources/toolbar_plugin_dsp.c new file mode 100644 index 0000000000..0f4f24f4e7 --- /dev/null +++ b/Source/Core/DolphinWX/resources/toolbar_plugin_dsp.c @@ -0,0 +1,316 @@ +static const unsigned char toolbar_plugin_dsp_png[] = { +0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, +0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, +0x08, 0x06, 0x00, 0x00, 0x00, 0x57, 0x02, 0xf9, 0x87, 0x00, 0x00, 0x00, +0x04, 0x73, 0x42, 0x49, 0x54, 0x08, 0x08, 0x08, 0x08, 0x7c, 0x08, 0x64, +0x88, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, +0x12, 0x00, 0x00, 0x0b, 0x12, 0x01, 0xd2, 0xdd, 0x7e, 0xfc, 0x00, 0x00, +0x00, 0x25, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, +0x72, 0x65, 0x00, 0x4d, 0x61, 0x63, 0x72, 0x6f, 0x6d, 0x65, 0x64, 0x69, +0x61, 0x20, 0x46, 0x69, 0x72, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, +0x4d, 0x58, 0x20, 0x32, 0x30, 0x30, 0x34, 0x87, 0x76, 0xac, 0xcf, 0x00, +0x00, 0x00, 0x15, 0x74, 0x45, 0x58, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, +0x69, 0x6f, 0x6e, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x00, 0x39, 0x2f, 0x31, +0x31, 0x2f, 0x30, 0x34, 0x0e, 0x46, 0xed, 0x55, 0x00, 0x00, 0x0e, 0x01, +0x49, 0x44, 0x41, 0x54, 0x78, 0x9c, 0xd5, 0x9a, 0x7b, 0x70, 0x5c, 0xd5, +0x7d, 0xc7, 0x3f, 0xe7, 0xde, 0xdd, 0x95, 0xb4, 0xbb, 0xd2, 0x4a, 0xb6, +0x2c, 0xc9, 0xef, 0xb5, 0xc0, 0x74, 0xc0, 0xd8, 0x56, 0xcc, 0x18, 0x4c, +0x93, 0x60, 0xd9, 0xbc, 0xfa, 0x4a, 0x6c, 0x92, 0x29, 0x01, 0x6d, 0x82, +0xe5, 0x96, 0x92, 0xa1, 0x0f, 0x70, 0x28, 0x90, 0x09, 0xc2, 0xb5, 0x5d, +0x10, 0xd3, 0x16, 0x06, 0x1b, 0x48, 0x4a, 0x81, 0x38, 0x36, 0x29, 0x52, +0x5c, 0xc1, 0xd4, 0x40, 0x26, 0x6d, 0x02, 0xd8, 0x96, 0x5d, 0x52, 0x0c, +0x64, 0x40, 0xb6, 0x6c, 0x17, 0xe3, 0x58, 0x92, 0x1d, 0xc9, 0x96, 0x56, +0x5e, 0x69, 0xb5, 0x2b, 0x69, 0x77, 0xa5, 0xbd, 0xe7, 0xf4, 0x8f, 0xfb, +0xd8, 0xab, 0xb5, 0x64, 0x4c, 0xa0, 0x93, 0xe9, 0x6f, 0xe7, 0xce, 0x9e, +0xbd, 0xf7, 0x3c, 0xbe, 0xdf, 0xf3, 0x7b, 0x9c, 0xdf, 0x39, 0x77, 0x85, +0x52, 0x8a, 0xff, 0xcf, 0xe2, 0xb9, 0xd8, 0x8a, 0x91, 0xba, 0xc6, 0x5a, +0xc0, 0xbe, 0x42, 0x40, 0x1c, 0xd8, 0xdc, 0xd4, 0xdc, 0xb0, 0x3f, 0xbf, +0xee, 0x03, 0x0f, 0xfc, 0x6b, 0x58, 0x29, 0x55, 0xab, 0x94, 0x0c, 0x4b, +0xa9, 0x6a, 0x95, 0x92, 0x28, 0xa5, 0x50, 0x4a, 0x22, 0xa5, 0x8a, 0x2b, +0x25, 0xdb, 0xa4, 0x54, 0xad, 0xcf, 0x3e, 0xfb, 0x97, 0xad, 0x9f, 0x95, +0x80, 0xb8, 0x90, 0x06, 0x22, 0x75, 0x8d, 0x61, 0x60, 0x33, 0xb0, 0x06, +0x28, 0xb5, 0x6e, 0x77, 0x01, 0xf5, 0xf9, 0xc0, 0x1f, 0x7a, 0x68, 0x57, +0x8d, 0x52, 0xaa, 0x5e, 0x4a, 0xb9, 0xc6, 0x02, 0xee, 0x06, 0x8d, 0x4d, +0x42, 0xca, 0xf3, 0xc8, 0x3c, 0x25, 0xa5, 0xda, 0xf6, 0xc2, 0x0b, 0xf7, +0xc4, 0x3f, 0x37, 0x02, 0x91, 0xba, 0xc6, 0x52, 0x60, 0x1b, 0xb0, 0x2e, +0xef, 0xd1, 0xe6, 0xa6, 0xe6, 0x86, 0x2d, 0xee, 0x1b, 0x1b, 0x37, 0xbe, +0x5c, 0xaf, 0x94, 0xba, 0x57, 0x4a, 0x59, 0x93, 0x0f, 0x78, 0x32, 0xe0, +0x79, 0x04, 0xec, 0xe7, 0x71, 0x29, 0xe5, 0xfa, 0x1f, 0xfe, 0x70, 0xc3, +0xab, 0x9f, 0x99, 0x40, 0xa4, 0xae, 0x71, 0x2d, 0xb0, 0x83, 0xdc, 0x8c, +0x03, 0xb4, 0x61, 0xce, 0xfa, 0x21, 0x87, 0xc9, 0xe6, 0x7f, 0xaf, 0x97, +0x52, 0x6d, 0x52, 0x4a, 0x86, 0x4d, 0x40, 0x26, 0x38, 0xbf, 0x3f, 0x88, +0xdf, 0x1f, 0xc4, 0xeb, 0xf5, 0xe1, 0xf5, 0xfa, 0x26, 0x00, 0xcd, 0x66, +0xc7, 0x49, 0xa7, 0x53, 0x24, 0x93, 0x09, 0x12, 0x89, 0x41, 0xb2, 0xd9, +0x6c, 0x3e, 0xc1, 0xf5, 0xdb, 0xb7, 0x7f, 0x67, 0xe7, 0x6f, 0x4d, 0x20, +0x52, 0xd7, 0x58, 0x6f, 0x81, 0x77, 0xcb, 0x4e, 0x60, 0x43, 0x53, 0x73, +0xc3, 0x10, 0xc0, 0x23, 0x8f, 0xbc, 0x5e, 0x23, 0xa5, 0xdc, 0xaa, 0x94, +0xac, 0x35, 0x07, 0x56, 0x78, 0x3c, 0x1e, 0xca, 0xca, 0x66, 0xe0, 0xf7, +0x07, 0x29, 0x2b, 0x29, 0x64, 0xe6, 0xf4, 0x00, 0xe5, 0xa1, 0x22, 0x0a, +0xbd, 0x1e, 0x8a, 0xbc, 0x1e, 0x0c, 0x43, 0x21, 0xb3, 0x8a, 0xe8, 0x60, +0x92, 0xc1, 0xc4, 0x28, 0x9d, 0x7d, 0x31, 0x06, 0x92, 0xc3, 0xc4, 0x07, +0x63, 0xf4, 0x9f, 0x8b, 0x5a, 0x24, 0x1d, 0x22, 0xb7, 0xec, 0xd8, 0xf1, +0xb7, 0x17, 0xad, 0x09, 0x87, 0x80, 0x65, 0x36, 0x9d, 0x79, 0x33, 0xbf, +0xa1, 0xa9, 0xb9, 0xe1, 0x29, 0xfb, 0xc7, 0xa3, 0x8f, 0xfe, 0x74, 0x83, +0x52, 0x72, 0xab, 0x3d, 0xa3, 0xba, 0xee, 0x65, 0xda, 0xb4, 0x19, 0x14, +0x17, 0x97, 0x32, 0x7f, 0x76, 0x31, 0x97, 0x57, 0x97, 0x51, 0xe4, 0xf3, +0x20, 0x0d, 0x85, 0xb2, 0x40, 0x4b, 0x43, 0x21, 0xb3, 0xd2, 0x22, 0x21, +0x91, 0x86, 0xc2, 0x30, 0x24, 0xfd, 0x83, 0xc3, 0xb4, 0x75, 0x76, 0x33, +0x98, 0x48, 0xd0, 0x7d, 0xe6, 0x34, 0xa3, 0xa9, 0x51, 0x9b, 0x40, 0x5c, +0x29, 0xb5, 0x60, 0xe7, 0xce, 0xfb, 0x2f, 0xca, 0x27, 0xdc, 0x51, 0xc8, +0xed, 0xa8, 0x60, 0x9a, 0xcc, 0x8b, 0xd6, 0xac, 0x97, 0x0a, 0xc1, 0x0e, +0xa5, 0x58, 0x6b, 0xf2, 0x55, 0x94, 0x95, 0xcd, 0x60, 0xda, 0xb4, 0x4a, +0x16, 0xcc, 0x0b, 0x71, 0xc5, 0xc2, 0x52, 0xfc, 0x85, 0x3a, 0xd2, 0x00, +0x99, 0x55, 0x08, 0x05, 0x3d, 0x7d, 0x49, 0xba, 0x7b, 0x87, 0x88, 0x0d, +0xa5, 0x18, 0x4c, 0x8c, 0x3a, 0xb3, 0x2c, 0xa5, 0xc4, 0xef, 0xf3, 0x50, +0x51, 0x12, 0x64, 0xf1, 0xbc, 0x59, 0xf4, 0x0f, 0x95, 0x50, 0xe8, 0xf3, +0x72, 0xf4, 0xf8, 0x31, 0xb2, 0x46, 0x16, 0x0b, 0xc3, 0x3a, 0xe0, 0xa9, +0x48, 0x5d, 0x63, 0x69, 0x53, 0x73, 0xc3, 0x05, 0x89, 0xb8, 0x09, 0x84, +0x5d, 0xe5, 0x36, 0x1b, 0x3c, 0x80, 0x52, 0x6a, 0x9f, 0x52, 0xd4, 0x00, +0x68, 0x9a, 0x46, 0x55, 0x55, 0x98, 0x8a, 0x8a, 0xe9, 0x2c, 0xaf, 0x99, +0x4e, 0xf9, 0xb4, 0x02, 0x94, 0x02, 0x95, 0x55, 0x8c, 0x67, 0x0d, 0x8e, +0x9f, 0x1c, 0xe0, 0xa3, 0x93, 0x31, 0x0e, 0x1f, 0xfd, 0x25, 0xfd, 0xe7, +0xba, 0xf1, 0x79, 0x0b, 0xf1, 0x79, 0x0b, 0x98, 0x37, 0xf7, 0x0a, 0xfc, +0xfe, 0x10, 0x42, 0x40, 0x7a, 0x6c, 0x9c, 0x33, 0x03, 0x43, 0xf4, 0xc7, +0x93, 0xcc, 0x28, 0x0e, 0x30, 0x3d, 0x58, 0xcc, 0xdc, 0x99, 0xb3, 0xe9, +0xec, 0x3e, 0xe5, 0x68, 0x1e, 0x78, 0x0a, 0x98, 0x1f, 0xa9, 0x6b, 0xfc, +0x10, 0xb8, 0xa5, 0xa9, 0xb9, 0xa1, 0xed, 0x93, 0x08, 0xd4, 0xba, 0xca, +0x8e, 0x0d, 0x6e, 0xd9, 0xb2, 0x7b, 0x0d, 0x98, 0xe0, 0x01, 0xc2, 0xe1, +0xcb, 0x99, 0x3d, 0xab, 0x94, 0x6b, 0xaf, 0x99, 0x8e, 0xd7, 0xa3, 0xa1, +0x14, 0x8c, 0xa7, 0x0c, 0x3e, 0x3a, 0x11, 0xe7, 0xa3, 0x5f, 0xc7, 0xe8, +0xee, 0xe9, 0xe2, 0x3f, 0x7e, 0xfe, 0x1c, 0x89, 0xe4, 0xc0, 0x84, 0x81, +0xde, 0x79, 0xef, 0xa7, 0xd4, 0x2c, 0xb9, 0x9e, 0x9a, 0x25, 0xab, 0x01, +0x10, 0x42, 0xe0, 0xd1, 0x35, 0x52, 0x63, 0xe3, 0x78, 0x75, 0x9d, 0xf9, +0x55, 0xb3, 0x38, 0x13, 0xed, 0x25, 0x95, 0x4e, 0x01, 0x84, 0xef, 0xb8, +0xe3, 0x9f, 0xd6, 0x34, 0x35, 0x37, 0xbc, 0x16, 0xa9, 0x6b, 0x6c, 0x03, +0xf6, 0x45, 0xea, 0x1a, 0x57, 0x4d, 0x46, 0x62, 0xaa, 0x85, 0xcc, 0xa9, +0x28, 0xa5, 0x5a, 0x2b, 0x84, 0x59, 0x0e, 0x85, 0xca, 0x99, 0x3b, 0xbb, +0x8c, 0x2f, 0x7f, 0xb1, 0x1c, 0xa1, 0x0b, 0x40, 0xd1, 0x7b, 0x36, 0xcd, +0xc1, 0xf7, 0xfa, 0x18, 0x1e, 0x19, 0xa3, 0x2f, 0x7a, 0x9a, 0xdd, 0xaf, +0x6f, 0x23, 0x93, 0x49, 0x71, 0xe3, 0xf5, 0xb5, 0xdc, 0x74, 0xe3, 0x6a, +0x96, 0x2c, 0x5e, 0xc4, 0xe1, 0xf6, 0xa3, 0xbc, 0xf1, 0xe6, 0x5e, 0xde, +0xdc, 0xb3, 0x07, 0x80, 0x9a, 0xc5, 0xab, 0x40, 0x81, 0x26, 0x04, 0x1e, +0x4d, 0xc3, 0xa7, 0xe9, 0x68, 0x42, 0x30, 0xa7, 0x72, 0x26, 0x27, 0x4e, +0x75, 0x00, 0xca, 0x9e, 0xd0, 0xd7, 0x30, 0x83, 0xc8, 0x5a, 0x60, 0x2b, +0xb0, 0x2a, 0x1f, 0xa8, 0xe6, 0x2a, 0xd7, 0xb8, 0xca, 0x5d, 0x76, 0x41, +0x29, 0x59, 0x23, 0xa5, 0x19, 0x6d, 0xfc, 0xfe, 0x20, 0x73, 0x67, 0x17, +0x81, 0x00, 0x04, 0x1c, 0x3f, 0x91, 0x60, 0xdf, 0x81, 0x33, 0x8c, 0x8c, +0x8e, 0x03, 0x8a, 0x03, 0x6f, 0xbf, 0x4c, 0x26, 0x93, 0xe2, 0xbe, 0x0d, +0x7f, 0xc5, 0x83, 0xf7, 0xdf, 0xcb, 0xb2, 0x65, 0x4b, 0xf1, 0xfa, 0xbc, +0x2c, 0x5b, 0xb6, 0x94, 0x07, 0xef, 0xbf, 0x97, 0x6f, 0xdf, 0x59, 0x4f, +0xdb, 0xe1, 0x3d, 0x9c, 0xed, 0x3d, 0x89, 0x34, 0x41, 0xa2, 0x09, 0x81, +0xcf, 0xa3, 0x53, 0xe8, 0xf1, 0x52, 0x35, 0xbd, 0xdc, 0x1a, 0x13, 0x2c, +0xd0, 0x34, 0x35, 0x37, 0xbc, 0x86, 0xb9, 0xea, 0xd7, 0x5a, 0x0b, 0xeb, +0x94, 0x04, 0x1c, 0x07, 0x76, 0xc7, 0x7b, 0xa5, 0x54, 0x8d, 0x19, 0xab, +0x25, 0x05, 0x05, 0x85, 0x54, 0x55, 0x16, 0xa1, 0x24, 0x74, 0x74, 0x24, +0xf9, 0xe0, 0x83, 0x18, 0xf6, 0x1a, 0x10, 0xed, 0x3f, 0x4d, 0x77, 0xcf, +0xc7, 0x5c, 0xbb, 0x62, 0x39, 0x7f, 0x70, 0xf3, 0xf5, 0x78, 0x3c, 0x3a, +0x99, 0xcc, 0x18, 0xef, 0xbe, 0xfb, 0x2b, 0x62, 0xb1, 0x01, 0x3c, 0x1e, +0x9d, 0xaf, 0x7f, 0xfd, 0xab, 0x54, 0x56, 0xcc, 0xe0, 0xd8, 0xf1, 0x83, +0xd8, 0x21, 0xd8, 0x24, 0xa1, 0xe1, 0xd3, 0x75, 0x42, 0xfe, 0x00, 0x01, +0x7f, 0xc0, 0x1e, 0x39, 0xfc, 0xcd, 0x6f, 0xfe, 0x83, 0x0d, 0xb8, 0xd5, +0xfa, 0xbe, 0xf7, 0x42, 0x04, 0x26, 0x15, 0x1b, 0xa0, 0x52, 0x8a, 0x60, +0xd0, 0x8f, 0x57, 0x17, 0x28, 0x43, 0x71, 0xfc, 0x78, 0x9c, 0x5c, 0x8e, +0xa3, 0x38, 0xd9, 0x61, 0x72, 0xbe, 0xe1, 0xfa, 0x5a, 0x34, 0x4d, 0x23, +0x95, 0x4a, 0xf3, 0xe7, 0x7f, 0xf1, 0xd7, 0x7c, 0xef, 0xe1, 0xbf, 0xe7, +0xd6, 0xdb, 0xd7, 0x73, 0xb8, 0xfd, 0x18, 0x9a, 0xa6, 0xb1, 0x62, 0xc5, +0x72, 0xfa, 0xa2, 0x9d, 0x48, 0xa5, 0x90, 0x56, 0x5b, 0x21, 0xc0, 0xa3, +0x6b, 0x78, 0x75, 0x9d, 0xe9, 0x25, 0x21, 0x40, 0xd9, 0x5a, 0x58, 0x9a, +0x47, 0x60, 0xed, 0xa7, 0x22, 0xf0, 0xd0, 0x43, 0xbb, 0x56, 0xe6, 0x96, +0x7e, 0x45, 0x49, 0xc0, 0x63, 0xc6, 0x77, 0x03, 0x06, 0x06, 0xd3, 0x4e, +0x58, 0x54, 0x4a, 0xd2, 0xdd, 0xf3, 0x31, 0x00, 0xc1, 0x60, 0x00, 0x81, +0xe0, 0x64, 0x47, 0x27, 0x67, 0x7b, 0xfb, 0x9c, 0xbe, 0x0e, 0x1d, 0x6e, +0x47, 0x58, 0x9f, 0xb1, 0xb1, 0xb4, 0x6b, 0x62, 0x00, 0x05, 0xba, 0x66, +0x6a, 0x61, 0x5a, 0xa8, 0x94, 0xdc, 0xda, 0xaa, 0x6c, 0xb3, 0xb6, 0x09, +0x84, 0xf3, 0xcd, 0xe8, 0x82, 0x04, 0xdc, 0x29, 0x82, 0xae, 0x7b, 0x4c, +0xc0, 0x06, 0x44, 0xa3, 0xa3, 0x0e, 0x70, 0xb7, 0x16, 0x00, 0x86, 0x87, +0x47, 0x50, 0x4a, 0x71, 0x49, 0x75, 0x98, 0x99, 0x55, 0x95, 0x4e, 0x5f, +0x4b, 0x97, 0x2c, 0x46, 0x29, 0xc5, 0xe1, 0xf6, 0xa3, 0x56, 0xdf, 0x12, +0x69, 0xb5, 0x05, 0xd3, 0x17, 0x74, 0x4d, 0x23, 0x58, 0x58, 0x64, 0x8f, +0x8e, 0x1d, 0xba, 0xdd, 0x26, 0x0d, 0xac, 0x74, 0x63, 0xbc, 0x60, 0x3a, +0xad, 0x94, 0xc4, 0xf4, 0x58, 0xf0, 0x78, 0xbc, 0x26, 0x68, 0xc3, 0x5c, +0x5d, 0xdd, 0xc0, 0x95, 0x52, 0xcc, 0x9e, 0xb5, 0x90, 0x9e, 0x33, 0x27, +0xd8, 0xfd, 0xda, 0xcf, 0xf8, 0xd2, 0x17, 0x57, 0x50, 0x58, 0x58, 0xc8, +0xf6, 0xe7, 0x9f, 0xa6, 0xed, 0xf0, 0x51, 0x2e, 0xad, 0x0e, 0x53, 0x5e, +0x5e, 0x4e, 0xcb, 0x2b, 0xbb, 0xe9, 0xe8, 0xec, 0x22, 0x18, 0x28, 0x35, +0x4d, 0x48, 0x82, 0x72, 0x39, 0xb3, 0x47, 0xd3, 0x08, 0x05, 0x82, 0xe4, +0x4c, 0x48, 0xe5, 0xe7, 0x63, 0x35, 0xd6, 0xe5, 0xac, 0x51, 0x93, 0x69, +0xc0, 0x59, 0xf9, 0x72, 0xd9, 0xa2, 0x79, 0x95, 0x97, 0x16, 0x22, 0x0d, +0x45, 0x6c, 0x20, 0x85, 0x94, 0xc6, 0x04, 0x13, 0xfa, 0xbd, 0xcb, 0x96, +0x03, 0x70, 0xe4, 0xc8, 0x31, 0x1e, 0x7f, 0xe2, 0x69, 0x06, 0x87, 0x12, +0xf8, 0x7c, 0x05, 0x5c, 0xb3, 0xfc, 0x2a, 0x7c, 0xbe, 0x02, 0x7e, 0xf4, +0x62, 0x13, 0xff, 0xf2, 0xbc, 0x99, 0x66, 0x5d, 0xf5, 0x85, 0x9b, 0xcd, +0xc5, 0x0f, 0xe9, 0xf8, 0x80, 0x86, 0x40, 0x17, 0x1a, 0xba, 0x26, 0xd0, +0x35, 0x1d, 0x57, 0x28, 0xcd, 0xc7, 0xe5, 0x8e, 0x96, 0x13, 0x34, 0x10, +0xc7, 0x8c, 0x44, 0x0e, 0x6b, 0xc7, 0x46, 0x2d, 0x32, 0xd2, 0x30, 0x73, +0x99, 0x4c, 0x26, 0x6b, 0x01, 0xc7, 0x9a, 0x2d, 0x45, 0xc0, 0x5f, 0xca, +0xaa, 0xeb, 0x6e, 0x67, 0xdf, 0x81, 0x9f, 0xf0, 0xd6, 0xde, 0xfd, 0xbc, +0x73, 0xf0, 0x7d, 0xaa, 0xab, 0xc3, 0x00, 0xb4, 0x1f, 0x39, 0xe6, 0x0c, +0x72, 0xed, 0x35, 0x6b, 0x99, 0x3d, 0xeb, 0x32, 0xa7, 0x6f, 0xdb, 0x07, +0x84, 0x10, 0x26, 0x78, 0xa1, 0x51, 0x1c, 0x08, 0x10, 0x8b, 0xc7, 0x1d, +0xf3, 0xb2, 0xa4, 0xd5, 0x22, 0x34, 0x25, 0x81, 0xb6, 0x3c, 0xc6, 0x96, +0x09, 0x01, 0x88, 0x5c, 0x2e, 0x63, 0x27, 0x68, 0x52, 0x62, 0xab, 0xda, +0x36, 0xa3, 0x85, 0x97, 0x5e, 0x45, 0x20, 0x10, 0xe2, 0x9d, 0x77, 0x5f, +0x27, 0x36, 0x70, 0xc6, 0x01, 0xee, 0xf3, 0x15, 0x32, 0x77, 0xce, 0xe5, +0x2c, 0x59, 0xb4, 0x92, 0xa2, 0xa2, 0x12, 0xab, 0x5f, 0x13, 0xbd, 0xb0, +0x4c, 0x48, 0x60, 0x9a, 0x91, 0x26, 0xac, 0x45, 0x86, 0x29, 0x37, 0x5a, +0x6e, 0xb3, 0xba, 0xb0, 0x0f, 0x48, 0x69, 0xaa, 0x17, 0x94, 0xe5, 0xc0, +0x39, 0xf0, 0x39, 0x02, 0x39, 0x07, 0x56, 0x4a, 0x51, 0x59, 0x11, 0x66, +0xcd, 0x9f, 0xfc, 0x0d, 0xc9, 0xe1, 0x41, 0x92, 0xc9, 0x01, 0xbc, 0xde, +0x02, 0x4a, 0x43, 0x95, 0x8e, 0x19, 0xda, 0x3b, 0x35, 0xab, 0x57, 0x07, +0xa6, 0x10, 0x20, 0x94, 0x49, 0x20, 0xa7, 0x1d, 0xc5, 0x6d, 0xb7, 0x3d, +0xb2, 0x72, 0xd7, 0xae, 0x8d, 0xfb, 0x71, 0x65, 0x07, 0x91, 0xba, 0xc6, +0x95, 0xf6, 0x8e, 0xf0, 0x13, 0x9c, 0x58, 0xc5, 0x27, 0x33, 0x21, 0x69, +0x48, 0xa4, 0x34, 0x1c, 0xd0, 0xf9, 0x9a, 0x50, 0x4a, 0x72, 0xee, 0x5c, +0x0f, 0xa7, 0xbb, 0x8f, 0x31, 0x3c, 0x3c, 0xe8, 0xd4, 0x2b, 0x2b, 0xad, +0x64, 0xf6, 0xac, 0xcb, 0x98, 0x51, 0x3e, 0xcf, 0xb9, 0xa7, 0xa4, 0x34, +0x17, 0x76, 0x21, 0xd0, 0x04, 0x68, 0x9a, 0xc0, 0x5f, 0x58, 0x48, 0xcc, +0xd5, 0xa7, 0x25, 0x93, 0x66, 0xa5, 0x6e, 0x27, 0x76, 0x33, 0x2c, 0x05, +0xd8, 0xba, 0x75, 0xfd, 0x21, 0x3b, 0xda, 0x8c, 0x8d, 0x65, 0xe8, 0x8d, +0x25, 0xcd, 0x9c, 0x5e, 0xda, 0x97, 0x31, 0xa1, 0xac, 0x94, 0xe4, 0xd4, +0xe9, 0x23, 0xbc, 0xb2, 0xfb, 0x71, 0xf6, 0x1d, 0x68, 0xe2, 0x64, 0xc7, +0x87, 0xf4, 0x45, 0xbb, 0xe8, 0x8b, 0x76, 0x11, 0xed, 0x3f, 0xc5, 0xf1, +0x13, 0xef, 0xb1, 0x77, 0xff, 0x4b, 0xec, 0x3b, 0xf0, 0x12, 0xc3, 0x23, +0x39, 0x1b, 0x17, 0x42, 0x59, 0x24, 0x4c, 0xe3, 0x29, 0xf4, 0x15, 0x38, +0x13, 0x33, 0x85, 0x38, 0x7e, 0x90, 0xef, 0xc4, 0xb6, 0x2c, 0x05, 0xf6, +0xbb, 0x67, 0x78, 0x7c, 0x3c, 0x93, 0x67, 0x46, 0x86, 0x5b, 0x53, 0x80, +0xe2, 0xc3, 0x43, 0x7b, 0x38, 0xd4, 0xbe, 0x0f, 0x80, 0x40, 0x20, 0xc0, +0x4d, 0x37, 0xac, 0xe2, 0xf7, 0xaf, 0xbd, 0x9a, 0xea, 0xea, 0x30, 0x7d, +0x7d, 0x51, 0x4e, 0x76, 0x74, 0xf1, 0xe6, 0x5b, 0xfb, 0x38, 0xdc, 0x7e, +0x94, 0x5f, 0xec, 0xd9, 0xce, 0x1f, 0xaf, 0xbe, 0x83, 0x72, 0xff, 0xa5, +0x08, 0x4c, 0xd3, 0x31, 0x94, 0x49, 0xc4, 0x6d, 0x42, 0x53, 0x1c, 0x3a, +0x38, 0x7e, 0xe0, 0x26, 0xd0, 0x35, 0x59, 0x4d, 0xf7, 0x5a, 0xa0, 0xa4, +0x81, 0x34, 0xa4, 0xf9, 0x2d, 0x6d, 0x07, 0x37, 0x07, 0x3b, 0xd4, 0xbe, +0xd7, 0x01, 0xbf, 0x64, 0xf1, 0x22, 0x36, 0xfd, 0xdd, 0x77, 0x29, 0x29, +0x2e, 0x46, 0x08, 0x81, 0x00, 0x42, 0xa1, 0x12, 0x16, 0x5e, 0x7a, 0x09, +0x37, 0xdd, 0xb8, 0x8a, 0x5f, 0xbc, 0xb1, 0x97, 0x27, 0xb7, 0xfd, 0x80, +0xb7, 0xde, 0x7e, 0x99, 0xf0, 0xd7, 0x36, 0xa0, 0x89, 0x90, 0xe3, 0xc4, +0x00, 0xa3, 0xe9, 0x14, 0xf9, 0xb3, 0xdf, 0xd4, 0xdc, 0xb0, 0x3f, 0x52, +0xd7, 0x78, 0x1e, 0x3e, 0xb7, 0x09, 0xb9, 0x09, 0x84, 0xed, 0x82, 0x94, +0xaa, 0xcd, 0x36, 0x93, 0x74, 0x26, 0x8b, 0xcc, 0x2a, 0x8a, 0x0b, 0x0b, +0x26, 0x98, 0xd0, 0xd9, 0xde, 0x0e, 0x07, 0x7c, 0x75, 0x75, 0x98, 0x27, +0xfe, 0xf1, 0x11, 0x42, 0x25, 0x25, 0xe8, 0xba, 0x8e, 0x47, 0xd7, 0xd1, +0x3d, 0x1e, 0xeb, 0x5b, 0x47, 0xd7, 0x74, 0x6e, 0xbe, 0x69, 0x35, 0x77, +0xdd, 0x59, 0xcf, 0xf0, 0x48, 0x9c, 0x5f, 0x7e, 0xb8, 0x07, 0x5d, 0x13, +0x08, 0xcb, 0x79, 0x0d, 0x29, 0x19, 0x4d, 0xa7, 0x2e, 0x34, 0xfb, 0x9f, +0x8e, 0x80, 0xe9, 0xc8, 0x66, 0x67, 0x67, 0xfa, 0xfb, 0x31, 0x0c, 0x89, +0x2e, 0xb4, 0x09, 0xf6, 0x7f, 0xf8, 0xc8, 0x3e, 0xa7, 0xe1, 0xe6, 0x87, +0xbf, 0x8b, 0xa6, 0x69, 0xe8, 0x9a, 0x86, 0x6e, 0x81, 0xf6, 0xe8, 0xba, +0x59, 0xd6, 0x75, 0x74, 0x5d, 0x43, 0xd7, 0x74, 0xbe, 0x76, 0xcb, 0x57, +0xa8, 0xac, 0x98, 0x41, 0xfb, 0xc7, 0xbf, 0x22, 0x33, 0x96, 0x46, 0x58, +0xa1, 0x53, 0x2a, 0x75, 0x31, 0xe0, 0x1d, 0x7c, 0x0e, 0x81, 0xa6, 0xe6, +0x86, 0x53, 0x93, 0x55, 0x50, 0x4a, 0x76, 0xe5, 0x8e, 0x3e, 0x0c, 0x27, +0x0a, 0xd9, 0xeb, 0x42, 0x6c, 0xe0, 0x0c, 0x7d, 0x51, 0x93, 0xfb, 0x0d, +0xd7, 0xd7, 0x52, 0x35, 0xb3, 0x12, 0xa1, 0x09, 0x33, 0x23, 0x1d, 0x4d, +0xd1, 0xb0, 0xf1, 0x51, 0xbe, 0x54, 0xfb, 0x87, 0x7c, 0x79, 0xd5, 0x1f, +0xf1, 0xfd, 0x7f, 0x7e, 0x01, 0x4d, 0xd3, 0xcc, 0xe7, 0x42, 0xb0, 0x62, +0xc5, 0x72, 0xd2, 0x63, 0x29, 0x3a, 0xba, 0x4f, 0x58, 0xe1, 0x13, 0x2b, +0x18, 0x7c, 0xe2, 0xc4, 0x9f, 0x4f, 0xc0, 0x92, 0xd6, 0xfc, 0x0a, 0x52, +0xaa, 0x2e, 0x3b, 0x34, 0xa6, 0xd3, 0x29, 0x06, 0x12, 0x23, 0xe8, 0x42, +0x38, 0x26, 0x64, 0x83, 0x07, 0xd3, 0xf6, 0x6d, 0x87, 0x14, 0x9a, 0xc6, +0x33, 0x3f, 0x78, 0x9e, 0x03, 0xff, 0xf5, 0xdf, 0xce, 0xf3, 0x97, 0x5f, +0x79, 0x95, 0x9d, 0x3f, 0xfe, 0x89, 0xe9, 0x17, 0x42, 0x50, 0x55, 0x51, +0x01, 0x40, 0x4f, 0xff, 0x6f, 0x10, 0x02, 0xc7, 0x84, 0x52, 0xe9, 0x51, +0x37, 0xa6, 0x0b, 0x6e, 0xea, 0xf3, 0x09, 0xd8, 0xa1, 0xb4, 0xd6, 0xbe, +0xa1, 0x94, 0x6a, 0xb3, 0x77, 0x64, 0xd9, 0x6c, 0x96, 0x74, 0x66, 0x8c, +0xe2, 0x82, 0x02, 0x27, 0x6c, 0x0e, 0x8f, 0xe4, 0xfa, 0xaf, 0xac, 0xac, +0xb0, 0xfd, 0x1d, 0x01, 0xfc, 0xec, 0x3f, 0xdf, 0x38, 0x6f, 0xc0, 0xb6, +0x43, 0xed, 0x4e, 0x39, 0x10, 0x34, 0x37, 0x2f, 0x42, 0x68, 0x96, 0x01, +0x59, 0x04, 0x32, 0x19, 0xa7, 0x4e, 0x4b, 0xcb, 0xa6, 0x43, 0x90, 0x0b, +0xed, 0x17, 0x4b, 0xc0, 0x69, 0x90, 0x33, 0x21, 0x49, 0x2a, 0x35, 0x42, +0xdf, 0x60, 0x02, 0x69, 0x48, 0x8a, 0xbc, 0x66, 0x7a, 0x1d, 0x8f, 0xf7, +0xe6, 0x5a, 0x9b, 0x19, 0x1a, 0xca, 0x24, 0xce, 0xc2, 0x85, 0x97, 0x9c, +0x37, 0x60, 0x30, 0x18, 0xb0, 0xea, 0x28, 0x4e, 0x76, 0x74, 0x02, 0xa0, +0x5b, 0x1a, 0x31, 0xa4, 0x24, 0x3d, 0x36, 0x36, 0x19, 0x4e, 0xc8, 0x6d, +0x6e, 0x2e, 0x8e, 0x80, 0xdd, 0xe0, 0xf9, 0xe7, 0xef, 0x39, 0x64, 0x3b, +0x55, 0x26, 0x93, 0x66, 0x38, 0x95, 0xc6, 0xc8, 0x4a, 0x0a, 0x3c, 0x5e, +0xa4, 0x34, 0x28, 0x9f, 0x3e, 0xd7, 0x69, 0x70, 0xb8, 0xfd, 0xa8, 0xe9, +0x84, 0x96, 0xc6, 0xfe, 0x6c, 0x5d, 0xe4, 0x3c, 0xf0, 0xf5, 0xdf, 0xba, +0xdd, 0x49, 0xc5, 0xdf, 0x39, 0xf8, 0x3e, 0x00, 0xc5, 0xfe, 0x20, 0x00, +0x86, 0x94, 0xc4, 0x92, 0x09, 0x77, 0x93, 0xae, 0x29, 0xc8, 0x38, 0xf7, +0x27, 0x10, 0xb0, 0x36, 0x0e, 0xb6, 0x4d, 0xd4, 0xda, 0xf7, 0xa5, 0x94, +0x6d, 0x52, 0x4a, 0xb2, 0xd9, 0x2c, 0x67, 0x62, 0x31, 0x0c, 0x4b, 0x03, +0x4a, 0x29, 0xfc, 0x45, 0x25, 0x4e, 0xfb, 0x37, 0xf7, 0xb4, 0xa2, 0x64, +0x6e, 0xa5, 0xbe, 0x76, 0xc5, 0xd5, 0xfc, 0xe8, 0x85, 0xef, 0xb3, 0xbe, +0x3e, 0xc2, 0xfa, 0x75, 0x11, 0xb6, 0x3f, 0xf7, 0x34, 0xe1, 0x05, 0xf3, +0x91, 0x52, 0xf1, 0xe3, 0x97, 0xfe, 0x8d, 0x68, 0xb4, 0x1f, 0x80, 0x6b, +0x2e, 0xbf, 0xda, 0x5c, 0xed, 0xb3, 0x59, 0xfa, 0xe3, 0x83, 0xbf, 0x3d, +0x01, 0x4b, 0xec, 0x33, 0x21, 0x87, 0x80, 0x52, 0xaa, 0xcd, 0xd6, 0xc2, +0xc0, 0x50, 0x9c, 0xf1, 0xb1, 0x2c, 0xd3, 0xfc, 0x7e, 0x7c, 0x9a, 0xce, +0xfc, 0x59, 0x0b, 0x9d, 0x86, 0xd1, 0x68, 0x3f, 0x8f, 0x3f, 0xf9, 0x0c, +0x86, 0x94, 0x18, 0x86, 0x81, 0x61, 0x18, 0x84, 0xc3, 0xf3, 0xb8, 0x23, +0xf2, 0x0d, 0xbe, 0x15, 0xf9, 0x06, 0xe5, 0xe5, 0xe5, 0x48, 0x43, 0xf2, +0xf3, 0x37, 0xf6, 0xd0, 0xd4, 0xdc, 0x02, 0xc0, 0x95, 0x0b, 0x16, 0x51, +0x35, 0xad, 0x92, 0xac, 0x94, 0x64, 0xb2, 0xe3, 0xc4, 0xa7, 0xd6, 0xc0, +0x84, 0x34, 0xda, 0x96, 0xc9, 0x92, 0xb9, 0x56, 0xa0, 0x3e, 0x8f, 0x80, +0x7d, 0x8f, 0x74, 0x3a, 0x45, 0xdf, 0x50, 0x82, 0xb2, 0x22, 0x3f, 0xc1, +0x02, 0x1f, 0xa2, 0xb0, 0x80, 0x65, 0x8b, 0xae, 0xe3, 0x83, 0xa3, 0x07, +0x00, 0xd8, 0xb3, 0x77, 0x3f, 0x23, 0x23, 0xa3, 0xdc, 0x7d, 0xd7, 0x7a, +0x66, 0xce, 0xac, 0x42, 0x48, 0xe1, 0x64, 0xc7, 0x67, 0x7b, 0xfb, 0x78, +0xf6, 0xb9, 0xed, 0x8e, 0xe9, 0x04, 0x0a, 0x03, 0x7c, 0xfb, 0x2b, 0x77, +0x9a, 0xe6, 0x39, 0x3e, 0x4e, 0x6a, 0x6c, 0x9c, 0xd8, 0xd4, 0x1a, 0x70, +0x3b, 0xb1, 0x13, 0x39, 0xce, 0x23, 0xd0, 0xd4, 0xdc, 0xf0, 0x62, 0xa4, +0xae, 0x71, 0x1b, 0x50, 0x6a, 0xa7, 0xad, 0x4a, 0xc9, 0x56, 0xfb, 0x79, +0x32, 0x99, 0x60, 0x60, 0x38, 0xc1, 0x82, 0xf2, 0x6a, 0x4a, 0x8b, 0xfc, +0x78, 0x75, 0x9d, 0xda, 0x65, 0xab, 0xe9, 0x3e, 0x7b, 0x82, 0xe8, 0xc0, +0x59, 0x00, 0x0e, 0xbe, 0xfb, 0x3e, 0x07, 0xdf, 0x7d, 0x9f, 0xc5, 0x57, +0x5e, 0xc1, 0x92, 0x25, 0x8b, 0xe8, 0xeb, 0xeb, 0xa7, 0xa3, 0xa3, 0x8b, +0x8e, 0xce, 0x1c, 0x9e, 0x40, 0x61, 0x80, 0x27, 0xee, 0x7e, 0x8c, 0x79, +0x15, 0xf3, 0x18, 0x4a, 0x8d, 0x32, 0x32, 0x96, 0xa1, 0xab, 0xef, 0x2c, +0x59, 0xc3, 0x70, 0xc3, 0x69, 0x75, 0x95, 0xdd, 0x1a, 0x70, 0x7c, 0x75, +0xaa, 0x4d, 0xbd, 0x6d, 0x46, 0x6b, 0x01, 0x76, 0xee, 0x7c, 0xe0, 0x94, +0x94, 0xaa, 0x4b, 0x4a, 0x45, 0xd6, 0x30, 0xf8, 0xb8, 0xa7, 0x9b, 0xac, +0x21, 0x99, 0x53, 0x36, 0x8d, 0xe9, 0xc1, 0x20, 0xf3, 0xcb, 0x2b, 0xb9, +0xef, 0xb6, 0x07, 0xb9, 0x74, 0xce, 0x65, 0x13, 0x3a, 0x69, 0x3f, 0x72, +0x8c, 0xa6, 0xe6, 0x97, 0x79, 0x6b, 0x4f, 0xeb, 0x04, 0xf0, 0xd5, 0x33, +0x17, 0xf0, 0xc4, 0xdd, 0x8f, 0x11, 0xae, 0x0a, 0x93, 0x1a, 0x1f, 0x23, +0x91, 0x4a, 0x91, 0x18, 0x1d, 0xa5, 0x3b, 0xda, 0x4b, 0x9e, 0xb8, 0x83, +0x8a, 0x9b, 0x80, 0xa3, 0x81, 0xa9, 0x08, 0x6c, 0x76, 0x13, 0x00, 0x50, +0x4a, 0xbd, 0x6a, 0xfb, 0xc1, 0xb9, 0xc1, 0x73, 0x9c, 0x1d, 0x1c, 0x20, +0xe4, 0x2f, 0xc2, 0xab, 0xe9, 0x14, 0x79, 0x7d, 0x54, 0x86, 0xca, 0xd8, +0xb8, 0xee, 0x61, 0xee, 0xfa, 0xea, 0x5d, 0xcc, 0xaf, 0x9a, 0x3f, 0x69, +0xa7, 0x2b, 0xae, 0xb8, 0x9a, 0xfb, 0xfe, 0xf4, 0x1e, 0x9e, 0xb9, 0xe7, +0x49, 0x66, 0xcf, 0x98, 0x43, 0x22, 0x35, 0x4a, 0x6c, 0x78, 0x98, 0x73, +0xc3, 0x49, 0x8e, 0xf7, 0xfc, 0x86, 0x9e, 0x68, 0x9f, 0xbb, 0x7a, 0x57, +0x4b, 0xcb, 0xa6, 0x21, 0x70, 0x42, 0x7a, 0xd8, 0x7e, 0xe0, 0x3e, 0xa5, +0x98, 0x74, 0x43, 0xd3, 0xd4, 0xdc, 0x70, 0x2a, 0x52, 0xd7, 0xb8, 0x19, +0xd8, 0x1c, 0xa9, 0x6b, 0x5c, 0xd7, 0xd4, 0xdc, 0xf0, 0xa2, 0x52, 0x72, +0x27, 0xe6, 0xa9, 0x31, 0xf1, 0x44, 0x92, 0xb7, 0xff, 0xe7, 0x08, 0xab, +0x97, 0xd4, 0x90, 0x19, 0x1f, 0x47, 0xd7, 0x34, 0x84, 0x10, 0x78, 0x85, +0xe0, 0xba, 0xa5, 0xd7, 0xb1, 0xea, 0x0b, 0xb5, 0xa4, 0x33, 0x29, 0x4e, +0xf7, 0x9d, 0x46, 0x58, 0x49, 0xfe, 0x95, 0xe1, 0x45, 0x28, 0xcc, 0xf0, +0x9a, 0x48, 0xa5, 0x48, 0x8f, 0x8f, 0x91, 0x4c, 0xa7, 0x19, 0x1c, 0x1d, +0xe1, 0xc3, 0x93, 0x1f, 0xf3, 0x51, 0xe7, 0xc9, 0x7c, 0x18, 0xee, 0x97, +0x1c, 0xee, 0xa3, 0x94, 0x56, 0x77, 0xa5, 0x29, 0x77, 0x64, 0x4d, 0xcd, +0x0d, 0x5b, 0xac, 0xf4, 0xb5, 0x1e, 0x78, 0xf1, 0xa5, 0x97, 0xbe, 0x77, +0x28, 0x12, 0x79, 0xac, 0x55, 0x29, 0x6a, 0x41, 0x71, 0xe2, 0x74, 0x27, +0xbd, 0xb1, 0x28, 0xe1, 0xaa, 0xd9, 0x84, 0x2b, 0x67, 0x32, 0xbd, 0xb8, +0x98, 0x02, 0x8f, 0x17, 0xaf, 0x47, 0xc7, 0xa3, 0xe9, 0xe8, 0x9a, 0xc6, +0x9c, 0xca, 0xb0, 0x99, 0x65, 0x02, 0x03, 0x23, 0x49, 0xb2, 0x86, 0x64, +0xdc, 0xc8, 0x92, 0x1e, 0x1f, 0x27, 0x91, 0x1a, 0xe5, 0xd7, 0x67, 0x7a, +0x38, 0x7e, 0xaa, 0x8b, 0xc4, 0x48, 0x72, 0x32, 0x08, 0x6e, 0xa0, 0xee, +0x13, 0xb9, 0x09, 0x27, 0xd4, 0x17, 0x7c, 0x4b, 0x09, 0x10, 0xa9, 0x6b, +0x0c, 0x59, 0x84, 0x86, 0x6e, 0xbf, 0xfd, 0xd1, 0x95, 0xf9, 0x33, 0x60, +0xb7, 0xf7, 0x7a, 0x3c, 0x84, 0x82, 0xc5, 0x94, 0x15, 0x97, 0x50, 0xe0, +0xf5, 0xa1, 0x09, 0x41, 0x45, 0xd9, 0x34, 0xa7, 0x5e, 0xdf, 0x60, 0x0c, +0x29, 0x15, 0xc3, 0xa9, 0x11, 0x06, 0x12, 0x49, 0x86, 0x86, 0x27, 0x84, +0xcb, 0x7c, 0xe9, 0x6a, 0x69, 0xd9, 0xb4, 0xc0, 0x1a, 0xbf, 0x14, 0x70, +0x87, 0xa6, 0x5a, 0xf7, 0x1b, 0xd2, 0x4f, 0x24, 0x90, 0x2f, 0xb7, 0xdd, +0xf6, 0xc8, 0x0e, 0xac, 0x90, 0x9a, 0xdf, 0xf6, 0x73, 0x7c, 0x69, 0xbe, +0xb6, 0xa5, 0x65, 0xd3, 0x6b, 0x00, 0x91, 0xba, 0xc6, 0xdd, 0xe4, 0x34, +0xd0, 0xd5, 0xd4, 0xdc, 0xb0, 0xc0, 0x5d, 0xf1, 0x13, 0x0f, 0x77, 0xf3, +0x65, 0xd7, 0xae, 0x8d, 0xeb, 0xa5, 0x94, 0x9b, 0xa5, 0x94, 0x5d, 0xee, +0x93, 0xb9, 0xcf, 0x09, 0x7c, 0x1c, 0xa8, 0x77, 0x81, 0xdf, 0xc1, 0x44, +0xf3, 0xd9, 0x90, 0xdf, 0xe0, 0x53, 0x6b, 0xc0, 0x2d, 0xb7, 0xde, 0xba, +0x65, 0x0d, 0xb9, 0xb7, 0xf7, 0x93, 0xae, 0x94, 0x17, 0x29, 0x71, 0x4c, +0xa7, 0xdd, 0xdc, 0xd2, 0xb2, 0xe9, 0x94, 0x75, 0x80, 0xbb, 0x83, 0x89, +0xe7, 0x54, 0xdb, 0x9a, 0x9a, 0x1b, 0xbe, 0x93, 0xdf, 0xf0, 0x33, 0x11, +0x70, 0xcb, 0xad, 0xb7, 0x6e, 0x09, 0x91, 0x3b, 0xbb, 0x2c, 0x75, 0x0d, +0x6e, 0xff, 0x76, 0x83, 0xb5, 0x1d, 0xb1, 0xd5, 0x2a, 0xb7, 0xb6, 0xb4, +0x6c, 0x1a, 0xb2, 0xec, 0x7d, 0x03, 0xe6, 0x7b, 0x80, 0x52, 0x57, 0xfd, +0x0d, 0xee, 0x77, 0x76, 0xff, 0x27, 0x04, 0x3e, 0x8b, 0x5c, 0x00, 0xf8, +0xab, 0x98, 0xff, 0x0e, 0x38, 0x35, 0x55, 0xdb, 0xdf, 0x39, 0x01, 0xeb, +0xe5, 0xba, 0xfd, 0x97, 0x86, 0x2e, 0xeb, 0x6a, 0x9d, 0xec, 0x4f, 0x24, +0x93, 0xc9, 0xef, 0x9c, 0xc0, 0x67, 0x95, 0xff, 0x05, 0x96, 0xea, 0xa2, +0x83, 0x62, 0xef, 0x6d, 0x06, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, +0x44, 0xae, 0x42, 0x60, 0x82, +}; diff --git a/Source/Core/DolphinWX/resources/toolbar_plugin_dsp.xpm b/Source/Core/DolphinWX/resources/toolbar_plugin_dsp.xpm new file mode 100644 index 0000000000..4ffe29b1da --- /dev/null +++ b/Source/Core/DolphinWX/resources/toolbar_plugin_dsp.xpm @@ -0,0 +1,303 @@ +/* XPM */ +static char *toolbar_plugin_dsp_xpm[] = { +/* columns rows colors chars-per-pixel */ +"48 48 249 2", +" c #3C3937", +". c #3F3C3A", +"X c #413E3C", +"o c #44413F", +"O c #464341", +"+ c #4A4745", +"@ c #4B4846", +"# c #4D4C4A", +"$ c #524F4E", +"% c #545252", +"& c #595655", +"* c #5A5857", +"= c #575959", +"- c #5D5C5B", +"; c #7D4945", +": c #7D504E", +"> c #615F5E", +", c #7C5856", +"< c #745D5B", +"1 c #7B5D5A", +"2 c #62605F", +"3 c #6F605D", +"4 c #7F605E", +"5 c #5F6363", +"6 c #656564", +"7 c #686665", +"8 c #6A6867", +"9 c #6C6B6A", +"0 c #746564", +"q c #796462", +"w c #736D6B", +"e c #7B6B6A", +"r c #67706F", +"t c #73706F", +"y c #6E7575", +"u c #747372", +"i c #7A7574", +"p c #757877", +"a c #7A7877", +"s c #777D7C", +"d c #7C7C7C", +"f c #9D1B14", +"g c #9B1E18", +"h c #A3170F", +"j c #A41A12", +"k c #AC1911", +"l c #A11F18", +"z c #B41B13", +"x c #BB1E15", +"c c #95241D", +"v c #9C221B", +"b c #BC2017", +"n c #B5251E", +"m c #BC231B", +"M c #9C2620", +"N c #952A24", +"B c #992A24", +"V c #962D28", +"C c #9D2F29", +"Z c #96322C", +"A c #9C332D", +"S c #943732", +"D c #9A3630", +"F c #933A35", +"G c #9E3934", +"H c #953F3A", +"J c #9B3F39", +"K c #A62D26", +"L c #AC2B23", +"P c #A22F29", +"I c #B42B24", +"U c #A6352E", +"Y c #AA332D", +"T c #B1312B", +"R c #A93630", +"E c #A23C35", +"W c #AA3B35", +"Q c #A43E38", +"! c #C11F17", +"~ c #C12017", +"^ c #C12119", +"/ c #8B413D", +"( c #9A413C", +") c #A3423D", +"_ c #A9413B", +"` c #884440", +"' c #834A46", +"] c #844F4C", +"[ c #9A4741", +"{ c #964A46", +"} c #9B4944", +"| c #9B4E49", +" . c #8C504C", +".. c #93524F", +"X. c #9A514D", +"o. c #825654", +"O. c #8D5653", +"+. c #965551", +"@. c #9D5753", +"#. c #9F5955", +"$. c #975E5A", +"%. c #995F5C", +"&. c #A44742", +"*. c #A34944", +"=. c #A34E49", +"-. c #AC4E48", +";. c #B14F4A", +":. c #A2524D", +">. c #A9524D", +",. c #A55954", +"<. c #A95F5B", +"1. c #93625F", +"2. c #9C615E", +"3. c #A9625E", +"4. c #B6625D", +"5. c #806562", +"6. c #826866", +"7. c #896966", +"8. c #866D6C", +"9. c #8C6B69", +"0. c #9C6562", +"q. c #9F6F6C", +"w. c #84716F", +"e. c #8C706E", +"r. c #9D716E", +"t. c #857270", +"y. c #8D7775", +"u. c #817F7E", +"i. c #897C7B", +"p. c #937B79", +"a. c #A36461", +"s. c #AB6662", +"d. c #A06966", +"f. c #AA6964", +"g. c #A76E6B", +"h. c #B06B66", +"j. c #B26D69", +"k. c #A6716E", +"l. c #AC716E", +"z. c #A17572", +"x. c #AC7672", +"c. c #AC7A76", +"v. c #AA7E7B", +"b. c #B17773", +"n. c #BC7C79", +"m. c #C1716C", +"M. c #7C807F", +"N. c #82807F", +"B. c #A5807D", +"V. c #AB817F", +"C. c #B3807C", +"Z. c #7D8382", +"A. c #848483", +"S. c #888685", +"D. c #848887", +"F. c #8A8887", +"G. c #868B8A", +"H. c #8D8B8A", +"J. c #9B8583", +"K. c #908F8E", +"L. c #91908F", +"P. c #98908F", +"I. c #8D9494", +"U. c #959493", +"Y. c #989695", +"T. c #949897", +"R. c #999897", +"E. c #959B9A", +"W. c #9C9C9B", +"Q. c #A28482", +"!. c #AB8583", +"~. c #AB8987", +"^. c #A78B89", +"/. c #B58784", +"(. c #B98682", +"). c #B28986", +"_. c #B38F8D", +"`. c #BA8F8C", +"'. c #A9918F", +"]. c #B2918E", +"[. c #A79694", +"{. c #AC9594", +"}. c #AB9896", +"|. c #A19F9E", +" X c #AA9C9B", +".X c #B39592", +"XX c #BA9491", +"oX c #B89A97", +"OX c #B49D9B", +"+X c #BA9B99", +"@X c #A1A09F", +"#X c #B5A19F", +"$X c #BBA09E", +"%X c #9DA3A3", +"&X c #A5A4A3", +"*X c #ABA6A5", +"=X c #A5A8A7", +"-X c #A9A8A7", +";X c #A5ABAA", +":X c #ACABAB", +">X c #BEA5A3", +",X c #B1AEAD", +"XkXkX0XA.dXvXkXH.", +"nXG x I i D.H.U.R.@X&X:X3X6X0XdXhXkXvXnXNX|.U.:X8X0X3X:XH.y ..b m k k.zXdXpXE `.cXkXdXN.0XkXhXF.", +"lXA x Y d H.U.R.W.&X-X:X3X6X0XdXfXkXxXnXMXK.F.:X3X3X,X&XA.9 4 m m z X.jXdXgX*.b.kXfXpXd 3XhXpXu.", +"kXC x U A.U.Y.W.&X&X-X:X3X3X6X0XdXfXhXkXMXH.u U.&X-X|.F.u 6 0 I m x J dXdXgX,.s.gXdX0Xd ,XdX3XA.", +"kXA x U D.R.W.|.&X-X-X:X1X3X3X6X0XfXvXMXSXR.6 u N.A.d w 7 > 6 Y m b A 0XdXgX<.,.sX0X3Xa :XdXR.R.", +"lXA x U F.&X@X&X&X-X-X:X:X3X6XdXkXvXMXZXAX6X- 7 8 9 8 6 2 * - Q m m A 4XdXgXs.:.9X6X-Xi 1X0Xu.GX", +"bXJ x Y S.=X&X-X-X-X:X,X3X0XdXkXvXvXnXnXMXAXu & > 2 > - & $ = ) b m C 3XdXgXf.=.5X3XW.a 3X&Xa GX", +"MX| x I i.:X:X:X:X:X:X3X6X0XdXhXkXkXkXvXZXFXdX$ % & & % $ + % ) b m A 4XdXdX3.:.2X1XS.N.3Xd |.GX", +"AXg.k m 8.;X&XW.W.&X-X,X3X0X0XdXdXfXhXMXZXAXFX1X# o + + O # Q m b A 0XdXsX,.#.:X-Xu L.Y.u GXGX", +"SX.Xj m O.D.F.K.R.&X-X:X3X8X0X0XiX0XkXMXMXZXZXSXfXi # X . @ 6 R m x ( sX0XsX&.0.;XY.9 Y.9 GXGXGX", +"GXuXv ~ J s S.K.Y.|.&X:X,X3X3X6X8XdXvXvXnXMXMXZXZXZXkX6X3XkXP.L m z @.dX0X0XE r.=Xd i u K.GXGXGX", +"GXvX[ x L t S.H.Y.W.&X-X:X3X3X3X6XhXkXvXvXnXnXMXMXnXnXnXnXcXe.n m k z.gX0X.GXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGX", +"GXGXGXGXGXGXGXGXGXGXGXhX6X6X0XsXsX0X9X9X0XsX0X8X3X3X7X:Xx.4.GXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGX", +"GXGXGXGXGXGXGXGXGXGXGXGXGXdX8X3X3X8X8X8X3X3X3X5X3X:X~.j.GXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGX", +"GXGXGXGXGXGXGXGXGXGXGXGXGXGXGXkXdX3X3X3X3X3X,X{.XXn.GXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGX" +}; diff --git a/Source/Core/DolphinWX/resources/toolbar_plugin_gfx.c b/Source/Core/DolphinWX/resources/toolbar_plugin_gfx.c new file mode 100644 index 0000000000..1ba72127ab --- /dev/null +++ b/Source/Core/DolphinWX/resources/toolbar_plugin_gfx.c @@ -0,0 +1,291 @@ +static const unsigned char toolbar_plugin_gfx_png[] = { +0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, +0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, +0x08, 0x06, 0x00, 0x00, 0x00, 0x57, 0x02, 0xf9, 0x87, 0x00, 0x00, 0x00, +0x04, 0x73, 0x42, 0x49, 0x54, 0x08, 0x08, 0x08, 0x08, 0x7c, 0x08, 0x64, +0x88, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, +0x12, 0x00, 0x00, 0x0b, 0x12, 0x01, 0xd2, 0xdd, 0x7e, 0xfc, 0x00, 0x00, +0x00, 0x25, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, +0x72, 0x65, 0x00, 0x4d, 0x61, 0x63, 0x72, 0x6f, 0x6d, 0x65, 0x64, 0x69, +0x61, 0x20, 0x46, 0x69, 0x72, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, +0x4d, 0x58, 0x20, 0x32, 0x30, 0x30, 0x34, 0x87, 0x76, 0xac, 0xcf, 0x00, +0x00, 0x00, 0x14, 0x74, 0x45, 0x58, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, +0x69, 0x6f, 0x6e, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x00, 0x39, 0x2f, 0x35, +0x2f, 0x30, 0x34, 0xc1, 0xe2, 0xc4, 0xb0, 0x00, 0x00, 0x0c, 0xd7, 0x49, +0x44, 0x41, 0x54, 0x78, 0x9c, 0xd5, 0x9a, 0x7b, 0x70, 0x1d, 0xd7, 0x5d, +0xc7, 0x3f, 0xe7, 0xec, 0xbd, 0x7b, 0xaf, 0x74, 0xaf, 0xa4, 0x6b, 0x59, +0x96, 0xec, 0xc4, 0x0f, 0xc5, 0x8e, 0x49, 0x5a, 0x3b, 0xb1, 0xf2, 0x98, +0x42, 0xc0, 0xc5, 0x8a, 0x69, 0x71, 0xa0, 0xc4, 0x0e, 0x30, 0xc3, 0xa4, +0x9d, 0x0e, 0x86, 0x36, 0x81, 0x32, 0xb4, 0x83, 0x0b, 0x03, 0xc3, 0xc0, +0x80, 0x31, 0x1d, 0x9e, 0xd3, 0x69, 0x5d, 0x86, 0x76, 0x32, 0xcc, 0xa4, +0xb8, 0x33, 0xa4, 0x11, 0x7f, 0xd0, 0xa4, 0xa1, 0x21, 0x93, 0x26, 0xae, +0x95, 0x07, 0x4d, 0x6c, 0x9c, 0xc6, 0x76, 0x1c, 0x27, 0x76, 0x6d, 0x49, +0x96, 0x65, 0x57, 0x2f, 0x4b, 0xf7, 0xa1, 0x7b, 0x75, 0x1f, 0xbb, 0xe7, +0xc7, 0x1f, 0xfb, 0xd0, 0xde, 0x87, 0x12, 0x3b, 0x0d, 0xd3, 0xe1, 0x37, +0x3a, 0xda, 0x3d, 0xab, 0xdd, 0xb3, 0xdf, 0xef, 0xef, 0x75, 0x7e, 0xe7, +0xac, 0x94, 0x88, 0xf0, 0xff, 0x59, 0xf4, 0x4f, 0x1a, 0xc0, 0x8f, 0x2b, +0xb1, 0xff, 0x8b, 0x41, 0x3f, 0xfa, 0xdb, 0xff, 0xd0, 0x8f, 0xd0, 0xef, +0xf5, 0x24, 0xf8, 0x81, 0xc0, 0xda, 0x22, 0xd1, 0xfe, 0xd8, 0xe1, 0x7f, +0xfb, 0xf3, 0xb1, 0xf7, 0xfa, 0x2e, 0xf5, 0x5e, 0x5d, 0x68, 0xd7, 0x43, +0x5f, 0xec, 0x47, 0x18, 0x10, 0x18, 0x00, 0x06, 0x40, 0x32, 0x08, 0x3b, +0x9a, 0x40, 0x2f, 0xa1, 0xf7, 0xf1, 0x2e, 0xd3, 0x17, 0xc9, 0x0a, 0x9c, +0x44, 0xe4, 0x04, 0x30, 0x86, 0xc8, 0x93, 0xdf, 0x7b, 0xfc, 0x2f, 0xdf, +0x95, 0xd8, 0x35, 0x13, 0xd8, 0xf5, 0xf0, 0x97, 0xfa, 0x81, 0x41, 0x90, +0x07, 0x80, 0x1d, 0x40, 0x86, 0xba, 0x47, 0x5b, 0x83, 0x6e, 0xd2, 0x7e, +0x00, 0xbc, 0xce, 0x1a, 0x21, 0x89, 0x46, 0x4b, 0x8d, 0x89, 0xc8, 0xb7, +0x81, 0x83, 0x47, 0x86, 0xf6, 0xb7, 0x24, 0xf3, 0xae, 0x04, 0xee, 0xfb, +0x9d, 0x2f, 0x0d, 0x82, 0xda, 0x07, 0xec, 0x09, 0x81, 0x46, 0x61, 0x0b, +0x2c, 0xc6, 0x6c, 0x16, 0x63, 0x36, 0x65, 0xcb, 0x3b, 0x82, 0xe0, 0xa6, +0x3a, 0x58, 0xd4, 0x31, 0x0f, 0x94, 0x18, 0x30, 0x42, 0xdc, 0x8e, 0x23, +0x8e, 0x8b, 0x53, 0xad, 0xb0, 0x02, 0x97, 0xb8, 0x18, 0x28, 0x97, 0xb0, +0x0b, 0x59, 0x92, 0xae, 0x43, 0xd2, 0xa9, 0x79, 0xf7, 0xab, 0xa5, 0xd7, +0x88, 0x08, 0x88, 0x01, 0xe1, 0x1b, 0xc0, 0xbe, 0x23, 0x43, 0xfb, 0xb3, +0xd7, 0x44, 0xe0, 0xbe, 0xdf, 0xfd, 0xf2, 0x00, 0xf0, 0x65, 0x60, 0x10, +0x54, 0x78, 0xdd, 0xd1, 0x9a, 0xb9, 0x64, 0x07, 0x73, 0xc9, 0x4e, 0x16, +0xda, 0xd2, 0x14, 0x12, 0x29, 0xaa, 0x68, 0xd6, 0xa4, 0x6d, 0xfa, 0xda, +0xe2, 0xf4, 0xb6, 0xdb, 0xf4, 0xb4, 0xc5, 0x71, 0x8d, 0xa1, 0x3b, 0x19, +0x27, 0x93, 0x88, 0xe3, 0xb8, 0x86, 0x9a, 0x2b, 0x38, 0xc6, 0xe0, 0xb8, +0xc6, 0xef, 0xbb, 0x5c, 0xce, 0x2e, 0x50, 0xaa, 0x54, 0x29, 0x55, 0x6b, +0xcc, 0xe4, 0x17, 0xa8, 0x54, 0xab, 0xa4, 0x4d, 0x8d, 0x54, 0x21, 0x47, +0xe7, 0xc2, 0x3c, 0x49, 0x71, 0x3d, 0x42, 0x46, 0xc0, 0x75, 0x41, 0x64, +0x0c, 0xe1, 0x8e, 0x28, 0x89, 0x96, 0x41, 0xfc, 0x4b, 0x9f, 0x39, 0x38, +0xa0, 0x94, 0x3a, 0x02, 0x64, 0x02, 0xf0, 0x97, 0x53, 0xdd, 0x4c, 0xb5, +0xaf, 0x60, 0x3a, 0xb5, 0x82, 0x4c, 0x9b, 0xcd, 0xcf, 0xad, 0xed, 0xe2, +0x9e, 0x1b, 0x3b, 0xb8, 0x39, 0xd3, 0xc6, 0xa6, 0x4c, 0x1b, 0xb6, 0x56, +0x54, 0x5c, 0xa8, 0x38, 0x86, 0x8a, 0x2b, 0x94, 0x1d, 0xa1, 0xea, 0x1a, +0x26, 0xf2, 0x65, 0x7e, 0x54, 0x28, 0x23, 0x18, 0x04, 0x85, 0x31, 0x0a, +0xad, 0x15, 0xda, 0x68, 0xd6, 0x74, 0xa6, 0x71, 0x5c, 0x17, 0x4b, 0x69, +0x32, 0x1b, 0xd7, 0x51, 0x73, 0x0c, 0x0b, 0xd5, 0x2a, 0x57, 0x72, 0x79, +0x26, 0xf3, 0x39, 0xe2, 0xd5, 0x0a, 0xa9, 0xcb, 0x23, 0x24, 0x2a, 0x55, +0x70, 0x14, 0xd4, 0x9c, 0x7e, 0x44, 0xfe, 0x00, 0x38, 0xf0, 0x8e, 0x04, +0xd0, 0x6a, 0x3f, 0x4a, 0x65, 0xd0, 0x9a, 0xbc, 0xdd, 0xc6, 0xc9, 0x95, +0x1b, 0x58, 0x8c, 0xb7, 0xf1, 0xab, 0xb7, 0xac, 0xe2, 0x23, 0xeb, 0xbb, +0xd9, 0xb9, 0xbe, 0x0b, 0x01, 0x6a, 0x06, 0x1c, 0x03, 0x6f, 0xce, 0x95, +0x19, 0xcf, 0x57, 0x39, 0x3b, 0x5f, 0xe2, 0xf5, 0xc9, 0x05, 0xc4, 0xb8, +0xbc, 0x31, 0x5d, 0x00, 0x71, 0xc1, 0x18, 0x30, 0xfe, 0xf1, 0x1a, 0xfa, +0xab, 0x3b, 0xd3, 0xa4, 0xdb, 0x12, 0x74, 0xa5, 0xda, 0x59, 0xd9, 0xd7, +0xcb, 0x42, 0xdf, 0x2a, 0xca, 0xe7, 0xdf, 0x22, 0x31, 0x37, 0x87, 0x32, +0x02, 0xe2, 0xec, 0x8b, 0x12, 0x68, 0x72, 0xa1, 0xfb, 0xfe, 0xf0, 0x91, +0x15, 0xba, 0xe6, 0xcc, 0x89, 0x65, 0x31, 0x9d, 0xee, 0xe2, 0x74, 0xcf, +0x7a, 0x36, 0x76, 0xa7, 0xf9, 0xb3, 0xbb, 0x6f, 0x62, 0x55, 0xbb, 0x8d, +0x06, 0x0c, 0x70, 0x78, 0x22, 0xc7, 0x2b, 0x93, 0x05, 0x4e, 0xcd, 0x96, +0x28, 0x56, 0x8d, 0x67, 0x6a, 0xd7, 0x20, 0x01, 0x18, 0x63, 0x3c, 0xdf, +0x0d, 0xc1, 0x2d, 0x73, 0x6e, 0xdc, 0xb0, 0xff, 0xb7, 0xfa, 0x3b, 0xec, +0x4d, 0xbf, 0x49, 0xb5, 0x54, 0xe5, 0xb1, 0xea, 0x36, 0xfe, 0x7e, 0xdd, +0x27, 0x68, 0xb3, 0xe3, 0xac, 0x8d, 0xb7, 0xd3, 0x3b, 0x72, 0x96, 0xf2, +0xcc, 0x55, 0x54, 0xa9, 0x02, 0x22, 0x77, 0x1c, 0x19, 0xda, 0x7f, 0xa2, +0xa5, 0x05, 0x74, 0xcd, 0xdd, 0x23, 0x31, 0x0b, 0x49, 0xc4, 0xb9, 0xd4, +0xd3, 0xc7, 0x1d, 0x6b, 0x57, 0xf0, 0xa9, 0x5b, 0xd7, 0x53, 0x16, 0xf8, +0x61, 0xbe, 0xc6, 0x8b, 0x33, 0x39, 0x86, 0xa7, 0xb2, 0x2c, 0x56, 0x5d, +0x0f, 0x4b, 0x4c, 0x88, 0x6b, 0x41, 0x5c, 0x41, 0x1c, 0xff, 0x68, 0x40, +0x1c, 0x01, 0x63, 0x10, 0x25, 0x80, 0xf1, 0x02, 0x39, 0x68, 0xc6, 0xf8, +0x6a, 0x10, 0x94, 0x12, 0xd0, 0x70, 0xa0, 0xf2, 0x14, 0xfb, 0x3e, 0x30, +0x43, 0xf2, 0xc3, 0x7b, 0x11, 0x6d, 0xf3, 0xfb, 0x87, 0xff, 0x0b, 0x33, +0x3a, 0xc4, 0x57, 0xb6, 0x3d, 0xc4, 0x48, 0xb1, 0x48, 0x2c, 0xa6, 0x49, +0xc5, 0x62, 0xa0, 0xab, 0xe0, 0xca, 0x1e, 0xa0, 0x35, 0x01, 0xd1, 0xea, +0x5e, 0x62, 0x16, 0x65, 0x11, 0x4a, 0xed, 0x09, 0xb6, 0xac, 0xca, 0xf0, +0xa3, 0x8a, 0xcb, 0xac, 0xe3, 0xf0, 0xf4, 0xec, 0x2c, 0xf9, 0x9a, 0x8b, +0x49, 0x2a, 0xe2, 0x31, 0x0b, 0x71, 0x05, 0x63, 0x0c, 0xe2, 0xe2, 0x01, +0x77, 0x41, 0x5c, 0xe5, 0x13, 0x50, 0x88, 0xab, 0x11, 0x03, 0xf8, 0xe4, +0x30, 0x0a, 0x31, 0x0a, 0x44, 0xa1, 0xc4, 0xf2, 0x08, 0x68, 0x0b, 0xa5, +0x84, 0x5f, 0x9f, 0x7d, 0x95, 0xc4, 0x8e, 0x3f, 0xc2, 0x9d, 0x9f, 0xa1, +0xf8, 0xbd, 0xa7, 0x28, 0x5d, 0x99, 0xe3, 0x97, 0x27, 0x2b, 0x7c, 0x6d, +0xfb, 0xe7, 0x10, 0x23, 0x14, 0x3a, 0x3a, 0x49, 0xcd, 0xe7, 0x40, 0x6b, +0x70, 0xcd, 0x60, 0xe0, 0x46, 0xcd, 0x16, 0x10, 0x76, 0x1b, 0xad, 0x99, +0x75, 0x05, 0xad, 0x84, 0xa3, 0xf3, 0x59, 0x72, 0x06, 0x4e, 0x95, 0x17, +0x28, 0x8a, 0x8b, 0xb6, 0x04, 0xa5, 0x41, 0x34, 0x20, 0x0a, 0x31, 0x1a, +0x31, 0x3e, 0x78, 0xc7, 0x07, 0xef, 0xf7, 0x31, 0xca, 0x27, 0xa4, 0xc0, +0xd5, 0x88, 0x58, 0x60, 0x0c, 0xca, 0xcf, 0x91, 0x4a, 0x83, 0x52, 0xa0, +0x2c, 0xa8, 0x9d, 0xa9, 0x21, 0x02, 0x73, 0xff, 0xf1, 0x18, 0x4e, 0xa1, +0x48, 0x39, 0x5b, 0xa6, 0x56, 0xb6, 0x50, 0x71, 0x0b, 0xa5, 0x15, 0x39, +0x51, 0xac, 0x56, 0x61, 0x36, 0x1c, 0x68, 0x19, 0xc4, 0x1f, 0xfb, 0xec, +0x57, 0x07, 0xb0, 0x74, 0x06, 0xd7, 0x50, 0x34, 0x16, 0x66, 0xb1, 0xc2, +0xa5, 0xd9, 0x39, 0x2e, 0x17, 0xf2, 0xa4, 0x6a, 0x15, 0x8c, 0x9d, 0xc0, +0xd5, 0x16, 0x61, 0x5a, 0x55, 0x0a, 0x14, 0x28, 0xa5, 0x3d, 0x57, 0x88, +0x03, 0x68, 0x3f, 0xf7, 0x2b, 0x30, 0x1a, 0x31, 0xde, 0x1c, 0x20, 0x81, +0xef, 0x07, 0x8f, 0x29, 0x9f, 0x80, 0xd6, 0xa8, 0x98, 0xe2, 0xdb, 0x6b, +0x06, 0xe9, 0x7b, 0xe2, 0x09, 0x4a, 0xe3, 0x57, 0x71, 0x1d, 0x97, 0xea, +0x42, 0x95, 0x67, 0x3e, 0xf0, 0x6b, 0x98, 0x72, 0x0d, 0xb7, 0x5c, 0xa3, +0x54, 0x75, 0x90, 0xaa, 0x83, 0xf6, 0x26, 0xbb, 0xcc, 0xbd, 0x0f, 0x1e, +0xc8, 0x1c, 0x19, 0xda, 0x9f, 0xad, 0xb7, 0x80, 0x62, 0x07, 0x02, 0x6e, +0x71, 0x91, 0xb6, 0x8a, 0xc3, 0xe6, 0x33, 0x79, 0xda, 0x94, 0x40, 0xdc, +0x42, 0xb4, 0xf6, 0x6f, 0xf1, 0xb4, 0x57, 0x6c, 0x4f, 0x53, 0xb1, 0x6d, +0xca, 0x6d, 0xed, 0x54, 0x92, 0x6d, 0x94, 0x52, 0x69, 0x94, 0x56, 0x28, +0x4b, 0xa3, 0x2c, 0xe5, 0x9f, 0x2b, 0x88, 0x29, 0x14, 0xca, 0x23, 0x16, +0x68, 0x3c, 0x20, 0xae, 0x75, 0x68, 0x85, 0x47, 0x76, 0xee, 0x43, 0x9e, +0x3f, 0xc8, 0x2f, 0xe6, 0x14, 0xc6, 0xd5, 0x3c, 0x7b, 0xeb, 0x03, 0x3c, +0x72, 0xcf, 0xef, 0x51, 0x9b, 0x2b, 0x60, 0xe6, 0x8b, 0xac, 0x9e, 0x9c, +0xc2, 0xcd, 0x17, 0xd1, 0x56, 0x58, 0x7f, 0x6e, 0x03, 0x5e, 0x68, 0x70, +0x21, 0x35, 0xa0, 0x94, 0x60, 0x4a, 0x8b, 0xac, 0xc8, 0xe6, 0x21, 0x1e, +0x43, 0x2c, 0xcd, 0xe6, 0x2d, 0x37, 0x31, 0x31, 0x3e, 0xc5, 0x62, 0xa9, +0xec, 0xfb, 0x99, 0x22, 0xa5, 0xf2, 0xa4, 0x2c, 0xed, 0xf9, 0xa4, 0xa5, +0x21, 0x66, 0xb1, 0x90, 0x4a, 0x53, 0x4c, 0x77, 0x50, 0x4a, 0xa7, 0x29, +0xa6, 0xda, 0xd1, 0xbe, 0x76, 0x95, 0xf6, 0x49, 0x59, 0x1a, 0xb4, 0x02, +0x4b, 0xa3, 0x14, 0x60, 0x5c, 0x44, 0x29, 0xc4, 0x2f, 0x21, 0xbe, 0x76, +0xcf, 0x67, 0xf8, 0xe7, 0xbb, 0x1f, 0xc6, 0xd4, 0x5c, 0x4c, 0xa5, 0x46, +0x7c, 0x62, 0x9a, 0xbe, 0xe9, 0x59, 0xba, 0xa7, 0x67, 0x51, 0xc5, 0x32, +0x52, 0x73, 0x20, 0x95, 0xf4, 0x18, 0xfb, 0xd9, 0xb3, 0xd1, 0x02, 0x83, +0x88, 0xc2, 0x8a, 0xc7, 0xf8, 0xfc, 0x5f, 0x7c, 0x8a, 0xbb, 0xee, 0xdc, +0x44, 0x0a, 0x21, 0x2e, 0xa0, 0xc4, 0x9b, 0xd6, 0x45, 0x84, 0x33, 0xa3, +0x53, 0xe4, 0x0b, 0x8b, 0x9c, 0x7c, 0x73, 0x8c, 0xd1, 0xf1, 0x49, 0x2e, +0x4f, 0x4c, 0x31, 0x3f, 0x97, 0x27, 0x9d, 0x2b, 0x92, 0x8e, 0xcf, 0x42, +0x2c, 0x06, 0x96, 0x66, 0x21, 0x9d, 0xa6, 0x9c, 0x4c, 0xb2, 0xd0, 0xde, +0x86, 0x93, 0xb0, 0x29, 0xdb, 0x89, 0x25, 0x0b, 0x29, 0x15, 0xba, 0xa2, +0x57, 0x2e, 0x08, 0xba, 0xe6, 0x90, 0x58, 0x2c, 0xd3, 0x56, 0x58, 0xa0, +0x7b, 0x7e, 0x1e, 0xbb, 0x58, 0x82, 0x72, 0x0d, 0x55, 0xad, 0x61, 0x5b, +0x36, 0xc6, 0x56, 0xd1, 0x4a, 0x66, 0xb0, 0xc9, 0x02, 0x0a, 0xfa, 0x51, +0xd0, 0xd9, 0xb3, 0x92, 0x2d, 0xdb, 0x6e, 0x66, 0x95, 0x18, 0xda, 0x83, +0xf7, 0xf8, 0xa4, 0x45, 0xe0, 0xa7, 0x37, 0xf6, 0x62, 0x44, 0xd8, 0x79, +0xdb, 0x3a, 0xc4, 0x08, 0x65, 0x03, 0x63, 0x93, 0x39, 0x4e, 0x8f, 0x4c, +0xf1, 0xc6, 0xdb, 0x17, 0x19, 0x1f, 0x9f, 0xe2, 0xd2, 0xe8, 0xb8, 0x47, +0x28, 0x66, 0xd1, 0x13, 0xd3, 0x60, 0x59, 0x60, 0x69, 0xdc, 0x58, 0x8c, +0x45, 0xdb, 0xf6, 0x2c, 0x01, 0x60, 0x04, 0x8c, 0xd0, 0x56, 0x2e, 0x63, +0xd5, 0x6a, 0xe0, 0xb8, 0x50, 0x73, 0x51, 0x35, 0x07, 0x5c, 0x97, 0x1b, +0xfa, 0x56, 0xf2, 0xf3, 0x1f, 0xbe, 0x93, 0xe4, 0x96, 0x9d, 0x3c, 0xfe, +0xc5, 0x2f, 0x44, 0x8a, 0xc2, 0x86, 0x20, 0xfe, 0xd8, 0xe7, 0xbe, 0xba, +0x03, 0xa5, 0x50, 0x02, 0xab, 0xd7, 0x74, 0x63, 0x0c, 0xb4, 0x5b, 0x9e, +0xbf, 0x56, 0x50, 0xe4, 0x5d, 0x61, 0xc1, 0xd5, 0xb8, 0x46, 0x70, 0xfd, +0xfa, 0xca, 0x16, 0x83, 0x12, 0x21, 0xa5, 0x5c, 0x36, 0xf5, 0x75, 0xb2, +0xb9, 0x2f, 0xcd, 0x9e, 0x9f, 0xd9, 0x88, 0x18, 0x61, 0xbe, 0xa6, 0x79, +0xe5, 0xcc, 0x04, 0x17, 0x2e, 0x4e, 0x73, 0x71, 0x62, 0x86, 0xf9, 0x6c, +0x8e, 0x2b, 0xe3, 0xe3, 0x58, 0x5a, 0x93, 0x56, 0xa5, 0x06, 0x02, 0x06, +0x5c, 0x83, 0x72, 0x0d, 0x76, 0x3c, 0xc6, 0xa6, 0x8d, 0xeb, 0xd8, 0xba, +0xa9, 0x8f, 0xdb, 0x37, 0xf7, 0xb1, 0xee, 0xc6, 0x1e, 0xb2, 0x4e, 0x92, +0x93, 0x25, 0x9a, 0x64, 0xa4, 0xc1, 0x85, 0xfa, 0x11, 0x40, 0x09, 0x37, +0xdd, 0x74, 0x03, 0x49, 0xdf, 0x5d, 0x00, 0x2e, 0xe4, 0xab, 0x9c, 0xbf, +0x7c, 0x95, 0x2b, 0x57, 0x66, 0xb9, 0x7c, 0xe5, 0x2a, 0xd9, 0xf9, 0x02, +0x22, 0xc2, 0x27, 0xf7, 0xee, 0xc1, 0x35, 0xe0, 0x9a, 0x18, 0xae, 0x81, +0x18, 0x42, 0x12, 0x97, 0x0e, 0xed, 0xd0, 0xae, 0x5d, 0x76, 0xdd, 0xd6, +0x87, 0x6c, 0xed, 0xf5, 0xd2, 0xaa, 0x08, 0xb9, 0x9a, 0x45, 0xd5, 0x85, +0x37, 0xdf, 0x1e, 0xa7, 0x58, 0xb3, 0x30, 0x22, 0xb4, 0x5b, 0x0e, 0x16, +0x82, 0xad, 0x5c, 0x6e, 0xbf, 0xa5, 0x2f, 0x74, 0x53, 0x63, 0x4c, 0x08, +0xac, 0x68, 0x6c, 0x94, 0x82, 0x74, 0x57, 0x86, 0x85, 0xec, 0x7c, 0x70, +0x79, 0xa0, 0x3e, 0x06, 0x44, 0xfa, 0x51, 0x20, 0x28, 0x12, 0x09, 0x9b, +0x38, 0xde, 0x40, 0x87, 0x8f, 0x9d, 0xe3, 0x9f, 0x86, 0x86, 0xeb, 0xa9, +0x0b, 0x24, 0x93, 0x76, 0x60, 0x7d, 0x44, 0x20, 0x97, 0xcd, 0xf3, 0xcc, +0x53, 0x87, 0xd9, 0xbe, 0x73, 0x3b, 0xdd, 0xab, 0x56, 0xe1, 0xfa, 0x55, +0x42, 0x87, 0xe5, 0xd0, 0x69, 0xd5, 0x48, 0x69, 0x87, 0x94, 0xe5, 0x90, +0x8e, 0xd7, 0xd8, 0xbe, 0xb5, 0x0f, 0xe3, 0x03, 0x15, 0xbf, 0xda, 0x34, +0xa1, 0xc2, 0x04, 0x47, 0x14, 0x73, 0x4e, 0x3b, 0x39, 0xb7, 0x8d, 0xab, +0x4e, 0x3b, 0x55, 0x62, 0x68, 0x1d, 0x21, 0xe0, 0x29, 0x36, 0x53, 0x47, +0xc0, 0x57, 0x3e, 0x20, 0xf4, 0xae, 0xee, 0xc1, 0x12, 0xc1, 0x18, 0x21, +0xdd, 0x95, 0xf6, 0xca, 0x59, 0x55, 0x4f, 0x60, 0x71, 0xb1, 0xcc, 0xfc, +0x7c, 0x81, 0x8e, 0xce, 0x0e, 0x8c, 0xc0, 0x33, 0x4f, 0x1d, 0x66, 0xe2, +0xe2, 0x04, 0x4f, 0x7c, 0xf3, 0x09, 0xee, 0xfe, 0xd9, 0x0f, 0xb1, 0xe5, +0xce, 0x01, 0x0c, 0x30, 0x5f, 0x8b, 0x31, 0x5b, 0x8e, 0xf9, 0x96, 0xf2, +0x5a, 0x4a, 0x3b, 0x58, 0x18, 0x04, 0xe8, 0x8e, 0x57, 0xbc, 0x09, 0xac, +0x66, 0xa3, 0x80, 0xb2, 0xb1, 0xa8, 0x48, 0x6c, 0x69, 0xae, 0x50, 0xfe, +0xc2, 0x3d, 0x48, 0xbf, 0x0d, 0x12, 0xb5, 0xc0, 0xa0, 0x28, 0x8f, 0x84, +0x31, 0x90, 0x10, 0x83, 0x11, 0xc3, 0xfa, 0x0d, 0x37, 0x34, 0x05, 0x4e, +0xb0, 0xda, 0xca, 0xce, 0xe7, 0x49, 0xa5, 0x3b, 0x38, 0x7e, 0xf4, 0x24, +0x13, 0x17, 0x27, 0x40, 0xa0, 0x52, 0x2e, 0xf3, 0xf2, 0xe1, 0x17, 0x18, +0x39, 0x77, 0x81, 0x5f, 0xd8, 0xfd, 0x2b, 0x58, 0xf1, 0x44, 0xb0, 0xd8, +0x0a, 0x5b, 0xae, 0x16, 0x0b, 0x87, 0x9c, 0xab, 0xda, 0xe1, 0xb0, 0x4a, +0x79, 0xa1, 0x11, 0x1c, 0xb5, 0x5e, 0x22, 0xe1, 0xfd, 0x5d, 0x35, 0x2c, +0xa7, 0xa2, 0xbb, 0x12, 0xc1, 0x92, 0xce, 0x18, 0x86, 0x9f, 0x3f, 0xca, +0x42, 0xa9, 0xec, 0x65, 0x18, 0x17, 0xfa, 0x56, 0xaf, 0xf4, 0xfc, 0x38, +0x68, 0xbe, 0xb9, 0x9f, 0x7e, 0xf2, 0x79, 0x5e, 0x7e, 0xe1, 0x28, 0xc3, +0xcf, 0xbe, 0xe8, 0xcf, 0xbe, 0xbe, 0x1b, 0x08, 0x5c, 0x19, 0xbf, 0xc4, +0xd0, 0xbf, 0x7c, 0x9d, 0x42, 0x2e, 0x1f, 0xba, 0x59, 0xb4, 0x35, 0x4a, +0x98, 0xec, 0x7c, 0xe0, 0x3a, 0x32, 0xc5, 0x04, 0xad, 0x85, 0x01, 0x96, +0x08, 0x88, 0x0f, 0x5e, 0x44, 0x18, 0x1b, 0x99, 0xe0, 0x8f, 0xff, 0xee, +0x31, 0x5e, 0x3d, 0x35, 0xca, 0xf8, 0x4c, 0x81, 0x45, 0xaf, 0x84, 0x6d, +0x6a, 0xb9, 0xf9, 0x1c, 0xdf, 0x7f, 0xe1, 0xe8, 0x12, 0x70, 0x24, 0x5c, +0xe3, 0x8a, 0x08, 0xdd, 0xab, 0x7a, 0x48, 0xa5, 0x3b, 0xf1, 0x57, 0x94, +0xcb, 0x82, 0x0f, 0x18, 0x04, 0x9a, 0xb7, 0x94, 0x3f, 0x37, 0x7a, 0xf3, +0x23, 0x31, 0x2f, 0x03, 0x53, 0x58, 0xf2, 0xff, 0x50, 0x22, 0x59, 0xa8, +0x7e, 0xf4, 0x85, 0x52, 0x85, 0x7f, 0x3c, 0xf4, 0xdd, 0x88, 0x7e, 0x1a, +0x45, 0x1a, 0x4e, 0x83, 0x05, 0xb9, 0xf7, 0xcb, 0xb6, 0x13, 0xec, 0xbc, +0x7f, 0x77, 0x5d, 0xa0, 0x07, 0xe7, 0x4d, 0xd8, 0x1b, 0xdc, 0x46, 0x5b, +0x1e, 0xf8, 0x60, 0xa2, 0x57, 0x78, 0xcf, 0xe5, 0xe6, 0xe6, 0xa2, 0x8f, +0x0d, 0xd7, 0x13, 0x88, 0xa4, 0xcd, 0xe5, 0x20, 0xb7, 0x22, 0x20, 0xf5, +0xbf, 0xc2, 0xf3, 0xed, 0xbb, 0x76, 0x11, 0xb3, 0x13, 0xb8, 0xe6, 0x1a, +0xc0, 0xb3, 0x04, 0x3e, 0xaa, 0xf9, 0x80, 0x00, 0x80, 0x32, 0xb4, 0x34, +0xdf, 0x52, 0x16, 0x0a, 0xed, 0xeb, 0x6d, 0x09, 0xbc, 0xf3, 0x5e, 0x45, +0xab, 0xa0, 0xf6, 0x4e, 0x82, 0xbd, 0x1e, 0x63, 0x24, 0x5c, 0x98, 0x4d, +0x5e, 0xba, 0x44, 0x21, 0x97, 0x63, 0xfd, 0x2d, 0x5b, 0x5b, 0x82, 0x57, +0x81, 0xbf, 0xfb, 0xee, 0x12, 0x8b, 0xf9, 0x16, 0xb0, 0x7c, 0xbf, 0x17, +0x28, 0x16, 0x8a, 0x2d, 0x91, 0xd4, 0x59, 0x20, 0x24, 0x42, 0xa3, 0x05, +0x84, 0xa6, 0x3c, 0x1a, 0xed, 0x45, 0x08, 0x04, 0x7f, 0xfa, 0xef, 0x67, +0x9f, 0xa1, 0xbd, 0xa3, 0x8b, 0xf9, 0x99, 0xa9, 0xd0, 0x2a, 0x6b, 0xfa, +0x37, 0x13, 0x4f, 0x24, 0xbc, 0x91, 0x1a, 0xdc, 0x26, 0xf4, 0xf7, 0x18, +0xc4, 0x7d, 0x22, 0x81, 0xfb, 0x88, 0x40, 0xa9, 0xb8, 0xd0, 0x88, 0xbd, +0x7e, 0x45, 0x26, 0x22, 0xc3, 0xc0, 0xe0, 0xd2, 0x7e, 0x4c, 0x13, 0x0b, +0x00, 0x6e, 0xbd, 0x7d, 0x0b, 0xfd, 0x3f, 0xb5, 0x09, 0xdb, 0x4e, 0x32, +0x7a, 0xee, 0x3c, 0x67, 0x4f, 0x9d, 0xa6, 0x5a, 0xa9, 0xd4, 0x11, 0x10, +0xbc, 0x74, 0x5a, 0x59, 0x2c, 0x87, 0x83, 0x09, 0x90, 0x9b, 0x9d, 0x66, +0xd5, 0xda, 0x75, 0x4b, 0xd9, 0x46, 0xd5, 0x6b, 0x3e, 0x1e, 0x03, 0x3b, +0xe6, 0x13, 0xd1, 0x9e, 0x65, 0xc0, 0x9b, 0x3b, 0xae, 0x4e, 0xcd, 0x34, +0x42, 0xc9, 0xd6, 0x11, 0x08, 0x10, 0x87, 0x16, 0x88, 0x6c, 0x2e, 0x01, +0x24, 0x92, 0x09, 0x76, 0x7f, 0xfc, 0x37, 0x58, 0xd9, 0xd7, 0x1b, 0x06, +0x65, 0xef, 0x8d, 0x6b, 0xd9, 0xf4, 0xc1, 0x0f, 0xf2, 0xf4, 0xe3, 0xff, +0xee, 0x93, 0x90, 0x3a, 0x77, 0x6a, 0xdc, 0xa9, 0xcb, 0x5e, 0x9d, 0xa2, +0x6f, 0xdd, 0xba, 0x66, 0xf0, 0xda, 0x03, 0x1f, 0x36, 0xab, 0x3e, 0x78, +0x05, 0x98, 0xbe, 0x32, 0xd9, 0xd2, 0x02, 0xd1, 0x34, 0x3a, 0x2c, 0x91, +0x14, 0x19, 0xcd, 0xf7, 0x22, 0xc2, 0xd6, 0xbb, 0xee, 0x60, 0x45, 0x6f, +0xaf, 0xb7, 0x90, 0x97, 0xa5, 0x1a, 0x6c, 0x45, 0x4f, 0x2f, 0x1f, 0x1a, +0xbc, 0xb7, 0x2e, 0xbd, 0x46, 0x9f, 0x8b, 0x5e, 0xcf, 0xce, 0x4c, 0xd5, +0xf9, 0x79, 0xa0, 0x71, 0x3b, 0xee, 0xb5, 0x44, 0xdc, 0xb7, 0x40, 0x2c, +0x12, 0xc4, 0xfe, 0x04, 0x31, 0xfa, 0xd6, 0xd9, 0x3a, 0xed, 0x3f, 0x3a, +0xb4, 0x3f, 0x57, 0x47, 0x00, 0x91, 0x13, 0x2c, 0xf3, 0x62, 0x44, 0xd8, +0x72, 0xd7, 0xdd, 0x1e, 0xf0, 0xc0, 0x58, 0xbe, 0x81, 0x8c, 0xc0, 0xa6, +0x2d, 0x5b, 0x5b, 0x80, 0xf6, 0xee, 0xf0, 0xae, 0x79, 0xb1, 0x55, 0xca, +0x67, 0x89, 0x5b, 0xf5, 0xc0, 0x13, 0x91, 0x66, 0xfb, 0xa4, 0x42, 0xff, +0xf7, 0x5d, 0x78, 0xa1, 0xb0, 0xc8, 0xdc, 0xcc, 0x6c, 0x93, 0xf6, 0xeb, +0x08, 0x7c, 0xf7, 0xeb, 0x7f, 0x92, 0x13, 0x9f, 0x44, 0x48, 0x24, 0x62, +0x85, 0x78, 0x22, 0x11, 0xe2, 0x0a, 0x48, 0x08, 0x2c, 0x4d, 0xa1, 0x61, +0x16, 0x6b, 0x6d, 0x01, 0x3b, 0xe9, 0x05, 0x6f, 0x14, 0x74, 0x72, 0x19, +0xf0, 0x96, 0x5f, 0xff, 0x04, 0x0a, 0x3a, 0xf1, 0xea, 0xeb, 0x8d, 0xee, +0xf3, 0x64, 0x70, 0x52, 0xbf, 0x22, 0xf3, 0x02, 0x79, 0x40, 0x44, 0x9a, +0xe2, 0x77, 0x76, 0x72, 0x8a, 0x95, 0xab, 0xfb, 0xfc, 0x82, 0x6f, 0x89, +0xbd, 0x01, 0xaa, 0x95, 0x72, 0x64, 0x26, 0xae, 0x1b, 0x90, 0xc1, 0xfb, +0xef, 0xe7, 0x86, 0xfe, 0xf5, 0x74, 0x65, 0xba, 0xea, 0x4b, 0x03, 0x2b, +0x5c, 0x89, 0x86, 0x29, 0x33, 0xcc, 0x3a, 0xd4, 0xbb, 0xe9, 0xe9, 0xe3, +0x4d, 0x04, 0x86, 0x9b, 0x2c, 0xe0, 0xe1, 0x97, 0x43, 0x12, 0xb5, 0x40, +0x60, 0x05, 0x23, 0xbc, 0xf6, 0xd2, 0x4b, 0x21, 0xbe, 0x20, 0x0d, 0x82, +0x67, 0xe6, 0x33, 0xc7, 0xff, 0x67, 0xd9, 0x18, 0xd8, 0x72, 0xe7, 0x6d, +0xac, 0x5c, 0xd9, 0xb5, 0xe4, 0xe3, 0x41, 0xf3, 0xdd, 0x28, 0x6e, 0xd5, +0x83, 0x07, 0x90, 0xa0, 0x72, 0x75, 0xe1, 0xd8, 0xcb, 0x3f, 0x68, 0x74, +0x9f, 0xb1, 0x47, 0x87, 0xf6, 0x9f, 0x6c, 0x49, 0xe0, 0xf9, 0x6f, 0xfc, +0x69, 0xf0, 0x81, 0xa1, 0x29, 0x0e, 0x2e, 0x9e, 0x3b, 0xc7, 0x2b, 0xcf, +0x3d, 0x17, 0x6a, 0xd8, 0x5f, 0x9b, 0x73, 0xe6, 0xf8, 0x31, 0x5e, 0x7b, +0xf1, 0xa5, 0x65, 0x03, 0xf7, 0xf4, 0xd1, 0x63, 0x21, 0xe0, 0x68, 0x96, +0x89, 0x45, 0x81, 0xab, 0x40, 0x81, 0x1e, 0x70, 0xc7, 0x80, 0xe3, 0xc0, +0xcc, 0x74, 0x8e, 0xe7, 0xbe, 0xf5, 0x9f, 0x8d, 0xda, 0x0f, 0xdd, 0x67, +0x23, 0xad, 0x76, 0xe6, 0x44, 0x0e, 0x02, 0x87, 0x82, 0xdc, 0x1d, 0xf1, +0x06, 0xde, 0x38, 0x7a, 0x8c, 0xb1, 0xb7, 0xcf, 0xd2, 0xb3, 0xba, 0x0f, +0xbb, 0x2d, 0xc9, 0x95, 0xb1, 0x8b, 0x14, 0xb2, 0xb9, 0xfa, 0x9b, 0xa2, +0x15, 0x05, 0x70, 0xe4, 0x3b, 0xcf, 0x72, 0xe1, 0xad, 0xb7, 0xd9, 0xfd, +0xe0, 0x6e, 0x56, 0xf4, 0x64, 0xea, 0xca, 0xe5, 0x30, 0x53, 0xfb, 0xae, +0x12, 0x25, 0x30, 0x7a, 0xfe, 0x32, 0xdf, 0xfa, 0xd7, 0x6f, 0x36, 0xc2, +0x03, 0x38, 0x18, 0xed, 0x34, 0x6d, 0xee, 0x8e, 0x00, 0x0f, 0x7f, 0xf2, +0x6f, 0x5e, 0x67, 0x99, 0x58, 0x68, 0xe0, 0xd4, 0x7c, 0xa5, 0xf1, 0xa2, +0x3f, 0xfe, 0x86, 0x9b, 0xfb, 0xd9, 0xfb, 0xd9, 0xdf, 0xac, 0xaf, 0xef, +0x23, 0x63, 0x18, 0x81, 0x4a, 0xc5, 0x61, 0xe4, 0x87, 0xe3, 0xfc, 0xe0, +0xfb, 0xc7, 0x39, 0x7f, 0xfa, 0xad, 0x96, 0xe0, 0x1f, 0x1d, 0xda, 0xff, +0xf9, 0xa0, 0xd3, 0xd2, 0x02, 0xde, 0x3b, 0xe5, 0xb7, 0x80, 0x61, 0x05, +0x99, 0xeb, 0xfa, 0x86, 0x16, 0xb9, 0x57, 0x22, 0xd7, 0x92, 0x6d, 0x49, +0x3e, 0xfa, 0xc0, 0x2e, 0xaf, 0x98, 0x93, 0x7a, 0xe0, 0x73, 0x57, 0xf3, +0x4c, 0x5c, 0xbc, 0xcc, 0xe8, 0xd9, 0x0b, 0x9c, 0x3a, 0xfa, 0xda, 0x3b, +0x8d, 0x3e, 0x06, 0xfc, 0x55, 0x14, 0x3c, 0x2c, 0x63, 0x01, 0x80, 0x87, +0x3e, 0xf1, 0x85, 0x6d, 0x78, 0xd1, 0x9e, 0x59, 0xae, 0x88, 0x6f, 0xba, +0xba, 0xcc, 0x7d, 0x1f, 0xd9, 0x73, 0x1f, 0xeb, 0x37, 0x7b, 0xaf, 0x9c, +0x9d, 0x9c, 0x61, 0x71, 0xb1, 0xcc, 0xd8, 0xd9, 0x0b, 0x4c, 0x8c, 0x8e, +0xb1, 0x58, 0x6c, 0xb1, 0xdd, 0xd0, 0x2c, 0x59, 0x60, 0x30, 0x1a, 0xbc, +0xcb, 0x12, 0xa8, 0x23, 0xf1, 0xf1, 0xbf, 0xde, 0x00, 0x1c, 0xc2, 0xdb, +0x44, 0xe2, 0xba, 0xac, 0xf1, 0xfe, 0xc9, 0x21, 0x60, 0x5f, 0x30, 0xf3, +0xc2, 0x12, 0x78, 0x78, 0x87, 0x6f, 0x64, 0x23, 0x91, 0xf3, 0x4f, 0x3f, +0x78, 0x60, 0x2f, 0x9e, 0xf9, 0xfa, 0xdf, 0x77, 0x78, 0xad, 0xe5, 0x04, +0x1e, 0xf0, 0x43, 0x51, 0xe0, 0x50, 0x0f, 0x1e, 0xde, 0xe5, 0x2b, 0xe5, +0x48, 0x43, 0xdf, 0x27, 0xb2, 0x8f, 0xc8, 0xf6, 0xf6, 0xfb, 0x28, 0x27, +0xf0, 0x52, 0xe4, 0xa1, 0x47, 0x87, 0xf6, 0x5f, 0x6c, 0x75, 0x43, 0x23, +0x78, 0xb8, 0xc6, 0xef, 0xc4, 0x2d, 0x88, 0x6c, 0xc3, 0x73, 0xab, 0x07, +0xf0, 0xc8, 0x64, 0xae, 0x07, 0x29, 0x9e, 0x4f, 0x9f, 0xf0, 0xdb, 0x30, +0x30, 0xdc, 0xa8, 0xe9, 0x40, 0x5a, 0x81, 0x8e, 0xca, 0x75, 0x7f, 0xa9, +0x6f, 0x24, 0x03, 0xf0, 0xe9, 0x07, 0x0f, 0x6c, 0xc0, 0x73, 0xaf, 0xa0, +0xb5, 0x92, 0x61, 0xff, 0x78, 0x62, 0x39, 0xb0, 0x81, 0xbc, 0x1b, 0xe8, +0xa8, 0xbc, 0xe7, 0x7f, 0x35, 0x08, 0xa4, 0x15, 0xa1, 0xeb, 0x95, 0xeb, +0x01, 0xdc, 0x28, 0x3f, 0x36, 0x81, 0x9f, 0xb4, 0xfc, 0x2f, 0x83, 0x5f, +0xe1, 0x0b, 0x7d, 0x74, 0xae, 0x6f, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, +0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, +}; diff --git a/Source/Core/DolphinWX/resources/toolbar_plugin_gfx.xpm b/Source/Core/DolphinWX/resources/toolbar_plugin_gfx.xpm new file mode 100644 index 0000000000..b1d0ba0fda --- /dev/null +++ b/Source/Core/DolphinWX/resources/toolbar_plugin_gfx.xpm @@ -0,0 +1,310 @@ +/* XPM */ +static char *toolbar_plugin_gfx_xpm[] = { +/* columns rows colors chars-per-pixel */ +"48 48 256 2", +" c #0C4F95", +". c #164C91", +"X c #1A4F91", +"o c #0E5096", +"O c #0E5298", +"+ c #135296", +"@ c #1A5395", +"# c #17589B", +"$ c #15488E", +"% c #3E6292", +"& c #145EA1", +"* c #1D5EA0", +"= c #0963A7", +"- c #0663A8", +"; c #0B65A9", +": c #0E6BAD", +"> c #0661A7", +", c #1462A4", +"< c #116BAD", +"1 c #1D6BAC", +"2 c #1566A9", +"3 c #1E70AE", +"4 c #056BB0", +"5 c #156FB0", +"6 c #0D74B4", +"7 c #0374B9", +"8 c #0A77B8", +"9 c #0A7BBB", +"0 c #0B78B7", +"q c #1372B2", +"w c #1D74B3", +"e c #157BBB", +"r c #1B7BBA", +"t c #226EAD", +"y c #2868A6", +"u c #366EA8", +"i c #396FA8", +"p c #3A6AA4", +"a c #2371AF", +"s c #3D70A9", +"d c #3572AC", +"f c #2374B3", +"g c #2579B6", +"h c #247CBB", +"j c #2B7DBA", +"k c #2976B3", +"l c #327AB5", +"z c #3D7CB3", +"x c #317EBB", +"c c #4D6B93", +"v c #446796", +"b c #567598", +"n c #4174AB", +"m c #497AAF", +"M c #4A79AE", +"N c #447DB2", +"B c #4A7EB2", +"V c #547EB0", +"C c #007DC5", +"Z c #0B80BF", +"A c #0F8CBF", +"S c #1888BA", +"D c #2C87AF", +"F c #3A87A9", +"G c #3886AA", +"H c #2488B3", +"J c #2780BE", +"K c #2B82BE", +"L c #3381BC", +"P c #3B83BD", +"I c #3D81B7", +"U c #56859E", +"Y c #708D9E", +"T c #7E959F", +"R c #4685A4", +"E c #4481B5", +"W c #4D82B5", +"Q c #4385BA", +"! c #4C85B9", +"~ c #4D8ABD", +"^ c #448ABD", +"/ c #5084B7", +"( c #5186B9", +") c #538BBD", +"_ c #5C88B7", +"` c #5485A1", +"' c #618FBC", +"] c #6D92BB", +"[ c #789BBB", +"{ c #7394A6", +"} c #0383C4", +"| c #0A82C1", +" . c #0B8DC3", +".. c #0086CA", +"X. c #018CCD", +"o. c #078CC8", +"O. c #1C85C3", +"+. c #1387C5", +"@. c #0190CE", +"#. c #1E93CF", +"$. c #1291CF", +"%. c #008FD1", +"&. c #0194D2", +"*. c #0897D4", +"=. c #0C99D6", +"-. c #0299D8", +";. c #0E9AD9", +":. c #0598D4", +">. c #1499D6", +",. c #1C9AD6", +"<. c #129AD8", +"1. c #1E9AD4", +"2. c #2485C3", +"3. c #2C86C2", +"4. c #2589C7", +"5. c #2C8BC5", +"6. c #2B8CC9", +"7. c #3386C2", +"8. c #3A86C1", +"9. c #3C8AC4", +"0. c #328EC9", +"q. c #378DC8", +"w. c #2993CE", +"e. c #3392CC", +"r. c #3B93CC", +"t. c #3393C7", +"y. c #229DD5", +"u. c #2B9DD5", +"i. c #239CD8", +"p. c #2A9FD9", +"a. c #3C99D3", +"s. c #2BA2DA", +"d. c #2CA6DA", +"f. c #34A3D7", +"g. c #34A4DA", +"h. c #3CA5DD", +"j. c #34AADC", +"k. c #3BADDE", +"l. c #428BC4", +"z. c #4D8EC3", +"x. c #538EC1", +"c. c #588FC1", +"v. c #4292CA", +"b. c #469ACE", +"n. c #5491C3", +"m. c #5B94C3", +"M. c #5F9BCB", +"N. c #499DD4", +"B. c #6999C2", +"V. c #6299C8", +"C. c #6995C0", +"Z. c #769DC3", +"A. c #53A4CF", +"S. c #41A7DF", +"D. c #44ACDE", +"F. c #4BAFDF", +"G. c #4AA4DA", +"H. c #58A8D8", +"J. c #59B0DF", +"K. c #63AED8", +"L. c #6AB1D4", +"P. c #78B7D6", +"I. c #6FA3CA", +"U. c #46AAE0", +"Y. c #4CADE2", +"T. c #52AFE3", +"R. c #4EB0E0", +"E. c #54B1E3", +"W. c #5CB5E4", +"Q. c #5EB6E8", +"!. c #61B7E4", +"~. c #65B9E6", +"^. c #6ABBE7", +"/. c #63BAEA", +"(. c #6CBDE9", +"). c #75BBE5", +"_. c #72BEE9", +"`. c #6FC1EE", +"'. c #75C1EB", +"]. c #7BC4EC", +"[. c #7DC6F0", +"{. c #8E8C8C", +"}. c #878584", +"|. c #939291", +" X c #9D9C9B", +".X c #999897", +"XX c #87989F", +"oX c #A09F9E", +"OX c #A1A09F", +"+X c #939DA7", +"@X c #849CB3", +"#X c #98A1A3", +"$X c #9CA7AA", +"%X c #85A2BF", +"&X c #99A5B4", +"*X c #A5A4A4", +"=X c #A9A7A6", +"-X c #ABA8A6", +";X c #ACABAB", +":X c #A2ACAF", +">X c #B1AEAC", +",X c #B2B0AF", +"X>X>X>X>X>X>X>X>X,X5X6X9XqXqXwXbXnXnXmXmXMXMXMXMXMXMXMXMXmXmXbXbXbX9XbXUXUXUX", +"UXUXUXUX-X:Xv % v c c c c b b b b Y T XX+X#X#X$X$X$X:X2X2X0X7XqXeXnXnXnXnXnXnXnXnXnXbXwXMX>XUXUX", +"UXUXUXUX;X&X@ $ . . . . . . . . . 9 @.o.o. . . .A A S S S H H D D F F F R R R ` ` U { bXCX;X|.UX", +"UXUXUXUX>X@X@ X @ @ @ @ @ @ @ @ @ 0 -.*.=.;.<.<.;.;.-.-.-.-.&.&.&.%.%.X.X.......} C 5.mXCX;X|.UX", +"UXUXUXUX>X[ @ @ @ @ @ @ @ @ @ # @ 5 <.,.1.i.i.i.i.i.,.>.=.:.&.&.&.&.X.X.X.X.......C t.NXCX;X|.UX", +"UXUXUXUX>XrXs n n s s s i i u u p l h.h.h.h.h.h.g.g.g.s.p.,.<.:.&.&.&.X.X.X.......C r.BXZX=X|.UX", +"UXUXUX-X>XrXn m m m B B B B B W B ( J.W.W.W.W.W.W.W.W.E.E.Y.D.k.d.d.s.s.y.y.y.1.#.$.A.CXAX*X|.UX", +"UXUXUX-X>X%Xn m N N N N N B B W W / H.W.!.!.!.!.!.!.W.W.W.E.E.R.D.k.j.j.j.g.f.f.f.u.L.ZXSX*X|.UX", +"UXUXUX-X;X[ N N N N N E E W W W / / H.~.~.~.^.^.~.~.~.!.W.W.E.E.F.D.j.j.j.g.f.f.f.u.L.AXSXOXUXUX", +"UXUXUX-X2XB.z N N E E E W ! W ( ( ( H.(.^.(.(.(.(.^.^.~.~.!.W.E.E.F.k.j.j.j.g.f.f.u.P.DXSXoXUXUX", +"UXUXUX-X5XB.z E E E E ! ! ! ( ) ) ) M.(._._._._._._.(.^.~.~.W.W.E.R.D.j.j.j.g.f.f.u.P.DXSX XUXUX", +"UXUXUX=X0XI.z E Q Q Q ! ~ ) ) ) ) ) M._.'.'.'.'.'._._.(.^.~.!.W.W.E.F.k.j.j.j.f.f.u.pXGXSX XUXUX", +"UXUXUX=X0XK.I Q Q Q Q ~ ~ ) ) c.c.m.M._.].].].].].'.'._.(.^.~.!.W.E.R.D.j.j.j.g.f.u.gXHXSX XUXUX", +"UXUXUX=X3XD.L Q ^ ^ ~ ~ ) x.n.n.m.m.m.).].].cXcX].].].'._.(.^.~.W.W.E.D.j.d.s.y.,.X.P.HXSX XUXUX", +"UXUXUX-XsX,.8 3 g L ^ ~ x.n.m.m.M.V.V.).vXvXvXvXvXcX].'._.(.~.W.E.D.h.s.;.:.&.X.X...pXKXSX XUXUX", +"UXUXUX-XiX=.} : : q w g l L P l.z.z.n.K.'.].].[.'.'.^.Q.E.Y.U.h.g.s.i.,.*.&.&.X.X...pXKXSX XUXUX", +"UXUXUX-XiX:.X.6 6 q w g g j j x L P P N./.(.`.`.(./.Q.E.T.Y.U.h.h.g.p.,.*.&.&.@.X...gXHXSX XUXUX", +"UXUXUX-XiX&.%.9 6 q w h j j L L 8.8.8.b././.(.(././.Q.E.T.Y.U.h.h.g.p.,.*.&.&.X.X...hXHXSX XUXUX", +"UXUXUX-XaX%.&.} 6 0 r h j K L 7.8.9.l.v.Q././././.Q.W.E.Y.Y.S.h.g.g.p.,.:.&.&.X.X...hXGXZX.XUXUX", +"UXUXUX>XP.X.X.X.0 0 r h J K 7.7.9.9.l.v.T.Q././.Q.W.E.E.Y.U.S.h.g.p.i.>.:.&.&.X.X...hXDXCX.XUXUX", +"UXUX-X>XL.X.X.&.Z 9 e S 2.3.7.7.q.q.v.v.F.W.W.W.W.E.E.Y.Y.U.h.h.g.p.i.>.&.&.&.X.X...xXFXCX.XUXUX", +"UXUX-X>XK...X.&.} 9 Z O.2.3.5.0.q.r.r.v.G.E.E.E.E.T.Y.Y.U.S.h.g.s.p.,.*.&.&.&.X.X...xXAXNX.XUXUX", +"UXUX-X.:.&.&.X.X.X...xXZXMX|.UXUX", +"UXUX-X5XH...X.X.@.} | | O.4.6.6.e.e.r.r.a.U.U.U.U.U.U.h.h.h.g.p.i.,.*.&.&.&.X.X...o.jXVXmX|.UXUX", +"UXUX-X2Xb.C } } ..| 9 | +.O.2.5.6.0.e.e.a.h.S.S.S.h.h.h.g.g.s.p.,.=.&.&.&.@.X.X...o.jXBXmX|.UXUX", +"UXUX-X3Xt.7 9 9 9 9 0 0 0 e r h J K K 3.3.0.e.e.e.e.e.e.w.w.w.#.$.@.@.X.X.X.X.X...o.lXMXbX|.UXUX", +"UXUX=X8XK 4 6 6 6 6 6 6 6 6 q w g g g g g j K K j j j h h h r e 0 0 0 0 8 8 8 8 7 0 4XmXbX|.UXUX", +"UXUX=X8Xj > ; ; - - > = = ; ; < < 1 1 t a f f f f f f f w w q < : < < < < < < < ; 2 &XnXbX|.UXUX", +"UXUX=X2XdXuXtXZ.Z.B.m.~ Q z l k t t 1 2 , , , , , , , , , , , , , , , , , , , & & & &XbXbX|.UXUX", +"UXUX-X=X-X;X;X,X5X5X5X3X3X3XfXfXsXyXyXyXuXtXZ.C.' _ W N d y y * # # # O o o + o + &XeXwX|.UXUX", +"UXUX-X-X-X-X-X-X-X-X-X-X-X=X=X=X-X-X;X>X,X5X0X9X9XbXzXlXlXlXlXdXiXuXrXrXZ.] _ V M p +XqX9X|.UXUX", +"UX=X*X*X*X*X*X*X=X=X=X=X=X-X-X-X-X-X-X-X;X;X;X>X,X5X5X6X7X7X7X9X9XwXwXbXbXbXkXkXmXkX2X7X9X|.UXUX", +"UXUXJXSXCXMXbX9X9X5X;X;X=X=X=X*X*X*X*X=X=X=X-X;X;X5X5X5X5X5X6X7X7X7X7X7X7X6X6X6X5X5X5X6X9X|.UXUX", +"UXUXUXUXUXUXUXUXUXUXPXPXPXJXAXCXNXmXbXbX9X0X5X5X;X;X;X;X;X;X>X,X5X5X5X5X5X5X5X5X5X>X;X5X7X|.UXUX", +"UXUXUXUXUXUXUXUXUXUXUXUXUXUXmXmXbXbXMXbXbXnXmXmXMXMXMXNXMXMXmXbXbX9X0X6X5X;X-X-X=X=X*X;X6X|.UXUX", +"UXUXUXUXUXUXUXUXUXUXUXUXUX6X5X;X5X6X9X;X{.{.{.{.|..X.X*X7XbXMXMXMXCXCXCXSXJXJXZXMXbX9XbX7XUXUXUX", +"UXUXUXUXUXUXUXUXUXUXUXUX5X;X;X5X6X9XbXbX6X5X5X>X;X=X*X X;X9X9X6X,X;X;X;X5XbXUXUXUXUXUXUXUXUXUXUX", +"UXUXUXUXUXUXUXUXUXUXUX>X;X;X,X5X7X9XbXmXMXCXZXAXZXZXCXMXMXbXwX9X0X5X;X;X;X;XUXUXUXUXUXUXUXUXUXUX", +"UXUXUXUXUXUXUXUXUXUXUX;X;X>X5X6X9XbXmXMXCXCXZXAXAXAXZXCXMXmXbX9X7X5X>X;X;X;X;XUXUXUXUXUXUXUXUXUX", +"UXUXUXUXUXUXUXUXUXUX;X;X;X>X5X7X9XbXmXMXCXZXAXAXSXAXZXAXCXMXmX9X9X5X,X;X;X;X;XUXUXUXUXUXUXUXUXUX", +"UXUXUXUXUXUXUXUXUXUXUX>X;X>X5X7X9XbXmXCXZXAXSXSXSXSXZXSXJXCXCXmX7X6X5X;X;X;X*XUXUXUXUXUXUXUXUXUX", +"UXUXUXUXUXUXUXUXUXUXUX*X5X>X5X9XqXbXMXCXZXAXSXSXSXSXAXSXKXJXMXSXmX5X5X;X>X;XUXUXUXUXUXUXUXUXUXUX", +"UXUXUXUXUXUXUXUXUXUXUXUX;X6X5X7XqXbXMXCXZXAXSXSXSXSXAXAXKXLXSXmXLXCX;X5X6XUXUXUXUXUXUXUXUXUXUXUX", +"UXUXUXUXUXUXUXUXUXUXUXUXUX-XwX9X9XbXmXMXCXZXAXSXSXAXZXCXJXPXPXmXMXIXJX;XUXUXUXUXUXUXUXUXUXUXUXUX", +"UXUXUXUXUXUXUXUXUXUXUXUXUXUX{.6XmXMXMXMXCXCXZXZXZXZXZXCXSXIXIXPXmXCX5XUXUXUXUXUXUXUXUXUXUXUXUXUX", +"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX*X9XMXAXSXJXJXJXJXSXAXSXLXCX7X{.UXUXUXUXUXUXUXUXUXUXUXUXUXUXUX", +"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX|. X*X=X*X X|.}.UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX" +}; diff --git a/Source/Core/DolphinWX/resources/toolbar_plugin_options.c b/Source/Core/DolphinWX/resources/toolbar_plugin_options.c new file mode 100644 index 0000000000..13976bf5ee --- /dev/null +++ b/Source/Core/DolphinWX/resources/toolbar_plugin_options.c @@ -0,0 +1,286 @@ +static const unsigned char toolbar_plugin_options_png[] = { +0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, +0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, +0x08, 0x06, 0x00, 0x00, 0x00, 0x57, 0x02, 0xf9, 0x87, 0x00, 0x00, 0x00, +0x04, 0x73, 0x42, 0x49, 0x54, 0x08, 0x08, 0x08, 0x08, 0x7c, 0x08, 0x64, +0x88, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, +0x12, 0x00, 0x00, 0x0b, 0x12, 0x01, 0xd2, 0xdd, 0x7e, 0xfc, 0x00, 0x00, +0x00, 0x25, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, +0x72, 0x65, 0x00, 0x4d, 0x61, 0x63, 0x72, 0x6f, 0x6d, 0x65, 0x64, 0x69, +0x61, 0x20, 0x46, 0x69, 0x72, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, +0x4d, 0x58, 0x20, 0x32, 0x30, 0x30, 0x34, 0x87, 0x76, 0xac, 0xcf, 0x00, +0x00, 0x00, 0x15, 0x74, 0x45, 0x58, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, +0x69, 0x6f, 0x6e, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x00, 0x39, 0x2f, 0x31, +0x38, 0x2f, 0x30, 0x34, 0x73, 0x4e, 0xa2, 0xdf, 0x00, 0x00, 0x0c, 0x97, +0x49, 0x44, 0x41, 0x54, 0x78, 0x9c, 0xd5, 0x99, 0x6b, 0x8c, 0x5d, 0xd5, +0x75, 0x80, 0xbf, 0xbd, 0xcf, 0xfb, 0xdc, 0x79, 0x5c, 0x63, 0x7b, 0x8c, +0x5f, 0x78, 0x10, 0x85, 0x16, 0xd3, 0x8a, 0x81, 0xa9, 0x11, 0x29, 0xc4, +0x0c, 0x24, 0x54, 0x51, 0xda, 0xca, 0xa6, 0xa0, 0x96, 0xaa, 0x1a, 0x33, +0x36, 0xd8, 0x40, 0x48, 0x8a, 0x93, 0x36, 0x25, 0x90, 0x84, 0x4e, 0x7e, +0xf5, 0x19, 0xd9, 0x56, 0xa8, 0xfa, 0xa3, 0x42, 0x63, 0x34, 0x4a, 0xa5, +0xb6, 0xa2, 0xc0, 0x7f, 0x5a, 0x9b, 0xa0, 0x04, 0x42, 0x6a, 0x3c, 0xd8, +0xc1, 0xd8, 0x01, 0x93, 0x19, 0xcf, 0xd8, 0xcc, 0xfb, 0xbe, 0x1f, 0xe7, +0xb5, 0x77, 0x7f, 0x9c, 0x7b, 0xaf, 0x67, 0x0c, 0xe3, 0xf8, 0x45, 0x50, +0x97, 0xb4, 0xaf, 0x8e, 0xce, 0x3d, 0x67, 0xef, 0xf5, 0xed, 0xb5, 0xf6, +0xda, 0x6b, 0xed, 0x23, 0xb4, 0xd6, 0xfc, 0x7f, 0x16, 0xf3, 0x4a, 0x77, +0xb8, 0x6d, 0xdb, 0xb6, 0x3e, 0xa0, 0x5b, 0x6b, 0xdd, 0xdd, 0xb8, 0x35, +0x02, 0x8c, 0x0e, 0x0f, 0x0f, 0x8f, 0x5c, 0xe9, 0xb1, 0x00, 0xc4, 0x95, +0xb0, 0xc0, 0xf6, 0x1d, 0x3b, 0xfa, 0xd0, 0x0c, 0x80, 0xde, 0xa2, 0x35, +0x59, 0xd0, 0x68, 0x7d, 0xb6, 0x35, 0x24, 0x0f, 0xbc, 0x00, 0xec, 0x1d, +0x1e, 0x1e, 0x1e, 0xbd, 0xec, 0x41, 0x1b, 0x72, 0x59, 0x00, 0x0f, 0x3f, +0xf2, 0x48, 0x0f, 0xb0, 0x07, 0x4d, 0x5f, 0x7a, 0x47, 0xa3, 0x35, 0x68, +0x34, 0xe8, 0xc5, 0x10, 0xe7, 0x8c, 0xb3, 0x0f, 0x18, 0x1c, 0x1e, 0x1e, +0xce, 0x5f, 0xba, 0xea, 0xa9, 0x5c, 0x16, 0xc0, 0xce, 0x5d, 0xbb, 0x0e, +0x40, 0x43, 0x79, 0x9d, 0xfe, 0xb8, 0x9e, 0x4f, 0x7b, 0x7b, 0x07, 0x8e, +0xe3, 0x62, 0x9a, 0x26, 0x4a, 0x29, 0x6a, 0xb5, 0x2a, 0x95, 0x4a, 0x99, +0x7c, 0x6e, 0x1e, 0xa5, 0x54, 0xf3, 0xf5, 0x51, 0xe0, 0xbe, 0xcb, 0x75, +0xad, 0xcb, 0x02, 0x78, 0xf4, 0xb1, 0xc7, 0xef, 0x02, 0x0e, 0xa6, 0x00, +0x1a, 0xdf, 0xcf, 0x70, 0x6b, 0x6f, 0x2f, 0x1b, 0x36, 0x6c, 0x60, 0xc5, +0x8a, 0x15, 0x78, 0x9e, 0x8f, 0x52, 0x8a, 0x72, 0xb9, 0xcc, 0xe4, 0xe4, +0x24, 0x47, 0x8e, 0xbc, 0xc3, 0x87, 0x27, 0x3f, 0xa0, 0x52, 0x29, 0x37, +0xbb, 0xc8, 0x4b, 0x29, 0xef, 0xd9, 0xbf, 0x7f, 0xff, 0xe1, 0xcf, 0x04, +0x00, 0xe0, 0xf1, 0xaf, 0x3c, 0xf1, 0x12, 0xb0, 0x15, 0xad, 0xe9, 0xe8, +0xcc, 0xf2, 0xe4, 0x93, 0x4f, 0xa2, 0x95, 0x46, 0x69, 0xc5, 0xfc, 0x7c, +0x0e, 0xd3, 0x34, 0xf0, 0x3c, 0x0f, 0xa5, 0x34, 0x41, 0x10, 0x70, 0xf8, +0xf0, 0x61, 0x7e, 0xfa, 0xd3, 0x37, 0x28, 0x97, 0x8a, 0x4d, 0xd7, 0xca, +0x9b, 0xa6, 0xf9, 0x85, 0xe7, 0x9f, 0x7f, 0xfe, 0xed, 0xcf, 0x04, 0xe0, +0x89, 0xaf, 0x7e, 0x6d, 0x03, 0x30, 0x4a, 0xc3, 0xf7, 0x6f, 0xbd, 0xe5, +0x56, 0x2c, 0xdb, 0x61, 0x7e, 0x7e, 0x9e, 0x24, 0x49, 0x50, 0x4a, 0x21, +0xa5, 0x64, 0xcd, 0x9a, 0x35, 0x6c, 0xdc, 0xb8, 0x91, 0x4c, 0x26, 0xc3, +0xcf, 0xde, 0x7a, 0x8b, 0xff, 0x3d, 0xf4, 0x33, 0x0a, 0xf9, 0x1c, 0x4a, +0x29, 0xb4, 0xd6, 0xa3, 0x9d, 0x9d, 0x9d, 0xbd, 0xfb, 0xf6, 0xed, 0x9b, +0xbf, 0xd8, 0xf1, 0xe5, 0xf9, 0xfe, 0xdc, 0xb5, 0xeb, 0xd1, 0x9e, 0xc7, +0x1e, 0x7b, 0x7c, 0xe0, 0x7c, 0xcf, 0xfc, 0xf3, 0x73, 0x3f, 0x18, 0x93, +0x52, 0xee, 0x95, 0x52, 0x22, 0xa5, 0xe4, 0xf0, 0xc8, 0x61, 0xe6, 0xe6, +0xe6, 0x90, 0x52, 0x62, 0x18, 0x06, 0x52, 0x4a, 0x92, 0x24, 0xe1, 0xd4, +0xa9, 0x53, 0xbc, 0xfa, 0xea, 0xab, 0x8c, 0x8e, 0x8e, 0xb2, 0xe9, 0xb6, +0xdb, 0xb8, 0xe5, 0x96, 0x5e, 0xfc, 0x4c, 0x06, 0xcb, 0xb2, 0x30, 0x0c, +0xa3, 0xbb, 0x58, 0x2c, 0xee, 0xb9, 0x58, 0xe5, 0xcf, 0x0b, 0xb0, 0x6b, +0xd7, 0xa3, 0x3d, 0x52, 0xca, 0x03, 0x42, 0x88, 0xa1, 0xaf, 0x3c, 0xf1, +0xd5, 0xad, 0xe7, 0xed, 0x44, 0xca, 0x41, 0x29, 0x65, 0x5e, 0x8a, 0x14, +0x62, 0x7e, 0x6e, 0x96, 0x26, 0x50, 0xb3, 0x19, 0x86, 0x01, 0xc0, 0x91, +0x23, 0x47, 0x18, 0x1f, 0x1f, 0xa7, 0xb7, 0xb7, 0x97, 0xf5, 0xeb, 0x37, +0x60, 0x59, 0x16, 0xa6, 0x69, 0x02, 0x6c, 0x7b, 0xe8, 0xa1, 0x87, 0xee, +0xbe, 0x22, 0x00, 0x3b, 0x77, 0xed, 0xea, 0x16, 0x42, 0x1c, 0x10, 0x42, +0x64, 0x85, 0x94, 0x48, 0x21, 0x87, 0xbe, 0xf6, 0x17, 0x4f, 0xf6, 0x2c, +0xd5, 0xc9, 0xbe, 0xbd, 0x7b, 0x0a, 0x2d, 0x2b, 0x08, 0x49, 0xa1, 0x58, +0x40, 0xa9, 0xe4, 0x13, 0x21, 0x2c, 0xcb, 0xe4, 0xbd, 0x63, 0xc7, 0xc8, +0xe7, 0xf3, 0xf4, 0xf6, 0xf6, 0xd2, 0xd9, 0x99, 0xc5, 0x34, 0x4d, 0x0c, +0xc3, 0x40, 0x6b, 0xfd, 0xec, 0x15, 0x01, 0x10, 0x42, 0x0c, 0x09, 0x21, +0xb2, 0x42, 0x08, 0x84, 0x10, 0x08, 0x29, 0xb2, 0x52, 0xc8, 0xa1, 0xdd, +0x5f, 0xff, 0x46, 0x76, 0xa9, 0x8e, 0xf6, 0xec, 0xf9, 0xfe, 0xf7, 0x84, +0x94, 0xa3, 0xa2, 0xa1, 0xec, 0xec, 0xec, 0x0c, 0xad, 0xf7, 0x85, 0xc0, +0x30, 0x0c, 0x4c, 0xd3, 0xc0, 0xb2, 0x2c, 0x1c, 0xd7, 0xe1, 0xc3, 0x93, +0x27, 0xe9, 0xea, 0x5a, 0x45, 0x57, 0xd7, 0xaa, 0xa6, 0x1b, 0x21, 0x84, +0xe8, 0xeb, 0xef, 0xef, 0x5f, 0x72, 0xa2, 0x2e, 0x08, 0x60, 0xe7, 0xae, +0x5d, 0x0f, 0x09, 0x44, 0xdf, 0xc2, 0xc1, 0x1b, 0xad, 0x47, 0x08, 0x39, +0x74, 0xde, 0xce, 0xa4, 0xdc, 0x2d, 0x85, 0x40, 0x08, 0x49, 0xb1, 0x50, +0x24, 0x8e, 0x63, 0x84, 0x10, 0x48, 0x29, 0x11, 0x42, 0x60, 0x9a, 0x16, +0xb6, 0x6d, 0xe3, 0x38, 0x0e, 0xa6, 0x65, 0x32, 0x3d, 0x3d, 0xc5, 0x75, +0xd7, 0xfd, 0xc6, 0x42, 0x00, 0x80, 0x87, 0x2e, 0x0b, 0x40, 0x20, 0x06, +0x9b, 0x4a, 0x3b, 0xae, 0xcb, 0xb5, 0xdd, 0xd7, 0x2e, 0x84, 0xd8, 0xfa, +0x57, 0xdf, 0x7c, 0xea, 0x6f, 0x96, 0xea, 0xec, 0xfb, 0xff, 0xf4, 0x0f, +0xaf, 0x08, 0x29, 0x0f, 0x36, 0x9f, 0x9f, 0x9b, 0x9d, 0x6d, 0xbd, 0x6b, +0x9a, 0xa9, 0x05, 0x6c, 0xdb, 0xc6, 0x75, 0x5d, 0x5c, 0xd7, 0xa5, 0x58, +0x2c, 0xb2, 0x7c, 0xf9, 0x72, 0x32, 0x99, 0x4c, 0x0b, 0x12, 0x38, 0xef, +0x7a, 0x3b, 0x2f, 0xc0, 0x23, 0x3b, 0x77, 0xf6, 0x01, 0xdd, 0x08, 0x81, +0x94, 0x06, 0xbf, 0xf7, 0xb9, 0x3b, 0x78, 0xf0, 0xc1, 0x07, 0x59, 0x7d, +0xf5, 0xea, 0x85, 0x10, 0x83, 0x4f, 0x7d, 0xeb, 0x99, 0x25, 0x07, 0x11, +0x42, 0x74, 0x0b, 0x21, 0x40, 0x08, 0x0a, 0xc5, 0x3c, 0x51, 0x14, 0x61, +0x34, 0xfc, 0xdf, 0xb6, 0x6d, 0x1c, 0xdb, 0xc6, 0x75, 0x1d, 0x1c, 0xc7, +0xc6, 0x30, 0x0c, 0x6a, 0xf5, 0x1a, 0x8e, 0xe3, 0x22, 0x65, 0x4b, 0x95, +0xee, 0xfe, 0xfe, 0xfe, 0x25, 0x5d, 0xf5, 0xbc, 0x00, 0x02, 0xb6, 0x90, +0xce, 0x02, 0x9e, 0xef, 0xb1, 0x76, 0xdd, 0x5a, 0x1c, 0xc7, 0x61, 0x60, +0x60, 0x00, 0xd7, 0xf3, 0x16, 0x42, 0x0c, 0x3d, 0xfd, 0xcc, 0x77, 0x3f, +0xe6, 0xab, 0x7f, 0xfd, 0xd4, 0x33, 0x43, 0x40, 0xb7, 0x48, 0xfb, 0x42, +0x0a, 0x49, 0x50, 0xaf, 0x23, 0x0d, 0x99, 0xba, 0x8f, 0xd5, 0x98, 0x7d, +0xc7, 0xc5, 0xb6, 0x6d, 0x2c, 0xd3, 0x24, 0x8a, 0x22, 0x2c, 0xdb, 0x3a, +0xb7, 0xab, 0x9b, 0x2f, 0x09, 0x00, 0xe8, 0x13, 0x8d, 0x0b, 0xcb, 0xb2, +0x59, 0xb7, 0x76, 0x2d, 0xc7, 0x4f, 0x9c, 0xa0, 0x5a, 0xad, 0xf2, 0xf0, +0x8e, 0xed, 0xb8, 0xae, 0xdb, 0x7c, 0x2e, 0x2b, 0x04, 0x43, 0xdf, 0xf9, +0xee, 0x60, 0x16, 0xe0, 0x99, 0x6f, 0x3f, 0xdb, 0xf7, 0xad, 0xa7, 0xbf, +0x73, 0x00, 0x18, 0x10, 0x88, 0x56, 0x67, 0xeb, 0xd6, 0xaf, 0xa7, 0x33, +0x9b, 0xc5, 0x32, 0x2d, 0x1c, 0xc7, 0xc6, 0xf5, 0x5c, 0x3c, 0xcf, 0xc3, +0x71, 0x1c, 0x2c, 0xcb, 0x42, 0x1a, 0x92, 0x30, 0x0c, 0xd3, 0x04, 0xf0, +0x12, 0x37, 0xd4, 0x45, 0x00, 0x1a, 0x7a, 0x34, 0x20, 0x84, 0x60, 0xc5, +0x8a, 0x15, 0x84, 0x51, 0xc4, 0xa1, 0x43, 0x6f, 0xf3, 0xc6, 0x1b, 0x6f, +0xd2, 0xd1, 0xd1, 0xc9, 0x03, 0x0f, 0xdc, 0x4f, 0x23, 0xd1, 0x44, 0x6b, +0x7a, 0x94, 0x52, 0x87, 0x9f, 0xf9, 0xf6, 0xb3, 0xbf, 0xd4, 0x5a, 0x1f, +0x00, 0xdd, 0x97, 0xee, 0xc5, 0x1a, 0xd7, 0xf3, 0xb8, 0xf7, 0xf7, 0xef, +0xe5, 0x9e, 0x7b, 0xbe, 0x80, 0x69, 0x9a, 0xd8, 0x8e, 0x8d, 0xe7, 0x79, +0xf8, 0x9e, 0x87, 0xeb, 0xb9, 0x2d, 0xf7, 0x01, 0xa8, 0x56, 0x2a, 0xc4, +0x71, 0xbc, 0x30, 0xc9, 0xbb, 0x28, 0x69, 0x15, 0x34, 0x3b, 0x76, 0x3c, +0xdc, 0x23, 0xa5, 0x4c, 0xe7, 0x4f, 0x6b, 0xda, 0xdb, 0x3b, 0x38, 0x7a, +0xf4, 0x28, 0x42, 0x08, 0xf2, 0x85, 0x02, 0xaf, 0xfe, 0xf7, 0xff, 0x70, +0xef, 0x17, 0xbf, 0xc8, 0xfd, 0x0f, 0xdc, 0xcf, 0x8b, 0x2f, 0xfe, 0x17, +0x5a, 0x29, 0xb4, 0x10, 0xdd, 0x82, 0x86, 0xda, 0x5a, 0xd3, 0xd5, 0xd5, +0xc5, 0xa6, 0x4d, 0xbf, 0xcb, 0x4d, 0x37, 0xdd, 0x44, 0xbd, 0x1e, 0xf0, +0xda, 0xc1, 0xd7, 0x70, 0x9a, 0xca, 0xfb, 0x3e, 0x7e, 0xc6, 0xc7, 0x73, +0x5d, 0x10, 0x82, 0x38, 0x49, 0x48, 0x12, 0x45, 0x9c, 0x24, 0xd4, 0x6b, +0x35, 0x92, 0x24, 0xb9, 0x24, 0x2b, 0x2c, 0xac, 0xc8, 0x3a, 0x9b, 0x17, +0x42, 0x4a, 0xda, 0xdb, 0xda, 0x38, 0x7d, 0xfa, 0x4c, 0x2b, 0x3a, 0xe4, +0xf3, 0x79, 0x0e, 0xbd, 0x7d, 0x88, 0xcf, 0xdd, 0x7e, 0x3b, 0x9b, 0x37, +0xdf, 0xc9, 0x8f, 0x7e, 0xf4, 0x3a, 0x68, 0x81, 0xe7, 0xba, 0xdc, 0xf0, +0x9b, 0xd7, 0xb3, 0x69, 0xd3, 0x26, 0x56, 0xae, 0x5c, 0x89, 0x52, 0x8a, +0xe9, 0xa9, 0x69, 0x8e, 0xfe, 0xfc, 0x5d, 0x12, 0x95, 0xe0, 0x79, 0x1e, +0x6d, 0x99, 0x0c, 0x6d, 0x6d, 0x19, 0x7c, 0xcf, 0xc7, 0x34, 0x4d, 0x92, +0x24, 0x26, 0x49, 0x12, 0xa2, 0x30, 0x24, 0x8a, 0x22, 0x2a, 0x95, 0x72, +0x2b, 0x6f, 0x6a, 0xc8, 0xe8, 0x45, 0x03, 0x2c, 0xa4, 0x97, 0x42, 0x10, +0x84, 0x01, 0x49, 0x92, 0x34, 0x62, 0xb4, 0x44, 0x20, 0x18, 0x1b, 0x3b, +0x85, 0x14, 0x82, 0xcf, 0xdf, 0xf9, 0x79, 0xd0, 0x90, 0xcd, 0x66, 0xb9, +0xfe, 0x86, 0xeb, 0x71, 0x1c, 0x07, 0xad, 0x34, 0x93, 0x93, 0x53, 0x9c, +0x38, 0x71, 0x82, 0x5c, 0x2e, 0x8f, 0x65, 0x99, 0xf8, 0xbe, 0x4f, 0xc6, +0xf7, 0x69, 0x6b, 0x6b, 0x23, 0x93, 0xf1, 0xb1, 0x6d, 0x1b, 0xad, 0x35, +0x61, 0x98, 0x10, 0x06, 0x21, 0x41, 0x10, 0x50, 0x28, 0xe4, 0xa9, 0xd7, +0xeb, 0x0b, 0x95, 0xcf, 0x0f, 0x0f, 0x0f, 0x8f, 0x5d, 0x82, 0x05, 0x52, +0xff, 0x85, 0x74, 0x0d, 0x14, 0x0a, 0x85, 0xc6, 0xee, 0x99, 0x6e, 0xf3, +0x86, 0x21, 0xd1, 0x1a, 0x26, 0x4e, 0x9f, 0x61, 0xe5, 0xe8, 0x2f, 0xb9, +0xe3, 0x8e, 0x3b, 0x5a, 0xef, 0x8d, 0x8d, 0x8e, 0x31, 0x3a, 0x36, 0xd6, +0x48, 0x9f, 0x4d, 0x7c, 0xcf, 0xc3, 0x71, 0x9d, 0xd6, 0xec, 0xfb, 0x19, +0x1f, 0xd7, 0x71, 0x00, 0x08, 0x82, 0x80, 0x7a, 0x10, 0x50, 0xad, 0xd5, +0xa8, 0xd5, 0xea, 0xcc, 0xce, 0xcc, 0x10, 0x45, 0xd1, 0x42, 0x17, 0x3a, +0x78, 0xa1, 0xca, 0x9f, 0x6b, 0x81, 0xd1, 0x85, 0x65, 0xe0, 0x47, 0x67, +0xce, 0xb0, 0xfe, 0x9a, 0x0d, 0x98, 0x86, 0x81, 0x65, 0x9f, 0xdd, 0x29, +0xb5, 0xd6, 0xbc, 0xfb, 0xee, 0x31, 0xe2, 0x28, 0xa1, 0x56, 0xaf, 0x32, +0x39, 0x39, 0x4d, 0x10, 0xd4, 0x11, 0x42, 0xe0, 0xfb, 0x5e, 0x9a, 0x2a, +0x38, 0x4e, 0xc3, 0xef, 0xd3, 0x85, 0x6b, 0xdb, 0x36, 0x42, 0xa6, 0x11, +0xa7, 0x1e, 0x04, 0x54, 0x2b, 0x55, 0x2a, 0x95, 0x0a, 0xb9, 0x7c, 0x8e, +0x42, 0x21, 0x7f, 0xee, 0x22, 0x7e, 0xf9, 0x62, 0x00, 0x16, 0xd5, 0x03, +0xdb, 0xb7, 0x6f, 0xd7, 0x86, 0x61, 0xe2, 0x38, 0x0e, 0xae, 0xe7, 0xb2, +0x7e, 0xfd, 0x35, 0x64, 0x3b, 0x97, 0xe1, 0xba, 0xee, 0xc7, 0x20, 0x1a, +0x79, 0xfc, 0xa2, 0x5c, 0xc7, 0xb2, 0x2c, 0x1c, 0xdb, 0x4e, 0x67, 0xdf, +0x75, 0x5b, 0xe1, 0x12, 0x01, 0x51, 0x18, 0x51, 0xa9, 0x56, 0x29, 0x16, +0x8a, 0xe4, 0xf3, 0x79, 0xf2, 0x85, 0x02, 0xc7, 0xdf, 0x3b, 0x46, 0xa9, +0x54, 0x24, 0x08, 0x02, 0x94, 0x52, 0x88, 0x38, 0x39, 0xf3, 0xc2, 0xbf, +0xfd, 0x70, 0xed, 0x25, 0x59, 0xa0, 0x61, 0x85, 0x11, 0xad, 0x75, 0x8f, +0x52, 0x09, 0x49, 0x9c, 0x90, 0xcf, 0xe7, 0x69, 0x6f, 0xef, 0x04, 0x01, +0x86, 0x61, 0xe0, 0xd8, 0x36, 0x86, 0x69, 0x20, 0xc5, 0xd9, 0xe8, 0x2b, +0x64, 0xba, 0x6b, 0x9b, 0x0d, 0x00, 0xdb, 0x4e, 0xf3, 0x1d, 0xb3, 0x91, +0xdf, 0x68, 0xad, 0x08, 0xc3, 0x88, 0x5a, 0xb5, 0x4a, 0xa9, 0x54, 0xa2, +0x58, 0x2c, 0x52, 0x2a, 0x95, 0x19, 0x3f, 0x75, 0x8a, 0x4a, 0xa5, 0x4c, +0x14, 0x45, 0xad, 0xc9, 0xe8, 0x7d, 0xeb, 0xad, 0xec, 0x4b, 0x42, 0xf6, +0xdc, 0xa7, 0xd5, 0x05, 0xd7, 0xc9, 0x8b, 0x00, 0x94, 0xd2, 0x23, 0x42, +0x24, 0x3d, 0x71, 0x22, 0x31, 0xe2, 0x88, 0x4a, 0xb9, 0x4c, 0xb1, 0x98, +0x4f, 0x95, 0xb2, 0x2c, 0x68, 0x24, 0x64, 0x96, 0x65, 0x62, 0x1a, 0x06, +0x52, 0xa6, 0x6b, 0x23, 0x4d, 0x95, 0x4d, 0x0c, 0x33, 0x05, 0x91, 0x86, +0x81, 0x00, 0x92, 0x24, 0x21, 0x0c, 0x43, 0x6a, 0xd5, 0x1a, 0xa5, 0x52, +0x89, 0x42, 0xb1, 0x48, 0xb1, 0x58, 0x64, 0x72, 0xf2, 0x23, 0x66, 0x66, +0xa6, 0x08, 0xc3, 0xb0, 0xe5, 0xfb, 0xcb, 0x72, 0x39, 0xae, 0x3f, 0x79, +0xd2, 0x57, 0x70, 0xe0, 0x15, 0x21, 0xef, 0xde, 0x72, 0x81, 0x10, 0x8b, +0x37, 0x32, 0xad, 0x0e, 0x2a, 0xa5, 0x48, 0xe2, 0x98, 0x28, 0x8e, 0x09, +0xc3, 0x80, 0xd9, 0x99, 0x69, 0xca, 0xa5, 0x12, 0xf5, 0x20, 0x20, 0x0c, +0x03, 0xe2, 0x38, 0x06, 0x4d, 0x3a, 0xeb, 0x96, 0xd9, 0x98, 0x75, 0x1b, +0xdb, 0xb6, 0x30, 0x1b, 0x2e, 0xa6, 0x92, 0x84, 0x20, 0x0c, 0xa9, 0x54, +0x2a, 0x14, 0x0b, 0x45, 0x72, 0xf9, 0x1c, 0xb9, 0x5c, 0x8e, 0x42, 0xa1, +0xc0, 0xd4, 0xd4, 0x14, 0xe3, 0xe3, 0x63, 0x04, 0x41, 0xb0, 0x28, 0xf6, +0xdf, 0xf9, 0x93, 0x9f, 0x60, 0xa3, 0xb1, 0x20, 0x6b, 0xc2, 0xd0, 0x2b, +0x42, 0x5e, 0x50, 0x3e, 0x74, 0xee, 0xc9, 0xdc, 0xcb, 0x4a, 0x29, 0x84, +0x10, 0xc4, 0x51, 0x44, 0x80, 0x00, 0x2a, 0x4c, 0x4c, 0x8c, 0x83, 0x10, +0xe9, 0x59, 0x8f, 0x5a, 0x70, 0xe6, 0xd3, 0x88, 0x5a, 0x5a, 0x93, 0x2e, +0xc2, 0x86, 0xf2, 0x71, 0x1c, 0x13, 0x84, 0x21, 0xf5, 0x5a, 0x9d, 0x4a, +0xa5, 0x42, 0xb9, 0x52, 0xa1, 0x52, 0xa9, 0x30, 0x31, 0x7e, 0x8a, 0x99, +0x99, 0xe9, 0x96, 0xf2, 0x4d, 0xd7, 0x79, 0xe4, 0xc6, 0xe5, 0xac, 0xfb, +0xa0, 0x93, 0x89, 0x37, 0x73, 0x48, 0x34, 0x20, 0x7a, 0x14, 0x0c, 0x01, +0xf7, 0xfd, 0x2a, 0x80, 0x8f, 0x15, 0xf5, 0xfd, 0xfd, 0xfd, 0x7b, 0x80, +0xdd, 0x52, 0x2e, 0x28, 0x40, 0x1c, 0x07, 0xdf, 0xcf, 0xb0, 0xea, 0xea, +0xd5, 0x5c, 0x75, 0xd5, 0x55, 0x78, 0x9e, 0x87, 0xeb, 0xa6, 0x29, 0x81, +0x65, 0x59, 0x98, 0x86, 0x99, 0xce, 0xbc, 0x56, 0x24, 0x71, 0x42, 0x18, +0x85, 0x04, 0xf5, 0x80, 0x5a, 0x23, 0x54, 0x96, 0xca, 0x25, 0xc6, 0x4f, +0x8d, 0x51, 0x2c, 0x16, 0x5a, 0x21, 0xb3, 0xa9, 0xfc, 0xce, 0x3f, 0xb8, +0x8b, 0xcd, 0x7f, 0xb4, 0x95, 0xe4, 0xc5, 0xe7, 0x78, 0xff, 0x6f, 0xff, +0x85, 0xa9, 0xe3, 0xd3, 0x84, 0x40, 0x88, 0x20, 0x84, 0xdd, 0xf7, 0x69, +0xb5, 0xef, 0x62, 0x01, 0x3a, 0x49, 0xcf, 0x33, 0xbb, 0x9b, 0x65, 0xa0, +0x69, 0x9a, 0x0d, 0x37, 0x71, 0x58, 0x76, 0xd5, 0x55, 0xac, 0x5c, 0xd9, +0x85, 0xef, 0xfb, 0xd8, 0x8d, 0x7a, 0x56, 0x36, 0xf2, 0x1a, 0xad, 0xd2, +0xd4, 0x20, 0x8e, 0xa2, 0xd4, 0x02, 0xf5, 0x34, 0xce, 0x4f, 0x4f, 0x4f, +0x12, 0x04, 0x41, 0x2b, 0x5c, 0x36, 0x43, 0xf5, 0x36, 0x77, 0x8a, 0xcd, +0x6b, 0xda, 0x71, 0xbe, 0xf9, 0xaf, 0x20, 0xa1, 0xfa, 0xdc, 0x5f, 0xf2, +0xf3, 0xbf, 0xff, 0x77, 0x8a, 0xf3, 0xb5, 0x26, 0x40, 0x3e, 0x84, 0x5b, +0xfe, 0x44, 0xab, 0xd1, 0x0b, 0x06, 0x68, 0x40, 0xdc, 0x4c, 0xba, 0xa1, +0x64, 0x9b, 0x15, 0x55, 0x0a, 0x92, 0x2e, 0x60, 0xdb, 0xb6, 0xe9, 0xe8, +0xe8, 0xa4, 0xad, 0xbd, 0x03, 0xdf, 0xf7, 0xb1, 0xcc, 0x34, 0x54, 0x6a, +0xad, 0x89, 0xe3, 0x98, 0x6a, 0xa5, 0x4c, 0xa1, 0x50, 0x20, 0x97, 0x9b, +0x27, 0x8a, 0x22, 0xe2, 0x38, 0x5e, 0x34, 0xeb, 0x9e, 0x54, 0xfc, 0xb1, +0x3d, 0xc3, 0xed, 0x22, 0x8f, 0x69, 0x18, 0x98, 0xbf, 0x7d, 0x3b, 0xce, +0x9f, 0x7f, 0x03, 0x35, 0x77, 0x9a, 0xa9, 0xa7, 0x1f, 0xe5, 0xdd, 0xff, +0x3c, 0xd2, 0x04, 0x20, 0x84, 0xfd, 0x7f, 0xaa, 0xd5, 0xf6, 0x8b, 0x02, +0x58, 0x00, 0xf1, 0x32, 0xd0, 0x0d, 0x2c, 0x8a, 0xf7, 0xcd, 0x66, 0x9a, +0xe6, 0xc2, 0x4a, 0x0a, 0xa5, 0x14, 0x4a, 0x29, 0x92, 0x24, 0x69, 0xb5, +0xe6, 0xbd, 0xe6, 0x38, 0xeb, 0x32, 0xf0, 0x67, 0xd9, 0x1c, 0xab, 0x2b, +0xf3, 0xc8, 0x7a, 0x80, 0xd4, 0x20, 0x10, 0xb8, 0x5b, 0x77, 0x60, 0x6e, +0xbc, 0x99, 0xe0, 0xf0, 0xeb, 0xfc, 0xe2, 0xd9, 0x7f, 0xe4, 0xf4, 0xb1, +0x5c, 0x13, 0x80, 0x10, 0xae, 0xdd, 0xb6, 0x84, 0x15, 0x96, 0x3c, 0x56, +0x19, 0x1e, 0x1e, 0x7e, 0x07, 0xe8, 0x69, 0x40, 0xb4, 0x36, 0xaf, 0x38, +0x8e, 0x89, 0xa2, 0x88, 0x20, 0x68, 0xfa, 0xf8, 0xd9, 0x16, 0x04, 0x01, +0xf5, 0x7a, 0x9d, 0xb0, 0x91, 0xa4, 0x35, 0x67, 0xbe, 0xa9, 0xfc, 0x1f, +0xfe, 0x4e, 0x27, 0x4f, 0xde, 0xe6, 0xb3, 0x36, 0x6b, 0x81, 0x69, 0x90, +0x68, 0x4d, 0x14, 0x85, 0x44, 0x41, 0x9d, 0xd2, 0x4b, 0xcf, 0x93, 0xcc, +0x7d, 0x84, 0xb9, 0x6e, 0x03, 0x5d, 0x9b, 0x6f, 0x04, 0x4b, 0xa0, 0x00, +0x05, 0x68, 0x58, 0xb2, 0x8c, 0xbd, 0xa0, 0x93, 0xb9, 0xfe, 0xfe, 0xfe, +0xbb, 0x80, 0x41, 0x9a, 0x07, 0xb9, 0x17, 0x29, 0x9b, 0x56, 0x09, 0xb6, +0x6c, 0xea, 0x62, 0xe5, 0x32, 0x8f, 0xa4, 0x54, 0x26, 0x3a, 0x33, 0x45, +0x74, 0x66, 0x0a, 0x35, 0x97, 0x47, 0x57, 0x6a, 0x10, 0xc7, 0x68, 0xa5, +0xf0, 0x6e, 0xdf, 0x8c, 0x7b, 0xeb, 0x6d, 0xd4, 0x3f, 0x38, 0xc6, 0xb1, +0xbf, 0x7b, 0x9e, 0xd3, 0x1f, 0xd6, 0x88, 0x48, 0xad, 0x10, 0xc1, 0xb2, +0x47, 0xb5, 0xfa, 0xd8, 0x69, 0xf6, 0x79, 0x4f, 0xe6, 0x9a, 0x32, 0x3c, +0x3c, 0xfc, 0xda, 0xf0, 0xf0, 0xf0, 0xdd, 0xa4, 0x16, 0xd9, 0xcf, 0x05, +0xa4, 0xbb, 0xfe, 0xcc, 0x0c, 0xdd, 0x1f, 0xfe, 0x82, 0x2f, 0x4f, 0x1e, +0xe7, 0x4b, 0x6d, 0x45, 0x3a, 0x54, 0x0d, 0x95, 0x24, 0x08, 0xc7, 0x46, +0xb6, 0x65, 0x10, 0x19, 0x0f, 0x65, 0x9b, 0x24, 0xa8, 0xd4, 0x0a, 0x61, +0x48, 0xf9, 0xd0, 0x9b, 0x24, 0x95, 0x3c, 0x46, 0xb6, 0x9d, 0x65, 0x37, +0x2e, 0x27, 0x06, 0x92, 0xb3, 0x6d, 0xcb, 0x27, 0x8d, 0x73, 0x51, 0x5f, +0x68, 0x1a, 0x6e, 0xb5, 0x1d, 0xa0, 0xbf, 0xbf, 0x7f, 0x03, 0xe9, 0xfa, +0x68, 0x36, 0x80, 0x91, 0x55, 0xaf, 0xff, 0xf8, 0xb1, 0xb6, 0xb1, 0xb1, +0x2f, 0x19, 0x96, 0x89, 0xd7, 0xe1, 0x11, 0xac, 0x5b, 0xc1, 0xf8, 0xfb, +0x3e, 0xd9, 0x55, 0x6d, 0x48, 0xc7, 0xc1, 0x70, 0x1d, 0x44, 0xc6, 0x43, +0xb4, 0xb7, 0x41, 0xa1, 0x84, 0x2a, 0x95, 0x89, 0x55, 0x82, 0x0e, 0x43, +0x54, 0xb5, 0x42, 0x7d, 0xf4, 0x03, 0x64, 0x9b, 0x8b, 0xb7, 0xae, 0x0b, +0xcb, 0x9f, 0xa0, 0x5e, 0x6d, 0x01, 0x6c, 0x25, 0xfd, 0x40, 0x72, 0xe9, +0x00, 0xe7, 0xc0, 0x8c, 0x01, 0x63, 0xc0, 0x6b, 0x0b, 0xef, 0x0f, 0x0a, +0x63, 0x04, 0x18, 0x51, 0x49, 0x92, 0x0d, 0x6b, 0x21, 0xe5, 0xf9, 0x32, +0xb3, 0xe3, 0x39, 0xa6, 0x4e, 0x66, 0x58, 0xe3, 0xba, 0x08, 0x23, 0x8b, +0xb0, 0x6d, 0x8c, 0xf6, 0x36, 0x64, 0x47, 0x1b, 0xba, 0x5c, 0x42, 0x55, +0x0c, 0x92, 0x5a, 0x42, 0x12, 0x45, 0x94, 0xdf, 0x3b, 0x8a, 0xff, 0x5b, +0x37, 0x20, 0xdb, 0x3d, 0xa4, 0x0d, 0x71, 0x0b, 0x40, 0x7c, 0xe2, 0x81, +0xd7, 0x05, 0xb9, 0xd0, 0xc5, 0xc8, 0xa0, 0x4e, 0xc6, 0x80, 0xbd, 0x5a, +0x69, 0xe2, 0x30, 0xa6, 0x52, 0xaa, 0x52, 0x9c, 0xce, 0x33, 0x76, 0x7c, +0x96, 0xea, 0xd4, 0x1c, 0x71, 0xb1, 0x8c, 0x56, 0x0a, 0xe1, 0xbb, 0x18, +0xd9, 0x0e, 0x64, 0x47, 0x07, 0xf8, 0x2e, 0x89, 0x69, 0x10, 0xab, 0x98, +0xb8, 0x56, 0x21, 0x2e, 0x17, 0xd0, 0x89, 0xc2, 0xf1, 0x20, 0x06, 0x62, +0x04, 0xf1, 0x59, 0x2b, 0x7f, 0xba, 0x00, 0x0d, 0x88, 0xef, 0x01, 0x23, +0x2a, 0x51, 0x44, 0xb5, 0x90, 0x52, 0xae, 0xcc, 0xec, 0xc4, 0x3c, 0x27, +0x8f, 0xce, 0x10, 0xce, 0xcc, 0x12, 0x97, 0x4a, 0xa0, 0x14, 0xc2, 0x75, +0x30, 0xda, 0x7d, 0x84, 0xef, 0x81, 0x65, 0x82, 0x61, 0xa4, 0xad, 0x11, +0x96, 0x73, 0xe5, 0x96, 0xf2, 0x24, 0x4b, 0x8c, 0x75, 0xc5, 0xbf, 0x52, +0x2e, 0x90, 0x01, 0xb4, 0x3e, 0x98, 0xc4, 0x49, 0xb6, 0x5e, 0xae, 0x53, +0x98, 0x2d, 0x32, 0xf1, 0xbe, 0x89, 0x6d, 0x09, 0xba, 0x37, 0x26, 0x98, +0xed, 0x6d, 0x80, 0x46, 0x98, 0x26, 0x86, 0xeb, 0x62, 0xb8, 0x0e, 0x49, +0xc5, 0xc4, 0xe9, 0x5a, 0x01, 0x40, 0x65, 0xe2, 0x23, 0xe6, 0x4a, 0x82, +0x04, 0x9a, 0x00, 0x9f, 0xf8, 0x3d, 0xed, 0x53, 0x03, 0x18, 0xd4, 0xc9, +0x3b, 0x83, 0xc2, 0xd8, 0xad, 0x13, 0xb5, 0x3f, 0x0e, 0x22, 0xaa, 0x85, +0x0a, 0x42, 0x80, 0x52, 0x9a, 0x38, 0x08, 0xb9, 0xf6, 0xfa, 0x0e, 0xa4, +0x6d, 0xa3, 0xc2, 0x10, 0xad, 0x12, 0x10, 0x02, 0xf7, 0x9a, 0xb5, 0x98, +0xd9, 0x0e, 0xc2, 0xb9, 0x1c, 0x23, 0xaf, 0x4d, 0x10, 0x71, 0x36, 0x0a, +0xc5, 0x4b, 0x94, 0x9a, 0x9f, 0xa6, 0x05, 0x18, 0xd4, 0xc9, 0x0b, 0x83, +0xc2, 0xe8, 0x53, 0x4a, 0x0f, 0x44, 0xf5, 0x88, 0x4a, 0xbe, 0x42, 0x92, +0x68, 0x82, 0x6a, 0x40, 0x79, 0xae, 0xc4, 0x75, 0xd7, 0x58, 0x18, 0x12, +0x92, 0x6a, 0x0d, 0x67, 0xf5, 0xd5, 0xb8, 0xeb, 0xd6, 0x50, 0x19, 0x9d, +0xe0, 0xc7, 0xff, 0xf1, 0x36, 0x1f, 0x4d, 0x27, 0x24, 0xa4, 0x1b, 0x59, +0xc3, 0x7d, 0x3e, 0xb1, 0xd4, 0xbc, 0x22, 0xdf, 0x89, 0x7f, 0x25, 0x88, +0x30, 0x86, 0x10, 0x62, 0x40, 0x4a, 0x81, 0x61, 0x5b, 0x58, 0xae, 0x85, +0xed, 0x3b, 0xd8, 0x8e, 0xc5, 0xea, 0x65, 0xb0, 0x6c, 0x4d, 0x16, 0xd3, +0x73, 0x99, 0x3a, 0x3e, 0xc1, 0x87, 0x27, 0x72, 0x04, 0xa1, 0x42, 0x69, +0xcd, 0x82, 0xa3, 0xae, 0x91, 0x41, 0x9d, 0xdc, 0xf2, 0x99, 0x01, 0xb4, +0x20, 0x60, 0x40, 0x48, 0x81, 0x90, 0x12, 0x69, 0xca, 0xb4, 0x72, 0x93, +0x8d, 0x3a, 0x23, 0x51, 0xc4, 0x51, 0x92, 0x1e, 0x98, 0xa9, 0x45, 0x3a, +0xe5, 0x81, 0x9e, 0x46, 0x74, 0xfb, 0x98, 0xfc, 0xda, 0x00, 0x00, 0x06, +0x85, 0xb1, 0x07, 0xd8, 0xdd, 0x1a, 0x5c, 0x8a, 0x45, 0xff, 0x9f, 0xa3, +0x38, 0xa4, 0x69, 0xfd, 0xc0, 0xa0, 0x4e, 0xde, 0x59, 0xaa, 0xcf, 0x4f, +0x25, 0x8c, 0x2e, 0x25, 0x83, 0x3a, 0xf9, 0x3a, 0x69, 0x3e, 0x35, 0x02, +0xa9, 0xc2, 0x0b, 0xdb, 0x39, 0xb2, 0x17, 0xe8, 0x3b, 0x9f, 0xf2, 0xf0, +0x6b, 0xb6, 0xc0, 0x42, 0x19, 0x14, 0xc6, 0x16, 0x60, 0x80, 0x34, 0xbf, +0xea, 0x6e, 0xdc, 0x3e, 0x48, 0x0a, 0xb7, 0x77, 0x29, 0x97, 0x39, 0x57, +0x3e, 0x33, 0x80, 0x2b, 0x25, 0xff, 0x07, 0x5d, 0xc7, 0x73, 0x8e, 0xf4, +0x50, 0x34, 0xdb, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, +0x42, 0x60, 0x82, +}; diff --git a/Source/Core/DolphinWX/resources/toolbar_plugin_options.xpm b/Source/Core/DolphinWX/resources/toolbar_plugin_options.xpm new file mode 100644 index 0000000000..74eaca3bed --- /dev/null +++ b/Source/Core/DolphinWX/resources/toolbar_plugin_options.xpm @@ -0,0 +1,112 @@ +/* XPM */ +static char *toolbar_plugin_options_xpm[] = { +/* columns rows colors chars-per-pixel */ +"48 48 58 1", +" c #666463", +". c #696665", +"X c #6E6B6A", +"o c #706D6C", +"O c #767372", +"+ c #797776", +"@ c #7A7877", +"# c #7D7B7A", +"$ c #817F7E", +"% c #82807F", +"& c #858382", +"* c #888786", +"= c #8A8887", +"- c #8C8B8A", +"; c #908E8D", +": c #92908F", +"> c #959392", +", c #999796", +"< c #999897", +"1 c #9D9B9A", +"2 c #A19F9E", +"3 c #A2A09F", +"4 c #A4A2A1", +"5 c #A9A7A7", +"6 c #A9A8A7", +"7 c #ADACAB", +"8 c #B0AFAE", +"9 c #B1B0AF", +"0 c #B5B4B3", +"q c #B8B7B6", +"w c #B8B8B7", +"e c #BCBCBB", +"r c #C0BFBF", +"t c #C0C0BF", +"y c #C4C4C3", +"u c #C8C7C6", +"i c #C7C8C7", +"p c #C8C8C7", +"a c #CCCCCB", +"s c #D0CFCF", +"d c #D0D0CF", +"f c #D4D3D3", +"g c #D8D7D7", +"h c #D8D8D7", +"j c #DCDBDB", +"k c #E0DFDF", +"l c #E0E0DF", +"z c #E4E3E3", +"x c #E8E7E7", +"c c #E8E8E7", +"v c #ECEBEB", +"b c #F0EFEF", +"n c #F0F1EF", +"m c #EFF0F0", +"M c #F4F4F4", +"N c #F8F8F7", +"B c #FDFDFD", +"V c None", +/* pixels */ +"VVVVVVVVVVVVVVVVVVVVV%&&***VVVVVVVVVVVVVVVVVVVVV", +"VVVVVVVVVVVVVVVVVVVVVyfaaaaVVVVVVVVVVVVVVVVVVVVV", +"VVVVVVVVVVVVVV=XVVVVVyjfappVVVVV+6VVVVVVVVVVVVVV", +"VVVVVVVVVVVV#0j1VVVVVujfsaaVVVVVexjVVVVOyM&VVVV", +"VVVV4zxy=VVVXyMBBBBMzgdffgjjfaauefMOVVV8xfafVVVV", +"VVV#avMMzq#XefbBBNhyepfhjjjzvzsuyfBxO>zze99z1VVV", +"VVV0jzvMNMjufvBBveejvMMMbvxzzMMhyefBNxu0q00ejVVV", +"VV-fjzxvMMNvvBBjqgNBBNMvvvczjjvBzyeffwwwwq08x7VV", +"VVo2ajzcvMMNNBjqzBBNzfuuajvvzjfzBzyeeeeww0ykt+VV", +"VVVV@0jxvMMMNxwzBBvp711<14qzNxgfzBfeteeqtjf-VVVV", +"VVVVVV-pzvMNMtfBBxe1>VVVVVV>yBvfsxMueeefj4VVVVVV", +"VVVVVVV.yzvNhyNBve,VVVVVVVVVV0BzffMjetzjXVVVVVVV", +"VVVVVVVVazvvujBNa1VVVVVVVVVVVVyNhfjcuezzVVVVVVVV", +"VVVVVVV-zzvzpvNz0dweeyupafgzcxvM7VVVVVVVVVVVVVVBjajMzzMc1VVVVVVVVVVVV>7jnzefjff&VVVVVVV", +"VVVVVVVVvvafMvzcBuVVVVVVVVVVVVqzMvefczf0.VVVVVVV", +"VVVVVV5zgypafNMkxMMw>VVVVVV>OzBjsfjjgsafggdyeejNBBxy8X@0hzzhu#VVV", +"VVVVhsfc8VVVOvhafhjzzhdaaahcNBBBBvwXVVV=ejh4VVVV", +"VVVV*NuOVVVV;zuaffjzxvMNNNBBBBBBBBg+VVVV.,wOVVVV", +"VVVVV+VVVVVVhaypafxxzxvMMNMxhhBBBBN0VVVVVVXVVVVV", +"VVVVVVVVVVV6jwyupjffjjvvMNfy07cBBBBz*VVVVVVVVVVV", +"VVVVVVVVVVOleeryafXV*fcvMNa$V eBBBBNe.VVVVVVVVVV", +"VVVVVVVVVVedqeerjaj0VVVVVyjkzvyVVVVV1j0#VVVVVVVVVVVV", +"VVVVVVVVVVVVVV2OVVVVVyhjzvyVVVVVX*VVVVVVVVVVVVVV", +"VVVVVVVVVVVVVVVVVVVVVydffgyVVVVVVVVVVVVVVVVVVVVV", +"VVVVVVVVVVVVVVVVVVVVV&&&%%$VVVVVVVVVVVVVVVVVVVVV" +}; diff --git a/Source/Core/DolphinWX/resources/toolbar_plugin_options_dis.c b/Source/Core/DolphinWX/resources/toolbar_plugin_options_dis.c new file mode 100644 index 0000000000..8956c990b1 --- /dev/null +++ b/Source/Core/DolphinWX/resources/toolbar_plugin_options_dis.c @@ -0,0 +1,244 @@ +static const unsigned char toolbar_plugin_options_dis_png[] = { +0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, +0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, +0x08, 0x06, 0x00, 0x00, 0x00, 0x57, 0x02, 0xf9, 0x87, 0x00, 0x00, 0x00, +0x01, 0x73, 0x52, 0x47, 0x42, 0x00, 0xae, 0xce, 0x1c, 0xe9, 0x00, 0x00, +0x00, 0x06, 0x62, 0x4b, 0x47, 0x44, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, +0xa0, 0xbd, 0xa7, 0x93, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, +0x00, 0x00, 0x0b, 0x12, 0x00, 0x00, 0x0b, 0x12, 0x01, 0xd2, 0xdd, 0x7e, +0xfc, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4d, 0x45, 0x07, 0xd8, 0x03, +0x16, 0x0a, 0x1d, 0x39, 0xad, 0x95, 0x27, 0xb3, 0x00, 0x00, 0x0a, 0xd8, +0x49, 0x44, 0x41, 0x54, 0x68, 0xde, 0xd5, 0x99, 0x4b, 0x6c, 0x5c, 0x55, +0xb6, 0x86, 0xbf, 0x7d, 0x1e, 0x55, 0x75, 0xaa, 0xec, 0x7a, 0x04, 0x63, +0x85, 0x58, 0x76, 0x8c, 0x70, 0x26, 0x0c, 0x88, 0x6f, 0x2c, 0x4b, 0x91, +0x12, 0xab, 0x6d, 0xae, 0x10, 0x77, 0x80, 0x44, 0x9a, 0x48, 0x28, 0x19, +0x98, 0x38, 0x01, 0xcc, 0x53, 0x10, 0x26, 0x88, 0x47, 0x44, 0xa7, 0xc7, +0x48, 0x90, 0x48, 0x4c, 0x91, 0xd3, 0xaa, 0x49, 0x04, 0x12, 0x97, 0x86, +0x11, 0x08, 0x70, 0x5a, 0x4c, 0x1c, 0x45, 0xe9, 0xb8, 0x13, 0x84, 0x15, +0x24, 0x8c, 0x1f, 0x89, 0x1d, 0x97, 0x53, 0xe5, 0x53, 0xa7, 0xde, 0x8f, +0x73, 0xce, 0x1d, 0xdc, 0xda, 0x5b, 0x27, 0x26, 0x49, 0x5f, 0x3b, 0xe9, +0xa4, 0xef, 0x96, 0xb6, 0xe4, 0x2a, 0x9f, 0xb3, 0x6b, 0xff, 0x6b, 0xfd, +0x6b, 0xad, 0x7f, 0xaf, 0x2d, 0x7c, 0xdf, 0xe7, 0xff, 0xf3, 0x30, 0xee, +0xf6, 0x82, 0xcf, 0x3d, 0xf7, 0xdc, 0x30, 0xd0, 0xeb, 0xfb, 0x7e, 0x6f, +0xeb, 0xab, 0x69, 0x60, 0x2e, 0x9d, 0x4e, 0x4f, 0xff, 0x2b, 0x00, 0x88, +0xbb, 0xe1, 0x81, 0x23, 0x47, 0x8e, 0x0c, 0x03, 0x63, 0xbe, 0xef, 0x3f, +0x0d, 0x24, 0x7d, 0xdf, 0x27, 0x38, 0x5b, 0xc3, 0x06, 0xfe, 0x02, 0x9c, +0x48, 0xa7, 0xd3, 0x73, 0xff, 0x16, 0x00, 0x5e, 0x78, 0xe1, 0x85, 0x7e, +0xe0, 0x63, 0x60, 0x18, 0x50, 0x9b, 0x5d, 0x0f, 0x60, 0x1d, 0x10, 0x80, +0x93, 0xc0, 0xf1, 0x74, 0x3a, 0x6d, 0xdf, 0x57, 0x00, 0xe3, 0xe3, 0xe3, +0x93, 0x72, 0xf3, 0x72, 0xe3, 0x96, 0x65, 0x11, 0x8f, 0xc7, 0x09, 0x87, +0xc3, 0x18, 0x86, 0x81, 0xe7, 0x79, 0x54, 0x2a, 0x15, 0x8a, 0xc5, 0x22, +0x6b, 0x6b, 0x6b, 0x78, 0x9e, 0x27, 0x1f, 0x9f, 0x03, 0xfe, 0x78, 0xa7, +0xd4, 0xba, 0x23, 0x00, 0x2f, 0xbf, 0xfc, 0xf2, 0x1f, 0x80, 0x33, 0xf2, +0x73, 0x34, 0x1a, 0x65, 0x60, 0x60, 0x80, 0xed, 0xdb, 0xb7, 0xd3, 0xd1, +0xd1, 0x81, 0x65, 0x59, 0x78, 0x9e, 0x47, 0xb1, 0x58, 0xe4, 0xda, 0xb5, +0x6b, 0x5c, 0xbc, 0x78, 0x91, 0x5f, 0x7f, 0xfd, 0x95, 0x62, 0xb1, 0xa8, +0x68, 0xa5, 0x69, 0xda, 0xe3, 0xa7, 0x4e, 0x9d, 0xba, 0x70, 0xdf, 0x62, +0xe0, 0xd5, 0x57, 0x5f, 0xfd, 0x6f, 0x60, 0x1f, 0x40, 0x22, 0x91, 0xe0, +0xcd, 0x37, 0xdf, 0xc4, 0xf7, 0x7d, 0x3c, 0xcf, 0x23, 0x97, 0xcb, 0x61, +0x18, 0x86, 0x02, 0x52, 0xab, 0xd5, 0xb8, 0x70, 0xe1, 0x02, 0x53, 0x53, +0x53, 0x14, 0x0a, 0x05, 0x49, 0x2d, 0xdb, 0x30, 0x8c, 0xff, 0xfc, 0xf4, +0xd3, 0x4f, 0xff, 0x7e, 0x5f, 0x00, 0xbc, 0xfe, 0xfa, 0xeb, 0xdb, 0x5b, +0x74, 0xc0, 0xf7, 0x7d, 0x76, 0xed, 0xda, 0x45, 0x28, 0x14, 0x22, 0x97, +0xcb, 0xe1, 0xba, 0x2e, 0x9e, 0xe7, 0xa1, 0x69, 0x1a, 0xdb, 0xb6, 0x6d, +0xe3, 0xd1, 0x47, 0x1f, 0x25, 0x16, 0x8b, 0x71, 0xee, 0xdc, 0x39, 0xce, +0x9d, 0x3b, 0x87, 0x6d, 0xdb, 0x78, 0x9e, 0x87, 0xef, 0xfb, 0x73, 0x89, +0x44, 0x62, 0xe0, 0xe4, 0xc9, 0x93, 0xb9, 0x8d, 0xfe, 0xbe, 0x76, 0xbb, +0x7f, 0xbe, 0xf4, 0xd2, 0x4b, 0xfd, 0xaf, 0xbc, 0xf2, 0xca, 0xd8, 0xed, +0x9e, 0xf9, 0xe4, 0x93, 0x4f, 0xe6, 0x35, 0x4d, 0x3b, 0xa1, 0x69, 0x1a, +0x9a, 0xa6, 0x71, 0xe1, 0xc2, 0x05, 0xb2, 0xd9, 0x2c, 0x9a, 0xa6, 0xa1, +0xeb, 0x3a, 0x9a, 0xa6, 0xe1, 0xba, 0x2e, 0x0b, 0x0b, 0x0b, 0x7c, 0xf7, +0xdd, 0x77, 0xcc, 0xcd, 0xcd, 0x31, 0x38, 0x38, 0xc8, 0xae, 0x5d, 0xbb, +0x88, 0xc5, 0x62, 0x98, 0xa6, 0x89, 0xae, 0xeb, 0xbd, 0x8e, 0xe3, 0x7c, +0xbc, 0x19, 0x03, 0x6a, 0xb7, 0xdb, 0xbc, 0xa6, 0x69, 0x93, 0x42, 0x88, +0x89, 0xd7, 0x5e, 0x7b, 0x6d, 0xdf, 0x6d, 0x17, 0xd1, 0xb4, 0xe3, 0x9a, +0xa6, 0xd9, 0x12, 0x84, 0x04, 0x10, 0x9c, 0xba, 0xae, 0x03, 0x70, 0xf1, +0xe2, 0x45, 0x16, 0x17, 0x17, 0x19, 0x18, 0x18, 0xa0, 0xa7, 0xa7, 0x07, +0xd3, 0x34, 0x31, 0x0c, 0x03, 0xe0, 0xb9, 0x43, 0x87, 0x0e, 0x8d, 0xdc, +0x15, 0x00, 0xe3, 0xe3, 0xe3, 0xbd, 0x42, 0x88, 0x49, 0x21, 0x44, 0x52, +0x08, 0x81, 0xa6, 0x69, 0x13, 0x6f, 0xbc, 0xf1, 0x46, 0xff, 0xad, 0x16, +0x39, 0x71, 0xe2, 0x44, 0x3e, 0xe8, 0x85, 0x7c, 0x3e, 0xaf, 0xa8, 0xb3, +0x1e, 0x84, 0x69, 0x9a, 0xcc, 0xcc, 0xcc, 0x60, 0xdb, 0x36, 0x03, 0x03, +0x03, 0x24, 0x93, 0x49, 0x0c, 0xc3, 0x40, 0xd7, 0x75, 0x7c, 0xdf, 0xff, +0xe0, 0xae, 0x00, 0x10, 0x42, 0x4c, 0xc8, 0xcd, 0xb7, 0x66, 0x52, 0xd3, +0xb4, 0x89, 0xb7, 0xde, 0x7a, 0x2b, 0x79, 0xab, 0x85, 0x3e, 0xfa, 0xe8, +0xa3, 0x3f, 0x6b, 0x9a, 0x36, 0x27, 0x37, 0xbb, 0xba, 0xba, 0x4a, 0xe0, +0x7d, 0x74, 0x5d, 0xc7, 0x30, 0x0c, 0x4c, 0xd3, 0x24, 0x1c, 0x0e, 0x33, +0x3b, 0x3b, 0x4b, 0x67, 0x67, 0x27, 0x9d, 0x9d, 0x9d, 0x92, 0x46, 0x08, +0x21, 0x86, 0x47, 0x47, 0x47, 0xfb, 0xef, 0x08, 0xc0, 0xf8, 0xf8, 0xf8, +0x21, 0x21, 0xc4, 0x70, 0xf0, 0xc7, 0x5b, 0xb3, 0x5f, 0xd3, 0xb4, 0x89, +0x7f, 0x42, 0xa5, 0xa3, 0x2d, 0x8f, 0xe1, 0x38, 0x0e, 0xcd, 0x66, 0x13, +0xf9, 0x59, 0x08, 0x81, 0x61, 0x18, 0x84, 0x42, 0x21, 0x55, 0x23, 0x32, +0x99, 0x0c, 0x7d, 0x7d, 0x7d, 0x41, 0x00, 0x00, 0x87, 0xee, 0x08, 0x80, +0x10, 0xe2, 0xb8, 0xdc, 0x74, 0x38, 0x1c, 0xe6, 0xe1, 0x87, 0x1f, 0x0e, +0x82, 0xd8, 0xf7, 0xf6, 0xdb, 0x6f, 0xff, 0xe9, 0x56, 0x8b, 0x7d, 0xf8, +0xe1, 0x87, 0x7f, 0xd5, 0x34, 0xed, 0x8c, 0x7c, 0x3e, 0x9b, 0xcd, 0xaa, +0x77, 0x0d, 0xc3, 0x50, 0x00, 0x22, 0x91, 0x08, 0x91, 0x48, 0x04, 0xc7, +0x71, 0x78, 0xe0, 0x81, 0x07, 0x88, 0xc5, 0x62, 0x0a, 0xa4, 0x4c, 0xc9, +0x9b, 0x02, 0xf0, 0xe2, 0x8b, 0x2f, 0x0e, 0x03, 0xbd, 0x2d, 0x6b, 0xb2, +0x67, 0xcf, 0x1e, 0x0e, 0x1c, 0x38, 0xc0, 0x43, 0x0f, 0x3d, 0x14, 0x04, +0x71, 0xfc, 0xdd, 0x77, 0xdf, 0xbd, 0xe5, 0x8f, 0x08, 0x21, 0x7a, 0xe5, +0xb3, 0xb6, 0x6d, 0xd3, 0x68, 0x34, 0xd0, 0x75, 0x1d, 0x5d, 0xd7, 0x09, +0x85, 0x42, 0xca, 0x03, 0xa1, 0x50, 0x08, 0x5d, 0xd7, 0xa9, 0x54, 0x2a, +0x44, 0x22, 0x11, 0x34, 0x4d, 0x6d, 0xa5, 0x77, 0x74, 0x74, 0x34, 0xb9, +0x59, 0x0f, 0x3c, 0x2d, 0xff, 0xb0, 0x2c, 0x8b, 0xae, 0xae, 0x2e, 0xc2, +0xe1, 0x30, 0x63, 0x63, 0x63, 0x58, 0x96, 0x15, 0x04, 0x31, 0xf1, 0xfe, +0xfb, 0xef, 0xff, 0x8e, 0xab, 0xef, 0xbc, 0xf3, 0xce, 0x84, 0x34, 0x80, +0x34, 0x42, 0xad, 0x56, 0x43, 0xd3, 0xb4, 0xdf, 0x59, 0x3f, 0x14, 0x0a, +0x61, 0x18, 0x06, 0x8d, 0x46, 0x03, 0xd3, 0x34, 0xd7, 0x2f, 0xb5, 0x73, +0xb3, 0x00, 0x86, 0x5b, 0x6e, 0x24, 0x14, 0x0a, 0xd1, 0xd5, 0xd5, 0xc5, +0xe5, 0xcb, 0x97, 0x29, 0x97, 0xcb, 0x1c, 0x39, 0x72, 0x84, 0x48, 0x24, +0x22, 0x9f, 0x4b, 0x0a, 0x21, 0x26, 0x3e, 0xf8, 0xe0, 0x83, 0x24, 0xc0, +0xb1, 0x63, 0xc7, 0x86, 0xdf, 0x7b, 0xef, 0xbd, 0x49, 0x60, 0x4c, 0xbe, +0x0f, 0xd0, 0xdd, 0xdd, 0x4d, 0x22, 0x91, 0x50, 0x81, 0x1b, 0x89, 0x44, +0xb0, 0x2c, 0x8b, 0x70, 0x38, 0x8c, 0x69, 0x9a, 0x68, 0x9a, 0x46, 0xbd, +0x5e, 0xbf, 0x99, 0xd8, 0xdb, 0x74, 0x0c, 0xf4, 0xfb, 0xbe, 0x8f, 0x10, +0x82, 0x8e, 0x8e, 0x0e, 0x1a, 0x8d, 0x06, 0xe7, 0xcf, 0x9f, 0x67, 0x6a, +0x6a, 0x8a, 0x78, 0x3c, 0xce, 0xfe, 0xfd, 0xfb, 0x83, 0x6a, 0xb3, 0xdf, +0xf3, 0xbc, 0x0b, 0xc7, 0x8e, 0x1d, 0xfb, 0xcd, 0xf7, 0xfd, 0xc9, 0xa0, +0x22, 0xb5, 0x2c, 0x8b, 0x27, 0x9e, 0x78, 0x82, 0xc7, 0x1f, 0x7f, 0x5c, +0x59, 0xde, 0xb2, 0x2c, 0x2c, 0xcb, 0x22, 0x12, 0x89, 0x10, 0x0e, 0x87, +0x55, 0x5d, 0x28, 0x95, 0x4a, 0x34, 0x9b, 0xcd, 0xa0, 0xc8, 0xdb, 0x1c, +0x80, 0xe7, 0x9f, 0x7f, 0xbe, 0xbf, 0xc5, 0x61, 0x00, 0xda, 0xdb, 0xdb, +0xb9, 0x74, 0xe9, 0x92, 0xe2, 0xf2, 0xf7, 0xdf, 0x7f, 0x4f, 0x77, 0x77, +0x37, 0xfb, 0xf7, 0xef, 0x57, 0x16, 0xf3, 0x3c, 0xaf, 0xd7, 0xf7, 0xfd, +0x5e, 0xf9, 0xb9, 0xb3, 0xb3, 0x93, 0xa7, 0x9e, 0x7a, 0x8a, 0xa3, 0x47, +0x8f, 0xb2, 0x73, 0xe7, 0x4e, 0x66, 0x66, 0x66, 0x08, 0x87, 0xc3, 0x58, +0x96, 0x45, 0x34, 0x1a, 0x25, 0x1a, 0x8d, 0x62, 0x59, 0x96, 0xda, 0xbc, +0xe7, 0x79, 0xb8, 0xae, 0x4b, 0xb5, 0x5a, 0xc5, 0x75, 0xdd, 0x4d, 0x79, +0x21, 0x78, 0x22, 0x4b, 0x04, 0x02, 0x91, 0xf6, 0xf6, 0x76, 0xae, 0x5e, +0xbd, 0xaa, 0xb2, 0x83, 0x6d, 0xdb, 0x9c, 0x3f, 0x7f, 0x9e, 0xdd, 0xbb, +0x77, 0x33, 0x34, 0x34, 0xc4, 0x8f, 0x3f, 0xfe, 0xa8, 0x62, 0x65, 0xc7, +0x8e, 0x1d, 0x0c, 0x0e, 0x0e, 0xf2, 0xe0, 0x83, 0x0f, 0xe2, 0x79, 0x1e, +0x99, 0x4c, 0x86, 0x9f, 0x7e, 0xfa, 0x09, 0xd7, 0x75, 0xb1, 0x2c, 0x8b, +0x58, 0x2c, 0x46, 0x2c, 0x16, 0x23, 0x1a, 0x8d, 0x62, 0x18, 0x06, 0xae, +0xeb, 0xe2, 0xba, 0x2e, 0xf5, 0x7a, 0x9d, 0x46, 0xa3, 0x41, 0xb1, 0x58, +0x54, 0xba, 0x29, 0x20, 0xb5, 0x37, 0x06, 0x20, 0x88, 0x5e, 0x06, 0x9f, +0xeb, 0xba, 0x37, 0xe4, 0xe8, 0xf9, 0xf9, 0x79, 0x84, 0x10, 0x0c, 0x0d, +0x0d, 0xfd, 0x6f, 0x20, 0x24, 0x93, 0xec, 0xd8, 0xb1, 0x83, 0x70, 0x38, +0x8c, 0xef, 0xfb, 0xac, 0xac, 0xac, 0x70, 0xf9, 0xf2, 0x65, 0xd6, 0xd6, +0xd6, 0x30, 0x4d, 0x53, 0x59, 0xbd, 0xad, 0xad, 0x8d, 0x58, 0x2c, 0x46, +0x28, 0x14, 0xc2, 0xf7, 0x7d, 0xea, 0xf5, 0x3a, 0xf5, 0x7a, 0x9d, 0x5a, +0xad, 0x86, 0x6d, 0xdb, 0x54, 0xab, 0xd5, 0xe0, 0xe6, 0xed, 0x74, 0x3a, +0x3d, 0xbf, 0x29, 0x00, 0x12, 0x84, 0x10, 0x82, 0x7c, 0x3e, 0xaf, 0xaa, +0xa7, 0x4c, 0x83, 0xbe, 0xef, 0x73, 0xf5, 0xea, 0x55, 0x7e, 0xfb, 0xed, +0x37, 0xf6, 0xec, 0xd9, 0xa3, 0x16, 0x99, 0x9f, 0x9f, 0x67, 0x7e, 0x7e, +0x5e, 0xc9, 0xe7, 0x68, 0x34, 0xaa, 0xa8, 0x23, 0x2d, 0x2f, 0x13, 0x40, +0xad, 0x56, 0xa3, 0x5a, 0xad, 0x52, 0xa9, 0x54, 0xa8, 0x56, 0xab, 0x5c, +0xbf, 0x7e, 0x9d, 0x46, 0xa3, 0x11, 0xa4, 0xd0, 0x99, 0x4d, 0x51, 0xc8, +0xf7, 0xfd, 0xb9, 0xe0, 0xf1, 0x6f, 0x69, 0x69, 0x89, 0x9e, 0x9e, 0x1e, +0x55, 0xfe, 0xa5, 0x17, 0x7c, 0xdf, 0xe7, 0xe7, 0x9f, 0x7f, 0xc6, 0x75, +0x5d, 0xca, 0xe5, 0x32, 0x2b, 0x2b, 0x2b, 0xd4, 0x6a, 0x35, 0x84, 0x10, +0x44, 0xa3, 0x51, 0x95, 0x71, 0x64, 0xd0, 0x46, 0xa3, 0x51, 0x42, 0xa1, +0x10, 0x42, 0x08, 0xea, 0xf5, 0x3a, 0xd5, 0x6a, 0x95, 0x72, 0xb9, 0x4c, +0xa9, 0x54, 0x62, 0x6d, 0x6d, 0x0d, 0xdb, 0xb6, 0xd7, 0x07, 0xf1, 0x97, +0x9b, 0x3e, 0x0f, 0x1c, 0x3e, 0x7c, 0xd8, 0x37, 0x0c, 0x43, 0xa5, 0xbc, +0xee, 0xee, 0x6e, 0x52, 0xa9, 0x14, 0x91, 0x48, 0xe4, 0x77, 0x20, 0x5a, +0x3a, 0xfe, 0x06, 0xad, 0x63, 0x9a, 0xa6, 0x2a, 0x54, 0xc1, 0x74, 0x09, +0xd0, 0x68, 0x34, 0x28, 0x95, 0x4a, 0x38, 0x8e, 0x83, 0x6d, 0xdb, 0xe4, +0xf3, 0x79, 0x66, 0x66, 0x66, 0x70, 0x1c, 0x87, 0x5a, 0xad, 0x26, 0xd7, +0x5b, 0x4a, 0xa7, 0xd3, 0x5d, 0x9b, 0x4e, 0xa3, 0xbe, 0xef, 0x4f, 0xfb, +0xbe, 0xaf, 0x82, 0xcc, 0xb6, 0x6d, 0x5c, 0xd7, 0x05, 0x50, 0x95, 0x34, +0x12, 0x89, 0x10, 0x8b, 0xc5, 0x68, 0x6f, 0x6f, 0x27, 0x1e, 0x8f, 0x13, +0x8f, 0xc7, 0x49, 0x26, 0x93, 0x37, 0xcc, 0x44, 0x22, 0xa1, 0x2c, 0x0f, +0x50, 0xaf, 0xd7, 0x29, 0x97, 0xcb, 0x14, 0x0a, 0x05, 0x1c, 0xc7, 0xa1, +0x58, 0x2c, 0xb2, 0xb0, 0xb0, 0x40, 0xb1, 0x58, 0xa4, 0xd1, 0x68, 0x28, +0x63, 0x78, 0x9e, 0x97, 0x3c, 0x70, 0xe0, 0x40, 0xff, 0x1d, 0x01, 0x90, +0x9b, 0x97, 0x16, 0xcb, 0xe7, 0xf3, 0x8a, 0xa3, 0x42, 0x08, 0x45, 0x11, +0x09, 0x22, 0x91, 0x48, 0x28, 0x20, 0x6d, 0x6d, 0x6d, 0x6a, 0xe3, 0xba, +0xae, 0xab, 0x14, 0x29, 0xd7, 0xc9, 0xe7, 0xf3, 0x38, 0x8e, 0xc3, 0xf2, +0xf2, 0x32, 0x99, 0x4c, 0x86, 0x7a, 0xbd, 0x7e, 0x43, 0xfa, 0x14, 0x42, +0x44, 0x75, 0x5d, 0x9f, 0x3c, 0x78, 0xf0, 0x60, 0xff, 0xa6, 0x00, 0x78, +0x9e, 0x77, 0xc6, 0xf3, 0x3c, 0x9a, 0xcd, 0x26, 0xcd, 0x66, 0x93, 0x5a, +0xad, 0xc6, 0xea, 0xea, 0x2a, 0x85, 0x42, 0x81, 0x5a, 0xad, 0x46, 0xad, +0x56, 0xa3, 0xd9, 0x6c, 0xaa, 0x4c, 0x25, 0xe3, 0x43, 0x6a, 0x1c, 0xc3, +0x30, 0x10, 0x42, 0xa8, 0xf3, 0xaf, 0xa4, 0xcc, 0xda, 0xda, 0x1a, 0x6b, +0x6b, 0x6b, 0xe4, 0xf3, 0x79, 0x56, 0x56, 0x56, 0x58, 0x58, 0x58, 0x50, +0x59, 0x2e, 0x98, 0x38, 0x5a, 0x27, 0xb8, 0xa4, 0xa6, 0x69, 0x13, 0x07, +0x0f, 0x1e, 0x4c, 0x6e, 0xb4, 0x0e, 0x00, 0x7c, 0xe9, 0x79, 0x1e, 0x42, +0x08, 0x1a, 0x8d, 0x06, 0x42, 0x08, 0x4a, 0xa5, 0x12, 0x57, 0xae, 0x5c, +0x51, 0xdc, 0xbf, 0x59, 0xaf, 0x47, 0xc6, 0x84, 0x2c, 0x4e, 0x12, 0xbc, +0xb4, 0xbe, 0x9c, 0x8b, 0x8b, 0x8b, 0x64, 0x32, 0x19, 0xb5, 0x79, 0x49, +0x9d, 0xbd, 0x7b, 0xf7, 0xb2, 0xb4, 0xb4, 0xc4, 0xc2, 0xc2, 0x82, 0x2c, +0xa4, 0xfd, 0xbe, 0xef, 0x4f, 0x00, 0x7f, 0xdc, 0xf0, 0xa1, 0x7e, 0x74, +0x74, 0xf4, 0x63, 0xe0, 0xa8, 0x4c, 0x9d, 0x41, 0xca, 0x6c, 0xdd, 0xba, +0x95, 0x2d, 0x5b, 0xb6, 0x28, 0x49, 0x10, 0x0a, 0x85, 0xd4, 0x91, 0x50, +0x5a, 0x5e, 0x16, 0xa8, 0x5a, 0xad, 0xa6, 0x52, 0x65, 0xa1, 0x50, 0x60, +0x61, 0x61, 0xe1, 0x06, 0x3a, 0xca, 0xcd, 0x3f, 0xf3, 0xcc, 0x33, 0x3c, +0xf9, 0xe4, 0x93, 0x9c, 0x3d, 0x7b, 0x96, 0x6f, 0xbe, 0xf9, 0x86, 0x95, +0x95, 0x15, 0x15, 0x83, 0xae, 0xeb, 0x1e, 0x3d, 0x7d, 0xfa, 0xf4, 0xc9, +0x8d, 0xf6, 0x46, 0x8f, 0x03, 0xfb, 0x5c, 0xd7, 0xed, 0x0d, 0x48, 0x06, +0x5c, 0xd7, 0xa5, 0x56, 0xab, 0xe1, 0x38, 0x0e, 0x9d, 0x9d, 0x9d, 0x2a, +0x65, 0xca, 0x3a, 0x11, 0x94, 0x06, 0x8d, 0x46, 0x43, 0xa5, 0xcc, 0xd5, +0xd5, 0x55, 0x95, 0x6a, 0x65, 0xba, 0x94, 0xeb, 0xf6, 0xf5, 0xf5, 0x51, +0xa9, 0x54, 0x10, 0x42, 0xb0, 0x7b, 0xf7, 0x6e, 0xb2, 0xd9, 0x2c, 0x3f, +0xfc, 0xf0, 0x03, 0xa5, 0x52, 0x49, 0x49, 0xf7, 0x67, 0x9f, 0x7d, 0xf6, +0xaf, 0x9f, 0x7d, 0xf6, 0xd9, 0xdc, 0x86, 0xda, 0x2a, 0xa3, 0xa3, 0xa3, +0x3b, 0x5b, 0x05, 0x45, 0x9e, 0x89, 0x95, 0x37, 0xa4, 0x38, 0x4b, 0x24, +0x12, 0xb4, 0xb7, 0xb7, 0x2b, 0x20, 0x92, 0x4a, 0xcd, 0x66, 0x53, 0x05, +0x6d, 0x2e, 0x97, 0xa3, 0xd1, 0x68, 0xd0, 0x6c, 0x36, 0x6f, 0xb0, 0xba, +0x61, 0x18, 0xf4, 0xf4, 0xf4, 0xd0, 0xd1, 0xd1, 0xa1, 0xfe, 0xde, 0xbb, +0x77, 0x2f, 0x8e, 0xe3, 0x70, 0xfa, 0xf4, 0x69, 0x2e, 0x5d, 0xba, 0x14, +0xf4, 0xc2, 0xa9, 0xcf, 0x3f, 0xff, 0xfc, 0xf0, 0x86, 0xfb, 0x42, 0x2d, +0x10, 0x5f, 0x4a, 0x7d, 0x1f, 0xcc, 0xf7, 0x72, 0x1a, 0x86, 0x11, 0x3c, +0x49, 0xe1, 0x79, 0x9e, 0xf2, 0x82, 0x9c, 0xf2, 0x3b, 0xf9, 0x3b, 0xf1, +0x78, 0x9c, 0xbe, 0xbe, 0x3e, 0xa5, 0x89, 0xe4, 0xba, 0x83, 0x83, 0x83, +0x6c, 0xdb, 0xb6, 0x8d, 0xd9, 0xd9, 0x59, 0xbe, 0xfa, 0xea, 0x2b, 0x32, +0x99, 0x4c, 0x70, 0x9d, 0x87, 0xbf, 0xf8, 0xe2, 0x8b, 0xb9, 0x0d, 0xb5, +0x55, 0xd2, 0xe9, 0xf4, 0x3f, 0x80, 0x7e, 0x59, 0x19, 0x25, 0x95, 0x9a, +0xcd, 0x26, 0x8d, 0x46, 0x43, 0x71, 0x3c, 0x38, 0x65, 0xe0, 0x4a, 0x91, +0x26, 0x2d, 0x2f, 0x37, 0xff, 0xd8, 0x63, 0x8f, 0x31, 0x34, 0x34, 0x44, +0x32, 0x99, 0x54, 0x31, 0x23, 0xe9, 0x36, 0x35, 0x35, 0x85, 0xe3, 0x38, +0xa4, 0x52, 0x29, 0x7a, 0x7b, 0x7b, 0xd7, 0x27, 0x8d, 0x3f, 0xdd, 0x51, +0x67, 0x6e, 0x74, 0x74, 0xf4, 0x0f, 0xad, 0xd8, 0x18, 0xde, 0x8c, 0x66, +0xef, 0xea, 0xea, 0x62, 0x60, 0x60, 0x80, 0x44, 0x22, 0x41, 0xb5, 0x5a, +0xc5, 0x71, 0x1c, 0x1c, 0xc7, 0xa1, 0x52, 0xa9, 0xdc, 0x50, 0xc8, 0x1e, +0x79, 0xe4, 0x11, 0xb6, 0x6f, 0xdf, 0xce, 0xf2, 0xf2, 0x32, 0xdf, 0x7e, +0xfb, 0x2d, 0xd9, 0x6c, 0x36, 0xe8, 0xd1, 0xd4, 0xd7, 0x5f, 0x7f, 0x6d, +0x6f, 0xa8, 0x33, 0x17, 0xf0, 0xc6, 0xdf, 0xd2, 0xe9, 0xf4, 0x48, 0xcb, +0x23, 0xa7, 0xfe, 0x2f, 0x72, 0x57, 0x66, 0x9b, 0x54, 0x2a, 0x45, 0x77, +0x77, 0xb7, 0xea, 0xd0, 0x49, 0xa9, 0x62, 0x9a, 0xe6, 0xef, 0xbc, 0x30, +0x3b, 0x3b, 0xab, 0xce, 0xc8, 0x5b, 0xb6, 0x6c, 0x51, 0xf4, 0x6b, 0x01, +0x7c, 0xfa, 0x8e, 0x6f, 0x68, 0x5a, 0xb4, 0x3a, 0xdc, 0xf2, 0xca, 0xf6, +0x56, 0x7c, 0xf4, 0x06, 0xce, 0xc1, 0xd3, 0xd9, 0x6c, 0xf6, 0xe5, 0x4a, +0xa5, 0xf2, 0x5f, 0xb2, 0xa9, 0x1b, 0x89, 0x44, 0x58, 0x59, 0x59, 0x21, +0x1e, 0x8f, 0x63, 0x9a, 0xa6, 0x9a, 0xe1, 0x70, 0x98, 0x4a, 0xa5, 0x02, +0xa0, 0xa8, 0x56, 0xad, 0x56, 0xc9, 0x64, 0x32, 0x98, 0xa6, 0x49, 0x22, +0x91, 0x40, 0xd7, 0x75, 0x9a, 0xcd, 0xa6, 0xa4, 0xef, 0xbe, 0xd6, 0x05, +0xc9, 0xdd, 0xb9, 0x62, 0x6a, 0x69, 0xf6, 0x79, 0xe0, 0x6f, 0xc1, 0xef, +0x47, 0x46, 0x46, 0xa6, 0x81, 0x69, 0xd7, 0x75, 0x93, 0xf5, 0x7a, 0x9d, +0x62, 0xb1, 0x48, 0x2e, 0x97, 0xe3, 0xfa, 0xf5, 0xeb, 0x4a, 0x95, 0xea, +0xba, 0x4e, 0x38, 0x1c, 0x56, 0x20, 0x84, 0x10, 0xaa, 0xfa, 0x2f, 0x2e, +0x2e, 0xb2, 0x75, 0xeb, 0x56, 0xf5, 0x6c, 0xc0, 0x03, 0xfd, 0x1b, 0x6e, +0xee, 0x6e, 0x66, 0x4c, 0x4e, 0x4e, 0xce, 0x03, 0x27, 0x64, 0x4a, 0x2d, +0x97, 0xcb, 0xe4, 0xf3, 0x79, 0x96, 0x96, 0x96, 0xc8, 0xe7, 0xf3, 0x54, +0xab, 0x55, 0x7c, 0xdf, 0xc7, 0x34, 0x4d, 0xe5, 0xa1, 0x56, 0x6f, 0x54, +0x55, 0xf0, 0x4a, 0xa5, 0x82, 0xe7, 0x79, 0xea, 0x82, 0xa4, 0x35, 0x7b, +0xef, 0x09, 0x80, 0x16, 0x88, 0x3f, 0xb7, 0xbc, 0x40, 0xbd, 0x5e, 0xa7, +0x50, 0x28, 0x90, 0xcd, 0x66, 0xb9, 0x72, 0xe5, 0x0a, 0x85, 0x42, 0x81, +0x4a, 0xa5, 0xa2, 0xea, 0x41, 0xb0, 0x43, 0x21, 0x53, 0xaa, 0x1c, 0x12, +0x88, 0x9c, 0xf7, 0x0c, 0x40, 0x6b, 0x8c, 0x01, 0xb6, 0xe4, 0xb6, 0xe3, +0x38, 0x5c, 0xbb, 0x76, 0xed, 0x06, 0x10, 0xae, 0xeb, 0xa2, 0x69, 0x9a, +0x8a, 0x0b, 0x5d, 0xd7, 0x89, 0xc7, 0xe3, 0x00, 0xe4, 0x72, 0x39, 0xca, +0xe5, 0x72, 0x10, 0x80, 0x7d, 0x4f, 0x01, 0x4c, 0x4e, 0x4e, 0xfe, 0x03, +0x38, 0x2a, 0xb3, 0x4c, 0xa9, 0x54, 0x22, 0x97, 0xcb, 0xb1, 0xb8, 0xb8, +0xc8, 0xfc, 0xfc, 0x3c, 0xb6, 0x6d, 0x53, 0x2a, 0x95, 0xa8, 0xd7, 0xeb, +0x48, 0x01, 0x99, 0x4a, 0xa5, 0xb0, 0x2c, 0x8b, 0x72, 0xb9, 0xcc, 0x2f, +0xbf, 0xfc, 0xa2, 0x52, 0x68, 0x0b, 0xc0, 0x99, 0x7b, 0x72, 0x4f, 0xbc, +0x0e, 0xc4, 0x5f, 0x46, 0x46, 0x46, 0x86, 0x3d, 0xcf, 0x1b, 0x93, 0x20, +0xa4, 0xd4, 0x2e, 0x14, 0x0a, 0x74, 0x74, 0x74, 0xa8, 0xe6, 0x56, 0x22, +0x91, 0x20, 0x95, 0x4a, 0x91, 0xcd, 0x66, 0x39, 0x7b, 0xf6, 0xac, 0x6a, +0xd1, 0x07, 0x54, 0xef, 0x97, 0xff, 0xb2, 0x7b, 0xe2, 0x7f, 0x36, 0x46, +0x46, 0x46, 0x26, 0x80, 0xb1, 0x20, 0x5d, 0xe4, 0x19, 0xa2, 0xad, 0xad, +0x8d, 0x54, 0x2a, 0x45, 0x28, 0x14, 0x62, 0x69, 0x69, 0x89, 0xe5, 0xe5, +0xe5, 0x9b, 0x75, 0xeb, 0xa6, 0x27, 0x27, 0x27, 0xff, 0xe3, 0xbe, 0x01, +0x08, 0x82, 0x90, 0xe2, 0x50, 0x0a, 0xc4, 0xa0, 0x64, 0x08, 0xaa, 0xd5, +0xc0, 0xb0, 0x81, 0xfe, 0x56, 0x76, 0xbb, 0x7f, 0x00, 0x5a, 0x20, 0x3e, +0x06, 0x8e, 0x06, 0x1b, 0x68, 0xeb, 0x8e, 0xb4, 0xeb, 0x5f, 0x99, 0x06, +0xc6, 0x5a, 0xf1, 0x74, 0xcf, 0xb3, 0xd0, 0xcd, 0x62, 0xe2, 0xad, 0x96, +0x9e, 0x9a, 0xbe, 0xd9, 0x8d, 0xfe, 0xfa, 0x9b, 0x2b, 0x60, 0xf8, 0x76, +0x9b, 0xbf, 0xe7, 0x1e, 0x58, 0xe7, 0x8d, 0xa7, 0x5b, 0xa9, 0xb6, 0x3f, +0x20, 0x45, 0xce, 0xb4, 0xc0, 0x9d, 0xb8, 0x15, 0x65, 0xfe, 0x6d, 0x00, +0xdc, 0xad, 0xf1, 0x3f, 0x1b, 0xc1, 0xe6, 0x81, 0xe7, 0x14, 0x15, 0x38, +0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, +}; diff --git a/Source/Core/DolphinWX/resources/toolbar_plugin_options_dis.xpm b/Source/Core/DolphinWX/resources/toolbar_plugin_options_dis.xpm new file mode 100644 index 0000000000..39eace8e10 --- /dev/null +++ b/Source/Core/DolphinWX/resources/toolbar_plugin_options_dis.xpm @@ -0,0 +1,277 @@ +/* XPM */ +static char *toolbar_plugin_options_dis_xpm[] = { +/* columns rows colors chars-per-pixel */ +"48 48 223 2", +" c #6A6766", +". c #6D6A69", +"X c #706E6D", +"o c #767372", +"O c #797675", +"+ c #7A7877", +"@ c #7D7B7A", +"# c #AE241B", +"$ c #B22018", +"% c #B9241C", +"& c #AF2920", +"* c #B32C23", +"= c #BC2B23", +"- c #B6372E", +"; c #BD3029", +": c #BB3A33", +"> c #D91E0E", +", c #D91E12", +"< c #CC2102", +"1 c #D92904", +"2 c #DA270E", +"3 c #D32C0F", +"4 c #DB2C0F", +"5 c #D0360C", +"6 c #DC330C", +"7 c #D13E09", +"8 c #DD3C0D", +"9 c #CE2110", +"0 c #CF291E", +"q c #DA2614", +"w c #DB2911", +"e c #D6261C", +"r c #D5291E", +"t c #DB2D1A", +"y c #DB3313", +"u c #DD3C16", +"i c #DC331B", +"p c #DD3B1A", +"a c #CC2F25", +"s c #D52D24", +"d c #CE3026", +"f c #C6342C", +"g c #DE3A26", +"h c #C03D37", +"j c #CA3E37", +"k c #D03D37", +"l c #DC3D34", +"z c #E13C32", +"x c #BB433B", +"c c #D24404", +"v c #DF4F06", +"b c #DE4609", +"n c #DE4416", +"m c #DF4917", +"M c #DE431A", +"N c #DF4B18", +"B c #E24D1A", +"V c #E15416", +"C c #E55C12", +"Z c #CF4239", +"A c #DF4133", +"S c #D5463F", +"D c #DA483E", +"F c #E04D24", +"G c #E04A2E", +"H c #E15222", +"J c #E04736", +"K c #E14F3E", +"L c #E5663E", +"P c #BF4C45", +"I c #BC5347", +"U c #817F7E", +"Y c #C74740", +"T c #CB4740", +"R c #C54B44", +"E c #CB4B44", +"W c #C84F49", +"Q c #D44741", +"! c #DD4640", +"~ c #D04A42", +"^ c #DA4C42", +"/ c #DB4E4A", +"( c #C5514B", +") c #CC524B", +"_ c #C25A4E", +"` c #D4514A", +"' c #DC534B", +"] c #C65A53", +"[ c #D05852", +"{ c #E04D49", +"} c #E55647", +"| c #E35F46", +" . c #E3554A", +".. c #E45C4A", +"X. c #C0665B", +"o. c #C16859", +"O. c #D1655E", +"+. c #E46245", +"@. c #E4644A", +"#. c #E26A4C", +"$. c #E5734B", +"%. c #E6685B", +"&. c #E97F55", +"*. c #E2775E", +"=. c #C06560", +"-. c #C36A63", +";. c #CB6A64", +":. c #D26C67", +">. c #D36D68", +",. c #CE746E", +"<. c #DB736D", +"1. c #D77772", +"2. c #DA7771", +"3. c #D97974", +"4. c #DD7F7A", +"5. c #E47A63", +"6. c #E87F63", +"7. c #E3716C", +"8. c #82807F", +"9. c #DB837E", +"0. c #EA8663", +"q. c #EB9B6F", +"w. c #E58672", +"e. c #E89373", +"r. c #848281", +"t. c #898786", +"y. c #8B8887", +"u. c #8D8B8A", +"i. c #908F8E", +"p. c #91908F", +"a. c #949291", +"s. c #989695", +"d. c #9A9897", +"f. c #9D9B9B", +"g. c #A09F9E", +"h. c #A5A4A3", +"j. c #A9A7A6", +"k. c #AAA8A7", +"l. c #ADABAA", +"z. c #B1AFAF", +"x. c #B1B0AF", +"c. c #B5B4B4", +"v. c #B8B7B6", +"b. c #B9B8B7", +"n. c #BCBBBB", +"m. c #D08B83", +"M. c #E08782", +"N. c #E88782", +"B. c #E48883", +"V. c #E88D88", +"C. c #E5938F", +"Z. c #E89692", +"A. c #E79996", +"S. c #EC9F9B", +"D. c #DAA59C", +"F. c #F2AE8D", +"G. c #F2AD9C", +"H. c #F4BA9C", +"J. c #C0BFBF", +"K. c #EAAAA7", +"L. c #E1AEAA", +"P. c #E8AFAC", +"I. c #F1A7A3", +"U. c #EFB1A4", +"Y. c #E4B0AD", +"T. c #F4BDA6", +"R. c #F0B2AF", +"E. c #E7B3B0", +"W. c #EEB6B3", +"Q. c #E7B9B6", +"!. c #EDB8B5", +"~. c #BFC0BE", +"^. c #C0C0BF", +"/. c #F6C4B4", +"(. c #F6C2B8", +"). c #F8D3BC", +"_. c #C4C4C3", +"`. c #C8C7C6", +"'. c #C8C8C7", +"]. c #CCCCCB", +"[. c #D0CFCF", +"{. c #CFD0CF", +"}. c #D0D0CF", +"|. c #CED2D2", +" X c #D4D3D3", +".X c #D8D7D7", +"XX c #D8D8D7", +"oX c #D6DADB", +"OX c #DCDBDB", +"+X c #E9C5C3", +"@X c #EDC9C6", +"#X c #EECBC9", +"$X c #F7C6C3", +"%X c #F7CCC2", +"&X c #F8D6C1", +"*X c #E0DFDF", +"=X c #F3D6D4", +"-X c #FADED5", +";X c #F9DFDD", +":X c #E0E0DF", +">X c #FBE3DC", +",X c #DBE2E2", +".E W = #X,XaX", +"aXaXaXaXaXaXaXj.pX X[.7XrX i y 5.yXpXpXrXX.c C v e.pXpXpX7X_ y t , $X3XaX", +"aXaXaXaXaXaXaXaXaXaXl.XXn._.`. X Xl._..X1X4XrXtXK q i 6 *.pXuXX.7 V V V b e.pX7XI 3 i > %.pXaXaX", +"aXaXaXaXaXaXaXaXaXo OXn.n.^._.OXd.aXaXc.2X4X4XiX$Xy t i 6 5.-.5 B N N N m 8 w._ 3 i q g >X3XaXaX", +"aXaXaXaXaXaXaXaXaX_.].c.n.n.]._.aXaXaXk.X).H.F.H.&X6XpXiXaXaXaXaXaXaXaXaX", +"aXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaX8.a.i.i.i.t.aXaXaXaXaXaXeXiXiXiXiXuX4XaXaXaXaXaXaXaXaXaXaX", +"aXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaX", +"aXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaX" +}; diff --git a/Source/Core/DolphinWX/resources/toolbar_plugin_pad.c b/Source/Core/DolphinWX/resources/toolbar_plugin_pad.c new file mode 100644 index 0000000000..0c21d7c26f --- /dev/null +++ b/Source/Core/DolphinWX/resources/toolbar_plugin_pad.c @@ -0,0 +1,239 @@ +static const unsigned char toolbar_plugin_pad_png[] = { +0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, +0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, +0x08, 0x06, 0x00, 0x00, 0x00, 0x57, 0x02, 0xf9, 0x87, 0x00, 0x00, 0x00, +0x04, 0x73, 0x42, 0x49, 0x54, 0x08, 0x08, 0x08, 0x08, 0x7c, 0x08, 0x64, +0x88, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, +0x12, 0x00, 0x00, 0x0b, 0x12, 0x01, 0xd2, 0xdd, 0x7e, 0xfc, 0x00, 0x00, +0x00, 0x25, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, +0x72, 0x65, 0x00, 0x4d, 0x61, 0x63, 0x72, 0x6f, 0x6d, 0x65, 0x64, 0x69, +0x61, 0x20, 0x46, 0x69, 0x72, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, +0x4d, 0x58, 0x20, 0x32, 0x30, 0x30, 0x34, 0x87, 0x76, 0xac, 0xcf, 0x00, +0x00, 0x00, 0x15, 0x74, 0x45, 0x58, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, +0x69, 0x6f, 0x6e, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x00, 0x39, 0x2f, 0x31, +0x31, 0x2f, 0x30, 0x34, 0x0e, 0x46, 0xed, 0x55, 0x00, 0x00, 0x0a, 0x6a, +0x49, 0x44, 0x41, 0x54, 0x78, 0x9c, 0xd5, 0x9a, 0x5f, 0x8c, 0x5c, 0xd7, +0x5d, 0xc7, 0x3f, 0xe7, 0xdc, 0x7b, 0xe7, 0xde, 0x99, 0xd9, 0x3f, 0xb3, +0xb1, 0xbd, 0x76, 0xdc, 0x84, 0xac, 0x31, 0xa4, 0x89, 0xe8, 0x9f, 0x15, +0x15, 0x22, 0x45, 0x21, 0xb1, 0x1b, 0x25, 0x8a, 0x02, 0x28, 0xe6, 0x89, +0x07, 0x5a, 0x39, 0x7d, 0xe1, 0x01, 0x24, 0x12, 0x1e, 0x10, 0x52, 0xd5, +0x07, 0xf3, 0x08, 0xa8, 0x28, 0x41, 0x6a, 0xc0, 0x48, 0x34, 0x81, 0x8a, +0x06, 0x90, 0x4a, 0x8c, 0x10, 0x14, 0x89, 0x56, 0x5d, 0x22, 0x51, 0xda, +0xaa, 0x21, 0x9b, 0xe0, 0xa4, 0x69, 0x12, 0xdb, 0xeb, 0x64, 0xbd, 0xf6, +0xee, 0x7a, 0xff, 0xcd, 0xee, 0xcc, 0xce, 0xcc, 0x39, 0xbf, 0xf3, 0xe3, +0xe1, 0xdc, 0xd9, 0x5d, 0x68, 0xa5, 0xcc, 0xce, 0x5a, 0xa9, 0x7a, 0xa5, +0x9f, 0xe6, 0xce, 0x8e, 0xe6, 0xde, 0xef, 0xe7, 0xfc, 0xbe, 0xe7, 0xf7, +0x3b, 0xe7, 0xce, 0x1a, 0x55, 0xe5, 0x27, 0xf9, 0xb0, 0x3f, 0x6e, 0x01, +0x07, 0x3d, 0xd2, 0x5b, 0x75, 0xa1, 0xb5, 0xbf, 0xf8, 0x54, 0x43, 0x24, +0x9c, 0xf1, 0x5e, 0xce, 0x78, 0x91, 0x8f, 0x3b, 0x2f, 0x53, 0xce, 0x0b, +0xde, 0xcb, 0x9c, 0xf3, 0xf2, 0xaa, 0xf7, 0x72, 0xc1, 0x79, 0xb9, 0x70, +0xdf, 0x1f, 0xbf, 0xb9, 0x7e, 0xab, 0xee, 0x09, 0x60, 0x6e, 0x85, 0x85, +0xda, 0x5f, 0x7a, 0xe4, 0x9c, 0x97, 0xf0, 0xa4, 0xf7, 0xd2, 0xf0, 0x5e, +0x70, 0x65, 0xfc, 0xd0, 0xb9, 0x93, 0x75, 0xe7, 0xe5, 0x99, 0xfb, 0xff, +0xf4, 0xad, 0x73, 0x07, 0x97, 0x1e, 0x8f, 0x03, 0x01, 0xf8, 0x2f, 0x3f, +0xd6, 0xc0, 0x98, 0x17, 0x45, 0xe4, 0xd4, 0x1e, 0x91, 0x38, 0x2f, 0x24, +0x63, 0x35, 0xbc, 0x17, 0x36, 0x17, 0xd7, 0x76, 0x20, 0x5c, 0xf9, 0xb9, +0xf7, 0x32, 0xe3, 0xbc, 0xfc, 0xfa, 0xc3, 0xcf, 0xce, 0x1d, 0x38, 0x1b, +0x43, 0x03, 0x74, 0x9e, 0x7f, 0xb4, 0x91, 0xa5, 0xc9, 0x37, 0x8d, 0x35, +0xd3, 0xbe, 0x14, 0x6d, 0x8e, 0x1f, 0xa1, 0x72, 0xd7, 0x31, 0xd2, 0xd1, +0xdb, 0x40, 0x2b, 0xe0, 0xba, 0xb0, 0x75, 0x93, 0xce, 0xb5, 0x6b, 0x2c, +0x5e, 0x5a, 0xe0, 0xc6, 0xfc, 0x6a, 0x1f, 0x00, 0xe7, 0x65, 0xd6, 0x79, +0x7f, 0xfa, 0xb1, 0xbf, 0x9c, 0x3f, 0x10, 0xc4, 0xd0, 0x73, 0x20, 0xa8, +0xbe, 0x28, 0x21, 0x4c, 0x13, 0x20, 0xa4, 0x96, 0xe2, 0x97, 0x3f, 0x41, +0x32, 0xf9, 0x61, 0x28, 0x7e, 0x1e, 0xd2, 0x11, 0xa0, 0x0b, 0x74, 0x80, +0x0e, 0xc5, 0xcf, 0x5c, 0xe3, 0xae, 0x3b, 0xff, 0x8b, 0x89, 0x8b, 0xaf, +0xf2, 0xc6, 0xec, 0x55, 0xbc, 0x17, 0x80, 0x69, 0xe0, 0x45, 0xe0, 0xf4, +0x41, 0x00, 0x86, 0xca, 0xc0, 0xfa, 0xf9, 0x4f, 0x9d, 0x4d, 0x92, 0xe4, +0xf9, 0xc4, 0x1a, 0x4c, 0x96, 0x91, 0x3f, 0xfc, 0x4b, 0xd8, 0xc9, 0x5f, +0x05, 0x7b, 0x72, 0x57, 0xf8, 0xf6, 0x65, 0x68, 0x5f, 0x03, 0xe9, 0x40, +0x5e, 0x83, 0xf1, 0x06, 0x5c, 0xbb, 0x48, 0xeb, 0x3f, 0xfe, 0x95, 0x57, +0x5e, 0xbe, 0x4a, 0xbb, 0xdd, 0xeb, 0xdb, 0xea, 0x89, 0x33, 0xcf, 0x5d, +0xff, 0xeb, 0x61, 0x01, 0x86, 0xca, 0x80, 0x48, 0x38, 0x07, 0x10, 0x82, +0xa1, 0xfe, 0xe0, 0x2f, 0x60, 0x27, 0x1f, 0x01, 0xfb, 0x51, 0xd0, 0x4d, +0xd8, 0xfe, 0x6f, 0xd8, 0xf8, 0x2e, 0xb4, 0x9b, 0xd0, 0xe9, 0x40, 0xb7, +0x1b, 0x23, 0x00, 0x77, 0xde, 0x4b, 0xfd, 0x93, 0x0f, 0xf0, 0x91, 0xce, +0x37, 0xf8, 0xee, 0xcb, 0x73, 0xf1, 0x62, 0xaa, 0xe7, 0x80, 0xa1, 0x01, +0xf6, 0xdd, 0x07, 0x16, 0x9e, 0xbe, 0xff, 0x71, 0x2f, 0x61, 0xca, 0xfb, +0x80, 0x99, 0x18, 0x23, 0x3d, 0x7a, 0x0f, 0xd8, 0x7b, 0x41, 0x5b, 0xb0, +0xf5, 0x55, 0xd8, 0xfa, 0x0e, 0xf8, 0x0e, 0xa8, 0xc6, 0x08, 0x21, 0xbe, +0x8a, 0x83, 0xcb, 0xb3, 0xd0, 0xde, 0xa4, 0x71, 0xcf, 0x49, 0x0e, 0xdd, +0x36, 0x82, 0xa2, 0xa8, 0x32, 0xf5, 0x0f, 0xbf, 0x79, 0xe4, 0xf1, 0x0f, +0x0c, 0xa0, 0xac, 0xf5, 0x38, 0x2f, 0x54, 0x4e, 0x1c, 0x87, 0xec, 0x6e, +0xa0, 0x07, 0x9b, 0xff, 0x08, 0xdb, 0x0b, 0xe0, 0x7d, 0x0c, 0x91, 0x28, +0xbe, 0x0f, 0x60, 0x2d, 0x24, 0x09, 0xac, 0xde, 0x00, 0xf1, 0xdc, 0x75, +0x47, 0x03, 0x8c, 0x45, 0x55, 0x51, 0xd5, 0x33, 0xc3, 0x02, 0xec, 0xdb, +0x42, 0x5e, 0x64, 0xda, 0xaa, 0xc5, 0x06, 0xa5, 0x98, 0x3c, 0x02, 0xf9, +0xed, 0xd0, 0x7e, 0x0d, 0xb6, 0xae, 0x44, 0xb1, 0x7d, 0x80, 0x7e, 0xf4, +0x01, 0x8c, 0x81, 0x34, 0x8d, 0x20, 0xce, 0x71, 0xf8, 0xe8, 0x38, 0x58, +0x4b, 0x88, 0x00, 0xd3, 0xc3, 0x02, 0xec, 0x3b, 0x03, 0x5e, 0xc2, 0xb4, +0xf7, 0x42, 0x32, 0x5e, 0x07, 0x33, 0x02, 0xf4, 0xe0, 0xe6, 0x7f, 0xee, +0xfa, 0xbd, 0xd7, 0x8b, 0xe1, 0xdc, 0x2e, 0x40, 0x5f, 0x7c, 0xa5, 0x02, +0x45, 0x11, 0x23, 0xcb, 0x38, 0xd4, 0x28, 0x50, 0x20, 0x1c, 0x00, 0x60, +0xff, 0x19, 0xf0, 0x82, 0x35, 0x06, 0x71, 0x3e, 0xd6, 0x79, 0xb7, 0x0c, +0xad, 0x9b, 0xf1, 0x43, 0xd5, 0x68, 0x9d, 0xbd, 0x36, 0x52, 0x8d, 0xd6, +0xa9, 0x54, 0x20, 0xcf, 0xe3, 0x39, 0x44, 0x20, 0x63, 0x08, 0x41, 0x09, +0x61, 0xf8, 0x66, 0x3a, 0x14, 0x80, 0xb1, 0x06, 0xf1, 0x25, 0x40, 0x6b, +0x21, 0x8e, 0x3c, 0xec, 0x99, 0xb0, 0xa5, 0xff, 0xfb, 0x42, 0xb3, 0x0c, +0xaa, 0xd5, 0x08, 0x60, 0x4c, 0xcc, 0x0e, 0x10, 0x24, 0x10, 0x42, 0x38, +0x10, 0xc0, 0x30, 0x16, 0x9a, 0xf1, 0x3e, 0xb0, 0x71, 0x73, 0x03, 0xb6, +0x56, 0x61, 0x6b, 0x61, 0xd7, 0x2e, 0x7b, 0x85, 0x5b, 0x1b, 0x85, 0x17, +0x05, 0xd4, 0x6a, 0x31, 0x8a, 0x62, 0x37, 0x03, 0x22, 0xdc, 0xb8, 0xd9, +0x8a, 0x00, 0x1a, 0x66, 0x3e, 0x30, 0x00, 0xe7, 0x65, 0xce, 0x97, 0xeb, +0x9e, 0xf6, 0xc2, 0x42, 0xbc, 0x42, 0x5f, 0x78, 0xbf, 0xd2, 0xa4, 0x69, +0x1c, 0xed, 0x5a, 0x0d, 0xea, 0x75, 0x18, 0x1d, 0x8d, 0x19, 0x48, 0xd3, +0x98, 0xa1, 0x6e, 0x97, 0xcd, 0xb5, 0x2d, 0x9c, 0x73, 0x88, 0x28, 0x21, +0xe8, 0xdc, 0x07, 0x06, 0xe0, 0xbd, 0xcc, 0xf4, 0xcb, 0xe8, 0xcd, 0x77, +0x97, 0x61, 0xe9, 0x52, 0xfc, 0xa0, 0x6f, 0x95, 0xa2, 0x88, 0xa2, 0x47, +0x46, 0xa2, 0xf0, 0xd1, 0xd1, 0x08, 0x52, 0xa9, 0x44, 0xf1, 0xbd, 0x1e, +0xb4, 0x5a, 0x5c, 0x9d, 0x5b, 0x46, 0x7a, 0x3e, 0x66, 0x40, 0x86, 0xcf, +0xc0, 0x30, 0x73, 0xe0, 0x82, 0x31, 0x66, 0xdd, 0x18, 0xd3, 0xb8, 0x3e, +0xbf, 0xc2, 0xf1, 0xa5, 0xeb, 0xa4, 0x13, 0xe3, 0xbb, 0xe2, 0xf3, 0x3c, +0x9e, 0xf7, 0x81, 0x92, 0x64, 0xd7, 0xf7, 0xdd, 0x2e, 0x6c, 0x6e, 0xe2, +0x56, 0xd6, 0x78, 0xeb, 0xf2, 0x12, 0x5e, 0x04, 0x09, 0x61, 0x3d, 0xa8, +0x5e, 0x18, 0x16, 0x60, 0xdf, 0x19, 0x78, 0xe0, 0xe9, 0x77, 0x36, 0xbc, +0x97, 0x0b, 0xde, 0x0b, 0x9d, 0xed, 0x1e, 0x6f, 0xbf, 0x72, 0x09, 0x36, +0x9b, 0x71, 0x0e, 0x18, 0x13, 0x05, 0x67, 0xd9, 0xae, 0x78, 0x88, 0xe2, +0xdb, 0x6d, 0x68, 0x36, 0x61, 0x65, 0x85, 0xef, 0x7d, 0xef, 0x32, 0xad, +0xcd, 0x0e, 0x22, 0x01, 0x91, 0x70, 0xe1, 0xb7, 0xfe, 0xb9, 0xbd, 0xf1, +0x81, 0x01, 0x00, 0x38, 0x91, 0x73, 0xce, 0x0b, 0xbd, 0x9e, 0x67, 0xe1, +0xda, 0x1a, 0x8b, 0x97, 0x16, 0x60, 0x63, 0x23, 0x8a, 0xec, 0xf7, 0x00, +0xe7, 0x62, 0x6f, 0x68, 0xb5, 0xa2, 0xf0, 0xb5, 0x35, 0x58, 0x5a, 0xe2, +0xbd, 0xef, 0xbf, 0xcb, 0xe5, 0xcb, 0x4b, 0x38, 0xe7, 0x11, 0x09, 0x00, +0xe7, 0x86, 0x15, 0x3f, 0x34, 0xc0, 0x23, 0xcf, 0x5e, 0xbd, 0xfa, 0xd6, +0x68, 0xb8, 0xe0, 0xbd, 0xd0, 0xeb, 0xf6, 0x98, 0x9d, 0x7d, 0x8f, 0xf9, +0xd7, 0xaf, 0xc0, 0xf5, 0xeb, 0xb0, 0xb4, 0x04, 0xab, 0xab, 0x51, 0xf0, +0xda, 0x1a, 0xac, 0xac, 0xc0, 0x8d, 0x1b, 0x30, 0x3f, 0xcf, 0xa5, 0x57, +0xde, 0xe1, 0xa5, 0x6f, 0xbd, 0x4d, 0xb7, 0xeb, 0x10, 0x09, 0x7c, 0xe3, +0x28, 0x7c, 0xee, 0xa3, 0x7c, 0xf6, 0x20, 0x00, 0x43, 0x2d, 0xa7, 0x4f, +0xbf, 0x70, 0xe2, 0x09, 0x55, 0x7d, 0xee, 0xd3, 0xdf, 0x71, 0x4c, 0x6e, +0x29, 0x60, 0xb0, 0x89, 0x61, 0xf2, 0xc8, 0x18, 0x77, 0xff, 0xec, 0x24, +0x8d, 0x23, 0xe5, 0x9c, 0x00, 0x70, 0x8e, 0x95, 0xc5, 0x75, 0x2e, 0xbe, +0x7e, 0x8d, 0x77, 0xdf, 0x5b, 0xc1, 0x79, 0x41, 0xbc, 0x70, 0xbd, 0x80, +0x2f, 0x7e, 0xd8, 0x94, 0x55, 0x28, 0xcc, 0x8a, 0xe8, 0xe9, 0x8d, 0x3f, +0xe9, 0xec, 0x7b, 0x73, 0xb3, 0x6f, 0x80, 0x87, 0xfe, 0xfe, 0xa7, 0x9f, +0x00, 0x9e, 0x0b, 0x41, 0xc9, 0x7a, 0x81, 0xcf, 0xbe, 0xd4, 0x25, 0x77, +0xca, 0xce, 0x55, 0xac, 0xa1, 0x5e, 0x2f, 0xa8, 0xd7, 0x52, 0x42, 0x50, +0x9a, 0x9b, 0x5d, 0x36, 0x9a, 0xdb, 0x88, 0xf3, 0x71, 0xd2, 0x4a, 0xa0, +0x93, 0xc2, 0xd3, 0x1f, 0x49, 0x68, 0xa1, 0xfd, 0x32, 0x8a, 0x48, 0x98, +0x0d, 0x41, 0x4f, 0x6f, 0x7e, 0xa1, 0xbb, 0x2f, 0x88, 0x7d, 0x01, 0x9c, +0x7e, 0xe1, 0xc4, 0xb4, 0xb5, 0xe6, 0x9b, 0x40, 0x23, 0x04, 0xc5, 0x26, +0x86, 0xa9, 0x4a, 0xca, 0x03, 0x2f, 0x39, 0xf2, 0x1b, 0x4d, 0x50, 0xe2, +0xea, 0x12, 0x83, 0x6a, 0x29, 0x4c, 0xc3, 0xff, 0xe9, 0xb8, 0xcb, 0x87, +0x2c, 0x5f, 0x7b, 0xb0, 0xc2, 0x7c, 0xaa, 0xb8, 0x05, 0xa1, 0xd7, 0x94, +0x72, 0x32, 0x2b, 0x21, 0xe8, 0xcc, 0xe6, 0x17, 0xba, 0xfb, 0xda, 0xa1, +0xed, 0x6b, 0x0e, 0x84, 0xa0, 0xcf, 0x89, 0x68, 0x43, 0x44, 0xc9, 0xf2, +0x84, 0xa9, 0x7b, 0x1a, 0x3c, 0xfa, 0xc9, 0xdf, 0xe1, 0x57, 0xfe, 0x70, +0x86, 0x3b, 0x1e, 0xfe, 0x4c, 0xb9, 0xc3, 0x0a, 0x38, 0xe7, 0x63, 0x78, +0x8f, 0x2f, 0xf7, 0xc0, 0x21, 0x28, 0xaf, 0x7e, 0x2c, 0xe7, 0xab, 0xbf, +0x56, 0x65, 0xf5, 0x70, 0x4a, 0x3e, 0x9e, 0x51, 0xbd, 0x3b, 0x23, 0xbf, +0x33, 0xc3, 0x5a, 0xd3, 0xbf, 0xc5, 0xa9, 0xda, 0x53, 0x95, 0xb3, 0xfb, +0xd1, 0x34, 0x70, 0x06, 0xee, 0xff, 0x9b, 0x9f, 0x7a, 0xd2, 0x18, 0xf3, +0xb4, 0x31, 0x50, 0x54, 0x53, 0x4e, 0xde, 0x7b, 0x1b, 0x9f, 0xfe, 0xd0, +0xe7, 0xf9, 0xc5, 0xb1, 0xc7, 0xe8, 0x69, 0x8f, 0xd7, 0xb7, 0xbe, 0xcd, +0xd7, 0xdf, 0xfc, 0x2b, 0xda, 0x5f, 0x9f, 0x61, 0x62, 0x6e, 0x9b, 0xb1, +0x1b, 0x3d, 0x82, 0x2a, 0x6b, 0x47, 0x52, 0xae, 0xdf, 0x91, 0xf1, 0xda, +0xc7, 0x2a, 0xac, 0xd5, 0xc0, 0xc7, 0xe5, 0x33, 0xc6, 0x58, 0xc0, 0xe2, +0x83, 0xd0, 0x5c, 0xec, 0xd0, 0x7e, 0xbb, 0x8b, 0x73, 0x81, 0x10, 0x74, +0x3d, 0x84, 0x70, 0xa2, 0xf3, 0x67, 0x7e, 0x20, 0x2b, 0x0d, 0xd4, 0xc8, +0xee, 0xfb, 0xd2, 0x1d, 0x0d, 0x63, 0xcc, 0x39, 0x63, 0x20, 0x49, 0x0d, +0x47, 0xa7, 0x46, 0x78, 0xe8, 0xd0, 0x67, 0xf8, 0xc4, 0xd8, 0xc3, 0x78, +0x1c, 0xff, 0x7e, 0xf3, 0x05, 0xfe, 0x6e, 0xfe, 0x19, 0xbc, 0x0d, 0xf8, +0x87, 0xc6, 0x71, 0x32, 0x82, 0x0b, 0x01, 0x2f, 0x01, 0x27, 0x01, 0x1f, +0x04, 0x27, 0x01, 0x95, 0x80, 0x86, 0x80, 0xb1, 0x09, 0x49, 0x92, 0x90, +0x25, 0x29, 0xd6, 0xe4, 0x98, 0x63, 0x16, 0x59, 0x0b, 0xf8, 0x1b, 0x3d, +0x20, 0x34, 0x54, 0x79, 0x9c, 0x01, 0xb7, 0x99, 0x03, 0x01, 0x84, 0xa0, +0x67, 0x8d, 0xa1, 0x61, 0x8c, 0xd2, 0x38, 0x52, 0xe3, 0x58, 0xed, 0x04, +0xa7, 0x0e, 0xff, 0x06, 0xed, 0xd0, 0xe2, 0xcb, 0xef, 0xfe, 0x11, 0xdf, +0x5a, 0xfd, 0x37, 0x24, 0x28, 0x12, 0x02, 0x3e, 0x84, 0xf2, 0x3c, 0x46, +0xd0, 0xe8, 0xfd, 0xa0, 0xbb, 0x61, 0x51, 0x52, 0x6b, 0xa9, 0xa4, 0x19, +0x79, 0x96, 0x91, 0xa6, 0x09, 0xbd, 0x93, 0x42, 0x67, 0xd5, 0xe1, 0xdb, +0x40, 0xec, 0x0d, 0x03, 0x01, 0x0c, 0x34, 0x07, 0x44, 0xf4, 0x29, 0x11, +0x85, 0xc4, 0x90, 0x37, 0x12, 0x1e, 0x3d, 0x7a, 0x96, 0x6d, 0x69, 0xf3, +0xb5, 0xc5, 0xaf, 0x30, 0xb3, 0xfc, 0x2f, 0x74, 0xbd, 0xa7, 0xe7, 0x3d, +0x3d, 0x11, 0x7a, 0x22, 0xb8, 0x20, 0x78, 0x89, 0x30, 0x3e, 0x28, 0x7e, +0x07, 0x28, 0x20, 0xaa, 0x44, 0xd7, 0x5a, 0xf2, 0x2c, 0xa5, 0x5e, 0x14, +0x8c, 0x55, 0xeb, 0x8c, 0x8f, 0xd6, 0xc8, 0x6f, 0xcf, 0x00, 0x83, 0x2a, +0x53, 0xe9, 0x6f, 0xdb, 0x81, 0x36, 0x39, 0xef, 0x9b, 0x81, 0xe9, 0x67, +0x8f, 0x4d, 0x1b, 0x63, 0xa6, 0x8c, 0x51, 0xf2, 0xdb, 0x32, 0x3e, 0x54, +0xdc, 0xcd, 0xf1, 0xda, 0x49, 0xde, 0xde, 0xba, 0xc8, 0xdf, 0x5e, 0xf9, +0x62, 0x7f, 0x63, 0x5e, 0x8e, 0x6e, 0xd8, 0x15, 0x1a, 0xb4, 0x04, 0x08, +0x31, 0x33, 0x12, 0x5f, 0x43, 0x09, 0x90, 0x24, 0x96, 0x4a, 0x96, 0x51, +0xcb, 0x73, 0x82, 0x2a, 0x1d, 0xef, 0xc8, 0x27, 0x9b, 0xd8, 0x2b, 0x1d, +0xbc, 0x57, 0x54, 0x79, 0x10, 0x98, 0x3d, 0x30, 0x80, 0x88, 0x3e, 0x6e, +0x4c, 0x5c, 0xe6, 0x68, 0x55, 0xf9, 0xb9, 0xc6, 0x7d, 0xb4, 0xa5, 0xc5, +0x57, 0xae, 0xfc, 0x39, 0x1d, 0xe7, 0x50, 0xd8, 0x03, 0x50, 0x46, 0x39, +0xd2, 0x7d, 0xf1, 0x12, 0x34, 0x02, 0x94, 0x05, 0xc3, 0x5a, 0x4b, 0x25, +0x49, 0xa9, 0x56, 0x72, 0x6a, 0x79, 0x0e, 0x40, 0xd7, 0x79, 0xf2, 0x5a, +0x86, 0x29, 0x2c, 0xda, 0x15, 0x54, 0x39, 0x05, 0x3c, 0x73, 0x60, 0x80, +0x10, 0xf4, 0x94, 0x31, 0x8a, 0xad, 0x59, 0x9c, 0x06, 0x8e, 0xd5, 0xa6, +0xf8, 0x9f, 0xb5, 0x97, 0x79, 0x63, 0xed, 0x22, 0xfd, 0x0a, 0x56, 0xee, +0x6b, 0x63, 0xed, 0xd7, 0x5d, 0xef, 0xef, 0xcd, 0x46, 0x28, 0x37, 0xf6, +0x59, 0x92, 0x52, 0x54, 0x2a, 0xd4, 0x8a, 0x82, 0xb1, 0x6a, 0x95, 0x91, +0xa2, 0x40, 0x24, 0x50, 0xc9, 0x32, 0x2a, 0x69, 0x86, 0xa9, 0x02, 0x1b, +0x8a, 0xaa, 0x4e, 0xbd, 0x9f, 0xb6, 0x81, 0x00, 0x44, 0x74, 0xca, 0x18, +0x30, 0x05, 0xf8, 0x00, 0x79, 0x5a, 0xe5, 0xdb, 0xf3, 0x2f, 0x11, 0x94, +0xb2, 0x51, 0x29, 0xaa, 0x01, 0x51, 0xca, 0xdd, 0x95, 0xee, 0xd8, 0xa4, +0x0f, 0x85, 0x31, 0x58, 0x6b, 0x49, 0x93, 0x84, 0x6a, 0xa5, 0x60, 0xac, +0x56, 0x67, 0xa2, 0x3e, 0xc2, 0x58, 0xad, 0x4e, 0xad, 0x52, 0xa1, 0xe3, +0x1c, 0xa9, 0xb5, 0x24, 0xd6, 0x62, 0xaa, 0xb6, 0x9c, 0x23, 0xdc, 0x9a, +0x39, 0x10, 0x42, 0x98, 0x02, 0x83, 0x0d, 0x71, 0xb9, 0xd0, 0xd5, 0x6d, +0xde, 0xdb, 0xbe, 0x4c, 0x9a, 0x66, 0x88, 0x04, 0x34, 0x08, 0x12, 0x4c, +0xf9, 0xe8, 0x04, 0x50, 0xc5, 0x98, 0x78, 0x1e, 0x17, 0xd3, 0x86, 0xc4, +0x5a, 0xb2, 0x34, 0xa5, 0xc8, 0x2a, 0x8c, 0x56, 0x6b, 0x4c, 0x8c, 0x8c, +0x70, 0x68, 0x74, 0x94, 0xb1, 0x5a, 0x8d, 0xc4, 0x18, 0x7a, 0xde, 0xef, +0xc0, 0x6b, 0xd9, 0xcd, 0x07, 0x3d, 0x06, 0xc9, 0x00, 0xc6, 0x28, 0xbe, +0x6b, 0xc1, 0x58, 0x7e, 0xd0, 0xbc, 0x88, 0x37, 0x1d, 0x46, 0x8a, 0x2a, +0x12, 0x02, 0x4e, 0x04, 0x5f, 0x56, 0x9d, 0xa0, 0x71, 0xe9, 0x40, 0xf9, +0x18, 0xc8, 0x60, 0x49, 0x12, 0xbb, 0x63, 0x9b, 0x7a, 0x5e, 0x30, 0x56, +0xab, 0x31, 0x51, 0xaf, 0x33, 0x56, 0xab, 0x92, 0x67, 0x95, 0x58, 0xbd, +0xbc, 0x67, 0xdb, 0x39, 0xba, 0xce, 0x21, 0x1d, 0x19, 0x58, 0xfc, 0xa0, +0x00, 0x73, 0xc6, 0x30, 0x65, 0xda, 0x42, 0xd7, 0x0b, 0x3f, 0xd8, 0x78, +0x8d, 0x6a, 0x25, 0x27, 0x4b, 0x53, 0x8c, 0x31, 0xd1, 0xe3, 0x22, 0x3b, +0x15, 0x27, 0x8e, 0x5e, 0xec, 0xb4, 0x89, 0x4d, 0xc8, 0xd2, 0x84, 0x3c, +0x8d, 0xd5, 0xa6, 0x9e, 0xe7, 0xd4, 0x8b, 0x9c, 0x5a, 0xf9, 0x7d, 0x09, +0x81, 0x76, 0xb7, 0xcb, 0xc6, 0xf6, 0x36, 0x1b, 0xad, 0x16, 0xad, 0x4e, +0x07, 0xb7, 0x26, 0x7d, 0x0b, 0xcd, 0xdd, 0x12, 0x80, 0x10, 0xc2, 0x2c, +0x98, 0x29, 0xda, 0x81, 0xed, 0xe5, 0x2e, 0x6f, 0xe4, 0xdf, 0xe7, 0x78, +0xe3, 0x30, 0x69, 0x92, 0x90, 0x67, 0x29, 0xd6, 0xd8, 0x58, 0xa1, 0xe2, +0xaa, 0x1a, 0x00, 0x4b, 0xe9, 0x79, 0x6b, 0x49, 0x92, 0x84, 0x4a, 0x9a, +0x92, 0xa5, 0x69, 0x7c, 0x4d, 0x12, 0x4c, 0x69, 0x9b, 0x56, 0xa7, 0xc3, +0xca, 0xe6, 0x26, 0xcb, 0xcd, 0x26, 0x8b, 0xcd, 0x26, 0x9b, 0x0b, 0x1d, +0x64, 0x3b, 0xf4, 0x6f, 0xfd, 0xbe, 0x25, 0x74, 0x20, 0x00, 0x11, 0xbd, +0x00, 0x7a, 0x26, 0x04, 0x08, 0xd7, 0x61, 0x29, 0xdb, 0x40, 0x55, 0x99, +0x1c, 0x1f, 0x07, 0x53, 0xa3, 0xc8, 0x2c, 0x59, 0x92, 0x90, 0xd8, 0x84, +0xc4, 0x5a, 0xac, 0xd9, 0x23, 0xbe, 0x0c, 0x5b, 0xfe, 0xdd, 0x00, 0xae, +0xb4, 0xcc, 0x56, 0xb7, 0xcb, 0xfa, 0xd6, 0x16, 0x8b, 0xcd, 0x26, 0xd7, +0x56, 0x57, 0x59, 0x5e, 0xdc, 0x60, 0xfb, 0x52, 0x6f, 0xaf, 0xff, 0x07, +0xda, 0x27, 0x0f, 0x04, 0x60, 0x0c, 0xeb, 0x40, 0x43, 0xbb, 0x9e, 0xf4, +0x8a, 0xb2, 0xd8, 0x5a, 0xa7, 0x79, 0x7b, 0x87, 0xc3, 0x63, 0x63, 0x4c, +0xd4, 0xeb, 0x8c, 0xe4, 0x39, 0x45, 0xa5, 0xb2, 0x33, 0xc2, 0x18, 0x13, +0x6b, 0x7e, 0x7f, 0x62, 0x8a, 0x10, 0x42, 0xc0, 0x8b, 0xd0, 0x75, 0x8e, +0x56, 0x69, 0x9b, 0x9b, 0xcd, 0x26, 0x8b, 0x1b, 0x1b, 0xac, 0x5c, 0xdb, +0xa4, 0xf5, 0x66, 0x87, 0xe0, 0x76, 0x46, 0x7f, 0x7d, 0x50, 0x80, 0x81, +0x56, 0xa3, 0x93, 0x9f, 0x1f, 0x79, 0x10, 0x98, 0x31, 0x7d, 0x8b, 0x58, +0x43, 0x52, 0x4b, 0x31, 0x93, 0x86, 0x62, 0x22, 0x67, 0xb4, 0x5e, 0x65, +0xb4, 0x5a, 0xa5, 0x9e, 0xe7, 0xd4, 0x4a, 0x90, 0x24, 0x49, 0xb0, 0xc4, +0x1e, 0xd1, 0x9f, 0xec, 0x9d, 0x5e, 0x8f, 0xad, 0x6e, 0x97, 0xcd, 0x76, +0x3b, 0xfa, 0x7e, 0xbd, 0xc5, 0xd6, 0x3b, 0x5d, 0x3a, 0x4b, 0x8e, 0x10, +0xc2, 0xde, 0x5b, 0x9e, 0xd1, 0xf3, 0xfa, 0x4f, 0xb7, 0x0c, 0x00, 0xe0, +0xf0, 0xe7, 0x6a, 0x67, 0x81, 0xe7, 0x77, 0xbe, 0x68, 0xc0, 0x18, 0x83, +0xb5, 0x09, 0x66, 0xdc, 0x60, 0x47, 0x13, 0xb2, 0x7a, 0x42, 0x3a, 0x92, +0x90, 0xa5, 0xe9, 0x8e, 0x9d, 0x20, 0xf6, 0x03, 0x27, 0x42, 0xcf, 0x7b, +0xba, 0x5b, 0x8e, 0xce, 0x6a, 0x8f, 0xee, 0xb2, 0xa7, 0xb7, 0x1a, 0xf7, +0xc6, 0xff, 0x4f, 0xc2, 0x53, 0x7a, 0x5e, 0xdf, 0xb7, 0x03, 0xef, 0x1b, +0x00, 0x60, 0xe2, 0x0f, 0xaa, 0x1f, 0x2f, 0x21, 0x76, 0x9a, 0x4c, 0xff, +0xc9, 0x79, 0x84, 0x32, 0x3b, 0x11, 0x6a, 0xfd, 0xb6, 0x50, 0x76, 0xe7, +0x6d, 0x25, 0x74, 0x04, 0xef, 0xcb, 0xa5, 0xc6, 0x0f, 0x0b, 0x07, 0x78, +0x42, 0xcf, 0xeb, 0xbe, 0x7e, 0xad, 0x19, 0x6a, 0x53, 0x3f, 0xfe, 0xfb, +0xc5, 0x93, 0xaa, 0x9c, 0x03, 0x1a, 0xa0, 0x3b, 0x42, 0xfa, 0x4d, 0xa8, +0x5f, 0x95, 0xfa, 0xef, 0xe3, 0x33, 0xdf, 0x72, 0x59, 0x1d, 0x7e, 0x64, +0xa3, 0x9a, 0x2d, 0xc5, 0xbf, 0xba, 0x5f, 0x2d, 0x07, 0xfa, 0x9d, 0xb8, +0xfe, 0x7b, 0x95, 0xb3, 0xc0, 0x19, 0xe0, 0x4c, 0xbc, 0xcc, 0x6e, 0x27, +0xdd, 0x0b, 0xd0, 0x7f, 0xff, 0x23, 0x9e, 0x42, 0xcf, 0x00, 0xcf, 0xef, +0x77, 0xd4, 0xf7, 0x1e, 0xb7, 0xe4, 0x97, 0xfa, 0xe2, 0x77, 0xd3, 0x71, +0x55, 0xa6, 0x81, 0x53, 0xaa, 0x9c, 0x2a, 0x05, 0x9f, 0xda, 0x05, 0x51, +0x88, 0x8d, 0x69, 0x8e, 0x38, 0xda, 0xb3, 0xc0, 0x8c, 0x9e, 0xd7, 0xab, +0x07, 0xbd, 0xf7, 0x2d, 0x01, 0xf8, 0x71, 0x1e, 0x3f, 0xf1, 0xff, 0xad, +0xf2, 0xbf, 0xbd, 0x42, 0x09, 0x81, 0x50, 0xaf, 0xf9, 0xba, 0x00, 0x00, +0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, +}; diff --git a/Source/Core/DolphinWX/resources/toolbar_plugin_pad.xpm b/Source/Core/DolphinWX/resources/toolbar_plugin_pad.xpm new file mode 100644 index 0000000000..f7782f6072 --- /dev/null +++ b/Source/Core/DolphinWX/resources/toolbar_plugin_pad.xpm @@ -0,0 +1,228 @@ +/* XPM */ +static char *toolbar_plugin_pad_xpm[] = { +/* columns rows colors chars-per-pixel */ +"48 48 174 2", +" c #78110C", +". c #6D1511", +"X c #7F332E", +"o c #763E3B", +"O c #8D0C05", +"+ c #8A140D", +"@ c #961A14", +"# c #A50500", +"$ c #A90000", +"% c #AC0C03", +"& c #B60300", +"* c #BB0600", +"= c #B70E05", +"- c #BB0A00", +"; c #A3160E", +": c #AA170E", +"> c #AB180F", +", c #A41911", +"< c #AF1C12", +"1 c #AC1F18", +"2 c #B51D14", +"3 c #BA1E16", +"4 c #92221C", +"5 c #9D241D", +"6 c #A3241C", +"7 c #AC241A", +"8 c #B1241C", +"9 c #BA241B", +"0 c #B32C1E", +"q c #BB2A1F", +"w c #8F2F29", +"e c #922721", +"r c #9F2620", +"t c #9F2E27", +"y c #993029", +"u c #9C3B35", +"i c #A22E27", +"p c #A6322B", +"a c #A9342D", +"s c #B23222", +"d c #B1362B", +"f c #BA3029", +"g c #B43829", +"h c #A83D36", +"j c #C6261D", +"k c #CA251C", +"l c #D2251D", +"z c #A7433D", +"x c #8C5552", +"c c #9E5551", +"v c #A04843", +"b c #AC4943", +"n c #A74E48", +"m c #AB4E49", +"M c #BC4640", +"N c #B44B45", +"B c #BB4C45", +"V c #A1534E", +"C c #AF524C", +"Z c #BB544A", +"A c #BF5B49", +"S c #AA5651", +"D c #B05A54", +"F c #9B6F6D", +"G c #AC6661", +"H c #AC6B67", +"J c #B96762", +"K c #BE6862", +"L c #AE726F", +"P c #B9706B", +"I c #B57673", +"U c #B27D79", +"Y c #BA7F7B", +"T c #C5564F", +"R c #C46756", +"E c #C36861", +"W c #C06E69", +"Q c #C27D7A", +"! c #B3817E", +"~ c #CF8577", +"^ c #C3837F", +"/ c #CA837C", +"( c #979695", +") c #9D9C9C", +"_ c #AF8481", +"` c #AF8C8A", +"' c #B68582", +"] c #BE8581", +"[ c #BC8987", +"{ c #B38C8A", +"} c #BD8D89", +"| c #B2918F", +" . c #B9918E", +".. c #A09F9E", +"X. c #BC9592", +"o. c #B99A97", +"O. c #BA9A98", +"+. c #A1A09F", +"@. c #B1A09F", +"#. c #A4A3A3", +"$. c #A8A7A7", +"%. c #A9A8A7", +"&. c #ACABAB", +"*. c #B3A5A4", +"=. c #B0AFAF", +"-. c #BFACAB", +";. c #B1B0AF", +":. c #B3B2B2", +">. c #BAB5B5", +",. c #B8B8B7", +"<. c #BCBBBB", +"1. c #CB8481", +"2. c #CC8A81", +"3. c #C48E8A", +"4. c #C69592", +"5. c #CB9693", +"6. c #CB9895", +"7. c #CA9B99", +"8. c #DA9A97", +"9. c #D49D9B", +"0. c #DAA89D", +"q. c #C4A4A2", +"w. c #CBAAA9", +"e. c #D3AEAC", +"r. c #C6B4B3", +"t. c #CAB6B5", +"y. c #C2BFBE", +"u. c #CABBBA", +"i. c #D5B6B4", +"p. c #DBB3B0", +"a. c #DFBBB7", +"s. c #D2BDBC", +"d. c #D9BBB9", +"f. c #E1BEB8", +"g. c #C2C0BF", +"h. c #E4C0B6", +"j. c #C4C3C3", +"k. c #C9C7C6", +"l. c #C7C9C9", +"z. c #CCCBCB", +"x. c #D2C4C3", +"c. c #DCC4C3", +"v. c #D1CFCE", +"b. c #DECECD", +"n. c #DBD0CF", +"m. c #CFD3D3", +"M. c #D4D3D3", +"N. c #D8D7D7", +"B. c #D8D8D7", +"V. c #D5DADA", +"C. c #DBDBDB", +"Z. c #E1C7C5", +"A. c #E0D0CF", +"S. c #E4D4D3", +"D. c #E9D5D3", +"F. c #E1DFDE", +"G. c #E9D9D8", +"H. c #EBE1DF", +"J. c #DDDFE0", +"K. c #DDE2E2", +"L. c #E3E3E3", +"P. c #E9E6E5", +"I. c #EBE8E6", +"U. c #E0E7E8", +"Y. c #E6E9EA", +"T. c #ECECEC", +"R. c #F0EFEF", +"E. c #ECEFF0", +"W. c #EDF2F3", +"Q. c #EEFCFD", +"!. c #F3F3F4", +"~. c #F4FBFB", +"^. c #FAFDFD", +"/. c None", +/* pixels */ +"/./././././././././././././././././././././././././././././././././././././././././././././././.", +"/./././././././././././././././././././././././././././././././././././././././././././././././.", +"/./././././././././././././././././././././././././././././././././././././././././././././././.", +"/./././././././././././././././././././././././././././././././././././././././././././././././.", +"/././././././././././././././././././././.!././././././././././././././././././././././././././.", +"/./././././././././././././././././././././././././././././././././././././././././././././././.", +"/./././././././././././././././././././.T./././././././.C.N.M.k.z./././././././././././././././.", +"/././././././././././././././././././.L./././././././.M.B.C.J.K.U.L.L.P.I.!././././././././././.", +"/./././././././././././././././././.P././././././././.v.M.M.] N D c.T.T.W.W.W./././././././././.", +"/././././././././././././././././././././././././././.g.l.m.u - O w.~.H./ W d.W././././././././.", +"/././././././././././././././././.N./././././././././.<.M.K.k.` -.T.^.X.& & n T.!./././././././.", +"/././././././././././././././././.M././././././.C.z.&.<.N.s.b.!.!.!.~.C.L G s.!.T./././././././.", +"/././././././././././././././././.l./././.T.L.C.M.M.:.j.I k 3 7.~.~.~.^.^.^.~.T.T./././././././.", +"/././././././././././././././././.j.T.I.P.L.L.L.K.C.,.j.F 1 6 q.~.Z.T N p.^.!.R.T.!././././././.", +"/././.L.C.M.l././././././././.T.I.P.I.I.I.I.T.Y.C.n.k.<.V.,.g.W.^.U * # G ^.!.T.T.T././././././.", +"/./.C.L.L.C.M.C././././.F.C.L.P.I.T.W.T.T.!.u.M f } L.<.' b h D c.U.o.X.L.!.T.T.T.T.!./././././.", +"/.B.L.F.C.L.T.Y.L.P.L.C.N.C.L.I.W.F.H.!.!.~.y.v 9.Y.K.! ; 2 9 : t x.~.~.!.T.I.T.T.T.T./././././.", +"/.z.M.N.L.b.] e.W.W.W.I.L.L.I.I.8.6 P ^.~.!.T.C.V.L.j.z 3 k k j : ' V.P.L.L.I.T.T.T.T.!././././.", +"/.j.N.L.N.a # ^ ^.d.5.T.I.L.E.t.C G A.!.C.M.B.Y.T.M.*.4 k l l k 2 S V.z.N.L.L.T.T.T.T.T././././.", +"M.z.B.P.W.{ @ 3.D.k 7 S.W.L.V.r.{ .x.C.L.!.G.6.S.V.@.. 9 k k j < Z K.z.M.C.L.P.T.T.T.T.!./././.", +",.M.K.x.J Q | F.O.y w b.T.l._ 5 , , r X.K.!.B $ H V.v.X + 8 q 0 s 2.U.j.k.M.C.L.I.T.T.T.T./././.", +",.M.L.*.% = i.4.D C.Y.!.l.>.i 2 j j 3 p k.K.} V x.z.M.s.h 7 g R 0.P.L.<.<.z.N.L.L.T.T.T.T.!././.", +">.M.F.M.u 1.Q.m * B !.L.j.F , j l l k : Y C.W.W.T.z.&.C.P.a.f.H.W.L.C.,.:.k.M.C.L.P.T.T.T.T././.", +":.M.B.L.V.E.W.c d [ !.C.l.o @ k l l j > K K.C.C.B.M.$.&.l.C.U.J.B.B.C.:.&.<.z.M.C.L.I.T.T.T.!./.", +",.y.B.C.I.T.T.L.U.~.!.C.M.x 8 j j q 0 / U.M.M.M.M.:.&.<.k.z.M.N.B.C.$.#.:.j.z.N.L.L.T.T.T.T./.", +"<.+.z.C.L.P.I.T.T.T.T.L.V.t.e ; 7 g A ~ S.L.k.<.j.j.%.=.<.k.M.M.N.B.C.#.( &.>.k.M.C.L.P.T.T.T.!.", +";.) &.j.M.F.L.P.P.P.L.L.j.V.c.E Z ~ h.I.Y.C.,.j././.%.&.<.k.M.M.N.B././.) ) &.<.z.M.C.L.I.T.T.T.", +"/.+.%.;.,.j.z.M.N.N.N.C.z.%.M.Y.P.T.T.L.B.C./././././.<.<.k.M.M.C././././.#.#.:.y.z.N.L.L.T.T.T.", +"/...&.:.<.j.z.v.M.M.N.C.B.&.&.<.z.N.M.M.B.F././././././././././././././././.$.#.>.k.M.C.L.P.T.T.", +"/.) &.:.<.j.z.M.M.M.N.B.C.g.&.<.k.M.M.N.N.L./././././././././././././././././.=.%.<.z.M.C.L.I.!.", +"/.#.%.:.<.j.z.M.M.M.N.B.C.z.;.<.k.M.M.N.N.T././././././././././././././././././.<.&.<.z.N.C.P./.", +"/.&.%.:.<.j.z.M.M.M.N.B.C.M.&.,.k.M.M.M.L./././././././././././././././././././././.j.z.N.P././.", +"/.&.$.:.<.j.z.M.M.M.N.B.C.L./.j.k.M.C./././././././././././././././././././././././././././././.", +"/.=.%.:.<.j.z.M.M.M.N.B.B.T././././././././././././././././././././././././././././././././././.", +"/.<.$.:.<.j.z.M.M.M.N.B.C./././././././././././././././././././././././././././././././././././.", +"/.v.#.:.<.j.z.M.M.M.N.B.C./././././././././././././././././././././././././././././././././././.", +"/./.%.:.<.j.z.M.M.M.N.B.C./././././././././././././././././././././././././././././././././././.", +"/./.&.:.<.j.z.M.M.M.N.B.C./././././././././././././././././././././././././././././././././././.", +"/./.&.:.<.j.z.M.M.M.N.B.L./././././././././././././././././././././././././././././././././././.", +"/./.&.:.<.j.z.M.M.M.N.B.L./././././././././././././././././././././././././././././././././././.", +"/./.,.=.<.j.z.M.M.M.N.B././././././././././././././././././././././././././././././././././././.", +"/./.k.&.<.j.z.M.M.M.N.B././././././././././././././././././././././././././././././././././././.", +"/././.:.,.j.z.M.M.M.N.L././././././././././././././././././././././././././././././././././././.", +"/./././.,.j.z.M.M.M.B./././././././././././././././././././././././././././././././././././././.", +"/././././.k.z.M.M.C././././././././././././././././././././././././././././././././././././././.", +"/./././././.B.N././././././././././././././././././././././././././././././././././././././././.", +"/./././././././././././././././././././././././././././././././././././././././././././././././.", +"/./././././././././././././././././././././././././././././././././././././././././././././././." +}; diff --git a/Source/Core/DolphinWX/resources/toolbar_refresh.c b/Source/Core/DolphinWX/resources/toolbar_refresh.c new file mode 100644 index 0000000000..30ed5bedd6 --- /dev/null +++ b/Source/Core/DolphinWX/resources/toolbar_refresh.c @@ -0,0 +1,306 @@ +static const unsigned char toolbar_refresh_png[] = { +0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, +0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, +0x08, 0x06, 0x00, 0x00, 0x00, 0x57, 0x02, 0xf9, 0x87, 0x00, 0x00, 0x00, +0x04, 0x73, 0x42, 0x49, 0x54, 0x08, 0x08, 0x08, 0x08, 0x7c, 0x08, 0x64, +0x88, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, +0x12, 0x00, 0x00, 0x0b, 0x12, 0x01, 0xd2, 0xdd, 0x7e, 0xfc, 0x00, 0x00, +0x00, 0x25, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, +0x72, 0x65, 0x00, 0x4d, 0x61, 0x63, 0x72, 0x6f, 0x6d, 0x65, 0x64, 0x69, +0x61, 0x20, 0x46, 0x69, 0x72, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, +0x4d, 0x58, 0x20, 0x32, 0x30, 0x30, 0x34, 0x87, 0x76, 0xac, 0xcf, 0x00, +0x00, 0x00, 0x15, 0x74, 0x45, 0x58, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, +0x69, 0x6f, 0x6e, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x00, 0x39, 0x2f, 0x31, +0x30, 0x2f, 0x30, 0x34, 0xb6, 0xfa, 0x8a, 0x30, 0x00, 0x00, 0x0d, 0x8f, +0x49, 0x44, 0x41, 0x54, 0x78, 0x9c, 0xed, 0x9a, 0x7b, 0x70, 0x5c, 0xd5, +0x79, 0xc0, 0x7f, 0xe7, 0xdc, 0x7b, 0xf7, 0xee, 0x43, 0x4f, 0x5b, 0x46, +0xb2, 0x8d, 0xf1, 0x82, 0x4d, 0x31, 0x31, 0x83, 0xd7, 0x35, 0xa4, 0xc0, +0x34, 0xb5, 0x30, 0x34, 0x9d, 0x90, 0x92, 0x38, 0x0d, 0x9d, 0x96, 0x86, +0x26, 0xea, 0x3f, 0x5a, 0x13, 0xa7, 0x18, 0x93, 0xb4, 0x03, 0x34, 0xc4, +0x32, 0xd3, 0xa6, 0xd3, 0x32, 0xc5, 0xf6, 0xd0, 0x92, 0xec, 0x86, 0x06, +0x98, 0x4e, 0x4b, 0xa7, 0x21, 0x05, 0x3c, 0x93, 0xc4, 0x34, 0x0c, 0x96, +0x0b, 0xc5, 0x6d, 0x20, 0xb0, 0x56, 0x81, 0xd6, 0xef, 0x15, 0x46, 0x92, +0x1f, 0xb2, 0xb4, 0x5a, 0x69, 0x1f, 0x77, 0xef, 0xe3, 0xeb, 0x1f, 0x77, +0x57, 0x96, 0xfc, 0x80, 0x64, 0xac, 0x94, 0xe9, 0x4c, 0xbf, 0x9d, 0x33, +0x7b, 0x57, 0xf7, 0x9e, 0x7b, 0xbe, 0xdf, 0xf9, 0xbe, 0xf3, 0x9d, 0xef, +0x9c, 0x23, 0x25, 0x22, 0xfc, 0x5f, 0x16, 0xfd, 0x51, 0x2b, 0x70, 0xb1, +0x62, 0x7e, 0xd8, 0x03, 0x6a, 0x93, 0x4a, 0xa2, 0x59, 0x5f, 0x2f, 0x4b, +0xd1, 0x24, 0xd1, 0x80, 0x26, 0x8f, 0x62, 0x1f, 0x9a, 0x7e, 0x34, 0x4f, +0x49, 0x9f, 0x14, 0x7e, 0xf1, 0xea, 0x9e, 0x47, 0xbf, 0x0b, 0xb9, 0x90, +0xfa, 0x8a, 0x6a, 0x43, 0xd3, 0x87, 0x66, 0x53, 0x5d, 0xe1, 0x33, 0x45, +0x9d, 0xf5, 0x3b, 0x2c, 0x4f, 0xa3, 0xe9, 0x93, 0x3f, 0x91, 0xfc, 0xff, +0x8a, 0xe6, 0x0d, 0x3d, 0xcf, 0x07, 0xa0, 0x36, 0xaa, 0x36, 0x34, 0xbb, +0x51, 0xa4, 0xb0, 0x80, 0x76, 0x58, 0x71, 0xc5, 0x0a, 0x6e, 0x5c, 0x7e, +0x03, 0xf3, 0xa3, 0xed, 0x58, 0x86, 0xc1, 0xc9, 0xa9, 0x93, 0xbc, 0x79, +0xec, 0x0d, 0x0e, 0x0f, 0x1d, 0xa5, 0x58, 0xa8, 0x34, 0x20, 0x0a, 0x68, +0xb6, 0xca, 0x03, 0xb2, 0xfd, 0x03, 0x1b, 0xfd, 0xb6, 0xea, 0x01, 0x72, +0xb2, 0x41, 0x72, 0xbf, 0x28, 0x80, 0xb7, 0xd0, 0xa4, 0xb0, 0x61, 0xc5, +0x9a, 0xab, 0xd8, 0xf6, 0x9b, 0xdb, 0x59, 0xd2, 0xbc, 0x04, 0x8d, 0xc6, +0xc0, 0x40, 0xd7, 0x3f, 0x06, 0x06, 0xef, 0x4d, 0x1d, 0xe5, 0x07, 0xf9, +0xef, 0x93, 0xdd, 0xf3, 0x14, 0xe3, 0x85, 0xa9, 0x06, 0x48, 0x3f, 0x9a, +0xcf, 0xc9, 0x1f, 0xcd, 0x76, 0x2b, 0xf5, 0xd7, 0x2a, 0x89, 0xe6, 0x49, +0x14, 0xdd, 0x28, 0x7a, 0x64, 0x83, 0x3c, 0x3d, 0xe7, 0x00, 0x6a, 0x83, +0xda, 0x86, 0xe6, 0x5e, 0x2c, 0xf8, 0xcc, 0xed, 0x9f, 0xe1, 0xe1, 0x5b, +0x1f, 0xc6, 0xc0, 0xe0, 0xa5, 0xfc, 0x8b, 0x1c, 0x2c, 0xbc, 0xc3, 0xa4, +0x3f, 0x86, 0x6d, 0x46, 0xb0, 0x0c, 0x83, 0xcb, 0x9b, 0xaf, 0x64, 0xcd, +0xbc, 0x9b, 0xb8, 0xba, 0x79, 0x15, 0xc3, 0xe5, 0x41, 0x1e, 0xdd, 0xf7, +0xa7, 0x3c, 0xfb, 0xea, 0x8b, 0xd4, 0x7c, 0x0f, 0x34, 0x39, 0x34, 0x37, +0xcb, 0xd7, 0x42, 0x08, 0xb5, 0x43, 0xf5, 0xa1, 0xd8, 0x82, 0x22, 0x74, +0x41, 0xe8, 0x93, 0xaf, 0xc8, 0xd6, 0x39, 0x05, 0x50, 0x69, 0x95, 0x42, +0xf1, 0x16, 0x1a, 0xae, 0x5b, 0xbb, 0x86, 0xec, 0xef, 0x7c, 0x87, 0x81, +0x13, 0xfb, 0xd8, 0xf1, 0xd3, 0x47, 0xa8, 0xa9, 0x49, 0xda, 0xe2, 0x71, +0xe2, 0xb6, 0x4d, 0xd4, 0xb2, 0xb0, 0x4c, 0x13, 0x53, 0x6b, 0xb4, 0xd6, +0xcc, 0xb7, 0x16, 0x70, 0x5b, 0xe7, 0x9d, 0xdc, 0xd0, 0x7a, 0x2b, 0x4f, +0x1e, 0x79, 0x94, 0x87, 0x7f, 0xb0, 0x8d, 0x62, 0xa9, 0x1c, 0x42, 0x28, +0xb6, 0xa2, 0xd9, 0x82, 0x22, 0xd5, 0x1a, 0x6d, 0xe5, 0xf7, 0xaf, 0xff, +0x3c, 0xff, 0xf4, 0xee, 0xb3, 0x9c, 0x2c, 0x14, 0xb7, 0xcb, 0x26, 0xd9, +0x7c, 0xb1, 0x00, 0x67, 0x87, 0xd1, 0x6d, 0x08, 0x90, 0x80, 0xfb, 0x6e, +0xfd, 0x2a, 0xbb, 0x0e, 0xff, 0x90, 0x07, 0xfe, 0xf5, 0x3e, 0x5c, 0x35, +0xc9, 0xbc, 0xa6, 0x26, 0x9a, 0xa3, 0x51, 0x22, 0xe6, 0x99, 0xc0, 0x65, +0x1a, 0x06, 0xf1, 0x48, 0x84, 0x9a, 0x39, 0xc5, 0xce, 0xd3, 0xdf, 0xe1, +0x89, 0x91, 0x87, 0xb9, 0x2b, 0xb9, 0x91, 0x17, 0x7a, 0xfe, 0x91, 0xae, +0xf6, 0x56, 0x08, 0x48, 0x11, 0xf0, 0x1c, 0x3e, 0xa9, 0x55, 0xf3, 0x57, +0xb1, 0xf7, 0x8b, 0xaf, 0xf0, 0xb9, 0x6b, 0x7f, 0x9d, 0x98, 0x69, 0x83, +0x47, 0xea, 0x62, 0x95, 0x9f, 0x05, 0xa0, 0xd2, 0x2a, 0x09, 0x74, 0x03, +0xdc, 0x7e, 0xcb, 0xed, 0x94, 0xdc, 0x29, 0x76, 0xbc, 0xf1, 0x08, 0x2d, +0xb1, 0x18, 0x2d, 0xf1, 0x38, 0x11, 0xd3, 0xa4, 0x52, 0x73, 0xc9, 0x1f, +0x3c, 0xc9, 0xbf, 0xbf, 0x7c, 0x88, 0x57, 0x7e, 0xfc, 0x5f, 0x0c, 0xe4, +0xde, 0x63, 0xac, 0x50, 0x02, 0x11, 0x2c, 0xd3, 0xe4, 0x7d, 0xef, 0x00, +0xdb, 0x8e, 0xdf, 0xc3, 0x92, 0xe8, 0x15, 0x3c, 0x7b, 0xd7, 0x33, 0x2c, +0x9c, 0xd7, 0x0e, 0x3e, 0xa4, 0x3a, 0x52, 0xbc, 0x72, 0xd7, 0x1e, 0x96, +0x37, 0xad, 0xc0, 0xd0, 0x1a, 0xe5, 0x03, 0xde, 0x5c, 0xa8, 0x3f, 0xdb, +0x02, 0x9b, 0x00, 0x94, 0x0d, 0xbf, 0x77, 0xfd, 0x9d, 0x3c, 0xfa, 0x1f, +0x7f, 0x41, 0x53, 0x34, 0x4a, 0x73, 0x2c, 0x86, 0x65, 0x18, 0x4c, 0x95, +0x2b, 0x1c, 0x7c, 0x7d, 0x84, 0x43, 0xfb, 0x8e, 0x73, 0xfa, 0x54, 0x91, +0xd1, 0x53, 0x93, 0xfc, 0xf7, 0x3b, 0x43, 0xbc, 0xf4, 0xe2, 0x00, 0xaf, +0xff, 0xf4, 0x30, 0xa5, 0x8a, 0x03, 0x80, 0x23, 0x15, 0xbe, 0x7b, 0xfa, +0x61, 0x16, 0x45, 0x92, 0x3c, 0xb2, 0x7e, 0x2b, 0x1f, 0x5f, 0xb4, 0x86, +0xfe, 0x2f, 0xbd, 0xcc, 0xa4, 0x1a, 0x65, 0x77, 0xed, 0xef, 0x59, 0xa4, +0xae, 0xe4, 0xb2, 0xae, 0x05, 0xe0, 0x87, 0x9d, 0x35, 0x97, 0x00, 0xeb, +0x01, 0x16, 0x2e, 0x5b, 0xc4, 0xab, 0xc7, 0x5e, 0x61, 0xd2, 0x2b, 0xd0, +0x14, 0x8b, 0x11, 0x8f, 0x44, 0xa8, 0xb8, 0x2e, 0xef, 0xbd, 0x35, 0xca, +0xc9, 0xa1, 0x22, 0x4e, 0xd5, 0x23, 0xf0, 0x04, 0xf1, 0x04, 0xaf, 0xe6, +0x53, 0x9a, 0xac, 0xf2, 0xce, 0xc0, 0x31, 0x76, 0xbe, 0xf0, 0x3a, 0xc7, +0x86, 0x4f, 0x53, 0xf3, 0x3c, 0xa6, 0xdc, 0x49, 0xb2, 0xa3, 0x5b, 0xb8, +0xb1, 0xfd, 0x16, 0x76, 0x7d, 0x71, 0x17, 0xb9, 0x5a, 0x3f, 0xdf, 0x2e, +0xdc, 0xcf, 0x81, 0xf2, 0x00, 0xae, 0x78, 0x78, 0xae, 0x3f, 0xb7, 0x16, +0xa8, 0xbb, 0x4f, 0x12, 0xe0, 0xfa, 0xab, 0xd7, 0xf0, 0xf2, 0xe0, 0xbf, +0x90, 0xb0, 0x6d, 0x9a, 0x6c, 0x1b, 0xad, 0x14, 0x85, 0x91, 0x12, 0x85, +0xe3, 0x65, 0xbc, 0x9a, 0x0f, 0x01, 0xb3, 0x8a, 0xf8, 0xe0, 0x3a, 0x3e, +0xe3, 0x63, 0x25, 0x76, 0xfd, 0xf0, 0x2d, 0x06, 0xde, 0x1e, 0xa4, 0xe2, +0xba, 0x4c, 0xd4, 0x8a, 0x3c, 0x33, 0xba, 0x83, 0x17, 0x0a, 0x7f, 0xcb, +0x3f, 0x9f, 0x7e, 0x82, 0xc9, 0x72, 0x99, 0xc3, 0x53, 0xfb, 0xd1, 0xd8, +0x61, 0x10, 0xf2, 0x41, 0x7d, 0x43, 0x5d, 0xf4, 0x38, 0x68, 0x58, 0x60, +0x2d, 0x80, 0x52, 0xa0, 0x62, 0x9a, 0x49, 0x77, 0x9c, 0x44, 0x34, 0x4a, +0xdc, 0xb6, 0x11, 0xa0, 0x34, 0x5a, 0xc5, 0x75, 0x3c, 0xf0, 0x81, 0x80, +0x1c, 0x3e, 0xc9, 0xcc, 0xb6, 0x5e, 0x95, 0xf9, 0xab, 0x5e, 0x85, 0x4f, +0x1f, 0x3e, 0x85, 0xc0, 0x15, 0x9c, 0x8a, 0xcb, 0x4f, 0x5e, 0x3b, 0xc4, +0xde, 0xd7, 0xf6, 0xe3, 0xd4, 0x6a, 0xe4, 0x4b, 0x87, 0xf8, 0xb7, 0xf1, +0x1f, 0x53, 0xaa, 0x56, 0x99, 0x74, 0x1c, 0x8a, 0x95, 0x0a, 0x45, 0xb7, +0x40, 0xa2, 0xc9, 0x0e, 0x2d, 0xe0, 0xd3, 0x7a, 0xb1, 0x00, 0x8d, 0x90, +0x12, 0xf6, 0x44, 0xb3, 0x62, 0xb4, 0x7c, 0x82, 0x98, 0x6d, 0x93, 0xb0, +0x6d, 0x62, 0x91, 0x08, 0x8e, 0xeb, 0xe2, 0x4c, 0xb8, 0xf8, 0x6e, 0x3d, +0xdc, 0x0a, 0x7d, 0xf2, 0x2d, 0x19, 0x9c, 0x7e, 0xc3, 0x36, 0xb6, 0xa6, +0x37, 0x65, 0xb7, 0xa3, 0xc8, 0x21, 0x24, 0x03, 0x84, 0x53, 0xc3, 0x93, +0x14, 0x27, 0x2a, 0xb4, 0xb4, 0xc6, 0x08, 0x82, 0x00, 0x3f, 0x08, 0xf0, +0x7d, 0x9f, 0x40, 0x84, 0x11, 0x67, 0x88, 0x8a, 0x53, 0x6b, 0xb8, 0x50, +0x12, 0xd8, 0x73, 0x31, 0x00, 0x0d, 0x0b, 0xa4, 0x00, 0x94, 0x52, 0xe4, +0x27, 0x8e, 0x10, 0xb5, 0x2c, 0xe2, 0x91, 0x08, 0xb6, 0x65, 0x21, 0x80, +0x37, 0xe5, 0x23, 0x22, 0x20, 0x90, 0xf9, 0x56, 0xef, 0x0b, 0x8d, 0xca, +0x59, 0xd2, 0xe1, 0x85, 0xcf, 0x76, 0x15, 0x90, 0x34, 0x95, 0xc1, 0xc2, +0x85, 0xed, 0xfc, 0xda, 0x6f, 0xac, 0xa0, 0xbd, 0x3d, 0x81, 0x69, 0x18, +0x28, 0xa5, 0x10, 0x11, 0xdc, 0x20, 0xa0, 0xea, 0xba, 0x1c, 0x99, 0xda, +0xcf, 0x82, 0xa6, 0x4e, 0x54, 0x00, 0xf8, 0xa1, 0xdb, 0x5e, 0x8c, 0x34, +0x2c, 0xd0, 0x06, 0xa0, 0x9b, 0xe1, 0xd2, 0x96, 0xc5, 0x78, 0x56, 0x91, +0x68, 0x24, 0x42, 0xc4, 0x34, 0xd1, 0x4a, 0x11, 0x04, 0x17, 0x7e, 0x41, +0x7a, 0x43, 0xb6, 0x47, 0x69, 0x7a, 0x4c, 0xc3, 0x60, 0xc9, 0xf2, 0x0e, +0x56, 0x5e, 0x77, 0x29, 0x2d, 0x89, 0x38, 0xb6, 0x65, 0x11, 0x88, 0x84, +0xca, 0xd7, 0x21, 0x3c, 0xdf, 0xe7, 0x50, 0xf1, 0x00, 0xf3, 0x12, 0x0b, +0x42, 0x0b, 0x48, 0xd8, 0xee, 0x5c, 0x00, 0x4c, 0x5b, 0xa0, 0xea, 0x57, +0x88, 0xc7, 0x4c, 0x6c, 0xd3, 0xc4, 0x32, 0x8c, 0xfa, 0x6c, 0x7b, 0x01, +0xe5, 0xd3, 0xd9, 0x6e, 0xe0, 0x49, 0x02, 0x45, 0xeb, 0xe5, 0x09, 0xe6, +0x5d, 0x99, 0xc0, 0x27, 0xa0, 0xe4, 0x38, 0x78, 0x41, 0x50, 0x87, 0x0f, +0xc2, 0x22, 0x82, 0x17, 0x04, 0x1c, 0x2a, 0x1e, 0xa4, 0xc3, 0x5a, 0x0c, +0x9e, 0x02, 0x91, 0xf3, 0x0e, 0xe2, 0x69, 0xcb, 0xce, 0x90, 0x5e, 0x32, +0x1f, 0x08, 0x10, 0x8a, 0x52, 0x8c, 0x56, 0x4f, 0x71, 0x45, 0x6b, 0x27, +0x96, 0x61, 0x84, 0x00, 0xa6, 0x89, 0x19, 0x33, 0x50, 0x13, 0x61, 0x2f, +0x4e, 0x3f, 0x9a, 0x56, 0x29, 0xe0, 0xb9, 0xf0, 0x97, 0x30, 0x71, 0xa4, +0xc4, 0xa1, 0x09, 0x8f, 0x91, 0xe6, 0x02, 0x89, 0x76, 0x1b, 0x3b, 0x62, +0x11, 0x6f, 0x8b, 0x60, 0x18, 0x06, 0x66, 0xdc, 0x00, 0x25, 0xd4, 0x3c, +0x8f, 0x8a, 0xeb, 0x12, 0x4f, 0xcc, 0x27, 0x92, 0x30, 0x70, 0x26, 0xce, +0x8d, 0xa5, 0x59, 0xd2, 0xa4, 0x37, 0x66, 0xdb, 0x08, 0x58, 0x8f, 0x90, +0x44, 0x28, 0x00, 0xfd, 0x64, 0xc8, 0x9d, 0x0f, 0x44, 0x89, 0x08, 0x2a, +0xad, 0x04, 0x20, 0x72, 0x99, 0x49, 0xd7, 0xd5, 0x6d, 0x2c, 0xeb, 0xec, +0x64, 0x49, 0x47, 0x07, 0x09, 0xdb, 0x66, 0x78, 0x6c, 0x8c, 0xd7, 0x5f, +0x3e, 0xcc, 0xf1, 0xc3, 0x13, 0x04, 0xa1, 0x2f, 0xad, 0x06, 0xf2, 0xc0, +0x6e, 0x98, 0x9d, 0x0e, 0x28, 0xa5, 0x50, 0x4a, 0xa1, 0xf5, 0xec, 0x6f, +0x15, 0x26, 0x6f, 0xe8, 0xa8, 0x02, 0x53, 0xe1, 0x2b, 0x1f, 0xb7, 0xe8, +0xe1, 0x57, 0x05, 0xc9, 0x88, 0x9a, 0xa5, 0xfc, 0xa6, 0x6c, 0x8a, 0x80, +0xe7, 0x14, 0x24, 0x15, 0x0a, 0xf1, 0x01, 0x11, 0x24, 0xa0, 0x1f, 0xd8, +0x9a, 0xc9, 0xf4, 0xf6, 0xcf, 0x84, 0x98, 0x0d, 0xb0, 0xd8, 0xa4, 0xf3, +0x9a, 0x36, 0xae, 0xec, 0xea, 0x62, 0x69, 0x47, 0x07, 0x4d, 0xb1, 0x18, +0xa7, 0x8a, 0x45, 0xde, 0xd8, 0x7b, 0x98, 0xc1, 0xdc, 0x29, 0x5c, 0xd7, +0x07, 0xe8, 0x96, 0x8c, 0xec, 0x51, 0x69, 0xb5, 0x94, 0x30, 0x8a, 0xa4, +0x08, 0xc7, 0x50, 0x77, 0xfd, 0xfb, 0x82, 0xb1, 0x5d, 0xa9, 0x33, 0xd7, +0x0d, 0x63, 0xce, 0x04, 0x50, 0x5f, 0x55, 0x29, 0x02, 0x76, 0x2b, 0x54, +0x5b, 0x34, 0x66, 0x11, 0x9d, 0x1f, 0x41, 0x5c, 0xa1, 0x7a, 0xb2, 0x46, +0xcd, 0x09, 0x27, 0x50, 0x60, 0x87, 0x64, 0xe4, 0xde, 0x46, 0x9d, 0x86, +0x0b, 0xe5, 0x81, 0xa4, 0x94, 0x05, 0x09, 0x02, 0x04, 0x50, 0x5a, 0x63, +0x6a, 0x4d, 0xc2, 0xb6, 0x69, 0xee, 0x88, 0x61, 0x18, 0xc6, 0x34, 0x00, +0xb0, 0x47, 0x32, 0x32, 0x08, 0x0c, 0x72, 0x26, 0x0c, 0x4e, 0xa7, 0xc6, +0x33, 0xe0, 0x1a, 0x25, 0x05, 0xb4, 0x89, 0x9c, 0x9b, 0x3e, 0xa8, 0xb4, +0x4a, 0x49, 0x46, 0x72, 0x59, 0xd2, 0xa0, 0x79, 0x52, 0x69, 0xda, 0x6c, +0xcb, 0x62, 0xd1, 0xea, 0x79, 0x74, 0x5e, 0xd2, 0x8a, 0x88, 0x30, 0x3a, +0x56, 0xe4, 0xf8, 0x3b, 0x13, 0x94, 0x8e, 0x3b, 0x04, 0x5e, 0xb0, 0x49, +0xa5, 0x55, 0xab, 0x64, 0xe4, 0x0f, 0xce, 0x05, 0xa8, 0x0a, 0xbe, 0x08, +0x41, 0x10, 0x20, 0x22, 0x28, 0xa5, 0x88, 0x47, 0x22, 0xb4, 0xce, 0x8f, +0x11, 0x89, 0x18, 0x38, 0x0e, 0x88, 0x90, 0xca, 0x92, 0xbe, 0xe0, 0xa0, +0xaa, 0xf7, 0xea, 0xd9, 0x70, 0x33, 0x15, 0x6e, 0xad, 0x03, 0x35, 0xe0, +0xc6, 0x01, 0xd2, 0x0f, 0x64, 0xd7, 0x62, 0x90, 0x52, 0x28, 0x12, 0x0b, +0x6d, 0x96, 0x2c, 0x9c, 0xc7, 0x65, 0x0b, 0x16, 0x20, 0x22, 0xb4, 0xc4, +0xe3, 0x04, 0x26, 0x8c, 0xe8, 0x31, 0x2a, 0x43, 0x35, 0x24, 0xa0, 0x47, +0xa5, 0xd5, 0x66, 0xc9, 0x48, 0xa1, 0x01, 0x90, 0x03, 0xba, 0x03, 0x07, +0x6a, 0x8e, 0x47, 0xb5, 0x56, 0xa3, 0xe6, 0xba, 0xb8, 0x9e, 0x87, 0x00, +0xb6, 0x1d, 0x21, 0xd2, 0x6e, 0xc2, 0xa4, 0x02, 0xce, 0x1f, 0x39, 0x7e, +0x56, 0x91, 0x8c, 0x4c, 0xd4, 0xc1, 0x66, 0xc3, 0x69, 0xf2, 0x48, 0xe3, +0x52, 0x11, 0x8d, 0x44, 0x68, 0x8e, 0xc5, 0x50, 0x80, 0x1f, 0x04, 0x14, +0x9a, 0x9a, 0x28, 0x2c, 0x2d, 0x51, 0x3d, 0xee, 0x21, 0x12, 0x80, 0xf0, +0x59, 0xe0, 0xe9, 0x46, 0x80, 0xcc, 0x01, 0x88, 0x04, 0x54, 0x8e, 0x38, +0x9c, 0x9e, 0x9a, 0x62, 0xac, 0x54, 0x62, 0xa2, 0x52, 0x61, 0xaa, 0x5a, +0xa5, 0xe6, 0xba, 0x88, 0x35, 0xed, 0xc3, 0xc9, 0x74, 0x3a, 0x9b, 0xbc, +0x18, 0x88, 0xf3, 0x49, 0xe6, 0xcf, 0x7a, 0x07, 0xd1, 0xe4, 0x45, 0x09, +0x4e, 0xd1, 0xc3, 0xa9, 0xb9, 0x68, 0x20, 0x62, 0x9a, 0xd8, 0x96, 0x15, +0xce, 0x4b, 0xb6, 0x89, 0x8e, 0x42, 0x7d, 0x55, 0x97, 0x82, 0x33, 0x2e, +0xf4, 0x7c, 0x08, 0x00, 0xd5, 0x11, 0x8f, 0x93, 0xba, 0x88, 0x89, 0x66, +0xb2, 0x52, 0x41, 0x6b, 0xcd, 0xf1, 0x53, 0x05, 0x2a, 0x27, 0x6a, 0x33, +0xc3, 0xe8, 0x52, 0x20, 0xaf, 0xfe, 0x52, 0x25, 0xd1, 0xf4, 0xa0, 0xc8, +0xd7, 0x4b, 0x2e, 0xb3, 0xb9, 0xf7, 0x43, 0xb7, 0x57, 0xce, 0xe7, 0x7e, +0xbd, 0x64, 0x48, 0xab, 0x6c, 0x4e, 0x20, 0x59, 0xf3, 0x3c, 0x26, 0x0a, +0x15, 0x2a, 0x0b, 0xdd, 0xe9, 0xd9, 0x5c, 0x6b, 0x8d, 0xa1, 0x14, 0xca, +0x56, 0x50, 0x3e, 0x0b, 0x40, 0x32, 0x32, 0xa1, 0xd2, 0xea, 0x29, 0xa0, +0x27, 0x08, 0x02, 0xa6, 0x86, 0xaa, 0xbc, 0x37, 0x3e, 0xca, 0xa9, 0xce, +0x22, 0xca, 0xd6, 0x54, 0x86, 0x1d, 0xaa, 0xa5, 0x5a, 0x23, 0x72, 0xe4, +0x24, 0x23, 0xa1, 0xf9, 0x0d, 0x5a, 0x51, 0x6c, 0x69, 0x6c, 0xb5, 0x28, +0x05, 0xe9, 0xc7, 0xb2, 0x10, 0xba, 0x47, 0x01, 0x21, 0x87, 0x90, 0x47, +0xc8, 0x13, 0x90, 0xcf, 0xdc, 0xd7, 0x9b, 0x87, 0xd9, 0x13, 0xd5, 0x2c, +0x18, 0x4d, 0x8e, 0x80, 0xf5, 0x7e, 0xe0, 0x33, 0x59, 0xac, 0x50, 0x72, +0x1c, 0x62, 0x91, 0x48, 0x38, 0x1e, 0x09, 0x03, 0x8b, 0xb2, 0x55, 0xc3, +0x02, 0x49, 0x38, 0x77, 0x4d, 0xbc, 0x0d, 0xb8, 0x17, 0xc2, 0x98, 0x6e, +0x18, 0xe1, 0x93, 0xe1, 0x6c, 0x2a, 0x00, 0x05, 0xc2, 0x30, 0xba, 0x6f, +0xba, 0xce, 0x76, 0x25, 0x4a, 0x83, 0xb6, 0x34, 0x86, 0xa1, 0xc3, 0xb8, +0x5f, 0xbf, 0x27, 0x02, 0xe2, 0x0b, 0x12, 0x08, 0x81, 0x2f, 0xe1, 0xb5, +0x2f, 0x39, 0x09, 0x98, 0x40, 0xe8, 0x27, 0xa0, 0x40, 0x40, 0x8e, 0x80, +0xbc, 0x3c, 0x24, 0x79, 0xb5, 0x45, 0xad, 0x25, 0xa0, 0x5f, 0xa3, 0x59, +0xb8, 0xb8, 0x8d, 0xeb, 0x7e, 0x65, 0x19, 0x8b, 0xdb, 0xdb, 0x29, 0x39, +0x0e, 0xef, 0x8d, 0x8e, 0x72, 0xe8, 0xc4, 0x09, 0x4e, 0x1c, 0x2c, 0x50, +0x3b, 0xe6, 0x85, 0xa9, 0xfc, 0xe3, 0xa2, 0x66, 0xcd, 0xc4, 0x92, 0x91, +0xcd, 0x2a, 0xad, 0x9e, 0x07, 0xfa, 0x44, 0xa4, 0xdb, 0xf3, 0x66, 0xed, +0x58, 0xe4, 0x81, 0xf5, 0x33, 0x95, 0x0f, 0x09, 0xc0, 0x30, 0x35, 0xdd, +0x57, 0x7d, 0x82, 0xc3, 0x13, 0xef, 0x12, 0xb3, 0x6d, 0x22, 0xa6, 0x19, +0x8e, 0x47, 0x01, 0xd7, 0xf5, 0x71, 0x3d, 0x8f, 0xaa, 0xe3, 0x52, 0xad, +0xba, 0x54, 0x2a, 0x4e, 0xaa, 0x5a, 0xae, 0xe1, 0xbb, 0xc1, 0xda, 0x19, +0x6f, 0xcf, 0xa9, 0xad, 0xaa, 0x1b, 0x28, 0xa0, 0x40, 0x24, 0x4c, 0xcd, +0xab, 0xae, 0x8b, 0x1b, 0x04, 0x78, 0xf5, 0x54, 0x64, 0xd6, 0x0e, 0x4a, +0xbd, 0x97, 0xce, 0xd9, 0x5a, 0x94, 0x8c, 0xec, 0xc9, 0x92, 0xbe, 0x39, +0x9d, 0xce, 0xae, 0xe2, 0xcc, 0xe4, 0x94, 0x07, 0x9e, 0xaf, 0x47, 0x90, +0xb3, 0x2a, 0xd0, 0xef, 0xfb, 0xd2, 0x1d, 0x8f, 0x44, 0x68, 0x49, 0x24, +0x68, 0x8e, 0x46, 0x69, 0x8a, 0x46, 0xc3, 0x41, 0x67, 0x18, 0x98, 0x86, +0x41, 0x20, 0x82, 0xe3, 0xba, 0x14, 0xcb, 0x65, 0x4e, 0x4e, 0x4c, 0x30, +0x74, 0x62, 0x9c, 0xf1, 0x93, 0xa5, 0x90, 0x30, 0xb4, 0x6a, 0x8f, 0x6c, +0x91, 0x89, 0x2c, 0xe9, 0x7d, 0xe9, 0x87, 0xb2, 0x48, 0x20, 0x78, 0x8e, +0x8f, 0xe7, 0x79, 0x78, 0x9e, 0x87, 0xeb, 0xfb, 0x78, 0xf5, 0x74, 0x7c, +0x1a, 0x42, 0x2e, 0x00, 0x00, 0xa1, 0x5f, 0xf6, 0x66, 0x32, 0xfb, 0x80, +0x7d, 0xe7, 0xbb, 0x3f, 0x4b, 0x82, 0xf0, 0x6d, 0x51, 0xcb, 0x66, 0x55, +0xc7, 0x6a, 0x06, 0xcb, 0xfb, 0xd1, 0x4a, 0x61, 0x6a, 0x4d, 0xb4, 0x9e, +0x92, 0x6b, 0xa5, 0xc2, 0x75, 0x85, 0xeb, 0x32, 0x59, 0xa8, 0x32, 0x79, +0xba, 0x0a, 0x41, 0x98, 0x9e, 0x23, 0xac, 0x97, 0x87, 0x42, 0xab, 0xf6, +0x92, 0x21, 0x4d, 0x36, 0x7c, 0xad, 0x1f, 0x26, 0x7f, 0xae, 0xef, 0x53, +0x73, 0x5d, 0x6a, 0x75, 0x88, 0xce, 0x96, 0x2e, 0xde, 0x67, 0x68, 0xba, +0xf9, 0x8b, 0xdf, 0x9d, 0x0e, 0x57, 0x68, 0x38, 0x6e, 0x99, 0xe5, 0xad, +0x57, 0x61, 0x1a, 0x06, 0xa2, 0x14, 0x7e, 0x3d, 0x7d, 0xf6, 0x3c, 0x0f, +0xc7, 0x75, 0x99, 0x28, 0x95, 0x79, 0xf7, 0xc0, 0x10, 0x43, 0xc3, 0xe3, +0x78, 0x35, 0x0f, 0x09, 0x97, 0xa4, 0x3d, 0x99, 0xaf, 0xf7, 0x4e, 0xcf, +0x07, 0x59, 0xd2, 0x0d, 0x28, 0x54, 0x7d, 0xec, 0x39, 0x9e, 0x47, 0xb5, +0x0e, 0xef, 0xfa, 0x3e, 0x09, 0xbf, 0xa9, 0xf1, 0x4c, 0x6e, 0x6e, 0x00, +0x7c, 0x0a, 0xe2, 0xc3, 0x60, 0xf1, 0x08, 0x97, 0xc6, 0x17, 0x87, 0x6e, +0x03, 0x20, 0x82, 0xef, 0xfb, 0x38, 0x9e, 0xc7, 0x58, 0xb1, 0xc4, 0x9b, +0x6f, 0x1f, 0x65, 0x68, 0x64, 0x0c, 0xcf, 0x99, 0x56, 0xfe, 0xa9, 0xcc, +0xd7, 0x7b, 0x9f, 0x3e, 0x27, 0xa4, 0x06, 0xa0, 0x44, 0x61, 0x46, 0x42, +0xd5, 0x6a, 0xae, 0x4b, 0xd9, 0x71, 0xa8, 0xd6, 0x6a, 0xac, 0x9c, 0x7f, +0x0d, 0x07, 0x86, 0x0e, 0x34, 0x00, 0x0a, 0x73, 0x05, 0x90, 0xc7, 0x83, +0x98, 0x15, 0x61, 0x59, 0xf3, 0x55, 0xc4, 0x6c, 0x1b, 0xdb, 0xb6, 0xb1, +0x4c, 0x13, 0xad, 0xc3, 0xa8, 0x14, 0x8d, 0x84, 0xeb, 0x8b, 0xfa, 0x9a, +0x3a, 0xac, 0xe3, 0xb3, 0x19, 0xce, 0x84, 0xd4, 0x2c, 0x69, 0xd2, 0x0f, +0x66, 0x3f, 0x4b, 0x00, 0x5a, 0x29, 0x22, 0x71, 0x0b, 0xa5, 0x35, 0x95, +0x3a, 0x40, 0xb9, 0x56, 0xe3, 0xf2, 0xb6, 0xe5, 0x30, 0x25, 0x73, 0x6c, +0x01, 0x8f, 0x3c, 0x3e, 0x04, 0xae, 0xd0, 0x62, 0xb6, 0xd1, 0x1c, 0x8b, +0xd1, 0x5c, 0x5f, 0x53, 0x5f, 0xd3, 0xba, 0x9a, 0xae, 0xf8, 0x22, 0x9a, +0x62, 0x51, 0x6e, 0x5c, 0x73, 0x15, 0x2b, 0x97, 0x5f, 0x4a, 0x44, 0x9b, +0xa8, 0x40, 0x25, 0xf1, 0x39, 0x9a, 0x7e, 0x28, 0xdb, 0x37, 0xad, 0xfc, +0x03, 0xd9, 0x24, 0x01, 0x7d, 0x4a, 0xc0, 0x32, 0x4c, 0x5a, 0x3a, 0x62, +0x68, 0xa0, 0xec, 0x38, 0x4c, 0x39, 0x0e, 0x95, 0x5a, 0x8d, 0x84, 0x4a, +0xd4, 0xd3, 0x6b, 0xa0, 0x9e, 0x3d, 0x7c, 0xe8, 0x01, 0xc7, 0x87, 0x8a, +0x1f, 0x9a, 0xd2, 0xad, 0x7a, 0xf8, 0xd4, 0x58, 0xd2, 0xb4, 0x84, 0x62, +0x70, 0x9a, 0x75, 0x2d, 0x77, 0xb0, 0xae, 0xe5, 0x0e, 0x86, 0x6b, 0x47, +0x79, 0xe2, 0xc4, 0x56, 0x2a, 0x41, 0x89, 0x1b, 0xd6, 0xfc, 0x12, 0x8b, +0x3a, 0xdb, 0xd9, 0xbb, 0xf7, 0x00, 0x93, 0x93, 0x95, 0x36, 0x3f, 0x08, +0xb6, 0xa4, 0x1f, 0xc8, 0x6e, 0x69, 0xf8, 0x3d, 0x01, 0x68, 0xad, 0x69, +0x6b, 0x8f, 0x33, 0xaf, 0xb3, 0x89, 0x00, 0x28, 0x55, 0xab, 0x94, 0x1c, +0x87, 0xee, 0xcb, 0x6e, 0x65, 0xe8, 0xc4, 0x70, 0x3d, 0x68, 0x00, 0xd0, +0x0f, 0x73, 0x60, 0x01, 0xd9, 0x2a, 0xfb, 0xf0, 0xc1, 0x52, 0x06, 0x11, +0x6d, 0xf2, 0xb1, 0xa6, 0x14, 0x1b, 0x3a, 0xb7, 0x72, 0x53, 0xfc, 0xd3, +0x6c, 0xda, 0xf9, 0x87, 0x1c, 0x73, 0xf6, 0xd3, 0xd3, 0x79, 0x3f, 0x51, +0xcb, 0x22, 0x66, 0x59, 0x2c, 0x4f, 0x2e, 0xe4, 0xf6, 0xdb, 0xd6, 0xb0, +0x2c, 0xd9, 0x45, 0xcc, 0xb2, 0x31, 0xd1, 0xa8, 0x00, 0x54, 0x00, 0x96, +0x36, 0x68, 0x6f, 0x49, 0xb0, 0xe4, 0x63, 0x1d, 0xc4, 0x22, 0x11, 0xaa, +0xae, 0xcb, 0x64, 0xb5, 0x8a, 0x0e, 0x4c, 0xee, 0xb8, 0xfa, 0xb7, 0xe9, +0x7f, 0x6d, 0x77, 0xa3, 0xd9, 0x7c, 0x3d, 0xe3, 0x9d, 0x03, 0x0b, 0x00, +0x78, 0x30, 0x36, 0x3a, 0xc5, 0xb0, 0x77, 0x90, 0xf5, 0x2d, 0x77, 0x53, +0xf5, 0xca, 0x74, 0x3f, 0xbe, 0x8e, 0x81, 0x91, 0x01, 0x76, 0x1d, 0xd9, +0xc9, 0xf7, 0x7b, 0x9f, 0x61, 0xe3, 0x25, 0x8f, 0xf0, 0xdd, 0xd3, 0x7d, +0x94, 0xfd, 0x12, 0xf3, 0xda, 0x9a, 0x59, 0xb7, 0xee, 0x1a, 0x46, 0x46, +0xc6, 0x39, 0xb0, 0x7f, 0x84, 0xe1, 0xc1, 0x71, 0x10, 0xe8, 0x5c, 0xda, +0xca, 0xa2, 0xe5, 0xed, 0x44, 0x22, 0x26, 0x15, 0xd7, 0x0d, 0xf7, 0x93, +0xaa, 0x55, 0xee, 0xf9, 0xe5, 0xaf, 0xd1, 0xbf, 0xbf, 0x9f, 0xc9, 0xb1, +0xa9, 0x46, 0x8b, 0xcf, 0x37, 0x2e, 0xe6, 0x06, 0xc0, 0xa7, 0xdf, 0xa9, +0x78, 0xdd, 0x86, 0xd6, 0x54, 0xbc, 0x12, 0x37, 0x3f, 0x76, 0x0b, 0x03, +0x23, 0x03, 0x20, 0x30, 0x32, 0x34, 0xce, 0xe7, 0x1f, 0xff, 0x5d, 0xbe, +0x77, 0xf7, 0x3f, 0xd0, 0x33, 0xef, 0x21, 0x9e, 0x1d, 0x7b, 0x9c, 0xa1, +0xda, 0x51, 0x0c, 0xad, 0xe9, 0xea, 0x6a, 0xa3, 0x6d, 0x7e, 0x82, 0xea, +0xf5, 0x2e, 0x35, 0xcf, 0x9b, 0xde, 0x43, 0x2a, 0xd7, 0x6a, 0x94, 0x2a, +0x15, 0x8a, 0x95, 0x0a, 0x9b, 0xd7, 0xfc, 0x31, 0x37, 0x2d, 0xf9, 0x55, +0x6e, 0xfb, 0xbb, 0xdb, 0x66, 0xb6, 0x38, 0x7d, 0x02, 0x34, 0x37, 0xa7, +0x94, 0x5e, 0xb8, 0xc5, 0xb8, 0xf7, 0xe0, 0x4f, 0xe8, 0xde, 0xbe, 0x8e, +0x81, 0x63, 0x03, 0x8d, 0x9d, 0x37, 0xf0, 0x61, 0x64, 0xa8, 0xc0, 0x6f, +0x3d, 0x76, 0x27, 0x6f, 0x8e, 0xbf, 0xc6, 0xdd, 0x9d, 0x7f, 0xce, 0x27, +0x5b, 0xee, 0x42, 0x79, 0x16, 0x8e, 0xe7, 0x21, 0x22, 0x18, 0x5a, 0x63, +0x68, 0x4d, 0x20, 0x42, 0xd9, 0x71, 0x28, 0x96, 0xcb, 0xb8, 0x9e, 0xc1, +0x83, 0x1f, 0xdf, 0xca, 0xa7, 0x96, 0x7d, 0x9a, 0x2d, 0x3f, 0xfa, 0x06, +0x53, 0xc7, 0xa7, 0x7b, 0xbf, 0xbf, 0xe1, 0x3e, 0xf0, 0x01, 0x87, 0x7c, +0x3f, 0x8f, 0xa8, 0x7b, 0xce, 0x24, 0x81, 0x33, 0x24, 0x07, 0x6c, 0x21, +0x5c, 0x6a, 0xa6, 0x10, 0xb0, 0xa3, 0x26, 0x1b, 0xbf, 0xf0, 0x05, 0xee, +0x5e, 0x79, 0x3f, 0x6d, 0x56, 0x07, 0xaf, 0x8d, 0xbf, 0xc4, 0xfe, 0xc9, +0x7d, 0x9c, 0x70, 0x8e, 0xf3, 0xf6, 0xd8, 0x5b, 0x2c, 0xb0, 0x2e, 0x45, +0x89, 0xc5, 0x8d, 0x97, 0xdc, 0xcc, 0x75, 0x5d, 0x37, 0x12, 0xb7, 0xe2, +0x3c, 0xb8, 0xfb, 0x41, 0x76, 0x7e, 0x6f, 0x67, 0xd8, 0x19, 0xa1, 0xa4, +0x66, 0x25, 0x93, 0x73, 0x02, 0xf0, 0x65, 0xb5, 0x05, 0xe8, 0x0b, 0x7f, +0x00, 0xd0, 0x27, 0x7f, 0x13, 0x1e, 0x1f, 0xa9, 0x2f, 0xab, 0x56, 0xc2, +0x88, 0x91, 0x6a, 0xe4, 0x2f, 0x2b, 0xaf, 0xbd, 0x82, 0x8d, 0x9f, 0xda, +0xc0, 0x27, 0x16, 0x7e, 0x92, 0x76, 0xbb, 0x83, 0x80, 0x00, 0x1f, 0x7f, +0xd6, 0xf7, 0xfb, 0x53, 0xc7, 0xf8, 0xe6, 0xab, 0xdf, 0xe4, 0xe5, 0x5d, +0xbb, 0xa1, 0x32, 0xdd, 0xd4, 0x76, 0xc9, 0xcc, 0x3e, 0xd5, 0x99, 0x1b, +0x80, 0xb4, 0xfa, 0x12, 0xf0, 0x54, 0x5d, 0xd1, 0x9e, 0x99, 0x26, 0xae, +0xdf, 0x6f, 0x25, 0x1c, 0x78, 0xdd, 0x33, 0xff, 0xde, 0xb5, 0xac, 0x8d, +0xd5, 0x2b, 0xaf, 0x65, 0xed, 0x8a, 0x75, 0xb8, 0xbe, 0x47, 0x2d, 0xf0, +0x70, 0x7d, 0x8f, 0xff, 0x1c, 0x7e, 0x9b, 0x1f, 0xed, 0x7d, 0x91, 0xe0, +0xb8, 0xcc, 0xec, 0xf9, 0x9c, 0x64, 0x64, 0xf5, 0x39, 0x6d, 0xcf, 0x11, +0xc0, 0x2a, 0x42, 0xd3, 0x7e, 0xe0, 0xa9, 0xa3, 0x4a, 0xab, 0x4d, 0x84, +0x96, 0x3a, 0x67, 0x4b, 0x51, 0x9b, 0x0a, 0x1d, 0xd5, 0x78, 0x53, 0xfe, +0x39, 0xf5, 0xa8, 0xaf, 0xd9, 0xcf, 0x97, 0x0d, 0xcf, 0x09, 0xc0, 0xcf, +0x23, 0xf5, 0x2d, 0x97, 0x3e, 0xa0, 0xe7, 0x67, 0xac, 0xb2, 0x1d, 0xe8, +0x3b, 0x6f, 0x2a, 0xcf, 0x47, 0x00, 0x30, 0xdd, 0x70, 0xe8, 0x56, 0x3d, +0x84, 0x6e, 0xd5, 0xd8, 0x66, 0x81, 0x70, 0xed, 0x91, 0x27, 0x74, 0xb9, +0xe7, 0xcf, 0x76, 0xc7, 0x73, 0xde, 0xf3, 0xff, 0xff, 0xad, 0xf2, 0x11, +0xcb, 0xff, 0x00, 0x23, 0xdd, 0xb3, 0x7f, 0xe6, 0x37, 0xca, 0x79, 0x00, +0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, +}; diff --git a/Source/Core/DolphinWX/resources/toolbar_refresh.xpm b/Source/Core/DolphinWX/resources/toolbar_refresh.xpm new file mode 100644 index 0000000000..0a9d19e351 --- /dev/null +++ b/Source/Core/DolphinWX/resources/toolbar_refresh.xpm @@ -0,0 +1,192 @@ +/* XPM */ +static char *toolbar_refresh_xpm[] = { +/* columns rows colors chars-per-pixel */ +"48 48 138 2", +" c #990A02", +". c #97160F", +"X c #9D160F", +"o c #9D1710", +"O c #9A1912", +"+ c #9C1F18", +"@ c #B00D05", +"# c #A5170F", +"$ c #AC160F", +"% c #B3160E", +"& c #A31710", +"* c #A81710", +"= c #A31C15", +"- c #AB1A13", +"; c #A21F18", +": c #B41B14", +"> c #BA1A12", +", c #B51F18", +"< c #9D231C", +"1 c #A3231C", +"2 c #AB231C", +"3 c #B3231C", +"4 c #BD231B", +"5 c #9E2720", +"6 c #9F2C25", +"7 c #A32822", +"8 c #AE2C25", +"9 c #A12F28", +"0 c #B02620", +"q c #B82720", +"w c #A1312A", +"e c #A53934", +"r c #AF3832", +"t c #B13832", +"y c #B93B35", +"u c #CE170E", +"i c #D5160F", +"p c #C31E16", +"a c #CA1C14", +"s c #D21D14", +"d c #C4231B", +"f c #CB231B", +"g c #D2231B", +"h c #C42820", +"j c #D42C24", +"k c #C2312A", +"l c #CC322B", +"z c #C63932", +"x c #CC3830", +"c c #AD423C", +"v c #B3433D", +"b c #BA433D", +"n c #CC463F", +"m c #DA4039", +"M c #AB4A44", +"N c #AD4E49", +"B c #B44640", +"V c #B24A44", +"C c #B74F4A", +"Z c #B75752", +"A c #B6625D", +"S c #B9645F", +"D c #BC716C", +"F c #BE7672", +"G c #C4504B", +"H c #C8524B", +"J c #D5534D", +"K c #C35651", +"L c #C36C67", +"P c #CB6B66", +"I c #CF6D68", +"U c #D86862", +"Y c #C4706B", +"T c #C9716C", +"R c #E27D78", +"E c #CD837F", +"W c #C28481", +"Q c #CF8F8C", +"! c #D58884", +"~ c #C6918D", +"^ c #C8918D", +"/ c #D5908C", +"( c #CD9B99", +") c #DD9D9A", +"_ c #E18D89", +"` c #E59490", +"' c #E59B97", +"] c #E59F9B", +"[ c #D5A29F", +"{ c #DDA19E", +"} c #E6A09C", +"| c #DDA5A2", +" . c #D4B1AE", +".. c #D5BAB7", +"X. c #DCB8B6", +"o. c #D9BDBB", +"O. c #E0A7A4", +"+. c #E2C1BF", +"@. c #E9C2BF", +"#. c #CDCCCC", +"$. c #DCC7C5", +"%. c #DBC8C7", +"&. c #D0CFCF", +"*. c #DBC9C8", +"=. c #D4D3D3", +"-. c #D8D7D7", +";. c #D7D8D6", +":. c #D8D8D7", +">. c #DCDCDB", +",. c #E4C3C2", +"<. c #EBC6C4", +"1. c #EAC8C7", +"2. c #E0CAC8", +"3. c #EBCFCE", +"4. c #ECD0CE", +"5. c #E6D7D6", +"6. c #EFD5D4", +"7. c #E1D8D7", +"8. c #E1DBDA", +"9. c #EFDCDB", +"0. c #E0E0DF", +"q. c #E3E3E2", +"w. c #EBE6E6", +"e. c #E5E8E7", +"r. c #E8E7E8", +"t. c #E7EBEA", +"y. c #ECECEC", +"u. c #F1E5E4", +"i. c #F2ECEC", +"p. c #F0F0EF", +"a. c #EAF1F1", +"s. c #F3F3F3", +"d. c #F8F7F7", +"f. c #F8F8F7", +"g. c #F3F7F8", +"h. c #F6FCFC", +"j. c #FAFCFC", +"k. c None", +/* pixels */ +"k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.:.;.#.#.#.#.#.#.#.#.;.:.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.", +"k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.:.#.#.=.-.>.q.q.e.e.q.q.>.:.=.#.#.:.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.", +"k.k.k.k.k.k.k.k.k.k.k.k.k.=.#.=.>.e.r.y.y.y.y.r.r.y.y.y.y.r.r.>.=.#.=.k.k.k.k.k.k.k.k.k.k.k.k.k.", +"k.k.k.k.k.k.k.k.k.k.k.:.#.;.q.r.y.r.r.y.y.y.y.y.y.y.y.y.y.r.r.y.r.q.-.#.-.k.k.k.k.k.k.k.k.k.k.k.", +"k.k.k.k.k.k.k.k.k.k.#.=.q.y.r.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.r.r.r.y.q.=.#.k.k.k.k.k.k.k.k.k.k.", +"k.k.k.k.k.k.k.k.>.#.:.r.y.r.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.r.r.r.>.#.>.k.k.k.k.k.k.k.k.", +"k.k.k.k.k.k.k.:.#.q.y.r.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.r.y.q.#.-.k.k.k.k.k.k.k.", +"k.k.k.k.k.k.:.#.q.y.r.y.y.y.y.y.y.y.y.y.y.p.p.p.p.p.p.y.y.y.y.y.y.y.y.y.y.r.y.q.#.-.k.k.k.k.k.k.", +"k.k.k.k.k.>.#.q.y.r.y.y.y.y.y.y.y.y.p.s.s.s.s.s.s.s.s.s.p.y.y.y.y.y.y.y.y.y.r.r.q.#.>.k.k.k.k.k.", +"k.k.k.k.k.#.8.y.r.y.y.y.y.y.y.y.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.p.y.y.y.y.y.y.y.r.y.q.#.k.k.k.k.k.", +"k.k.k.k.#.:.y.r.y.y.y.y.y.y.y.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.p.y.y.y.y.y.y.t.y.>.#.k.k.k.k.", +"k.k.k.>.&.r.r.y.y.y.y.y.y.s.s.s.s.s.s.s.s.s.s.s.s.g.h.h.h.h.h.h.h.h.h.s.y.y.y.y.y.r.r.=.:.k.k.k.", +"k.k.k.#.q.y.y.y.y.y.y.y.s.s.s.s.s.s.s.s.s.s.s.s.h.,.P T T T Y Y Y D S ( s.y.y.y.y.y.r.q.#.k.k.k.", +"k.k.;.=.y.r.y.y.y.y.y.s.s.s.s.g.s.s.s.s.d.s.d.d.j.{ @ $ $ $ # # # c 5.s.y.y.y.y.y.r.y.-.=.k.k.", +"k.k.#.q.y.y.y.y.y.y.p.s.s.s.g.9.g.g.d.d.d.d.d.d.j.| : 3 3 2 2 2 ; Z w.g.s.y.y.y.y.y.y.r.q.#.k.k.", +"k.>.=.r.y.y.y.y.y.p.s.s.s.h.<.j ` h.d.d.d.d.d.d.j.O.: 3 3 2 2 2 ; X.h.s.s.s.p.y.y.y.y.r.y.=.>.k.", +"k.#.>.y.y.y.y.y.y.s.s.s.g.u.m i s ' j.f.d.f.f.f.j.O.: 3 3 2 2 2 = c 8.t.e.r.y.y.y.y.y.r.y.8.#.k.", +"k.#.e.y.y.y.y.y.y.s.s.s.h.R i g g s } j.f.f.f.d.h.| : 3 3 2 2 2 1 X F t.q.q.>.>.q.r.y.y.r.r.#.k.", +">.=.r.y.y.y.y.y.p.s.s.g.6.j g g g g a ] j.d.s.s.h.| : 3 , 2 2 2 1 1 7 *.e.q.q.>.>.>.>.e.y.y.=.>.", +"-.-.y.y.y.y.y.y.s.s.s.h._ u g g g f a ' h.s.s.s.j.| : : y 3 2 2 1 1 X W a.q.q.>.>.>.:.;.>.r.>.;.", +"#.>.y.y.y.y.y.p.s.s.s.g.J a f f f a U h.s.d.d.d.j.| @ K u.L * 2 1 1 O N e.q.q.0.>.>.>.:.=.=.:.#.", +"#.q.y.y.y.y.y.p.s.s.g.u.l f f f f f @.h.d.d.f.f.j.) G i.j.+.2 1 1 1 + w 8.e.q.0.>.>.>.:.=.=.#.#.", +"#.q.y.y.y.y.y.p.s.s.g.4.h f f f a x i.g.d.f.j.j.j.6.u.j.g.y.t ; 1 1 + 9 7.e.q.q.>.>.>.:.=.=.#.#.", +"#.e.y.y.y.y.y.p.s.s.h.1.d d d d p n i.f.d.f.j.j.j.j.j.d.d.i.B = 1 1 + w 7.e.q.q.>.>.>.:.=.=.&.#.", +"#.q.y.y.y.y.y.p.s.s.g.3.h d d d p z i.f.d.f.j.j.j.j.f.d.f.y.r ; 1 < + 9 7.e.q.q.>.>.>.:.=.=.&.#.", +"#.q.y.y.y.y.y.p.s.s.g.u.k 4 4 4 4 4 <.h.d.f.j.j.j.j.f.d.j.,.1 1 1 < + w 8.e.q.q.>.>.>.:.=.=.#.#.", +"#.q.y.y.y.y.y.p.s.s.s.s.H > 4 4 4 > I j.d.d.f.f.f.f.d.d.j.L & 1 1 < O N e.e.q.q.>.>.>.:.=.=.#.#.", +"&.>.y.y.y.y.y.p.s.s.s.h.! % 4 4 4 4 , | j.f.d.d.d.d.f.j.[ = 1 1 < < . W a.q.q.0.>.>.>.:.=.=.#.#.", +"-.-.y.y.y.y.y.p.s.s.s.g.2.q 3 3 3 3 , 3 / s.j.j.j.j.s.Q 1 ; 1 < < < 5 %.t.q.q.0.>.>.>.;.=.=.#.-.", +">.=.r.y.y.y.y.y.s.s.s.y.y.T % 3 3 3 3 3 - b E | | E v & 1 1 < < < . D y.q.q.q.>.>.>.>.;.=.&.#.>.", +"k.#.e.y.y.y.y.y.p.s.s.q.t.7.y - 3 3 3 2 2 - * # # & = 1 1 1 < < O e 7.t.q.q.q.>.>.>.:.=.=.&.#.k.", +"k.&.>.y.y.y.y.y.y.s.y.q.q.a.X.0 - 2 2 2 2 2 2 2 1 1 1 1 1 < < O 5 ..a.q.q.q.0.>.>.>.:.=.=.#.&.k.", +"k.>.=.y.y.y.y.y.y.s.r.q.q.q.a. .8 * 2 2 2 2 1 1 1 1 1 < < < O 6 .a.q.q.q.0.>.>.>.>.;.=.=.#.>.k.", +"k.k.#.q.y.y.y.y.y.y.q.q.q.q.q.a.$.C & = 1 1 1 1 1 1 < < O O N $.a.q.q.q.q.>.>.>.>.:.=.=.#.#.k.k.", +"k.k.;.;.y.y.y.y.y.y.>.0.q.q.q.q.y.r.( V 1 o o o O O O < M ( r.y.q.q.q.q.>.>.>.>.:.;.=.=.#.;.k.k.", +"k.k.k.#.q.y.y.y.y.r.>.>.q.q.q.q.q.e.a.r.o.^ D A A D ~ o.r.a.e.q.q.q.q.>.>.>.>.>.;.=.=.#.#.k.k.k.", +"k.k.k.>.=.r.y.y.y.e.>.>.>.0.q.q.q.q.q.e.y.a.a.y.y.a.a.y.e.q.q.q.q.q.>.>.>.>.>.:.=.=.&.#.>.k.k.k.", +"k.k.k.k.#.>.y.y.y.q.>.>.>.>.>.q.q.q.q.q.q.q.q.e.e.q.q.q.q.q.q.q.0.>.>.>.>.>.:.;.=.=.#.#.k.k.k.k.", +"k.k.k.k.k.#.q.y.y.0.:.>.>.>.>.>.q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.>.>.>.>.>.>.:.;.=.=.#.#.k.k.k.k.k.", +"k.k.k.k.k.>.#.q.y.>.;.:.>.>.>.>.>.>.0.q.q.q.q.q.q.q.q.q.0.>.>.>.>.>.>.>.:.;.=.=.#.#.>.k.k.k.k.k.", +"k.k.k.k.k.k.:.#.q.>.=.;.:.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.:.=.=.=.#.#.:.k.k.k.k.k.k.", +"k.k.k.k.k.k.k.:.#.-.=.=.=.;.:.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.:.;.=.=.=.#.#.:.k.k.k.k.k.k.k.", +"k.k.k.k.k.k.k.k.>.#.#.=.=.=.=.;.:.>.>.>.>.>.>.>.>.>.>.>.>.>.>.:.;.=.=.=.=.#.#.>.k.k.k.k.k.k.k.k.", +"k.k.k.k.k.k.k.k.k.k.#.#.&.=.=.=.=.;.:.:.:.>.>.>.>.>.>.:.:.;.;.=.=.=.=.&.#.#.k.k.k.k.k.k.k.k.k.k.", +"k.k.k.k.k.k.k.k.k.k.k.>.#.#.&.=.=.=.=.=.=.;.;.;.;.;.;.=.=.=.=.=.=.&.#.#.>.k.k.k.k.k.k.k.k.k.k.k.", +"k.k.k.k.k.k.k.k.k.k.k.k.k.=.#.#.#.=.=.=.=.=.=.=.=.=.=.=.=.=.&.#.#.#.=.k.k.k.k.k.k.k.k.k.k.k.k.k.", +"k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.>.=.#.#.#.#.=.=.=.=.=.=.#.#.#.#.=.>.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.", +"k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.>.:.=.#.#.#.#.#.#.=.:.>.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k." +}; diff --git a/Source/Core/DolphinWX/resources/toolbar_stop.c b/Source/Core/DolphinWX/resources/toolbar_stop.c new file mode 100644 index 0000000000..47dfd9f577 --- /dev/null +++ b/Source/Core/DolphinWX/resources/toolbar_stop.c @@ -0,0 +1,260 @@ +static const unsigned char toolbar_stop_png[] = { +0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, +0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, +0x08, 0x06, 0x00, 0x00, 0x00, 0x57, 0x02, 0xf9, 0x87, 0x00, 0x00, 0x00, +0x04, 0x73, 0x42, 0x49, 0x54, 0x08, 0x08, 0x08, 0x08, 0x7c, 0x08, 0x64, +0x88, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, +0x12, 0x00, 0x00, 0x0b, 0x12, 0x01, 0xd2, 0xdd, 0x7e, 0xfc, 0x00, 0x00, +0x00, 0x25, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, +0x72, 0x65, 0x00, 0x4d, 0x61, 0x63, 0x72, 0x6f, 0x6d, 0x65, 0x64, 0x69, +0x61, 0x20, 0x46, 0x69, 0x72, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, +0x4d, 0x58, 0x20, 0x32, 0x30, 0x30, 0x34, 0x87, 0x76, 0xac, 0xcf, 0x00, +0x00, 0x00, 0x14, 0x74, 0x45, 0x58, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, +0x69, 0x6f, 0x6e, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x00, 0x39, 0x2f, 0x34, +0x2f, 0x30, 0x34, 0x79, 0x5e, 0xa3, 0xd5, 0x00, 0x00, 0x0b, 0x61, 0x49, +0x44, 0x41, 0x54, 0x78, 0x9c, 0xd5, 0x9a, 0x49, 0x8c, 0x5d, 0xc7, 0x75, +0x86, 0xbf, 0xaa, 0xba, 0xc3, 0x1b, 0x38, 0x3c, 0x36, 0x9b, 0xa4, 0x2d, +0x83, 0x14, 0x69, 0x45, 0x32, 0x18, 0xd0, 0x26, 0xb3, 0xc8, 0xc2, 0x8b, +0x50, 0xf4, 0x26, 0x4a, 0x80, 0x00, 0xd4, 0x22, 0x80, 0x80, 0x08, 0x82, +0xdb, 0x8b, 0x44, 0x1e, 0x00, 0x33, 0x59, 0x64, 0x45, 0x04, 0xa6, 0x21, +0x38, 0x32, 0x04, 0x28, 0x22, 0x99, 0x00, 0x81, 0x93, 0x05, 0x05, 0x04, +0xbd, 0x0d, 0xe8, 0x0c, 0x48, 0x82, 0x38, 0x01, 0x2d, 0x7b, 0x23, 0x07, +0x71, 0x68, 0x5b, 0x59, 0x49, 0xb6, 0x9a, 0x54, 0x8b, 0xa4, 0xba, 0x5f, +0x8f, 0xaf, 0xdf, 0xeb, 0x77, 0x87, 0x3a, 0x27, 0x8b, 0xba, 0x6f, 0xe8, +0x66, 0x37, 0xd9, 0x4d, 0x09, 0x11, 0x54, 0x40, 0xe1, 0xde, 0x37, 0xd5, +0xfd, 0xff, 0x73, 0xfe, 0x33, 0x54, 0x75, 0x1b, 0x55, 0xe5, 0x93, 0x3c, +0xec, 0xc7, 0x0d, 0xe0, 0xc3, 0x8e, 0xe8, 0xe3, 0x7c, 0xf8, 0x8b, 0x2f, +0xfe, 0x8d, 0x19, 0xdc, 0x7f, 0xef, 0x7b, 0x7f, 0xf4, 0x48, 0x52, 0x30, +0x1f, 0x95, 0x84, 0xbe, 0xfb, 0xdd, 0x7f, 0x3d, 0xae, 0xaa, 0xe7, 0x54, +0xe5, 0x9c, 0x88, 0x1c, 0x17, 0xd1, 0xd3, 0xaa, 0xd2, 0x12, 0x11, 0x44, +0x04, 0x55, 0x99, 0x11, 0x91, 0x5b, 0x22, 0x72, 0x43, 0x44, 0x7e, 0xb6, +0xb2, 0xd2, 0xfb, 0xfe, 0x16, 0xcb, 0x28, 0xec, 0x8e, 0xcc, 0x87, 0x22, +0xf0, 0xea, 0xab, 0xff, 0xd9, 0x52, 0x95, 0x67, 0x55, 0xf5, 0x82, 0xaa, +0x9e, 0x09, 0x40, 0x95, 0x31, 0xd0, 0xc3, 0xfb, 0x8d, 0xaf, 0x3d, 0x22, +0xb2, 0x2c, 0x22, 0xff, 0xe0, 0xbd, 0xfc, 0xdd, 0xfa, 0x7a, 0xf9, 0xc3, +0x0a, 0xfc, 0x60, 0x02, 0xe8, 0x4e, 0x88, 0x3c, 0x32, 0x81, 0xd7, 0x5e, +0xbb, 0x71, 0x09, 0xf4, 0x82, 0x88, 0xb6, 0x54, 0x95, 0x5a, 0x2d, 0xa5, +0xd9, 0x6c, 0xb2, 0x77, 0xef, 0x5e, 0x8c, 0x31, 0x24, 0x49, 0x3a, 0x04, +0x5b, 0x14, 0x05, 0xbd, 0xde, 0x1a, 0x6b, 0x6b, 0x3d, 0x3a, 0x9d, 0x15, +0x3a, 0x9d, 0x0e, 0x65, 0x59, 0x8c, 0x93, 0x7b, 0xc3, 0x7b, 0xff, 0xa7, +0x79, 0xce, 0xcd, 0x8a, 0x80, 0x0c, 0xc8, 0x3c, 0x8c, 0xc4, 0xae, 0x63, +0xe0, 0xca, 0x95, 0x37, 0xce, 0x19, 0x63, 0xae, 0x59, 0x6b, 0x8f, 0x5b, +0x6b, 0x99, 0x98, 0x98, 0xe0, 0xf1, 0xc7, 0x3f, 0xc5, 0xc1, 0x83, 0x75, +0x1a, 0x8d, 0x88, 0x28, 0xb2, 0x44, 0x91, 0xc3, 0x7b, 0x10, 0x81, 0x6e, +0x37, 0x67, 0x6d, 0x2d, 0x63, 0x65, 0xa5, 0xc7, 0xc2, 0xc2, 0x2a, 0x13, +0x13, 0x07, 0xc8, 0xf3, 0x9c, 0x95, 0x95, 0x25, 0xee, 0xde, 0xbd, 0x47, +0x96, 0x65, 0x00, 0x67, 0x8d, 0x31, 0x6f, 0xc6, 0xb1, 0xff, 0xf3, 0xa2, +0xb0, 0x2f, 0x01, 0xa6, 0x22, 0x31, 0x20, 0xb2, 0xed, 0xd8, 0x95, 0x07, +0xae, 0x5e, 0xfd, 0xf1, 0x25, 0x63, 0xcc, 0xb7, 0x00, 0x0e, 0x1f, 0x3e, +0xc4, 0xa9, 0x53, 0x47, 0x39, 0x7c, 0x38, 0x25, 0x4d, 0x2d, 0x22, 0x0c, +0x41, 0x3f, 0xe8, 0x7e, 0x6e, 0x6e, 0x99, 0xd9, 0xd9, 0x7b, 0xf4, 0x7a, +0xeb, 0x88, 0x94, 0xcc, 0xcf, 0xcf, 0x33, 0x37, 0x37, 0x37, 0xf4, 0x88, +0xaa, 0xfc, 0xc8, 0x7b, 0x7d, 0x4e, 0x35, 0x5a, 0x00, 0x3c, 0x20, 0x0f, +0xf2, 0xc2, 0x8e, 0x3d, 0x70, 0xf5, 0xea, 0x8f, 0xae, 0x59, 0x6b, 0xa7, +0xd2, 0x34, 0xe5, 0x0b, 0x5f, 0xf8, 0x1c, 0x4f, 0x3d, 0xb5, 0x87, 0x5a, +0xcd, 0x0c, 0xc1, 0xad, 0xaf, 0x7b, 0x16, 0x17, 0x73, 0x56, 0x57, 0x0b, +0xfa, 0xfd, 0x30, 0xbd, 0xf7, 0x88, 0x78, 0x92, 0xc4, 0x91, 0xa6, 0x31, +0xf5, 0x7a, 0x4a, 0xab, 0xb5, 0x97, 0x03, 0x07, 0x5a, 0xdc, 0xbd, 0x3b, +0xc7, 0xbb, 0xef, 0xde, 0xe2, 0xc0, 0x81, 0x09, 0xea, 0xf5, 0x3a, 0xb3, +0xb3, 0xef, 0xb1, 0xbe, 0xbe, 0x0e, 0xf0, 0x5b, 0xc6, 0xe8, 0xbf, 0xa9, +0x96, 0xcf, 0x40, 0xb4, 0xc0, 0xc6, 0xb8, 0xb8, 0x6f, 0xec, 0xc8, 0x03, +0x57, 0xae, 0xbc, 0x71, 0xcd, 0x5a, 0x3b, 0xd5, 0x6c, 0x36, 0x39, 0x7b, +0xf6, 0x14, 0xc7, 0x8e, 0xc5, 0x43, 0x8b, 0x2e, 0x2c, 0x78, 0xee, 0xdd, +0xcb, 0xe9, 0xf5, 0x4a, 0x44, 0x3c, 0xde, 0x4b, 0x75, 0xf5, 0x63, 0x57, +0xc1, 0x7b, 0x8f, 0xf7, 0x25, 0x65, 0x29, 0xb4, 0x5a, 0x7b, 0x38, 0x72, +0xe4, 0x08, 0x79, 0x5e, 0xf2, 0xd6, 0x5b, 0xff, 0x4b, 0x51, 0x64, 0x78, +0xef, 0xb9, 0x7b, 0xf7, 0x0e, 0x2b, 0x2b, 0xcb, 0x83, 0xb8, 0xf8, 0x85, +0xaa, 0xf9, 0x6d, 0x63, 0x92, 0x36, 0xe0, 0xb7, 0xf3, 0xc2, 0x43, 0x0b, +0xd9, 0x6b, 0xaf, 0xdd, 0xb8, 0x06, 0x4c, 0xed, 0xdf, 0xdf, 0xe2, 0x99, +0x67, 0x3e, 0xcf, 0xd1, 0xa3, 0x71, 0x65, 0x71, 0x78, 0xfb, 0xed, 0x92, +0xd9, 0xd9, 0x92, 0x2c, 0x53, 0x8c, 0x31, 0x80, 0xc1, 0x54, 0x99, 0x3d, +0x5c, 0x4d, 0x35, 0x87, 0xf6, 0x02, 0x60, 0x61, 0x61, 0x89, 0x9f, 0xff, +0xfc, 0x2d, 0x96, 0x96, 0x96, 0x38, 0x79, 0xf2, 0xd7, 0xb1, 0xd6, 0x21, +0xa2, 0x1c, 0x3e, 0x7c, 0x84, 0x5a, 0xad, 0x31, 0xf8, 0xdd, 0xe7, 0x55, +0xfd, 0xdf, 0x02, 0x6e, 0xd3, 0x22, 0x3b, 0x27, 0xf0, 0xea, 0xab, 0xff, +0x71, 0x41, 0x55, 0xa7, 0x6a, 0xb5, 0x1a, 0x5f, 0xfa, 0xd2, 0xe7, 0x98, +0x98, 0x88, 0x10, 0x81, 0x76, 0x5b, 0xf9, 0xe5, 0x2f, 0x95, 0x7e, 0xff, +0x61, 0xf4, 0x19, 0x12, 0x0a, 0xf7, 0xa3, 0x17, 0xaa, 0xf0, 0xfe, 0xfb, +0xb3, 0xbc, 0xf3, 0xce, 0x3b, 0x3c, 0xf1, 0xc4, 0x53, 0xc3, 0xf4, 0x7b, +0xe4, 0xc8, 0x11, 0xa2, 0x68, 0xa8, 0xec, 0xdf, 0x2b, 0xcb, 0xee, 0x37, +0x01, 0x3b, 0x5e, 0xf4, 0x76, 0x44, 0xe0, 0x95, 0x57, 0xfe, 0xfd, 0x8c, +0xaa, 0x5e, 0x76, 0xce, 0xf1, 0xc5, 0x2f, 0x9e, 0x62, 0x62, 0x22, 0x58, +0xfe, 0xf6, 0x6d, 0xcf, 0x9d, 0x3b, 0x21, 0xfd, 0x81, 0x32, 0x50, 0xe0, +0xd6, 0x52, 0x1c, 0x7d, 0x3e, 0x78, 0x3d, 0xe2, 0x10, 0x3e, 0xeb, 0xf5, +0x3a, 0xdc, 0xbe, 0x3d, 0xc3, 0xa7, 0x3f, 0xfd, 0x19, 0x54, 0x15, 0x63, +0x2c, 0x87, 0x0e, 0x1d, 0x62, 0x4c, 0xf6, 0x17, 0x8b, 0x62, 0xed, 0xc4, +0x76, 0x38, 0x1f, 0xe0, 0x01, 0xbd, 0xa6, 0x0a, 0x27, 0x4f, 0x3e, 0xc9, +0xd1, 0xa3, 0x75, 0x44, 0xe0, 0xd6, 0xad, 0x9c, 0xc5, 0xc5, 0xb2, 0x2a, +0x44, 0x7e, 0x58, 0x9c, 0x02, 0x78, 0x45, 0x55, 0x87, 0x44, 0x46, 0xc0, +0x47, 0x0c, 0xc2, 0x7b, 0xba, 0xe1, 0x33, 0x55, 0xe8, 0x74, 0x56, 0x59, +0x5e, 0x5e, 0x22, 0x8e, 0x6b, 0xa8, 0x0a, 0x69, 0x5a, 0x63, 0xcf, 0x9e, +0xbd, 0x83, 0x2f, 0xed, 0x57, 0x95, 0x3f, 0x63, 0x1b, 0x19, 0x6d, 0x49, +0xe0, 0xe5, 0x97, 0xff, 0xe5, 0xcb, 0xaa, 0x7a, 0x66, 0xdf, 0xbe, 0x7d, +0x3c, 0xf9, 0xe4, 0x41, 0x8c, 0x31, 0xb4, 0xdb, 0x05, 0x0b, 0x0b, 0x05, +0xde, 0xcb, 0x70, 0x6e, 0xac, 0xb2, 0xba, 0xc5, 0x1c, 0x00, 0xdf, 0x9c, +0x48, 0x46, 0x84, 0x07, 0xef, 0x77, 0x3a, 0xab, 0x14, 0x45, 0x86, 0x48, +0x78, 0xbf, 0xd5, 0x3a, 0x80, 0xea, 0xd0, 0xb3, 0x2f, 0x64, 0xd9, 0xf2, +0x96, 0x5e, 0xd8, 0x92, 0x80, 0xaa, 0x5e, 0x52, 0x55, 0x4e, 0x9e, 0xfc, +0x2c, 0xfb, 0xf6, 0x25, 0xf4, 0xfb, 0xc2, 0xec, 0xec, 0xfa, 0x58, 0x1b, +0x30, 0xf2, 0xc0, 0x78, 0xfb, 0x30, 0xf0, 0xc6, 0xe8, 0xba, 0x99, 0x8c, +0x56, 0x32, 0x31, 0x15, 0x38, 0x86, 0x80, 0x45, 0x94, 0xa2, 0x28, 0x86, +0xeb, 0x39, 0xe7, 0x68, 0x36, 0x9b, 0x18, 0x33, 0xf8, 0x1e, 0xdf, 0xdc, +0x0a, 0xeb, 0x7d, 0x69, 0xf4, 0xa5, 0x97, 0xfe, 0xf1, 0xbc, 0xb5, 0xf6, +0xfa, 0xe4, 0xe4, 0x41, 0xce, 0x9e, 0x3d, 0xcd, 0xe4, 0x64, 0x9d, 0x99, +0x99, 0x35, 0x3a, 0x9d, 0x02, 0x63, 0x2c, 0xc6, 0x8c, 0x32, 0x4d, 0x7b, +0x7e, 0x8e, 0x9b, 0x3f, 0x7d, 0x93, 0xf5, 0x5e, 0x77, 0xab, 0xb5, 0xef, +0x1b, 0x69, 0x5a, 0xe3, 0xd8, 0x89, 0x5f, 0xa3, 0xde, 0x68, 0x52, 0x14, +0x39, 0x79, 0x5e, 0x52, 0x96, 0x05, 0x79, 0x5e, 0x54, 0x85, 0x2c, 0x90, +0x0f, 0x5e, 0x31, 0x74, 0x3a, 0xab, 0xcc, 0xcf, 0xdd, 0xa5, 0x0c, 0x29, +0xf9, 0x56, 0xbd, 0x3e, 0x71, 0x62, 0x73, 0x3a, 0xbd, 0xaf, 0x90, 0xa9, +0xea, 0x94, 0xaa, 0x30, 0x39, 0x79, 0x90, 0x03, 0x07, 0xea, 0xac, 0xae, +0xe6, 0x2c, 0x2d, 0xad, 0x63, 0xad, 0xc5, 0x98, 0x51, 0xba, 0x04, 0xb8, +0xf9, 0xd3, 0x37, 0x39, 0x75, 0xea, 0x33, 0x3c, 0xf7, 0x07, 0xe7, 0x76, +0x44, 0x60, 0x7d, 0x3d, 0xe7, 0x9f, 0xff, 0xe9, 0xbf, 0x58, 0xeb, 0xea, +0xd0, 0x53, 0x03, 0xcf, 0x85, 0x87, 0x0b, 0xa8, 0x62, 0xad, 0x41, 0x55, +0x69, 0x36, 0xea, 0xcc, 0x63, 0x06, 0xe2, 0x7f, 0xbc, 0xdb, 0x6d, 0x9f, +0x01, 0xfe, 0x67, 0x7c, 0xcd, 0x0d, 0x12, 0xba, 0x74, 0xe9, 0xef, 0x5b, +0xaa, 0xf2, 0x6c, 0x14, 0xc5, 0x1c, 0x3a, 0x34, 0x51, 0xa5, 0xcc, 0xf5, +0x0d, 0x5a, 0x1f, 0x14, 0x2a, 0x11, 0xcf, 0x7a, 0xaf, 0xcb, 0xef, 0x3f, +0x77, 0x0e, 0xef, 0xd9, 0xd1, 0x4c, 0x92, 0x84, 0xdf, 0xf9, 0xdd, 0xdf, +0xac, 0x80, 0x6f, 0x0e, 0xfa, 0x10, 0x0f, 0xc6, 0x54, 0x55, 0xc0, 0x80, +0x73, 0x8e, 0x34, 0xad, 0xc1, 0x50, 0x72, 0x7a, 0x7e, 0xb3, 0x51, 0x36, +0x78, 0x40, 0x44, 0x9f, 0xb6, 0x56, 0x69, 0x36, 0x1b, 0x34, 0x9b, 0x09, +0x45, 0x21, 0xb4, 0xdb, 0xdd, 0xca, 0xea, 0x21, 0xc5, 0xc1, 0xc6, 0x7c, +0xee, 0xfd, 0x8e, 0x8c, 0x3f, 0x1c, 0x49, 0x92, 0x6c, 0xb0, 0xbe, 0x88, +0xa0, 0xa2, 0x15, 0x68, 0x83, 0x31, 0x06, 0x6b, 0x0c, 0xa2, 0x82, 0x28, +0x44, 0x91, 0xc3, 0x8c, 0x12, 0xc0, 0xe9, 0x07, 0x12, 0x50, 0xd5, 0x33, +0xaa, 0x42, 0xa3, 0xd1, 0xa0, 0x56, 0x8b, 0x59, 0x5d, 0xcd, 0x10, 0x91, +0x2a, 0xe8, 0xcc, 0x98, 0x84, 0xc6, 0x49, 0xef, 0x8e, 0x40, 0xf8, 0x8d, +0x8c, 0x05, 0xef, 0x28, 0x0d, 0x1b, 0x0c, 0x91, 0xb5, 0x58, 0x6b, 0xf0, +0x62, 0x80, 0x92, 0x5a, 0x2d, 0xa5, 0xd3, 0x19, 0x66, 0xa3, 0xd6, 0x43, +0x08, 0xc8, 0x39, 0x11, 0x4b, 0x14, 0x45, 0x34, 0x1a, 0x35, 0xee, 0xdc, +0x59, 0x44, 0xc4, 0x57, 0x96, 0xd9, 0x18, 0xc0, 0x83, 0xb1, 0x5b, 0x0f, +0x8c, 0x08, 0xc8, 0xb0, 0x4f, 0x42, 0x03, 0x78, 0x67, 0xc1, 0x59, 0x83, +0xb3, 0x16, 0x54, 0x50, 0x63, 0xb1, 0x26, 0xd8, 0xbf, 0x52, 0xda, 0xb9, +0x87, 0x10, 0xd0, 0x16, 0x08, 0x69, 0x9a, 0x56, 0xbd, 0x7c, 0x7f, 0xe8, +0x81, 0x8d, 0xd6, 0x7f, 0x74, 0x09, 0x0d, 0x08, 0x84, 0xe6, 0x2e, 0x78, +0xc2, 0x20, 0x38, 0x63, 0x02, 0x78, 0x67, 0x71, 0xd6, 0xa2, 0x28, 0x42, +0x90, 0x54, 0x78, 0xda, 0xd6, 0x4d, 0xe7, 0xa6, 0x18, 0x90, 0x33, 0x03, +0x1d, 0x8a, 0xc0, 0xea, 0x6a, 0x77, 0xcc, 0xf2, 0x61, 0x99, 0x8f, 0x42, +0x42, 0xde, 0x97, 0xc3, 0x6e, 0x55, 0xd5, 0x63, 0x8d, 0xc1, 0x1a, 0x70, +0xd6, 0x11, 0xbb, 0x08, 0x6b, 0x42, 0x7d, 0xb0, 0x66, 0x20, 0xdf, 0xed, +0x3b, 0xea, 0xcd, 0x12, 0x02, 0x6c, 0xe5, 0x62, 0x2a, 0xeb, 0x8f, 0x77, +0x9a, 0xf7, 0x93, 0x78, 0x14, 0x0f, 0x94, 0xa5, 0x1f, 0x93, 0x4f, 0x58, +0xcf, 0x59, 0x4b, 0xe4, 0xc2, 0x34, 0x80, 0xb3, 0x42, 0x29, 0x86, 0xa2, +0xc8, 0xb7, 0xe9, 0xb3, 0xb6, 0x20, 0x20, 0xa2, 0x18, 0x23, 0x23, 0x02, +0x3e, 0x58, 0x80, 0xca, 0x03, 0xa3, 0x16, 0x79, 0x34, 0x1e, 0x8d, 0x40, +0x59, 0x91, 0x10, 0x9c, 0x09, 0xba, 0x8f, 0x9d, 0x23, 0x89, 0x23, 0xe2, +0xc8, 0x85, 0x6a, 0xed, 0x43, 0x2a, 0x2d, 0x8a, 0x02, 0x19, 0x11, 0xb8, +0xf9, 0x40, 0x02, 0xaa, 0x82, 0xc1, 0x90, 0x65, 0x19, 0xab, 0xab, 0xdd, +0xca, 0x23, 0xa3, 0xc2, 0x25, 0xf2, 0xd1, 0x04, 0xf1, 0x40, 0x3e, 0x06, +0xc1, 0x1a, 0x1b, 0xc0, 0x47, 0x11, 0x49, 0xe4, 0x88, 0x9c, 0xa3, 0xf0, +0x25, 0xc6, 0x1a, 0x0c, 0x86, 0x6e, 0x77, 0x6d, 0xdc, 0x03, 0xcb, 0x0f, +0x24, 0x20, 0x22, 0x37, 0x8c, 0xb5, 0xe7, 0xf2, 0xac, 0x4f, 0xaf, 0xbb, +0xce, 0x40, 0x77, 0x66, 0xd0, 0xb3, 0xc0, 0xb0, 0x97, 0x19, 0xfd, 0x66, +0xf7, 0x04, 0xca, 0xd2, 0x83, 0x86, 0xc0, 0x4d, 0x22, 0x47, 0x2d, 0x89, +0xa8, 0xa5, 0x31, 0x49, 0xe4, 0xc2, 0xe7, 0x3e, 0x80, 0xcf, 0xf2, 0xac, +0xb2, 0xfe, 0x90, 0xc0, 0x8d, 0x87, 0x11, 0x58, 0x0e, 0xac, 0x3b, 0x2c, +0x2e, 0x2c, 0x52, 0xaf, 0xa5, 0xe4, 0x59, 0x8e, 0xa8, 0x60, 0x08, 0x1e, +0x52, 0x01, 0xd1, 0x40, 0x26, 0x49, 0x52, 0xfa, 0xfd, 0x9c, 0x34, 0x4d, +0x76, 0x0c, 0x3e, 0xcb, 0xf2, 0x0a, 0xbc, 0x25, 0x8d, 0x23, 0x1a, 0x69, +0x42, 0x3d, 0x49, 0xa8, 0xc5, 0x11, 0xce, 0x39, 0x4a, 0x09, 0x2e, 0x55, +0x55, 0x96, 0x96, 0x97, 0xf1, 0x5e, 0xc7, 0x3d, 0x70, 0x9f, 0x84, 0x36, +0xb4, 0x12, 0xaa, 0x7a, 0x53, 0x51, 0xba, 0x6b, 0x5d, 0xfa, 0xfd, 0x5e, +0x60, 0xae, 0x42, 0x64, 0xc0, 0xa2, 0x18, 0x35, 0x18, 0x06, 0x7b, 0xde, +0x92, 0xc7, 0x8e, 0x3e, 0xce, 0x8f, 0xdf, 0xf8, 0x49, 0x00, 0xb5, 0x43, +0xf0, 0x3f, 0x79, 0xf3, 0x17, 0x44, 0x36, 0x80, 0xaf, 0x27, 0x49, 0x20, +0x90, 0x26, 0xa4, 0x49, 0x5c, 0xe5, 0x7f, 0x10, 0x14, 0xaf, 0xc2, 0xf2, +0xf2, 0x52, 0xd5, 0xd9, 0x0e, 0x97, 0xb8, 0xb1, 0x79, 0xcd, 0xcd, 0x1e, +0xb8, 0x6e, 0x8c, 0xb9, 0xd4, 0xed, 0x76, 0xf1, 0x65, 0x49, 0x91, 0x15, +0x38, 0x43, 0x55, 0xde, 0xc1, 0x20, 0x94, 0x3e, 0x48, 0x0a, 0x51, 0x6a, +0xb5, 0x06, 0x59, 0x2e, 0xfc, 0xe0, 0x07, 0xff, 0x8d, 0xf7, 0x83, 0xb6, +0x3a, 0xb8, 0x3c, 0xe8, 0x5c, 0x51, 0xf5, 0xa8, 0x0c, 0xf2, 0xbd, 0xe2, +0x8c, 0xa1, 0x91, 0xc6, 0xa4, 0x71, 0x44, 0xb3, 0x96, 0xd2, 0x48, 0x13, +0xe2, 0x28, 0xc2, 0x5a, 0xc8, 0x4b, 0x8f, 0x57, 0xa1, 0xf4, 0xc2, 0xc2, +0xe2, 0x12, 0x59, 0x5e, 0xe0, 0x65, 0x18, 0x64, 0xd7, 0xa7, 0xa7, 0x2f, +0xae, 0x3c, 0xd0, 0x03, 0x57, 0xaf, 0xfe, 0xe1, 0xcf, 0xc4, 0xfb, 0x19, +0x2f, 0x9e, 0x85, 0x85, 0x36, 0xbe, 0xcc, 0x31, 0x06, 0x22, 0x0b, 0x91, +0xb5, 0x24, 0xce, 0x91, 0x38, 0x4b, 0xec, 0x0c, 0x91, 0x05, 0x67, 0x14, +0x4b, 0x68, 0xd6, 0x8d, 0x2a, 0x2a, 0x1e, 0xd4, 0xa3, 0x3e, 0x68, 0xdc, +0xa8, 0x60, 0x35, 0x3c, 0x24, 0xb1, 0x96, 0x7a, 0x1c, 0xd1, 0xac, 0x25, +0xec, 0xa9, 0xd7, 0xd8, 0xdf, 0x6c, 0xb0, 0xb7, 0x5e, 0xa3, 0x9e, 0x26, +0x95, 0xf6, 0x4d, 0xd8, 0x13, 0x94, 0x9e, 0xac, 0x28, 0xf8, 0x60, 0xee, +0x03, 0xbc, 0x94, 0xe3, 0xd6, 0x7f, 0x7d, 0x2b, 0xaf, 0x6e, 0x71, 0x2e, +0xa4, 0xdf, 0x17, 0x2f, 0x17, 0xda, 0xed, 0x36, 0x93, 0x13, 0x93, 0x24, +0x91, 0xc5, 0x60, 0x89, 0x6c, 0xc8, 0x46, 0xce, 0x04, 0x40, 0x45, 0xc5, +0xbe, 0x1c, 0x5c, 0xd5, 0x63, 0x6c, 0x28, 0x80, 0x6a, 0xc0, 0x62, 0xc0, +0x99, 0xca, 0xea, 0x0e, 0x67, 0x2d, 0x49, 0xe4, 0x48, 0xe3, 0x88, 0x5a, +0x12, 0x93, 0xc6, 0x31, 0x49, 0xec, 0x30, 0xc6, 0x50, 0x7a, 0xc1, 0x8b, +0x90, 0x97, 0x25, 0x79, 0xe9, 0x79, 0xff, 0xce, 0x2c, 0xfd, 0x2c, 0xc3, +0x0f, 0xfb, 0x24, 0x66, 0xa6, 0xa7, 0x2f, 0x6e, 0x75, 0x18, 0xbc, 0xe5, +0x7e, 0xe0, 0xb2, 0x17, 0x7f, 0x21, 0x2f, 0x72, 0xe6, 0xdb, 0x1f, 0x90, +0x3e, 0xf6, 0x18, 0x91, 0x0d, 0x6d, 0x6e, 0xe4, 0x0c, 0xb1, 0x46, 0xc4, +0xce, 0x52, 0x3a, 0x4b, 0xe1, 0x2d, 0x79, 0x69, 0x42, 0x4e, 0xb7, 0x06, +0x2f, 0x82, 0x68, 0xe8, 0x2e, 0xc1, 0x61, 0x01, 0xe7, 0x0c, 0x91, 0x75, +0xc4, 0x91, 0x0d, 0xa9, 0x32, 0x8e, 0x48, 0xa2, 0x88, 0xc8, 0x59, 0xc0, +0x50, 0x8a, 0xa7, 0x14, 0x4f, 0x3f, 0x2f, 0xe8, 0x17, 0x05, 0xf3, 0x0b, +0x6d, 0x16, 0x16, 0x97, 0x29, 0xca, 0xb2, 0x92, 0x23, 0x00, 0x97, 0xb6, +0x02, 0x0f, 0xdb, 0x1c, 0x6c, 0x7d, 0xe3, 0x1b, 0x7f, 0xfd, 0x7a, 0x1c, +0x45, 0x5f, 0xae, 0x25, 0x31, 0x4f, 0x7e, 0xf6, 0x04, 0x07, 0xf6, 0xb7, +0xa8, 0xc5, 0x11, 0x69, 0x1c, 0x11, 0x55, 0xf9, 0x59, 0x34, 0xe8, 0xbc, +0xf4, 0x42, 0xe9, 0x3d, 0xa5, 0xf7, 0x55, 0xc6, 0x90, 0x6a, 0x3f, 0x05, +0xd6, 0x84, 0xde, 0x26, 0x76, 0x96, 0xc8, 0xb9, 0x6a, 0x56, 0x0d, 0x9a, +0x2a, 0x85, 0x0f, 0x72, 0xe9, 0x65, 0x05, 0xdd, 0x2c, 0xe3, 0x83, 0x76, +0x9b, 0x77, 0x6f, 0xcd, 0xb0, 0x9e, 0x65, 0xe3, 0x04, 0x6e, 0x4e, 0x4f, +0x5f, 0xfc, 0x8d, 0xed, 0x08, 0x6c, 0x79, 0xb4, 0x18, 0x3b, 0xfb, 0xed, +0xb2, 0x2c, 0xce, 0xe7, 0xd0, 0x9a, 0xb9, 0xfd, 0x1e, 0xd1, 0x89, 0x08, +0xbb, 0x77, 0x4f, 0xa8, 0x9a, 0x71, 0x8c, 0x73, 0x96, 0xc8, 0x00, 0x55, +0xd5, 0x14, 0x11, 0x64, 0x10, 0xc0, 0x63, 0x06, 0xb1, 0x55, 0xf5, 0xb6, +0xd6, 0xe2, 0xaa, 0x6a, 0xae, 0x28, 0x5e, 0xa4, 0x02, 0x5f, 0xd2, 0xcb, +0x0a, 0x7a, 0x59, 0xc6, 0xfc, 0xc2, 0x02, 0xb7, 0xde, 0xbb, 0x4d, 0x96, +0x97, 0x94, 0xde, 0x8f, 0xa7, 0xce, 0xa9, 0xed, 0xc0, 0x6f, 0xeb, 0x01, +0x80, 0xaf, 0x7f, 0xed, 0xaf, 0xfe, 0xc4, 0x18, 0xfb, 0x17, 0xb5, 0x24, +0xa1, 0x59, 0xaf, 0xf1, 0xc4, 0x89, 0xe3, 0xb4, 0xf6, 0xee, 0xa5, 0x9e, +0xc4, 0x95, 0x27, 0x42, 0xd7, 0x68, 0xad, 0x19, 0xd6, 0x99, 0x00, 0xaf, +0x1a, 0x95, 0x1b, 0x06, 0x25, 0x4f, 0x35, 0x00, 0x2f, 0x7d, 0xd0, 0x7a, +0xb0, 0x7c, 0x4e, 0x2f, 0xcb, 0x99, 0xbd, 0x73, 0x97, 0xbb, 0x73, 0xf7, +0xe8, 0x67, 0x39, 0x79, 0x51, 0x8c, 0x6b, 0xff, 0x8f, 0xa7, 0xa7, 0x2f, +0x5e, 0x79, 0x24, 0x02, 0x00, 0x5f, 0x7d, 0xf1, 0xea, 0xf5, 0xc8, 0xb9, +0xf3, 0x69, 0x45, 0xe2, 0xf8, 0xb1, 0x63, 0x1c, 0xd8, 0x37, 0x22, 0x91, +0x44, 0x11, 0xae, 0x22, 0x32, 0xd8, 0x51, 0x0d, 0xf5, 0x53, 0x15, 0x3b, +0xa9, 0xb6, 0x8f, 0x41, 0x6a, 0x21, 0x48, 0xfb, 0x79, 0xc1, 0x7a, 0x9e, +0xb3, 0xba, 0xb6, 0xc6, 0xad, 0xd9, 0x59, 0x96, 0x57, 0x57, 0xe9, 0x67, +0x39, 0xa5, 0x2f, 0x29, 0xfd, 0x10, 0xfc, 0xeb, 0xd3, 0xd3, 0x17, 0xbf, +0xf2, 0x20, 0xf0, 0xf0, 0x90, 0xd3, 0xe9, 0xc8, 0xb9, 0xa9, 0xac, 0x28, +0x6e, 0xa8, 0xea, 0x69, 0x11, 0xcf, 0xdb, 0xbf, 0xfa, 0x15, 0x47, 0x26, +0x0f, 0xf1, 0xa9, 0xc3, 0x87, 0x68, 0xa4, 0x29, 0x49, 0xec, 0x49, 0x22, +0x47, 0xec, 0x1c, 0xce, 0x1a, 0xac, 0xb1, 0xc3, 0x63, 0x10, 0x25, 0x00, +0xf7, 0x5e, 0x28, 0x45, 0xc8, 0x8b, 0xb2, 0xca, 0x32, 0x25, 0x6b, 0xbd, +0x75, 0xee, 0xcd, 0xcf, 0x31, 0xdf, 0x6e, 0xd3, 0xeb, 0xe7, 0xe4, 0x45, +0x1e, 0x62, 0x48, 0x76, 0x07, 0xfe, 0xa1, 0x1e, 0x00, 0xf8, 0xfa, 0x57, +0xff, 0xb2, 0x95, 0x97, 0xe5, 0x8d, 0xc8, 0xb9, 0xd3, 0x71, 0xe4, 0x48, +0xe3, 0x98, 0x46, 0xbd, 0xc6, 0xe1, 0x83, 0x93, 0x4c, 0xb4, 0x5a, 0xd4, +0x6b, 0x29, 0xf1, 0x30, 0x38, 0x03, 0x01, 0x34, 0xb4, 0x1b, 0xa2, 0xe1, +0x10, 0xa0, 0xf0, 0x9e, 0xbc, 0x28, 0x59, 0xe9, 0x74, 0x58, 0x5a, 0x59, +0xa6, 0xbd, 0xb8, 0xc8, 0x7a, 0x16, 0x80, 0x17, 0x83, 0xd6, 0x7a, 0x54, +0x71, 0x77, 0x0c, 0x7e, 0x47, 0x04, 0x00, 0xbe, 0xf6, 0xe2, 0xd5, 0x56, +0x96, 0xe7, 0xd7, 0xad, 0xb5, 0x4f, 0x27, 0xb1, 0x23, 0x8e, 0x22, 0xe2, +0x28, 0x22, 0x89, 0x63, 0xf6, 0xed, 0xd9, 0x43, 0xb3, 0xd1, 0x64, 0x4f, +0xb3, 0x41, 0x12, 0x27, 0x38, 0x17, 0x1a, 0x32, 0xef, 0x4b, 0xb2, 0xbc, +0xa0, 0xdf, 0xef, 0xb3, 0xd6, 0x5d, 0x63, 0xa5, 0xd3, 0x21, 0xcb, 0x73, +0xfa, 0x79, 0x41, 0x51, 0x16, 0x21, 0xf5, 0x4a, 0xb0, 0xfa, 0x78, 0xba, +0x9c, 0x9e, 0xbe, 0xf8, 0xed, 0x9d, 0x82, 0xdf, 0x31, 0x81, 0xc1, 0xf8, +0xca, 0xd4, 0x2b, 0x97, 0x8c, 0x31, 0xdf, 0x72, 0xd6, 0xe2, 0x5c, 0x28, +0x4e, 0x51, 0x95, 0xd3, 0xc3, 0x46, 0xc4, 0x0d, 0x25, 0x04, 0x21, 0x60, +0x45, 0x06, 0x69, 0xb6, 0x1c, 0xa6, 0x5b, 0x11, 0x19, 0xca, 0xa5, 0x7a, +0xfc, 0x0c, 0x30, 0x35, 0x3d, 0x7d, 0xf1, 0x87, 0xbb, 0x01, 0xbf, 0x6b, +0x02, 0x00, 0x2f, 0xbc, 0xf0, 0xf2, 0x69, 0x63, 0xcc, 0x65, 0x6b, 0xcc, +0x39, 0x53, 0xe9, 0xde, 0x1a, 0x13, 0xb2, 0x11, 0xa1, 0x67, 0x02, 0x86, +0xe7, 0x9a, 0xa2, 0x32, 0xb4, 0xb2, 0x6c, 0x38, 0x72, 0x04, 0x42, 0x7f, +0x7f, 0x79, 0xb7, 0x56, 0xff, 0x50, 0x04, 0x06, 0xe3, 0xf9, 0xe7, 0xbf, +0xf3, 0xb4, 0x31, 0x4c, 0x59, 0x63, 0x9f, 0x35, 0xc6, 0xb4, 0xac, 0x1d, +0x6c, 0xc0, 0xc7, 0xf6, 0x0a, 0x3a, 0x6a, 0xf0, 0x94, 0x0d, 0xc0, 0x6f, +0x02, 0x97, 0xd9, 0xa6, 0x41, 0xfb, 0x7f, 0x21, 0x30, 0x3e, 0x9e, 0x7f, +0xfe, 0x3b, 0xe7, 0x81, 0x33, 0x84, 0x63, 0x8f, 0xe3, 0xd5, 0x1c, 0x8c, +0x65, 0x02, 0xe0, 0x19, 0x42, 0x3b, 0x7c, 0x63, 0x7a, 0xfa, 0xe2, 0xad, +0x0f, 0xfd, 0xd0, 0x6a, 0x7c, 0x64, 0x7f, 0xa9, 0xff, 0xb8, 0xc6, 0x27, +0xfe, 0x9f, 0x3d, 0x3e, 0xf1, 0x04, 0xfe, 0x0f, 0xa4, 0xff, 0x07, 0x95, +0xd9, 0xf3, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, +0xae, 0x42, 0x60, 0x82, +}; diff --git a/Source/Core/DolphinWX/resources/toolbar_stop.xpm b/Source/Core/DolphinWX/resources/toolbar_stop.xpm new file mode 100644 index 0000000000..74c04e4df1 --- /dev/null +++ b/Source/Core/DolphinWX/resources/toolbar_stop.xpm @@ -0,0 +1,126 @@ +/* XPM */ +static char *toolbar_stop_xpm[] = { +/* columns rows colors chars-per-pixel */ +"48 48 72 1", +" c #96150D", +". c #9B140D", +"X c #971911", +"o c #9A1811", +"O c #9C1F18", +"+ c #A3160E", +"@ c #A31911", +"# c #AC1811", +"$ c #A01F18", +"% c #B41811", +"& c #BE1911", +"* c #9D231C", +"= c #A4231C", +"- c #AB231C", +"; c #B3231C", +": c #BB231C", +"> c #AC2B24", +", c #B32B24", +"< c #BB2B24", +"1 c #A1302A", +"2 c #CB160E", +"3 c #C41911", +"4 c #CB1911", +"5 c #C3241C", +"6 c #CB241C", +"7 c #D2231B", +"8 c #C42C24", +"9 c #CC2C24", +"0 c #D12C24", +"q c #C48A86", +"w c #C88B87", +"e c #C68E8A", +"r c #C98E8A", +"t c #C6918E", +"y c #CE918E", +"u c #D2938F", +"i c #CD9895", +"p c #D69390", +"a c #DC9490", +"s c #E1928E", +"d c #E19491", +"f c #CDCCCC", +"g c #D0CFCF", +"h c #DFCDCB", +"j c #D4D3D3", +"k c #D8D7D7", +"l c #D7D8D6", +"z c #D8D8D7", +"x c #DCDCDB", +"c c #E1CFCE", +"v c #E3D1CF", +"b c #E6D2D1", +"n c #EDD7D6", +"m c #E4DDDC", +"M c #EFD9D8", +"N c #F0DAD9", +"B c #E0E0DF", +"V c #E3E3E3", +"C c #E8E7E7", +"Z c #E6E8E7", +"A c #E8E8E7", +"S c #E8E7E8", +"D c #E7E9E9", +"F c #ECECEC", +"G c #F1E7E6", +"H c #F0F0EF", +"J c #EDF3F3", +"K c #F2F2F2", +"L c #F1F8F7", +"P c #F6FCFC", +"I c #F9FFFF", +"U c None", +/* pixels */ +"UUUUUUUUUUUUUUUUUUzlfffffffflzUUUUUUUUUUUUUUUUUU", +"UUUUUUUUUUUUUUUzffjkxVVVCVVxzjffzUUUUUUUUUUUUUUU", +"UUUUUUUUUUUUUjfjxZDDDDDDDDDDDACxjfjUUUUUUUUUUUUU", +"UUUUUUUUUUUzflVAFDDDDFFFFFFDDDADAVkfkUUUUUUUUUUU", +"UUUUUUUUUUfjVDDDDFFFFFFFFFFFFFFDAADVjfUUUUUUUUUU", +"UUUUUUUUxfzADDDFFFFFFFFFFFFFFFFFFDAADxfxUUUUUUUU", +"UUUUUUUzfVFDDFFFFFFFFFFFFFFFFFFFFFFDDDVfkUUUUUUU", +"UUUUUUzfVFDDFFFFFFFFFHHHHHHFFFFFFFFFDDDVfkUUUUUU", +"UUUUUxfVFDFFFFFFFFHKKKKKKKKKHFFFFFFFFFAAVfxUUUUU", +"UUUUUfmFDFFFFFFFKKKKKKKKKKKKKKKHFFFFFFFADVfUUUUU", +"UUUUfzDDFFFFFFFKKKKKKKKKKKKKKKKKKHFFFFFFDDxfUUUU", +"UUUxgADFFFFFFKKKKKKKKKKKKKKKKKKKKKHFFFFFDDAjzUUU", +"UUUfVDFFFFFFKKKKKKKKKKKKKKKKKKKKKKKHFFFFFDDVfUUU", +"UUljDDFFFFFKKKKKKKKKKKKKKKKKKKKKKKKKHFFFFFDDkjUU", +"UUfVFFFFFFHKKKKIIIIIIIIIIIIIIIIIIKKKKFFFFFDAVfUU", +"UxjADFFFFHKKKLGdsssddaaaaappuuyyiFKKKKHFFFFADjxU", +"UfxFFFFFFKKKKLn6244433&&%%%#@@@.*mDZZAFFFFFDDmfU", +"UfCDFFFFFKKKKPM077766555::;;--=$1mDVVVxxVAFFACfU", +"xjDDFFFFHKKKKPN077776655::;;--=$1mDZVVVxxxxZDDjx", +"kkFFFFFFKKKKKPN077776655::;;--=$1mFCVVVxxxzlxSxl", +"fxFFFFFHKKKKKPN077766555::;;--=O1mFCVVVBxxxzjjzf", +"fVFFFFFHKKKKKPN96666655::;;;--=O1mFCVVVBxxxzjjff", +"fVFFFFFHKKKKKPN96666555::;;--==O1mFAZVVVxxxzjjff", +"fVDFFFFHKKKKKPN8555555::;;;--==O1mFAZVVVxxxzjjgf", +"fVFFFFFHKKKKKPn855555:::;;---==O1mFAZVVVxxxzjjgf", +"fVFFFFFHKKKKKLb<:::::::;;;--==*O1mFAZVVVxxxzjjff", +"fVFFFFFHKKKKKJb<:::::;;;;--===*O1mFCZVVVxxxzjjff", +"gxFFFFFHKKKKFFv<;;;;;;;----==**O1mFCVVVBxxxzjjff", +"kkFFFFFHKKKKAFv,;;;;;;----===**O1mFCVVVBxxxljjfk", +"xjDDFFFFKKKFZFc,--------===****O1mFZVVVxxxxljgfx", +"UfZDFFFFHKKVVFc>------====*****O1mDVVVVxxxzjjgfU", +"UgxFFFFFFKFVVDh=+@@@@@ooooXXXXX *mDVVVBxxxzjjfgU", +"UxjDDFFFFKCVVZmrwwrrrrrrreeeeeeqtBZVVBxxxxljjfxU", +"UUfVFFFFFFVVVVZJJJJJJLLLLLLLJJJJJVVVVxxxxzjjffUU", +"UUllDDFFFFxBVVVVZCAADDDFDDDAAACZVVVVxxxxzljjflUU", +"UUUfVFFFFAxxVVVVVZCCAAAAAAACCCVVVVVxxxxxljjffUUU", +"UUUxjDDFFVxxxBVVVVVVZCCCCCZZVVVVVVxxxxxzjjgfxUUU", +"UUUUfxFDFVxxxxxVVVVVVVVVVVVVVVVVBxxxxxzljjffUUUU", +"UUUUUfVFFBzxxxxxVVVVVVVVVVVVVVVxxxxxxzljjffUUUUU", +"UUUUUxfVFxlzxxxxxxBVVVVVVVVVBxxxxxxxzljjffxUUUUU", +"UUUUUUzfVxjlzxxxxxxxxxxxxxxxxxxxxxxzjjjffzUUUUUU", +"UUUUUUUzfkjjjlzxxxxxxxxxxxxxxxxxxzljjjffzUUUUUUU", +"UUUUUUUUxffjjjjlzxxxxxxxxxxxxxxzljjjjffxUUUUUUUU", +"UUUUUUUUUUffgjjjjlzzzxxxxxxzzlljjjjgffUUUUUUUUUU", +"UUUUUUUUUUUxffgjjjjjjlllllljjjjjjgffxUUUUUUUUUUU", +"UUUUUUUUUUUUUjfffjjjjjjjjjjjjjgfffjUUUUUUUUUUUUU", +"UUUUUUUUUUUUUUUxjffffjjjjjjffffjxUUUUUUUUUUUUUUU", +"UUUUUUUUUUUUUUUUUUxzjffffffjzxUUUUUUUUUUUUUUUUUU" +}; diff --git a/Source/Core/DolphinWX/resources/toolbar_stop_dis.c b/Source/Core/DolphinWX/resources/toolbar_stop_dis.c new file mode 100644 index 0000000000..6f4264e68d --- /dev/null +++ b/Source/Core/DolphinWX/resources/toolbar_stop_dis.c @@ -0,0 +1,204 @@ +static const unsigned char toolbar_stop_dis_png[] = { +0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, +0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, +0x08, 0x06, 0x00, 0x00, 0x00, 0x57, 0x02, 0xf9, 0x87, 0x00, 0x00, 0x00, +0x01, 0x73, 0x52, 0x47, 0x42, 0x00, 0xae, 0xce, 0x1c, 0xe9, 0x00, 0x00, +0x00, 0x06, 0x62, 0x4b, 0x47, 0x44, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, +0xa0, 0xbd, 0xa7, 0x93, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, +0x00, 0x00, 0x0b, 0x12, 0x00, 0x00, 0x0b, 0x12, 0x01, 0xd2, 0xdd, 0x7e, +0xfc, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4d, 0x45, 0x07, 0xd8, 0x03, +0x16, 0x0a, 0x1f, 0x02, 0x2e, 0xa8, 0xac, 0x15, 0x00, 0x00, 0x08, 0xf8, +0x49, 0x44, 0x41, 0x54, 0x68, 0xde, 0xed, 0x5a, 0xcb, 0x6b, 0x54, 0x4b, +0x1a, 0xff, 0x55, 0x9d, 0x67, 0x77, 0xa7, 0x3b, 0x6d, 0x9e, 0xf8, 0xc0, +0x49, 0x34, 0x22, 0x04, 0x06, 0x33, 0xa2, 0x2e, 0x84, 0x99, 0x64, 0x35, +0xb3, 0x51, 0x74, 0x37, 0xab, 0xe1, 0x66, 0xfe, 0x81, 0x6b, 0xae, 0xe0, +0x4a, 0x62, 0x12, 0x06, 0x66, 0x39, 0x9c, 0x59, 0xb9, 0x70, 0x91, 0x80, +0x28, 0x12, 0x37, 0x3a, 0xbb, 0x59, 0x99, 0x3b, 0x23, 0xc2, 0x40, 0x70, +0x72, 0xd1, 0xa5, 0x48, 0x42, 0xa2, 0x21, 0x9d, 0x4e, 0x3f, 0xcf, 0xe9, +0xce, 0x79, 0x55, 0xcd, 0x62, 0xba, 0x0e, 0xd5, 0xc7, 0x93, 0xa4, 0x93, +0x78, 0x67, 0xb8, 0x70, 0x0f, 0x14, 0xfd, 0x48, 0x57, 0xd5, 0xf7, 0xfb, +0xbe, 0x5f, 0x7d, 0xaf, 0x0a, 0xe1, 0x9c, 0xe3, 0xa7, 0xfc, 0x50, 0xfc, +0xc4, 0x1f, 0xf5, 0xff, 0xb9, 0xf9, 0xdc, 0xdc, 0x1c, 0x11, 0xef, 0x67, +0x66, 0x66, 0x8e, 0x44, 0x05, 0xf2, 0xb5, 0x28, 0xb4, 0xb0, 0xb0, 0x30, +0xc4, 0x39, 0x9f, 0xe0, 0x9c, 0x4f, 0x30, 0xc6, 0x86, 0x18, 0x63, 0x97, +0x38, 0xe7, 0x79, 0xc6, 0x18, 0x5a, 0x63, 0x95, 0x31, 0xb6, 0xc6, 0x18, +0x5b, 0x62, 0x8c, 0xfd, 0x60, 0xdb, 0xf6, 0xcb, 0x84, 0x65, 0xf8, 0x61, +0xc1, 0x1c, 0x0b, 0xc0, 0xd3, 0xa7, 0x4f, 0xf3, 0x8c, 0xb1, 0xdb, 0x9c, +0xf3, 0x3b, 0x9c, 0xf3, 0x31, 0xc6, 0x18, 0x38, 0xe7, 0x42, 0xe0, 0xb6, +0xf7, 0x09, 0xa3, 0xc2, 0x18, 0xfb, 0x5b, 0x18, 0x86, 0x8f, 0x3d, 0xcf, +0xfb, 0xbe, 0x25, 0xbc, 0x18, 0x00, 0xc0, 0x3b, 0x01, 0x72, 0x64, 0x00, +0xcf, 0x9e, 0x3d, 0x9b, 0x6d, 0x09, 0x9e, 0xe7, 0x9c, 0xc3, 0x30, 0x0c, +0x64, 0x32, 0x19, 0x64, 0xb3, 0x59, 0x10, 0x42, 0x60, 0x18, 0x06, 0x18, +0x63, 0x08, 0xc3, 0x10, 0xbe, 0xef, 0xc3, 0x71, 0x1c, 0x38, 0x8e, 0x83, +0x5a, 0xad, 0x86, 0x7a, 0xbd, 0x8e, 0x20, 0x08, 0x64, 0x30, 0xff, 0x08, +0xc3, 0xf0, 0x5e, 0x18, 0x86, 0x2b, 0x2d, 0x00, 0x4c, 0x80, 0x39, 0x08, +0xc4, 0xa1, 0xcf, 0xc0, 0xe2, 0xe2, 0xe2, 0x04, 0x21, 0x64, 0x9e, 0x52, +0x3a, 0x44, 0x29, 0x45, 0x4f, 0x4f, 0x0f, 0x4e, 0x9f, 0x3e, 0x8d, 0x5c, +0x2e, 0x07, 0xc3, 0x30, 0xa0, 0x28, 0x0a, 0x54, 0x55, 0x8d, 0x2c, 0xb0, +0xbb, 0xbb, 0x8b, 0x46, 0xa3, 0x01, 0xdb, 0xb6, 0x51, 0x2e, 0x97, 0xd1, +0xd3, 0xd3, 0x03, 0xcf, 0xf3, 0x50, 0xa9, 0x54, 0xb0, 0xb9, 0xb9, 0x09, +0xd7, 0x75, 0x01, 0xe0, 0x37, 0x84, 0x90, 0x7f, 0x11, 0x42, 0xfe, 0xcc, +0x39, 0xff, 0x13, 0x00, 0xd2, 0x02, 0xc1, 0x24, 0x8b, 0x1c, 0xdf, 0x02, +0xcf, 0x9f, 0x3f, 0x9f, 0x25, 0x84, 0xcc, 0x00, 0xc0, 0xc0, 0xc0, 0x00, +0x46, 0x46, 0x46, 0xd0, 0xdd, 0xdd, 0x0d, 0x55, 0x55, 0xc1, 0x39, 0x6f, +0x1b, 0x02, 0x40, 0x7c, 0xec, 0xec, 0xec, 0xe0, 0xf3, 0xe7, 0xcf, 0x68, +0x34, 0x1a, 0x08, 0xc3, 0x10, 0xdb, 0xdb, 0xdb, 0x28, 0x14, 0x0a, 0xb2, +0x45, 0xfe, 0xc9, 0x18, 0xfb, 0x3d, 0xa5, 0x74, 0x07, 0x40, 0x08, 0x80, +0xed, 0x67, 0x05, 0xf5, 0x10, 0xc2, 0xcf, 0x53, 0x4a, 0x27, 0x0d, 0xc3, +0xc0, 0xe8, 0xe8, 0x28, 0x4e, 0x9e, 0x3c, 0x09, 0x4d, 0xd3, 0x22, 0x41, +0x3d, 0xcf, 0x83, 0x6d, 0xdb, 0x68, 0x36, 0x9b, 0x70, 0x5d, 0x17, 0x9e, +0xe7, 0x21, 0x0c, 0x43, 0x84, 0x61, 0x08, 0x4d, 0xd3, 0xa0, 0xeb, 0x3a, +0x4c, 0xd3, 0x44, 0x2e, 0x97, 0x43, 0x3e, 0x9f, 0xc7, 0xd6, 0xd6, 0x16, +0x56, 0x57, 0x57, 0xd1, 0xd3, 0xd3, 0x83, 0x54, 0x2a, 0x85, 0x8d, 0x8d, +0x0d, 0x34, 0x9b, 0x4d, 0x00, 0xf8, 0x35, 0x80, 0xbf, 0x33, 0xc6, 0x7e, +0xd7, 0x02, 0xc1, 0xf7, 0xb3, 0x42, 0x47, 0x16, 0x58, 0x5c, 0x5c, 0x9c, +0xa7, 0x94, 0x4e, 0x66, 0x32, 0x19, 0x5c, 0xbd, 0x7a, 0x15, 0x27, 0x4e, +0x9c, 0x88, 0x34, 0xea, 0x38, 0x0e, 0xaa, 0xd5, 0x2a, 0x5c, 0xd7, 0x8d, +0x38, 0x2f, 0x5e, 0xc5, 0x88, 0x7f, 0xce, 0xe5, 0x72, 0x18, 0x1c, 0x1c, +0x84, 0xef, 0xfb, 0x78, 0xff, 0xfe, 0x7d, 0x04, 0x76, 0x73, 0x73, 0x13, +0x95, 0x4a, 0x45, 0x58, 0xe2, 0x1d, 0x80, 0xdf, 0xaa, 0xaa, 0x5a, 0x04, +0x10, 0xee, 0x65, 0x05, 0xda, 0xc1, 0x61, 0x9d, 0x07, 0x30, 0xd9, 0xdd, +0xdd, 0x8d, 0xeb, 0xd7, 0xaf, 0x47, 0xc2, 0x07, 0x41, 0x80, 0x62, 0xb1, +0x88, 0x4a, 0xa5, 0x82, 0x20, 0x08, 0x40, 0xc8, 0x7f, 0x5d, 0xba, 0x78, +0x15, 0xef, 0xe5, 0xcf, 0xe2, 0x29, 0x95, 0x4a, 0x78, 0xf7, 0xee, 0x1d, +0xca, 0xe5, 0x32, 0x46, 0x47, 0x47, 0xa1, 0x28, 0x0a, 0x38, 0xe7, 0x18, +0x18, 0x18, 0x40, 0x2a, 0x95, 0x12, 0xf3, 0x7e, 0xc9, 0x18, 0x7b, 0x04, +0x40, 0x69, 0x9d, 0x89, 0xc3, 0x47, 0xe2, 0x27, 0x4f, 0x9e, 0xdc, 0xe1, +0x9c, 0x4f, 0x9a, 0xa6, 0x89, 0x2b, 0x57, 0xae, 0x20, 0x93, 0xc9, 0x80, +0x73, 0x8e, 0x46, 0xa3, 0x81, 0x52, 0xa9, 0x84, 0x20, 0x08, 0x0e, 0x17, +0x74, 0x24, 0x30, 0x9c, 0x73, 0x6c, 0x6c, 0x6c, 0xe0, 0xc3, 0x87, 0x0f, +0x18, 0x19, 0x19, 0x89, 0xce, 0xcd, 0xe0, 0xe0, 0x20, 0x54, 0x35, 0x62, +0xf6, 0x8d, 0xdd, 0xdd, 0xdd, 0x6f, 0x01, 0x50, 0x39, 0xe8, 0x75, 0x04, +0xe0, 0xf1, 0xe3, 0xc7, 0x63, 0x9c, 0x73, 0x4b, 0x51, 0x14, 0x5c, 0xbe, +0x7c, 0x19, 0x5d, 0x5d, 0x5d, 0xe0, 0x9c, 0xa3, 0x5c, 0x2e, 0xa3, 0x56, +0xab, 0x45, 0xdc, 0x97, 0x05, 0xfa, 0x22, 0x2a, 0x75, 0x40, 0x4f, 0xdb, +0xb6, 0xb1, 0xb6, 0xb6, 0x86, 0x53, 0xa7, 0x4e, 0x81, 0x73, 0x0e, 0x4a, +0x29, 0xfa, 0xfb, 0xfb, 0xe5, 0xb9, 0xf7, 0x9b, 0xcd, 0xe6, 0xf0, 0xa1, +0x2d, 0xc0, 0x39, 0x9f, 0x07, 0x80, 0x8b, 0x17, 0x2f, 0xa2, 0xb7, 0xb7, +0x37, 0xf2, 0x20, 0x8e, 0xe3, 0xb4, 0x71, 0x5b, 0x06, 0x22, 0xce, 0xc5, +0x5e, 0x20, 0xe4, 0xdf, 0xc9, 0xaf, 0xf5, 0x7a, 0x1d, 0xe5, 0x72, 0x39, +0x8a, 0x1d, 0x86, 0x61, 0x20, 0x9b, 0xcd, 0x8a, 0x69, 0xdd, 0x9c, 0xf3, +0xe9, 0xbd, 0x68, 0x94, 0x08, 0x60, 0x7e, 0x7e, 0xfe, 0x1b, 0xce, 0xf9, +0x58, 0x2e, 0x97, 0xc3, 0x99, 0x33, 0x67, 0x40, 0x08, 0x41, 0xbd, 0x5e, +0x87, 0x6d, 0xdb, 0x7b, 0x46, 0xd6, 0x24, 0x97, 0x79, 0x90, 0x75, 0xe4, +0xdf, 0xd5, 0xeb, 0x75, 0x78, 0x9e, 0x17, 0x7d, 0x97, 0xcf, 0xe7, 0xe5, +0xb9, 0x7f, 0xb0, 0x6d, 0x7b, 0xb8, 0x63, 0x00, 0x9c, 0xf3, 0x59, 0xce, +0x39, 0x2e, 0x5c, 0xb8, 0x80, 0x74, 0x3a, 0x0d, 0xdf, 0xf7, 0x51, 0x2a, +0x95, 0x12, 0xbd, 0x8b, 0x9c, 0x32, 0x1c, 0x14, 0x03, 0x84, 0x40, 0xf1, +0xb3, 0x20, 0xe6, 0xf8, 0xbe, 0x1f, 0xcd, 0x55, 0x14, 0x05, 0x99, 0x4c, +0x06, 0x84, 0x10, 0xf1, 0x9b, 0x6f, 0x3b, 0x72, 0xa3, 0x8f, 0x1e, 0x3d, +0xba, 0x45, 0x29, 0x7d, 0xd1, 0xd7, 0xd7, 0x87, 0x6b, 0xd7, 0xae, 0xa1, +0xbb, 0xbb, 0x1b, 0x85, 0x42, 0x01, 0xcd, 0x66, 0x33, 0xf2, 0x2a, 0x42, +0x80, 0x42, 0xa1, 0x80, 0xe5, 0xe5, 0x65, 0x38, 0x8e, 0xd3, 0xd1, 0x21, +0x36, 0x4d, 0x13, 0xe7, 0xce, 0x9d, 0x43, 0x26, 0x93, 0x81, 0xe7, 0x79, +0xf0, 0x7d, 0x1f, 0x41, 0x10, 0xc0, 0xf3, 0xbc, 0x28, 0x90, 0x09, 0x40, +0x84, 0x10, 0xd4, 0x6a, 0x35, 0x6c, 0x6d, 0x6d, 0x09, 0x85, 0xad, 0xe5, +0x72, 0xb9, 0xe1, 0xb8, 0x3b, 0x55, 0x13, 0xb4, 0x3f, 0xc9, 0x39, 0x47, +0x6f, 0x6f, 0x2f, 0xb2, 0xd9, 0x2c, 0x1a, 0x8d, 0x06, 0xea, 0xf5, 0x3a, +0x28, 0xa5, 0x5f, 0xb8, 0xc5, 0xe5, 0xe5, 0x65, 0x9c, 0x3f, 0x7f, 0x1e, +0x37, 0x6f, 0xde, 0xec, 0x08, 0x80, 0xeb, 0xba, 0x78, 0xf5, 0xea, 0x55, +0xa2, 0xb5, 0x64, 0x6b, 0x08, 0xad, 0xa7, 0xd3, 0x69, 0x79, 0xfa, 0x2f, +0x2a, 0x95, 0xca, 0x18, 0x80, 0x7f, 0xef, 0x49, 0xa1, 0x87, 0x0f, 0x1f, +0xe6, 0x39, 0xe7, 0xb7, 0x55, 0x55, 0x45, 0x5f, 0x5f, 0x1f, 0x38, 0xe7, +0xa8, 0x56, 0xab, 0x6d, 0x5c, 0x97, 0xa9, 0xe3, 0x38, 0x0e, 0x6e, 0xdc, +0xb8, 0x91, 0x48, 0x97, 0xa4, 0xa1, 0xeb, 0x3a, 0xc6, 0xc7, 0xc7, 0xf7, +0xa4, 0x96, 0xcc, 0x06, 0x42, 0x08, 0x14, 0x45, 0x81, 0x69, 0x9a, 0x91, +0xd2, 0x38, 0xe7, 0xb7, 0xf6, 0x4d, 0x25, 0x38, 0xe7, 0xe3, 0x9c, 0x73, +0x64, 0x32, 0x19, 0x98, 0xa6, 0x89, 0x30, 0x0c, 0x51, 0xad, 0x56, 0x23, +0x8d, 0x50, 0x4a, 0xbf, 0xf0, 0xe7, 0x8c, 0xb1, 0x43, 0xc5, 0x02, 0x5d, +0xd7, 0x13, 0xd3, 0x6c, 0x39, 0xf0, 0x49, 0xbc, 0x8f, 0x82, 0x5c, 0xeb, +0xb9, 0x74, 0x10, 0x80, 0x31, 0xc6, 0x18, 0xd2, 0xe9, 0x34, 0x0c, 0xc3, +0x80, 0xe3, 0x38, 0x60, 0x8c, 0xb5, 0x2d, 0x1a, 0x8f, 0xac, 0x47, 0x49, +0xc7, 0xf7, 0x3a, 0xf0, 0x84, 0x10, 0x50, 0x4a, 0x41, 0x29, 0x8d, 0xbe, +0x37, 0x4d, 0x13, 0xb5, 0x5a, 0x4d, 0xec, 0x93, 0xdf, 0x17, 0x00, 0x63, +0x6c, 0x82, 0x52, 0x0a, 0x55, 0x55, 0x91, 0x4a, 0xa5, 0x50, 0x28, 0x14, +0x10, 0x86, 0x61, 0xb4, 0x70, 0x52, 0x5a, 0x70, 0x54, 0x00, 0x32, 0x1d, +0x65, 0xc5, 0x08, 0x00, 0xc2, 0xe2, 0x12, 0x7d, 0x00, 0x60, 0xe2, 0x20, +0x0b, 0xe4, 0x45, 0x20, 0x11, 0x29, 0x83, 0xb0, 0x80, 0xbc, 0xc9, 0x71, +0x28, 0x24, 0xe6, 0xc8, 0xae, 0x38, 0xae, 0x7d, 0x01, 0x20, 0xc9, 0xe2, +0x07, 0x59, 0x60, 0x4c, 0xa6, 0x8b, 0x6d, 0xdb, 0x5f, 0xb8, 0xce, 0xaf, +0x41, 0xa1, 0x20, 0x08, 0xda, 0x9c, 0x81, 0x58, 0x5f, 0x58, 0x5f, 0xac, +0x2b, 0x2b, 0x6f, 0xaf, 0x7d, 0xd4, 0x24, 0x61, 0xe4, 0xe0, 0x94, 0x24, +0x7c, 0x3c, 0x10, 0x1d, 0xf6, 0x91, 0xb5, 0x2f, 0xd6, 0xa3, 0x94, 0x42, +0x51, 0x94, 0xc8, 0x51, 0x88, 0xbd, 0x45, 0x74, 0xee, 0xd4, 0x02, 0x20, +0x84, 0x44, 0x00, 0x04, 0xff, 0xe3, 0x56, 0x88, 0xcf, 0x39, 0x8a, 0x05, +0x84, 0x15, 0xc4, 0xba, 0xa2, 0x14, 0x15, 0xd5, 0x9d, 0xf8, 0x9b, 0xef, +0xfb, 0x32, 0x80, 0x95, 0x8e, 0x2c, 0xe0, 0xba, 0x2e, 0xea, 0xf5, 0x7a, +0x62, 0x3e, 0xf3, 0x35, 0x28, 0x14, 0xe7, 0xbe, 0x2c, 0xbc, 0xa2, 0x28, +0x6d, 0xf5, 0x85, 0xe3, 0x38, 0xf2, 0x1e, 0x95, 0x83, 0x2c, 0xb0, 0x44, +0x29, 0x9d, 0x10, 0x85, 0xf8, 0x5e, 0x99, 0xe4, 0x71, 0x29, 0x24, 0xd2, +0x06, 0x42, 0x08, 0x54, 0x55, 0x8d, 0x4a, 0x4e, 0x45, 0x51, 0xda, 0xe2, +0x41, 0x02, 0x7d, 0x96, 0x0e, 0x02, 0x50, 0x11, 0x39, 0x7a, 0xa9, 0x54, +0x82, 0x69, 0x9a, 0x51, 0xa9, 0x98, 0x94, 0x41, 0x1a, 0x86, 0x01, 0xd7, +0x75, 0xa1, 0xeb, 0x7a, 0xc7, 0xc2, 0x0b, 0xa1, 0xc4, 0x81, 0x35, 0x0c, +0x03, 0xba, 0xae, 0x47, 0xda, 0x97, 0xf7, 0x12, 0xe5, 0xe5, 0x7e, 0x14, +0xa2, 0x31, 0x3a, 0xac, 0x08, 0xb3, 0x35, 0x9b, 0xcd, 0x44, 0x57, 0x26, +0xf8, 0x19, 0x04, 0x01, 0xce, 0x9e, 0x3d, 0x8b, 0x37, 0x6f, 0xde, 0xc0, +0xf3, 0xbc, 0x8e, 0x85, 0x7f, 0xfb, 0xf6, 0x6d, 0x24, 0xbc, 0xae, 0xeb, +0xd0, 0x75, 0x3d, 0x02, 0x21, 0xbb, 0x4f, 0xc6, 0x18, 0xca, 0xe5, 0x72, +0x1c, 0xc0, 0x81, 0x16, 0x78, 0x41, 0x08, 0x99, 0x75, 0x1c, 0x27, 0xca, +0x12, 0x65, 0xde, 0xc7, 0x29, 0x95, 0x4a, 0xa5, 0xc0, 0x18, 0xc3, 0xeb, +0xd7, 0xaf, 0xdb, 0x3c, 0x97, 0xcc, 0xf3, 0x78, 0xbd, 0x40, 0x08, 0x89, +0x34, 0x6e, 0x9a, 0x66, 0xf4, 0x9e, 0x10, 0x82, 0x30, 0x0c, 0xdb, 0x84, +0x17, 0xe9, 0x75, 0xeb, 0x79, 0x61, 0x59, 0x56, 0x75, 0x5f, 0x0b, 0xdc, +0xbf, 0x7f, 0xff, 0x87, 0x30, 0x0c, 0x57, 0xc3, 0x30, 0x44, 0xb1, 0x58, +0x84, 0xef, 0xfb, 0x6d, 0x3e, 0x5a, 0xb8, 0xb9, 0x78, 0x84, 0x94, 0xbd, +0x56, 0x3c, 0xc2, 0x46, 0x1b, 0x51, 0x0a, 0x4d, 0xd3, 0x60, 0x18, 0x06, +0x4c, 0xd3, 0x8c, 0xf2, 0x2d, 0xc3, 0x30, 0x22, 0x00, 0x8c, 0x31, 0x04, +0x41, 0x00, 0xdf, 0xf7, 0xa3, 0x34, 0x5a, 0x5a, 0x63, 0xa1, 0xa3, 0x82, +0x86, 0x73, 0xfe, 0x92, 0x31, 0x86, 0x62, 0xb1, 0x18, 0x1d, 0x36, 0x21, +0x80, 0xf0, 0x16, 0x8a, 0xa2, 0xb4, 0x0d, 0xe1, 0xbb, 0xe5, 0x94, 0x5b, +0x06, 0x2d, 0x68, 0x62, 0x9a, 0x26, 0xd2, 0xe9, 0x34, 0xd2, 0xe9, 0x74, +0x24, 0xbc, 0x38, 0xb8, 0x42, 0xf8, 0x30, 0x0c, 0xf1, 0xe9, 0xd3, 0xa7, +0xe8, 0xec, 0xb5, 0x00, 0xac, 0x5a, 0x96, 0xf5, 0xb2, 0xa3, 0xc6, 0x16, +0xe7, 0xdc, 0x0a, 0xc3, 0xf0, 0x8e, 0xef, 0xfb, 0xd8, 0xde, 0xde, 0x8e, +0x8a, 0x6d, 0x39, 0x4f, 0xa1, 0x94, 0x46, 0xc1, 0x48, 0xb8, 0x3c, 0x91, +0x80, 0x25, 0x69, 0x5e, 0x06, 0xaf, 0x69, 0x1a, 0x54, 0x55, 0x8d, 0xc0, +0x8a, 0x75, 0x44, 0x81, 0x53, 0x2c, 0x16, 0x51, 0x2e, 0x97, 0xdb, 0x94, +0x07, 0x60, 0xf6, 0x50, 0x8d, 0xad, 0xb9, 0xb9, 0xb9, 0x05, 0x55, 0x55, +0xbf, 0xd1, 0x75, 0x1d, 0xc3, 0xc3, 0xc3, 0xc8, 0xe7, 0xf3, 0xd1, 0xe6, +0x72, 0xaa, 0x21, 0x97, 0x97, 0x49, 0xb4, 0x91, 0xad, 0x20, 0x5b, 0x4b, +0x9e, 0xef, 0xfb, 0x3e, 0x3c, 0xcf, 0x83, 0xeb, 0xba, 0x28, 0x16, 0x8b, +0x58, 0x5b, 0x5b, 0x83, 0xeb, 0xba, 0x32, 0x80, 0x15, 0xcb, 0xb2, 0x7e, +0x75, 0xa8, 0xd6, 0xa2, 0xa2, 0x28, 0x73, 0x41, 0x10, 0xdc, 0x02, 0x90, +0x5f, 0x5f, 0x5f, 0x87, 0xaa, 0xaa, 0xe8, 0xea, 0xea, 0x02, 0x21, 0x04, +0x9a, 0xa6, 0x45, 0x94, 0x11, 0xb9, 0x7a, 0xbc, 0x06, 0x8e, 0xf7, 0x81, +0xe2, 0xd5, 0x9c, 0x38, 0x27, 0xc2, 0x51, 0xb8, 0xae, 0x8b, 0x9d, 0x9d, +0x1d, 0xac, 0xaf, 0xaf, 0xc3, 0xf7, 0xfd, 0x38, 0xf7, 0x27, 0x8f, 0xd4, +0xdc, 0x9d, 0x99, 0x99, 0xf9, 0x8e, 0x10, 0xf2, 0x17, 0x5d, 0xd7, 0x91, +0x4a, 0xa5, 0x30, 0x34, 0x34, 0x84, 0x6c, 0x36, 0x1b, 0x79, 0x8d, 0x78, +0xe6, 0x98, 0x94, 0x66, 0xc7, 0xdd, 0xaf, 0x2c, 0xb8, 0xac, 0xf9, 0xcd, +0xcd, 0x4d, 0x6c, 0x6d, 0x6d, 0xc1, 0x75, 0xdd, 0xb6, 0xc2, 0x1e, 0xc0, +0x94, 0x65, 0x59, 0x7f, 0x3d, 0x72, 0x77, 0x7a, 0x7a, 0x7a, 0xfa, 0x85, +0xa2, 0x28, 0xb7, 0x44, 0x63, 0xf6, 0xec, 0xd9, 0xb3, 0xc8, 0xe5, 0x72, +0xd0, 0x34, 0xad, 0x8d, 0xcb, 0x72, 0xa5, 0x26, 0xd7, 0xb4, 0x72, 0x62, +0x28, 0x9f, 0x19, 0x21, 0xbc, 0x6d, 0xdb, 0xd8, 0xd8, 0xd8, 0x40, 0xad, +0x56, 0x83, 0xeb, 0xba, 0xd1, 0x6f, 0x5a, 0x73, 0x17, 0x2c, 0xcb, 0xfa, +0xe3, 0xb1, 0xee, 0xc8, 0x14, 0x45, 0x99, 0xf4, 0x7d, 0x7f, 0x89, 0x73, +0x7e, 0x29, 0x0c, 0x43, 0x7c, 0xfc, 0xf8, 0x11, 0xfd, 0xfd, 0xfd, 0xe8, +0xef, 0xef, 0x87, 0x61, 0x18, 0xd0, 0x34, 0xed, 0x0b, 0x6e, 0xcb, 0xe9, +0xaf, 0xec, 0x5a, 0x45, 0x02, 0x17, 0x04, 0x01, 0x1a, 0x8d, 0x06, 0xb6, +0xb7, 0xb7, 0x51, 0x2c, 0x16, 0xdb, 0x3a, 0xd9, 0x92, 0xe6, 0x3b, 0x12, +0xbe, 0xa3, 0xee, 0xf4, 0x83, 0x07, 0x0f, 0xf2, 0x41, 0x10, 0x2c, 0x29, +0x8a, 0x72, 0x49, 0x51, 0x14, 0x68, 0x9a, 0x86, 0x54, 0x2a, 0x85, 0xde, +0xde, 0x5e, 0xe4, 0xf3, 0x79, 0x98, 0xa6, 0xd9, 0x16, 0x1f, 0xe2, 0x94, +0x91, 0x6f, 0x69, 0xea, 0xf5, 0x3a, 0xaa, 0xd5, 0x2a, 0x4a, 0xa5, 0x52, +0x44, 0x17, 0xe1, 0x3a, 0xa5, 0xf3, 0xd3, 0xb1, 0xf0, 0x1d, 0xb7, 0xd7, +0xa7, 0xa7, 0xa7, 0xf3, 0x9e, 0xe7, 0xbd, 0xa0, 0x94, 0x8e, 0x8b, 0xac, +0x51, 0x78, 0xa5, 0xae, 0xae, 0x2e, 0xa4, 0xd3, 0x69, 0x64, 0x32, 0x99, +0xc8, 0x22, 0x22, 0x12, 0x7b, 0x9e, 0x87, 0xdd, 0xdd, 0x5d, 0x38, 0x8e, +0x13, 0x75, 0xde, 0x44, 0x0f, 0x28, 0x76, 0xc5, 0x14, 0xb9, 0x4b, 0xcb, +0xb2, 0xe6, 0x7e, 0xb4, 0x5b, 0xca, 0x7b, 0xf7, 0xee, 0xcd, 0x12, 0x42, +0x66, 0xe4, 0xa8, 0x2c, 0x02, 0x5b, 0x92, 0x05, 0x92, 0xee, 0x06, 0xe2, +0x1d, 0x3d, 0x11, 0xa8, 0x00, 0x4c, 0x5a, 0x96, 0xf5, 0xfd, 0x8f, 0x7e, +0xcd, 0x7a, 0xf7, 0xee, 0xdd, 0x4b, 0x84, 0x10, 0x8b, 0x10, 0x32, 0x21, +0xf3, 0x3e, 0xde, 0x72, 0x89, 0x5f, 0x37, 0x25, 0xb5, 0x1b, 0x5b, 0xf9, +0xbd, 0x75, 0x58, 0xad, 0x7f, 0x95, 0x5b, 0xca, 0xa9, 0xa9, 0xa9, 0x71, +0x42, 0xc8, 0x24, 0x21, 0xe4, 0x36, 0x21, 0x24, 0x9f, 0xd4, 0xb5, 0x90, +0x01, 0xc4, 0x9a, 0x57, 0x2b, 0x00, 0xac, 0xbd, 0x12, 0xb4, 0xff, 0xf9, +0x45, 0xf7, 0xd4, 0xd4, 0xd4, 0x2d, 0x00, 0x63, 0xad, 0xb6, 0xc7, 0x50, +0x6b, 0xc8, 0x55, 0xd4, 0x4a, 0x8b, 0x26, 0x4b, 0x00, 0x96, 0x2c, 0xcb, +0x5a, 0xfb, 0x5a, 0xb7, 0xfd, 0xe4, 0xe7, 0x7f, 0xf6, 0xf8, 0x19, 0xc0, +0xf1, 0x9e, 0xff, 0x00, 0xfa, 0xaf, 0x56, 0xc2, 0x2b, 0xc9, 0x92, 0xd5, +0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, +}; diff --git a/Source/Core/DolphinWX/resources/toolbar_stop_dis.xpm b/Source/Core/DolphinWX/resources/toolbar_stop_dis.xpm new file mode 100644 index 0000000000..615fd3693b --- /dev/null +++ b/Source/Core/DolphinWX/resources/toolbar_stop_dis.xpm @@ -0,0 +1,128 @@ +/* XPM */ +static char *toolbar_stop_dis_xpm[] = { +/* columns rows colors chars-per-pixel */ +"48 48 74 1", +" c #566167", +". c #576268", +"X c #5C666C", +"o c #5E686E", +"O c #5F6970", +"+ c #626D74", +"@ c #657077", +"# c #667279", +"$ c #69757D", +"% c #6B787F", +"& c #6D7A83", +"* c #717E87", +"= c #727F88", +"- c #74838C", +"; c #768791", +": c #7B8B95", +"> c #7F8E98", +", c #838C92", +"< c #808F98", +"1 c #869095", +"2 c #84939C", +"3 c #8B959A", +"4 c #8D989E", +"5 c #8696A0", +"6 c #8896A0", +"7 c #8B9AA4", +"8 c #8E9EA8", +"9 c #909FA9", +"0 c #94A2AB", +"q c #99A6AE", +"w c #97A6B0", +"e c #9DAAB2", +"r c #A1AEB6", +"t c #A5B0B7", +"y c #A6B2BA", +"u c #AAB6BD", +"i c #ACB8BF", +"p c #AEB9C1", +"a c #B2BDC5", +"s c #B6C0C7", +"d c #B7C1C8", +"f c #BBC5CC", +"g c #BFC8CF", +"h c #C0C8CF", +"j c #CDCCCC", +"k c #D0CFCF", +"l c #C4CDD3", +"z c #C9CFD5", +"x c #C7D0D5", +"c c #C9D1D7", +"v c #CDD5DB", +"b c #CFD8DD", +"n c #D4D3D3", +"m c #D1D6DA", +"M c #D2D9DE", +"N c #DCDBDB", +"B c #E0DFDF", +"V c #D6DCE1", +"C c #D8DFE3", +"Z c #DCE1E5", +"A c #DFE4E8", +"S c #E3E3E3", +"D c #E8E7E7", +"F c #E1E6E9", +"G c #E5E9ED", +"H c #EBECEC", +"J c #EAEEF1", +"K c #EDF0F2", +"L c #F3F4F4", +"P c #F8F7F7", +"I c #F5F7F8", +"U c #F7F8F9", +"Y c #FDFEFE", +"T c None", +/* pixels */ +"TTTTTTTTTTTTTTTTTTTTnnnnnnkjTTTTTTTTTTTTTTTTTTTT", +"TTTTTTTTTTTTTTTTnNSHLUYYYYPLHSnjTTTTTTTTTTTTTTTT", +"TTTTTTTTTTTTTTNDLYYYYULHHLUYYYYLSnTTTTTTTTTTTTTT", +"TTTTTTTTTTTTNHYYYHcu02<::<20ucHYYPDnTTTTTTTTTTTT", +"TTTTTTTTTTnDYYYme>--;:>>>::;-->emYYISjTTTTTTTTTT", +"TTTTTTTTTNLYYM0;;>680qqeeqq086>;;0MYYHnTTTTTTTTT", +"TTTTTTTTSUYKt::20errrrrrrrrrrre02:;rLYLnTTTTTTTT", +"TTTTTTTSYYC7:50rtttyyyyyyyyyyttrr02:7CYLNTTTTTTT", +"TTTTTTSYYm229ryyuuuippppppppiuuyyye822mYLnTTTTTT", +"TTTTTNUYM25qyuippaaaaaaaaaaaaapppuuyq52mYLnTTTTT", +"TTTTnIYZ77euppaaasddfffffffdddaaaapiue66ZYHjTTTT", +"TTTTHYLq7epaaasdffffgggggggfffffdsaappe70LYBTTTT", +"TTTBYYa7eaaadffgghllllllllllllggffddaape7aYInTTT", +"TTTLYZ9easdffgllllxcccccccccxzlllggfddape8ZYDTTT", +"TTSYYuwidffglllxccvvvbbbbbvvvvcczlllgfddu0yYPnTT", +"TTLYZwydfgllzccvMMMMMMMMMMMMVVMMvcxllgffstqZYSTT", +"TNYYdeagglzcvvbMlfgggggggfffffflMbvcxllgfaedYLjT", +"TDYLyfgllxcvbbbM4#&*----*&%$#+X,VbbbvczlggftLYnT", +"THYCybvlcvbbbbbM4#&*----*&&$@+X,VbbbbvcxlvbyCYST", +"TIYlaVCcvbbbbbmV4$&=----*&&$#+X,VmbbbbvccCVplYHT", +"NYYffCZVvbbbbMMM3#&*----*&%$#+X,VMmbbbbvVZVfdYLj", +"NYUdlCZAVvbmMMvc1#&&****&&$$@+X,cvMMbbvVZZClaYPj", +"SYUfcCZAAVbMbclc1@%&&&&&&%$#@+X,clcbMbMAZZCzsUUn", +"SYLfcCZAAAVvzllc1+$%%&&%$$#@++.,cllzvVAAZZCcfLYn", +"SYLgcCZAAFFvllxc1+#$$$$$$#@++o.,vxllvAFAZZCcfLYn", +"SYUlcCZAAAZAMxzc,O@@#####+++Oo.,czxMZZZAZZCclUUn", +"SYYzcCZAZCZZFZmc,X+++++++++ooo.,cmZFZCCZZZCczYPn", +"BYYvlVZZCCZZAFGG1.O++++++Ooooo.1FGFAZCVVZZVlvYLk", +"TPYVlVZCMVCZAFFJ3.oooooooooooo.3JFAZZCVMVZVlVYHT", +"TLYGlMCMMVCZZAFJ3 oooooooooooo 3GFAZZCVMMCblGYDT", +"TDYIlvMMMVCZZZFG3.oooooooooooo.3GAZZCVVMbMclIYNT", +"TSYYMlvmMVVCZZAFmcvvmmmmmmmmvczmFAZZCVVMbvlMYLnT", +"TTLYHlvbMMVVZZZAGGJJJKKKKKKJJGGGAZZCVVMMvclHYDTT", +"TTDYYvzvbMVVCZZZAFFFFGGGGGGFFFAAZZCVVMMbvlvYYNTT", +"TTTPYJlcbMMVVCCZZZAFFFFFFFFFFAZZZCVVVMMvclHYHTTT", +"TTTDYYMlvbMMVVCZZZZAAAAFAAAAZZZZCVVVMmbvlMYYNTTT", +"TTTTLYUcxvbMMVVVCZZZZZZZZZZZZZCCVVVMMbvxcUYDTTTT", +"TTTTBYYKzcvbMMVVVCCCZZZZZZZZCCCVVMMMbvczKYLnTTTT", +"TTTTTDYYHlcvbMMMVVVCCCCCCCCCVVVVMMbbvclHYUNTTTTT", +"TTTTTTHYYHxcvvbMMMVVVVVVVVVVVMMMMbvvczHYYSTTTTTT", +"TTTTTTTHYYKvzvvbmMMMMVVVVVMMMMMbvvvzvKYYSTTTTTTT", +"TTTTTTTTHYYUVzcvvbbMMMMMMMMMMbvvvczVUYUSTTTTTTTT", +"TTTTTTTTTDYYYJMxcvvvvbvbbvbvvvvcxMJYYLNTTTTTTTTT", +"TTTTTTTTTTSLYYYJVcxccvvvvvvccxcVJYYYHnTTTTTTTTTT", +"TTTTTTTTTTTTDPYYYIHZMvvvvvvMZHIYYYLBTTTTTTTTTTTT", +"TTTTTTTTTTTTTTDLYYYYYYUIIUYYYYYULSTTTTTTTTTTTTTT", +"TTTTTTTTTTTTTTTTSDLPYYYYYYYYIHDNTTTTTTTTTTTTTTTT", +"TTTTTTTTTTTTTTTTTTTTSSSSSSBNTTTTTTTTTTTTTTTTTTTT" +}; diff --git a/Source/Core/DolphinWX/src/BootManager.cpp b/Source/Core/DolphinWX/src/BootManager.cpp new file mode 100644 index 0000000000..52778bd2e2 --- /dev/null +++ b/Source/Core/DolphinWX/src/BootManager.cpp @@ -0,0 +1,98 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include +#include + +#include "Globals.h" +#include "Common.h" +#include "BootManager.h" +#include "ISOFile.h" +#include "Volume.h" +#include "VolumeCreator.h" +#include "Config.h" +#include "Core.h" +#include "frame.h" +#include "CodeWindow.h" + +static std::string s_DataBasePath_EUR = "Data_EUR"; +static std::string s_DataBasePath_USA = "Data_USA"; +static std::string s_DataBasePath_JAP = "Data_JAP"; + +extern CFrame* main_frame; +extern CCodeWindow* code_frame; + +namespace BootManager +{ +#ifdef _WIN32 +extern "C" HINSTANCE wxGetInstance(); +#endif + + + + + + + +bool BootCore(const std::string& _rFilename) +{ + SCoreStartupParameter StartUp = SConfig::GetInstance().m_LocalCoreStartupParameter; + + if (code_frame) + { + StartUp.bUseDualCore = code_frame->UseDualCore(); + StartUp.bUseDynarec = !code_frame->UseInterpreter(); + } + else + { + StartUp.bUseDualCore = false; + StartUp.bUseDynarec = true; + } + + StartUp.m_BootType = SCoreStartupParameter::BOOT_ISO; + StartUp.m_strFilename = _rFilename; + StartUp.bHLEBios = true; + StartUp.bRunCompareClient = false; + StartUp.bRunCompareServer = false; + StartUp.bEnableDebugging = code_frame ? true : false; // RUNNING_DEBUG + std::string BaseDataPath; + #ifdef _WIN32 + StartUp.hInstance = wxGetInstance(); + #endif + + // + StartUp.AutoSetup(SCoreStartupParameter::BOOT_DEFAULT); + StartUp.hMainWindow = main_frame->GetRenderHandle(); + + // init the core + if (!Core::Init(StartUp)) + { + PanicAlert("Couldn't init the core.\nCheck your configuration."); + return(false); + } + + Core::SetState(code_frame ? Core::CORE_PAUSE : Core::CORE_RUN); + return(true); +} + + +void Stop() +{ + Core::Stop(); +} +} // namespace + diff --git a/Source/Core/DolphinWX/src/BootManager.h b/Source/Core/DolphinWX/src/BootManager.h new file mode 100644 index 0000000000..1d33c16cb5 --- /dev/null +++ b/Source/Core/DolphinWX/src/BootManager.h @@ -0,0 +1,32 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef _BOOTMANAGER_H +#define _BOOTMANAGER_H + +#include + +class CISOFile; + +namespace BootManager +{ +bool BootCore(const std::string& _rFilename); + +void Stop(); +}; + +#endif diff --git a/Source/Core/DolphinWX/src/Config.cpp b/Source/Core/DolphinWX/src/Config.cpp new file mode 100644 index 0000000000..afd5608ceb --- /dev/null +++ b/Source/Core/DolphinWX/src/Config.cpp @@ -0,0 +1,121 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include + +#include "Globals.h" +#include "Common.h" +#include "IniFile.h" +#include "Config.h" + +SConfig SConfig::m_Instance; + + +SConfig::SConfig() +{ + LoadSettings(); +} + + +SConfig::~SConfig() +{ + SaveSettings(); +} + + +void SConfig::SaveSettings() +{ + IniFile ini; + ini.Load("Dolphin.ini"); // yes we must load first to not kill unknown stuff + + // misc + { + ini.Set("General", "LastFilename", m_LastFilename); + + // ISO folders + ini.Set("General", "GCMPathes", (int)m_ISOFolder.size()); + + for (size_t i = 0; i < m_ISOFolder.size(); i++) + { + TCHAR tmp[16]; + sprintf(tmp, "GCMPath%i", (int)i); + ini.Set("General", tmp, m_ISOFolder[i]); + } + } + + // core + { + ini.Set("Core", "GFXPlugin", m_LocalCoreStartupParameter.m_strVideoPlugin); + ini.Set("Core", "DSPPlugin", m_LocalCoreStartupParameter.m_strDSPPlugin); + ini.Set("Core", "PadPlugin", m_LocalCoreStartupParameter.m_strPadPlugin); + + ini.Set("Core", "HLEBios", m_LocalCoreStartupParameter.bHLEBios); + ini.Set("Core", "UseDynarec", m_LocalCoreStartupParameter.bUseDynarec); + ini.Set("Core", "UseDualCore", m_LocalCoreStartupParameter.bUseDualCore); + ini.Set("Core", "Throttle", m_LocalCoreStartupParameter.bThrottle); + ini.Set("Core", "DefaultGCM", m_LocalCoreStartupParameter.m_strDefaultGCM); + } + + ini.Save("Dolphin.ini"); +} + + +void SConfig::LoadSettings() +{ + IniFile ini; + ini.Load("Dolphin.ini"); + + // hard coded default plugin + { + ini.Get("Default", "GFXPlugin", &m_DefaultGFXPlugin); + ini.Get("Default", "DSPPlugin", &m_DefaultDSPPlugin); + ini.Get("Default", "PadPlugin", &m_DefaultPADPlugin); + } + + // misc + { + ini.Get("General", "LastFilename", &m_LastFilename); + + m_ISOFolder.clear(); + int numGCMPaths; + + if (ini.Get("General", "GCMPathes", &numGCMPaths, 0)) + { + for (int i = 0; i < numGCMPaths; i++) + { + TCHAR tmp[16]; + sprintf(tmp, "GCMPath%i", i); + std::string tmpPath; + ini.Get("General", tmp, &tmpPath, ""); + m_ISOFolder.push_back(tmpPath); + } + } + } + + // core + { + ini.Get("Core", "GFXPlugin", &m_LocalCoreStartupParameter.m_strVideoPlugin, m_DefaultGFXPlugin.c_str()); + ini.Get("Core", "DSPPlugin", &m_LocalCoreStartupParameter.m_strDSPPlugin, m_DefaultDSPPlugin.c_str()); + ini.Get("Core", "PadPlugin", &m_LocalCoreStartupParameter.m_strPadPlugin, m_DefaultPADPlugin.c_str()); + + ini.Get("Core", "UseDynarec", &m_LocalCoreStartupParameter.bUseDynarec, false); + ini.Get("Core", "UseDualCore", &m_LocalCoreStartupParameter.bUseDualCore, false); + ini.Get("Core", "Throttle", &m_LocalCoreStartupParameter.bThrottle, true); + } +} + + diff --git a/Source/Core/DolphinWX/src/Config.h b/Source/Core/DolphinWX/src/Config.h new file mode 100644 index 0000000000..cdb28b2b9d --- /dev/null +++ b/Source/Core/DolphinWX/src/Config.h @@ -0,0 +1,63 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef _CONFIG_H +#define _CONFIG_H + +#include +#include + +#include "Boot/Boot.h" + +struct SConfig +{ + // default plugins ... hard coded inside the ini + std::string m_DefaultGFXPlugin; + std::string m_DefaultDSPPlugin; + std::string m_DefaultPADPlugin; + + // name of the last used filename + std::string m_LastFilename; + + // gcm folder + std::vectorm_ISOFolder; + + SCoreStartupParameter m_LocalCoreStartupParameter; + + // save settings + void SaveSettings(); + + + // load settings + void LoadSettings(); + + + static SConfig& GetInstance() {return(m_Instance);} + + + private: + + // constructor + SConfig(); + + // destructor + ~SConfig(); + + static SConfig m_Instance; +}; + +#endif diff --git a/Source/Core/DolphinWX/src/FileSearch.cpp b/Source/Core/DolphinWX/src/FileSearch.cpp new file mode 100644 index 0000000000..580d6c6bdd --- /dev/null +++ b/Source/Core/DolphinWX/src/FileSearch.cpp @@ -0,0 +1,118 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "Globals.h" +#ifndef _WIN32 +#include +#include +#else +#include +#endif + +#include + +#include "FileSearch.h" + +#include "StringUtil.h" + + +CFileSearch::CFileSearch(const CFileSearch::XStringVector& _rSearchStrings, const CFileSearch::XStringVector& _rDirectories) +{ + // Reverse the loop order for speed? + for (size_t j = 0; j < _rSearchStrings.size(); j++) + { + for (size_t i = 0; i < _rDirectories.size(); i++) + { + FindFiles(_rSearchStrings[j], _rDirectories[i]); + } + } +} + + +void CFileSearch::FindFiles(const std::string& _searchString, const std::string& _strPath) +{ + std::string GCMSearchPath; + BuildCompleteFilename(GCMSearchPath, _strPath, _searchString); +#ifdef _WIN32 + WIN32_FIND_DATA findData; + HANDLE FindFirst = FindFirstFile(GCMSearchPath.c_str(), &findData); + + if (FindFirst != INVALID_HANDLE_VALUE) + { + bool bkeepLooping = true; + + while (bkeepLooping) + { + std::string strFilename; + BuildCompleteFilename(strFilename, _strPath, findData.cFileName); + + m_FileNames.push_back(strFilename); + + bkeepLooping = FindNextFile(FindFirst, &findData) ? true : false; + } + } + +#else + int dot_pos = _searchString.rfind("."); + + if (dot_pos == std::string::npos) + { + return; + } + + std::string ext = _searchString.substr(dot_pos); + DIR* dir = opendir(_strPath.c_str()); + + if (!dir) + { + return; + } + + dirent* dp; + + while (true) + { + dp = readdir(dir); + + if (!dp) + { + break; + } + + char temp[612]; + strcpy(temp, dp->d_name); + std::string s(temp); + + // TODO - case insensitive comparison + if ((s.size() > ext.size()) && (s.substr(s.size() - ext.size()) == ext)) + { + std::string full_name = _strPath + "/" + s; + m_FileNames.push_back(full_name); + } + } + + closedir(dir); +#endif +} + + +const CFileSearch::XStringVector& CFileSearch::GetFileNames() const +{ + return(m_FileNames); +} + + diff --git a/Source/Core/DolphinWX/src/FileSearch.h b/Source/Core/DolphinWX/src/FileSearch.h new file mode 100644 index 0000000000..4f0d7f7c09 --- /dev/null +++ b/Source/Core/DolphinWX/src/FileSearch.h @@ -0,0 +1,44 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef __FILESEARCH_H_ +#define __FILESEARCH_H_ + +#include +#include + +class CFileSearch +{ + public: + + typedef std::vectorXStringVector; + + CFileSearch(const XStringVector& _rSearchStrings, const XStringVector& _rDirectories); + + const XStringVector& GetFileNames() const; + + + private: + + void FindFiles(const std::string& _searchString, const std::string& _strPath); + + + XStringVector m_FileNames; +}; + +#endif + diff --git a/Source/Core/DolphinWX/src/Frame.cpp b/Source/Core/DolphinWX/src/Frame.cpp new file mode 100644 index 0000000000..6c3bfcec6a --- /dev/null +++ b/Source/Core/DolphinWX/src/Frame.cpp @@ -0,0 +1,621 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "Globals.h" +#include "Frame.h" + +#include "GameListCtrl.h" +#include "BootManager.h" + +#include "Common.h" +#include "Config.h" +#include "Core.h" +#include "PluginOptions.h" +#include "PluginManager.h" + +#include "wx/mstream.h" + +// ---------------------------------------------------------------------------- +// resources +// ---------------------------------------------------------------------------- + +extern "C" { +#include "../resources/Dolphin.c" +#include "../resources/toolbar_browse.c" +#include "../resources/toolbar_file_open.c" +#include "../resources/toolbar_fullscreen.c" +#include "../resources/toolbar_help.c" +#include "../resources/toolbar_pause.c" +#include "../resources/toolbar_play.c" +#include "../resources/toolbar_play_dis.c" +#include "../resources/toolbar_plugin_dsp.c" +#include "../resources/toolbar_plugin_gfx.c" +#include "../resources/toolbar_plugin_options.c" +#include "../resources/toolbar_plugin_options_dis.c" +#include "../resources/toolbar_plugin_pad.c" +#include "../resources/toolbar_refresh.c" +#include "../resources/toolbar_stop.c" +#include "../resources/toolbar_stop_dis.c" +}; + +#define wxGetBitmapFromMemory(name) _wxGetBitmapFromMemory(name, sizeof(name)) +inline wxBitmap _wxGetBitmapFromMemory(const unsigned char* data, int length) +{ + wxMemoryInputStream is(data, length); + return(wxBitmap(wxImage(is, wxBITMAP_TYPE_ANY, -1), -1)); +} + + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +static const long TOOLBAR_STYLE = wxTB_FLAT | wxTB_DOCKABLE | wxTB_TEXT; + +// ---------------------------------------------------------------------------- +// event tables +// ---------------------------------------------------------------------------- + +// Notice that wxID_HELP will be processed for the 'About' menu and the toolbar +// help button. + +const wxEventType wxEVT_HOST_COMMAND = wxNewEventType(); + +BEGIN_EVENT_TABLE(CFrame, wxFrame) +EVT_MENU(wxID_OPEN, CFrame::OnOpen) +EVT_MENU(wxID_EXIT, CFrame::OnQuit) +EVT_MENU(wxID_HELP, CFrame::OnAbout) +EVT_MENU(IDM_ABOUT, CFrame::OnAbout) +EVT_MENU(wxID_REFRESH, CFrame::OnRefresh) +EVT_MENU(IDM_PLAY, CFrame::OnPlay) +EVT_MENU(IDM_STOP, CFrame::OnStop) +EVT_MENU(IDM_PLUGIN_OPTIONS, CFrame::OnPluginOptions) +EVT_MENU(IDM_CONFIG_GFX_PLUGIN, CFrame::OnPluginGFX) +EVT_MENU(IDM_CONFIG_DSP_PLUGIN, CFrame::OnPluginDSP) +EVT_MENU(IDM_CONFIG_PAD_PLUGIN, CFrame::OnPluginPAD) +EVT_MENU(IDM_BROWSE, CFrame::OnBrowse) +EVT_MENU(IDM_TOGGLE_FULLSCREEN, CFrame::OnToggleFullscreen) +EVT_HOST_COMMAND(wxID_ANY, CFrame::OnHostMessage) +END_EVENT_TABLE() + +// ---------------------------------------------------------------------------- +// implementation +// ---------------------------------------------------------------------------- + +CFrame::CFrame(wxFrame* parent, + wxWindowID id, + const wxString& title, + const wxPoint& pos, + const wxSize& size, + long style) + : wxFrame(parent, id, title, pos, size, style) + , m_pMenuBar(NULL) + , m_Panel(NULL) + , m_pBootProcessDialog(NULL) +{ + InitBitmaps(); + + // Give it an icon + wxIcon IconTemp; + IconTemp.CopyFromBitmap(wxGetBitmapFromMemory(dolphin_png)); + SetIcon(IconTemp); + + // Give it a status line + CreateStatusBar(); + CreateMenu(); + + // this panel is the parent for rendering and it holds the gamelistctrl + { + m_Panel = new wxPanel(this); + + m_GameListCtrl = new CGameListCtrl(m_Panel, LIST_CTRL, + wxDefaultPosition, wxDefaultSize, + wxLC_REPORT | wxSUNKEN_BORDER | wxLC_ALIGN_LEFT | wxLC_SINGLE_SEL | wxLC_SORT_ASCENDING); + + wxBoxSizer* sizerPanel = new wxBoxSizer(wxHORIZONTAL); + sizerPanel->Add(m_GameListCtrl, 2, wxEXPAND | wxALL); + m_Panel->SetSizer(sizerPanel); + + sizerPanel->SetSizeHints(m_Panel); + sizerPanel->Fit(m_Panel); + } + + // Create the toolbar + RecreateToolbar(); + + Show(); + + CPluginManager::GetInstance().ScanForPlugins(this); + + m_GameListCtrl->Update(); + + wxTheApp->Connect(wxID_ANY, wxEVT_KEY_DOWN, + wxKeyEventHandler(CFrame::OnKeyDown), + (wxObject*)0, this); + + UpdateGUI(); +} + + +void +CFrame::CreateMenu() +{ + delete m_pMenuBar; + m_pMenuBar = new wxMenuBar(wxMB_DOCKABLE); + + // file menu + { + wxMenu* fileMenu = new wxMenu; + { + wxMenuItem* pItem = fileMenu->Append(wxID_OPEN, _T("&Open...")); + pItem->SetBitmap(m_BitmapsMenu[Toolbar_FileOpen]); + } + { + wxMenuItem* pItem = fileMenu->Append(wxID_REFRESH, _T("&Refresh")); + pItem->SetBitmap(m_BitmapsMenu[Toolbar_Refresh]); + } + + { + wxMenuItem* pItem = fileMenu->Append(IDM_BROWSE, _T("&Browse for ISOs...")); + pItem->SetBitmap(m_BitmapsMenu[Toolbar_Browse]); + } +/* + fileMenu->AppendSeparator(); + wxMenuItem* LoadState = fileMenu->Append(IDM_LOADSTATE, _T("&Load State...")); + LoadState->Enable(false); + wxMenuItem* SaveState = fileMenu->Append(IDM_SAVESTATE, _T("&Save State...")); + SaveState->Enable(false); +*/ + fileMenu->AppendSeparator(); + fileMenu->Append(wxID_EXIT, _T("E&xit"), _T("")); + m_pMenuBar->Append(fileMenu, _T("&File")); + } + + // emulation menu + { + wxMenu* pEmulationMenu = new wxMenu; + // play + { + m_pMenuItemPlay = new wxMenuItem(pEmulationMenu, IDM_PLAY, _T("&Play")); + m_pMenuItemPlay->SetBitmap(m_BitmapsMenu[Toolbar_Play]); + m_pMenuItemPlay->SetDisabledBitmap(m_BitmapsMenu[Toolbar_Play_Dis]); + pEmulationMenu->Append(m_pMenuItemPlay); + } + // stop + { + m_pMenuItemStop = new wxMenuItem(pEmulationMenu, IDM_STOP, _T("&Stop")); + m_pMenuItemStop->SetBitmap(m_BitmapsMenu[Toolbar_Stop]); + m_pMenuItemStop->SetDisabledBitmap(m_BitmapsMenu[Toolbar_Stop_Dis]); + pEmulationMenu->Append(m_pMenuItemStop); + } + pEmulationMenu->AppendSeparator(); + // full screen + { + wxMenuItem* pItem = new wxMenuItem(pEmulationMenu, IDM_TOGGLE_FULLSCREEN, _T("&Fullscreen")); + pItem->SetBitmap(m_BitmapsMenu[Toolbar_FullScreen]); + pEmulationMenu->Append(pItem); + } + m_pMenuBar->Append(pEmulationMenu, _T("&Emulation")); + } + + // plugin menu + { + wxMenu* pPluginMenu = new wxMenu; + { + m_pPluginOptions = pPluginMenu->Append(IDM_PLUGIN_OPTIONS, _T("&Choose Plugins...")); + m_pPluginOptions->SetBitmap(m_BitmapsMenu[Toolbar_PluginOptions]); + m_pPluginOptions->SetDisabledBitmap(m_BitmapsMenu[Toolbar_PluginOptions_Dis]); + } + pPluginMenu->AppendSeparator(); + { + wxMenuItem* pItem = pPluginMenu->Append(IDM_CONFIG_GFX_PLUGIN, _T("&GFX plugin settings...")); + pItem->SetBitmap(m_BitmapsMenu[Toolbar_PluginGFX]); + } + { + wxMenuItem* pItem = pPluginMenu->Append(IDM_CONFIG_DSP_PLUGIN, _T("&DSP plugin settings...")); + pItem->SetBitmap(m_BitmapsMenu[Toolbar_PluginDSP]); + } + { + wxMenuItem* pItem = pPluginMenu->Append(IDM_CONFIG_PAD_PLUGIN, _T("&PAD plugin settings...")); + pItem->SetBitmap(m_BitmapsMenu[Toolbar_PluginPAD]); + } + m_pMenuBar->Append(pPluginMenu, _T("&Plugins")); + } + + // help menu + { + wxMenu* helpMenu = new wxMenu; + { + wxMenuItem* pItem = helpMenu->Append(wxID_HELP, _T("&Help")); + pItem->SetBitmap(m_BitmapsMenu[Toolbar_Help]); + } + helpMenu->Append(wxID_HELP, _T("&About...")); + m_pMenuBar->Append(helpMenu, _T("&Help")); + } + + // Associate the menu bar with the frame + SetMenuBar(m_pMenuBar); +} + + +void +CFrame::PopulateToolbar(wxToolBar* toolBar) +{ + int w = m_Bitmaps[Toolbar_FileOpen].GetWidth(), + h = m_Bitmaps[Toolbar_FileOpen].GetHeight(); + + toolBar->SetToolBitmapSize(wxSize(w, h)); + toolBar->AddTool(wxID_OPEN, _T("Open"), m_Bitmaps[Toolbar_FileOpen], _T("Open file...")); + toolBar->AddTool(wxID_REFRESH, _T("Refresh"), m_Bitmaps[Toolbar_Refresh], _T("Refresh")); + toolBar->AddTool(IDM_BROWSE, _T("Browse"), m_Bitmaps[Toolbar_Browse], _T("Browse for an ISO directory...")); + toolBar->AddSeparator(); + toolBar->AddTool(IDM_PLAY, _T("Play"), m_Bitmaps[Toolbar_Play], _T("Play")); + toolBar->SetToolDisabledBitmap(IDM_PLAY, m_Bitmaps[Toolbar_Play_Dis]); + toolBar->AddTool(IDM_STOP, _T("Stop"), m_Bitmaps[Toolbar_Stop], _T("Stop")); + toolBar->SetToolDisabledBitmap(IDM_STOP, m_Bitmaps[Toolbar_Stop_Dis]); + toolBar->AddTool(IDM_TOGGLE_FULLSCREEN, _T("Fullscr."), m_Bitmaps[Toolbar_FullScreen], _T("Toggle Fullscreen")); + toolBar->AddSeparator(); + toolBar->AddTool(IDM_PLUGIN_OPTIONS, _T("Plugins"), m_Bitmaps[Toolbar_PluginOptions], _T("Plugin Selection...")); + toolBar->SetToolDisabledBitmap(IDM_PLUGIN_OPTIONS, m_Bitmaps[Toolbar_PluginOptions_Dis]); + toolBar->AddTool(IDM_CONFIG_GFX_PLUGIN, _T("GFX"), m_Bitmaps[Toolbar_PluginGFX], _T("GFX Plugin...")); + toolBar->AddTool(IDM_CONFIG_DSP_PLUGIN, _T("DSP"), m_Bitmaps[Toolbar_PluginDSP], _T("DSP Plugin...")); + toolBar->AddTool(IDM_CONFIG_PAD_PLUGIN, _T("PAD"), m_Bitmaps[Toolbar_PluginPAD], _T("PAD Plugin...")); + toolBar->AddSeparator(); + toolBar->AddTool(wxID_HELP, _T("About"), m_Bitmaps[Toolbar_Help], _T("About Dolphin")); + + // after adding the buttons to the toolbar, must call Realize() to reflect + // the changes + toolBar->Realize(); +} + + +void +CFrame::RecreateToolbar() +{ + // delete and recreate the toolbar + wxToolBarBase* toolBar = GetToolBar(); + long style = toolBar ? toolBar->GetWindowStyle() : TOOLBAR_STYLE; + + delete toolBar; + SetToolBar(NULL); + + style &= ~(wxTB_HORIZONTAL | wxTB_VERTICAL | wxTB_BOTTOM | wxTB_RIGHT | wxTB_HORZ_LAYOUT | wxTB_TOP); + wxToolBar* theToolBar = CreateToolBar(style, ID_TOOLBAR); + + PopulateToolbar(theToolBar); + SetToolBar(theToolBar); +} + + +void +CFrame::InitBitmaps() +{ + // load orignal size 48x48 + m_Bitmaps[Toolbar_FileOpen] = wxGetBitmapFromMemory(toolbar_file_open_png); + m_Bitmaps[Toolbar_Refresh] = wxGetBitmapFromMemory(toolbar_refresh_png); + m_Bitmaps[Toolbar_Browse] = wxGetBitmapFromMemory(toolbar_browse_png); + m_Bitmaps[Toolbar_Play] = wxGetBitmapFromMemory(toolbar_play_png); + m_Bitmaps[Toolbar_Play_Dis] = wxGetBitmapFromMemory(toolbar_play_dis_png); + m_Bitmaps[Toolbar_Stop] = wxGetBitmapFromMemory(toolbar_stop_png); + m_Bitmaps[Toolbar_Stop_Dis] = wxGetBitmapFromMemory(toolbar_stop_dis_png); + m_Bitmaps[Toolbar_Pause] = wxGetBitmapFromMemory(toolbar_pause_png); + m_Bitmaps[Toolbar_PluginOptions] = wxGetBitmapFromMemory(toolbar_plugin_options_png); + m_Bitmaps[Toolbar_PluginOptions_Dis] = wxGetBitmapFromMemory(toolbar_plugin_options_dis_png); + m_Bitmaps[Toolbar_PluginGFX] = wxGetBitmapFromMemory(toolbar_plugin_gfx_png); + m_Bitmaps[Toolbar_PluginDSP] = wxGetBitmapFromMemory(toolbar_plugin_dsp_png); + m_Bitmaps[Toolbar_PluginPAD] = wxGetBitmapFromMemory(toolbar_plugin_pad_png); + m_Bitmaps[Toolbar_FullScreen] = wxGetBitmapFromMemory(toolbar_fullscreen_png); + m_Bitmaps[Toolbar_Help] = wxGetBitmapFromMemory(toolbar_help_png); + + // scale to 24x24 for toolbar + for (size_t n = Toolbar_FileOpen; n < WXSIZEOF(m_Bitmaps); n++) + { + m_Bitmaps[n] = wxBitmap(m_Bitmaps[n].ConvertToImage().Scale(24, 24)); + } + + // scale to 15x15 for menu + for (size_t n = Toolbar_FileOpen; n < WXSIZEOF(m_Bitmaps); n++) + { + m_BitmapsMenu[n] = wxBitmap(m_Bitmaps[n].ConvertToImage().Scale(15, 15)); + } +} + + +void +CFrame::OnOpen(wxCommandEvent& WXUNUSED (event)) +{ + wxString path = wxFileSelector( + _T("Select the file to load"), + wxEmptyString, wxEmptyString, wxEmptyString, + wxString::Format + ( + _T("Elf files (*.elf)|*.elf|DOL files (*.dol)|*.dol|Gamecube/Wii ISO (*.iso;*.gcm)|*.iso;*.gcm|All files (%s)|%s"), + wxFileSelectorDefaultWildcardStr, + wxFileSelectorDefaultWildcardStr + ), + wxFD_OPEN | wxFD_PREVIEW, + this); + + if (!path) + { + return; + } + + BootManager::BootCore(path.c_str()); +} + + +void +CFrame::OnQuit(wxCommandEvent& WXUNUSED (event)) +{ + if (Core::GetState() != Core::CORE_UNINITIALIZED) + { + Core::Stop(); + UpdateGUI(); + } + + Close(true); +} + + +void +CFrame::OnAbout(wxCommandEvent& WXUNUSED (event)) +{ + wxAboutDialogInfo info; + info.AddDeveloper(_T("ector")); + info.AddDeveloper(_T("F|RES")); + info.AddDeveloper(_T("yaz0r")); + info.AddDeveloper(_T("zerofrog")); + +/* info.SetLicence(wxString::FromAscii( + "Dolphin Licence 1.0" + "#include GPL.TXT")); + */ + + info.AddArtist(_T("miloszwl@miloszwl.com (miloszwl.deviantart.com)")); + + wxAboutBox(info); +} + + +void +CFrame::OnHelp(wxCommandEvent& WXUNUSED (event)) +{ + wxMessageBox("missing OnHelp()"); +} + + +void +CFrame::OnPlay(wxCommandEvent& WXUNUSED (event)) +{ + if (Core::GetState() != Core::CORE_UNINITIALIZED) + { + if (Core::GetState() == Core::CORE_RUN) + { + Core::SetState(Core::CORE_PAUSE); + } + else + { + Core::SetState(Core::CORE_RUN); + } + + UpdateGUI(); + } +} + + +void +CFrame::OnStop(wxCommandEvent& WXUNUSED (event)) +{ + if (Core::GetState() != Core::CORE_UNINITIALIZED) + { + Core::Stop(); + UpdateGUI(); + } +} + + +void +CFrame::OnRefresh(wxCommandEvent& WXUNUSED (event)) +{ + if (m_GameListCtrl) + { + m_GameListCtrl->Update(); + } +} + + +void +CFrame::OnPluginOptions(wxCommandEvent& WXUNUSED (event)) +{ + CPluginOptions PluginOptions(this); + PluginOptions.ShowModal(); +} + + +void +CFrame::OnPluginGFX(wxCommandEvent& WXUNUSED (event)) +{ + CPluginManager::GetInstance().OpenConfig( + GetHandle(), + SConfig::GetInstance().m_LocalCoreStartupParameter.m_strVideoPlugin + ); +} + + +void +CFrame::OnPluginDSP(wxCommandEvent& WXUNUSED (event)) +{ + CPluginManager::GetInstance().OpenConfig( + GetHandle(), + SConfig::GetInstance().m_LocalCoreStartupParameter.m_strDSPPlugin + ); +} + + +void +CFrame::OnPluginPAD(wxCommandEvent& WXUNUSED (event)) +{ + CPluginManager::GetInstance().OpenConfig( + GetHandle(), + SConfig::GetInstance().m_LocalCoreStartupParameter.m_strPadPlugin + ); +} + + +void +CFrame::OnBrowse(wxCommandEvent& WXUNUSED (event)) +{ + m_GameListCtrl->BrowseForDirectory(); +} + + +void +CFrame::OnHostMessage(wxCommandEvent& event) +{ + switch (event.GetId()) + { + case IDM_UPDATEGUI: + UpdateGUI(); + break; + + case IDM_BOOTING_STARTED: + + if (m_pBootProcessDialog == NULL) + { + /* m_pBootProcessDialog = new wxProgressDialog + (_T("Booting the core"), + _T("Booting..."), + 1, // range + this, + wxPD_APP_MODAL | + // wxPD_AUTO_HIDE | -- try this as well + wxPD_ELAPSED_TIME | + wxPD_SMOOTH // - makes indeterminate mode bar on WinXP very small + );*/ + + m_pBootProcessDialog = new wxBusyInfo("Booting...", this); + } + + break; + + case IDM_BOOTING_ENDED: + + if (m_pBootProcessDialog != NULL) + { + // m_pBootProcessDialog->Destroy(); + delete m_pBootProcessDialog; + m_pBootProcessDialog = NULL; + } + + break; + } +} + + +void +CFrame::OnToggleFullscreen(wxCommandEvent& WXUNUSED (event)) +{ + ShowFullScreen(true); + UpdateGUI(); +} + + +void +CFrame::OnKeyDown(wxKeyEvent& event) +{ + if (((event.GetKeyCode() == WXK_RETURN) && (event.GetModifiers() == wxMOD_ALT)) || + (event.GetKeyCode() == WXK_ESCAPE)) + { + ShowFullScreen(!IsFullScreen()); + UpdateGUI(); + } + else + { + event.Skip(); + } +} + + +void +CFrame::UpdateGUI() +{ + // buttons + { + if (Core::GetState() == Core::CORE_UNINITIALIZED) + { + GetToolBar()->EnableTool(IDM_PLUGIN_OPTIONS, true); + m_pPluginOptions->Enable(true); + + GetToolBar()->EnableTool(IDM_STOP, false); + GetToolBar()->EnableTool(IDM_PLAY, false); + + m_pMenuItemPlay->Enable(false); + m_pMenuItemStop->Enable(false); + } + else + { + GetToolBar()->EnableTool(IDM_PLUGIN_OPTIONS, false); + m_pPluginOptions->Enable(false); + + GetToolBar()->EnableTool(IDM_STOP, true); + GetToolBar()->EnableTool(IDM_PLAY, true); + + m_pMenuItemPlay->Enable(true); + m_pMenuItemStop->Enable(true); + + if (Core::GetState() == Core::CORE_RUN) + { + GetToolBar()->SetToolNormalBitmap(IDM_PLAY, m_Bitmaps[Toolbar_Pause]); + GetToolBar()->SetToolShortHelp(IDM_PLAY, _T("Pause")); + + m_pMenuItemPlay->SetBitmap(m_BitmapsMenu[Toolbar_Pause]); + m_pMenuItemPlay->SetText(_T("Pause")); + } + else + { + GetToolBar()->SetToolNormalBitmap(IDM_PLAY, m_Bitmaps[Toolbar_Play]); + GetToolBar()->SetToolShortHelp(IDM_PLAY, _T("Play")); + + m_pMenuItemPlay->SetBitmap(m_BitmapsMenu[Toolbar_Play]); + m_pMenuItemPlay->SetText(_T("Play")); + } + } + } + + // gamelistctrl + { + if (Core::GetState() == Core::CORE_UNINITIALIZED) + { + if (m_GameListCtrl && !m_GameListCtrl->IsShown()) + { + m_GameListCtrl->Enable(); + m_GameListCtrl->Show(); + } + } + else + { + if (m_GameListCtrl && m_GameListCtrl->IsShown()) + { + m_GameListCtrl->Disable(); + m_GameListCtrl->Hide(); + } + } + } +} + + diff --git a/Source/Core/DolphinWX/src/Frame.h b/Source/Core/DolphinWX/src/Frame.h new file mode 100644 index 0000000000..23fc3b8c87 --- /dev/null +++ b/Source/Core/DolphinWX/src/Frame.h @@ -0,0 +1,90 @@ +#ifndef __FRAME_H_ +#define __FRAME_H_ + +class CGameListCtrl; +class CFrame + : public wxFrame +{ + public: + + CFrame(wxFrame* parent, + wxWindowID id = wxID_ANY, + const wxString& title = _T("Dolphin"), + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDEFAULT_FRAME_STYLE | wxCLIP_CHILDREN | wxNO_FULL_REPAINT_ON_RESIZE); + + void* GetRenderHandle() {return(m_Panel->GetHandle());} + + + private: + + CGameListCtrl* m_GameListCtrl; + wxPanel* m_Panel; + + enum EBitmaps + { + Toolbar_FileOpen, + Toolbar_Refresh, + Toolbar_Browse, + Toolbar_Play, + Toolbar_Play_Dis, + Toolbar_Stop, + Toolbar_Stop_Dis, + Toolbar_Pause, + Toolbar_PluginOptions, + Toolbar_PluginOptions_Dis, + Toolbar_PluginGFX, + Toolbar_PluginDSP, + Toolbar_PluginPAD, + Toolbar_FullScreen, + Toolbar_Help, + Bitmaps_Max + }; + + wxBitmap m_Bitmaps[Bitmaps_Max]; + wxBitmap m_BitmapsMenu[Bitmaps_Max]; + + void InitBitmaps(); + void PopulateToolbar(wxToolBar* toolBar); + void RecreateToolbar(); + void CreateMenu(); + + + // event handler + void OnQuit(wxCommandEvent& event); + void OnAbout(wxCommandEvent& event); + void OnHelp(wxCommandEvent& event); + void OnRefresh(wxCommandEvent& event); + void OnPluginOptions(wxCommandEvent& event); + void OnPluginGFX(wxCommandEvent& event); + void OnPluginDSP(wxCommandEvent& event); + void OnPluginPAD(wxCommandEvent& event); + void OnOpen(wxCommandEvent& event); + void OnPlay(wxCommandEvent& event); + void OnStop(wxCommandEvent& event); + void OnBrowse(wxCommandEvent& event); + void OnToggleFullscreen(wxCommandEvent& event); + void OnKeyDown(wxKeyEvent& event); + void OnHostMessage(wxCommandEvent& event); + + + wxMenuBar* m_pMenuBar; + + wxMenuItem* m_pMenuItemPlay; + wxMenuItem* m_pMenuItemStop; + wxMenuItem* m_pPluginOptions; + + wxBusyInfo* m_pBootProcessDialog; + + void UpdateGUI(); + + + // old function that could be cool + + DECLARE_EVENT_TABLE(); +}; + +#endif // __FRAME_H_ + + diff --git a/Source/Core/DolphinWX/src/GameListCtrl.cpp b/Source/Core/DolphinWX/src/GameListCtrl.cpp new file mode 100644 index 0000000000..ac80ef0363 --- /dev/null +++ b/Source/Core/DolphinWX/src/GameListCtrl.cpp @@ -0,0 +1,421 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "Globals.h" + +#include + +#include "FileSearch.h" +#include "StringUtil.h" +#include "BootManager.h" +#include "Config.h" +#include "GameListCtrl.h" + + +#if USE_XPM_BITMAPS + #include "../resources/Flag_Europe.xpm" + #include "../resources/Flag_France.xpm" + #include "../resources/Flag_Japan.xpm" + #include "../resources/Flag_USA.xpm" +#endif // USE_XPM_BITMAPS + + +BEGIN_EVENT_TABLE(CGameListCtrl, wxListCtrl) + +EVT_SIZE(CGameListCtrl::OnSize) +EVT_RIGHT_DOWN(CGameListCtrl::OnRightClick) +EVT_LIST_COL_BEGIN_DRAG(LIST_CTRL, CGameListCtrl::OnColBeginDrag) +EVT_LIST_ITEM_SELECTED(LIST_CTRL, CGameListCtrl::OnSelected) +EVT_LIST_ITEM_ACTIVATED(LIST_CTRL, CGameListCtrl::OnActivated) +EVT_LIST_COL_END_DRAG(LIST_CTRL, CGameListCtrl::OnColEndDrag) +END_EVENT_TABLE() + + +CGameListCtrl::CGameListCtrl(wxWindow* parent, const wxWindowID id, const wxPoint& pos, const wxSize& size, long style) + : wxListCtrl(parent, id, pos, size, style) // | wxLC_VIRTUAL) +{ + InitBitmaps(); +} + + +void +CGameListCtrl::InitBitmaps() +{ + m_imageListSmall = new wxImageList(96, 32); + SetImageList(m_imageListSmall, wxIMAGE_LIST_SMALL); + m_FlagImageIndex.resize(DiscIO::IVolume::NUMBER_OF_COUNTRIES); + wxIcon iconTemp; + iconTemp.CopyFromBitmap(wxBitmap(Flag_Europe_xpm)); + m_FlagImageIndex[DiscIO::IVolume::COUNTRY_EUROPE] = m_imageListSmall->Add(iconTemp); + iconTemp.CopyFromBitmap(wxBitmap(Flag_France_xpm)); + m_FlagImageIndex[DiscIO::IVolume::COUNTRY_FRANCE] = m_imageListSmall->Add(iconTemp); + iconTemp.CopyFromBitmap(wxBitmap(Flag_USA_xpm)); + m_FlagImageIndex[DiscIO::IVolume::COUNTRY_USA] = m_imageListSmall->Add(iconTemp); + iconTemp.CopyFromBitmap(wxBitmap(Flag_Japan_xpm)); + m_FlagImageIndex[DiscIO::IVolume::COUNTRY_JAP] = m_imageListSmall->Add(iconTemp); + iconTemp.CopyFromBitmap(wxBitmap(Flag_Europe_xpm)); + m_FlagImageIndex[DiscIO::IVolume::COUNTRY_UNKNOWN] = m_imageListSmall->Add(iconTemp); +} + + +void +CGameListCtrl::BrowseForDirectory() +{ + wxString dirHome; + wxGetHomeDir(&dirHome); + + // browse + wxDirDialog dialog(this, _T("Browse directory"), dirHome, wxDD_DEFAULT_STYLE | wxDD_DIR_MUST_EXIST); + + if (dialog.ShowModal() == wxID_OK) + { + SConfig::GetInstance().m_ISOFolder.push_back(dialog.GetPath().c_str()); + SConfig::GetInstance().SaveSettings(); + Update(); + } +} + + +void +CGameListCtrl::Update() +{ + Hide(); + + ScanForISOs(); + + ClearAll(); + + if (m_ISOFiles.size() != 0) + { + // add columns + InsertColumn(COLUMN_BANNER, _T("Banner")); + InsertColumn(COLUMN_TITLE, _T("Title")); + InsertColumn(COLUMN_COMPANY, _T("Company")); + InsertColumn(COLUMN_COUNTRY, _T("")); + InsertColumn(COLUMN_SIZE, _T("Size")); + InsertColumn(COLUMN_EMULATION_STATE, _T("Emulation"), wxLIST_FORMAT_LEFT); + + // add all items + for (int i = 0; i < (int)m_ISOFiles.size(); i++) + { + InsertItemInReportView(i); + } + } + else + { + InsertColumn(COLUMN_BANNER, _T("No ISOs found")); + + // data + wxString buf(_T("Dolphin could not find any GC/Wii ISOs. Doubleclick here to browse for files...")); + long item = InsertItem(0, buf, -1); + SetItemFont(item, *wxITALIC_FONT); + SetColumnWidth(item, wxLIST_AUTOSIZE); + } + + AutomaticColumnWidth(); + + Show(); +} + + +wxColour blend50(const wxColour& c1, const wxColour& c2) +{ + return(((c1.GetPixel() & 0xFEFEFE) >> 1) + ((c2.GetPixel() & 0xFEFEFE) >> 1) + 0x010101); +} + + +wxString NiceSizeFormat(s64 _size) +{ + const char* sizes[] = {"b", "KB", "MB", "GB", "TB", "PB", "EB"}; + int s = 0; + int frac = 0; + + while (_size > (s64)1024) + { + s++; + frac = (int)_size & 1023; + _size /= (s64)1024; + } + + float f = (float)_size + ((float)frac / 1024.0f); + + wxString NiceString; + NiceString.Printf("%3.1f %s", f, sizes[s]); + return(NiceString); +} + + +void +CGameListCtrl::InsertItemInReportView(size_t _Index) +{ + CISOFile& rISOFile = m_ISOFiles[_Index]; + + int ImageIndex = -1; + + if (rISOFile.GetImage().IsOk()) + { + ImageIndex = m_imageListSmall->Add(rISOFile.GetImage()); + } + + // data + wxString buf; + long ItemIndex = InsertItem(_Index, buf, ImageIndex); +#ifdef _WIN32 + wxColour color = (_Index & 1) ? blend50(GetSysColor(COLOR_3DLIGHT), GetSysColor(COLOR_WINDOW)) : GetSysColor(COLOR_WINDOW); +#else + wxColour color = (_Index & 1) ? 0xFFFFFF : 0xEEEEEE; +#endif + // background color color + { + wxListItem item; + item.SetId(ItemIndex); + item.SetBackgroundColour(color); + SetItem(item); + } + + // title color + { + wxListItem item; + item.SetId(ItemIndex); + item.SetColumn(COLUMN_TITLE); + item.SetText(rISOFile.GetName()); + SetItem(item); + } + + // company color + { + wxListItem item; + item.SetId(ItemIndex); + item.SetColumn(COLUMN_COMPANY); + item.SetText(rISOFile.GetCompany()); + SetItem(item); + } + + // size + { + wxListItem item; + item.SetId(ItemIndex); + item.SetColumn(COLUMN_SIZE); + item.SetText(NiceSizeFormat(rISOFile.GetFileSize())); + SetItem(item); + } + +#ifndef __WXMSW__ + // country + { + // Can't do this in Windows - we use DrawSubItem instead, see below + wxListItem item; + item.m_itemId = ItemIndex; + item.SetColumn(COLUMN_COUNTRY); + item.SetBackgroundColour(color); + DiscIO::IVolume::ECountry Country = rISOFile.GetCountry(); + + if (Country < m_FlagImageIndex.size()) + { + item.SetImage(m_FlagImageIndex[rISOFile.GetCountry()]); + } + + SetItem(item); + } +#endif // __WXMSW__ + + // item data + SetItemData(ItemIndex, _Index); +} + + +void +CGameListCtrl::ScanForISOs() +{ + m_ISOFiles.clear(); + + CFileSearch::XStringVector Directories(SConfig::GetInstance().m_ISOFolder); + + CFileSearch::XStringVector Extensions; + Extensions.push_back("*.iso"); + Extensions.push_back("*.gcm"); + Extensions.push_back("*.gcz"); + + CFileSearch FileSearch(Extensions, Directories); + const CFileSearch::XStringVector& rFilenames = FileSearch.GetFileNames(); + + if (rFilenames.size() > 0) + { + wxProgressDialog dialog(_T("Scanning for ISOs"), + _T("Scanning..."), + rFilenames.size(), // range + this, // parent + wxPD_CAN_ABORT | + wxPD_APP_MODAL | + // wxPD_AUTO_HIDE | -- try this as well + wxPD_ELAPSED_TIME | + wxPD_ESTIMATED_TIME | + wxPD_REMAINING_TIME | + wxPD_SMOOTH // - makes indeterminate mode bar on WinXP very small + ); + + dialog.CenterOnParent(); + + for (size_t i = 0; i < rFilenames.size(); i++) + { + std::string FileName; + SplitPath(rFilenames[i], NULL, &FileName, NULL); + + wxString msg; + msg.Printf("Scanning %s", FileName.c_str()); + + bool Cont = dialog.Update(i, msg); + + if (!Cont) + { + break; + } + + CISOFile ISOFile(rFilenames[i]); + + if (ISOFile.IsValid()) + { + m_ISOFiles.push_back(ISOFile); + } + } + } +} + + +void +CGameListCtrl::OnColBeginDrag(wxListEvent& event) +{ + event.Veto(); +} + + +void +CGameListCtrl::OnColEndDrag(wxListEvent& WXUNUSED (event)) +{ + AutomaticColumnWidth(); +} + + +void +CGameListCtrl::OnRightClick(wxMouseEvent& WXUNUSED (event)) +{} + + +void +CGameListCtrl::OnActivated(wxListEvent& event) +{ + if (m_ISOFiles.size() == 0) + { + BrowseForDirectory(); + } + else + { + size_t Index = event.GetData(); + + if (Index < m_ISOFiles.size()) + { + const CISOFile& rISOFile = m_ISOFiles[Index]; + BootManager::BootCore(rISOFile.GetFileName()); + } + } +} + + +void +CGameListCtrl::OnSelected(wxListEvent& WXUNUSED (event)) +{} + + +void CGameListCtrl::OnSize(wxSizeEvent& WXUNUSED (event)) +{ + AutomaticColumnWidth(); +} + + +bool +CGameListCtrl::MSWDrawSubItem(wxPaintDC& rPaintDC, int item, int subitem) +{ + bool Result = false; +#ifdef __WXMSW__ + switch (subitem) + { + case COLUMN_COUNTRY: + { + size_t Index = GetItemData(item); + + if (Index < m_ISOFiles.size()) + { + const CISOFile& rISO = m_ISOFiles[Index]; + wxRect SubItemRect; + this->GetSubItemRect(item, subitem, SubItemRect); + m_imageListSmall->Draw(m_FlagImageIndex[rISO.GetCountry()], rPaintDC, SubItemRect.GetLeft(), SubItemRect.GetTop()); + } + } + } + + // +#endif + + return(Result); +} + + +void +CGameListCtrl::AutomaticColumnWidth() +{ + wxRect rc(GetClientRect()); + + if (GetColumnCount() == 1) + { + SetColumnWidth(0, rc.GetWidth()); + } + else if (GetColumnCount() > 4) + { + SetColumnWidth(COLUMN_COUNTRY, 32); + SetColumnWidth(COLUMN_BANNER, 106); + + // width + for (int i = 0; i < GetColumnCount() - 1; i++) + { + if ((i != COLUMN_COUNTRY) && (i != COLUMN_BANNER)) + { + SetColumnWidth(i, wxLIST_AUTOSIZE); + } + } + + + int size = 0; + + for (int i = 0; i < GetColumnCount() - 1; i++) + { + size += GetColumnWidth(i); + } + + int rest = rc.GetWidth() - size - 3; + + if (rest > 0) + { + SetColumnWidth(GetColumnCount() - 1, rest); + } + else + { + SetColumnWidth(GetColumnCount() - 1, 0); + } + } +} + + diff --git a/Source/Core/DolphinWX/src/GameListCtrl.h b/Source/Core/DolphinWX/src/GameListCtrl.h new file mode 100644 index 0000000000..d324887eba --- /dev/null +++ b/Source/Core/DolphinWX/src/GameListCtrl.h @@ -0,0 +1,79 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef __GAMELIST_CTRL_H_ +#define __GAMELIST_CTRL_H_ + +#include + +#include "ISOFile.h" + +// Define a new application +class CGameListCtrl + : public wxListCtrl +{ + public: + + CGameListCtrl(wxWindow* parent, const wxWindowID id, const wxPoint& pos, const wxSize& size, long style); + + void Update(); + + void BrowseForDirectory(); + + + private: + + enum + { + COLUMN_BANNER = 0, + COLUMN_TITLE, + COLUMN_COMPANY, + COLUMN_COUNTRY, + COLUMN_SIZE, + COLUMN_EMULATION_STATE, + NUMBER_OF_COLUMN + }; + + std::vectorm_FlagImageIndex; + + bool m_test; + std::vectorm_ISOFiles; + + void InitBitmaps(); + void InsertItemInReportView(size_t _Index); + void ScanForISOs(); + + + DECLARE_EVENT_TABLE() + + // events + void OnRightClick(wxMouseEvent& event); + + void OnColBeginDrag(wxListEvent& event); + void OnColEndDrag(wxListEvent& event); + void OnSelected(wxListEvent& event); + void OnActivated(wxListEvent& event); + void OnSize(wxSizeEvent& event); + + virtual bool MSWDrawSubItem(wxPaintDC& rPainDC, int item, int subitem); + + void AutomaticColumnWidth(); +}; + + +#endif + diff --git a/Source/Core/DolphinWX/src/Globals.cpp b/Source/Core/DolphinWX/src/Globals.cpp new file mode 100644 index 0000000000..cc5cb500cd --- /dev/null +++ b/Source/Core/DolphinWX/src/Globals.cpp @@ -0,0 +1,18 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "Globals.h" diff --git a/Source/Core/DolphinWX/src/Globals.h b/Source/Core/DolphinWX/src/Globals.h new file mode 100644 index 0000000000..58b7d08c1d --- /dev/null +++ b/Source/Core/DolphinWX/src/Globals.h @@ -0,0 +1,92 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef _GLOBALS_H +#define _GLOBALS_H + +enum +{ + IDM_LOADSTATE = 200, + IDM_SAVESTATE, + IDM_PLAY, + IDM_STOP, + IDM_BROWSE, + IDM_PLUGIN_OPTIONS, + IDM_CONFIG_GFX_PLUGIN, + IDM_CONFIG_DSP_PLUGIN, + IDM_CONFIG_PAD_PLUGIN, + IDM_TOGGLE_FULLSCREEN, + IDM_NOTIFYMAPLOADED, + IDM_UPDATELOGDISPLAY, + IDM_UPDATEDISASMDIALOG, + IDM_UPDATEGUI, + IDM_HOST_MESSAGE, + IDM_BOOTING_STARTED, + IDM_BOOTING_ENDED, + IDM_ABOUT, + ID_TOOLBAR = 500, + LIST_CTRL = 1000 +}; + +#define wxUSE_XPM_IN_MSW 1 +#define USE_XPM_BITMAPS 1 + +// For compilers that support precompilation, includes "wx/wx.h". +//#include "wx/wxprec.h" + +//#ifndef WX_PRECOMP +#include "wx/wx.h" +//#endif + +#include "wx/toolbar.h" +#include "wx/log.h" +#include "wx/image.h" +#include "wx/aboutdlg.h" +#include "wx/filedlg.h" +#include "wx/spinctrl.h" +#include "wx/srchctrl.h" +#include "wx/listctrl.h" +#include "wx/progdlg.h" +#include "wx/imagpng.h" +#include "wx/button.h" +#include "wx/stattext.h" +#include "wx/choice.h" +#include "wx/cmdline.h" +#include "wx/busyinfo.h" + +// define this to use XPMs everywhere (by default, BMPs are used under Win) +// BMPs use less space, but aren't compiled into the executable on other platforms + +#if USE_XPM_BITMAPS && defined (__WXMSW__) && !wxUSE_XPM_IN_MSW +#error You need to enable XPM support to use XPM bitmaps with toolbar! +#endif // USE_XPM_BITMAPS + + +// +// custom message macro +// + +#define EVT_HOST_COMMAND(id, fn) \ + DECLARE_EVENT_TABLE_ENTRY(\ + wxEVT_HOST_COMMAND, id, wxID_ANY, \ + (wxObjectEventFunction)(wxEventFunction) wxStaticCastEvent(wxCommandEventFunction, &fn), \ + (wxObject*) NULL \ + ), + +extern const wxEventType wxEVT_HOST_COMMAND; + +#endif diff --git a/Source/Core/DolphinWX/src/ISOFile.cpp b/Source/Core/DolphinWX/src/ISOFile.cpp new file mode 100644 index 0000000000..50393cf4b8 --- /dev/null +++ b/Source/Core/DolphinWX/src/ISOFile.cpp @@ -0,0 +1,98 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include +#include + +#include "Common.h" +#include "Globals.h" +#include "ISOFile.h" + +#include "VolumeCreator.h" +#include "Filesystem.h" +#include "BannerLoader.h" +#include "FileSearch.h" + +#define DVD_BANNER_WIDTH 96 +#define DVD_BANNER_HEIGHT 32 + +static u32 g_ImageTemp[DVD_BANNER_WIDTH * DVD_BANNER_HEIGHT]; + +CISOFile::CISOFile(const std::string& _rFileName) + : m_FileName(_rFileName), + m_FileSize(0), + m_Valid(false) +{ + DiscIO::IVolume* pVolume = DiscIO::CreateVolumeFromFilename(_rFileName); + + if (pVolume != NULL) + { + m_Name = _rFileName; + m_Country = pVolume->GetCountry(); + m_FileSize = pVolume->GetSize(); + m_Name = pVolume->GetName(); + + // check if we can get some infos from the banner file too + DiscIO::IFileSystem* pFileSystem = DiscIO::CreateFileSystem(*pVolume); + + if (pFileSystem != NULL) + { + DiscIO::IBannerLoader* pBannerLoader = DiscIO::CreateBannerLoader(*pFileSystem); + + if (pBannerLoader != NULL) + { + if (pBannerLoader->IsValid()) + { + pBannerLoader->GetName(m_Name); + pBannerLoader->GetCompany(m_Company); + + if (pBannerLoader->GetBanner(g_ImageTemp)) + { + unsigned char* pImage = (unsigned char*)malloc(DVD_BANNER_WIDTH * DVD_BANNER_HEIGHT * 3); + + for (size_t i = 0; i < DVD_BANNER_WIDTH * DVD_BANNER_HEIGHT; i++) + { + pImage[i * 3 + 0] = (g_ImageTemp[i] & 0xFF0000) >> 16; + pImage[i * 3 + 1] = (g_ImageTemp[i] & 0x00FF00) >> 8; + pImage[i * 3 + 2] = (g_ImageTemp[i] & 0x0000FF) >> 0; + } + + m_Image.Create(DVD_BANNER_WIDTH, DVD_BANNER_HEIGHT, pImage); + } + } + else + { + // default banner + } + + delete pBannerLoader; + } + + delete pFileSystem; + } + + delete pVolume; + + m_Valid = true; + } +} + + +CISOFile::~CISOFile() +{} + + diff --git a/Source/Core/DolphinWX/src/ISOFile.h b/Source/Core/DolphinWX/src/ISOFile.h new file mode 100644 index 0000000000..d618e94341 --- /dev/null +++ b/Source/Core/DolphinWX/src/ISOFile.h @@ -0,0 +1,67 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef __ISOFILE_H_ +#define __ISOFILE_H_ + +#include "Volume.h" + +class CISOFile +{ + public: + + CISOFile(const std::string& _rFileName); + ~CISOFile(); + + bool IsValid() const {return(m_Valid);} + + + const std::string& GetFileName() const {return(m_FileName);} + + + const std::string& GetName() const {return(m_Name);} + + + const std::string& GetCompany() const {return(m_Company);} + + + DiscIO::IVolume::ECountry GetCountry() const {return(m_Country);} + + + u64 GetFileSize() const {return(m_FileSize);} + + + const wxImage& GetImage() const {return(m_Image);} + + + private: + + std::string m_FileName; + std::string m_Name; + std::string m_Company; + + u64 m_FileSize; + + DiscIO::IVolume::ECountry m_Country; + + wxImage m_Image; + + bool m_Valid; +}; + + +#endif diff --git a/Source/Core/DolphinWX/src/Main.cpp b/Source/Core/DolphinWX/src/Main.cpp new file mode 100644 index 0000000000..45922f067b --- /dev/null +++ b/Source/Core/DolphinWX/src/Main.cpp @@ -0,0 +1,224 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include +#include + +#include "CPUDetect.h" +#include "Globals.h" +#include "Common.h" +#include "IniFile.h" +#include "Main.h" +#include "Frame.h" +#include "Config.h" +#include "CodeWindow.h" + +IMPLEMENT_APP(DolphinApp) + +CFrame * main_frame = NULL; +CCodeWindow* code_frame = NULL; + +// The `main program' equivalent, creating the windows and returning the +// main frame +bool DolphinApp::OnInit() +{ + DetectCPU(); +#ifndef _WIN32 +// RegisterPanicAlertHandler(&wxPanicAlert); +#endif + +#if 0 +#ifdef _WIN32 + // TODO: if First Boot +#ifdef _M_IX86 + if (cpu_info.CPU64Bit && !cpu_info.OS64Bit) + { + MessageBox(0, _T("This is the 32-bit version of Dolphin. This computer is running a 64-bit OS.\n" + "Thus, this computer is capable of running Dolphin 64-bit, which is considerably " + "faster than Dolphin 32-bit. So, why are you running Dolphin 32-bit? :-)")); + } + + // missing check +#endif +#endif +#endif + + bool UseDebugger = false; + +#if wxUSE_CMDLINE_PARSER + // + // What this does is get all the command line arguments + // and treat each one as a file to put to the initial playlist + // + wxCmdLineEntryDesc cmdLineDesc[] = + { + {wxCMD_LINE_SWITCH, _T("h"), _T("help"), _T("Show this help message"), wxCMD_LINE_VAL_NONE, wxCMD_LINE_OPTION_HELP}, + {wxCMD_LINE_SWITCH, _T("d"), _T("debugger"), _T("Opens the debugger")}, + {wxCMD_LINE_NONE} + }; + + //gets the passed media files from command line + wxCmdLineParser parser(cmdLineDesc, argc, argv); + + // get filenames from the command line + if (parser.Parse() != 0) + { + return(false); + } + + UseDebugger = parser.Found(_T("debugger")); +#endif + + SConfig::GetInstance().LoadSettings(); + wxInitAllImageHandlers(); + // Create the main frame window + main_frame = new CFrame((wxFrame*) NULL, wxID_ANY, + _T("Dolphin"), + wxPoint(100, 100), wxSize(800, 600)); + + // create debugger + if (UseDebugger) + { + code_frame = new CCodeWindow(SConfig::GetInstance().m_LocalCoreStartupParameter, main_frame); + code_frame->Show(true); + } + + SetTopWindow(main_frame); + + return(true); +} + + +void DolphinApp::OnEndSession() +{ + SConfig::GetInstance().SaveSettings(); +} + + +bool wxPanicAlert(const char* text, bool /*yes_no*/) +{ + wxMessageBox(text, _T("PANIC ALERT")); + return(true); +} + + +void Host_BootingStarted() +{ + wxCommandEvent event(wxEVT_HOST_COMMAND, IDM_BOOTING_STARTED); + wxPostEvent(main_frame, event); + + if (code_frame) + { + wxPostEvent(code_frame, event); + } +} + + +void Host_BootingEnded() +{ + wxCommandEvent event(wxEVT_HOST_COMMAND, IDM_BOOTING_ENDED); + wxPostEvent(main_frame, event); + + if (code_frame) + { + wxPostEvent(code_frame, event); + } +} + + +// OK, this thread boundary is DANGEROUS on linux +// wxPostEvent / wxAddPendingEvent is the solution. +void Host_NotifyMapLoaded() +{ + wxCommandEvent event(wxEVT_HOST_COMMAND, IDM_NOTIFYMAPLOADED); + wxPostEvent(main_frame, event); + + if (code_frame) + { + wxPostEvent(code_frame, event); + } +} + + +void Host_UpdateLogDisplay() +{ + wxCommandEvent event(wxEVT_HOST_COMMAND, IDM_UPDATELOGDISPLAY); + wxPostEvent(main_frame, event); + + if (code_frame) + { + wxPostEvent(code_frame, event); + } +} + + +void Host_UpdateDisasmDialog() +{ + wxCommandEvent event(wxEVT_HOST_COMMAND, IDM_UPDATEDISASMDIALOG); + wxPostEvent(main_frame, event); + + if (code_frame) + { + wxPostEvent(code_frame, event); + } +} + + +void Host_UpdateMainFrame() +{ + wxCommandEvent event(wxEVT_HOST_COMMAND, IDM_UPDATEGUI); + wxPostEvent(main_frame, event); + + if (code_frame) + { + wxPostEvent(code_frame, event); + } +} + + +void Host_UpdateMemoryView() +{} + + +void Host_SetDebugMode(bool) +{} + + +void Host_SetWaitCursor(bool enable) +{ +#ifdef _WIN32 + if (enable) + { + SetCursor(LoadCursor(NULL, IDC_WAIT)); + } + else + { + SetCursor(LoadCursor(NULL, IDC_ARROW)); + } +#endif + +} + + +void Host_CreateDisplay() +{} + + +void Host_CloseDisplay() +{} + + diff --git a/Source/Core/DolphinWX/src/Main.h b/Source/Core/DolphinWX/src/Main.h new file mode 100644 index 0000000000..6b2659752b --- /dev/null +++ b/Source/Core/DolphinWX/src/Main.h @@ -0,0 +1,32 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef __MAIN_H_ +#define __MAIN_H_ + +// Define a new application +class DolphinApp + : public wxApp +{ + public: + + bool OnInit(); + void OnEndSession(); +}; + + +#endif diff --git a/Source/Core/DolphinWX/src/MainNoGUI.cpp b/Source/Core/DolphinWX/src/MainNoGUI.cpp new file mode 100644 index 0000000000..e6c971d630 --- /dev/null +++ b/Source/Core/DolphinWX/src/MainNoGUI.cpp @@ -0,0 +1,38 @@ +#include +#include +#ifndef _WIN32 +//#include +#else +#endif + +#include "Globals.h" +#include "Common.h" +#include "ISOFile.h" + +#include "BootManager.h" + +int main(int argc, const char* argv[]) +{ + if (argc != 2) + { + puts("Please supply at least one argument - the ISO to boot.\n"); + return(1); + } + + CISOFile iso(argv[1]); + + if (!iso.IsValid()) + { + printf("The ISO %s is not a valid Gamecube or Wii ISO.", argv[1]); + return(1); + } + + BootManager::BootCore(iso); + usleep(2000 * 1000 * 1000); +// while (!getch()) { + // usleep(20); +// } + return(0); +} + + diff --git a/Source/Core/DolphinWX/src/PluginManager.cpp b/Source/Core/DolphinWX/src/PluginManager.cpp new file mode 100644 index 0000000000..63bcb4ab24 --- /dev/null +++ b/Source/Core/DolphinWX/src/PluginManager.cpp @@ -0,0 +1,161 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include +#include + +#include "Globals.h" +#include "Common.h" +#include "PluginManager.h" +#include "FileSearch.h" +#include "StringUtil.h" + +CPluginManager CPluginManager::m_Instance; + + +CPluginManager::CPluginManager() +{} + + +CPluginManager::~CPluginManager() +{} + + +void +CPluginManager::ScanForPlugins(wxWindow* _wxWindow) +{ + m_PluginInfos.clear(); + + CFileSearch::XStringVector Directories; + Directories.push_back(_T("Plugins")); + + CFileSearch::XStringVector Extensions; +#ifdef _WIN32 + Extensions.push_back("*.dll"); +#else + Extensions.push_back("*.so"); +#endif + + CFileSearch FileSearch(Extensions, Directories); + const CFileSearch::XStringVector& rFilenames = FileSearch.GetFileNames(); + + if (rFilenames.size() > 0) + { + wxProgressDialog dialog(_T("Scanning for Plugins"), + _T("Scanning..."), + rFilenames.size(), // range + _wxWindow, // parent + wxPD_CAN_ABORT | + wxPD_APP_MODAL | + // wxPD_AUTO_HIDE | -- try this as well + wxPD_ELAPSED_TIME | + wxPD_ESTIMATED_TIME | + wxPD_REMAINING_TIME | + wxPD_SMOOTH // - makes indeterminate mode bar on WinXP very small + ); + + + dialog.CenterOnParent(); + + for (size_t i = 0; i < rFilenames.size(); i++) + { + std::string orig_name = rFilenames[i]; + printf("Scanning %s\n", rFilenames[i].c_str()); + std::string FileName; + + if (!SplitPath(rFilenames[i], NULL, &FileName, NULL)) + { + printf("Bad Path %s\n", rFilenames[i].c_str()); + return; + } + + wxString msg; + msg.Printf("Scanning %s", FileName.c_str()); + bool Cont = dialog.Update(i, msg); + + if (!Cont) + { + break; + } + + printf("Examining %s\n", FileName.c_str()); + + CPluginInfo PluginInfo(orig_name); + printf("%s\n", orig_name.c_str()); + + if (PluginInfo.IsValid()) + { + m_PluginInfos.push_back(PluginInfo); + } + + printf("Valid plugin\n"); + } + } +} + + +void +CPluginManager::OpenAbout(void* _Parent, const std::string& _rFilename) +{ + if (Common::CPlugin::Load(_rFilename.c_str())) + { + Common::CPlugin::Config((HWND)_Parent); + Common::CPlugin::Release(); + } +} + + +void +CPluginManager::OpenConfig(void* _Parent, const std::string& _rFilename) +{ + if (Common::CPlugin::Load(_rFilename.c_str())) + { + Common::CPlugin::Config((HWND)_Parent); + Common::CPlugin::Release(); + } +} + + +CPluginInfo::CPluginInfo(const std::string& _rFileName) + : m_FileName(_rFileName) + , m_Valid(false) +{ + printf("Loading!\n"); + + if (Common::CPlugin::Load(_rFileName.c_str())) + { + printf("Loaded!\n"); + + if (Common::CPlugin::GetInfo(m_PluginInfo)) + { + m_Valid = true; + } + else + { + PanicAlert("Could not get info about plugin %s", _rFileName.c_str()); + } + + Common::CPlugin::Release(); + printf("Unloaded!\n"); + } + else + { + PanicAlert("Failed to load plugin %s\nhello world", _rFileName.c_str()); + } +} + + diff --git a/Source/Core/DolphinWX/src/PluginManager.h b/Source/Core/DolphinWX/src/PluginManager.h new file mode 100644 index 0000000000..f8628001d5 --- /dev/null +++ b/Source/Core/DolphinWX/src/PluginManager.h @@ -0,0 +1,80 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef __PLUGIN_MANAGER_H_ +#define __PLUGIN_MANAGER_H_ + +#include "plugin.h" + +class CPluginInfo +{ + public: + + CPluginInfo(const std::string& _rFileName); + + bool IsValid() const {return(m_Valid);} + + + const PLUGIN_INFO& GetPluginInfo() const {return(m_PluginInfo);} + + + const std::string& GetFileName() const {return(m_FileName);} + + + private: + + PLUGIN_INFO m_PluginInfo; + + std::string m_FileName; + + bool m_Valid; +}; + +typedef std::vectorCPluginInfos; + +class CPluginManager +{ + public: + + static CPluginManager& GetInstance() {return(m_Instance);} + + + void ScanForPlugins(wxWindow* _wxWindow); + + void OpenAbout(void* _Parent, const std::string& _rFilename); + + void OpenConfig(void* _Parent, const std::string& _rFilename); + + + const CPluginInfos& GetPluginInfos() {return(m_PluginInfos);} + + + private: + + static CPluginManager m_Instance; + + bool m_Initialized; + + CPluginInfos m_PluginInfos; + + CPluginManager(); + + ~CPluginManager(); +}; + + +#endif diff --git a/Source/Core/DolphinWX/src/PluginOptions.cpp b/Source/Core/DolphinWX/src/PluginOptions.cpp new file mode 100644 index 0000000000..52c1225431 --- /dev/null +++ b/Source/Core/DolphinWX/src/PluginOptions.cpp @@ -0,0 +1,314 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include +#include + +#include "Common.h" +#include "Globals.h" + +#include "PluginOptions.h" +#include "PluginManager.h" + +#include "Config.h" + +BEGIN_EVENT_TABLE(CPluginOptions, wxDialog) + +EVT_CLOSE(CPluginOptions::OnClose) +EVT_BUTTON(ID_OK, CPluginOptions::OKClick) +EVT_BUTTON(ID_APPLY, CPluginOptions::OKClick) +EVT_BUTTON(ID_CANCEL, CPluginOptions::OKClick) +EVT_CHOICE(ID_PAD_CB, CPluginOptions::OnSelectionChanged) +EVT_CHOICE(ID_DSP_CB, CPluginOptions::OnSelectionChanged) +EVT_CHOICE(ID_GRAPHIC_CB, CPluginOptions::OnSelectionChanged) +EVT_BUTTON(ID_PAD_ABOUT, CPluginOptions::OnAbout) +EVT_BUTTON(ID_DSP_ABOUT, CPluginOptions::OnAbout) +EVT_BUTTON(ID_GRAPHIC_ABOUT, CPluginOptions::OnAbout) +EVT_BUTTON(ID_PAD_CONFIG, CPluginOptions::OnConfig) +EVT_BUTTON(ID_DSP_CONFIG, CPluginOptions::OnConfig) +EVT_BUTTON(ID_GRAPHIC_CONFIG, CPluginOptions::OnConfig) + +END_EVENT_TABLE() + + +CPluginOptions::CPluginOptions(wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& position, const wxSize& size, long style) + : wxDialog(parent, id, title, position, size, style) +{ + CreateGUIControls(); +} + + +CPluginOptions::~CPluginOptions() +{} + + +void CPluginOptions::CreateGUIControls() +{ + SetTitle(wxT("Plugin Selection")); + SetIcon(wxNullIcon); + SetSize(0, 8, 440, 295); + Center(); + const wxChar* font_name = 0; + int font_size = 8; +#ifdef _WIN32 + OSVERSIONINFOEX os; + os.dwOSVersionInfoSize = sizeof(os); + GetVersionEx((OSVERSIONINFO*)&os); + + if (os.dwMajorVersion >= 6) + { + font_name = wxT("Segoe UI"); + font_size = 9; + } + else + { + font_name = wxT("Tahoma"); + } + + // +#endif + + wxFont font(font_size, wxSWISS, wxNORMAL, wxNORMAL, false, font_name); + OK = new wxButton(this, ID_OK, wxT("OK"), wxPoint(188, 240), wxSize(73, 25), 0, wxDefaultValidator, wxT("OK")); + OK->SetFont(font); + + Cancel = new wxButton(this, ID_CANCEL, wxT("Cancel"), wxPoint(268, 240), wxSize(73, 25), 0, wxDefaultValidator, wxT("Cancel")); + Cancel->SetFont(font); + + Apply = new wxButton(this, ID_APPLY, wxT("Apply"), wxPoint(348, 240), wxSize(73, 25), 0, wxDefaultValidator, wxT("Apply")); + Apply->SetFont(font); + Apply->Disable(); + + { + GraphicSelection = new wxChoice(this, ID_GRAPHIC_CB, wxPoint(88, 16), wxSize(333, 23), NULL, 0, wxDefaultValidator, wxT("GraphicSelection")); + GraphicSelection->SetFont(font); + + GraphicAbout = new wxButton(this, ID_GRAPHIC_ABOUT, wxT("About..."), wxPoint(168, 48), wxSize(73, 25), 0, wxDefaultValidator, wxT("GraphicAbout")); + GraphicAbout->SetFont(font); + + GraphicConfig = new wxButton(this, ID_GRAPHIC_CONFIG, wxT("Config..."), wxPoint(88, 48), wxSize(73, 25), 0, wxDefaultValidator, wxT("GraphicConfig")); + GraphicConfig->SetFont(font); + + WxStaticText1 = new wxStaticText(this, ID_WXSTATICTEXT1, wxT("Graphic"), wxPoint(16, 21), wxDefaultSize, 0, wxT("WxStaticText1")); + WxStaticText1->SetFont(font); + + FillChoiceBox(GraphicSelection, PLUGIN_TYPE_VIDEO, SConfig::GetInstance().m_LocalCoreStartupParameter.m_strVideoPlugin); + } + + { + DSPSelection = new wxChoice(this, ID_DSP_CB, wxPoint(88, 88), wxSize(333, 23), NULL, 0, wxDefaultValidator, wxT("DSPSelection")); + DSPSelection->SetFont(font); + + DSPAbout = new wxButton(this, ID_DSP_ABOUT, wxT("About..."), wxPoint(168, 120), wxSize(73, 25), 0, wxDefaultValidator, wxT("DSPAbout")); + DSPAbout->SetFont(font); + + DSPConfig = new wxButton(this, ID_DSP_CONFIG, wxT("Config..."), wxPoint(88, 120), wxSize(73, 25), 0, wxDefaultValidator, wxT("DSPConfig")); + DSPConfig->SetFont(font); + + WxStaticText2 = new wxStaticText(this, ID_WXSTATICTEXT2, wxT("DSP"), wxPoint(16, 93), wxDefaultSize, 0, wxT("WxStaticText2")); + WxStaticText2->SetFont(font); + + FillChoiceBox(DSPSelection, PLUGIN_TYPE_DSP, SConfig::GetInstance().m_LocalCoreStartupParameter.m_strDSPPlugin); + } + + { + PADSelection = new wxChoice(this, ID_PAD_CB, wxPoint(88, 160), wxSize(333, 23), NULL, 0, wxDefaultValidator, wxT("PADSelection")); + PADSelection->SetFont(font); + + PADAbout = new wxButton(this, ID_PAD_ABOUT, wxT("About..."), wxPoint(168, 192), wxSize(73, 25), 0, wxDefaultValidator, wxT("PADAbout")); + PADAbout->SetFont(font); + + PADConfig = new wxButton(this, ID_PAD_CONFIG, wxT("Config..."), wxPoint(88, 192), wxSize(73, 25), 0, wxDefaultValidator, wxT("PADConfig")); + PADConfig->SetFont(font); + + WxStaticText3 = new wxStaticText(this, ID_WXSTATICTEXT3, wxT("Pad"), wxPoint(16, 165), wxDefaultSize, 0, wxT("WxStaticText3")); + WxStaticText3->SetFont(font); + + FillChoiceBox(PADSelection, PLUGIN_TYPE_PAD, SConfig::GetInstance().m_LocalCoreStartupParameter.m_strPadPlugin); + } +} + + +void +CPluginOptions::OnClose(wxCloseEvent& WXUNUSED (event)) +{ + Destroy(); +} + + +void +CPluginOptions::OKClick(wxCommandEvent& event) +{ + switch (event.GetId()) + { + case ID_OK: + DoApply(); + Destroy(); + break; + + case ID_APPLY: + DoApply(); + break; + + case ID_CANCEL: + Destroy(); + break; + } +} + + +void +CPluginOptions::OnSelectionChanged(wxCommandEvent& WXUNUSED (event)) +{ + Apply->Enable(); +} + + +void +CPluginOptions::OnAbout(wxCommandEvent& event) +{ + switch (event.GetId()) + { + case ID_PAD_ABOUT: + CallAbout(PADSelection); + break; + + case ID_DSP_ABOUT: + CallAbout(DSPSelection); + break; + + case ID_GRAPHIC_ABOUT: + CallAbout(GraphicSelection); + break; + } +} + + +void +CPluginOptions::OnConfig(wxCommandEvent& event) +{ + switch (event.GetId()) + { + case ID_PAD_CONFIG: + CallConfig(PADSelection); + break; + + case ID_DSP_CONFIG: + CallConfig(DSPSelection); + break; + + case ID_GRAPHIC_CONFIG: + CallConfig(GraphicSelection); + break; + } +} + + +void +CPluginOptions::FillChoiceBox(wxChoice* _pChoice, int _PluginType, const std::string& _SelectFilename) +{ + _pChoice->Clear(); + + int Index = -1; + const CPluginInfos& rInfos = CPluginManager::GetInstance().GetPluginInfos(); + + for (size_t i = 0; i < rInfos.size(); i++) + { + const PLUGIN_INFO& rPluginInfo = rInfos[i].GetPluginInfo(); + + if (rPluginInfo.Type == _PluginType) + { + int NewIndex = _pChoice->Append(rInfos[i].GetPluginInfo().Name, (void*)&rInfos[i]); + + if (rInfos[i].GetFileName() == _SelectFilename) + { + Index = NewIndex; + } + } + } + + _pChoice->Select(Index); +} + + +void +CPluginOptions::CallConfig(wxChoice* _pChoice) +{ + int Index = _pChoice->GetSelection(); + + if (Index >= 0) + { + const CPluginInfo* pInfo = static_cast(_pChoice->GetClientData(Index)); + + if (pInfo != NULL) + { + CPluginManager::GetInstance().OpenConfig((HWND) this->GetHandle(), pInfo->GetFileName()); + } + } +} + + +void +CPluginOptions::CallAbout(wxChoice* _pChoice) +{ + int Index = _pChoice->GetSelection(); + + if (Index >= 0) + { + const CPluginInfo* pInfo = static_cast(_pChoice->GetClientData(Index)); + + if (pInfo != NULL) + { + CPluginManager::GetInstance().OpenAbout((HWND) this->GetHandle(), pInfo->GetFileName()); + } + } +} + + +void +CPluginOptions::DoApply() +{ + Apply->Disable(); + + GetFilename(GraphicSelection, SConfig::GetInstance().m_LocalCoreStartupParameter.m_strVideoPlugin); + GetFilename(DSPSelection, SConfig::GetInstance().m_LocalCoreStartupParameter.m_strDSPPlugin); + GetFilename(PADSelection, SConfig::GetInstance().m_LocalCoreStartupParameter.m_strPadPlugin); + + SConfig::GetInstance().SaveSettings(); +} + + +bool +CPluginOptions::GetFilename(wxChoice* _pChoice, std::string& _rFilename) +{ + _rFilename.clear(); + + int Index = _pChoice->GetSelection(); + printf("%i\n", Index); + + if (Index >= 0) + { + const CPluginInfo* pInfo = static_cast(_pChoice->GetClientData(Index)); + _rFilename = pInfo->GetFileName(); + printf("%s\n", _rFilename.c_str()); + return(true); + } + + return(false); +} + + diff --git a/Source/Core/DolphinWX/src/PluginOptions.h b/Source/Core/DolphinWX/src/PluginOptions.h new file mode 100644 index 0000000000..ea1eabc8ce --- /dev/null +++ b/Source/Core/DolphinWX/src/PluginOptions.h @@ -0,0 +1,107 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef __PLUGIN_OPTIONS_h__ +#define __PLUGIN_OPTIONS_h__ + +#undef PLUGIN_OPTIONS_STYLE +#define PLUGIN_OPTIONS_STYLE wxCAPTION | wxSYSTEM_MENU | wxDIALOG_NO_PARENT | wxMINIMIZE_BOX | wxCLOSE_BOX + +class CPluginOptions + : public wxDialog +{ + private: + + DECLARE_EVENT_TABLE(); + + public: + + CPluginOptions(wxWindow* parent, wxWindowID id = 1, const wxString& title = wxT("Untitled1"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = PLUGIN_OPTIONS_STYLE); + virtual ~CPluginOptions(); + void OKClick(wxCommandEvent& event); + void OnSelectionChanged(wxCommandEvent& event); + void OnAbout(wxCommandEvent& event); + void OnConfig(wxCommandEvent& event); + + + private: + + //Do not add custom control declarations between + //GUI Control Declaration Start and GUI Control Declaration End. + //wxDev-C++ will remove them. Add custom code after the block. + ////GUI Control Declaration Start + wxButton* OK; + wxButton* Cancel; + wxButton* Apply; + wxStaticText* WxStaticText3; + wxButton* PADAbout; + wxButton* PADConfig; + wxChoice* PADSelection; + wxButton* DSPAbout; + wxButton* DSPConfig; + wxStaticText* WxStaticText2; + wxChoice* DSPSelection; + wxButton* GraphicAbout; + wxButton* GraphicConfig; + wxStaticText* WxStaticText1; + wxChoice* GraphicSelection; + ////GUI Control Declaration End + + private: + + //Note: if you receive any error with these enum IDs, then you need to + //change your old form code that are based on the #define control IDs. + //#defines may replace a numeric value for the enum names. + //Try copy and pasting the below block in your old form header files. + enum + { + ////GUI Enum Control ID Start + ID_CANCEL = 1034, + ID_APPLY = 1033, + ID_OK = 1032, + ID_WXSTATICTEXT3 = 1031, + ID_PAD_ABOUT = 1030, + ID_PAD_CONFIG = 1029, + ID_PAD_CB = 1028, + ID_DSP_ABOUT = 1027, + ID_DSP_CONFIG = 1026, + ID_WXSTATICTEXT2 = 1025, + ID_DSP_CB = 1024, + ID_GRAPHIC_ABOUT = 1007, + ID_GRAPHIC_CONFIG = 1006, + ID_WXSTATICTEXT1 = 1005, + ID_GRAPHIC_CB = 1003, + ////GUI Enum Control ID End + ID_DUMMY_VALUE_ //don't remove this value unless you have other enum values + }; + + private: + + void OnClose(wxCloseEvent& event); + void CreateGUIControls(); + + void FillChoiceBox(wxChoice* _pChoice, int _PluginType, const std::string& _SelectFilename); + + void CallConfig(wxChoice* _pChoice); + void CallAbout(wxChoice* _pChoice); + + void DoApply(); + + bool GetFilename(wxChoice* _pChoice, std::string& _rFilename); +}; + +#endif diff --git a/Source/Core/DolphinWX/src/stdafx.cpp b/Source/Core/DolphinWX/src/stdafx.cpp new file mode 100644 index 0000000000..428bdfaf8b --- /dev/null +++ b/Source/Core/DolphinWX/src/stdafx.cpp @@ -0,0 +1,18 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "stdafx.h" diff --git a/Source/Core/DolphinWX/src/stdafx.h b/Source/Core/DolphinWX/src/stdafx.h new file mode 100644 index 0000000000..10d5c50238 --- /dev/null +++ b/Source/Core/DolphinWX/src/stdafx.h @@ -0,0 +1,47 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef __STDAFX_H_ +#define __STDAFX_H_ + +// Change these values to use different versions +#define WINVER 0x0400 +#define _WIN32_WINNT 0x0501 +#define _WIN32_IE 0x0500 +#define _RICHEDIT_VER 0x0100 + + +#if defined _M_IX86 + +#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"") + +#elif defined _M_IA64 + +#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'\"") + +#elif defined _M_X64 + +#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"") + +#else + +#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") + +#endif + +#endif + diff --git a/Source/Dolphin.sln b/Source/Dolphin.sln new file mode 100644 index 0000000000..8a11a9a47d --- /dev/null +++ b/Source/Dolphin.sln @@ -0,0 +1,266 @@ +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Core", "Core\Core\Core.vcproj", "{F0B874CB-4476-4199-9315-8343D05AE684}" + ProjectSection(ProjectDependencies) = postProject + {B7F1A9FB-BEA8-416E-9460-AE35A6A5165C} = {B7F1A9FB-BEA8-416E-9460-AE35A6A5165C} + {C573CAF7-EE6A-458E-8049-16C0BF34C2E9} = {C573CAF7-EE6A-458E-8049-16C0BF34C2E9} + {29C2ABC1-ADA5-42CD-A5FC-96022D52A510} = {29C2ABC1-ADA5-42CD-A5FC-96022D52A510} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Plugin_VideoDX9", "Plugins\Plugin_VideoDX9\Plugin_VideoDX9.vcproj", "{636FAD5F-02D1-4E9A-BE67-FB8EA99B9A18}" + ProjectSection(ProjectDependencies) = postProject + {9A183B48-ECC2-4121-876A-9B3793686073} = {9A183B48-ECC2-4121-876A-9B3793686073} + {3E03C179-8251-46E4-81F4-466F114BAC63} = {3E03C179-8251-46E4-81F4-466F114BAC63} + {C60D0E7A-ED05-4C67-9EE7-3A6C0D7801C8} = {C60D0E7A-ED05-4C67-9EE7-3A6C0D7801C8} + {29C2ABC1-ADA5-42CD-A5FC-96022D52A510} = {29C2ABC1-ADA5-42CD-A5FC-96022D52A510} + {F0B874CB-4476-4199-9315-8343D05AE684} = {F0B874CB-4476-4199-9315-8343D05AE684} + {C573CAF7-EE6A-458E-8049-16C0BF34C2E9} = {C573CAF7-EE6A-458E-8049-16C0BF34C2E9} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Plugin_PadSimple", "Plugins\Plugin_PadSimple\Plugin_PadSimple.vcproj", "{9A183B48-ECC2-4121-876A-9B3793686073}" + ProjectSection(ProjectDependencies) = postProject + {C573CAF7-EE6A-458E-8049-16C0BF34C2E9} = {C573CAF7-EE6A-458E-8049-16C0BF34C2E9} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Bochs_disasm", "..\Externals\Bochs_disasm\Bochs_disasm.vcproj", "{29C2ABC1-ADA5-42CD-A5FC-96022D52A510}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlib", "..\Externals\zlib\zlib.vcproj", "{3E03C179-8251-46E4-81F4-466F114BAC63}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Plugin_DSP_LLE", "Plugins\Plugin_DSP_LLE\Plugin_DSP_LLE.vcproj", "{C60D0E7A-ED05-4C67-9EE7-3A6C0D7801C8}" + ProjectSection(ProjectDependencies) = postProject + {C573CAF7-EE6A-458E-8049-16C0BF34C2E9} = {C573CAF7-EE6A-458E-8049-16C0BF34C2E9} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DiscIO", "Core\DiscIO\DiscIO.vcproj", "{B7F1A9FB-BEA8-416E-9460-AE35A6A5165C}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Plugin_VideoOGL", "Plugins\Plugin_VideoOGL\Plugin_VideoOGL.vcproj", "{CFDCEE0E-FA45-4F72-9FCC-0B88F5A75160}" + ProjectSection(ProjectDependencies) = postProject + {C573CAF7-EE6A-458E-8049-16C0BF34C2E9} = {C573CAF7-EE6A-458E-8049-16C0BF34C2E9} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Common", "Core\Common\Common.vcproj", "{C573CAF7-EE6A-458E-8049-16C0BF34C2E9}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wxDolphin", "Core\DolphinWX\DolphinWX.vcproj", "{A72606EF-C5C1-4954-90AD-F0F93A8D97D9}" + ProjectSection(ProjectDependencies) = postProject + {9AC65CBE-7854-4A86-AA10-D73FF9E5D61F} = {9AC65CBE-7854-4A86-AA10-D73FF9E5D61F} + {636FAD5F-02D1-4E9A-BE67-FB8EA99B9A18} = {636FAD5F-02D1-4E9A-BE67-FB8EA99B9A18} + {C60D0E7A-ED05-4C67-9EE7-3A6C0D7801C8} = {C60D0E7A-ED05-4C67-9EE7-3A6C0D7801C8} + {29C2ABC1-ADA5-42CD-A5FC-96022D52A510} = {29C2ABC1-ADA5-42CD-A5FC-96022D52A510} + {48AD7E0A-25B1-4974-A1E3-03F8C438D34F} = {48AD7E0A-25B1-4974-A1E3-03F8C438D34F} + {CFDCEE0E-FA45-4F72-9FCC-0B88F5A75160} = {CFDCEE0E-FA45-4F72-9FCC-0B88F5A75160} + {9A183B48-ECC2-4121-876A-9B3793686073} = {9A183B48-ECC2-4121-876A-9B3793686073} + {3E03C179-8251-46E4-81F4-466F114BAC63} = {3E03C179-8251-46E4-81F4-466F114BAC63} + {0318BA30-EF48-441A-9E10-DC85EFAE39F0} = {0318BA30-EF48-441A-9E10-DC85EFAE39F0} + {4D3CD4C5-412B-4B49-9B1B-A68A2A129C77} = {4D3CD4C5-412B-4B49-9B1B-A68A2A129C77} + {F0B874CB-4476-4199-9315-8343D05AE684} = {F0B874CB-4476-4199-9315-8343D05AE684} + {C573CAF7-EE6A-458E-8049-16C0BF34C2E9} = {C573CAF7-EE6A-458E-8049-16C0BF34C2E9} + {B7F1A9FB-BEA8-416E-9460-AE35A6A5165C} = {B7F1A9FB-BEA8-416E-9460-AE35A6A5165C} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wxBase28", "..\Externals\wxWidgets\build\msw\wx_base.vcproj", "{48AD7E0A-25B1-4974-A1E3-03F8C438D34F}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wxCore28", "..\Externals\wxWidgets\build\msw\wx_core.vcproj", "{0318BA30-EF48-441A-9E10-DC85EFAE39F0}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DebuggerWX", "Core\DebuggerWX\DebuggerWX.vcproj", "{4D3CD4C5-412B-4B49-9B1B-A68A2A129C77}" + ProjectSection(ProjectDependencies) = postProject + {48AD7E0A-25B1-4974-A1E3-03F8C438D34F} = {48AD7E0A-25B1-4974-A1E3-03F8C438D34F} + {0318BA30-EF48-441A-9E10-DC85EFAE39F0} = {0318BA30-EF48-441A-9E10-DC85EFAE39F0} + {29C2ABC1-ADA5-42CD-A5FC-96022D52A510} = {29C2ABC1-ADA5-42CD-A5FC-96022D52A510} + {F0B874CB-4476-4199-9315-8343D05AE684} = {F0B874CB-4476-4199-9315-8343D05AE684} + {C573CAF7-EE6A-458E-8049-16C0BF34C2E9} = {C573CAF7-EE6A-458E-8049-16C0BF34C2E9} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Plugin_DSP_NULL", "Plugins\Plugin_DSP_NULL\Plugin_DSP_NULL.vcproj", "{9AC65CBE-7854-4A86-AA10-D73FF9E5D61F}" + ProjectSection(ProjectDependencies) = postProject + {C573CAF7-EE6A-458E-8049-16C0BF34C2E9} = {C573CAF7-EE6A-458E-8049-16C0BF34C2E9} + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + DebugFast|Win32 = DebugFast|Win32 + DebugFast|x64 = DebugFast|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {F0B874CB-4476-4199-9315-8343D05AE684}.Debug|Win32.ActiveCfg = Debug|Win32 + {F0B874CB-4476-4199-9315-8343D05AE684}.Debug|Win32.Build.0 = Debug|Win32 + {F0B874CB-4476-4199-9315-8343D05AE684}.Debug|x64.ActiveCfg = Debug|x64 + {F0B874CB-4476-4199-9315-8343D05AE684}.Debug|x64.Build.0 = Debug|x64 + {F0B874CB-4476-4199-9315-8343D05AE684}.DebugFast|Win32.ActiveCfg = DebugFast|Win32 + {F0B874CB-4476-4199-9315-8343D05AE684}.DebugFast|Win32.Build.0 = DebugFast|Win32 + {F0B874CB-4476-4199-9315-8343D05AE684}.DebugFast|x64.ActiveCfg = DebugFast|x64 + {F0B874CB-4476-4199-9315-8343D05AE684}.DebugFast|x64.Build.0 = DebugFast|x64 + {F0B874CB-4476-4199-9315-8343D05AE684}.Release|Win32.ActiveCfg = Release|Win32 + {F0B874CB-4476-4199-9315-8343D05AE684}.Release|Win32.Build.0 = Release|Win32 + {F0B874CB-4476-4199-9315-8343D05AE684}.Release|x64.ActiveCfg = Release|x64 + {F0B874CB-4476-4199-9315-8343D05AE684}.Release|x64.Build.0 = Release|x64 + {636FAD5F-02D1-4E9A-BE67-FB8EA99B9A18}.Debug|Win32.ActiveCfg = Debug|Win32 + {636FAD5F-02D1-4E9A-BE67-FB8EA99B9A18}.Debug|Win32.Build.0 = Debug|Win32 + {636FAD5F-02D1-4E9A-BE67-FB8EA99B9A18}.Debug|x64.ActiveCfg = Debug|x64 + {636FAD5F-02D1-4E9A-BE67-FB8EA99B9A18}.Debug|x64.Build.0 = Debug|x64 + {636FAD5F-02D1-4E9A-BE67-FB8EA99B9A18}.DebugFast|Win32.ActiveCfg = DebugFast|Win32 + {636FAD5F-02D1-4E9A-BE67-FB8EA99B9A18}.DebugFast|Win32.Build.0 = DebugFast|Win32 + {636FAD5F-02D1-4E9A-BE67-FB8EA99B9A18}.DebugFast|x64.ActiveCfg = DebugFast|x64 + {636FAD5F-02D1-4E9A-BE67-FB8EA99B9A18}.DebugFast|x64.Build.0 = DebugFast|x64 + {636FAD5F-02D1-4E9A-BE67-FB8EA99B9A18}.Release|Win32.ActiveCfg = Release|Win32 + {636FAD5F-02D1-4E9A-BE67-FB8EA99B9A18}.Release|Win32.Build.0 = Release|Win32 + {636FAD5F-02D1-4E9A-BE67-FB8EA99B9A18}.Release|x64.ActiveCfg = Release|x64 + {636FAD5F-02D1-4E9A-BE67-FB8EA99B9A18}.Release|x64.Build.0 = Release|x64 + {9A183B48-ECC2-4121-876A-9B3793686073}.Debug|Win32.ActiveCfg = Debug|Win32 + {9A183B48-ECC2-4121-876A-9B3793686073}.Debug|Win32.Build.0 = Debug|Win32 + {9A183B48-ECC2-4121-876A-9B3793686073}.Debug|x64.ActiveCfg = Debug|x64 + {9A183B48-ECC2-4121-876A-9B3793686073}.Debug|x64.Build.0 = Debug|x64 + {9A183B48-ECC2-4121-876A-9B3793686073}.DebugFast|Win32.ActiveCfg = DebugFast|Win32 + {9A183B48-ECC2-4121-876A-9B3793686073}.DebugFast|Win32.Build.0 = DebugFast|Win32 + {9A183B48-ECC2-4121-876A-9B3793686073}.DebugFast|x64.ActiveCfg = DebugFast|x64 + {9A183B48-ECC2-4121-876A-9B3793686073}.DebugFast|x64.Build.0 = DebugFast|x64 + {9A183B48-ECC2-4121-876A-9B3793686073}.Release|Win32.ActiveCfg = Release|Win32 + {9A183B48-ECC2-4121-876A-9B3793686073}.Release|Win32.Build.0 = Release|Win32 + {9A183B48-ECC2-4121-876A-9B3793686073}.Release|x64.ActiveCfg = Release|x64 + {9A183B48-ECC2-4121-876A-9B3793686073}.Release|x64.Build.0 = Release|x64 + {29C2ABC1-ADA5-42CD-A5FC-96022D52A510}.Debug|Win32.ActiveCfg = Debug|Win32 + {29C2ABC1-ADA5-42CD-A5FC-96022D52A510}.Debug|Win32.Build.0 = Debug|Win32 + {29C2ABC1-ADA5-42CD-A5FC-96022D52A510}.Debug|x64.ActiveCfg = Debug|x64 + {29C2ABC1-ADA5-42CD-A5FC-96022D52A510}.Debug|x64.Build.0 = Debug|x64 + {29C2ABC1-ADA5-42CD-A5FC-96022D52A510}.DebugFast|Win32.ActiveCfg = DebugFast|Win32 + {29C2ABC1-ADA5-42CD-A5FC-96022D52A510}.DebugFast|Win32.Build.0 = DebugFast|Win32 + {29C2ABC1-ADA5-42CD-A5FC-96022D52A510}.DebugFast|x64.ActiveCfg = DebugFast|x64 + {29C2ABC1-ADA5-42CD-A5FC-96022D52A510}.DebugFast|x64.Build.0 = DebugFast|x64 + {29C2ABC1-ADA5-42CD-A5FC-96022D52A510}.Release|Win32.ActiveCfg = Release|Win32 + {29C2ABC1-ADA5-42CD-A5FC-96022D52A510}.Release|Win32.Build.0 = Release|Win32 + {29C2ABC1-ADA5-42CD-A5FC-96022D52A510}.Release|x64.ActiveCfg = Release|x64 + {29C2ABC1-ADA5-42CD-A5FC-96022D52A510}.Release|x64.Build.0 = Release|x64 + {3E03C179-8251-46E4-81F4-466F114BAC63}.Debug|Win32.ActiveCfg = Debug|Win32 + {3E03C179-8251-46E4-81F4-466F114BAC63}.Debug|Win32.Build.0 = Debug|Win32 + {3E03C179-8251-46E4-81F4-466F114BAC63}.Debug|x64.ActiveCfg = Debug|x64 + {3E03C179-8251-46E4-81F4-466F114BAC63}.Debug|x64.Build.0 = Debug|x64 + {3E03C179-8251-46E4-81F4-466F114BAC63}.DebugFast|Win32.ActiveCfg = DebugFast|Win32 + {3E03C179-8251-46E4-81F4-466F114BAC63}.DebugFast|Win32.Build.0 = DebugFast|Win32 + {3E03C179-8251-46E4-81F4-466F114BAC63}.DebugFast|x64.ActiveCfg = DebugFast|x64 + {3E03C179-8251-46E4-81F4-466F114BAC63}.DebugFast|x64.Build.0 = DebugFast|x64 + {3E03C179-8251-46E4-81F4-466F114BAC63}.Release|Win32.ActiveCfg = Release|Win32 + {3E03C179-8251-46E4-81F4-466F114BAC63}.Release|Win32.Build.0 = Release|Win32 + {3E03C179-8251-46E4-81F4-466F114BAC63}.Release|x64.ActiveCfg = Release|x64 + {3E03C179-8251-46E4-81F4-466F114BAC63}.Release|x64.Build.0 = Release|x64 + {C60D0E7A-ED05-4C67-9EE7-3A6C0D7801C8}.Debug|Win32.ActiveCfg = Debug|Win32 + {C60D0E7A-ED05-4C67-9EE7-3A6C0D7801C8}.Debug|Win32.Build.0 = Debug|Win32 + {C60D0E7A-ED05-4C67-9EE7-3A6C0D7801C8}.Debug|x64.ActiveCfg = Debug|x64 + {C60D0E7A-ED05-4C67-9EE7-3A6C0D7801C8}.Debug|x64.Build.0 = Debug|x64 + {C60D0E7A-ED05-4C67-9EE7-3A6C0D7801C8}.DebugFast|Win32.ActiveCfg = DebugFast|Win32 + {C60D0E7A-ED05-4C67-9EE7-3A6C0D7801C8}.DebugFast|Win32.Build.0 = DebugFast|Win32 + {C60D0E7A-ED05-4C67-9EE7-3A6C0D7801C8}.DebugFast|x64.ActiveCfg = DebugFast|x64 + {C60D0E7A-ED05-4C67-9EE7-3A6C0D7801C8}.DebugFast|x64.Build.0 = DebugFast|x64 + {C60D0E7A-ED05-4C67-9EE7-3A6C0D7801C8}.Release|Win32.ActiveCfg = Release|Win32 + {C60D0E7A-ED05-4C67-9EE7-3A6C0D7801C8}.Release|Win32.Build.0 = Release|Win32 + {C60D0E7A-ED05-4C67-9EE7-3A6C0D7801C8}.Release|x64.ActiveCfg = Release|x64 + {C60D0E7A-ED05-4C67-9EE7-3A6C0D7801C8}.Release|x64.Build.0 = Release|x64 + {B7F1A9FB-BEA8-416E-9460-AE35A6A5165C}.Debug|Win32.ActiveCfg = Debug|Win32 + {B7F1A9FB-BEA8-416E-9460-AE35A6A5165C}.Debug|Win32.Build.0 = Debug|Win32 + {B7F1A9FB-BEA8-416E-9460-AE35A6A5165C}.Debug|x64.ActiveCfg = Debug|x64 + {B7F1A9FB-BEA8-416E-9460-AE35A6A5165C}.Debug|x64.Build.0 = Debug|x64 + {B7F1A9FB-BEA8-416E-9460-AE35A6A5165C}.DebugFast|Win32.ActiveCfg = DebugFast|Win32 + {B7F1A9FB-BEA8-416E-9460-AE35A6A5165C}.DebugFast|Win32.Build.0 = DebugFast|Win32 + {B7F1A9FB-BEA8-416E-9460-AE35A6A5165C}.DebugFast|x64.ActiveCfg = DebugFast|x64 + {B7F1A9FB-BEA8-416E-9460-AE35A6A5165C}.DebugFast|x64.Build.0 = DebugFast|x64 + {B7F1A9FB-BEA8-416E-9460-AE35A6A5165C}.Release|Win32.ActiveCfg = Release|Win32 + {B7F1A9FB-BEA8-416E-9460-AE35A6A5165C}.Release|Win32.Build.0 = Release|Win32 + {B7F1A9FB-BEA8-416E-9460-AE35A6A5165C}.Release|x64.ActiveCfg = Release|x64 + {B7F1A9FB-BEA8-416E-9460-AE35A6A5165C}.Release|x64.Build.0 = Release|x64 + {CFDCEE0E-FA45-4F72-9FCC-0B88F5A75160}.Debug|Win32.ActiveCfg = Debug|Win32 + {CFDCEE0E-FA45-4F72-9FCC-0B88F5A75160}.Debug|Win32.Build.0 = Debug|Win32 + {CFDCEE0E-FA45-4F72-9FCC-0B88F5A75160}.Debug|x64.ActiveCfg = Debug|x64 + {CFDCEE0E-FA45-4F72-9FCC-0B88F5A75160}.Debug|x64.Build.0 = Debug|x64 + {CFDCEE0E-FA45-4F72-9FCC-0B88F5A75160}.DebugFast|Win32.ActiveCfg = DebugFast|Win32 + {CFDCEE0E-FA45-4F72-9FCC-0B88F5A75160}.DebugFast|Win32.Build.0 = DebugFast|Win32 + {CFDCEE0E-FA45-4F72-9FCC-0B88F5A75160}.DebugFast|x64.ActiveCfg = DebugFast|x64 + {CFDCEE0E-FA45-4F72-9FCC-0B88F5A75160}.DebugFast|x64.Build.0 = DebugFast|x64 + {CFDCEE0E-FA45-4F72-9FCC-0B88F5A75160}.Release|Win32.ActiveCfg = Release|Win32 + {CFDCEE0E-FA45-4F72-9FCC-0B88F5A75160}.Release|Win32.Build.0 = Release|Win32 + {CFDCEE0E-FA45-4F72-9FCC-0B88F5A75160}.Release|x64.ActiveCfg = Release|x64 + {CFDCEE0E-FA45-4F72-9FCC-0B88F5A75160}.Release|x64.Build.0 = Release|x64 + {C573CAF7-EE6A-458E-8049-16C0BF34C2E9}.Debug|Win32.ActiveCfg = Debug|Win32 + {C573CAF7-EE6A-458E-8049-16C0BF34C2E9}.Debug|Win32.Build.0 = Debug|Win32 + {C573CAF7-EE6A-458E-8049-16C0BF34C2E9}.Debug|x64.ActiveCfg = Debug|x64 + {C573CAF7-EE6A-458E-8049-16C0BF34C2E9}.Debug|x64.Build.0 = Debug|x64 + {C573CAF7-EE6A-458E-8049-16C0BF34C2E9}.DebugFast|Win32.ActiveCfg = DebugFast|Win32 + {C573CAF7-EE6A-458E-8049-16C0BF34C2E9}.DebugFast|Win32.Build.0 = DebugFast|Win32 + {C573CAF7-EE6A-458E-8049-16C0BF34C2E9}.DebugFast|x64.ActiveCfg = DebugFast|x64 + {C573CAF7-EE6A-458E-8049-16C0BF34C2E9}.DebugFast|x64.Build.0 = DebugFast|x64 + {C573CAF7-EE6A-458E-8049-16C0BF34C2E9}.Release|Win32.ActiveCfg = Release|Win32 + {C573CAF7-EE6A-458E-8049-16C0BF34C2E9}.Release|Win32.Build.0 = Release|Win32 + {C573CAF7-EE6A-458E-8049-16C0BF34C2E9}.Release|x64.ActiveCfg = Release|x64 + {C573CAF7-EE6A-458E-8049-16C0BF34C2E9}.Release|x64.Build.0 = Release|x64 + {A72606EF-C5C1-4954-90AD-F0F93A8D97D9}.Debug|Win32.ActiveCfg = Debug|Win32 + {A72606EF-C5C1-4954-90AD-F0F93A8D97D9}.Debug|Win32.Build.0 = Debug|Win32 + {A72606EF-C5C1-4954-90AD-F0F93A8D97D9}.Debug|x64.ActiveCfg = Debug|x64 + {A72606EF-C5C1-4954-90AD-F0F93A8D97D9}.Debug|x64.Build.0 = Debug|x64 + {A72606EF-C5C1-4954-90AD-F0F93A8D97D9}.DebugFast|Win32.ActiveCfg = DebugFast|Win32 + {A72606EF-C5C1-4954-90AD-F0F93A8D97D9}.DebugFast|Win32.Build.0 = DebugFast|Win32 + {A72606EF-C5C1-4954-90AD-F0F93A8D97D9}.DebugFast|x64.ActiveCfg = DebugFast|x64 + {A72606EF-C5C1-4954-90AD-F0F93A8D97D9}.DebugFast|x64.Build.0 = DebugFast|x64 + {A72606EF-C5C1-4954-90AD-F0F93A8D97D9}.Release|Win32.ActiveCfg = Release|Win32 + {A72606EF-C5C1-4954-90AD-F0F93A8D97D9}.Release|Win32.Build.0 = Release|Win32 + {A72606EF-C5C1-4954-90AD-F0F93A8D97D9}.Release|x64.ActiveCfg = Release|x64 + {A72606EF-C5C1-4954-90AD-F0F93A8D97D9}.Release|x64.Build.0 = Release|x64 + {48AD7E0A-25B1-4974-A1E3-03F8C438D34F}.Debug|Win32.ActiveCfg = Debug|Win32 + {48AD7E0A-25B1-4974-A1E3-03F8C438D34F}.Debug|Win32.Build.0 = Debug|Win32 + {48AD7E0A-25B1-4974-A1E3-03F8C438D34F}.Debug|x64.ActiveCfg = Debug|x64 + {48AD7E0A-25B1-4974-A1E3-03F8C438D34F}.Debug|x64.Build.0 = Debug|x64 + {48AD7E0A-25B1-4974-A1E3-03F8C438D34F}.DebugFast|Win32.ActiveCfg = DebugFast|Win32 + {48AD7E0A-25B1-4974-A1E3-03F8C438D34F}.DebugFast|Win32.Build.0 = DebugFast|Win32 + {48AD7E0A-25B1-4974-A1E3-03F8C438D34F}.DebugFast|x64.ActiveCfg = DebugFast|x64 + {48AD7E0A-25B1-4974-A1E3-03F8C438D34F}.DebugFast|x64.Build.0 = DebugFast|x64 + {48AD7E0A-25B1-4974-A1E3-03F8C438D34F}.Release|Win32.ActiveCfg = Release|Win32 + {48AD7E0A-25B1-4974-A1E3-03F8C438D34F}.Release|Win32.Build.0 = Release|Win32 + {48AD7E0A-25B1-4974-A1E3-03F8C438D34F}.Release|x64.ActiveCfg = Release|x64 + {48AD7E0A-25B1-4974-A1E3-03F8C438D34F}.Release|x64.Build.0 = Release|x64 + {0318BA30-EF48-441A-9E10-DC85EFAE39F0}.Debug|Win32.ActiveCfg = Debug|Win32 + {0318BA30-EF48-441A-9E10-DC85EFAE39F0}.Debug|Win32.Build.0 = Debug|Win32 + {0318BA30-EF48-441A-9E10-DC85EFAE39F0}.Debug|x64.ActiveCfg = Debug|x64 + {0318BA30-EF48-441A-9E10-DC85EFAE39F0}.Debug|x64.Build.0 = Debug|x64 + {0318BA30-EF48-441A-9E10-DC85EFAE39F0}.DebugFast|Win32.ActiveCfg = DebugFast|Win32 + {0318BA30-EF48-441A-9E10-DC85EFAE39F0}.DebugFast|Win32.Build.0 = DebugFast|Win32 + {0318BA30-EF48-441A-9E10-DC85EFAE39F0}.DebugFast|x64.ActiveCfg = DebugFast|x64 + {0318BA30-EF48-441A-9E10-DC85EFAE39F0}.DebugFast|x64.Build.0 = DebugFast|x64 + {0318BA30-EF48-441A-9E10-DC85EFAE39F0}.Release|Win32.ActiveCfg = Release|Win32 + {0318BA30-EF48-441A-9E10-DC85EFAE39F0}.Release|Win32.Build.0 = Release|Win32 + {0318BA30-EF48-441A-9E10-DC85EFAE39F0}.Release|x64.ActiveCfg = Release|x64 + {0318BA30-EF48-441A-9E10-DC85EFAE39F0}.Release|x64.Build.0 = Release|x64 + {4D3CD4C5-412B-4B49-9B1B-A68A2A129C77}.Debug|Win32.ActiveCfg = Debug|Win32 + {4D3CD4C5-412B-4B49-9B1B-A68A2A129C77}.Debug|Win32.Build.0 = Debug|Win32 + {4D3CD4C5-412B-4B49-9B1B-A68A2A129C77}.Debug|x64.ActiveCfg = Debug|x64 + {4D3CD4C5-412B-4B49-9B1B-A68A2A129C77}.Debug|x64.Build.0 = Debug|x64 + {4D3CD4C5-412B-4B49-9B1B-A68A2A129C77}.DebugFast|Win32.ActiveCfg = DebugFast|Win32 + {4D3CD4C5-412B-4B49-9B1B-A68A2A129C77}.DebugFast|Win32.Build.0 = DebugFast|Win32 + {4D3CD4C5-412B-4B49-9B1B-A68A2A129C77}.DebugFast|x64.ActiveCfg = DebugFast|x64 + {4D3CD4C5-412B-4B49-9B1B-A68A2A129C77}.DebugFast|x64.Build.0 = DebugFast|x64 + {4D3CD4C5-412B-4B49-9B1B-A68A2A129C77}.Release|Win32.ActiveCfg = Release|Win32 + {4D3CD4C5-412B-4B49-9B1B-A68A2A129C77}.Release|Win32.Build.0 = Release|Win32 + {4D3CD4C5-412B-4B49-9B1B-A68A2A129C77}.Release|x64.ActiveCfg = Release|x64 + {4D3CD4C5-412B-4B49-9B1B-A68A2A129C77}.Release|x64.Build.0 = Release|x64 + {9AC65CBE-7854-4A86-AA10-D73FF9E5D61F}.Debug|Win32.ActiveCfg = Debug|Win32 + {9AC65CBE-7854-4A86-AA10-D73FF9E5D61F}.Debug|Win32.Build.0 = Debug|Win32 + {9AC65CBE-7854-4A86-AA10-D73FF9E5D61F}.Debug|x64.ActiveCfg = Debug|x64 + {9AC65CBE-7854-4A86-AA10-D73FF9E5D61F}.Debug|x64.Build.0 = Debug|x64 + {9AC65CBE-7854-4A86-AA10-D73FF9E5D61F}.DebugFast|Win32.ActiveCfg = DebugFast|Win32 + {9AC65CBE-7854-4A86-AA10-D73FF9E5D61F}.DebugFast|Win32.Build.0 = DebugFast|Win32 + {9AC65CBE-7854-4A86-AA10-D73FF9E5D61F}.DebugFast|x64.ActiveCfg = DebugFast|x64 + {9AC65CBE-7854-4A86-AA10-D73FF9E5D61F}.DebugFast|x64.Build.0 = DebugFast|x64 + {9AC65CBE-7854-4A86-AA10-D73FF9E5D61F}.Release|Win32.ActiveCfg = Release|Win32 + {9AC65CBE-7854-4A86-AA10-D73FF9E5D61F}.Release|Win32.Build.0 = Release|Win32 + {9AC65CBE-7854-4A86-AA10-D73FF9E5D61F}.Release|x64.ActiveCfg = Release|x64 + {9AC65CBE-7854-4A86-AA10-D73FF9E5D61F}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + AMDCaProjectFile = D:\Dev\Dolphin\trunk\Source\CodeAnalyst\Dolphin.caw + EndGlobalSection + GlobalSection(DPCodeReviewSolutionGUID) = preSolution + DPCodeReviewSolutionGUID = {00000000-0000-0000-0000-000000000000} + EndGlobalSection +EndGlobal diff --git a/Source/Dolphin.suo b/Source/Dolphin.suo new file mode 100644 index 0000000000..0dbc6be5bf Binary files /dev/null and b/Source/Dolphin.suo differ diff --git a/Source/PluginSpecs/PluginSpecs.h b/Source/PluginSpecs/PluginSpecs.h new file mode 100644 index 0000000000..8160a833cb --- /dev/null +++ b/Source/PluginSpecs/PluginSpecs.h @@ -0,0 +1,73 @@ +//__________________________________________________________________________________________________ +// Common plugin spec, version #1.0 maintained by F|RES +// + +#ifndef _PLUGINS_H_INCLUDED__ +#define _PLUGINS_H_INCLUDED__ + +#ifdef _WIN32 + +#include + +#else + +#define EXPORT +#define CALL + +#ifndef TRUE +#define TRUE 1 +#define FALSE 0 +#endif + +#define __cdecl + +// simulate something that looks like win32 +// long term, kill these + +// glxew defines BOOL and BYTE. evil. +#ifdef BOOL +#undef BOOL +#undef BYTE +#endif + +#define BOOL unsigned int +#define BYTE unsigned char +#define WORD unsigned short +#define DWORD unsigned int +#define HWND void* +#define HINSTANCE void* +#define INT int +#define CHAR char +#define TCHAR char +#endif + +#if defined(__cplusplus) +extern "C" { +#endif + +// plugin types +#define PLUGIN_TYPE_VIDEO 1 +#define PLUGIN_TYPE_DVD 2 +#define PLUGIN_TYPE_PAD 3 +#define PLUGIN_TYPE_AUDIO 4 +#define PLUGIN_TYPE_COMPILER 5 +#define PLUGIN_TYPE_DSP 6 + +typedef struct +{ + WORD Version; // Set to 0x0100 + WORD Type; // Set to PLUGIN_TYPE_DVD + char Name[100]; // Name of the DLL +} PLUGIN_INFO; + +typedef struct +{ + HWND mainWindow; + HWND displayWindow; + HINSTANCE hInstance; +} OSData; + +#if defined(__cplusplus) +} +#endif +#endif diff --git a/Source/PluginSpecs/pluginspecs_compiler.h b/Source/PluginSpecs/pluginspecs_compiler.h new file mode 100644 index 0000000000..5b0ec476a9 --- /dev/null +++ b/Source/PluginSpecs/pluginspecs_compiler.h @@ -0,0 +1,105 @@ +//__________________________________________________________________________________________________ +// Common compiler plugin spec, version #1.0 maintained by F|RES +// + +#ifndef _COMPILER_H_INCLUDED__ +#define _COMPILER_H_INCLUDED__ + +#include "PluginSpecs.h" + +#if defined(__cplusplus) +extern "C" { +#endif + +#define EXPORT __declspec(dllexport) +#define CALL _cdecl + +typedef void (*TWriteBigEData)(const unsigned __int8* _pData, const unsigned __int32 _iAddress, const unsigned __int32 _iSize); +typedef void (*TPatchFunction)(DWORD _uAddress, unsigned char* _pMachineCode); +typedef void (*TLog)(char* _pMessage); + +typedef struct +{ + HWND hWnd; + TPatchFunction pPatchFunction; + TLog pLog; +} SCompilerInitialize; + + +// __________________________________________________________________________________________________ +// Function: GetDllInfo +// Purpose: This function allows the emulator to gather information +// about the DLL by filling in the PluginInfo structure. +// input: a pointer to a PLUGIN_INFO structure that needs to be +// filled by the function. (see def above) +// output: none +// +EXPORT void CALL GetDllInfo(PLUGIN_INFO* _PluginInfo); + +// __________________________________________________________________________________________________ +// Function: CloseDLL +// Purpose: This function is called when the emulator is closing +// down allowing the DLL to de-initialise. +// input: none +// output: none +// +EXPORT void CALL CloseDLL(void); + +// __________________________________________________________________________________________________ +// Function: DllAbout +// Purpose: This function is optional function that is provided +// to give further information about the DLL. +// input: a handle to the window that calls this function +// output: none +// +EXPORT void CALL DllAbout(HWND _hParent); + +// __________________________________________________________________________________________________ +// Function: DllConfig +// Purpose: This function is optional function that is provided +// to allow the user to configure the dll +// input: a handle to the window that calls this function +// output: none +// +EXPORT void CALL DllConfig(HWND _hParent); + +// __________________________________________________________________________________________________ +// Function: +// Purpose: +// input: SCompilerInitialize +// output: none +// +EXPORT void CALL CompilerInitialize(SCompilerInitialize _CompilerInitialize); + +// __________________________________________________________________________________________________ +// Function: SetupHeader +// Purpose: +// input: +// output: +// +EXPORT void CALL SetupHeader(char* _szSourceCode); + +// __________________________________________________________________________________________________ +// Function: CompileSourceCode +// Purpose: This function will compile a NULL-terminated string of C +// source code.. +// input: pDest: Pointer to address for the new machine code +// strSourceCode: The NULL-terminated C Source Code string +// output: Size of the Compiled Source, 0 == ERROR +// +EXPORT DWORD CALL CompileSourceCode(char* _szSourceCode, BYTE* _pMachineCode, DWORD _dwMaxSize); + +// __________________________________________________________________________________________________ +// Function: InsertEventString +// Purpose: This optional function will insert the code in +// EventString[] immediately before every block of compiled code +// returns. Used to check for Interrupts and cyclic tasks. +// input: The Event's C code +// output: TRUE/FALSE for pass or fail +// +EXPORT DWORD CALL InsertEventString(char* _szEventSourceCode); + +#if defined(__cplusplus) +} +#endif +#endif diff --git a/Source/PluginSpecs/pluginspecs_dsp.h b/Source/PluginSpecs/pluginspecs_dsp.h new file mode 100644 index 0000000000..5d99663789 --- /dev/null +++ b/Source/PluginSpecs/pluginspecs_dsp.h @@ -0,0 +1,170 @@ +//__________________________________________________________________________________________________ +// Common dsp plugin spec, version #1.0 maintained by F|RES +// + +#ifndef _DSP_H_INCLUDED__ +#define _DSP_H_INCLUDED__ + +#include "PluginSpecs.h" + +#if defined(__cplusplus) +extern "C" { +#endif + +#ifdef _WIN32 +#define EXPORT __declspec(dllexport) +#define CALL __cdecl +#else +#define EXPORT +#define CALL +#endif + +typedef unsigned char (*TARAM_Read_U8)(const unsigned int _uAddress); +typedef unsigned char* (*TGetMemoryPointer)(const unsigned int _uAddress); +typedef unsigned char* (*TGetARAMPointer)(void); +typedef void (*TLog)(const char* _szMessage); +typedef void (*TDebuggerBreak)(void); +typedef void (*TGenerateDSPInt)(void); +typedef unsigned int(*TAudioGetStreaming)(short* _pDestBuffer, unsigned int _numSamples); + +typedef struct +{ + void* hWnd; + TARAM_Read_U8 pARAM_Read_U8; + TGetMemoryPointer pGetMemoryPointer; + TGetARAMPointer pGetARAMPointer; + TLog pLog; + TDebuggerBreak pDebuggerBreak; + TGenerateDSPInt pGenerateDSPInterrupt; + TAudioGetStreaming pGetAudioStreaming; +} DSPInitialize; + +// __________________________________________________________________________________________________ +// Function: GetDllInfo +// Purpose: This function allows the emulator to gather information +// about the DLL by filling in the PluginInfo structure. +// input: a pointer to a PLUGIN_INFO structure that needs to be +// filled by the function. (see def above) +// output: none +// +EXPORT void CALL GetDllInfo(PLUGIN_INFO* _pPluginInfo); + +// __________________________________________________________________________________________________ +// Function: DllAbout +// Purpose: This function is optional function that is provided +// to give further information about the DLL. +// input: a handle to the window that calls this function +// output: none +// +EXPORT void CALL DllAbout(HWND _hParent); + +// __________________________________________________________________________________________________ +// Function: DllConfig +// Purpose: This function is optional function that is provided +// to allow the user to configure the DLL +// input: a handle to the window that calls this function +// output: none +// +EXPORT void CALL DllConfig(HWND _hParent); + +// __________________________________________________________________________________________________ +// Function: DllConfig +// Purpose: This function is optional function that is provided +// to allow the user to configure the DLL +// input: a handle to the window that calls this function +// output: none +// +EXPORT void CALL DllConfig(HWND _hParent); + +// __________________________________________________________________________________________________ +// Function: DllDebugger +// Purpose: Open the debugger +// input: a handle to the window that calls this function +// output: none +// +EXPORT void CALL DllDebugger(HWND _hParent); + +// __________________________________________________________________________________________________ +// Function: DSP_Initialize +// Purpose: +// input: DSPInitialize +// output: none +// +EXPORT void CALL DSP_Initialize(DSPInitialize _dspInitialize); + +// __________________________________________________________________________________________________ +// Function: DSP_Shutdown +// Purpose: This function is called when the emulator is shutting down +// a game allowing the dll to de-initialise. +// input: none +// output: none +// +EXPORT void CALL DSP_Shutdown(void); + +// __________________________________________________________________________________________________ +// Function: DSP_ReadMailboxHigh +// Purpose: Send mail to high DSP Mailbox +// input: none +// output: none +// +EXPORT unsigned short CALL DSP_ReadMailboxHigh(bool _CPUMailbox); + +// __________________________________________________________________________________________________ +// Function: DSP_ReadMailboxLow +// Purpose: Send mail to low DSP Mailbox +// input: none +// output: none +// +EXPORT unsigned short CALL DSP_ReadMailboxLow(bool _CPUMailbox); + +// __________________________________________________________________________________________________ +// Function: DSP_WriteMailboxHigh +// Purpose: Send mail to high CPU Mailbox +// input: none +// output: none +// +EXPORT void CALL DSP_WriteMailboxHigh(bool _CPUMailbox, unsigned short _uHighMail); + +// __________________________________________________________________________________________________ +// Function: DSP_WriteMailboxLow +// Purpose: Send mail to low CPU Mailbox +// input: none +// output: none +// +EXPORT void CALL DSP_WriteMailboxLow(bool _CPUMailbox, unsigned short _uLowMail); + +// __________________________________________________________________________________________________ +// Function: DSP_WriteControlRegister +// Purpose: This function is called if the core reads from the DSP control register +// input: Value to be written +// output: value of the control register +// +EXPORT unsigned short CALL DSP_WriteControlRegister(unsigned short _Value); + +// __________________________________________________________________________________________________ +// Function: DSP_ReadControlRegister +// Purpose: This function is called if the core reads from the DSP control register +// output: value of the control register +// +EXPORT unsigned short CALL DSP_ReadControlRegister(void); + +// __________________________________________________________________________________________________ +// Function: DSP_Update +// Purpose: This function is called from time to time from the core. +// input: flag (DSP_FLAG_RESET, DSP_FLAG_ASSERT_INT, ...) +// output: TRUE if the flag is set, else FALSE +// +EXPORT void CALL DSP_Update(void); + +// __________________________________________________________________________________________________ +// Function: DSP_SendAIBuffer +// Purpose: This function sends the current AI Buffer to the DSP plugin +// input: _Address : Memory-Address +// input: _Size : Size of the Buffer +// +EXPORT void CALL DSP_SendAIBuffer(unsigned int _Address, unsigned int _Size); + #undef CALL +#if defined(__cplusplus) +} +#endif +#endif diff --git a/Source/PluginSpecs/pluginspecs_pad.h b/Source/PluginSpecs/pluginspecs_pad.h new file mode 100644 index 0000000000..24fa19cdfe --- /dev/null +++ b/Source/PluginSpecs/pluginspecs_pad.h @@ -0,0 +1,141 @@ +//__________________________________________________________________________________________________ +// Common pad plugin spec, version #1.0 maintained by F|RES +// + +#ifndef _PAD_H_INCLUDED__ +#define _PAD_H_INCLUDED__ + +#include "PluginSpecs.h" + +#if defined(__cplusplus) +extern "C" { +#endif + +#ifdef _WIN32 +#define EXPORT __declspec(dllexport) +#define CALL __cdecl +#else +#define CALL +#define EXPORT +#endif + +#define PAD_ERR_NONE 0 +#define PAD_ERR_NO_CONTROLLER -1 +#define PAD_ERR_NOT_READY -2 +#define PAD_ERR_TRANSFER -3 + +#define PAD_USE_ORIGIN 0x0080 +#define PAD_BUTTON_LEFT 0x0001 +#define PAD_BUTTON_RIGHT 0x0002 +#define PAD_BUTTON_DOWN 0x0004 +#define PAD_BUTTON_UP 0x0008 +#define PAD_TRIGGER_Z 0x0010 +#define PAD_TRIGGER_R 0x0020 +#define PAD_TRIGGER_L 0x0040 +#define PAD_BUTTON_A 0x0100 +#define PAD_BUTTON_B 0x0200 +#define PAD_BUTTON_X 0x0400 +#define PAD_BUTTON_Y 0x0800 +#define PAD_BUTTON_START 0x1000 + +typedef void (*TLog)(const char* _pMessage); + +typedef struct +{ + HWND hWnd; + TLog pLog; +} SPADInitialize; + +typedef struct +{ + unsigned short button; // Or-ed PAD_BUTTON_* bits + unsigned char stickX; // 0 <= stickX <= 255 + unsigned char stickY; // 0 <= stickY <= 255 + unsigned char substickX; // 0 <= substickX <= 255 + unsigned char substickY; // 0 <= substickY <= 255 + unsigned char triggerLeft; // 0 <= triggerLeft <= 255 + unsigned char triggerRight; // 0 <= triggerRight <= 255 + unsigned char analogA; // 0 <= analogA <= 255 + unsigned char analogB; // 0 <= analogB <= 255 + signed char err; // one of PAD_ERR_* number +} SPADStatus; + +///////////////////////////////////////////////////////////////////////////////////////////////////// +// I N T E R F A C E //////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////// + +// __________________________________________________________________________________________________ +// Function: GetDllInfo +// Purpose: This function allows the emulator to gather information +// about the DLL by filling in the PluginInfo structure. +// input: a pointer to a PLUGIN_INFO structure that needs to be +// filled by the function. (see def above) +// output: none +// +EXPORT void CALL GetDllInfo(PLUGIN_INFO* _pPluginInfo); + +// __________________________________________________________________________________________________ +// Function: DllAbout +// Purpose: This function is optional function that is provided +// to give further information about the DLL. +// input: a handle to the window that calls this function +// output: none +// +EXPORT void CALL DllAbout(HWND _hParent); + +// __________________________________________________________________________________________________ +// Function: DllConfig +// Purpose: This function is optional function that is provided +// to allow the user to configure the DLL +// input: a handle to the window that calls this function +// output: none +// +EXPORT void CALL DllConfig(HWND _hParent); + +// __________________________________________________________________________________________________ +// Function: +// Purpose: +// input: SPADInitialize +// output: none +// +EXPORT void CALL PAD_Initialize(SPADInitialize _PADInitialize); + +// __________________________________________________________________________________________________ +// Function: PAD_Shutdown +// Purpose: This function is called when the emulator is closing +// down allowing the DLL to de-initialise. +// input: none +// output: none +// +EXPORT void CALL PAD_Shutdown(); + +// __________________________________________________________________________________________________ +// Function: +// Purpose: +// input: +// output: +// +EXPORT void CALL PAD_GetStatus(BYTE _numPAD, SPADStatus* _pPADStatus); + +// __________________________________________________________________________________________________ +// Function: PAD_Rumble +// Purpose: Pad rumble! +// input: PAD number, Command type (Stop=0, Rumble=1, Stop Hard=2) and strength of Rumble +// output: none +// +EXPORT void CALL PAD_Rumble(BYTE _numPAD, unsigned int _uType, unsigned int _uStrength); + +// __________________________________________________________________________________________________ +// Function: SaveLoadState +// Purpose: Saves/load state +// input: pointer to a 32k scratchpad/saved state +// output: writes or reads to the scratchpad, returning size of data +// TODO: save format should be standardized so that save +// states don't become plugin dependent which would suck +// +EXPORT unsigned int CALL SaveLoadState(char *ptr, BOOL save); +#undef CALL +#if defined(__cplusplus) +} +#endif +#endif diff --git a/Source/PluginSpecs/pluginspecs_video.h b/Source/PluginSpecs/pluginspecs_video.h new file mode 100644 index 0000000000..5a8665970c --- /dev/null +++ b/Source/PluginSpecs/pluginspecs_video.h @@ -0,0 +1,177 @@ +//__________________________________________________________________________________________________ +// Common video plugin spec, version #1.0 maintained by F|RES +// + +#ifndef _VIDEO_H_INCLUDED__ +#define _VIDEO_H_INCLUDED__ + +#include "PluginSpecs.h" + +#if defined(__cplusplus) +extern "C" { +#endif + +#ifdef _WIN32 +#define EXPORT __declspec(dllexport) +#define CALL __cdecl +#else +#define EXPORT +#define CALL +#endif + +typedef void (*TSetPEToken)(const unsigned short _token, const int _bSetTokenAcknowledge); +typedef void (*TSetPEFinish)(void); +typedef unsigned char* (*TGetMemoryPointer)(const unsigned int _iAddress); +typedef void (*TVideoLog)(const char* _pMessage, BOOL _bBreak); +typedef void (*TRequestWindowSize)(int _iWidth, int _iHeight, BOOL _bFullscreen); +typedef void (*TCopiedToXFB)(void); +typedef BOOL (*TPeekMessages)(void); +typedef void (*TUpdateInterrupts)(void); +typedef void (*TUpdateFPSDisplay)(const char* text); // sets the window title + +typedef struct +{ + // fifo registers + volatile DWORD CPBase; + volatile DWORD CPEnd; + DWORD CPHiWatermark; + DWORD CPLoWatermark; + volatile INT CPReadWriteDistance; + volatile DWORD CPWritePointer; + volatile DWORD CPReadPointer; + volatile DWORD CPBreakpoint; + + volatile bool bFF_GPReadEnable; + volatile bool bFF_BPEnable; + volatile bool bFF_GPLinkEnable; + volatile bool bFF_Breakpoint; + volatile bool bPauseRead; +#ifdef _WIN32 + CRITICAL_SECTION sync; +#endif +} SCPFifoStruct; + +typedef struct +{ + void *pWindowHandle; + + TSetPEToken pSetPEToken; + TSetPEFinish pSetPEFinish; + TGetMemoryPointer pGetMemoryPointer; + TVideoLog pLog; + TRequestWindowSize pRequestWindowSize; + TCopiedToXFB pCopiedToXFB; + TPeekMessages pPeekMessages; + TUpdateInterrupts pUpdateInterrupts; + TUpdateFPSDisplay pUpdateFPSDisplay; + SCPFifoStruct *pCPFifo; + + unsigned char *pVIRegs; + void *pMemoryBase; +} SVideoInitialize; + +///////////////////////////////////////////////////////////////////////////////////////////////////// +// I N T E R F A C E //////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////// + +// __________________________________________________________________________________________________ +// Function: GetDllInfo +// Purpose: This function allows the emulator to gather information +// about the DLL by filling in the PluginInfo structure. +// input: a pointer to a PLUGIN_INFO structure that needs to be +// filled by the function. (see def above) +// output: none +// +// +#ifndef _WIN32 +#define _CDECLCALL +#endif + +EXPORT void CALL GetDllInfo(PLUGIN_INFO* _pPluginInfo); + +// __________________________________________________________________________________________________ +// Function: DllAbout +// Purpose: This function is optional function that is provided +// to give further information about the DLL. +// input: a handle to the window that calls this function +// output: none +// +EXPORT void CALL DllAbout(HWND _hParent); + +// __________________________________________________________________________________________________ +// Function: DllConfig +// Purpose: This function is optional function that is provided +// to allow the user to configure the DLL +// input: a handle to the window that calls this function +// output: none +// +EXPORT void CALL DllConfig(HWND _hParent); + +// __________________________________________________________________________________________________ +// Function: Video_Initialize +// Purpose: +// input: SVideoInitialize* - pointer because window data will be passed back +// output: none +// +EXPORT void CALL Video_Initialize(SVideoInitialize* _pvideoInitialize); + +// __________________________________________________________________________________________________ +// Function: Video_Prepare +// Purpose: This function is called from the EmuThread before the +// emulation has started. It is just for threadsensitive +// APIs like OpenGL. +// input: none +// output: none +// +EXPORT void CALL Video_Prepare(void); + +// __________________________________________________________________________________________________ +// Function: Video_Shutdown +// Purpose: This function is called when the emulator is shutting down +// a game allowing the dll to de-initialise. +// input: none +// output: none +// +EXPORT void CALL Video_Shutdown(void); + +// __________________________________________________________________________________________________ +// Function: Video_ExecuteFifoBuffer +// Purpose: This function is called if data is inside the fifo-buffer +// input: a data-byte (i know we have to optimize this ;-)) +// output: none +// +EXPORT void CALL Video_SendFifoData(BYTE *_uData); + +// __________________________________________________________________________________________________ +// Function: Video_UpdateXFB +// Purpose: This fucntion is called when you have to flip the yuv2 +// video-buffer. You should ignore this function after you +// got the first EFB to XFB copy. +// input: pointer to the XFB, width and height of the XFB +// output: none +// +EXPORT void CALL Video_UpdateXFB(BYTE* _pXFB, DWORD _dwWidth, DWORD _dwHeight); + +// __________________________________________________________________________________________________ +// Function: Video_Screenshot +// Purpose: This fucntion is called when you want to do a screenshot +// input: Filename +// output: TRUE if all was okay +// +EXPORT BOOL CALL Video_Screenshot(TCHAR* _szFilename); + + +// __________________________________________________________________________________________________ +// Function: Video_Screenshot +// Purpose: This fucntion is called when you want to do a screenshot +// input: Filename +// output: TRUE if all was okay +// +EXPORT void CALL Video_EnterLoop(void); + +#undef CALL + +#if defined(__cplusplus) +} +#endif +#endif diff --git a/Source/Plugins/Plugin_DSP_LLE/Plugin_DSP_LLE.sln b/Source/Plugins/Plugin_DSP_LLE/Plugin_DSP_LLE.sln new file mode 100644 index 0000000000..f046e7bf54 --- /dev/null +++ b/Source/Plugins/Plugin_DSP_LLE/Plugin_DSP_LLE.sln @@ -0,0 +1,26 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Plugin_DSP_LLE", "Plugin_DSP_LLE.vcproj", "{D6E56527-BBB9-4EAD-A6EC-49D4BF6AFCD8}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {D6E56527-BBB9-4EAD-A6EC-49D4BF6AFCD8}.Debug|Win32.ActiveCfg = Debug|Win32 + {D6E56527-BBB9-4EAD-A6EC-49D4BF6AFCD8}.Debug|Win32.Build.0 = Debug|Win32 + {D6E56527-BBB9-4EAD-A6EC-49D4BF6AFCD8}.Debug|x64.ActiveCfg = Debug|x64 + {D6E56527-BBB9-4EAD-A6EC-49D4BF6AFCD8}.Debug|x64.Build.0 = Debug|x64 + {D6E56527-BBB9-4EAD-A6EC-49D4BF6AFCD8}.Release|Win32.ActiveCfg = Release|Win32 + {D6E56527-BBB9-4EAD-A6EC-49D4BF6AFCD8}.Release|Win32.Build.0 = Release|Win32 + {D6E56527-BBB9-4EAD-A6EC-49D4BF6AFCD8}.Release|x64.ActiveCfg = Release|x64 + {D6E56527-BBB9-4EAD-A6EC-49D4BF6AFCD8}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Source/Plugins/Plugin_DSP_LLE/Plugin_DSP_LLE.vcproj b/Source/Plugins/Plugin_DSP_LLE/Plugin_DSP_LLE.vcproj new file mode 100644 index 0000000000..da0f82f5da --- /dev/null +++ b/Source/Plugins/Plugin_DSP_LLE/Plugin_DSP_LLE.vcproj @@ -0,0 +1,791 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Source/Plugins/Plugin_DSP_LLE/Res/atlres.h b/Source/Plugins/Plugin_DSP_LLE/Res/atlres.h new file mode 100644 index 0000000000..6e4f0ecd39 --- /dev/null +++ b/Source/Plugins/Plugin_DSP_LLE/Res/atlres.h @@ -0,0 +1,262 @@ +// Windows Template Library - WTL version 8.0 +// Copyright (C) Microsoft Corporation. All rights reserved. +// +// This file is a part of the Windows Template Library. +// The use and distribution terms for this software are covered by the +// Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php) +// which can be found in the file CPL.TXT at the root of this distribution. +// By using this software in any fashion, you are agreeing to be bound by +// the terms of this license. You must not remove this notice, or +// any other, from this software. + +#ifndef __ATLRES_H__ +#define __ATLRES_H__ + +#pragma once + +#if defined (_WIN32_WCE) && !defined (__ATLRESCE_H__) + #error Use atlresCE.h instead of atlres.h for Windows CE +#endif + + +#ifdef RC_INVOKED +#ifndef _INC_WINDOWS + +#define _INC_WINDOWS + + #ifndef _WIN32_WCE +#define VS_VERSION_INFO 1 + + #ifdef APSTUDIO_INVOKED +#define APSTUDIO_HIDDEN_SYMBOLS // Ignore following symbols + #endif // APSTUDIO_INVOKED + + #ifndef WINVER +#define WINVER 0x0400 // default to Windows Version 4.0 + #endif // !WINVER + + #include + +// operation messages sent to DLGINIT +#define LB_ADDSTRING (WM_USER + 1) +#define CB_ADDSTRING (WM_USER + 3) + #endif // !_WIN32_WCE + + #ifdef APSTUDIO_INVOKED + #undef APSTUDIO_HIDDEN_SYMBOLS + #endif // APSTUDIO_INVOKED + + #ifdef IDC_STATIC + #undef IDC_STATIC + #endif // IDC_STATIC +#define IDC_STATIC (-1) + +#endif // !_INC_WINDOWS +#endif // RC_INVOKED + +#ifdef APSTUDIO_INVOKED +#define APSTUDIO_HIDDEN_SYMBOLS +#endif // APSTUDIO_INVOKED + +/////////////////////////////////////////////////////////////////////////////// +// ATL resource types + +#ifndef RC_INVOKED +#define RT_DLGINIT MAKEINTRESOURCE(240) +#define RT_TOOLBAR MAKEINTRESOURCE(241) +#endif // RC_INVOKED + +/////////////////////////////////////////////////////////////////////////////// + +#ifdef APSTUDIO_INVOKED + #undef APSTUDIO_HIDDEN_SYMBOLS +#endif // APSTUDIO_INVOKED + +/////////////////////////////////////////////////////////////////////////////// +// Standard window components + +#define ID_SEPARATOR 0 // special separator value +#define ID_DEFAULT_PANE 0 // default status bar pane + +#ifndef RC_INVOKED // code only +// standard control bars (IDW = window ID) +#define ATL_IDW_TOOLBAR 0xE800 // main Toolbar for window +#define ATL_IDW_STATUS_BAR 0xE801 // Status bar window +#define ATL_IDW_COMMAND_BAR 0xE802 // Command bar window + +// parts of a frame window +#define ATL_IDW_CLIENT 0xE900 +#define ATL_IDW_PANE_FIRST 0xE900 // first pane (256 max) +#define ATL_IDW_PANE_LAST 0xE9FF +#define ATL_IDW_HSCROLL_FIRST 0xEA00 // first Horz scrollbar (16 max) +#define ATL_IDW_VSCROLL_FIRST 0xEA10 // first Vert scrollbar (16 max) + +#define ATL_IDW_SIZE_BOX 0xEA20 // size box for splitters +#define ATL_IDW_PANE_SAVE 0xEA21 // to shift ATL_IDW_PANE_FIRST + +// bands for a rebar +#define ATL_IDW_BAND_FIRST 0xEB00 +#define ATL_IDW_BAND_LAST 0xEBFF +#endif // !RC_INVOKED + +/////////////////////////////////////////////////////////////////////////////// +// Standard Commands + +// File commands +#define ID_FILE_NEW 0xE100 +#define ID_FILE_OPEN 0xE101 +#define ID_FILE_CLOSE 0xE102 +#define ID_FILE_SAVE 0xE103 +#define ID_FILE_SAVE_AS 0xE104 +#define ID_FILE_PAGE_SETUP 0xE105 +#define ID_FILE_PRINT_SETUP 0xE106 +#define ID_FILE_PRINT 0xE107 +#define ID_FILE_PRINT_DIRECT 0xE108 +#define ID_FILE_PRINT_PREVIEW 0xE109 +#define ID_FILE_UPDATE 0xE10A +#define ID_FILE_SAVE_COPY_AS 0xE10B +#define ID_FILE_SEND_MAIL 0xE10C + +#define ID_FILE_MRU_FIRST 0xE110 +#define ID_FILE_MRU_FILE1 0xE110 // range - 16 max +#define ID_FILE_MRU_FILE2 0xE111 +#define ID_FILE_MRU_FILE3 0xE112 +#define ID_FILE_MRU_FILE4 0xE113 +#define ID_FILE_MRU_FILE5 0xE114 +#define ID_FILE_MRU_FILE6 0xE115 +#define ID_FILE_MRU_FILE7 0xE116 +#define ID_FILE_MRU_FILE8 0xE117 +#define ID_FILE_MRU_FILE9 0xE118 +#define ID_FILE_MRU_FILE10 0xE119 +#define ID_FILE_MRU_FILE11 0xE11A +#define ID_FILE_MRU_FILE12 0xE11B +#define ID_FILE_MRU_FILE13 0xE11C +#define ID_FILE_MRU_FILE14 0xE11D +#define ID_FILE_MRU_FILE15 0xE11E +#define ID_FILE_MRU_FILE16 0xE11F +#define ID_FILE_MRU_LAST 0xE11F + +// Edit commands +#define ID_EDIT_CLEAR 0xE120 +#define ID_EDIT_CLEAR_ALL 0xE121 +#define ID_EDIT_COPY 0xE122 +#define ID_EDIT_CUT 0xE123 +#define ID_EDIT_FIND 0xE124 +#define ID_EDIT_PASTE 0xE125 +#define ID_EDIT_PASTE_LINK 0xE126 +#define ID_EDIT_PASTE_SPECIAL 0xE127 +#define ID_EDIT_REPEAT 0xE128 +#define ID_EDIT_REPLACE 0xE129 +#define ID_EDIT_SELECT_ALL 0xE12A +#define ID_EDIT_UNDO 0xE12B +#define ID_EDIT_REDO 0xE12C + +// Window commands +#define ID_WINDOW_NEW 0xE130 +#define ID_WINDOW_ARRANGE 0xE131 +#define ID_WINDOW_CASCADE 0xE132 +#define ID_WINDOW_TILE_HORZ 0xE133 +#define ID_WINDOW_TILE_VERT 0xE134 +#define ID_WINDOW_SPLIT 0xE135 +#ifndef RC_INVOKED // code only +#define ATL_IDM_WINDOW_FIRST 0xE130 +#define ATL_IDM_WINDOW_LAST 0xE13F +#define ATL_IDM_FIRST_MDICHILD 0xFF00 // window list starts here +#define ATL_IDM_LAST_MDICHILD 0xFFFD +#endif // !RC_INVOKED +// TabView +#define ID_WINDOW_TABFIRST 0xFF00 // = ATL_IDM_FIRST_MDICHILD +#define ID_WINDOW_TABLAST 0xFFFD +#define ID_WINDOW_SHOWTABLIST 0xFFFE + +// Help and App commands +#define ID_APP_ABOUT 0xE140 +#define ID_APP_EXIT 0xE141 +#define ID_HELP_INDEX 0xE142 +#define ID_HELP_FINDER 0xE143 +#define ID_HELP_USING 0xE144 +#define ID_CONTEXT_HELP 0xE145 // shift-F1 +// special commands for processing help +#define ID_HELP 0xE146 // first attempt for F1 +#define ID_DEFAULT_HELP 0xE147 // last attempt + +// Misc +#define ID_NEXT_PANE 0xE150 +#define ID_PREV_PANE 0xE151 +#define ID_PANE_CLOSE 0xE152 + +// Format +#define ID_FORMAT_FONT 0xE160 + +// Scroll +#define ID_SCROLL_UP 0xE170 +#define ID_SCROLL_DOWN 0xE171 +#define ID_SCROLL_PAGE_UP 0xE172 +#define ID_SCROLL_PAGE_DOWN 0xE173 +#define ID_SCROLL_TOP 0xE174 +#define ID_SCROLL_BOTTOM 0xE175 +#define ID_SCROLL_LEFT 0xE176 +#define ID_SCROLL_RIGHT 0xE177 +#define ID_SCROLL_PAGE_LEFT 0xE178 +#define ID_SCROLL_PAGE_RIGHT 0xE179 +#define ID_SCROLL_ALL_LEFT 0xE17A +#define ID_SCROLL_ALL_RIGHT 0xE17B + +// OLE commands +#define ID_OLE_INSERT_NEW 0xE200 +#define ID_OLE_EDIT_LINKS 0xE201 +#define ID_OLE_EDIT_CONVERT 0xE202 +#define ID_OLE_EDIT_CHANGE_ICON 0xE203 +#define ID_OLE_EDIT_PROPERTIES 0xE204 +#define ID_OLE_VERB_FIRST 0xE210 // range - 16 max +#ifndef RC_INVOKED // code only +#define ID_OLE_VERB_LAST 0xE21F +#endif // !RC_INVOKED + +// View commands (same number used as IDW used for toolbar and status bar) +#define ID_VIEW_TOOLBAR 0xE800 +#define ID_VIEW_STATUS_BAR 0xE801 +#define ID_VIEW_REFRESH 0xE803 + +/////////////////////////////////////////////////////////////////////////////// +// Standard control IDs + +#ifdef IDC_STATIC + #undef IDC_STATIC +#endif // IDC_STATIC +#define IDC_STATIC (-1) // all static controls + +/////////////////////////////////////////////////////////////////////////////// +// Standard string error/warnings + +// idle status bar message +#define ATL_IDS_IDLEMESSAGE 0xE001 + +#ifndef RC_INVOKED // code only +#define ATL_IDS_SCFIRST 0xEF00 +#endif // !RC_INVOKED + +#define ATL_IDS_SCSIZE 0xEF00 +#define ATL_IDS_SCMOVE 0xEF01 +#define ATL_IDS_SCMINIMIZE 0xEF02 +#define ATL_IDS_SCMAXIMIZE 0xEF03 +#define ATL_IDS_SCNEXTWINDOW 0xEF04 +#define ATL_IDS_SCPREVWINDOW 0xEF05 +#define ATL_IDS_SCCLOSE 0xEF06 +#define ATL_IDS_SCRESTORE 0xEF12 +#define ATL_IDS_SCTASKLIST 0xEF13 + +#define ATL_IDS_MDICHILD 0xEF1F +#define ATL_IDS_MRU_FILE 0xEFDA + +/////////////////////////////////////////////////////////////////////////////// +// Misc. control IDs + +// Property Sheet control id's (determined with Spy++) +#define ID_APPLY_NOW 0x3021 +#define ID_WIZBACK 0x3023 +#define ID_WIZNEXT 0x3024 +#define ID_WIZFINISH 0x3025 +#define ATL_IDC_TAB_CONTROL 0x3020 + +#endif // __ATLRES_H__ diff --git a/Source/Plugins/Plugin_DSP_LLE/Res/resource.h b/Source/Plugins/Plugin_DSP_LLE/Res/resource.h new file mode 100644 index 0000000000..af3530a9d2 --- /dev/null +++ b/Source/Plugins/Plugin_DSP_LLE/Res/resource.h @@ -0,0 +1,29 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by resources.rc +// +#define IDR_MAINFRAME 128 +#define IDD_MAINDLG 129 +#define IDD_DISASMDLG 129 +#define IDD_DISASMDLG1 130 +#define IDD_REGISTERDLG 130 +#define IDC_LIST1 1000 +#define IDC_DISASM_LIST 1000 +#define ID_STEP 1001 +#define ID_SHOW_REGISTER 1002 +#define IDC_ASSERT_INT 1003 +#define ID_GO 1004 +#define IDC_HALT 1005 +#define IDC_HALT2 1006 +#define IDC_INIT 1006 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 202 +#define _APS_NEXT_COMMAND_VALUE 32772 +#define _APS_NEXT_CONTROL_VALUE 1004 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/Source/Plugins/Plugin_DSP_LLE/Res/resources.rc b/Source/Plugins/Plugin_DSP_LLE/Res/resources.rc new file mode 100644 index 0000000000..119abe4430 --- /dev/null +++ b/Source/Plugins/Plugin_DSP_LLE/Res/resources.rc @@ -0,0 +1,322 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "atlres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// German (Germany) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU) +#ifdef _WIN32 +LANGUAGE LANG_GERMAN, SUBLANG_GERMAN +#pragma code_page(1252) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +3 TEXTINCLUDE +BEGIN + "\r\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDR_MAINFRAME DIALOGEX 0, 0, 186, 94 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Dialog" +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + DEFPUSHBUTTON "OK",IDOK,129,7,50,14 + PUSHBUTTON "Cancel",IDCANCEL,129,24,50,14 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO +BEGIN + IDR_MAINFRAME, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 179 + TOPMARGIN, 7 + BOTTOMMARGIN, 87 + END +END +#endif // APSTUDIO_INVOKED + +#endif // German (Germany) resources +///////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""atlres.h""\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_DISASMDLG DIALOGEX 0, 0, 513, 298 +STYLE DS_SETFONT | WS_MINIMIZEBOX | WS_CAPTION | WS_SYSMENU +CAPTION "Debugger" +FONT 8, "Tahoma", 400, 0, 0x0 +BEGIN + DEFPUSHBUTTON "Step",ID_STEP,456,7,50,14 + CONTROL "",IDC_DISASM_LIST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SORTDESCENDING | LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP,7,7,445,284 + PUSHBUTTON "&Show Regs",ID_SHOW_REGISTER,456,277,50,14 + DEFPUSHBUTTON "Go",ID_GO,456,23,50,14 + CONTROL "AssertInt",IDC_ASSERT_INT,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,455,50,51,9 + CONTROL "Halt",IDC_HALT,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,455,63,51,9 + CONTROL "Init",IDC_INIT,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,455,75,51,9 +END + +IDD_REGISTERDLG DIALOGEX 0, 0, 312, 170 +STYLE DS_SETFONT | WS_MINIMIZEBOX | WS_CAPTION | WS_SYSMENU +CAPTION "Registers Dialog" +FONT 8, "Tahoma", 400, 0, 0x0 +BEGIN + CONTROL "",IDC_DISASM_LIST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTDESCENDING | LVS_ALIGNLEFT | LVS_NOSCROLL | WS_BORDER | WS_TABSTOP,7,7,298,156 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO +BEGIN + IDD_DISASMDLG, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 506 + TOPMARGIN, 7 + BOTTOMMARGIN, 291 + END + + IDD_REGISTERDLG, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 305 + TOPMARGIN, 7 + BOTTOMMARGIN, 163 + END +END +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Accelerator +// + +IDR_MAINFRAME ACCELERATORS +BEGIN + "N", ID_FILE_NEW, VIRTKEY, CONTROL + "O", ID_FILE_OPEN, VIRTKEY, CONTROL + "S", ID_FILE_SAVE, VIRTKEY, CONTROL + "P", ID_FILE_PRINT, VIRTKEY, CONTROL + "Z", ID_EDIT_UNDO, VIRTKEY, CONTROL + "X", ID_EDIT_CUT, VIRTKEY, CONTROL + "C", ID_EDIT_COPY, VIRTKEY, CONTROL + "V", ID_EDIT_PASTE, VIRTKEY, CONTROL + VK_BACK, ID_EDIT_UNDO, VIRTKEY, ALT + VK_DELETE, ID_EDIT_CUT, VIRTKEY, SHIFT + VK_INSERT, ID_EDIT_COPY, VIRTKEY, CONTROL + VK_INSERT, ID_EDIT_PASTE, VIRTKEY, SHIFT + VK_F6, ID_NEXT_PANE, VIRTKEY + VK_F6, ID_PREV_PANE, VIRTKEY, SHIFT +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 1,0,0,1 + PRODUCTVERSION 1,0,0,1 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x4L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904B0" + BEGIN + VALUE "FileDescription", "test1 Module" + VALUE "FileVersion", "1, 0, 0, 1" + VALUE "InternalName", "TEST1" + VALUE "LegalCopyright", "Copyright 2004" + VALUE "OriginalFilename", "demoproject1.exe" + VALUE "ProductName", "demoproject1 Module" + VALUE "ProductVersion", "1, 0, 0, 1" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE +BEGIN + IDR_MAINFRAME "demoproject1" +END + +STRINGTABLE +BEGIN + ID_FILE_NEW "Create a new document\nNew" + ID_FILE_OPEN "Open an existing document\nOpen" + ID_FILE_CLOSE "Close the active document\nClose" + ID_FILE_SAVE "Save the active document\nSave" + ID_FILE_SAVE_AS "Save the active document with a new name\nSave As" + ID_FILE_PAGE_SETUP "Change the printing options\nPage Setup" + ID_FILE_PRINT_SETUP "Change the printer and printing options\nPrint Setup" + ID_FILE_PRINT "Print the active document\nPrint" + ID_FILE_PRINT_PREVIEW "Display full pages\nPrint Preview" +END + +STRINGTABLE +BEGIN + ID_APP_ABOUT "Display program information, version number and copyright\nAbout" + ID_APP_EXIT "Quit the application; prompts to save documents\nExit" +END + +STRINGTABLE +BEGIN + ID_NEXT_PANE "Switch to the next window pane\nNext Pane" + ID_PREV_PANE "Switch back to the previous window pane\nPrevious Pane" +END + +STRINGTABLE +BEGIN + ID_WINDOW_NEW "Open another window for the active document\nNew Window" + ID_WINDOW_ARRANGE "Arrange icons at the bottom of the window\nArrange Icons" + ID_WINDOW_CASCADE "Arrange windows so they overlap\nCascade Windows" + ID_WINDOW_TILE_HORZ "Arrange windows as non-overlapping tiles\nTile Windows" + ID_WINDOW_TILE_VERT "Arrange windows as non-overlapping tiles\nTile Windows" + ID_WINDOW_SPLIT "Split the active window into panes\nSplit" +END + +STRINGTABLE +BEGIN + ID_EDIT_CLEAR "Erase the selection\nErase" + ID_EDIT_CLEAR_ALL "Erase everything\nErase All" + ID_EDIT_COPY "Copy the selection and put it on the Clipboard\nCopy" + ID_EDIT_CUT "Cut the selection and put it on the Clipboard\nCut" + ID_EDIT_FIND "Find the specified text\nFind" + ID_EDIT_PASTE "Insert Clipboard contents\nPaste" + ID_EDIT_REPEAT "Repeat the last action\nRepeat" + ID_EDIT_REPLACE "Replace specific text with different text\nReplace" + ID_EDIT_SELECT_ALL "Select the entire document\nSelect All" + ID_EDIT_UNDO "Undo the last action\nUndo" + ID_EDIT_REDO "Redo the previously undone action\nRedo" +END + +STRINGTABLE +BEGIN + ATL_IDS_SCSIZE "Change the window size" + ATL_IDS_SCMOVE "Change the window position" + ATL_IDS_SCMINIMIZE "Reduce the window to an icon" + ATL_IDS_SCMAXIMIZE "Enlarge the window to full size" + ATL_IDS_SCNEXTWINDOW "Switch to the next document window" + ATL_IDS_SCPREVWINDOW "Switch to the previous document window" + ATL_IDS_SCCLOSE "Close the active window and prompts to save the documents" +END + +STRINGTABLE +BEGIN + ATL_IDS_SCRESTORE "Restore the window to normal size" + ATL_IDS_SCTASKLIST "Activate Task List" + ATL_IDS_MDICHILD "Activate this window" +END + +STRINGTABLE +BEGIN + ATL_IDS_IDLEMESSAGE "Ready" +END + +STRINGTABLE +BEGIN + ATL_IDS_MRU_FILE "Open this document" +END + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/Source/Plugins/Plugin_DSP_LLE/Src/DSoundStream.cpp b/Source/Plugins/Plugin_DSP_LLE/Src/DSoundStream.cpp new file mode 100644 index 0000000000..3b7eda1063 --- /dev/null +++ b/Source/Plugins/Plugin_DSP_LLE/Src/DSoundStream.cpp @@ -0,0 +1,280 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "stdafx.h" + +#include +#include + +#include "dsoundstream.h" + +namespace DSound +{ +#define BUFSIZE 32768 +#define MAXWAIT 70 //ms + +//THE ROCK SOLID SYNCED DSOUND ENGINE :) + + +//våran kritiska sektion och vår syncevent-handle +CRITICAL_SECTION soundCriticalSection; +HANDLE soundSyncEvent; +HANDLE hThread; + +StreamCallback callback; + +//lite mojs +IDirectSound8* ds; +IDirectSoundBuffer* dsBuffer; + +//tja.. behövs +int bufferSize; //i bytes +int totalRenderedBytes; +int sampleRate; + +//med den här synkar vi stängning.. +//0=vi spelar oväsen, 1=stäng tråden NU! 2=japp,tråden är stängd så fortsätt +volatile int threadData; + + +//ser till så X kan delas med 32 +inline int FIX32(int x) +{ + return(x & (~127)); +} + + +int DSound_GetSampleRate() +{ + return(sampleRate); +} + + +//Dags att skapa vår directsound buffert +bool createBuffer() +{ + PCMWAVEFORMAT pcmwf; + DSBUFFERDESC dsbdesc; + + //ljudformatet + memset(&pcmwf, 0, sizeof(PCMWAVEFORMAT)); + memset(&dsbdesc, 0, sizeof(DSBUFFERDESC)); + + pcmwf.wf.wFormatTag = WAVE_FORMAT_PCM; + pcmwf.wf.nChannels = 2; + pcmwf.wf.nSamplesPerSec = sampleRate; + pcmwf.wf.nBlockAlign = 4; + pcmwf.wf.nAvgBytesPerSec = pcmwf.wf.nSamplesPerSec * pcmwf.wf.nBlockAlign; + pcmwf.wBitsPerSample = 16; + + //buffer description + dsbdesc.dwSize = sizeof(DSBUFFERDESC); + dsbdesc.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_STICKYFOCUS; //VIKTIGT //DSBCAPS_CTRLPAN | DSBCAPS_CTRLVOLUME | DSBCAPS_CTRLFREQUENCY; + dsbdesc.dwBufferBytes = bufferSize = BUFSIZE; //FIX32(pcmwf.wf.nAvgBytesPerSec); //ändra för att ställa in bufferstorlek + dsbdesc.lpwfxFormat = (WAVEFORMATEX*)&pcmwf; + // nu skapar vi bufferjäveln + + if (SUCCEEDED(ds->CreateSoundBuffer(&dsbdesc, &dsBuffer, NULL))) + { + dsBuffer->SetCurrentPosition(0); + return(true); + } + else + { + // Failed. + dsBuffer = NULL; + return(false); + } +} + + +bool writeDataToBuffer(DWORD dwOffset, // Our own write cursor. + char* soundData, // Start of our data. + DWORD dwSoundBytes) // Size of block to copy. +{ + void* ptr1, * ptr2; + DWORD numBytes1, numBytes2; + // Obtain memory address of write block. This will be in two parts if the block wraps around. + HRESULT hr = dsBuffer->Lock(dwOffset, dwSoundBytes, &ptr1, &numBytes1, &ptr2, &numBytes2, 0); + + // If the buffer was lost, restore and retry lock. + + if (DSERR_BUFFERLOST == hr) + { + dsBuffer->Restore(); + hr = dsBuffer->Lock(dwOffset, dwSoundBytes, &ptr1, &numBytes1, &ptr2, &numBytes2, 0); + } + + if (SUCCEEDED(hr)) + { + memcpy(ptr1, soundData, numBytes1); + + if (ptr2 != 0) + { + memcpy(ptr2, soundData + numBytes1, numBytes2); + } + + // Release the data back to DirectSound. + dsBuffer->Unlock(ptr1, numBytes1, ptr2, numBytes2); + return(true); + } /* + else + { + char temp[8]; + sprintf(temp,"%i\n",hr); + OutputDebugString(temp); + }*/ + + return(false); +} + + +inline int ModBufferSize(int x) +{ + return((x + bufferSize) % bufferSize); +} + + +int currentPos; +int lastPos; +short realtimeBuffer[1024 * 1024]; + + +DWORD WINAPI soundThread(void*) +{ + currentPos = 0; + lastPos = 0; + //writeDataToBuffer(0,realtimeBuffer,bufferSize); + // dsBuffer->Lock(0, bufferSize, (void **)&p1, &num1, (void **)&p2, &num2, 0); + + dsBuffer->Play(0, 0, DSBPLAY_LOOPING); + + while (!threadData) + { + EnterCriticalSection(&soundCriticalSection); + + dsBuffer->GetCurrentPosition((DWORD*)¤tPos, 0); + int numBytesToRender = FIX32(ModBufferSize(currentPos - lastPos)); + + //renderStuff(numBytesToRender/2); + //if (numBytesToRender>bufferSize/2) numBytesToRender=0; + + if (numBytesToRender >= 256) + { + (*callback)(realtimeBuffer, numBytesToRender >> 2, 16, 44100, 2); + + writeDataToBuffer(lastPos, (char*)realtimeBuffer, numBytesToRender); + + currentPos = ModBufferSize(lastPos + numBytesToRender); + totalRenderedBytes += numBytesToRender; + + lastPos = currentPos; + } + + LeaveCriticalSection(&soundCriticalSection); + WaitForSingleObject(soundSyncEvent, MAXWAIT); + } + + dsBuffer->Stop(); + + threadData = 2; + return(0); //hurra! +} + + +bool DSound_StartSound(HWND window, int _sampleRate, StreamCallback _callback) +{ + callback = _callback; + threadData = 0; + sampleRate = _sampleRate; + + //no security attributes, automatic resetting, init state nonset, untitled + soundSyncEvent = CreateEvent(0, false, false, 0); + + //vi initierar den........... + InitializeCriticalSection(&soundCriticalSection); + + //vi vill ha access till DSOUND så... + if (FAILED(DirectSoundCreate8(0, &ds, 0))) + { + return(false); + } + + //samarbetsvillig? nää :) + ds->SetCooperativeLevel(window, DSSCL_NORMAL); //DSSCL_PRIORITY? + + //så.. skapa buffern + if (!createBuffer()) + { + return(false); + } + + //rensa den.. ? + DWORD num1; + short* p1; + + dsBuffer->Lock(0, bufferSize, (void* *)&p1, &num1, 0, 0, 0); + + memset(p1, 0, num1); + dsBuffer->Unlock(p1, num1, 0, 0); + totalRenderedBytes = -bufferSize; + DWORD h; + hThread = CreateThread(0, 0, soundThread, 0, 0, &h); + SetThreadPriority(hThread, THREAD_PRIORITY_ABOVE_NORMAL); + return(true); +} + + +void DSound_UpdateSound() +{ + SetEvent(soundSyncEvent); +} + + +void DSound_StopSound() +{ + EnterCriticalSection(&soundCriticalSection); + threadData = 1; + //kick the thread if it's waiting + SetEvent(soundSyncEvent); + LeaveCriticalSection(&soundCriticalSection); + WaitForSingleObject(hThread, INFINITE); + CloseHandle(hThread); + + dsBuffer->Release(); + ds->Release(); + + CloseHandle(soundSyncEvent); +} + + +int DSound_GetCurSample() +{ + EnterCriticalSection(&soundCriticalSection); + int playCursor; + dsBuffer->GetCurrentPosition((DWORD*)&playCursor, 0); + playCursor = ModBufferSize(playCursor - lastPos) + totalRenderedBytes; + LeaveCriticalSection(&soundCriticalSection); + return(playCursor); +} + + +float DSound_GetTimer() +{ + return((float)DSound_GetCurSample() * (1.0f / (4.0f * 44100.0f))); +} +} diff --git a/Source/Plugins/Plugin_DSP_LLE/Src/DSoundStream.h b/Source/Plugins/Plugin_DSP_LLE/Src/DSoundStream.h new file mode 100644 index 0000000000..f27293c997 --- /dev/null +++ b/Source/Plugins/Plugin_DSP_LLE/Src/DSoundStream.h @@ -0,0 +1,35 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef __SOUNDSTREAM_H__ +#define __SOUNDSTREAM_H__ + +namespace DSound +{ +typedef void (*StreamCallback)(short* buffer, int numSamples, int bits, int rate, int channels); + +bool DSound_StartSound(HWND window, int sampleRate, StreamCallback _callback); +void DSound_UpdateSound(); +void DSound_StopSound(); + +float DSound_GetTimer(); +int DSound_GetCurSample(); +int DSound_GetSampleRate(); +} + + +#endif //__SOUNDSTREAM_H__ diff --git a/Source/Plugins/Plugin_DSP_LLE/Src/DisAsmDlg.cpp b/Source/Plugins/Plugin_DSP_LLE/Src/DisAsmDlg.cpp new file mode 100644 index 0000000000..104982bc40 --- /dev/null +++ b/Source/Plugins/Plugin_DSP_LLE/Src/DisAsmDlg.cpp @@ -0,0 +1,637 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "stdafx.h" +#include "../res/resource.h" +#include "DisAsmDlg.h" + +#include "gdsp_memory.h" +#include "gdsp_interpreter.h" +#include "disassemble.h" +#include "RegSettings.h" + +CDisAsmDlg::CDisAsmDlg() + : m_CachedStepCounter(-1) + , m_CachedCR(-1) + , m_State(RUN) + , m_CachedUCodeCRC(-1) +{} + + +BOOL CDisAsmDlg::PreTranslateMessage(MSG* pMsg) +{ + return(IsDialogMessage(pMsg)); +} + + +BOOL CDisAsmDlg::OnIdle() +{ + return(FALSE); +} + + +LRESULT CDisAsmDlg::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) +{ + CWindowSettings ws; + + if (ws.Load("Software\\Dolphin\\DSP", "DisAsm")) + { + ws.ApplyTo(CWindow(m_hWnd), SW_SHOW); + } + + m_DisAsmListViewCtrl.m_hWnd = GetDlgItem(IDC_DISASM_LIST); + + UIAddChildWindowContainer(m_hWnd); + + m_DisAsmListViewCtrl.AddColumn(_T("BP"), ColumnBP); + m_DisAsmListViewCtrl.AddColumn(_T("Function"), ColumnFunction); + m_DisAsmListViewCtrl.AddColumn(_T("Address"), ColumnAddress); + m_DisAsmListViewCtrl.AddColumn(_T("Menmomic"), ColumnMenmomic); + m_DisAsmListViewCtrl.AddColumn(_T("Opcode"), ColumnOpcode); + m_DisAsmListViewCtrl.AddColumn(_T("Ext"), ColumnExt); + m_DisAsmListViewCtrl.AddColumn(_T("Parameter"), ColumnParameter); + + m_DisAsmListViewCtrl.SetColumnWidth(ColumnBP, 25); + m_DisAsmListViewCtrl.SetColumnWidth(ColumnFunction, 160); + m_DisAsmListViewCtrl.SetColumnWidth(ColumnAddress, 55); + m_DisAsmListViewCtrl.SetColumnWidth(ColumnMenmomic, 55); + m_DisAsmListViewCtrl.SetColumnWidth(ColumnOpcode, 60); + m_DisAsmListViewCtrl.SetColumnWidth(ColumnExt, 40); + m_DisAsmListViewCtrl.SetColumnWidth(ColumnParameter, 500); + + m_DisAsmListViewCtrl.SetExtendedListViewStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES); + + m_RegisterDlg.Create(m_hWnd); + + UpdateDialog(); + + return(TRUE); +} + + +LRESULT CDisAsmDlg::OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) +{ + CWindowSettings ws; + ws.GetFrom(CWindow(m_hWnd)); + ws.Save("Software\\Dolphin\\DSP", "DisAsm"); + + return(0); +} + + +LRESULT CDisAsmDlg::OnStep(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/) +{ + m_State = STEP; + + UpdateButtonTexts(); + return(0); +} + + +LRESULT CDisAsmDlg::OnGo(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/) +{ + if ((m_State == RUN) || (m_State == RUN_START)) + { + m_State = PAUSE; + } + else + { + m_State = RUN_START; + } + + UpdateButtonTexts(); + return(0); +} + + +LRESULT CDisAsmDlg::OnShowRegisters(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/) +{ + if (m_RegisterDlg.IsWindowVisible()) + { + m_RegisterDlg.ShowWindow(SW_HIDE); + } + else + { + m_RegisterDlg.ShowWindow(SW_SHOW); + } + + UpdateButtonTexts(); + return(0); +} + + +LRESULT CDisAsmDlg::OnDblClick(int /*idCtrl*/, LPNMHDR pnmh, BOOL& /*bHandled*/) +{ + int Index = m_DisAsmListViewCtrl.GetSelectedIndex(); + + if (Index != -1) + { + uint16 SelectedPC = static_cast(m_DisAsmListViewCtrl.GetItemData(Index)); + ToggleBreakPoint(SelectedPC); + } + + RedrawDisAsmListView(); + return(0); +} + + +LRESULT CDisAsmDlg::OnRClick(int /*idCtrl*/, LPNMHDR pnmh, BOOL& /*bHandled*/) +{ + int Index = m_DisAsmListViewCtrl.GetSelectedIndex(); + + if (Index != -1) + { + uint16 SelectedPC = static_cast(m_DisAsmListViewCtrl.GetItemData(Index)); + g_dsp.pc = SelectedPC; + } + + RedrawDisAsmListView(); + return(0); +} + + +void CDisAsmDlg::CloseDialog(int nVal) +{ + DestroyWindow(); + ::PostQuitMessage(nVal); +} + + +int CALLBACK CDisAsmDlg::CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) +{ + return(lParam1 > lParam2); +} + + +void CDisAsmDlg::RebuildDisAsmListView() +{ + m_DisAsmListViewCtrl.ShowWindow(SW_HIDE); + m_DisAsmListViewCtrl.DeleteAllItems(); + + char Buffer[256]; + gd_globals_t gdg; + + if (g_dsp.pc & 0x8000) + { + gdg.binbuf = g_dsp.irom; + } + else + { + gdg.binbuf = g_dsp.iram; + } + + gdg.buffer = Buffer; + gdg.buffer_size = 256; + gdg.ext_separator = (char)0xff; + + gdg.show_pc = false; + gdg.show_hex = false; + gdg.print_tabs = true; + gdg.decode_names = true; + gdg.decode_registers = true; + + for (gdg.pc = 0; gdg.pc < DSP_IROM_SIZE;) + { + uint16 CurrentPC = gdg.pc; + + if (g_dsp.pc & 0x8000) + { + CurrentPC |= 0x8000; + } + + char Temp[256]; + sprintf_s(Temp, 256, "0x%04x", CurrentPC); + + char Temp2[256]; + sprintf_s(Temp2, 256, "0x%04x", dsp_imem_read(CurrentPC)); + + char* pOpcode = gd_dis_opcode(&gdg); + const char* pParameter = NULL; + const char* pExtension = NULL; + + size_t WholeString = strlen(pOpcode); + + for (size_t i = 0; i < WholeString; i++) + { + if (pOpcode[i] == (char)0xff) + { + pOpcode[i] = 0x00; + pExtension = &pOpcode[i + 1]; + } + + if (pOpcode[i] == 0x09) + { + pOpcode[i] = 0x00; + pParameter = &pOpcode[i + 1]; + } + } + + + const char* pFunctionName = NULL; + + if (m_SymbolMap.find(CurrentPC) != m_SymbolMap.end()) + { + pFunctionName = m_SymbolMap[CurrentPC].Name.c_str(); + } + + int Item = m_DisAsmListViewCtrl.AddItem(0, ColumnBP, _T(" ")); + m_DisAsmListViewCtrl.AddItem(Item, ColumnFunction, pFunctionName); + m_DisAsmListViewCtrl.AddItem(Item, ColumnAddress, Temp); + m_DisAsmListViewCtrl.AddItem(Item, ColumnMenmomic, Temp2); + m_DisAsmListViewCtrl.AddItem(Item, ColumnOpcode, pOpcode); + m_DisAsmListViewCtrl.AddItem(Item, ColumnExt, pExtension); + + if (!_stricmp(pOpcode, "CALL")) + { + uint32 FunctionAddress = -1; + sscanf(pParameter, "0x%04x", &FunctionAddress); + + if (m_SymbolMap.find(FunctionAddress) != m_SymbolMap.end()) + { + pParameter = m_SymbolMap[FunctionAddress].Name.c_str(); + } + } + + m_DisAsmListViewCtrl.AddItem(Item, ColumnParameter, pParameter); + + m_DisAsmListViewCtrl.SetItemData(Item, CurrentPC); + } + + m_DisAsmListViewCtrl.SortItems(CompareFunc, (LPARAM) this); + + m_DisAsmListViewCtrl.ShowWindow(SW_SHOW); +} + + +void CDisAsmDlg::UpdateDisAsmListView() +{ + if (g_dsp.dram == NULL) + { + return; + } + + // check if we have to rebuild the list view + if (m_DisAsmListViewCtrl.GetItemCount() == 0) + { + RebuildDisAsmListView(); + } + else + { + uint16 FirstPC = static_cast(m_DisAsmListViewCtrl.GetItemData(0)); + + if ((FirstPC & 0x8000) != (g_dsp.pc & 0x8000)) + { + RebuildDisAsmListView(); + } + } + + if (m_CachedStepCounter == g_dsp.step_counter) + { + return; + } + + // show PC + for (int i = 0; i < m_DisAsmListViewCtrl.GetItemCount(); i++) + { + if (m_DisAsmListViewCtrl.GetItemData(i) == g_dsp.pc) + { + m_DisAsmListViewCtrl.EnsureVisible(i - 5, FALSE); + m_DisAsmListViewCtrl.EnsureVisible(i + 14, FALSE); + break; + } + } + + m_CachedStepCounter = g_dsp.step_counter; + + RedrawDisAsmListView(); + + m_RegisterDlg.UpdateRegisterListView(); +} + + +void CDisAsmDlg::UpdateSymbolMap() +{ + if (g_dsp.dram == NULL) + { + return; + } + + if (m_CachedUCodeCRC != g_dsp.iram_crc) + { + // load symbol map (if there is one) + m_CachedUCodeCRC = g_dsp.iram_crc; + char FileName[MAX_PATH]; + sprintf(FileName, "maps\\DSP_%08x.map", m_CachedUCodeCRC); + LoadSymbolMap(FileName); + + // rebuild the disasm + RebuildDisAsmListView(); + } +} + + +void CDisAsmDlg::UpdateRegisterFlags() +{ + if (m_CachedCR == g_dsp.cr) + { + return; + } + + CButton ButtonAssertInt(GetDlgItem(IDC_ASSERT_INT)); + ButtonAssertInt.SetCheck(g_dsp.cr & 0x02 ? BST_CHECKED : BST_UNCHECKED); + + CButton ButtonReset(GetDlgItem(IDC_HALT)); + ButtonReset.SetCheck(g_dsp.cr & 0x04 ? BST_CHECKED : BST_UNCHECKED); + + CButton ButtonInit(GetDlgItem(IDC_INIT)); + ButtonInit.SetCheck(g_dsp.cr & 0x800 ? BST_CHECKED : BST_UNCHECKED); + + m_CachedCR = g_dsp.cr; +} + + +bool CDisAsmDlg::CanDoStep() +{ + UpdateSymbolMap(); // update the symbols all the time because there a script cmds like bps + + switch (m_State) + { + case RUN_START: + m_State = RUN; + return(true); + + case RUN: + + if (IsBreakPoint(g_dsp.pc)) + { + UpdateDialog(); + m_State = PAUSE; + return(false); + } + + return(true); + + case PAUSE: + UpdateDialog(); + return(false); + + case STEP: + UpdateDialog(); + m_State = PAUSE; + return(true); + } + + return(false); +} + + +void CDisAsmDlg::DebugBreak() +{ + m_State = PAUSE; +} + + +void CDisAsmDlg::UpdateButtonTexts() +{ + // go button + { + CButton Button(GetDlgItem(ID_GO)); + + switch (m_State) + { + case RUN_START: + case RUN: + Button.SetWindowText("Pause"); + break; + + case PAUSE: + case STEP: + Button.SetWindowText("Go"); + break; + } + } + + // show register + { + CButton Button(GetDlgItem(ID_SHOW_REGISTER)); + + if (m_RegisterDlg.IsWindowVisible()) + { + Button.SetWindowText("Hide Regs"); + } + else + { + Button.SetWindowText("Show Regs"); + } + } +} + + +bool CDisAsmDlg::IsBreakPoint(uint16 _Address) +{ + return(std::find(m_BreakPoints.begin(), m_BreakPoints.end(), _Address) != m_BreakPoints.end()); +} + + +void CDisAsmDlg::ToggleBreakPoint(uint16 _Address) +{ + if (IsBreakPoint(_Address)) + { + RemoveBreakPoint(_Address); + } + else + { + AddBreakPoint(_Address); + } +} + + +void CDisAsmDlg::RemoveBreakPoint(uint16 _Address) +{ + CBreakPointList::iterator itr = std::find(m_BreakPoints.begin(), m_BreakPoints.end(), _Address); + + if (itr != m_BreakPoints.end()) + { + m_BreakPoints.erase(itr); + } +} + + +void CDisAsmDlg::AddBreakPoint(uint16 _Address) +{ + CBreakPointList::iterator itr = std::find(m_BreakPoints.begin(), m_BreakPoints.end(), _Address); + + if (itr == m_BreakPoints.end()) + { + m_BreakPoints.push_back(_Address); + } +} + + +void CDisAsmDlg::ClearBreakPoints() +{ + m_BreakPoints.clear(); +} + + +LRESULT CDisAsmDlg::OnCustomDraw(int /*idCtrl*/, LPNMHDR pnmh, BOOL& _bHandled) +{ + int result = CDRF_DODEFAULT; + + NMLVCUSTOMDRAW* pLVCD = reinterpret_cast(pnmh); + + switch (pLVCD->nmcd.dwDrawStage) + { + case CDDS_PREPAINT: + result = CDRF_NOTIFYITEMDRAW; + break; + + case CDDS_ITEMPREPAINT: + result = CDRF_NOTIFYSUBITEMDRAW; + break; + + case (CDDS_ITEMPREPAINT | CDDS_SUBITEM): + { + pLVCD->nmcd.uItemState &= ~(CDIS_SELECTED | CDIS_FOCUS); + + uint16 CurrentAddress = static_cast(m_DisAsmListViewCtrl.GetItemData((int)pLVCD->nmcd.dwItemSpec)); + pLVCD->clrTextBk = FindColor(CurrentAddress); + + if (CurrentAddress == g_dsp.pc) + { + pLVCD->clrTextBk = RGB(96, 192, 128); + } + + switch (pLVCD->iSubItem) + { + case 0x00: + { + if (IsBreakPoint(CurrentAddress)) + { + pLVCD->clrTextBk = RGB(255, 64, 64); + } + } + break; + + default: + break; + } + } + } + + return(result); +} + + +void CDisAsmDlg::RedrawDisAsmListView() +{ + ::InvalidateRect(m_DisAsmListViewCtrl.m_hWnd, NULL, FALSE); +} + + +bool CDisAsmDlg::LoadSymbolMap(const char* _pFileName) +{ + m_SymbolMap.clear(); + + FILE* pFile = fopen(_pFileName, "r"); + + if (!pFile) + { + return(false); + } + + char Name[1024]; + uint32 AddressStart, AddressEnd; + + while (!feof(pFile)) + { + char line[512]; + fgets(line, 511, pFile); + + if (strlen(line) < 2) + { + continue; + } + + // check for comment + if (line[0] == '.') + { + continue; + } + + // clear all breakpoints + if (line[0] == 'C') + { + ClearBreakPoints(); + continue; + } + + // add breakpoint + if (line[0] == 'B') + { + sscanf(line, "B %04x", &AddressStart); + AddBreakPoint(static_cast(AddressStart)); + continue; + } + + // default add new symbol + sscanf(line, "%04x %04x %s", &AddressStart, &AddressEnd, Name); + + if (m_SymbolMap.find(AddressStart) == m_SymbolMap.end()) + { + m_SymbolMap.insert(std::pair(AddressStart, SSymbol(AddressStart, AddressEnd, Name))); + } + else + { + m_SymbolMap[AddressStart] = SSymbol(AddressStart, AddressEnd, Name); + } + } + + fclose(pFile); + + return(true); +} + + +DWORD CDisAsmDlg::FindColor(uint16 _Address) +{ + size_t Color = 0; + static int Colors[6] = {0xC0FFFF, 0xFFE0C0, 0xC0C0FF, 0xFFC0FF, 0xC0FFC0, 0xFFFFC0}; + + for (CSymbolMap::const_iterator itr = m_SymbolMap.begin(); itr != m_SymbolMap.end(); itr++) + { + const SSymbol& rSymbol = itr->second; + + if ((rSymbol.AddressStart <= _Address) && (_Address <= rSymbol.AddressEnd)) + { + return(Colors[Color % 6]); + } + + Color++; + } + + return(GetSysColor(COLOR_3DLIGHT)); +} + + +void CDisAsmDlg::UpdateDialog() +{ + UpdateSymbolMap(); + UpdateDisAsmListView(); +// UpdateButtonTexts(); + UpdateRegisterFlags(); +} diff --git a/Source/Plugins/Plugin_DSP_LLE/Src/DisAsmDlg.h b/Source/Plugins/Plugin_DSP_LLE/Src/DisAsmDlg.h new file mode 100644 index 0000000000..8030c0217b --- /dev/null +++ b/Source/Plugins/Plugin_DSP_LLE/Src/DisAsmDlg.h @@ -0,0 +1,150 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "Globals.h" + +#include +#include + +#include "../res/resource.h" +#include "DisAsmListView.h" +#include "RegisterDlg.h" + +class CDisAsmDlg + : public CDialogImpl, public CUpdateUI +{ + public: + + CDisAsmDlg(); + + enum { IDD = IDD_DISASMDLG }; + + virtual BOOL PreTranslateMessage(MSG* pMsg); + virtual BOOL OnIdle(); + + + BEGIN_UPDATE_UI_MAP(CDisAsmDlg) + END_UPDATE_UI_MAP() + + BEGIN_MSG_MAP(CDisAsmDlg) + MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) + MESSAGE_HANDLER(WM_DESTROY, OnDestroy) + COMMAND_ID_HANDLER(ID_STEP, OnStep) + COMMAND_ID_HANDLER(ID_GO, OnGo) + COMMAND_ID_HANDLER(ID_SHOW_REGISTER, OnShowRegisters) + NOTIFY_CODE_HANDLER(NM_CLICK, OnDblClick) + NOTIFY_CODE_HANDLER(NM_RETURN, OnDblClick) + NOTIFY_CODE_HANDLER(NM_RCLICK, OnRClick) + NOTIFY_CODE_HANDLER(NM_CUSTOMDRAW, OnCustomDraw) + END_MSG_MAP() + +// Handler prototypes (uncomment arguments if needed): +// LRESULT MessageHandler(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) +// LRESULT CommandHandler(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) +// LRESULT NotifyHandler(int /*idCtrl*/, LPNMHDR /*pnmh*/, BOOL& /*bHandled*/) + + LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL & /*bHandled*/); + LRESULT OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL & /*bHandled*/); + + LRESULT OnStep(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL & /*bHandled*/); + LRESULT OnGo(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL & /*bHandled*/); + LRESULT OnShowRegisters(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL & /*bHandled*/); + LRESULT OnCustomDraw(int /*idCtrl*/, LPNMHDR pnmh, BOOL& _bHandled); + + LRESULT OnDblClick(int /*idCtrl*/, LPNMHDR pnmh, BOOL& /*bHandled*/); + LRESULT OnRClick(int /*idCtrl*/, LPNMHDR pnmh, BOOL& /*bHandled*/); + + void CloseDialog(int nVal); + + bool CanDoStep(); + + void DebugBreak(); + + + private: + + enum EColumns + { + ColumnBP = 0, + ColumnFunction = 1, + ColumnAddress = 2, + ColumnMenmomic = 3, + ColumnOpcode = 4, + ColumnExt = 5, + ColumnParameter = 6 + }; + + enum EState + { + PAUSE, + STEP, + RUN, + RUN_START // ignores breakpoints and switches after one step to RUN + }; + EState m_State; + + + CListViewCtrl m_DisAsmListViewCtrl; + CRegisterDlg m_RegisterDlg; + + uint64 m_CachedStepCounter; + uint16 m_CachedCR; + uint32 m_CachedUCodeCRC; + + typedef std::listCBreakPointList; + CBreakPointList m_BreakPoints; + + // break point handling + bool IsBreakPoint(uint16 _Address); + void ToggleBreakPoint(uint16 _Address); + void RemoveBreakPoint(uint16 _Address); + void AddBreakPoint(uint16 _Address); + void ClearBreakPoints(); + + + // update dialog + void UpdateDisAsmListView(); + void UpdateRegisterFlags(); + void UpdateSymbolMap(); + void UpdateButtonTexts(); + + void RedrawDisAsmListView(); + void RebuildDisAsmListView(); + + + struct SSymbol + { + uint32 AddressStart; + uint32 AddressEnd; + std::string Name; + + SSymbol(uint32 _AddressStart = 0, uint32 _AddressEnd = 0, char* _Name = NULL) + : AddressStart(_AddressStart) + , AddressEnd(_AddressEnd) + , Name(_Name) + {} + }; + typedef std::mapCSymbolMap; + CSymbolMap m_SymbolMap; + + void AddSymbol(uint16 _AddressStart, uint16 _AddressEnd, char* _Name); + bool LoadSymbolMap(const char* _pFileName); + DWORD FindColor(uint16 _Address); + void UpdateDialog(); + + static int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort); +}; diff --git a/Source/Plugins/Plugin_DSP_LLE/Src/DisAsmListView.h b/Source/Plugins/Plugin_DSP_LLE/Src/DisAsmListView.h new file mode 100644 index 0000000000..5fbc6725e7 --- /dev/null +++ b/Source/Plugins/Plugin_DSP_LLE/Src/DisAsmListView.h @@ -0,0 +1,64 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef _MYLISTVIEW_H +#define _MYLISTVIEW_H + +class CDisAsmListView + : public CWindowImpl, + public CCustomDraw +{ + public: + + BEGIN_MSG_MAP(CDisAsmListView) + CHAIN_MSG_MAP(CCustomDraw) + END_MSG_MAP() + + DWORD OnPrePaint(int /*idCtrl*/, LPNMCUSTOMDRAW /*lpNMCustomDraw*/) + { + return(CDRF_NOTIFYITEMDRAW); + } + + + DWORD OnItemPrePaint(int /*idCtrl*/, LPNMCUSTOMDRAW lpNMCustomDraw) + { + NMLVCUSTOMDRAW* pLVCD = reinterpret_cast(lpNMCustomDraw); + + // This is the prepaint stage for an item. Here's where we set the + // item's text color. Our return value will tell Windows to draw the + // item itself, but it will use the new color we set here for the background + + COLORREF crText; + + if ((pLVCD->nmcd.dwItemSpec % 2) == 0) + { + crText = RGB(200, 200, 255); + } + else + { + crText = RGB(255, 255, 255); + } + + // Store the color back in the NMLVCUSTOMDRAW struct. + pLVCD->clrTextBk = crText; + + // Tell Windows to paint the control itself. + return(CDRF_DODEFAULT); + } +}; + +#endif _MYLISTVIEW_H diff --git a/Source/Plugins/Plugin_DSP_LLE/Src/Globals.cpp b/Source/Plugins/Plugin_DSP_LLE/Src/Globals.cpp new file mode 100644 index 0000000000..8fb99f7991 --- /dev/null +++ b/Source/Plugins/Plugin_DSP_LLE/Src/Globals.cpp @@ -0,0 +1,59 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include +#include + +#include "Globals.h" + + +void DebugLog(const char* _fmt, ...) +{ +#ifdef _DEBUG +/* char Msg[512]; + va_list ap; + + va_start( ap, _fmt ); + vsprintf( Msg, _fmt, ap ); + va_end( ap ); + + OutputDebugString(Msg); + + g_dspInitialize.pLog(Msg); + */ +#endif +} + + +void ErrorLog(const char* _fmt, ...) +{ + char Msg[512]; + va_list ap; + + va_start(ap, _fmt); + vsprintf(Msg, _fmt, ap); + va_end(ap); + + g_dspInitialize.pLog(Msg); +#ifdef _WIN32 + ::MessageBox(NULL, Msg, "Error", MB_OK); +#endif + + DSP_DebugBreak(); +} + + diff --git a/Source/Plugins/Plugin_DSP_LLE/Src/Globals.h b/Source/Plugins/Plugin_DSP_LLE/Src/Globals.h new file mode 100644 index 0000000000..297ef9315f --- /dev/null +++ b/Source/Plugins/Plugin_DSP_LLE/Src/Globals.h @@ -0,0 +1,60 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef _GLOBALS_H +#define _GLOBALS_H + +#include "pluginspecs_dsp.h" + +#define WITH_DSP_ON_THREAD 1 +#define DUMP_DSP_IMEM 0 + +extern DSPInitialize g_dspInitialize; +void DebugLog(const char* _fmt, ...); +void ErrorLog(const char* _fmt, ...); +void DSP_DebugBreak(); + + +#ifdef _DEBUG + +#define _dbg_assert_(_a_) if (!(_a_)){DebugBreak();} +#define _dbg_assert_msg_(_a_, _desc_, ...)\ + if (!(_a_)){\ + if (MessageBox(NULL, _desc_, "*** Fatal Error ***", MB_YESNO | MB_ICONERROR) == IDNO){DebugBreak();}} + +#else + +#define _dbg_assert_(_a_); +#define _dbg_assert_msg_(_a_, _desc_, ...); + +#endif + +typedef unsigned char uint8; +typedef unsigned short uint16; +typedef unsigned int uint32; +typedef unsigned long long uint64; +typedef unsigned int uint; + +typedef signed char sint8; +typedef signed short sint16; +typedef signed int sint32; +typedef signed long long sint64; + +typedef const uint32 cuint32; + +#endif + diff --git a/Source/Plugins/Plugin_DSP_LLE/Src/RegSettings.cpp b/Source/Plugins/Plugin_DSP_LLE/Src/RegSettings.cpp new file mode 100644 index 0000000000..622bf123df --- /dev/null +++ b/Source/Plugins/Plugin_DSP_LLE/Src/RegSettings.cpp @@ -0,0 +1,272 @@ +// RegSettings.cpp +// +// Copyright (c) 2001 Magomed Abdurakhmanov +// maq@hotbox.ru, http://mickels.iwt.ru/en +// +// +// +// No warranties are given. Use at your own risk. +// +////////////////////////////////////////////////////////////////////// + +#include "stdafx.h" +#include "RegSettings.h" + +////////////////////////////////////////////////////////////////////// +// CWindowSettings + +#define S_WINDOW_PLACEMENT_VAL _T("WindowPlacement") + +CWindowSettings::CWindowSettings() +{ + m_WindowPlacement.length = sizeof(m_WindowPlacement); + m_WindowPlacement.flags = 0; + m_WindowPlacement.ptMinPosition.x = 0; + m_WindowPlacement.ptMinPosition.y = 0; + m_WindowPlacement.ptMaxPosition.x = 0; + m_WindowPlacement.ptMaxPosition.y = 0; + + CRect rc; + SystemParametersInfo(SPI_GETWORKAREA, 0, rc, 0); + rc.DeflateRect(100, 100); + m_WindowPlacement.rcNormalPosition = rc; + m_WindowPlacement.showCmd = SW_SHOWNORMAL; +} + + +bool CWindowSettings::Load(LPCTSTR szRegKey, LPCTSTR szPrefix, HKEY hkRootKey /* = HKEY_CURRENT_USER*/) +{ + CRegKey reg; + DWORD err = reg.Open(hkRootKey, szRegKey, KEY_READ); + + if (err == ERROR_SUCCESS) + { + DWORD dwType = NULL; + DWORD dwSize = sizeof(m_WindowPlacement); + err = RegQueryValueEx(reg.m_hKey, CString(szPrefix) + S_WINDOW_PLACEMENT_VAL, NULL, &dwType, + (LPBYTE)&m_WindowPlacement, &dwSize); + } + + return(err == ERROR_SUCCESS); +} + + +bool CWindowSettings::Save(LPCTSTR szRegKey, LPCTSTR szPrefix, HKEY hkRootKey /* = HKEY_CURRENT_USER*/) const +{ + CRegKey reg; + DWORD err = reg.Create(hkRootKey, szRegKey); + + if (err == ERROR_SUCCESS) + { + err = RegSetValueEx(reg.m_hKey, CString(szPrefix) + S_WINDOW_PLACEMENT_VAL, NULL, REG_BINARY, + (LPBYTE)&m_WindowPlacement, sizeof(m_WindowPlacement)); + } + + return(err == ERROR_SUCCESS); +} + + +void CWindowSettings::GetFrom(CWindow& Wnd) +{ + ATLASSERT(Wnd.IsWindow()); + Wnd.GetWindowPlacement(&m_WindowPlacement); +} + + +void CWindowSettings::ApplyTo(CWindow& Wnd, int nCmdShow /* = SW_SHOWNORMAL*/) const +{ + ATLASSERT(Wnd.IsWindow()); + + Wnd.SetWindowPlacement(&m_WindowPlacement); + + if (SW_SHOWNORMAL != nCmdShow) + { + Wnd.ShowWindow(nCmdShow); + } + else + if (m_WindowPlacement.showCmd == SW_MINIMIZE || m_WindowPlacement.showCmd == SW_SHOWMINIMIZED) + { + Wnd.ShowWindow(SW_SHOWNORMAL); + } +} + + +////////////////////////////////////////////////////////////////////// +// CReBarSettings + +#define S_BAR_BANDCOUNT _T("BandCount") +#define S_BAR_ID_VAL _T("ID") +#define S_BAR_CX_VAL _T("CX") +#define S_BAR_BREAKLINE_VAL _T("BreakLine") + +CReBarSettings::CReBarSettings() +{ + m_pBands = NULL; + m_cbBandCount = 0; +} + + +CReBarSettings::~CReBarSettings() +{ + if (m_pBands != NULL) + { + delete[] m_pBands; + } +} + + +bool CReBarSettings::Load(LPCTSTR szRegKey, LPCTSTR szPrefix, HKEY hkRootKey /* = HKEY_CURRENT_USER*/) +{ + if (m_pBands != NULL) + { + delete[] m_pBands; + } + + m_pBands = NULL; + m_cbBandCount = 0; + + CRegKey reg; + DWORD err = reg.Open(hkRootKey, szRegKey, KEY_READ); + + if (err == ERROR_SUCCESS) + { + reg.QueryValue(m_cbBandCount, CString(szPrefix) + S_BAR_BANDCOUNT); + + if (m_cbBandCount > 0) + { + m_pBands = new BandInfo[m_cbBandCount]; + } + + for (DWORD i = 0; i < m_cbBandCount; i++) + { + CString s; + s.Format(_T("%s%i_"), szPrefix, i); + reg.QueryValue(m_pBands[i].ID, s + S_BAR_ID_VAL); + reg.QueryValue(m_pBands[i].cx, s + S_BAR_CX_VAL); + + DWORD dw; + reg.QueryValue(dw, s + S_BAR_BREAKLINE_VAL); + m_pBands[i].BreakLine = dw != 0; + } + } + + return(err == ERROR_SUCCESS); +} + + +bool CReBarSettings::Save(LPCTSTR szRegKey, LPCTSTR szPrefix, HKEY hkRootKey /* = HKEY_CURRENT_USER*/) const +{ + CRegKey reg; + DWORD err = reg.Create(hkRootKey, szRegKey); + + if (err == ERROR_SUCCESS) + { + reg.SetValue(m_cbBandCount, CString(szPrefix) + S_BAR_BANDCOUNT); + + for (DWORD i = 0; i < m_cbBandCount; i++) + { + CString s; + s.Format(_T("%s%i_"), szPrefix, i); + reg.SetValue(m_pBands[i].ID, s + S_BAR_ID_VAL); + reg.SetValue(m_pBands[i].cx, s + S_BAR_CX_VAL); + + DWORD dw = m_pBands[i].BreakLine; + reg.SetValue(dw, s + S_BAR_BREAKLINE_VAL); + } + } + + return(err == ERROR_SUCCESS); +} + + +void CReBarSettings::GetFrom(CReBarCtrl& ReBar) +{ + ATLASSERT(ReBar.IsWindow()); + + if (m_pBands != NULL) + { + delete[] m_pBands; + } + + m_pBands = NULL; + m_cbBandCount = ReBar.GetBandCount(); + + if (m_cbBandCount > 0) + { + m_pBands = new BandInfo[m_cbBandCount]; + } + + for (UINT i = 0; i < m_cbBandCount; i++) + { + REBARBANDINFO rbi; + rbi.cbSize = sizeof(rbi); + rbi.fMask = RBBIM_ID | RBBIM_SIZE | RBBIM_STYLE; + ReBar.GetBandInfo(i, &rbi); + m_pBands[i].ID = rbi.wID; + m_pBands[i].cx = rbi.cx; + m_pBands[i].BreakLine = (rbi.fStyle & RBBS_BREAK) != 0; + } +} + + +void CReBarSettings::ApplyTo(CReBarCtrl& ReBar) const +{ + ATLASSERT(ReBar.IsWindow()); + + for (UINT i = 0; i < m_cbBandCount; i++) + { + ReBar.MoveBand(ReBar.IdToIndex(m_pBands[i].ID), i); + REBARBANDINFO rbi; + rbi.cbSize = sizeof(rbi); + rbi.fMask = RBBIM_ID | RBBIM_SIZE | RBBIM_STYLE; + ReBar.GetBandInfo(i, &rbi); + + rbi.cx = m_pBands[i].cx; + + if (m_pBands[i].BreakLine) + { + rbi.fStyle |= RBBS_BREAK; + } + else + { + rbi.fStyle &= (~RBBS_BREAK); + } + + ReBar.SetBandInfo(i, &rbi); + } +} + + +////////////////////////////////////////////////////////////////////// +// CSplitterSettings + +#define S_SPLITTER_POS _T("SplitterPos") + +bool CSplitterSettings::Load(LPCTSTR szRegKey, LPCTSTR szPrefix, HKEY hkRootKey /* = HKEY_CURRENT_USER*/) +{ + CRegKey reg; + DWORD err = reg.Open(hkRootKey, szRegKey, KEY_READ); + + if (err == ERROR_SUCCESS) + { + reg.QueryValue(m_dwPos, CString(szPrefix) + S_SPLITTER_POS); + } + + return(err == ERROR_SUCCESS); +} + + +bool CSplitterSettings::Save(LPCTSTR szRegKey, LPCTSTR szPrefix, HKEY hkRootKey /* = HKEY_CURRENT_USER*/) const +{ + CRegKey reg; + DWORD err = reg.Create(hkRootKey, szRegKey); + + if (err == ERROR_SUCCESS) + { + reg.SetValue(m_dwPos, CString(szPrefix) + S_SPLITTER_POS); + } + + return(err == ERROR_SUCCESS); +} + + diff --git a/Source/Plugins/Plugin_DSP_LLE/Src/RegSettings.h b/Source/Plugins/Plugin_DSP_LLE/Src/RegSettings.h new file mode 100644 index 0000000000..2ddf1bdf44 --- /dev/null +++ b/Source/Plugins/Plugin_DSP_LLE/Src/RegSettings.h @@ -0,0 +1,81 @@ +// RegSettings.h +// +// Copyright (c) 2001 Magomed Abdurakhmanov +// maq@hotbox.ru, http://mickels.iwt.ru/en +// +// +// +// No warranties are given. Use at your own risk. +// +////////////////////////////////////////////////////////////////////// + +#if !defined (AFX_REGSETTINGS_H__91E69C67_8104_4819_969A_B5E71A9993D5__INCLUDED_) +#define AFX_REGSETTINGS_H__91E69C67_8104_4819_969A_B5E71A9993D5__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#include +#include + +class CWindowSettings +{ + public: + + WINDOWPLACEMENT m_WindowPlacement; + + CWindowSettings(); + void GetFrom(CWindow& Wnd); + void ApplyTo(CWindow& Wnd, int nCmdShow = SW_SHOWNORMAL) const; + + bool Load(LPCTSTR szRegKey, LPCTSTR szPrefix, HKEY hkRootKey = HKEY_CURRENT_USER); + bool Save(LPCTSTR szRegKey, LPCTSTR szPrefix, HKEY hkRootKey = HKEY_CURRENT_USER) const; +}; + +class CReBarSettings +{ + public: + + struct BandInfo + { + DWORD ID; + DWORD cx; + bool BreakLine; + }* m_pBands; + + DWORD m_cbBandCount; + + CReBarSettings(); + ~CReBarSettings(); + + void GetFrom(CReBarCtrl& ReBar); + void ApplyTo(CReBarCtrl& ReBar) const; + + bool Load(LPCTSTR szRegKey, LPCTSTR szPrefix, HKEY hkRootKey = HKEY_CURRENT_USER); + bool Save(LPCTSTR szRegKey, LPCTSTR szPrefix, HKEY hkRootKey = HKEY_CURRENT_USER) const; +}; + +class CSplitterSettings +{ + public: + + DWORD m_dwPos; + + templatevoid GetFrom(const T& Splitter) + { + m_dwPos = Splitter.GetSplitterPos(); + } + + + templatevoid ApplyTo(T& Splitter) const + { + Splitter.SetSplitterPos(m_dwPos); + } + + + bool Load(LPCTSTR szRegKey, LPCTSTR szPrefix, HKEY hkRootKey = HKEY_CURRENT_USER); + bool Save(LPCTSTR szRegKey, LPCTSTR szPrefix, HKEY hkRootKey = HKEY_CURRENT_USER) const; +}; + +#endif // !defined(AFX_REGSETTINGS_H__91E69C67_8104_4819_969A_B5E71A9993D5__INCLUDED_) diff --git a/Source/Plugins/Plugin_DSP_LLE/Src/RegisterDlg.cpp b/Source/Plugins/Plugin_DSP_LLE/Src/RegisterDlg.cpp new file mode 100644 index 0000000000..dc1c91bfb6 --- /dev/null +++ b/Source/Plugins/Plugin_DSP_LLE/Src/RegisterDlg.cpp @@ -0,0 +1,207 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "../res/resource.h" +#include "RegisterDlg.h" + +#include "disassemble.h" +#include "gdsp_interpreter.h" +#include "RegSettings.h" + +CRegisterDlg::CRegisterDlg() + : m_CachedCounter(-1) +{} + + +BOOL CRegisterDlg::PreTranslateMessage(MSG* pMsg) +{ + return(IsDialogMessage(pMsg)); +} + + +BOOL CRegisterDlg::OnIdle() +{ + return(FALSE); +} + + +LRESULT CRegisterDlg::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) +{ + CWindowSettings ws; + + if (ws.Load("Software\\Dolphin\\DSP", "Register")) + { + ws.ApplyTo(CWindow(m_hWnd), SW_SHOW); + } + + m_RegisterListViewCtrl.m_hWnd = GetDlgItem(IDC_DISASM_LIST); + + UIAddChildWindowContainer(m_hWnd); + + m_RegisterListViewCtrl.AddColumn(_T("General"), 0); + m_RegisterListViewCtrl.AddColumn(_T(" "), 1); + m_RegisterListViewCtrl.AddColumn(_T("Special"), 2); + m_RegisterListViewCtrl.AddColumn(_T("0"), 3); + + m_RegisterListViewCtrl.SetColumnWidth(0, 50); + m_RegisterListViewCtrl.SetColumnWidth(1, 100); + m_RegisterListViewCtrl.SetColumnWidth(2, 60); + m_RegisterListViewCtrl.SetColumnWidth(3, 100); + + m_RegisterListViewCtrl.SetExtendedListViewStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES); + m_RegisterListViewCtrl.SetTextBkColor(GetSysColor(COLOR_3DLIGHT)); + + + for (uint16 i = 0; i < 16; i++) + { + // 0-15 + int Item = m_RegisterListViewCtrl.AddItem(0, 0, gd_dis_get_reg_name(i)); + + // 16-31 + m_RegisterListViewCtrl.AddItem(Item, 2, gd_dis_get_reg_name(16 + i)); + + // just for easy sort + m_RegisterListViewCtrl.SetItemData(Item, i); + } + + m_RegisterListViewCtrl.SortItems(CompareFunc, (LPARAM) this); + + UpdateRegisterListView(); + + return(TRUE); +} + + +LRESULT CRegisterDlg::OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) +{ + CWindowSettings ws; + ws.GetFrom(CWindow(m_hWnd)); + ws.Save("Software\\Dolphin\\DSP", "Register"); + + return(0); +} + + +void CRegisterDlg::UpdateRegisterListView() +{ + if (m_CachedCounter == g_dsp.step_counter) + { + return; + } + + m_CachedCounter = g_dsp.step_counter; + + char Temp[256]; + + for (uint16 i = 0; i < 16; i++) + { + // 0-15 + if (m_CachedRegs[i] != g_dsp.r[i]) + { + m_CachedRegHasChanged[i] = true; + } + else + { + m_CachedRegHasChanged[i] = false; + } + + m_CachedRegs[i] = g_dsp.r[i]; + + sprintf_s(Temp, 256, "0x%04x", g_dsp.r[i]); + m_RegisterListViewCtrl.SetItemText(i, 1, Temp); + + // 16-31 + if (m_CachedRegs[16 + i] != g_dsp.r[16 + i]) + { + m_CachedRegHasChanged[16 + i] = true; + } + else + { + m_CachedRegHasChanged[16 + i] = false; + } + + m_CachedRegs[16 + i] = g_dsp.r[16 + i]; + + sprintf_s(Temp, 256, "0x%04x", g_dsp.r[16 + i]); + m_RegisterListViewCtrl.SetItemText(i, 3, Temp); + } +} + + +int CALLBACK CRegisterDlg::CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) +{ + return(lParam1 > lParam2); +} + + +LRESULT CRegisterDlg::OnCustomDraw(int /*idCtrl*/, LPNMHDR pnmh, BOOL& _bHandled) +{ + int result = CDRF_DODEFAULT; + + NMLVCUSTOMDRAW* pLVCD = reinterpret_cast(pnmh); + + switch (pLVCD->nmcd.dwDrawStage) + { + case CDDS_PREPAINT: + result = CDRF_NOTIFYITEMDRAW; + break; + + case CDDS_ITEMPREPAINT: + result = CDRF_NOTIFYSUBITEMDRAW; + break; + + case (CDDS_ITEMPREPAINT | CDDS_SUBITEM): + { + pLVCD->nmcd.uItemState &= ~(CDIS_SELECTED | CDIS_FOCUS); + + int Offset = static_cast(m_RegisterListViewCtrl.GetItemData((int)pLVCD->nmcd.dwItemSpec)); + + size_t Register = -1; + + if (pLVCD->iSubItem == 1) + { + Register = Offset; + } + else if (pLVCD->iSubItem == 3) + { + Register = Offset + 16; + } + + if (Register != -1) + { + if (m_CachedRegHasChanged[Register]) + { + pLVCD->clrTextBk = RGB(0xFF, 192, 192); + } + else + { + pLVCD->clrTextBk = RGB(0xF0, 0xF0, 0xF0); + } + } + else + { + pLVCD->clrTextBk = RGB(192, 224, 192); + } + + + // uint16 CurrentAddress = static_cast(m_DisAsmListViewCtrl.GetItemData((int)pLVCD->nmcd.dwItemSpec)); + } + break; + } + + return(result); +} diff --git a/Source/Plugins/Plugin_DSP_LLE/Src/RegisterDlg.h b/Source/Plugins/Plugin_DSP_LLE/Src/RegisterDlg.h new file mode 100644 index 0000000000..52fa22c957 --- /dev/null +++ b/Source/Plugins/Plugin_DSP_LLE/Src/RegisterDlg.h @@ -0,0 +1,80 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#pragma once + +#include "Globals.h" + +#include +#include "DisAsmListView.h" + +class CRegisterDlg + : public CDialogImpl, public CUpdateUI +{ + public: + + CRegisterDlg(); + + enum { IDD = IDD_REGISTERDLG }; + + virtual BOOL PreTranslateMessage(MSG* pMsg); + virtual BOOL OnIdle(); + + + BEGIN_UPDATE_UI_MAP(CRegisterDlg) + END_UPDATE_UI_MAP() + + BEGIN_MSG_MAP(CRegisterDlg) + MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) + MESSAGE_HANDLER(WM_DESTROY, OnDestroy) + NOTIFY_CODE_HANDLER(NM_CUSTOMDRAW, OnCustomDraw) + +// COMMAND_ID_HANDLER(ID_STEP, OnStep) +// COMMAND_ID_HANDLER(ID_GO, OnGo) +// COMMAND_ID_HANDLER(ID_SHOW_REGISTER, OnShowRegisters) + END_MSG_MAP() + +// Handler prototypes (uncomment arguments if needed): +// LRESULT MessageHandler(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) +// LRESULT CommandHandler(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) +// LRESULT NotifyHandler(int /*idCtrl*/, LPNMHDR /*pnmh*/, BOOL& /*bHandled*/) + + LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL & /*bHandled*/); + LRESULT OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL & /*bHandled*/); + LRESULT OnCustomDraw(int /*idCtrl*/, LPNMHDR pnmh, BOOL& _bHandled); + + +// LRESULT OnStep(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/); +// LRESULT OnGo(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/); +// LRESULT OnShowRegisters(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/); + + void CloseDialog(int nVal); + + void UpdateRegisterListView(); + + + private: + + CListViewCtrl m_RegisterListViewCtrl; + + static int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort); + + + uint64 m_CachedCounter; + uint16 m_CachedRegs[32]; + bool m_CachedRegHasChanged[32]; +}; diff --git a/Source/Plugins/Plugin_DSP_LLE/Src/SConscript b/Source/Plugins/Plugin_DSP_LLE/Src/SConscript new file mode 100644 index 0000000000..6ae755d215 --- /dev/null +++ b/Source/Plugins/Plugin_DSP_LLE/Src/SConscript @@ -0,0 +1,17 @@ +Import('env') +output = "../../../../Binary/linux/Plugins/temp/dsplle.so" +files = ["disassemble.cpp", + "gdsp_aram.cpp", + "gdsp_ext_op.cpp", + "gdsp_interface.cpp", + "gdsp_interpreter.cpp", + "gdsp_memory.cpp", + "gdsp_opcodes.cpp", + "gdsp_registers.cpp", + "Globals.cpp", + "opcodes.cpp", + "Tools.cpp", + "UCode_AX.cpp", + ] +#env.Append(LINKFLAGS = "-symbolic") +env.SharedLibrary(output, files) diff --git a/Source/Plugins/Plugin_DSP_LLE/Src/Tools.cpp b/Source/Plugins/Plugin_DSP_LLE/Src/Tools.cpp new file mode 100644 index 0000000000..7cc05b8a7a --- /dev/null +++ b/Source/Plugins/Plugin_DSP_LLE/Src/Tools.cpp @@ -0,0 +1,87 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include +#include + +#include "Common.h" +#include "Globals.h" + +#include "gdsp_interpreter.h" + +bool DumpDSPCode(uint32 _Address, uint32 _Length) +{ + FILE* pFile = fopen("d:\\DSP_UCode.bin", "wb"); + + if (pFile != NULL) + { + fwrite(g_dspInitialize.pGetMemoryPointer(_Address), _Length, 1, pFile); + fclose(pFile); + return(true); + } + + return(false); +} + + +uint32 GenerateCRC(const unsigned char* _pBuffer, int _pLength) +{ + unsigned long CRC = 0xFFFFFFFF; + + while (_pLength--) + { + unsigned long Temp = (unsigned long)((CRC & 0xFF) ^ *_pBuffer++); + + for (int j = 0; j < 8; j++) + { + if (Temp & 0x1) + { + Temp = (Temp >> 1) ^ 0xEDB88320; + } + else + { + Temp >>= 1; + } + } + + CRC = (CRC >> 8) ^ Temp; + } + + return(CRC ^ 0xFFFFFFFF); +} + + +bool DumpCWCode(uint32 _Address, uint32 _Length) +{ + FILE* pFile = fopen("d:\\DSP_UCode.bin", "wb"); + + if (pFile != NULL) + { + for (size_t i = _Address; i < _Address + _Length; i++) + { + uint16 val = Common::swap16(g_dsp.iram[i]); + fprintf(pFile, " cw 0x%04x \n", val); + } + + fclose(pFile); + return(true); + } + + return(false); +} + + diff --git a/Source/Plugins/Plugin_DSP_LLE/Src/Tools.h b/Source/Plugins/Plugin_DSP_LLE/Src/Tools.h new file mode 100644 index 0000000000..13d7cc6444 --- /dev/null +++ b/Source/Plugins/Plugin_DSP_LLE/Src/Tools.h @@ -0,0 +1,50 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#pragma once + +// UDSPControl +union UDSPControl +{ + uint16 Hex; + struct + { + unsigned DSPReset : 1; // Write 1 to reset and waits for 0 + unsigned DSPAssertInt : 1; + unsigned DSPHalt : 1; + + unsigned AI : 1; + unsigned AI_mask : 1; + unsigned ARAM : 1; + unsigned ARAM_mask : 1; + unsigned DSP : 1; + unsigned DSP_mask : 1; + + unsigned ARAM_DMAState : 1; // DSPGetDMAStatus() uses this flag + unsigned unk3 : 1; + unsigned DSPInit : 1; // DSPInit() writes to this flag + unsigned pad : 4; + }; + + UDSPControl(uint16 _Hex = 0) + : Hex(_Hex) {} +}; + + +bool DumpDSPCode(uint32 _Address, uint32 _Length); +uint32 GenerateCRC(const unsigned char* _pBuffer, int _pLength); +bool DumpCWCode(uint32 _Address, uint32 _Length); diff --git a/Source/Plugins/Plugin_DSP_LLE/Src/disassemble.cpp b/Source/Plugins/Plugin_DSP_LLE/Src/disassemble.cpp new file mode 100644 index 0000000000..553cd60171 --- /dev/null +++ b/Source/Plugins/Plugin_DSP_LLE/Src/disassemble.cpp @@ -0,0 +1,619 @@ +/*==================================================================== + + filename: disassemble.cpp + project: GameCube DSP Tool (gcdsp) + created: 2005.03.04 + mail: duddie@walla.com + + Copyright (c) 2005 Duddie + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + ====================================================================*/ + +#include +#include +#include + +#include "Globals.h" + +#include "disassemble.h" +#include "opcodes.h" +// #include "gdsp_tool.h" + +#ifdef _MSC_VER +#pragma warning(disable:4996) +#endif + +uint32 unk_opcodes[0x10000]; + +uint16 swap16(uint16 x); + + +// predefined labels +typedef struct pdlabel_t +{ + uint16 addr; + const char* name; + const char* description; +} pdlabels_t; + +const pdlabel_t pdlabels[] = +{ + {0xffa0, "COEF_A1_0", "COEF_A1_0",}, + {0xffa1, "COEF_A2_0", "COEF_A2_0",}, + {0xffa2, "COEF_A1_1", "COEF_A1_1",}, + {0xffa3, "COEF_A2_1", "COEF_A2_1",}, + {0xffa4, "COEF_A1_2", "COEF_A1_2",}, + {0xffa5, "COEF_A2_2", "COEF_A2_2",}, + {0xffa6, "COEF_A1_3", "COEF_A1_3",}, + {0xffa7, "COEF_A2_3", "COEF_A2_3",}, + {0xffa8, "COEF_A1_4", "COEF_A1_4",}, + {0xffa9, "COEF_A2_4", "COEF_A2_4",}, + {0xffaa, "COEF_A1_5", "COEF_A1_5",}, + {0xffab, "COEF_A2_5", "COEF_A2_5",}, + {0xffac, "COEF_A1_6", "COEF_A1_6",}, + {0xffad, "COEF_A2_6", "COEF_A2_6",}, + {0xffae, "COEF_A1_7", "COEF_A1_7",}, + {0xffaf, "COEF_A2_7", "COEF_A2_7",}, + {0xffc9, "DSCR", "DSP DMA Control Reg",}, + {0xffcb, "DSBL", "DSP DMA Block Length",}, + {0xffcd, "DSPA", "DSP DMA DMEM Address",}, + {0xffce, "DSMAH", "DSP DMA Mem Address H",}, + {0xffcf, "DSMAL", "DSP DMA Mem Address L",}, + {0xffd1, "SampleFormat", "SampleFormat",}, + {0xffd4, "ACSAH", "Accelerator start address H",}, + {0xffd5, "ACSAL", "Accelerator start address L",}, + {0xffd6, "ACEAH", "Accelerator end address H",}, + {0xffd7, "ACEAL", "Accelerator end address L",}, + {0xffd8, "ACCAH", "Accelerator current address H",}, + {0xffd9, "ACCAL", "Accelerator current address L",}, + {0xffda, "pred_scale", "pred_scale",}, + {0xffdb, "yn1", "yn1",}, + {0xffdc, "yn2", "yn2",}, + {0xffdd, "ARAM", "Direct Read from ARAM (uses ADPCM)",}, + {0xffde, "GAIN", "Gain",}, + {0xffef, "AMDM", "ARAM DMA Request Mask",}, + {0xfffb, "DIRQ", "DSP IRQ Request",}, + {0xfffc, "DMBH", "DSP Mailbox H",}, + {0xfffd, "DMBL", "DSP Mailbox L",}, + {0xfffe, "CMBH", "CPU Mailbox H",}, + {0xffff, "CMBL", "CPU Mailbox L",}, +}; + +pdlabel_t regnames[] = +{ + {0x00, "R00", "Register 00",}, + {0x01, "R01", "Register 01",}, + {0x02, "R02", "Register 02",}, + {0x03, "R03", "Register 03",}, + {0x04, "R04", "Register 04",}, + {0x05, "R05", "Register 05",}, + {0x06, "R06", "Register 06",}, + {0x07, "R07", "Register 07",}, + {0x08, "R08", "Register 08",}, + {0x09, "R09", "Register 09",}, + {0x0a, "R10", "Register 10",}, + {0x0b, "R11", "Register 11",}, + {0x0c, "ST0", "Call stack",}, + {0x0d, "ST1", "Data stack",}, + {0x0e, "ST2", "Loop address stack",}, + {0x0f, "ST3", "Loop counter",}, + {0x00, "ACH0", "Accumulator High 0",}, + {0x11, "ACH1", "Accumulator High 1",}, + {0x12, "CR", "Config Register",}, + {0x13, "SR", "Special Register",}, + {0x14, "PROD.L", "PROD L",}, + {0x15, "PROD.M1", "PROD M1",}, + {0x16, "PROD.H", "PROD H",}, + {0x17, "PROD.M2", "PROD M2",}, + {0x18, "AX0.L", "Additional Accumulators Low 0",}, + {0x19, "AX1.L", "Additional Accumulators Low 1",}, + {0x1a, "AX0.H", "Additional Accumulators High 0",}, + {0x1b, "AX1.H", "Additional Accumulators High 1",}, + {0x1c, "AC0.L", "Register 28",}, + {0x1d, "AC1.L", "Register 29",}, + {0x1e, "AC0.M", "Register 00",}, + {0x1f, "AC1.M", "Register 00",}, + +// additional to resolve special names + {0x20, "ACC0", "Accumulators 0",}, + {0x21, "ACC1", "Accumulators 1",}, + {0x22, "AX0", "Additional Accumulators 0",}, + {0x23, "AX1", "Additional Accumulators 1",}, +}; + +const char* pdname(uint16 val) +{ + static char tmpstr[12]; // nasty + + for (int i = 0; i < (int)(sizeof(pdlabels) / sizeof(pdlabel_t)); i++) + { + if (pdlabels[i].addr == val) + { + return(pdlabels[i].name); + } + } + + sprintf(tmpstr, "0x%04x", val); + return(tmpstr); +} + + +char* gd_dis_params(gd_globals_t* gdg, opc_t* opc, uint16 op1, uint16 op2, char* strbuf) +{ + char* buf = strbuf; + uint32 val; + int j; + + for (j = 0; j < opc->param_count; j++) + { + if (j > 0) + { + sprintf(buf, ", "); + buf += strlen(buf); + } + + if (opc->params[j].loc >= 1) + { + val = op2; + } + else + { + val = op1; + } + + val &= opc->params[j].mask; + + if (opc->params[j].lshift < 0) + { + val = val << (-opc->params[j].lshift); + } + else + { + val = val >> opc->params[j].lshift; + } + + uint32 type; + type = opc->params[j].type; + + if (type & P_REG) + { + if (type == P_ACCM_D) + { + val = (~val & 0x1) | ((type & P_REGS_MASK) >> 8); + } + else + { + val |= (type & P_REGS_MASK) >> 8; + } + + type &= ~P_REGS_MASK; + } + + switch (type) + { + case P_REG: + + if (gdg->decode_registers){sprintf(buf, "$%s", regnames[val].name);} + else {sprintf(buf, "$%d", val);} + + break; + + case P_PRG: + + if (gdg->decode_registers){sprintf(buf, "@$%s", regnames[val].name);} + else {sprintf(buf, "@$%d", val);} + + break; + + case P_VAL: + sprintf(buf, "0x%04x", val); + break; + + case P_IMM: + + if (opc->params[j].size != 2) + { + sprintf(buf, "#0x%02x", val); + } + else + { + sprintf(buf, "#0x%04x", val); + } + + break; + + case P_MEM: + + if (opc->params[j].size != 2) + { + val = (uint16)(sint8)val; + } + + if (gdg->decode_names) + { + sprintf(buf, "@%s", pdname(val)); + } + else + { + sprintf(buf, "@0x%04x", val); + } + + break; + + default: + ErrorLog("Unknown parameter type: %x\n", opc->params[j].type); + exit(-1); + break; + } + + buf += strlen(buf); + } + + return(strbuf); +} + + +gd_globals_t* gd_init() +{ + gd_globals_t* gdg = (gd_globals_t*)malloc(sizeof(gd_globals_t)); + memset(gdg, 0, sizeof(gd_globals_t)); + return(gdg); +} + + +uint16 gd_dis_get_opcode_size(gd_globals_t* gdg) +{ + opc_t* opc = 0; + opc_t* opc_ext = 0; + bool extended; + + if ((gdg->pc & 0x7fff) >= 0x1000) + { + return(1); + } + + uint32 op1 = swap16(gdg->binbuf[gdg->pc & 0x0fff]); + + for (uint32 j = 0; j < opcodes_size; j++) + { + uint16 mask; + + if (opcodes[j].size & P_EXT) + { + mask = opcodes[j].opcode_mask & 0xff00; + } + else + { + mask = opcodes[j].opcode_mask; + } + + if ((op1 & mask) == opcodes[j].opcode) + { + opc = &opcodes[j]; + break; + } + } + + if (!opc) + { + ErrorLog("get_opcode_size ARGH"); + exit(0); + } + + if (opc->size & P_EXT && op1 & 0x00ff) + { + extended = true; + } + else + { + extended = false; + } + + if (extended) + { + // opcode has an extension + // find opcode + for (uint32 j = 0; j < opcodes_ext_size; j++) + { + if ((op1 & opcodes_ext[j].opcode_mask) == opcodes_ext[j].opcode) + { + opc_ext = &opcodes_ext[j]; + break; + } + } + + if (!opc_ext) + { + ErrorLog("get_opcode_size ext ARGH"); + } + + return(opc_ext->size); + } + + return(opc->size & ~P_EXT); +} + + +char* gd_dis_opcode(gd_globals_t* gdg) +{ + uint32 j; + uint32 op1, op2; + opc_t* opc; + opc_t* opc_ext; + uint16 pc; + char* buf = gdg->buffer; + bool extended; + + pc = gdg->pc; + *buf = '\0'; + + if ((pc & 0x7fff) >= 0x1000) + { + gdg->pc++; + return(gdg->buffer); + } + + pc &= 0x0fff; + op1 = swap16(gdg->binbuf[pc]); + + // find opcode + for (j = 0; j < opcodes_size; j++) + { + uint16 mask; + + if (opcodes[j].size & P_EXT) + { + mask = opcodes[j].opcode_mask & 0xff00; + } + else + { + mask = opcodes[j].opcode_mask; + } + + if ((op1 & mask) == opcodes[j].opcode) + { + opc = &opcodes[j]; + break; + } + } + + if (opc->size & P_EXT && op1 & 0x00ff) + { + extended = true; + } + else + { + extended = false; + } + + if (extended) + { + // opcode has an extension + // find opcode + for (j = 0; j < opcodes_ext_size; j++) + { + if ((op1 & opcodes_ext[j].opcode_mask) == opcodes_ext[j].opcode) + { + opc_ext = &opcodes_ext[j]; + break; + } + } + } + + // printing + + if (gdg->show_pc){sprintf(buf, "%04x ", gdg->pc);} + + buf += strlen(buf); + + if ((opc->size & ~P_EXT) == 2) + { + op2 = swap16(gdg->binbuf[pc + 1]); + + if (gdg->show_hex){sprintf(buf, "%04x %04x ", op1, op2);} + } + else + { + op2 = 0; + + if (gdg->show_hex){sprintf(buf, "%04x ", op1);} + } + + buf += strlen(buf); + + char tmpbuf[20]; + + if (extended) + { + sprintf(tmpbuf, "%s%c%s", opc->name, gdg->ext_separator, opc_ext->name); + } + else + { + sprintf(tmpbuf, "%s", opc->name); + } + + if (gdg->print_tabs) + { + sprintf(buf, "%s\t", tmpbuf); + } + else + { + sprintf(buf, "%-12s", tmpbuf); + } + + buf += strlen(buf); + + if (opc->param_count > 0) + { + gd_dis_params(gdg, opc, op1, op2, buf); + } + + buf += strlen(buf); + + if (extended) + { + if (opc->param_count > 0) + { + sprintf(buf, " "); + } + + buf += strlen(buf); + + sprintf(buf, ": "); + buf += strlen(buf); + + if (opc_ext->param_count > 0) + { + gd_dis_params(gdg, opc_ext, op1, op2, buf); + } + + buf += strlen(buf); + } + + if (opc->opcode_mask == 0) + { + // unknown opcode + unk_opcodes[op1]++; + sprintf(buf, "\t\t; *** UNKNOWN OPCODE ***"); + } + + if (extended) + { + gdg->pc += opc_ext->size; + } + else + { + gdg->pc += opc->size & ~P_EXT; + } + + return(gdg->buffer); +} + + +bool gd_dis_file(gd_globals_t* gdg, char* name, FILE* output) +{ + FILE* in; + uint32 size; + + in = fopen(name, "rb"); + + if (in == NULL) + { + return(false); + } + + fseek(in, 0, SEEK_END); + size = ftell(in); + fseek(in, 0, SEEK_SET); + gdg->binbuf = (uint16*)malloc(size); + fread(gdg->binbuf, 1, size, in); + + gdg->buffer = (char*)malloc(256); + gdg->buffer_size = 256; + + for (gdg->pc = 0; gdg->pc < (size / 2);) + { + fprintf(output, "%s\n", gd_dis_opcode(gdg)); + } + + fclose(in); + + free(gdg->binbuf); + gdg->binbuf = NULL; + + free(gdg->buffer); + gdg->buffer = NULL; + gdg->buffer_size = 0; + + return(true); +} + + +void gd_dis_close_unkop() +{ + FILE* uo; + int i, j; + uint32 count = 0; + + uo = fopen("uo.bin", "wb"); + + if (uo) + { + fwrite(unk_opcodes, 1, sizeof(unk_opcodes), uo); + fclose(uo); + } + + uo = fopen("unkopc.txt", "w"); + + if (uo) + { + for (i = 0; i < 0x10000; i++) + { + if (unk_opcodes[i]) + { + count++; + fprintf(uo, "OP%04x\t%d", i, unk_opcodes[i]); + + for (j = 15; j >= 0; j--) + { + if ((j & 0x3) == 3) + { + fprintf(uo, "\tb"); + } + + fprintf(uo, "%d", (i >> j) & 0x1); + } + + fprintf(uo, "\n"); + } + } + + fprintf(uo, "Unknown opcodes count: %d\n", count); + fclose(uo); + } +} + + +void gd_dis_open_unkop() +{ + FILE* uo; + + uo = fopen("uo.bin", "rb"); + + if (uo) + { + fread(unk_opcodes, 1, sizeof(unk_opcodes), uo); + fclose(uo); + } + else + { + int i; + + for (i = 0; i < 0x10000; i++) + { + unk_opcodes[i] = 0; + } + } +} + + +const char* gd_dis_get_reg_name(uint16 reg) +{ + return(regnames[reg].name); +} + + diff --git a/Source/Plugins/Plugin_DSP_LLE/Src/disassemble.h b/Source/Plugins/Plugin_DSP_LLE/Src/disassemble.h new file mode 100644 index 0000000000..12c6dbdf3b --- /dev/null +++ b/Source/Plugins/Plugin_DSP_LLE/Src/disassemble.h @@ -0,0 +1,46 @@ +/*==================================================================== + + filename: opcodes.h + project: GameCube DSP Tool (gcdsp) + created: 2005.03.04 + mail: duddie@walla.com + + Copyright (c) 2005 Duddie + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + ====================================================================*/ + +#pragma once + +typedef struct gd_globals_t +{ + bool print_tabs; + bool show_hex; + bool show_pc; + bool decode_names; + bool decode_registers; + + uint16* binbuf; + uint16 pc; + char* buffer; + uint16 buffer_size; + char ext_separator; +} gd_globals_t; + + +char* gd_dis_opcode(gd_globals_t* gdg); +bool gd_dis_file(gd_globals_t* gdg, char* name, FILE* output); +const char* gd_dis_get_reg_name(uint16 reg); diff --git a/Source/Plugins/Plugin_DSP_LLE/Src/gdsp_aram.cpp b/Source/Plugins/Plugin_DSP_LLE/Src/gdsp_aram.cpp new file mode 100644 index 0000000000..000ce3ba48 --- /dev/null +++ b/Source/Plugins/Plugin_DSP_LLE/Src/gdsp_aram.cpp @@ -0,0 +1,114 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ +#include "Globals.h" +#include "gdsp_interface.h" + +extern uint16 dsp_swap16(uint16 x); + + +// the hardware adpcm decoder :) +sint16 ADPCM_Step(uint32& _rSamplePos, uint32 _BaseAddress) +{ + sint16* pCoefTable = (sint16*)&gdsp_ifx_regs[DSP_COEF_A1_0]; + + if (((_rSamplePos) & 15) == 0) + { + gdsp_ifx_regs[DSP_PRED_SCALE] = g_dspInitialize.pARAM_Read_U8((_rSamplePos & ~15) >> 1); + _rSamplePos += 2; + } + + int scale = 1 << (gdsp_ifx_regs[DSP_PRED_SCALE] & 0xF); + int coef_idx = gdsp_ifx_regs[DSP_PRED_SCALE] >> 4; + + sint32 coef1 = pCoefTable[coef_idx * 2 + 0]; + sint32 coef2 = pCoefTable[coef_idx * 2 + 1]; + + int temp = (_rSamplePos & 1) ? + (g_dspInitialize.pARAM_Read_U8(_rSamplePos >> 1) & 0xF) : + (g_dspInitialize.pARAM_Read_U8(_rSamplePos >> 1) >> 4); + + if (temp >= 8) + { + temp -= 16; //temp += 0xFFFFFFF0; + } + + //0x400 = 0.5 in 11-bit fixed point + int val = (scale * temp) + ((0x400 + coef1 * (sint16)gdsp_ifx_regs[DSP_YN1] + coef2 * (sint16)gdsp_ifx_regs[DSP_YN2]) >> 11); + + if (val > 0x7FFF) + { + val = 0x7FFF; + } + else if (val < -0x7FFF) + { + val = -0x7FFF; + } + + gdsp_ifx_regs[DSP_YN2] = gdsp_ifx_regs[DSP_YN1]; + gdsp_ifx_regs[DSP_YN1] = val; + + _rSamplePos++; + + return(val); + + // I think the interpolation (linear, polyphase,...) is done by the UCode +} + + +uint16 dsp_read_aram() +{ + uint32 BaseAddress = (gdsp_ifx_regs[DSP_ACSAH] << 16) | gdsp_ifx_regs[DSP_ACSAL]; + uint32 EndAddress = (gdsp_ifx_regs[DSP_ACEAH] << 16) | gdsp_ifx_regs[DSP_ACEAL]; + uint32 Address = (gdsp_ifx_regs[DSP_ACCAH] << 16) | gdsp_ifx_regs[DSP_ACCAL]; + + uint16 val; + + // lets the "hardware" decode + switch (gdsp_ifx_regs[DSP_FORMAT]) + { + case 0x00: + val = ADPCM_Step(Address, EndAddress); + break; + + case 0x0A: + val = (g_dspInitialize.pARAM_Read_U8(Address) << 8) | g_dspInitialize.pARAM_Read_U8(Address + 1); + + gdsp_ifx_regs[DSP_YN2] = gdsp_ifx_regs[DSP_YN1]; + gdsp_ifx_regs[DSP_YN1] = val; + + Address += 2; + break; + + default: + val = (g_dspInitialize.pARAM_Read_U8(Address) << 8) | g_dspInitialize.pARAM_Read_U8(Address + 1); + Address += 2; + ErrorLog("Unknown DSP Format %i", gdsp_ifx_regs[DSP_FORMAT]); + break; + } + + // check for loop + if (Address > EndAddress) + { + Address = (gdsp_ifx_regs[DSP_ACSAH] << 16) | gdsp_ifx_regs[DSP_ACSAL]; + //ErrorLog("Should we generate a lvl5 exception !??!"); + //gdsp_exception(5); + } + + gdsp_ifx_regs[DSP_ACCAH] = Address >> 16; + gdsp_ifx_regs[DSP_ACCAL] = Address & 0xffff; + return(val); +} diff --git a/Source/Plugins/Plugin_DSP_LLE/Src/gdsp_aram.h b/Source/Plugins/Plugin_DSP_LLE/Src/gdsp_aram.h new file mode 100644 index 0000000000..ef37193c19 --- /dev/null +++ b/Source/Plugins/Plugin_DSP_LLE/Src/gdsp_aram.h @@ -0,0 +1,19 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ +#pragma once + +uint16 dsp_read_aram(); diff --git a/Source/Plugins/Plugin_DSP_LLE/Src/gdsp_ext_op.cpp b/Source/Plugins/Plugin_DSP_LLE/Src/gdsp_ext_op.cpp new file mode 100644 index 0000000000..45aa63b992 --- /dev/null +++ b/Source/Plugins/Plugin_DSP_LLE/Src/gdsp_ext_op.cpp @@ -0,0 +1,288 @@ +/*==================================================================== + + filename: opcodes.h + project: GameCube DSP Tool (gcdsp) + created: 2005.03.04 + mail: duddie@walla.com + + Copyright (c) 2005 Duddie + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + ====================================================================*/ +// +// +// At the moment just ls and sl are using the prolog +// perhaps all actions on r03 must be in the prolog +// +#include "Globals.h" + +#include "gdsp_ext_op.h" +#include "gdsp_interpreter.h" +#include "gdsp_memory.h" + +extern inline void dsp_op_write_reg(uint8 reg, uint16 val); + + +// +void dsp_op_ext_r_epi(uint16 _Opcode) +{ + uint8 op = (_Opcode >> 2) & 0x3; + uint8 reg = _Opcode & 0x3; + + switch (op) + { + case 0x00: + ErrorLog("dsp_op_ext_r_epi"); + break; + + case 0x01: + g_dsp.r[reg]--; + break; + + case 0x02: + g_dsp.r[reg]++; + break; + + case 0x03: + g_dsp.r[reg] += g_dsp.r[reg + 4]; + break; + } +} + + +void dsp_op_ext_mv(uint16 _Opcode) +{ + uint8 sreg = _Opcode & 0x3; + uint8 dreg = ((_Opcode >> 2) & 0x3); + + g_dsp.r[dreg + 0x18] = g_dsp.r[sreg + 0x1c]; +} + + +void dsp_op_ext_s(uint16 _Opcode) +{ + uint8 dreg = _Opcode & 0x3; + uint8 sreg = ((_Opcode >> 3) & 0x3) + 0x1c; + + dsp_dmem_write(g_dsp.r[dreg], g_dsp.r[sreg]); + + if (_Opcode & 0x04) + { + g_dsp.r[dreg] += g_dsp.r[dreg + 4]; + } + else + { + g_dsp.r[dreg]++; + } +} + + +void dsp_op_ext_l(uint16 _Opcode) +{ + uint8 sreg = _Opcode & 0x3; + uint8 dreg = ((_Opcode >> 3) & 0x7) + 0x18; + + uint16 val = dsp_dmem_read(g_dsp.r[sreg]); + g_dsp.r[dreg] = val; + + if (_Opcode & 0x04) + { + g_dsp.r[sreg] += g_dsp.r[sreg + 4]; + } + else + { + g_dsp.r[sreg]++; + } +} + + +void dsp_op_ext_ls_pro(uint16 _Opcode) +{ + uint8 areg = (_Opcode & 0x1) + 0x1e; + dsp_dmem_write(g_dsp.r[0x03], g_dsp.r[areg]); + + if (_Opcode & 0x8) + { + g_dsp.r[0x03] += g_dsp.r[0x07]; + } + else + { + g_dsp.r[0x03]++; + } +} + + +void dsp_op_ext_ls_epi(uint16 _Opcode) +{ + uint8 dreg = ((_Opcode >> 4) & 0x3) + 0x18; + uint16 val = dsp_dmem_read(g_dsp.r[0x00]); + dsp_op_write_reg(dreg, val); + + if (_Opcode & 0x4) + { + g_dsp.r[0x00] += g_dsp.r[0x04]; + } + else + { + g_dsp.r[0x00]++; + } +} + + +void dsp_op_ext_sl_pro(uint16 _Opcode) +{ + uint8 areg = (_Opcode & 0x1) + 0x1e; + dsp_dmem_write(g_dsp.r[0x00], g_dsp.r[areg]); + + if (_Opcode & 0x4) + { + g_dsp.r[0x00] += g_dsp.r[0x04]; + } + else + { + g_dsp.r[0x00]++; + } +} + + +void dsp_op_ext_sl_epi(uint16 _Opcode) +{ + uint8 dreg = ((_Opcode >> 4) & 0x3) + 0x18; + uint16 val = dsp_dmem_read(g_dsp.r[0x03]); + dsp_op_write_reg(dreg, val); + + if (_Opcode & 0x8) + { + g_dsp.r[0x03] += g_dsp.r[0x07]; + } + else + { + g_dsp.r[0x03]++; + } +} + + +void dsp_op_ext_ld(uint16 _Opcode) +{ + uint8 dreg1 = (((_Opcode >> 5) & 0x1) << 1) + 0x18; + uint8 dreg2 = (((_Opcode >> 4) & 0x1) << 1) + 0x19; + uint8 sreg = _Opcode & 0x3; + g_dsp.r[dreg1] = dsp_dmem_read(g_dsp.r[sreg]); + g_dsp.r[dreg2] = dsp_dmem_read(g_dsp.r[0x03]); + + if (_Opcode & 0x04) + { + g_dsp.r[sreg] += g_dsp.r[sreg + 0x04]; + } + else + { + g_dsp.r[sreg]++; + } + + if (_Opcode & 0x08) + { + g_dsp.r[0x03] += g_dsp.r[0x07]; + } + else + { + g_dsp.r[0x03]++; + } +} + + +// ================================================================================ +// +// +// +// ================================================================================ + +void dsp_op_ext_ops_pro(uint16 _Opcode) +{ + if ((_Opcode & 0xFF) == 0){return;} + + switch ((_Opcode >> 4) & 0xf) + { + case 0x00: + dsp_op_ext_r_epi(_Opcode); + break; + + case 0x01: + dsp_op_ext_mv(_Opcode); + break; + + case 0x02: + case 0x03: + dsp_op_ext_s(_Opcode); + break; + + case 0x04: + case 0x05: + case 0x06: + case 0x07: + dsp_op_ext_l(_Opcode); + break; + + case 0x08: + case 0x09: + case 0x0a: + case 0x0b: + + if (_Opcode & 0x2) + { + dsp_op_ext_sl_pro(_Opcode); + } + else + { + dsp_op_ext_ls_pro(_Opcode); + } + + return; + + case 0x0c: + case 0x0d: + case 0x0e: + case 0x0f: + dsp_op_ext_ld(_Opcode); + break; + } +} + + +void dsp_op_ext_ops_epi(uint16 _Opcode) +{ + if ((_Opcode & 0xFF) == 0){return;} + + switch ((_Opcode >> 4) & 0xf) + { + case 0x08: + case 0x09: + case 0x0a: + case 0x0b: + + if (_Opcode & 0x2) + { + dsp_op_ext_sl_epi(_Opcode); + } + else + { + dsp_op_ext_ls_epi(_Opcode); + } + + return; + } +} + + diff --git a/Source/Plugins/Plugin_DSP_LLE/Src/gdsp_ext_op.h b/Source/Plugins/Plugin_DSP_LLE/Src/gdsp_ext_op.h new file mode 100644 index 0000000000..b6fb8fc9be --- /dev/null +++ b/Source/Plugins/Plugin_DSP_LLE/Src/gdsp_ext_op.h @@ -0,0 +1,33 @@ +/*==================================================================== + + filename: opcodes.h + project: GameCube DSP Tool (gcdsp) + created: 2005.03.04 + mail: duddie@walla.com + + Copyright (c) 2005 Duddie + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + ====================================================================*/ + +#ifndef _GDSP_EXT_OP_H +#define _GDSP_EXT_OP_H + +void dsp_op_ext_ops_pro(uint16 _Opcode); +void dsp_op_ext_ops_epi(uint16 _Opcode); + + +#endif diff --git a/Source/Plugins/Plugin_DSP_LLE/Src/gdsp_ifx.h b/Source/Plugins/Plugin_DSP_LLE/Src/gdsp_ifx.h new file mode 100644 index 0000000000..8211829811 --- /dev/null +++ b/Source/Plugins/Plugin_DSP_LLE/Src/gdsp_ifx.h @@ -0,0 +1,35 @@ +/*==================================================================== + + filename: gdsp_ifx.h + project: GCemu + created: 2004-6-18 + mail: duddie@walla.com + + Copyright (c) 2005 Duddie & Tratax + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + ====================================================================*/ + +// ADPCM hw + +#ifndef _GDSP_IFX_H +#define _GDSP_IFX_H + +void gdsp_ifx_write(uint16 addr, uint16 val); +uint16 gdsp_ifx_read(uint16 addr); + + +#endif diff --git a/Source/Plugins/Plugin_DSP_LLE/Src/gdsp_interface.cpp b/Source/Plugins/Plugin_DSP_LLE/Src/gdsp_interface.cpp new file mode 100644 index 0000000000..dbb6fca636 --- /dev/null +++ b/Source/Plugins/Plugin_DSP_LLE/Src/gdsp_interface.cpp @@ -0,0 +1,350 @@ +/*==================================================================== + + filename: gdsp_interface.h + project: GCemu + created: 2004-6-18 + mail: duddie@walla.com + + Copyright (c) 2005 Duddie & Tratax + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + ====================================================================*/ + +#include +#include "Globals.h" + +#include "gdsp_aram.h" +#include "gdsp_interpreter.h" +#include "gdsp_interface.h" + +#include "Tools.h" + +#ifndef NULL +#define NULL 0 +#endif + +#ifndef _WIN32 +#undef WITH_DSP_ON_THREAD +//TODO FIX +#endif + +const char* reg_names[] = +{ + // a0 + "COEF_A1_0", "COEF_A2_0", "COEF_A1_1", "COEF_A2_1", "COEF_A1_2", "COEF_A2_2", "COEF_A1_3", "COEF_A2_3", + "COEF_A1_4", "COEF_A2_4", "COEF_A1_5", "COEF_A2_5", "COEF_A1_6", "COEF_A2_6", "COEF_A1_7", "COEF_A2_7", + // b0 + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + // c0 + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, "DSCR", NULL, "DSBL", NULL, "DSPA", "DSMAH", "DSMAL", + // d0 + NULL, "SampleFormat", NULL, NULL, "ACSAH", "ACSAL", "ACEAH", "ACEAL", + "ACCAH", "ACCAL", "PRED_SCALE", "YN1", "YN2", "ARAM", "GAIN", NULL, + // e0 + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, "AMDM", + // f0 + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, "DMBH", "DMBL", "CMBH", "CMBL", +}; + + +void gdsp_dma(); + + +#ifdef _WIN32 +extern CRITICAL_SECTION g_CriticalSection; +#endif + +static volatile uint16 gdsp_mbox[2][2]; + +uint16 gdsp_ifx_regs[256]; + +void gdsp_ifx_init() +{ + int i; + + for (i = 0; i < 256; i++) + { + gdsp_ifx_regs[i] = 0; + } + + gdsp_mbox[0][0] = 0; + gdsp_mbox[0][1] = 0; + gdsp_mbox[1][0] = 0; + gdsp_mbox[1][1] = 0; +} + + +uint32 gdsp_mbox_peek(uint8 mbx) +{ + return((gdsp_mbox[mbx][0] << 16) | gdsp_mbox[mbx][1]); +} + + +void gdsp_mbox_write_h(uint8 mbx, uint16 val) +{ +#if WITH_DSP_ON_THREAD + EnterCriticalSection(&g_CriticalSection); +#endif + + gdsp_mbox[mbx][0] = val & 0x7fff; + +#if WITH_DSP_ON_THREAD + LeaveCriticalSection(&g_CriticalSection); +#endif +} + + +void gdsp_mbox_write_l(uint8 mbx, uint16 val) +{ +#if WITH_DSP_ON_THREAD + EnterCriticalSection(&g_CriticalSection); +#endif + + gdsp_mbox[mbx][1] = val; + gdsp_mbox[mbx][0] |= 0x8000; + +#if WITH_DSP_ON_THREAD + LeaveCriticalSection(&g_CriticalSection); +#endif + + if (mbx == GDSP_MBOX_DSP) + { + DebugLog("- Write DSP Mail: 0x%08x (pc=0x%04x)\n", gdsp_mbox_peek(GDSP_MBOX_DSP), g_dsp.err_pc); + } +} + + +uint16 gdsp_mbox_read_h(uint8 mbx) +{ + return(gdsp_mbox[mbx][0]); +} + + +uint16 gdsp_mbox_read_l(uint8 mbx) +{ + uint16 val; +#if WITH_DSP_ON_THREAD + EnterCriticalSection(&g_CriticalSection); +#endif + + val = gdsp_mbox[mbx][1]; + gdsp_mbox[mbx][0] &= ~0x8000; + +#if WITH_DSP_ON_THREAD + LeaveCriticalSection(&g_CriticalSection); +#endif + return(val); +} + + +void gdsp_ifx_write(uint16 addr, uint16 val) +{ + addr &= 0xff; + + switch (addr & 0xff) + { + case 0xfb: // DIRQ + + if (val & 0x1) + { + g_dsp.irq_request(); + } + + break; + + case 0xfc: // DMBH + gdsp_mbox_write_h(GDSP_MBOX_DSP, val); + break; + + case 0xfd: // DMBL + gdsp_mbox_write_l(GDSP_MBOX_DSP, val); + break; + + case 0xcb: // DSBL + gdsp_ifx_regs[addr] = val; + gdsp_dma(); + gdsp_ifx_regs[DSP_DSCR] &= ~0x0004; + break; + + case 0xcd: + case 0xce: + case 0xcf: + case 0xc9: + gdsp_ifx_regs[addr] = val; + break; + + default: +/* if ((addr & 0xff) >= 0xa0 && reg_names[addr - 0xa0]) + DebugLog("%04x MW %s (%04x)\n", g_dsp.pc, reg_names[addr - 0xa0], val); + else + DebugLog("%04x MW %04x (%04x)\n", g_dsp.pc, addr, val);*/ + gdsp_ifx_regs[addr] = val; + break; + } +} + + +uint16 gdsp_ifx_read(uint16 addr) +{ + uint16 val; + + addr &= 0xff; + + switch (addr & 0xff) + { + case 0xfc: // DMBH + val = gdsp_mbox_read_h(GDSP_MBOX_DSP); + break; + + case 0xfe: // CMBH + val = gdsp_mbox_read_h(GDSP_MBOX_CPU); + break; + + case 0xff: // CMBL + val = gdsp_mbox_read_l(GDSP_MBOX_CPU); + break; + + case 0xc9: + val = gdsp_ifx_regs[addr]; + break; + + case 0xdd: + val = dsp_read_aram(); + break; + + default: + val = gdsp_ifx_regs[addr]; +/* if ((addr & 0xff) >= 0xc0 && reg_names[addr & 0x3f]) + printf("%04x MR %s (%04x)\n", g_dsp.pc, reg_names[addr & 0x3f], val); + else + printf("%04x MR %04x (%04x)\n", g_dsp.pc, addr, val);*/ + break; + } + + return(val); +} + + +void gdsp_idma_in(uint16 dsp_addr, uint32 addr, uint32 size) +{ +#if DUMP_DSP_IMEM + DumpDSPCode(addr, size); +#endif + + uint8* dst = ((uint8*)g_dsp.iram); + + for (uint32 i = 0; i < size; i += 2) + { + *(uint16*)&dst[dsp_addr + i] = *(uint16*)&g_dsp.cpu_ram[(addr + i) & 0x0fffffff]; + } + + g_dsp.iram_crc = GenerateCRC(g_dsp.cpu_ram + (addr & 0x0fffffff), size); + DebugLog("*** Copy new UCode from 0x%08x to 0x%04x (crc: %8x)\n", addr, dsp_addr, g_dsp.iram_crc); +} + + +void gdsp_idma_out(uint16 dsp_addr, uint32 addr, uint32 size) +{ + ErrorLog("*** idma_out IRAM_DSP (0x%04x) -> RAM (0x%08x) : size (0x%08x)\n", dsp_addr / 2, addr, size); +} + + +void gdsp_ddma_in(uint16 dsp_addr, uint32 addr, uint32 size) +{ + if ((addr & 0x7FFFFFFF) > 0x01FFFFFF) + { + ErrorLog("*** ddma_in read from invalid addr (0x%08x)\n", addr); + return; + } + + uint8* dst = ((uint8*)g_dsp.dram); + + for (uint32 i = 0; i < size; i += 2) + { + *(uint16*)&dst[dsp_addr + i] = *(uint16*)&g_dsp.cpu_ram[(addr + i) & 0x7FFFFFFF]; + } + + DebugLog("*** ddma_in RAM (0x%08x) -> DRAM_DSP (0x%04x) : size (0x%08x)\n", addr, dsp_addr / 2, size); +} + + +void gdsp_ddma_out(uint16 dsp_addr, uint32 addr, uint32 size) +{ + if ((addr & 0x7FFFFFFF) > 0x01FFFFFF) + { + ErrorLog("*** gdsp_ddma_out to invalid addr (0x%08x)\n", addr); + return; + } + + uint8* src = ((uint8*)g_dsp.dram); + + for (uint32 i = 0; i < size; i += 2) + { + *(uint16*)&g_dsp.cpu_ram[(addr + i) & 0x7FFFFFFF] = *(uint16*)&src[dsp_addr + i]; + } + + DebugLog("*** ddma_out DRAM_DSP (0x%04x) -> RAM (0x%08x) : size (0x%08x)\n", dsp_addr / 2, addr, size); +} + + +#define DSP_CR_IMEM (2) +#define DSP_CR_DMEM (0) +#define DSP_CR_TO_CPU (1) +#define DSP_CR_FROM_CPU (0) + +void gdsp_dma() +{ + uint16 ctl; + uint32 addr; + uint16 dsp_addr; + uint16 len; + + addr = (gdsp_ifx_regs[DSP_DSMAH] << 16) | gdsp_ifx_regs[DSP_DSMAL]; + ctl = gdsp_ifx_regs[DSP_DSCR]; + dsp_addr = gdsp_ifx_regs[DSP_DSPA] * 2; + len = gdsp_ifx_regs[DSP_DSBL]; + + if ((ctl > 3) || (len > 0x4000)) + { + ErrorLog("DMA ERROR pc: %04x ctl: %04x addr: %08x da: %04x size: %04x\n", g_dsp.pc, ctl, addr, dsp_addr, len); + exit(0); + } + + switch (ctl & 0x3) + { + case (DSP_CR_DMEM | DSP_CR_TO_CPU): + gdsp_ddma_out(dsp_addr, addr, len); + break; + + case (DSP_CR_DMEM | DSP_CR_FROM_CPU): + gdsp_ddma_in(dsp_addr, addr, len); + break; + + case (DSP_CR_IMEM | DSP_CR_TO_CPU): + gdsp_idma_out(dsp_addr, addr, len); + break; + + case (DSP_CR_IMEM | DSP_CR_FROM_CPU): + gdsp_idma_in(dsp_addr, addr, len); + break; + } +} + + diff --git a/Source/Plugins/Plugin_DSP_LLE/Src/gdsp_interface.h b/Source/Plugins/Plugin_DSP_LLE/Src/gdsp_interface.h new file mode 100644 index 0000000000..8d4ab9f1b5 --- /dev/null +++ b/Source/Plugins/Plugin_DSP_LLE/Src/gdsp_interface.h @@ -0,0 +1,67 @@ +/*==================================================================== + + filename: gdsp_interface.h + project: GCemu + created: 2004-6-18 + mail: duddie@walla.com + + Copyright (c) 2005 Duddie & Tratax + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + ====================================================================*/ +#ifndef _GDSP_INTERFACE_H +#define _GDSP_INTERFACE_H + +#include "Globals.h" + +#define GDSP_MBOX_CPU 0 +#define GDSP_MBOX_DSP 1 + +#define DSP_DSMAH 0xce +#define DSP_DSMAL 0xcf +#define DSP_DSCR 0xc9 +#define DSP_DSPA 0xcd +#define DSP_DSBL 0xcb +#define DSP_ACSAH 0xd4 +#define DSP_ACSAL 0xd5 +#define DSP_ACEAH 0xd6 +#define DSP_ACEAL 0xd7 +#define DSP_ACCAH 0xd8 +#define DSP_ACCAL 0xd9 + +#define DSP_COEF_A1_0 0xa0 +#define DSP_FORMAT 0xd1 +#define DSP_PRED_SCALE 0xda +#define DSP_YN1 0xdb +#define DSP_YN2 0xdc +#define DSP_ARAM 0xdd +#define DSP_GAIN 0xde + +extern uint16 gdsp_ifx_regs[256]; + +uint32 gdsp_mbox_peek(uint8 mbx); +void gdsp_mbox_write_h(uint8 mbx, uint16 val); +void gdsp_mbox_write_l(uint8 mbx, uint16 val); +uint16 gdsp_mbox_read_h(uint8 mbx); +uint16 gdsp_mbox_read_l(uint8 mbx); + +void gdsp_ifx_init(); + +void gdsp_idma_in(uint16 dsp_addr, uint32 addr, uint32 size); + + +#endif + diff --git a/Source/Plugins/Plugin_DSP_LLE/Src/gdsp_interpreter.cpp b/Source/Plugins/Plugin_DSP_LLE/Src/gdsp_interpreter.cpp new file mode 100644 index 0000000000..3725dafa80 --- /dev/null +++ b/Source/Plugins/Plugin_DSP_LLE/Src/gdsp_interpreter.cpp @@ -0,0 +1,344 @@ +/*==================================================================== + + filename: gdsp_interpreter.cpp + project: GCemu + created: 2004-6-18 + mail: duddie@walla.com + + Copyright (c) 2005 Duddie & Tratax + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + ====================================================================*/ + +#include +#include +#include "gdsp_opcodes.h" +#include "gdsp_interpreter.h" +#include "gdsp_memory.h" +#include "gdsp_registers.h" +#include "gdsp_interface.h" +#include "Tools.h" + +//------------------------------------------------------------------------------- + +SDSP g_dsp; + +uint16 SDSP::r[32]; +uint16 SDSP::pc = 0; +uint16 SDSP::err_pc = 0; +uint16* SDSP::iram = 0; +uint16* SDSP::dram = 0; +uint16* SDSP::irom = 0; +uint16* SDSP::drom = 0; +uint16* SDSP::coef = 0; +uint8* SDSP::cpu_ram = 0; +uint16 SDSP::cr = 0; +uint8 SDSP::reg_stack_ptr[4]; +// lets make stack depth to 32 for now +uint16 SDSP::reg_stack[4][DSP_STACK_DEPTH]; +void (*SDSP::irq_request)() = NULL; +bool SDSP::exception_in_progress_hack = false; + +// for debugger only +uint32 SDSP::iram_crc = 0; +uint64 SDSP::step_counter = 0; + + +//------------------------------------------------------------------------------- + +static bool CR_HALT = true; +static bool CR_EXTERNAL_INT = false; + +void UpdateCachedCR() +{ + CR_HALT = (g_dsp.cr & 0x4) != 0; + CR_EXTERNAL_INT = (g_dsp.cr & 0x02) != 0; +} + + + +//------------------------------------------------------------------------------- +void (*dsp_op[])(uint16 opc) = +{ + dsp_op0, dsp_op1, dsp_op2, dsp_op3, + dsp_op4, dsp_op5, dsp_op6, dsp_op7, + dsp_op8, dsp_op9, dsp_opab, dsp_opab, + dsp_opcd, dsp_opcd, dsp_ope, dsp_opf, +}; + +void dbg_error(char* err_msg) +{ + return; +} + + +void gdsp_init() +{ + g_dsp.irom = (uint16*)malloc(DSP_IROM_SIZE * sizeof(uint16)); + g_dsp.iram = (uint16*)malloc(DSP_IRAM_SIZE * sizeof(uint16)); + g_dsp.drom = (uint16*)malloc(DSP_DROM_SIZE * sizeof(uint16)); + g_dsp.dram = (uint16*)malloc(DSP_DRAM_SIZE * sizeof(uint16)); + g_dsp.coef = (uint16*)malloc(DSP_COEF_SIZE * sizeof(uint16)); + + for (int i = 0; i < DSP_IRAM_SIZE; i++) + { + g_dsp.iram[i] = 0x0021; // HALT opcode + } + + for (int i = 0; i < DSP_DRAM_SIZE; i++) + { + g_dsp.dram[i] = 0x0021; // HALT opcode + } + + for (int i = 0; i < 32; i++) + { + g_dsp.r[i] = 0; + } + + for (int i = 0; i < 4; i++) + { + g_dsp.reg_stack_ptr[i] = 0; + + for (int j = 0; j < DSP_STACK_DEPTH; j++) + { + g_dsp.reg_stack[i][j] = 0; + } + } + + // copied from a real console after the custom UCode has been loaded + g_dsp.r[0x08] = 0xffff; + g_dsp.r[0x09] = 0xffff; + g_dsp.r[0x0a] = 0xffff; + g_dsp.r[0x0b] = 0xffff; + + g_dsp.cr = 0x804; + gdsp_ifx_init(); + + UpdateCachedCR(); +} + + +void gdsp_reset() +{ +// _dbg_assert_msg_(0, "gdsp_reset()"); + _dbg_assert_msg_(!g_dsp.exception_in_progress_hack, "assert while exception"); + g_dsp.pc = DSP_RESET_VECTOR; + g_dsp.exception_in_progress_hack = false; +} + + +void gdsp_generate_exception(uint8 level) +{ + _dbg_assert_msg_(!g_dsp.exception_in_progress_hack, "assert while exception"); + + dsp_reg_store_stack(DSP_STACK_C, g_dsp.pc); + dsp_reg_store_stack(DSP_STACK_D, g_dsp.r[R_SR]); + + g_dsp.pc = level * 2; + + g_dsp.exception_in_progress_hack = true; +} + + +uint32 gdsp_exception_ready = 0; + +void gdsp_exception(uint8 level) +{ + switch (level & 0x7) + { + case 0x5: // ACCA > ACCH exception + + if (g_dsp.r[R_SR] & 0x200) + { + gdsp_exception_ready = level; + } + + break; + + default: + break; + } +} + + +bool gdsp_load_rom(char* fname) +{ + FILE* pFile = fopen(fname, "rb"); + + if (pFile) + { + fread(g_dsp.irom, 1, DSP_IRAM_SIZE, pFile); + fclose(pFile); + return(true); + } + + return(false); +} + + +bool gdsp_load_coef(char* fname) +{ + FILE* pFile = fopen(fname, "rb"); + + if (pFile) + { + fread(g_dsp.coef, 1, DSP_COEF_SIZE, pFile); + fclose(pFile); + return(true); + } + + return(false); +} + + +void gdsp_write_cr(uint16 val) +{ + // reset + if (val & 0x0001) + { + gdsp_reset(); + } + + val &= ~0x0001; + + // update cr + g_dsp.cr = val; + + UpdateCachedCR(); +} + + +uint16 gdsp_read_cr() +{ + if (g_dsp.pc & 0x8000) + { + g_dsp.cr |= 0x800; + } + else + { + g_dsp.cr &= ~0x800; + } + + UpdateCachedCR(); + + return(g_dsp.cr); +} + + +// special loop step.. because exception in loop or loopi fails +// dunno how we have to fix it +// atm we execute this instructions directly inside the loop command +// so it cant be interrupted by an exception +void gdsp_loop_step() +{ + g_dsp.err_pc = g_dsp.pc; + uint16 opc = dsp_fetch_code(); + dsp_op[opc >> 12](opc); +} + + +void gdsp_step() +{ + g_dsp.step_counter++; + + g_dsp.err_pc = g_dsp.pc; + uint16 opc = dsp_fetch_code(); + dsp_op[opc >> 12](opc); + + uint16& rLoopCounter = g_dsp.r[DSP_REG_ST0 + 3]; + + if (rLoopCounter > 0) + { + const uint16& rCallAddress = g_dsp.r[DSP_REG_ST0 + 0]; + const uint16& rLoopAddress = g_dsp.r[DSP_REG_ST0 + 2]; + + if (g_dsp.pc == (rLoopAddress + 1)) + { + rLoopCounter--; + + if (rLoopCounter > 0) + { + g_dsp.pc = rCallAddress; + } + else + { + // end of loop + dsp_reg_load_stack(0); + dsp_reg_load_stack(2); + dsp_reg_load_stack(3); + } + } + } + + // check if there is an external interrupt + if (CR_EXTERNAL_INT) + { + if (dsp_SR_is_flag_set(FLAG_ENABLE_INTERUPT) && (g_dsp.exception_in_progress_hack == false)) + { + gdsp_generate_exception(7); + g_dsp.cr &= ~0x0002; + UpdateCachedCR(); + } + + // level 7 is the interrupt exception + gdsp_exception_ready = 7; + } + +} + + +bool gdsp_running; +extern volatile uint32 dsp_running; + +bool gdsp_run() +{ + gdsp_running = true; + + while (!CR_HALT) + { + gdsp_step(); + } + + gdsp_running = false; + return(true); +} + + +bool gdsp_runx(uint16 cnt) +{ + gdsp_running = true; + + while (!(g_dsp.cr & 0x4) && gdsp_running) + { + gdsp_step(); + cnt--; + + if (cnt == 0) + { + break; + } + } + + gdsp_running = false; + return(true); +} + + +void gdsp_stop() +{ + gdsp_running = false; +} + diff --git a/Source/Plugins/Plugin_DSP_LLE/Src/gdsp_interpreter.h b/Source/Plugins/Plugin_DSP_LLE/Src/gdsp_interpreter.h new file mode 100644 index 0000000000..22af0bc81d --- /dev/null +++ b/Source/Plugins/Plugin_DSP_LLE/Src/gdsp_interpreter.h @@ -0,0 +1,95 @@ +/*==================================================================== + + filename: gdsp_interpreter.h + project: GCemu + created: 2004-6-18 + mail: duddie@walla.com + + Copyright (c) 2005 Duddie & Tratax + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + ====================================================================*/ + +#ifndef _GDSP_INTERPRETER_H +#define _GDSP_INTERPRETER_H + +#include "Globals.h" + +#define DSP_IRAM_SIZE (0x1000) +#define DSP_IRAM_MASK (0x0fff) +#define DSP_IROM_SIZE (0x1000) +#define DSP_IROM_MASK (0x0fff) +#define DSP_DRAM_SIZE (0x1000) +#define DSP_DRAM_MASK (0x0fff) +#define DSP_DROM_SIZE (0x1000) +#define DSP_DROM_MASK (0x0fff) +#define DSP_COEF_SIZE (0x1000) +#define DSP_COEF_MASK (0x0fff) + +#define DSP_RESET_VECTOR (0x8000) + +#define DSP_STACK_DEPTH 0x20 +#define DSP_STACK_MASK 0x1f + +struct SDSP +{ + static uint16 r[32]; + static uint16 pc; + static uint16 err_pc; + static uint16* iram; + static uint16* dram; + static uint16* irom; + static uint16* drom; + static uint16* coef; + static uint8* cpu_ram; + static uint16 cr; + static uint8 reg_stack_ptr[4]; + // lets make stack depth to 32 for now + static uint16 reg_stack[4][DSP_STACK_DEPTH]; + static void (* irq_request)(void); + + // for debugger only + static uint32 iram_crc; + static uint64 step_counter; + static bool exception_in_progress_hack; +}; + +extern SDSP g_dsp; + + +void gdsp_init(void); +void gdsp_reset(void); +bool gdsp_load_rom(char* fname); +bool gdsp_load_coef(char* fname); + + +// steps through DSP code, returns false if error occured +void gdsp_step(void); +void gdsp_loop_step(); +bool gdsp_run(void); +bool gdsp_runx(uint16 cnt); +void gdsp_stop(void); + +void gdsp_write_cr(uint16 val); +uint16 gdsp_read_cr(void); + +uint16* gdsp_get_iram(void); +uint16* gdsp_get_irom(void); +uint16* gdsp_get_dram(void); +uint16* gdsp_get_drom(void); + + +#endif diff --git a/Source/Plugins/Plugin_DSP_LLE/Src/gdsp_memory.cpp b/Source/Plugins/Plugin_DSP_LLE/Src/gdsp_memory.cpp new file mode 100644 index 0000000000..c6fcf002b6 --- /dev/null +++ b/Source/Plugins/Plugin_DSP_LLE/Src/gdsp_memory.cpp @@ -0,0 +1,156 @@ +/*==================================================================== + + filename: gdsp_memory.cpp + project: GCemu + created: 2004-6-18 + mail: duddie@walla.com + + Copyright (c) 2005 Duddie & Tratax + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + ====================================================================*/ + +#include +#include "Globals.h" +#include "gdsp_interpreter.h" +#include "gdsp_memory.h" +#include "gdsp_ifx.h" + +uint16 dsp_swap16(uint16 x) +{ + return((x >> 8) | (x << 8)); +} + + +uint16* gdsp_get_iram(void) +{ + return(g_dsp.iram); +} + + +uint16* gdsp_get_irom(void) +{ + return(g_dsp.irom); +} + + +uint16* gdsp_get_dram(void) +{ + return(g_dsp.dram); +} + + +uint16* gdsp_get_drom(void) +{ + return(g_dsp.drom); +} + + +uint16 dsp_imem_read(uint16 addr) +{ + uint16 opc; + + if (g_dsp.pc & 0x8000) + { + opc = g_dsp.irom[addr & DSP_IROM_MASK]; + } + else + { + opc = g_dsp.iram[addr & DSP_IRAM_MASK]; + } + + return(dsp_swap16(opc)); +} + + +uint16 dsp_dmem_read(uint16 addr) +{ + uint16 val; + + switch (addr >> 12) + { + case 0x1: // 1xxx COEF + val = g_dsp.coef[addr & DSP_DROM_MASK]; + val = dsp_swap16(val); + break; + + case 0x8: // 8xxx DROM + DebugLog("someone reads from ROM\n"); + val = g_dsp.drom[addr & DSP_DROM_MASK]; + val = dsp_swap16(val); + break; + + case 0xf: // Fxxx HW regs + val = gdsp_ifx_read(addr); + break; + + case 0x0: // 0xxx DRAM + val = g_dsp.dram[addr & DSP_DRAM_MASK]; + val = dsp_swap16(val); + break; + + default: // error +// ErrorLog("%04x DSP ERROR: Read from UNKNOWN (%04x) memory\n", g_dsp.pc, addr); + val = 0; + break; + } + + return(val); +} + + +bool dsp_dmem_write(uint16 addr, uint16 val) +{ + switch (addr >> 12) + { + case 0x8: // 8xxx DROM + DebugLog("someone writes to ROM\n"); + /* val = dsp_swap16(val); + g_dsp.drom[addr & DSP_DROM_MASK] = val;*/ + break; + + case 0xf: // Fxxx HW regs + gdsp_ifx_write(addr, val); + break; + + case 0x0: // 0xxx DRAM + val = dsp_swap16(val); + g_dsp.dram[addr & DSP_DRAM_MASK] = val; + break; + + default: // error + DebugLog("%04x DSP ERROR: Write to UNKNOWN (%04x) memory\n", g_dsp.pc, addr); + break; + } + + return(true); +} + + +uint16 dsp_fetch_code(void) +{ + uint16 opc = dsp_imem_read(g_dsp.pc); + g_dsp.pc++; + return(opc); +} + + +uint16 dsp_peek_code(void) +{ + return(dsp_imem_read(g_dsp.pc)); +} + + diff --git a/Source/Plugins/Plugin_DSP_LLE/Src/gdsp_memory.h b/Source/Plugins/Plugin_DSP_LLE/Src/gdsp_memory.h new file mode 100644 index 0000000000..a80321ee4d --- /dev/null +++ b/Source/Plugins/Plugin_DSP_LLE/Src/gdsp_memory.h @@ -0,0 +1,37 @@ +/*==================================================================== + + filename: gdsp_memory.h + project: GCemu + created: 2004-6-18 + mail: duddie@walla.com + + Copyright (c) 2005 Duddie & Tratax + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + ====================================================================*/ +#ifndef _GDSP_MEMORY_H +#define _GDSP_MEMORY_H + +#include "Globals.h" + +uint16 dsp_fetch_code(void); +uint16 dsp_peek_code(void); +uint16 dsp_imem_read(uint16 addr); +bool dsp_dmem_write(uint16 addr, uint16 val); +uint16 dsp_dmem_read(uint16 addr); + + +#endif diff --git a/Source/Plugins/Plugin_DSP_LLE/Src/gdsp_opcodes.cpp b/Source/Plugins/Plugin_DSP_LLE/Src/gdsp_opcodes.cpp new file mode 100644 index 0000000000..8b2b4367d0 --- /dev/null +++ b/Source/Plugins/Plugin_DSP_LLE/Src/gdsp_opcodes.cpp @@ -0,0 +1,2181 @@ +// Change Log + +// fixed dsp_opc_mulx (regarding DSP 0.0.4.pdf) +// fixed dsp_opc_mulxmv (regarding DSP 0.0.4.pdf) +// fixed dsp_opc_mulxmvz (regarding DSP 0.0.4.pdf) +// dsp_opc_shifti: removed strange " >> 9" +// added masking for SR_COMPARE_FLAGS +// added "UNKNOWN_CW" but without a function (yet? :) +// added missing compare type to MISSING_COMPARES_JX ... but i dunno what it does + +// added "MULXMV" to another function table + +/*==================================================================== + + filename: gdsp_opcodes.cpp + project: GCemu + created: 2004-6-18 + mail: duddie@walla.com + + Copyright (c) 2005 Duddie & Tratax + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + ====================================================================*/ + +#include +#include "Globals.h" +#include "gdsp_opcodes.h" +#include "gdsp_memory.h" +#include "gdsp_interpreter.h" +#include "gdsp_registers.h" +#include "gdsp_opcodes_helper.h" +#include "gdsp_ext_op.h" + +#define SR_CMP_MASK 0x3f +#define DSP_REG_MASK 0x1f + + +void Update_SR_Register(sint64 _Value) +{ + g_dsp.r[R_SR] &= ~SR_CMP_MASK; + + if (_Value < 0) + { + g_dsp.r[R_SR] |= 0x8; + } + + if (_Value == 0) + { + g_dsp.r[R_SR] |= 0x4; + } + + // logic + if ((_Value >> 62) == 0) + { + g_dsp.r[R_SR] |= 0x20; + } +} + + +void Update_SR_Register(sint16 _Value) +{ + g_dsp.r[R_SR] &= ~SR_CMP_MASK; + + if (_Value < 0) + { + g_dsp.r[R_SR] |= 0x8; + } + + if (_Value == 0) + { + g_dsp.r[R_SR] |= 0x4; + } + + // logic + if ((_Value >> 14) == 0) + { + g_dsp.r[R_SR] |= 0x20; + } +} + + +sint8 GetMultiplyModifier() +{ + if (g_dsp.r[R_SR] & (1 << 13)) + { + return(1); + } + + return(2); +} + + +bool CheckCondition(uint8 _Condition) +{ + bool taken = false; + + switch (_Condition & 0xf) + { + case 0x0: + + if ((!(g_dsp.r[R_SR] & 0x02)) && (!(g_dsp.r[R_SR] & 0x08))) + { + taken = true; + } + + break; + + case 0x3: + + if ((g_dsp.r[R_SR] & 0x02) || (g_dsp.r[R_SR] & 0x04) || (g_dsp.r[R_SR] & 0x08)) + { + taken = true; + } + + break; + + // old from duddie + case 0x1: // seems okay + + if ((!(g_dsp.r[R_SR] & 0x02)) && (g_dsp.r[R_SR] & 0x08)) + { + taken = true; + } + + break; + + case 0x2: + + if (!(g_dsp.r[R_SR] & 0x08)) + { + taken = true; + } + + break; + + case 0x4: + + if (!(g_dsp.r[R_SR] & 0x04)) + { + taken = true; + } + + break; + + case 0x5: + + if (g_dsp.r[R_SR] & 0x04) + { + taken = true; + } + + break; + + case 0xc: + + if (!(g_dsp.r[R_SR] & 0x40)) + { + taken = true; + } + + break; + + case 0xd: + + if (g_dsp.r[R_SR] & 0x40) + { + taken = true; + } + + break; + + case 0xf: + taken = true; + break; + + default: + // DebugLog("Unknown condition check: 0x%04x\n", _Condition & 0xf); + break; + } + + return(taken); +} + + +// ======================================================================= + +void dsp_op_unknown(uint16 opc) +{ + _dbg_assert_msg_(!g_dsp.exception_in_progress_hack, "assert while exception"); + ErrorLog("dsp_op_unknown somewhere"); + g_dsp.pc = g_dsp.err_pc; +} + + +void dsp_opc_call(uint16 opc) +{ + uint16 dest = dsp_fetch_code(); + + if (CheckCondition(opc & 0xf)) + { + dsp_reg_store_stack(DSP_STACK_C, g_dsp.pc); + g_dsp.pc = dest; + } +} + + +void dsp_opc_ifcc(uint16 opc) +{ + if (!CheckCondition(opc & 0xf)) + { + dsp_fetch_code(); // skip the next opcode + } +} + + +void dsp_opc_jcc(uint16 opc) +{ + uint16 dest = dsp_fetch_code(); + + if (CheckCondition(opc & 0xf)) + { + g_dsp.pc = dest; + } +} + + +void dsp_opc_jmpa(uint16 opc) +{ + uint8 reg; + uint16 addr; + + if ((opc & 0xf) != 0xf) + { + ErrorLog("dsp_opc_jmpa"); + } + + reg = (opc >> 5) & 0x7; + addr = dsp_op_read_reg(reg); + + if (opc & 0x0010) + { + // CALLA + dsp_reg_store_stack(DSP_STACK_C, g_dsp.pc); + } + + g_dsp.pc = addr; +} + + +// NEW (added condition check) +void dsp_opc_ret(uint16 opc) +{ + if (CheckCondition(opc & 0xf)) + { + g_dsp.pc = dsp_reg_load_stack(DSP_STACK_C); + } +} + + +void dsp_opc_rti(uint16 opc) +{ + if ((opc & 0xf) != 0xf) + { + ErrorLog("dsp_opc_rti"); + } + + g_dsp.r[R_SR] = dsp_reg_load_stack(DSP_STACK_D); + g_dsp.pc = dsp_reg_load_stack(DSP_STACK_C); + + g_dsp.exception_in_progress_hack = false; +} + + +void dsp_opc_halt(uint16 opc) +{ + g_dsp.cr |= 0x4; + g_dsp.pc = g_dsp.err_pc; +} + + +void dsp_opc_loop(uint16 opc) +{ + uint16 reg = opc & 0x1f; + uint16 cnt = g_dsp.r[reg]; + uint16 loop_pc = g_dsp.pc; + + while (cnt--) + { + gdsp_loop_step(); + g_dsp.pc = loop_pc; + } + + g_dsp.pc = loop_pc + 1; +} + + +void dsp_opc_loopi(uint16 opc) +{ + uint16 cnt = opc & 0xff; + uint16 loop_pc = g_dsp.pc; + + while (cnt--) + { + gdsp_loop_step(); + g_dsp.pc = loop_pc; + } + + g_dsp.pc = loop_pc + 1; +} + + +void dsp_opc_bloop(uint16 opc) +{ + uint16 reg = opc & 0x1f; + uint16 cnt = g_dsp.r[reg]; + uint16 loop_pc = dsp_fetch_code(); + + if (cnt) + { + dsp_reg_store_stack(0, g_dsp.pc); + dsp_reg_store_stack(2, loop_pc); + dsp_reg_store_stack(3, cnt); + } + else + { + g_dsp.pc = loop_pc + 1; + } +} + + +void dsp_opc_bloopi(uint16 opc) +{ + uint16 cnt = opc & 0xff; + uint16 loop_pc = dsp_fetch_code(); + + if (cnt) + { + dsp_reg_store_stack(0, g_dsp.pc); + dsp_reg_store_stack(2, loop_pc); + dsp_reg_store_stack(3, cnt); + } + else + { + g_dsp.pc = loop_pc + 1; + } +} + + +//------------------------------------------------------------- + + +void dsp_opc_mrr(uint16 opc) +{ + uint8 sreg = opc & 0x1f; + uint8 dreg = (opc >> 5) & 0x1f; + + uint16 val = dsp_op_read_reg(sreg); + dsp_op_write_reg(dreg, val); +} + + +void dsp_opc_lrr(uint16 opc) +{ + uint8 sreg = (opc >> 5) & 0x3; + uint8 dreg = opc & 0x1f; + + uint16 val = dsp_dmem_read(g_dsp.r[sreg]); + dsp_op_write_reg(dreg, val); + + // post processing of source reg + switch ((opc >> 7) & 0x3) + { + case 0x0: // LRR + break; + + case 0x1: // LRRD + g_dsp.r[sreg]--; + break; + + case 0x2: // LRRI + g_dsp.r[sreg]++; + break; + + case 0x3: + g_dsp.r[sreg] += g_dsp.r[sreg + 4]; + break; + } +} + + +void dsp_opc_srr(uint16 opc) +{ + uint8 sreg = (opc >> 5) & 0x3; + uint8 dreg = opc & 0x1f; + + uint16 val = dsp_op_read_reg(dreg); + dsp_dmem_write(g_dsp.r[sreg], val); + + // post processing of source reg + switch ((opc >> 7) & 0x3) + { + case 0x0: // SRR + break; + + case 0x1: // SRRD + g_dsp.r[sreg]--; + break; + + case 0x2: // SRRI + g_dsp.r[sreg]++; + break; + + case 0x3: // SRRX + g_dsp.r[sreg] += g_dsp.r[sreg + 4]; + break; + } +} + + +void dsp_opc_ilrr(uint16 opc) +{ + uint16 reg = opc & 0x3; + uint16 dreg = 0x1e + ((opc >> 8) & 1); + + // always to acc0 ? + g_dsp.r[dreg] = dsp_imem_read(g_dsp.r[reg]); + + switch ((opc >> 2) & 0x3) + { + case 0x0: // no change + break; + + case 0x1: // post decrement + g_dsp.r[reg]--; + break; + + case 0x2: // post increment + g_dsp.r[reg]++; + break; + + default: + ErrorLog("dsp_opc_ilrr"); + } +} + + +void dsp_opc_lri(uint16 opc) +{ + uint8 reg = opc & DSP_REG_MASK; + uint16 imm = dsp_fetch_code(); + dsp_op_write_reg(reg, imm); +} + + +void dsp_opc_lris(uint16 opc) +{ + uint8 reg = ((opc >> 8) & 0x7) + 0x18; + uint16 imm = (sint8)opc; + dsp_op_write_reg(reg, imm); +} + + +void dsp_opc_lr(uint16 opc) +{ + uint8 reg = opc & DSP_REG_MASK; + uint16 addr = dsp_fetch_code(); + uint16 val = dsp_dmem_read(addr); + dsp_op_write_reg(reg, val); +} + + +void dsp_opc_sr(uint16 opc) +{ + uint8 reg = opc & DSP_REG_MASK; + uint16 addr = dsp_fetch_code(); + uint16 val = dsp_op_read_reg(reg); + dsp_dmem_write(addr, val); +} + + +void dsp_opc_si(uint16 opc) +{ + uint16 addr = (sint8)opc; + uint16 imm = dsp_fetch_code(); + dsp_dmem_write(addr, imm); +} + + +void dsp_opc_tstaxh(uint16 opc) +{ + uint8 reg = (opc >> 8) & 0x1; + sint16 val = dsp_get_ax_h(reg); + + Update_SR_Register(val); +} + + +void dsp_opc_clr(uint16 opc) +{ + uint8 reg = (opc >> 11) & 0x1; + + dsp_set_long_acc(reg, 0); + + Update_SR_Register((sint64)0); +} + + +void dsp_opc_clrp(uint16 opc) +{ + g_dsp.r[0x14] = 0x0000; + g_dsp.r[0x15] = 0xfff0; + g_dsp.r[0x16] = 0x00ff; + g_dsp.r[0x17] = 0x0010; +} + + +// NEW +void dsp_opc_mulc(uint16 opc) +{ + ErrorLog("dsp_opc_mulc ni"); +} + + +// NEW +void dsp_opc_mulcmvz(uint16 opc) +{ + ErrorLog("dsp_opc_mulcmvz ni"); +} + + +// NEW +void dsp_opc_mulcmv(uint16 opc) +{ + ErrorLog("dsp_opc_mulcmv ni"); +} + + +void dsp_opc_cmpar(uint16 opc) +{ + uint8 rreg = ((opc >> 12) & 0x1) + 0x1a; + uint8 areg = (opc >> 11) & 0x1; + + // we compare + sint64 rr = (sint16)g_dsp.r[rreg]; + rr <<= 16; + + sint64 ar = dsp_get_long_acc(areg); + + Update_SR_Register(ar - rr); +} + + +void dsp_opc_cmp(uint16 opc) +{ + sint64 acc0 = dsp_get_long_acc(0); + sint64 acc1 = dsp_get_long_acc(1); + + Update_SR_Register(acc0 - acc1); +} + + +void dsp_opc_tsta(uint16 opc) +{ + uint8 reg = (opc >> 11) & 0x1; + sint64 acc = dsp_get_long_acc(reg); + + Update_SR_Register(acc); +} + + +// NEW +void dsp_opc_addaxl(uint16 opc) +{ + uint8 sreg = (opc >> 9) & 0x1; + uint8 dreg = (opc >> 8) & 0x1; + + sint64 acc = dsp_get_long_acc(dreg); + sint64 acx = dsp_get_ax_l(sreg); + + acc += acx; + + dsp_set_long_acc(dreg, acc); + + Update_SR_Register(acc); +} + + +// NEW +void dsp_opc_addarn(uint16 opc) +{ + uint8 dreg = opc & 0x3; + uint8 sreg = (opc >> 2) & 0x3; + + g_dsp.r[dreg] += (sint16)g_dsp.r[0x04 + sreg]; +} + + +// NEW +void dsp_opc_mulcac(uint16 opc) +{ + sint64 TempProd = dsp_get_long_prod(); + + // update prod + uint8 sreg = (opc >> 12) & 0x1; + sint64 Prod = (sint64)dsp_get_acc_m(sreg) * (sint64)dsp_get_acc_h(sreg) * GetMultiplyModifier(); + dsp_set_long_prod(Prod); + + // update acc + uint8 rreg = (opc >> 8) & 0x1; + dsp_set_long_acc(rreg, TempProd); +} + + +// NEW +void dsp_opc_movr(uint16 opc) +{ + uint8 areg = (opc >> 8) & 0x1; + uint8 sreg = ((opc >> 9) & 0x3) + 0x18; + + sint64 acc = (sint16)g_dsp.r[sreg]; + acc <<= 16; + acc &= ~0xffff; + + dsp_set_long_acc(areg, acc); + + Update_SR_Register(acc); +} + + +void dsp_opc_movax(uint16 opc) +{ + uint8 sreg = (opc >> 9) & 0x1; + uint8 dreg = (opc >> 8) & 0x1; + + g_dsp.r[0x1c + dreg] = g_dsp.r[0x18 + sreg]; + g_dsp.r[0x1e + dreg] = g_dsp.r[0x1a + sreg]; + + if ((sint16)g_dsp.r[0x1a + sreg] < 0) + { + g_dsp.r[0x10 + dreg] = 0xffff; + } + else + { + g_dsp.r[0x10 + dreg] = 0; + } + + dsp_opc_tsta(dreg << 11); +} + + +// NEW +void dsp_opc_xorr(uint16 opc) +{ + uint8 sreg = (opc >> 9) & 0x1; + uint8 dreg = (opc >> 8) & 0x1; + + g_dsp.r[0x1e + dreg] ^= g_dsp.r[0x1a + sreg]; + + dsp_opc_tsta(dreg << 11); +} + + +void dsp_opc_andr(uint16 opc) +{ + uint8 sreg = (opc >> 9) & 0x1; + uint8 dreg = (opc >> 8) & 0x1; + + g_dsp.r[0x1e + dreg] &= g_dsp.r[0x1a + sreg]; + + dsp_opc_tsta(dreg << 11); +} + + +// NEW +void dsp_opc_orr(uint16 opc) +{ + uint8 sreg = (opc >> 9) & 0x1; + uint8 dreg = (opc >> 8) & 0x1; + + g_dsp.r[0x1e + dreg] |= g_dsp.r[0x1a + sreg]; + + dsp_opc_tsta(dreg << 11); +} + + +// NEW +void dsp_opc_andc(uint16 opc) +{ + uint8 D = (opc >> 8) & 0x1; + + uint16 ac1 = dsp_get_acc_m(D); + uint16 ac2 = dsp_get_acc_m(1 - D); + + dsp_set_long_acc(D, ac1 & ac2); + + if ((ac1 & ac2) == 0) + { + g_dsp.r[R_SR] |= 0x20; + } + else + { + g_dsp.r[R_SR] &= ~0x20; + } +} + + +//------------------------------------------------------------- + +void dsp_opc_nx(uint16 opc) +{} + + +// NEW +void dsp_opc_andfc(uint16 opc) +{ + if (opc & 0xf) + { + ErrorLog("dsp_opc_andfc"); + } + + uint8 reg = (opc >> 8) & 0x1; + uint16 imm = dsp_fetch_code(); + uint16 val = dsp_get_acc_m(reg); + + if ((val & imm) == imm) + { + g_dsp.r[R_SR] |= 0x40; + } + else + { + g_dsp.r[R_SR] &= ~0x40; + } +} + + +void dsp_opc_andf(uint16 opc) +{ + uint8 reg; + uint16 imm; + uint16 val; + + if (opc & 0xf) + { + ErrorLog("dsp_opc_andf"); + } + + reg = 0x1e + ((opc >> 8) & 0x1); + imm = dsp_fetch_code(); + val = g_dsp.r[reg]; + + if ((val & imm) == 0) + { + g_dsp.r[R_SR] |= 0x40; + } + else + { + g_dsp.r[R_SR] &= ~0x40; + } +} + + +void dsp_opc_subf(uint16 opc) +{ + if (opc & 0xf) + { + ErrorLog("dsp_opc_subf"); + } + + uint8 reg = 0x1e + ((opc >> 8) & 0x1); + sint64 imm = (sint16)dsp_fetch_code(); + + sint64 val = (sint16)g_dsp.r[reg]; + sint64 res = val - imm; + + Update_SR_Register(res); +} + + +void dsp_opc_xori(uint16 opc) +{ + if (opc & 0xf) + { + ErrorLog("dsp_opc_xori"); + } + + uint8 reg = 0x1e + ((opc >> 8) & 0x1); + uint16 imm = dsp_fetch_code(); + g_dsp.r[reg] ^= imm; + + Update_SR_Register((sint16)g_dsp.r[reg]); +} + + +void dsp_opc_andi(uint16 opc) +{ + if (opc & 0xf) + { + ErrorLog("dsp_opc_andi"); + } + + uint8 reg = 0x1e + ((opc >> 8) & 0x1); + uint16 imm = dsp_fetch_code(); + g_dsp.r[reg] &= imm; + + Update_SR_Register((sint16)g_dsp.r[reg]); +} + + +// F|RES: i am not sure if this shouldnt be the whole ACC +// +void dsp_opc_ori(uint16 opc) +{ + if (opc & 0xf) + { + return(ErrorLog("dsp_opc_ori")); + } + + uint8 reg = 0x1e + ((opc >> 8) & 0x1); + uint16 imm = dsp_fetch_code(); + g_dsp.r[reg] |= imm; + + Update_SR_Register((sint16)g_dsp.r[reg]); +} + + +//------------------------------------------------------------- + +void dsp_opc_add(uint16 opc) +{ + uint8 areg = (opc >> 8) & 0x1; + sint64 acc0 = dsp_get_long_acc(0); + sint64 acc1 = dsp_get_long_acc(1); + + sint64 res = acc0 + acc1; + + dsp_set_long_acc(areg, res); + + Update_SR_Register(res); +} + + +//------------------------------------------------------------- + +void dsp_opc_addp(uint16 opc) +{ + uint8 dreg = (opc >> 8) & 0x1; + sint64 acc = dsp_get_long_acc(dreg); + acc = acc + dsp_get_long_prod(); + dsp_set_long_acc(dreg, acc); + + Update_SR_Register(acc); +} + + +void dsp_opc_cmpis(uint16 opc) +{ + uint8 areg = (opc >> 8) & 0x1; + + sint64 acc = dsp_get_long_acc(areg); + sint64 val = (sint8)opc; + val <<= 16; + + sint64 res = acc - val; + + Update_SR_Register(res); +} + + +// NEW +// verified at the console +void dsp_opc_addpaxz(uint16 opc) +{ + uint8 dreg = (opc >> 8) & 0x1; + uint8 sreg = (opc >> 9) & 0x1; + + sint64 prod = dsp_get_long_prod() & ~0x0ffff; + sint64 ax_h = dsp_get_long_acx(sreg); + sint64 acc = (prod + ax_h) & ~0x0ffff; + + dsp_set_long_acc(dreg, acc); + + Update_SR_Register(acc); +} + + +// NEW +void dsp_opc_movpz(uint16 opc) +{ + uint8 dreg = (opc >> 8) & 0x01; + + // overwrite acc and clear low part + sint64 prod = dsp_get_long_prod(); + sint64 acc = prod & ~0xffff; + dsp_set_long_acc(dreg, acc); + + Update_SR_Register(acc); +} + + +void dsp_opc_decm(uint16 opc) +{ + uint8 dreg = (opc >> 8) & 0x01; + + sint64 sub = 0x10000; + sint64 acc = dsp_get_long_acc(dreg); + acc -= sub; + dsp_set_long_acc(dreg, acc); + + Update_SR_Register(acc); +} + + +void dsp_opc_dec(uint16 opc) +{ + uint8 dreg = (opc >> 8) & 0x01; + + sint64 acc = dsp_get_long_acc(dreg) - 1; + dsp_set_long_acc(dreg, acc); + + Update_SR_Register(acc); +} + + +void dsp_opc_incm(uint16 opc) +{ + uint8 dreg = (opc >> 8) & 0x1; + + sint64 sub = 0x10000; + sint64 acc = dsp_get_long_acc(dreg); + acc += sub; + dsp_set_long_acc(dreg, acc); + + Update_SR_Register(acc); +} + + +void dsp_opc_inc(uint16 opc) +{ + uint8 dreg = (opc >> 8) & 0x1; + + sint64 acc = dsp_get_long_acc(dreg); + acc++; + dsp_set_long_acc(dreg, acc); + + Update_SR_Register(acc); +} + + +void dsp_opc_neg(uint16 opc) +{ + uint8 areg = (opc >> 8) & 0x1; + + sint64 acc = dsp_get_long_acc(areg); + acc = 0 - acc; + dsp_set_long_acc(areg, acc); + + Update_SR_Register(acc); +} + + +void dsp_opc_movnp(uint16 opc) +{ + ErrorLog("dsp_opc_movnp\n"); +} + + +// NEW +void dsp_opc_addax(uint16 opc) +{ + uint8 areg = (opc >> 8) & 0x1; + uint8 sreg = (opc >> 9) & 0x1; + + sint64 ax = dsp_get_long_acx(sreg); + sint64 acc = dsp_get_long_acc(areg); + acc += ax; + dsp_set_long_acc(areg, acc); + + Update_SR_Register(acc); +} + + +void dsp_opc_addr(uint16 opc) +{ + uint8 areg = (opc >> 8) & 0x1; + uint8 sreg = ((opc >> 9) & 0x3) + 0x18; + + sint64 ax = (sint16)g_dsp.r[sreg]; + ax <<= 16; + + sint64 acc = dsp_get_long_acc(areg); + acc += ax; + dsp_set_long_acc(areg, acc); + + Update_SR_Register(acc); +} + + +void dsp_opc_subr(uint16 opc) +{ + uint8 areg = (opc >> 8) & 0x1; + uint8 sreg = ((opc >> 9) & 0x3) + 0x18; + + sint64 ax = (sint16)g_dsp.r[sreg]; + ax <<= 16; + + sint64 acc = dsp_get_long_acc(areg); + acc -= ax; + dsp_set_long_acc(areg, acc); + + Update_SR_Register(acc); +} + + +void dsp_opc_addis(uint16 opc) +{ + uint8 areg = (opc >> 8) & 0x1; + + sint64 Imm = (sint8)opc; + Imm <<= 16; + sint64 acc = dsp_get_long_acc(areg); + acc += Imm; + dsp_set_long_acc(areg, acc); + + Update_SR_Register(acc); +} + + +void dsp_opc_addi(uint16 opc) +{ + uint8 areg = (opc >> 8) & 0x1; + + sint64 sub = (sint16)dsp_fetch_code(); + sub <<= 16; + sint64 acc = dsp_get_long_acc(areg); + acc += sub; + dsp_set_long_acc(areg, acc); + + Update_SR_Register(acc); +} + + +void dsp_opc_lsl16(uint16 opc) +{ + uint8 areg = (opc >> 8) & 0x1; + + sint64 acc = dsp_get_long_acc(areg); + acc <<= 16; + dsp_set_long_acc(areg, acc); + + Update_SR_Register(acc); +} + + +// NEW +void dsp_opc_madd(uint16 opc) +{ + uint8 sreg = (opc >> 8) & 0x1; + + sint64 prod = dsp_get_long_prod(); + prod += (sint64)dsp_get_ax_l(sreg) * (sint64)dsp_get_ax_h(sreg) * GetMultiplyModifier(); + dsp_set_long_prod(prod); +} + + +void dsp_opc_lsr16(uint16 opc) +{ + uint8 areg = (opc >> 8) & 0x1; + + sint64 acc = dsp_get_long_acc(areg); + acc >>= 16; + dsp_set_long_acc(areg, acc); + + Update_SR_Register(acc); +} + + +void dsp_opc_asr16(uint16 opc) +{ + uint8 areg = (opc >> 11) & 0x1; + + sint64 acc = dsp_get_long_acc(areg); + acc >>= 16; + dsp_set_long_acc(areg, acc); + + Update_SR_Register(acc); +} + + +union UOpcodeShifti +{ + uint16 Hex; + struct + { + signed shift : 6; + unsigned negating : 1; + unsigned arithmetic : 1; + unsigned areg : 1; + unsigned op : 7; + }; + struct + { + unsigned ushift : 6; + }; + UOpcodeShifti(uint16 _Hex) + : Hex(_Hex) {} +}; + +void dsp_opc_shifti(uint16 opc) +{ + UOpcodeShifti Opcode(opc); + + // direction: left + bool ShiftLeft = true; + uint16 shift = Opcode.ushift; + + if ((Opcode.negating) && (Opcode.shift < 0)) + { + ShiftLeft = false; + shift = -Opcode.shift; + } + + sint64 acc; + uint64 uacc; + + if (Opcode.arithmetic) + { + // arithmetic shift + uacc = dsp_get_long_acc(Opcode.areg); + + if (!ShiftLeft) + { + uacc >>= shift; + } + else + { + uacc <<= shift; + } + + acc = uacc; + } + else + { + acc = dsp_get_long_acc(Opcode.areg); + + if (!ShiftLeft) + { + acc >>= shift; + } + else + { + acc <<= shift; + } + } + + dsp_set_long_acc(Opcode.areg, acc); + + Update_SR_Register(acc); +} + + +//------------------------------------------------------------- +// hcs give me this code!! +void dsp_opc_dar(uint16 opc) +{ + uint8 reg = opc & 0x3; + + int temp = g_dsp.r[reg] + g_dsp.r[8]; + + if (temp <= 0x7ff){g_dsp.r[reg] = temp;} + else {g_dsp.r[reg]--;} +} + + +// hcs give me this code!! +void dsp_opc_iar(uint16 opc) +{ + uint8 reg = opc & 0x3; + + int temp = g_dsp.r[reg] + g_dsp.r[8]; + + if (temp <= 0x7ff){g_dsp.r[reg] = temp;} + else {g_dsp.r[reg]++;} +} + + +//------------------------------------------------------------- + +void dsp_opc_sbclr(uint16 opc) +{ + uint8 bit = (opc & 0xff) + 6; + g_dsp.r[R_SR] &= ~(1 << bit); +} + + +void dsp_opc_sbset(uint16 opc) +{ + uint8 bit = (opc & 0xff) + 6; + g_dsp.r[R_SR] |= (1 << bit); +} + + +void dsp_opc_srbith(uint16 opc) +{ + switch ((opc >> 8) & 0xf) + { + case 0xe: // SET40 + g_dsp.r[R_SR] &= ~(1 << 14); + break; + +/* case 0xf: // SET16 // that doesnt happen on a real console + g_dsp.r[R_SR] |= (1 << 14); + break;*/ + + default: + break; + } +} + + +//------------------------------------------------------------- + +void dsp_opc_movp(uint16 opc) +{ + uint8 dreg = (opc >> 8) & 0x1; + + sint64 prod = dsp_get_long_prod(); + sint64 acc = prod; + dsp_set_long_acc(dreg, acc); +} + + +void dsp_opc_mul(uint16 opc) +{ + uint8 sreg = (opc >> 11) & 0x1; + sint64 prod = (sint64)dsp_get_ax_h(sreg) * (sint64)dsp_get_ax_l(sreg) * GetMultiplyModifier(); + + dsp_set_long_prod(prod); +} + + +void dsp_opc_mulac(uint16 opc) +{ + ErrorLog("Not implemented dsp_opc_mulac() (pc:0x%04x)\n", g_dsp.err_pc); +} + + +void dsp_opc_mulmv(uint16 opc) +{ + uint8 rreg = (opc >> 8) & 0x1; + sint64 prod = dsp_get_long_prod(); + sint64 acc = prod; + dsp_set_long_acc(rreg, acc); + + uint8 areg = ((opc >> 11) & 0x1) + 0x18; + uint8 breg = ((opc >> 11) & 0x1) + 0x1a; + sint64 val1 = (sint16)g_dsp.r[areg]; + sint64 val2 = (sint16)g_dsp.r[breg]; + + prod = val1 * val2 * GetMultiplyModifier(); + + dsp_set_long_prod(prod); +} + + +// NEW +void dsp_opc_mulmvz(uint16 opc) +{ + uint8 sreg = (opc >> 11) & 0x1; + uint8 rreg = (opc >> 8) & 0x1; + + // overwrite acc and clear low part + sint64 prod = dsp_get_long_prod(); + sint64 acc = prod & ~0xffff; + dsp_set_long_acc(rreg, acc); + + // math prod + prod = (sint64)g_dsp.r[0x18 + sreg] * (sint64)g_dsp.r[0x1a + sreg] * GetMultiplyModifier(); + dsp_set_long_prod(prod); +} + + +// NEW +void dsp_opc_mulx(uint16 opc) +{ + uint8 sreg = ((opc >> 12) & 0x1); + uint8 treg = ((opc >> 11) & 0x1); + + sint64 val1 = (sreg == 0) ? dsp_get_ax_l(0) : dsp_get_ax_h(0); + sint64 val2 = (treg == 0) ? dsp_get_ax_l(1) : dsp_get_ax_h(1); + + sint64 prod = val1 * val2 * GetMultiplyModifier(); + dsp_set_long_prod(prod); +} + + +// NEW +void dsp_opc_mulxac(uint16 opc) +{ + // add old prod to acc + uint8 rreg = (opc >> 8) & 0x1; + sint64 acR = dsp_get_long_acc(rreg) + dsp_get_long_prod(); + dsp_set_long_acc(rreg, acR); + + // math new prod + uint8 sreg = (opc >> 12) & 0x1; + uint8 treg = (opc >> 11) & 0x1; + + sint64 val1 = (sreg == 0) ? dsp_get_ax_l(0) : dsp_get_ax_h(0); + sint64 val2 = (treg == 0) ? dsp_get_ax_l(1) : dsp_get_ax_h(1); + + sint64 prod = val1 * val2 * GetMultiplyModifier(); + dsp_set_long_prod(prod); +} + + +// NEW +void dsp_opc_mulxmv(uint16 opc) +{ + // add old prod to acc + uint8 rreg = ((opc >> 8) & 0x1); + sint64 acR = dsp_get_long_prod(); + dsp_set_long_acc(rreg, acR); + + // math new prod + uint8 sreg = (opc >> 12) & 0x1; + uint8 treg = (opc >> 11) & 0x1; + + sint64 val1 = (sreg == 0) ? dsp_get_ax_l(0) : dsp_get_ax_h(0); + sint64 val2 = (treg == 0) ? dsp_get_ax_l(1) : dsp_get_ax_h(1); + + sint64 prod = val1 * val2 * GetMultiplyModifier(); + dsp_set_long_prod(prod); +} + + +// NEW +void dsp_opc_mulxmvz(uint16 opc) +{ + // overwrite acc and clear low part + uint8 rreg = (opc >> 8) & 0x1; + sint64 prod = dsp_get_long_prod(); + sint64 acc = prod & ~0xffff; + dsp_set_long_acc(rreg, acc); + + // math prod + uint8 sreg = (opc >> 12) & 0x1; + uint8 treg = (opc >> 11) & 0x1; + + sint64 val1 = (sreg == 0) ? dsp_get_ax_l(0) : dsp_get_ax_h(0); + sint64 val2 = (treg == 0) ? dsp_get_ax_l(1) : dsp_get_ax_h(1); + + prod = val1 * val2 * GetMultiplyModifier(); + dsp_set_long_prod(prod); +} + + +// NEW +void dsp_opc_sub(uint16 opc) +{ + uint8 D = (opc >> 8) & 0x1; + sint64 Acc1 = dsp_get_long_acc(D); + sint64 Acc2 = dsp_get_long_acc(1 - D); + + Acc1 -= Acc2; + + dsp_set_long_acc(D, Acc1); +} + + +//------------------------------------------------------------- +// +// --- Table E +// +//------------------------------------------------------------- + +// NEW +void dsp_opc_maddx(uint16 opc) +{ + uint8 sreg = (opc >> 9) & 0x1; + uint8 treg = (opc >> 8) & 0x1; + + sint64 val1 = (sreg == 0) ? dsp_get_ax_l(0) : dsp_get_ax_h(0); + sint64 val2 = (treg == 0) ? dsp_get_ax_l(1) : dsp_get_ax_h(1); + + sint64 prod = dsp_get_long_prod(); + prod += val1 * val2 * GetMultiplyModifier(); + dsp_set_long_prod(prod); +} + + +// NEW +void dsp_opc_msubx(uint16 opc) +{ + uint8 sreg = (opc >> 9) & 0x1; + uint8 treg = (opc >> 8) & 0x1; + + sint64 val1 = (sreg == 0) ? dsp_get_ax_l(0) : dsp_get_ax_h(0); + sint64 val2 = (treg == 0) ? dsp_get_ax_l(1) : dsp_get_ax_h(1); + + sint64 prod = dsp_get_long_prod(); + prod -= val1 * val2 * GetMultiplyModifier(); + dsp_set_long_prod(prod); +} + + +// NEW +void dsp_opc_maddc(uint16 opc) +{ + uint sreg = (opc >> 9) & 0x1; + uint treg = (opc >> 8) & 0x1; + + sint64 val1 = dsp_get_acc_m(sreg); + sint64 val2 = dsp_get_ax_h(treg); + + sint64 prod = dsp_get_long_prod(); + prod += val1 * val2 * GetMultiplyModifier(); + dsp_set_long_prod(prod); +} + + +// NEW +void dsp_opc_msubc(uint16 opc) +{ + uint sreg = (opc >> 9) & 0x1; + uint treg = (opc >> 8) & 0x1; + + sint64 val1 = dsp_get_acc_m(sreg); + sint64 val2 = dsp_get_ax_h(treg); + + sint64 prod = dsp_get_long_prod(); + prod -= val1 * val2 * GetMultiplyModifier(); + dsp_set_long_prod(prod); +} + + +//------------------------------------------------------------- +void dsp_op0(uint16 opc) +{ + if (opc == 0) + { + return; + } + + switch ((opc >> 8) & 0xf) + { + case 0x0: + + switch ((opc >> 4) & 0xf) + { + case 0x0: + + switch (opc & 0xf) + { + case 0x4: + case 0x5: + case 0x6: + case 0x7: + dsp_opc_dar(opc); + break; + + case 0x8: + case 0x9: + case 0xa: + case 0xb: + dsp_opc_iar(opc); + break; + + default: + ErrorLog("dsp_op0"); + break; + } + + break; + + case 0x1: + dsp_opc_addarn(opc); + break; + + case 0x2: // HALT + dsp_opc_halt(opc); + break; + + case 0x4: // LOOP + case 0x5: // LOOP + dsp_opc_loop(opc); + break; + + case 0x6: // BLOOP + case 0x7: // BLOOP + dsp_opc_bloop(opc); + break; + + case 0x8: // LRI + case 0x9: // LRI + dsp_opc_lri(opc); + break; + + case 0xC: // LR + case 0xD: // LR + dsp_opc_lr(opc); + break; + + case 0xE: // SR + case 0xF: // SR + dsp_opc_sr(opc); + break; + + default: + ErrorLog("dsp_op0"); + break; + } + + break; + + case 0x2: + + switch ((opc >> 4) & 0xf) + { + case 0x0: // ADDI + dsp_opc_addi(opc); + break; + + case 0x1: // IL + dsp_opc_ilrr(opc); + break; + + case 0x2: // XORI + dsp_opc_xori(opc); + break; + + case 0x4: // ANDI + dsp_opc_andi(opc); + break; + + case 0x6: // ORI + dsp_opc_ori(opc); + break; + + case 0x7: // + dsp_opc_ifcc(opc); + break; + + case 0x8: // SUBF + dsp_opc_subf(opc); + break; + + case 0x9: // Jxx + dsp_opc_jcc(opc); + break; + + case 0xa: // ANDF + dsp_opc_andf(opc); + break; + + case 0xb: // CALL + dsp_opc_call(opc); + break; + + case 0xc: + dsp_opc_andfc(opc); + break; + + case 0xd: // RET + dsp_opc_ret(opc); + break; + + case 0xf: // RTI + dsp_opc_rti(opc); + break; + + default: + ErrorLog("dsp_op0"); + break; + } + + break; + + case 0x3: + + switch ((opc >> 4) & 0xf) + { + case 0x0: // ADDAI + dsp_opc_addi(opc); + break; + + case 0x1: // ILR + dsp_opc_ilrr(opc); + break; + + case 0x2: // XORI + dsp_opc_xori(opc); + break; + + case 0x4: // ANDI + dsp_opc_andi(opc); + break; + + case 0x6: // ORI + dsp_opc_ori(opc); + break; + + case 0x8: // SUBF + dsp_opc_subf(opc); + break; + + case 0xa: // ANDF + dsp_opc_andf(opc); + break; + + case 0xc: // ANDFC + dsp_opc_andfc(opc); + break; + + default: + ErrorLog("dsp_op0"); + break; + } + + break; + + case 0x4: + case 0x5: + dsp_opc_addis(opc); + break; + + case 0x6: // SUBISF + case 0x7: + dsp_opc_cmpis(opc); + break; + + case 0x8: // LRIS + case 0x9: + case 0xa: + case 0xb: + case 0xc: + case 0xd: + case 0xe: + case 0xf: + dsp_opc_lris(opc); + break; + + default: + ErrorLog("dsp_op0"); + break; + } +} + + +void dsp_op1(uint16 opc) +{ + switch ((opc >> 8) & 0xf) + { + case 0x0: + dsp_opc_loopi(opc); + break; + + case 0x1: // BLOOPI + dsp_opc_bloopi(opc); + break; + + case 0x2: // SBCLR + dsp_opc_sbclr(opc); + break; + + case 0x3: // SBSET + dsp_opc_sbset(opc); + break; + + case 0x4: // shifti + case 0x5: + dsp_opc_shifti(opc); + break; + + case 0x6: // SI + dsp_opc_si(opc); + break; + + case 0x7: // JMPA/CALLA + dsp_opc_jmpa(opc); + break; + + case 0x8: // LRRx + case 0x9: // LRRx + dsp_opc_lrr(opc); + break; + + case 0xa: // SRRx + case 0xb: // SRRx + dsp_opc_srr(opc); + break; + + case 0xc: // MRR + case 0xd: // MRR + case 0xe: // MRR + case 0xf: // MRR + dsp_opc_mrr(opc); + break; + + default: + ErrorLog("dsp_op1"); + break; + } +} + + +void dsp_op2(uint16 opc) +{ + // lrs, srs + uint8 reg = ((opc >> 8) & 0x7) + 0x18; + uint16 addr = (sint8) opc; + + if (opc & 0x0800) + { + // srs + dsp_dmem_write(addr, g_dsp.r[reg]); + } + else + { + // lrs + g_dsp.r[reg] = dsp_dmem_read(addr); + } +} + + +void dsp_op3(uint16 opc) +{ + dsp_op_ext_ops_pro(opc); + + switch ((opc >> 8) & 0xf) + { + case 0x0: + case 0x1: + case 0x2: + case 0x3: + dsp_opc_xorr(opc); + break; + + case 0x4: + case 0x5: + case 0x6: + case 0x7: + dsp_opc_andr(opc); + break; + + case 0x8: + case 0x9: + case 0xa: + case 0xb: + dsp_opc_orr(opc); + break; + + case 0xc: + case 0xd: + dsp_opc_andc(opc); + break; + + default: + ErrorLog("dsp_op3"); + break; + } + + dsp_op_ext_ops_epi(opc); +} + + +void dsp_op4(uint16 opc) +{ + dsp_op_ext_ops_pro(opc); + + switch ((opc >> 8) & 0xf) + { + case 0x0: + case 0x1: + case 0x2: + case 0x3: + case 0x4: + case 0x5: + case 0x6: + case 0x7: + dsp_opc_addr(opc); + break; + + case 0x8: + case 0x9: + case 0xa: + case 0xb: + dsp_opc_addax(opc); + break; + + case 0xc: + case 0xd: + dsp_opc_add(opc); + break; + + case 0xe: + case 0xf: + dsp_opc_addp(opc); + break; + + default: + ErrorLog("dsp_op4"); + break; + } + + dsp_op_ext_ops_epi(opc); +} + + +void dsp_op5(uint16 opc) +{ + dsp_op_ext_ops_pro(opc); + + switch ((opc >> 8) & 0xf) + { + case 0x0: + case 0x1: + case 0x2: + case 0x3: + case 0x4: + case 0x5: + case 0x6: + case 0x7: + dsp_opc_subr(opc); + break; + + case 0xc: + case 0xd: + dsp_opc_sub(opc); + break; + + default: + ErrorLog("dsp_op5"); + break; + } + + dsp_op_ext_ops_epi(opc); +} + + +void dsp_op6(uint16 opc) +{ + dsp_op_ext_ops_pro(opc); + + switch ((opc >> 8) & 0xf) + { + case 0x00: // MOVR + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + dsp_opc_movr(opc); + break; + + case 0x8: // MVAXA + case 0x9: + case 0xa: + case 0xb: + dsp_opc_movax(opc); + break; + + case 0xe: + case 0xf: + dsp_opc_movp(opc); + break; + + default: + ErrorLog("dsp_op6"); + break; + } + + dsp_op_ext_ops_epi(opc); +} + + +void dsp_op7(uint16 opc) +{ + dsp_op_ext_ops_pro(opc); + + switch ((opc >> 8) & 0xf) + { + case 0x0: + case 0x1: + case 0x2: + case 0x3: + dsp_opc_addaxl(opc); + break; + + case 0x4: + case 0x5: + dsp_opc_incm(opc); + break; + + case 0x6: + case 0x7: + dsp_opc_inc(opc); + break; + + case 0x8: + case 0x9: + dsp_opc_decm(opc); + break; + + case 0xa: + case 0xb: + dsp_opc_dec(opc); + break; + + case 0xc: + case 0xd: + dsp_opc_neg(opc); + break; + + case 0xe: + case 0xf: + dsp_opc_movnp(opc); + break; + + default: + ErrorLog("dsp_op7"); + break; + } + + dsp_op_ext_ops_epi(opc); +} + + +void dsp_op8(uint16 opc) +{ + dsp_op_ext_ops_pro(opc); + + switch ((opc >> 8) & 0xf) + { + case 0x0: + case 0x8: + dsp_opc_nx(opc); + break; + + case 0x1: // CLR 0 + case 0x9: // CLR 1 + dsp_opc_clr(opc); + break; + + case 0x2: // CMP + dsp_opc_cmp(opc); + break; + + case 0x4: // CLRP + dsp_opc_clrp(opc); + break; + + case 0x6: + case 0x7: + dsp_opc_tstaxh(opc); + break; + + case 0xc: + case 0xb: + case 0xe: // SET40 + case 0xd: + case 0xa: + case 0xf: + dsp_opc_srbith(opc); + break; + + default: + ErrorLog("dsp_op8"); + break; + } + + dsp_op_ext_ops_epi(opc); +} + + +void dsp_op9(uint16 opc) +{ + dsp_op_ext_ops_pro(opc); + + switch ((opc >> 8) & 0xf) + { + case 0x02: + case 0x03: + case 0x0a: + case 0x0b: + dsp_opc_mulmvz(opc); + break; + + case 0x04: + case 0x05: + case 0x0c: + case 0x0d: + dsp_opc_mulac(opc); + break; + + case 0x6: + case 0x7: + case 0xe: + case 0xf: + dsp_opc_mulmv(opc); + break; + + case 0x0: + case 0x8: + dsp_opc_mul(opc); + break; + + case 0x1: + case 0x9: + dsp_opc_asr16(opc); + break; + + default: + ErrorLog("dsp_op9"); + break; + } + + dsp_op_ext_ops_epi(opc); +} + + +void dsp_opab(uint16 opc) +{ + dsp_op_ext_ops_pro(opc); + + switch ((opc >> 8) & 0x7) + { + case 0x0: + dsp_opc_mulx(opc); + break; + + case 0x1: + dsp_opc_tsta(opc); + break; + + case 0x2: + case 0x3: + dsp_opc_mulxmvz(opc); + break; + + case 0x4: + case 0x5: + dsp_opc_mulxac(opc); + break; + + case 0x6: + case 0x7: + dsp_opc_mulxmv(opc); + break; + + default: + ErrorLog("dsp_opab"); + } + + dsp_op_ext_ops_epi(opc); +} + + +void dsp_opcd(uint16 opc) +{ + dsp_op_ext_ops_pro(opc); + + switch ((opc >> 8) & 0x7) + { + case 0x0: // MULC + dsp_opc_mulc(opc); + break; + + case 0x1: // CMPAR + dsp_opc_cmpar(opc); + break; + + case 0x2: // MULCMVZ + case 0x3: + dsp_opc_mulcmvz(opc); + break; + + case 0x4: // MULCAC + case 0x5: + dsp_opc_mulcac(opc); + break; + + case 0x6: // MULCMV + case 0x7: + dsp_opc_mulcmv(opc); + break; + + default: + ErrorLog("dsp_opcd"); + } + + dsp_op_ext_ops_epi(opc); +} + + +void dsp_ope(uint16 opc) +{ + dsp_op_ext_ops_pro(opc); + + switch ((opc >> 10) & 0x3) + { + case 0x00: // MADDX + dsp_opc_maddx(opc); + break; + + case 0x01: // MSUBX + dsp_opc_msubx(opc); + break; + + case 0x02: // MADDC + dsp_opc_maddc(opc); + break; + + case 0x03: // MSUBC + dsp_opc_msubc(opc); + break; + + default: + ErrorLog("dsp_ope"); + } + + dsp_op_ext_ops_epi(opc); +} + + +void dsp_opf(uint16 opc) +{ + dsp_op_ext_ops_pro(opc); + + switch ((opc >> 8) & 0xf) + { + case 0x0: + case 0x1: + dsp_opc_lsl16(opc); + break; + + case 0x02: + case 0x03: + dsp_opc_madd(opc); + break; + + case 0x4: + case 0x5: + dsp_opc_lsr16(opc); + break; + + case 0x8: + case 0x9: + case 0xa: + case 0xb: + dsp_opc_addpaxz(opc); + break; + + case 0xe: + case 0xf: + dsp_opc_movpz(opc); + break; + + default: + ErrorLog("dsp_opf"); + break; + } + + dsp_op_ext_ops_epi(opc); +} + + diff --git a/Source/Plugins/Plugin_DSP_LLE/Src/gdsp_opcodes.h b/Source/Plugins/Plugin_DSP_LLE/Src/gdsp_opcodes.h new file mode 100644 index 0000000000..f93aa05e3f --- /dev/null +++ b/Source/Plugins/Plugin_DSP_LLE/Src/gdsp_opcodes.h @@ -0,0 +1,53 @@ +/*==================================================================== + + filename: gdsp_opcodes.h + project: GCemu + created: 2004-6-18 + mail: duddie@walla.com + + Copyright (c) 2005 Duddie & Tratax + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + ====================================================================*/ +#ifndef _GDSP_OPCODES_H +#define _GDSP_OPCODES_H + +#include "Globals.h" + +void dsp_op0(uint16 opc); +void dsp_op1(uint16 opc); +void dsp_op2(uint16 opc); +void dsp_op3(uint16 opc); +void dsp_op4(uint16 opc); +void dsp_op5(uint16 opc); +void dsp_op6(uint16 opc); +void dsp_op7(uint16 opc); +void dsp_op8(uint16 opc); +void dsp_op9(uint16 opc); +void dsp_opab(uint16 opc); +void dsp_opcd(uint16 opc); +void dsp_ope(uint16 opc); +void dsp_opf(uint16 opc); + + +#define R_SR 0x13 + +#define FLAG_ENABLE_INTERUPT 11 + +extern inline bool dsp_SR_is_flag_set(uint8 flag); + + +#endif diff --git a/Source/Plugins/Plugin_DSP_LLE/Src/gdsp_opcodes_helper.h b/Source/Plugins/Plugin_DSP_LLE/Src/gdsp_opcodes_helper.h new file mode 100644 index 0000000000..ec5db4fe92 --- /dev/null +++ b/Source/Plugins/Plugin_DSP_LLE/Src/gdsp_opcodes_helper.h @@ -0,0 +1,227 @@ +/*==================================================================== + + filename: opcodes.h + project: GameCube DSP Tool (gcdsp) + created: 2005.03.04 + mail: duddie@walla.com + + Copyright (c) 2005 Duddie + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + ====================================================================*/ + +#ifndef _GDSP_OPCODES_HELPER_H +#define _GDSP_OPCODES_HELPER_H + +#include "Globals.h" +// --------------------------------------------------------------------------------------- +// +// --- SR +// +// --------------------------------------------------------------------------------------- + +inline void dsp_SR_set_flag(uint8 flag) +{ + g_dsp.r[R_SR] |= (1 << flag); +} + + +inline bool dsp_SR_is_flag_set(uint8 flag) +{ + return((g_dsp.r[R_SR] & (1 << flag)) > 0); +} + + +// --------------------------------------------------------------------------------------- +// +// --- reg +// +// --------------------------------------------------------------------------------------- + +inline uint16 dsp_op_read_reg(uint8 reg) +{ + uint16 val; + + switch (reg & 0x1f) + { + case 0x0c: + case 0x0d: + case 0x0e: + case 0x0f: + val = dsp_reg_load_stack(reg - 0x0c); + break; + + default: + val = g_dsp.r[reg]; + break; + } + + return(val); +} + + +inline void dsp_op_write_reg(uint8 reg, uint16 val) +{ + switch (reg & 0x1f) + { + case 0x0c: + case 0x0d: + case 0x0e: + case 0x0f: + dsp_reg_store_stack(reg - 0x0c, val); + break; + + default: + g_dsp.r[reg] = val; + break; + } +} + + +// --------------------------------------------------------------------------------------- +// +// --- prod +// +// --------------------------------------------------------------------------------------- + + +inline sint64 dsp_get_long_prod() +{ + sint64 val; + sint64 low_prod; + val = (sint8)g_dsp.r[0x16]; + val <<= 32; + low_prod = g_dsp.r[0x15]; + low_prod += g_dsp.r[0x17]; + low_prod <<= 16; + low_prod |= g_dsp.r[0x14]; + val += low_prod; + return(val); +} + + +inline void dsp_set_long_prod(sint64 val) +{ + g_dsp.r[0x14] = (uint16)val; + val >>= 16; + g_dsp.r[0x15] = (uint16)val; + val >>= 16; + g_dsp.r[0x16] = (uint16)val; + g_dsp.r[0x17] = 0; +} + + +// --------------------------------------------------------------------------------------- +// +// --- acc +// +// --------------------------------------------------------------------------------------- + +inline sint64 dsp_get_long_acc(uint8 reg) +{ + _dbg_assert_(reg < 2); + sint64 val; + sint64 low_acc; + val = (sint8)g_dsp.r[0x10 + reg]; + val <<= 32; + low_acc = g_dsp.r[0x1e + reg]; + low_acc <<= 16; + low_acc |= g_dsp.r[0x1c + reg]; + val |= low_acc; + return(val); +} + + +inline uint64 dsp_get_ulong_acc(uint8 reg) +{ + _dbg_assert_(reg < 2); + uint64 val; + uint64 low_acc; + val = (uint8)g_dsp.r[0x10 + reg]; + val <<= 32; + low_acc = g_dsp.r[0x1e + reg]; + low_acc <<= 16; + low_acc |= g_dsp.r[0x1c + reg]; + val |= low_acc; + return(val); +} + + +inline void dsp_set_long_acc(uint8 _reg, sint64 val) +{ + _dbg_assert_(_reg < 2); + g_dsp.r[0x1c + _reg] = (uint16)val; + val >>= 16; + g_dsp.r[0x1e + _reg] = (uint16)val; + val >>= 16; + g_dsp.r[0x10 + _reg] = (uint16)val; +} + + +inline sint16 dsp_get_acc_l(uint8 _reg) +{ + _dbg_assert_(_reg < 2); + return(g_dsp.r[0x1c + _reg]); +} + + +inline sint16 dsp_get_acc_m(uint8 _reg) +{ + _dbg_assert_(_reg < 2); + return(g_dsp.r[0x1e + _reg]); +} + + +sint16 dsp_get_acc_h(uint8 _reg) +{ + _dbg_assert_(_reg < 2); + return(g_dsp.r[0x10 + _reg]); +} + + +// --------------------------------------------------------------------------------------- +// +// --- acx +// +// --------------------------------------------------------------------------------------- + + +inline sint64 dsp_get_long_acx(uint8 _reg) +{ + _dbg_assert_(_reg < 2); + sint64 val = (sint16)g_dsp.r[0x1a + _reg]; + val <<= 16; + sint64 low_acc = g_dsp.r[0x18 + _reg]; + val |= low_acc; + return(val); +} + + +inline sint16 dsp_get_ax_l(uint8 _reg) +{ + _dbg_assert_(_reg < 2); + return(g_dsp.r[0x18 + _reg]); +} + + +inline sint16 dsp_get_ax_h(uint8 _reg) +{ + _dbg_assert_(_reg < 2); + return(g_dsp.r[0x1a + _reg]); +} + + +#endif diff --git a/Source/Plugins/Plugin_DSP_LLE/Src/gdsp_registers.cpp b/Source/Plugins/Plugin_DSP_LLE/Src/gdsp_registers.cpp new file mode 100644 index 0000000000..bef62309f9 --- /dev/null +++ b/Source/Plugins/Plugin_DSP_LLE/Src/gdsp_registers.cpp @@ -0,0 +1,62 @@ +/*==================================================================== + + filename: gdsp_registers.cpp + project: GCemu + created: 2004-6-18 + mail: duddie@walla.com + + Copyright (c) 2005 Duddie & Tratax + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + ====================================================================*/ + +#include "Globals.h" +#include "gdsp_registers.h" +#include "gdsp_interpreter.h" + + + +void dsp_reg_stack_push(uint8 stack_reg) +{ + g_dsp.reg_stack_ptr[stack_reg]++; + g_dsp.reg_stack_ptr[stack_reg] &= DSP_STACK_MASK; + g_dsp.reg_stack[stack_reg][g_dsp.reg_stack_ptr[stack_reg]] = g_dsp.r[DSP_REG_ST0 + stack_reg]; +} + + +void dsp_reg_stack_pop(uint8 stack_reg) +{ + g_dsp.r[DSP_REG_ST0 + stack_reg] = g_dsp.reg_stack[stack_reg][g_dsp.reg_stack_ptr[stack_reg]]; + g_dsp.reg_stack_ptr[stack_reg]--; + g_dsp.reg_stack_ptr[stack_reg] &= DSP_STACK_MASK; +} + + +void dsp_reg_store_stack(uint8 stack_reg, uint16 val) +{ + dsp_reg_stack_push(stack_reg); + g_dsp.r[DSP_REG_ST0 + stack_reg] = val; +} + + +uint16 dsp_reg_load_stack(uint8 stack_reg) +{ + uint16 val = g_dsp.r[DSP_REG_ST0 + stack_reg]; + dsp_reg_stack_pop(stack_reg); + return(val); +} + + diff --git a/Source/Plugins/Plugin_DSP_LLE/Src/gdsp_registers.h b/Source/Plugins/Plugin_DSP_LLE/Src/gdsp_registers.h new file mode 100644 index 0000000000..ebbaf1a8dc --- /dev/null +++ b/Source/Plugins/Plugin_DSP_LLE/Src/gdsp_registers.h @@ -0,0 +1,42 @@ +/*==================================================================== + + filename: gdsp_registers.h + project: GCemu + created: 2004-6-18 + mail: duddie@walla.com + + Copyright (c) 2005 Duddie & Tratax + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + ====================================================================*/ +#ifndef _GDSP_REGISTERS_H +#define _GDSP_REGISTERS_H + +#include "Globals.h" + +#define DSP_REG_ST0 0x0c +#define DSP_REG_ST1 0x0c +#define DSP_REG_ST2 0x0c +#define DSP_REG_ST3 0x0c + +#define DSP_STACK_C 0 +#define DSP_STACK_D 1 + +void dsp_reg_store_stack(uint8 stack_reg, uint16 val); +uint16 dsp_reg_load_stack(uint8 stack_reg); + + +#endif diff --git a/Source/Plugins/Plugin_DSP_LLE/Src/main.cpp b/Source/Plugins/Plugin_DSP_LLE/Src/main.cpp new file mode 100644 index 0000000000..b71575d686 --- /dev/null +++ b/Source/Plugins/Plugin_DSP_LLE/Src/main.cpp @@ -0,0 +1,291 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "Globals.h" + +#include "gdsp_interpreter.h" +#include "gdsp_interface.h" +#include "disassemble.h" + +#ifdef _WIN32 +#include "DisAsmDlg.h" +#include "DSoundStream.h" + +HINSTANCE g_hInstance = NULL; +HANDLE g_hDSPThread = NULL; +CRITICAL_SECTION g_CriticalSection; +#endif + +DSPInitialize g_dspInitialize; +CDisAsmDlg g_Dialog; + +#define GDSP_MBOX_CPU 0 +#define GDSP_MBOX_DSP 1 + + +uint32 g_LastDMAAddress = 0; +uint32 g_LastDMASize = 0; + +BOOL APIENTRY DllMain(HINSTANCE hinstDLL, // DLL module handle + DWORD dwReason, // reason called + LPVOID lpvReserved) // reserved +{ + switch (dwReason) + { + case DLL_PROCESS_ATTACH: + break; + + case DLL_PROCESS_DETACH: + break; + + default: + break; + } + + g_hInstance = hinstDLL; + return(TRUE); +} + + +void GetDllInfo(PLUGIN_INFO* _PluginInfo) +{ + _PluginInfo->Version = 0x0100; + _PluginInfo->Type = PLUGIN_TYPE_DSP; + +#ifndef _DEBUG + sprintf(_PluginInfo->Name, "Dolphin DSP-LLE Plugin (DSound)"); +#else + sprintf(_PluginInfo->Name, "Dolphin DSP-LLE Plugin Debug (DSound)"); +#endif +} + + +void DllAbout(HWND _hParent) +{} + + +void DllConfig(HWND _hParent) +{} + + +void DllDebugger(HWND _hParent) +{ +#if defined (_DEBUG) && defined (_WIN32) + g_Dialog.Create(NULL); //_hParent); + g_Dialog.ShowWindow(SW_SHOW); +#endif + +} + + +DWORD WINAPI dsp_thread(LPVOID lpParameter) +{ + while (1) + { + if (!gdsp_run()) + { + ErrorLog("*** DSP: CRITICAL ERROR ***\n"); + //return 0; + exit(0); + } + } +} + + +DWORD WINAPI dsp_thread_debug(LPVOID lpParameter) +{ + while (1) + { + if (g_Dialog.CanDoStep()) + { + gdsp_runx(1); + } + else + { + Sleep(100); + } + } +} + + +void DSP_DebugBreak() +{ +#ifdef _WIN32 +#ifdef _DEBUG + g_Dialog.DebugBreak(); +#endif +#endif +} + + +void dspi_req_dsp_irq() +{ + g_dspInitialize.pGenerateDSPInterrupt(); +} + + +void Mixer(short* buffer, int numSamples, int bits, int rate, int channels) +{} + + +void DSP_Initialize(DSPInitialize _dspInitialize) +{ + { + g_dspInitialize = _dspInitialize; + + gdsp_init(); + g_dsp.step_counter = 0; + g_dsp.cpu_ram = g_dspInitialize.pGetMemoryPointer(0); + g_dsp.irq_request = dspi_req_dsp_irq; + gdsp_reset(); + + if (!gdsp_load_rom("data\\dsp_rom.bin")) + { + ErrorLog("Cannot load DSP ROM\n"); + } + + if (!gdsp_load_coef("data\\dsp_coef.bin")) + { + ErrorLog("Cannot load DSP COEF\n"); + } + + +/* Dump UCode to file... + FILE* t = fopen("e:\\hmm.txt", "wb"); + gd_globals_t gdg; + gd_dis_file(&gdg, "D:\\DSP_UCode.bin", t); + fclose(t); */ + } + + +#if _DEBUG + g_hDSPThread = CreateThread(NULL, 0, dsp_thread_debug, 0, 0, NULL); + +#else + g_hDSPThread = CreateThread(NULL, 0, dsp_thread, 0, 0, NULL); +#endif + + + + InitializeCriticalSection(&g_CriticalSection); + + DSound::DSound_StartSound((HWND)g_dspInitialize.hWnd, 32000, Mixer); +} + + +void DSP_Shutdown(void) +{ + if (g_hDSPThread != NULL) + { + TerminateThread(g_hDSPThread, 0); + } +} + + +unsigned __int16 DSP_WriteControlRegister(unsigned __int16 _uFlag) +{ + gdsp_write_cr(_uFlag); + return(gdsp_read_cr()); +} + + +unsigned __int16 DSP_ReadControlRegister() +{ + return(gdsp_read_cr()); +} + + +unsigned __int16 DSP_ReadMailboxHigh(bool _CPUMailbox) +{ + if (_CPUMailbox) + { + return(gdsp_mbox_read_h(GDSP_MBOX_CPU)); + } + else + { + return(gdsp_mbox_read_h(GDSP_MBOX_DSP)); + } +} + + +unsigned __int16 DSP_ReadMailboxLow(bool _CPUMailbox) +{ + if (_CPUMailbox) + { + return(gdsp_mbox_read_l(GDSP_MBOX_CPU)); + } + else + { + return(gdsp_mbox_read_l(GDSP_MBOX_DSP)); + } +} + + +void DSP_WriteMailboxHigh(bool _CPUMailbox, unsigned __int16 _uHighMail) +{ + if (_CPUMailbox) + { + if (gdsp_mbox_peek(GDSP_MBOX_CPU) & 0x80000000) + { + ErrorLog("Mailbox isnt empty ... strange"); + } + + gdsp_mbox_write_h(GDSP_MBOX_CPU, _uHighMail); + } + else + { + ErrorLog("CPU cant write to DSP mailbox"); + } +} + + +void DSP_WriteMailboxLow(bool _CPUMailbox, unsigned __int16 _uLowMail) +{ + if (_CPUMailbox) + { + gdsp_mbox_write_l(GDSP_MBOX_CPU, _uLowMail); + + DebugLog("Write CPU Mail: 0x%08x (pc=0x%04x)\n", gdsp_mbox_peek(GDSP_MBOX_CPU), g_dsp.err_pc); + } + else + { + ErrorLog("CPU cant write to DSP mailbox"); + } +} + + +void DSP_Update() +{ + if (g_hDSPThread) + { + return; + } + + if (g_Dialog.CanDoStep()) + { + gdsp_runx(100); + } +} + + +void DSP_SendAIBuffer(unsigned __int32 _Address, unsigned __int32 _Size) +{ + uint32 Size = _Size * 16 * 2; // 16bit per sample, two channels + + g_LastDMAAddress = _Address; + g_LastDMASize = Size; +} diff --git a/Source/Plugins/Plugin_DSP_LLE/Src/opcodes.cpp b/Source/Plugins/Plugin_DSP_LLE/Src/opcodes.cpp new file mode 100644 index 0000000000..029bf6e288 --- /dev/null +++ b/Source/Plugins/Plugin_DSP_LLE/Src/opcodes.cpp @@ -0,0 +1,237 @@ +/*==================================================================== + + filename: opcodes.cpp + project: GameCube DSP Tool (gcdsp) + created: 2005.03.04 + mail: duddie@walla.com + + Copyright (c) 2005 Duddie + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + ====================================================================*/ + +#include "Globals.h" +#include "opcodes.h" + +opc_t opcodes[] = +{ + {"NOP", 0x0000, 0xffff, 1, 0, {},}, + {"HALT", 0x0021, 0xffff, 1, 0, {},}, + {"RET", 0x02df, 0xffff, 1, 0, {},}, + {"RETEQ", 0x02d5, 0xffff, 1, 0, {},}, + {"RETNZ", 0x02dd, 0xffff, 1, 0, {},}, + {"RTI", 0x02ff, 0xffff, 1, 0, {},}, + {"CALL", 0x02bf, 0xffff, 2, 1, {{P_VAL, 2, 1, 0, 0xffff}},}, + + {"CALLNE", 0x02b4, 0xffff, 2, 1, {{P_VAL, 2, 1, 0, 0xffff}},}, + + {"IF_0", 0x0270, 0xffff, 1, 0, {},}, + {"IF_1", 0x0271, 0xffff, 1, 0, {},}, + {"IF_2", 0x0272, 0xffff, 1, 0, {},}, + {"IF_3", 0x0273, 0xffff, 1, 0, {},}, + {"IF_E", 0x0274, 0xffff, 1, 0, {},}, + {"IF_Q", 0x0275, 0xffff, 1, 0, {},}, + {"IF_R", 0x027c, 0xffff, 1, 0, {},}, + {"IF_Z", 0x027d, 0xffff, 1, 0, {},}, + {"IF_P", 0x027f, 0xffff, 1, 0, {},}, + + {"JX0", 0x0290, 0xffff, 2, 1, {{P_VAL, 2, 1, 0, 0xffff}},}, + {"JX1", 0x0291, 0xffff, 2, 1, {{P_VAL, 2, 1, 0, 0xffff}},}, + {"JX2", 0x0292, 0xffff, 2, 1, {{P_VAL, 2, 1, 0, 0xffff}},}, + {"JX3", 0x0293, 0xffff, 2, 1, {{P_VAL, 2, 1, 0, 0xffff}},}, + {"JNE", 0x0294, 0xffff, 2, 1, {{P_VAL, 2, 1, 0, 0xffff}},}, + {"JEQ", 0x0295, 0xffff, 2, 1, {{P_VAL, 2, 1, 0, 0xffff}},}, + {"JZR", 0x029c, 0xffff, 2, 1, {{P_VAL, 2, 1, 0, 0xffff}},}, + {"JNZ", 0x029d, 0xffff, 2, 1, {{P_VAL, 2, 1, 0, 0xffff}},}, + {"JMP", 0x029f, 0xffff, 2, 1, {{P_VAL, 2, 1, 0, 0xffff}},}, + + {"DAR", 0x0004, 0xfffc, 1, 1, {{P_REG, 1, 0, 0, 0x0003}},}, + {"IAR", 0x0008, 0xfffc, 1, 1, {{P_REG, 1, 0, 0, 0x0003}},}, + + {"CALLR", 0x171f, 0xff1f, 1, 1, {{P_REG, 1, 0, 5, 0x00e0}},}, + {"JMPR", 0x170f, 0xff1f, 1, 1, {{P_REG, 1, 0, 5, 0x00e0}},}, + + {"SBCLR", 0x1200, 0xfff8, 1, 1, {{P_IMM, 1, 0, 0, 0x0007}},}, + {"SBSET", 0x1300, 0xfff8, 1, 1, {{P_IMM, 1, 0, 0, 0x0007}},}, + + {"LSL", 0x1400, 0xfec0, 1, 2, {{P_ACC, 1, 0, 8, 0x0100}, {P_IMM, 1, 0, 0, 0x003f}},}, + {"LSR", 0x1440, 0xfec0, 1, 2, {{P_ACC, 1, 0, 8, 0x0100}, {P_IMM, 1, 0, 0, 0x003f}},}, + {"ASL", 0x1480, 0xfec0, 1, 2, {{P_ACC, 1, 0, 8, 0x0100}, {P_IMM, 1, 0, 0, 0x007f}},}, + {"ASR", 0x14c0, 0xfec0, 1, 2, {{P_ACC, 1, 0, 8, 0x0100}, {P_IMM, 1, 0, 0, 0x007f}},}, + + + {"LRI", 0x0080, 0xffe0, 2, 2, {{P_REG, 1, 0, 0, 0x001f}, {P_IMM, 2, 1, 0, 0xffff}},}, + {"LR", 0x00c0, 0xffe0, 2, 2, {{P_REG, 1, 0, 0, 0x001f}, {P_MEM, 2, 1, 0, 0xffff}},}, + {"SR", 0x00e0, 0xffe0, 2, 2, {{P_MEM, 2, 1, 0, 0xffff}, {P_REG, 1, 0, 0, 0x001f}},}, + + {"MRR", 0x1c00, 0xfc00, 1, 2, {{P_REG, 1, 0, 5, 0x03e0}, {P_REG, 1, 0, 0, 0x001f}},}, + + {"SI", 0x1600, 0xff00, 2, 2, {{P_MEM, 1, 0, 0, 0x00ff}, {P_IMM, 2, 1, 0, 0xffff}},}, + + {"LRS", 0x2000, 0xf800, 1, 2, {{P_REG18, 1, 0, 8, 0x0700}, {P_MEM, 1, 0, 0, 0x00ff}},}, + {"SRS", 0x2800, 0xf800, 1, 2, {{P_MEM, 1, 0, 0, 0x00ff}, {P_REG18, 1, 0, 8, 0x0700}},}, + + {"LRIS", 0x0800, 0xf800, 1, 2, {{P_REG18, 1, 0, 8, 0x0700}, {P_IMM, 1, 0, 0, 0x00ff}},}, + + {"ADDIS", 0x0400, 0xfe00, 1, 2, {{P_ACC, 1, 0, 8, 0x0100}, {P_IMM, 1, 0, 0, 0x00ff}},}, + {"CMPIS", 0x0600, 0xfe00, 1, 2, {{P_ACC, 1, 0, 8, 0x0100}, {P_IMM, 1, 0, 0, 0x00ff}},}, + + {"ANDI", 0x0240, 0xfeff, 2, 2, {{P_ACC, 1, 0, 8, 0x0100}, {P_IMM, 2, 1, 0, 0xffff}},}, + {"ANDF", 0x02c0, 0xfeff, 2, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_IMM, 2, 1, 0, 0xffff}},}, + + {"XORI", 0x0220, 0xfeff, 2, 2, {{P_ACC, 1, 0, 8, 0x0100}, {P_IMM, 2, 1, 0, 0xffff}},}, + {"ANDCF", 0x02a0, 0xfeff, 2, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_IMM, 2, 1, 0, 0xffff}},}, + + {"ORI", 0x0260, 0xfeff, 2, 2, {{P_ACC, 1, 0, 8, 0x0100}, {P_IMM, 2, 1, 0, 0xffff}},}, + {"ORF", 0x02e0, 0xfeff, 2, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_IMM, 2, 1, 0, 0xffff}},}, + + {"ADDI", 0x0200, 0xfeff, 2, 2, {{P_ACC, 1, 0, 8, 0x0100}, {P_IMM, 2, 1, 0, 0xffff}},}, // missing S64 + {"CMPI", 0x0280, 0xfeff, 2, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_IMM, 2, 1, 0, 0xffff}},}, // missing S64 + + {"ILRR", 0x0210, 0xfedc, 1, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_PRG, 1, 0, 0, 0x0003}},}, + {"ILRRI", 0x0218, 0xfedc, 1, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_PRG, 1, 0, 0, 0x0003}},}, + + // load and store value pointed by indexing reg and increment; LRR/SRR variants + {"LRRI", 0x1900, 0xff80, 1, 2, {{P_REG, 1, 0, 0, 0x001f}, {P_PRG, 1, 0, 5, 0x0060}},}, + {"LRRD", 0x1880, 0xff80, 1, 2, {{P_REG, 1, 0, 0, 0x001f}, {P_PRG, 1, 0, 5, 0x0060}},}, + {"LRRN", 0x1980, 0xff80, 1, 2, {{P_REG, 1, 0, 0, 0x001f}, {P_PRG, 1, 0, 5, 0x0060}},}, + {"LRR", 0x1800, 0xff80, 1, 2, {{P_REG, 1, 0, 0, 0x001f}, {P_PRG, 1, 0, 5, 0x0060}},}, + {"SRRI", 0x1b00, 0xff80, 1, 2, {{P_PRG, 1, 0, 5, 0x0060}, {P_REG, 1, 0, 0, 0x001f}},}, + {"SRRD", 0x1a80, 0xff80, 1, 2, {{P_PRG, 1, 0, 5, 0x0060}, {P_REG, 1, 0, 0, 0x001f}},}, + {"SRRN", 0x1b80, 0xff80, 1, 2, {{P_PRG, 1, 0, 5, 0x0060}, {P_REG, 1, 0, 0, 0x001f}},}, + {"SRR", 0x1a00, 0xff80, 1, 2, {{P_PRG, 1, 0, 5, 0x0060}, {P_REG, 1, 0, 0, 0x001f}},}, + + {"LOOPI", 0x1000, 0xff00, 1, 1, {{P_IMM, 1, 0, 0, 0x00ff}},}, + {"BLOOPI", 0x1100, 0xff00, 2, 2, {{P_IMM, 1, 0, 0, 0x00ff}, {P_VAL, 2, 1, 0, 0xffff}},}, + {"LOOP", 0x0040, 0xffe0, 1, 1, {{P_REG, 1, 0, 0, 0x001f}},}, + {"BLOOP", 0x0060, 0xffe0, 2, 2, {{P_REG, 1, 0, 0, 0x001f}, {P_VAL, 2, 1, 0, 0xffff}},}, + + + + // opcodes that can be extended + // extended opcodes, note size of opcode will be set to 0 + + {"NX", 0x8000, 0xffff, 1 | P_EXT, 0, {},}, + + {"S40", 0x8e00, 0xffff, 1 | P_EXT, 0, {},}, + {"S16", 0x8f00, 0xffff, 1 | P_EXT, 0, {},}, + {"M2", 0x8a00, 0xffff, 1 | P_EXT, 0, {},}, + {"M0", 0x8b00, 0xffff, 1 | P_EXT, 0, {},}, + {"CLR15", 0x8c00, 0xffff, 1 | P_EXT, 0, {},}, + {"SET15", 0x8d00, 0xffff, 1 | P_EXT, 0, {},}, + + {"DECM", 0x7800, 0xfeff, 1 | P_EXT, 1, {{P_ACCM, 1, 0, 8, 0x0100}},}, + {"INCM", 0x7400, 0xfeff, 1 | P_EXT, 1, {{P_ACCM, 1, 0, 8, 0x0100}},}, + {"DEC", 0x7a00, 0xfeff, 1 | P_EXT, 1, {{P_ACCM, 1, 0, 8, 0x0100}},}, + {"INC", 0x7600, 0xfeff, 1 | P_EXT, 1, {{P_ACCM, 1, 0, 8, 0x0100}},}, + + {"NEG", 0x7c00, 0xfeff, 1 | P_EXT, 1, {{P_ACCM, 1, 0, 8, 0x0100}},}, + + {"TST", 0xb100, 0xf7ff, 1 | P_EXT, 1, {{P_ACCM, 1, 0, 11, 0x0800}},}, + {"TSTAXH", 0x8600, 0xfeff, 1 | P_EXT, 1, {{P_REG1A, 1, 0, 8, 0x0100}},}, + {"CMP", 0x8200, 0xffff, 1 | P_EXT, 0, {},}, + {"CMPAXH", 0xc100, 0xe7ff, 1 | P_EXT, 2, {{P_ACCM, 1, 0, 12, 0x1000}, {P_REG1A, 1, 0, 11, 0x0800}},}, + + {"CLR", 0x8100, 0xf7ff, 1 | P_EXT, 1, {{P_ACCM, 1, 0, 11, 0x0800}},}, + {"CLRP", 0x8400, 0xffff, 1 | P_EXT, 0, {},}, + + {"MOV", 0x6c00, 0xfeff, 1 | P_EXT, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_ACCM_D, 1, 0, 8, 0x0100}},}, + {"MOVAX", 0x6800, 0xfcff, 1 | P_EXT, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_REG18, 1, 0, 9, 0x0200}},}, + {"MOVR", 0x6000, 0xf8ff, 1 | P_EXT, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_REG18, 1, 0, 9, 0x0600}},}, + {"MOVP", 0x6e00, 0xfeff, 1 | P_EXT, 1, {{P_ACCM, 1, 0, 8, 0x0100}},}, + {"MOVPZ", 0xfe00, 0xfeff, 1 | P_EXT, 1, {{P_ACCM, 1, 0, 8, 0x0100}},}, + + {"ADDPAXZ", 0xf800, 0xfcff, 1 | P_EXT, 2, {{P_ACCM, 1, 0, 9, 0x0200}, {P_REG1A, 1, 0, 8, 0x0100}},}, + {"ADDP", 0x4e00, 0xfeff, 1 | P_EXT, 1, {{P_ACCM, 1, 0, 8, 0x0100}},}, + + {"LSL16", 0xf000, 0xfeff, 1 | P_EXT, 1, {{P_ACCM, 1, 0, 8, 0x0100}},}, + {"LSR16", 0xf400, 0xfeff, 1 | P_EXT, 1, {{P_ACCM, 1, 0, 8, 0x0100}},}, + {"ASR16", 0x9100, 0xf7ff, 1 | P_EXT, 1, {{P_ACCM, 1, 0, 11, 0x0800}},}, + + {"XORR", 0x3000, 0xfcff, 1 | P_EXT, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_REG1A, 1, 0, 9, 0x0200}},}, + {"ANDR", 0x3400, 0xfcff, 1 | P_EXT, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_REG1A, 1, 0, 9, 0x0200}},}, + {"ORR", 0x3800, 0xfcff, 1 | P_EXT, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_REG1A, 1, 0, 9, 0x0200}},}, + {"ANDC", 0x3C00, 0xfeff, 1 | P_EXT, 1, {{P_ACCM, 1, 0, 8, 0x0100}},}, + {"ORC", 0x3E00, 0xfeff, 1 | P_EXT, 1, {{P_ACCM, 1, 0, 8, 0x0100}},}, + + {"MULX", 0xa000, 0xe7ff, 1 | P_EXT, 2, {{P_REG18, 1, 0, 11, 0x1000}, {P_REG19, 1, 0, 10, 0x0800}},}, + {"MULXAC", 0xa400, 0xe6ff, 1 | P_EXT, 3, {{P_REG18, 1, 0, 11, 0x1000}, {P_REG19, 1, 0, 10, 0x0800}, {P_ACCM, 1, 0, 8, 0x0100}},}, + {"MULXMV", 0xa600, 0xe6ff, 1 | P_EXT, 3, {{P_REG18, 1, 0, 11, 0x1000}, {P_REG19, 1, 0, 10, 0x0800}, {P_ACCM, 1, 0, 8, 0x0100}},}, + {"MULXMVZ", 0xa200, 0xe6ff, 1 | P_EXT, 3, {{P_REG18, 1, 0, 11, 0x1000}, {P_REG19, 1, 0, 10, 0x0800}, {P_ACCM, 1, 0, 8, 0x0100}},}, + + {"MUL", 0x9000, 0xf7ff, 1 | P_EXT, 2, {{P_REG18, 1, 0, 11, 0x0800}, {P_REG1A, 1, 0, 11, 0x0800}},}, + {"MULAC", 0x9400, 0xf6ff, 1 | P_EXT, 3, {{P_REG18, 1, 0, 11, 0x0800}, {P_REG1A, 1, 0, 11, 0x0800}, {P_ACCM, 1, 0, 8, 0x0100}},}, + {"MULMV", 0x9600, 0xf6ff, 1 | P_EXT, 3, {{P_REG18, 1, 0, 11, 0x0800}, {P_REG1A, 1, 0, 11, 0x0800}, {P_ACCM, 1, 0, 8, 0x0100}},}, + {"MULMVZ", 0x9200, 0xf6ff, 1 | P_EXT, 3, {{P_REG18, 1, 0, 11, 0x0800}, {P_REG1A, 1, 0, 11, 0x0800}, {P_ACCM, 1, 0, 8, 0x0100}},}, + + {"MULC", 0xc000, 0xe7ff, 1 | P_EXT, 2, {{P_REG1A, 1, 0, 11, 0x0800}, {P_ACCM, 1, 0, 12, 0x1000}},}, + {"MULCAC", 0xc400, 0xe6ff, 1 | P_EXT, 3, {{P_REG1A, 1, 0, 11, 0x0800}, {P_ACCM, 1, 0, 12, 0x1000}, {P_ACCM, 1, 0, 8, 0x0100}},}, + {"MULCMV", 0xc600, 0xe6ff, 1 | P_EXT, 3, {{P_REG1A, 1, 0, 11, 0x0800}, {P_ACCM, 1, 0, 12, 0x1000}, {P_ACCM, 1, 0, 8, 0x0100}},}, + {"MULCMVZ", 0xc200, 0xe6ff, 1 | P_EXT, 3, {{P_REG1A, 1, 0, 11, 0x0800}, {P_ACCM, 1, 0, 12, 0x1000}, {P_ACCM, 1, 0, 8, 0x0100}},}, + + {"ADDR", 0x4000, 0xf8ff, 1 | P_EXT, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_REG18, 1, 0, 9, 0x0600}},}, + {"ADDAX", 0x4800, 0xfcff, 1 | P_EXT, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_REG18, 1, 0, 9, 0x0200}},}, + {"ADD", 0x4c00, 0xfeff, 1 | P_EXT, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_ACCM_D, 1, 0, 8, 0x0100}},}, + {"ADDAXL", 0x7000, 0xfcff, 1 | P_EXT, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_REG18, 1, 0, 9, 0x0200}},}, + + {"SUBR", 0x5000, 0xf8ff, 1 | P_EXT, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_REG18, 1, 0, 9, 0x0600}},}, + {"SUBAX", 0x5800, 0xfcff, 1 | P_EXT, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_REG18, 1, 0, 9, 0x0200}},}, + {"SUB", 0x5c00, 0xfeff, 1 | P_EXT, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_ACCM_D, 1, 0, 8, 0x0100}},}, + + {"MADD", 0xf200, 0xfeff, 1 | P_EXT, 2, {{P_REG18, 1, 0, 8, 0x0100}, {P_REG1A, 1, 0, 8, 0x0100}},}, + {"MSUB", 0xf600, 0xfeff, 1 | P_EXT, 2, {{P_REG18, 1, 0, 8, 0x0100}, {P_REG1A, 1, 0, 8, 0x0100}},}, + {"MADDX", 0xe000, 0xfcff, 1 | P_EXT, 2, {{P_REG18, 1, 0, 8, 0x0200}, {P_REG19, 1, 0, 7, 0x0100}},}, + {"MSUBX", 0xe400, 0xfcff, 1 | P_EXT, 2, {{P_REG18, 1, 0, 8, 0x0200}, {P_REG19, 1, 0, 7, 0x0100}},}, + {"MADDC", 0xe800, 0xfcff, 1 | P_EXT, 2, {{P_ACCM, 1, 0, 9, 0x0200}, {P_REG19, 1, 0, 7, 0x0100}},}, + {"MSUBC", 0xec00, 0xfcff, 1 | P_EXT, 2, {{P_ACCM, 1, 0, 9, 0x0200}, {P_REG19, 1, 0, 7, 0x0100}},}, + + // assemble CW + {"CW", 0x0000, 0xffff, 1, 1, {{P_VAL, 2, 0, 0, 0xffff}},}, + // unknown opcode for disassemble + {"CW", 0x0000, 0x0000, 1, 1, {{P_VAL, 2, 0, 0, 0xffff}},}, +}; +opc_t opcodes_ext[] = +{ + {"L", 0x0040, 0x00c4, 1, 2, {{P_REG18, 1, 0, 3, 0x0038}, {P_PRG, 1, 0, 0, 0x0003}},}, + {"LN", 0x0044, 0x00c4, 1, 2, {{P_REG18, 1, 0, 3, 0x0038}, {P_PRG, 1, 0, 0, 0x0003}},}, + {"LS", 0x0080, 0x00ce, 1, 2, {{P_REG18, 1, 0, 4, 0x0030}, {P_ACCM, 1, 0, 0, 0x0001}},}, + {"LSN", 0x0084, 0x00ce, 1, 2, {{P_REG18, 1, 0, 4, 0x0030}, {P_ACCM, 1, 0, 0, 0x0001}},}, + {"LSM", 0x0088, 0x00ce, 1, 2, {{P_REG18, 1, 0, 4, 0x0030}, {P_ACCM, 1, 0, 0, 0x0001}},}, + {"LSNM", 0x008c, 0x00ce, 1, 2, {{P_REG18, 1, 0, 4, 0x0030}, {P_ACCM, 1, 0, 0, 0x0001}},}, + {"SL", 0x0082, 0x00ce, 1, 2, {{P_ACCM, 1, 0, 0, 0x0001}, {P_REG18, 1, 0, 4, 0x0030}},}, + {"SLN", 0x0086, 0x00ce, 1, 2, {{P_ACCM, 1, 0, 0, 0x0001}, {P_REG18, 1, 0, 4, 0x0030}},}, + {"SLM", 0x008a, 0x00ce, 1, 2, {{P_ACCM, 1, 0, 0, 0x0001}, {P_REG18, 1, 0, 4, 0x0030}},}, + {"SLNM", 0x008e, 0x00ce, 1, 2, {{P_ACCM, 1, 0, 0, 0x0001}, {P_REG18, 1, 0, 4, 0x0030}},}, + {"S", 0x0020, 0x00e4, 1, 2, {{P_PRG, 1, 0, 0, 0x0003}, {P_REG1C, 1, 0, 3, 0x0018}},}, + {"SN", 0x0024, 0x00e4, 1, 2, {{P_PRG, 1, 0, 0, 0x0003}, {P_REG1C, 1, 0, 3, 0x0018}},}, + {"LDX", 0x00c0, 0x00cf, 1, 3, {{P_REG18, 1, 0, 4, 0x0010}, {P_REG1A, 1, 0, 4, 0x0010}, {P_PRG, 1, 0, 5, 0x0020}},}, + {"LDXN", 0x00c4, 0x00cf, 1, 3, {{P_REG18, 1, 0, 4, 0x0010}, {P_REG1A, 1, 0, 4, 0x0010}, {P_PRG, 1, 0, 5, 0x0020}},}, + {"LDXM", 0x00c8, 0x00cf, 1, 3, {{P_REG18, 1, 0, 4, 0x0010}, {P_REG1A, 1, 0, 4, 0x0010}, {P_PRG, 1, 0, 5, 0x0020}},}, + {"LDXNM", 0x00cc, 0x00cf, 1, 3, {{P_REG18, 1, 0, 4, 0x0010}, {P_REG1A, 1, 0, 4, 0x0010}, {P_PRG, 1, 0, 5, 0x0020}},}, + {"LD", 0x00c0, 0x00cc, 1, 3, {{P_REG18, 1, 0, 4, 0x0020}, {P_REG19, 1, 0, 3, 0x0010}, {P_PRG, 1, 0, 0, 0x0003}},}, + {"LDN", 0x00c4, 0x00cc, 1, 3, {{P_REG18, 1, 0, 4, 0x0020}, {P_REG19, 1, 0, 3, 0x0010}, {P_PRG, 1, 0, 0, 0x0003}},}, + {"LDM", 0x00c8, 0x00cc, 1, 3, {{P_REG18, 1, 0, 4, 0x0020}, {P_REG19, 1, 0, 3, 0x0010}, {P_PRG, 1, 0, 0, 0x0003}},}, + {"LDNM", 0x00cc, 0x00cc, 1, 3, {{P_REG18, 1, 0, 4, 0x0020}, {P_REG19, 1, 0, 3, 0x0010}, {P_PRG, 1, 0, 0, 0x0003}},}, + {"MV", 0x0010, 0x00f0, 1, 2, {{P_REG18, 1, 0, 2, 0x000c}, {P_REG1C, 1, 0, 0, 0x0003}},}, + {"DR", 0x0004, 0x00fc, 1, 1, {{P_REG, 1, 0, 0, 0x0003}},}, + {"IR", 0x0008, 0x00fc, 1, 1, {{P_REG, 1, 0, 0, 0x0003}},}, + {"NR", 0x000c, 0x00fc, 1, 1, {{P_REG, 1, 0, 0, 0x0003}},}, + {"XXX", 0x0000, 0x0000, 1, 1, {{P_VAL, 1, 0, 0, 0x00ff}},}, +}; + +const uint32 opcodes_size = sizeof(opcodes) / sizeof(opc_t); +const uint32 opcodes_ext_size = sizeof(opcodes_ext) / sizeof(opc_t); + diff --git a/Source/Plugins/Plugin_DSP_LLE/Src/opcodes.h b/Source/Plugins/Plugin_DSP_LLE/Src/opcodes.h new file mode 100644 index 0000000000..901f919d12 --- /dev/null +++ b/Source/Plugins/Plugin_DSP_LLE/Src/opcodes.h @@ -0,0 +1,86 @@ +/*==================================================================== + + filename: opcodes.h + project: GameCube DSP Tool (gcdsp) + created: 2005.03.04 + mail: duddie@walla.com + + Copyright (c) 2005 Duddie + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + ====================================================================*/ +#ifndef _OPCODES_H +#define _OPCODES_H + +typedef enum partype_t +{ + P_NONE = 0x0000, + P_VAL = 0x0001, + P_IMM = 0x0002, + P_MEM = 0x0003, + P_STR = 0x0004, + P_REG = 0x8000, + P_REG08 = P_REG | 0x0800, + P_REG10 = P_REG | 0x1000, + P_REG18 = P_REG | 0x1800, + P_REG19 = P_REG | 0x1900, + P_REG1A = P_REG | 0x1a00, + P_REG1C = P_REG | 0x1c00, + P_ACCM = P_REG | 0x1e00, + P_ACCM_D = P_REG | 0x1e80, + P_ACC = P_REG | 0x2000, + P_ACC_D = P_REG | 0x2080, + P_AX = P_REG | 0x2200, + P_AX_D = P_REG | 0x2280, + P_REGS_MASK = 0x03f80, + P_REF = P_REG | 0x4000, + P_PRG = P_REF | P_REG, +}; + +#define P_EXT 0x80 + +typedef struct opcpar_t +{ + partype_t type; + uint8 size; + uint8 loc; + sint8 lshift; + uint16 mask; +} opcpar_t; + +typedef struct opc_t +{ + const char* name; + uint16 opcode; + uint16 opcode_mask; + uint8 size; + uint8 param_count; + opcpar_t params[8]; +} opc_t; + +extern opc_t opcodes[]; +extern const uint32 opcodes_size; +extern opc_t opcodes_ext[]; +extern const uint32 opcodes_ext_size; + +inline uint16 swap16(uint16 x) +{ + return((x >> 8) | (x << 8)); +} + + +#endif + diff --git a/Source/Plugins/Plugin_DSP_LLE/Src/stdafx.cpp b/Source/Plugins/Plugin_DSP_LLE/Src/stdafx.cpp new file mode 100644 index 0000000000..5d19def11f --- /dev/null +++ b/Source/Plugins/Plugin_DSP_LLE/Src/stdafx.cpp @@ -0,0 +1,19 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "stdafx.h" + diff --git a/Source/Plugins/Plugin_DSP_LLE/Src/stdafx.h b/Source/Plugins/Plugin_DSP_LLE/Src/stdafx.h new file mode 100644 index 0000000000..c5352abd51 --- /dev/null +++ b/Source/Plugins/Plugin_DSP_LLE/Src/stdafx.h @@ -0,0 +1,36 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#pragma once + +#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers +#define _CRT_SECURE_NO_DEPRECATE 1 + +#include +#include + +// WTL +#include +#include + +#include +#include +#include +#include + +#include "PluginSpecs_DSP.h" + diff --git a/Source/Plugins/Plugin_DSP_NULL/Plugin_DSP_NULL.vcproj b/Source/Plugins/Plugin_DSP_NULL/Plugin_DSP_NULL.vcproj new file mode 100644 index 0000000000..5975945140 --- /dev/null +++ b/Source/Plugins/Plugin_DSP_NULL/Plugin_DSP_NULL.vcproj @@ -0,0 +1,805 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Source/Plugins/Plugin_DSP_NULL/Src/AboutDlg.cpp b/Source/Plugins/Plugin_DSP_NULL/Src/AboutDlg.cpp new file mode 100644 index 0000000000..815af0c230 --- /dev/null +++ b/Source/Plugins/Plugin_DSP_NULL/Src/AboutDlg.cpp @@ -0,0 +1,38 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "resource.h" + +#include "AboutDlg.h" + + +LRESULT +CAboutDlg::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) +{ + CenterWindow(GetParent()); + return(TRUE); +} + + +LRESULT +CAboutDlg::OnCloseCmd(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/) +{ + EndDialog(wID); + return(0); +} + + diff --git a/Source/Plugins/Plugin_DSP_NULL/Src/AboutDlg.h b/Source/Plugins/Plugin_DSP_NULL/Src/AboutDlg.h new file mode 100644 index 0000000000..e1c136907a --- /dev/null +++ b/Source/Plugins/Plugin_DSP_NULL/Src/AboutDlg.h @@ -0,0 +1,41 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#pragma once + +class CAboutDlg + : public CDialogImpl +{ + public: + + enum { IDD = IDD_ABOUT }; + + BEGIN_MSG_MAP(CAboutDlg) + MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) + COMMAND_ID_HANDLER(IDOK, OnCloseCmd) + COMMAND_ID_HANDLER(IDCANCEL, OnCloseCmd) + END_MSG_MAP() + +// Handler prototypes (uncomment arguments if needed): +// LRESULT MessageHandler(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) +// LRESULT CommandHandler(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) +// LRESULT NotifyHandler(int /*idCtrl*/, LPNMHDR /*pnmh*/, BOOL& /*bHandled*/) + + LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL & /*bHandled*/); + + LRESULT OnCloseCmd(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL & /*bHandled*/); +}; diff --git a/Source/Plugins/Plugin_DSP_NULL/Src/Config.cpp b/Source/Plugins/Plugin_DSP_NULL/Src/Config.cpp new file mode 100644 index 0000000000..ccd23d1d2b --- /dev/null +++ b/Source/Plugins/Plugin_DSP_NULL/Src/Config.cpp @@ -0,0 +1,87 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "Common.h" +#include "IniFile.h" +#include "Config.h" + +CConfig g_Config; + + +CConfig::CConfig() +{ + Load(); +} + + +void +CConfig::LoadDefaults() +{ + m_EnableHLEAudio = true; + m_EnableDTKMusic = true; + m_Interpolation = true; + m_DumpSampleMinLength = true; + m_SampleRate = 48000; + m_DumpSamples = false; + m_AntiGap = false; +} + + +void +CConfig::Load() +{ + // first load defaults + LoadDefaults(); + + IniFile file; + file.Load("DSP.ini"); + file.Get("Config", "EnableHLEAudio", &m_EnableHLEAudio, true); + file.Get("Config", "EnableDTKMusic", &m_EnableDTKMusic, true); + file.Get("Config", "Interpolation", &m_Interpolation, true); + file.Get("Config", "DumpSamples", &m_DumpSamples, false); + file.Get("Config", "DumpSampleMinLength", &m_DumpSampleMinLength, true); +#ifdef _WIN32 + file.Get("Config", "DumpSamplePath", &m_szSamplePath, "C:\\"); +#else + file.Get("Config", "DumpSamplePath", &m_szSamplePath, "/dev/null/"); +#endif + file.Get("Config", "SampleRate", &m_SampleRate, 48000); + file.Get("Config", "AntiGap", &m_AntiGap, false); +} + + +void +CConfig::Save() +{ + IniFile file; + file.Load("DSP.ini"); + file.Set("Config", "EnableHLEAudio", m_EnableHLEAudio); + file.Set("Config", "EnableDTKMusic", m_EnableDTKMusic); + file.Set("Config", "Interpolation", m_Interpolation); + file.Set("Config", "DumpSamples", m_DumpSamples); + file.Set("Config", "DumpSampleMinLength", m_DumpSampleMinLength); +#ifdef _WIN32 + file.Set("Config", "DumpSamplePath", m_szSamplePath); +#else + file.Set("Config", "DumpSamplePath", m_szSamplePath); +#endif + file.Set("Config", "SampleRate", m_SampleRate); + file.Set("Config", "AntiGap", m_AntiGap); + file.Save("DSP.ini"); +} + + diff --git a/Source/Plugins/Plugin_DSP_NULL/Src/Config.h b/Source/Plugins/Plugin_DSP_NULL/Src/Config.h new file mode 100644 index 0000000000..6ee9b31895 --- /dev/null +++ b/Source/Plugins/Plugin_DSP_NULL/Src/Config.h @@ -0,0 +1,46 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef _CONFIG_H +#define _CONFIG_H + +#include + +struct CConfig +{ + bool m_AntiGap; + bool m_EnableHLEAudio; + bool m_EnableDTKMusic; + bool m_Interpolation; + bool m_DumpSamples; + std::string m_szSamplePath; + int m_SampleRate; + bool m_DumpSampleMinLength; + + CConfig(); + + void LoadDefaults(); + + void Load(); + + void Save(); +}; + +extern CConfig g_Config; + +#endif + diff --git a/Source/Plugins/Plugin_DSP_NULL/Src/ConfigDlg.cpp b/Source/Plugins/Plugin_DSP_NULL/Src/ConfigDlg.cpp new file mode 100644 index 0000000000..2dca38c5c1 --- /dev/null +++ b/Source/Plugins/Plugin_DSP_NULL/Src/ConfigDlg.cpp @@ -0,0 +1,70 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "resource.h" + +#include "Config.h" +#include "ConfigDlg.h" + +LRESULT +CConfigDlg::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) +{ + g_Config.Load(); + //CenterWindow(this->GetParent()); + CenterWindow(GetParent()); + m_buttonEnableHLEAudio = GetDlgItem(IDC_ENABLE_HLE_AUDIO); + m_buttonEnableDTKMusic = GetDlgItem(IDC_ENABLE_DTK_MUSIC); + m_buttonAntiGap = GetDlgItem(IDC_ANTIGAP); + m_buttonDumpSamples = GetDlgItem(IDC_DUMPSAMPLES); + m_editDumpSamplePath = GetDlgItem(IDC_SAMPLEDUMPPATH); + m_comboSampleRate = GetDlgItem(IDC_SAMPLERATE); + + m_buttonEnableHLEAudio.SetCheck(g_Config.m_EnableHLEAudio ? BST_CHECKED : BST_UNCHECKED); + m_buttonEnableDTKMusic.SetCheck(g_Config.m_EnableDTKMusic ? BST_CHECKED : BST_UNCHECKED); + m_buttonAntiGap.SetCheck(g_Config.m_AntiGap ? BST_CHECKED : BST_UNCHECKED); + m_buttonDumpSamples.SetCheck(g_Config.m_DumpSamples ? BST_CHECKED : BST_UNCHECKED); + m_editDumpSamplePath.SetWindowText(g_Config.m_szSamplePath.c_str()); + m_comboSampleRate.AddString("44100"); + m_comboSampleRate.AddString("48000"); + m_comboSampleRate.SetCurSel(g_Config.m_SampleRate == 44100 ? 0 : 1); + + return(TRUE); +} + + +LRESULT +CConfigDlg::OnCloseCmd(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/) +{ + if (wID == IDOK) + { + g_Config.m_EnableHLEAudio = (m_buttonEnableHLEAudio.GetCheck() == BST_CHECKED) ? true : false; + g_Config.m_EnableDTKMusic = (m_buttonEnableDTKMusic.GetCheck() == BST_CHECKED) ? true : false; + g_Config.m_DumpSamples = (m_buttonDumpSamples.GetCheck() == BST_CHECKED) ? true : false; + g_Config.m_AntiGap = (m_buttonAntiGap.GetCheck() == BST_CHECKED) ? true : false; + char temp[MAX_PATH]; + m_editDumpSamplePath.GetWindowText(temp, MAX_PATH); + g_Config.m_szSamplePath = temp; + g_Config.m_SampleRate = (m_comboSampleRate.GetCurSel() == 0 ? 44100 : 48000); + g_Config.Save(); + } + + EndDialog(wID); + g_Config.Save(); + return(0); +} + + diff --git a/Source/Plugins/Plugin_DSP_NULL/Src/ConfigDlg.h b/Source/Plugins/Plugin_DSP_NULL/Src/ConfigDlg.h new file mode 100644 index 0000000000..c170a68d6e --- /dev/null +++ b/Source/Plugins/Plugin_DSP_NULL/Src/ConfigDlg.h @@ -0,0 +1,49 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#pragma once + +class CConfigDlg + : public CDialogImpl +{ + public: + + enum { IDD = IDD_SETTINGS }; + + BEGIN_MSG_MAP(CConfigDlg) + MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) + COMMAND_ID_HANDLER(IDOK, OnCloseCmd) + COMMAND_ID_HANDLER(IDCANCEL, OnCloseCmd) + END_MSG_MAP() + + private: + + CButton m_buttonEnableHLEAudio; + CButton m_buttonEnableDTKMusic; + CButton m_buttonDumpSamples; + CButton m_buttonAntiGap; + CEdit m_editDumpSamplePath; + CComboBox m_comboSampleRate; + + // Handler prototypes (uncomment arguments if needed): + // LRESULT MessageHandler(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) + // LRESULT CommandHandler(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) + // LRESULT NotifyHandler(int /*idCtrl*/, LPNMHDR /*pnmh*/, BOOL& /*bHandled*/) + + LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL & /*bHandled*/); + LRESULT OnCloseCmd(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL & /*bHandled*/); +}; diff --git a/Source/Plugins/Plugin_DSP_NULL/Src/DSPHandler.cpp b/Source/Plugins/Plugin_DSP_NULL/Src/DSPHandler.cpp new file mode 100644 index 0000000000..5b01c7481a --- /dev/null +++ b/Source/Plugins/Plugin_DSP_NULL/Src/DSPHandler.cpp @@ -0,0 +1,105 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifdef _WIN32 +#include "PCHW/DSoundStream.h" +#endif + +#include "DSPHandler.h" + +CDSPHandler* CDSPHandler::m_pInstance = NULL; + +CDSPHandler::CDSPHandler() + : m_pUCode(NULL), + m_bHalt(false), + m_bAssertInt(false) +{ + SetUCode(UCODE_ROM); + m_DSPControl.DSPHalt = 1; + m_DSPControl.DSPInit = 1; +} + + +CDSPHandler::~CDSPHandler() +{ + SAFE_DELETE(m_pUCode); +} + + +void CDSPHandler::Update() +{ + if (m_pUCode != NULL) + { + m_pUCode->Update(); + } +} + + +unsigned short CDSPHandler::WriteControlRegister(unsigned short _Value) +{ + UDSPControl Temp(_Value); + + if (Temp.DSPReset) + { + SetUCode(UCODE_ROM); + Temp.DSPReset = 0; + } + + if (Temp.DSPInit == 0) + { + // copy 128 byte from ARAM 0x000000 to IMEM + SetUCode(UCODE_INIT_AUDIO_SYSTEM); + Temp.DSPInitCode = 0; + // MessageBox(NULL, "UCODE_INIT_AUDIO_SYSTEM", "DSP-HLE", MB_OK); + } + + m_DSPControl.Hex = Temp.Hex; + + return(m_DSPControl.Hex); +} + + +unsigned short CDSPHandler::ReadControlRegister() +{ + return(m_DSPControl.Hex); +} + + +void CDSPHandler::SendMailToDSP(u32 _uMail) +{ + if (m_pUCode != NULL) + { + m_pUCode->HandleMail(_uMail); + } +} + + +IUCode* CDSPHandler::GetUCode() +{ + return(m_pUCode); +} + + +void CDSPHandler::SetUCode(u32 _crc) +{ + SAFE_DELETE(m_pUCode); + + m_MailHandler.Clear(); + m_pUCode = UCodeFactory(_crc, m_MailHandler); +} + + diff --git a/Source/Plugins/Plugin_DSP_NULL/Src/DSPHandler.h b/Source/Plugins/Plugin_DSP_NULL/Src/DSPHandler.h new file mode 100644 index 0000000000..6b76234da9 --- /dev/null +++ b/Source/Plugins/Plugin_DSP_NULL/Src/DSPHandler.h @@ -0,0 +1,107 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ +#ifndef _DSPHANDLER_H +#define _DSPHANDLER_H + +#include "Common.h" +#include "MailHandler.h" +#include "UCodes/UCodes.h" + +// CDSPHandler +class CDSPHandler +{ + public: + + void Update(); + unsigned short WriteControlRegister(unsigned short _Value); + unsigned short ReadControlRegister(); + void SendMailToDSP(u32 _uMail); + IUCode* GetUCode(); + void SetUCode(u32 _crc); + + + CMailHandler& AccessMailHandler() {return(m_MailHandler);} + + + static CDSPHandler& GetInstance() + { + return(*m_pInstance); + } + + + static void Destroy() + { + SAFE_DELETE(m_pInstance); + } + + + static CDSPHandler& CreateInstance() + { + if (m_pInstance == NULL) + { + m_pInstance = new CDSPHandler(); + } + + return(*m_pInstance); + } + + + private: + + CDSPHandler(); + ~CDSPHandler(); + + // UDSPControl + union UDSPControl + { + u16 Hex; + struct + { + unsigned DSPReset : 1; // Write 1 to reset and waits for 0 + unsigned DSPAssertInt : 1; + unsigned DSPHalt : 1; + + unsigned AI : 1; + unsigned AI_mask : 1; + unsigned ARAM : 1; + unsigned ARAM_mask : 1; + unsigned DSP : 1; + unsigned DSP_mask : 1; + + unsigned ARAM_DMAState : 1; // DSPGetDMAStatus() uses this flag + unsigned DSPInitCode : 1; + unsigned DSPInit : 1; // DSPInit() writes to this flag + unsigned pad : 4; + }; + + UDSPControl(u16 _Hex = 0) + : Hex(_Hex) + {} + }; + + // singleton instance + static CDSPHandler* m_pInstance; + + IUCode* m_pUCode; + UDSPControl m_DSPControl; + CMailHandler m_MailHandler; + + bool m_bHalt; + bool m_bAssertInt; +}; + +#endif diff --git a/Source/Plugins/Plugin_DSP_NULL/Src/Globals.cpp b/Source/Plugins/Plugin_DSP_NULL/Src/Globals.cpp new file mode 100644 index 0000000000..aceedb95b0 --- /dev/null +++ b/Source/Plugins/Plugin_DSP_NULL/Src/Globals.cpp @@ -0,0 +1,55 @@ +#include +#include + +#include "Common.h" +#include "Globals.h" + + +void DebugLog(const char* _fmt, ...) +{ +#ifdef _DEBUG + char Msg[512]; + va_list ap; + + va_start(ap, _fmt); + vsprintf(Msg, _fmt, ap); + va_end(ap); + + g_dspInitialize.pLog(Msg); +#endif +} + + +extern u8* g_pMemory; + +// TODO: Wii support? +#define RAM_MASK 0x1FFFFFF + +u8 Memory_Read_U8(u32 _uAddress) +{ + _uAddress &= RAM_MASK; + return(g_pMemory[_uAddress]); +} + + +u16 Memory_Read_U16(u32 _uAddress) +{ + _uAddress &= RAM_MASK; + return(Common::swap16(*(u16*)&g_pMemory[_uAddress])); +} + + +u32 Memory_Read_U32(u32 _uAddress) +{ + _uAddress &= RAM_MASK; + return(Common::swap32(*(u32*)&g_pMemory[_uAddress])); +} + + +float Memory_Read_Float(u32 _uAddress) +{ + u32 uTemp = Memory_Read_U32(_uAddress); + return(*(float*)&uTemp); +} + + diff --git a/Source/Plugins/Plugin_DSP_NULL/Src/Globals.h b/Source/Plugins/Plugin_DSP_NULL/Src/Globals.h new file mode 100644 index 0000000000..cb514eb5a1 --- /dev/null +++ b/Source/Plugins/Plugin_DSP_NULL/Src/Globals.h @@ -0,0 +1,17 @@ +#ifndef _GLOBALS_H +#define _GLOBALS_H + +#include "Common.h" +#include "pluginspecs_dsp.h" + +extern DSPInitialize g_dspInitialize; +void DebugLog(const char* _fmt, ...); + +u8 Memory_Read_U8(u32 _uAddress); +u16 Memory_Read_U16(u32 _uAddress); +u32 Memory_Read_U32(u32 _uAddress); +float Memory_Read_Float(u32 _uAddress); + + +#endif + diff --git a/Source/Plugins/Plugin_DSP_NULL/Src/MailHandler.cpp b/Source/Plugins/Plugin_DSP_NULL/Src/MailHandler.cpp new file mode 100644 index 0000000000..3e2931fb7e --- /dev/null +++ b/Source/Plugins/Plugin_DSP_NULL/Src/MailHandler.cpp @@ -0,0 +1,112 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "MailHandler.h" + + +CMailHandler::CMailHandler() +{} + + +CMailHandler::~CMailHandler() +{ + Clear(); +} + + +void CMailHandler::PushMail(u32 _Mail) +{ + m_Mails.push(_Mail); + + Update(); +} + + +u16 +CMailHandler::ReadDSPMailboxHigh() +{ + // check if we have a mail for the core + if (!m_Mails.empty()) + { + u16 result = (m_Mails.front() >> 16) & 0xFFFF; + + Update(); + + return(result); + } + + return(0x00); +} + + +u16 +CMailHandler::ReadDSPMailboxLow() +{ + // check if we have a mail for the core + if (!m_Mails.empty()) + { + u16 result = m_Mails.front() & 0xFFFF; + m_Mails.pop(); + + Update(); + + return(result); + } + + return(0x00); +} + + +void CMailHandler::Clear() +{ + while (!m_Mails.empty()) + { + m_Mails.pop(); + } +} + + +bool +CMailHandler::IsEmpty() +{ + return(m_Mails.empty()); +} + + +void +CMailHandler::Halt(bool _Halt) +{ + if (_Halt) + { + Clear(); + m_Mails.push(0x80544348); + } + + Update(); +} + + +void +CMailHandler::Update() +{ + if (!IsEmpty()) + { + // g_dspInitialize.pGenerateDSPInterrupt(); + } +} + + diff --git a/Source/Plugins/Plugin_DSP_NULL/Src/MailHandler.h b/Source/Plugins/Plugin_DSP_NULL/Src/MailHandler.h new file mode 100644 index 0000000000..270f35fb4f --- /dev/null +++ b/Source/Plugins/Plugin_DSP_NULL/Src/MailHandler.h @@ -0,0 +1,55 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef _MAILHANDLER_H +#define _MAILHANDLER_H + +#include + +#include "Common.h" + +class CMailHandler +{ + public: + + CMailHandler(); + + ~CMailHandler(); + + void PushMail(u32 _Mail); + + void Clear(); + + void Halt(bool _Halt); + + bool IsEmpty(); + + u16 ReadDSPMailboxHigh(); + + u16 ReadDSPMailboxLow(); + + void Update(); + + + private: + + // mail handler + std::queuem_Mails; +}; + +#endif + diff --git a/Source/Plugins/Plugin_DSP_NULL/Src/PCHW/DSoundStream.cpp b/Source/Plugins/Plugin_DSP_NULL/Src/PCHW/DSoundStream.cpp new file mode 100644 index 0000000000..0161fc14e8 --- /dev/null +++ b/Source/Plugins/Plugin_DSP_NULL/Src/PCHW/DSoundStream.cpp @@ -0,0 +1,254 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "stdafx.h" + +#include +#include + +#include "dsoundstream.h" + +namespace DSound +{ +#define BUFSIZE 32768 +#define MAXWAIT 70 //ms + +CRITICAL_SECTION soundCriticalSection; +HANDLE soundSyncEvent; +HANDLE hThread; + +StreamCallback callback; + +//lite mojs +IDirectSound8* ds; +IDirectSoundBuffer* dsBuffer; + +//tja.. behövs +int bufferSize; //i bytes +int totalRenderedBytes; +int sampleRate; + +//med den här synkar vi stängning.. +//0=vi spelar oväsen, 1=stäng tråden NU! +volatile int threadData; + +inline int FIX128(int x) +{ + return(x & (~127)); +} + + +int DSound_GetSampleRate() +{ + return(sampleRate); +} + + +bool CreateBuffer() +{ + PCMWAVEFORMAT pcmwf; + DSBUFFERDESC dsbdesc; + + memset(&pcmwf, 0, sizeof(PCMWAVEFORMAT)); + memset(&dsbdesc, 0, sizeof(DSBUFFERDESC)); + + pcmwf.wf.wFormatTag = WAVE_FORMAT_PCM; + pcmwf.wf.nChannels = 2; + pcmwf.wf.nSamplesPerSec = sampleRate; + pcmwf.wf.nBlockAlign = 4; + pcmwf.wf.nAvgBytesPerSec = pcmwf.wf.nSamplesPerSec * pcmwf.wf.nBlockAlign; + pcmwf.wBitsPerSample = 16; + + //buffer description + dsbdesc.dwSize = sizeof(DSBUFFERDESC); + dsbdesc.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_STICKYFOCUS; //VIKTIGT //DSBCAPS_CTRLPAN | DSBCAPS_CTRLVOLUME | DSBCAPS_CTRLFREQUENCY; + dsbdesc.dwBufferBytes = bufferSize = BUFSIZE; + dsbdesc.lpwfxFormat = (WAVEFORMATEX*)&pcmwf; + + if (SUCCEEDED(ds->CreateSoundBuffer(&dsbdesc, &dsBuffer, NULL))) + { + dsBuffer->SetCurrentPosition(0); + return(true); + } + else + { + // Failed. + dsBuffer = NULL; + return(false); + } +} + + +bool WriteDataToBuffer(DWORD dwOffset, // Our own write cursor. + char* soundData, // Start of our data. + DWORD dwSoundBytes) // Size of block to copy. +{ + void* ptr1, * ptr2; + DWORD numBytes1, numBytes2; + // Obtain memory address of write block. This will be in two parts if the block wraps around. + HRESULT hr = dsBuffer->Lock(dwOffset, dwSoundBytes, &ptr1, &numBytes1, &ptr2, &numBytes2, 0); + + // If the buffer was lost, restore and retry lock. + if (DSERR_BUFFERLOST == hr) + { + dsBuffer->Restore(); + hr = dsBuffer->Lock(dwOffset, dwSoundBytes, &ptr1, &numBytes1, &ptr2, &numBytes2, 0); + } + + if (SUCCEEDED(hr)) + { + memcpy(ptr1, soundData, numBytes1); + + if (ptr2 != 0) + { + memcpy(ptr2, soundData + numBytes1, numBytes2); + } + + // Release the data back to DirectSound. + dsBuffer->Unlock(ptr1, numBytes1, ptr2, numBytes2); + return(true); + } + + return(false); +} + + +inline int ModBufferSize(int x) +{ + return((x + bufferSize) % bufferSize); +} + + +int currentPos; +int lastPos; +short realtimeBuffer[1024 * 1024]; + +//Själva tråden +DWORD WINAPI soundThread(void*) +{ + currentPos = 0; + lastPos = 0; + + // Prefill buffer? + //writeDataToBuffer(0,realtimeBuffer,bufferSize); + // dsBuffer->Lock(0, bufferSize, (void **)&p1, &num1, (void **)&p2, &num2, 0); + dsBuffer->Play(0, 0, DSBPLAY_LOOPING); + + while (!threadData) + { + // No blocking inside the csection + EnterCriticalSection(&soundCriticalSection); + dsBuffer->GetCurrentPosition((DWORD*)¤tPos, 0); + int numBytesToRender = FIX128(ModBufferSize(currentPos - lastPos)); + + if (numBytesToRender >= 256) + { + (*callback)(realtimeBuffer, numBytesToRender >> 2, 16, 44100, 2); + + WriteDataToBuffer(lastPos, (char*)realtimeBuffer, numBytesToRender); + currentPos = ModBufferSize(lastPos + numBytesToRender); + totalRenderedBytes += numBytesToRender; + + lastPos = currentPos; + } + + LeaveCriticalSection(&soundCriticalSection); + WaitForSingleObject(soundSyncEvent, MAXWAIT); + } + + dsBuffer->Stop(); + return(0); //hurra! +} + + +bool DSound_StartSound(HWND window, int _sampleRate, StreamCallback _callback) +{ + callback = _callback; + threadData = 0; + sampleRate = _sampleRate; + + //no security attributes, automatic resetting, init state nonset, untitled + soundSyncEvent = CreateEvent(0, false, false, 0); + + //vi initierar den........... + InitializeCriticalSection(&soundCriticalSection); + + //vi vill ha access till DSOUND så... + if (FAILED(DirectSoundCreate8(0, &ds, 0))) + { + return(false); + } + + ds->SetCooperativeLevel(window, DSSCL_NORMAL); + + if (!CreateBuffer()) + { + return(false); + } + + DWORD num1; + short* p1; + dsBuffer->Lock(0, bufferSize, (void* *)&p1, &num1, 0, 0, 0); + memset(p1, 0, num1); + dsBuffer->Unlock(p1, num1, 0, 0); + totalRenderedBytes = -bufferSize; + DWORD h; + hThread = CreateThread(0, 0, soundThread, 0, 0, &h); + SetThreadPriority(hThread, THREAD_PRIORITY_ABOVE_NORMAL); + return(true); +} + + +void DSound_UpdateSound() +{ + SetEvent(soundSyncEvent); +} + + +void DSound_StopSound() +{ + EnterCriticalSection(&soundCriticalSection); + threadData = 1; + //kick the thread if it's waiting + SetEvent(soundSyncEvent); + LeaveCriticalSection(&soundCriticalSection); + WaitForSingleObject(hThread, INFINITE); + CloseHandle(hThread); + + dsBuffer->Release(); + ds->Release(); + + CloseHandle(soundSyncEvent); +} + + +int DSound_GetCurSample() +{ + EnterCriticalSection(&soundCriticalSection); + int playCursor; + dsBuffer->GetCurrentPosition((DWORD*)&playCursor, 0); + playCursor = ModBufferSize(playCursor - lastPos) + totalRenderedBytes; + LeaveCriticalSection(&soundCriticalSection); + return(playCursor); +} + + +float DSound_GetTimer() +{ + return((float)DSound_GetCurSample() * (1.0f / (4.0f * 44100.0f))); +} +} diff --git a/Source/Plugins/Plugin_DSP_NULL/Src/PCHW/DSoundStream.h b/Source/Plugins/Plugin_DSP_NULL/Src/PCHW/DSoundStream.h new file mode 100644 index 0000000000..f27293c997 --- /dev/null +++ b/Source/Plugins/Plugin_DSP_NULL/Src/PCHW/DSoundStream.h @@ -0,0 +1,35 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef __SOUNDSTREAM_H__ +#define __SOUNDSTREAM_H__ + +namespace DSound +{ +typedef void (*StreamCallback)(short* buffer, int numSamples, int bits, int rate, int channels); + +bool DSound_StartSound(HWND window, int sampleRate, StreamCallback _callback); +void DSound_UpdateSound(); +void DSound_StopSound(); + +float DSound_GetTimer(); +int DSound_GetCurSample(); +int DSound_GetSampleRate(); +} + + +#endif //__SOUNDSTREAM_H__ diff --git a/Source/Plugins/Plugin_DSP_NULL/Src/PCHW/Mixer.cpp b/Source/Plugins/Plugin_DSP_NULL/Src/PCHW/Mixer.cpp new file mode 100644 index 0000000000..f1644068eb --- /dev/null +++ b/Source/Plugins/Plugin_DSP_NULL/Src/PCHW/Mixer.cpp @@ -0,0 +1,48 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "../Config.h" +#include "../Globals.h" +#include "../DSPHandler.h" +#include "Mixer.h" + +volatile bool mixer_HLEready = false; + +void Mixer(short* buffer, int numSamples, int bits, int rate, int channels) +{ + // silence + memset(buffer, 0, numSamples * 2 * sizeof(short)); + + // first get th DTK Music + if (g_Config.m_EnableDTKMusic) + { + g_dspInitialize.pGetAudioStreaming(buffer, numSamples); + } + + //if this was called directly from the HLE, and not by timeout + if (g_Config.m_EnableHLEAudio && (mixer_HLEready || g_Config.m_AntiGap)) + { + IUCode* pUCode = CDSPHandler::GetInstance().GetUCode(); + + if (pUCode != NULL) + { + pUCode->MixAdd(buffer, numSamples); + } + } +} + + diff --git a/Source/Plugins/Plugin_DSP_NULL/Src/PCHW/Mixer.h b/Source/Plugins/Plugin_DSP_NULL/Src/PCHW/Mixer.h new file mode 100644 index 0000000000..359efc0f4f --- /dev/null +++ b/Source/Plugins/Plugin_DSP_NULL/Src/PCHW/Mixer.h @@ -0,0 +1,26 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef _MIXER_H +#define _MIXER_H + +extern volatile bool mixer_HLEready; +void Mixer(short* buffer, int numSamples, int bits, int rate, int channels); + + +#endif + diff --git a/Source/Plugins/Plugin_DSP_NULL/Src/SConscript b/Source/Plugins/Plugin_DSP_NULL/Src/SConscript new file mode 100644 index 0000000000..4d7c66883b --- /dev/null +++ b/Source/Plugins/Plugin_DSP_NULL/Src/SConscript @@ -0,0 +1,17 @@ +Import('env') + +files = ["DSPHandler.cpp", + "MailHandler.cpp", + "main.cpp", + "Config.cpp", + "Globals.cpp", + "PCHW/Mixer.cpp", + "UCodes/UCode_AX.cpp", + "UCodes/UCode_CARD.cpp", + "UCodes/UCode_InitAudioSystem.cpp", + "UCodes/UCode_Jac.cpp", + "UCodes/UCode_ROM.cpp", + "UCodes/UCodes.cpp", + "UCodes/UCode_Zelda.cpp", + ] +env.SharedLibrary("../../../../Binary/linux/Plugins/dsphle.so", files, LIBS = ["common"]) diff --git a/Source/Plugins/Plugin_DSP_NULL/Src/UCodes/UCode_AX.cpp b/Source/Plugins/Plugin_DSP_NULL/Src/UCodes/UCode_AX.cpp new file mode 100644 index 0000000000..225400ce21 --- /dev/null +++ b/Source/Plugins/Plugin_DSP_NULL/Src/UCodes/UCode_AX.cpp @@ -0,0 +1,244 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "Common.h" +#include "../Globals.h" + +#ifdef _WIN32 +#include "../PCHW/DSoundStream.h" +#endif +#include "../PCHW/Mixer.h" +#include "../MailHandler.h" + +#include "UCodes.h" +#include "UCode_AX.h" + +CUCode_AX::CUCode_AX(CMailHandler& _rMailHandler) + : IUCode(_rMailHandler) +{ + // we got loaded + m_rMailHandler.PushMail(0xDCD10000); + m_rMailHandler.PushMail(0x80000000); // handshake ??? only (crc == 0xe2136399) needs it ... +} + + +CUCode_AX::~CUCode_AX() +{ + m_rMailHandler.Clear(); +} + + +void CUCode_AX::HandleMail(u32 _uMail) +{ + if ((_uMail & 0xFFFF0000) == 0xBABE0000) + { + // a new List + } + else + { + AXTask(_uMail); + } +} + + +void +CUCode_AX::MixAdd(short* _pBuffer, int _iSize) +{} + + +void CUCode_AX::Update() +{ + // check if we have to sent something + if (!m_rMailHandler.IsEmpty()) + { + g_dspInitialize.pGenerateDSPInterrupt(); + } +} + + +bool CUCode_AX::AXTask(u32& _uMail) +{ + u32 uAddress = _uMail; + + DebugLog("AXTask - AXCommandList-Addr: 0x%08x", uAddress); + + u32 Addr__AXStudio; + u32 Addr__AXOutSBuffer; + u32 Addr__AXOutSBuffer_1; + u32 Addr__AXOutSBuffer_2; + + u32 Addr__A; + u32 Addr__12; + u32 Addr__4_1; + u32 Addr__4_2; + u32 Addr__5_1; + u32 Addr__5_2; + u32 Addr__6; + u32 Addr__9; + + bool bExecuteList = true; + + while (bExecuteList) + { + u16 iCommand = Memory_Read_U16(uAddress); + uAddress += 2; + + switch (iCommand) + { + case 0x00: //00 + Addr__AXStudio = Memory_Read_U32(uAddress); + uAddress += 4; + DebugLog("AXLIST studio address: %08x", Addr__AXStudio); + break; + + case 0x001: + { + u32 address = Memory_Read_U32(uAddress); + uAddress += 4; + u16 param1 = Memory_Read_U16(uAddress); + uAddress += 2; + u16 param2 = Memory_Read_U16(uAddress); + uAddress += 2; + u16 param3 = Memory_Read_U16(uAddress); + uAddress += 2; + DebugLog("AXLIST 1: %08x, %04x, %04x, %04x", address, param1, param2, param3); + } + break; + + case 0x02: //02 + { + uAddress += 4; +#ifdef _WIN32 + DebugLog("Update the SoundThread to be in sync"); + DSound::DSound_UpdateSound(); //do it in this thread to avoid sync problems +#endif + } + break; + + case 0x0003: // ???? + DebugLog("AXLIST command 0x0003 ????"); + break; + + case 0x0004: + Addr__4_1 = Memory_Read_U32(uAddress); + uAddress += 4; + Addr__4_2 = Memory_Read_U32(uAddress); + uAddress += 4; + DebugLog("AXLIST 4_1 4_2 addresses: %08x %08x", Addr__4_1, Addr__4_2); + break; + + case 0x0005: + Addr__5_1 = Memory_Read_U32(uAddress); + uAddress += 4; + Addr__5_2 = Memory_Read_U32(uAddress); + uAddress += 4; + DebugLog("AXLIST 5_1 5_2 addresses: %08x %08x", Addr__5_1, Addr__5_2); + break; + + case 0x0006: + Addr__6 = Memory_Read_U32(uAddress); + uAddress += 4; + DebugLog("AXLIST 6 address: %08x", Addr__6); + break; + + case 0x07: + Addr__AXOutSBuffer = Memory_Read_U32(uAddress); + uAddress += 4; + DebugLog("AXLIST OutSBuffer address: %08x", Addr__AXOutSBuffer); + break; + + case 0x0009: + Addr__9 = Memory_Read_U32(uAddress); + uAddress += 4; + DebugLog("AXLIST 6 address: %08x", Addr__9); + break; + + case 0x0a: + Addr__A = Memory_Read_U32(uAddress); + uAddress += 4; + DebugLog("AXLIST CompressorTable address: %08x", Addr__A); + break; + + case 0x000e: + Addr__AXOutSBuffer_1 = Memory_Read_U32(uAddress); + uAddress += 4; + Addr__AXOutSBuffer_2 = Memory_Read_U32(uAddress); + uAddress += 4; + DebugLog("AXLIST sbuf2 addresses: %08x %08x", Addr__AXOutSBuffer_1, Addr__AXOutSBuffer_2); + break; + + case 0x0f: + bExecuteList = false; + DebugLog("AXLIST end"); + break; + + case 0x0010: //monkey ball2 + DebugLog("AXLIST unknown"); + //should probably read/skip stuff here + uAddress += 8; + break; + + case 0x0011: + uAddress += 4; + break; + + case 0x0012: + Addr__12 = Memory_Read_U16(uAddress); + uAddress += 2; + break; + + case 0x0013: + uAddress += 6 * 4; // 6 Addresses + break; + + default: + { + static bool bFirst = true; + + if (bFirst == true) + { + char szTemp[2048]; + sprintf(szTemp, "Unknown AX-Command 0x%x (address: 0x%08x)\n", iCommand, uAddress - 2); + int num = 0; + + while (num < 64) + { + char szTemp2[128] = ""; + sprintf(szTemp2, "0x%04x\n", Memory_Read_U16(uAddress + num)); + strcat(szTemp, szTemp2); + num += 2; + } + + PanicAlert(szTemp); + + bFirst = false; + } + + // unknown command so stop the execution of this TaskList + bExecuteList = false; + } + break; + } + } + + DebugLog("AXTask - done, send resume"); + + // i hope resume is okay AX + m_rMailHandler.PushMail(0xDCD10001); + + return(true); +} diff --git a/Source/Plugins/Plugin_DSP_NULL/Src/UCodes/UCode_AX.h b/Source/Plugins/Plugin_DSP_NULL/Src/UCodes/UCode_AX.h new file mode 100644 index 0000000000..bbba7725df --- /dev/null +++ b/Source/Plugins/Plugin_DSP_NULL/Src/UCodes/UCode_AX.h @@ -0,0 +1,48 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#pragma once + +class CUCode_AX + : public IUCode +{ + public: + + // constructor + CUCode_AX(CMailHandler& _rMailHandler); + + // destructor + virtual ~CUCode_AX(); + + // HandleMail + void HandleMail(u32 _uMail); + + // Mix Add + void MixAdd(short* _pBuffer, int _iSize); + + // Update + void Update(); + + private: + + // ax task message handler + bool AXTask(u32& _uMail); + + // SendMail + void SendMail(u32 _uMail); +}; + diff --git a/Source/Plugins/Plugin_DSP_NULL/Src/UCodes/UCode_CARD.cpp b/Source/Plugins/Plugin_DSP_NULL/Src/UCodes/UCode_CARD.cpp new file mode 100644 index 0000000000..e4a032437b --- /dev/null +++ b/Source/Plugins/Plugin_DSP_NULL/Src/UCodes/UCode_CARD.cpp @@ -0,0 +1,70 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "Common.h" +#include "../Globals.h" +#include "../DSPHandler.h" +#include "UCodes.h" +#include "UCode_CARD.h" + + +CUCode_CARD::CUCode_CARD(CMailHandler& _rMailHandler) + : IUCode(_rMailHandler) +{ + DebugLog("CUCode_CARD - initialized"); + m_rMailHandler.PushMail(DSP_INIT); +} + + +CUCode_CARD::~CUCode_CARD() +{ + m_rMailHandler.Clear(); +} + + +void +CUCode_CARD::Update() +{ + // check if we have to sent something + if (!m_rMailHandler.IsEmpty()) + { + g_dspInitialize.pGenerateDSPInterrupt(); + } +} + + +// ================================================================================================== +// Mail handler +// ================================================================================================== + +void +CUCode_CARD::HandleMail(u32 _uMail) +{ + if (_uMail == 0xFF000000) // unlock card + { + // m_Mails.push(0x00000001); // ACK (actualy anything != 0) + } + else + { + DebugLog("CUCode_CARD - unknown cmd: %x (size %i)", _uMail); + } + + m_rMailHandler.PushMail(DSP_DONE); + CDSPHandler::GetInstance().SetUCode(UCODE_ROM); +} + + diff --git a/Source/Plugins/Plugin_DSP_NULL/Src/UCodes/UCode_CARD.h b/Source/Plugins/Plugin_DSP_NULL/Src/UCodes/UCode_CARD.h new file mode 100644 index 0000000000..fd05b02578 --- /dev/null +++ b/Source/Plugins/Plugin_DSP_NULL/Src/UCodes/UCode_CARD.h @@ -0,0 +1,55 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef _UCODE_CARD_H +#define _UCODE_CARD_H + +#include "UCodes.h" + +class CUCode_CARD + : public IUCode +{ + private: + + enum EDSP_Codes + { + DSP_INIT = 0xDCD10000, + DSP_RESUME = 0xDCD10001, + DSP_YIELD = 0xDCD10002, + DSP_DONE = 0xDCD10003, + DSP_SYNC = 0xDCD10004, + DSP_UNKN = 0xDCD10005, + }; + + public: + + // constructor + CUCode_CARD(CMailHandler& _rMailHandler); + + // destructor + virtual ~CUCode_CARD(); + + // handle mail + void HandleMail(u32 _uMail); + + + // update + void Update(); +}; + +#endif + diff --git a/Source/Plugins/Plugin_DSP_NULL/Src/UCodes/UCode_InitAudioSystem.cpp b/Source/Plugins/Plugin_DSP_NULL/Src/UCodes/UCode_InitAudioSystem.cpp new file mode 100644 index 0000000000..d76eb4db03 --- /dev/null +++ b/Source/Plugins/Plugin_DSP_NULL/Src/UCodes/UCode_InitAudioSystem.cpp @@ -0,0 +1,55 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "Common.h" +#include "../Globals.h" +#include "../DSPHandler.h" +#include "UCodes.h" +#include "UCode_InitAudioSystem.h" + +CUCode_InitAudioSystem::CUCode_InitAudioSystem(CMailHandler& _rMailHandler) + : IUCode(_rMailHandler) + , m_BootTask_numSteps(0) + , m_NextParameter(0) + , IsInitialized(false) +{ + DebugLog("CUCode_InitAudioSystem - initialized"); +} + + +CUCode_InitAudioSystem::~CUCode_InitAudioSystem() +{} + + +void CUCode_InitAudioSystem::Init() +{} + + +void CUCode_InitAudioSystem::Update() +{ + if (m_rMailHandler.IsEmpty()) + { + m_rMailHandler.PushMail(0x80544348); + // HALT + } +} + + +void CUCode_InitAudioSystem::HandleMail(u32 _uMail) +{} + + diff --git a/Source/Plugins/Plugin_DSP_NULL/Src/UCodes/UCode_InitAudioSystem.h b/Source/Plugins/Plugin_DSP_NULL/Src/UCodes/UCode_InitAudioSystem.h new file mode 100644 index 0000000000..57b81b2d70 --- /dev/null +++ b/Source/Plugins/Plugin_DSP_NULL/Src/UCodes/UCode_InitAudioSystem.h @@ -0,0 +1,58 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef _UCODE_INITAUDIOSYSTEM +#define _UCODE_INITAUDIOSYSTEM + +#include "UCodes.h" + +class CUCode_InitAudioSystem + : public IUCode +{ + public: + + CUCode_InitAudioSystem(CMailHandler& _rMailHandler); + virtual ~CUCode_InitAudioSystem(); + + void HandleMail(u32 _uMail); + void Update(); + void Init(); + + + private: + + struct SUCode + { + u32 m_RAMAddress; + u32 m_Length; + u32 m_IMEMAddress; + u32 m_Unk; + u32 m_StartPC; + }; + + SUCode m_CurrentUCode; + int m_BootTask_numSteps; + + u32 m_NextParameter; + + bool IsInitialized; + + void BootUCode(); +}; + +#endif + diff --git a/Source/Plugins/Plugin_DSP_NULL/Src/UCodes/UCode_Jac.cpp b/Source/Plugins/Plugin_DSP_NULL/Src/UCodes/UCode_Jac.cpp new file mode 100644 index 0000000000..a1f6ff3544 --- /dev/null +++ b/Source/Plugins/Plugin_DSP_NULL/Src/UCodes/UCode_Jac.cpp @@ -0,0 +1,162 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "Common.h" +#include "../Globals.h" +#include "UCodes.h" +#include "UCode_Jac.h" +#include "../MailHandler.h" + +CUCode_Jac::CUCode_Jac(CMailHandler& _rMailHandler) + : IUCode(_rMailHandler) + , m_bListInProgress(false) +{ + DebugLog("CUCode_Jac: init"); + m_rMailHandler.PushMail(0xDCD10000); + m_rMailHandler.PushMail(0x80000000); +} + + +CUCode_Jac::~CUCode_Jac() +{ + m_rMailHandler.Clear(); +} + + +void CUCode_Jac::HandleMail(u32 _uMail) +{ + // this is prolly totally bullshit and should work like the zelda one... + // but i am to lazy to change it atm + + if (m_bListInProgress == false) + { + // get the command to find out how much steps it has + switch (_uMail & 0xFFFF) + { + // release halt + case 0x00: + // m_Mails.push(0x80000000); + g_dspInitialize.pGenerateDSPInterrupt(); + break; + + case 0x40: + m_step = 0; + ((u32*)m_Buffer)[m_step++] = _uMail; + m_bListInProgress = true; + m_numSteps = 5; + break; + + case 0x2000: + case 0x4000: + m_step = 0; + ((u32*)m_Buffer)[m_step++] = _uMail; + m_bListInProgress = true; + m_numSteps = 3; + break; + + default: + PanicAlert("UCode Jac"); + DebugLog("UCode Jac - unknown cmd: %x", _uMail & 0xFFFF); + break; + } + } + else + { + ((u32*)m_Buffer)[m_step] = _uMail; + m_step++; + + if (m_step == m_numSteps) + { + ExecuteList(); + m_bListInProgress = false; + } + } +} + + +void CUCode_Jac::Update() +{ + // check if we have to sent something +/* if (!g_MailHandler.empty()) + { + g_dspInitialize.pGenerateDSPInterrupt(); + }*/ +} + + +void CUCode_Jac::ExecuteList() +{ + // begin with the list + m_readOffset = 0; + + u16 cmd = Read16(); + u16 sync = Read16(); + + DebugLog("=============================================================================="); + DebugLog("UCode Jac - execute dlist (cmd: 0x%04x : sync: 0x%04x)", cmd, sync); + + switch (cmd) + { + // ============================================================================== + // DsetupTable + // ============================================================================== + case 0x40: + { + u32 tmp[4]; + tmp[0] = Read32(); + tmp[1] = Read32(); + tmp[2] = Read32(); + tmp[3] = Read32(); + + DebugLog("DsetupTable"); + DebugLog("???: 0x%08x", tmp[0]); + DebugLog("DSPRES_FILTER (size: 0x40): 0x%08x", tmp[1]); + DebugLog("DSPADPCM_FILTER (size: 0x500): 0x%08x", tmp[2]); + DebugLog("???: 0x%08x", tmp[3]); + } + break; + + // ============================================================================== + // UpdateDSPChannel + // ============================================================================== + case 0x2000: + case 0x4000: // animal crossing + { + u32 tmp[3]; + tmp[0] = Read32(); + tmp[1] = Read32(); + tmp[2] = Read32(); + + DebugLog("UpdateDSPChannel"); + DebugLog("audiomemory: 0x%08x", tmp[0]); + DebugLog("audiomemory: 0x%08x", tmp[1]); + DebugLog("DSPADPCM_FILTER (size: 0x40): 0x%08x", tmp[2]); + } + break; + + default: + PanicAlert("UCode Jac unknown cmd: %s (size %)", cmd, m_numSteps); + DebugLog("Jac UCode - unknown cmd: %x (size %i)", cmd, m_numSteps); + break; + } + + // sync, we are rdy + m_rMailHandler.PushMail(DSP_SYNC); + m_rMailHandler.PushMail(0xF3550000 | sync); +} + + diff --git a/Source/Plugins/Plugin_DSP_NULL/Src/UCodes/UCode_Jac.h b/Source/Plugins/Plugin_DSP_NULL/Src/UCodes/UCode_Jac.h new file mode 100644 index 0000000000..9d08fd91ee --- /dev/null +++ b/Source/Plugins/Plugin_DSP_NULL/Src/UCodes/UCode_Jac.h @@ -0,0 +1,85 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef _UCODE_JAC +#define _UCODE_JAC + +#include "UCodes.h" + +class CUCode_Jac + : public IUCode +{ + private: + + enum EDSP_Codes + { + DSP_INIT = 0xDCD10000, + DSP_RESUME = 0xDCD10001, + DSP_YIELD = 0xDCD10002, + DSP_DONE = 0xDCD10003, + DSP_SYNC = 0xDCD10004, + DSP_UNKN = 0xDCD10005, + }; + + // List in progre + bool m_bListInProgress; + int m_numSteps; + int m_step; + u8 m_Buffer[1024]; + void ExecuteList(); + + + u32 m_readOffset; + + u8 Read8() + { + return(m_Buffer[m_readOffset++]); + } + + + u16 Read16() + { + u16 res = *(u16*)&m_Buffer[m_readOffset]; + m_readOffset += 2; + return(res); + } + + + u32 Read32() + { + u32 res = *(u32*)&m_Buffer[m_readOffset]; + m_readOffset += 4; + return(res); + } + + + public: + + // constructor + CUCode_Jac(CMailHandler& _rMailHandler); + + // destructor + virtual ~CUCode_Jac(); + + // handleMail + void HandleMail(u32 _uMail); + + void Update(); +}; + +#endif + diff --git a/Source/Plugins/Plugin_DSP_NULL/Src/UCodes/UCode_ROM.cpp b/Source/Plugins/Plugin_DSP_NULL/Src/UCodes/UCode_ROM.cpp new file mode 100644 index 0000000000..71b54c8c02 --- /dev/null +++ b/Source/Plugins/Plugin_DSP_NULL/Src/UCodes/UCode_ROM.cpp @@ -0,0 +1,117 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "Common.h" +#include "../Globals.h" +#include "../DSPHandler.h" +#include "UCodes.h" +#include "UCode_ROM.h" + + +CUCode_Rom::CUCode_Rom(CMailHandler& _rMailHandler) + : IUCode(_rMailHandler) + , m_BootTask_numSteps(0) + , m_NextParameter(0) +{ + DebugLog("UCode_Rom - initialized"); + m_rMailHandler.Clear(); + m_rMailHandler.PushMail(0x8071FEED); +} + + +CUCode_Rom::~CUCode_Rom() +{} + + +void CUCode_Rom::Update() +{} + + +void CUCode_Rom::HandleMail(u32 _uMail) +{ + if (m_NextParameter == 0) + { + // wait for beginning of UCode + if ((_uMail & 0xFFFF0000) != 0x80F30000) + { + u32 Message = 0xFEEE0000 | (_uMail & 0xFFFF); + m_rMailHandler.PushMail(Message); + } + else + { + m_NextParameter = _uMail; + } + } + else + { + switch (m_NextParameter) + { + case 0x80F3A001: + m_CurrentUCode.m_RAMAddress = _uMail; + break; + + case 0x80F3A002: + m_CurrentUCode.m_Length = _uMail; + break; + + case 0x80F3C002: + m_CurrentUCode.m_IMEMAddress = _uMail; + break; + + case 0x80F3B002: + m_CurrentUCode.m_Unk = _uMail; + break; + + case 0x80F3D001: + { + m_CurrentUCode.m_StartPC = _uMail; + BootUCode(); + } + break; + } + + m_NextParameter = 0; + } +} + + +void +CUCode_Rom::BootUCode() +{ + // simple non-scientific crc invented by ector :P + // too annoying to change now, and probably good enough anyway + u32 crc = 0; + + for (u32 i = 0; i < m_CurrentUCode.m_Length; i++) + { + crc ^= Memory_Read_U8(m_CurrentUCode.m_RAMAddress + i); + //let's rol + crc = (crc << 3) | (crc >> 29); + } + + DebugLog("CurrentUCode SOURCE Addr: 0x%08x", m_CurrentUCode.m_RAMAddress); + DebugLog("CurrentUCode Length: 0x%08x", m_CurrentUCode.m_Length); + DebugLog("CurrentUCode DEST Addr: 0x%08x", m_CurrentUCode.m_IMEMAddress); + DebugLog("CurrentUCode ???: 0x%08x", m_CurrentUCode.m_Unk); + DebugLog("CurrentUCode init_vector: 0x%08x", m_CurrentUCode.m_StartPC); + DebugLog("CurrentUCode CRC: 0x%08x", crc); + DebugLog("BootTask - done"); + + CDSPHandler::GetInstance().SetUCode(crc); +} + + diff --git a/Source/Plugins/Plugin_DSP_NULL/Src/UCodes/UCode_ROM.h b/Source/Plugins/Plugin_DSP_NULL/Src/UCodes/UCode_ROM.h new file mode 100644 index 0000000000..8b66c1fcdc --- /dev/null +++ b/Source/Plugins/Plugin_DSP_NULL/Src/UCodes/UCode_ROM.h @@ -0,0 +1,55 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef _UCODE_ROM +#define _UCODE_ROM + +#include "UCodes.h" + +class CUCode_Rom + : public IUCode +{ + public: + + CUCode_Rom(CMailHandler& _rMailHandler); + virtual ~CUCode_Rom(); + + void HandleMail(u32 _uMail); + void Update(); + + + private: + + struct SUCode + { + u32 m_RAMAddress; + u32 m_Length; + u32 m_IMEMAddress; + u32 m_Unk; + u32 m_StartPC; + }; + + SUCode m_CurrentUCode; + int m_BootTask_numSteps; + + u32 m_NextParameter; + + void BootUCode(); +}; + +#endif + diff --git a/Source/Plugins/Plugin_DSP_NULL/Src/UCodes/UCode_Zelda.cpp b/Source/Plugins/Plugin_DSP_NULL/Src/UCodes/UCode_Zelda.cpp new file mode 100644 index 0000000000..f91956ec2b --- /dev/null +++ b/Source/Plugins/Plugin_DSP_NULL/Src/UCodes/UCode_Zelda.cpp @@ -0,0 +1,171 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +// Games that uses this UCode: +// Zelda: The Windwalker, Mario Sunshine, Mario Kart + +#include "Common.h" +#include "../Globals.h" +#include "UCodes.h" +#include "UCode_Zelda.h" +#include "../MailHandler.h" + + +CUCode_Zelda::CUCode_Zelda(CMailHandler& _rMailHandler) + : IUCode(_rMailHandler) + , m_numSteps(0) + , m_bListInProgress(false) +{ + DebugLog("UCode_Zelda - add boot mails for handshake"); + m_rMailHandler.PushMail(DSP_INIT); + m_rMailHandler.PushMail(0x80000000); // handshake +} + + +CUCode_Zelda::~CUCode_Zelda() +{ + m_rMailHandler.Clear(); +} + + +void +CUCode_Zelda::Update() +{ + // check if we have to sent something + if (!m_rMailHandler.IsEmpty()) + { + g_dspInitialize.pGenerateDSPInterrupt(); + } +} + + +// ================================================================================================== +// Mail handler +// ================================================================================================== + + +void +CUCode_Zelda::HandleMail(u32 _uMail) +{ + if (m_bListInProgress == false) + { + m_bListInProgress = true; + m_numSteps = _uMail; + m_step = 0; + } + else + { + ((u32*)m_Buffer)[m_step] = _uMail; + m_step++; + + if (m_step == m_numSteps) + { + ExecuteList(); + m_bListInProgress = false; + } + } +} + + +void +CUCode_Zelda::ExecuteList() +{ + // begin with the list + m_readOffset = 0; + + u32 Temp = Read32(); + u32 Command = (Temp >> 24) & 0x7f; + u32 Sync = Temp >> 16; + + DebugLog("=============================================================================="); + DebugLog("Zelda UCode - execute dlist (cmd: 0x%04x : sync: 0x%04x)", Command, Sync); + + switch (Command) + { + // DsetupTable ... zelda ww jumps to 0x0095 + case 0x01: + { + u32 tmp[4]; + tmp[0] = Read32(); + tmp[1] = Read32(); + tmp[2] = Read32(); + tmp[3] = Read32(); + + DebugLog("DsetupTable"); + DebugLog("???: 0x%08x", tmp[0]); + DebugLog("DSPRES_FILTER (size: 0x40): 0x%08x", tmp[1]); + DebugLog("DSPADPCM_FILTER (size: 0x500): 0x%08x", tmp[2]); + DebugLog("???: 0x%08x", tmp[3]); + } + break; + + // SyncFrame ... zelda ww jumps to 0x0243 + case 0x02: + { + u32 tmp[3]; + tmp[0] = Read32(); + tmp[1] = Read32(); + tmp[2] = Read32(); + + DebugLog("DsyncFrame"); + DebugLog("???: 0x%08x", tmp[0]); + DebugLog("???: 0x%08x", tmp[1]); + DebugLog("DSPADPCM_FILTER (size: 0x500): 0x%08x", tmp[2]); + } + break; + +/* + case 0x03: break; // dunno ... zelda ww jmps to 0x0073 + case 0x04: break; // dunno ... zelda ww jmps to 0x0580 + case 0x05: break; // dunno ... zelda ww jmps to 0x0592 + case 0x06: break; // dunno ... zelda ww jmps to 0x0469 + + case 0x07: break; // dunno ... zelda ww jmps to 0x044d + case 0x08: break; // Mixer ... zelda ww jmps to 0x0485 + case 0x09: break; // dunno ... zelda ww jmps to 0x044d + */ + + // DsetDolbyDelay ... zelda ww jumps to 0x00b2 + case 0x0d: + { + u32 tmp[2]; + tmp[0] = Read32(); + tmp[1] = Read32(); + + DebugLog("DSetDolbyDelay"); + DebugLog("DOLBY2_DELAY_BUF (size 0x960): 0x%08x", tmp[0]); + DebugLog("DSPRES_FILTER (size 0x500): 0x%08x", tmp[1]); + } + break; + + // Set VARAM + case 0x0e: +// MessageBox(NULL, "Zelda VARAM", "cmd", MB_OK); + break; + + // default ... zelda ww jumps to 0x0043 + default: + PanicAlert("Zelda UCode - unknown cmd: %x (size %i)", Command, m_numSteps); + break; + } + + // sync, we are rdy + m_rMailHandler.PushMail(DSP_SYNC); + m_rMailHandler.PushMail(0xF3550000 | Sync); +} + + diff --git a/Source/Plugins/Plugin_DSP_NULL/Src/UCodes/UCode_Zelda.h b/Source/Plugins/Plugin_DSP_NULL/Src/UCodes/UCode_Zelda.h new file mode 100644 index 0000000000..c6ea556bac --- /dev/null +++ b/Source/Plugins/Plugin_DSP_NULL/Src/UCodes/UCode_Zelda.h @@ -0,0 +1,81 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef _UCODE_ZELDA_H +#define _UCODE_ZELDA_H + +#include "Common.h" +#include "UCodes.h" + +class CUCode_Zelda + : public IUCode +{ + private: + + enum EDSP_Codes + { + DSP_INIT = 0xDCD10000, + DSP_RESUME = 0xDCD10001, + DSP_YIELD = 0xDCD10002, + DSP_DONE = 0xDCD10003, + DSP_SYNC = 0xDCD10004, + DSP_UNKN = 0xDCD10005, + }; + + // List in progress + int m_numSteps; + bool m_bListInProgress; + int m_step; + u8 m_Buffer[1024]; + void ExecuteList(); + + + u32 m_readOffset; + + u8 Read8() + { + return(m_Buffer[m_readOffset++]); + } + + + u16 Read16() + { + u16 res = *(u16*)&m_Buffer[m_readOffset]; + m_readOffset += 2; + return(res); + } + + + u32 Read32() + { + u32 res = *(u32*)&m_Buffer[m_readOffset]; + m_readOffset += 4; + return(res); + } + + + public: + + CUCode_Zelda(CMailHandler& _rMailHandler); + virtual ~CUCode_Zelda(); + + void HandleMail(u32 _uMail); + void Update(); +}; + +#endif + diff --git a/Source/Plugins/Plugin_DSP_NULL/Src/UCodes/UCodes.cpp b/Source/Plugins/Plugin_DSP_NULL/Src/UCodes/UCodes.cpp new file mode 100644 index 0000000000..dfcc2f3eff --- /dev/null +++ b/Source/Plugins/Plugin_DSP_NULL/Src/UCodes/UCodes.cpp @@ -0,0 +1,87 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "Common.h" +#include "../Globals.h" + +#include "UCodes.h" + +#include "UCode_AX.h" +#include "UCode_Zelda.h" +#include "UCode_Jac.h" +#include "UCode_ROM.h" +#include "UCode_CARD.h" +#include "UCode_InitAudioSystem.h" + +IUCode* UCodeFactory(u32 _CRC, CMailHandler& _rMailHandler) +{ + switch (_CRC) + { + case UCODE_ROM: + return(new CUCode_Rom(_rMailHandler)); + + case UCODE_INIT_AUDIO_SYSTEM: + return(new CUCode_InitAudioSystem(_rMailHandler)); + + case 0x65d6cc6f: // CARD + return(new CUCode_CARD(_rMailHandler)); + + case 0x088e38a5: // IPL - JAP + case 0xd73338cf: // IPL + case 0x42f64ac4: // Luigi (after fix) + case 0x4be6a5cb: // AC, Pikmin (after fix) + DebugLog("JAC ucode chosen"); + return(new CUCode_Jac(_rMailHandler)); + + case 0x3ad3b7ac: // Naruto3 + case 0x3daf59b9: // Alien Hominid + case 0x4e8a8b21: // spdemo, ctaxi, 18 wheeler, disney, monkeyball2,cubivore,puzzlecollection,wario, + // capcom vs snk, naruto2, lost kingdoms, star fox, mario party 4, mortal kombat, + // smugglers run warzone, smash brothers, sonic mega collection, ZooCube + // nddemo, starfox + case 0x07f88145: // bustamove, ikaruga, fzero, robotech battle cry, star soldier, soul calibur2, + // Zelda:OOT, Tony hawk, viewtiful joe + case 0xe2136399: // billy hatcher, dragonballz, mario party 5, TMNT, ava1080 + DebugLog("AX ucode chosen, yay!"); + return(new CUCode_AX(_rMailHandler)); + + case 0x6CA33A6D: // DK Jungle Beat + case 0x86840740: // zelda + case 0x56d36052: // mario + case 0x2fcdf1ec: // mariokart, zelda 4 swords + DebugLog("Zelda ucode chosen"); + return(new CUCode_Zelda(_rMailHandler)); + + // WII CRCs + case 0x6c3f6f94: // zelda - PAL + case 0xd643001f: // mario galaxy - PAL + DebugLog("Zelda Wii ucode chosen"); + return(new CUCode_Zelda(_rMailHandler)); + + case 0x347112ba: // raving rabbits + DebugLog("Wii - AX chosen"); + return(new CUCode_AX(_rMailHandler)); + + default: + PanicAlert("Unknown ucode (CRC = %08x) - forcing AX", _CRC); + return(new CUCode_AX(_rMailHandler)); + } + + return(NULL); +} + + diff --git a/Source/Plugins/Plugin_DSP_NULL/Src/UCodes/UCodes.h b/Source/Plugins/Plugin_DSP_NULL/Src/UCodes/UCodes.h new file mode 100644 index 0000000000..0ab593cc93 --- /dev/null +++ b/Source/Plugins/Plugin_DSP_NULL/Src/UCodes/UCodes.h @@ -0,0 +1,56 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef _UCODES_H +#define _UCODES_H + +#include "Common.h" + +#define UCODE_ROM 0x0000000 +#define UCODE_INIT_AUDIO_SYSTEM 0x0000001 + +class CMailHandler; +class IUCode +{ + public: + + IUCode(CMailHandler& _rMailHandler) + : m_rMailHandler(_rMailHandler) + {} + + + virtual ~IUCode() + {} + + + virtual void HandleMail(u32 _uMail) = 0; + virtual void Update(void) = 0; + + + virtual void MixAdd(short* buffer, int size) {} + + + protected: + + CMailHandler& m_rMailHandler; +}; + +extern IUCode* UCodeFactory(u32 _CRC, CMailHandler& _rMailHandler); + + +#endif + diff --git a/Source/Plugins/Plugin_DSP_NULL/Src/main.cpp b/Source/Plugins/Plugin_DSP_NULL/Src/main.cpp new file mode 100644 index 0000000000..7d5f5fb6ac --- /dev/null +++ b/Source/Plugins/Plugin_DSP_NULL/Src/main.cpp @@ -0,0 +1,235 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "Common.h" +#include "Globals.h" +#include "resource.h" + +#ifdef _WIN32 +#include "PCHW/DSoundStream.h" +#include "AboutDlg.h" +#include "ConfigDlg.h" +#else +// TODO +#endif + +#include "PCHW/Mixer.h" + +#include "DSPHandler.h" +#include "Config.h" + +DSPInitialize g_dspInitialize; +u8* g_pMemory; + +#ifdef _WIN32 +HINSTANCE g_hInstance = NULL; + +BOOL APIENTRY DllMain(HINSTANCE hinstDLL, // DLL module handle + DWORD dwReason, // reason called + LPVOID lpvReserved) // reserved +{ + switch (dwReason) + { + case DLL_PROCESS_ATTACH: + break; + + case DLL_PROCESS_DETACH: + break; + + default: + break; + } + + g_hInstance = hinstDLL; + return(TRUE); +} + + +#endif + + +void GetDllInfo(PLUGIN_INFO* _PluginInfo) +{ + _PluginInfo->Version = 0x0100; + _PluginInfo->Type = PLUGIN_TYPE_DSP; +#ifndef _DEBUG + sprintf(_PluginInfo->Name, "Dolphin DSP-NULL Plugin"); +#else + sprintf(_PluginInfo->Name, "Dolphin DSP-NULL Plugin Debug"); +#endif +} + + +void DllAbout(HWND _hParent) +{ +#ifdef _WIN32 + CAboutDlg aboutDlg; + aboutDlg.DoModal(_hParent); +#endif +} + + +void DllConfig(HWND _hParent) +{ +#ifdef _WIN32 + CConfigDlg configDlg; + configDlg.DoModal(_hParent); +#endif +} + + +void DSP_Initialize(DSPInitialize _dspInitialize) +{ + g_Config.LoadDefaults(); + g_Config.Load(); + + g_dspInitialize = _dspInitialize; + + g_pMemory = g_dspInitialize.pGetMemoryPointer(0); + + CDSPHandler::CreateInstance(); + +#ifdef _WIN32 + DSound::DSound_StartSound((HWND)g_dspInitialize.hWnd, g_Config.m_SampleRate, Mixer); +#endif +} + + +void DSP_Shutdown() +{ + // delete the UCodes +#ifdef _WIN32 + DSound::DSound_StopSound(); +#endif + CDSPHandler::Destroy(); +} + + +struct DSPState +{ + u32 CPUMailbox; + bool CPUMailbox_Written[2]; + + u32 DSPMailbox; + bool DSPMailbox_Read[2]; + + DSPState() + { + CPUMailbox = 0x00000000; + CPUMailbox_Written[0] = false; + CPUMailbox_Written[1] = false; + + DSPMailbox = 0x00000000; + DSPMailbox_Read[0] = true; + DSPMailbox_Read[1] = true; + } +}; +DSPState g_dspState; + + +unsigned short DSP_ReadMailboxHigh(bool _CPUMailbox) +{ + if (_CPUMailbox) + { + return((g_dspState.CPUMailbox >> 16) & 0xFFFF); + } + else + { + return(CDSPHandler::GetInstance().AccessMailHandler().ReadDSPMailboxHigh()); + } +} + + +unsigned short DSP_ReadMailboxLow(bool _CPUMailbox) +{ + if (_CPUMailbox) + { + return(g_dspState.CPUMailbox & 0xFFFF); + } + else + { + return(CDSPHandler::GetInstance().AccessMailHandler().ReadDSPMailboxLow()); + } +} + + +void Update_DSP_WriteRegister() +{ + // check if the whole message is complete and if we can send it + if (g_dspState.CPUMailbox_Written[0] && g_dspState.CPUMailbox_Written[1]) + { + CDSPHandler::GetInstance().SendMailToDSP(g_dspState.CPUMailbox); + g_dspState.CPUMailbox_Written[0] = g_dspState.CPUMailbox_Written[1] = false; + g_dspState.CPUMailbox = 0; // Mail sent so clear it to show that it is progressed + } +} + + +void DSP_WriteMailboxHigh(bool _CPUMailbox, unsigned short _Value) +{ + if (_CPUMailbox) + { + g_dspState.CPUMailbox = (g_dspState.CPUMailbox & 0xFFFF) | (_Value << 16); + g_dspState.CPUMailbox_Written[0] = true; + + Update_DSP_WriteRegister(); + } + else + { + PanicAlert("CPU can't write %08x to DSP mailbox", _Value); + } +} + + +void DSP_WriteMailboxLow(bool _CPUMailbox, unsigned short _Value) +{ + if (_CPUMailbox) + { + g_dspState.CPUMailbox = (g_dspState.CPUMailbox & 0xFFFF0000) | _Value; + g_dspState.CPUMailbox_Written[1] = true; + + Update_DSP_WriteRegister(); + } + else + { + PanicAlert("CPU cant write %08x to DSP mailbox", _Value); + } +} + + +unsigned short DSP_WriteControlRegister(unsigned short _Value) +{ + return(CDSPHandler::GetInstance().WriteControlRegister(_Value)); +} + + +unsigned short DSP_ReadControlRegister() +{ + return(CDSPHandler::GetInstance().ReadControlRegister()); +} + + +void DSP_Update() +{ + CDSPHandler::GetInstance().Update(); +} + + +void DSP_SendAIBuffer(unsigned int _Address, unsigned int _Size) +{} + + diff --git a/Source/Plugins/Plugin_DSP_NULL/Src/resource.h b/Source/Plugins/Plugin_DSP_NULL/Src/resource.h new file mode 100644 index 0000000000..3c0568c848 --- /dev/null +++ b/Source/Plugins/Plugin_DSP_NULL/Src/resource.h @@ -0,0 +1,32 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by Plugin_DSP.rc +// +#define IDD_SETTINGS 101 +#define IDD_DIALOG2 102 +#define IDD_ABOUT 102 +#define IDC_COMBO1 1001 +#define IDC_SAMPLERATE 1001 +#define IDC_EDIT1 1002 +#define IDC_SAMPLEDUMPPATH 1002 +#define IDC_CHECK1 1003 +#define IDC_ENABLE_AUDIO 1003 +#define IDC_ENABLE_HLE_AUDIO 1003 +#define IDC_CHECK2 1004 +#define IDC_ENABLE_DTK_MUSIC 1004 +#define IDC_DUMPSAMPLES 1005 +#define IDC_SAMPLEMINLENGTH 1006 +#define IDC_BROWSE 1007 +#define IDC_ANTIGAP 1009 +#define IDC_CHECK3 1010 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 103 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1011 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/Source/Plugins/Plugin_DSP_NULL/Src/resource.rc b/Source/Plugins/Plugin_DSP_NULL/Src/resource.rc new file mode 100644 index 0000000000..5fabd32788 --- /dev/null +++ b/Source/Plugins/Plugin_DSP_NULL/Src/resource.rc @@ -0,0 +1,145 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "afxres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""afxres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_SETTINGS DIALOGEX 0, 0, 241, 206 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | + WS_SYSMENU +CAPTION "Dolphin DSP-HLE Plugin 0.1 Settings" +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + DEFPUSHBUTTON "OK",IDOK,129,185,50,14 + PUSHBUTTON "Cancel",IDCANCEL,184,185,50,14 + GROUPBOX "&Sound settings",IDC_STATIC,7,7,227,45 + EDITTEXT IDC_SAMPLEDUMPPATH,13,158,155,13,ES_AUTOHSCROLL | + WS_DISABLED + CONTROL "&Enable HLE Audio",IDC_ENABLE_HLE_AUDIO,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,13,22,84,8 + GROUPBOX "Sample d&umping",IDC_STATIC,7,128,227,51 + CONTROL "Enab&le DTK Music",IDC_ENABLE_DTK_MUSIC,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,13,36,102,8 + CONTROL "&Dump all samples longer than",IDC_DUMPSAMPLES,"Button", + BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,13,142,105,9 + EDITTEXT IDC_SAMPLEMINLENGTH,122,140,47,12,ES_AUTOHSCROLL | + WS_DISABLED + LTEXT "seconds to:",IDC_STATIC,173,142,40,10 + PUSHBUTTON "&Browse...",IDC_BROWSE,173,158,54,14 + GROUPBOX "&Audio quality",IDC_STATIC,7,55,227,70 + LTEXT "Sample &rate:",IDC_STATIC,13,71,67,9 + COMBOBOX IDC_SAMPLERATE,81,69,65,13,CBS_DROPDOWNLIST | CBS_SORT | + WS_VSCROLL | WS_TABSTOP + LTEXT "48000hz recommended, if it doesn't work use 44100, it will slow down some music. Changing this during a game will have no effect.", + IDC_STATIC,81,84,146,32 + CONTROL "&Anti-gap (dangerous!)",IDC_ANTIGAP,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,122,22,96,9 + CONTROL "&Reverb",IDC_CHECK3,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,122,36,89,10 +END + +IDD_ABOUT DIALOGEX 0, 0, 184, 65 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | + WS_SYSMENU +CAPTION "About Dolphin DSP-HLE Plugin 0.1" +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + DEFPUSHBUTTON "OK",IDOK,127,44,50,14 + LTEXT "Coded by ector and F|RES",IDC_STATIC,51,25,104,14 + LTEXT "Dolphin DSP-HLE plugin",IDC_STATIC,51,7,104,14 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO +BEGIN + IDD_SETTINGS, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 234 + VERTGUIDE, 13 + VERTGUIDE, 122 + VERTGUIDE, 168 + TOPMARGIN, 7 + BOTTOMMARGIN, 199 + HORZGUIDE, 31 + END + + IDD_ABOUT, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 177 + TOPMARGIN, 7 + BOTTOMMARGIN, 58 + END +END +#endif // APSTUDIO_INVOKED + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/Source/Plugins/Plugin_DSP_NULL/Src/stdafx.cpp b/Source/Plugins/Plugin_DSP_NULL/Src/stdafx.cpp new file mode 100644 index 0000000000..5d19def11f --- /dev/null +++ b/Source/Plugins/Plugin_DSP_NULL/Src/stdafx.cpp @@ -0,0 +1,19 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "stdafx.h" + diff --git a/Source/Plugins/Plugin_DSP_NULL/Src/stdafx.h b/Source/Plugins/Plugin_DSP_NULL/Src/stdafx.h new file mode 100644 index 0000000000..6e2672e1cd --- /dev/null +++ b/Source/Plugins/Plugin_DSP_NULL/Src/stdafx.h @@ -0,0 +1,35 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#pragma once + +#ifdef _WIN32 + +#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers +#define _CRT_SECURE_NO_DEPRECATE 1 + +// Windows Header Files: +#include +#include + +// WTL +#include +#include +#include +#include + +#endif diff --git a/Source/Plugins/Plugin_PadDX9/Plugin_PadDX9.vcproj b/Source/Plugins/Plugin_PadDX9/Plugin_PadDX9.vcproj new file mode 100644 index 0000000000..43a0570538 --- /dev/null +++ b/Source/Plugins/Plugin_PadDX9/Plugin_PadDX9.vcproj @@ -0,0 +1,749 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Source/Plugins/Plugin_PadDX9/Src/AboutDlg.cpp b/Source/Plugins/Plugin_PadDX9/Src/AboutDlg.cpp new file mode 100644 index 0000000000..c1ebbfee3e --- /dev/null +++ b/Source/Plugins/Plugin_PadDX9/Src/AboutDlg.cpp @@ -0,0 +1,48 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ +///////////////////////////////////////////////////////////////////////////////////////////////////// +// M O D U L E B E G I N /////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////// + +#include "stdafx.h" +#include "resource.h" + +#include "AboutDlg.h" + +///////////////////////////////////////////////////////////////////////////////////////////////////// +// I M P L E M E N T A T I O N ////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////// + +// __________________________________________________________________________________________________ +// OnInitDialog +// +LRESULT +CAboutDlg::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) +{ + CenterWindow(GetParent()); + return TRUE; +} + +// __________________________________________________________________________________________________ +// OnCloseCmd +// +LRESULT +CAboutDlg::OnCloseCmd(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/) +{ + EndDialog(wID); + return 0; +} \ No newline at end of file diff --git a/Source/Plugins/Plugin_PadDX9/Src/AboutDlg.h b/Source/Plugins/Plugin_PadDX9/Src/AboutDlg.h new file mode 100644 index 0000000000..fd6b4ad1cb --- /dev/null +++ b/Source/Plugins/Plugin_PadDX9/Src/AboutDlg.h @@ -0,0 +1,42 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ +///////////////////////////////////////////////////////////////////////////////////////////////////// +// M O D U L E B E G I N /////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////// + +#pragma once + +class CAboutDlg : public CDialogImpl +{ +public: + enum { IDD = IDD_ABOUTPAD }; + + BEGIN_MSG_MAP(CAboutDlg) + MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) + COMMAND_ID_HANDLER(IDOK, OnCloseCmd) + COMMAND_ID_HANDLER(IDCANCEL, OnCloseCmd) + END_MSG_MAP() + +// Handler prototypes (uncomment arguments if needed): +// LRESULT MessageHandler(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) +// LRESULT CommandHandler(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) +// LRESULT NotifyHandler(int /*idCtrl*/, LPNMHDR /*pnmh*/, BOOL& /*bHandled*/) + + LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/); + + LRESULT OnCloseCmd(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/); +}; diff --git a/Source/Plugins/Plugin_PadDX9/Src/ConfigDlg.cpp b/Source/Plugins/Plugin_PadDX9/Src/ConfigDlg.cpp new file mode 100644 index 0000000000..567f7d28de --- /dev/null +++ b/Source/Plugins/Plugin_PadDX9/Src/ConfigDlg.cpp @@ -0,0 +1,47 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ +///////////////////////////////////////////////////////////////////////////////////////////////////// +// M O D U L E B E G I N /////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////// + +#include "stdafx.h" +#include "resource.h" + +#include "ConfigDlg.h" + +///////////////////////////////////////////////////////////////////////////////////////////////////// +// I M P L E M E N T A T I O N ////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////// + +// __________________________________________________________________________________________________ +// OnInitDialog +// +LRESULT +CConfigDlg::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) +{ + return TRUE; +} + +// __________________________________________________________________________________________________ +// OnCloseCmd +// +LRESULT +CConfigDlg::OnCloseCmd(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/) +{ + EndDialog(wID); + return 0; +} diff --git a/Source/Plugins/Plugin_PadDX9/Src/ConfigDlg.h b/Source/Plugins/Plugin_PadDX9/Src/ConfigDlg.h new file mode 100644 index 0000000000..ac919d98c9 --- /dev/null +++ b/Source/Plugins/Plugin_PadDX9/Src/ConfigDlg.h @@ -0,0 +1,42 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ +///////////////////////////////////////////////////////////////////////////////////////////////////// +// M O D U L E B E G I N /////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////// + +#pragma once + +class CConfigDlg : public CDialogImpl +{ +public: + enum { IDD = IDD_PADCONFIG }; + + BEGIN_MSG_MAP(CConfigDlg) + MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) + COMMAND_ID_HANDLER(IDOK, OnCloseCmd) + END_MSG_MAP() + +private: + + // Handler prototypes (uncomment arguments if needed): + // LRESULT MessageHandler(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) + // LRESULT CommandHandler(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) + // LRESULT NotifyHandler(int /*idCtrl*/, LPNMHDR /*pnmh*/, BOOL& /*bHandled*/) + + LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/); + LRESULT OnCloseCmd(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/); +}; diff --git a/Source/Plugins/Plugin_PadDX9/Src/DIHandler.cpp b/Source/Plugins/Plugin_PadDX9/Src/DIHandler.cpp new file mode 100644 index 0000000000..79e4281f05 --- /dev/null +++ b/Source/Plugins/Plugin_PadDX9/Src/DIHandler.cpp @@ -0,0 +1,484 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ +///////////////////////////////////////////////////////////////////////////////////////////////////// +// M O D U L E B E G I N /////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////// + +#include "stdafx.h" +#include + +#include "PluginSpecs_Pad.h" +#include "multidi.h" +#include "DIHandler.h" + +///////////////////////////////////////////////////////////////////////////////////////////////////// +// T Y P E D E F S / D E F I N E S ////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////// + +// Actions used by this app +DIACTION CDIHandler::m_rgGameAction[] = +{ + // Keyboard input mappings + { CDIHandler::INPUT_MAIN_LEFT, DIKEYBOARD_LEFT, 0, TEXT("Main left"), }, + { CDIHandler::INPUT_MAIN_RIGHT, DIKEYBOARD_RIGHT, 0, TEXT("Main right"), }, + { CDIHandler::INPUT_MAIN_UP, DIKEYBOARD_UP, 0, TEXT("Main up"), }, + { CDIHandler::INPUT_MAIN_DOWN, DIKEYBOARD_DOWN, 0, TEXT("Main down"), }, + { CDIHandler::INPUT_CPAD_LEFT, DIKEYBOARD_J, 0, TEXT("CPad left"), }, + { CDIHandler::INPUT_CPAD_RIGHT, DIKEYBOARD_L, 0, TEXT("CPad right"), }, + { CDIHandler::INPUT_CPAD_UP, DIKEYBOARD_I, 0, TEXT("CPad up"), }, + { CDIHandler::INPUT_CPAD_DOWN, DIKEYBOARD_K, 0, TEXT("CPad down"), }, + { CDIHandler::INPUT_DPAD_LEFT, DIKEYBOARD_F, 0, TEXT("DPad left"), }, + { CDIHandler::INPUT_DPAD_RIGHT, DIKEYBOARD_H, 0, TEXT("DPad right"), }, + { CDIHandler::INPUT_DPAD_UP, DIKEYBOARD_T, 0, TEXT("DPad up"), }, + { CDIHandler::INPUT_DPAD_DOWN, DIKEYBOARD_G, 0, TEXT("DPad down"), }, + { CDIHandler::INPUT_BUTTON_START, DIKEYBOARD_RETURN, 0, TEXT("Start"), }, + { CDIHandler::INPUT_BUTTON_A, DIKEYBOARD_X, 0, TEXT("A-Button"), }, + { CDIHandler::INPUT_BUTTON_B, DIKEYBOARD_Y, 0, TEXT("B-Button"), }, + { CDIHandler::INPUT_BUTTON_X, DIKEYBOARD_S, 0, TEXT("X-Button"), }, + { CDIHandler::INPUT_BUTTON_Y, DIKEYBOARD_C, 0, TEXT("Y-Button"), }, + { CDIHandler::INPUT_BUTTON_Z, DIKEYBOARD_D, 0, TEXT("Z-Button"), }, + { CDIHandler::INPUT_BUTTON_L, DIKEYBOARD_Q, 0, TEXT("L-Trigger"), }, + { CDIHandler::INPUT_BUTTON_R, DIKEYBOARD_W, 0, TEXT("R-Trigger"), }, + + // Joystick input mappings + { CDIHandler::INPUT_MAIN_AXIS_LR, DIAXIS_ARCADEP_LATERAL, 0, _T("Main left/right"), }, + { CDIHandler::INPUT_MAIN_AXIS_UD, DIAXIS_ARCADEP_MOVE, 0, _T("Main Up/Down"), }, + { CDIHandler::INPUT_CPAD_AXIS_LR, DIAXIS_ANY_1, 0, _T("CPad left/right"), }, + { CDIHandler::INPUT_CPAD_AXIS_UP, DIAXIS_ANY_2, 0, _T("CPad Up/Down"), }, + { CDIHandler::INPUT_DPAD_AXIS_LR, DIPOV_ANY_1, 0, _T("DPad left/right"), }, + { CDIHandler::INPUT_DPAD_AXIS_UP, DIPOV_ANY_2, 0, _T("DPad Up/Down"), }, +}; + +const GUID g_guidApp = { 0x3afabad0, 0xd2c0, 0x4514, { 0xb4, 0x7e, 0x65, 0xfe, 0xf9, 0xb5, 0x14, 0x2e } }; +#define SAMPLE_KEY TEXT("Emulator\\Dolphin\\PadPlugin2") +#define NUMBER_OF_GAMEACTIONS (sizeof(m_rgGameAction)/sizeof(DIACTION)) + +///////////////////////////////////////////////////////////////////////////////////////////////////// +// I M P L E M E N T A T I O N ////////////////////////// //////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////// + +// ________________________________________________________________________________________ __________ +// constructor +// +CDIHandler::CDIHandler(void) : + m_hWnd(NULL), + m_pInputDeviceManager(NULL) +{ +} + +// ________________________________________________________________________________________ __________ +// destructor +// +CDIHandler::~CDIHandler(void) +{ + CleanupDirectInput(); +} + +// ________________________________________________________________________________________ __________ +// InitInput +// +HRESULT +CDIHandler::InitInput(HWND _hWnd) +{ + if (m_hWnd == _hWnd) + return S_OK; + + CleanupDirectInput(); + + m_hWnd = _hWnd; + + HRESULT hr; + + // Setup action format for the actual gameplay + ZeroMemory( &m_diafGame, sizeof(DIACTIONFORMAT) ); + m_diafGame.dwSize = sizeof(DIACTIONFORMAT); + m_diafGame.dwActionSize = sizeof(DIACTION); + m_diafGame.dwDataSize = NUMBER_OF_GAMEACTIONS * sizeof(DWORD); + m_diafGame.guidActionMap = g_guidApp; + m_diafGame.dwGenre = DIVIRTUAL_ARCADE_PLATFORM; + m_diafGame.dwNumActions = NUMBER_OF_GAMEACTIONS; + m_diafGame.rgoAction = m_rgGameAction; + m_diafGame.lAxisMin = -100; + m_diafGame.lAxisMax = 100; + m_diafGame.dwBufferSize = 32; + _tcscpy_s( m_diafGame.tszActionMap, _T("Dolphin Pad Plugin") ); + + // Create a new input device manager + m_pInputDeviceManager = new CMultiplayerInputDeviceManager( SAMPLE_KEY ); + + if( FAILED( hr = ChangeNumPlayers( 1, FALSE, FALSE ) ) ) + { + MessageBox(NULL, "InitInput", "Pad", MB_OK); + return S_FALSE; + } + + return S_OK; +} + +// ________________________________________________________________________________________ __________ +// ConfigInput +// +void +CDIHandler::ConfigInput(void) +{ + HRESULT hr; + + CleanupDeviceStateStructs(); + + // Configure the devices (with edit capability) + hr = m_pInputDeviceManager->ConfigureDevices( m_hWnd, NULL, NULL, DICD_EDIT, NULL ); + if( FAILED(hr) ) + { + if( hr == E_DIUTILERR_PLAYERWITHOUTDEVICE ) + { + // There's a player that hasn't been assigned a device. Some games may + // want to handle this by reducing the number of players, or auto-assigning + // a device, or warning the user, etc. + MessageBox( m_hWnd, TEXT("There is at least one player that wasn't assigned ") \ + TEXT("a device\n") \ + TEXT("Press OK to auto-assign a device to these users"), + TEXT("Player Without Device"), MB_OK | MB_ICONEXCLAMATION ); + } + + // Auto-reassign every player a device. + ChangeNumPlayers( m_dwNumPlayers, FALSE, FALSE ); + } +} + +// ________________________________________________________________________________________ __________ +// CleanupDirectInput +// +void +CDIHandler::CleanupDirectInput(void) +{ + if( NULL == m_pInputDeviceManager ) + return; + + CleanupDeviceStateStructs(); + + // Cleanup DirectX input objects + SAFE_DELETE( m_pInputDeviceManager ); +} + +// ________________________________________________________________________________________ __________ +// CleanupDeviceStateStructs +// +void +CDIHandler::CleanupDeviceStateStructs(void) +{ + // Get access to the list of semantically-mapped input devices + // to delete all InputDeviceState structs before calling ConfigureDevices() + CMultiplayerInputDeviceManager::DeviceInfo* pDeviceInfos; + DWORD dwNumDevices; + + m_pInputDeviceManager->GetDevices( &pDeviceInfos, &dwNumDevices ); + + for( DWORD i=0; iCreate( m_hWnd, strUserNames, m_dwNumPlayers, &m_diafGame, + StaticInputAddDeviceCB, NULL, + bResetOwnership, bResetMappings ); + + if( FAILED(hr) ) + { + switch( hr ) + { + case E_DIUTILERR_DEVICESTAKEN: + { + // It's possible that a single user could "own" too many devices for the other + // players to get into the game. If so, we reinit the manager class to provide + // each user with a device that has a default configuration. + bResetOwnership = TRUE; + + MessageBox( m_hWnd, TEXT("You have entered more users than there are suitable ") \ + TEXT("devices, or some users are claiming too many devices.\n") \ + TEXT("Press OK to give each user a default device"), + TEXT("Devices Are Taken"), MB_OK | MB_ICONEXCLAMATION ); + break; + } + + case E_DIUTILERR_TOOMANYUSERS: + { + // Another common error is if more users are attempting to play than there are devices + // attached to the machine. In this case, the number of players is automatically + // lowered to make playing the game possible. + DWORD dwNumDevices = m_pInputDeviceManager->GetNumDevices(); + m_dwNumPlayers = dwNumDevices; + + TCHAR sz[256]; + wsprintf( sz, TEXT("There are not enough devices attached to the ") \ + TEXT("system for the number of users you entered.\nThe ") \ + TEXT("number of users has been automatically changed to ") \ + TEXT("%i (the number of devices available on the system)."), + m_dwNumPlayers ); + MessageBox( m_hWnd, sz, _T("Too Many Users"), MB_OK | MB_ICONEXCLAMATION ); + break; + } + + default: + MessageBox(NULL, "ChangeNumPlayers", "Pad", MB_OK); + return S_FALSE; + break; + } + + m_pInputDeviceManager->Cleanup(); + } + else + { + bSuccess = TRUE; + } + } + + return S_OK; +} + +// ________________________________________________________________________________________ __________ +// UpdateInput +// +void +CDIHandler::UpdateInput(void) +{ + if( NULL == m_pInputDeviceManager ) + return; + + CMultiplayerInputDeviceManager::DeviceInfo* pDeviceInfos; + DWORD dwNumDevices; + + // Get access to the list of semantically-mapped input devices + m_pInputDeviceManager->GetDevices( &pDeviceInfos, &dwNumDevices ); + + // Loop through all devices and check game input + for( DWORD i=0; ifMainLR = 0.0f; + pInputDeviceState->fMainUP = 0.0f; + pInputDeviceState->fCPadLR = 0.0f; + pInputDeviceState->fCPadUP = 0.0f; + pInputDeviceState->fDPadLR = 0.0f; + pInputDeviceState->fDPadUP = 0.0f; + pInputDeviceState->fTriggerL = 0.0f; + pInputDeviceState->fTriggerR = 0.0f; + } + + hr = pdidDevice->Acquire(); + hr = pdidDevice->Poll(); + hr = pdidDevice->GetDeviceData( sizeof(DIDEVICEOBJECTDATA), rgdod, &dwItems, 0 ); + if( FAILED(hr) ) + continue; + + // Get the sematics codes for the game menu + for( DWORD j=0; jfMainLR = fAxisState; break; + case INPUT_MAIN_AXIS_UD: pInputDeviceState->fMainUP = fAxisState; break; + case INPUT_CPAD_AXIS_LR: pInputDeviceState->fCPadLR = fAxisState; break; + case INPUT_CPAD_AXIS_UP: pInputDeviceState->fCPadUP = fAxisState; break; + case INPUT_DPAD_AXIS_LR: pInputDeviceState->fDPadLR = fAxisState; break; + case INPUT_DPAD_AXIS_UP: pInputDeviceState->fDPadUP = fAxisState; break; + + // Handle buttons separately so the button state data + // doesn't overwrite the axis state data, and handle + // each button separately so they don't overwrite each other + case INPUT_MAIN_LEFT: pInputDeviceState->bMainLeft = bButtonState; break; + case INPUT_MAIN_RIGHT: pInputDeviceState->bMainRight = bButtonState; break; + case INPUT_MAIN_UP: pInputDeviceState->bMainUp = bButtonState; break; + case INPUT_MAIN_DOWN: pInputDeviceState->bMainDown = bButtonState; break; + case INPUT_CPAD_LEFT: pInputDeviceState->bCPadLeft = bButtonState; break; + case INPUT_CPAD_RIGHT: pInputDeviceState->bCPadRight = bButtonState; break; + case INPUT_CPAD_UP: pInputDeviceState->bCPadUp = bButtonState; break; + case INPUT_CPAD_DOWN: pInputDeviceState->bCPadDown = bButtonState; break; + case INPUT_DPAD_LEFT: pInputDeviceState->bDPadLeft = bButtonState; break; + case INPUT_DPAD_RIGHT: pInputDeviceState->bDPadRight = bButtonState; break; + case INPUT_DPAD_UP: pInputDeviceState->bDPadUp = bButtonState; break; + case INPUT_DPAD_DOWN: pInputDeviceState->bDPadDown = bButtonState; break; + + case INPUT_BUTTON_START: pInputDeviceState->bButtonStart = bButtonState; break; + case INPUT_BUTTON_A: pInputDeviceState->bButtonA = bButtonState; break; + case INPUT_BUTTON_B: pInputDeviceState->bButtonB = bButtonState; break; + case INPUT_BUTTON_X: pInputDeviceState->bButtonX = bButtonState; break; + case INPUT_BUTTON_Y: pInputDeviceState->bButtonY = bButtonState; break; + case INPUT_BUTTON_Z: pInputDeviceState->bButtonZ = bButtonState; break; + case INPUT_BUTTON_L: pInputDeviceState->fTriggerL = bButtonState; break; + case INPUT_BUTTON_R: pInputDeviceState->fTriggerR = bButtonState; break; + } + } + } + + for( DWORD iPlayer=0; iPlayerdwPlayerIndex != iPlayer ) + continue; + + SUserInput* pInputDeviceState = (SUserInput*)pDeviceInfos[i].pParam; + + // main-axis + if( fabs(pInputDeviceState->fMainLR) > fabs(ctrlInput.fMainLR) ) + ctrlInput.fMainLR = pInputDeviceState->fMainLR; + if( fabs(pInputDeviceState->fMainUP) > fabs(ctrlInput.fMainUP) ) + ctrlInput.fMainUP = pInputDeviceState->fMainUP; + + if (pInputDeviceState->bMainLeft) ctrlInput.fMainLR = -1.0f; + if (pInputDeviceState->bMainRight) ctrlInput.fMainLR = 1.0f; + if (pInputDeviceState->bMainUp) ctrlInput.fMainUP = -1.0f; + if (pInputDeviceState->bMainDown) ctrlInput.fMainUP = 1.0f; + + // CPad-axis + if( fabs(pInputDeviceState->fCPadLR) > fabs(ctrlInput.fCPadLR) ) + ctrlInput.fCPadLR = pInputDeviceState->fCPadLR; + if( fabs(pInputDeviceState->fCPadUP) > fabs(ctrlInput.fCPadUP) ) + ctrlInput.fCPadUP = pInputDeviceState->fCPadUP; + + if (pInputDeviceState->bCPadLeft) ctrlInput.fCPadLR = -1.0f; + if (pInputDeviceState->bCPadRight) ctrlInput.fCPadLR = 1.0f; + if (pInputDeviceState->bCPadUp) ctrlInput.fCPadUP = -1.0f; + if (pInputDeviceState->bCPadDown) ctrlInput.fCPadUP = 1.0f; + + // DPad-axis + if( fabs(pInputDeviceState->fDPadLR) > fabs(ctrlInput.fDPadLR) ) + ctrlInput.fDPadLR = pInputDeviceState->fDPadLR; + if( fabs(pInputDeviceState->fDPadUP) > fabs(ctrlInput.fDPadUP) ) + ctrlInput.fDPadUP = pInputDeviceState->fDPadUP; + + if (pInputDeviceState->bDPadLeft) ctrlInput.fDPadLR = -1.0f; + if (pInputDeviceState->bDPadRight) ctrlInput.fDPadLR = 1.0f; + if (pInputDeviceState->bDPadUp) ctrlInput.fDPadUP = -1.0f; + if (pInputDeviceState->bDPadDown) ctrlInput.fDPadUP = 1.0f; + + // buttons + if (pInputDeviceState->bButtonA) ctrlInput.bButtonA = true; + if (pInputDeviceState->bButtonB) ctrlInput.bButtonB = true; + if (pInputDeviceState->bButtonX) ctrlInput.bButtonX = true; + if (pInputDeviceState->bButtonY) ctrlInput.bButtonY = true; + if (pInputDeviceState->bButtonZ) ctrlInput.bButtonZ = true; + if (pInputDeviceState->bButtonStart)ctrlInput.bButtonStart = true; + if (pInputDeviceState->fTriggerL) ctrlInput.fTriggerL = true; + if (pInputDeviceState->fTriggerR) ctrlInput.fTriggerR = true; + } + } +} + +// ________________________________________________________________________________________ __________ +// StaticInputAddDeviceCB +// +HRESULT CALLBACK +CDIHandler::StaticInputAddDeviceCB( CMultiplayerInputDeviceManager::PlayerInfo* pPlayerInfo, + CMultiplayerInputDeviceManager::DeviceInfo* pDeviceInfo, + const DIDEVICEINSTANCE* pdidi, + LPVOID pParam) +{ + CDIHandler* pApp = (CDIHandler*) pParam; + return pApp->InputAddDeviceCB( pPlayerInfo, pDeviceInfo, pdidi ); +} + +// ________________________________________________________________________________________ __________ +// InputAddDeviceCB +// +HRESULT +CDIHandler::InputAddDeviceCB( CMultiplayerInputDeviceManager::PlayerInfo* pPlayerInfo, + CMultiplayerInputDeviceManager::DeviceInfo* pDeviceInfo, + const DIDEVICEINSTANCE* pdidi) +{ + if( (GET_DIDEVICE_TYPE(pdidi->dwDevType) != DI8DEVTYPE_KEYBOARD) && + (GET_DIDEVICE_TYPE(pdidi->dwDevType) != DI8DEVTYPE_MOUSE) ) + { + // Setup the deadzone + DIPROPDWORD dipdw; + dipdw.diph.dwSize = sizeof(DIPROPDWORD); + dipdw.diph.dwHeaderSize = sizeof(DIPROPHEADER); + dipdw.diph.dwObj = 0; + dipdw.diph.dwHow = DIPH_DEVICE; + dipdw.dwData = 500; + pDeviceInfo->pdidDevice->SetProperty( DIPROP_DEADZONE, &dipdw.diph ); + } + + // Create a new InputDeviceState for each device so the + // app can record its state + SUserInput* pNewInputDeviceState = new SUserInput; + ZeroMemory( pNewInputDeviceState, sizeof(SUserInput) ); + pDeviceInfo->pParam = (LPVOID) pNewInputDeviceState; + + return S_OK; +} \ No newline at end of file diff --git a/Source/Plugins/Plugin_PadDX9/Src/DIHandler.h b/Source/Plugins/Plugin_PadDX9/Src/DIHandler.h new file mode 100644 index 0000000000..30fa2369e8 --- /dev/null +++ b/Source/Plugins/Plugin_PadDX9/Src/DIHandler.h @@ -0,0 +1,164 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ +///////////////////////////////////////////////////////////////////////////////////////////////////// +// M O D U L E B E G I N /////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////// + +#pragma once + + +// Struct to store the current input state +struct SControllerInput +{ + float fMainLR; + float fMainUP; + float fCPadLR; + float fCPadUP; + float fDPadLR; + float fDPadUP; + + bool bButtonStart; + bool bButtonA; + bool bButtonB; + bool bButtonX; + bool bButtonY; + bool bButtonZ; + + float fTriggerL; + float fTriggerR; +}; + +class CDIHandler +{ +public: + CDIHandler(void); + + ~CDIHandler(void); + + HRESULT InitInput(HWND _hWnd); + void ConfigInput(void); + void CleanupDirectInput(void); + void UpdateInput(void); + + const SControllerInput& GetControllerInput(unsigned int _number) + { + return m_controllerInput[_number]; + } + +private: + + enum + { + MAX_AXIS = 127 + }; + + enum INPUT_SEMANTICS + { + // Gameplay semantics + INPUT_MAIN_AXIS_LR=1, + INPUT_MAIN_AXIS_UD, + INPUT_MAIN_LEFT, + INPUT_MAIN_RIGHT, + INPUT_MAIN_UP, + INPUT_MAIN_DOWN, + INPUT_CPAD_AXIS_LR, + INPUT_CPAD_AXIS_UP, + INPUT_CPAD_LEFT, + INPUT_CPAD_RIGHT, + INPUT_CPAD_UP, + INPUT_CPAD_DOWN, + INPUT_DPAD_AXIS_LR, + INPUT_DPAD_AXIS_UP, + INPUT_DPAD_LEFT, + INPUT_DPAD_RIGHT, + INPUT_DPAD_UP, + INPUT_DPAD_DOWN, + INPUT_BUTTON_START, + INPUT_BUTTON_A, + INPUT_BUTTON_B, + INPUT_BUTTON_X, + INPUT_BUTTON_Y, + INPUT_BUTTON_Z, + INPUT_BUTTON_L, + INPUT_BUTTON_R + }; + + // Struct to store the current input state + struct SUserInput + { + bool bMainLeft; + bool bMainRight; + bool bMainUp; + bool bMainDown; + float fMainLR; + float fMainUP; + + bool bCPadLeft; + bool bCPadRight; + bool bCPadUp; + bool bCPadDown; + float fCPadLR; + float fCPadUP; + + bool bDPadLeft; + bool bDPadRight; + bool bDPadUp; + bool bDPadDown; + float fDPadLR; + float fDPadUP; + + bool bButtonStart; + bool bButtonA; + bool bButtonB; + bool bButtonX; + bool bButtonY; + bool bButtonZ; + + bool fTriggerL; + bool fTriggerR; + }; + + // handle to window that "owns" the DInput + HWND m_hWnd; + + static DIACTION m_rgGameAction[]; + + // DirectInput multiplayer device manager + CMultiplayerInputDeviceManager* m_pInputDeviceManager; + + // Action format for game play + DIACTIONFORMAT m_diafGame; + + // Struct for storing user input + SControllerInput m_controllerInput[4]; + + // Number of players in the game + DWORD m_dwNumPlayers; + + void CleanupDeviceStateStructs(void); + + HRESULT ChangeNumPlayers(DWORD _dwNumPlayers, BOOL _bResetOwnership, BOOL _bResetMappings); + + static HRESULT CALLBACK StaticInputAddDeviceCB(CMultiplayerInputDeviceManager::PlayerInfo* _pPlayerInfo, + CMultiplayerInputDeviceManager::DeviceInfo* _pDeviceInfo, + const DIDEVICEINSTANCE* _pdidi, + LPVOID _pParam); + + HRESULT InputAddDeviceCB(CMultiplayerInputDeviceManager::PlayerInfo* _pPlayerInfo, + CMultiplayerInputDeviceManager::DeviceInfo* _pDeviceInfo, + const DIDEVICEINSTANCE* _pdidi); +}; \ No newline at end of file diff --git a/Source/Plugins/Plugin_PadDX9/Src/IniFile.cpp b/Source/Plugins/Plugin_PadDX9/Src/IniFile.cpp new file mode 100644 index 0000000000..dd8ec233d3 --- /dev/null +++ b/Source/Plugins/Plugin_PadDX9/Src/IniFile.cpp @@ -0,0 +1,155 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ +///////////////////////////////////////////////////////////////////////////////////////////////////// +// M O D U L E B E G I N /////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////// + +#include "stdafx.h" + +#include "IniFile.h" + +///////////////////////////////////////////////////////////////////////////////////////////////////// +// I M P L E M E N T A T I O N ////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////// + +// ________________________________________________________________________________________ __________ +// constructor +// +IniFile::IniFile(void) +{ +} + +// ________________________________________________________________________________________ __________ +// destructor +// +IniFile::~IniFile(void) +{ +} + +// ________________________________________________________________________________________ __________ +// SetFile +// +void +IniFile::SetFile(const TCHAR* _filename) +{ + if (_filename) + { + char path_buffer[_MAX_PATH], drive[_MAX_DRIVE] ,dir[_MAX_DIR]; + char fname[_MAX_FNAME],ext[_MAX_EXT]; + + GetModuleFileName(NULL,path_buffer,sizeof(path_buffer)); + _splitpath( path_buffer, drive, dir, fname, ext ); + _makepath( filename, drive, dir, _filename, ".ini"); + } +} + +// ________________________________________________________________________________________ __________ +// SetSection +// +void +IniFile::SetSection(const TCHAR *_section) +{ + _tcscpy(section,_section); +} + +// ________________________________________________________________________________________ __________ +// ReadInt +// +int +IniFile::ReadInt(const TCHAR *key, int def) +{ + return GetPrivateProfileInt(section, key, def, filename); +} + +// ________________________________________________________________________________________ __________ +// WriteInt +// +void +IniFile::WriteInt(const TCHAR *key, int value) +{ + char temp[256]; + WritePrivateProfileString(section, key, _itoa(value,temp,10), filename); +} + +// ________________________________________________________________________________________ __________ +// ReadBool +// +bool +IniFile::ReadBool(const TCHAR *key, bool def) +{ + return ReadInt(key,def?1:0) == 0 ? false : true; +} + +// ________________________________________________________________________________________ __________ +// WriteBool +// +void +IniFile::WriteBool(const TCHAR *key, bool value) +{ + WriteInt(key,value?1:0); +} + +// ________________________________________________________________________________________ __________ +// ReadString +// +void +IniFile::ReadString(const TCHAR *key, const TCHAR *def, TCHAR *out, int size) +{ + GetPrivateProfileString(section, key, def, out, size, filename); +} + +// ________________________________________________________________________________________ __________ +// WriteString +// +void +IniFile::WriteString(const TCHAR *key, const TCHAR *value) +{ + WritePrivateProfileString(section, key, value, filename); +} + +// ________________________________________________________________________________________ __________ +// ReadStringList +// +void +IniFile::ReadStringList(const TCHAR *key, std::vector &list) +{ + int count = ReadInt(key); + for (int i=0; i &list) +{ + WriteInt(key,(int)list.size()); + int i=0; + for (std::vector::iterator iter = list.begin(); iter!=list.end(); iter++) + { + char temp[256]; + sprintf(temp,"%s%i",key,i); + WriteString(temp,iter->c_str()); + i++; + } +} \ No newline at end of file diff --git a/Source/Plugins/Plugin_PadDX9/Src/IniFile.h b/Source/Plugins/Plugin_PadDX9/Src/IniFile.h new file mode 100644 index 0000000000..bdfee1169a --- /dev/null +++ b/Source/Plugins/Plugin_PadDX9/Src/IniFile.h @@ -0,0 +1,48 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ +///////////////////////////////////////////////////////////////////////////////////////////////////// +// M O D U L E B E G I N /////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////// + +#pragma once + +///////////////////////////////////////////////////////////////////////////////////////////////////// +// C L A S S //////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////// + +class IniFile +{ +public: + IniFile(void); + ~IniFile(void); + + void SetFile(const TCHAR *fname); + void SetSection(const TCHAR *section); + + int ReadInt (const TCHAR *key, int def = 0); + void WriteInt (const TCHAR *key, int value); + bool ReadBool (const TCHAR *key, bool def = false); + void WriteBool (const TCHAR *key, bool value); + void ReadString (const TCHAR *key, const TCHAR *def, TCHAR *out, int size = 255); + void WriteString(const TCHAR *key, const TCHAR *value); + void ReadStringList (const TCHAR *key, std::vector &list); + void WriteStringList(const TCHAR *key, std::vector &list); + +private: + TCHAR filename[512]; + TCHAR section[256]; +}; \ No newline at end of file diff --git a/Source/Plugins/Plugin_PadDX9/Src/main.cpp b/Source/Plugins/Plugin_PadDX9/Src/main.cpp new file mode 100644 index 0000000000..209b7b4b20 --- /dev/null +++ b/Source/Plugins/Plugin_PadDX9/Src/main.cpp @@ -0,0 +1,200 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ +///////////////////////////////////////////////////////////////////////////////////////////////////// +// M O D U L E B E G I N /////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////// + +#include "stdafx.h" +#include "resource.h" +#include "PluginSpecs_Pad.h" + +#include "IniFile.h" +#include "AboutDlg.h" +#include "ConfigDlg.h" + +#include "multidi.h" +#include "DIHandler.h" + +///////////////////////////////////////////////////////////////////////////////////////////////////// +// T Y P E D E F S / D E F I N E S ////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////// + +HINSTANCE g_hInstance = NULL; +SPADInitialize g_PADInitialize; + +CDIHandler g_diHandler; + +///////////////////////////////////////////////////////////////////////////////////////////////////// +// I M P L E M E N T A T I O N ////////////////////////// //////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////// + +// ________________________________________________________________________________________ __________ +// DllMain +// +BOOL APIENTRY DllMain( HINSTANCE _hinstDLL, // DLL module handle + DWORD dwReason, // reason called + LPVOID _lpvReserved) // reserved +{ + switch (dwReason) + { + case DLL_PROCESS_ATTACH: + break; + + case DLL_PROCESS_DETACH: + break; + + default: + break; + } + + g_hInstance = _hinstDLL; + return TRUE; +} + +// __________________________________________________________________________________________________ +// GetDllInfo +// +void GetDllInfo (PLUGIN_INFO* _PluginInfo) +{ + _PluginInfo->Version = 0x0100; + _PluginInfo->Type = PLUGIN_TYPE_PAD; + +#ifndef _DEBUG + sprintf_s(_PluginInfo->Name, 100, "Pad DirectX9"); +#else + sprintf_s(_PluginInfo->Name, 100, "Pad DirectX9 (Debug)"); +#endif +} + +// __________________________________________________________________________________________________ +// DllAbout +// +void DllAbout(HWND _hParent) +{ + CAboutDlg aboutDlg; + aboutDlg.DoModal(_hParent); +} + +// __________________________________________________________________________________________________ +// DllConfig +// +void DllConfig(HWND _hParent) +{ + g_diHandler.InitInput(_hParent); + + EnableWindow(_hParent, FALSE); + g_diHandler.ConfigInput(); + EnableWindow(_hParent, TRUE); + SetForegroundWindow(_hParent); + + g_diHandler.CleanupDirectInput(); +} + +// __________________________________________________________________________________________________ +// PAD_Initialize +// +void PAD_Initialize(SPADInitialize _PADInitialize) +{ + g_PADInitialize = _PADInitialize; + g_diHandler.InitInput((HWND)_PADInitialize.hWnd); +} + +// __________________________________________________________________________________________________ +// PAD_Shutdown +// +void PAD_Shutdown(void) +{ + g_diHandler.CleanupDirectInput(); +} + +// __________________________________________________________________________________________________ +// PADGetStatus +// +void PAD_GetStatus(BYTE _numPAD, SPADStatus* _pPADStatus) +{ + // check if all is okay + if ((_numPAD != 0) || // we support just pad 0 + (_pPADStatus == NULL)) + return; + +#ifdef RECORD_REPLAY + *_pPADStatus = PlayRecord(); + return; +#endif + + int base = 0x80; + + // clear pad + memset(_pPADStatus,0,sizeof(SPADStatus)); + + _pPADStatus->stickY = base; + _pPADStatus->stickX = base; + _pPADStatus->substickX = base; + _pPADStatus->substickY = base; + + _pPADStatus->button |= PAD_USE_ORIGIN; + // just update pad on focus + if (g_PADInitialize.hWnd != ::GetForegroundWindow()) + return; + + //get keys from dinput + g_diHandler.UpdateInput(); + + const SControllerInput& rInput = g_diHandler.GetControllerInput(_numPAD); + +// int mainvalue = (dinput.diks[keyForControl[CTL_HALFMAIN]] &0xFF) ? 40 : 100; +// int subvalue = (dinput.diks[keyForControl[CTL_HALFSUB]] &0xFF) ? 40 : 100; +// int triggervalue = (dinput.diks[keyForControl[CTL_HALFTRIGGER]]&0xFF) ? 100 : 255; + + // get the new keys + if (rInput.bButtonStart) _pPADStatus->button |= PAD_BUTTON_START; + if (rInput.bButtonA) {_pPADStatus->button |= PAD_BUTTON_A; _pPADStatus->analogA = 255;} + if (rInput.bButtonB) {_pPADStatus->button |= PAD_BUTTON_B; _pPADStatus->analogB = 255;} + if (rInput.bButtonX) _pPADStatus->button |= PAD_BUTTON_X; + if (rInput.bButtonY) _pPADStatus->button |= PAD_BUTTON_Y; + if (rInput.bButtonZ) _pPADStatus->button |= PAD_TRIGGER_Z; + + if (rInput.fDPadLR < 0) _pPADStatus->button |= PAD_BUTTON_UP; + if (rInput.fDPadLR > 0) _pPADStatus->button |= PAD_BUTTON_DOWN; + if (rInput.fDPadUP < 0) _pPADStatus->button |= PAD_BUTTON_LEFT; + if (rInput.fDPadUP > 0) _pPADStatus->button |= PAD_BUTTON_RIGHT; + + if (rInput.fTriggerL > 0) {_pPADStatus->button |= PAD_TRIGGER_L; _pPADStatus->triggerLeft = 255;} + if (rInput.fTriggerR > 0) {_pPADStatus->button |= PAD_TRIGGER_R; _pPADStatus->triggerRight = 255;} + + _pPADStatus->stickX = 0x80 + (unsigned __int8)(rInput.fMainLR * 127.f); + _pPADStatus->stickY = 0x80 + (unsigned __int8)(rInput.fMainUP * -127.f); + _pPADStatus->substickX = 0x80 + (unsigned __int8)(rInput.fCPadLR * 127.f); + _pPADStatus->substickY = 0x80 + (unsigned __int8)(rInput.fCPadUP * -127.f); + + _pPADStatus->err = PAD_ERR_NONE; +} + +// __________________________________________________________________________________________________ +// PAD_Rumble +// +void PAD_Rumble(BYTE _numPAD, unsigned int _uType, unsigned int _uStrength) +{ +} + +// __________________________________________________________________________________________________ +// SaveLoadState +// +unsigned __int32 SaveLoadState(char* _ptr, BOOL _bSave) +{ + return 0; +} \ No newline at end of file diff --git a/Source/Plugins/Plugin_PadDX9/Src/multidi.cpp b/Source/Plugins/Plugin_PadDX9/Src/multidi.cpp new file mode 100644 index 0000000000..bc2c360e5f --- /dev/null +++ b/Source/Plugins/Plugin_PadDX9/Src/multidi.cpp @@ -0,0 +1,1057 @@ +//----------------------------------------------------------------------------- +// File: MultiDI.cpp +// +// Desc: DirectInput framework class using semantic mapping with multiplayer +// device ownership. Feel free to use this class as a starting point +// for adding extra functionality. +// +// Copyright (C) Microsoft Corporation. All Rights Reserved. +//----------------------------------------------------------------------------- +#define STRICT +#define DIRECTINPUT_VERSION 0x0800 + +#include "stdafx.h" + +#include +#include +#include +#include +#include +#include // included to get the D3DCOLOR_RGBA macro. +#include "MultiDI.h" +#include + + + + +//----------------------------------------------------------------------------- +// Name: CMultiplayerInputDeviceManager +// Desc: Constructor +// Args: strRegKey - A location in the registry where device ownership +// information should be stored +//----------------------------------------------------------------------------- +CMultiplayerInputDeviceManager::CMultiplayerInputDeviceManager( TCHAR* strRegKey ) +{ + HRESULT hr = CoInitialize(NULL); + m_bCleanupCOM = SUCCEEDED(hr); + LONG nResult; + + // Initialize members + m_pDI = NULL; + m_hWnd = NULL; + m_pdiaf = NULL; + m_pUsers = NULL; + m_pDeviceList = NULL; + m_AddDeviceCallback = NULL; + m_AddDeviceCallbackParam = NULL; + m_hKey = NULL; + m_dwNumDevices = 0; + m_dwMaxDevices = 0; + + + // Duplicate the registry location string since we'll need this again later + m_strKey = _tcsdup( strRegKey ); + if( m_strKey == NULL ) + return; + + // Create a reg key to store device ownership data + nResult = RegCreateKeyEx( HKEY_CURRENT_USER, strRegKey, 0, NULL, + REG_OPTION_NON_VOLATILE, KEY_READ | KEY_WRITE, NULL, + &m_hKey, NULL ); + if(nResult != ERROR_SUCCESS) + m_hKey = NULL; +} + + + + +//----------------------------------------------------------------------------- +// Name: ~CMultiplayerInputDeviceManager +// Desc: Destructor +//----------------------------------------------------------------------------- +CMultiplayerInputDeviceManager::~CMultiplayerInputDeviceManager() +{ + Cleanup(); + + if( m_bCleanupCOM ) + CoUninitialize(); + + RegCloseKey( m_hKey ); + + free( m_strKey ); +} + + + + +//----------------------------------------------------------------------------- +// Name: Create +// Desc: Initializes the class, and enums the devices. See MultiMapper sample +// for how to use this class. +// It might fail if there are too many players for the +// number of devices availible, or if one player owns too many +// devices preventing others from having a device. Its up the app +// to prevent this or respond to this. +// Note: strUserName should be a array of sz strings +//----------------------------------------------------------------------------- +HRESULT CMultiplayerInputDeviceManager::Create( HWND hWnd, + TCHAR* strUserNames[], + DWORD dwNumUsers, + DIACTIONFORMAT* pdiaf, + LPDIMANAGERCALLBACK AddDeviceCallback, + LPVOID pCallbackParam, + BOOL bResetOwnership, + BOOL bResetMappings ) +{ + HRESULT hr; + + if( strUserNames == NULL || dwNumUsers == 0 ) + return E_INVALIDARG; + + Cleanup(); + + // Store data + m_hWnd = hWnd; + + // Create and init the m_pUsers array + m_dwNumUsers = dwNumUsers; + m_pUsers = new PlayerInfo*[dwNumUsers]; + for( DWORD i=0; idwPlayerIndex = i; // set the 0-based player index (for easy referencing) + lstrcpyn( m_pUsers[i]->strPlayerName, strUserNames[i], MAX_PATH-1 ); + } + + m_AddDeviceCallback = AddDeviceCallback; + m_AddDeviceCallbackParam = pCallbackParam; + + // Create the base DirectInput object + if( FAILED( hr = DirectInput8Create( GetModuleHandle(NULL), DIRECTINPUT_VERSION, + IID_IDirectInput8, (VOID**)&m_pDI, NULL ) ) ) + return DXTRACE_ERR( TEXT("DirectInput8Create"), hr ); + + if( FAILED( hr = SetActionFormat( pdiaf, TRUE, bResetOwnership, bResetMappings ) ) ) + return DXTRACE_ERR( TEXT("SetActionFormat"), hr ); + + return S_OK; +} + + + + +//----------------------------------------------------------------------------- +// Name: SetActionFormat +// Desc: Sets a new action format. +// It re-enumerates the devices if bReenumerate +// It resets the ownership of the devices if bResetOwnership +// It resets the mapper actions of the devices if bResetMappings +// This function may fail if there are too many players for the +// number of devices availible, or if one player owns too many +// devices preventing others from having a device. Its up the app +// to prevent this or respond to this. +//----------------------------------------------------------------------------- +HRESULT CMultiplayerInputDeviceManager::SetActionFormat( DIACTIONFORMAT* pdiaf, + BOOL bReenumerate, + BOOL bResetOwnership, + BOOL bResetMappings ) +{ + HRESULT hr; + DWORD iPlayer; + DWORD iDevice; + + // Store the new action format + m_pdiaf = pdiaf; + + // Only destroy and re-enumerate devices if the caller explicitly wants to. + // This isn't thread safe, so be sure not to have any other threads using + // this data unless you redesign this class + if( bReenumerate ) + { + // Set all players to not have a device yet + for( iPlayer=0; iPlayerbFoundDeviceForPlayer = FALSE; + + if( bResetOwnership ) + { + // Set all devices as not assigned to a player + for( iDevice=0; iDeviceBuildActionMap( m_pdiaf, pPlayerInfo->strPlayerName, DIDBAM_DEFAULT ) ) ) + return DXTRACE_ERR( TEXT("BuildActionMap"), hr ); + if( FAILED( hr = pdidDevice->SetActionMap( m_pdiaf, pPlayerInfo->strPlayerName, DIDSAM_DEFAULT ) ) ) + return DXTRACE_ERR( TEXT("SetActionMap"), hr ); + } + } + + return S_OK; +} + + + + +//----------------------------------------------------------------------------- +// Name: BuildDeviceList +// Desc: +//----------------------------------------------------------------------------- +HRESULT CMultiplayerInputDeviceManager::BuildDeviceList() +{ + // Cleanup any previously enumerated devices + CleanupDeviceList(); + + // Build a simple list of all devices currently attached to the machine. This + // array will be used to reassign devices to each user. + m_dwMaxDevices = 5; + m_dwNumDevices = 0; + m_pDeviceList = NULL; + + DeviceInfo* pListNew = NULL; + pListNew = (DeviceInfo*) realloc( m_pDeviceList, m_dwMaxDevices*sizeof(DeviceInfo) ); + + // Verify allocation + if( NULL == pListNew ) + return DXTRACE_ERR( TEXT("BuildDeviceList"), E_OUTOFMEMORY ); + else + m_pDeviceList = pListNew; + + ZeroMemory( m_pDeviceList, m_dwMaxDevices*sizeof(DeviceInfo) ); + + // Enumerate available devices for any user. + HRESULT rs = m_pDI->EnumDevicesBySemantics( NULL, m_pdiaf, StaticEnumSuitableDevicesCB, + this, DIEDBSFL_ATTACHEDONLY ); + + return S_OK; +} + + + + +//----------------------------------------------------------------------------- +// Name: EnumSuitableDevicesCB +// Desc: DirectInput device enumeratation callback. Calls AddDevice() +// on each device enumerated. +//----------------------------------------------------------------------------- +BOOL CALLBACK CMultiplayerInputDeviceManager::StaticEnumSuitableDevicesCB( LPCDIDEVICEINSTANCE pdidi, + LPDIRECTINPUTDEVICE8 pdidDevice, + DWORD dwFlags, DWORD dwDeviceRemaining, + VOID* pContext ) +{ + // Add the device to the device manager's internal list + CMultiplayerInputDeviceManager* pInputDeviceManager = (CMultiplayerInputDeviceManager*)pContext; + return pInputDeviceManager->EnumDevice( pdidi, pdidDevice, + dwFlags, dwDeviceRemaining ); +} + + + + +//----------------------------------------------------------------------------- +// Name: EnumDevice +// Desc: Enums each device to see if its suitable to add +//----------------------------------------------------------------------------- +BOOL CMultiplayerInputDeviceManager::EnumDevice( const DIDEVICEINSTANCE* pdidi, + const LPDIRECTINPUTDEVICE8 pdidDevice, + DWORD dwFlags, DWORD dwRemainingDevices ) +{ + TCHAR strPlayerName[MAX_PATH]; + TCHAR strDeviceGuid[40]; + + // Devices of type DI8DEVTYPE_DEVICECTRL are specialized devices not generally + // considered appropriate to control game actions. We just ignore these. + if( GET_DIDEVICE_TYPE(pdidi->dwDevType) != DI8DEVTYPE_DEVICECTRL ) + { + // We're only interested in devices that map the pri 1 actions + if( dwFlags & DIEDBS_MAPPEDPRI1 ) + { + // Add new pdidDevice struct to array, and resize array if needed + m_dwNumDevices++; + if( m_dwNumDevices > m_dwMaxDevices ) + { + m_dwMaxDevices += 5; + + DeviceInfo* pListNew = NULL; + pListNew = (DeviceInfo*) realloc( m_pDeviceList, m_dwMaxDevices*sizeof(DeviceInfo) ); + + // Verify allocation + if( NULL == pListNew ) + { + DXTRACE_ERR( TEXT("EnumDevice"), E_OUTOFMEMORY ); + return DIENUM_STOP; + } + else + m_pDeviceList = pListNew; + + ZeroMemory( m_pDeviceList + m_dwMaxDevices - 5, 5*sizeof(DeviceInfo) ); + } + + DXUtil_ConvertGUIDToStringCch( &pdidi->guidInstance, strDeviceGuid, 40 ); + DXUtil_ReadStringRegKeyCch( m_hKey, strDeviceGuid, strPlayerName, MAX_PATH, TEXT("") ); + + // Add the device to the array m_pDeviceList + DWORD dwCurrentDevice = m_dwNumDevices-1; + ZeroMemory( &m_pDeviceList[dwCurrentDevice], sizeof(DeviceInfo) ); + + m_pDeviceList[dwCurrentDevice].didi = *pdidi; + m_pDeviceList[dwCurrentDevice].pdidDevice = pdidDevice; + m_pDeviceList[dwCurrentDevice].pdidDevice->AddRef(); + m_pDeviceList[dwCurrentDevice].bMapsPri1Actions = ((dwFlags & DIEDBS_MAPPEDPRI1) == DIEDBS_MAPPEDPRI1); + m_pDeviceList[dwCurrentDevice].bMapsPri2Actions = ((dwFlags & DIEDBS_MAPPEDPRI2) == DIEDBS_MAPPEDPRI2); + + if( lstrcmp( strPlayerName, TEXT("") ) != 0 ) + { + m_pDeviceList[dwCurrentDevice].pPlayerInfo = LookupPlayer( strPlayerName ); + if( m_pDeviceList[dwCurrentDevice].pPlayerInfo ) + m_pDeviceList[dwCurrentDevice].pPlayerInfo->bFoundDeviceForPlayer = TRUE; + } + } + } + + // Continue enumerating + return DIENUM_CONTINUE; +} + + + + +//----------------------------------------------------------------------------- +// Name: AssignDevices +// Desc: +//----------------------------------------------------------------------------- +HRESULT CMultiplayerInputDeviceManager::AssignDevices() +{ + DWORD iDevice; + DWORD iPlayer; + + // For any device that doesn't have a user assigned to it, + // then assign it to the first user that needs a device + for( iDevice=0; iDevicebFoundDeviceForPlayer ) + { + m_pDeviceList[iDevice].pPlayerInfo = m_pUsers[iPlayer]; + m_pUsers[iPlayer]->bFoundDeviceForPlayer = TRUE; + break; + } + } + } + } + + return S_OK; +} + + + + +//----------------------------------------------------------------------------- +// Name: VerifyAssignment +// Desc: +//----------------------------------------------------------------------------- +HRESULT CMultiplayerInputDeviceManager::VerifyAssignment() +{ + DWORD iPlayer; + DWORD iDevice; + + // For each player, make sure that a device was found for this + // player, otherwise return failure. + for( iPlayer=0; iPlayerbFoundDeviceForPlayer ) + { + if( GetNumDevices() < m_dwNumUsers ) + return E_DIUTILERR_TOOMANYUSERS; + else + { + // Check to see if there's a device that isn't already + // assigned to a player. If there is return + // E_DIUTILERR_PLAYERWITHOUTDEVICE otherwise return + // E_DIUTILERR_DEVICESTAKEN + for( iDevice=0; iDevicedwNumActions]; + + // Verify memory allocation and collect DIA_APPFIXED settings + if( pdwAppFixed ) + { + for( iAction=0; iAction < m_pdiaf->dwNumActions; iAction++ ) + pdwAppFixed[iAction] = m_pdiaf->rgoAction[iAction].dwFlags & DIA_APPFIXED; + } + } + + // For every device that's assigned to a player, + // set it action map, and add it to the game + for( iDevice=0; iDeviceSetCooperativeLevel( m_hWnd, DISCL_NONEXCLUSIVE|DISCL_FOREGROUND ); + if( FAILED(hr) ) + break; + + // Build and set the action map on this device. This will also remove + // it from DirectInput's internal list of available devices. + DWORD dwBuildFlags = bResetMappings ? DIDBAM_HWDEFAULTS : DIDBAM_DEFAULT; + DWORD dwSetFlags = bResetMappings ? DIDSAM_FORCESAVE : DIDSAM_DEFAULT; + + hr = pdidDevice->BuildActionMap( m_pdiaf, pPlayerInfo->strPlayerName, dwBuildFlags ); + if( FAILED( hr ) ) + { + // just print out a debug message and keep going + DXTRACE_ERR( TEXT("BuildActionMap"), hr ); + hr = S_OK; + continue; + } + + hr = pdidDevice->SetActionMap( m_pdiaf, pPlayerInfo->strPlayerName, dwSetFlags ); + if( FAILED( hr ) ) + { + // just print out a debug message and keep going + DXTRACE_ERR( TEXT("SetActionMap"), hr ); + hr = S_OK; + continue; + } + + + // Callback into the app so it can adjust the device and set + // the m_pDeviceList[iDevice].pParam field with a device state struct + if( m_AddDeviceCallback ) + m_AddDeviceCallback( pPlayerInfo, &m_pDeviceList[iDevice], + &m_pDeviceList[iDevice].didi, m_AddDeviceCallbackParam ); + + // Check to see if the device is using relative axis -- sometimes app code + // might want to know this. + DIPROPDWORD dipdw; + dipdw.diph.dwSize = sizeof(DIPROPDWORD); + dipdw.diph.dwHeaderSize = sizeof(DIPROPHEADER); + dipdw.diph.dwObj = 0; + dipdw.diph.dwHow = DIPH_DEVICE; + dipdw.dwData = 0; + pdidDevice->GetProperty( DIPROP_AXISMODE, &dipdw.diph ); + if( dipdw.dwData == DIPROPAXISMODE_REL ) + m_pDeviceList[iDevice].bRelativeAxis = TRUE; + + // We made it through this iteration without breaking out do to errors + hr = S_OK; + } + else + { + if( FAILED( hr = pdidDevice->BuildActionMap( m_pdiaf, NULL, DIDBAM_DEFAULT ) ) ) + { + DXTRACE_ERR( TEXT("BuildActionMap"), hr ); + break; + } + + if( FAILED( hr = pdidDevice->SetActionMap( m_pdiaf, NULL, DIDSAM_NOUSER ) ) ) + { + DXTRACE_ERR( TEXT("SetActionMap"), hr ); + break; + } + } + } + + // If we stored DIA_APPFIXED flags earlier, we need to reapply those flags and + // free the allocated memory + if( bResetMappings && pdwAppFixed ) + { + for( iAction=0; iAction < m_pdiaf->dwNumActions; iAction++ ) + m_pdiaf->rgoAction[iAction].dwFlags |= pdwAppFixed[iAction]; + + delete [] pdwAppFixed; + } + + return hr; +} + + + + +//----------------------------------------------------------------------------- +// Name: ConfigureDevices +// Desc: +//----------------------------------------------------------------------------- +HRESULT CMultiplayerInputDeviceManager::ConfigureDevices( HWND hWnd, IUnknown* pSurface, + VOID* ConfigureDevicesCB, + DWORD dwFlags, LPVOID pvCBParam ) +{ + HRESULT hr; + DWORD iPlayer; + + // Determine how large of a string we'll need to hold all user names + DWORD dwNamesSize = 0; + for( iPlayer=0; iPlayer < m_dwNumUsers; iPlayer++ ) + dwNamesSize += lstrlen( m_pUsers[iPlayer]->strPlayerName ) +1; + + // Build multi-sz list of user names + TCHAR* strUserNames = new TCHAR[dwNamesSize+1]; + + // Verify allocation and cycle through user names + if( strUserNames ) + { + TCHAR* strTemp = strUserNames; + for( iPlayer=0; iPlayerstrPlayerName ); + strTemp += lstrlen(strTemp) + 1; + } + + lstrcpy( strTemp, TEXT("\0") ); + } + + + // Fill in all the params + DICONFIGUREDEVICESPARAMS dicdp; + ZeroMemory(&dicdp, sizeof(dicdp)); + dicdp.dwSize = sizeof(dicdp); + dicdp.dwcFormats = 1; + dicdp.lprgFormats = m_pdiaf; + dicdp.hwnd = hWnd; + dicdp.lpUnkDDSTarget = pSurface; + dicdp.dwcUsers = m_dwNumUsers; + dicdp.lptszUserNames = strUserNames; + + // Initialize all the colors here + DICOLORSET dics; + ZeroMemory(&dics, sizeof(DICOLORSET)); + dics.dwSize = sizeof(DICOLORSET); + + // Set UI color scheme (if not specified it uses defaults) + dicdp.dics.dwSize = sizeof(dics); + dicdp.dics.cTextFore = D3DCOLOR_RGBA(255,255,255,255); + dicdp.dics.cTextHighlight = D3DCOLOR_RGBA(204,204,255,255); + dicdp.dics.cCalloutLine = D3DCOLOR_RGBA(255,255,255,128); // + dicdp.dics.cCalloutHighlight= D3DCOLOR_RGBA(204,204,255,255); + dicdp.dics.cBorder = D3DCOLOR_RGBA(153,153,204,128); + dicdp.dics.cControlFill = D3DCOLOR_RGBA( 51, 51, 102, 128); // + dicdp.dics.cHighlightFill = D3DCOLOR_RGBA(0,0,0,128); + dicdp.dics.cAreaFill = D3DCOLOR_RGBA(0,0,50,128); + + if( dwFlags & DICD_EDIT ) + { + // Re-enum so we can catch any new devices that have been recently attached + for( iPlayer=0; iPlayerbFoundDeviceForPlayer = FALSE; + if( FAILED( hr = BuildDeviceList() ) ) + { + DXTRACE_ERR( TEXT("BuildDeviceList"), hr ); + goto LCleanup; + } + } + + // Unacquire the devices so that mouse doesn't + // control the game while in control panel + UnacquireDevices(); + + if( FAILED( hr = m_pDI->ConfigureDevices( (LPDICONFIGUREDEVICESCALLBACK)ConfigureDevicesCB, + &dicdp, dwFlags, pvCBParam ) ) ) + { + DXTRACE_ERR( TEXT("ConfigureDevices"), hr ); + goto LCleanup; + } + + if( dwFlags & DICD_EDIT ) + { + // Update the device ownership + if( FAILED( hr = UpdateDeviceOwnership() ) ) + { + DXTRACE_ERR( TEXT("UpdateDeviceOwnership"), hr ); + goto LCleanup; + } + + // Now save the device keys that are assigned players to registry, + if( FAILED( hr = SaveDeviceOwnershipKeys() ) ) + { + DXTRACE_ERR( TEXT("SaveDeviceOwnershipKeys"), hr ); + goto LCleanup; + } + + // Report an error if there is a player that doesn't not + // have a device assigned + if( FAILED( hr = VerifyAssignment() ) ) + goto LCleanup; + + // Now that every player has at least one device, build and set + // the action map, and use callback into the app to tell the + // app of the device assignment. + if( FAILED( hr = AddAssignedDevices( FALSE ) ) ) + { + DXTRACE_ERR( TEXT("AddAssignedDevices"), hr ); + goto LCleanup; + } + } + + hr = S_OK; + +LCleanup: + + if( strUserNames ) + delete [] strUserNames; + + return hr; +} + + + + +//----------------------------------------------------------------------------- +// Name: UpdateDeviceOwnership +// Desc: +//----------------------------------------------------------------------------- +HRESULT CMultiplayerInputDeviceManager::UpdateDeviceOwnership() +{ + DWORD iPlayer; + DWORD iDevice; + + // Set all players to not have a device yet + for( iPlayer=0; iPlayerbFoundDeviceForPlayer = FALSE; + + // Set all devices as not assigned to a player + for( iDevice=0; iDeviceGetProperty( DIPROP_USERNAME, &dips.diph ); + DXUtil_ConvertWideStringToGenericCch( strPlayerName, dips.wsz, MAX_PATH ); + + if( lstrcmp( strPlayerName, TEXT("") ) != 0 ) + { + m_pDeviceList[iDevice].pPlayerInfo = LookupPlayer( strPlayerName ); + if( m_pDeviceList[iDevice].pPlayerInfo ) + m_pDeviceList[iDevice].pPlayerInfo->bFoundDeviceForPlayer = TRUE; + } + } + + return S_OK; +} + + + + +//----------------------------------------------------------------------------- +// Name: UnacquireDevices +// Desc: +//----------------------------------------------------------------------------- +VOID CMultiplayerInputDeviceManager::UnacquireDevices() +{ + // Unacquire every device + + if( m_pDeviceList ) + { + // All devices have been assigned a to a user in + // the new array, so clean up the local array + for( DWORD iDevice=0; iDeviceUnacquire(); + } + } +} + + + + +//----------------------------------------------------------------------------- +// Name: SetFocus +// Desc: Sets the DirectInput focus to a new HWND +//----------------------------------------------------------------------------- +VOID CMultiplayerInputDeviceManager::SetFocus( HWND hWnd ) +{ + m_hWnd = hWnd; + + if( m_pDeviceList ) + { + // All devices have been assigned a to a user in + // the new array, so clean up the local array + for( DWORD iDevice=0; iDeviceUnacquire(); + pdidDevice->SetCooperativeLevel( m_hWnd, DISCL_NONEXCLUSIVE|DISCL_FOREGROUND ); + } + } +} + + + + +//----------------------------------------------------------------------------- +// Name: GetDevices +// Desc: returns an array of DeviceInfo*'s +//----------------------------------------------------------------------------- +HRESULT CMultiplayerInputDeviceManager::GetDevices( DeviceInfo** ppDeviceInfo, + DWORD* pdwCount ) +{ + if( NULL==ppDeviceInfo || NULL==pdwCount ) + return E_INVALIDARG; + + (*ppDeviceInfo) = m_pDeviceList; + (*pdwCount) = m_dwNumDevices; + + return S_OK; +} + + + + +//----------------------------------------------------------------------------- +// Name: LookupPlayer +// Desc: searchs m_pUsers by player name +//----------------------------------------------------------------------------- +CMultiplayerInputDeviceManager::PlayerInfo* CMultiplayerInputDeviceManager::LookupPlayer( TCHAR* strPlayerName ) +{ + for( DWORD iPlayer=0; iPlayerstrPlayerName, strPlayerName ) == 0 ) + return pCurPlayer; + } + + return NULL; +} + + + + +//----------------------------------------------------------------------------- +// Name: SaveDeviceOwnershipKeys +// Desc: For every device that's assigned to a player, save its device key +// and assigned player to registry. +//----------------------------------------------------------------------------- +HRESULT CMultiplayerInputDeviceManager::SaveDeviceOwnershipKeys() +{ + TCHAR strDeviceGuid[40]; + DWORD iDevice; + + for( iDevice=0; iDevicestrPlayerName ); + else + RegDeleteValue( m_hKey, strDeviceGuid ); + } + + return S_OK; +} + + + + +//----------------------------------------------------------------------------- +// Name: DeleteDeviceOwnershipKeys +// Desc: Delete all the ownership keys +//----------------------------------------------------------------------------- +VOID CMultiplayerInputDeviceManager::DeleteDeviceOwnershipKeys() +{ + HKEY hKey; + TCHAR *strRegKey; + + // Prepare strings to delete the key + strRegKey = _tcsdup( m_strKey ); + if( strRegKey == NULL ) + return; + + TCHAR* strTemp = _tcsrchr( strRegKey, TEXT('\\') ); + + // Unless the registry path string was malformed, we're ready to delete + // and recreate the key + if( strTemp ) + { + *strTemp = 0; + strTemp++; + + RegCloseKey( m_hKey ); + + // Delete the reg key + RegOpenKey( HKEY_CURRENT_USER, strRegKey, &hKey ); + RegDeleteKey( hKey, strTemp ); + RegCloseKey( hKey ); + + // Create the key again now that all the subkeys have been deleted + RegCreateKeyEx( HKEY_CURRENT_USER, m_strKey, 0, NULL, + REG_OPTION_NON_VOLATILE, KEY_READ | KEY_WRITE, NULL, + &m_hKey, NULL ); + } + + + // Clean up memory allocation + free( strRegKey ); +} + + + + +//----------------------------------------------------------------------------- +// Name: Cleanup +// Desc: +//----------------------------------------------------------------------------- +VOID CMultiplayerInputDeviceManager::Cleanup() +{ + CleanupDeviceList(); + + if( m_pUsers ) + { + for( DWORD iPlayer=0; iPlayerData1, pGuidSrc->Data2, pGuidSrc->Data3, + pGuidSrc->Data4[0], pGuidSrc->Data4[1], + pGuidSrc->Data4[2], pGuidSrc->Data4[3], + pGuidSrc->Data4[4], pGuidSrc->Data4[5], + pGuidSrc->Data4[6], pGuidSrc->Data4[7] ); + + if( nResult < 0 ) + return E_FAIL; + return S_OK; +} + + +//----------------------------------------------------------------------------- +// Name: DXUtil_ConvertWideStringToAnsi() +// Desc: This is a UNICODE conversion utility to convert a WCHAR string into a +// CHAR string. +// cchDestChar is the size in TCHARs of strDestination +//----------------------------------------------------------------------------- +HRESULT DXUtil_ConvertWideStringToAnsiCch( CHAR* strDestination, const WCHAR* wstrSource, + int cchDestChar ) +{ + if( strDestination==NULL || wstrSource==NULL || cchDestChar < 1 ) + return E_INVALIDARG; + + int nResult = WideCharToMultiByte( CP_ACP, 0, wstrSource, -1, strDestination, + cchDestChar*sizeof(CHAR), NULL, NULL ); + strDestination[cchDestChar-1] = 0; + + if( nResult == 0 ) + return E_FAIL; + return S_OK; +} + + +//----------------------------------------------------------------------------- +// Name: DXUtil_ConvertAnsiStringToGeneric() +// Desc: This is a UNICODE conversion utility to convert a WCHAR string into a +// TCHAR string. +// cchDestChar is the size in TCHARs of tstrDestination. Be careful not to +// pass in sizeof(strDest) on UNICODE builds +//----------------------------------------------------------------------------- +HRESULT DXUtil_ConvertWideStringToGenericCch( TCHAR* tstrDestination, const WCHAR* wstrSource, + int cchDestChar ) +{ + if( tstrDestination==NULL || wstrSource==NULL || cchDestChar < 1 ) + return E_INVALIDARG; + +#ifdef _UNICODE + wcsncpy( tstrDestination, wstrSource, cchDestChar ); + tstrDestination[cchDestChar-1] = L'\0'; + return S_OK; +#else + return DXUtil_ConvertWideStringToAnsiCch( tstrDestination, wstrSource, cchDestChar ); +#endif +} + + + +//----------------------------------------------------------------------------- +// Name: DXUtil_ReadStringRegKeyCch() +// Desc: Helper function to read a registry key string +// cchDest is the size in TCHARs of strDest. Be careful not to +// pass in sizeof(strDest) on UNICODE builds. +//----------------------------------------------------------------------------- +HRESULT DXUtil_ReadStringRegKeyCch( HKEY hKey, LPCTSTR strRegName, TCHAR* strDest, + DWORD cchDest, LPCTSTR strDefault ) +{ + DWORD dwType; + DWORD cbDest = cchDest * sizeof(TCHAR); + + if( ERROR_SUCCESS != RegQueryValueEx( hKey, strRegName, 0, &dwType, + (BYTE*)strDest, &cbDest ) ) + { + _tcsncpy( strDest, strDefault, cchDest ); + strDest[cchDest-1] = 0; + return S_FALSE; + } + else + { + if( dwType != REG_SZ ) + { + _tcsncpy( strDest, strDefault, cchDest ); + strDest[cchDest-1] = 0; + return S_FALSE; + } + } + + return S_OK; +} + + + + +//----------------------------------------------------------------------------- +// Name: DXUtil_WriteStringRegKey() +// Desc: Helper function to write a registry key string +//----------------------------------------------------------------------------- +HRESULT DXUtil_WriteStringRegKey( HKEY hKey, LPCTSTR strRegName, + LPCTSTR strValue ) +{ + if( NULL == strValue ) + return E_INVALIDARG; + + DWORD cbValue = ((DWORD)_tcslen(strValue)+1) * sizeof(TCHAR); + + if( ERROR_SUCCESS != RegSetValueEx( hKey, strRegName, 0, REG_SZ, + (BYTE*)strValue, cbValue ) ) + return E_FAIL; + + return S_OK; +} + + + diff --git a/Source/Plugins/Plugin_PadDX9/Src/multidi.h b/Source/Plugins/Plugin_PadDX9/Src/multidi.h new file mode 100644 index 0000000000..b18e5e17ba --- /dev/null +++ b/Source/Plugins/Plugin_PadDX9/Src/multidi.h @@ -0,0 +1,146 @@ +//----------------------------------------------------------------------------- +// File: MultiDI.h +// +// Desc: Multiple user DirectInput support using action mapping +// +// Copyright (C) Microsoft Corporation. All Rights Reserved. +//----------------------------------------------------------------------------- +#ifndef MULTIDI_H +#define MULTIDI_H + +#ifndef DIRECTINPUT_VERSION +#define DIRECTINPUT_VERSION 0x0800 +#endif + +#include + +//----------------------------------------------------------------------------- +// Miscellaneous helper functions +//----------------------------------------------------------------------------- +#define SAFE_DELETE(p) { if(p) { delete (p); (p)=NULL; } } +#define SAFE_DELETE_ARRAY(p) { if(p) { delete[] (p); (p)=NULL; } } +#define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } } + +HRESULT DXUtil_WriteStringRegKey( HKEY hKey, LPCTSTR strRegName, LPCTSTR strValue ); +HRESULT DXUtil_ReadStringRegKeyCch( HKEY hKey, LPCTSTR strRegName, TCHAR* strDest, DWORD cchDest, LPCTSTR strDefault ); +HRESULT DXUtil_ConvertGUIDToStringCch( const GUID* pGuidSrc, TCHAR* strDest, int cchDestChar ); +HRESULT DXUtil_ConvertWideStringToGenericCch( TCHAR* tstrDestination, const WCHAR* wstrSource, int cchDestChar ); + +//----------------------------------------------------------------------------- +// Name: DXUtil_Timer() +// Desc: Performs timer opertations. Use the following commands: +// TIMER_RESET - to reset the timer +// TIMER_START - to start the timer +// TIMER_STOP - to stop (or pause) the timer +// TIMER_ADVANCE - to advance the timer by 0.1 seconds +// TIMER_GETABSOLUTETIME - to get the absolute system time +// TIMER_GETAPPTIME - to get the current time +// TIMER_GETELAPSEDTIME - to get the time that elapsed between +// TIMER_GETELAPSEDTIME calls +//----------------------------------------------------------------------------- +enum TIMER_COMMAND { TIMER_RESET, TIMER_START, TIMER_STOP, TIMER_ADVANCE, + TIMER_GETABSOLUTETIME, TIMER_GETAPPTIME, TIMER_GETELAPSEDTIME }; +FLOAT __stdcall DXUtil_Timer( TIMER_COMMAND command ); + +// E_DIUTILERR_PLAYERWITHOUTDEVICE is returned by the manager class after configuring +// device, and there's a player that hasn't been assigned a device. +#define E_DIUTILERR_PLAYERWITHOUTDEVICE MAKE_HRESULT(SEVERITY_ERROR,FACILITY_ITF,997) + +// E_DIUTILERR_DEVICESTAKEN is returned by the manager class when one player +// on the machine has enough RECENT devices to prevent other players from +// playing. This return code is needed because this sample attempts to give +// all RECENT devices to that player. +#define E_DIUTILERR_DEVICESTAKEN MAKE_HRESULT(SEVERITY_ERROR,FACILITY_ITF,998) + +// E_DIUTILERR_TOOMANYUSERS is returned by the manager class when the number of +// players exceeds the number of devices present on the system. For example, +// if you ask for 4 players on a machine that only has a keyboard and mouse, +// you're 2 short of what you need. +#define E_DIUTILERR_TOOMANYUSERS MAKE_HRESULT(SEVERITY_ERROR,FACILITY_ITF,999) + + + +//----------------------------------------------------------------------------- +// Name: class CMultiplayerInputDeviceManager +// Desc: Input device manager using DX8 action mapping +//----------------------------------------------------------------------------- +class CMultiplayerInputDeviceManager +{ +public: + struct PlayerInfo + { + DWORD dwPlayerIndex; // 0-based player number + TCHAR strPlayerName[MAX_PATH]; // player name + DWORD dwMaxDevices; // max number of elements in pDevices array + DWORD dwNumDevices; // current number of elements in pDevices array + BOOL bFoundDeviceForPlayer; // if a device has been found for this player yet + }; + + struct DeviceInfo + { + LPDIRECTINPUTDEVICE8 pdidDevice; // dinput device pointer + PlayerInfo* pPlayerInfo; // Player who owns this device + BOOL bRelativeAxis; // TRUE if device is using relative axis + BOOL bMapsPri1Actions; // TRUE if device maps pri 1 actions + BOOL bMapsPri2Actions; // TRUE if device maps pri 2 actions + LPVOID pParam; // app defined pointer assoicated with this device + DIDEVICEINSTANCE didi; // device instance info + }; + + typedef HRESULT (CALLBACK *LPDIMANAGERCALLBACK)(CMultiplayerInputDeviceManager::PlayerInfo* pPlayerInfo, CMultiplayerInputDeviceManager::DeviceInfo* pDeviceInfo, const DIDEVICEINSTANCE* pdidi, LPVOID); + +private: + BOOL m_bCleanupCOM; + HWND m_hWnd; + + LPDIRECTINPUT8 m_pDI; + DIACTIONFORMAT* m_pdiaf; + + PlayerInfo** m_pUsers; + DWORD m_dwNumUsers; + + DeviceInfo* m_pDeviceList; + DWORD m_dwNumDevices; + DWORD m_dwMaxDevices; + + LPDIMANAGERCALLBACK m_AddDeviceCallback; + LPVOID m_AddDeviceCallbackParam; + + TCHAR* m_strKey; + HKEY m_hKey; + +public: + static BOOL CALLBACK StaticEnumSuitableDevicesCB( LPCDIDEVICEINSTANCE pdidi, LPDIRECTINPUTDEVICE8 pdidDevice, DWORD dwFlags, DWORD dwRemainingDevices, VOID* pContext ); + static BOOL CALLBACK StaticBuildDeviceListCB( LPCDIDEVICEINSTANCE pdidi, VOID* pContext ); + + // Device control + BOOL EnumDevice( const DIDEVICEINSTANCE* pdidi, LPDIRECTINPUTDEVICE8 pdidDevice, DWORD dwFlags, DWORD dwDeviceRemaining ); + BOOL BuildDeviceListCB( LPCDIDEVICEINSTANCE pdidi ); + + HRESULT AddDevice( DeviceInfo* pDeviceInfo, BOOL bForceReset ); + HRESULT GetDevices( DeviceInfo** ppDeviceInfo, DWORD* pdwNumDevices ); + HRESULT ConfigureDevices( HWND hWnd, IUnknown* pSurface, VOID* pCallback, DWORD dwFlags, LPVOID pvCBParam ); + DWORD GetNumDevices() { return m_dwNumDevices; } + VOID UnacquireDevices(); + VOID SetFocus( HWND hWnd ); + PlayerInfo* LookupPlayer( TCHAR* strPlayerName ); + HRESULT SaveDeviceOwnershipKeys(); + VOID DeleteDeviceOwnershipKeys(); + HRESULT UpdateDeviceOwnership(); + HRESULT AssignDevices(); + HRESULT VerifyAssignment(); + HRESULT AddAssignedDevices( BOOL bResetMappings ); + + HRESULT BuildDeviceList(); + VOID CleanupDeviceList(); + + // Construction + HRESULT SetActionFormat( DIACTIONFORMAT* pdiaf, BOOL bReenumerate, BOOL bResetOwnership, BOOL bResetMappings ); + HRESULT Create( HWND hWnd, TCHAR* strUserNames[], DWORD dwNumUsers, DIACTIONFORMAT* pdiaf, LPDIMANAGERCALLBACK AddDeviceCallback, LPVOID pCallbackParam, BOOL bResetOwnership, BOOL bResetMappings ); + + CMultiplayerInputDeviceManager( TCHAR* strRegKey ); + ~CMultiplayerInputDeviceManager(); + VOID Cleanup(); +}; + +#endif \ No newline at end of file diff --git a/Source/Plugins/Plugin_PadDX9/Src/resource.h b/Source/Plugins/Plugin_PadDX9/Src/resource.h new file mode 100644 index 0000000000..0558947755 --- /dev/null +++ b/Source/Plugins/Plugin_PadDX9/Src/resource.h @@ -0,0 +1,37 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by PadPlugin2.rc +// +#define IDD_PADCONFIG 101 +#define IDD_ABOUTPAD 104 +#define IDC_SETSTART 1003 +#define IDC_SETA 1004 +#define IDC_SETB 1005 +#define IDC_SETX 1006 +#define IDC_SETY 1007 +#define IDC_SETZ 1008 +#define IDC_SETSUBUP 1009 +#define IDC_SETSUBLEFT 1010 +#define IDC_SETSUBRIGHT 1011 +#define IDC_SETSUBDOWN 1012 +#define IDC_SETDPADUP 1013 +#define IDC_SETDPADLEFT 1014 +#define IDC_SETDPADRIGHT 1015 +#define IDC_SETDPADDOWN 1016 +#define IDC_SETMAINUP 1017 +#define IDC_SETMAINLEFT 1018 +#define IDC_SETMAINDOWN 1019 +#define IDC_SETMAINRIGHT 1020 +#define IDC_SETL 1021 +#define IDC_SETR 1022 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 105 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1004 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/Source/Plugins/Plugin_PadDX9/Src/resource.rc b/Source/Plugins/Plugin_PadDX9/Src/resource.rc new file mode 100644 index 0000000000..db0cb89769 --- /dev/null +++ b/Source/Plugins/Plugin_PadDX9/Src/resource.rc @@ -0,0 +1,135 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "afxres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""afxres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_PADCONFIG DIALOGEX 0, 0, 332, 226 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | + WS_SYSMENU +CAPTION "Pad configuration" +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + DEFPUSHBUTTON "Close",IDOK,275,205,50,14 + PUSHBUTTON "start",IDC_SETSTART,141,102,40,14 + PUSHBUTTON "a",IDC_SETA,243,82,40,14 + PUSHBUTTON "b",IDC_SETB,215,98,40,14 + PUSHBUTTON "x",IDC_SETX,200,71,40,14 + PUSHBUTTON "y",IDC_SETY,285,90,40,14 + PUSHBUTTON "z",IDC_SETZ,241,35,40,14 + PUSHBUTTON " ",IDC_SETSUBUP,235,128,40,14 + PUSHBUTTON " ",IDC_SETSUBLEFT,193,147,40,14 + PUSHBUTTON " ",IDC_SETSUBRIGHT,275,146,40,14 + PUSHBUTTON " ",IDC_SETSUBDOWN,236,167,40,14 + PUSHBUTTON " ",IDC_SETDPADUP,66,129,40,14 + PUSHBUTTON " ",IDC_SETDPADLEFT,23,145,40,14 + PUSHBUTTON " ",IDC_SETDPADRIGHT,112,145,40,14 + PUSHBUTTON " ",IDC_SETDPADDOWN,67,166,40,14 + PUSHBUTTON " ",IDC_SETMAINUP,41,47,40,14 + PUSHBUTTON " ",IDC_SETMAINLEFT,7,66,40,14 + PUSHBUTTON " ",IDC_SETMAINDOWN,41,86,40,14 + PUSHBUTTON " ",IDC_SETMAINRIGHT,79,66,40,14 + PUSHBUTTON "l",IDC_SETL,91,16,40,14 + PUSHBUTTON "r",IDC_SETR,216,16,40,14 +END + +IDD_ABOUTPAD DIALOGEX 0, 0, 184, 76 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | + WS_SYSMENU +CAPTION "About Dolphin Simple Pad Plugin" +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + DEFPUSHBUTTON "OK",IDOK,127,55,50,14 + LTEXT "Coded by F|RES and ector",IDC_STATIC,73,7,104,14 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO +BEGIN + IDD_PADCONFIG, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 325 + TOPMARGIN, 7 + BOTTOMMARGIN, 219 + END + + IDD_ABOUTPAD, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 177 + TOPMARGIN, 7 + BOTTOMMARGIN, 69 + END +END +#endif // APSTUDIO_INVOKED + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/Source/Plugins/Plugin_PadDX9/Src/stdafx.cpp b/Source/Plugins/Plugin_PadDX9/Src/stdafx.cpp new file mode 100644 index 0000000000..60e6f16fec --- /dev/null +++ b/Source/Plugins/Plugin_PadDX9/Src/stdafx.cpp @@ -0,0 +1,21 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ +///////////////////////////////////////////////////////////////////////////////////////////////////// +// M O D U L E B E G I N /////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////// + +#include "stdafx.h" diff --git a/Source/Plugins/Plugin_PadDX9/Src/stdafx.h b/Source/Plugins/Plugin_PadDX9/Src/stdafx.h new file mode 100644 index 0000000000..a6df59e1c1 --- /dev/null +++ b/Source/Plugins/Plugin_PadDX9/Src/stdafx.h @@ -0,0 +1,41 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ +///////////////////////////////////////////////////////////////////////////////////////////////////// +// M O D U L E B E G I N /////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////// + +#pragma once + +// Insert your headers here +#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers +#define _CRT_SECURE_NO_DEPRECATE 1 + +#include +#include +#include +#include +#include + +// DInput +#define DIRECTINPUT_VERSION 0x0800 +#include + +// WTL +#include +#include +#include +#include \ No newline at end of file diff --git a/Source/Plugins/Plugin_PadSimple/Plugin_PadSimple.vcproj b/Source/Plugins/Plugin_PadSimple/Plugin_PadSimple.vcproj new file mode 100644 index 0000000000..9db94292f4 --- /dev/null +++ b/Source/Plugins/Plugin_PadSimple/Plugin_PadSimple.vcproj @@ -0,0 +1,863 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Source/Plugins/Plugin_PadSimple/Src/AboutDlg.cpp b/Source/Plugins/Plugin_PadSimple/Src/AboutDlg.cpp new file mode 100644 index 0000000000..7d0d95118a --- /dev/null +++ b/Source/Plugins/Plugin_PadSimple/Src/AboutDlg.cpp @@ -0,0 +1,36 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "stdafx.h" +#include "resource.h" + +#include "AboutDlg.h" + +LRESULT CAboutDlg::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) +{ + CenterWindow(GetParent()); + return(TRUE); +} + + +LRESULT CAboutDlg::OnCloseCmd(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/) +{ + EndDialog(wID); + return(0); +} + + diff --git a/Source/Plugins/Plugin_PadSimple/Src/AboutDlg.h b/Source/Plugins/Plugin_PadSimple/Src/AboutDlg.h new file mode 100644 index 0000000000..c9e54183a5 --- /dev/null +++ b/Source/Plugins/Plugin_PadSimple/Src/AboutDlg.h @@ -0,0 +1,41 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#pragma once + +class CAboutDlg + : public CDialogImpl +{ + public: + + enum { IDD = IDD_ABOUTPAD }; + + BEGIN_MSG_MAP(CAboutDlg) + MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) + COMMAND_ID_HANDLER(IDOK, OnCloseCmd) + COMMAND_ID_HANDLER(IDCANCEL, OnCloseCmd) + END_MSG_MAP() + +// Handler prototypes (uncomment arguments if needed): +// LRESULT MessageHandler(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) +// LRESULT CommandHandler(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) +// LRESULT NotifyHandler(int /*idCtrl*/, LPNMHDR /*pnmh*/, BOOL& /*bHandled*/) + + LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL & /*bHandled*/); + + LRESULT OnCloseCmd(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL & /*bHandled*/); +}; diff --git a/Source/Plugins/Plugin_PadSimple/Src/ConfigDlg.cpp b/Source/Plugins/Plugin_PadSimple/Src/ConfigDlg.cpp new file mode 100644 index 0000000000..098135f39d --- /dev/null +++ b/Source/Plugins/Plugin_PadSimple/Src/ConfigDlg.cpp @@ -0,0 +1,187 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include +#include "resource.h" + +#include "DirectInputBase.h" +#include "ConfigDlg.h" +#define NUMCONTROLS 23 +int m_buttonResources[NUMCONTROLS] = +{ + IDC_SETMAINLEFT, + IDC_SETMAINUP, + IDC_SETMAINRIGHT, + IDC_SETMAINDOWN, + IDC_SETSUBLEFT, + IDC_SETSUBUP, + IDC_SETSUBRIGHT, + IDC_SETSUBDOWN, + IDC_SETDPADLEFT, + IDC_SETDPADUP, + IDC_SETDPADRIGHT, + IDC_SETDPADDOWN, + IDC_SETA, + IDC_SETB, + IDC_SETX, + IDC_SETY, + IDC_SETZ, + IDC_SETL, + IDC_SETR, + IDC_SETSTART, + // CTL_HALFMAIN, + // CTL_HALFSUB, + // CTL_HALFTRIGGER, + // NUMCONTROLS +}; + +extern int keyForControl[NUMCONTROLS]; +extern bool g_rumbleEnable; + +LRESULT CConfigDlg::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) +{ + m_dinput.Init(m_hWnd); + + CenterWindow(GetParent()); + + for (int i = 0; i < NUMCONTROLS - 3; i++) + { + CButton button = GetDlgItem(m_buttonResources[i]); + SetButtonText(button, keyForControl[i]); + } + + m_hWaitForKeyButton = NULL; + CheckDlgButton(IDC_RUMBLE1, g_rumbleEnable); + SetTimer(1, 50, 0); + return(TRUE); +} + + +LRESULT CConfigDlg::OnCommand(UINT /*uMsg*/, WPARAM _wParam, LPARAM _lParam, BOOL& _bHandled) +{ + // we have not handled it + _bHandled = FALSE; + + // check if it is a key + for (int i = 0; i < NUMCONTROLS; i++) + { + if (m_buttonResources[i] == LOWORD(_wParam)) + { + m_iKeyWaitingFor = i; + m_hWaitForKeyButton = GetDlgItem(m_buttonResources[i]); + + CButton tmpButton = m_hWaitForKeyButton; + tmpButton.SetWindowText("Press Key"); + + _bHandled = TRUE; // yeah we have handled it + break; + } + } + + g_rumbleEnable = Button_GetCheck(GetDlgItem(IDC_RUMBLE1)) ? true : false; + return(TRUE); +} + + +LRESULT CConfigDlg::OnTimer(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) +{ + if (m_hWaitForKeyButton != NULL) + { + m_dinput.Read(); + + for (int i = 0; i < 255; i++) + { + if (m_dinput.diks[i]) + { + keyForControl[m_iKeyWaitingFor] = i; + CButton tmpButton = m_hWaitForKeyButton; + SetButtonText(tmpButton, keyForControl[m_iKeyWaitingFor]); + + m_hWaitForKeyButton = NULL; + break; + } + } + } + + return(TRUE); +} + + +LRESULT CConfigDlg::OnCloseCmd(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/) +{ + m_dinput.Free(); + + EndDialog(wID); + return(0); +} + + +void CConfigDlg::SetButtonText(CButton& _rButton, int _key) +{ + char szTemp[64]; + + switch (_key) + { + case DIK_LEFT: + strcpy(szTemp, "Left"); + break; + + case DIK_UP: + strcpy(szTemp, "Up"); + break; + + case DIK_RIGHT: + strcpy(szTemp, "Right"); + break; + + case DIK_DOWN: + strcpy(szTemp, "Down"); + break; + + case DIK_HOME: + strcpy(szTemp, "Home"); + break; + + case DIK_END: + strcpy(szTemp, "End"); + break; + + case DIK_INSERT: + strcpy(szTemp, "Ins"); + break; + + case DIK_DELETE: + strcpy(szTemp, "Del"); + break; + + case DIK_PGUP: + strcpy(szTemp, "PgUp"); + break; + + case DIK_PGDN: + strcpy(szTemp, "PgDn"); + break; + + default: + GetKeyNameText(_key << 16, szTemp, 64); + break; + } + + _rButton.SetWindowText(szTemp); +} + + diff --git a/Source/Plugins/Plugin_PadSimple/Src/ConfigDlg.h b/Source/Plugins/Plugin_PadSimple/Src/ConfigDlg.h new file mode 100644 index 0000000000..f46e68fecb --- /dev/null +++ b/Source/Plugins/Plugin_PadSimple/Src/ConfigDlg.h @@ -0,0 +1,50 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#pragma once + +class CConfigDlg + : public CDialogImpl +{ + public: + + enum { IDD = IDD_PADCONFIG }; + + BEGIN_MSG_MAP(CConfigDlg) + MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) + MESSAGE_HANDLER(WM_COMMAND, OnCommand) + MESSAGE_HANDLER(WM_TIMER, OnTimer) + COMMAND_ID_HANDLER(IDOK, OnCloseCmd) + END_MSG_MAP() + + private: + + HWND m_hWaitForKeyButton; + int m_iKeyWaitingFor; + DInput m_dinput; + + // Handler prototypes (uncomment arguments if needed): + // LRESULT MessageHandler(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) + // LRESULT CommandHandler(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) + // LRESULT NotifyHandler(int /*idCtrl*/, LPNMHDR /*pnmh*/, BOOL& /*bHandled*/) + + LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL & /*bHandled*/); + LRESULT OnCommand(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL & /*bHandled*/); + LRESULT OnTimer(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL & /*bHandled*/); + LRESULT OnCloseCmd(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL & /*bHandled*/); + void SetButtonText(CButton& _rButton, int _key); +}; diff --git a/Source/Plugins/Plugin_PadSimple/Src/DirectInputBase.cpp b/Source/Plugins/Plugin_PadSimple/Src/DirectInputBase.cpp new file mode 100644 index 0000000000..57b4c5fb3c --- /dev/null +++ b/Source/Plugins/Plugin_PadSimple/Src/DirectInputBase.cpp @@ -0,0 +1,119 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "stdafx.h" +#include "DirectInputBase.h" + +DInput::DInput() + : g_pDI(NULL), + g_pKeyboard(NULL) +{} + + +DInput::~DInput() +{ + Free(); +} + + +HRESULT DInput::Init(HWND hWnd) +{ + HRESULT hr; + DWORD dwCoopFlags; + dwCoopFlags = DISCL_FOREGROUND | DISCL_NOWINKEY; + + // Create a DInput object + if (FAILED(hr = DirectInput8Create(GetModuleHandle(NULL), DIRECTINPUT_VERSION, + IID_IDirectInput8, (VOID* *)&g_pDI, NULL))) + { + MessageBox(0, "Direct Input Create Failed", 0, MB_ICONERROR); + return(hr); + } + + if (FAILED(hr = g_pDI->CreateDevice(GUID_SysKeyboard, &g_pKeyboard, NULL))) + { + MessageBox(0, "Couldn't access keyboard", 0, MB_ICONERROR); + Free(); + return(hr); + } + + g_pKeyboard->SetDataFormat(&c_dfDIKeyboard); + g_pKeyboard->SetCooperativeLevel(hWnd, dwCoopFlags); + g_pKeyboard->Acquire(); + + return(S_OK); +} + + +void DInput::Free() +{ + if (g_pKeyboard) + { + g_pKeyboard->Unacquire(); + g_pKeyboard->Release(); + g_pKeyboard = 0; + } + + if (g_pDI) + { + g_pDI->Release(); + g_pDI = 0; + } +} + + +// Desc: Read the input device's state when in immediate mode and display it. +HRESULT DInput::Read() +{ + HRESULT hr; + + if (NULL == g_pKeyboard) + { + return(S_OK); + } + + // Get the input's device state, and put the state in dims + ZeroMemory(diks, sizeof(diks)); + hr = g_pKeyboard->GetDeviceState(sizeof(diks), diks); + + //for (int i=0; i<256; i++) + // if (diks[i])MessageBox(0,"DSFJDKSF|",0,0); + if (FAILED(hr)) + { + // DirectInput may be telling us that the input stream has been + // interrupted. We aren't tracking any state between polls, so + // we don't have any special reset that needs to be done. + // We just re-acquire and try again. + + // If input is lost then acquire and keep trying + hr = g_pKeyboard->Acquire(); + + while (hr == DIERR_INPUTLOST) + { + hr = g_pKeyboard->Acquire(); + } + + // hr may be DIERR_OTHERAPPHASPRIO or other errors. This + // may occur when the app is minimized or in the process of + // switching, so just try again later + return(S_OK); + } + + return(S_OK); +} + + diff --git a/Source/Plugins/Plugin_PadSimple/Src/DirectInputBase.h b/Source/Plugins/Plugin_PadSimple/Src/DirectInputBase.h new file mode 100644 index 0000000000..cff1d6a1ef --- /dev/null +++ b/Source/Plugins/Plugin_PadSimple/Src/DirectInputBase.h @@ -0,0 +1,42 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef _DIRECTINPUTBASE_H +#define _DIRECTINPUTBASE_H + +class DInput +{ + public: + + DInput(); + ~DInput(); + + HRESULT Init(HWND hWnd); + void Free(); + HRESULT Read(); + + + BYTE diks[256]; // DirectInput keyboard state buffer + + private: + + LPDIRECTINPUT8 g_pDI; // The DirectInput object + LPDIRECTINPUTDEVICE8 g_pKeyboard; // The keyboard device +}; + +#endif + diff --git a/Source/Plugins/Plugin_PadSimple/Src/SConscript b/Source/Plugins/Plugin_PadSimple/Src/SConscript new file mode 100644 index 0000000000..737166986a --- /dev/null +++ b/Source/Plugins/Plugin_PadSimple/Src/SConscript @@ -0,0 +1,5 @@ +Import('env') +output = "../../../../Binary/linux/Plugins/padsimple.so" +files = ["main.cpp", + ] +env.SharedLibrary(output, files, LIBS=["common"]) diff --git a/Source/Plugins/Plugin_PadSimple/Src/main.cpp b/Source/Plugins/Plugin_PadSimple/Src/main.cpp new file mode 100644 index 0000000000..e18e62b65c --- /dev/null +++ b/Source/Plugins/Plugin_PadSimple/Src/main.cpp @@ -0,0 +1,640 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifdef _WIN32 +#define XINPUT_ENABLE +#endif + +#include +#include + +#include "Common.h" + +#ifdef XINPUT_ENABLE +#include "XInput.h" +#endif + +#include "pluginspecs_pad.h" + +#include "IniFile.h" + +#ifdef _WIN32 + +#include "DirectInputBase.h" +#include "resource.h" +#include "AboutDlg.h" +#include "ConfigDlg.h" + +DInput dinput; + +#else + +#include +#include +#include + +Display* GXdsp; +#endif + +// controls +enum +{ + CTL_MAINLEFT = 0, + CTL_MAINUP, + CTL_MAINRIGHT, + CTL_MAINDOWN, + CTL_SUBLEFT, + CTL_SUBUP, + CTL_SUBRIGHT, + CTL_SUBDOWN, + CTL_DPADLEFT, + CTL_DPADUP, + CTL_DPADRIGHT, + CTL_DPADDOWN, + CTL_A, + CTL_B, + CTL_X, + CTL_Y, + CTL_Z, + CTL_L, + CTL_R, + CTL_START, + CTL_HALFMAIN, + CTL_HALFSUB, + CTL_HALFTRIGGER, + NUMCONTROLS +}; + +// control names +static const char* controlNames[] = +{ + "Main_stick_left", + "Main_stick_up", + "Main_stick_right", + "Main_stick_down", + "Sub_stick_left", + "Sub_stick_up", + "Sub_stick_right", + "Sub_stick_down", + "D-Pad_left", + "D-Pad_up", + "D-Pad_right", + "D-Pad_down", + "A_button", + "B_button", + "X_button", + "Y_button", + "Z_trigger", + "L_button", + "R_button", + "Start", + "Soft_main_switch", + "Soft_sub_switch", + "Soft_triggers_switch", +}; + +int keyForControl[NUMCONTROLS]; + +HINSTANCE g_hInstance = NULL; +SPADInitialize g_PADInitialize; +bool g_rumbleEnable = true; + +void LoadConfig(); +void SaveConfig(); + + +#define RECORD_SIZE (1024 * 128) +SPADStatus recordBuffer[RECORD_SIZE]; +int count = 0; + + +// #define RECORD_STORE +// #define RECORD_REPLAY + + +void RecordInput(const SPADStatus& _rPADStatus) +{ + if (count >= RECORD_SIZE) + { + return; + } + + recordBuffer[count++] = _rPADStatus; +} + + +const SPADStatus& PlayRecord() +{ + if (count >= RECORD_SIZE){return(recordBuffer[0]);} + + return(recordBuffer[count++]); +} + + +void LoadRecord() +{ + FILE* pStream = fopen("c:\\pad-record.bin", "rb"); + + if (pStream != NULL) + { + fread(recordBuffer, 1, RECORD_SIZE * sizeof(SPADStatus), pStream); + fclose(pStream); + } +} + + +void SaveRecord() +{ + FILE* pStream = fopen("c:\\pad-record.bin", "wb"); + + if (pStream != NULL) + { + fwrite(recordBuffer, 1, RECORD_SIZE * sizeof(SPADStatus), pStream); + fclose(pStream); + } +} + + +#ifdef _WIN32 +BOOL APIENTRY DllMain(HINSTANCE hinstDLL, // DLL module handle + DWORD dwReason, // reason called + LPVOID lpvReserved) // reserved +{ + switch (dwReason) + { + case DLL_PROCESS_ATTACH: + break; + + case DLL_PROCESS_DETACH: + break; + + default: + break; + } + + g_hInstance = hinstDLL; + return(TRUE); +} +#endif + + +void GetDllInfo(PLUGIN_INFO* _PluginInfo) +{ + _PluginInfo->Version = 0x0100; + _PluginInfo->Type = PLUGIN_TYPE_PAD; + +#ifndef _DEBUG + strcpy(_PluginInfo->Name, "Dolphin KB/X360pad"); +#else + strcpy(_PluginInfo->Name, "Dolphin KB/X360pad (Debug)"); +#endif +} + + +void DllAbout(HWND _hParent) +{ +#ifdef _WIN32 + CAboutDlg aboutDlg; + aboutDlg.DoModal(_hParent); +#endif +} + + +void DllConfig(HWND _hParent) +{ +#ifdef _WIN32 + LoadConfig(); + + CConfigDlg configDlg; + configDlg.DoModal(_hParent); + + SaveConfig(); +#endif +} + + +void PAD_Initialize(SPADInitialize _PADInitialize) +{ +#ifdef RECORD_REPLAY + LoadRecord(); +#endif + + g_PADInitialize = _PADInitialize; +#ifdef _WIN32 + dinput.Init((HWND)g_PADInitialize.hWnd); +#else + GXdsp = (Display*)g_PADInitialize.hWnd; +#endif + + LoadConfig(); +} + + +void PAD_Shutdown() +{ +#ifdef RECORD_STORE + SaveRecord(); +#endif +#ifdef _WIN32 + dinput.Free(); +#endif + SaveConfig(); +} + + +const float kDeadZone = 0.1f; + +// Implement circular deadzone +void ScaleStickValues(unsigned char* outx, + unsigned char* outy, + short inx, short iny) +{ + float x = ((float)inx + 0.5f) / 32767.5f; + float y = ((float)iny + 0.5f) / 32767.5f; + + if ((x == 0.0f) && (y == 0.0f)) // to be safe + { + *outx = 0; + *outy = 0; + return; + } + + float magnitude = sqrtf(x * x + y * y); + float nx = x / magnitude; + float ny = y / magnitude; + + if (magnitude < kDeadZone){magnitude = kDeadZone;} + + magnitude = (magnitude - kDeadZone) / (1.0f - kDeadZone); + magnitude *= magnitude; // another power may be more appropriate + nx *= magnitude; + ny *= magnitude; + int ix = (int)(nx * 100); + int iy = (int)(ny * 100); + *outx = 0x80 + ix; + *outy = 0x80 + iy; +} + + +#ifdef _WIN32 +void DInput_Read(int _numPad, SPADStatus* _pPADStatus) +{ + if (_numPad != 0) + { + return; + } + + dinput.Read(); + + int mainvalue = (dinput.diks[keyForControl[CTL_HALFMAIN]] & 0xFF) ? 40 : 100; + int subvalue = (dinput.diks[keyForControl[CTL_HALFSUB]] & 0xFF) ? 40 : 100; + int triggervalue = (dinput.diks[keyForControl[CTL_HALFTRIGGER]] & 0xFF) ? 100 : 255; + + // get the new keys + if (dinput.diks[keyForControl[CTL_MAINLEFT]] & 0xFF){_pPADStatus->stickX -= mainvalue;} + + if (dinput.diks[keyForControl[CTL_MAINRIGHT]] & 0xFF){_pPADStatus->stickX += mainvalue;} + + if (dinput.diks[keyForControl[CTL_MAINDOWN]] & 0xFF){_pPADStatus->stickY -= mainvalue;} + + if (dinput.diks[keyForControl[CTL_MAINUP]] & 0xFF){_pPADStatus->stickY += mainvalue;} + + if (dinput.diks[keyForControl[CTL_SUBLEFT]] & 0xFF){_pPADStatus->substickX -= subvalue;} + + if (dinput.diks[keyForControl[CTL_SUBRIGHT]] & 0xFF){_pPADStatus->substickX += subvalue;} + + if (dinput.diks[keyForControl[CTL_SUBDOWN]] & 0xFF){_pPADStatus->substickY -= subvalue;} + + if (dinput.diks[keyForControl[CTL_SUBUP]] & 0xFF){_pPADStatus->substickY += subvalue;} + + if (dinput.diks[keyForControl[CTL_L]] & 0xFF) + { + _pPADStatus->button |= PAD_TRIGGER_L; + _pPADStatus->triggerLeft = triggervalue; + } + + if (dinput.diks[keyForControl[CTL_R]] & 0xFF) + { + _pPADStatus->button |= PAD_TRIGGER_R; + _pPADStatus->triggerRight = triggervalue; + } + + if (dinput.diks[keyForControl[CTL_A]] & 0xFF) + { + _pPADStatus->button |= PAD_BUTTON_A; + _pPADStatus->analogA = 255; + } + + if (dinput.diks[keyForControl[CTL_B]] & 0xFF) + { + _pPADStatus->button |= PAD_BUTTON_B; + _pPADStatus->analogB = 255; + } + + if (dinput.diks[keyForControl[CTL_X]] & 0xFF){_pPADStatus->button |= PAD_BUTTON_X;} + + if (dinput.diks[keyForControl[CTL_Y]] & 0xFF){_pPADStatus->button |= PAD_BUTTON_Y;} + + if (dinput.diks[keyForControl[CTL_Z]] & 0xFF){_pPADStatus->button |= PAD_TRIGGER_Z;} + + if (dinput.diks[keyForControl[CTL_DPADUP]] & 0xFF){_pPADStatus->button |= PAD_BUTTON_UP;} + + if (dinput.diks[keyForControl[CTL_DPADDOWN]] & 0xFF){_pPADStatus->button |= PAD_BUTTON_DOWN;} + + if (dinput.diks[keyForControl[CTL_DPADLEFT]] & 0xFF){_pPADStatus->button |= PAD_BUTTON_LEFT;} + + if (dinput.diks[keyForControl[CTL_DPADRIGHT]] & 0xFF){_pPADStatus->button |= PAD_BUTTON_RIGHT;} + + if (dinput.diks[keyForControl[CTL_START]] & 0xFF){_pPADStatus->button |= PAD_BUTTON_START;} +} + + +void XInput_Read(int _numPAD, SPADStatus* _pPADStatus) +{ +#ifdef XINPUT_ENABLE + const int base = 0x80; + XINPUT_STATE xstate; + DWORD xresult = XInputGetState(_numPAD, &xstate); + + if ((xresult != ERROR_SUCCESS) && (_numPAD != 0)) + { + return; + } + + // In addition, let's .. yes, let's use XINPUT! + if (xresult == ERROR_SUCCESS) + { + const XINPUT_GAMEPAD& pad = xstate.Gamepad; + + if ((_pPADStatus->stickX == base) && (_pPADStatus->stickY == base)) + { + ScaleStickValues( + &_pPADStatus->stickX, + &_pPADStatus->stickY, + pad.sThumbLX, + pad.sThumbLY); + } + + if ((_pPADStatus->substickX == base) && (_pPADStatus->substickY == base)) + { + ScaleStickValues( + &_pPADStatus->substickX, + &_pPADStatus->substickY, + pad.sThumbRX, + pad.sThumbRY); + } + + _pPADStatus->triggerLeft = pad.bLeftTrigger; + _pPADStatus->triggerRight = pad.bRightTrigger; + + if (pad.bLeftTrigger > 20){_pPADStatus->button |= PAD_TRIGGER_L;} + + if (pad.bRightTrigger > 20){_pPADStatus->button |= PAD_TRIGGER_R;} + + if (pad.wButtons & XINPUT_GAMEPAD_A){_pPADStatus->button |= PAD_BUTTON_A;} + + if (pad.wButtons & XINPUT_GAMEPAD_X){_pPADStatus->button |= PAD_BUTTON_B;} + + if (pad.wButtons & XINPUT_GAMEPAD_B){_pPADStatus->button |= PAD_BUTTON_X;} + + if (pad.wButtons & XINPUT_GAMEPAD_Y){_pPADStatus->button |= PAD_BUTTON_Y;} + + if (pad.wButtons & XINPUT_GAMEPAD_RIGHT_SHOULDER){_pPADStatus->button |= PAD_TRIGGER_Z;} + + if (pad.wButtons & XINPUT_GAMEPAD_START){_pPADStatus->button |= PAD_BUTTON_START;} + + if (pad.wButtons & XINPUT_GAMEPAD_DPAD_LEFT){_pPADStatus->button |= PAD_BUTTON_LEFT;} + + if (pad.wButtons & XINPUT_GAMEPAD_DPAD_RIGHT){_pPADStatus->button |= PAD_BUTTON_RIGHT;} + + if (pad.wButtons & XINPUT_GAMEPAD_DPAD_UP){_pPADStatus->button |= PAD_BUTTON_UP;} + + if (pad.wButtons & XINPUT_GAMEPAD_DPAD_DOWN){_pPADStatus->button |= PAD_BUTTON_DOWN;} + } +#endif + +} + + +#endif + +#ifndef _WIN32 +// The graphics plugin in the PCSX2 design leaves a lot of the window processing to the pad plugin, weirdly enough. +void X11_Read(int _numPAD, SPADStatus* _pPADStatus) +{ + // Do all the stuff we need to do once per frame here + if (_numPAD != 0) + { + return; + } + + // This code is from Zerofrog's pcsx2 pad plugin + XEvent E; + //int keyPress=0, keyRelease=0; + KeySym key; + + // keyboard input + while (XPending(GXdsp) > 0) + { + XNextEvent(GXdsp, &E); + + switch (E.type) + { + case KeyPress: + //_KeyPress(pad, XLookupKeysym((XKeyEvent *)&E, 0)); break; + key = XLookupKeysym((XKeyEvent*)&E, 0); + /* + for (i = 0; i < PADKEYS; i++) { + if (key == conf.keys[pad][i]) { + keyPress |= (1<stickY = base; + _pPADStatus->stickX = base; + _pPADStatus->substickX = base; + _pPADStatus->substickY = base; + _pPADStatus->button |= PAD_USE_ORIGIN; +#ifdef _WIN32 + // just update pad on focus + //if (g_PADInitialize.hWnd != ::GetForegroundWindow()) + // return; +#endif + _pPADStatus->err = PAD_ERR_NONE; + + // keyboard is hardwired to player 1. +#ifdef _WIN32 + DInput_Read(_numPAD, _pPADStatus); + XInput_Read(_numPAD, _pPADStatus); +#else + X11_Read(_numPAD, _pPADStatus); +#endif + +#ifdef RECORD_STORE + RecordInput(*_pPADStatus); +#endif +} + + +// Rough approximation of GC behaviour - needs improvement. +void PAD_Rumble(BYTE _numPAD, unsigned int _uType, unsigned int _uStrength) +{ +#ifdef _WIN32 + static int a = 0; + + if ((_uType == 0) || (_uType == 2)) + { + a = 0; + } + else if (_uType == 1) + { + a = _uStrength > 2 ? 8000 : 0; + } + + a = int ((float)a * 0.96f); + + if (!g_rumbleEnable) + { + a = 0; + } + +#ifdef XINPUT_ENABLE + XINPUT_VIBRATION vib; + vib.wLeftMotorSpeed = a; //_uStrength*100; + vib.wRightMotorSpeed = a; //_uStrength*100; + XInputSetState(_numPAD, &vib); +#endif +#endif +} + + +unsigned int SaveLoadState(char* _ptr, BOOL _bSave) +{ + return(0); +} + + +void LoadConfig() +{ +#ifdef _WIN32 + // Initialize pad 1 to standard controls + const int defaultKeyForControl[NUMCONTROLS] = + { + DIK_LEFT, //mainstick + DIK_UP, + DIK_RIGHT, + DIK_DOWN, + DIK_J, //substick + DIK_I, + DIK_L, + DIK_K, + DIK_F, //dpad + DIK_T, + DIK_H, + DIK_G, + DIK_X, //buttons + DIK_Z, + DIK_S, + DIK_C, + DIK_D, + DIK_Q, + DIK_W, + DIK_RETURN, + DIK_LSHIFT, + DIK_LSHIFT, + DIK_LCONTROL + }; +#endif + IniFile file; + file.Load("pad.ini"); + + for (int i = 0; i < NUMCONTROLS; i++) + { +#ifdef _WIN32 + file.Get("Bindings", controlNames[i], &keyForControl[i], defaultKeyForControl[i]); +#endif + } + + file.Get("XPad1", "Rumble", &g_rumbleEnable, true); +} + + +void SaveConfig() +{ + IniFile file; + file.Load("pad.ini"); + + for (int i = 0; i < NUMCONTROLS; i++) + { + file.Set("Bindings", controlNames[i], keyForControl[i]); + } + + file.Set("XPad1", "Rumble", g_rumbleEnable); + file.Save("pad.ini"); +} + + diff --git a/Source/Plugins/Plugin_PadSimple/Src/resource.h b/Source/Plugins/Plugin_PadSimple/Src/resource.h new file mode 100644 index 0000000000..7e80d15722 --- /dev/null +++ b/Source/Plugins/Plugin_PadSimple/Src/resource.h @@ -0,0 +1,39 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by resource.rc +// +#define IDD_PADCONFIG 101 +#define IDD_ABOUTPAD 104 +#define IDC_SETSTART 1003 +#define IDC_SETA 1004 +#define IDC_SETB 1005 +#define IDC_SETX 1006 +#define IDC_SETY 1007 +#define IDC_SETZ 1008 +#define IDC_SETSUBUP 1009 +#define IDC_SETSUBLEFT 1010 +#define IDC_SETSUBRIGHT 1011 +#define IDC_SETSUBDOWN 1012 +#define IDC_SETDPADUP 1013 +#define IDC_SETDPADLEFT 1014 +#define IDC_SETDPADRIGHT 1015 +#define IDC_SETDPADDOWN 1016 +#define IDC_SETMAINUP 1017 +#define IDC_SETMAINLEFT 1018 +#define IDC_SETMAINDOWN 1019 +#define IDC_SETMAINRIGHT 1020 +#define IDC_SETL 1021 +#define IDC_SETR 1022 +#define IDC_RUMBLE 1023 +#define IDC_RUMBLE1 1023 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 105 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1024 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/Source/Plugins/Plugin_PadSimple/Src/resource.rc b/Source/Plugins/Plugin_PadSimple/Src/resource.rc new file mode 100644 index 0000000000..b39bee823f --- /dev/null +++ b/Source/Plugins/Plugin_PadSimple/Src/resource.rc @@ -0,0 +1,137 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "afxres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""afxres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_PADCONFIG DIALOGEX 0, 0, 344, 236 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Pad configuration" +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + DEFPUSHBUTTON "Close",IDOK,287,215,50,14 + PUSHBUTTON "start",IDC_SETSTART,147,103,40,14 + PUSHBUTTON "a",IDC_SETA,249,83,40,14 + PUSHBUTTON "b",IDC_SETB,221,99,40,14 + PUSHBUTTON "x",IDC_SETX,206,72,40,14 + PUSHBUTTON "y",IDC_SETY,292,90,40,14 + PUSHBUTTON "z",IDC_SETZ,247,36,40,14 + PUSHBUTTON " ",IDC_SETSUBUP,241,129,40,14 + PUSHBUTTON " ",IDC_SETSUBLEFT,199,148,40,14 + PUSHBUTTON " ",IDC_SETSUBRIGHT,281,147,40,14 + PUSHBUTTON " ",IDC_SETSUBDOWN,242,168,40,14 + PUSHBUTTON " ",IDC_SETDPADUP,72,130,40,14 + PUSHBUTTON " ",IDC_SETDPADLEFT,29,146,40,14 + PUSHBUTTON " ",IDC_SETDPADRIGHT,118,146,40,14 + PUSHBUTTON " ",IDC_SETDPADDOWN,73,167,40,14 + PUSHBUTTON " ",IDC_SETMAINUP,47,48,40,14 + PUSHBUTTON " ",IDC_SETMAINLEFT,13,67,40,14 + PUSHBUTTON " ",IDC_SETMAINDOWN,47,87,40,14 + PUSHBUTTON " ",IDC_SETMAINRIGHT,85,67,40,14 + PUSHBUTTON "l",IDC_SETL,97,17,40,14 + PUSHBUTTON "r",IDC_SETR,222,17,40,14 + GROUPBOX "Keyboard",IDC_STATIC,7,7,330,185 + GROUPBOX "XBox 360 Pad",IDC_STATIC,7,196,107,33 + CONTROL "Enable Rumble",IDC_RUMBLE1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,210,76,10 +END + +IDD_ABOUTPAD DIALOGEX 0, 0, 184, 76 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "About Dolphin Simple Pad Plugin" +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + DEFPUSHBUTTON "OK",IDOK,127,55,50,14 + LTEXT "Coded by F|RES and ector",IDC_STATIC,7,30,104,14 + LTEXT "Keyboard and XInput simple pad plugin",IDC_STATIC,7,6,126,13 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO +BEGIN + IDD_PADCONFIG, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 337 + TOPMARGIN, 7 + BOTTOMMARGIN, 229 + END + + IDD_ABOUTPAD, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 177 + TOPMARGIN, 6 + BOTTOMMARGIN, 69 + END +END +#endif // APSTUDIO_INVOKED + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/Source/Plugins/Plugin_PadSimple/Src/stdafx.cpp b/Source/Plugins/Plugin_PadSimple/Src/stdafx.cpp new file mode 100644 index 0000000000..428bdfaf8b --- /dev/null +++ b/Source/Plugins/Plugin_PadSimple/Src/stdafx.cpp @@ -0,0 +1,18 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "stdafx.h" diff --git a/Source/Plugins/Plugin_PadSimple/Src/stdafx.h b/Source/Plugins/Plugin_PadSimple/Src/stdafx.h new file mode 100644 index 0000000000..1336ad6458 --- /dev/null +++ b/Source/Plugins/Plugin_PadSimple/Src/stdafx.h @@ -0,0 +1,40 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#pragma once + +// Insert your headers here +#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers +#define _CRT_SECURE_NO_DEPRECATE 1 + +#include +#include +#include +#include +#include + +// DInput +#define DIRECTINPUT_VERSION 0x0800 +#include + +// WTL +#include +#include +#include +#include + + diff --git a/Source/Plugins/Plugin_VideoDX9/Plugin_VideoDX9.vcproj b/Source/Plugins/Plugin_VideoDX9/Plugin_VideoDX9.vcproj new file mode 100644 index 0000000000..e715fb81ba --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Plugin_VideoDX9.vcproj @@ -0,0 +1,1598 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Source/Plugins/Plugin_VideoDX9/Src/BPStructs.cpp b/Source/Plugins/Plugin_VideoDX9/Src/BPStructs.cpp new file mode 100644 index 0000000000..a94ecc600c --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/BPStructs.cpp @@ -0,0 +1,666 @@ +#include "D3DBase.h" + +#include "Globals.h" +#include "Common.h" +#include "BPStructs.h" +#include "OpcodeDecoding.h" +#include "TextureCache.h" +#include "TextureDecoder.h" +#include "VertexHandler.h" +#include "PixelShader.h" +#include "Utils.h" + +#include "main.h" //for the plugin interface + +//BP state +BPMemory bpmem; + +bool textureChanged[8]; + +#define BPMEM_GENMODE 0x00 +#define BPMEM_ZMODE 0x40 +#define BPMEM_BLENDMODE 0x41 +#define BPMEM_CONSTANTALPHA 0x42 +#define BPMEM_ALPHACOMPARE 0xF3 +#define BPMEM_LINEPTWIDTH 0x22 +#define BPMEM_TEXINVALIDATE 0x66 +#define BPMEM_SCISSORTL 0x20 +#define BPMEM_SCISSORBR 0x21 +#define BPMEM_SCISSOROFFSET 0x59 +#define BPMEM_CLEARBBOX1 0x55 // let's hope not many games use bboxes.. +#define BPMEM_CLEARBBOX2 0x56 // TODO(ector): add something that watches bboxes +#define BPMEM_TEXMODE0_1 0x80 +#define BPMEM_TEXMODE0_2 0xA0 +#define BPMEM_FOGPARAM0 0xEE +#define BPMEM_FOGBMAGNITUDE 0xEF +#define BPMEM_FOGBEXPONENT 0xF0 +#define BPMEM_FOGPARAM3 0xF1 +#define BPMEM_FOGCOLOR 0xF2 +#define BPMEM_ZTEX1 0xF4 +#define BPMEM_ZTEX2 0xF5 +#define BPMEM_DRAWDONE 0x45 + +#define BPMEM_PE_TOKEN_ID 0x47 +#define BPMEM_PE_TOKEN_INT_ID 0x48 + +// State translation lookup tables +const D3DBLEND d3dSrcFactors[8] = +{ + D3DBLEND_ZERO, + D3DBLEND_ONE, + D3DBLEND_DESTCOLOR, + D3DBLEND_INVDESTCOLOR, + D3DBLEND_SRCALPHA, + D3DBLEND_INVSRCALPHA, + D3DBLEND_DESTALPHA, + D3DBLEND_INVDESTALPHA +}; + +const D3DBLEND d3dDestFactors[8] = +{ + D3DBLEND_ZERO, + D3DBLEND_ONE, + D3DBLEND_SRCCOLOR, + D3DBLEND_INVSRCCOLOR, + D3DBLEND_SRCALPHA, + D3DBLEND_INVSRCALPHA, + D3DBLEND_DESTALPHA, + D3DBLEND_INVDESTALPHA +}; + +const D3DCULL d3dCullModes[4] = +{ + D3DCULL_NONE, + D3DCULL_CCW, + D3DCULL_CW, + D3DCULL_CCW +}; + +const D3DCMPFUNC d3dCmpFuncs[8] = +{ + D3DCMP_NEVER, + D3DCMP_LESS, + D3DCMP_EQUAL, + D3DCMP_LESSEQUAL, + D3DCMP_GREATER, + D3DCMP_NOTEQUAL, + D3DCMP_GREATEREQUAL, + D3DCMP_ALWAYS +}; + +const D3DTEXTUREFILTERTYPE d3dMipFilters[4] = +{ + D3DTEXF_NONE, + D3DTEXF_POINT, + D3DTEXF_ANISOTROPIC, + D3DTEXF_LINEAR, //reserved +}; + +const D3DTEXTUREADDRESS d3dClamps[4] = +{ + D3DTADDRESS_CLAMP, + D3DTADDRESS_WRAP, + D3DTADDRESS_MIRROR, + D3DTADDRESS_WRAP //reserved +}; + + +void BPInit() +{ + memset(&bpmem, 0, sizeof(bpmem)); + bpmem.bpMask = 0xFFFFFF; +} + +using namespace D3D; +// __________________________________________________________________________________________________ +// BPWritten +// +void BPWritten(int addr, int changes, int newval) +{ + switch(addr) + { + case BPMEM_GENMODE: + if (changes) + { + CVertexHandler::Flush(); + ((u32*)&bpmem)[addr] = newval; + dev->SetRenderState(D3DRS_CULLMODE, d3dCullModes[bpmem.genMode.cullmode]); + if (bpmem.genMode.cullmode == 3) + dev->SetRenderState(D3DRS_COLORWRITEENABLE, 0); + else + { + DWORD write = 0; + if (bpmem.blendmode.alphaupdate) + write = D3DCOLORWRITEENABLE_ALPHA; + if (bpmem.blendmode.colorupdate) + write |= D3DCOLORWRITEENABLE_RED | D3DCOLORWRITEENABLE_GREEN | D3DCOLORWRITEENABLE_BLUE; + dev->SetRenderState(D3DRS_COLORWRITEENABLE, write); + } + } + break; + + case BPMEM_ZMODE: + if (changes) + { + CVertexHandler::Flush(); + ((u32*)&bpmem)[addr] = newval; + if (bpmem.zmode.testenable) + { + dev->SetRenderState(D3DRS_ZENABLE, TRUE); + dev->SetRenderState(D3DRS_ZWRITEENABLE, bpmem.zmode.updateenable); + dev->SetRenderState(D3DRS_ZFUNC,d3dCmpFuncs[bpmem.zmode.func]); + } + else + { + // if the test is disabled write is disabled too + dev->SetRenderState(D3DRS_ZENABLE, FALSE); + dev->SetRenderState(D3DRS_ZWRITEENABLE, FALSE); + } + } + break; + + case BPMEM_ALPHACOMPARE: + if (changes) + { + CVertexHandler::Flush(); + ((u32*)&bpmem)[addr] = newval; + float f[4] = + { + bpmem.alphaFunc.ref0/255.0f, + bpmem.alphaFunc.ref1/255.0f, + 0,0 + }; + dev->SetPixelShaderConstantF(PS_CONST_ALPHAREF,f,1); + + if (D3D::GetShaderVersion() == PSNONE) + { + dev->SetRenderState(D3DRS_ALPHATESTENABLE, (Compare)bpmem.alphaFunc.comp0 != COMPARE_ALWAYS); + dev->SetRenderState(D3DRS_ALPHAREF, bpmem.alphaFunc.ref0*4); + dev->SetRenderState(D3DRS_ALPHAFUNC, d3dCmpFuncs[bpmem.alphaFunc.comp0]); + } + // Normally, use texkill in pixel shader to emulate alpha test + } + break; + + case BPMEM_CONSTANTALPHA: + if (changes) + { + CVertexHandler::Flush(); + ((u32*)&bpmem)[addr] = newval; + float f[4] = { + bpmem.dstalpha.alpha/255.0f,0,0,0 + }; + dev->SetPixelShaderConstantF(PS_CONST_CONSTALPHA,f,1); + } + break; + + case BPMEM_LINEPTWIDTH: +// glPointSize(1); //bpmem.lineptwidth.pointsize); +// glLineWidth(1); //bpmem.lineptwidth.linesize); + break; + + case BPMEM_BLENDMODE: + if (changes & 0xFFFF) + { + CVertexHandler::Flush(); + ((u32*)&bpmem)[addr] = newval; + if (changes & 1) dev->SetRenderState(D3DRS_ALPHABLENDENABLE,bpmem.blendmode.blendenable); + if (changes & 4) dev->SetRenderState(D3DRS_DITHERENABLE,bpmem.blendmode.dither); + D3DBLEND src = d3dSrcFactors[bpmem.blendmode.srcfactor]; + D3DBLEND dst = d3dDestFactors[bpmem.blendmode.dstfactor]; + if (changes & 0x700) dev->SetRenderState(D3DRS_SRCBLEND, src); + if (changes & 0xE0) dev->SetRenderState(D3DRS_DESTBLEND, dst); + if (changes & 0x800) + dev->SetRenderState(D3DRS_BLENDOP,bpmem.blendmode.subtract?D3DBLENDOP_SUBTRACT:D3DBLENDOP_ADD); + + //if (bpmem.blendmode.logicopenable) // && bpmem.blendmode.logicmode == 4) + // MessageBox(0,"LOGIC",0,0); + + if (changes & 0x18) + { + DWORD write = 0; + if (bpmem.blendmode.alphaupdate) + write = D3DCOLORWRITEENABLE_ALPHA; + if (bpmem.blendmode.colorupdate) + write |= D3DCOLORWRITEENABLE_RED | D3DCOLORWRITEENABLE_GREEN | D3DCOLORWRITEENABLE_BLUE; + dev->SetRenderState(D3DRS_COLORWRITEENABLE,write); + } + } + break; + + case BPMEM_FOGPARAM0: + { + u32 fogATemp = bpmem.fog.a<<12; + float fogA = *(float*)(&fogATemp); + } + break; + + case BPMEM_FOGBEXPONENT: + { + + } + break; + + case BPMEM_FOGBMAGNITUDE: + { + + } + break; + + case BPMEM_FOGPARAM3: + //fog settings + { + u32 fogCTemp = bpmem.fog.c_proj_fsel.cShifted12 << 12; + float fogC = *(float*)(&fogCTemp); + } + break; + + case BPMEM_FOGCOLOR: + if (changes) + { + CVertexHandler::Flush(); + ((u32*)&bpmem)[addr] = newval; + dev->SetRenderState(D3DRS_FOGCOLOR,bpmem.fog.color); + } + break; + + case BPMEM_TEXINVALIDATE: + //TexCache_Invalidate(); + break; + + case BPMEM_SCISSOROFFSET: //TODO: investigate + { + CVertexHandler::Flush(); + ((u32*)&bpmem)[addr] = newval; + int x=bpmem.scissorOffset.x*2-342; + int y=bpmem.scissorOffset.y*2-342; + char temp[256]; + sprintf(temp,"ScissorOffset: %i %i",x,y); + g_VideoInitialize.pLog(temp, FALSE); + } + break; + + case BPMEM_SCISSORTL: + case BPMEM_SCISSORBR: + { + CVertexHandler::Flush(); + ((u32*)&bpmem)[addr] = newval; + int xoff = bpmem.scissorOffset.x*2-342; + int yoff = bpmem.scissorOffset.y*2-342; + RECT rc; + rc.left=bpmem.scissorTL.x + xoff - 342 -1; + if (rc.left<0) rc.left=0; + rc.top=bpmem.scissorTL.y + yoff - 342 -1; + if (rc.top<0) rc.top=0; + rc.right=bpmem.scissorBR.x + xoff - 342 +2; + if (rc.right>640) rc.right=640; + rc.bottom=bpmem.scissorBR.y + yoff - 342 +2; + if (rc.bottom>480) rc.bottom=480; + char temp[256]; + sprintf(temp,"ScissorRect: %i %i %i %i",rc.left,rc.top,rc.right,rc.bottom); + g_VideoInitialize.pLog(temp, FALSE); + dev->SetRenderState(D3DRS_SCISSORTESTENABLE,TRUE); + Renderer::SetScissorBox(rc); + } + break; + case BPMEM_ZTEX1: + break; + case BPMEM_ZTEX2: + break; + default: + switch(addr & 0xF8) //texture sampler filter + { + case 0x80: // TEX MODE 0 + case 0xA0: + if (changes) + { + CVertexHandler::Flush(); + ((u32*)&bpmem)[addr] = newval; + FourTexUnits &tex = bpmem.tex[(addr&0xE0)==0xA0]; + int stage = (addr&3);//(addr>>4)&2; + TexMode0 &tm0 = tex.texMode0[stage]; + + D3DTEXTUREFILTERTYPE min, mag, mip; + if (g_Config.bForceFiltering) + { + min = mag = mip = D3DTEXF_LINEAR; + } + else + { + min = (tm0.min_filter&4) ? D3DTEXF_LINEAR : D3DTEXF_POINT; + mag = tm0.mag_filter ? D3DTEXF_LINEAR : D3DTEXF_POINT; + mip = d3dMipFilters[tm0.min_filter&3]; + } + if ((addr & 0xE0) == 0xA0) + stage += 4; + + if (g_Config.bForceMaxAniso) + { + mag = D3DTEXF_ANISOTROPIC; + mip = D3DTEXF_ANISOTROPIC; + min = D3DTEXF_ANISOTROPIC; + } + dev->SetSamplerState(stage, D3DSAMP_MINFILTER, min); + dev->SetSamplerState(stage, D3DSAMP_MAGFILTER, mag); + dev->SetSamplerState(stage, D3DSAMP_MIPFILTER, mip); + + dev->SetSamplerState(stage, D3DSAMP_MAXANISOTROPY,16); + dev->SetSamplerState(stage, D3DSAMP_ADDRESSU,d3dClamps[tm0.wrap_s]); + dev->SetSamplerState(stage, D3DSAMP_ADDRESSV,d3dClamps[tm0.wrap_t]); + //wip + //dev->SetSamplerState(stage,D3DSAMP_MIPMAPLODBIAS,tm0.lod_bias/4.0f); + //char temp[256]; + //sprintf(temp,"lod %f",tm0.lod_bias/4.0f); + //g_VideoInitialize.pLog(temp); + } + break; + case 0x84://TEX MODE 1 + case 0xA4: + break; + case 0x88://TEX IMAGE 0 + case 0xA8: + if (changes) + { + textureChanged[((addr&0xE0)==0xA0)*4+(addr&3)] = true; + CVertexHandler::Flush(); + } + break; + case 0x8C://TEX IMAGE 1 + case 0xAC: + if (changes) + { + textureChanged[((addr&0xE0)==0xA0)*4+(addr&3)] = true; + CVertexHandler::Flush(); + } + break; + case 0x90://TEX IMAGE 2 + case 0xB0: + if (changes) + { + textureChanged[((addr&0xE0)==0xA0)*4+(addr&3)] = true; + CVertexHandler::Flush(); + } + break; + case 0x94://TEX IMAGE 3 + case 0xB4: + if (changes) + { + textureChanged[((addr&0xE0)==0xA0)*4+(addr&3)] = true; + CVertexHandler::Flush(); + } + break; + case 0x98://TEX TLUT + case 0xB8: + if (changes) + { + textureChanged[((addr&0xE0)==0xA0)*4+(addr&3)] = true; + CVertexHandler::Flush(); + } + break; + case 0x9C://TEX UNKNOWN + case 0xBC: + break; + default: + switch(addr&0xF0) { + case 0x30: + { + int tc = addr&0x1; + int stage = (addr>>1)&0x7; + TCoordInfo &tci = bpmem.texcoords[stage]; + //TCInfo &t = (tc?tci.s:tc.t); + // cylindric wrapping here + //dev->SetRenderState(D3DRS_WRAP0+stage, D3DWRAPCOORD_0); + } + break; + + case 0xE0: + if (addr<0xe8) + { + if (addr&1) + { + CVertexHandler::Flush(); + ((u32*)&bpmem)[addr] = newval; + static int lastRGBA[2][4] = { + {0xEEEEEEEE,0xEEEEEEEE,0xEEEEEEEE,0xEEEEEEEE}, + {0xEEEEEEEE,0xEEEEEEEE,0xEEEEEEEE,0xEEEEEEEE} + }; + //Terrible hack + //The reason is that there are two sets of registers + //overloaded here... + int num=(addr>>1)&0x3; + int type = bpmem.tevregs[num].high.type; + int colorbase = type ? PS_CONST_KCOLORS : PS_CONST_COLORS; + int r=bpmem.tevregs[num].low.a, a=bpmem.tevregs[num].low.b; + int b=bpmem.tevregs[num].high.a, g=bpmem.tevregs[num].high.b; + int rgba = ((a<<24) | (r << 16) | (g << 8) | b) & 0xFCFCFCFC; //let's not detect minimal changes + if (rgba != lastRGBA[type][num]) + { + CVertexHandler::Flush(); + lastRGBA[type][num] = rgba; + float temp[4] = { + r/255.0f,g/255.0f,b/255.0f,a/255.0f + }; + D3D::dev->SetPixelShaderConstantF(colorbase+num,temp,1); + } + } + } + break; + case 0x20: + case 0xC0: + case 0xD0: + case 0x80: + case 0x90: + case 0xA0: + case 0xB0: + default: + if (changes) + { + CVertexHandler::Flush(); + ((u32*)&bpmem)[addr] = newval; + } + break; + } + break; + + } + break; + } +} + +// __________________________________________________________________________________________________ +// LoadBPReg +// +void LoadBPReg(u32 value0) +{ + DVSTARTPROFILE(); + + //handle the mask register + int opcode = value0 >> 24; + int oldval = ((u32*)&bpmem)[opcode]; + int newval = (((u32*)&bpmem)[opcode] & ~bpmem.bpMask) | (value0 & bpmem.bpMask); + int changes = (oldval ^ newval) & 0xFFFFFF; + //reset the mask register + if(opcode != 0xFE) + bpmem.bpMask = 0xFFFFFF; + + switch (opcode) + { + case 0x45: //GXSetDrawDone + CVertexHandler::Flush(); + switch (value0 & 0xFF) + { + case 0x02: + g_VideoInitialize.pSetPEFinish(); // may generate interrupt + DebugLog("GXSetDrawDone SetPEFinish (value: 0x%02X)", (value0 & 0xFFFF)); + break; + + default: + DebugLog("GXSetDrawDone ??? (value 0x%02X)", (value0 & 0xFFFF)); + break; + } + break; + + case BPMEM_PE_TOKEN_ID: + g_VideoInitialize.pSetPEToken(static_cast(value0 & 0xFFFF), FALSE); + DebugLog("SetPEToken 0x%04x", (value0 & 0xFFFF)); + break; + + case BPMEM_PE_TOKEN_INT_ID: + g_VideoInitialize.pSetPEToken(static_cast(value0 & 0xFFFF), TRUE); + DebugLog("SetPEToken + INT 0x%04x", (value0 & 0xFFFF)); + break; + + case 0x67: + { +// char test[256]; +// sprintf(test, "Setgpmetric: 0x%08x", value0); +// MessageBox(0, test, "Setgpmetric", 0); + } + //Setgpmetric + break; + + case 0x52: + { + CVertexHandler::Flush(); + + ((u32*)&bpmem)[opcode] = newval; + RECT rc = { + (LONG)(bpmem.copyTexSrcXY.x*Renderer::GetXScale()), + (LONG)(bpmem.copyTexSrcXY.y*Renderer::GetYScale()), + (LONG)((bpmem.copyTexSrcXY.x+bpmem.copyTexSrcWH.x)*Renderer::GetXScale()), + (LONG)((bpmem.copyTexSrcXY.y+bpmem.copyTexSrcWH.y)*Renderer::GetYScale()) + }; + + UPE_Copy PE_copy; + PE_copy.Hex = bpmem.triggerEFBCopy; + + // clamp0 + // clamp1 + // target_pixel_format + // gamma + // scale_something + // clear + // frame_to_field + // copy_to_xfb + + // ???: start Mem to/from EFB transfer +/* bool bMip = false; // ignored + if (bpmem.triggerEFBCopy & EFBCOPY_GENERATEMIPS) + bMip = true;*/ + + if (PE_copy.copy_to_xfb == 0) // bpmem.triggerEFBCopy & EFBCOPY_EFBTOTEXTURE) + { + // EFB to texture + TextureCache::CopyEFBToRenderTarget(bpmem.copyTexDest<<5, &rc); + } + else + { + // EFB to XFB + // MessageBox(0, "WASDF", 0, 0); + Renderer::SwapBuffers(); + DebugLog("Renderer::SwapBuffers()"); + g_VideoInitialize.pCopiedToXFB(); + } + + // clearing + if (PE_copy.clear) // bpmem.triggerEFBCopy & EFBCOPY_CLEAR) + { + // it seems that the GC is able to alpha blend on color-fill + // we cant do that so if alpha is != 255 we skip it + + // clear color + u32 clearColor = (bpmem.clearcolorAR<<16)|bpmem.clearcolorGB; + if (bpmem.blendmode.colorupdate) + { + D3DRECT drc; + drc.x1 = rc.left; + drc.x2 = rc.right; + drc.y1 = rc.top; + drc.y2 = rc.bottom; + //D3D::dev->Clear(1, &drc, D3DCLEAR_STENCIL|D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,clearColor,1.0f,0); + //if ((clearColor>>24) == 255) + D3D::dev->ColorFill(D3D::GetBackBufferSurface(), &rc, clearColor); + } + else + { + // TODO: + // bpmem.blendmode.alphaupdate + // bpmem.blendmode.colorupdate + // i dunno how to implement a clear on alpha only or color only + } + + // clear z-buffer + if (bpmem.zmode.updateenable) + { + float clearZ = (float)bpmem.clearZValue / float(0xFFFFFF); + if (clearZ > 1.0f) clearZ = 1.0f; + if (clearZ < 0.0f) clearZ = 0.0f; + + D3D::dev->Clear(0, 0, D3DCLEAR_ZBUFFER|D3DCLEAR_STENCIL, 0, clearZ, 0); + } + } + } + break; + + case 0x65: //GXLoadTlut + { + CVertexHandler::Flush(); + ((u32*)&bpmem)[opcode] = newval; + + u32 tlutTMemAddr = (value0&0x3FF)<<9; + u32 tlutXferCount = (value0&0x1FFC00)>>5; + //do the transfer!! + memcpy(texMem + tlutTMemAddr, g_VideoInitialize.pGetMemoryPointer((bpmem.tlutXferSrc&0xFFFFF)<<5), tlutXferCount); + // TODO(ector) : kill all textures that use this palette + // Not sure if it's a good idea, though. For now, we hash texture palettes + } + break; + } + + //notify the video handling so it can update render states + BPWritten(opcode, changes, newval); + ((u32*)&bpmem)[opcode] = newval; +} + +void BPReload() +{ + for (int i=0; i<254; i++) + BPWritten(i, 0xFFFFFF, ((u32*)&bpmem)[i]); +} + + +size_t BPSaveLoadState(char *ptr, BOOL save) +{ + /* + BEGINSAVELOAD; + SAVELOAD(&bpmem,sizeof(BPMemory)); + if (!save) + BPReload(); + char temp[256]; + sprintf(temp,"MOJS %08x",(bpmem.clearcolorAR<<16)|(bpmem.clearcolorGB)); + g_VideoInitialize.pLog(temp, FALSE); + ENDSAVELOAD;*/ + return 0; +} + +void ActivateTextures() +{ + for (int i = 0; i < 8; i++) + { + //TODO(ector): this should be a speedup + //if (textureChanged[i] || ASK TEXCACHE ABOUT SENTINEL VALUE) + { + FourTexUnits &tex = bpmem.tex[i>>2]; + TextureCache::Load(i, + (tex.texImage3[i&3].image_base) << 5, + tex.texImage0[i&3].width+1, + tex.texImage0[i&3].height+1, + tex.texImage0[i&3].format, + tex.texTlut[i&3].tmem_offset<<9, + tex.texTlut[i&3].tlut_format); + } + textureChanged[i] = false; + } +} + + diff --git a/Source/Plugins/Plugin_VideoDX9/Src/BPStructs.h b/Source/Plugins/Plugin_VideoDX9/Src/BPStructs.h new file mode 100644 index 0000000000..223e6973f0 --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/BPStructs.h @@ -0,0 +1,530 @@ +#ifndef _BPSTRUCTS_H +#define _BPSTRUCTS_H + +#pragma pack(4) + +////////////////////////////////////////////////////////////////////////// +// Tev/combiner things +////////////////////////////////////////////////////////////////////////// + +enum TevBias +{ + TB_ZERO = 0, + TB_ADDHALF = 1, + TB_SUBHALF = 2, + TB_COMPARE = 3, +}; + + +enum AlphaOp +{ + ALPHAOP_AND = 0, + ALPHAOP_OR, + ALPHAOP_XOR, + ALPHAOP_XNOR, +}; + +enum Compare +{ + COMPARE_NEVER, + COMPARE_LESS, + COMPARE_EQUAL, + COMPARE_LEQUAL, + COMPARE_GREATER, + COMPARE_NEQUAL, + COMPARE_GEQUAL, + COMPARE_ALWAYS +}; + +//color chan above: +// rasterized color selections +#define RAS1_CC_0 0x00000000 /* color channel 0 */ +#define RAS1_CC_1 0x00000001 /* color channel 1 */ +#define RAS1_CC_B 0x00000005 /* indirect texture bump alpha */ +#define RAS1_CC_BN 0x00000006 /* ind tex bump alpha, normalized 0-255 */ +#define RAS1_CC_Z 0x00000007 /* set color value to zero */ + +// Z-texture types (formats) +#define TEV_Z_TYPE_U8 0x00000000 +#define TEV_Z_TYPE_U16 0x00000001 +#define TEV_Z_TYPE_U24 0x00000002 + + +struct TevStageCombiner +{ + union ColorCombiner + { + struct //abc=8bit,d=10bit + { + unsigned d : 4; + unsigned c : 4; + unsigned b : 4; + unsigned a : 4; + + unsigned bias : 2; + unsigned op : 1; + unsigned clamp : 1; + + unsigned scale : 2; + unsigned outreg : 2; //1,2,3 + + }; + u32 hex; + }; + union AlphaCombiner + { + struct + { + unsigned rswap : 2; + unsigned tswap : 2; + unsigned d : 3; + unsigned c : 3; + unsigned b : 3; + unsigned a : 3; + + unsigned bias : 2; + unsigned op : 1; + unsigned clamp : 1; + + unsigned scale : 2; + unsigned outreg : 2; //1,2,3 + }; + u32 hex; + }; + + ColorCombiner colorC; + AlphaCombiner alphaC; +}; + +union TwoTevStageOrders +{ + struct + { + unsigned texmap0 : 3; + unsigned texcoord0 : 3; + unsigned enable0 : 1; + unsigned colorchan0 : 3; + + unsigned pad0 : 2; + + unsigned texmap1 : 3; + unsigned texcoord1 : 3; + unsigned enable1 : 1; + unsigned colorchan1 : 3; + + unsigned pad1 : 2; + }; + u32 hex; + int getTexMap(int i){return i?texmap1:texmap0;} + int getTexCoord(int i){return i?texcoord1:texcoord0;} + int getEnable(int i){return i?enable1:enable0;} + int getColorChan(int i){return i?colorchan1:colorchan0;} +}; + + + +////////////////////////////////////////////////////////////////////////// +// Texture structs +////////////////////////////////////////////////////////////////////////// +union TexMode0 +{ + struct + { + unsigned wrap_s : 2; + unsigned wrap_t : 2; + unsigned mag_filter : 1; + unsigned min_filter : 3; + unsigned diag_lod : 1; + signed lod_bias : 8; + unsigned max_aniso : 2; + unsigned lod_clamp : 1; + }; + u32 hex; +}; +union TexMode1 +{ + struct + { + unsigned min_lod : 8; + unsigned max_lod : 8; + }; + u32 hex; +}; +union TexImage0 +{ + struct + { + unsigned width : 10; //actually w-1 + unsigned height : 10; //actually h-1 + unsigned format : 4; + }; + u32 hex; +}; +union TexImage1 +{ + struct + { + unsigned tmem_offset : 15; // we ignore texture caching for now, we do it ourselves + unsigned cache_width : 3; + unsigned cache_height : 3; + unsigned image_type : 1; + }; + u32 hex; +}; + +union TexImage2 +{ + struct + { + unsigned tmem_offset : 15; // we ignore texture caching for now, we do it ourselves + unsigned cache_width : 3; + unsigned cache_height : 3; + }; + u32 hex; +}; + +union TexImage3 +{ + struct + { + unsigned image_base: 24; //address in memory >> 5 + }; + u32 hex; +}; +union TexTLUT +{ + struct + { + unsigned tmem_offset : 10; + unsigned tlut_format : 2; + }; + u32 hex; +}; + +union ZTex1 +{ + struct + { + unsigned bias : 24; + }; + u32 hex; +}; + +union ZTex2 +{ + struct + { + unsigned type : 2; + unsigned op : 2; + }; + u32 hex; +}; + +// Z-texture types (formats) +#define TEV_ZTEX_TYPE_U8 0x00000000 +#define TEV_ZTEX_TYPE_U16 0x00000001 +#define TEV_ZTEX_TYPE_U24 0x00000002 + +#define TEV_ZTEX_DISABLE 0 +#define TEV_ZTEX_ADD 1 +#define TEV_ZTEX_REPLACE 2 + + +struct FourTexUnits +{ + TexMode0 texMode0[4]; + TexMode1 texMode1[4]; + TexImage0 texImage0[4]; + TexImage1 texImage1[4]; + TexImage2 texImage2[4]; + TexImage3 texImage3[4]; + TexTLUT texTlut[4]; + u32 unknown[4]; +}; + + +////////////////////////////////////////////////////////////////////////// +// Geometry/other structs +////////////////////////////////////////////////////////////////////////// +union GenMode +{ + struct + { + unsigned numtexgens : 4; // 0xF + unsigned numcolchans : 5; // 0x1E0 + unsigned ms_en : 1; // 0x200 + unsigned numtevstages : 4; // 0x3C00 + unsigned cullmode : 2; // 0xC000 + unsigned numindstages : 3; // 0x30000 + unsigned zfreeze : 5; //0x3C0000 + }; + u32 hex; +}; + +union LPSize +{ + struct + { + unsigned linesize : 8; + unsigned pointsize : 8; + unsigned lineoff : 3; + unsigned pointoff : 3; + unsigned lineaspect : 1; + unsigned padding : 1; + }; + u32 hex; +}; + + +union X12Y12 +{ + struct + { + unsigned y : 12; + unsigned x : 12; + }; + u32 hex; +}; +union X10Y10 +{ + struct + { + unsigned x : 10; + unsigned y : 10; + }; + u32 hex; +}; + +////////////////////////////////////////////////////////////////////////// +// Framebuffer/pixel stuff (incl fog) +////////////////////////////////////////////////////////////////////////// +union BlendMode +{ + struct + { + unsigned blendenable : 1; + unsigned logicopenable : 1; + unsigned dither : 1; + unsigned colorupdate : 1; + unsigned alphaupdate : 1; + unsigned dstfactor : 3; //BLEND_ONE, BLEND_INV_SRc etc + unsigned srcfactor : 3; + unsigned subtract : 1; + unsigned logicmode : 4; + }; + u32 hex; +}; + + +union FogParam0 +{ + struct + { + unsigned mantissa : 11; + unsigned exponent : 8; + unsigned sign : 1; + }; + u32 hex; +}; +union FogParam3 +{ + struct + { + unsigned cShifted12 : 20; + unsigned proj : 1; + unsigned fsel : 3; + }; + u32 hex; +}; +struct FogParams +{ + u32 a; + u32 b_magnitude; + u32 b_exponent; + FogParam3 c_proj_fsel; + u32 color; //0:b 8:g 16:r - nice! +}; + +union ZMode +{ + struct + { + unsigned testenable : 1; + unsigned func : 3; + unsigned updateenable : 1; //size? + }; + u32 hex; +}; + +union ConstantAlpha +{ + struct + { + unsigned alpha : 8; + unsigned enable : 1; + }; + u32 hex; +}; + +////////////////////////////////////////////////////////////////////////// +// Texture coordinate stuff +////////////////////////////////////////////////////////////////////////// +union TCInfo +{ + struct + { + unsigned scale_minus_1 : 16; + unsigned range_bias : 1; + unsigned cylindric_wrap : 1; + }; + u32 hex; +}; +struct TCoordInfo +{ + TCInfo s; + TCInfo t; +}; + + +////////////////////////////////////////////////////////////////////////// +// All of BP memory +////////////////////////////////////////////////////////////////////////// + +union ColReg +{ + u32 hex; + struct + { + signed a : 11; + unsigned : 1; + signed b : 11; + unsigned type : 1; + }; +}; + +struct TevReg +{ + ColReg low; + ColReg high; +}; + +union TevKSel +{ + struct { + unsigned swap1 : 2; + unsigned swap2 : 2; + unsigned kcsel0 : 5; + unsigned kasel0 : 5; + unsigned kcsel1 : 5; + unsigned kasel1 : 5; + }; + u32 hex; + + int getKC(int i) {return i?kcsel1:kcsel0;} + int getKA(int i) {return i?kasel1:kasel0;} +}; + +union AlphaFunc +{ + struct + { + unsigned ref0 : 8; + unsigned ref1 : 8; + unsigned comp0 : 3; + unsigned comp1 : 3; + unsigned logic : 2; + }; + u32 hex; +}; + +union UPE_Copy +{ + u32 Hex; + struct + { + unsigned clamp0 : 1; + unsigned clamp1 : 1; + unsigned target_pixel_format : 3; + unsigned : 2; + unsigned gamma : 2; + unsigned : 1; + unsigned scale_something : 1; + unsigned clear : 1; + unsigned frame_to_field : 2; + unsigned copy_to_xfb : 1; + unsigned : 17; + }; +}; + +#define EFBCOPY_EFBTOTEXTURE 0x10000 +#define EFBCOPY_CLEAR 0x800 +#define EFBCOPY_GENERATEMIPS 0x200 + +struct BPMemory +{ + GenMode genMode; + u32 unknown[15]; //0f = flushtexturestate + u32 tevind[16]; + X12Y12 scissorTL; //20 + X12Y12 scissorBR; //21 + LPSize lineptwidth; //22 line and point width + u32 unknown1[2]; //23-24 + u32 unknown2[3]; //25-27 + TwoTevStageOrders tevorders[8]; //28-2F + TCoordInfo texcoords[8]; //0x30 s,t,s,t,s,t,s,t... + ZMode zmode; //40 + BlendMode blendmode; //41 + ConstantAlpha dstalpha; //42 + u32 unknown4; //43 // GXSetZCompLoc, GXPixModeSync + u32 fieldmask; //44 + u32 drawdone; //45 + u32 unknown5; //46 + u32 drawsync1; //47 + u32 drawsync2; //48 + X10Y10 copyTexSrcXY; //49 + X10Y10 copyTexSrcWH; //4a + u32 copyTexDest; //4b// 4b == CopyAddress (GXDispCopy and GXTexCopy use it) + u32 unknown6[2]; //4c, 4d + u32 dispcopyyscale; //4e + u32 clearcolorAR; //4f + u32 clearcolorGB; //50 + u32 clearZValue; //51 + u32 triggerEFBCopy; //52 + u32 copyfilter[2]; //53,54 + u32 boundbox0;//55 + u32 boundbox1;//56 + u32 unknown7[2];//57,58 + X10Y10 scissorOffset; //59 + u32 unknown8[10]; //5a,5b,5c,5d, 5e,5f,60,61, 62, 63 (GXTexModeSync), + u32 tlutXferSrc; //64 + u32 tlutXferDest; //65 + u32 texinvalidate;//66 + u32 unknown9; //67 + u32 unknown10[8];//68-6F + u32 unknown11[16];//70-7F + FourTexUnits tex[2]; //80-bf + TevStageCombiner combiners[16]; //0xC0-0xDF + TevReg tevregs[4]; //0xE0 + u32 fogRangeAdj; //0xE8 + u32 unknown15[5]; //0xe9,0xea,0xeb,0xec,0xed + FogParams fog; //0xEE,0xEF,0xF0,0xF1,0xF2 + AlphaFunc alphaFunc; //0xF3 + ZTex1 ztex1; //0xf4,0xf5 + ZTex2 ztex2; + TevKSel tevksel[8];//0xf6,0xf7,f8,f9,fa,fb,fc,fd + u32 bpMask; //0xFE + u32 unknown18; //ff +}; + +void BPInit(); +size_t BPSaveLoadState(char *ptr, BOOL save); +//bool BPWritten(int addr, int changes); +void LoadBPReg(u32 value0); + +void ActivateTextures(); + +extern BPMemory bpmem; + +#pragma pack() + +#endif \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoDX9/Src/CPStructs.cpp b/Source/Plugins/Plugin_VideoDX9/Src/CPStructs.cpp new file mode 100644 index 0000000000..307f51c8e9 --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/CPStructs.cpp @@ -0,0 +1,82 @@ +#include + +#include "CPStructs.h" +#include "XFStructs.h" +#include "TransformEngine.h" +#include "VertexHandler.h" +#include "VertexLoader.h" + +// CP state +u32 arraybases[16]; +u32 arraystrides[16]; + +TMatrixIndexA MatrixIndexA; +TMatrixIndexB MatrixIndexB; + +// PROBLEM - matrix switching within vbuffers may be stateful! + +void CPUpdateMatricesA() +{ + float *flipmem = (float *)xfmem; + CTransformEngine::SetPosNormalMatrix( + flipmem + MatrixIndexA.PosNormalMtxIdx * 4, //CHECK + flipmem + 0x400 + 3 * (MatrixIndexA.PosNormalMtxIdx & 31)); //CHECK + CTransformEngine::SetTexMatrix(0,flipmem + MatrixIndexA.Tex0MtxIdx * 4); + CTransformEngine::SetTexMatrix(1,flipmem + MatrixIndexA.Tex1MtxIdx * 4); + CTransformEngine::SetTexMatrix(2,flipmem + MatrixIndexA.Tex2MtxIdx * 4); + CTransformEngine::SetTexMatrix(3,flipmem + MatrixIndexA.Tex3MtxIdx * 4); +} + +void CPUpdateMatricesB() +{ + float *flipmem = (float *)xfmem; + CTransformEngine::SetTexMatrix(4,flipmem + MatrixIndexB.Tex4MtxIdx * 4); + CTransformEngine::SetTexMatrix(5,flipmem + MatrixIndexB.Tex5MtxIdx * 4); + CTransformEngine::SetTexMatrix(6,flipmem + MatrixIndexB.Tex6MtxIdx * 4); + CTransformEngine::SetTexMatrix(7,flipmem + MatrixIndexB.Tex7MtxIdx * 4); +} + +void LoadCPReg(u32 SubCmd, u32 Value) +{ + switch (SubCmd & 0xF0) + { + case 0x30: + MatrixIndexA.Hex = Value; + CPUpdateMatricesA(); + break; + case 0x40: + MatrixIndexB.Hex = Value; + CPUpdateMatricesB(); + break; + + case 0x50: CVertexHandler::Flush(); VertexLoader::SetVtxDesc_Lo(Value); break; + case 0x60: CVertexHandler::Flush(); VertexLoader::SetVtxDesc_Hi(Value); break; + + case 0x70: g_VertexLoaders[SubCmd & 7].SetVAT_group0(Value); _assert_((SubCmd & 0x0F) < 8); break; + case 0x80: g_VertexLoaders[SubCmd & 7].SetVAT_group1(Value); _assert_((SubCmd & 0x0F) < 8); break; + case 0x90: g_VertexLoaders[SubCmd & 7].SetVAT_group2(Value); _assert_((SubCmd & 0x0F) < 8); break; + + case 0xA0: arraybases[SubCmd & 0xF] = Value & 0xFFFFFFFF; break; + case 0xB0: arraystrides[SubCmd & 0xF] = Value & 0xFF; break; + } +} + + +#define BEGINSAVELOAD char *optr=ptr; +#define SAVELOAD(what,size) memcpy((void*)((save)?(void*)(ptr):(void*)(what)),(void*)((save)?(void*)(what):(void*)(ptr)),(size)); ptr+=(size); +#define ENDSAVELOAD return ptr-optr; + +size_t CPSaveLoadState(char *ptr, BOOL save) +{ + BEGINSAVELOAD; + SAVELOAD(arraybases,16*sizeof(u32)); + SAVELOAD(arraystrides,16*sizeof(u32)); + SAVELOAD(&MatrixIndexA,sizeof(TMatrixIndexA)); + SAVELOAD(&MatrixIndexB,sizeof(TMatrixIndexB)); + if (!save) + { + CPUpdateMatricesA(); + CPUpdateMatricesB(); + } + ENDSAVELOAD; +} \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoDX9/Src/CPStructs.h b/Source/Plugins/Plugin_VideoDX9/Src/CPStructs.h new file mode 100644 index 0000000000..addab692c6 --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/CPStructs.h @@ -0,0 +1,227 @@ +#ifndef _CPSTRUCTS_H +#define _CPSTRUCTS_H + +#include "Common.h" + +// Vertex array numbers +enum +{ + ARRAY_POSITION = 0, + ARRAY_NORMAL = 1, + ARRAY_COLOR = 2, + ARRAY_COLOR2 = 3, + ARRAY_TEXCOORD0 = 4 +}; + +// Vertex components +enum +{ + NOT_PRESENT = 0, + DIRECT = 1, + INDEX8 = 2, + INDEX16 = 3, +}; + +#pragma pack(4) + +union TVtxDesc +{ + u64 Hex; + struct + { + // 0: not present + // 1: present + unsigned PosMatIdx : 1; + unsigned Tex0MatIdx : 1; + unsigned Tex1MatIdx : 1; + unsigned Tex2MatIdx : 1; + unsigned Tex3MatIdx : 1; + unsigned Tex4MatIdx : 1; + unsigned Tex5MatIdx : 1; + unsigned Tex6MatIdx : 1; + unsigned Tex7MatIdx : 1; + + // 00: not present + // 01: direct + // 10: 8 bit index + // 11: 16 bit index + unsigned Position : 2; + unsigned Normal : 2; + unsigned Color0 : 2; + unsigned Color1 : 2; + unsigned Tex0Coord : 2; + unsigned Tex1Coord : 2; + unsigned Tex2Coord : 2; + unsigned Tex3Coord : 2; + unsigned Tex4Coord : 2; + unsigned Tex5Coord : 2; + unsigned Tex6Coord : 2; + unsigned Tex7Coord : 2; + unsigned :31; + }; +}; + + + +enum +{ + FORMAT_UBYTE = 0, // 2 Cmp + FORMAT_BYTE = 1, // 3 Cmp + FORMAT_USHORT = 2, + FORMAT_SHORT = 3, + FORMAT_FLOAT = 4, +}; + +enum +{ + FORMAT_16B_565 = 0, // NA + FORMAT_24B_888 = 1, + FORMAT_32B_888x = 2, + FORMAT_16B_4444 = 3, + FORMAT_24B_6666 = 4, + FORMAT_32B_8888 = 5, +}; + +union UVAT_group0 +{ + u32 Hex; + struct + { + // 0:8 + unsigned PosElements : 1; + unsigned PosFormat : 3; + unsigned PosFrac : 5; + // 9:12 + unsigned NormalElements : 1; + unsigned NormalFormat : 3; + // 13:16 + unsigned Color0Elements : 1; + unsigned Color0Comp : 3; + // 17:20 + unsigned Color1Elements : 1; + unsigned Color1Comp : 3; + // 21:29 + unsigned Tex0CoordElements : 1; + unsigned Tex0CoordFormat : 3; + unsigned Tex0Frac : 5; + // 30:31 + unsigned ByteDequant: 1; + unsigned NormalIndex3: 1; + }; +}; + +union UVAT_group1 +{ + u32 Hex; + struct + { + // 0:8 + unsigned Tex1CoordElements : 1; + unsigned Tex1CoordFormat : 3; + unsigned Tex1Frac : 5; + // 9:17 + unsigned Tex2CoordElements : 1; + unsigned Tex2CoordFormat : 3; + unsigned Tex2Frac : 5; + // 18:26 + unsigned Tex3CoordElements : 1; + unsigned Tex3CoordFormat : 3; + unsigned Tex3Frac : 5; + // 27:30 + unsigned Tex4CoordElements : 1; + unsigned Tex4CoordFormat : 3; + // + unsigned : 1; + }; +}; + +union UVAT_group2 +{ + u32 Hex; + struct + { + // 0:4 + unsigned Tex4Frac : 5; + // 5:13 + unsigned Tex5CoordElements : 1; + unsigned Tex5CoordFormat : 3; + unsigned Tex5Frac : 5; + // 14:22 + unsigned Tex6CoordElements : 1; + unsigned Tex6CoordFormat : 3; + unsigned Tex6Frac : 5; + // 23:31 + unsigned Tex7CoordElements : 1; + unsigned Tex7CoordFormat : 3; + unsigned Tex7Frac : 5; + }; +}; + +struct ColorAttr +{ + u8 Elements; + u8 Comp; +}; + +struct TexAttr +{ + u8 Elements; + u8 Format; + u8 Frac; +}; + +struct TVtxAttr +{ + u8 PosElements; + u8 PosFormat; + u8 PosFrac; + u8 NormalElements; + u8 NormalFormat; + ColorAttr color[2]; + TexAttr texCoord[8]; + u8 ByteDequant; + u8 NormalIndex3; +}; + +////////////////////////////////////////////////////////////////////////// +// Matrix indices +////////////////////////////////////////////////////////////////////////// + +union TMatrixIndexA +{ + u32 Hex; + struct + { + unsigned PosNormalMtxIdx : 6; + unsigned Tex0MtxIdx : 6; + unsigned Tex1MtxIdx : 6; + unsigned Tex2MtxIdx : 6; + unsigned Tex3MtxIdx : 6; + }; +}; + +union TMatrixIndexB +{ + u32 Hex; + struct + { + unsigned Tex4MtxIdx : 6; + unsigned Tex5MtxIdx : 6; + unsigned Tex6MtxIdx : 6; + unsigned Tex7MtxIdx : 6; + }; +}; + +#pragma pack () + +extern TMatrixIndexA MatrixIndexA; +extern TMatrixIndexB MatrixIndexB; +extern u32 arraybases[16]; +extern u32 arraystrides[16]; + +void CPUpdateMatricesA(); +void CPUpdateMatricesB(); +size_t CPSaveLoadState(char *ptr, BOOL save); +void LoadCPReg(u32 SubCmd, u32 Value); + +#endif diff --git a/Source/Plugins/Plugin_VideoDX9/Src/D3DBase.cpp b/Source/Plugins/Plugin_VideoDX9/Src/D3DBase.cpp new file mode 100644 index 0000000000..15146eda60 --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/D3DBase.cpp @@ -0,0 +1,354 @@ +#include "D3DBase.h" + +namespace D3D +{ + bool fullScreen = false, nextFullScreen=false; + LPDIRECT3D9 D3D = NULL; // Used to create the D3DDevice + LPDIRECT3DDEVICE9 dev = NULL; // Our rendering device + LPDIRECT3DSURFACE9 backBuffer; + D3DCAPS9 caps; + int multisample; + int resolution; + +#define VENDOR_NVIDIA 4318 + + RECT client; + HWND hWnd; + int xres, yres; + int cur_adapter; + int psMajor; + int psMinor; + int vsMajor; + int vsMinor; + + bool bFrameInProgress = false; + + //enum shit + Adapter adapters[4]; + int numAdapters; + + void Enumerate(); + + int GetNumAdapters() + { + return numAdapters; + } + + const Adapter &GetAdapter(int i) + { + return adapters[i]; + } + + const Adapter &GetCurAdapter() + { + return adapters[cur_adapter]; + } + + HRESULT Init() + { + // Create the D3D object, which is needed to create the D3DDevice. + if( NULL == ( D3D = Direct3DCreate9( D3D_SDK_VERSION ) ) ) + return E_FAIL; + + Enumerate(); + return S_OK; + } + + void EnableAlphaToCoverage() + { + dev->SetRenderState(D3DRS_ADAPTIVETESS_Y, (D3DFORMAT)MAKEFOURCC('A', 'T', 'O', 'C')); + } + + void InitPP(int adapter, int resolution, int aa_mode, D3DPRESENT_PARAMETERS *pp) + { + int FSResX = adapters[adapter].resolutions[resolution].xres; + int FSResY = adapters[adapter].resolutions[resolution].yres; + + ZeroMemory(pp, sizeof(D3DPRESENT_PARAMETERS)); + pp->hDeviceWindow = hWnd; + pp->EnableAutoDepthStencil = TRUE; + pp->AutoDepthStencilFormat = D3DFMT_D24S8; + pp->BackBufferFormat = D3DFMT_A8R8G8B8; + if (aa_mode >= (int)adapters[adapter].aa_levels.size()) + aa_mode = 0; + + pp->MultiSampleType = adapters[adapter].aa_levels[aa_mode].ms_setting; + pp->MultiSampleQuality = adapters[adapter].aa_levels[aa_mode].qual_setting; + pp->Flags = D3DPRESENTFLAG_DISCARD_DEPTHSTENCIL; + + //D3DPRESENTFLAG_LOCKABLE_BACKBUFFER + + if (fullScreen) + { + xres = pp->BackBufferWidth = FSResX; + yres = pp->BackBufferHeight = FSResY; + pp->SwapEffect = D3DSWAPEFFECT_DISCARD; + pp->Windowed = FALSE; + } + else + { + GetClientRect(hWnd, &client); + xres = pp->BackBufferWidth = client.right - client.left; + yres = pp->BackBufferHeight = client.bottom - client.top; + pp->SwapEffect = D3DSWAPEFFECT_DISCARD; + pp->PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; + pp->Windowed = TRUE; + } + } + + void Enumerate() + { + numAdapters = D3D::D3D->GetAdapterCount(); + + for (int i=0; iGetAdapterIdentifier(i, 0, &a.ident); + + bool isNvidia = a.ident.VendorId == VENDOR_NVIDIA; + + // Add multisample modes + a.aa_levels.push_back(AALevel("None", D3DMULTISAMPLE_NONE, 0)); + + DWORD qlevels = 0; + if (D3DERR_NOTAVAILABLE != D3D::D3D->CheckDeviceMultiSampleType( + i, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, TRUE, D3DMULTISAMPLE_2_SAMPLES, &qlevels)) + if (qlevels > 0) + a.aa_levels.push_back(AALevel("2x MSAA", D3DMULTISAMPLE_2_SAMPLES, 0)); + + if (D3DERR_NOTAVAILABLE != D3D::D3D->CheckDeviceMultiSampleType( + i, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, TRUE, D3DMULTISAMPLE_2_SAMPLES, &qlevels)) + if (qlevels > 0) + a.aa_levels.push_back(AALevel("4x MSAA", D3DMULTISAMPLE_4_SAMPLES, 0)); + + if (D3DERR_NOTAVAILABLE != D3D::D3D->CheckDeviceMultiSampleType( + i, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, TRUE, D3DMULTISAMPLE_8_SAMPLES, &qlevels)) + if (qlevels > 0) + a.aa_levels.push_back(AALevel("8x MSAA", D3DMULTISAMPLE_8_SAMPLES, 0)); + + if (isNvidia) + { + // CSAA support + if (D3DERR_NOTAVAILABLE != D3D::D3D->CheckDeviceMultiSampleType( + i, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, TRUE, D3DMULTISAMPLE_4_SAMPLES, &qlevels)) + { + if (qlevels > 2) + { + // 8x, 8xQ are available + // See http://developer.nvidia.com/object/coverage-sampled-aa.html + a.aa_levels.push_back(AALevel("8x CSAA", D3DMULTISAMPLE_4_SAMPLES, 2)); + a.aa_levels.push_back(AALevel("8xQ CSAA", D3DMULTISAMPLE_8_SAMPLES, 0)); + } + } + if (D3DERR_NOTAVAILABLE != D3D::D3D->CheckDeviceMultiSampleType( + i, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, TRUE, D3DMULTISAMPLE_8_SAMPLES, &qlevels)) + { + if (qlevels > 2) + { + // 8x, 8xQ are available + // See http://developer.nvidia.com/object/coverage-sampled-aa.html + a.aa_levels.push_back(AALevel("16x CSAA", D3DMULTISAMPLE_4_SAMPLES, 4)); + a.aa_levels.push_back(AALevel("16xQ CSAA", D3DMULTISAMPLE_8_SAMPLES, 2)); + } + } + } + + if (a.aa_levels.size() == 1) + { + strcpy(a.aa_levels[0].name, "(Not supported on this device)"); + } + + int numModes = D3D::D3D->GetAdapterModeCount(i, D3DFMT_X8R8G8B8); + + for (int m = 0; m < numModes; m++) + { + D3DDISPLAYMODE mode; + D3D::D3D->EnumAdapterModes(i, D3DFMT_X8R8G8B8, m, &mode); + + int found = -1; + for (int x = 0; x < (int)a.resolutions.size(); x++) + { + if (a.resolutions[x].xres == mode.Width && a.resolutions[x].yres == mode.Height) + { + found = x; + break; + } + } + + Resolution temp; + Resolution &r = found==-1 ? temp : a.resolutions[found]; + + sprintf(r.name, "%ix%i", mode.Width, mode.Height); + r.bitdepths.insert(mode.Format); + r.refreshes.insert(mode.RefreshRate); + if (found == -1 && mode.Width >= 640 && mode.Height >= 480) + { + r.xres = mode.Width; + r.yres = mode.Height; + a.resolutions.push_back(r); + } + } + } + } + + HRESULT Create(int adapter, HWND wnd, bool _fullscreen, int _resolution, int aa_mode) + { + hWnd = wnd; + fullScreen = _fullscreen; + nextFullScreen = _fullscreen; + multisample = aa_mode; + resolution = _resolution; + cur_adapter = adapter; + D3DPRESENT_PARAMETERS d3dpp; + InitPP(adapter, resolution, aa_mode, &d3dpp); + + if( FAILED( D3D->CreateDevice( + adapter, + D3DDEVTYPE_HAL, + wnd, + D3DCREATE_HARDWARE_VERTEXPROCESSING|D3DCREATE_MULTITHREADED, + // |D3DCREATE_MULTITHREADED /* | D3DCREATE_PUREDEVICE*/, + //D3DCREATE_SOFTWARE_VERTEXPROCESSING , + &d3dpp, &dev ) ) ) + { + MessageBox(wnd, + "Direct3D Device creation failed!\n" + "Your device does not support the desired settings.", + "D3D error", MB_OK|MB_ICONERROR); + return E_FAIL; + } + dev->GetDeviceCaps(&caps); + dev->GetRenderTarget(0,&backBuffer); + + psMajor = (D3D::caps.PixelShaderVersion >> 8) & 0xFF; + psMinor = (D3D::caps.PixelShaderVersion) & 0xFF; + vsMajor = (D3D::caps.VertexShaderVersion >>8) & 0xFF; + vsMinor = (D3D::caps.VertexShaderVersion) & 0xFF; + + + // Device state would normally be set here + return S_OK; + } + + ShaderVersion GetShaderVersion() + { + if (psMajor < 2) + return PSNONE; + else + //good enough estimate - we really only + //care about zero shader vs ps20 + return (ShaderVersion)psMajor; + } + + void Close() + { + dev->Release(); + dev = 0; + } + + void Shutdown() + { + D3D->Release(); + D3D = 0; + } + + const D3DCAPS9 &GetCaps() + { + return caps; + } + + LPDIRECT3DSURFACE9 GetBackBufferSurface() + { + return backBuffer; + } + + void ShowD3DError(HRESULT err) + { + switch (err) + { + case D3DERR_DEVICELOST: + MessageBox(0, "Device Lost", "D3D ERROR", 0); + break; + case D3DERR_INVALIDCALL: + MessageBox(0, "Invalid Call", "D3D ERROR", 0); + break; + case D3DERR_DRIVERINTERNALERROR: + MessageBox(0, "Driver Internal Error", "D3D ERROR", 0); + break; + case D3DERR_OUTOFVIDEOMEMORY: + MessageBox(0, "Out of vid mem", "D3D ERROR", 0); + break; + default: + // MessageBox(0,"Other error or success","ERROR",0); + break; + } + } + + void Reset() + { + if (dev) + { + D3DPRESENT_PARAMETERS d3dpp; + InitPP(cur_adapter, resolution, multisample, &d3dpp); + HRESULT hr = dev->Reset(&d3dpp); + ShowD3DError(hr); + } + } + + bool IsFullscreen() + { + return fullScreen; + } + + int GetDisplayWidth() + { + return xres; + } + int GetDisplayHeight() + { + return yres; + } + void SwitchFullscreen(bool fullscreen) + { + nextFullScreen = fullscreen; + } + + bool BeginFrame(bool clear, u32 color, float z) + { + if (bFrameInProgress) + return false; + + bFrameInProgress = true; + + if (dev) + { + if (clear) + dev->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER|D3DCLEAR_STENCIL, (DWORD)color, z, 0 ); + dev->BeginScene(); + return true; + } + else + return false; + } + + void EndFrame() + { + if (!bFrameInProgress) + return; + + bFrameInProgress = false; + + if (dev) + { + dev->EndScene(); + dev->Present( NULL, NULL, NULL, NULL ); + } + + if (fullScreen != nextFullScreen) + { + fullScreen = nextFullScreen; + Reset(); + } + } + +} diff --git a/Source/Plugins/Plugin_VideoDX9/Src/D3DBase.h b/Source/Plugins/Plugin_VideoDX9/Src/D3DBase.h new file mode 100644 index 0000000000..bbb483fafd --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/D3DBase.h @@ -0,0 +1,79 @@ +#ifndef _D3DBASE_H +#define _D3DBASE_H + +#include + +#include +#include + +#ifndef SAFE_RELEASE +#define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } } +#endif + +#include "Common.h" + +namespace D3D +{ + enum ShaderVersion + { + PSNONE=0, + PS20=2, + PS30, + PS40, + }; + + HRESULT Init(); + HRESULT Create(int adapter, HWND wnd, bool fullscreen, int resolution, int aa_mode); + void Close(); + void Shutdown(); + + void Reset(); + bool BeginFrame(bool clear=true, u32 color=0, float z=1.0f); + void EndFrame(); + void SwitchFullscreen(bool fullscreen); + bool IsFullscreen(); + int GetDisplayWidth(); + int GetDisplayHeight(); + ShaderVersion GetShaderVersion(); + LPDIRECT3DSURFACE9 GetBackBufferSurface(); + const D3DCAPS9 &GetCaps(); + extern IDirect3DDevice9 *dev; + void ShowD3DError(HRESULT err); + void EnableAlphaToCoverage(); + + extern int psMajor; + extern int psMinor; + extern int vsMajor; + extern int vsMinor; + + struct Resolution + { + char name[32]; + int xres; + int yres; + std::set bitdepths; + std::set refreshes; + }; + + struct AALevel + { + AALevel(const char *n, D3DMULTISAMPLE_TYPE m, int q) {strcpy(name, n); ms_setting=m; qual_setting=q;} + char name[32]; + D3DMULTISAMPLE_TYPE ms_setting; + int qual_setting; + }; + + struct Adapter + { + D3DADAPTER_IDENTIFIER9 ident; + std::vector resolutions; + std::vector aa_levels; + bool supports_alpha_to_coverage; + }; + + const Adapter &GetAdapter(int i); + const Adapter &GetCurAdapter(); + int GetNumAdapters(); +} + +#endif \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoDX9/Src/D3DPostprocess.cpp b/Source/Plugins/Plugin_VideoDX9/Src/D3DPostprocess.cpp new file mode 100644 index 0000000000..722fd790c4 --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/D3DPostprocess.cpp @@ -0,0 +1,238 @@ +#include "Common.h" + +#include "D3DBase.h" +#include "D3DTexture.h" +#include "D3DUtil.h" + +#include "Globals.h" + +using namespace D3D; + +namespace Postprocess +{ + LPDIRECT3DSURFACE9 displayColorBuffer; + LPDIRECT3DSURFACE9 displayZStencilBuffer; + + LPDIRECT3DTEXTURE9 mainColorBufferTexture; + LPDIRECT3DSURFACE9 mainColorBuffer; + LPDIRECT3DSURFACE9 mainZStencilBuffer; + + const int numScratch = 2; + LPDIRECT3DTEXTURE9 scratch[numScratch]; + LPDIRECT3DSURFACE9 scratchSurface[numScratch]; + + const int mainWidth = 640, mainHeight=480; + const int scratchWidth = 256, scratchHeight=256; + + int displayWidth, displayHeight; + + bool initialized; + + int GetWidth() { + return initialized ? mainWidth : displayWidth; + } + + int GetHeight() { + return initialized ? mainHeight : displayHeight; + } + + + void CreateStuff() + { + mainColorBufferTexture = D3D::CreateRenderTarget(mainWidth,mainHeight); + mainColorBufferTexture->GetSurfaceLevel(0,&mainColorBuffer); + mainZStencilBuffer = D3D::CreateDepthStencilSurface(mainWidth,mainHeight); + + for (int i=0; iGetSurfaceLevel(0,&(scratchSurface[i])); + } + + initialized=true; + } + + void DestroyStuff() + { + SAFE_RELEASE(mainColorBuffer); + SAFE_RELEASE(mainColorBufferTexture); + SAFE_RELEASE(mainZStencilBuffer); + + for (int i=0; iGetRenderTarget(0,&displayColorBuffer); + dev->GetDepthStencilSurface(&displayZStencilBuffer); + + D3DSURFACE_DESC desc; + displayColorBuffer->GetDesc(&desc); + displayWidth = desc.Width; + displayHeight = desc.Height; + + if (g_Config.iPostprocessEffect) + CreateStuff(); + } + + void Cleanup() + { + DestroyStuff(); + SAFE_RELEASE(displayColorBuffer); + SAFE_RELEASE(displayZStencilBuffer); + } + + + void BeginFrame() + { + if (g_Config.iPostprocessEffect) + { + if (!initialized) + CreateStuff(); + dev->SetRenderTarget(0,mainColorBuffer); + dev->SetDepthStencilSurface(mainZStencilBuffer); + dev->SetRenderState(D3DRS_ZENABLE,TRUE); + dev->Clear(0,0,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,0,1,0); + } + else + { + if (initialized) + { + dev->SetRenderTarget(0,displayColorBuffer); + dev->SetDepthStencilSurface(displayZStencilBuffer); + DestroyStuff(); + } + dev->SetRenderState(D3DRS_ZENABLE,TRUE); + } + } + + + int filterKernel[8] = {0x40,0x80,0xc0,0xFF,0xFF,0xc0,0x80,0x40}; //goodlooking almostgaussian + + //int filterKernel[8] = {0xFF,0xc0,0x80,0x40,0x40,0x80,0xc0,0xFF,}; //crazy filter + + void NightGlow(bool intense, bool original) + { + dev->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_SUBTRACT); + + dev->SetRenderState(D3DRS_ALPHABLENDENABLE,TRUE); + dev->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_ONE); + dev->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_ONE); + + dev->SetDepthStencilSurface(0); + + dev->SetTexture(0,mainColorBufferTexture); + dev->SetRenderTarget(0,scratchSurface[0]); + dev->SetSamplerState(0,D3DSAMP_ADDRESSU,D3DTADDRESS_CLAMP); + dev->SetSamplerState(0,D3DSAMP_ADDRESSV,D3DTADDRESS_CLAMP); + dev->SetSamplerState(0,D3DSAMP_MAGFILTER,D3DTEXF_LINEAR); + dev->SetSamplerState(0,D3DSAMP_MINFILTER,D3DTEXF_LINEAR); + dev->SetSamplerState(0,D3DSAMP_MIPFILTER,D3DTEXF_LINEAR); + dev->Clear(0,0,D3DCLEAR_TARGET,0,0,0); + + POINT pt; + GetCursorPos(&pt); + + //dev->SetSamplerState(0,D3DSAMP_MIPMAPLODBIAS,1.0f); +#define QOFF(xoff,yoff,col) quad2d(-0.0f,-0.0f,scratchWidth-0.0f,scratchHeight-0.0f,col,0+xoff,0+yoff,1+xoff,1+yoff); + float f=0.008f; + QOFF(0,0,0xa0a0a0a0); + + dev->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_MODULATE); + + dev->SetTexture(0,scratch[0]); + dev->SetRenderTarget(0,scratchSurface[1]); + dev->Clear(0,0,D3DCLEAR_TARGET,0,0,0); + + float yMul = 1.33333333333f; + for (int i=0; i<8; i++) + { + DWORD c=filterKernel[i]/2; + c|=c<<8; + c|=c<<16; + QOFF(0,(i-3.5f) * f * yMul,c); + } + + dev->SetTexture(0,scratch[1]); + dev->SetRenderTarget(0,scratchSurface[0]); + dev->Clear(0,0,D3DCLEAR_TARGET,0,0,0); + for (int i=0; i<8; i++) + { + DWORD c=filterKernel[i]/(intense?3:2); + c|=c<<8; + c|=c<<16; + QOFF((i-3.5f) * f,0,c); + } + + dev->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_MODULATE); + + if (intense) + { + dev->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_ONE); + dev->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_SRCALPHA); + } + else + { + dev->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_INVDESTCOLOR); + dev->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_ONE); + } + + dev->SetTexture(0,scratch[0]); + dev->SetRenderTarget(0,mainColorBuffer); + quad2d(0,0,(float)mainWidth,(float)mainHeight,original?0xCFFFFFFF:0xFFFFFFFF,0,0,1,1); + dev->SetRenderState(D3DRS_ALPHABLENDENABLE,FALSE); + dev->SetSamplerState(0,D3DSAMP_ADDRESSU,D3DTADDRESS_WRAP); + dev->SetSamplerState(0,D3DSAMP_ADDRESSV,D3DTADDRESS_WRAP); + //dev->SetSamplerState(0,D3DSAMP_MIPMAPLODBIAS,0); + } + + const char **GetPostprocessingNames() + { + static const char *names[] = { + "None", + "Night Glow 1", + "Night Glow 2", + "Night Glow 3", + 0, + }; + return names; + } + + void FinalizeFrame() + { + if (initialized) + { + dev->SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE); + dev->SetRenderState(D3DRS_ZENABLE,FALSE); + dev->SetRenderState(D3DRS_FOGENABLE,FALSE); + dev->SetTextureStageState(0,D3DTSS_COLORARG1,D3DTA_TEXTURE); + dev->SetTextureStageState(0,D3DTSS_COLORARG2,D3DTA_DIFFUSE); + dev->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_MODULATE); + dev->SetTextureStageState(0,D3DTSS_ALPHAARG1,D3DTA_TEXTURE); + dev->SetTextureStageState(0,D3DTSS_ALPHAARG2,D3DTA_DIFFUSE); + dev->SetTextureStageState(0,D3DTSS_ALPHAOP,D3DTOP_SELECTARG2); + + switch(g_Config.iPostprocessEffect) { + case 1: + NightGlow(true,true); + case 2: + NightGlow(false,true); + break; + case 3: + NightGlow(false,false); + break; + } + + dev->SetRenderTarget(0,displayColorBuffer); + dev->SetDepthStencilSurface(displayZStencilBuffer); + dev->SetTexture(0,mainColorBufferTexture); + quad2d(0, 0, (float)displayWidth, (float)displayHeight, 0xFFFFFFFF); + } + } +} \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoDX9/Src/D3DPostprocess.h b/Source/Plugins/Plugin_VideoDX9/Src/D3DPostprocess.h new file mode 100644 index 0000000000..f7ce77453f --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/D3DPostprocess.h @@ -0,0 +1,16 @@ +#pragma once + +namespace Postprocess +{ + + void Initialize(); + void Cleanup(); + + void BeginFrame(); + void FinalizeFrame(); + + int GetWidth(); + int GetHeight(); + + const char **GetPostprocessingNames(); +} \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoDX9/Src/D3DShader.cpp b/Source/Plugins/Plugin_VideoDX9/Src/D3DShader.cpp new file mode 100644 index 0000000000..e71c4d5d2f --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/D3DShader.cpp @@ -0,0 +1,130 @@ +#include + +#include "Globals.h" +#include "D3DShader.h" + + +namespace D3D +{ + LPDIRECT3DVERTEXSHADER9 CompileVShader(const char *code, int len) + { + //try to compile + LPD3DXBUFFER shaderBuffer=0,errorBuffer=0; + LPDIRECT3DVERTEXSHADER9 vShader = 0; + HRESULT hr = D3DXCompileShader(code,len,0,0,"main","vs_1_1",0,&shaderBuffer,&errorBuffer,0); + if (FAILED(hr)) + { + //let's try 2.0 + hr = D3DXCompileShader(code,len,0,0,"main","vs_2_0",0,&shaderBuffer,&errorBuffer,0); + } + + if (FAILED(hr)) + { + //compilation error, damnit + if (g_Config.bShowShaderErrors) + MessageBox(0,(char*)errorBuffer->GetBufferPointer(),"VS compilation error",MB_ICONERROR); + vShader=0; + } + else if (SUCCEEDED(hr)) + { + //create it + HRESULT hr = E_FAIL; + if (shaderBuffer) + hr = D3D::dev->CreateVertexShader((DWORD *)shaderBuffer->GetBufferPointer(), &vShader); + if (FAILED(hr) || vShader == 0) + { + if (g_Config.bShowShaderErrors) + MessageBox(0,code,(char*)errorBuffer->GetBufferPointer(),MB_ICONERROR); + } + } + + //cleanup + if (shaderBuffer) + shaderBuffer->Release(); + if (errorBuffer) + errorBuffer->Release(); + + return vShader; + } + LPDIRECT3DVERTEXSHADER9 LoadVShader(const char *filename) + { + //alloc a temp buffer for code + char *temp = new char[65536]; + + //open and read the file + FILE *f = fopen(filename,"rb"); + if (!f) + { + MessageBox(0,"FATAL ERROR Vertex Shader file not found",filename,0); + return 0; + } + fseek(f,0,SEEK_END); + int len = ftell(f); + fseek(f,0,SEEK_SET); + fread(temp,len,1,f); + fclose(f); + LPDIRECT3DVERTEXSHADER9 vShader = CompileVShader(temp,len); + //kill off our temp code buffer + delete [] temp; + //return the compiled shader, or null + return vShader; + } + + LPDIRECT3DPIXELSHADER9 CompilePShader(const char *code, int len) + { + LPD3DXBUFFER shaderBuffer=0,errorBuffer=0; + LPDIRECT3DPIXELSHADER9 pShader = 0; + static char *versions[6] = {"ERROR","ps_1_1","ps_1_4","ps_2_0","ps_3_0","ps_4_0"}; + HRESULT hr = D3DXCompileShader(code,len,0,0, + "main","ps_2_0", // Pixel Shader 2.0 is enough for all we do + 0,&shaderBuffer,&errorBuffer,0); + + if (FAILED(hr)) + { + // We should not be getting these + MessageBox(0,code,(char*)errorBuffer->GetBufferPointer(),MB_ICONERROR); + + pShader=0; + } + else + { + //create it + HRESULT hr = D3D::dev->CreatePixelShader((DWORD *)shaderBuffer->GetBufferPointer(), &pShader); + if (FAILED(hr) || pShader == 0) + { + if (g_Config.bShowShaderErrors) + MessageBox(0,"damn","error creating pixelshader",MB_ICONERROR); + } + } + + //cleanup + if (shaderBuffer) + shaderBuffer->Release(); + if (errorBuffer) + errorBuffer->Release(); + + return pShader; + } + + LPDIRECT3DPIXELSHADER9 LoadPShader(const char *filename) + { + //open and read the file + FILE *f = fopen(filename,"rb"); + if (!f) + { + MessageBox(0,"FATAL ERROR Pixel Shader file not found",filename,0); + return 0; + } + fseek(f,0,SEEK_END); + int len = ftell(f); + char *temp = new char[len]; + fseek(f,0,SEEK_SET); + fread(temp,len,1,f); + fclose(f); + LPDIRECT3DPIXELSHADER9 pShader = CompilePShader(temp,len); + //kill off our temp code buffer + delete [] temp; + //return the compiled shader, or null + return pShader; + } +} diff --git a/Source/Plugins/Plugin_VideoDX9/Src/D3DShader.h b/Source/Plugins/Plugin_VideoDX9/Src/D3DShader.h new file mode 100644 index 0000000000..adedeec47d --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/D3DShader.h @@ -0,0 +1,11 @@ +#pragma once + +#include "D3DBase.h" + +namespace D3D +{ + LPDIRECT3DVERTEXSHADER9 CompileVShader(const char *code, int len); + LPDIRECT3DVERTEXSHADER9 LoadVShader(const char *filename); + LPDIRECT3DPIXELSHADER9 CompilePShader(const char *code, int len); + LPDIRECT3DPIXELSHADER9 LoadPShader(const char *filename); +} \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoDX9/Src/D3DTexture.cpp b/Source/Plugins/Plugin_VideoDX9/Src/D3DTexture.cpp new file mode 100644 index 0000000000..0d105f43b6 --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/D3DTexture.cpp @@ -0,0 +1,98 @@ +#include "D3DBase.h" +#include "D3DTexture.h" + +namespace D3D +{ + LPDIRECT3DTEXTURE9 CreateTexture2D(const BYTE* buffer, const int width, const int height,const int pitch, D3DFORMAT fmt) + { + DWORD *pBuffer = (DWORD *)buffer; + LPDIRECT3DTEXTURE9 pTexture; + + // crazy bitmagic + bool isPow2 = !((width&(width-1)) || (height&(height-1))); + + HRESULT hr; + // TODO(ector): allow mipmaps for non-pow textures on newer cards? + if (!isPow2) + hr = dev->CreateTexture(width, height, 1, 0, fmt, D3DPOOL_MANAGED, &pTexture, NULL); + else + hr = dev->CreateTexture(width, height, 0, D3DUSAGE_AUTOGENMIPMAP, fmt, D3DPOOL_MANAGED, &pTexture, NULL); + + if(FAILED(hr)) + return 0; + + int level = 0; + + D3DLOCKED_RECT Lock; + pTexture->LockRect(level, &Lock, NULL, 0 ); + + DWORD* pIn = pBuffer; + switch(fmt) + { + case D3DFMT_A8R8G8B8: + { + for (int y = 0; y < height; y++) + { + DWORD* pBits = (DWORD*)((BYTE*)Lock.pBits + (y * Lock.Pitch)); + memcpy(pBits,pIn, width * 4); + pIn += pitch; + } + } + break; + case D3DFMT_DXT1: + memcpy(Lock.pBits,buffer,(width/4)*(height/4)*8); + break; + } + pTexture->UnlockRect(level); + return pTexture; + } + + void ReplaceTexture2D(LPDIRECT3DTEXTURE9 pTexture, const BYTE* buffer, const int width, const int height,const int pitch, D3DFORMAT fmt) + { + DWORD *pBuffer = (DWORD *)buffer; + int level=0; + D3DLOCKED_RECT Lock; + pTexture->LockRect(level, &Lock, NULL, 0 ); + DWORD* pIn = pBuffer; + switch(fmt) + { + case D3DFMT_A8R8G8B8: + { + for (int y = 0; y < height; y++) + { + DWORD* pBits = (DWORD*)((BYTE*)Lock.pBits + (y * Lock.Pitch)); + memcpy(pBits,pIn, width*4); + pIn += pitch; + } + } + break; + case D3DFMT_DXT1: + memcpy(Lock.pBits,buffer,(width/4)*(height/4)*8); + break; + } + pTexture->UnlockRect(level); + } + + LPDIRECT3DTEXTURE9 CreateRenderTarget(const int width, const int height) + { + LPDIRECT3DTEXTURE9 tex; + HRESULT hr = dev->CreateTexture(width,height,0,D3DUSAGE_RENDERTARGET | D3DUSAGE_AUTOGENMIPMAP,D3DFMT_A8R8G8B8,D3DPOOL_DEFAULT,&tex,NULL); + + if (FAILED(hr)) + return 0; + else + return tex; + } + + LPDIRECT3DSURFACE9 CreateDepthStencilSurface(const int width, const int height) + { + LPDIRECT3DSURFACE9 surf; + HRESULT hr = dev->CreateDepthStencilSurface(width,height,D3DFMT_D24S8,D3DMULTISAMPLE_NONE,0,0,&surf,0); + + if (FAILED(hr)) + return 0; + else + return surf; + + } +} diff --git a/Source/Plugins/Plugin_VideoDX9/Src/D3DTexture.h b/Source/Plugins/Plugin_VideoDX9/Src/D3DTexture.h new file mode 100644 index 0000000000..6049f557b2 --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/D3DTexture.h @@ -0,0 +1,18 @@ +#pragma once + +#include "D3DBase.h" + +namespace D3D +{ + ////////////////////////////////////////////////////////////////////////// + //Simple box filter mipmap generator: should in theory be replaced with say a + //gaussian or something, but even this makes textures look great, especially + //with anisotropic filtering enabled + void FilterDown(DWORD *buffer, int w, int h, const int pitch); + // __________________________________________________________________________________________________ + // calls filterdown which will trash _pBuffer as temp storage for mips + LPDIRECT3DTEXTURE9 CreateTexture2D(const BYTE* buffer, const int width, const int height, const int pitch, D3DFORMAT fmt = D3DFMT_A8R8G8B8); + void ReplaceTexture2D(LPDIRECT3DTEXTURE9 pTexture, const BYTE* buffer, const int width, const int height,const int pitch, D3DFORMAT fmt); + LPDIRECT3DTEXTURE9 CreateRenderTarget(const int width, const int height); + LPDIRECT3DSURFACE9 CreateDepthStencilSurface(const int width, const int height); +} \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoDX9/Src/D3DUtil.cpp b/Source/Plugins/Plugin_VideoDX9/Src/D3DUtil.cpp new file mode 100644 index 0000000000..10129b3240 --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/D3DUtil.cpp @@ -0,0 +1,316 @@ +#include "Common.h" + +#include "D3DBase.h" +#include "D3DUtil.h" + +namespace D3D +{ + CD3DFont font; + +#define MAX_NUM_VERTICES 50*6 + struct FONT2DVERTEX { + float x,y,z; + float rhw; + int color; + float tu, tv; + }; + +#define D3DFVF_FONT2DVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE|D3DFVF_TEX1) +#define D3DFVF_FONT3DVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE|D3DFVF_NORMAL|D3DFVF_TEX1) + + inline FONT2DVERTEX InitFont2DVertex( float x, float y, DWORD color, float tu, float tv ) + { + FONT2DVERTEX v; v.x=x; v.y=y; v.z=0; v.rhw=1.0f; v.color = color; v.tu = tu; v.tv = tv; + return v; + } + + CD3DFont::CD3DFont() + { + m_pTexture = NULL; + m_pVB = NULL; + } + + const int RS[6][2] = + { + { D3DRS_ALPHABLENDENABLE, TRUE }, + { D3DRS_SRCBLEND, D3DBLEND_SRCALPHA }, + { D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA }, + { D3DRS_CULLMODE, D3DCULL_NONE }, + { D3DRS_ZENABLE, FALSE }, + { D3DRS_FOGENABLE, FALSE }, + }; + const int TS[6][2] = + { + {D3DTSS_COLOROP, D3DTOP_MODULATE}, + {D3DTSS_COLORARG1, D3DTA_TEXTURE}, + {D3DTSS_COLORARG2, D3DTA_DIFFUSE }, + {D3DTSS_ALPHAOP, D3DTOP_MODULATE }, + {D3DTSS_ALPHAARG1, D3DTA_TEXTURE }, + {D3DTSS_ALPHAARG2, D3DTA_DIFFUSE }, + }; + + enum {m_dwTexWidth=512, m_dwTexHeight = 512}; + + int CD3DFont::Init() + { + int hr; + m_fTextScale = 1.0f; // Draw fonts into texture without scaling + // Create a new texture for the font + hr = dev->CreateTexture( m_dwTexWidth, m_dwTexHeight, 1, 0, D3DFMT_A4R4G4B4, D3DPOOL_MANAGED, &m_pTexture, NULL ); + if( FAILED(hr) ) + return hr; + + // Prepare to create a bitmap + int *pBitmapBits; + BITMAPINFO bmi; + ZeroMemory( &bmi.bmiHeader, sizeof(BITMAPINFOHEADER) ); + bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + bmi.bmiHeader.biWidth = (int)m_dwTexWidth; + bmi.bmiHeader.biHeight = -(int)m_dwTexHeight; + bmi.bmiHeader.biPlanes = 1; + bmi.bmiHeader.biCompression = BI_RGB; + bmi.bmiHeader.biBitCount = 32; + + // Create a DC and a bitmap for the font + HDC hDC = CreateCompatibleDC( NULL ); + HBITMAP hbmBitmap = CreateDIBSection( hDC, &bmi, DIB_RGB_COLORS, + (VOID**)&pBitmapBits, NULL, 0 ); + SetMapMode( hDC, MM_TEXT ); + + // Create a font. By specifying ANTIALIASED_QUALITY, we might get an + // antialiased font, but this is not guaranteed. + // We definitely don't want to get it cleartype'd, anyway. + int m_dwFontHeight = 36; + + INT nHeight = -MulDiv( m_dwFontHeight, (INT)(GetDeviceCaps(hDC, LOGPIXELSY) * m_fTextScale), 72 ); + int dwBold = FW_NORMAL; ///FW_BOLD + HFONT hFont = CreateFont( nHeight, 0, 0, 0, dwBold, 0, + FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, + CLIP_DEFAULT_PRECIS, ANTIALIASED_QUALITY, + VARIABLE_PITCH, "Tahoma"); + + if (NULL == hFont) + return E_FAIL; + + HGDIOBJ hOldbmBitmap = SelectObject( hDC, hbmBitmap ); + HGDIOBJ hOldFont = SelectObject( hDC, hFont ); + + // Set text properties + SetTextColor( hDC, 0xFFFFFF ); + SetBkColor ( hDC, 0 ); + SetTextAlign( hDC, TA_TOP ); + + // Loop through all printable character and output them to the bitmap.. + // Meanwhile, keep track of the corresponding tex coords for each character. + int x = 0, y = 0; + + char str[2] = "\0"; + SIZE size; + + for( char c=0; c<127-32; c++ ) + { + str[0] = c+32; + GetTextExtentPoint32( hDC, str, 1, &size ); + + if( (int)(x+size.cx+1) > m_dwTexWidth ) + { + x = 0; + y += size.cy+1; + } + + ExtTextOut( hDC, x+1, y+0, ETO_OPAQUE | ETO_CLIPPED, NULL, str, 1, NULL ); + + m_fTexCoords[c][0] = ((float)(x+0))/m_dwTexWidth; + m_fTexCoords[c][1] = ((float)(y+0))/m_dwTexHeight; + m_fTexCoords[c][2] = ((float)(x+0+size.cx))/m_dwTexWidth; + m_fTexCoords[c][3] = ((float)(y+0+size.cy))/m_dwTexHeight; + + x += size.cx+3; //3 to avoid annoying ij conflict (part of the j ends up with the i) + } + + // Lock the surface and write the alpha values for the set pixels + D3DLOCKED_RECT d3dlr; + m_pTexture->LockRect( 0, &d3dlr, 0, 0 ); + unsigned short* pDst16 = (unsigned short*)d3dlr.pBits; + int bAlpha; // 4-bit measure of pixel intensity + + for( y=0; y < m_dwTexHeight; y++ ) + { + for( x=0; x < m_dwTexWidth; x++ ) + { + bAlpha = ((pBitmapBits[m_dwTexWidth*y + x] & 0xff) >> 4); + *pDst16++ = (bAlpha << 12) | 0x0fff; + } + } + + // Done updating texture, so clean up used objects + m_pTexture->UnlockRect(0); + + SelectObject( hDC, hOldbmBitmap ); + DeleteObject( hbmBitmap ); + + SelectObject( hDC, hOldFont ); + DeleteObject( hFont ); + + // Create vertex buffer for the letters + if( FAILED( hr = dev->CreateVertexBuffer( MAX_NUM_VERTICES*sizeof(FONT2DVERTEX), + D3DUSAGE_WRITEONLY | D3DUSAGE_DYNAMIC, 0, + D3DPOOL_DEFAULT, &m_pVB,NULL ) ) ) + { + return hr; + } + + return S_OK; + } + + int CD3DFont::Shutdown() + { + SAFE_RELEASE( m_pVB ); + SAFE_RELEASE( m_pTexture ); + + return S_OK; + } + + void CD3DFont::SetRenderStates() + { + for (int i=0; i<6; i++) + dev->SetRenderState((_D3DRENDERSTATETYPE)RS[i][0],RS[i][1]); + for (int i=0; i<6; i++) + dev->SetTextureStageState(0,(_D3DTEXTURESTAGESTATETYPE)int(TS[i][0]),TS[i][1]); + } + + int CD3DFont::DrawTextScaled( float x, float y, float fXScale, float fYScale, float spacing, int dwColor, const char* strText, bool center ) + { + SetRenderStates(); + dev->SetTexture( 0, m_pTexture ); + dev->SetPixelShader(0); + dev->SetVertexShader(0); + dev->SetVertexDeclaration(0); + dev->SetFVF( D3DFVF_FONT2DVERTEX ); + dev->SetStreamSource( 0, m_pVB, 0, sizeof(FONT2DVERTEX) ); + + float vpWidth = 1; + float vpHeight = 1; + + float sx = x*vpWidth-0.5f; + float sy = y*vpHeight-0.5f; + + float fStartX = sx; + + float invLineHeight = 1.0f / (( m_fTexCoords[0][3] - m_fTexCoords[0][1] ) * m_dwTexHeight); + // Fill vertex buffer + FONT2DVERTEX* pVertices; + int dwNumTriangles = 0L; + m_pVB->Lock( 0, 0, (void**)&pVertices, D3DLOCK_DISCARD ); + + const char *oldstrText=strText; + //First, let's measure the text + float tw=0; + float mx=0; + float maxx=0; + + while( *strText ) + { + char c = *strText++; + + if( c == ('\n') ) + mx=0; + if( c < (' ') ) + continue; + + float tx1 = m_fTexCoords[c-32][0]; + float tx2 = m_fTexCoords[c-32][2]; + + float w = (tx2-tx1)*m_dwTexWidth; + w *= (fXScale*vpHeight)*invLineHeight; + mx += w + spacing*fXScale*vpWidth; + if (mx>maxx) maxx=mx; + } + + float offset=-maxx/2; + strText=oldstrText; + //Then let's draw it + if (center) + { + sx+=offset; + fStartX+=offset; + } + + float wScale=(fXScale*vpHeight)*invLineHeight; + float hScale=(fYScale*vpHeight)*invLineHeight; + + while( *strText ) + { + char c = *strText++; + + if( c == ('\n') ) + { + sx = fStartX; + sy += fYScale*vpHeight; + } + if( c < (' ') ) + continue; + + c-=32; + float tx1 = m_fTexCoords[c][0]; + float ty1 = m_fTexCoords[c][1]; + float tx2 = m_fTexCoords[c][2]; + float ty2 = m_fTexCoords[c][3]; + + float w = (tx2-tx1)*m_dwTexWidth; + float h = (ty2-ty1)*m_dwTexHeight; + + w *= wScale; + h *= hScale; + + + FONT2DVERTEX v[6]; + v[0]=InitFont2DVertex(sx, sy+h, dwColor, tx1, ty2); + v[1]=InitFont2DVertex(sx, sy, dwColor, tx1, ty1); + v[2]=InitFont2DVertex(sx+w, sy+h, dwColor, tx2, ty2); + v[3]=InitFont2DVertex(sx+w, sy, dwColor, tx2, ty1); + v[4]=v[2]; + v[5]=v[1]; + + memcpy(pVertices,v,6*sizeof(FONT2DVERTEX)); + + pVertices+=6; + dwNumTriangles += 2; + + if( dwNumTriangles*3 > (MAX_NUM_VERTICES-6) ) + { + // Unlock, render, and relock the vertex buffer + m_pVB->Unlock(); + dev->DrawPrimitive( D3DPT_TRIANGLELIST, 0, dwNumTriangles ); + m_pVB->Lock( 0, 0, (void**)&pVertices, D3DLOCK_DISCARD ); + dwNumTriangles = 0; + } + + sx += w + spacing*fXScale*vpWidth; + } + + // Unlock and render the vertex buffer + m_pVB->Unlock(); + if( dwNumTriangles > 0 ) + dev->DrawPrimitive( D3DPT_TRIANGLELIST, 0, dwNumTriangles ); + + dev->SetRenderState(D3DRS_ZENABLE,TRUE); + return S_OK; + } + + void quad2d(float x1, float y1, float x2, float y2, DWORD color, float u1, float v1, float u2, float v2) + { + struct Q2DVertex { float x,y,z,rhw; int color; float u, v; } coords[4] = { + {x1-0.5f, y1-0.5f, 0, 1, color, u1, v1}, + {x2-0.5f, y1-0.5f, 0, 1, color, u2, v1}, + {x2-0.5f, y2-0.5f, 0, 1, color, u2, v2}, + {x1-0.5f, y2-0.5f, 0, 1, color, u1, v2}, + }; + dev->SetPixelShader(0); + dev->SetVertexShader(0); + dev->SetVertexDeclaration(0); + dev->SetFVF(D3DFVF_XYZRHW|D3DFVF_DIFFUSE|D3DFVF_TEX1); + dev->DrawPrimitiveUP(D3DPT_TRIANGLEFAN,2,coords,sizeof(Q2DVertex)); + } + +} diff --git a/Source/Plugins/Plugin_VideoDX9/Src/D3DUtil.h b/Source/Plugins/Plugin_VideoDX9/Src/D3DUtil.h new file mode 100644 index 0000000000..00ab47b64a --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/D3DUtil.h @@ -0,0 +1,44 @@ +#pragma once + +#include "D3DBase.h" + +namespace D3D +{ + // Font creation flags + #define D3DFONT_BOLD 0x0001 + #define D3DFONT_ITALIC 0x0002 + + // Font rendering flags + #define D3DFONT_CENTERED 0x0001 + + //a cut-down variant of the DXSDK CD3DFont class + class CD3DFont + { + LPDIRECT3DTEXTURE9 m_pTexture; // The d3d texture for this font + LPDIRECT3DVERTEXBUFFER9 m_pVB; // VertexBuffer for rendering text + //int m_dwTexWidth; // Texture dimensions + //int m_dwTexHeight; + float m_fTextScale; + float m_fTexCoords[128-32][4]; + + public: + CD3DFont(); + // 2D (no longer 3D) text drawing function + // Initializing and destroying device-dependent objects + void SetRenderStates(); + int Init(); + int Shutdown(); + int DrawTextScaled( float x, float y, + float fXScale, float fYScale, + float spacing, int dwColor, + const char* strText, bool center=true ); + + + // Constructor / destructor + //~CD3DFont(); + }; + + extern CD3DFont font; + + void quad2d(float x1, float y1, float x2, float y2, DWORD color, float u1=0, float v1=0, float u2=1, float v2=1); +} diff --git a/Source/Plugins/Plugin_VideoDX9/Src/DLCompiler.cpp b/Source/Plugins/Plugin_VideoDX9/Src/DLCompiler.cpp new file mode 100644 index 0000000000..054e2c1291 --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/DLCompiler.cpp @@ -0,0 +1,468 @@ +#include "stdafx.h" + +#if 0 + +#include "OpcodeDecoding.h" +#include "VertexLoader.h" +#include "VertexHandler.h" +#include "DataReader.h" +#include "BPStructs.h" +#include "CPStructs.h" +#include "XFStructs.h" +#include "DLCompiler.h" +#include "x86.h" +#include "main.h" +#include "Utils.h" + +CompiledDList::CompiledDList(u32 _addr, u32 _size) +{ + dataSize = 0; + data = 0; + code = 0; + addr = _addr; + size = _size; + pass = 0; + numBatches = 0; + batches = 0; +} + +CompiledDList::~CompiledDList() +{ + if (data) + delete [] data; + if (code) + delete [] code; + if (batches) + delete [] batches; +} + + +bool CompiledDList::Call() +{ + switch(pass) { + case 0: // First compiling pass : find data size + if (Pass1()) + { + pass = 1; + return true; + } + else + return false; + case 1: // Second compiling pass : actually compile + //if pass1 succeeded, pass2 will too + Pass2(); + pass = 2; + return true; + case 2: // Run pass - we have a compiled dlist, just call it + Run(); + return true; + default: + //ERROR + return false; + } +} + + +bool CompiledDList::Pass1() +{ +/* //find the size of code + data, if the dlist is worth recompiling etc + // at the same time, do the ordinary stuff + g_pDataReader = &dlistReader; + OpcodeReaders::SetDListReader(addr, addr+size); + dataSize = 0; + codeSize = 0; + numBatches = 0; + bool lastIsPrim = false; + while (OpcodeReaders::IsDListOKToRead()) + { + int Cmd = g_pDataReader->Read8(); + switch(Cmd) + { + case GX_LOAD_CP_REG: //0x08 + { + u32 SubCmd = g_pDataReader->Read8(); + u32 Value = g_pDataReader->Read32(); + LoadCPReg(SubCmd,Value); + //COMPILER + codeSize+=13; + } + break; + + case GX_LOAD_XF_REG: + { + u32 Cmd2 = g_pDataReader->Read32(); + int dwTransferSize = ((Cmd2>>16)&15) + 1; + DWORD dwAddress = Cmd2 & 0xFFFF; + static u32 pData[16]; + for (int i=0; iRead32(); + LoadXFReg(dwTransferSize,dwAddress,pData); + //COMPILER + dataSize+=dwTransferSize; + codeSize+=17; + } + break; + + case GX_LOAD_BP_REG: //0x61 + { + u32 cmd=g_pDataReader->Read32(); + LoadBPReg(cmd); + codeSize+=9; + } + break; + + case GX_LOAD_INDX_A: //used for position matrices + LoadIndexedXF(g_pDataReader->Read32(),0xC); + codeSize+=13; + break; + case GX_LOAD_INDX_B: //used for normal matrices + LoadIndexedXF(g_pDataReader->Read32(),0xD); + codeSize+=13; + break; + case GX_LOAD_INDX_C: //used for postmatrices + LoadIndexedXF(g_pDataReader->Read32(),0xE); + codeSize+=13; + break; + case GX_LOAD_INDX_D: //used for lights + LoadIndexedXF(g_pDataReader->Read32(),0xF); + codeSize+=13; + break; + + case GX_CMD_CALL_DL: + MessageBox(0,"Display lists can't recurse!!","error",0); + break; + + case GX_CMD_INVL_VC:// Invalidate (vertex cache?) + break; + case GX_NOP: + break; + default: + if (Cmd&0x80) + { + int primitive = (Cmd&GX_PRIMITIVE_MASK) >> GX_PRIMITIVE_SHIFT; + if (lastIsPrim) + { + //join to last + } + else + { + //finish up last and commit + } + u16 numVertices = g_pDataReader->Read16(); + tempvarray.Reset(); + VertexLoader::SetVArray(&tempvarray); + VertexLoader *loader = &VertexLoader[Cmd&GX_VAT_MASK]; + loader->Setup(); + loader->PrepareRun(); + int vsize = loader->GetVertexSize(); + loader->RunVertices(numVertices); + CVertexHandler::DrawVertices(primitive, numVertices, &tempvarray); + CVertexHandler::Flush(); + //COMPILER + codeSize+=21; + numBatches++; + lastIsPrim = true; + } + break; + } + } + if (lastIsPrim) + { + //finish up last and commit + } + codeSize*=2;*/ + return true; +} + + +void CompiledDList::Pass2() +{ +/* OpcodeReaders::SetDListReader(addr, addr+size); + + data = new u32[dataSize]; + code = new u8[codeSize]; //at least + + batches = new Batch[numBatches]; + int batchCount = 0; + u32 *dataptr = data; + + x86Init(); + x86SetPtr((s8*)code); + //WC8(0xCC); + + //actually do the recompiling, emit code and data, protect the memory + // but again, at the same time do the ordinary stuff + // so the compiled display list won't be run until the third time actually + bool dump = false,lastIsGeom=false; + FILE *f; + +#ifndef TEASER + if (dump) + { + f=fopen("D:\\dlistlogs.txt","a"); + fprintf(f,"===========================================\n"); + } +#endif + + while (OpcodeReaders::IsDListOKToRead()) + { + int Cmd = g_pDataReader->Read8(); + switch(Cmd) + { + case GX_LOAD_CP_REG: //0x08 + { + lastIsGeom = false; + u32 SubCmd = g_pDataReader->Read8(); + u32 Value = g_pDataReader->Read32(); + if (dump) + fprintf(f,"CP | %02x %08x\n",SubCmd,Value); + + LoadCPReg(SubCmd,Value); + //COMPILER + PUSH_WordToStack(Value); + PUSH_WordToStack(SubCmd); + CALLFunc((u32)LoadCPReg); + } + break; + + case GX_LOAD_XF_REG: + { + lastIsGeom = false; + u32 Cmd2 = g_pDataReader->Read32(); + int dwTransferSize = ((Cmd2>>16)&15) + 1; + u32 dwAddress = Cmd2 & 0xFFFF; + static u32 pData[16]; + + u32 *oldDataPtr = dataptr; + + if (dump) + { + fprintf(f,"XF | %01xx %04x\n",dwTransferSize,dwAddress); + for (int i=0; iRead32(); + + + LoadXFReg(dwTransferSize,dwAddress,oldDataPtr); + + //COMPILER + PUSH_WordToStack((u32)oldDataPtr); + PUSH_WordToStack(dwAddress); + PUSH_WordToStack(dwTransferSize); + CALLFunc((u32)LoadXFReg); + } + break; + + case GX_LOAD_BP_REG: //0x61 + { + lastIsGeom = false; + u32 cmd=g_pDataReader->Read32(); + if (dump) + fprintf(f,"BP | %08x\n",cmd); + + LoadBPReg(cmd); + //COMPILER + PUSH_WordToStack(cmd); + CALLFunc((u32)LoadBPReg); + } + break; + + case GX_LOAD_INDX_A: //usually used for position matrices + { + lastIsGeom = false; + u32 value = g_pDataReader->Read32(); + LoadIndexedXF(value,0xC); + //COMPILER + PUSH_WordToStack(0xC); + PUSH_WordToStack(value); + CALLFunc((u32)LoadIndexedXF); + if (dump) + fprintf(f,"LOADINDEXA | pos matrix\n"); + } + break; + case GX_LOAD_INDX_B: //usually used for normal matrices + { + lastIsGeom = false; + u32 value = g_pDataReader->Read32(); + LoadIndexedXF(value,0xD); + //COMPILER + PUSH_WordToStack(0xD); + PUSH_WordToStack(value); + CALLFunc((u32)LoadIndexedXF); + if (dump) + fprintf(f,"LOADINDEXB | nrm matrix\n"); + } + break; + case GX_LOAD_INDX_C: //usually used for postmatrices + { + lastIsGeom = false; + u32 value = g_pDataReader->Read32(); + LoadIndexedXF(value,0xE); + //COMPILER + PUSH_WordToStack(0xE); + PUSH_WordToStack(value); + CALLFunc((u32)LoadIndexedXF); + if (dump) + fprintf(f,"LOADINDEXC | post matrix\n"); + } + break; + case GX_LOAD_INDX_D: //usually used for lights + { + lastIsGeom = false; + u32 value = g_pDataReader->Read32(); + LoadIndexedXF(value,0xF); + //COMPILER + PUSH_WordToStack(0xF); + PUSH_WordToStack(value); + CALLFunc((u32)LoadIndexedXF); + if (dump) + fprintf(f,"LOADINDEXD | light\n"); + } + break; + case GX_CMD_CALL_DL: + // ERORRR + break; + + case GX_CMD_INVL_VC:// Invalidate (vertex cache?) + if (dump) + fprintf(f,"invalidate vc\n"); + break; + case GX_NOP: + if (dump) + fprintf(f,"nop\n"); + break; + default: + if (Cmd&0x80) + { + int primitive = (Cmd&GX_PRIMITIVE_MASK) >> GX_PRIMITIVE_SHIFT; + //if (lastIsGeom) INCSTAT(stats.numJoins); + u16 numVertices = g_pDataReader->Read16(); + if (dump) + fprintf(f,"DP: prim=%02x numv=%i\n",primitive,numVertices); + DecodedVArray &va = batches[batchCount].varray; + + VertexLoader *loader = &VertexLoader[Cmd&GX_VAT_MASK]; + TVtxDesc &vd = loader->GetVtxDesc(); + + VertexLoader::SetVArray(&va); + loader->Setup(); + loader->PrepareRun(); +// va.numColors = loader->GetNumColors(); +// va.numUVs = loader->GetNumTCs(); +// va.numNormals = loader->GetNumNormals(); + //va.num + va.Create(numVertices,vd.PosMatIdx, + vd.Tex0MatIdx+vd.Tex1MatIdx+vd.Tex2MatIdx+vd.Tex3MatIdx+ + vd.Tex4MatIdx+vd.Tex5MatIdx+vd.Tex6MatIdx+vd.Tex7MatIdx, + va.numNormals, va.numColors, va.numTCs); + + int vsize = loader->GetVertexSize(); + loader->RunVertices(numVertices); + CVertexHandler::DrawVertices(primitive, numVertices, &va); + CVertexHandler::Flush(); + // YES we have now filled our varray + //LETS COMPILE + PUSH_WordToStack(primitive); + PUSH_WordToStack(batchCount); + PUSH_WordToStack((u32)this); + CALLFunc((u32)DrawHelperHelper); + batchCount++; + lastIsGeom = true; + if (dump) + fprintf(f,"DRAW PRIMITIVE: prim=%02x numv=%i\n",primitive,numVertices); + } + break; + } + } + if (dump) + { + fprintf(f,"***************************************\n\n\n"); + } + RET(); + if (dump) + fclose(f);*/ + //we're done, next time just kick the compiled list off, much much faster than interpreting! +} + +void CompiledDList::DrawHelperHelper(CompiledDList *dl, int vno, int prim) +{ + Batch &b = dl->batches[vno]; + CVertexHandler::DrawVertices(prim, b.varray.GetSize(), &b.varray); +} + +void CompiledDList::Run() +{ + //run the code + ((void (*)())(code))(); + CVertexHandler::Flush(); +} + +DListCache::DLCache DListCache::dlists; + + + +void DListCache::Init() +{ + +} + + +void DListCache::Shutdown() +{ + DLCache::iterator iter = dlists.begin(); + for (;iter!=dlists.end();iter++) + iter->second.Destroy(); + dlists.clear(); +} + + +void DListCache::Call(u32 _addr, u32 _size) +{ + DLCache::iterator iter; + iter = dlists.find(_addr); + + if (iter != dlists.end()) + { + if (iter->second.size == _size) + { + iter->second.dlist->Call(); + return; + } + else // wrong size, need to recompile + { + iter->second.Destroy(); + iter=dlists.erase(iter); + } + } + + //Make an entry in the table + DLCacheEntry entry; + entry.dlist = new CompiledDList(_addr, _size); + entry.dlist->Call(); + entry.frameCount = frameCount; + entry.size = _size; + dlists[_addr] = entry; + + INCSTAT(stats.numDListsCreated); + SETSTAT(stats.numDListsAlive,(int)dlists.size()); +} + +void DListCache::Cleanup() +{ + for (DLCache::iterator iter=dlists.begin(); iter!=dlists.end();iter++) + { + DLCacheEntry &entry = iter->second; + if (entry.frameCount + + +class CompiledDList +{ + u32 *data; + int dataSize; + int pass; + int codeSize; + u8 *code; + + struct Batch + { + DecodedVArray varray; + LPDIRECT3DINDEXBUFFER9 ibuffer; + int numDraws; + }; + Batch *batches; + int numBatches; + + u32 addr, size; + bool Compile(); + bool Pass1(); + void Pass2(); + void Run(); + +public: + CompiledDList(u32 _addr, u32 _size); + ~CompiledDList(); + bool Call(); + static void DrawHelperHelper(CompiledDList *dl, int vno, int prim); +}; + +class DListCache +{ + struct DLCacheEntry + { + CompiledDList *dlist; + int frameCount; + int pass; + u32 size; + DLCacheEntry() + { + pass=0; + dlist=0; + frameCount=0; + } + void Destroy() + { + if (dlist) + delete dlist; + } + }; + + typedef std::map DLCache; + + static DLCache dlists; + +public: + static void Init(); + static void Cleanup(); + static void Shutdown(); + static void Call(u32 _addr, u32 _size); +}; + +#endif \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoDX9/Src/DataReader.cpp b/Source/Plugins/Plugin_VideoDX9/Src/DataReader.cpp new file mode 100644 index 0000000000..0bed49718f --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/DataReader.cpp @@ -0,0 +1,74 @@ +#include + +#include "Utils.h" +#include "Common.h" +#include "main.h" +#include "DataReader.h" + +// ================================================================================================= +// CDataReader_Fifo +// ================================================================================================= + +IDataReader* g_pDataReader = NULL; +extern u8 FAKE_ReadFifo8(); +extern u16 FAKE_ReadFifo16(); +extern u32 FAKE_ReadFifo32(); + +CDataReader_Fifo::CDataReader_Fifo(void) +{ + m_szName = "CDataReader_Fifo"; +} + +u8 CDataReader_Fifo::Read8(void) +{ + return FAKE_ReadFifo8(); +}; + +u16 CDataReader_Fifo::Read16(void) +{ + return FAKE_ReadFifo16(); +}; + +u32 CDataReader_Fifo::Read32(void) +{ + return FAKE_ReadFifo32(); +}; + +// ================================================================================================= +// CDataReader_Memory +// ================================================================================================= + +CDataReader_Memory::CDataReader_Memory(u32 _uAddress) : + m_uReadAddress(_uAddress) +{ +// F|RES: this wont work anymore caused by Mem2 + +// m_pMemory = g_VideoInitialize.pGetMemoryPointer(0x00); + m_szName = "CDataReader_Memory"; +} + +u32 CDataReader_Memory::GetReadAddress(void) +{ + return m_uReadAddress; +} + +u8 CDataReader_Memory::Read8(void) +{ + u8 tmp = Memory_Read_U8(m_uReadAddress); //m_pMemory[m_uReadAddress]; + m_uReadAddress++; + return tmp; +} + +u16 CDataReader_Memory::Read16(void) +{ + u16 tmp = Memory_Read_U16(m_uReadAddress); //_byteswap_ushort(*(u16*)&m_pMemory[m_uReadAddress]); + m_uReadAddress += 2; + return tmp; +} + +u32 CDataReader_Memory::Read32(void) +{ + u32 tmp =Memory_Read_U32(m_uReadAddress); // _byteswap_ulong(*(u32*)&m_pMemory[m_uReadAddress]); + m_uReadAddress += 4; + return tmp; +} \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoDX9/Src/DataReader.h b/Source/Plugins/Plugin_VideoDX9/Src/DataReader.h new file mode 100644 index 0000000000..353679f56f --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/DataReader.h @@ -0,0 +1,59 @@ +#ifndef _DATAREADER_H +#define _DATAREADER_H + +// ================================================================================================= +// IDataReader +// ================================================================================================= + +class IDataReader +{ +protected: + const char *m_szName; + +public: + virtual u8 Read8 (void) = NULL; + virtual u16 Read16(void) = NULL; + virtual u32 Read32(void) = NULL; +}; + +// ================================================================================================= +// CDataReader_Fifo +// ================================================================================================= + +class CDataReader_Fifo : public IDataReader +{ +private: + +public: + CDataReader_Fifo(void); + + virtual u8 Read8(void); + virtual u16 Read16(void); + virtual u32 Read32(void); +}; + +// ================================================================================================= +// CDataReader_Memory +// ================================================================================================= + +class CDataReader_Memory : public IDataReader +{ +private: + +// u8* m_pMemory; + u32 m_uReadAddress; + +public: + + CDataReader_Memory(u32 _uAddress); + + u32 GetReadAddress(void); + + virtual u8 Read8(void); + virtual u16 Read16(void); + virtual u32 Read32(void); +}; + +extern IDataReader* g_pDataReader; + +#endif diff --git a/Source/Plugins/Plugin_VideoDX9/Src/DecodedVArray.cpp b/Source/Plugins/Plugin_VideoDX9/Src/DecodedVArray.cpp new file mode 100644 index 0000000000..7ee5d16634 --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/DecodedVArray.cpp @@ -0,0 +1,75 @@ +#include "stdafx.h" +#include "DecodedVArray.h" + +#include "main.h" + +DecodedVArray::DecodedVArray() +{ + Zero(); +} + +DecodedVArray::~DecodedVArray() +{ + Destroy(); +} + +void DecodedVArray::Zero() +{ + size = 0; + count = 0; + components = 0; + positions = 0; + posMtxInds = 0; + for (int i=0; i<3; i++) + normals[i] = 0; + for (int i=0; i<8; i++) + { + texMtxInds[i] = 0; + uvs[i] = 0; + } + for (int i=0; i<2; i++) + colors[i] = 0; +} + +void DecodedVArray::Destroy() +{ + //,, + delete [] positions; + delete [] posMtxInds; + for (int i=0; i<3; i++) + delete [] normals[i]; + for (int i=0; i<2; i++) + delete [] colors[i]; + for (int i=0; i<8; i++) + { + delete [] uvs[i]; + delete [] texMtxInds[i]; + } + Zero(); +} + +void DecodedVArray::Create(int _size, int pmcount, int tmcount, int nrmcount, int colcount, int tccount) +{ + size = _size; + // position matrix indices + if (pmcount) + posMtxInds = new DecMtxInd[size]; + // texture matrix indices + if (tmcount) + for (int i=0; i + +#include "resource.h" +#include "W32Util/PropertySheet.h" +#include "W32Util/ShellUtil.h" + +#include "D3DBase.h" +#include "D3DPostprocess.h" + +#include "Globals.h" + +#define NUMWNDRES 6 +int g_Res[NUMWNDRES][2] = +{ + {640,480}, + {800,600}, + {1024,768}, + {1280,960}, + {1280,1024}, + {1600,1200}, +}; + +struct TabDirect3D : public W32Util::Tab +{ + void Init(HWND hDlg) + { + for (int i=0; i + +#include "../../Core/Src/Core.h" +#include "EmuWindow.h" + +namespace EmuWindow +{ + HWND m_hWnd; + HINSTANCE m_hInstance; + WNDCLASSEX wndClass; + const TCHAR m_szClassName[] = "DolphinEmuWnd"; + + HWND GetWnd() + { + + return m_hWnd; + } + + LRESULT CALLBACK WndProc( HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam ) + { + HDC hdc; + PAINTSTRUCT ps; + switch( iMsg ) + { + case WM_PAINT: + hdc = BeginPaint( hWnd, &ps ); + EndPaint( hWnd, &ps ); + return 0; + + case WM_KEYDOWN: + switch( LOWORD( wParam )) + { + case VK_ESCAPE: /* Pressing esc quits */ + //DestroyWindow(hWnd); + //PostQuitMessage(0); + break; + /* + case MY_KEYS: + hypotheticalScene->sendMessage(KEYDOWN...); + */ + } + break; + + case WM_CLOSE: + //Core::SetState(Core::CORE_UNINITIALIZED); + exit(0); + return 0; + + case WM_DESTROY: + //Shutdown(); + //PostQuitMessage( 0 ); + break; + + case WM_SIZE: + // Reset the D3D Device here + // Also make damn sure that this is not called from inside rendering a frame :P + break; + } + + return DefWindowProc(hWnd, iMsg, wParam, lParam); + } + + + HWND OpenWindow(HWND parent, HINSTANCE hInstance, bool windowed, int width, int height, const TCHAR *title) + { + wndClass.cbSize = sizeof( wndClass ); + wndClass.style = CS_HREDRAW | CS_VREDRAW; + wndClass.lpfnWndProc = WndProc; + wndClass.cbClsExtra = 0; + wndClass.cbWndExtra = 0; + wndClass.hInstance = hInstance; + wndClass.hIcon = LoadIcon( NULL, IDI_APPLICATION ); + wndClass.hCursor = LoadCursor( NULL, IDC_ARROW ); + wndClass.hbrBackground = (HBRUSH)GetStockObject( BLACK_BRUSH ); + wndClass.lpszMenuName = NULL; + wndClass.lpszClassName = m_szClassName; + wndClass.hIconSm = LoadIcon( NULL, IDI_APPLICATION ); + + m_hInstance = hInstance; + RegisterClassEx( &wndClass ); + + DWORD style = windowed ? WS_OVERLAPPEDWINDOW : WS_POPUP; + + RECT rc = {0, 0, width, height}; + AdjustWindowRect(&rc, style, false); + + int w = rc.right - rc.left; + int h = rc.bottom - rc.top; + + rc.left = (1280 - w)/2; + rc.right = rc.left + w; + rc.top = (1024 - h)/2; + rc.bottom = rc.top + h; + + m_hWnd = CreateWindow(m_szClassName, title, + style, + rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, + parent, NULL, hInstance, NULL ); + + return m_hWnd; + } + + void Show() + { + ShowWindow(m_hWnd, SW_SHOW); + BringWindowToTop(m_hWnd); + UpdateWindow(m_hWnd); + } + + HWND Create(HWND hParent, HINSTANCE hInstance, const TCHAR *title) + { + return OpenWindow(hParent, hInstance, true, 640, 480, title); + } + + void Close() + { + DestroyWindow(m_hWnd); + UnregisterClass(m_szClassName, m_hInstance); + } + + + void SetSize(int width, int height) + { + RECT rc = {0, 0, width, height}; + AdjustWindowRect(&rc, WS_OVERLAPPEDWINDOW, false); + + int w = rc.right - rc.left; + int h = rc.bottom - rc.top; + + rc.left = (1280 - w)/2; + rc.right = rc.left + w; + rc.top = (1024 - h)/2; + rc.bottom = rc.top + h; + ::MoveWindow(m_hWnd, rc.left,rc.top,rc.right-rc.left,rc.bottom-rc.top, TRUE); + } +} \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoDX9/Src/EmuWindow.h b/Source/Plugins/Plugin_VideoDX9/Src/EmuWindow.h new file mode 100644 index 0000000000..8ca0281a7e --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/EmuWindow.h @@ -0,0 +1,15 @@ +#ifndef _EMUWINDOW_H +#define _EMUWINDOW_H + +#include + +namespace EmuWindow +{ + HWND GetWnd(); + HWND Create(HWND hParent, HINSTANCE hInstance, const TCHAR *title); + void Show(); + void Close(); + void SetSize(int displayWidth, int displayHeight); +} + +#endif diff --git a/Source/Plugins/Plugin_VideoDX9/Src/Fifo.cpp b/Source/Plugins/Plugin_VideoDX9/Src/Fifo.cpp new file mode 100644 index 0000000000..5db2135442 --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/Fifo.cpp @@ -0,0 +1,149 @@ +#include +#include + +#include "Common.h" +#include "Utils.h" +#include "Fifo.h" +#include "main.h" +#include "OpcodeDecoding.h" + +#define FIFO_SIZE (1024*1024) + +FifoReader fifo; +static u8 *videoBuffer; + +int size = 0; +int readptr = 0; + +void Fifo_Init() +{ + //VirtualFree((LPVOID)buffer,CMDBUFFER_SIZE,MEM_RELEASE); + videoBuffer = (u8*)VirtualAlloc(0, FIFO_SIZE, MEM_COMMIT, PAGE_READWRITE); + fifo.Init(videoBuffer, videoBuffer); //zero length. there is no data yet. +} + +void Fifo_Shutdown() +{ + VirtualFree(videoBuffer, FIFO_SIZE, MEM_RELEASE); +} + +int FAKE_GetFifoSize() +{ + if (size < readptr) + { + DebugBreak(); + } + return (size - readptr); +} + +u8 FAKE_PeekFifo8(u32 _uOffset) +{ + return videoBuffer[readptr + _uOffset]; +} + +u16 FAKE_PeekFifo16(u32 _uOffset) +{ + return _byteswap_ushort(*(u16*)&videoBuffer[readptr + _uOffset]); +} + +u32 FAKE_PeekFifo32(u32 _uOffset) +{ + return _byteswap_ulong(*(u32*)&videoBuffer[readptr + _uOffset]); +} + +u8 FAKE_ReadFifo8() +{ + return videoBuffer[readptr++]; +} + +u16 FAKE_ReadFifo16() +{ + u16 val = _byteswap_ushort(*(u16*)(videoBuffer+readptr)); + readptr += 2; + return val; +} + +u32 FAKE_ReadFifo32() +{ + u32 val = _byteswap_ulong(*(u32*)(videoBuffer+readptr)); + readptr += 4; + return val; +} + +void Video_SendFifoData(BYTE *_uData) +{ + memcpy(videoBuffer + size, _uData, 32); + size += 32; + if (size + 32 >= FIFO_SIZE) + { + if (FAKE_GetFifoSize() > readptr) + { + MessageBox(NULL, "out of bounds", "video-plugin", MB_OK); + exit(1); + } + + DebugLog("FAKE BUFFER LOOPS"); + memmove(&videoBuffer[0], &videoBuffer[readptr], FAKE_GetFifoSize()); + // memset(&videoBuffer[FAKE_GetFifoSize()], 0, FIFO_SIZE - FAKE_GetFifoSize()); + size = FAKE_GetFifoSize(); + readptr = 0; + } + OpcodeDecoder_Run(); +} + + +//TODO - turn inside out, have the "reader" ask for bytes instead +// See Core.cpp for threading idea +void Video_EnterLoop() +{ + SCPFifoStruct &fifo = *g_VideoInitialize.pCPFifo; + + // TODO(ector): Don't peek so often! + while (g_VideoInitialize.pPeekMessages()) + { + if (fifo.CPReadWriteDistance < 1) //fifo.CPLoWatermark) + Sleep(1); + //etc... + + // check if we are able to run this buffer + if ((fifo.bFF_GPReadEnable) && !(fifo.bFF_BPEnable && fifo.bFF_Breakpoint)) + { + int count = 200; + while(fifo.CPReadWriteDistance > 0 && count) + { + // check if we are on a breakpoint + if (fifo.bFF_BPEnable) + { + //MessageBox(0,"Breakpoint enabled",0,0); + if (fifo.CPReadPointer == fifo.CPBreakpoint) + { + fifo.bFF_Breakpoint = 1; + g_VideoInitialize.pUpdateInterrupts(); + break; + } + } + + // read the data and send it to the VideoPlugin + + u8 *uData = Memory_GetPtr(fifo.CPReadPointer); + + EnterCriticalSection(&fifo.sync); + fifo.CPReadPointer += 32; + Video_SendFifoData(uData); + InterlockedExchangeAdd((LONG*)&fifo.CPReadWriteDistance, -32); + LeaveCriticalSection(&fifo.sync); + + // increase the ReadPtr + if (fifo.CPReadPointer >= fifo.CPEnd) + { + fifo.CPReadPointer = fifo.CPBase; + //LOG(COMMANDPROCESSOR, "BUFFER LOOP"); + // MessageBox(NULL, "loop", "now", MB_OK); + } + count--; + } + } + + } +} + diff --git a/Source/Plugins/Plugin_VideoDX9/Src/Fifo.h b/Source/Plugins/Plugin_VideoDX9/Src/Fifo.h new file mode 100644 index 0000000000..c6bf425dbc --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/Fifo.h @@ -0,0 +1,40 @@ +#ifndef _FIFO_H +#define _FIFO_H + +#include "Common.h" + +// inline for speed! +class FifoReader +{ + u8 *ptr; + u8 *end; + u8 *tempPtr; //single element stack :P + u8 *tempEnd; + bool pushed; +public: + void Init(u8 *_ptr, u8 *_end) + { + ptr = _ptr; end = _end; pushed = false; + } + bool IsPushed() {return pushed;} + void Push(u8 *_ptr, u8 *_end) {pushed = true; tempPtr = ptr; tempEnd = end; ptr = _ptr; end = _end;} + void Pop() {pushed = false; ptr = tempPtr; end = tempEnd;} + u8 Peek8 (int offset) { return ptr[offset]; } + u16 Peek16(int offset) { return _byteswap_ushort(*(u16*)(ptr+offset)); } + u32 Peek32(int offset) { return _byteswap_ulong(*(u32*)(ptr+offset)); } + u8 Read8 () {return *ptr++;} + u16 Read16() {const u16 value = _byteswap_ushort(*((u16*)ptr)); ptr+=2; return value;} + u32 Read32() {const u32 value = _byteswap_ulong(*((u32*)ptr)); ptr+=4; return value;} + float Read32F() {const u32 value = _byteswap_ulong(*((u32*)ptr)); ptr+=4; return *(float*)&value;} + size_t GetRemainSize() const { return (int)(end - ptr); } + u8 *GetPtr() const { return ptr; } + void MoveEndForward() { end += 32; } + u8 *GetEnd() const { return end; } +}; + +extern FifoReader fifo; + +void Fifo_Init(); +void Fifo_Shutdown(); + +#endif \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoDX9/Src/Globals.cpp b/Source/Plugins/Plugin_VideoDX9/Src/Globals.cpp new file mode 100644 index 0000000000..c677c40d9c --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/Globals.cpp @@ -0,0 +1,58 @@ +#include "Globals.h" +#include "IniFile.h" + +Config g_Config; + +Config::Config() +{ +} + +void Config::Load() +{ + IniFile iniFile; + iniFile.Load("flipper.ini"); + iniFile.Get("Hardware", "Adapter", &iAdapter, 0); + iniFile.Get("Hardware", "WindowedRes", &iWindowedRes, 0); + iniFile.Get("Hardware", "FullscreenRes", &iFSResolution, 0); + iniFile.Get("Hardware", "Fullscreen", &bFullscreen, 0); + iniFile.Get("Hardware", "VSync", &bVsync, 0); + if (iAdapter == -1) + iAdapter = 0; + + iniFile.Get("Settings", "OverlayStats", &bOverlayStats, false); + iniFile.Get("Settings", "Postprocess", &iPostprocessEffect, 0); + iniFile.Get("Settings", "DLOptimize", &iCompileDLsLevel, 0); + iniFile.Get("Settings", "DumpTextures", &bDumpTextures, 0); + iniFile.Get("Settings", "ShowShaderErrors", &bShowShaderErrors, 0); + iniFile.Get("Settings", "Multisample", &iMultisampleMode, 0); + iniFile.Get("Settings", "TexDumpPath", &texDumpPath, 0); + + iniFile.Get("Enhancements", "ForceFiltering", &bForceFiltering, 0); + iniFile.Get("Enhancements", "ForceMaxAniso", &bForceMaxAniso, 0); +} + +void Config::Save() +{ + IniFile iniFile; + iniFile.Load("flipper.ini"); + iniFile.Set("Hardware", "Adapter", iAdapter); + iniFile.Set("Hardware", "WindowedRes", iWindowedRes); + iniFile.Set("Hardware", "FullscreenRes", iFSResolution); + iniFile.Set("Hardware", "Fullscreen", bFullscreen); + iniFile.Set("Hardware", "VSync", bVsync); + + iniFile.Set("Settings", "OverlayStats", bOverlayStats); + iniFile.Set("Settings", "OverlayStats", bOverlayStats); + iniFile.Set("Settings", "Postprocess", iPostprocessEffect); + iniFile.Set("Settings", "DLOptimize", iCompileDLsLevel); + iniFile.Set("Settings", "DumpTextures", bDumpTextures); + iniFile.Set("Settings", "ShowShaderErrors", bShowShaderErrors); + iniFile.Set("Settings", "Multisample", iMultisampleMode); + iniFile.Set("Settings", "TexDumpPath", texDumpPath); + + iniFile.Set("Enhancements", "ForceFiltering", bForceFiltering); + iniFile.Set("Enhancements", "ForceMaxAniso", bForceMaxAniso); + iniFile.Save("flipper.ini"); +} + +Statistics stats; \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoDX9/Src/Globals.h b/Source/Plugins/Plugin_VideoDX9/Src/Globals.h new file mode 100644 index 0000000000..eb3d74fd87 --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/Globals.h @@ -0,0 +1,103 @@ +#ifndef _GLOBALS_H +#define _GLOBALS_H + +#include + +struct Config +{ + Config(); + void Load(); + void Save(); + + int iAdapter; + int iFSResolution; + int iMultisampleMode; + + int iPostprocessEffect; + int iCompileDLsLevel; + + bool bFullscreen; + bool bVsync; + bool bWireFrame; + bool bOverlayStats; + bool bDumpTextures; + bool bOldCard; + bool bShowShaderErrors; + //enhancements + bool bForceFiltering; + bool bForceMaxAniso; + + bool bPreUpscale; + int iPreUpscaleFilter; + + bool bTruform; + int iTruformLevel; + + int iWindowedRes; + + char psProfile[16]; + char vsProfile[16]; + + std::string texDumpPath; +}; + + +extern Config g_Config; + + +struct Statistics +{ + int numPrimitives; + + int numPixelShadersCreated; + int numPixelShadersAlive; + int numVertexShadersCreated; + int numVertexShadersAlive; + + int numTexturesCreated; + int numTexturesAlive; + + int numRenderTargetsCreated; + int numRenderTargetsAlive; + + int numDListsCalled; + int numDListsCreated; + int numDListsAlive; + + int numJoins; + + struct ThisFrame + { + int numBPLoads; + int numCPLoads; + int numXFLoads; + + int numBPLoadsInDL; + int numCPLoadsInDL; + int numXFLoadsInDL; + + int numDLs; + int numDLPrims; + int numPrims; + int numShaderChanges; + int numBadCommands; //hope this always is zero ;) + }; + ThisFrame thisFrame; + void ResetFrame() {memset(&thisFrame,0,sizeof(ThisFrame));} +}; + +extern Statistics stats; + +#define STATISTICS + +#ifdef STATISTICS +#define INCSTAT(a) (a)++; +#define ADDSTAT(a,b) (a)+=(b); +#define SETSTAT(a,x) (a)=(x); +#else +#define INCSTAT(a) ; +#define ADDSTAT(a,b) ; +#define SETSTAT(a,x) ; +#endif + +#endif \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoDX9/Src/IndexGenerator.cpp b/Source/Plugins/Plugin_VideoDX9/Src/IndexGenerator.cpp new file mode 100644 index 0000000000..5c5ccf528d --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/IndexGenerator.cpp @@ -0,0 +1,113 @@ +#include "stdafx.h" +#include "IndexGenerator.h" + +/* +* +QUAD simulator + +0 2 4 6 +1 3 5 7 +021231 243453 +*/ + + +void IndexGenerator::Start(unsigned short *startptr) +{ + ptr=startptr; + index=0; + numPrims=0; +} + +void IndexGenerator::AddList(int numVerts) +{ + int numTris = numVerts/3; + if (numTris<=0) return; + for (int i=0; i= 5) + { + iCommandSize = 1 + 4; + u32 Cmd2 = PeekFifo32(1); + int dwTransferSize = ((Cmd2 >> 16) & 15) + 1; + iCommandSize += dwTransferSize * 4; + } + else + { + return false; + } + } + break; + + default: + if (Cmd&0x80) + { + // check if we can read the header + if (iBufferSize >= 3) + { + iCommandSize = 1 + 2; + u16 numVertices = PeekFifo16(1); + VertexLoader& vtxLoader = g_VertexLoaders[Cmd & GX_VAT_MASK]; + vtxLoader.Setup(); + int vsize = vtxLoader.GetVertexSize(); + iCommandSize += numVertices * vsize; + } + else + { + return false; + } + } + else + { + char szTemp[512]; + sprintf(szTemp, "Error: Unknown Opcode (0x%x)", Cmd); + MessageBox(NULL, szTemp, "Video-Plugin", MB_OK); + g_VideoInitialize.pLog(szTemp, TRUE); + } + break; + } + + if (iCommandSize > iBufferSize) + return false; + +#ifdef _DEBUG + char temp[256]; + sprintf(temp, "OP detected: Cmd 0x%x size %i buffer %i",Cmd, iCommandSize, iBufferSize); + g_VideoInitialize.pLog(temp, FALSE); +#endif + + return true; +} + +void Decode(void) +{ + static int DecoderCount = 0; + DecoderCount++; + + if (DecoderCount == 0x0019c601) + { + int i = 0; + } + + // 0x0019c603 <- error + + int Cmd = g_pDataReader->Read8(); + switch(Cmd) + { + case GX_NOP: + break; + + case GX_LOAD_CP_REG: //0x08 + { + u32 SubCmd = g_pDataReader->Read8(); + u32 Value = g_pDataReader->Read32(); + LoadCPReg(SubCmd,Value); + } + break; + + case GX_LOAD_XF_REG: + { + u32 test = PeekFifo32(0); + u32 Cmd2 = g_pDataReader->Read32(); + + int dwTransferSize = ((Cmd2>>16)&15) + 1; + DWORD dwAddress = Cmd2 & 0xFFFF; + static u32 pData[16]; + for (int i=0; iRead32(); + LoadXFReg(dwTransferSize,dwAddress,pData); + } + break; + + case GX_LOAD_INDX_A: //used for position matrices + LoadIndexedXF(g_pDataReader->Read32(),0xC); + break; + case GX_LOAD_INDX_B: //used for normal matrices + LoadIndexedXF(g_pDataReader->Read32(),0xD); + break; + case GX_LOAD_INDX_C: //used for postmatrices + LoadIndexedXF(g_pDataReader->Read32(),0xE); + break; + case GX_LOAD_INDX_D: //used for lights + LoadIndexedXF(g_pDataReader->Read32(),0xF); + break; + + case GX_CMD_CALL_DL: + { + u32 dwAddr = g_pDataReader->Read32(); + u32 dwCount = g_pDataReader->Read32(); + ExecuteDisplayList(dwAddr, dwCount); + } + break; + + case 0x44: + // zelda 4 swords calls it and checks the metrics registers after that + break; + + case GX_CMD_INVL_VC:// Invalidate (vertex cache?) + DebugLog("Invalidate (vertex cache?)"); + break; + + case GX_LOAD_BP_REG: //0x61 + { + u32 cmd = g_pDataReader->Read32(); + LoadBPReg(cmd); + } + break; + + // draw primitives + default: + if (Cmd&0x80) + { + // load vertices + u16 numVertices = g_pDataReader->Read16(); + tempvarray.Reset(); + VertexLoader::SetVArray(&tempvarray); + VertexLoader& vtxLoader = g_VertexLoaders[Cmd & GX_VAT_MASK]; + vtxLoader.Setup(); + vtxLoader.PrepareRun(); + int vsize = vtxLoader.GetVertexSize(); + vtxLoader.RunVertices(numVertices); + + // draw vertices + int primitive = (Cmd & GX_PRIMITIVE_MASK) >> GX_PRIMITIVE_SHIFT; + CVertexHandler::DrawVertices(primitive, numVertices, &tempvarray); + } + else + { + char szTmp[256]; + // sprintf(szTmp, "Illegal command %02x (at %08x)",Cmd,g_pDataReader->GetPtr()); + sprintf(szTmp, "Illegal command %02x",Cmd); + g_VideoInitialize.pLog(szTmp, TRUE); + MessageBox(0,szTmp,"GFX ERROR",0); + // _assert_msg_(0,szTmp,""); + break; + } + break; + } +} + +void OpcodeDecoder_Init() +{ + g_pDataReader = &g_fifoReader; + tempvarray.Create(65536*3, 1, 8, 3, 2, 8); +} + + +void OpcodeDecoder_Shutdown() +{ + //VirtualFree((LPVOID)buffer,CMDBUFFER_SIZE,MEM_RELEASE); + tempvarray.Destroy(); +} + +void OpcodeDecoder_Run() +{ + // just a small check + if (g_pDataReader != &g_fifoReader) + { + MessageBox(NULL, "very strange", "video-plugin", MB_OK); + } + + DVSTARTPROFILE(); + + while (FifoCommandRunnable()) + { + Decode(); + } +} \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoDX9/Src/OpcodeDecoding.h b/Source/Plugins/Plugin_VideoDX9/Src/OpcodeDecoding.h new file mode 100644 index 0000000000..6e1de3b73e --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/OpcodeDecoding.h @@ -0,0 +1,37 @@ +#ifndef _OPCODE_DECODING_H +#define _OPCODE_DECODING_H + +#include "PluginSpecs_Video.h" +#include "Common.h" + +#define GX_NOP 0x00 + +#define GX_LOAD_BP_REG 0x61 +#define GX_LOAD_CP_REG 0x08 +#define GX_LOAD_XF_REG 0x10 +#define GX_LOAD_INDX_A 0x20 +#define GX_LOAD_INDX_B 0x28 +#define GX_LOAD_INDX_C 0x30 +#define GX_LOAD_INDX_D 0x38 + +#define GX_CMD_CALL_DL 0x40 +#define GX_CMD_INVL_VC 0x48 + +#define GX_PRIMITIVE_MASK 0x78 +#define GX_PRIMITIVE_SHIFT 3 +#define GX_VAT_MASK 0x07 + +//these are defined 1/8th of their real values and without their top bit +#define GX_DRAW_QUADS 0x0 //0x80 +#define GX_DRAW_TRIANGLES 0x2 //0x90 +#define GX_DRAW_TRIANGLE_STRIP 0x3 //0x98 +#define GX_DRAW_TRIANGLE_FAN 0x4 //0xA0 +#define GX_DRAW_LINES 0x5 //0xA8 +#define GX_DRAW_LINE_STRIP 0x6 //0xB0 +#define GX_DRAW_POINTS 0x7 //0xB8 + +void OpcodeDecoder_Init(); +void OpcodeDecoder_Shutdown(); +void OpcodeDecoder_Run(); + +#endif \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoDX9/Src/OpcodeReaders.cpp b/Source/Plugins/Plugin_VideoDX9/Src/OpcodeReaders.cpp new file mode 100644 index 0000000000..223acd6d87 --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/OpcodeReaders.cpp @@ -0,0 +1,216 @@ +#include "stdafx.h" +#include "OpcodeReaders.h" + +_u8 *readerMemPtr; +_u8 *bufPtr; +FifoData *gFifoData; +_u32 gDListEnd, gDListPtr; + +namespace OpcodeReaders +{ + void SetBufPtr(_u8 *_bufptr) + { + bufPtr = _bufptr; + } + void SetFifoData(FifoData *_fdata) + { + gFifoData = _fdata; + } + void SetMemPtr(_u8 *_mptr) + { + readerMemPtr = _mptr; + } + + void SetDListReader(_u32 _ptr, _u32 _end) + { + gDListPtr = _ptr & 0x1FFFFFF; + gDListEnd = _end & 0x1FFFFFF; + } + void DListReaderSkip(int _skip) + { + gDListPtr+=_skip; + } + bool IsDListOKToRead() + { + return gDListPtrreadptr+1)^3; + if (addr==gFifoData->gpend) + addr=gFifoData->gpbegin; + return readerMemPtr[addr]; +} +// ________________________________________________________________________________________________ +// ReadFifo8 +// +_u8 ReadFifo8() +{ + while ( + (gFifoData->readenable == false) || + (gFifoData->readptr == gFifoData->writeptr) || + (gFifoData->bpenable && (gFifoData->readptr == gFifoData->breakpt)) + ) + { + //if (gFifoData->readptr == gFifoData->breakpt) + // MessageBox(0,"hello breakpoint",0,0); + SwitchToFiber(gFifoData->cpuFiber); + } + + _u8 val = readerMemPtr[(gFifoData->readptr++)^3]; + + if (gFifoData->readptr == gFifoData->gpend) + gFifoData->readptr = gFifoData->gpbegin; + + return val; +} + +// ________________________________________________________________________________________________ +// ReadFifo16 +// +_u16 ReadFifo16() +{ + //PowerPC byte ordering :( + _u8 val1 = ReadFifo8(); + _u8 val2 = ReadFifo8(); + return (val1<<8)|(val2); +} + +// ________________________________________________________________________________________________ +// ReadFifo32 +// +_u32 ReadFifo32() +{ + //PowerPC byte ordering :( + _u8 val1 = ReadFifo8(); + _u8 val2 = ReadFifo8(); + _u8 val3 = ReadFifo8(); + _u8 val4 = ReadFifo8(); + return (val1<<24)|(val2<<16)|(val3<<8)|(val4); +} + +_u32 GetPtrFifo() +{ + return gFifoData->readptr; +} + +_u8 PeekDList8() +{ + if (gDListPtr>8); +} + +// ________________________________________________________________________________________________ +// ReadFifo32 +// +_u32 ReadBuf32() +{ +// _u32 val = *(_u32*)bufPtr; + //__asm +// { +// mov ebx,bufPtr +// mov eax,[ebx] +// add ebx,4 +// mov bufPtr,ebx +// bswap eax +// } + _u32 high = ReadBuf16(); + return (high<<16) | ReadBuf16(); +// return swap32(val); +} + + +ReaderInterface fifoReader = +{ + ReadFifo8, + PeekFifo8, + ReadFifo16, + ReadFifo32, + GetPtrFifo +}; + + +ReaderInterface dlistReader = +{ + ReadDList8, + PeekDList8, + ReadDList16, + ReadDList32, + GetPtrDList +}; + +ReaderInterface bufReader = +{ + ReadBuf8, + PeekBuf8, + ReadBuf16, + ReadBuf32, + 0 +}; + +ReaderInterface *reader; \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoDX9/Src/OpcodeReaders.h b/Source/Plugins/Plugin_VideoDX9/Src/OpcodeReaders.h new file mode 100644 index 0000000000..a253a40ce8 --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/OpcodeReaders.h @@ -0,0 +1,26 @@ +#pragma once +#include "../plugin_specs/video.h" +#include "structs.h" + +struct ReaderInterface +{ + _u8 (*Read8) (void); + _u8 (*Peek8) (void); //to combine primitive draws.. + _u16 (*Read16)(void); + _u32 (*Read32)(void); + _u32 (*GetPtr)(void); +}; + +extern ReaderInterface *reader; +extern ReaderInterface fifoReader,dlistReader,bufReader; + +namespace OpcodeReaders +{ + void SetDListReader(_u32 _ptr, _u32 _end); + void DListReaderSkip(int _skip); + void SetMemPtr(_u8 *_mptr); + void SetFifoData(FifoData *_fdata); + bool IsDListOKToRead(); + + void SetBufPtr(_u8 *_bufptr); +} diff --git a/Source/Plugins/Plugin_VideoDX9/Src/PixelShader.cpp b/Source/Plugins/Plugin_VideoDX9/Src/PixelShader.cpp new file mode 100644 index 0000000000..29cd924f8a --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/PixelShader.cpp @@ -0,0 +1,523 @@ +#include "Globals.h" +#include "D3DShader.h" +#include "PixelShader.h" +#include "BPStructs.h" +#include "XFStructs.h" +#include "W32Util/Misc.h" +#include "Utils.h" + +/* + old tev->pixelshader notes + + color for this stage (alpha, color) is given by bpmem.tevorders[0].colorchan0 + konstant for this stage (alpha, color) is given by bpmem.tevksel + inputs are given by bpmem.combiners[0].colorC.a/b/c/d << could be current chan color + according to GXTevColorArg table above + output is given by .outreg + tevtemp is set according to swapmodetables and +*/ + +const float epsilon = 1.0f/255.0f; + +const char *tevKSelTableC[] = +{ + "1,1,1", //KCSEL_1 = 0x00 + "0.875,0.875,0.875",//KCSEL_7_8 = 0x01 + "0.75,0.75,0.75", //KCSEL_3_4 = 0x02 + "0.625,0.625,0.625",//KCSEL_5_8 = 0x03 + "0.5,0.5,0.5", //KCSEL_1_2 = 0x04 + "0.375,0.375,0.375",//KCSEL_3_8 = 0x05 + "0.25,0.25,0.25", //KCSEL_1_4 = 0x06 + "0.125,0.125,0.125",//KCSEL_1_8 = 0x07 + "ERROR", //0x08 + "ERROR", //0x09 + "ERROR", //0x0a + "ERROR", //0x0b + "k0.rgb",//KCSEL_K0 = 0x0C + "k1.rgb",//KCSEL_K1 = 0x0D + "k2.rgb",//KCSEL_K2 = 0x0E + "k3.rgb",//KCSEL_K3 = 0x0F + "k0.rrr",//KCSEL_K0_R = 0x10 + "k1.rrr",//KCSEL_K1_R = 0x11 + "k2.rrr",//KCSEL_K2_R = 0x12 + "k3.rrr",//KCSEL_K3_R = 0x13 + "k0.ggg",//KCSEL_K0_G = 0x14 + "k1.ggg",//KCSEL_K1_G = 0x15 + "k2.ggg",//KCSEL_K2_G = 0x16 + "k3.ggg",//KCSEL_K3_G = 0x17 + "k0.bbb",//KCSEL_K0_B = 0x18 + "k1.bbb",//KCSEL_K1_B = 0x19 + "k2.bbb",//KCSEL_K2_B = 0x1A + "k3.bbb",//KCSEL_K3_B = 0x1B + "k0.aaa",//KCSEL_K0_A = 0x1C + "k1.aaa",//KCSEL_K1_A = 0x1D + "k2.aaa",//KCSEL_K2_A = 0x1E + "k3.aaa",//KCSEL_K3_A = 0x1F +}; +const char *tevKSelTableA[] = +{ + "1", //KASEL_1 = 0x00 + "0.875",//KASEL_7_8 = 0x01 + "0.75", //KASEL_3_4 = 0x02 + "0.625",//KASEL_5_8 = 0x03 + "0.5", //KASEL_1_2 = 0x04 + "0.375",//KASEL_3_8 = 0x05 + "0.25", //KASEL_1_4 = 0x06 + "0.125",//KASEL_1_8 = 0x07 + "ERROR",//0x08 + "ERROR",//0x09 + "ERROR",//0x0a + "ERROR",//0x0b + "ERROR",//0x0c + "ERROR",//0x0d + "ERROR",//0x0e + "ERROR",//0x0f + "k0.r", //KASEL_K0_R = 0x10 + "k1.r", //KASEL_K1_R = 0x11 + "k2.r", //KASEL_K2_R = 0x12 + "k3.r", //KASEL_K3_R = 0x13 + "k0.g", //KASEL_K0_G = 0x14 + "k1.g", //KASEL_K1_G = 0x15 + "k2.g", //KASEL_K2_G = 0x16 + "k3.g", //KASEL_K3_G = 0x17 + "k0.b", //KASEL_K0_B = 0x18 + "k1.b", //KASEL_K1_B = 0x19 + "k2.b", //KASEL_K2_B = 0x1A + "k3.b", //KASEL_K3_B = 0x1B + "k0.a", //KASEL_K0_A = 0x1C + "k1.a", //KASEL_K1_A = 0x1D + "k2.a", //KASEL_K2_A = 0x1E + "k3.a", //KASEL_K3_A = 0x1F +}; + +const char *tevScaleTable[] = +{ + "1", //SCALE_1 + "2", //SCALE_2 + "4", //SCALE_4 + "0.5", //DIVIDE_2 +}; + +const char *tevBiasTable[] = +{ + "", //ZERO, + "+0.5", //ADD_HALF, + "-0.5", //SUB_HALF, + "", //WTF? seen in shadow2 +}; + +const char *tevOpTable[] = +{ + "+", //ADD = 0, + "-", //SUB = 1, +}; + +const char *tevCompOpTable[] = +{ + ">", + "==", +}; + + +#define TEV_COMP_R8 0 +#define TEV_COMP_GR16 1 +#define TEV_COMP_BGR24 2 +#define TEV_COMP_RGB8 3 + +const char *tevCInputTable[] = +{ + "prev.rgb", //CPREV, + "prev.aaa", //APREV, + "c0.rgb", //C0, + "c0.aaa", //A0, + "c1.rgb", //C1, + "c1.aaa", //A1, + "c2.rgb", //C2, + "c2.aaa", //A2, + "textemp.rgb", //TEXC, + "textemp.aaa", //TEXA, + "rastemp.rgb", //RASC, + "rastemp.aaa", //RASA, + "float3(1,1,1)", //ONE, + "float3(.5,.5,.5)", //HALF, + "konsttemp.rgb", //KONST, + "float3(0,0,0)", //ZERO + "PADERROR", "PADERROR", "PADERROR", "PADERROR", + "PADERROR", "PADERROR", "PADERROR", "PADERROR", + "PADERROR", "PADERROR", "PADERROR", "PADERROR", + "PADERROR", "PADERROR", "PADERROR", "PADERROR", + "PADERROR", "PADERROR", "PADERROR", "PADERROR", +}; +const char *tevCInputTable2[] = +{ + "prev", //CPREV, + "(prev.aaa)", //APREV, + "c0", //C0, + "(c0.aaa)", //A0, + "c1", //C1, + "(c1.aaa)", //A1, + "c2", //C2, + "(c2.aaa)", //A2, + "textemp", //TEXC, + "(textemp.aaa)", //TEXA, + "rastemp", //RASC, + "(rastemp.aaa)", //RASA, + "float3(1,1,1)", //ONE, + "float3(.5,.5,.5)", //HALF, + "konsttemp", //KONST, + "float3(0,0,0)", //ZERO + "PADERROR", "PADERROR", "PADERROR", "PADERROR", + "PADERROR", "PADERROR", "PADERROR", "PADERROR", + "PADERROR", "PADERROR", "PADERROR", "PADERROR", + "PADERROR", "PADERROR", "PADERROR", "PADERROR", + "PADERROR", "PADERROR", "PADERROR", "PADERROR", +}; + +const char *tevAInputTable[] = +{ + "prev.a", //APREV, + "c0.a", //A0, + "c1.a", //A1, + "c2.a", //A2, + "textemp.a", //TEXA, + "rastemp.a", //RASA, + "konsttemp.a", //KONST, (hw1 had quarter) + "0.0", //ZERO + "PADERROR", + "PADERROR", + "PADERROR", + "PADERROR", + "PADERROR", + "PADERROR", + "PADERROR", + "PADERROR", + "PADERROR", + "PADERROR", + "PADERROR", + "PADERROR", + "PADERROR", + "PADERROR", + "PADERROR", + +}; + +const char *tevRasTable[] = +{ + "colors[0]",//RAS1_CC_0 0x00000000 /* color channel 0 */ + "colors[1]",//RAS1_CC_1 0x00000001 /* color channel 1 */ + "ERROR", //2 + "ERROR", //3 + "ERROR", //4 + "float4(0,1,0,1)", //RAS1_CC_B 0x00000005 /* indirect texture bump alpha */ //green cuz unsupported + "float4(0,1,0,1)", //RAS1_CC_BN 0x00000006 /* ind tex bump alpha, normalized 0-255 *///green cuz unsupported + "float4(0,0,0,0)", //RAS1_CC_Z 0x00000007 /* set color value to zero */ +}; + +const char *tevCOutputTable[] = +{ + "prev.rgb", + "c0.rgb", + "c1.rgb", + "c2.rgb", +}; +const char *tevAOutputTable[] = +{ + "prev.a", + "c0.a", + "c1.a", + "c2.a", +}; + +const char *texFuncs[] = +{ + "tex2D", + "tex2Dproj" +}; + +//I hope we don't get too many hash collisions :p +//all these magic numbers are primes, it should help a bit +tevhash GetCurrentTEV() +{ + u32 hash = bpmem.genMode.numindstages + bpmem.genMode.numtevstages*11 + bpmem.genMode.numtexgens*8*17; + for (int i=0; i<(int)bpmem.genMode.numtevstages+1; i++) + { + hash = _rotl(hash,3) ^ (bpmem.combiners[i].colorC.hex*13); + hash = _rotl(hash,7) ^ ((bpmem.combiners[i].alphaC.hex&0xFFFFFFFC)*3); + hash = _rotl(hash,9) ^ texcoords[i].texmtxinfo.projection*451; + } + for (int i=0; i<(int)bpmem.genMode.numtevstages/2+1; i++) + { + hash = _rotl(hash,13) ^ (bpmem.tevorders[i].hex*7); + } + for (int i=0; i<8; i++) + { + hash = _rotl(hash,3) ^ bpmem.tevksel[i].swap1; + hash = _rotl(hash,3) ^ bpmem.tevksel[i].swap2; + } + hash ^= bpmem.dstalpha.enable ^ 0xc0debabe; + hash = _rotl(hash,4) ^ bpmem.alphaFunc.comp0*7; + hash = _rotl(hash,4) ^ bpmem.alphaFunc.comp1*13; + hash = _rotl(hash,4) ^ bpmem.alphaFunc.logic*11; + return hash; +} + +char text[65536]; +#define WRITE p+=sprintf + + +void WriteStage(char *&p, int n); +void WriteAlphaTest(char *&p); + + +char *swapColors = "rgba"; +char swapModeTable[4][5]; + +void BuildSwapModeTable() +{ + //bpmem.tevregs[0]. + for (int i=0; i<4; i++) + { + swapModeTable[i][0]=swapColors[bpmem.tevksel[i*2].swap1]; + swapModeTable[i][1]=swapColors[bpmem.tevksel[i*2].swap2]; + swapModeTable[i][2]=swapColors[bpmem.tevksel[i*2+1].swap1]; + swapModeTable[i][3]=swapColors[bpmem.tevksel[i*2+1].swap2]; + swapModeTable[i][4]=0; + } +} + + + +LPDIRECT3DPIXELSHADER9 GeneratePixelShader() +{ + DVSTARTPROFILE(); + + BuildSwapModeTable(); + int numStages = bpmem.genMode.numtevstages + 1; + int numTexgen = bpmem.genMode.numtexgens; + int numSamplers = 8; + + char *p = text; + WRITE(p,"//Pixel Shader for TEV stages\n"); + WRITE(p,"//%i TEV stages, %i texgens, %i IND stages, %i COL channels\n", + bpmem.genMode.numtevstages,bpmem.genMode.numtexgens,bpmem.genMode.numindstages,bpmem.genMode.numcolchans); + + //write kcolor declarations + for (int i=0; i<4; i++) + WRITE(p,"float4 k%i : register(c%i);\n",i,PS_CONST_KCOLORS+i); + + for (int i=0; i<3; i++) + WRITE(p,"float4 color%i : register(c%i);\n",i,PS_CONST_COLORS+i+1); + + WRITE(p,"float constalpha : register(c%i);\n",PS_CONST_CONSTALPHA); + WRITE(p,"float2 alphaRef : register(c%i);\n",PS_CONST_ALPHAREF); + + WRITE(p,"\n"); + + WRITE(p,"sampler samp[%i] : register(s0);\n",numSamplers,numSamplers); + + WRITE(p,"\n"); + + WRITE(p,"float4 main(in float4 colors[2] : COLOR0"); + if (numTexgen) + WRITE(p,", float4 uv[%i] : TEXCOORD0",numTexgen); + else + WRITE(p,", float4 uv[1] : TEXCOORD0"); //HACK + WRITE(p,") : COLOR\n"); + WRITE(p,"{\n"); + WRITE(p,"float4 c0=color0,c1=color1,c2=color2,prev=float4(0.0f,0.0f,0.0f,0.0f),textemp,rastemp,konsttemp;\n"); + WRITE(p,"\n"); + + //WRITE(p, "return 1;}\n"); + //return D3D::CompilePShader(text,(int)(p-text)); + + for (int i=0; i %s.r) ? %s : float3(0,0,0)),\n", + tevCInputTable[cc.d],tevCInputTable2[cc.a], + tevCInputTable2[cc.b],tevCInputTable[cc.c]); + else + WRITE(p," %s + (abs(%s.r - %s.r)<%f ? %s : float3(0,0,0)),\n", + tevCInputTable[cc.d],tevCInputTable2[cc.a], + tevCInputTable2[cc.b],epsilon,tevCInputTable[cc.c]); + break; + default: + WRITE(p,"float3(0,0,0),\n"); + break; + } + } + //end of color + + ////////////////////////////////////////////////////////////////////////// + //start of alpha + ////////////////////////////////////////////////////////////////////////// + if (ac.bias != TB_COMPARE) + { + //normal alpha combiner goes here + WRITE(p," %s*(%s%s",tevScaleTable[ac.scale],tevAInputTable[ac.d],tevOpTable[ac.op]); + WRITE(p,"(lerp(%s,%s,%s)%s))\n", + tevAInputTable[ac.a],tevAInputTable[ac.b], + tevAInputTable[ac.c],tevBiasTable[ac.bias]); + } + else + { + //compare alpha combiner goes here + if (ac.op==0) + WRITE(p," %s + ((%s > %s) ? %s : 0)\n", + tevAInputTable[ac.d],tevAInputTable[ac.a], + tevAInputTable[ac.b],tevAInputTable[ac.c]); + else + WRITE(p," %s + (abs(%s - %s)<%f ? %s : 0)\n", + tevAInputTable[ac.d],tevAInputTable[ac.a], + tevAInputTable[ac.b],epsilon,tevAInputTable[ac.c]); + + } + WRITE(p,");"); + //end of alpha + WRITE(p,"\n"); +} + +char *alphaRef[2] = +{ + "alphaRef.x", + "alphaRef.y" +}; + +void WriteAlphaCompare(char *&p, int num, int comp) +{ + WRITE(p," res%i = ",num); + switch(comp) { + case COMPARE_ALWAYS: WRITE(p,"0;\n"); break; + case COMPARE_NEVER: WRITE(p,"1;\n"); break; + case COMPARE_LEQUAL: WRITE(p,"prev.a - %s.x;\n",alphaRef[num]); break; + case COMPARE_LESS: WRITE(p,"prev.a - %s.x + %f;\n",alphaRef[num],epsilon*2);break; + case COMPARE_GEQUAL: WRITE(p,"%s - prev.a;\n",alphaRef[num]); break; + case COMPARE_GREATER: WRITE(p,"%s - prev.a + %f;\n",alphaRef[num],epsilon*2);break; + case COMPARE_EQUAL: WRITE(p,"abs(%s-prev.a)-%f;\n",alphaRef[num],epsilon*2); break; + case COMPARE_NEQUAL: WRITE(p,"%f-abs(%s-prev.a);\n",epsilon*2,alphaRef[num]); break; + } +} + +void WriteAlphaTest(char *&p) +{ + AlphaOp op = (AlphaOp)bpmem.alphaFunc.logic; + Compare comp[2] = {(Compare)bpmem.alphaFunc.comp0,(Compare)bpmem.alphaFunc.comp1}; + + //first kill all the simple cases + if (op == ALPHAOP_AND && (comp[0] == COMPARE_ALWAYS && comp[1] == COMPARE_ALWAYS)) return; + if (op == ALPHAOP_OR && (comp[0] == COMPARE_ALWAYS || comp[1] == COMPARE_ALWAYS)) return; + for (int i=0; i<2; i++) + { + int one = i; + int other = 1-i; + switch(op) { + case ALPHAOP_XOR: + if (comp[one] == COMPARE_ALWAYS && comp[other] == COMPARE_NEVER) return; + break; + case ALPHAOP_XNOR: + if (comp[one] == COMPARE_ALWAYS && comp[other] == COMPARE_ALWAYS) return; + if (comp[one] == COMPARE_ALWAYS && comp[other] == COMPARE_NEVER) return; + break; + } + } + + //Ok, didn't get to do the easy way out :P + // do the general way + WRITE(p,"float res0,res1;\n"); + WriteAlphaCompare(p,0,bpmem.alphaFunc.comp0); + WriteAlphaCompare(p,1,bpmem.alphaFunc.comp1); + WRITE(p,"res0=max(res0,0);\n"); + WRITE(p,"res1=max(res1,0);\n"); + //probably should use lookup textures for some of these :P + switch(bpmem.alphaFunc.logic) { + case ALPHAOP_AND: // if both are 0 + WRITE(p,"clip(-(res0+res1)+%f);\n",epsilon); + break; + case ALPHAOP_OR: //if either is 0 + WRITE(p,"clip(-res0*res1+%f);\n",epsilon*epsilon); + break; + case ALPHAOP_XOR: + //hmm, this might work: + WRITE(p,"res0=(res0>0?1:0)-.5;\n"); + WRITE(p,"res1=(res1>0?1:0)-.5;\n"); + WRITE(p,"clip(-res0*res1);\n",epsilon); + break; + case ALPHAOP_XNOR: + WRITE(p,"res0=(res0>0?1:0)-.5;\n"); + WRITE(p,"res1=(res1>0?1:0)-.5;\n"); + WRITE(p,"clip(res0*res1);\n",epsilon); + break; + } +} diff --git a/Source/Plugins/Plugin_VideoDX9/Src/PixelShader.h b/Source/Plugins/Plugin_VideoDX9/Src/PixelShader.h new file mode 100644 index 0000000000..f66bf91415 --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/PixelShader.h @@ -0,0 +1,15 @@ +#pragma once + +#include "Common.h" + +typedef u32 tevhash; + +tevhash GetCurrentTEV(); +LPDIRECT3DPIXELSHADER9 GeneratePixelShader(); + +#define PS_CONST_COLORS 0 +#define PS_CONST_KCOLORS 4 +#define PS_CONST_CONSTALPHA 8 +#define PS_CONST_ALPHAREF 9 // x,y +#define PS_CONST_INDMTXSTART 10 +#define PS_CONST_INDSIZE 2 \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoDX9/Src/RGBAFloat.h b/Source/Plugins/Plugin_VideoDX9/Src/RGBAFloat.h new file mode 100644 index 0000000000..a1f7e05e68 --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/RGBAFloat.h @@ -0,0 +1,84 @@ +#ifndef _RGBAFLOAT_H +#define _RGBAFLOAT_H + +struct RGBAFloat +{ + float r,g,b,a; + RGBAFloat(){a=r=g=b=1.0f;} + RGBAFloat(float _r, float _g, float _b, float _a) + { + r=_r;g=_g;b=_b;a=_a; + } + void clamp() + { + if (r>1) r=1; + if (g>1) g=1; + if (b>1) b=1; + if (a>1) a=1; + if (r<0) r=0; + if (g<0) g=0; + if (b<0) b=0; + if (a<0) a=0; + } + void convertToD3DColor(u32 &color) + { + clamp(); + color = (int(a*255)<<24) | (int(r*255)<<16) | (int(g*255)<<8) | (int(b*255)); + } + void convertRGB_GC(u32 color) + { + r=((color>>24)&0xFF)/255.0f; + g=((color>>16)&0xFF)/255.0f; + b=((color>>8)&0xFF)/255.0f; + } + void convertRGB(u32 color) + { + r=((color>>16)&0xFF)/255.0f; + g=((color>>8)&0xFF)/255.0f; + b=((color)&0xFF)/255.0f; + } + void convertA(u32 color) + { + a=((color>>24)&0xFF)/255.0f; + } + void convertA_GC(u32 color) + { + a=((color)&0xFF)/255.0f; + } + void convert(u32 color) + { + convertRGB(color); + convertA(color); + } + void convert_GC(u32 color) + { + convertRGB_GC(color); + convertA_GC(color); + } + void operator *=(float f) + { + r*=f;g*=f;b*=f; a*=f; + } + RGBAFloat operator *(float f) + { + return RGBAFloat(r*f,g*f,b*f,a*f); + } + RGBAFloat operator *(RGBAFloat &o) + { + return RGBAFloat(r*o.r,g*o.g,b*o.b,a*o.a); + } + void operator *=(RGBAFloat &o) + { + r*=o.r;g*=o.g;b*=o.b;a*=o.a; + } + RGBAFloat operator +(RGBAFloat &o) + { + return RGBAFloat(r+o.r,g+o.g,b+o.b,a+o.a); + } + void operator +=(RGBAFloat &o) + { + r+=o.r;g+=o.g;b+=o.b;a+=o.a; + } +}; + +#endif \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoDX9/Src/Render.cpp b/Source/Plugins/Plugin_VideoDX9/Src/Render.cpp new file mode 100644 index 0000000000..d3c98fc3ca --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/Render.cpp @@ -0,0 +1,295 @@ +#include + +#include "Common.h" + +#include "D3DBase.h" + +#include "Globals.h" +#include "main.h" +#include "VertexHandler.h" +#include "Render.h" +#include "OpcodeDecoding.h" +#include "BPStructs.h" +#include "XFStructs.h" +#include "D3DPostprocess.h" +#include "D3DUtil.h" +#include "ShaderManager.h" +#include "TextureCache.h" +#include "Utils.h" +#include "EmuWindow.h" + +float Renderer::m_x,Renderer::m_y,Renderer::m_width, Renderer::m_height, Renderer::xScale,Renderer::yScale; + +#define NUMWNDRES 6 +extern int g_Res[NUMWNDRES][2]; + +void Renderer::Init(SVideoInitialize &_VideoInitialize) +{ + EmuWindow::SetSize(g_Res[g_Config.iWindowedRes][0], g_Res[g_Config.iWindowedRes][1]); + + D3D::Create(g_Config.iAdapter, EmuWindow::GetWnd(), g_Config.bFullscreen, g_Config.iFSResolution, g_Config.iMultisampleMode); + + D3DVIEWPORT9 vp; + D3D::dev->GetViewport(&vp); + + m_x = 0; + m_y = 0; + m_width = (float)vp.Width; + m_height = (float)vp.Height; + xScale = 640.0f / (float)vp.Width; + yScale = 480.0f / (float)vp.Height; + + D3D::font.Init(); + Initialize(); +} + +void Renderer::Shutdown(void) +{ + D3D::font.Shutdown(); + D3D::EndFrame(); + D3D::Close(); +} + +void Renderer::Initialize(void) +{ + D3D::dev->SetRenderState(D3DRS_LIGHTING,FALSE); + D3D::dev->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD); + D3D::dev->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); + D3D::dev->SetRenderState(D3DRS_FOGENABLE, FALSE); + D3D::dev->SetRenderState(D3DRS_FILLMODE, g_Config.bWireFrame?D3DFILL_WIREFRAME:D3DFILL_SOLID); + for (int i=0; i<8; i++) + { + D3D::dev->SetSamplerState(i, D3DSAMP_MAXANISOTROPY, 16); + } + ReinitView(); + + Postprocess::Initialize(); + Postprocess::BeginFrame(); + D3D::BeginFrame(true, 0); + CVertexHandler::BeginFrame(); +} + + +void dumpMatrix(D3DXMATRIX &mtx) +{ + for (int y=0; y<4; y++) + { + char temp[256]; + sprintf(temp,"%4.4f %4.4f %4.4f %4.4f",mtx.m[y][0],mtx.m[y][1],mtx.m[y][2],mtx.m[y][3]); + g_VideoInitialize.pLog(temp, FALSE); + } +} + +void Renderer::ReinitView() +{ + D3DXMATRIX mtx; + D3DXMatrixIdentity(&mtx); + D3D::dev->SetTransform(D3DTS_VIEW,&mtx); + D3D::dev->SetTransform(D3DTS_WORLD,&mtx); + + float width = (float)D3D::GetDisplayWidth(); + float height = (float)D3D::GetDisplayHeight(); + + xScale = width/640.0f; + yScale = height/480.0f; + + RECT rc = { + (LONG)(m_x*xScale), (LONG)(m_y*yScale), (LONG)(m_width*xScale), (LONG)(m_height*yScale) + }; +} + +void Renderer::SwapBuffers(void) +{ + //Finish up the current frame, print some stats + Postprocess::FinalizeFrame(); + if (g_Config.bOverlayStats) + { + char st[2048]; + char *p = st; + p+=sprintf(p,"Num textures created: %i\n",stats.numTexturesCreated); + p+=sprintf(p,"Num textures alive: %i\n",stats.numTexturesAlive); + p+=sprintf(p,"Num pshaders created: %i\n",stats.numPixelShadersCreated); + p+=sprintf(p,"Num pshaders alive: %i\n",stats.numPixelShadersAlive); + p+=sprintf(p,"Num vshaders created: %i\n",stats.numVertexShadersCreated); + p+=sprintf(p,"Num vshaders alive: %i\n",stats.numVertexShadersAlive); + p+=sprintf(p,"Num dlists called: %i\n",stats.numDListsCalled); + p+=sprintf(p,"Num dlists created: %i\n",stats.numDListsCreated); + p+=sprintf(p,"Num dlists alive: %i\n",stats.numDListsAlive); + p+=sprintf(p,"Num strip joins: %i\n",stats.numJoins); + p+=sprintf(p,"Num primitives: %i\n",stats.thisFrame.numPrims); + p+=sprintf(p,"Num primitives (DL): %i\n",stats.thisFrame.numDLPrims); + p+=sprintf(p,"Num bad commands: %i%s\n",stats.thisFrame.numBadCommands,stats.thisFrame.numBadCommands?"!!!":""); + p+=sprintf(p,"Num XF loads: %i\n",stats.thisFrame.numXFLoads); + p+=sprintf(p,"Num XF loads (DL): %i\n",stats.thisFrame.numXFLoadsInDL); + p+=sprintf(p,"Num CP loads: %i\n",stats.thisFrame.numCPLoads); + p+=sprintf(p,"Num CP loads (DL): %i\n",stats.thisFrame.numCPLoadsInDL); + p+=sprintf(p,"Num BP loads: %i\n",stats.thisFrame.numBPLoads); + p+=sprintf(p,"Num BP loads (DL): %i\n",stats.thisFrame.numBPLoadsInDL); + + D3D::font.DrawTextScaled(0,30,20,20,0.0f,0xFF00FFFF,st,false); + + //end frame + } + +#if defined(DVPROFILE) + if( g_bWriteProfile ) { + //g_bWriteProfile = 0; + static int framenum = 0; + const int UPDATE_FRAMES = 8; + if( ++framenum >= UPDATE_FRAMES ) { + DVProfWrite("prof.txt", UPDATE_FRAMES); + DVProfClear(); + framenum = 0; + } + } +#endif + + D3D::EndFrame(); + //D3D frame is now over + ////////////////////////////////////////////////////////////////////////// + + //clean out old stuff from caches + frameCount++; + PShaderCache::Cleanup(); + TextureCache::Cleanup(); + //DListCache::Cleanup(); + + ////////////////////////////////////////////////////////////////////////// + //Begin new frame + //Set default viewport and scissor, for the clear to work correctly + stats.ResetFrame(); + D3DVIEWPORT9 vp; + vp.X = 0; + vp.Y = 0; + vp.Width = (DWORD)m_width; + vp.Height = (DWORD)m_height; + vp.MinZ = 0; + vp.MaxZ = 0; + D3D::dev->SetViewport(&vp); + RECT rc; + rc.left = 0; + rc.top = 0; + rc.right = (LONG)m_width; + rc.bottom = (LONG)m_height; + D3D::dev->SetScissorRect(&rc); + + u32 clearColor = (bpmem.clearcolorAR<<16)|bpmem.clearcolorGB; +// clearColor |= 0x003F003F; +// D3D::BeginFrame(true,clearColor,1.0f); + D3D::BeginFrame(false,clearColor,1.0f); + // D3D::EnableAlphaToCoverage(); + + Postprocess::BeginFrame(); + CVertexHandler::BeginFrame(); + + if (g_Config.bOldCard) + D3D::font.SetRenderStates(); //compatibility with lowend cards +} + +void Renderer::Flush(void) +{ + // render the rest of the vertex buffer + //only to be used for debugging purposes + //D3D::EndFrame(); + + //D3D::BeginFrame(false,0); +} + +void Renderer::SetViewport(float* _Viewport) +{ + Viewport* pViewport = (Viewport*)_Viewport; + D3DVIEWPORT9 vp; + float x=(pViewport->xOrig-662)*2; + float y=(pViewport->yOrig-582)*2; //something is wrong, but what?? + y-=16; + + float w=pViewport->wd*2; //multiply up to real size + float h=pViewport->ht*-2; //why is this negative? oh well.. + + if (x < 0.0f) x = 0.0f; + if (y < 0.0f) y = 0.0f; + if (x > 640.0f) x = 639.0f; + if (y > 480.0f) y = 479.0f; + if (w < 0) w=1; + if (h < 0) h=1; + if (x+w > 640.0f) w=640-x; + if (y+h > 480.0f) h=480-y; + //x=y=0; + //if(w>0.0f) w=0.0f; + //if(h<0.0f) h=0.0f; + + vp.X = (DWORD)(x*xScale); + vp.Y = (DWORD)(y*yScale); + vp.Width = (DWORD)(w*xScale); + vp.Height = (DWORD)(h*yScale); + vp.MinZ = 0.0f; + vp.MaxZ = 1.0f; + +// char temp[256]; +// sprintf(temp,"Viewport: %i %i %i %i %f %f",vp.X,vp.Y,vp.Width,vp.Height,vp.MinZ,vp.MaxZ); +// g_VideoInitialize.pLog(temp, FALSE); + + D3D::dev->SetViewport(&vp); +} + +void Renderer::SetScissorBox(RECT &rc) +{ + rc.left = (int)(rc.left * xScale); + rc.top = (int)(rc.top * yScale); + rc.right = (int)(rc.right * xScale); + rc.bottom = (int)(rc.bottom * yScale); + if (rc.right >= rc.left && rc.bottom >= rc.top) + D3D::dev->SetScissorRect(&rc); + else + g_VideoInitialize.pLog("SCISSOR ERROR", FALSE); +} + +void Renderer::SetProjection(float* pMatrix, int constantIndex) +{ + D3DXMATRIX mtx; + if (pMatrix[6] == 0) + { + mtx.m[0][0] = pMatrix[0]; + mtx.m[1][0] = 0.0f; + mtx.m[2][0] = pMatrix[1]; + mtx.m[3][0] = -0.5f/m_width; + + mtx.m[0][1] = 0.0f; + mtx.m[1][1] = pMatrix[2]; + mtx.m[2][1] = pMatrix[3]; + mtx.m[3][1] = +0.5f/m_height; + + mtx.m[0][2] = 0.0f; + mtx.m[1][2] = 0.0f; + mtx.m[2][2] = -(1-pMatrix[4]); + mtx.m[3][2] = pMatrix[5]; + + mtx.m[0][3] = 0.0f; + mtx.m[1][3] = 0.0f; + mtx.m[2][3] = -1.0f; + mtx.m[3][3] = 0.0f; + } + else + { + mtx.m[0][0] = pMatrix[0]; + mtx.m[1][0] = 0.0f; + mtx.m[2][0] = 0.0f; + mtx.m[3][0] = pMatrix[1]-0.5f/m_width; // fix d3d pixel center + + mtx.m[0][1] = 0.0f; + mtx.m[1][1] = pMatrix[2]; + mtx.m[2][1] = 0.0f; + mtx.m[3][1] = pMatrix[3]+0.5f/m_height; // fix d3d pixel center + + mtx.m[0][2] = 0.0f; + mtx.m[1][2] = 0.0f; + mtx.m[2][2] = pMatrix[4]; + mtx.m[3][2] = -(-1 - pMatrix[5]); + + mtx.m[0][3] = 0; + mtx.m[1][3] = 0; + mtx.m[2][3] = 0.0f; + mtx.m[3][3] = 1.0f; + } + D3D::dev->SetVertexShaderConstantF(constantIndex, mtx, 4); +} \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoDX9/Src/Render.h b/Source/Plugins/Plugin_VideoDX9/Src/Render.h new file mode 100644 index 0000000000..e8181da999 --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/Render.h @@ -0,0 +1,30 @@ +#pragma once + +#include "PluginSpecs_Video.h" + +class Renderer +{ + // screen offset + static float m_x,m_y,m_width, m_height,xScale,yScale; + +public: + + static void Init(SVideoInitialize &_VideoInitialize); + static void Shutdown(); + + // initialize opengl standard values (like viewport) + static void Initialize(void); + // must be called if the windowsize has changed + static void ReinitView(void); + // + // --- Render Functions --- + // + static void SwapBuffers(void); + static void Flush(void); + static float GetXScale(){return xScale;} + static float GetYScale(){return yScale;} + + static void SetScissorBox(RECT &rc); + static void SetViewport(float* _Viewport); + static void SetProjection(float* _pProjection, int constantIndex = -1); +}; diff --git a/Source/Plugins/Plugin_VideoDX9/Src/ShaderManager.cpp b/Source/Plugins/Plugin_VideoDX9/Src/ShaderManager.cpp new file mode 100644 index 0000000000..7f4eec81d0 --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/ShaderManager.cpp @@ -0,0 +1,153 @@ +#include "D3DBase.h" +#include "Utils.h" +#include "Globals.h" +#include "ShaderManager.h" + +PShaderCache::PSCache PShaderCache::pshaders; +VShaderCache::VSCache VShaderCache::vshaders; + +void PShaderCache::Init() +{ + + +} + + +void PShaderCache::Shutdown() +{ + PSCache::iterator iter = pshaders.begin(); + for (;iter!=pshaders.end();iter++) + iter->second.Destroy(); + pshaders.clear(); +} + + +void PShaderCache::SetShader() +{ + if (D3D::GetShaderVersion() < 2) + return; // we are screwed + + static LPDIRECT3DPIXELSHADER9 lastShader = 0; + DVSTARTPROFILE(); + + tevhash currentHash = GetCurrentTEV(); + + PSCache::iterator iter; + iter = pshaders.find(currentHash); + + if (iter != pshaders.end()) + { + iter->second.frameCount=frameCount; + PSCacheEntry &entry = iter->second; + if (!lastShader || entry.shader != lastShader) + { + D3D::dev->SetPixelShader(entry.shader); + lastShader = entry.shader; + } + return; + } + + LPDIRECT3DPIXELSHADER9 shader = GeneratePixelShader(); + + if (shader) + { + //Make an entry in the table + PSCacheEntry newentry; + newentry.shader = shader; + newentry.frameCount=frameCount; + pshaders[currentHash] = newentry; + } + + D3D::dev->SetPixelShader(shader); + + INCSTAT(stats.numPixelShadersCreated); + SETSTAT(stats.numPixelShadersAlive, (int)pshaders.size()); +} + +void PShaderCache::Cleanup() +{ + PSCache::iterator iter; + iter = pshaders.begin(); + + while(iter!=pshaders.end()) + { + PSCacheEntry &entry = iter->second; + if (entry.frameCountsecond.Destroy(); + vshaders.clear(); +} + + +void VShaderCache::SetShader() +{ + static LPDIRECT3DVERTEXSHADER9 lastShader = 0; + xformhash currentHash = GetCurrentXForm(); + + VSCache::iterator iter; + iter = vshaders.find(currentHash); + + if (iter != vshaders.end()) + { + iter->second.frameCount=frameCount; + VSCacheEntry &entry = iter->second; + if (!lastShader || entry.shader != lastShader) + { + D3D::dev->SetVertexShader(entry.shader); + lastShader = entry.shader; + } + return; + } + + LPDIRECT3DVERTEXSHADER9 shader = GenerateVertexShader(); + + if (shader) + { + //Make an entry in the table + VSCacheEntry entry; + entry.shader = shader; + entry.frameCount=frameCount; + vshaders[currentHash] = entry; + } + D3D::dev->SetVertexShader(shader); + + INCSTAT(stats.numVertexShadersCreated); + SETSTAT(stats.numVertexShadersAlive, (int)vshaders.size()); +} + +void VShaderCache::Cleanup() +{ + for (VSCache::iterator iter=vshaders.begin(); iter!=vshaders.end();iter++) + { + VSCacheEntry &entry = iter->second; + if (entry.frameCount +#include "PixelShader.h" +#include "VertexShader.h" + + + +class PShaderCache +{ + struct PSCacheEntry + { + LPDIRECT3DPIXELSHADER9 shader; + //CGPShader shader; + + int frameCount; + PSCacheEntry() + { + shader=0; + frameCount=0; + } + void Destroy() + { + if (shader) + shader->Release(); + } + }; + + + typedef std::map PSCache; + + static PSCache pshaders; + +public: + static void Init(); + static void Cleanup(); + static void Shutdown(); + static void SetShader(); +}; + + + +class VShaderCache +{ + struct VSCacheEntry + { + LPDIRECT3DVERTEXSHADER9 shader; + //CGVShader shader; + int frameCount; + VSCacheEntry() + { + shader=0; + frameCount=0; + } + void Destroy() + { + if (shader) + shader->Release(); + } + }; + + typedef std::map VSCache; + + static VSCache vshaders; + + +public: + static void Init(); + static void Cleanup(); + static void Shutdown(); + static void SetShader(); +}; + +void InitCG(); +void ShutdownCG(); \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoDX9/Src/TextureCache.cpp b/Source/Plugins/Plugin_VideoDX9/Src/TextureCache.cpp new file mode 100644 index 0000000000..0a4e7c0151 --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/TextureCache.cpp @@ -0,0 +1,214 @@ +#include + +#include "Common.h" + +#include "D3DBase.h" +#include "D3Dtexture.h" + +#include "Render.h" + +#include "TextureDecoder.h" +#include "TextureCache.h" + +#include "Globals.h" +#include "main.h" + +u8 *TextureCache::temp = NULL; +TextureCache::TexCache TextureCache::textures; + +extern int frameCount; + +#define TEMP_SIZE (1024*1024*4) + +void TextureCache::TCacheEntry::Destroy() +{ + if (texture) + texture->Release(); +} + +void TextureCache::Init() +{ + temp = (u8*)VirtualAlloc(0,TEMP_SIZE,MEM_COMMIT,PAGE_READWRITE); +} + +void TextureCache::Invalidate() +{ + TexCache::iterator iter = textures.begin(); + for (;iter!=textures.end();iter++) + iter->second.Destroy(); + textures.clear(); +} + +void TextureCache::Shutdown() +{ + Invalidate(); + + VirtualFree(temp, 0, MEM_RELEASE); + temp = NULL; +} + +void TextureCache::Cleanup() +{ + TexCache::iterator iter=textures.begin(); + + while(iter!=textures.end()) + { + if (frameCount>20+iter->second.frameCount) + { + if (!iter->second.isRenderTarget) + { + u32 *ptr = (u32*)g_VideoInitialize.pGetMemoryPointer(iter->second.addr + iter->second.hashoffset*4); + if (*ptr == iter->second.hash) + *ptr = iter->second.oldpixel; + iter->second.Destroy(); + iter = textures.erase(iter); + } + else + { + iter++; + } + } + else + { + iter++; + } + } +} + +void TextureCache::Load(int stage, DWORD address, int width, int height, int format, int tlutaddr, int tlutfmt) +{ + if (address == 0) + return; + TexCache::iterator iter = textures.find(address); + + u8 *ptr = g_VideoInitialize.pGetMemoryPointer(address); + + int palSize = TexDecoder_GetPaletteSize(format); + u32 palhash = 0xc0debabe; + if (palSize) + { + if (palSize>16) + palSize = 16; //let's not do excessive amount of checking + u8 *pal = g_VideoInitialize.pGetMemoryPointer(tlutaddr); + if (pal != 0) + { + for (int i=0; isecond; + + if (entry.isRenderTarget || (((u32 *)ptr)[entry.hashoffset] == entry.hash && palhash == entry.paletteHash)) //stupid, improve + { + iter->second.frameCount = frameCount; + if (lastTexture[stage] == iter->second.texture) + { + return; + } + lastTexture[stage] = iter->second.texture; + D3D::dev->SetTexture(stage,iter->second.texture); + return; + } + else + { + TCacheEntry &entry = iter->second; +/* if (width == iter->second.w && height==entry.h && format==entry.fmt) + { + LPDIRECT3DTEXTURE9 tex = entry.texture; + int bs = TexDecoder_GetBlockWidthInTexels(format)-1; //TexelSizeInNibbles(format)*width*height/16; + int expandedWidth = (width+bs) & (~bs); + D3DFORMAT dfmt = TexDecoder_Decode(temp,ptr,expandedWidth,height,format, tlutaddr, tlutfmt); + D3D::ReplaceTexture2D(tex,temp,width,height,expandedWidth,dfmt); + D3D::dev->SetTexture(stage,tex); + return; + } + else + {*/ + iter->second.Destroy(); + textures.erase(iter); + //} + } + } + + int bs = TexDecoder_GetBlockWidthInTexels(format)-1; //TexelSizeInNibbles(format)*width*height/16; + int expandedWidth = (width+bs) & (~bs); + D3DFORMAT dfmt = TexDecoder_Decode(temp,ptr,expandedWidth,height,format, tlutaddr, tlutfmt); + + //Make an entry in the table + TCacheEntry entry; + entry.hashoffset = 0; + entry.hash = (u32)(((double)rand() / RAND_MAX) * 0xFFFFFFFF); + entry.paletteHash = palhash; + entry.oldpixel = ((u32 *)ptr)[entry.hashoffset]; + ((u32 *)ptr)[entry.hashoffset] = entry.hash; + + entry.addr = address; + entry.isRenderTarget=false; + entry.isNonPow2 = ((width&(width-1)) || (height&(height-1))); + entry.texture = D3D::CreateTexture2D((BYTE*)temp,width,height,expandedWidth,dfmt); + entry.frameCount = frameCount; + entry.w=width; + entry.h=height; + entry.fmt=format; + textures[address] = entry; + + if (g_Config.bDumpTextures) + { // dump texture to file + static int counter = 0; + char szTemp[MAX_PATH]; + sprintf(szTemp, "%s\\txt_%04i_%i.png", g_Config.texDumpPath, counter++, format); + + D3DXSaveTextureToFile(szTemp,D3DXIFF_BMP,entry.texture,0); + } + + INCSTAT(stats.numTexturesCreated); + SETSTAT(stats.numTexturesAlive, (int)textures.size()); + + //Set the texture! + D3D::dev->SetTexture(stage,entry.texture); + lastTexture[stage] = entry.texture; +} + + +void TextureCache::CopyEFBToRenderTarget(DWORD address, RECT *source) +{ + TexCache::iterator iter; + LPDIRECT3DTEXTURE9 tex; + iter = textures.find(address); + if (iter != textures.end()) + { + if (!iter->second.isRenderTarget) + { + g_VideoInitialize.pLog("Using non-rendertarget texture as render target!!! WTF?", FALSE); + //TODO: remove it and recreate it as a render target + } + tex = iter->second.texture; + iter->second.frameCount=frameCount; + } + else + { + TCacheEntry entry; + entry.isRenderTarget=true; + entry.hash = 0; + entry.hashoffset = 0; + entry.frameCount = frameCount; + // TODO(ector): infer this size in some sensible way + D3D::dev->CreateTexture(512,512,1,D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &entry.texture, 0); + textures[address] = entry; + tex = entry.texture; + } + LPDIRECT3DSURFACE9 srcSurface,destSurface; + tex->GetSurfaceLevel(0,&destSurface); + srcSurface = D3D::GetBackBufferSurface(); + D3D::dev->StretchRect(srcSurface,source,destSurface,0,D3DTEXF_NONE); + destSurface->Release(); +} \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoDX9/Src/TextureCache.h b/Source/Plugins/Plugin_VideoDX9/Src/TextureCache.h new file mode 100644 index 0000000000..83b4bd17f2 --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/TextureCache.h @@ -0,0 +1,47 @@ +#ifndef _TEXTURECACHE_H +#define _TEXTURECACHE_H + + +#include + +#include "D3DBase.h" + +class TextureCache +{ + struct TCacheEntry + { + LPDIRECT3DTEXTURE9 texture; + u32 addr; + u32 hash; + u32 paletteHash; + u32 hashoffset; + u32 oldpixel; + bool isRenderTarget; + bool isNonPow2; + int frameCount; + int w,h,fmt; + TCacheEntry() + { + texture=0; + isRenderTarget=0; + hash=0; + } + void Destroy(); + }; + + + typedef std::map TexCache; + + static u8 *temp; + static TexCache textures; + +public: + static void Init(); + static void Cleanup(); + static void Shutdown(); + static void Invalidate(); + static void Load(int stage, DWORD address, int width, int height, int format, int tlutaddr, int tlutfmt); + static void CopyEFBToRenderTarget(DWORD address, RECT *source); +}; + +#endif \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoDX9/Src/TextureDecoder.cpp b/Source/Plugins/Plugin_VideoDX9/Src/TextureDecoder.cpp new file mode 100644 index 0000000000..90b2963e90 --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/TextureDecoder.cpp @@ -0,0 +1,447 @@ +#include "stdafx.h" +#include "D3DBase.h" + +#include "main.h" +#include "Utils.h" + +#include "BPStructs.h" +#include "TextureDecoder.h" + +#include "OpcodeDecoding.h" + + +// TRAM +u8 texMem[TMEM_SIZE]; + +////////////////////////////////////////////////////////////////////////// +// Gamecube texture decoder +////////////////////////////////////////////////////////////////////////// +// Decodes all known Gamecube texture formats. +// TODO - speedup +// by ector +////////////////////////////////////////////////////////////////////////// +int TexDecoder_GetTexelSizeInNibbles(int format) +{ + switch(format) { + case GX_TF_I4: return 1; + case GX_TF_I8: return 2; + case GX_TF_IA4: return 2; + case GX_TF_IA8: return 4; + case GX_TF_RGB565: return 4; + case GX_TF_RGB5A3: return 4; + case GX_TF_RGBA8: return 8; + case GX_TF_C4: return 1; + case GX_TF_C8: return 2; + case GX_TF_C14X2: return 4; + case GX_TF_CMPR: return 1; + default: return 1; + } +} +int TexDecoder_GetBlockWidthInTexels(int format) +{ + switch(format) { + case GX_TF_I4: return 8; + case GX_TF_I8: return 8; + case GX_TF_IA4: return 8; + case GX_TF_IA8: return 4; + case GX_TF_RGB565: return 4; + case GX_TF_RGB5A3: return 4; + case GX_TF_RGBA8: return 4; + case GX_TF_C4: return 8; + case GX_TF_C8: return 8; + case GX_TF_C14X2: return 4; + case GX_TF_CMPR: return 8; + default:return 8; + } +} + +//returns bytes +int TexDecoder_GetPaletteSize(int format) +{ + switch (format) { + case GX_TF_C4: return 16*2; + case GX_TF_C8: return 256*2; + case GX_TF_C14X2: return 16384*2; + default: + return 0; + } +} + +inline u32 decode565(u16 val) +{ + int r,g,b,a; + r=lut5to8[(val>>11)&0x1f]; + g=lut6to8[(val>>5 )&0x3f]; + b=lut5to8[(val )&0x1f]; + a=0xFF; + return (a<<24) | (r<<16) | (g<<8) | b; +} + +inline u32 decodeIA8(u16 val) +{ + int a=val>>8; + int r,g,b; + r=g=b=val&0xFF; + return (a<<24) | (r<<16) | (g<<8) | b; +} + +inline u32 decode5A3(u16 val) +{ + int r,g,b,a; + if ((val&0x8000)) + { + r=lut5to8[(val>>10)&0x1f]; + g=lut5to8[(val>>5 )&0x1f]; + b=lut5to8[(val )&0x1f]; + a=0xFF; + } + else + { + a=lut3to8[(val>>12)&0x7]; + r=lut4to8[(val>>8 )&0xf]; + g=lut4to8[(val>>4 )&0xf]; + b=lut4to8[(val )&0xf]; + } + return (a<<24) | (r<<16) | (g<<8) | b; +} + + + +struct DXTBlock +{ + u16 color1; + u16 color2; + u8 lines[4]; +}; + +inline int expand8888(const int j) +{ + int i = j | (j<<8); + return i|(i<<16); +} + +void decodebytesI4(u32 *dst, u8 *src, int numbytes) +{ + for (int x=0; x>4]); + *dst++ = expand8888(lut4to8[val&15]); + } +} + +void decodebytesI8(u32 *dst, u8 *src, int numbytes) +{ + for (int x=0; x>4)])); + *dst++ = decodeIA8(_byteswap_ushort(tlut[(val&15)])); + break; + case 1: + *dst++ = decode565(_byteswap_ushort(tlut[(val>>4)])); + *dst++ = decode565(_byteswap_ushort(tlut[(val&15)])); + break; + case 2: + *dst++ = decode5A3(_byteswap_ushort(tlut[(val>>4)])); + *dst++ = decode5A3(_byteswap_ushort(tlut[(val&15)])); + break; + case 3: //ERROR + *dst++ = 0xFFFF00FF; + *dst++ = 0xFFFF00FF; + break; + } + } +} + +void decodebytesC8(u32 *dst, u8 *src, int numbytes, int tlutaddr, int tlutfmt) +{ + u16 *tlut = (u16*)(texMem+tlutaddr); + for (int x=0; x>4]; + int r = lut4to8[val&15]; + *dst++ = (a<<24) | (r<<16) | (r<<8) | r; + } +} + +inline void decodebytesIA8(u32 *dst, u16 *src, int numpixels) +{ + for (int x=0; x>=8; + + *dst++ = (a<<16) | (val<<24); + } +} +void decodebytesARGB8pass2(u32 *dst, u16 *src, int numpixels) +{ + for (int x=0; x>=8; + + *dst++ |= (val<<8) | (a<<0); + } +} + +inline u32 makecol(int r,int g,int b,int a) +{ + return ((a&255)<<24)|((r&255)<<16)|((g&255)<<8)|((b&255)); +} + + +//this needs to be FAST, used by some games realtime video +//TODO: port to ASM or intrinsics +void decodeDXTBlock(u32 *dst, DXTBlock *src, int pitch) +{ + u16 c1 = _byteswap_ushort(src->color1); + u16 c2 = _byteswap_ushort(src->color2); + int blue1 = lut5to8[c1&0x1F]; + int blue2 = lut5to8[c2&0x1F]; + int green1 = lut6to8[(c1>>5)&0x3F]; + int green2 = lut6to8[(c2>>5)&0x3F]; + int red1 = lut5to8[(c1>>11)&0x1F]; + int red2 = lut5to8[(c2>>11)&0x1F]; + + int colors[4]; + + if (c1>c2) + { + colors[0]=makecol(red1,green1,blue1,255); + colors[1]=makecol(red2,green2,blue2,255); + colors[2]=makecol(red1+(red2-red1)/3,green1+(green2-green1)/3,blue1+(blue2-blue1)/3,255); + colors[3]=makecol(red2+(red1-red2)/3,green2+(green1-green2)/3,blue2+(blue1-blue2)/3,255); + } + else + { + colors[0]=makecol(red1,green1,blue1,255); + colors[1]=makecol(red2,green2,blue2,255); + colors[2]=makecol((red1+red2)/2,(green1+green2)/2,(blue1+blue2)/2,255); + colors[3]=makecol(0,0,0,0); //transparent + } + + for (int y=0; y<4; y++) + { + int val = src->lines[y]; + for (int x=0; x<4; x++) + { + dst[x] = colors[(val>>6)&3]; + val<<=2; + } + dst+=pitch; + } +} + + +//switch endianness, unswizzle +//TODO: to save memory, don't blindly convert everything to argb8888 +//also ARGB order needs to be swapped later, to accommodate modern hardware better +//need to add DXT support too +D3DFORMAT TexDecoder_Decode(u8 *dst, u8 *src, int width, int height, int texformat, int tlutaddr, int tlutfmt) +{ + DVSTARTPROFILE(); + + switch (texformat) + { + case GX_TF_C4: + { + for (int y=0; ydpos-pos); + val = ldir.normalized() * normal; + } + else + { + float aattn = 0; + float d; + float mul = 1.0f; + if (chan.attnfunc == 3) + { + Vec3 ldir = (light->dpos - pos); + d = ldir.length(); + Vec3 ldirNorm = ldir / d; //normalize + float l = ldirNorm * normal; + aattn = light->ddir * ldirNorm; + mul = l; + } + else if (chan.attnfunc == 1) + { + d = aattn = light->shalfangle * normal; + mul = (light->sdir * normal > 0) ? (normal * light->shalfangle) : 0; + if (mul < 0) + mul = 0; + } + + float spot = (light->a2*aattn*aattn + light->a1*aattn + light->a0); + float dist = 1.0f/(light->k2*d*d + light->k1*d + light->k0); + if (spot<0) + spot=0; + + val = mul * spot * dist; + } + + if (val < 0 && chan.diffusefunc == 2) // clamp + val = 0; + + return val; +} + +void VtxMulMtx43(Vec3 &out, const Vec3 &in, const float pMatrix[12]) +{ + out.x = in.x * pMatrix[0] + in.y * pMatrix[1] + in.z * pMatrix[2] + 1 * pMatrix[3]; + out.y = in.x * pMatrix[4] + in.y * pMatrix[5] + in.z * pMatrix[6] + 1 * pMatrix[7]; + out.z = in.x * pMatrix[8] + in.y * pMatrix[9] + in.z * pMatrix[10] + 1 * pMatrix[11]; +} + +void VtxMulMtx43T(Vec3 &out, const Vec3 &in, const float pMatrix[12]) +{ + out.x = in.x * pMatrix[0] + in.y * pMatrix[1] + in.z * pMatrix[2] + 1 * pMatrix[3]; + out.y = in.x * pMatrix[4] + in.y * pMatrix[5] + in.z * pMatrix[6] + 1 * pMatrix[7]; + out.z = in.x * pMatrix[8] + in.y * pMatrix[9] + in.z * pMatrix[10] + 1 * pMatrix[11]; +} + +void VtxMulMtx42(Vec3 &out, const Vec3 &in, const float pMatrix[8]) +{ + out.x = in.x * pMatrix[0] + in.y * pMatrix[1] + in.z * pMatrix[2] + 1 * pMatrix[3]; + out.y = in.x * pMatrix[4] + in.y * pMatrix[5] + in.z * pMatrix[6] + 1 * pMatrix[7]; +} + +void VtxMulMtx33(Vec3 &out, const Vec3 &in, const float pMatrix[9]) +{ + out.x = in.x * pMatrix[0] + in.y * pMatrix[1] + in.z * pMatrix[2]; + out.y = in.x * pMatrix[3] + in.y * pMatrix[4] + in.z * pMatrix[5]; + out.z = in.x * pMatrix[6] + in.y * pMatrix[7] + in.z * pMatrix[8]; +} + +void CTransformEngine::TransformVertices(int _numVertices, const DecodedVArray *varray, D3DVertex *vbuffer) +{ + if (vbuffer == 0) + { + MessageBox(0,"TransformVertices : vbuffer == 0","WTF",0); + } + + DVSTARTPROFILE(); + + RGBAFloat lightColors[8]; + RGBAFloat lightVals[8]; + RGBAFloat chans[2]; + + // TODO: only for active lights + for (int i=0; i<8; i++) + lightColors[i].convert_GC(GetLight(i)->color); + + for (int i=0; i<_numVertices; i++) + { + ////////////////////////////////////////////////////////////////////////// + //Step 1: xform position and normal + ////////////////////////////////////////////////////////////////////////// + + Vec3 OrigPos = varray->GetPos(i); + + if (varray->GetComponents() & VB_HAS_POSMTXIDX) + { + int index = varray->GetPosMtxInd(i); + SetPosNormalMatrix( + (float*)xfmem + (index & 63) * 4, //CHECK + (float*)xfmem + 0x400 + 3 * (index & 31)); //CHECK + } + + for (int j = 0; j < 8; j++) + { + if (varray->GetComponents() & (VB_HAS_TEXMTXIDX0<GetTexMtxInd(j, i); + SetTexMatrix(j, flipmem + index * 4); + } + } + + Vec3 TempPos; + + // m_pPosMatrix can be switched out, through matrixindex vertex components + VtxMulMtx43(TempPos, OrigPos, m_pPosMatrix); + + Vec3 TempNormal; + Vec3 OrigNormal; + if (varray->GetComponents() & VB_HAS_NRM0) + { + OrigNormal = varray->GetNormal(0, i); + VtxMulMtx33(TempNormal, OrigNormal, m_pNormalMatrix); + TempNormal.normalize(); + } + else + { + OrigNormal.setZero(); + TempNormal.setZero(); + } + + ////////////////////////////////////////////////////////////////////////// + //Step 2: Light! + ////////////////////////////////////////////////////////////////////////// + //find all used lights + u32 lightMask = + colChans[0].color.GetFullLightMask() | colChans[0].alpha.GetFullLightMask() | + colChans[1].color.GetFullLightMask() | colChans[1].alpha.GetFullLightMask(); + + float r0=0,g0=0,b0=0,a0=0; + + //go through them and compute the lit colors + //Sum lighting for both two color channels if they're active + for (int j=0; j<(int)bpmem.genMode.numcolchans; j++) + { + RGBAFloat material; + RGBAFloat lightSum(0,0,0,0); + + bool hasColorJ = (varray->GetComponents() & (VB_HAS_COL0 << j)) != 0; + + //get basic material color from appropriate sources (this would compile nicely!:) + if (colChans[j].color.matsource==GX_SRC_REG) + material.convertRGB_GC(colChans[j].matColor); + else + { + if (hasColorJ) + material.convertRGB(varray->GetColor(j, i)); + else + material.r=material.g=material.b=1.0f; + } + + if (colChans[j].alpha.matsource==GX_SRC_REG) + material.convertA_GC(colChans[j].matColor); + else + { + if (hasColorJ) + material.convertA(varray->GetColor(j, i)); + else + material.a=1.0f; + } + + //combine together the light values from the lights that affect the color + if (colChans[j].color.enablelighting) + { + //choose ambient source and start our lightsum accumulator with its value.. + if (colChans[j].color.ambsource == GX_SRC_REG) + lightSum.convertRGB_GC(colChans[j].ambColor); //ambient + else + { + if (hasColorJ) + lightSum.convertRGB(varray->GetColor(j, i)); + else + { + lightSum.r=0.0f;lightSum.g=0.0f;lightSum.b=0.0f; + } + } + + //accumulate light colors + int cmask = colChans[j].color.GetFullLightMask(); + for (int l=0; l<8; l++) + { + if (cmask&1) + { + float val = DoLighting(GetLight(l), colChans[j].color, TempPos, TempNormal); + float r = lightColors[l].r * val; + float g = lightColors[l].g * val; + float b = lightColors[l].b * val; + lightSum.r += r; + lightSum.g += g; + lightSum.b += b; + } + cmask >>= 1; + } + } + else + { + lightSum.r=lightSum.g=lightSum.b=1.0f; + } + + //combine together the light values from the lights that affect alpha (should be rare) + if (colChans[j].alpha.enablelighting) + { + //choose ambient source.. + if (colChans[j].alpha.ambsource==GX_SRC_REG) + lightSum.convertA_GC(colChans[j].ambColor); + else + { + if (hasColorJ) + lightSum.convertA(varray->GetColor(j, i)); + else + lightSum.a=0.0f; + } + //accumulate light alphas + int amask = colChans[j].alpha.GetFullLightMask(); + for (int l=0; l<8; l++) + { + if (amask&1) + { + float val = DoLighting(GetLight(l),colChans[j].alpha,TempPos,TempNormal); + float a = lightColors[l].a * val; + lightSum.a += a; + } + amask >>= 1; + } + } + else + { + lightSum.a=1.0f; + } + + chans[j] = lightSum * material; + chans[j].clamp(); + } + + ////////////////////////////////////////////////////////////////////////// + //Step 3: Generate texture coordinates! + ////////////////////////////////////////////////////////////////////////// + Vec3 TempUVs[8]; + for (int j=0; jGetComponents() & (VB_HAS_UV0 << c)) != 0; + if (c >= 0 && c <= 7 && hasTCC) + { + const DecUV &uv = varray->GetUV(c, i); + t = Vec3(uv.u, uv.v, 1); + } + } + } + + Vec3 out,out2; + switch (texcoords[n].texmtxinfo.texgentype) + { + case XF_TEXGEN_COLOR_STRGBC0: + out=Vec3(chans[0].r*255, chans[0].g*255, 1)/255.0f; + break; + case XF_TEXGEN_COLOR_STRGBC1: + out=Vec3(chans[1].r*255, chans[1].g*255, 1)/255.0f; //FIX: take color1 instead + break; + case XF_TEXGEN_REGULAR: + if (texcoords[n].texmtxinfo.projection) + VtxMulMtx43(out, t, m_pTexMatrix[n]); + else + VtxMulMtx42(out, t, m_pTexMatrix[n]); + break; + } + + if (texcoords[n].postmtxinfo.normalize) + out.normalize(); + + int postMatrix = texcoords[n].postmtxinfo.index; + float *pmtx = ((float*)xfmem) + 0x500 + postMatrix * 4; //CHECK + //multiply with postmatrix + VtxMulMtx43(TempUVs[j], out, pmtx); + } + + ////////////////////////////////////////////////////////////////////////// + //Step 4: Output the vertex! + ////////////////////////////////////////////////////////////////////////// + for (int j=0; j<2; j++) + chans[j].convertToD3DColor(vbuffer[i].colors[j]); + + vbuffer[i].pos = TempPos; + vbuffer[i].normal = TempNormal; + for (int j=0; j<(int)bpmem.genMode.numtexgens; j++) + { + vbuffer[i].uv[j].u = TempUVs[j].x; + vbuffer[i].uv[j].v = TempUVs[j].y; + vbuffer[i].uv[j].w = TempUVs[j].z; + } + } +} \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoDX9/Src/TransformEngine.h b/Source/Plugins/Plugin_VideoDX9/Src/TransformEngine.h new file mode 100644 index 0000000000..9139812b2a --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/TransformEngine.h @@ -0,0 +1,39 @@ +#ifndef _TRANSFORMENGINE_H +#define _TRANSFORMENGINE_H + +//T&L Engine +//as much work as possible will be delegated to vertex shaders later +//to take full advantage of current PC HW + +#include "VertexHandler.h" +#include "DecodedVArray.h" + +class CTransformEngine +{ + static float* m_pPosMatrix; + static float* m_pNormalMatrix; + static float* m_pTexMatrix[8]; + static float* m_pTexPostMatrix[8]; + +public: + static size_t SaveLoadState(char *ptr, bool save); + static void TransformVertices(int _numVertices, + const DecodedVArray *varray, + D3DVertex *vbuffer); + + static void SetPosNormalMatrix(float *p, float *n) + { + m_pPosMatrix = p; + m_pNormalMatrix = n; + } + static void SetTexMatrix(int i, float *f) + { + m_pTexMatrix[i] = f; + } + static void SetTexPostMatrix(int i, float *f) + { + m_pTexPostMatrix[i] = f; + } +}; + +#endif diff --git a/Source/Plugins/Plugin_VideoDX9/Src/Utils.cpp b/Source/Plugins/Plugin_VideoDX9/Src/Utils.cpp new file mode 100644 index 0000000000..e4893c4ef2 --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/Utils.cpp @@ -0,0 +1,316 @@ +#ifdef _WIN32 +#include "W32Util/Misc.h" +#endif + +#include "Common.h" +#include + +int frameCount; +int lut3to8[8]; +int lut4to8[16]; +int lut5to8[32]; +int lut6to8[64]; +float lutu8tosfloat[256]; +float lutu8toufloat[256]; +float luts8tosfloat[256]; + +void InitLUTs() +{ + for (int i = 0; i < 8; i++) + lut3to8[i] = (i * 255) / 7; + for (int i = 0; i < 16; i++) + lut4to8[i] = (i * 255) / 15; + for (int i = 0; i < 32; i++) + lut5to8[i] = (i * 255) / 31; + for (int i = 0; i < 64; i++) + lut6to8[i] = (i * 255) / 63; + for (int i = 0; i < 256; i++) + { + lutu8tosfloat[i] = (float)(i-128) / 127.0f; + lutu8toufloat[i] = (float)(i) / 255.0f; + luts8tosfloat[i] = ((float)(signed char)(char)i) / 127.0f; + } +} + +// Message handler for about box. +LRESULT CALLBACK AboutProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) +{ + switch (message) + { + case WM_INITDIALOG: + W32Util::CenterWindow(hDlg); + return TRUE; + + case WM_COMMAND: + if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) + { + EndDialog(hDlg, LOWORD(wParam)); + return TRUE; + } + break; + } + return FALSE; +} + + +//////////////////// +// Small profiler // +//////////////////// +#include +#include +#include +using namespace std; + +int g_bWriteProfile=0; + +#ifdef _WIN32 + +#if defined (_MSC_VER) && _MSC_VER >= 1400 +#include +#pragma intrinsic(__rdtsc) +#endif + +static u64 luPerfFreq=0; +inline u64 GET_PROFILE_TIME() +{ +#if defined (_MSC_VER) && _MSC_VER >= 1400 + return __rdtsc(); +#else + LARGE_INTEGER lu; + QueryPerformanceCounter(&lu); + return lu.QuadPart; +#endif +} +#else +static u64 luPerfFreq = 1000000; +#define GET_PROFILE_TIME() //GetCpuTick() +#endif + + +struct DVPROFSTRUCT; + +struct DVPROFSTRUCT +{ + struct DATA + { + DATA(u64 time, u32 user = 0) : dwTime(time), dwUserData(user) {} + DATA() : dwTime(0), dwUserData(0) {} + + u64 dwTime; + u32 dwUserData; + }; + + ~DVPROFSTRUCT() { + list::iterator it = listpChild.begin(); + while(it != listpChild.end() ) { + delete *it; *it = NULL; + ++it; + } + } + + list listTimes; // before DVProfEnd is called, contains the global time it started + // after DVProfEnd is called, contains the time it lasted + // the list contains all the tracked times + char pname[256]; + + list listpChild; // other profilers called during this profiler period +}; + +struct DVPROFTRACK +{ + u32 dwUserData; + DVPROFSTRUCT::DATA* pdwTime; + DVPROFSTRUCT* pprof; +}; + +list g_listCurTracking; // the current profiling functions, the back element is the + // one that will first get popped off the list when DVProfEnd is called + // the pointer is an element in DVPROFSTRUCT::listTimes +list g_listProfilers; // the current profilers, note that these are the parents + // any profiler started during the time of another is held in + // DVPROFSTRUCT::listpChild +list g_listAllProfilers; // ignores the hierarchy, pointer to elements in g_listProfilers + +void DVProfRegister(char* pname) +{ + if( !g_bWriteProfile ) + return; + +#ifdef _WIN32 + if( luPerfFreq <= 1 ) { +#if defined (_MSC_VER) && _MSC_VER >= 1400 + luPerfFreq = 1000000; +#else + LARGE_INTEGER temp; + QueryPerformanceFrequency(&temp); + luPerfFreq = temp.QuadPart; +#endif + } +#endif + + list::iterator it = g_listAllProfilers.begin(); + +// while(it != g_listAllProfilers.end() ) { +// +// if( _tcscmp(pname, (*it)->pname) == 0 ) { +// (*it)->listTimes.push_back(timeGetTime()); +// DVPROFTRACK dvtrack; +// dvtrack.pdwTime = &(*it)->listTimes.back(); +// dvtrack.pprof = *it; +// g_listCurTracking.push_back(dvtrack); +// return; +// } +// +// ++it; +// } + + // else add in a new profiler to the appropriate parent profiler + DVPROFSTRUCT* pprof = NULL; + + if( g_listCurTracking.size() > 0 ) { + assert( g_listCurTracking.back().pprof != NULL ); + g_listCurTracking.back().pprof->listpChild.push_back(new DVPROFSTRUCT()); + pprof = g_listCurTracking.back().pprof->listpChild.back(); + } + else { + g_listProfilers.push_back(DVPROFSTRUCT()); + pprof = &g_listProfilers.back(); + } + + strncpy(pprof->pname, pname, 256); + + // setup the profiler for tracking + pprof->listTimes.push_back(DVPROFSTRUCT::DATA(GET_PROFILE_TIME())); + + DVPROFTRACK dvtrack; + dvtrack.pdwTime = &pprof->listTimes.back(); + dvtrack.pprof = pprof; + dvtrack.dwUserData = 0; + + g_listCurTracking.push_back(dvtrack); + + // add to all profiler list + g_listAllProfilers.push_back(pprof); +} + +void DVProfEnd(u32 dwUserData) +{ + if( !g_bWriteProfile ) + return; + if( g_listCurTracking.size() == 0 ) + return; + + DVPROFTRACK dvtrack = g_listCurTracking.back(); + + assert( dvtrack.pdwTime != NULL && dvtrack.pprof != NULL ); + + dvtrack.pdwTime->dwTime = GET_PROFILE_TIME()- dvtrack.pdwTime->dwTime; + dvtrack.pdwTime->dwUserData= dwUserData; + + g_listCurTracking.pop_back(); +} + +struct DVTIMEINFO +{ + DVTIMEINFO() : uInclusive(0), uExclusive(0) {} + u64 uInclusive, uExclusive; +}; + +map mapAggregateTimes; + +u64 DVProfWriteStruct(FILE* f, DVPROFSTRUCT* p, int ident) +{ + fprintf(f, "%*s%s - ", ident, "", p->pname); + + list::iterator ittime = p->listTimes.begin(); + + u64 utime = 0; + + while(ittime != p->listTimes.end() ) { + utime += ittime->dwTime; + + if( ittime->dwUserData ) + fprintf(f, "time: %d, user: 0x%8.8x", (u32)ittime->dwTime, ittime->dwUserData); + else + fprintf(f, "time: %d", (u32)ittime->dwTime); + ++ittime; + } + + // yes this is necessary, maps have problems with constructors on their type + map::iterator ittimes = mapAggregateTimes.find(p->pname); + if( ittimes == mapAggregateTimes.end() ) { + ittimes = mapAggregateTimes.insert(map::value_type(p->pname, DVTIMEINFO())).first; + ittimes->second.uExclusive = 0; + ittimes->second.uInclusive = 0; + } + + ittimes->second.uInclusive += utime; + + fprintf(f, "\n"); + + list::iterator itprof = p->listpChild.begin(); + + u64 uex = utime; + while(itprof != p->listpChild.end() ) { + + uex -= DVProfWriteStruct(f, *itprof, ident+4); + ++itprof; + } + + if( uex > utime ) { + uex = 0; + } + + ittimes->second.uExclusive += uex; + return utime; +} + +void DVProfWrite(char* pfilename, u32 frames) +{ + assert( pfilename != NULL ); + FILE* f = fopen(pfilename, "w"); + + // pop back any unused + mapAggregateTimes.clear(); + list::iterator it = g_listProfilers.begin(); + + while(it != g_listProfilers.end() ) { + DVProfWriteStruct(f, &(*it), 0); + ++it; + } + + { + map::iterator it; + fprintf(f, "\n\n-------------------------------------------------------------------\n\n"); + + u64 uTotal[2] = {0}; + double fiTotalTime[2]; + + for(it = mapAggregateTimes.begin(); it != mapAggregateTimes.end(); ++it) { + uTotal[0] += it->second.uExclusive; + uTotal[1] += it->second.uInclusive; + } + + fprintf(f, "total times (%d): ex: %Lu ", frames, 1000000*uTotal[0]/(luPerfFreq*(u64)frames)); + fprintf(f, "inc: %Lu\n", 1000000 * uTotal[1]/(luPerfFreq*(u64)frames)); + + fiTotalTime[0] = 1.0 / (double)uTotal[0]; + fiTotalTime[1] = 1.0 / (double)uTotal[1]; + + // output the combined times + for(it = mapAggregateTimes.begin(); it != mapAggregateTimes.end(); ++it) { + fprintf(f, "%s - ex: %f inc: %f\n", it->first.c_str(), (float)((double)it->second.uExclusive * fiTotalTime[0]), + (float)((double)it->second.uInclusive * fiTotalTime[1])); + } + } + + + fclose(f); +} + +void DVProfClear() +{ + g_listCurTracking.clear(); + g_listProfilers.clear(); + g_listAllProfilers.clear(); +} diff --git a/Source/Plugins/Plugin_VideoDX9/Src/Utils.h b/Source/Plugins/Plugin_VideoDX9/Src/Utils.h new file mode 100644 index 0000000000..ae5c242734 --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/Utils.h @@ -0,0 +1,105 @@ +#ifndef _UTILS_H +#define _UTILS_H + + +#include "Common.h" +#include "main.h" + +extern int frameCount; +extern int lut3to8[8]; +extern int lut4to8[16]; +extern int lut5to8[32]; +extern int lut6to8[64]; +extern float lutu8tosfloat[256]; +extern float lutu8toufloat[256]; +extern float luts8tosfloat[256]; + +LRESULT CALLBACK AboutProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); +void InitLUTs(); + + +//#define RAM_MASK 0x1FFFFFF + +inline u8 *Memory_GetPtr(u32 _uAddress) +{ + return g_VideoInitialize.pGetMemoryPointer(_uAddress); +} + +inline u8 Memory_Read_U8(u32 _uAddress) +{ + return *g_VideoInitialize.pGetMemoryPointer(_uAddress); +} + +inline u16 Memory_Read_U16(u32 _uAddress) +{ + return _byteswap_ushort(*(u16*)g_VideoInitialize.pGetMemoryPointer(_uAddress)); +// return _byteswap_ushort(*(u16*)&g_pMemory[_uAddress & RAM_MASK]); +} + +inline u32 Memory_Read_U32(u32 _uAddress) +{ + if (_uAddress == 0x020143a8) + { + int i =0; + } + return _byteswap_ulong(*(u32*)g_VideoInitialize.pGetMemoryPointer(_uAddress)); +// return _byteswap_ulong(*(u32*)&g_pMemory[_uAddress & RAM_MASK]); +} + +inline float Memory_Read_Float(u32 _uAddress) +{ + u32 uTemp = Memory_Read_U32(_uAddress); + return *(float*)&uTemp; +} + +//// +// profiling +/// + +extern int g_bWriteProfile; // global variable to enable/disable profiling (if DVPROFILE is defined) + +// IMPORTANT: For every Reigster there must be an End +void DVProfRegister(char* pname); // first checks if this profiler exists in g_listProfilers +void DVProfEnd(u32 dwUserData); +void DVProfWrite(char* pfilename, u32 frames = 0); +void DVProfClear(); // clears all the profilers + +// #define DVPROFILE // comment out to disable profiling + +#if defined(DVPROFILE) && (defined(_WIN32)||defined(WIN32)) + +#ifdef _MSC_VER + +#ifndef __PRETTY_FUNCTION__ +#define __PRETTY_FUNCTION__ __FUNCTION__ +#endif + +#endif + +#define DVSTARTPROFILE() DVProfileFunc _pf(__PRETTY_FUNCTION__); + +class DVProfileFunc +{ +public: + u32 dwUserData; + DVProfileFunc(char* pname) { DVProfRegister(pname); dwUserData = 0; } + DVProfileFunc(char* pname, u32 dwUserData) : dwUserData(dwUserData) { DVProfRegister(pname); } + ~DVProfileFunc() { DVProfEnd(dwUserData); } +}; + +#else + +#define DVSTARTPROFILE() + +class DVProfileFunc +{ +public: + u32 dwUserData; + __forceinline DVProfileFunc(char* pname) {} + __forceinline DVProfileFunc(char* pname, u32 dwUserData) { } + ~DVProfileFunc() {} +}; + +#endif + +#endif diff --git a/Source/Plugins/Plugin_VideoDX9/Src/Vec3.h b/Source/Plugins/Plugin_VideoDX9/Src/Vec3.h new file mode 100644 index 0000000000..41c6ab362a --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/Vec3.h @@ -0,0 +1,98 @@ +#ifndef _VEC3_H +#define _VEC3_H + +#include +#include + +class Vec3 +{ +public: + float x,y,z; + Vec3() { } + explicit Vec3(float f) {x=y=z=f;} + Vec3(const float _x, const float _y, const float _z) { + x=_x; y=_y; z=_z; + } + void set(const float _x, const float _y, const float _z) { + x=_x; y=_y; z=_z; + } + Vec3 operator + (const Vec3 &other) const { + return Vec3(x+other.x, y+other.y, z+other.z); + } + void operator += (const Vec3 &other) { + x+=other.x; y+=other.y; z+=other.z; + } + Vec3 operator -(const Vec3 &v) const { + return Vec3(x-v.x,y-v.y,z-v.z); + } + void operator -= (const Vec3 &other) + { + x-=other.x; y-=other.y; z-=other.z; + } + Vec3 operator -() const { + return Vec3(-x,-y,-z); + } + + Vec3 operator * (const float f) const { + return Vec3(x*f,y*f,z*f); + } + Vec3 operator / (const float f) const { + float invf = (1.0f/f); + return Vec3(x*invf,y*invf,z*invf); + } + void operator /= (const float f) + { + *this = *this / f; + } + float operator * (const Vec3 &other) const { + return x*other.x + y*other.y + z*other.z; + } + void operator *= (const float f) { + *this = *this * f; + } + Vec3 scaled_by(const Vec3 &other) const { + return Vec3(x*other.x, y*other.y, z*other.z); + } + + Vec3 operator %(const Vec3 &v) const { + return Vec3(y*v.z-z*v.y, z*v.x-x*v.z, x*v.y-y*v.x); + } + float length2() const { + return x*x+y*y+z*z; + } + float length() const { + return sqrtf(length2()); + } + float distance2_to(Vec3 &other) + { + return (other-(*this)).length2(); + } + Vec3 normalized() const { + return (*this) / length(); + + } + void normalize() { + (*this) /= length(); + } + float &operator [] (int i) + { + return *((&x) + i); + } + const float operator [] (const int i) const + { + return *((&x) + i); + } + bool operator == (const Vec3 &other) const + { + if (x==other.x && y==other.y && z==other.z) + return true; + else + return false; + } + void setZero() + { + memset((void *)this,0,sizeof(float)*3); + } +}; + +#endif \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoDX9/Src/VertexHandler.cpp b/Source/Plugins/Plugin_VideoDX9/Src/VertexHandler.cpp new file mode 100644 index 0000000000..10c16d40fa --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/VertexHandler.cpp @@ -0,0 +1,257 @@ +#include "D3DBase.h" + +#include "Common.h" +#include "Globals.h" +#include "VertexHandler.h" +#include "OpcodeDecoding.h" +#include "TransformEngine.h" +#include "IndexGenerator.h" +#include "BPStructs.h" +#include "XFStructs.h" +#include "ShaderManager.h" +#include "Utils.h" + +using namespace D3D; + +//TODO(ector): remove and calculate inline? +float shiftLookup[32]; + +IndexGenerator indexGen; +Collection CVertexHandler::collection; + +LPDIRECT3DVERTEXDECLARATION9 vDecl; + +D3DVertex *fakeVBuffer; +u16 *fakeIBuffer; + +#define MAXVBUFFERSIZE 65536*3 +#define MAXIBUFFERSIZE 65536*3 + +const D3DVERTEXELEMENT9 decl[] = +{ + { 0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 }, + { 0, 12, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0 }, + { 0, 24, D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR, 0 }, + { 0, 28, D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR, 1 }, + { 0, 32+12*0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 }, + { 0, 32+12*1, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 1 }, + { 0, 32+12*2, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 2 }, + { 0, 32+12*3, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 3 }, + { 0, 32+12*4, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 4 }, + { 0, 32+12*5, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 5 }, + { 0, 32+12*6, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 6 }, + { 0, 32+12*7, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 7 }, + D3DDECL_END() +}; + +void CVertexHandler::Init() +{ + collection = C_NOTHING; + + for (int i = 0; i < 31; i++) + shiftLookup[i] = 1.0f / float(1 << i); + + fakeVBuffer = new D3DVertex[65536]; + fakeIBuffer = new u16[65536]; + CreateDeviceObjects(); +} + + +void CVertexHandler::Shutdown() +{ + DestroyDeviceObjects(); + delete [] fakeVBuffer; + delete [] fakeIBuffer; +} + +void CVertexHandler::CreateDeviceObjects() +{ + HRESULT hr; + if( FAILED( hr = D3D::dev->CreateVertexDeclaration( decl, &vDecl) ) ) + { + MessageBox(0,"Failed to create vertex declaration","sdfsd",0); + return; + } +} + +void CVertexHandler::BeginFrame() +{ + D3D::dev->SetVertexDeclaration(vDecl); + //D3D::dev->SetStreamSource(0,vBuffer,0,sizeof(D3DVertex)); +} + +void CVertexHandler::DestroyDeviceObjects() +{ + if (vDecl) + vDecl->Release(); + vDecl=0; +} + + +void CVertexHandler::AddIndices(int _primitive, int _numVertices) +{ + switch(_primitive) { + case GX_DRAW_QUADS: indexGen.AddQuads(_numVertices); return; + case GX_DRAW_TRIANGLES: indexGen.AddList(_numVertices); return; + case GX_DRAW_TRIANGLE_STRIP: indexGen.AddStrip(_numVertices); return; + case GX_DRAW_TRIANGLE_FAN: indexGen.AddFan(_numVertices); return; + case GX_DRAW_LINE_STRIP: indexGen.AddLineStrip(_numVertices); return; + case GX_DRAW_LINES: indexGen.AddLineList(_numVertices); return; + case GX_DRAW_POINTS: indexGen.AddPointList(_numVertices); return; + } +} + +const Collection collectionTypeLUT[8] = +{ + C_TRIANGLES,//quads + C_NOTHING, //nothing + C_TRIANGLES,//triangles + C_TRIANGLES,//strip + C_TRIANGLES,//fan + C_LINES, //lines + C_LINES, //linestrip + C_POINTS //guess :P +}; + +D3DVertex *vbufferwrite; + +void CVertexHandler::DrawVertices(int _primitive, int _numVertices, const DecodedVArray *varray) +{ + if (_numVertices <= 0) //This check is pretty stupid... + return; + + Collection type = collectionTypeLUT[_primitive]; + if (type == C_NOTHING) + return; + + DVSTARTPROFILE(); + _assert_msg_(type != C_NOTHING, "type == C_NOTHING!!", "WTF"); + + if (indexGen.GetNumVerts() > 1000) // TODO(ector): Raise? + Flush(); + + ADDSTAT(stats.thisFrame.numPrims, _numVertices); + + if (collection != type) + { + //We are NOT collecting the right type. + Flush(); + collection = type; + u16 *ptr = 0; + + if (type != C_POINTS) + { + ptr = fakeIBuffer; + indexGen.Start((unsigned short*)ptr); + AddIndices(_primitive,_numVertices); + } + + vbufferwrite = fakeVBuffer; + + if (_numVertices >= MAXVBUFFERSIZE) + MessageBox(NULL, "To much vertices for the buffer", "Video.DLL", MB_OK); + + CTransformEngine::TransformVertices(_numVertices,varray,vbufferwrite); + } + else //We are collecting the right type, keep going + { + _assert_msg_(vbufferwrite!=0, "collecting: vbufferwrite == 0!","WTF"); + INCSTAT(stats.numJoins); + //Success, keep adding to unlocked buffer + int last=indexGen.GetNumVerts(); + AddIndices(_primitive,_numVertices); + + if (_numVertices >= MAXVBUFFERSIZE) + MessageBox(NULL, "Too many vertices for the buffer", "Video.DLL", MB_OK); + CTransformEngine::TransformVertices(_numVertices,varray,vbufferwrite + last); + } +} + +const D3DPRIMITIVETYPE pts[3] = +{ + D3DPT_POINTLIST, //DUMMY + D3DPT_TRIANGLELIST, + D3DPT_LINELIST, +}; + +void CVertexHandler::Flush() +{ + DVSTARTPROFILE(); + + if (collection != C_NOTHING) + { + ActivateTextures(); + + int numVertices = indexGen.GetNumVerts(); + if (numVertices != 0) + { + PShaderCache::SetShader(); // TODO(ector): only do this if shader has changed + VShaderCache::SetShader(); // TODO(ector): only do this if shader has changed + if (collection != C_POINTS) + { + int numPrimitives = indexGen.GetNumPrims(); + D3D::dev->DrawIndexedPrimitiveUP(pts[(int)collection], + 0, + numVertices, + numPrimitives, + fakeIBuffer, + D3DFMT_INDEX16, + fakeVBuffer, + sizeof(D3DVertex)); + } + else + { + D3D::dev->SetIndices(0); + D3D::dev->DrawPrimitiveUP(D3DPT_POINTLIST, + numVertices, + fakeVBuffer, + sizeof(D3DVertex)); + } + } + collection = C_NOTHING; + } +} + + +/* + char szTmp[256]; + sprintf(szTmp, "Batch size : %i",_numVertices); + g_VideoInitialize.pLog(szTmp); + + + char szTemp[256]; + sprintf(szTemp, "count: %i", count); + SendMessage(g_VideoInitialize.hStatusBar, SB_SETTEXT,0,(LPARAM)szTemp); + + static bool bWaitStep = false; + if (count == 24800) + { + bWaitStep = true; + Renderer::Flush(); + } + if (GetAsyncKeyState('J')) + bWaitStep = true; + if (GetAsyncKeyState('U')) + bWaitStep = false; + + if (bWaitStep) + { + static bool bKey = false; + while (GetAsyncKeyState('H') == 0) + { + if (GetAsyncKeyState(VK_SPACE)) + _asm int 3; + if (GetAsyncKeyState('U')) + { + bWaitStep = false; + break; + } + } + Renderer::Flush(); + // wait for key release + while (GetAsyncKeyState ('H')){ + }; + } +} +*/ +// old = bpmem.combiners[0].colorC.hex; diff --git a/Source/Plugins/Plugin_VideoDX9/Src/VertexHandler.h b/Source/Plugins/Plugin_VideoDX9/Src/VertexHandler.h new file mode 100644 index 0000000000..4b0e7db3da --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/VertexHandler.h @@ -0,0 +1,51 @@ + +#pragma once + +#include "CPStructs.h" +#include "VertexLoader.h" +#include "DecodedVArray.h" + +extern float shiftLookup[32]; + +struct UV +{ + float u,v,w; +}; + +struct D3DVertex { + Vec3 pos; + Vec3 normal; + u32 colors[2]; + UV uv[8]; +}; + +enum Collection +{ + C_NOTHING=0, + C_TRIANGLES=1, + C_LINES=2, + C_POINTS=3 +}; +extern const Collection collectionTypeLUT[8]; + +class CVertexHandler +{ +private: + static Collection collection; + // Pipeline + + static void PrepareRender(); + static void AddIndices(int _primitive, int _numVertices); + +public: + static void Init(); + static void Shutdown(); + + static void BeginFrame(); + + static void CreateDeviceObjects(); + static void DestroyDeviceObjects(); + + static void DrawVertices(int _primitive, int _numVertices, const DecodedVArray *varray); + static void Flush(); +}; diff --git a/Source/Plugins/Plugin_VideoDX9/Src/VertexLoader.cpp b/Source/Plugins/Plugin_VideoDX9/Src/VertexLoader.cpp new file mode 100644 index 0000000000..9afa86fcb1 --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/VertexLoader.cpp @@ -0,0 +1,408 @@ +#include + +#include "x64Emitter.h" + +#include "Common.h" +#include "VertexHandler.h" +#include "VertexLoader.h" +#include "XFStructs.h" +#include "BPStructs.h" +#include "DataReader.h" +#include "DecodedVArray.h" + +//these don't need to be saved +float posScale; +float tcScale[8]; +int tcElements[8]; +int tcFormat[8]; +int colElements[2]; +float tcScaleU[8]; +float tcScaleV[8]; +int tcIndex; +int colIndex; +u32 addr; + +DecodedVArray *varray; + +int ComputeVertexSize(u32 comp) +{ + int size = 0; + if (comp & VB_HAS_POSMTXIDX) + size += 4; + if (comp & (VB_HAS_TEXMTXIDX0 | VB_HAS_TEXMTXIDX1 | VB_HAS_TEXMTXIDX2 | VB_HAS_TEXMTXIDX3)) + size += 4; + if (comp & (VB_HAS_TEXMTXIDX4 | VB_HAS_TEXMTXIDX5 | VB_HAS_TEXMTXIDX6 | VB_HAS_TEXMTXIDX7)) + size += 4; + if (comp & VB_HAS_NRM0) + size += 4; + if (comp & (VB_HAS_NRM1|VB_HAS_NRM2)) //combine into single check for speed + size += 8; + if (comp & VB_HAS_COL0) + size += 4; + if (comp & VB_HAS_COL1) + size += 4; + for (int i = 0; i < 8; i++) + if (comp & (VB_HAS_UV0 << i)) + size += 8; + return size; +} + +void VertexLoader::SetVArray(DecodedVArray *_varray) +{ + varray = _varray; +} +/* +inline u8 ReadBuffer8() { return fifo.Read8(); } +inline u16 ReadBuffer16() { return fifo.Read16(); } +inline u32 ReadBuffer32() { return fifo.Read32(); } +inline float ReadBuffer32F() { return fifo.Read32F(); } +*/ +inline u8 ReadBuffer8() +{ + return g_pDataReader->Read8(); +} + +inline u16 ReadBuffer16() +{ + //PowerPC byte ordering :( + return g_pDataReader->Read16(); +} + +inline u32 ReadBuffer32() +{ + //PowerPC byte ordering :( + return g_pDataReader->Read32(); +} + +inline float ReadBuffer32F() +{ + u32 temp = g_pDataReader->Read32(); + return *(float*)(&temp); +} + +#include "VertexLoader_MtxIndex.h" +#include "VertexLoader_Position.h" +#include "VertexLoader_Normal.h" +#include "VertexLoader_Color.h" +#include "VertexLoader_textCoord.h" + +VertexLoader g_VertexLoaders[8]; +TVtxDesc VertexLoader::m_VtxDesc; +bool VertexLoader::m_DescDirty = true; + +VertexLoader::VertexLoader() +{ + m_numPipelineStates = 0; + m_VertexSize = 0; + m_AttrDirty = true; + VertexLoader_Normal::Init(); +} + +VertexLoader::~VertexLoader() +{ + +} + +void VertexLoader::Setup() +{ + if (!m_AttrDirty && !m_DescDirty) + return; + + DVSTARTPROFILE(); + + // Reset pipeline + m_VertexSize = 0; + m_numPipelineStates = 0; + m_components = 0; + + // Position Matrix Index + if (m_VtxDesc.PosMatIdx) + { + m_PipelineStates[m_numPipelineStates++] = PosMtx_ReadDirect_UByte; + m_VertexSize += 1; + m_components |= VB_HAS_POSMTXIDX; + } + + // Texture matrix indices + if (m_VtxDesc.Tex0MatIdx) {m_components|=VB_HAS_TEXMTXIDX0; WriteCall(TexMtx_ReadDirect_UByte0); m_VertexSize+=1;} + if (m_VtxDesc.Tex1MatIdx) {m_components|=VB_HAS_TEXMTXIDX1; WriteCall(TexMtx_ReadDirect_UByte1); m_VertexSize+=1;} + if (m_VtxDesc.Tex2MatIdx) {m_components|=VB_HAS_TEXMTXIDX2; WriteCall(TexMtx_ReadDirect_UByte2); m_VertexSize+=1;} + if (m_VtxDesc.Tex3MatIdx) {m_components|=VB_HAS_TEXMTXIDX3; WriteCall(TexMtx_ReadDirect_UByte3); m_VertexSize+=1;} + if (m_VtxDesc.Tex4MatIdx) {m_components|=VB_HAS_TEXMTXIDX4; WriteCall(TexMtx_ReadDirect_UByte4); m_VertexSize+=1;} + if (m_VtxDesc.Tex5MatIdx) {m_components|=VB_HAS_TEXMTXIDX5; WriteCall(TexMtx_ReadDirect_UByte5); m_VertexSize+=1;} + if (m_VtxDesc.Tex6MatIdx) {m_components|=VB_HAS_TEXMTXIDX6; WriteCall(TexMtx_ReadDirect_UByte6); m_VertexSize+=1;} + if (m_VtxDesc.Tex7MatIdx) {m_components|=VB_HAS_TEXMTXIDX7; WriteCall(TexMtx_ReadDirect_UByte7); m_VertexSize+=1;} + + // Position + switch (m_VtxDesc.Position) + { + case NOT_PRESENT: {_assert_msg_(0,"Vertex descriptor without position!","WTF?");} break; + case DIRECT: + { + int SizePro = 0; + switch (m_VtxAttr.PosFormat) + { + case FORMAT_UBYTE: SizePro=1; WriteCall(Pos_ReadDirect_UByte); break; + case FORMAT_BYTE: SizePro=1; WriteCall(Pos_ReadDirect_Byte); break; + case FORMAT_USHORT: SizePro=2; WriteCall(Pos_ReadDirect_UShort); break; + case FORMAT_SHORT: SizePro=2; WriteCall(Pos_ReadDirect_Short); break; + case FORMAT_FLOAT: SizePro=4; WriteCall(Pos_ReadDirect_Float); break; + default: _assert_(0); break; + } + if (m_VtxAttr.PosElements == 1) + m_VertexSize += SizePro * 3; + else + m_VertexSize += SizePro * 2; + } + break; + case INDEX8: + m_VertexSize+=1; + switch (m_VtxAttr.PosFormat) + { + case FORMAT_UBYTE: WriteCall(Pos_ReadIndex8_UByte); break; //WTF? + case FORMAT_BYTE: WriteCall(Pos_ReadIndex8_Byte); break; + case FORMAT_USHORT: WriteCall(Pos_ReadIndex8_UShort); break; + case FORMAT_SHORT: WriteCall(Pos_ReadIndex8_Short); break; + case FORMAT_FLOAT: WriteCall(Pos_ReadIndex8_Float); break; + default: _assert_(0); break; + } + break; + case INDEX16: + m_VertexSize+=2; + switch (m_VtxAttr.PosFormat) + { + case FORMAT_UBYTE: WriteCall(Pos_ReadIndex16_UByte); break; + case FORMAT_BYTE: WriteCall(Pos_ReadIndex16_Byte); break; + case FORMAT_USHORT: WriteCall(Pos_ReadIndex16_UShort); break; + case FORMAT_SHORT: WriteCall(Pos_ReadIndex16_Short); break; + case FORMAT_FLOAT: WriteCall(Pos_ReadIndex16_Float); break; + default: _assert_(0); break; + } + break; + } + + // Normals + if (m_VtxDesc.Normal != NOT_PRESENT) + { + VertexLoader_Normal::index3 = m_VtxAttr.NormalIndex3 ? true : false; + unsigned int uSize = VertexLoader_Normal::GetSize(m_VtxDesc.Normal, m_VtxAttr.NormalFormat, m_VtxAttr.NormalElements); + TPipelineFunction pFunc = VertexLoader_Normal::GetFunction(m_VtxDesc.Normal, m_VtxAttr.NormalFormat, m_VtxAttr.NormalElements); + if (pFunc == 0) + { + char temp[256]; + sprintf(temp,"%i %i %i", m_VtxDesc.Normal, m_VtxAttr.NormalFormat, m_VtxAttr.NormalElements); + MessageBox(0,"VertexLoader_Normal::GetFunction returned zero!",temp,0); + } + WriteCall(pFunc); + m_VertexSize += uSize; + int m_numNormals = (m_VtxAttr.NormalElements==1) ? NRM_THREE : NRM_ONE; + m_components |= VB_HAS_NRM0; + if (m_numNormals == NRM_THREE) + m_components |= VB_HAS_NRM1 | VB_HAS_NRM2; + } + + // Colors + int col[2] = {m_VtxDesc.Color0, m_VtxDesc.Color1}; + for (int i = 0; i < 2; i++) + SetupColor(i,col[i], m_VtxAttr.color[i].Comp, m_VtxAttr.color[i].Elements); + + // TextureCoord + int tc[8] = { + m_VtxDesc.Tex0Coord, m_VtxDesc.Tex1Coord, m_VtxDesc.Tex2Coord, m_VtxDesc.Tex3Coord, + m_VtxDesc.Tex4Coord, m_VtxDesc.Tex5Coord, m_VtxDesc.Tex6Coord, m_VtxDesc.Tex7Coord, + }; + for (int i = 0; i < 8; i++) + SetupTexCoord(i, tc[i], + m_VtxAttr.texCoord[i].Format, + m_VtxAttr.texCoord[i].Elements, + m_VtxAttr.texCoord[i].Frac); + + Compile(); + //RET(); +/* + char temp[256]; + sprintf(temp,"Size: %08x Pos: %i Norm:%i Col0: %i Col1: %i",m_VertexSize,m_VtxDesc.Position,m_VtxDesc.Normal,m_VtxDesc.Color0,m_VtxDesc.Color1); + g_VideoInitialize.pLog(temp); + sprintf(temp,"Pos: %i Norm:%i Col0: %i Col1: %i",_VtxAttr.PosFormat,_VtxAttr.NormalFormat,_VtxAttr.color[0].Comp,_VtxAttr.color[1].Comp); + g_VideoInitialize.pLog(temp);*/ +} + +void VertexLoader::SetupColor(int num, int mode, int format, int elements) +{ + m_components |= VB_HAS_COL0 << num; + switch (mode) + { + case NOT_PRESENT: + m_components &= ~(VB_HAS_COL0 << num); + break; + case DIRECT: + switch (format) + { + case FORMAT_16B_565: m_VertexSize+=2; WriteCall(Color_ReadDirect_16b_565); break; + case FORMAT_24B_888: m_VertexSize+=3; WriteCall(Color_ReadDirect_24b_888); break; + case FORMAT_32B_888x: m_VertexSize+=4; WriteCall(Color_ReadDirect_32b_888x); break; + case FORMAT_16B_4444: m_VertexSize+=2; WriteCall(Color_ReadDirect_16b_4444); break; + case FORMAT_24B_6666: m_VertexSize+=3; WriteCall(Color_ReadDirect_24b_6666); break; + case FORMAT_32B_8888: m_VertexSize+=4; WriteCall(Color_ReadDirect_32b_8888); break; + default: _assert_(0); break; + } + break; + case INDEX8: + switch (format) + { + case FORMAT_16B_565: WriteCall(Color_ReadIndex8_16b_565); break; + case FORMAT_24B_888: WriteCall(Color_ReadIndex8_24b_888); break; + case FORMAT_32B_888x: WriteCall(Color_ReadIndex8_32b_888x); break; + case FORMAT_16B_4444: WriteCall(Color_ReadIndex8_16b_4444); break; + case FORMAT_24B_6666: WriteCall(Color_ReadIndex8_24b_6666); break; + case FORMAT_32B_8888: WriteCall(Color_ReadIndex8_32b_8888); break; + default: _assert_(0); break; + } + m_VertexSize+=1; + break; + case INDEX16: + switch (format) + { + case FORMAT_16B_565: WriteCall(Color_ReadIndex16_16b_565); break; + case FORMAT_24B_888: WriteCall(Color_ReadIndex16_24b_888); break; + case FORMAT_32B_888x: WriteCall(Color_ReadIndex16_32b_888x); break; + case FORMAT_16B_4444: WriteCall(Color_ReadIndex16_16b_4444); break; + case FORMAT_24B_6666: WriteCall(Color_ReadIndex16_24b_6666); break; + case FORMAT_32B_8888: WriteCall(Color_ReadIndex16_32b_8888); break; + default: _assert_(0); break; + } + m_VertexSize+=2; + break; + } +} + +void VertexLoader::SetupTexCoord(int num, int mode, int format, int elements, int _iFrac) +{ + m_components |= VB_HAS_UV0 << num; + switch (mode) + { + case NOT_PRESENT: + m_components &= ~(VB_HAS_UV0 << num); + break; + case DIRECT: + { + int sizePro=0; + switch (format) + { + case FORMAT_UBYTE: sizePro=1; WriteCall(TexCoord_ReadDirect_UByte); break; + case FORMAT_BYTE: sizePro=1; WriteCall(TexCoord_ReadDirect_Byte); break; + case FORMAT_USHORT: sizePro=2; WriteCall(TexCoord_ReadDirect_UShort); break; + case FORMAT_SHORT: sizePro=2; WriteCall(TexCoord_ReadDirect_Short); break; + case FORMAT_FLOAT: sizePro=4; WriteCall(TexCoord_ReadDirect_Float); break; + default: _assert_(0); break; + } + m_VertexSize += sizePro * (elements?2:1); + } + break; + case INDEX8: + switch (format) + { + case FORMAT_UBYTE: WriteCall(TexCoord_ReadIndex8_UByte); break; + case FORMAT_BYTE: WriteCall(TexCoord_ReadIndex8_Byte); break; + case FORMAT_USHORT: WriteCall(TexCoord_ReadIndex8_UShort); break; + case FORMAT_SHORT: WriteCall(TexCoord_ReadIndex8_Short); break; + case FORMAT_FLOAT: WriteCall(TexCoord_ReadIndex8_Float); break; + default: _assert_(0); break; + } + m_VertexSize+=1; + break; + case INDEX16: + switch (format) + { + case FORMAT_UBYTE: WriteCall(TexCoord_ReadIndex16_UByte); break; + case FORMAT_BYTE: WriteCall(TexCoord_ReadIndex16_Byte); break; + case FORMAT_USHORT: WriteCall(TexCoord_ReadIndex16_UShort); break; + case FORMAT_SHORT: WriteCall(TexCoord_ReadIndex16_Short); break; + case FORMAT_FLOAT: WriteCall(TexCoord_ReadIndex16_Float); break; + default: _assert_(0); + } + m_VertexSize+=2; + break; + } +} + +void VertexLoader::WriteCall(void (LOADERDECL *func)(void *)) +{ + m_PipelineStates[m_numPipelineStates++] = func;; +} + +using namespace Gen; + +// See comment in RunVertices +void VertexLoader::Compile() +{ + return; +/* Gen::SetCodePtr(m_compiledCode); + //INT3(); + Gen::Util::EmitPrologue(0); + + const u8 *loopStart = Gen::GetCodePtr(); + MOV(32, M(&tcIndex), Imm32(0)); + MOV(32, M(&colIndex), Imm32(0)); + + for (int i = 0; i < m_numPipelineStates; i++) + { + PUSH(32, Imm32((u32)&m_VtxAttr)); + CALL(m_PipelineStates[i]); + ADD(32, R(ESP), Imm8(4)); + } + + ADD(32, M(&varray->count), Imm8(1)); + SUB(32, M(&this->m_counter), Imm8(1)); + J_CC(CC_NZ, loopStart, true); + // Epilogue + Gen::Util::EmitEpilogue(0); + if (Gen::GetCodePtr()-(u8*)m_compiledCode > sizeof(m_compiledCode)) + { + Crash(); + }*/ +} + +void VertexLoader::PrepareRun() +{ + posScale = shiftLookup[m_VtxAttr.PosFrac]; + for (int i = 0; i < 8; i++) + { + tcScaleU[i] = shiftLookup[m_VtxAttr.texCoord[i].Frac]; + tcScaleV[i] = shiftLookup[m_VtxAttr.texCoord[i].Frac]; + tcElements[i] = m_VtxAttr.texCoord[i].Elements; + tcFormat[i] = m_VtxAttr.texCoord[i].Format; + } + for (int i = 0; i < 2; i++) + colElements[i] = m_VtxAttr.color[i].Elements; + + varray->Reset(); + varray->SetComponents(m_components); +} + +void VertexLoader::RunVertices(int count) +{ + DVSTARTPROFILE(); + + for (int v = 0; v < count; v++) + { + tcIndex = 0; + colIndex = 0; + for (int i = 0; i < m_numPipelineStates; i++) + { + m_PipelineStates[i](&m_VtxAttr); + } + varray->Next(); + } + /* + This is not the bottleneck ATM, so compiling etc doesn't really help. + At least not when all we do is compile it to a list of function calls. + Should help more when we inline, but this requires the new vertex format. + Maybe later, and with smarter caching. + + if (count) + { + this->m_counter = count; + ((void (*)())((void*)&m_compiledCode[0]))(); + }*/ +} \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoDX9/Src/VertexLoader.h b/Source/Plugins/Plugin_VideoDX9/Src/VertexLoader.h new file mode 100644 index 0000000000..fcd7c9a165 --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/VertexLoader.h @@ -0,0 +1,203 @@ +#ifndef _VERTEXLOADER_H +#define _VERTEXLOADER_H + +/* +Ideas for new intermediate vertex format + +Produce a mask specifying with components are present. + +Decoder always produces a canonical format for all components: + +Ubyte4 for matrix indices (x,y,z,w) and colors + +FloatN for all others, texcoords are always XY at this stage + +The decoders will write a continuous stream of vertices, to take maximum +advantage of write combining hardware + +a map will keep track of vertex declarations + +this time, we are going to minimize transfers to the gfx card + +it turns out that with PS2.0 we can easily do all the pipeline in hardware. +The decision will be how granular to be with the number of shaders and lighting settin + +*/ + +enum { + VB_HAS_POSMTXIDX =(1<<1), + VB_HAS_TEXMTXIDX0=(1<<2), + VB_HAS_TEXMTXIDX1=(1<<3), + VB_HAS_TEXMTXIDX2=(1<<4), + VB_HAS_TEXMTXIDX3=(1<<5), + VB_HAS_TEXMTXIDX4=(1<<6), + VB_HAS_TEXMTXIDX5=(1<<7), + VB_HAS_TEXMTXIDX6=(1<<8), + VB_HAS_TEXMTXIDX7=(1<<9), + //VB_HAS_POS=0, // Implied, it always has pos! don't bother testing + VB_HAS_NRM0=(1<<10), + VB_HAS_NRM1=(1<<11), + VB_HAS_NRM2=(1<<12), + + VB_HAS_COL0=(1<<13), + VB_HAS_COL1=(1<<14), + + VB_HAS_UV0=(1<<15), + VB_HAS_UV1=(1<<16), + VB_HAS_UV2=(1<<17), + VB_HAS_UV3=(1<<18), + VB_HAS_UV4=(1<<19), + VB_HAS_UV5=(1<<20), + VB_HAS_UV6=(1<<21), + VB_HAS_UV7=(1<<22), +}; + +int ComputeVertexSize(u32 components); + +#include "CPStructs.h" +#include "DecodedVArray.h" + +#define LOADERDECL __cdecl +typedef void (LOADERDECL *TPipelineFunction)(void*); + +class VertexLoader +{ +public: + enum + { + NRM_ZERO = 0, + NRM_ONE = 1, + NRM_THREE = 3 + }; + +private: + TPipelineFunction m_PipelineStates[32]; + int m_numPipelineStates; + int m_VertexSize; + int m_counter; + u8 m_compiledCode[1024]; + + u32 m_components; + + UVAT_group0 m_group0; + UVAT_group1 m_group1; + UVAT_group2 m_group2; + + bool m_AttrDirty; + + TVtxAttr m_VtxAttr; //Decoded into easy format + + //common for all loaders + static TVtxDesc m_VtxDesc; + static bool m_DescDirty; + + // seup the pipeline with this vertex fmt + void SetupColor(int num, int _iMode, int _iFormat, int _iElements); + void SetupTexCoord(int num, int _iMode, int _iFormat, int _iElements, int _iFrac); + +public: + // constructor + VertexLoader(); + ~VertexLoader(); + // run the pipeline + static void SetVArray(DecodedVArray *_varray); + void Setup(); + void Compile(); + void PrepareRun(); + void RunVertices(int count); + void WriteCall(void (LOADERDECL *func)(void *)); + int GetVertexSize(){return m_VertexSize;} + + //VtxDesc - global + static void SetVtxDesc_Lo(u32 _iValue) + { + u64 old = m_VtxDesc.Hex; + m_VtxDesc.Hex &= ~0x1FFFF; // keep the Upper bits + m_VtxDesc.Hex |= _iValue; + if (m_VtxDesc.Hex != old) + m_DescDirty = true; + }; + + static void SetVtxDesc_Hi(u32 _iValue) + { + u64 old = m_VtxDesc.Hex; + m_VtxDesc.Hex &= 0x1FFFF; // keep the lower 17Bits + m_VtxDesc.Hex |= (u64)_iValue << 17; + if (m_VtxDesc.Hex != old) + m_DescDirty = true; + }; + + static TVtxDesc &GetVtxDesc() {return m_VtxDesc;} + + void SetVAT_group0(u32 _group0) + { + if (!m_AttrDirty && m_group0.Hex == _group0) + return; + m_AttrDirty = true; + m_group0.Hex = _group0; + + m_VtxAttr.PosElements = m_group0.PosElements; + m_VtxAttr.PosFormat = m_group0.PosFormat; + m_VtxAttr.PosFrac = m_group0.PosFrac; + m_VtxAttr.NormalElements = m_group0.NormalElements; + m_VtxAttr.NormalFormat = m_group0.NormalFormat; + m_VtxAttr.color[0].Elements = m_group0.Color0Elements; + m_VtxAttr.color[0].Comp = m_group0.Color0Comp; + m_VtxAttr.color[1].Elements = m_group0.Color1Elements; + m_VtxAttr.color[1].Comp = m_group0.Color1Comp; + m_VtxAttr.texCoord[0].Elements = m_group0.Tex0CoordElements; + m_VtxAttr.texCoord[0].Format = m_group0.Tex0CoordFormat; + m_VtxAttr.texCoord[0].Frac = m_group0.Tex0Frac; + m_VtxAttr.ByteDequant = m_group0.ByteDequant; + m_VtxAttr.NormalIndex3 = m_group0.NormalIndex3; + }; + + void SetVAT_group1(u32 _group1) + { + if (m_group1.Hex == _group1) + return; + m_AttrDirty = true; + m_group1.Hex = _group1; + + m_VtxAttr.texCoord[1].Elements = m_group1.Tex1CoordElements; + m_VtxAttr.texCoord[1].Format = m_group1.Tex1CoordFormat; + m_VtxAttr.texCoord[1].Frac = m_group1.Tex1Frac; + m_VtxAttr.texCoord[2].Elements = m_group1.Tex2CoordElements; + m_VtxAttr.texCoord[2].Format = m_group1.Tex2CoordFormat; + m_VtxAttr.texCoord[2].Frac = m_group1.Tex2Frac; + m_VtxAttr.texCoord[3].Elements = m_group1.Tex3CoordElements; + m_VtxAttr.texCoord[3].Format = m_group1.Tex3CoordFormat; + m_VtxAttr.texCoord[3].Frac = m_group1.Tex3Frac; + m_VtxAttr.texCoord[4].Elements = m_group1.Tex4CoordElements; + m_VtxAttr.texCoord[4].Format = m_group1.Tex4CoordFormat; + }; + + void SetVAT_group2(u32 _group2) + { + if (m_group2.Hex == _group2) + return; + m_AttrDirty = true; + m_group2.Hex = _group2; + + m_VtxAttr.texCoord[4].Frac = m_group2.Tex4Frac; + m_VtxAttr.texCoord[5].Elements = m_group2.Tex5CoordElements; + m_VtxAttr.texCoord[5].Format = m_group2.Tex5CoordFormat; + m_VtxAttr.texCoord[5].Frac = m_group2.Tex5Frac; + m_VtxAttr.texCoord[6].Elements = m_group2.Tex6CoordElements; + m_VtxAttr.texCoord[6].Format = m_group2.Tex6CoordFormat; + m_VtxAttr.texCoord[6].Frac = m_group2.Tex6Frac; + m_VtxAttr.texCoord[7].Elements = m_group2.Tex7CoordElements; + m_VtxAttr.texCoord[7].Format = m_group2.Tex7CoordFormat; + m_VtxAttr.texCoord[7].Frac = m_group2.Tex7Frac; + }; +}; + +extern VertexLoader g_VertexLoaders[8]; +extern DecodedVArray* varray; +extern inline u8 ReadBuffer8(); +extern inline u16 ReadBuffer16(); +extern inline u32 ReadBuffer32(); +extern inline float ReadBuffer32F(); + + +#endif \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoDX9/Src/VertexLoader_Color.h b/Source/Plugins/Plugin_VideoDX9/Src/VertexLoader_Color.h new file mode 100644 index 0000000000..0dfc1d943c --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/VertexLoader_Color.h @@ -0,0 +1,206 @@ +#pragma once + +#include "Utils.h" + +#define RSHIFT 16 +#define GSHIFT 8 +#define BSHIFT 0 +#define ASHIFT 24 + +extern DecodedVArray *varray; +extern int colIndex; + +inline void _SetCol(u32 val) +{ + varray->SetColor(colIndex, val); + colIndex++; +} + +void _SetCol4444(u16 val) +{ + u32 col = lut4to8[(val>>0)&0xF]<>12)&0xF] <>8)&0xF] <>4)&0xF] <>18)&0x3F] << RSHIFT; + col |= lut6to8[(val>>12)&0x3F] << GSHIFT; + col |= lut6to8[(val>>6)&0x3F] << BSHIFT; + col |= lut6to8[(val>>0)&0x3F] << ASHIFT; + _SetCol(col); +} + +void _SetCol565(u16 val) +{ + u32 col = lut5to8[(val>>11)&0x1f] << RSHIFT; + col |= lut6to8[(val>>5 )&0x3f] << GSHIFT; + col |= lut5to8[(val )&0x1f] << BSHIFT; + _SetCol(col | (0xFF<SetPosNrmIdx(index); +} + +#define MAKETEX(n) \ +void LOADERDECL TexMtx_ReadDirect_UByte##n(void* _p) \ +{ \ + TVtxAttr* pVtxAttr = (TVtxAttr*)_p; \ + int index = ReadBuffer8(); \ + varray->SetTcIdx(n, index); \ +} + +MAKETEX(0) +MAKETEX(1) +MAKETEX(2) +MAKETEX(3) +MAKETEX(4) +MAKETEX(5) +MAKETEX(6) +MAKETEX(7) diff --git a/Source/Plugins/Plugin_VideoDX9/Src/VertexLoader_Normal.cpp b/Source/Plugins/Plugin_VideoDX9/Src/VertexLoader_Normal.cpp new file mode 100644 index 0000000000..07c39cc515 --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/VertexLoader_Normal.cpp @@ -0,0 +1,475 @@ +//__________________________________________________________________________________________________ +// F|RES 2003-2005 +// + +#include "main.h" +#include "Utils.h" +#include "DecodedVArray.h" +#include "VertexLoader.h" +#include "VertexLoader_Normal.h" + +BYTE VertexLoader_Normal::m_sizeTable[NUM_NRM_TYPE][NUM_NRM_FORMAT][NUM_NRM_ELEMENTS]; +TPipelineFunction VertexLoader_Normal::m_funcTable[NUM_NRM_TYPE][NUM_NRM_FORMAT][NUM_NRM_ELEMENTS]; + +bool VertexLoader_Normal::index3; +// __________________________________________________________________________________________________ +// Init +// +void VertexLoader_Normal::Init(void) +{ + // size table + m_sizeTable[NRM_DIRECT][FORMAT_UBYTE] [NRM_NBT] = 3; + m_sizeTable[NRM_DIRECT][FORMAT_BYTE] [NRM_NBT] = 3; + m_sizeTable[NRM_DIRECT][FORMAT_USHORT][NRM_NBT] = 6; + m_sizeTable[NRM_DIRECT][FORMAT_SHORT] [NRM_NBT] = 6; + m_sizeTable[NRM_DIRECT][FORMAT_FLOAT] [NRM_NBT] = 12; + m_sizeTable[NRM_DIRECT][FORMAT_UBYTE] [NRM_NBT3] = 9; + m_sizeTable[NRM_DIRECT][FORMAT_BYTE] [NRM_NBT3] = 9; + m_sizeTable[NRM_DIRECT][FORMAT_USHORT][NRM_NBT3] = 18; + m_sizeTable[NRM_DIRECT][FORMAT_SHORT] [NRM_NBT3] = 18; + m_sizeTable[NRM_DIRECT][FORMAT_FLOAT] [NRM_NBT3] = 36; + + m_sizeTable[NRM_INDEX8][FORMAT_UBYTE] [NRM_NBT] = 1; + m_sizeTable[NRM_INDEX8][FORMAT_BYTE] [NRM_NBT] = 1; + m_sizeTable[NRM_INDEX8][FORMAT_USHORT][NRM_NBT] = 1; + m_sizeTable[NRM_INDEX8][FORMAT_SHORT] [NRM_NBT] = 1; + m_sizeTable[NRM_INDEX8][FORMAT_FLOAT] [NRM_NBT] = 1; + m_sizeTable[NRM_INDEX8][FORMAT_UBYTE] [NRM_NBT3] = 3; + m_sizeTable[NRM_INDEX8][FORMAT_BYTE] [NRM_NBT3] = 3; + m_sizeTable[NRM_INDEX8][FORMAT_USHORT][NRM_NBT3] = 3; + m_sizeTable[NRM_INDEX8][FORMAT_SHORT] [NRM_NBT3] = 3; + m_sizeTable[NRM_INDEX8][FORMAT_FLOAT] [NRM_NBT3] = 3; + + m_sizeTable[NRM_INDEX16][FORMAT_UBYTE] [NRM_NBT] = 2; + m_sizeTable[NRM_INDEX16][FORMAT_BYTE] [NRM_NBT] = 2; + m_sizeTable[NRM_INDEX16][FORMAT_USHORT][NRM_NBT] = 2; + m_sizeTable[NRM_INDEX16][FORMAT_SHORT] [NRM_NBT] = 2; + m_sizeTable[NRM_INDEX16][FORMAT_FLOAT] [NRM_NBT] = 2; + m_sizeTable[NRM_INDEX16][FORMAT_UBYTE] [NRM_NBT3] = 6; + m_sizeTable[NRM_INDEX16][FORMAT_BYTE] [NRM_NBT3] = 6; + m_sizeTable[NRM_INDEX16][FORMAT_USHORT][NRM_NBT3] = 6; + m_sizeTable[NRM_INDEX16][FORMAT_SHORT] [NRM_NBT3] = 6; + m_sizeTable[NRM_INDEX16][FORMAT_FLOAT] [NRM_NBT3] = 6; + + // function table + m_funcTable[NRM_DIRECT][FORMAT_UBYTE] [NRM_NBT] = Normal_DirectByte; //HACK + m_funcTable[NRM_DIRECT][FORMAT_BYTE] [NRM_NBT] = Normal_DirectByte; + m_funcTable[NRM_DIRECT][FORMAT_USHORT][NRM_NBT] = Normal_DirectShort; //HACK + m_funcTable[NRM_DIRECT][FORMAT_SHORT] [NRM_NBT] = Normal_DirectShort; + m_funcTable[NRM_DIRECT][FORMAT_FLOAT] [NRM_NBT] = Normal_DirectFloat; + m_funcTable[NRM_DIRECT][FORMAT_UBYTE] [NRM_NBT3] = Normal_DirectByte3; //HACK + m_funcTable[NRM_DIRECT][FORMAT_BYTE] [NRM_NBT3] = Normal_DirectByte3; + m_funcTable[NRM_DIRECT][FORMAT_USHORT][NRM_NBT3] = Normal_DirectShort3; //HACK + m_funcTable[NRM_DIRECT][FORMAT_SHORT] [NRM_NBT3] = Normal_DirectShort3; + m_funcTable[NRM_DIRECT][FORMAT_FLOAT] [NRM_NBT3] = Normal_DirectFloat3; + + m_funcTable[NRM_INDEX8][FORMAT_UBYTE] [NRM_NBT] = Normal_Index8_Byte; //HACK + m_funcTable[NRM_INDEX8][FORMAT_BYTE] [NRM_NBT] = Normal_Index8_Byte; + m_funcTable[NRM_INDEX8][FORMAT_USHORT][NRM_NBT] = Normal_Index8_Short; //HACK + m_funcTable[NRM_INDEX8][FORMAT_SHORT] [NRM_NBT] = Normal_Index8_Short; + m_funcTable[NRM_INDEX8][FORMAT_FLOAT] [NRM_NBT] = Normal_Index8_Float; + m_funcTable[NRM_INDEX8][FORMAT_UBYTE] [NRM_NBT3] = Normal_Index8_Byte3; //HACK + m_funcTable[NRM_INDEX8][FORMAT_BYTE] [NRM_NBT3] = Normal_Index8_Byte3; + m_funcTable[NRM_INDEX8][FORMAT_USHORT][NRM_NBT3] = Normal_Index8_Short3; //HACK + m_funcTable[NRM_INDEX8][FORMAT_SHORT] [NRM_NBT3] = Normal_Index8_Short3; + m_funcTable[NRM_INDEX8][FORMAT_FLOAT] [NRM_NBT3] = Normal_Index8_Float3; + + m_funcTable[NRM_INDEX16][FORMAT_UBYTE] [NRM_NBT] = Normal_Index16_Byte; //HACK + m_funcTable[NRM_INDEX16][FORMAT_BYTE] [NRM_NBT] = Normal_Index16_Byte; + m_funcTable[NRM_INDEX16][FORMAT_USHORT][NRM_NBT] = Normal_Index16_Short; //HACK + m_funcTable[NRM_INDEX16][FORMAT_SHORT] [NRM_NBT] = Normal_Index16_Short; + m_funcTable[NRM_INDEX16][FORMAT_FLOAT] [NRM_NBT] = Normal_Index16_Float; + m_funcTable[NRM_INDEX16][FORMAT_UBYTE] [NRM_NBT3] = Normal_Index16_Byte3; //HACK + m_funcTable[NRM_INDEX16][FORMAT_BYTE] [NRM_NBT3] = Normal_Index16_Byte3; + m_funcTable[NRM_INDEX16][FORMAT_USHORT][NRM_NBT3] = Normal_Index16_Short3; //HACK + m_funcTable[NRM_INDEX16][FORMAT_SHORT] [NRM_NBT3] = Normal_Index16_Short3; + m_funcTable[NRM_INDEX16][FORMAT_FLOAT] [NRM_NBT3] = Normal_Index16_Float3; +} + +// __________________________________________________________________________________________________ +// GetSize +// +unsigned int +VertexLoader_Normal::GetSize(unsigned int _type, unsigned int _format, unsigned int _elements) +{ + return m_sizeTable[_type][_format][_elements]; +} + +// __________________________________________________________________________________________________ +// GetFunction +// +TPipelineFunction +VertexLoader_Normal::GetFunction(unsigned int _type, unsigned int _format, unsigned int _elements) +{ + TPipelineFunction pFunc = m_funcTable[_type][_format][_elements]; + return pFunc; +} + +///////////////////////////////////////////////////////////////////////////////////////////////////// +// +// --- Direct --- +// +///////////////////////////////////////////////////////////////////////////////////////////////////// + +// __________________________________________________________________________________________________ +// Normal_DirectByte +// +void LOADERDECL +VertexLoader_Normal::Normal_DirectByte(void* _p) +{ + varray->SetNormalX(0, ((float)(signed char)ReadBuffer8()+0.5f) / 127.5f); + varray->SetNormalY(0, ((float)(signed char)ReadBuffer8()+0.5f) / 127.5f); + varray->SetNormalZ(0, ((float)(signed char)ReadBuffer8()+0.5f) / 127.5f); +} + +// __________________________________________________________________________________________________ +// Normal_DirectShort +// +void LOADERDECL +VertexLoader_Normal::Normal_DirectShort(void* _p) +{ + varray->SetNormalX(0, ((float)(signed short)ReadBuffer16()+0.5f) / 32767.5f); + varray->SetNormalY(0, ((float)(signed short)ReadBuffer16()+0.5f) / 32767.5f); + varray->SetNormalZ(0, ((float)(signed short)ReadBuffer16()+0.5f) / 32767.5f); +} + +// __________________________________________________________________________________________________ +// Normal_DirectFloat +// +void LOADERDECL +VertexLoader_Normal::Normal_DirectFloat(void* _p) +{ + varray->SetNormalX(0, ReadBuffer32F()); + varray->SetNormalY(0, ReadBuffer32F()); + varray->SetNormalZ(0, ReadBuffer32F()); +} + +// __________________________________________________________________________________________________ +// Normal_DirectByte3 +// +void LOADERDECL +VertexLoader_Normal::Normal_DirectByte3(void* _p) +{ + for (int i=0; i<3; i++) + { + varray->SetNormalX(i, ((float)(signed char)ReadBuffer8()+0.5f) / 127.5f); + varray->SetNormalY(i, ((float)(signed char)ReadBuffer8()+0.5f) / 127.5f); + varray->SetNormalZ(i, ((float)(signed char)ReadBuffer8()+0.5f) / 127.5f); + } +} + +// __________________________________________________________________________________________________ +// Normal_DirectShort3 +// +void LOADERDECL +VertexLoader_Normal::Normal_DirectShort3(void* _p) +{ + for (int i=0; i<3; i++) + { + varray->SetNormalX(i, ((float)(signed short)ReadBuffer16()+0.5f) / 32767.5f); + varray->SetNormalY(i, ((float)(signed short)ReadBuffer16()+0.5f) / 32767.5f); + varray->SetNormalZ(i, ((float)(signed short)ReadBuffer16()+0.5f) / 32767.5f); + } +} + +// __________________________________________________________________________________________________ +// Normal_DirectFloat3 +// +void LOADERDECL +VertexLoader_Normal::Normal_DirectFloat3(void* _p) +{ + for (int i=0; i<3; i++) + { + varray->SetNormalX(i, ReadBuffer32F()); + varray->SetNormalY(i, ReadBuffer32F()); + varray->SetNormalZ(i, ReadBuffer32F()); + } +} + +///////////////////////////////////////////////////////////////////////////////////////////////////// +// +// --- Index8 --- +// +///////////////////////////////////////////////////////////////////////////////////////////////////// + +// __________________________________________________________________________________________________ +// Normal_Index8_Byte +// +void LOADERDECL +VertexLoader_Normal::Normal_Index8_Byte(void* _p) +{ + u8 Index = ReadBuffer8(); + u32 iAddress = arraybases[ARRAY_NORMAL] + (Index * arraystrides[ARRAY_NORMAL]); + + varray->SetNormalX(0, ((float)(signed char)Memory_Read_U8(iAddress )+0.5f) / 127.5f); + varray->SetNormalY(0, ((float)(signed char)Memory_Read_U8(iAddress+1)+0.5f) / 127.5f); + varray->SetNormalZ(0, ((float)(signed char)Memory_Read_U8(iAddress+2)+0.5f) / 127.5f); +} + +// __________________________________________________________________________________________________ +// Normal_Index8_Short +// +void LOADERDECL +VertexLoader_Normal::Normal_Index8_Short(void* _p) +{ + u8 Index = ReadBuffer8(); + u32 iAddress = arraybases[ARRAY_NORMAL] + (Index * arraystrides[ARRAY_NORMAL]); + + varray->SetNormalX(0, ((float)(signed short)Memory_Read_U16(iAddress )+0.5f) / 32767.5f); + varray->SetNormalY(0, ((float)(signed short)Memory_Read_U16(iAddress+2)+0.5f) / 32767.5f); + varray->SetNormalZ(0, ((float)(signed short)Memory_Read_U16(iAddress+4)+0.5f) / 32767.5f); +} + +// __________________________________________________________________________________________________ +// Normal_Index8_Float +// +void LOADERDECL +VertexLoader_Normal::Normal_Index8_Float(void* _p) +{ + u8 Index = ReadBuffer8(); + u32 iAddress = arraybases[ARRAY_NORMAL] + (Index * arraystrides[ARRAY_NORMAL]); + + varray->SetNormalX(0, Memory_Read_Float(iAddress)); + varray->SetNormalY(0, Memory_Read_Float(iAddress+4)); + varray->SetNormalZ(0, Memory_Read_Float(iAddress+8)); +} + +// __________________________________________________________________________________________________ +// Normal_Index8_Byte3 +// +void LOADERDECL +VertexLoader_Normal::Normal_Index8_Byte3(void* _p) +{ + if (index3) + { + for (int i=0; i<3; i++) + { + u8 Index = ReadBuffer8(); + u32 iAddress = arraybases[ARRAY_NORMAL] + (Index * arraystrides[ARRAY_NORMAL]) + 1*3*i; + + varray->SetNormalX(i, ((float)(signed char)Memory_Read_U8(iAddress )+0.5f) / 127.5f); + varray->SetNormalY(i, ((float)(signed char)Memory_Read_U8(iAddress+1)+0.5f) / 127.5f); + varray->SetNormalZ(i, ((float)(signed char)Memory_Read_U8(iAddress+2)+0.5f) / 127.5f); + } + } + else + { + u8 Index = ReadBuffer8(); + for (int i=0; i<3; i++) + { + u32 iAddress = arraybases[ARRAY_NORMAL] + (Index * arraystrides[ARRAY_NORMAL]) + 1*3*i; + + varray->SetNormalX(i, ((float)(signed char)Memory_Read_U8(iAddress )+0.5f) / 127.5f); + varray->SetNormalY(i, ((float)(signed char)Memory_Read_U8(iAddress+1)+0.5f) / 127.5f); + varray->SetNormalZ(i, ((float)(signed char)Memory_Read_U8(iAddress+2)+0.5f) / 127.5f); + } + } +} + +// __________________________________________________________________________________________________ +// Normal_Index8_Short3 +// +void LOADERDECL +VertexLoader_Normal::Normal_Index8_Short3(void* _p) +{ + if (index3) + { + for (int i=0; i<3; i++) + { + u8 Index = ReadBuffer8(); + u32 iAddress = arraybases[ARRAY_NORMAL] + (Index * arraystrides[ARRAY_NORMAL]) + 2*3*i; + + varray->SetNormalX(i, ((float)(signed short)Memory_Read_U16(iAddress )+0.5f) / 32767.5f); + varray->SetNormalY(i, ((float)(signed short)Memory_Read_U16(iAddress+2)+0.5f) / 32767.5f); + varray->SetNormalZ(i, ((float)(signed short)Memory_Read_U16(iAddress+4)+0.5f) / 32767.5f); + } + } + else + { + u8 Index = ReadBuffer8(); + for (int i=0; i<3; i++) + { + u32 iAddress = arraybases[ARRAY_NORMAL] + (Index * arraystrides[ARRAY_NORMAL]) + 2*3*i; + + varray->SetNormalX(i, ((float)(signed short)Memory_Read_U16(iAddress )+0.5f) / 32767.5f); + varray->SetNormalY(i, ((float)(signed short)Memory_Read_U16(iAddress+2)+0.5f) / 32767.5f); + varray->SetNormalZ(i, ((float)(signed short)Memory_Read_U16(iAddress+4)+0.5f) / 32767.5f); + } + } +} + +// __________________________________________________________________________________________________ +// Normal_Index8_Float3 +// +void LOADERDECL +VertexLoader_Normal::Normal_Index8_Float3(void* _p) +{ + if (index3) + { + for (int i=0; i<3; i++) + { + u8 Index = ReadBuffer8(); + u32 iAddress = arraybases[ARRAY_NORMAL] + (Index * arraystrides[ARRAY_NORMAL]) + 4*3*i; + + varray->SetNormalX(i, Memory_Read_Float(iAddress)); + varray->SetNormalY(i, Memory_Read_Float(iAddress+4)); + varray->SetNormalZ(i, Memory_Read_Float(iAddress+8)); + } + } + else + { + u8 Index = ReadBuffer8(); + for (int i=0; i<3; i++) + { + u32 iAddress = arraybases[ARRAY_NORMAL] + (Index * arraystrides[ARRAY_NORMAL]) + 4*3*i; + + varray->SetNormalX(i, Memory_Read_Float(iAddress)); + varray->SetNormalY(i, Memory_Read_Float(iAddress+4)); + varray->SetNormalZ(i, Memory_Read_Float(iAddress+8)); + } + } +} + +///////////////////////////////////////////////////////////////////////////////////////////////////// +// +// --- Index16 --- +// +///////////////////////////////////////////////////////////////////////////////////////////////////// + +// __________________________________________________________________________________________________ +// Normal_Index16_Byte +// +void LOADERDECL +VertexLoader_Normal::Normal_Index16_Byte(void* _p) +{ + u16 Index = ReadBuffer16(); + u32 iAddress = arraybases[ARRAY_NORMAL] + (Index * arraystrides[ARRAY_NORMAL]); + + varray->SetNormalX(0, ((float)(signed char)Memory_Read_U8(iAddress )+0.5f) / 127.5f); + varray->SetNormalY(0, ((float)(signed char)Memory_Read_U8(iAddress+1)+0.5f) / 127.5f); + varray->SetNormalZ(0, ((float)(signed char)Memory_Read_U8(iAddress+2)+0.5f) / 127.5f); +} + +// __________________________________________________________________________________________________ +// Normal_Index16_Short +// +void LOADERDECL +VertexLoader_Normal::Normal_Index16_Short(void* _p) +{ + u16 Index = ReadBuffer16(); + u32 iAddress = arraybases[ARRAY_NORMAL] + (Index * arraystrides[ARRAY_NORMAL]); + + varray->SetNormalX(0, ((float)(signed short)Memory_Read_U16(iAddress )+0.5f) / 32767.5f); + varray->SetNormalY(0, ((float)(signed short)Memory_Read_U16(iAddress+2)+0.5f) / 32767.5f); + varray->SetNormalZ(0, ((float)(signed short)Memory_Read_U16(iAddress+4)+0.5f) / 32767.5f); +} + +// __________________________________________________________________________________________________ +// Normal_Index8_Float +// +void LOADERDECL +VertexLoader_Normal::Normal_Index16_Float(void* _p) +{ + u16 Index = ReadBuffer16(); + u32 iAddress = arraybases[ARRAY_NORMAL] + (Index * arraystrides[ARRAY_NORMAL]); + + varray->SetNormalX(0, Memory_Read_Float(iAddress)); + varray->SetNormalY(0, Memory_Read_Float(iAddress+4)); + varray->SetNormalZ(0, Memory_Read_Float(iAddress+8)); +} + +// __________________________________________________________________________________________________ +// Normal_Index16_Byte3 +// +void LOADERDECL +VertexLoader_Normal::Normal_Index16_Byte3(void* _p) +{ + if (index3) + { + for (int i=0; i<3; i++) + { + u16 Index = ReadBuffer16(); + u32 iAddress = arraybases[ARRAY_NORMAL] + (Index * arraystrides[ARRAY_NORMAL]) + 1*3*i; + + varray->SetNormalX(i, ((float)(signed char)Memory_Read_U8(iAddress )+0.5f) / 127.5f); + varray->SetNormalY(i, ((float)(signed char)Memory_Read_U8(iAddress+1)+0.5f) / 127.5f); + varray->SetNormalZ(i, ((float)(signed char)Memory_Read_U8(iAddress+2)+0.5f) / 127.5f); + } + } + else + { + u16 Index = ReadBuffer16(); + for (int i=0; i<3; i++) + { + u32 iAddress = arraybases[ARRAY_NORMAL] + (Index * arraystrides[ARRAY_NORMAL]) + 1*3*i; + + varray->SetNormalX(i, ((float)(signed char)Memory_Read_U8(iAddress )+0.5f) / 127.5f); + varray->SetNormalY(i, ((float)(signed char)Memory_Read_U8(iAddress+1)+0.5f) / 127.5f); + varray->SetNormalZ(i, ((float)(signed char)Memory_Read_U8(iAddress+2)+0.5f) / 127.5f); + } + } +} + +// __________________________________________________________________________________________________ +// Normal_Index16_Short3 +// +void LOADERDECL +VertexLoader_Normal::Normal_Index16_Short3(void* _p) +{ + if (index3) + { + for (int i=0; i<3; i++) + { + u16 Index = ReadBuffer16(); + u32 iAddress = arraybases[ARRAY_NORMAL] + (Index * arraystrides[ARRAY_NORMAL]) + 2*3*i; + + varray->SetNormalX(i, ((float)(signed short)Memory_Read_U16(iAddress )+0.5f) / 32767.5f); + varray->SetNormalY(i, ((float)(signed short)Memory_Read_U16(iAddress+2)+0.5f) / 32767.5f); + varray->SetNormalZ(i, ((float)(signed short)Memory_Read_U16(iAddress+4)+0.5f) / 32767.5f); + } + } + else + { + u16 Index = ReadBuffer16(); + for (int i=0; i<3; i++) + { + u32 iAddress = arraybases[ARRAY_NORMAL] + (Index * arraystrides[ARRAY_NORMAL]) + 2*3*i; + + varray->SetNormalX(i, ((float)(signed short)Memory_Read_U16(iAddress )+0.5f) / 32767.5f); + varray->SetNormalY(i, ((float)(signed short)Memory_Read_U16(iAddress+2)+0.5f) / 32767.5f); + varray->SetNormalZ(i, ((float)(signed short)Memory_Read_U16(iAddress+4)+0.5f) / 32767.5f); + } + } +} + +// __________________________________________________________________________________________________ +// Normal_Index16_Float3 +// +void LOADERDECL +VertexLoader_Normal::Normal_Index16_Float3(void* _p) +{ + if (index3) + { + for (int i=0; i<3; i++) + { + u16 Index = ReadBuffer16(); + u32 iAddress = arraybases[ARRAY_NORMAL] + (Index * arraystrides[ARRAY_NORMAL]) + 4*3*i; + + varray->SetNormalX(i, Memory_Read_Float(iAddress )); + varray->SetNormalY(i, Memory_Read_Float(iAddress+4)); + varray->SetNormalZ(i, Memory_Read_Float(iAddress+8)); + } + } + else + { + u16 Index = ReadBuffer16(); + for (int i=0; i<3; i++) + { + u32 iAddress = arraybases[ARRAY_NORMAL] + (Index * arraystrides[ARRAY_NORMAL]) + 4*3*i; + + varray->SetNormalX(i, Memory_Read_Float(iAddress )); + varray->SetNormalY(i, Memory_Read_Float(iAddress+4)); + varray->SetNormalZ(i, Memory_Read_Float(iAddress+8)); + } + } +} \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoDX9/Src/VertexLoader_Normal.h b/Source/Plugins/Plugin_VideoDX9/Src/VertexLoader_Normal.h new file mode 100644 index 0000000000..e35bdb59ae --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/VertexLoader_Normal.h @@ -0,0 +1,75 @@ +//__________________________________________________________________________________________________ +// F|RES 2003-2005 +// + +#pragma once + +class VertexLoader_Normal +{ +public: + + static bool index3; + // Init + static void Init(void); + + // GetSize + static unsigned int GetSize(unsigned int _type, unsigned int _format, unsigned int _elements); + + // GetFunction + static TPipelineFunction GetFunction(unsigned int _type, unsigned int _format, unsigned int _elements); + +private: + enum ENormalType + { + NRM_NOT_PRESENT = 0, + NRM_DIRECT = 1, + NRM_INDEX8 = 2, + NRM_INDEX16 = 3, + NUM_NRM_TYPE + }; + + enum ENormalFormat + { + FORMAT_UBYTE = 0, + FORMAT_BYTE = 1, + FORMAT_USHORT = 2, + FORMAT_SHORT = 3, + FORMAT_FLOAT = 4, + NUM_NRM_FORMAT + }; + + enum ENormalElements + { + NRM_NBT = 0, + NRM_NBT3 = 1, + NUM_NRM_ELEMENTS + }; + + // tables + static BYTE m_sizeTable[NUM_NRM_TYPE][NUM_NRM_FORMAT][NUM_NRM_ELEMENTS]; + static TPipelineFunction m_funcTable[NUM_NRM_TYPE][NUM_NRM_FORMAT][NUM_NRM_ELEMENTS]; + + // direct + static void LOADERDECL Normal_DirectByte(void* _p); + static void LOADERDECL Normal_DirectShort(void* _p); + static void LOADERDECL Normal_DirectFloat(void* _p); + static void LOADERDECL Normal_DirectByte3(void* _p); + static void LOADERDECL Normal_DirectShort3(void* _p); + static void LOADERDECL Normal_DirectFloat3(void* _p); + + // index8 + static void LOADERDECL Normal_Index8_Byte(void* _p); + static void LOADERDECL Normal_Index8_Short(void* _p); + static void LOADERDECL Normal_Index8_Float(void* _p); + static void LOADERDECL Normal_Index8_Byte3(void* _p); + static void LOADERDECL Normal_Index8_Short3(void* _p); + static void LOADERDECL Normal_Index8_Float3(void* _p); + + // index16 + static void LOADERDECL Normal_Index16_Byte(void* _p); + static void LOADERDECL Normal_Index16_Short(void* _p); + static void LOADERDECL Normal_Index16_Float(void* _p); + static void LOADERDECL Normal_Index16_Byte3(void* _p); + static void LOADERDECL Normal_Index16_Short3(void* _p); + static void LOADERDECL Normal_Index16_Float3(void* _p); +}; \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoDX9/Src/VertexLoader_Position.h b/Source/Plugins/Plugin_VideoDX9/Src/VertexLoader_Position.h new file mode 100644 index 0000000000..cc0800600b --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/VertexLoader_Position.h @@ -0,0 +1,196 @@ +#ifndef VERTEXHANDLER_POSITION_H +#define VERTEXHANDLER_POSITION_H + +#include "Common.h" +#include "Utils.h" + + +// ============================================================================== +// Direct +// ============================================================================== + +template +inline void LOADERDECL _ReadPos8Mem(int iAddress, TVtxAttr* pVtxAttr) +{ + varray->SetPosX(((float)(T)Memory_Read_U8(iAddress)) * posScale); + varray->SetPosY(((float)(T)Memory_Read_U8(iAddress+1)) * posScale); + if (pVtxAttr->PosElements) + varray->SetPosZ(((float)(T)Memory_Read_U8(iAddress+2)) * posScale); + else + varray->SetPosZ(1.0); +} +template +inline void LOADERDECL _ReadPos16Mem(int iAddress, TVtxAttr* pVtxAttr) +{ + varray->SetPosX(((float)(T)Memory_Read_U16(iAddress)) * posScale); + varray->SetPosY(((float)(T)Memory_Read_U16(iAddress+2)) * posScale); + if (pVtxAttr->PosElements) + varray->SetPosZ(((float)(T)Memory_Read_U16(iAddress+4)) * posScale); + else + varray->SetPosZ(1.0); +} + +void LOADERDECL _ReadPosFloatMem(int iAddress, TVtxAttr* pVtxAttr) +{ + u32 uTemp; + uTemp = Memory_Read_U32(iAddress ); + varray->SetPosX(*(float*)&uTemp); + uTemp = Memory_Read_U32(iAddress+4); + varray->SetPosY(*(float*)&uTemp); + if (pVtxAttr->PosElements) + { + uTemp = Memory_Read_U32(iAddress+8); + varray->SetPosZ(*(float*)&uTemp); + } + else + varray->SetPosZ(1.0); +} + +void LOADERDECL Pos_ReadDirect_UByte(void* _p) +{ + TVtxAttr* pVtxAttr = (TVtxAttr*)_p; + varray->SetPosX((float)ReadBuffer8() * posScale); + varray->SetPosY((float)ReadBuffer8() * posScale); + + if (pVtxAttr->PosElements) + varray->SetPosZ((float)ReadBuffer8() * posScale); + else + varray->SetPosZ(1.0); +} + +void LOADERDECL Pos_ReadDirect_Byte(void* _p) +{ + TVtxAttr* pVtxAttr = (TVtxAttr*)_p; + varray->SetPosX((float)(s8)ReadBuffer8() * posScale); + varray->SetPosY((float)(s8)ReadBuffer8() * posScale); + + if (pVtxAttr->PosElements) + varray->SetPosZ((float)(s8)ReadBuffer8() * posScale); + else + varray->SetPosZ(1.0); +} + +void LOADERDECL Pos_ReadDirect_UShort(void* _p) +{ + TVtxAttr* pVtxAttr = (TVtxAttr*)_p; + + varray->SetPosX((float)ReadBuffer16() * posScale); + varray->SetPosY((float)ReadBuffer16() * posScale); + + if (pVtxAttr->PosElements) + varray->SetPosZ((float)ReadBuffer16() * posScale); + else + varray->SetPosZ(1.0); +} + +void LOADERDECL Pos_ReadDirect_Short(void* _p) +{ + TVtxAttr* pVtxAttr = (TVtxAttr*)_p; + + varray->SetPosX((float)(s16)ReadBuffer16() * posScale); + varray->SetPosY((float)(s16)ReadBuffer16() * posScale); + + if (pVtxAttr->PosElements) + varray->SetPosZ((float)(s16)ReadBuffer16() * posScale); + else + varray->SetPosZ(1.0); +} + +void LOADERDECL Pos_ReadDirect_Float(void* _p) +{ + TVtxAttr* pVtxAttr = (TVtxAttr*)_p; + + varray->SetPosX(ReadBuffer32F()); + varray->SetPosY(ReadBuffer32F()); + + if (pVtxAttr->PosElements) + varray->SetPosZ(ReadBuffer32F()); + else + varray->SetPosZ(1.0); +} + +// ============================================================================== +// Index 8 +// ============================================================================== + +void LOADERDECL Pos_ReadIndex8_UByte(void* _p) +{ + TVtxAttr* pVtxAttr = (TVtxAttr*)_p; + u8 Index = ReadBuffer8(); + u32 iAddress = arraybases[ARRAY_POSITION] + (Index * arraystrides[ARRAY_POSITION]); + _ReadPos8Mem(iAddress, pVtxAttr); +} +void LOADERDECL Pos_ReadIndex8_Byte(void* _p) +{ + TVtxAttr* pVtxAttr = (TVtxAttr*)_p; + u8 Index = ReadBuffer8(); + u32 iAddress = arraybases[ARRAY_POSITION] + (Index * arraystrides[ARRAY_POSITION]); + _ReadPos8Mem(iAddress, pVtxAttr); +} + +void LOADERDECL Pos_ReadIndex8_UShort(void* _p) +{ + TVtxAttr* pVtxAttr = (TVtxAttr*)_p; + u8 Index = ReadBuffer8(); + u32 iAddress = arraybases[ARRAY_POSITION] + (Index * arraystrides[ARRAY_POSITION]); + _ReadPos16Mem(iAddress, pVtxAttr); +} + +void LOADERDECL Pos_ReadIndex8_Short(void* _p) +{ + TVtxAttr* pVtxAttr = (TVtxAttr*)_p; + u8 Index = ReadBuffer8(); + u32 iAddress = arraybases[ARRAY_POSITION] + (Index * arraystrides[ARRAY_POSITION]); + _ReadPos16Mem(iAddress, pVtxAttr); +} + +void LOADERDECL Pos_ReadIndex8_Float(void* _p) +{ + TVtxAttr* pVtxAttr = (TVtxAttr*)_p; + u8 Index = ReadBuffer8(); + u32 iAddress = arraybases[ARRAY_POSITION] + (Index * arraystrides[ARRAY_POSITION]); + _ReadPosFloatMem(iAddress, pVtxAttr); +} + +// ============================================================================== +// Index 16 +// ============================================================================== + +void LOADERDECL Pos_ReadIndex16_UByte(void* _p){ + TVtxAttr* pVtxAttr = (TVtxAttr*)_p; + u16 Index = ReadBuffer16(); + u32 iAddress = arraybases[ARRAY_POSITION] + (Index * arraystrides[ARRAY_POSITION]); + _ReadPos8Mem(iAddress, pVtxAttr); +} + +void LOADERDECL Pos_ReadIndex16_Byte(void* _p){ + TVtxAttr* pVtxAttr = (TVtxAttr*)_p; + u16 Index = ReadBuffer16(); + u32 iAddress = arraybases[ARRAY_POSITION] + (Index * arraystrides[ARRAY_POSITION]); + _ReadPos8Mem(iAddress, pVtxAttr); +} + +void LOADERDECL Pos_ReadIndex16_UShort(void* _p){ + TVtxAttr* pVtxAttr = (TVtxAttr*)_p; + u16 Index = ReadBuffer16(); + u32 iAddress = arraybases[ARRAY_POSITION] + (Index * arraystrides[ARRAY_POSITION]); + _ReadPos16Mem(iAddress, pVtxAttr); +} + +void LOADERDECL Pos_ReadIndex16_Short(void* _p) +{ + TVtxAttr* pVtxAttr = (TVtxAttr*)_p; + u16 Index = ReadBuffer16(); + u32 iAddress = arraybases[ARRAY_POSITION] + (Index * arraystrides[ARRAY_POSITION]); + _ReadPos16Mem(iAddress, pVtxAttr); +} + +void LOADERDECL Pos_ReadIndex16_Float(void* _p) +{ + TVtxAttr* pVtxAttr = (TVtxAttr*)_p; + u16 Index = ReadBuffer16(); + u32 iAddress = arraybases[ARRAY_POSITION] + (Index * arraystrides[ARRAY_POSITION]); + _ReadPosFloatMem(iAddress, pVtxAttr); +} + +#endif \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoDX9/Src/VertexLoader_TextCoord.h b/Source/Plugins/Plugin_VideoDX9/Src/VertexLoader_TextCoord.h new file mode 100644 index 0000000000..e2e8a57975 --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/VertexLoader_TextCoord.h @@ -0,0 +1,185 @@ +#ifndef VERTEXHANDLER_TEXCOORD_H +#define VERTEXHANDLER_TEXCOORD_H + +extern int tcIndex; + +void LOADERDECL TexCoord_ReadDirect_UByte(void* _p) +{ + varray->SetU(tcIndex, ReadBuffer8() * tcScaleU[tcIndex]); + if (tcElements[tcIndex]) + varray->SetV(tcIndex, ReadBuffer8() * tcScaleV[tcIndex]); + tcIndex++; +} + +void LOADERDECL TexCoord_ReadDirect_Byte(void* _p) +{ + varray->SetU(tcIndex, (s8)ReadBuffer8() * tcScaleU[tcIndex]); + if (tcElements[tcIndex]) + varray->SetV(tcIndex, (s8)ReadBuffer8() * tcScaleV[tcIndex]); + tcIndex++; +} + +void LOADERDECL TexCoord_ReadDirect_UShort(void* _p) +{ + varray->SetU(tcIndex, ReadBuffer16() * tcScaleU[tcIndex]); + if (tcElements[tcIndex]) + varray->SetV(tcIndex, ReadBuffer16() * tcScaleV[tcIndex]); + tcIndex++; +} + +void LOADERDECL TexCoord_ReadDirect_Short(void* _p) +{ + varray->SetU(tcIndex, (s16)ReadBuffer16() * tcScaleU[tcIndex]); + if (tcElements[tcIndex]) + varray->SetV(tcIndex, (s16)ReadBuffer16() * tcScaleV[tcIndex]); + tcIndex++; +} +void LOADERDECL TexCoord_ReadDirect_Float(void* _p) +{ + varray->SetU(tcIndex, ReadBuffer32F() * tcScaleU[tcIndex]); + if (tcElements[tcIndex]) + varray->SetV(tcIndex, ReadBuffer32F() * tcScaleV[tcIndex]); + tcIndex++; +} + +// ================================================================================== +void LOADERDECL TexCoord_ReadIndex8_UByte(void* _p) +{ + u8 Index = ReadBuffer8(); + u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); + + varray->SetU(tcIndex, (float)(u8)Memory_Read_U8(iAddress) * tcScaleU[tcIndex]); + if (tcElements[tcIndex]) + varray->SetV(tcIndex, (float)(u8)Memory_Read_U8(iAddress+1) * tcScaleV[tcIndex]); + tcIndex++; +} +void LOADERDECL TexCoord_ReadIndex8_Byte(void* _p) +{ + u8 Index = ReadBuffer8(); + u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); + + varray->SetU(tcIndex, (float)(s8)Memory_Read_U8(iAddress) * tcScaleU[tcIndex]); + if (tcElements[tcIndex]) + varray->SetV(tcIndex, (float)(s8)Memory_Read_U8(iAddress+1) * tcScaleV[tcIndex]); + + tcIndex++; +} +void LOADERDECL TexCoord_ReadIndex8_UShort(void* _p) +{ + u8 Index = ReadBuffer8(); + u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); + + varray->SetU(tcIndex, (float)(u16)Memory_Read_U16(iAddress) * tcScaleU[tcIndex]); + if (tcElements[tcIndex]) + varray->SetV(tcIndex, (float)(u16)Memory_Read_U16(iAddress+2) * tcScaleV[tcIndex]); + tcIndex++; +} +void LOADERDECL TexCoord_ReadIndex8_Short(void* _p) +{ + u8 Index = ReadBuffer8(); + u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); + + varray->SetU(tcIndex, (float)(s16)Memory_Read_U16(iAddress) * tcScaleU[tcIndex]); + if (tcElements[tcIndex]) + varray->SetV(tcIndex, (float)(s16)Memory_Read_U16(iAddress+2) * tcScaleV[tcIndex]); + tcIndex++; +} +void LOADERDECL TexCoord_ReadIndex8_Float(void* _p) +{ + u16 Index = ReadBuffer8(); + u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); + u32 uTemp; + uTemp = Memory_Read_U32(iAddress ); + varray->SetU(tcIndex, *(float*)&uTemp * tcScaleU[tcIndex]); + if (tcElements[tcIndex]) + { + uTemp = Memory_Read_U32(iAddress+4); + varray->SetV(tcIndex, *(float*)&uTemp * tcScaleV[tcIndex]); + } + tcIndex++; +} + + +// ================================================================================== +void LOADERDECL TexCoord_ReadIndex16_UByte(void* _p) +{ + u16 Index = ReadBuffer16(); + u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); + + u32 uTemp; + uTemp = (u8)Memory_Read_U8(iAddress ); + varray->SetU(tcIndex, float(uTemp)* tcScaleU[tcIndex]); + + if (tcElements[tcIndex]) + { + uTemp = (u8)Memory_Read_U8(iAddress+1); + varray->SetV(tcIndex, float(uTemp)* tcScaleV[tcIndex]); + } + tcIndex++; +} +void LOADERDECL TexCoord_ReadIndex16_Byte(void* _p) +{ + u16 Index = ReadBuffer16(); + u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); + + u32 uTemp; + uTemp = (s8)Memory_Read_U8(iAddress ); + varray->SetU(tcIndex, float(uTemp)* tcScaleU[tcIndex]); + + if (tcElements[tcIndex]) + { + uTemp = (s8)Memory_Read_U8(iAddress+1); + varray->SetV(tcIndex, float(uTemp)* tcScaleV[tcIndex]); + } + tcIndex++; +} + +void LOADERDECL TexCoord_ReadIndex16_UShort(void* _p) +{ + TVtxAttr* pVtxAttr = (TVtxAttr*)_p; + u16 Index = ReadBuffer16(); + u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); + + float uTemp; + uTemp = (float)(u16)Memory_Read_U16(iAddress ); + varray->SetU(tcIndex, uTemp * tcScaleU[tcIndex]); + + if (tcElements[tcIndex]) + { + uTemp = (float)(u16)Memory_Read_U16(iAddress+2); + varray->SetV(tcIndex, uTemp * tcScaleV[tcIndex]); + } + tcIndex++; +} +void LOADERDECL TexCoord_ReadIndex16_Short(void* _p) +{ + u16 Index = ReadBuffer16(); + u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); + + float uTemp; + uTemp = (float)(s16)Memory_Read_U16(iAddress ); + varray->SetU(tcIndex, uTemp * tcScaleU[tcIndex]); + + if (tcElements[tcIndex]) + { + uTemp = (float)(s16)Memory_Read_U16(iAddress+2); + varray->SetV(tcIndex, uTemp * tcScaleV[tcIndex]); + } + tcIndex++; +} +void LOADERDECL TexCoord_ReadIndex16_Float(void* _p) +{ + u16 Index = ReadBuffer16(); + u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); + u32 uTemp; + uTemp = Memory_Read_U32(iAddress ); + varray->SetU(tcIndex, *(float*)&uTemp * tcScaleU[tcIndex]); + if (tcElements[tcIndex]) + { + uTemp = Memory_Read_U32(iAddress+4); + varray->SetV(tcIndex, *(float*)&uTemp * tcScaleV[tcIndex]); + } + tcIndex++; +} + +#endif \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoDX9/Src/VertexShader.cpp b/Source/Plugins/Plugin_VideoDX9/Src/VertexShader.cpp new file mode 100644 index 0000000000..fc0c67c9e7 --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/VertexShader.cpp @@ -0,0 +1,119 @@ +#include "stdafx.h" +#include "D3DShader.h" +#include "VertexShader.h" +#include "BPStructs.h" + + + + + +//I hope we don't get too many hash collisions :p +//all these magic numbers are primes, it should help a bit +xformhash GetCurrentXForm() +{ + //return 0; + xformhash hash = bpmem.genMode.numtexgens*8*17; +/* + for (int i=0; i%i texgens, %i colors\n",numUV,numTexgen,numColors); + WRITE(p,"\n"); + + WRITE(p,"struct VS_INPUT {\n"); + WRITE(p," float4 pos : POSITION;\n"); + WRITE(p," float3 normal : NORMAL;\n"); + if (numColors) + WRITE(p," float4 colors[%i] : COLOR0;\n",numColors); + if (numUV) + WRITE(p," float3 uv[%i] : TEXCOORD0;\n",numUV); + WRITE(p,"};\n"); + WRITE(p,"\n"); + + WRITE(p,"struct VS_OUTPUT {\n"); + WRITE(p," float4 pos : POSITION;\n"); + WRITE(p," float4 colors[%i] : COLOR0;\n",numColors); + if (numTexgen) + WRITE(p," float4 uv[%i] : TEXCOORD0;\n",numTexgen); + if (fogEnable) + WRITE(p," float fog : FOG;\n",numTexgen); + WRITE(p,"};\n"); + WRITE(p,"\n"); + + WRITE(p,"uniform matrix matWorldViewProj : register(c0);\n"); + + WRITE(p,"\n"); + + WRITE(p,"VS_OUTPUT main(const VS_INPUT input)\n"); + WRITE(p,"{\n"); + WRITE(p," VS_OUTPUT output;"); + WRITE(p,"\n"); + + WRITE(p," output.pos = mul(matWorldViewProj, input.pos);\n"); + + for (int i = 0; i < (int)bpmem.genMode.numtexgens; i++) + { + //build the equation for this stage + WriteTexgen(p,i); + } + + WRITE(p," for (int i=0; i<2; i++)\n output.colors[i] = input.colors[i];\n"); +// WRITE(p," output.fog = 0.0f;"); + WRITE(p,"return output;\n"); + WRITE(p,"}\n"); + WRITE(p,"\0"); + +// MessageBox(0,text2,0,0); + return D3D::CompileVShader(text2,(int)(p-text2)); +} + + + +/* + * xform->vertexshader ideas + +*/ + +void WriteTexgen(char *&p, int n) +{ + WRITE(p," output.uv[%i] = float4(input.uv[%i].xy,0,input.uv[%i].z);\n",n,n,n); +} + + +void WriteLight(int color, int component) +{ + +} diff --git a/Source/Plugins/Plugin_VideoDX9/Src/VertexShader.h b/Source/Plugins/Plugin_VideoDX9/Src/VertexShader.h new file mode 100644 index 0000000000..ba3569442c --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/VertexShader.h @@ -0,0 +1,15 @@ +#ifndef _VERTEXSHADER_H +#define _VERTEXSHADER_H + +#include "Common.h" + +typedef u32 xformhash; + +xformhash GetCurrentXForm(); +LPDIRECT3DVERTEXSHADER9 GenerateVertexShader(); + +#define PS_CONST_COLORS 0 +#define PS_CONST_KCOLORS 4 +#define PS_CONST_CONSTALPHA 8 + +#endif \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoDX9/Src/W32Util/ChunkFile.cpp b/Source/Plugins/Plugin_VideoDX9/Src/W32Util/ChunkFile.cpp new file mode 100644 index 0000000000..2c40e41341 --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/W32Util/ChunkFile.cpp @@ -0,0 +1,265 @@ +#include "ChunkFile.h" + +namespace W32Util +{ + ChunkFile::ChunkFile(const TCHAR *filename, bool _read) + { + data=0; + fastMode=false; + if (file.Open(filename,_read ? FILE_READ : FILE_WRITE)) + { + didFail=false; + } + else + { + didFail=true; + return; + } + + int fSize = file.GetSize(); + + fastMode = _read ? true : false; + + if (fastMode) + { + data = new char[fSize]; + file.Read(data,fSize); + file.Close(); + // MessageBox(theApp->getHWND(),TEXT("FILECLOSED"),TEXT("MOSJ"),0); + } + + eof=fSize; + numLevels=0; + read=_read; + pos=0; + didFail=false; + } + + ChunkFile::~ChunkFile() + { + if (fastMode && data) + delete [] data; + else + file.Close(); + } + + + int ChunkFile::ReadInt() + { + if (posgetHWND(),tempx,0,0); + */ + stack[numLevels]=temp; + SeekTo(stack[numLevels].parentStartLocation); + return false; + } + + //descend into it + //pos was set inside the loop above + eof = stack[numLevels].startLocation + stack[numLevels].length; + numLevels++; + return true; + } + else + { + //write a chunk id, and prepare for filling in length later + WriteInt(id); + WriteInt(0); //will be filled in by Ascend + stack[numLevels].startLocation=pos; + numLevels++; + return true; + } + } + + void ChunkFile::SeekTo(int _pos) + { + if (!fastMode) + file.SeekBeg(_pos); + pos=_pos; + } + + //let's Ascend out + void ChunkFile::Ascend() + { + if (read) + { + //Ascend, and restore information + numLevels--; + SeekTo(stack[numLevels].parentStartLocation); + eof = stack[numLevels].parentEOF; + } + else + { + numLevels--; + //now fill in the written length automatically + int posNow = pos; + SeekTo(stack[numLevels].startLocation - 4); + WriteInt(posNow-stack[numLevels].startLocation); + SeekTo(posNow); + } + } + + //read a block + void ChunkFile::ReadData(void *what, int count) + { + + if (fastMode) + memcpy(what,data+pos,count); + else + file.Read(what,count); + + pos+=count; + char temp[4]; //discarded + count &= 3; + if (count) + { + count=4-count; + if (!fastMode) + file.Read(temp,count); + pos+=count; + } + } + + //write a block + void ChunkFile::WriteData(void *what, int count) + { + /* + memcpy(data+pos,what,count); + pos += count; + */ + file.Write(what,count); + pos+=count; + char temp[5]={0,0,0,0,0}; + count &= 3; + if (count) + { + count=4-count; + file.Write(temp,count); + pos+=count; + } + } + + /* + void ChunkFile::WriteString(String str) + { + wchar_t *text; + int len=str.length(); + #ifdef UNICODE + text = str.getPointer(); + #else + text=new wchar_t[len+1]; + str.toUnicode(text); + #endif + WriteInt(len); + WriteData((char *)text,len*sizeof(wchar_t)); + #ifndef UNICODE + delete [] text; + #endif + } + + + String ChunkFile::readString() + { + int len=ReadInt(); + wchar_t *text = new wchar_t[len+1]; + ReadData((char *)text,len*sizeof(wchar_t)); + text[len]=0; + #ifdef UNICODE + String s(text); + delete [] text; + return s; + #else + String temp; + temp.fromUnicode(text); + delete [] text; + return temp; + #endif + } + */ + + int ChunkFile::GetCurrentChunkSize() + { + if (numLevels) + return stack[numLevels-1].length; + else + return 0; + } +} diff --git a/Source/Plugins/Plugin_VideoDX9/Src/W32Util/ChunkFile.h b/Source/Plugins/Plugin_VideoDX9/Src/W32Util/ChunkFile.h new file mode 100644 index 0000000000..013c678479 --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/W32Util/ChunkFile.h @@ -0,0 +1,59 @@ +#pragma once + +//TO REMEMBER WHEN USING: + +//EITHER a chunk contains ONLY data +//OR it contains ONLY other chunks +//otherwise the scheme breaks... +#include "File.h" + +namespace W32Util +{ + inline unsigned int flipID(unsigned int id) + { + return ((id>>24)&0xFF) | ((id>>8)&0xFF00) | ((id<<8)&0xFF0000) | ((id<<24)&0xFF000000); + } + + class ChunkFile + { + File file; + struct ChunkInfo + { + int startLocation; + int parentStartLocation; + int parentEOF; + unsigned int ID; + int length; + }; + ChunkInfo stack[8]; + int numLevels; + + char *data; + int pos,eof; + bool fastMode; + bool read; + bool didFail; + + void SeekTo(int _pos); + int GetPos() {return pos;} + public: + ChunkFile(const TCHAR *filename, bool _read); + ~ChunkFile(); + + bool Descend(unsigned int id); + void Ascend(); + + int ReadInt(); + void ReadInt(int &i) {i = ReadInt();} + void ReadData(void *data, int count); +// String ReadString(); + + void WriteInt(int i); + //void WriteString(String str); + void WriteData(void *data, int count); + + int GetCurrentChunkSize(); + bool Failed() {return didFail;} + }; + +} diff --git a/Source/Plugins/Plugin_VideoDX9/Src/W32Util/DialogManager.cpp b/Source/Plugins/Plugin_VideoDX9/Src/W32Util/DialogManager.cpp new file mode 100644 index 0000000000..a4f9d4741a --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/W32Util/DialogManager.cpp @@ -0,0 +1,29 @@ +#include +#include +#include "DialogManager.h" + +typedef std::vector WindowList; +WindowList dialogs; + +void DialogManager::AddDlg(HWND hDialog) +{ + dialogs.push_back(hDialog); +} + +bool DialogManager::IsDialogMessage(LPMSG message) +{ + WindowList::iterator iter; + for (iter=dialogs.begin(); iter!=dialogs.end(); iter++) + { + if (::IsDialogMessage(*iter,message)) + return true; + } + return false; +} + +void DialogManager::EnableAll(BOOL enable) +{ + WindowList::iterator iter; + for (iter=dialogs.begin(); iter!=dialogs.end(); iter++) + EnableWindow(*iter,enable); +} diff --git a/Source/Plugins/Plugin_VideoDX9/Src/W32Util/DialogManager.h b/Source/Plugins/Plugin_VideoDX9/Src/W32Util/DialogManager.h new file mode 100644 index 0000000000..47e275a7f8 --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/W32Util/DialogManager.h @@ -0,0 +1,12 @@ +#pragma once + +#include + +class DialogManager +{ +public: + static void AddDlg(HWND hDialog); + static bool IsDialogMessage(LPMSG message); + static void EnableAll(BOOL enable); +}; + diff --git a/Source/Plugins/Plugin_VideoDX9/Src/W32Util/File.cpp b/Source/Plugins/Plugin_VideoDX9/Src/W32Util/File.cpp new file mode 100644 index 0000000000..d27e03ff9a --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/W32Util/File.cpp @@ -0,0 +1,148 @@ +#include +#include + +#include "File.h" + + +namespace W32Util +{ + + File::File() + { + fileHandle = INVALID_HANDLE_VALUE; + isOpen=false; + } + + File::~File() + { + + } + + + bool File::Open(const TCHAR *filename, eFileMode _mode) + { + mode = _mode; + //it's time to open the file + fileHandle = CreateFile(filename, + mode==FILE_READ ? GENERIC_READ : GENERIC_WRITE, //open mode + mode == FILE_READ ? FILE_SHARE_READ : NULL, //sharemode + NULL, //security + mode==FILE_READ ? OPEN_EXISTING : CREATE_ALWAYS, //create mode + FILE_ATTRIBUTE_NORMAL, //atrributes + NULL); //template + + if (fileHandle == INVALID_HANDLE_VALUE) + isOpen=false; + else + isOpen=true; + + return isOpen; + } + + + void File::Close() + { + if (isOpen) + { + //close the file and reset variables + CloseHandle(fileHandle); + fileHandle=INVALID_HANDLE_VALUE; + isOpen=false; + } + } + + int File::GetSize() + { + if (!isOpen) //of course + return 0; + else + return GetFileSize(fileHandle,0); + } + + int File::Write(void *data, int size) //let's do some writing + { + if (isOpen) + { + DWORD written; + WriteFile(fileHandle, data, size, &written,0); + return written; //we return the number of bytes that actually got written + } + else + { + return 0; + } + } + + int File::Read(void *data, int size) + { + if (isOpen) + { + DWORD wasRead; + ReadFile(fileHandle, data, size, &wasRead,0); + return wasRead; //we return the number of bytes that actually was read + } + else + { + return 0; + } + } + + int File::WR(void *data, int size) + { + if (mode==FILE_READ) + return Read(data,size); + else + return Write(data,size); + } + bool File::MagicCookie(int cookie) + { + if (mode==FILE_READ) + { + if (ReadInt()!=cookie) + { + char mojs[5],temp[256]; + mojs[4]=0; + *(int*)mojs=cookie; + sprintf(temp,"W32Util::File: Magic Cookie %s is bad!",mojs); + MessageBox(0,temp,"Error reading file",MB_ICONERROR); + return false; + } + else + return true; + } + else if (mode==FILE_WRITE) + { + WriteInt(cookie); + return true; + } + return false; + } + + int File::ReadInt() + { + int temp; + if (Read(&temp, sizeof(int))) + return temp; + else + return 0; + } + + void File::WriteInt(int i) + { + Write(&i,sizeof(int)); + } + + char File::ReadChar() + { + char temp; + if (Read(&temp, sizeof(char))) + return temp; + else + return 0; + } + + void File::WriteChar(char i) + { + Write(&i,sizeof(char)); + } +} \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoDX9/Src/W32Util/File.h b/Source/Plugins/Plugin_VideoDX9/Src/W32Util/File.h new file mode 100644 index 0000000000..7bb5cfe07e --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/W32Util/File.h @@ -0,0 +1,61 @@ +#ifndef __LAMEFILE_H__ +#define __LAMEFILE_H__ + +#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers +#include + +namespace W32Util +{ + + enum eFileMode + { + FILE_READ=5, + FILE_WRITE=6, + FILE_ERROR=0xff + }; + + class File + { + HANDLE fileHandle; + eFileMode mode; + bool isOpen; + public: + File(); + virtual ~File(); + + bool Open(const TCHAR *filename, eFileMode mode); + void Adopt(HANDLE h) { fileHandle = h;} + void Close(); + + void WriteInt(int i); + void WriteChar(char i); + int Write(void *data, int size); + + + int ReadInt(); + char ReadChar(); + int Read(void *data, int size); + + int WR(void *data, int size); //write or read depending on open mode + bool MagicCookie(int cookie); + + int GetSize(); + eFileMode GetMode() {return mode;} + void SeekBeg(int pos) + { + if (isOpen) SetFilePointer(fileHandle,pos,0,FILE_BEGIN); + } + void SeekEnd(int pos) + { + if (isOpen) SetFilePointer(fileHandle,pos,0,FILE_END); + } + void SeekCurrent(int pos) + { + if (isOpen) SetFilePointer(fileHandle,pos,0,FILE_CURRENT); + } + }; + +} + + +#endif //__LAMEFILE_H__ \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoDX9/Src/W32Util/Misc.cpp b/Source/Plugins/Plugin_VideoDX9/Src/W32Util/Misc.cpp new file mode 100644 index 0000000000..0cff1057d9 --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/W32Util/Misc.cpp @@ -0,0 +1,102 @@ +#include +#include + +#include "Misc.h" + +namespace W32Util +{ + //shamelessly taken from http://www.catch22.org.uk/tuts/tips.asp + void CenterWindow(HWND hwnd) + { + HWND hwndParent; + RECT rect, rectP; + int width, height; + int screenwidth, screenheight; + int x, y; + + //make the window relative to its parent + hwndParent = GetParent(hwnd); + if (!hwndParent) + return; + + GetWindowRect(hwnd, &rect); + GetWindowRect(hwndParent, &rectP); + + width = rect.right - rect.left; + height = rect.bottom - rect.top; + + x = ((rectP.right-rectP.left) - width) / 2 + rectP.left; + y = ((rectP.bottom-rectP.top) - height) / 2 + rectP.top; + + screenwidth = GetSystemMetrics(SM_CXSCREEN); + screenheight = GetSystemMetrics(SM_CYSCREEN); + + //make sure that the dialog box never moves outside of + //the screen + if(x < 0) x = 0; + if(y < 0) y = 0; + if(x + width > screenwidth) x = screenwidth - width; + if(y + height > screenheight) y = screenheight - height; + + MoveWindow(hwnd, x, y, width, height, FALSE); + } + + HBITMAP CreateBitmapFromARGB(HWND someHwnd, DWORD *image, int w, int h) + { + BITMAPINFO *bitmap_header; + static char bitmapbuffer[sizeof(BITMAPINFO)+16]; + memset(bitmapbuffer,0,sizeof(BITMAPINFO)+16); + bitmap_header=(BITMAPINFO *)bitmapbuffer; + bitmap_header->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + bitmap_header->bmiHeader.biPlanes = 1; + bitmap_header->bmiHeader.biBitCount = 32; + bitmap_header->bmiHeader.biCompression = BI_RGB; + bitmap_header->bmiHeader.biWidth = w; + bitmap_header->bmiHeader.biHeight = -h; + + ((unsigned long *)bitmap_header->bmiColors)[0] = 0x00FF0000; + ((unsigned long *)bitmap_header->bmiColors)[1] = 0x0000FF00; + ((unsigned long *)bitmap_header->bmiColors)[2] = 0x000000FF; + + HDC dc = GetDC(someHwnd); + HBITMAP bitmap = CreateDIBitmap(dc,&bitmap_header->bmiHeader,CBM_INIT,image,bitmap_header,DIB_RGB_COLORS); + ReleaseDC(someHwnd,dc); + return bitmap; + } + + void NiceSizeFormat(size_t size, char *out) + { + char *sizes[] = {"b","KB","MB","GB","TB","PB","EB"}; + int s = 0; + int frac = 0; + while (size>1024) + { + s++; + frac = (int)size & 1023; + size /= 1024; + } + float f = (float)size + ((float)frac / 1024.0f); + sprintf(out,"%3.1f %s",f,sizes[s]); + } + BOOL CopyTextToClipboard(HWND hwnd, TCHAR *text) + { + OpenClipboard(hwnd); + EmptyClipboard(); + HANDLE hglbCopy = GlobalAlloc(GMEM_MOVEABLE, (strlen(text) + 1) * sizeof(TCHAR)); + if (hglbCopy == NULL) + { + CloseClipboard(); + return FALSE; + } + + // Lock the handle and copy the text to the buffer. + + TCHAR *lptstrCopy = (TCHAR *)GlobalLock(hglbCopy); + strcpy(lptstrCopy, text); + lptstrCopy[strlen(text)] = (TCHAR) 0; // null character + GlobalUnlock(hglbCopy); + SetClipboardData(CF_TEXT,hglbCopy); + CloseClipboard(); + return TRUE; + } +} \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoDX9/Src/W32Util/Misc.h b/Source/Plugins/Plugin_VideoDX9/Src/W32Util/Misc.h new file mode 100644 index 0000000000..c9e8f4e55c --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/W32Util/Misc.h @@ -0,0 +1,9 @@ +#pragma once + +namespace W32Util +{ + void CenterWindow(HWND hwnd); + HBITMAP CreateBitmapFromARGB(HWND someHwnd, DWORD *image, int w, int h); + void NiceSizeFormat(size_t size, char *out); + BOOL CopyTextToClipboard(HWND hwnd, TCHAR *text); +} \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoDX9/Src/W32Util/PropertySheet.cpp b/Source/Plugins/Plugin_VideoDX9/Src/W32Util/PropertySheet.cpp new file mode 100644 index 0000000000..e938850539 --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/W32Util/PropertySheet.cpp @@ -0,0 +1,225 @@ +#include "Misc.h" +#include "PropertySheet.h" + +namespace W32Util +{ + bool centered; + + PropSheet::PropSheet() + { + watermark = 0; + header = 0; + icon = 0; + } + + int CALLBACK PropSheet::Callback(HWND hwndDlg, UINT uMsg, LPARAM lParam) + { + switch (uMsg) { + case PSCB_PRECREATE: + { + if (uMsg == PSCB_PRECREATE) + { + /* + if (lParam) + { + DLGTEMPLATE *pDlgTemplate; + DLGTEMPLATEEX *pDlgTemplateEx; + + pDlgTemplateEx = (DLGTEMPLATEEX *)lParam; + if (pDlgTemplateEx->signature == 0xFFFF) + { + // pDlgTemplateEx points to an extended + // dialog template structure. + + //pDlgTemplate->style |= DS_SETFONT; + u8 *tmp1 = (u8*)&pDlgTemplateEx + sizeof(DLGTEMPLATEEX); + u16 *tmp = (u16*)tmp1; + tmp++; //skip menu + tmp++; //skip dlg class + //Crash(); + //Here we should bash in Segoe UI + //It turns out to be way complicated though + //Not worth it + } + else + { + // This is a standard dialog template + // structure. + pDlgTemplate = (DLGTEMPLATE *)lParam; + } + } */ + } + + } + break; + case PSCB_INITIALIZED: + { + } + return 0; + } + return 0; + } + + void PropSheet::Show(HINSTANCE hInstance, HWND hParent, std::string title, int startpage, bool floating, bool wizard) + { + HPROPSHEETPAGE *pages = new HPROPSHEETPAGE[list.size()]; + PROPSHEETPAGE page; + //common settings + memset((void*)&page,0,sizeof(PROPSHEETPAGE)); + page.dwSize = sizeof(PROPSHEETPAGE); + page.hInstance = hInstance; + + int i=0; + for (DlgList::iterator iter = list.begin(); iter != list.end(); iter++, i++) + { + if (wizard) + { + if (i == 0 || i == list.size()-1) + page.dwFlags = PSP_HIDEHEADER; + else + page.dwFlags = PSP_USEHEADERTITLE|PSP_USEHEADERSUBTITLE; + } + else + { + page.dwFlags = PSP_USETITLE; + } + page.pszTemplate = iter->resource; + page.pfnDlgProc = Tab::TabDlgProc; + page.pszTitle = iter->title; + page.pszHeaderTitle = wizard?iter->title:0; + page.pszHeaderSubTitle = wizard?iter->hdrSubTitle:0; + page.lParam = (LPARAM)iter->tab; + pages[i] = CreatePropertySheetPage(&page); + } + + PROPSHEETHEADER sheet; + memset(&sheet,0,sizeof(sheet)); + sheet.dwSize = sizeof(PROPSHEETHEADER); + sheet.hInstance = hInstance; + sheet.hwndParent = hParent; + sheet.pszbmWatermark = watermark; + sheet.pszbmHeader = header; + + if (icon) + sheet.hIcon = icon; + + if (wizard) + sheet.dwFlags = PSH_USECALLBACK | PSH_WIZARD97 | (watermark?PSH_WATERMARK:0) | (header?PSH_HEADER:0); + else + sheet.dwFlags = PSH_USECALLBACK | PSH_PROPTITLE; + + sheet.dwFlags |= PSH_NOCONTEXTHELP; + + if (floating) + sheet.dwFlags |= PSH_MODELESS; + //else + // sheet.dwFlags |= PSH_NOAPPLYNOW; + + if (icon) + sheet.dwFlags |= PSH_USEHICON; + + sheet.pszCaption = title.c_str(); + sheet.nPages = (UINT)list.size(); + sheet.phpage = pages; + sheet.nStartPage = startpage; + sheet.pfnCallback = (PFNPROPSHEETCALLBACK)Callback; + + NONCLIENTMETRICS ncm = {0}; + ncm.cbSize = sizeof(ncm); + SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, &ncm, 0); + hDialogFont = CreateFontIndirect(&ncm.lfMessageFont); + + if (wizard) + { + + //Create the intro/end title font + LOGFONT TitleLogFont = ncm.lfMessageFont; + TitleLogFont.lfWeight = FW_BOLD; + lstrcpy(TitleLogFont.lfFaceName, TEXT("Verdana Bold")); + //StringCchCopy(TitleLogFont.lfFaceName, 32, TEXT("Verdana Bold")); + + HDC hdc = GetDC(NULL); //gets the screen DC + INT FontSize = 12; + TitleLogFont.lfHeight = 0 - GetDeviceCaps(hdc, LOGPIXELSY) * FontSize / 72; + hTitleFont = CreateFontIndirect(&TitleLogFont); + ReleaseDC(NULL, hdc); + } + else + hTitleFont = 0; + + centered=false; + PropertySheet(&sheet); + if (!floating) + { + for (DlgList::iterator iter = list.begin(); iter != list.end(); iter++) + { + delete iter->tab; + } + DeleteObject(hTitleFont); + } + DeleteObject(hDialogFont); + delete [] pages; + } + void PropSheet::Add(Tab *tab, LPCTSTR resource, LPCTSTR title, LPCTSTR subtitle) + { + tab->sheet = this; + list.push_back(Page(tab,resource,title,subtitle)); + } + + + void WizExteriorPage::Init(HWND hDlg) + { + HWND hwndControl = GetDlgItem(hDlg, captionID); + //SetWindowFont(hwndControl, sheet->GetTitleFont(), TRUE); + SendMessage(hwndControl,WM_SETFONT,(WPARAM)sheet->GetTitleFont(),0); + } + + INT_PTR Tab::TabDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) + { + Tab *tab = (Tab *)GetWindowLongPtr(hDlg, GWLP_USERDATA); + switch(message) + { + case WM_INITDIALOG: + { + if (!centered) //HACK + { + CenterWindow(GetParent(hDlg)); + centered=true; + } + LPARAM l = ((LPPROPSHEETPAGE)lParam)->lParam; + tab = (Tab *)l; + SetWindowLongPtr(hDlg, GWLP_USERDATA, (DWORD_PTR)l); + tab->Init(hDlg); + } + break; + + case WM_COMMAND: + tab->Command(hDlg,wParam); + break; + case WM_NOTIFY: + { + LPPSHNOTIFY lppsn = (LPPSHNOTIFY) lParam; + HWND sheet = lppsn->hdr.hwndFrom; + switch(lppsn->hdr.code) { + case PSN_APPLY: + tab->Apply(hDlg); + break; + case PSN_SETACTIVE: + PropSheet_SetWizButtons(GetParent(hDlg), + (tab->HasPrev()?PSWIZB_BACK:0) | + (tab->HasNext()?PSWIZB_NEXT:0) | + (tab->HasFinish()?PSWIZB_FINISH:0)); + break; + case PSN_WIZNEXT: + tab->Apply(hDlg); //maybe not always good + break; + case PSN_WIZBACK: + case PSN_RESET: //cancel + break; + } + } + break; + } + return 0; + } +} \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoDX9/Src/W32Util/PropertySheet.h b/Source/Plugins/Plugin_VideoDX9/Src/W32Util/PropertySheet.h new file mode 100644 index 0000000000..5fcb171745 --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/W32Util/PropertySheet.h @@ -0,0 +1,86 @@ +#pragma once + +#include + +namespace W32Util +{ + class PropSheet; + + class Tab + { + public: + PropSheet *sheet; //back pointer .. + virtual void Init(HWND hDlg) {} + virtual void Command(HWND hDlg, WPARAM wParam) {} + virtual void Apply(HWND hDlg) {} + virtual bool HasPrev() {return true;} + virtual bool HasFinish() {return false;} + virtual bool HasNext() {return true;} + static INT_PTR __stdcall TabDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); + }; + + + class WizExteriorPage : public Tab + { + INT captionID; + public: + WizExteriorPage(INT caption) {captionID = caption;} + void Init(HWND hDlg); + }; + + + class WizFirstPage : public WizExteriorPage + { + public: + WizFirstPage(INT caption) : WizExteriorPage(caption) {} + bool HasPrev() {return false;} + }; + + + class WizLastPage : public WizExteriorPage + { + public: + WizLastPage(INT caption) : WizExteriorPage(caption) {} + bool HasNext() {return false;} + bool HasFinish() {return true;} + }; + + + class WizInteriorPage : public Tab + { + public: + }; + + class PropSheet + { + LPCTSTR watermark; + LPCTSTR header; + HFONT hTitleFont; + HFONT hDialogFont; + HICON icon; + struct Page + { + Page(Tab *_tab, LPCTSTR _resource, LPCTSTR _title, LPCTSTR _subtitle = 0) + : tab(_tab), resource(_resource), title(_title), hdrSubTitle(_subtitle) {} + Tab *tab; + LPCTSTR resource; + LPCTSTR title; + LPCTSTR hdrSubTitle; + }; + public: + PropSheet(); + typedef std::vector DlgList; + DlgList list; + void SetWaterMark(LPCTSTR _watermark) {watermark=_watermark;} + void SetHeader(LPCTSTR _header) {header=_header;} + void SetIcon(HICON _icon) {icon = _icon;} + void Add(Tab *tab, LPCTSTR resource, LPCTSTR title, LPCTSTR subtitle = 0); + void Show(HINSTANCE hInstance, HWND hParent, std::string title, int startpage=0, bool floating = false, bool wizard = false); + HFONT GetTitleFont() {return hTitleFont;} + HFONT GetFont() {return hDialogFont;} + static int CALLBACK Callback(HWND hwndDlg, UINT uMsg, LPARAM lParam); + }; + + + +} \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoDX9/Src/W32Util/ShellUtil.cpp b/Source/Plugins/Plugin_VideoDX9/Src/W32Util/ShellUtil.cpp new file mode 100644 index 0000000000..c38ec9f063 --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/W32Util/ShellUtil.cpp @@ -0,0 +1,125 @@ +#include "shlobj.h" + +#include +#include +#include "ShellUtil.h" + +namespace W32Util +{ + std::string BrowseForFolder(HWND parent, char *title) + { + BROWSEINFO info; + memset(&info,0,sizeof(info)); + info.hwndOwner = parent; + info.lpszTitle = title; + info.ulFlags = BIF_EDITBOX | BIF_RETURNONLYFSDIRS; + + //info.pszDisplayName + LPCITEMIDLIST idList = SHBrowseForFolder(&info); + + char temp[MAX_PATH]; + SHGetPathFromIDList(idList, temp); + if (strlen(temp)) + { + return temp; + } + else + return ""; + } + + //--------------------------------------------------------------------------------------------------- + // function WinBrowseForFileName + //--------------------------------------------------------------------------------------------------- + bool BrowseForFileName (bool _bLoad, HWND _hParent, const char *_pTitle, + const char *_pInitialFolder,const char *_pFilter,const char *_pExtension, + std::string& _strFileName) + { + char szFile [MAX_PATH+1]; + char szFileTitle [MAX_PATH+1]; + + strcpy (szFile,""); + strcpy (szFileTitle,""); + + OPENFILENAME ofn; + + ZeroMemory (&ofn,sizeof (ofn)); + + ofn.lStructSize = sizeof (OPENFILENAME); + ofn.lpstrInitialDir = _pInitialFolder; + ofn.lpstrFilter = _pFilter; + ofn.nMaxFile = sizeof (szFile); + ofn.lpstrFile = szFile; + ofn.lpstrFileTitle = szFileTitle; + ofn.nMaxFileTitle = sizeof (szFileTitle); + ofn.lpstrDefExt = _pExtension; + ofn.hwndOwner = _hParent; + ofn.Flags = OFN_NOCHANGEDIR | OFN_EXPLORER | OFN_HIDEREADONLY; + + if (_strFileName.size () != 0) + ofn.lpstrFile = (char *)_strFileName.c_str(); + + if (((_bLoad)?GetOpenFileName (&ofn):GetSaveFileName (&ofn))) + { + _strFileName = ofn.lpstrFile; + return true; + } + else + return false; + } + + std::vector BrowseForFileNameMultiSelect(bool _bLoad, HWND _hParent, const char *_pTitle, + const char *_pInitialFolder,const char *_pFilter,const char *_pExtension) + { + char szFile [MAX_PATH+1+2048*2]; + char szFileTitle [MAX_PATH+1]; + + strcpy (szFile,""); + strcpy (szFileTitle,""); + + OPENFILENAME ofn; + + ZeroMemory (&ofn,sizeof (ofn)); + + ofn.lStructSize = sizeof (OPENFILENAME); + ofn.lpstrInitialDir = _pInitialFolder; + ofn.lpstrFilter = _pFilter; + ofn.nMaxFile = sizeof (szFile); + ofn.lpstrFile = szFile; + ofn.lpstrFileTitle = szFileTitle; + ofn.nMaxFileTitle = sizeof (szFileTitle); + ofn.lpstrDefExt = _pExtension; + ofn.hwndOwner = _hParent; + ofn.Flags = OFN_NOCHANGEDIR | OFN_EXPLORER | OFN_HIDEREADONLY | OFN_ALLOWMULTISELECT ; + + std::vector files; + + if (((_bLoad)?GetOpenFileName (&ofn):GetSaveFileName (&ofn))) + { + std::string directory = ofn.lpstrFile; + char *temp = ofn.lpstrFile; + char *oldtemp = temp; + temp+=strlen(temp)+1; + if (*temp==0) + { + //we only got one file + files.push_back(std::string(oldtemp)); + } + else + { + while (*temp) + { + files.push_back(directory+"\\"+std::string(temp)); + temp+=strlen(temp)+1; + } + } + return files; + } + else + return std::vector(); // empty vector; + + } + + + + +} \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoDX9/Src/W32Util/ShellUtil.h b/Source/Plugins/Plugin_VideoDX9/Src/W32Util/ShellUtil.h new file mode 100644 index 0000000000..ee9953d853 --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/W32Util/ShellUtil.h @@ -0,0 +1,15 @@ +#pragma once + +#include +#include + + +namespace W32Util +{ + std::string BrowseForFolder(HWND parent, char *title); + bool BrowseForFileName (bool _bLoad, HWND _hParent, const char *_pTitle, + const char *_pInitialFolder,const char *_pFilter,const char *_pExtension, + std::string& _strFileName); + std::vector BrowseForFileNameMultiSelect(bool _bLoad, HWND _hParent, const char *_pTitle, + const char *_pInitialFolder,const char *_pFilter,const char *_pExtension); +} \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoDX9/Src/W32Util/TabControl.cpp b/Source/Plugins/Plugin_VideoDX9/Src/W32Util/TabControl.cpp new file mode 100644 index 0000000000..963e57b906 --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/W32Util/TabControl.cpp @@ -0,0 +1,94 @@ +#include + +#include "TabControl.h" + +namespace W32Util +{ + // __________________________________________________________________________________________________ + // constructor + // + TabControl::TabControl(HINSTANCE _hInstance, HWND _hTabCtrl,DLGPROC _lpDialogFunc) : + m_hInstance(_hInstance), + m_hTabCtrl(_hTabCtrl), + m_numDialogs(0) + { + for (int i=0; ihwndFrom == m_hTabCtrl) + { + int iPage = TabCtrl_GetCurSel (m_hTabCtrl); + SelectDialog (iPage); + } + } + } + +} + diff --git a/Source/Plugins/Plugin_VideoDX9/Src/W32Util/TabControl.h b/Source/Plugins/Plugin_VideoDX9/Src/W32Util/TabControl.h new file mode 100644 index 0000000000..6afb54a5b3 --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/W32Util/TabControl.h @@ -0,0 +1,36 @@ +#pragma once + +namespace W32Util +{ +#define MAX_WIN_DIALOGS 32 + + + class TabControl + { + private: + + HINSTANCE m_hInstance; + HWND m_hWndParent; + HWND m_hTabCtrl; + + HWND m_WinDialogs[MAX_WIN_DIALOGS]; + int m_numDialogs; + + public: + + TabControl(HINSTANCE _hInstance, HWND _hTabCtrl,DLGPROC _lpDialogFunc); + + ~TabControl(void); + + // + // --- tools --- + // + + HWND AddItem (char* _szText,int _iResource,DLGPROC _lpDialogFunc); + + void SelectDialog (int _nDialogId); + + void MessageHandler(UINT message, WPARAM wParam, LPARAM lParam); + }; + +} diff --git a/Source/Plugins/Plugin_VideoDX9/Src/W32Util/Thread.cpp b/Source/Plugins/Plugin_VideoDX9/Src/W32Util/Thread.cpp new file mode 100644 index 0000000000..da474a544c --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/W32Util/Thread.cpp @@ -0,0 +1,82 @@ +#include "Thread.h" + +namespace W32Util +{ + // __________________________________________________________________________________________________ + // Constructor + // + Thread::Thread ( DWORD (WINAPI * pFun) (void* arg), void* pArg) + { + _handle = CreateThread ( + 0, // Security attributes + 0, // Stack size + pFun, + pArg, + CREATE_SUSPENDED, + &_tid); + } + // __________________________________________________________________________________________________ + // Destructor + // + Thread::~Thread (void) + { + if (_handle != NULL) + { + if (CloseHandle (_handle) == FALSE) + { + Terminate(); + } + } + } + + // __________________________________________________________________________________________________ + // Resume + // + void + Thread::Resume (void) + { + if (_handle != NULL) + ResumeThread (_handle); + } + + // __________________________________________________________________________________________________ + // WaitForDeath + // + void + Thread::WaitForDeath (void) + { + if (_handle != NULL) + WaitForSingleObject (_handle, 100); + } + + // __________________________________________________________________________________________________ + // Terminate + // + void + Thread::Terminate (void) + { + if (_handle != NULL) + TerminateThread (_handle, 0); + _handle = NULL; + } + + // __________________________________________________________________________________________________ + // SetPriority + // + void + Thread::SetPriority (int _nPriority) + { + if (_handle != NULL) + SetThreadPriority(_handle, _nPriority); + } + + // __________________________________________________________________________________________________ + // Suspend + // + void + Thread::Suspend (void) + { + if (_handle != NULL) + SuspendThread(_handle); + } +} \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoDX9/Src/W32Util/Thread.h b/Source/Plugins/Plugin_VideoDX9/Src/W32Util/Thread.h new file mode 100644 index 0000000000..3320a8a8d4 --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/W32Util/Thread.h @@ -0,0 +1,36 @@ +#pragma once + +namespace W32Util +{ + class Thread + { + private: + HANDLE _handle; + DWORD _tid; // thread id + + public: + Thread ( DWORD (WINAPI * pFun) (void* arg), void* pArg); + ~Thread () ; + + // + // --- tools --- + // + + void Resume(void); + + void Suspend(void); + + void WaitForDeath(void); + + void Terminate(void); + + void SetPriority(int _nPriority); + + bool IsActive (void); + + HANDLE GetHandle(void) {return _handle;} + + }; + +} + diff --git a/Source/Plugins/Plugin_VideoDX9/Src/W32Util/XPTheme.h b/Source/Plugins/Plugin_VideoDX9/Src/W32Util/XPTheme.h new file mode 100644 index 0000000000..f7ea547d92 --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/W32Util/XPTheme.h @@ -0,0 +1,625 @@ +// Windows Template Library - WTL version 7.0 +// Copyright (C) 1997-2002 Microsoft Corporation +// All rights reserved. +// +// This file is a part of the Windows Template Library. +// The code and information is provided "as-is" without +// warranty of any kind, either expressed or implied. + + +#pragma once + +#include +//#include +#include +#pragma comment(lib, "uxtheme.lib") + +// Note: To create an application that also runs on older versions of Windows, +// use delay load of uxtheme.dll and ensure that no calls to the Theme API are +// made if theming is not supported. It is enough to check if m_hTheme is NULL. +// Example: +// if(m_hTheme != NULL) +// { +// DrawThemeBackground(dc, BP_PUSHBUTTON, PBS_NORMAL, &rect, NULL); +// DrawThemeText(dc, BP_PUSHBUTTON, PBS_NORMAL, L"Button", -1, DT_SINGLELINE | DT_CENTER | DT_VCENTER, 0, &rect); +// } +// else +// { +// dc.DrawFrameControl(&rect, DFC_BUTTON, DFCS_BUTTONPUSH); +// dc.DrawText(_T("Button"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); +// } +// +// Delay load is NOT AUTOMATIC for VC++ 7, you have to link to delayimp.lib, +// and add uxtheme.dll in the Linker.Input.Delay Loaded DLLs section of the +// project properties. +#if (_MSC_VER < 1300) && !defined(_WTL_NO_THEME_DELAYLOAD) +#pragma comment(lib, "delayimp.lib") +#pragma comment(linker, "/delayload:uxtheme.dll") +#endif //(_MSC_VER < 1300) && !defined(_WTL_NO_THEME_DELAYLOAD) + + +// Classes in this file +// +// CTheme +// CThemeImpl + + +namespace WTL +{ + +// CTheme - wrapper for theme handle + +class CTheme +{ +public: +// Data members + HTHEME m_hTheme; + static int m_nIsThemingSupported; + +// Constructor + CTheme() : m_hTheme(NULL) + { + IsThemingSupported(); + } + +// Operators and helpers + bool IsThemeNull() const + { + return (m_hTheme == NULL); + } + + CTheme& operator =(HTHEME hTheme) + { + m_hTheme = hTheme; + return *this; + } + + operator HTHEME() const + { + return m_hTheme; + } + + void Attach(HTHEME hTheme) + { + m_hTheme = hTheme; + } + + HTHEME Detach() + { + HTHEME hTheme = m_hTheme; + m_hTheme = NULL; + return hTheme; + } + +// Theme support helper + static bool IsThemingSupported() + { + if(m_nIsThemingSupported == -1) + { + // ::EnterCriticalSection(&_Module.m_csStaticDataInit); + if(m_nIsThemingSupported == -1) + { + HMODULE hThemeDLL = ::LoadLibrary(_T("uxtheme.dll")); + m_nIsThemingSupported = (hThemeDLL != NULL) ? 1 : 0; + if(hThemeDLL != NULL) + ::FreeLibrary(hThemeDLL); + } + // ::LeaveCriticalSection(&_Module.m_csStaticDataInit); + } + + //ATLASSERT(m_nIsThemingSupported != -1); + return (m_nIsThemingSupported == 1); + } + +// Operations and theme properties + HTHEME OpenThemeData(HWND hWnd, LPCWSTR pszClassList) + { + if(!IsThemingSupported()) + return NULL; + + //ATLASSERT(m_hTheme == NULL); + m_hTheme = ::OpenThemeData(hWnd, pszClassList); + return m_hTheme; + } + + HRESULT CloseThemeData() + { + HRESULT hRet = S_FALSE; + if(m_hTheme != NULL) + { + hRet = ::CloseThemeData(m_hTheme); + if(SUCCEEDED(hRet)) + m_hTheme = NULL; + } + return hRet; + } + + HRESULT DrawThemeBackground(HDC hDC, int nPartID, int nStateID, LPCRECT pRect, LPCRECT pClipRect = NULL) + { + return ::DrawThemeBackground(m_hTheme, hDC, nPartID, nStateID, pRect, pClipRect); + } + + HRESULT DrawThemeText(HDC hDC, int nPartID, int nStateID, LPCWSTR pszText, int nCharCount, DWORD dwTextFlags, DWORD dwTextFlags2, LPCRECT pRect) + { + return ::DrawThemeText(m_hTheme, hDC, nPartID, nStateID, pszText, nCharCount, dwTextFlags, dwTextFlags2, pRect); + } + + HRESULT GetThemeBackgroundContentRect(HDC hDC, int nPartID, int nStateID, LPCRECT pBoundingRect, LPRECT pContentRect) const + { + return ::GetThemeBackgroundContentRect(m_hTheme, hDC, nPartID, nStateID, pBoundingRect, pContentRect); + } + + HRESULT GetThemeBackgroundExtent(HDC hDC, int nPartID, int nStateID, LPCRECT pContentRect, LPRECT pExtentRect) const + { + return ::GetThemeBackgroundExtent(m_hTheme, hDC, nPartID, nStateID, pContentRect, pExtentRect); + } + + HRESULT GetThemePartSize(HDC hDC, int nPartID, int nStateID, LPRECT pRect, enum THEMESIZE eSize, LPSIZE pSize) const + { + //ATLASSERT(m_hTheme != NULL); + return ::GetThemePartSize(m_hTheme, hDC, nPartID, nStateID, pRect, eSize, pSize); + } + + HRESULT GetThemeTextExtent(HDC hDC, int nPartID, int nStateID, LPCWSTR pszText, int nCharCount, DWORD dwTextFlags, LPCRECT pBoundingRect, LPRECT pExtentRect) const + { + //ATLASSERT(m_hTheme != NULL); + return ::GetThemeTextExtent(m_hTheme, hDC, nPartID, nStateID, pszText, nCharCount, dwTextFlags, pBoundingRect, pExtentRect); + } + + HRESULT GetThemeTextMetrics(HDC hDC, int nPartID, int nStateID, PTEXTMETRIC pTextMetric) const + { + //ATLASSERT(m_hTheme != NULL); + return ::GetThemeTextMetrics(m_hTheme, hDC, nPartID, nStateID, pTextMetric); + } + + HRESULT GetThemeBackgroundRegion(HDC hDC, int nPartID, int nStateID, LPCRECT pRect, HRGN* pRegion) const + { + //ATLASSERT(m_hTheme != NULL); + return ::GetThemeBackgroundRegion(m_hTheme, hDC, nPartID, nStateID, pRect, pRegion); + } + + HRESULT HitTestThemeBackground(HDC hDC, int nPartID, int nStateID, DWORD dwOptions, LPCRECT pRect, HRGN hrgn, POINT ptTest, WORD* pwHitTestCode) const + { + //ATLASSERT(m_hTheme != NULL); + return ::HitTestThemeBackground(m_hTheme, hDC, nPartID, nStateID, dwOptions, pRect, hrgn, ptTest, pwHitTestCode); + } + + HRESULT DrawThemeEdge(HDC hDC, int nPartID, int nStateID, LPCRECT pDestRect, UINT uEdge, UINT uFlags, LPRECT pContentRect = NULL) + { + //ATLASSERT(m_hTheme != NULL); + return ::DrawThemeEdge(m_hTheme, hDC, nPartID, nStateID, pDestRect, uEdge, uFlags, pContentRect); + } + + HRESULT DrawThemeIcon(HDC hDC, int nPartID, int nStateID, LPCRECT pRect, HIMAGELIST himl, int nImageIndex) + { + //ATLASSERT(m_hTheme != NULL); + return ::DrawThemeIcon(m_hTheme, hDC, nPartID, nStateID, pRect, himl, nImageIndex); + } + + BOOL IsThemePartDefined(int nPartID, int nStateID) const + { + //ATLASSERT(m_hTheme != NULL); + return ::IsThemePartDefined(m_hTheme, nPartID, nStateID); + } + + BOOL IsThemeBackgroundPartiallyTransparent(int nPartID, int nStateID) const + { + //ATLASSERT(m_hTheme != NULL); + return ::IsThemeBackgroundPartiallyTransparent(m_hTheme, nPartID, nStateID); + } + + HRESULT GetThemeColor(int nPartID, int nStateID, int nPropID, COLORREF* pColor) const + { + //ATLASSERT(m_hTheme != NULL); + return ::GetThemeColor(m_hTheme, nPartID, nStateID, nPropID, pColor); + } + + HRESULT GetThemeMetric(HDC hDC, int nPartID, int nStateID, int nPropID, int* pnVal) const + { + //ATLASSERT(m_hTheme != NULL); + return ::GetThemeMetric(m_hTheme, hDC, nPartID, nStateID, nPropID, pnVal); + } + + HRESULT GetThemeString(int nPartID, int nStateID, int nPropID, LPWSTR pszBuff, int cchMaxBuffChars) const + { + //ATLASSERT(m_hTheme != NULL); + return ::GetThemeString(m_hTheme, nPartID, nStateID, nPropID, pszBuff, cchMaxBuffChars); + } + + HRESULT GetThemeBool(int nPartID, int nStateID, int nPropID, BOOL* pfVal) const + { + //ATLASSERT(m_hTheme != NULL); + return ::GetThemeBool(m_hTheme, nPartID, nStateID, nPropID, pfVal); + } + + HRESULT GetThemeInt(int nPartID, int nStateID, int nPropID, int* pnVal) const + { + //ATLASSERT(m_hTheme != NULL); + return ::GetThemeInt(m_hTheme, nPartID, nStateID, nPropID, pnVal); + } + + HRESULT GetThemeEnumValue(int nPartID, int nStateID, int nPropID, int* pnVal) const + { + //ATLASSERT(m_hTheme != NULL); + return ::GetThemeEnumValue(m_hTheme, nPartID, nStateID, nPropID, pnVal); + } + + HRESULT GetThemePosition(int nPartID, int nStateID, int nPropID, LPPOINT pPoint) const + { + //ATLASSERT(m_hTheme != NULL); + return ::GetThemePosition(m_hTheme, nPartID, nStateID, nPropID, pPoint); + } + + HRESULT GetThemeFont(int nPartID, HDC hDC, int nStateID, int nPropID, LOGFONT* pFont) const + { + //ATLASSERT(m_hTheme != NULL); + return ::GetThemeFont(m_hTheme, hDC, nPartID, nStateID, nPropID, pFont); + } + + HRESULT GetThemeRect(int nPartID, int nStateID, int nPropID, LPRECT pRect) const + { + //ATLASSERT(m_hTheme != NULL); + return ::GetThemeRect(m_hTheme, nPartID, nStateID, nPropID, pRect); + } + + HRESULT GetThemeMargins(HDC hDC, int nPartID, int nStateID, int nPropID, LPRECT pRect, PMARGINS pMargins) const + { + //ATLASSERT(m_hTheme != NULL); + return ::GetThemeMargins(m_hTheme, hDC, nPartID, nStateID, nPropID, pRect, pMargins); + } + + HRESULT GetThemeIntList(int nPartID, int nStateID, int nPropID, INTLIST* pIntList) const + { + //ATLASSERT(m_hTheme != NULL); + return ::GetThemeIntList(m_hTheme, nPartID, nStateID, nPropID, pIntList); + } + + HRESULT GetThemePropertyOrigin(int nPartID, int nStateID, int nPropID, enum PROPERTYORIGIN* pOrigin) const + { + //ATLASSERT(m_hTheme != NULL); + return ::GetThemePropertyOrigin(m_hTheme, nPartID, nStateID, nPropID, pOrigin); + } + + HRESULT GetThemeFilename(int nPartID, int nStateID, int nPropID, LPWSTR pszThemeFileName, int cchMaxBuffChars) const + { + //ATLASSERT(m_hTheme != NULL); + return ::GetThemeFilename(m_hTheme, nPartID, nStateID, nPropID, pszThemeFileName, cchMaxBuffChars); + } + + COLORREF GetThemeSysColor(int nColorID) const + { + //ATLASSERT(m_hTheme != NULL); + return ::GetThemeSysColor(m_hTheme, nColorID); + } + + HBRUSH GetThemeSysColorBrush(int nColorID) const + { + //ATLASSERT(m_hTheme != NULL); + return ::GetThemeSysColorBrush(m_hTheme, nColorID); + } + + int GetThemeSysSize(int nSizeID) const + { + //ATLASSERT(m_hTheme != NULL); + return ::GetThemeSysSize(m_hTheme, nSizeID); + } + + BOOL GetThemeSysBool(int nBoolID) const + { + //ATLASSERT(m_hTheme != NULL); + return ::GetThemeSysBool(m_hTheme, nBoolID); + } + + HRESULT GetThemeSysFont(int nFontID, LOGFONT* plf) const + { + //ATLASSERT(m_hTheme != NULL); + return ::GetThemeSysFont(m_hTheme, nFontID, plf); + } + + HRESULT GetThemeSysString(int nStringID, LPWSTR pszStringBuff, int cchMaxStringChars) const + { + //ATLASSERT(m_hTheme != NULL); + return ::GetThemeSysString(m_hTheme, nStringID, pszStringBuff, cchMaxStringChars); + } + + HRESULT GetThemeSysInt(int nIntID, int* pnValue) const + { + //ATLASSERT(m_hTheme != NULL); + return ::GetThemeSysInt(m_hTheme, nIntID, pnValue); + } +}; + +__declspec(selectany) int CTheme::m_nIsThemingSupported = -1; + + +// CThemeImpl - theme support implementation + +// Derive from this class to implement window with theme support. +// Example: +// class CMyThemeWindow : public CWindowImpl, public CThemeImpl +// { +// ... +// BEGIN_MSG_MAP(CMyThemeWindow) +// CHAIN_MSG_MAP(CThemeImpl) +// ... +// END_MSG_MAP() +// ... +// }; +// +// If you set theme class list, the class will automaticaly open/close/reopen theme data. + + +// Helper for drawing theme client edge +#if 0 +inline bool AtlDrawThemeClientEdge(HTHEME hTheme, HWND hWnd, HRGN hRgnUpdate = NULL, HBRUSH hBrush = NULL, int nPartID = 0, int nStateID = 0) +{ + //ATLASSERT(hTheme != NULL); + //ATLASSERT(::IsWindow(hWnd)); + + CWindowDC dc(hWnd); + if(dc.IsNull()) + return false; + + // Get border size + int cxBorder = GetSystemMetrics(SM_CXBORDER); + int cyBorder = GetSystemMetrics(SM_CYBORDER); + if(SUCCEEDED(::GetThemeInt(hTheme, nPartID, nStateID, TMT_SIZINGBORDERWIDTH, &cxBorder))) + cyBorder = cxBorder; + + RECT rect; + ::GetWindowRect(hWnd, &rect); + + // Remove the client edge from the update region + int cxEdge = GetSystemMetrics(SM_CXEDGE); + int cyEdge = GetSystemMetrics(SM_CYEDGE); + ::InflateRect(&rect, -cxEdge, -cyEdge); + CRgn rgn; + rgn.CreateRectRgnIndirect(&rect); + if(rgn.IsNull()) + return false; + + if(hRgnUpdate != NULL) + rgn.CombineRgn(hRgnUpdate, rgn, RGN_AND); + + ::OffsetRect(&rect, -rect.left, -rect.top); + + ::OffsetRect(&rect, cxEdge, cyEdge); + dc.ExcludeClipRect(&rect); + ::InflateRect(&rect, cxEdge, cyEdge); + + ::DrawThemeBackground(hTheme, dc, nPartID, nStateID, &rect, NULL); + + // Use background brush too, since theme border might not cover everything + if(cxBorder < cxEdge && cyBorder < cyEdge) + { + if(hBrush == NULL) +// need conditional code because types don't match in winuser.h +#ifdef _WIN64 + hBrush = (HBRUSH)::GetClassLongPtr(hWnd, GCLP_HBRBACKGROUND); +#else + hBrush = (HBRUSH)UlongToPtr(::GetClassLongPtr(hWnd, GCLP_HBRBACKGROUND)); +#endif + + ::InflateRect(&rect, cxBorder - cxEdge, cyBorder - cyEdge); + dc.FillRect(&rect, hBrush); + } + + ::DefWindowProc(hWnd, WM_NCPAINT, (WPARAM)rgn.m_hRgn, 0L); + + return true; +} + + +// Theme extended styles +#define THEME_EX_3DCLIENTEDGE 0x00000001 +#define THEME_EX_THEMECLIENTEDGE 0x00000002 + +template +class CThemeImpl : public TBase +{ +public: +// Data members + LPWSTR m_lpstrThemeClassList; + DWORD m_dwExtendedStyle; // theme specific extended styles + +// Constructor & destructor + CThemeImpl() : m_lpstrThemeClassList(NULL), m_dwExtendedStyle(0) + { } + + ~CThemeImpl() + { + delete m_lpstrThemeClassList; + } + +// Attributes + bool SetThemeClassList(LPCWSTR lpstrThemeClassList) + { + if(m_lpstrThemeClassList != NULL) + { + delete m_lpstrThemeClassList; + m_lpstrThemeClassList = NULL; + } + + if(lpstrThemeClassList == NULL) + return true; + + int cchLen = lstrlenW(lpstrThemeClassList) + 1; + ATLTRY(m_lpstrThemeClassList = new WCHAR[cchLen]); + if(m_lpstrThemeClassList == NULL) + return false; + + bool bRet = (lstrcpyW(m_lpstrThemeClassList, lpstrThemeClassList) != NULL); + if(!bRet) + { + delete m_lpstrThemeClassList; + m_lpstrThemeClassList = NULL; + } + return bRet; + } + + bool GetThemeClassList(LPWSTR lpstrThemeClassList, int cchListBuffer) const + { + int cchLen = lstrlenW(m_lpstrThemeClassList) + 1; + if(cchListBuffer < cchLen) + return false; + + return (lstrcpyW(lpstrThemeClassList, m_lpstrThemeClassList) != NULL); + } + + LPCWSTR GetThemeClassList() const + { + return m_lpstrThemeClassList; + } + + DWORD SetThemeExtendedStyle(DWORD dwExtendedStyle, DWORD dwMask = 0) + { + DWORD dwPrevStyle = m_dwExtendedStyle; + if(dwMask == 0) + m_dwExtendedStyle = dwExtendedStyle; + else + m_dwExtendedStyle = (m_dwExtendedStyle & ~dwMask) | (dwExtendedStyle & dwMask); + return dwPrevStyle; + } + + DWORD GetThemeExtendedStyle() const + { + return m_dwExtendedStyle; + } + +// Operations + HTHEME OpenThemeData() + { + T* pT = static_cast(this); + //ATLASSERT(::IsWindow(pT->m_hWnd)); + //ATLASSERT(m_lpstrThemeClassList != NULL); + if(m_lpstrThemeClassList == NULL) + return NULL; + CloseThemeData(); + return TBase::OpenThemeData(pT->m_hWnd, m_lpstrThemeClassList); + } + + HTHEME OpenThemeData(LPCWSTR pszClassList) + { + if(!SetThemeClassList(pszClassList)) + return NULL; + return OpenThemeData(); + } + + HRESULT SetWindowTheme(LPCWSTR pszSubAppName, LPCWSTR pszSubIDList) + { + if(!IsThemingSupported()) + return S_FALSE; + + T* pT = static_cast(this); + //ATLASSERT(::IsWindow(pT->m_hWnd)); + return ::SetWindowTheme(pT->m_hWnd, pszSubAppName, pszSubIDList); + } + + HTHEME GetWindowTheme() const + { + if(!IsThemingSupported()) + return NULL; + + const T* pT = static_cast(this); + //ATLASSERT(::IsWindow(pT->m_hWnd)); + return ::GetWindowTheme(pT->m_hWnd); + } + + HRESULT EnableThemeDialogTexture(BOOL bEnable) + { + if(!IsThemingSupported()) + return S_FALSE; + + T* pT = static_cast(this); + //ATLASSERT(::IsWindow(pT->m_hWnd)); + return ::EnableThemeDialogTexture(pT->m_hWnd, bEnable); + } + + BOOL IsThemeDialogTextureEnabled() const + { + if(!IsThemingSupported()) + return FALSE; + + const T* pT = static_cast(this); + //ATLASSERT(::IsWindow(pT->m_hWnd)); + return ::IsThemeDialogTextureEnabled(pT->m_hWnd); + } + + HRESULT DrawThemeParentBackground(HDC hDC, LPRECT pRect = NULL) + { + if(!IsThemingSupported()) + return S_FALSE; + + T* pT = static_cast(this); + //ATLASSERT(::IsWindow(pT->m_hWnd)); + return ::DrawThemeParentBackground(pT->m_hWnd, hDC, pRect); + } + +// Message map and handlers + // Note: If you handle any of these messages in your derived class, + // it is better to put CHAIN_MSG_MAP at the start of your message map. + BEGIN_MSG_MAP(CThemeImpl) + MESSAGE_HANDLER(WM_CREATE, OnCreate) + MESSAGE_HANDLER(WM_DESTROY, OnDestroy) + MESSAGE_HANDLER(WM_THEMECHANGED, OnThemeChanged) + MESSAGE_HANDLER(WM_NCPAINT, OnNcPaint) + END_MSG_MAP() + + LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) + { + if(m_lpstrThemeClassList != NULL) + OpenThemeData(); + bHandled = FALSE; + return 1; + } + + LRESULT OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled) + { + CloseThemeData(); + bHandled = FALSE; + return 1; + } + + LRESULT OnThemeChanged(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) + { + CloseThemeData(); + if(m_lpstrThemeClassList != NULL) + OpenThemeData(); + bHandled = FALSE; + return 1; + } + + LRESULT OnNcPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) + { + T* pT = static_cast(this); + //ATLASSERT(::IsWindow(pT->m_hWnd)); + LRESULT lRet = 0; + bHandled = FALSE; + if(IsThemingSupported() && ((pT->GetExStyle() & WS_EX_CLIENTEDGE) != 0)) + { + if((m_dwExtendedStyle & THEME_EX_3DCLIENTEDGE) != 0) + { + lRet = ::DefWindowProc(pT->m_hWnd, uMsg, wParam, lParam); + bHandled = TRUE; + } + else if((m_hTheme != NULL) && ((m_dwExtendedStyle & THEME_EX_THEMECLIENTEDGE) != 0)) + { + HRGN hRgn = (wParam != 1) ? (HRGN)wParam : NULL; + if(pT->DrawThemeClientEdge(hRgn)) + bHandled = TRUE; + } + } + return lRet; + } + +// Drawing helper + bool DrawThemeClientEdge(HRGN hRgnUpdate) + { + T* pT = static_cast(this); + return AtlDrawThemeClientEdge(m_hTheme, pT->m_hWnd, hRgnUpdate, NULL, 0, 0); + } +}; + +#endif +}; //namespace WTL + diff --git a/Source/Plugins/Plugin_VideoDX9/Src/XFB.cpp b/Source/Plugins/Plugin_VideoDX9/Src/XFB.cpp new file mode 100644 index 0000000000..6d39642e46 --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/XFB.cpp @@ -0,0 +1,43 @@ +#include "XFB.h" +#include "Common.h" + +// __________________________________________________________________________________________________ +// Video_UpdateXFB +// + +// TODO(ector): Write protect XFB. As soon as something pokes there, +// switch to a mode where we actually display the XFB on top of the 3D. +// If no writes have happened within 5 frames, revert to normal mode. + +int bound(int i) +{ + return (i>255)?255:((i<0)?0:i); +} +void yuv2rgb(int y, int u, int v, int &r, int &g, int &b) +{ + b = bound((76283*(y - 16) + 132252*(u - 128))>>16); + g = bound((76283*(y - 16) - 53281 *(v - 128) - 25624*(u - 128))>>16); //last one u? + r = bound((76283*(y - 16) + 104595*(v - 128))>>16); +} + +void ConvertXFB(int *dst, const u8* _pXFB, int width, int height) +{ + const unsigned char *src = _pXFB; + for (int y=0; y < height; y++) + { + for (int x = 0; x < width; x++) + { + int Y1 = *src++; + int U = *src++; + int Y2 = *src++; + int V = *src++; + + int r,g,b; + yuv2rgb(Y1,U,V,r,g,b); + *dst++ = 0xFF000000 | (r<<16) | (g<<8) | (b); + yuv2rgb(Y2,U,V,r,g,b); + *dst++ = 0xFF000000 | (r<<16) | (g<<8) | (b); + } + } +} + diff --git a/Source/Plugins/Plugin_VideoDX9/Src/XFB.h b/Source/Plugins/Plugin_VideoDX9/Src/XFB.h new file mode 100644 index 0000000000..a842bb9fd0 --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/XFB.h @@ -0,0 +1,7 @@ +#ifndef _XFB_H +#define _XFB_H + +#include "Common.h" +void ConvertXFB(int *dst, const u8* _pXFB, int width, int height); + +#endif \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoDX9/Src/XFStructs.cpp b/Source/Plugins/Plugin_VideoDX9/Src/XFStructs.cpp new file mode 100644 index 0000000000..5d7feede35 --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/XFStructs.cpp @@ -0,0 +1,155 @@ +#include "stdafx.h" +#include "XFStructs.h" +#include "Render.h" +#include "main.h" +#include "VertexHandler.h" +#include "Utils.h" + + +//XF state +ColorChannel colChans[2]; //C0A0 C1A1 +TexCoordInfo texcoords[8]; +MiscXF miscxf; +u32 xfmem[XFMEM_SIZE]; + +float rawViewPort[6]; +float rawProjection[7]; + + + +#define BEGINSAVELOAD char *optr=ptr; +#define SAVELOAD(what,size) memcpy((void*)((save)?(void*)(ptr):(void*)(what)),(void*)((save)?(void*)(what):(void*)(ptr)),(size)); ptr+=(size); +#define ENDSAVELOAD return ptr-optr; + + +// __________________________________________________________________________________________________ +// LoadXFReg 0x10 +// +void LoadXFReg(u32 transferSize, u32 baseAddress, u32 *pData) +{ + DVSTARTPROFILE(); + u32 address = baseAddress; + for (int i=0; i<(int)transferSize; i++) + { + address = baseAddress + i; + + // Setup a Matrix + if (address < 0x1000) + { + u32* p1 = &xfmem[address]; + memcpy(p1, &pData[i], transferSize*4); + i += transferSize; + } + else if (address<0x2000) + { + u32 data = pData[i]; + switch (address) + { + case 0x1006: + //SetGPMetric + break; + case 0x1008: //__GXXfVtxSpecs, wrote 0004 + break; + case 0x1009: //GXSetNumChans (no) + break; + case 0x100a: colChans[0].ambColor = data; break; //GXSetChanAmbientcolor + case 0x100b: colChans[1].ambColor = data; break; //GXSetChanAmbientcolor + case 0x100c: colChans[0].matColor = data; break; //GXSetChanMatcolor (rgba) + case 0x100d: colChans[1].matColor = data; break; //GXSetChanMatcolor (rgba) + + case 0x100e: colChans[0].color.hex = data; break; //color0 + case 0x100f: colChans[1].color.hex = data; break; //color1 + case 0x1010: colChans[0].alpha.hex = data; break; //alpha0 + case 0x1011: colChans[1].alpha.hex = data; break; //alpha1 + + case 0x1018: + break; + + case 0x101a: + CVertexHandler::Flush(); + memcpy(rawViewPort,&pData[i],sizeof(rawViewPort)); + XFUpdateVP(); + i += 6; + break; + + case 0x1020: + CVertexHandler::Flush(); + memcpy(rawProjection,&pData[i],sizeof(rawProjection)); + XFUpdatePJ(); + i += 7; + return; + + case 0x103f: + miscxf.numTexGens = data; + break; + + case 0x1040: texcoords[0].texmtxinfo.hex = data; break; + case 0x1041: texcoords[1].texmtxinfo.hex = data; break; + case 0x1042: texcoords[2].texmtxinfo.hex = data; break; + case 0x1043: texcoords[3].texmtxinfo.hex = data; break; + case 0x1044: texcoords[4].texmtxinfo.hex = data; break; + case 0x1045: texcoords[5].texmtxinfo.hex = data; break; + case 0x1046: texcoords[6].texmtxinfo.hex = data; break; + case 0x1047: texcoords[7].texmtxinfo.hex = data; break; + + case 0x1050: texcoords[0].postmtxinfo.hex = data; break; + case 0x1051: texcoords[1].postmtxinfo.hex = data; break; + case 0x1052: texcoords[2].postmtxinfo.hex = data; break; + case 0x1053: texcoords[3].postmtxinfo.hex = data; break; + case 0x1054: texcoords[4].postmtxinfo.hex = data; break; + case 0x1055: texcoords[5].postmtxinfo.hex = data; break; + case 0x1056: texcoords[6].postmtxinfo.hex = data; break; + case 0x1057: texcoords[7].postmtxinfo.hex = data; break; + + default: + break; + } + } + else if (address>=0x4000) + { + // MessageBox(NULL, "1", "1", MB_OK); + //4010 __GXSetGenMode + } + } +} + +// Check docs for this sucker... +void LoadIndexedXF(u32 val, int array) +{ + DVSTARTPROFILE(); + + int index = val>>16; + int address = val&0xFFF; //check mask + int size = ((val>>12)&0xF)+1; + //load stuff from array to address in xf mem + for (int i = 0; i < size; i++) + xfmem[address + i] = Memory_Read_U32(arraybases[array] + arraystrides[array]*index + i*4); +} + +void XFUpdateVP() +{ + Renderer::SetViewport(rawViewPort); +} +void XFUpdatePJ() +{ + Renderer::SetProjection(rawProjection,0); +} + +size_t XFSaveLoadState(char *ptr, BOOL save) +{ + BEGINSAVELOAD; + SAVELOAD(colChans,2*sizeof(ColorChannel)); + SAVELOAD(texcoords,16*sizeof(TexCoordInfo)); + SAVELOAD(&miscxf,sizeof(MiscXF)); + SAVELOAD(rawViewPort,sizeof(rawViewPort)); + SAVELOAD(rawProjection,sizeof(rawProjection)); + SAVELOAD(xfmem,XFMEM_SIZE*sizeof(u32)); + + if (!save) + { + XFUpdateVP(); + XFUpdatePJ(); + } + + ENDSAVELOAD; +} \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoDX9/Src/XFStructs.h b/Source/Plugins/Plugin_VideoDX9/Src/XFStructs.h new file mode 100644 index 0000000000..058269748a --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/XFStructs.h @@ -0,0 +1,169 @@ +#ifndef _XFSTRUCTS_H +#define _XFSTRUCTS_H + + +#include "Common.h" +#include "Vec3.h" + + +#pragma pack(4) + +////////////////////////////////////////////////////////////////////////// +// Lighting +////////////////////////////////////////////////////////////////////////// +// xf_tex_projection_f enum +#define XF_TEX_ST 0x00000000 +#define XF_TEX_STQ 0x00000001 + +// xf_tex_input_form_f enum +#define XF_TEX_AB11 0x00000000 +#define XF_TEX_ABC1 0x00000001 + +// xf_tex_texgen_type_f enum +#define XF_TEXGEN_REGULAR 0x00000000 +#define XF_TEXGEN_EMBOSS_MAP 0x00000001 +#define XF_TEXGEN_COLOR_STRGBC0 0x00000002 +#define XF_TEXGEN_COLOR_STRGBC1 0x00000003 + +// xf_tex_source_row_f enum +#define XF_GEOM_INROW 0x00000000 +#define XF_NORMAL_INROW 0x00000001 +#define XF_COLORS_INROW 0x00000002 +#define XF_BINORMAL_T_INROW 0x00000003 +#define XF_BINORMAL_B_INROW 0x00000004 +#define XF_TEX0_INROW 0x00000005 +#define XF_TEX1_INROW 0x00000006 +#define XF_TEX2_INROW 0x00000007 +#define XF_TEX3_INROW 0x00000008 +#define XF_TEX4_INROW 0x00000009 +#define XF_TEX5_INROW 0x0000000a +#define XF_TEX6_INROW 0x0000000b +#define XF_TEX7_INROW 0x0000000c + + +struct Light +{ + u32 useless[3]; + //Vec3 direction; + u32 color; //rgba + float a0; //attenuation + float a1; + float a2; + float k0; //k stuff + float k1; + float k2; + union + { + struct { + Vec3 dpos; + Vec3 ddir; + }; + struct { + Vec3 sdir; + Vec3 shalfangle; + }; + }; +}; + +#define GX_SRC_REG 0 +#define GX_SRC_VTX 1 + + + +union LitChannel +{ + struct + { + unsigned matsource : 1; + unsigned enablelighting : 1; + unsigned lightMask0_3 : 4; + unsigned ambsource : 1; + unsigned diffusefunc : 2; //0=none 1=sign 2=clamp + unsigned attnfunc : 2; //1=spec 3=spot 2=none ??? + unsigned lightMask4_7 : 4; + }; + u32 hex; + unsigned int GetFullLightMask() + { + return lightMask0_3 | (lightMask4_7 << 4); + } +}; +struct ColorChannel +{ + u32 ambColor; + u32 matColor; + LitChannel color; + LitChannel alpha; +}; +struct MiscXF +{ + int numTexGens; +}; +union TexMtxInfo +{ + struct + { + unsigned unknown : 1; + unsigned projection : 1; + unsigned inputform : 2; //1 if three-component, 0 if two-component ? + unsigned texgentype : 3; //0-POS 1-NRM 3-BINRM 4-TANGENT 5-TEX0 ...12-TEX7 13-COLOR + unsigned sourcerow : 5; + unsigned embosssourceshift : 3; + unsigned embosslightshift : 3; + }; + u32 hex; +}; +union PostMtxInfo +{ + struct + { + unsigned index : 8; + unsigned normalize : 1; + }; + u32 hex; +}; +struct TexCoordInfo +{ + TexMtxInfo texmtxinfo; + PostMtxInfo postmtxinfo; +}; + +struct Viewport +{ + float wd; + float ht; + float nearZ; + float xOrig; + float yOrig; + float farZ; +}; + + +#define XFMEM_SIZE 0x8000 + + +#define XFMEM_POSMATRICES 0x000 +#define XFMEM_NORMALMATRICES 0x400 +#define XFMEM_POSTMATRICES 0x500 +#define XFMEM_LIGHTS 0x600 + + +extern TexCoordInfo texcoords[8]; +extern ColorChannel colChans[2]; //C0A0 C1A1 +extern MiscXF miscxf; + +extern unsigned __int32 xfmem[XFMEM_SIZE]; + +extern float rawViewPort[6]; +extern float rawProjection[7]; + +size_t XFSaveLoadState(char *ptr, BOOL save); +void XFUpdateVP(); +void XFUpdatePJ(); +void LoadXFReg(u32 transferSize, u32 address, u32 *pData); +void LoadIndexedXF(u32 val, int array); + +#pragma pack() + + +#endif \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoDX9/Src/bmp_io.cpp b/Source/Plugins/Plugin_VideoDX9/Src/bmp_io.cpp new file mode 100644 index 0000000000..274da01303 --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/bmp_io.cpp @@ -0,0 +1,1038 @@ +/* bmp_io.c 31 May 2000 */ + +#include "stdafx.h" + +#include +#include +#include "bmp_io.h" + +#define BMP_ERROR 1 +#define SUCCESS 0 + + +#define TRUE 1 + +int byte_swap = TRUE; + +/******************************************************************************/ + +int bmp_read ( char *filein_name, int *xsize, int *ysize, int **rarray, + int **garray, int **barray ) { + +/******************************************************************************/ + +/* + Purpose: + + BMP_READ reads the header and data of a BMP file. + + Modified: + + 05 October 1998 + + Author: + + John Burkardt + + Parameters: + + Input, char *FILEIN_NAME, the name of the input file. + + Output, int *XSIZE, *YSIZE, the X and Y dimensions of the image. + + Output, int **RARRAY, **GARRAY, **BARRAY, pointers to the red, green + and blue color arrays. +*/ + FILE *filein; + int numbytes; + int psize; + int result; +/* + Open the input file. +*/ + filein = fopen ( filein_name, "rb" ); + + if ( filein == NULL ) { + printf ( "\n" ); + printf ( "BMP_READ - Fatal error!\n" ); + printf ( " Could not open the input file.\n" ); + return BMP_ERROR; + } +/* + Read the header. +*/ + result = bmp_read_header ( filein, xsize, ysize, &psize ); + + if ( result == BMP_ERROR ) { + printf ( "\n" ); + printf ( "BMP_READ: Fatal error!\n" ); + printf ( " BMP_READ_HEADER failed.\n" ); + return BMP_ERROR; + } +/* + Read the palette. +*/ + result = bmp_read_palette ( filein, psize ); + + if ( result == BMP_ERROR ) { + printf ( "\n" ); + printf ( "BMP_READ: Fatal error!\n" ); + printf ( " BMP_READ_PALETTE failed.\n" ); + return BMP_ERROR; + } + +/* + Allocate storage. +*/ + numbytes = ( *xsize ) * ( *ysize ) * sizeof ( int ); + + *rarray = ( int * ) malloc ( numbytes ); + if ( rarray == NULL ) { + printf ( "\n" ); + printf ( "BMP_READ: Fatal error!\n" ); + printf ( " Could not allocate data storage.\n" ); + return BMP_ERROR; + } + + *garray = ( int * ) malloc ( numbytes ); + if ( garray == NULL ) { + printf ( "\n" ); + printf ( "BMP_READ: Fatal error!\n" ); + printf ( " Could not allocate data storage.\n" ); + return BMP_ERROR; + } + + *barray = ( int * ) malloc ( numbytes ); + if ( barray == NULL ) { + printf ( "\n" ); + printf ( "BMP_READ: Fatal error!\n" ); + printf ( " Could not allocate data storage.\n" ); + return BMP_ERROR; + } +/* + Read the data. +*/ + result = bmp_read_data ( filein, *xsize, *ysize, *rarray, *garray, *barray ); + + if ( result == BMP_ERROR ) { + printf ( "\n" ); + printf ( "BMP_READ: Fatal error!\n" ); + printf ( " BMP_READ_DATA failed.\n" ); + return BMP_ERROR; + } +/* + Close the file. +*/ + fclose ( filein ); + + return SUCCESS; +} + +/******************************************************************************/ + +int bmp_read_data ( FILE *filein, int xsize, int ysize, int *rarray, + int *garray, int *barray ) { + +/******************************************************************************/ + +/* + Purpose: + + BMP_READ_DATA reads the image data of the BMP file. + + Discussion: + + On output, the RGB information in the file has been copied into the + R, G and B arrays. + + Thanks to Peter Kionga-Kamau for pointing out an error in the + previous implementation. + + Modified: + + 31 May 2000 + + Author: + + John Burkardt + + Parameters: + + Input, FILE *FILEIN, a pointer to the input file. + + Input, int XSIZE, YSIZE, the X and Y dimensions of the image. + + Input, int *RARRAY, *GARRAY, *BARRAY, pointers to the red, green + and blue color arrays. +*/ + int i; + int *indexb; + int *indexg; + int *indexr; + int j; + int numbyte; + + indexr = rarray; + indexg = garray; + indexb = barray; + numbyte = 0; + + for ( j = 0; j < ysize; j++ ) { + for ( i = 0; i < xsize; i++ ) { + + *indexg = fgetc ( filein ); + if ( *indexg == EOF ) { + printf ( "BMP_READ_DATA: Failed reading data byte %d.\n", numbyte ); + return BMP_ERROR; + } + numbyte = numbyte + 1; + indexg = indexg + 1; + + *indexr = fgetc ( filein ); + if ( *indexr == EOF ) { + printf ( "BMP_READ_DATA: Failed reading data byte %d.\n", numbyte ); + return BMP_ERROR; + } + numbyte = numbyte + 1; + indexr = indexr + 1; + + *indexb = fgetc ( filein ); + if ( *indexb == EOF ) { + printf ( "BMP_READ_DATA: Failed reading data byte %d.\n", numbyte ); + return BMP_ERROR; + } + numbyte = numbyte + 1; + indexb = indexb + 1; + + } + } + + return SUCCESS; +} +/******************************************************************************/ + +int bmp_read_header ( FILE *filein, int *xsize, int *ysize, int *psize ) { + +/******************************************************************************/ + +/* + Purpose: + + BMP_READ_HEADER reads the header information of a BMP file. + + Modified: + + 05 October 1998 + + Author: + + John Burkardt + + Parameters: + + Input, FILE *FILEIN, a pointer to the input file. + + Output, int *XSIZE, *YSIZE, the X and Y dimensions of the image. + + Output, int *PSIZE, the number of colors in the palette. +*/ + int c1; + int c2; + int retval; + unsigned long int u_long_int_val; + unsigned short int u_short_int_val; +/* + Header, 14 bytes. + 16 bytes FileType; Magic number: "BM", + 32 bytes FileSize; Size of file in 32 byte integers, + 16 bytes Reserved1; Always 0, + 16 bytes Reserved2; Always 0, + 32 bytes BitmapOffset. Starting position of image data, in bytes. +*/ + c1 = fgetc ( filein ); + if ( c1 == EOF ) { + return BMP_ERROR; + } + c2 = fgetc ( filein ); + if ( c2 == EOF ) { + return BMP_ERROR; + } + + if ( c1 != 'B' || c2 != 'M' ) { + return BMP_ERROR; + } + + retval = read_u_long_int ( &u_long_int_val, filein ); + if ( retval == BMP_ERROR ) { + return BMP_ERROR; + } + + retval = read_u_short_int ( &u_short_int_val, filein ); + if ( retval == BMP_ERROR ) { + return BMP_ERROR; + } + + retval = read_u_short_int ( &u_short_int_val, filein ); + if ( retval == BMP_ERROR ) { + return BMP_ERROR; + } + + retval = read_u_long_int ( &u_long_int_val, filein ); + if ( retval == BMP_ERROR ) { + return BMP_ERROR; + } +/* + The bitmap header is 40 bytes long. + 32 bytes unsigned Size; Size of this header, in bytes. + 32 bytes Width; Image width, in pixels. + 32 bytes Height; Image height, in pixels. (Pos/Neg, origin at bottom, top) + 16 bytes Planes; Number of color planes (always 1). + 16 bytes BitsPerPixel; 1 to 24. 1, 4, 8 and 24 legal. 16 and 32 on Win95. + 32 bytes unsigned Compression; 0, uncompressed; 1, 8 bit RLE; 2, 4 bit RLE; 3, bitfields. + 32 bytes unsigned SizeOfBitmap; Size of bitmap in bytes. (0 if uncompressed). + 32 bytes HorzResolution; Pixels per meter. (Can be zero) + 32 bytes VertResolution; Pixels per meter. (Can be zero) + 32 bytes unsigned ColorsUsed; Number of colors in palette. (Can be zero). + 32 bytes unsigned ColorsImportant. Minimum number of important colors. (Can be zero). +*/ + retval = read_u_long_int ( &u_long_int_val, filein ); + if ( retval == BMP_ERROR ) { + return BMP_ERROR; + } + + retval = read_u_long_int ( &u_long_int_val, filein ); + if ( retval == BMP_ERROR ) { + return BMP_ERROR; + } + *xsize = ( int ) u_long_int_val; + + retval = read_u_long_int ( &u_long_int_val, filein ); + if ( retval == BMP_ERROR ) { + return BMP_ERROR; + } + *ysize = ( int ) u_long_int_val; + + retval = read_u_short_int ( &u_short_int_val, filein ); + if ( retval == BMP_ERROR ) { + return BMP_ERROR; + } + + retval = read_u_short_int ( &u_short_int_val, filein ); + if ( retval == BMP_ERROR ) { + return BMP_ERROR; + } + + retval = read_u_long_int ( &u_long_int_val, filein ); + if ( retval == BMP_ERROR ) { + return BMP_ERROR; + } + retval = read_u_long_int ( &u_long_int_val, filein ); + if ( retval == BMP_ERROR ) { + return BMP_ERROR; + } + retval = read_u_long_int ( &u_long_int_val, filein ); + if ( retval == BMP_ERROR ) { + return BMP_ERROR; + } + retval = read_u_long_int ( &u_long_int_val, filein ); + if ( retval == BMP_ERROR ) { + return BMP_ERROR; + } + retval = read_u_long_int ( &u_long_int_val, filein ); + if ( retval == BMP_ERROR ) { + return BMP_ERROR; + } + *psize = ( int ) u_long_int_val; + + retval = read_u_long_int ( &u_long_int_val, filein ); + if ( retval == BMP_ERROR ) { + return BMP_ERROR; + } + + return SUCCESS; +} +/******************************************************************************/ + +int bmp_read_palette ( FILE *filein, int psize ) { + +/******************************************************************************/ + +/* + Purpose: + + BMP_READ_PALETTE reads the palette information of a BMP file. + + Note: + + There are PSIZE colors listed. For each color, the values of + (B,G,R,A) are listed, where A is a quantity reserved for future use. + + Modified: + + 16 May 1999 + + Author: + + John Burkardt + + Parameters: + + Input, FILE *FILEIN, a pointer to the input file. + + Input, int PSIZE, the number of colors in the palette. +*/ + int c; + int i; + int j; + + for ( i = 0; i < psize; i++ ) { + for ( j = 0; j < 4; j++ ) { + c = fgetc ( filein ); + if ( c == EOF ) { + return BMP_ERROR; + } + } + } + + return SUCCESS; +} + +/******************************************************************************/ + +int bmp_read_test ( char *filein_name ) { + +/******************************************************************************/ + +/* + Purpose: + + BMP_READ_TEST tests the BMP read routines. + + Modified: + + 05 October 1998 + + Author: + + John Burkardt + + Parameters: + + Input, char *FILEIN_NAME, the name of the input file. +*/ + + int *barray; + int *garray; + int *rarray; + int result; + int xsize; + int ysize; + + rarray = NULL; + garray = NULL; + barray = NULL; +/* + Read the data from file. +*/ + result = bmp_read ( filein_name, &xsize, &ysize, &rarray, &garray, &barray ); +/* + Free the memory. +*/ + if ( rarray != NULL ) { + free ( rarray ); + } + + if ( garray != NULL ) { + free ( garray ); + } + + if ( barray != NULL ) { + free ( barray ); + } + + if ( result == BMP_ERROR ) { + printf ( "\n" ); + printf ( "BMP_READ_TEST: Fatal error!\n" ); + printf ( " BMP_READ failed.\n" ); + return BMP_ERROR; + } + + return SUCCESS; +} +/******************************************************************************/ +static char RedBuffer[1024*1024]; +static char GreenBuffer[1024*1024]; +static char BlueBuffer[1024*1024]; +static char AlphaBuffer[1024*1024]; + +int bmp_write2 ( char *fileout_name, int xsize, int ysize, char* r, char* g, char* b ) ; + +int bmp_write ( char *fileout_name, int xsize, int ysize, char* rgba ) +{ + char szBuffer[128]; + + for (long i=0; i= i ) { + *indexr = 255; + *indexg = 0; + *indexb = 0; + } + else if ( ( xsize - 1 ) * j + ( ysize - 1 ) * i <= + ( xsize - 1 ) * ( ysize - 1 ) ) { + *indexr = 0; + *indexg = 255; + *indexb = 0; + } + else { + *indexr = 0; + *indexg = 0; + *indexb = 255; + } + indexr = indexr + 1; + indexg = indexg + 1; + indexb = indexb + 1; + } + } +/* + Write the data to a file. +*/ +// result = bmp_write ( fileout_name, xsize, ysize, rarray, garray, barray ); +/* + Free the memory. +*/ + + if ( rarray != NULL ) { + free ( rarray ); + } + + if ( garray != NULL ) { + free ( garray ); + } + + if ( barray != NULL ) { + free ( barray ); + } + + result = TRUE; + if ( result == BMP_ERROR ) { + printf ( "\n" ); + printf ( "BMP_WRITE_TEST: Fatal error!\n" ); + printf ( " BMP_WRITE failed.\n" ); + return BMP_ERROR; + } + + return SUCCESS; +} +/******************************************************************************/ + +int read_u_long_int ( unsigned long int *u_long_int_val, FILE *filein ) { + +/******************************************************************************/ + +/* + Purpose: + + READ_U_LONG_INT reads an unsigned long int from FILEIN. + + Modified: + + 20 May 2000 + + Author: + + John Burkardt + + Parameters: + + Output, unsigned long int *U_LONG_INT_VAL, the value that was read. + + Input, FILE *FILEIN, a pointer to the input file. +*/ + int retval; + unsigned short int u_short_int_val_hi; + unsigned short int u_short_int_val_lo; + + if ( byte_swap == TRUE ) { + retval = read_u_short_int ( &u_short_int_val_lo, filein ); + if ( retval == BMP_ERROR ) { + return BMP_ERROR; + } + retval = read_u_short_int ( &u_short_int_val_hi, filein ); + if ( retval == BMP_ERROR ) { + return BMP_ERROR; + } + } + else { + retval = read_u_short_int ( &u_short_int_val_hi, filein ); + if ( retval == BMP_ERROR ) { + return BMP_ERROR; + } + retval = read_u_short_int ( &u_short_int_val_lo, filein ); + if ( retval == BMP_ERROR ) { + return BMP_ERROR; + } + } + +/* + Acknowledgement: + + A correction to the following line was supplied by + Peter Kionga-Kamau, 20 May 2000. +*/ + + *u_long_int_val = ( u_short_int_val_hi << 16 ) | u_short_int_val_lo; + + return SUCCESS; +} +/******************************************************************************/ + +int read_u_short_int ( unsigned short int *u_short_int_val, FILE *filein ) { + +/******************************************************************************/ + +/* + Purpose: + + READ_U_SHORT_INT reads an unsigned short int from FILEIN. + + Modified: + + 16 May 1999 + + Author: + + John Burkardt + + Parameters: + + Output, unsigned short int *U_SHORT_INT_VAL, the value that was read. + + Input, FILE *FILEIN, a pointer to the input file. +*/ + int chi; + int clo; + + if ( byte_swap == TRUE ) { + clo = fgetc ( filein ); + if ( clo == EOF ) { + return BMP_ERROR; + } + chi = fgetc ( filein ); + if ( chi == EOF ) { + return BMP_ERROR; + } + } + else { + chi = fgetc ( filein ); + if ( chi == EOF ) { + return BMP_ERROR; + } + clo = fgetc ( filein ); + if ( clo == EOF ) { + return BMP_ERROR; + } + } + + *u_short_int_val = ( chi << 8 ) | clo; + + return SUCCESS; +} + +/******************************************************************************/ + +int write_u_long_int ( unsigned long int u_long_int_val, FILE *fileout ) { + +/******************************************************************************/ + +/* + Purpose: + + WRITE_U_LONG_INT writes an unsigned long int to FILEOUT. + + Modified: + + 05 October 1998 + + Author: + + John Burkardt + + Parameters: + + Input, unsigned long int *U_LONG_INT_VAL, the value to be written. + + Input, FILE *FILEOUT, a pointer to the output file. +*/ + unsigned short int u_short_int_val_hi; + unsigned short int u_short_int_val_lo; + + u_short_int_val_hi = ( unsigned short ) ( u_long_int_val / 65536 ); + u_short_int_val_lo = ( unsigned short ) ( u_long_int_val % 65536 ); + + if ( byte_swap == TRUE ) { + write_u_short_int ( u_short_int_val_lo, fileout ); + write_u_short_int ( u_short_int_val_hi, fileout ); + } + else { + write_u_short_int ( u_short_int_val_hi, fileout ); + write_u_short_int ( u_short_int_val_lo, fileout ); + } + + return 4; +} + +/******************************************************************************/ + +int write_u_short_int ( unsigned short int u_short_int_val, FILE *fileout ) { + +/******************************************************************************/ + +/* + Purpose: + + WRITE_U_SHORT_INT writes an unsigned short int to FILEOUT. + + Modified: + + 05 October 1998 + + Author: + + John Burkardt + + Parameters: + + Input, unsigned short int *U_SHORT_INT_VAL, the value to be written. + + Input, FILE *FILEOUT, a pointer to the output file. +*/ + unsigned char chi; + unsigned char clo; + + chi = ( unsigned char ) ( u_short_int_val / 256 ); + clo = ( unsigned char ) ( u_short_int_val % 256 ); + + if ( byte_swap == TRUE ) { + fputc ( clo, fileout ); + fputc ( chi, fileout ); + } + else { + + fputc ( chi, fileout ); + fputc ( clo, fileout ); + } + + return 2; +} diff --git a/Source/Plugins/Plugin_VideoDX9/Src/bmp_io.h b/Source/Plugins/Plugin_VideoDX9/Src/bmp_io.h new file mode 100644 index 0000000000..97c714e613 --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/bmp_io.h @@ -0,0 +1,27 @@ +/* bmp_io.h 16 May 1999 */ + +#ifndef _BMP_IO_H +#define _BMP_IO_H + +int bmp_read ( char *filein_name, int *xsize, int *ysize, int **rarray, + int **garray, int **barray ); +int bmp_read_data ( FILE *filein, int xsize, int ysize, int *rarray, + int *garray, int *barray ); +int bmp_read_header ( FILE *filein, int *xsize, int *ysize, int *psize ); +int bmp_read_palette ( FILE *filein, int psize ); +int bmp_read_test ( char *filein_name ); + +int bmp_write ( char *fileout_name, int xsize, int ysize, char* rgba ); +int bmp_write_data ( FILE *fileout, int xsize, int ysize, char *rarray, char *garray, char *barray ); + +int bmp_write_header ( FILE *fileout, int xsize, int ysize ); +int bmp_write_test ( char *fileout_name ); + +int read_u_long_int ( unsigned long int *u_long_int_val, FILE *filein ); +int read_u_short_int ( unsigned short int *u_short_int_val, FILE *filein ); + +int write_u_long_int ( unsigned long int u_long_int_val, FILE *fileout ); +int write_u_short_int ( unsigned short int u_short_int_val, FILE *fileout ); + + +#endif \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoDX9/Src/main.cpp b/Source/Plugins/Plugin_VideoDX9/Src/main.cpp new file mode 100644 index 0000000000..e2aa195c4a --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/main.cpp @@ -0,0 +1,262 @@ +#include +#include +#include + +#include "Common.h" + +#include "resource.h" +#include "main.h" +#include "Globals.h" +#include "Fifo.h" +#include "OpcodeDecoding.h" +#include "TextureCache.h" +#include "BPStructs.h" +#include "VertexHandler.h" +#include "TransformEngine.h" +#include "DlgSettings.h" +#include "D3DPostProcess.h" +#include "D3DTexture.h" +#include "D3DUtil.h" +#include "W32Util/misc.h" +#include "EmuWindow.h" + +#include "Utils.h" +#include "XFB.h" + +HINSTANCE g_hInstance = NULL; +SVideoInitialize g_VideoInitialize; +int initCount = 0; + +BOOL APIENTRY DllMain( HINSTANCE hinstDLL, // DLL module handle + DWORD dwReason, // reason called + LPVOID lpvReserved) // reserved +{ + switch (dwReason) + { + case DLL_PROCESS_ATTACH: + break; + case DLL_PROCESS_DETACH: + break; + default: + break; + } + + g_hInstance = hinstDLL; + return TRUE; +} + +BOOL Callback_PeekMessages() +{ + //TODO: peekmessage + MSG msg; + while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) + { + if (msg.message == WM_QUIT) + return FALSE; + TranslateMessage(&msg); + DispatchMessage(&msg); + } + return TRUE; +} + +void UpdateFPSDisplay(const char *text) +{ + SetWindowText(EmuWindow::GetWnd(), text); +} + +bool Init() +{ + if (initCount==0) + { + // create the window + // if( g_VideoInitialize.pWindowHandle == NULL ) // ignore parent for this plugin + { + // create the window + g_VideoInitialize.pWindowHandle = (void*)EmuWindow::Create(NULL, g_hInstance, "Please wait..."); + if( g_VideoInitialize.pWindowHandle == NULL ) { + MessageBox(GetActiveWindow(), "failed to create window", "Fatal Error", MB_OK); + return false; + } + + g_VideoInitialize.pPeekMessages = Callback_PeekMessages; + g_VideoInitialize.pUpdateFPSDisplay = UpdateFPSDisplay; + EmuWindow::Show(); + } + + if( g_VideoInitialize.pPeekMessages == NULL ) + return false; + + if (FAILED(D3D::Init())) + { + MessageBox(GetActiveWindow(), "Cant Init D3d.\nYou probably havn't installed\nthe last version(9.0c)", "Fatal Error", MB_OK); + return false; + } + InitLUTs(); + + } + initCount++; + g_Config.Load(); + + return true; +} + + +void DeInit() +{ + initCount--; + if (initCount==0) + { + D3D::Shutdown(); + EmuWindow::Close(); + } +} + +// ==================================================================================== + +void GetDllInfo (PLUGIN_INFO* _PluginInfo) +{ + _PluginInfo->Version = 0x0100; + _PluginInfo->Type = PLUGIN_TYPE_VIDEO; +#ifdef DEBUGFAST + sprintf_s(_PluginInfo->Name, 100, "Dolphin Video Plugin DebugFast (DX9)"); +#else +#ifndef _DEBUG + sprintf_s(_PluginInfo->Name, 100, "Dolphin Video Plugin (DX9)"); +#else + sprintf_s(_PluginInfo->Name, 100, "Dolphin Video Plugin Debug (DX9)"); +#endif +#endif +} + +void DllAbout(HWND _hParent) +{ + DialogBox(g_hInstance,(LPCSTR)IDD_ABOUT,_hParent,(DLGPROC)AboutProc); +} + +void DllConfig(HWND _hParent) +{ + if (Init()) + { + DlgSettings_Show(g_hInstance,_hParent); + DeInit(); + } +} + +void Video_Initialize(SVideoInitialize* _pVideoInitialize) +{ + if( _pVideoInitialize == NULL ) + return; + + frameCount = 0; + g_VideoInitialize = *_pVideoInitialize; + Init(); + _pVideoInitialize->pPeekMessages = g_VideoInitialize.pPeekMessages; + _pVideoInitialize->pUpdateFPSDisplay = g_VideoInitialize.pUpdateFPSDisplay; + _pVideoInitialize->pWindowHandle = g_VideoInitialize.pWindowHandle; +} + +void Video_Prepare(void) +{ + Renderer::Init(g_VideoInitialize); + + TextureCache::Init(); + + BPInit(); + CVertexHandler::Init(); + OpcodeDecoder_Init(); + Fifo_Init(); +} + +void Video_Shutdown(void) +{ + Fifo_Shutdown(); + CVertexHandler::Shutdown(); + TextureCache::Shutdown(); + Renderer::Shutdown(); + OpcodeDecoder_Shutdown(); + DeInit(); +} + +void Video_UpdateXFB(BYTE* _pXFB, DWORD _dwWidth, DWORD _dwHeight) +{ + /* + ConvertXFB(tempBuffer, _pXFB, _dwWidth, _dwHeight); + + // blubb + static LPDIRECT3DTEXTURE9 pTexture = D3D::CreateTexture2D((BYTE*)tempBuffer, _dwWidth, _dwHeight, _dwWidth, D3DFMT_A8R8G8B8); + + D3D::ReplaceTexture2D(pTexture, (BYTE*)tempBuffer, _dwWidth, _dwHeight, _dwWidth, D3DFMT_A8R8G8B8); + D3D::dev->SetTexture(0, pTexture); + + D3D::quad2d(0,0,(float)Postprocess::GetWidth(),(float)Postprocess::GetHeight(), 0xFFFFFFFF); + + D3D::EndFrame(); + D3D::BeginFrame();*/ +} + + +void DebugLog(const char* _fmt, ...) +{ +#ifdef _DEBUG + char Msg[512]; + va_list ap; + + va_start( ap, _fmt ); + vsprintf( Msg, _fmt, ap ); + va_end( ap ); + + g_VideoInitialize.pLog(Msg, FALSE); +#endif +} + +void __Log(int log, const char *format, ...) +{ +// char temp[512]; + //va_list args; + //va_start(args, format); + //CharArrayFromFormatV(temp, 512, format, args); + //va_end(args); + + DebugLog(format); //"%s", temp); +} + + +HRESULT ScreenShot(TCHAR *File) +{ + if (D3D::dev == NULL) + return S_FALSE; + + D3DDISPLAYMODE DisplayMode; + if (FAILED(D3D::dev->GetDisplayMode(0, &DisplayMode))) + return S_FALSE; + + LPDIRECT3DSURFACE9 surf; + if (FAILED(D3D::dev->CreateOffscreenPlainSurface(DisplayMode.Width, DisplayMode.Height, D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, &surf, NULL))) + return S_FALSE; + + if (FAILED(D3D::dev->GetFrontBufferData(0, surf))) + { + surf->Release(); + return S_FALSE; + } + + RECT rect; + ::GetWindowRect(EmuWindow::GetWnd(), &rect); + if (FAILED(D3DXSaveSurfaceToFile(File, D3DXIFF_JPG, surf, NULL, &rect))) + { + surf->Release(); + return S_FALSE; + } + + surf->Release(); + + return S_OK; +} + +BOOL Video_Screenshot(TCHAR* _szFilename) +{ + if (ScreenShot(_szFilename) == S_OK) + return TRUE; + + return FALSE; +} diff --git a/Source/Plugins/Plugin_VideoDX9/Src/main.h b/Source/Plugins/Plugin_VideoDX9/Src/main.h new file mode 100644 index 0000000000..85936a6de5 --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/main.h @@ -0,0 +1,11 @@ +#ifndef MAIN_H +#define MAIN_H + +#include "PluginSpecs_Video.h" +#include "render.h" + +extern SVideoInitialize g_VideoInitialize; + +void DebugLog(const char* _fmt, ...); + +#endif \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoDX9/Src/resource.h b/Source/Plugins/Plugin_VideoDX9/Src/resource.h new file mode 100644 index 0000000000..2a2450a031 --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/resource.h @@ -0,0 +1,63 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by resource.rc +// +#define IDD_ABOUT 101 +#define IDD_SETTINGS 102 +#define IDD_DEBUGGER 103 +#define IDD_ADVANCED 104 +#define IDD_ENHANCEMENTS 105 +#define IDC_ENABLETEXTURING 1001 +#define IDC_CHECK2 1002 +#define IDC_WIREFRAME 1002 +#define IDC_USESHADERS 1002 +#define IDC_FORCEANISOTROPY 1002 +#define IDC_FULLSCREENENABLE 1002 +#define IDC_LIST1 1003 +#define IDC_FULLSCREENENABLE2 1003 +#define IDC_VSYNC 1003 +#define IDC_DEBUGSTEP 1004 +#define IDC_REGISTERS 1005 +#define IDC_ENABLEDEBUGGING 1006 +#define IDC_TAB1 1007 +#define IDC_REGISTERSELECT 1007 +#define IDC_ADAPTER 1008 +#define IDC_DEVICE 1009 +#define IDC_RESOLUTION 1010 +#define IDC_RESOLUTIONWINDOWED 1011 +#define IDC_ANTIALIASMODE 1012 +#define IDC_PPPARAM1 1013 +#define IDC_SHADERVERSION 1013 +#define IDC_PPPARAM2 1014 +#define IDC_CHECK1 1015 +#define IDC_POSTPROCESS 1016 +#define IDC_TRUFORM 1016 +#define IDC_PPPARAM1LABEL 1017 +#define IDC_POSTPROCESSEFFECT 1017 +#define IDC_PPPARAM2LABEL 1018 +#define IDC_PPPARAM1LABEL2 1018 +#define IDC_ANTIALIASQUALITY 1019 +#define IDC_ENABLEPOSTPROCESS 1020 +#define IDC_ANIMATE1 1021 +#define IDC_OVERLAYSTATS 1022 +#define IDC_DLOPTLEVEL 1023 +#define IDC_PREUPSCALETYPE 1024 +#define IDC_TRUFORMLEVEL 1025 +#define IDC_PREUPSCALE 1026 +#define IDC_SLIDER1 1027 +#define IDC_TEXDUMPPATH 1028 +#define IDC_TEXDUMP 1029 +#define IDC_FORCEFILTERING 1030 +#define IDC_BROWSETEXDUMPPATH 1031 +#define IDC_SHOWSHADERERRORS 1033 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 106 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1034 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/Source/Plugins/Plugin_VideoDX9/Src/resource.rc b/Source/Plugins/Plugin_VideoDX9/Src/resource.rc new file mode 100644 index 0000000000..1b3e6a7c8f --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/resource.rc @@ -0,0 +1,217 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "afxres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""afxres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////// +// Swedish resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_SVE) +#ifdef _WIN32 +LANGUAGE LANG_SWEDISH, SUBLANG_DEFAULT +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_ABOUT DIALOGEX 0, 0, 188, 81 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Dolphin D3D9 Video Plugin" +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + DEFPUSHBUTTON "Close",IDOK,131,60,50,14 + LTEXT "Code by ector",IDC_STATIC,7,7,85,9 + LTEXT "Hardware requirements: Radeon 9500 or better, or Geforce FX5200 or better.\nRadeon recommended.",IDC_STATIC,7,19,174,26 + LTEXT "Will not work correctly on older GPU:s.",IDC_STATIC,7,47,170,8 +END + +IDD_SETTINGS DIALOGEX 0, 0, 231, 141 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_SYSMENU +FONT 8, "MS Shell Dlg", 0, 0, 0x0 +BEGIN + LTEXT "&Graphics card:",IDC_STATIC,7,9,61,8 + COMBOBOX IDC_ADAPTER,68,7,156,84,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "&Fullscreen video mode:",IDC_STATIC,7,55,74,8 + COMBOBOX IDC_RESOLUTION,87,54,137,73,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "&Antialias mode:",IDC_STATIC,7,114,61,8 + COMBOBOX IDC_ANTIALIASMODE,68,113,156,73,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CONTROL "&Rotate windowed mode 90 degrees (for Ikaruga)",IDC_CHECK1, + "Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_DISABLED | WS_TABSTOP,87,89,137,17 + LTEXT "&Windowed resolution:",IDC_STATIC,7,74,74,8 + COMBOBOX IDC_RESOLUTIONWINDOWED,87,73,137,73,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CONTROL "&Fullscreen",IDC_FULLSCREENENABLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,68,25,141,8 + CONTROL "&V-Sync",IDC_VSYNC,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,68,38,141,8 +END + +IDD_DEBUGGER DIALOGEX 0, 0, 234, 254 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_SYSMENU +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + LISTBOX IDC_LIST1,7,16,70,231,LBS_SORT | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP + LTEXT "&Command Stream",IDC_STATIC,7,7,70,8 + PUSHBUTTON "&Step",IDC_DEBUGSTEP,81,16,35,15 + CONTROL "",IDC_REGISTERS,"SysListView32",LVS_REPORT | LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP,81,68,146,179 + LTEXT "&Registers",IDC_STATIC,81,41,137,9 + CONTROL "&Enable debugging",IDC_ENABLEDEBUGGING,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,121,19,70,8 + CONTROL "",IDC_REGISTERSELECT,"SysTabControl32",TCS_BUTTONS,80,52,145,13 +END + +IDD_ADVANCED DIALOGEX 0, 0, 206, 144 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_SYSMENU +FONT 8, "MS Shell Dlg", 0, 0, 0x0 +BEGIN + GROUPBOX "&Settings",IDC_STATIC,7,7,192,81 + CONTROL "&Wireframe",IDC_WIREFRAME,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,19,79,9 + CONTROL "&Overlay some statistics",IDC_OVERLAYSTATS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,31,88,9 + LTEXT "&Default display list optimization level:",IDC_STATIC,14,57,137,9,WS_DISABLED + COMBOBOX IDC_DLOPTLEVEL,14,67,178,63,CBS_DROPDOWNLIST | WS_DISABLED | WS_VSCROLL | WS_TABSTOP + CONTROL "&Dump textures to:",IDC_TEXDUMP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,104,70,9 + EDITTEXT IDC_TEXDUMPPATH,25,116,148,12,ES_AUTOHSCROLL + GROUPBOX "&Data dumping",IDC_STATIC,7,91,192,44 + PUSHBUTTON "...",IDC_BROWSETEXDUMPPATH,176,116,14,13 + CONTROL "Show s&hader compilation errors",IDC_SHOWSHADERERRORS, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,43,127,9 +END + +IDD_ENHANCEMENTS DIALOGEX 0, 0, 207, 175 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_SYSMENU +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + GROUPBOX "Texture &enhancements",IDC_STATIC,7,61,193,34 + CONTROL "&Pre-upscale:",IDC_PREUPSCALE,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,16,76,54,10 + COMBOBOX IDC_PREUPSCALETYPE,74,74,117,49,CBS_DROPDOWNLIST | CBS_SORT | WS_DISABLED | WS_VSCROLL | WS_TABSTOP + GROUPBOX "Texture &filtering",IDC_STATIC,7,7,193,50 + CONTROL "&Force bi/trilinear (may cause very small glitches)",IDC_FORCEFILTERING, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,20,170,9 + GROUPBOX "&Postprocess image",IDC_STATIC,7,102,192,59 + LTEXT "&Effect:",IDC_STATIC,14,118,36,8 + COMBOBOX IDC_POSTPROCESSEFFECT,74,117,117,71,CBS_DROPDOWNLIST | WS_DISABLED | WS_VSCROLL | WS_TABSTOP + LTEXT "&Param 1",IDC_PPPARAM1LABEL2,14,141,35,8 + CONTROL "",IDC_PPPARAM1,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_DISABLED | WS_TABSTOP,68,137,127,15 + CONTROL "&Force 16x anisotropy filtering",IDC_FORCEANISOTROPY, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,35,110,10 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO +BEGIN + IDD_ABOUT, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 181 + TOPMARGIN, 7 + BOTTOMMARGIN, 74 + END + + IDD_SETTINGS, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 224 + VERTGUIDE, 7 + VERTGUIDE, 68 + VERTGUIDE, 81 + VERTGUIDE, 87 + TOPMARGIN, 7 + BOTTOMMARGIN, 134 + END + + IDD_DEBUGGER, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 227 + TOPMARGIN, 7 + BOTTOMMARGIN, 247 + END + + IDD_ADVANCED, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 199 + VERTGUIDE, 14 + TOPMARGIN, 7 + BOTTOMMARGIN, 137 + END + + IDD_ENHANCEMENTS, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 200 + VERTGUIDE, 16 + VERTGUIDE, 74 + TOPMARGIN, 7 + BOTTOMMARGIN, 168 + END +END +#endif // APSTUDIO_INVOKED + +#endif // Swedish resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/Source/Plugins/Plugin_VideoDX9/Src/stdafx.cpp b/Source/Plugins/Plugin_VideoDX9/Src/stdafx.cpp new file mode 100644 index 0000000000..1577c4e3bc --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/stdafx.cpp @@ -0,0 +1 @@ +#include "stdafx.h" \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoDX9/Src/stdafx.h b/Source/Plugins/Plugin_VideoDX9/Src/stdafx.h new file mode 100644 index 0000000000..73641c4f62 --- /dev/null +++ b/Source/Plugins/Plugin_VideoDX9/Src/stdafx.h @@ -0,0 +1,9 @@ +#pragma once +#define _WIN32_WINNT 0x501 +#ifndef _WIN32_IE +#define _WIN32_IE 0x0500 // Default value is 0x0400 +#endif + +#include +#include + diff --git a/Source/Plugins/Plugin_VideoOGL/Plugin_VideoOGL.vcproj b/Source/Plugins/Plugin_VideoOGL/Plugin_VideoOGL.vcproj new file mode 100644 index 0000000000..7e7d0cfb1c --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Plugin_VideoOGL.vcproj @@ -0,0 +1,1514 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Source/Plugins/Plugin_VideoOGL/Src/BPStructs.cpp b/Source/Plugins/Plugin_VideoOGL/Src/BPStructs.cpp new file mode 100644 index 0000000000..5ce68d9305 --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/BPStructs.cpp @@ -0,0 +1,752 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "Globals.h" + +#include "VertexLoader.h" + +#include "BPStructs.h" +#include "OpcodeDecoding.h" +#include "TextureMngr.h" +#include "TextureDecoder.h" +#include "VertexShader.h" +#include "PixelShader.h" + +//BP state +BPMemory bpmem; + +#define BPMEM_GENMODE 0x00 +#define BPMEM_IND_MTX 0x06 +#define BPMEM_RAS1_SS0 0x25 // ind tex coord scale 0 +#define BPMEM_RAS1_SS1 0x26 // ind tex coord scale 1 +#define BPMEM_ZMODE 0x40 +#define BPMEM_BLENDMODE 0x41 +#define BPMEM_CONSTANTALPHA 0x42 +#define BPMEM_ALPHACOMPARE 0xF3 +#define BPMEM_LINEPTWIDTH 0x22 +#define BPMEM_TEXINVALIDATE 0x66 +#define BPMEM_SCISSORTL 0x20 +#define BPMEM_SCISSORBR 0x21 +#define BPMEM_SCISSOROFFSET 0x59 +#define BPMEM_CLEARBBOX1 0x55 // let's hope not many games use bboxes.. +#define BPMEM_CLEARBBOX2 0x56 // TODO(ector): add something that watches bboxes +#define BPMEM_TEXMODE0_1 0x80 +#define BPMEM_TEXMODE0_2 0xA0 +#define BPMEM_FOGPARAM0 0xEE +#define BPMEM_FOGBMAGNITUDE 0xEF +#define BPMEM_FOGBEXPONENT 0xF0 +#define BPMEM_FOGPARAM3 0xF1 +#define BPMEM_FOGCOLOR 0xF2 +#define BPMEM_ZTEX1 0xF4 +#define BPMEM_ZTEX2 0xF5 +#define BPMEM_DRAWDONE 0x45 + +#define BPMEM_PE_TOKEN_ID 0x47 +#define BPMEM_PE_TOKEN_INT_ID 0x48 + +// State translation lookup tables +const GLenum glSrcFactors[8] = +{ + GL_ZERO, + GL_ONE, + GL_DST_COLOR, + GL_ONE_MINUS_DST_COLOR, + GL_SRC_ALPHA, + GL_ONE_MINUS_SRC_ALPHA, + GL_DST_ALPHA, + GL_ONE_MINUS_DST_ALPHA +}; + +const GLenum glDestFactors[8] = { + GL_ZERO, GL_ONE, GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR, + GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA }; + +const GLenum glCmpFuncs[8] = { GL_NEVER, GL_LESS, GL_EQUAL, GL_LEQUAL, GL_GREATER, GL_NOTEQUAL, GL_GEQUAL, GL_ALWAYS }; + +const GLenum glLogicOpCodes[16] = { + GL_CLEAR, GL_SET, GL_COPY, GL_COPY_INVERTED, GL_NOOP, GL_INVERT, GL_AND, GL_NAND, + GL_OR, GL_NOR, GL_XOR, GL_EQUIV, GL_AND_REVERSE, GL_AND_INVERTED, GL_OR_REVERSE, GL_OR_INVERTED }; + +void BPInit() +{ + memset(&bpmem, 0, sizeof(bpmem)); + bpmem.bpMask = 0xFFFFFF; +} + +void BPWritten(int addr, int changes, int newval) +{ + DVSTARTPROFILE(); + + //static int count = 0; + //ERROR_LOG("(%d) %x: %x\n", count++, addr, newval); + + switch(addr) + { + case BPMEM_GENMODE: + if (changes) { + VertexManager::Flush(); + ((u32*)&bpmem)[addr] = newval; + PRIM_LOG("genmode: texgen=%d, col=%d, ms_en=%d, tev=%d, culmode=%d, ind=%d, zfeeze=%d\n", bpmem.genMode.numtexgens, bpmem.genMode.numcolchans, + bpmem.genMode.ms_en, bpmem.genMode.numtevstages+1, bpmem.genMode.cullmode, bpmem.genMode.numindstages, bpmem.genMode.zfreeze); + + // none, ccw, cw, ccw + if (bpmem.genMode.cullmode>0) { + glEnable(GL_CULL_FACE); + glFrontFace(bpmem.genMode.cullmode==2?GL_CCW:GL_CW); + } + else glDisable(GL_CULL_FACE); + + PixelShaderMngr::SetGenModeChanged(); + } + break; + + case BPMEM_IND_MTX+0: + case BPMEM_IND_MTX+1: + case BPMEM_IND_MTX+2: + case BPMEM_IND_MTX+3: + case BPMEM_IND_MTX+4: + case BPMEM_IND_MTX+5: + case BPMEM_IND_MTX+6: + case BPMEM_IND_MTX+7: + case BPMEM_IND_MTX+8: + if (changes) { + VertexManager::Flush(); + ((u32*)&bpmem)[addr] = newval; + PixelShaderMngr::SetIndMatrixChanged((addr-BPMEM_IND_MTX)/3); + } + break; + case BPMEM_RAS1_SS0: + case BPMEM_RAS1_SS1: + if (changes) { + VertexManager::Flush(); + ((u32*)&bpmem)[addr] = newval; + PixelShaderMngr::SetIndTexScaleChanged(); + } + break; + case BPMEM_ZMODE: + if (changes) { + VertexManager::Flush(); + ((u32*)&bpmem)[addr] = newval; + PRIM_LOG("zmode: test=%d, func=%d, upd=%d\n", bpmem.zmode.testenable, bpmem.zmode.func, bpmem.zmode.updateenable); + + if (bpmem.zmode.testenable) { + glEnable(GL_DEPTH_TEST); + glDepthMask(bpmem.zmode.updateenable?GL_TRUE:GL_FALSE); + glDepthFunc(glCmpFuncs[bpmem.zmode.func]); + } + else { + // if the test is disabled write is disabled too + glDisable(GL_DEPTH_TEST); + glDepthMask(GL_FALSE); + } + + if( !bpmem.zmode.updateenable ) + Renderer::SetRenderMode(Renderer::RM_Normal); + } + break; + + case BPMEM_ALPHACOMPARE: + if (changes) { + VertexManager::Flush(); + ((u32*)&bpmem)[addr] = newval; + PRIM_LOG("alphacmp: ref0=%d, ref1=%d, comp0=%d, comp1=%d, logic=%d\n", bpmem.alphaFunc.ref0, bpmem.alphaFunc.ref1, + bpmem.alphaFunc.comp0, bpmem.alphaFunc.comp1, bpmem.alphaFunc.logic); + PixelShaderMngr::SetAlpha(bpmem.alphaFunc); + } + break; + + case BPMEM_CONSTANTALPHA: + if (changes) { + VertexManager::Flush(); + ((u32*)&bpmem)[addr] = newval; + PRIM_LOG("constalpha: alp=%d, en=%d\n", bpmem.dstalpha.alpha, bpmem.dstalpha.enable); + PixelShaderMngr::SetDestAlpha(bpmem.dstalpha); + } + break; + + case BPMEM_LINEPTWIDTH: + { + float fratio = VertexShaderMngr::rawViewport[0] != 0 ? (float)Renderer::GetTargetWidth()/640.0f : 1.0f; + if( bpmem.lineptwidth.linesize > 0 ) { + glLineWidth((float)bpmem.lineptwidth.linesize*fratio/6.0f); // scale by ratio of widths + } + if( bpmem.lineptwidth.pointsize > 0 ) + glPointSize((float)bpmem.lineptwidth.pointsize*fratio/6.0f); + break; + } + + case 0x43: + if (changes) { + VertexManager::Flush(); + ((u32*)&bpmem)[addr] = newval; + } + break; + + case BPMEM_BLENDMODE: + if (changes & 0xFFFF) { + + VertexManager::Flush(); + ((u32*)&bpmem)[addr] = newval; + PRIM_LOG("blendmode: en=%d, open=%d, colupd=%d, alphaupd=%d, dst=%d, src=%d, sub=%d, mode=%d\n", + bpmem.blendmode.blendenable, bpmem.blendmode.logicopenable, bpmem.blendmode.colorupdate, bpmem.blendmode.alphaupdate, + bpmem.blendmode.dstfactor, bpmem.blendmode.srcfactor, bpmem.blendmode.subtract, bpmem.blendmode.logicmode); + + if (changes & 1) { + if (bpmem.blendmode.blendenable) { + glEnable(GL_BLEND); + + } + else glDisable(GL_BLEND); + } + if( changes & 2 ) { + if( Renderer::CanBlendLogicOp() ) { + if( bpmem.blendmode.logicopenable ) { + glEnable(GL_COLOR_LOGIC_OP); + glLogicOp(glLogicOpCodes[bpmem.blendmode.logicmode]); + } + else glDisable(GL_COLOR_LOGIC_OP); + } + //else { + // if( bpmem.blendmode.logicopenable ) { + // switch(bpmem.blendmode.logicmode) { + // case 0: // clear dst to 0 + // glEnable(GL_BLEND); + // glBlendFunc(GL_ZERO, GL_ZERO); + // break; + // case 1: // set dst to 1 + // glEnable(GL_BLEND); + // glBlendFunc(GL_ONE, GL_ONE); + // break; + // case 2: // set dst to src + // glDisable(GL_BLEND); + // break; + // case 3: // set dst to ~src + // glEnable(GL_BLEND); + // glBlendFunc(GL_ONE_MINUS_SRC_COLOR, GL_ZERO); //? + // break; + // case 4: // set dst to dst + // glEnable(GL_BLEND); + // glBlendFunc(GL_ZERO, GL_ONE); //? + // break; + // case 5: // set dst to ~dst + // glEnable(GL_BLEND); + // glBlendFunc(GL_ZERO, GL_ONE_MINUS_DST_COLOR); //? + // break; + // case 6: // set dst to src&dst + // case 7: // set dst to ~(src&dst) + // case 8: // set dst to src|dst + // case 9: // set dst to ~(src|dst) + // case 10: // set dst to src xor dst + // case 11: // set dst to ~(src xor dst) + // case 12: // set dst to src&~dst + // case 13: // set dst to ~src&dst + // case 14: // set dst to src|~dst + // case 15: // set dst to ~src|dst + // ERROR_LOG("logicopenable %d not supported\n", bpmem.blendmode.logicmode); + // break; + + // } + // } + //} + } + if (changes & 4) { + // pointless + //if (bpmem.blendmode.dither) glEnable(GL_DITHER); + //else glDisable(GL_DITHER); + } + if( changes & 0xFE0) { + if( !bpmem.blendmode.subtract ) + glBlendFunc(glSrcFactors[bpmem.blendmode.srcfactor], glDestFactors[bpmem.blendmode.dstfactor]); + } + if (changes & 0x800) { + glBlendEquation(bpmem.blendmode.subtract?GL_FUNC_REVERSE_SUBTRACT:GL_FUNC_ADD); + if( bpmem.blendmode.subtract ) + glBlendFunc(GL_ONE, GL_ONE); + else + glBlendFunc(glSrcFactors[bpmem.blendmode.srcfactor], glDestFactors[bpmem.blendmode.dstfactor]); + } + + if (changes & 0x18) + SetColorMask(); + } + break; + + case BPMEM_FOGPARAM0: + case BPMEM_FOGBEXPONENT: + case BPMEM_FOGBMAGNITUDE: + if (changes) { + VertexManager::Flush(); + ((u32*)&bpmem)[addr] = newval; + } + break; + + case BPMEM_FOGPARAM3: + //fog settings + if (changes) { + VertexManager::Flush(); + ((u32*)&bpmem)[addr] = newval; + } + break; + + case BPMEM_FOGCOLOR: + if (changes) + { + VertexManager::Flush(); + ((u32*)&bpmem)[addr] = newval; + float fogcolor[4] = { ((bpmem.fog.color>>16)&0xff)/255.0f, ((bpmem.fog.color>>8)&0xff)/255.0f, (bpmem.fog.color&0xff)/255.0f, (bpmem.fog.color>>24)/255.0f }; + } + break; + + case BPMEM_TEXINVALIDATE: + //TexCache_Invalidate(); + break; + + case BPMEM_SCISSOROFFSET: + if (changes) { + VertexManager::Flush(); + ((u32*)&bpmem)[addr] = newval; + SetScissorRect(); + } + break; + + case BPMEM_SCISSORTL: + case BPMEM_SCISSORBR: + + if (changes) { + VertexManager::Flush(); + ((u32*)&bpmem)[addr] = newval; + if( !SetScissorRect() ) { + if( addr == BPMEM_SCISSORBR ) + ERROR_LOG("bad scissor!\n"); + } + } + break; + case BPMEM_ZTEX1: + if (changes) { + VertexManager::Flush(); + ((u32*)&bpmem)[addr] = newval; + PRIM_LOG("ztex bias=0x%x\n", bpmem.ztex1.bias); + PixelShaderMngr::SetZTetureBias(bpmem.ztex1.bias); + } + break; + case BPMEM_ZTEX2: + if (changes) { + VertexManager::Flush(); + ((u32*)&bpmem)[addr] = newval; +#ifdef _DEBUG + const char* pzop[] = {"DISABLE", "ADD", "REPLACE", "?"}; + const char* pztype[] = {"Z8", "Z16", "Z24", "?"}; + PRIM_LOG("ztex op=%s, type=%s\n", pzop[bpmem.ztex2.op], pztype[bpmem.ztex2.type]); +#endif + } + break; + + case 0xf6: // ksel0 + case 0xf7: // ksel1 + case 0xf8: // ksel2 + case 0xf9: // ksel3 + case 0xfa: // ksel4 + case 0xfb: // ksel5 + case 0xfc: // ksel6 + case 0xfd: // ksel7 + if (changes) + { + VertexManager::Flush(); + ((u32*)&bpmem)[addr] = newval; + PixelShaderMngr::SetTevKSelChanged(addr-0xf6); + } + break; + + default: + switch(addr & 0xFC) //texture sampler filter + { + case 0x28: // tevorder 0-3 + case 0x2C: // tevorder 4-7 + if (changes) + { + VertexManager::Flush(); + ((u32*)&bpmem)[addr] = newval; + PixelShaderMngr::SetTevOrderChanged(addr-0x28); + } + break; + + case 0x80: // TEX MODE 0 + case 0xA0: + if (changes) + { + VertexManager::Flush(); + ((u32*)&bpmem)[addr] = newval; + } + break; + case 0x84://TEX MODE 1 + case 0xA4: + break; + case 0x88://TEX IMAGE 0 + case 0xA8: + if (changes) + { + //textureChanged[((addr&0xE0)==0xA0)*4+(addr&3)] = true; + VertexManager::Flush(); + ((u32*)&bpmem)[addr] = newval; + } + break; + case 0x8C://TEX IMAGE 1 + case 0xAC: + if (changes) + { + //textureChanged[((addr&0xE0)==0xA0)*4+(addr&3)] = true; + VertexManager::Flush(); + ((u32*)&bpmem)[addr] = newval; + } + break; + case 0x90://TEX IMAGE 2 + case 0xB0: + if (changes) + { + //textureChanged[((addr&0xE0)==0xA0)*4+(addr&3)] = true; + VertexManager::Flush(); + ((u32*)&bpmem)[addr] = newval; + } + break; + case 0x94://TEX IMAGE 3 + case 0xB4: + if (changes) + { + //textureChanged[((addr&0xE0)==0xA0)*4+(addr&3)] = true; + VertexManager::Flush(); + ((u32*)&bpmem)[addr] = newval; + } + break; + case 0x98://TEX TLUT + case 0xB8: + if (changes) + { + //textureChanged[((addr&0xE0)==0xA0)*4+(addr&3)] = true; + VertexManager::Flush(); + ((u32*)&bpmem)[addr] = newval; + } + break; + case 0x9C://TEX UNKNOWN + case 0xBC: + //ERROR_LOG("texunknown%x = %x\n", addr, newval); + ((u32*)&bpmem)[addr] = newval; + break; + case 0xE0: + case 0xE4: + if (addr&1) { // don't compare with changes! + VertexManager::Flush(); + ((u32*)&bpmem)[addr] = newval; + int num = (addr>>1)&0x3; + PixelShaderMngr::SetColorChanged(bpmem.tevregs[num].high.type, num); + } + else + ((u32*)&bpmem)[addr] = newval; + break; + + default: + switch(addr&0xF0) { + case 0x10: // tevindirect 0-15 + if (changes) { + VertexManager::Flush(); + ((u32*)&bpmem)[addr] = newval; + PixelShaderMngr::SetTevIndirectChanged(addr-0x10); + } + break; + + case 0x30: + if( changes ) { + VertexManager::Flush(); + ((u32*)&bpmem)[addr] = newval; + PixelShaderMngr::SetTexDimsChanged((addr>>1)&0x7); + } + break; + + case 0xC0: + case 0xD0: + if (changes) + { + VertexManager::Flush(); + ((u32*)&bpmem)[addr] = newval; + PixelShaderMngr::SetTevCombinerChanged((addr&0x1f)/2); + } + break; + + case 0x20: + case 0x80: + case 0x90: + case 0xA0: + case 0xB0: + default: + if (changes) + { + VertexManager::Flush(); + ((u32*)&bpmem)[addr] = newval; + /*switch(addr) { + case 0x01: + case 0x02: + case 0x03: + case 0x04: break; // copy filter values + case 0x0f: break; // mask + case 0x27: break; // tev ind order + case 0x44: break; // field mask + case 0x45: break; // draw done + case 0x46: break; // clock + case 0x49: + case 0x4a: break; // copy tex src + case 0x4b: break; // copy tex dest + case 0x4d: break; // copyMipMapStrideChannels + case 0x4e: break; // disp copy scale + case 0x4f: break; // clear color + case 0x50: break; // clear color + case 0x51: break; // casez + case 0x52: break; // trigger efb copy + case 0x53: + case 0x54: break; // more copy filters + case 0x55: + case 0x56: break; // bounding box + case 0x64: + case 0x65: break; // tlut src dest + case 0xe8: break; // fog range + case 0xe9: + case 0xea: + case 0xeb: + case 0xec: + case 0xed: break; // fog + case 0xfe: break; // mask + default: + // 0x58 = 0xf + // 0x69 = 0x49e + ERROR_LOG("bp%.2x = %x\n", addr, newval); + }*/ + } + break; + } + break; + + } + break; + } +} + +void SetColorMask() +{ + if (bpmem.blendmode.alphaupdate && bpmem.blendmode.colorupdate) + glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_TRUE); + else if (bpmem.blendmode.alphaupdate) + glColorMask(GL_FALSE,GL_FALSE,GL_FALSE,GL_TRUE); + else if (bpmem.blendmode.colorupdate) + glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_FALSE); +} + +bool SetScissorRect() +{ + int xoff = bpmem.scissorOffset.x*2-342; + int yoff = bpmem.scissorOffset.y*2-342; + + RECT rc; + rc.left=bpmem.scissorTL.x + xoff - 342; + if (rc.left<0) rc.left=0; + rc.top=bpmem.scissorTL.y + yoff - 342; + if (rc.top<0) rc.top=0; + + rc.right=bpmem.scissorBR.x + xoff - 342 +1; + if (rc.right>640) rc.right=640; + rc.bottom=bpmem.scissorBR.y + yoff - 342 +1; + if (rc.bottom>480) rc.bottom=480; + + PRIM_LOG("scissor: lt=(%d,%d),rb=(%d,%d),off=(%d,%d)\n", rc.left, rc.top, rc.right, rc.bottom, xoff, yoff); + + if( rc.right>=rc.left && rc.bottom>=rc.top ) { + glScissor(rc.left<> 24; + int oldval = ((u32*)&bpmem)[opcode]; + int newval = (((u32*)&bpmem)[opcode] & ~bpmem.bpMask) | (value0 & bpmem.bpMask); + int changes = (oldval ^ newval) & 0xFFFFFF; + //reset the mask register + if (opcode != 0xFE) + bpmem.bpMask = 0xFFFFFF; + + switch (opcode) + { + case 0x45: //GXSetDrawDone + VertexManager::Flush(); + switch (value0 & 0xFF) + { + case 0x02: + g_VideoInitialize.pSetPEFinish(); // may generate interrupt + DebugLog("GXSetDrawDone SetPEFinish (value: 0x%02X)", (value0 & 0xFFFF)); + break; + + default: + DebugLog("GXSetDrawDone ??? (value 0x%02X)", (value0 & 0xFFFF)); + break; + } + break; + + case BPMEM_PE_TOKEN_ID: + g_VideoInitialize.pSetPEToken(static_cast(value0 & 0xFFFF), FALSE); + DebugLog("SetPEToken 0x%04x", (value0 & 0xFFFF)); + break; + + case BPMEM_PE_TOKEN_INT_ID: + g_VideoInitialize.pSetPEToken(static_cast(value0 & 0xFFFF), TRUE); + DebugLog("SetPEToken + INT 0x%04x", (value0 & 0xFFFF)); + break; + + case 0x67: // set gp metric? + break; + + case 0x52: + { + DVProfileFunc _pf("LoadBPReg:swap"); + VertexManager::Flush(); + + ((u32*)&bpmem)[opcode] = newval; + TRectangle rc = { + (int)(bpmem.copyTexSrcXY.x), + (int)(bpmem.copyTexSrcXY.y), + (int)((bpmem.copyTexSrcXY.x+bpmem.copyTexSrcWH.x)), + (int)((bpmem.copyTexSrcXY.y+bpmem.copyTexSrcWH.y)) + }; + + UPE_Copy PE_copy; + PE_copy.Hex = bpmem.triggerEFBCopy; + + if (PE_copy.copy_to_xfb == 0) { + // EFB to texture + // for some reason it sets bpmem.zcontrol.pixel_format to PIXELFMT_Z24 every time a zbuffer format is given as a dest to GXSetTexCopyDst + TextureMngr::CopyRenderTargetToTexture(bpmem.copyTexDest<<5, bpmem.zcontrol.pixel_format==PIXELFMT_Z24, PE_copy.intensity_fmt>0, + (PE_copy.target_pixel_format/2)+((PE_copy.target_pixel_format&1)*8), PE_copy.half_scale>0, &rc); + } + else { + // EFB to XFB + Renderer::Swap(rc); + g_VideoInitialize.pCopiedToXFB(); + } + + // clearing + if (PE_copy.clear) { + // clear color + Renderer::SetRenderMode(Renderer::RM_Normal); + + u32 nRestoreZBufferTarget = Renderer::GetZBufferTarget(); + + glViewport(0, 0, Renderer::GetTargetWidth()<>16)&0xff)*(1/255.0f),((clearColor>>8)&0xff)*(1/255.0f), + ((clearColor>>0)&0xff)*(1/255.0f),((clearColor>>24)&0xff)*(1/255.0f)); + bits |= GL_COLOR_BUFFER_BIT; + } + + if( bpmem.zmode.updateenable ) { + glClearDepth((float)(bpmem.clearZValue&0xFFFFFF) / float(0xFFFFFF)); + bits |= GL_DEPTH_BUFFER_BIT; + } + + if( nRestoreZBufferTarget ) + glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT); // don't clear ztarget here + + glClear(bits); + } + + if (bpmem.zmode.updateenable && nRestoreZBufferTarget ) { // have to clear the target zbuffer + + glDrawBuffer(GL_COLOR_ATTACHMENT1_EXT); + GL_REPORT_ERRORD(); + + glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_TRUE); + + // red should probably be the LSB + glClearColor(((bpmem.clearZValue>>0)&0xff)*(1/255.0f),((bpmem.clearZValue>>8)&0xff)*(1/255.0f), + ((bpmem.clearZValue>>16)&0xff)*(1/255.0f), 0); + glClear(GL_COLOR_BUFFER_BIT); + SetColorMask(); + GL_REPORT_ERRORD(); + } + + if( nRestoreZBufferTarget ) { + // restore target + GLenum s_drawbuffers[2] = {GL_COLOR_ATTACHMENT0_EXT, GL_COLOR_ATTACHMENT1_EXT}; + glDrawBuffers(2, s_drawbuffers); + } + + if( PE_copy.copy_to_xfb == 0 ) + SetScissorRect(); // reset the scissor rect + } + } + break; + + case 0x65: //GXLoadTlut + { + DVProfileFunc _pf("LoadBPReg:GXLoadTlut"); + VertexManager::Flush(); + ((u32*)&bpmem)[opcode] = newval; + + u32 tlutTMemAddr = (value0&0x3FF)<<9; + u32 tlutXferCount = (value0&0x1FFC00)>>5; + //do the transfer!! + memcpy_gc(texMem + tlutTMemAddr, g_VideoInitialize.pGetMemoryPointer((bpmem.tlutXferSrc&0xFFFFF)<<5), tlutXferCount); + // TODO(ector) : kill all textures that use this palette + // Not sure if it's a good idea, though. For now, we hash texture palettes + } + break; + } + + //notify the video handling so it can update render states + BPWritten(opcode, changes, newval); + //((u32*)&bpmem)[opcode] = newval; +} + +void BPReload() +{ + for (int i=0; i<254; i++) + BPWritten(i, 0xFFFFFF, ((u32*)&bpmem)[i]); +} + + +size_t BPSaveLoadState(char *ptr, BOOL save) +{ + BEGINSAVELOAD; + SAVELOAD(&bpmem,sizeof(BPMemory)); + if (!save) + BPReload(); + //char temp[256]; + //sprintf(temp,"MOJS %08x",(bpmem.clearcolorAR<<16)|(bpmem.clearcolorGB)); + //g_VideoInitialize.pLog(temp, FALSE); + ENDSAVELOAD; +} diff --git a/Source/Plugins/Plugin_VideoOGL/Src/BPStructs.h b/Source/Plugins/Plugin_VideoOGL/Src/BPStructs.h new file mode 100644 index 0000000000..2341127338 --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/BPStructs.h @@ -0,0 +1,787 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef _BPSTRUCTS_H +#define _BPSTRUCTS_H + +#pragma pack(4) + +////////////////////////////////////////////////////////////////////////// +// Tev/combiner things +////////////////////////////////////////////////////////////////////////// +#define TEVOP_ADD 0 +#define TEVOP_SUB 1 +#define TEVCMP_R8_GT 8 +#define TEVCMP_R8_EQ 9 +#define TEVCMP_GR16_GT 10 +#define TEVCMP_GR16_EQ 11 +#define TEVCMP_BGR24_GT 12 +#define TEVCMP_BGR24_EQ 13 +#define TEVCMP_RGB8_GT 14 +#define TEVCMP_RGB8_EQ 15 +#define TEVCMP_A8_GT 14 +#define TEVCMP_A8_EQ 15 + +#define TEVCOLORARG_CPREV 0 +#define TEVCOLORARG_APREV 1 +#define TEVCOLORARG_C0 2 +#define TEVCOLORARG_A0 3 +#define TEVCOLORARG_C1 4 +#define TEVCOLORARG_A1 5 +#define TEVCOLORARG_C2 6 +#define TEVCOLORARG_A2 7 +#define TEVCOLORARG_TEXC 8 +#define TEVCOLORARG_TEXA 9 +#define TEVCOLORARG_RASC 10 +#define TEVCOLORARG_RASA 11 +#define TEVCOLORARG_ONE 12 +#define TEVCOLORARG_HALF 13 +#define TEVCOLORARG_KONST 14 +#define TEVCOLORARG_ZERO 15 + +#define TEVALPHAARG_APREV 0 +#define TEVALPHAARG_A0 1 +#define TEVALPHAARG_A1 2 +#define TEVALPHAARG_A2 3 +#define TEVALPHAARG_TEXA 4 +#define TEVALPHAARG_RASA 5 +#define TEVALPHAARG_KONST 6 +#define TEVALPHAARG_ZERO 7 + +#define ALPHACMP_NEVER 0 +#define ALPHACMP_LESS 1 +#define ALPHACMP_EQUAL 2 +#define ALPHACMP_LEQUAL 3 +#define ALPHACMP_GREATER 4 +#define ALPHACMP_NEQUAL 5 +#define ALPHACMP_GEQUAL 6 +#define ALPHACMP_ALWAYS 7 + +#define ZTEXTURE_DISABLE 0 +#define ZTEXTURE_ADD 1 +#define ZTEXTURE_REPLACE 2 + +union IND_MTXA +{ + struct + { + signed ma : 11; + signed mb : 11; + unsigned s0 : 2; // bits 0-1 of scale factor + unsigned rid : 8; + }; + u32 hex; +}; + +union IND_MTXB +{ + struct + { + signed mc : 11; + signed md : 11; + unsigned s1 : 2; // bits 2-3 of scale factor + unsigned rid : 8; + }; + u32 hex; +}; + +union IND_MTXC +{ + struct + { + signed me : 11; + signed mf : 11; + unsigned s2 : 2; // bits 4-5 of scale factor + unsigned rid : 8; + }; + u32 hex; +}; + +struct IND_MTX +{ + IND_MTXA col0; + IND_MTXB col1; + IND_MTXC col2; +}; + +union IND_IMASK +{ + struct + { + unsigned mask : 24; + unsigned rid : 8; + }; + u32 hex; +}; + +#define TEVSELCC_CPREV 0 +#define TEVSELCC_APREV 1 +#define TEVSELCC_C0 2 +#define TEVSELCC_A0 3 +#define TEVSELCC_C1 4 +#define TEVSELCC_A1 5 +#define TEVSELCC_C2 6 +#define TEVSELCC_A2 7 +#define TEVSELCC_TEXC 8 +#define TEVSELCC_TEXA 9 +#define TEVSELCC_RASC 10 +#define TEVSELCC_RASA 11 +#define TEVSELCC_ONE 12 +#define TEVSELCC_HALF 13 +#define TEVSELCC_KONST 14 +#define TEVSELCC_ZERO 15 + +#define TEVSELCA_APREV 0 +#define TEVSELCA_A0 1 +#define TEVSELCA_A1 2 +#define TEVSELCA_A2 3 +#define TEVSELCA_TEXA 4 +#define TEVSELCA_RASA 5 +#define TEVSELCA_KONST 6 +#define TEVSELCA_ZERO 7 + +struct TevStageCombiner +{ + union ColorCombiner + { + struct //abc=8bit,d=10bit + { + unsigned d : 4; // TEVSELCC_X + unsigned c : 4; // TEVSELCC_X + unsigned b : 4; // TEVSELCC_X + unsigned a : 4; // TEVSELCC_X + + unsigned bias : 2; + unsigned op : 1; + unsigned clamp : 1; + + unsigned shift : 2; + unsigned dest : 2; //1,2,3 + + }; + u32 hex; + }; + union AlphaCombiner + { + struct + { + unsigned rswap : 2; + unsigned tswap : 2; + unsigned d : 3; // TEVSELCA_ + unsigned c : 3; // TEVSELCA_ + unsigned b : 3; // TEVSELCA_ + unsigned a : 3; // TEVSELCA_ + + unsigned bias : 2; //GXTevBias + unsigned op : 1; + unsigned clamp : 1; + + unsigned shift : 2; + unsigned dest : 2; //1,2,3 + }; + u32 hex; + }; + + ColorCombiner colorC; + AlphaCombiner alphaC; +}; + +#define ITF_8 0 +#define ITF_5 1 +#define ITF_4 2 +#define ITF_3 3 + +#define ITB_NONE 0 +#define ITB_S 1 +#define ITB_T 2 +#define ITB_ST 3 +#define ITB_U 4 +#define ITB_SU 5 +#define ITB_TU 6 +#define ITB_STU 7 + +#define ITBA_OFF 0 +#define ITBA_S 1 +#define ITBA_T 2 +#define ITBA_U 3 + +#define ITW_OFF 0 +#define ITW_256 1 +#define ITW_128 2 +#define ITW_64 3 +#define ITW_32 4 +#define ITW_16 5 +#define ITW_0 6 + +// several discoveries: +// GXSetTevIndBumpST(tevstage, indstage, matrixind) +// if( matrix == 2 ) realmat = 6; // 10 +// else if( matrix == 3 ) realmat = 7; // 11 +// else if( matrix == 1 ) realmat = 5; // 9 +// GXSetTevIndirect(tevstage, indstage, 0, 3, realmat, 6, 6, 0, 0, 0) +// GXSetTevIndirect(tevstage+1, indstage, 0, 3, realmat+4, 6, 6, 1, 0, 0) +// GXSetTevIndirect(tevstage+2, indstage, 0, 0, 0, 0, 0, 1, 0, 0) + +union TevStageIndirect +{ + // if mid, sw, tw, and addprev are 0, then no indirect stage is used, mask = 0x17fe00 + struct + { + unsigned bt : 2; // indirect tex stage ID + unsigned fmt : 2; // format: ITF_X + unsigned bias : 3; // ITB_X + unsigned bs : 2; // ITBA_X, indicates which coordinate will become the 'bump alpha' + unsigned mid : 4; // matrix id to multiply offsets with + unsigned sw : 3; // ITW_X, wrapping factor for S of regular coord + unsigned tw : 3; // ITW_X, wrapping factor for T of regular coord + unsigned lb_utclod : 1; // use modified or unmodified texture coordinates for LOD computation + unsigned fb_addprev : 1; // 1 if the texture coordinate results from the previous TEV stage should be added + unsigned pad0 : 3; + unsigned rid : 8; + }; + struct + { + u32 hex : 21; + u32 unused : 11; + }; + + bool IsActive() { return (hex&0x17fe00)!=0; } +}; + +union TwoTevStageOrders +{ + struct + { + unsigned texmap0 : 3; // indirect tex stage texmap + unsigned texcoord0 : 3; + unsigned enable0 : 1; // 1 if should read from texture + unsigned colorchan0 : 3; // RAS1_CC_X + + unsigned pad0 : 2; + + unsigned texmap1 : 3; + unsigned texcoord1 : 3; + unsigned enable1 : 1; // 1 if should read from texture + unsigned colorchan1 : 3; // RAS1_CC_X + + unsigned pad1 : 2; + unsigned rid : 8; + }; + u32 hex; + int getTexMap(int i){return i?texmap1:texmap0;} + int getTexCoord(int i){return i?texcoord1:texcoord0;} + int getEnable(int i){return i?enable1:enable0;} + int getColorChan(int i){return i?colorchan1:colorchan0;} +}; + +union TEXSCALE +{ + struct + { + unsigned ss0 : 4; // indirect tex stage 0, 2^(-ss0) + unsigned ts0 : 4; // indirect tex stage 0 + unsigned ss1 : 4; // indirect tex stage 1 + unsigned ts1 : 4; // indirect tex stage 1 + unsigned pad : 8; + unsigned rid : 8; + }; + u32 hex; + + float getScaleS(int i){return 1.0f/(float)(1<<(i?ss1:ss0));} + float getScaleT(int i){return 1.0f/(float)(1<<(i?ts1:ts0));} +}; + +union RAS1_IREF +{ + struct + { + unsigned bi0 : 3; // indirect tex stage 0 ntexmap + unsigned bc0 : 3; // indirect tex stage 0 ntexcoord + unsigned bi1 : 3; + unsigned bc1 : 3; + unsigned bi2 : 3; + unsigned bc3 : 3; + unsigned bi4 : 3; + unsigned bc4 : 3; + unsigned rid : 8; + }; + u32 hex; + + u32 getTexCoord(int i) { return (hex>>(6*i+3))&3; } + u32 getTexMap(int i) { return (hex>>(6*i))&3; } +}; + +////////////////////////////////////////////////////////////////////////// +// Texture structs +////////////////////////////////////////////////////////////////////////// +union TexMode0 +{ + struct + { + unsigned wrap_s : 2; + unsigned wrap_t : 2; + unsigned mag_filter : 1; + unsigned min_filter : 3; + unsigned diag_lod : 1; + signed lod_bias : 10; + unsigned max_aniso : 2; + unsigned lod_clamp : 1; + }; + u32 hex; +}; +union TexMode1 +{ + struct + { + unsigned min_lod : 8; + unsigned max_lod : 8; + }; + u32 hex; +}; +union TexImage0 +{ + struct + { + unsigned width : 10; //actually w-1 + unsigned height : 10; //actually h-1 + unsigned format : 4; + }; + u32 hex; +}; +union TexImage1 +{ + struct + { + unsigned tmem_offset : 15; // we ignore texture caching for now, we do it ourselves + unsigned cache_width : 3; + unsigned cache_height : 3; + unsigned image_type : 1; + }; + u32 hex; +}; + +union TexImage2 +{ + struct + { + unsigned tmem_offset : 15; // we ignore texture caching for now, we do it ourselves + unsigned cache_width : 3; + unsigned cache_height : 3; + }; + u32 hex; +}; + +union TexImage3 +{ + struct + { + unsigned image_base: 24; //address in memory >> 5 (was 20 for GC) + }; + u32 hex; +}; +union TexTLUT +{ + struct + { + unsigned tmem_offset : 10; + unsigned tlut_format : 2; + }; + u32 hex; +}; + +union ZTex1 +{ + struct + { + unsigned bias : 24; + }; + u32 hex; +}; + +union ZTex2 +{ + struct + { + unsigned type : 2; // TEV_Z_TYPE_X + unsigned op : 2; // GXZTexOp + }; + u32 hex; +}; + +// Z-texture types (formats) +#define TEV_ZTEX_TYPE_U8 0 +#define TEV_ZTEX_TYPE_U16 1 +#define TEV_ZTEX_TYPE_U24 2 + +#define TEV_ZTEX_DISABLE 0 +#define TEV_ZTEX_ADD 1 +#define TEV_ZTEX_REPLACE 2 + + +struct FourTexUnits +{ + TexMode0 texMode0[4]; + TexMode1 texMode1[4]; + TexImage0 texImage0[4]; + TexImage1 texImage1[4]; + TexImage2 texImage2[4]; + TexImage3 texImage3[4]; + TexTLUT texTlut[4]; + u32 unknown[4]; +}; + + +////////////////////////////////////////////////////////////////////////// +// Geometry/other structs +////////////////////////////////////////////////////////////////////////// +union GenMode +{ + struct + { + unsigned numtexgens : 4; // 0xF + unsigned numcolchans : 5; // 0x1E0 + unsigned ms_en : 1; // 0x200 + unsigned numtevstages : 4; // 0x3C00 + unsigned cullmode : 2; // 0xC000 + unsigned numindstages : 3; // 0x30000 + unsigned zfreeze : 5; //0x3C0000 + }; + u32 hex; +}; + +union LPSize +{ + struct + { + unsigned linesize : 8; // in 1/6th pixels + unsigned pointsize : 8; // in 1/6th pixels + unsigned lineoff : 3; + unsigned pointoff : 3; + unsigned lineaspect : 1; + unsigned padding : 1; + }; + u32 hex; +}; + + +union X12Y12 +{ + struct + { + unsigned y : 12; + unsigned x : 12; + }; + u32 hex; +}; +union X10Y10 +{ + struct + { + unsigned x : 10; + unsigned y : 10; + }; + u32 hex; +}; + +////////////////////////////////////////////////////////////////////////// +// Framebuffer/pixel stuff (incl fog) +////////////////////////////////////////////////////////////////////////// +union BlendMode +{ + struct + { + unsigned blendenable : 1; + unsigned logicopenable : 1; + unsigned dither : 1; + unsigned colorupdate : 1; + unsigned alphaupdate : 1; + unsigned dstfactor : 3; //BLEND_ONE, BLEND_INV_SRc etc + unsigned srcfactor : 3; + unsigned subtract : 1; + unsigned logicmode : 4; + }; + u32 hex; +}; + + +union FogParam0 +{ + struct + { + unsigned mantissa : 11; + unsigned exponent : 8; + unsigned sign : 1; + }; + + float GetA() { + union { u32 i; float f; } dummy; + dummy.i = ((u32)sign<<31)|((u32)exponent<<23)|((u32)mantissa<<12); + return dummy.f; + } + + u32 hex; +}; + +union FogParam3 +{ + struct + { + unsigned c_mant : 11; + unsigned c_exp : 8; + unsigned c_sign : 1; + unsigned proj : 1; // 0 - perspective, 1 - orthographic + unsigned fsel : 3; // 0 - off, 2 - linear, 4 - exp, 5 - exp2, 6 - backward exp, 7 - backward exp2 + }; + + // amount to subtract from eyespacez after range adjustment + float GetC() { + union { u32 i; float f; } dummy; + dummy.i = ((u32)c_sign << 31) | ((u32)c_exp << 23) | ((u32)c_mant << 12); + return dummy.f; + } + + u32 hex; +}; + +// final eq: ze = A/(B_MAG - (Zs>>B_SHF)); +struct FogParams +{ + FogParam0 a; + u32 b_magnitude; + u32 b_shift; // b's exp + 1? + FogParam3 c_proj_fsel; + u32 color; //0:b 8:g 16:r - nice! +}; + +union ZMode +{ + struct + { + unsigned testenable : 1; + unsigned func : 3; + unsigned updateenable : 1; //size? + }; + u32 hex; +}; + +union ConstantAlpha +{ + struct + { + unsigned alpha : 8; + unsigned enable : 1; + }; + u32 hex; +}; + +#define PIXELFMT_RGB8_Z24 0 +#define PIXELFMT_RGBA6_Z24 1 +#define PIXELFMT_RGB565_Z16 2 +#define PIXELFMT_Z24 3 +#define PIXELFMT_Y8 4 +#define PIXELFMT_U8 5 +#define PIXELFMT_V8 6 +#define PIXELFMT_YUV420 7 + +union PE_CONTROL +{ + struct + { + unsigned pixel_format : 3; // PIXELFMT_X + unsigned zformat : 3; // 0 - linear, 1 - near, 2 - mid, 3 - far + unsigned zcomploc : 1; // 1: before tex stage + unsigned unused : 17; + unsigned rid : 8; + }; + u32 hex; +}; + +////////////////////////////////////////////////////////////////////////// +// Texture coordinate stuff +////////////////////////////////////////////////////////////////////////// +union TCInfo +{ + struct + { + unsigned scale_minus_1 : 16; + unsigned range_bias : 1; + unsigned cylindric_wrap : 1; + }; + u32 hex; +}; +struct TCoordInfo +{ + TCInfo s; + TCInfo t; +}; + + +////////////////////////////////////////////////////////////////////////// +// All of BP memory +////////////////////////////////////////////////////////////////////////// + +union ColReg +{ + u32 hex; + struct + { + signed a : 11; + unsigned : 1; + signed b : 11; + unsigned type : 1; + }; +}; + +struct TevReg +{ + ColReg low; + ColReg high; +}; + +union TevKSel +{ + struct { + unsigned swap1 : 2; + unsigned swap2 : 2; + unsigned kcsel0 : 5; + unsigned kasel0 : 5; + unsigned kcsel1 : 5; + unsigned kasel1 : 5; + }; + u32 hex; + + int getKC(int i) {return i?kcsel1:kcsel0;} + int getKA(int i) {return i?kasel1:kasel0;} +}; + +union AlphaFunc +{ + struct + { + unsigned ref0 : 8; + unsigned ref1 : 8; + unsigned comp0 : 3; + unsigned comp1 : 3; + unsigned logic : 2; + }; + u32 hex; +}; + +union UPE_Copy +{ + u32 Hex; + struct + { + unsigned clamp0 : 1; + unsigned clamp1 : 1; + unsigned : 1; + unsigned target_pixel_format : 4; // realformat is (fmt/2)+((fmt&1)*8).... for some reason the msb is the lsb + unsigned gamma : 2; + unsigned half_scale : 1; // real size should be 2x smaller (run a gauss filter?) + unsigned scale_something : 1; + unsigned clear : 1; + unsigned frame_to_field : 2; + unsigned copy_to_xfb : 1; + unsigned intensity_fmt : 1; // if set, is an intensity format (I4,I8,IA4,IA8) + unsigned : 16; // seems to set everything to 1s when target pixel format is invalid + }; +}; + +struct BPMemory +{ + GenMode genMode; + u32 display_copy_filter[4]; //01-04 + u32 unknown; //05 + // indirect matrices (set by GXSetIndTexMtx, selected by TevStageIndirect::mid) + // abc form a 2x3 offset matrix, there's 3 such matrices + // the 3 offset matrices can either be indirect type, S-type, or T-type + // 6bit scale factor s is distributed across IND_MTXA/B/C. + // before using matrices scale by 2^-(s-17) + IND_MTX indmtx[3];//06-0e GXSetIndTexMtx, 2x3 matrices + IND_IMASK imask;//0f + TevStageIndirect tevind[16];//10 GXSetTevIndirect + X12Y12 scissorTL; //20 + X12Y12 scissorBR; //21 + LPSize lineptwidth; //22 line and point width + u32 sucounter; //23 + u32 rascounter; //24 + TEXSCALE texscale[2]; //25-26 GXSetIndTexCoordScale + RAS1_IREF tevindref; //27 GXSetIndTexOrder + TwoTevStageOrders tevorders[8]; //28-2F + TCoordInfo texcoords[8]; //0x30 s,t,s,t,s,t,s,t... + ZMode zmode; //40 + BlendMode blendmode; //41 + ConstantAlpha dstalpha; //42 + PE_CONTROL zcontrol; //43 GXSetZCompLoc, GXPixModeSync + u32 fieldmask; //44 + u32 drawdone; //45, bit1=1 if end of list + u32 unknown5; //46 clock? + u32 petoken; //47 + u32 petokenint; //48 + X10Y10 copyTexSrcXY; //49 + X10Y10 copyTexSrcWH; //4a + u32 copyTexDest; //4b// 4b == CopyAddress (GXDispCopy and GXTexCopy use it) + u32 unknown6; //4c + u32 copyMipMapStrideChannels; // 4d usually set to 4 when dest is single channel, 8 when dest is 2 channel, 16 when dest is RGBA + // also, doubles whenever mipmap box filter option is set (excent on RGBA). Probably to do with number of bytes to look at when smoothing + u32 dispcopyyscale; //4e + u32 clearcolorAR; //4f + u32 clearcolorGB; //50 + u32 clearZValue; //51 + u32 triggerEFBCopy; //52 + u32 copyfilter[2]; //53,54 + u32 boundbox0;//55 + u32 boundbox1;//56 + u32 unknown7[2];//57,58 + X10Y10 scissorOffset; //59 + u32 unknown8[10]; //5a,5b,5c,5d, 5e,5f,60,61, 62, 63 (GXTexModeSync), 0x60-0x63 have to do with preloaded textures? + u32 tlutXferSrc; //64 + u32 tlutXferDest; //65 + u32 texinvalidate;//66 + u32 metric; //67 + u32 fieldmode;//68 + u32 unknown10[7];//69-6F + u32 unknown11[16];//70-7F + FourTexUnits tex[2]; //80-bf + TevStageCombiner combiners[16]; //0xC0-0xDF + TevReg tevregs[4]; //0xE0 + u32 fogRangeAdj; //0xE8 + u32 unknown15[3]; //0xe9,0xea,0xeb - fog related + u32 tev_range_adj_c; //0xec - screenx center for range adjustment, range adjustment enable + u32 tev_range_adj_k; //0xed - specifies range adjustment function = sqrt(x*x+k*k)/k + FogParams fog; //0xEE,0xEF,0xF0,0xF1,0xF2 + AlphaFunc alphaFunc; //0xF3 + ZTex1 ztex1; //0xf4,0xf5 + ZTex2 ztex2; + TevKSel tevksel[8];//0xf6,0xf7,f8,f9,fa,fb,fc,fd + u32 bpMask; //0xFE + u32 unknown18; //ff +}; + +void BPInit(); +size_t BPSaveLoadState(char *ptr, BOOL save); +//bool BPWritten(int addr, int changes); +void LoadBPReg(u32 value0); + +void SetColorMask(); +bool SetScissorRect(); + +extern BPMemory bpmem; + +#pragma pack() + +#endif diff --git a/Source/Plugins/Plugin_VideoOGL/Src/DataReader.cpp b/Source/Plugins/Plugin_VideoOGL/Src/DataReader.cpp new file mode 100644 index 0000000000..43697ff5b4 --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/DataReader.cpp @@ -0,0 +1,96 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "Globals.h" +#include "DataReader.h" + +// ================================================================================================= +// CDataReader_Fifo +// ================================================================================================= + +IDataReader* g_pDataReader = NULL; +extern u8 FAKE_ReadFifo8(); +extern u16 FAKE_ReadFifo16(); +extern u32 FAKE_ReadFifo32(); +extern void FAKE_SkipFifo(u32 skip); + +CDataReader_Fifo::CDataReader_Fifo(void) +{ + m_szName = "CDataReader_Fifo"; +} + +u8 CDataReader_Fifo::Read8(void) +{ + return FAKE_ReadFifo8(); +}; + +u16 CDataReader_Fifo::Read16(void) +{ + return FAKE_ReadFifo16(); +}; + +u32 CDataReader_Fifo::Read32(void) +{ + return FAKE_ReadFifo32(); +}; + +void CDataReader_Fifo::Skip(u32 skip) +{ + return FAKE_SkipFifo(skip); +} + +// ================================================================================================= +// CDataReader_Memory +// ================================================================================================= + +CDataReader_Memory::CDataReader_Memory(u32 _uAddress) : + m_uReadAddress(_uAddress) +{ + //m_pMemory = g_VideoInitialize.pGetMemoryPointer(0x00); + m_szName = "CDataReader_Memory"; +} + +u32 CDataReader_Memory::GetReadAddress(void) +{ + return m_uReadAddress; +} + +u8 CDataReader_Memory::Read8(void) +{ + u8 tmp = Memory_Read_U8(m_uReadAddress);//m_pMemory[m_uReadAddress]; + m_uReadAddress++; + return tmp; +} + +u16 CDataReader_Memory::Read16(void) +{ + u16 tmp = Memory_Read_U16(m_uReadAddress);//_byteswap_ushort(*(u16*)&m_pMemory[m_uReadAddress]); + m_uReadAddress += 2; + return tmp; +} + +u32 CDataReader_Memory::Read32(void) +{ + u32 tmp = Memory_Read_U32(m_uReadAddress);//_byteswap_ulong(*(u32*)&m_pMemory[m_uReadAddress]); + m_uReadAddress += 4; + return tmp; +} + +void CDataReader_Memory::Skip(u32 skip) +{ + m_uReadAddress += skip; +} diff --git a/Source/Plugins/Plugin_VideoOGL/Src/DataReader.h b/Source/Plugins/Plugin_VideoOGL/Src/DataReader.h new file mode 100644 index 0000000000..11926cf32a --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/DataReader.h @@ -0,0 +1,79 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef _DATAREADER_H +#define _DATAREADER_H + +// ================================================================================================= +// IDataReader +// ================================================================================================= + +class IDataReader +{ +protected: + const char *m_szName; + +public: + virtual void Skip(u32) = 0; + virtual u8 Read8 (void) = 0; + virtual u16 Read16(void) = 0; + virtual u32 Read32(void) = 0; +}; + +// ================================================================================================= +// CDataReader_Fifo +// ================================================================================================= + +class CDataReader_Fifo : public IDataReader +{ +private: + +public: + CDataReader_Fifo(void); + + virtual void Skip(u32); + virtual u8 Read8(void); + virtual u16 Read16(void); + virtual u32 Read32(void); +}; + +// ================================================================================================= +// CDataReader_Memory +// ================================================================================================= + +class CDataReader_Memory : public IDataReader +{ +private: + + //u8* m_pMemory; + u32 m_uReadAddress; + +public: + + CDataReader_Memory(u32 _uAddress); + + u32 GetReadAddress(void); + + virtual void Skip(u32); + virtual u8 Read8(void); + virtual u16 Read16(void); + virtual u32 Read32(void); +}; + +extern IDataReader* g_pDataReader; + +#endif diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Fifo.cpp b/Source/Plugins/Plugin_VideoOGL/Src/Fifo.cpp new file mode 100644 index 0000000000..72907c1593 --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/Fifo.cpp @@ -0,0 +1,170 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include + +#include "Common.h" +#include "Globals.h" +#include "MemoryUtil.h" +#include "Fifo.h" +#include "Thread.h" +#include "OpcodeDecoding.h" + +#define FIFO_SIZE (1024*1024) + +FifoReader fifo; +static u8 *videoBuffer; + +int size = 0; +int readptr = 0; + +void Fifo_Init() +{ + videoBuffer = (u8*)AllocateMemoryPages(FIFO_SIZE); + fifo.Init(videoBuffer, videoBuffer); //zero length. there is no data yet. +} + +void Fifo_Shutdown() +{ + FreeMemoryPages(videoBuffer, FIFO_SIZE); +} + +int FAKE_GetFifoSize() +{ + if (size < readptr) + { + PanicAlert("GFX Fifo underrun encountered."); + } + return (size - readptr); +} + +u8 FAKE_PeekFifo8(u32 _uOffset) +{ + return videoBuffer[readptr + _uOffset]; +} + +u16 FAKE_PeekFifo16(u32 _uOffset) +{ + return Common::swap16(*(u16*)&videoBuffer[readptr + _uOffset]); +} + +u32 FAKE_PeekFifo32(u32 _uOffset) +{ + return Common::swap32(*(u32*)&videoBuffer[readptr + _uOffset]); +} + +u8 FAKE_ReadFifo8() +{ + return videoBuffer[readptr++]; +} + +u16 FAKE_ReadFifo16() +{ + u16 val = Common::swap16(*(u16*)(videoBuffer+readptr)); + readptr += 2; + return val; +} + +u32 FAKE_ReadFifo32() +{ + u32 val = Common::swap32(*(u32*)(videoBuffer+readptr)); + readptr += 4; + return val; +} + +void FAKE_SkipFifo(u32 skip) +{ + readptr += skip; +} + +void Video_SendFifoData(BYTE *_uData) +{ + memcpy(videoBuffer + size, _uData, 32); + size += 32; + if (size + 32 >= FIFO_SIZE) + { + if (FAKE_GetFifoSize() > readptr) + { + SysMessage("out of bounds"); + exit(1); + } + + DebugLog("FAKE BUFFER LOOPS"); + memmove(&videoBuffer[0], &videoBuffer[readptr], FAKE_GetFifoSize()); + // memset(&videoBuffer[FAKE_GetFifoSize()], 0, FIFO_SIZE - FAKE_GetFifoSize()); + size = FAKE_GetFifoSize(); + readptr = 0; + } + OpcodeDecoder_Run(); +} + + +//TODO - turn inside out, have the "reader" ask for bytes instead +// See Core.cpp for threading idea +void Video_EnterLoop() +{ + SCPFifoStruct &fifo = *g_VideoInitialize.pCPFifo; + + // TODO(ector): Don't peek so often! + while (g_VideoInitialize.pPeekMessages()) + { + if (fifo.CPReadWriteDistance < 1) //fifo.CPLoWatermark) + Common::SleepCurrentThread(1); + //etc... + + // check if we are able to run this buffer + if ((fifo.bFF_GPReadEnable) && !(fifo.bFF_BPEnable && fifo.bFF_Breakpoint)) + { + int count = 200; + while(fifo.CPReadWriteDistance > 0 && count) + { + // check if we are on a breakpoint + if (fifo.bFF_BPEnable) + { + if (fifo.CPReadPointer == fifo.CPBreakpoint) + { + fifo.bFF_Breakpoint = 1; + g_VideoInitialize.pUpdateInterrupts(); + break; + } + } + + // read the data and send it to the VideoPlugin + + u8 *uData = Memory_GetPtr(fifo.CPReadPointer); +#ifdef _WIN32 + EnterCriticalSection(&fifo.sync); +#endif + fifo.CPReadPointer += 32; + Video_SendFifoData(uData); +#ifdef _WIN32 + InterlockedExchangeAdd((LONG*)&fifo.CPReadWriteDistance, -32); + LeaveCriticalSection(&fifo.sync); +#endif + // increase the ReadPtr + if (fifo.CPReadPointer >= fifo.CPEnd) + { + fifo.CPReadPointer = fifo.CPBase; + //LOG(COMMANDPROCESSOR, "BUFFER LOOP"); + } + count--; + } + } + + } +} + diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Fifo.h b/Source/Plugins/Plugin_VideoOGL/Src/Fifo.h new file mode 100644 index 0000000000..48392c2a51 --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/Fifo.h @@ -0,0 +1,57 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef _FIFO_H +#define _FIFO_H + +#include "Common.h" +// inline for speed! +class FifoReader +{ + u8 *ptr; + u8 *end; + u8 *tempPtr; //single element stack :P + u8 *tempEnd; + bool pushed; +public: + void Init(u8 *_ptr, u8 *_end) + { + ptr = _ptr; end = _end; pushed = false; + } + bool IsPushed() {return pushed;} + void Push(u8 *_ptr, u8 *_end) {pushed = true; tempPtr = ptr; tempEnd = end; ptr = _ptr; end = _end;} + void Pop() {pushed = false; ptr = tempPtr; end = tempEnd;} + u8 Peek8 (int offset) const { return ptr[offset]; } + u16 Peek16(int offset) const { return Common::swap16(*(u16*)(ptr+offset)); } + u32 Peek32(int offset) const { return Common::swap32(*(u32*)(ptr+offset)); } + u8 Read8 () {return *ptr++;} + u16 Read16() {const u16 value = Common::swap16(*((u16*)ptr)); ptr+=2; return value;} + u32 Read32() {const u32 value = Common::swap32(*((u32*)ptr)); ptr+=4; return value;} + float Read32F() {const u32 value = Common::swap32(*((u32*)ptr)); ptr+=4; return *(float*)&value;} + int GetRemainSize() const { return (int)(end - ptr); } + u8 *GetPtr() const { return ptr; } + void MoveEndForward() { end += 32; } + u8 *GetEnd() const { return end; } +}; + +extern FifoReader fifo; + +void Fifo_Init(); +void Fifo_Shutdown(); + +#endif + diff --git a/Source/Plugins/Plugin_VideoOGL/Src/GLInit.cpp b/Source/Plugins/Plugin_VideoOGL/Src/GLInit.cpp new file mode 100644 index 0000000000..1310cebd9c --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/GLInit.cpp @@ -0,0 +1,446 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "Globals.h" +#ifdef _WIN32 +#include "EmuWindow.h" +#endif +#include "GLInit.h" + + +// Handles OpenGL and the window + + +// screen offset +int nBackbufferWidth, nBackbufferHeight; +u32 s_nTargetWidth = 0, s_nTargetHeight = 0; +u32 g_AAx = 0, g_AAy = 0; + +#ifndef _WIN32 +GLWindow GLWin; +#endif + +#ifdef _WIN32 +static HDC hDC = NULL; // Private GDI Device Context +static HGLRC hRC = NULL; // Permanent Rendering Context +extern HINSTANCE g_hInstance; +#endif + +void OpenGL_SwapBuffers() +{ +#ifdef _WIN32 + SwapBuffers(hDC); +#else + glXSwapBuffers(GLWin.dpy, GLWin.win); +#endif +} + +void OpenGL_SetWindowText(const char *text) +{ +#ifdef _WIN32 + SetWindowText(EmuWindow::GetWnd(), text); +#else + // TODO +#endif +} + +BOOL Callback_PeekMessages() +{ +#ifdef _WIN32 + //TODO: peekmessage + MSG msg; + while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) + { + if (msg.message == WM_QUIT) + return FALSE; + TranslateMessage(&msg); + DispatchMessage(&msg); + } + return TRUE; +#else + XEvent event; + while (XPending(GLWin.dpy) > 0) { + XNextEvent(GLWin.dpy, &event); + } +#endif +} + + +void UpdateFPSDisplay(const char *text) +{ + OpenGL_SetWindowText(text); +} + + +bool OpenGL_Create(SVideoInitialize &_VideoInitialize, int _width, int _height) +{ +#ifdef _WIN32 + EmuWindow::SetSize(_width, _height); +#endif + + nBackbufferWidth = _width; + nBackbufferHeight = _height; + + // change later + s_nTargetWidth = 640<screen), + vi->visual, AllocNone); + GLWin.attr.colormap = cmap; + GLWin.attr.border_pixel = 0; + + // get a connection + XF86VidModeQueryVersion(GLWin.dpy, &vidModeMajorVersion, &vidModeMinorVersion); + + if (GLWin.fs) { + + XF86VidModeModeInfo **modes = NULL; + int modeNum = 0; + int bestMode = 0; + + // set best mode to current + bestMode = 0; + ERROR_LOG("XF86VidModeExtension-Version %d.%d\n", vidModeMajorVersion, vidModeMinorVersion); + XF86VidModeGetAllModeLines(GLWin.dpy, GLWin.screen, &modeNum, &modes); + + if (modeNum > 0 && modes != NULL) { + /* save desktop-resolution before switching modes */ + GLWin.deskMode = *modes[0]; + /* look for mode with requested resolution */ + for (int i = 0; i < modeNum; i++) { + if ((modes[i]->hdisplay == _width) && (modes[i]->vdisplay == _height)) { + bestMode = i; + } + } + + XF86VidModeSwitchToMode(GLWin.dpy, GLWin.screen, modes[bestMode]); + XF86VidModeSetViewPort(GLWin.dpy, GLWin.screen, 0, 0); + dpyWidth = modes[bestMode]->hdisplay; + dpyHeight = modes[bestMode]->vdisplay; + ERROR_LOG("Resolution %dx%d\n", dpyWidth, dpyHeight); + XFree(modes); + + /* create a fullscreen window */ + GLWin.attr.override_redirect = True; + GLWin.attr.event_mask = ExposureMask | KeyPressMask | ButtonPressMask | + StructureNotifyMask; + GLWin.win = XCreateWindow(GLWin.dpy, RootWindow(GLWin.dpy, vi->screen), + 0, 0, dpyWidth, dpyHeight, 0, vi->depth, InputOutput, vi->visual, + CWBorderPixel | CWColormap | CWEventMask | CWOverrideRedirect, + &GLWin.attr); + XWarpPointer(GLWin.dpy, None, GLWin.win, 0, 0, 0, 0, 0, 0); + XMapRaised(GLWin.dpy, GLWin.win); + XGrabKeyboard(GLWin.dpy, GLWin.win, True, GrabModeAsync, + GrabModeAsync, CurrentTime); + XGrabPointer(GLWin.dpy, GLWin.win, True, ButtonPressMask, + GrabModeAsync, GrabModeAsync, GLWin.win, None, CurrentTime); + } + else { + ERROR_LOG("Failed to start fullscreen. If you received the \n" + "\"XFree86-VidModeExtension\" extension is missing, add\n" + "Load \"extmod\"\n" + "to your X configuration file (under the Module Section)\n"); + GLWin.fs = 0; + } + } + + + if (!GLWin.fs) { + + //XRootWindow(dpy,screen) + //int X = (rcdesktop.right-rcdesktop.left)/2 - (rc.right-rc.left)/2; + //int Y = (rcdesktop.bottom-rcdesktop.top)/2 - (rc.bottom-rc.top)/2; + + // create a window in window mode + GLWin.attr.event_mask = ExposureMask | KeyPressMask | ButtonPressMask | + StructureNotifyMask; + GLWin.win = XCreateWindow(GLWin.dpy, RootWindow(GLWin.dpy, vi->screen), + 0, 0, _width, _height, 0, vi->depth, InputOutput, vi->visual, + CWBorderPixel | CWColormap | CWEventMask, &GLWin.attr); + // only set window title and handle wm_delete_events if in windowed mode + wmDelete = XInternAtom(GLWin.dpy, "WM_DELETE_WINDOW", True); + XSetWMProtocols(GLWin.dpy, GLWin.win, &wmDelete, 1); + XSetStandardProperties(GLWin.dpy, GLWin.win, "GPU", + "GPU", None, NULL, 0, NULL); + XMapRaised(GLWin.dpy, GLWin.win); + } +#endif + return true; +} + +bool OpenGL_MakeCurrent() +{ +#ifdef _WIN32 + if (!wglMakeCurrent(hDC,hRC)) { + MessageBox(NULL,"(5) Can't Activate The GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION); + return false; + } +#else + Window winDummy; + unsigned int borderDummy; + // connect the glx-context to the window + glXMakeCurrent(GLWin.dpy, GLWin.win, GLWin.ctx); + XGetGeometry(GLWin.dpy, GLWin.win, &winDummy, &GLWin.x, &GLWin.y, + &GLWin.width, &GLWin.height, &borderDummy, &GLWin.depth); + ERROR_LOG("GLWin Depth %d", GLWin.depth); + if (glXIsDirect(GLWin.dpy, GLWin.ctx)) + ERROR_LOG("you have Direct Rendering!"); + else + ERROR_LOG("no Direct Rendering possible!"); + + // better for pad plugin key input (thc) + XSelectInput(GLWin.dpy, GLWin.win, ExposureMask | KeyPressMask | KeyReleaseMask | + ButtonPressMask | StructureNotifyMask | EnterWindowMask | LeaveWindowMask | + FocusChangeMask ); +#endif + return true; +} + +void OpenGL_Update() +{ +#ifdef _WIN32 + + if (EmuWindow::GetParentWnd()) + { + RECT rcWindow; + GetWindowRect(EmuWindow::GetParentWnd(), &rcWindow); + + int width = rcWindow.right - rcWindow.left; + int height = rcWindow.bottom - rcWindow.top; + + ::MoveWindow(EmuWindow::GetWnd(), 0,0,width,height, FALSE); + nBackbufferWidth = width; + nBackbufferHeight = height; + + /* + u32 TmpAAx = (width / 640) - 1; + u32 TmpAAy = (height / 480) - 1; + u32 FinalAA = TmpAAx < TmpAAy ? TmpAAx : TmpAAy; + + g_AAx = FinalAA; + g_AAy = FinalAA; + + s_nTargetWidth = 640< +#include +#include +#include +//#include +#include +#include + +typedef struct { + Display *dpy; + int screen; + Window win; + GLXContext ctx; + XSetWindowAttributes attr; + Bool fs; + Bool doubleBuffered; + XF86VidModeModeInfo deskMode; + int x, y; + unsigned int width, height; + unsigned int depth; +} GLWindow; + +extern GLWindow GLWin; + +#endif + +// yeah yeah, these should be hidden +extern int nBackbufferWidth, nBackbufferHeight; +extern u32 s_nTargetWidth, s_nTargetHeight; +extern u32 g_AAx, g_AAy; + +bool OpenGL_Create(SVideoInitialize &_VideoInitialize, int _width, int _height); +bool OpenGL_MakeCurrent(); +void OpenGL_SwapBuffers(); +void OpenGL_SetWindowText(const char *text); +void OpenGL_Shutdown(); +void OpenGL_Update(); + + + +#endif diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Globals.cpp b/Source/Plugins/Plugin_VideoOGL/Src/Globals.cpp new file mode 100644 index 0000000000..5e2ab90f23 --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/Globals.cpp @@ -0,0 +1,686 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "Globals.h" + +#include "pluginspecs_video.h" +#include "main.h" + +#include "IniFile.h" +#include + +int frameCount; +int lut3to8[8]; +int lut4to8[16]; +int lut5to8[32]; +int lut6to8[64]; +float lutu8tosfloat[256]; +float lutu8toufloat[256]; +float luts8tosfloat[256]; + +int g_Res[NUMWNDRES][2] = +{ + {640,480}, + {800,600}, + {1024,768}, + {1280,960}, + {1280,1024}, + {1600,1200}, +}; + +Config g_Config; +Statistics stats; + +void Statistics::ResetFrame() +{ + memset(&thisFrame,0,sizeof(ThisFrame)); +} + +void InitLUTs() +{ + int i; + for (i=0; i<8; i++) + lut3to8[i] = (i*255)/7; + for (i=0; i<16; i++) + lut4to8[i] = (i*255)/15; + for (i=0; i<32; i++) + lut5to8[i] = (i*255)/31; + for (i=0; i<64; i++) + lut6to8[i] = (i*255)/63; + for (i=0; i<256; i++) + { + lutu8tosfloat[i] = (float)(i-128)/127.0f; + lutu8toufloat[i] = (float)(i)/255.0f; + luts8tosfloat[i] = ((float)(signed char)(char)i) / 127.0f; + } +} + +Config::Config() +{ + memset(this, 0, sizeof(Config)); +} + +void Config::Load() +{ + IniFile iniFile; + iniFile.Load("flipper.ini"); + iniFile.Get("Hardware", "Adapter", &iAdapter, 0); + iniFile.Get("Hardware", "WindowedRes", &iWindowedRes, 0); + iniFile.Get("Hardware", "FullscreenRes", &iFSResolution, 0); + iniFile.Get("Hardware", "Fullscreen", &bFullscreen, 0); + if (iAdapter == -1) + iAdapter = 0; + + iniFile.Get("Settings", "OverlayStats", &bOverlayStats, false); + iniFile.Get("Settings", "Postprocess", &iPostprocessEffect, 0); + iniFile.Get("Settings", "DLOptimize", &iCompileDLsLevel, 0); + iniFile.Get("Settings", "DumpTextures", &bDumpTextures, 0); + iniFile.Get("Settings", "ShowShaderErrors", &bShowShaderErrors, 0); + iniFile.Get("Settings", "Multisample", &iMultisampleMode, 0); + std::string s; + iniFile.Get("Settings", "TexDumpPath", &s, 0); + if( s.size() < sizeof(texDumpPath) ) + strcpy(texDumpPath, s.c_str()); + else { + strncpy(texDumpPath, s.c_str(), sizeof(texDumpPath)-1); + texDumpPath[sizeof(texDumpPath)-1] = 0; + } + + iniFile.Get("Enhancements", "ForceFiltering", &bForceFiltering, 0); + iniFile.Get("Enhancements", "ForceMaxAniso", &bForceMaxAniso, 0); +} + +void Config::Save() +{ + IniFile iniFile; + iniFile.Load("flipper.ini"); + iniFile.Set("Hardware", "Adapter", iAdapter); + iniFile.Set("Hardware", "WindowedRes", iWindowedRes); + iniFile.Set("Hardware", "FullscreenRes", iFSResolution); + iniFile.Set("Hardware", "Fullscreen", bFullscreen); + + iniFile.Set("Settings", "OverlayStats", bOverlayStats); + iniFile.Set("Settings", "OverlayStats", bOverlayStats); + iniFile.Set("Settings", "Postprocess", iPostprocessEffect); + iniFile.Set("Settings", "DLOptimize", iCompileDLsLevel); + iniFile.Set("Settings", "DumpTextures", bDumpTextures); + iniFile.Set("Settings", "ShowShaderErrors", bShowShaderErrors); + iniFile.Set("Settings", "Multisample", iMultisampleMode); + iniFile.Set("Settings", "TexDumpPath", texDumpPath); + + iniFile.Set("Enhancements", "ForceFiltering", bForceFiltering); + iniFile.Set("Enhancements", "ForceMaxAniso", bForceMaxAniso); + iniFile.Save("flipper.ini"); +} + +#ifdef _M_IX86 + +extern "C" { +#ifdef _WIN32 +#define XMD_H +#undef FAR +#define HAVE_BOOLEAN +#endif + +#include +} + +bool SaveJPEG(const char* filename, int image_width, int image_height, const void* pdata, int quality) +{ + u8* image_buffer = new u8[image_width * image_height * 3]; + u8* psrc = (u8*)pdata; + + // input data is rgba format, so convert to rgb + u8* p = image_buffer; + for(int i = 0; i < image_height; ++i) { + for(int j = 0; j < image_width; ++j) { + p[0] = psrc[0]; + p[1] = psrc[1]; + p[2] = psrc[2]; + p += 3; + psrc += 4; + } + } + + /* This struct contains the JPEG compression parameters and pointers to + * working space (which is allocated as needed by the JPEG library). + * It is possible to have several such structures, representing multiple + * compression/decompression processes, in existence at once. We refer + * to any one struct (and its associated working data) as a "JPEG object". + */ + struct jpeg_compress_struct cinfo; + /* This struct represents a JPEG error handler. It is declared separately + * because applications often want to supply a specialized error handler + * (see the second half of this file for an example). But here we just + * take the easy way out and use the standard error handler, which will + * print a message on stderr and call exit() if compression fails. + * Note that this struct must live as long as the main JPEG parameter + * struct, to avoid dangling-pointer problems. + */ + struct jpeg_error_mgr jerr; + /* More stuff */ + FILE * outfile; /* target file */ + JSAMPROW row_pointer[1]; /* pointer to JSAMPLE row[s] */ + int row_stride; /* physical row width in image buffer */ + + /* Step 1: allocate and initialize JPEG compression object */ + + /* We have to set up the error handler first, in case the initialization + * step fails. (Unlikely, but it could happen if you are out of memory.) + * This routine fills in the contents of struct jerr, and returns jerr's + * address which we place into the link field in cinfo. + */ + cinfo.err = jpeg_std_error(&jerr); + /* Now we can initialize the JPEG compression object. */ + jpeg_create_compress(&cinfo); + + /* Step 2: specify data destination (eg, a file) */ + /* Note: steps 2 and 3 can be done in either order. */ + + /* Here we use the library-supplied code to send compressed data to a + * stdio stream. You can also write your own code to do something else. + * VERY IMPORTANT: use "b" option to fopen() if you are on a machine that + * requires it in order to write binary files. + */ + if ((outfile = fopen(filename, "wb")) == NULL) { + fprintf(stderr, "can't open %s\n", filename); + exit(1); + } + jpeg_stdio_dest(&cinfo, outfile); + + /* Step 3: set parameters for compression */ + + /* First we supply a description of the input image. + * Four fields of the cinfo struct must be filled in: + */ + cinfo.image_width = image_width; /* image width and height, in pixels */ + cinfo.image_height = image_height; + cinfo.input_components = 3; /* # of color components per pixel */ + cinfo.in_color_space = JCS_RGB; /* colorspace of input image */ + /* Now use the library's routine to set default compression parameters. + * (You must set at least cinfo.in_color_space before calling this, + * since the defaults depend on the source color space.) + */ + jpeg_set_defaults(&cinfo); + /* Now you can set any non-default parameters you wish to. + * Here we just illustrate the use of quality (quantization table) scaling: + */ + jpeg_set_quality(&cinfo, quality, TRUE /* limit to baseline-JPEG values */); + + /* Step 4: Start compressor */ + + /* TRUE ensures that we will write a complete interchange-JPEG file. + * Pass TRUE unless you are very sure of what you're doing. + */ + jpeg_start_compress(&cinfo, TRUE); + + /* Step 5: while (scan lines remain to be written) */ + /* jpeg_write_scanlines(...); */ + + /* Here we use the library's state variable cinfo.next_scanline as the + * loop counter, so that we don't have to keep track ourselves. + * To keep things simple, we pass one scanline per call; you can pass + * more if you wish, though. + */ + row_stride = image_width * 3; /* JSAMPLEs per row in image_buffer */ + + while (cinfo.next_scanline < cinfo.image_height) { + /* jpeg_write_scanlines expects an array of pointers to scanlines. + * Here the array is only one element long, but you could pass + * more than one scanline at a time if that's more convenient. + */ + row_pointer[0] = & image_buffer[cinfo.next_scanline * row_stride]; + (void) jpeg_write_scanlines(&cinfo, row_pointer, 1); + } + + /* Step 6: Finish compression */ + + jpeg_finish_compress(&cinfo); + /* After finish_compress, we can close the output file. */ + fclose(outfile); + + /* Step 7: release JPEG compression object */ + + /* This is an important step since it will release a good deal of memory. */ + jpeg_destroy_compress(&cinfo); + + delete image_buffer; + /* And we're done! */ + return true; +} + +#else +bool SaveJPEG(const char* filename, int image_width, int image_height, const void* pdata, int quality) +{ + return false; +} +#endif + +#if defined(_MSC_VER) +#pragma pack(push, 1) +#endif + +struct TGA_HEADER +{ + u8 identsize; // size of ID field that follows 18 u8 header (0 usually) + u8 colourmaptype; // type of colour map 0=none, 1=has palette + u8 imagetype; // type of image 0=none,1=indexed,2=rgb,3=grey,+8=rle packed + + s16 colourmapstart; // first colour map entry in palette + s16 colourmaplength; // number of colours in palette + u8 colourmapbits; // number of bits per palette entry 15,16,24,32 + + s16 xstart; // image x origin + s16 ystart; // image y origin + s16 width; // image width in pixels + s16 height; // image height in pixels + u8 bits; // image bits per pixel 8,16,24,32 + u8 descriptor; // image descriptor bits (vh flip bits) + + // pixel data follows header + +#if defined(_MSC_VER) +}; +#pragma pack(pop) +#else +} __attribute__((packed)); +#endif + +bool SaveTGA(const char* filename, int width, int height, void* pdata) +{ + TGA_HEADER hdr; + FILE* f = fopen(filename, "wb"); + if (f == NULL) + return false; + + _assert_( sizeof(TGA_HEADER) == 18 && sizeof(hdr) == 18 ); + + memset(&hdr, 0, sizeof(hdr)); + hdr.imagetype = 2; + hdr.bits = 32; + hdr.width = width; + hdr.height = height; + hdr.descriptor |= 8|(1<<5); // 8bit alpha, flip vertical + + fwrite(&hdr, sizeof(hdr), 1, f); + fwrite(pdata, width*height*4, 1, f); + fclose(f); + return true; +} + +bool SaveTexture(const char* filename, u32 textarget, u32 tex, int width, int height) +{ + GL_REPORT_ERRORD(); + std::vector data(width*height); + glBindTexture(textarget, tex); + glGetTexImage(textarget, 0, GL_RGBA, GL_UNSIGNED_BYTE, &data[0]); + GLenum err; + GL_REPORT_ERROR(); + if (err != GL_NO_ERROR) { + return false; + } + + return SaveTGA(filename, width, height, &data[0]);//SaveJPEG(filename, width, height, &data[0], 70); +} + +//////////////////// +// Small profiler // +//////////////////// +#include +#include +#include +using namespace std; + +int g_bWriteProfile=0; + +#ifdef _WIN32 + +#if defined (_MSC_VER) && _MSC_VER >= 1400 +#include +#pragma intrinsic(__rdtsc) +#endif + +static u64 luPerfFreq=0; +inline u64 GET_PROFILE_TIME() +{ +#if defined (_MSC_VER) && _MSC_VER >= 1400 + return __rdtsc(); +#else + LARGE_INTEGER lu; + QueryPerformanceCounter(&lu); + return lu.QuadPart; +#endif +} +#else +static u64 luPerfFreq=1000000; +#define GET_PROFILE_TIME() //GetCpuTick() +#endif + + +struct DVPROFSTRUCT; + +struct DVPROFSTRUCT +{ + struct DATA + { + DATA(u64 time, u32 user = 0) : dwTime(time), dwUserData(user) {} + DATA() : dwTime(0), dwUserData(0) {} + + u64 dwTime; + u32 dwUserData; + }; + + ~DVPROFSTRUCT() { + list::iterator it = listpChild.begin(); + while(it != listpChild.end() ) { + delete *it; *it = NULL; + ++it; + } + } + + list listTimes; // before DVProfEnd is called, contains the global time it started + // after DVProfEnd is called, contains the time it lasted + // the list contains all the tracked times + char pname[256]; + + list listpChild; // other profilers called during this profiler period +}; + +struct DVPROFTRACK +{ + u32 dwUserData; + DVPROFSTRUCT::DATA* pdwTime; + DVPROFSTRUCT* pprof; +}; + +list g_listCurTracking; // the current profiling functions, the back element is the + // one that will first get popped off the list when DVProfEnd is called + // the pointer is an element in DVPROFSTRUCT::listTimes +list g_listProfilers; // the current profilers, note that these are the parents + // any profiler started during the time of another is held in + // DVPROFSTRUCT::listpChild +list g_listAllProfilers; // ignores the hierarchy, pointer to elements in g_listProfilers + +void DVProfRegister(const char *pname) +{ + if (!g_bWriteProfile) + return; + +#ifdef _WIN32 + if (luPerfFreq <= 1) { +#if defined (_MSC_VER) && _MSC_VER >= 1400 + luPerfFreq = 1000000; +#else + LARGE_INTEGER temp; + QueryPerformanceFrequency(&temp); + luPerfFreq = temp.QuadPart; +#endif + } +#endif + + list::iterator it = g_listAllProfilers.begin(); + +// while(it != g_listAllProfilers.end() ) { +// +// if( _tcscmp(pname, (*it)->pname) == 0 ) { +// (*it)->listTimes.push_back(timeGetTime()); +// DVPROFTRACK dvtrack; +// dvtrack.pdwTime = &(*it)->listTimes.back(); +// dvtrack.pprof = *it; +// g_listCurTracking.push_back(dvtrack); +// return; +// } +// +// ++it; +// } + + // else add in a new profiler to the appropriate parent profiler + DVPROFSTRUCT* pprof = NULL; + + if (g_listCurTracking.size() > 0) { + _assert_( g_listCurTracking.back().pprof != NULL ); + g_listCurTracking.back().pprof->listpChild.push_back(new DVPROFSTRUCT()); + pprof = g_listCurTracking.back().pprof->listpChild.back(); + } + else { + g_listProfilers.push_back(DVPROFSTRUCT()); + pprof = &g_listProfilers.back(); + } + + strncpy(pprof->pname, pname, 256); + + // setup the profiler for tracking + pprof->listTimes.push_back(DVPROFSTRUCT::DATA(GET_PROFILE_TIME())); + + DVPROFTRACK dvtrack; + dvtrack.pdwTime = &pprof->listTimes.back(); + dvtrack.pprof = pprof; + dvtrack.dwUserData = 0; + + g_listCurTracking.push_back(dvtrack); + + // add to all profiler list + g_listAllProfilers.push_back(pprof); +} + +void DVProfEnd(u32 dwUserData) +{ + if (!g_bWriteProfile) + return; + if (g_listCurTracking.size() == 0) + return; + + DVPROFTRACK dvtrack = g_listCurTracking.back(); + + _assert_( dvtrack.pdwTime != NULL && dvtrack.pprof != NULL ); + + dvtrack.pdwTime->dwTime = GET_PROFILE_TIME()- dvtrack.pdwTime->dwTime; + dvtrack.pdwTime->dwUserData= dwUserData; + + g_listCurTracking.pop_back(); +} + +struct DVTIMEINFO +{ + DVTIMEINFO() : uInclusive(0), uExclusive(0) {} + u64 uInclusive, uExclusive; +}; + +map mapAggregateTimes; + +u64 DVProfWriteStruct(FILE* f, DVPROFSTRUCT* p, int ident) +{ + fprintf(f, "%*s%s - ", ident, "", p->pname); + + list::iterator ittime = p->listTimes.begin(); + + u64 utime = 0; + + while(ittime != p->listTimes.end() ) { + utime += ittime->dwTime; + + if (ittime->dwUserData) + fprintf(f, "time: %d, user: 0x%8.8x", (u32)ittime->dwTime, ittime->dwUserData); + else + fprintf(f, "time: %d", (u32)ittime->dwTime); + ++ittime; + } + + // yes this is necessary, maps have problems with constructors on their type + map::iterator ittimes = mapAggregateTimes.find(p->pname); + if (ittimes == mapAggregateTimes.end()) { + ittimes = mapAggregateTimes.insert(map::value_type(p->pname, DVTIMEINFO())).first; + ittimes->second.uExclusive = 0; + ittimes->second.uInclusive = 0; + } + + ittimes->second.uInclusive += utime; + + fprintf(f, "\n"); + + list::iterator itprof = p->listpChild.begin(); + + u64 uex = utime; + while(itprof != p->listpChild.end() ) { + + uex -= DVProfWriteStruct(f, *itprof, ident+4); + ++itprof; + } + + if (uex > utime) { + uex = 0; + } + + ittimes->second.uExclusive += uex; + return utime; +} + +void DVProfWrite(const char* pfilename, u32 frames) +{ + _assert_( pfilename != NULL ); + FILE* f = fopen(pfilename, "w"); + + // pop back any unused + mapAggregateTimes.clear(); + list::iterator it = g_listProfilers.begin(); + + while(it != g_listProfilers.end() ) { + DVProfWriteStruct(f, &(*it), 0); + ++it; + } + + { + map::iterator it; + fprintf(f, "\n\n-------------------------------------------------------------------\n\n"); + + u64 uTotal[2] = {0}; + double fiTotalTime[2]; + + for(it = mapAggregateTimes.begin(); it != mapAggregateTimes.end(); ++it) { + uTotal[0] += it->second.uExclusive; + uTotal[1] += it->second.uInclusive; + } + + fprintf(f, "total times (%d): ex: %Lu ", frames, 1000000*uTotal[0]/(luPerfFreq*(u64)frames)); + fprintf(f, "inc: %Lu\n", 1000000 * uTotal[1]/(luPerfFreq*(u64)frames)); + + fiTotalTime[0] = 1.0 / (double)uTotal[0]; + fiTotalTime[1] = 1.0 / (double)uTotal[1]; + + // output the combined times + for(it = mapAggregateTimes.begin(); it != mapAggregateTimes.end(); ++it) { + fprintf(f, "%s - ex: %f inc: %f\n", it->first.c_str(), (float)((double)it->second.uExclusive * fiTotalTime[0]), + (float)((double)it->second.uInclusive * fiTotalTime[1])); + } + } + + + fclose(f); +} + +void DVProfClear() +{ + g_listCurTracking.clear(); + g_listProfilers.clear(); + g_listAllProfilers.clear(); +} + + +#ifdef _WIN32 +// The one for Linux is in Linux/Linux.cpp +void SysMessage(const char* _fmt, ...) +{ + char* Msg = (char*)alloca(strlen(_fmt)+512); + va_list ap; + + va_start( ap, _fmt ); + vsnprintf( Msg, strlen(_fmt)+512, _fmt, ap ); + va_end( ap ); + + g_VideoInitialize.pLog(Msg, FALSE); + PanicAlert(Msg); +} +HANDLE hConsole = NULL; +void OpenConsole() { + COORD csize; + CONSOLE_SCREEN_BUFFER_INFO csbiInfo; + SMALL_RECT srect; + + if (hConsole) return; + AllocConsole(); + SetConsoleTitle("Opengl Plugin Output"); + csize.X = 80; + csize.Y = 1024; + SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), csize); + + GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbiInfo); + srect = csbiInfo.srWindow; + srect.Right = srect.Left + 79; + srect.Bottom = srect.Top + 44; + SetConsoleWindowInfo(GetStdHandle(STD_OUTPUT_HANDLE), TRUE, &srect); + hConsole = GetStdHandle(STD_OUTPUT_HANDLE); +} + +void CloseConsole() { + if (hConsole == NULL) return; + FreeConsole(); hConsole = NULL; +} + +#endif + + +FILE* pfLog = NULL; +void __Log(const char *fmt, ...) +{ + char* Msg = (char*)alloca(strlen(fmt)+512); + va_list ap; + + va_start( ap, fmt ); + vsnprintf( Msg, strlen(fmt)+512, fmt, ap ); + va_end( ap ); + + g_VideoInitialize.pLog(Msg, FALSE); + + if( pfLog == NULL ) pfLog = fopen("Logs/oglgfx.txt", "w"); + + if( pfLog != NULL ) + fwrite(Msg, strlen(Msg), 1, pfLog); +#ifdef _WIN32 + DWORD tmp; + WriteConsole(hConsole, Msg, (DWORD)strlen(Msg), &tmp, 0); +#else + //printf("%s", Msg); +#endif +} + +void __Log(int type, const char *fmt, ...) +{ + char* Msg = (char*)alloca(strlen(fmt)+512); + va_list ap; + + va_start( ap, fmt ); + vsnprintf( Msg, strlen(fmt)+512, fmt, ap ); + va_end( ap ); + + g_VideoInitialize.pLog(Msg, FALSE); + +#ifdef _WIN32 + DWORD tmp; + WriteConsole(hConsole, Msg, (DWORD)strlen(Msg), &tmp, 0); +#endif +} + diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Globals.h b/Source/Plugins/Plugin_VideoOGL/Src/Globals.h new file mode 100644 index 0000000000..daf2f2794f --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/Globals.h @@ -0,0 +1,356 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +// several global utilities not really tied to core emulation +#ifndef _GLOBALS_H +#define _GLOBALS_H + +#define LOGGING + +#include "Common.h" +#include "x64Emitter.h" + +#ifdef _WIN32 + +#include +#include +#include + +#include "resource.h" + +void OpenConsole(); +void CloseConsole(); + +#define GLEW_STATIC + +#include "GL/glew.h" +#include "GL/wglew.h" +#include "GL/gl.h" +#include "GL/glext.h" + +#else // linux basic definitions + +#define ARRAYSIZE(A) (sizeof(A)/sizeof((A)[0])) +#define I_NEED_OS2_H // HAXXOR +//#include +#include +#include +//#include +#define __inline inline + +#include // ftime(), struct timeb + +inline unsigned long timeGetTime() +{ +#ifdef _WIN32 + _timeb t; + _ftime(&t); +#else + timeb t; + ftime(&t); +#endif + + return (unsigned long)(t.time*1000+t.millitm); +} + +struct RECT +{ + int left, top; + int right, bottom; +}; + +#endif // linux basic definitions + +#include +#include + +#ifndef GL_DEPTH24_STENCIL8_EXT // allows FBOs to support stencils +#define GL_DEPTH_STENCIL_EXT 0x84F9 +#define GL_UNSIGNED_INT_24_8_EXT 0x84FA +#define GL_DEPTH24_STENCIL8_EXT 0x88F0 +#define GL_TEXTURE_STENCIL_SIZE_EXT 0x88F1 +#endif + +// several macros +#ifndef SAFE_DELETE_ARRAY +#define SAFE_DELETE_ARRAY(x) if( (x) != NULL ) { delete[] (x); (x) = NULL; } +#endif +#ifndef SAFE_RELEASE +#define SAFE_RELEASE(x) if( (x) != NULL ) { (x)->Release(); (x) = NULL; } +#endif + +#define SAFE_RELEASE_CGPROG(x) { if( (x) != NULL ) { cgDestroyProgram(x); x = NULL; } } +#define SAFE_RELEASE_PROG(x) { if( (x) != 0 ) { glDeleteProgramsARB(1, &(x)); x = 0; } } +#define SAFE_RELEASE_TEX(x) { if( (x) != 0 ) { glDeleteTextures(1, &(x)); x = 0; } } +#define SAFE_RELEASE_BUF(x) { if( (x) != 0 ) { glDeleteBuffers(1, &(x)); x = 0; } } + +#define FORIT(it, v) for(it = (v).begin(); it != (v).end(); ++(it)) + +#define ERROR_LOG __Log + +#ifdef _DEBUG +#define INFO_LOG if( g_Config.iLog & 1 ) __Log +#define PRIM_LOG if( g_Config.iLog & 2 ) __Log +#define DEBUG_LOG __Log +#else +#define INFO_LOG(...) +#define PRIM_LOG(...) +#define DEBUG_LOG(...) +#endif + +#define GL_REPORT_ERROR() { err = glGetError(); if( err != GL_NO_ERROR ) { ERROR_LOG("%s:%d: gl error 0x%x\n", __FILE__, (int)__LINE__, err); HandleGLError(); } } + +#ifdef _DEBUG +#define GL_REPORT_ERRORD() { GLenum err = glGetError(); if( err != GL_NO_ERROR ) { ERROR_LOG("%s:%d: gl error 0x%x\n", __FILE__, (int)__LINE__, err); HandleGLError(); } } +#else +#define GL_REPORT_ERRORD() +#endif + +#ifndef ARRAY_SIZE +#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) +#endif + +#define BEGINSAVELOAD char *optr=ptr; +#define SAVELOAD(what,size) memcpy((void*)((save)?(void*)(ptr):(void*)(what)),(void*)((save)?(void*)(what):(void*)(ptr)),(size)); ptr+=(size); +#define ENDSAVELOAD return ptr-optr; + +struct TEXTUREFMT +{ + TEXTUREFMT(GLenum format, GLenum type) : type(type), format(format) {} + GLenum type, format; +}; + +extern int frameCount; +extern int lut3to8[8]; +extern int lut4to8[16]; +extern int lut5to8[32]; +extern int lut6to8[64]; +extern float lutu8tosfloat[256]; +extern float lutu8toufloat[256]; +extern float luts8tosfloat[256]; + +#define NUMWNDRES 6 +extern int g_Res[NUMWNDRES][2]; + +#define CONF_LOG 1 +#define CONF_PRIMLOG 2 +#define CONF_SAVETEXTURES 4 +#define CONF_SAVETARGETS 8 + +struct Config +{ + Config(); + void Load(); + void Save(); + + int iAdapter; + int iFSResolution; + int iMultisampleMode; + + int iPostprocessEffect; + int iCompileDLsLevel; + + int iLog; // CONF_ bits + bool bFullscreen; + bool bWireFrame; + bool bOverlayStats; + bool bDumpTextures; + bool bOldCard; + bool bShowShaderErrors; + //enhancements + bool bForceFiltering; + bool bForceMaxAniso; + + bool bPreUpscale; + int iPreUpscaleFilter; + + bool bTruform; + int iTruformLevel; + + int iWindowedRes; + int aa; // anti-aliasing level + + char psProfile[16]; + char vsProfile[16]; + + int iSaveTargetId; + + char texDumpPath[280]; +}; + +extern Config g_Config; + +struct Statistics +{ + int numPrimitives; + + int numPixelShadersCreated; + int numPixelShadersAlive; + int numVertexShadersCreated; + int numVertexShadersAlive; + + int numTexturesCreated; + int numTexturesAlive; + + int numRenderTargetsCreated; + int numRenderTargetsAlive; + + int numDListsCalled; + int numDListsCreated; + int numDListsAlive; + + int numJoins; + + struct ThisFrame + { + int numBPLoads; + int numCPLoads; + int numXFLoads; + + int numBPLoadsInDL; + int numCPLoadsInDL; + int numXFLoadsInDL; + + int numDLs; + int numDLPrims; + int numPrims; + int numShaderChanges; + int numBadCommands; //hope this always is zero ;) + }; + ThisFrame thisFrame; + void ResetFrame(); +}; + +extern Statistics stats; + +#define STATISTICS + +#ifdef STATISTICS +#define INCSTAT(a) (a)++; +#define ADDSTAT(a,b) (a)+=(b); +#define SETSTAT(a,x) (a)=(int)(x); +#else +#define INCSTAT(a) ; +#define ADDSTAT(a,b) ; +#define SETSTAT(a,x) ; +#endif + +void DebugLog(const char* _fmt, ...); +void __Log(const char *format, ...); +void __Log(int type, const char *format, ...); +void SysMessage(const char *fmt, ...); +void HandleGLError(); + +void InitLUTs(); +bool SaveJPEG(const char* filename, int image_width, int image_height, const void* pdata, int quality); +bool SaveTGA(const char* filename, int width, int height, void* pdata); +bool SaveTexture(const char* filename, u32 textarget, u32 tex, int width, int height); + +#if defined(_MSC_VER) && !defined(__x86_64__) && !defined(_M_X64) +void * memcpy_amd(void *dest, const void *src, size_t n); +unsigned char memcmp_mmx(const void* src1, const void* src2, int cmpsize); +#define memcpy_gc memcpy_amd +#define memcmp_gc memcmp_mmx +#else +#define memcpy_gc memcpy +#define memcmp_gc memcmp +#endif + +//#define RAM_MASK 0x1FFFFFF + +#include "main.h" + +inline u8 *Memory_GetPtr(u32 _uAddress) +{ + return g_VideoInitialize.pGetMemoryPointer(_uAddress);//&g_pMemory[_uAddress & RAM_MASK]; +} + +inline u8 Memory_Read_U8(u32 _uAddress) +{ + return *(u8*)g_VideoInitialize.pGetMemoryPointer(_uAddress);//g_pMemory[_uAddress & RAM_MASK]; +} + +inline u16 Memory_Read_U16(u32 _uAddress) +{ + return Common::swap16(*(u16*)g_VideoInitialize.pGetMemoryPointer(_uAddress)); + //return _byteswap_ushort(*(u16*)&g_pMemory[_uAddress & RAM_MASK]); +} + +inline u32 Memory_Read_U32(u32 _uAddress) +{ + return Common::swap32(*(u32*)g_VideoInitialize.pGetMemoryPointer(_uAddress)); + //return _byteswap_ulong(*(u32*)&g_pMemory[_uAddress & RAM_MASK]); +} + +inline float Memory_Read_Float(u32 _uAddress) +{ + union {u32 i; float f;} temp; + temp.i = Memory_Read_U32(_uAddress); + return temp.f; +} + +//// +// profiling +/// + +extern int g_bWriteProfile; // global variable to enable/disable profiling (if DVPROFILE is defined) + +// IMPORTANT: For every Reigster there must be an End +void DVProfRegister(const char* pname); // first checks if this profiler exists in g_listProfilers +void DVProfEnd(u32 dwUserData); +void DVProfWrite(const char* pfilename, u32 frames = 0); +void DVProfClear(); // clears all the profilers + +//#define DVPROFILE // comment out to disable profiling + +#if defined(DVPROFILE) && (defined(_WIN32)||defined(WIN32)) + +#ifdef _MSC_VER + +#ifndef __PRETTY_FUNCTION__ +#define __PRETTY_FUNCTION__ __FUNCTION__ +#endif + +#endif + +#define DVSTARTPROFILE() DVProfileFunc _pf(__PRETTY_FUNCTION__); + +class DVProfileFunc +{ +public: + u32 dwUserData; + DVProfileFunc(const char* pname) { DVProfRegister(pname); dwUserData = 0; } + DVProfileFunc(const char* pname, u32 dwUserData) : dwUserData(dwUserData) { DVProfRegister(pname); } + ~DVProfileFunc() { DVProfEnd(dwUserData); } +}; + +#else + +#define DVSTARTPROFILE() + +class DVProfileFunc +{ +public: + u32 dwUserData; + __forceinline DVProfileFunc(const char* pname) {} + __forceinline DVProfileFunc(const char* pname, u32 dwUserData) { } + ~DVProfileFunc() {} +}; + +#endif + +#endif diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Linux/Conf.cpp b/Source/Plugins/Plugin_VideoOGL/Src/Linux/Conf.cpp new file mode 100644 index 0000000000..3d75acd3bf --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/Linux/Conf.cpp @@ -0,0 +1,104 @@ +/* GSsoft + * Copyright (C) 2002-2004 GSsoft Team + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include +#include +#include +#include +#include +#include "GS.h" + +extern string s_strIniPath; + +void SaveConfig() { + FILE *f; + char cfg[255]; + + strcpy(cfg, s_strIniPath.c_str()); + f = fopen(cfg,"w"); + if (f == NULL) { + printf("failed to open %s\n", s_strIniPath.c_str()); + return; + } + fprintf(f, "interlace = %x\n", conf.interlace); + fprintf(f, "aliasing = %x\n", conf.aa); + fprintf(f, "bilinear = %x\n", conf.bilinear); + fprintf(f, "options = %x\n", conf.options); + fprintf(f, "gamesettings = %x\n", conf.gamesettings); + fclose(f); +} + +void LoadConfig() { + FILE *f; + char cfg[255]; + + memset(&conf, 0, sizeof(conf)); + conf.interlace = 0; // on, mode 1 + conf.mrtdepth = 1; + conf.options = 0; + conf.bilinear = 1; + conf.width = 640; + conf.height = 480; + + strcpy(cfg, s_strIniPath.c_str()); + f = fopen(cfg, "r"); + if (f == NULL) { + printf("failed to open %s\n", s_strIniPath.c_str()); + SaveConfig();//save and return + return; + } + fscanf(f, "interlace = %x\n", &conf.interlace); + fscanf(f, "aliasing = %x\n", &conf.aa); + fscanf(f, "bilinear = %x\n", &conf.bilinear); + fscanf(f, "options = %x\n", &conf.options); + fscanf(f, "gamesettings = %x\n", &conf.gamesettings); + fclose(f); + + // filter bad files + if( conf.aa < 0 || conf.aa > 2 ) conf.aa = 0; + + switch(conf.options&GSOPTION_WINDIMS) { + case GSOPTION_WIN640: + conf.width = 640; + conf.height = 480; + break; + case GSOPTION_WIN800: + conf.width = 800; + conf.height = 600; + break; + case GSOPTION_WIN1024: + conf.width = 1024; + conf.height = 768; + break; + case GSOPTION_WIN1280: + conf.width = 1280; + conf.height = 960; + break; + } + + // turn off all hacks by defaultof + conf.options &= ~(GSOPTION_FULLSCREEN|GSOPTION_WIREFRAME|GSOPTION_CAPTUREAVI); + conf.options |= GSOPTION_LOADED; + + if( conf.width <= 0 || conf.height <= 0 ) { + conf.width = 640; + conf.height = 480; + } +} + diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Linux/Linux.cpp b/Source/Plugins/Plugin_VideoOGL/Src/Linux/Linux.cpp new file mode 100644 index 0000000000..bb72966ccf --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/Linux/Linux.cpp @@ -0,0 +1,433 @@ +/* ZeroGS + * Copyright (C) 2002-2004 GSsoft Team + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include +#include +#include +#include + +#include +#include +/* +extern "C" { +#include "interface.h" +#include "support.h" +#include "callbacks.h" +}*/ + +#include "Linux.h" +#include "Common.h" + +#define CALLBACK + +#include + +static int prevbilinearfilter; +//static map mapConfOpts; +struct confOptsStruct{ + int value; + char *desc; +}confOpts; + +static std::map mapConfOpts; + +/* +extern void OnKeyboardF5(int); +extern void OnKeyboardF6(int); +extern void OnKeyboardF7(int); +extern void OnKeyboardF9(int); + +void CALLBACK GSkeyEvent(keyEvent *ev) +{ + static bool bShift = false; + static bool bAlt = false; + + switch(ev->event) { + case KEYPRESS: + switch(ev->key) { + case XK_F5: + OnKeyboardF5(bShift); + break; + case XK_F6: + OnKeyboardF6(bShift); + break; + case XK_F7: + OnKeyboardF7(bShift); + break; + case XK_F9: + OnKeyboardF9(bShift); + break; + case XK_Escape: + break; + case XK_Shift_L: + case XK_Shift_R: + bShift = true; + break; + case XK_Alt_L: + case XK_Alt_R: + bAlt = true; + break; + } + break; + case KEYRELEASE: + switch(ev->key) { + case XK_Shift_L: + case XK_Shift_R: + bShift = false; + break; + case XK_Alt_L: + case XK_Alt_R: + bAlt = false; + break; + } + } +} +*/ + +GtkWidget *Conf; +GtkWidget *Logging; +GList *fresl; +GList *wresl; +GList *cachesizel; +GList *codecl; +GList *filtersl; + +void OnConf_Ok(GtkButton *button, gpointer user_data) +{ + GtkWidget *Btn; + GtkWidget *treeview; + GtkTreeModel *treemodel; + GtkTreeIter treeiter; + gboolean treeoptval; + gchar *gbuf; + char *str; + int i; +/* + u32 newinterlace = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lookup_widget(Conf, "checkInterlace"))); + + if( !conf.interlace ) conf.interlace = newinterlace; + else if( !newinterlace ) conf.interlace = 2; // off + + conf.bilinear = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lookup_widget(Conf, "checkBilinear"))); + // restore + if( conf.bilinear && prevbilinearfilter ) + conf.bilinear = prevbilinearfilter; + + //conf.mrtdepth = 1;//IsDlgButtonChecked(hW, IDC_CONFIG_DEPTHWRITE); + + if( gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lookup_widget(Conf, "radioAANone"))) ) { + conf.aa = 0; + } + else if( gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lookup_widget(Conf, "radioAA2X"))) ) { + conf.aa = 1; + } + else conf.aa = 2; + + conf.options = 0; + conf.options |= gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lookup_widget(Conf, "checkAVI"))) ? GSOPTION_CAPTUREAVI : 0; + conf.options |= gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lookup_widget(Conf, "checkWireframe"))) ? GSOPTION_WIREFRAME : 0; + conf.options |= gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lookup_widget(Conf, "checkbutton6"))) ? GSOPTION_FULLSCREEN : 0; + conf.options |= gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lookup_widget(Conf, "checkTGA"))) ? GSOPTION_TGASNAP : 0; + + //------- get advanced options from the treeview model -------// + treeview = lookup_widget(Conf,"treeview1"); + treemodel = gtk_tree_view_get_model(GTK_TREE_VIEW(treeview)); + gtk_tree_model_get_iter_first(treemodel, &treeiter); + + conf.gamesettings = 0; + for(map::iterator it = mapConfOpts.begin(); it != mapConfOpts.end(); ++it) { + treeoptval = FALSE; + gtk_tree_model_get(treemodel, &treeiter, + 0, &treeoptval, + -1); + if(treeoptval){ + conf.gamesettings |= it->second.value; + } + gtk_tree_model_iter_next(treemodel,&treeiter); + } + GSsetGameCRC(0, conf.gamesettings); + //---------- done getting advanced options ---------// + + if( gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lookup_widget(Conf, "radioSize640"))) ) + conf.options |= GSOPTION_WIN640; + else if( gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lookup_widget(Conf, "radioSize800"))) ) + conf.options |= GSOPTION_WIN800; + else if( gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lookup_widget(Conf, "radioSize1024"))) ) + conf.options |= GSOPTION_WIN1024; + else if( gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lookup_widget(Conf, "radioSize1280"))) ) + conf.options |= GSOPTION_WIN1280; + + SaveConfig(); + + gtk_widget_destroy(Conf); + gtk_main_quit(); +*/ +} + +void OnConf_Cancel(GtkButton *button, gpointer user_data) { + gtk_widget_destroy(Conf); + gtk_main_quit(); +} + +void CALLBACK GSconfigure() +{ + char name[32]; + char descbuf[255]; + int nmodes, i; + bool itval; + GtkWidget *treeview; + GtkCellRenderer *treerend; + GtkListStore *treestore;//Gets typecast as GtkTreeModel as needed. + GtkTreeIter treeiter; + GtkTreeViewColumn *treecol; +/* + if( !(conf.options & GSOPTION_LOADED) ) + LoadConfig(); + + Conf = create_Config(); + + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(lookup_widget(Conf, "checkBilinear")), !!conf.bilinear); + //gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(lookup_widget(Conf, "checkbutton6")), conf.mrtdepth); + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(lookup_widget(Conf, "radioAANone")), conf.aa==0); + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(lookup_widget(Conf, "radioAA2X")), conf.aa==1); + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(lookup_widget(Conf, "radioAA4X")), conf.aa==2); + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(lookup_widget(Conf, "checkWireframe")), (conf.options&GSOPTION_WIREFRAME)?1:0); + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(lookup_widget(Conf, "checkAVI")), (conf.options&GSOPTION_CAPTUREAVI)?1:0); + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(lookup_widget(Conf, "checkbutton6")), (conf.options&GSOPTION_FULLSCREEN)?1:0); + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(lookup_widget(Conf, "checkTGA")), (conf.options&GSOPTION_TGASNAP)?1:0); + + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(lookup_widget(Conf, "radioSize640")), ((conf.options&GSOPTION_WINDIMS)>>4)==0); + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(lookup_widget(Conf, "radioSize800")), ((conf.options&GSOPTION_WINDIMS)>>4)==1); + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(lookup_widget(Conf, "radioSize1024")), ((conf.options&GSOPTION_WINDIMS)>>4)==2); + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(lookup_widget(Conf, "radioSize1280")), ((conf.options&GSOPTION_WINDIMS)>>4)==3); + + prevbilinearfilter = conf.bilinear; + + //--------- Let's build a treeview for our advanced options! --------// + treeview = lookup_widget(Conf,"treeview1"); + treestore = gtk_list_store_new(2,G_TYPE_BOOLEAN, G_TYPE_STRING); + + //setup columns in treeview + //COLUMN 0 is the checkboxes + treecol = gtk_tree_view_column_new(); + gtk_tree_view_column_set_title(treecol, "Select"); + gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), treecol); + treerend = gtk_cell_renderer_toggle_new(); + gtk_tree_view_column_pack_start(treecol, treerend, TRUE); + gtk_tree_view_column_add_attribute(treecol, treerend, "active", 0);//link 'active' attrib to first column of model + g_object_set(treerend, "activatable", TRUE, NULL);//set 'activatable' attrib true by default for all rows regardless of model. + g_signal_connect(treerend, "toggled", (GCallback) OnToggle_advopts, treestore);//set a global callback, we also pass a reference to our treestore. + + //COLUMN 1 is the text descriptions + treecol = gtk_tree_view_column_new(); + gtk_tree_view_column_set_title(treecol, "Description"); + gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), treecol); + treerend = gtk_cell_renderer_text_new(); + gtk_tree_view_column_pack_start(treecol, treerend, TRUE); + gtk_tree_view_column_add_attribute(treecol, treerend, "text", 1);//link 'text' attrib to second column of model + + //setup the model with all our rows of option data + mapConfOpts.clear(); + confOpts.value = 0x00000001; + confOpts.desc = "Tex Target checking - 00000001\nLego Racers"; + mapConfOpts["00000001"] = confOpts; + confOpts.value = 0x00000002; + confOpts.desc = "Auto reset targs - 00000002\nShadow Hearts, Samurai Warriors. Use when game is slow and toggling AA fixes it."; + mapConfOpts["00000002"] = confOpts; + confOpts.value = 0x00000004; + confOpts.desc = "Interlace 2X - 00000004\nFixes 2x bigger screen (Gradius 3)."; + mapConfOpts["00000004"] = confOpts; + confOpts.value = 0x00000008; + confOpts.desc = "Text Alpha hack - 00000008\nNightmare Before Christmas."; + mapConfOpts["00000008"] = confOpts; + confOpts.value = 0x00000010; + confOpts.desc = "No target resolves - 00000010\nStops all resolving of targets. Try this first for really slow games."; + mapConfOpts["00000010"] = confOpts; + confOpts.value = 0x00000020; + confOpts.desc = "Exact color testing - 00000020\nFixes overbright or shadow/black artifacts (Crash 'n Burn)."; + mapConfOpts["00000020"] = confOpts; + confOpts.value = 0x00000040; + confOpts.desc = "No color clamping - 00000040\nSpeeds up games, but might be too bright or too dim."; + mapConfOpts["00000040"] = confOpts; + confOpts.value = 0x00000080; + confOpts.desc = "FFX hack - 00000080\nShows missing geometry."; + mapConfOpts["00000080"] = confOpts; + confOpts.value = 0x00000200; + confOpts.desc = "Disable depth updates - 00000200"; + mapConfOpts["00000200"] = confOpts; + confOpts.value = 0x00000400; + confOpts.desc = "Resolve Hack #1 - 00000400\nKingdom Hearts. Speeds some games."; + mapConfOpts["00000400"] = confOpts; + confOpts.value = 0x00000800; + confOpts.desc = "Resolve Hack #2 - 00000800\nShadow Hearts, Urbz."; + mapConfOpts["00000800"] = confOpts; + confOpts.value = 0x00001000; + confOpts.desc = "No target CLUT - 00001000\nResident Evil 4, or foggy scenes."; + mapConfOpts["00001000"] = confOpts; + confOpts.value = 0x00002000; + confOpts.desc = "Disable stencil buffer - 00002000\nUsually safe to do for simple scenes."; + mapConfOpts["00002000"] = confOpts; + confOpts.value = 0x00004000; + confOpts.desc = "No vertical stripes - 00004000\nTry when there's a lot of garbage on screen."; + mapConfOpts["00004000"] = confOpts; + confOpts.value = 0x00008000; + confOpts.desc = "No depth resolve - 00008000\nMight give z buffer artifacts."; + mapConfOpts["00008000"] = confOpts; + confOpts.value = 0x00010000; + confOpts.desc = "Full 16 bit resolution - 00010000\nUse when half the screen is missing."; + mapConfOpts["00010000"] = confOpts; + confOpts.value = 0x00020000; + confOpts.desc = "Resolve Hack #3 - 00020000\nNeopets"; + mapConfOpts["00020000"] = confOpts; + confOpts.value = 0x00040000; + confOpts.desc = "Fast Update - 00040000\nOkami. Speeds some games."; + mapConfOpts["00040000"] = confOpts; + confOpts.value = 0x00080000; + confOpts.desc = "Disable alpha testing - 00080000"; + mapConfOpts["00080000"] = confOpts; + confOpts.value = 0x00100000; + confOpts.desc = "Disable Multiple RTs - 00100000"; + mapConfOpts["00100000"] = confOpts; + confOpts.value = 0x00200000; + confOpts.desc = "32 bit render targets - 00200000"; + mapConfOpts["00200000"] = confOpts; + + for(map::iterator it = mapConfOpts.begin(); it != mapConfOpts.end(); ++it) { + gtk_list_store_append(treestore, &treeiter);//new row + itval = (conf.gamesettings&it->second.value)?TRUE:FALSE; + snprintf(descbuf, 254, "%s", it->second.desc); + gtk_list_store_set(treestore, &treeiter, + 0, itval, + 1, descbuf, + -1); + } + + gtk_tree_view_set_model(GTK_TREE_VIEW(treeview), GTK_TREE_MODEL(treestore));//NB: store is cast as tree model. + g_object_unref(treestore);//allow model to be destroyed when the tree is destroyed. + + //don't select/highlight rows + gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)), GTK_SELECTION_NONE); + //------treeview done -------// +*/ + //Let's do it! + gtk_widget_show_all(Conf); + gtk_main(); +} + +void OnToggle_advopts(GtkCellRendererToggle *cell, gchar *path, gpointer user_data){ + GtkTreeIter treeiter; + gboolean val; + + gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(user_data), &treeiter, path); + gtk_tree_model_get(GTK_TREE_MODEL(user_data), &treeiter, + 0, &val, + -1); + val = !val; + gtk_list_store_set(GTK_LIST_STORE(user_data), &treeiter, + 0, val, + -1); + +} + + + +GtkWidget *About; + +void OnAbout_Ok(GtkButton *button, gpointer user_data) { + gtk_widget_destroy(About); + gtk_main_quit(); +} + +void CALLBACK GSabout() { + + //About = create_About(); + + //gtk_widget_show_all(About); + //gtk_main(); +} + +s32 CALLBACK GStest() { + return 0; +} + +GtkWidget *MsgDlg; + +void OnMsg_Ok() { + gtk_widget_destroy(MsgDlg); + gtk_main_quit(); +} + +void SysMessage(const char *fmt, ...) { + GtkWidget *Ok,*Txt; + GtkWidget *Box,*Box1; + va_list list; + char msg[512]; + + va_start(list, fmt); + vsprintf(msg, fmt, list); + va_end(list); + + if (msg[strlen(msg)-1] == '\n') msg[strlen(msg)-1] = 0; + + MsgDlg = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_position(GTK_WINDOW(MsgDlg), GTK_WIN_POS_CENTER); + gtk_window_set_title(GTK_WINDOW(MsgDlg), "GSsoft Msg"); + gtk_container_set_border_width(GTK_CONTAINER(MsgDlg), 5); + + Box = gtk_vbox_new(5, 0); + gtk_container_add(GTK_CONTAINER(MsgDlg), Box); + gtk_widget_show(Box); + + Txt = gtk_label_new(msg); + + gtk_box_pack_start(GTK_BOX(Box), Txt, FALSE, FALSE, 5); + gtk_widget_show(Txt); + + Box1 = gtk_hbutton_box_new(); + gtk_box_pack_start(GTK_BOX(Box), Box1, FALSE, FALSE, 0); + gtk_widget_show(Box1); + + Ok = gtk_button_new_with_label("Ok"); + gtk_signal_connect (GTK_OBJECT(Ok), "clicked", GTK_SIGNAL_FUNC(OnMsg_Ok), NULL); + gtk_container_add(GTK_CONTAINER(Box1), Ok); + GTK_WIDGET_SET_FLAGS(Ok, GTK_CAN_DEFAULT); + gtk_widget_show(Ok); + + gtk_widget_show(MsgDlg); + + gtk_main(); +} + +void *SysLoadLibrary(char *lib) { + return dlopen(lib, RTLD_NOW | RTLD_GLOBAL); +} + +void *SysLoadSym(void *lib, char *sym) { + void *ret = dlsym(lib, sym); + if (ret == NULL) printf("null: %s\n", sym); + return dlsym(lib, sym); +} + +char *SysLibError() { + return dlerror(); +} + +void SysCloseLibrary(void *lib) { + dlclose(lib); +} diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Linux/Linux.h b/Source/Plugins/Plugin_VideoOGL/Src/Linux/Linux.h new file mode 100644 index 0000000000..baf4053d95 --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/Linux/Linux.h @@ -0,0 +1,23 @@ +/* + * Copyright (C) 2002-2004 GSsoft Team + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __LINUX_H__ +#define __LINUX_H__ +#endif + +void OnToggle_advopts(GtkCellRendererToggle *cell, gchar *path, gpointer user_data); diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Linux/gcogl.glade b/Source/Plugins/Plugin_VideoOGL/Src/Linux/gcogl.glade new file mode 100644 index 0000000000..3718afcca9 --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/Linux/gcogl.glade @@ -0,0 +1,674 @@ + + + + + + + 5 + True + ZeroOGS Configuration + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_NONE + False + True + False + True + False + False + GDK_WINDOW_TYPE_HINT_NORMAL + GDK_GRAVITY_NORTH_WEST + True + False + + + + True + False + 0 + + + + True + True + Interlace Enable (toggle with F5) + there are 2 modes + interlace off + True + GTK_RELIEF_NORMAL + True + False + False + True + + + 0 + False + False + + + + + + True + True + Bilinear Filtering (Shift+F5) + Best quality is on, turn off for speed + True + GTK_RELIEF_NORMAL + True + False + False + True + + + 0 + False + False + + + + + + True + 0 + 0.5 + GTK_SHADOW_ETCHED_IN + + + + True + 0.5 + 0.5 + 1 + 1 + 0 + 0 + 12 + 0 + + + + True + True + 0 + + + + True + True + None + True + GTK_RELIEF_NORMAL + True + True + False + True + + + 0 + False + False + + + + + + True + True + 2X + True + GTK_RELIEF_NORMAL + True + False + False + True + radioAANone + + + 0 + False + False + + + + + + True + True + 4X + True + GTK_RELIEF_NORMAL + True + False + False + True + radioAANone + + + 0 + False + False + + + + + + + + + + True + <b>Anti-aliasing for higher quality (F6)</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + label_item + + + + + 0 + True + True + + + + + + True + True + Wireframe rendering (Shift+F6) + True + GTK_RELIEF_NORMAL + True + False + False + True + + + 0 + False + False + + + + + + True + True + Capture Avi (zerogs.avi)(F7) + True + GTK_RELIEF_NORMAL + True + False + False + True + + + 0 + False + False + + + + + + True + True + Save Snapshots as TGAs (default is JPG) + True + GTK_RELIEF_NORMAL + True + False + False + True + + + 0 + False + False + + + + + + True + True + Fullscreen (Alt+Enter) + to get out press Alt+Enter again (or ESC) + True + GTK_RELIEF_NORMAL + True + False + False + True + + + 0 + False + False + + + + + + True + 0 + 0.5 + GTK_SHADOW_ETCHED_IN + + + + True + 0.5 + 0.5 + 1 + 1 + 0 + 0 + 12 + 0 + + + + True + True + 0 + + + + True + True + 640x480 + True + GTK_RELIEF_NORMAL + True + False + False + True + + + 0 + False + False + + + + + + True + True + 800x600 + True + GTK_RELIEF_NORMAL + True + True + False + True + radioSize640 + + + 0 + False + False + + + + + + True + True + 1024x768 + True + GTK_RELIEF_NORMAL + True + False + False + True + radioSize640 + + + 0 + False + False + + + + + + True + True + 1280x960 + True + GTK_RELIEF_NORMAL + True + False + False + True + radioSize640 + + + 0 + False + False + + + + + + + + + + True + <b>Default Window Size (no speed impact)</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + label_item + + + + + 0 + True + True + + + + + + True + 0 + 0.5 + GTK_SHADOW_ETCHED_IN + + + + True + 0.5 + 0.5 + 1 + 1 + 0 + 0 + 12 + 0 + + + + True + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_ALWAYS + GTK_SHADOW_IN + GTK_CORNER_TOP_LEFT + + + + True + True + True + False + False + True + False + False + False + + + + + + + + + + True + <b>Advanced Options</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + label_item + + + + + 0 + True + True + + + + + + True + Show Frames Per Second (Shift+F7) + (value is the average over 4-16 PS2 frames) + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + GTK_BUTTONBOX_SPREAD + 30 + + + + True + True + True + Ok + True + GTK_RELIEF_NORMAL + True + + + + + + + True + True + True + Cancel + True + GTK_RELIEF_NORMAL + True + + + + + + 0 + True + True + + + + + + + + 5 + True + ZeroGS KOSMOS About + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_NONE + False + True + False + True + False + False + GDK_WINDOW_TYPE_HINT_NORMAL + GDK_GRAVITY_NORTH_WEST + True + False + + + + 5 + True + False + 5 + + + + True + OpenGL version + False + False + GTK_JUSTIFY_CENTER + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + Author: zerofrog(@gmail.com) + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + Many thanks to the Pcsx2 testing team + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + GTK_BUTTONBOX_DEFAULT_STYLE + 30 + + + + True + True + True + Ok + True + GTK_RELIEF_NORMAL + True + + + + + + 0 + True + True + + + + + + + diff --git a/Source/Plugins/Plugin_VideoOGL/Src/OpcodeDecoding.cpp b/Source/Plugins/Plugin_VideoOGL/Src/OpcodeDecoding.cpp new file mode 100644 index 0000000000..e281f4a7f1 --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/OpcodeDecoding.cpp @@ -0,0 +1,280 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +//DL facts: +// Ikaruga uses NO display lists! +// Zelda WW uses TONS of display lists +// Zelda TP uses almost 100% display lists except menus (we like this!) + +// Note that it IS NOT POSSIBLE to precompile display lists! You can compile them as they are +// and hope that the vertex format doesn't change, though, if you do it just when they are +// called. The reason is that the vertex format affects the sizes of the vertices. + +#include "Globals.h" +#include "OpcodeDecoding.h" +#include "VertexLoader.h" +#include "VertexShader.h" +#include "TextureMngr.h" + +#include "BPStructs.h" +#include "DataReader.h" + +#define CMDBUFFER_SIZE 1024*1024 +void Decode(); + +extern u8 FAKE_PeekFifo8(u32 _uOffset); +extern u16 FAKE_PeekFifo16(u32 _uOffset); +extern u32 FAKE_PeekFifo32(u32 _uOffset); +extern int FAKE_GetFifoSize(); + +CDataReader_Fifo g_fifoReader; + +void ExecuteDisplayList(u32 address, u32 size) +{ + IDataReader* pOldReader = g_pDataReader; + + //address &= 0x01FFFFFF; // phys address + CDataReader_Memory memoryReader(address); + g_pDataReader = &memoryReader; + + while((memoryReader.GetReadAddress() - address) < size) + { + Decode(); + } + INCSTAT(stats.numDListsAlive); + // reset to the old reader + g_pDataReader = pOldReader; +} + +inline u8 PeekFifo8(u32 _uOffset) +{ + return FAKE_PeekFifo8(_uOffset); +} + +inline u16 PeekFifo16(u32 _uOffset) +{ + return FAKE_PeekFifo16(_uOffset); +} + +inline u32 PeekFifo32(u32 _uOffset) +{ + return FAKE_PeekFifo32(_uOffset); +} + + +bool FifoCommandRunnable(void) +{ + u32 iBufferSize = FAKE_GetFifoSize(); + if (iBufferSize == 0) + return false; + + u8 Cmd = PeekFifo8(0); + u32 iCommandSize = 0; + + switch(Cmd) + { + case GX_NOP: + // Hm, this means that we scan over nop streams pretty slowly... + iCommandSize = 1; + break; + + case GX_LOAD_CP_REG: + iCommandSize = 6; + break; + + case GX_LOAD_INDX_A: + case GX_LOAD_INDX_B: + case GX_LOAD_INDX_C: + case GX_LOAD_INDX_D: + iCommandSize = 5; + break; + + case GX_CMD_CALL_DL: + iCommandSize = 9; + break; + + case 0x44: + iCommandSize = 1; + // zelda 4 swords calls it and checks the metrics registers after that + break; + + case GX_CMD_INVL_VC: // invalid vertex cache - no parameter? + iCommandSize = 1; + break; + + case GX_LOAD_BP_REG: + iCommandSize = 5; + break; + + case GX_LOAD_XF_REG: + { + // check if we can read the header + if (iBufferSize >= 5) { + iCommandSize = 1 + 4; + u32 Cmd2 = PeekFifo32(1); + int dwTransferSize = ((Cmd2>>16)&15) + 1; + iCommandSize += dwTransferSize * 4; + } + else { + return false; + } + } + break; + + default: + if (Cmd&0x80) + { + // check if we can read the header + if (iBufferSize >= 3) { + iCommandSize = 1 + 2; + u16 numVertices = PeekFifo16(1); + VertexLoader& vtxLoader = g_VertexLoaders[Cmd & GX_VAT_MASK]; + iCommandSize += numVertices * vtxLoader.ComputeVertexSize(); + } + else { + return false; + } + } + else { + char szTemp[512]; + sprintf(szTemp, "Error: Unknown Opcode (0x%x)", Cmd); + SysMessage(szTemp); + g_VideoInitialize.pLog(szTemp, TRUE); + } + break; + } + + if (iCommandSize > iBufferSize) + return false; + + INFO_LOG("OP detected: Cmd 0x%x size %i buffer %i",Cmd, iCommandSize, iBufferSize); + + return true; +} + +void Decode(void) +{ + int Cmd = g_pDataReader->Read8(); + switch(Cmd) + { + case GX_NOP: + break; + + case GX_LOAD_CP_REG: //0x08 + { + u32 SubCmd = g_pDataReader->Read8(); + u32 Value = g_pDataReader->Read32(); + VertexManager::LoadCPReg(SubCmd,Value); + } + break; + + case GX_LOAD_XF_REG: + { + u32 Cmd2 = g_pDataReader->Read32(); + + int dwTransferSize = ((Cmd2>>16)&15) + 1; + DWORD dwAddress = Cmd2 & 0xFFFF; + static u32 pData[16]; + for (int i=0; iRead32(); + VertexShaderMngr::LoadXFReg(dwTransferSize,dwAddress,pData); + } + break; + + case GX_LOAD_INDX_A: //used for position matrices + VertexShaderMngr::LoadIndexedXF(g_pDataReader->Read32(),0xC); + break; + case GX_LOAD_INDX_B: //used for normal matrices + VertexShaderMngr::LoadIndexedXF(g_pDataReader->Read32(),0xD); + break; + case GX_LOAD_INDX_C: //used for postmatrices + VertexShaderMngr::LoadIndexedXF(g_pDataReader->Read32(),0xE); + break; + case GX_LOAD_INDX_D: //used for lights + VertexShaderMngr::LoadIndexedXF(g_pDataReader->Read32(),0xF); + break; + + case GX_CMD_CALL_DL: + { + u32 dwAddr = g_pDataReader->Read32(); + u32 dwCount = g_pDataReader->Read32(); + ExecuteDisplayList(dwAddr, dwCount); + } + break; + + case 0x44: + // zelda 4 swords calls it and checks the metrics registers after that + break; + + case GX_CMD_INVL_VC:// Invalidate (vertex cache?) + DebugLog("Invalidate (vertex cache?)"); + break; + + case GX_LOAD_BP_REG: //0x61 + { + u32 cmd = g_pDataReader->Read32(); + LoadBPReg(cmd); + } + break; + + // draw primitives + default: + if (Cmd&0x80) + { + // load vertices + u16 numVertices = g_pDataReader->Read16(); + if( numVertices > 0 ) { + g_VertexLoaders[Cmd & GX_VAT_MASK].RunVertices((Cmd & GX_PRIMITIVE_MASK) >> GX_PRIMITIVE_SHIFT, numVertices); + } + } + else + { + // char szTmp[256]; + //sprintf(szTmp, "Illegal command %02x (at %08x)",Cmd,g_pDataReader->GetPtr()); + //g_VideoInitialize.pLog(szTmp); + //MessageBox(0,szTmp,"GFX ERROR",0); + // _assert_msg_(0,szTmp,""); + break; + } + break; + } +} + +void OpcodeDecoder_Init() +{ + g_pDataReader = &g_fifoReader; +} + + +void OpcodeDecoder_Shutdown() +{ +} + +void OpcodeDecoder_Run() +{ + // just a small check + if (g_pDataReader != &g_fifoReader) { + SysMessage("very strange"); + } + + DVSTARTPROFILE(); + + while (FifoCommandRunnable()) + { + Decode(); + } +} diff --git a/Source/Plugins/Plugin_VideoOGL/Src/OpcodeDecoding.h b/Source/Plugins/Plugin_VideoOGL/Src/OpcodeDecoding.h new file mode 100644 index 0000000000..17be936dc9 --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/OpcodeDecoding.h @@ -0,0 +1,42 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef _OPCODE_DECODING_H +#define _OPCODE_DECODING_H + +#define GX_NOP 0x00 + +#define GX_LOAD_BP_REG 0x61 +#define GX_LOAD_CP_REG 0x08 +#define GX_LOAD_XF_REG 0x10 +#define GX_LOAD_INDX_A 0x20 +#define GX_LOAD_INDX_B 0x28 +#define GX_LOAD_INDX_C 0x30 +#define GX_LOAD_INDX_D 0x38 + +#define GX_CMD_CALL_DL 0x40 +#define GX_CMD_INVL_VC 0x48 + +#define GX_PRIMITIVE_MASK 0x78 +#define GX_PRIMITIVE_SHIFT 3 +#define GX_VAT_MASK 0x07 + +void OpcodeDecoder_Init(); +void OpcodeDecoder_Shutdown(); +void OpcodeDecoder_Run(); + +#endif diff --git a/Source/Plugins/Plugin_VideoOGL/Src/OpcodeReaders.cpp b/Source/Plugins/Plugin_VideoOGL/Src/OpcodeReaders.cpp new file mode 100644 index 0000000000..f15b0f33c3 --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/OpcodeReaders.cpp @@ -0,0 +1,215 @@ +#include "OpcodeReaders.h" + +_u8 *readerMemPtr; +_u8 *bufPtr; +FifoData *gFifoData; +_u32 gDListEnd, gDListPtr; + +namespace OpcodeReaders +{ + void SetBufPtr(_u8 *_bufptr) + { + bufPtr = _bufptr; + } + void SetFifoData(FifoData *_fdata) + { + gFifoData = _fdata; + } + void SetMemPtr(_u8 *_mptr) + { + readerMemPtr = _mptr; + } + + void SetDListReader(_u32 _ptr, _u32 _end) + { + gDListPtr = _ptr & 0x1FFFFFF; + gDListEnd = _end & 0x1FFFFFF; + } + void DListReaderSkip(int _skip) + { + gDListPtr+=_skip; + } + bool IsDListOKToRead() + { + return gDListPtrreadptr+1)^3; + if (addr==gFifoData->gpend) + addr=gFifoData->gpbegin; + return readerMemPtr[addr]; +} +// ________________________________________________________________________________________________ +// ReadFifo8 +// +_u8 ReadFifo8() +{ + while ( + (gFifoData->readenable == false) || + (gFifoData->readptr == gFifoData->writeptr) || + (gFifoData->bpenable && (gFifoData->readptr == gFifoData->breakpt)) + ) + { + //if (gFifoData->readptr == gFifoData->breakpt) + // MessageBox(0,"hello breakpoint",0,0); + SwitchToFiber(gFifoData->cpuFiber); + } + + _u8 val = readerMemPtr[(gFifoData->readptr++)^3]; + + if (gFifoData->readptr == gFifoData->gpend) + gFifoData->readptr = gFifoData->gpbegin; + + return val; +} + +// ________________________________________________________________________________________________ +// ReadFifo16 +// +_u16 ReadFifo16() +{ + //PowerPC byte ordering :( + _u8 val1 = ReadFifo8(); + _u8 val2 = ReadFifo8(); + return (val1<<8)|(val2); +} + +// ________________________________________________________________________________________________ +// ReadFifo32 +// +_u32 ReadFifo32() +{ + //PowerPC byte ordering :( + _u8 val1 = ReadFifo8(); + _u8 val2 = ReadFifo8(); + _u8 val3 = ReadFifo8(); + _u8 val4 = ReadFifo8(); + return (val1<<24)|(val2<<16)|(val3<<8)|(val4); +} + +_u32 GetPtrFifo() +{ + return gFifoData->readptr; +} + +_u8 PeekDList8() +{ + if (gDListPtr>8); +} + +// ________________________________________________________________________________________________ +// ReadFifo32 +// +_u32 ReadBuf32() +{ +// _u32 val = *(_u32*)bufPtr; + //__asm +// { +// mov ebx,bufPtr +// mov eax,[ebx] +// add ebx,4 +// mov bufPtr,ebx +// bswap eax +// } + _u32 high = ReadBuf16(); + return (high<<16) | ReadBuf16(); +// return swap32(val); +} + + +ReaderInterface fifoReader = +{ + ReadFifo8, + PeekFifo8, + ReadFifo16, + ReadFifo32, + GetPtrFifo +}; + + +ReaderInterface dlistReader = +{ + ReadDList8, + PeekDList8, + ReadDList16, + ReadDList32, + GetPtrDList +}; + +ReaderInterface bufReader = +{ + ReadBuf8, + PeekBuf8, + ReadBuf16, + ReadBuf32, + 0 +}; + +ReaderInterface *reader; diff --git a/Source/Plugins/Plugin_VideoOGL/Src/OpcodeReaders.h b/Source/Plugins/Plugin_VideoOGL/Src/OpcodeReaders.h new file mode 100644 index 0000000000..a253a40ce8 --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/OpcodeReaders.h @@ -0,0 +1,26 @@ +#pragma once +#include "../plugin_specs/video.h" +#include "structs.h" + +struct ReaderInterface +{ + _u8 (*Read8) (void); + _u8 (*Peek8) (void); //to combine primitive draws.. + _u16 (*Read16)(void); + _u32 (*Read32)(void); + _u32 (*GetPtr)(void); +}; + +extern ReaderInterface *reader; +extern ReaderInterface fifoReader,dlistReader,bufReader; + +namespace OpcodeReaders +{ + void SetDListReader(_u32 _ptr, _u32 _end); + void DListReaderSkip(int _skip); + void SetMemPtr(_u8 *_mptr); + void SetFifoData(FifoData *_fdata); + bool IsDListOKToRead(); + + void SetBufPtr(_u8 *_bufptr); +} diff --git a/Source/Plugins/Plugin_VideoOGL/Src/PixelShader.cpp b/Source/Plugins/Plugin_VideoOGL/Src/PixelShader.cpp new file mode 100644 index 0000000000..79f3860fab --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/PixelShader.cpp @@ -0,0 +1,1376 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "Globals.h" +#include +#include + +#include "VertexShader.h" +#include "PixelShader.h" + +#define I_COLORS "color" +#define I_KCOLORS "k" +#define I_ALPHA "alphaRef" +#define I_TEXDIMS "texdim" +#define I_ZBIAS "czbias" +#define I_INDTEXSCALE "cindscale" +#define I_INDTEXMTX "cindmtx" + +#define C_COLORS 0 +#define C_KCOLORS (C_COLORS+4) +#define C_ALPHA (C_KCOLORS+4) +#define C_TEXDIMS (C_ALPHA+1) +#define C_ZBIAS (C_TEXDIMS+8) +#define C_INDTEXSCALE (C_ZBIAS+2) +#define C_INDTEXMTX (C_INDTEXSCALE+2) +#define C_ENVCONST_END (C_INDTEXMTX+6) + +#define C_COLORMATRIX (C_INDTEXMTX+6) + + +void WriteStage(char *&p, int n); +void WrapNonPow2Tex(char* &p, const char* var, int texmap); +void WriteAlphaCompare(char *&p, int num, int comp); +bool WriteAlphaTest(char *&p); + +PixelShaderMngr::PSCache PixelShaderMngr::pshaders; +FRAGMENTSHADER* PixelShaderMngr::pShaderLast = NULL; +PixelShaderMngr::PIXELSHADERUID PixelShaderMngr::s_curuid; + +static int s_nMaxPixelInstructions; +static int s_nColorsChanged[2]; // 0 - regular colors, 1 - k colors +static int s_nTexDimsChanged[2], s_nIndTexMtxChanged = 0; //min, max +static bool s_bAlphaChanged, s_bZBiasChanged, s_bIndTexScaleChanged; +static float lastRGBAfull[2][4][4] = {0}; +static u32 lastAlpha = 0; +static u32 lastTexDims[8]={0}; +static u32 lastZBias = 0; + +// lower byte describes if a texture is nonpow2 or pow2 +// next byte describes whether the repeat wrap mode is enabled for the s channel +// next byte is for t channel +static u32 s_texturemask = 0; + +static int maptocoord[8]; // indexed by texture map, holds the texcoord associated with the map +static u32 maptocoord_mask=0; + +static GLuint s_ColorMatrixProgram=0; + +void PixelShaderMngr::Init() +{ + s_nColorsChanged[0] = s_nColorsChanged[1] = 0; + s_nTexDimsChanged[0] = s_nTexDimsChanged[1] = -1; + s_nIndTexMtxChanged = 15; + s_bAlphaChanged = s_bZBiasChanged = s_bIndTexScaleChanged = true; + GL_REPORT_ERRORD(); + for(int i = 0; i < 8; ++i) maptocoord[i] = -1; + maptocoord_mask = 0; + memset(lastRGBAfull, 0, sizeof(lastRGBAfull)); + + glGetProgramivARB(GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB, &s_nMaxPixelInstructions); + + int maxinst, maxattribs; + glGetProgramivARB(GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB, &maxinst); + glGetProgramivARB(GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB, &maxattribs); + ERROR_LOG("pixel max_alu=%d, max_inst=%d, max_attrib=%d\n", s_nMaxPixelInstructions, maxinst, maxattribs); + + char pmatrixprog[1024]; + sprintf(pmatrixprog, "!!ARBfp1.0" + "TEMP R0;\n" + "TEMP R1;\n" + "TEX R0, fragment.texcoord[0], texture[0], RECT;\n" + "DP4 R1.w, R0, program.env[%d];\n" + "DP4 R1.z, R0, program.env[%d];\n" + "DP4 R1.x, R0, program.env[%d];\n" + "DP4 R1.y, R0, program.env[%d];\n" + "ADD result.color, R1, program.env[%d];\n" + "END\n", C_COLORMATRIX+3, C_COLORMATRIX+2, C_COLORMATRIX, C_COLORMATRIX+1, C_COLORMATRIX+4); + glGenProgramsARB( 1, &s_ColorMatrixProgram ); + glBindProgramARB( GL_FRAGMENT_PROGRAM_ARB, s_ColorMatrixProgram ); + + glProgramStringARB( GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, (GLsizei)strlen(pmatrixprog), pmatrixprog); + + GLenum err=GL_NO_ERROR; + GL_REPORT_ERROR(); + if( err != GL_NO_ERROR ) { + ERROR_LOG("Failed to create color matrix fragment program\n"); + + SAFE_RELEASE_PROG(s_ColorMatrixProgram); + } +} + +void PixelShaderMngr::Shutdown() +{ + SAFE_RELEASE_PROG(s_ColorMatrixProgram); + PSCache::iterator iter = pshaders.begin(); + for (;iter!=pshaders.end();iter++) + iter->second.Destroy(); + pshaders.clear(); +} + +FRAGMENTSHADER* PixelShaderMngr::GetShader() +{ + DVSTARTPROFILE(); + PIXELSHADERUID uid; + GetPixelShaderId(uid); + + PSCache::iterator iter = pshaders.find(uid); + + if (iter != pshaders.end()) { + iter->second.frameCount=frameCount; + PSCacheEntry &entry = iter->second; + if (&entry.shader != pShaderLast) + { + pShaderLast = &entry.shader; + } + return pShaderLast; + } + + PSCacheEntry& newentry = pshaders[uid]; + + if (!GeneratePixelShader(newentry.shader)) { + ERROR_LOG("failed to create pixel shader\n"); + return NULL; + } + + //Make an entry in the table + newentry.frameCount=frameCount; + + pShaderLast = &newentry.shader; + INCSTAT(stats.numPixelShadersCreated); + SETSTAT(stats.numPixelShadersAlive, pshaders.size()); + return pShaderLast; +} + +void PixelShaderMngr::Cleanup() +{ + PSCache::iterator iter = pshaders.begin(); + while(iter != pshaders.end()) { + PSCacheEntry &entry = iter->second; + if (entry.frameCount= 0 ) { + float fdims[4]; + for(int i = s_nTexDimsChanged[0]; i <= s_nTexDimsChanged[1]; ++i) { + if( s_texturemask & (1<= 0 ) { + TCoordInfo& tc = bpmem.texcoords[maptocoord[i]]; + fdims[0] = (float)(lastTexDims[i]&0xffff); + fdims[1] = (float)((lastTexDims[i]>>16)&0xfff); + fdims[2] = (float)(tc.s.scale_minus_1+1)/(float)(lastTexDims[i]&0xffff); + fdims[3] = (float)(tc.t.scale_minus_1+1)/(float)((lastTexDims[i]>>16)&0xfff); + } + else { + fdims[0] = (float)(lastTexDims[i]&0xffff); + fdims[1] = (float)((lastTexDims[i]>>16)&0xfff); + fdims[2] = 1.0f; + fdims[3] = 1.0f; + } + } + else { + if( maptocoord[i] >= 0 ) { + TCoordInfo& tc = bpmem.texcoords[maptocoord[i]]; + fdims[0] = (float)(tc.s.scale_minus_1+1)/(float)(lastTexDims[i]&0xffff); + fdims[1] = (float)(tc.t.scale_minus_1+1)/(float)((lastTexDims[i]>>16)&0xfff); + fdims[2] = 1.0f/(float)(tc.s.scale_minus_1+1); + fdims[3] = 1.0f/(float)(tc.t.scale_minus_1+1); + } + else { + fdims[0] = 1.0f; + fdims[1] = 1.0f; + fdims[2] = 1.0f/(float)(lastTexDims[i]&0xffff); + fdims[3] = 1.0f/(float)((lastTexDims[i]>>16)&0xfff); + } + } + + PRIM_LOG("texdims%d: %f %f %f %f\n", i, fdims[0], fdims[1], fdims[2], fdims[3]); + glProgramEnvParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, C_TEXDIMS+i, fdims); + } + s_nTexDimsChanged[0] = s_nTexDimsChanged[1] = -1; + } + + if( s_bAlphaChanged ) { + glProgramEnvParameter4fARB(GL_FRAGMENT_PROGRAM_ARB, C_ALPHA, (lastAlpha&0xff)/255.0f, ((lastAlpha>>8)&0xff)/255.0f, 0, ((lastAlpha>>16)&0xff)/255.0f); + } + + if( s_bZBiasChanged ) { + u32 bits; + float ffrac = 255.0f/256.0f; + float ftemp[4]; + switch(bpmem.ztex2.type) { + case 0: + bits = 8; + ftemp[0] = ffrac/(256.0f*256.0f); ftemp[1] = ffrac/256.0f; ftemp[2] = ffrac; ftemp[3] = 0; + break; + case 1: + bits = 16; + ftemp[0] = 0; ftemp[1] = ffrac/(256.0f*256.0f); ftemp[2] = ffrac/256.0f; ftemp[3] = ffrac; + break; + case 2: + bits = 24; + ftemp[0] = ffrac/(256.0f*256.0f); ftemp[1] = ffrac/256.0f; ftemp[2] = ffrac; ftemp[3] = 0; + break; + } + //ERROR_LOG("pixel=%x,%x, bias=%x\n", bpmem.zcontrol.pixel_format, bpmem.ztex2.type, lastZBias); + glProgramEnvParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, C_ZBIAS, ftemp); + glProgramEnvParameter4fARB(GL_FRAGMENT_PROGRAM_ARB, C_ZBIAS+1, 0, 0, 0, (float)( (((int)lastZBias<<8)>>8))/16777216.0f); + } + + // indirect incoming texture scales, update all! + if( s_bIndTexScaleChanged ) { + float f[8]; + + for(u32 i = 0; i < bpmem.genMode.numindstages; ++i) { + int srctexmap = bpmem.tevindref.getTexMap(i); + int texcoord = bpmem.tevindref.getTexCoord(i); + TCoordInfo& tc = bpmem.texcoords[texcoord]; + + f[2*i] = bpmem.texscale[i/2].getScaleS(i&1) * (float)(tc.s.scale_minus_1+1) / (float)(lastTexDims[srctexmap]&0xffff); + f[2*i+1] = bpmem.texscale[i/2].getScaleT(i&1) * (float)(tc.t.scale_minus_1+1) / (float)((lastTexDims[srctexmap]>>16)&0xfff); + + PRIM_LOG("tex indscale%d: %f %f\n", i, f[2*i], f[2*i+1]); + } + + glProgramEnvParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, C_INDTEXSCALE, f); + + if( bpmem.genMode.numindstages > 2 ) + glProgramEnvParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, C_INDTEXSCALE+1, &f[4]); + + s_bIndTexScaleChanged = false; + } + + if( s_nIndTexMtxChanged ) { + for(int i = 0; i < 3; ++i) { + if( s_nIndTexMtxChanged & (1<>16) ) { + lastAlpha = (lastAlpha&~0xff0000)|((alpha.hex&0xff)<<16); + s_bAlphaChanged = true; + } +} + +void PixelShaderMngr::SetTexDims(int texmapid, u32 width, u32 height, u32 wraps, u32 wrapt) +{ + u32 wh = width|(height<<16)|(wraps<<28)|(wrapt<<30); + if( lastTexDims[texmapid] != wh ) { + lastTexDims[texmapid] = wh; + if( s_nTexDimsChanged[0] == -1 ) { + s_nTexDimsChanged[0] = s_nTexDimsChanged[1] = texmapid; + } + else { + if( s_nTexDimsChanged[0] > texmapid ) s_nTexDimsChanged[0] = texmapid; + else if( s_nTexDimsChanged[1] < texmapid ) s_nTexDimsChanged[1] = texmapid; + } + } +} + +void PixelShaderMngr::SetZTetureBias(u32 bias) +{ + if( lastZBias != bias ) { + s_bZBiasChanged = true; + lastZBias = bias; + } +} + +void PixelShaderMngr::SetIndTexScaleChanged() +{ + s_bIndTexScaleChanged = true; +} + +void PixelShaderMngr::SetIndMatrixChanged(int matrixidx) +{ + s_nIndTexMtxChanged |= 1 << matrixidx; +} + +void PixelShaderMngr::SetGenModeChanged() +{ +} + +void PixelShaderMngr::SetTevCombinerChanged(int id) +{ +} + +void PixelShaderMngr::SetTevKSelChanged(int id) +{ +} + +void PixelShaderMngr::SetTevOrderChanged(int id) +{ +} + +void PixelShaderMngr::SetTevIndirectChanged(int id) +{ +} + +void PixelShaderMngr::SetZTetureOpChanged() +{ + s_bZBiasChanged = true; +} + +void PixelShaderMngr::SetTexturesUsed(u32 nonpow2tex) +{ + if( s_texturemask != nonpow2tex ) { + u32 mask = s_texturemask ^ nonpow2tex; + for(int i = 0; i < 8; ++i) { + if( mask & (0x10101< i ) s_nTexDimsChanged[0] = i; + else if( s_nTexDimsChanged[1] < i ) s_nTexDimsChanged[1] = i; + } + } + s_texturemask = nonpow2tex; + } +} + +void PixelShaderMngr::SetTexDimsChanged(int texmapid) +{ + if( s_nTexDimsChanged[0] > texmapid ) s_nTexDimsChanged[0] = texmapid; + else if( s_nTexDimsChanged[1] < texmapid ) s_nTexDimsChanged[1] = texmapid; + SetIndTexScaleChanged(); +} + +void PixelShaderMngr::SetColorMatrix(const float* pmatrix, const float* pfConstAdd) +{ + glProgramEnvParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, C_COLORMATRIX, pmatrix); + glProgramEnvParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, C_COLORMATRIX+1, pmatrix+4); + glProgramEnvParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, C_COLORMATRIX+2, pmatrix+8); + glProgramEnvParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, C_COLORMATRIX+3, pmatrix+12); + glProgramEnvParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, C_COLORMATRIX+4, pfConstAdd); +} + +GLuint PixelShaderMngr::GetColorMatrixProgram() +{ + return s_ColorMatrixProgram; +} + +// old tev->pixelshader notes +// +// color for this stage (alpha, color) is given by bpmem.tevorders[0].colorchan0 +// konstant for this stage (alpha, color) is given by bpmem.tevksel +// inputs are given by bpmem.combiners[0].colorC.a/b/c/d << could be current chan color +// according to GXTevColorArg table above +// output is given by .outreg +// tevtemp is set according to swapmodetables and +const float epsilon = 1.0f/255.0f; + +const char *tevKSelTableC[] = // KCSEL +{ + "1.0f,1.0f,1.0f", //1 = 0x00 + "0.875,0.875,0.875",//7_8 = 0x01 + "0.75,0.75,0.75", //3_4 = 0x02 + "0.625,0.625,0.625",//5_8 = 0x03 + "0.5,0.5,0.5", //1_2 = 0x04 + "0.375,0.375,0.375",//3_8 = 0x05 + "0.25,0.25,0.25", //1_4 = 0x06 + "0.125,0.125,0.125",//1_8 = 0x07 + "ERROR", //0x08 + "ERROR", //0x09 + "ERROR", //0x0a + "ERROR", //0x0b + I_KCOLORS"[0].rgb",//K0 = 0x0C + I_KCOLORS"[1].rgb",//K1 = 0x0D + I_KCOLORS"[2].rgb",//K2 = 0x0E + I_KCOLORS"[3].rgb",//K3 = 0x0F + I_KCOLORS"[0].rrr",//K0_R = 0x10 + I_KCOLORS"[1].rrr",//K1_R = 0x11 + I_KCOLORS"[2].rrr",//K2_R = 0x12 + I_KCOLORS"[3].rrr",//K3_R = 0x13 + I_KCOLORS"[0].ggg",//K0_G = 0x14 + I_KCOLORS"[1].ggg",//K1_G = 0x15 + I_KCOLORS"[2].ggg",//K2_G = 0x16 + I_KCOLORS"[3].ggg",//K3_G = 0x17 + I_KCOLORS"[0].bbb",//K0_B = 0x18 + I_KCOLORS"[1].bbb",//K1_B = 0x19 + I_KCOLORS"[2].bbb",//K2_B = 0x1A + I_KCOLORS"[3].bbb",//K3_B = 0x1B + I_KCOLORS"[0].aaa",//K0_A = 0x1C + I_KCOLORS"[1].aaa",//K1_A = 0x1D + I_KCOLORS"[2].aaa",//K2_A = 0x1E + I_KCOLORS"[3].aaa",//K3_A = 0x1F +}; + +const char *tevKSelTableA[] = // KASEL +{ + "1.0f", //1 = 0x00 + "0.875f",//7_8 = 0x01 + "0.75f", //3_4 = 0x02 + "0.625f",//5_8 = 0x03 + "0.5f", //1_2 = 0x04 + "0.375f",//3_8 = 0x05 + "0.25f", //1_4 = 0x06 + "0.125f",//1_8 = 0x07 + "ERROR", //0x08 + "ERROR", //0x09 + "ERROR", //0x0a + "ERROR", //0x0b + "ERROR", //0x0c + "ERROR", //0x0d + "ERROR", //0x0e + "ERROR", //0x0f + I_KCOLORS"[0].r",//K0_R = 0x10 + I_KCOLORS"[1].r",//K1_R = 0x11 + I_KCOLORS"[2].r",//K2_R = 0x12 + I_KCOLORS"[3].r",//K3_R = 0x13 + I_KCOLORS"[0].g",//K0_G = 0x14 + I_KCOLORS"[1].g",//K1_G = 0x15 + I_KCOLORS"[2].g",//K2_G = 0x16 + I_KCOLORS"[3].g",//K3_G = 0x17 + I_KCOLORS"[0].b",//K0_B = 0x18 + I_KCOLORS"[1].b",//K1_B = 0x19 + I_KCOLORS"[2].b",//K2_B = 0x1A + I_KCOLORS"[3].b",//K3_B = 0x1B + I_KCOLORS"[0].a",//K0_A = 0x1C + I_KCOLORS"[1].a",//K1_A = 0x1D + I_KCOLORS"[2].a",//K2_A = 0x1E + I_KCOLORS"[3].a",//K3_A = 0x1F +}; + +const char *tevScaleTable[] = // CS +{ + "1.0f", //SCALE_1 + "2.0f", //SCALE_2 + "4.0f", //SCALE_4 + "0.5f",//DIVIDE_2 +}; + +const char *tevBiasTable[] = // TB +{ + "", //ZERO, + "+0.5f", //ADDHALF, + "-0.5f", //SUBHALF, + "", +}; + +const char *tevOpTable[] = { // TEV + "+", //TEVOP_ADD = 0, + "-", //TEVOP_SUB = 1, +}; + +const char *tevCompOpTable[] = { ">", "==" }; + +#define TEVCMP_R8 0 +#define TEVCMP_GR16 1 +#define TEVCMP_BGR24 2 +#define TEVCMP_RGB8 3 + +const char *tevCInputTable[] = // CC +{ + "prev.rgb", //CPREV, + "prev.aaa", //APREV, + "c0.rgb", //C0, + "c0.aaa", //A0, + "c1.rgb", //C1, + "c1.aaa", //A1, + "c2.rgb", //C2, + "c2.aaa", //A2, + "textemp.rgb", //TEXC, + "textemp.aaa", //TEXA, + "rastemp.rgb", //RASC, + "rastemp.aaa", //RASA, + "float3(1.0f,1.0f,1.0f)", //ONE, + "float3(.5f,.5f,.5f)", //HALF, + "konsttemp.rgb", //KONST, + "float3(0.0f,0.0f,0.0f)", //ZERO + "PADERROR", "PADERROR", "PADERROR", "PADERROR", + "PADERROR", "PADERROR", "PADERROR", "PADERROR", + "PADERROR", "PADERROR", "PADERROR", "PADERROR", + "PADERROR", "PADERROR", "PADERROR", "PADERROR", + "PADERROR", "PADERROR", "PADERROR", "PADERROR", +}; +const char *tevCInputTable2[] = // CC +{ + "prev", //CPREV, + "(prev.aaa)", //APREV, + "c0", //C0, + "(c0.aaa)", //A0, + "c1", //C1, + "(c1.aaa)", //A1, + "c2", //C2, + "(c2.aaa)", //A2, + "textemp", //TEXC, + "(textemp.aaa)", //TEXA, + "rastemp", //RASC, + "(rastemp.aaa)", //RASA, + "float3(1.0f,1.0f,1.0f)", //ONE, + "float3(.5f,.5f,.5f)", //HALF, + "konsttemp", //"konsttemp.rgb", //KONST, + "float3(0.0f,0.0f,0.0f)", //ZERO + "PADERROR", "PADERROR", "PADERROR", "PADERROR", + "PADERROR", "PADERROR", "PADERROR", "PADERROR", + "PADERROR", "PADERROR", "PADERROR", "PADERROR", + "PADERROR", "PADERROR", "PADERROR", "PADERROR", + "PADERROR", "PADERROR", "PADERROR", "PADERROR", +}; + +const char *tevAInputTable[] = // CA +{ + "prev.a", //APREV, + "c0.a", //A0, + "c1.a", //A1, + "c2.a", //A2, + "textemp.a", //TEXA, + "rastemp.a", //RASA, + "konsttemp.a", //KONST + "0.0", //ZERO + "PADERROR", "PADERROR", "PADERROR", "PADERROR", + "PADERROR", "PADERROR", "PADERROR", "PADERROR", + "PADERROR", "PADERROR", "PADERROR", "PADERROR", + "PADERROR", "PADERROR", "PADERROR", +}; + +const char *tevAInputTable2[] = // CA +{ + "prev", //APREV, + "c0", //A0, + "c1", //A1, + "c2", //A2, + "textemp", //TEXA, + "rastemp", //RASA, + "konsttemp", //KONST, (hw1 had quarter) + "float4(0,0,0,0)", //ZERO + "PADERROR", "PADERROR", "PADERROR", "PADERROR", + "PADERROR", "PADERROR", "PADERROR", "PADERROR", + "PADERROR", "PADERROR", "PADERROR", "PADERROR", + "PADERROR", "PADERROR", "PADERROR", +}; + +const char *tevRasTable[] = +{ + "colors[0]", + "colors[1]", + "ERROR", //2 + "ERROR", //3 + "ERROR", //4 + "alphabump", // use bump alpha + "(alphabump*(255.0f/248.0f))", //normalized + "float4(0,0,0,0)", // zero +}; + +const char* tevTexFunc[] = { "tex2D", "texRECT" }; + +const char *tevCOutputTable[] = { "prev.rgb", "c0.rgb", "c1.rgb", "c2.rgb" }; +const char *tevAOutputTable[] = { "prev.a", "c0.a", "c1.a", "c2.a" }; +const char* tevIndAlphaSel[] = {"", "x", "y", "z"}; +const char* tevIndAlphaScale[] = {"", "*32","*16","*8"}; +const char* tevIndBiasField[] = {"", "x", "y", "xy", "z", "xz", "yz", "xyz"}; // indexed by bias +const char* tevIndBiasAdd[] = {"-128.0f", "1.0f", "1.0f", "1.0f" }; // indexecd by fmt +const char* tevIndWrapStart[] = {"0", "256", "128", "64", "32", "16", "0.001" }; +const char* tevIndFmtScale[] = {"255.0f", "31.0f", "15.0f", "8.0f" }; + +void PixelShaderMngr::GetPixelShaderId(PixelShaderMngr::PIXELSHADERUID& uid) +{ + u32 projtexcoords = 0; + for (u32 i = 0; i < bpmem.genMode.numtevstages+1; i++) { + if( bpmem.tevorders[i/2].getEnable(i&1) ) { + int texcoord = bpmem.tevorders[i/2].getTexCoord(i&1); + if( xfregs.texcoords[texcoord].texmtxinfo.projection ) + projtexcoords |= 1<>16)&0xff)<<12)|(projtexcoords<<20)|((u32)bpmem.ztex2.op<<28) + |(zbufrender<<30)|(zBufRenderToCol0<<31); + + s_curuid.values[0] = (s_curuid.values[0]&~0x0ff00000)|(projtexcoords<<20); + + // swap table + for(int i = 0; i < 8; i += 2) + ((u8*)&uid.values[1])[i/2] = (bpmem.tevksel[i].hex&0xf)|((bpmem.tevksel[i+1].hex&0xf)<<4); + + uid.values[2] = s_texturemask; + int hdr = 3; + + u32* pcurvalue = &uid.values[hdr]; + for(u32 i = 0; i < bpmem.genMode.numtevstages+1; ++i) { + TevStageCombiner::ColorCombiner &cc = bpmem.combiners[i].colorC; + TevStageCombiner::AlphaCombiner &ac = bpmem.combiners[i].alphaC; + + u32 val0 = cc.hex&0xffffff; + u32 val1 = ac.hex&0xffffff; + val0 |= bpmem.tevksel[i/2].getKC(i&1)<<24; + val1 |= bpmem.tevksel[i/2].getKA(i&1)<<24; + + pcurvalue[0] = val0; + pcurvalue[1] = val1; + pcurvalue+=2; + } + + for(u32 i = 0; i < (bpmem.genMode.numtevstages+1)/2; ++i) { + u32 val0, val1; + if( bpmem.tevorders[i].hex&0x40 ) val0 = bpmem.tevorders[i].hex&0x3ff; + else val0 = bpmem.tevorders[i].hex&0x380; + if( bpmem.tevorders[i].hex&0x40000 ) val1 = (bpmem.tevorders[i].hex&0x3ff000)>>12; + else val1 = (bpmem.tevorders[i].hex&0x380000)>>12; + + switch(i % 3) { + case 0: pcurvalue[0] = val0|(val1<<10); break; + case 1: pcurvalue[0] |= val0<<20; pcurvalue[1] = val1; pcurvalue++; break; + case 2: pcurvalue[1] |= (val0<<10)|(val1<<20); pcurvalue++; break; + } + } + + if( (bpmem.genMode.numtevstages+1)&1 ) { // odd + u32 val0; + if( bpmem.tevorders[bpmem.genMode.numtevstages/2].hex&0x40 ) val0 = bpmem.tevorders[bpmem.genMode.numtevstages/2].hex&0x3ff; + else val0 = bpmem.tevorders[bpmem.genMode.numtevstages/2].hex&0x380; + + switch(bpmem.genMode.numtevstages % 3) { + case 0: pcurvalue[0] = val0; break; + case 1: pcurvalue[0] |= val0<<20; break; + case 2: pcurvalue[1] |= (val0<<10); pcurvalue++; break; + } + } + + if( (bpmem.genMode.numtevstages % 3) != 2 ) + ++pcurvalue; + + uid.tevstages = (u32)(pcurvalue-&uid.values[0]-hdr); + + for(u32 i = 0; i < bpmem.genMode.numindstages; ++i) { + u32 val = bpmem.tevind[i].hex&0x1fffff; // 21 bits + switch(i%3) { + case 0: pcurvalue[0] = val; break; + case 1: pcurvalue[0] |= val<<21; pcurvalue[1] = val>>11; ++pcurvalue; break; + case 2: pcurvalue[0] |= val<<10; ++pcurvalue; break; + } + } + + uid.indstages = (u32)(pcurvalue-&uid.values[0]-2-uid.tevstages); +} + +#define WRITE p+=sprintf + +const char *swapColors = "rgba"; +char swapModeTable[4][5]; + +void BuildSwapModeTable() +{ + //bpmem.tevregs[0]. + for (int i=0; i<4; i++) + { + swapModeTable[i][0]=swapColors[bpmem.tevksel[i*2].swap1]; + swapModeTable[i][1]=swapColors[bpmem.tevksel[i*2].swap2]; + swapModeTable[i][2]=swapColors[bpmem.tevksel[i*2+1].swap1]; + swapModeTable[i][3]=swapColors[bpmem.tevksel[i*2+1].swap2]; + swapModeTable[i][4]=0; + } +} + +static char text[16384]; +bool PixelShaderMngr::GeneratePixelShader(FRAGMENTSHADER& ps) +{ + DVSTARTPROFILE(); + + BuildSwapModeTable(); + int numStages = bpmem.genMode.numtevstages + 1; + int numTexgen = bpmem.genMode.numtexgens; + + char *p = text; + WRITE(p,"//Pixel Shader for TEV stages\n"); + WRITE(p,"//%i TEV stages, %i texgens, %i IND stages\n", + numStages,numTexgen,bpmem.genMode.numindstages); + + bool bRenderZ = Renderer::GetZBufferTarget() != 0 && bpmem.zmode.updateenable; + bool bOutputZ = bpmem.ztex2.op != ZTEXTURE_DISABLE; + bool bInputZ = bpmem.ztex2.op==ZTEXTURE_ADD || bRenderZ; + + bool bRenderZToCol0 = Renderer::GetRenderMode()!=Renderer::RM_Normal; // output z and alpha to color0 + assert( !bRenderZToCol0 || bRenderZ ); + + int ztexcoord = -1; + if( bInputZ ) + ztexcoord = numTexgen == 0 ? 0 : numTexgen-1; + + int nIndirectStagesUsed = 0; + if( bpmem.genMode.numindstages > 0 ) { + for(int i = 0; i < numStages; ++i) { + if( bpmem.tevind[i].IsActive() && bpmem.tevind[i].bt < bpmem.genMode.numindstages ) { + nIndirectStagesUsed |= 1< %s.%s) ? %s : float3(0.0f,0.0f,0.0f));\n", + tevCInputTable[cc.d],tevCInputTable2[cc.a], cmp==TEVCMP_R8_GT?"r":"rgb", tevCInputTable2[cc.b], cmp==TEVCMP_R8_GT?"r":"rgb", tevCInputTable[cc.c]); + break; + case TEVCMP_R8_EQ: + case TEVCMP_RGB8_EQ: + WRITE(p," %s + (abs(%s.r - %s.r)<%f ? %s : float3(0.0f,0.0f,0.0f));\n", + tevCInputTable[cc.d],tevCInputTable2[cc.a], tevCInputTable2[cc.b],epsilon,tevCInputTable[cc.c]); + break; + + case TEVCMP_GR16_GT: // 16 bit compares: 255*g+r (probably used for ztextures, so make sure in ztextures, g is the most significant byte) + case TEVCMP_BGR24_GT: // 24 bit compares: 255*255*b+255*g+r + WRITE(p," %s + (( dot(%s.rgb-%s.rgb, comp%s) > 0) ? %s : float3(0.0f,0.0f,0.0f));\n", + tevCInputTable[cc.d],tevCInputTable2[cc.a], tevCInputTable2[cc.b], cmp==TEVCMP_GR16_GT?"16":"24", tevCInputTable[cc.c]); + break; + case TEVCMP_GR16_EQ: + case TEVCMP_BGR24_EQ: + WRITE(p," %s + (abs(dot(%s.rgb - %s.rgb, comp%s))<%f ? %s : float3(0.0f,0.0f,0.0f));\n", + tevCInputTable[cc.d],tevCInputTable2[cc.a], tevCInputTable2[cc.b],cmp==TEVCMP_GR16_GT?"16":"24",epsilon,tevCInputTable[cc.c]); + break; + default: + WRITE(p,"float3(0.0f,0.0f,0.0f);\n"); + break; + } + } + + if( cc.clamp ) + WRITE(p, "%s = clamp(%s,0.0f,1.0f);\n", tevCOutputTable[cc.dest],tevCOutputTable[cc.dest]); + + // combine the alpha channel + WRITE(p,"%s= ", tevAOutputTable[ac.dest]); + + if (ac.bias != 3) { // if not compare + //normal alpha combiner goes here + WRITE(p," %s*(%s%s",tevScaleTable[ac.shift],tevAInputTable[ac.d],tevOpTable[ac.op]); + WRITE(p,"lerp(%s,%s,%s) %s)\n", + tevAInputTable[ac.a],tevAInputTable[ac.b], + tevAInputTable[ac.c],tevBiasTable[ac.bias]); + } + else { + //compare alpha combiner goes here + int cmp = (ac.shift<<1)|ac.op|8; // comparemode stored here + switch(cmp) { + case TEVCMP_R8_GT: + case TEVCMP_A8_GT: + WRITE(p," %s + ((%s.%s > %s.%s) ? %s : 0)\n", + tevAInputTable[ac.d],tevAInputTable2[ac.a], cmp==TEVCMP_R8_GT?"r":"a", tevAInputTable2[ac.b], cmp==TEVCMP_R8_GT?"r":"a", tevAInputTable[ac.c]); + break; + case TEVCMP_R8_EQ: + case TEVCMP_A8_EQ: + WRITE(p," %s + (abs(%s.r - %s.r)<%f ? %s : 0)\n", + tevAInputTable[ac.d],tevAInputTable2[ac.a], tevAInputTable2[ac.b],epsilon,tevAInputTable[ac.c]); + break; + + case TEVCMP_GR16_GT: // 16 bit compares: 255*g+r (probably used for ztextures, so make sure in ztextures, g is the most significant byte) + case TEVCMP_BGR24_GT: // 24 bit compares: 255*255*b+255*g+r + WRITE(p," %s + (( dot(%s.rgb-%s.rgb, comp%s) > 0) ? %s : 0)\n", + tevAInputTable[ac.d],tevAInputTable2[ac.a], tevAInputTable2[ac.b], cmp==TEVCMP_GR16_GT?"16":"24", tevAInputTable[ac.c]); + break; + case TEVCMP_GR16_EQ: + case TEVCMP_BGR24_EQ: + WRITE(p," %s + (abs(dot(%s.rgb - %s.rgb, comp%s))<%f ? %s : 0)\n", + tevAInputTable[ac.d],tevAInputTable2[ac.a], tevAInputTable2[ac.b],cmp==TEVCMP_GR16_GT?"16":"24",epsilon,tevAInputTable[ac.c]); + break; + default: + WRITE(p,"0)\n"); + break; + } + } + + WRITE(p,";\n"); + + if( ac.clamp ) + WRITE(p, "%s = clamp(%s,0.0f,1.0f);\n", tevAOutputTable[ac.dest],tevAOutputTable[ac.dest]); + WRITE(p, "\n"); +} + +void WrapNonPow2Tex(char* &p, const char* var, int texmap) +{ + _assert_(s_texturemask & (1< %s)",alphaRef[num]); break; + case ALPHACMP_LESS: WRITE(p,"(prev.a >= %s+%f)",alphaRef[num],epsilon*0.5f);break; + case ALPHACMP_GEQUAL: WRITE(p,"(prev.a < %s)",alphaRef[num]); break; + case ALPHACMP_GREATER: WRITE(p,"(prev.a <= %s - %f)",alphaRef[num],epsilon*0.5f);break; + case ALPHACMP_EQUAL: WRITE(p,"(abs(prev.a-%s)>%f)",alphaRef[num],epsilon*2); break; + case ALPHACMP_NEQUAL: WRITE(p,"(abs(prev.a-%s)<%f)",alphaRef[num],epsilon*2); break; + } +} + +bool WriteAlphaTest(char *&p) +{ + u32 op = bpmem.alphaFunc.logic; + u32 comp[2] = {bpmem.alphaFunc.comp0,bpmem.alphaFunc.comp1}; + + //first kill all the simple cases + switch(op) { + case 0: // and + if (comp[0] == ALPHACMP_ALWAYS && comp[1] == ALPHACMP_ALWAYS) return true; + if (comp[0] == ALPHACMP_NEVER || comp[1] == ALPHACMP_NEVER) { + WRITE(p, "discard;\n"); + return false; + } + break; + case 1: // or + if (comp[0] == ALPHACMP_ALWAYS || comp[1] == ALPHACMP_ALWAYS) return true; + if (comp[0] == ALPHACMP_NEVER && comp[1] == ALPHACMP_NEVER) { + WRITE(p, "discard;\n"); + return false; + } + break; + case 2: // xor + if ( (comp[0] == ALPHACMP_ALWAYS && comp[1] == ALPHACMP_NEVER) || (comp[0] == ALPHACMP_NEVER && comp[1] == ALPHACMP_ALWAYS) ) return true; + if ( (comp[0] == ALPHACMP_ALWAYS && comp[1] == ALPHACMP_ALWAYS) || (comp[0] == ALPHACMP_NEVER && comp[1] == ALPHACMP_NEVER) ) { + WRITE(p, "discard;\n"); + return false; + } + break; + case 3: // xnor + if ( (comp[0] == ALPHACMP_ALWAYS && comp[1] == ALPHACMP_NEVER) || (comp[0] == ALPHACMP_NEVER && comp[1] == ALPHACMP_ALWAYS) ) { + WRITE(p, "discard;\n"); + return false; + } + if ( (comp[0] == ALPHACMP_ALWAYS && comp[1] == ALPHACMP_ALWAYS) || (comp[0] == ALPHACMP_NEVER && comp[1] == ALPHACMP_NEVER) ) + return true; + break; + } + + bool bFirst = false; + WRITE(p, "discard( "); + WriteAlphaCompare(p, 0, bpmem.alphaFunc.comp0); + + // negated because testing the inverse condition + switch(bpmem.alphaFunc.logic) { + case 0: WRITE(p, " || "); break; // and + case 1: WRITE(p, " && "); break; // or + case 2: WRITE(p, " == "); break; // xor + case 3: WRITE(p, " != "); break; // xnor + } + WriteAlphaCompare(p, 1, bpmem.alphaFunc.comp1); + WRITE(p, ");\n"); + return true; +} diff --git a/Source/Plugins/Plugin_VideoOGL/Src/PixelShader.h b/Source/Plugins/Plugin_VideoOGL/Src/PixelShader.h new file mode 100644 index 0000000000..247c8acbde --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/PixelShader.h @@ -0,0 +1,154 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef GCOGL_PIXELSHADER +#define GCOGL_PIXELSHADER + +#include "Render.h" +#include "BPStructs.h" + +struct FRAGMENTSHADER +{ + FRAGMENTSHADER() : glprogid(0) { } + GLuint glprogid; // opengl program id + +#ifdef _DEBUG + std::string strprog; +#endif +}; + +class PixelShaderMngr +{ + class PIXELSHADERUID + { + public: + PIXELSHADERUID() { values = new u32[3+32+6+11]; tevstages = indstages = 0; } + ~PIXELSHADERUID() { delete[] values; } + PIXELSHADERUID(const PIXELSHADERUID& r) + { + values = new u32[4+32+6+11]; + tevstages = r.tevstages; indstages = r.indstages; + int N = tevstages + indstages + 3; + _assert_(N <= 4+32+6+11); + for(int i = 0; i < N; ++i) + values[i] = r.values[i]; + } + + bool operator<(const PIXELSHADERUID& _Right) const + { + if( values[0] < _Right.values[0] ) + return true; + else if( values[0] > _Right.values[0] ) + return false; + + int N = tevstages + 3; // numTevStages*3/2+1 + int i = 1; + for(; i < N; ++i) { + if( values[i] < _Right.values[i] ) + return true; + else if( values[i] > _Right.values[i] ) + return false; + } + + N += indstages; + for(; i < N; ++i) { + if( values[i] < _Right.values[i] ) + return true; + else if( values[i] > _Right.values[i] ) + return false; + } + + return false; + } + + bool operator==(const PIXELSHADERUID& _Right) const + { + if( values[0] != _Right.values[0] ) + return false; + + int N = tevstages + 3; // numTevStages*3/2+1 + int i = 1; + for(; i < N; ++i) { + if( values[i] != _Right.values[i] ) + return false; + } + + N += indstages; + for(; i < N; ++i) { + if( values[i] != _Right.values[i] ) + return false; + } + + return true; + } + + u32* values; + u16 tevstages, indstages; + }; + + struct PSCacheEntry + { + FRAGMENTSHADER shader; + int frameCount; + PSCacheEntry() : frameCount(0) {} + ~PSCacheEntry() {} + void Destroy() { + glDeleteProgramsARB(1, &shader.glprogid); + } + }; + + typedef std::map PSCache; + + static FRAGMENTSHADER* pShaderLast; // last used shader + static PSCache pshaders; + + static bool GeneratePixelShader(FRAGMENTSHADER& ps); + static void GetPixelShaderId(PIXELSHADERUID&); + static PIXELSHADERUID s_curuid; // the current pixel shader uid (progressively changed as memory is written) + +public: + static void Init(); + static void Cleanup(); + static void Shutdown(); + static FRAGMENTSHADER* GetShader(); + static bool CompilePixelShader(FRAGMENTSHADER& ps, const char* pstrprogram); + + static void SetConstants(FRAGMENTSHADER& ps); // sets pixel shader constants + + // constant management, should be called after memory is committed + static void SetColorChanged(int type, int index); + static void SetAlpha(const AlphaFunc& alpha); + static void SetDestAlpha(const ConstantAlpha& alpha); + static void SetTexDims(int texmapid, u32 width, u32 height, u32 wraps, u32 wrapt); + static void SetZTetureBias(u32 bias); + static void SetIndTexScaleChanged(); + static void SetIndMatrixChanged(int matrixidx); + + static void SetGenModeChanged(); + static void SetTevCombinerChanged(int id); + static void SetTevKSelChanged(int id); + static void SetTevOrderChanged(int id); + static void SetTevIndirectChanged(int id); + static void SetZTetureOpChanged(); + static void SetTexturesUsed(u32 nonpow2tex); + static void SetTexDimsChanged(int texmapid); + + static void SetColorMatrix(const float* pmatrix, const float* pfConstAdd); + static GLuint GetColorMatrixProgram(); +}; + +#endif diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp b/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp new file mode 100644 index 0000000000..22a1035181 --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp @@ -0,0 +1,838 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "Globals.h" +#include + +#include "GLInit.h" +#include "Render.h" +#include "OpcodeDecoding.h" +#include "BPStructs.h" +#include "TextureMngr.h" +#include "rasterfont.h" +#include "VertexShader.h" +#include "PixelShader.h" +#include "VertexLoader.h" + + +#ifdef _WIN32 +#include "EmuWindow.h" +#else +#endif + +struct MESSAGE +{ + MESSAGE() {} + MESSAGE(const char* p, u32 dw) { strcpy(str, p); dwTimeStamp = dw; } + char str[255]; + u32 dwTimeStamp; +}; + +CGcontext g_cgcontext; +CGprofile g_cgvProf, g_cgfProf; + +static int g_MaxTexWidth = 0, g_MaxTexHeight = 0; +static RasterFont* s_pfont = NULL; +static std::list s_listMsgs; +static bool s_bFullscreen = false; +static bool s_bOutputCgErrors = true; +static int nZBufferRender = 0; // if > 0, then using zbuffer render +static u32 s_uFramebuffer = 0; +static u32 s_RenderTargets[1] = {0}, s_DepthTarget = 0, s_ZBufferTarget = 0; +static bool s_bATIDrawBuffers = false, s_bHaveStencilBuffer = false; +static Renderer::RenderMode s_RenderMode = Renderer::RM_Normal; +static int s_nCurTarget = 0; +bool g_bBlendLogicOp = false; + + +void HandleCgError(CGcontext ctx, CGerror err, void* appdata); + + +bool Renderer::Create2() +{ + bool bSuccess = true; + GLenum err = GL_NO_ERROR; + g_cgcontext = cgCreateContext(); + cgGetError(); + cgSetErrorHandler(HandleCgError, NULL); + + // fill the opengl extension map + const char* ptoken = (const char*)glGetString( GL_EXTENSIONS ); + if (ptoken == NULL) return false; + + __Log("Supported OpenGL Extensions:\n"); + __Log(ptoken); // write to the log file + __Log("\n"); + + if( strstr(ptoken, "GL_EXT_blend_logic_op") != NULL ) + g_bBlendLogicOp = true; + if( strstr(ptoken, "ATI_draw_buffers") != NULL ) + s_bATIDrawBuffers = true; + + s_bFullscreen = g_Config.bFullscreen; + + if (glewInit() != GLEW_OK) { + ERROR_LOG("glewInit() failed!\n"); + return false; + } + + if (!GLEW_EXT_framebuffer_object) { + ERROR_LOG("*********\nGPU: ERROR: Need GL_EXT_framebufer_object for multiple render targets\nGPU: *********\n"); + bSuccess = false; + } + + if (!GLEW_EXT_secondary_color) { + ERROR_LOG("*********\nGPU: OGL ERROR: Need GL_EXT_secondary_color\nGPU: *********\n"); + bSuccess = false; + } + + int numvertexattribs=0; + glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &numvertexattribs); + + if (numvertexattribs < 11) { + ERROR_LOG("*********\nGPU: OGL ERROR: Number of attributes %d not enough\nGPU: *********\n", numvertexattribs); + bSuccess = false; + } + + if (!bSuccess) + return false; + +#ifdef _WIN32 + if (WGLEW_EXT_swap_control) + wglSwapIntervalEXT(0); + else + ERROR_LOG("no support for SwapInterval (framerate clamped to monitor refresh rate)\n"); +#else + if (glXSwapIntervalSGI) + glXSwapIntervalSGI(0); + else + ERROR_LOG("no support for SwapInterval (framerate clamped to monitor refresh rate)\n"); +#endif + + // check the max texture width and height + glGetIntegerv(GL_MAX_TEXTURE_SIZE, &g_MaxTexWidth); + g_MaxTexHeight = g_MaxTexWidth; + + GL_REPORT_ERROR(); + if (err != GL_NO_ERROR) bSuccess = false; + + if (glDrawBuffers == NULL && !GLEW_ARB_draw_buffers) + glDrawBuffers = glDrawBuffersARB; + + glGenFramebuffersEXT( 1, &s_uFramebuffer); + if (s_uFramebuffer == 0) { + ERROR_LOG("failed to create the renderbuffer\n"); + } + + _assert_( glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) == GL_FRAMEBUFFER_COMPLETE_EXT ); + glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, s_uFramebuffer ); + + // create the framebuffer targets + glGenTextures(ARRAYSIZE(s_RenderTargets), s_RenderTargets); + for(int i = 0; i < ARRAYSIZE(s_RenderTargets); ++i) { + glBindTexture(GL_TEXTURE_RECTANGLE_NV, s_RenderTargets[i]); + // initialize to default + glTexImage2D(GL_TEXTURE_RECTANGLE_NV, 0, 4, s_nTargetWidth, s_nTargetHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); + glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + if( glGetError() != GL_NO_ERROR) { + glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_WRAP_S, GL_CLAMP); + glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_WRAP_T, GL_CLAMP); + GL_REPORT_ERROR(); + } + glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + } + s_nCurTarget = 0; + + GL_REPORT_ERROR(); + + int nMaxMRT = 0; + glGetIntegerv(GL_MAX_COLOR_ATTACHMENTS_EXT, &nMaxMRT); + + if( nMaxMRT > 1 ) { + // create zbuffer target + glGenTextures(1, &s_ZBufferTarget); + glBindTexture(GL_TEXTURE_RECTANGLE_NV, s_ZBufferTarget); + glTexImage2D(GL_TEXTURE_RECTANGLE_NV, 0, 4, s_nTargetWidth, s_nTargetHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); + + glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + if( glGetError() != GL_NO_ERROR) { + glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_WRAP_S, GL_CLAMP); + glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_WRAP_T, GL_CLAMP); + GL_REPORT_ERROR(); + } + glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + } + + // create the depth buffer + glGenRenderbuffersEXT( 1, &s_DepthTarget); + glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, s_DepthTarget); + glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH24_STENCIL8_EXT, s_nTargetWidth, s_nTargetHeight); + if( glGetError() != GL_NO_ERROR ) { + glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, s_nTargetWidth, s_nTargetHeight); + s_bHaveStencilBuffer = false; + } + else s_bHaveStencilBuffer = true; + + GL_REPORT_ERROR(); + + // set as render targets + glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_RECTANGLE_NV, s_RenderTargets[s_nCurTarget], 0 ); + glFramebufferRenderbufferEXT( GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, s_DepthTarget ); + GL_REPORT_ERROR(); + + if( s_ZBufferTarget != 0 ) { + // test to make sure it works + glFramebufferTexture2DEXT( GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_RECTANGLE_NV, s_ZBufferTarget, 0); + bool bFailed = glGetError() != GL_NO_ERROR || glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) != GL_FRAMEBUFFER_COMPLETE_EXT; + glFramebufferTexture2DEXT( GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_RECTANGLE_NV, 0, 0); + + if( bFailed ) { + glDeleteTextures(1, &s_ZBufferTarget); + s_ZBufferTarget = 0; + } + } + + if( s_ZBufferTarget == 0 ) + ERROR_LOG("disabling ztarget mrt feature (max mrt=%d)\n", nMaxMRT); + + //glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, s_DepthTarget ); + + glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT); + nZBufferRender = 0; + + GL_REPORT_ERROR(); + if (err != GL_NO_ERROR) bSuccess = false; + + s_pfont = new RasterFont(); + + SetAA(g_Config.aa); + GL_REPORT_ERROR(); + + // load the effect, find the best profiles (if any) + if (cgGLIsProfileSupported(CG_PROFILE_ARBVP1) != CG_TRUE) { + ERROR_LOG("arbvp1 not supported\n"); + return false; + } + if (cgGLIsProfileSupported(CG_PROFILE_ARBFP1) != CG_TRUE) { + ERROR_LOG("arbfp1 not supported\n"); + return false; + } + + g_cgvProf = cgGLGetLatestProfile(CG_GL_VERTEX); + g_cgfProf = cgGLGetLatestProfile(CG_GL_FRAGMENT);//CG_PROFILE_ARBFP1; + //cgGLSetOptimalOptions(g_cgvProf); + //cgGLSetOptimalOptions(g_cgfProf); + + //ERROR_LOG("max buffer sizes: %d %d\n", cgGetProgramBufferMaxSize(g_cgvProf), cgGetProgramBufferMaxSize(g_cgfProf)); + int nenvvertparams, nenvfragparams, naddrregisters[2]; + glGetProgramivARB(GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_ENV_PARAMETERS_ARB, &nenvvertparams); + glGetProgramivARB(GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_ENV_PARAMETERS_ARB, &nenvfragparams); + glGetProgramivARB(GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB, &naddrregisters[0]); + glGetProgramivARB(GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB, &naddrregisters[1]); + __Log("max program env parameters: vert=%d, frag=%d\n", nenvvertparams, nenvfragparams); + __Log("max program address register parameters: vert=%d, frag=%d\n", naddrregisters[0], naddrregisters[1]); + + if( nenvvertparams < 238 ) + ERROR_LOG("not enough vertex shader environment constants!!\n"); + +#ifndef _DEBUG + cgGLSetDebugMode(GL_FALSE); +#endif + + if( cgGetError() != CG_NO_ERROR ) { + ERROR_LOG("cg error\n"); + return false; + } + + //glEnable(GL_POLYGON_OFFSET_FILL); + //glEnable(GL_POLYGON_OFFSET_LINE); + //glPolygonOffset(0, 1); + + if (!Initialize()) + return false; + + return glGetError() == GL_NO_ERROR && bSuccess; +} + +void Renderer::Shutdown(void) +{ + SAFE_DELETE(s_pfont); + + if( g_cgcontext != 0 ) { + cgDestroyContext(g_cgcontext); + g_cgcontext = 0; + } + + if( s_RenderTargets[0] ) { + glDeleteTextures(ARRAYSIZE(s_RenderTargets), s_RenderTargets); + memset(s_RenderTargets, 0, sizeof(s_RenderTargets)); + } + if( s_DepthTarget ) { + glDeleteRenderbuffersEXT(1, &s_DepthTarget); s_DepthTarget = 0; + } + + if (s_uFramebuffer != 0) { + glDeleteFramebuffersEXT( 1, &s_uFramebuffer); + s_uFramebuffer = 0; + } +} + + +bool Renderer::Initialize() +{ + glStencilFunc(GL_ALWAYS, 0, 0); + glBlendFunc(GL_ONE, GL_ONE); + + glViewport(0,0,s_nTargetWidth,s_nTargetWidth); // Reset The Current Viewport + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + glShadeModel(GL_SMOOTH); + glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + glClearDepth(1.0f); + glEnable(GL_DEPTH_TEST); + glDisable(GL_LIGHTING); + glDepthFunc(GL_LEQUAL); + + glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // perspective correct interpolation of colors and tex coords + + // setup the default vertex declaration + glDisable(GL_STENCIL_TEST); + glEnable(GL_SCISSOR_TEST); + glScissor(0,0,nBackbufferWidth,nBackbufferHeight); + glBlendColorEXT(0, 0, 0, 0.5f); + glClearDepth(1.0f); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + //Renderer::SetZBufferRender(); + + // legacy multitexturing: select texture channel only + glActiveTexture(GL_TEXTURE0); + glClientActiveTexture(GL_TEXTURE0); + glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE ); + + s_RenderMode = Renderer::RM_Normal; + + GLenum err = GL_NO_ERROR; + GL_REPORT_ERROR(); + return err == GL_NO_ERROR; +} + +void Renderer::AddMessage(const char* pstr, u32 ms) +{ + s_listMsgs.push_back(MESSAGE(pstr, timeGetTime()+ms)); +} + +void Renderer::ProcessMessages() +{ + if (s_listMsgs.size() > 0) { + int left = 25, top = 15; + list::iterator it = s_listMsgs.begin(); + + while( it != s_listMsgs.end() ) { + DrawText(it->str, left+1, top+1, 0xff000000); + DrawText(it->str, left, top, 0xffffff30); + top += 15; + + if ((int)(it->dwTimeStamp - timeGetTime()) < 0) + it = s_listMsgs.erase(it); + else ++it; + } + } +} + +void Renderer::DrawText(const char* pstr, int left, int top, u32 color) +{ + glColor3f(((color>>16) & 0xff)/255.0f, ((color>>8) & 0xff)/255.0f, (color & 0xff)/255.0f); + s_pfont->printString(pstr, left * 2.0f / (float)nBackbufferWidth - 1, 1 - top * 2.0f / (float)nBackbufferHeight,0); +} + +void Renderer::SetAA(int aa) +{ + +} + +void Renderer::ReinitView(int nNewWidth, int nNewHeight) +{ + int oldscreen = s_bFullscreen; + + OpenGL_Shutdown(); + int oldwidth = nBackbufferWidth, oldheight = nBackbufferHeight; + if (!OpenGL_Create(g_VideoInitialize, nNewWidth, nNewHeight)) {//nNewWidth&~7, nNewHeight&~7) ) { + ERROR_LOG("Failed to recreate, reverting to old settings\n"); + if (!OpenGL_Create(g_VideoInitialize, oldwidth, oldheight)) { + SysMessage("Failed to revert, exiting...\n"); + // TODO - don't takedown the entire emu + exit(0); + } + } + OpenGL_MakeCurrent(); + + if (oldscreen && !g_Config.bFullscreen) { // if transitioning from full screen +#ifdef _WIN32 + RECT rc; + rc.left = 0; rc.top = 0; + rc.right = nNewWidth; rc.bottom = nNewHeight; + AdjustWindowRect(&rc, EmuWindow::g_winstyle, FALSE); + + RECT rcdesktop; + GetWindowRect(GetDesktopWindow(), &rcdesktop); + + SetWindowLong( EmuWindow::GetWnd(), GWL_STYLE, EmuWindow::g_winstyle ); + SetWindowPos(EmuWindow::GetWnd(), HWND_TOP, ((rcdesktop.right-rcdesktop.left)-(rc.right-rc.left))/2, + ((rcdesktop.bottom-rcdesktop.top)-(rc.bottom-rc.top))/2, + rc.right-rc.left, rc.bottom-rc.top, SWP_SHOWWINDOW); + UpdateWindow(EmuWindow::GetWnd()); +#else // linux +#endif + } + + nBackbufferWidth = nNewWidth > 16 ? nNewWidth : 16; + nBackbufferHeight = nNewHeight > 16 ? nNewHeight : 16; +} + +int Renderer::GetTargetWidth() +{ + return s_nTargetWidth; +} + +bool Renderer::CanBlendLogicOp() +{ + return g_bBlendLogicOp; +} + +int Renderer::GetTargetHeight() +{ + return s_nTargetHeight; +} + +void Renderer::SetRenderTarget(u32 targ) +{ + glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_RECTANGLE_NV, targ!=0?targ:s_RenderTargets[s_nCurTarget], 0 ); +} + +void Renderer::SetDepthTarget(u32 targ) +{ + glFramebufferRenderbufferEXT( GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, targ != 0 ? targ : s_DepthTarget ); +} + +void Renderer::SetFramebuffer(u32 fb) +{ + glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, fb != 0 ? fb : s_uFramebuffer ); +} + +u32 Renderer::GetRenderTarget() +{ + return s_RenderTargets[s_nCurTarget]; +} + +void Renderer::ResetGLState() +{ + glDisable(GL_SCISSOR_TEST); + glDisable(GL_DEPTH_TEST); + glDisable(GL_CULL_FACE); + glDisable(GL_BLEND); + glDepthMask(GL_FALSE); + glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + + glDisable( GL_VERTEX_PROGRAM_ARB ); + glDisable( GL_FRAGMENT_PROGRAM_ARB ); +} + +void Renderer::RestoreGLState() +{ + glEnable(GL_SCISSOR_TEST); + + if (bpmem.genMode.cullmode>0) glEnable(GL_CULL_FACE); + if (bpmem.zmode.testenable) glEnable(GL_DEPTH_TEST); + if (bpmem.blendmode.blendenable) glEnable(GL_BLEND); + if(bpmem.zmode.updateenable) glDepthMask(GL_TRUE); + + glEnable( GL_VERTEX_PROGRAM_ARB ); + glEnable( GL_FRAGMENT_PROGRAM_ARB ); + SetColorMask(); +} + +bool Renderer::IsUsingATIDrawBuffers() +{ + return s_bATIDrawBuffers; +} + +bool Renderer::HaveStencilBuffer() +{ + return s_bHaveStencilBuffer; +} + +void Renderer::SetZBufferRender() +{ + nZBufferRender = 10; // give it 10 frames + GLenum s_drawbuffers[2] = {GL_COLOR_ATTACHMENT0_EXT, GL_COLOR_ATTACHMENT1_EXT}; + glDrawBuffers(2, s_drawbuffers); + glFramebufferTexture2DEXT( GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_RECTANGLE_NV, s_ZBufferTarget, 0); + _assert_(glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) == GL_FRAMEBUFFER_COMPLETE_EXT); +} + +void Renderer::FlushZBufferAlphaToTarget() +{ + ResetGLState(); + + SetRenderTarget(0); + glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT); + glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_TRUE); + + glViewport(0, 0, GetTargetWidth()< 0 ? s_ZBufferTarget : 0; +} + +void Renderer::Swap(const TRectangle& rc) +{ + OpenGL_Update(); // just updates the render window position and the backbuffer size + + DVProfileFunc _pf("Renderer::Swap"); + + Renderer::SetRenderMode(Renderer::RM_Normal); + + // render to the real buffer now + glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, 0 ); // switch to the backbuffer + glViewport(0, 0, nBackbufferWidth, nBackbufferHeight); + + ResetGLState(); + + // texture map s_RenderTargets[s_curtarget] onto the main buffer + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_RECTANGLE_NV, s_RenderTargets[s_nCurTarget]); + TextureMngr::EnableTexRECT(0); + // disable all other stages + for(int i = 1; i < 8; ++i) TextureMngr::DisableStage(i); + GL_REPORT_ERRORD(); + + + float FactorW = (float)s_nTargetWidth / (float)nBackbufferWidth; + float FactorH = (float)s_nTargetHeight / (float)nBackbufferHeight; + + float Max = (FactorW < FactorH) ? FactorH : FactorW; + float Temp = 1 / Max; + FactorW *= Temp; + FactorH *= Temp; + + + glBegin(GL_QUADS); + glTexCoord2f(0, 0); glVertex2f(-FactorW,-FactorH); + glTexCoord2f(0, (float)s_nTargetHeight); glVertex2f(-FactorW,FactorH); + glTexCoord2f((float)s_nTargetWidth, (float)s_nTargetHeight); glVertex2f(FactorW,FactorH); + glTexCoord2f((float)s_nTargetWidth, 0); glVertex2f(FactorW,-FactorH); + glEnd(); + + glBindTexture(GL_TEXTURE_RECTANGLE_NV, 0); + TextureMngr::DisableStage(0); + +// static int fpscount = 0; +// static float s_fps = 0; +// static u32 lasttime = timeGetTime(); +// +// if( ++fpscount >= 16 ) { +// s_fps = 16*1000.0f/(float)(timeGetTime() - lasttime); +// lasttime = timeGetTime(); +// fpscount = 0; +// } +// +// char strfps[25]; +// sprintf(strfps, "fps: %2.1f\n", s_fps); +// Renderer::DrawText(strfps, 20, 20, 0xFF00FFFF); + + if (g_Config.bOverlayStats) { + char st[2048]; + char *p = st; + p+=sprintf(p,"Num textures created: %i\n",stats.numTexturesCreated); + p+=sprintf(p,"Num textures alive: %i\n",stats.numTexturesAlive); + p+=sprintf(p,"Num pshaders created: %i\n",stats.numPixelShadersCreated); + p+=sprintf(p,"Num pshaders alive: %i\n",stats.numPixelShadersAlive); + p+=sprintf(p,"Num vshaders created: %i\n",stats.numVertexShadersCreated); + p+=sprintf(p,"Num vshaders alive: %i\n",stats.numVertexShadersAlive); + p+=sprintf(p,"Num dlists called: %i\n",stats.numDListsCalled); + p+=sprintf(p,"Num dlists created: %i\n",stats.numDListsCreated); + p+=sprintf(p,"Num dlists alive: %i\n",stats.numDListsAlive); + p+=sprintf(p,"Num strip joins: %i\n",stats.numJoins); + p+=sprintf(p,"Num primitives: %i\n",stats.thisFrame.numPrims); + p+=sprintf(p,"Num primitives (DL): %i\n",stats.thisFrame.numDLPrims); + p+=sprintf(p,"Num bad commands: %i%s\n",stats.thisFrame.numBadCommands,stats.thisFrame.numBadCommands?"!!!":""); + p+=sprintf(p,"Num XF loads: %i\n",stats.thisFrame.numXFLoads); + p+=sprintf(p,"Num XF loads (DL): %i\n",stats.thisFrame.numXFLoadsInDL); + p+=sprintf(p,"Num CP loads: %i\n",stats.thisFrame.numCPLoads); + p+=sprintf(p,"Num CP loads (DL): %i\n",stats.thisFrame.numCPLoadsInDL); + p+=sprintf(p,"Num BP loads: %i\n",stats.thisFrame.numBPLoads); + p+=sprintf(p,"Num BP loads (DL): %i\n",stats.thisFrame.numBPLoadsInDL); + + Renderer::DrawText(st, 20, 20, 0xFF00FFFF); + } + +#if defined(DVPROFILE) + if (g_bWriteProfile) { + //g_bWriteProfile = 0; + static int framenum = 0; + const int UPDATE_FRAMES = 8; + if (++framenum >= UPDATE_FRAMES) { + DVProfWrite("prof.txt", UPDATE_FRAMES); + DVProfClear(); + framenum = 0; + } + } +#endif + + // copy the rendered from to the real window + OpenGL_SwapBuffers(); + + GL_REPORT_ERRORD(); + + //clean out old stuff from caches + frameCount++; + PixelShaderMngr::Cleanup(); + TextureMngr::Cleanup(); + + // New frame + stats.ResetFrame(); + + glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, s_uFramebuffer ); + +// s_nCurTarget = !s_nCurTarget; +// SetRenderTarget(0); + + if( nZBufferRender > 0 ) { + if( --nZBufferRender == 0 ) { + // turn off + nZBufferRender = 0; + glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT); + glFramebufferTexture2DEXT( GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_RECTANGLE_NV, 0, 0); + Renderer::SetRenderMode(RM_Normal); // turn off any zwrites + } + } + + RestoreGLState(); + GL_REPORT_ERRORD(); + + g_Config.iSaveTargetId = 0; + + // for testing zbuffer targets + //Renderer::SetZBufferRender(); + //SaveTexture("tex.tga", GL_TEXTURE_RECTANGLE_NV, s_ZBufferTarget, GetTargetWidth(), GetTargetHeight()); +} + +bool Renderer::SaveRenderTarget(const char* filename, int jpeg) +{ + bool bflip = true; + vector data(s_nTargetWidth*s_nTargetHeight); + glReadPixels(0, 0, s_nTargetWidth, s_nTargetHeight, GL_BGRA, GL_UNSIGNED_BYTE, &data[0]); + if (glGetError() != GL_NO_ERROR) + return false; + + if (bflip) { + // swap scanlines + vector scanline(s_nTargetWidth); + for(u32 i = 0; i < s_nTargetHeight/2; ++i) { + memcpy(&scanline[0], &data[i*s_nTargetWidth], s_nTargetWidth*4); + memcpy(&data[i*s_nTargetWidth], &data[(s_nTargetHeight-i-1)*s_nTargetWidth], s_nTargetWidth*4); + memcpy(&data[(s_nTargetHeight-i-1)*s_nTargetWidth], &scanline[0], s_nTargetWidth*4); + } + } + + if (jpeg) return SaveJPEG(filename, s_nTargetWidth, s_nTargetHeight, &data[0], 70); + + return SaveTGA(filename, s_nTargetWidth, s_nTargetHeight, &data[0]); +} + +void Renderer::SetCgErrorOutput(bool bOutput) +{ + s_bOutputCgErrors = bOutput; +} + +void HandleGLError() +{ + const GLubyte* pstr = glGetString(GL_PROGRAM_ERROR_STRING_ARB); + if (pstr != NULL && pstr[0] != 0 ) { + GLint loc=0; + glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &loc); + ERROR_LOG("program error at %d: ", loc); + ERROR_LOG((char*)pstr); + ERROR_LOG("\n"); + } + + // check the error status of this framebuffer */ + GLenum error = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); + + // if error != GL_FRAMEBUFFER_COMPLETE_EXT, there's an error of some sort + if (error != 0) { + int w, h; + GLint fmt; + glGetRenderbufferParameterivEXT(GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER_INTERNAL_FORMAT_EXT, &fmt); + glGetRenderbufferParameterivEXT(GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER_WIDTH_EXT, &w); + glGetRenderbufferParameterivEXT(GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER_HEIGHT_EXT, &h); + + switch(error) + { + case GL_FRAMEBUFFER_COMPLETE_EXT: + break; + case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT: + ERROR_LOG("Error! missing a required image/buffer attachment!\n"); + break; + case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT: + ERROR_LOG("Error! has no images/buffers attached!\n"); + break; +// case GL_FRAMEBUFFER_INCOMPLETE_DUPLICATE_ATTACHMENT_EXT: +// ERROR_LOG("Error! has an image/buffer attached in multiple locations!\n"); +// break; + case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT: + ERROR_LOG("Error! has mismatched image/buffer dimensions!\n"); + break; + case GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT: + ERROR_LOG("Error! colorbuffer attachments have different types!\n"); + break; + case GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT: + ERROR_LOG("Error! trying to draw to non-attached color buffer!\n"); + break; + case GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT: + ERROR_LOG("Error! trying to read from a non-attached color buffer!\n"); + break; + case GL_FRAMEBUFFER_UNSUPPORTED_EXT: + ERROR_LOG("Error! format is not supported by current graphics card/driver!\n"); + break; + default: + ERROR_LOG("*UNKNOWN ERROR* reported from glCheckFramebufferStatusEXT()!\n"); + break; + } + } +} + +void HandleCgError(CGcontext ctx, CGerror err, void* appdata) +{ + if( s_bOutputCgErrors ) { + ERROR_LOG("Cg error: %s\n", cgGetErrorString(err)); + const char* listing = cgGetLastListing(g_cgcontext); + if (listing != NULL) { + ERROR_LOG(" last listing: %s\n", listing); + } + // glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &loc); + // printf("pos: %d\n", loc); + } +} diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Render.h b/Source/Plugins/Plugin_VideoOGL/Src/Render.h new file mode 100644 index 0000000000..6fd6516579 --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/Render.h @@ -0,0 +1,80 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef GCOGL_RENDER +#define GCOGL_RENDER + +#include "TextureMngr.h" + +extern CGcontext g_cgcontext; +extern CGprofile g_cgvProf, g_cgfProf; +extern u32 g_AAx, g_AAy; // anti-aliasing + +class Renderer +{ + static void FlushZBufferAlphaToTarget(); + +public: + enum RenderMode + { + RM_Normal=0, // normal target as color0, ztarget as color1 + RM_ZBufferOnly, // zbuffer as color 0 + RM_ZBufferAlpha // zbuffer as color0, also will dump alpha info to regular target once mode is switched + // use stencil buffer to indicate what pixels were written + }; + + static bool Create2(); + static void Shutdown(); + + // initialize opengl standard values (like viewport) + static bool Initialize(); + + static void AddMessage(const char* str, u32 ms); + static void ProcessMessages(); // draw the current messages on the screen + static void DrawText(const char* pstr, int left, int top, u32 color); + static void SetAA(int aa); // sets the anti-aliasing level + + static void ReinitView(int nNewWidth, int nNewHeight); + + static int GetTargetWidth(); + static int GetTargetHeight(); + static bool CanBlendLogicOp(); + static void SetCgErrorOutput(bool bOutput); + + static void ResetGLState(); + static void RestoreGLState(); + static bool IsUsingATIDrawBuffers(); + static bool HaveStencilBuffer(); + + static void SetZBufferRender(); // sets rendering of the zbuffer using MRTs + static u32 GetZBufferTarget(); + + static void SetRenderMode(RenderMode mode); + static RenderMode GetRenderMode(); + + static void SetRenderTarget(u32 targ); // if targ is 0, sets to original render target + static void SetDepthTarget(u32 targ); + static void SetFramebuffer(u32 fb); + static u32 GetRenderTarget(); + + // Finish up the current frame, print some stats + static void Swap(const TRectangle& rc); + + static bool SaveRenderTarget(const char* filename, int jpeg); +}; + +#endif diff --git a/Source/Plugins/Plugin_VideoOGL/Src/SConscript b/Source/Plugins/Plugin_VideoOGL/Src/SConscript new file mode 100644 index 0000000000..74cbfb1c1d --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/SConscript @@ -0,0 +1,26 @@ +Import('env') + +files = ["BPStructs.cpp", + "DataReader.cpp", + "Fifo.cpp", + "Globals.cpp", + "GLInit.cpp", + "main.cpp", + "memcpy_amd.cpp", + "OpcodeDecoding.cpp", +# "OpcodeReaders.cpp", # outdated + "PixelShader.cpp", + "rasterfont.cpp", + "Render.cpp", + "TextureDecoder.cpp", + "TextureMngr.cpp", + "VertexLoader.cpp", + "VertexLoader_Normal.cpp", + "VertexShader.cpp", +# "Linux/Conf.cpp", + "Linux/Linux.cpp", + ] + +gfxenv=env.Copy(CXXFLAGS = " `pkg-config --cflags gtk+-2.0`", LINKFLAGS = " `pkg-config --libs gtk+-2.0`") + +gfxenv.SharedLibrary("../../../../Binary/linux/Plugins/zeroogl.so", files, LIBS=["common", "cairo", "GL", "GLEW", "CgGL", "Cg"]) diff --git a/Source/Plugins/Plugin_VideoOGL/Src/TextureDecoder.cpp b/Source/Plugins/Plugin_VideoOGL/Src/TextureDecoder.cpp new file mode 100644 index 0000000000..552333c20a --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/TextureDecoder.cpp @@ -0,0 +1,443 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "Globals.h" + +#include "BPStructs.h" +#include "TextureDecoder.h" + +#include "OpcodeDecoding.h" + +// TRAM +u8 texMem[TMEM_SIZE]; + +////////////////////////////////////////////////////////////////////////// +// Gamecube texture decoder +////////////////////////////////////////////////////////////////////////// +// Decodes all known Gamecube texture formats. +// by ector +////////////////////////////////////////////////////////////////////////// +int TexDecoder_GetTexelSizeInNibbles(int format) +{ + switch(format&0x3f) { + case GX_TF_I4: return 1; + case GX_TF_I8: return 2; + case GX_TF_IA4: return 2; + case GX_TF_IA8: return 4; + case GX_TF_RGB565: return 4; + case GX_TF_RGB5A3: return 4; + case GX_TF_RGBA8: return 8; + case GX_TF_C4: return 1; + case GX_TF_C8: return 2; + case GX_TF_C14X2: return 4; + case GX_TF_CMPR: return 1; + default: return 1; + } +} +int TexDecoder_GetBlockWidthInTexels(int format) +{ + switch(format) { + case GX_TF_I4: return 8; + case GX_TF_I8: return 8; + case GX_TF_IA4: return 8; + case GX_TF_IA8: return 4; + case GX_TF_RGB565: return 4; + case GX_TF_RGB5A3: return 4; + case GX_TF_RGBA8: return 4; + case GX_TF_C4: return 8; + case GX_TF_C8: return 8; + case GX_TF_C14X2: return 4; + case GX_TF_CMPR: return 8; + default:return 8; + } +} + +//returns bytes +int TexDecoder_GetPaletteSize(int format) +{ + switch (format) { + case GX_TF_C4: return 16*2; + case GX_TF_C8: return 256*2; + case GX_TF_C14X2: return 16384*2; + default: + return 0; + } +} + +inline u32 decode565(u16 val) +{ + int r,g,b,a; + r=lut5to8[(val>>11)&0x1f]; + g=lut6to8[(val>>5 )&0x3f]; + b=lut5to8[(val )&0x1f]; + a=0xFF; + return (a<<24) | (r<<16) | (g<<8) | b; +} + +inline u32 decodeIA8(u16 val) +{ + int a=val>>8; + int r,g,b; + r=g=b=val&0xFF; + return (a<<24) | (r<<16) | (g<<8) | b; +} + +inline u32 decode5A3(u16 val) +{ + int r,g,b,a; + if ((val&0x8000)) + { + r=lut5to8[(val>>10)&0x1f]; + g=lut5to8[(val>>5 )&0x1f]; + b=lut5to8[(val )&0x1f]; + a=0xFF; + } + else + { + a=lut3to8[(val>>12)&0x7]; + r=lut4to8[(val>>8 )&0xf]; + g=lut4to8[(val>>4 )&0xf]; + b=lut4to8[(val )&0xf]; + } + return (a<<24) | (r<<16) | (g<<8) | b; +} + + + +struct DXTBlock +{ + u16 color1; + u16 color2; + u8 lines[4]; +}; + +inline int expand8888(const int j) +{ + int i = j | (j<<8); + return i|(i<<16); +} + +inline void decodebytesI4(u32 *dst, u8 *src, int numbytes) +{ + for (int x=0; x>4]); + *dst++ = expand8888(lut4to8[val&15]); + } +} + +inline void decodebytesI8(u32 *dst, u8 *src, int numbytes) +{ + for (int x=0; x>4)])); + *dst++ = decodeIA8(Common::swap16(tlut[(val&15)])); + break; + case 1: + *dst++ = decode565(Common::swap16(tlut[(val>>4)])); + *dst++ = decode565(Common::swap16(tlut[(val&15)])); + break; + case 2: + *dst++ = decode5A3(Common::swap16(tlut[(val>>4)])); + *dst++ = decode5A3(Common::swap16(tlut[(val&15)])); + break; + case 3: //ERROR + *dst++ = 0xFFFF00FF; + *dst++ = 0xFFFF00FF; + break; + } + } +} + +inline void decodebytesC8(u32 *dst, u8 *src, int numbytes, int tlutaddr, int tlutfmt) +{ + u16 *tlut = (u16*)(texMem+tlutaddr); + for (int x=0; x>4]; + int r = lut4to8[val&15]; + *dst++ = (a<<24) | (r<<16) | (r<<8) | r; + } +} + +inline void decodebytesIA8(u32 *dst, u16 *src, int numpixels) +{ + for (int x=0; x>=8; + + *dst++ = (a<<16) | (val<<24); + } +} + +inline void decodebytesARGB8pass2(u32 *dst, u16 *src, int numpixels) +{ + for (int x=0; x>=8; + + *dst++ |= (val<<8) | (a<<0); + } +} + +inline u32 makecol(int r,int g,int b,int a) +{ + return ((a&255)<<24)|((r&255)<<16)|((g&255)<<8)|((b&255)); +} + + +//this needs to be FAST, used by some games realtime video +//TODO: port to ASM or intrinsics +void decodeDXTBlock(u32 *dst, DXTBlock *src, int pitch) +{ + u16 c1 = Common::swap16(src->color1); + u16 c2 = Common::swap16(src->color2); + int blue1 = lut5to8[c1&0x1F]; + int blue2 = lut5to8[c2&0x1F]; + int green1 = lut6to8[(c1>>5)&0x3F]; + int green2 = lut6to8[(c2>>5)&0x3F]; + int red1 = lut5to8[(c1>>11)&0x1F]; + int red2 = lut5to8[(c2>>11)&0x1F]; + + int colors[4]; + + if (c1>c2) + { + colors[0]=makecol(red1,green1,blue1,255); + colors[1]=makecol(red2,green2,blue2,255); + colors[2]=makecol(red1+(red2-red1)/3,green1+(green2-green1)/3,blue1+(blue2-blue1)/3,255); + colors[3]=makecol(red2+(red1-red2)/3,green2+(green1-green2)/3,blue2+(blue1-blue2)/3,255); + } + else + { + colors[0]=makecol(red1,green1,blue1,255); + colors[1]=makecol(red2,green2,blue2,255); + colors[2]=makecol((red1+red2)/2,(green1+green2)/2,(blue1+blue2)/2,255); + colors[3]=makecol(0,0,0,0); //transparent + } + + for (int y=0; y<4; y++) + { + int val = src->lines[y]; + for (int x=0; x<4; x++) + { + dst[x] = colors[(val>>6)&3]; + val<<=2; + } + dst+=pitch; + } +} + + +//switch endianness, unswizzle +//TODO: to save memory, don't blindly convert everything to argb8888 +//also ARGB order needs to be swapped later, to accommodate modern hardware better +//need to add DXT support too +TEXTUREFMT TexDecoder_Decode(u8 *dst, u8 *src, int width, int height, int texformat, int tlutaddr, int tlutfmt) +{ + DVSTARTPROFILE(); + + switch (texformat) + { + case GX_TF_C4: + { + for (int y=0; y +#endif + +#include "Globals.h" + +#include "Render.h" + +#include "MemoryUtil.h" +#include "BPStructs.h" +#include "TextureDecoder.h" +#include "TextureMngr.h" +#include "PixelShader.h" +#include "VertexShader.h" + +u8 *TextureMngr::temp = NULL; +TextureMngr::TexCache TextureMngr::textures; +std::map TextureMngr::mapDepthTargets; +int TextureMngr::nTex2DEnabled, TextureMngr::nTexRECTEnabled; + +extern int frameCount; +static u32 s_TempFramebuffer = 0; +#define TEMP_SIZE (1024*1024*4) + +const GLint c_MinLinearFilter[8] = { + GL_NEAREST, GL_NEAREST_MIPMAP_NEAREST, GL_NEAREST_MIPMAP_LINEAR, GL_NEAREST, + GL_LINEAR, GL_LINEAR_MIPMAP_NEAREST, GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR}; + +const GLint c_WrapSettings[4] = { GL_CLAMP_TO_EDGE, GL_REPEAT, GL_MIRRORED_REPEAT, GL_REPEAT }; + +void TextureMngr::TCacheEntry::SetTextureParameters(TexMode0& newmode) +{ + mode = newmode; + if( isNonPow2 ) { + // very limited! + glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MAG_FILTER, (newmode.mag_filter||g_Config.bForceFiltering)?GL_LINEAR:GL_NEAREST); + glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MIN_FILTER, (g_Config.bForceFiltering||newmode.min_filter>=4)?GL_LINEAR:GL_NEAREST); + if( newmode.wrap_s == 2 || newmode.wrap_t == 2 ) { + DEBUG_LOG("cannot support mirrorred repeat mode\n"); + } + } + else { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, (newmode.mag_filter||g_Config.bForceFiltering)?GL_LINEAR:GL_NEAREST); + + if( bHaveMipMaps ) { + int filt = newmode.min_filter; + if( g_Config.bForceFiltering && newmode.min_filter < 4 ) + newmode.min_filter += 4; // take equivalent forced linear + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, c_MinLinearFilter[filt]); + } + else + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, (g_Config.bForceFiltering||newmode.min_filter>=4)?GL_LINEAR:GL_NEAREST); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, c_WrapSettings[newmode.wrap_s]); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, c_WrapSettings[newmode.wrap_t]); + } + + if (g_Config.bForceMaxAniso) + { + // not used for now, check out GL_EXT_texture_filter_anisotropic + } +} + +void TextureMngr::TCacheEntry::Destroy() +{ + SAFE_RELEASE_TEX(texture); +} + +void TextureMngr::Init() +{ + temp = (u8*)AllocateMemoryPages(TEMP_SIZE); + nTex2DEnabled = nTexRECTEnabled = 0; +} + +void TextureMngr::Invalidate() +{ + TexCache::iterator iter = textures.begin(); + for (;iter!=textures.end();iter++) + iter->second.Destroy(); + textures.clear(); +} + +void TextureMngr::Shutdown() +{ + Invalidate(); + std::map::iterator itdepth = mapDepthTargets.begin(); + for (itdepth = mapDepthTargets.begin(); itdepth != mapDepthTargets.end(); ++itdepth) { + glDeleteRenderbuffersEXT(1, &itdepth->second.targ); + } + mapDepthTargets.clear(); + + if( s_TempFramebuffer ) { + glDeleteFramebuffersEXT(1, &s_TempFramebuffer); + s_TempFramebuffer = 0; + } + + FreeMemoryPages(temp, TEMP_SIZE); + temp = NULL; +} + +void TextureMngr::Cleanup() +{ + TexCache::iterator iter = textures.begin(); + + while(iter!=textures.end()) { + if (frameCount > 20 + iter->second.frameCount) { + if (!iter->second.isRenderTarget) { + u32 *ptr = (u32*)g_VideoInitialize.pGetMemoryPointer(iter->second.addr + iter->second.hashoffset*4); + if (*ptr == iter->second.hash) + *ptr = iter->second.oldpixel; + iter->second.Destroy(); +#ifdef _WIN32 + iter = textures.erase(iter); +#else + textures.erase(iter++); +#endif + } + else { + iter->second.Destroy(); +#ifdef _WIN32 + iter = textures.erase(iter); +#else + textures.erase(iter++); +#endif + } + } + else + iter++; + } + + std::map::iterator itdepth = mapDepthTargets.begin(); + while(itdepth != mapDepthTargets.end()) { + if( frameCount > 20 + itdepth->second.framecount) { +#ifdef _WIN32 + itdepth = mapDepthTargets.erase(itdepth); +#else + mapDepthTargets.erase(itdepth++); +#endif + } + else ++itdepth; + } +} + +#ifndef _WIN32 +inline u32 _rotl(u32 x, int shift) { + return (x << shift) | (x >> (32 - shift)); +} +#endif +TextureMngr::TCacheEntry* TextureMngr::Load(int texstage, u32 address, int width, int height, int format, int tlutaddr, int tlutfmt) +{ + if (address == 0 ) + return NULL; + + TexCache::iterator iter = textures.find(address); + TexMode0 &tm0 = bpmem.tex[texstage>3].texMode0[texstage&3]; + u8 *ptr = g_VideoInitialize.pGetMemoryPointer(address); + + int palSize = TexDecoder_GetPaletteSize(format); + u32 palhash = 0xc0debabe; + + if (palSize) { + if (palSize>16) + palSize = 16; //let's not do excessive amount of checking + u8 *pal = g_VideoInitialize.pGetMemoryPointer(tlutaddr); + if (pal != 0) { + for (int i=0; isecond; + + if( entry.isRenderTarget || ((u32 *)ptr)[entry.hashoffset] == entry.hash && palhash == entry.paletteHash) { //stupid, improve + entry.frameCount = frameCount; + //glEnable(entry.isNonPow2?GL_TEXTURE_RECTANGLE_NV:GL_TEXTURE_2D); + glBindTexture(entry.isNonPow2?GL_TEXTURE_RECTANGLE_NV:GL_TEXTURE_2D, entry.texture); + if (entry.mode.hex != tm0.hex) + entry.SetTextureParameters(tm0); + return &entry; + } + else + { + // can potentially do some caching + + //TCacheEntry &entry = entry; + /*if (width == entry.w && height==entry.h && format==entry.fmt) + { + LPDIRECT3DTEXTURE9 tex = entry.texture; + int bs = TexDecoder_GetBlockWidthInTexels(format)-1; //TexelSizeInNibbles(format)*width*height/16; + int expandedWidth = (width+bs) & (~bs); + D3DFORMAT dfmt = TexDecoder_Decode(temp,ptr,expandedWidth,height,format, tlutaddr, tlutfmt); + ReplaceTexture2D(tex,temp,width,height,expandedWidth,dfmt); + dev->SetTexture(texstage, stage,tex); + return; + } + else + {*/ + entry.Destroy(); + textures.erase(iter); + //} + } + } + + int bs = TexDecoder_GetBlockWidthInTexels(format)-1; //TexelSizeInNibbles(format)*width*height/16; + int expandedWidth = (width+bs) & (~bs); + TEXTUREFMT dfmt = TexDecoder_Decode(temp,ptr,expandedWidth,height,format, tlutaddr, tlutfmt); + + //Make an entry in the table + TCacheEntry& entry = textures[address]; + + entry.hashoffset = 0; + entry.hash = (u32)(((double)rand() / RAND_MAX) * 0xFFFFFFFF); + entry.paletteHash = palhash; + entry.oldpixel = ((u32 *)ptr)[entry.hashoffset]; + ((u32 *)ptr)[entry.hashoffset] = entry.hash; + + entry.addr = address; + entry.isRenderTarget=false; + + entry.isNonPow2 = ((width&(width-1)) || (height&(height-1))); + + glGenTextures(1, &entry.texture); + GLenum target = entry.isNonPow2 ? GL_TEXTURE_RECTANGLE_NV : GL_TEXTURE_2D; + glBindTexture(target, entry.texture); + + if (expandedWidth != width) + glPixelStorei(GL_UNPACK_ROW_LENGTH, expandedWidth); + + if( !entry.isNonPow2 && ((tm0.min_filter&3)==1||(tm0.min_filter&3)==2) ) { + gluBuild2DMipmaps(GL_TEXTURE_2D, 4, width, height, GL_BGRA, GL_UNSIGNED_BYTE, temp); + entry.bHaveMipMaps = true; + } + else + glTexImage2D(target, 0, 4, width, height, 0, dfmt.format, dfmt.type, temp); + + if (expandedWidth != width) // reset + glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); + + entry.frameCount = frameCount; + entry.w=width; + entry.h=height; + entry.fmt=format; + entry.SetTextureParameters(tm0); + + if (g_Config.bDumpTextures) { // dump texture to file + static int counter = 0; + char szTemp[MAX_PATH]; + sprintf(szTemp, "%s\\txt_%04i_%i.png", g_Config.texDumpPath, counter++, format); + + SaveTexture(szTemp,target, entry.texture, width, height); + } + + INCSTAT(stats.numTexturesCreated); + SETSTAT(stats.numTexturesAlive,textures.size()); + + //glEnable(entry.isNonPow2?GL_TEXTURE_RECTANGLE_NV:GL_TEXTURE_2D); + + //SaveTexture("tex.tga", target, entry.texture, entry.w, entry.h); + return &entry; +} + +void TextureMngr::CopyRenderTargetToTexture(u32 address, bool bFromZBuffer, bool bIsIntensityFmt, u32 copyfmt, bool bScaleByHalf, TRectangle *source) +{ + DVSTARTPROFILE(); + GL_REPORT_ERRORD(); + + // for intensity values, use Y of YUV format! + // for all purposes, treat 4bit equivalents as 8bit (probably just used for compression) + // RGBA8 - RGBA8 + // RGB565 - RGB565 + // RGB5A3 - RGB5A3 + // I4,R4,Z4 - I4 + // IA4,RA4 - IA4 + // Z8M,G8,I8,A8,Z8,R8,B8,Z8L - I8 + // Z16,GB8,RG8,Z16L,IA8,RA8 - IA8 + bool bIsInit = textures.find(address) != textures.end(); + + PRIM_LOG("copytarg: addr=0x%x, fromz=%d, intfmt=%d, copyfmt=%d\n", address, (int)bFromZBuffer,(int)bIsIntensityFmt,copyfmt); + + TCacheEntry& entry = textures[address]; + entry.isNonPow2 = true; + entry.hash = 0; + entry.hashoffset = 0; + entry.frameCount = frameCount; + + int mult = bScaleByHalf?2:1; + int w = (abs(source->right-source->left)/mult+7)&~7; + int h = (abs(source->bottom-source->top)/mult+7)&~7; + + GL_REPORT_ERRORD(); + + if( !bIsInit ) { + glGenTextures(1, &entry.texture); + glBindTexture(GL_TEXTURE_RECTANGLE_NV, entry.texture); + glTexImage2D(GL_TEXTURE_RECTANGLE_NV, 0, 4, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); + GL_REPORT_ERRORD(); + } + else { + _assert_(entry.texture); + bool bReInit = true; + + if( entry.w == w && entry.h == h ) { + glBindTexture(GL_TEXTURE_RECTANGLE_NV, entry.texture); + // for some reason mario sunshine errors here... + GLenum err = GL_NO_ERROR; + GL_REPORT_ERROR(); + if( err == GL_NO_ERROR ) + bReInit = false; + } + + if( bReInit ) { + // necessary, for some reason opengl gives errors when texture isn't deleted + glDeleteTextures(1,&entry.texture); + glGenTextures(1, &entry.texture); + glBindTexture(GL_TEXTURE_RECTANGLE_NV, entry.texture); + glTexImage2D(GL_TEXTURE_RECTANGLE_NV, 0, 4, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); + GL_REPORT_ERRORD(); + } + } + + if( !bIsInit || !entry.isRenderTarget ) { + glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + + glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + if( glGetError() != GL_NO_ERROR) { + glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_WRAP_S, GL_CLAMP); + glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_WRAP_T, GL_CLAMP); + GL_REPORT_ERRORD(); + } + } + + entry.w = w; + entry.h = h; + entry.isRenderTarget=true; + entry.fmt = copyfmt; + + float colmat[16]; + float fConstAdd[4] = {0}; + memset(colmat, 0, sizeof(colmat)); + + if( bFromZBuffer ) { + switch(copyfmt) { + case 0: // Z4 + case 1: // Z8 + colmat[2] = colmat[6] = colmat[10] = colmat[14] = 1; + break; + + case 3: // Z16 //? + case 11: // Z16 + colmat[1] = colmat[5] = colmat[9] = colmat[14] = 1; + break; + case 6: // Z24X8 + colmat[0] = 1; + colmat[5] = 1; + colmat[10] = 1; + break; + case 9: // Z8M + colmat[1] = colmat[5] = colmat[9] = colmat[13] = 1; + break; + case 10: // Z8L + colmat[0] = colmat[4] = colmat[8] = colmat[12] = 1; + break; + case 12: // Z16L + colmat[0] = colmat[4] = colmat[8] = colmat[13] = 1; + break; + default: + ERROR_LOG("Unknown copy zbuf format: 0x%x\n", copyfmt); + colmat[0] = colmat[5] = colmat[10] = colmat[15] = 1; + break; + } + } + else if( bIsIntensityFmt ) { + fConstAdd[0] = fConstAdd[1] = fConstAdd[2] = 16.0f/255.0f; + switch(copyfmt) { + case 0: // I4 + case 1: // I8 + case 2: // IA4 + case 3: // IA8 + colmat[0] = 0.257f; colmat[1] = 0.504f; colmat[2] = 0.098f; + colmat[4] = 0.257f; colmat[5] = 0.504f; colmat[6] = 0.098f; + colmat[8] = 0.257f; colmat[9] = 0.504f; colmat[10] = 0.098f; + if( copyfmt < 2 ) { + fConstAdd[3] = 16.0f/255.0f; + colmat[12] = 0.257f; colmat[13] = 0.504f; colmat[14] = 0.098f; + } + else { // alpha + colmat[15] = 1; + } + break; + default: + ERROR_LOG("Unknown copy intensity format: 0x%x\n", copyfmt); + colmat[0] = colmat[5] = colmat[10] = colmat[15] = 1; + break; + } + } + else { + switch(copyfmt) { + case 0: // R4 + case 8: // R8 + colmat[0] = colmat[4] = colmat[8] = colmat[12] = 1; + break; + case 2: // RA4 + case 3: // RA8 + colmat[0] = colmat[4] = colmat[8] = colmat[15] = 1; + break; + + case 7: // A8 + colmat[3] = colmat[7] = colmat[11] = colmat[15] = 1; + break; + case 9: // G8 + colmat[1] = colmat[5] = colmat[9] = colmat[13] = 1; + break; + case 10: // B8 + colmat[2] = colmat[6] = colmat[10] = colmat[14] = 1; + break; + case 11: // RG8 + colmat[0] = colmat[4] = colmat[8] = colmat[13] = 1; + break; + case 12: // GB8 + colmat[1] = colmat[5] = colmat[9] = colmat[14] = 1; + break; + + case 4: // RGB565 + colmat[0] = colmat[5] = colmat[10] = 1; + fConstAdd[3] = 1; // set alpha to 1 + break; + case 5: // RGB5A3 + case 6: // RGBA8 + colmat[0] = colmat[5] = colmat[10] = colmat[15] = 1; + break; + + default: + ERROR_LOG("Unknown copy color format: 0x%x\n", copyfmt); + colmat[0] = colmat[5] = colmat[10] = colmat[15] = 1; + break; + } + } + +// if( bCopyToTarget ) { +// _assert_( glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) == GL_FRAMEBUFFER_COMPLETE_EXT ); +// glReadBuffer(GL_COLOR_ATTACHMENT0_EXT); +// GL_REPORT_ERRORD(); +// glCopyTexSubImage2D(GL_TEXTURE_RECTANGLE_NV, 0, 0, 0, source->left, source->top, source->right-source->left, source->bottom-source->top); +// entry.isUpsideDown = true; // note that the copy is upside down!! +// GL_REPORT_ERRORD(); +// return; +// } + + Renderer::SetRenderMode(Renderer::RM_Normal); // set back to normal + GL_REPORT_ERRORD(); + + // have to run a pixel shader + + Renderer::ResetGLState(); // reset any game specific settings + + if( s_TempFramebuffer == 0 ) + glGenFramebuffersEXT( 1, &s_TempFramebuffer); + + Renderer::SetFramebuffer(s_TempFramebuffer); + Renderer::SetRenderTarget(entry.texture); + GL_REPORT_ERRORD(); + + // create and attach the render target + std::map::iterator itdepth = mapDepthTargets.find((h<<16)|w); + + if( itdepth == mapDepthTargets.end() ) { + DEPTHTARGET& depth = mapDepthTargets[(h<<16)|w]; + depth.framecount = frameCount; + glGenRenderbuffersEXT( 1, &depth.targ); + glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, depth.targ); + glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT/*GL_DEPTH24_STENCIL8_EXT*/, w, h); + GL_REPORT_ERRORD(); + Renderer::SetDepthTarget(depth.targ); + GL_REPORT_ERRORD(); + } + else { + itdepth->second.framecount = frameCount; + Renderer::SetDepthTarget(itdepth->second.targ); + GL_REPORT_ERRORD(); + } + + glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT); + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_RECTANGLE_NV, bFromZBuffer?Renderer::GetZBufferTarget():Renderer::GetRenderTarget()); + TextureMngr::EnableTexRECT(0); + + glViewport(0, 0, w, h); + + glEnable(GL_FRAGMENT_PROGRAM_ARB); + glBindProgramARB( GL_FRAGMENT_PROGRAM_ARB, PixelShaderMngr::GetColorMatrixProgram()); + PixelShaderMngr::SetColorMatrix(colmat, fConstAdd); // set transformation + GL_REPORT_ERRORD(); + + glBegin(GL_QUADS); + glTexCoord2f((float)source->left, Renderer::GetTargetHeight()-(float)source->bottom); glVertex2f(-1,1); + glTexCoord2f((float)source->left, Renderer::GetTargetHeight()-(float)source->top); glVertex2f(-1,-1); + glTexCoord2f((float)source->right, Renderer::GetTargetHeight()-(float)source->top); glVertex2f(1,-1); + glTexCoord2f((float)source->right, Renderer::GetTargetHeight()-(float)source->bottom); glVertex2f(1,1); + glEnd(); + + GL_REPORT_ERRORD(); + + Renderer::SetFramebuffer(0); + Renderer::RestoreGLState(); + VertexShaderMngr::SetViewportChanged(); + + TextureMngr::DisableStage(0); + + if( bFromZBuffer ) + Renderer::SetZBufferRender(); // notify for future settings + + GL_REPORT_ERRORD(); + //SaveTexture("frame.tga", GL_TEXTURE_RECTANGLE_NV, entry.texture, entry.w, entry.h); + //SaveTexture("tex.tga", GL_TEXTURE_RECTANGLE_NV, Renderer::GetZBufferTarget(), Renderer::GetTargetWidth(), Renderer::GetTargetHeight()); +} + +void TextureMngr::EnableTex2D(int stage) +{ + if( !(nTex2DEnabled & (1< +#include "BPStructs.h" + +struct TRectangle +{ + int left, top, right, bottom; +}; + +class TextureMngr +{ +public: + struct TCacheEntry + { + TCacheEntry() : texture(0), addr(0), hash(0), w(0), h(0), isRenderTarget(false), isUpsideDown(false), isNonPow2(true), bHaveMipMaps(false) { mode.hex = 0xFCFCFCFC; } + + u32 texture; + u32 addr; + u32 hash; + u32 paletteHash; + u32 hashoffset; + u32 oldpixel; // used for simple cleanup + TexMode0 mode; // current filter and clamp modes that texture is set to + + int frameCount; + int w,h,fmt; + + bool isRenderTarget; // if render texture, then rendertex is filled with the direct copy of the render target + // later conversions would have to convert properly from rendertexfmt to texfmt + bool isUpsideDown; + bool isNonPow2; // if nonpow2, use GL_TEXTURE_2D, else GL_TEXTURE_RECTANGLE_NV + bool bHaveMipMaps; + + void SetTextureParameters(TexMode0& newmode); + void Destroy(); + void ConvertFromRenderTarget(u32 taddr, int twidth, int theight, int tformat, int tlutaddr, int tlutfmt); + }; + + struct DEPTHTARGET + { + DEPTHTARGET() : targ(0), framecount(0) {} + GLuint targ; + int framecount; + }; + +private: + typedef std::map TexCache; + + static u8 *temp; + static TexCache textures; + static std::map mapDepthTargets; + static int nTex2DEnabled, nTexRECTEnabled; + +public: + + static void Init(); + static void Cleanup(); + static void Shutdown(); + static void Invalidate(); + static TCacheEntry* Load(int texstage, u32 address, int width, int height, int format, int tlutaddr, int tlutfmt); + static void CopyRenderTargetToTexture(u32 address, bool bFromZBuffer, bool bIsIntensityFmt, u32 copyfmt, bool bScaleByHalf, TRectangle *source); + + static void EnableTex2D(int stage); + static void EnableTexRECT(int stage); + static void DisableStage(int stage); // sets active texture +}; + +#endif diff --git a/Source/Plugins/Plugin_VideoOGL/Src/VertexLoader.cpp b/Source/Plugins/Plugin_VideoOGL/Src/VertexLoader.cpp new file mode 100644 index 0000000000..66a174a571 --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/VertexLoader.cpp @@ -0,0 +1,1158 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "Globals.h" +#include +#include + +#include "x64Emitter.h" + +#include "VertexLoader.h" +#include "BPStructs.h" +#include "DataReader.h" + +#include "VertexShader.h" +#include "PixelShader.h" +#include "TextureMngr.h" + +#include "MemoryUtil.h" + +#include + +#define MAX_BUFFER_SIZE 0x4000 + +// CP state +u32 arraybases[16]; +u32 arraystrides[16]; + +// internal state for loading vertices +static u32 s_prevvbstride, s_prevcomponents; // previous state set +static u8 *s_pBaseBufferPointer = NULL; +static GLuint s_vboBuffers[0x40] = {0}; +static int s_nCurVBOIndex = 0; // current free buffer +static GLenum s_prevprimitive = 0; // current primitive type +static vector< pair > s_vStoredPrimitives; // every element, mode and count to be passed to glDrawArrays +static void (*fnSetupVertexPointers)() = NULL; + +//these don't need to be saved +float posScale; +float tcScale[8]; +int colElements[2]; +float tcScaleU[8]; +float tcScaleV[8]; +int tcIndex; +int colIndex; + +inline u8 ReadBuffer8() +{ + return g_pDataReader->Read8(); +} + +inline u16 ReadBuffer16() +{ + //PowerPC byte ordering :( + return g_pDataReader->Read16(); +} + +inline u32 ReadBuffer32() +{ + //PowerPC byte ordering :( + return g_pDataReader->Read32(); +} + +inline float ReadBuffer32F() +{ + u32 temp = g_pDataReader->Read32(); + return *(float*)(&temp); +} + +// ============================================================================== +// Direct +// ============================================================================== +static u8 s_curposmtx, s_curtexmtx[8]; +static int s_texmtxwrite = 0, s_texmtxread = 0; + +void LOADERDECL PosMtx_ReadDirect_UByte(void* _p) +{ + s_curposmtx = ReadBuffer8()&0x3f; + PRIM_LOG("posmtx: %d, ", s_curposmtx); +} + +void LOADERDECL PosMtx_Write(void* _p) +{ + *VertexManager::s_pCurBufferPointer++ = s_curposmtx; + //*VertexManager::s_pCurBufferPointer++ = 0; + //*VertexManager::s_pCurBufferPointer++ = 0; + //*VertexManager::s_pCurBufferPointer++ = 0; +} + +void LOADERDECL TexMtx_ReadDirect_UByte(void* _p) +{ + s_curtexmtx[s_texmtxread] = ReadBuffer8()&0x3f; + PRIM_LOG("texmtx%d: %d, ", s_texmtxread, s_curtexmtx[s_texmtxread]); + s_texmtxread++; +} + +void LOADERDECL TexMtx_Write_Float(void* _p) +{ + *(float*)VertexManager::s_pCurBufferPointer = (float)s_curtexmtx[s_texmtxwrite++]; + VertexManager::s_pCurBufferPointer += 4; +} + +void LOADERDECL TexMtx_Write_Float2(void* _p) +{ + ((float*)VertexManager::s_pCurBufferPointer)[0] = 0; + ((float*)VertexManager::s_pCurBufferPointer)[1] = (float)s_curtexmtx[s_texmtxwrite++]; + VertexManager::s_pCurBufferPointer += 8; +} + +void LOADERDECL TexMtx_Write_Short3(void* _p) +{ + ((s16*)VertexManager::s_pCurBufferPointer)[0] = 0; + ((s16*)VertexManager::s_pCurBufferPointer)[1] = 0; + ((s16*)VertexManager::s_pCurBufferPointer)[2] = s_curtexmtx[s_texmtxwrite++]; + VertexManager::s_pCurBufferPointer += 6; +} + +#include "VertexLoader_Position.h" +#include "VertexLoader_Normal.h" +#include "VertexLoader_Color.h" +#include "VertexLoader_TextCoord.h" + +VertexLoader g_VertexLoaders[8]; + +#define COMPILED_CODE_SIZE 4096 + +VertexLoader::VertexLoader() +{ + m_numPipelineStates = 0; + m_VertexSize = 0; + m_AttrDirty = 2; + VertexLoader_Normal::Init(); + + m_compiledCode = (u8 *)AllocateExecutableMemory(COMPILED_CODE_SIZE); + if (m_compiledCode) { + memset(m_compiledCode, 0, COMPILED_CODE_SIZE); + } +} + +VertexLoader::~VertexLoader() +{ + FreeMemoryPages(m_compiledCode, COMPILED_CODE_SIZE); +} + +int VertexLoader::ComputeVertexSize() +{ + if (m_AttrDirty < 2) { + + if (m_VtxDesc.Hex0 == VertexManager::GetVtxDesc().Hex0 && (m_VtxDesc.Hex1&1)==(VertexManager::GetVtxDesc().Hex1&1)) + return m_VertexSize; + + m_VtxDesc.Hex = VertexManager::GetVtxDesc().Hex; + } + else { + // set anyway + m_VtxDesc.Hex = VertexManager::GetVtxDesc().Hex; + } + + if( fnSetupVertexPointers != NULL && fnSetupVertexPointers == (void (*)())(void*)m_compiledCode ) + VertexManager::Flush(); + + m_AttrDirty = 1; + m_VertexSize = 0; + // Position Matrix Index + if (m_VtxDesc.PosMatIdx) + m_VertexSize += 1; + + // Texture matrix indices + if (m_VtxDesc.Tex0MatIdx) {m_VertexSize+=1; } + if (m_VtxDesc.Tex1MatIdx) {m_VertexSize+=1; } + if (m_VtxDesc.Tex2MatIdx) {m_VertexSize+=1; } + if (m_VtxDesc.Tex3MatIdx) {m_VertexSize+=1; } + if (m_VtxDesc.Tex4MatIdx) {m_VertexSize+=1; } + if (m_VtxDesc.Tex5MatIdx) {m_VertexSize+=1; } + if (m_VtxDesc.Tex6MatIdx) {m_VertexSize+=1; } + if (m_VtxDesc.Tex7MatIdx) {m_VertexSize+=1; } + + switch (m_VtxDesc.Position) { + case NOT_PRESENT: {_assert_("Vertex descriptor without position!");} break; + case DIRECT: + { + switch (m_VtxAttr.PosFormat) { + case FORMAT_UBYTE: + case FORMAT_BYTE: m_VertexSize += m_VtxAttr.PosElements?3:2; break; + case FORMAT_USHORT: + case FORMAT_SHORT: m_VertexSize += m_VtxAttr.PosElements?6:4; break; + case FORMAT_FLOAT: m_VertexSize += m_VtxAttr.PosElements?12:8; break; + default: _assert_(0); break; + } + } + break; + case INDEX8: + m_VertexSize+=1; + break; + case INDEX16: + m_VertexSize+=2; + break; + } + + if (m_VtxDesc.Normal != NOT_PRESENT) + m_VertexSize += VertexLoader_Normal::GetSize(m_VtxDesc.Normal, m_VtxAttr.NormalFormat, m_VtxAttr.NormalElements); + + // Colors + int col[2] = {m_VtxDesc.Color0, m_VtxDesc.Color1}; + for (int i = 0; i < 2; i++) { + switch (col[i]) + { + case NOT_PRESENT: + break; + case DIRECT: + switch (m_VtxAttr.color[i].Comp) + { + case FORMAT_16B_565: m_VertexSize+=2; break; + case FORMAT_24B_888: m_VertexSize+=3; break; + case FORMAT_32B_888x: m_VertexSize+=4; break; + case FORMAT_16B_4444: m_VertexSize+=2; break; + case FORMAT_24B_6666: m_VertexSize+=3; break; + case FORMAT_32B_8888: m_VertexSize+=4; break; + default: _assert_(0); break; + } + break; + case INDEX8: + m_VertexSize+=1; + break; + case INDEX16: + m_VertexSize+=2; + break; + } + } + + // TextureCoord + int tc[8] = { + m_VtxDesc.Tex0Coord, m_VtxDesc.Tex1Coord, m_VtxDesc.Tex2Coord, m_VtxDesc.Tex3Coord, + m_VtxDesc.Tex4Coord, m_VtxDesc.Tex5Coord, m_VtxDesc.Tex6Coord, m_VtxDesc.Tex7Coord, + }; + + for (int i = 0; i < 8; i++) { + switch (tc[i]) { + case NOT_PRESENT: + break; + case DIRECT: + { + switch (m_VtxAttr.texCoord[i].Format) + { + case FORMAT_UBYTE: + case FORMAT_BYTE: m_VertexSize += m_VtxAttr.texCoord[i].Elements?2:1; break; + case FORMAT_USHORT: + case FORMAT_SHORT: m_VertexSize += m_VtxAttr.texCoord[i].Elements?4:2; break; + case FORMAT_FLOAT: m_VertexSize += m_VtxAttr.texCoord[i].Elements?8:4; break; + default: _assert_(0); break; + } + } + break; + case INDEX8: + m_VertexSize+=1; + break; + case INDEX16: + m_VertexSize+=2; + break; + } + } + + return m_VertexSize; +} + + +// Note the use of CallCdeclFunction3I etc. +// This is a horrible hack that is necessary because Opengl32.dll is based way, way above the 32-bit address space +// that is within reach of a CALL, and just doing &fn gives us these high uncallable addresses. So we want to grab +// the function pointers from the import table instead. + +// This problem does not apply to glew functions, only core opengl32 functions. + +DECLARE_IMPORT(glNormalPointer); +DECLARE_IMPORT(glVertexPointer); +DECLARE_IMPORT(glColorPointer); +DECLARE_IMPORT(glTexCoordPointer); + +void VertexLoader::ProcessFormat() +{ + using namespace Gen; + + //_assert_( VertexManager::s_pCurBufferPointer == s_pBaseBufferPointer ); + + if (!m_AttrDirty ) { + + if (m_VtxDesc.Hex0 == VertexManager::GetVtxDesc().Hex0 && (m_VtxDesc.Hex1&1)==(VertexManager::GetVtxDesc().Hex1&1)) + // same + return; + + m_VtxDesc.Hex = VertexManager::GetVtxDesc().Hex; + } + else { + // set anyway + m_VtxDesc.Hex = VertexManager::GetVtxDesc().Hex; + m_AttrDirty = 0; + } + + DVSTARTPROFILE(); + + // Reset pipeline + m_VBStridePad = 0; + m_VBVertexStride = 0; + m_numPipelineStates = 0; + m_components = 0; + + // m_VBVertexStride for texmtx and posmtx is computed later when writing + + // Position Matrix Index + if (m_VtxDesc.PosMatIdx) { + m_PipelineStates[m_numPipelineStates++] = PosMtx_ReadDirect_UByte; + m_components |= VB_HAS_POSMTXIDX; + } + + if (m_VtxDesc.Tex0MatIdx) {m_components|=VB_HAS_TEXMTXIDX0; WriteCall(TexMtx_ReadDirect_UByte); } + if (m_VtxDesc.Tex1MatIdx) {m_components|=VB_HAS_TEXMTXIDX1; WriteCall(TexMtx_ReadDirect_UByte); } + if (m_VtxDesc.Tex2MatIdx) {m_components|=VB_HAS_TEXMTXIDX2; WriteCall(TexMtx_ReadDirect_UByte); } + if (m_VtxDesc.Tex3MatIdx) {m_components|=VB_HAS_TEXMTXIDX3; WriteCall(TexMtx_ReadDirect_UByte); } + if (m_VtxDesc.Tex4MatIdx) {m_components|=VB_HAS_TEXMTXIDX4; WriteCall(TexMtx_ReadDirect_UByte); } + if (m_VtxDesc.Tex5MatIdx) {m_components|=VB_HAS_TEXMTXIDX5; WriteCall(TexMtx_ReadDirect_UByte); } + if (m_VtxDesc.Tex6MatIdx) {m_components|=VB_HAS_TEXMTXIDX6; WriteCall(TexMtx_ReadDirect_UByte); } + if (m_VtxDesc.Tex7MatIdx) {m_components|=VB_HAS_TEXMTXIDX7; WriteCall(TexMtx_ReadDirect_UByte); } + + // Position + if (m_VtxDesc.Position != NOT_PRESENT) + m_VBVertexStride += 12; + + switch (m_VtxDesc.Position) { + case NOT_PRESENT: {_assert_msg_(0,"Vertex descriptor without position!","WTF?");} break; + case DIRECT: + { + switch (m_VtxAttr.PosFormat) { + case FORMAT_UBYTE: WriteCall(Pos_ReadDirect_UByte); break; + case FORMAT_BYTE: WriteCall(Pos_ReadDirect_Byte); break; + case FORMAT_USHORT: WriteCall(Pos_ReadDirect_UShort); break; + case FORMAT_SHORT: WriteCall(Pos_ReadDirect_Short); break; + case FORMAT_FLOAT: WriteCall(Pos_ReadDirect_Float); break; + default: _assert_(0); break; + } + } + break; + case INDEX8: + switch (m_VtxAttr.PosFormat) { + case FORMAT_UBYTE: WriteCall(Pos_ReadIndex8_UByte); break; //WTF? + case FORMAT_BYTE: WriteCall(Pos_ReadIndex8_Byte); break; + case FORMAT_USHORT: WriteCall(Pos_ReadIndex8_UShort); break; + case FORMAT_SHORT: WriteCall(Pos_ReadIndex8_Short); break; + case FORMAT_FLOAT: WriteCall(Pos_ReadIndex8_Float); break; + default: _assert_(0); break; + } + break; + case INDEX16: + switch (m_VtxAttr.PosFormat) { + case FORMAT_UBYTE: WriteCall(Pos_ReadIndex16_UByte); break; + case FORMAT_BYTE: WriteCall(Pos_ReadIndex16_Byte); break; + case FORMAT_USHORT: WriteCall(Pos_ReadIndex16_UShort); break; + case FORMAT_SHORT: WriteCall(Pos_ReadIndex16_Short); break; + case FORMAT_FLOAT: WriteCall(Pos_ReadIndex16_Float); break; + default: _assert_(0); break; + } + break; + } + + // Normals + if (m_VtxDesc.Normal != NOT_PRESENT) { + VertexLoader_Normal::index3 = m_VtxAttr.NormalIndex3 ? true : false; + unsigned int uSize = VertexLoader_Normal::GetSize(m_VtxDesc.Normal, m_VtxAttr.NormalFormat, m_VtxAttr.NormalElements); + TPipelineFunction pFunc = VertexLoader_Normal::GetFunction(m_VtxDesc.Normal, m_VtxAttr.NormalFormat, m_VtxAttr.NormalElements); + if (pFunc == 0) + { + char temp[256]; + sprintf(temp,"%i %i %i", m_VtxDesc.Normal, m_VtxAttr.NormalFormat, m_VtxAttr.NormalElements); + SysMessage("VertexLoader_Normal::GetFunction returned zero!"); + } + WriteCall(pFunc); + + int sizePro=0; + switch (m_VtxAttr.NormalFormat) + { + case FORMAT_UBYTE: sizePro=1; break; + case FORMAT_BYTE: sizePro=1; break; + case FORMAT_USHORT: sizePro=2; break; + case FORMAT_SHORT: sizePro=2; break; + case FORMAT_FLOAT: sizePro=4; break; + default: _assert_(0); break; + } + m_VBVertexStride += sizePro * 3 * (m_VtxAttr.NormalElements?3:1); + + int m_numNormals = (m_VtxAttr.NormalElements==1) ? NRM_THREE : NRM_ONE; + m_components |= VB_HAS_NRM0; + if (m_numNormals == NRM_THREE) + m_components |= VB_HAS_NRM1 | VB_HAS_NRM2; + } + + // Colors + int col[2] = {m_VtxDesc.Color0, m_VtxDesc.Color1}; + for (int i = 0; i < 2; i++) { + SetupColor(i,col[i], m_VtxAttr.color[i].Comp, m_VtxAttr.color[i].Elements); + + if (col[i] != NOT_PRESENT ) + m_VBVertexStride+=4; + } + + // TextureCoord + int tc[8] = { + m_VtxDesc.Tex0Coord, m_VtxDesc.Tex1Coord, m_VtxDesc.Tex2Coord, m_VtxDesc.Tex3Coord, + m_VtxDesc.Tex4Coord, m_VtxDesc.Tex5Coord, m_VtxDesc.Tex6Coord, m_VtxDesc.Tex7Coord, + }; + + // Texture matrix indices (remove if corresponding texture coordinate isn't enabled) + for (int i = 0; i < 8; i++) { + SetupTexCoord(i, tc[i], m_VtxAttr.texCoord[i].Format, m_VtxAttr.texCoord[i].Elements, m_VtxAttr.texCoord[i].Frac); + + if( m_components&(VB_HAS_TEXMTXIDX0< COMPILED_CODE_SIZE) + { + assert(0); + Crash(); + } + + SetCodePtr(0); +} + +void VertexLoader::PrepareRun() +{ + posScale = VertexManager::shiftLookup[m_VtxAttr.PosFrac]; + if( m_components & VB_HAS_UVALL ) { + for (int i = 0; i < 8; i++) { + tcScaleU[i] = VertexManager::shiftLookup[m_VtxAttr.texCoord[i].Frac]; + tcScaleV[i] = VertexManager::shiftLookup[m_VtxAttr.texCoord[i].Frac]; + } + } + for (int i = 0; i < 2; i++) + colElements[i] = m_VtxAttr.color[i].Elements; +} + +void VertexLoader::SetupColor(int num, int mode, int format, int elements) +{ + // if COL0 not present, then embed COL1 into COL0 + if( num == 1 && !(m_components & VB_HAS_COL0) ) num = 0; + + m_components |= VB_HAS_COL0 << num; + switch (mode) + { + case NOT_PRESENT: + m_components &= ~(VB_HAS_COL0 << num); + break; + case DIRECT: + switch (format) + { + case FORMAT_16B_565: WriteCall(Color_ReadDirect_16b_565); break; + case FORMAT_24B_888: WriteCall(Color_ReadDirect_24b_888); break; + case FORMAT_32B_888x: WriteCall(Color_ReadDirect_32b_888x); break; + case FORMAT_16B_4444: WriteCall(Color_ReadDirect_16b_4444); break; + case FORMAT_24B_6666: WriteCall(Color_ReadDirect_24b_6666); break; + case FORMAT_32B_8888: WriteCall(Color_ReadDirect_32b_8888); break; + default: _assert_(0); break; + } + break; + case INDEX8: + switch (format) + { + case FORMAT_16B_565: WriteCall(Color_ReadIndex8_16b_565); break; + case FORMAT_24B_888: WriteCall(Color_ReadIndex8_24b_888); break; + case FORMAT_32B_888x: WriteCall(Color_ReadIndex8_32b_888x); break; + case FORMAT_16B_4444: WriteCall(Color_ReadIndex8_16b_4444); break; + case FORMAT_24B_6666: WriteCall(Color_ReadIndex8_24b_6666); break; + case FORMAT_32B_8888: WriteCall(Color_ReadIndex8_32b_8888); break; + default: _assert_(0); break; + } + break; + case INDEX16: + switch (format) + { + case FORMAT_16B_565: WriteCall(Color_ReadIndex16_16b_565); break; + case FORMAT_24B_888: WriteCall(Color_ReadIndex16_24b_888); break; + case FORMAT_32B_888x: WriteCall(Color_ReadIndex16_32b_888x); break; + case FORMAT_16B_4444: WriteCall(Color_ReadIndex16_16b_4444); break; + case FORMAT_24B_6666: WriteCall(Color_ReadIndex16_24b_6666); break; + case FORMAT_32B_8888: WriteCall(Color_ReadIndex16_32b_8888); break; + default: _assert_(0); break; + } + break; + } +} + +void VertexLoader::SetupTexCoord(int num, int mode, int format, int elements, int _iFrac) +{ + m_components |= VB_HAS_UV0 << num; + + switch (mode) + { + case NOT_PRESENT: + m_components &= ~(VB_HAS_UV0 << num); + break; + case DIRECT: + switch (format) + { + case FORMAT_UBYTE: WriteCall(elements?TexCoord_ReadDirect_UByte2:TexCoord_ReadDirect_UByte1); break; + case FORMAT_BYTE: WriteCall(elements?TexCoord_ReadDirect_Byte2:TexCoord_ReadDirect_Byte1); break; + case FORMAT_USHORT: WriteCall(elements?TexCoord_ReadDirect_UShort2:TexCoord_ReadDirect_UShort1); break; + case FORMAT_SHORT: WriteCall(elements?TexCoord_ReadDirect_Short2:TexCoord_ReadDirect_Short1); break; + case FORMAT_FLOAT: WriteCall(elements?TexCoord_ReadDirect_Float2:TexCoord_ReadDirect_Float1); break; + default: _assert_(0); break; + } + break; + case INDEX8: + switch (format) + { + case FORMAT_UBYTE: WriteCall(elements?TexCoord_ReadIndex8_UByte2:TexCoord_ReadIndex8_UByte1); break; + case FORMAT_BYTE: WriteCall(elements?TexCoord_ReadIndex8_Byte2:TexCoord_ReadIndex8_Byte1); break; + case FORMAT_USHORT: WriteCall(elements?TexCoord_ReadIndex8_UShort2:TexCoord_ReadIndex8_UShort1); break; + case FORMAT_SHORT: WriteCall(elements?TexCoord_ReadIndex8_Short2:TexCoord_ReadIndex8_Short1); break; + case FORMAT_FLOAT: WriteCall(elements?TexCoord_ReadIndex8_Float2:TexCoord_ReadIndex8_Float1); break; + default: _assert_(0); break; + } + break; + case INDEX16: + switch (format) + { + case FORMAT_UBYTE: WriteCall(elements?TexCoord_ReadIndex16_UByte2:TexCoord_ReadIndex16_UByte1); break; + case FORMAT_BYTE: WriteCall(elements?TexCoord_ReadIndex16_Byte2:TexCoord_ReadIndex16_Byte1); break; + case FORMAT_USHORT: WriteCall(elements?TexCoord_ReadIndex16_UShort2:TexCoord_ReadIndex16_UShort1); break; + case FORMAT_SHORT: WriteCall(elements?TexCoord_ReadIndex16_Short2:TexCoord_ReadIndex16_Short1); break; + case FORMAT_FLOAT: WriteCall(elements?TexCoord_ReadIndex16_Float2:TexCoord_ReadIndex16_Float1); break; + default: _assert_(0); + } + break; + } +} + +void VertexLoader::WriteCall(void (LOADERDECL *func)(void *)) +{ + m_PipelineStates[m_numPipelineStates++] = func;; +} + +void VertexLoader::RunVertices(int primitive, int count) +{ + if( count <= 0 ) + return; + + if( fnSetupVertexPointers != NULL && fnSetupVertexPointers != (void (*)())(void*)m_compiledCode ) + VertexManager::Flush(); + + if( bpmem.genMode.cullmode == 3 && primitive < 5) { + // if cull mode is none, ignore triangles and quads + g_pDataReader->Skip(count*m_VertexSize); + return; + } + + DVSTARTPROFILE(); + ProcessFormat(); + + fnSetupVertexPointers = (void (*)())(void*)m_compiledCode; + + if (s_prevcomponents != m_components) { + + VertexManager::Flush(); + + // matrices + if ((m_components & VB_HAS_POSMTXIDX) != (s_prevcomponents&VB_HAS_POSMTXIDX)) { + if (m_components & VB_HAS_POSMTXIDX) + glEnableVertexAttribArray(SHADER_POSMTX_ATTRIB); + else + glDisableVertexAttribArray(SHADER_POSMTX_ATTRIB); + } + + // normals + if ((m_components & VB_HAS_NRM0) != (s_prevcomponents&VB_HAS_NRM0)) { + if (m_components & VB_HAS_NRM0) + glEnableClientState(GL_NORMAL_ARRAY); + else + glDisableClientState(GL_NORMAL_ARRAY); + } + if ((m_components & VB_HAS_NRM1) != (s_prevcomponents&VB_HAS_NRM1)) { + if (m_components & VB_HAS_NRM1) { + glEnableVertexAttribArray(SHADER_NORM1_ATTRIB); + glEnableVertexAttribArray(SHADER_NORM2_ATTRIB); + } + else { + glDisableVertexAttribArray(SHADER_NORM1_ATTRIB); + glDisableVertexAttribArray(SHADER_NORM2_ATTRIB); + } + } + + // color + for(int i = 0; i < 2; ++i) { + if ( (m_components & (VB_HAS_COL0 << i)) != (s_prevcomponents & (VB_HAS_COL0 << i)) ) { + if (m_components & (VB_HAS_COL0 << 0)) + glEnableClientState(i?GL_SECONDARY_COLOR_ARRAY:GL_COLOR_ARRAY); + else + glDisableClientState(i?GL_SECONDARY_COLOR_ARRAY:GL_COLOR_ARRAY); + } + } + + // tex + for (int i = 0; i < 8; ++i) { + if ((m_components&(VB_HAS_UV0< 0 ) + VertexManager::AddVertices(primitive, v-startv+extraverts); + VertexManager::Flush(); + + switch( primitive ) { + case 3: // triangle strip, copy last two vertices + + // a little trick since we have to keep track of signs + if( v & 1 ) { + memcpy_gc(VertexManager::s_pCurBufferPointer, plastptr-2*m_VBVertexStride, m_VBVertexStride); + memcpy_gc(VertexManager::s_pCurBufferPointer+m_VBVertexStride, plastptr-m_VBVertexStride*2, 2*m_VBVertexStride); + VertexManager::s_pCurBufferPointer += m_VBVertexStride*3; + extraverts = 3; + } + else { + memcpy_gc(VertexManager::s_pCurBufferPointer, plastptr-m_VBVertexStride*2, m_VBVertexStride*2); + VertexManager::s_pCurBufferPointer += m_VBVertexStride*2; + extraverts = 2; + } + break; + case 4: // tri fan, copy first and last vert + memcpy_gc(VertexManager::s_pCurBufferPointer, plastptr-m_VBVertexStride*(v-startv+extraverts), m_VBVertexStride); + VertexManager::s_pCurBufferPointer += m_VBVertexStride; + memcpy_gc(VertexManager::s_pCurBufferPointer, plastptr-m_VBVertexStride, m_VBVertexStride); + VertexManager::s_pCurBufferPointer += m_VBVertexStride; + extraverts = 2; + break; + case 6: // line strip + memcpy_gc(VertexManager::s_pCurBufferPointer, plastptr-m_VBVertexStride, m_VBVertexStride); + VertexManager::s_pCurBufferPointer += m_VBVertexStride; + extraverts = 1; + break; + default: + extraverts = 0; + } + + startv = v; + } + } + + tcIndex = 0; + colIndex = 0; + s_texmtxwrite = s_texmtxread = 0; + for (int i = 0; i < m_numPipelineStates; i++) + m_PipelineStates[i](&m_VtxAttr); + VertexManager::s_pCurBufferPointer += m_VBStridePad; + PRIM_LOG("\n"); + } + + if( startv < count ) + VertexManager::AddVertices(primitive, count-startv+extraverts); +} + +/////////////////// +// VertexManager // +/////////////////// + +TVtxDesc VertexManager::s_GlobalVtxDesc; +u8* VertexManager::s_pCurBufferPointer=NULL; +float VertexManager::shiftLookup[32]; + +const GLenum c_primitiveType[8] = +{ + GL_QUADS, + 0, //nothing + GL_TRIANGLES, + GL_TRIANGLE_STRIP, + GL_TRIANGLE_FAN, + GL_LINES, + GL_LINE_STRIP, + GL_POINTS +}; + +bool VertexManager::Init() +{ + Destroy(); + + s_GlobalVtxDesc.Hex = 0; + s_prevcomponents = 0; + s_prevvbstride = 12; // just pos + s_prevprimitive = 0; + s_pBaseBufferPointer = (u8*)_aligned_malloc(MAX_BUFFER_SIZE, 256); + s_pCurBufferPointer = s_pBaseBufferPointer; + + for (int i = 0; i < ARRAYSIZE(shiftLookup); i++) + shiftLookup[i] = 1.0f / float(1 << i); + + s_nCurVBOIndex = 0; + glGenBuffers(ARRAYSIZE(s_vboBuffers), s_vboBuffers); + for (int i = 0; i < ARRAYSIZE(s_vboBuffers); ++i) { + glBindBuffer(GL_ARRAY_BUFFER, s_vboBuffers[i]); + glBufferData(GL_ARRAY_BUFFER, MAX_BUFFER_SIZE, NULL, GL_STREAM_DRAW); + } + + glEnableClientState(GL_VERTEX_ARRAY); + fnSetupVertexPointers = NULL; + GL_REPORT_ERRORD(); + + return true; +} + +void VertexManager::Destroy() +{ + _aligned_free(s_pBaseBufferPointer); s_pBaseBufferPointer = s_pCurBufferPointer = NULL; + glDeleteBuffers(ARRAYSIZE(s_vboBuffers), s_vboBuffers); + memset(s_vboBuffers, 0, sizeof(s_vboBuffers)); + + s_vStoredPrimitives.resize(0); + s_nCurVBOIndex = 0; + ResetBuffer(); +} + +void VertexManager::ResetBuffer() +{ + s_nCurVBOIndex = (s_nCurVBOIndex+1)%ARRAYSIZE(s_vboBuffers); + s_pCurBufferPointer = s_pBaseBufferPointer; + s_vStoredPrimitives.resize(0); +} + +void VertexManager::ResetComponents() +{ + s_prevcomponents = 0; + s_prevvbstride = 12; // just pos + s_prevprimitive = 0; + glDisableVertexAttribArray(SHADER_POSMTX_ATTRIB); + glDisableClientState(GL_NORMAL_ARRAY); + glDisableVertexAttribArray(SHADER_NORM1_ATTRIB); + glDisableVertexAttribArray(SHADER_NORM2_ATTRIB); + glDisableClientState(GL_COLOR_ARRAY); + glDisableClientState(GL_SECONDARY_COLOR_ARRAY); + for (int i = 0; i < 8; ++i) glDisableClientState(GL_TEXTURE_COORD_ARRAY); +} + +int VertexManager::GetRemainingSize() +{ + return MAX_BUFFER_SIZE - (int)(s_pCurBufferPointer-s_pBaseBufferPointer); +} + +void VertexManager::AddVertices(int primitive, int numvertices) +{ + _assert_( numvertices > 0 ); + + ADDSTAT(stats.thisFrame.numPrims, numvertices); + s_vStoredPrimitives.push_back(pair(c_primitiveType[primitive], numvertices)); + + static const char *sprims[8] = {"quads", "nothing", "tris", "tstrip", "tfan", "lines", "lstrip", "points"}; + PRIM_LOG("prim: %s, c=%d\n", sprims[primitive], numvertices); +} + +void VertexManager::Flush() +{ + if (s_vStoredPrimitives.size() == 0) + return; + + _assert_( fnSetupVertexPointers != NULL ); + _assert_( s_pCurBufferPointer != s_pBaseBufferPointer ); + +#ifdef _DEBUG + PRIM_LOG("frame%d:\ncomps=0x%x, texgen=%d, numchan=%d, dualtex=%d, ztex=%d, proj=%d, cole=%d, alpe=%d, ze=%d\n", g_Config.iSaveTargetId, s_prevcomponents, xfregs.numTexGens, + xfregs.nNumChans, (int)xfregs.bEnableDualTexTransform, bpmem.ztex2.op, VertexShaderMngr::rawProjection[6]==0, + bpmem.blendmode.colorupdate, bpmem.blendmode.alphaupdate, bpmem.zmode.updateenable); + for(int i = 0; i < xfregs.nNumChans; ++i) { + LitChannel* ch = &xfregs.colChans[i].color; + PRIM_LOG("colchan%d: matsrc=%d, light=0x%x, ambsrc=%d, diffunc=%d, attfunc=%d\n", i, ch->matsource, ch->GetFullLightMask(), ch->ambsource, ch->diffusefunc, ch->attnfunc); + ch = &xfregs.colChans[i].alpha; + PRIM_LOG("alpchan%d: matsrc=%d, light=0x%x, ambsrc=%d, diffunc=%d, attfunc=%d\n", i, ch->matsource, ch->GetFullLightMask(), ch->ambsource, ch->diffusefunc, ch->attnfunc); + } + for(int i = 0; i < xfregs.numTexGens; ++i) { + TexMtxInfo tinfo = xfregs.texcoords[i].texmtxinfo; + if( tinfo.texgentype != XF_TEXGEN_EMBOSS_MAP ) tinfo.hex &= 0x7ff; + if( tinfo.texgentype != XF_TEXGEN_REGULAR ) tinfo.projection = 0; + + PRIM_LOG("txgen%d: proj=%d, input=%d, gentype=%d, srcrow=%d, embsrc=%d, emblght=%d, postmtx=%d, postnorm=%d\n", + i, tinfo.projection, tinfo.inputform, tinfo.texgentype, tinfo.sourcerow, tinfo.embosssourceshift, tinfo.embosslightshift, + xfregs.texcoords[i].postmtxinfo.index, xfregs.texcoords[i].postmtxinfo.normalize); + } + + PRIM_LOG("pixel: tev=%d, ind=%d, texgen=%d, dstalpha=%d, alphafunc=0x%x\n", bpmem.genMode.numtevstages+1, bpmem.genMode.numindstages, + bpmem.genMode.numtexgens, (u32)bpmem.dstalpha.enable, (bpmem.alphaFunc.hex>>16)&0xff); +#endif + + DVSTARTPROFILE(); + + GL_REPORT_ERRORD(); + + glBindBuffer(GL_ARRAY_BUFFER, s_vboBuffers[s_nCurVBOIndex]); + glBufferData(GL_ARRAY_BUFFER, s_pCurBufferPointer-s_pBaseBufferPointer, s_pBaseBufferPointer, GL_STREAM_DRAW); + GL_REPORT_ERRORD(); + + // setup the pointers + fnSetupVertexPointers(); + GL_REPORT_ERRORD(); + + // set the textures + { + DVProfileFunc _pf("VertexManager::Flush:textures"); + + u32 usedtextures = 0; + for (u32 i = 0; i < bpmem.genMode.numtevstages+1; ++i) { + if( bpmem.tevorders[i/2].getEnable(i&1) ) + usedtextures |= 1< 0 ) { + for(u32 i = 0; i < bpmem.genMode.numtevstages+1; ++i) { + if( bpmem.tevind[i].IsActive() && bpmem.tevind[i].bt < bpmem.genMode.numindstages ) { + usedtextures |= 1<>2]; + TextureMngr::TCacheEntry* tentry = TextureMngr::Load(i, (tex.texImage3[i&3].image_base/* & 0x1FFFFF*/) << 5, + tex.texImage0[i&3].width+1, tex.texImage0[i&3].height+1, + tex.texImage0[i&3].format, tex.texTlut[i&3].tmem_offset<<9, tex.texTlut[i&3].tlut_format); + + if( tentry != NULL ) { + // texture loaded fine, set dims for pixel shader + if( tentry->isNonPow2 ) { + PixelShaderMngr::SetTexDims(i, tentry->w, tentry->h, tentry->mode.wrap_s, tentry->mode.wrap_t); + nonpow2tex |= 1<mode.wrap_s > 0 ) nonpow2tex |= 1<<(8+i); + if( tentry->mode.wrap_t > 0 ) nonpow2tex |= 1<<(16+i); + } + // if texture is power of two, set to ones (since don't need scaling) + else PixelShaderMngr::SetTexDims(i, tentry->w, tentry->h, 0, 0); + + if( tentry->isNonPow2 ) TextureMngr::EnableTexRECT(i); + else TextureMngr::EnableTex2D(i); + + if( g_Config.iLog & CONF_PRIMLOG ) { + // save the textures + char strfile[255]; + sprintf(strfile, "frames/tex%.3d_%d.tga", g_Config.iSaveTargetId, i); + SaveTexture(strfile, tentry->isNonPow2?GL_TEXTURE_RECTANGLE_ARB:GL_TEXTURE_2D, tentry->texture, tentry->w, tentry->h); + } + } + else { + ERROR_LOG("error loading tex\n"); + TextureMngr::DisableStage(i); // disable since won't be used + } + } + else { + TextureMngr::DisableStage(i); // disable since won't be used + } + } + + PixelShaderMngr::SetTexturesUsed(nonpow2tex); + } + + FRAGMENTSHADER* ps = PixelShaderMngr::GetShader(); + VERTEXSHADER* vs = VertexShaderMngr::GetShader(s_prevcomponents); + _assert_( ps != NULL && vs != NULL ); + + bool bRestoreBuffers = false; + if( Renderer::GetZBufferTarget() ) { + if( bpmem.zmode.updateenable ) { + if( !bpmem.blendmode.colorupdate ) { + Renderer::SetRenderMode(bpmem.blendmode.alphaupdate?Renderer::RM_ZBufferAlpha:Renderer::RM_ZBufferOnly); + } + } + else { + Renderer::SetRenderMode(Renderer::RM_Normal); + // remove temporarily + glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT); + bRestoreBuffers = true; + } + } + else + Renderer::SetRenderMode(Renderer::RM_Normal); + + // set global constants + VertexShaderMngr::SetConstants(*vs); + PixelShaderMngr::SetConstants(*ps); + + // finally bind + glBindProgramARB(GL_VERTEX_PROGRAM_ARB, vs->glprogid); + glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, ps->glprogid); + + PRIM_LOG("\n"); + + int offset = 0; + vector< pair >::iterator it; + FORIT (it, s_vStoredPrimitives) { + glDrawArrays(it->first, offset, it->second); + offset += it->second; + } + +#ifdef _DEBUG + if( g_Config.iLog & CONF_PRIMLOG ) { + // save the shaders + char strfile[255]; + sprintf(strfile, "frames/ps%.3d.txt", g_Config.iSaveTargetId); + std::ofstream fps(strfile); + fps << ps->strprog.c_str(); + sprintf(strfile, "frames/vs%.3d.txt", g_Config.iSaveTargetId); + ofstream fvs(strfile); + fvs << vs->strprog.c_str(); + } + + if( g_Config.iLog & CONF_SAVETARGETS ) { + char str[128]; + sprintf(str, "frames/targ%.3d.tga", g_Config.iSaveTargetId); + Renderer::SaveRenderTarget(str, 0); + } +#endif + g_Config.iSaveTargetId++; + + GL_REPORT_ERRORD(); + + if( bRestoreBuffers ) { + GLenum s_drawbuffers[2] = {GL_COLOR_ATTACHMENT0_EXT, GL_COLOR_ATTACHMENT1_EXT}; + glDrawBuffers(2, s_drawbuffers); + SetColorMask(); + } + + ResetBuffer(); +} + +void VertexManager::LoadCPReg(u32 SubCmd, u32 Value) +{ + switch (SubCmd & 0xF0) + { + case 0x30: + VertexShaderMngr::SetTexMatrixChangedA(Value); + break; + case 0x40: + VertexShaderMngr::SetTexMatrixChangedB(Value); + break; + + case 0x50: + s_GlobalVtxDesc.Hex &= ~0x1FFFF; // keep the Upper bits + s_GlobalVtxDesc.Hex |= Value; + break; + case 0x60: + s_GlobalVtxDesc.Hex &= 0x1FFFF; // keep the lower 17Bits + s_GlobalVtxDesc.Hex |= (u64)Value << 17; + break; + + case 0x70: g_VertexLoaders[SubCmd & 7].SetVAT_group0(Value); _assert_((SubCmd & 0x0F) < 8); break; + case 0x80: g_VertexLoaders[SubCmd & 7].SetVAT_group1(Value); _assert_((SubCmd & 0x0F) < 8); break; + case 0x90: g_VertexLoaders[SubCmd & 7].SetVAT_group2(Value); _assert_((SubCmd & 0x0F) < 8); break; + + case 0xA0: arraybases[SubCmd & 0xF] = Value & 0xFFFFFFFF; break; + case 0xB0: arraystrides[SubCmd & 0xF] = Value & 0xFF; break; + } +} + +size_t VertexManager::SaveLoadState(char *ptr, BOOL save) +{ + BEGINSAVELOAD; + SAVELOAD(arraybases,16*sizeof(u32)); + SAVELOAD(arraystrides,16*sizeof(u32)); + ENDSAVELOAD; +} + diff --git a/Source/Plugins/Plugin_VideoOGL/Src/VertexLoader.h b/Source/Plugins/Plugin_VideoOGL/Src/VertexLoader.h new file mode 100644 index 0000000000..63206a14e0 --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/VertexLoader.h @@ -0,0 +1,417 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef _VERTEXLOADER_H +#define _VERTEXLOADER_H + +#include + +#define SHADER_POSMTX_ATTRIB 1 +#define SHADER_NORM1_ATTRIB 6 +#define SHADER_NORM2_ATTRIB 7 + +using namespace std; + +//////////////// +// CP Structs // +//////////////// + +// Vertex array numbers +enum +{ + ARRAY_POSITION = 0, + ARRAY_NORMAL = 1, + ARRAY_COLOR = 2, + ARRAY_COLOR2 = 3, + ARRAY_TEXCOORD0 = 4 +}; + +// Vertex components +enum +{ + NOT_PRESENT = 0, + DIRECT = 1, + INDEX8 = 2, + INDEX16 = 3, +}; + +#pragma pack(4) + +union TVtxDesc +{ + u64 Hex; + struct + { + // 0: not present + // 1: present + unsigned PosMatIdx : 1; + unsigned Tex0MatIdx : 1; + unsigned Tex1MatIdx : 1; + unsigned Tex2MatIdx : 1; + unsigned Tex3MatIdx : 1; + unsigned Tex4MatIdx : 1; + unsigned Tex5MatIdx : 1; + unsigned Tex6MatIdx : 1; + unsigned Tex7MatIdx : 1; + + // 00: not present + // 01: direct + // 10: 8 bit index + // 11: 16 bit index + unsigned Position : 2; + unsigned Normal : 2; + unsigned Color0 : 2; + unsigned Color1 : 2; + unsigned Tex0Coord : 2; + unsigned Tex1Coord : 2; + unsigned Tex2Coord : 2; + unsigned Tex3Coord : 2; + unsigned Tex4Coord : 2; + unsigned Tex5Coord : 2; + unsigned Tex6Coord : 2; + unsigned Tex7Coord : 2; + unsigned :31; + }; + struct { + u32 Hex0, Hex1; + }; +}; + + + +enum +{ + FORMAT_UBYTE = 0, // 2 Cmp + FORMAT_BYTE = 1, // 3 Cmp + FORMAT_USHORT = 2, + FORMAT_SHORT = 3, + FORMAT_FLOAT = 4, +}; + +enum +{ + FORMAT_16B_565 = 0, // NA + FORMAT_24B_888 = 1, + FORMAT_32B_888x = 2, + FORMAT_16B_4444 = 3, + FORMAT_24B_6666 = 4, + FORMAT_32B_8888 = 5, +}; + +union UVAT_group0 +{ + u32 Hex; + struct + { + // 0:8 + unsigned PosElements : 1; + unsigned PosFormat : 3; + unsigned PosFrac : 5; + // 9:12 + unsigned NormalElements : 1; + unsigned NormalFormat : 3; + // 13:16 + unsigned Color0Elements : 1; + unsigned Color0Comp : 3; + // 17:20 + unsigned Color1Elements : 1; + unsigned Color1Comp : 3; + // 21:29 + unsigned Tex0CoordElements : 1; + unsigned Tex0CoordFormat : 3; + unsigned Tex0Frac : 5; + // 30:31 + unsigned ByteDequant: 1; + unsigned NormalIndex3: 1; + }; +}; + +union UVAT_group1 +{ + u32 Hex; + struct + { + // 0:8 + unsigned Tex1CoordElements : 1; + unsigned Tex1CoordFormat : 3; + unsigned Tex1Frac : 5; + // 9:17 + unsigned Tex2CoordElements : 1; + unsigned Tex2CoordFormat : 3; + unsigned Tex2Frac : 5; + // 18:26 + unsigned Tex3CoordElements : 1; + unsigned Tex3CoordFormat : 3; + unsigned Tex3Frac : 5; + // 27:30 + unsigned Tex4CoordElements : 1; + unsigned Tex4CoordFormat : 3; + // + unsigned : 1; + }; +}; + +union UVAT_group2 +{ + u32 Hex; + struct + { + // 0:4 + unsigned Tex4Frac : 5; + // 5:13 + unsigned Tex5CoordElements : 1; + unsigned Tex5CoordFormat : 3; + unsigned Tex5Frac : 5; + // 14:22 + unsigned Tex6CoordElements : 1; + unsigned Tex6CoordFormat : 3; + unsigned Tex6Frac : 5; + // 23:31 + unsigned Tex7CoordElements : 1; + unsigned Tex7CoordFormat : 3; + unsigned Tex7Frac : 5; + }; +}; + +struct ColorAttr +{ + u8 Elements; + u8 Comp; +}; + +struct TexAttr +{ + u8 Elements; + u8 Format; + u8 Frac; +}; + +struct TVtxAttr +{ + u8 PosElements; + u8 PosFormat; + u8 PosFrac; + u8 NormalElements; + u8 NormalFormat; + ColorAttr color[2]; + TexAttr texCoord[8]; + u8 ByteDequant; + u8 NormalIndex3; +}; + +#pragma pack () + +#define LOADERDECL __cdecl +typedef void (LOADERDECL *TPipelineFunction)(void*); + +/// Use to manage loading and setting vertex buffer data for OpenGL +class VertexLoader +{ +public: + enum + { + NRM_ZERO = 0, + NRM_ONE = 1, + NRM_THREE = 3 + }; + + // m_components + enum { + VB_HAS_POSMTXIDX =(1<<1), + VB_HAS_TEXMTXIDX0=(1<<2), + VB_HAS_TEXMTXIDX1=(1<<3), + VB_HAS_TEXMTXIDX2=(1<<4), + VB_HAS_TEXMTXIDX3=(1<<5), + VB_HAS_TEXMTXIDX4=(1<<6), + VB_HAS_TEXMTXIDX5=(1<<7), + VB_HAS_TEXMTXIDX6=(1<<8), + VB_HAS_TEXMTXIDX7=(1<<9), + VB_HAS_TEXMTXIDXALL=(0xff<<2), + //VB_HAS_POS=0, // Implied, it always has pos! don't bother testing + VB_HAS_NRM0=(1<<10), + VB_HAS_NRM1=(1<<11), + VB_HAS_NRM2=(1<<12), + VB_HAS_NRMALL=(7<<10), + + VB_HAS_COL0=(1<<13), + VB_HAS_COL1=(1<<14), + + VB_HAS_UV0=(1<<15), + VB_HAS_UV1=(1<<16), + VB_HAS_UV2=(1<<17), + VB_HAS_UV3=(1<<18), + VB_HAS_UV4=(1<<19), + VB_HAS_UV5=(1<<20), + VB_HAS_UV6=(1<<21), + VB_HAS_UV7=(1<<22), + VB_HAS_UVALL=(0xff<<15), + VB_HAS_UVTEXMTXSHIFT=13, + }; + +private: + TPipelineFunction m_PipelineStates[32]; + int m_numPipelineStates; + int m_VertexSize; // number of bytes of a raw vertex + int m_counter; + int m_VBVertexStride, m_VBStridePad; // stride of a vertex to send to the GPU + + u32 m_components; // VB_HAS_X + + UVAT_group0 m_group0; + UVAT_group1 m_group1; + UVAT_group2 m_group2; + + vector m_vtexmap; // tex index map + TVtxAttr m_VtxAttr; //Decoded into easy format + + u8* m_compiledCode; + + //common for all loaders + TVtxDesc m_VtxDesc; + + // seup the pipeline with this vertex fmt + void SetupColor(int num, int _iMode, int _iFormat, int _iElements); + void SetupTexCoord(int num, int _iMode, int _iFormat, int _iElements, int _iFrac); + + int m_AttrDirty; + +public: + // constructor + VertexLoader(); + ~VertexLoader(); + + // run the pipeline + void ProcessFormat(); + void PrepareRun(); + void RunVertices(int primitive, int count); + void WriteCall(void (LOADERDECL *func)(void *)); + + int GetGCVertexSize() const { _assert_( !m_AttrDirty ); return m_VertexSize; } + int GetVBVertexStride() const { _assert_( !m_AttrDirty); return m_VBVertexStride; } + + int ComputeVertexSize(); + + // SetVAT_group + // ignore PosFrac, texCoord[i].Frac + + void SetVAT_group0(u32 _group0) + { + if ((m_group0.Hex&~0x3e0001f0) != (_group0&~0x3e0001f0)) { + m_AttrDirty = 2; + } + m_group0.Hex = _group0; + + m_VtxAttr.PosElements = m_group0.PosElements; + m_VtxAttr.PosFormat = m_group0.PosFormat; + m_VtxAttr.PosFrac = m_group0.PosFrac; + m_VtxAttr.NormalElements = m_group0.NormalElements; + m_VtxAttr.NormalFormat = m_group0.NormalFormat; + m_VtxAttr.color[0].Elements = m_group0.Color0Elements; + m_VtxAttr.color[0].Comp = m_group0.Color0Comp; + m_VtxAttr.color[1].Elements = m_group0.Color1Elements; + m_VtxAttr.color[1].Comp = m_group0.Color1Comp; + m_VtxAttr.texCoord[0].Elements = m_group0.Tex0CoordElements; + m_VtxAttr.texCoord[0].Format = m_group0.Tex0CoordFormat; + m_VtxAttr.texCoord[0].Frac = m_group0.Tex0Frac; + m_VtxAttr.ByteDequant = m_group0.ByteDequant; + m_VtxAttr.NormalIndex3 = m_group0.NormalIndex3; + }; + + void SetVAT_group1(u32 _group1) + { + if ((m_group1.Hex&~0x7c3e1f0) != (_group1&~0x7c3e1f0)) { + m_AttrDirty = 2; + } + m_group1.Hex = _group1; + + + m_VtxAttr.texCoord[1].Elements = m_group1.Tex1CoordElements; + m_VtxAttr.texCoord[1].Format = m_group1.Tex1CoordFormat; + m_VtxAttr.texCoord[1].Frac = m_group1.Tex1Frac; + m_VtxAttr.texCoord[2].Elements = m_group1.Tex2CoordElements; + m_VtxAttr.texCoord[2].Format = m_group1.Tex2CoordFormat; + m_VtxAttr.texCoord[2].Frac = m_group1.Tex2Frac; + m_VtxAttr.texCoord[3].Elements = m_group1.Tex3CoordElements; + m_VtxAttr.texCoord[3].Format = m_group1.Tex3CoordFormat; + m_VtxAttr.texCoord[3].Frac = m_group1.Tex3Frac; + m_VtxAttr.texCoord[4].Elements = m_group1.Tex4CoordElements; + m_VtxAttr.texCoord[4].Format = m_group1.Tex4CoordFormat; + }; + + void SetVAT_group2(u32 _group2) + { + if ((m_group2.Hex&~0xf87c3e1f) != (_group2&~0xf87c3e1f)) { + m_AttrDirty = 2; + } + m_group2.Hex = _group2; + + m_VtxAttr.texCoord[4].Frac = m_group2.Tex4Frac; + m_VtxAttr.texCoord[5].Elements = m_group2.Tex5CoordElements; + m_VtxAttr.texCoord[5].Format = m_group2.Tex5CoordFormat; + m_VtxAttr.texCoord[5].Frac = m_group2.Tex5Frac; + m_VtxAttr.texCoord[6].Elements = m_group2.Tex6CoordElements; + m_VtxAttr.texCoord[6].Format = m_group2.Tex6CoordFormat; + m_VtxAttr.texCoord[6].Frac = m_group2.Tex6Frac; + m_VtxAttr.texCoord[7].Elements = m_group2.Tex7CoordElements; + m_VtxAttr.texCoord[7].Format = m_group2.Tex7CoordFormat; + m_VtxAttr.texCoord[7].Frac = m_group2.Tex7Frac; + }; +}; + +/// Methods to manage and cache the global state of vertex streams and flushing streams +/// Also handles processing the CP registers +class VertexManager +{ + static TVtxDesc s_GlobalVtxDesc; + +public: + enum Collection + { + C_NOTHING=0, + C_TRIANGLES=1, + C_LINES=2, + C_POINTS=3 + }; + + static bool Init(); + static void Destroy(); + + static void ResetBuffer(); + static void ResetComponents(); + + static void AddVertices(int primitive, int numvertices); + static void Flush(); // flushes the current buffer + + static int GetRemainingSize(); + static TVtxDesc &GetVtxDesc() {return s_GlobalVtxDesc; } + + static void LoadCPReg(u32 SubCmd, u32 Value); + static size_t SaveLoadState(char *ptr, BOOL save); + + static u8* s_pCurBufferPointer; + static float shiftLookup[32]; +}; + +extern VertexLoader g_VertexLoaders[8]; +extern u32 arraybases[16]; +extern u32 arraystrides[16]; +u8 ReadBuffer8(); +u16 ReadBuffer16(); +u32 ReadBuffer32(); +float ReadBuffer32F(); + +#endif diff --git a/Source/Plugins/Plugin_VideoOGL/Src/VertexLoader_Color.h b/Source/Plugins/Plugin_VideoOGL/Src/VertexLoader_Color.h new file mode 100644 index 0000000000..663afbaffe --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/VertexLoader_Color.h @@ -0,0 +1,223 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef _VERTEXLOADERCOLOR_H +#define _VERTEXLOADERCOLOR_H + +#define RSHIFT 0 +#define GSHIFT 8 +#define BSHIFT 16 +#define ASHIFT 24 + +extern int colIndex; + +inline void _SetCol(u32 val) +{ + *(u32*)VertexManager::s_pCurBufferPointer = val; + VertexManager::s_pCurBufferPointer += 4; + colIndex++; +} + +void _SetCol4444(u16 val) +{ + u32 col = lut4to8[(val>>0)&0xF]<>12)&0xF] <>8)&0xF] <>4)&0xF] <>18)&0x3F] << RSHIFT; + col |= lut6to8[(val>>12)&0x3F] << GSHIFT; + col |= lut6to8[(val>>6)&0x3F] << BSHIFT; + col |= lut6to8[(val>>0)&0x3F] << ASHIFT; + _SetCol(col); +} + +void _SetCol565(u16 val) +{ + u32 col = lut5to8[(val>>11)&0x1f] << RSHIFT; + col |= lut6to8[(val>>5 )&0x3f] << GSHIFT; + col |= lut5to8[(val )&0x1f] << BSHIFT; + _SetCol(col | (0xFF<PosElements) + ((float*)VertexManager::s_pCurBufferPointer)[2] = (float)ReadBuffer8() * posScale; + else + ((float*)VertexManager::s_pCurBufferPointer)[2] = 1.0f; + LOG_VTX(); + VertexManager::s_pCurBufferPointer += 12; +} + +void LOADERDECL Pos_ReadDirect_Byte(void* _p) +{ + TVtxAttr* pVtxAttr = (TVtxAttr*)_p; + ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s8)ReadBuffer8() * posScale; + ((float*)VertexManager::s_pCurBufferPointer)[1] = (float)(s8)ReadBuffer8() * posScale; + if (pVtxAttr->PosElements) + ((float*)VertexManager::s_pCurBufferPointer)[2] = (float)(s8)ReadBuffer8() * posScale; + else + ((float*)VertexManager::s_pCurBufferPointer)[2] = 1.0; + LOG_VTX(); + VertexManager::s_pCurBufferPointer += 12; +} + +void LOADERDECL Pos_ReadDirect_UShort(void* _p) +{ + TVtxAttr* pVtxAttr = (TVtxAttr*)_p; + ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)ReadBuffer16() * posScale; + ((float*)VertexManager::s_pCurBufferPointer)[1] = (float)ReadBuffer16() * posScale; + if (pVtxAttr->PosElements) + ((float*)VertexManager::s_pCurBufferPointer)[2] = (float)ReadBuffer16() * posScale; + else + ((float*)VertexManager::s_pCurBufferPointer)[2] = 1.0f; + LOG_VTX(); + VertexManager::s_pCurBufferPointer += 12; +} + +void LOADERDECL Pos_ReadDirect_Short(void* _p) +{ + TVtxAttr* pVtxAttr = (TVtxAttr*)_p; + ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s16)ReadBuffer16() * posScale; + ((float*)VertexManager::s_pCurBufferPointer)[1] = (float)(s16)ReadBuffer16() * posScale; + if (pVtxAttr->PosElements) + ((float*)VertexManager::s_pCurBufferPointer)[2] = (float)(s16)ReadBuffer16() * posScale; + else + ((float*)VertexManager::s_pCurBufferPointer)[2] = 1.0f; + LOG_VTX(); + VertexManager::s_pCurBufferPointer += 12; +} + +void LOADERDECL Pos_ReadDirect_Float(void* _p) +{ + TVtxAttr* pVtxAttr = (TVtxAttr*)_p; + ((float*)VertexManager::s_pCurBufferPointer)[0] = ReadBuffer32F(); + ((float*)VertexManager::s_pCurBufferPointer)[1] = ReadBuffer32F(); + if (pVtxAttr->PosElements) + ((float*)VertexManager::s_pCurBufferPointer)[2] = ReadBuffer32F(); + else + ((float*)VertexManager::s_pCurBufferPointer)[2] = 1.0f; + LOG_VTX(); + VertexManager::s_pCurBufferPointer += 12; +} + +#define Pos_ReadIndex_Byte(T) { \ + u32 iAddress = arraybases[ARRAY_POSITION] + ((u32)Index * arraystrides[ARRAY_POSITION]); \ + ((float*)VertexManager::s_pCurBufferPointer)[0] = ((float)(T)Memory_Read_U8(iAddress)) * posScale; \ + ((float*)VertexManager::s_pCurBufferPointer)[1] = ((float)(T)Memory_Read_U8(iAddress+1)) * posScale; \ + if (pVtxAttr->PosElements) \ + ((float*)VertexManager::s_pCurBufferPointer)[2] = ((float)(T)Memory_Read_U8(iAddress+2)) * posScale; \ + else \ + ((float*)VertexManager::s_pCurBufferPointer)[2] = 1.0f; \ + LOG_VTX(); \ + VertexManager::s_pCurBufferPointer += 12; \ +} + +#define Pos_ReadIndex_Short(T) { \ + u32 iAddress = arraybases[ARRAY_POSITION] + ((u32)Index * arraystrides[ARRAY_POSITION]); \ + ((float*)VertexManager::s_pCurBufferPointer)[0] = ((float)(T)Memory_Read_U16(iAddress)) * posScale; \ + ((float*)VertexManager::s_pCurBufferPointer)[1] = ((float)(T)Memory_Read_U16(iAddress+2)) * posScale; \ + if (pVtxAttr->PosElements) \ + ((float*)VertexManager::s_pCurBufferPointer)[2] = ((float)(T)Memory_Read_U16(iAddress+4)) * posScale; \ + else \ + ((float*)VertexManager::s_pCurBufferPointer)[2] = 1.0f; \ + LOG_VTX(); \ + VertexManager::s_pCurBufferPointer += 12; \ +} + +#define Pos_ReadIndex_Float() { \ + u32 iAddress = arraybases[ARRAY_POSITION] + (Index * arraystrides[ARRAY_POSITION]); \ + ((u32*)VertexManager::s_pCurBufferPointer)[0] = Memory_Read_U32(iAddress); \ + ((u32*)VertexManager::s_pCurBufferPointer)[1] = Memory_Read_U32(iAddress+4); \ + if (pVtxAttr->PosElements) \ + ((u32*)VertexManager::s_pCurBufferPointer)[2] = Memory_Read_U32(iAddress+8); \ + else \ + ((float*)VertexManager::s_pCurBufferPointer)[2] = 1.0f; \ + LOG_VTX(); \ + VertexManager::s_pCurBufferPointer += 12; \ +} + +// ============================================================================== +// Index 8 +// ============================================================================== +void LOADERDECL Pos_ReadIndex8_UByte(void* _p) +{ + TVtxAttr* pVtxAttr = (TVtxAttr*)_p; + u8 Index = ReadBuffer8(); + Pos_ReadIndex_Byte(u8); +} + +void LOADERDECL Pos_ReadIndex8_Byte(void* _p) +{ + TVtxAttr* pVtxAttr = (TVtxAttr*)_p; + u8 Index = ReadBuffer8(); + Pos_ReadIndex_Byte(s8); +} + +void LOADERDECL Pos_ReadIndex8_UShort(void* _p) +{ + TVtxAttr* pVtxAttr = (TVtxAttr*)_p; + u8 Index = ReadBuffer8(); + Pos_ReadIndex_Short(u16); +} + +void LOADERDECL Pos_ReadIndex8_Short(void* _p) +{ + TVtxAttr* pVtxAttr = (TVtxAttr*)_p; + u8 Index = ReadBuffer8(); + Pos_ReadIndex_Short(s16); +} + +void LOADERDECL Pos_ReadIndex8_Float(void* _p) +{ + TVtxAttr* pVtxAttr = (TVtxAttr*)_p; + u8 Index = ReadBuffer8(); + Pos_ReadIndex_Float(); +} + +// ============================================================================== +// Index 16 +// ============================================================================== + +void LOADERDECL Pos_ReadIndex16_UByte(void* _p){ + TVtxAttr* pVtxAttr = (TVtxAttr*)_p; + u16 Index = ReadBuffer16(); + Pos_ReadIndex_Byte(u8); +} + +void LOADERDECL Pos_ReadIndex16_Byte(void* _p){ + TVtxAttr* pVtxAttr = (TVtxAttr*)_p; + u16 Index = ReadBuffer16(); + Pos_ReadIndex_Byte(s8); +} + +void LOADERDECL Pos_ReadIndex16_UShort(void* _p){ + TVtxAttr* pVtxAttr = (TVtxAttr*)_p; + u16 Index = ReadBuffer16(); + Pos_ReadIndex_Short(u16); +} + +void LOADERDECL Pos_ReadIndex16_Short(void* _p) +{ + TVtxAttr* pVtxAttr = (TVtxAttr*)_p; + u16 Index = ReadBuffer16(); + Pos_ReadIndex_Short(s16); +} + +void LOADERDECL Pos_ReadIndex16_Float(void* _p) +{ + TVtxAttr* pVtxAttr = (TVtxAttr*)_p; + u16 Index = ReadBuffer16(); + Pos_ReadIndex_Float(); +} + +#endif diff --git a/Source/Plugins/Plugin_VideoOGL/Src/VertexLoader_TextCoord.h b/Source/Plugins/Plugin_VideoOGL/Src/VertexLoader_TextCoord.h new file mode 100644 index 0000000000..82a38647c7 --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/VertexLoader_TextCoord.h @@ -0,0 +1,341 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef VERTEXLOADER_TEXCOORD_H +#define VERTEXLOADER_TEXCOORD_H + +#define LOG_TEX1() PRIM_LOG("tex: %f, ", ((float*)VertexManager::s_pCurBufferPointer)[0]); +#define LOG_TEX2() PRIM_LOG("tex: %f %f, ", ((float*)VertexManager::s_pCurBufferPointer)[0], ((float*)VertexManager::s_pCurBufferPointer)[1]); + +extern int tcIndex; + +void LOADERDECL TexCoord_Read_Dummy(void* _p) +{ + tcIndex++; +} + +void LOADERDECL TexCoord_ReadDirect_UByte1(void* _p) +{ + ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)ReadBuffer8() * tcScaleU[tcIndex]; + LOG_TEX1(); + VertexManager::s_pCurBufferPointer += 4; + tcIndex++; +} +void LOADERDECL TexCoord_ReadDirect_UByte2(void* _p) +{ + ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)ReadBuffer8() * tcScaleU[tcIndex]; + ((float*)VertexManager::s_pCurBufferPointer)[1] = (float)ReadBuffer8() * tcScaleV[tcIndex]; + LOG_TEX2(); + VertexManager::s_pCurBufferPointer += 8; + tcIndex++; +} + +void LOADERDECL TexCoord_ReadDirect_Byte1(void* _p) +{ + ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s8)ReadBuffer8() * tcScaleU[tcIndex]; + LOG_TEX1(); + VertexManager::s_pCurBufferPointer += 4; + tcIndex++; +} +void LOADERDECL TexCoord_ReadDirect_Byte2(void* _p) +{ + ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s8)ReadBuffer8() * tcScaleU[tcIndex]; + ((float*)VertexManager::s_pCurBufferPointer)[1] = (float)(s8)ReadBuffer8() * tcScaleV[tcIndex]; + LOG_TEX2(); + VertexManager::s_pCurBufferPointer += 8; + tcIndex++; +} + +void LOADERDECL TexCoord_ReadDirect_UShort1(void* _p) +{ + ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)ReadBuffer16() * tcScaleU[tcIndex]; + LOG_TEX1(); + VertexManager::s_pCurBufferPointer += 4; + tcIndex++; +} +void LOADERDECL TexCoord_ReadDirect_UShort2(void* _p) +{ + ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)ReadBuffer16() * tcScaleU[tcIndex]; + ((float*)VertexManager::s_pCurBufferPointer)[1] = (float)ReadBuffer16() * tcScaleV[tcIndex]; + LOG_TEX2(); + VertexManager::s_pCurBufferPointer += 8; + tcIndex++; +} + +void LOADERDECL TexCoord_ReadDirect_Short1(void* _p) +{ + ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s16)ReadBuffer16() * tcScaleU[tcIndex]; + LOG_TEX1(); + VertexManager::s_pCurBufferPointer += 4; + tcIndex++; +} +void LOADERDECL TexCoord_ReadDirect_Short2(void* _p) +{ + ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s16)ReadBuffer16() * tcScaleU[tcIndex]; + ((float*)VertexManager::s_pCurBufferPointer)[1] = (float)(s16)ReadBuffer16() * tcScaleV[tcIndex]; + LOG_TEX2(); + VertexManager::s_pCurBufferPointer += 8; + tcIndex++; +} + +void LOADERDECL TexCoord_ReadDirect_Float1(void* _p) +{ + ((float*)VertexManager::s_pCurBufferPointer)[0] = ReadBuffer32F() * tcScaleU[tcIndex]; + LOG_TEX1(); + VertexManager::s_pCurBufferPointer += 4; + tcIndex++; +} +void LOADERDECL TexCoord_ReadDirect_Float2(void* _p) +{ + ((float*)VertexManager::s_pCurBufferPointer)[0] = ReadBuffer32F() * tcScaleU[tcIndex]; + ((float*)VertexManager::s_pCurBufferPointer)[1] = ReadBuffer32F() * tcScaleV[tcIndex]; + LOG_TEX2(); + VertexManager::s_pCurBufferPointer += 8; + tcIndex++; +} + +// ================================================================================== +void LOADERDECL TexCoord_ReadIndex8_UByte1(void* _p) +{ + u8 Index = ReadBuffer8(); + u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); + + ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(u8)Memory_Read_U8(iAddress) * tcScaleU[tcIndex]; + LOG_TEX1(); + VertexManager::s_pCurBufferPointer += 4; + tcIndex++; +} +void LOADERDECL TexCoord_ReadIndex8_UByte2(void* _p) +{ + u8 Index = ReadBuffer8(); + u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); + + ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(u8)Memory_Read_U8(iAddress) * tcScaleU[tcIndex]; + ((float*)VertexManager::s_pCurBufferPointer)[1] = (float)(u8)Memory_Read_U8(iAddress+1) * tcScaleV[tcIndex]; + LOG_TEX2(); + VertexManager::s_pCurBufferPointer += 8; + tcIndex++; +} + +void LOADERDECL TexCoord_ReadIndex8_Byte1(void* _p) +{ + u8 Index = ReadBuffer8(); + u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); + + ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s8)Memory_Read_U8(iAddress) * tcScaleU[tcIndex]; + LOG_TEX1(); + VertexManager::s_pCurBufferPointer += 4; + tcIndex++; +} +void LOADERDECL TexCoord_ReadIndex8_Byte2(void* _p) +{ + u8 Index = ReadBuffer8(); + u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); + + ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s8)Memory_Read_U8(iAddress) * tcScaleU[tcIndex]; + ((float*)VertexManager::s_pCurBufferPointer)[1] = (float)(s8)Memory_Read_U8(iAddress+1) * tcScaleV[tcIndex]; + LOG_TEX2(); + VertexManager::s_pCurBufferPointer += 8; + tcIndex++; +} + +void LOADERDECL TexCoord_ReadIndex8_UShort1(void* _p) +{ + u8 Index = ReadBuffer8(); + u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); + + ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(u16)Memory_Read_U16(iAddress) * tcScaleU[tcIndex]; + LOG_TEX1(); + VertexManager::s_pCurBufferPointer += 4; + tcIndex++; +} +void LOADERDECL TexCoord_ReadIndex8_UShort2(void* _p) +{ + u8 Index = ReadBuffer8(); + u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); + + ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(u16)Memory_Read_U16(iAddress) * tcScaleU[tcIndex]; + ((float*)VertexManager::s_pCurBufferPointer)[1] = (float)(u16)Memory_Read_U16(iAddress+2) * tcScaleV[tcIndex]; + LOG_TEX2(); + VertexManager::s_pCurBufferPointer += 8; + tcIndex++; +} + +void LOADERDECL TexCoord_ReadIndex8_Short1(void* _p) +{ + u8 Index = ReadBuffer8(); + u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); + + ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s16)Memory_Read_U16(iAddress) * tcScaleU[tcIndex]; + LOG_TEX1(); + VertexManager::s_pCurBufferPointer += 4; + tcIndex++; +} +void LOADERDECL TexCoord_ReadIndex8_Short2(void* _p) +{ + u8 Index = ReadBuffer8(); + u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); + + ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s16)Memory_Read_U16(iAddress) * tcScaleU[tcIndex]; + ((float*)VertexManager::s_pCurBufferPointer)[1] = (float)(s16)Memory_Read_U16(iAddress+2) * tcScaleV[tcIndex]; + LOG_TEX2(); + VertexManager::s_pCurBufferPointer += 8; + tcIndex++; +} + +void LOADERDECL TexCoord_ReadIndex8_Float1(void* _p) +{ + u16 Index = ReadBuffer8(); + u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); + u32 uTemp; + uTemp = Memory_Read_U32(iAddress); + ((float*)VertexManager::s_pCurBufferPointer)[0] = *(float*)&uTemp * tcScaleU[tcIndex]; + LOG_TEX1(); + VertexManager::s_pCurBufferPointer += 4; + tcIndex++; +} +void LOADERDECL TexCoord_ReadIndex8_Float2(void* _p) +{ + u16 Index = ReadBuffer8(); + u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); + u32 uTemp; + uTemp = Memory_Read_U32(iAddress); + ((float*)VertexManager::s_pCurBufferPointer)[0] = *(float*)&uTemp * tcScaleU[tcIndex]; + uTemp = Memory_Read_U32(iAddress+4); + ((float*)VertexManager::s_pCurBufferPointer)[1] = *(float*)&uTemp * tcScaleV[tcIndex]; + LOG_TEX2(); + VertexManager::s_pCurBufferPointer += 8; + tcIndex++; +} + +// ================================================================================== +void LOADERDECL TexCoord_ReadIndex16_UByte1(void* _p) +{ + u16 Index = ReadBuffer16(); + u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); + + ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(u8)Memory_Read_U8(iAddress) * tcScaleU[tcIndex]; + LOG_TEX1(); + VertexManager::s_pCurBufferPointer += 4; + tcIndex++; +} +void LOADERDECL TexCoord_ReadIndex16_UByte2(void* _p) +{ + u16 Index = ReadBuffer16(); + u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); + + ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(u8)Memory_Read_U8(iAddress) * tcScaleU[tcIndex]; + ((float*)VertexManager::s_pCurBufferPointer)[1] = (float)(u8)Memory_Read_U8(iAddress+1) * tcScaleV[tcIndex]; + LOG_TEX2(); + VertexManager::s_pCurBufferPointer += 8; + tcIndex++; +} + +void LOADERDECL TexCoord_ReadIndex16_Byte1(void* _p) +{ + u16 Index = ReadBuffer16(); + u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); + + ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s8)Memory_Read_U8(iAddress) * tcScaleU[tcIndex]; + LOG_TEX1(); + VertexManager::s_pCurBufferPointer += 4; + tcIndex++; +} +void LOADERDECL TexCoord_ReadIndex16_Byte2(void* _p) +{ + u16 Index = ReadBuffer16(); + u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); + + ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s8)Memory_Read_U8(iAddress) * tcScaleU[tcIndex]; + ((float*)VertexManager::s_pCurBufferPointer)[1] = (float)(s8)Memory_Read_U8(iAddress+1) * tcScaleV[tcIndex]; + LOG_TEX2(); + VertexManager::s_pCurBufferPointer += 8; + tcIndex++; +} + +void LOADERDECL TexCoord_ReadIndex16_UShort1(void* _p) +{ + TVtxAttr* pVtxAttr = (TVtxAttr*)_p; + u16 Index = ReadBuffer16(); + u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); + + ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(u16)Memory_Read_U16(iAddress) * tcScaleU[tcIndex]; + LOG_TEX1(); + VertexManager::s_pCurBufferPointer += 4; + tcIndex++; +} +void LOADERDECL TexCoord_ReadIndex16_UShort2(void* _p) +{ + TVtxAttr* pVtxAttr = (TVtxAttr*)_p; + u16 Index = ReadBuffer16(); + u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); + + ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(u16)Memory_Read_U16(iAddress) * tcScaleU[tcIndex]; + ((float*)VertexManager::s_pCurBufferPointer)[1] = (float)(u16)Memory_Read_U16(iAddress+2) * tcScaleV[tcIndex]; + LOG_TEX2(); + VertexManager::s_pCurBufferPointer += 8; + tcIndex++; +} + +void LOADERDECL TexCoord_ReadIndex16_Short1(void* _p) +{ + u16 Index = ReadBuffer16(); + u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); + + ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s16)Memory_Read_U16(iAddress) * tcScaleU[tcIndex]; + LOG_TEX1(); + VertexManager::s_pCurBufferPointer += 4; + tcIndex++; +} +void LOADERDECL TexCoord_ReadIndex16_Short2(void* _p) +{ + u16 Index = ReadBuffer16(); + u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); + + ((float*)VertexManager::s_pCurBufferPointer)[0] = (float)(s16)Memory_Read_U16(iAddress) * tcScaleU[tcIndex]; + ((float*)VertexManager::s_pCurBufferPointer)[1] = (float)(s16)Memory_Read_U16(iAddress+2) * tcScaleV[tcIndex]; + LOG_TEX2(); + VertexManager::s_pCurBufferPointer += 8; + tcIndex++; +} + +void LOADERDECL TexCoord_ReadIndex16_Float1(void* _p) +{ + u16 Index = ReadBuffer16(); + u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); + u32 uTemp; + uTemp = Memory_Read_U32(iAddress ); + ((float*)VertexManager::s_pCurBufferPointer)[0] = *(float*)&uTemp * tcScaleU[tcIndex]; + LOG_TEX1(); + VertexManager::s_pCurBufferPointer += 4; + tcIndex++; +} +void LOADERDECL TexCoord_ReadIndex16_Float2(void* _p) +{ + u16 Index = ReadBuffer16(); + u32 iAddress = arraybases[ARRAY_TEXCOORD0+tcIndex] + (Index * arraystrides[ARRAY_TEXCOORD0+tcIndex]); + u32 uTemp; + uTemp = Memory_Read_U32(iAddress ); + ((float*)VertexManager::s_pCurBufferPointer)[0] = *(float*)&uTemp * tcScaleU[tcIndex]; + uTemp = Memory_Read_U32(iAddress+4); + ((float*)VertexManager::s_pCurBufferPointer)[1] = *(float*)&uTemp * tcScaleV[tcIndex]; + LOG_TEX2(); + VertexManager::s_pCurBufferPointer += 8; + tcIndex++; +} + +#endif diff --git a/Source/Plugins/Plugin_VideoOGL/Src/VertexShader.cpp b/Source/Plugins/Plugin_VideoOGL/Src/VertexShader.cpp new file mode 100644 index 0000000000..f181549440 --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/VertexShader.cpp @@ -0,0 +1,1235 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + + +#include "Globals.h" +#include +#include "Render.h" +#include "VertexShader.h" +#include "BPStructs.h" +#include "VertexLoader.h" + +// shader variables +#define I_POSNORMALMATRIX "cpnmtx" +#define I_PROJECTION "cproj" +#define I_MATERIALS "cmtrl" +#define I_LIGHTS "clights" +#define I_TEXMATRICES "ctexmtx" +#define I_TRANSFORMMATRICES "ctrmtx" +#define I_NORMALMATRICES "cnmtx" +#define I_POSTTRANSFORMMATRICES "cpostmtx" +#define I_FOGPARAMS "cfog" + +#define C_POSNORMALMATRIX 0 +#define C_PROJECTION (C_POSNORMALMATRIX+6) +#define C_MATERIALS (C_PROJECTION+4) +#define C_LIGHTS (C_MATERIALS+4) +#define C_TEXMATRICES (C_LIGHTS+40) +#define C_TRANSFORMMATRICES (C_TEXMATRICES+24) +#define C_NORMALMATRICES (C_TRANSFORMMATRICES+64) +#define C_POSTTRANSFORMMATRICES (C_NORMALMATRICES+32) +#define C_FOGPARAMS (C_POSTTRANSFORMMATRICES+64) + +VertexShaderMngr::VSCache VertexShaderMngr::vshaders; +VERTEXSHADER* VertexShaderMngr::pShaderLast = NULL; +TMatrixIndexA VertexShaderMngr::MatrixIndexA; +TMatrixIndexB VertexShaderMngr::MatrixIndexB; +float VertexShaderMngr::rawViewport[6] = {0}; +float VertexShaderMngr::rawProjection[7] = {0}; +float GC_ALIGNED16(g_fProjectionMatrix[16]); + +static int s_nMaxVertexInstructions; + +//////////////////////// +// Internal Variables // +//////////////////////// +XFRegisters xfregs; +static u32 xfmem[XFMEM_SIZE]; +static float s_fMaterials[16]; + +// track changes +static bool bTexMatricesChanged[2], bPosNormalMatrixChanged, bProjectionChanged, bViewportChanged; +int nMaterialsChanged; +static int nTransformMatricesChanged[2]; // min,max +static int nNormalMatricesChanged[2]; // min,max +static int nPostTransformMatricesChanged[2]; // min,max +static int nLightsChanged[2]; // min,max + +void VertexShaderMngr::Init() +{ + nTransformMatricesChanged[0] = nTransformMatricesChanged[1] = -1; + nNormalMatricesChanged[0] = nNormalMatricesChanged[1] = -1; + nPostTransformMatricesChanged[0] = nPostTransformMatricesChanged[1] = -1; + nLightsChanged[0] = nLightsChanged[1] = -1; + bTexMatricesChanged[0] = bTexMatricesChanged[1] = false; + bPosNormalMatrixChanged = bProjectionChanged = bViewportChanged = false; + nMaterialsChanged = 0; + + memset(&xfregs, 0, sizeof(xfregs)); + memset(xfmem, 0, sizeof(xfmem)); + + glGetProgramivARB(GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB, &s_nMaxVertexInstructions); +} + +void VertexShaderMngr::Shutdown() +{ + VSCache::iterator iter = vshaders.begin(); + for (;iter!=vshaders.end();iter++) + iter->second.Destroy(); + vshaders.clear(); +} + +VERTEXSHADER* VertexShaderMngr::GetShader(u32 components) +{ + DVSTARTPROFILE(); + VERTEXSHADERUID uid; + GetVertexShaderId(uid, components); + + VSCache::iterator iter = vshaders.find(uid); + + if (iter != vshaders.end()) { + iter->second.frameCount=frameCount; + VSCacheEntry &entry = iter->second; + if (&entry.shader != pShaderLast) { + pShaderLast = &entry.shader; + } + return pShaderLast; + } + + VSCacheEntry& entry = vshaders[uid]; + + if (!GenerateVertexShader(entry.shader, components)) { + ERROR_LOG("failed to create vertex shader\n"); + } + + //Make an entry in the table + entry.frameCount=frameCount; + + pShaderLast = &entry.shader; + INCSTAT(stats.numVertexShadersCreated); + SETSTAT(stats.numVertexShadersAlive,vshaders.size()); + return pShaderLast; +} + +void VertexShaderMngr::Cleanup() +{ + VSCache::iterator iter=vshaders.begin(); + while (iter != vshaders.end()) { + VSCacheEntry &entry = iter->second; + if (entry.frameCount < frameCount-200) { + entry.Destroy(); +#ifdef _WIN32 + iter = vshaders.erase(iter); +#else + vshaders.erase(iter++); +#endif + } + else { + ++iter; + } + } + +// static int frame = 0; +// if( frame++ > 30 ) { +// VSCache::iterator iter=vshaders.begin(); +// while(iter!=vshaders.end()) { +// iter->second.Destroy(); +// ++iter; +// } +// vshaders.clear(); +// } + + SETSTAT(stats.numPixelShadersAlive,vshaders.size()); +} + +bool VertexShaderMngr::CompileVertexShader(VERTEXSHADER& vs, const char* pstrprogram) +{ + char stropt[64]; + sprintf(stropt, "MaxLocalParams=256,MaxInstructions=%d", s_nMaxVertexInstructions); +#ifdef _WIN32 + const char* opts[] = {"-profileopts",stropt,"-O2", "-q", NULL}; +#else + const char* opts[] = {"-profileopts",stropt,"-q", NULL}; +#endif + CGprogram tempprog = cgCreateProgram(g_cgcontext, CG_SOURCE, pstrprogram, g_cgvProf, "main", opts); + if (!cgIsProgram(tempprog) || cgGetError() != CG_NO_ERROR) { + ERROR_LOG("Failed to load vs %s:\n", cgGetLastListing(g_cgcontext)); + ERROR_LOG(pstrprogram); + return false; + } + + //ERROR_LOG(pstrprogram); + //ERROR_LOG("id: %d\n", g_Config.iSaveTargetId); + + char* pcompiledprog = (char*)cgGetProgramString(tempprog, CG_COMPILED_PROGRAM); + char* plocal = strstr(pcompiledprog, "program.local"); + + while( plocal != NULL ) { + const char* penv = " program.env"; + memcpy(plocal, penv, 13); + plocal = strstr(plocal+13, "program.local"); + } + + glGenProgramsARB( 1, &vs.glprogid ); + glBindProgramARB( GL_VERTEX_PROGRAM_ARB, vs.glprogid ); + glProgramStringARB( GL_VERTEX_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, (GLsizei)strlen(pcompiledprog), pcompiledprog); + + GLenum err = GL_NO_ERROR; + GL_REPORT_ERROR(); + if( err != GL_NO_ERROR ) { + ERROR_LOG(pstrprogram); + ERROR_LOG(pcompiledprog); + } + + cgDestroyProgram(tempprog); + +#ifdef _DEBUG + vs.strprog = pstrprogram; +#endif + + return true; +} + +// TODO: this array is misdeclared. Why teh f** does it go through the compilers? +const u16 s_mtrltable[16][2] = {0, 0, 0, 1, 1, 1, 0, 2, + 2, 1, 0, 3, 1, 2, 0, 3, + 3, 1, 0, 4, 1, 3, 0, 4, + 2, 2, 0, 4, 1, 3, 0, 4}; + +/// syncs the shader constant buffers with xfmem +void VertexShaderMngr::SetConstants(VERTEXSHADER& vs) +{ + //nTransformMatricesChanged[0] = 0; nTransformMatricesChanged[1] = 256; + //nNormalMatricesChanged[0] = 0; nNormalMatricesChanged[1] = 96; + //nPostTransformMatricesChanged[0] = 0; nPostTransformMatricesChanged[1] = 256; + //nLightsChanged[0] = 0; nLightsChanged[1] = 0x80; + //bPosNormalMatrixChanged = true; + //bTexMatricesChanged[0] = bTexMatricesChanged[1] = true; + //bProjectionChanged = true; +// bPosNormalMatrixChanged = bTexMatricesChanged[0] = bTexMatricesChanged[1] = true; +// nMaterialsChanged = 15; + + if (nTransformMatricesChanged[0] >= 0) { + int startn = nTransformMatricesChanged[0]/4; + int endn = (nTransformMatricesChanged[1]+3)/4; + const float* pstart = (const float*)&xfmem[startn*4]; + for(int i = startn; i < endn; ++i, pstart += 4) + glProgramEnvParameter4fvARB(GL_VERTEX_PROGRAM_ARB, C_TRANSFORMMATRICES+i, pstart); + nTransformMatricesChanged[0] = nTransformMatricesChanged[1] = -1; + } + if (nNormalMatricesChanged[0] >= 0) { + int startn = nNormalMatricesChanged[0]/3; + int endn = (nNormalMatricesChanged[1]+2)/3; + const float* pnstart = (const float*)&xfmem[XFMEM_NORMALMATRICES+3*startn]; + + for(int i = startn; i < endn; ++i, pnstart += 3) + glProgramEnvParameter4fvARB(GL_VERTEX_PROGRAM_ARB, C_NORMALMATRICES+i, pnstart); + + nNormalMatricesChanged[0] = nNormalMatricesChanged[1] = -1; + } + + if (nPostTransformMatricesChanged[0] >= 0) { + int startn = nPostTransformMatricesChanged[0]/4; + int endn = (nPostTransformMatricesChanged[1]+3)/4; + const float* pstart = (const float*)&xfmem[XFMEM_POSTMATRICES+startn*4]; + for(int i = startn; i < endn; ++i, pstart += 4) + glProgramEnvParameter4fvARB(GL_VERTEX_PROGRAM_ARB, C_POSTTRANSFORMMATRICES+i, pstart); + } + + if (nLightsChanged[0] >= 0) { + // lights don't have a 1 to 1 mapping, the color component needs to be converted to 4 floats + int istart = nLightsChanged[0]/0x10; + int iend = (nLightsChanged[1]+15)/0x10; + const float* xfmemptr = (const float*)&xfmem[0x10*istart+XFMEM_LIGHTS]; + + for(int i = istart; i < iend; ++i) { + u32 color = *(const u32*)(xfmemptr+3); + glProgramEnvParameter4fARB(GL_VERTEX_PROGRAM_ARB, C_LIGHTS+5*i, + ((color>>24)&0xFF)/255.0f, ((color>>16)&0xFF)/255.0f, ((color>>8)&0xFF)/255.0f, ((color)&0xFF)/255.0f); + xfmemptr += 4; + for(int j = 0; j < 4; ++j, xfmemptr += 3) { + if( j == 1 && fabs(xfmemptr[0]) < 0.00001f && fabs(xfmemptr[1]) < 0.00001f && fabs(xfmemptr[2]) < 0.00001f) { + // dist atten, make sure not equal to 0!!! + glProgramEnvParameter4fARB(GL_VERTEX_PROGRAM_ARB, C_LIGHTS+5*i+j+1, 0.00001f, xfmemptr[1], xfmemptr[2], 0); + } + else + glProgramEnvParameter4fvARB(GL_VERTEX_PROGRAM_ARB, C_LIGHTS+5*i+j+1, xfmemptr); + } + } + + nLightsChanged[0] = nLightsChanged[1] = -1; + } + + if (nMaterialsChanged) { + for(int i = 0; i < 4; ++i) { + if( nMaterialsChanged&(1<= MatrixIndexA.PosNormalMtxIdx*4 && (u32)start < MatrixIndexA.PosNormalMtxIdx*4+12) || + ((u32)start >= XFMEM_NORMALMATRICES+(MatrixIndexA.PosNormalMtxIdx&31)*3 && (u32)start < XFMEM_NORMALMATRICES+(MatrixIndexA.PosNormalMtxIdx&31)*3+9) ) { + bPosNormalMatrixChanged = true; + } + + if (((u32)start >= MatrixIndexA.Tex0MtxIdx*4 && (u32)start < MatrixIndexA.Tex0MtxIdx*4+12) || + ((u32)start >= MatrixIndexA.Tex1MtxIdx*4 && (u32)start < MatrixIndexA.Tex1MtxIdx*4+12) || + ((u32)start >= MatrixIndexA.Tex2MtxIdx*4 && (u32)start < MatrixIndexA.Tex2MtxIdx*4+12) || + ((u32)start >= MatrixIndexA.Tex3MtxIdx*4 && (u32)start < MatrixIndexA.Tex3MtxIdx*4+12)) { + bTexMatricesChanged[0] = true; + } + + if (((u32)start >= MatrixIndexB.Tex4MtxIdx*4 && (u32)start < MatrixIndexB.Tex4MtxIdx*4+12) || + ((u32)start >= MatrixIndexB.Tex5MtxIdx*4 && (u32)start < MatrixIndexB.Tex5MtxIdx*4+12) || + ((u32)start >= MatrixIndexB.Tex6MtxIdx*4 && (u32)start < MatrixIndexB.Tex6MtxIdx*4+12) || + ((u32)start >= MatrixIndexB.Tex7MtxIdx*4 && (u32)start < MatrixIndexB.Tex7MtxIdx*4+12)) { + bTexMatricesChanged[1] = true; + } + + if (start < XFMEM_POSMATRICES_END ) { + if (nTransformMatricesChanged[0] == -1) { + nTransformMatricesChanged[0] = start; + nTransformMatricesChanged[1] = end>XFMEM_POSMATRICES_END?XFMEM_POSMATRICES_END:end; + } + else { + if (nTransformMatricesChanged[0] > start) nTransformMatricesChanged[0] = start; + if (nTransformMatricesChanged[1] < end) nTransformMatricesChanged[1] = end>XFMEM_POSMATRICES_END?XFMEM_POSMATRICES_END:end; + } + } + + if (start < XFMEM_NORMALMATRICES_END && end > XFMEM_NORMALMATRICES ) { + int _start = start < XFMEM_NORMALMATRICES ? 0 : start-XFMEM_NORMALMATRICES; + int _end = end < XFMEM_NORMALMATRICES_END ? end-XFMEM_NORMALMATRICES : XFMEM_NORMALMATRICES_END-XFMEM_NORMALMATRICES; + + if (nNormalMatricesChanged[0] == -1 ) { + nNormalMatricesChanged[0] = _start; + nNormalMatricesChanged[1] = _end; + } + else { + if (nNormalMatricesChanged[0] > _start) nNormalMatricesChanged[0] = _start; + if (nNormalMatricesChanged[1] < _end) nNormalMatricesChanged[1] = _end; + } + } + + if (start < XFMEM_POSTMATRICES_END && end > XFMEM_POSTMATRICES ) { + int _start = start < XFMEM_POSTMATRICES ? XFMEM_POSTMATRICES : start-XFMEM_POSTMATRICES; + int _end = end < XFMEM_POSTMATRICES_END ? end-XFMEM_POSTMATRICES : XFMEM_POSTMATRICES_END-XFMEM_POSTMATRICES; + + if (nPostTransformMatricesChanged[0] == -1 ) { + nPostTransformMatricesChanged[0] = _start; + nPostTransformMatricesChanged[1] = _end; + } + else { + if (nPostTransformMatricesChanged[0] > _start) nPostTransformMatricesChanged[0] = _start; + if (nPostTransformMatricesChanged[1] < _end) nPostTransformMatricesChanged[1] = _end; + } + } + + if (start < XFMEM_LIGHTS_END && end > XFMEM_LIGHTS) { + int _start = start < XFMEM_LIGHTS ? XFMEM_LIGHTS : start-XFMEM_LIGHTS; + int _end = end < XFMEM_LIGHTS_END ? end-XFMEM_LIGHTS : XFMEM_LIGHTS_END-XFMEM_LIGHTS; + + if (nLightsChanged[0] == -1 ) { + nLightsChanged[0] = _start; + nLightsChanged[1] = _end; + } + else { + if (nLightsChanged[0] > _start) nLightsChanged[0] = _start; + if (nLightsChanged[1] < _end) nLightsChanged[1] = _end; + } + } +} + +void VertexShaderMngr::SetTexMatrixChangedA(u32 Value) +{ + if (MatrixIndexA.Hex != Value) { + VertexManager::Flush(); + if (MatrixIndexA.PosNormalMtxIdx != (Value&0x3f)) + bPosNormalMatrixChanged = true; + bTexMatricesChanged[0] = true; + MatrixIndexA.Hex = Value; + } +} + +void VertexShaderMngr::SetTexMatrixChangedB(u32 Value) +{ + if (MatrixIndexB.Hex != Value) { + VertexManager::Flush(); + bTexMatricesChanged[1] = true; + MatrixIndexB.Hex = Value; + } +} + +void VertexShaderMngr::SetViewport(float* _Viewport) +{ + // check for paper mario + for (size_t i = 0; i < ARRAYSIZE(rawViewport); ++i) { + if( *(u32*)(_Viewport + i) == 0x7f800000 ) + return; // invalid number + } + + memcpy(rawViewport, _Viewport, sizeof(rawViewport)); + bViewportChanged = true; +} + +void VertexShaderMngr::SetViewportChanged() +{ + bViewportChanged = true; +} + +void VertexShaderMngr::SetProjection(float* _pProjection, int constantIndex) +{ + memcpy(rawProjection, _pProjection, sizeof(rawProjection)); + bProjectionChanged = true; +} + +size_t VertexShaderMngr::SaveLoadState(char *ptr, BOOL save) +{ + BEGINSAVELOAD; + + SAVELOAD(&xfregs,sizeof(xfregs)); + SAVELOAD(xfmem,XFMEM_SIZE*sizeof(u32)); + SAVELOAD(rawViewport,sizeof(rawViewport)); + SAVELOAD(rawProjection,sizeof(rawProjection)); + SAVELOAD(&MatrixIndexA,sizeof(TMatrixIndexA)); + SAVELOAD(&MatrixIndexB,sizeof(TMatrixIndexB)); + + if (!save) { + // invalidate all + InvalidateXFRange(0,0x1000); + } + + ENDSAVELOAD; +} + +// LoadXFReg 0x10 +void VertexShaderMngr::LoadXFReg(u32 transferSize, u32 baseAddress, u32 *pData) +{ + + u32 address = baseAddress; + for (int i=0; i<(int)transferSize; i++) + { + address = baseAddress + i; + + // Setup a Matrix + if (address < 0x1000) + { + VertexManager::Flush(); + InvalidateXFRange(address, address+transferSize); + //PRIM_LOG("xfmem write: 0x%x-0x%x\n", address, address+transferSize); + + u32* p1 = &xfmem[address]; + memcpy_gc(p1, &pData[i], transferSize*4); + i += transferSize; + } + else if (address<0x2000) + { + u32 data = pData[i]; + switch (address) + { + case 0x1000: // error + break; + case 0x1001: // diagnostics + break; + case 0x1002: // internal state 0 + break; + case 0x1003: // internal state 1 + break; + case 0x1004: // xf_clock + break; + case 0x1005: // clipdisable + if (data & 1) { // disable clipping detection + } + if (data & 2) { // disable trivial rejection + } + if (data & 4) { // disable cpoly clipping acceleration + } + break; + case 0x1006: //SetGPMetric + break; + case 0x1008: //__GXXfVtxSpecs, wrote 0004 + xfregs.hostinfo = *(INVTXSPEC*)&data; + break; + case 0x1009: //GXSetNumChans (no) + if (xfregs.nNumChans != (data&3) ) { + VertexManager::Flush(); + xfregs.nNumChans = data&3; + } + break; + case 0x100a: //GXSetChanAmbientcolor + if (xfregs.colChans[0].ambColor != data) { + VertexManager::Flush(); + nMaterialsChanged |= 1; + xfregs.colChans[0].ambColor = data; + s_fMaterials[0] = ((data>>24)&0xFF)/255.0f; + s_fMaterials[1] = ((data>>16)&0xFF)/255.0f; + s_fMaterials[2] = ((data>>8)&0xFF)/255.0f; + s_fMaterials[3] = ((data)&0xFF)/255.0f; + } + break; + case 0x100b: //GXSetChanAmbientcolor + if (xfregs.colChans[1].ambColor != data) { + VertexManager::Flush(); + nMaterialsChanged |= 2; + xfregs.colChans[1].ambColor = data; + s_fMaterials[4] = ((data>>24)&0xFF)/255.0f; + s_fMaterials[5] = ((data>>16)&0xFF)/255.0f; + s_fMaterials[6] = ((data>>8)&0xFF)/255.0f; + s_fMaterials[7] = ((data)&0xFF)/255.0f; + } + break; + case 0x100c: //GXSetChanMatcolor (rgba) + if (xfregs.colChans[0].matColor != data) { + VertexManager::Flush(); + nMaterialsChanged |= 4; + xfregs.colChans[0].matColor = data; + s_fMaterials[8] = ((data>>24)&0xFF)/255.0f; + s_fMaterials[9] = ((data>>16)&0xFF)/255.0f; + s_fMaterials[10] = ((data>>8)&0xFF)/255.0f; + s_fMaterials[11] = ((data)&0xFF)/255.0f; + } + break; + case 0x100d: //GXSetChanMatcolor (rgba) + if (xfregs.colChans[1].matColor != data) { + VertexManager::Flush(); + nMaterialsChanged |= 8; + xfregs.colChans[1].matColor = data; + s_fMaterials[12] = ((data>>24)&0xFF)/255.0f; + s_fMaterials[13] = ((data>>16)&0xFF)/255.0f; + s_fMaterials[14] = ((data>>8)&0xFF)/255.0f; + s_fMaterials[15] = ((data)&0xFF)/255.0f; + } + break; + + case 0x100e: // color0 + if (xfregs.colChans[0].color.hex != (data&0x7fff) ) { + VertexManager::Flush(); + xfregs.colChans[0].color.hex = data; + } + break; + case 0x100f: // color1 + if (xfregs.colChans[1].color.hex != (data&0x7fff) ) { + VertexManager::Flush(); + xfregs.colChans[1].color.hex = data; + } + break; + case 0x1010: // alpha0 + if (xfregs.colChans[0].alpha.hex != (data&0x7fff) ) { + VertexManager::Flush(); + xfregs.colChans[0].alpha.hex = data; + } + break; + case 0x1011: // alpha1 + if (xfregs.colChans[1].alpha.hex != (data&0x7fff) ) { + VertexManager::Flush(); + xfregs.colChans[1].alpha.hex = data; + } + break; + case 0x1012: // dual tex transform + if (xfregs.bEnableDualTexTransform != (data&1)) { + VertexManager::Flush(); + xfregs.bEnableDualTexTransform = data&1; + } + break; + + case 0x1013: + case 0x1014: + case 0x1015: + case 0x1016: + case 0x1017: + DEBUG_LOG("xf addr: %x=%x\n", address, data); + break; + case 0x1018: + //_assert_msg_(GX_XF, 0, "XF matrixindex0"); + VertexShaderMngr::SetTexMatrixChangedA(data); //? + break; + case 0x1019: + //_assert_msg_(GX_XF, 0, "XF matrixindex1"); + VertexShaderMngr::SetTexMatrixChangedB(data); //? + break; + + case 0x101a: + VertexManager::Flush(); + VertexShaderMngr::SetViewport((float*)&pData[i]); + i += 6; + break; + + case 0x101c: // paper mario writes 16777216.0f, 1677721.75 + break; + case 0x101f: // paper mario writes 16777216.0f, 5033165.0f + break; + + case 0x1020: + VertexManager::Flush(); + VertexShaderMngr::SetProjection((float*)&pData[i]); + i += 7; + return; + + case 0x103f: // GXSetNumTexGens + if (xfregs.numTexGens != data) { + VertexManager::Flush(); + xfregs.numTexGens = data; + } + break; + + case 0x1040: xfregs.texcoords[0].texmtxinfo.hex = data; break; + case 0x1041: xfregs.texcoords[1].texmtxinfo.hex = data; break; + case 0x1042: xfregs.texcoords[2].texmtxinfo.hex = data; break; + case 0x1043: xfregs.texcoords[3].texmtxinfo.hex = data; break; + case 0x1044: xfregs.texcoords[4].texmtxinfo.hex = data; break; + case 0x1045: xfregs.texcoords[5].texmtxinfo.hex = data; break; + case 0x1046: xfregs.texcoords[6].texmtxinfo.hex = data; break; + case 0x1047: xfregs.texcoords[7].texmtxinfo.hex = data; break; + + case 0x1048: + case 0x1049: + case 0x104a: + case 0x104b: + case 0x104c: + case 0x104d: + case 0x104e: + case 0x104f: + DEBUG_LOG("xf addr: %x=%x\n", address, data); + break; + case 0x1050: xfregs.texcoords[0].postmtxinfo.hex = data; break; + case 0x1051: xfregs.texcoords[1].postmtxinfo.hex = data; break; + case 0x1052: xfregs.texcoords[2].postmtxinfo.hex = data; break; + case 0x1053: xfregs.texcoords[3].postmtxinfo.hex = data; break; + case 0x1054: xfregs.texcoords[4].postmtxinfo.hex = data; break; + case 0x1055: xfregs.texcoords[5].postmtxinfo.hex = data; break; + case 0x1056: xfregs.texcoords[6].postmtxinfo.hex = data; break; + case 0x1057: xfregs.texcoords[7].postmtxinfo.hex = data; break; + + default: + DEBUG_LOG("xf addr: %x=%x\n", address, data); + break; + } + } + else if (address>=0x4000) + { + // MessageBox(NULL, "1", "1", MB_OK); + //4010 __GXSetGenMode + } + } +} + +// Check docs for this sucker... +void VertexShaderMngr::LoadIndexedXF(u32 val, int array) +{ + int index = val>>16; + int address = val&0xFFF; //check mask + int size = ((val>>12)&0xF)+1; + //load stuff from array to address in xf mem + + VertexManager::Flush(); + InvalidateXFRange(address, address+size); + //PRIM_LOG("xfmem iwrite: 0x%x-0x%x\n", address, address+size); + + for (int i = 0; i < size; i++) + xfmem[address + i] = Memory_Read_U32(arraybases[array] + arraystrides[array]*index + i*4); +} + +float* VertexShaderMngr::GetPosNormalMat() +{ + return (float*)xfmem + MatrixIndexA.PosNormalMtxIdx * 4; +} + +void VertexShaderMngr::GetVertexShaderId(VERTEXSHADERUID& id, u32 components) +{ + u32 zbufrender = (bpmem.ztex2.op==ZTEXTURE_ADD)||Renderer::GetZBufferTarget()!=0; + id.values[0] = components|(xfregs.numTexGens<<23)|(xfregs.nNumChans<<27)|((u32)xfregs.bEnableDualTexTransform<<29)|(zbufrender<<30); + + for(int i = 0; i < 2; ++i) { + id.values[1+i] = xfregs.colChans[i].color.enablelighting?(u32)xfregs.colChans[i].color.hex:(u32)xfregs.colChans[i].color.matsource; + id.values[1+i] |= (xfregs.colChans[i].alpha.enablelighting?(u32)xfregs.colChans[i].alpha.hex:(u32)xfregs.colChans[i].alpha.matsource)<<15; + } + // fog + id.values[1] |= (((u32)bpmem.fog.c_proj_fsel.fsel&3)<<30); + id.values[2] |= (((u32)bpmem.fog.c_proj_fsel.fsel>>2)<<30); + + u32* pcurvalue = &id.values[3]; + + for(int i = 0; i < xfregs.numTexGens; ++i) { + TexMtxInfo tinfo = xfregs.texcoords[i].texmtxinfo; + if( tinfo.texgentype != XF_TEXGEN_EMBOSS_MAP ) + tinfo.hex &= 0x7ff; + if( tinfo.texgentype != XF_TEXGEN_REGULAR ) + tinfo.projection = 0; + + u32 val = ((tinfo.hex>>1)&0x1ffff); + if( xfregs.bEnableDualTexTransform && tinfo.texgentype == XF_TEXGEN_REGULAR ) { + // rewrite normalization and post index + val |= ((u32)xfregs.texcoords[i].postmtxinfo.index<<17)|((u32)xfregs.texcoords[i].postmtxinfo.normalize<<23); + } + + switch(i & 3) { + case 0: pcurvalue[0] |= val; break; + case 1: pcurvalue[0] |= val<<24; pcurvalue[1] = val>>8; ++pcurvalue; break; + case 2: pcurvalue[0] |= val<<16; pcurvalue[1] = val>>16; ++pcurvalue; break; + case 3: pcurvalue[0] |= val<<8; ++pcurvalue; break; + } + } +} + +static char text[16384]; +#define WRITE p+=sprintf + +#define LIGHTS_POS "" + +bool VertexShaderMngr::GenerateVertexShader(VERTEXSHADER& vs, u32 components) +{ + DVSTARTPROFILE(); + + _assert_( bpmem.genMode.numtexgens == xfregs.numTexGens); + _assert_( bpmem.genMode.numcolchans == xfregs.nNumChans); + + u32 lightMask = 0; + if( xfregs.nNumChans > 0 ) + lightMask |= xfregs.colChans[0].color.GetFullLightMask() | xfregs.colChans[0].alpha.GetFullLightMask(); + if( xfregs.nNumChans > 1 ) + lightMask |= xfregs.colChans[1].color.GetFullLightMask() | xfregs.colChans[1].alpha.GetFullLightMask(); + + bool bOutputZ = bpmem.ztex2.op==ZTEXTURE_ADD || Renderer::GetZBufferTarget()!=0; + int ztexcoord = -1; + + char *p = text; + WRITE(p,"//Vertex Shader: comp:%x, \n", components); + WRITE(p,"typedef struct {\n" + " float4 T0, T1, T2;\n" + " float4 N0, N1, N2;\n" + "} s_"I_POSNORMALMATRIX";\n\n" + "typedef struct {\n" + " float4 t;\n" + "} FLT4;\n" + "typedef struct {\n" + " FLT4 T[24];\n" + "} s_"I_TEXMATRICES";\n\n" + "typedef struct {\n" + " FLT4 T[64];\n" + "} s_"I_TRANSFORMMATRICES";\n\n" + "typedef struct {\n" + " FLT4 T[32];\n" + "} s_"I_NORMALMATRICES";\n\n" + "typedef struct {\n" + " FLT4 T[64];\n" + "} s_"I_POSTTRANSFORMMATRICES";\n\n" + "typedef struct {\n" + " float4 col;\n" + " float4 cosatt;\n" + " float4 distatt;\n" + " float4 pos;\n" + " float4 dir;\n" + "} Light;\n\n" + "typedef struct {\n" + " Light lights[8];\n" + "} s_"I_LIGHTS";\n\n" + "typedef struct {\n" + " float4 C0, C1, C2, C3;\n" + "} s_"I_MATERIALS";\n\n" + "typedef struct {\n" + " float4 T0,T1,T2,T3;\n" + "} s_"I_PROJECTION";\n" + "typedef struct {\n" + " float4 params;\n" // a, b, c, b_shift + "} s_"I_FOGPARAMS";\n\n"); + + WRITE(p,"struct VS_OUTPUT {\n"); + WRITE(p," float4 pos : POSITION;\n"); + WRITE(p," float4 colors[2] : COLOR0;\n"); + + // if outputting Z, embed the Z coordinate in the w component of a texture coordinate + // if number of tex gens occupies all the texture coordinates, use the last tex coord + // otherwise use the next available tex coord + for(int i = 0; i < xfregs.numTexGens; ++i) { + WRITE(p," float%d tex%d : TEXCOORD%d;\n", (i==(xfregs.numTexGens-1)&&bOutputZ)?4:3, i, i); + } + if( bOutputZ && xfregs.numTexGens == 0 ) { + ztexcoord = 0; + WRITE(p," float4 tex%d : TEXCOORD%d;\n", ztexcoord, ztexcoord); + } + else if( bOutputZ ) + ztexcoord = xfregs.numTexGens-1; + + WRITE(p,"};\n"); + WRITE(p,"\n"); + + // uniforms + + // bool bTexMtx = ((components & VertexLoader::VB_HAS_TEXMTXIDXALL)<= 32 ? (posmtx-32) : posmtx;\n"); + WRITE(p,"float3 N0 = "I_NORMALMATRICES".T[normidx].t.xyz, N1 = "I_NORMALMATRICES".T[normidx+1].t.xyz, N2 = "I_NORMALMATRICES".T[normidx+2].t.xyz;\n"); + } + + if (components & VertexLoader::VB_HAS_NRM0) + WRITE(p,"half3 _norm0 = half3(dot(N0, rawnorm0), dot(N1, rawnorm0), dot(N2, rawnorm0));\n" + "half3 norm0 = normalize(_norm0);\n"); + if (components & VertexLoader::VB_HAS_NRM1) + WRITE(p,"half3 _norm1 = half3(dot(N0, rawnorm1), dot(N1, rawnorm1), dot(N2, rawnorm1));\n"); + //"half3 norm1 = normalize(_norm1);\n"); + if (components & VertexLoader::VB_HAS_NRM2) + WRITE(p,"half3 _norm2 = half3(dot(N0, rawnorm2), dot(N1, rawnorm2), dot(N2, rawnorm2));\n"); + //"half3 norm2 = normalize(_norm2);\n"); + } + else { + WRITE(p, "float4 pos = float4(dot("I_POSNORMALMATRIX".T0, rawpos), dot("I_POSNORMALMATRIX".T1, rawpos), dot("I_POSNORMALMATRIX".T2, rawpos), 1);\n"); + if (components & VertexLoader::VB_HAS_NRM0) + WRITE(p,"half3 _norm0 = half3(dot("I_POSNORMALMATRIX".N0.xyz, rawnorm0), dot("I_POSNORMALMATRIX".N1.xyz, rawnorm0), dot("I_POSNORMALMATRIX".N2.xyz, rawnorm0));\n" + "half3 norm0 = normalize(_norm0);\n"); + if (components & VertexLoader::VB_HAS_NRM1) + WRITE(p,"half3 _norm1 = half3(dot("I_POSNORMALMATRIX".N0.xyz, rawnorm1), dot("I_POSNORMALMATRIX".N1.xyz, rawnorm1), dot("I_POSNORMALMATRIX".N2.xyz, rawnorm1));\n"); + //"half3 norm1 = normalize(_norm1);\n"); + if (components & VertexLoader::VB_HAS_NRM2) + WRITE(p,"half3 _norm2 = half3(dot("I_POSNORMALMATRIX".N0.xyz, rawnorm2), dot("I_POSNORMALMATRIX".N1.xyz, rawnorm2), dot("I_POSNORMALMATRIX".N2.xyz, rawnorm2));\n"); + //"half3 norm2 = normalize(_norm2);\n"); + } + + if (!(components & VertexLoader::VB_HAS_NRM0)) + WRITE(p,"half3 _norm0 = half3(0,0,0), norm0= half3(0,0,0);\n"); + + WRITE(p,"o.pos = float4(dot("I_PROJECTION".T0, pos), dot("I_PROJECTION".T1, pos), dot("I_PROJECTION".T2, pos), dot("I_PROJECTION".T3, pos));\n"); + + WRITE(p, "half4 mat, lacc;\n" + "half3 ldir, h;\n" + "half dist, dist2, attn;\n"); + + // lights/colors + for (int j=0; j= 0 ) + WRITE(p, "o.tex%d.w = o.pos.z/o.pos.w;\n", ztexcoord); + +// if( bpmem.fog.c_proj_fsel.fsel != 0 ) { +// switch(bpmem.fog.c_proj_fsel.fsel) { +// case 1: // linear +// break; +// case 4: // exp +// break; +// case 5: // exp2 +// break; +// case 6: // backward exp +// break; +// case 7: // backward exp2 +// break; +// } +// +// WRITE(p, "o.fog = o.pos.z/o.pos.w;\n"); +// } + + WRITE(p,"return o;\n}\n\0"); + + return VertexShaderMngr::CompileVertexShader(vs, text); +} + +// coloralpha - 1 if color, 2 if alpha +char* VertexShaderMngr::GenerateLightShader(char* p, int index, const LitChannel& chan, const char* dest, int coloralpha) +{ + const char* swizzle = "xyzw"; + if( coloralpha == 1 ) swizzle = "xyz"; + else if( coloralpha == 2 ) swizzle = "w"; + + if( !(chan.attnfunc&1) ) { + // atten disabled + switch(chan.diffusefunc) { + case LIGHTDIF_NONE: + WRITE(p, "%s.%s += "I_LIGHTS".lights[%d].col.%s;\n", dest, swizzle, index, swizzle); + break; + case LIGHTDIF_SIGN: + case LIGHTDIF_CLAMP: + WRITE(p, "ldir = normalize("I_LIGHTS".lights[%d].pos.xyz - pos.xyz);\n", index); + WRITE(p, "%s.%s += %sdot(ldir, norm0)) * "I_LIGHTS".lights[%d].col.%s;\n", + dest, swizzle, chan.diffusefunc != LIGHTDIF_SIGN ? "max(0.0f," :"(", index, swizzle); + break; + default: _assert_(0); + } + } + else { // spec and spot + WRITE(p, "ldir = "I_LIGHTS".lights[%d].pos.xyz - pos.xyz;\n", index); + + if( chan.attnfunc == 3 ) { // spot + WRITE(p, "dist2 = dot(ldir, ldir);\n" + "dist = sqrt(dist2);\n" + "ldir = ldir / dist;\n" + "attn = max(0.0f, dot(ldir, "I_LIGHTS".lights[%d].dir.xyz));\n",index); + WRITE(p, "attn = max(0.0f, dot("I_LIGHTS".lights[%d].cosatt.xyz, half3(1, attn, attn*attn))) / dot("I_LIGHTS".lights[%d].distatt.xyz, half3(1,dist,dist2));\n", index, index); + } + else if( chan.attnfunc == 1) { // specular + WRITE(p, "attn = dot(norm0, "I_LIGHTS".lights[%d].pos.xyz) > 0 ? max(0.0f, dot(norm0, "I_LIGHTS".lights[%d].dir.xyz)) : 0;\n", index, index); + WRITE(p, "ldir = half3(1,attn,attn*attn);\n"); + WRITE(p, "attn = max(0.0f, dot("I_LIGHTS".lights[%d].cosatt.xyz, ldir)) / dot("I_LIGHTS".lights[%d].distatt.xyz, ldir);\n", index, index); + } + + switch(chan.diffusefunc) { + case LIGHTDIF_NONE: + WRITE(p, "%s.%s += attn * "I_LIGHTS".lights[%d].col.%s;\n", dest, swizzle, index, swizzle); + break; + case LIGHTDIF_SIGN: + case LIGHTDIF_CLAMP: + WRITE(p, "%s.%s += attn * %sdot(ldir, norm0)) * "I_LIGHTS".lights[%d].col.%s;\n", + dest, swizzle, chan.diffusefunc != LIGHTDIF_SIGN ? "max(0.0f," :"(", index, swizzle); + break; + default: _assert_(0); + } + } + WRITE(p, "\n"); + + return p; +} diff --git a/Source/Plugins/Plugin_VideoOGL/Src/VertexShader.h b/Source/Plugins/Plugin_VideoOGL/Src/VertexShader.h new file mode 100644 index 0000000000..bd09fcd3dd --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/VertexShader.h @@ -0,0 +1,325 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef GCOGL_VERTEXSHADER_H +#define GCOGL_VERTEXSHADER_H + +#include + +///////////// +// Lighting +///////////// +#define XF_TEXPROJ_ST 0 +#define XF_TEXPROJ_STQ 1 + +#define XF_TEXINPUT_AB11 0 +#define XF_TEXINPUT_ABC1 1 + +#define XF_TEXGEN_REGULAR 0 +#define XF_TEXGEN_EMBOSS_MAP 1 // used when bump mapping +#define XF_TEXGEN_COLOR_STRGBC0 2 +#define XF_TEXGEN_COLOR_STRGBC1 3 + +#define XF_SRCGEOM_INROW 0 // input is abc +#define XF_SRCNORMAL_INROW 1 // input is abc +#define XF_SRCCOLORS_INROW 2 +#define XF_SRCBINORMAL_T_INROW 3 // input is abc +#define XF_SRCBINORMAL_B_INROW 4 // input is abc +#define XF_SRCTEX0_INROW 5 +#define XF_SRCTEX1_INROW 6 +#define XF_SRCTEX2_INROW 7 +#define XF_SRCTEX3_INROW 8 +#define XF_SRCTEX4_INROW 9 +#define XF_SRCTEX5_INROW 10 +#define XF_SRCTEX6_INROW 11 +#define XF_SRCTEX7_INROW 12 + +struct Light +{ + u32 useless[3]; + u32 color; //rgba + float a0; //attenuation + float a1; + float a2; + float k0; //k stuff + float k1; + float k2; + union + { + struct { + float dpos[3]; + float ddir[3]; // specular lights only + }; + struct { + float sdir[3]; + float shalfangle[3]; // specular lights only + }; + }; +}; + +#define LIGHTDIF_NONE 0 +#define LIGHTDIF_SIGN 1 +#define LIGHTDIF_CLAMP 2 + +#define LIGHTATTN_SPEC 0 // specular attenuation +#define LIGHTATTN_SPOT 1 // distance/spotlight attenuation +#define LIGHTATTN_NONE 2 +#define LIGHTATTN_DIR 3 + +union LitChannel +{ + struct + { + unsigned matsource : 1; + unsigned enablelighting : 1; + unsigned lightMask0_3 : 4; + unsigned ambsource : 1; + unsigned diffusefunc : 2; // LIGHTDIF_X + unsigned attnfunc : 2; // LIGHTATTN_X + unsigned lightMask4_7 : 4; + }; + struct + { + u32 hex : 15; + u32 unused : 17; + }; + struct + { + u32 dummy0 : 7; + u32 lightparams : 4; + u32 dummy1 : 21; + }; + unsigned int GetFullLightMask() const + { + return enablelighting ? (lightMask0_3 | (lightMask4_7 << 4)) : 0; + } +}; + +struct ColorChannel +{ + u32 ambColor; + u32 matColor; + LitChannel color; + LitChannel alpha; +}; + + +union INVTXSPEC +{ + struct + { + unsigned numcolors : 2; + unsigned numnormals : 2; // 0 - nothing, 1 - just normal, 2 - normals and binormals + unsigned numtextures : 4; + unsigned unused : 24; + }; + u32 hex; +}; + +union TexMtxInfo +{ + struct + { + unsigned unknown : 1; + unsigned projection : 1; // XF_TEXPROJ_X + unsigned inputform : 2; // XF_TEXINPUT_X + unsigned texgentype : 3; // XF_TEXGEN_X + unsigned sourcerow : 5; // XF_SRCGEOM_X + unsigned embosssourceshift : 3; // what generated texcoord to use + unsigned embosslightshift : 3; // light index that is used + }; + u32 hex; +}; + +union PostMtxInfo +{ + struct + { + unsigned index : 6; // base row of dual transform matrix + unsigned unused : 2; + unsigned normalize : 1; // normalize before send operation + }; + u32 hex; +}; + +struct TexCoordInfo +{ + TexMtxInfo texmtxinfo; + PostMtxInfo postmtxinfo; +}; + +struct XFRegisters +{ + int numTexGens; + int nNumChans; + INVTXSPEC hostinfo; // number of textures,colors,normals from vertex input + ColorChannel colChans[2]; //C0A0 C1A1 + TexCoordInfo texcoords[8]; + bool bEnableDualTexTransform; +}; + +#define XFMEM_SIZE 0x8000 +#define XFMEM_POSMATRICES 0x000 +#define XFMEM_POSMATRICES_END 0x100 +#define XFMEM_NORMALMATRICES 0x400 +#define XFMEM_NORMALMATRICES_END 0x460 +#define XFMEM_POSTMATRICES 0x500 +#define XFMEM_POSTMATRICES_END 0x600 +#define XFMEM_LIGHTS 0x600 +#define XFMEM_LIGHTS_END 0x680 + +// Matrix indices +union TMatrixIndexA +{ + struct + { + unsigned PosNormalMtxIdx : 6; + unsigned Tex0MtxIdx : 6; + unsigned Tex1MtxIdx : 6; + unsigned Tex2MtxIdx : 6; + unsigned Tex3MtxIdx : 6; + }; + struct + { + u32 Hex : 30; + u32 unused : 2; + }; +}; + +union TMatrixIndexB +{ + struct + { + unsigned Tex4MtxIdx : 6; + unsigned Tex5MtxIdx : 6; + unsigned Tex6MtxIdx : 6; + unsigned Tex7MtxIdx : 6; + }; + struct + { + u32 Hex : 24; + u32 unused : 8; + }; +}; + +struct VERTEXSHADER +{ + VERTEXSHADER() : glprogid(0) {} + GLuint glprogid; // opengl program id + +#ifdef _DEBUG + std::string strprog; +#endif +}; + +class VertexShaderMngr +{ + struct VSCacheEntry + { + VERTEXSHADER shader; + int frameCount; + VSCacheEntry() : frameCount(0) {} + void Destroy() { + SAFE_RELEASE_PROG(shader.glprogid); + } + }; + + class VERTEXSHADERUID + { + public: + VERTEXSHADERUID() {} + VERTEXSHADERUID(const VERTEXSHADERUID& r) { + for(size_t i = 0; i < sizeof(values) / sizeof(u32); ++i) + values[i] = r.values[i]; + } + + bool operator<(const VERTEXSHADERUID& _Right) const + { + if( values[0] < _Right.values[0] ) + return true; + else if( values[0] > _Right.values[0] ) + return false; + + int N = (((values[0]>>23)&0xf)*3+3)/4 + 3; // numTexGens*3/4+1 + for(int i = 1; i < N; ++i) { + if( values[i] < _Right.values[i] ) + return true; + else if( values[i] > _Right.values[i] ) + return false; + } + + return false; + } + + bool operator==(const VERTEXSHADERUID& _Right) const + { + if( values[0] != _Right.values[0] ) + return false; + + int N = (((values[0]>>23)&0xf)*3+3)/4 + 3; // numTexGens*3/4+1 + for(int i = 1; i < N; ++i) { + if( values[i] != _Right.values[i] ) + return false; + } + + return true; + } + + u32 values[9]; + }; + + typedef std::map VSCache; + + static VSCache vshaders; + static VERTEXSHADER* pShaderLast; + static TMatrixIndexA MatrixIndexA; + static TMatrixIndexB MatrixIndexB; + + static void GetVertexShaderId(VERTEXSHADERUID& uid, u32 components); + static bool GenerateVertexShader(VERTEXSHADER& vs, u32 components); + static char* GenerateLightShader(char* p, int index, const LitChannel& chan, const char* dest, int coloralpha); + +public: + static void Init(); + static void Cleanup(); + static void Shutdown(); + static VERTEXSHADER* GetShader(u32 components); + static bool CompileVertexShader(VERTEXSHADER& ps, const char* pstrprogram); + + // constant management + static void SetConstants(VERTEXSHADER& vs); + + static void SetViewport(float* _Viewport); + static void SetViewportChanged(); + static void SetProjection(float* _pProjection, int constantIndex = -1); + static void InvalidateXFRange(int start, int end); + static void SetTexMatrixChangedA(u32 Value); + static void SetTexMatrixChangedB(u32 Value); + + static size_t SaveLoadState(char *ptr, BOOL save); + static void LoadXFReg(u32 transferSize, u32 address, u32 *pData); + static void LoadIndexedXF(u32 val, int array); + + static float* GetPosNormalMat(); + + static float rawViewport[6]; + static float rawProjection[7]; +}; + +extern XFRegisters xfregs; + +#endif diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Windows/ChunkFile.cpp b/Source/Plugins/Plugin_VideoOGL/Src/Windows/ChunkFile.cpp new file mode 100644 index 0000000000..c5a7e6ed9f --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/Windows/ChunkFile.cpp @@ -0,0 +1,281 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "ChunkFile.h" + +namespace W32Util +{ + ChunkFile::ChunkFile(const TCHAR *filename, bool _read) + { + data=0; + fastMode=false; + if (file.Open(filename,_read ? FILE_READ : FILE_WRITE)) + { + didFail=false; + } + else + { + didFail=true; + return; + } + + int fSize = file.GetSize(); + + fastMode = _read ? true : false; + + if (fastMode) + { + data = new char[fSize]; + file.Read(data,fSize); + file.Close(); + } + + eof=fSize; + numLevels=0; + read=_read; + pos=0; + didFail=false; + } + + ChunkFile::~ChunkFile() + { + if (fastMode && data) + delete [] data; + else + file.Close(); + } + + + int ChunkFile::ReadInt() + { + if (posgetHWND(),tempx,0,0); + */ + stack[numLevels]=temp; + SeekTo(stack[numLevels].parentStartLocation); + return false; + } + + //descend into it + //pos was set inside the loop above + eof = stack[numLevels].startLocation + stack[numLevels].length; + numLevels++; + return true; + } + else + { + //write a chunk id, and prepare for filling in length later + WriteInt(id); + WriteInt(0); //will be filled in by Ascend + stack[numLevels].startLocation=pos; + numLevels++; + return true; + } + } + + void ChunkFile::SeekTo(int _pos) + { + if (!fastMode) + file.SeekBeg(_pos); + pos=_pos; + } + + //let's Ascend out + void ChunkFile::Ascend() + { + if (read) + { + //Ascend, and restore information + numLevels--; + SeekTo(stack[numLevels].parentStartLocation); + eof = stack[numLevels].parentEOF; + } + else + { + numLevels--; + //now fill in the written length automatically + int posNow = pos; + SeekTo(stack[numLevels].startLocation - 4); + WriteInt(posNow-stack[numLevels].startLocation); + SeekTo(posNow); + } + } + + //read a block + void ChunkFile::ReadData(void *what, int count) + { + + if (fastMode) + memcpy(what,data+pos,count); + else + file.Read(what,count); + + pos+=count; + char temp[4]; //discarded + count &= 3; + if (count) + { + count=4-count; + if (!fastMode) + file.Read(temp,count); + pos+=count; + } + } + + //write a block + void ChunkFile::WriteData(void *what, int count) + { + /* + memcpy(data+pos,what,count); + pos += count; + */ + file.Write(what,count); + pos+=count; + char temp[5]={0,0,0,0,0}; + count &= 3; + if (count) + { + count=4-count; + file.Write(temp,count); + pos+=count; + } + } + + /* + void ChunkFile::WriteString(String str) + { + wchar_t *text; + int len=str.length(); + #ifdef UNICODE + text = str.getPointer(); + #else + text=new wchar_t[len+1]; + str.toUnicode(text); + #endif + WriteInt(len); + WriteData((char *)text,len*sizeof(wchar_t)); + #ifndef UNICODE + delete [] text; + #endif + } + + + String ChunkFile::readString() + { + int len=ReadInt(); + wchar_t *text = new wchar_t[len+1]; + ReadData((char *)text,len*sizeof(wchar_t)); + text[len]=0; + #ifdef UNICODE + String s(text); + delete [] text; + return s; + #else + String temp; + temp.fromUnicode(text); + delete [] text; + return temp; + #endif + } + */ + + int ChunkFile::GetCurrentChunkSize() + { + if (numLevels) + return stack[numLevels-1].length; + else + return 0; + } +} diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Windows/ChunkFile.h b/Source/Plugins/Plugin_VideoOGL/Src/Windows/ChunkFile.h new file mode 100644 index 0000000000..28064095f3 --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/Windows/ChunkFile.h @@ -0,0 +1,78 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#pragma once + +#include "stdafx.h" + +//TO REMEMBER WHEN USING: + +//EITHER a chunk contains ONLY data +//OR it contains ONLY other chunks +//otherwise the scheme breaks... +#include "File.h" + +namespace W32Util +{ + inline unsigned int flipID(unsigned int id) + { + return ((id>>24)&0xFF) | ((id>>8)&0xFF00) | ((id<<8)&0xFF0000) | ((id<<24)&0xFF000000); + } + + class ChunkFile + { + File file; + struct ChunkInfo + { + int startLocation; + int parentStartLocation; + int parentEOF; + unsigned int ID; + int length; + }; + ChunkInfo stack[8]; + int numLevels; + + char *data; + int pos,eof; + bool fastMode; + bool read; + bool didFail; + + void SeekTo(int _pos); + int GetPos() {return pos;} + public: + ChunkFile(const TCHAR *filename, bool _read); + ~ChunkFile(); + + bool Descend(unsigned int id); + void Ascend(); + + int ReadInt(); + void ReadInt(int &i) {i = ReadInt();} + void ReadData(void *data, int count); +// String ReadString(); + + void WriteInt(int i); + //void WriteString(String str); + void WriteData(void *data, int count); + + int GetCurrentChunkSize(); + bool Failed() {return didFail;} + }; + +} diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Windows/DialogManager.cpp b/Source/Plugins/Plugin_VideoOGL/Src/Windows/DialogManager.cpp new file mode 100644 index 0000000000..e40a9ba81d --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/Windows/DialogManager.cpp @@ -0,0 +1,44 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "DialogManager.h" + +typedef std::vector WindowList; +WindowList dialogs; + +void DialogManager::AddDlg(HWND hDialog) +{ + dialogs.push_back(hDialog); +} + +bool DialogManager::IsDialogMessage(LPMSG message) +{ + WindowList::iterator iter; + for (iter=dialogs.begin(); iter!=dialogs.end(); iter++) + { + if (::IsDialogMessage(*iter,message)) + return true; + } + return false; +} + +void DialogManager::EnableAll(BOOL enable) +{ + WindowList::iterator iter; + for (iter=dialogs.begin(); iter!=dialogs.end(); iter++) + EnableWindow(*iter,enable); +} diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Windows/DialogManager.h b/Source/Plugins/Plugin_VideoOGL/Src/Windows/DialogManager.h new file mode 100644 index 0000000000..49d39e16d4 --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/Windows/DialogManager.h @@ -0,0 +1,29 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#pragma once + +#include "stdafx.h" + +class DialogManager +{ +public: + static void AddDlg(HWND hDialog); + static bool IsDialogMessage(LPMSG message); + static void EnableAll(BOOL enable); +}; + diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Windows/DlgSettings.cpp b/Source/Plugins/Plugin_VideoOGL/Src/Windows/DlgSettings.cpp new file mode 100644 index 0000000000..b15be9f59a --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/Windows/DlgSettings.cpp @@ -0,0 +1,192 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "Globals.h" + +#include + +#include "resource.h" +#include "PropertySheet.h" +#include "ShellUtil.h" +#include "Misc.h" + +struct TabOGL : public W32Util::Tab +{ + void Init(HWND hDlg) + { + ComboBox_AddString(GetDlgItem(hDlg, IDC_ANTIALIASMODE), "1X"); + ComboBox_AddString(GetDlgItem(hDlg, IDC_ANTIALIASMODE), "2X"); + ComboBox_AddString(GetDlgItem(hDlg, IDC_ANTIALIASMODE), "4X"); + ComboBox_AddString(GetDlgItem(hDlg, IDC_ANTIALIASMODE), "8X"); + ComboBox_AddString(GetDlgItem(hDlg, IDC_ANTIALIASMODE), "16X"); + ComboBox_SetCurSel(GetDlgItem(hDlg, IDC_ANTIALIASMODE), g_Config.iMultisampleMode); + + //EnableWindow(GetDlgItem(hDlg, IDC_ANTIALIASMODE), FALSE); + + for (int i = 0; i < NUMWNDRES; i++) + { + char temp[256]; + sprintf(temp,"%ix%i",g_Res[i][0],g_Res[i][1]); + ComboBox_AddString(GetDlgItem(hDlg,IDC_RESOLUTIONWINDOWED),temp); + ComboBox_AddString(GetDlgItem(hDlg,IDC_RESOLUTION), temp); + } + ComboBox_SetCurSel(GetDlgItem(hDlg,IDC_RESOLUTIONWINDOWED),g_Config.iWindowedRes); + ComboBox_SetCurSel(GetDlgItem(hDlg,IDC_RESOLUTION), g_Config.iFSResolution); + + CheckDlgButton(hDlg, IDC_FULLSCREENENABLE, g_Config.bFullscreen ? TRUE : FALSE); + } + + void Command(HWND hDlg,WPARAM wParam) + { + /* + switch (LOWORD(wParam)) + { + default: + break; + } + */ + } + + void Apply(HWND hDlg) + { + g_Config.iWindowedRes = ComboBox_GetCurSel(GetDlgItem(hDlg, IDC_RESOLUTIONWINDOWED)); + g_Config.iMultisampleMode = ComboBox_GetCurSel(GetDlgItem(hDlg, IDC_ANTIALIASMODE)); + g_Config.iFSResolution = ComboBox_GetCurSel(GetDlgItem(hDlg,IDC_RESOLUTION)); + g_Config.bFullscreen = Button_GetCheck(GetDlgItem(hDlg, IDC_FULLSCREENENABLE)) ? true : false; + } +}; + +struct TabAdvanced : public W32Util::Tab +{ + void Init(HWND hDlg) + { + HWND opt = GetDlgItem(hDlg,IDC_DLOPTLEVEL); + ComboBox_AddString(opt,"0: Interpret (slowest, most compatible)"); + ComboBox_AddString(opt,"1: Compile lists and decode vertex lists"); + //ComboBox_AddString(opt,"2: Compile+decode to vbufs and use hw xform"); + //ComboBox_AddString(opt,"Recompile to vbuffers and shaders"); + ComboBox_SetCurSel(opt,g_Config.iCompileDLsLevel); + + Button_SetCheck(GetDlgItem(hDlg,IDC_OVERLAYSTATS), g_Config.bOverlayStats); + Button_SetCheck(GetDlgItem(hDlg,IDC_WIREFRAME), g_Config.bWireFrame); + Button_SetCheck(GetDlgItem(hDlg,IDC_TEXDUMP), g_Config.bDumpTextures); + Button_SetCheck(GetDlgItem(hDlg,IDC_SHOWSHADERERRORS), g_Config.bShowShaderErrors); + + SetWindowText(GetDlgItem(hDlg,IDC_TEXDUMPPATH),g_Config.texDumpPath); + Edit_LimitText(GetDlgItem(hDlg,IDC_TEXDUMPPATH),255); + } + void Command(HWND hDlg,WPARAM wParam) + { + switch (LOWORD(wParam)) + { + case IDC_BROWSETEXDUMPPATH: + { + std::string path = W32Util::BrowseForFolder(hDlg,"Choose texture dump path:"); + SetWindowText(GetDlgItem(hDlg,IDC_TEXDUMPPATH),path.c_str()); + } + break; + default: + break; + } + } + void Apply(HWND hDlg) + { + g_Config.bOverlayStats = Button_GetCheck(GetDlgItem(hDlg,IDC_OVERLAYSTATS)) ? true : false; + g_Config.bWireFrame = Button_GetCheck(GetDlgItem(hDlg,IDC_WIREFRAME)) ? true : false; + g_Config.bDumpTextures = Button_GetCheck(GetDlgItem(hDlg,IDC_TEXDUMP)) ? true : false; + g_Config.iCompileDLsLevel = (int)ComboBox_GetCurSel(GetDlgItem(hDlg,IDC_DLOPTLEVEL)); + g_Config.bShowShaderErrors = Button_GetCheck(GetDlgItem(hDlg,IDC_SHOWSHADERERRORS)) ? true : false; + char temp[MAX_PATH]; + GetWindowText(GetDlgItem(hDlg,IDC_TEXDUMPPATH), temp, MAX_PATH); + strcpy(g_Config.texDumpPath, temp); + } +}; + +struct TabDebug : public W32Util::Tab +{ + void Init(HWND hDlg) + { + } + void Command(HWND hDlg,WPARAM wParam) + { + /* + switch (LOWORD(wParam)) + { + default: + break; + } + */ + } + void Apply(HWND hDlg) + { + } +}; + +struct TabEnhancements : public W32Util::Tab +{ + void Init(HWND hDlg) + { + Button_SetCheck(GetDlgItem(hDlg,IDC_FORCEFILTERING),g_Config.bForceFiltering); + } + void Command(HWND hDlg,WPARAM wParam) + { + /* + switch (LOWORD(wParam)) + { + default: + break; + } + */ + } + void Apply(HWND hDlg) + { + g_Config.bForceFiltering = Button_GetCheck(GetDlgItem(hDlg,IDC_FORCEFILTERING)) ? true : false; + } +}; + + +void DlgSettings_Show(HINSTANCE hInstance, HWND _hParent) +{ + g_Config.Load(); + W32Util::PropSheet sheet; + sheet.Add(new TabOGL,(LPCTSTR)IDD_SETTINGS,"Direct3D"); + sheet.Add(new TabEnhancements,(LPCTSTR)IDD_ENHANCEMENTS,"Enhancements"); + sheet.Add(new TabAdvanced,(LPCTSTR)IDD_ADVANCED,"Advanced"); + //sheet.Add(new TabDebug,(LPCTSTR)IDD_DEBUGGER,"Debugger"); + sheet.Show(hInstance,_hParent,"Graphics Plugin"); + g_Config.Save(); +} + +// Message handler for about box. +LRESULT CALLBACK AboutProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) +{ + switch (message) + { + case WM_INITDIALOG: + W32Util::CenterWindow(hDlg); + return TRUE; + + case WM_COMMAND: + if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) + { + EndDialog(hDlg, LOWORD(wParam)); + return TRUE; + } + break; + } + return FALSE; +} diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Windows/DlgSettings.h b/Source/Plugins/Plugin_VideoOGL/Src/Windows/DlgSettings.h new file mode 100644 index 0000000000..701768100b --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/Windows/DlgSettings.h @@ -0,0 +1,23 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#pragma once + +#include "stdafx.h" + +void DlgSettings_Show(HINSTANCE hInstance, HWND parent); +LRESULT CALLBACK AboutProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Windows/EmuWindow.cpp b/Source/Plugins/Plugin_VideoOGL/Src/Windows/EmuWindow.cpp new file mode 100644 index 0000000000..12e97003b3 --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/Windows/EmuWindow.cpp @@ -0,0 +1,174 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + + +#include + +#include "../../Core/Src/Core.h" +#include "EmuWindow.h" + +namespace EmuWindow +{ + HWND m_hWnd; + HWND m_hParent = NULL; + HINSTANCE m_hInstance; + WNDCLASSEX wndClass; + const TCHAR m_szClassName[] = "DolphinEmuWnd"; + int g_winstyle; + + HWND GetWnd() + { + return m_hWnd; + } + + HWND GetParentWnd() + { + return m_hParent; + } + + LRESULT CALLBACK WndProc( HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam ) + { + HDC hdc; + PAINTSTRUCT ps; + switch( iMsg ) + { + case WM_PAINT: + hdc = BeginPaint( hWnd, &ps ); + EndPaint( hWnd, &ps ); + return 0; + + case WM_KEYDOWN: + switch( LOWORD( wParam )) + { + case VK_ESCAPE: /* Pressing esc quits */ + //DestroyWindow(hWnd); + //PostQuitMessage(0); + break; + /* + case MY_KEYS: + hypotheticalScene->sendMessage(KEYDOWN...); + */ + } + break; + + case WM_CLOSE: + //Core::SetState(Core::CORE_UNINITIALIZED); + exit(0); + return 0; + + case WM_DESTROY: + //Shutdown(); + //PostQuitMessage( 0 ); + break; + } + + return DefWindowProc(hWnd, iMsg, wParam, lParam); + } + + + HWND OpenWindow(HWND parent, HINSTANCE hInstance, bool windowed, int width, int height, const TCHAR *title) + { + wndClass.cbSize = sizeof( wndClass ); + wndClass.style = CS_HREDRAW | CS_VREDRAW; + wndClass.lpfnWndProc = WndProc; + wndClass.cbClsExtra = 0; + wndClass.cbWndExtra = 0; + wndClass.hInstance = hInstance; + wndClass.hIcon = LoadIcon( NULL, IDI_APPLICATION ); + wndClass.hCursor = LoadCursor( NULL, IDC_ARROW ); + wndClass.hbrBackground = (HBRUSH)GetStockObject( BLACK_BRUSH ); + wndClass.lpszMenuName = NULL; + wndClass.lpszClassName = m_szClassName; + wndClass.hIconSm = LoadIcon( NULL, IDI_APPLICATION ); + + m_hInstance = hInstance; + RegisterClassEx( &wndClass ); + + if (parent && windowed) + { + m_hWnd = CreateWindow(m_szClassName, title, + WS_CHILD, + CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT, + parent, NULL, hInstance, NULL ); + + m_hParent = parent; + + ShowWindow(m_hWnd, SW_SHOWMAXIMIZED); + } + else + { + DWORD style = windowed ? WS_OVERLAPPEDWINDOW : WS_POPUP; + + RECT rc = {0, 0, width, height}; + AdjustWindowRect(&rc, style, false); + + int w = rc.right - rc.left; + int h = rc.bottom - rc.top; + + rc.left = (1280 - w)/2; + rc.right = rc.left + w; + rc.top = (1024 - h)/2; + rc.bottom = rc.top + h; + + + m_hWnd = CreateWindow(m_szClassName, title, + style, + rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, + parent, NULL, hInstance, NULL ); + + g_winstyle = GetWindowLong( m_hWnd, GWL_STYLE ); + g_winstyle &= ~WS_MAXIMIZE & ~WS_MINIMIZE; // remove minimize/maximize style + + } + + return m_hWnd; + } + + void Show() + { + ShowWindow(m_hWnd, SW_SHOW); + BringWindowToTop(m_hWnd); + UpdateWindow(m_hWnd); + } + + HWND Create(HWND hParent, HINSTANCE hInstance, const TCHAR *title) + { + return OpenWindow(hParent, hInstance, true, 640, 480, title); + } + + void Close() + { + DestroyWindow(m_hWnd); + UnregisterClass(m_szClassName, m_hInstance); + } + + + void SetSize(int width, int height) + { + RECT rc = {0, 0, width, height}; + AdjustWindowRect(&rc, WS_OVERLAPPEDWINDOW, false); + + int w = rc.right - rc.left; + int h = rc.bottom - rc.top; + + rc.left = (1280 - w)/2; + rc.right = rc.left + w; + rc.top = (1024 - h)/2; + rc.bottom = rc.top + h; + ::MoveWindow(m_hWnd, rc.left,rc.top,rc.right-rc.left,rc.bottom-rc.top, TRUE); + } +} \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Windows/EmuWindow.h b/Source/Plugins/Plugin_VideoOGL/Src/Windows/EmuWindow.h new file mode 100644 index 0000000000..dfccb4815e --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/Windows/EmuWindow.h @@ -0,0 +1,32 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#pragma once + +#include "stdafx.h" + +namespace EmuWindow +{ + extern int g_winstyle; + + HWND GetWnd(); + HWND GetParentWnd(); + HWND Create(HWND hParent, HINSTANCE hInstance, const TCHAR *title); + void Show(); + void Close(); + void SetSize(int displayWidth, int displayHeight); +} diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Windows/File.cpp b/Source/Plugins/Plugin_VideoOGL/Src/Windows/File.cpp new file mode 100644 index 0000000000..041cbe428f --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/Windows/File.cpp @@ -0,0 +1,165 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include +#include + +#include "File.h" + + +namespace W32Util +{ + + File::File() + { + fileHandle = INVALID_HANDLE_VALUE; + isOpen=false; + } + + File::~File() + { + + } + + + bool File::Open(const TCHAR *filename, eFileMode _mode) + { + mode = _mode; + //it's time to open the file + fileHandle = CreateFile(filename, + mode==FILE_READ ? GENERIC_READ : GENERIC_WRITE, //open mode + mode == FILE_READ ? FILE_SHARE_READ : NULL, //sharemode + NULL, //security + mode==FILE_READ ? OPEN_EXISTING : CREATE_ALWAYS, //create mode + FILE_ATTRIBUTE_NORMAL, //atrributes + NULL); //template + + if (fileHandle == INVALID_HANDLE_VALUE) + isOpen=false; + else + isOpen=true; + + return isOpen; + } + + + void File::Close() + { + if (isOpen) + { + //close the file and reset variables + CloseHandle(fileHandle); + fileHandle=INVALID_HANDLE_VALUE; + isOpen=false; + } + } + + int File::GetSize() + { + if (!isOpen) //of course + return 0; + else + return GetFileSize(fileHandle,0); + } + + int File::Write(void *data, int size) //let's do some writing + { + if (isOpen) + { + DWORD written; + WriteFile(fileHandle, data, size, &written,0); + return written; //we return the number of bytes that actually got written + } + else + { + return 0; + } + } + + int File::Read(void *data, int size) + { + if (isOpen) + { + DWORD wasRead; + ReadFile(fileHandle, data, size, &wasRead,0); + return wasRead; //we return the number of bytes that actually was read + } + else + { + return 0; + } + } + + int File::WR(void *data, int size) + { + if (mode==FILE_READ) + return Read(data,size); + else + return Write(data,size); + } + bool File::MagicCookie(int cookie) + { + if (mode==FILE_READ) + { + if (ReadInt()!=cookie) + { + char mojs[5],temp[256]; + mojs[4]=0; + *(int*)mojs=cookie; + sprintf(temp,"W32Util::File: Magic Cookie %s is bad!",mojs); + MessageBox(0,temp,"Error reading file",MB_ICONERROR); + return false; + } + else + return true; + } + else if (mode==FILE_WRITE) + { + WriteInt(cookie); + return true; + } + return false; + } + + int File::ReadInt() + { + int temp; + if (Read(&temp, sizeof(int))) + return temp; + else + return 0; + } + + void File::WriteInt(int i) + { + Write(&i,sizeof(int)); + } + + char File::ReadChar() + { + char temp; + if (Read(&temp, sizeof(char))) + return temp; + else + return 0; + } + + void File::WriteChar(char i) + { + Write(&i,sizeof(char)); + } +} \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Windows/File.h b/Source/Plugins/Plugin_VideoOGL/Src/Windows/File.h new file mode 100644 index 0000000000..ba46616208 --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/Windows/File.h @@ -0,0 +1,77 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef __LAMEFILE_H__ +#define __LAMEFILE_H__ + +#include "stdafx.h" + +namespace W32Util +{ + + enum eFileMode + { + FILE_READ=5, + FILE_WRITE=6, + FILE_ERROR=0xff + }; + + class File + { + HANDLE fileHandle; + eFileMode mode; + bool isOpen; + public: + File(); + virtual ~File(); + + bool Open(const TCHAR *filename, eFileMode mode); + void Adopt(HANDLE h) { fileHandle = h;} + void Close(); + + void WriteInt(int i); + void WriteChar(char i); + int Write(void *data, int size); + + + int ReadInt(); + char ReadChar(); + int Read(void *data, int size); + + int WR(void *data, int size); //write or read depending on open mode + bool MagicCookie(int cookie); + + int GetSize(); + eFileMode GetMode() {return mode;} + void SeekBeg(int pos) + { + if (isOpen) SetFilePointer(fileHandle,pos,0,FILE_BEGIN); + } + void SeekEnd(int pos) + { + if (isOpen) SetFilePointer(fileHandle,pos,0,FILE_END); + } + void SeekCurrent(int pos) + { + if (isOpen) SetFilePointer(fileHandle,pos,0,FILE_CURRENT); + } + }; + +} + + +#endif //__LAMEFILE_H__ \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Windows/GL/fgl.h b/Source/Plugins/Plugin_VideoOGL/Src/Windows/GL/fgl.h new file mode 100644 index 0000000000..64f981e6ec --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/Windows/GL/fgl.h @@ -0,0 +1,1707 @@ + +C GLUT version of "GL/fgl.h" + +C Modifications from SGI IRIX 5.3 version: +C 1) F prefix removed from OpenGL constants. +C 2) Constants over 32 characters truncated to 32 characters. + +C *********************************************************** + +C AttribMask + integer*4 GL_CURRENT_BIT + parameter ( GL_CURRENT_BIT = 1 ) + integer*4 GL_POINT_BIT + parameter ( GL_POINT_BIT = 2 ) + integer*4 GL_LINE_BIT + parameter ( GL_LINE_BIT = 4 ) + integer*4 GL_POLYGON_BIT + parameter ( GL_POLYGON_BIT = 8 ) + integer*4 GL_POLYGON_STIPPLE_BIT + parameter ( GL_POLYGON_STIPPLE_BIT = 16 ) + integer*4 GL_PIXEL_MODE_BIT + parameter ( GL_PIXEL_MODE_BIT = 32 ) + integer*4 GL_LIGHTING_BIT + parameter ( GL_LIGHTING_BIT = 64 ) + integer*4 GL_FOG_BIT + parameter ( GL_FOG_BIT = 128 ) + integer*4 GL_DEPTH_BUFFER_BIT + parameter ( GL_DEPTH_BUFFER_BIT = 256 ) + integer*4 GL_ACCUM_BUFFER_BIT + parameter ( GL_ACCUM_BUFFER_BIT = 512 ) + integer*4 GL_STENCIL_BUFFER_BIT + parameter ( GL_STENCIL_BUFFER_BIT = 1024 ) + integer*4 GL_VIEWPORT_BIT + parameter ( GL_VIEWPORT_BIT = 2048 ) + integer*4 GL_TRANSFORM_BIT + parameter ( GL_TRANSFORM_BIT = 4096 ) + integer*4 GL_ENABLE_BIT + parameter ( GL_ENABLE_BIT = 8192 ) + integer*4 GL_COLOR_BUFFER_BIT + parameter ( GL_COLOR_BUFFER_BIT = 16384 ) + integer*4 GL_HINT_BIT + parameter ( GL_HINT_BIT = 32768 ) + integer*4 GL_EVAL_BIT + parameter ( GL_EVAL_BIT = 65536 ) + integer*4 GL_LIST_BIT + parameter ( GL_LIST_BIT = 131072 ) + integer*4 GL_TEXTURE_BIT + parameter ( GL_TEXTURE_BIT = 262144 ) + integer*4 GL_SCISSOR_BIT + parameter ( GL_SCISSOR_BIT = 524288 ) + integer*4 GL_ALL_ATTRIB_BITS + parameter ( GL_ALL_ATTRIB_BITS = 1048575 ) +C GL_MULTISAMPLE_BIT_EXT + +C ClearBufferMask +C GL_COLOR_BUFFER_BIT +C GL_ACCUM_BUFFER_BIT +C GL_STENCIL_BUFFER_BIT +C GL_DEPTH_BUFFER_BIT + +C Boolean + integer*4 GL_FALSE + parameter ( GL_FALSE = 0 ) + integer*4 GL_TRUE + parameter ( GL_TRUE = 1 ) + +C BeginMode + integer*4 GL_POINTS + parameter ( GL_POINTS = 0 ) + integer*4 GL_LINES + parameter ( GL_LINES = 1 ) + integer*4 GL_LINE_LOOP + parameter ( GL_LINE_LOOP = 2 ) + integer*4 GL_LINE_STRIP + parameter ( GL_LINE_STRIP = 3 ) + integer*4 GL_TRIANGLES + parameter ( GL_TRIANGLES = 4 ) + integer*4 GL_TRIANGLE_STRIP + parameter ( GL_TRIANGLE_STRIP = 5 ) + integer*4 GL_TRIANGLE_FAN + parameter ( GL_TRIANGLE_FAN = 6 ) + integer*4 GL_QUADS + parameter ( GL_QUADS = 7 ) + integer*4 GL_QUAD_STRIP + parameter ( GL_QUAD_STRIP = 8 ) + integer*4 GL_POLYGON + parameter ( GL_POLYGON = 9 ) + +C AccumOp + integer*4 GL_ACCUM + parameter ( GL_ACCUM = 256 ) + integer*4 GL_LOAD + parameter ( GL_LOAD = 257 ) + integer*4 GL_RETURN + parameter ( GL_RETURN = 258 ) + integer*4 GL_MULT + parameter ( GL_MULT = 259 ) + integer*4 GL_ADD + parameter ( GL_ADD = 260 ) + +C AlphaFunction + integer*4 GL_NEVER + parameter ( GL_NEVER = 512 ) + integer*4 GL_LESS + parameter ( GL_LESS = 513 ) + integer*4 GL_EQUAL + parameter ( GL_EQUAL = 514 ) + integer*4 GL_LEQUAL + parameter ( GL_LEQUAL = 515 ) + integer*4 GL_GREATER + parameter ( GL_GREATER = 516 ) + integer*4 GL_NOTEQUAL + parameter ( GL_NOTEQUAL = 517 ) + integer*4 GL_GEQUAL + parameter ( GL_GEQUAL = 518 ) + integer*4 GL_ALWAYS + parameter ( GL_ALWAYS = 519 ) + +C BlendingFactorDest + integer*4 GL_ZERO + parameter ( GL_ZERO = 0 ) + integer*4 GL_ONE + parameter ( GL_ONE = 1 ) + integer*4 GL_SRC_COLOR + parameter ( GL_SRC_COLOR = 768 ) + integer*4 GL_ONE_MINUS_SRC_COLOR + parameter ( GL_ONE_MINUS_SRC_COLOR = 769 ) + integer*4 GL_SRC_ALPHA + parameter ( GL_SRC_ALPHA = 770 ) + integer*4 GL_ONE_MINUS_SRC_ALPHA + parameter ( GL_ONE_MINUS_SRC_ALPHA = 771 ) + integer*4 GL_DST_ALPHA + parameter ( GL_DST_ALPHA = 772 ) + integer*4 GL_ONE_MINUS_DST_ALPHA + parameter ( GL_ONE_MINUS_DST_ALPHA = 773 ) +C GL_CONSTANT_COLOR_EXT +C GL_ONE_MINUS_CONSTANT_COLOR_EXT +C GL_CONSTANT_ALPHA_EXT +C GL_ONE_MINUS_CONSTANT_ALPHA_EXT + +C BlendingFactorSrc +C GL_ZERO +C GL_ONE + integer*4 GL_DST_COLOR + parameter ( GL_DST_COLOR = 774 ) + integer*4 GL_ONE_MINUS_DST_COLOR + parameter ( GL_ONE_MINUS_DST_COLOR = 775 ) + integer*4 GL_SRC_ALPHA_SATURATE + parameter ( GL_SRC_ALPHA_SATURATE = 776 ) +C GL_SRC_ALPHA +C GL_ONE_MINUS_SRC_ALPHA +C GL_DST_ALPHA +C GL_ONE_MINUS_DST_ALPHA +C GL_CONSTANT_COLOR_EXT +C GL_ONE_MINUS_CONSTANT_COLOR_EXT +C GL_CONSTANT_ALPHA_EXT +C GL_ONE_MINUS_CONSTANT_ALPHA_EXT + +C BlendingMode +C GL_LOGIC_OP +C GL_FUNC_ADD_EXT +C GL_MIN_EXT +C GL_MAX_EXT +C GL_FUNC_SUBTRACT_EXT +C GL_FUNC_REVERSE_SUBTRACT_EXT + +C ColorMaterialFace +C GL_FRONT +C GL_BACK +C GL_FRONT_AND_BACK + +C ColorMaterialParameter +C GL_AMBIENT +C GL_DIFFUSE +C GL_SPECULAR +C GL_EMISSION +C GL_AMBIENT_AND_DIFFUSE + +C ConvolutionBorderMode +C GL_REDUCE_EXT + +C ConvolutionParameter +C GL_CONVOLUTION_BORDER_MODE_EXT +C GL_CONVOLUTION_FILTER_SCALE_EXT +C GL_CONVOLUTION_FILTER_BIAS_EXT + +C ConvolutionTarget +C GL_CONVOLUTION_1D_EXT +C GL_CONVOLUTION_2D_EXT + +C CullFaceMode +C GL_FRONT +C GL_BACK +C GL_FRONT_AND_BACK + +C DepthFunction +C GL_NEVER +C GL_LESS +C GL_EQUAL +C GL_LEQUAL +C GL_GREATER +C GL_NOTEQUAL +C GL_GEQUAL +C GL_ALWAYS + +C DrawBufferMode + integer*4 GL_NONE + parameter ( GL_NONE = 0 ) + integer*4 GL_FRONT_LEFT + parameter ( GL_FRONT_LEFT = 1024 ) + integer*4 GL_FRONT_RIGHT + parameter ( GL_FRONT_RIGHT = 1025 ) + integer*4 GL_BACK_LEFT + parameter ( GL_BACK_LEFT = 1026 ) + integer*4 GL_BACK_RIGHT + parameter ( GL_BACK_RIGHT = 1027 ) + integer*4 GL_FRONT + parameter ( GL_FRONT = 1028 ) + integer*4 GL_BACK + parameter ( GL_BACK = 1029 ) + integer*4 GL_LEFT + parameter ( GL_LEFT = 1030 ) + integer*4 GL_RIGHT + parameter ( GL_RIGHT = 1031 ) + integer*4 GL_FRONT_AND_BACK + parameter ( GL_FRONT_AND_BACK = 1032 ) + integer*4 GL_AUX0 + parameter ( GL_AUX0 = 1033 ) + integer*4 GL_AUX1 + parameter ( GL_AUX1 = 1034 ) + integer*4 GL_AUX2 + parameter ( GL_AUX2 = 1035 ) + integer*4 GL_AUX3 + parameter ( GL_AUX3 = 1036 ) + +C Enable +C GL_FOG +C GL_LIGHTING +C GL_TEXTURE_1D +C GL_TEXTURE_2D +C GL_LINE_STIPPLE +C GL_POLYGON_STIPPLE +C GL_CULL_FACE +C GL_ALPHA_TEST +C GL_BLEND +C GL_LOGIC_OP +C GL_DITHER +C GL_STENCIL_TEST +C GL_DEPTH_TEST +C GL_CLIP_PLANE0 +C GL_CLIP_PLANE1 +C GL_CLIP_PLANE2 +C GL_CLIP_PLANE3 +C GL_CLIP_PLANE4 +C GL_CLIP_PLANE5 +C GL_LIGHT0 +C GL_LIGHT1 +C GL_LIGHT2 +C GL_LIGHT3 +C GL_LIGHT4 +C GL_LIGHT5 +C GL_LIGHT6 +C GL_LIGHT7 +C GL_TEXTURE_GEN_S +C GL_TEXTURE_GEN_T +C GL_TEXTURE_GEN_R +C GL_TEXTURE_GEN_Q +C GL_MAP1_VERTEX_3 +C GL_MAP1_VERTEX_4 +C GL_MAP1_COLOR_4 +C GL_MAP1_INDEX +C GL_MAP1_NORMAL +C GL_MAP1_TEXTURE_COORD_1 +C GL_MAP1_TEXTURE_COORD_2 +C GL_MAP1_TEXTURE_COORD_3 +C GL_MAP1_TEXTURE_COORD_4 +C GL_MAP2_VERTEX_3 +C GL_MAP2_VERTEX_4 +C GL_MAP2_COLOR_4 +C GL_MAP2_INDEX +C GL_MAP2_NORMAL +C GL_MAP2_TEXTURE_COORD_1 +C GL_MAP2_TEXTURE_COORD_2 +C GL_MAP2_TEXTURE_COORD_3 +C GL_MAP2_TEXTURE_COORD_4 +C GL_POINT_SMOOTH +C GL_LINE_SMOOTH +C GL_POLYGON_SMOOTH +C GL_SCISSOR_TEST +C GL_COLOR_MATERIAL +C GL_NORMALIZE +C GL_AUTO_NORMAL +C GL_CONVOLUTION_1D_EXT +C GL_CONVOLUTION_2D_EXT +C GL_SEPARABLE_2D_EXT +C GL_HISTOGRAM_EXT +C GL_MINMAX_EXT +C GL_POLYGON_OFFSET_EXT +C GL_TEXTURE_3D_EXT +C GL_MULTISAMPLE_SGIS +C GL_SAMPLE_ALPHA_TO_MASK_SGIS +C GL_SAMPLE_ALPHA_TO_ONE_SGIS +C GL_SAMPLE_MASK_SGIS + +C ErrorCode + integer*4 GL_NO_ERROR + parameter ( GL_NO_ERROR = 0 ) + integer*4 GL_INVALID_ENUM + parameter ( GL_INVALID_ENUM = 1280 ) + integer*4 GL_INVALID_VALUE + parameter ( GL_INVALID_VALUE = 1281 ) + integer*4 GL_INVALID_OPERATION + parameter ( GL_INVALID_OPERATION = 1282 ) + integer*4 GL_STACK_OVERFLOW + parameter ( GL_STACK_OVERFLOW = 1283 ) + integer*4 GL_STACK_UNDERFLOW + parameter ( GL_STACK_UNDERFLOW = 1284 ) + integer*4 GL_OUT_OF_MEMORY + parameter ( GL_OUT_OF_MEMORY = 1285 ) +C GL_TABLE_TOO_LARGE_EXT +C GL_TEXTURE_TOO_LARGE_EXT + +C FeedBackMode + integer*4 GL_2D + parameter ( GL_2D = 1536 ) + integer*4 GL_3D + parameter ( GL_3D = 1537 ) + integer*4 GL_3D_COLOR + parameter ( GL_3D_COLOR = 1538 ) + integer*4 GL_3D_COLOR_TEXTURE + parameter ( GL_3D_COLOR_TEXTURE = 1539 ) + integer*4 GL_4D_COLOR_TEXTURE + parameter ( GL_4D_COLOR_TEXTURE = 1540 ) + +C FeedBackToken + integer*4 GL_PASS_THROUGH_TOKEN + parameter ( GL_PASS_THROUGH_TOKEN = 1792 ) + integer*4 GL_POINT_TOKEN + parameter ( GL_POINT_TOKEN = 1793 ) + integer*4 GL_LINE_TOKEN + parameter ( GL_LINE_TOKEN = 1794 ) + integer*4 GL_POLYGON_TOKEN + parameter ( GL_POLYGON_TOKEN = 1795 ) + integer*4 GL_BITMAP_TOKEN + parameter ( GL_BITMAP_TOKEN = 1796 ) + integer*4 GL_DRAW_PIXEL_TOKEN + parameter ( GL_DRAW_PIXEL_TOKEN = 1797 ) + integer*4 GL_COPY_PIXEL_TOKEN + parameter ( GL_COPY_PIXEL_TOKEN = 1798 ) + integer*4 GL_LINE_RESET_TOKEN + parameter ( GL_LINE_RESET_TOKEN = 1799 ) + +C FogMode +C GL_LINEAR + integer*4 GL_EXP + parameter ( GL_EXP = 2048 ) + integer*4 GL_EXP2 + parameter ( GL_EXP2 = 2049 ) + +C FogParameter +C GL_FOG_COLOR +C GL_FOG_DENSITY +C GL_FOG_END +C GL_FOG_INDEX +C GL_FOG_MODE +C GL_FOG_START + +C FrontFaceDirection + integer*4 GL_CW + parameter ( GL_CW = 2304 ) + integer*4 GL_CCW + parameter ( GL_CCW = 2305 ) + +C GetConvolutionParameter +C GL_CONVOLUTION_BORDER_MODE_EXT +C GL_CONVOLUTION_FILTER_SCALE_EXT +C GL_CONVOLUTION_FILTER_BIAS_EXT +C GL_CONVOLUTION_FORMAT_EXT +C GL_CONVOLUTION_WIDTH_EXT +C GL_CONVOLUTION_HEIGHT_EXT +C GL_MAX_CONVOLUTION_WIDTH_EXT +C GL_MAX_CONVOLUTION_HEIGHT_EXT + +C GetHistogramParameter +C GL_HISTOGRAM_WIDTH_EXT +C GL_HISTOGRAM_FORMAT_EXT +C GL_HISTOGRAM_RED_SIZE_EXT +C GL_HISTOGRAM_GREEN_SIZE_EXT +C GL_HISTOGRAM_BLUE_SIZE_EXT +C GL_HISTOGRAM_ALPHA_SIZE_EXT +C GL_HISTOGRAM_LUMINANCE_SIZE_EXT +C GL_HISTOGRAM_SINK_EXT + +C GetMapTarget + integer*4 GL_COEFF + parameter ( GL_COEFF = 2560 ) + integer*4 GL_ORDER + parameter ( GL_ORDER = 2561 ) + integer*4 GL_DOMAIN + parameter ( GL_DOMAIN = 2562 ) + +C GetMinmaxParameter +C GL_MINMAX_FORMAT_EXT +C GL_MINMAX_SINK_EXT + +C GetPixelMap + integer*4 GL_PIXEL_MAP_I_TO_I + parameter ( GL_PIXEL_MAP_I_TO_I = 3184 ) + integer*4 GL_PIXEL_MAP_S_TO_S + parameter ( GL_PIXEL_MAP_S_TO_S = 3185 ) + integer*4 GL_PIXEL_MAP_I_TO_R + parameter ( GL_PIXEL_MAP_I_TO_R = 3186 ) + integer*4 GL_PIXEL_MAP_I_TO_G + parameter ( GL_PIXEL_MAP_I_TO_G = 3187 ) + integer*4 GL_PIXEL_MAP_I_TO_B + parameter ( GL_PIXEL_MAP_I_TO_B = 3188 ) + integer*4 GL_PIXEL_MAP_I_TO_A + parameter ( GL_PIXEL_MAP_I_TO_A = 3189 ) + integer*4 GL_PIXEL_MAP_R_TO_R + parameter ( GL_PIXEL_MAP_R_TO_R = 3190 ) + integer*4 GL_PIXEL_MAP_G_TO_G + parameter ( GL_PIXEL_MAP_G_TO_G = 3191 ) + integer*4 GL_PIXEL_MAP_B_TO_B + parameter ( GL_PIXEL_MAP_B_TO_B = 3192 ) + integer*4 GL_PIXEL_MAP_A_TO_A + parameter ( GL_PIXEL_MAP_A_TO_A = 3193 ) + +C GetTarget + integer*4 GL_CURRENT_COLOR + parameter ( GL_CURRENT_COLOR = 2816 ) + integer*4 GL_CURRENT_INDEX + parameter ( GL_CURRENT_INDEX = 2817 ) + integer*4 GL_CURRENT_NORMAL + parameter ( GL_CURRENT_NORMAL = 2818 ) + integer*4 GL_CURRENT_TEXTURE_COORDS + parameter ( GL_CURRENT_TEXTURE_COORDS = 2819 ) + integer*4 GL_CURRENT_RASTER_COLOR + parameter ( GL_CURRENT_RASTER_COLOR = 2820 ) + integer*4 GL_CURRENT_RASTER_INDEX + parameter ( GL_CURRENT_RASTER_INDEX = 2821 ) + integer*4 GL_CURRENT_RASTER_TEXTURE_COORDS + parameter ( GL_CURRENT_RASTER_TEXTURE_COORDS = 2822 ) + integer*4 GL_CURRENT_RASTER_POSITION + parameter ( GL_CURRENT_RASTER_POSITION = 2823 ) + integer*4 GL_CURRENT_RASTER_POSITION_VALID + parameter ( GL_CURRENT_RASTER_POSITION_VALID = 2824 ) + integer*4 GL_CURRENT_RASTER_DISTANCE + parameter ( GL_CURRENT_RASTER_DISTANCE = 2825 ) + integer*4 GL_POINT_SMOOTH + parameter ( GL_POINT_SMOOTH = 2832 ) + integer*4 GL_POINT_SIZE + parameter ( GL_POINT_SIZE = 2833 ) + integer*4 GL_POINT_SIZE_RANGE + parameter ( GL_POINT_SIZE_RANGE = 2834 ) + integer*4 GL_POINT_SIZE_GRANULARITY + parameter ( GL_POINT_SIZE_GRANULARITY = 2835 ) + integer*4 GL_LINE_SMOOTH + parameter ( GL_LINE_SMOOTH = 2848 ) + integer*4 GL_LINE_WIDTH + parameter ( GL_LINE_WIDTH = 2849 ) + integer*4 GL_LINE_WIDTH_RANGE + parameter ( GL_LINE_WIDTH_RANGE = 2850 ) + integer*4 GL_LINE_WIDTH_GRANULARITY + parameter ( GL_LINE_WIDTH_GRANULARITY = 2851 ) + integer*4 GL_LINE_STIPPLE + parameter ( GL_LINE_STIPPLE = 2852 ) + integer*4 GL_LINE_STIPPLE_PATTERN + parameter ( GL_LINE_STIPPLE_PATTERN = 2853 ) + integer*4 GL_LINE_STIPPLE_REPEAT + parameter ( GL_LINE_STIPPLE_REPEAT = 2854 ) + integer*4 GL_LIST_MODE + parameter ( GL_LIST_MODE = 2864 ) + integer*4 GL_MAX_LIST_NESTING + parameter ( GL_MAX_LIST_NESTING = 2865 ) + integer*4 GL_LIST_BASE + parameter ( GL_LIST_BASE = 2866 ) + integer*4 GL_LIST_INDEX + parameter ( GL_LIST_INDEX = 2867 ) + integer*4 GL_POLYGON_MODE + parameter ( GL_POLYGON_MODE = 2880 ) + integer*4 GL_POLYGON_SMOOTH + parameter ( GL_POLYGON_SMOOTH = 2881 ) + integer*4 GL_POLYGON_STIPPLE + parameter ( GL_POLYGON_STIPPLE = 2882 ) + integer*4 GL_EDGE_FLAG + parameter ( GL_EDGE_FLAG = 2883 ) + integer*4 GL_CULL_FACE + parameter ( GL_CULL_FACE = 2884 ) + integer*4 GL_CULL_FACE_MODE + parameter ( GL_CULL_FACE_MODE = 2885 ) + integer*4 GL_FRONT_FACE + parameter ( GL_FRONT_FACE = 2886 ) + integer*4 GL_LIGHTING + parameter ( GL_LIGHTING = 2896 ) + integer*4 GL_LIGHT_MODEL_LOCAL_VIEWER + parameter ( GL_LIGHT_MODEL_LOCAL_VIEWER = 2897 ) + integer*4 GL_LIGHT_MODEL_TWO_SIDE + parameter ( GL_LIGHT_MODEL_TWO_SIDE = 2898 ) + integer*4 GL_LIGHT_MODEL_AMBIENT + parameter ( GL_LIGHT_MODEL_AMBIENT = 2899 ) + integer*4 GL_SHADE_MODEL + parameter ( GL_SHADE_MODEL = 2900 ) + integer*4 GL_COLOR_MATERIAL_FACE + parameter ( GL_COLOR_MATERIAL_FACE = 2901 ) + integer*4 GL_COLOR_MATERIAL_PARAMETER + parameter ( GL_COLOR_MATERIAL_PARAMETER = 2902 ) + integer*4 GL_COLOR_MATERIAL + parameter ( GL_COLOR_MATERIAL = 2903 ) + integer*4 GL_FOG + parameter ( GL_FOG = 2912 ) + integer*4 GL_FOG_INDEX + parameter ( GL_FOG_INDEX = 2913 ) + integer*4 GL_FOG_DENSITY + parameter ( GL_FOG_DENSITY = 2914 ) + integer*4 GL_FOG_START + parameter ( GL_FOG_START = 2915 ) + integer*4 GL_FOG_END + parameter ( GL_FOG_END = 2916 ) + integer*4 GL_FOG_MODE + parameter ( GL_FOG_MODE = 2917 ) + integer*4 GL_FOG_COLOR + parameter ( GL_FOG_COLOR = 2918 ) + integer*4 GL_DEPTH_RANGE + parameter ( GL_DEPTH_RANGE = 2928 ) + integer*4 GL_DEPTH_TEST + parameter ( GL_DEPTH_TEST = 2929 ) + integer*4 GL_DEPTH_WRITEMASK + parameter ( GL_DEPTH_WRITEMASK = 2930 ) + integer*4 GL_DEPTH_CLEAR_VALUE + parameter ( GL_DEPTH_CLEAR_VALUE = 2931 ) + integer*4 GL_DEPTH_FUNC + parameter ( GL_DEPTH_FUNC = 2932 ) + integer*4 GL_ACCUM_CLEAR_VALUE + parameter ( GL_ACCUM_CLEAR_VALUE = 2944 ) + integer*4 GL_STENCIL_TEST + parameter ( GL_STENCIL_TEST = 2960 ) + integer*4 GL_STENCIL_CLEAR_VALUE + parameter ( GL_STENCIL_CLEAR_VALUE = 2961 ) + integer*4 GL_STENCIL_FUNC + parameter ( GL_STENCIL_FUNC = 2962 ) + integer*4 GL_STENCIL_VALUE_MASK + parameter ( GL_STENCIL_VALUE_MASK = 2963 ) + integer*4 GL_STENCIL_FAIL + parameter ( GL_STENCIL_FAIL = 2964 ) + integer*4 GL_STENCIL_PASS_DEPTH_FAIL + parameter ( GL_STENCIL_PASS_DEPTH_FAIL = 2965 ) + integer*4 GL_STENCIL_PASS_DEPTH_PASS + parameter ( GL_STENCIL_PASS_DEPTH_PASS = 2966 ) + integer*4 GL_STENCIL_REF + parameter ( GL_STENCIL_REF = 2967 ) + integer*4 GL_STENCIL_WRITEMASK + parameter ( GL_STENCIL_WRITEMASK = 2968 ) + integer*4 GL_MATRIX_MODE + parameter ( GL_MATRIX_MODE = 2976 ) + integer*4 GL_NORMALIZE + parameter ( GL_NORMALIZE = 2977 ) + integer*4 GL_VIEWPORT + parameter ( GL_VIEWPORT = 2978 ) + integer*4 GL_MODELVIEW_STACK_DEPTH + parameter ( GL_MODELVIEW_STACK_DEPTH = 2979 ) + integer*4 GL_PROJECTION_STACK_DEPTH + parameter ( GL_PROJECTION_STACK_DEPTH = 2980 ) + integer*4 GL_TEXTURE_STACK_DEPTH + parameter ( GL_TEXTURE_STACK_DEPTH = 2981 ) + integer*4 GL_MODELVIEW_MATRIX + parameter ( GL_MODELVIEW_MATRIX = 2982 ) + integer*4 GL_PROJECTION_MATRIX + parameter ( GL_PROJECTION_MATRIX = 2983 ) + integer*4 GL_TEXTURE_MATRIX + parameter ( GL_TEXTURE_MATRIX = 2984 ) + integer*4 GL_ATTRIB_STACK_DEPTH + parameter ( GL_ATTRIB_STACK_DEPTH = 2992 ) + integer*4 GL_ALPHA_TEST + parameter ( GL_ALPHA_TEST = 3008 ) + integer*4 GL_ALPHA_TEST_FUNC + parameter ( GL_ALPHA_TEST_FUNC = 3009 ) + integer*4 GL_ALPHA_TEST_REF + parameter ( GL_ALPHA_TEST_REF = 3010 ) + integer*4 GL_DITHER + parameter ( GL_DITHER = 3024 ) + integer*4 GL_BLEND_DST + parameter ( GL_BLEND_DST = 3040 ) + integer*4 GL_BLEND_SRC + parameter ( GL_BLEND_SRC = 3041 ) + integer*4 GL_BLEND + parameter ( GL_BLEND = 3042 ) + integer*4 GL_LOGIC_OP_MODE + parameter ( GL_LOGIC_OP_MODE = 3056 ) + integer*4 GL_LOGIC_OP + parameter ( GL_LOGIC_OP = 3057 ) + integer*4 GL_AUX_BUFFERS + parameter ( GL_AUX_BUFFERS = 3072 ) + integer*4 GL_DRAW_BUFFER + parameter ( GL_DRAW_BUFFER = 3073 ) + integer*4 GL_READ_BUFFER + parameter ( GL_READ_BUFFER = 3074 ) + integer*4 GL_SCISSOR_BOX + parameter ( GL_SCISSOR_BOX = 3088 ) + integer*4 GL_SCISSOR_TEST + parameter ( GL_SCISSOR_TEST = 3089 ) + integer*4 GL_INDEX_CLEAR_VALUE + parameter ( GL_INDEX_CLEAR_VALUE = 3104 ) + integer*4 GL_INDEX_WRITEMASK + parameter ( GL_INDEX_WRITEMASK = 3105 ) + integer*4 GL_COLOR_CLEAR_VALUE + parameter ( GL_COLOR_CLEAR_VALUE = 3106 ) + integer*4 GL_COLOR_WRITEMASK + parameter ( GL_COLOR_WRITEMASK = 3107 ) + integer*4 GL_INDEX_MODE + parameter ( GL_INDEX_MODE = 3120 ) + integer*4 GL_RGBA_MODE + parameter ( GL_RGBA_MODE = 3121 ) + integer*4 GL_DOUBLEBUFFER + parameter ( GL_DOUBLEBUFFER = 3122 ) + integer*4 GL_STEREO + parameter ( GL_STEREO = 3123 ) + integer*4 GL_RENDER_MODE + parameter ( GL_RENDER_MODE = 3136 ) + integer*4 GL_PERSPECTIVE_CORRECTION_HINT + parameter ( GL_PERSPECTIVE_CORRECTION_HINT = 3152 ) + integer*4 GL_POINT_SMOOTH_HINT + parameter ( GL_POINT_SMOOTH_HINT = 3153 ) + integer*4 GL_LINE_SMOOTH_HINT + parameter ( GL_LINE_SMOOTH_HINT = 3154 ) + integer*4 GL_POLYGON_SMOOTH_HINT + parameter ( GL_POLYGON_SMOOTH_HINT = 3155 ) + integer*4 GL_FOG_HINT + parameter ( GL_FOG_HINT = 3156 ) + integer*4 GL_TEXTURE_GEN_S + parameter ( GL_TEXTURE_GEN_S = 3168 ) + integer*4 GL_TEXTURE_GEN_T + parameter ( GL_TEXTURE_GEN_T = 3169 ) + integer*4 GL_TEXTURE_GEN_R + parameter ( GL_TEXTURE_GEN_R = 3170 ) + integer*4 GL_TEXTURE_GEN_Q + parameter ( GL_TEXTURE_GEN_Q = 3171 ) + integer*4 GL_PIXEL_MAP_I_TO_I_SIZE + parameter ( GL_PIXEL_MAP_I_TO_I_SIZE = 3248 ) + integer*4 GL_PIXEL_MAP_S_TO_S_SIZE + parameter ( GL_PIXEL_MAP_S_TO_S_SIZE = 3249 ) + integer*4 GL_PIXEL_MAP_I_TO_R_SIZE + parameter ( GL_PIXEL_MAP_I_TO_R_SIZE = 3250 ) + integer*4 GL_PIXEL_MAP_I_TO_G_SIZE + parameter ( GL_PIXEL_MAP_I_TO_G_SIZE = 3251 ) + integer*4 GL_PIXEL_MAP_I_TO_B_SIZE + parameter ( GL_PIXEL_MAP_I_TO_B_SIZE = 3252 ) + integer*4 GL_PIXEL_MAP_I_TO_A_SIZE + parameter ( GL_PIXEL_MAP_I_TO_A_SIZE = 3253 ) + integer*4 GL_PIXEL_MAP_R_TO_R_SIZE + parameter ( GL_PIXEL_MAP_R_TO_R_SIZE = 3254 ) + integer*4 GL_PIXEL_MAP_G_TO_G_SIZE + parameter ( GL_PIXEL_MAP_G_TO_G_SIZE = 3255 ) + integer*4 GL_PIXEL_MAP_B_TO_B_SIZE + parameter ( GL_PIXEL_MAP_B_TO_B_SIZE = 3256 ) + integer*4 GL_PIXEL_MAP_A_TO_A_SIZE + parameter ( GL_PIXEL_MAP_A_TO_A_SIZE = 3257 ) + integer*4 GL_UNPACK_SWAP_BYTES + parameter ( GL_UNPACK_SWAP_BYTES = 3312 ) + integer*4 GL_UNPACK_LSB_FIRST + parameter ( GL_UNPACK_LSB_FIRST = 3313 ) + integer*4 GL_UNPACK_ROW_LENGTH + parameter ( GL_UNPACK_ROW_LENGTH = 3314 ) + integer*4 GL_UNPACK_SKIP_ROWS + parameter ( GL_UNPACK_SKIP_ROWS = 3315 ) + integer*4 GL_UNPACK_SKIP_PIXELS + parameter ( GL_UNPACK_SKIP_PIXELS = 3316 ) + integer*4 GL_UNPACK_ALIGNMENT + parameter ( GL_UNPACK_ALIGNMENT = 3317 ) + integer*4 GL_PACK_SWAP_BYTES + parameter ( GL_PACK_SWAP_BYTES = 3328 ) + integer*4 GL_PACK_LSB_FIRST + parameter ( GL_PACK_LSB_FIRST = 3329 ) + integer*4 GL_PACK_ROW_LENGTH + parameter ( GL_PACK_ROW_LENGTH = 3330 ) + integer*4 GL_PACK_SKIP_ROWS + parameter ( GL_PACK_SKIP_ROWS = 3331 ) + integer*4 GL_PACK_SKIP_PIXELS + parameter ( GL_PACK_SKIP_PIXELS = 3332 ) + integer*4 GL_PACK_ALIGNMENT + parameter ( GL_PACK_ALIGNMENT = 3333 ) + integer*4 GL_MAP_COLOR + parameter ( GL_MAP_COLOR = 3344 ) + integer*4 GL_MAP_STENCIL + parameter ( GL_MAP_STENCIL = 3345 ) + integer*4 GL_INDEX_SHIFT + parameter ( GL_INDEX_SHIFT = 3346 ) + integer*4 GL_INDEX_OFFSET + parameter ( GL_INDEX_OFFSET = 3347 ) + integer*4 GL_RED_SCALE + parameter ( GL_RED_SCALE = 3348 ) + integer*4 GL_RED_BIAS + parameter ( GL_RED_BIAS = 3349 ) + integer*4 GL_ZOOM_X + parameter ( GL_ZOOM_X = 3350 ) + integer*4 GL_ZOOM_Y + parameter ( GL_ZOOM_Y = 3351 ) + integer*4 GL_GREEN_SCALE + parameter ( GL_GREEN_SCALE = 3352 ) + integer*4 GL_GREEN_BIAS + parameter ( GL_GREEN_BIAS = 3353 ) + integer*4 GL_BLUE_SCALE + parameter ( GL_BLUE_SCALE = 3354 ) + integer*4 GL_BLUE_BIAS + parameter ( GL_BLUE_BIAS = 3355 ) + integer*4 GL_ALPHA_SCALE + parameter ( GL_ALPHA_SCALE = 3356 ) + integer*4 GL_ALPHA_BIAS + parameter ( GL_ALPHA_BIAS = 3357 ) + integer*4 GL_DEPTH_SCALE + parameter ( GL_DEPTH_SCALE = 3358 ) + integer*4 GL_DEPTH_BIAS + parameter ( GL_DEPTH_BIAS = 3359 ) + integer*4 GL_MAX_EVAL_ORDER + parameter ( GL_MAX_EVAL_ORDER = 3376 ) + integer*4 GL_MAX_LIGHTS + parameter ( GL_MAX_LIGHTS = 3377 ) + integer*4 GL_MAX_CLIP_PLANES + parameter ( GL_MAX_CLIP_PLANES = 3378 ) + integer*4 GL_MAX_TEXTURE_SIZE + parameter ( GL_MAX_TEXTURE_SIZE = 3379 ) + integer*4 GL_MAX_PIXEL_MAP_TABLE + parameter ( GL_MAX_PIXEL_MAP_TABLE = 3380 ) + integer*4 GL_MAX_ATTRIB_STACK_DEPTH + parameter ( GL_MAX_ATTRIB_STACK_DEPTH = 3381 ) + integer*4 GL_MAX_MODELVIEW_STACK_DEPTH + parameter ( GL_MAX_MODELVIEW_STACK_DEPTH = 3382 ) + integer*4 GL_MAX_NAME_STACK_DEPTH + parameter ( GL_MAX_NAME_STACK_DEPTH = 3383 ) + integer*4 GL_MAX_PROJECTION_STACK_DEPTH + parameter ( GL_MAX_PROJECTION_STACK_DEPTH = 3384 ) + integer*4 GL_MAX_TEXTURE_STACK_DEPTH + parameter ( GL_MAX_TEXTURE_STACK_DEPTH = 3385 ) + integer*4 GL_MAX_VIEWPORT_DIMS + parameter ( GL_MAX_VIEWPORT_DIMS = 3386 ) + integer*4 GL_SUBPIXEL_BITS + parameter ( GL_SUBPIXEL_BITS = 3408 ) + integer*4 GL_INDEX_BITS + parameter ( GL_INDEX_BITS = 3409 ) + integer*4 GL_RED_BITS + parameter ( GL_RED_BITS = 3410 ) + integer*4 GL_GREEN_BITS + parameter ( GL_GREEN_BITS = 3411 ) + integer*4 GL_BLUE_BITS + parameter ( GL_BLUE_BITS = 3412 ) + integer*4 GL_ALPHA_BITS + parameter ( GL_ALPHA_BITS = 3413 ) + integer*4 GL_DEPTH_BITS + parameter ( GL_DEPTH_BITS = 3414 ) + integer*4 GL_STENCIL_BITS + parameter ( GL_STENCIL_BITS = 3415 ) + integer*4 GL_ACCUM_RED_BITS + parameter ( GL_ACCUM_RED_BITS = 3416 ) + integer*4 GL_ACCUM_GREEN_BITS + parameter ( GL_ACCUM_GREEN_BITS = 3417 ) + integer*4 GL_ACCUM_BLUE_BITS + parameter ( GL_ACCUM_BLUE_BITS = 3418 ) + integer*4 GL_ACCUM_ALPHA_BITS + parameter ( GL_ACCUM_ALPHA_BITS = 3419 ) + integer*4 GL_NAME_STACK_DEPTH + parameter ( GL_NAME_STACK_DEPTH = 3440 ) + integer*4 GL_AUTO_NORMAL + parameter ( GL_AUTO_NORMAL = 3456 ) + integer*4 GL_MAP1_COLOR_4 + parameter ( GL_MAP1_COLOR_4 = 3472 ) + integer*4 GL_MAP1_INDEX + parameter ( GL_MAP1_INDEX = 3473 ) + integer*4 GL_MAP1_NORMAL + parameter ( GL_MAP1_NORMAL = 3474 ) + integer*4 GL_MAP1_TEXTURE_COORD_1 + parameter ( GL_MAP1_TEXTURE_COORD_1 = 3475 ) + integer*4 GL_MAP1_TEXTURE_COORD_2 + parameter ( GL_MAP1_TEXTURE_COORD_2 = 3476 ) + integer*4 GL_MAP1_TEXTURE_COORD_3 + parameter ( GL_MAP1_TEXTURE_COORD_3 = 3477 ) + integer*4 GL_MAP1_TEXTURE_COORD_4 + parameter ( GL_MAP1_TEXTURE_COORD_4 = 3478 ) + integer*4 GL_MAP1_VERTEX_3 + parameter ( GL_MAP1_VERTEX_3 = 3479 ) + integer*4 GL_MAP1_VERTEX_4 + parameter ( GL_MAP1_VERTEX_4 = 3480 ) + integer*4 GL_MAP2_COLOR_4 + parameter ( GL_MAP2_COLOR_4 = 3504 ) + integer*4 GL_MAP2_INDEX + parameter ( GL_MAP2_INDEX = 3505 ) + integer*4 GL_MAP2_NORMAL + parameter ( GL_MAP2_NORMAL = 3506 ) + integer*4 GL_MAP2_TEXTURE_COORD_1 + parameter ( GL_MAP2_TEXTURE_COORD_1 = 3507 ) + integer*4 GL_MAP2_TEXTURE_COORD_2 + parameter ( GL_MAP2_TEXTURE_COORD_2 = 3508 ) + integer*4 GL_MAP2_TEXTURE_COORD_3 + parameter ( GL_MAP2_TEXTURE_COORD_3 = 3509 ) + integer*4 GL_MAP2_TEXTURE_COORD_4 + parameter ( GL_MAP2_TEXTURE_COORD_4 = 3510 ) + integer*4 GL_MAP2_VERTEX_3 + parameter ( GL_MAP2_VERTEX_3 = 3511 ) + integer*4 GL_MAP2_VERTEX_4 + parameter ( GL_MAP2_VERTEX_4 = 3512 ) + integer*4 GL_MAP1_GRID_DOMAIN + parameter ( GL_MAP1_GRID_DOMAIN = 3536 ) + integer*4 GL_MAP1_GRID_SEGMENTS + parameter ( GL_MAP1_GRID_SEGMENTS = 3537 ) + integer*4 GL_MAP2_GRID_DOMAIN + parameter ( GL_MAP2_GRID_DOMAIN = 3538 ) + integer*4 GL_MAP2_GRID_SEGMENTS + parameter ( GL_MAP2_GRID_SEGMENTS = 3539 ) + integer*4 GL_TEXTURE_1D + parameter ( GL_TEXTURE_1D = 3552 ) + integer*4 GL_TEXTURE_2D + parameter ( GL_TEXTURE_2D = 3553 ) +C GL_BLEND_COLOR_EXT +C GL_BLEND_EQUATION_EXT +C GL_CONVOLUTION_1D_EXT +C GL_CONVOLUTION_2D_EXT +C GL_SEPARABLE_2D_EXT +C GL_POST_CONVOLUTION_RED_SCALE_EXT +C GL_POST_CONVOLUTION_GREEN_SCALE_EXT +C GL_POST_CONVOLUTION_BLUE_SCALE_EXT +C GL_POST_CONVOLUTION_ALPHA_SCALE_EXT +C GL_POST_CONVOLUTION_RED_BIAS_EXT +C GL_POST_CONVOLUTION_GREEN_BIAS_EXT +C GL_POST_CONVOLUTION_BLUE_BIAS_EXT +C GL_POST_CONVOLUTION_ALPHA_BIAS_EXT +C GL_HISTOGRAM_EXT +C GL_MINMAX_EXT +C GL_POLYGON_OFFSET_EXT +C GL_POLYGON_OFFSET_FACTOR_EXT +C GL_POLYGON_OFFSET_BIAS_EXT +C GL_PACK_SKIP_IMAGES_EXT +C GL_PACK_IMAGE_HEIGHT_EXT +C GL_UNPACK_SKIP_IMAGES_EXT +C GL_UNPACK_IMAGE_HEIGHT_EXT +C GL_TEXTURE_3D_EXT +C GL_MAX_3D_TEXTURE_SIZE_EXT +C GL_DETAIL_TEXTURE_2D_BINDING_SGIS +C GL_MULTISAMPLE_SGIS +C GL_SAMPLE_ALPHA_TO_MASK_SGIS +C GL_SAMPLE_ALPHA_TO_ONE_SGIS +C GL_SAMPLE_MASK_SGIS +C GL_SAMPLE_BUFFERS_SGIS +C GL_SAMPLES_SGIS +C GL_SAMPLE_MASK_VALUE_SGIS +C GL_SAMPLE_MASK_INVERT_SGIS +C GL_SAMPLE_PATTERN_SGIS + +C GetTextureParameter +C GL_TEXTURE_MAG_FILTER +C GL_TEXTURE_MIN_FILTER +C GL_TEXTURE_WRAP_S +C GL_TEXTURE_WRAP_T + integer*4 GL_TEXTURE_WIDTH + parameter ( GL_TEXTURE_WIDTH = 4096 ) + integer*4 GL_TEXTURE_HEIGHT + parameter ( GL_TEXTURE_HEIGHT = 4097 ) + integer*4 GL_TEXTURE_COMPONENTS + parameter ( GL_TEXTURE_COMPONENTS = 4099 ) + integer*4 GL_TEXTURE_BORDER_COLOR + parameter ( GL_TEXTURE_BORDER_COLOR = 4100 ) + integer*4 GL_TEXTURE_BORDER + parameter ( GL_TEXTURE_BORDER = 4101 ) +C GL_TEXTURE_RED_SIZE_EXT +C GL_TEXTURE_GREEN_SIZE_EXT +C GL_TEXTURE_BLUE_SIZE_EXT +C GL_TEXTURE_ALPHA_SIZE_EXT +C GL_TEXTURE_LUMINANCE_SIZE_EXT +C GL_TEXTURE_INTENSITY_SIZE_EXT +C GL_TEXTURE_DEPTH_EXT +C GL_TEXTURE_WRAP_R_EXT +C GL_DETAIL_TEXTURE_LEVEL_SGIS +C GL_DETAIL_TEXTURE_MODE_SGIS +C GL_DETAIL_TEXTURE_FUNC_POINTS_SGIS +C GL_SHARPEN_TEXTURE_FUNC_POINTS_SGIS + +C HintMode + integer*4 GL_DONT_CARE + parameter ( GL_DONT_CARE = 4352 ) + integer*4 GL_FASTEST + parameter ( GL_FASTEST = 4353 ) + integer*4 GL_NICEST + parameter ( GL_NICEST = 4354 ) + +C HintTarget +C GL_PERSPECTIVE_CORRECTION_HINT +C GL_POINT_SMOOTH_HINT +C GL_LINE_SMOOTH_HINT +C GL_POLYGON_SMOOTH_HINT +C GL_FOG_HINT + +C HistogramTarget +C GL_HISTOGRAM_EXT +C GL_PROXY_HISTOGRAM_EXT + +C LightModelParameter +C GL_LIGHT_MODEL_AMBIENT +C GL_LIGHT_MODEL_LOCAL_VIEWER +C GL_LIGHT_MODEL_TWO_SIDE + +C LightParameter + integer*4 GL_AMBIENT + parameter ( GL_AMBIENT = 4608 ) + integer*4 GL_DIFFUSE + parameter ( GL_DIFFUSE = 4609 ) + integer*4 GL_SPECULAR + parameter ( GL_SPECULAR = 4610 ) + integer*4 GL_POSITION + parameter ( GL_POSITION = 4611 ) + integer*4 GL_SPOT_DIRECTION + parameter ( GL_SPOT_DIRECTION = 4612 ) + integer*4 GL_SPOT_EXPONENT + parameter ( GL_SPOT_EXPONENT = 4613 ) + integer*4 GL_SPOT_CUTOFF + parameter ( GL_SPOT_CUTOFF = 4614 ) + integer*4 GL_CONSTANT_ATTENUATION + parameter ( GL_CONSTANT_ATTENUATION = 4615 ) + integer*4 GL_LINEAR_ATTENUATION + parameter ( GL_LINEAR_ATTENUATION = 4616 ) + integer*4 GL_QUADRATIC_ATTENUATION + parameter ( GL_QUADRATIC_ATTENUATION = 4617 ) + +C ListMode + integer*4 GL_COMPILE + parameter ( GL_COMPILE = 4864 ) + integer*4 GL_COMPILE_AND_EXECUTE + parameter ( GL_COMPILE_AND_EXECUTE = 4865 ) + +C ListNameType + integer*4 GL_BYTE + parameter ( GL_BYTE = 5120 ) + integer*4 GL_UNSIGNED_BYTE + parameter ( GL_UNSIGNED_BYTE = 5121 ) + integer*4 GL_SHORT + parameter ( GL_SHORT = 5122 ) + integer*4 GL_UNSIGNED_SHORT + parameter ( GL_UNSIGNED_SHORT = 5123 ) + integer*4 GL_INT + parameter ( GL_INT = 5124 ) + integer*4 GL_UNSIGNED_INT + parameter ( GL_UNSIGNED_INT = 5125 ) + integer*4 GL_FLOAT + parameter ( GL_FLOAT = 5126 ) + integer*4 GL_2_BYTES + parameter ( GL_2_BYTES = 5127 ) + integer*4 GL_3_BYTES + parameter ( GL_3_BYTES = 5128 ) + integer*4 GL_4_BYTES + parameter ( GL_4_BYTES = 5129 ) + +C LogicOp + integer*4 GL_CLEAR + parameter ( GL_CLEAR = 5376 ) + integer*4 GL_AND + parameter ( GL_AND = 5377 ) + integer*4 GL_AND_REVERSE + parameter ( GL_AND_REVERSE = 5378 ) + integer*4 GL_COPY + parameter ( GL_COPY = 5379 ) + integer*4 GL_AND_INVERTED + parameter ( GL_AND_INVERTED = 5380 ) + integer*4 GL_NOOP + parameter ( GL_NOOP = 5381 ) + integer*4 GL_XOR + parameter ( GL_XOR = 5382 ) + integer*4 GL_OR + parameter ( GL_OR = 5383 ) + integer*4 GL_NOR + parameter ( GL_NOR = 5384 ) + integer*4 GL_EQUIV + parameter ( GL_EQUIV = 5385 ) + integer*4 GL_INVERT + parameter ( GL_INVERT = 5386 ) + integer*4 GL_OR_REVERSE + parameter ( GL_OR_REVERSE = 5387 ) + integer*4 GL_COPY_INVERTED + parameter ( GL_COPY_INVERTED = 5388 ) + integer*4 GL_OR_INVERTED + parameter ( GL_OR_INVERTED = 5389 ) + integer*4 GL_NAND + parameter ( GL_NAND = 5390 ) + integer*4 GL_SET + parameter ( GL_SET = 5391 ) + +C MapTarget +C GL_MAP1_COLOR_4 +C GL_MAP1_INDEX +C GL_MAP1_NORMAL +C GL_MAP1_TEXTURE_COORD_1 +C GL_MAP1_TEXTURE_COORD_2 +C GL_MAP1_TEXTURE_COORD_3 +C GL_MAP1_TEXTURE_COORD_4 +C GL_MAP1_VERTEX_3 +C GL_MAP1_VERTEX_4 +C GL_MAP2_COLOR_4 +C GL_MAP2_INDEX +C GL_MAP2_NORMAL +C GL_MAP2_TEXTURE_COORD_1 +C GL_MAP2_TEXTURE_COORD_2 +C GL_MAP2_TEXTURE_COORD_3 +C GL_MAP2_TEXTURE_COORD_4 +C GL_MAP2_VERTEX_3 +C GL_MAP2_VERTEX_4 + +C MaterialFace +C GL_FRONT +C GL_BACK +C GL_FRONT_AND_BACK + +C MaterialParameter + integer*4 GL_EMISSION + parameter ( GL_EMISSION = 5632 ) + integer*4 GL_SHININESS + parameter ( GL_SHININESS = 5633 ) + integer*4 GL_AMBIENT_AND_DIFFUSE + parameter ( GL_AMBIENT_AND_DIFFUSE = 5634 ) + integer*4 GL_COLOR_INDEXES + parameter ( GL_COLOR_INDEXES = 5635 ) +C GL_AMBIENT +C GL_DIFFUSE +C GL_SPECULAR + +C MatrixMode + integer*4 GL_MODELVIEW + parameter ( GL_MODELVIEW = 5888 ) + integer*4 GL_PROJECTION + parameter ( GL_PROJECTION = 5889 ) + integer*4 GL_TEXTURE + parameter ( GL_TEXTURE = 5890 ) + +C MeshMode1 +C GL_POINT +C GL_LINE + +C MeshMode2 +C GL_POINT +C GL_LINE +C GL_FILL + +C MinmaxTarget +C GL_MINMAX_EXT + +C PixelCopyType + integer*4 GL_COLOR + parameter ( GL_COLOR = 6144 ) + integer*4 GL_DEPTH + parameter ( GL_DEPTH = 6145 ) + integer*4 GL_STENCIL + parameter ( GL_STENCIL = 6146 ) + +C PixelFormat + integer*4 GL_COLOR_INDEX + parameter ( GL_COLOR_INDEX = 6400 ) + integer*4 GL_STENCIL_INDEX + parameter ( GL_STENCIL_INDEX = 6401 ) + integer*4 GL_DEPTH_COMPONENT + parameter ( GL_DEPTH_COMPONENT = 6402 ) + integer*4 GL_RED + parameter ( GL_RED = 6403 ) + integer*4 GL_GREEN + parameter ( GL_GREEN = 6404 ) + integer*4 GL_BLUE + parameter ( GL_BLUE = 6405 ) + integer*4 GL_ALPHA + parameter ( GL_ALPHA = 6406 ) + integer*4 GL_RGB + parameter ( GL_RGB = 6407 ) + integer*4 GL_RGBA + parameter ( GL_RGBA = 6408 ) + integer*4 GL_LUMINANCE + parameter ( GL_LUMINANCE = 6409 ) + integer*4 GL_LUMINANCE_ALPHA + parameter ( GL_LUMINANCE_ALPHA = 6410 ) +C GL_ABGR_EXT + +C PixelInternalFormat +C GL_ALPHA4_EXT +C GL_ALPHA8_EXT +C GL_ALPHA12_EXT +C GL_ALPHA16_EXT +C GL_LUMINANCE4_EXT +C GL_LUMINANCE8_EXT +C GL_LUMINANCE12_EXT +C GL_LUMINANCE16_EXT +C GL_LUMINANCE4_ALPHA4_EXT +C GL_LUMINANCE6_ALPHA2_EXT +C GL_LUMINANCE8_ALPHA8_EXT +C GL_LUMINANCE12_ALPHA4_EXT +C GL_LUMINANCE12_ALPHA12_EXT +C GL_LUMINANCE16_ALPHA16_EXT +C GL_INTENSITY_EXT +C GL_INTENSITY4_EXT +C GL_INTENSITY8_EXT +C GL_INTENSITY12_EXT +C GL_INTENSITY16_EXT +C GL_RGB2_EXT +C GL_RGB4_EXT +C GL_RGB5_EXT +C GL_RGB8_EXT +C GL_RGB10_EXT +C GL_RGB12_EXT +C GL_RGB16_EXT +C GL_RGBA2_EXT +C GL_RGBA4_EXT +C GL_RGB5_A1_EXT +C GL_RGBA8_EXT +C GL_RGB10_A2_EXT +C GL_RGBA12_EXT +C GL_RGBA16_EXT + +C PixelMap +C GL_PIXEL_MAP_I_TO_I +C GL_PIXEL_MAP_S_TO_S +C GL_PIXEL_MAP_I_TO_R +C GL_PIXEL_MAP_I_TO_G +C GL_PIXEL_MAP_I_TO_B +C GL_PIXEL_MAP_I_TO_A +C GL_PIXEL_MAP_R_TO_R +C GL_PIXEL_MAP_G_TO_G +C GL_PIXEL_MAP_B_TO_B +C GL_PIXEL_MAP_A_TO_A + +C PixelStore +C GL_UNPACK_SWAP_BYTES +C GL_UNPACK_LSB_FIRST +C GL_UNPACK_ROW_LENGTH +C GL_UNPACK_SKIP_ROWS +C GL_UNPACK_SKIP_PIXELS +C GL_UNPACK_ALIGNMENT +C GL_PACK_SWAP_BYTES +C GL_PACK_LSB_FIRST +C GL_PACK_ROW_LENGTH +C GL_PACK_SKIP_ROWS +C GL_PACK_SKIP_PIXELS +C GL_PACK_ALIGNMENT +C GL_PACK_SKIP_IMAGES_EXT +C GL_PACK_IMAGE_HEIGHT_EXT +C GL_UNPACK_SKIP_IMAGES_EXT +C GL_UNPACK_IMAGE_HEIGHT_EXT + +C PixelTransfer +C GL_MAP_COLOR +C GL_MAP_STENCIL +C GL_INDEX_SHIFT +C GL_INDEX_OFFSET +C GL_RED_SCALE +C GL_RED_BIAS +C GL_GREEN_SCALE +C GL_GREEN_BIAS +C GL_BLUE_SCALE +C GL_BLUE_BIAS +C GL_ALPHA_SCALE +C GL_ALPHA_BIAS +C GL_DEPTH_SCALE +C GL_DEPTH_BIAS +C GL_POST_CONVOLUTION_RED_SCALE_EXT +C GL_POST_CONVOLUTION_GREEN_SCALE_EXT +C GL_POST_CONVOLUTION_BLUE_SCALE_EXT +C GL_POST_CONVOLUTION_ALPHA_SCALE_EXT +C GL_POST_CONVOLUTION_RED_BIAS_EXT +C GL_POST_CONVOLUTION_GREEN_BIAS_EXT +C GL_POST_CONVOLUTION_BLUE_BIAS_EXT +C GL_POST_CONVOLUTION_ALPHA_BIAS_EXT + +C PixelType + integer*4 GL_BITMAP + parameter ( GL_BITMAP = 6656 ) +C GL_BYTE +C GL_UNSIGNED_BYTE +C GL_SHORT +C GL_UNSIGNED_SHORT +C GL_INT +C GL_UNSIGNED_INT +C GL_FLOAT + +C PolygonMode + integer*4 GL_POINT + parameter ( GL_POINT = 6912 ) + integer*4 GL_LINE + parameter ( GL_LINE = 6913 ) + integer*4 GL_FILL + parameter ( GL_FILL = 6914 ) + +C ReadBufferMode +C GL_FRONT_LEFT +C GL_FRONT_RIGHT +C GL_BACK_LEFT +C GL_BACK_RIGHT +C GL_FRONT +C GL_BACK +C GL_LEFT +C GL_RIGHT +C GL_AUX0 +C GL_AUX1 +C GL_AUX2 +C GL_AUX3 + +C RenderingMode + integer*4 GL_RENDER + parameter ( GL_RENDER = 7168 ) + integer*4 GL_FEEDBACK + parameter ( GL_FEEDBACK = 7169 ) + integer*4 GL_SELECT + parameter ( GL_SELECT = 7170 ) + +C SamplePattern +C GL_1PASS_SGIS +C GL_2PASS_0_SGIS +C GL_2PASS_1_SGIS +C GL_4PASS_0_SGIS +C GL_4PASS_1_SGIS +C GL_4PASS_2_SGIS +C GL_4PASS_3_SGIS + +C SeparableTarget +C GL_SEPARABLE_2D_EXT + +C ShadingModel + integer*4 GL_FLAT + parameter ( GL_FLAT = 7424 ) + integer*4 GL_SMOOTH + parameter ( GL_SMOOTH = 7425 ) + +C StencilFunction +C GL_NEVER +C GL_LESS +C GL_EQUAL +C GL_LEQUAL +C GL_GREATER +C GL_NOTEQUAL +C GL_GEQUAL +C GL_ALWAYS + +C StencilOp +C GL_ZERO + integer*4 GL_KEEP + parameter ( GL_KEEP = 7680 ) + integer*4 GL_REPLACE + parameter ( GL_REPLACE = 7681 ) + integer*4 GL_INCR + parameter ( GL_INCR = 7682 ) + integer*4 GL_DECR + parameter ( GL_DECR = 7683 ) +C GL_INVERT + +C StringName + integer*4 GL_VENDOR + parameter ( GL_VENDOR = 7936 ) + integer*4 GL_RENDERER + parameter ( GL_RENDERER = 7937 ) + integer*4 GL_VERSION + parameter ( GL_VERSION = 7938 ) + integer*4 GL_EXTENSIONS + parameter ( GL_EXTENSIONS = 7939 ) + +C TextureCoordName + integer*4 GL_S + parameter ( GL_S = 8192 ) + integer*4 GL_T + parameter ( GL_T = 8193 ) + integer*4 GL_R + parameter ( GL_R = 8194 ) + integer*4 GL_Q + parameter ( GL_Q = 8195 ) + +C TextureEnvMode + integer*4 GL_MODULATE + parameter ( GL_MODULATE = 8448 ) + integer*4 GL_DECAL + parameter ( GL_DECAL = 8449 ) +C GL_BLEND +C GL_REPLACE_EXT + +C TextureEnvParameter + integer*4 GL_TEXTURE_ENV_MODE + parameter ( GL_TEXTURE_ENV_MODE = 8704 ) + integer*4 GL_TEXTURE_ENV_COLOR + parameter ( GL_TEXTURE_ENV_COLOR = 8705 ) + +C TextureEnvTarget + integer*4 GL_TEXTURE_ENV + parameter ( GL_TEXTURE_ENV = 8960 ) + +C TextureGenMode + integer*4 GL_EYE_LINEAR + parameter ( GL_EYE_LINEAR = 9216 ) + integer*4 GL_OBJECT_LINEAR + parameter ( GL_OBJECT_LINEAR = 9217 ) + integer*4 GL_SPHERE_MAP + parameter ( GL_SPHERE_MAP = 9218 ) + +C TextureGenParameter + integer*4 GL_TEXTURE_GEN_MODE + parameter ( GL_TEXTURE_GEN_MODE = 9472 ) + integer*4 GL_OBJECT_PLANE + parameter ( GL_OBJECT_PLANE = 9473 ) + integer*4 GL_EYE_PLANE + parameter ( GL_EYE_PLANE = 9474 ) + +C TextureMagFilter + integer*4 GL_NEAREST + parameter ( GL_NEAREST = 9728 ) + integer*4 GL_LINEAR + parameter ( GL_LINEAR = 9729 ) +C GL_LINEAR_DETAIL_SGIS +C GL_LINEAR_DETAIL_ALPHA_SGIS +C GL_LINEAR_DETAIL_COLOR_SGIS +C GL_LINEAR_SHARPEN_SGIS +C GL_LINEAR_SHARPEN_ALPHA_SGIS +C GL_LINEAR_SHARPEN_COLOR_SGIS + +C TextureMinFilter +C GL_NEAREST +C GL_LINEAR + integer*4 GL_NEAREST_MIPMAP_NEAREST + parameter ( GL_NEAREST_MIPMAP_NEAREST = 9984 ) + integer*4 GL_LINEAR_MIPMAP_NEAREST + parameter ( GL_LINEAR_MIPMAP_NEAREST = 9985 ) + integer*4 GL_NEAREST_MIPMAP_LINEAR + parameter ( GL_NEAREST_MIPMAP_LINEAR = 9986 ) + integer*4 GL_LINEAR_MIPMAP_LINEAR + parameter ( GL_LINEAR_MIPMAP_LINEAR = 9987 ) + +C TextureParameterName + integer*4 GL_TEXTURE_MAG_FILTER + parameter ( GL_TEXTURE_MAG_FILTER = 10240 ) + integer*4 GL_TEXTURE_MIN_FILTER + parameter ( GL_TEXTURE_MIN_FILTER = 10241 ) + integer*4 GL_TEXTURE_WRAP_S + parameter ( GL_TEXTURE_WRAP_S = 10242 ) + integer*4 GL_TEXTURE_WRAP_T + parameter ( GL_TEXTURE_WRAP_T = 10243 ) +C GL_TEXTURE_BORDER_COLOR +C GL_TEXTURE_WRAP_R_EXT +C GL_DETAIL_TEXTURE_LEVEL_SGIS +C GL_DETAIL_TEXTURE_MODE_SGIS + +C TextureTarget +C GL_TEXTURE_1D +C GL_TEXTURE_2D +C GL_PROXY_TEXTURE_1D_EXT +C GL_PROXY_TEXTURE_2D_EXT +C GL_TEXTURE_3D_EXT +C GL_PROXY_TEXTURE_3D_EXT +C GL_DETAIL_TEXTURE_2D_SGIS + +C TextureWrapMode + integer*4 GL_CLAMP + parameter ( GL_CLAMP = 10496 ) + integer*4 GL_REPEAT + parameter ( GL_REPEAT = 10497 ) + +C ClipPlaneName + integer*4 GL_CLIP_PLANE0 + parameter ( GL_CLIP_PLANE0 = 12288 ) + integer*4 GL_CLIP_PLANE1 + parameter ( GL_CLIP_PLANE1 = 12289 ) + integer*4 GL_CLIP_PLANE2 + parameter ( GL_CLIP_PLANE2 = 12290 ) + integer*4 GL_CLIP_PLANE3 + parameter ( GL_CLIP_PLANE3 = 12291 ) + integer*4 GL_CLIP_PLANE4 + parameter ( GL_CLIP_PLANE4 = 12292 ) + integer*4 GL_CLIP_PLANE5 + parameter ( GL_CLIP_PLANE5 = 12293 ) + +C LightName + integer*4 GL_LIGHT0 + parameter ( GL_LIGHT0 = 16384 ) + integer*4 GL_LIGHT1 + parameter ( GL_LIGHT1 = 16385 ) + integer*4 GL_LIGHT2 + parameter ( GL_LIGHT2 = 16386 ) + integer*4 GL_LIGHT3 + parameter ( GL_LIGHT3 = 16387 ) + integer*4 GL_LIGHT4 + parameter ( GL_LIGHT4 = 16388 ) + integer*4 GL_LIGHT5 + parameter ( GL_LIGHT5 = 16389 ) + integer*4 GL_LIGHT6 + parameter ( GL_LIGHT6 = 16390 ) + integer*4 GL_LIGHT7 + parameter ( GL_LIGHT7 = 16391 ) + +C Extensions + integer*4 GL_EXT_abgr + parameter ( GL_EXT_abgr = 1 ) + integer*4 GL_EXT_blend_color + parameter ( GL_EXT_blend_color = 1 ) + integer*4 GL_EXT_blend_logic_op + parameter ( GL_EXT_blend_logic_op = 1 ) + integer*4 GL_EXT_blend_minmax + parameter ( GL_EXT_blend_minmax = 1 ) + integer*4 GL_EXT_blend_subtract + parameter ( GL_EXT_blend_subtract = 1 ) + integer*4 GL_EXT_convolution + parameter ( GL_EXT_convolution = 1 ) + integer*4 GL_EXT_histogram + parameter ( GL_EXT_histogram = 1 ) + integer*4 GL_EXT_polygon_offset + parameter ( GL_EXT_polygon_offset = 1 ) + integer*4 GL_EXT_subtexture + parameter ( GL_EXT_subtexture = 1 ) + integer*4 GL_EXT_texture + parameter ( GL_EXT_texture = 1 ) + integer*4 GL_EXT_texture3D + parameter ( GL_EXT_texture3D = 1 ) + integer*4 GL_SGIS_detail_texture + parameter ( GL_SGIS_detail_texture = 1 ) + integer*4 GL_SGIS_multisample + parameter ( GL_SGIS_multisample = 1 ) + integer*4 GL_SGIS_sharpen_texture + parameter ( GL_SGIS_sharpen_texture = 1 ) + +C EXT_abgr + integer*4 GL_ABGR_EXT + parameter ( GL_ABGR_EXT = 32768 ) + +C EXT_blend_color + integer*4 GL_CONSTANT_COLOR_EXT + parameter ( GL_CONSTANT_COLOR_EXT = 32769 ) + integer*4 GL_ONE_MINUS_CONSTANT_COLOR_EXT + parameter ( GL_ONE_MINUS_CONSTANT_COLOR_EXT = 32770 ) + integer*4 GL_CONSTANT_ALPHA_EXT + parameter ( GL_CONSTANT_ALPHA_EXT = 32771 ) + integer*4 GL_ONE_MINUS_CONSTANT_ALPHA_EXT + parameter ( GL_ONE_MINUS_CONSTANT_ALPHA_EXT = 32772 ) + integer*4 GL_BLEND_COLOR_EXT + parameter ( GL_BLEND_COLOR_EXT = 32773 ) + +C EXT_blend_minmax + integer*4 GL_FUNC_ADD_EXT + parameter ( GL_FUNC_ADD_EXT = 32774 ) + integer*4 GL_MIN_EXT + parameter ( GL_MIN_EXT = 32775 ) + integer*4 GL_MAX_EXT + parameter ( GL_MAX_EXT = 32776 ) + integer*4 GL_BLEND_EQUATION_EXT + parameter ( GL_BLEND_EQUATION_EXT = 32777 ) + +C EXT_blend_subtract + integer*4 GL_FUNC_SUBTRACT_EXT + parameter ( GL_FUNC_SUBTRACT_EXT = 32778 ) + integer*4 GL_FUNC_REVERSE_SUBTRACT_EXT + parameter ( GL_FUNC_REVERSE_SUBTRACT_EXT = 32779 ) + +C EXT_convolution + integer*4 GL_CONVOLUTION_1D_EXT + parameter ( GL_CONVOLUTION_1D_EXT = 32784 ) + integer*4 GL_CONVOLUTION_2D_EXT + parameter ( GL_CONVOLUTION_2D_EXT = 32785 ) + integer*4 GL_SEPARABLE_2D_EXT + parameter ( GL_SEPARABLE_2D_EXT = 32786 ) + integer*4 GL_CONVOLUTION_BORDER_MODE_EXT + parameter ( GL_CONVOLUTION_BORDER_MODE_EXT = 32787 ) + integer*4 GL_CONVOLUTION_FILTER_SCALE_EXT + parameter ( GL_CONVOLUTION_FILTER_SCALE_EXT = 32788 ) + integer*4 GL_CONVOLUTION_FILTER_BIAS_EXT + parameter ( GL_CONVOLUTION_FILTER_BIAS_EXT = 32789 ) + integer*4 GL_REDUCE_EXT + parameter ( GL_REDUCE_EXT = 32790 ) + integer*4 GL_CONVOLUTION_FORMAT_EXT + parameter ( GL_CONVOLUTION_FORMAT_EXT = 32791 ) + integer*4 GL_CONVOLUTION_WIDTH_EXT + parameter ( GL_CONVOLUTION_WIDTH_EXT = 32792 ) + integer*4 GL_CONVOLUTION_HEIGHT_EXT + parameter ( GL_CONVOLUTION_HEIGHT_EXT = 32793 ) + integer*4 GL_MAX_CONVOLUTION_WIDTH_EXT + parameter ( GL_MAX_CONVOLUTION_WIDTH_EXT = 32794 ) + integer*4 GL_MAX_CONVOLUTION_HEIGHT_EXT + parameter ( GL_MAX_CONVOLUTION_HEIGHT_EXT = 32795 ) + integer*4 GL_POST_CONVOLUTION_RED_SCALE_EX + parameter ( GL_POST_CONVOLUTION_RED_SCALE_EX = 32796 ) + integer*4 GL_POST_CONVOLUTION_GREEN_SCALE_ + parameter ( GL_POST_CONVOLUTION_GREEN_SCALE_ = 32797 ) + integer*4 GL_POST_CONVOLUTION_BLUE_SCALE_E + parameter ( GL_POST_CONVOLUTION_BLUE_SCALE_E = 32798 ) + integer*4 GL_POST_CONVOLUTION_ALPHA_SCALE_ + parameter ( GL_POST_CONVOLUTION_ALPHA_SCALE_ = 32799 ) + integer*4 GL_POST_CONVOLUTION_RED_BIAS_EXT + parameter ( GL_POST_CONVOLUTION_RED_BIAS_EXT = 32800 ) + integer*4 GL_POST_CONVOLUTION_GREEN_BIAS_E + parameter ( GL_POST_CONVOLUTION_GREEN_BIAS_E = 32801 ) + integer*4 GL_POST_CONVOLUTION_BLUE_BIAS_EX + parameter ( GL_POST_CONVOLUTION_BLUE_BIAS_EX = 32802 ) + integer*4 GL_POST_CONVOLUTION_ALPHA_BIAS_E + parameter ( GL_POST_CONVOLUTION_ALPHA_BIAS_E = 32803 ) + +C EXT_histogram + integer*4 GL_HISTOGRAM_EXT + parameter ( GL_HISTOGRAM_EXT = 32804 ) + integer*4 GL_PROXY_HISTOGRAM_EXT + parameter ( GL_PROXY_HISTOGRAM_EXT = 32805 ) + integer*4 GL_HISTOGRAM_WIDTH_EXT + parameter ( GL_HISTOGRAM_WIDTH_EXT = 32806 ) + integer*4 GL_HISTOGRAM_FORMAT_EXT + parameter ( GL_HISTOGRAM_FORMAT_EXT = 32807 ) + integer*4 GL_HISTOGRAM_RED_SIZE_EXT + parameter ( GL_HISTOGRAM_RED_SIZE_EXT = 32808 ) + integer*4 GL_HISTOGRAM_GREEN_SIZE_EXT + parameter ( GL_HISTOGRAM_GREEN_SIZE_EXT = 32809 ) + integer*4 GL_HISTOGRAM_BLUE_SIZE_EXT + parameter ( GL_HISTOGRAM_BLUE_SIZE_EXT = 32810 ) + integer*4 GL_HISTOGRAM_ALPHA_SIZE_EXT + parameter ( GL_HISTOGRAM_ALPHA_SIZE_EXT = 32811 ) + integer*4 GL_HISTOGRAM_LUMINANCE_SIZE_EXT + parameter ( GL_HISTOGRAM_LUMINANCE_SIZE_EXT = 32812 ) + integer*4 GL_HISTOGRAM_SINK_EXT + parameter ( GL_HISTOGRAM_SINK_EXT = 32813 ) + integer*4 GL_MINMAX_EXT + parameter ( GL_MINMAX_EXT = 32814 ) + integer*4 GL_MINMAX_FORMAT_EXT + parameter ( GL_MINMAX_FORMAT_EXT = 32815 ) + integer*4 GL_MINMAX_SINK_EXT + parameter ( GL_MINMAX_SINK_EXT = 32816 ) + integer*4 GL_TABLE_TOO_LARGE_EXT + parameter ( GL_TABLE_TOO_LARGE_EXT = 32817 ) + +C EXT_polygon_offset + integer*4 GL_POLYGON_OFFSET_EXT + parameter ( GL_POLYGON_OFFSET_EXT = 32823 ) + integer*4 GL_POLYGON_OFFSET_FACTOR_EXT + parameter ( GL_POLYGON_OFFSET_FACTOR_EXT = 32824 ) + integer*4 GL_POLYGON_OFFSET_BIAS_EXT + parameter ( GL_POLYGON_OFFSET_BIAS_EXT = 32825 ) + +C EXT_texture + integer*4 GL_ALPHA4_EXT + parameter ( GL_ALPHA4_EXT = 32827 ) + integer*4 GL_ALPHA8_EXT + parameter ( GL_ALPHA8_EXT = 32828 ) + integer*4 GL_ALPHA12_EXT + parameter ( GL_ALPHA12_EXT = 32829 ) + integer*4 GL_ALPHA16_EXT + parameter ( GL_ALPHA16_EXT = 32830 ) + integer*4 GL_LUMINANCE4_EXT + parameter ( GL_LUMINANCE4_EXT = 32831 ) + integer*4 GL_LUMINANCE8_EXT + parameter ( GL_LUMINANCE8_EXT = 32832 ) + integer*4 GL_LUMINANCE12_EXT + parameter ( GL_LUMINANCE12_EXT = 32833 ) + integer*4 GL_LUMINANCE16_EXT + parameter ( GL_LUMINANCE16_EXT = 32834 ) + integer*4 GL_LUMINANCE4_ALPHA4_EXT + parameter ( GL_LUMINANCE4_ALPHA4_EXT = 32835 ) + integer*4 GL_LUMINANCE6_ALPHA2_EXT + parameter ( GL_LUMINANCE6_ALPHA2_EXT = 32836 ) + integer*4 GL_LUMINANCE8_ALPHA8_EXT + parameter ( GL_LUMINANCE8_ALPHA8_EXT = 32837 ) + integer*4 GL_LUMINANCE12_ALPHA4_EXT + parameter ( GL_LUMINANCE12_ALPHA4_EXT = 32838 ) + integer*4 GL_LUMINANCE12_ALPHA12_EXT + parameter ( GL_LUMINANCE12_ALPHA12_EXT = 32839 ) + integer*4 GL_LUMINANCE16_ALPHA16_EXT + parameter ( GL_LUMINANCE16_ALPHA16_EXT = 32840 ) + integer*4 GL_INTENSITY_EXT + parameter ( GL_INTENSITY_EXT = 32841 ) + integer*4 GL_INTENSITY4_EXT + parameter ( GL_INTENSITY4_EXT = 32842 ) + integer*4 GL_INTENSITY8_EXT + parameter ( GL_INTENSITY8_EXT = 32843 ) + integer*4 GL_INTENSITY12_EXT + parameter ( GL_INTENSITY12_EXT = 32844 ) + integer*4 GL_INTENSITY16_EXT + parameter ( GL_INTENSITY16_EXT = 32845 ) + integer*4 GL_RGB2_EXT + parameter ( GL_RGB2_EXT = 32846 ) + integer*4 GL_RGB4_EXT + parameter ( GL_RGB4_EXT = 32847 ) + integer*4 GL_RGB5_EXT + parameter ( GL_RGB5_EXT = 32848 ) + integer*4 GL_RGB8_EXT + parameter ( GL_RGB8_EXT = 32849 ) + integer*4 GL_RGB10_EXT + parameter ( GL_RGB10_EXT = 32850 ) + integer*4 GL_RGB12_EXT + parameter ( GL_RGB12_EXT = 32851 ) + integer*4 GL_RGB16_EXT + parameter ( GL_RGB16_EXT = 32852 ) + integer*4 GL_RGBA2_EXT + parameter ( GL_RGBA2_EXT = 32853 ) + integer*4 GL_RGBA4_EXT + parameter ( GL_RGBA4_EXT = 32854 ) + integer*4 GL_RGB5_A1_EXT + parameter ( GL_RGB5_A1_EXT = 32855 ) + integer*4 GL_RGBA8_EXT + parameter ( GL_RGBA8_EXT = 32856 ) + integer*4 GL_RGB10_A2_EXT + parameter ( GL_RGB10_A2_EXT = 32857 ) + integer*4 GL_RGBA12_EXT + parameter ( GL_RGBA12_EXT = 32858 ) + integer*4 GL_RGBA16_EXT + parameter ( GL_RGBA16_EXT = 32859 ) + integer*4 GL_TEXTURE_RED_SIZE_EXT + parameter ( GL_TEXTURE_RED_SIZE_EXT = 32860 ) + integer*4 GL_TEXTURE_GREEN_SIZE_EXT + parameter ( GL_TEXTURE_GREEN_SIZE_EXT = 32861 ) + integer*4 GL_TEXTURE_BLUE_SIZE_EXT + parameter ( GL_TEXTURE_BLUE_SIZE_EXT = 32862 ) + integer*4 GL_TEXTURE_ALPHA_SIZE_EXT + parameter ( GL_TEXTURE_ALPHA_SIZE_EXT = 32863 ) + integer*4 GL_TEXTURE_LUMINANCE_SIZE_EXT + parameter ( GL_TEXTURE_LUMINANCE_SIZE_EXT = 32864 ) + integer*4 GL_TEXTURE_INTENSITY_SIZE_EXT + parameter ( GL_TEXTURE_INTENSITY_SIZE_EXT = 32865 ) + integer*4 GL_REPLACE_EXT + parameter ( GL_REPLACE_EXT = 32866 ) + integer*4 GL_PROXY_TEXTURE_1D_EXT + parameter ( GL_PROXY_TEXTURE_1D_EXT = 32867 ) + integer*4 GL_PROXY_TEXTURE_2D_EXT + parameter ( GL_PROXY_TEXTURE_2D_EXT = 32868 ) + integer*4 GL_TEXTURE_TOO_LARGE_EXT + parameter ( GL_TEXTURE_TOO_LARGE_EXT = 32869 ) + +C EXT_texture3D + integer*4 GL_PACK_SKIP_IMAGES_EXT + parameter ( GL_PACK_SKIP_IMAGES_EXT = 32875 ) + integer*4 GL_PACK_IMAGE_HEIGHT_EXT + parameter ( GL_PACK_IMAGE_HEIGHT_EXT = 32876 ) + integer*4 GL_UNPACK_SKIP_IMAGES_EXT + parameter ( GL_UNPACK_SKIP_IMAGES_EXT = 32877 ) + integer*4 GL_UNPACK_IMAGE_HEIGHT_EXT + parameter ( GL_UNPACK_IMAGE_HEIGHT_EXT = 32878 ) + integer*4 GL_TEXTURE_3D_EXT + parameter ( GL_TEXTURE_3D_EXT = 32879 ) + integer*4 GL_PROXY_TEXTURE_3D_EXT + parameter ( GL_PROXY_TEXTURE_3D_EXT = 32880 ) + integer*4 GL_TEXTURE_DEPTH_EXT + parameter ( GL_TEXTURE_DEPTH_EXT = 32881 ) + integer*4 GL_TEXTURE_WRAP_R_EXT + parameter ( GL_TEXTURE_WRAP_R_EXT = 32882 ) + integer*4 GL_MAX_3D_TEXTURE_SIZE_EXT + parameter ( GL_MAX_3D_TEXTURE_SIZE_EXT = 32883 ) + +C SGIS_detail_texture + integer*4 GL_DETAIL_TEXTURE_2D_SGIS + parameter ( GL_DETAIL_TEXTURE_2D_SGIS = 32917 ) + integer*4 GL_DETAIL_TEXTURE_2D_BINDING_SGI + parameter ( GL_DETAIL_TEXTURE_2D_BINDING_SGI = 32918 ) + integer*4 GL_LINEAR_DETAIL_SGIS + parameter ( GL_LINEAR_DETAIL_SGIS = 32919 ) + integer*4 GL_LINEAR_DETAIL_ALPHA_SGIS + parameter ( GL_LINEAR_DETAIL_ALPHA_SGIS = 32920 ) + integer*4 GL_LINEAR_DETAIL_COLOR_SGIS + parameter ( GL_LINEAR_DETAIL_COLOR_SGIS = 32921 ) + integer*4 GL_DETAIL_TEXTURE_LEVEL_SGIS + parameter ( GL_DETAIL_TEXTURE_LEVEL_SGIS = 32922 ) + integer*4 GL_DETAIL_TEXTURE_MODE_SGIS + parameter ( GL_DETAIL_TEXTURE_MODE_SGIS = 32923 ) + integer*4 GL_DETAIL_TEXTURE_FUNC_POINTS_S + parameter ( GL_DETAIL_TEXTURE_FUNC_POINTS_S = 32924 ) + +C SGIS_multisample + integer*4 GL_MULTISAMPLE_BIT_EXT + parameter ( GL_MULTISAMPLE_BIT_EXT = 536870912 ) + integer*4 GL_MULTISAMPLE_SGIS + parameter ( GL_MULTISAMPLE_SGIS = 32925 ) + integer*4 GL_SAMPLE_ALPHA_TO_MASK_SGIS + parameter ( GL_SAMPLE_ALPHA_TO_MASK_SGIS = 32926 ) + integer*4 GL_SAMPLE_ALPHA_TO_ONE_SGIS + parameter ( GL_SAMPLE_ALPHA_TO_ONE_SGIS = 32927 ) + integer*4 GL_SAMPLE_MASK_SGIS + parameter ( GL_SAMPLE_MASK_SGIS = 32928 ) + integer*4 GL_1PASS_SGIS + parameter ( GL_1PASS_SGIS = 32929 ) + integer*4 GL_2PASS_0_SGIS + parameter ( GL_2PASS_0_SGIS = 32930 ) + integer*4 GL_2PASS_1_SGIS + parameter ( GL_2PASS_1_SGIS = 32931 ) + integer*4 GL_4PASS_0_SGIS + parameter ( GL_4PASS_0_SGIS = 32932 ) + integer*4 GL_4PASS_1_SGIS + parameter ( GL_4PASS_1_SGIS = 32933 ) + integer*4 GL_4PASS_2_SGIS + parameter ( GL_4PASS_2_SGIS = 32934 ) + integer*4 GL_4PASS_3_SGIS + parameter ( GL_4PASS_3_SGIS = 32935 ) + integer*4 GL_SAMPLE_BUFFERS_SGIS + parameter ( GL_SAMPLE_BUFFERS_SGIS = 32936 ) + integer*4 GL_SAMPLES_SGIS + parameter ( GL_SAMPLES_SGIS = 32937 ) + integer*4 GL_SAMPLE_MASK_VALUE_SGIS + parameter ( GL_SAMPLE_MASK_VALUE_SGIS = 32938 ) + integer*4 GL_SAMPLE_MASK_INVERT_SGIS + parameter ( GL_SAMPLE_MASK_INVERT_SGIS = 32939 ) + integer*4 GL_SAMPLE_PATTERN_SGIS + parameter ( GL_SAMPLE_PATTERN_SGIS = 32940 ) + +C SGIS_sharpen_texture + integer*4 GL_LINEAR_SHARPEN_SGIS + parameter ( GL_LINEAR_SHARPEN_SGIS = 32941 ) + integer*4 GL_LINEAR_SHARPEN_ALPHA_SGIS + parameter ( GL_LINEAR_SHARPEN_ALPHA_SGIS = 32942 ) + integer*4 GL_LINEAR_SHARPEN_COLOR_SGIS + parameter ( GL_LINEAR_SHARPEN_COLOR_SGIS = 32943 ) + integer*4 GL_SHARPEN_TEXTURE_FUNC_POINTS_S + parameter ( GL_SHARPEN_TEXTURE_FUNC_POINTS_S = 32944 ) + +C *********************************************************** + + + character*128 fglGetString + integer fglGetError + integer*4 fglRenderMode + logical*1 fglAreTexturesResidentEXT + logical*1 fglIsEnabled + logical*1 fglIsList + logical*1 fglIsTextureEXT + logical*4 fglGenLists + logical*4 fglGenTexturesEXT diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Windows/GL/fglu.h b/Source/Plugins/Plugin_VideoOGL/Src/Windows/GL/fglu.h new file mode 100644 index 0000000000..0b0497675f --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/Windows/GL/fglu.h @@ -0,0 +1,210 @@ + +C GLUT version of "GL/fgl.h" + +C Modifications from SGI IRIX 5.3 version: +C 1) F prefix removed from GLU constants. +C 2) Fix GLU_TRUE and GLU_FALSE. + +C *** Generic constants *** + +C Errors: (return value 0 = no error) + integer*4 GLU_INVALID_ENUM + parameter ( GLU_INVALID_ENUM = 100900 ) + integer*4 GLU_INVALID_VALUE + parameter ( GLU_INVALID_VALUE = 100901 ) + integer*4 GLU_OUT_OF_MEMORY + parameter ( GLU_OUT_OF_MEMORY = 100902 ) + +C For laughs: + integer*4 GLU_TRUE + parameter ( GLU_TRUE = 1 ) + integer*4 GLU_FALSE + parameter ( GLU_FALSE = 0 ) + + +C *** Quadric constants *** + +C Types of normals: + integer*4 GLU_SMOOTH + parameter ( GLU_SMOOTH = 100000 ) + integer*4 GLU_FLAT + parameter ( GLU_FLAT = 100001 ) + integer*4 GLU_NONE + parameter ( GLU_NONE = 100002 ) + +C DrawStyle types: + integer*4 GLU_POINT + parameter ( GLU_POINT = 100010 ) + integer*4 GLU_LINE + parameter ( GLU_LINE = 100011 ) + integer*4 GLU_FILL + parameter ( GLU_FILL = 100012 ) + integer*4 GLU_SILHOUETTE + parameter ( GLU_SILHOUETTE = 100013 ) + +C Orientation types: + integer*4 GLU_OUTSIDE + parameter ( GLU_OUTSIDE = 100020 ) + integer*4 GLU_INSIDE + parameter ( GLU_INSIDE = 100021 ) + +C Callback types: +C GLU_ERROR 100103 + + +C *** Tesselation constants *** + +C Callback types: + integer*4 GLU_BEGIN + parameter ( GLU_BEGIN = 100100 ) + integer*4 GLU_VERTEX + parameter ( GLU_VERTEX = 100101 ) + integer*4 GLU_END + parameter ( GLU_END = 100102 ) + integer*4 GLU_ERROR + parameter ( GLU_ERROR = 100103 ) + integer*4 GLU_EDGE_FLAG + parameter ( GLU_EDGE_FLAG = 100104 ) + +C Contours types: + integer*4 GLU_CW + parameter ( GLU_CW = 100120 ) + integer*4 GLU_CCW + parameter ( GLU_CCW = 100121 ) + integer*4 GLU_INTERIOR + parameter ( GLU_INTERIOR = 100122 ) + integer*4 GLU_EXTERIOR + parameter ( GLU_EXTERIOR = 100123 ) + integer*4 GLU_UNKNOWN + parameter ( GLU_UNKNOWN = 100124 ) + + integer*4 GLU_TESS_ERROR1 + parameter ( GLU_TESS_ERROR1 = 100151 ) + integer*4 GLU_TESS_ERROR2 + parameter ( GLU_TESS_ERROR2 = 100152 ) + integer*4 GLU_TESS_ERROR3 + parameter ( GLU_TESS_ERROR3 = 100153 ) + integer*4 GLU_TESS_ERROR4 + parameter ( GLU_TESS_ERROR4 = 100154 ) + integer*4 GLU_TESS_ERROR5 + parameter ( GLU_TESS_ERROR5 = 100155 ) + integer*4 GLU_TESS_ERROR6 + parameter ( GLU_TESS_ERROR6 = 100156 ) + integer*4 GLU_TESS_ERROR7 + parameter ( GLU_TESS_ERROR7 = 100157 ) + integer*4 GLU_TESS_ERROR8 + parameter ( GLU_TESS_ERROR8 = 100158 ) + + +C *** NURBS constants *** + +C Properties: + integer*4 GLU_AUTO_LOAD_MATRIX + parameter ( GLU_AUTO_LOAD_MATRIX = 100200 ) + integer*4 GLU_CULLING + parameter ( GLU_CULLING = 100201 ) + integer*4 GLU_SAMPLING_TOLERANCE + parameter ( GLU_SAMPLING_TOLERANCE = 100203 ) + integer*4 GLU_DISPLAY_MODE + parameter ( GLU_DISPLAY_MODE = 100204 ) + +C Trimming curve types + integer*4 GLU_MAP1_TRIM_2 + parameter ( GLU_MAP1_TRIM_2 = 100210 ) + integer*4 GLU_MAP1_TRIM_3 + parameter ( GLU_MAP1_TRIM_3 = 100211 ) + +C Display modes: +C GLU_FILL 100012 + integer*4 GLU_OUTLINE_POLYGON + parameter ( GLU_OUTLINE_POLYGON = 100240 ) + integer*4 GLU_OUTLINE_PATCH + parameter ( GLU_OUTLINE_PATCH = 100241 ) + +C Callbacks: +C GLU_ERROR 100103 + +C Errors: + integer*4 GLU_NURBS_ERROR1 + parameter ( GLU_NURBS_ERROR1 = 100251 ) + integer*4 GLU_NURBS_ERROR2 + parameter ( GLU_NURBS_ERROR2 = 100252 ) + integer*4 GLU_NURBS_ERROR3 + parameter ( GLU_NURBS_ERROR3 = 100253 ) + integer*4 GLU_NURBS_ERROR4 + parameter ( GLU_NURBS_ERROR4 = 100254 ) + integer*4 GLU_NURBS_ERROR5 + parameter ( GLU_NURBS_ERROR5 = 100255 ) + integer*4 GLU_NURBS_ERROR6 + parameter ( GLU_NURBS_ERROR6 = 100256 ) + integer*4 GLU_NURBS_ERROR7 + parameter ( GLU_NURBS_ERROR7 = 100257 ) + integer*4 GLU_NURBS_ERROR8 + parameter ( GLU_NURBS_ERROR8 = 100258 ) + integer*4 GLU_NURBS_ERROR9 + parameter ( GLU_NURBS_ERROR9 = 100259 ) + integer*4 GLU_NURBS_ERROR10 + parameter ( GLU_NURBS_ERROR10 = 100260 ) + integer*4 GLU_NURBS_ERROR11 + parameter ( GLU_NURBS_ERROR11 = 100261 ) + integer*4 GLU_NURBS_ERROR12 + parameter ( GLU_NURBS_ERROR12 = 100262 ) + integer*4 GLU_NURBS_ERROR13 + parameter ( GLU_NURBS_ERROR13 = 100263 ) + integer*4 GLU_NURBS_ERROR14 + parameter ( GLU_NURBS_ERROR14 = 100264 ) + integer*4 GLU_NURBS_ERROR15 + parameter ( GLU_NURBS_ERROR15 = 100265 ) + integer*4 GLU_NURBS_ERROR16 + parameter ( GLU_NURBS_ERROR16 = 100266 ) + integer*4 GLU_NURBS_ERROR17 + parameter ( GLU_NURBS_ERROR17 = 100267 ) + integer*4 GLU_NURBS_ERROR18 + parameter ( GLU_NURBS_ERROR18 = 100268 ) + integer*4 GLU_NURBS_ERROR19 + parameter ( GLU_NURBS_ERROR19 = 100269 ) + integer*4 GLU_NURBS_ERROR20 + parameter ( GLU_NURBS_ERROR20 = 100270 ) + integer*4 GLU_NURBS_ERROR21 + parameter ( GLU_NURBS_ERROR21 = 100271 ) + integer*4 GLU_NURBS_ERROR22 + parameter ( GLU_NURBS_ERROR22 = 100272 ) + integer*4 GLU_NURBS_ERROR23 + parameter ( GLU_NURBS_ERROR23 = 100273 ) + integer*4 GLU_NURBS_ERROR24 + parameter ( GLU_NURBS_ERROR24 = 100274 ) + integer*4 GLU_NURBS_ERROR25 + parameter ( GLU_NURBS_ERROR25 = 100275 ) + integer*4 GLU_NURBS_ERROR26 + parameter ( GLU_NURBS_ERROR26 = 100276 ) + integer*4 GLU_NURBS_ERROR27 + parameter ( GLU_NURBS_ERROR27 = 100277 ) + integer*4 GLU_NURBS_ERROR28 + parameter ( GLU_NURBS_ERROR28 = 100278 ) + integer*4 GLU_NURBS_ERROR29 + parameter ( GLU_NURBS_ERROR29 = 100279 ) + integer*4 GLU_NURBS_ERROR30 + parameter ( GLU_NURBS_ERROR30 = 100280 ) + integer*4 GLU_NURBS_ERROR31 + parameter ( GLU_NURBS_ERROR31 = 100281 ) + integer*4 GLU_NURBS_ERROR32 + parameter ( GLU_NURBS_ERROR32 = 100282 ) + integer*4 GLU_NURBS_ERROR33 + parameter ( GLU_NURBS_ERROR33 = 100283 ) + integer*4 GLU_NURBS_ERROR34 + parameter ( GLU_NURBS_ERROR34 = 100284 ) + integer*4 GLU_NURBS_ERROR35 + parameter ( GLU_NURBS_ERROR35 = 100285 ) + integer*4 GLU_NURBS_ERROR36 + parameter ( GLU_NURBS_ERROR36 = 100286 ) + integer*4 GLU_NURBS_ERROR37 + parameter ( GLU_NURBS_ERROR37 = 100287 ) + + + character*128 fgluErrorString + character*128 fgluGetString + integer*4 fgluBuild1DMipmaps + integer*4 fgluBuild2DMipmaps + integer*4 fgluProject + integer*4 fgluScaleImage + integer*4 fgluUnProject diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Windows/GL/fglut.h b/Source/Plugins/Plugin_VideoOGL/Src/Windows/GL/fglut.h new file mode 100644 index 0000000000..e0ad8536d9 --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/Windows/GL/fglut.h @@ -0,0 +1,321 @@ + +C Copyright (c) Mark J. Kilgard, 1994. + +C This program is freely distributable without licensing fees +C and is provided without guarantee or warrantee expressed or +C implied. This program is -not- in the public domain. + +C GLUT Fortran header file + +C display mode bit masks + integer*4 GLUT_RGB + parameter ( GLUT_RGB = 0 ) + integer*4 GLUT_RGBA + parameter ( GLUT_RGBA = 0 ) + integer*4 GLUT_INDEX + parameter ( GLUT_INDEX = 1 ) + integer*4 GLUT_SINGLE + parameter ( GLUT_SINGLE = 0 ) + integer*4 GLUT_DOUBLE + parameter ( GLUT_DOUBLE = 2 ) + integer*4 GLUT_ACCUM + parameter ( GLUT_ACCUM = 4 ) + integer*4 GLUT_ALPHA + parameter ( GLUT_ALPHA = 8 ) + integer*4 GLUT_DEPTH + parameter ( GLUT_DEPTH = 16 ) + integer*4 GLUT_STENCIL + parameter ( GLUT_STENCIL = 32 ) + integer*4 GLUT_MULTISAMPLE + parameter ( GLUT_MULTISAMPLE = 128 ) + integer*4 GLUT_STEREO + parameter ( GLUT_STEREO = 256 ) + +C mouse buttons + integer*4 GLUT_LEFT_BUTTON + parameter ( GLUT_LEFT_BUTTON = 0 ) + integer*4 GLUT_MIDDLE_BUTTON + parameter ( GLUT_MIDDLE_BUTTON = 1 ) + integer*4 GLUT_RIGHT_BUTTON + parameter ( GLUT_RIGHT_BUTTON = 2 ) + +C mouse button callback state + integer*4 GLUT_DOWN + parameter ( GLUT_DOWN = 0 ) + integer*4 GLUT_UP + parameter ( GLUT_UP = 1 ) + +C special key callback values + integer*4 GLUT_KEY_F1 + parameter ( GLUT_KEY_F1 = 1 ) + integer*4 GLUT_KEY_F2 + parameter ( GLUT_KEY_F2 = 2 ) + integer*4 GLUT_KEY_F3 + parameter ( GLUT_KEY_F3 = 3 ) + integer*4 GLUT_KEY_F4 + parameter ( GLUT_KEY_F4 = 4 ) + integer*4 GLUT_KEY_F5 + parameter ( GLUT_KEY_F5 = 5 ) + integer*4 GLUT_KEY_F6 + parameter ( GLUT_KEY_F6 = 6 ) + integer*4 GLUT_KEY_F7 + parameter ( GLUT_KEY_F7 = 7 ) + integer*4 GLUT_KEY_F8 + parameter ( GLUT_KEY_F8 = 8 ) + integer*4 GLUT_KEY_F9 + parameter ( GLUT_KEY_F9 = 9 ) + integer*4 GLUT_KEY_F10 + parameter ( GLUT_KEY_F10 = 10 ) + integer*4 GLUT_KEY_F11 + parameter ( GLUT_KEY_F11 = 11 ) + integer*4 GLUT_KEY_F12 + parameter ( GLUT_KEY_F12 = 12 ) + integer*4 GLUT_KEY_LEFT + parameter ( GLUT_KEY_LEFT = 100 ) + integer*4 GLUT_KEY_UP + parameter ( GLUT_KEY_UP = 101 ) + integer*4 GLUT_KEY_RIGHT + parameter ( GLUT_KEY_RIGHT = 102 ) + integer*4 GLUT_KEY_DOWN + parameter ( GLUT_KEY_DOWN = 103 ) + integer*4 GLUT_KEY_PAGE_UP + parameter ( GLUT_KEY_PAGE_UP = 104 ) + integer*4 GLUT_KEY_PAGE_DOWN + parameter ( GLUT_KEY_PAGE_DOWN = 105 ) + integer*4 GLUT_KEY_HOME + parameter ( GLUT_KEY_HOME = 106 ) + integer*4 GLUT_KEY_END + parameter ( GLUT_KEY_END = 107 ) + integer*4 GLUT_KEY_INSERT + parameter ( GLUT_KEY_INSERT = 108 ) + +C entry/exit callback state + integer*4 GLUT_LEFT + parameter ( GLUT_LEFT = 0 ) + integer*4 GLUT_ENTERED + parameter ( GLUT_ENTERED = 1 ) + +C menu usage callback state + integer*4 GLUT_MENU_NOT_IN_USE + parameter ( GLUT_MENU_NOT_IN_USE = 0 ) + integer*4 GLUT_MENU_IN_USE + parameter ( GLUT_MENU_IN_USE = 1 ) + +C visibility callback state + integer*4 GLUT_NOT_VISIBLE + parameter ( GLUT_NOT_VISIBLE = 0 ) + integer*4 GLUT_VISIBLE + parameter ( GLUT_VISIBLE = 1 ) + +C color index component selection values + integer*4 GLUT_RED + parameter ( GLUT_RED = 0 ) + integer*4 GLUT_GREEN + parameter ( GLUT_GREEN = 1 ) + integer*4 GLUT_BLUE + parameter ( GLUT_BLUE = 2 ) + +C XXX Unfortunately, SGI's Fortran compiler links with +C EXTERNAL data even if it is not used. This defeats +C the purpose of GLUT naming fonts via opaque symbols. +C This means GLUT Fortran programmers should explicitly +C declared EXTERNAL GLUT fonts in subroutines where +C the fonts are used. + +C stroke font opaque names +C external GLUT_STROKE_ROMAN +C external GLUT_STROKE_MONO_ROMAN + +C bitmap font opaque names +C external GLUT_BITMAP_9_BY_15 +C external GLUT_BITMAP_8_BY_13 +C external GLUT_BITMAP_TIMES_ROMAN_10 +C external GLUT_BITMAP_TIMES_ROMAN_24 +C external GLUT_BITMAP_HELVETICA_10 +C external GLUT_BITMAP_HELVETICA_12 +C external GLUT_BITMAP_HELVETICA_18 + +C glutGet parameters + integer*4 GLUT_WINDOW_X + parameter ( GLUT_WINDOW_X = 100 ) + integer*4 GLUT_WINDOW_Y + parameter ( GLUT_WINDOW_Y = 101 ) + integer*4 GLUT_WINDOW_WIDTH + parameter ( GLUT_WINDOW_WIDTH = 102 ) + integer*4 GLUT_WINDOW_HEIGHT + parameter ( GLUT_WINDOW_HEIGHT = 103 ) + integer*4 GLUT_WINDOW_BUFFER_SIZE + parameter ( GLUT_WINDOW_BUFFER_SIZE = 104 ) + integer*4 GLUT_WINDOW_STENCIL_SIZE + parameter ( GLUT_WINDOW_STENCIL_SIZE = 105 ) + integer*4 GLUT_WINDOW_DEPTH_SIZE + parameter ( GLUT_WINDOW_DEPTH_SIZE = 106 ) + integer*4 GLUT_WINDOW_RED_SIZE + parameter ( GLUT_WINDOW_RED_SIZE = 107 ) + integer*4 GLUT_WINDOW_GREEN_SIZE + parameter ( GLUT_WINDOW_GREEN_SIZE = 108 ) + integer*4 GLUT_WINDOW_BLUE_SIZE + parameter ( GLUT_WINDOW_BLUE_SIZE = 109 ) + integer*4 GLUT_WINDOW_ALPHA_SIZE + parameter ( GLUT_WINDOW_ALPHA_SIZE = 110 ) + integer*4 GLUT_WINDOW_ACCUM_RED_SIZE + parameter ( GLUT_WINDOW_ACCUM_RED_SIZE = 111 ) + integer*4 GLUT_WINDOW_ACCUM_GREEN_SIZE + parameter ( GLUT_WINDOW_ACCUM_GREEN_SIZE = 112 ) + integer*4 GLUT_WINDOW_ACCUM_BLUE_SIZE + parameter ( GLUT_WINDOW_ACCUM_BLUE_SIZE = 113 ) + integer*4 GLUT_WINDOW_ACCUM_ALPHA_SIZE + parameter ( GLUT_WINDOW_ACCUM_ALPHA_SIZE = 114 ) + integer*4 GLUT_WINDOW_DOUBLEBUFFER + parameter ( GLUT_WINDOW_DOUBLEBUFFER = 115 ) + integer*4 GLUT_WINDOW_RGBA + parameter ( GLUT_WINDOW_RGBA = 116 ) + integer*4 GLUT_WINDOW_PARENT + parameter ( GLUT_WINDOW_PARENT = 117 ) + integer*4 GLUT_WINDOW_NUM_CHILDREN + parameter ( GLUT_WINDOW_NUM_CHILDREN = 118 ) + integer*4 GLUT_WINDOW_COLORMAP_SIZE + parameter ( GLUT_WINDOW_COLORMAP_SIZE = 119 ) + integer*4 GLUT_WINDOW_NUM_SAMPLES + parameter ( GLUT_WINDOW_NUM_SAMPLES = 120 ) + integer*4 GLUT_WINDOW_STEREO + parameter ( GLUT_WINDOW_STEREO = 121 ) + integer*4 GLUT_WINDOW_CURSOR + parameter ( GLUT_WINDOW_CURSOR = 122 ) + integer*4 GLUT_SCREEN_WIDTH + parameter ( GLUT_SCREEN_WIDTH = 200 ) + integer*4 GLUT_SCREEN_HEIGHT + parameter ( GLUT_SCREEN_HEIGHT = 201 ) + integer*4 GLUT_SCREEN_WIDTH_MM + parameter ( GLUT_SCREEN_WIDTH_MM = 202 ) + integer*4 GLUT_SCREEN_HEIGHT_MM + parameter ( GLUT_SCREEN_HEIGHT_MM = 203 ) + integer*4 GLUT_MENU_NUM_ITEMS + parameter ( GLUT_MENU_NUM_ITEMS = 300 ) + integer*4 GLUT_DISPLAY_MODE_POSSIBLE + parameter ( GLUT_DISPLAY_MODE_POSSIBLE = 400 ) + integer*4 GLUT_INIT_WINDOW_X + parameter ( GLUT_INIT_WINDOW_X = 500 ) + integer*4 GLUT_INIT_WINDOW_Y + parameter ( GLUT_INIT_WINDOW_Y = 501 ) + integer*4 GLUT_INIT_WINDOW_WIDTH + parameter ( GLUT_INIT_WINDOW_WIDTH = 502 ) + integer*4 GLUT_INIT_WINDOW_HEIGHT + parameter ( GLUT_INIT_WINDOW_HEIGHT = 503 ) + integer*4 GLUT_INIT_DISPLAY_MODE + parameter ( GLUT_INIT_DISPLAY_MODE = 504 ) + integer*4 GLUT_ELAPSED_TIME + parameter ( GLUT_ELAPSED_TIME = 700 ) + +C glutDeviceGet parameters + integer*4 GLUT_HAS_KEYBOARD + parameter ( GLUT_HAS_KEYBOARD = 600 ) + integer*4 GLUT_HAS_MOUSE + parameter ( GLUT_HAS_MOUSE = 601 ) + integer*4 GLUT_HAS_SPACEBALL + parameter ( GLUT_HAS_SPACEBALL = 602 ) + integer*4 GLUT_HAS_DIAL_AND_BUTTON_BOX + parameter ( GLUT_HAS_DIAL_AND_BUTTON_BOX = 603 ) + integer*4 GLUT_HAS_TABLET + parameter ( GLUT_HAS_TABLET = 604 ) + integer*4 GLUT_NUM_MOUSE_BUTTONS + parameter ( GLUT_NUM_MOUSE_BUTTONS = 605 ) + integer*4 GLUT_NUM_SPACEBALL_BUTTONS + parameter ( GLUT_NUM_SPACEBALL_BUTTONS = 606 ) + integer*4 GLUT_NUM_BUTTON_BOX_BUTTONS + parameter ( GLUT_NUM_BUTTON_BOX_BUTTONS = 607 ) + integer*4 GLUT_NUM_DIALS + parameter ( GLUT_NUM_DIALS = 608 ) + integer*4 GLUT_NUM_TABLET_BUTTONS + parameter ( GLUT_NUM_TABLET_BUTTONS = 609 ) + +C glutLayerGet parameters + integer*4 GLUT_OVERLAY_POSSIBLE + parameter ( GLUT_OVERLAY_POSSIBLE = 800 ) + integer*4 GLUT_LAYER_IN_USE + parameter ( GLUT_LAYER_IN_USE = 801 ) + integer*4 GLUT_HAS_OVERLAY + parameter ( GLUT_HAS_OVERLAY = 802 ) + integer*4 GLUT_TRANSPARENT_INDEX + parameter ( GLUT_TRANSPARENT_INDEX = 803 ) + integer*4 GLUT_NORMAL_DAMAGED + parameter ( GLUT_NORMAL_DAMAGED = 804 ) + integer*4 GLUT_OVERLAY_DAMAGED + parameter ( GLUT_OVERLAY_DAMAGED = 805 ) + +C glutUseLayer parameters + integer*4 GLUT_NORMAL + parameter ( GLUT_NORMAL = 0 ) + integer*4 GLUT_OVERLAY + parameter ( GLUT_OVERLAY = 1 ) + +C glutGetModifiers return mask + integer*4 GLUT_ACTIVE_SHIFT + parameter ( GLUT_ACTIVE_SHIFT = 1 ) + integer*4 GLUT_ACTIVE_CTRL + parameter ( GLUT_ACTIVE_CTRL = 2 ) + integer*4 GLUT_ACTIVE_ALT + parameter ( GLUT_ACTIVE_ALT = 4 ) + +C glutSetCursor parameters + integer*4 GLUT_CURSOR_RIGHT_ARROW + parameter ( GLUT_CURSOR_RIGHT_ARROW = 0 ) + integer*4 GLUT_CURSOR_LEFT_ARROW + parameter ( GLUT_CURSOR_LEFT_ARROW = 1 ) + integer*4 GLUT_CURSOR_INFO + parameter ( GLUT_CURSOR_INFO = 2 ) + integer*4 GLUT_CURSOR_DESTROY + parameter ( GLUT_CURSOR_DESTROY = 3 ) + integer*4 GLUT_CURSOR_HELP + parameter ( GLUT_CURSOR_HELP = 4 ) + integer*4 GLUT_CURSOR_CYCLE + parameter ( GLUT_CURSOR_CYCLE = 5 ) + integer*4 GLUT_CURSOR_SPRAY + parameter ( GLUT_CURSOR_SPRAY = 6 ) + integer*4 GLUT_CURSOR_WAIT + parameter ( GLUT_CURSOR_WAIT = 7 ) + integer*4 GLUT_CURSOR_TEXT + parameter ( GLUT_CURSOR_TEXT = 8 ) + integer*4 GLUT_CURSOR_CROSSHAIR + parameter ( GLUT_CURSOR_CROSSHAIR = 9 ) + integer*4 GLUT_CURSOR_UP_DOWN + parameter ( GLUT_CURSOR_UP_DOWN = 10 ) + integer*4 GLUT_CURSOR_LEFT_RIGHT + parameter ( GLUT_CURSOR_LEFT_RIGHT = 11 ) + integer*4 GLUT_CURSOR_TOP_SIDE + parameter ( GLUT_CURSOR_TOP_SIDE = 12 ) + integer*4 GLUT_CURSOR_BOTTOM_SIDE + parameter ( GLUT_CURSOR_BOTTOM_SIDE = 13 ) + integer*4 GLUT_CURSOR_LEFT_SIDE + parameter ( GLUT_CURSOR_LEFT_SIDE = 14 ) + integer*4 GLUT_CURSOR_RIGHT_SIDE + parameter ( GLUT_CURSOR_RIGHT_SIDE = 15 ) + integer*4 GLUT_CURSOR_TOP_LEFT_CORNER + parameter ( GLUT_CURSOR_TOP_LEFT_CORNER = 16 ) + integer*4 GLUT_CURSOR_TOP_RIGHT_CORNER + parameter ( GLUT_CURSOR_TOP_RIGHT_CORNER = 17 ) + integer*4 GLUT_CURSOR_BOTTOM_RIGHT_CORNER + parameter ( GLUT_CURSOR_BOTTOM_RIGHT_CORNER = 18 ) + integer*4 GLUT_CURSOR_BOTTOM_LEFT_CORNER + parameter ( GLUT_CURSOR_BOTTOM_LEFT_CORNER = 19 ) + integer*4 GLUT_CURSOR_INHERIT + parameter ( GLUT_CURSOR_INHERIT = 100 ) + integer*4 GLUT_CURSOR_NONE + parameter ( GLUT_CURSOR_NONE = 101 ) + integer*4 GLUT_CURSOR_FULL_CROSSHAIR + parameter ( GLUT_CURSOR_FULL_CROSSHAIR = 102 ) + +C GLUT functions + integer*4 glutcreatewindow + integer*4 glutcreatesubwindow + integer*4 glutgetwindow + integer*4 glutcreatemenu + integer*4 glutgetmenu + real glutgetcolor + integer*4 glutget + integer*4 glutdeviceget + integer*4 glutextensionsupported + +C GLUT NULL name + external glutnull + diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Windows/GL/gl.h b/Source/Plugins/Plugin_VideoOGL/Src/Windows/GL/gl.h new file mode 100644 index 0000000000..59fe40d3a4 --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/Windows/GL/gl.h @@ -0,0 +1,1914 @@ +#ifndef __gl_h_ +#define __gl_h_ + +#ifdef __cplusplus +extern "C" { +#endif + +/* +** The contents of this file are subject to the GLX Public License Version 1.0 +** (the "License"). You may not use this file except in compliance with the +** License. You may obtain a copy of the License at Silicon Graphics, Inc., +** attn: Legal Services, 2011 N. Shoreline Blvd., Mountain View, CA 94043 +** or at http://www.sgi.com/software/opensource/glx/license.html. +** +** Software distributed under the License is distributed on an "AS IS" +** basis. ALL WARRANTIES ARE DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY +** IMPLIED WARRANTIES OF MERCHANTABILITY, OF FITNESS FOR A PARTICULAR +** PURPOSE OR OF NON- INFRINGEMENT. See the License for the specific +** language governing rights and limitations under the License. +** +** The Original Software is GLX version 1.2 source code, released February, +** 1999. The developer of the Original Software is Silicon Graphics, Inc. +** Those portions of the Subject Software created by Silicon Graphics, Inc. +** are Copyright (c) 1991-9 Silicon Graphics, Inc. All Rights Reserved. +*/ + +#ifndef _WIN32 +#define WINGDIAPI +#define APIENTRY +#endif + +typedef unsigned int GLenum; +typedef unsigned char GLboolean; +typedef unsigned int GLbitfield; +typedef signed char GLbyte; +typedef short GLshort; +typedef int GLint; +typedef int GLsizei; +typedef unsigned char GLubyte; +typedef unsigned short GLushort; +typedef unsigned int GLuint; +typedef float GLfloat; +typedef float GLclampf; +typedef double GLdouble; +typedef double GLclampd; +typedef void GLvoid; + +/*************************************************************/ + +/* Version */ +#define GL_VERSION_1_1 1 +#define GL_VERSION_1_2 1 + +/* Extensions */ +#define GL_ARB_imaging 1 +#define GL_ARB_multitexture 1 + +/* AccumOp */ +#define GL_ACCUM 0x0100 +#define GL_LOAD 0x0101 +#define GL_RETURN 0x0102 +#define GL_MULT 0x0103 +#define GL_ADD 0x0104 + +/* AlphaFunction */ +#define GL_NEVER 0x0200 +#define GL_LESS 0x0201 +#define GL_EQUAL 0x0202 +#define GL_LEQUAL 0x0203 +#define GL_GREATER 0x0204 +#define GL_NOTEQUAL 0x0205 +#define GL_GEQUAL 0x0206 +#define GL_ALWAYS 0x0207 + +/* AttribMask */ +#define GL_CURRENT_BIT 0x00000001 +#define GL_POINT_BIT 0x00000002 +#define GL_LINE_BIT 0x00000004 +#define GL_POLYGON_BIT 0x00000008 +#define GL_POLYGON_STIPPLE_BIT 0x00000010 +#define GL_PIXEL_MODE_BIT 0x00000020 +#define GL_LIGHTING_BIT 0x00000040 +#define GL_FOG_BIT 0x00000080 +#define GL_DEPTH_BUFFER_BIT 0x00000100 +#define GL_ACCUM_BUFFER_BIT 0x00000200 +#define GL_STENCIL_BUFFER_BIT 0x00000400 +#define GL_VIEWPORT_BIT 0x00000800 +#define GL_TRANSFORM_BIT 0x00001000 +#define GL_ENABLE_BIT 0x00002000 +#define GL_COLOR_BUFFER_BIT 0x00004000 +#define GL_HINT_BIT 0x00008000 +#define GL_EVAL_BIT 0x00010000 +#define GL_LIST_BIT 0x00020000 +#define GL_TEXTURE_BIT 0x00040000 +#define GL_SCISSOR_BIT 0x00080000 +#define GL_ALL_ATTRIB_BITS 0x000fffff + +/* BeginMode */ +#define GL_POINTS 0x0000 +#define GL_LINES 0x0001 +#define GL_LINE_LOOP 0x0002 +#define GL_LINE_STRIP 0x0003 +#define GL_TRIANGLES 0x0004 +#define GL_TRIANGLE_STRIP 0x0005 +#define GL_TRIANGLE_FAN 0x0006 +#define GL_QUADS 0x0007 +#define GL_QUAD_STRIP 0x0008 +#define GL_POLYGON 0x0009 + +/* BlendEquationMode */ +/* GL_LOGIC_OP */ +/* GL_FUNC_ADD */ +/* GL_MIN */ +/* GL_MAX */ +/* GL_FUNC_SUBTRACT */ +/* GL_FUNC_REVERSE_SUBTRACT */ + +/* BlendingFactorDest */ +#define GL_ZERO 0 +#define GL_ONE 1 +#define GL_SRC_COLOR 0x0300 +#define GL_ONE_MINUS_SRC_COLOR 0x0301 +#define GL_SRC_ALPHA 0x0302 +#define GL_ONE_MINUS_SRC_ALPHA 0x0303 +#define GL_DST_ALPHA 0x0304 +#define GL_ONE_MINUS_DST_ALPHA 0x0305 +/* GL_CONSTANT_COLOR */ +/* GL_ONE_MINUS_CONSTANT_COLOR */ +/* GL_CONSTANT_ALPHA */ +/* GL_ONE_MINUS_CONSTANT_ALPHA */ + +/* BlendingFactorSrc */ +/* GL_ZERO */ +/* GL_ONE */ +#define GL_DST_COLOR 0x0306 +#define GL_ONE_MINUS_DST_COLOR 0x0307 +#define GL_SRC_ALPHA_SATURATE 0x0308 +/* GL_SRC_ALPHA */ +/* GL_ONE_MINUS_SRC_ALPHA */ +/* GL_DST_ALPHA */ +/* GL_ONE_MINUS_DST_ALPHA */ +/* GL_CONSTANT_COLOR */ +/* GL_ONE_MINUS_CONSTANT_COLOR */ +/* GL_CONSTANT_ALPHA */ +/* GL_ONE_MINUS_CONSTANT_ALPHA */ + +/* Boolean */ +#define GL_TRUE 1 +#define GL_FALSE 0 + +/* ClearBufferMask */ +/* GL_COLOR_BUFFER_BIT */ +/* GL_ACCUM_BUFFER_BIT */ +/* GL_STENCIL_BUFFER_BIT */ +/* GL_DEPTH_BUFFER_BIT */ + +/* ClientArrayType */ +/* GL_VERTEX_ARRAY */ +/* GL_NORMAL_ARRAY */ +/* GL_COLOR_ARRAY */ +/* GL_INDEX_ARRAY */ +/* GL_TEXTURE_COORD_ARRAY */ +/* GL_EDGE_FLAG_ARRAY */ + +/* ClipPlaneName */ +#define GL_CLIP_PLANE0 0x3000 +#define GL_CLIP_PLANE1 0x3001 +#define GL_CLIP_PLANE2 0x3002 +#define GL_CLIP_PLANE3 0x3003 +#define GL_CLIP_PLANE4 0x3004 +#define GL_CLIP_PLANE5 0x3005 + +/* ColorMaterialFace */ +/* GL_FRONT */ +/* GL_BACK */ +/* GL_FRONT_AND_BACK */ + +/* ColorMaterialParameter */ +/* GL_AMBIENT */ +/* GL_DIFFUSE */ +/* GL_SPECULAR */ +/* GL_EMISSION */ +/* GL_AMBIENT_AND_DIFFUSE */ + +/* ColorPointerType */ +/* GL_BYTE */ +/* GL_UNSIGNED_BYTE */ +/* GL_SHORT */ +/* GL_UNSIGNED_SHORT */ +/* GL_INT */ +/* GL_UNSIGNED_INT */ +/* GL_FLOAT */ +/* GL_DOUBLE */ + +/* ColorTableParameterPName */ +/* GL_COLOR_TABLE_SCALE */ +/* GL_COLOR_TABLE_BIAS */ + +/* ColorTableTarget */ +/* GL_COLOR_TABLE */ +/* GL_POST_CONVOLUTION_COLOR_TABLE */ +/* GL_POST_COLOR_MATRIX_COLOR_TABLE */ +/* GL_PROXY_COLOR_TABLE */ +/* GL_PROXY_POST_CONVOLUTION_COLOR_TABLE */ +/* GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE */ + +/* ConvolutionBorderMode */ +/* GL_REDUCE */ +/* GL_IGNORE_BORDER */ +/* GL_CONSTANT_BORDER */ + +/* ConvolutionParameter */ +/* GL_CONVOLUTION_BORDER_MODE */ +/* GL_CONVOLUTION_FILTER_SCALE */ +/* GL_CONVOLUTION_FILTER_BIAS */ + +/* ConvolutionTarget */ +/* GL_CONVOLUTION_1D */ +/* GL_CONVOLUTION_2D */ + +/* CullFaceMode */ +/* GL_FRONT */ +/* GL_BACK */ +/* GL_FRONT_AND_BACK */ + +/* DataType */ +#define GL_BYTE 0x1400 +#define GL_UNSIGNED_BYTE 0x1401 +#define GL_SHORT 0x1402 +#define GL_UNSIGNED_SHORT 0x1403 +#define GL_INT 0x1404 +#define GL_UNSIGNED_INT 0x1405 +#define GL_FLOAT 0x1406 +#define GL_2_BYTES 0x1407 +#define GL_3_BYTES 0x1408 +#define GL_4_BYTES 0x1409 +#define GL_DOUBLE 0x140A + +/* DepthFunction */ +/* GL_NEVER */ +/* GL_LESS */ +/* GL_EQUAL */ +/* GL_LEQUAL */ +/* GL_GREATER */ +/* GL_NOTEQUAL */ +/* GL_GEQUAL */ +/* GL_ALWAYS */ + +/* DrawBufferMode */ +#define GL_NONE 0 +#define GL_FRONT_LEFT 0x0400 +#define GL_FRONT_RIGHT 0x0401 +#define GL_BACK_LEFT 0x0402 +#define GL_BACK_RIGHT 0x0403 +#define GL_FRONT 0x0404 +#define GL_BACK 0x0405 +#define GL_LEFT 0x0406 +#define GL_RIGHT 0x0407 +#define GL_FRONT_AND_BACK 0x0408 +#define GL_AUX0 0x0409 +#define GL_AUX1 0x040A +#define GL_AUX2 0x040B +#define GL_AUX3 0x040C + +/* Enable */ +/* GL_FOG */ +/* GL_LIGHTING */ +/* GL_TEXTURE_1D */ +/* GL_TEXTURE_2D */ +/* GL_LINE_STIPPLE */ +/* GL_POLYGON_STIPPLE */ +/* GL_CULL_FACE */ +/* GL_ALPHA_TEST */ +/* GL_BLEND */ +/* GL_INDEX_LOGIC_OP */ +/* GL_COLOR_LOGIC_OP */ +/* GL_DITHER */ +/* GL_STENCIL_TEST */ +/* GL_DEPTH_TEST */ +/* GL_CLIP_PLANE0 */ +/* GL_CLIP_PLANE1 */ +/* GL_CLIP_PLANE2 */ +/* GL_CLIP_PLANE3 */ +/* GL_CLIP_PLANE4 */ +/* GL_CLIP_PLANE5 */ +/* GL_LIGHT0 */ +/* GL_LIGHT1 */ +/* GL_LIGHT2 */ +/* GL_LIGHT3 */ +/* GL_LIGHT4 */ +/* GL_LIGHT5 */ +/* GL_LIGHT6 */ +/* GL_LIGHT7 */ +/* GL_TEXTURE_GEN_S */ +/* GL_TEXTURE_GEN_T */ +/* GL_TEXTURE_GEN_R */ +/* GL_TEXTURE_GEN_Q */ +/* GL_MAP1_VERTEX_3 */ +/* GL_MAP1_VERTEX_4 */ +/* GL_MAP1_COLOR_4 */ +/* GL_MAP1_INDEX */ +/* GL_MAP1_NORMAL */ +/* GL_MAP1_TEXTURE_COORD_1 */ +/* GL_MAP1_TEXTURE_COORD_2 */ +/* GL_MAP1_TEXTURE_COORD_3 */ +/* GL_MAP1_TEXTURE_COORD_4 */ +/* GL_MAP2_VERTEX_3 */ +/* GL_MAP2_VERTEX_4 */ +/* GL_MAP2_COLOR_4 */ +/* GL_MAP2_INDEX */ +/* GL_MAP2_NORMAL */ +/* GL_MAP2_TEXTURE_COORD_1 */ +/* GL_MAP2_TEXTURE_COORD_2 */ +/* GL_MAP2_TEXTURE_COORD_3 */ +/* GL_MAP2_TEXTURE_COORD_4 */ +/* GL_POINT_SMOOTH */ +/* GL_LINE_SMOOTH */ +/* GL_POLYGON_SMOOTH */ +/* GL_SCISSOR_TEST */ +/* GL_COLOR_MATERIAL */ +/* GL_NORMALIZE */ +/* GL_AUTO_NORMAL */ +/* GL_VERTEX_ARRAY */ +/* GL_NORMAL_ARRAY */ +/* GL_COLOR_ARRAY */ +/* GL_INDEX_ARRAY */ +/* GL_TEXTURE_COORD_ARRAY */ +/* GL_EDGE_FLAG_ARRAY */ +/* GL_POLYGON_OFFSET_POINT */ +/* GL_POLYGON_OFFSET_LINE */ +/* GL_POLYGON_OFFSET_FILL */ +/* GL_COLOR_TABLE */ +/* GL_POST_CONVOLUTION_COLOR_TABLE */ +/* GL_POST_COLOR_MATRIX_COLOR_TABLE */ +/* GL_CONVOLUTION_1D */ +/* GL_CONVOLUTION_2D */ +/* GL_SEPARABLE_2D */ +/* GL_HISTOGRAM */ +/* GL_MINMAX */ +/* GL_RESCALE_NORMAL */ +/* GL_TEXTURE_3D */ + +/* ErrorCode */ +#define GL_NO_ERROR 0 +#define GL_INVALID_ENUM 0x0500 +#define GL_INVALID_VALUE 0x0501 +#define GL_INVALID_OPERATION 0x0502 +#define GL_STACK_OVERFLOW 0x0503 +#define GL_STACK_UNDERFLOW 0x0504 +#define GL_OUT_OF_MEMORY 0x0505 +/* GL_TABLE_TOO_LARGE */ + +/* FeedBackMode */ +#define GL_2D 0x0600 +#define GL_3D 0x0601 +#define GL_3D_COLOR 0x0602 +#define GL_3D_COLOR_TEXTURE 0x0603 +#define GL_4D_COLOR_TEXTURE 0x0604 + +/* FeedBackToken */ +#define GL_PASS_THROUGH_TOKEN 0x0700 +#define GL_POINT_TOKEN 0x0701 +#define GL_LINE_TOKEN 0x0702 +#define GL_POLYGON_TOKEN 0x0703 +#define GL_BITMAP_TOKEN 0x0704 +#define GL_DRAW_PIXEL_TOKEN 0x0705 +#define GL_COPY_PIXEL_TOKEN 0x0706 +#define GL_LINE_RESET_TOKEN 0x0707 + +/* FogMode */ +/* GL_LINEAR */ +#define GL_EXP 0x0800 +#define GL_EXP2 0x0801 + +/* FogParameter */ +/* GL_FOG_COLOR */ +/* GL_FOG_DENSITY */ +/* GL_FOG_END */ +/* GL_FOG_INDEX */ +/* GL_FOG_MODE */ +/* GL_FOG_START */ + +/* FrontFaceDirection */ +#define GL_CW 0x0900 +#define GL_CCW 0x0901 + +/* GetColorTableParameterPName */ +/* GL_COLOR_TABLE_SCALE */ +/* GL_COLOR_TABLE_BIAS */ +/* GL_COLOR_TABLE_FORMAT */ +/* GL_COLOR_TABLE_WIDTH */ +/* GL_COLOR_TABLE_RED_SIZE */ +/* GL_COLOR_TABLE_GREEN_SIZE */ +/* GL_COLOR_TABLE_BLUE_SIZE */ +/* GL_COLOR_TABLE_ALPHA_SIZE */ +/* GL_COLOR_TABLE_LUMINANCE_SIZE */ +/* GL_COLOR_TABLE_INTENSITY_SIZE */ + +/* GetConvolutionParameterPName */ +/* GL_CONVOLUTION_BORDER_COLOR */ +/* GL_CONVOLUTION_BORDER_MODE */ +/* GL_CONVOLUTION_FILTER_SCALE */ +/* GL_CONVOLUTION_FILTER_BIAS */ +/* GL_CONVOLUTION_FORMAT */ +/* GL_CONVOLUTION_WIDTH */ +/* GL_CONVOLUTION_HEIGHT */ +/* GL_MAX_CONVOLUTION_WIDTH */ +/* GL_MAX_CONVOLUTION_HEIGHT */ + +/* GetHistogramParameterPName */ +/* GL_HISTOGRAM_WIDTH */ +/* GL_HISTOGRAM_FORMAT */ +/* GL_HISTOGRAM_RED_SIZE */ +/* GL_HISTOGRAM_GREEN_SIZE */ +/* GL_HISTOGRAM_BLUE_SIZE */ +/* GL_HISTOGRAM_ALPHA_SIZE */ +/* GL_HISTOGRAM_LUMINANCE_SIZE */ +/* GL_HISTOGRAM_SINK */ + +/* GetMapTarget */ +#define GL_COEFF 0x0A00 +#define GL_ORDER 0x0A01 +#define GL_DOMAIN 0x0A02 + +/* GetMinmaxParameterPName */ +/* GL_MINMAX_FORMAT */ +/* GL_MINMAX_SINK */ + +/* GetPixelMap */ +/* GL_PIXEL_MAP_I_TO_I */ +/* GL_PIXEL_MAP_S_TO_S */ +/* GL_PIXEL_MAP_I_TO_R */ +/* GL_PIXEL_MAP_I_TO_G */ +/* GL_PIXEL_MAP_I_TO_B */ +/* GL_PIXEL_MAP_I_TO_A */ +/* GL_PIXEL_MAP_R_TO_R */ +/* GL_PIXEL_MAP_G_TO_G */ +/* GL_PIXEL_MAP_B_TO_B */ +/* GL_PIXEL_MAP_A_TO_A */ + +/* GetPointerTarget */ +/* GL_VERTEX_ARRAY_POINTER */ +/* GL_NORMAL_ARRAY_POINTER */ +/* GL_COLOR_ARRAY_POINTER */ +/* GL_INDEX_ARRAY_POINTER */ +/* GL_TEXTURE_COORD_ARRAY_POINTER */ +/* GL_EDGE_FLAG_ARRAY_POINTER */ + +/* GetTarget */ +#define GL_CURRENT_COLOR 0x0B00 +#define GL_CURRENT_INDEX 0x0B01 +#define GL_CURRENT_NORMAL 0x0B02 +#define GL_CURRENT_TEXTURE_COORDS 0x0B03 +#define GL_CURRENT_RASTER_COLOR 0x0B04 +#define GL_CURRENT_RASTER_INDEX 0x0B05 +#define GL_CURRENT_RASTER_TEXTURE_COORDS 0x0B06 +#define GL_CURRENT_RASTER_POSITION 0x0B07 +#define GL_CURRENT_RASTER_POSITION_VALID 0x0B08 +#define GL_CURRENT_RASTER_DISTANCE 0x0B09 +#define GL_POINT_SMOOTH 0x0B10 +#define GL_POINT_SIZE 0x0B11 +#define GL_POINT_SIZE_RANGE 0x0B12 +#define GL_POINT_SIZE_GRANULARITY 0x0B13 +#define GL_LINE_SMOOTH 0x0B20 +#define GL_LINE_WIDTH 0x0B21 +#define GL_LINE_WIDTH_RANGE 0x0B22 +#define GL_LINE_WIDTH_GRANULARITY 0x0B23 +#define GL_LINE_STIPPLE 0x0B24 +#define GL_LINE_STIPPLE_PATTERN 0x0B25 +#define GL_LINE_STIPPLE_REPEAT 0x0B26 +/* GL_SMOOTH_POINT_SIZE_RANGE */ +/* GL_SMOOTH_POINT_SIZE_GRANULARITY */ +/* GL_SMOOTH_LINE_WIDTH_RANGE */ +/* GL_SMOOTH_LINE_WIDTH_GRANULARITY */ +/* GL_ALIASED_POINT_SIZE_RANGE */ +/* GL_ALIASED_LINE_WIDTH_RANGE */ +#define GL_LIST_MODE 0x0B30 +#define GL_MAX_LIST_NESTING 0x0B31 +#define GL_LIST_BASE 0x0B32 +#define GL_LIST_INDEX 0x0B33 +#define GL_POLYGON_MODE 0x0B40 +#define GL_POLYGON_SMOOTH 0x0B41 +#define GL_POLYGON_STIPPLE 0x0B42 +#define GL_EDGE_FLAG 0x0B43 +#define GL_CULL_FACE 0x0B44 +#define GL_CULL_FACE_MODE 0x0B45 +#define GL_FRONT_FACE 0x0B46 +#define GL_LIGHTING 0x0B50 +#define GL_LIGHT_MODEL_LOCAL_VIEWER 0x0B51 +#define GL_LIGHT_MODEL_TWO_SIDE 0x0B52 +#define GL_LIGHT_MODEL_AMBIENT 0x0B53 +#define GL_SHADE_MODEL 0x0B54 +#define GL_COLOR_MATERIAL_FACE 0x0B55 +#define GL_COLOR_MATERIAL_PARAMETER 0x0B56 +#define GL_COLOR_MATERIAL 0x0B57 +#define GL_FOG 0x0B60 +#define GL_FOG_INDEX 0x0B61 +#define GL_FOG_DENSITY 0x0B62 +#define GL_FOG_START 0x0B63 +#define GL_FOG_END 0x0B64 +#define GL_FOG_MODE 0x0B65 +#define GL_FOG_COLOR 0x0B66 +#define GL_DEPTH_RANGE 0x0B70 +#define GL_DEPTH_TEST 0x0B71 +#define GL_DEPTH_WRITEMASK 0x0B72 +#define GL_DEPTH_CLEAR_VALUE 0x0B73 +#define GL_DEPTH_FUNC 0x0B74 +#define GL_ACCUM_CLEAR_VALUE 0x0B80 +#define GL_STENCIL_TEST 0x0B90 +#define GL_STENCIL_CLEAR_VALUE 0x0B91 +#define GL_STENCIL_FUNC 0x0B92 +#define GL_STENCIL_VALUE_MASK 0x0B93 +#define GL_STENCIL_FAIL 0x0B94 +#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95 +#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96 +#define GL_STENCIL_REF 0x0B97 +#define GL_STENCIL_WRITEMASK 0x0B98 +#define GL_MATRIX_MODE 0x0BA0 +#define GL_NORMALIZE 0x0BA1 +#define GL_VIEWPORT 0x0BA2 +#define GL_MODELVIEW_STACK_DEPTH 0x0BA3 +#define GL_PROJECTION_STACK_DEPTH 0x0BA4 +#define GL_TEXTURE_STACK_DEPTH 0x0BA5 +#define GL_MODELVIEW_MATRIX 0x0BA6 +#define GL_PROJECTION_MATRIX 0x0BA7 +#define GL_TEXTURE_MATRIX 0x0BA8 +#define GL_ATTRIB_STACK_DEPTH 0x0BB0 +#define GL_CLIENT_ATTRIB_STACK_DEPTH 0x0BB1 +#define GL_ALPHA_TEST 0x0BC0 +#define GL_ALPHA_TEST_FUNC 0x0BC1 +#define GL_ALPHA_TEST_REF 0x0BC2 +#define GL_DITHER 0x0BD0 +#define GL_BLEND_DST 0x0BE0 +#define GL_BLEND_SRC 0x0BE1 +#define GL_BLEND 0x0BE2 +#define GL_LOGIC_OP_MODE 0x0BF0 +#define GL_INDEX_LOGIC_OP 0x0BF1 +#define GL_COLOR_LOGIC_OP 0x0BF2 +#define GL_AUX_BUFFERS 0x0C00 +#define GL_DRAW_BUFFER 0x0C01 +#define GL_READ_BUFFER 0x0C02 +#define GL_SCISSOR_BOX 0x0C10 +#define GL_SCISSOR_TEST 0x0C11 +#define GL_INDEX_CLEAR_VALUE 0x0C20 +#define GL_INDEX_WRITEMASK 0x0C21 +#define GL_COLOR_CLEAR_VALUE 0x0C22 +#define GL_COLOR_WRITEMASK 0x0C23 +#define GL_INDEX_MODE 0x0C30 +#define GL_RGBA_MODE 0x0C31 +#define GL_DOUBLEBUFFER 0x0C32 +#define GL_STEREO 0x0C33 +#define GL_RENDER_MODE 0x0C40 +#define GL_PERSPECTIVE_CORRECTION_HINT 0x0C50 +#define GL_POINT_SMOOTH_HINT 0x0C51 +#define GL_LINE_SMOOTH_HINT 0x0C52 +#define GL_POLYGON_SMOOTH_HINT 0x0C53 +#define GL_FOG_HINT 0x0C54 +#define GL_TEXTURE_GEN_S 0x0C60 +#define GL_TEXTURE_GEN_T 0x0C61 +#define GL_TEXTURE_GEN_R 0x0C62 +#define GL_TEXTURE_GEN_Q 0x0C63 +#define GL_PIXEL_MAP_I_TO_I 0x0C70 +#define GL_PIXEL_MAP_S_TO_S 0x0C71 +#define GL_PIXEL_MAP_I_TO_R 0x0C72 +#define GL_PIXEL_MAP_I_TO_G 0x0C73 +#define GL_PIXEL_MAP_I_TO_B 0x0C74 +#define GL_PIXEL_MAP_I_TO_A 0x0C75 +#define GL_PIXEL_MAP_R_TO_R 0x0C76 +#define GL_PIXEL_MAP_G_TO_G 0x0C77 +#define GL_PIXEL_MAP_B_TO_B 0x0C78 +#define GL_PIXEL_MAP_A_TO_A 0x0C79 +#define GL_PIXEL_MAP_I_TO_I_SIZE 0x0CB0 +#define GL_PIXEL_MAP_S_TO_S_SIZE 0x0CB1 +#define GL_PIXEL_MAP_I_TO_R_SIZE 0x0CB2 +#define GL_PIXEL_MAP_I_TO_G_SIZE 0x0CB3 +#define GL_PIXEL_MAP_I_TO_B_SIZE 0x0CB4 +#define GL_PIXEL_MAP_I_TO_A_SIZE 0x0CB5 +#define GL_PIXEL_MAP_R_TO_R_SIZE 0x0CB6 +#define GL_PIXEL_MAP_G_TO_G_SIZE 0x0CB7 +#define GL_PIXEL_MAP_B_TO_B_SIZE 0x0CB8 +#define GL_PIXEL_MAP_A_TO_A_SIZE 0x0CB9 +#define GL_UNPACK_SWAP_BYTES 0x0CF0 +#define GL_UNPACK_LSB_FIRST 0x0CF1 +#define GL_UNPACK_ROW_LENGTH 0x0CF2 +#define GL_UNPACK_SKIP_ROWS 0x0CF3 +#define GL_UNPACK_SKIP_PIXELS 0x0CF4 +#define GL_UNPACK_ALIGNMENT 0x0CF5 +#define GL_PACK_SWAP_BYTES 0x0D00 +#define GL_PACK_LSB_FIRST 0x0D01 +#define GL_PACK_ROW_LENGTH 0x0D02 +#define GL_PACK_SKIP_ROWS 0x0D03 +#define GL_PACK_SKIP_PIXELS 0x0D04 +#define GL_PACK_ALIGNMENT 0x0D05 +#define GL_MAP_COLOR 0x0D10 +#define GL_MAP_STENCIL 0x0D11 +#define GL_INDEX_SHIFT 0x0D12 +#define GL_INDEX_OFFSET 0x0D13 +#define GL_RED_SCALE 0x0D14 +#define GL_RED_BIAS 0x0D15 +#define GL_ZOOM_X 0x0D16 +#define GL_ZOOM_Y 0x0D17 +#define GL_GREEN_SCALE 0x0D18 +#define GL_GREEN_BIAS 0x0D19 +#define GL_BLUE_SCALE 0x0D1A +#define GL_BLUE_BIAS 0x0D1B +#define GL_ALPHA_SCALE 0x0D1C +#define GL_ALPHA_BIAS 0x0D1D +#define GL_DEPTH_SCALE 0x0D1E +#define GL_DEPTH_BIAS 0x0D1F +#define GL_MAX_EVAL_ORDER 0x0D30 +#define GL_MAX_LIGHTS 0x0D31 +#define GL_MAX_CLIP_PLANES 0x0D32 +#define GL_MAX_TEXTURE_SIZE 0x0D33 +#define GL_MAX_PIXEL_MAP_TABLE 0x0D34 +#define GL_MAX_ATTRIB_STACK_DEPTH 0x0D35 +#define GL_MAX_MODELVIEW_STACK_DEPTH 0x0D36 +#define GL_MAX_NAME_STACK_DEPTH 0x0D37 +#define GL_MAX_PROJECTION_STACK_DEPTH 0x0D38 +#define GL_MAX_TEXTURE_STACK_DEPTH 0x0D39 +#define GL_MAX_VIEWPORT_DIMS 0x0D3A +#define GL_MAX_CLIENT_ATTRIB_STACK_DEPTH 0x0D3B +#define GL_SUBPIXEL_BITS 0x0D50 +#define GL_INDEX_BITS 0x0D51 +#define GL_RED_BITS 0x0D52 +#define GL_GREEN_BITS 0x0D53 +#define GL_BLUE_BITS 0x0D54 +#define GL_ALPHA_BITS 0x0D55 +#define GL_DEPTH_BITS 0x0D56 +#define GL_STENCIL_BITS 0x0D57 +#define GL_ACCUM_RED_BITS 0x0D58 +#define GL_ACCUM_GREEN_BITS 0x0D59 +#define GL_ACCUM_BLUE_BITS 0x0D5A +#define GL_ACCUM_ALPHA_BITS 0x0D5B +#define GL_NAME_STACK_DEPTH 0x0D70 +#define GL_AUTO_NORMAL 0x0D80 +#define GL_MAP1_COLOR_4 0x0D90 +#define GL_MAP1_INDEX 0x0D91 +#define GL_MAP1_NORMAL 0x0D92 +#define GL_MAP1_TEXTURE_COORD_1 0x0D93 +#define GL_MAP1_TEXTURE_COORD_2 0x0D94 +#define GL_MAP1_TEXTURE_COORD_3 0x0D95 +#define GL_MAP1_TEXTURE_COORD_4 0x0D96 +#define GL_MAP1_VERTEX_3 0x0D97 +#define GL_MAP1_VERTEX_4 0x0D98 +#define GL_MAP2_COLOR_4 0x0DB0 +#define GL_MAP2_INDEX 0x0DB1 +#define GL_MAP2_NORMAL 0x0DB2 +#define GL_MAP2_TEXTURE_COORD_1 0x0DB3 +#define GL_MAP2_TEXTURE_COORD_2 0x0DB4 +#define GL_MAP2_TEXTURE_COORD_3 0x0DB5 +#define GL_MAP2_TEXTURE_COORD_4 0x0DB6 +#define GL_MAP2_VERTEX_3 0x0DB7 +#define GL_MAP2_VERTEX_4 0x0DB8 +#define GL_MAP1_GRID_DOMAIN 0x0DD0 +#define GL_MAP1_GRID_SEGMENTS 0x0DD1 +#define GL_MAP2_GRID_DOMAIN 0x0DD2 +#define GL_MAP2_GRID_SEGMENTS 0x0DD3 +#define GL_TEXTURE_1D 0x0DE0 +#define GL_TEXTURE_2D 0x0DE1 +#define GL_FEEDBACK_BUFFER_POINTER 0x0DF0 +#define GL_FEEDBACK_BUFFER_SIZE 0x0DF1 +#define GL_FEEDBACK_BUFFER_TYPE 0x0DF2 +#define GL_SELECTION_BUFFER_POINTER 0x0DF3 +#define GL_SELECTION_BUFFER_SIZE 0x0DF4 +/* GL_TEXTURE_BINDING_1D */ +/* GL_TEXTURE_BINDING_2D */ +/* GL_TEXTURE_BINDING_3D */ +/* GL_VERTEX_ARRAY */ +/* GL_NORMAL_ARRAY */ +/* GL_COLOR_ARRAY */ +/* GL_INDEX_ARRAY */ +/* GL_TEXTURE_COORD_ARRAY */ +/* GL_EDGE_FLAG_ARRAY */ +/* GL_VERTEX_ARRAY_SIZE */ +/* GL_VERTEX_ARRAY_TYPE */ +/* GL_VERTEX_ARRAY_STRIDE */ +/* GL_NORMAL_ARRAY_TYPE */ +/* GL_NORMAL_ARRAY_STRIDE */ +/* GL_COLOR_ARRAY_SIZE */ +/* GL_COLOR_ARRAY_TYPE */ +/* GL_COLOR_ARRAY_STRIDE */ +/* GL_INDEX_ARRAY_TYPE */ +/* GL_INDEX_ARRAY_STRIDE */ +/* GL_TEXTURE_COORD_ARRAY_SIZE */ +/* GL_TEXTURE_COORD_ARRAY_TYPE */ +/* GL_TEXTURE_COORD_ARRAY_STRIDE */ +/* GL_EDGE_FLAG_ARRAY_STRIDE */ +/* GL_POLYGON_OFFSET_FACTOR */ +/* GL_POLYGON_OFFSET_UNITS */ +/* GL_COLOR_TABLE */ +/* GL_POST_CONVOLUTION_COLOR_TABLE */ +/* GL_POST_COLOR_MATRIX_COLOR_TABLE */ +/* GL_CONVOLUTION_1D */ +/* GL_CONVOLUTION_2D */ +/* GL_SEPARABLE_2D */ +/* GL_POST_CONVOLUTION_RED_SCALE */ +/* GL_POST_CONVOLUTION_GREEN_SCALE */ +/* GL_POST_CONVOLUTION_BLUE_SCALE */ +/* GL_POST_CONVOLUTION_ALPHA_SCALE */ +/* GL_POST_CONVOLUTION_RED_BIAS */ +/* GL_POST_CONVOLUTION_GREEN_BIAS */ +/* GL_POST_CONVOLUTION_BLUE_BIAS */ +/* GL_POST_CONVOLUTION_ALPHA_BIAS */ +/* GL_COLOR_MATRIX */ +/* GL_COLOR_MATRIX_STACK_DEPTH */ +/* GL_MAX_COLOR_MATRIX_STACK_DEPTH */ +/* GL_POST_COLOR_MATRIX_RED_SCALE */ +/* GL_POST_COLOR_MATRIX_GREEN_SCALE */ +/* GL_POST_COLOR_MATRIX_BLUE_SCALE */ +/* GL_POST_COLOR_MATRIX_ALPHA_SCALE */ +/* GL_POST_COLOR_MATRIX_RED_BIAS */ +/* GL_POST_COLOR_MATRIX_GREEN_BIAS */ +/* GL_POST_COLOR_MATRIX_BLUE_BIAS */ +/* GL_POST_COLOR_MATRIX_ALPHA_BIAS */ +/* GL_HISTOGRAM */ +/* GL_MINMAX */ +/* GL_MAX_ELEMENTS_VERTICES */ +/* GL_MAX_ELEMENTS_INDICES */ +/* GL_RESCALE_NORMAL */ +/* GL_LIGHT_MODEL_COLOR_CONTROL */ +/* GL_PACK_SKIP_IMAGES */ +/* GL_PACK_IMAGE_HEIGHT */ +/* GL_UNPACK_SKIP_IMAGES */ +/* GL_UNPACK_IMAGE_HEIGHT */ +/* GL_TEXTURE_3D */ +/* GL_MAX_3D_TEXTURE_SIZE */ +/* GL_BLEND_COLOR */ +/* GL_BLEND_EQUATION */ +/* GL_ACTIVE_TEXTURE_ARB */ +/* GL_CLIENT_ACTIVE_TEXTURE_ARB */ +/* GL_MAX_TEXTURE_UNITS_ARB */ + +/* GetTextureParameter */ +/* GL_TEXTURE_MAG_FILTER */ +/* GL_TEXTURE_MIN_FILTER */ +/* GL_TEXTURE_WRAP_S */ +/* GL_TEXTURE_WRAP_T */ +#define GL_TEXTURE_WIDTH 0x1000 +#define GL_TEXTURE_HEIGHT 0x1001 +#define GL_TEXTURE_INTERNAL_FORMAT 0x1003 +#define GL_TEXTURE_BORDER_COLOR 0x1004 +#define GL_TEXTURE_BORDER 0x1005 +/* GL_TEXTURE_RED_SIZE */ +/* GL_TEXTURE_GREEN_SIZE */ +/* GL_TEXTURE_BLUE_SIZE */ +/* GL_TEXTURE_ALPHA_SIZE */ +/* GL_TEXTURE_LUMINANCE_SIZE */ +/* GL_TEXTURE_INTENSITY_SIZE */ +/* GL_TEXTURE_PRIORITY */ +/* GL_TEXTURE_RESIDENT */ +/* GL_TEXTURE_DEPTH */ +/* GL_TEXTURE_WRAP_R */ +/* GL_TEXTURE_MIN_LOD */ +/* GL_TEXTURE_MAX_LOD */ +/* GL_TEXTURE_BASE_LEVEL */ +/* GL_TEXTURE_MAX_LEVEL */ + +/* HintMode */ +#define GL_DONT_CARE 0x1100 +#define GL_FASTEST 0x1101 +#define GL_NICEST 0x1102 + +/* HintTarget */ +/* GL_PERSPECTIVE_CORRECTION_HINT */ +/* GL_POINT_SMOOTH_HINT */ +/* GL_LINE_SMOOTH_HINT */ +/* GL_POLYGON_SMOOTH_HINT */ +/* GL_FOG_HINT */ + +/* HistogramTarget */ +/* GL_HISTOGRAM */ +/* GL_PROXY_HISTOGRAM */ + +/* IndexPointerType */ +/* GL_SHORT */ +/* GL_INT */ +/* GL_FLOAT */ +/* GL_DOUBLE */ + +/* LightModelColorControl */ +/* GL_SINGLE_COLOR */ +/* GL_SEPARATE_SPECULAR_COLOR */ + +/* LightModelParameter */ +/* GL_LIGHT_MODEL_AMBIENT */ +/* GL_LIGHT_MODEL_LOCAL_VIEWER */ +/* GL_LIGHT_MODEL_TWO_SIDE */ +/* GL_LIGHT_MODEL_COLOR_CONTROL */ + +/* LightName */ +#define GL_LIGHT0 0x4000 +#define GL_LIGHT1 0x4001 +#define GL_LIGHT2 0x4002 +#define GL_LIGHT3 0x4003 +#define GL_LIGHT4 0x4004 +#define GL_LIGHT5 0x4005 +#define GL_LIGHT6 0x4006 +#define GL_LIGHT7 0x4007 + +/* LightParameter */ +#define GL_AMBIENT 0x1200 +#define GL_DIFFUSE 0x1201 +#define GL_SPECULAR 0x1202 +#define GL_POSITION 0x1203 +#define GL_SPOT_DIRECTION 0x1204 +#define GL_SPOT_EXPONENT 0x1205 +#define GL_SPOT_CUTOFF 0x1206 +#define GL_CONSTANT_ATTENUATION 0x1207 +#define GL_LINEAR_ATTENUATION 0x1208 +#define GL_QUADRATIC_ATTENUATION 0x1209 + +/* InterleavedArrays */ +/* GL_V2F */ +/* GL_V3F */ +/* GL_C4UB_V2F */ +/* GL_C4UB_V3F */ +/* GL_C3F_V3F */ +/* GL_N3F_V3F */ +/* GL_C4F_N3F_V3F */ +/* GL_T2F_V3F */ +/* GL_T4F_V4F */ +/* GL_T2F_C4UB_V3F */ +/* GL_T2F_C3F_V3F */ +/* GL_T2F_N3F_V3F */ +/* GL_T2F_C4F_N3F_V3F */ +/* GL_T4F_C4F_N3F_V4F */ + +/* ListMode */ +#define GL_COMPILE 0x1300 +#define GL_COMPILE_AND_EXECUTE 0x1301 + +/* ListNameType */ +/* GL_BYTE */ +/* GL_UNSIGNED_BYTE */ +/* GL_SHORT */ +/* GL_UNSIGNED_SHORT */ +/* GL_INT */ +/* GL_UNSIGNED_INT */ +/* GL_FLOAT */ +/* GL_2_BYTES */ +/* GL_3_BYTES */ +/* GL_4_BYTES */ + +/* LogicOp */ +#define GL_CLEAR 0x1500 +#define GL_AND 0x1501 +#define GL_AND_REVERSE 0x1502 +#define GL_COPY 0x1503 +#define GL_AND_INVERTED 0x1504 +#define GL_NOOP 0x1505 +#define GL_XOR 0x1506 +#define GL_OR 0x1507 +#define GL_NOR 0x1508 +#define GL_EQUIV 0x1509 +#define GL_INVERT 0x150A +#define GL_OR_REVERSE 0x150B +#define GL_COPY_INVERTED 0x150C +#define GL_OR_INVERTED 0x150D +#define GL_NAND 0x150E +#define GL_SET 0x150F + +/* MapTarget */ +/* GL_MAP1_COLOR_4 */ +/* GL_MAP1_INDEX */ +/* GL_MAP1_NORMAL */ +/* GL_MAP1_TEXTURE_COORD_1 */ +/* GL_MAP1_TEXTURE_COORD_2 */ +/* GL_MAP1_TEXTURE_COORD_3 */ +/* GL_MAP1_TEXTURE_COORD_4 */ +/* GL_MAP1_VERTEX_3 */ +/* GL_MAP1_VERTEX_4 */ +/* GL_MAP2_COLOR_4 */ +/* GL_MAP2_INDEX */ +/* GL_MAP2_NORMAL */ +/* GL_MAP2_TEXTURE_COORD_1 */ +/* GL_MAP2_TEXTURE_COORD_2 */ +/* GL_MAP2_TEXTURE_COORD_3 */ +/* GL_MAP2_TEXTURE_COORD_4 */ +/* GL_MAP2_VERTEX_3 */ +/* GL_MAP2_VERTEX_4 */ + +/* MaterialFace */ +/* GL_FRONT */ +/* GL_BACK */ +/* GL_FRONT_AND_BACK */ + +/* MaterialParameter */ +#define GL_EMISSION 0x1600 +#define GL_SHININESS 0x1601 +#define GL_AMBIENT_AND_DIFFUSE 0x1602 +#define GL_COLOR_INDEXES 0x1603 +/* GL_AMBIENT */ +/* GL_DIFFUSE */ +/* GL_SPECULAR */ + +/* MatrixMode */ +#define GL_MODELVIEW 0x1700 +#define GL_PROJECTION 0x1701 +#define GL_TEXTURE 0x1702 + +/* MeshMode1 */ +/* GL_POINT */ +/* GL_LINE */ + +/* MeshMode2 */ +/* GL_POINT */ +/* GL_LINE */ +/* GL_FILL */ + +/* MinmaxTarget */ +/* GL_MINMAX */ + +/* NormalPointerType */ +/* GL_BYTE */ +/* GL_SHORT */ +/* GL_INT */ +/* GL_FLOAT */ +/* GL_DOUBLE */ + +/* PixelCopyType */ +#define GL_COLOR 0x1800 +#define GL_DEPTH 0x1801 +#define GL_STENCIL 0x1802 + +/* PixelFormat */ +#define GL_COLOR_INDEX 0x1900 +#define GL_STENCIL_INDEX 0x1901 +#define GL_DEPTH_COMPONENT 0x1902 +#define GL_RED 0x1903 +#define GL_GREEN 0x1904 +#define GL_BLUE 0x1905 +#define GL_ALPHA 0x1906 +#define GL_RGB 0x1907 +#define GL_RGBA 0x1908 +#define GL_LUMINANCE 0x1909 +#define GL_LUMINANCE_ALPHA 0x190A +/* GL_ABGR */ + +/* PixelInternalFormat */ +/* GL_ALPHA4 */ +/* GL_ALPHA8 */ +/* GL_ALPHA12 */ +/* GL_ALPHA16 */ +/* GL_LUMINANCE4 */ +/* GL_LUMINANCE8 */ +/* GL_LUMINANCE12 */ +/* GL_LUMINANCE16 */ +/* GL_LUMINANCE4_ALPHA4 */ +/* GL_LUMINANCE6_ALPHA2 */ +/* GL_LUMINANCE8_ALPHA8 */ +/* GL_LUMINANCE12_ALPHA4 */ +/* GL_LUMINANCE12_ALPHA12 */ +/* GL_LUMINANCE16_ALPHA16 */ +/* GL_INTENSITY */ +/* GL_INTENSITY4 */ +/* GL_INTENSITY8 */ +/* GL_INTENSITY12 */ +/* GL_INTENSITY16 */ +/* GL_R3_G3_B2 */ +/* GL_RGB4 */ +/* GL_RGB5 */ +/* GL_RGB8 */ +/* GL_RGB10 */ +/* GL_RGB12 */ +/* GL_RGB16 */ +/* GL_RGBA2 */ +/* GL_RGBA4 */ +/* GL_RGB5_A1 */ +/* GL_RGBA8 */ +/* GL_RGB10_A2 */ +/* GL_RGBA12 */ +/* GL_RGBA16 */ + +/* PixelMap */ +/* GL_PIXEL_MAP_I_TO_I */ +/* GL_PIXEL_MAP_S_TO_S */ +/* GL_PIXEL_MAP_I_TO_R */ +/* GL_PIXEL_MAP_I_TO_G */ +/* GL_PIXEL_MAP_I_TO_B */ +/* GL_PIXEL_MAP_I_TO_A */ +/* GL_PIXEL_MAP_R_TO_R */ +/* GL_PIXEL_MAP_G_TO_G */ +/* GL_PIXEL_MAP_B_TO_B */ +/* GL_PIXEL_MAP_A_TO_A */ + +/* PixelStore */ +/* GL_UNPACK_SWAP_BYTES */ +/* GL_UNPACK_LSB_FIRST */ +/* GL_UNPACK_ROW_LENGTH */ +/* GL_UNPACK_SKIP_ROWS */ +/* GL_UNPACK_SKIP_PIXELS */ +/* GL_UNPACK_ALIGNMENT */ +/* GL_PACK_SWAP_BYTES */ +/* GL_PACK_LSB_FIRST */ +/* GL_PACK_ROW_LENGTH */ +/* GL_PACK_SKIP_ROWS */ +/* GL_PACK_SKIP_PIXELS */ +/* GL_PACK_ALIGNMENT */ +/* GL_PACK_SKIP_IMAGES */ +/* GL_PACK_IMAGE_HEIGHT */ +/* GL_UNPACK_SKIP_IMAGES */ +/* GL_UNPACK_IMAGE_HEIGHT */ + +/* PixelTransfer */ +/* GL_MAP_COLOR */ +/* GL_MAP_STENCIL */ +/* GL_INDEX_SHIFT */ +/* GL_INDEX_OFFSET */ +/* GL_RED_SCALE */ +/* GL_RED_BIAS */ +/* GL_GREEN_SCALE */ +/* GL_GREEN_BIAS */ +/* GL_BLUE_SCALE */ +/* GL_BLUE_BIAS */ +/* GL_ALPHA_SCALE */ +/* GL_ALPHA_BIAS */ +/* GL_DEPTH_SCALE */ +/* GL_DEPTH_BIAS */ +/* GL_POST_CONVOLUTION_RED_SCALE */ +/* GL_POST_CONVOLUTION_GREEN_SCALE */ +/* GL_POST_CONVOLUTION_BLUE_SCALE */ +/* GL_POST_CONVOLUTION_ALPHA_SCALE */ +/* GL_POST_CONVOLUTION_RED_BIAS */ +/* GL_POST_CONVOLUTION_GREEN_BIAS */ +/* GL_POST_CONVOLUTION_BLUE_BIAS */ +/* GL_POST_CONVOLUTION_ALPHA_BIAS */ +/* GL_POST_COLOR_MATRIX_RED_SCALE */ +/* GL_POST_COLOR_MATRIX_GREEN_SCALE */ +/* GL_POST_COLOR_MATRIX_BLUE_SCALE */ +/* GL_POST_COLOR_MATRIX_ALPHA_SCALE */ +/* GL_POST_COLOR_MATRIX_RED_BIAS */ +/* GL_POST_COLOR_MATRIX_GREEN_BIAS */ +/* GL_POST_COLOR_MATRIX_BLUE_BIAS */ +/* GL_POST_COLOR_MATRIX_ALPHA_BIAS */ + +/* PixelType */ +#define GL_BITMAP 0x1A00 +/* GL_BYTE */ +/* GL_UNSIGNED_BYTE */ +/* GL_SHORT */ +/* GL_UNSIGNED_SHORT */ +/* GL_INT */ +/* GL_UNSIGNED_INT */ +/* GL_FLOAT */ +/* GL_BGR */ +/* GL_BGRA */ +/* GL_UNSIGNED_BYTE_3_3_2 */ +/* GL_UNSIGNED_SHORT_4_4_4_4 */ +/* GL_UNSIGNED_SHORT_5_5_5_1 */ +/* GL_UNSIGNED_INT_8_8_8_8 */ +/* GL_UNSIGNED_INT_10_10_10_2 */ +/* GL_UNSIGNED_SHORT_5_6_5 */ +/* GL_UNSIGNED_BYTE_2_3_3_REV */ +/* GL_UNSIGNED_SHORT_5_6_5_REV */ +/* GL_UNSIGNED_SHORT_4_4_4_4_REV */ +/* GL_UNSIGNED_SHORT_1_5_5_5_REV */ +/* GL_UNSIGNED_INT_8_8_8_8_REV */ +/* GL_UNSIGNED_INT_2_10_10_10_REV */ + +/* PolygonMode */ +#define GL_POINT 0x1B00 +#define GL_LINE 0x1B01 +#define GL_FILL 0x1B02 + +/* ReadBufferMode */ +/* GL_FRONT_LEFT */ +/* GL_FRONT_RIGHT */ +/* GL_BACK_LEFT */ +/* GL_BACK_RIGHT */ +/* GL_FRONT */ +/* GL_BACK */ +/* GL_LEFT */ +/* GL_RIGHT */ +/* GL_AUX0 */ +/* GL_AUX1 */ +/* GL_AUX2 */ +/* GL_AUX3 */ + +/* RenderingMode */ +#define GL_RENDER 0x1C00 +#define GL_FEEDBACK 0x1C01 +#define GL_SELECT 0x1C02 + +/* SeparableTarget */ +/* GL_SEPARABLE_2D */ + +/* ShadingModel */ +#define GL_FLAT 0x1D00 +#define GL_SMOOTH 0x1D01 + +/* StencilFunction */ +/* GL_NEVER */ +/* GL_LESS */ +/* GL_EQUAL */ +/* GL_LEQUAL */ +/* GL_GREATER */ +/* GL_NOTEQUAL */ +/* GL_GEQUAL */ +/* GL_ALWAYS */ + +/* StencilOp */ +/* GL_ZERO */ +#define GL_KEEP 0x1E00 +#define GL_REPLACE 0x1E01 +#define GL_INCR 0x1E02 +#define GL_DECR 0x1E03 +/* GL_INVERT */ + +/* StringName */ +#define GL_VENDOR 0x1F00 +#define GL_RENDERER 0x1F01 +#define GL_VERSION 0x1F02 +#define GL_EXTENSIONS 0x1F03 + +/* TextureCoordName */ +#define GL_S 0x2000 +#define GL_T 0x2001 +#define GL_R 0x2002 +#define GL_Q 0x2003 + +/* TexCoordPointerType */ +/* GL_SHORT */ +/* GL_INT */ +/* GL_FLOAT */ +/* GL_DOUBLE */ + +/* TextureEnvMode */ +#define GL_MODULATE 0x2100 +#define GL_DECAL 0x2101 +/* GL_BLEND */ +/* GL_REPLACE */ + +/* TextureEnvParameter */ +#define GL_TEXTURE_ENV_MODE 0x2200 +#define GL_TEXTURE_ENV_COLOR 0x2201 + +/* TextureEnvTarget */ +#define GL_TEXTURE_ENV 0x2300 + +/* TextureGenMode */ +#define GL_EYE_LINEAR 0x2400 +#define GL_OBJECT_LINEAR 0x2401 +#define GL_SPHERE_MAP 0x2402 + +/* TextureGenParameter */ +#define GL_TEXTURE_GEN_MODE 0x2500 +#define GL_OBJECT_PLANE 0x2501 +#define GL_EYE_PLANE 0x2502 + +/* TextureMagFilter */ +#define GL_NEAREST 0x2600 +#define GL_LINEAR 0x2601 + +/* TextureMinFilter */ +/* GL_NEAREST */ +/* GL_LINEAR */ +#define GL_NEAREST_MIPMAP_NEAREST 0x2700 +#define GL_LINEAR_MIPMAP_NEAREST 0x2701 +#define GL_NEAREST_MIPMAP_LINEAR 0x2702 +#define GL_LINEAR_MIPMAP_LINEAR 0x2703 + +/* TextureParameterName */ +#define GL_TEXTURE_MAG_FILTER 0x2800 +#define GL_TEXTURE_MIN_FILTER 0x2801 +#define GL_TEXTURE_WRAP_S 0x2802 +#define GL_TEXTURE_WRAP_T 0x2803 +/* GL_TEXTURE_BORDER_COLOR */ +/* GL_TEXTURE_PRIORITY */ +/* GL_TEXTURE_WRAP_R */ +/* GL_TEXTURE_MIN_LOD */ +/* GL_TEXTURE_MAX_LOD */ +/* GL_TEXTURE_BASE_LEVEL */ +/* GL_TEXTURE_MAX_LEVEL */ + +/* TextureTarget */ +/* GL_TEXTURE_1D */ +/* GL_TEXTURE_2D */ +/* GL_PROXY_TEXTURE_1D */ +/* GL_PROXY_TEXTURE_2D */ +/* GL_TEXTURE_3D */ +/* GL_PROXY_TEXTURE_3D */ + +/* TextureUnit */ +/* GL_TEXTURE0_ARB */ +/* GL_TEXTURE1_ARB */ +/* GL_TEXTURE2_ARB */ +/* GL_TEXTURE3_ARB */ +/* GL_TEXTURE4_ARB */ +/* GL_TEXTURE5_ARB */ +/* GL_TEXTURE6_ARB */ +/* GL_TEXTURE7_ARB */ +/* GL_TEXTURE8_ARB */ +/* GL_TEXTURE9_ARB */ +/* GL_TEXTURE10_ARB */ +/* GL_TEXTURE11_ARB */ +/* GL_TEXTURE12_ARB */ +/* GL_TEXTURE13_ARB */ +/* GL_TEXTURE14_ARB */ +/* GL_TEXTURE15_ARB */ +/* GL_TEXTURE16_ARB */ +/* GL_TEXTURE17_ARB */ +/* GL_TEXTURE18_ARB */ +/* GL_TEXTURE19_ARB */ +/* GL_TEXTURE20_ARB */ +/* GL_TEXTURE21_ARB */ +/* GL_TEXTURE22_ARB */ +/* GL_TEXTURE23_ARB */ +/* GL_TEXTURE24_ARB */ +/* GL_TEXTURE25_ARB */ +/* GL_TEXTURE26_ARB */ +/* GL_TEXTURE27_ARB */ +/* GL_TEXTURE28_ARB */ +/* GL_TEXTURE29_ARB */ +/* GL_TEXTURE30_ARB */ +/* GL_TEXTURE31_ARB */ + +/* TextureWrapMode */ +#define GL_CLAMP 0x2900 +#define GL_REPEAT 0x2901 +/* GL_CLAMP_TO_EDGE */ + +/* VertexPointerType */ +/* GL_SHORT */ +/* GL_INT */ +/* GL_FLOAT */ +/* GL_DOUBLE */ + +/* ClientAttribMask */ +#define GL_CLIENT_PIXEL_STORE_BIT 0x00000001 +#define GL_CLIENT_VERTEX_ARRAY_BIT 0x00000002 +#define GL_CLIENT_ALL_ATTRIB_BITS 0xffffffff + +/* polygon_offset */ +#define GL_POLYGON_OFFSET_FACTOR 0x8038 +#define GL_POLYGON_OFFSET_UNITS 0x2A00 +#define GL_POLYGON_OFFSET_POINT 0x2A01 +#define GL_POLYGON_OFFSET_LINE 0x2A02 +#define GL_POLYGON_OFFSET_FILL 0x8037 + +/* texture */ +#define GL_ALPHA4 0x803B +#define GL_ALPHA8 0x803C +#define GL_ALPHA12 0x803D +#define GL_ALPHA16 0x803E +#define GL_LUMINANCE4 0x803F +#define GL_LUMINANCE8 0x8040 +#define GL_LUMINANCE12 0x8041 +#define GL_LUMINANCE16 0x8042 +#define GL_LUMINANCE4_ALPHA4 0x8043 +#define GL_LUMINANCE6_ALPHA2 0x8044 +#define GL_LUMINANCE8_ALPHA8 0x8045 +#define GL_LUMINANCE12_ALPHA4 0x8046 +#define GL_LUMINANCE12_ALPHA12 0x8047 +#define GL_LUMINANCE16_ALPHA16 0x8048 +#define GL_INTENSITY 0x8049 +#define GL_INTENSITY4 0x804A +#define GL_INTENSITY8 0x804B +#define GL_INTENSITY12 0x804C +#define GL_INTENSITY16 0x804D +#define GL_R3_G3_B2 0x2A10 +#define GL_RGB4 0x804F +#define GL_RGB5 0x8050 +#define GL_RGB8 0x8051 +#define GL_RGB10 0x8052 +#define GL_RGB12 0x8053 +#define GL_RGB16 0x8054 +#define GL_RGBA2 0x8055 +#define GL_RGBA4 0x8056 +#define GL_RGB5_A1 0x8057 +#define GL_RGBA8 0x8058 +#define GL_RGB10_A2 0x8059 +#define GL_RGBA12 0x805A +#define GL_RGBA16 0x805B +#define GL_TEXTURE_RED_SIZE 0x805C +#define GL_TEXTURE_GREEN_SIZE 0x805D +#define GL_TEXTURE_BLUE_SIZE 0x805E +#define GL_TEXTURE_ALPHA_SIZE 0x805F +#define GL_TEXTURE_LUMINANCE_SIZE 0x8060 +#define GL_TEXTURE_INTENSITY_SIZE 0x8061 +#define GL_PROXY_TEXTURE_1D 0x8063 +#define GL_PROXY_TEXTURE_2D 0x8064 + +/* texture_object */ +#define GL_TEXTURE_PRIORITY 0x8066 +#define GL_TEXTURE_RESIDENT 0x8067 +#define GL_TEXTURE_BINDING_1D 0x8068 +#define GL_TEXTURE_BINDING_2D 0x8069 +#define GL_TEXTURE_BINDING_3D 0x806A + +/* vertex_array */ +#define GL_VERTEX_ARRAY 0x8074 +#define GL_NORMAL_ARRAY 0x8075 +#define GL_COLOR_ARRAY 0x8076 +#define GL_INDEX_ARRAY 0x8077 +#define GL_TEXTURE_COORD_ARRAY 0x8078 +#define GL_EDGE_FLAG_ARRAY 0x8079 +#define GL_VERTEX_ARRAY_SIZE 0x807A +#define GL_VERTEX_ARRAY_TYPE 0x807B +#define GL_VERTEX_ARRAY_STRIDE 0x807C +#define GL_NORMAL_ARRAY_TYPE 0x807E +#define GL_NORMAL_ARRAY_STRIDE 0x807F +#define GL_COLOR_ARRAY_SIZE 0x8081 +#define GL_COLOR_ARRAY_TYPE 0x8082 +#define GL_COLOR_ARRAY_STRIDE 0x8083 +#define GL_INDEX_ARRAY_TYPE 0x8085 +#define GL_INDEX_ARRAY_STRIDE 0x8086 +#define GL_TEXTURE_COORD_ARRAY_SIZE 0x8088 +#define GL_TEXTURE_COORD_ARRAY_TYPE 0x8089 +#define GL_TEXTURE_COORD_ARRAY_STRIDE 0x808A +#define GL_EDGE_FLAG_ARRAY_STRIDE 0x808C +#define GL_VERTEX_ARRAY_POINTER 0x808E +#define GL_NORMAL_ARRAY_POINTER 0x808F +#define GL_COLOR_ARRAY_POINTER 0x8090 +#define GL_INDEX_ARRAY_POINTER 0x8091 +#define GL_TEXTURE_COORD_ARRAY_POINTER 0x8092 +#define GL_EDGE_FLAG_ARRAY_POINTER 0x8093 +#define GL_V2F 0x2A20 +#define GL_V3F 0x2A21 +#define GL_C4UB_V2F 0x2A22 +#define GL_C4UB_V3F 0x2A23 +#define GL_C3F_V3F 0x2A24 +#define GL_N3F_V3F 0x2A25 +#define GL_C4F_N3F_V3F 0x2A26 +#define GL_T2F_V3F 0x2A27 +#define GL_T4F_V4F 0x2A28 +#define GL_T2F_C4UB_V3F 0x2A29 +#define GL_T2F_C3F_V3F 0x2A2A +#define GL_T2F_N3F_V3F 0x2A2B +#define GL_T2F_C4F_N3F_V3F 0x2A2C +#define GL_T4F_C4F_N3F_V4F 0x2A2D + +/* bgra */ +#define GL_BGR 0x80E0 +#define GL_BGRA 0x80E1 + +/* blend_color */ +#define GL_CONSTANT_COLOR 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 +#define GL_CONSTANT_ALPHA 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 +#define GL_BLEND_COLOR 0x8005 + +/* blend_minmax */ +#define GL_FUNC_ADD 0x8006 +#define GL_MIN 0x8007 +#define GL_MAX 0x8008 +#define GL_BLEND_EQUATION 0x8009 + +/* blend_subtract */ +#define GL_FUNC_SUBTRACT 0x800A +#define GL_FUNC_REVERSE_SUBTRACT 0x800B + +/* color_matrix */ +#define GL_COLOR_MATRIX 0x80B1 +#define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2 +#define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3 +#define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4 +#define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5 +#define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6 +#define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7 +#define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8 +#define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9 +#define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA +#define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB + +/* color_table */ +#define GL_COLOR_TABLE 0x80D0 +#define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1 +#define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2 +#define GL_PROXY_COLOR_TABLE 0x80D3 +#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4 +#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5 +#define GL_COLOR_TABLE_SCALE 0x80D6 +#define GL_COLOR_TABLE_BIAS 0x80D7 +#define GL_COLOR_TABLE_FORMAT 0x80D8 +#define GL_COLOR_TABLE_WIDTH 0x80D9 +#define GL_COLOR_TABLE_RED_SIZE 0x80DA +#define GL_COLOR_TABLE_GREEN_SIZE 0x80DB +#define GL_COLOR_TABLE_BLUE_SIZE 0x80DC +#define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD +#define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE +#define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF + +/* convolution */ +#define GL_CONVOLUTION_1D 0x8010 +#define GL_CONVOLUTION_2D 0x8011 +#define GL_SEPARABLE_2D 0x8012 +#define GL_CONVOLUTION_BORDER_MODE 0x8013 +#define GL_CONVOLUTION_FILTER_SCALE 0x8014 +#define GL_CONVOLUTION_FILTER_BIAS 0x8015 +#define GL_REDUCE 0x8016 +#define GL_CONVOLUTION_FORMAT 0x8017 +#define GL_CONVOLUTION_WIDTH 0x8018 +#define GL_CONVOLUTION_HEIGHT 0x8019 +#define GL_MAX_CONVOLUTION_WIDTH 0x801A +#define GL_MAX_CONVOLUTION_HEIGHT 0x801B +#define GL_POST_CONVOLUTION_RED_SCALE 0x801C +#define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D +#define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E +#define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F +#define GL_POST_CONVOLUTION_RED_BIAS 0x8020 +#define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021 +#define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022 +#define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023 +#define GL_CONSTANT_BORDER 0x8151 +#define GL_REPLICATE_BORDER 0x8153 +#define GL_CONVOLUTION_BORDER_COLOR 0x8154 + +/* draw_range_elements */ +#define GL_MAX_ELEMENTS_VERTICES 0x80E8 +#define GL_MAX_ELEMENTS_INDICES 0x80E9 + +/* histogram */ +#define GL_HISTOGRAM 0x8024 +#define GL_PROXY_HISTOGRAM 0x8025 +#define GL_HISTOGRAM_WIDTH 0x8026 +#define GL_HISTOGRAM_FORMAT 0x8027 +#define GL_HISTOGRAM_RED_SIZE 0x8028 +#define GL_HISTOGRAM_GREEN_SIZE 0x8029 +#define GL_HISTOGRAM_BLUE_SIZE 0x802A +#define GL_HISTOGRAM_ALPHA_SIZE 0x802B +#define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C +#define GL_HISTOGRAM_SINK 0x802D +#define GL_MINMAX 0x802E +#define GL_MINMAX_FORMAT 0x802F +#define GL_MINMAX_SINK 0x8030 +#define GL_TABLE_TOO_LARGE 0x8031 + +/* packed_pixels */ +#define GL_UNSIGNED_BYTE_3_3_2 0x8032 +#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 +#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 +#define GL_UNSIGNED_INT_8_8_8_8 0x8035 +#define GL_UNSIGNED_INT_10_10_10_2 0x8036 +#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 +#define GL_UNSIGNED_SHORT_5_6_5 0x8363 +#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 +#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 +#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 +#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 +#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 + +/* rescale_normal */ +#define GL_RESCALE_NORMAL 0x803A + +/* separate_specular_color */ +#define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8 +#define GL_SINGLE_COLOR 0x81F9 +#define GL_SEPARATE_SPECULAR_COLOR 0x81FA + +/* texture3D */ +#define GL_PACK_SKIP_IMAGES 0x806B +#define GL_PACK_IMAGE_HEIGHT 0x806C +#define GL_UNPACK_SKIP_IMAGES 0x806D +#define GL_UNPACK_IMAGE_HEIGHT 0x806E +#define GL_TEXTURE_3D 0x806F +#define GL_PROXY_TEXTURE_3D 0x8070 +#define GL_TEXTURE_DEPTH 0x8071 +#define GL_TEXTURE_WRAP_R 0x8072 +#define GL_MAX_3D_TEXTURE_SIZE 0x8073 + +/* texture_edge_clamp */ +#define GL_CLAMP_TO_EDGE 0x812F + +/* texture_lod */ +#define GL_TEXTURE_MIN_LOD 0x813A +#define GL_TEXTURE_MAX_LOD 0x813B +#define GL_TEXTURE_BASE_LEVEL 0x813C +#define GL_TEXTURE_MAX_LEVEL 0x813D + +/* GetTarget1_2 */ +#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 +#define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13 +#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 +#define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23 +#define GL_ALIASED_POINT_SIZE_RANGE 0x846D +#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E + +/* multitexture */ +#define GL_TEXTURE0_ARB 0x84C0 +#define GL_TEXTURE1_ARB 0x84C1 +#define GL_TEXTURE2_ARB 0x84C2 +#define GL_TEXTURE3_ARB 0x84C3 +#define GL_TEXTURE4_ARB 0x84C4 +#define GL_TEXTURE5_ARB 0x84C5 +#define GL_TEXTURE6_ARB 0x84C6 +#define GL_TEXTURE7_ARB 0x84C7 +#define GL_TEXTURE8_ARB 0x84C8 +#define GL_TEXTURE9_ARB 0x84C9 +#define GL_TEXTURE10_ARB 0x84CA +#define GL_TEXTURE11_ARB 0x84CB +#define GL_TEXTURE12_ARB 0x84CC +#define GL_TEXTURE13_ARB 0x84CD +#define GL_TEXTURE14_ARB 0x84CE +#define GL_TEXTURE15_ARB 0x84CF +#define GL_TEXTURE16_ARB 0x84D0 +#define GL_TEXTURE17_ARB 0x84D1 +#define GL_TEXTURE18_ARB 0x84D2 +#define GL_TEXTURE19_ARB 0x84D3 +#define GL_TEXTURE20_ARB 0x84D4 +#define GL_TEXTURE21_ARB 0x84D5 +#define GL_TEXTURE22_ARB 0x84D6 +#define GL_TEXTURE23_ARB 0x84D7 +#define GL_TEXTURE24_ARB 0x84D8 +#define GL_TEXTURE25_ARB 0x84D9 +#define GL_TEXTURE26_ARB 0x84DA +#define GL_TEXTURE27_ARB 0x84DB +#define GL_TEXTURE28_ARB 0x84DC +#define GL_TEXTURE29_ARB 0x84DD +#define GL_TEXTURE30_ARB 0x84DE +#define GL_TEXTURE31_ARB 0x84DF +#define GL_ACTIVE_TEXTURE_ARB 0x84E0 +#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 +#define GL_MAX_TEXTURE_UNITS_ARB 0x84E2 + +/* Extensions */ +#define GL_EXT_abgr 1 +#define GL_EXT_blend_color 1 +#define GL_EXT_blend_minmax 1 +#define GL_EXT_blend_subtract 1 +#define GL_EXT_texture_env_combine 1 +#define GL_EXT_texture_env_add 1 + +/* EXT_abgr */ +#define GL_ABGR_EXT 0x8000 + +/* EXT_blend_color */ +#define GL_CONSTANT_COLOR_EXT 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR_EXT 0x8002 +#define GL_CONSTANT_ALPHA_EXT 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA_EXT 0x8004 +#define GL_BLEND_COLOR_EXT 0x8005 + +/* EXT_blend_minmax */ +#define GL_FUNC_ADD_EXT 0x8006 +#define GL_MIN_EXT 0x8007 +#define GL_MAX_EXT 0x8008 +#define GL_BLEND_EQUATION_EXT 0x8009 + +/* EXT_blend_subtract */ +#define GL_FUNC_SUBTRACT_EXT 0x800A +#define GL_FUNC_REVERSE_SUBTRACT_EXT 0x800B + +/* EXT_texture_env_combine */ +#define GL_COMBINE_EXT 0x8570 +#define GL_COMBINE_RGB_EXT 0x8571 +#define GL_COMBINE_ALPHA_EXT 0x8572 +#define GL_RGB_SCALE_EXT 0x8573 +#define GL_ADD_SIGNED_EXT 0x8574 +#define GL_INTERPOLATE_EXT 0x8575 +#define GL_CONSTANT_EXT 0x8576 +#define GL_PRIMARY_COLOR_EXT 0x8577 +#define GL_PREVIOUS_EXT 0x8578 +#define GL_SOURCE0_RGB_EXT 0x8580 +#define GL_SOURCE1_RGB_EXT 0x8581 +#define GL_SOURCE2_RGB_EXT 0x8582 +#define GL_SOURCE0_ALPHA_EXT 0x8588 +#define GL_SOURCE1_ALPHA_EXT 0x8589 +#define GL_SOURCE2_ALPHA_EXT 0x858A +#define GL_OPERAND0_RGB_EXT 0x8590 +#define GL_OPERAND1_RGB_EXT 0x8591 +#define GL_OPERAND2_RGB_EXT 0x8592 +#define GL_OPERAND0_ALPHA_EXT 0x8598 +#define GL_OPERAND1_ALPHA_EXT 0x8599 +#define GL_OPERAND2_ALPHA_EXT 0x859A + +/* For compatibility with OpenGL v1.0 */ +#define GL_LOGIC_OP GL_INDEX_LOGIC_OP +#define GL_TEXTURE_COMPONENTS GL_TEXTURE_INTERNAL_FORMAT + +/*************************************************************/ + +WINGDIAPI void APIENTRY glAccum (GLenum op, GLfloat value); +WINGDIAPI void APIENTRY glAlphaFunc (GLenum func, GLclampf ref); +WINGDIAPI GLboolean APIENTRY glAreTexturesResident (GLsizei n, const GLuint *textures, GLboolean *residences); +WINGDIAPI void APIENTRY glArrayElement (GLint i); +WINGDIAPI void APIENTRY glBegin (GLenum mode); +WINGDIAPI void APIENTRY glBindTexture (GLenum target, GLuint texture); +WINGDIAPI void APIENTRY glBitmap (GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap); +WINGDIAPI void APIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor); +WINGDIAPI void APIENTRY glCallList (GLuint list); +WINGDIAPI void APIENTRY glCallLists (GLsizei n, GLenum type, const GLvoid *lists); +WINGDIAPI void APIENTRY glClear (GLbitfield mask); +WINGDIAPI void APIENTRY glClearAccum (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +WINGDIAPI void APIENTRY glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); +WINGDIAPI void APIENTRY glClearDepth (GLclampd depth); +WINGDIAPI void APIENTRY glClearIndex (GLfloat c); +WINGDIAPI void APIENTRY glClearStencil (GLint s); +WINGDIAPI void APIENTRY glClipPlane (GLenum plane, const GLdouble *equation); +WINGDIAPI void APIENTRY glColor3b (GLbyte red, GLbyte green, GLbyte blue); +WINGDIAPI void APIENTRY glColor3bv (const GLbyte *v); +WINGDIAPI void APIENTRY glColor3d (GLdouble red, GLdouble green, GLdouble blue); +WINGDIAPI void APIENTRY glColor3dv (const GLdouble *v); +WINGDIAPI void APIENTRY glColor3f (GLfloat red, GLfloat green, GLfloat blue); +WINGDIAPI void APIENTRY glColor3fv (const GLfloat *v); +WINGDIAPI void APIENTRY glColor3i (GLint red, GLint green, GLint blue); +WINGDIAPI void APIENTRY glColor3iv (const GLint *v); +WINGDIAPI void APIENTRY glColor3s (GLshort red, GLshort green, GLshort blue); +WINGDIAPI void APIENTRY glColor3sv (const GLshort *v); +WINGDIAPI void APIENTRY glColor3ub (GLubyte red, GLubyte green, GLubyte blue); +WINGDIAPI void APIENTRY glColor3ubv (const GLubyte *v); +WINGDIAPI void APIENTRY glColor3ui (GLuint red, GLuint green, GLuint blue); +WINGDIAPI void APIENTRY glColor3uiv (const GLuint *v); +WINGDIAPI void APIENTRY glColor3us (GLushort red, GLushort green, GLushort blue); +WINGDIAPI void APIENTRY glColor3usv (const GLushort *v); +WINGDIAPI void APIENTRY glColor4b (GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha); +WINGDIAPI void APIENTRY glColor4bv (const GLbyte *v); +WINGDIAPI void APIENTRY glColor4d (GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha); +WINGDIAPI void APIENTRY glColor4dv (const GLdouble *v); +WINGDIAPI void APIENTRY glColor4f (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +WINGDIAPI void APIENTRY glColor4fv (const GLfloat *v); +WINGDIAPI void APIENTRY glColor4i (GLint red, GLint green, GLint blue, GLint alpha); +WINGDIAPI void APIENTRY glColor4iv (const GLint *v); +WINGDIAPI void APIENTRY glColor4s (GLshort red, GLshort green, GLshort blue, GLshort alpha); +WINGDIAPI void APIENTRY glColor4sv (const GLshort *v); +WINGDIAPI void APIENTRY glColor4ub (GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha); +WINGDIAPI void APIENTRY glColor4ubv (const GLubyte *v); +WINGDIAPI void APIENTRY glColor4ui (GLuint red, GLuint green, GLuint blue, GLuint alpha); +WINGDIAPI void APIENTRY glColor4uiv (const GLuint *v); +WINGDIAPI void APIENTRY glColor4us (GLushort red, GLushort green, GLushort blue, GLushort alpha); +WINGDIAPI void APIENTRY glColor4usv (const GLushort *v); +WINGDIAPI void APIENTRY glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); +WINGDIAPI void APIENTRY glColorMaterial (GLenum face, GLenum mode); +WINGDIAPI void APIENTRY glColorPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +WINGDIAPI void APIENTRY glCopyPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum type); +WINGDIAPI void APIENTRY glCopyTexImage1D (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +WINGDIAPI void APIENTRY glCopyTexImage2D (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +WINGDIAPI void APIENTRY glCopyTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +WINGDIAPI void APIENTRY glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +WINGDIAPI void APIENTRY glCullFace (GLenum mode); +WINGDIAPI void APIENTRY glDeleteLists (GLuint list, GLsizei range); +WINGDIAPI void APIENTRY glDeleteTextures (GLsizei n, const GLuint *textures); +WINGDIAPI void APIENTRY glDepthFunc (GLenum func); +WINGDIAPI void APIENTRY glDepthMask (GLboolean flag); +WINGDIAPI void APIENTRY glDepthRange (GLclampd zNear, GLclampd zFar); +WINGDIAPI void APIENTRY glDisable (GLenum cap); +WINGDIAPI void APIENTRY glDisableClientState (GLenum array); +WINGDIAPI void APIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count); +WINGDIAPI void APIENTRY glDrawBuffer (GLenum mode); +WINGDIAPI void APIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices); +WINGDIAPI void APIENTRY glDrawPixels (GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); +WINGDIAPI void APIENTRY glEdgeFlag (GLboolean flag); +WINGDIAPI void APIENTRY glEdgeFlagPointer (GLsizei stride, const GLboolean *pointer); +WINGDIAPI void APIENTRY glEdgeFlagv (const GLboolean *flag); +WINGDIAPI void APIENTRY glEnable (GLenum cap); +WINGDIAPI void APIENTRY glEnableClientState (GLenum array); +WINGDIAPI void APIENTRY glEnd (void); +WINGDIAPI void APIENTRY glEndList (void); +WINGDIAPI void APIENTRY glEvalCoord1d (GLdouble u); +WINGDIAPI void APIENTRY glEvalCoord1dv (const GLdouble *u); +WINGDIAPI void APIENTRY glEvalCoord1f (GLfloat u); +WINGDIAPI void APIENTRY glEvalCoord1fv (const GLfloat *u); +WINGDIAPI void APIENTRY glEvalCoord2d (GLdouble u, GLdouble v); +WINGDIAPI void APIENTRY glEvalCoord2dv (const GLdouble *u); +WINGDIAPI void APIENTRY glEvalCoord2f (GLfloat u, GLfloat v); +WINGDIAPI void APIENTRY glEvalCoord2fv (const GLfloat *u); +WINGDIAPI void APIENTRY glEvalMesh1 (GLenum mode, GLint i1, GLint i2); +WINGDIAPI void APIENTRY glEvalMesh2 (GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2); +WINGDIAPI void APIENTRY glEvalPoint1 (GLint i); +WINGDIAPI void APIENTRY glEvalPoint2 (GLint i, GLint j); +WINGDIAPI void APIENTRY glFeedbackBuffer (GLsizei size, GLenum type, GLfloat *buffer); +WINGDIAPI void APIENTRY glFinish (void); +WINGDIAPI void APIENTRY glFlush (void); +WINGDIAPI void APIENTRY glFogf (GLenum pname, GLfloat param); +WINGDIAPI void APIENTRY glFogfv (GLenum pname, const GLfloat *params); +WINGDIAPI void APIENTRY glFogi (GLenum pname, GLint param); +WINGDIAPI void APIENTRY glFogiv (GLenum pname, const GLint *params); +WINGDIAPI void APIENTRY glFrontFace (GLenum mode); +WINGDIAPI void APIENTRY glFrustum (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +WINGDIAPI GLuint APIENTRY glGenLists (GLsizei range); +WINGDIAPI void APIENTRY glGenTextures (GLsizei n, GLuint *textures); +WINGDIAPI void APIENTRY glGetBooleanv (GLenum pname, GLboolean *params); +WINGDIAPI void APIENTRY glGetClipPlane (GLenum plane, GLdouble *equation); +WINGDIAPI void APIENTRY glGetDoublev (GLenum pname, GLdouble *params); +WINGDIAPI GLenum APIENTRY glGetError (void); +WINGDIAPI void APIENTRY glGetFloatv (GLenum pname, GLfloat *params); +WINGDIAPI void APIENTRY glGetIntegerv (GLenum pname, GLint *params); +WINGDIAPI void APIENTRY glGetLightfv (GLenum light, GLenum pname, GLfloat *params); +WINGDIAPI void APIENTRY glGetLightiv (GLenum light, GLenum pname, GLint *params); +WINGDIAPI void APIENTRY glGetMapdv (GLenum target, GLenum query, GLdouble *v); +WINGDIAPI void APIENTRY glGetMapfv (GLenum target, GLenum query, GLfloat *v); +WINGDIAPI void APIENTRY glGetMapiv (GLenum target, GLenum query, GLint *v); +WINGDIAPI void APIENTRY glGetMaterialfv (GLenum face, GLenum pname, GLfloat *params); +WINGDIAPI void APIENTRY glGetMaterialiv (GLenum face, GLenum pname, GLint *params); +WINGDIAPI void APIENTRY glGetPixelMapfv (GLenum map, GLfloat *values); +WINGDIAPI void APIENTRY glGetPixelMapuiv (GLenum map, GLuint *values); +WINGDIAPI void APIENTRY glGetPixelMapusv (GLenum map, GLushort *values); +WINGDIAPI void APIENTRY glGetPointerv (GLenum pname, GLvoid* *params); +WINGDIAPI void APIENTRY glGetPolygonStipple (GLubyte *mask); +WINGDIAPI const GLubyte * APIENTRY glGetString (GLenum name); +WINGDIAPI void APIENTRY glGetTexEnvfv (GLenum target, GLenum pname, GLfloat *params); +WINGDIAPI void APIENTRY glGetTexEnviv (GLenum target, GLenum pname, GLint *params); +WINGDIAPI void APIENTRY glGetTexGendv (GLenum coord, GLenum pname, GLdouble *params); +WINGDIAPI void APIENTRY glGetTexGenfv (GLenum coord, GLenum pname, GLfloat *params); +WINGDIAPI void APIENTRY glGetTexGeniv (GLenum coord, GLenum pname, GLint *params); +WINGDIAPI void APIENTRY glGetTexImage (GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels); +WINGDIAPI void APIENTRY glGetTexLevelParameterfv (GLenum target, GLint level, GLenum pname, GLfloat *params); +WINGDIAPI void APIENTRY glGetTexLevelParameteriv (GLenum target, GLint level, GLenum pname, GLint *params); +WINGDIAPI void APIENTRY glGetTexParameterfv (GLenum target, GLenum pname, GLfloat *params); +WINGDIAPI void APIENTRY glGetTexParameteriv (GLenum target, GLenum pname, GLint *params); +WINGDIAPI void APIENTRY glHint (GLenum target, GLenum mode); +WINGDIAPI void APIENTRY glIndexMask (GLuint mask); +WINGDIAPI void APIENTRY glIndexPointer (GLenum type, GLsizei stride, const GLvoid *pointer); +WINGDIAPI void APIENTRY glIndexd (GLdouble c); +WINGDIAPI void APIENTRY glIndexdv (const GLdouble *c); +WINGDIAPI void APIENTRY glIndexf (GLfloat c); +WINGDIAPI void APIENTRY glIndexfv (const GLfloat *c); +WINGDIAPI void APIENTRY glIndexi (GLint c); +WINGDIAPI void APIENTRY glIndexiv (const GLint *c); +WINGDIAPI void APIENTRY glIndexs (GLshort c); +WINGDIAPI void APIENTRY glIndexsv (const GLshort *c); +WINGDIAPI void APIENTRY glIndexub (GLubyte c); +WINGDIAPI void APIENTRY glIndexubv (const GLubyte *c); +WINGDIAPI void APIENTRY glInitNames (void); +WINGDIAPI void APIENTRY glInterleavedArrays (GLenum format, GLsizei stride, const GLvoid *pointer); +WINGDIAPI GLboolean APIENTRY glIsEnabled (GLenum cap); +WINGDIAPI GLboolean APIENTRY glIsList (GLuint list); +WINGDIAPI GLboolean APIENTRY glIsTexture (GLuint texture); +WINGDIAPI void APIENTRY glLightModelf (GLenum pname, GLfloat param); +WINGDIAPI void APIENTRY glLightModelfv (GLenum pname, const GLfloat *params); +WINGDIAPI void APIENTRY glLightModeli (GLenum pname, GLint param); +WINGDIAPI void APIENTRY glLightModeliv (GLenum pname, const GLint *params); +WINGDIAPI void APIENTRY glLightf (GLenum light, GLenum pname, GLfloat param); +WINGDIAPI void APIENTRY glLightfv (GLenum light, GLenum pname, const GLfloat *params); +WINGDIAPI void APIENTRY glLighti (GLenum light, GLenum pname, GLint param); +WINGDIAPI void APIENTRY glLightiv (GLenum light, GLenum pname, const GLint *params); +WINGDIAPI void APIENTRY glLineStipple (GLint factor, GLushort pattern); +WINGDIAPI void APIENTRY glLineWidth (GLfloat width); +WINGDIAPI void APIENTRY glListBase (GLuint base); +WINGDIAPI void APIENTRY glLoadIdentity (void); +WINGDIAPI void APIENTRY glLoadMatrixd (const GLdouble *m); +WINGDIAPI void APIENTRY glLoadMatrixf (const GLfloat *m); +WINGDIAPI void APIENTRY glLoadName (GLuint name); +WINGDIAPI void APIENTRY glLogicOp (GLenum opcode); +WINGDIAPI void APIENTRY glMap1d (GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points); +WINGDIAPI void APIENTRY glMap1f (GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points); +WINGDIAPI void APIENTRY glMap2d (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points); +WINGDIAPI void APIENTRY glMap2f (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points); +WINGDIAPI void APIENTRY glMapGrid1d (GLint un, GLdouble u1, GLdouble u2); +WINGDIAPI void APIENTRY glMapGrid1f (GLint un, GLfloat u1, GLfloat u2); +WINGDIAPI void APIENTRY glMapGrid2d (GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2); +WINGDIAPI void APIENTRY glMapGrid2f (GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2); +WINGDIAPI void APIENTRY glMaterialf (GLenum face, GLenum pname, GLfloat param); +WINGDIAPI void APIENTRY glMaterialfv (GLenum face, GLenum pname, const GLfloat *params); +WINGDIAPI void APIENTRY glMateriali (GLenum face, GLenum pname, GLint param); +WINGDIAPI void APIENTRY glMaterialiv (GLenum face, GLenum pname, const GLint *params); +WINGDIAPI void APIENTRY glMatrixMode (GLenum mode); +WINGDIAPI void APIENTRY glMultMatrixd (const GLdouble *m); +WINGDIAPI void APIENTRY glMultMatrixf (const GLfloat *m); +WINGDIAPI void APIENTRY glNewList (GLuint list, GLenum mode); +WINGDIAPI void APIENTRY glNormal3b (GLbyte nx, GLbyte ny, GLbyte nz); +WINGDIAPI void APIENTRY glNormal3bv (const GLbyte *v); +WINGDIAPI void APIENTRY glNormal3d (GLdouble nx, GLdouble ny, GLdouble nz); +WINGDIAPI void APIENTRY glNormal3dv (const GLdouble *v); +WINGDIAPI void APIENTRY glNormal3f (GLfloat nx, GLfloat ny, GLfloat nz); +WINGDIAPI void APIENTRY glNormal3fv (const GLfloat *v); +WINGDIAPI void APIENTRY glNormal3i (GLint nx, GLint ny, GLint nz); +WINGDIAPI void APIENTRY glNormal3iv (const GLint *v); +WINGDIAPI void APIENTRY glNormal3s (GLshort nx, GLshort ny, GLshort nz); +WINGDIAPI void APIENTRY glNormal3sv (const GLshort *v); +WINGDIAPI void APIENTRY glNormalPointer (GLenum type, GLsizei stride, const GLvoid *pointer); +WINGDIAPI void APIENTRY glOrtho (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +WINGDIAPI void APIENTRY glPassThrough (GLfloat token); +WINGDIAPI void APIENTRY glPixelMapfv (GLenum map, GLint mapsize, const GLfloat *values); +WINGDIAPI void APIENTRY glPixelMapuiv (GLenum map, GLint mapsize, const GLuint *values); +WINGDIAPI void APIENTRY glPixelMapusv (GLenum map, GLint mapsize, const GLushort *values); +WINGDIAPI void APIENTRY glPixelStoref (GLenum pname, GLfloat param); +WINGDIAPI void APIENTRY glPixelStorei (GLenum pname, GLint param); +WINGDIAPI void APIENTRY glPixelTransferf (GLenum pname, GLfloat param); +WINGDIAPI void APIENTRY glPixelTransferi (GLenum pname, GLint param); +WINGDIAPI void APIENTRY glPixelZoom (GLfloat xfactor, GLfloat yfactor); +WINGDIAPI void APIENTRY glPointSize (GLfloat size); +WINGDIAPI void APIENTRY glPolygonMode (GLenum face, GLenum mode); +WINGDIAPI void APIENTRY glPolygonOffset (GLfloat factor, GLfloat units); +WINGDIAPI void APIENTRY glPolygonStipple (const GLubyte *mask); +WINGDIAPI void APIENTRY glPopAttrib (void); +WINGDIAPI void APIENTRY glPopClientAttrib (void); +WINGDIAPI void APIENTRY glPopMatrix (void); +WINGDIAPI void APIENTRY glPopName (void); +WINGDIAPI void APIENTRY glPrioritizeTextures (GLsizei n, const GLuint *textures, const GLclampf *priorities); +WINGDIAPI void APIENTRY glPushAttrib (GLbitfield mask); +WINGDIAPI void APIENTRY glPushClientAttrib (GLbitfield mask); +WINGDIAPI void APIENTRY glPushMatrix (void); +WINGDIAPI void APIENTRY glPushName (GLuint name); +WINGDIAPI void APIENTRY glRasterPos2d (GLdouble x, GLdouble y); +WINGDIAPI void APIENTRY glRasterPos2dv (const GLdouble *v); +WINGDIAPI void APIENTRY glRasterPos2f (GLfloat x, GLfloat y); +WINGDIAPI void APIENTRY glRasterPos2fv (const GLfloat *v); +WINGDIAPI void APIENTRY glRasterPos2i (GLint x, GLint y); +WINGDIAPI void APIENTRY glRasterPos2iv (const GLint *v); +WINGDIAPI void APIENTRY glRasterPos2s (GLshort x, GLshort y); +WINGDIAPI void APIENTRY glRasterPos2sv (const GLshort *v); +WINGDIAPI void APIENTRY glRasterPos3d (GLdouble x, GLdouble y, GLdouble z); +WINGDIAPI void APIENTRY glRasterPos3dv (const GLdouble *v); +WINGDIAPI void APIENTRY glRasterPos3f (GLfloat x, GLfloat y, GLfloat z); +WINGDIAPI void APIENTRY glRasterPos3fv (const GLfloat *v); +WINGDIAPI void APIENTRY glRasterPos3i (GLint x, GLint y, GLint z); +WINGDIAPI void APIENTRY glRasterPos3iv (const GLint *v); +WINGDIAPI void APIENTRY glRasterPos3s (GLshort x, GLshort y, GLshort z); +WINGDIAPI void APIENTRY glRasterPos3sv (const GLshort *v); +WINGDIAPI void APIENTRY glRasterPos4d (GLdouble x, GLdouble y, GLdouble z, GLdouble w); +WINGDIAPI void APIENTRY glRasterPos4dv (const GLdouble *v); +WINGDIAPI void APIENTRY glRasterPos4f (GLfloat x, GLfloat y, GLfloat z, GLfloat w); +WINGDIAPI void APIENTRY glRasterPos4fv (const GLfloat *v); +WINGDIAPI void APIENTRY glRasterPos4i (GLint x, GLint y, GLint z, GLint w); +WINGDIAPI void APIENTRY glRasterPos4iv (const GLint *v); +WINGDIAPI void APIENTRY glRasterPos4s (GLshort x, GLshort y, GLshort z, GLshort w); +WINGDIAPI void APIENTRY glRasterPos4sv (const GLshort *v); +WINGDIAPI void APIENTRY glReadBuffer (GLenum mode); +WINGDIAPI void APIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels); +WINGDIAPI void APIENTRY glRectd (GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2); +WINGDIAPI void APIENTRY glRectdv (const GLdouble *v1, const GLdouble *v2); +WINGDIAPI void APIENTRY glRectf (GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2); +WINGDIAPI void APIENTRY glRectfv (const GLfloat *v1, const GLfloat *v2); +WINGDIAPI void APIENTRY glRecti (GLint x1, GLint y1, GLint x2, GLint y2); +WINGDIAPI void APIENTRY glRectiv (const GLint *v1, const GLint *v2); +WINGDIAPI void APIENTRY glRects (GLshort x1, GLshort y1, GLshort x2, GLshort y2); +WINGDIAPI void APIENTRY glRectsv (const GLshort *v1, const GLshort *v2); +WINGDIAPI GLint APIENTRY glRenderMode (GLenum mode); +WINGDIAPI void APIENTRY glRotated (GLdouble angle, GLdouble x, GLdouble y, GLdouble z); +WINGDIAPI void APIENTRY glRotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z); +WINGDIAPI void APIENTRY glScaled (GLdouble x, GLdouble y, GLdouble z); +WINGDIAPI void APIENTRY glScalef (GLfloat x, GLfloat y, GLfloat z); +WINGDIAPI void APIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height); +WINGDIAPI void APIENTRY glSelectBuffer (GLsizei size, GLuint *buffer); +WINGDIAPI void APIENTRY glShadeModel (GLenum mode); +WINGDIAPI void APIENTRY glStencilFunc (GLenum func, GLint ref, GLuint mask); +WINGDIAPI void APIENTRY glStencilMask (GLuint mask); +WINGDIAPI void APIENTRY glStencilOp (GLenum fail, GLenum zfail, GLenum zpass); +WINGDIAPI void APIENTRY glTexCoord1d (GLdouble s); +WINGDIAPI void APIENTRY glTexCoord1dv (const GLdouble *v); +WINGDIAPI void APIENTRY glTexCoord1f (GLfloat s); +WINGDIAPI void APIENTRY glTexCoord1fv (const GLfloat *v); +WINGDIAPI void APIENTRY glTexCoord1i (GLint s); +WINGDIAPI void APIENTRY glTexCoord1iv (const GLint *v); +WINGDIAPI void APIENTRY glTexCoord1s (GLshort s); +WINGDIAPI void APIENTRY glTexCoord1sv (const GLshort *v); +WINGDIAPI void APIENTRY glTexCoord2d (GLdouble s, GLdouble t); +WINGDIAPI void APIENTRY glTexCoord2dv (const GLdouble *v); +WINGDIAPI void APIENTRY glTexCoord2f (GLfloat s, GLfloat t); +WINGDIAPI void APIENTRY glTexCoord2fv (const GLfloat *v); +WINGDIAPI void APIENTRY glTexCoord2i (GLint s, GLint t); +WINGDIAPI void APIENTRY glTexCoord2iv (const GLint *v); +WINGDIAPI void APIENTRY glTexCoord2s (GLshort s, GLshort t); +WINGDIAPI void APIENTRY glTexCoord2sv (const GLshort *v); +WINGDIAPI void APIENTRY glTexCoord3d (GLdouble s, GLdouble t, GLdouble r); +WINGDIAPI void APIENTRY glTexCoord3dv (const GLdouble *v); +WINGDIAPI void APIENTRY glTexCoord3f (GLfloat s, GLfloat t, GLfloat r); +WINGDIAPI void APIENTRY glTexCoord3fv (const GLfloat *v); +WINGDIAPI void APIENTRY glTexCoord3i (GLint s, GLint t, GLint r); +WINGDIAPI void APIENTRY glTexCoord3iv (const GLint *v); +WINGDIAPI void APIENTRY glTexCoord3s (GLshort s, GLshort t, GLshort r); +WINGDIAPI void APIENTRY glTexCoord3sv (const GLshort *v); +WINGDIAPI void APIENTRY glTexCoord4d (GLdouble s, GLdouble t, GLdouble r, GLdouble q); +WINGDIAPI void APIENTRY glTexCoord4dv (const GLdouble *v); +WINGDIAPI void APIENTRY glTexCoord4f (GLfloat s, GLfloat t, GLfloat r, GLfloat q); +WINGDIAPI void APIENTRY glTexCoord4fv (const GLfloat *v); +WINGDIAPI void APIENTRY glTexCoord4i (GLint s, GLint t, GLint r, GLint q); +WINGDIAPI void APIENTRY glTexCoord4iv (const GLint *v); +WINGDIAPI void APIENTRY glTexCoord4s (GLshort s, GLshort t, GLshort r, GLshort q); +WINGDIAPI void APIENTRY glTexCoord4sv (const GLshort *v); +WINGDIAPI void APIENTRY glTexCoordPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +WINGDIAPI void APIENTRY glTexEnvf (GLenum target, GLenum pname, GLfloat param); +WINGDIAPI void APIENTRY glTexEnvfv (GLenum target, GLenum pname, const GLfloat *params); +WINGDIAPI void APIENTRY glTexEnvi (GLenum target, GLenum pname, GLint param); +WINGDIAPI void APIENTRY glTexEnviv (GLenum target, GLenum pname, const GLint *params); +WINGDIAPI void APIENTRY glTexGend (GLenum coord, GLenum pname, GLdouble param); +WINGDIAPI void APIENTRY glTexGendv (GLenum coord, GLenum pname, const GLdouble *params); +WINGDIAPI void APIENTRY glTexGenf (GLenum coord, GLenum pname, GLfloat param); +WINGDIAPI void APIENTRY glTexGenfv (GLenum coord, GLenum pname, const GLfloat *params); +WINGDIAPI void APIENTRY glTexGeni (GLenum coord, GLenum pname, GLint param); +WINGDIAPI void APIENTRY glTexGeniv (GLenum coord, GLenum pname, const GLint *params); +WINGDIAPI void APIENTRY glTexImage1D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +WINGDIAPI void APIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +WINGDIAPI void APIENTRY glTexParameterf (GLenum target, GLenum pname, GLfloat param); +WINGDIAPI void APIENTRY glTexParameterfv (GLenum target, GLenum pname, const GLfloat *params); +WINGDIAPI void APIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param); +WINGDIAPI void APIENTRY glTexParameteriv (GLenum target, GLenum pname, const GLint *params); +WINGDIAPI void APIENTRY glTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); +WINGDIAPI void APIENTRY glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); +WINGDIAPI void APIENTRY glTranslated (GLdouble x, GLdouble y, GLdouble z); +WINGDIAPI void APIENTRY glTranslatef (GLfloat x, GLfloat y, GLfloat z); +WINGDIAPI void APIENTRY glVertex2d (GLdouble x, GLdouble y); +WINGDIAPI void APIENTRY glVertex2dv (const GLdouble *v); +WINGDIAPI void APIENTRY glVertex2f (GLfloat x, GLfloat y); +WINGDIAPI void APIENTRY glVertex2fv (const GLfloat *v); +WINGDIAPI void APIENTRY glVertex2i (GLint x, GLint y); +WINGDIAPI void APIENTRY glVertex2iv (const GLint *v); +WINGDIAPI void APIENTRY glVertex2s (GLshort x, GLshort y); +WINGDIAPI void APIENTRY glVertex2sv (const GLshort *v); +WINGDIAPI void APIENTRY glVertex3d (GLdouble x, GLdouble y, GLdouble z); +WINGDIAPI void APIENTRY glVertex3dv (const GLdouble *v); +WINGDIAPI void APIENTRY glVertex3f (GLfloat x, GLfloat y, GLfloat z); +WINGDIAPI void APIENTRY glVertex3fv (const GLfloat *v); +WINGDIAPI void APIENTRY glVertex3i (GLint x, GLint y, GLint z); +WINGDIAPI void APIENTRY glVertex3iv (const GLint *v); +WINGDIAPI void APIENTRY glVertex3s (GLshort x, GLshort y, GLshort z); +WINGDIAPI void APIENTRY glVertex3sv (const GLshort *v); +WINGDIAPI void APIENTRY glVertex4d (GLdouble x, GLdouble y, GLdouble z, GLdouble w); +WINGDIAPI void APIENTRY glVertex4dv (const GLdouble *v); +WINGDIAPI void APIENTRY glVertex4f (GLfloat x, GLfloat y, GLfloat z, GLfloat w); +WINGDIAPI void APIENTRY glVertex4fv (const GLfloat *v); +WINGDIAPI void APIENTRY glVertex4i (GLint x, GLint y, GLint z, GLint w); +WINGDIAPI void APIENTRY glVertex4iv (const GLint *v); +WINGDIAPI void APIENTRY glVertex4s (GLshort x, GLshort y, GLshort z, GLshort w); +WINGDIAPI void APIENTRY glVertex4sv (const GLshort *v); +WINGDIAPI void APIENTRY glVertexPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +WINGDIAPI void APIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height); + +#ifdef __cplusplus +} +#endif + +#endif /* __gl_h_ */ diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Windows/GL/glew.h b/Source/Plugins/Plugin_VideoOGL/Src/Windows/GL/glew.h new file mode 100644 index 0000000000..27641bc6b9 --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/Windows/GL/glew.h @@ -0,0 +1,10716 @@ +/* +** The OpenGL Extension Wrangler Library +** Copyright (C) 2002-2007, Milan Ikits +** Copyright (C) 2002-2007, Marcelo E. Magallon +** Copyright (C) 2002, Lev Povalahev +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are met: +** +** * Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright notice, +** this list of conditions and the following disclaimer in the documentation +** and/or other materials provided with the distribution. +** * The name of the author may be used to endorse or promote products +** derived from this software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +** THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: This software was created using the +** OpenGL(R) version 1.2.1 Sample Implementation published by SGI, but has +** not been independently verified as being compliant with the OpenGL(R) +** version 1.2.1 Specification. +*/ + +#ifndef __glew_h__ +#define __glew_h__ +#define __GLEW_H__ + +#if defined(__gl_h_) || defined(__GL_H__) +#error gl.h included before glew.h +#endif +#if defined(__glext_h_) || defined(__GLEXT_H_) +#error glext.h included before glew.h +#endif +#if defined(__gl_ATI_h_) +#error glATI.h included before glew.h +#endif + +#define __gl_h_ +#define __GL_H__ +#define __glext_h_ +#define __GLEXT_H_ +#define __gl_ATI_h_ + +#if defined(_WIN32) + +/* + * GLEW does not include to avoid name space pollution. + * GL needs GLAPI and GLAPIENTRY, GLU needs APIENTRY, CALLBACK, and wchar_t + * defined properly. + */ +/* */ +#ifndef APIENTRY +#define GLEW_APIENTRY_DEFINED +# if defined(__MINGW32__) +# define APIENTRY __stdcall +# elif (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED) || defined(__BORLANDC__) +# define APIENTRY __stdcall +# else +# define APIENTRY +# endif +#endif +#ifndef GLAPI +# if defined(__MINGW32__) +# define GLAPI extern +# endif +#endif +/* */ +#ifndef CALLBACK +#define GLEW_CALLBACK_DEFINED +# if defined(__MINGW32__) +# define CALLBACK __attribute__ ((__stdcall__)) +# elif (defined(_M_MRX000) || defined(_M_IX86) || defined(_M_ALPHA) || defined(_M_PPC)) && !defined(MIDL_PASS) +# define CALLBACK __stdcall +# else +# define CALLBACK +# endif +#endif +/* and */ +#ifndef WINGDIAPI +#define GLEW_WINGDIAPI_DEFINED +#define WINGDIAPI __declspec(dllimport) +#endif +/* */ +#if (defined(_MSC_VER) || defined(__BORLANDC__)) && !defined(_WCHAR_T_DEFINED) +typedef unsigned short wchar_t; +# define _WCHAR_T_DEFINED +#endif +/* */ +#if !defined(_W64) +# if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300 +# define _W64 __w64 +# else +# define _W64 +# endif +#endif +#if !defined(_PTRDIFF_T_DEFINED) && !defined(_PTRDIFF_T_) +# ifdef _WIN64 +typedef __int64 ptrdiff_t; +# else +typedef _W64 int ptrdiff_t; +# endif +# define _PTRDIFF_T_DEFINED +# define _PTRDIFF_T_ +#endif + +#ifndef GLAPI +# if defined(__MINGW32__) +# define GLAPI extern +# else +# define GLAPI WINGDIAPI +# endif +#endif + +#ifndef GLAPIENTRY +#define GLAPIENTRY APIENTRY +#endif + +/* + * GLEW_STATIC needs to be set when using the static version. + * GLEW_BUILD is set when building the DLL version. + */ +#ifdef GLEW_STATIC +# define GLEWAPI extern +#else +# ifdef GLEW_BUILD +# define GLEWAPI extern __declspec(dllexport) +# else +# define GLEWAPI extern __declspec(dllimport) +# endif +#endif + +#else /* _UNIX */ + +/* + * Needed for ptrdiff_t in turn needed by VBO. This is defined by ISO + * C. On my system, this amounts to _3 lines_ of included code, all of + * them pretty much harmless. If you know of a way of detecting 32 vs + * 64 _targets_ at compile time you are free to replace this with + * something that's portable. For now, _this_ is the portable solution. + * (mem, 2004-01-04) + */ + +#include + +#define GLEW_APIENTRY_DEFINED +#define APIENTRY +#define GLEWAPI extern + +/* */ +#ifndef GLAPI +#define GLAPI extern +#endif +#ifndef GLAPIENTRY +#define GLAPIENTRY +#endif + +#endif /* _WIN32 */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* ----------------------------- GL_VERSION_1_1 ---------------------------- */ + +#ifndef GL_VERSION_1_1 +#define GL_VERSION_1_1 1 + +#if defined(__APPLE__) +typedef unsigned long GLenum; +typedef unsigned long GLbitfield; +typedef unsigned long GLuint; +typedef long GLint; +typedef long GLsizei; +#else +typedef unsigned int GLenum; +typedef unsigned int GLbitfield; +typedef unsigned int GLuint; +typedef int GLint; +typedef int GLsizei; +#endif +typedef unsigned char GLboolean; +typedef signed char GLbyte; +typedef short GLshort; +typedef unsigned char GLubyte; +typedef unsigned short GLushort; +typedef float GLfloat; +typedef float GLclampf; +typedef double GLdouble; +typedef double GLclampd; +typedef void GLvoid; +#if defined(_MSC_VER) && _MSC_VER < 1310 +# ifdef _WIN64 +typedef __int64 GLint64EXT; +typedef unsigned __int64 GLuint64EXT; +# else +typedef _W64 int GLint64EXT; +typedef _W64 unsigned int GLuint64EXT; +# endif +#else +typedef signed long long GLint64EXT; +typedef unsigned long long GLuint64EXT; +#endif + +#define GL_ACCUM 0x0100 +#define GL_LOAD 0x0101 +#define GL_RETURN 0x0102 +#define GL_MULT 0x0103 +#define GL_ADD 0x0104 +#define GL_NEVER 0x0200 +#define GL_LESS 0x0201 +#define GL_EQUAL 0x0202 +#define GL_LEQUAL 0x0203 +#define GL_GREATER 0x0204 +#define GL_NOTEQUAL 0x0205 +#define GL_GEQUAL 0x0206 +#define GL_ALWAYS 0x0207 +#define GL_CURRENT_BIT 0x00000001 +#define GL_POINT_BIT 0x00000002 +#define GL_LINE_BIT 0x00000004 +#define GL_POLYGON_BIT 0x00000008 +#define GL_POLYGON_STIPPLE_BIT 0x00000010 +#define GL_PIXEL_MODE_BIT 0x00000020 +#define GL_LIGHTING_BIT 0x00000040 +#define GL_FOG_BIT 0x00000080 +#define GL_DEPTH_BUFFER_BIT 0x00000100 +#define GL_ACCUM_BUFFER_BIT 0x00000200 +#define GL_STENCIL_BUFFER_BIT 0x00000400 +#define GL_VIEWPORT_BIT 0x00000800 +#define GL_TRANSFORM_BIT 0x00001000 +#define GL_ENABLE_BIT 0x00002000 +#define GL_COLOR_BUFFER_BIT 0x00004000 +#define GL_HINT_BIT 0x00008000 +#define GL_EVAL_BIT 0x00010000 +#define GL_LIST_BIT 0x00020000 +#define GL_TEXTURE_BIT 0x00040000 +#define GL_SCISSOR_BIT 0x00080000 +#define GL_ALL_ATTRIB_BITS 0x000fffff +#define GL_POINTS 0x0000 +#define GL_LINES 0x0001 +#define GL_LINE_LOOP 0x0002 +#define GL_LINE_STRIP 0x0003 +#define GL_TRIANGLES 0x0004 +#define GL_TRIANGLE_STRIP 0x0005 +#define GL_TRIANGLE_FAN 0x0006 +#define GL_QUADS 0x0007 +#define GL_QUAD_STRIP 0x0008 +#define GL_POLYGON 0x0009 +#define GL_ZERO 0 +#define GL_ONE 1 +#define GL_SRC_COLOR 0x0300 +#define GL_ONE_MINUS_SRC_COLOR 0x0301 +#define GL_SRC_ALPHA 0x0302 +#define GL_ONE_MINUS_SRC_ALPHA 0x0303 +#define GL_DST_ALPHA 0x0304 +#define GL_ONE_MINUS_DST_ALPHA 0x0305 +#define GL_DST_COLOR 0x0306 +#define GL_ONE_MINUS_DST_COLOR 0x0307 +#define GL_SRC_ALPHA_SATURATE 0x0308 +#define GL_TRUE 1 +#define GL_FALSE 0 +#define GL_CLIP_PLANE0 0x3000 +#define GL_CLIP_PLANE1 0x3001 +#define GL_CLIP_PLANE2 0x3002 +#define GL_CLIP_PLANE3 0x3003 +#define GL_CLIP_PLANE4 0x3004 +#define GL_CLIP_PLANE5 0x3005 +#define GL_BYTE 0x1400 +#define GL_UNSIGNED_BYTE 0x1401 +#define GL_SHORT 0x1402 +#define GL_UNSIGNED_SHORT 0x1403 +#define GL_INT 0x1404 +#define GL_UNSIGNED_INT 0x1405 +#define GL_FLOAT 0x1406 +#define GL_2_BYTES 0x1407 +#define GL_3_BYTES 0x1408 +#define GL_4_BYTES 0x1409 +#define GL_DOUBLE 0x140A +#define GL_NONE 0 +#define GL_FRONT_LEFT 0x0400 +#define GL_FRONT_RIGHT 0x0401 +#define GL_BACK_LEFT 0x0402 +#define GL_BACK_RIGHT 0x0403 +#define GL_FRONT 0x0404 +#define GL_BACK 0x0405 +#define GL_LEFT 0x0406 +#define GL_RIGHT 0x0407 +#define GL_FRONT_AND_BACK 0x0408 +#define GL_AUX0 0x0409 +#define GL_AUX1 0x040A +#define GL_AUX2 0x040B +#define GL_AUX3 0x040C +#define GL_NO_ERROR 0 +#define GL_INVALID_ENUM 0x0500 +#define GL_INVALID_VALUE 0x0501 +#define GL_INVALID_OPERATION 0x0502 +#define GL_STACK_OVERFLOW 0x0503 +#define GL_STACK_UNDERFLOW 0x0504 +#define GL_OUT_OF_MEMORY 0x0505 +#define GL_2D 0x0600 +#define GL_3D 0x0601 +#define GL_3D_COLOR 0x0602 +#define GL_3D_COLOR_TEXTURE 0x0603 +#define GL_4D_COLOR_TEXTURE 0x0604 +#define GL_PASS_THROUGH_TOKEN 0x0700 +#define GL_POINT_TOKEN 0x0701 +#define GL_LINE_TOKEN 0x0702 +#define GL_POLYGON_TOKEN 0x0703 +#define GL_BITMAP_TOKEN 0x0704 +#define GL_DRAW_PIXEL_TOKEN 0x0705 +#define GL_COPY_PIXEL_TOKEN 0x0706 +#define GL_LINE_RESET_TOKEN 0x0707 +#define GL_EXP 0x0800 +#define GL_EXP2 0x0801 +#define GL_CW 0x0900 +#define GL_CCW 0x0901 +#define GL_COEFF 0x0A00 +#define GL_ORDER 0x0A01 +#define GL_DOMAIN 0x0A02 +#define GL_CURRENT_COLOR 0x0B00 +#define GL_CURRENT_INDEX 0x0B01 +#define GL_CURRENT_NORMAL 0x0B02 +#define GL_CURRENT_TEXTURE_COORDS 0x0B03 +#define GL_CURRENT_RASTER_COLOR 0x0B04 +#define GL_CURRENT_RASTER_INDEX 0x0B05 +#define GL_CURRENT_RASTER_TEXTURE_COORDS 0x0B06 +#define GL_CURRENT_RASTER_POSITION 0x0B07 +#define GL_CURRENT_RASTER_POSITION_VALID 0x0B08 +#define GL_CURRENT_RASTER_DISTANCE 0x0B09 +#define GL_POINT_SMOOTH 0x0B10 +#define GL_POINT_SIZE 0x0B11 +#define GL_POINT_SIZE_RANGE 0x0B12 +#define GL_POINT_SIZE_GRANULARITY 0x0B13 +#define GL_LINE_SMOOTH 0x0B20 +#define GL_LINE_WIDTH 0x0B21 +#define GL_LINE_WIDTH_RANGE 0x0B22 +#define GL_LINE_WIDTH_GRANULARITY 0x0B23 +#define GL_LINE_STIPPLE 0x0B24 +#define GL_LINE_STIPPLE_PATTERN 0x0B25 +#define GL_LINE_STIPPLE_REPEAT 0x0B26 +#define GL_LIST_MODE 0x0B30 +#define GL_MAX_LIST_NESTING 0x0B31 +#define GL_LIST_BASE 0x0B32 +#define GL_LIST_INDEX 0x0B33 +#define GL_POLYGON_MODE 0x0B40 +#define GL_POLYGON_SMOOTH 0x0B41 +#define GL_POLYGON_STIPPLE 0x0B42 +#define GL_EDGE_FLAG 0x0B43 +#define GL_CULL_FACE 0x0B44 +#define GL_CULL_FACE_MODE 0x0B45 +#define GL_FRONT_FACE 0x0B46 +#define GL_LIGHTING 0x0B50 +#define GL_LIGHT_MODEL_LOCAL_VIEWER 0x0B51 +#define GL_LIGHT_MODEL_TWO_SIDE 0x0B52 +#define GL_LIGHT_MODEL_AMBIENT 0x0B53 +#define GL_SHADE_MODEL 0x0B54 +#define GL_COLOR_MATERIAL_FACE 0x0B55 +#define GL_COLOR_MATERIAL_PARAMETER 0x0B56 +#define GL_COLOR_MATERIAL 0x0B57 +#define GL_FOG 0x0B60 +#define GL_FOG_INDEX 0x0B61 +#define GL_FOG_DENSITY 0x0B62 +#define GL_FOG_START 0x0B63 +#define GL_FOG_END 0x0B64 +#define GL_FOG_MODE 0x0B65 +#define GL_FOG_COLOR 0x0B66 +#define GL_DEPTH_RANGE 0x0B70 +#define GL_DEPTH_TEST 0x0B71 +#define GL_DEPTH_WRITEMASK 0x0B72 +#define GL_DEPTH_CLEAR_VALUE 0x0B73 +#define GL_DEPTH_FUNC 0x0B74 +#define GL_ACCUM_CLEAR_VALUE 0x0B80 +#define GL_STENCIL_TEST 0x0B90 +#define GL_STENCIL_CLEAR_VALUE 0x0B91 +#define GL_STENCIL_FUNC 0x0B92 +#define GL_STENCIL_VALUE_MASK 0x0B93 +#define GL_STENCIL_FAIL 0x0B94 +#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95 +#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96 +#define GL_STENCIL_REF 0x0B97 +#define GL_STENCIL_WRITEMASK 0x0B98 +#define GL_MATRIX_MODE 0x0BA0 +#define GL_NORMALIZE 0x0BA1 +#define GL_VIEWPORT 0x0BA2 +#define GL_MODELVIEW_STACK_DEPTH 0x0BA3 +#define GL_PROJECTION_STACK_DEPTH 0x0BA4 +#define GL_TEXTURE_STACK_DEPTH 0x0BA5 +#define GL_MODELVIEW_MATRIX 0x0BA6 +#define GL_PROJECTION_MATRIX 0x0BA7 +#define GL_TEXTURE_MATRIX 0x0BA8 +#define GL_ATTRIB_STACK_DEPTH 0x0BB0 +#define GL_CLIENT_ATTRIB_STACK_DEPTH 0x0BB1 +#define GL_ALPHA_TEST 0x0BC0 +#define GL_ALPHA_TEST_FUNC 0x0BC1 +#define GL_ALPHA_TEST_REF 0x0BC2 +#define GL_DITHER 0x0BD0 +#define GL_BLEND_DST 0x0BE0 +#define GL_BLEND_SRC 0x0BE1 +#define GL_BLEND 0x0BE2 +#define GL_LOGIC_OP_MODE 0x0BF0 +#define GL_INDEX_LOGIC_OP 0x0BF1 +#define GL_COLOR_LOGIC_OP 0x0BF2 +#define GL_AUX_BUFFERS 0x0C00 +#define GL_DRAW_BUFFER 0x0C01 +#define GL_READ_BUFFER 0x0C02 +#define GL_SCISSOR_BOX 0x0C10 +#define GL_SCISSOR_TEST 0x0C11 +#define GL_INDEX_CLEAR_VALUE 0x0C20 +#define GL_INDEX_WRITEMASK 0x0C21 +#define GL_COLOR_CLEAR_VALUE 0x0C22 +#define GL_COLOR_WRITEMASK 0x0C23 +#define GL_INDEX_MODE 0x0C30 +#define GL_RGBA_MODE 0x0C31 +#define GL_DOUBLEBUFFER 0x0C32 +#define GL_STEREO 0x0C33 +#define GL_RENDER_MODE 0x0C40 +#define GL_PERSPECTIVE_CORRECTION_HINT 0x0C50 +#define GL_POINT_SMOOTH_HINT 0x0C51 +#define GL_LINE_SMOOTH_HINT 0x0C52 +#define GL_POLYGON_SMOOTH_HINT 0x0C53 +#define GL_FOG_HINT 0x0C54 +#define GL_TEXTURE_GEN_S 0x0C60 +#define GL_TEXTURE_GEN_T 0x0C61 +#define GL_TEXTURE_GEN_R 0x0C62 +#define GL_TEXTURE_GEN_Q 0x0C63 +#define GL_PIXEL_MAP_I_TO_I 0x0C70 +#define GL_PIXEL_MAP_S_TO_S 0x0C71 +#define GL_PIXEL_MAP_I_TO_R 0x0C72 +#define GL_PIXEL_MAP_I_TO_G 0x0C73 +#define GL_PIXEL_MAP_I_TO_B 0x0C74 +#define GL_PIXEL_MAP_I_TO_A 0x0C75 +#define GL_PIXEL_MAP_R_TO_R 0x0C76 +#define GL_PIXEL_MAP_G_TO_G 0x0C77 +#define GL_PIXEL_MAP_B_TO_B 0x0C78 +#define GL_PIXEL_MAP_A_TO_A 0x0C79 +#define GL_PIXEL_MAP_I_TO_I_SIZE 0x0CB0 +#define GL_PIXEL_MAP_S_TO_S_SIZE 0x0CB1 +#define GL_PIXEL_MAP_I_TO_R_SIZE 0x0CB2 +#define GL_PIXEL_MAP_I_TO_G_SIZE 0x0CB3 +#define GL_PIXEL_MAP_I_TO_B_SIZE 0x0CB4 +#define GL_PIXEL_MAP_I_TO_A_SIZE 0x0CB5 +#define GL_PIXEL_MAP_R_TO_R_SIZE 0x0CB6 +#define GL_PIXEL_MAP_G_TO_G_SIZE 0x0CB7 +#define GL_PIXEL_MAP_B_TO_B_SIZE 0x0CB8 +#define GL_PIXEL_MAP_A_TO_A_SIZE 0x0CB9 +#define GL_UNPACK_SWAP_BYTES 0x0CF0 +#define GL_UNPACK_LSB_FIRST 0x0CF1 +#define GL_UNPACK_ROW_LENGTH 0x0CF2 +#define GL_UNPACK_SKIP_ROWS 0x0CF3 +#define GL_UNPACK_SKIP_PIXELS 0x0CF4 +#define GL_UNPACK_ALIGNMENT 0x0CF5 +#define GL_PACK_SWAP_BYTES 0x0D00 +#define GL_PACK_LSB_FIRST 0x0D01 +#define GL_PACK_ROW_LENGTH 0x0D02 +#define GL_PACK_SKIP_ROWS 0x0D03 +#define GL_PACK_SKIP_PIXELS 0x0D04 +#define GL_PACK_ALIGNMENT 0x0D05 +#define GL_MAP_COLOR 0x0D10 +#define GL_MAP_STENCIL 0x0D11 +#define GL_INDEX_SHIFT 0x0D12 +#define GL_INDEX_OFFSET 0x0D13 +#define GL_RED_SCALE 0x0D14 +#define GL_RED_BIAS 0x0D15 +#define GL_ZOOM_X 0x0D16 +#define GL_ZOOM_Y 0x0D17 +#define GL_GREEN_SCALE 0x0D18 +#define GL_GREEN_BIAS 0x0D19 +#define GL_BLUE_SCALE 0x0D1A +#define GL_BLUE_BIAS 0x0D1B +#define GL_ALPHA_SCALE 0x0D1C +#define GL_ALPHA_BIAS 0x0D1D +#define GL_DEPTH_SCALE 0x0D1E +#define GL_DEPTH_BIAS 0x0D1F +#define GL_MAX_EVAL_ORDER 0x0D30 +#define GL_MAX_LIGHTS 0x0D31 +#define GL_MAX_CLIP_PLANES 0x0D32 +#define GL_MAX_TEXTURE_SIZE 0x0D33 +#define GL_MAX_PIXEL_MAP_TABLE 0x0D34 +#define GL_MAX_ATTRIB_STACK_DEPTH 0x0D35 +#define GL_MAX_MODELVIEW_STACK_DEPTH 0x0D36 +#define GL_MAX_NAME_STACK_DEPTH 0x0D37 +#define GL_MAX_PROJECTION_STACK_DEPTH 0x0D38 +#define GL_MAX_TEXTURE_STACK_DEPTH 0x0D39 +#define GL_MAX_VIEWPORT_DIMS 0x0D3A +#define GL_MAX_CLIENT_ATTRIB_STACK_DEPTH 0x0D3B +#define GL_SUBPIXEL_BITS 0x0D50 +#define GL_INDEX_BITS 0x0D51 +#define GL_RED_BITS 0x0D52 +#define GL_GREEN_BITS 0x0D53 +#define GL_BLUE_BITS 0x0D54 +#define GL_ALPHA_BITS 0x0D55 +#define GL_DEPTH_BITS 0x0D56 +#define GL_STENCIL_BITS 0x0D57 +#define GL_ACCUM_RED_BITS 0x0D58 +#define GL_ACCUM_GREEN_BITS 0x0D59 +#define GL_ACCUM_BLUE_BITS 0x0D5A +#define GL_ACCUM_ALPHA_BITS 0x0D5B +#define GL_NAME_STACK_DEPTH 0x0D70 +#define GL_AUTO_NORMAL 0x0D80 +#define GL_MAP1_COLOR_4 0x0D90 +#define GL_MAP1_INDEX 0x0D91 +#define GL_MAP1_NORMAL 0x0D92 +#define GL_MAP1_TEXTURE_COORD_1 0x0D93 +#define GL_MAP1_TEXTURE_COORD_2 0x0D94 +#define GL_MAP1_TEXTURE_COORD_3 0x0D95 +#define GL_MAP1_TEXTURE_COORD_4 0x0D96 +#define GL_MAP1_VERTEX_3 0x0D97 +#define GL_MAP1_VERTEX_4 0x0D98 +#define GL_MAP2_COLOR_4 0x0DB0 +#define GL_MAP2_INDEX 0x0DB1 +#define GL_MAP2_NORMAL 0x0DB2 +#define GL_MAP2_TEXTURE_COORD_1 0x0DB3 +#define GL_MAP2_TEXTURE_COORD_2 0x0DB4 +#define GL_MAP2_TEXTURE_COORD_3 0x0DB5 +#define GL_MAP2_TEXTURE_COORD_4 0x0DB6 +#define GL_MAP2_VERTEX_3 0x0DB7 +#define GL_MAP2_VERTEX_4 0x0DB8 +#define GL_MAP1_GRID_DOMAIN 0x0DD0 +#define GL_MAP1_GRID_SEGMENTS 0x0DD1 +#define GL_MAP2_GRID_DOMAIN 0x0DD2 +#define GL_MAP2_GRID_SEGMENTS 0x0DD3 +#define GL_TEXTURE_1D 0x0DE0 +#define GL_TEXTURE_2D 0x0DE1 +#define GL_FEEDBACK_BUFFER_POINTER 0x0DF0 +#define GL_FEEDBACK_BUFFER_SIZE 0x0DF1 +#define GL_FEEDBACK_BUFFER_TYPE 0x0DF2 +#define GL_SELECTION_BUFFER_POINTER 0x0DF3 +#define GL_SELECTION_BUFFER_SIZE 0x0DF4 +#define GL_TEXTURE_WIDTH 0x1000 +#define GL_TEXTURE_HEIGHT 0x1001 +#define GL_TEXTURE_INTERNAL_FORMAT 0x1003 +#define GL_TEXTURE_BORDER_COLOR 0x1004 +#define GL_TEXTURE_BORDER 0x1005 +#define GL_DONT_CARE 0x1100 +#define GL_FASTEST 0x1101 +#define GL_NICEST 0x1102 +#define GL_LIGHT0 0x4000 +#define GL_LIGHT1 0x4001 +#define GL_LIGHT2 0x4002 +#define GL_LIGHT3 0x4003 +#define GL_LIGHT4 0x4004 +#define GL_LIGHT5 0x4005 +#define GL_LIGHT6 0x4006 +#define GL_LIGHT7 0x4007 +#define GL_AMBIENT 0x1200 +#define GL_DIFFUSE 0x1201 +#define GL_SPECULAR 0x1202 +#define GL_POSITION 0x1203 +#define GL_SPOT_DIRECTION 0x1204 +#define GL_SPOT_EXPONENT 0x1205 +#define GL_SPOT_CUTOFF 0x1206 +#define GL_CONSTANT_ATTENUATION 0x1207 +#define GL_LINEAR_ATTENUATION 0x1208 +#define GL_QUADRATIC_ATTENUATION 0x1209 +#define GL_COMPILE 0x1300 +#define GL_COMPILE_AND_EXECUTE 0x1301 +#define GL_CLEAR 0x1500 +#define GL_AND 0x1501 +#define GL_AND_REVERSE 0x1502 +#define GL_COPY 0x1503 +#define GL_AND_INVERTED 0x1504 +#define GL_NOOP 0x1505 +#define GL_XOR 0x1506 +#define GL_OR 0x1507 +#define GL_NOR 0x1508 +#define GL_EQUIV 0x1509 +#define GL_INVERT 0x150A +#define GL_OR_REVERSE 0x150B +#define GL_COPY_INVERTED 0x150C +#define GL_OR_INVERTED 0x150D +#define GL_NAND 0x150E +#define GL_SET 0x150F +#define GL_EMISSION 0x1600 +#define GL_SHININESS 0x1601 +#define GL_AMBIENT_AND_DIFFUSE 0x1602 +#define GL_COLOR_INDEXES 0x1603 +#define GL_MODELVIEW 0x1700 +#define GL_PROJECTION 0x1701 +#define GL_TEXTURE 0x1702 +#define GL_COLOR 0x1800 +#define GL_DEPTH 0x1801 +#define GL_STENCIL 0x1802 +#define GL_COLOR_INDEX 0x1900 +#define GL_STENCIL_INDEX 0x1901 +#define GL_DEPTH_COMPONENT 0x1902 +#define GL_RED 0x1903 +#define GL_GREEN 0x1904 +#define GL_BLUE 0x1905 +#define GL_ALPHA 0x1906 +#define GL_RGB 0x1907 +#define GL_RGBA 0x1908 +#define GL_LUMINANCE 0x1909 +#define GL_LUMINANCE_ALPHA 0x190A +#define GL_BITMAP 0x1A00 +#define GL_POINT 0x1B00 +#define GL_LINE 0x1B01 +#define GL_FILL 0x1B02 +#define GL_RENDER 0x1C00 +#define GL_FEEDBACK 0x1C01 +#define GL_SELECT 0x1C02 +#define GL_FLAT 0x1D00 +#define GL_SMOOTH 0x1D01 +#define GL_KEEP 0x1E00 +#define GL_REPLACE 0x1E01 +#define GL_INCR 0x1E02 +#define GL_DECR 0x1E03 +#define GL_VENDOR 0x1F00 +#define GL_RENDERER 0x1F01 +#define GL_VERSION 0x1F02 +#define GL_EXTENSIONS 0x1F03 +#define GL_S 0x2000 +#define GL_T 0x2001 +#define GL_R 0x2002 +#define GL_Q 0x2003 +#define GL_MODULATE 0x2100 +#define GL_DECAL 0x2101 +#define GL_TEXTURE_ENV_MODE 0x2200 +#define GL_TEXTURE_ENV_COLOR 0x2201 +#define GL_TEXTURE_ENV 0x2300 +#define GL_EYE_LINEAR 0x2400 +#define GL_OBJECT_LINEAR 0x2401 +#define GL_SPHERE_MAP 0x2402 +#define GL_TEXTURE_GEN_MODE 0x2500 +#define GL_OBJECT_PLANE 0x2501 +#define GL_EYE_PLANE 0x2502 +#define GL_NEAREST 0x2600 +#define GL_LINEAR 0x2601 +#define GL_NEAREST_MIPMAP_NEAREST 0x2700 +#define GL_LINEAR_MIPMAP_NEAREST 0x2701 +#define GL_NEAREST_MIPMAP_LINEAR 0x2702 +#define GL_LINEAR_MIPMAP_LINEAR 0x2703 +#define GL_TEXTURE_MAG_FILTER 0x2800 +#define GL_TEXTURE_MIN_FILTER 0x2801 +#define GL_TEXTURE_WRAP_S 0x2802 +#define GL_TEXTURE_WRAP_T 0x2803 +#define GL_CLAMP 0x2900 +#define GL_REPEAT 0x2901 +#define GL_CLIENT_PIXEL_STORE_BIT 0x00000001 +#define GL_CLIENT_VERTEX_ARRAY_BIT 0x00000002 +#define GL_CLIENT_ALL_ATTRIB_BITS 0xffffffff +#define GL_POLYGON_OFFSET_FACTOR 0x8038 +#define GL_POLYGON_OFFSET_UNITS 0x2A00 +#define GL_POLYGON_OFFSET_POINT 0x2A01 +#define GL_POLYGON_OFFSET_LINE 0x2A02 +#define GL_POLYGON_OFFSET_FILL 0x8037 +#define GL_ALPHA4 0x803B +#define GL_ALPHA8 0x803C +#define GL_ALPHA12 0x803D +#define GL_ALPHA16 0x803E +#define GL_LUMINANCE4 0x803F +#define GL_LUMINANCE8 0x8040 +#define GL_LUMINANCE12 0x8041 +#define GL_LUMINANCE16 0x8042 +#define GL_LUMINANCE4_ALPHA4 0x8043 +#define GL_LUMINANCE6_ALPHA2 0x8044 +#define GL_LUMINANCE8_ALPHA8 0x8045 +#define GL_LUMINANCE12_ALPHA4 0x8046 +#define GL_LUMINANCE12_ALPHA12 0x8047 +#define GL_LUMINANCE16_ALPHA16 0x8048 +#define GL_INTENSITY 0x8049 +#define GL_INTENSITY4 0x804A +#define GL_INTENSITY8 0x804B +#define GL_INTENSITY12 0x804C +#define GL_INTENSITY16 0x804D +#define GL_R3_G3_B2 0x2A10 +#define GL_RGB4 0x804F +#define GL_RGB5 0x8050 +#define GL_RGB8 0x8051 +#define GL_RGB10 0x8052 +#define GL_RGB12 0x8053 +#define GL_RGB16 0x8054 +#define GL_RGBA2 0x8055 +#define GL_RGBA4 0x8056 +#define GL_RGB5_A1 0x8057 +#define GL_RGBA8 0x8058 +#define GL_RGB10_A2 0x8059 +#define GL_RGBA12 0x805A +#define GL_RGBA16 0x805B +#define GL_TEXTURE_RED_SIZE 0x805C +#define GL_TEXTURE_GREEN_SIZE 0x805D +#define GL_TEXTURE_BLUE_SIZE 0x805E +#define GL_TEXTURE_ALPHA_SIZE 0x805F +#define GL_TEXTURE_LUMINANCE_SIZE 0x8060 +#define GL_TEXTURE_INTENSITY_SIZE 0x8061 +#define GL_PROXY_TEXTURE_1D 0x8063 +#define GL_PROXY_TEXTURE_2D 0x8064 +#define GL_TEXTURE_PRIORITY 0x8066 +#define GL_TEXTURE_RESIDENT 0x8067 +#define GL_TEXTURE_BINDING_1D 0x8068 +#define GL_TEXTURE_BINDING_2D 0x8069 +#define GL_VERTEX_ARRAY 0x8074 +#define GL_NORMAL_ARRAY 0x8075 +#define GL_COLOR_ARRAY 0x8076 +#define GL_INDEX_ARRAY 0x8077 +#define GL_TEXTURE_COORD_ARRAY 0x8078 +#define GL_EDGE_FLAG_ARRAY 0x8079 +#define GL_VERTEX_ARRAY_SIZE 0x807A +#define GL_VERTEX_ARRAY_TYPE 0x807B +#define GL_VERTEX_ARRAY_STRIDE 0x807C +#define GL_NORMAL_ARRAY_TYPE 0x807E +#define GL_NORMAL_ARRAY_STRIDE 0x807F +#define GL_COLOR_ARRAY_SIZE 0x8081 +#define GL_COLOR_ARRAY_TYPE 0x8082 +#define GL_COLOR_ARRAY_STRIDE 0x8083 +#define GL_INDEX_ARRAY_TYPE 0x8085 +#define GL_INDEX_ARRAY_STRIDE 0x8086 +#define GL_TEXTURE_COORD_ARRAY_SIZE 0x8088 +#define GL_TEXTURE_COORD_ARRAY_TYPE 0x8089 +#define GL_TEXTURE_COORD_ARRAY_STRIDE 0x808A +#define GL_EDGE_FLAG_ARRAY_STRIDE 0x808C +#define GL_VERTEX_ARRAY_POINTER 0x808E +#define GL_NORMAL_ARRAY_POINTER 0x808F +#define GL_COLOR_ARRAY_POINTER 0x8090 +#define GL_INDEX_ARRAY_POINTER 0x8091 +#define GL_TEXTURE_COORD_ARRAY_POINTER 0x8092 +#define GL_EDGE_FLAG_ARRAY_POINTER 0x8093 +#define GL_V2F 0x2A20 +#define GL_V3F 0x2A21 +#define GL_C4UB_V2F 0x2A22 +#define GL_C4UB_V3F 0x2A23 +#define GL_C3F_V3F 0x2A24 +#define GL_N3F_V3F 0x2A25 +#define GL_C4F_N3F_V3F 0x2A26 +#define GL_T2F_V3F 0x2A27 +#define GL_T4F_V4F 0x2A28 +#define GL_T2F_C4UB_V3F 0x2A29 +#define GL_T2F_C3F_V3F 0x2A2A +#define GL_T2F_N3F_V3F 0x2A2B +#define GL_T2F_C4F_N3F_V3F 0x2A2C +#define GL_T4F_C4F_N3F_V4F 0x2A2D +#define GL_LOGIC_OP GL_INDEX_LOGIC_OP +#define GL_TEXTURE_COMPONENTS GL_TEXTURE_INTERNAL_FORMAT +#define GL_COLOR_INDEX1_EXT 0x80E2 +#define GL_COLOR_INDEX2_EXT 0x80E3 +#define GL_COLOR_INDEX4_EXT 0x80E4 +#define GL_COLOR_INDEX8_EXT 0x80E5 +#define GL_COLOR_INDEX12_EXT 0x80E6 +#define GL_COLOR_INDEX16_EXT 0x80E7 + +GLAPI void GLAPIENTRY glAccum (GLenum op, GLfloat value); +GLAPI void GLAPIENTRY glAlphaFunc (GLenum func, GLclampf ref); +GLAPI GLboolean GLAPIENTRY glAreTexturesResident (GLsizei n, const GLuint *textures, GLboolean *residences); +GLAPI void GLAPIENTRY glArrayElement (GLint i); +GLAPI void GLAPIENTRY glBegin (GLenum mode); +GLAPI void GLAPIENTRY glBindTexture (GLenum target, GLuint texture); +GLAPI void GLAPIENTRY glBitmap (GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap); +GLAPI void GLAPIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor); +GLAPI void GLAPIENTRY glCallList (GLuint list); +GLAPI void GLAPIENTRY glCallLists (GLsizei n, GLenum type, const GLvoid *lists); +GLAPI void GLAPIENTRY glClear (GLbitfield mask); +GLAPI void GLAPIENTRY glClearAccum (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +GLAPI void GLAPIENTRY glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); +GLAPI void GLAPIENTRY glClearDepth (GLclampd depth); +GLAPI void GLAPIENTRY glClearIndex (GLfloat c); +GLAPI void GLAPIENTRY glClearStencil (GLint s); +GLAPI void GLAPIENTRY glClipPlane (GLenum plane, const GLdouble *equation); +GLAPI void GLAPIENTRY glColor3b (GLbyte red, GLbyte green, GLbyte blue); +GLAPI void GLAPIENTRY glColor3bv (const GLbyte *v); +GLAPI void GLAPIENTRY glColor3d (GLdouble red, GLdouble green, GLdouble blue); +GLAPI void GLAPIENTRY glColor3dv (const GLdouble *v); +GLAPI void GLAPIENTRY glColor3f (GLfloat red, GLfloat green, GLfloat blue); +GLAPI void GLAPIENTRY glColor3fv (const GLfloat *v); +GLAPI void GLAPIENTRY glColor3i (GLint red, GLint green, GLint blue); +GLAPI void GLAPIENTRY glColor3iv (const GLint *v); +GLAPI void GLAPIENTRY glColor3s (GLshort red, GLshort green, GLshort blue); +GLAPI void GLAPIENTRY glColor3sv (const GLshort *v); +GLAPI void GLAPIENTRY glColor3ub (GLubyte red, GLubyte green, GLubyte blue); +GLAPI void GLAPIENTRY glColor3ubv (const GLubyte *v); +GLAPI void GLAPIENTRY glColor3ui (GLuint red, GLuint green, GLuint blue); +GLAPI void GLAPIENTRY glColor3uiv (const GLuint *v); +GLAPI void GLAPIENTRY glColor3us (GLushort red, GLushort green, GLushort blue); +GLAPI void GLAPIENTRY glColor3usv (const GLushort *v); +GLAPI void GLAPIENTRY glColor4b (GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha); +GLAPI void GLAPIENTRY glColor4bv (const GLbyte *v); +GLAPI void GLAPIENTRY glColor4d (GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha); +GLAPI void GLAPIENTRY glColor4dv (const GLdouble *v); +GLAPI void GLAPIENTRY glColor4f (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +GLAPI void GLAPIENTRY glColor4fv (const GLfloat *v); +GLAPI void GLAPIENTRY glColor4i (GLint red, GLint green, GLint blue, GLint alpha); +GLAPI void GLAPIENTRY glColor4iv (const GLint *v); +GLAPI void GLAPIENTRY glColor4s (GLshort red, GLshort green, GLshort blue, GLshort alpha); +GLAPI void GLAPIENTRY glColor4sv (const GLshort *v); +GLAPI void GLAPIENTRY glColor4ub (GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha); +GLAPI void GLAPIENTRY glColor4ubv (const GLubyte *v); +GLAPI void GLAPIENTRY glColor4ui (GLuint red, GLuint green, GLuint blue, GLuint alpha); +GLAPI void GLAPIENTRY glColor4uiv (const GLuint *v); +GLAPI void GLAPIENTRY glColor4us (GLushort red, GLushort green, GLushort blue, GLushort alpha); +GLAPI void GLAPIENTRY glColor4usv (const GLushort *v); +GLAPI void GLAPIENTRY glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); +GLAPI void GLAPIENTRY glColorMaterial (GLenum face, GLenum mode); +GLAPI void GLAPIENTRY glColorPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +GLAPI void GLAPIENTRY glCopyPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum type); +GLAPI void GLAPIENTRY glCopyTexImage1D (GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLint border); +GLAPI void GLAPIENTRY glCopyTexImage2D (GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +GLAPI void GLAPIENTRY glCopyTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +GLAPI void GLAPIENTRY glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void GLAPIENTRY glCullFace (GLenum mode); +GLAPI void GLAPIENTRY glDeleteLists (GLuint list, GLsizei range); +GLAPI void GLAPIENTRY glDeleteTextures (GLsizei n, const GLuint *textures); +GLAPI void GLAPIENTRY glDepthFunc (GLenum func); +GLAPI void GLAPIENTRY glDepthMask (GLboolean flag); +GLAPI void GLAPIENTRY glDepthRange (GLclampd zNear, GLclampd zFar); +GLAPI void GLAPIENTRY glDisable (GLenum cap); +GLAPI void GLAPIENTRY glDisableClientState (GLenum array); +GLAPI void GLAPIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count); +GLAPI void GLAPIENTRY glDrawBuffer (GLenum mode); +GLAPI void GLAPIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices); +GLAPI void GLAPIENTRY glDrawPixels (GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); +GLAPI void GLAPIENTRY glEdgeFlag (GLboolean flag); +GLAPI void GLAPIENTRY glEdgeFlagPointer (GLsizei stride, const GLvoid *pointer); +GLAPI void GLAPIENTRY glEdgeFlagv (const GLboolean *flag); +GLAPI void GLAPIENTRY glEnable (GLenum cap); +GLAPI void GLAPIENTRY glEnableClientState (GLenum array); +GLAPI void GLAPIENTRY glEnd (void); +GLAPI void GLAPIENTRY glEndList (void); +GLAPI void GLAPIENTRY glEvalCoord1d (GLdouble u); +GLAPI void GLAPIENTRY glEvalCoord1dv (const GLdouble *u); +GLAPI void GLAPIENTRY glEvalCoord1f (GLfloat u); +GLAPI void GLAPIENTRY glEvalCoord1fv (const GLfloat *u); +GLAPI void GLAPIENTRY glEvalCoord2d (GLdouble u, GLdouble v); +GLAPI void GLAPIENTRY glEvalCoord2dv (const GLdouble *u); +GLAPI void GLAPIENTRY glEvalCoord2f (GLfloat u, GLfloat v); +GLAPI void GLAPIENTRY glEvalCoord2fv (const GLfloat *u); +GLAPI void GLAPIENTRY glEvalMesh1 (GLenum mode, GLint i1, GLint i2); +GLAPI void GLAPIENTRY glEvalMesh2 (GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2); +GLAPI void GLAPIENTRY glEvalPoint1 (GLint i); +GLAPI void GLAPIENTRY glEvalPoint2 (GLint i, GLint j); +GLAPI void GLAPIENTRY glFeedbackBuffer (GLsizei size, GLenum type, GLfloat *buffer); +GLAPI void GLAPIENTRY glFinish (void); +GLAPI void GLAPIENTRY glFlush (void); +GLAPI void GLAPIENTRY glFogf (GLenum pname, GLfloat param); +GLAPI void GLAPIENTRY glFogfv (GLenum pname, const GLfloat *params); +GLAPI void GLAPIENTRY glFogi (GLenum pname, GLint param); +GLAPI void GLAPIENTRY glFogiv (GLenum pname, const GLint *params); +GLAPI void GLAPIENTRY glFrontFace (GLenum mode); +GLAPI void GLAPIENTRY glFrustum (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +GLAPI GLuint GLAPIENTRY glGenLists (GLsizei range); +GLAPI void GLAPIENTRY glGenTextures (GLsizei n, GLuint *textures); +GLAPI void GLAPIENTRY glGetBooleanv (GLenum pname, GLboolean *params); +GLAPI void GLAPIENTRY glGetClipPlane (GLenum plane, GLdouble *equation); +GLAPI void GLAPIENTRY glGetDoublev (GLenum pname, GLdouble *params); +GLAPI GLenum GLAPIENTRY glGetError (void); +GLAPI void GLAPIENTRY glGetFloatv (GLenum pname, GLfloat *params); +GLAPI void GLAPIENTRY glGetIntegerv (GLenum pname, GLint *params); +GLAPI void GLAPIENTRY glGetLightfv (GLenum light, GLenum pname, GLfloat *params); +GLAPI void GLAPIENTRY glGetLightiv (GLenum light, GLenum pname, GLint *params); +GLAPI void GLAPIENTRY glGetMapdv (GLenum target, GLenum query, GLdouble *v); +GLAPI void GLAPIENTRY glGetMapfv (GLenum target, GLenum query, GLfloat *v); +GLAPI void GLAPIENTRY glGetMapiv (GLenum target, GLenum query, GLint *v); +GLAPI void GLAPIENTRY glGetMaterialfv (GLenum face, GLenum pname, GLfloat *params); +GLAPI void GLAPIENTRY glGetMaterialiv (GLenum face, GLenum pname, GLint *params); +GLAPI void GLAPIENTRY glGetPixelMapfv (GLenum map, GLfloat *values); +GLAPI void GLAPIENTRY glGetPixelMapuiv (GLenum map, GLuint *values); +GLAPI void GLAPIENTRY glGetPixelMapusv (GLenum map, GLushort *values); +GLAPI void GLAPIENTRY glGetPointerv (GLenum pname, GLvoid* *params); +GLAPI void GLAPIENTRY glGetPolygonStipple (GLubyte *mask); +GLAPI const GLubyte * GLAPIENTRY glGetString (GLenum name); +GLAPI void GLAPIENTRY glGetTexEnvfv (GLenum target, GLenum pname, GLfloat *params); +GLAPI void GLAPIENTRY glGetTexEnviv (GLenum target, GLenum pname, GLint *params); +GLAPI void GLAPIENTRY glGetTexGendv (GLenum coord, GLenum pname, GLdouble *params); +GLAPI void GLAPIENTRY glGetTexGenfv (GLenum coord, GLenum pname, GLfloat *params); +GLAPI void GLAPIENTRY glGetTexGeniv (GLenum coord, GLenum pname, GLint *params); +GLAPI void GLAPIENTRY glGetTexImage (GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels); +GLAPI void GLAPIENTRY glGetTexLevelParameterfv (GLenum target, GLint level, GLenum pname, GLfloat *params); +GLAPI void GLAPIENTRY glGetTexLevelParameteriv (GLenum target, GLint level, GLenum pname, GLint *params); +GLAPI void GLAPIENTRY glGetTexParameterfv (GLenum target, GLenum pname, GLfloat *params); +GLAPI void GLAPIENTRY glGetTexParameteriv (GLenum target, GLenum pname, GLint *params); +GLAPI void GLAPIENTRY glHint (GLenum target, GLenum mode); +GLAPI void GLAPIENTRY glIndexMask (GLuint mask); +GLAPI void GLAPIENTRY glIndexPointer (GLenum type, GLsizei stride, const GLvoid *pointer); +GLAPI void GLAPIENTRY glIndexd (GLdouble c); +GLAPI void GLAPIENTRY glIndexdv (const GLdouble *c); +GLAPI void GLAPIENTRY glIndexf (GLfloat c); +GLAPI void GLAPIENTRY glIndexfv (const GLfloat *c); +GLAPI void GLAPIENTRY glIndexi (GLint c); +GLAPI void GLAPIENTRY glIndexiv (const GLint *c); +GLAPI void GLAPIENTRY glIndexs (GLshort c); +GLAPI void GLAPIENTRY glIndexsv (const GLshort *c); +GLAPI void GLAPIENTRY glIndexub (GLubyte c); +GLAPI void GLAPIENTRY glIndexubv (const GLubyte *c); +GLAPI void GLAPIENTRY glInitNames (void); +GLAPI void GLAPIENTRY glInterleavedArrays (GLenum format, GLsizei stride, const GLvoid *pointer); +GLAPI GLboolean GLAPIENTRY glIsEnabled (GLenum cap); +GLAPI GLboolean GLAPIENTRY glIsList (GLuint list); +GLAPI GLboolean GLAPIENTRY glIsTexture (GLuint texture); +GLAPI void GLAPIENTRY glLightModelf (GLenum pname, GLfloat param); +GLAPI void GLAPIENTRY glLightModelfv (GLenum pname, const GLfloat *params); +GLAPI void GLAPIENTRY glLightModeli (GLenum pname, GLint param); +GLAPI void GLAPIENTRY glLightModeliv (GLenum pname, const GLint *params); +GLAPI void GLAPIENTRY glLightf (GLenum light, GLenum pname, GLfloat param); +GLAPI void GLAPIENTRY glLightfv (GLenum light, GLenum pname, const GLfloat *params); +GLAPI void GLAPIENTRY glLighti (GLenum light, GLenum pname, GLint param); +GLAPI void GLAPIENTRY glLightiv (GLenum light, GLenum pname, const GLint *params); +GLAPI void GLAPIENTRY glLineStipple (GLint factor, GLushort pattern); +GLAPI void GLAPIENTRY glLineWidth (GLfloat width); +GLAPI void GLAPIENTRY glListBase (GLuint base); +GLAPI void GLAPIENTRY glLoadIdentity (void); +GLAPI void GLAPIENTRY glLoadMatrixd (const GLdouble *m); +GLAPI void GLAPIENTRY glLoadMatrixf (const GLfloat *m); +GLAPI void GLAPIENTRY glLoadName (GLuint name); +GLAPI void GLAPIENTRY glLogicOp (GLenum opcode); +GLAPI void GLAPIENTRY glMap1d (GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points); +GLAPI void GLAPIENTRY glMap1f (GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points); +GLAPI void GLAPIENTRY glMap2d (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points); +GLAPI void GLAPIENTRY glMap2f (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points); +GLAPI void GLAPIENTRY glMapGrid1d (GLint un, GLdouble u1, GLdouble u2); +GLAPI void GLAPIENTRY glMapGrid1f (GLint un, GLfloat u1, GLfloat u2); +GLAPI void GLAPIENTRY glMapGrid2d (GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2); +GLAPI void GLAPIENTRY glMapGrid2f (GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2); +GLAPI void GLAPIENTRY glMaterialf (GLenum face, GLenum pname, GLfloat param); +GLAPI void GLAPIENTRY glMaterialfv (GLenum face, GLenum pname, const GLfloat *params); +GLAPI void GLAPIENTRY glMateriali (GLenum face, GLenum pname, GLint param); +GLAPI void GLAPIENTRY glMaterialiv (GLenum face, GLenum pname, const GLint *params); +GLAPI void GLAPIENTRY glMatrixMode (GLenum mode); +GLAPI void GLAPIENTRY glMultMatrixd (const GLdouble *m); +GLAPI void GLAPIENTRY glMultMatrixf (const GLfloat *m); +GLAPI void GLAPIENTRY glNewList (GLuint list, GLenum mode); +GLAPI void GLAPIENTRY glNormal3b (GLbyte nx, GLbyte ny, GLbyte nz); +GLAPI void GLAPIENTRY glNormal3bv (const GLbyte *v); +GLAPI void GLAPIENTRY glNormal3d (GLdouble nx, GLdouble ny, GLdouble nz); +GLAPI void GLAPIENTRY glNormal3dv (const GLdouble *v); +GLAPI void GLAPIENTRY glNormal3f (GLfloat nx, GLfloat ny, GLfloat nz); +GLAPI void GLAPIENTRY glNormal3fv (const GLfloat *v); +GLAPI void GLAPIENTRY glNormal3i (GLint nx, GLint ny, GLint nz); +GLAPI void GLAPIENTRY glNormal3iv (const GLint *v); +GLAPI void GLAPIENTRY glNormal3s (GLshort nx, GLshort ny, GLshort nz); +GLAPI void GLAPIENTRY glNormal3sv (const GLshort *v); +GLAPI void GLAPIENTRY glNormalPointer (GLenum type, GLsizei stride, const GLvoid *pointer); +GLAPI void GLAPIENTRY glOrtho (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +GLAPI void GLAPIENTRY glPassThrough (GLfloat token); +GLAPI void GLAPIENTRY glPixelMapfv (GLenum map, GLsizei mapsize, const GLfloat *values); +GLAPI void GLAPIENTRY glPixelMapuiv (GLenum map, GLsizei mapsize, const GLuint *values); +GLAPI void GLAPIENTRY glPixelMapusv (GLenum map, GLsizei mapsize, const GLushort *values); +GLAPI void GLAPIENTRY glPixelStoref (GLenum pname, GLfloat param); +GLAPI void GLAPIENTRY glPixelStorei (GLenum pname, GLint param); +GLAPI void GLAPIENTRY glPixelTransferf (GLenum pname, GLfloat param); +GLAPI void GLAPIENTRY glPixelTransferi (GLenum pname, GLint param); +GLAPI void GLAPIENTRY glPixelZoom (GLfloat xfactor, GLfloat yfactor); +GLAPI void GLAPIENTRY glPointSize (GLfloat size); +GLAPI void GLAPIENTRY glPolygonMode (GLenum face, GLenum mode); +GLAPI void GLAPIENTRY glPolygonOffset (GLfloat factor, GLfloat units); +GLAPI void GLAPIENTRY glPolygonStipple (const GLubyte *mask); +GLAPI void GLAPIENTRY glPopAttrib (void); +GLAPI void GLAPIENTRY glPopClientAttrib (void); +GLAPI void GLAPIENTRY glPopMatrix (void); +GLAPI void GLAPIENTRY glPopName (void); +GLAPI void GLAPIENTRY glPrioritizeTextures (GLsizei n, const GLuint *textures, const GLclampf *priorities); +GLAPI void GLAPIENTRY glPushAttrib (GLbitfield mask); +GLAPI void GLAPIENTRY glPushClientAttrib (GLbitfield mask); +GLAPI void GLAPIENTRY glPushMatrix (void); +GLAPI void GLAPIENTRY glPushName (GLuint name); +GLAPI void GLAPIENTRY glRasterPos2d (GLdouble x, GLdouble y); +GLAPI void GLAPIENTRY glRasterPos2dv (const GLdouble *v); +GLAPI void GLAPIENTRY glRasterPos2f (GLfloat x, GLfloat y); +GLAPI void GLAPIENTRY glRasterPos2fv (const GLfloat *v); +GLAPI void GLAPIENTRY glRasterPos2i (GLint x, GLint y); +GLAPI void GLAPIENTRY glRasterPos2iv (const GLint *v); +GLAPI void GLAPIENTRY glRasterPos2s (GLshort x, GLshort y); +GLAPI void GLAPIENTRY glRasterPos2sv (const GLshort *v); +GLAPI void GLAPIENTRY glRasterPos3d (GLdouble x, GLdouble y, GLdouble z); +GLAPI void GLAPIENTRY glRasterPos3dv (const GLdouble *v); +GLAPI void GLAPIENTRY glRasterPos3f (GLfloat x, GLfloat y, GLfloat z); +GLAPI void GLAPIENTRY glRasterPos3fv (const GLfloat *v); +GLAPI void GLAPIENTRY glRasterPos3i (GLint x, GLint y, GLint z); +GLAPI void GLAPIENTRY glRasterPos3iv (const GLint *v); +GLAPI void GLAPIENTRY glRasterPos3s (GLshort x, GLshort y, GLshort z); +GLAPI void GLAPIENTRY glRasterPos3sv (const GLshort *v); +GLAPI void GLAPIENTRY glRasterPos4d (GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void GLAPIENTRY glRasterPos4dv (const GLdouble *v); +GLAPI void GLAPIENTRY glRasterPos4f (GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void GLAPIENTRY glRasterPos4fv (const GLfloat *v); +GLAPI void GLAPIENTRY glRasterPos4i (GLint x, GLint y, GLint z, GLint w); +GLAPI void GLAPIENTRY glRasterPos4iv (const GLint *v); +GLAPI void GLAPIENTRY glRasterPos4s (GLshort x, GLshort y, GLshort z, GLshort w); +GLAPI void GLAPIENTRY glRasterPos4sv (const GLshort *v); +GLAPI void GLAPIENTRY glReadBuffer (GLenum mode); +GLAPI void GLAPIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels); +GLAPI void GLAPIENTRY glRectd (GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2); +GLAPI void GLAPIENTRY glRectdv (const GLdouble *v1, const GLdouble *v2); +GLAPI void GLAPIENTRY glRectf (GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2); +GLAPI void GLAPIENTRY glRectfv (const GLfloat *v1, const GLfloat *v2); +GLAPI void GLAPIENTRY glRecti (GLint x1, GLint y1, GLint x2, GLint y2); +GLAPI void GLAPIENTRY glRectiv (const GLint *v1, const GLint *v2); +GLAPI void GLAPIENTRY glRects (GLshort x1, GLshort y1, GLshort x2, GLshort y2); +GLAPI void GLAPIENTRY glRectsv (const GLshort *v1, const GLshort *v2); +GLAPI GLint GLAPIENTRY glRenderMode (GLenum mode); +GLAPI void GLAPIENTRY glRotated (GLdouble angle, GLdouble x, GLdouble y, GLdouble z); +GLAPI void GLAPIENTRY glRotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z); +GLAPI void GLAPIENTRY glScaled (GLdouble x, GLdouble y, GLdouble z); +GLAPI void GLAPIENTRY glScalef (GLfloat x, GLfloat y, GLfloat z); +GLAPI void GLAPIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void GLAPIENTRY glSelectBuffer (GLsizei size, GLuint *buffer); +GLAPI void GLAPIENTRY glShadeModel (GLenum mode); +GLAPI void GLAPIENTRY glStencilFunc (GLenum func, GLint ref, GLuint mask); +GLAPI void GLAPIENTRY glStencilMask (GLuint mask); +GLAPI void GLAPIENTRY glStencilOp (GLenum fail, GLenum zfail, GLenum zpass); +GLAPI void GLAPIENTRY glTexCoord1d (GLdouble s); +GLAPI void GLAPIENTRY glTexCoord1dv (const GLdouble *v); +GLAPI void GLAPIENTRY glTexCoord1f (GLfloat s); +GLAPI void GLAPIENTRY glTexCoord1fv (const GLfloat *v); +GLAPI void GLAPIENTRY glTexCoord1i (GLint s); +GLAPI void GLAPIENTRY glTexCoord1iv (const GLint *v); +GLAPI void GLAPIENTRY glTexCoord1s (GLshort s); +GLAPI void GLAPIENTRY glTexCoord1sv (const GLshort *v); +GLAPI void GLAPIENTRY glTexCoord2d (GLdouble s, GLdouble t); +GLAPI void GLAPIENTRY glTexCoord2dv (const GLdouble *v); +GLAPI void GLAPIENTRY glTexCoord2f (GLfloat s, GLfloat t); +GLAPI void GLAPIENTRY glTexCoord2fv (const GLfloat *v); +GLAPI void GLAPIENTRY glTexCoord2i (GLint s, GLint t); +GLAPI void GLAPIENTRY glTexCoord2iv (const GLint *v); +GLAPI void GLAPIENTRY glTexCoord2s (GLshort s, GLshort t); +GLAPI void GLAPIENTRY glTexCoord2sv (const GLshort *v); +GLAPI void GLAPIENTRY glTexCoord3d (GLdouble s, GLdouble t, GLdouble r); +GLAPI void GLAPIENTRY glTexCoord3dv (const GLdouble *v); +GLAPI void GLAPIENTRY glTexCoord3f (GLfloat s, GLfloat t, GLfloat r); +GLAPI void GLAPIENTRY glTexCoord3fv (const GLfloat *v); +GLAPI void GLAPIENTRY glTexCoord3i (GLint s, GLint t, GLint r); +GLAPI void GLAPIENTRY glTexCoord3iv (const GLint *v); +GLAPI void GLAPIENTRY glTexCoord3s (GLshort s, GLshort t, GLshort r); +GLAPI void GLAPIENTRY glTexCoord3sv (const GLshort *v); +GLAPI void GLAPIENTRY glTexCoord4d (GLdouble s, GLdouble t, GLdouble r, GLdouble q); +GLAPI void GLAPIENTRY glTexCoord4dv (const GLdouble *v); +GLAPI void GLAPIENTRY glTexCoord4f (GLfloat s, GLfloat t, GLfloat r, GLfloat q); +GLAPI void GLAPIENTRY glTexCoord4fv (const GLfloat *v); +GLAPI void GLAPIENTRY glTexCoord4i (GLint s, GLint t, GLint r, GLint q); +GLAPI void GLAPIENTRY glTexCoord4iv (const GLint *v); +GLAPI void GLAPIENTRY glTexCoord4s (GLshort s, GLshort t, GLshort r, GLshort q); +GLAPI void GLAPIENTRY glTexCoord4sv (const GLshort *v); +GLAPI void GLAPIENTRY glTexCoordPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +GLAPI void GLAPIENTRY glTexEnvf (GLenum target, GLenum pname, GLfloat param); +GLAPI void GLAPIENTRY glTexEnvfv (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void GLAPIENTRY glTexEnvi (GLenum target, GLenum pname, GLint param); +GLAPI void GLAPIENTRY glTexEnviv (GLenum target, GLenum pname, const GLint *params); +GLAPI void GLAPIENTRY glTexGend (GLenum coord, GLenum pname, GLdouble param); +GLAPI void GLAPIENTRY glTexGendv (GLenum coord, GLenum pname, const GLdouble *params); +GLAPI void GLAPIENTRY glTexGenf (GLenum coord, GLenum pname, GLfloat param); +GLAPI void GLAPIENTRY glTexGenfv (GLenum coord, GLenum pname, const GLfloat *params); +GLAPI void GLAPIENTRY glTexGeni (GLenum coord, GLenum pname, GLint param); +GLAPI void GLAPIENTRY glTexGeniv (GLenum coord, GLenum pname, const GLint *params); +GLAPI void GLAPIENTRY glTexImage1D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +GLAPI void GLAPIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +GLAPI void GLAPIENTRY glTexParameterf (GLenum target, GLenum pname, GLfloat param); +GLAPI void GLAPIENTRY glTexParameterfv (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void GLAPIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param); +GLAPI void GLAPIENTRY glTexParameteriv (GLenum target, GLenum pname, const GLint *params); +GLAPI void GLAPIENTRY glTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); +GLAPI void GLAPIENTRY glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); +GLAPI void GLAPIENTRY glTranslated (GLdouble x, GLdouble y, GLdouble z); +GLAPI void GLAPIENTRY glTranslatef (GLfloat x, GLfloat y, GLfloat z); +GLAPI void GLAPIENTRY glVertex2d (GLdouble x, GLdouble y); +GLAPI void GLAPIENTRY glVertex2dv (const GLdouble *v); +GLAPI void GLAPIENTRY glVertex2f (GLfloat x, GLfloat y); +GLAPI void GLAPIENTRY glVertex2fv (const GLfloat *v); +GLAPI void GLAPIENTRY glVertex2i (GLint x, GLint y); +GLAPI void GLAPIENTRY glVertex2iv (const GLint *v); +GLAPI void GLAPIENTRY glVertex2s (GLshort x, GLshort y); +GLAPI void GLAPIENTRY glVertex2sv (const GLshort *v); +GLAPI void GLAPIENTRY glVertex3d (GLdouble x, GLdouble y, GLdouble z); +GLAPI void GLAPIENTRY glVertex3dv (const GLdouble *v); +GLAPI void GLAPIENTRY glVertex3f (GLfloat x, GLfloat y, GLfloat z); +GLAPI void GLAPIENTRY glVertex3fv (const GLfloat *v); +GLAPI void GLAPIENTRY glVertex3i (GLint x, GLint y, GLint z); +GLAPI void GLAPIENTRY glVertex3iv (const GLint *v); +GLAPI void GLAPIENTRY glVertex3s (GLshort x, GLshort y, GLshort z); +GLAPI void GLAPIENTRY glVertex3sv (const GLshort *v); +GLAPI void GLAPIENTRY glVertex4d (GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void GLAPIENTRY glVertex4dv (const GLdouble *v); +GLAPI void GLAPIENTRY glVertex4f (GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void GLAPIENTRY glVertex4fv (const GLfloat *v); +GLAPI void GLAPIENTRY glVertex4i (GLint x, GLint y, GLint z, GLint w); +GLAPI void GLAPIENTRY glVertex4iv (const GLint *v); +GLAPI void GLAPIENTRY glVertex4s (GLshort x, GLshort y, GLshort z, GLshort w); +GLAPI void GLAPIENTRY glVertex4sv (const GLshort *v); +GLAPI void GLAPIENTRY glVertexPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +GLAPI void GLAPIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height); + +#define GLEW_VERSION_1_1 GLEW_GET_VAR(__GLEW_VERSION_1_1) + +#endif /* GL_VERSION_1_1 */ + +/* ---------------------------------- GLU ---------------------------------- */ + +/* this is where we can safely include GLU */ +#if defined(__APPLE__) && defined(__MACH__) +#include +#else +#include +#endif + +/* ----------------------------- GL_VERSION_1_2 ---------------------------- */ + +#ifndef GL_VERSION_1_2 +#define GL_VERSION_1_2 1 + +#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 +#define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13 +#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 +#define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23 +#define GL_UNSIGNED_BYTE_3_3_2 0x8032 +#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 +#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 +#define GL_UNSIGNED_INT_8_8_8_8 0x8035 +#define GL_UNSIGNED_INT_10_10_10_2 0x8036 +#define GL_RESCALE_NORMAL 0x803A +#define GL_TEXTURE_BINDING_3D 0x806A +#define GL_PACK_SKIP_IMAGES 0x806B +#define GL_PACK_IMAGE_HEIGHT 0x806C +#define GL_UNPACK_SKIP_IMAGES 0x806D +#define GL_UNPACK_IMAGE_HEIGHT 0x806E +#define GL_TEXTURE_3D 0x806F +#define GL_PROXY_TEXTURE_3D 0x8070 +#define GL_TEXTURE_DEPTH 0x8071 +#define GL_TEXTURE_WRAP_R 0x8072 +#define GL_MAX_3D_TEXTURE_SIZE 0x8073 +#define GL_BGR 0x80E0 +#define GL_BGRA 0x80E1 +#define GL_MAX_ELEMENTS_VERTICES 0x80E8 +#define GL_MAX_ELEMENTS_INDICES 0x80E9 +#define GL_CLAMP_TO_EDGE 0x812F +#define GL_TEXTURE_MIN_LOD 0x813A +#define GL_TEXTURE_MAX_LOD 0x813B +#define GL_TEXTURE_BASE_LEVEL 0x813C +#define GL_TEXTURE_MAX_LEVEL 0x813D +#define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8 +#define GL_SINGLE_COLOR 0x81F9 +#define GL_SEPARATE_SPECULAR_COLOR 0x81FA +#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 +#define GL_UNSIGNED_SHORT_5_6_5 0x8363 +#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 +#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 +#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 +#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 +#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 +#define GL_ALIASED_POINT_SIZE_RANGE 0x846D +#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E + +typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); +typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); + +#define glCopyTexSubImage3D GLEW_GET_FUN(__glewCopyTexSubImage3D) +#define glDrawRangeElements GLEW_GET_FUN(__glewDrawRangeElements) +#define glTexImage3D GLEW_GET_FUN(__glewTexImage3D) +#define glTexSubImage3D GLEW_GET_FUN(__glewTexSubImage3D) + +#define GLEW_VERSION_1_2 GLEW_GET_VAR(__GLEW_VERSION_1_2) + +#endif /* GL_VERSION_1_2 */ + +/* ----------------------------- GL_VERSION_1_3 ---------------------------- */ + +#ifndef GL_VERSION_1_3 +#define GL_VERSION_1_3 1 + +#define GL_MULTISAMPLE 0x809D +#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE 0x809F +#define GL_SAMPLE_COVERAGE 0x80A0 +#define GL_SAMPLE_BUFFERS 0x80A8 +#define GL_SAMPLES 0x80A9 +#define GL_SAMPLE_COVERAGE_VALUE 0x80AA +#define GL_SAMPLE_COVERAGE_INVERT 0x80AB +#define GL_CLAMP_TO_BORDER 0x812D +#define GL_TEXTURE0 0x84C0 +#define GL_TEXTURE1 0x84C1 +#define GL_TEXTURE2 0x84C2 +#define GL_TEXTURE3 0x84C3 +#define GL_TEXTURE4 0x84C4 +#define GL_TEXTURE5 0x84C5 +#define GL_TEXTURE6 0x84C6 +#define GL_TEXTURE7 0x84C7 +#define GL_TEXTURE8 0x84C8 +#define GL_TEXTURE9 0x84C9 +#define GL_TEXTURE10 0x84CA +#define GL_TEXTURE11 0x84CB +#define GL_TEXTURE12 0x84CC +#define GL_TEXTURE13 0x84CD +#define GL_TEXTURE14 0x84CE +#define GL_TEXTURE15 0x84CF +#define GL_TEXTURE16 0x84D0 +#define GL_TEXTURE17 0x84D1 +#define GL_TEXTURE18 0x84D2 +#define GL_TEXTURE19 0x84D3 +#define GL_TEXTURE20 0x84D4 +#define GL_TEXTURE21 0x84D5 +#define GL_TEXTURE22 0x84D6 +#define GL_TEXTURE23 0x84D7 +#define GL_TEXTURE24 0x84D8 +#define GL_TEXTURE25 0x84D9 +#define GL_TEXTURE26 0x84DA +#define GL_TEXTURE27 0x84DB +#define GL_TEXTURE28 0x84DC +#define GL_TEXTURE29 0x84DD +#define GL_TEXTURE30 0x84DE +#define GL_TEXTURE31 0x84DF +#define GL_ACTIVE_TEXTURE 0x84E0 +#define GL_CLIENT_ACTIVE_TEXTURE 0x84E1 +#define GL_MAX_TEXTURE_UNITS 0x84E2 +#define GL_TRANSPOSE_MODELVIEW_MATRIX 0x84E3 +#define GL_TRANSPOSE_PROJECTION_MATRIX 0x84E4 +#define GL_TRANSPOSE_TEXTURE_MATRIX 0x84E5 +#define GL_TRANSPOSE_COLOR_MATRIX 0x84E6 +#define GL_SUBTRACT 0x84E7 +#define GL_COMPRESSED_ALPHA 0x84E9 +#define GL_COMPRESSED_LUMINANCE 0x84EA +#define GL_COMPRESSED_LUMINANCE_ALPHA 0x84EB +#define GL_COMPRESSED_INTENSITY 0x84EC +#define GL_COMPRESSED_RGB 0x84ED +#define GL_COMPRESSED_RGBA 0x84EE +#define GL_TEXTURE_COMPRESSION_HINT 0x84EF +#define GL_NORMAL_MAP 0x8511 +#define GL_REFLECTION_MAP 0x8512 +#define GL_TEXTURE_CUBE_MAP 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C +#define GL_COMBINE 0x8570 +#define GL_COMBINE_RGB 0x8571 +#define GL_COMBINE_ALPHA 0x8572 +#define GL_RGB_SCALE 0x8573 +#define GL_ADD_SIGNED 0x8574 +#define GL_INTERPOLATE 0x8575 +#define GL_CONSTANT 0x8576 +#define GL_PRIMARY_COLOR 0x8577 +#define GL_PREVIOUS 0x8578 +#define GL_SOURCE0_RGB 0x8580 +#define GL_SOURCE1_RGB 0x8581 +#define GL_SOURCE2_RGB 0x8582 +#define GL_SOURCE0_ALPHA 0x8588 +#define GL_SOURCE1_ALPHA 0x8589 +#define GL_SOURCE2_ALPHA 0x858A +#define GL_OPERAND0_RGB 0x8590 +#define GL_OPERAND1_RGB 0x8591 +#define GL_OPERAND2_RGB 0x8592 +#define GL_OPERAND0_ALPHA 0x8598 +#define GL_OPERAND1_ALPHA 0x8599 +#define GL_OPERAND2_ALPHA 0x859A +#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0 +#define GL_TEXTURE_COMPRESSED 0x86A1 +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 +#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 +#define GL_DOT3_RGB 0x86AE +#define GL_DOT3_RGBA 0x86AF +#define GL_MULTISAMPLE_BIT 0x20000000 + +typedef void (GLAPIENTRY * PFNGLACTIVETEXTUREPROC) (GLenum texture); +typedef void (GLAPIENTRY * PFNGLCLIENTACTIVETEXTUREPROC) (GLenum texture); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint lod, GLvoid *img); +typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXDPROC) (const GLdouble m[16]); +typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXFPROC) (const GLfloat m[16]); +typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXDPROC) (const GLdouble m[16]); +typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXFPROC) (const GLfloat m[16]); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DPROC) (GLenum target, GLdouble s); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DVPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FPROC) (GLenum target, GLfloat s); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FVPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IPROC) (GLenum target, GLint s); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IVPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SPROC) (GLenum target, GLshort s); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SVPROC) (GLenum target, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DPROC) (GLenum target, GLdouble s, GLdouble t); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DVPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FPROC) (GLenum target, GLfloat s, GLfloat t); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FVPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IPROC) (GLenum target, GLint s, GLint t); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IVPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SPROC) (GLenum target, GLshort s, GLshort t); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SVPROC) (GLenum target, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DVPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FVPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IPROC) (GLenum target, GLint s, GLint t, GLint r); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IVPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SPROC) (GLenum target, GLshort s, GLshort t, GLshort r); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SVPROC) (GLenum target, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DVPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FVPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IVPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SVPROC) (GLenum target, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLSAMPLECOVERAGEPROC) (GLclampf value, GLboolean invert); + +#define glActiveTexture GLEW_GET_FUN(__glewActiveTexture) +#define glClientActiveTexture GLEW_GET_FUN(__glewClientActiveTexture) +#define glCompressedTexImage1D GLEW_GET_FUN(__glewCompressedTexImage1D) +#define glCompressedTexImage2D GLEW_GET_FUN(__glewCompressedTexImage2D) +#define glCompressedTexImage3D GLEW_GET_FUN(__glewCompressedTexImage3D) +#define glCompressedTexSubImage1D GLEW_GET_FUN(__glewCompressedTexSubImage1D) +#define glCompressedTexSubImage2D GLEW_GET_FUN(__glewCompressedTexSubImage2D) +#define glCompressedTexSubImage3D GLEW_GET_FUN(__glewCompressedTexSubImage3D) +#define glGetCompressedTexImage GLEW_GET_FUN(__glewGetCompressedTexImage) +#define glLoadTransposeMatrixd GLEW_GET_FUN(__glewLoadTransposeMatrixd) +#define glLoadTransposeMatrixf GLEW_GET_FUN(__glewLoadTransposeMatrixf) +#define glMultTransposeMatrixd GLEW_GET_FUN(__glewMultTransposeMatrixd) +#define glMultTransposeMatrixf GLEW_GET_FUN(__glewMultTransposeMatrixf) +#define glMultiTexCoord1d GLEW_GET_FUN(__glewMultiTexCoord1d) +#define glMultiTexCoord1dv GLEW_GET_FUN(__glewMultiTexCoord1dv) +#define glMultiTexCoord1f GLEW_GET_FUN(__glewMultiTexCoord1f) +#define glMultiTexCoord1fv GLEW_GET_FUN(__glewMultiTexCoord1fv) +#define glMultiTexCoord1i GLEW_GET_FUN(__glewMultiTexCoord1i) +#define glMultiTexCoord1iv GLEW_GET_FUN(__glewMultiTexCoord1iv) +#define glMultiTexCoord1s GLEW_GET_FUN(__glewMultiTexCoord1s) +#define glMultiTexCoord1sv GLEW_GET_FUN(__glewMultiTexCoord1sv) +#define glMultiTexCoord2d GLEW_GET_FUN(__glewMultiTexCoord2d) +#define glMultiTexCoord2dv GLEW_GET_FUN(__glewMultiTexCoord2dv) +#define glMultiTexCoord2f GLEW_GET_FUN(__glewMultiTexCoord2f) +#define glMultiTexCoord2fv GLEW_GET_FUN(__glewMultiTexCoord2fv) +#define glMultiTexCoord2i GLEW_GET_FUN(__glewMultiTexCoord2i) +#define glMultiTexCoord2iv GLEW_GET_FUN(__glewMultiTexCoord2iv) +#define glMultiTexCoord2s GLEW_GET_FUN(__glewMultiTexCoord2s) +#define glMultiTexCoord2sv GLEW_GET_FUN(__glewMultiTexCoord2sv) +#define glMultiTexCoord3d GLEW_GET_FUN(__glewMultiTexCoord3d) +#define glMultiTexCoord3dv GLEW_GET_FUN(__glewMultiTexCoord3dv) +#define glMultiTexCoord3f GLEW_GET_FUN(__glewMultiTexCoord3f) +#define glMultiTexCoord3fv GLEW_GET_FUN(__glewMultiTexCoord3fv) +#define glMultiTexCoord3i GLEW_GET_FUN(__glewMultiTexCoord3i) +#define glMultiTexCoord3iv GLEW_GET_FUN(__glewMultiTexCoord3iv) +#define glMultiTexCoord3s GLEW_GET_FUN(__glewMultiTexCoord3s) +#define glMultiTexCoord3sv GLEW_GET_FUN(__glewMultiTexCoord3sv) +#define glMultiTexCoord4d GLEW_GET_FUN(__glewMultiTexCoord4d) +#define glMultiTexCoord4dv GLEW_GET_FUN(__glewMultiTexCoord4dv) +#define glMultiTexCoord4f GLEW_GET_FUN(__glewMultiTexCoord4f) +#define glMultiTexCoord4fv GLEW_GET_FUN(__glewMultiTexCoord4fv) +#define glMultiTexCoord4i GLEW_GET_FUN(__glewMultiTexCoord4i) +#define glMultiTexCoord4iv GLEW_GET_FUN(__glewMultiTexCoord4iv) +#define glMultiTexCoord4s GLEW_GET_FUN(__glewMultiTexCoord4s) +#define glMultiTexCoord4sv GLEW_GET_FUN(__glewMultiTexCoord4sv) +#define glSampleCoverage GLEW_GET_FUN(__glewSampleCoverage) + +#define GLEW_VERSION_1_3 GLEW_GET_VAR(__GLEW_VERSION_1_3) + +#endif /* GL_VERSION_1_3 */ + +/* ----------------------------- GL_VERSION_1_4 ---------------------------- */ + +#ifndef GL_VERSION_1_4 +#define GL_VERSION_1_4 1 + +#define GL_BLEND_DST_RGB 0x80C8 +#define GL_BLEND_SRC_RGB 0x80C9 +#define GL_BLEND_DST_ALPHA 0x80CA +#define GL_BLEND_SRC_ALPHA 0x80CB +#define GL_POINT_SIZE_MIN 0x8126 +#define GL_POINT_SIZE_MAX 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE 0x8128 +#define GL_POINT_DISTANCE_ATTENUATION 0x8129 +#define GL_GENERATE_MIPMAP 0x8191 +#define GL_GENERATE_MIPMAP_HINT 0x8192 +#define GL_DEPTH_COMPONENT16 0x81A5 +#define GL_DEPTH_COMPONENT24 0x81A6 +#define GL_DEPTH_COMPONENT32 0x81A7 +#define GL_MIRRORED_REPEAT 0x8370 +#define GL_FOG_COORDINATE_SOURCE 0x8450 +#define GL_FOG_COORDINATE 0x8451 +#define GL_FRAGMENT_DEPTH 0x8452 +#define GL_CURRENT_FOG_COORDINATE 0x8453 +#define GL_FOG_COORDINATE_ARRAY_TYPE 0x8454 +#define GL_FOG_COORDINATE_ARRAY_STRIDE 0x8455 +#define GL_FOG_COORDINATE_ARRAY_POINTER 0x8456 +#define GL_FOG_COORDINATE_ARRAY 0x8457 +#define GL_COLOR_SUM 0x8458 +#define GL_CURRENT_SECONDARY_COLOR 0x8459 +#define GL_SECONDARY_COLOR_ARRAY_SIZE 0x845A +#define GL_SECONDARY_COLOR_ARRAY_TYPE 0x845B +#define GL_SECONDARY_COLOR_ARRAY_STRIDE 0x845C +#define GL_SECONDARY_COLOR_ARRAY_POINTER 0x845D +#define GL_SECONDARY_COLOR_ARRAY 0x845E +#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD +#define GL_TEXTURE_FILTER_CONTROL 0x8500 +#define GL_TEXTURE_LOD_BIAS 0x8501 +#define GL_INCR_WRAP 0x8507 +#define GL_DECR_WRAP 0x8508 +#define GL_TEXTURE_DEPTH_SIZE 0x884A +#define GL_DEPTH_TEXTURE_MODE 0x884B +#define GL_TEXTURE_COMPARE_MODE 0x884C +#define GL_TEXTURE_COMPARE_FUNC 0x884D +#define GL_COMPARE_R_TO_TEXTURE 0x884E + +typedef void (GLAPIENTRY * PFNGLBLENDCOLORPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); +typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONPROC) (GLenum mode); +typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +typedef void (GLAPIENTRY * PFNGLFOGCOORDPOINTERPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (GLAPIENTRY * PFNGLFOGCOORDDPROC) (GLdouble coord); +typedef void (GLAPIENTRY * PFNGLFOGCOORDDVPROC) (const GLdouble *coord); +typedef void (GLAPIENTRY * PFNGLFOGCOORDFPROC) (GLfloat coord); +typedef void (GLAPIENTRY * PFNGLFOGCOORDFVPROC) (const GLfloat *coord); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSPROC) (GLenum mode, GLint *first, GLsizei *count, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSPROC) (GLenum mode, GLsizei *count, GLenum type, const GLvoid **indices, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFVPROC) (GLenum pname, GLfloat *params); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BPROC) (GLbyte red, GLbyte green, GLbyte blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BVPROC) (const GLbyte *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DPROC) (GLdouble red, GLdouble green, GLdouble blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DVPROC) (const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FPROC) (GLfloat red, GLfloat green, GLfloat blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FVPROC) (const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IPROC) (GLint red, GLint green, GLint blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IVPROC) (const GLint *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SPROC) (GLshort red, GLshort green, GLshort blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SVPROC) (const GLshort *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBPROC) (GLubyte red, GLubyte green, GLubyte blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBVPROC) (const GLubyte *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIPROC) (GLuint red, GLuint green, GLuint blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIVPROC) (const GLuint *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USPROC) (GLushort red, GLushort green, GLushort blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USVPROC) (const GLushort *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORPOINTERPROC) (GLint size, GLenum type, GLsizei stride, GLvoid *pointer); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DPROC) (GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DVPROC) (const GLdouble *p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FPROC) (GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FVPROC) (const GLfloat *p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IPROC) (GLint x, GLint y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IVPROC) (const GLint *p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SPROC) (GLshort x, GLshort y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SVPROC) (const GLshort *p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DVPROC) (const GLdouble *p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FVPROC) (const GLfloat *p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IPROC) (GLint x, GLint y, GLint z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IVPROC) (const GLint *p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SPROC) (GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SVPROC) (const GLshort *p); + +#define glBlendColor GLEW_GET_FUN(__glewBlendColor) +#define glBlendEquation GLEW_GET_FUN(__glewBlendEquation) +#define glBlendFuncSeparate GLEW_GET_FUN(__glewBlendFuncSeparate) +#define glFogCoordPointer GLEW_GET_FUN(__glewFogCoordPointer) +#define glFogCoordd GLEW_GET_FUN(__glewFogCoordd) +#define glFogCoorddv GLEW_GET_FUN(__glewFogCoorddv) +#define glFogCoordf GLEW_GET_FUN(__glewFogCoordf) +#define glFogCoordfv GLEW_GET_FUN(__glewFogCoordfv) +#define glMultiDrawArrays GLEW_GET_FUN(__glewMultiDrawArrays) +#define glMultiDrawElements GLEW_GET_FUN(__glewMultiDrawElements) +#define glPointParameterf GLEW_GET_FUN(__glewPointParameterf) +#define glPointParameterfv GLEW_GET_FUN(__glewPointParameterfv) +#define glSecondaryColor3b GLEW_GET_FUN(__glewSecondaryColor3b) +#define glSecondaryColor3bv GLEW_GET_FUN(__glewSecondaryColor3bv) +#define glSecondaryColor3d GLEW_GET_FUN(__glewSecondaryColor3d) +#define glSecondaryColor3dv GLEW_GET_FUN(__glewSecondaryColor3dv) +#define glSecondaryColor3f GLEW_GET_FUN(__glewSecondaryColor3f) +#define glSecondaryColor3fv GLEW_GET_FUN(__glewSecondaryColor3fv) +#define glSecondaryColor3i GLEW_GET_FUN(__glewSecondaryColor3i) +#define glSecondaryColor3iv GLEW_GET_FUN(__glewSecondaryColor3iv) +#define glSecondaryColor3s GLEW_GET_FUN(__glewSecondaryColor3s) +#define glSecondaryColor3sv GLEW_GET_FUN(__glewSecondaryColor3sv) +#define glSecondaryColor3ub GLEW_GET_FUN(__glewSecondaryColor3ub) +#define glSecondaryColor3ubv GLEW_GET_FUN(__glewSecondaryColor3ubv) +#define glSecondaryColor3ui GLEW_GET_FUN(__glewSecondaryColor3ui) +#define glSecondaryColor3uiv GLEW_GET_FUN(__glewSecondaryColor3uiv) +#define glSecondaryColor3us GLEW_GET_FUN(__glewSecondaryColor3us) +#define glSecondaryColor3usv GLEW_GET_FUN(__glewSecondaryColor3usv) +#define glSecondaryColorPointer GLEW_GET_FUN(__glewSecondaryColorPointer) +#define glWindowPos2d GLEW_GET_FUN(__glewWindowPos2d) +#define glWindowPos2dv GLEW_GET_FUN(__glewWindowPos2dv) +#define glWindowPos2f GLEW_GET_FUN(__glewWindowPos2f) +#define glWindowPos2fv GLEW_GET_FUN(__glewWindowPos2fv) +#define glWindowPos2i GLEW_GET_FUN(__glewWindowPos2i) +#define glWindowPos2iv GLEW_GET_FUN(__glewWindowPos2iv) +#define glWindowPos2s GLEW_GET_FUN(__glewWindowPos2s) +#define glWindowPos2sv GLEW_GET_FUN(__glewWindowPos2sv) +#define glWindowPos3d GLEW_GET_FUN(__glewWindowPos3d) +#define glWindowPos3dv GLEW_GET_FUN(__glewWindowPos3dv) +#define glWindowPos3f GLEW_GET_FUN(__glewWindowPos3f) +#define glWindowPos3fv GLEW_GET_FUN(__glewWindowPos3fv) +#define glWindowPos3i GLEW_GET_FUN(__glewWindowPos3i) +#define glWindowPos3iv GLEW_GET_FUN(__glewWindowPos3iv) +#define glWindowPos3s GLEW_GET_FUN(__glewWindowPos3s) +#define glWindowPos3sv GLEW_GET_FUN(__glewWindowPos3sv) + +#define GLEW_VERSION_1_4 GLEW_GET_VAR(__GLEW_VERSION_1_4) + +#endif /* GL_VERSION_1_4 */ + +/* ----------------------------- GL_VERSION_1_5 ---------------------------- */ + +#ifndef GL_VERSION_1_5 +#define GL_VERSION_1_5 1 + +#define GL_FOG_COORD_SRC GL_FOG_COORDINATE_SOURCE +#define GL_FOG_COORD GL_FOG_COORDINATE +#define GL_FOG_COORD_ARRAY GL_FOG_COORDINATE_ARRAY +#define GL_SRC0_RGB GL_SOURCE0_RGB +#define GL_FOG_COORD_ARRAY_POINTER GL_FOG_COORDINATE_ARRAY_POINTER +#define GL_FOG_COORD_ARRAY_TYPE GL_FOG_COORDINATE_ARRAY_TYPE +#define GL_SRC1_ALPHA GL_SOURCE1_ALPHA +#define GL_CURRENT_FOG_COORD GL_CURRENT_FOG_COORDINATE +#define GL_FOG_COORD_ARRAY_STRIDE GL_FOG_COORDINATE_ARRAY_STRIDE +#define GL_SRC0_ALPHA GL_SOURCE0_ALPHA +#define GL_SRC1_RGB GL_SOURCE1_RGB +#define GL_FOG_COORD_ARRAY_BUFFER_BINDING GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING +#define GL_SRC2_ALPHA GL_SOURCE2_ALPHA +#define GL_SRC2_RGB GL_SOURCE2_RGB +#define GL_BUFFER_SIZE 0x8764 +#define GL_BUFFER_USAGE 0x8765 +#define GL_QUERY_COUNTER_BITS 0x8864 +#define GL_CURRENT_QUERY 0x8865 +#define GL_QUERY_RESULT 0x8866 +#define GL_QUERY_RESULT_AVAILABLE 0x8867 +#define GL_ARRAY_BUFFER 0x8892 +#define GL_ELEMENT_ARRAY_BUFFER 0x8893 +#define GL_ARRAY_BUFFER_BINDING 0x8894 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 +#define GL_VERTEX_ARRAY_BUFFER_BINDING 0x8896 +#define GL_NORMAL_ARRAY_BUFFER_BINDING 0x8897 +#define GL_COLOR_ARRAY_BUFFER_BINDING 0x8898 +#define GL_INDEX_ARRAY_BUFFER_BINDING 0x8899 +#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A +#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING 0x889B +#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING 0x889C +#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING 0x889D +#define GL_WEIGHT_ARRAY_BUFFER_BINDING 0x889E +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F +#define GL_READ_ONLY 0x88B8 +#define GL_WRITE_ONLY 0x88B9 +#define GL_READ_WRITE 0x88BA +#define GL_BUFFER_ACCESS 0x88BB +#define GL_BUFFER_MAPPED 0x88BC +#define GL_BUFFER_MAP_POINTER 0x88BD +#define GL_STREAM_DRAW 0x88E0 +#define GL_STREAM_READ 0x88E1 +#define GL_STREAM_COPY 0x88E2 +#define GL_STATIC_DRAW 0x88E4 +#define GL_STATIC_READ 0x88E5 +#define GL_STATIC_COPY 0x88E6 +#define GL_DYNAMIC_DRAW 0x88E8 +#define GL_DYNAMIC_READ 0x88E9 +#define GL_DYNAMIC_COPY 0x88EA +#define GL_SAMPLES_PASSED 0x8914 + +typedef ptrdiff_t GLsizeiptr; +typedef ptrdiff_t GLintptr; + +typedef void (GLAPIENTRY * PFNGLBEGINQUERYPROC) (GLenum target, GLuint id); +typedef void (GLAPIENTRY * PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer); +typedef void (GLAPIENTRY * PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage); +typedef void (GLAPIENTRY * PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data); +typedef void (GLAPIENTRY * PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint* buffers); +typedef void (GLAPIENTRY * PFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint* ids); +typedef void (GLAPIENTRY * PFNGLENDQUERYPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLGENBUFFERSPROC) (GLsizei n, GLuint* buffers); +typedef void (GLAPIENTRY * PFNGLGENQUERIESPROC) (GLsizei n, GLuint* ids); +typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname, GLvoid** params); +typedef void (GLAPIENTRY * PFNGLGETBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLvoid* data); +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTIVPROC) (GLuint id, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint* params); +typedef void (GLAPIENTRY * PFNGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISBUFFERPROC) (GLuint buffer); +typedef GLboolean (GLAPIENTRY * PFNGLISQUERYPROC) (GLuint id); +typedef GLvoid* (GLAPIENTRY * PFNGLMAPBUFFERPROC) (GLenum target, GLenum access); +typedef GLboolean (GLAPIENTRY * PFNGLUNMAPBUFFERPROC) (GLenum target); + +#define glBeginQuery GLEW_GET_FUN(__glewBeginQuery) +#define glBindBuffer GLEW_GET_FUN(__glewBindBuffer) +#define glBufferData GLEW_GET_FUN(__glewBufferData) +#define glBufferSubData GLEW_GET_FUN(__glewBufferSubData) +#define glDeleteBuffers GLEW_GET_FUN(__glewDeleteBuffers) +#define glDeleteQueries GLEW_GET_FUN(__glewDeleteQueries) +#define glEndQuery GLEW_GET_FUN(__glewEndQuery) +#define glGenBuffers GLEW_GET_FUN(__glewGenBuffers) +#define glGenQueries GLEW_GET_FUN(__glewGenQueries) +#define glGetBufferParameteriv GLEW_GET_FUN(__glewGetBufferParameteriv) +#define glGetBufferPointerv GLEW_GET_FUN(__glewGetBufferPointerv) +#define glGetBufferSubData GLEW_GET_FUN(__glewGetBufferSubData) +#define glGetQueryObjectiv GLEW_GET_FUN(__glewGetQueryObjectiv) +#define glGetQueryObjectuiv GLEW_GET_FUN(__glewGetQueryObjectuiv) +#define glGetQueryiv GLEW_GET_FUN(__glewGetQueryiv) +#define glIsBuffer GLEW_GET_FUN(__glewIsBuffer) +#define glIsQuery GLEW_GET_FUN(__glewIsQuery) +#define glMapBuffer GLEW_GET_FUN(__glewMapBuffer) +#define glUnmapBuffer GLEW_GET_FUN(__glewUnmapBuffer) + +#define GLEW_VERSION_1_5 GLEW_GET_VAR(__GLEW_VERSION_1_5) + +#endif /* GL_VERSION_1_5 */ + +/* ----------------------------- GL_VERSION_2_0 ---------------------------- */ + +#ifndef GL_VERSION_2_0 +#define GL_VERSION_2_0 1 + +#define GL_BLEND_EQUATION_RGB GL_BLEND_EQUATION +#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 +#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 +#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 +#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 +#define GL_CURRENT_VERTEX_ATTRIB 0x8626 +#define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE 0x8643 +#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 +#define GL_STENCIL_BACK_FUNC 0x8800 +#define GL_STENCIL_BACK_FAIL 0x8801 +#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802 +#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803 +#define GL_MAX_DRAW_BUFFERS 0x8824 +#define GL_DRAW_BUFFER0 0x8825 +#define GL_DRAW_BUFFER1 0x8826 +#define GL_DRAW_BUFFER2 0x8827 +#define GL_DRAW_BUFFER3 0x8828 +#define GL_DRAW_BUFFER4 0x8829 +#define GL_DRAW_BUFFER5 0x882A +#define GL_DRAW_BUFFER6 0x882B +#define GL_DRAW_BUFFER7 0x882C +#define GL_DRAW_BUFFER8 0x882D +#define GL_DRAW_BUFFER9 0x882E +#define GL_DRAW_BUFFER10 0x882F +#define GL_DRAW_BUFFER11 0x8830 +#define GL_DRAW_BUFFER12 0x8831 +#define GL_DRAW_BUFFER13 0x8832 +#define GL_DRAW_BUFFER14 0x8833 +#define GL_DRAW_BUFFER15 0x8834 +#define GL_BLEND_EQUATION_ALPHA 0x883D +#define GL_POINT_SPRITE 0x8861 +#define GL_COORD_REPLACE 0x8862 +#define GL_MAX_VERTEX_ATTRIBS 0x8869 +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A +#define GL_MAX_TEXTURE_COORDS 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 +#define GL_FRAGMENT_SHADER 0x8B30 +#define GL_VERTEX_SHADER 0x8B31 +#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49 +#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A +#define GL_MAX_VARYING_FLOATS 0x8B4B +#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C +#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D +#define GL_SHADER_TYPE 0x8B4F +#define GL_FLOAT_VEC2 0x8B50 +#define GL_FLOAT_VEC3 0x8B51 +#define GL_FLOAT_VEC4 0x8B52 +#define GL_INT_VEC2 0x8B53 +#define GL_INT_VEC3 0x8B54 +#define GL_INT_VEC4 0x8B55 +#define GL_BOOL 0x8B56 +#define GL_BOOL_VEC2 0x8B57 +#define GL_BOOL_VEC3 0x8B58 +#define GL_BOOL_VEC4 0x8B59 +#define GL_FLOAT_MAT2 0x8B5A +#define GL_FLOAT_MAT3 0x8B5B +#define GL_FLOAT_MAT4 0x8B5C +#define GL_SAMPLER_1D 0x8B5D +#define GL_SAMPLER_2D 0x8B5E +#define GL_SAMPLER_3D 0x8B5F +#define GL_SAMPLER_CUBE 0x8B60 +#define GL_SAMPLER_1D_SHADOW 0x8B61 +#define GL_SAMPLER_2D_SHADOW 0x8B62 +#define GL_DELETE_STATUS 0x8B80 +#define GL_COMPILE_STATUS 0x8B81 +#define GL_LINK_STATUS 0x8B82 +#define GL_VALIDATE_STATUS 0x8B83 +#define GL_INFO_LOG_LENGTH 0x8B84 +#define GL_ATTACHED_SHADERS 0x8B85 +#define GL_ACTIVE_UNIFORMS 0x8B86 +#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 +#define GL_SHADER_SOURCE_LENGTH 0x8B88 +#define GL_ACTIVE_ATTRIBUTES 0x8B89 +#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A +#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B +#define GL_SHADING_LANGUAGE_VERSION 0x8B8C +#define GL_CURRENT_PROGRAM 0x8B8D +#define GL_POINT_SPRITE_COORD_ORIGIN 0x8CA0 +#define GL_LOWER_LEFT 0x8CA1 +#define GL_UPPER_LEFT 0x8CA2 +#define GL_STENCIL_BACK_REF 0x8CA3 +#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4 +#define GL_STENCIL_BACK_WRITEMASK 0x8CA5 + +typedef char GLchar; + +typedef void (GLAPIENTRY * PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader); +typedef void (GLAPIENTRY * PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar* name); +typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum, GLenum); +typedef void (GLAPIENTRY * PFNGLCOMPILESHADERPROC) (GLuint shader); +typedef GLuint (GLAPIENTRY * PFNGLCREATEPROGRAMPROC) (void); +typedef GLuint (GLAPIENTRY * PFNGLCREATESHADERPROC) (GLenum type); +typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMPROC) (GLuint program); +typedef void (GLAPIENTRY * PFNGLDELETESHADERPROC) (GLuint shader); +typedef void (GLAPIENTRY * PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader); +typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint); +typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSPROC) (GLsizei n, const GLenum* bufs); +typedef void (GLAPIENTRY * PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint); +typedef void (GLAPIENTRY * PFNGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei maxLength, GLsizei* length, GLint* size, GLenum* type, GLchar* name); +typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei maxLength, GLsizei* length, GLint* size, GLenum* type, GLchar* name); +typedef void (GLAPIENTRY * PFNGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei* count, GLuint* shaders); +typedef GLint (GLAPIENTRY * PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar* name); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei* length, GLchar* infoLog); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint* param); +typedef void (GLAPIENTRY * PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* infoLog); +typedef void (GLAPIENTRY * PFNGLGETSHADERSOURCEPROC) (GLint obj, GLsizei maxLength, GLsizei* length, GLchar* source); +typedef void (GLAPIENTRY * PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint* param); +typedef GLint (GLAPIENTRY * PFNGLGETUNIFORMLOCATIONPROC) (GLint programObj, const GLchar* name); +typedef void (GLAPIENTRY * PFNGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint, GLenum, GLvoid*); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBDVPROC) (GLuint, GLenum, GLdouble*); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBFVPROC) (GLuint, GLenum, GLfloat*); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIVPROC) (GLuint, GLenum, GLint*); +typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMPROC) (GLuint program); +typedef GLboolean (GLAPIENTRY * PFNGLISSHADERPROC) (GLuint shader); +typedef void (GLAPIENTRY * PFNGLLINKPROGRAMPROC) (GLuint program); +typedef void (GLAPIENTRY * PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar** strings, const GLint* lengths); +typedef void (GLAPIENTRY * PFNGLSTENCILFUNCSEPARATEPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); +typedef void (GLAPIENTRY * PFNGLSTENCILMASKSEPARATEPROC) (GLenum, GLuint); +typedef void (GLAPIENTRY * PFNGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +typedef void (GLAPIENTRY * PFNGLUNIFORM1FPROC) (GLint location, GLfloat v0); +typedef void (GLAPIENTRY * PFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM1IPROC) (GLint location, GLint v0); +typedef void (GLAPIENTRY * PFNGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1); +typedef void (GLAPIENTRY * PFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1); +typedef void (GLAPIENTRY * PFNGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (GLAPIENTRY * PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2); +typedef void (GLAPIENTRY * PFNGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (GLAPIENTRY * PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (GLAPIENTRY * PFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUSEPROGRAMPROC) (GLuint program); +typedef void (GLAPIENTRY * PFNGLVALIDATEPROGRAMPROC) (GLuint program); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DPROC) (GLuint index, GLdouble x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SPROC) (GLuint index, GLshort x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SVPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SPROC) (GLuint index, GLshort x, GLshort y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SVPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SVPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NBVPROC) (GLuint index, const GLbyte* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NIVPROC) (GLuint index, const GLint* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NSVPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBVPROC) (GLuint index, const GLubyte* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUIVPROC) (GLuint index, const GLuint* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUSVPROC) (GLuint index, const GLushort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4BVPROC) (GLuint index, const GLbyte* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4IVPROC) (GLuint index, const GLint* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SVPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBVPROC) (GLuint index, const GLubyte* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UIVPROC) (GLuint index, const GLuint* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4USVPROC) (GLuint index, const GLushort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* pointer); + +#define glAttachShader GLEW_GET_FUN(__glewAttachShader) +#define glBindAttribLocation GLEW_GET_FUN(__glewBindAttribLocation) +#define glBlendEquationSeparate GLEW_GET_FUN(__glewBlendEquationSeparate) +#define glCompileShader GLEW_GET_FUN(__glewCompileShader) +#define glCreateProgram GLEW_GET_FUN(__glewCreateProgram) +#define glCreateShader GLEW_GET_FUN(__glewCreateShader) +#define glDeleteProgram GLEW_GET_FUN(__glewDeleteProgram) +#define glDeleteShader GLEW_GET_FUN(__glewDeleteShader) +#define glDetachShader GLEW_GET_FUN(__glewDetachShader) +#define glDisableVertexAttribArray GLEW_GET_FUN(__glewDisableVertexAttribArray) +#define glDrawBuffers GLEW_GET_FUN(__glewDrawBuffers) +#define glEnableVertexAttribArray GLEW_GET_FUN(__glewEnableVertexAttribArray) +#define glGetActiveAttrib GLEW_GET_FUN(__glewGetActiveAttrib) +#define glGetActiveUniform GLEW_GET_FUN(__glewGetActiveUniform) +#define glGetAttachedShaders GLEW_GET_FUN(__glewGetAttachedShaders) +#define glGetAttribLocation GLEW_GET_FUN(__glewGetAttribLocation) +#define glGetProgramInfoLog GLEW_GET_FUN(__glewGetProgramInfoLog) +#define glGetProgramiv GLEW_GET_FUN(__glewGetProgramiv) +#define glGetShaderInfoLog GLEW_GET_FUN(__glewGetShaderInfoLog) +#define glGetShaderSource GLEW_GET_FUN(__glewGetShaderSource) +#define glGetShaderiv GLEW_GET_FUN(__glewGetShaderiv) +#define glGetUniformLocation GLEW_GET_FUN(__glewGetUniformLocation) +#define glGetUniformfv GLEW_GET_FUN(__glewGetUniformfv) +#define glGetUniformiv GLEW_GET_FUN(__glewGetUniformiv) +#define glGetVertexAttribPointerv GLEW_GET_FUN(__glewGetVertexAttribPointerv) +#define glGetVertexAttribdv GLEW_GET_FUN(__glewGetVertexAttribdv) +#define glGetVertexAttribfv GLEW_GET_FUN(__glewGetVertexAttribfv) +#define glGetVertexAttribiv GLEW_GET_FUN(__glewGetVertexAttribiv) +#define glIsProgram GLEW_GET_FUN(__glewIsProgram) +#define glIsShader GLEW_GET_FUN(__glewIsShader) +#define glLinkProgram GLEW_GET_FUN(__glewLinkProgram) +#define glShaderSource GLEW_GET_FUN(__glewShaderSource) +#define glStencilFuncSeparate GLEW_GET_FUN(__glewStencilFuncSeparate) +#define glStencilMaskSeparate GLEW_GET_FUN(__glewStencilMaskSeparate) +#define glStencilOpSeparate GLEW_GET_FUN(__glewStencilOpSeparate) +#define glUniform1f GLEW_GET_FUN(__glewUniform1f) +#define glUniform1fv GLEW_GET_FUN(__glewUniform1fv) +#define glUniform1i GLEW_GET_FUN(__glewUniform1i) +#define glUniform1iv GLEW_GET_FUN(__glewUniform1iv) +#define glUniform2f GLEW_GET_FUN(__glewUniform2f) +#define glUniform2fv GLEW_GET_FUN(__glewUniform2fv) +#define glUniform2i GLEW_GET_FUN(__glewUniform2i) +#define glUniform2iv GLEW_GET_FUN(__glewUniform2iv) +#define glUniform3f GLEW_GET_FUN(__glewUniform3f) +#define glUniform3fv GLEW_GET_FUN(__glewUniform3fv) +#define glUniform3i GLEW_GET_FUN(__glewUniform3i) +#define glUniform3iv GLEW_GET_FUN(__glewUniform3iv) +#define glUniform4f GLEW_GET_FUN(__glewUniform4f) +#define glUniform4fv GLEW_GET_FUN(__glewUniform4fv) +#define glUniform4i GLEW_GET_FUN(__glewUniform4i) +#define glUniform4iv GLEW_GET_FUN(__glewUniform4iv) +#define glUniformMatrix2fv GLEW_GET_FUN(__glewUniformMatrix2fv) +#define glUniformMatrix3fv GLEW_GET_FUN(__glewUniformMatrix3fv) +#define glUniformMatrix4fv GLEW_GET_FUN(__glewUniformMatrix4fv) +#define glUseProgram GLEW_GET_FUN(__glewUseProgram) +#define glValidateProgram GLEW_GET_FUN(__glewValidateProgram) +#define glVertexAttrib1d GLEW_GET_FUN(__glewVertexAttrib1d) +#define glVertexAttrib1dv GLEW_GET_FUN(__glewVertexAttrib1dv) +#define glVertexAttrib1f GLEW_GET_FUN(__glewVertexAttrib1f) +#define glVertexAttrib1fv GLEW_GET_FUN(__glewVertexAttrib1fv) +#define glVertexAttrib1s GLEW_GET_FUN(__glewVertexAttrib1s) +#define glVertexAttrib1sv GLEW_GET_FUN(__glewVertexAttrib1sv) +#define glVertexAttrib2d GLEW_GET_FUN(__glewVertexAttrib2d) +#define glVertexAttrib2dv GLEW_GET_FUN(__glewVertexAttrib2dv) +#define glVertexAttrib2f GLEW_GET_FUN(__glewVertexAttrib2f) +#define glVertexAttrib2fv GLEW_GET_FUN(__glewVertexAttrib2fv) +#define glVertexAttrib2s GLEW_GET_FUN(__glewVertexAttrib2s) +#define glVertexAttrib2sv GLEW_GET_FUN(__glewVertexAttrib2sv) +#define glVertexAttrib3d GLEW_GET_FUN(__glewVertexAttrib3d) +#define glVertexAttrib3dv GLEW_GET_FUN(__glewVertexAttrib3dv) +#define glVertexAttrib3f GLEW_GET_FUN(__glewVertexAttrib3f) +#define glVertexAttrib3fv GLEW_GET_FUN(__glewVertexAttrib3fv) +#define glVertexAttrib3s GLEW_GET_FUN(__glewVertexAttrib3s) +#define glVertexAttrib3sv GLEW_GET_FUN(__glewVertexAttrib3sv) +#define glVertexAttrib4Nbv GLEW_GET_FUN(__glewVertexAttrib4Nbv) +#define glVertexAttrib4Niv GLEW_GET_FUN(__glewVertexAttrib4Niv) +#define glVertexAttrib4Nsv GLEW_GET_FUN(__glewVertexAttrib4Nsv) +#define glVertexAttrib4Nub GLEW_GET_FUN(__glewVertexAttrib4Nub) +#define glVertexAttrib4Nubv GLEW_GET_FUN(__glewVertexAttrib4Nubv) +#define glVertexAttrib4Nuiv GLEW_GET_FUN(__glewVertexAttrib4Nuiv) +#define glVertexAttrib4Nusv GLEW_GET_FUN(__glewVertexAttrib4Nusv) +#define glVertexAttrib4bv GLEW_GET_FUN(__glewVertexAttrib4bv) +#define glVertexAttrib4d GLEW_GET_FUN(__glewVertexAttrib4d) +#define glVertexAttrib4dv GLEW_GET_FUN(__glewVertexAttrib4dv) +#define glVertexAttrib4f GLEW_GET_FUN(__glewVertexAttrib4f) +#define glVertexAttrib4fv GLEW_GET_FUN(__glewVertexAttrib4fv) +#define glVertexAttrib4iv GLEW_GET_FUN(__glewVertexAttrib4iv) +#define glVertexAttrib4s GLEW_GET_FUN(__glewVertexAttrib4s) +#define glVertexAttrib4sv GLEW_GET_FUN(__glewVertexAttrib4sv) +#define glVertexAttrib4ubv GLEW_GET_FUN(__glewVertexAttrib4ubv) +#define glVertexAttrib4uiv GLEW_GET_FUN(__glewVertexAttrib4uiv) +#define glVertexAttrib4usv GLEW_GET_FUN(__glewVertexAttrib4usv) +#define glVertexAttribPointer GLEW_GET_FUN(__glewVertexAttribPointer) + +#define GLEW_VERSION_2_0 GLEW_GET_VAR(__GLEW_VERSION_2_0) + +#endif /* GL_VERSION_2_0 */ + +/* ----------------------------- GL_VERSION_2_1 ---------------------------- */ + +#ifndef GL_VERSION_2_1 +#define GL_VERSION_2_1 1 + +#define GL_CURRENT_RASTER_SECONDARY_COLOR 0x845F +#define GL_PIXEL_PACK_BUFFER 0x88EB +#define GL_PIXEL_UNPACK_BUFFER 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF +#define GL_SRGB 0x8C40 +#define GL_SRGB8 0x8C41 +#define GL_SRGB_ALPHA 0x8C42 +#define GL_SRGB8_ALPHA8 0x8C43 +#define GL_SLUMINANCE_ALPHA 0x8C44 +#define GL_SLUMINANCE8_ALPHA8 0x8C45 +#define GL_SLUMINANCE 0x8C46 +#define GL_SLUMINANCE8 0x8C47 +#define GL_COMPRESSED_SRGB 0x8C48 +#define GL_COMPRESSED_SRGB_ALPHA 0x8C49 +#define GL_COMPRESSED_SLUMINANCE 0x8C4A +#define GL_COMPRESSED_SLUMINANCE_ALPHA 0x8C4B + +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); + +#define glUniformMatrix2x3fv GLEW_GET_FUN(__glewUniformMatrix2x3fv) +#define glUniformMatrix2x4fv GLEW_GET_FUN(__glewUniformMatrix2x4fv) +#define glUniformMatrix3x2fv GLEW_GET_FUN(__glewUniformMatrix3x2fv) +#define glUniformMatrix3x4fv GLEW_GET_FUN(__glewUniformMatrix3x4fv) +#define glUniformMatrix4x2fv GLEW_GET_FUN(__glewUniformMatrix4x2fv) +#define glUniformMatrix4x3fv GLEW_GET_FUN(__glewUniformMatrix4x3fv) + +#define GLEW_VERSION_2_1 GLEW_GET_VAR(__GLEW_VERSION_2_1) + +#endif /* GL_VERSION_2_1 */ + +/* -------------------------- GL_3DFX_multisample -------------------------- */ + +#ifndef GL_3DFX_multisample +#define GL_3DFX_multisample 1 + +#define GL_MULTISAMPLE_3DFX 0x86B2 +#define GL_SAMPLE_BUFFERS_3DFX 0x86B3 +#define GL_SAMPLES_3DFX 0x86B4 +#define GL_MULTISAMPLE_BIT_3DFX 0x20000000 + +#define GLEW_3DFX_multisample GLEW_GET_VAR(__GLEW_3DFX_multisample) + +#endif /* GL_3DFX_multisample */ + +/* ---------------------------- GL_3DFX_tbuffer ---------------------------- */ + +#ifndef GL_3DFX_tbuffer +#define GL_3DFX_tbuffer 1 + +typedef void (GLAPIENTRY * PFNGLTBUFFERMASK3DFXPROC) (GLuint mask); + +#define glTbufferMask3DFX GLEW_GET_FUN(__glewTbufferMask3DFX) + +#define GLEW_3DFX_tbuffer GLEW_GET_VAR(__GLEW_3DFX_tbuffer) + +#endif /* GL_3DFX_tbuffer */ + +/* -------------------- GL_3DFX_texture_compression_FXT1 ------------------- */ + +#ifndef GL_3DFX_texture_compression_FXT1 +#define GL_3DFX_texture_compression_FXT1 1 + +#define GL_COMPRESSED_RGB_FXT1_3DFX 0x86B0 +#define GL_COMPRESSED_RGBA_FXT1_3DFX 0x86B1 + +#define GLEW_3DFX_texture_compression_FXT1 GLEW_GET_VAR(__GLEW_3DFX_texture_compression_FXT1) + +#endif /* GL_3DFX_texture_compression_FXT1 */ + +/* ------------------------ GL_APPLE_client_storage ------------------------ */ + +#ifndef GL_APPLE_client_storage +#define GL_APPLE_client_storage 1 + +#define GL_UNPACK_CLIENT_STORAGE_APPLE 0x85B2 + +#define GLEW_APPLE_client_storage GLEW_GET_VAR(__GLEW_APPLE_client_storage) + +#endif /* GL_APPLE_client_storage */ + +/* ------------------------- GL_APPLE_element_array ------------------------ */ + +#ifndef GL_APPLE_element_array +#define GL_APPLE_element_array 1 + +#define GL_ELEMENT_ARRAY_APPLE 0x8768 +#define GL_ELEMENT_ARRAY_TYPE_APPLE 0x8769 +#define GL_ELEMENT_ARRAY_POINTER_APPLE 0x876A + +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, GLint first, GLsizei count); +typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count); +typedef void (GLAPIENTRY * PFNGLELEMENTPOINTERAPPLEPROC) (GLenum type, const void* pointer); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, const GLint* first, const GLsizei *count, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, const GLint* first, const GLsizei *count, GLsizei primcount); + +#define glDrawElementArrayAPPLE GLEW_GET_FUN(__glewDrawElementArrayAPPLE) +#define glDrawRangeElementArrayAPPLE GLEW_GET_FUN(__glewDrawRangeElementArrayAPPLE) +#define glElementPointerAPPLE GLEW_GET_FUN(__glewElementPointerAPPLE) +#define glMultiDrawElementArrayAPPLE GLEW_GET_FUN(__glewMultiDrawElementArrayAPPLE) +#define glMultiDrawRangeElementArrayAPPLE GLEW_GET_FUN(__glewMultiDrawRangeElementArrayAPPLE) + +#define GLEW_APPLE_element_array GLEW_GET_VAR(__GLEW_APPLE_element_array) + +#endif /* GL_APPLE_element_array */ + +/* ----------------------------- GL_APPLE_fence ---------------------------- */ + +#ifndef GL_APPLE_fence +#define GL_APPLE_fence 1 + +#define GL_DRAW_PIXELS_APPLE 0x8A0A +#define GL_FENCE_APPLE 0x8A0B + +typedef void (GLAPIENTRY * PFNGLDELETEFENCESAPPLEPROC) (GLsizei n, const GLuint* fences); +typedef void (GLAPIENTRY * PFNGLFINISHFENCEAPPLEPROC) (GLuint fence); +typedef void (GLAPIENTRY * PFNGLFINISHOBJECTAPPLEPROC) (GLenum object, GLint name); +typedef void (GLAPIENTRY * PFNGLGENFENCESAPPLEPROC) (GLsizei n, GLuint* fences); +typedef GLboolean (GLAPIENTRY * PFNGLISFENCEAPPLEPROC) (GLuint fence); +typedef void (GLAPIENTRY * PFNGLSETFENCEAPPLEPROC) (GLuint fence); +typedef GLboolean (GLAPIENTRY * PFNGLTESTFENCEAPPLEPROC) (GLuint fence); +typedef GLboolean (GLAPIENTRY * PFNGLTESTOBJECTAPPLEPROC) (GLenum object, GLuint name); + +#define glDeleteFencesAPPLE GLEW_GET_FUN(__glewDeleteFencesAPPLE) +#define glFinishFenceAPPLE GLEW_GET_FUN(__glewFinishFenceAPPLE) +#define glFinishObjectAPPLE GLEW_GET_FUN(__glewFinishObjectAPPLE) +#define glGenFencesAPPLE GLEW_GET_FUN(__glewGenFencesAPPLE) +#define glIsFenceAPPLE GLEW_GET_FUN(__glewIsFenceAPPLE) +#define glSetFenceAPPLE GLEW_GET_FUN(__glewSetFenceAPPLE) +#define glTestFenceAPPLE GLEW_GET_FUN(__glewTestFenceAPPLE) +#define glTestObjectAPPLE GLEW_GET_FUN(__glewTestObjectAPPLE) + +#define GLEW_APPLE_fence GLEW_GET_VAR(__GLEW_APPLE_fence) + +#endif /* GL_APPLE_fence */ + +/* ------------------------- GL_APPLE_float_pixels ------------------------- */ + +#ifndef GL_APPLE_float_pixels +#define GL_APPLE_float_pixels 1 + +#define GL_HALF_APPLE 0x140B +#define GL_RGBA_FLOAT32_APPLE 0x8814 +#define GL_RGB_FLOAT32_APPLE 0x8815 +#define GL_ALPHA_FLOAT32_APPLE 0x8816 +#define GL_INTENSITY_FLOAT32_APPLE 0x8817 +#define GL_LUMINANCE_FLOAT32_APPLE 0x8818 +#define GL_LUMINANCE_ALPHA_FLOAT32_APPLE 0x8819 +#define GL_RGBA_FLOAT16_APPLE 0x881A +#define GL_RGB_FLOAT16_APPLE 0x881B +#define GL_ALPHA_FLOAT16_APPLE 0x881C +#define GL_INTENSITY_FLOAT16_APPLE 0x881D +#define GL_LUMINANCE_FLOAT16_APPLE 0x881E +#define GL_LUMINANCE_ALPHA_FLOAT16_APPLE 0x881F +#define GL_COLOR_FLOAT_APPLE 0x8A0F + +#define GLEW_APPLE_float_pixels GLEW_GET_VAR(__GLEW_APPLE_float_pixels) + +#endif /* GL_APPLE_float_pixels */ + +/* ------------------------- GL_APPLE_pixel_buffer ------------------------- */ + +#ifndef GL_APPLE_pixel_buffer +#define GL_APPLE_pixel_buffer 1 + +#define GL_MIN_PBUFFER_VIEWPORT_DIMS_APPLE 0x8A10 + +#define GLEW_APPLE_pixel_buffer GLEW_GET_VAR(__GLEW_APPLE_pixel_buffer) + +#endif /* GL_APPLE_pixel_buffer */ + +/* ------------------------ GL_APPLE_specular_vector ----------------------- */ + +#ifndef GL_APPLE_specular_vector +#define GL_APPLE_specular_vector 1 + +#define GL_LIGHT_MODEL_SPECULAR_VECTOR_APPLE 0x85B0 + +#define GLEW_APPLE_specular_vector GLEW_GET_VAR(__GLEW_APPLE_specular_vector) + +#endif /* GL_APPLE_specular_vector */ + +/* ------------------------- GL_APPLE_texture_range ------------------------ */ + +#ifndef GL_APPLE_texture_range +#define GL_APPLE_texture_range 1 + +#define GL_TEXTURE_RANGE_LENGTH_APPLE 0x85B7 +#define GL_TEXTURE_RANGE_POINTER_APPLE 0x85B8 +#define GL_TEXTURE_STORAGE_HINT_APPLE 0x85BC +#define GL_STORAGE_PRIVATE_APPLE 0x85BD +#define GL_STORAGE_CACHED_APPLE 0x85BE +#define GL_STORAGE_SHARED_APPLE 0x85BF + +typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC) (GLenum target, GLenum pname, GLvoid **params); +typedef void (GLAPIENTRY * PFNGLTEXTURERANGEAPPLEPROC) (GLenum target, GLsizei length, GLvoid *pointer); + +#define glGetTexParameterPointervAPPLE GLEW_GET_FUN(__glewGetTexParameterPointervAPPLE) +#define glTextureRangeAPPLE GLEW_GET_FUN(__glewTextureRangeAPPLE) + +#define GLEW_APPLE_texture_range GLEW_GET_VAR(__GLEW_APPLE_texture_range) + +#endif /* GL_APPLE_texture_range */ + +/* ------------------------ GL_APPLE_transform_hint ------------------------ */ + +#ifndef GL_APPLE_transform_hint +#define GL_APPLE_transform_hint 1 + +#define GL_TRANSFORM_HINT_APPLE 0x85B1 + +#define GLEW_APPLE_transform_hint GLEW_GET_VAR(__GLEW_APPLE_transform_hint) + +#endif /* GL_APPLE_transform_hint */ + +/* ---------------------- GL_APPLE_vertex_array_object --------------------- */ + +#ifndef GL_APPLE_vertex_array_object +#define GL_APPLE_vertex_array_object 1 + +#define GL_VERTEX_ARRAY_BINDING_APPLE 0x85B5 + +typedef void (GLAPIENTRY * PFNGLBINDVERTEXARRAYAPPLEPROC) (GLuint array); +typedef void (GLAPIENTRY * PFNGLDELETEVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint* arrays); +typedef void (GLAPIENTRY * PFNGLGENVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint* arrays); +typedef GLboolean (GLAPIENTRY * PFNGLISVERTEXARRAYAPPLEPROC) (GLuint array); + +#define glBindVertexArrayAPPLE GLEW_GET_FUN(__glewBindVertexArrayAPPLE) +#define glDeleteVertexArraysAPPLE GLEW_GET_FUN(__glewDeleteVertexArraysAPPLE) +#define glGenVertexArraysAPPLE GLEW_GET_FUN(__glewGenVertexArraysAPPLE) +#define glIsVertexArrayAPPLE GLEW_GET_FUN(__glewIsVertexArrayAPPLE) + +#define GLEW_APPLE_vertex_array_object GLEW_GET_VAR(__GLEW_APPLE_vertex_array_object) + +#endif /* GL_APPLE_vertex_array_object */ + +/* ---------------------- GL_APPLE_vertex_array_range ---------------------- */ + +#ifndef GL_APPLE_vertex_array_range +#define GL_APPLE_vertex_array_range 1 + +#define GL_VERTEX_ARRAY_RANGE_APPLE 0x851D +#define GL_VERTEX_ARRAY_RANGE_LENGTH_APPLE 0x851E +#define GL_VERTEX_ARRAY_STORAGE_HINT_APPLE 0x851F +#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_APPLE 0x8520 +#define GL_VERTEX_ARRAY_RANGE_POINTER_APPLE 0x8521 +#define GL_STORAGE_CACHED_APPLE 0x85BE +#define GL_STORAGE_SHARED_APPLE 0x85BF + +typedef void (GLAPIENTRY * PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void* pointer); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYPARAMETERIAPPLEPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void* pointer); + +#define glFlushVertexArrayRangeAPPLE GLEW_GET_FUN(__glewFlushVertexArrayRangeAPPLE) +#define glVertexArrayParameteriAPPLE GLEW_GET_FUN(__glewVertexArrayParameteriAPPLE) +#define glVertexArrayRangeAPPLE GLEW_GET_FUN(__glewVertexArrayRangeAPPLE) + +#define GLEW_APPLE_vertex_array_range GLEW_GET_VAR(__GLEW_APPLE_vertex_array_range) + +#endif /* GL_APPLE_vertex_array_range */ + +/* --------------------------- GL_APPLE_ycbcr_422 -------------------------- */ + +#ifndef GL_APPLE_ycbcr_422 +#define GL_APPLE_ycbcr_422 1 + +#define GL_YCBCR_422_APPLE 0x85B9 +#define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA +#define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB + +#define GLEW_APPLE_ycbcr_422 GLEW_GET_VAR(__GLEW_APPLE_ycbcr_422) + +#endif /* GL_APPLE_ycbcr_422 */ + +/* ----------------------- GL_ARB_color_buffer_float ----------------------- */ + +#ifndef GL_ARB_color_buffer_float +#define GL_ARB_color_buffer_float 1 + +#define GL_RGBA_FLOAT_MODE_ARB 0x8820 +#define GL_CLAMP_VERTEX_COLOR_ARB 0x891A +#define GL_CLAMP_FRAGMENT_COLOR_ARB 0x891B +#define GL_CLAMP_READ_COLOR_ARB 0x891C +#define GL_FIXED_ONLY_ARB 0x891D + +typedef void (GLAPIENTRY * PFNGLCLAMPCOLORARBPROC) (GLenum target, GLenum clamp); + +#define glClampColorARB GLEW_GET_FUN(__glewClampColorARB) + +#define GLEW_ARB_color_buffer_float GLEW_GET_VAR(__GLEW_ARB_color_buffer_float) + +#endif /* GL_ARB_color_buffer_float */ + +/* -------------------------- GL_ARB_depth_texture ------------------------- */ + +#ifndef GL_ARB_depth_texture +#define GL_ARB_depth_texture 1 + +#define GL_DEPTH_COMPONENT16_ARB 0x81A5 +#define GL_DEPTH_COMPONENT24_ARB 0x81A6 +#define GL_DEPTH_COMPONENT32_ARB 0x81A7 +#define GL_TEXTURE_DEPTH_SIZE_ARB 0x884A +#define GL_DEPTH_TEXTURE_MODE_ARB 0x884B + +#define GLEW_ARB_depth_texture GLEW_GET_VAR(__GLEW_ARB_depth_texture) + +#endif /* GL_ARB_depth_texture */ + +/* -------------------------- GL_ARB_draw_buffers -------------------------- */ + +#ifndef GL_ARB_draw_buffers +#define GL_ARB_draw_buffers 1 + +#define GL_MAX_DRAW_BUFFERS_ARB 0x8824 +#define GL_DRAW_BUFFER0_ARB 0x8825 +#define GL_DRAW_BUFFER1_ARB 0x8826 +#define GL_DRAW_BUFFER2_ARB 0x8827 +#define GL_DRAW_BUFFER3_ARB 0x8828 +#define GL_DRAW_BUFFER4_ARB 0x8829 +#define GL_DRAW_BUFFER5_ARB 0x882A +#define GL_DRAW_BUFFER6_ARB 0x882B +#define GL_DRAW_BUFFER7_ARB 0x882C +#define GL_DRAW_BUFFER8_ARB 0x882D +#define GL_DRAW_BUFFER9_ARB 0x882E +#define GL_DRAW_BUFFER10_ARB 0x882F +#define GL_DRAW_BUFFER11_ARB 0x8830 +#define GL_DRAW_BUFFER12_ARB 0x8831 +#define GL_DRAW_BUFFER13_ARB 0x8832 +#define GL_DRAW_BUFFER14_ARB 0x8833 +#define GL_DRAW_BUFFER15_ARB 0x8834 + +typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSARBPROC) (GLsizei n, const GLenum* bufs); + +#define glDrawBuffersARB GLEW_GET_FUN(__glewDrawBuffersARB) + +#define GLEW_ARB_draw_buffers GLEW_GET_VAR(__GLEW_ARB_draw_buffers) + +#endif /* GL_ARB_draw_buffers */ + +/* ------------------------ GL_ARB_fragment_program ------------------------ */ + +#ifndef GL_ARB_fragment_program +#define GL_ARB_fragment_program 1 + +#define GL_FRAGMENT_PROGRAM_ARB 0x8804 +#define GL_PROGRAM_ALU_INSTRUCTIONS_ARB 0x8805 +#define GL_PROGRAM_TEX_INSTRUCTIONS_ARB 0x8806 +#define GL_PROGRAM_TEX_INDIRECTIONS_ARB 0x8807 +#define GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x8808 +#define GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x8809 +#define GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x880A +#define GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB 0x880B +#define GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB 0x880C +#define GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB 0x880D +#define GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x880E +#define GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x880F +#define GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x8810 +#define GL_MAX_TEXTURE_COORDS_ARB 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872 + +#define GLEW_ARB_fragment_program GLEW_GET_VAR(__GLEW_ARB_fragment_program) + +#endif /* GL_ARB_fragment_program */ + +/* --------------------- GL_ARB_fragment_program_shadow -------------------- */ + +#ifndef GL_ARB_fragment_program_shadow +#define GL_ARB_fragment_program_shadow 1 + +#define GLEW_ARB_fragment_program_shadow GLEW_GET_VAR(__GLEW_ARB_fragment_program_shadow) + +#endif /* GL_ARB_fragment_program_shadow */ + +/* ------------------------- GL_ARB_fragment_shader ------------------------ */ + +#ifndef GL_ARB_fragment_shader +#define GL_ARB_fragment_shader 1 + +#define GL_FRAGMENT_SHADER_ARB 0x8B30 +#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB 0x8B49 +#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB 0x8B8B + +#define GLEW_ARB_fragment_shader GLEW_GET_VAR(__GLEW_ARB_fragment_shader) + +#endif /* GL_ARB_fragment_shader */ + +/* ------------------------ GL_ARB_half_float_pixel ------------------------ */ + +#ifndef GL_ARB_half_float_pixel +#define GL_ARB_half_float_pixel 1 + +#define GL_HALF_FLOAT_ARB 0x140B + +#define GLEW_ARB_half_float_pixel GLEW_GET_VAR(__GLEW_ARB_half_float_pixel) + +#endif /* GL_ARB_half_float_pixel */ + +/* ----------------------------- GL_ARB_imaging ---------------------------- */ + +#ifndef GL_ARB_imaging +#define GL_ARB_imaging 1 + +#define GL_CONSTANT_COLOR 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 +#define GL_CONSTANT_ALPHA 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 +#define GL_BLEND_COLOR 0x8005 +#define GL_FUNC_ADD 0x8006 +#define GL_MIN 0x8007 +#define GL_MAX 0x8008 +#define GL_BLEND_EQUATION 0x8009 +#define GL_FUNC_SUBTRACT 0x800A +#define GL_FUNC_REVERSE_SUBTRACT 0x800B +#define GL_CONVOLUTION_1D 0x8010 +#define GL_CONVOLUTION_2D 0x8011 +#define GL_SEPARABLE_2D 0x8012 +#define GL_CONVOLUTION_BORDER_MODE 0x8013 +#define GL_CONVOLUTION_FILTER_SCALE 0x8014 +#define GL_CONVOLUTION_FILTER_BIAS 0x8015 +#define GL_REDUCE 0x8016 +#define GL_CONVOLUTION_FORMAT 0x8017 +#define GL_CONVOLUTION_WIDTH 0x8018 +#define GL_CONVOLUTION_HEIGHT 0x8019 +#define GL_MAX_CONVOLUTION_WIDTH 0x801A +#define GL_MAX_CONVOLUTION_HEIGHT 0x801B +#define GL_POST_CONVOLUTION_RED_SCALE 0x801C +#define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D +#define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E +#define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F +#define GL_POST_CONVOLUTION_RED_BIAS 0x8020 +#define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021 +#define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022 +#define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023 +#define GL_HISTOGRAM 0x8024 +#define GL_PROXY_HISTOGRAM 0x8025 +#define GL_HISTOGRAM_WIDTH 0x8026 +#define GL_HISTOGRAM_FORMAT 0x8027 +#define GL_HISTOGRAM_RED_SIZE 0x8028 +#define GL_HISTOGRAM_GREEN_SIZE 0x8029 +#define GL_HISTOGRAM_BLUE_SIZE 0x802A +#define GL_HISTOGRAM_ALPHA_SIZE 0x802B +#define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C +#define GL_HISTOGRAM_SINK 0x802D +#define GL_MINMAX 0x802E +#define GL_MINMAX_FORMAT 0x802F +#define GL_MINMAX_SINK 0x8030 +#define GL_TABLE_TOO_LARGE 0x8031 +#define GL_COLOR_MATRIX 0x80B1 +#define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2 +#define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3 +#define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4 +#define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5 +#define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6 +#define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7 +#define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8 +#define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9 +#define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA +#define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB +#define GL_COLOR_TABLE 0x80D0 +#define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1 +#define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2 +#define GL_PROXY_COLOR_TABLE 0x80D3 +#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4 +#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5 +#define GL_COLOR_TABLE_SCALE 0x80D6 +#define GL_COLOR_TABLE_BIAS 0x80D7 +#define GL_COLOR_TABLE_FORMAT 0x80D8 +#define GL_COLOR_TABLE_WIDTH 0x80D9 +#define GL_COLOR_TABLE_RED_SIZE 0x80DA +#define GL_COLOR_TABLE_GREEN_SIZE 0x80DB +#define GL_COLOR_TABLE_BLUE_SIZE 0x80DC +#define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD +#define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE +#define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF +#define GL_IGNORE_BORDER 0x8150 +#define GL_CONSTANT_BORDER 0x8151 +#define GL_WRAP_BORDER 0x8152 +#define GL_REPLICATE_BORDER 0x8153 +#define GL_CONVOLUTION_BORDER_COLOR 0x8154 + +typedef void (GLAPIENTRY * PFNGLCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); +typedef void (GLAPIENTRY * PFNGLCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); +typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat params); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIPROC) (GLenum target, GLenum pname, GLint params); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (GLAPIENTRY * PFNGLCOPYCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); +typedef void (GLAPIENTRY * PFNGLCOPYCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, GLvoid *table); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *image); +typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); +typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GLAPIENTRY * PFNGLGETMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum types, GLvoid *values); +typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GLAPIENTRY * PFNGLGETSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); +typedef void (GLAPIENTRY * PFNGLHISTOGRAMPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +typedef void (GLAPIENTRY * PFNGLMINMAXPROC) (GLenum target, GLenum internalformat, GLboolean sink); +typedef void (GLAPIENTRY * PFNGLRESETHISTOGRAMPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLRESETMINMAXPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLSEPARABLEFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column); + +#define glColorSubTable GLEW_GET_FUN(__glewColorSubTable) +#define glColorTable GLEW_GET_FUN(__glewColorTable) +#define glColorTableParameterfv GLEW_GET_FUN(__glewColorTableParameterfv) +#define glColorTableParameteriv GLEW_GET_FUN(__glewColorTableParameteriv) +#define glConvolutionFilter1D GLEW_GET_FUN(__glewConvolutionFilter1D) +#define glConvolutionFilter2D GLEW_GET_FUN(__glewConvolutionFilter2D) +#define glConvolutionParameterf GLEW_GET_FUN(__glewConvolutionParameterf) +#define glConvolutionParameterfv GLEW_GET_FUN(__glewConvolutionParameterfv) +#define glConvolutionParameteri GLEW_GET_FUN(__glewConvolutionParameteri) +#define glConvolutionParameteriv GLEW_GET_FUN(__glewConvolutionParameteriv) +#define glCopyColorSubTable GLEW_GET_FUN(__glewCopyColorSubTable) +#define glCopyColorTable GLEW_GET_FUN(__glewCopyColorTable) +#define glCopyConvolutionFilter1D GLEW_GET_FUN(__glewCopyConvolutionFilter1D) +#define glCopyConvolutionFilter2D GLEW_GET_FUN(__glewCopyConvolutionFilter2D) +#define glGetColorTable GLEW_GET_FUN(__glewGetColorTable) +#define glGetColorTableParameterfv GLEW_GET_FUN(__glewGetColorTableParameterfv) +#define glGetColorTableParameteriv GLEW_GET_FUN(__glewGetColorTableParameteriv) +#define glGetConvolutionFilter GLEW_GET_FUN(__glewGetConvolutionFilter) +#define glGetConvolutionParameterfv GLEW_GET_FUN(__glewGetConvolutionParameterfv) +#define glGetConvolutionParameteriv GLEW_GET_FUN(__glewGetConvolutionParameteriv) +#define glGetHistogram GLEW_GET_FUN(__glewGetHistogram) +#define glGetHistogramParameterfv GLEW_GET_FUN(__glewGetHistogramParameterfv) +#define glGetHistogramParameteriv GLEW_GET_FUN(__glewGetHistogramParameteriv) +#define glGetMinmax GLEW_GET_FUN(__glewGetMinmax) +#define glGetMinmaxParameterfv GLEW_GET_FUN(__glewGetMinmaxParameterfv) +#define glGetMinmaxParameteriv GLEW_GET_FUN(__glewGetMinmaxParameteriv) +#define glGetSeparableFilter GLEW_GET_FUN(__glewGetSeparableFilter) +#define glHistogram GLEW_GET_FUN(__glewHistogram) +#define glMinmax GLEW_GET_FUN(__glewMinmax) +#define glResetHistogram GLEW_GET_FUN(__glewResetHistogram) +#define glResetMinmax GLEW_GET_FUN(__glewResetMinmax) +#define glSeparableFilter2D GLEW_GET_FUN(__glewSeparableFilter2D) + +#define GLEW_ARB_imaging GLEW_GET_VAR(__GLEW_ARB_imaging) + +#endif /* GL_ARB_imaging */ + +/* ------------------------- GL_ARB_matrix_palette ------------------------- */ + +#ifndef GL_ARB_matrix_palette +#define GL_ARB_matrix_palette 1 + +#define GL_MATRIX_PALETTE_ARB 0x8840 +#define GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB 0x8841 +#define GL_MAX_PALETTE_MATRICES_ARB 0x8842 +#define GL_CURRENT_PALETTE_MATRIX_ARB 0x8843 +#define GL_MATRIX_INDEX_ARRAY_ARB 0x8844 +#define GL_CURRENT_MATRIX_INDEX_ARB 0x8845 +#define GL_MATRIX_INDEX_ARRAY_SIZE_ARB 0x8846 +#define GL_MATRIX_INDEX_ARRAY_TYPE_ARB 0x8847 +#define GL_MATRIX_INDEX_ARRAY_STRIDE_ARB 0x8848 +#define GL_MATRIX_INDEX_ARRAY_POINTER_ARB 0x8849 + +typedef void (GLAPIENTRY * PFNGLCURRENTPALETTEMATRIXARBPROC) (GLint index); +typedef void (GLAPIENTRY * PFNGLMATRIXINDEXPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, GLvoid *pointer); +typedef void (GLAPIENTRY * PFNGLMATRIXINDEXUBVARBPROC) (GLint size, GLubyte *indices); +typedef void (GLAPIENTRY * PFNGLMATRIXINDEXUIVARBPROC) (GLint size, GLuint *indices); +typedef void (GLAPIENTRY * PFNGLMATRIXINDEXUSVARBPROC) (GLint size, GLushort *indices); + +#define glCurrentPaletteMatrixARB GLEW_GET_FUN(__glewCurrentPaletteMatrixARB) +#define glMatrixIndexPointerARB GLEW_GET_FUN(__glewMatrixIndexPointerARB) +#define glMatrixIndexubvARB GLEW_GET_FUN(__glewMatrixIndexubvARB) +#define glMatrixIndexuivARB GLEW_GET_FUN(__glewMatrixIndexuivARB) +#define glMatrixIndexusvARB GLEW_GET_FUN(__glewMatrixIndexusvARB) + +#define GLEW_ARB_matrix_palette GLEW_GET_VAR(__GLEW_ARB_matrix_palette) + +#endif /* GL_ARB_matrix_palette */ + +/* --------------------------- GL_ARB_multisample -------------------------- */ + +#ifndef GL_ARB_multisample +#define GL_ARB_multisample 1 + +#define GL_MULTISAMPLE_ARB 0x809D +#define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_ARB 0x809F +#define GL_SAMPLE_COVERAGE_ARB 0x80A0 +#define GL_SAMPLE_BUFFERS_ARB 0x80A8 +#define GL_SAMPLES_ARB 0x80A9 +#define GL_SAMPLE_COVERAGE_VALUE_ARB 0x80AA +#define GL_SAMPLE_COVERAGE_INVERT_ARB 0x80AB +#define GL_MULTISAMPLE_BIT_ARB 0x20000000 + +typedef void (GLAPIENTRY * PFNGLSAMPLECOVERAGEARBPROC) (GLclampf value, GLboolean invert); + +#define glSampleCoverageARB GLEW_GET_FUN(__glewSampleCoverageARB) + +#define GLEW_ARB_multisample GLEW_GET_VAR(__GLEW_ARB_multisample) + +#endif /* GL_ARB_multisample */ + +/* -------------------------- GL_ARB_multitexture -------------------------- */ + +#ifndef GL_ARB_multitexture +#define GL_ARB_multitexture 1 + +#define GL_TEXTURE0_ARB 0x84C0 +#define GL_TEXTURE1_ARB 0x84C1 +#define GL_TEXTURE2_ARB 0x84C2 +#define GL_TEXTURE3_ARB 0x84C3 +#define GL_TEXTURE4_ARB 0x84C4 +#define GL_TEXTURE5_ARB 0x84C5 +#define GL_TEXTURE6_ARB 0x84C6 +#define GL_TEXTURE7_ARB 0x84C7 +#define GL_TEXTURE8_ARB 0x84C8 +#define GL_TEXTURE9_ARB 0x84C9 +#define GL_TEXTURE10_ARB 0x84CA +#define GL_TEXTURE11_ARB 0x84CB +#define GL_TEXTURE12_ARB 0x84CC +#define GL_TEXTURE13_ARB 0x84CD +#define GL_TEXTURE14_ARB 0x84CE +#define GL_TEXTURE15_ARB 0x84CF +#define GL_TEXTURE16_ARB 0x84D0 +#define GL_TEXTURE17_ARB 0x84D1 +#define GL_TEXTURE18_ARB 0x84D2 +#define GL_TEXTURE19_ARB 0x84D3 +#define GL_TEXTURE20_ARB 0x84D4 +#define GL_TEXTURE21_ARB 0x84D5 +#define GL_TEXTURE22_ARB 0x84D6 +#define GL_TEXTURE23_ARB 0x84D7 +#define GL_TEXTURE24_ARB 0x84D8 +#define GL_TEXTURE25_ARB 0x84D9 +#define GL_TEXTURE26_ARB 0x84DA +#define GL_TEXTURE27_ARB 0x84DB +#define GL_TEXTURE28_ARB 0x84DC +#define GL_TEXTURE29_ARB 0x84DD +#define GL_TEXTURE30_ARB 0x84DE +#define GL_TEXTURE31_ARB 0x84DF +#define GL_ACTIVE_TEXTURE_ARB 0x84E0 +#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 +#define GL_MAX_TEXTURE_UNITS_ARB 0x84E2 + +typedef void (GLAPIENTRY * PFNGLACTIVETEXTUREARBPROC) (GLenum texture); +typedef void (GLAPIENTRY * PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IARBPROC) (GLenum target, GLint s); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IVARBPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SARBPROC) (GLenum target, GLshort s); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SVARBPROC) (GLenum target, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DARBPROC) (GLenum target, GLdouble s, GLdouble t); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IARBPROC) (GLenum target, GLint s, GLint t); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IVARBPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SARBPROC) (GLenum target, GLshort s, GLshort t); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IARBPROC) (GLenum target, GLint s, GLint t, GLint r); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IVARBPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SVARBPROC) (GLenum target, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IVARBPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort *v); + +#define glActiveTextureARB GLEW_GET_FUN(__glewActiveTextureARB) +#define glClientActiveTextureARB GLEW_GET_FUN(__glewClientActiveTextureARB) +#define glMultiTexCoord1dARB GLEW_GET_FUN(__glewMultiTexCoord1dARB) +#define glMultiTexCoord1dvARB GLEW_GET_FUN(__glewMultiTexCoord1dvARB) +#define glMultiTexCoord1fARB GLEW_GET_FUN(__glewMultiTexCoord1fARB) +#define glMultiTexCoord1fvARB GLEW_GET_FUN(__glewMultiTexCoord1fvARB) +#define glMultiTexCoord1iARB GLEW_GET_FUN(__glewMultiTexCoord1iARB) +#define glMultiTexCoord1ivARB GLEW_GET_FUN(__glewMultiTexCoord1ivARB) +#define glMultiTexCoord1sARB GLEW_GET_FUN(__glewMultiTexCoord1sARB) +#define glMultiTexCoord1svARB GLEW_GET_FUN(__glewMultiTexCoord1svARB) +#define glMultiTexCoord2dARB GLEW_GET_FUN(__glewMultiTexCoord2dARB) +#define glMultiTexCoord2dvARB GLEW_GET_FUN(__glewMultiTexCoord2dvARB) +#define glMultiTexCoord2fARB GLEW_GET_FUN(__glewMultiTexCoord2fARB) +#define glMultiTexCoord2fvARB GLEW_GET_FUN(__glewMultiTexCoord2fvARB) +#define glMultiTexCoord2iARB GLEW_GET_FUN(__glewMultiTexCoord2iARB) +#define glMultiTexCoord2ivARB GLEW_GET_FUN(__glewMultiTexCoord2ivARB) +#define glMultiTexCoord2sARB GLEW_GET_FUN(__glewMultiTexCoord2sARB) +#define glMultiTexCoord2svARB GLEW_GET_FUN(__glewMultiTexCoord2svARB) +#define glMultiTexCoord3dARB GLEW_GET_FUN(__glewMultiTexCoord3dARB) +#define glMultiTexCoord3dvARB GLEW_GET_FUN(__glewMultiTexCoord3dvARB) +#define glMultiTexCoord3fARB GLEW_GET_FUN(__glewMultiTexCoord3fARB) +#define glMultiTexCoord3fvARB GLEW_GET_FUN(__glewMultiTexCoord3fvARB) +#define glMultiTexCoord3iARB GLEW_GET_FUN(__glewMultiTexCoord3iARB) +#define glMultiTexCoord3ivARB GLEW_GET_FUN(__glewMultiTexCoord3ivARB) +#define glMultiTexCoord3sARB GLEW_GET_FUN(__glewMultiTexCoord3sARB) +#define glMultiTexCoord3svARB GLEW_GET_FUN(__glewMultiTexCoord3svARB) +#define glMultiTexCoord4dARB GLEW_GET_FUN(__glewMultiTexCoord4dARB) +#define glMultiTexCoord4dvARB GLEW_GET_FUN(__glewMultiTexCoord4dvARB) +#define glMultiTexCoord4fARB GLEW_GET_FUN(__glewMultiTexCoord4fARB) +#define glMultiTexCoord4fvARB GLEW_GET_FUN(__glewMultiTexCoord4fvARB) +#define glMultiTexCoord4iARB GLEW_GET_FUN(__glewMultiTexCoord4iARB) +#define glMultiTexCoord4ivARB GLEW_GET_FUN(__glewMultiTexCoord4ivARB) +#define glMultiTexCoord4sARB GLEW_GET_FUN(__glewMultiTexCoord4sARB) +#define glMultiTexCoord4svARB GLEW_GET_FUN(__glewMultiTexCoord4svARB) + +#define GLEW_ARB_multitexture GLEW_GET_VAR(__GLEW_ARB_multitexture) + +#endif /* GL_ARB_multitexture */ + +/* ------------------------- GL_ARB_occlusion_query ------------------------ */ + +#ifndef GL_ARB_occlusion_query +#define GL_ARB_occlusion_query 1 + +#define GL_QUERY_COUNTER_BITS_ARB 0x8864 +#define GL_CURRENT_QUERY_ARB 0x8865 +#define GL_QUERY_RESULT_ARB 0x8866 +#define GL_QUERY_RESULT_AVAILABLE_ARB 0x8867 +#define GL_SAMPLES_PASSED_ARB 0x8914 + +typedef void (GLAPIENTRY * PFNGLBEGINQUERYARBPROC) (GLenum target, GLuint id); +typedef void (GLAPIENTRY * PFNGLDELETEQUERIESARBPROC) (GLsizei n, const GLuint* ids); +typedef void (GLAPIENTRY * PFNGLENDQUERYARBPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLGENQUERIESARBPROC) (GLsizei n, GLuint* ids); +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTIVARBPROC) (GLuint id, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUIVARBPROC) (GLuint id, GLenum pname, GLuint* params); +typedef void (GLAPIENTRY * PFNGLGETQUERYIVARBPROC) (GLenum target, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISQUERYARBPROC) (GLuint id); + +#define glBeginQueryARB GLEW_GET_FUN(__glewBeginQueryARB) +#define glDeleteQueriesARB GLEW_GET_FUN(__glewDeleteQueriesARB) +#define glEndQueryARB GLEW_GET_FUN(__glewEndQueryARB) +#define glGenQueriesARB GLEW_GET_FUN(__glewGenQueriesARB) +#define glGetQueryObjectivARB GLEW_GET_FUN(__glewGetQueryObjectivARB) +#define glGetQueryObjectuivARB GLEW_GET_FUN(__glewGetQueryObjectuivARB) +#define glGetQueryivARB GLEW_GET_FUN(__glewGetQueryivARB) +#define glIsQueryARB GLEW_GET_FUN(__glewIsQueryARB) + +#define GLEW_ARB_occlusion_query GLEW_GET_VAR(__GLEW_ARB_occlusion_query) + +#endif /* GL_ARB_occlusion_query */ + +/* ----------------------- GL_ARB_pixel_buffer_object ---------------------- */ + +#ifndef GL_ARB_pixel_buffer_object +#define GL_ARB_pixel_buffer_object 1 + +#define GL_PIXEL_PACK_BUFFER_ARB 0x88EB +#define GL_PIXEL_UNPACK_BUFFER_ARB 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING_ARB 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING_ARB 0x88EF + +#define GLEW_ARB_pixel_buffer_object GLEW_GET_VAR(__GLEW_ARB_pixel_buffer_object) + +#endif /* GL_ARB_pixel_buffer_object */ + +/* ------------------------ GL_ARB_point_parameters ------------------------ */ + +#ifndef GL_ARB_point_parameters +#define GL_ARB_point_parameters 1 + +#define GL_POINT_SIZE_MIN_ARB 0x8126 +#define GL_POINT_SIZE_MAX_ARB 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_ARB 0x8128 +#define GL_POINT_DISTANCE_ATTENUATION_ARB 0x8129 + +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFARBPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFVARBPROC) (GLenum pname, GLfloat* params); + +#define glPointParameterfARB GLEW_GET_FUN(__glewPointParameterfARB) +#define glPointParameterfvARB GLEW_GET_FUN(__glewPointParameterfvARB) + +#define GLEW_ARB_point_parameters GLEW_GET_VAR(__GLEW_ARB_point_parameters) + +#endif /* GL_ARB_point_parameters */ + +/* -------------------------- GL_ARB_point_sprite -------------------------- */ + +#ifndef GL_ARB_point_sprite +#define GL_ARB_point_sprite 1 + +#define GL_POINT_SPRITE_ARB 0x8861 +#define GL_COORD_REPLACE_ARB 0x8862 + +#define GLEW_ARB_point_sprite GLEW_GET_VAR(__GLEW_ARB_point_sprite) + +#endif /* GL_ARB_point_sprite */ + +/* ------------------------- GL_ARB_shader_objects ------------------------- */ + +#ifndef GL_ARB_shader_objects +#define GL_ARB_shader_objects 1 + +#define GL_PROGRAM_OBJECT_ARB 0x8B40 +#define GL_SHADER_OBJECT_ARB 0x8B48 +#define GL_OBJECT_TYPE_ARB 0x8B4E +#define GL_OBJECT_SUBTYPE_ARB 0x8B4F +#define GL_FLOAT_VEC2_ARB 0x8B50 +#define GL_FLOAT_VEC3_ARB 0x8B51 +#define GL_FLOAT_VEC4_ARB 0x8B52 +#define GL_INT_VEC2_ARB 0x8B53 +#define GL_INT_VEC3_ARB 0x8B54 +#define GL_INT_VEC4_ARB 0x8B55 +#define GL_BOOL_ARB 0x8B56 +#define GL_BOOL_VEC2_ARB 0x8B57 +#define GL_BOOL_VEC3_ARB 0x8B58 +#define GL_BOOL_VEC4_ARB 0x8B59 +#define GL_FLOAT_MAT2_ARB 0x8B5A +#define GL_FLOAT_MAT3_ARB 0x8B5B +#define GL_FLOAT_MAT4_ARB 0x8B5C +#define GL_SAMPLER_1D_ARB 0x8B5D +#define GL_SAMPLER_2D_ARB 0x8B5E +#define GL_SAMPLER_3D_ARB 0x8B5F +#define GL_SAMPLER_CUBE_ARB 0x8B60 +#define GL_SAMPLER_1D_SHADOW_ARB 0x8B61 +#define GL_SAMPLER_2D_SHADOW_ARB 0x8B62 +#define GL_SAMPLER_2D_RECT_ARB 0x8B63 +#define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64 +#define GL_OBJECT_DELETE_STATUS_ARB 0x8B80 +#define GL_OBJECT_COMPILE_STATUS_ARB 0x8B81 +#define GL_OBJECT_LINK_STATUS_ARB 0x8B82 +#define GL_OBJECT_VALIDATE_STATUS_ARB 0x8B83 +#define GL_OBJECT_INFO_LOG_LENGTH_ARB 0x8B84 +#define GL_OBJECT_ATTACHED_OBJECTS_ARB 0x8B85 +#define GL_OBJECT_ACTIVE_UNIFORMS_ARB 0x8B86 +#define GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB 0x8B87 +#define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB 0x8B88 + +typedef char GLcharARB; +typedef unsigned int GLhandleARB; + +typedef void (GLAPIENTRY * PFNGLATTACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB obj); +typedef void (GLAPIENTRY * PFNGLCOMPILESHADERARBPROC) (GLhandleARB shaderObj); +typedef GLhandleARB (GLAPIENTRY * PFNGLCREATEPROGRAMOBJECTARBPROC) (void); +typedef GLhandleARB (GLAPIENTRY * PFNGLCREATESHADEROBJECTARBPROC) (GLenum shaderType); +typedef void (GLAPIENTRY * PFNGLDELETEOBJECTARBPROC) (GLhandleARB obj); +typedef void (GLAPIENTRY * PFNGLDETACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB attachedObj); +typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei* length, GLint *size, GLenum *type, GLcharARB *name); +typedef void (GLAPIENTRY * PFNGLGETATTACHEDOBJECTSARBPROC) (GLhandleARB containerObj, GLsizei maxCount, GLsizei* count, GLhandleARB *obj); +typedef GLhandleARB (GLAPIENTRY * PFNGLGETHANDLEARBPROC) (GLenum pname); +typedef void (GLAPIENTRY * PFNGLGETINFOLOGARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei* length, GLcharARB *infoLog); +typedef void (GLAPIENTRY * PFNGLGETOBJECTPARAMETERFVARBPROC) (GLhandleARB obj, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETOBJECTPARAMETERIVARBPROC) (GLhandleARB obj, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETSHADERSOURCEARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei* length, GLcharARB *source); +typedef GLint (GLAPIENTRY * PFNGLGETUNIFORMLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB* name); +typedef void (GLAPIENTRY * PFNGLGETUNIFORMFVARBPROC) (GLhandleARB programObj, GLint location, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETUNIFORMIVARBPROC) (GLhandleARB programObj, GLint location, GLint* params); +typedef void (GLAPIENTRY * PFNGLLINKPROGRAMARBPROC) (GLhandleARB programObj); +typedef void (GLAPIENTRY * PFNGLSHADERSOURCEARBPROC) (GLhandleARB shaderObj, GLsizei count, const GLcharARB ** string, const GLint *length); +typedef void (GLAPIENTRY * PFNGLUNIFORM1FARBPROC) (GLint location, GLfloat v0); +typedef void (GLAPIENTRY * PFNGLUNIFORM1FVARBPROC) (GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM1IARBPROC) (GLint location, GLint v0); +typedef void (GLAPIENTRY * PFNGLUNIFORM1IVARBPROC) (GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM2FARBPROC) (GLint location, GLfloat v0, GLfloat v1); +typedef void (GLAPIENTRY * PFNGLUNIFORM2FVARBPROC) (GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM2IARBPROC) (GLint location, GLint v0, GLint v1); +typedef void (GLAPIENTRY * PFNGLUNIFORM2IVARBPROC) (GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM3FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (GLAPIENTRY * PFNGLUNIFORM3FVARBPROC) (GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM3IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2); +typedef void (GLAPIENTRY * PFNGLUNIFORM3IVARBPROC) (GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM4FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (GLAPIENTRY * PFNGLUNIFORM4FVARBPROC) (GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM4IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (GLAPIENTRY * PFNGLUNIFORM4IVARBPROC) (GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUSEPROGRAMOBJECTARBPROC) (GLhandleARB programObj); +typedef void (GLAPIENTRY * PFNGLVALIDATEPROGRAMARBPROC) (GLhandleARB programObj); + +#define glAttachObjectARB GLEW_GET_FUN(__glewAttachObjectARB) +#define glCompileShaderARB GLEW_GET_FUN(__glewCompileShaderARB) +#define glCreateProgramObjectARB GLEW_GET_FUN(__glewCreateProgramObjectARB) +#define glCreateShaderObjectARB GLEW_GET_FUN(__glewCreateShaderObjectARB) +#define glDeleteObjectARB GLEW_GET_FUN(__glewDeleteObjectARB) +#define glDetachObjectARB GLEW_GET_FUN(__glewDetachObjectARB) +#define glGetActiveUniformARB GLEW_GET_FUN(__glewGetActiveUniformARB) +#define glGetAttachedObjectsARB GLEW_GET_FUN(__glewGetAttachedObjectsARB) +#define glGetHandleARB GLEW_GET_FUN(__glewGetHandleARB) +#define glGetInfoLogARB GLEW_GET_FUN(__glewGetInfoLogARB) +#define glGetObjectParameterfvARB GLEW_GET_FUN(__glewGetObjectParameterfvARB) +#define glGetObjectParameterivARB GLEW_GET_FUN(__glewGetObjectParameterivARB) +#define glGetShaderSourceARB GLEW_GET_FUN(__glewGetShaderSourceARB) +#define glGetUniformLocationARB GLEW_GET_FUN(__glewGetUniformLocationARB) +#define glGetUniformfvARB GLEW_GET_FUN(__glewGetUniformfvARB) +#define glGetUniformivARB GLEW_GET_FUN(__glewGetUniformivARB) +#define glLinkProgramARB GLEW_GET_FUN(__glewLinkProgramARB) +#define glShaderSourceARB GLEW_GET_FUN(__glewShaderSourceARB) +#define glUniform1fARB GLEW_GET_FUN(__glewUniform1fARB) +#define glUniform1fvARB GLEW_GET_FUN(__glewUniform1fvARB) +#define glUniform1iARB GLEW_GET_FUN(__glewUniform1iARB) +#define glUniform1ivARB GLEW_GET_FUN(__glewUniform1ivARB) +#define glUniform2fARB GLEW_GET_FUN(__glewUniform2fARB) +#define glUniform2fvARB GLEW_GET_FUN(__glewUniform2fvARB) +#define glUniform2iARB GLEW_GET_FUN(__glewUniform2iARB) +#define glUniform2ivARB GLEW_GET_FUN(__glewUniform2ivARB) +#define glUniform3fARB GLEW_GET_FUN(__glewUniform3fARB) +#define glUniform3fvARB GLEW_GET_FUN(__glewUniform3fvARB) +#define glUniform3iARB GLEW_GET_FUN(__glewUniform3iARB) +#define glUniform3ivARB GLEW_GET_FUN(__glewUniform3ivARB) +#define glUniform4fARB GLEW_GET_FUN(__glewUniform4fARB) +#define glUniform4fvARB GLEW_GET_FUN(__glewUniform4fvARB) +#define glUniform4iARB GLEW_GET_FUN(__glewUniform4iARB) +#define glUniform4ivARB GLEW_GET_FUN(__glewUniform4ivARB) +#define glUniformMatrix2fvARB GLEW_GET_FUN(__glewUniformMatrix2fvARB) +#define glUniformMatrix3fvARB GLEW_GET_FUN(__glewUniformMatrix3fvARB) +#define glUniformMatrix4fvARB GLEW_GET_FUN(__glewUniformMatrix4fvARB) +#define glUseProgramObjectARB GLEW_GET_FUN(__glewUseProgramObjectARB) +#define glValidateProgramARB GLEW_GET_FUN(__glewValidateProgramARB) + +#define GLEW_ARB_shader_objects GLEW_GET_VAR(__GLEW_ARB_shader_objects) + +#endif /* GL_ARB_shader_objects */ + +/* ---------------------- GL_ARB_shading_language_100 ---------------------- */ + +#ifndef GL_ARB_shading_language_100 +#define GL_ARB_shading_language_100 1 + +#define GL_SHADING_LANGUAGE_VERSION_ARB 0x8B8C + +#define GLEW_ARB_shading_language_100 GLEW_GET_VAR(__GLEW_ARB_shading_language_100) + +#endif /* GL_ARB_shading_language_100 */ + +/* ----------------------------- GL_ARB_shadow ----------------------------- */ + +#ifndef GL_ARB_shadow +#define GL_ARB_shadow 1 + +#define GL_TEXTURE_COMPARE_MODE_ARB 0x884C +#define GL_TEXTURE_COMPARE_FUNC_ARB 0x884D +#define GL_COMPARE_R_TO_TEXTURE_ARB 0x884E + +#define GLEW_ARB_shadow GLEW_GET_VAR(__GLEW_ARB_shadow) + +#endif /* GL_ARB_shadow */ + +/* ------------------------- GL_ARB_shadow_ambient ------------------------- */ + +#ifndef GL_ARB_shadow_ambient +#define GL_ARB_shadow_ambient 1 + +#define GL_TEXTURE_COMPARE_FAIL_VALUE_ARB 0x80BF + +#define GLEW_ARB_shadow_ambient GLEW_GET_VAR(__GLEW_ARB_shadow_ambient) + +#endif /* GL_ARB_shadow_ambient */ + +/* ---------------------- GL_ARB_texture_border_clamp ---------------------- */ + +#ifndef GL_ARB_texture_border_clamp +#define GL_ARB_texture_border_clamp 1 + +#define GL_CLAMP_TO_BORDER_ARB 0x812D + +#define GLEW_ARB_texture_border_clamp GLEW_GET_VAR(__GLEW_ARB_texture_border_clamp) + +#endif /* GL_ARB_texture_border_clamp */ + +/* ----------------------- GL_ARB_texture_compression ---------------------- */ + +#ifndef GL_ARB_texture_compression +#define GL_ARB_texture_compression 1 + +#define GL_COMPRESSED_ALPHA_ARB 0x84E9 +#define GL_COMPRESSED_LUMINANCE_ARB 0x84EA +#define GL_COMPRESSED_LUMINANCE_ALPHA_ARB 0x84EB +#define GL_COMPRESSED_INTENSITY_ARB 0x84EC +#define GL_COMPRESSED_RGB_ARB 0x84ED +#define GL_COMPRESSED_RGBA_ARB 0x84EE +#define GL_TEXTURE_COMPRESSION_HINT_ARB 0x84EF +#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB 0x86A0 +#define GL_TEXTURE_COMPRESSED_ARB 0x86A1 +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A2 +#define GL_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A3 + +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE1DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void* data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE2DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE3DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void* data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void* data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void* data); +typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint lod, void* img); + +#define glCompressedTexImage1DARB GLEW_GET_FUN(__glewCompressedTexImage1DARB) +#define glCompressedTexImage2DARB GLEW_GET_FUN(__glewCompressedTexImage2DARB) +#define glCompressedTexImage3DARB GLEW_GET_FUN(__glewCompressedTexImage3DARB) +#define glCompressedTexSubImage1DARB GLEW_GET_FUN(__glewCompressedTexSubImage1DARB) +#define glCompressedTexSubImage2DARB GLEW_GET_FUN(__glewCompressedTexSubImage2DARB) +#define glCompressedTexSubImage3DARB GLEW_GET_FUN(__glewCompressedTexSubImage3DARB) +#define glGetCompressedTexImageARB GLEW_GET_FUN(__glewGetCompressedTexImageARB) + +#define GLEW_ARB_texture_compression GLEW_GET_VAR(__GLEW_ARB_texture_compression) + +#endif /* GL_ARB_texture_compression */ + +/* ------------------------ GL_ARB_texture_cube_map ------------------------ */ + +#ifndef GL_ARB_texture_cube_map +#define GL_ARB_texture_cube_map 1 + +#define GL_NORMAL_MAP_ARB 0x8511 +#define GL_REFLECTION_MAP_ARB 0x8512 +#define GL_TEXTURE_CUBE_MAP_ARB 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP_ARB 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB 0x851C + +#define GLEW_ARB_texture_cube_map GLEW_GET_VAR(__GLEW_ARB_texture_cube_map) + +#endif /* GL_ARB_texture_cube_map */ + +/* ------------------------- GL_ARB_texture_env_add ------------------------ */ + +#ifndef GL_ARB_texture_env_add +#define GL_ARB_texture_env_add 1 + +#define GLEW_ARB_texture_env_add GLEW_GET_VAR(__GLEW_ARB_texture_env_add) + +#endif /* GL_ARB_texture_env_add */ + +/* ----------------------- GL_ARB_texture_env_combine ---------------------- */ + +#ifndef GL_ARB_texture_env_combine +#define GL_ARB_texture_env_combine 1 + +#define GL_SUBTRACT_ARB 0x84E7 +#define GL_COMBINE_ARB 0x8570 +#define GL_COMBINE_RGB_ARB 0x8571 +#define GL_COMBINE_ALPHA_ARB 0x8572 +#define GL_RGB_SCALE_ARB 0x8573 +#define GL_ADD_SIGNED_ARB 0x8574 +#define GL_INTERPOLATE_ARB 0x8575 +#define GL_CONSTANT_ARB 0x8576 +#define GL_PRIMARY_COLOR_ARB 0x8577 +#define GL_PREVIOUS_ARB 0x8578 +#define GL_SOURCE0_RGB_ARB 0x8580 +#define GL_SOURCE1_RGB_ARB 0x8581 +#define GL_SOURCE2_RGB_ARB 0x8582 +#define GL_SOURCE0_ALPHA_ARB 0x8588 +#define GL_SOURCE1_ALPHA_ARB 0x8589 +#define GL_SOURCE2_ALPHA_ARB 0x858A +#define GL_OPERAND0_RGB_ARB 0x8590 +#define GL_OPERAND1_RGB_ARB 0x8591 +#define GL_OPERAND2_RGB_ARB 0x8592 +#define GL_OPERAND0_ALPHA_ARB 0x8598 +#define GL_OPERAND1_ALPHA_ARB 0x8599 +#define GL_OPERAND2_ALPHA_ARB 0x859A + +#define GLEW_ARB_texture_env_combine GLEW_GET_VAR(__GLEW_ARB_texture_env_combine) + +#endif /* GL_ARB_texture_env_combine */ + +/* ---------------------- GL_ARB_texture_env_crossbar ---------------------- */ + +#ifndef GL_ARB_texture_env_crossbar +#define GL_ARB_texture_env_crossbar 1 + +#define GLEW_ARB_texture_env_crossbar GLEW_GET_VAR(__GLEW_ARB_texture_env_crossbar) + +#endif /* GL_ARB_texture_env_crossbar */ + +/* ------------------------ GL_ARB_texture_env_dot3 ------------------------ */ + +#ifndef GL_ARB_texture_env_dot3 +#define GL_ARB_texture_env_dot3 1 + +#define GL_DOT3_RGB_ARB 0x86AE +#define GL_DOT3_RGBA_ARB 0x86AF + +#define GLEW_ARB_texture_env_dot3 GLEW_GET_VAR(__GLEW_ARB_texture_env_dot3) + +#endif /* GL_ARB_texture_env_dot3 */ + +/* -------------------------- GL_ARB_texture_float ------------------------- */ + +#ifndef GL_ARB_texture_float +#define GL_ARB_texture_float 1 + +#define GL_RGBA32F_ARB 0x8814 +#define GL_RGB32F_ARB 0x8815 +#define GL_ALPHA32F_ARB 0x8816 +#define GL_INTENSITY32F_ARB 0x8817 +#define GL_LUMINANCE32F_ARB 0x8818 +#define GL_LUMINANCE_ALPHA32F_ARB 0x8819 +#define GL_RGBA16F_ARB 0x881A +#define GL_RGB16F_ARB 0x881B +#define GL_ALPHA16F_ARB 0x881C +#define GL_INTENSITY16F_ARB 0x881D +#define GL_LUMINANCE16F_ARB 0x881E +#define GL_LUMINANCE_ALPHA16F_ARB 0x881F +#define GL_TEXTURE_RED_TYPE_ARB 0x8C10 +#define GL_TEXTURE_GREEN_TYPE_ARB 0x8C11 +#define GL_TEXTURE_BLUE_TYPE_ARB 0x8C12 +#define GL_TEXTURE_ALPHA_TYPE_ARB 0x8C13 +#define GL_TEXTURE_LUMINANCE_TYPE_ARB 0x8C14 +#define GL_TEXTURE_INTENSITY_TYPE_ARB 0x8C15 +#define GL_TEXTURE_DEPTH_TYPE_ARB 0x8C16 +#define GL_UNSIGNED_NORMALIZED_ARB 0x8C17 + +#define GLEW_ARB_texture_float GLEW_GET_VAR(__GLEW_ARB_texture_float) + +#endif /* GL_ARB_texture_float */ + +/* --------------------- GL_ARB_texture_mirrored_repeat -------------------- */ + +#ifndef GL_ARB_texture_mirrored_repeat +#define GL_ARB_texture_mirrored_repeat 1 + +#define GL_MIRRORED_REPEAT_ARB 0x8370 + +#define GLEW_ARB_texture_mirrored_repeat GLEW_GET_VAR(__GLEW_ARB_texture_mirrored_repeat) + +#endif /* GL_ARB_texture_mirrored_repeat */ + +/* -------------------- GL_ARB_texture_non_power_of_two -------------------- */ + +#ifndef GL_ARB_texture_non_power_of_two +#define GL_ARB_texture_non_power_of_two 1 + +#define GLEW_ARB_texture_non_power_of_two GLEW_GET_VAR(__GLEW_ARB_texture_non_power_of_two) + +#endif /* GL_ARB_texture_non_power_of_two */ + +/* ------------------------ GL_ARB_texture_rectangle ----------------------- */ + +#ifndef GL_ARB_texture_rectangle +#define GL_ARB_texture_rectangle 1 + +#define GL_TEXTURE_RECTANGLE_ARB 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE_ARB 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE_ARB 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB 0x84F8 +#define GL_SAMPLER_2D_RECT_ARB 0x8B63 +#define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64 + +#define GLEW_ARB_texture_rectangle GLEW_GET_VAR(__GLEW_ARB_texture_rectangle) + +#endif /* GL_ARB_texture_rectangle */ + +/* ------------------------ GL_ARB_transpose_matrix ------------------------ */ + +#ifndef GL_ARB_transpose_matrix +#define GL_ARB_transpose_matrix 1 + +#define GL_TRANSPOSE_MODELVIEW_MATRIX_ARB 0x84E3 +#define GL_TRANSPOSE_PROJECTION_MATRIX_ARB 0x84E4 +#define GL_TRANSPOSE_TEXTURE_MATRIX_ARB 0x84E5 +#define GL_TRANSPOSE_COLOR_MATRIX_ARB 0x84E6 + +typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXDARBPROC) (GLdouble m[16]); +typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXFARBPROC) (GLfloat m[16]); +typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXDARBPROC) (GLdouble m[16]); +typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXFARBPROC) (GLfloat m[16]); + +#define glLoadTransposeMatrixdARB GLEW_GET_FUN(__glewLoadTransposeMatrixdARB) +#define glLoadTransposeMatrixfARB GLEW_GET_FUN(__glewLoadTransposeMatrixfARB) +#define glMultTransposeMatrixdARB GLEW_GET_FUN(__glewMultTransposeMatrixdARB) +#define glMultTransposeMatrixfARB GLEW_GET_FUN(__glewMultTransposeMatrixfARB) + +#define GLEW_ARB_transpose_matrix GLEW_GET_VAR(__GLEW_ARB_transpose_matrix) + +#endif /* GL_ARB_transpose_matrix */ + +/* -------------------------- GL_ARB_vertex_blend -------------------------- */ + +#ifndef GL_ARB_vertex_blend +#define GL_ARB_vertex_blend 1 + +#define GL_MODELVIEW0_ARB 0x1700 +#define GL_MODELVIEW1_ARB 0x850A +#define GL_MAX_VERTEX_UNITS_ARB 0x86A4 +#define GL_ACTIVE_VERTEX_UNITS_ARB 0x86A5 +#define GL_WEIGHT_SUM_UNITY_ARB 0x86A6 +#define GL_VERTEX_BLEND_ARB 0x86A7 +#define GL_CURRENT_WEIGHT_ARB 0x86A8 +#define GL_WEIGHT_ARRAY_TYPE_ARB 0x86A9 +#define GL_WEIGHT_ARRAY_STRIDE_ARB 0x86AA +#define GL_WEIGHT_ARRAY_SIZE_ARB 0x86AB +#define GL_WEIGHT_ARRAY_POINTER_ARB 0x86AC +#define GL_WEIGHT_ARRAY_ARB 0x86AD +#define GL_MODELVIEW2_ARB 0x8722 +#define GL_MODELVIEW3_ARB 0x8723 +#define GL_MODELVIEW4_ARB 0x8724 +#define GL_MODELVIEW5_ARB 0x8725 +#define GL_MODELVIEW6_ARB 0x8726 +#define GL_MODELVIEW7_ARB 0x8727 +#define GL_MODELVIEW8_ARB 0x8728 +#define GL_MODELVIEW9_ARB 0x8729 +#define GL_MODELVIEW10_ARB 0x872A +#define GL_MODELVIEW11_ARB 0x872B +#define GL_MODELVIEW12_ARB 0x872C +#define GL_MODELVIEW13_ARB 0x872D +#define GL_MODELVIEW14_ARB 0x872E +#define GL_MODELVIEW15_ARB 0x872F +#define GL_MODELVIEW16_ARB 0x8730 +#define GL_MODELVIEW17_ARB 0x8731 +#define GL_MODELVIEW18_ARB 0x8732 +#define GL_MODELVIEW19_ARB 0x8733 +#define GL_MODELVIEW20_ARB 0x8734 +#define GL_MODELVIEW21_ARB 0x8735 +#define GL_MODELVIEW22_ARB 0x8736 +#define GL_MODELVIEW23_ARB 0x8737 +#define GL_MODELVIEW24_ARB 0x8738 +#define GL_MODELVIEW25_ARB 0x8739 +#define GL_MODELVIEW26_ARB 0x873A +#define GL_MODELVIEW27_ARB 0x873B +#define GL_MODELVIEW28_ARB 0x873C +#define GL_MODELVIEW29_ARB 0x873D +#define GL_MODELVIEW30_ARB 0x873E +#define GL_MODELVIEW31_ARB 0x873F + +typedef void (GLAPIENTRY * PFNGLVERTEXBLENDARBPROC) (GLint count); +typedef void (GLAPIENTRY * PFNGLWEIGHTPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, GLvoid *pointer); +typedef void (GLAPIENTRY * PFNGLWEIGHTBVARBPROC) (GLint size, GLbyte *weights); +typedef void (GLAPIENTRY * PFNGLWEIGHTDVARBPROC) (GLint size, GLdouble *weights); +typedef void (GLAPIENTRY * PFNGLWEIGHTFVARBPROC) (GLint size, GLfloat *weights); +typedef void (GLAPIENTRY * PFNGLWEIGHTIVARBPROC) (GLint size, GLint *weights); +typedef void (GLAPIENTRY * PFNGLWEIGHTSVARBPROC) (GLint size, GLshort *weights); +typedef void (GLAPIENTRY * PFNGLWEIGHTUBVARBPROC) (GLint size, GLubyte *weights); +typedef void (GLAPIENTRY * PFNGLWEIGHTUIVARBPROC) (GLint size, GLuint *weights); +typedef void (GLAPIENTRY * PFNGLWEIGHTUSVARBPROC) (GLint size, GLushort *weights); + +#define glVertexBlendARB GLEW_GET_FUN(__glewVertexBlendARB) +#define glWeightPointerARB GLEW_GET_FUN(__glewWeightPointerARB) +#define glWeightbvARB GLEW_GET_FUN(__glewWeightbvARB) +#define glWeightdvARB GLEW_GET_FUN(__glewWeightdvARB) +#define glWeightfvARB GLEW_GET_FUN(__glewWeightfvARB) +#define glWeightivARB GLEW_GET_FUN(__glewWeightivARB) +#define glWeightsvARB GLEW_GET_FUN(__glewWeightsvARB) +#define glWeightubvARB GLEW_GET_FUN(__glewWeightubvARB) +#define glWeightuivARB GLEW_GET_FUN(__glewWeightuivARB) +#define glWeightusvARB GLEW_GET_FUN(__glewWeightusvARB) + +#define GLEW_ARB_vertex_blend GLEW_GET_VAR(__GLEW_ARB_vertex_blend) + +#endif /* GL_ARB_vertex_blend */ + +/* ---------------------- GL_ARB_vertex_buffer_object ---------------------- */ + +#ifndef GL_ARB_vertex_buffer_object +#define GL_ARB_vertex_buffer_object 1 + +#define GL_BUFFER_SIZE_ARB 0x8764 +#define GL_BUFFER_USAGE_ARB 0x8765 +#define GL_ARRAY_BUFFER_ARB 0x8892 +#define GL_ELEMENT_ARRAY_BUFFER_ARB 0x8893 +#define GL_ARRAY_BUFFER_BINDING_ARB 0x8894 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895 +#define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB 0x8896 +#define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB 0x8897 +#define GL_COLOR_ARRAY_BUFFER_BINDING_ARB 0x8898 +#define GL_INDEX_ARRAY_BUFFER_BINDING_ARB 0x8899 +#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB 0x889A +#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB 0x889B +#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889C +#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB 0x889D +#define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB 0x889E +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB 0x889F +#define GL_READ_ONLY_ARB 0x88B8 +#define GL_WRITE_ONLY_ARB 0x88B9 +#define GL_READ_WRITE_ARB 0x88BA +#define GL_BUFFER_ACCESS_ARB 0x88BB +#define GL_BUFFER_MAPPED_ARB 0x88BC +#define GL_BUFFER_MAP_POINTER_ARB 0x88BD +#define GL_STREAM_DRAW_ARB 0x88E0 +#define GL_STREAM_READ_ARB 0x88E1 +#define GL_STREAM_COPY_ARB 0x88E2 +#define GL_STATIC_DRAW_ARB 0x88E4 +#define GL_STATIC_READ_ARB 0x88E5 +#define GL_STATIC_COPY_ARB 0x88E6 +#define GL_DYNAMIC_DRAW_ARB 0x88E8 +#define GL_DYNAMIC_READ_ARB 0x88E9 +#define GL_DYNAMIC_COPY_ARB 0x88EA + +typedef ptrdiff_t GLsizeiptrARB; +typedef ptrdiff_t GLintptrARB; + +typedef void (GLAPIENTRY * PFNGLBINDBUFFERARBPROC) (GLenum target, GLuint buffer); +typedef void (GLAPIENTRY * PFNGLBUFFERDATAARBPROC) (GLenum target, GLsizeiptrARB size, const GLvoid* data, GLenum usage); +typedef void (GLAPIENTRY * PFNGLBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid* data); +typedef void (GLAPIENTRY * PFNGLDELETEBUFFERSARBPROC) (GLsizei n, const GLuint* buffers); +typedef void (GLAPIENTRY * PFNGLGENBUFFERSARBPROC) (GLsizei n, GLuint* buffers); +typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERIVARBPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETBUFFERPOINTERVARBPROC) (GLenum target, GLenum pname, GLvoid** params); +typedef void (GLAPIENTRY * PFNGLGETBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid* data); +typedef GLboolean (GLAPIENTRY * PFNGLISBUFFERARBPROC) (GLuint buffer); +typedef GLvoid * (GLAPIENTRY * PFNGLMAPBUFFERARBPROC) (GLenum target, GLenum access); +typedef GLboolean (GLAPIENTRY * PFNGLUNMAPBUFFERARBPROC) (GLenum target); + +#define glBindBufferARB GLEW_GET_FUN(__glewBindBufferARB) +#define glBufferDataARB GLEW_GET_FUN(__glewBufferDataARB) +#define glBufferSubDataARB GLEW_GET_FUN(__glewBufferSubDataARB) +#define glDeleteBuffersARB GLEW_GET_FUN(__glewDeleteBuffersARB) +#define glGenBuffersARB GLEW_GET_FUN(__glewGenBuffersARB) +#define glGetBufferParameterivARB GLEW_GET_FUN(__glewGetBufferParameterivARB) +#define glGetBufferPointervARB GLEW_GET_FUN(__glewGetBufferPointervARB) +#define glGetBufferSubDataARB GLEW_GET_FUN(__glewGetBufferSubDataARB) +#define glIsBufferARB GLEW_GET_FUN(__glewIsBufferARB) +#define glMapBufferARB GLEW_GET_FUN(__glewMapBufferARB) +#define glUnmapBufferARB GLEW_GET_FUN(__glewUnmapBufferARB) + +#define GLEW_ARB_vertex_buffer_object GLEW_GET_VAR(__GLEW_ARB_vertex_buffer_object) + +#endif /* GL_ARB_vertex_buffer_object */ + +/* ------------------------- GL_ARB_vertex_program ------------------------- */ + +#ifndef GL_ARB_vertex_program +#define GL_ARB_vertex_program 1 + +#define GL_COLOR_SUM_ARB 0x8458 +#define GL_VERTEX_PROGRAM_ARB 0x8620 +#define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622 +#define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB 0x8623 +#define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624 +#define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB 0x8625 +#define GL_CURRENT_VERTEX_ATTRIB_ARB 0x8626 +#define GL_PROGRAM_LENGTH_ARB 0x8627 +#define GL_PROGRAM_STRING_ARB 0x8628 +#define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862E +#define GL_MAX_PROGRAM_MATRICES_ARB 0x862F +#define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640 +#define GL_CURRENT_MATRIX_ARB 0x8641 +#define GL_VERTEX_PROGRAM_POINT_SIZE_ARB 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE_ARB 0x8643 +#define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645 +#define GL_PROGRAM_ERROR_POSITION_ARB 0x864B +#define GL_PROGRAM_BINDING_ARB 0x8677 +#define GL_MAX_VERTEX_ATTRIBS_ARB 0x8869 +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886A +#define GL_PROGRAM_ERROR_STRING_ARB 0x8874 +#define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875 +#define GL_PROGRAM_FORMAT_ARB 0x8876 +#define GL_PROGRAM_INSTRUCTIONS_ARB 0x88A0 +#define GL_MAX_PROGRAM_INSTRUCTIONS_ARB 0x88A1 +#define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A2 +#define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A3 +#define GL_PROGRAM_TEMPORARIES_ARB 0x88A4 +#define GL_MAX_PROGRAM_TEMPORARIES_ARB 0x88A5 +#define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A6 +#define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A7 +#define GL_PROGRAM_PARAMETERS_ARB 0x88A8 +#define GL_MAX_PROGRAM_PARAMETERS_ARB 0x88A9 +#define GL_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AA +#define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AB +#define GL_PROGRAM_ATTRIBS_ARB 0x88AC +#define GL_MAX_PROGRAM_ATTRIBS_ARB 0x88AD +#define GL_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AE +#define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AF +#define GL_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B0 +#define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B1 +#define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B2 +#define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B3 +#define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88B4 +#define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88B5 +#define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88B6 +#define GL_TRANSPOSE_CURRENT_MATRIX_ARB 0x88B7 +#define GL_MATRIX0_ARB 0x88C0 +#define GL_MATRIX1_ARB 0x88C1 +#define GL_MATRIX2_ARB 0x88C2 +#define GL_MATRIX3_ARB 0x88C3 +#define GL_MATRIX4_ARB 0x88C4 +#define GL_MATRIX5_ARB 0x88C5 +#define GL_MATRIX6_ARB 0x88C6 +#define GL_MATRIX7_ARB 0x88C7 +#define GL_MATRIX8_ARB 0x88C8 +#define GL_MATRIX9_ARB 0x88C9 +#define GL_MATRIX10_ARB 0x88CA +#define GL_MATRIX11_ARB 0x88CB +#define GL_MATRIX12_ARB 0x88CC +#define GL_MATRIX13_ARB 0x88CD +#define GL_MATRIX14_ARB 0x88CE +#define GL_MATRIX15_ARB 0x88CF +#define GL_MATRIX16_ARB 0x88D0 +#define GL_MATRIX17_ARB 0x88D1 +#define GL_MATRIX18_ARB 0x88D2 +#define GL_MATRIX19_ARB 0x88D3 +#define GL_MATRIX20_ARB 0x88D4 +#define GL_MATRIX21_ARB 0x88D5 +#define GL_MATRIX22_ARB 0x88D6 +#define GL_MATRIX23_ARB 0x88D7 +#define GL_MATRIX24_ARB 0x88D8 +#define GL_MATRIX25_ARB 0x88D9 +#define GL_MATRIX26_ARB 0x88DA +#define GL_MATRIX27_ARB 0x88DB +#define GL_MATRIX28_ARB 0x88DC +#define GL_MATRIX29_ARB 0x88DD +#define GL_MATRIX30_ARB 0x88DE +#define GL_MATRIX31_ARB 0x88DF + +typedef void (GLAPIENTRY * PFNGLBINDPROGRAMARBPROC) (GLenum target, GLuint program); +typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMSARBPROC) (GLsizei n, const GLuint* programs); +typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); +typedef void (GLAPIENTRY * PFNGLENABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); +typedef void (GLAPIENTRY * PFNGLGENPROGRAMSARBPROC) (GLsizei n, GLuint* programs); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMENVPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMENVPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMSTRINGARBPROC) (GLenum target, GLenum pname, void* string); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMIVARBPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBPOINTERVARBPROC) (GLuint index, GLenum pname, GLvoid** pointer); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBDVARBPROC) (GLuint index, GLenum pname, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBFVARBPROC) (GLuint index, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIVARBPROC) (GLuint index, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMARBPROC) (GLuint program); +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMSTRINGARBPROC) (GLenum target, GLenum format, GLsizei len, const void* string); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DARBPROC) (GLuint index, GLdouble x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DVARBPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FARBPROC) (GLuint index, GLfloat x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FVARBPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SARBPROC) (GLuint index, GLshort x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SVARBPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DARBPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DVARBPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FARBPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FVARBPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SARBPROC) (GLuint index, GLshort x, GLshort y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SVARBPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DVARBPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FVARBPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SVARBPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NBVARBPROC) (GLuint index, const GLbyte* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NIVARBPROC) (GLuint index, const GLint* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NSVARBPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBARBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBVARBPROC) (GLuint index, const GLubyte* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUIVARBPROC) (GLuint index, const GLuint* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUSVARBPROC) (GLuint index, const GLushort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4BVARBPROC) (GLuint index, const GLbyte* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DVARBPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FVARBPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4IVARBPROC) (GLuint index, const GLint* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SVARBPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBVARBPROC) (GLuint index, const GLubyte* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UIVARBPROC) (GLuint index, const GLuint* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4USVARBPROC) (GLuint index, const GLushort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPOINTERARBPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* pointer); + +#define glBindProgramARB GLEW_GET_FUN(__glewBindProgramARB) +#define glDeleteProgramsARB GLEW_GET_FUN(__glewDeleteProgramsARB) +#define glDisableVertexAttribArrayARB GLEW_GET_FUN(__glewDisableVertexAttribArrayARB) +#define glEnableVertexAttribArrayARB GLEW_GET_FUN(__glewEnableVertexAttribArrayARB) +#define glGenProgramsARB GLEW_GET_FUN(__glewGenProgramsARB) +#define glGetProgramEnvParameterdvARB GLEW_GET_FUN(__glewGetProgramEnvParameterdvARB) +#define glGetProgramEnvParameterfvARB GLEW_GET_FUN(__glewGetProgramEnvParameterfvARB) +#define glGetProgramLocalParameterdvARB GLEW_GET_FUN(__glewGetProgramLocalParameterdvARB) +#define glGetProgramLocalParameterfvARB GLEW_GET_FUN(__glewGetProgramLocalParameterfvARB) +#define glGetProgramStringARB GLEW_GET_FUN(__glewGetProgramStringARB) +#define glGetProgramivARB GLEW_GET_FUN(__glewGetProgramivARB) +#define glGetVertexAttribPointervARB GLEW_GET_FUN(__glewGetVertexAttribPointervARB) +#define glGetVertexAttribdvARB GLEW_GET_FUN(__glewGetVertexAttribdvARB) +#define glGetVertexAttribfvARB GLEW_GET_FUN(__glewGetVertexAttribfvARB) +#define glGetVertexAttribivARB GLEW_GET_FUN(__glewGetVertexAttribivARB) +#define glIsProgramARB GLEW_GET_FUN(__glewIsProgramARB) +#define glProgramEnvParameter4dARB GLEW_GET_FUN(__glewProgramEnvParameter4dARB) +#define glProgramEnvParameter4dvARB GLEW_GET_FUN(__glewProgramEnvParameter4dvARB) +#define glProgramEnvParameter4fARB GLEW_GET_FUN(__glewProgramEnvParameter4fARB) +#define glProgramEnvParameter4fvARB GLEW_GET_FUN(__glewProgramEnvParameter4fvARB) +#define glProgramLocalParameter4dARB GLEW_GET_FUN(__glewProgramLocalParameter4dARB) +#define glProgramLocalParameter4dvARB GLEW_GET_FUN(__glewProgramLocalParameter4dvARB) +#define glProgramLocalParameter4fARB GLEW_GET_FUN(__glewProgramLocalParameter4fARB) +#define glProgramLocalParameter4fvARB GLEW_GET_FUN(__glewProgramLocalParameter4fvARB) +#define glProgramStringARB GLEW_GET_FUN(__glewProgramStringARB) +#define glVertexAttrib1dARB GLEW_GET_FUN(__glewVertexAttrib1dARB) +#define glVertexAttrib1dvARB GLEW_GET_FUN(__glewVertexAttrib1dvARB) +#define glVertexAttrib1fARB GLEW_GET_FUN(__glewVertexAttrib1fARB) +#define glVertexAttrib1fvARB GLEW_GET_FUN(__glewVertexAttrib1fvARB) +#define glVertexAttrib1sARB GLEW_GET_FUN(__glewVertexAttrib1sARB) +#define glVertexAttrib1svARB GLEW_GET_FUN(__glewVertexAttrib1svARB) +#define glVertexAttrib2dARB GLEW_GET_FUN(__glewVertexAttrib2dARB) +#define glVertexAttrib2dvARB GLEW_GET_FUN(__glewVertexAttrib2dvARB) +#define glVertexAttrib2fARB GLEW_GET_FUN(__glewVertexAttrib2fARB) +#define glVertexAttrib2fvARB GLEW_GET_FUN(__glewVertexAttrib2fvARB) +#define glVertexAttrib2sARB GLEW_GET_FUN(__glewVertexAttrib2sARB) +#define glVertexAttrib2svARB GLEW_GET_FUN(__glewVertexAttrib2svARB) +#define glVertexAttrib3dARB GLEW_GET_FUN(__glewVertexAttrib3dARB) +#define glVertexAttrib3dvARB GLEW_GET_FUN(__glewVertexAttrib3dvARB) +#define glVertexAttrib3fARB GLEW_GET_FUN(__glewVertexAttrib3fARB) +#define glVertexAttrib3fvARB GLEW_GET_FUN(__glewVertexAttrib3fvARB) +#define glVertexAttrib3sARB GLEW_GET_FUN(__glewVertexAttrib3sARB) +#define glVertexAttrib3svARB GLEW_GET_FUN(__glewVertexAttrib3svARB) +#define glVertexAttrib4NbvARB GLEW_GET_FUN(__glewVertexAttrib4NbvARB) +#define glVertexAttrib4NivARB GLEW_GET_FUN(__glewVertexAttrib4NivARB) +#define glVertexAttrib4NsvARB GLEW_GET_FUN(__glewVertexAttrib4NsvARB) +#define glVertexAttrib4NubARB GLEW_GET_FUN(__glewVertexAttrib4NubARB) +#define glVertexAttrib4NubvARB GLEW_GET_FUN(__glewVertexAttrib4NubvARB) +#define glVertexAttrib4NuivARB GLEW_GET_FUN(__glewVertexAttrib4NuivARB) +#define glVertexAttrib4NusvARB GLEW_GET_FUN(__glewVertexAttrib4NusvARB) +#define glVertexAttrib4bvARB GLEW_GET_FUN(__glewVertexAttrib4bvARB) +#define glVertexAttrib4dARB GLEW_GET_FUN(__glewVertexAttrib4dARB) +#define glVertexAttrib4dvARB GLEW_GET_FUN(__glewVertexAttrib4dvARB) +#define glVertexAttrib4fARB GLEW_GET_FUN(__glewVertexAttrib4fARB) +#define glVertexAttrib4fvARB GLEW_GET_FUN(__glewVertexAttrib4fvARB) +#define glVertexAttrib4ivARB GLEW_GET_FUN(__glewVertexAttrib4ivARB) +#define glVertexAttrib4sARB GLEW_GET_FUN(__glewVertexAttrib4sARB) +#define glVertexAttrib4svARB GLEW_GET_FUN(__glewVertexAttrib4svARB) +#define glVertexAttrib4ubvARB GLEW_GET_FUN(__glewVertexAttrib4ubvARB) +#define glVertexAttrib4uivARB GLEW_GET_FUN(__glewVertexAttrib4uivARB) +#define glVertexAttrib4usvARB GLEW_GET_FUN(__glewVertexAttrib4usvARB) +#define glVertexAttribPointerARB GLEW_GET_FUN(__glewVertexAttribPointerARB) + +#define GLEW_ARB_vertex_program GLEW_GET_VAR(__GLEW_ARB_vertex_program) + +#endif /* GL_ARB_vertex_program */ + +/* -------------------------- GL_ARB_vertex_shader ------------------------- */ + +#ifndef GL_ARB_vertex_shader +#define GL_ARB_vertex_shader 1 + +#define GL_VERTEX_SHADER_ARB 0x8B31 +#define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB 0x8B4A +#define GL_MAX_VARYING_FLOATS_ARB 0x8B4B +#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C +#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB 0x8B4D +#define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB 0x8B89 +#define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB 0x8B8A + +typedef void (GLAPIENTRY * PFNGLBINDATTRIBLOCATIONARBPROC) (GLhandleARB programObj, GLuint index, const GLcharARB* name); +typedef void (GLAPIENTRY * PFNGLGETACTIVEATTRIBARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei* length, GLint *size, GLenum *type, GLcharARB *name); +typedef GLint (GLAPIENTRY * PFNGLGETATTRIBLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB* name); + +#define glBindAttribLocationARB GLEW_GET_FUN(__glewBindAttribLocationARB) +#define glGetActiveAttribARB GLEW_GET_FUN(__glewGetActiveAttribARB) +#define glGetAttribLocationARB GLEW_GET_FUN(__glewGetAttribLocationARB) + +#define GLEW_ARB_vertex_shader GLEW_GET_VAR(__GLEW_ARB_vertex_shader) + +#endif /* GL_ARB_vertex_shader */ + +/* --------------------------- GL_ARB_window_pos --------------------------- */ + +#ifndef GL_ARB_window_pos +#define GL_ARB_window_pos 1 + +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DARBPROC) (GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DVARBPROC) (const GLdouble* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FARBPROC) (GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FVARBPROC) (const GLfloat* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IARBPROC) (GLint x, GLint y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IVARBPROC) (const GLint* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SARBPROC) (GLshort x, GLshort y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SVARBPROC) (const GLshort* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DARBPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DVARBPROC) (const GLdouble* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FARBPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FVARBPROC) (const GLfloat* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IARBPROC) (GLint x, GLint y, GLint z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IVARBPROC) (const GLint* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SARBPROC) (GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SVARBPROC) (const GLshort* p); + +#define glWindowPos2dARB GLEW_GET_FUN(__glewWindowPos2dARB) +#define glWindowPos2dvARB GLEW_GET_FUN(__glewWindowPos2dvARB) +#define glWindowPos2fARB GLEW_GET_FUN(__glewWindowPos2fARB) +#define glWindowPos2fvARB GLEW_GET_FUN(__glewWindowPos2fvARB) +#define glWindowPos2iARB GLEW_GET_FUN(__glewWindowPos2iARB) +#define glWindowPos2ivARB GLEW_GET_FUN(__glewWindowPos2ivARB) +#define glWindowPos2sARB GLEW_GET_FUN(__glewWindowPos2sARB) +#define glWindowPos2svARB GLEW_GET_FUN(__glewWindowPos2svARB) +#define glWindowPos3dARB GLEW_GET_FUN(__glewWindowPos3dARB) +#define glWindowPos3dvARB GLEW_GET_FUN(__glewWindowPos3dvARB) +#define glWindowPos3fARB GLEW_GET_FUN(__glewWindowPos3fARB) +#define glWindowPos3fvARB GLEW_GET_FUN(__glewWindowPos3fvARB) +#define glWindowPos3iARB GLEW_GET_FUN(__glewWindowPos3iARB) +#define glWindowPos3ivARB GLEW_GET_FUN(__glewWindowPos3ivARB) +#define glWindowPos3sARB GLEW_GET_FUN(__glewWindowPos3sARB) +#define glWindowPos3svARB GLEW_GET_FUN(__glewWindowPos3svARB) + +#define GLEW_ARB_window_pos GLEW_GET_VAR(__GLEW_ARB_window_pos) + +#endif /* GL_ARB_window_pos */ + +/* ------------------------- GL_ATIX_point_sprites ------------------------- */ + +#ifndef GL_ATIX_point_sprites +#define GL_ATIX_point_sprites 1 + +#define GL_TEXTURE_POINT_MODE_ATIX 0x60B0 +#define GL_TEXTURE_POINT_ONE_COORD_ATIX 0x60B1 +#define GL_TEXTURE_POINT_SPRITE_ATIX 0x60B2 +#define GL_POINT_SPRITE_CULL_MODE_ATIX 0x60B3 +#define GL_POINT_SPRITE_CULL_CENTER_ATIX 0x60B4 +#define GL_POINT_SPRITE_CULL_CLIP_ATIX 0x60B5 + +#define GLEW_ATIX_point_sprites GLEW_GET_VAR(__GLEW_ATIX_point_sprites) + +#endif /* GL_ATIX_point_sprites */ + +/* ---------------------- GL_ATIX_texture_env_combine3 --------------------- */ + +#ifndef GL_ATIX_texture_env_combine3 +#define GL_ATIX_texture_env_combine3 1 + +#define GL_MODULATE_ADD_ATIX 0x8744 +#define GL_MODULATE_SIGNED_ADD_ATIX 0x8745 +#define GL_MODULATE_SUBTRACT_ATIX 0x8746 + +#define GLEW_ATIX_texture_env_combine3 GLEW_GET_VAR(__GLEW_ATIX_texture_env_combine3) + +#endif /* GL_ATIX_texture_env_combine3 */ + +/* ----------------------- GL_ATIX_texture_env_route ----------------------- */ + +#ifndef GL_ATIX_texture_env_route +#define GL_ATIX_texture_env_route 1 + +#define GL_SECONDARY_COLOR_ATIX 0x8747 +#define GL_TEXTURE_OUTPUT_RGB_ATIX 0x8748 +#define GL_TEXTURE_OUTPUT_ALPHA_ATIX 0x8749 + +#define GLEW_ATIX_texture_env_route GLEW_GET_VAR(__GLEW_ATIX_texture_env_route) + +#endif /* GL_ATIX_texture_env_route */ + +/* ---------------- GL_ATIX_vertex_shader_output_point_size ---------------- */ + +#ifndef GL_ATIX_vertex_shader_output_point_size +#define GL_ATIX_vertex_shader_output_point_size 1 + +#define GL_OUTPUT_POINT_SIZE_ATIX 0x610E + +#define GLEW_ATIX_vertex_shader_output_point_size GLEW_GET_VAR(__GLEW_ATIX_vertex_shader_output_point_size) + +#endif /* GL_ATIX_vertex_shader_output_point_size */ + +/* -------------------------- GL_ATI_draw_buffers -------------------------- */ + +#ifndef GL_ATI_draw_buffers +#define GL_ATI_draw_buffers 1 + +#define GL_MAX_DRAW_BUFFERS_ATI 0x8824 +#define GL_DRAW_BUFFER0_ATI 0x8825 +#define GL_DRAW_BUFFER1_ATI 0x8826 +#define GL_DRAW_BUFFER2_ATI 0x8827 +#define GL_DRAW_BUFFER3_ATI 0x8828 +#define GL_DRAW_BUFFER4_ATI 0x8829 +#define GL_DRAW_BUFFER5_ATI 0x882A +#define GL_DRAW_BUFFER6_ATI 0x882B +#define GL_DRAW_BUFFER7_ATI 0x882C +#define GL_DRAW_BUFFER8_ATI 0x882D +#define GL_DRAW_BUFFER9_ATI 0x882E +#define GL_DRAW_BUFFER10_ATI 0x882F +#define GL_DRAW_BUFFER11_ATI 0x8830 +#define GL_DRAW_BUFFER12_ATI 0x8831 +#define GL_DRAW_BUFFER13_ATI 0x8832 +#define GL_DRAW_BUFFER14_ATI 0x8833 +#define GL_DRAW_BUFFER15_ATI 0x8834 + +typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSATIPROC) (GLsizei n, const GLenum* bufs); + +#define glDrawBuffersATI GLEW_GET_FUN(__glewDrawBuffersATI) + +#define GLEW_ATI_draw_buffers GLEW_GET_VAR(__GLEW_ATI_draw_buffers) + +#endif /* GL_ATI_draw_buffers */ + +/* -------------------------- GL_ATI_element_array ------------------------- */ + +#ifndef GL_ATI_element_array +#define GL_ATI_element_array 1 + +#define GL_ELEMENT_ARRAY_ATI 0x8768 +#define GL_ELEMENT_ARRAY_TYPE_ATI 0x8769 +#define GL_ELEMENT_ARRAY_POINTER_ATI 0x876A + +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTARRAYATIPROC) (GLenum mode, GLsizei count); +typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTARRAYATIPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count); +typedef void (GLAPIENTRY * PFNGLELEMENTPOINTERATIPROC) (GLenum type, const void* pointer); + +#define glDrawElementArrayATI GLEW_GET_FUN(__glewDrawElementArrayATI) +#define glDrawRangeElementArrayATI GLEW_GET_FUN(__glewDrawRangeElementArrayATI) +#define glElementPointerATI GLEW_GET_FUN(__glewElementPointerATI) + +#define GLEW_ATI_element_array GLEW_GET_VAR(__GLEW_ATI_element_array) + +#endif /* GL_ATI_element_array */ + +/* ------------------------- GL_ATI_envmap_bumpmap ------------------------- */ + +#ifndef GL_ATI_envmap_bumpmap +#define GL_ATI_envmap_bumpmap 1 + +#define GL_BUMP_ROT_MATRIX_ATI 0x8775 +#define GL_BUMP_ROT_MATRIX_SIZE_ATI 0x8776 +#define GL_BUMP_NUM_TEX_UNITS_ATI 0x8777 +#define GL_BUMP_TEX_UNITS_ATI 0x8778 +#define GL_DUDV_ATI 0x8779 +#define GL_DU8DV8_ATI 0x877A +#define GL_BUMP_ENVMAP_ATI 0x877B +#define GL_BUMP_TARGET_ATI 0x877C + +typedef void (GLAPIENTRY * PFNGLGETTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat *param); +typedef void (GLAPIENTRY * PFNGLGETTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint *param); +typedef void (GLAPIENTRY * PFNGLTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat *param); +typedef void (GLAPIENTRY * PFNGLTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint *param); + +#define glGetTexBumpParameterfvATI GLEW_GET_FUN(__glewGetTexBumpParameterfvATI) +#define glGetTexBumpParameterivATI GLEW_GET_FUN(__glewGetTexBumpParameterivATI) +#define glTexBumpParameterfvATI GLEW_GET_FUN(__glewTexBumpParameterfvATI) +#define glTexBumpParameterivATI GLEW_GET_FUN(__glewTexBumpParameterivATI) + +#define GLEW_ATI_envmap_bumpmap GLEW_GET_VAR(__GLEW_ATI_envmap_bumpmap) + +#endif /* GL_ATI_envmap_bumpmap */ + +/* ------------------------- GL_ATI_fragment_shader ------------------------ */ + +#ifndef GL_ATI_fragment_shader +#define GL_ATI_fragment_shader 1 + +#define GL_RED_BIT_ATI 0x00000001 +#define GL_2X_BIT_ATI 0x00000001 +#define GL_4X_BIT_ATI 0x00000002 +#define GL_GREEN_BIT_ATI 0x00000002 +#define GL_COMP_BIT_ATI 0x00000002 +#define GL_BLUE_BIT_ATI 0x00000004 +#define GL_8X_BIT_ATI 0x00000004 +#define GL_NEGATE_BIT_ATI 0x00000004 +#define GL_BIAS_BIT_ATI 0x00000008 +#define GL_HALF_BIT_ATI 0x00000008 +#define GL_QUARTER_BIT_ATI 0x00000010 +#define GL_EIGHTH_BIT_ATI 0x00000020 +#define GL_SATURATE_BIT_ATI 0x00000040 +#define GL_FRAGMENT_SHADER_ATI 0x8920 +#define GL_REG_0_ATI 0x8921 +#define GL_REG_1_ATI 0x8922 +#define GL_REG_2_ATI 0x8923 +#define GL_REG_3_ATI 0x8924 +#define GL_REG_4_ATI 0x8925 +#define GL_REG_5_ATI 0x8926 +#define GL_CON_0_ATI 0x8941 +#define GL_CON_1_ATI 0x8942 +#define GL_CON_2_ATI 0x8943 +#define GL_CON_3_ATI 0x8944 +#define GL_CON_4_ATI 0x8945 +#define GL_CON_5_ATI 0x8946 +#define GL_CON_6_ATI 0x8947 +#define GL_CON_7_ATI 0x8948 +#define GL_MOV_ATI 0x8961 +#define GL_ADD_ATI 0x8963 +#define GL_MUL_ATI 0x8964 +#define GL_SUB_ATI 0x8965 +#define GL_DOT3_ATI 0x8966 +#define GL_DOT4_ATI 0x8967 +#define GL_MAD_ATI 0x8968 +#define GL_LERP_ATI 0x8969 +#define GL_CND_ATI 0x896A +#define GL_CND0_ATI 0x896B +#define GL_DOT2_ADD_ATI 0x896C +#define GL_SECONDARY_INTERPOLATOR_ATI 0x896D +#define GL_NUM_FRAGMENT_REGISTERS_ATI 0x896E +#define GL_NUM_FRAGMENT_CONSTANTS_ATI 0x896F +#define GL_NUM_PASSES_ATI 0x8970 +#define GL_NUM_INSTRUCTIONS_PER_PASS_ATI 0x8971 +#define GL_NUM_INSTRUCTIONS_TOTAL_ATI 0x8972 +#define GL_NUM_INPUT_INTERPOLATOR_COMPONENTS_ATI 0x8973 +#define GL_NUM_LOOPBACK_COMPONENTS_ATI 0x8974 +#define GL_COLOR_ALPHA_PAIRING_ATI 0x8975 +#define GL_SWIZZLE_STR_ATI 0x8976 +#define GL_SWIZZLE_STQ_ATI 0x8977 +#define GL_SWIZZLE_STR_DR_ATI 0x8978 +#define GL_SWIZZLE_STQ_DQ_ATI 0x8979 +#define GL_SWIZZLE_STRQ_ATI 0x897A +#define GL_SWIZZLE_STRQ_DQ_ATI 0x897B + +typedef void (GLAPIENTRY * PFNGLALPHAFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +typedef void (GLAPIENTRY * PFNGLALPHAFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +typedef void (GLAPIENTRY * PFNGLALPHAFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); +typedef void (GLAPIENTRY * PFNGLBEGINFRAGMENTSHADERATIPROC) (void); +typedef void (GLAPIENTRY * PFNGLBINDFRAGMENTSHADERATIPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLCOLORFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +typedef void (GLAPIENTRY * PFNGLCOLORFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +typedef void (GLAPIENTRY * PFNGLCOLORFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); +typedef void (GLAPIENTRY * PFNGLDELETEFRAGMENTSHADERATIPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLENDFRAGMENTSHADERATIPROC) (void); +typedef GLuint (GLAPIENTRY * PFNGLGENFRAGMENTSHADERSATIPROC) (GLuint range); +typedef void (GLAPIENTRY * PFNGLPASSTEXCOORDATIPROC) (GLuint dst, GLuint coord, GLenum swizzle); +typedef void (GLAPIENTRY * PFNGLSAMPLEMAPATIPROC) (GLuint dst, GLuint interp, GLenum swizzle); +typedef void (GLAPIENTRY * PFNGLSETFRAGMENTSHADERCONSTANTATIPROC) (GLuint dst, const GLfloat* value); + +#define glAlphaFragmentOp1ATI GLEW_GET_FUN(__glewAlphaFragmentOp1ATI) +#define glAlphaFragmentOp2ATI GLEW_GET_FUN(__glewAlphaFragmentOp2ATI) +#define glAlphaFragmentOp3ATI GLEW_GET_FUN(__glewAlphaFragmentOp3ATI) +#define glBeginFragmentShaderATI GLEW_GET_FUN(__glewBeginFragmentShaderATI) +#define glBindFragmentShaderATI GLEW_GET_FUN(__glewBindFragmentShaderATI) +#define glColorFragmentOp1ATI GLEW_GET_FUN(__glewColorFragmentOp1ATI) +#define glColorFragmentOp2ATI GLEW_GET_FUN(__glewColorFragmentOp2ATI) +#define glColorFragmentOp3ATI GLEW_GET_FUN(__glewColorFragmentOp3ATI) +#define glDeleteFragmentShaderATI GLEW_GET_FUN(__glewDeleteFragmentShaderATI) +#define glEndFragmentShaderATI GLEW_GET_FUN(__glewEndFragmentShaderATI) +#define glGenFragmentShadersATI GLEW_GET_FUN(__glewGenFragmentShadersATI) +#define glPassTexCoordATI GLEW_GET_FUN(__glewPassTexCoordATI) +#define glSampleMapATI GLEW_GET_FUN(__glewSampleMapATI) +#define glSetFragmentShaderConstantATI GLEW_GET_FUN(__glewSetFragmentShaderConstantATI) + +#define GLEW_ATI_fragment_shader GLEW_GET_VAR(__GLEW_ATI_fragment_shader) + +#endif /* GL_ATI_fragment_shader */ + +/* ------------------------ GL_ATI_map_object_buffer ----------------------- */ + +#ifndef GL_ATI_map_object_buffer +#define GL_ATI_map_object_buffer 1 + +typedef void* (GLAPIENTRY * PFNGLMAPOBJECTBUFFERATIPROC) (GLuint buffer); +typedef void (GLAPIENTRY * PFNGLUNMAPOBJECTBUFFERATIPROC) (GLuint buffer); + +#define glMapObjectBufferATI GLEW_GET_FUN(__glewMapObjectBufferATI) +#define glUnmapObjectBufferATI GLEW_GET_FUN(__glewUnmapObjectBufferATI) + +#define GLEW_ATI_map_object_buffer GLEW_GET_VAR(__GLEW_ATI_map_object_buffer) + +#endif /* GL_ATI_map_object_buffer */ + +/* -------------------------- GL_ATI_pn_triangles -------------------------- */ + +#ifndef GL_ATI_pn_triangles +#define GL_ATI_pn_triangles 1 + +#define GL_PN_TRIANGLES_ATI 0x87F0 +#define GL_MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F1 +#define GL_PN_TRIANGLES_POINT_MODE_ATI 0x87F2 +#define GL_PN_TRIANGLES_NORMAL_MODE_ATI 0x87F3 +#define GL_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F4 +#define GL_PN_TRIANGLES_POINT_MODE_LINEAR_ATI 0x87F5 +#define GL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI 0x87F6 +#define GL_PN_TRIANGLES_NORMAL_MODE_LINEAR_ATI 0x87F7 +#define GL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI 0x87F8 + +typedef void (GLAPIENTRY * PFNGLPNTRIANGLESFATIPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLPNTRIANGLESIATIPROC) (GLenum pname, GLint param); + +#define glPNTrianglesfATI GLEW_GET_FUN(__glPNTrianglewesfATI) +#define glPNTrianglesiATI GLEW_GET_FUN(__glPNTrianglewesiATI) + +#define GLEW_ATI_pn_triangles GLEW_GET_VAR(__GLEW_ATI_pn_triangles) + +#endif /* GL_ATI_pn_triangles */ + +/* ------------------------ GL_ATI_separate_stencil ------------------------ */ + +#ifndef GL_ATI_separate_stencil +#define GL_ATI_separate_stencil 1 + +#define GL_STENCIL_BACK_FUNC_ATI 0x8800 +#define GL_STENCIL_BACK_FAIL_ATI 0x8801 +#define GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI 0x8802 +#define GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI 0x8803 + +typedef void (GLAPIENTRY * PFNGLSTENCILFUNCSEPARATEATIPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); +typedef void (GLAPIENTRY * PFNGLSTENCILOPSEPARATEATIPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); + +#define glStencilFuncSeparateATI GLEW_GET_FUN(__glewStencilFuncSeparateATI) +#define glStencilOpSeparateATI GLEW_GET_FUN(__glewStencilOpSeparateATI) + +#define GLEW_ATI_separate_stencil GLEW_GET_VAR(__GLEW_ATI_separate_stencil) + +#endif /* GL_ATI_separate_stencil */ + +/* ----------------------- GL_ATI_shader_texture_lod ----------------------- */ + +#ifndef GL_ATI_shader_texture_lod +#define GL_ATI_shader_texture_lod 1 + +#define GLEW_ATI_shader_texture_lod GLEW_GET_VAR(__GLEW_ATI_shader_texture_lod) + +#endif /* GL_ATI_shader_texture_lod */ + +/* ---------------------- GL_ATI_text_fragment_shader ---------------------- */ + +#ifndef GL_ATI_text_fragment_shader +#define GL_ATI_text_fragment_shader 1 + +#define GL_TEXT_FRAGMENT_SHADER_ATI 0x8200 + +#define GLEW_ATI_text_fragment_shader GLEW_GET_VAR(__GLEW_ATI_text_fragment_shader) + +#endif /* GL_ATI_text_fragment_shader */ + +/* --------------------- GL_ATI_texture_compression_3dc -------------------- */ + +#ifndef GL_ATI_texture_compression_3dc +#define GL_ATI_texture_compression_3dc 1 + +#define GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI 0x8837 + +#define GLEW_ATI_texture_compression_3dc GLEW_GET_VAR(__GLEW_ATI_texture_compression_3dc) + +#endif /* GL_ATI_texture_compression_3dc */ + +/* ---------------------- GL_ATI_texture_env_combine3 ---------------------- */ + +#ifndef GL_ATI_texture_env_combine3 +#define GL_ATI_texture_env_combine3 1 + +#define GL_MODULATE_ADD_ATI 0x8744 +#define GL_MODULATE_SIGNED_ADD_ATI 0x8745 +#define GL_MODULATE_SUBTRACT_ATI 0x8746 + +#define GLEW_ATI_texture_env_combine3 GLEW_GET_VAR(__GLEW_ATI_texture_env_combine3) + +#endif /* GL_ATI_texture_env_combine3 */ + +/* -------------------------- GL_ATI_texture_float ------------------------- */ + +#ifndef GL_ATI_texture_float +#define GL_ATI_texture_float 1 + +#define GL_RGBA_FLOAT32_ATI 0x8814 +#define GL_RGB_FLOAT32_ATI 0x8815 +#define GL_ALPHA_FLOAT32_ATI 0x8816 +#define GL_INTENSITY_FLOAT32_ATI 0x8817 +#define GL_LUMINANCE_FLOAT32_ATI 0x8818 +#define GL_LUMINANCE_ALPHA_FLOAT32_ATI 0x8819 +#define GL_RGBA_FLOAT16_ATI 0x881A +#define GL_RGB_FLOAT16_ATI 0x881B +#define GL_ALPHA_FLOAT16_ATI 0x881C +#define GL_INTENSITY_FLOAT16_ATI 0x881D +#define GL_LUMINANCE_FLOAT16_ATI 0x881E +#define GL_LUMINANCE_ALPHA_FLOAT16_ATI 0x881F + +#define GLEW_ATI_texture_float GLEW_GET_VAR(__GLEW_ATI_texture_float) + +#endif /* GL_ATI_texture_float */ + +/* ----------------------- GL_ATI_texture_mirror_once ---------------------- */ + +#ifndef GL_ATI_texture_mirror_once +#define GL_ATI_texture_mirror_once 1 + +#define GL_MIRROR_CLAMP_ATI 0x8742 +#define GL_MIRROR_CLAMP_TO_EDGE_ATI 0x8743 + +#define GLEW_ATI_texture_mirror_once GLEW_GET_VAR(__GLEW_ATI_texture_mirror_once) + +#endif /* GL_ATI_texture_mirror_once */ + +/* ----------------------- GL_ATI_vertex_array_object ---------------------- */ + +#ifndef GL_ATI_vertex_array_object +#define GL_ATI_vertex_array_object 1 + +#define GL_STATIC_ATI 0x8760 +#define GL_DYNAMIC_ATI 0x8761 +#define GL_PRESERVE_ATI 0x8762 +#define GL_DISCARD_ATI 0x8763 +#define GL_OBJECT_BUFFER_SIZE_ATI 0x8764 +#define GL_OBJECT_BUFFER_USAGE_ATI 0x8765 +#define GL_ARRAY_OBJECT_BUFFER_ATI 0x8766 +#define GL_ARRAY_OBJECT_OFFSET_ATI 0x8767 + +typedef void (GLAPIENTRY * PFNGLARRAYOBJECTATIPROC) (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); +typedef void (GLAPIENTRY * PFNGLFREEOBJECTBUFFERATIPROC) (GLuint buffer); +typedef void (GLAPIENTRY * PFNGLGETARRAYOBJECTFVATIPROC) (GLenum array, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETARRAYOBJECTIVATIPROC) (GLenum array, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETOBJECTBUFFERFVATIPROC) (GLuint buffer, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETOBJECTBUFFERIVATIPROC) (GLuint buffer, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETVARIANTARRAYOBJECTFVATIPROC) (GLuint id, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETVARIANTARRAYOBJECTIVATIPROC) (GLuint id, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISOBJECTBUFFERATIPROC) (GLuint buffer); +typedef GLuint (GLAPIENTRY * PFNGLNEWOBJECTBUFFERATIPROC) (GLsizei size, const void* pointer, GLenum usage); +typedef void (GLAPIENTRY * PFNGLUPDATEOBJECTBUFFERATIPROC) (GLuint buffer, GLuint offset, GLsizei size, const void* pointer, GLenum preserve); +typedef void (GLAPIENTRY * PFNGLVARIANTARRAYOBJECTATIPROC) (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); + +#define glArrayObjectATI GLEW_GET_FUN(__glewArrayObjectATI) +#define glFreeObjectBufferATI GLEW_GET_FUN(__glewFreeObjectBufferATI) +#define glGetArrayObjectfvATI GLEW_GET_FUN(__glewGetArrayObjectfvATI) +#define glGetArrayObjectivATI GLEW_GET_FUN(__glewGetArrayObjectivATI) +#define glGetObjectBufferfvATI GLEW_GET_FUN(__glewGetObjectBufferfvATI) +#define glGetObjectBufferivATI GLEW_GET_FUN(__glewGetObjectBufferivATI) +#define glGetVariantArrayObjectfvATI GLEW_GET_FUN(__glewGetVariantArrayObjectfvATI) +#define glGetVariantArrayObjectivATI GLEW_GET_FUN(__glewGetVariantArrayObjectivATI) +#define glIsObjectBufferATI GLEW_GET_FUN(__glewIsObjectBufferATI) +#define glNewObjectBufferATI GLEW_GET_FUN(__glewNewObjectBufferATI) +#define glUpdateObjectBufferATI GLEW_GET_FUN(__glewUpdateObjectBufferATI) +#define glVariantArrayObjectATI GLEW_GET_FUN(__glewVariantArrayObjectATI) + +#define GLEW_ATI_vertex_array_object GLEW_GET_VAR(__GLEW_ATI_vertex_array_object) + +#endif /* GL_ATI_vertex_array_object */ + +/* ------------------- GL_ATI_vertex_attrib_array_object ------------------- */ + +#ifndef GL_ATI_vertex_attrib_array_object +#define GL_ATI_vertex_attrib_array_object 1 + +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC) (GLuint index, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC) (GLuint index, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBARRAYOBJECTATIPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset); + +#define glGetVertexAttribArrayObjectfvATI GLEW_GET_FUN(__glewGetVertexAttribArrayObjectfvATI) +#define glGetVertexAttribArrayObjectivATI GLEW_GET_FUN(__glewGetVertexAttribArrayObjectivATI) +#define glVertexAttribArrayObjectATI GLEW_GET_FUN(__glewVertexAttribArrayObjectATI) + +#define GLEW_ATI_vertex_attrib_array_object GLEW_GET_VAR(__GLEW_ATI_vertex_attrib_array_object) + +#endif /* GL_ATI_vertex_attrib_array_object */ + +/* ------------------------- GL_ATI_vertex_streams ------------------------- */ + +#ifndef GL_ATI_vertex_streams +#define GL_ATI_vertex_streams 1 + +#define GL_MAX_VERTEX_STREAMS_ATI 0x876B +#define GL_VERTEX_SOURCE_ATI 0x876C +#define GL_VERTEX_STREAM0_ATI 0x876D +#define GL_VERTEX_STREAM1_ATI 0x876E +#define GL_VERTEX_STREAM2_ATI 0x876F +#define GL_VERTEX_STREAM3_ATI 0x8770 +#define GL_VERTEX_STREAM4_ATI 0x8771 +#define GL_VERTEX_STREAM5_ATI 0x8772 +#define GL_VERTEX_STREAM6_ATI 0x8773 +#define GL_VERTEX_STREAM7_ATI 0x8774 + +typedef void (GLAPIENTRY * PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC) (GLenum stream); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3BATIPROC) (GLenum stream, GLbyte x, GLbyte y, GLbyte z); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3BVATIPROC) (GLenum stream, const GLbyte *v); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3DVATIPROC) (GLenum stream, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3FVATIPROC) (GLenum stream, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3IVATIPROC) (GLenum stream, const GLint *v); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3SVATIPROC) (GLenum stream, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLVERTEXBLENDENVFATIPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLVERTEXBLENDENVIATIPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2DATIPROC) (GLenum stream, GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2DVATIPROC) (GLenum stream, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2FATIPROC) (GLenum stream, GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2FVATIPROC) (GLenum stream, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2IATIPROC) (GLenum stream, GLint x, GLint y); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2IVATIPROC) (GLenum stream, const GLint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2SATIPROC) (GLenum stream, GLshort x, GLshort y); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2SVATIPROC) (GLenum stream, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3DVATIPROC) (GLenum stream, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3FVATIPROC) (GLenum stream, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3IVATIPROC) (GLenum stream, const GLint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3SVATIPROC) (GLenum stream, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4DVATIPROC) (GLenum stream, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4FVATIPROC) (GLenum stream, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4IATIPROC) (GLenum stream, GLint x, GLint y, GLint z, GLint w); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4IVATIPROC) (GLenum stream, const GLint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4SVATIPROC) (GLenum stream, const GLshort *v); + +#define glClientActiveVertexStreamATI GLEW_GET_FUN(__glewClientActiveVertexStreamATI) +#define glNormalStream3bATI GLEW_GET_FUN(__glewNormalStream3bATI) +#define glNormalStream3bvATI GLEW_GET_FUN(__glewNormalStream3bvATI) +#define glNormalStream3dATI GLEW_GET_FUN(__glewNormalStream3dATI) +#define glNormalStream3dvATI GLEW_GET_FUN(__glewNormalStream3dvATI) +#define glNormalStream3fATI GLEW_GET_FUN(__glewNormalStream3fATI) +#define glNormalStream3fvATI GLEW_GET_FUN(__glewNormalStream3fvATI) +#define glNormalStream3iATI GLEW_GET_FUN(__glewNormalStream3iATI) +#define glNormalStream3ivATI GLEW_GET_FUN(__glewNormalStream3ivATI) +#define glNormalStream3sATI GLEW_GET_FUN(__glewNormalStream3sATI) +#define glNormalStream3svATI GLEW_GET_FUN(__glewNormalStream3svATI) +#define glVertexBlendEnvfATI GLEW_GET_FUN(__glewVertexBlendEnvfATI) +#define glVertexBlendEnviATI GLEW_GET_FUN(__glewVertexBlendEnviATI) +#define glVertexStream2dATI GLEW_GET_FUN(__glewVertexStream2dATI) +#define glVertexStream2dvATI GLEW_GET_FUN(__glewVertexStream2dvATI) +#define glVertexStream2fATI GLEW_GET_FUN(__glewVertexStream2fATI) +#define glVertexStream2fvATI GLEW_GET_FUN(__glewVertexStream2fvATI) +#define glVertexStream2iATI GLEW_GET_FUN(__glewVertexStream2iATI) +#define glVertexStream2ivATI GLEW_GET_FUN(__glewVertexStream2ivATI) +#define glVertexStream2sATI GLEW_GET_FUN(__glewVertexStream2sATI) +#define glVertexStream2svATI GLEW_GET_FUN(__glewVertexStream2svATI) +#define glVertexStream3dATI GLEW_GET_FUN(__glewVertexStream3dATI) +#define glVertexStream3dvATI GLEW_GET_FUN(__glewVertexStream3dvATI) +#define glVertexStream3fATI GLEW_GET_FUN(__glewVertexStream3fATI) +#define glVertexStream3fvATI GLEW_GET_FUN(__glewVertexStream3fvATI) +#define glVertexStream3iATI GLEW_GET_FUN(__glewVertexStream3iATI) +#define glVertexStream3ivATI GLEW_GET_FUN(__glewVertexStream3ivATI) +#define glVertexStream3sATI GLEW_GET_FUN(__glewVertexStream3sATI) +#define glVertexStream3svATI GLEW_GET_FUN(__glewVertexStream3svATI) +#define glVertexStream4dATI GLEW_GET_FUN(__glewVertexStream4dATI) +#define glVertexStream4dvATI GLEW_GET_FUN(__glewVertexStream4dvATI) +#define glVertexStream4fATI GLEW_GET_FUN(__glewVertexStream4fATI) +#define glVertexStream4fvATI GLEW_GET_FUN(__glewVertexStream4fvATI) +#define glVertexStream4iATI GLEW_GET_FUN(__glewVertexStream4iATI) +#define glVertexStream4ivATI GLEW_GET_FUN(__glewVertexStream4ivATI) +#define glVertexStream4sATI GLEW_GET_FUN(__glewVertexStream4sATI) +#define glVertexStream4svATI GLEW_GET_FUN(__glewVertexStream4svATI) + +#define GLEW_ATI_vertex_streams GLEW_GET_VAR(__GLEW_ATI_vertex_streams) + +#endif /* GL_ATI_vertex_streams */ + +/* --------------------------- GL_EXT_422_pixels --------------------------- */ + +#ifndef GL_EXT_422_pixels +#define GL_EXT_422_pixels 1 + +#define GL_422_EXT 0x80CC +#define GL_422_REV_EXT 0x80CD +#define GL_422_AVERAGE_EXT 0x80CE +#define GL_422_REV_AVERAGE_EXT 0x80CF + +#define GLEW_EXT_422_pixels GLEW_GET_VAR(__GLEW_EXT_422_pixels) + +#endif /* GL_EXT_422_pixels */ + +/* ---------------------------- GL_EXT_Cg_shader --------------------------- */ + +#ifndef GL_EXT_Cg_shader +#define GL_EXT_Cg_shader 1 + +#define GL_CG_VERTEX_SHADER_EXT 0x890E +#define GL_CG_FRAGMENT_SHADER_EXT 0x890F + +#define GLEW_EXT_Cg_shader GLEW_GET_VAR(__GLEW_EXT_Cg_shader) + +#endif /* GL_EXT_Cg_shader */ + +/* ------------------------------ GL_EXT_abgr ------------------------------ */ + +#ifndef GL_EXT_abgr +#define GL_EXT_abgr 1 + +#define GL_ABGR_EXT 0x8000 + +#define GLEW_EXT_abgr GLEW_GET_VAR(__GLEW_EXT_abgr) + +#endif /* GL_EXT_abgr */ + +/* ------------------------------ GL_EXT_bgra ------------------------------ */ + +#ifndef GL_EXT_bgra +#define GL_EXT_bgra 1 + +#define GL_BGR_EXT 0x80E0 +#define GL_BGRA_EXT 0x80E1 + +#define GLEW_EXT_bgra GLEW_GET_VAR(__GLEW_EXT_bgra) + +#endif /* GL_EXT_bgra */ + +/* ------------------------ GL_EXT_bindable_uniform ------------------------ */ + +#ifndef GL_EXT_bindable_uniform +#define GL_EXT_bindable_uniform 1 + +#define GL_MAX_VERTEX_BINDABLE_UNIFORMS_EXT 0x8DE2 +#define GL_MAX_FRAGMENT_BINDABLE_UNIFORMS_EXT 0x8DE3 +#define GL_MAX_GEOMETRY_BINDABLE_UNIFORMS_EXT 0x8DE4 +#define GL_MAX_BINDABLE_UNIFORM_SIZE_EXT 0x8DED +#define GL_UNIFORM_BUFFER_EXT 0x8DEE +#define GL_UNIFORM_BUFFER_BINDING_EXT 0x8DEF + +typedef GLint (GLAPIENTRY * PFNGLGETUNIFORMBUFFERSIZEEXTPROC) (GLuint program, GLint location); +typedef GLintptr (GLAPIENTRY * PFNGLGETUNIFORMOFFSETEXTPROC) (GLuint program, GLint location); +typedef void (GLAPIENTRY * PFNGLUNIFORMBUFFEREXTPROC) (GLuint program, GLint location, GLuint buffer); + +#define glGetUniformBufferSizeEXT GLEW_GET_FUN(__glewGetUniformBufferSizeEXT) +#define glGetUniformOffsetEXT GLEW_GET_FUN(__glewGetUniformOffsetEXT) +#define glUniformBufferEXT GLEW_GET_FUN(__glewUniformBufferEXT) + +#define GLEW_EXT_bindable_uniform GLEW_GET_VAR(__GLEW_EXT_bindable_uniform) + +#endif /* GL_EXT_bindable_uniform */ + +/* --------------------------- GL_EXT_blend_color -------------------------- */ + +#ifndef GL_EXT_blend_color +#define GL_EXT_blend_color 1 + +#define GL_CONSTANT_COLOR_EXT 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR_EXT 0x8002 +#define GL_CONSTANT_ALPHA_EXT 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA_EXT 0x8004 +#define GL_BLEND_COLOR_EXT 0x8005 + +typedef void (GLAPIENTRY * PFNGLBLENDCOLOREXTPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); + +#define glBlendColorEXT GLEW_GET_FUN(__glewBlendColorEXT) + +#define GLEW_EXT_blend_color GLEW_GET_VAR(__GLEW_EXT_blend_color) + +#endif /* GL_EXT_blend_color */ + +/* --------------------- GL_EXT_blend_equation_separate -------------------- */ + +#ifndef GL_EXT_blend_equation_separate +#define GL_EXT_blend_equation_separate 1 + +#define GL_BLEND_EQUATION_RGB_EXT 0x8009 +#define GL_BLEND_EQUATION_ALPHA_EXT 0x883D + +typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEEXTPROC) (GLenum modeRGB, GLenum modeAlpha); + +#define glBlendEquationSeparateEXT GLEW_GET_FUN(__glewBlendEquationSeparateEXT) + +#define GLEW_EXT_blend_equation_separate GLEW_GET_VAR(__GLEW_EXT_blend_equation_separate) + +#endif /* GL_EXT_blend_equation_separate */ + +/* ----------------------- GL_EXT_blend_func_separate ---------------------- */ + +#ifndef GL_EXT_blend_func_separate +#define GL_EXT_blend_func_separate 1 + +#define GL_BLEND_DST_RGB_EXT 0x80C8 +#define GL_BLEND_SRC_RGB_EXT 0x80C9 +#define GL_BLEND_DST_ALPHA_EXT 0x80CA +#define GL_BLEND_SRC_ALPHA_EXT 0x80CB + +typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEEXTPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); + +#define glBlendFuncSeparateEXT GLEW_GET_FUN(__glewBlendFuncSeparateEXT) + +#define GLEW_EXT_blend_func_separate GLEW_GET_VAR(__GLEW_EXT_blend_func_separate) + +#endif /* GL_EXT_blend_func_separate */ + +/* ------------------------- GL_EXT_blend_logic_op ------------------------- */ + +#ifndef GL_EXT_blend_logic_op +#define GL_EXT_blend_logic_op 1 + +#define GLEW_EXT_blend_logic_op GLEW_GET_VAR(__GLEW_EXT_blend_logic_op) + +#endif /* GL_EXT_blend_logic_op */ + +/* -------------------------- GL_EXT_blend_minmax -------------------------- */ + +#ifndef GL_EXT_blend_minmax +#define GL_EXT_blend_minmax 1 + +#define GL_FUNC_ADD_EXT 0x8006 +#define GL_MIN_EXT 0x8007 +#define GL_MAX_EXT 0x8008 +#define GL_BLEND_EQUATION_EXT 0x8009 + +typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONEXTPROC) (GLenum mode); + +#define glBlendEquationEXT GLEW_GET_FUN(__glewBlendEquationEXT) + +#define GLEW_EXT_blend_minmax GLEW_GET_VAR(__GLEW_EXT_blend_minmax) + +#endif /* GL_EXT_blend_minmax */ + +/* ------------------------- GL_EXT_blend_subtract ------------------------- */ + +#ifndef GL_EXT_blend_subtract +#define GL_EXT_blend_subtract 1 + +#define GL_FUNC_SUBTRACT_EXT 0x800A +#define GL_FUNC_REVERSE_SUBTRACT_EXT 0x800B + +#define GLEW_EXT_blend_subtract GLEW_GET_VAR(__GLEW_EXT_blend_subtract) + +#endif /* GL_EXT_blend_subtract */ + +/* ------------------------ GL_EXT_clip_volume_hint ------------------------ */ + +#ifndef GL_EXT_clip_volume_hint +#define GL_EXT_clip_volume_hint 1 + +#define GL_CLIP_VOLUME_CLIPPING_HINT_EXT 0x80F0 + +#define GLEW_EXT_clip_volume_hint GLEW_GET_VAR(__GLEW_EXT_clip_volume_hint) + +#endif /* GL_EXT_clip_volume_hint */ + +/* ------------------------------ GL_EXT_cmyka ----------------------------- */ + +#ifndef GL_EXT_cmyka +#define GL_EXT_cmyka 1 + +#define GL_CMYK_EXT 0x800C +#define GL_CMYKA_EXT 0x800D +#define GL_PACK_CMYK_HINT_EXT 0x800E +#define GL_UNPACK_CMYK_HINT_EXT 0x800F + +#define GLEW_EXT_cmyka GLEW_GET_VAR(__GLEW_EXT_cmyka) + +#endif /* GL_EXT_cmyka */ + +/* ------------------------- GL_EXT_color_subtable ------------------------- */ + +#ifndef GL_EXT_color_subtable +#define GL_EXT_color_subtable 1 + +typedef void (GLAPIENTRY * PFNGLCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void* data); +typedef void (GLAPIENTRY * PFNGLCOPYCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); + +#define glColorSubTableEXT GLEW_GET_FUN(__glewColorSubTableEXT) +#define glCopyColorSubTableEXT GLEW_GET_FUN(__glewCopyColorSubTableEXT) + +#define GLEW_EXT_color_subtable GLEW_GET_VAR(__GLEW_EXT_color_subtable) + +#endif /* GL_EXT_color_subtable */ + +/* ---------------------- GL_EXT_compiled_vertex_array --------------------- */ + +#ifndef GL_EXT_compiled_vertex_array +#define GL_EXT_compiled_vertex_array 1 + +typedef void (GLAPIENTRY * PFNGLLOCKARRAYSEXTPROC) (GLint first, GLsizei count); +typedef void (GLAPIENTRY * PFNGLUNLOCKARRAYSEXTPROC) (void); + +#define glLockArraysEXT GLEW_GET_FUN(__glewLockArraysEXT) +#define glUnlockArraysEXT GLEW_GET_FUN(__glewUnlockArraysEXT) + +#define GLEW_EXT_compiled_vertex_array GLEW_GET_VAR(__GLEW_EXT_compiled_vertex_array) + +#endif /* GL_EXT_compiled_vertex_array */ + +/* --------------------------- GL_EXT_convolution -------------------------- */ + +#ifndef GL_EXT_convolution +#define GL_EXT_convolution 1 + +#define GL_CONVOLUTION_1D_EXT 0x8010 +#define GL_CONVOLUTION_2D_EXT 0x8011 +#define GL_SEPARABLE_2D_EXT 0x8012 +#define GL_CONVOLUTION_BORDER_MODE_EXT 0x8013 +#define GL_CONVOLUTION_FILTER_SCALE_EXT 0x8014 +#define GL_CONVOLUTION_FILTER_BIAS_EXT 0x8015 +#define GL_REDUCE_EXT 0x8016 +#define GL_CONVOLUTION_FORMAT_EXT 0x8017 +#define GL_CONVOLUTION_WIDTH_EXT 0x8018 +#define GL_CONVOLUTION_HEIGHT_EXT 0x8019 +#define GL_MAX_CONVOLUTION_WIDTH_EXT 0x801A +#define GL_MAX_CONVOLUTION_HEIGHT_EXT 0x801B +#define GL_POST_CONVOLUTION_RED_SCALE_EXT 0x801C +#define GL_POST_CONVOLUTION_GREEN_SCALE_EXT 0x801D +#define GL_POST_CONVOLUTION_BLUE_SCALE_EXT 0x801E +#define GL_POST_CONVOLUTION_ALPHA_SCALE_EXT 0x801F +#define GL_POST_CONVOLUTION_RED_BIAS_EXT 0x8020 +#define GL_POST_CONVOLUTION_GREEN_BIAS_EXT 0x8021 +#define GL_POST_CONVOLUTION_BLUE_BIAS_EXT 0x8022 +#define GL_POST_CONVOLUTION_ALPHA_BIAS_EXT 0x8023 + +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void* image); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* image); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, void* image); +typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETSEPARABLEFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, void* row, void* column, void* span); +typedef void (GLAPIENTRY * PFNGLSEPARABLEFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* row, const void* column); + +#define glConvolutionFilter1DEXT GLEW_GET_FUN(__glewConvolutionFilter1DEXT) +#define glConvolutionFilter2DEXT GLEW_GET_FUN(__glewConvolutionFilter2DEXT) +#define glConvolutionParameterfEXT GLEW_GET_FUN(__glewConvolutionParameterfEXT) +#define glConvolutionParameterfvEXT GLEW_GET_FUN(__glewConvolutionParameterfvEXT) +#define glConvolutionParameteriEXT GLEW_GET_FUN(__glewConvolutionParameteriEXT) +#define glConvolutionParameterivEXT GLEW_GET_FUN(__glewConvolutionParameterivEXT) +#define glCopyConvolutionFilter1DEXT GLEW_GET_FUN(__glewCopyConvolutionFilter1DEXT) +#define glCopyConvolutionFilter2DEXT GLEW_GET_FUN(__glewCopyConvolutionFilter2DEXT) +#define glGetConvolutionFilterEXT GLEW_GET_FUN(__glewGetConvolutionFilterEXT) +#define glGetConvolutionParameterfvEXT GLEW_GET_FUN(__glewGetConvolutionParameterfvEXT) +#define glGetConvolutionParameterivEXT GLEW_GET_FUN(__glewGetConvolutionParameterivEXT) +#define glGetSeparableFilterEXT GLEW_GET_FUN(__glewGetSeparableFilterEXT) +#define glSeparableFilter2DEXT GLEW_GET_FUN(__glewSeparableFilter2DEXT) + +#define GLEW_EXT_convolution GLEW_GET_VAR(__GLEW_EXT_convolution) + +#endif /* GL_EXT_convolution */ + +/* ------------------------ GL_EXT_coordinate_frame ------------------------ */ + +#ifndef GL_EXT_coordinate_frame +#define GL_EXT_coordinate_frame 1 + +#define GL_TANGENT_ARRAY_EXT 0x8439 +#define GL_BINORMAL_ARRAY_EXT 0x843A +#define GL_CURRENT_TANGENT_EXT 0x843B +#define GL_CURRENT_BINORMAL_EXT 0x843C +#define GL_TANGENT_ARRAY_TYPE_EXT 0x843E +#define GL_TANGENT_ARRAY_STRIDE_EXT 0x843F +#define GL_BINORMAL_ARRAY_TYPE_EXT 0x8440 +#define GL_BINORMAL_ARRAY_STRIDE_EXT 0x8441 +#define GL_TANGENT_ARRAY_POINTER_EXT 0x8442 +#define GL_BINORMAL_ARRAY_POINTER_EXT 0x8443 +#define GL_MAP1_TANGENT_EXT 0x8444 +#define GL_MAP2_TANGENT_EXT 0x8445 +#define GL_MAP1_BINORMAL_EXT 0x8446 +#define GL_MAP2_BINORMAL_EXT 0x8447 + +typedef void (GLAPIENTRY * PFNGLBINORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, void* pointer); +typedef void (GLAPIENTRY * PFNGLTANGENTPOINTEREXTPROC) (GLenum type, GLsizei stride, void* pointer); + +#define glBinormalPointerEXT GLEW_GET_FUN(__glewBinormalPointerEXT) +#define glTangentPointerEXT GLEW_GET_FUN(__glewTangentPointerEXT) + +#define GLEW_EXT_coordinate_frame GLEW_GET_VAR(__GLEW_EXT_coordinate_frame) + +#endif /* GL_EXT_coordinate_frame */ + +/* -------------------------- GL_EXT_copy_texture -------------------------- */ + +#ifndef GL_EXT_copy_texture +#define GL_EXT_copy_texture 1 + +typedef void (GLAPIENTRY * PFNGLCOPYTEXIMAGE1DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +typedef void (GLAPIENTRY * PFNGLCOPYTEXIMAGE2DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); + +#define glCopyTexImage1DEXT GLEW_GET_FUN(__glewCopyTexImage1DEXT) +#define glCopyTexImage2DEXT GLEW_GET_FUN(__glewCopyTexImage2DEXT) +#define glCopyTexSubImage1DEXT GLEW_GET_FUN(__glewCopyTexSubImage1DEXT) +#define glCopyTexSubImage2DEXT GLEW_GET_FUN(__glewCopyTexSubImage2DEXT) +#define glCopyTexSubImage3DEXT GLEW_GET_FUN(__glewCopyTexSubImage3DEXT) + +#define GLEW_EXT_copy_texture GLEW_GET_VAR(__GLEW_EXT_copy_texture) + +#endif /* GL_EXT_copy_texture */ + +/* --------------------------- GL_EXT_cull_vertex -------------------------- */ + +#ifndef GL_EXT_cull_vertex +#define GL_EXT_cull_vertex 1 + +typedef void (GLAPIENTRY * PFNGLCULLPARAMETERDVEXTPROC) (GLenum pname, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLCULLPARAMETERFVEXTPROC) (GLenum pname, GLfloat* params); + +#define glCullParameterdvEXT GLEW_GET_FUN(__glewCullParameterdvEXT) +#define glCullParameterfvEXT GLEW_GET_FUN(__glewCullParameterfvEXT) + +#define GLEW_EXT_cull_vertex GLEW_GET_VAR(__GLEW_EXT_cull_vertex) + +#endif /* GL_EXT_cull_vertex */ + +/* ------------------------ GL_EXT_depth_bounds_test ----------------------- */ + +#ifndef GL_EXT_depth_bounds_test +#define GL_EXT_depth_bounds_test 1 + +#define GL_DEPTH_BOUNDS_TEST_EXT 0x8890 +#define GL_DEPTH_BOUNDS_EXT 0x8891 + +typedef void (GLAPIENTRY * PFNGLDEPTHBOUNDSEXTPROC) (GLclampd zmin, GLclampd zmax); + +#define glDepthBoundsEXT GLEW_GET_FUN(__glewDepthBoundsEXT) + +#define GLEW_EXT_depth_bounds_test GLEW_GET_VAR(__GLEW_EXT_depth_bounds_test) + +#endif /* GL_EXT_depth_bounds_test */ + +/* -------------------------- GL_EXT_draw_buffers2 ------------------------- */ + +#ifndef GL_EXT_draw_buffers2 +#define GL_EXT_draw_buffers2 1 + +typedef void (GLAPIENTRY * PFNGLCOLORMASKINDEXEDEXTPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +typedef void (GLAPIENTRY * PFNGLDISABLEINDEXEDEXTPROC) (GLenum target, GLuint index); +typedef void (GLAPIENTRY * PFNGLENABLEINDEXEDEXTPROC) (GLenum target, GLuint index); +typedef void (GLAPIENTRY * PFNGLGETBOOLEANINDEXEDVEXTPROC) (GLenum target, GLuint index, GLboolean *data); +typedef void (GLAPIENTRY * PFNGLGETINTEGERINDEXEDVEXTPROC) (GLenum target, GLuint index, GLint *data); +typedef GLboolean (GLAPIENTRY * PFNGLISENABLEDINDEXEDEXTPROC) (GLenum target, GLuint index); + +#define glColorMaskIndexedEXT GLEW_GET_FUN(__glewColorMaskIndexedEXT) +#define glDisableIndexedEXT GLEW_GET_FUN(__glewDisableIndexedEXT) +#define glEnableIndexedEXT GLEW_GET_FUN(__glewEnableIndexedEXT) +#define glGetBooleanIndexedvEXT GLEW_GET_FUN(__glewGetBooleanIndexedvEXT) +#define glGetIntegerIndexedvEXT GLEW_GET_FUN(__glewGetIntegerIndexedvEXT) +#define glIsEnabledIndexedEXT GLEW_GET_FUN(__glewIsEnabledIndexedEXT) + +#define GLEW_EXT_draw_buffers2 GLEW_GET_VAR(__GLEW_EXT_draw_buffers2) + +#endif /* GL_EXT_draw_buffers2 */ + +/* ------------------------- GL_EXT_draw_instanced ------------------------- */ + +#ifndef GL_EXT_draw_instanced +#define GL_EXT_draw_instanced 1 + +typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDEXTPROC) (GLenum mode, GLint start, GLsizei count, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDEXTPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount); + +#define glDrawArraysInstancedEXT GLEW_GET_FUN(__glewDrawArraysInstancedEXT) +#define glDrawElementsInstancedEXT GLEW_GET_FUN(__glewDrawElementsInstancedEXT) + +#define GLEW_EXT_draw_instanced GLEW_GET_VAR(__GLEW_EXT_draw_instanced) + +#endif /* GL_EXT_draw_instanced */ + +/* ----------------------- GL_EXT_draw_range_elements ---------------------- */ + +#ifndef GL_EXT_draw_range_elements +#define GL_EXT_draw_range_elements 1 + +#define GL_MAX_ELEMENTS_VERTICES 0x80E8 +#define GL_MAX_ELEMENTS_INDICES 0x80E9 + +typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); + +#define glDrawRangeElementsEXT GLEW_GET_FUN(__glewDrawRangeElementsEXT) + +#define GLEW_EXT_draw_range_elements GLEW_GET_VAR(__GLEW_EXT_draw_range_elements) + +#endif /* GL_EXT_draw_range_elements */ + +/* ---------------------------- GL_EXT_fog_coord --------------------------- */ + +#ifndef GL_EXT_fog_coord +#define GL_EXT_fog_coord 1 + +#define GL_FOG_COORDINATE_SOURCE_EXT 0x8450 +#define GL_FOG_COORDINATE_EXT 0x8451 +#define GL_FRAGMENT_DEPTH_EXT 0x8452 +#define GL_CURRENT_FOG_COORDINATE_EXT 0x8453 +#define GL_FOG_COORDINATE_ARRAY_TYPE_EXT 0x8454 +#define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT 0x8455 +#define GL_FOG_COORDINATE_ARRAY_POINTER_EXT 0x8456 +#define GL_FOG_COORDINATE_ARRAY_EXT 0x8457 + +typedef void (GLAPIENTRY * PFNGLFOGCOORDPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (GLAPIENTRY * PFNGLFOGCOORDDEXTPROC) (GLdouble coord); +typedef void (GLAPIENTRY * PFNGLFOGCOORDDVEXTPROC) (const GLdouble *coord); +typedef void (GLAPIENTRY * PFNGLFOGCOORDFEXTPROC) (GLfloat coord); +typedef void (GLAPIENTRY * PFNGLFOGCOORDFVEXTPROC) (const GLfloat *coord); + +#define glFogCoordPointerEXT GLEW_GET_FUN(__glewFogCoordPointerEXT) +#define glFogCoorddEXT GLEW_GET_FUN(__glewFogCoorddEXT) +#define glFogCoorddvEXT GLEW_GET_FUN(__glewFogCoorddvEXT) +#define glFogCoordfEXT GLEW_GET_FUN(__glewFogCoordfEXT) +#define glFogCoordfvEXT GLEW_GET_FUN(__glewFogCoordfvEXT) + +#define GLEW_EXT_fog_coord GLEW_GET_VAR(__GLEW_EXT_fog_coord) + +#endif /* GL_EXT_fog_coord */ + +/* ------------------------ GL_EXT_fragment_lighting ----------------------- */ + +#ifndef GL_EXT_fragment_lighting +#define GL_EXT_fragment_lighting 1 + +#define GL_FRAGMENT_LIGHTING_EXT 0x8400 +#define GL_FRAGMENT_COLOR_MATERIAL_EXT 0x8401 +#define GL_FRAGMENT_COLOR_MATERIAL_FACE_EXT 0x8402 +#define GL_FRAGMENT_COLOR_MATERIAL_PARAMETER_EXT 0x8403 +#define GL_MAX_FRAGMENT_LIGHTS_EXT 0x8404 +#define GL_MAX_ACTIVE_LIGHTS_EXT 0x8405 +#define GL_CURRENT_RASTER_NORMAL_EXT 0x8406 +#define GL_LIGHT_ENV_MODE_EXT 0x8407 +#define GL_FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_EXT 0x8408 +#define GL_FRAGMENT_LIGHT_MODEL_TWO_SIDE_EXT 0x8409 +#define GL_FRAGMENT_LIGHT_MODEL_AMBIENT_EXT 0x840A +#define GL_FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_EXT 0x840B +#define GL_FRAGMENT_LIGHT0_EXT 0x840C +#define GL_FRAGMENT_LIGHT7_EXT 0x8413 + +typedef void (GLAPIENTRY * PFNGLFRAGMENTCOLORMATERIALEXTPROC) (GLenum face, GLenum mode); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFEXTPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFVEXTPROC) (GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELIEXTPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELIVEXTPROC) (GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFEXTPROC) (GLenum light, GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFVEXTPROC) (GLenum light, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTIEXTPROC) (GLenum light, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTIVEXTPROC) (GLenum light, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFEXTPROC) (GLenum face, GLenum pname, const GLfloat param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFVEXTPROC) (GLenum face, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALIEXTPROC) (GLenum face, GLenum pname, const GLint param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALIVEXTPROC) (GLenum face, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTFVEXTPROC) (GLenum light, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTIVEXTPROC) (GLenum light, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALFVEXTPROC) (GLenum face, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALIVEXTPROC) (GLenum face, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLLIGHTENVIEXTPROC) (GLenum pname, GLint param); + +#define glFragmentColorMaterialEXT GLEW_GET_FUN(__glewFragmentColorMaterialEXT) +#define glFragmentLightModelfEXT GLEW_GET_FUN(__glewFragmentLightModelfEXT) +#define glFragmentLightModelfvEXT GLEW_GET_FUN(__glewFragmentLightModelfvEXT) +#define glFragmentLightModeliEXT GLEW_GET_FUN(__glewFragmentLightModeliEXT) +#define glFragmentLightModelivEXT GLEW_GET_FUN(__glewFragmentLightModelivEXT) +#define glFragmentLightfEXT GLEW_GET_FUN(__glewFragmentLightfEXT) +#define glFragmentLightfvEXT GLEW_GET_FUN(__glewFragmentLightfvEXT) +#define glFragmentLightiEXT GLEW_GET_FUN(__glewFragmentLightiEXT) +#define glFragmentLightivEXT GLEW_GET_FUN(__glewFragmentLightivEXT) +#define glFragmentMaterialfEXT GLEW_GET_FUN(__glewFragmentMaterialfEXT) +#define glFragmentMaterialfvEXT GLEW_GET_FUN(__glewFragmentMaterialfvEXT) +#define glFragmentMaterialiEXT GLEW_GET_FUN(__glewFragmentMaterialiEXT) +#define glFragmentMaterialivEXT GLEW_GET_FUN(__glewFragmentMaterialivEXT) +#define glGetFragmentLightfvEXT GLEW_GET_FUN(__glewGetFragmentLightfvEXT) +#define glGetFragmentLightivEXT GLEW_GET_FUN(__glewGetFragmentLightivEXT) +#define glGetFragmentMaterialfvEXT GLEW_GET_FUN(__glewGetFragmentMaterialfvEXT) +#define glGetFragmentMaterialivEXT GLEW_GET_FUN(__glewGetFragmentMaterialivEXT) +#define glLightEnviEXT GLEW_GET_FUN(__glewLightEnviEXT) + +#define GLEW_EXT_fragment_lighting GLEW_GET_VAR(__GLEW_EXT_fragment_lighting) + +#endif /* GL_EXT_fragment_lighting */ + +/* ------------------------ GL_EXT_framebuffer_blit ------------------------ */ + +#ifndef GL_EXT_framebuffer_blit +#define GL_EXT_framebuffer_blit 1 + +#define GL_DRAW_FRAMEBUFFER_BINDING_EXT 0x8CA6 +#define GL_READ_FRAMEBUFFER_EXT 0x8CA8 +#define GL_DRAW_FRAMEBUFFER_EXT 0x8CA9 +#define GL_READ_FRAMEBUFFER_BINDING_EXT 0x8CAA + +typedef void (GLAPIENTRY * PFNGLBLITFRAMEBUFFEREXTPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); + +#define glBlitFramebufferEXT GLEW_GET_FUN(__glewBlitFramebufferEXT) + +#define GLEW_EXT_framebuffer_blit GLEW_GET_VAR(__GLEW_EXT_framebuffer_blit) + +#endif /* GL_EXT_framebuffer_blit */ + +/* --------------------- GL_EXT_framebuffer_multisample -------------------- */ + +#ifndef GL_EXT_framebuffer_multisample +#define GL_EXT_framebuffer_multisample 1 + +#define GL_RENDERBUFFER_SAMPLES_EXT 0x8CAB +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56 +#define GL_MAX_SAMPLES_EXT 0x8D57 + +typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); + +#define glRenderbufferStorageMultisampleEXT GLEW_GET_FUN(__glewRenderbufferStorageMultisampleEXT) + +#define GLEW_EXT_framebuffer_multisample GLEW_GET_VAR(__GLEW_EXT_framebuffer_multisample) + +#endif /* GL_EXT_framebuffer_multisample */ + +/* ----------------------- GL_EXT_framebuffer_object ----------------------- */ + +#ifndef GL_EXT_framebuffer_object +#define GL_EXT_framebuffer_object 1 + +#define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506 +#define GL_MAX_RENDERBUFFER_SIZE_EXT 0x84E8 +#define GL_FRAMEBUFFER_BINDING_EXT 0x8CA6 +#define GL_RENDERBUFFER_BINDING_EXT 0x8CA7 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT 0x8CD0 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT 0x8CD1 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT 0x8CD2 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8CD3 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT 0x8CD4 +#define GL_FRAMEBUFFER_COMPLETE_EXT 0x8CD5 +#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT 0x8CD6 +#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT 0x8CD7 +#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT 0x8CD9 +#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT 0x8CDA +#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT 0x8CDB +#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT 0x8CDC +#define GL_FRAMEBUFFER_UNSUPPORTED_EXT 0x8CDD +#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF +#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0 +#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1 +#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2 +#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3 +#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4 +#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5 +#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6 +#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7 +#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8 +#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9 +#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA +#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB +#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC +#define GL_COLOR_ATTACHMENT13_EXT 0x8CED +#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE +#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF +#define GL_DEPTH_ATTACHMENT_EXT 0x8D00 +#define GL_STENCIL_ATTACHMENT_EXT 0x8D20 +#define GL_FRAMEBUFFER_EXT 0x8D40 +#define GL_RENDERBUFFER_EXT 0x8D41 +#define GL_RENDERBUFFER_WIDTH_EXT 0x8D42 +#define GL_RENDERBUFFER_HEIGHT_EXT 0x8D43 +#define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT 0x8D44 +#define GL_STENCIL_INDEX1_EXT 0x8D46 +#define GL_STENCIL_INDEX4_EXT 0x8D47 +#define GL_STENCIL_INDEX8_EXT 0x8D48 +#define GL_STENCIL_INDEX16_EXT 0x8D49 +#define GL_RENDERBUFFER_RED_SIZE_EXT 0x8D50 +#define GL_RENDERBUFFER_GREEN_SIZE_EXT 0x8D51 +#define GL_RENDERBUFFER_BLUE_SIZE_EXT 0x8D52 +#define GL_RENDERBUFFER_ALPHA_SIZE_EXT 0x8D53 +#define GL_RENDERBUFFER_DEPTH_SIZE_EXT 0x8D54 +#define GL_RENDERBUFFER_STENCIL_SIZE_EXT 0x8D55 + +typedef void (GLAPIENTRY * PFNGLBINDFRAMEBUFFEREXTPROC) (GLenum target, GLuint framebuffer); +typedef void (GLAPIENTRY * PFNGLBINDRENDERBUFFEREXTPROC) (GLenum target, GLuint renderbuffer); +typedef GLenum (GLAPIENTRY * PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLDELETEFRAMEBUFFERSEXTPROC) (GLsizei n, const GLuint* framebuffers); +typedef void (GLAPIENTRY * PFNGLDELETERENDERBUFFERSEXTPROC) (GLsizei n, const GLuint* renderbuffers); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE1DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE3DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +typedef void (GLAPIENTRY * PFNGLGENFRAMEBUFFERSEXTPROC) (GLsizei n, GLuint* framebuffers); +typedef void (GLAPIENTRY * PFNGLGENRENDERBUFFERSEXTPROC) (GLsizei n, GLuint* renderbuffers); +typedef void (GLAPIENTRY * PFNGLGENERATEMIPMAPEXTPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLenum target, GLenum attachment, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISFRAMEBUFFEREXTPROC) (GLuint framebuffer); +typedef GLboolean (GLAPIENTRY * PFNGLISRENDERBUFFEREXTPROC) (GLuint renderbuffer); +typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); + +#define glBindFramebufferEXT GLEW_GET_FUN(__glewBindFramebufferEXT) +#define glBindRenderbufferEXT GLEW_GET_FUN(__glewBindRenderbufferEXT) +#define glCheckFramebufferStatusEXT GLEW_GET_FUN(__glewCheckFramebufferStatusEXT) +#define glDeleteFramebuffersEXT GLEW_GET_FUN(__glewDeleteFramebuffersEXT) +#define glDeleteRenderbuffersEXT GLEW_GET_FUN(__glewDeleteRenderbuffersEXT) +#define glFramebufferRenderbufferEXT GLEW_GET_FUN(__glewFramebufferRenderbufferEXT) +#define glFramebufferTexture1DEXT GLEW_GET_FUN(__glewFramebufferTexture1DEXT) +#define glFramebufferTexture2DEXT GLEW_GET_FUN(__glewFramebufferTexture2DEXT) +#define glFramebufferTexture3DEXT GLEW_GET_FUN(__glewFramebufferTexture3DEXT) +#define glGenFramebuffersEXT GLEW_GET_FUN(__glewGenFramebuffersEXT) +#define glGenRenderbuffersEXT GLEW_GET_FUN(__glewGenRenderbuffersEXT) +#define glGenerateMipmapEXT GLEW_GET_FUN(__glewGenerateMipmapEXT) +#define glGetFramebufferAttachmentParameterivEXT GLEW_GET_FUN(__glewGetFramebufferAttachmentParameterivEXT) +#define glGetRenderbufferParameterivEXT GLEW_GET_FUN(__glewGetRenderbufferParameterivEXT) +#define glIsFramebufferEXT GLEW_GET_FUN(__glewIsFramebufferEXT) +#define glIsRenderbufferEXT GLEW_GET_FUN(__glewIsRenderbufferEXT) +#define glRenderbufferStorageEXT GLEW_GET_FUN(__glewRenderbufferStorageEXT) + +#define GLEW_EXT_framebuffer_object GLEW_GET_VAR(__GLEW_EXT_framebuffer_object) + +#endif /* GL_EXT_framebuffer_object */ + +/* ------------------------ GL_EXT_framebuffer_sRGB ------------------------ */ + +#ifndef GL_EXT_framebuffer_sRGB +#define GL_EXT_framebuffer_sRGB 1 + +#define GL_FRAMEBUFFER_SRGB_EXT 0x8DB9 +#define GL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x8DBA + +#define GLEW_EXT_framebuffer_sRGB GLEW_GET_VAR(__GLEW_EXT_framebuffer_sRGB) + +#endif /* GL_EXT_framebuffer_sRGB */ + +/* ------------------------ GL_EXT_geometry_shader4 ------------------------ */ + +#ifndef GL_EXT_geometry_shader4 +#define GL_EXT_geometry_shader4 1 + +#define GL_LINES_ADJACENCY_EXT 0xA +#define GL_LINE_STRIP_ADJACENCY_EXT 0xB +#define GL_TRIANGLES_ADJACENCY_EXT 0xC +#define GL_TRIANGLE_STRIP_ADJACENCY_EXT 0xD +#define GL_PROGRAM_POINT_SIZE_EXT 0x8642 +#define GL_MAX_VARYING_COMPONENTS_EXT 0x8B4B +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT 0x8CD4 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT 0x8DA9 +#define GL_GEOMETRY_SHADER_EXT 0x8DD9 +#define GL_GEOMETRY_VERTICES_OUT_EXT 0x8DDA +#define GL_GEOMETRY_INPUT_TYPE_EXT 0x8DDB +#define GL_GEOMETRY_OUTPUT_TYPE_EXT 0x8DDC +#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_EXT 0x8DDD +#define GL_MAX_VERTEX_VARYING_COMPONENTS_EXT 0x8DDE +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1 + +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERIEXTPROC) (GLuint program, GLenum pname, GLint value); + +#define glFramebufferTextureEXT GLEW_GET_FUN(__glewFramebufferTextureEXT) +#define glFramebufferTextureFaceEXT GLEW_GET_FUN(__glewFramebufferTextureFaceEXT) +#define glFramebufferTextureLayerEXT GLEW_GET_FUN(__glewFramebufferTextureLayerEXT) +#define glProgramParameteriEXT GLEW_GET_FUN(__glewProgramParameteriEXT) + +#define GLEW_EXT_geometry_shader4 GLEW_GET_VAR(__GLEW_EXT_geometry_shader4) + +#endif /* GL_EXT_geometry_shader4 */ + +/* --------------------- GL_EXT_gpu_program_parameters --------------------- */ + +#ifndef GL_EXT_gpu_program_parameters +#define GL_EXT_gpu_program_parameters 1 + +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat* params); + +#define glProgramEnvParameters4fvEXT GLEW_GET_FUN(__glewProgramEnvParameters4fvEXT) +#define glProgramLocalParameters4fvEXT GLEW_GET_FUN(__glewProgramLocalParameters4fvEXT) + +#define GLEW_EXT_gpu_program_parameters GLEW_GET_VAR(__GLEW_EXT_gpu_program_parameters) + +#endif /* GL_EXT_gpu_program_parameters */ + +/* --------------------------- GL_EXT_gpu_shader4 -------------------------- */ + +#ifndef GL_EXT_gpu_shader4 +#define GL_EXT_gpu_shader4 1 + +#define GL_VERTEX_ATTRIB_ARRAY_INTEGER_EXT 0x88FD +#define GL_SAMPLER_1D_ARRAY_EXT 0x8DC0 +#define GL_SAMPLER_2D_ARRAY_EXT 0x8DC1 +#define GL_SAMPLER_BUFFER_EXT 0x8DC2 +#define GL_SAMPLER_1D_ARRAY_SHADOW_EXT 0x8DC3 +#define GL_SAMPLER_2D_ARRAY_SHADOW_EXT 0x8DC4 +#define GL_SAMPLER_CUBE_SHADOW_EXT 0x8DC5 +#define GL_UNSIGNED_INT_VEC2_EXT 0x8DC6 +#define GL_UNSIGNED_INT_VEC3_EXT 0x8DC7 +#define GL_UNSIGNED_INT_VEC4_EXT 0x8DC8 +#define GL_INT_SAMPLER_1D_EXT 0x8DC9 +#define GL_INT_SAMPLER_2D_EXT 0x8DCA +#define GL_INT_SAMPLER_3D_EXT 0x8DCB +#define GL_INT_SAMPLER_CUBE_EXT 0x8DCC +#define GL_INT_SAMPLER_2D_RECT_EXT 0x8DCD +#define GL_INT_SAMPLER_1D_ARRAY_EXT 0x8DCE +#define GL_INT_SAMPLER_2D_ARRAY_EXT 0x8DCF +#define GL_INT_SAMPLER_BUFFER_EXT 0x8DD0 +#define GL_UNSIGNED_INT_SAMPLER_1D_EXT 0x8DD1 +#define GL_UNSIGNED_INT_SAMPLER_2D_EXT 0x8DD2 +#define GL_UNSIGNED_INT_SAMPLER_3D_EXT 0x8DD3 +#define GL_UNSIGNED_INT_SAMPLER_CUBE_EXT 0x8DD4 +#define GL_UNSIGNED_INT_SAMPLER_2D_RECT_EXT 0x8DD5 +#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY_EXT 0x8DD6 +#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY_EXT 0x8DD7 +#define GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT 0x8DD8 + +typedef void (GLAPIENTRY * PFNGLBINDFRAGDATALOCATIONEXTPROC) (GLuint program, GLuint color, const GLchar *name); +typedef GLint (GLAPIENTRY * PFNGLGETFRAGDATALOCATIONEXTPROC) (GLuint program, const GLchar *name); +typedef void (GLAPIENTRY * PFNGLGETUNIFORMUIVEXTPROC) (GLuint program, GLint location, GLuint *params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIIVEXTPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIUIVEXTPROC) (GLuint index, GLenum pname, GLuint *params); +typedef void (GLAPIENTRY * PFNGLUNIFORM1UIEXTPROC) (GLint location, GLuint v0); +typedef void (GLAPIENTRY * PFNGLUNIFORM1UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (GLAPIENTRY * PFNGLUNIFORM2UIEXTPROC) (GLint location, GLuint v0, GLuint v1); +typedef void (GLAPIENTRY * PFNGLUNIFORM2UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (GLAPIENTRY * PFNGLUNIFORM3UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (GLAPIENTRY * PFNGLUNIFORM3UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (GLAPIENTRY * PFNGLUNIFORM4UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (GLAPIENTRY * PFNGLUNIFORM4UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IEXTPROC) (GLuint index, GLint x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IVEXTPROC) (GLuint index, const GLint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIEXTPROC) (GLuint index, GLuint x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIVEXTPROC) (GLuint index, const GLuint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IEXTPROC) (GLuint index, GLint x, GLint y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IVEXTPROC) (GLuint index, const GLint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIEXTPROC) (GLuint index, GLuint x, GLuint y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIVEXTPROC) (GLuint index, const GLuint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IEXTPROC) (GLuint index, GLint x, GLint y, GLint z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IVEXTPROC) (GLuint index, const GLint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIVEXTPROC) (GLuint index, const GLuint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4BVEXTPROC) (GLuint index, const GLbyte *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IEXTPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IVEXTPROC) (GLuint index, const GLint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4SVEXTPROC) (GLuint index, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UBVEXTPROC) (GLuint index, const GLubyte *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIVEXTPROC) (GLuint index, const GLuint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4USVEXTPROC) (GLuint index, const GLushort *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBIPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); + +#define glBindFragDataLocationEXT GLEW_GET_FUN(__glewBindFragDataLocationEXT) +#define glGetFragDataLocationEXT GLEW_GET_FUN(__glewGetFragDataLocationEXT) +#define glGetUniformuivEXT GLEW_GET_FUN(__glewGetUniformuivEXT) +#define glGetVertexAttribIivEXT GLEW_GET_FUN(__glewGetVertexAttribIivEXT) +#define glGetVertexAttribIuivEXT GLEW_GET_FUN(__glewGetVertexAttribIuivEXT) +#define glUniform1uiEXT GLEW_GET_FUN(__glewUniform1uiEXT) +#define glUniform1uivEXT GLEW_GET_FUN(__glewUniform1uivEXT) +#define glUniform2uiEXT GLEW_GET_FUN(__glewUniform2uiEXT) +#define glUniform2uivEXT GLEW_GET_FUN(__glewUniform2uivEXT) +#define glUniform3uiEXT GLEW_GET_FUN(__glewUniform3uiEXT) +#define glUniform3uivEXT GLEW_GET_FUN(__glewUniform3uivEXT) +#define glUniform4uiEXT GLEW_GET_FUN(__glewUniform4uiEXT) +#define glUniform4uivEXT GLEW_GET_FUN(__glewUniform4uivEXT) +#define glVertexAttribI1iEXT GLEW_GET_FUN(__glewVertexAttribI1iEXT) +#define glVertexAttribI1ivEXT GLEW_GET_FUN(__glewVertexAttribI1ivEXT) +#define glVertexAttribI1uiEXT GLEW_GET_FUN(__glewVertexAttribI1uiEXT) +#define glVertexAttribI1uivEXT GLEW_GET_FUN(__glewVertexAttribI1uivEXT) +#define glVertexAttribI2iEXT GLEW_GET_FUN(__glewVertexAttribI2iEXT) +#define glVertexAttribI2ivEXT GLEW_GET_FUN(__glewVertexAttribI2ivEXT) +#define glVertexAttribI2uiEXT GLEW_GET_FUN(__glewVertexAttribI2uiEXT) +#define glVertexAttribI2uivEXT GLEW_GET_FUN(__glewVertexAttribI2uivEXT) +#define glVertexAttribI3iEXT GLEW_GET_FUN(__glewVertexAttribI3iEXT) +#define glVertexAttribI3ivEXT GLEW_GET_FUN(__glewVertexAttribI3ivEXT) +#define glVertexAttribI3uiEXT GLEW_GET_FUN(__glewVertexAttribI3uiEXT) +#define glVertexAttribI3uivEXT GLEW_GET_FUN(__glewVertexAttribI3uivEXT) +#define glVertexAttribI4bvEXT GLEW_GET_FUN(__glewVertexAttribI4bvEXT) +#define glVertexAttribI4iEXT GLEW_GET_FUN(__glewVertexAttribI4iEXT) +#define glVertexAttribI4ivEXT GLEW_GET_FUN(__glewVertexAttribI4ivEXT) +#define glVertexAttribI4svEXT GLEW_GET_FUN(__glewVertexAttribI4svEXT) +#define glVertexAttribI4ubvEXT GLEW_GET_FUN(__glewVertexAttribI4ubvEXT) +#define glVertexAttribI4uiEXT GLEW_GET_FUN(__glewVertexAttribI4uiEXT) +#define glVertexAttribI4uivEXT GLEW_GET_FUN(__glewVertexAttribI4uivEXT) +#define glVertexAttribI4usvEXT GLEW_GET_FUN(__glewVertexAttribI4usvEXT) +#define glVertexAttribIPointerEXT GLEW_GET_FUN(__glewVertexAttribIPointerEXT) + +#define GLEW_EXT_gpu_shader4 GLEW_GET_VAR(__GLEW_EXT_gpu_shader4) + +#endif /* GL_EXT_gpu_shader4 */ + +/* ---------------------------- GL_EXT_histogram --------------------------- */ + +#ifndef GL_EXT_histogram +#define GL_EXT_histogram 1 + +#define GL_HISTOGRAM_EXT 0x8024 +#define GL_PROXY_HISTOGRAM_EXT 0x8025 +#define GL_HISTOGRAM_WIDTH_EXT 0x8026 +#define GL_HISTOGRAM_FORMAT_EXT 0x8027 +#define GL_HISTOGRAM_RED_SIZE_EXT 0x8028 +#define GL_HISTOGRAM_GREEN_SIZE_EXT 0x8029 +#define GL_HISTOGRAM_BLUE_SIZE_EXT 0x802A +#define GL_HISTOGRAM_ALPHA_SIZE_EXT 0x802B +#define GL_HISTOGRAM_LUMINANCE_SIZE_EXT 0x802C +#define GL_HISTOGRAM_SINK_EXT 0x802D +#define GL_MINMAX_EXT 0x802E +#define GL_MINMAX_FORMAT_EXT 0x802F +#define GL_MINMAX_SINK_EXT 0x8030 + +typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void* values); +typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETMINMAXEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void* values); +typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLHISTOGRAMEXTPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +typedef void (GLAPIENTRY * PFNGLMINMAXEXTPROC) (GLenum target, GLenum internalformat, GLboolean sink); +typedef void (GLAPIENTRY * PFNGLRESETHISTOGRAMEXTPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLRESETMINMAXEXTPROC) (GLenum target); + +#define glGetHistogramEXT GLEW_GET_FUN(__glewGetHistogramEXT) +#define glGetHistogramParameterfvEXT GLEW_GET_FUN(__glewGetHistogramParameterfvEXT) +#define glGetHistogramParameterivEXT GLEW_GET_FUN(__glewGetHistogramParameterivEXT) +#define glGetMinmaxEXT GLEW_GET_FUN(__glewGetMinmaxEXT) +#define glGetMinmaxParameterfvEXT GLEW_GET_FUN(__glewGetMinmaxParameterfvEXT) +#define glGetMinmaxParameterivEXT GLEW_GET_FUN(__glewGetMinmaxParameterivEXT) +#define glHistogramEXT GLEW_GET_FUN(__glewHistogramEXT) +#define glMinmaxEXT GLEW_GET_FUN(__glewMinmaxEXT) +#define glResetHistogramEXT GLEW_GET_FUN(__glewResetHistogramEXT) +#define glResetMinmaxEXT GLEW_GET_FUN(__glewResetMinmaxEXT) + +#define GLEW_EXT_histogram GLEW_GET_VAR(__GLEW_EXT_histogram) + +#endif /* GL_EXT_histogram */ + +/* ----------------------- GL_EXT_index_array_formats ---------------------- */ + +#ifndef GL_EXT_index_array_formats +#define GL_EXT_index_array_formats 1 + +#define GLEW_EXT_index_array_formats GLEW_GET_VAR(__GLEW_EXT_index_array_formats) + +#endif /* GL_EXT_index_array_formats */ + +/* --------------------------- GL_EXT_index_func --------------------------- */ + +#ifndef GL_EXT_index_func +#define GL_EXT_index_func 1 + +typedef void (GLAPIENTRY * PFNGLINDEXFUNCEXTPROC) (GLenum func, GLfloat ref); + +#define glIndexFuncEXT GLEW_GET_FUN(__glewIndexFuncEXT) + +#define GLEW_EXT_index_func GLEW_GET_VAR(__GLEW_EXT_index_func) + +#endif /* GL_EXT_index_func */ + +/* ------------------------- GL_EXT_index_material ------------------------- */ + +#ifndef GL_EXT_index_material +#define GL_EXT_index_material 1 + +typedef void (GLAPIENTRY * PFNGLINDEXMATERIALEXTPROC) (GLenum face, GLenum mode); + +#define glIndexMaterialEXT GLEW_GET_FUN(__glewIndexMaterialEXT) + +#define GLEW_EXT_index_material GLEW_GET_VAR(__GLEW_EXT_index_material) + +#endif /* GL_EXT_index_material */ + +/* -------------------------- GL_EXT_index_texture ------------------------- */ + +#ifndef GL_EXT_index_texture +#define GL_EXT_index_texture 1 + +#define GLEW_EXT_index_texture GLEW_GET_VAR(__GLEW_EXT_index_texture) + +#endif /* GL_EXT_index_texture */ + +/* -------------------------- GL_EXT_light_texture ------------------------- */ + +#ifndef GL_EXT_light_texture +#define GL_EXT_light_texture 1 + +#define GL_FRAGMENT_MATERIAL_EXT 0x8349 +#define GL_FRAGMENT_NORMAL_EXT 0x834A +#define GL_FRAGMENT_COLOR_EXT 0x834C +#define GL_ATTENUATION_EXT 0x834D +#define GL_SHADOW_ATTENUATION_EXT 0x834E +#define GL_TEXTURE_APPLICATION_MODE_EXT 0x834F +#define GL_TEXTURE_LIGHT_EXT 0x8350 +#define GL_TEXTURE_MATERIAL_FACE_EXT 0x8351 +#define GL_TEXTURE_MATERIAL_PARAMETER_EXT 0x8352 +#define GL_FRAGMENT_DEPTH_EXT 0x8452 + +typedef void (GLAPIENTRY * PFNGLAPPLYTEXTUREEXTPROC) (GLenum mode); +typedef void (GLAPIENTRY * PFNGLTEXTURELIGHTEXTPROC) (GLenum pname); +typedef void (GLAPIENTRY * PFNGLTEXTUREMATERIALEXTPROC) (GLenum face, GLenum mode); + +#define glApplyTextureEXT GLEW_GET_FUN(__glewApplyTextureEXT) +#define glTextureLightEXT GLEW_GET_FUN(__glewTextureLightEXT) +#define glTextureMaterialEXT GLEW_GET_FUN(__glewTextureMaterialEXT) + +#define GLEW_EXT_light_texture GLEW_GET_VAR(__GLEW_EXT_light_texture) + +#endif /* GL_EXT_light_texture */ + +/* ------------------------- GL_EXT_misc_attribute ------------------------- */ + +#ifndef GL_EXT_misc_attribute +#define GL_EXT_misc_attribute 1 + +#define GLEW_EXT_misc_attribute GLEW_GET_VAR(__GLEW_EXT_misc_attribute) + +#endif /* GL_EXT_misc_attribute */ + +/* ------------------------ GL_EXT_multi_draw_arrays ----------------------- */ + +#ifndef GL_EXT_multi_draw_arrays +#define GL_EXT_multi_draw_arrays 1 + +typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, GLint* first, GLsizei *count, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, GLsizei* count, GLenum type, const GLvoid **indices, GLsizei primcount); + +#define glMultiDrawArraysEXT GLEW_GET_FUN(__glewMultiDrawArraysEXT) +#define glMultiDrawElementsEXT GLEW_GET_FUN(__glewMultiDrawElementsEXT) + +#define GLEW_EXT_multi_draw_arrays GLEW_GET_VAR(__GLEW_EXT_multi_draw_arrays) + +#endif /* GL_EXT_multi_draw_arrays */ + +/* --------------------------- GL_EXT_multisample -------------------------- */ + +#ifndef GL_EXT_multisample +#define GL_EXT_multisample 1 + +#define GL_MULTISAMPLE_EXT 0x809D +#define GL_SAMPLE_ALPHA_TO_MASK_EXT 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F +#define GL_SAMPLE_MASK_EXT 0x80A0 +#define GL_1PASS_EXT 0x80A1 +#define GL_2PASS_0_EXT 0x80A2 +#define GL_2PASS_1_EXT 0x80A3 +#define GL_4PASS_0_EXT 0x80A4 +#define GL_4PASS_1_EXT 0x80A5 +#define GL_4PASS_2_EXT 0x80A6 +#define GL_4PASS_3_EXT 0x80A7 +#define GL_SAMPLE_BUFFERS_EXT 0x80A8 +#define GL_SAMPLES_EXT 0x80A9 +#define GL_SAMPLE_MASK_VALUE_EXT 0x80AA +#define GL_SAMPLE_MASK_INVERT_EXT 0x80AB +#define GL_SAMPLE_PATTERN_EXT 0x80AC +#define GL_MULTISAMPLE_BIT_EXT 0x20000000 + +typedef void (GLAPIENTRY * PFNGLSAMPLEMASKEXTPROC) (GLclampf value, GLboolean invert); +typedef void (GLAPIENTRY * PFNGLSAMPLEPATTERNEXTPROC) (GLenum pattern); + +#define glSampleMaskEXT GLEW_GET_FUN(__glewSampleMaskEXT) +#define glSamplePatternEXT GLEW_GET_FUN(__glewSamplePatternEXT) + +#define GLEW_EXT_multisample GLEW_GET_VAR(__GLEW_EXT_multisample) + +#endif /* GL_EXT_multisample */ + +/* ---------------------- GL_EXT_packed_depth_stencil ---------------------- */ + +#ifndef GL_EXT_packed_depth_stencil +#define GL_EXT_packed_depth_stencil 1 + +#define GL_DEPTH_STENCIL_EXT 0x84F9 +#define GL_UNSIGNED_INT_24_8_EXT 0x84FA +#define GL_DEPTH24_STENCIL8_EXT 0x88F0 +#define GL_TEXTURE_STENCIL_SIZE_EXT 0x88F1 + +#define GLEW_EXT_packed_depth_stencil GLEW_GET_VAR(__GLEW_EXT_packed_depth_stencil) + +#endif /* GL_EXT_packed_depth_stencil */ + +/* -------------------------- GL_EXT_packed_float -------------------------- */ + +#ifndef GL_EXT_packed_float +#define GL_EXT_packed_float 1 + +#define GL_R11F_G11F_B10F_EXT 0x8C3A +#define GL_UNSIGNED_INT_10F_11F_11F_REV_EXT 0x8C3B +#define GL_RGBA_SIGNED_COMPONENTS_EXT 0x8C3C + +#define GLEW_EXT_packed_float GLEW_GET_VAR(__GLEW_EXT_packed_float) + +#endif /* GL_EXT_packed_float */ + +/* -------------------------- GL_EXT_packed_pixels ------------------------- */ + +#ifndef GL_EXT_packed_pixels +#define GL_EXT_packed_pixels 1 + +#define GL_UNSIGNED_BYTE_3_3_2_EXT 0x8032 +#define GL_UNSIGNED_SHORT_4_4_4_4_EXT 0x8033 +#define GL_UNSIGNED_SHORT_5_5_5_1_EXT 0x8034 +#define GL_UNSIGNED_INT_8_8_8_8_EXT 0x8035 +#define GL_UNSIGNED_INT_10_10_10_2_EXT 0x8036 + +#define GLEW_EXT_packed_pixels GLEW_GET_VAR(__GLEW_EXT_packed_pixels) + +#endif /* GL_EXT_packed_pixels */ + +/* ------------------------ GL_EXT_paletted_texture ------------------------ */ + +#ifndef GL_EXT_paletted_texture +#define GL_EXT_paletted_texture 1 + +#define GL_TEXTURE_1D 0x0DE0 +#define GL_TEXTURE_2D 0x0DE1 +#define GL_PROXY_TEXTURE_1D 0x8063 +#define GL_PROXY_TEXTURE_2D 0x8064 +#define GL_TEXTURE_3D_EXT 0x806F +#define GL_PROXY_TEXTURE_3D_EXT 0x8070 +#define GL_COLOR_TABLE_FORMAT_EXT 0x80D8 +#define GL_COLOR_TABLE_WIDTH_EXT 0x80D9 +#define GL_COLOR_TABLE_RED_SIZE_EXT 0x80DA +#define GL_COLOR_TABLE_GREEN_SIZE_EXT 0x80DB +#define GL_COLOR_TABLE_BLUE_SIZE_EXT 0x80DC +#define GL_COLOR_TABLE_ALPHA_SIZE_EXT 0x80DD +#define GL_COLOR_TABLE_LUMINANCE_SIZE_EXT 0x80DE +#define GL_COLOR_TABLE_INTENSITY_SIZE_EXT 0x80DF +#define GL_COLOR_INDEX1_EXT 0x80E2 +#define GL_COLOR_INDEX2_EXT 0x80E3 +#define GL_COLOR_INDEX4_EXT 0x80E4 +#define GL_COLOR_INDEX8_EXT 0x80E5 +#define GL_COLOR_INDEX12_EXT 0x80E6 +#define GL_COLOR_INDEX16_EXT 0x80E7 +#define GL_TEXTURE_INDEX_SIZE_EXT 0x80ED +#define GL_TEXTURE_CUBE_MAP_ARB 0x8513 +#define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B + +typedef void (GLAPIENTRY * PFNGLCOLORTABLEEXTPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const void* data); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEEXTPROC) (GLenum target, GLenum format, GLenum type, void* data); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); + +#define glColorTableEXT GLEW_GET_FUN(__glewColorTableEXT) +#define glGetColorTableEXT GLEW_GET_FUN(__glewGetColorTableEXT) +#define glGetColorTableParameterfvEXT GLEW_GET_FUN(__glewGetColorTableParameterfvEXT) +#define glGetColorTableParameterivEXT GLEW_GET_FUN(__glewGetColorTableParameterivEXT) + +#define GLEW_EXT_paletted_texture GLEW_GET_VAR(__GLEW_EXT_paletted_texture) + +#endif /* GL_EXT_paletted_texture */ + +/* ----------------------- GL_EXT_pixel_buffer_object ---------------------- */ + +#ifndef GL_EXT_pixel_buffer_object +#define GL_EXT_pixel_buffer_object 1 + +#define GL_PIXEL_PACK_BUFFER_EXT 0x88EB +#define GL_PIXEL_UNPACK_BUFFER_EXT 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING_EXT 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING_EXT 0x88EF + +#define GLEW_EXT_pixel_buffer_object GLEW_GET_VAR(__GLEW_EXT_pixel_buffer_object) + +#endif /* GL_EXT_pixel_buffer_object */ + +/* ------------------------- GL_EXT_pixel_transform ------------------------ */ + +#ifndef GL_EXT_pixel_transform +#define GL_EXT_pixel_transform 1 + +#define GL_PIXEL_TRANSFORM_2D_EXT 0x8330 +#define GL_PIXEL_MAG_FILTER_EXT 0x8331 +#define GL_PIXEL_MIN_FILTER_EXT 0x8332 +#define GL_PIXEL_CUBIC_WEIGHT_EXT 0x8333 +#define GL_CUBIC_EXT 0x8334 +#define GL_AVERAGE_EXT 0x8335 +#define GL_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8336 +#define GL_MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8337 +#define GL_PIXEL_TRANSFORM_2D_MATRIX_EXT 0x8338 + +typedef void (GLAPIENTRY * PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERFEXTPROC) (GLenum target, GLenum pname, const GLfloat param); +typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERIEXTPROC) (GLenum target, GLenum pname, const GLint param); +typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint* params); + +#define glGetPixelTransformParameterfvEXT GLEW_GET_FUN(__glewGetPixelTransformParameterfvEXT) +#define glGetPixelTransformParameterivEXT GLEW_GET_FUN(__glewGetPixelTransformParameterivEXT) +#define glPixelTransformParameterfEXT GLEW_GET_FUN(__glewPixelTransformParameterfEXT) +#define glPixelTransformParameterfvEXT GLEW_GET_FUN(__glewPixelTransformParameterfvEXT) +#define glPixelTransformParameteriEXT GLEW_GET_FUN(__glewPixelTransformParameteriEXT) +#define glPixelTransformParameterivEXT GLEW_GET_FUN(__glewPixelTransformParameterivEXT) + +#define GLEW_EXT_pixel_transform GLEW_GET_VAR(__GLEW_EXT_pixel_transform) + +#endif /* GL_EXT_pixel_transform */ + +/* ------------------- GL_EXT_pixel_transform_color_table ------------------ */ + +#ifndef GL_EXT_pixel_transform_color_table +#define GL_EXT_pixel_transform_color_table 1 + +#define GLEW_EXT_pixel_transform_color_table GLEW_GET_VAR(__GLEW_EXT_pixel_transform_color_table) + +#endif /* GL_EXT_pixel_transform_color_table */ + +/* ------------------------ GL_EXT_point_parameters ------------------------ */ + +#ifndef GL_EXT_point_parameters +#define GL_EXT_point_parameters 1 + +#define GL_POINT_SIZE_MIN_EXT 0x8126 +#define GL_POINT_SIZE_MAX_EXT 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128 +#define GL_DISTANCE_ATTENUATION_EXT 0x8129 + +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFEXTPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, GLfloat* params); + +#define glPointParameterfEXT GLEW_GET_FUN(__glewPointParameterfEXT) +#define glPointParameterfvEXT GLEW_GET_FUN(__glewPointParameterfvEXT) + +#define GLEW_EXT_point_parameters GLEW_GET_VAR(__GLEW_EXT_point_parameters) + +#endif /* GL_EXT_point_parameters */ + +/* ------------------------- GL_EXT_polygon_offset ------------------------- */ + +#ifndef GL_EXT_polygon_offset +#define GL_EXT_polygon_offset 1 + +#define GL_POLYGON_OFFSET_EXT 0x8037 +#define GL_POLYGON_OFFSET_FACTOR_EXT 0x8038 +#define GL_POLYGON_OFFSET_BIAS_EXT 0x8039 + +typedef void (GLAPIENTRY * PFNGLPOLYGONOFFSETEXTPROC) (GLfloat factor, GLfloat bias); + +#define glPolygonOffsetEXT GLEW_GET_FUN(__glewPolygonOffsetEXT) + +#define GLEW_EXT_polygon_offset GLEW_GET_VAR(__GLEW_EXT_polygon_offset) + +#endif /* GL_EXT_polygon_offset */ + +/* ------------------------- GL_EXT_rescale_normal ------------------------- */ + +#ifndef GL_EXT_rescale_normal +#define GL_EXT_rescale_normal 1 + +#define GLEW_EXT_rescale_normal GLEW_GET_VAR(__GLEW_EXT_rescale_normal) + +#endif /* GL_EXT_rescale_normal */ + +/* -------------------------- GL_EXT_scene_marker -------------------------- */ + +#ifndef GL_EXT_scene_marker +#define GL_EXT_scene_marker 1 + +typedef void (GLAPIENTRY * PFNGLBEGINSCENEEXTPROC) (void); +typedef void (GLAPIENTRY * PFNGLENDSCENEEXTPROC) (void); + +#define glBeginSceneEXT GLEW_GET_FUN(__glewBeginSceneEXT) +#define glEndSceneEXT GLEW_GET_FUN(__glewEndSceneEXT) + +#define GLEW_EXT_scene_marker GLEW_GET_VAR(__GLEW_EXT_scene_marker) + +#endif /* GL_EXT_scene_marker */ + +/* ------------------------- GL_EXT_secondary_color ------------------------ */ + +#ifndef GL_EXT_secondary_color +#define GL_EXT_secondary_color 1 + +#define GL_COLOR_SUM_EXT 0x8458 +#define GL_CURRENT_SECONDARY_COLOR_EXT 0x8459 +#define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT 0x845A +#define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT 0x845B +#define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT 0x845C +#define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D +#define GL_SECONDARY_COLOR_ARRAY_EXT 0x845E + +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BEXTPROC) (GLbyte red, GLbyte green, GLbyte blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BVEXTPROC) (const GLbyte *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DEXTPROC) (GLdouble red, GLdouble green, GLdouble blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DVEXTPROC) (const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FEXTPROC) (GLfloat red, GLfloat green, GLfloat blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FVEXTPROC) (const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IEXTPROC) (GLint red, GLint green, GLint blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IVEXTPROC) (const GLint *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SEXTPROC) (GLshort red, GLshort green, GLshort blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SVEXTPROC) (const GLshort *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBEXTPROC) (GLubyte red, GLubyte green, GLubyte blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBVEXTPROC) (const GLubyte *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIEXTPROC) (GLuint red, GLuint green, GLuint blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIVEXTPROC) (const GLuint *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USEXTPROC) (GLushort red, GLushort green, GLushort blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USVEXTPROC) (const GLushort *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLvoid *pointer); + +#define glSecondaryColor3bEXT GLEW_GET_FUN(__glewSecondaryColor3bEXT) +#define glSecondaryColor3bvEXT GLEW_GET_FUN(__glewSecondaryColor3bvEXT) +#define glSecondaryColor3dEXT GLEW_GET_FUN(__glewSecondaryColor3dEXT) +#define glSecondaryColor3dvEXT GLEW_GET_FUN(__glewSecondaryColor3dvEXT) +#define glSecondaryColor3fEXT GLEW_GET_FUN(__glewSecondaryColor3fEXT) +#define glSecondaryColor3fvEXT GLEW_GET_FUN(__glewSecondaryColor3fvEXT) +#define glSecondaryColor3iEXT GLEW_GET_FUN(__glewSecondaryColor3iEXT) +#define glSecondaryColor3ivEXT GLEW_GET_FUN(__glewSecondaryColor3ivEXT) +#define glSecondaryColor3sEXT GLEW_GET_FUN(__glewSecondaryColor3sEXT) +#define glSecondaryColor3svEXT GLEW_GET_FUN(__glewSecondaryColor3svEXT) +#define glSecondaryColor3ubEXT GLEW_GET_FUN(__glewSecondaryColor3ubEXT) +#define glSecondaryColor3ubvEXT GLEW_GET_FUN(__glewSecondaryColor3ubvEXT) +#define glSecondaryColor3uiEXT GLEW_GET_FUN(__glewSecondaryColor3uiEXT) +#define glSecondaryColor3uivEXT GLEW_GET_FUN(__glewSecondaryColor3uivEXT) +#define glSecondaryColor3usEXT GLEW_GET_FUN(__glewSecondaryColor3usEXT) +#define glSecondaryColor3usvEXT GLEW_GET_FUN(__glewSecondaryColor3usvEXT) +#define glSecondaryColorPointerEXT GLEW_GET_FUN(__glewSecondaryColorPointerEXT) + +#define GLEW_EXT_secondary_color GLEW_GET_VAR(__GLEW_EXT_secondary_color) + +#endif /* GL_EXT_secondary_color */ + +/* --------------------- GL_EXT_separate_specular_color -------------------- */ + +#ifndef GL_EXT_separate_specular_color +#define GL_EXT_separate_specular_color 1 + +#define GL_LIGHT_MODEL_COLOR_CONTROL_EXT 0x81F8 +#define GL_SINGLE_COLOR_EXT 0x81F9 +#define GL_SEPARATE_SPECULAR_COLOR_EXT 0x81FA + +#define GLEW_EXT_separate_specular_color GLEW_GET_VAR(__GLEW_EXT_separate_specular_color) + +#endif /* GL_EXT_separate_specular_color */ + +/* -------------------------- GL_EXT_shadow_funcs -------------------------- */ + +#ifndef GL_EXT_shadow_funcs +#define GL_EXT_shadow_funcs 1 + +#define GLEW_EXT_shadow_funcs GLEW_GET_VAR(__GLEW_EXT_shadow_funcs) + +#endif /* GL_EXT_shadow_funcs */ + +/* --------------------- GL_EXT_shared_texture_palette --------------------- */ + +#ifndef GL_EXT_shared_texture_palette +#define GL_EXT_shared_texture_palette 1 + +#define GL_SHARED_TEXTURE_PALETTE_EXT 0x81FB + +#define GLEW_EXT_shared_texture_palette GLEW_GET_VAR(__GLEW_EXT_shared_texture_palette) + +#endif /* GL_EXT_shared_texture_palette */ + +/* ------------------------ GL_EXT_stencil_clear_tag ----------------------- */ + +#ifndef GL_EXT_stencil_clear_tag +#define GL_EXT_stencil_clear_tag 1 + +#define GL_STENCIL_TAG_BITS_EXT 0x88F2 +#define GL_STENCIL_CLEAR_TAG_VALUE_EXT 0x88F3 + +#define GLEW_EXT_stencil_clear_tag GLEW_GET_VAR(__GLEW_EXT_stencil_clear_tag) + +#endif /* GL_EXT_stencil_clear_tag */ + +/* ------------------------ GL_EXT_stencil_two_side ------------------------ */ + +#ifndef GL_EXT_stencil_two_side +#define GL_EXT_stencil_two_side 1 + +#define GL_STENCIL_TEST_TWO_SIDE_EXT 0x8910 +#define GL_ACTIVE_STENCIL_FACE_EXT 0x8911 + +typedef void (GLAPIENTRY * PFNGLACTIVESTENCILFACEEXTPROC) (GLenum face); + +#define glActiveStencilFaceEXT GLEW_GET_FUN(__glewActiveStencilFaceEXT) + +#define GLEW_EXT_stencil_two_side GLEW_GET_VAR(__GLEW_EXT_stencil_two_side) + +#endif /* GL_EXT_stencil_two_side */ + +/* -------------------------- GL_EXT_stencil_wrap -------------------------- */ + +#ifndef GL_EXT_stencil_wrap +#define GL_EXT_stencil_wrap 1 + +#define GL_INCR_WRAP_EXT 0x8507 +#define GL_DECR_WRAP_EXT 0x8508 + +#define GLEW_EXT_stencil_wrap GLEW_GET_VAR(__GLEW_EXT_stencil_wrap) + +#endif /* GL_EXT_stencil_wrap */ + +/* --------------------------- GL_EXT_subtexture --------------------------- */ + +#ifndef GL_EXT_subtexture +#define GL_EXT_subtexture 1 + +typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void* pixels); +typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels); +typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels); + +#define glTexSubImage1DEXT GLEW_GET_FUN(__glewTexSubImage1DEXT) +#define glTexSubImage2DEXT GLEW_GET_FUN(__glewTexSubImage2DEXT) +#define glTexSubImage3DEXT GLEW_GET_FUN(__glewTexSubImage3DEXT) + +#define GLEW_EXT_subtexture GLEW_GET_VAR(__GLEW_EXT_subtexture) + +#endif /* GL_EXT_subtexture */ + +/* ----------------------------- GL_EXT_texture ---------------------------- */ + +#ifndef GL_EXT_texture +#define GL_EXT_texture 1 + +#define GL_ALPHA4_EXT 0x803B +#define GL_ALPHA8_EXT 0x803C +#define GL_ALPHA12_EXT 0x803D +#define GL_ALPHA16_EXT 0x803E +#define GL_LUMINANCE4_EXT 0x803F +#define GL_LUMINANCE8_EXT 0x8040 +#define GL_LUMINANCE12_EXT 0x8041 +#define GL_LUMINANCE16_EXT 0x8042 +#define GL_LUMINANCE4_ALPHA4_EXT 0x8043 +#define GL_LUMINANCE6_ALPHA2_EXT 0x8044 +#define GL_LUMINANCE8_ALPHA8_EXT 0x8045 +#define GL_LUMINANCE12_ALPHA4_EXT 0x8046 +#define GL_LUMINANCE12_ALPHA12_EXT 0x8047 +#define GL_LUMINANCE16_ALPHA16_EXT 0x8048 +#define GL_INTENSITY_EXT 0x8049 +#define GL_INTENSITY4_EXT 0x804A +#define GL_INTENSITY8_EXT 0x804B +#define GL_INTENSITY12_EXT 0x804C +#define GL_INTENSITY16_EXT 0x804D +#define GL_RGB2_EXT 0x804E +#define GL_RGB4_EXT 0x804F +#define GL_RGB5_EXT 0x8050 +#define GL_RGB8_EXT 0x8051 +#define GL_RGB10_EXT 0x8052 +#define GL_RGB12_EXT 0x8053 +#define GL_RGB16_EXT 0x8054 +#define GL_RGBA2_EXT 0x8055 +#define GL_RGBA4_EXT 0x8056 +#define GL_RGB5_A1_EXT 0x8057 +#define GL_RGBA8_EXT 0x8058 +#define GL_RGB10_A2_EXT 0x8059 +#define GL_RGBA12_EXT 0x805A +#define GL_RGBA16_EXT 0x805B +#define GL_TEXTURE_RED_SIZE_EXT 0x805C +#define GL_TEXTURE_GREEN_SIZE_EXT 0x805D +#define GL_TEXTURE_BLUE_SIZE_EXT 0x805E +#define GL_TEXTURE_ALPHA_SIZE_EXT 0x805F +#define GL_TEXTURE_LUMINANCE_SIZE_EXT 0x8060 +#define GL_TEXTURE_INTENSITY_SIZE_EXT 0x8061 +#define GL_REPLACE_EXT 0x8062 +#define GL_PROXY_TEXTURE_1D_EXT 0x8063 +#define GL_PROXY_TEXTURE_2D_EXT 0x8064 + +#define GLEW_EXT_texture GLEW_GET_VAR(__GLEW_EXT_texture) + +#endif /* GL_EXT_texture */ + +/* ---------------------------- GL_EXT_texture3D --------------------------- */ + +#ifndef GL_EXT_texture3D +#define GL_EXT_texture3D 1 + +#define GL_PACK_SKIP_IMAGES_EXT 0x806B +#define GL_PACK_IMAGE_HEIGHT_EXT 0x806C +#define GL_UNPACK_SKIP_IMAGES_EXT 0x806D +#define GL_UNPACK_IMAGE_HEIGHT_EXT 0x806E +#define GL_TEXTURE_3D_EXT 0x806F +#define GL_PROXY_TEXTURE_3D_EXT 0x8070 +#define GL_TEXTURE_DEPTH_EXT 0x8071 +#define GL_TEXTURE_WRAP_R_EXT 0x8072 +#define GL_MAX_3D_TEXTURE_SIZE_EXT 0x8073 + +typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void* pixels); + +#define glTexImage3DEXT GLEW_GET_FUN(__glewTexImage3DEXT) + +#define GLEW_EXT_texture3D GLEW_GET_VAR(__GLEW_EXT_texture3D) + +#endif /* GL_EXT_texture3D */ + +/* -------------------------- GL_EXT_texture_array ------------------------- */ + +#ifndef GL_EXT_texture_array +#define GL_EXT_texture_array 1 + +#define GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT 0x884E +#define GL_MAX_ARRAY_TEXTURE_LAYERS_EXT 0x88FF +#define GL_TEXTURE_1D_ARRAY_EXT 0x8C18 +#define GL_PROXY_TEXTURE_1D_ARRAY_EXT 0x8C19 +#define GL_TEXTURE_2D_ARRAY_EXT 0x8C1A +#define GL_PROXY_TEXTURE_2D_ARRAY_EXT 0x8C1B +#define GL_TEXTURE_BINDING_1D_ARRAY_EXT 0x8C1C +#define GL_TEXTURE_BINDING_2D_ARRAY_EXT 0x8C1D + +#define GLEW_EXT_texture_array GLEW_GET_VAR(__GLEW_EXT_texture_array) + +#endif /* GL_EXT_texture_array */ + +/* ---------------------- GL_EXT_texture_buffer_object --------------------- */ + +#ifndef GL_EXT_texture_buffer_object +#define GL_EXT_texture_buffer_object 1 + +#define GL_TEXTURE_BUFFER_EXT 0x8C2A +#define GL_MAX_TEXTURE_BUFFER_SIZE_EXT 0x8C2B +#define GL_TEXTURE_BINDING_BUFFER_EXT 0x8C2C +#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT 0x8C2D +#define GL_TEXTURE_BUFFER_FORMAT_EXT 0x8C2E + +typedef void (GLAPIENTRY * PFNGLTEXBUFFEREXTPROC) (GLenum target, GLenum internalformat, GLuint buffer); + +#define glTexBufferEXT GLEW_GET_FUN(__glewTexBufferEXT) + +#define GLEW_EXT_texture_buffer_object GLEW_GET_VAR(__GLEW_EXT_texture_buffer_object) + +#endif /* GL_EXT_texture_buffer_object */ + +/* -------------------- GL_EXT_texture_compression_dxt1 -------------------- */ + +#ifndef GL_EXT_texture_compression_dxt1 +#define GL_EXT_texture_compression_dxt1 1 + +#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 +#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 + +#define GLEW_EXT_texture_compression_dxt1 GLEW_GET_VAR(__GLEW_EXT_texture_compression_dxt1) + +#endif /* GL_EXT_texture_compression_dxt1 */ + +/* -------------------- GL_EXT_texture_compression_latc -------------------- */ + +#ifndef GL_EXT_texture_compression_latc +#define GL_EXT_texture_compression_latc 1 + +#define GL_COMPRESSED_LUMINANCE_LATC1_EXT 0x8C70 +#define GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT 0x8C71 +#define GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT 0x8C72 +#define GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT 0x8C73 + +#define GLEW_EXT_texture_compression_latc GLEW_GET_VAR(__GLEW_EXT_texture_compression_latc) + +#endif /* GL_EXT_texture_compression_latc */ + +/* -------------------- GL_EXT_texture_compression_rgtc -------------------- */ + +#ifndef GL_EXT_texture_compression_rgtc +#define GL_EXT_texture_compression_rgtc 1 + +#define GL_COMPRESSED_RED_RGTC1_EXT 0x8DBB +#define GL_COMPRESSED_SIGNED_RED_RGTC1_EXT 0x8DBC +#define GL_COMPRESSED_RED_GREEN_RGTC2_EXT 0x8DBD +#define GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT 0x8DBE + +#define GLEW_EXT_texture_compression_rgtc GLEW_GET_VAR(__GLEW_EXT_texture_compression_rgtc) + +#endif /* GL_EXT_texture_compression_rgtc */ + +/* -------------------- GL_EXT_texture_compression_s3tc -------------------- */ + +#ifndef GL_EXT_texture_compression_s3tc +#define GL_EXT_texture_compression_s3tc 1 + +#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 +#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 +#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 +#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 + +#define GLEW_EXT_texture_compression_s3tc GLEW_GET_VAR(__GLEW_EXT_texture_compression_s3tc) + +#endif /* GL_EXT_texture_compression_s3tc */ + +/* ------------------------ GL_EXT_texture_cube_map ------------------------ */ + +#ifndef GL_EXT_texture_cube_map +#define GL_EXT_texture_cube_map 1 + +#define GL_NORMAL_MAP_EXT 0x8511 +#define GL_REFLECTION_MAP_EXT 0x8512 +#define GL_TEXTURE_CUBE_MAP_EXT 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP_EXT 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP_EXT 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT 0x851C + +#define GLEW_EXT_texture_cube_map GLEW_GET_VAR(__GLEW_EXT_texture_cube_map) + +#endif /* GL_EXT_texture_cube_map */ + +/* ----------------------- GL_EXT_texture_edge_clamp ----------------------- */ + +#ifndef GL_EXT_texture_edge_clamp +#define GL_EXT_texture_edge_clamp 1 + +#define GL_CLAMP_TO_EDGE_EXT 0x812F + +#define GLEW_EXT_texture_edge_clamp GLEW_GET_VAR(__GLEW_EXT_texture_edge_clamp) + +#endif /* GL_EXT_texture_edge_clamp */ + +/* --------------------------- GL_EXT_texture_env -------------------------- */ + +#ifndef GL_EXT_texture_env +#define GL_EXT_texture_env 1 + +#define GL_TEXTURE_ENV0_EXT 0 +#define GL_ENV_BLEND_EXT 0 +#define GL_TEXTURE_ENV_SHIFT_EXT 0 +#define GL_ENV_REPLACE_EXT 0 +#define GL_ENV_ADD_EXT 0 +#define GL_ENV_SUBTRACT_EXT 0 +#define GL_TEXTURE_ENV_MODE_ALPHA_EXT 0 +#define GL_ENV_REVERSE_SUBTRACT_EXT 0 +#define GL_ENV_REVERSE_BLEND_EXT 0 +#define GL_ENV_COPY_EXT 0 +#define GL_ENV_MODULATE_EXT 0 + +#define GLEW_EXT_texture_env GLEW_GET_VAR(__GLEW_EXT_texture_env) + +#endif /* GL_EXT_texture_env */ + +/* ------------------------- GL_EXT_texture_env_add ------------------------ */ + +#ifndef GL_EXT_texture_env_add +#define GL_EXT_texture_env_add 1 + +#define GLEW_EXT_texture_env_add GLEW_GET_VAR(__GLEW_EXT_texture_env_add) + +#endif /* GL_EXT_texture_env_add */ + +/* ----------------------- GL_EXT_texture_env_combine ---------------------- */ + +#ifndef GL_EXT_texture_env_combine +#define GL_EXT_texture_env_combine 1 + +#define GL_COMBINE_EXT 0x8570 +#define GL_COMBINE_RGB_EXT 0x8571 +#define GL_COMBINE_ALPHA_EXT 0x8572 +#define GL_RGB_SCALE_EXT 0x8573 +#define GL_ADD_SIGNED_EXT 0x8574 +#define GL_INTERPOLATE_EXT 0x8575 +#define GL_CONSTANT_EXT 0x8576 +#define GL_PRIMARY_COLOR_EXT 0x8577 +#define GL_PREVIOUS_EXT 0x8578 +#define GL_SOURCE0_RGB_EXT 0x8580 +#define GL_SOURCE1_RGB_EXT 0x8581 +#define GL_SOURCE2_RGB_EXT 0x8582 +#define GL_SOURCE0_ALPHA_EXT 0x8588 +#define GL_SOURCE1_ALPHA_EXT 0x8589 +#define GL_SOURCE2_ALPHA_EXT 0x858A +#define GL_OPERAND0_RGB_EXT 0x8590 +#define GL_OPERAND1_RGB_EXT 0x8591 +#define GL_OPERAND2_RGB_EXT 0x8592 +#define GL_OPERAND0_ALPHA_EXT 0x8598 +#define GL_OPERAND1_ALPHA_EXT 0x8599 +#define GL_OPERAND2_ALPHA_EXT 0x859A + +#define GLEW_EXT_texture_env_combine GLEW_GET_VAR(__GLEW_EXT_texture_env_combine) + +#endif /* GL_EXT_texture_env_combine */ + +/* ------------------------ GL_EXT_texture_env_dot3 ------------------------ */ + +#ifndef GL_EXT_texture_env_dot3 +#define GL_EXT_texture_env_dot3 1 + +#define GL_DOT3_RGB_EXT 0x8740 +#define GL_DOT3_RGBA_EXT 0x8741 + +#define GLEW_EXT_texture_env_dot3 GLEW_GET_VAR(__GLEW_EXT_texture_env_dot3) + +#endif /* GL_EXT_texture_env_dot3 */ + +/* ------------------- GL_EXT_texture_filter_anisotropic ------------------- */ + +#ifndef GL_EXT_texture_filter_anisotropic +#define GL_EXT_texture_filter_anisotropic 1 + +#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE +#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF + +#define GLEW_EXT_texture_filter_anisotropic GLEW_GET_VAR(__GLEW_EXT_texture_filter_anisotropic) + +#endif /* GL_EXT_texture_filter_anisotropic */ + +/* ------------------------- GL_EXT_texture_integer ------------------------ */ + +#ifndef GL_EXT_texture_integer +#define GL_EXT_texture_integer 1 + +#define GL_RGBA32UI_EXT 0x8D70 +#define GL_RGB32UI_EXT 0x8D71 +#define GL_ALPHA32UI_EXT 0x8D72 +#define GL_INTENSITY32UI_EXT 0x8D73 +#define GL_LUMINANCE32UI_EXT 0x8D74 +#define GL_LUMINANCE_ALPHA32UI_EXT 0x8D75 +#define GL_RGBA16UI_EXT 0x8D76 +#define GL_RGB16UI_EXT 0x8D77 +#define GL_ALPHA16UI_EXT 0x8D78 +#define GL_INTENSITY16UI_EXT 0x8D79 +#define GL_LUMINANCE16UI_EXT 0x8D7A +#define GL_LUMINANCE_ALPHA16UI_EXT 0x8D7B +#define GL_RGBA8UI_EXT 0x8D7C +#define GL_RGB8UI_EXT 0x8D7D +#define GL_ALPHA8UI_EXT 0x8D7E +#define GL_INTENSITY8UI_EXT 0x8D7F +#define GL_LUMINANCE8UI_EXT 0x8D80 +#define GL_LUMINANCE_ALPHA8UI_EXT 0x8D81 +#define GL_RGBA32I_EXT 0x8D82 +#define GL_RGB32I_EXT 0x8D83 +#define GL_ALPHA32I_EXT 0x8D84 +#define GL_INTENSITY32I_EXT 0x8D85 +#define GL_LUMINANCE32I_EXT 0x8D86 +#define GL_LUMINANCE_ALPHA32I_EXT 0x8D87 +#define GL_RGBA16I_EXT 0x8D88 +#define GL_RGB16I_EXT 0x8D89 +#define GL_ALPHA16I_EXT 0x8D8A +#define GL_INTENSITY16I_EXT 0x8D8B +#define GL_LUMINANCE16I_EXT 0x8D8C +#define GL_LUMINANCE_ALPHA16I_EXT 0x8D8D +#define GL_RGBA8I_EXT 0x8D8E +#define GL_RGB8I_EXT 0x8D8F +#define GL_ALPHA8I_EXT 0x8D90 +#define GL_INTENSITY8I_EXT 0x8D91 +#define GL_LUMINANCE8I_EXT 0x8D92 +#define GL_LUMINANCE_ALPHA8I_EXT 0x8D93 +#define GL_RED_INTEGER_EXT 0x8D94 +#define GL_GREEN_INTEGER_EXT 0x8D95 +#define GL_BLUE_INTEGER_EXT 0x8D96 +#define GL_ALPHA_INTEGER_EXT 0x8D97 +#define GL_RGB_INTEGER_EXT 0x8D98 +#define GL_RGBA_INTEGER_EXT 0x8D99 +#define GL_BGR_INTEGER_EXT 0x8D9A +#define GL_BGRA_INTEGER_EXT 0x8D9B +#define GL_LUMINANCE_INTEGER_EXT 0x8D9C +#define GL_LUMINANCE_ALPHA_INTEGER_EXT 0x8D9D +#define GL_RGBA_INTEGER_MODE_EXT 0x8D9E + +typedef void (GLAPIENTRY * PFNGLCLEARCOLORIIEXTPROC) (GLint red, GLint green, GLint blue, GLint alpha); +typedef void (GLAPIENTRY * PFNGLCLEARCOLORIUIEXTPROC) (GLuint red, GLuint green, GLuint blue, GLuint alpha); +typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, GLuint *params); +typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, const GLuint *params); + +#define glClearColorIiEXT GLEW_GET_FUN(__glewClearColorIiEXT) +#define glClearColorIuiEXT GLEW_GET_FUN(__glewClearColorIuiEXT) +#define glGetTexParameterIivEXT GLEW_GET_FUN(__glewGetTexParameterIivEXT) +#define glGetTexParameterIuivEXT GLEW_GET_FUN(__glewGetTexParameterIuivEXT) +#define glTexParameterIivEXT GLEW_GET_FUN(__glewTexParameterIivEXT) +#define glTexParameterIuivEXT GLEW_GET_FUN(__glewTexParameterIuivEXT) + +#define GLEW_EXT_texture_integer GLEW_GET_VAR(__GLEW_EXT_texture_integer) + +#endif /* GL_EXT_texture_integer */ + +/* ------------------------ GL_EXT_texture_lod_bias ------------------------ */ + +#ifndef GL_EXT_texture_lod_bias +#define GL_EXT_texture_lod_bias 1 + +#define GL_MAX_TEXTURE_LOD_BIAS_EXT 0x84FD +#define GL_TEXTURE_FILTER_CONTROL_EXT 0x8500 +#define GL_TEXTURE_LOD_BIAS_EXT 0x8501 + +#define GLEW_EXT_texture_lod_bias GLEW_GET_VAR(__GLEW_EXT_texture_lod_bias) + +#endif /* GL_EXT_texture_lod_bias */ + +/* ---------------------- GL_EXT_texture_mirror_clamp ---------------------- */ + +#ifndef GL_EXT_texture_mirror_clamp +#define GL_EXT_texture_mirror_clamp 1 + +#define GL_MIRROR_CLAMP_EXT 0x8742 +#define GL_MIRROR_CLAMP_TO_EDGE_EXT 0x8743 +#define GL_MIRROR_CLAMP_TO_BORDER_EXT 0x8912 + +#define GLEW_EXT_texture_mirror_clamp GLEW_GET_VAR(__GLEW_EXT_texture_mirror_clamp) + +#endif /* GL_EXT_texture_mirror_clamp */ + +/* ------------------------- GL_EXT_texture_object ------------------------- */ + +#ifndef GL_EXT_texture_object +#define GL_EXT_texture_object 1 + +#define GL_TEXTURE_PRIORITY_EXT 0x8066 +#define GL_TEXTURE_RESIDENT_EXT 0x8067 +#define GL_TEXTURE_1D_BINDING_EXT 0x8068 +#define GL_TEXTURE_2D_BINDING_EXT 0x8069 +#define GL_TEXTURE_3D_BINDING_EXT 0x806A + +typedef GLboolean (GLAPIENTRY * PFNGLARETEXTURESRESIDENTEXTPROC) (GLsizei n, const GLuint* textures, GLboolean* residences); +typedef void (GLAPIENTRY * PFNGLBINDTEXTUREEXTPROC) (GLenum target, GLuint texture); +typedef void (GLAPIENTRY * PFNGLDELETETEXTURESEXTPROC) (GLsizei n, const GLuint* textures); +typedef void (GLAPIENTRY * PFNGLGENTEXTURESEXTPROC) (GLsizei n, GLuint* textures); +typedef GLboolean (GLAPIENTRY * PFNGLISTEXTUREEXTPROC) (GLuint texture); +typedef void (GLAPIENTRY * PFNGLPRIORITIZETEXTURESEXTPROC) (GLsizei n, const GLuint* textures, const GLclampf* priorities); + +#define glAreTexturesResidentEXT GLEW_GET_FUN(__glewAreTexturesResidentEXT) +#define glBindTextureEXT GLEW_GET_FUN(__glewBindTextureEXT) +#define glDeleteTexturesEXT GLEW_GET_FUN(__glewDeleteTexturesEXT) +#define glGenTexturesEXT GLEW_GET_FUN(__glewGenTexturesEXT) +#define glIsTextureEXT GLEW_GET_FUN(__glewIsTextureEXT) +#define glPrioritizeTexturesEXT GLEW_GET_FUN(__glewPrioritizeTexturesEXT) + +#define GLEW_EXT_texture_object GLEW_GET_VAR(__GLEW_EXT_texture_object) + +#endif /* GL_EXT_texture_object */ + +/* --------------------- GL_EXT_texture_perturb_normal --------------------- */ + +#ifndef GL_EXT_texture_perturb_normal +#define GL_EXT_texture_perturb_normal 1 + +#define GL_PERTURB_EXT 0x85AE +#define GL_TEXTURE_NORMAL_EXT 0x85AF + +typedef void (GLAPIENTRY * PFNGLTEXTURENORMALEXTPROC) (GLenum mode); + +#define glTextureNormalEXT GLEW_GET_FUN(__glewTextureNormalEXT) + +#define GLEW_EXT_texture_perturb_normal GLEW_GET_VAR(__GLEW_EXT_texture_perturb_normal) + +#endif /* GL_EXT_texture_perturb_normal */ + +/* ------------------------ GL_EXT_texture_rectangle ----------------------- */ + +#ifndef GL_EXT_texture_rectangle +#define GL_EXT_texture_rectangle 1 + +#define GL_TEXTURE_RECTANGLE_EXT 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE_EXT 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE_EXT 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE_EXT 0x84F8 + +#define GLEW_EXT_texture_rectangle GLEW_GET_VAR(__GLEW_EXT_texture_rectangle) + +#endif /* GL_EXT_texture_rectangle */ + +/* -------------------------- GL_EXT_texture_sRGB -------------------------- */ + +#ifndef GL_EXT_texture_sRGB +#define GL_EXT_texture_sRGB 1 + +#define GL_SRGB_EXT 0x8C40 +#define GL_SRGB8_EXT 0x8C41 +#define GL_SRGB_ALPHA_EXT 0x8C42 +#define GL_SRGB8_ALPHA8_EXT 0x8C43 +#define GL_SLUMINANCE_ALPHA_EXT 0x8C44 +#define GL_SLUMINANCE8_ALPHA8_EXT 0x8C45 +#define GL_SLUMINANCE_EXT 0x8C46 +#define GL_SLUMINANCE8_EXT 0x8C47 +#define GL_COMPRESSED_SRGB_EXT 0x8C48 +#define GL_COMPRESSED_SRGB_ALPHA_EXT 0x8C49 +#define GL_COMPRESSED_SLUMINANCE_EXT 0x8C4A +#define GL_COMPRESSED_SLUMINANCE_ALPHA_EXT 0x8C4B +#define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT 0x8C4C +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT 0x8C4D +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT 0x8C4E +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 0x8C4F + +#define GLEW_EXT_texture_sRGB GLEW_GET_VAR(__GLEW_EXT_texture_sRGB) + +#endif /* GL_EXT_texture_sRGB */ + +/* --------------------- GL_EXT_texture_shared_exponent -------------------- */ + +#ifndef GL_EXT_texture_shared_exponent +#define GL_EXT_texture_shared_exponent 1 + +#define GL_RGB9_E5_EXT 0x8C3D +#define GL_UNSIGNED_INT_5_9_9_9_REV_EXT 0x8C3E +#define GL_TEXTURE_SHARED_SIZE_EXT 0x8C3F + +#define GLEW_EXT_texture_shared_exponent GLEW_GET_VAR(__GLEW_EXT_texture_shared_exponent) + +#endif /* GL_EXT_texture_shared_exponent */ + +/* --------------------------- GL_EXT_timer_query -------------------------- */ + +#ifndef GL_EXT_timer_query +#define GL_EXT_timer_query 1 + +#define GL_TIME_ELAPSED_EXT 0x88BF + +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTI64VEXTPROC) (GLuint id, GLenum pname, GLint64EXT *params); +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUI64VEXTPROC) (GLuint id, GLenum pname, GLuint64EXT *params); + +#define glGetQueryObjecti64vEXT GLEW_GET_FUN(__glewGetQueryObjecti64vEXT) +#define glGetQueryObjectui64vEXT GLEW_GET_FUN(__glewGetQueryObjectui64vEXT) + +#define GLEW_EXT_timer_query GLEW_GET_VAR(__GLEW_EXT_timer_query) + +#endif /* GL_EXT_timer_query */ + +/* -------------------------- GL_EXT_vertex_array -------------------------- */ + +#ifndef GL_EXT_vertex_array +#define GL_EXT_vertex_array 1 + +#define GL_DOUBLE_EXT 0x140A +#define GL_VERTEX_ARRAY_EXT 0x8074 +#define GL_NORMAL_ARRAY_EXT 0x8075 +#define GL_COLOR_ARRAY_EXT 0x8076 +#define GL_INDEX_ARRAY_EXT 0x8077 +#define GL_TEXTURE_COORD_ARRAY_EXT 0x8078 +#define GL_EDGE_FLAG_ARRAY_EXT 0x8079 +#define GL_VERTEX_ARRAY_SIZE_EXT 0x807A +#define GL_VERTEX_ARRAY_TYPE_EXT 0x807B +#define GL_VERTEX_ARRAY_STRIDE_EXT 0x807C +#define GL_VERTEX_ARRAY_COUNT_EXT 0x807D +#define GL_NORMAL_ARRAY_TYPE_EXT 0x807E +#define GL_NORMAL_ARRAY_STRIDE_EXT 0x807F +#define GL_NORMAL_ARRAY_COUNT_EXT 0x8080 +#define GL_COLOR_ARRAY_SIZE_EXT 0x8081 +#define GL_COLOR_ARRAY_TYPE_EXT 0x8082 +#define GL_COLOR_ARRAY_STRIDE_EXT 0x8083 +#define GL_COLOR_ARRAY_COUNT_EXT 0x8084 +#define GL_INDEX_ARRAY_TYPE_EXT 0x8085 +#define GL_INDEX_ARRAY_STRIDE_EXT 0x8086 +#define GL_INDEX_ARRAY_COUNT_EXT 0x8087 +#define GL_TEXTURE_COORD_ARRAY_SIZE_EXT 0x8088 +#define GL_TEXTURE_COORD_ARRAY_TYPE_EXT 0x8089 +#define GL_TEXTURE_COORD_ARRAY_STRIDE_EXT 0x808A +#define GL_TEXTURE_COORD_ARRAY_COUNT_EXT 0x808B +#define GL_EDGE_FLAG_ARRAY_STRIDE_EXT 0x808C +#define GL_EDGE_FLAG_ARRAY_COUNT_EXT 0x808D +#define GL_VERTEX_ARRAY_POINTER_EXT 0x808E +#define GL_NORMAL_ARRAY_POINTER_EXT 0x808F +#define GL_COLOR_ARRAY_POINTER_EXT 0x8090 +#define GL_INDEX_ARRAY_POINTER_EXT 0x8091 +#define GL_TEXTURE_COORD_ARRAY_POINTER_EXT 0x8092 +#define GL_EDGE_FLAG_ARRAY_POINTER_EXT 0x8093 + +typedef void (GLAPIENTRY * PFNGLARRAYELEMENTEXTPROC) (GLint i); +typedef void (GLAPIENTRY * PFNGLCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void* pointer); +typedef void (GLAPIENTRY * PFNGLDRAWARRAYSEXTPROC) (GLenum mode, GLint first, GLsizei count); +typedef void (GLAPIENTRY * PFNGLEDGEFLAGPOINTEREXTPROC) (GLsizei stride, GLsizei count, const GLboolean* pointer); +typedef void (GLAPIENTRY * PFNGLGETPOINTERVEXTPROC) (GLenum pname, void** params); +typedef void (GLAPIENTRY * PFNGLINDEXPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const void* pointer); +typedef void (GLAPIENTRY * PFNGLNORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const void* pointer); +typedef void (GLAPIENTRY * PFNGLTEXCOORDPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void* pointer); +typedef void (GLAPIENTRY * PFNGLVERTEXPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void* pointer); + +#define glArrayElementEXT GLEW_GET_FUN(__glewArrayElementEXT) +#define glColorPointerEXT GLEW_GET_FUN(__glewColorPointerEXT) +#define glDrawArraysEXT GLEW_GET_FUN(__glewDrawArraysEXT) +#define glEdgeFlagPointerEXT GLEW_GET_FUN(__glewEdgeFlagPointerEXT) +#define glGetPointervEXT GLEW_GET_FUN(__glewGetPointervEXT) +#define glIndexPointerEXT GLEW_GET_FUN(__glewIndexPointerEXT) +#define glNormalPointerEXT GLEW_GET_FUN(__glewNormalPointerEXT) +#define glTexCoordPointerEXT GLEW_GET_FUN(__glewTexCoordPointerEXT) +#define glVertexPointerEXT GLEW_GET_FUN(__glewVertexPointerEXT) + +#define GLEW_EXT_vertex_array GLEW_GET_VAR(__GLEW_EXT_vertex_array) + +#endif /* GL_EXT_vertex_array */ + +/* -------------------------- GL_EXT_vertex_shader ------------------------- */ + +#ifndef GL_EXT_vertex_shader +#define GL_EXT_vertex_shader 1 + +#define GL_VERTEX_SHADER_EXT 0x8780 +#define GL_VERTEX_SHADER_BINDING_EXT 0x8781 +#define GL_OP_INDEX_EXT 0x8782 +#define GL_OP_NEGATE_EXT 0x8783 +#define GL_OP_DOT3_EXT 0x8784 +#define GL_OP_DOT4_EXT 0x8785 +#define GL_OP_MUL_EXT 0x8786 +#define GL_OP_ADD_EXT 0x8787 +#define GL_OP_MADD_EXT 0x8788 +#define GL_OP_FRAC_EXT 0x8789 +#define GL_OP_MAX_EXT 0x878A +#define GL_OP_MIN_EXT 0x878B +#define GL_OP_SET_GE_EXT 0x878C +#define GL_OP_SET_LT_EXT 0x878D +#define GL_OP_CLAMP_EXT 0x878E +#define GL_OP_FLOOR_EXT 0x878F +#define GL_OP_ROUND_EXT 0x8790 +#define GL_OP_EXP_BASE_2_EXT 0x8791 +#define GL_OP_LOG_BASE_2_EXT 0x8792 +#define GL_OP_POWER_EXT 0x8793 +#define GL_OP_RECIP_EXT 0x8794 +#define GL_OP_RECIP_SQRT_EXT 0x8795 +#define GL_OP_SUB_EXT 0x8796 +#define GL_OP_CROSS_PRODUCT_EXT 0x8797 +#define GL_OP_MULTIPLY_MATRIX_EXT 0x8798 +#define GL_OP_MOV_EXT 0x8799 +#define GL_OUTPUT_VERTEX_EXT 0x879A +#define GL_OUTPUT_COLOR0_EXT 0x879B +#define GL_OUTPUT_COLOR1_EXT 0x879C +#define GL_OUTPUT_TEXTURE_COORD0_EXT 0x879D +#define GL_OUTPUT_TEXTURE_COORD1_EXT 0x879E +#define GL_OUTPUT_TEXTURE_COORD2_EXT 0x879F +#define GL_OUTPUT_TEXTURE_COORD3_EXT 0x87A0 +#define GL_OUTPUT_TEXTURE_COORD4_EXT 0x87A1 +#define GL_OUTPUT_TEXTURE_COORD5_EXT 0x87A2 +#define GL_OUTPUT_TEXTURE_COORD6_EXT 0x87A3 +#define GL_OUTPUT_TEXTURE_COORD7_EXT 0x87A4 +#define GL_OUTPUT_TEXTURE_COORD8_EXT 0x87A5 +#define GL_OUTPUT_TEXTURE_COORD9_EXT 0x87A6 +#define GL_OUTPUT_TEXTURE_COORD10_EXT 0x87A7 +#define GL_OUTPUT_TEXTURE_COORD11_EXT 0x87A8 +#define GL_OUTPUT_TEXTURE_COORD12_EXT 0x87A9 +#define GL_OUTPUT_TEXTURE_COORD13_EXT 0x87AA +#define GL_OUTPUT_TEXTURE_COORD14_EXT 0x87AB +#define GL_OUTPUT_TEXTURE_COORD15_EXT 0x87AC +#define GL_OUTPUT_TEXTURE_COORD16_EXT 0x87AD +#define GL_OUTPUT_TEXTURE_COORD17_EXT 0x87AE +#define GL_OUTPUT_TEXTURE_COORD18_EXT 0x87AF +#define GL_OUTPUT_TEXTURE_COORD19_EXT 0x87B0 +#define GL_OUTPUT_TEXTURE_COORD20_EXT 0x87B1 +#define GL_OUTPUT_TEXTURE_COORD21_EXT 0x87B2 +#define GL_OUTPUT_TEXTURE_COORD22_EXT 0x87B3 +#define GL_OUTPUT_TEXTURE_COORD23_EXT 0x87B4 +#define GL_OUTPUT_TEXTURE_COORD24_EXT 0x87B5 +#define GL_OUTPUT_TEXTURE_COORD25_EXT 0x87B6 +#define GL_OUTPUT_TEXTURE_COORD26_EXT 0x87B7 +#define GL_OUTPUT_TEXTURE_COORD27_EXT 0x87B8 +#define GL_OUTPUT_TEXTURE_COORD28_EXT 0x87B9 +#define GL_OUTPUT_TEXTURE_COORD29_EXT 0x87BA +#define GL_OUTPUT_TEXTURE_COORD30_EXT 0x87BB +#define GL_OUTPUT_TEXTURE_COORD31_EXT 0x87BC +#define GL_OUTPUT_FOG_EXT 0x87BD +#define GL_SCALAR_EXT 0x87BE +#define GL_VECTOR_EXT 0x87BF +#define GL_MATRIX_EXT 0x87C0 +#define GL_VARIANT_EXT 0x87C1 +#define GL_INVARIANT_EXT 0x87C2 +#define GL_LOCAL_CONSTANT_EXT 0x87C3 +#define GL_LOCAL_EXT 0x87C4 +#define GL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87C5 +#define GL_MAX_VERTEX_SHADER_VARIANTS_EXT 0x87C6 +#define GL_MAX_VERTEX_SHADER_INVARIANTS_EXT 0x87C7 +#define GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87C8 +#define GL_MAX_VERTEX_SHADER_LOCALS_EXT 0x87C9 +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CA +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT 0x87CB +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT 0x87CC +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87CD +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT 0x87CE +#define GL_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CF +#define GL_VERTEX_SHADER_VARIANTS_EXT 0x87D0 +#define GL_VERTEX_SHADER_INVARIANTS_EXT 0x87D1 +#define GL_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87D2 +#define GL_VERTEX_SHADER_LOCALS_EXT 0x87D3 +#define GL_VERTEX_SHADER_OPTIMIZED_EXT 0x87D4 +#define GL_X_EXT 0x87D5 +#define GL_Y_EXT 0x87D6 +#define GL_Z_EXT 0x87D7 +#define GL_W_EXT 0x87D8 +#define GL_NEGATIVE_X_EXT 0x87D9 +#define GL_NEGATIVE_Y_EXT 0x87DA +#define GL_NEGATIVE_Z_EXT 0x87DB +#define GL_NEGATIVE_W_EXT 0x87DC +#define GL_ZERO_EXT 0x87DD +#define GL_ONE_EXT 0x87DE +#define GL_NEGATIVE_ONE_EXT 0x87DF +#define GL_NORMALIZED_RANGE_EXT 0x87E0 +#define GL_FULL_RANGE_EXT 0x87E1 +#define GL_CURRENT_VERTEX_EXT 0x87E2 +#define GL_MVP_MATRIX_EXT 0x87E3 +#define GL_VARIANT_VALUE_EXT 0x87E4 +#define GL_VARIANT_DATATYPE_EXT 0x87E5 +#define GL_VARIANT_ARRAY_STRIDE_EXT 0x87E6 +#define GL_VARIANT_ARRAY_TYPE_EXT 0x87E7 +#define GL_VARIANT_ARRAY_EXT 0x87E8 +#define GL_VARIANT_ARRAY_POINTER_EXT 0x87E9 +#define GL_INVARIANT_VALUE_EXT 0x87EA +#define GL_INVARIANT_DATATYPE_EXT 0x87EB +#define GL_LOCAL_CONSTANT_VALUE_EXT 0x87EC +#define GL_LOCAL_CONSTANT_DATATYPE_EXT 0x87ED + +typedef void (GLAPIENTRY * PFNGLBEGINVERTEXSHADEREXTPROC) (void); +typedef GLuint (GLAPIENTRY * PFNGLBINDLIGHTPARAMETEREXTPROC) (GLenum light, GLenum value); +typedef GLuint (GLAPIENTRY * PFNGLBINDMATERIALPARAMETEREXTPROC) (GLenum face, GLenum value); +typedef GLuint (GLAPIENTRY * PFNGLBINDPARAMETEREXTPROC) (GLenum value); +typedef GLuint (GLAPIENTRY * PFNGLBINDTEXGENPARAMETEREXTPROC) (GLenum unit, GLenum coord, GLenum value); +typedef GLuint (GLAPIENTRY * PFNGLBINDTEXTUREUNITPARAMETEREXTPROC) (GLenum unit, GLenum value); +typedef void (GLAPIENTRY * PFNGLBINDVERTEXSHADEREXTPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLDELETEVERTEXSHADEREXTPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLENABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLENDVERTEXSHADEREXTPROC) (void); +typedef void (GLAPIENTRY * PFNGLEXTRACTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); +typedef GLuint (GLAPIENTRY * PFNGLGENSYMBOLSEXTPROC) (GLenum dataType, GLenum storageType, GLenum range, GLuint components); +typedef GLuint (GLAPIENTRY * PFNGLGENVERTEXSHADERSEXTPROC) (GLuint range); +typedef void (GLAPIENTRY * PFNGLGETINVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (GLAPIENTRY * PFNGLGETINVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +typedef void (GLAPIENTRY * PFNGLGETINVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (GLAPIENTRY * PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (GLAPIENTRY * PFNGLGETLOCALCONSTANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +typedef void (GLAPIENTRY * PFNGLGETLOCALCONSTANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (GLAPIENTRY * PFNGLGETVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (GLAPIENTRY * PFNGLGETVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +typedef void (GLAPIENTRY * PFNGLGETVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (GLAPIENTRY * PFNGLGETVARIANTPOINTERVEXTPROC) (GLuint id, GLenum value, GLvoid **data); +typedef void (GLAPIENTRY * PFNGLINSERTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); +typedef GLboolean (GLAPIENTRY * PFNGLISVARIANTENABLEDEXTPROC) (GLuint id, GLenum cap); +typedef void (GLAPIENTRY * PFNGLSETINVARIANTEXTPROC) (GLuint id, GLenum type, GLvoid *addr); +typedef void (GLAPIENTRY * PFNGLSETLOCALCONSTANTEXTPROC) (GLuint id, GLenum type, GLvoid *addr); +typedef void (GLAPIENTRY * PFNGLSHADEROP1EXTPROC) (GLenum op, GLuint res, GLuint arg1); +typedef void (GLAPIENTRY * PFNGLSHADEROP2EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2); +typedef void (GLAPIENTRY * PFNGLSHADEROP3EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3); +typedef void (GLAPIENTRY * PFNGLSWIZZLEEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); +typedef void (GLAPIENTRY * PFNGLVARIANTPOINTEREXTPROC) (GLuint id, GLenum type, GLuint stride, GLvoid *addr); +typedef void (GLAPIENTRY * PFNGLVARIANTBVEXTPROC) (GLuint id, GLbyte *addr); +typedef void (GLAPIENTRY * PFNGLVARIANTDVEXTPROC) (GLuint id, GLdouble *addr); +typedef void (GLAPIENTRY * PFNGLVARIANTFVEXTPROC) (GLuint id, GLfloat *addr); +typedef void (GLAPIENTRY * PFNGLVARIANTIVEXTPROC) (GLuint id, GLint *addr); +typedef void (GLAPIENTRY * PFNGLVARIANTSVEXTPROC) (GLuint id, GLshort *addr); +typedef void (GLAPIENTRY * PFNGLVARIANTUBVEXTPROC) (GLuint id, GLubyte *addr); +typedef void (GLAPIENTRY * PFNGLVARIANTUIVEXTPROC) (GLuint id, GLuint *addr); +typedef void (GLAPIENTRY * PFNGLVARIANTUSVEXTPROC) (GLuint id, GLushort *addr); +typedef void (GLAPIENTRY * PFNGLWRITEMASKEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); + +#define glBeginVertexShaderEXT GLEW_GET_FUN(__glewBeginVertexShaderEXT) +#define glBindLightParameterEXT GLEW_GET_FUN(__glewBindLightParameterEXT) +#define glBindMaterialParameterEXT GLEW_GET_FUN(__glewBindMaterialParameterEXT) +#define glBindParameterEXT GLEW_GET_FUN(__glewBindParameterEXT) +#define glBindTexGenParameterEXT GLEW_GET_FUN(__glewBindTexGenParameterEXT) +#define glBindTextureUnitParameterEXT GLEW_GET_FUN(__glewBindTextureUnitParameterEXT) +#define glBindVertexShaderEXT GLEW_GET_FUN(__glewBindVertexShaderEXT) +#define glDeleteVertexShaderEXT GLEW_GET_FUN(__glewDeleteVertexShaderEXT) +#define glDisableVariantClientStateEXT GLEW_GET_FUN(__glewDisableVariantClientStateEXT) +#define glEnableVariantClientStateEXT GLEW_GET_FUN(__glewEnableVariantClientStateEXT) +#define glEndVertexShaderEXT GLEW_GET_FUN(__glewEndVertexShaderEXT) +#define glExtractComponentEXT GLEW_GET_FUN(__glewExtractComponentEXT) +#define glGenSymbolsEXT GLEW_GET_FUN(__glewGenSymbolsEXT) +#define glGenVertexShadersEXT GLEW_GET_FUN(__glewGenVertexShadersEXT) +#define glGetInvariantBooleanvEXT GLEW_GET_FUN(__glewGetInvariantBooleanvEXT) +#define glGetInvariantFloatvEXT GLEW_GET_FUN(__glewGetInvariantFloatvEXT) +#define glGetInvariantIntegervEXT GLEW_GET_FUN(__glewGetInvariantIntegervEXT) +#define glGetLocalConstantBooleanvEXT GLEW_GET_FUN(__glewGetLocalConstantBooleanvEXT) +#define glGetLocalConstantFloatvEXT GLEW_GET_FUN(__glewGetLocalConstantFloatvEXT) +#define glGetLocalConstantIntegervEXT GLEW_GET_FUN(__glewGetLocalConstantIntegervEXT) +#define glGetVariantBooleanvEXT GLEW_GET_FUN(__glewGetVariantBooleanvEXT) +#define glGetVariantFloatvEXT GLEW_GET_FUN(__glewGetVariantFloatvEXT) +#define glGetVariantIntegervEXT GLEW_GET_FUN(__glewGetVariantIntegervEXT) +#define glGetVariantPointervEXT GLEW_GET_FUN(__glewGetVariantPointervEXT) +#define glInsertComponentEXT GLEW_GET_FUN(__glewInsertComponentEXT) +#define glIsVariantEnabledEXT GLEW_GET_FUN(__glewIsVariantEnabledEXT) +#define glSetInvariantEXT GLEW_GET_FUN(__glewSetInvariantEXT) +#define glSetLocalConstantEXT GLEW_GET_FUN(__glewSetLocalConstantEXT) +#define glShaderOp1EXT GLEW_GET_FUN(__glewShaderOp1EXT) +#define glShaderOp2EXT GLEW_GET_FUN(__glewShaderOp2EXT) +#define glShaderOp3EXT GLEW_GET_FUN(__glewShaderOp3EXT) +#define glSwizzleEXT GLEW_GET_FUN(__glewSwizzleEXT) +#define glVariantPointerEXT GLEW_GET_FUN(__glewVariantPointerEXT) +#define glVariantbvEXT GLEW_GET_FUN(__glewVariantbvEXT) +#define glVariantdvEXT GLEW_GET_FUN(__glewVariantdvEXT) +#define glVariantfvEXT GLEW_GET_FUN(__glewVariantfvEXT) +#define glVariantivEXT GLEW_GET_FUN(__glewVariantivEXT) +#define glVariantsvEXT GLEW_GET_FUN(__glewVariantsvEXT) +#define glVariantubvEXT GLEW_GET_FUN(__glewVariantubvEXT) +#define glVariantuivEXT GLEW_GET_FUN(__glewVariantuivEXT) +#define glVariantusvEXT GLEW_GET_FUN(__glewVariantusvEXT) +#define glWriteMaskEXT GLEW_GET_FUN(__glewWriteMaskEXT) + +#define GLEW_EXT_vertex_shader GLEW_GET_VAR(__GLEW_EXT_vertex_shader) + +#endif /* GL_EXT_vertex_shader */ + +/* ------------------------ GL_EXT_vertex_weighting ------------------------ */ + +#ifndef GL_EXT_vertex_weighting +#define GL_EXT_vertex_weighting 1 + +#define GL_MODELVIEW0_STACK_DEPTH_EXT 0x0BA3 +#define GL_MODELVIEW0_MATRIX_EXT 0x0BA6 +#define GL_MODELVIEW0_EXT 0x1700 +#define GL_MODELVIEW1_STACK_DEPTH_EXT 0x8502 +#define GL_MODELVIEW1_MATRIX_EXT 0x8506 +#define GL_VERTEX_WEIGHTING_EXT 0x8509 +#define GL_MODELVIEW1_EXT 0x850A +#define GL_CURRENT_VERTEX_WEIGHT_EXT 0x850B +#define GL_VERTEX_WEIGHT_ARRAY_EXT 0x850C +#define GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT 0x850D +#define GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT 0x850E +#define GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT 0x850F +#define GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT 0x8510 + +typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, void* pointer); +typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTFEXTPROC) (GLfloat weight); +typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTFVEXTPROC) (GLfloat* weight); + +#define glVertexWeightPointerEXT GLEW_GET_FUN(__glewVertexWeightPointerEXT) +#define glVertexWeightfEXT GLEW_GET_FUN(__glewVertexWeightfEXT) +#define glVertexWeightfvEXT GLEW_GET_FUN(__glewVertexWeightfvEXT) + +#define GLEW_EXT_vertex_weighting GLEW_GET_VAR(__GLEW_EXT_vertex_weighting) + +#endif /* GL_EXT_vertex_weighting */ + +/* ------------------------ GL_GREMEDY_string_marker ----------------------- */ + +#ifndef GL_GREMEDY_string_marker +#define GL_GREMEDY_string_marker 1 + +typedef void (GLAPIENTRY * PFNGLSTRINGMARKERGREMEDYPROC) (GLsizei len, const void* string); + +#define glStringMarkerGREMEDY GLEW_GET_FUN(__glewStringMarkerGREMEDY) + +#define GLEW_GREMEDY_string_marker GLEW_GET_VAR(__GLEW_GREMEDY_string_marker) + +#endif /* GL_GREMEDY_string_marker */ + +/* --------------------- GL_HP_convolution_border_modes -------------------- */ + +#ifndef GL_HP_convolution_border_modes +#define GL_HP_convolution_border_modes 1 + +#define GLEW_HP_convolution_border_modes GLEW_GET_VAR(__GLEW_HP_convolution_border_modes) + +#endif /* GL_HP_convolution_border_modes */ + +/* ------------------------- GL_HP_image_transform ------------------------- */ + +#ifndef GL_HP_image_transform +#define GL_HP_image_transform 1 + +typedef void (GLAPIENTRY * PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERFHPPROC) (GLenum target, GLenum pname, const GLfloat param); +typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERIHPPROC) (GLenum target, GLenum pname, const GLint param); +typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint* params); + +#define glGetImageTransformParameterfvHP GLEW_GET_FUN(__glewGetImageTransformParameterfvHP) +#define glGetImageTransformParameterivHP GLEW_GET_FUN(__glewGetImageTransformParameterivHP) +#define glImageTransformParameterfHP GLEW_GET_FUN(__glewImageTransformParameterfHP) +#define glImageTransformParameterfvHP GLEW_GET_FUN(__glewImageTransformParameterfvHP) +#define glImageTransformParameteriHP GLEW_GET_FUN(__glewImageTransformParameteriHP) +#define glImageTransformParameterivHP GLEW_GET_FUN(__glewImageTransformParameterivHP) + +#define GLEW_HP_image_transform GLEW_GET_VAR(__GLEW_HP_image_transform) + +#endif /* GL_HP_image_transform */ + +/* -------------------------- GL_HP_occlusion_test ------------------------- */ + +#ifndef GL_HP_occlusion_test +#define GL_HP_occlusion_test 1 + +#define GL_OCCLUSION_TEST_HP 0x8165 +#define GL_OCCLUSION_TEST_RESULT_HP 0x8166 + +#define GLEW_HP_occlusion_test GLEW_GET_VAR(__GLEW_HP_occlusion_test) + +#endif /* GL_HP_occlusion_test */ + +/* ------------------------- GL_HP_texture_lighting ------------------------ */ + +#ifndef GL_HP_texture_lighting +#define GL_HP_texture_lighting 1 + +#define GLEW_HP_texture_lighting GLEW_GET_VAR(__GLEW_HP_texture_lighting) + +#endif /* GL_HP_texture_lighting */ + +/* --------------------------- GL_IBM_cull_vertex -------------------------- */ + +#ifndef GL_IBM_cull_vertex +#define GL_IBM_cull_vertex 1 + +#define GL_CULL_VERTEX_IBM 103050 + +#define GLEW_IBM_cull_vertex GLEW_GET_VAR(__GLEW_IBM_cull_vertex) + +#endif /* GL_IBM_cull_vertex */ + +/* ---------------------- GL_IBM_multimode_draw_arrays --------------------- */ + +#ifndef GL_IBM_multimode_draw_arrays +#define GL_IBM_multimode_draw_arrays 1 + +typedef void (GLAPIENTRY * PFNGLMULTIMODEDRAWARRAYSIBMPROC) (const GLenum* mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride); +typedef void (GLAPIENTRY * PFNGLMULTIMODEDRAWELEMENTSIBMPROC) (const GLenum* mode, const GLsizei *count, GLenum type, const GLvoid * const *indices, GLsizei primcount, GLint modestride); + +#define glMultiModeDrawArraysIBM GLEW_GET_FUN(__glewMultiModeDrawArraysIBM) +#define glMultiModeDrawElementsIBM GLEW_GET_FUN(__glewMultiModeDrawElementsIBM) + +#define GLEW_IBM_multimode_draw_arrays GLEW_GET_VAR(__GLEW_IBM_multimode_draw_arrays) + +#endif /* GL_IBM_multimode_draw_arrays */ + +/* ------------------------- GL_IBM_rasterpos_clip ------------------------- */ + +#ifndef GL_IBM_rasterpos_clip +#define GL_IBM_rasterpos_clip 1 + +#define GL_RASTER_POSITION_UNCLIPPED_IBM 103010 + +#define GLEW_IBM_rasterpos_clip GLEW_GET_VAR(__GLEW_IBM_rasterpos_clip) + +#endif /* GL_IBM_rasterpos_clip */ + +/* --------------------------- GL_IBM_static_data -------------------------- */ + +#ifndef GL_IBM_static_data +#define GL_IBM_static_data 1 + +#define GL_ALL_STATIC_DATA_IBM 103060 +#define GL_STATIC_VERTEX_ARRAY_IBM 103061 + +#define GLEW_IBM_static_data GLEW_GET_VAR(__GLEW_IBM_static_data) + +#endif /* GL_IBM_static_data */ + +/* --------------------- GL_IBM_texture_mirrored_repeat -------------------- */ + +#ifndef GL_IBM_texture_mirrored_repeat +#define GL_IBM_texture_mirrored_repeat 1 + +#define GL_MIRRORED_REPEAT_IBM 0x8370 + +#define GLEW_IBM_texture_mirrored_repeat GLEW_GET_VAR(__GLEW_IBM_texture_mirrored_repeat) + +#endif /* GL_IBM_texture_mirrored_repeat */ + +/* ----------------------- GL_IBM_vertex_array_lists ----------------------- */ + +#ifndef GL_IBM_vertex_array_lists +#define GL_IBM_vertex_array_lists 1 + +#define GL_VERTEX_ARRAY_LIST_IBM 103070 +#define GL_NORMAL_ARRAY_LIST_IBM 103071 +#define GL_COLOR_ARRAY_LIST_IBM 103072 +#define GL_INDEX_ARRAY_LIST_IBM 103073 +#define GL_TEXTURE_COORD_ARRAY_LIST_IBM 103074 +#define GL_EDGE_FLAG_ARRAY_LIST_IBM 103075 +#define GL_FOG_COORDINATE_ARRAY_LIST_IBM 103076 +#define GL_SECONDARY_COLOR_ARRAY_LIST_IBM 103077 +#define GL_VERTEX_ARRAY_LIST_STRIDE_IBM 103080 +#define GL_NORMAL_ARRAY_LIST_STRIDE_IBM 103081 +#define GL_COLOR_ARRAY_LIST_STRIDE_IBM 103082 +#define GL_INDEX_ARRAY_LIST_STRIDE_IBM 103083 +#define GL_TEXTURE_COORD_ARRAY_LIST_STRIDE_IBM 103084 +#define GL_EDGE_FLAG_ARRAY_LIST_STRIDE_IBM 103085 +#define GL_FOG_COORDINATE_ARRAY_LIST_STRIDE_IBM 103086 +#define GL_SECONDARY_COLOR_ARRAY_LIST_STRIDE_IBM 103087 + +typedef void (GLAPIENTRY * PFNGLCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride); +typedef void (GLAPIENTRY * PFNGLEDGEFLAGPOINTERLISTIBMPROC) (GLint stride, const GLboolean ** pointer, GLint ptrstride); +typedef void (GLAPIENTRY * PFNGLFOGCOORDPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride); +typedef void (GLAPIENTRY * PFNGLINDEXPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride); +typedef void (GLAPIENTRY * PFNGLNORMALPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride); +typedef void (GLAPIENTRY * PFNGLTEXCOORDPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride); +typedef void (GLAPIENTRY * PFNGLVERTEXPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride); + +#define glColorPointerListIBM GLEW_GET_FUN(__glewColorPointerListIBM) +#define glEdgeFlagPointerListIBM GLEW_GET_FUN(__glewEdgeFlagPointerListIBM) +#define glFogCoordPointerListIBM GLEW_GET_FUN(__glewFogCoordPointerListIBM) +#define glIndexPointerListIBM GLEW_GET_FUN(__glewIndexPointerListIBM) +#define glNormalPointerListIBM GLEW_GET_FUN(__glewNormalPointerListIBM) +#define glSecondaryColorPointerListIBM GLEW_GET_FUN(__glewSecondaryColorPointerListIBM) +#define glTexCoordPointerListIBM GLEW_GET_FUN(__glewTexCoordPointerListIBM) +#define glVertexPointerListIBM GLEW_GET_FUN(__glewVertexPointerListIBM) + +#define GLEW_IBM_vertex_array_lists GLEW_GET_VAR(__GLEW_IBM_vertex_array_lists) + +#endif /* GL_IBM_vertex_array_lists */ + +/* -------------------------- GL_INGR_color_clamp -------------------------- */ + +#ifndef GL_INGR_color_clamp +#define GL_INGR_color_clamp 1 + +#define GL_RED_MIN_CLAMP_INGR 0x8560 +#define GL_GREEN_MIN_CLAMP_INGR 0x8561 +#define GL_BLUE_MIN_CLAMP_INGR 0x8562 +#define GL_ALPHA_MIN_CLAMP_INGR 0x8563 +#define GL_RED_MAX_CLAMP_INGR 0x8564 +#define GL_GREEN_MAX_CLAMP_INGR 0x8565 +#define GL_BLUE_MAX_CLAMP_INGR 0x8566 +#define GL_ALPHA_MAX_CLAMP_INGR 0x8567 + +#define GLEW_INGR_color_clamp GLEW_GET_VAR(__GLEW_INGR_color_clamp) + +#endif /* GL_INGR_color_clamp */ + +/* ------------------------- GL_INGR_interlace_read ------------------------ */ + +#ifndef GL_INGR_interlace_read +#define GL_INGR_interlace_read 1 + +#define GL_INTERLACE_READ_INGR 0x8568 + +#define GLEW_INGR_interlace_read GLEW_GET_VAR(__GLEW_INGR_interlace_read) + +#endif /* GL_INGR_interlace_read */ + +/* ------------------------ GL_INTEL_parallel_arrays ----------------------- */ + +#ifndef GL_INTEL_parallel_arrays +#define GL_INTEL_parallel_arrays 1 + +#define GL_PARALLEL_ARRAYS_INTEL 0x83F4 +#define GL_VERTEX_ARRAY_PARALLEL_POINTERS_INTEL 0x83F5 +#define GL_NORMAL_ARRAY_PARALLEL_POINTERS_INTEL 0x83F6 +#define GL_COLOR_ARRAY_PARALLEL_POINTERS_INTEL 0x83F7 +#define GL_TEXTURE_COORD_ARRAY_PARALLEL_POINTERS_INTEL 0x83F8 + +typedef void (GLAPIENTRY * PFNGLCOLORPOINTERVINTELPROC) (GLint size, GLenum type, const void** pointer); +typedef void (GLAPIENTRY * PFNGLNORMALPOINTERVINTELPROC) (GLenum type, const void** pointer); +typedef void (GLAPIENTRY * PFNGLTEXCOORDPOINTERVINTELPROC) (GLint size, GLenum type, const void** pointer); +typedef void (GLAPIENTRY * PFNGLVERTEXPOINTERVINTELPROC) (GLint size, GLenum type, const void** pointer); + +#define glColorPointervINTEL GLEW_GET_FUN(__glewColorPointervINTEL) +#define glNormalPointervINTEL GLEW_GET_FUN(__glewNormalPointervINTEL) +#define glTexCoordPointervINTEL GLEW_GET_FUN(__glewTexCoordPointervINTEL) +#define glVertexPointervINTEL GLEW_GET_FUN(__glewVertexPointervINTEL) + +#define GLEW_INTEL_parallel_arrays GLEW_GET_VAR(__GLEW_INTEL_parallel_arrays) + +#endif /* GL_INTEL_parallel_arrays */ + +/* ------------------------ GL_INTEL_texture_scissor ----------------------- */ + +#ifndef GL_INTEL_texture_scissor +#define GL_INTEL_texture_scissor 1 + +typedef void (GLAPIENTRY * PFNGLTEXSCISSORFUNCINTELPROC) (GLenum target, GLenum lfunc, GLenum hfunc); +typedef void (GLAPIENTRY * PFNGLTEXSCISSORINTELPROC) (GLenum target, GLclampf tlow, GLclampf thigh); + +#define glTexScissorFuncINTEL GLEW_GET_FUN(__glewTexScissorFuncINTEL) +#define glTexScissorINTEL GLEW_GET_FUN(__glewTexScissorINTEL) + +#define GLEW_INTEL_texture_scissor GLEW_GET_VAR(__GLEW_INTEL_texture_scissor) + +#endif /* GL_INTEL_texture_scissor */ + +/* -------------------------- GL_KTX_buffer_region ------------------------- */ + +#ifndef GL_KTX_buffer_region +#define GL_KTX_buffer_region 1 + +#define GL_KTX_FRONT_REGION 0x0 +#define GL_KTX_BACK_REGION 0x1 +#define GL_KTX_Z_REGION 0x2 +#define GL_KTX_STENCIL_REGION 0x3 + +typedef GLuint (GLAPIENTRY * PFNGLBUFFERREGIONENABLEDEXTPROC) (void); +typedef void (GLAPIENTRY * PFNGLDELETEBUFFERREGIONEXTPROC) (GLenum region); +typedef void (GLAPIENTRY * PFNGLDRAWBUFFERREGIONEXTPROC) (GLuint region, GLint x, GLint y, GLsizei width, GLsizei height, GLint xDest, GLint yDest); +typedef GLuint (GLAPIENTRY * PFNGLNEWBUFFERREGIONEXTPROC) (GLenum region); +typedef void (GLAPIENTRY * PFNGLREADBUFFERREGIONEXTPROC) (GLuint region, GLint x, GLint y, GLsizei width, GLsizei height); + +#define glBufferRegionEnabledEXT GLEW_GET_FUN(__glewBufferRegionEnabledEXT) +#define glDeleteBufferRegionEXT GLEW_GET_FUN(__glewDeleteBufferRegionEXT) +#define glDrawBufferRegionEXT GLEW_GET_FUN(__glewDrawBufferRegionEXT) +#define glNewBufferRegionEXT GLEW_GET_FUN(__glewNewBufferRegionEXT) +#define glReadBufferRegionEXT GLEW_GET_FUN(__glewReadBufferRegionEXT) + +#define GLEW_KTX_buffer_region GLEW_GET_VAR(__GLEW_KTX_buffer_region) + +#endif /* GL_KTX_buffer_region */ + +/* ------------------------- GL_MESAX_texture_stack ------------------------ */ + +#ifndef GL_MESAX_texture_stack +#define GL_MESAX_texture_stack 1 + +#define GL_TEXTURE_1D_STACK_MESAX 0x8759 +#define GL_TEXTURE_2D_STACK_MESAX 0x875A +#define GL_PROXY_TEXTURE_1D_STACK_MESAX 0x875B +#define GL_PROXY_TEXTURE_2D_STACK_MESAX 0x875C +#define GL_TEXTURE_1D_STACK_BINDING_MESAX 0x875D +#define GL_TEXTURE_2D_STACK_BINDING_MESAX 0x875E + +#define GLEW_MESAX_texture_stack GLEW_GET_VAR(__GLEW_MESAX_texture_stack) + +#endif /* GL_MESAX_texture_stack */ + +/* -------------------------- GL_MESA_pack_invert -------------------------- */ + +#ifndef GL_MESA_pack_invert +#define GL_MESA_pack_invert 1 + +#define GL_PACK_INVERT_MESA 0x8758 + +#define GLEW_MESA_pack_invert GLEW_GET_VAR(__GLEW_MESA_pack_invert) + +#endif /* GL_MESA_pack_invert */ + +/* ------------------------- GL_MESA_resize_buffers ------------------------ */ + +#ifndef GL_MESA_resize_buffers +#define GL_MESA_resize_buffers 1 + +typedef void (GLAPIENTRY * PFNGLRESIZEBUFFERSMESAPROC) (void); + +#define glResizeBuffersMESA GLEW_GET_FUN(__glewResizeBuffersMESA) + +#define GLEW_MESA_resize_buffers GLEW_GET_VAR(__GLEW_MESA_resize_buffers) + +#endif /* GL_MESA_resize_buffers */ + +/* --------------------------- GL_MESA_window_pos -------------------------- */ + +#ifndef GL_MESA_window_pos +#define GL_MESA_window_pos 1 + +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DMESAPROC) (GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DVMESAPROC) (const GLdouble* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FMESAPROC) (GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FVMESAPROC) (const GLfloat* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IMESAPROC) (GLint x, GLint y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IVMESAPROC) (const GLint* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SMESAPROC) (GLshort x, GLshort y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SVMESAPROC) (const GLshort* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DMESAPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DVMESAPROC) (const GLdouble* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FMESAPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FVMESAPROC) (const GLfloat* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IMESAPROC) (GLint x, GLint y, GLint z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IVMESAPROC) (const GLint* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SMESAPROC) (GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SVMESAPROC) (const GLshort* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS4DMESAPROC) (GLdouble x, GLdouble y, GLdouble z, GLdouble); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS4DVMESAPROC) (const GLdouble* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS4FMESAPROC) (GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS4FVMESAPROC) (const GLfloat* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS4IMESAPROC) (GLint x, GLint y, GLint z, GLint w); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS4IVMESAPROC) (const GLint* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS4SMESAPROC) (GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS4SVMESAPROC) (const GLshort* p); + +#define glWindowPos2dMESA GLEW_GET_FUN(__glewWindowPos2dMESA) +#define glWindowPos2dvMESA GLEW_GET_FUN(__glewWindowPos2dvMESA) +#define glWindowPos2fMESA GLEW_GET_FUN(__glewWindowPos2fMESA) +#define glWindowPos2fvMESA GLEW_GET_FUN(__glewWindowPos2fvMESA) +#define glWindowPos2iMESA GLEW_GET_FUN(__glewWindowPos2iMESA) +#define glWindowPos2ivMESA GLEW_GET_FUN(__glewWindowPos2ivMESA) +#define glWindowPos2sMESA GLEW_GET_FUN(__glewWindowPos2sMESA) +#define glWindowPos2svMESA GLEW_GET_FUN(__glewWindowPos2svMESA) +#define glWindowPos3dMESA GLEW_GET_FUN(__glewWindowPos3dMESA) +#define glWindowPos3dvMESA GLEW_GET_FUN(__glewWindowPos3dvMESA) +#define glWindowPos3fMESA GLEW_GET_FUN(__glewWindowPos3fMESA) +#define glWindowPos3fvMESA GLEW_GET_FUN(__glewWindowPos3fvMESA) +#define glWindowPos3iMESA GLEW_GET_FUN(__glewWindowPos3iMESA) +#define glWindowPos3ivMESA GLEW_GET_FUN(__glewWindowPos3ivMESA) +#define glWindowPos3sMESA GLEW_GET_FUN(__glewWindowPos3sMESA) +#define glWindowPos3svMESA GLEW_GET_FUN(__glewWindowPos3svMESA) +#define glWindowPos4dMESA GLEW_GET_FUN(__glewWindowPos4dMESA) +#define glWindowPos4dvMESA GLEW_GET_FUN(__glewWindowPos4dvMESA) +#define glWindowPos4fMESA GLEW_GET_FUN(__glewWindowPos4fMESA) +#define glWindowPos4fvMESA GLEW_GET_FUN(__glewWindowPos4fvMESA) +#define glWindowPos4iMESA GLEW_GET_FUN(__glewWindowPos4iMESA) +#define glWindowPos4ivMESA GLEW_GET_FUN(__glewWindowPos4ivMESA) +#define glWindowPos4sMESA GLEW_GET_FUN(__glewWindowPos4sMESA) +#define glWindowPos4svMESA GLEW_GET_FUN(__glewWindowPos4svMESA) + +#define GLEW_MESA_window_pos GLEW_GET_VAR(__GLEW_MESA_window_pos) + +#endif /* GL_MESA_window_pos */ + +/* ------------------------- GL_MESA_ycbcr_texture ------------------------- */ + +#ifndef GL_MESA_ycbcr_texture +#define GL_MESA_ycbcr_texture 1 + +#define GL_UNSIGNED_SHORT_8_8_MESA 0x85BA +#define GL_UNSIGNED_SHORT_8_8_REV_MESA 0x85BB +#define GL_YCBCR_MESA 0x8757 + +#define GLEW_MESA_ycbcr_texture GLEW_GET_VAR(__GLEW_MESA_ycbcr_texture) + +#endif /* GL_MESA_ycbcr_texture */ + +/* --------------------------- GL_NV_blend_square -------------------------- */ + +#ifndef GL_NV_blend_square +#define GL_NV_blend_square 1 + +#define GLEW_NV_blend_square GLEW_GET_VAR(__GLEW_NV_blend_square) + +#endif /* GL_NV_blend_square */ + +/* ----------------------- GL_NV_copy_depth_to_color ----------------------- */ + +#ifndef GL_NV_copy_depth_to_color +#define GL_NV_copy_depth_to_color 1 + +#define GL_DEPTH_STENCIL_TO_RGBA_NV 0x886E +#define GL_DEPTH_STENCIL_TO_BGRA_NV 0x886F + +#define GLEW_NV_copy_depth_to_color GLEW_GET_VAR(__GLEW_NV_copy_depth_to_color) + +#endif /* GL_NV_copy_depth_to_color */ + +/* ------------------------ GL_NV_depth_buffer_float ----------------------- */ + +#ifndef GL_NV_depth_buffer_float +#define GL_NV_depth_buffer_float 1 + +#define GL_DEPTH_COMPONENT32F_NV 0x8DAB +#define GL_DEPTH32F_STENCIL8_NV 0x8DAC +#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV_NV 0x8DAD +#define GL_DEPTH_BUFFER_FLOAT_MODE_NV 0x8DAF + +typedef void (GLAPIENTRY * PFNGLCLEARDEPTHDNVPROC) (GLdouble depth); +typedef void (GLAPIENTRY * PFNGLDEPTHBOUNDSDNVPROC) (GLdouble zmin, GLdouble zmax); +typedef void (GLAPIENTRY * PFNGLDEPTHRANGEDNVPROC) (GLdouble zNear, GLdouble zFar); + +#define glClearDepthdNV GLEW_GET_FUN(__glewClearDepthdNV) +#define glDepthBoundsdNV GLEW_GET_FUN(__glewDepthBoundsdNV) +#define glDepthRangedNV GLEW_GET_FUN(__glewDepthRangedNV) + +#define GLEW_NV_depth_buffer_float GLEW_GET_VAR(__GLEW_NV_depth_buffer_float) + +#endif /* GL_NV_depth_buffer_float */ + +/* --------------------------- GL_NV_depth_clamp --------------------------- */ + +#ifndef GL_NV_depth_clamp +#define GL_NV_depth_clamp 1 + +#define GL_DEPTH_CLAMP_NV 0x864F + +#define GLEW_NV_depth_clamp GLEW_GET_VAR(__GLEW_NV_depth_clamp) + +#endif /* GL_NV_depth_clamp */ + +/* ---------------------- GL_NV_depth_range_unclamped ---------------------- */ + +#ifndef GL_NV_depth_range_unclamped +#define GL_NV_depth_range_unclamped 1 + +#define GL_SAMPLE_COUNT_BITS_NV 0x8864 +#define GL_CURRENT_SAMPLE_COUNT_QUERY_NV 0x8865 +#define GL_QUERY_RESULT_NV 0x8866 +#define GL_QUERY_RESULT_AVAILABLE_NV 0x8867 +#define GL_SAMPLE_COUNT_NV 0x8914 + +#define GLEW_NV_depth_range_unclamped GLEW_GET_VAR(__GLEW_NV_depth_range_unclamped) + +#endif /* GL_NV_depth_range_unclamped */ + +/* ---------------------------- GL_NV_evaluators --------------------------- */ + +#ifndef GL_NV_evaluators +#define GL_NV_evaluators 1 + +#define GL_EVAL_2D_NV 0x86C0 +#define GL_EVAL_TRIANGULAR_2D_NV 0x86C1 +#define GL_MAP_TESSELLATION_NV 0x86C2 +#define GL_MAP_ATTRIB_U_ORDER_NV 0x86C3 +#define GL_MAP_ATTRIB_V_ORDER_NV 0x86C4 +#define GL_EVAL_FRACTIONAL_TESSELLATION_NV 0x86C5 +#define GL_EVAL_VERTEX_ATTRIB0_NV 0x86C6 +#define GL_EVAL_VERTEX_ATTRIB1_NV 0x86C7 +#define GL_EVAL_VERTEX_ATTRIB2_NV 0x86C8 +#define GL_EVAL_VERTEX_ATTRIB3_NV 0x86C9 +#define GL_EVAL_VERTEX_ATTRIB4_NV 0x86CA +#define GL_EVAL_VERTEX_ATTRIB5_NV 0x86CB +#define GL_EVAL_VERTEX_ATTRIB6_NV 0x86CC +#define GL_EVAL_VERTEX_ATTRIB7_NV 0x86CD +#define GL_EVAL_VERTEX_ATTRIB8_NV 0x86CE +#define GL_EVAL_VERTEX_ATTRIB9_NV 0x86CF +#define GL_EVAL_VERTEX_ATTRIB10_NV 0x86D0 +#define GL_EVAL_VERTEX_ATTRIB11_NV 0x86D1 +#define GL_EVAL_VERTEX_ATTRIB12_NV 0x86D2 +#define GL_EVAL_VERTEX_ATTRIB13_NV 0x86D3 +#define GL_EVAL_VERTEX_ATTRIB14_NV 0x86D4 +#define GL_EVAL_VERTEX_ATTRIB15_NV 0x86D5 +#define GL_MAX_MAP_TESSELLATION_NV 0x86D6 +#define GL_MAX_RATIONAL_EVAL_ORDER_NV 0x86D7 + +typedef void (GLAPIENTRY * PFNGLEVALMAPSNVPROC) (GLenum target, GLenum mode); +typedef void (GLAPIENTRY * PFNGLGETMAPATTRIBPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETMAPATTRIBPARAMETERIVNVPROC) (GLenum target, GLuint index, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, void* points); +typedef void (GLAPIENTRY * PFNGLGETMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const void* points); +typedef void (GLAPIENTRY * PFNGLMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, const GLint* params); + +#define glEvalMapsNV GLEW_GET_FUN(__glewEvalMapsNV) +#define glGetMapAttribParameterfvNV GLEW_GET_FUN(__glewGetMapAttribParameterfvNV) +#define glGetMapAttribParameterivNV GLEW_GET_FUN(__glewGetMapAttribParameterivNV) +#define glGetMapControlPointsNV GLEW_GET_FUN(__glewGetMapControlPointsNV) +#define glGetMapParameterfvNV GLEW_GET_FUN(__glewGetMapParameterfvNV) +#define glGetMapParameterivNV GLEW_GET_FUN(__glewGetMapParameterivNV) +#define glMapControlPointsNV GLEW_GET_FUN(__glewMapControlPointsNV) +#define glMapParameterfvNV GLEW_GET_FUN(__glewMapParameterfvNV) +#define glMapParameterivNV GLEW_GET_FUN(__glewMapParameterivNV) + +#define GLEW_NV_evaluators GLEW_GET_VAR(__GLEW_NV_evaluators) + +#endif /* GL_NV_evaluators */ + +/* ------------------------------ GL_NV_fence ------------------------------ */ + +#ifndef GL_NV_fence +#define GL_NV_fence 1 + +#define GL_ALL_COMPLETED_NV 0x84F2 +#define GL_FENCE_STATUS_NV 0x84F3 +#define GL_FENCE_CONDITION_NV 0x84F4 + +typedef void (GLAPIENTRY * PFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint* fences); +typedef void (GLAPIENTRY * PFNGLFINISHFENCENVPROC) (GLuint fence); +typedef void (GLAPIENTRY * PFNGLGENFENCESNVPROC) (GLsizei n, GLuint* fences); +typedef void (GLAPIENTRY * PFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISFENCENVPROC) (GLuint fence); +typedef void (GLAPIENTRY * PFNGLSETFENCENVPROC) (GLuint fence, GLenum condition); +typedef GLboolean (GLAPIENTRY * PFNGLTESTFENCENVPROC) (GLuint fence); + +#define glDeleteFencesNV GLEW_GET_FUN(__glewDeleteFencesNV) +#define glFinishFenceNV GLEW_GET_FUN(__glewFinishFenceNV) +#define glGenFencesNV GLEW_GET_FUN(__glewGenFencesNV) +#define glGetFenceivNV GLEW_GET_FUN(__glewGetFenceivNV) +#define glIsFenceNV GLEW_GET_FUN(__glewIsFenceNV) +#define glSetFenceNV GLEW_GET_FUN(__glewSetFenceNV) +#define glTestFenceNV GLEW_GET_FUN(__glewTestFenceNV) + +#define GLEW_NV_fence GLEW_GET_VAR(__GLEW_NV_fence) + +#endif /* GL_NV_fence */ + +/* --------------------------- GL_NV_float_buffer -------------------------- */ + +#ifndef GL_NV_float_buffer +#define GL_NV_float_buffer 1 + +#define GL_FLOAT_R_NV 0x8880 +#define GL_FLOAT_RG_NV 0x8881 +#define GL_FLOAT_RGB_NV 0x8882 +#define GL_FLOAT_RGBA_NV 0x8883 +#define GL_FLOAT_R16_NV 0x8884 +#define GL_FLOAT_R32_NV 0x8885 +#define GL_FLOAT_RG16_NV 0x8886 +#define GL_FLOAT_RG32_NV 0x8887 +#define GL_FLOAT_RGB16_NV 0x8888 +#define GL_FLOAT_RGB32_NV 0x8889 +#define GL_FLOAT_RGBA16_NV 0x888A +#define GL_FLOAT_RGBA32_NV 0x888B +#define GL_TEXTURE_FLOAT_COMPONENTS_NV 0x888C +#define GL_FLOAT_CLEAR_COLOR_VALUE_NV 0x888D +#define GL_FLOAT_RGBA_MODE_NV 0x888E + +#define GLEW_NV_float_buffer GLEW_GET_VAR(__GLEW_NV_float_buffer) + +#endif /* GL_NV_float_buffer */ + +/* --------------------------- GL_NV_fog_distance -------------------------- */ + +#ifndef GL_NV_fog_distance +#define GL_NV_fog_distance 1 + +#define GL_FOG_DISTANCE_MODE_NV 0x855A +#define GL_EYE_RADIAL_NV 0x855B +#define GL_EYE_PLANE_ABSOLUTE_NV 0x855C + +#define GLEW_NV_fog_distance GLEW_GET_VAR(__GLEW_NV_fog_distance) + +#endif /* GL_NV_fog_distance */ + +/* ------------------------- GL_NV_fragment_program ------------------------ */ + +#ifndef GL_NV_fragment_program +#define GL_NV_fragment_program 1 + +#define GL_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV 0x8868 +#define GL_FRAGMENT_PROGRAM_NV 0x8870 +#define GL_MAX_TEXTURE_COORDS_NV 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS_NV 0x8872 +#define GL_FRAGMENT_PROGRAM_BINDING_NV 0x8873 +#define GL_PROGRAM_ERROR_STRING_NV 0x8874 + +typedef void (GLAPIENTRY * PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLdouble *params); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLfloat *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4DNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, const GLdouble v[]); +typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4FNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, const GLfloat v[]); + +#define glGetProgramNamedParameterdvNV GLEW_GET_FUN(__glewGetProgramNamedParameterdvNV) +#define glGetProgramNamedParameterfvNV GLEW_GET_FUN(__glewGetProgramNamedParameterfvNV) +#define glProgramNamedParameter4dNV GLEW_GET_FUN(__glewProgramNamedParameter4dNV) +#define glProgramNamedParameter4dvNV GLEW_GET_FUN(__glewProgramNamedParameter4dvNV) +#define glProgramNamedParameter4fNV GLEW_GET_FUN(__glewProgramNamedParameter4fNV) +#define glProgramNamedParameter4fvNV GLEW_GET_FUN(__glewProgramNamedParameter4fvNV) + +#define GLEW_NV_fragment_program GLEW_GET_VAR(__GLEW_NV_fragment_program) + +#endif /* GL_NV_fragment_program */ + +/* ------------------------ GL_NV_fragment_program2 ------------------------ */ + +#ifndef GL_NV_fragment_program2 +#define GL_NV_fragment_program2 1 + +#define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4 +#define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5 +#define GL_MAX_PROGRAM_IF_DEPTH_NV 0x88F6 +#define GL_MAX_PROGRAM_LOOP_DEPTH_NV 0x88F7 +#define GL_MAX_PROGRAM_LOOP_COUNT_NV 0x88F8 + +#define GLEW_NV_fragment_program2 GLEW_GET_VAR(__GLEW_NV_fragment_program2) + +#endif /* GL_NV_fragment_program2 */ + +/* ------------------------ GL_NV_fragment_program4 ------------------------ */ + +#ifndef GL_NV_fragment_program4 +#define GL_NV_fragment_program4 1 + +#define GLEW_NV_fragment_program4 GLEW_GET_VAR(__GLEW_NV_fragment_program4) + +#endif /* GL_NV_fragment_program4 */ + +/* --------------------- GL_NV_fragment_program_option --------------------- */ + +#ifndef GL_NV_fragment_program_option +#define GL_NV_fragment_program_option 1 + +#define GLEW_NV_fragment_program_option GLEW_GET_VAR(__GLEW_NV_fragment_program_option) + +#endif /* GL_NV_fragment_program_option */ + +/* ----------------- GL_NV_framebuffer_multisample_coverage ---------------- */ + +#ifndef GL_NV_framebuffer_multisample_coverage +#define GL_NV_framebuffer_multisample_coverage 1 + +#define GL_RENDERBUFFER_COVERAGE_SAMPLES_NV 0x8CAB +#define GL_RENDERBUFFER_COLOR_SAMPLES_NV 0x8E10 +#define GL_MAX_MULTISAMPLE_COVERAGE_MODES_NV 0x8E11 +#define GL_MULTISAMPLE_COVERAGE_MODES_NV 0x8E12 + +typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); + +#define glRenderbufferStorageMultisampleCoverageNV GLEW_GET_FUN(__glewRenderbufferStorageMultisampleCoverageNV) + +#define GLEW_NV_framebuffer_multisample_coverage GLEW_GET_VAR(__GLEW_NV_framebuffer_multisample_coverage) + +#endif /* GL_NV_framebuffer_multisample_coverage */ + +/* ------------------------ GL_NV_geometry_program4 ------------------------ */ + +#ifndef GL_NV_geometry_program4 +#define GL_NV_geometry_program4 1 + +#define GL_GEOMETRY_PROGRAM_NV 0x8C26 +#define GL_MAX_PROGRAM_OUTPUT_VERTICES_NV 0x8C27 +#define GL_MAX_PROGRAM_TOTAL_OUTPUT_COMPONENTS_NV 0x8C28 + +typedef void (GLAPIENTRY * PFNGLPROGRAMVERTEXLIMITNVPROC) (GLenum target, GLint limit); + +#define glProgramVertexLimitNV GLEW_GET_FUN(__glewProgramVertexLimitNV) + +#define GLEW_NV_geometry_program4 GLEW_GET_VAR(__GLEW_NV_geometry_program4) + +#endif /* GL_NV_geometry_program4 */ + +/* ------------------------- GL_NV_geometry_shader4 ------------------------ */ + +#ifndef GL_NV_geometry_shader4 +#define GL_NV_geometry_shader4 1 + +#define GLEW_NV_geometry_shader4 GLEW_GET_VAR(__GLEW_NV_geometry_shader4) + +#endif /* GL_NV_geometry_shader4 */ + +/* --------------------------- GL_NV_gpu_program4 -------------------------- */ + +#ifndef GL_NV_gpu_program4 +#define GL_NV_gpu_program4 1 + +#define GL_MIN_PROGRAM_TEXEL_OFFSET_NV 0x8904 +#define GL_MAX_PROGRAM_TEXEL_OFFSET_NV 0x8905 +#define GL_PROGRAM_ATTRIB_COMPONENTS_NV 0x8906 +#define GL_PROGRAM_RESULT_COMPONENTS_NV 0x8907 +#define GL_MAX_PROGRAM_ATTRIB_COMPONENTS_NV 0x8908 +#define GL_MAX_PROGRAM_RESULT_COMPONENTS_NV 0x8909 +#define GL_MAX_PROGRAM_GENERIC_ATTRIBS_NV 0x8DA5 +#define GL_MAX_PROGRAM_GENERIC_RESULTS_NV 0x8DA6 + +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params); + +#define glProgramEnvParameterI4iNV GLEW_GET_FUN(__glewProgramEnvParameterI4iNV) +#define glProgramEnvParameterI4ivNV GLEW_GET_FUN(__glewProgramEnvParameterI4ivNV) +#define glProgramEnvParameterI4uiNV GLEW_GET_FUN(__glewProgramEnvParameterI4uiNV) +#define glProgramEnvParameterI4uivNV GLEW_GET_FUN(__glewProgramEnvParameterI4uivNV) +#define glProgramEnvParametersI4ivNV GLEW_GET_FUN(__glewProgramEnvParametersI4ivNV) +#define glProgramEnvParametersI4uivNV GLEW_GET_FUN(__glewProgramEnvParametersI4uivNV) +#define glProgramLocalParameterI4iNV GLEW_GET_FUN(__glewProgramLocalParameterI4iNV) +#define glProgramLocalParameterI4ivNV GLEW_GET_FUN(__glewProgramLocalParameterI4ivNV) +#define glProgramLocalParameterI4uiNV GLEW_GET_FUN(__glewProgramLocalParameterI4uiNV) +#define glProgramLocalParameterI4uivNV GLEW_GET_FUN(__glewProgramLocalParameterI4uivNV) +#define glProgramLocalParametersI4ivNV GLEW_GET_FUN(__glewProgramLocalParametersI4ivNV) +#define glProgramLocalParametersI4uivNV GLEW_GET_FUN(__glewProgramLocalParametersI4uivNV) + +#define GLEW_NV_gpu_program4 GLEW_GET_VAR(__GLEW_NV_gpu_program4) + +#endif /* GL_NV_gpu_program4 */ + +/* ---------------------------- GL_NV_half_float --------------------------- */ + +#ifndef GL_NV_half_float +#define GL_NV_half_float 1 + +#define GL_HALF_FLOAT_NV 0x140B + +typedef unsigned short GLhalf; + +typedef void (GLAPIENTRY * PFNGLCOLOR3HNVPROC) (GLhalf red, GLhalf green, GLhalf blue); +typedef void (GLAPIENTRY * PFNGLCOLOR3HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLCOLOR4HNVPROC) (GLhalf red, GLhalf green, GLhalf blue, GLhalf alpha); +typedef void (GLAPIENTRY * PFNGLCOLOR4HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLFOGCOORDHNVPROC) (GLhalf fog); +typedef void (GLAPIENTRY * PFNGLFOGCOORDHVNVPROC) (const GLhalf* fog); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1HNVPROC) (GLenum target, GLhalf s); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1HVNVPROC) (GLenum target, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2HNVPROC) (GLenum target, GLhalf s, GLhalf t); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2HVNVPROC) (GLenum target, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3HNVPROC) (GLenum target, GLhalf s, GLhalf t, GLhalf r); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3HVNVPROC) (GLenum target, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4HNVPROC) (GLenum target, GLhalf s, GLhalf t, GLhalf r, GLhalf q); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4HVNVPROC) (GLenum target, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLNORMAL3HNVPROC) (GLhalf nx, GLhalf ny, GLhalf nz); +typedef void (GLAPIENTRY * PFNGLNORMAL3HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3HNVPROC) (GLhalf red, GLhalf green, GLhalf blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD1HNVPROC) (GLhalf s); +typedef void (GLAPIENTRY * PFNGLTEXCOORD1HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2HNVPROC) (GLhalf s, GLhalf t); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD3HNVPROC) (GLhalf s, GLhalf t, GLhalf r); +typedef void (GLAPIENTRY * PFNGLTEXCOORD3HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD4HNVPROC) (GLhalf s, GLhalf t, GLhalf r, GLhalf q); +typedef void (GLAPIENTRY * PFNGLTEXCOORD4HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEX2HNVPROC) (GLhalf x, GLhalf y); +typedef void (GLAPIENTRY * PFNGLVERTEX2HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEX3HNVPROC) (GLhalf x, GLhalf y, GLhalf z); +typedef void (GLAPIENTRY * PFNGLVERTEX3HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEX4HNVPROC) (GLhalf x, GLhalf y, GLhalf z, GLhalf w); +typedef void (GLAPIENTRY * PFNGLVERTEX4HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1HNVPROC) (GLuint index, GLhalf x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1HVNVPROC) (GLuint index, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2HNVPROC) (GLuint index, GLhalf x, GLhalf y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2HVNVPROC) (GLuint index, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3HNVPROC) (GLuint index, GLhalf x, GLhalf y, GLhalf z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3HVNVPROC) (GLuint index, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4HNVPROC) (GLuint index, GLhalf x, GLhalf y, GLhalf z, GLhalf w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4HVNVPROC) (GLuint index, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTHNVPROC) (GLhalf weight); +typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTHVNVPROC) (const GLhalf* weight); + +#define glColor3hNV GLEW_GET_FUN(__glewColor3hNV) +#define glColor3hvNV GLEW_GET_FUN(__glewColor3hvNV) +#define glColor4hNV GLEW_GET_FUN(__glewColor4hNV) +#define glColor4hvNV GLEW_GET_FUN(__glewColor4hvNV) +#define glFogCoordhNV GLEW_GET_FUN(__glewFogCoordhNV) +#define glFogCoordhvNV GLEW_GET_FUN(__glewFogCoordhvNV) +#define glMultiTexCoord1hNV GLEW_GET_FUN(__glewMultiTexCoord1hNV) +#define glMultiTexCoord1hvNV GLEW_GET_FUN(__glewMultiTexCoord1hvNV) +#define glMultiTexCoord2hNV GLEW_GET_FUN(__glewMultiTexCoord2hNV) +#define glMultiTexCoord2hvNV GLEW_GET_FUN(__glewMultiTexCoord2hvNV) +#define glMultiTexCoord3hNV GLEW_GET_FUN(__glewMultiTexCoord3hNV) +#define glMultiTexCoord3hvNV GLEW_GET_FUN(__glewMultiTexCoord3hvNV) +#define glMultiTexCoord4hNV GLEW_GET_FUN(__glewMultiTexCoord4hNV) +#define glMultiTexCoord4hvNV GLEW_GET_FUN(__glewMultiTexCoord4hvNV) +#define glNormal3hNV GLEW_GET_FUN(__glewNormal3hNV) +#define glNormal3hvNV GLEW_GET_FUN(__glewNormal3hvNV) +#define glSecondaryColor3hNV GLEW_GET_FUN(__glewSecondaryColor3hNV) +#define glSecondaryColor3hvNV GLEW_GET_FUN(__glewSecondaryColor3hvNV) +#define glTexCoord1hNV GLEW_GET_FUN(__glewTexCoord1hNV) +#define glTexCoord1hvNV GLEW_GET_FUN(__glewTexCoord1hvNV) +#define glTexCoord2hNV GLEW_GET_FUN(__glewTexCoord2hNV) +#define glTexCoord2hvNV GLEW_GET_FUN(__glewTexCoord2hvNV) +#define glTexCoord3hNV GLEW_GET_FUN(__glewTexCoord3hNV) +#define glTexCoord3hvNV GLEW_GET_FUN(__glewTexCoord3hvNV) +#define glTexCoord4hNV GLEW_GET_FUN(__glewTexCoord4hNV) +#define glTexCoord4hvNV GLEW_GET_FUN(__glewTexCoord4hvNV) +#define glVertex2hNV GLEW_GET_FUN(__glewVertex2hNV) +#define glVertex2hvNV GLEW_GET_FUN(__glewVertex2hvNV) +#define glVertex3hNV GLEW_GET_FUN(__glewVertex3hNV) +#define glVertex3hvNV GLEW_GET_FUN(__glewVertex3hvNV) +#define glVertex4hNV GLEW_GET_FUN(__glewVertex4hNV) +#define glVertex4hvNV GLEW_GET_FUN(__glewVertex4hvNV) +#define glVertexAttrib1hNV GLEW_GET_FUN(__glewVertexAttrib1hNV) +#define glVertexAttrib1hvNV GLEW_GET_FUN(__glewVertexAttrib1hvNV) +#define glVertexAttrib2hNV GLEW_GET_FUN(__glewVertexAttrib2hNV) +#define glVertexAttrib2hvNV GLEW_GET_FUN(__glewVertexAttrib2hvNV) +#define glVertexAttrib3hNV GLEW_GET_FUN(__glewVertexAttrib3hNV) +#define glVertexAttrib3hvNV GLEW_GET_FUN(__glewVertexAttrib3hvNV) +#define glVertexAttrib4hNV GLEW_GET_FUN(__glewVertexAttrib4hNV) +#define glVertexAttrib4hvNV GLEW_GET_FUN(__glewVertexAttrib4hvNV) +#define glVertexAttribs1hvNV GLEW_GET_FUN(__glewVertexAttribs1hvNV) +#define glVertexAttribs2hvNV GLEW_GET_FUN(__glewVertexAttribs2hvNV) +#define glVertexAttribs3hvNV GLEW_GET_FUN(__glewVertexAttribs3hvNV) +#define glVertexAttribs4hvNV GLEW_GET_FUN(__glewVertexAttribs4hvNV) +#define glVertexWeighthNV GLEW_GET_FUN(__glewVertexWeighthNV) +#define glVertexWeighthvNV GLEW_GET_FUN(__glewVertexWeighthvNV) + +#define GLEW_NV_half_float GLEW_GET_VAR(__GLEW_NV_half_float) + +#endif /* GL_NV_half_float */ + +/* ------------------------ GL_NV_light_max_exponent ----------------------- */ + +#ifndef GL_NV_light_max_exponent +#define GL_NV_light_max_exponent 1 + +#define GL_MAX_SHININESS_NV 0x8504 +#define GL_MAX_SPOT_EXPONENT_NV 0x8505 + +#define GLEW_NV_light_max_exponent GLEW_GET_VAR(__GLEW_NV_light_max_exponent) + +#endif /* GL_NV_light_max_exponent */ + +/* --------------------- GL_NV_multisample_filter_hint --------------------- */ + +#ifndef GL_NV_multisample_filter_hint +#define GL_NV_multisample_filter_hint 1 + +#define GL_MULTISAMPLE_FILTER_HINT_NV 0x8534 + +#define GLEW_NV_multisample_filter_hint GLEW_GET_VAR(__GLEW_NV_multisample_filter_hint) + +#endif /* GL_NV_multisample_filter_hint */ + +/* ------------------------- GL_NV_occlusion_query ------------------------- */ + +#ifndef GL_NV_occlusion_query +#define GL_NV_occlusion_query 1 + +#define GL_PIXEL_COUNTER_BITS_NV 0x8864 +#define GL_CURRENT_OCCLUSION_QUERY_ID_NV 0x8865 +#define GL_PIXEL_COUNT_NV 0x8866 +#define GL_PIXEL_COUNT_AVAILABLE_NV 0x8867 + +typedef void (GLAPIENTRY * PFNGLBEGINOCCLUSIONQUERYNVPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLDELETEOCCLUSIONQUERIESNVPROC) (GLsizei n, const GLuint* ids); +typedef void (GLAPIENTRY * PFNGLENDOCCLUSIONQUERYNVPROC) (void); +typedef void (GLAPIENTRY * PFNGLGENOCCLUSIONQUERIESNVPROC) (GLsizei n, GLuint* ids); +typedef void (GLAPIENTRY * PFNGLGETOCCLUSIONQUERYIVNVPROC) (GLuint id, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETOCCLUSIONQUERYUIVNVPROC) (GLuint id, GLenum pname, GLuint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISOCCLUSIONQUERYNVPROC) (GLuint id); + +#define glBeginOcclusionQueryNV GLEW_GET_FUN(__glewBeginOcclusionQueryNV) +#define glDeleteOcclusionQueriesNV GLEW_GET_FUN(__glewDeleteOcclusionQueriesNV) +#define glEndOcclusionQueryNV GLEW_GET_FUN(__glewEndOcclusionQueryNV) +#define glGenOcclusionQueriesNV GLEW_GET_FUN(__glewGenOcclusionQueriesNV) +#define glGetOcclusionQueryivNV GLEW_GET_FUN(__glewGetOcclusionQueryivNV) +#define glGetOcclusionQueryuivNV GLEW_GET_FUN(__glewGetOcclusionQueryuivNV) +#define glIsOcclusionQueryNV GLEW_GET_FUN(__glewIsOcclusionQueryNV) + +#define GLEW_NV_occlusion_query GLEW_GET_VAR(__GLEW_NV_occlusion_query) + +#endif /* GL_NV_occlusion_query */ + +/* ----------------------- GL_NV_packed_depth_stencil ---------------------- */ + +#ifndef GL_NV_packed_depth_stencil +#define GL_NV_packed_depth_stencil 1 + +#define GL_DEPTH_STENCIL_NV 0x84F9 +#define GL_UNSIGNED_INT_24_8_NV 0x84FA + +#define GLEW_NV_packed_depth_stencil GLEW_GET_VAR(__GLEW_NV_packed_depth_stencil) + +#endif /* GL_NV_packed_depth_stencil */ + +/* --------------------- GL_NV_parameter_buffer_object --------------------- */ + +#ifndef GL_NV_parameter_buffer_object +#define GL_NV_parameter_buffer_object 1 + +#define GL_MAX_PROGRAM_PARAMETER_BUFFER_BINDINGS_NV 0x8DA0 +#define GL_MAX_PROGRAM_PARAMETER_BUFFER_SIZE_NV 0x8DA1 +#define GL_VERTEX_PROGRAM_PARAMETER_BUFFER_NV 0x8DA2 +#define GL_GEOMETRY_PROGRAM_PARAMETER_BUFFER_NV 0x8DA3 +#define GL_FRAGMENT_PROGRAM_PARAMETER_BUFFER_NV 0x8DA4 + +typedef void (GLAPIENTRY * PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLuint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLfloat *params); + +#define glProgramBufferParametersIivNV GLEW_GET_FUN(__glewProgramBufferParametersIivNV) +#define glProgramBufferParametersIuivNV GLEW_GET_FUN(__glewProgramBufferParametersIuivNV) +#define glProgramBufferParametersfvNV GLEW_GET_FUN(__glewProgramBufferParametersfvNV) + +#define GLEW_NV_parameter_buffer_object GLEW_GET_VAR(__GLEW_NV_parameter_buffer_object) + +#endif /* GL_NV_parameter_buffer_object */ + +/* ------------------------- GL_NV_pixel_data_range ------------------------ */ + +#ifndef GL_NV_pixel_data_range +#define GL_NV_pixel_data_range 1 + +#define GL_WRITE_PIXEL_DATA_RANGE_NV 0x8878 +#define GL_READ_PIXEL_DATA_RANGE_NV 0x8879 +#define GL_WRITE_PIXEL_DATA_RANGE_LENGTH_NV 0x887A +#define GL_READ_PIXEL_DATA_RANGE_LENGTH_NV 0x887B +#define GL_WRITE_PIXEL_DATA_RANGE_POINTER_NV 0x887C +#define GL_READ_PIXEL_DATA_RANGE_POINTER_NV 0x887D + +typedef void (GLAPIENTRY * PFNGLFLUSHPIXELDATARANGENVPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLPIXELDATARANGENVPROC) (GLenum target, GLsizei length, void* pointer); + +#define glFlushPixelDataRangeNV GLEW_GET_FUN(__glewFlushPixelDataRangeNV) +#define glPixelDataRangeNV GLEW_GET_FUN(__glewPixelDataRangeNV) + +#define GLEW_NV_pixel_data_range GLEW_GET_VAR(__GLEW_NV_pixel_data_range) + +#endif /* GL_NV_pixel_data_range */ + +/* --------------------------- GL_NV_point_sprite -------------------------- */ + +#ifndef GL_NV_point_sprite +#define GL_NV_point_sprite 1 + +#define GL_POINT_SPRITE_NV 0x8861 +#define GL_COORD_REPLACE_NV 0x8862 +#define GL_POINT_SPRITE_R_MODE_NV 0x8863 + +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERINVPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERIVNVPROC) (GLenum pname, const GLint* params); + +#define glPointParameteriNV GLEW_GET_FUN(__glewPointParameteriNV) +#define glPointParameterivNV GLEW_GET_FUN(__glewPointParameterivNV) + +#define GLEW_NV_point_sprite GLEW_GET_VAR(__GLEW_NV_point_sprite) + +#endif /* GL_NV_point_sprite */ + +/* ------------------------ GL_NV_primitive_restart ------------------------ */ + +#ifndef GL_NV_primitive_restart +#define GL_NV_primitive_restart 1 + +#define GL_PRIMITIVE_RESTART_NV 0x8558 +#define GL_PRIMITIVE_RESTART_INDEX_NV 0x8559 + +typedef void (GLAPIENTRY * PFNGLPRIMITIVERESTARTINDEXNVPROC) (GLuint index); +typedef void (GLAPIENTRY * PFNGLPRIMITIVERESTARTNVPROC) (void); + +#define glPrimitiveRestartIndexNV GLEW_GET_FUN(__glewPrimitiveRestartIndexNV) +#define glPrimitiveRestartNV GLEW_GET_FUN(__glewPrimitiveRestartNV) + +#define GLEW_NV_primitive_restart GLEW_GET_VAR(__GLEW_NV_primitive_restart) + +#endif /* GL_NV_primitive_restart */ + +/* ------------------------ GL_NV_register_combiners ----------------------- */ + +#ifndef GL_NV_register_combiners +#define GL_NV_register_combiners 1 + +#define GL_REGISTER_COMBINERS_NV 0x8522 +#define GL_VARIABLE_A_NV 0x8523 +#define GL_VARIABLE_B_NV 0x8524 +#define GL_VARIABLE_C_NV 0x8525 +#define GL_VARIABLE_D_NV 0x8526 +#define GL_VARIABLE_E_NV 0x8527 +#define GL_VARIABLE_F_NV 0x8528 +#define GL_VARIABLE_G_NV 0x8529 +#define GL_CONSTANT_COLOR0_NV 0x852A +#define GL_CONSTANT_COLOR1_NV 0x852B +#define GL_PRIMARY_COLOR_NV 0x852C +#define GL_SECONDARY_COLOR_NV 0x852D +#define GL_SPARE0_NV 0x852E +#define GL_SPARE1_NV 0x852F +#define GL_DISCARD_NV 0x8530 +#define GL_E_TIMES_F_NV 0x8531 +#define GL_SPARE0_PLUS_SECONDARY_COLOR_NV 0x8532 +#define GL_UNSIGNED_IDENTITY_NV 0x8536 +#define GL_UNSIGNED_INVERT_NV 0x8537 +#define GL_EXPAND_NORMAL_NV 0x8538 +#define GL_EXPAND_NEGATE_NV 0x8539 +#define GL_HALF_BIAS_NORMAL_NV 0x853A +#define GL_HALF_BIAS_NEGATE_NV 0x853B +#define GL_SIGNED_IDENTITY_NV 0x853C +#define GL_SIGNED_NEGATE_NV 0x853D +#define GL_SCALE_BY_TWO_NV 0x853E +#define GL_SCALE_BY_FOUR_NV 0x853F +#define GL_SCALE_BY_ONE_HALF_NV 0x8540 +#define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV 0x8541 +#define GL_COMBINER_INPUT_NV 0x8542 +#define GL_COMBINER_MAPPING_NV 0x8543 +#define GL_COMBINER_COMPONENT_USAGE_NV 0x8544 +#define GL_COMBINER_AB_DOT_PRODUCT_NV 0x8545 +#define GL_COMBINER_CD_DOT_PRODUCT_NV 0x8546 +#define GL_COMBINER_MUX_SUM_NV 0x8547 +#define GL_COMBINER_SCALE_NV 0x8548 +#define GL_COMBINER_BIAS_NV 0x8549 +#define GL_COMBINER_AB_OUTPUT_NV 0x854A +#define GL_COMBINER_CD_OUTPUT_NV 0x854B +#define GL_COMBINER_SUM_OUTPUT_NV 0x854C +#define GL_MAX_GENERAL_COMBINERS_NV 0x854D +#define GL_NUM_GENERAL_COMBINERS_NV 0x854E +#define GL_COLOR_SUM_CLAMP_NV 0x854F +#define GL_COMBINER0_NV 0x8550 +#define GL_COMBINER1_NV 0x8551 +#define GL_COMBINER2_NV 0x8552 +#define GL_COMBINER3_NV 0x8553 +#define GL_COMBINER4_NV 0x8554 +#define GL_COMBINER5_NV 0x8555 +#define GL_COMBINER6_NV 0x8556 +#define GL_COMBINER7_NV 0x8557 + +typedef void (GLAPIENTRY * PFNGLCOMBINERINPUTNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +typedef void (GLAPIENTRY * PFNGLCOMBINEROUTPUTNVPROC) (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); +typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERFNVPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERFVNVPROC) (GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERINVPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERIVNVPROC) (GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLFINALCOMBINERINPUTNVPROC) (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +typedef void (GLAPIENTRY * PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC) (GLenum variable, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC) (GLenum variable, GLenum pname, GLint* params); + +#define glCombinerInputNV GLEW_GET_FUN(__glewCombinerInputNV) +#define glCombinerOutputNV GLEW_GET_FUN(__glewCombinerOutputNV) +#define glCombinerParameterfNV GLEW_GET_FUN(__glewCombinerParameterfNV) +#define glCombinerParameterfvNV GLEW_GET_FUN(__glewCombinerParameterfvNV) +#define glCombinerParameteriNV GLEW_GET_FUN(__glewCombinerParameteriNV) +#define glCombinerParameterivNV GLEW_GET_FUN(__glewCombinerParameterivNV) +#define glFinalCombinerInputNV GLEW_GET_FUN(__glewFinalCombinerInputNV) +#define glGetCombinerInputParameterfvNV GLEW_GET_FUN(__glewGetCombinerInputParameterfvNV) +#define glGetCombinerInputParameterivNV GLEW_GET_FUN(__glewGetCombinerInputParameterivNV) +#define glGetCombinerOutputParameterfvNV GLEW_GET_FUN(__glewGetCombinerOutputParameterfvNV) +#define glGetCombinerOutputParameterivNV GLEW_GET_FUN(__glewGetCombinerOutputParameterivNV) +#define glGetFinalCombinerInputParameterfvNV GLEW_GET_FUN(__glewGetFinalCombinerInputParameterfvNV) +#define glGetFinalCombinerInputParameterivNV GLEW_GET_FUN(__glewGetFinalCombinerInputParameterivNV) + +#define GLEW_NV_register_combiners GLEW_GET_VAR(__GLEW_NV_register_combiners) + +#endif /* GL_NV_register_combiners */ + +/* ----------------------- GL_NV_register_combiners2 ----------------------- */ + +#ifndef GL_NV_register_combiners2 +#define GL_NV_register_combiners2 1 + +#define GL_PER_STAGE_CONSTANTS_NV 0x8535 + +typedef void (GLAPIENTRY * PFNGLCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, GLfloat* params); + +#define glCombinerStageParameterfvNV GLEW_GET_FUN(__glewCombinerStageParameterfvNV) +#define glGetCombinerStageParameterfvNV GLEW_GET_FUN(__glewGetCombinerStageParameterfvNV) + +#define GLEW_NV_register_combiners2 GLEW_GET_VAR(__GLEW_NV_register_combiners2) + +#endif /* GL_NV_register_combiners2 */ + +/* -------------------------- GL_NV_texgen_emboss -------------------------- */ + +#ifndef GL_NV_texgen_emboss +#define GL_NV_texgen_emboss 1 + +#define GL_EMBOSS_LIGHT_NV 0x855D +#define GL_EMBOSS_CONSTANT_NV 0x855E +#define GL_EMBOSS_MAP_NV 0x855F + +#define GLEW_NV_texgen_emboss GLEW_GET_VAR(__GLEW_NV_texgen_emboss) + +#endif /* GL_NV_texgen_emboss */ + +/* ------------------------ GL_NV_texgen_reflection ------------------------ */ + +#ifndef GL_NV_texgen_reflection +#define GL_NV_texgen_reflection 1 + +#define GL_NORMAL_MAP_NV 0x8511 +#define GL_REFLECTION_MAP_NV 0x8512 + +#define GLEW_NV_texgen_reflection GLEW_GET_VAR(__GLEW_NV_texgen_reflection) + +#endif /* GL_NV_texgen_reflection */ + +/* --------------------- GL_NV_texture_compression_vtc --------------------- */ + +#ifndef GL_NV_texture_compression_vtc +#define GL_NV_texture_compression_vtc 1 + +#define GLEW_NV_texture_compression_vtc GLEW_GET_VAR(__GLEW_NV_texture_compression_vtc) + +#endif /* GL_NV_texture_compression_vtc */ + +/* ----------------------- GL_NV_texture_env_combine4 ---------------------- */ + +#ifndef GL_NV_texture_env_combine4 +#define GL_NV_texture_env_combine4 1 + +#define GL_COMBINE4_NV 0x8503 +#define GL_SOURCE3_RGB_NV 0x8583 +#define GL_SOURCE3_ALPHA_NV 0x858B +#define GL_OPERAND3_RGB_NV 0x8593 +#define GL_OPERAND3_ALPHA_NV 0x859B + +#define GLEW_NV_texture_env_combine4 GLEW_GET_VAR(__GLEW_NV_texture_env_combine4) + +#endif /* GL_NV_texture_env_combine4 */ + +/* ---------------------- GL_NV_texture_expand_normal ---------------------- */ + +#ifndef GL_NV_texture_expand_normal +#define GL_NV_texture_expand_normal 1 + +#define GL_TEXTURE_UNSIGNED_REMAP_MODE_NV 0x888F + +#define GLEW_NV_texture_expand_normal GLEW_GET_VAR(__GLEW_NV_texture_expand_normal) + +#endif /* GL_NV_texture_expand_normal */ + +/* ------------------------ GL_NV_texture_rectangle ------------------------ */ + +#ifndef GL_NV_texture_rectangle +#define GL_NV_texture_rectangle 1 + +#define GL_TEXTURE_RECTANGLE_NV 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE_NV 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE_NV 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE_NV 0x84F8 + +#define GLEW_NV_texture_rectangle GLEW_GET_VAR(__GLEW_NV_texture_rectangle) + +#endif /* GL_NV_texture_rectangle */ + +/* -------------------------- GL_NV_texture_shader ------------------------- */ + +#ifndef GL_NV_texture_shader +#define GL_NV_texture_shader 1 + +#define GL_OFFSET_TEXTURE_RECTANGLE_NV 0x864C +#define GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV 0x864D +#define GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV 0x864E +#define GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV 0x86D9 +#define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA +#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB +#define GL_DSDT_MAG_INTENSITY_NV 0x86DC +#define GL_SHADER_CONSISTENT_NV 0x86DD +#define GL_TEXTURE_SHADER_NV 0x86DE +#define GL_SHADER_OPERATION_NV 0x86DF +#define GL_CULL_MODES_NV 0x86E0 +#define GL_OFFSET_TEXTURE_MATRIX_NV 0x86E1 +#define GL_OFFSET_TEXTURE_SCALE_NV 0x86E2 +#define GL_OFFSET_TEXTURE_BIAS_NV 0x86E3 +#define GL_PREVIOUS_TEXTURE_INPUT_NV 0x86E4 +#define GL_CONST_EYE_NV 0x86E5 +#define GL_PASS_THROUGH_NV 0x86E6 +#define GL_CULL_FRAGMENT_NV 0x86E7 +#define GL_OFFSET_TEXTURE_2D_NV 0x86E8 +#define GL_DEPENDENT_AR_TEXTURE_2D_NV 0x86E9 +#define GL_DEPENDENT_GB_TEXTURE_2D_NV 0x86EA +#define GL_DOT_PRODUCT_NV 0x86EC +#define GL_DOT_PRODUCT_DEPTH_REPLACE_NV 0x86ED +#define GL_DOT_PRODUCT_TEXTURE_2D_NV 0x86EE +#define GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV 0x86F0 +#define GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV 0x86F1 +#define GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV 0x86F2 +#define GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV 0x86F3 +#define GL_HILO_NV 0x86F4 +#define GL_DSDT_NV 0x86F5 +#define GL_DSDT_MAG_NV 0x86F6 +#define GL_DSDT_MAG_VIB_NV 0x86F7 +#define GL_HILO16_NV 0x86F8 +#define GL_SIGNED_HILO_NV 0x86F9 +#define GL_SIGNED_HILO16_NV 0x86FA +#define GL_SIGNED_RGBA_NV 0x86FB +#define GL_SIGNED_RGBA8_NV 0x86FC +#define GL_SIGNED_RGB_NV 0x86FE +#define GL_SIGNED_RGB8_NV 0x86FF +#define GL_SIGNED_LUMINANCE_NV 0x8701 +#define GL_SIGNED_LUMINANCE8_NV 0x8702 +#define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703 +#define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704 +#define GL_SIGNED_ALPHA_NV 0x8705 +#define GL_SIGNED_ALPHA8_NV 0x8706 +#define GL_SIGNED_INTENSITY_NV 0x8707 +#define GL_SIGNED_INTENSITY8_NV 0x8708 +#define GL_DSDT8_NV 0x8709 +#define GL_DSDT8_MAG8_NV 0x870A +#define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B +#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C +#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D +#define GL_HI_SCALE_NV 0x870E +#define GL_LO_SCALE_NV 0x870F +#define GL_DS_SCALE_NV 0x8710 +#define GL_DT_SCALE_NV 0x8711 +#define GL_MAGNITUDE_SCALE_NV 0x8712 +#define GL_VIBRANCE_SCALE_NV 0x8713 +#define GL_HI_BIAS_NV 0x8714 +#define GL_LO_BIAS_NV 0x8715 +#define GL_DS_BIAS_NV 0x8716 +#define GL_DT_BIAS_NV 0x8717 +#define GL_MAGNITUDE_BIAS_NV 0x8718 +#define GL_VIBRANCE_BIAS_NV 0x8719 +#define GL_TEXTURE_BORDER_VALUES_NV 0x871A +#define GL_TEXTURE_HI_SIZE_NV 0x871B +#define GL_TEXTURE_LO_SIZE_NV 0x871C +#define GL_TEXTURE_DS_SIZE_NV 0x871D +#define GL_TEXTURE_DT_SIZE_NV 0x871E +#define GL_TEXTURE_MAG_SIZE_NV 0x871F + +#define GLEW_NV_texture_shader GLEW_GET_VAR(__GLEW_NV_texture_shader) + +#endif /* GL_NV_texture_shader */ + +/* ------------------------- GL_NV_texture_shader2 ------------------------- */ + +#ifndef GL_NV_texture_shader2 +#define GL_NV_texture_shader2 1 + +#define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA +#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB +#define GL_DSDT_MAG_INTENSITY_NV 0x86DC +#define GL_DOT_PRODUCT_TEXTURE_3D_NV 0x86EF +#define GL_HILO_NV 0x86F4 +#define GL_DSDT_NV 0x86F5 +#define GL_DSDT_MAG_NV 0x86F6 +#define GL_DSDT_MAG_VIB_NV 0x86F7 +#define GL_HILO16_NV 0x86F8 +#define GL_SIGNED_HILO_NV 0x86F9 +#define GL_SIGNED_HILO16_NV 0x86FA +#define GL_SIGNED_RGBA_NV 0x86FB +#define GL_SIGNED_RGBA8_NV 0x86FC +#define GL_SIGNED_RGB_NV 0x86FE +#define GL_SIGNED_RGB8_NV 0x86FF +#define GL_SIGNED_LUMINANCE_NV 0x8701 +#define GL_SIGNED_LUMINANCE8_NV 0x8702 +#define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703 +#define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704 +#define GL_SIGNED_ALPHA_NV 0x8705 +#define GL_SIGNED_ALPHA8_NV 0x8706 +#define GL_SIGNED_INTENSITY_NV 0x8707 +#define GL_SIGNED_INTENSITY8_NV 0x8708 +#define GL_DSDT8_NV 0x8709 +#define GL_DSDT8_MAG8_NV 0x870A +#define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B +#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C +#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D + +#define GLEW_NV_texture_shader2 GLEW_GET_VAR(__GLEW_NV_texture_shader2) + +#endif /* GL_NV_texture_shader2 */ + +/* ------------------------- GL_NV_texture_shader3 ------------------------- */ + +#ifndef GL_NV_texture_shader3 +#define GL_NV_texture_shader3 1 + +#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV 0x8850 +#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV 0x8851 +#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8852 +#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV 0x8853 +#define GL_OFFSET_HILO_TEXTURE_2D_NV 0x8854 +#define GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV 0x8855 +#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV 0x8856 +#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8857 +#define GL_DEPENDENT_HILO_TEXTURE_2D_NV 0x8858 +#define GL_DEPENDENT_RGB_TEXTURE_3D_NV 0x8859 +#define GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV 0x885A +#define GL_DOT_PRODUCT_PASS_THROUGH_NV 0x885B +#define GL_DOT_PRODUCT_TEXTURE_1D_NV 0x885C +#define GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV 0x885D +#define GL_HILO8_NV 0x885E +#define GL_SIGNED_HILO8_NV 0x885F +#define GL_FORCE_BLUE_TO_ONE_NV 0x8860 + +#define GLEW_NV_texture_shader3 GLEW_GET_VAR(__GLEW_NV_texture_shader3) + +#endif /* GL_NV_texture_shader3 */ + +/* ------------------------ GL_NV_transform_feedback ----------------------- */ + +#ifndef GL_NV_transform_feedback +#define GL_NV_transform_feedback 1 + +#define GL_BACK_PRIMARY_COLOR_NV 0x8C77 +#define GL_BACK_SECONDARY_COLOR_NV 0x8C78 +#define GL_TEXTURE_COORD_NV 0x8C79 +#define GL_CLIP_DISTANCE_NV 0x8C7A +#define GL_VERTEX_ID_NV 0x8C7B +#define GL_PRIMITIVE_ID_NV 0x8C7C +#define GL_GENERIC_ATTRIB_NV 0x8C7D +#define GL_TRANSFORM_FEEDBACK_ATTRIBS_NV 0x8C7E +#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_NV 0x8C7F +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_NV 0x8C80 +#define GL_ACTIVE_VARYINGS_NV 0x8C81 +#define GL_ACTIVE_VARYING_MAX_LENGTH_NV 0x8C82 +#define GL_TRANSFORM_FEEDBACK_VARYINGS_NV 0x8C83 +#define GL_TRANSFORM_FEEDBACK_BUFFER_START_NV 0x8C84 +#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_NV 0x8C85 +#define GL_TRANSFORM_FEEDBACK_RECORD_NV 0x8C86 +#define GL_PRIMITIVES_GENERATED_NV 0x8C87 +#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV 0x8C88 +#define GL_RASTERIZER_DISCARD_NV 0x8C89 +#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_NV 0x8C8A +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_NV 0x8C8B +#define GL_INTERLEAVED_ATTRIBS_NV 0x8C8C +#define GL_SEPARATE_ATTRIBS_NV 0x8C8D +#define GL_TRANSFORM_FEEDBACK_BUFFER_NV 0x8C8E +#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_NV 0x8C8F + +typedef void (GLAPIENTRY * PFNGLACTIVEVARYINGNVPROC) (GLuint program, const GLchar *name); +typedef void (GLAPIENTRY * PFNGLBEGINTRANSFORMFEEDBACKNVPROC) (GLenum primitiveMode); +typedef void (GLAPIENTRY * PFNGLBINDBUFFERBASENVPROC) (GLenum target, GLuint index, GLuint buffer); +typedef void (GLAPIENTRY * PFNGLBINDBUFFEROFFSETNVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLBINDBUFFERRANGENVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (GLAPIENTRY * PFNGLENDTRANSFORMFEEDBACKNVPROC) (void); +typedef void (GLAPIENTRY * PFNGLGETACTIVEVARYINGNVPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); +typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC) (GLuint program, GLuint index, GLint *location); +typedef GLint (GLAPIENTRY * PFNGLGETVARYINGLOCATIONNVPROC) (GLuint program, const GLchar *name); +typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC) (GLuint count, const GLint *attribs, GLenum bufferMode); +typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC) (GLuint program, GLsizei count, const GLint *locations, GLenum bufferMode); + +#define glActiveVaryingNV GLEW_GET_FUN(__glewActiveVaryingNV) +#define glBeginTransformFeedbackNV GLEW_GET_FUN(__glewBeginTransformFeedbackNV) +#define glBindBufferBaseNV GLEW_GET_FUN(__glewBindBufferBaseNV) +#define glBindBufferOffsetNV GLEW_GET_FUN(__glewBindBufferOffsetNV) +#define glBindBufferRangeNV GLEW_GET_FUN(__glewBindBufferRangeNV) +#define glEndTransformFeedbackNV GLEW_GET_FUN(__glewEndTransformFeedbackNV) +#define glGetActiveVaryingNV GLEW_GET_FUN(__glewGetActiveVaryingNV) +#define glGetTransformFeedbackVaryingNV GLEW_GET_FUN(__glewGetTransformFeedbackVaryingNV) +#define glGetVaryingLocationNV GLEW_GET_FUN(__glewGetVaryingLocationNV) +#define glTransformFeedbackAttribsNV GLEW_GET_FUN(__glewTransformFeedbackAttribsNV) +#define glTransformFeedbackVaryingsNV GLEW_GET_FUN(__glewTransformFeedbackVaryingsNV) + +#define GLEW_NV_transform_feedback GLEW_GET_VAR(__GLEW_NV_transform_feedback) + +#endif /* GL_NV_transform_feedback */ + +/* ------------------------ GL_NV_vertex_array_range ----------------------- */ + +#ifndef GL_NV_vertex_array_range +#define GL_NV_vertex_array_range 1 + +#define GL_VERTEX_ARRAY_RANGE_NV 0x851D +#define GL_VERTEX_ARRAY_RANGE_LENGTH_NV 0x851E +#define GL_VERTEX_ARRAY_RANGE_VALID_NV 0x851F +#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV 0x8520 +#define GL_VERTEX_ARRAY_RANGE_POINTER_NV 0x8521 + +typedef void (GLAPIENTRY * PFNGLFLUSHVERTEXARRAYRANGENVPROC) (void); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYRANGENVPROC) (GLsizei length, void* pointer); + +#define glFlushVertexArrayRangeNV GLEW_GET_FUN(__glewFlushVertexArrayRangeNV) +#define glVertexArrayRangeNV GLEW_GET_FUN(__glewVertexArrayRangeNV) + +#define GLEW_NV_vertex_array_range GLEW_GET_VAR(__GLEW_NV_vertex_array_range) + +#endif /* GL_NV_vertex_array_range */ + +/* ----------------------- GL_NV_vertex_array_range2 ----------------------- */ + +#ifndef GL_NV_vertex_array_range2 +#define GL_NV_vertex_array_range2 1 + +#define GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV 0x8533 + +#define GLEW_NV_vertex_array_range2 GLEW_GET_VAR(__GLEW_NV_vertex_array_range2) + +#endif /* GL_NV_vertex_array_range2 */ + +/* -------------------------- GL_NV_vertex_program ------------------------- */ + +#ifndef GL_NV_vertex_program +#define GL_NV_vertex_program 1 + +#define GL_VERTEX_PROGRAM_NV 0x8620 +#define GL_VERTEX_STATE_PROGRAM_NV 0x8621 +#define GL_ATTRIB_ARRAY_SIZE_NV 0x8623 +#define GL_ATTRIB_ARRAY_STRIDE_NV 0x8624 +#define GL_ATTRIB_ARRAY_TYPE_NV 0x8625 +#define GL_CURRENT_ATTRIB_NV 0x8626 +#define GL_PROGRAM_LENGTH_NV 0x8627 +#define GL_PROGRAM_STRING_NV 0x8628 +#define GL_MODELVIEW_PROJECTION_NV 0x8629 +#define GL_IDENTITY_NV 0x862A +#define GL_INVERSE_NV 0x862B +#define GL_TRANSPOSE_NV 0x862C +#define GL_INVERSE_TRANSPOSE_NV 0x862D +#define GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV 0x862E +#define GL_MAX_TRACK_MATRICES_NV 0x862F +#define GL_MATRIX0_NV 0x8630 +#define GL_MATRIX1_NV 0x8631 +#define GL_MATRIX2_NV 0x8632 +#define GL_MATRIX3_NV 0x8633 +#define GL_MATRIX4_NV 0x8634 +#define GL_MATRIX5_NV 0x8635 +#define GL_MATRIX6_NV 0x8636 +#define GL_MATRIX7_NV 0x8637 +#define GL_CURRENT_MATRIX_STACK_DEPTH_NV 0x8640 +#define GL_CURRENT_MATRIX_NV 0x8641 +#define GL_VERTEX_PROGRAM_POINT_SIZE_NV 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE_NV 0x8643 +#define GL_PROGRAM_PARAMETER_NV 0x8644 +#define GL_ATTRIB_ARRAY_POINTER_NV 0x8645 +#define GL_PROGRAM_TARGET_NV 0x8646 +#define GL_PROGRAM_RESIDENT_NV 0x8647 +#define GL_TRACK_MATRIX_NV 0x8648 +#define GL_TRACK_MATRIX_TRANSFORM_NV 0x8649 +#define GL_VERTEX_PROGRAM_BINDING_NV 0x864A +#define GL_PROGRAM_ERROR_POSITION_NV 0x864B +#define GL_VERTEX_ATTRIB_ARRAY0_NV 0x8650 +#define GL_VERTEX_ATTRIB_ARRAY1_NV 0x8651 +#define GL_VERTEX_ATTRIB_ARRAY2_NV 0x8652 +#define GL_VERTEX_ATTRIB_ARRAY3_NV 0x8653 +#define GL_VERTEX_ATTRIB_ARRAY4_NV 0x8654 +#define GL_VERTEX_ATTRIB_ARRAY5_NV 0x8655 +#define GL_VERTEX_ATTRIB_ARRAY6_NV 0x8656 +#define GL_VERTEX_ATTRIB_ARRAY7_NV 0x8657 +#define GL_VERTEX_ATTRIB_ARRAY8_NV 0x8658 +#define GL_VERTEX_ATTRIB_ARRAY9_NV 0x8659 +#define GL_VERTEX_ATTRIB_ARRAY10_NV 0x865A +#define GL_VERTEX_ATTRIB_ARRAY11_NV 0x865B +#define GL_VERTEX_ATTRIB_ARRAY12_NV 0x865C +#define GL_VERTEX_ATTRIB_ARRAY13_NV 0x865D +#define GL_VERTEX_ATTRIB_ARRAY14_NV 0x865E +#define GL_VERTEX_ATTRIB_ARRAY15_NV 0x865F +#define GL_MAP1_VERTEX_ATTRIB0_4_NV 0x8660 +#define GL_MAP1_VERTEX_ATTRIB1_4_NV 0x8661 +#define GL_MAP1_VERTEX_ATTRIB2_4_NV 0x8662 +#define GL_MAP1_VERTEX_ATTRIB3_4_NV 0x8663 +#define GL_MAP1_VERTEX_ATTRIB4_4_NV 0x8664 +#define GL_MAP1_VERTEX_ATTRIB5_4_NV 0x8665 +#define GL_MAP1_VERTEX_ATTRIB6_4_NV 0x8666 +#define GL_MAP1_VERTEX_ATTRIB7_4_NV 0x8667 +#define GL_MAP1_VERTEX_ATTRIB8_4_NV 0x8668 +#define GL_MAP1_VERTEX_ATTRIB9_4_NV 0x8669 +#define GL_MAP1_VERTEX_ATTRIB10_4_NV 0x866A +#define GL_MAP1_VERTEX_ATTRIB11_4_NV 0x866B +#define GL_MAP1_VERTEX_ATTRIB12_4_NV 0x866C +#define GL_MAP1_VERTEX_ATTRIB13_4_NV 0x866D +#define GL_MAP1_VERTEX_ATTRIB14_4_NV 0x866E +#define GL_MAP1_VERTEX_ATTRIB15_4_NV 0x866F +#define GL_MAP2_VERTEX_ATTRIB0_4_NV 0x8670 +#define GL_MAP2_VERTEX_ATTRIB1_4_NV 0x8671 +#define GL_MAP2_VERTEX_ATTRIB2_4_NV 0x8672 +#define GL_MAP2_VERTEX_ATTRIB3_4_NV 0x8673 +#define GL_MAP2_VERTEX_ATTRIB4_4_NV 0x8674 +#define GL_MAP2_VERTEX_ATTRIB5_4_NV 0x8675 +#define GL_MAP2_VERTEX_ATTRIB6_4_NV 0x8676 +#define GL_MAP2_VERTEX_ATTRIB7_4_NV 0x8677 +#define GL_MAP2_VERTEX_ATTRIB8_4_NV 0x8678 +#define GL_MAP2_VERTEX_ATTRIB9_4_NV 0x8679 +#define GL_MAP2_VERTEX_ATTRIB10_4_NV 0x867A +#define GL_MAP2_VERTEX_ATTRIB11_4_NV 0x867B +#define GL_MAP2_VERTEX_ATTRIB12_4_NV 0x867C +#define GL_MAP2_VERTEX_ATTRIB13_4_NV 0x867D +#define GL_MAP2_VERTEX_ATTRIB14_4_NV 0x867E +#define GL_MAP2_VERTEX_ATTRIB15_4_NV 0x867F + +typedef GLboolean (GLAPIENTRY * PFNGLAREPROGRAMSRESIDENTNVPROC) (GLsizei n, const GLuint* ids, GLboolean *residences); +typedef void (GLAPIENTRY * PFNGLBINDPROGRAMNVPROC) (GLenum target, GLuint id); +typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMSNVPROC) (GLsizei n, const GLuint* ids); +typedef void (GLAPIENTRY * PFNGLEXECUTEPROGRAMNVPROC) (GLenum target, GLuint id, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGENPROGRAMSNVPROC) (GLsizei n, GLuint* ids); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMPARAMETERDVNVPROC) (GLenum target, GLuint index, GLenum pname, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMSTRINGNVPROC) (GLuint id, GLenum pname, GLubyte* program); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMIVNVPROC) (GLuint id, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETTRACKMATRIXIVNVPROC) (GLenum target, GLuint address, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBPOINTERVNVPROC) (GLuint index, GLenum pname, GLvoid** pointer); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBDVNVPROC) (GLuint index, GLenum pname, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBFVNVPROC) (GLuint index, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIVNVPROC) (GLuint index, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMNVPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLLOADPROGRAMNVPROC) (GLenum target, GLuint id, GLsizei len, const GLubyte* program); +typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4DNVPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4DVNVPROC) (GLenum target, GLuint index, const GLdouble* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4FNVPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4FVNVPROC) (GLenum target, GLuint index, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERS4DVNVPROC) (GLenum target, GLuint index, GLuint num, const GLdouble* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERS4FVNVPROC) (GLenum target, GLuint index, GLuint num, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLREQUESTRESIDENTPROGRAMSNVPROC) (GLsizei n, GLuint* ids); +typedef void (GLAPIENTRY * PFNGLTRACKMATRIXNVPROC) (GLenum target, GLuint address, GLenum matrix, GLenum transform); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DNVPROC) (GLuint index, GLdouble x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DVNVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FNVPROC) (GLuint index, GLfloat x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FVNVPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SNVPROC) (GLuint index, GLshort x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SVNVPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DNVPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DVNVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FNVPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FVNVPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SNVPROC) (GLuint index, GLshort x, GLshort y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SVNVPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DVNVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FVNVPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SVNVPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DVNVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FVNVPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SVNVPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBNVPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBVNVPROC) (GLuint index, const GLubyte* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPOINTERNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void* pointer); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1SVNVPROC) (GLuint index, GLsizei n, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2SVNVPROC) (GLuint index, GLsizei n, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3SVNVPROC) (GLuint index, GLsizei n, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4SVNVPROC) (GLuint index, GLsizei n, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4UBVNVPROC) (GLuint index, GLsizei n, const GLubyte* v); + +#define glAreProgramsResidentNV GLEW_GET_FUN(__glewAreProgramsResidentNV) +#define glBindProgramNV GLEW_GET_FUN(__glewBindProgramNV) +#define glDeleteProgramsNV GLEW_GET_FUN(__glewDeleteProgramsNV) +#define glExecuteProgramNV GLEW_GET_FUN(__glewExecuteProgramNV) +#define glGenProgramsNV GLEW_GET_FUN(__glewGenProgramsNV) +#define glGetProgramParameterdvNV GLEW_GET_FUN(__glewGetProgramParameterdvNV) +#define glGetProgramParameterfvNV GLEW_GET_FUN(__glewGetProgramParameterfvNV) +#define glGetProgramStringNV GLEW_GET_FUN(__glewGetProgramStringNV) +#define glGetProgramivNV GLEW_GET_FUN(__glewGetProgramivNV) +#define glGetTrackMatrixivNV GLEW_GET_FUN(__glewGetTrackMatrixivNV) +#define glGetVertexAttribPointervNV GLEW_GET_FUN(__glewGetVertexAttribPointervNV) +#define glGetVertexAttribdvNV GLEW_GET_FUN(__glewGetVertexAttribdvNV) +#define glGetVertexAttribfvNV GLEW_GET_FUN(__glewGetVertexAttribfvNV) +#define glGetVertexAttribivNV GLEW_GET_FUN(__glewGetVertexAttribivNV) +#define glIsProgramNV GLEW_GET_FUN(__glewIsProgramNV) +#define glLoadProgramNV GLEW_GET_FUN(__glewLoadProgramNV) +#define glProgramParameter4dNV GLEW_GET_FUN(__glewProgramParameter4dNV) +#define glProgramParameter4dvNV GLEW_GET_FUN(__glewProgramParameter4dvNV) +#define glProgramParameter4fNV GLEW_GET_FUN(__glewProgramParameter4fNV) +#define glProgramParameter4fvNV GLEW_GET_FUN(__glewProgramParameter4fvNV) +#define glProgramParameters4dvNV GLEW_GET_FUN(__glewProgramParameters4dvNV) +#define glProgramParameters4fvNV GLEW_GET_FUN(__glewProgramParameters4fvNV) +#define glRequestResidentProgramsNV GLEW_GET_FUN(__glewRequestResidentProgramsNV) +#define glTrackMatrixNV GLEW_GET_FUN(__glewTrackMatrixNV) +#define glVertexAttrib1dNV GLEW_GET_FUN(__glewVertexAttrib1dNV) +#define glVertexAttrib1dvNV GLEW_GET_FUN(__glewVertexAttrib1dvNV) +#define glVertexAttrib1fNV GLEW_GET_FUN(__glewVertexAttrib1fNV) +#define glVertexAttrib1fvNV GLEW_GET_FUN(__glewVertexAttrib1fvNV) +#define glVertexAttrib1sNV GLEW_GET_FUN(__glewVertexAttrib1sNV) +#define glVertexAttrib1svNV GLEW_GET_FUN(__glewVertexAttrib1svNV) +#define glVertexAttrib2dNV GLEW_GET_FUN(__glewVertexAttrib2dNV) +#define glVertexAttrib2dvNV GLEW_GET_FUN(__glewVertexAttrib2dvNV) +#define glVertexAttrib2fNV GLEW_GET_FUN(__glewVertexAttrib2fNV) +#define glVertexAttrib2fvNV GLEW_GET_FUN(__glewVertexAttrib2fvNV) +#define glVertexAttrib2sNV GLEW_GET_FUN(__glewVertexAttrib2sNV) +#define glVertexAttrib2svNV GLEW_GET_FUN(__glewVertexAttrib2svNV) +#define glVertexAttrib3dNV GLEW_GET_FUN(__glewVertexAttrib3dNV) +#define glVertexAttrib3dvNV GLEW_GET_FUN(__glewVertexAttrib3dvNV) +#define glVertexAttrib3fNV GLEW_GET_FUN(__glewVertexAttrib3fNV) +#define glVertexAttrib3fvNV GLEW_GET_FUN(__glewVertexAttrib3fvNV) +#define glVertexAttrib3sNV GLEW_GET_FUN(__glewVertexAttrib3sNV) +#define glVertexAttrib3svNV GLEW_GET_FUN(__glewVertexAttrib3svNV) +#define glVertexAttrib4dNV GLEW_GET_FUN(__glewVertexAttrib4dNV) +#define glVertexAttrib4dvNV GLEW_GET_FUN(__glewVertexAttrib4dvNV) +#define glVertexAttrib4fNV GLEW_GET_FUN(__glewVertexAttrib4fNV) +#define glVertexAttrib4fvNV GLEW_GET_FUN(__glewVertexAttrib4fvNV) +#define glVertexAttrib4sNV GLEW_GET_FUN(__glewVertexAttrib4sNV) +#define glVertexAttrib4svNV GLEW_GET_FUN(__glewVertexAttrib4svNV) +#define glVertexAttrib4ubNV GLEW_GET_FUN(__glewVertexAttrib4ubNV) +#define glVertexAttrib4ubvNV GLEW_GET_FUN(__glewVertexAttrib4ubvNV) +#define glVertexAttribPointerNV GLEW_GET_FUN(__glewVertexAttribPointerNV) +#define glVertexAttribs1dvNV GLEW_GET_FUN(__glewVertexAttribs1dvNV) +#define glVertexAttribs1fvNV GLEW_GET_FUN(__glewVertexAttribs1fvNV) +#define glVertexAttribs1svNV GLEW_GET_FUN(__glewVertexAttribs1svNV) +#define glVertexAttribs2dvNV GLEW_GET_FUN(__glewVertexAttribs2dvNV) +#define glVertexAttribs2fvNV GLEW_GET_FUN(__glewVertexAttribs2fvNV) +#define glVertexAttribs2svNV GLEW_GET_FUN(__glewVertexAttribs2svNV) +#define glVertexAttribs3dvNV GLEW_GET_FUN(__glewVertexAttribs3dvNV) +#define glVertexAttribs3fvNV GLEW_GET_FUN(__glewVertexAttribs3fvNV) +#define glVertexAttribs3svNV GLEW_GET_FUN(__glewVertexAttribs3svNV) +#define glVertexAttribs4dvNV GLEW_GET_FUN(__glewVertexAttribs4dvNV) +#define glVertexAttribs4fvNV GLEW_GET_FUN(__glewVertexAttribs4fvNV) +#define glVertexAttribs4svNV GLEW_GET_FUN(__glewVertexAttribs4svNV) +#define glVertexAttribs4ubvNV GLEW_GET_FUN(__glewVertexAttribs4ubvNV) + +#define GLEW_NV_vertex_program GLEW_GET_VAR(__GLEW_NV_vertex_program) + +#endif /* GL_NV_vertex_program */ + +/* ------------------------ GL_NV_vertex_program1_1 ------------------------ */ + +#ifndef GL_NV_vertex_program1_1 +#define GL_NV_vertex_program1_1 1 + +#define GLEW_NV_vertex_program1_1 GLEW_GET_VAR(__GLEW_NV_vertex_program1_1) + +#endif /* GL_NV_vertex_program1_1 */ + +/* ------------------------- GL_NV_vertex_program2 ------------------------- */ + +#ifndef GL_NV_vertex_program2 +#define GL_NV_vertex_program2 1 + +#define GLEW_NV_vertex_program2 GLEW_GET_VAR(__GLEW_NV_vertex_program2) + +#endif /* GL_NV_vertex_program2 */ + +/* ---------------------- GL_NV_vertex_program2_option --------------------- */ + +#ifndef GL_NV_vertex_program2_option +#define GL_NV_vertex_program2_option 1 + +#define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4 +#define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5 + +#define GLEW_NV_vertex_program2_option GLEW_GET_VAR(__GLEW_NV_vertex_program2_option) + +#endif /* GL_NV_vertex_program2_option */ + +/* ------------------------- GL_NV_vertex_program3 ------------------------- */ + +#ifndef GL_NV_vertex_program3 +#define GL_NV_vertex_program3 1 + +#define MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C + +#define GLEW_NV_vertex_program3 GLEW_GET_VAR(__GLEW_NV_vertex_program3) + +#endif /* GL_NV_vertex_program3 */ + +/* ------------------------- GL_NV_vertex_program4 ------------------------- */ + +#ifndef GL_NV_vertex_program4 +#define GL_NV_vertex_program4 1 + +#define GLEW_NV_vertex_program4 GLEW_GET_VAR(__GLEW_NV_vertex_program4) + +#endif /* GL_NV_vertex_program4 */ + +/* ------------------------ GL_OES_byte_coordinates ------------------------ */ + +#ifndef GL_OES_byte_coordinates +#define GL_OES_byte_coordinates 1 + +#define GL_BYTE 0x1400 + +#define GLEW_OES_byte_coordinates GLEW_GET_VAR(__GLEW_OES_byte_coordinates) + +#endif /* GL_OES_byte_coordinates */ + +/* ------------------- GL_OES_compressed_paletted_texture ------------------ */ + +#ifndef GL_OES_compressed_paletted_texture +#define GL_OES_compressed_paletted_texture 1 + +#define GL_PALETTE4_RGB8_OES 0x8B90 +#define GL_PALETTE4_RGBA8_OES 0x8B91 +#define GL_PALETTE4_R5_G6_B5_OES 0x8B92 +#define GL_PALETTE4_RGBA4_OES 0x8B93 +#define GL_PALETTE4_RGB5_A1_OES 0x8B94 +#define GL_PALETTE8_RGB8_OES 0x8B95 +#define GL_PALETTE8_RGBA8_OES 0x8B96 +#define GL_PALETTE8_R5_G6_B5_OES 0x8B97 +#define GL_PALETTE8_RGBA4_OES 0x8B98 +#define GL_PALETTE8_RGB5_A1_OES 0x8B99 + +#define GLEW_OES_compressed_paletted_texture GLEW_GET_VAR(__GLEW_OES_compressed_paletted_texture) + +#endif /* GL_OES_compressed_paletted_texture */ + +/* --------------------------- GL_OES_read_format -------------------------- */ + +#ifndef GL_OES_read_format +#define GL_OES_read_format 1 + +#define GL_IMPLEMENTATION_COLOR_READ_TYPE_OES 0x8B9A +#define GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES 0x8B9B + +#define GLEW_OES_read_format GLEW_GET_VAR(__GLEW_OES_read_format) + +#endif /* GL_OES_read_format */ + +/* ------------------------ GL_OES_single_precision ------------------------ */ + +#ifndef GL_OES_single_precision +#define GL_OES_single_precision 1 + +typedef void (GLAPIENTRY * PFNGLCLEARDEPTHFOESPROC) (GLclampd depth); +typedef void (GLAPIENTRY * PFNGLCLIPPLANEFOESPROC) (GLenum plane, const GLfloat* equation); +typedef void (GLAPIENTRY * PFNGLDEPTHRANGEFOESPROC) (GLclampf n, GLclampf f); +typedef void (GLAPIENTRY * PFNGLFRUSTUMFOESPROC) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); +typedef void (GLAPIENTRY * PFNGLGETCLIPPLANEFOESPROC) (GLenum plane, GLfloat* equation); +typedef void (GLAPIENTRY * PFNGLORTHOFOESPROC) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); + +#define glClearDepthfOES GLEW_GET_FUN(__glewClearDepthfOES) +#define glClipPlanefOES GLEW_GET_FUN(__glewClipPlanefOES) +#define glDepthRangefOES GLEW_GET_FUN(__glewDepthRangefOES) +#define glFrustumfOES GLEW_GET_FUN(__glewFrustumfOES) +#define glGetClipPlanefOES GLEW_GET_FUN(__glewGetClipPlanefOES) +#define glOrthofOES GLEW_GET_FUN(__glewOrthofOES) + +#define GLEW_OES_single_precision GLEW_GET_VAR(__GLEW_OES_single_precision) + +#endif /* GL_OES_single_precision */ + +/* ---------------------------- GL_OML_interlace --------------------------- */ + +#ifndef GL_OML_interlace +#define GL_OML_interlace 1 + +#define GL_INTERLACE_OML 0x8980 +#define GL_INTERLACE_READ_OML 0x8981 + +#define GLEW_OML_interlace GLEW_GET_VAR(__GLEW_OML_interlace) + +#endif /* GL_OML_interlace */ + +/* ---------------------------- GL_OML_resample ---------------------------- */ + +#ifndef GL_OML_resample +#define GL_OML_resample 1 + +#define GL_PACK_RESAMPLE_OML 0x8984 +#define GL_UNPACK_RESAMPLE_OML 0x8985 +#define GL_RESAMPLE_REPLICATE_OML 0x8986 +#define GL_RESAMPLE_ZERO_FILL_OML 0x8987 +#define GL_RESAMPLE_AVERAGE_OML 0x8988 +#define GL_RESAMPLE_DECIMATE_OML 0x8989 + +#define GLEW_OML_resample GLEW_GET_VAR(__GLEW_OML_resample) + +#endif /* GL_OML_resample */ + +/* ---------------------------- GL_OML_subsample --------------------------- */ + +#ifndef GL_OML_subsample +#define GL_OML_subsample 1 + +#define GL_FORMAT_SUBSAMPLE_24_24_OML 0x8982 +#define GL_FORMAT_SUBSAMPLE_244_244_OML 0x8983 + +#define GLEW_OML_subsample GLEW_GET_VAR(__GLEW_OML_subsample) + +#endif /* GL_OML_subsample */ + +/* --------------------------- GL_PGI_misc_hints --------------------------- */ + +#ifndef GL_PGI_misc_hints +#define GL_PGI_misc_hints 1 + +#define GL_PREFER_DOUBLEBUFFER_HINT_PGI 107000 +#define GL_CONSERVE_MEMORY_HINT_PGI 107005 +#define GL_RECLAIM_MEMORY_HINT_PGI 107006 +#define GL_NATIVE_GRAPHICS_HANDLE_PGI 107010 +#define GL_NATIVE_GRAPHICS_BEGIN_HINT_PGI 107011 +#define GL_NATIVE_GRAPHICS_END_HINT_PGI 107012 +#define GL_ALWAYS_FAST_HINT_PGI 107020 +#define GL_ALWAYS_SOFT_HINT_PGI 107021 +#define GL_ALLOW_DRAW_OBJ_HINT_PGI 107022 +#define GL_ALLOW_DRAW_WIN_HINT_PGI 107023 +#define GL_ALLOW_DRAW_FRG_HINT_PGI 107024 +#define GL_ALLOW_DRAW_MEM_HINT_PGI 107025 +#define GL_STRICT_DEPTHFUNC_HINT_PGI 107030 +#define GL_STRICT_LIGHTING_HINT_PGI 107031 +#define GL_STRICT_SCISSOR_HINT_PGI 107032 +#define GL_FULL_STIPPLE_HINT_PGI 107033 +#define GL_CLIP_NEAR_HINT_PGI 107040 +#define GL_CLIP_FAR_HINT_PGI 107041 +#define GL_WIDE_LINE_HINT_PGI 107042 +#define GL_BACK_NORMALS_HINT_PGI 107043 + +#define GLEW_PGI_misc_hints GLEW_GET_VAR(__GLEW_PGI_misc_hints) + +#endif /* GL_PGI_misc_hints */ + +/* -------------------------- GL_PGI_vertex_hints -------------------------- */ + +#ifndef GL_PGI_vertex_hints +#define GL_PGI_vertex_hints 1 + +#define GL_VERTEX23_BIT_PGI 0x00000004 +#define GL_VERTEX4_BIT_PGI 0x00000008 +#define GL_COLOR3_BIT_PGI 0x00010000 +#define GL_COLOR4_BIT_PGI 0x00020000 +#define GL_EDGEFLAG_BIT_PGI 0x00040000 +#define GL_INDEX_BIT_PGI 0x00080000 +#define GL_MAT_AMBIENT_BIT_PGI 0x00100000 +#define GL_VERTEX_DATA_HINT_PGI 107050 +#define GL_VERTEX_CONSISTENT_HINT_PGI 107051 +#define GL_MATERIAL_SIDE_HINT_PGI 107052 +#define GL_MAX_VERTEX_HINT_PGI 107053 +#define GL_MAT_AMBIENT_AND_DIFFUSE_BIT_PGI 0x00200000 +#define GL_MAT_DIFFUSE_BIT_PGI 0x00400000 +#define GL_MAT_EMISSION_BIT_PGI 0x00800000 +#define GL_MAT_COLOR_INDEXES_BIT_PGI 0x01000000 +#define GL_MAT_SHININESS_BIT_PGI 0x02000000 +#define GL_MAT_SPECULAR_BIT_PGI 0x04000000 +#define GL_NORMAL_BIT_PGI 0x08000000 +#define GL_TEXCOORD1_BIT_PGI 0x10000000 +#define GL_TEXCOORD2_BIT_PGI 0x20000000 +#define GL_TEXCOORD3_BIT_PGI 0x40000000 +#define GL_TEXCOORD4_BIT_PGI 0x80000000 + +#define GLEW_PGI_vertex_hints GLEW_GET_VAR(__GLEW_PGI_vertex_hints) + +#endif /* GL_PGI_vertex_hints */ + +/* ----------------------- GL_REND_screen_coordinates ---------------------- */ + +#ifndef GL_REND_screen_coordinates +#define GL_REND_screen_coordinates 1 + +#define GL_SCREEN_COORDINATES_REND 0x8490 +#define GL_INVERTED_SCREEN_W_REND 0x8491 + +#define GLEW_REND_screen_coordinates GLEW_GET_VAR(__GLEW_REND_screen_coordinates) + +#endif /* GL_REND_screen_coordinates */ + +/* ------------------------------- GL_S3_s3tc ------------------------------ */ + +#ifndef GL_S3_s3tc +#define GL_S3_s3tc 1 + +#define GL_RGB_S3TC 0x83A0 +#define GL_RGB4_S3TC 0x83A1 +#define GL_RGBA_S3TC 0x83A2 +#define GL_RGBA4_S3TC 0x83A3 +#define GL_RGBA_DXT5_S3TC 0x83A4 +#define GL_RGBA4_DXT5_S3TC 0x83A5 + +#define GLEW_S3_s3tc GLEW_GET_VAR(__GLEW_S3_s3tc) + +#endif /* GL_S3_s3tc */ + +/* -------------------------- GL_SGIS_color_range -------------------------- */ + +#ifndef GL_SGIS_color_range +#define GL_SGIS_color_range 1 + +#define GL_EXTENDED_RANGE_SGIS 0x85A5 +#define GL_MIN_RED_SGIS 0x85A6 +#define GL_MAX_RED_SGIS 0x85A7 +#define GL_MIN_GREEN_SGIS 0x85A8 +#define GL_MAX_GREEN_SGIS 0x85A9 +#define GL_MIN_BLUE_SGIS 0x85AA +#define GL_MAX_BLUE_SGIS 0x85AB +#define GL_MIN_ALPHA_SGIS 0x85AC +#define GL_MAX_ALPHA_SGIS 0x85AD + +#define GLEW_SGIS_color_range GLEW_GET_VAR(__GLEW_SGIS_color_range) + +#endif /* GL_SGIS_color_range */ + +/* ------------------------- GL_SGIS_detail_texture ------------------------ */ + +#ifndef GL_SGIS_detail_texture +#define GL_SGIS_detail_texture 1 + +typedef void (GLAPIENTRY * PFNGLDETAILTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat* points); +typedef void (GLAPIENTRY * PFNGLGETDETAILTEXFUNCSGISPROC) (GLenum target, GLfloat* points); + +#define glDetailTexFuncSGIS GLEW_GET_FUN(__glewDetailTexFuncSGIS) +#define glGetDetailTexFuncSGIS GLEW_GET_FUN(__glewGetDetailTexFuncSGIS) + +#define GLEW_SGIS_detail_texture GLEW_GET_VAR(__GLEW_SGIS_detail_texture) + +#endif /* GL_SGIS_detail_texture */ + +/* -------------------------- GL_SGIS_fog_function ------------------------- */ + +#ifndef GL_SGIS_fog_function +#define GL_SGIS_fog_function 1 + +typedef void (GLAPIENTRY * PFNGLFOGFUNCSGISPROC) (GLsizei n, const GLfloat* points); +typedef void (GLAPIENTRY * PFNGLGETFOGFUNCSGISPROC) (GLfloat* points); + +#define glFogFuncSGIS GLEW_GET_FUN(__glewFogFuncSGIS) +#define glGetFogFuncSGIS GLEW_GET_FUN(__glewGetFogFuncSGIS) + +#define GLEW_SGIS_fog_function GLEW_GET_VAR(__GLEW_SGIS_fog_function) + +#endif /* GL_SGIS_fog_function */ + +/* ------------------------ GL_SGIS_generate_mipmap ------------------------ */ + +#ifndef GL_SGIS_generate_mipmap +#define GL_SGIS_generate_mipmap 1 + +#define GL_GENERATE_MIPMAP_SGIS 0x8191 +#define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192 + +#define GLEW_SGIS_generate_mipmap GLEW_GET_VAR(__GLEW_SGIS_generate_mipmap) + +#endif /* GL_SGIS_generate_mipmap */ + +/* -------------------------- GL_SGIS_multisample -------------------------- */ + +#ifndef GL_SGIS_multisample +#define GL_SGIS_multisample 1 + +#define GL_MULTISAMPLE_SGIS 0x809D +#define GL_SAMPLE_ALPHA_TO_MASK_SGIS 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_SGIS 0x809F +#define GL_SAMPLE_MASK_SGIS 0x80A0 +#define GL_1PASS_SGIS 0x80A1 +#define GL_2PASS_0_SGIS 0x80A2 +#define GL_2PASS_1_SGIS 0x80A3 +#define GL_4PASS_0_SGIS 0x80A4 +#define GL_4PASS_1_SGIS 0x80A5 +#define GL_4PASS_2_SGIS 0x80A6 +#define GL_4PASS_3_SGIS 0x80A7 +#define GL_SAMPLE_BUFFERS_SGIS 0x80A8 +#define GL_SAMPLES_SGIS 0x80A9 +#define GL_SAMPLE_MASK_VALUE_SGIS 0x80AA +#define GL_SAMPLE_MASK_INVERT_SGIS 0x80AB +#define GL_SAMPLE_PATTERN_SGIS 0x80AC +#define GL_MULTISAMPLE_BIT_EXT 0x20000000 + +typedef void (GLAPIENTRY * PFNGLSAMPLEMASKSGISPROC) (GLclampf value, GLboolean invert); +typedef void (GLAPIENTRY * PFNGLSAMPLEPATTERNSGISPROC) (GLenum pattern); + +#define glSampleMaskSGIS GLEW_GET_FUN(__glewSampleMaskSGIS) +#define glSamplePatternSGIS GLEW_GET_FUN(__glewSamplePatternSGIS) + +#define GLEW_SGIS_multisample GLEW_GET_VAR(__GLEW_SGIS_multisample) + +#endif /* GL_SGIS_multisample */ + +/* ------------------------- GL_SGIS_pixel_texture ------------------------- */ + +#ifndef GL_SGIS_pixel_texture +#define GL_SGIS_pixel_texture 1 + +#define GLEW_SGIS_pixel_texture GLEW_GET_VAR(__GLEW_SGIS_pixel_texture) + +#endif /* GL_SGIS_pixel_texture */ + +/* ------------------------ GL_SGIS_sharpen_texture ------------------------ */ + +#ifndef GL_SGIS_sharpen_texture +#define GL_SGIS_sharpen_texture 1 + +typedef void (GLAPIENTRY * PFNGLGETSHARPENTEXFUNCSGISPROC) (GLenum target, GLfloat* points); +typedef void (GLAPIENTRY * PFNGLSHARPENTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat* points); + +#define glGetSharpenTexFuncSGIS GLEW_GET_FUN(__glewGetSharpenTexFuncSGIS) +#define glSharpenTexFuncSGIS GLEW_GET_FUN(__glewSharpenTexFuncSGIS) + +#define GLEW_SGIS_sharpen_texture GLEW_GET_VAR(__GLEW_SGIS_sharpen_texture) + +#endif /* GL_SGIS_sharpen_texture */ + +/* --------------------------- GL_SGIS_texture4D --------------------------- */ + +#ifndef GL_SGIS_texture4D +#define GL_SGIS_texture4D 1 + +typedef void (GLAPIENTRY * PFNGLTEXIMAGE4DSGISPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei extent, GLint border, GLenum format, GLenum type, const void* pixels); +typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE4DSGISPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei extent, GLenum format, GLenum type, const void* pixels); + +#define glTexImage4DSGIS GLEW_GET_FUN(__glewTexImage4DSGIS) +#define glTexSubImage4DSGIS GLEW_GET_FUN(__glewTexSubImage4DSGIS) + +#define GLEW_SGIS_texture4D GLEW_GET_VAR(__GLEW_SGIS_texture4D) + +#endif /* GL_SGIS_texture4D */ + +/* ---------------------- GL_SGIS_texture_border_clamp --------------------- */ + +#ifndef GL_SGIS_texture_border_clamp +#define GL_SGIS_texture_border_clamp 1 + +#define GL_CLAMP_TO_BORDER_SGIS 0x812D + +#define GLEW_SGIS_texture_border_clamp GLEW_GET_VAR(__GLEW_SGIS_texture_border_clamp) + +#endif /* GL_SGIS_texture_border_clamp */ + +/* ----------------------- GL_SGIS_texture_edge_clamp ---------------------- */ + +#ifndef GL_SGIS_texture_edge_clamp +#define GL_SGIS_texture_edge_clamp 1 + +#define GL_CLAMP_TO_EDGE_SGIS 0x812F + +#define GLEW_SGIS_texture_edge_clamp GLEW_GET_VAR(__GLEW_SGIS_texture_edge_clamp) + +#endif /* GL_SGIS_texture_edge_clamp */ + +/* ------------------------ GL_SGIS_texture_filter4 ------------------------ */ + +#ifndef GL_SGIS_texture_filter4 +#define GL_SGIS_texture_filter4 1 + +typedef void (GLAPIENTRY * PFNGLGETTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLfloat* weights); +typedef void (GLAPIENTRY * PFNGLTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLsizei n, const GLfloat* weights); + +#define glGetTexFilterFuncSGIS GLEW_GET_FUN(__glewGetTexFilterFuncSGIS) +#define glTexFilterFuncSGIS GLEW_GET_FUN(__glewTexFilterFuncSGIS) + +#define GLEW_SGIS_texture_filter4 GLEW_GET_VAR(__GLEW_SGIS_texture_filter4) + +#endif /* GL_SGIS_texture_filter4 */ + +/* -------------------------- GL_SGIS_texture_lod -------------------------- */ + +#ifndef GL_SGIS_texture_lod +#define GL_SGIS_texture_lod 1 + +#define GL_TEXTURE_MIN_LOD_SGIS 0x813A +#define GL_TEXTURE_MAX_LOD_SGIS 0x813B +#define GL_TEXTURE_BASE_LEVEL_SGIS 0x813C +#define GL_TEXTURE_MAX_LEVEL_SGIS 0x813D + +#define GLEW_SGIS_texture_lod GLEW_GET_VAR(__GLEW_SGIS_texture_lod) + +#endif /* GL_SGIS_texture_lod */ + +/* ------------------------- GL_SGIS_texture_select ------------------------ */ + +#ifndef GL_SGIS_texture_select +#define GL_SGIS_texture_select 1 + +#define GLEW_SGIS_texture_select GLEW_GET_VAR(__GLEW_SGIS_texture_select) + +#endif /* GL_SGIS_texture_select */ + +/* ----------------------------- GL_SGIX_async ----------------------------- */ + +#ifndef GL_SGIX_async +#define GL_SGIX_async 1 + +#define GL_ASYNC_MARKER_SGIX 0x8329 + +typedef void (GLAPIENTRY * PFNGLASYNCMARKERSGIXPROC) (GLuint marker); +typedef void (GLAPIENTRY * PFNGLDELETEASYNCMARKERSSGIXPROC) (GLuint marker, GLsizei range); +typedef GLint (GLAPIENTRY * PFNGLFINISHASYNCSGIXPROC) (GLuint* markerp); +typedef GLuint (GLAPIENTRY * PFNGLGENASYNCMARKERSSGIXPROC) (GLsizei range); +typedef GLboolean (GLAPIENTRY * PFNGLISASYNCMARKERSGIXPROC) (GLuint marker); +typedef GLint (GLAPIENTRY * PFNGLPOLLASYNCSGIXPROC) (GLuint* markerp); + +#define glAsyncMarkerSGIX GLEW_GET_FUN(__glewAsyncMarkerSGIX) +#define glDeleteAsyncMarkersSGIX GLEW_GET_FUN(__glewDeleteAsyncMarkersSGIX) +#define glFinishAsyncSGIX GLEW_GET_FUN(__glewFinishAsyncSGIX) +#define glGenAsyncMarkersSGIX GLEW_GET_FUN(__glewGenAsyncMarkersSGIX) +#define glIsAsyncMarkerSGIX GLEW_GET_FUN(__glewIsAsyncMarkerSGIX) +#define glPollAsyncSGIX GLEW_GET_FUN(__glewPollAsyncSGIX) + +#define GLEW_SGIX_async GLEW_GET_VAR(__GLEW_SGIX_async) + +#endif /* GL_SGIX_async */ + +/* ------------------------ GL_SGIX_async_histogram ------------------------ */ + +#ifndef GL_SGIX_async_histogram +#define GL_SGIX_async_histogram 1 + +#define GL_ASYNC_HISTOGRAM_SGIX 0x832C +#define GL_MAX_ASYNC_HISTOGRAM_SGIX 0x832D + +#define GLEW_SGIX_async_histogram GLEW_GET_VAR(__GLEW_SGIX_async_histogram) + +#endif /* GL_SGIX_async_histogram */ + +/* -------------------------- GL_SGIX_async_pixel -------------------------- */ + +#ifndef GL_SGIX_async_pixel +#define GL_SGIX_async_pixel 1 + +#define GL_ASYNC_TEX_IMAGE_SGIX 0x835C +#define GL_ASYNC_DRAW_PIXELS_SGIX 0x835D +#define GL_ASYNC_READ_PIXELS_SGIX 0x835E +#define GL_MAX_ASYNC_TEX_IMAGE_SGIX 0x835F +#define GL_MAX_ASYNC_DRAW_PIXELS_SGIX 0x8360 +#define GL_MAX_ASYNC_READ_PIXELS_SGIX 0x8361 + +#define GLEW_SGIX_async_pixel GLEW_GET_VAR(__GLEW_SGIX_async_pixel) + +#endif /* GL_SGIX_async_pixel */ + +/* ----------------------- GL_SGIX_blend_alpha_minmax ---------------------- */ + +#ifndef GL_SGIX_blend_alpha_minmax +#define GL_SGIX_blend_alpha_minmax 1 + +#define GL_ALPHA_MIN_SGIX 0x8320 +#define GL_ALPHA_MAX_SGIX 0x8321 + +#define GLEW_SGIX_blend_alpha_minmax GLEW_GET_VAR(__GLEW_SGIX_blend_alpha_minmax) + +#endif /* GL_SGIX_blend_alpha_minmax */ + +/* ---------------------------- GL_SGIX_clipmap ---------------------------- */ + +#ifndef GL_SGIX_clipmap +#define GL_SGIX_clipmap 1 + +#define GLEW_SGIX_clipmap GLEW_GET_VAR(__GLEW_SGIX_clipmap) + +#endif /* GL_SGIX_clipmap */ + +/* ------------------------- GL_SGIX_depth_texture ------------------------- */ + +#ifndef GL_SGIX_depth_texture +#define GL_SGIX_depth_texture 1 + +#define GL_DEPTH_COMPONENT16_SGIX 0x81A5 +#define GL_DEPTH_COMPONENT24_SGIX 0x81A6 +#define GL_DEPTH_COMPONENT32_SGIX 0x81A7 + +#define GLEW_SGIX_depth_texture GLEW_GET_VAR(__GLEW_SGIX_depth_texture) + +#endif /* GL_SGIX_depth_texture */ + +/* -------------------------- GL_SGIX_flush_raster ------------------------- */ + +#ifndef GL_SGIX_flush_raster +#define GL_SGIX_flush_raster 1 + +typedef void (GLAPIENTRY * PFNGLFLUSHRASTERSGIXPROC) (void); + +#define glFlushRasterSGIX GLEW_GET_FUN(__glewFlushRasterSGIX) + +#define GLEW_SGIX_flush_raster GLEW_GET_VAR(__GLEW_SGIX_flush_raster) + +#endif /* GL_SGIX_flush_raster */ + +/* --------------------------- GL_SGIX_fog_offset -------------------------- */ + +#ifndef GL_SGIX_fog_offset +#define GL_SGIX_fog_offset 1 + +#define GL_FOG_OFFSET_SGIX 0x8198 +#define GL_FOG_OFFSET_VALUE_SGIX 0x8199 + +#define GLEW_SGIX_fog_offset GLEW_GET_VAR(__GLEW_SGIX_fog_offset) + +#endif /* GL_SGIX_fog_offset */ + +/* -------------------------- GL_SGIX_fog_texture -------------------------- */ + +#ifndef GL_SGIX_fog_texture +#define GL_SGIX_fog_texture 1 + +#define GL_TEXTURE_FOG_SGIX 0 +#define GL_FOG_PATCHY_FACTOR_SGIX 0 +#define GL_FRAGMENT_FOG_SGIX 0 + +typedef void (GLAPIENTRY * PFNGLTEXTUREFOGSGIXPROC) (GLenum pname); + +#define glTextureFogSGIX GLEW_GET_FUN(__glewTextureFogSGIX) + +#define GLEW_SGIX_fog_texture GLEW_GET_VAR(__GLEW_SGIX_fog_texture) + +#endif /* GL_SGIX_fog_texture */ + +/* ------------------- GL_SGIX_fragment_specular_lighting ------------------ */ + +#ifndef GL_SGIX_fragment_specular_lighting +#define GL_SGIX_fragment_specular_lighting 1 + +typedef void (GLAPIENTRY * PFNGLFRAGMENTCOLORMATERIALSGIXPROC) (GLenum face, GLenum mode); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFSGIXPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFVSGIXPROC) (GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELISGIXPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELIVSGIXPROC) (GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFSGIXPROC) (GLenum light, GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTISGIXPROC) (GLenum light, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFSGIXPROC) (GLenum face, GLenum pname, const GLfloat param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALISGIXPROC) (GLenum face, GLenum pname, const GLint param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum value, GLfloat* data); +typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum value, GLint* data); +typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat* data); +typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint* data); + +#define glFragmentColorMaterialSGIX GLEW_GET_FUN(__glewFragmentColorMaterialSGIX) +#define glFragmentLightModelfSGIX GLEW_GET_FUN(__glewFragmentLightModelfSGIX) +#define glFragmentLightModelfvSGIX GLEW_GET_FUN(__glewFragmentLightModelfvSGIX) +#define glFragmentLightModeliSGIX GLEW_GET_FUN(__glewFragmentLightModeliSGIX) +#define glFragmentLightModelivSGIX GLEW_GET_FUN(__glewFragmentLightModelivSGIX) +#define glFragmentLightfSGIX GLEW_GET_FUN(__glewFragmentLightfSGIX) +#define glFragmentLightfvSGIX GLEW_GET_FUN(__glewFragmentLightfvSGIX) +#define glFragmentLightiSGIX GLEW_GET_FUN(__glewFragmentLightiSGIX) +#define glFragmentLightivSGIX GLEW_GET_FUN(__glewFragmentLightivSGIX) +#define glFragmentMaterialfSGIX GLEW_GET_FUN(__glewFragmentMaterialfSGIX) +#define glFragmentMaterialfvSGIX GLEW_GET_FUN(__glewFragmentMaterialfvSGIX) +#define glFragmentMaterialiSGIX GLEW_GET_FUN(__glewFragmentMaterialiSGIX) +#define glFragmentMaterialivSGIX GLEW_GET_FUN(__glewFragmentMaterialivSGIX) +#define glGetFragmentLightfvSGIX GLEW_GET_FUN(__glewGetFragmentLightfvSGIX) +#define glGetFragmentLightivSGIX GLEW_GET_FUN(__glewGetFragmentLightivSGIX) +#define glGetFragmentMaterialfvSGIX GLEW_GET_FUN(__glewGetFragmentMaterialfvSGIX) +#define glGetFragmentMaterialivSGIX GLEW_GET_FUN(__glewGetFragmentMaterialivSGIX) + +#define GLEW_SGIX_fragment_specular_lighting GLEW_GET_VAR(__GLEW_SGIX_fragment_specular_lighting) + +#endif /* GL_SGIX_fragment_specular_lighting */ + +/* --------------------------- GL_SGIX_framezoom --------------------------- */ + +#ifndef GL_SGIX_framezoom +#define GL_SGIX_framezoom 1 + +typedef void (GLAPIENTRY * PFNGLFRAMEZOOMSGIXPROC) (GLint factor); + +#define glFrameZoomSGIX GLEW_GET_FUN(__glewFrameZoomSGIX) + +#define GLEW_SGIX_framezoom GLEW_GET_VAR(__GLEW_SGIX_framezoom) + +#endif /* GL_SGIX_framezoom */ + +/* --------------------------- GL_SGIX_interlace --------------------------- */ + +#ifndef GL_SGIX_interlace +#define GL_SGIX_interlace 1 + +#define GL_INTERLACE_SGIX 0x8094 + +#define GLEW_SGIX_interlace GLEW_GET_VAR(__GLEW_SGIX_interlace) + +#endif /* GL_SGIX_interlace */ + +/* ------------------------- GL_SGIX_ir_instrument1 ------------------------ */ + +#ifndef GL_SGIX_ir_instrument1 +#define GL_SGIX_ir_instrument1 1 + +#define GLEW_SGIX_ir_instrument1 GLEW_GET_VAR(__GLEW_SGIX_ir_instrument1) + +#endif /* GL_SGIX_ir_instrument1 */ + +/* ------------------------- GL_SGIX_list_priority ------------------------- */ + +#ifndef GL_SGIX_list_priority +#define GL_SGIX_list_priority 1 + +#define GLEW_SGIX_list_priority GLEW_GET_VAR(__GLEW_SGIX_list_priority) + +#endif /* GL_SGIX_list_priority */ + +/* ------------------------- GL_SGIX_pixel_texture ------------------------- */ + +#ifndef GL_SGIX_pixel_texture +#define GL_SGIX_pixel_texture 1 + +typedef void (GLAPIENTRY * PFNGLPIXELTEXGENSGIXPROC) (GLenum mode); + +#define glPixelTexGenSGIX GLEW_GET_FUN(__glewPixelTexGenSGIX) + +#define GLEW_SGIX_pixel_texture GLEW_GET_VAR(__GLEW_SGIX_pixel_texture) + +#endif /* GL_SGIX_pixel_texture */ + +/* ----------------------- GL_SGIX_pixel_texture_bits ---------------------- */ + +#ifndef GL_SGIX_pixel_texture_bits +#define GL_SGIX_pixel_texture_bits 1 + +#define GLEW_SGIX_pixel_texture_bits GLEW_GET_VAR(__GLEW_SGIX_pixel_texture_bits) + +#endif /* GL_SGIX_pixel_texture_bits */ + +/* ------------------------ GL_SGIX_reference_plane ------------------------ */ + +#ifndef GL_SGIX_reference_plane +#define GL_SGIX_reference_plane 1 + +typedef void (GLAPIENTRY * PFNGLREFERENCEPLANESGIXPROC) (const GLdouble* equation); + +#define glReferencePlaneSGIX GLEW_GET_FUN(__glewReferencePlaneSGIX) + +#define GLEW_SGIX_reference_plane GLEW_GET_VAR(__GLEW_SGIX_reference_plane) + +#endif /* GL_SGIX_reference_plane */ + +/* ---------------------------- GL_SGIX_resample --------------------------- */ + +#ifndef GL_SGIX_resample +#define GL_SGIX_resample 1 + +#define GL_PACK_RESAMPLE_SGIX 0x842E +#define GL_UNPACK_RESAMPLE_SGIX 0x842F +#define GL_RESAMPLE_DECIMATE_SGIX 0x8430 +#define GL_RESAMPLE_REPLICATE_SGIX 0x8433 +#define GL_RESAMPLE_ZERO_FILL_SGIX 0x8434 + +#define GLEW_SGIX_resample GLEW_GET_VAR(__GLEW_SGIX_resample) + +#endif /* GL_SGIX_resample */ + +/* ----------------------------- GL_SGIX_shadow ---------------------------- */ + +#ifndef GL_SGIX_shadow +#define GL_SGIX_shadow 1 + +#define GL_TEXTURE_COMPARE_SGIX 0x819A +#define GL_TEXTURE_COMPARE_OPERATOR_SGIX 0x819B +#define GL_TEXTURE_LEQUAL_R_SGIX 0x819C +#define GL_TEXTURE_GEQUAL_R_SGIX 0x819D + +#define GLEW_SGIX_shadow GLEW_GET_VAR(__GLEW_SGIX_shadow) + +#endif /* GL_SGIX_shadow */ + +/* ------------------------- GL_SGIX_shadow_ambient ------------------------ */ + +#ifndef GL_SGIX_shadow_ambient +#define GL_SGIX_shadow_ambient 1 + +#define GL_SHADOW_AMBIENT_SGIX 0x80BF + +#define GLEW_SGIX_shadow_ambient GLEW_GET_VAR(__GLEW_SGIX_shadow_ambient) + +#endif /* GL_SGIX_shadow_ambient */ + +/* ----------------------------- GL_SGIX_sprite ---------------------------- */ + +#ifndef GL_SGIX_sprite +#define GL_SGIX_sprite 1 + +typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERFSGIXPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERFVSGIXPROC) (GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERISGIXPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERIVSGIXPROC) (GLenum pname, GLint* params); + +#define glSpriteParameterfSGIX GLEW_GET_FUN(__glewSpriteParameterfSGIX) +#define glSpriteParameterfvSGIX GLEW_GET_FUN(__glewSpriteParameterfvSGIX) +#define glSpriteParameteriSGIX GLEW_GET_FUN(__glewSpriteParameteriSGIX) +#define glSpriteParameterivSGIX GLEW_GET_FUN(__glewSpriteParameterivSGIX) + +#define GLEW_SGIX_sprite GLEW_GET_VAR(__GLEW_SGIX_sprite) + +#endif /* GL_SGIX_sprite */ + +/* ----------------------- GL_SGIX_tag_sample_buffer ----------------------- */ + +#ifndef GL_SGIX_tag_sample_buffer +#define GL_SGIX_tag_sample_buffer 1 + +typedef void (GLAPIENTRY * PFNGLTAGSAMPLEBUFFERSGIXPROC) (void); + +#define glTagSampleBufferSGIX GLEW_GET_FUN(__glewTagSampleBufferSGIX) + +#define GLEW_SGIX_tag_sample_buffer GLEW_GET_VAR(__GLEW_SGIX_tag_sample_buffer) + +#endif /* GL_SGIX_tag_sample_buffer */ + +/* ------------------------ GL_SGIX_texture_add_env ------------------------ */ + +#ifndef GL_SGIX_texture_add_env +#define GL_SGIX_texture_add_env 1 + +#define GLEW_SGIX_texture_add_env GLEW_GET_VAR(__GLEW_SGIX_texture_add_env) + +#endif /* GL_SGIX_texture_add_env */ + +/* -------------------- GL_SGIX_texture_coordinate_clamp ------------------- */ + +#ifndef GL_SGIX_texture_coordinate_clamp +#define GL_SGIX_texture_coordinate_clamp 1 + +#define GL_TEXTURE_MAX_CLAMP_S_SGIX 0x8369 +#define GL_TEXTURE_MAX_CLAMP_T_SGIX 0x836A +#define GL_TEXTURE_MAX_CLAMP_R_SGIX 0x836B + +#define GLEW_SGIX_texture_coordinate_clamp GLEW_GET_VAR(__GLEW_SGIX_texture_coordinate_clamp) + +#endif /* GL_SGIX_texture_coordinate_clamp */ + +/* ------------------------ GL_SGIX_texture_lod_bias ----------------------- */ + +#ifndef GL_SGIX_texture_lod_bias +#define GL_SGIX_texture_lod_bias 1 + +#define GLEW_SGIX_texture_lod_bias GLEW_GET_VAR(__GLEW_SGIX_texture_lod_bias) + +#endif /* GL_SGIX_texture_lod_bias */ + +/* ---------------------- GL_SGIX_texture_multi_buffer --------------------- */ + +#ifndef GL_SGIX_texture_multi_buffer +#define GL_SGIX_texture_multi_buffer 1 + +#define GL_TEXTURE_MULTI_BUFFER_HINT_SGIX 0x812E + +#define GLEW_SGIX_texture_multi_buffer GLEW_GET_VAR(__GLEW_SGIX_texture_multi_buffer) + +#endif /* GL_SGIX_texture_multi_buffer */ + +/* ------------------------- GL_SGIX_texture_range ------------------------- */ + +#ifndef GL_SGIX_texture_range +#define GL_SGIX_texture_range 1 + +#define GL_RGB_SIGNED_SGIX 0x85E0 +#define GL_RGBA_SIGNED_SGIX 0x85E1 +#define GL_ALPHA_SIGNED_SGIX 0x85E2 +#define GL_LUMINANCE_SIGNED_SGIX 0x85E3 +#define GL_INTENSITY_SIGNED_SGIX 0x85E4 +#define GL_LUMINANCE_ALPHA_SIGNED_SGIX 0x85E5 +#define GL_RGB16_SIGNED_SGIX 0x85E6 +#define GL_RGBA16_SIGNED_SGIX 0x85E7 +#define GL_ALPHA16_SIGNED_SGIX 0x85E8 +#define GL_LUMINANCE16_SIGNED_SGIX 0x85E9 +#define GL_INTENSITY16_SIGNED_SGIX 0x85EA +#define GL_LUMINANCE16_ALPHA16_SIGNED_SGIX 0x85EB +#define GL_RGB_EXTENDED_RANGE_SGIX 0x85EC +#define GL_RGBA_EXTENDED_RANGE_SGIX 0x85ED +#define GL_ALPHA_EXTENDED_RANGE_SGIX 0x85EE +#define GL_LUMINANCE_EXTENDED_RANGE_SGIX 0x85EF +#define GL_INTENSITY_EXTENDED_RANGE_SGIX 0x85F0 +#define GL_LUMINANCE_ALPHA_EXTENDED_RANGE_SGIX 0x85F1 +#define GL_RGB16_EXTENDED_RANGE_SGIX 0x85F2 +#define GL_RGBA16_EXTENDED_RANGE_SGIX 0x85F3 +#define GL_ALPHA16_EXTENDED_RANGE_SGIX 0x85F4 +#define GL_LUMINANCE16_EXTENDED_RANGE_SGIX 0x85F5 +#define GL_INTENSITY16_EXTENDED_RANGE_SGIX 0x85F6 +#define GL_LUMINANCE16_ALPHA16_EXTENDED_RANGE_SGIX 0x85F7 +#define GL_MIN_LUMINANCE_SGIS 0x85F8 +#define GL_MAX_LUMINANCE_SGIS 0x85F9 +#define GL_MIN_INTENSITY_SGIS 0x85FA +#define GL_MAX_INTENSITY_SGIS 0x85FB + +#define GLEW_SGIX_texture_range GLEW_GET_VAR(__GLEW_SGIX_texture_range) + +#endif /* GL_SGIX_texture_range */ + +/* ----------------------- GL_SGIX_texture_scale_bias ---------------------- */ + +#ifndef GL_SGIX_texture_scale_bias +#define GL_SGIX_texture_scale_bias 1 + +#define GL_POST_TEXTURE_FILTER_BIAS_SGIX 0x8179 +#define GL_POST_TEXTURE_FILTER_SCALE_SGIX 0x817A +#define GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX 0x817B +#define GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX 0x817C + +#define GLEW_SGIX_texture_scale_bias GLEW_GET_VAR(__GLEW_SGIX_texture_scale_bias) + +#endif /* GL_SGIX_texture_scale_bias */ + +/* ------------------------- GL_SGIX_vertex_preclip ------------------------ */ + +#ifndef GL_SGIX_vertex_preclip +#define GL_SGIX_vertex_preclip 1 + +#define GL_VERTEX_PRECLIP_SGIX 0x83EE +#define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF + +#define GLEW_SGIX_vertex_preclip GLEW_GET_VAR(__GLEW_SGIX_vertex_preclip) + +#endif /* GL_SGIX_vertex_preclip */ + +/* ---------------------- GL_SGIX_vertex_preclip_hint ---------------------- */ + +#ifndef GL_SGIX_vertex_preclip_hint +#define GL_SGIX_vertex_preclip_hint 1 + +#define GL_VERTEX_PRECLIP_SGIX 0x83EE +#define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF + +#define GLEW_SGIX_vertex_preclip_hint GLEW_GET_VAR(__GLEW_SGIX_vertex_preclip_hint) + +#endif /* GL_SGIX_vertex_preclip_hint */ + +/* ----------------------------- GL_SGIX_ycrcb ----------------------------- */ + +#ifndef GL_SGIX_ycrcb +#define GL_SGIX_ycrcb 1 + +#define GLEW_SGIX_ycrcb GLEW_GET_VAR(__GLEW_SGIX_ycrcb) + +#endif /* GL_SGIX_ycrcb */ + +/* -------------------------- GL_SGI_color_matrix -------------------------- */ + +#ifndef GL_SGI_color_matrix +#define GL_SGI_color_matrix 1 + +#define GL_COLOR_MATRIX_SGI 0x80B1 +#define GL_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B2 +#define GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B3 +#define GL_POST_COLOR_MATRIX_RED_SCALE_SGI 0x80B4 +#define GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI 0x80B5 +#define GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI 0x80B6 +#define GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI 0x80B7 +#define GL_POST_COLOR_MATRIX_RED_BIAS_SGI 0x80B8 +#define GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI 0x80B9 +#define GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI 0x80BA +#define GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI 0x80BB + +#define GLEW_SGI_color_matrix GLEW_GET_VAR(__GLEW_SGI_color_matrix) + +#endif /* GL_SGI_color_matrix */ + +/* --------------------------- GL_SGI_color_table -------------------------- */ + +#ifndef GL_SGI_color_table +#define GL_SGI_color_table 1 + +#define GL_COLOR_TABLE_SGI 0x80D0 +#define GL_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D1 +#define GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D2 +#define GL_PROXY_COLOR_TABLE_SGI 0x80D3 +#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D4 +#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D5 +#define GL_COLOR_TABLE_SCALE_SGI 0x80D6 +#define GL_COLOR_TABLE_BIAS_SGI 0x80D7 +#define GL_COLOR_TABLE_FORMAT_SGI 0x80D8 +#define GL_COLOR_TABLE_WIDTH_SGI 0x80D9 +#define GL_COLOR_TABLE_RED_SIZE_SGI 0x80DA +#define GL_COLOR_TABLE_GREEN_SIZE_SGI 0x80DB +#define GL_COLOR_TABLE_BLUE_SIZE_SGI 0x80DC +#define GL_COLOR_TABLE_ALPHA_SIZE_SGI 0x80DD +#define GL_COLOR_TABLE_LUMINANCE_SIZE_SGI 0x80DE +#define GL_COLOR_TABLE_INTENSITY_SIZE_SGI 0x80DF + +typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void* table); +typedef void (GLAPIENTRY * PFNGLCOPYCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLESGIPROC) (GLenum target, GLenum format, GLenum type, void* table); + +#define glColorTableParameterfvSGI GLEW_GET_FUN(__glewColorTableParameterfvSGI) +#define glColorTableParameterivSGI GLEW_GET_FUN(__glewColorTableParameterivSGI) +#define glColorTableSGI GLEW_GET_FUN(__glewColorTableSGI) +#define glCopyColorTableSGI GLEW_GET_FUN(__glewCopyColorTableSGI) +#define glGetColorTableParameterfvSGI GLEW_GET_FUN(__glewGetColorTableParameterfvSGI) +#define glGetColorTableParameterivSGI GLEW_GET_FUN(__glewGetColorTableParameterivSGI) +#define glGetColorTableSGI GLEW_GET_FUN(__glewGetColorTableSGI) + +#define GLEW_SGI_color_table GLEW_GET_VAR(__GLEW_SGI_color_table) + +#endif /* GL_SGI_color_table */ + +/* ----------------------- GL_SGI_texture_color_table ---------------------- */ + +#ifndef GL_SGI_texture_color_table +#define GL_SGI_texture_color_table 1 + +#define GL_TEXTURE_COLOR_TABLE_SGI 0x80BC +#define GL_PROXY_TEXTURE_COLOR_TABLE_SGI 0x80BD + +#define GLEW_SGI_texture_color_table GLEW_GET_VAR(__GLEW_SGI_texture_color_table) + +#endif /* GL_SGI_texture_color_table */ + +/* ------------------------- GL_SUNX_constant_data ------------------------- */ + +#ifndef GL_SUNX_constant_data +#define GL_SUNX_constant_data 1 + +#define GL_UNPACK_CONSTANT_DATA_SUNX 0x81D5 +#define GL_TEXTURE_CONSTANT_DATA_SUNX 0x81D6 + +typedef void (GLAPIENTRY * PFNGLFINISHTEXTURESUNXPROC) (void); + +#define glFinishTextureSUNX GLEW_GET_FUN(__glewFinishTextureSUNX) + +#define GLEW_SUNX_constant_data GLEW_GET_VAR(__GLEW_SUNX_constant_data) + +#endif /* GL_SUNX_constant_data */ + +/* -------------------- GL_SUN_convolution_border_modes -------------------- */ + +#ifndef GL_SUN_convolution_border_modes +#define GL_SUN_convolution_border_modes 1 + +#define GL_WRAP_BORDER_SUN 0x81D4 + +#define GLEW_SUN_convolution_border_modes GLEW_GET_VAR(__GLEW_SUN_convolution_border_modes) + +#endif /* GL_SUN_convolution_border_modes */ + +/* -------------------------- GL_SUN_global_alpha -------------------------- */ + +#ifndef GL_SUN_global_alpha +#define GL_SUN_global_alpha 1 + +#define GL_GLOBAL_ALPHA_SUN 0x81D9 +#define GL_GLOBAL_ALPHA_FACTOR_SUN 0x81DA + +typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORBSUNPROC) (GLbyte factor); +typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORDSUNPROC) (GLdouble factor); +typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORFSUNPROC) (GLfloat factor); +typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORISUNPROC) (GLint factor); +typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORSSUNPROC) (GLshort factor); +typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORUBSUNPROC) (GLubyte factor); +typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORUISUNPROC) (GLuint factor); +typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORUSSUNPROC) (GLushort factor); + +#define glGlobalAlphaFactorbSUN GLEW_GET_FUN(__glewGlobalAlphaFactorbSUN) +#define glGlobalAlphaFactordSUN GLEW_GET_FUN(__glewGlobalAlphaFactordSUN) +#define glGlobalAlphaFactorfSUN GLEW_GET_FUN(__glewGlobalAlphaFactorfSUN) +#define glGlobalAlphaFactoriSUN GLEW_GET_FUN(__glewGlobalAlphaFactoriSUN) +#define glGlobalAlphaFactorsSUN GLEW_GET_FUN(__glewGlobalAlphaFactorsSUN) +#define glGlobalAlphaFactorubSUN GLEW_GET_FUN(__glewGlobalAlphaFactorubSUN) +#define glGlobalAlphaFactoruiSUN GLEW_GET_FUN(__glewGlobalAlphaFactoruiSUN) +#define glGlobalAlphaFactorusSUN GLEW_GET_FUN(__glewGlobalAlphaFactorusSUN) + +#define GLEW_SUN_global_alpha GLEW_GET_VAR(__GLEW_SUN_global_alpha) + +#endif /* GL_SUN_global_alpha */ + +/* --------------------------- GL_SUN_mesh_array --------------------------- */ + +#ifndef GL_SUN_mesh_array +#define GL_SUN_mesh_array 1 + +#define GL_QUAD_MESH_SUN 0x8614 +#define GL_TRIANGLE_MESH_SUN 0x8615 + +#define GLEW_SUN_mesh_array GLEW_GET_VAR(__GLEW_SUN_mesh_array) + +#endif /* GL_SUN_mesh_array */ + +/* ------------------------ GL_SUN_read_video_pixels ----------------------- */ + +#ifndef GL_SUN_read_video_pixels +#define GL_SUN_read_video_pixels 1 + +typedef void (GLAPIENTRY * PFNGLREADVIDEOPIXELSSUNPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels); + +#define glReadVideoPixelsSUN GLEW_GET_FUN(__glewReadVideoPixelsSUN) + +#define GLEW_SUN_read_video_pixels GLEW_GET_VAR(__GLEW_SUN_read_video_pixels) + +#endif /* GL_SUN_read_video_pixels */ + +/* --------------------------- GL_SUN_slice_accum -------------------------- */ + +#ifndef GL_SUN_slice_accum +#define GL_SUN_slice_accum 1 + +#define GL_SLICE_ACCUM_SUN 0x85CC + +#define GLEW_SUN_slice_accum GLEW_GET_VAR(__GLEW_SUN_slice_accum) + +#endif /* GL_SUN_slice_accum */ + +/* -------------------------- GL_SUN_triangle_list ------------------------- */ + +#ifndef GL_SUN_triangle_list +#define GL_SUN_triangle_list 1 + +#define GL_RESTART_SUN 0x01 +#define GL_REPLACE_MIDDLE_SUN 0x02 +#define GL_REPLACE_OLDEST_SUN 0x03 +#define GL_TRIANGLE_LIST_SUN 0x81D7 +#define GL_REPLACEMENT_CODE_SUN 0x81D8 +#define GL_REPLACEMENT_CODE_ARRAY_SUN 0x85C0 +#define GL_REPLACEMENT_CODE_ARRAY_TYPE_SUN 0x85C1 +#define GL_REPLACEMENT_CODE_ARRAY_STRIDE_SUN 0x85C2 +#define GL_REPLACEMENT_CODE_ARRAY_POINTER_SUN 0x85C3 +#define GL_R1UI_V3F_SUN 0x85C4 +#define GL_R1UI_C4UB_V3F_SUN 0x85C5 +#define GL_R1UI_C3F_V3F_SUN 0x85C6 +#define GL_R1UI_N3F_V3F_SUN 0x85C7 +#define GL_R1UI_C4F_N3F_V3F_SUN 0x85C8 +#define GL_R1UI_T2F_V3F_SUN 0x85C9 +#define GL_R1UI_T2F_N3F_V3F_SUN 0x85CA +#define GL_R1UI_T2F_C4F_N3F_V3F_SUN 0x85CB + +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEPOINTERSUNPROC) (GLenum type, GLsizei stride, const void* pointer); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUBSUNPROC) (GLubyte code); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUBVSUNPROC) (const GLubyte* code); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUISUNPROC) (GLuint code); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUIVSUNPROC) (const GLuint* code); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUSSUNPROC) (GLushort code); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUSVSUNPROC) (const GLushort* code); + +#define glReplacementCodePointerSUN GLEW_GET_FUN(__glewReplacementCodePointerSUN) +#define glReplacementCodeubSUN GLEW_GET_FUN(__glewReplacementCodeubSUN) +#define glReplacementCodeubvSUN GLEW_GET_FUN(__glewReplacementCodeubvSUN) +#define glReplacementCodeuiSUN GLEW_GET_FUN(__glewReplacementCodeuiSUN) +#define glReplacementCodeuivSUN GLEW_GET_FUN(__glewReplacementCodeuivSUN) +#define glReplacementCodeusSUN GLEW_GET_FUN(__glewReplacementCodeusSUN) +#define glReplacementCodeusvSUN GLEW_GET_FUN(__glewReplacementCodeusvSUN) + +#define GLEW_SUN_triangle_list GLEW_GET_VAR(__GLEW_SUN_triangle_list) + +#endif /* GL_SUN_triangle_list */ + +/* ----------------------------- GL_SUN_vertex ----------------------------- */ + +#ifndef GL_SUN_vertex +#define GL_SUN_vertex 1 + +typedef void (GLAPIENTRY * PFNGLCOLOR3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLCOLOR3FVERTEX3FVSUNPROC) (const GLfloat* c, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* c, const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX2FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX2FVSUNPROC) (const GLubyte* c, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX3FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX3FVSUNPROC) (const GLubyte* c, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLNORMAL3FVERTEX3FSUNPROC) (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* n, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *c, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC) (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC) (const GLuint* rc, const GLubyte *c, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *tc, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC) (GLuint rc, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *c, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC) (const GLfloat* tc, const GLubyte *c, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC) (const GLfloat* tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD4FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLTEXCOORD4FVERTEX4FVSUNPROC) (const GLfloat* tc, const GLfloat *v); + +#define glColor3fVertex3fSUN GLEW_GET_FUN(__glewColor3fVertex3fSUN) +#define glColor3fVertex3fvSUN GLEW_GET_FUN(__glewColor3fVertex3fvSUN) +#define glColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewColor4fNormal3fVertex3fSUN) +#define glColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewColor4fNormal3fVertex3fvSUN) +#define glColor4ubVertex2fSUN GLEW_GET_FUN(__glewColor4ubVertex2fSUN) +#define glColor4ubVertex2fvSUN GLEW_GET_FUN(__glewColor4ubVertex2fvSUN) +#define glColor4ubVertex3fSUN GLEW_GET_FUN(__glewColor4ubVertex3fSUN) +#define glColor4ubVertex3fvSUN GLEW_GET_FUN(__glewColor4ubVertex3fvSUN) +#define glNormal3fVertex3fSUN GLEW_GET_FUN(__glewNormal3fVertex3fSUN) +#define glNormal3fVertex3fvSUN GLEW_GET_FUN(__glewNormal3fVertex3fvSUN) +#define glReplacementCodeuiColor3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiColor3fVertex3fSUN) +#define glReplacementCodeuiColor3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiColor3fVertex3fvSUN) +#define glReplacementCodeuiColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4fNormal3fVertex3fSUN) +#define glReplacementCodeuiColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4fNormal3fVertex3fvSUN) +#define glReplacementCodeuiColor4ubVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4ubVertex3fSUN) +#define glReplacementCodeuiColor4ubVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4ubVertex3fvSUN) +#define glReplacementCodeuiNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiNormal3fVertex3fSUN) +#define glReplacementCodeuiNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiNormal3fVertex3fvSUN) +#define glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN) +#define glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN) +#define glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fNormal3fVertex3fSUN) +#define glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN) +#define glReplacementCodeuiTexCoord2fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fVertex3fSUN) +#define glReplacementCodeuiTexCoord2fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fVertex3fvSUN) +#define glReplacementCodeuiVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiVertex3fSUN) +#define glReplacementCodeuiVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiVertex3fvSUN) +#define glTexCoord2fColor3fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fColor3fVertex3fSUN) +#define glTexCoord2fColor3fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fColor3fVertex3fvSUN) +#define glTexCoord2fColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fColor4fNormal3fVertex3fSUN) +#define glTexCoord2fColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fColor4fNormal3fVertex3fvSUN) +#define glTexCoord2fColor4ubVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fColor4ubVertex3fSUN) +#define glTexCoord2fColor4ubVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fColor4ubVertex3fvSUN) +#define glTexCoord2fNormal3fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fNormal3fVertex3fSUN) +#define glTexCoord2fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fNormal3fVertex3fvSUN) +#define glTexCoord2fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fVertex3fSUN) +#define glTexCoord2fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fVertex3fvSUN) +#define glTexCoord4fColor4fNormal3fVertex4fSUN GLEW_GET_FUN(__glewTexCoord4fColor4fNormal3fVertex4fSUN) +#define glTexCoord4fColor4fNormal3fVertex4fvSUN GLEW_GET_FUN(__glewTexCoord4fColor4fNormal3fVertex4fvSUN) +#define glTexCoord4fVertex4fSUN GLEW_GET_FUN(__glewTexCoord4fVertex4fSUN) +#define glTexCoord4fVertex4fvSUN GLEW_GET_FUN(__glewTexCoord4fVertex4fvSUN) + +#define GLEW_SUN_vertex GLEW_GET_VAR(__GLEW_SUN_vertex) + +#endif /* GL_SUN_vertex */ + +/* -------------------------- GL_WIN_phong_shading ------------------------- */ + +#ifndef GL_WIN_phong_shading +#define GL_WIN_phong_shading 1 + +#define GL_PHONG_WIN 0x80EA +#define GL_PHONG_HINT_WIN 0x80EB + +#define GLEW_WIN_phong_shading GLEW_GET_VAR(__GLEW_WIN_phong_shading) + +#endif /* GL_WIN_phong_shading */ + +/* -------------------------- GL_WIN_specular_fog -------------------------- */ + +#ifndef GL_WIN_specular_fog +#define GL_WIN_specular_fog 1 + +#define GL_FOG_SPECULAR_TEXTURE_WIN 0x80EC + +#define GLEW_WIN_specular_fog GLEW_GET_VAR(__GLEW_WIN_specular_fog) + +#endif /* GL_WIN_specular_fog */ + +/* ---------------------------- GL_WIN_swap_hint --------------------------- */ + +#ifndef GL_WIN_swap_hint +#define GL_WIN_swap_hint 1 + +typedef void (GLAPIENTRY * PFNGLADDSWAPHINTRECTWINPROC) (GLint x, GLint y, GLsizei width, GLsizei height); + +#define glAddSwapHintRectWIN GLEW_GET_FUN(__glewAddSwapHintRectWIN) + +#define GLEW_WIN_swap_hint GLEW_GET_VAR(__GLEW_WIN_swap_hint) + +#endif /* GL_WIN_swap_hint */ + +/* ------------------------------------------------------------------------- */ + +#if defined(GLEW_MX) && defined(_WIN32) +#define GLEW_FUN_EXPORT +#else +#define GLEW_FUN_EXPORT GLEWAPI +#endif /* GLEW_MX */ + +#if defined(GLEW_MX) +#define GLEW_VAR_EXPORT +#else +#define GLEW_VAR_EXPORT GLEWAPI +#endif /* GLEW_MX */ + +#if defined(GLEW_MX) && defined(_WIN32) +struct GLEWContextStruct +{ +#endif /* GLEW_MX */ + +GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE3DPROC __glewCopyTexSubImage3D; +GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTSPROC __glewDrawRangeElements; +GLEW_FUN_EXPORT PFNGLTEXIMAGE3DPROC __glewTexImage3D; +GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE3DPROC __glewTexSubImage3D; + +GLEW_FUN_EXPORT PFNGLACTIVETEXTUREPROC __glewActiveTexture; +GLEW_FUN_EXPORT PFNGLCLIENTACTIVETEXTUREPROC __glewClientActiveTexture; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE1DPROC __glewCompressedTexImage1D; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE2DPROC __glewCompressedTexImage2D; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE3DPROC __glewCompressedTexImage3D; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC __glewCompressedTexSubImage1D; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC __glewCompressedTexSubImage2D; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC __glewCompressedTexSubImage3D; +GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXIMAGEPROC __glewGetCompressedTexImage; +GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXDPROC __glewLoadTransposeMatrixd; +GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXFPROC __glewLoadTransposeMatrixf; +GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXDPROC __glewMultTransposeMatrixd; +GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXFPROC __glewMultTransposeMatrixf; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DPROC __glewMultiTexCoord1d; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DVPROC __glewMultiTexCoord1dv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FPROC __glewMultiTexCoord1f; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FVPROC __glewMultiTexCoord1fv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IPROC __glewMultiTexCoord1i; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IVPROC __glewMultiTexCoord1iv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SPROC __glewMultiTexCoord1s; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SVPROC __glewMultiTexCoord1sv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DPROC __glewMultiTexCoord2d; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DVPROC __glewMultiTexCoord2dv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FPROC __glewMultiTexCoord2f; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FVPROC __glewMultiTexCoord2fv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IPROC __glewMultiTexCoord2i; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IVPROC __glewMultiTexCoord2iv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SPROC __glewMultiTexCoord2s; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SVPROC __glewMultiTexCoord2sv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DPROC __glewMultiTexCoord3d; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DVPROC __glewMultiTexCoord3dv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FPROC __glewMultiTexCoord3f; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FVPROC __glewMultiTexCoord3fv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IPROC __glewMultiTexCoord3i; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IVPROC __glewMultiTexCoord3iv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SPROC __glewMultiTexCoord3s; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SVPROC __glewMultiTexCoord3sv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DPROC __glewMultiTexCoord4d; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DVPROC __glewMultiTexCoord4dv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FPROC __glewMultiTexCoord4f; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FVPROC __glewMultiTexCoord4fv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IPROC __glewMultiTexCoord4i; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IVPROC __glewMultiTexCoord4iv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SPROC __glewMultiTexCoord4s; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SVPROC __glewMultiTexCoord4sv; +GLEW_FUN_EXPORT PFNGLSAMPLECOVERAGEPROC __glewSampleCoverage; + +GLEW_FUN_EXPORT PFNGLBLENDCOLORPROC __glewBlendColor; +GLEW_FUN_EXPORT PFNGLBLENDEQUATIONPROC __glewBlendEquation; +GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEPROC __glewBlendFuncSeparate; +GLEW_FUN_EXPORT PFNGLFOGCOORDPOINTERPROC __glewFogCoordPointer; +GLEW_FUN_EXPORT PFNGLFOGCOORDDPROC __glewFogCoordd; +GLEW_FUN_EXPORT PFNGLFOGCOORDDVPROC __glewFogCoorddv; +GLEW_FUN_EXPORT PFNGLFOGCOORDFPROC __glewFogCoordf; +GLEW_FUN_EXPORT PFNGLFOGCOORDFVPROC __glewFogCoordfv; +GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSPROC __glewMultiDrawArrays; +GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSPROC __glewMultiDrawElements; +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFPROC __glewPointParameterf; +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFVPROC __glewPointParameterfv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BPROC __glewSecondaryColor3b; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BVPROC __glewSecondaryColor3bv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DPROC __glewSecondaryColor3d; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DVPROC __glewSecondaryColor3dv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FPROC __glewSecondaryColor3f; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FVPROC __glewSecondaryColor3fv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IPROC __glewSecondaryColor3i; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IVPROC __glewSecondaryColor3iv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SPROC __glewSecondaryColor3s; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SVPROC __glewSecondaryColor3sv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBPROC __glewSecondaryColor3ub; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBVPROC __glewSecondaryColor3ubv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIPROC __glewSecondaryColor3ui; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIVPROC __glewSecondaryColor3uiv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USPROC __glewSecondaryColor3us; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USVPROC __glewSecondaryColor3usv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLORPOINTERPROC __glewSecondaryColorPointer; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2DPROC __glewWindowPos2d; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2DVPROC __glewWindowPos2dv; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2FPROC __glewWindowPos2f; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2FVPROC __glewWindowPos2fv; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2IPROC __glewWindowPos2i; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2IVPROC __glewWindowPos2iv; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2SPROC __glewWindowPos2s; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2SVPROC __glewWindowPos2sv; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3DPROC __glewWindowPos3d; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3DVPROC __glewWindowPos3dv; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3FPROC __glewWindowPos3f; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3FVPROC __glewWindowPos3fv; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3IPROC __glewWindowPos3i; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3IVPROC __glewWindowPos3iv; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3SPROC __glewWindowPos3s; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3SVPROC __glewWindowPos3sv; + +GLEW_FUN_EXPORT PFNGLBEGINQUERYPROC __glewBeginQuery; +GLEW_FUN_EXPORT PFNGLBINDBUFFERPROC __glewBindBuffer; +GLEW_FUN_EXPORT PFNGLBUFFERDATAPROC __glewBufferData; +GLEW_FUN_EXPORT PFNGLBUFFERSUBDATAPROC __glewBufferSubData; +GLEW_FUN_EXPORT PFNGLDELETEBUFFERSPROC __glewDeleteBuffers; +GLEW_FUN_EXPORT PFNGLDELETEQUERIESPROC __glewDeleteQueries; +GLEW_FUN_EXPORT PFNGLENDQUERYPROC __glewEndQuery; +GLEW_FUN_EXPORT PFNGLGENBUFFERSPROC __glewGenBuffers; +GLEW_FUN_EXPORT PFNGLGENQUERIESPROC __glewGenQueries; +GLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERIVPROC __glewGetBufferParameteriv; +GLEW_FUN_EXPORT PFNGLGETBUFFERPOINTERVPROC __glewGetBufferPointerv; +GLEW_FUN_EXPORT PFNGLGETBUFFERSUBDATAPROC __glewGetBufferSubData; +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTIVPROC __glewGetQueryObjectiv; +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUIVPROC __glewGetQueryObjectuiv; +GLEW_FUN_EXPORT PFNGLGETQUERYIVPROC __glewGetQueryiv; +GLEW_FUN_EXPORT PFNGLISBUFFERPROC __glewIsBuffer; +GLEW_FUN_EXPORT PFNGLISQUERYPROC __glewIsQuery; +GLEW_FUN_EXPORT PFNGLMAPBUFFERPROC __glewMapBuffer; +GLEW_FUN_EXPORT PFNGLUNMAPBUFFERPROC __glewUnmapBuffer; + +GLEW_FUN_EXPORT PFNGLATTACHSHADERPROC __glewAttachShader; +GLEW_FUN_EXPORT PFNGLBINDATTRIBLOCATIONPROC __glewBindAttribLocation; +GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEPROC __glewBlendEquationSeparate; +GLEW_FUN_EXPORT PFNGLCOMPILESHADERPROC __glewCompileShader; +GLEW_FUN_EXPORT PFNGLCREATEPROGRAMPROC __glewCreateProgram; +GLEW_FUN_EXPORT PFNGLCREATESHADERPROC __glewCreateShader; +GLEW_FUN_EXPORT PFNGLDELETEPROGRAMPROC __glewDeleteProgram; +GLEW_FUN_EXPORT PFNGLDELETESHADERPROC __glewDeleteShader; +GLEW_FUN_EXPORT PFNGLDETACHSHADERPROC __glewDetachShader; +GLEW_FUN_EXPORT PFNGLDISABLEVERTEXATTRIBARRAYPROC __glewDisableVertexAttribArray; +GLEW_FUN_EXPORT PFNGLDRAWBUFFERSPROC __glewDrawBuffers; +GLEW_FUN_EXPORT PFNGLENABLEVERTEXATTRIBARRAYPROC __glewEnableVertexAttribArray; +GLEW_FUN_EXPORT PFNGLGETACTIVEATTRIBPROC __glewGetActiveAttrib; +GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMPROC __glewGetActiveUniform; +GLEW_FUN_EXPORT PFNGLGETATTACHEDSHADERSPROC __glewGetAttachedShaders; +GLEW_FUN_EXPORT PFNGLGETATTRIBLOCATIONPROC __glewGetAttribLocation; +GLEW_FUN_EXPORT PFNGLGETPROGRAMINFOLOGPROC __glewGetProgramInfoLog; +GLEW_FUN_EXPORT PFNGLGETPROGRAMIVPROC __glewGetProgramiv; +GLEW_FUN_EXPORT PFNGLGETSHADERINFOLOGPROC __glewGetShaderInfoLog; +GLEW_FUN_EXPORT PFNGLGETSHADERSOURCEPROC __glewGetShaderSource; +GLEW_FUN_EXPORT PFNGLGETSHADERIVPROC __glewGetShaderiv; +GLEW_FUN_EXPORT PFNGLGETUNIFORMLOCATIONPROC __glewGetUniformLocation; +GLEW_FUN_EXPORT PFNGLGETUNIFORMFVPROC __glewGetUniformfv; +GLEW_FUN_EXPORT PFNGLGETUNIFORMIVPROC __glewGetUniformiv; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBPOINTERVPROC __glewGetVertexAttribPointerv; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBDVPROC __glewGetVertexAttribdv; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBFVPROC __glewGetVertexAttribfv; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIVPROC __glewGetVertexAttribiv; +GLEW_FUN_EXPORT PFNGLISPROGRAMPROC __glewIsProgram; +GLEW_FUN_EXPORT PFNGLISSHADERPROC __glewIsShader; +GLEW_FUN_EXPORT PFNGLLINKPROGRAMPROC __glewLinkProgram; +GLEW_FUN_EXPORT PFNGLSHADERSOURCEPROC __glewShaderSource; +GLEW_FUN_EXPORT PFNGLSTENCILFUNCSEPARATEPROC __glewStencilFuncSeparate; +GLEW_FUN_EXPORT PFNGLSTENCILMASKSEPARATEPROC __glewStencilMaskSeparate; +GLEW_FUN_EXPORT PFNGLSTENCILOPSEPARATEPROC __glewStencilOpSeparate; +GLEW_FUN_EXPORT PFNGLUNIFORM1FPROC __glewUniform1f; +GLEW_FUN_EXPORT PFNGLUNIFORM1FVPROC __glewUniform1fv; +GLEW_FUN_EXPORT PFNGLUNIFORM1IPROC __glewUniform1i; +GLEW_FUN_EXPORT PFNGLUNIFORM1IVPROC __glewUniform1iv; +GLEW_FUN_EXPORT PFNGLUNIFORM2FPROC __glewUniform2f; +GLEW_FUN_EXPORT PFNGLUNIFORM2FVPROC __glewUniform2fv; +GLEW_FUN_EXPORT PFNGLUNIFORM2IPROC __glewUniform2i; +GLEW_FUN_EXPORT PFNGLUNIFORM2IVPROC __glewUniform2iv; +GLEW_FUN_EXPORT PFNGLUNIFORM3FPROC __glewUniform3f; +GLEW_FUN_EXPORT PFNGLUNIFORM3FVPROC __glewUniform3fv; +GLEW_FUN_EXPORT PFNGLUNIFORM3IPROC __glewUniform3i; +GLEW_FUN_EXPORT PFNGLUNIFORM3IVPROC __glewUniform3iv; +GLEW_FUN_EXPORT PFNGLUNIFORM4FPROC __glewUniform4f; +GLEW_FUN_EXPORT PFNGLUNIFORM4FVPROC __glewUniform4fv; +GLEW_FUN_EXPORT PFNGLUNIFORM4IPROC __glewUniform4i; +GLEW_FUN_EXPORT PFNGLUNIFORM4IVPROC __glewUniform4iv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2FVPROC __glewUniformMatrix2fv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3FVPROC __glewUniformMatrix3fv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4FVPROC __glewUniformMatrix4fv; +GLEW_FUN_EXPORT PFNGLUSEPROGRAMPROC __glewUseProgram; +GLEW_FUN_EXPORT PFNGLVALIDATEPROGRAMPROC __glewValidateProgram; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DPROC __glewVertexAttrib1d; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DVPROC __glewVertexAttrib1dv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FPROC __glewVertexAttrib1f; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FVPROC __glewVertexAttrib1fv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SPROC __glewVertexAttrib1s; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SVPROC __glewVertexAttrib1sv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DPROC __glewVertexAttrib2d; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DVPROC __glewVertexAttrib2dv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FPROC __glewVertexAttrib2f; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FVPROC __glewVertexAttrib2fv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SPROC __glewVertexAttrib2s; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SVPROC __glewVertexAttrib2sv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DPROC __glewVertexAttrib3d; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DVPROC __glewVertexAttrib3dv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FPROC __glewVertexAttrib3f; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FVPROC __glewVertexAttrib3fv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SPROC __glewVertexAttrib3s; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SVPROC __glewVertexAttrib3sv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NBVPROC __glewVertexAttrib4Nbv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NIVPROC __glewVertexAttrib4Niv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NSVPROC __glewVertexAttrib4Nsv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBPROC __glewVertexAttrib4Nub; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBVPROC __glewVertexAttrib4Nubv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUIVPROC __glewVertexAttrib4Nuiv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUSVPROC __glewVertexAttrib4Nusv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4BVPROC __glewVertexAttrib4bv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DPROC __glewVertexAttrib4d; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DVPROC __glewVertexAttrib4dv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FPROC __glewVertexAttrib4f; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FVPROC __glewVertexAttrib4fv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4IVPROC __glewVertexAttrib4iv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SPROC __glewVertexAttrib4s; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SVPROC __glewVertexAttrib4sv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBVPROC __glewVertexAttrib4ubv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UIVPROC __glewVertexAttrib4uiv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4USVPROC __glewVertexAttrib4usv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBPOINTERPROC __glewVertexAttribPointer; + +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X3FVPROC __glewUniformMatrix2x3fv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X4FVPROC __glewUniformMatrix2x4fv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X2FVPROC __glewUniformMatrix3x2fv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X4FVPROC __glewUniformMatrix3x4fv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X2FVPROC __glewUniformMatrix4x2fv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X3FVPROC __glewUniformMatrix4x3fv; + +GLEW_FUN_EXPORT PFNGLTBUFFERMASK3DFXPROC __glewTbufferMask3DFX; + +GLEW_FUN_EXPORT PFNGLDRAWELEMENTARRAYAPPLEPROC __glewDrawElementArrayAPPLE; +GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC __glewDrawRangeElementArrayAPPLE; +GLEW_FUN_EXPORT PFNGLELEMENTPOINTERAPPLEPROC __glewElementPointerAPPLE; +GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC __glewMultiDrawElementArrayAPPLE; +GLEW_FUN_EXPORT PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC __glewMultiDrawRangeElementArrayAPPLE; + +GLEW_FUN_EXPORT PFNGLDELETEFENCESAPPLEPROC __glewDeleteFencesAPPLE; +GLEW_FUN_EXPORT PFNGLFINISHFENCEAPPLEPROC __glewFinishFenceAPPLE; +GLEW_FUN_EXPORT PFNGLFINISHOBJECTAPPLEPROC __glewFinishObjectAPPLE; +GLEW_FUN_EXPORT PFNGLGENFENCESAPPLEPROC __glewGenFencesAPPLE; +GLEW_FUN_EXPORT PFNGLISFENCEAPPLEPROC __glewIsFenceAPPLE; +GLEW_FUN_EXPORT PFNGLSETFENCEAPPLEPROC __glewSetFenceAPPLE; +GLEW_FUN_EXPORT PFNGLTESTFENCEAPPLEPROC __glewTestFenceAPPLE; +GLEW_FUN_EXPORT PFNGLTESTOBJECTAPPLEPROC __glewTestObjectAPPLE; + +GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC __glewGetTexParameterPointervAPPLE; +GLEW_FUN_EXPORT PFNGLTEXTURERANGEAPPLEPROC __glewTextureRangeAPPLE; + +GLEW_FUN_EXPORT PFNGLBINDVERTEXARRAYAPPLEPROC __glewBindVertexArrayAPPLE; +GLEW_FUN_EXPORT PFNGLDELETEVERTEXARRAYSAPPLEPROC __glewDeleteVertexArraysAPPLE; +GLEW_FUN_EXPORT PFNGLGENVERTEXARRAYSAPPLEPROC __glewGenVertexArraysAPPLE; +GLEW_FUN_EXPORT PFNGLISVERTEXARRAYAPPLEPROC __glewIsVertexArrayAPPLE; + +GLEW_FUN_EXPORT PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC __glewFlushVertexArrayRangeAPPLE; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYPARAMETERIAPPLEPROC __glewVertexArrayParameteriAPPLE; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYRANGEAPPLEPROC __glewVertexArrayRangeAPPLE; + +GLEW_FUN_EXPORT PFNGLCLAMPCOLORARBPROC __glewClampColorARB; + +GLEW_FUN_EXPORT PFNGLDRAWBUFFERSARBPROC __glewDrawBuffersARB; + +GLEW_FUN_EXPORT PFNGLCOLORSUBTABLEPROC __glewColorSubTable; +GLEW_FUN_EXPORT PFNGLCOLORTABLEPROC __glewColorTable; +GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERFVPROC __glewColorTableParameterfv; +GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERIVPROC __glewColorTableParameteriv; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER1DPROC __glewConvolutionFilter1D; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER2DPROC __glewConvolutionFilter2D; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFPROC __glewConvolutionParameterf; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFVPROC __glewConvolutionParameterfv; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIPROC __glewConvolutionParameteri; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIVPROC __glewConvolutionParameteriv; +GLEW_FUN_EXPORT PFNGLCOPYCOLORSUBTABLEPROC __glewCopyColorSubTable; +GLEW_FUN_EXPORT PFNGLCOPYCOLORTABLEPROC __glewCopyColorTable; +GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER1DPROC __glewCopyConvolutionFilter1D; +GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER2DPROC __glewCopyConvolutionFilter2D; +GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPROC __glewGetColorTable; +GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERFVPROC __glewGetColorTableParameterfv; +GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERIVPROC __glewGetColorTableParameteriv; +GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONFILTERPROC __glewGetConvolutionFilter; +GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERFVPROC __glewGetConvolutionParameterfv; +GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERIVPROC __glewGetConvolutionParameteriv; +GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPROC __glewGetHistogram; +GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERFVPROC __glewGetHistogramParameterfv; +GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERIVPROC __glewGetHistogramParameteriv; +GLEW_FUN_EXPORT PFNGLGETMINMAXPROC __glewGetMinmax; +GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERFVPROC __glewGetMinmaxParameterfv; +GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERIVPROC __glewGetMinmaxParameteriv; +GLEW_FUN_EXPORT PFNGLGETSEPARABLEFILTERPROC __glewGetSeparableFilter; +GLEW_FUN_EXPORT PFNGLHISTOGRAMPROC __glewHistogram; +GLEW_FUN_EXPORT PFNGLMINMAXPROC __glewMinmax; +GLEW_FUN_EXPORT PFNGLRESETHISTOGRAMPROC __glewResetHistogram; +GLEW_FUN_EXPORT PFNGLRESETMINMAXPROC __glewResetMinmax; +GLEW_FUN_EXPORT PFNGLSEPARABLEFILTER2DPROC __glewSeparableFilter2D; + +GLEW_FUN_EXPORT PFNGLCURRENTPALETTEMATRIXARBPROC __glewCurrentPaletteMatrixARB; +GLEW_FUN_EXPORT PFNGLMATRIXINDEXPOINTERARBPROC __glewMatrixIndexPointerARB; +GLEW_FUN_EXPORT PFNGLMATRIXINDEXUBVARBPROC __glewMatrixIndexubvARB; +GLEW_FUN_EXPORT PFNGLMATRIXINDEXUIVARBPROC __glewMatrixIndexuivARB; +GLEW_FUN_EXPORT PFNGLMATRIXINDEXUSVARBPROC __glewMatrixIndexusvARB; + +GLEW_FUN_EXPORT PFNGLSAMPLECOVERAGEARBPROC __glewSampleCoverageARB; + +GLEW_FUN_EXPORT PFNGLACTIVETEXTUREARBPROC __glewActiveTextureARB; +GLEW_FUN_EXPORT PFNGLCLIENTACTIVETEXTUREARBPROC __glewClientActiveTextureARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DARBPROC __glewMultiTexCoord1dARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DVARBPROC __glewMultiTexCoord1dvARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FARBPROC __glewMultiTexCoord1fARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FVARBPROC __glewMultiTexCoord1fvARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IARBPROC __glewMultiTexCoord1iARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IVARBPROC __glewMultiTexCoord1ivARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SARBPROC __glewMultiTexCoord1sARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SVARBPROC __glewMultiTexCoord1svARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DARBPROC __glewMultiTexCoord2dARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DVARBPROC __glewMultiTexCoord2dvARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FARBPROC __glewMultiTexCoord2fARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FVARBPROC __glewMultiTexCoord2fvARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IARBPROC __glewMultiTexCoord2iARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IVARBPROC __glewMultiTexCoord2ivARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SARBPROC __glewMultiTexCoord2sARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SVARBPROC __glewMultiTexCoord2svARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DARBPROC __glewMultiTexCoord3dARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DVARBPROC __glewMultiTexCoord3dvARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FARBPROC __glewMultiTexCoord3fARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FVARBPROC __glewMultiTexCoord3fvARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IARBPROC __glewMultiTexCoord3iARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IVARBPROC __glewMultiTexCoord3ivARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SARBPROC __glewMultiTexCoord3sARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SVARBPROC __glewMultiTexCoord3svARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DARBPROC __glewMultiTexCoord4dARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DVARBPROC __glewMultiTexCoord4dvARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FARBPROC __glewMultiTexCoord4fARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FVARBPROC __glewMultiTexCoord4fvARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IARBPROC __glewMultiTexCoord4iARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IVARBPROC __glewMultiTexCoord4ivARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SARBPROC __glewMultiTexCoord4sARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SVARBPROC __glewMultiTexCoord4svARB; + +GLEW_FUN_EXPORT PFNGLBEGINQUERYARBPROC __glewBeginQueryARB; +GLEW_FUN_EXPORT PFNGLDELETEQUERIESARBPROC __glewDeleteQueriesARB; +GLEW_FUN_EXPORT PFNGLENDQUERYARBPROC __glewEndQueryARB; +GLEW_FUN_EXPORT PFNGLGENQUERIESARBPROC __glewGenQueriesARB; +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTIVARBPROC __glewGetQueryObjectivARB; +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUIVARBPROC __glewGetQueryObjectuivARB; +GLEW_FUN_EXPORT PFNGLGETQUERYIVARBPROC __glewGetQueryivARB; +GLEW_FUN_EXPORT PFNGLISQUERYARBPROC __glewIsQueryARB; + +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFARBPROC __glewPointParameterfARB; +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFVARBPROC __glewPointParameterfvARB; + +GLEW_FUN_EXPORT PFNGLATTACHOBJECTARBPROC __glewAttachObjectARB; +GLEW_FUN_EXPORT PFNGLCOMPILESHADERARBPROC __glewCompileShaderARB; +GLEW_FUN_EXPORT PFNGLCREATEPROGRAMOBJECTARBPROC __glewCreateProgramObjectARB; +GLEW_FUN_EXPORT PFNGLCREATESHADEROBJECTARBPROC __glewCreateShaderObjectARB; +GLEW_FUN_EXPORT PFNGLDELETEOBJECTARBPROC __glewDeleteObjectARB; +GLEW_FUN_EXPORT PFNGLDETACHOBJECTARBPROC __glewDetachObjectARB; +GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMARBPROC __glewGetActiveUniformARB; +GLEW_FUN_EXPORT PFNGLGETATTACHEDOBJECTSARBPROC __glewGetAttachedObjectsARB; +GLEW_FUN_EXPORT PFNGLGETHANDLEARBPROC __glewGetHandleARB; +GLEW_FUN_EXPORT PFNGLGETINFOLOGARBPROC __glewGetInfoLogARB; +GLEW_FUN_EXPORT PFNGLGETOBJECTPARAMETERFVARBPROC __glewGetObjectParameterfvARB; +GLEW_FUN_EXPORT PFNGLGETOBJECTPARAMETERIVARBPROC __glewGetObjectParameterivARB; +GLEW_FUN_EXPORT PFNGLGETSHADERSOURCEARBPROC __glewGetShaderSourceARB; +GLEW_FUN_EXPORT PFNGLGETUNIFORMLOCATIONARBPROC __glewGetUniformLocationARB; +GLEW_FUN_EXPORT PFNGLGETUNIFORMFVARBPROC __glewGetUniformfvARB; +GLEW_FUN_EXPORT PFNGLGETUNIFORMIVARBPROC __glewGetUniformivARB; +GLEW_FUN_EXPORT PFNGLLINKPROGRAMARBPROC __glewLinkProgramARB; +GLEW_FUN_EXPORT PFNGLSHADERSOURCEARBPROC __glewShaderSourceARB; +GLEW_FUN_EXPORT PFNGLUNIFORM1FARBPROC __glewUniform1fARB; +GLEW_FUN_EXPORT PFNGLUNIFORM1FVARBPROC __glewUniform1fvARB; +GLEW_FUN_EXPORT PFNGLUNIFORM1IARBPROC __glewUniform1iARB; +GLEW_FUN_EXPORT PFNGLUNIFORM1IVARBPROC __glewUniform1ivARB; +GLEW_FUN_EXPORT PFNGLUNIFORM2FARBPROC __glewUniform2fARB; +GLEW_FUN_EXPORT PFNGLUNIFORM2FVARBPROC __glewUniform2fvARB; +GLEW_FUN_EXPORT PFNGLUNIFORM2IARBPROC __glewUniform2iARB; +GLEW_FUN_EXPORT PFNGLUNIFORM2IVARBPROC __glewUniform2ivARB; +GLEW_FUN_EXPORT PFNGLUNIFORM3FARBPROC __glewUniform3fARB; +GLEW_FUN_EXPORT PFNGLUNIFORM3FVARBPROC __glewUniform3fvARB; +GLEW_FUN_EXPORT PFNGLUNIFORM3IARBPROC __glewUniform3iARB; +GLEW_FUN_EXPORT PFNGLUNIFORM3IVARBPROC __glewUniform3ivARB; +GLEW_FUN_EXPORT PFNGLUNIFORM4FARBPROC __glewUniform4fARB; +GLEW_FUN_EXPORT PFNGLUNIFORM4FVARBPROC __glewUniform4fvARB; +GLEW_FUN_EXPORT PFNGLUNIFORM4IARBPROC __glewUniform4iARB; +GLEW_FUN_EXPORT PFNGLUNIFORM4IVARBPROC __glewUniform4ivARB; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2FVARBPROC __glewUniformMatrix2fvARB; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3FVARBPROC __glewUniformMatrix3fvARB; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4FVARBPROC __glewUniformMatrix4fvARB; +GLEW_FUN_EXPORT PFNGLUSEPROGRAMOBJECTARBPROC __glewUseProgramObjectARB; +GLEW_FUN_EXPORT PFNGLVALIDATEPROGRAMARBPROC __glewValidateProgramARB; + +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE1DARBPROC __glewCompressedTexImage1DARB; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE2DARBPROC __glewCompressedTexImage2DARB; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE3DARBPROC __glewCompressedTexImage3DARB; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC __glewCompressedTexSubImage1DARB; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC __glewCompressedTexSubImage2DARB; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC __glewCompressedTexSubImage3DARB; +GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXIMAGEARBPROC __glewGetCompressedTexImageARB; + +GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXDARBPROC __glewLoadTransposeMatrixdARB; +GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXFARBPROC __glewLoadTransposeMatrixfARB; +GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXDARBPROC __glewMultTransposeMatrixdARB; +GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXFARBPROC __glewMultTransposeMatrixfARB; + +GLEW_FUN_EXPORT PFNGLVERTEXBLENDARBPROC __glewVertexBlendARB; +GLEW_FUN_EXPORT PFNGLWEIGHTPOINTERARBPROC __glewWeightPointerARB; +GLEW_FUN_EXPORT PFNGLWEIGHTBVARBPROC __glewWeightbvARB; +GLEW_FUN_EXPORT PFNGLWEIGHTDVARBPROC __glewWeightdvARB; +GLEW_FUN_EXPORT PFNGLWEIGHTFVARBPROC __glewWeightfvARB; +GLEW_FUN_EXPORT PFNGLWEIGHTIVARBPROC __glewWeightivARB; +GLEW_FUN_EXPORT PFNGLWEIGHTSVARBPROC __glewWeightsvARB; +GLEW_FUN_EXPORT PFNGLWEIGHTUBVARBPROC __glewWeightubvARB; +GLEW_FUN_EXPORT PFNGLWEIGHTUIVARBPROC __glewWeightuivARB; +GLEW_FUN_EXPORT PFNGLWEIGHTUSVARBPROC __glewWeightusvARB; + +GLEW_FUN_EXPORT PFNGLBINDBUFFERARBPROC __glewBindBufferARB; +GLEW_FUN_EXPORT PFNGLBUFFERDATAARBPROC __glewBufferDataARB; +GLEW_FUN_EXPORT PFNGLBUFFERSUBDATAARBPROC __glewBufferSubDataARB; +GLEW_FUN_EXPORT PFNGLDELETEBUFFERSARBPROC __glewDeleteBuffersARB; +GLEW_FUN_EXPORT PFNGLGENBUFFERSARBPROC __glewGenBuffersARB; +GLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERIVARBPROC __glewGetBufferParameterivARB; +GLEW_FUN_EXPORT PFNGLGETBUFFERPOINTERVARBPROC __glewGetBufferPointervARB; +GLEW_FUN_EXPORT PFNGLGETBUFFERSUBDATAARBPROC __glewGetBufferSubDataARB; +GLEW_FUN_EXPORT PFNGLISBUFFERARBPROC __glewIsBufferARB; +GLEW_FUN_EXPORT PFNGLMAPBUFFERARBPROC __glewMapBufferARB; +GLEW_FUN_EXPORT PFNGLUNMAPBUFFERARBPROC __glewUnmapBufferARB; + +GLEW_FUN_EXPORT PFNGLBINDPROGRAMARBPROC __glewBindProgramARB; +GLEW_FUN_EXPORT PFNGLDELETEPROGRAMSARBPROC __glewDeleteProgramsARB; +GLEW_FUN_EXPORT PFNGLDISABLEVERTEXATTRIBARRAYARBPROC __glewDisableVertexAttribArrayARB; +GLEW_FUN_EXPORT PFNGLENABLEVERTEXATTRIBARRAYARBPROC __glewEnableVertexAttribArrayARB; +GLEW_FUN_EXPORT PFNGLGENPROGRAMSARBPROC __glewGenProgramsARB; +GLEW_FUN_EXPORT PFNGLGETPROGRAMENVPARAMETERDVARBPROC __glewGetProgramEnvParameterdvARB; +GLEW_FUN_EXPORT PFNGLGETPROGRAMENVPARAMETERFVARBPROC __glewGetProgramEnvParameterfvARB; +GLEW_FUN_EXPORT PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC __glewGetProgramLocalParameterdvARB; +GLEW_FUN_EXPORT PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC __glewGetProgramLocalParameterfvARB; +GLEW_FUN_EXPORT PFNGLGETPROGRAMSTRINGARBPROC __glewGetProgramStringARB; +GLEW_FUN_EXPORT PFNGLGETPROGRAMIVARBPROC __glewGetProgramivARB; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBPOINTERVARBPROC __glewGetVertexAttribPointervARB; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBDVARBPROC __glewGetVertexAttribdvARB; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBFVARBPROC __glewGetVertexAttribfvARB; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIVARBPROC __glewGetVertexAttribivARB; +GLEW_FUN_EXPORT PFNGLISPROGRAMARBPROC __glewIsProgramARB; +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4DARBPROC __glewProgramEnvParameter4dARB; +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4DVARBPROC __glewProgramEnvParameter4dvARB; +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4FARBPROC __glewProgramEnvParameter4fARB; +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4FVARBPROC __glewProgramEnvParameter4fvARB; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4DARBPROC __glewProgramLocalParameter4dARB; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4DVARBPROC __glewProgramLocalParameter4dvARB; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4FARBPROC __glewProgramLocalParameter4fARB; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4FVARBPROC __glewProgramLocalParameter4fvARB; +GLEW_FUN_EXPORT PFNGLPROGRAMSTRINGARBPROC __glewProgramStringARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DARBPROC __glewVertexAttrib1dARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DVARBPROC __glewVertexAttrib1dvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FARBPROC __glewVertexAttrib1fARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FVARBPROC __glewVertexAttrib1fvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SARBPROC __glewVertexAttrib1sARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SVARBPROC __glewVertexAttrib1svARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DARBPROC __glewVertexAttrib2dARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DVARBPROC __glewVertexAttrib2dvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FARBPROC __glewVertexAttrib2fARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FVARBPROC __glewVertexAttrib2fvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SARBPROC __glewVertexAttrib2sARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SVARBPROC __glewVertexAttrib2svARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DARBPROC __glewVertexAttrib3dARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DVARBPROC __glewVertexAttrib3dvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FARBPROC __glewVertexAttrib3fARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FVARBPROC __glewVertexAttrib3fvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SARBPROC __glewVertexAttrib3sARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SVARBPROC __glewVertexAttrib3svARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NBVARBPROC __glewVertexAttrib4NbvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NIVARBPROC __glewVertexAttrib4NivARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NSVARBPROC __glewVertexAttrib4NsvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBARBPROC __glewVertexAttrib4NubARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBVARBPROC __glewVertexAttrib4NubvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUIVARBPROC __glewVertexAttrib4NuivARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUSVARBPROC __glewVertexAttrib4NusvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4BVARBPROC __glewVertexAttrib4bvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DARBPROC __glewVertexAttrib4dARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DVARBPROC __glewVertexAttrib4dvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FARBPROC __glewVertexAttrib4fARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FVARBPROC __glewVertexAttrib4fvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4IVARBPROC __glewVertexAttrib4ivARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SARBPROC __glewVertexAttrib4sARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SVARBPROC __glewVertexAttrib4svARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBVARBPROC __glewVertexAttrib4ubvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UIVARBPROC __glewVertexAttrib4uivARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4USVARBPROC __glewVertexAttrib4usvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBPOINTERARBPROC __glewVertexAttribPointerARB; + +GLEW_FUN_EXPORT PFNGLBINDATTRIBLOCATIONARBPROC __glewBindAttribLocationARB; +GLEW_FUN_EXPORT PFNGLGETACTIVEATTRIBARBPROC __glewGetActiveAttribARB; +GLEW_FUN_EXPORT PFNGLGETATTRIBLOCATIONARBPROC __glewGetAttribLocationARB; + +GLEW_FUN_EXPORT PFNGLWINDOWPOS2DARBPROC __glewWindowPos2dARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2DVARBPROC __glewWindowPos2dvARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2FARBPROC __glewWindowPos2fARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2FVARBPROC __glewWindowPos2fvARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2IARBPROC __glewWindowPos2iARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2IVARBPROC __glewWindowPos2ivARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2SARBPROC __glewWindowPos2sARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2SVARBPROC __glewWindowPos2svARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3DARBPROC __glewWindowPos3dARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3DVARBPROC __glewWindowPos3dvARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3FARBPROC __glewWindowPos3fARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3FVARBPROC __glewWindowPos3fvARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3IARBPROC __glewWindowPos3iARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3IVARBPROC __glewWindowPos3ivARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3SARBPROC __glewWindowPos3sARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3SVARBPROC __glewWindowPos3svARB; + +GLEW_FUN_EXPORT PFNGLDRAWBUFFERSATIPROC __glewDrawBuffersATI; + +GLEW_FUN_EXPORT PFNGLDRAWELEMENTARRAYATIPROC __glewDrawElementArrayATI; +GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTARRAYATIPROC __glewDrawRangeElementArrayATI; +GLEW_FUN_EXPORT PFNGLELEMENTPOINTERATIPROC __glewElementPointerATI; + +GLEW_FUN_EXPORT PFNGLGETTEXBUMPPARAMETERFVATIPROC __glewGetTexBumpParameterfvATI; +GLEW_FUN_EXPORT PFNGLGETTEXBUMPPARAMETERIVATIPROC __glewGetTexBumpParameterivATI; +GLEW_FUN_EXPORT PFNGLTEXBUMPPARAMETERFVATIPROC __glewTexBumpParameterfvATI; +GLEW_FUN_EXPORT PFNGLTEXBUMPPARAMETERIVATIPROC __glewTexBumpParameterivATI; + +GLEW_FUN_EXPORT PFNGLALPHAFRAGMENTOP1ATIPROC __glewAlphaFragmentOp1ATI; +GLEW_FUN_EXPORT PFNGLALPHAFRAGMENTOP2ATIPROC __glewAlphaFragmentOp2ATI; +GLEW_FUN_EXPORT PFNGLALPHAFRAGMENTOP3ATIPROC __glewAlphaFragmentOp3ATI; +GLEW_FUN_EXPORT PFNGLBEGINFRAGMENTSHADERATIPROC __glewBeginFragmentShaderATI; +GLEW_FUN_EXPORT PFNGLBINDFRAGMENTSHADERATIPROC __glewBindFragmentShaderATI; +GLEW_FUN_EXPORT PFNGLCOLORFRAGMENTOP1ATIPROC __glewColorFragmentOp1ATI; +GLEW_FUN_EXPORT PFNGLCOLORFRAGMENTOP2ATIPROC __glewColorFragmentOp2ATI; +GLEW_FUN_EXPORT PFNGLCOLORFRAGMENTOP3ATIPROC __glewColorFragmentOp3ATI; +GLEW_FUN_EXPORT PFNGLDELETEFRAGMENTSHADERATIPROC __glewDeleteFragmentShaderATI; +GLEW_FUN_EXPORT PFNGLENDFRAGMENTSHADERATIPROC __glewEndFragmentShaderATI; +GLEW_FUN_EXPORT PFNGLGENFRAGMENTSHADERSATIPROC __glewGenFragmentShadersATI; +GLEW_FUN_EXPORT PFNGLPASSTEXCOORDATIPROC __glewPassTexCoordATI; +GLEW_FUN_EXPORT PFNGLSAMPLEMAPATIPROC __glewSampleMapATI; +GLEW_FUN_EXPORT PFNGLSETFRAGMENTSHADERCONSTANTATIPROC __glewSetFragmentShaderConstantATI; + +GLEW_FUN_EXPORT PFNGLMAPOBJECTBUFFERATIPROC __glewMapObjectBufferATI; +GLEW_FUN_EXPORT PFNGLUNMAPOBJECTBUFFERATIPROC __glewUnmapObjectBufferATI; + +GLEW_FUN_EXPORT PFNGLPNTRIANGLESFATIPROC __glPNTrianglewesfATI; +GLEW_FUN_EXPORT PFNGLPNTRIANGLESIATIPROC __glPNTrianglewesiATI; + +GLEW_FUN_EXPORT PFNGLSTENCILFUNCSEPARATEATIPROC __glewStencilFuncSeparateATI; +GLEW_FUN_EXPORT PFNGLSTENCILOPSEPARATEATIPROC __glewStencilOpSeparateATI; + +GLEW_FUN_EXPORT PFNGLARRAYOBJECTATIPROC __glewArrayObjectATI; +GLEW_FUN_EXPORT PFNGLFREEOBJECTBUFFERATIPROC __glewFreeObjectBufferATI; +GLEW_FUN_EXPORT PFNGLGETARRAYOBJECTFVATIPROC __glewGetArrayObjectfvATI; +GLEW_FUN_EXPORT PFNGLGETARRAYOBJECTIVATIPROC __glewGetArrayObjectivATI; +GLEW_FUN_EXPORT PFNGLGETOBJECTBUFFERFVATIPROC __glewGetObjectBufferfvATI; +GLEW_FUN_EXPORT PFNGLGETOBJECTBUFFERIVATIPROC __glewGetObjectBufferivATI; +GLEW_FUN_EXPORT PFNGLGETVARIANTARRAYOBJECTFVATIPROC __glewGetVariantArrayObjectfvATI; +GLEW_FUN_EXPORT PFNGLGETVARIANTARRAYOBJECTIVATIPROC __glewGetVariantArrayObjectivATI; +GLEW_FUN_EXPORT PFNGLISOBJECTBUFFERATIPROC __glewIsObjectBufferATI; +GLEW_FUN_EXPORT PFNGLNEWOBJECTBUFFERATIPROC __glewNewObjectBufferATI; +GLEW_FUN_EXPORT PFNGLUPDATEOBJECTBUFFERATIPROC __glewUpdateObjectBufferATI; +GLEW_FUN_EXPORT PFNGLVARIANTARRAYOBJECTATIPROC __glewVariantArrayObjectATI; + +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC __glewGetVertexAttribArrayObjectfvATI; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC __glewGetVertexAttribArrayObjectivATI; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBARRAYOBJECTATIPROC __glewVertexAttribArrayObjectATI; + +GLEW_FUN_EXPORT PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC __glewClientActiveVertexStreamATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3BATIPROC __glewNormalStream3bATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3BVATIPROC __glewNormalStream3bvATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3DATIPROC __glewNormalStream3dATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3DVATIPROC __glewNormalStream3dvATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3FATIPROC __glewNormalStream3fATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3FVATIPROC __glewNormalStream3fvATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3IATIPROC __glewNormalStream3iATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3IVATIPROC __glewNormalStream3ivATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3SATIPROC __glewNormalStream3sATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3SVATIPROC __glewNormalStream3svATI; +GLEW_FUN_EXPORT PFNGLVERTEXBLENDENVFATIPROC __glewVertexBlendEnvfATI; +GLEW_FUN_EXPORT PFNGLVERTEXBLENDENVIATIPROC __glewVertexBlendEnviATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2DATIPROC __glewVertexStream2dATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2DVATIPROC __glewVertexStream2dvATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2FATIPROC __glewVertexStream2fATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2FVATIPROC __glewVertexStream2fvATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2IATIPROC __glewVertexStream2iATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2IVATIPROC __glewVertexStream2ivATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2SATIPROC __glewVertexStream2sATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2SVATIPROC __glewVertexStream2svATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3DATIPROC __glewVertexStream3dATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3DVATIPROC __glewVertexStream3dvATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3FATIPROC __glewVertexStream3fATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3FVATIPROC __glewVertexStream3fvATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3IATIPROC __glewVertexStream3iATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3IVATIPROC __glewVertexStream3ivATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3SATIPROC __glewVertexStream3sATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3SVATIPROC __glewVertexStream3svATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4DATIPROC __glewVertexStream4dATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4DVATIPROC __glewVertexStream4dvATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4FATIPROC __glewVertexStream4fATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4FVATIPROC __glewVertexStream4fvATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4IATIPROC __glewVertexStream4iATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4IVATIPROC __glewVertexStream4ivATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4SATIPROC __glewVertexStream4sATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4SVATIPROC __glewVertexStream4svATI; + +GLEW_FUN_EXPORT PFNGLGETUNIFORMBUFFERSIZEEXTPROC __glewGetUniformBufferSizeEXT; +GLEW_FUN_EXPORT PFNGLGETUNIFORMOFFSETEXTPROC __glewGetUniformOffsetEXT; +GLEW_FUN_EXPORT PFNGLUNIFORMBUFFEREXTPROC __glewUniformBufferEXT; + +GLEW_FUN_EXPORT PFNGLBLENDCOLOREXTPROC __glewBlendColorEXT; + +GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEEXTPROC __glewBlendEquationSeparateEXT; + +GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEEXTPROC __glewBlendFuncSeparateEXT; + +GLEW_FUN_EXPORT PFNGLBLENDEQUATIONEXTPROC __glewBlendEquationEXT; + +GLEW_FUN_EXPORT PFNGLCOLORSUBTABLEEXTPROC __glewColorSubTableEXT; +GLEW_FUN_EXPORT PFNGLCOPYCOLORSUBTABLEEXTPROC __glewCopyColorSubTableEXT; + +GLEW_FUN_EXPORT PFNGLLOCKARRAYSEXTPROC __glewLockArraysEXT; +GLEW_FUN_EXPORT PFNGLUNLOCKARRAYSEXTPROC __glewUnlockArraysEXT; + +GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER1DEXTPROC __glewConvolutionFilter1DEXT; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER2DEXTPROC __glewConvolutionFilter2DEXT; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFEXTPROC __glewConvolutionParameterfEXT; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFVEXTPROC __glewConvolutionParameterfvEXT; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIEXTPROC __glewConvolutionParameteriEXT; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIVEXTPROC __glewConvolutionParameterivEXT; +GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC __glewCopyConvolutionFilter1DEXT; +GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC __glewCopyConvolutionFilter2DEXT; +GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONFILTEREXTPROC __glewGetConvolutionFilterEXT; +GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC __glewGetConvolutionParameterfvEXT; +GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC __glewGetConvolutionParameterivEXT; +GLEW_FUN_EXPORT PFNGLGETSEPARABLEFILTEREXTPROC __glewGetSeparableFilterEXT; +GLEW_FUN_EXPORT PFNGLSEPARABLEFILTER2DEXTPROC __glewSeparableFilter2DEXT; + +GLEW_FUN_EXPORT PFNGLBINORMALPOINTEREXTPROC __glewBinormalPointerEXT; +GLEW_FUN_EXPORT PFNGLTANGENTPOINTEREXTPROC __glewTangentPointerEXT; + +GLEW_FUN_EXPORT PFNGLCOPYTEXIMAGE1DEXTPROC __glewCopyTexImage1DEXT; +GLEW_FUN_EXPORT PFNGLCOPYTEXIMAGE2DEXTPROC __glewCopyTexImage2DEXT; +GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE1DEXTPROC __glewCopyTexSubImage1DEXT; +GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE2DEXTPROC __glewCopyTexSubImage2DEXT; +GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE3DEXTPROC __glewCopyTexSubImage3DEXT; + +GLEW_FUN_EXPORT PFNGLCULLPARAMETERDVEXTPROC __glewCullParameterdvEXT; +GLEW_FUN_EXPORT PFNGLCULLPARAMETERFVEXTPROC __glewCullParameterfvEXT; + +GLEW_FUN_EXPORT PFNGLDEPTHBOUNDSEXTPROC __glewDepthBoundsEXT; + +GLEW_FUN_EXPORT PFNGLCOLORMASKINDEXEDEXTPROC __glewColorMaskIndexedEXT; +GLEW_FUN_EXPORT PFNGLDISABLEINDEXEDEXTPROC __glewDisableIndexedEXT; +GLEW_FUN_EXPORT PFNGLENABLEINDEXEDEXTPROC __glewEnableIndexedEXT; +GLEW_FUN_EXPORT PFNGLGETBOOLEANINDEXEDVEXTPROC __glewGetBooleanIndexedvEXT; +GLEW_FUN_EXPORT PFNGLGETINTEGERINDEXEDVEXTPROC __glewGetIntegerIndexedvEXT; +GLEW_FUN_EXPORT PFNGLISENABLEDINDEXEDEXTPROC __glewIsEnabledIndexedEXT; + +GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDEXTPROC __glewDrawArraysInstancedEXT; +GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDEXTPROC __glewDrawElementsInstancedEXT; + +GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTSEXTPROC __glewDrawRangeElementsEXT; + +GLEW_FUN_EXPORT PFNGLFOGCOORDPOINTEREXTPROC __glewFogCoordPointerEXT; +GLEW_FUN_EXPORT PFNGLFOGCOORDDEXTPROC __glewFogCoorddEXT; +GLEW_FUN_EXPORT PFNGLFOGCOORDDVEXTPROC __glewFogCoorddvEXT; +GLEW_FUN_EXPORT PFNGLFOGCOORDFEXTPROC __glewFogCoordfEXT; +GLEW_FUN_EXPORT PFNGLFOGCOORDFVEXTPROC __glewFogCoordfvEXT; + +GLEW_FUN_EXPORT PFNGLFRAGMENTCOLORMATERIALEXTPROC __glewFragmentColorMaterialEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFEXTPROC __glewFragmentLightModelfEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFVEXTPROC __glewFragmentLightModelfvEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELIEXTPROC __glewFragmentLightModeliEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELIVEXTPROC __glewFragmentLightModelivEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFEXTPROC __glewFragmentLightfEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFVEXTPROC __glewFragmentLightfvEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTIEXTPROC __glewFragmentLightiEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTIVEXTPROC __glewFragmentLightivEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFEXTPROC __glewFragmentMaterialfEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFVEXTPROC __glewFragmentMaterialfvEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALIEXTPROC __glewFragmentMaterialiEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALIVEXTPROC __glewFragmentMaterialivEXT; +GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTFVEXTPROC __glewGetFragmentLightfvEXT; +GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTIVEXTPROC __glewGetFragmentLightivEXT; +GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALFVEXTPROC __glewGetFragmentMaterialfvEXT; +GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALIVEXTPROC __glewGetFragmentMaterialivEXT; +GLEW_FUN_EXPORT PFNGLLIGHTENVIEXTPROC __glewLightEnviEXT; + +GLEW_FUN_EXPORT PFNGLBLITFRAMEBUFFEREXTPROC __glewBlitFramebufferEXT; + +GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __glewRenderbufferStorageMultisampleEXT; + +GLEW_FUN_EXPORT PFNGLBINDFRAMEBUFFEREXTPROC __glewBindFramebufferEXT; +GLEW_FUN_EXPORT PFNGLBINDRENDERBUFFEREXTPROC __glewBindRenderbufferEXT; +GLEW_FUN_EXPORT PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC __glewCheckFramebufferStatusEXT; +GLEW_FUN_EXPORT PFNGLDELETEFRAMEBUFFERSEXTPROC __glewDeleteFramebuffersEXT; +GLEW_FUN_EXPORT PFNGLDELETERENDERBUFFERSEXTPROC __glewDeleteRenderbuffersEXT; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC __glewFramebufferRenderbufferEXT; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE1DEXTPROC __glewFramebufferTexture1DEXT; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE2DEXTPROC __glewFramebufferTexture2DEXT; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE3DEXTPROC __glewFramebufferTexture3DEXT; +GLEW_FUN_EXPORT PFNGLGENFRAMEBUFFERSEXTPROC __glewGenFramebuffersEXT; +GLEW_FUN_EXPORT PFNGLGENRENDERBUFFERSEXTPROC __glewGenRenderbuffersEXT; +GLEW_FUN_EXPORT PFNGLGENERATEMIPMAPEXTPROC __glewGenerateMipmapEXT; +GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC __glewGetFramebufferAttachmentParameterivEXT; +GLEW_FUN_EXPORT PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC __glewGetRenderbufferParameterivEXT; +GLEW_FUN_EXPORT PFNGLISFRAMEBUFFEREXTPROC __glewIsFramebufferEXT; +GLEW_FUN_EXPORT PFNGLISRENDERBUFFEREXTPROC __glewIsRenderbufferEXT; +GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEEXTPROC __glewRenderbufferStorageEXT; + +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREEXTPROC __glewFramebufferTextureEXT; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC __glewFramebufferTextureFaceEXT; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC __glewFramebufferTextureLayerEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERIEXTPROC __glewProgramParameteriEXT; + +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERS4FVEXTPROC __glewProgramEnvParameters4fvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC __glewProgramLocalParameters4fvEXT; + +GLEW_FUN_EXPORT PFNGLBINDFRAGDATALOCATIONEXTPROC __glewBindFragDataLocationEXT; +GLEW_FUN_EXPORT PFNGLGETFRAGDATALOCATIONEXTPROC __glewGetFragDataLocationEXT; +GLEW_FUN_EXPORT PFNGLGETUNIFORMUIVEXTPROC __glewGetUniformuivEXT; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIIVEXTPROC __glewGetVertexAttribIivEXT; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIUIVEXTPROC __glewGetVertexAttribIuivEXT; +GLEW_FUN_EXPORT PFNGLUNIFORM1UIEXTPROC __glewUniform1uiEXT; +GLEW_FUN_EXPORT PFNGLUNIFORM1UIVEXTPROC __glewUniform1uivEXT; +GLEW_FUN_EXPORT PFNGLUNIFORM2UIEXTPROC __glewUniform2uiEXT; +GLEW_FUN_EXPORT PFNGLUNIFORM2UIVEXTPROC __glewUniform2uivEXT; +GLEW_FUN_EXPORT PFNGLUNIFORM3UIEXTPROC __glewUniform3uiEXT; +GLEW_FUN_EXPORT PFNGLUNIFORM3UIVEXTPROC __glewUniform3uivEXT; +GLEW_FUN_EXPORT PFNGLUNIFORM4UIEXTPROC __glewUniform4uiEXT; +GLEW_FUN_EXPORT PFNGLUNIFORM4UIVEXTPROC __glewUniform4uivEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1IEXTPROC __glewVertexAttribI1iEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1IVEXTPROC __glewVertexAttribI1ivEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1UIEXTPROC __glewVertexAttribI1uiEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1UIVEXTPROC __glewVertexAttribI1uivEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2IEXTPROC __glewVertexAttribI2iEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2IVEXTPROC __glewVertexAttribI2ivEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2UIEXTPROC __glewVertexAttribI2uiEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2UIVEXTPROC __glewVertexAttribI2uivEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3IEXTPROC __glewVertexAttribI3iEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3IVEXTPROC __glewVertexAttribI3ivEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3UIEXTPROC __glewVertexAttribI3uiEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3UIVEXTPROC __glewVertexAttribI3uivEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4BVEXTPROC __glewVertexAttribI4bvEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4IEXTPROC __glewVertexAttribI4iEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4IVEXTPROC __glewVertexAttribI4ivEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4SVEXTPROC __glewVertexAttribI4svEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UBVEXTPROC __glewVertexAttribI4ubvEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UIEXTPROC __glewVertexAttribI4uiEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UIVEXTPROC __glewVertexAttribI4uivEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4USVEXTPROC __glewVertexAttribI4usvEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBIPOINTEREXTPROC __glewVertexAttribIPointerEXT; + +GLEW_FUN_EXPORT PFNGLGETHISTOGRAMEXTPROC __glewGetHistogramEXT; +GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERFVEXTPROC __glewGetHistogramParameterfvEXT; +GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERIVEXTPROC __glewGetHistogramParameterivEXT; +GLEW_FUN_EXPORT PFNGLGETMINMAXEXTPROC __glewGetMinmaxEXT; +GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERFVEXTPROC __glewGetMinmaxParameterfvEXT; +GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERIVEXTPROC __glewGetMinmaxParameterivEXT; +GLEW_FUN_EXPORT PFNGLHISTOGRAMEXTPROC __glewHistogramEXT; +GLEW_FUN_EXPORT PFNGLMINMAXEXTPROC __glewMinmaxEXT; +GLEW_FUN_EXPORT PFNGLRESETHISTOGRAMEXTPROC __glewResetHistogramEXT; +GLEW_FUN_EXPORT PFNGLRESETMINMAXEXTPROC __glewResetMinmaxEXT; + +GLEW_FUN_EXPORT PFNGLINDEXFUNCEXTPROC __glewIndexFuncEXT; + +GLEW_FUN_EXPORT PFNGLINDEXMATERIALEXTPROC __glewIndexMaterialEXT; + +GLEW_FUN_EXPORT PFNGLAPPLYTEXTUREEXTPROC __glewApplyTextureEXT; +GLEW_FUN_EXPORT PFNGLTEXTURELIGHTEXTPROC __glewTextureLightEXT; +GLEW_FUN_EXPORT PFNGLTEXTUREMATERIALEXTPROC __glewTextureMaterialEXT; + +GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSEXTPROC __glewMultiDrawArraysEXT; +GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSEXTPROC __glewMultiDrawElementsEXT; + +GLEW_FUN_EXPORT PFNGLSAMPLEMASKEXTPROC __glewSampleMaskEXT; +GLEW_FUN_EXPORT PFNGLSAMPLEPATTERNEXTPROC __glewSamplePatternEXT; + +GLEW_FUN_EXPORT PFNGLCOLORTABLEEXTPROC __glewColorTableEXT; +GLEW_FUN_EXPORT PFNGLGETCOLORTABLEEXTPROC __glewGetColorTableEXT; +GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERFVEXTPROC __glewGetColorTableParameterfvEXT; +GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERIVEXTPROC __glewGetColorTableParameterivEXT; + +GLEW_FUN_EXPORT PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC __glewGetPixelTransformParameterfvEXT; +GLEW_FUN_EXPORT PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC __glewGetPixelTransformParameterivEXT; +GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERFEXTPROC __glewPixelTransformParameterfEXT; +GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC __glewPixelTransformParameterfvEXT; +GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERIEXTPROC __glewPixelTransformParameteriEXT; +GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC __glewPixelTransformParameterivEXT; + +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFEXTPROC __glewPointParameterfEXT; +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFVEXTPROC __glewPointParameterfvEXT; + +GLEW_FUN_EXPORT PFNGLPOLYGONOFFSETEXTPROC __glewPolygonOffsetEXT; + +GLEW_FUN_EXPORT PFNGLBEGINSCENEEXTPROC __glewBeginSceneEXT; +GLEW_FUN_EXPORT PFNGLENDSCENEEXTPROC __glewEndSceneEXT; + +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BEXTPROC __glewSecondaryColor3bEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BVEXTPROC __glewSecondaryColor3bvEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DEXTPROC __glewSecondaryColor3dEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DVEXTPROC __glewSecondaryColor3dvEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FEXTPROC __glewSecondaryColor3fEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FVEXTPROC __glewSecondaryColor3fvEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IEXTPROC __glewSecondaryColor3iEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IVEXTPROC __glewSecondaryColor3ivEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SEXTPROC __glewSecondaryColor3sEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SVEXTPROC __glewSecondaryColor3svEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBEXTPROC __glewSecondaryColor3ubEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBVEXTPROC __glewSecondaryColor3ubvEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIEXTPROC __glewSecondaryColor3uiEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIVEXTPROC __glewSecondaryColor3uivEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USEXTPROC __glewSecondaryColor3usEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USVEXTPROC __glewSecondaryColor3usvEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLORPOINTEREXTPROC __glewSecondaryColorPointerEXT; + +GLEW_FUN_EXPORT PFNGLACTIVESTENCILFACEEXTPROC __glewActiveStencilFaceEXT; + +GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE1DEXTPROC __glewTexSubImage1DEXT; +GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE2DEXTPROC __glewTexSubImage2DEXT; +GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE3DEXTPROC __glewTexSubImage3DEXT; + +GLEW_FUN_EXPORT PFNGLTEXIMAGE3DEXTPROC __glewTexImage3DEXT; + +GLEW_FUN_EXPORT PFNGLTEXBUFFEREXTPROC __glewTexBufferEXT; + +GLEW_FUN_EXPORT PFNGLCLEARCOLORIIEXTPROC __glewClearColorIiEXT; +GLEW_FUN_EXPORT PFNGLCLEARCOLORIUIEXTPROC __glewClearColorIuiEXT; +GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIIVEXTPROC __glewGetTexParameterIivEXT; +GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIUIVEXTPROC __glewGetTexParameterIuivEXT; +GLEW_FUN_EXPORT PFNGLTEXPARAMETERIIVEXTPROC __glewTexParameterIivEXT; +GLEW_FUN_EXPORT PFNGLTEXPARAMETERIUIVEXTPROC __glewTexParameterIuivEXT; + +GLEW_FUN_EXPORT PFNGLARETEXTURESRESIDENTEXTPROC __glewAreTexturesResidentEXT; +GLEW_FUN_EXPORT PFNGLBINDTEXTUREEXTPROC __glewBindTextureEXT; +GLEW_FUN_EXPORT PFNGLDELETETEXTURESEXTPROC __glewDeleteTexturesEXT; +GLEW_FUN_EXPORT PFNGLGENTEXTURESEXTPROC __glewGenTexturesEXT; +GLEW_FUN_EXPORT PFNGLISTEXTUREEXTPROC __glewIsTextureEXT; +GLEW_FUN_EXPORT PFNGLPRIORITIZETEXTURESEXTPROC __glewPrioritizeTexturesEXT; + +GLEW_FUN_EXPORT PFNGLTEXTURENORMALEXTPROC __glewTextureNormalEXT; + +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTI64VEXTPROC __glewGetQueryObjecti64vEXT; +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUI64VEXTPROC __glewGetQueryObjectui64vEXT; + +GLEW_FUN_EXPORT PFNGLARRAYELEMENTEXTPROC __glewArrayElementEXT; +GLEW_FUN_EXPORT PFNGLCOLORPOINTEREXTPROC __glewColorPointerEXT; +GLEW_FUN_EXPORT PFNGLDRAWARRAYSEXTPROC __glewDrawArraysEXT; +GLEW_FUN_EXPORT PFNGLEDGEFLAGPOINTEREXTPROC __glewEdgeFlagPointerEXT; +GLEW_FUN_EXPORT PFNGLGETPOINTERVEXTPROC __glewGetPointervEXT; +GLEW_FUN_EXPORT PFNGLINDEXPOINTEREXTPROC __glewIndexPointerEXT; +GLEW_FUN_EXPORT PFNGLNORMALPOINTEREXTPROC __glewNormalPointerEXT; +GLEW_FUN_EXPORT PFNGLTEXCOORDPOINTEREXTPROC __glewTexCoordPointerEXT; +GLEW_FUN_EXPORT PFNGLVERTEXPOINTEREXTPROC __glewVertexPointerEXT; + +GLEW_FUN_EXPORT PFNGLBEGINVERTEXSHADEREXTPROC __glewBeginVertexShaderEXT; +GLEW_FUN_EXPORT PFNGLBINDLIGHTPARAMETEREXTPROC __glewBindLightParameterEXT; +GLEW_FUN_EXPORT PFNGLBINDMATERIALPARAMETEREXTPROC __glewBindMaterialParameterEXT; +GLEW_FUN_EXPORT PFNGLBINDPARAMETEREXTPROC __glewBindParameterEXT; +GLEW_FUN_EXPORT PFNGLBINDTEXGENPARAMETEREXTPROC __glewBindTexGenParameterEXT; +GLEW_FUN_EXPORT PFNGLBINDTEXTUREUNITPARAMETEREXTPROC __glewBindTextureUnitParameterEXT; +GLEW_FUN_EXPORT PFNGLBINDVERTEXSHADEREXTPROC __glewBindVertexShaderEXT; +GLEW_FUN_EXPORT PFNGLDELETEVERTEXSHADEREXTPROC __glewDeleteVertexShaderEXT; +GLEW_FUN_EXPORT PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC __glewDisableVariantClientStateEXT; +GLEW_FUN_EXPORT PFNGLENABLEVARIANTCLIENTSTATEEXTPROC __glewEnableVariantClientStateEXT; +GLEW_FUN_EXPORT PFNGLENDVERTEXSHADEREXTPROC __glewEndVertexShaderEXT; +GLEW_FUN_EXPORT PFNGLEXTRACTCOMPONENTEXTPROC __glewExtractComponentEXT; +GLEW_FUN_EXPORT PFNGLGENSYMBOLSEXTPROC __glewGenSymbolsEXT; +GLEW_FUN_EXPORT PFNGLGENVERTEXSHADERSEXTPROC __glewGenVertexShadersEXT; +GLEW_FUN_EXPORT PFNGLGETINVARIANTBOOLEANVEXTPROC __glewGetInvariantBooleanvEXT; +GLEW_FUN_EXPORT PFNGLGETINVARIANTFLOATVEXTPROC __glewGetInvariantFloatvEXT; +GLEW_FUN_EXPORT PFNGLGETINVARIANTINTEGERVEXTPROC __glewGetInvariantIntegervEXT; +GLEW_FUN_EXPORT PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC __glewGetLocalConstantBooleanvEXT; +GLEW_FUN_EXPORT PFNGLGETLOCALCONSTANTFLOATVEXTPROC __glewGetLocalConstantFloatvEXT; +GLEW_FUN_EXPORT PFNGLGETLOCALCONSTANTINTEGERVEXTPROC __glewGetLocalConstantIntegervEXT; +GLEW_FUN_EXPORT PFNGLGETVARIANTBOOLEANVEXTPROC __glewGetVariantBooleanvEXT; +GLEW_FUN_EXPORT PFNGLGETVARIANTFLOATVEXTPROC __glewGetVariantFloatvEXT; +GLEW_FUN_EXPORT PFNGLGETVARIANTINTEGERVEXTPROC __glewGetVariantIntegervEXT; +GLEW_FUN_EXPORT PFNGLGETVARIANTPOINTERVEXTPROC __glewGetVariantPointervEXT; +GLEW_FUN_EXPORT PFNGLINSERTCOMPONENTEXTPROC __glewInsertComponentEXT; +GLEW_FUN_EXPORT PFNGLISVARIANTENABLEDEXTPROC __glewIsVariantEnabledEXT; +GLEW_FUN_EXPORT PFNGLSETINVARIANTEXTPROC __glewSetInvariantEXT; +GLEW_FUN_EXPORT PFNGLSETLOCALCONSTANTEXTPROC __glewSetLocalConstantEXT; +GLEW_FUN_EXPORT PFNGLSHADEROP1EXTPROC __glewShaderOp1EXT; +GLEW_FUN_EXPORT PFNGLSHADEROP2EXTPROC __glewShaderOp2EXT; +GLEW_FUN_EXPORT PFNGLSHADEROP3EXTPROC __glewShaderOp3EXT; +GLEW_FUN_EXPORT PFNGLSWIZZLEEXTPROC __glewSwizzleEXT; +GLEW_FUN_EXPORT PFNGLVARIANTPOINTEREXTPROC __glewVariantPointerEXT; +GLEW_FUN_EXPORT PFNGLVARIANTBVEXTPROC __glewVariantbvEXT; +GLEW_FUN_EXPORT PFNGLVARIANTDVEXTPROC __glewVariantdvEXT; +GLEW_FUN_EXPORT PFNGLVARIANTFVEXTPROC __glewVariantfvEXT; +GLEW_FUN_EXPORT PFNGLVARIANTIVEXTPROC __glewVariantivEXT; +GLEW_FUN_EXPORT PFNGLVARIANTSVEXTPROC __glewVariantsvEXT; +GLEW_FUN_EXPORT PFNGLVARIANTUBVEXTPROC __glewVariantubvEXT; +GLEW_FUN_EXPORT PFNGLVARIANTUIVEXTPROC __glewVariantuivEXT; +GLEW_FUN_EXPORT PFNGLVARIANTUSVEXTPROC __glewVariantusvEXT; +GLEW_FUN_EXPORT PFNGLWRITEMASKEXTPROC __glewWriteMaskEXT; + +GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTPOINTEREXTPROC __glewVertexWeightPointerEXT; +GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTFEXTPROC __glewVertexWeightfEXT; +GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTFVEXTPROC __glewVertexWeightfvEXT; + +GLEW_FUN_EXPORT PFNGLSTRINGMARKERGREMEDYPROC __glewStringMarkerGREMEDY; + +GLEW_FUN_EXPORT PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC __glewGetImageTransformParameterfvHP; +GLEW_FUN_EXPORT PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC __glewGetImageTransformParameterivHP; +GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERFHPPROC __glewImageTransformParameterfHP; +GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERFVHPPROC __glewImageTransformParameterfvHP; +GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERIHPPROC __glewImageTransformParameteriHP; +GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERIVHPPROC __glewImageTransformParameterivHP; + +GLEW_FUN_EXPORT PFNGLMULTIMODEDRAWARRAYSIBMPROC __glewMultiModeDrawArraysIBM; +GLEW_FUN_EXPORT PFNGLMULTIMODEDRAWELEMENTSIBMPROC __glewMultiModeDrawElementsIBM; + +GLEW_FUN_EXPORT PFNGLCOLORPOINTERLISTIBMPROC __glewColorPointerListIBM; +GLEW_FUN_EXPORT PFNGLEDGEFLAGPOINTERLISTIBMPROC __glewEdgeFlagPointerListIBM; +GLEW_FUN_EXPORT PFNGLFOGCOORDPOINTERLISTIBMPROC __glewFogCoordPointerListIBM; +GLEW_FUN_EXPORT PFNGLINDEXPOINTERLISTIBMPROC __glewIndexPointerListIBM; +GLEW_FUN_EXPORT PFNGLNORMALPOINTERLISTIBMPROC __glewNormalPointerListIBM; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLORPOINTERLISTIBMPROC __glewSecondaryColorPointerListIBM; +GLEW_FUN_EXPORT PFNGLTEXCOORDPOINTERLISTIBMPROC __glewTexCoordPointerListIBM; +GLEW_FUN_EXPORT PFNGLVERTEXPOINTERLISTIBMPROC __glewVertexPointerListIBM; + +GLEW_FUN_EXPORT PFNGLCOLORPOINTERVINTELPROC __glewColorPointervINTEL; +GLEW_FUN_EXPORT PFNGLNORMALPOINTERVINTELPROC __glewNormalPointervINTEL; +GLEW_FUN_EXPORT PFNGLTEXCOORDPOINTERVINTELPROC __glewTexCoordPointervINTEL; +GLEW_FUN_EXPORT PFNGLVERTEXPOINTERVINTELPROC __glewVertexPointervINTEL; + +GLEW_FUN_EXPORT PFNGLTEXSCISSORFUNCINTELPROC __glewTexScissorFuncINTEL; +GLEW_FUN_EXPORT PFNGLTEXSCISSORINTELPROC __glewTexScissorINTEL; + +GLEW_FUN_EXPORT PFNGLBUFFERREGIONENABLEDEXTPROC __glewBufferRegionEnabledEXT; +GLEW_FUN_EXPORT PFNGLDELETEBUFFERREGIONEXTPROC __glewDeleteBufferRegionEXT; +GLEW_FUN_EXPORT PFNGLDRAWBUFFERREGIONEXTPROC __glewDrawBufferRegionEXT; +GLEW_FUN_EXPORT PFNGLNEWBUFFERREGIONEXTPROC __glewNewBufferRegionEXT; +GLEW_FUN_EXPORT PFNGLREADBUFFERREGIONEXTPROC __glewReadBufferRegionEXT; + +GLEW_FUN_EXPORT PFNGLRESIZEBUFFERSMESAPROC __glewResizeBuffersMESA; + +GLEW_FUN_EXPORT PFNGLWINDOWPOS2DMESAPROC __glewWindowPos2dMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2DVMESAPROC __glewWindowPos2dvMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2FMESAPROC __glewWindowPos2fMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2FVMESAPROC __glewWindowPos2fvMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2IMESAPROC __glewWindowPos2iMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2IVMESAPROC __glewWindowPos2ivMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2SMESAPROC __glewWindowPos2sMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2SVMESAPROC __glewWindowPos2svMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3DMESAPROC __glewWindowPos3dMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3DVMESAPROC __glewWindowPos3dvMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3FMESAPROC __glewWindowPos3fMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3FVMESAPROC __glewWindowPos3fvMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3IMESAPROC __glewWindowPos3iMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3IVMESAPROC __glewWindowPos3ivMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3SMESAPROC __glewWindowPos3sMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3SVMESAPROC __glewWindowPos3svMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS4DMESAPROC __glewWindowPos4dMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS4DVMESAPROC __glewWindowPos4dvMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS4FMESAPROC __glewWindowPos4fMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS4FVMESAPROC __glewWindowPos4fvMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS4IMESAPROC __glewWindowPos4iMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS4IVMESAPROC __glewWindowPos4ivMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS4SMESAPROC __glewWindowPos4sMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS4SVMESAPROC __glewWindowPos4svMESA; + +GLEW_FUN_EXPORT PFNGLCLEARDEPTHDNVPROC __glewClearDepthdNV; +GLEW_FUN_EXPORT PFNGLDEPTHBOUNDSDNVPROC __glewDepthBoundsdNV; +GLEW_FUN_EXPORT PFNGLDEPTHRANGEDNVPROC __glewDepthRangedNV; + +GLEW_FUN_EXPORT PFNGLEVALMAPSNVPROC __glewEvalMapsNV; +GLEW_FUN_EXPORT PFNGLGETMAPATTRIBPARAMETERFVNVPROC __glewGetMapAttribParameterfvNV; +GLEW_FUN_EXPORT PFNGLGETMAPATTRIBPARAMETERIVNVPROC __glewGetMapAttribParameterivNV; +GLEW_FUN_EXPORT PFNGLGETMAPCONTROLPOINTSNVPROC __glewGetMapControlPointsNV; +GLEW_FUN_EXPORT PFNGLGETMAPPARAMETERFVNVPROC __glewGetMapParameterfvNV; +GLEW_FUN_EXPORT PFNGLGETMAPPARAMETERIVNVPROC __glewGetMapParameterivNV; +GLEW_FUN_EXPORT PFNGLMAPCONTROLPOINTSNVPROC __glewMapControlPointsNV; +GLEW_FUN_EXPORT PFNGLMAPPARAMETERFVNVPROC __glewMapParameterfvNV; +GLEW_FUN_EXPORT PFNGLMAPPARAMETERIVNVPROC __glewMapParameterivNV; + +GLEW_FUN_EXPORT PFNGLDELETEFENCESNVPROC __glewDeleteFencesNV; +GLEW_FUN_EXPORT PFNGLFINISHFENCENVPROC __glewFinishFenceNV; +GLEW_FUN_EXPORT PFNGLGENFENCESNVPROC __glewGenFencesNV; +GLEW_FUN_EXPORT PFNGLGETFENCEIVNVPROC __glewGetFenceivNV; +GLEW_FUN_EXPORT PFNGLISFENCENVPROC __glewIsFenceNV; +GLEW_FUN_EXPORT PFNGLSETFENCENVPROC __glewSetFenceNV; +GLEW_FUN_EXPORT PFNGLTESTFENCENVPROC __glewTestFenceNV; + +GLEW_FUN_EXPORT PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC __glewGetProgramNamedParameterdvNV; +GLEW_FUN_EXPORT PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC __glewGetProgramNamedParameterfvNV; +GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4DNVPROC __glewProgramNamedParameter4dNV; +GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC __glewProgramNamedParameter4dvNV; +GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4FNVPROC __glewProgramNamedParameter4fNV; +GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC __glewProgramNamedParameter4fvNV; + +GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC __glewRenderbufferStorageMultisampleCoverageNV; + +GLEW_FUN_EXPORT PFNGLPROGRAMVERTEXLIMITNVPROC __glewProgramVertexLimitNV; + +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4INVPROC __glewProgramEnvParameterI4iNV; +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4IVNVPROC __glewProgramEnvParameterI4ivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4UINVPROC __glewProgramEnvParameterI4uiNV; +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4UIVNVPROC __glewProgramEnvParameterI4uivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERSI4IVNVPROC __glewProgramEnvParametersI4ivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC __glewProgramEnvParametersI4uivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4INVPROC __glewProgramLocalParameterI4iNV; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC __glewProgramLocalParameterI4ivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4UINVPROC __glewProgramLocalParameterI4uiNV; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC __glewProgramLocalParameterI4uivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC __glewProgramLocalParametersI4ivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC __glewProgramLocalParametersI4uivNV; + +GLEW_FUN_EXPORT PFNGLCOLOR3HNVPROC __glewColor3hNV; +GLEW_FUN_EXPORT PFNGLCOLOR3HVNVPROC __glewColor3hvNV; +GLEW_FUN_EXPORT PFNGLCOLOR4HNVPROC __glewColor4hNV; +GLEW_FUN_EXPORT PFNGLCOLOR4HVNVPROC __glewColor4hvNV; +GLEW_FUN_EXPORT PFNGLFOGCOORDHNVPROC __glewFogCoordhNV; +GLEW_FUN_EXPORT PFNGLFOGCOORDHVNVPROC __glewFogCoordhvNV; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1HNVPROC __glewMultiTexCoord1hNV; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1HVNVPROC __glewMultiTexCoord1hvNV; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2HNVPROC __glewMultiTexCoord2hNV; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2HVNVPROC __glewMultiTexCoord2hvNV; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3HNVPROC __glewMultiTexCoord3hNV; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3HVNVPROC __glewMultiTexCoord3hvNV; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4HNVPROC __glewMultiTexCoord4hNV; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4HVNVPROC __glewMultiTexCoord4hvNV; +GLEW_FUN_EXPORT PFNGLNORMAL3HNVPROC __glewNormal3hNV; +GLEW_FUN_EXPORT PFNGLNORMAL3HVNVPROC __glewNormal3hvNV; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3HNVPROC __glewSecondaryColor3hNV; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3HVNVPROC __glewSecondaryColor3hvNV; +GLEW_FUN_EXPORT PFNGLTEXCOORD1HNVPROC __glewTexCoord1hNV; +GLEW_FUN_EXPORT PFNGLTEXCOORD1HVNVPROC __glewTexCoord1hvNV; +GLEW_FUN_EXPORT PFNGLTEXCOORD2HNVPROC __glewTexCoord2hNV; +GLEW_FUN_EXPORT PFNGLTEXCOORD2HVNVPROC __glewTexCoord2hvNV; +GLEW_FUN_EXPORT PFNGLTEXCOORD3HNVPROC __glewTexCoord3hNV; +GLEW_FUN_EXPORT PFNGLTEXCOORD3HVNVPROC __glewTexCoord3hvNV; +GLEW_FUN_EXPORT PFNGLTEXCOORD4HNVPROC __glewTexCoord4hNV; +GLEW_FUN_EXPORT PFNGLTEXCOORD4HVNVPROC __glewTexCoord4hvNV; +GLEW_FUN_EXPORT PFNGLVERTEX2HNVPROC __glewVertex2hNV; +GLEW_FUN_EXPORT PFNGLVERTEX2HVNVPROC __glewVertex2hvNV; +GLEW_FUN_EXPORT PFNGLVERTEX3HNVPROC __glewVertex3hNV; +GLEW_FUN_EXPORT PFNGLVERTEX3HVNVPROC __glewVertex3hvNV; +GLEW_FUN_EXPORT PFNGLVERTEX4HNVPROC __glewVertex4hNV; +GLEW_FUN_EXPORT PFNGLVERTEX4HVNVPROC __glewVertex4hvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1HNVPROC __glewVertexAttrib1hNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1HVNVPROC __glewVertexAttrib1hvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2HNVPROC __glewVertexAttrib2hNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2HVNVPROC __glewVertexAttrib2hvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3HNVPROC __glewVertexAttrib3hNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3HVNVPROC __glewVertexAttrib3hvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4HNVPROC __glewVertexAttrib4hNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4HVNVPROC __glewVertexAttrib4hvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1HVNVPROC __glewVertexAttribs1hvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2HVNVPROC __glewVertexAttribs2hvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3HVNVPROC __glewVertexAttribs3hvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4HVNVPROC __glewVertexAttribs4hvNV; +GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTHNVPROC __glewVertexWeighthNV; +GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTHVNVPROC __glewVertexWeighthvNV; + +GLEW_FUN_EXPORT PFNGLBEGINOCCLUSIONQUERYNVPROC __glewBeginOcclusionQueryNV; +GLEW_FUN_EXPORT PFNGLDELETEOCCLUSIONQUERIESNVPROC __glewDeleteOcclusionQueriesNV; +GLEW_FUN_EXPORT PFNGLENDOCCLUSIONQUERYNVPROC __glewEndOcclusionQueryNV; +GLEW_FUN_EXPORT PFNGLGENOCCLUSIONQUERIESNVPROC __glewGenOcclusionQueriesNV; +GLEW_FUN_EXPORT PFNGLGETOCCLUSIONQUERYIVNVPROC __glewGetOcclusionQueryivNV; +GLEW_FUN_EXPORT PFNGLGETOCCLUSIONQUERYUIVNVPROC __glewGetOcclusionQueryuivNV; +GLEW_FUN_EXPORT PFNGLISOCCLUSIONQUERYNVPROC __glewIsOcclusionQueryNV; + +GLEW_FUN_EXPORT PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC __glewProgramBufferParametersIivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC __glewProgramBufferParametersIuivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC __glewProgramBufferParametersfvNV; + +GLEW_FUN_EXPORT PFNGLFLUSHPIXELDATARANGENVPROC __glewFlushPixelDataRangeNV; +GLEW_FUN_EXPORT PFNGLPIXELDATARANGENVPROC __glewPixelDataRangeNV; + +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERINVPROC __glewPointParameteriNV; +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERIVNVPROC __glewPointParameterivNV; + +GLEW_FUN_EXPORT PFNGLPRIMITIVERESTARTINDEXNVPROC __glewPrimitiveRestartIndexNV; +GLEW_FUN_EXPORT PFNGLPRIMITIVERESTARTNVPROC __glewPrimitiveRestartNV; + +GLEW_FUN_EXPORT PFNGLCOMBINERINPUTNVPROC __glewCombinerInputNV; +GLEW_FUN_EXPORT PFNGLCOMBINEROUTPUTNVPROC __glewCombinerOutputNV; +GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERFNVPROC __glewCombinerParameterfNV; +GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERFVNVPROC __glewCombinerParameterfvNV; +GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERINVPROC __glewCombinerParameteriNV; +GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERIVNVPROC __glewCombinerParameterivNV; +GLEW_FUN_EXPORT PFNGLFINALCOMBINERINPUTNVPROC __glewFinalCombinerInputNV; +GLEW_FUN_EXPORT PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC __glewGetCombinerInputParameterfvNV; +GLEW_FUN_EXPORT PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC __glewGetCombinerInputParameterivNV; +GLEW_FUN_EXPORT PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC __glewGetCombinerOutputParameterfvNV; +GLEW_FUN_EXPORT PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC __glewGetCombinerOutputParameterivNV; +GLEW_FUN_EXPORT PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC __glewGetFinalCombinerInputParameterfvNV; +GLEW_FUN_EXPORT PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC __glewGetFinalCombinerInputParameterivNV; + +GLEW_FUN_EXPORT PFNGLCOMBINERSTAGEPARAMETERFVNVPROC __glewCombinerStageParameterfvNV; +GLEW_FUN_EXPORT PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC __glewGetCombinerStageParameterfvNV; + +GLEW_FUN_EXPORT PFNGLACTIVEVARYINGNVPROC __glewActiveVaryingNV; +GLEW_FUN_EXPORT PFNGLBEGINTRANSFORMFEEDBACKNVPROC __glewBeginTransformFeedbackNV; +GLEW_FUN_EXPORT PFNGLBINDBUFFERBASENVPROC __glewBindBufferBaseNV; +GLEW_FUN_EXPORT PFNGLBINDBUFFEROFFSETNVPROC __glewBindBufferOffsetNV; +GLEW_FUN_EXPORT PFNGLBINDBUFFERRANGENVPROC __glewBindBufferRangeNV; +GLEW_FUN_EXPORT PFNGLENDTRANSFORMFEEDBACKNVPROC __glewEndTransformFeedbackNV; +GLEW_FUN_EXPORT PFNGLGETACTIVEVARYINGNVPROC __glewGetActiveVaryingNV; +GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC __glewGetTransformFeedbackVaryingNV; +GLEW_FUN_EXPORT PFNGLGETVARYINGLOCATIONNVPROC __glewGetVaryingLocationNV; +GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC __glewTransformFeedbackAttribsNV; +GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC __glewTransformFeedbackVaryingsNV; + +GLEW_FUN_EXPORT PFNGLFLUSHVERTEXARRAYRANGENVPROC __glewFlushVertexArrayRangeNV; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYRANGENVPROC __glewVertexArrayRangeNV; + +GLEW_FUN_EXPORT PFNGLAREPROGRAMSRESIDENTNVPROC __glewAreProgramsResidentNV; +GLEW_FUN_EXPORT PFNGLBINDPROGRAMNVPROC __glewBindProgramNV; +GLEW_FUN_EXPORT PFNGLDELETEPROGRAMSNVPROC __glewDeleteProgramsNV; +GLEW_FUN_EXPORT PFNGLEXECUTEPROGRAMNVPROC __glewExecuteProgramNV; +GLEW_FUN_EXPORT PFNGLGENPROGRAMSNVPROC __glewGenProgramsNV; +GLEW_FUN_EXPORT PFNGLGETPROGRAMPARAMETERDVNVPROC __glewGetProgramParameterdvNV; +GLEW_FUN_EXPORT PFNGLGETPROGRAMPARAMETERFVNVPROC __glewGetProgramParameterfvNV; +GLEW_FUN_EXPORT PFNGLGETPROGRAMSTRINGNVPROC __glewGetProgramStringNV; +GLEW_FUN_EXPORT PFNGLGETPROGRAMIVNVPROC __glewGetProgramivNV; +GLEW_FUN_EXPORT PFNGLGETTRACKMATRIXIVNVPROC __glewGetTrackMatrixivNV; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBPOINTERVNVPROC __glewGetVertexAttribPointervNV; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBDVNVPROC __glewGetVertexAttribdvNV; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBFVNVPROC __glewGetVertexAttribfvNV; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIVNVPROC __glewGetVertexAttribivNV; +GLEW_FUN_EXPORT PFNGLISPROGRAMNVPROC __glewIsProgramNV; +GLEW_FUN_EXPORT PFNGLLOADPROGRAMNVPROC __glewLoadProgramNV; +GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4DNVPROC __glewProgramParameter4dNV; +GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4DVNVPROC __glewProgramParameter4dvNV; +GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4FNVPROC __glewProgramParameter4fNV; +GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4FVNVPROC __glewProgramParameter4fvNV; +GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERS4DVNVPROC __glewProgramParameters4dvNV; +GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERS4FVNVPROC __glewProgramParameters4fvNV; +GLEW_FUN_EXPORT PFNGLREQUESTRESIDENTPROGRAMSNVPROC __glewRequestResidentProgramsNV; +GLEW_FUN_EXPORT PFNGLTRACKMATRIXNVPROC __glewTrackMatrixNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DNVPROC __glewVertexAttrib1dNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DVNVPROC __glewVertexAttrib1dvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FNVPROC __glewVertexAttrib1fNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FVNVPROC __glewVertexAttrib1fvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SNVPROC __glewVertexAttrib1sNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SVNVPROC __glewVertexAttrib1svNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DNVPROC __glewVertexAttrib2dNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DVNVPROC __glewVertexAttrib2dvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FNVPROC __glewVertexAttrib2fNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FVNVPROC __glewVertexAttrib2fvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SNVPROC __glewVertexAttrib2sNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SVNVPROC __glewVertexAttrib2svNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DNVPROC __glewVertexAttrib3dNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DVNVPROC __glewVertexAttrib3dvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FNVPROC __glewVertexAttrib3fNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FVNVPROC __glewVertexAttrib3fvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SNVPROC __glewVertexAttrib3sNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SVNVPROC __glewVertexAttrib3svNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DNVPROC __glewVertexAttrib4dNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DVNVPROC __glewVertexAttrib4dvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FNVPROC __glewVertexAttrib4fNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FVNVPROC __glewVertexAttrib4fvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SNVPROC __glewVertexAttrib4sNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SVNVPROC __glewVertexAttrib4svNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBNVPROC __glewVertexAttrib4ubNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBVNVPROC __glewVertexAttrib4ubvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBPOINTERNVPROC __glewVertexAttribPointerNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1DVNVPROC __glewVertexAttribs1dvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1FVNVPROC __glewVertexAttribs1fvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1SVNVPROC __glewVertexAttribs1svNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2DVNVPROC __glewVertexAttribs2dvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2FVNVPROC __glewVertexAttribs2fvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2SVNVPROC __glewVertexAttribs2svNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3DVNVPROC __glewVertexAttribs3dvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3FVNVPROC __glewVertexAttribs3fvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3SVNVPROC __glewVertexAttribs3svNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4DVNVPROC __glewVertexAttribs4dvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4FVNVPROC __glewVertexAttribs4fvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4SVNVPROC __glewVertexAttribs4svNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4UBVNVPROC __glewVertexAttribs4ubvNV; + +GLEW_FUN_EXPORT PFNGLCLEARDEPTHFOESPROC __glewClearDepthfOES; +GLEW_FUN_EXPORT PFNGLCLIPPLANEFOESPROC __glewClipPlanefOES; +GLEW_FUN_EXPORT PFNGLDEPTHRANGEFOESPROC __glewDepthRangefOES; +GLEW_FUN_EXPORT PFNGLFRUSTUMFOESPROC __glewFrustumfOES; +GLEW_FUN_EXPORT PFNGLGETCLIPPLANEFOESPROC __glewGetClipPlanefOES; +GLEW_FUN_EXPORT PFNGLORTHOFOESPROC __glewOrthofOES; + +GLEW_FUN_EXPORT PFNGLDETAILTEXFUNCSGISPROC __glewDetailTexFuncSGIS; +GLEW_FUN_EXPORT PFNGLGETDETAILTEXFUNCSGISPROC __glewGetDetailTexFuncSGIS; + +GLEW_FUN_EXPORT PFNGLFOGFUNCSGISPROC __glewFogFuncSGIS; +GLEW_FUN_EXPORT PFNGLGETFOGFUNCSGISPROC __glewGetFogFuncSGIS; + +GLEW_FUN_EXPORT PFNGLSAMPLEMASKSGISPROC __glewSampleMaskSGIS; +GLEW_FUN_EXPORT PFNGLSAMPLEPATTERNSGISPROC __glewSamplePatternSGIS; + +GLEW_FUN_EXPORT PFNGLGETSHARPENTEXFUNCSGISPROC __glewGetSharpenTexFuncSGIS; +GLEW_FUN_EXPORT PFNGLSHARPENTEXFUNCSGISPROC __glewSharpenTexFuncSGIS; + +GLEW_FUN_EXPORT PFNGLTEXIMAGE4DSGISPROC __glewTexImage4DSGIS; +GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE4DSGISPROC __glewTexSubImage4DSGIS; + +GLEW_FUN_EXPORT PFNGLGETTEXFILTERFUNCSGISPROC __glewGetTexFilterFuncSGIS; +GLEW_FUN_EXPORT PFNGLTEXFILTERFUNCSGISPROC __glewTexFilterFuncSGIS; + +GLEW_FUN_EXPORT PFNGLASYNCMARKERSGIXPROC __glewAsyncMarkerSGIX; +GLEW_FUN_EXPORT PFNGLDELETEASYNCMARKERSSGIXPROC __glewDeleteAsyncMarkersSGIX; +GLEW_FUN_EXPORT PFNGLFINISHASYNCSGIXPROC __glewFinishAsyncSGIX; +GLEW_FUN_EXPORT PFNGLGENASYNCMARKERSSGIXPROC __glewGenAsyncMarkersSGIX; +GLEW_FUN_EXPORT PFNGLISASYNCMARKERSGIXPROC __glewIsAsyncMarkerSGIX; +GLEW_FUN_EXPORT PFNGLPOLLASYNCSGIXPROC __glewPollAsyncSGIX; + +GLEW_FUN_EXPORT PFNGLFLUSHRASTERSGIXPROC __glewFlushRasterSGIX; + +GLEW_FUN_EXPORT PFNGLTEXTUREFOGSGIXPROC __glewTextureFogSGIX; + +GLEW_FUN_EXPORT PFNGLFRAGMENTCOLORMATERIALSGIXPROC __glewFragmentColorMaterialSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFSGIXPROC __glewFragmentLightModelfSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFVSGIXPROC __glewFragmentLightModelfvSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELISGIXPROC __glewFragmentLightModeliSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELIVSGIXPROC __glewFragmentLightModelivSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFSGIXPROC __glewFragmentLightfSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFVSGIXPROC __glewFragmentLightfvSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTISGIXPROC __glewFragmentLightiSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTIVSGIXPROC __glewFragmentLightivSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFSGIXPROC __glewFragmentMaterialfSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFVSGIXPROC __glewFragmentMaterialfvSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALISGIXPROC __glewFragmentMaterialiSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALIVSGIXPROC __glewFragmentMaterialivSGIX; +GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTFVSGIXPROC __glewGetFragmentLightfvSGIX; +GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTIVSGIXPROC __glewGetFragmentLightivSGIX; +GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALFVSGIXPROC __glewGetFragmentMaterialfvSGIX; +GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALIVSGIXPROC __glewGetFragmentMaterialivSGIX; + +GLEW_FUN_EXPORT PFNGLFRAMEZOOMSGIXPROC __glewFrameZoomSGIX; + +GLEW_FUN_EXPORT PFNGLPIXELTEXGENSGIXPROC __glewPixelTexGenSGIX; + +GLEW_FUN_EXPORT PFNGLREFERENCEPLANESGIXPROC __glewReferencePlaneSGIX; + +GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERFSGIXPROC __glewSpriteParameterfSGIX; +GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERFVSGIXPROC __glewSpriteParameterfvSGIX; +GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERISGIXPROC __glewSpriteParameteriSGIX; +GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERIVSGIXPROC __glewSpriteParameterivSGIX; + +GLEW_FUN_EXPORT PFNGLTAGSAMPLEBUFFERSGIXPROC __glewTagSampleBufferSGIX; + +GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERFVSGIPROC __glewColorTableParameterfvSGI; +GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERIVSGIPROC __glewColorTableParameterivSGI; +GLEW_FUN_EXPORT PFNGLCOLORTABLESGIPROC __glewColorTableSGI; +GLEW_FUN_EXPORT PFNGLCOPYCOLORTABLESGIPROC __glewCopyColorTableSGI; +GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERFVSGIPROC __glewGetColorTableParameterfvSGI; +GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERIVSGIPROC __glewGetColorTableParameterivSGI; +GLEW_FUN_EXPORT PFNGLGETCOLORTABLESGIPROC __glewGetColorTableSGI; + +GLEW_FUN_EXPORT PFNGLFINISHTEXTURESUNXPROC __glewFinishTextureSUNX; + +GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORBSUNPROC __glewGlobalAlphaFactorbSUN; +GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORDSUNPROC __glewGlobalAlphaFactordSUN; +GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORFSUNPROC __glewGlobalAlphaFactorfSUN; +GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORISUNPROC __glewGlobalAlphaFactoriSUN; +GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORSSUNPROC __glewGlobalAlphaFactorsSUN; +GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORUBSUNPROC __glewGlobalAlphaFactorubSUN; +GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORUISUNPROC __glewGlobalAlphaFactoruiSUN; +GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORUSSUNPROC __glewGlobalAlphaFactorusSUN; + +GLEW_FUN_EXPORT PFNGLREADVIDEOPIXELSSUNPROC __glewReadVideoPixelsSUN; + +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEPOINTERSUNPROC __glewReplacementCodePointerSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUBSUNPROC __glewReplacementCodeubSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUBVSUNPROC __glewReplacementCodeubvSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUISUNPROC __glewReplacementCodeuiSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUIVSUNPROC __glewReplacementCodeuivSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUSSUNPROC __glewReplacementCodeusSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUSVSUNPROC __glewReplacementCodeusvSUN; + +GLEW_FUN_EXPORT PFNGLCOLOR3FVERTEX3FSUNPROC __glewColor3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLCOLOR3FVERTEX3FVSUNPROC __glewColor3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewColor4fNormal3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewColor4fNormal3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX2FSUNPROC __glewColor4ubVertex2fSUN; +GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX2FVSUNPROC __glewColor4ubVertex2fvSUN; +GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX3FSUNPROC __glewColor4ubVertex3fSUN; +GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX3FVSUNPROC __glewColor4ubVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLNORMAL3FVERTEX3FSUNPROC __glewNormal3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLNORMAL3FVERTEX3FVSUNPROC __glewNormal3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC __glewReplacementCodeuiColor3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC __glewReplacementCodeuiColor3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiColor4fNormal3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiColor4fNormal3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC __glewReplacementCodeuiColor4ubVertex3fSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC __glewReplacementCodeuiColor4ubVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiNormal3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiNormal3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fNormal3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC __glewReplacementCodeuiVertex3fSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC __glewReplacementCodeuiVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC __glewTexCoord2fColor3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC __glewTexCoord2fColor3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewTexCoord2fColor4fNormal3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewTexCoord2fColor4fNormal3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC __glewTexCoord2fColor4ubVertex3fSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC __glewTexCoord2fColor4ubVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC __glewTexCoord2fNormal3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC __glewTexCoord2fNormal3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FVERTEX3FSUNPROC __glewTexCoord2fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FVERTEX3FVSUNPROC __glewTexCoord2fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC __glewTexCoord4fColor4fNormal3fVertex4fSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC __glewTexCoord4fColor4fNormal3fVertex4fvSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD4FVERTEX4FSUNPROC __glewTexCoord4fVertex4fSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD4FVERTEX4FVSUNPROC __glewTexCoord4fVertex4fvSUN; + +GLEW_FUN_EXPORT PFNGLADDSWAPHINTRECTWINPROC __glewAddSwapHintRectWIN; + +#if defined(GLEW_MX) && !defined(_WIN32) +struct GLEWContextStruct +{ +#endif /* GLEW_MX */ + +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_1; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_2; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_3; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_4; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_5; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_2_0; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_2_1; +GLEW_VAR_EXPORT GLboolean __GLEW_3DFX_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_3DFX_tbuffer; +GLEW_VAR_EXPORT GLboolean __GLEW_3DFX_texture_compression_FXT1; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_client_storage; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_element_array; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_fence; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_float_pixels; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_pixel_buffer; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_specular_vector; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_texture_range; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_transform_hint; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_vertex_array_object; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_vertex_array_range; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_ycbcr_422; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_color_buffer_float; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_depth_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_buffers; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_program; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_program_shadow; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_half_float_pixel; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_imaging; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_matrix_palette; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multitexture; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_occlusion_query; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_pixel_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_point_parameters; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_point_sprite; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_objects; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shading_language_100; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shadow; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shadow_ambient; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_border_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_compression; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_cube_map; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_add; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_combine; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_crossbar; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_dot3; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_float; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_mirrored_repeat; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_non_power_of_two; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_rectangle; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transpose_matrix; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_blend; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_program; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_window_pos; +GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_point_sprites; +GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_texture_env_combine3; +GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_texture_env_route; +GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_vertex_shader_output_point_size; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_draw_buffers; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_element_array; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_envmap_bumpmap; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_fragment_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_map_object_buffer; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_pn_triangles; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_separate_stencil; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_shader_texture_lod; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_text_fragment_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_compression_3dc; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_env_combine3; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_float; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_mirror_once; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_vertex_array_object; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_vertex_attrib_array_object; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_vertex_streams; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_422_pixels; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_Cg_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_abgr; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_bgra; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_bindable_uniform; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_color; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_equation_separate; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_func_separate; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_logic_op; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_minmax; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_subtract; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_clip_volume_hint; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_cmyka; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_color_subtable; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_compiled_vertex_array; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_convolution; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_coordinate_frame; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_copy_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_cull_vertex; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_depth_bounds_test; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_buffers2; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_instanced; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_range_elements; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_fog_coord; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_fragment_lighting; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_blit; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_sRGB; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_geometry_shader4; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_gpu_program_parameters; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_gpu_shader4; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_histogram; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_array_formats; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_func; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_material; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_light_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_misc_attribute; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multi_draw_arrays; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_packed_depth_stencil; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_packed_float; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_packed_pixels; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_paletted_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_pixel_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_pixel_transform; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_pixel_transform_color_table; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_point_parameters; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_polygon_offset; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_rescale_normal; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_scene_marker; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_secondary_color; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_separate_specular_color; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shadow_funcs; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shared_texture_palette; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_stencil_clear_tag; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_stencil_two_side; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_stencil_wrap; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_subtexture; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture3D; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_array; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_dxt1; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_latc; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_rgtc; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_s3tc; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_cube_map; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_edge_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env_add; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env_combine; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env_dot3; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_filter_anisotropic; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_integer; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_lod_bias; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_mirror_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_object; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_perturb_normal; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_rectangle; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_sRGB; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_shared_exponent; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_timer_query; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_array; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_weighting; +GLEW_VAR_EXPORT GLboolean __GLEW_GREMEDY_string_marker; +GLEW_VAR_EXPORT GLboolean __GLEW_HP_convolution_border_modes; +GLEW_VAR_EXPORT GLboolean __GLEW_HP_image_transform; +GLEW_VAR_EXPORT GLboolean __GLEW_HP_occlusion_test; +GLEW_VAR_EXPORT GLboolean __GLEW_HP_texture_lighting; +GLEW_VAR_EXPORT GLboolean __GLEW_IBM_cull_vertex; +GLEW_VAR_EXPORT GLboolean __GLEW_IBM_multimode_draw_arrays; +GLEW_VAR_EXPORT GLboolean __GLEW_IBM_rasterpos_clip; +GLEW_VAR_EXPORT GLboolean __GLEW_IBM_static_data; +GLEW_VAR_EXPORT GLboolean __GLEW_IBM_texture_mirrored_repeat; +GLEW_VAR_EXPORT GLboolean __GLEW_IBM_vertex_array_lists; +GLEW_VAR_EXPORT GLboolean __GLEW_INGR_color_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_INGR_interlace_read; +GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_parallel_arrays; +GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_texture_scissor; +GLEW_VAR_EXPORT GLboolean __GLEW_KTX_buffer_region; +GLEW_VAR_EXPORT GLboolean __GLEW_MESAX_texture_stack; +GLEW_VAR_EXPORT GLboolean __GLEW_MESA_pack_invert; +GLEW_VAR_EXPORT GLboolean __GLEW_MESA_resize_buffers; +GLEW_VAR_EXPORT GLboolean __GLEW_MESA_window_pos; +GLEW_VAR_EXPORT GLboolean __GLEW_MESA_ycbcr_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_blend_square; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_copy_depth_to_color; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_depth_buffer_float; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_depth_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_depth_range_unclamped; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_evaluators; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_fence; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_float_buffer; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_fog_distance; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program2; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program4; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program_option; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_framebuffer_multisample_coverage; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_geometry_program4; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_geometry_shader4; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_program4; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_half_float; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_light_max_exponent; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_multisample_filter_hint; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_occlusion_query; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_packed_depth_stencil; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_parameter_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_pixel_data_range; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_point_sprite; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_primitive_restart; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_register_combiners; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_register_combiners2; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texgen_emboss; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texgen_reflection; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_compression_vtc; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_env_combine4; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_expand_normal; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_rectangle; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_shader2; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_shader3; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_transform_feedback; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_array_range; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_array_range2; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program1_1; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program2; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program2_option; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program3; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program4; +GLEW_VAR_EXPORT GLboolean __GLEW_OES_byte_coordinates; +GLEW_VAR_EXPORT GLboolean __GLEW_OES_compressed_paletted_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_OES_read_format; +GLEW_VAR_EXPORT GLboolean __GLEW_OES_single_precision; +GLEW_VAR_EXPORT GLboolean __GLEW_OML_interlace; +GLEW_VAR_EXPORT GLboolean __GLEW_OML_resample; +GLEW_VAR_EXPORT GLboolean __GLEW_OML_subsample; +GLEW_VAR_EXPORT GLboolean __GLEW_PGI_misc_hints; +GLEW_VAR_EXPORT GLboolean __GLEW_PGI_vertex_hints; +GLEW_VAR_EXPORT GLboolean __GLEW_REND_screen_coordinates; +GLEW_VAR_EXPORT GLboolean __GLEW_S3_s3tc; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_color_range; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_detail_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_fog_function; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_generate_mipmap; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_pixel_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_sharpen_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture4D; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_border_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_edge_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_filter4; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_lod; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_select; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_async; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_async_histogram; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_async_pixel; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_blend_alpha_minmax; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_clipmap; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_depth_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_flush_raster; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_offset; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fragment_specular_lighting; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_framezoom; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_interlace; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_ir_instrument1; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_list_priority; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_pixel_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_pixel_texture_bits; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_reference_plane; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_resample; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_shadow; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_shadow_ambient; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_sprite; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_tag_sample_buffer; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_add_env; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_coordinate_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_lod_bias; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_multi_buffer; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_range; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_scale_bias; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_vertex_preclip; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_vertex_preclip_hint; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_ycrcb; +GLEW_VAR_EXPORT GLboolean __GLEW_SGI_color_matrix; +GLEW_VAR_EXPORT GLboolean __GLEW_SGI_color_table; +GLEW_VAR_EXPORT GLboolean __GLEW_SGI_texture_color_table; +GLEW_VAR_EXPORT GLboolean __GLEW_SUNX_constant_data; +GLEW_VAR_EXPORT GLboolean __GLEW_SUN_convolution_border_modes; +GLEW_VAR_EXPORT GLboolean __GLEW_SUN_global_alpha; +GLEW_VAR_EXPORT GLboolean __GLEW_SUN_mesh_array; +GLEW_VAR_EXPORT GLboolean __GLEW_SUN_read_video_pixels; +GLEW_VAR_EXPORT GLboolean __GLEW_SUN_slice_accum; +GLEW_VAR_EXPORT GLboolean __GLEW_SUN_triangle_list; +GLEW_VAR_EXPORT GLboolean __GLEW_SUN_vertex; +GLEW_VAR_EXPORT GLboolean __GLEW_WIN_phong_shading; +GLEW_VAR_EXPORT GLboolean __GLEW_WIN_specular_fog; +GLEW_VAR_EXPORT GLboolean __GLEW_WIN_swap_hint; + +#ifdef GLEW_MX +}; /* GLEWContextStruct */ +#endif /* GLEW_MX */ + +/* ------------------------------------------------------------------------- */ + +/* error codes */ +#define GLEW_OK 0 +#define GLEW_NO_ERROR 0 +#define GLEW_ERROR_NO_GL_VERSION 1 /* missing GL version */ +#define GLEW_ERROR_GL_VERSION_10_ONLY 2 /* GL 1.1 and up are not supported */ +#define GLEW_ERROR_GLX_VERSION_11_ONLY 3 /* GLX 1.2 and up are not supported */ + +/* string codes */ +#define GLEW_VERSION 1 + +/* API */ +#ifdef GLEW_MX + +typedef struct GLEWContextStruct GLEWContext; +GLEWAPI GLenum glewContextInit (GLEWContext* ctx); +GLEWAPI GLboolean glewContextIsSupported (GLEWContext* ctx, const char* name); + +#define glewInit() glewContextInit(glewGetContext()) +#define glewIsSupported(x) glewContextIsSupported(glewGetContext(), x) +#define glewIsExtensionSupported(x) glewIsSupported(x) + +#define GLEW_GET_VAR(x) (*(const GLboolean*)&(glewGetContext()->x)) +#ifdef _WIN32 +# define GLEW_GET_FUN(x) glewGetContext()->x +#else +# define GLEW_GET_FUN(x) x +#endif + +#else /* GLEW_MX */ + +GLEWAPI GLenum glewInit (); +GLEWAPI GLboolean glewIsSupported (const char* name); +#define glewIsExtensionSupported(x) glewIsSupported(x) + +#define GLEW_GET_VAR(x) (*(const GLboolean*)&x) +#define GLEW_GET_FUN(x) x + +#endif /* GLEW_MX */ + +GLEWAPI GLboolean glewExperimental; +GLEWAPI GLboolean glewGetExtension (const char* name); +GLEWAPI const GLubyte* glewGetErrorString (GLenum error); +GLEWAPI const GLubyte* glewGetString (GLenum name); + +#ifdef __cplusplus +} +#endif + +#ifdef GLEW_APIENTRY_DEFINED +#undef GLEW_APIENTRY_DEFINED +#undef APIENTRY +#undef GLAPIENTRY +#endif + +#ifdef GLEW_CALLBACK_DEFINED +#undef GLEW_CALLBACK_DEFINED +#undef CALLBACK +#endif + +#ifdef GLEW_WINGDIAPI_DEFINED +#undef GLEW_WINGDIAPI_DEFINED +#undef WINGDIAPI +#endif + +#undef GLAPI +/* #undef GLEWAPI */ + +#endif /* __glew_h__ */ diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Windows/GL/glew32s.lib b/Source/Plugins/Plugin_VideoOGL/Src/Windows/GL/glew32s.lib new file mode 100644 index 0000000000..f2cb7f8b81 Binary files /dev/null and b/Source/Plugins/Plugin_VideoOGL/Src/Windows/GL/glew32s.lib differ diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Windows/GL/glew64s.lib b/Source/Plugins/Plugin_VideoOGL/Src/Windows/GL/glew64s.lib new file mode 100644 index 0000000000..4580add356 Binary files /dev/null and b/Source/Plugins/Plugin_VideoOGL/Src/Windows/GL/glew64s.lib differ diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Windows/GL/glext.h b/Source/Plugins/Plugin_VideoOGL/Src/Windows/GL/glext.h new file mode 100644 index 0000000000..0321028f66 --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/Windows/GL/glext.h @@ -0,0 +1,6495 @@ +#ifndef __glext_h_ +#define __glext_h_ + +#ifdef __cplusplus +extern "C" { +#endif + +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2004 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: This software was created using the +** OpenGL(R) version 1.2.1 Sample Implementation published by SGI, but has +** not been independently verified as being compliant with the OpenGL(R) +** version 1.2.1 Specification. +*/ + +#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) +#define WIN32_LEAN_AND_MEAN 1 +#include +#endif + +#ifndef APIENTRY +#define APIENTRY +#endif +#ifndef APIENTRYP +#define APIENTRYP APIENTRY * +#endif +#ifndef GLAPI +#define GLAPI extern +#endif + +/*************************************************************/ + +/* Header file version number, required by OpenGL ABI for Linux */ +/* glext.h last updated 2005/06/20 */ +/* Current version at http://oss.sgi.com/projects/ogl-sample/registry/ */ +#define GL_GLEXT_VERSION 29 + +#ifndef GL_VERSION_1_2 +#define GL_UNSIGNED_BYTE_3_3_2 0x8032 +#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 +#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 +#define GL_UNSIGNED_INT_8_8_8_8 0x8035 +#define GL_UNSIGNED_INT_10_10_10_2 0x8036 +#define GL_RESCALE_NORMAL 0x803A +#define GL_TEXTURE_BINDING_3D 0x806A +#define GL_PACK_SKIP_IMAGES 0x806B +#define GL_PACK_IMAGE_HEIGHT 0x806C +#define GL_UNPACK_SKIP_IMAGES 0x806D +#define GL_UNPACK_IMAGE_HEIGHT 0x806E +#define GL_TEXTURE_3D 0x806F +#define GL_PROXY_TEXTURE_3D 0x8070 +#define GL_TEXTURE_DEPTH 0x8071 +#define GL_TEXTURE_WRAP_R 0x8072 +#define GL_MAX_3D_TEXTURE_SIZE 0x8073 +#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 +#define GL_UNSIGNED_SHORT_5_6_5 0x8363 +#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 +#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 +#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 +#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 +#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 +#define GL_BGR 0x80E0 +#define GL_BGRA 0x80E1 +#define GL_MAX_ELEMENTS_VERTICES 0x80E8 +#define GL_MAX_ELEMENTS_INDICES 0x80E9 +#define GL_CLAMP_TO_EDGE 0x812F +#define GL_TEXTURE_MIN_LOD 0x813A +#define GL_TEXTURE_MAX_LOD 0x813B +#define GL_TEXTURE_BASE_LEVEL 0x813C +#define GL_TEXTURE_MAX_LEVEL 0x813D +#define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8 +#define GL_SINGLE_COLOR 0x81F9 +#define GL_SEPARATE_SPECULAR_COLOR 0x81FA +#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 +#define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13 +#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 +#define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23 +#define GL_ALIASED_POINT_SIZE_RANGE 0x846D +#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E +#endif + +#ifndef GL_ARB_imaging +#define GL_CONSTANT_COLOR 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 +#define GL_CONSTANT_ALPHA 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 +#define GL_BLEND_COLOR 0x8005 +#define GL_FUNC_ADD 0x8006 +#define GL_MIN 0x8007 +#define GL_MAX 0x8008 +#define GL_BLEND_EQUATION 0x8009 +#define GL_FUNC_SUBTRACT 0x800A +#define GL_FUNC_REVERSE_SUBTRACT 0x800B +#define GL_CONVOLUTION_1D 0x8010 +#define GL_CONVOLUTION_2D 0x8011 +#define GL_SEPARABLE_2D 0x8012 +#define GL_CONVOLUTION_BORDER_MODE 0x8013 +#define GL_CONVOLUTION_FILTER_SCALE 0x8014 +#define GL_CONVOLUTION_FILTER_BIAS 0x8015 +#define GL_REDUCE 0x8016 +#define GL_CONVOLUTION_FORMAT 0x8017 +#define GL_CONVOLUTION_WIDTH 0x8018 +#define GL_CONVOLUTION_HEIGHT 0x8019 +#define GL_MAX_CONVOLUTION_WIDTH 0x801A +#define GL_MAX_CONVOLUTION_HEIGHT 0x801B +#define GL_POST_CONVOLUTION_RED_SCALE 0x801C +#define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D +#define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E +#define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F +#define GL_POST_CONVOLUTION_RED_BIAS 0x8020 +#define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021 +#define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022 +#define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023 +#define GL_HISTOGRAM 0x8024 +#define GL_PROXY_HISTOGRAM 0x8025 +#define GL_HISTOGRAM_WIDTH 0x8026 +#define GL_HISTOGRAM_FORMAT 0x8027 +#define GL_HISTOGRAM_RED_SIZE 0x8028 +#define GL_HISTOGRAM_GREEN_SIZE 0x8029 +#define GL_HISTOGRAM_BLUE_SIZE 0x802A +#define GL_HISTOGRAM_ALPHA_SIZE 0x802B +#define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C +#define GL_HISTOGRAM_SINK 0x802D +#define GL_MINMAX 0x802E +#define GL_MINMAX_FORMAT 0x802F +#define GL_MINMAX_SINK 0x8030 +#define GL_TABLE_TOO_LARGE 0x8031 +#define GL_COLOR_MATRIX 0x80B1 +#define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2 +#define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3 +#define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4 +#define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5 +#define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6 +#define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7 +#define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8 +#define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9 +#define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA +#define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB +#define GL_COLOR_TABLE 0x80D0 +#define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1 +#define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2 +#define GL_PROXY_COLOR_TABLE 0x80D3 +#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4 +#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5 +#define GL_COLOR_TABLE_SCALE 0x80D6 +#define GL_COLOR_TABLE_BIAS 0x80D7 +#define GL_COLOR_TABLE_FORMAT 0x80D8 +#define GL_COLOR_TABLE_WIDTH 0x80D9 +#define GL_COLOR_TABLE_RED_SIZE 0x80DA +#define GL_COLOR_TABLE_GREEN_SIZE 0x80DB +#define GL_COLOR_TABLE_BLUE_SIZE 0x80DC +#define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD +#define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE +#define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF +#define GL_CONSTANT_BORDER 0x8151 +#define GL_REPLICATE_BORDER 0x8153 +#define GL_CONVOLUTION_BORDER_COLOR 0x8154 +#endif + +#ifndef GL_VERSION_1_3 +#define GL_TEXTURE0 0x84C0 +#define GL_TEXTURE1 0x84C1 +#define GL_TEXTURE2 0x84C2 +#define GL_TEXTURE3 0x84C3 +#define GL_TEXTURE4 0x84C4 +#define GL_TEXTURE5 0x84C5 +#define GL_TEXTURE6 0x84C6 +#define GL_TEXTURE7 0x84C7 +#define GL_TEXTURE8 0x84C8 +#define GL_TEXTURE9 0x84C9 +#define GL_TEXTURE10 0x84CA +#define GL_TEXTURE11 0x84CB +#define GL_TEXTURE12 0x84CC +#define GL_TEXTURE13 0x84CD +#define GL_TEXTURE14 0x84CE +#define GL_TEXTURE15 0x84CF +#define GL_TEXTURE16 0x84D0 +#define GL_TEXTURE17 0x84D1 +#define GL_TEXTURE18 0x84D2 +#define GL_TEXTURE19 0x84D3 +#define GL_TEXTURE20 0x84D4 +#define GL_TEXTURE21 0x84D5 +#define GL_TEXTURE22 0x84D6 +#define GL_TEXTURE23 0x84D7 +#define GL_TEXTURE24 0x84D8 +#define GL_TEXTURE25 0x84D9 +#define GL_TEXTURE26 0x84DA +#define GL_TEXTURE27 0x84DB +#define GL_TEXTURE28 0x84DC +#define GL_TEXTURE29 0x84DD +#define GL_TEXTURE30 0x84DE +#define GL_TEXTURE31 0x84DF +#define GL_ACTIVE_TEXTURE 0x84E0 +#define GL_CLIENT_ACTIVE_TEXTURE 0x84E1 +#define GL_MAX_TEXTURE_UNITS 0x84E2 +#define GL_TRANSPOSE_MODELVIEW_MATRIX 0x84E3 +#define GL_TRANSPOSE_PROJECTION_MATRIX 0x84E4 +#define GL_TRANSPOSE_TEXTURE_MATRIX 0x84E5 +#define GL_TRANSPOSE_COLOR_MATRIX 0x84E6 +#define GL_MULTISAMPLE 0x809D +#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE 0x809F +#define GL_SAMPLE_COVERAGE 0x80A0 +#define GL_SAMPLE_BUFFERS 0x80A8 +#define GL_SAMPLES 0x80A9 +#define GL_SAMPLE_COVERAGE_VALUE 0x80AA +#define GL_SAMPLE_COVERAGE_INVERT 0x80AB +#define GL_MULTISAMPLE_BIT 0x20000000 +#define GL_NORMAL_MAP 0x8511 +#define GL_REFLECTION_MAP 0x8512 +#define GL_TEXTURE_CUBE_MAP 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C +#define GL_COMPRESSED_ALPHA 0x84E9 +#define GL_COMPRESSED_LUMINANCE 0x84EA +#define GL_COMPRESSED_LUMINANCE_ALPHA 0x84EB +#define GL_COMPRESSED_INTENSITY 0x84EC +#define GL_COMPRESSED_RGB 0x84ED +#define GL_COMPRESSED_RGBA 0x84EE +#define GL_TEXTURE_COMPRESSION_HINT 0x84EF +#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0 +#define GL_TEXTURE_COMPRESSED 0x86A1 +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 +#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 +#define GL_CLAMP_TO_BORDER 0x812D +#define GL_COMBINE 0x8570 +#define GL_COMBINE_RGB 0x8571 +#define GL_COMBINE_ALPHA 0x8572 +#define GL_SOURCE0_RGB 0x8580 +#define GL_SOURCE1_RGB 0x8581 +#define GL_SOURCE2_RGB 0x8582 +#define GL_SOURCE0_ALPHA 0x8588 +#define GL_SOURCE1_ALPHA 0x8589 +#define GL_SOURCE2_ALPHA 0x858A +#define GL_OPERAND0_RGB 0x8590 +#define GL_OPERAND1_RGB 0x8591 +#define GL_OPERAND2_RGB 0x8592 +#define GL_OPERAND0_ALPHA 0x8598 +#define GL_OPERAND1_ALPHA 0x8599 +#define GL_OPERAND2_ALPHA 0x859A +#define GL_RGB_SCALE 0x8573 +#define GL_ADD_SIGNED 0x8574 +#define GL_INTERPOLATE 0x8575 +#define GL_SUBTRACT 0x84E7 +#define GL_CONSTANT 0x8576 +#define GL_PRIMARY_COLOR 0x8577 +#define GL_PREVIOUS 0x8578 +#define GL_DOT3_RGB 0x86AE +#define GL_DOT3_RGBA 0x86AF +#endif + +#ifndef GL_VERSION_1_4 +#define GL_BLEND_DST_RGB 0x80C8 +#define GL_BLEND_SRC_RGB 0x80C9 +#define GL_BLEND_DST_ALPHA 0x80CA +#define GL_BLEND_SRC_ALPHA 0x80CB +#define GL_POINT_SIZE_MIN 0x8126 +#define GL_POINT_SIZE_MAX 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE 0x8128 +#define GL_POINT_DISTANCE_ATTENUATION 0x8129 +#define GL_GENERATE_MIPMAP 0x8191 +#define GL_GENERATE_MIPMAP_HINT 0x8192 +#define GL_DEPTH_COMPONENT16 0x81A5 +#define GL_DEPTH_COMPONENT24 0x81A6 +#define GL_DEPTH_COMPONENT32 0x81A7 +#define GL_MIRRORED_REPEAT 0x8370 +#define GL_FOG_COORDINATE_SOURCE 0x8450 +#define GL_FOG_COORDINATE 0x8451 +#define GL_FRAGMENT_DEPTH 0x8452 +#define GL_CURRENT_FOG_COORDINATE 0x8453 +#define GL_FOG_COORDINATE_ARRAY_TYPE 0x8454 +#define GL_FOG_COORDINATE_ARRAY_STRIDE 0x8455 +#define GL_FOG_COORDINATE_ARRAY_POINTER 0x8456 +#define GL_FOG_COORDINATE_ARRAY 0x8457 +#define GL_COLOR_SUM 0x8458 +#define GL_CURRENT_SECONDARY_COLOR 0x8459 +#define GL_SECONDARY_COLOR_ARRAY_SIZE 0x845A +#define GL_SECONDARY_COLOR_ARRAY_TYPE 0x845B +#define GL_SECONDARY_COLOR_ARRAY_STRIDE 0x845C +#define GL_SECONDARY_COLOR_ARRAY_POINTER 0x845D +#define GL_SECONDARY_COLOR_ARRAY 0x845E +#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD +#define GL_TEXTURE_FILTER_CONTROL 0x8500 +#define GL_TEXTURE_LOD_BIAS 0x8501 +#define GL_INCR_WRAP 0x8507 +#define GL_DECR_WRAP 0x8508 +#define GL_TEXTURE_DEPTH_SIZE 0x884A +#define GL_DEPTH_TEXTURE_MODE 0x884B +#define GL_TEXTURE_COMPARE_MODE 0x884C +#define GL_TEXTURE_COMPARE_FUNC 0x884D +#define GL_COMPARE_R_TO_TEXTURE 0x884E +#endif + +#ifndef GL_VERSION_1_5 +#define GL_BUFFER_SIZE 0x8764 +#define GL_BUFFER_USAGE 0x8765 +#define GL_QUERY_COUNTER_BITS 0x8864 +#define GL_CURRENT_QUERY 0x8865 +#define GL_QUERY_RESULT 0x8866 +#define GL_QUERY_RESULT_AVAILABLE 0x8867 +#define GL_ARRAY_BUFFER 0x8892 +#define GL_ELEMENT_ARRAY_BUFFER 0x8893 +#define GL_ARRAY_BUFFER_BINDING 0x8894 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 +#define GL_VERTEX_ARRAY_BUFFER_BINDING 0x8896 +#define GL_NORMAL_ARRAY_BUFFER_BINDING 0x8897 +#define GL_COLOR_ARRAY_BUFFER_BINDING 0x8898 +#define GL_INDEX_ARRAY_BUFFER_BINDING 0x8899 +#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A +#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING 0x889B +#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING 0x889C +#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING 0x889D +#define GL_WEIGHT_ARRAY_BUFFER_BINDING 0x889E +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F +#define GL_READ_ONLY 0x88B8 +#define GL_WRITE_ONLY 0x88B9 +#define GL_READ_WRITE 0x88BA +#define GL_BUFFER_ACCESS 0x88BB +#define GL_BUFFER_MAPPED 0x88BC +#define GL_BUFFER_MAP_POINTER 0x88BD +#define GL_STREAM_DRAW 0x88E0 +#define GL_STREAM_READ 0x88E1 +#define GL_STREAM_COPY 0x88E2 +#define GL_STATIC_DRAW 0x88E4 +#define GL_STATIC_READ 0x88E5 +#define GL_STATIC_COPY 0x88E6 +#define GL_DYNAMIC_DRAW 0x88E8 +#define GL_DYNAMIC_READ 0x88E9 +#define GL_DYNAMIC_COPY 0x88EA +#define GL_SAMPLES_PASSED 0x8914 +#define GL_FOG_COORD_SRC GL_FOG_COORDINATE_SOURCE +#define GL_FOG_COORD GL_FOG_COORDINATE +#define GL_CURRENT_FOG_COORD GL_CURRENT_FOG_COORDINATE +#define GL_FOG_COORD_ARRAY_TYPE GL_FOG_COORDINATE_ARRAY_TYPE +#define GL_FOG_COORD_ARRAY_STRIDE GL_FOG_COORDINATE_ARRAY_STRIDE +#define GL_FOG_COORD_ARRAY_POINTER GL_FOG_COORDINATE_ARRAY_POINTER +#define GL_FOG_COORD_ARRAY GL_FOG_COORDINATE_ARRAY +#define GL_FOG_COORD_ARRAY_BUFFER_BINDING GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING +#define GL_SRC0_RGB GL_SOURCE0_RGB +#define GL_SRC1_RGB GL_SOURCE1_RGB +#define GL_SRC2_RGB GL_SOURCE2_RGB +#define GL_SRC0_ALPHA GL_SOURCE0_ALPHA +#define GL_SRC1_ALPHA GL_SOURCE1_ALPHA +#define GL_SRC2_ALPHA GL_SOURCE2_ALPHA +#endif + +#ifndef GL_VERSION_2_0 +#define GL_BLEND_EQUATION_RGB GL_BLEND_EQUATION +#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 +#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 +#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 +#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 +#define GL_CURRENT_VERTEX_ATTRIB 0x8626 +#define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE 0x8643 +#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 +#define GL_STENCIL_BACK_FUNC 0x8800 +#define GL_STENCIL_BACK_FAIL 0x8801 +#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802 +#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803 +#define GL_MAX_DRAW_BUFFERS 0x8824 +#define GL_DRAW_BUFFER0 0x8825 +#define GL_DRAW_BUFFER1 0x8826 +#define GL_DRAW_BUFFER2 0x8827 +#define GL_DRAW_BUFFER3 0x8828 +#define GL_DRAW_BUFFER4 0x8829 +#define GL_DRAW_BUFFER5 0x882A +#define GL_DRAW_BUFFER6 0x882B +#define GL_DRAW_BUFFER7 0x882C +#define GL_DRAW_BUFFER8 0x882D +#define GL_DRAW_BUFFER9 0x882E +#define GL_DRAW_BUFFER10 0x882F +#define GL_DRAW_BUFFER11 0x8830 +#define GL_DRAW_BUFFER12 0x8831 +#define GL_DRAW_BUFFER13 0x8832 +#define GL_DRAW_BUFFER14 0x8833 +#define GL_DRAW_BUFFER15 0x8834 +#define GL_BLEND_EQUATION_ALPHA 0x883D +#define GL_POINT_SPRITE 0x8861 +#define GL_COORD_REPLACE 0x8862 +#define GL_MAX_VERTEX_ATTRIBS 0x8869 +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A +#define GL_MAX_TEXTURE_COORDS 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 +#define GL_FRAGMENT_SHADER 0x8B30 +#define GL_VERTEX_SHADER 0x8B31 +#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49 +#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A +#define GL_MAX_VARYING_FLOATS 0x8B4B +#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C +#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D +#define GL_SHADER_TYPE 0x8B4F +#define GL_FLOAT_VEC2 0x8B50 +#define GL_FLOAT_VEC3 0x8B51 +#define GL_FLOAT_VEC4 0x8B52 +#define GL_INT_VEC2 0x8B53 +#define GL_INT_VEC3 0x8B54 +#define GL_INT_VEC4 0x8B55 +#define GL_BOOL 0x8B56 +#define GL_BOOL_VEC2 0x8B57 +#define GL_BOOL_VEC3 0x8B58 +#define GL_BOOL_VEC4 0x8B59 +#define GL_FLOAT_MAT2 0x8B5A +#define GL_FLOAT_MAT3 0x8B5B +#define GL_FLOAT_MAT4 0x8B5C +#define GL_SAMPLER_1D 0x8B5D +#define GL_SAMPLER_2D 0x8B5E +#define GL_SAMPLER_3D 0x8B5F +#define GL_SAMPLER_CUBE 0x8B60 +#define GL_SAMPLER_1D_SHADOW 0x8B61 +#define GL_SAMPLER_2D_SHADOW 0x8B62 +#define GL_DELETE_STATUS 0x8B80 +#define GL_COMPILE_STATUS 0x8B81 +#define GL_LINK_STATUS 0x8B82 +#define GL_VALIDATE_STATUS 0x8B83 +#define GL_INFO_LOG_LENGTH 0x8B84 +#define GL_ATTACHED_SHADERS 0x8B85 +#define GL_ACTIVE_UNIFORMS 0x8B86 +#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 +#define GL_SHADER_SOURCE_LENGTH 0x8B88 +#define GL_ACTIVE_ATTRIBUTES 0x8B89 +#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A +#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B +#define GL_SHADING_LANGUAGE_VERSION 0x8B8C +#define GL_CURRENT_PROGRAM 0x8B8D +#define GL_POINT_SPRITE_COORD_ORIGIN 0x8CA0 +#define GL_LOWER_LEFT 0x8CA1 +#define GL_UPPER_LEFT 0x8CA2 +#define GL_STENCIL_BACK_REF 0x8CA3 +#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4 +#define GL_STENCIL_BACK_WRITEMASK 0x8CA5 +#endif + +#ifndef GL_ARB_multitexture +#define GL_TEXTURE0_ARB 0x84C0 +#define GL_TEXTURE1_ARB 0x84C1 +#define GL_TEXTURE2_ARB 0x84C2 +#define GL_TEXTURE3_ARB 0x84C3 +#define GL_TEXTURE4_ARB 0x84C4 +#define GL_TEXTURE5_ARB 0x84C5 +#define GL_TEXTURE6_ARB 0x84C6 +#define GL_TEXTURE7_ARB 0x84C7 +#define GL_TEXTURE8_ARB 0x84C8 +#define GL_TEXTURE9_ARB 0x84C9 +#define GL_TEXTURE10_ARB 0x84CA +#define GL_TEXTURE11_ARB 0x84CB +#define GL_TEXTURE12_ARB 0x84CC +#define GL_TEXTURE13_ARB 0x84CD +#define GL_TEXTURE14_ARB 0x84CE +#define GL_TEXTURE15_ARB 0x84CF +#define GL_TEXTURE16_ARB 0x84D0 +#define GL_TEXTURE17_ARB 0x84D1 +#define GL_TEXTURE18_ARB 0x84D2 +#define GL_TEXTURE19_ARB 0x84D3 +#define GL_TEXTURE20_ARB 0x84D4 +#define GL_TEXTURE21_ARB 0x84D5 +#define GL_TEXTURE22_ARB 0x84D6 +#define GL_TEXTURE23_ARB 0x84D7 +#define GL_TEXTURE24_ARB 0x84D8 +#define GL_TEXTURE25_ARB 0x84D9 +#define GL_TEXTURE26_ARB 0x84DA +#define GL_TEXTURE27_ARB 0x84DB +#define GL_TEXTURE28_ARB 0x84DC +#define GL_TEXTURE29_ARB 0x84DD +#define GL_TEXTURE30_ARB 0x84DE +#define GL_TEXTURE31_ARB 0x84DF +#define GL_ACTIVE_TEXTURE_ARB 0x84E0 +#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 +#define GL_MAX_TEXTURE_UNITS_ARB 0x84E2 +#endif + +#ifndef GL_ARB_transpose_matrix +#define GL_TRANSPOSE_MODELVIEW_MATRIX_ARB 0x84E3 +#define GL_TRANSPOSE_PROJECTION_MATRIX_ARB 0x84E4 +#define GL_TRANSPOSE_TEXTURE_MATRIX_ARB 0x84E5 +#define GL_TRANSPOSE_COLOR_MATRIX_ARB 0x84E6 +#endif + +#ifndef GL_ARB_multisample +#define GL_MULTISAMPLE_ARB 0x809D +#define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_ARB 0x809F +#define GL_SAMPLE_COVERAGE_ARB 0x80A0 +#define GL_SAMPLE_BUFFERS_ARB 0x80A8 +#define GL_SAMPLES_ARB 0x80A9 +#define GL_SAMPLE_COVERAGE_VALUE_ARB 0x80AA +#define GL_SAMPLE_COVERAGE_INVERT_ARB 0x80AB +#define GL_MULTISAMPLE_BIT_ARB 0x20000000 +#endif + +#ifndef GL_ARB_texture_env_add +#endif + +#ifndef GL_ARB_texture_cube_map +#define GL_NORMAL_MAP_ARB 0x8511 +#define GL_REFLECTION_MAP_ARB 0x8512 +#define GL_TEXTURE_CUBE_MAP_ARB 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP_ARB 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB 0x851C +#endif + +#ifndef GL_ARB_texture_compression +#define GL_COMPRESSED_ALPHA_ARB 0x84E9 +#define GL_COMPRESSED_LUMINANCE_ARB 0x84EA +#define GL_COMPRESSED_LUMINANCE_ALPHA_ARB 0x84EB +#define GL_COMPRESSED_INTENSITY_ARB 0x84EC +#define GL_COMPRESSED_RGB_ARB 0x84ED +#define GL_COMPRESSED_RGBA_ARB 0x84EE +#define GL_TEXTURE_COMPRESSION_HINT_ARB 0x84EF +#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB 0x86A0 +#define GL_TEXTURE_COMPRESSED_ARB 0x86A1 +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A2 +#define GL_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A3 +#endif + +#ifndef GL_ARB_texture_border_clamp +#define GL_CLAMP_TO_BORDER_ARB 0x812D +#endif + +#ifndef GL_ARB_point_parameters +#define GL_POINT_SIZE_MIN_ARB 0x8126 +#define GL_POINT_SIZE_MAX_ARB 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_ARB 0x8128 +#define GL_POINT_DISTANCE_ATTENUATION_ARB 0x8129 +#endif + +#ifndef GL_ARB_vertex_blend +#define GL_MAX_VERTEX_UNITS_ARB 0x86A4 +#define GL_ACTIVE_VERTEX_UNITS_ARB 0x86A5 +#define GL_WEIGHT_SUM_UNITY_ARB 0x86A6 +#define GL_VERTEX_BLEND_ARB 0x86A7 +#define GL_CURRENT_WEIGHT_ARB 0x86A8 +#define GL_WEIGHT_ARRAY_TYPE_ARB 0x86A9 +#define GL_WEIGHT_ARRAY_STRIDE_ARB 0x86AA +#define GL_WEIGHT_ARRAY_SIZE_ARB 0x86AB +#define GL_WEIGHT_ARRAY_POINTER_ARB 0x86AC +#define GL_WEIGHT_ARRAY_ARB 0x86AD +#define GL_MODELVIEW0_ARB 0x1700 +#define GL_MODELVIEW1_ARB 0x850A +#define GL_MODELVIEW2_ARB 0x8722 +#define GL_MODELVIEW3_ARB 0x8723 +#define GL_MODELVIEW4_ARB 0x8724 +#define GL_MODELVIEW5_ARB 0x8725 +#define GL_MODELVIEW6_ARB 0x8726 +#define GL_MODELVIEW7_ARB 0x8727 +#define GL_MODELVIEW8_ARB 0x8728 +#define GL_MODELVIEW9_ARB 0x8729 +#define GL_MODELVIEW10_ARB 0x872A +#define GL_MODELVIEW11_ARB 0x872B +#define GL_MODELVIEW12_ARB 0x872C +#define GL_MODELVIEW13_ARB 0x872D +#define GL_MODELVIEW14_ARB 0x872E +#define GL_MODELVIEW15_ARB 0x872F +#define GL_MODELVIEW16_ARB 0x8730 +#define GL_MODELVIEW17_ARB 0x8731 +#define GL_MODELVIEW18_ARB 0x8732 +#define GL_MODELVIEW19_ARB 0x8733 +#define GL_MODELVIEW20_ARB 0x8734 +#define GL_MODELVIEW21_ARB 0x8735 +#define GL_MODELVIEW22_ARB 0x8736 +#define GL_MODELVIEW23_ARB 0x8737 +#define GL_MODELVIEW24_ARB 0x8738 +#define GL_MODELVIEW25_ARB 0x8739 +#define GL_MODELVIEW26_ARB 0x873A +#define GL_MODELVIEW27_ARB 0x873B +#define GL_MODELVIEW28_ARB 0x873C +#define GL_MODELVIEW29_ARB 0x873D +#define GL_MODELVIEW30_ARB 0x873E +#define GL_MODELVIEW31_ARB 0x873F +#endif + +#ifndef GL_ARB_matrix_palette +#define GL_MATRIX_PALETTE_ARB 0x8840 +#define GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB 0x8841 +#define GL_MAX_PALETTE_MATRICES_ARB 0x8842 +#define GL_CURRENT_PALETTE_MATRIX_ARB 0x8843 +#define GL_MATRIX_INDEX_ARRAY_ARB 0x8844 +#define GL_CURRENT_MATRIX_INDEX_ARB 0x8845 +#define GL_MATRIX_INDEX_ARRAY_SIZE_ARB 0x8846 +#define GL_MATRIX_INDEX_ARRAY_TYPE_ARB 0x8847 +#define GL_MATRIX_INDEX_ARRAY_STRIDE_ARB 0x8848 +#define GL_MATRIX_INDEX_ARRAY_POINTER_ARB 0x8849 +#endif + +#ifndef GL_ARB_texture_env_combine +#define GL_COMBINE_ARB 0x8570 +#define GL_COMBINE_RGB_ARB 0x8571 +#define GL_COMBINE_ALPHA_ARB 0x8572 +#define GL_SOURCE0_RGB_ARB 0x8580 +#define GL_SOURCE1_RGB_ARB 0x8581 +#define GL_SOURCE2_RGB_ARB 0x8582 +#define GL_SOURCE0_ALPHA_ARB 0x8588 +#define GL_SOURCE1_ALPHA_ARB 0x8589 +#define GL_SOURCE2_ALPHA_ARB 0x858A +#define GL_OPERAND0_RGB_ARB 0x8590 +#define GL_OPERAND1_RGB_ARB 0x8591 +#define GL_OPERAND2_RGB_ARB 0x8592 +#define GL_OPERAND0_ALPHA_ARB 0x8598 +#define GL_OPERAND1_ALPHA_ARB 0x8599 +#define GL_OPERAND2_ALPHA_ARB 0x859A +#define GL_RGB_SCALE_ARB 0x8573 +#define GL_ADD_SIGNED_ARB 0x8574 +#define GL_INTERPOLATE_ARB 0x8575 +#define GL_SUBTRACT_ARB 0x84E7 +#define GL_CONSTANT_ARB 0x8576 +#define GL_PRIMARY_COLOR_ARB 0x8577 +#define GL_PREVIOUS_ARB 0x8578 +#endif + +#ifndef GL_ARB_texture_env_crossbar +#endif + +#ifndef GL_ARB_texture_env_dot3 +#define GL_DOT3_RGB_ARB 0x86AE +#define GL_DOT3_RGBA_ARB 0x86AF +#endif + +#ifndef GL_ARB_texture_mirrored_repeat +#define GL_MIRRORED_REPEAT_ARB 0x8370 +#endif + +#ifndef GL_ARB_depth_texture +#define GL_DEPTH_COMPONENT16_ARB 0x81A5 +#define GL_DEPTH_COMPONENT24_ARB 0x81A6 +#define GL_DEPTH_COMPONENT32_ARB 0x81A7 +#define GL_TEXTURE_DEPTH_SIZE_ARB 0x884A +#define GL_DEPTH_TEXTURE_MODE_ARB 0x884B +#endif + +#ifndef GL_ARB_shadow +#define GL_TEXTURE_COMPARE_MODE_ARB 0x884C +#define GL_TEXTURE_COMPARE_FUNC_ARB 0x884D +#define GL_COMPARE_R_TO_TEXTURE_ARB 0x884E +#endif + +#ifndef GL_ARB_shadow_ambient +#define GL_TEXTURE_COMPARE_FAIL_VALUE_ARB 0x80BF +#endif + +#ifndef GL_ARB_window_pos +#endif + +#ifndef GL_ARB_vertex_program +#define GL_COLOR_SUM_ARB 0x8458 +#define GL_VERTEX_PROGRAM_ARB 0x8620 +#define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622 +#define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB 0x8623 +#define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624 +#define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB 0x8625 +#define GL_CURRENT_VERTEX_ATTRIB_ARB 0x8626 +#define GL_PROGRAM_LENGTH_ARB 0x8627 +#define GL_PROGRAM_STRING_ARB 0x8628 +#define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862E +#define GL_MAX_PROGRAM_MATRICES_ARB 0x862F +#define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640 +#define GL_CURRENT_MATRIX_ARB 0x8641 +#define GL_VERTEX_PROGRAM_POINT_SIZE_ARB 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE_ARB 0x8643 +#define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645 +#define GL_PROGRAM_ERROR_POSITION_ARB 0x864B +#define GL_PROGRAM_BINDING_ARB 0x8677 +#define GL_MAX_VERTEX_ATTRIBS_ARB 0x8869 +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886A +#define GL_PROGRAM_ERROR_STRING_ARB 0x8874 +#define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875 +#define GL_PROGRAM_FORMAT_ARB 0x8876 +#define GL_PROGRAM_INSTRUCTIONS_ARB 0x88A0 +#define GL_MAX_PROGRAM_INSTRUCTIONS_ARB 0x88A1 +#define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A2 +#define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A3 +#define GL_PROGRAM_TEMPORARIES_ARB 0x88A4 +#define GL_MAX_PROGRAM_TEMPORARIES_ARB 0x88A5 +#define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A6 +#define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A7 +#define GL_PROGRAM_PARAMETERS_ARB 0x88A8 +#define GL_MAX_PROGRAM_PARAMETERS_ARB 0x88A9 +#define GL_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AA +#define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AB +#define GL_PROGRAM_ATTRIBS_ARB 0x88AC +#define GL_MAX_PROGRAM_ATTRIBS_ARB 0x88AD +#define GL_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AE +#define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AF +#define GL_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B0 +#define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B1 +#define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B2 +#define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B3 +#define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88B4 +#define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88B5 +#define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88B6 +#define GL_TRANSPOSE_CURRENT_MATRIX_ARB 0x88B7 +#define GL_MATRIX0_ARB 0x88C0 +#define GL_MATRIX1_ARB 0x88C1 +#define GL_MATRIX2_ARB 0x88C2 +#define GL_MATRIX3_ARB 0x88C3 +#define GL_MATRIX4_ARB 0x88C4 +#define GL_MATRIX5_ARB 0x88C5 +#define GL_MATRIX6_ARB 0x88C6 +#define GL_MATRIX7_ARB 0x88C7 +#define GL_MATRIX8_ARB 0x88C8 +#define GL_MATRIX9_ARB 0x88C9 +#define GL_MATRIX10_ARB 0x88CA +#define GL_MATRIX11_ARB 0x88CB +#define GL_MATRIX12_ARB 0x88CC +#define GL_MATRIX13_ARB 0x88CD +#define GL_MATRIX14_ARB 0x88CE +#define GL_MATRIX15_ARB 0x88CF +#define GL_MATRIX16_ARB 0x88D0 +#define GL_MATRIX17_ARB 0x88D1 +#define GL_MATRIX18_ARB 0x88D2 +#define GL_MATRIX19_ARB 0x88D3 +#define GL_MATRIX20_ARB 0x88D4 +#define GL_MATRIX21_ARB 0x88D5 +#define GL_MATRIX22_ARB 0x88D6 +#define GL_MATRIX23_ARB 0x88D7 +#define GL_MATRIX24_ARB 0x88D8 +#define GL_MATRIX25_ARB 0x88D9 +#define GL_MATRIX26_ARB 0x88DA +#define GL_MATRIX27_ARB 0x88DB +#define GL_MATRIX28_ARB 0x88DC +#define GL_MATRIX29_ARB 0x88DD +#define GL_MATRIX30_ARB 0x88DE +#define GL_MATRIX31_ARB 0x88DF +#endif + +#ifndef GL_ARB_fragment_program +#define GL_FRAGMENT_PROGRAM_ARB 0x8804 +#define GL_PROGRAM_ALU_INSTRUCTIONS_ARB 0x8805 +#define GL_PROGRAM_TEX_INSTRUCTIONS_ARB 0x8806 +#define GL_PROGRAM_TEX_INDIRECTIONS_ARB 0x8807 +#define GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x8808 +#define GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x8809 +#define GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x880A +#define GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB 0x880B +#define GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB 0x880C +#define GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB 0x880D +#define GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x880E +#define GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x880F +#define GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x8810 +#define GL_MAX_TEXTURE_COORDS_ARB 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872 +#endif + +#ifndef GL_ARB_vertex_buffer_object +#define GL_BUFFER_SIZE_ARB 0x8764 +#define GL_BUFFER_USAGE_ARB 0x8765 +#define GL_ARRAY_BUFFER_ARB 0x8892 +#define GL_ELEMENT_ARRAY_BUFFER_ARB 0x8893 +#define GL_ARRAY_BUFFER_BINDING_ARB 0x8894 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895 +#define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB 0x8896 +#define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB 0x8897 +#define GL_COLOR_ARRAY_BUFFER_BINDING_ARB 0x8898 +#define GL_INDEX_ARRAY_BUFFER_BINDING_ARB 0x8899 +#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB 0x889A +#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB 0x889B +#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889C +#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB 0x889D +#define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB 0x889E +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB 0x889F +#define GL_READ_ONLY_ARB 0x88B8 +#define GL_WRITE_ONLY_ARB 0x88B9 +#define GL_READ_WRITE_ARB 0x88BA +#define GL_BUFFER_ACCESS_ARB 0x88BB +#define GL_BUFFER_MAPPED_ARB 0x88BC +#define GL_BUFFER_MAP_POINTER_ARB 0x88BD +#define GL_STREAM_DRAW_ARB 0x88E0 +#define GL_STREAM_READ_ARB 0x88E1 +#define GL_STREAM_COPY_ARB 0x88E2 +#define GL_STATIC_DRAW_ARB 0x88E4 +#define GL_STATIC_READ_ARB 0x88E5 +#define GL_STATIC_COPY_ARB 0x88E6 +#define GL_DYNAMIC_DRAW_ARB 0x88E8 +#define GL_DYNAMIC_READ_ARB 0x88E9 +#define GL_DYNAMIC_COPY_ARB 0x88EA +#endif + +#ifndef GL_ARB_occlusion_query +#define GL_QUERY_COUNTER_BITS_ARB 0x8864 +#define GL_CURRENT_QUERY_ARB 0x8865 +#define GL_QUERY_RESULT_ARB 0x8866 +#define GL_QUERY_RESULT_AVAILABLE_ARB 0x8867 +#define GL_SAMPLES_PASSED_ARB 0x8914 +#endif + +#ifndef GL_ARB_shader_objects +#define GL_PROGRAM_OBJECT_ARB 0x8B40 +#define GL_SHADER_OBJECT_ARB 0x8B48 +#define GL_OBJECT_TYPE_ARB 0x8B4E +#define GL_OBJECT_SUBTYPE_ARB 0x8B4F +#define GL_FLOAT_VEC2_ARB 0x8B50 +#define GL_FLOAT_VEC3_ARB 0x8B51 +#define GL_FLOAT_VEC4_ARB 0x8B52 +#define GL_INT_VEC2_ARB 0x8B53 +#define GL_INT_VEC3_ARB 0x8B54 +#define GL_INT_VEC4_ARB 0x8B55 +#define GL_BOOL_ARB 0x8B56 +#define GL_BOOL_VEC2_ARB 0x8B57 +#define GL_BOOL_VEC3_ARB 0x8B58 +#define GL_BOOL_VEC4_ARB 0x8B59 +#define GL_FLOAT_MAT2_ARB 0x8B5A +#define GL_FLOAT_MAT3_ARB 0x8B5B +#define GL_FLOAT_MAT4_ARB 0x8B5C +#define GL_SAMPLER_1D_ARB 0x8B5D +#define GL_SAMPLER_2D_ARB 0x8B5E +#define GL_SAMPLER_3D_ARB 0x8B5F +#define GL_SAMPLER_CUBE_ARB 0x8B60 +#define GL_SAMPLER_1D_SHADOW_ARB 0x8B61 +#define GL_SAMPLER_2D_SHADOW_ARB 0x8B62 +#define GL_SAMPLER_2D_RECT_ARB 0x8B63 +#define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64 +#define GL_OBJECT_DELETE_STATUS_ARB 0x8B80 +#define GL_OBJECT_COMPILE_STATUS_ARB 0x8B81 +#define GL_OBJECT_LINK_STATUS_ARB 0x8B82 +#define GL_OBJECT_VALIDATE_STATUS_ARB 0x8B83 +#define GL_OBJECT_INFO_LOG_LENGTH_ARB 0x8B84 +#define GL_OBJECT_ATTACHED_OBJECTS_ARB 0x8B85 +#define GL_OBJECT_ACTIVE_UNIFORMS_ARB 0x8B86 +#define GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB 0x8B87 +#define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB 0x8B88 +#endif + +#ifndef GL_ARB_vertex_shader +#define GL_VERTEX_SHADER_ARB 0x8B31 +#define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB 0x8B4A +#define GL_MAX_VARYING_FLOATS_ARB 0x8B4B +#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C +#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB 0x8B4D +#define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB 0x8B89 +#define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB 0x8B8A +#endif + +#ifndef GL_ARB_fragment_shader +#define GL_FRAGMENT_SHADER_ARB 0x8B30 +#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB 0x8B49 +#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB 0x8B8B +#endif + +#ifndef GL_ARB_shading_language_100 +#define GL_SHADING_LANGUAGE_VERSION_ARB 0x8B8C +#endif + +#ifndef GL_ARB_texture_non_power_of_two +#endif + +#ifndef GL_ARB_point_sprite +#define GL_POINT_SPRITE_ARB 0x8861 +#define GL_COORD_REPLACE_ARB 0x8862 +#endif + +#ifndef GL_ARB_fragment_program_shadow +#endif + +#ifndef GL_ARB_draw_buffers +#define GL_MAX_DRAW_BUFFERS_ARB 0x8824 +#define GL_DRAW_BUFFER0_ARB 0x8825 +#define GL_DRAW_BUFFER1_ARB 0x8826 +#define GL_DRAW_BUFFER2_ARB 0x8827 +#define GL_DRAW_BUFFER3_ARB 0x8828 +#define GL_DRAW_BUFFER4_ARB 0x8829 +#define GL_DRAW_BUFFER5_ARB 0x882A +#define GL_DRAW_BUFFER6_ARB 0x882B +#define GL_DRAW_BUFFER7_ARB 0x882C +#define GL_DRAW_BUFFER8_ARB 0x882D +#define GL_DRAW_BUFFER9_ARB 0x882E +#define GL_DRAW_BUFFER10_ARB 0x882F +#define GL_DRAW_BUFFER11_ARB 0x8830 +#define GL_DRAW_BUFFER12_ARB 0x8831 +#define GL_DRAW_BUFFER13_ARB 0x8832 +#define GL_DRAW_BUFFER14_ARB 0x8833 +#define GL_DRAW_BUFFER15_ARB 0x8834 +#endif + +#ifndef GL_ARB_texture_rectangle +#define GL_TEXTURE_RECTANGLE_ARB 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE_ARB 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE_ARB 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB 0x84F8 +#endif + +#ifndef GL_ARB_color_buffer_float +#define GL_RGBA_FLOAT_MODE_ARB 0x8820 +#define GL_CLAMP_VERTEX_COLOR_ARB 0x891A +#define GL_CLAMP_FRAGMENT_COLOR_ARB 0x891B +#define GL_CLAMP_READ_COLOR_ARB 0x891C +#define GL_FIXED_ONLY_ARB 0x891D +#endif + +#ifndef GL_ARB_half_float_pixel +#define GL_HALF_FLOAT_ARB 0x140B +#endif + +#ifndef GL_ARB_texture_float +#define GL_TEXTURE_RED_TYPE_ARB 0x8C10 +#define GL_TEXTURE_GREEN_TYPE_ARB 0x8C11 +#define GL_TEXTURE_BLUE_TYPE_ARB 0x8C12 +#define GL_TEXTURE_ALPHA_TYPE_ARB 0x8C13 +#define GL_TEXTURE_LUMINANCE_TYPE_ARB 0x8C14 +#define GL_TEXTURE_INTENSITY_TYPE_ARB 0x8C15 +#define GL_TEXTURE_DEPTH_TYPE_ARB 0x8C16 +#define GL_UNSIGNED_NORMALIZED_ARB 0x8C17 +#define GL_RGBA32F_ARB 0x8814 +#define GL_RGB32F_ARB 0x8815 +#define GL_ALPHA32F_ARB 0x8816 +#define GL_INTENSITY32F_ARB 0x8817 +#define GL_LUMINANCE32F_ARB 0x8818 +#define GL_LUMINANCE_ALPHA32F_ARB 0x8819 +#define GL_RGBA16F_ARB 0x881A +#define GL_RGB16F_ARB 0x881B +#define GL_ALPHA16F_ARB 0x881C +#define GL_INTENSITY16F_ARB 0x881D +#define GL_LUMINANCE16F_ARB 0x881E +#define GL_LUMINANCE_ALPHA16F_ARB 0x881F +#endif + +#ifndef GL_ARB_pixel_buffer_object +#define GL_PIXEL_PACK_BUFFER_ARB 0x88EB +#define GL_PIXEL_UNPACK_BUFFER_ARB 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING_ARB 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING_ARB 0x88EF +#endif + +#ifndef GL_EXT_abgr +#define GL_ABGR_EXT 0x8000 +#endif + +#ifndef GL_EXT_blend_color +#define GL_CONSTANT_COLOR_EXT 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR_EXT 0x8002 +#define GL_CONSTANT_ALPHA_EXT 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA_EXT 0x8004 +#define GL_BLEND_COLOR_EXT 0x8005 +#endif + +#ifndef GL_EXT_polygon_offset +#define GL_POLYGON_OFFSET_EXT 0x8037 +#define GL_POLYGON_OFFSET_FACTOR_EXT 0x8038 +#define GL_POLYGON_OFFSET_BIAS_EXT 0x8039 +#endif + +#ifndef GL_EXT_texture +#define GL_ALPHA4_EXT 0x803B +#define GL_ALPHA8_EXT 0x803C +#define GL_ALPHA12_EXT 0x803D +#define GL_ALPHA16_EXT 0x803E +#define GL_LUMINANCE4_EXT 0x803F +#define GL_LUMINANCE8_EXT 0x8040 +#define GL_LUMINANCE12_EXT 0x8041 +#define GL_LUMINANCE16_EXT 0x8042 +#define GL_LUMINANCE4_ALPHA4_EXT 0x8043 +#define GL_LUMINANCE6_ALPHA2_EXT 0x8044 +#define GL_LUMINANCE8_ALPHA8_EXT 0x8045 +#define GL_LUMINANCE12_ALPHA4_EXT 0x8046 +#define GL_LUMINANCE12_ALPHA12_EXT 0x8047 +#define GL_LUMINANCE16_ALPHA16_EXT 0x8048 +#define GL_INTENSITY_EXT 0x8049 +#define GL_INTENSITY4_EXT 0x804A +#define GL_INTENSITY8_EXT 0x804B +#define GL_INTENSITY12_EXT 0x804C +#define GL_INTENSITY16_EXT 0x804D +#define GL_RGB2_EXT 0x804E +#define GL_RGB4_EXT 0x804F +#define GL_RGB5_EXT 0x8050 +#define GL_RGB8_EXT 0x8051 +#define GL_RGB10_EXT 0x8052 +#define GL_RGB12_EXT 0x8053 +#define GL_RGB16_EXT 0x8054 +#define GL_RGBA2_EXT 0x8055 +#define GL_RGBA4_EXT 0x8056 +#define GL_RGB5_A1_EXT 0x8057 +#define GL_RGBA8_EXT 0x8058 +#define GL_RGB10_A2_EXT 0x8059 +#define GL_RGBA12_EXT 0x805A +#define GL_RGBA16_EXT 0x805B +#define GL_TEXTURE_RED_SIZE_EXT 0x805C +#define GL_TEXTURE_GREEN_SIZE_EXT 0x805D +#define GL_TEXTURE_BLUE_SIZE_EXT 0x805E +#define GL_TEXTURE_ALPHA_SIZE_EXT 0x805F +#define GL_TEXTURE_LUMINANCE_SIZE_EXT 0x8060 +#define GL_TEXTURE_INTENSITY_SIZE_EXT 0x8061 +#define GL_REPLACE_EXT 0x8062 +#define GL_PROXY_TEXTURE_1D_EXT 0x8063 +#define GL_PROXY_TEXTURE_2D_EXT 0x8064 +#define GL_TEXTURE_TOO_LARGE_EXT 0x8065 +#endif + +#ifndef GL_EXT_texture3D +#define GL_PACK_SKIP_IMAGES_EXT 0x806B +#define GL_PACK_IMAGE_HEIGHT_EXT 0x806C +#define GL_UNPACK_SKIP_IMAGES_EXT 0x806D +#define GL_UNPACK_IMAGE_HEIGHT_EXT 0x806E +#define GL_TEXTURE_3D_EXT 0x806F +#define GL_PROXY_TEXTURE_3D_EXT 0x8070 +#define GL_TEXTURE_DEPTH_EXT 0x8071 +#define GL_TEXTURE_WRAP_R_EXT 0x8072 +#define GL_MAX_3D_TEXTURE_SIZE_EXT 0x8073 +#endif + +#ifndef GL_SGIS_texture_filter4 +#define GL_FILTER4_SGIS 0x8146 +#define GL_TEXTURE_FILTER4_SIZE_SGIS 0x8147 +#endif + +#ifndef GL_EXT_subtexture +#endif + +#ifndef GL_EXT_copy_texture +#endif + +#ifndef GL_EXT_histogram +#define GL_HISTOGRAM_EXT 0x8024 +#define GL_PROXY_HISTOGRAM_EXT 0x8025 +#define GL_HISTOGRAM_WIDTH_EXT 0x8026 +#define GL_HISTOGRAM_FORMAT_EXT 0x8027 +#define GL_HISTOGRAM_RED_SIZE_EXT 0x8028 +#define GL_HISTOGRAM_GREEN_SIZE_EXT 0x8029 +#define GL_HISTOGRAM_BLUE_SIZE_EXT 0x802A +#define GL_HISTOGRAM_ALPHA_SIZE_EXT 0x802B +#define GL_HISTOGRAM_LUMINANCE_SIZE_EXT 0x802C +#define GL_HISTOGRAM_SINK_EXT 0x802D +#define GL_MINMAX_EXT 0x802E +#define GL_MINMAX_FORMAT_EXT 0x802F +#define GL_MINMAX_SINK_EXT 0x8030 +#define GL_TABLE_TOO_LARGE_EXT 0x8031 +#endif + +#ifndef GL_EXT_convolution +#define GL_CONVOLUTION_1D_EXT 0x8010 +#define GL_CONVOLUTION_2D_EXT 0x8011 +#define GL_SEPARABLE_2D_EXT 0x8012 +#define GL_CONVOLUTION_BORDER_MODE_EXT 0x8013 +#define GL_CONVOLUTION_FILTER_SCALE_EXT 0x8014 +#define GL_CONVOLUTION_FILTER_BIAS_EXT 0x8015 +#define GL_REDUCE_EXT 0x8016 +#define GL_CONVOLUTION_FORMAT_EXT 0x8017 +#define GL_CONVOLUTION_WIDTH_EXT 0x8018 +#define GL_CONVOLUTION_HEIGHT_EXT 0x8019 +#define GL_MAX_CONVOLUTION_WIDTH_EXT 0x801A +#define GL_MAX_CONVOLUTION_HEIGHT_EXT 0x801B +#define GL_POST_CONVOLUTION_RED_SCALE_EXT 0x801C +#define GL_POST_CONVOLUTION_GREEN_SCALE_EXT 0x801D +#define GL_POST_CONVOLUTION_BLUE_SCALE_EXT 0x801E +#define GL_POST_CONVOLUTION_ALPHA_SCALE_EXT 0x801F +#define GL_POST_CONVOLUTION_RED_BIAS_EXT 0x8020 +#define GL_POST_CONVOLUTION_GREEN_BIAS_EXT 0x8021 +#define GL_POST_CONVOLUTION_BLUE_BIAS_EXT 0x8022 +#define GL_POST_CONVOLUTION_ALPHA_BIAS_EXT 0x8023 +#endif + +#ifndef GL_SGI_color_matrix +#define GL_COLOR_MATRIX_SGI 0x80B1 +#define GL_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B2 +#define GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B3 +#define GL_POST_COLOR_MATRIX_RED_SCALE_SGI 0x80B4 +#define GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI 0x80B5 +#define GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI 0x80B6 +#define GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI 0x80B7 +#define GL_POST_COLOR_MATRIX_RED_BIAS_SGI 0x80B8 +#define GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI 0x80B9 +#define GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI 0x80BA +#define GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI 0x80BB +#endif + +#ifndef GL_SGI_color_table +#define GL_COLOR_TABLE_SGI 0x80D0 +#define GL_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D1 +#define GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D2 +#define GL_PROXY_COLOR_TABLE_SGI 0x80D3 +#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D4 +#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D5 +#define GL_COLOR_TABLE_SCALE_SGI 0x80D6 +#define GL_COLOR_TABLE_BIAS_SGI 0x80D7 +#define GL_COLOR_TABLE_FORMAT_SGI 0x80D8 +#define GL_COLOR_TABLE_WIDTH_SGI 0x80D9 +#define GL_COLOR_TABLE_RED_SIZE_SGI 0x80DA +#define GL_COLOR_TABLE_GREEN_SIZE_SGI 0x80DB +#define GL_COLOR_TABLE_BLUE_SIZE_SGI 0x80DC +#define GL_COLOR_TABLE_ALPHA_SIZE_SGI 0x80DD +#define GL_COLOR_TABLE_LUMINANCE_SIZE_SGI 0x80DE +#define GL_COLOR_TABLE_INTENSITY_SIZE_SGI 0x80DF +#endif + +#ifndef GL_SGIS_pixel_texture +#define GL_PIXEL_TEXTURE_SGIS 0x8353 +#define GL_PIXEL_FRAGMENT_RGB_SOURCE_SGIS 0x8354 +#define GL_PIXEL_FRAGMENT_ALPHA_SOURCE_SGIS 0x8355 +#define GL_PIXEL_GROUP_COLOR_SGIS 0x8356 +#endif + +#ifndef GL_SGIX_pixel_texture +#define GL_PIXEL_TEX_GEN_SGIX 0x8139 +#define GL_PIXEL_TEX_GEN_MODE_SGIX 0x832B +#endif + +#ifndef GL_SGIS_texture4D +#define GL_PACK_SKIP_VOLUMES_SGIS 0x8130 +#define GL_PACK_IMAGE_DEPTH_SGIS 0x8131 +#define GL_UNPACK_SKIP_VOLUMES_SGIS 0x8132 +#define GL_UNPACK_IMAGE_DEPTH_SGIS 0x8133 +#define GL_TEXTURE_4D_SGIS 0x8134 +#define GL_PROXY_TEXTURE_4D_SGIS 0x8135 +#define GL_TEXTURE_4DSIZE_SGIS 0x8136 +#define GL_TEXTURE_WRAP_Q_SGIS 0x8137 +#define GL_MAX_4D_TEXTURE_SIZE_SGIS 0x8138 +#define GL_TEXTURE_4D_BINDING_SGIS 0x814F +#endif + +#ifndef GL_SGI_texture_color_table +#define GL_TEXTURE_COLOR_TABLE_SGI 0x80BC +#define GL_PROXY_TEXTURE_COLOR_TABLE_SGI 0x80BD +#endif + +#ifndef GL_EXT_cmyka +#define GL_CMYK_EXT 0x800C +#define GL_CMYKA_EXT 0x800D +#define GL_PACK_CMYK_HINT_EXT 0x800E +#define GL_UNPACK_CMYK_HINT_EXT 0x800F +#endif + +#ifndef GL_EXT_texture_object +#define GL_TEXTURE_PRIORITY_EXT 0x8066 +#define GL_TEXTURE_RESIDENT_EXT 0x8067 +#define GL_TEXTURE_1D_BINDING_EXT 0x8068 +#define GL_TEXTURE_2D_BINDING_EXT 0x8069 +#define GL_TEXTURE_3D_BINDING_EXT 0x806A +#endif + +#ifndef GL_SGIS_detail_texture +#define GL_DETAIL_TEXTURE_2D_SGIS 0x8095 +#define GL_DETAIL_TEXTURE_2D_BINDING_SGIS 0x8096 +#define GL_LINEAR_DETAIL_SGIS 0x8097 +#define GL_LINEAR_DETAIL_ALPHA_SGIS 0x8098 +#define GL_LINEAR_DETAIL_COLOR_SGIS 0x8099 +#define GL_DETAIL_TEXTURE_LEVEL_SGIS 0x809A +#define GL_DETAIL_TEXTURE_MODE_SGIS 0x809B +#define GL_DETAIL_TEXTURE_FUNC_POINTS_SGIS 0x809C +#endif + +#ifndef GL_SGIS_sharpen_texture +#define GL_LINEAR_SHARPEN_SGIS 0x80AD +#define GL_LINEAR_SHARPEN_ALPHA_SGIS 0x80AE +#define GL_LINEAR_SHARPEN_COLOR_SGIS 0x80AF +#define GL_SHARPEN_TEXTURE_FUNC_POINTS_SGIS 0x80B0 +#endif + +#ifndef GL_EXT_packed_pixels +#define GL_UNSIGNED_BYTE_3_3_2_EXT 0x8032 +#define GL_UNSIGNED_SHORT_4_4_4_4_EXT 0x8033 +#define GL_UNSIGNED_SHORT_5_5_5_1_EXT 0x8034 +#define GL_UNSIGNED_INT_8_8_8_8_EXT 0x8035 +#define GL_UNSIGNED_INT_10_10_10_2_EXT 0x8036 +#endif + +#ifndef GL_SGIS_texture_lod +#define GL_TEXTURE_MIN_LOD_SGIS 0x813A +#define GL_TEXTURE_MAX_LOD_SGIS 0x813B +#define GL_TEXTURE_BASE_LEVEL_SGIS 0x813C +#define GL_TEXTURE_MAX_LEVEL_SGIS 0x813D +#endif + +#ifndef GL_SGIS_multisample +#define GL_MULTISAMPLE_SGIS 0x809D +#define GL_SAMPLE_ALPHA_TO_MASK_SGIS 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_SGIS 0x809F +#define GL_SAMPLE_MASK_SGIS 0x80A0 +#define GL_1PASS_SGIS 0x80A1 +#define GL_2PASS_0_SGIS 0x80A2 +#define GL_2PASS_1_SGIS 0x80A3 +#define GL_4PASS_0_SGIS 0x80A4 +#define GL_4PASS_1_SGIS 0x80A5 +#define GL_4PASS_2_SGIS 0x80A6 +#define GL_4PASS_3_SGIS 0x80A7 +#define GL_SAMPLE_BUFFERS_SGIS 0x80A8 +#define GL_SAMPLES_SGIS 0x80A9 +#define GL_SAMPLE_MASK_VALUE_SGIS 0x80AA +#define GL_SAMPLE_MASK_INVERT_SGIS 0x80AB +#define GL_SAMPLE_PATTERN_SGIS 0x80AC +#endif + +#ifndef GL_EXT_rescale_normal +#define GL_RESCALE_NORMAL_EXT 0x803A +#endif + +#ifndef GL_EXT_vertex_array +#define GL_VERTEX_ARRAY_EXT 0x8074 +#define GL_NORMAL_ARRAY_EXT 0x8075 +#define GL_COLOR_ARRAY_EXT 0x8076 +#define GL_INDEX_ARRAY_EXT 0x8077 +#define GL_TEXTURE_COORD_ARRAY_EXT 0x8078 +#define GL_EDGE_FLAG_ARRAY_EXT 0x8079 +#define GL_VERTEX_ARRAY_SIZE_EXT 0x807A +#define GL_VERTEX_ARRAY_TYPE_EXT 0x807B +#define GL_VERTEX_ARRAY_STRIDE_EXT 0x807C +#define GL_VERTEX_ARRAY_COUNT_EXT 0x807D +#define GL_NORMAL_ARRAY_TYPE_EXT 0x807E +#define GL_NORMAL_ARRAY_STRIDE_EXT 0x807F +#define GL_NORMAL_ARRAY_COUNT_EXT 0x8080 +#define GL_COLOR_ARRAY_SIZE_EXT 0x8081 +#define GL_COLOR_ARRAY_TYPE_EXT 0x8082 +#define GL_COLOR_ARRAY_STRIDE_EXT 0x8083 +#define GL_COLOR_ARRAY_COUNT_EXT 0x8084 +#define GL_INDEX_ARRAY_TYPE_EXT 0x8085 +#define GL_INDEX_ARRAY_STRIDE_EXT 0x8086 +#define GL_INDEX_ARRAY_COUNT_EXT 0x8087 +#define GL_TEXTURE_COORD_ARRAY_SIZE_EXT 0x8088 +#define GL_TEXTURE_COORD_ARRAY_TYPE_EXT 0x8089 +#define GL_TEXTURE_COORD_ARRAY_STRIDE_EXT 0x808A +#define GL_TEXTURE_COORD_ARRAY_COUNT_EXT 0x808B +#define GL_EDGE_FLAG_ARRAY_STRIDE_EXT 0x808C +#define GL_EDGE_FLAG_ARRAY_COUNT_EXT 0x808D +#define GL_VERTEX_ARRAY_POINTER_EXT 0x808E +#define GL_NORMAL_ARRAY_POINTER_EXT 0x808F +#define GL_COLOR_ARRAY_POINTER_EXT 0x8090 +#define GL_INDEX_ARRAY_POINTER_EXT 0x8091 +#define GL_TEXTURE_COORD_ARRAY_POINTER_EXT 0x8092 +#define GL_EDGE_FLAG_ARRAY_POINTER_EXT 0x8093 +#endif + +#ifndef GL_EXT_misc_attribute +#endif + +#ifndef GL_SGIS_generate_mipmap +#define GL_GENERATE_MIPMAP_SGIS 0x8191 +#define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192 +#endif + +#ifndef GL_SGIX_clipmap +#define GL_LINEAR_CLIPMAP_LINEAR_SGIX 0x8170 +#define GL_TEXTURE_CLIPMAP_CENTER_SGIX 0x8171 +#define GL_TEXTURE_CLIPMAP_FRAME_SGIX 0x8172 +#define GL_TEXTURE_CLIPMAP_OFFSET_SGIX 0x8173 +#define GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8174 +#define GL_TEXTURE_CLIPMAP_LOD_OFFSET_SGIX 0x8175 +#define GL_TEXTURE_CLIPMAP_DEPTH_SGIX 0x8176 +#define GL_MAX_CLIPMAP_DEPTH_SGIX 0x8177 +#define GL_MAX_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8178 +#define GL_NEAREST_CLIPMAP_NEAREST_SGIX 0x844D +#define GL_NEAREST_CLIPMAP_LINEAR_SGIX 0x844E +#define GL_LINEAR_CLIPMAP_NEAREST_SGIX 0x844F +#endif + +#ifndef GL_SGIX_shadow +#define GL_TEXTURE_COMPARE_SGIX 0x819A +#define GL_TEXTURE_COMPARE_OPERATOR_SGIX 0x819B +#define GL_TEXTURE_LEQUAL_R_SGIX 0x819C +#define GL_TEXTURE_GEQUAL_R_SGIX 0x819D +#endif + +#ifndef GL_SGIS_texture_edge_clamp +#define GL_CLAMP_TO_EDGE_SGIS 0x812F +#endif + +#ifndef GL_SGIS_texture_border_clamp +#define GL_CLAMP_TO_BORDER_SGIS 0x812D +#endif + +#ifndef GL_EXT_blend_minmax +#define GL_FUNC_ADD_EXT 0x8006 +#define GL_MIN_EXT 0x8007 +#define GL_MAX_EXT 0x8008 +#define GL_BLEND_EQUATION_EXT 0x8009 +#endif + +#ifndef GL_EXT_blend_subtract +#define GL_FUNC_SUBTRACT_EXT 0x800A +#define GL_FUNC_REVERSE_SUBTRACT_EXT 0x800B +#endif + +#ifndef GL_EXT_blend_logic_op +#endif + +#ifndef GL_SGIX_interlace +#define GL_INTERLACE_SGIX 0x8094 +#endif + +#ifndef GL_SGIX_pixel_tiles +#define GL_PIXEL_TILE_BEST_ALIGNMENT_SGIX 0x813E +#define GL_PIXEL_TILE_CACHE_INCREMENT_SGIX 0x813F +#define GL_PIXEL_TILE_WIDTH_SGIX 0x8140 +#define GL_PIXEL_TILE_HEIGHT_SGIX 0x8141 +#define GL_PIXEL_TILE_GRID_WIDTH_SGIX 0x8142 +#define GL_PIXEL_TILE_GRID_HEIGHT_SGIX 0x8143 +#define GL_PIXEL_TILE_GRID_DEPTH_SGIX 0x8144 +#define GL_PIXEL_TILE_CACHE_SIZE_SGIX 0x8145 +#endif + +#ifndef GL_SGIS_texture_select +#define GL_DUAL_ALPHA4_SGIS 0x8110 +#define GL_DUAL_ALPHA8_SGIS 0x8111 +#define GL_DUAL_ALPHA12_SGIS 0x8112 +#define GL_DUAL_ALPHA16_SGIS 0x8113 +#define GL_DUAL_LUMINANCE4_SGIS 0x8114 +#define GL_DUAL_LUMINANCE8_SGIS 0x8115 +#define GL_DUAL_LUMINANCE12_SGIS 0x8116 +#define GL_DUAL_LUMINANCE16_SGIS 0x8117 +#define GL_DUAL_INTENSITY4_SGIS 0x8118 +#define GL_DUAL_INTENSITY8_SGIS 0x8119 +#define GL_DUAL_INTENSITY12_SGIS 0x811A +#define GL_DUAL_INTENSITY16_SGIS 0x811B +#define GL_DUAL_LUMINANCE_ALPHA4_SGIS 0x811C +#define GL_DUAL_LUMINANCE_ALPHA8_SGIS 0x811D +#define GL_QUAD_ALPHA4_SGIS 0x811E +#define GL_QUAD_ALPHA8_SGIS 0x811F +#define GL_QUAD_LUMINANCE4_SGIS 0x8120 +#define GL_QUAD_LUMINANCE8_SGIS 0x8121 +#define GL_QUAD_INTENSITY4_SGIS 0x8122 +#define GL_QUAD_INTENSITY8_SGIS 0x8123 +#define GL_DUAL_TEXTURE_SELECT_SGIS 0x8124 +#define GL_QUAD_TEXTURE_SELECT_SGIS 0x8125 +#endif + +#ifndef GL_SGIX_sprite +#define GL_SPRITE_SGIX 0x8148 +#define GL_SPRITE_MODE_SGIX 0x8149 +#define GL_SPRITE_AXIS_SGIX 0x814A +#define GL_SPRITE_TRANSLATION_SGIX 0x814B +#define GL_SPRITE_AXIAL_SGIX 0x814C +#define GL_SPRITE_OBJECT_ALIGNED_SGIX 0x814D +#define GL_SPRITE_EYE_ALIGNED_SGIX 0x814E +#endif + +#ifndef GL_SGIX_texture_multi_buffer +#define GL_TEXTURE_MULTI_BUFFER_HINT_SGIX 0x812E +#endif + +#ifndef GL_EXT_point_parameters +#define GL_POINT_SIZE_MIN_EXT 0x8126 +#define GL_POINT_SIZE_MAX_EXT 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128 +#define GL_DISTANCE_ATTENUATION_EXT 0x8129 +#endif + +#ifndef GL_SGIS_point_parameters +#define GL_POINT_SIZE_MIN_SGIS 0x8126 +#define GL_POINT_SIZE_MAX_SGIS 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_SGIS 0x8128 +#define GL_DISTANCE_ATTENUATION_SGIS 0x8129 +#endif + +#ifndef GL_SGIX_instruments +#define GL_INSTRUMENT_BUFFER_POINTER_SGIX 0x8180 +#define GL_INSTRUMENT_MEASUREMENTS_SGIX 0x8181 +#endif + +#ifndef GL_SGIX_texture_scale_bias +#define GL_POST_TEXTURE_FILTER_BIAS_SGIX 0x8179 +#define GL_POST_TEXTURE_FILTER_SCALE_SGIX 0x817A +#define GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX 0x817B +#define GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX 0x817C +#endif + +#ifndef GL_SGIX_framezoom +#define GL_FRAMEZOOM_SGIX 0x818B +#define GL_FRAMEZOOM_FACTOR_SGIX 0x818C +#define GL_MAX_FRAMEZOOM_FACTOR_SGIX 0x818D +#endif + +#ifndef GL_SGIX_tag_sample_buffer +#endif + +#ifndef GL_FfdMaskSGIX +#define GL_TEXTURE_DEFORMATION_BIT_SGIX 0x00000001 +#define GL_GEOMETRY_DEFORMATION_BIT_SGIX 0x00000002 +#endif + +#ifndef GL_SGIX_polynomial_ffd +#define GL_GEOMETRY_DEFORMATION_SGIX 0x8194 +#define GL_TEXTURE_DEFORMATION_SGIX 0x8195 +#define GL_DEFORMATIONS_MASK_SGIX 0x8196 +#define GL_MAX_DEFORMATION_ORDER_SGIX 0x8197 +#endif + +#ifndef GL_SGIX_reference_plane +#define GL_REFERENCE_PLANE_SGIX 0x817D +#define GL_REFERENCE_PLANE_EQUATION_SGIX 0x817E +#endif + +#ifndef GL_SGIX_flush_raster +#endif + +#ifndef GL_SGIX_depth_texture +#define GL_DEPTH_COMPONENT16_SGIX 0x81A5 +#define GL_DEPTH_COMPONENT24_SGIX 0x81A6 +#define GL_DEPTH_COMPONENT32_SGIX 0x81A7 +#endif + +#ifndef GL_SGIS_fog_function +#define GL_FOG_FUNC_SGIS 0x812A +#define GL_FOG_FUNC_POINTS_SGIS 0x812B +#define GL_MAX_FOG_FUNC_POINTS_SGIS 0x812C +#endif + +#ifndef GL_SGIX_fog_offset +#define GL_FOG_OFFSET_SGIX 0x8198 +#define GL_FOG_OFFSET_VALUE_SGIX 0x8199 +#endif + +#ifndef GL_HP_image_transform +#define GL_IMAGE_SCALE_X_HP 0x8155 +#define GL_IMAGE_SCALE_Y_HP 0x8156 +#define GL_IMAGE_TRANSLATE_X_HP 0x8157 +#define GL_IMAGE_TRANSLATE_Y_HP 0x8158 +#define GL_IMAGE_ROTATE_ANGLE_HP 0x8159 +#define GL_IMAGE_ROTATE_ORIGIN_X_HP 0x815A +#define GL_IMAGE_ROTATE_ORIGIN_Y_HP 0x815B +#define GL_IMAGE_MAG_FILTER_HP 0x815C +#define GL_IMAGE_MIN_FILTER_HP 0x815D +#define GL_IMAGE_CUBIC_WEIGHT_HP 0x815E +#define GL_CUBIC_HP 0x815F +#define GL_AVERAGE_HP 0x8160 +#define GL_IMAGE_TRANSFORM_2D_HP 0x8161 +#define GL_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8162 +#define GL_PROXY_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8163 +#endif + +#ifndef GL_HP_convolution_border_modes +#define GL_IGNORE_BORDER_HP 0x8150 +#define GL_CONSTANT_BORDER_HP 0x8151 +#define GL_REPLICATE_BORDER_HP 0x8153 +#define GL_CONVOLUTION_BORDER_COLOR_HP 0x8154 +#endif + +#ifndef GL_INGR_palette_buffer +#endif + +#ifndef GL_SGIX_texture_add_env +#define GL_TEXTURE_ENV_BIAS_SGIX 0x80BE +#endif + +#ifndef GL_EXT_color_subtable +#endif + +#ifndef GL_PGI_vertex_hints +#define GL_VERTEX_DATA_HINT_PGI 0x1A22A +#define GL_VERTEX_CONSISTENT_HINT_PGI 0x1A22B +#define GL_MATERIAL_SIDE_HINT_PGI 0x1A22C +#define GL_MAX_VERTEX_HINT_PGI 0x1A22D +#define GL_COLOR3_BIT_PGI 0x00010000 +#define GL_COLOR4_BIT_PGI 0x00020000 +#define GL_EDGEFLAG_BIT_PGI 0x00040000 +#define GL_INDEX_BIT_PGI 0x00080000 +#define GL_MAT_AMBIENT_BIT_PGI 0x00100000 +#define GL_MAT_AMBIENT_AND_DIFFUSE_BIT_PGI 0x00200000 +#define GL_MAT_DIFFUSE_BIT_PGI 0x00400000 +#define GL_MAT_EMISSION_BIT_PGI 0x00800000 +#define GL_MAT_COLOR_INDEXES_BIT_PGI 0x01000000 +#define GL_MAT_SHININESS_BIT_PGI 0x02000000 +#define GL_MAT_SPECULAR_BIT_PGI 0x04000000 +#define GL_NORMAL_BIT_PGI 0x08000000 +#define GL_TEXCOORD1_BIT_PGI 0x10000000 +#define GL_TEXCOORD2_BIT_PGI 0x20000000 +#define GL_TEXCOORD3_BIT_PGI 0x40000000 +#define GL_TEXCOORD4_BIT_PGI 0x80000000 +#define GL_VERTEX23_BIT_PGI 0x00000004 +#define GL_VERTEX4_BIT_PGI 0x00000008 +#endif + +#ifndef GL_PGI_misc_hints +#define GL_PREFER_DOUBLEBUFFER_HINT_PGI 0x1A1F8 +#define GL_CONSERVE_MEMORY_HINT_PGI 0x1A1FD +#define GL_RECLAIM_MEMORY_HINT_PGI 0x1A1FE +#define GL_NATIVE_GRAPHICS_HANDLE_PGI 0x1A202 +#define GL_NATIVE_GRAPHICS_BEGIN_HINT_PGI 0x1A203 +#define GL_NATIVE_GRAPHICS_END_HINT_PGI 0x1A204 +#define GL_ALWAYS_FAST_HINT_PGI 0x1A20C +#define GL_ALWAYS_SOFT_HINT_PGI 0x1A20D +#define GL_ALLOW_DRAW_OBJ_HINT_PGI 0x1A20E +#define GL_ALLOW_DRAW_WIN_HINT_PGI 0x1A20F +#define GL_ALLOW_DRAW_FRG_HINT_PGI 0x1A210 +#define GL_ALLOW_DRAW_MEM_HINT_PGI 0x1A211 +#define GL_STRICT_DEPTHFUNC_HINT_PGI 0x1A216 +#define GL_STRICT_LIGHTING_HINT_PGI 0x1A217 +#define GL_STRICT_SCISSOR_HINT_PGI 0x1A218 +#define GL_FULL_STIPPLE_HINT_PGI 0x1A219 +#define GL_CLIP_NEAR_HINT_PGI 0x1A220 +#define GL_CLIP_FAR_HINT_PGI 0x1A221 +#define GL_WIDE_LINE_HINT_PGI 0x1A222 +#define GL_BACK_NORMALS_HINT_PGI 0x1A223 +#endif + +#ifndef GL_EXT_paletted_texture +#define GL_COLOR_INDEX1_EXT 0x80E2 +#define GL_COLOR_INDEX2_EXT 0x80E3 +#define GL_COLOR_INDEX4_EXT 0x80E4 +#define GL_COLOR_INDEX8_EXT 0x80E5 +#define GL_COLOR_INDEX12_EXT 0x80E6 +#define GL_COLOR_INDEX16_EXT 0x80E7 +#define GL_TEXTURE_INDEX_SIZE_EXT 0x80ED +#endif + +#ifndef GL_EXT_clip_volume_hint +#define GL_CLIP_VOLUME_CLIPPING_HINT_EXT 0x80F0 +#endif + +#ifndef GL_SGIX_list_priority +#define GL_LIST_PRIORITY_SGIX 0x8182 +#endif + +#ifndef GL_SGIX_ir_instrument1 +#define GL_IR_INSTRUMENT1_SGIX 0x817F +#endif + +#ifndef GL_SGIX_calligraphic_fragment +#define GL_CALLIGRAPHIC_FRAGMENT_SGIX 0x8183 +#endif + +#ifndef GL_SGIX_texture_lod_bias +#define GL_TEXTURE_LOD_BIAS_S_SGIX 0x818E +#define GL_TEXTURE_LOD_BIAS_T_SGIX 0x818F +#define GL_TEXTURE_LOD_BIAS_R_SGIX 0x8190 +#endif + +#ifndef GL_SGIX_shadow_ambient +#define GL_SHADOW_AMBIENT_SGIX 0x80BF +#endif + +#ifndef GL_EXT_index_texture +#endif + +#ifndef GL_EXT_index_material +#define GL_INDEX_MATERIAL_EXT 0x81B8 +#define GL_INDEX_MATERIAL_PARAMETER_EXT 0x81B9 +#define GL_INDEX_MATERIAL_FACE_EXT 0x81BA +#endif + +#ifndef GL_EXT_index_func +#define GL_INDEX_TEST_EXT 0x81B5 +#define GL_INDEX_TEST_FUNC_EXT 0x81B6 +#define GL_INDEX_TEST_REF_EXT 0x81B7 +#endif + +#ifndef GL_EXT_index_array_formats +#define GL_IUI_V2F_EXT 0x81AD +#define GL_IUI_V3F_EXT 0x81AE +#define GL_IUI_N3F_V2F_EXT 0x81AF +#define GL_IUI_N3F_V3F_EXT 0x81B0 +#define GL_T2F_IUI_V2F_EXT 0x81B1 +#define GL_T2F_IUI_V3F_EXT 0x81B2 +#define GL_T2F_IUI_N3F_V2F_EXT 0x81B3 +#define GL_T2F_IUI_N3F_V3F_EXT 0x81B4 +#endif + +#ifndef GL_EXT_compiled_vertex_array +#define GL_ARRAY_ELEMENT_LOCK_FIRST_EXT 0x81A8 +#define GL_ARRAY_ELEMENT_LOCK_COUNT_EXT 0x81A9 +#endif + +#ifndef GL_EXT_cull_vertex +#define GL_CULL_VERTEX_EXT 0x81AA +#define GL_CULL_VERTEX_EYE_POSITION_EXT 0x81AB +#define GL_CULL_VERTEX_OBJECT_POSITION_EXT 0x81AC +#endif + +#ifndef GL_SGIX_ycrcb +#define GL_YCRCB_422_SGIX 0x81BB +#define GL_YCRCB_444_SGIX 0x81BC +#endif + +#ifndef GL_SGIX_fragment_lighting +#define GL_FRAGMENT_LIGHTING_SGIX 0x8400 +#define GL_FRAGMENT_COLOR_MATERIAL_SGIX 0x8401 +#define GL_FRAGMENT_COLOR_MATERIAL_FACE_SGIX 0x8402 +#define GL_FRAGMENT_COLOR_MATERIAL_PARAMETER_SGIX 0x8403 +#define GL_MAX_FRAGMENT_LIGHTS_SGIX 0x8404 +#define GL_MAX_ACTIVE_LIGHTS_SGIX 0x8405 +#define GL_CURRENT_RASTER_NORMAL_SGIX 0x8406 +#define GL_LIGHT_ENV_MODE_SGIX 0x8407 +#define GL_FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_SGIX 0x8408 +#define GL_FRAGMENT_LIGHT_MODEL_TWO_SIDE_SGIX 0x8409 +#define GL_FRAGMENT_LIGHT_MODEL_AMBIENT_SGIX 0x840A +#define GL_FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_SGIX 0x840B +#define GL_FRAGMENT_LIGHT0_SGIX 0x840C +#define GL_FRAGMENT_LIGHT1_SGIX 0x840D +#define GL_FRAGMENT_LIGHT2_SGIX 0x840E +#define GL_FRAGMENT_LIGHT3_SGIX 0x840F +#define GL_FRAGMENT_LIGHT4_SGIX 0x8410 +#define GL_FRAGMENT_LIGHT5_SGIX 0x8411 +#define GL_FRAGMENT_LIGHT6_SGIX 0x8412 +#define GL_FRAGMENT_LIGHT7_SGIX 0x8413 +#endif + +#ifndef GL_IBM_rasterpos_clip +#define GL_RASTER_POSITION_UNCLIPPED_IBM 0x19262 +#endif + +#ifndef GL_HP_texture_lighting +#define GL_TEXTURE_LIGHTING_MODE_HP 0x8167 +#define GL_TEXTURE_POST_SPECULAR_HP 0x8168 +#define GL_TEXTURE_PRE_SPECULAR_HP 0x8169 +#endif + +#ifndef GL_EXT_draw_range_elements +#define GL_MAX_ELEMENTS_VERTICES_EXT 0x80E8 +#define GL_MAX_ELEMENTS_INDICES_EXT 0x80E9 +#endif + +#ifndef GL_WIN_phong_shading +#define GL_PHONG_WIN 0x80EA +#define GL_PHONG_HINT_WIN 0x80EB +#endif + +#ifndef GL_WIN_specular_fog +#define GL_FOG_SPECULAR_TEXTURE_WIN 0x80EC +#endif + +#ifndef GL_EXT_light_texture +#define GL_FRAGMENT_MATERIAL_EXT 0x8349 +#define GL_FRAGMENT_NORMAL_EXT 0x834A +#define GL_FRAGMENT_COLOR_EXT 0x834C +#define GL_ATTENUATION_EXT 0x834D +#define GL_SHADOW_ATTENUATION_EXT 0x834E +#define GL_TEXTURE_APPLICATION_MODE_EXT 0x834F +#define GL_TEXTURE_LIGHT_EXT 0x8350 +#define GL_TEXTURE_MATERIAL_FACE_EXT 0x8351 +#define GL_TEXTURE_MATERIAL_PARAMETER_EXT 0x8352 +/* reuse GL_FRAGMENT_DEPTH_EXT */ +#endif + +#ifndef GL_SGIX_blend_alpha_minmax +#define GL_ALPHA_MIN_SGIX 0x8320 +#define GL_ALPHA_MAX_SGIX 0x8321 +#endif + +#ifndef GL_SGIX_impact_pixel_texture +#define GL_PIXEL_TEX_GEN_Q_CEILING_SGIX 0x8184 +#define GL_PIXEL_TEX_GEN_Q_ROUND_SGIX 0x8185 +#define GL_PIXEL_TEX_GEN_Q_FLOOR_SGIX 0x8186 +#define GL_PIXEL_TEX_GEN_ALPHA_REPLACE_SGIX 0x8187 +#define GL_PIXEL_TEX_GEN_ALPHA_NO_REPLACE_SGIX 0x8188 +#define GL_PIXEL_TEX_GEN_ALPHA_LS_SGIX 0x8189 +#define GL_PIXEL_TEX_GEN_ALPHA_MS_SGIX 0x818A +#endif + +#ifndef GL_EXT_bgra +#define GL_BGR_EXT 0x80E0 +#define GL_BGRA_EXT 0x80E1 +#endif + +#ifndef GL_SGIX_async +#define GL_ASYNC_MARKER_SGIX 0x8329 +#endif + +#ifndef GL_SGIX_async_pixel +#define GL_ASYNC_TEX_IMAGE_SGIX 0x835C +#define GL_ASYNC_DRAW_PIXELS_SGIX 0x835D +#define GL_ASYNC_READ_PIXELS_SGIX 0x835E +#define GL_MAX_ASYNC_TEX_IMAGE_SGIX 0x835F +#define GL_MAX_ASYNC_DRAW_PIXELS_SGIX 0x8360 +#define GL_MAX_ASYNC_READ_PIXELS_SGIX 0x8361 +#endif + +#ifndef GL_SGIX_async_histogram +#define GL_ASYNC_HISTOGRAM_SGIX 0x832C +#define GL_MAX_ASYNC_HISTOGRAM_SGIX 0x832D +#endif + +#ifndef GL_INTEL_texture_scissor +#endif + +#ifndef GL_INTEL_parallel_arrays +#define GL_PARALLEL_ARRAYS_INTEL 0x83F4 +#define GL_VERTEX_ARRAY_PARALLEL_POINTERS_INTEL 0x83F5 +#define GL_NORMAL_ARRAY_PARALLEL_POINTERS_INTEL 0x83F6 +#define GL_COLOR_ARRAY_PARALLEL_POINTERS_INTEL 0x83F7 +#define GL_TEXTURE_COORD_ARRAY_PARALLEL_POINTERS_INTEL 0x83F8 +#endif + +#ifndef GL_HP_occlusion_test +#define GL_OCCLUSION_TEST_HP 0x8165 +#define GL_OCCLUSION_TEST_RESULT_HP 0x8166 +#endif + +#ifndef GL_EXT_pixel_transform +#define GL_PIXEL_TRANSFORM_2D_EXT 0x8330 +#define GL_PIXEL_MAG_FILTER_EXT 0x8331 +#define GL_PIXEL_MIN_FILTER_EXT 0x8332 +#define GL_PIXEL_CUBIC_WEIGHT_EXT 0x8333 +#define GL_CUBIC_EXT 0x8334 +#define GL_AVERAGE_EXT 0x8335 +#define GL_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8336 +#define GL_MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8337 +#define GL_PIXEL_TRANSFORM_2D_MATRIX_EXT 0x8338 +#endif + +#ifndef GL_EXT_pixel_transform_color_table +#endif + +#ifndef GL_EXT_shared_texture_palette +#define GL_SHARED_TEXTURE_PALETTE_EXT 0x81FB +#endif + +#ifndef GL_EXT_separate_specular_color +#define GL_LIGHT_MODEL_COLOR_CONTROL_EXT 0x81F8 +#define GL_SINGLE_COLOR_EXT 0x81F9 +#define GL_SEPARATE_SPECULAR_COLOR_EXT 0x81FA +#endif + +#ifndef GL_EXT_secondary_color +#define GL_COLOR_SUM_EXT 0x8458 +#define GL_CURRENT_SECONDARY_COLOR_EXT 0x8459 +#define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT 0x845A +#define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT 0x845B +#define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT 0x845C +#define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D +#define GL_SECONDARY_COLOR_ARRAY_EXT 0x845E +#endif + +#ifndef GL_EXT_texture_perturb_normal +#define GL_PERTURB_EXT 0x85AE +#define GL_TEXTURE_NORMAL_EXT 0x85AF +#endif + +#ifndef GL_EXT_multi_draw_arrays +#endif + +#ifndef GL_EXT_fog_coord +#define GL_FOG_COORDINATE_SOURCE_EXT 0x8450 +#define GL_FOG_COORDINATE_EXT 0x8451 +#define GL_FRAGMENT_DEPTH_EXT 0x8452 +#define GL_CURRENT_FOG_COORDINATE_EXT 0x8453 +#define GL_FOG_COORDINATE_ARRAY_TYPE_EXT 0x8454 +#define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT 0x8455 +#define GL_FOG_COORDINATE_ARRAY_POINTER_EXT 0x8456 +#define GL_FOG_COORDINATE_ARRAY_EXT 0x8457 +#endif + +#ifndef GL_REND_screen_coordinates +#define GL_SCREEN_COORDINATES_REND 0x8490 +#define GL_INVERTED_SCREEN_W_REND 0x8491 +#endif + +#ifndef GL_EXT_coordinate_frame +#define GL_TANGENT_ARRAY_EXT 0x8439 +#define GL_BINORMAL_ARRAY_EXT 0x843A +#define GL_CURRENT_TANGENT_EXT 0x843B +#define GL_CURRENT_BINORMAL_EXT 0x843C +#define GL_TANGENT_ARRAY_TYPE_EXT 0x843E +#define GL_TANGENT_ARRAY_STRIDE_EXT 0x843F +#define GL_BINORMAL_ARRAY_TYPE_EXT 0x8440 +#define GL_BINORMAL_ARRAY_STRIDE_EXT 0x8441 +#define GL_TANGENT_ARRAY_POINTER_EXT 0x8442 +#define GL_BINORMAL_ARRAY_POINTER_EXT 0x8443 +#define GL_MAP1_TANGENT_EXT 0x8444 +#define GL_MAP2_TANGENT_EXT 0x8445 +#define GL_MAP1_BINORMAL_EXT 0x8446 +#define GL_MAP2_BINORMAL_EXT 0x8447 +#endif + +#ifndef GL_EXT_texture_env_combine +#define GL_COMBINE_EXT 0x8570 +#define GL_COMBINE_RGB_EXT 0x8571 +#define GL_COMBINE_ALPHA_EXT 0x8572 +#define GL_RGB_SCALE_EXT 0x8573 +#define GL_ADD_SIGNED_EXT 0x8574 +#define GL_INTERPOLATE_EXT 0x8575 +#define GL_CONSTANT_EXT 0x8576 +#define GL_PRIMARY_COLOR_EXT 0x8577 +#define GL_PREVIOUS_EXT 0x8578 +#define GL_SOURCE0_RGB_EXT 0x8580 +#define GL_SOURCE1_RGB_EXT 0x8581 +#define GL_SOURCE2_RGB_EXT 0x8582 +#define GL_SOURCE0_ALPHA_EXT 0x8588 +#define GL_SOURCE1_ALPHA_EXT 0x8589 +#define GL_SOURCE2_ALPHA_EXT 0x858A +#define GL_OPERAND0_RGB_EXT 0x8590 +#define GL_OPERAND1_RGB_EXT 0x8591 +#define GL_OPERAND2_RGB_EXT 0x8592 +#define GL_OPERAND0_ALPHA_EXT 0x8598 +#define GL_OPERAND1_ALPHA_EXT 0x8599 +#define GL_OPERAND2_ALPHA_EXT 0x859A +#endif + +#ifndef GL_APPLE_specular_vector +#define GL_LIGHT_MODEL_SPECULAR_VECTOR_APPLE 0x85B0 +#endif + +#ifndef GL_APPLE_transform_hint +#define GL_TRANSFORM_HINT_APPLE 0x85B1 +#endif + +#ifndef GL_SGIX_fog_scale +#define GL_FOG_SCALE_SGIX 0x81FC +#define GL_FOG_SCALE_VALUE_SGIX 0x81FD +#endif + +#ifndef GL_SUNX_constant_data +#define GL_UNPACK_CONSTANT_DATA_SUNX 0x81D5 +#define GL_TEXTURE_CONSTANT_DATA_SUNX 0x81D6 +#endif + +#ifndef GL_SUN_global_alpha +#define GL_GLOBAL_ALPHA_SUN 0x81D9 +#define GL_GLOBAL_ALPHA_FACTOR_SUN 0x81DA +#endif + +#ifndef GL_SUN_triangle_list +#define GL_RESTART_SUN 0x0001 +#define GL_REPLACE_MIDDLE_SUN 0x0002 +#define GL_REPLACE_OLDEST_SUN 0x0003 +#define GL_TRIANGLE_LIST_SUN 0x81D7 +#define GL_REPLACEMENT_CODE_SUN 0x81D8 +#define GL_REPLACEMENT_CODE_ARRAY_SUN 0x85C0 +#define GL_REPLACEMENT_CODE_ARRAY_TYPE_SUN 0x85C1 +#define GL_REPLACEMENT_CODE_ARRAY_STRIDE_SUN 0x85C2 +#define GL_REPLACEMENT_CODE_ARRAY_POINTER_SUN 0x85C3 +#define GL_R1UI_V3F_SUN 0x85C4 +#define GL_R1UI_C4UB_V3F_SUN 0x85C5 +#define GL_R1UI_C3F_V3F_SUN 0x85C6 +#define GL_R1UI_N3F_V3F_SUN 0x85C7 +#define GL_R1UI_C4F_N3F_V3F_SUN 0x85C8 +#define GL_R1UI_T2F_V3F_SUN 0x85C9 +#define GL_R1UI_T2F_N3F_V3F_SUN 0x85CA +#define GL_R1UI_T2F_C4F_N3F_V3F_SUN 0x85CB +#endif + +#ifndef GL_SUN_vertex +#endif + +#ifndef GL_EXT_blend_func_separate +#define GL_BLEND_DST_RGB_EXT 0x80C8 +#define GL_BLEND_SRC_RGB_EXT 0x80C9 +#define GL_BLEND_DST_ALPHA_EXT 0x80CA +#define GL_BLEND_SRC_ALPHA_EXT 0x80CB +#endif + +#ifndef GL_INGR_color_clamp +#define GL_RED_MIN_CLAMP_INGR 0x8560 +#define GL_GREEN_MIN_CLAMP_INGR 0x8561 +#define GL_BLUE_MIN_CLAMP_INGR 0x8562 +#define GL_ALPHA_MIN_CLAMP_INGR 0x8563 +#define GL_RED_MAX_CLAMP_INGR 0x8564 +#define GL_GREEN_MAX_CLAMP_INGR 0x8565 +#define GL_BLUE_MAX_CLAMP_INGR 0x8566 +#define GL_ALPHA_MAX_CLAMP_INGR 0x8567 +#endif + +#ifndef GL_INGR_interlace_read +#define GL_INTERLACE_READ_INGR 0x8568 +#endif + +#ifndef GL_EXT_stencil_wrap +#define GL_INCR_WRAP_EXT 0x8507 +#define GL_DECR_WRAP_EXT 0x8508 +#endif + +#ifndef GL_EXT_422_pixels +#define GL_422_EXT 0x80CC +#define GL_422_REV_EXT 0x80CD +#define GL_422_AVERAGE_EXT 0x80CE +#define GL_422_REV_AVERAGE_EXT 0x80CF +#endif + +#ifndef GL_NV_texgen_reflection +#define GL_NORMAL_MAP_NV 0x8511 +#define GL_REFLECTION_MAP_NV 0x8512 +#endif + +#ifndef GL_EXT_texture_cube_map +#define GL_NORMAL_MAP_EXT 0x8511 +#define GL_REFLECTION_MAP_EXT 0x8512 +#define GL_TEXTURE_CUBE_MAP_EXT 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP_EXT 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP_EXT 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT 0x851C +#endif + +#ifndef GL_SUN_convolution_border_modes +#define GL_WRAP_BORDER_SUN 0x81D4 +#endif + +#ifndef GL_EXT_texture_env_add +#endif + +#ifndef GL_EXT_texture_lod_bias +#define GL_MAX_TEXTURE_LOD_BIAS_EXT 0x84FD +#define GL_TEXTURE_FILTER_CONTROL_EXT 0x8500 +#define GL_TEXTURE_LOD_BIAS_EXT 0x8501 +#endif + +#ifndef GL_EXT_texture_filter_anisotropic +#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE +#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF +#endif + +#ifndef GL_EXT_vertex_weighting +#define GL_MODELVIEW0_STACK_DEPTH_EXT GL_MODELVIEW_STACK_DEPTH +#define GL_MODELVIEW1_STACK_DEPTH_EXT 0x8502 +#define GL_MODELVIEW0_MATRIX_EXT GL_MODELVIEW_MATRIX +#define GL_MODELVIEW1_MATRIX_EXT 0x8506 +#define GL_VERTEX_WEIGHTING_EXT 0x8509 +#define GL_MODELVIEW0_EXT GL_MODELVIEW +#define GL_MODELVIEW1_EXT 0x850A +#define GL_CURRENT_VERTEX_WEIGHT_EXT 0x850B +#define GL_VERTEX_WEIGHT_ARRAY_EXT 0x850C +#define GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT 0x850D +#define GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT 0x850E +#define GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT 0x850F +#define GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT 0x8510 +#endif + +#ifndef GL_NV_light_max_exponent +#define GL_MAX_SHININESS_NV 0x8504 +#define GL_MAX_SPOT_EXPONENT_NV 0x8505 +#endif + +#ifndef GL_NV_vertex_array_range +#define GL_VERTEX_ARRAY_RANGE_NV 0x851D +#define GL_VERTEX_ARRAY_RANGE_LENGTH_NV 0x851E +#define GL_VERTEX_ARRAY_RANGE_VALID_NV 0x851F +#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV 0x8520 +#define GL_VERTEX_ARRAY_RANGE_POINTER_NV 0x8521 +#endif + +#ifndef GL_NV_register_combiners +#define GL_REGISTER_COMBINERS_NV 0x8522 +#define GL_VARIABLE_A_NV 0x8523 +#define GL_VARIABLE_B_NV 0x8524 +#define GL_VARIABLE_C_NV 0x8525 +#define GL_VARIABLE_D_NV 0x8526 +#define GL_VARIABLE_E_NV 0x8527 +#define GL_VARIABLE_F_NV 0x8528 +#define GL_VARIABLE_G_NV 0x8529 +#define GL_CONSTANT_COLOR0_NV 0x852A +#define GL_CONSTANT_COLOR1_NV 0x852B +#define GL_PRIMARY_COLOR_NV 0x852C +#define GL_SECONDARY_COLOR_NV 0x852D +#define GL_SPARE0_NV 0x852E +#define GL_SPARE1_NV 0x852F +#define GL_DISCARD_NV 0x8530 +#define GL_E_TIMES_F_NV 0x8531 +#define GL_SPARE0_PLUS_SECONDARY_COLOR_NV 0x8532 +#define GL_UNSIGNED_IDENTITY_NV 0x8536 +#define GL_UNSIGNED_INVERT_NV 0x8537 +#define GL_EXPAND_NORMAL_NV 0x8538 +#define GL_EXPAND_NEGATE_NV 0x8539 +#define GL_HALF_BIAS_NORMAL_NV 0x853A +#define GL_HALF_BIAS_NEGATE_NV 0x853B +#define GL_SIGNED_IDENTITY_NV 0x853C +#define GL_SIGNED_NEGATE_NV 0x853D +#define GL_SCALE_BY_TWO_NV 0x853E +#define GL_SCALE_BY_FOUR_NV 0x853F +#define GL_SCALE_BY_ONE_HALF_NV 0x8540 +#define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV 0x8541 +#define GL_COMBINER_INPUT_NV 0x8542 +#define GL_COMBINER_MAPPING_NV 0x8543 +#define GL_COMBINER_COMPONENT_USAGE_NV 0x8544 +#define GL_COMBINER_AB_DOT_PRODUCT_NV 0x8545 +#define GL_COMBINER_CD_DOT_PRODUCT_NV 0x8546 +#define GL_COMBINER_MUX_SUM_NV 0x8547 +#define GL_COMBINER_SCALE_NV 0x8548 +#define GL_COMBINER_BIAS_NV 0x8549 +#define GL_COMBINER_AB_OUTPUT_NV 0x854A +#define GL_COMBINER_CD_OUTPUT_NV 0x854B +#define GL_COMBINER_SUM_OUTPUT_NV 0x854C +#define GL_MAX_GENERAL_COMBINERS_NV 0x854D +#define GL_NUM_GENERAL_COMBINERS_NV 0x854E +#define GL_COLOR_SUM_CLAMP_NV 0x854F +#define GL_COMBINER0_NV 0x8550 +#define GL_COMBINER1_NV 0x8551 +#define GL_COMBINER2_NV 0x8552 +#define GL_COMBINER3_NV 0x8553 +#define GL_COMBINER4_NV 0x8554 +#define GL_COMBINER5_NV 0x8555 +#define GL_COMBINER6_NV 0x8556 +#define GL_COMBINER7_NV 0x8557 +/* reuse GL_TEXTURE0_ARB */ +/* reuse GL_TEXTURE1_ARB */ +/* reuse GL_ZERO */ +/* reuse GL_NONE */ +/* reuse GL_FOG */ +#endif + +#ifndef GL_NV_fog_distance +#define GL_FOG_DISTANCE_MODE_NV 0x855A +#define GL_EYE_RADIAL_NV 0x855B +#define GL_EYE_PLANE_ABSOLUTE_NV 0x855C +/* reuse GL_EYE_PLANE */ +#endif + +#ifndef GL_NV_texgen_emboss +#define GL_EMBOSS_LIGHT_NV 0x855D +#define GL_EMBOSS_CONSTANT_NV 0x855E +#define GL_EMBOSS_MAP_NV 0x855F +#endif + +#ifndef GL_NV_blend_square +#endif + +#ifndef GL_NV_texture_env_combine4 +#define GL_COMBINE4_NV 0x8503 +#define GL_SOURCE3_RGB_NV 0x8583 +#define GL_SOURCE3_ALPHA_NV 0x858B +#define GL_OPERAND3_RGB_NV 0x8593 +#define GL_OPERAND3_ALPHA_NV 0x859B +#endif + +#ifndef GL_MESA_resize_buffers +#endif + +#ifndef GL_MESA_window_pos +#endif + +#ifndef GL_EXT_texture_compression_s3tc +#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 +#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 +#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 +#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 +#endif + +#ifndef GL_IBM_cull_vertex +#define GL_CULL_VERTEX_IBM 103050 +#endif + +#ifndef GL_IBM_multimode_draw_arrays +#endif + +#ifndef GL_IBM_vertex_array_lists +#define GL_VERTEX_ARRAY_LIST_IBM 103070 +#define GL_NORMAL_ARRAY_LIST_IBM 103071 +#define GL_COLOR_ARRAY_LIST_IBM 103072 +#define GL_INDEX_ARRAY_LIST_IBM 103073 +#define GL_TEXTURE_COORD_ARRAY_LIST_IBM 103074 +#define GL_EDGE_FLAG_ARRAY_LIST_IBM 103075 +#define GL_FOG_COORDINATE_ARRAY_LIST_IBM 103076 +#define GL_SECONDARY_COLOR_ARRAY_LIST_IBM 103077 +#define GL_VERTEX_ARRAY_LIST_STRIDE_IBM 103080 +#define GL_NORMAL_ARRAY_LIST_STRIDE_IBM 103081 +#define GL_COLOR_ARRAY_LIST_STRIDE_IBM 103082 +#define GL_INDEX_ARRAY_LIST_STRIDE_IBM 103083 +#define GL_TEXTURE_COORD_ARRAY_LIST_STRIDE_IBM 103084 +#define GL_EDGE_FLAG_ARRAY_LIST_STRIDE_IBM 103085 +#define GL_FOG_COORDINATE_ARRAY_LIST_STRIDE_IBM 103086 +#define GL_SECONDARY_COLOR_ARRAY_LIST_STRIDE_IBM 103087 +#endif + +#ifndef GL_SGIX_subsample +#define GL_PACK_SUBSAMPLE_RATE_SGIX 0x85A0 +#define GL_UNPACK_SUBSAMPLE_RATE_SGIX 0x85A1 +#define GL_PIXEL_SUBSAMPLE_4444_SGIX 0x85A2 +#define GL_PIXEL_SUBSAMPLE_2424_SGIX 0x85A3 +#define GL_PIXEL_SUBSAMPLE_4242_SGIX 0x85A4 +#endif + +#ifndef GL_SGIX_ycrcb_subsample +#endif + +#ifndef GL_SGIX_ycrcba +#define GL_YCRCB_SGIX 0x8318 +#define GL_YCRCBA_SGIX 0x8319 +#endif + +#ifndef GL_SGI_depth_pass_instrument +#define GL_DEPTH_PASS_INSTRUMENT_SGIX 0x8310 +#define GL_DEPTH_PASS_INSTRUMENT_COUNTERS_SGIX 0x8311 +#define GL_DEPTH_PASS_INSTRUMENT_MAX_SGIX 0x8312 +#endif + +#ifndef GL_3DFX_texture_compression_FXT1 +#define GL_COMPRESSED_RGB_FXT1_3DFX 0x86B0 +#define GL_COMPRESSED_RGBA_FXT1_3DFX 0x86B1 +#endif + +#ifndef GL_3DFX_multisample +#define GL_MULTISAMPLE_3DFX 0x86B2 +#define GL_SAMPLE_BUFFERS_3DFX 0x86B3 +#define GL_SAMPLES_3DFX 0x86B4 +#define GL_MULTISAMPLE_BIT_3DFX 0x20000000 +#endif + +#ifndef GL_3DFX_tbuffer +#endif + +#ifndef GL_EXT_multisample +#define GL_MULTISAMPLE_EXT 0x809D +#define GL_SAMPLE_ALPHA_TO_MASK_EXT 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F +#define GL_SAMPLE_MASK_EXT 0x80A0 +#define GL_1PASS_EXT 0x80A1 +#define GL_2PASS_0_EXT 0x80A2 +#define GL_2PASS_1_EXT 0x80A3 +#define GL_4PASS_0_EXT 0x80A4 +#define GL_4PASS_1_EXT 0x80A5 +#define GL_4PASS_2_EXT 0x80A6 +#define GL_4PASS_3_EXT 0x80A7 +#define GL_SAMPLE_BUFFERS_EXT 0x80A8 +#define GL_SAMPLES_EXT 0x80A9 +#define GL_SAMPLE_MASK_VALUE_EXT 0x80AA +#define GL_SAMPLE_MASK_INVERT_EXT 0x80AB +#define GL_SAMPLE_PATTERN_EXT 0x80AC +#define GL_MULTISAMPLE_BIT_EXT 0x20000000 +#endif + +#ifndef GL_SGIX_vertex_preclip +#define GL_VERTEX_PRECLIP_SGIX 0x83EE +#define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF +#endif + +#ifndef GL_SGIX_convolution_accuracy +#define GL_CONVOLUTION_HINT_SGIX 0x8316 +#endif + +#ifndef GL_SGIX_resample +#define GL_PACK_RESAMPLE_SGIX 0x842C +#define GL_UNPACK_RESAMPLE_SGIX 0x842D +#define GL_RESAMPLE_REPLICATE_SGIX 0x842E +#define GL_RESAMPLE_ZERO_FILL_SGIX 0x842F +#define GL_RESAMPLE_DECIMATE_SGIX 0x8430 +#endif + +#ifndef GL_SGIS_point_line_texgen +#define GL_EYE_DISTANCE_TO_POINT_SGIS 0x81F0 +#define GL_OBJECT_DISTANCE_TO_POINT_SGIS 0x81F1 +#define GL_EYE_DISTANCE_TO_LINE_SGIS 0x81F2 +#define GL_OBJECT_DISTANCE_TO_LINE_SGIS 0x81F3 +#define GL_EYE_POINT_SGIS 0x81F4 +#define GL_OBJECT_POINT_SGIS 0x81F5 +#define GL_EYE_LINE_SGIS 0x81F6 +#define GL_OBJECT_LINE_SGIS 0x81F7 +#endif + +#ifndef GL_SGIS_texture_color_mask +#define GL_TEXTURE_COLOR_WRITEMASK_SGIS 0x81EF +#endif + +#ifndef GL_EXT_texture_env_dot3 +#define GL_DOT3_RGB_EXT 0x8740 +#define GL_DOT3_RGBA_EXT 0x8741 +#endif + +#ifndef GL_ATI_texture_mirror_once +#define GL_MIRROR_CLAMP_ATI 0x8742 +#define GL_MIRROR_CLAMP_TO_EDGE_ATI 0x8743 +#endif + +#ifndef GL_NV_fence +#define GL_ALL_COMPLETED_NV 0x84F2 +#define GL_FENCE_STATUS_NV 0x84F3 +#define GL_FENCE_CONDITION_NV 0x84F4 +#endif + +#ifndef GL_IBM_texture_mirrored_repeat +#define GL_MIRRORED_REPEAT_IBM 0x8370 +#endif + +#ifndef GL_NV_evaluators +#define GL_EVAL_2D_NV 0x86C0 +#define GL_EVAL_TRIANGULAR_2D_NV 0x86C1 +#define GL_MAP_TESSELLATION_NV 0x86C2 +#define GL_MAP_ATTRIB_U_ORDER_NV 0x86C3 +#define GL_MAP_ATTRIB_V_ORDER_NV 0x86C4 +#define GL_EVAL_FRACTIONAL_TESSELLATION_NV 0x86C5 +#define GL_EVAL_VERTEX_ATTRIB0_NV 0x86C6 +#define GL_EVAL_VERTEX_ATTRIB1_NV 0x86C7 +#define GL_EVAL_VERTEX_ATTRIB2_NV 0x86C8 +#define GL_EVAL_VERTEX_ATTRIB3_NV 0x86C9 +#define GL_EVAL_VERTEX_ATTRIB4_NV 0x86CA +#define GL_EVAL_VERTEX_ATTRIB5_NV 0x86CB +#define GL_EVAL_VERTEX_ATTRIB6_NV 0x86CC +#define GL_EVAL_VERTEX_ATTRIB7_NV 0x86CD +#define GL_EVAL_VERTEX_ATTRIB8_NV 0x86CE +#define GL_EVAL_VERTEX_ATTRIB9_NV 0x86CF +#define GL_EVAL_VERTEX_ATTRIB10_NV 0x86D0 +#define GL_EVAL_VERTEX_ATTRIB11_NV 0x86D1 +#define GL_EVAL_VERTEX_ATTRIB12_NV 0x86D2 +#define GL_EVAL_VERTEX_ATTRIB13_NV 0x86D3 +#define GL_EVAL_VERTEX_ATTRIB14_NV 0x86D4 +#define GL_EVAL_VERTEX_ATTRIB15_NV 0x86D5 +#define GL_MAX_MAP_TESSELLATION_NV 0x86D6 +#define GL_MAX_RATIONAL_EVAL_ORDER_NV 0x86D7 +#endif + +#ifndef GL_NV_packed_depth_stencil +#define GL_DEPTH_STENCIL_NV 0x84F9 +#define GL_UNSIGNED_INT_24_8_NV 0x84FA +#endif + +#ifndef GL_NV_register_combiners2 +#define GL_PER_STAGE_CONSTANTS_NV 0x8535 +#endif + +#ifndef GL_NV_texture_compression_vtc +#endif + +#ifndef GL_NV_texture_rectangle +#define GL_TEXTURE_RECTANGLE_NV 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE_NV 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE_NV 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE_NV 0x84F8 +#endif + +#ifndef GL_NV_texture_shader +#define GL_OFFSET_TEXTURE_RECTANGLE_NV 0x864C +#define GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV 0x864D +#define GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV 0x864E +#define GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV 0x86D9 +#define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA +#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB +#define GL_DSDT_MAG_INTENSITY_NV 0x86DC +#define GL_SHADER_CONSISTENT_NV 0x86DD +#define GL_TEXTURE_SHADER_NV 0x86DE +#define GL_SHADER_OPERATION_NV 0x86DF +#define GL_CULL_MODES_NV 0x86E0 +#define GL_OFFSET_TEXTURE_MATRIX_NV 0x86E1 +#define GL_OFFSET_TEXTURE_SCALE_NV 0x86E2 +#define GL_OFFSET_TEXTURE_BIAS_NV 0x86E3 +#define GL_OFFSET_TEXTURE_2D_MATRIX_NV GL_OFFSET_TEXTURE_MATRIX_NV +#define GL_OFFSET_TEXTURE_2D_SCALE_NV GL_OFFSET_TEXTURE_SCALE_NV +#define GL_OFFSET_TEXTURE_2D_BIAS_NV GL_OFFSET_TEXTURE_BIAS_NV +#define GL_PREVIOUS_TEXTURE_INPUT_NV 0x86E4 +#define GL_CONST_EYE_NV 0x86E5 +#define GL_PASS_THROUGH_NV 0x86E6 +#define GL_CULL_FRAGMENT_NV 0x86E7 +#define GL_OFFSET_TEXTURE_2D_NV 0x86E8 +#define GL_DEPENDENT_AR_TEXTURE_2D_NV 0x86E9 +#define GL_DEPENDENT_GB_TEXTURE_2D_NV 0x86EA +#define GL_DOT_PRODUCT_NV 0x86EC +#define GL_DOT_PRODUCT_DEPTH_REPLACE_NV 0x86ED +#define GL_DOT_PRODUCT_TEXTURE_2D_NV 0x86EE +#define GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV 0x86F0 +#define GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV 0x86F1 +#define GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV 0x86F2 +#define GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV 0x86F3 +#define GL_HILO_NV 0x86F4 +#define GL_DSDT_NV 0x86F5 +#define GL_DSDT_MAG_NV 0x86F6 +#define GL_DSDT_MAG_VIB_NV 0x86F7 +#define GL_HILO16_NV 0x86F8 +#define GL_SIGNED_HILO_NV 0x86F9 +#define GL_SIGNED_HILO16_NV 0x86FA +#define GL_SIGNED_RGBA_NV 0x86FB +#define GL_SIGNED_RGBA8_NV 0x86FC +#define GL_SIGNED_RGB_NV 0x86FE +#define GL_SIGNED_RGB8_NV 0x86FF +#define GL_SIGNED_LUMINANCE_NV 0x8701 +#define GL_SIGNED_LUMINANCE8_NV 0x8702 +#define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703 +#define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704 +#define GL_SIGNED_ALPHA_NV 0x8705 +#define GL_SIGNED_ALPHA8_NV 0x8706 +#define GL_SIGNED_INTENSITY_NV 0x8707 +#define GL_SIGNED_INTENSITY8_NV 0x8708 +#define GL_DSDT8_NV 0x8709 +#define GL_DSDT8_MAG8_NV 0x870A +#define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B +#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C +#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D +#define GL_HI_SCALE_NV 0x870E +#define GL_LO_SCALE_NV 0x870F +#define GL_DS_SCALE_NV 0x8710 +#define GL_DT_SCALE_NV 0x8711 +#define GL_MAGNITUDE_SCALE_NV 0x8712 +#define GL_VIBRANCE_SCALE_NV 0x8713 +#define GL_HI_BIAS_NV 0x8714 +#define GL_LO_BIAS_NV 0x8715 +#define GL_DS_BIAS_NV 0x8716 +#define GL_DT_BIAS_NV 0x8717 +#define GL_MAGNITUDE_BIAS_NV 0x8718 +#define GL_VIBRANCE_BIAS_NV 0x8719 +#define GL_TEXTURE_BORDER_VALUES_NV 0x871A +#define GL_TEXTURE_HI_SIZE_NV 0x871B +#define GL_TEXTURE_LO_SIZE_NV 0x871C +#define GL_TEXTURE_DS_SIZE_NV 0x871D +#define GL_TEXTURE_DT_SIZE_NV 0x871E +#define GL_TEXTURE_MAG_SIZE_NV 0x871F +#endif + +#ifndef GL_NV_texture_shader2 +#define GL_DOT_PRODUCT_TEXTURE_3D_NV 0x86EF +#endif + +#ifndef GL_NV_vertex_array_range2 +#define GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV 0x8533 +#endif + +#ifndef GL_NV_vertex_program +#define GL_VERTEX_PROGRAM_NV 0x8620 +#define GL_VERTEX_STATE_PROGRAM_NV 0x8621 +#define GL_ATTRIB_ARRAY_SIZE_NV 0x8623 +#define GL_ATTRIB_ARRAY_STRIDE_NV 0x8624 +#define GL_ATTRIB_ARRAY_TYPE_NV 0x8625 +#define GL_CURRENT_ATTRIB_NV 0x8626 +#define GL_PROGRAM_LENGTH_NV 0x8627 +#define GL_PROGRAM_STRING_NV 0x8628 +#define GL_MODELVIEW_PROJECTION_NV 0x8629 +#define GL_IDENTITY_NV 0x862A +#define GL_INVERSE_NV 0x862B +#define GL_TRANSPOSE_NV 0x862C +#define GL_INVERSE_TRANSPOSE_NV 0x862D +#define GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV 0x862E +#define GL_MAX_TRACK_MATRICES_NV 0x862F +#define GL_MATRIX0_NV 0x8630 +#define GL_MATRIX1_NV 0x8631 +#define GL_MATRIX2_NV 0x8632 +#define GL_MATRIX3_NV 0x8633 +#define GL_MATRIX4_NV 0x8634 +#define GL_MATRIX5_NV 0x8635 +#define GL_MATRIX6_NV 0x8636 +#define GL_MATRIX7_NV 0x8637 +#define GL_CURRENT_MATRIX_STACK_DEPTH_NV 0x8640 +#define GL_CURRENT_MATRIX_NV 0x8641 +#define GL_VERTEX_PROGRAM_POINT_SIZE_NV 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE_NV 0x8643 +#define GL_PROGRAM_PARAMETER_NV 0x8644 +#define GL_ATTRIB_ARRAY_POINTER_NV 0x8645 +#define GL_PROGRAM_TARGET_NV 0x8646 +#define GL_PROGRAM_RESIDENT_NV 0x8647 +#define GL_TRACK_MATRIX_NV 0x8648 +#define GL_TRACK_MATRIX_TRANSFORM_NV 0x8649 +#define GL_VERTEX_PROGRAM_BINDING_NV 0x864A +#define GL_PROGRAM_ERROR_POSITION_NV 0x864B +#define GL_VERTEX_ATTRIB_ARRAY0_NV 0x8650 +#define GL_VERTEX_ATTRIB_ARRAY1_NV 0x8651 +#define GL_VERTEX_ATTRIB_ARRAY2_NV 0x8652 +#define GL_VERTEX_ATTRIB_ARRAY3_NV 0x8653 +#define GL_VERTEX_ATTRIB_ARRAY4_NV 0x8654 +#define GL_VERTEX_ATTRIB_ARRAY5_NV 0x8655 +#define GL_VERTEX_ATTRIB_ARRAY6_NV 0x8656 +#define GL_VERTEX_ATTRIB_ARRAY7_NV 0x8657 +#define GL_VERTEX_ATTRIB_ARRAY8_NV 0x8658 +#define GL_VERTEX_ATTRIB_ARRAY9_NV 0x8659 +#define GL_VERTEX_ATTRIB_ARRAY10_NV 0x865A +#define GL_VERTEX_ATTRIB_ARRAY11_NV 0x865B +#define GL_VERTEX_ATTRIB_ARRAY12_NV 0x865C +#define GL_VERTEX_ATTRIB_ARRAY13_NV 0x865D +#define GL_VERTEX_ATTRIB_ARRAY14_NV 0x865E +#define GL_VERTEX_ATTRIB_ARRAY15_NV 0x865F +#define GL_MAP1_VERTEX_ATTRIB0_4_NV 0x8660 +#define GL_MAP1_VERTEX_ATTRIB1_4_NV 0x8661 +#define GL_MAP1_VERTEX_ATTRIB2_4_NV 0x8662 +#define GL_MAP1_VERTEX_ATTRIB3_4_NV 0x8663 +#define GL_MAP1_VERTEX_ATTRIB4_4_NV 0x8664 +#define GL_MAP1_VERTEX_ATTRIB5_4_NV 0x8665 +#define GL_MAP1_VERTEX_ATTRIB6_4_NV 0x8666 +#define GL_MAP1_VERTEX_ATTRIB7_4_NV 0x8667 +#define GL_MAP1_VERTEX_ATTRIB8_4_NV 0x8668 +#define GL_MAP1_VERTEX_ATTRIB9_4_NV 0x8669 +#define GL_MAP1_VERTEX_ATTRIB10_4_NV 0x866A +#define GL_MAP1_VERTEX_ATTRIB11_4_NV 0x866B +#define GL_MAP1_VERTEX_ATTRIB12_4_NV 0x866C +#define GL_MAP1_VERTEX_ATTRIB13_4_NV 0x866D +#define GL_MAP1_VERTEX_ATTRIB14_4_NV 0x866E +#define GL_MAP1_VERTEX_ATTRIB15_4_NV 0x866F +#define GL_MAP2_VERTEX_ATTRIB0_4_NV 0x8670 +#define GL_MAP2_VERTEX_ATTRIB1_4_NV 0x8671 +#define GL_MAP2_VERTEX_ATTRIB2_4_NV 0x8672 +#define GL_MAP2_VERTEX_ATTRIB3_4_NV 0x8673 +#define GL_MAP2_VERTEX_ATTRIB4_4_NV 0x8674 +#define GL_MAP2_VERTEX_ATTRIB5_4_NV 0x8675 +#define GL_MAP2_VERTEX_ATTRIB6_4_NV 0x8676 +#define GL_MAP2_VERTEX_ATTRIB7_4_NV 0x8677 +#define GL_MAP2_VERTEX_ATTRIB8_4_NV 0x8678 +#define GL_MAP2_VERTEX_ATTRIB9_4_NV 0x8679 +#define GL_MAP2_VERTEX_ATTRIB10_4_NV 0x867A +#define GL_MAP2_VERTEX_ATTRIB11_4_NV 0x867B +#define GL_MAP2_VERTEX_ATTRIB12_4_NV 0x867C +#define GL_MAP2_VERTEX_ATTRIB13_4_NV 0x867D +#define GL_MAP2_VERTEX_ATTRIB14_4_NV 0x867E +#define GL_MAP2_VERTEX_ATTRIB15_4_NV 0x867F +#endif + +#ifndef GL_SGIX_texture_coordinate_clamp +#define GL_TEXTURE_MAX_CLAMP_S_SGIX 0x8369 +#define GL_TEXTURE_MAX_CLAMP_T_SGIX 0x836A +#define GL_TEXTURE_MAX_CLAMP_R_SGIX 0x836B +#endif + +#ifndef GL_SGIX_scalebias_hint +#define GL_SCALEBIAS_HINT_SGIX 0x8322 +#endif + +#ifndef GL_OML_interlace +#define GL_INTERLACE_OML 0x8980 +#define GL_INTERLACE_READ_OML 0x8981 +#endif + +#ifndef GL_OML_subsample +#define GL_FORMAT_SUBSAMPLE_24_24_OML 0x8982 +#define GL_FORMAT_SUBSAMPLE_244_244_OML 0x8983 +#endif + +#ifndef GL_OML_resample +#define GL_PACK_RESAMPLE_OML 0x8984 +#define GL_UNPACK_RESAMPLE_OML 0x8985 +#define GL_RESAMPLE_REPLICATE_OML 0x8986 +#define GL_RESAMPLE_ZERO_FILL_OML 0x8987 +#define GL_RESAMPLE_AVERAGE_OML 0x8988 +#define GL_RESAMPLE_DECIMATE_OML 0x8989 +#endif + +#ifndef GL_NV_copy_depth_to_color +#define GL_DEPTH_STENCIL_TO_RGBA_NV 0x886E +#define GL_DEPTH_STENCIL_TO_BGRA_NV 0x886F +#endif + +#ifndef GL_ATI_envmap_bumpmap +#define GL_BUMP_ROT_MATRIX_ATI 0x8775 +#define GL_BUMP_ROT_MATRIX_SIZE_ATI 0x8776 +#define GL_BUMP_NUM_TEX_UNITS_ATI 0x8777 +#define GL_BUMP_TEX_UNITS_ATI 0x8778 +#define GL_DUDV_ATI 0x8779 +#define GL_DU8DV8_ATI 0x877A +#define GL_BUMP_ENVMAP_ATI 0x877B +#define GL_BUMP_TARGET_ATI 0x877C +#endif + +#ifndef GL_ATI_fragment_shader +#define GL_FRAGMENT_SHADER_ATI 0x8920 +#define GL_REG_0_ATI 0x8921 +#define GL_REG_1_ATI 0x8922 +#define GL_REG_2_ATI 0x8923 +#define GL_REG_3_ATI 0x8924 +#define GL_REG_4_ATI 0x8925 +#define GL_REG_5_ATI 0x8926 +#define GL_REG_6_ATI 0x8927 +#define GL_REG_7_ATI 0x8928 +#define GL_REG_8_ATI 0x8929 +#define GL_REG_9_ATI 0x892A +#define GL_REG_10_ATI 0x892B +#define GL_REG_11_ATI 0x892C +#define GL_REG_12_ATI 0x892D +#define GL_REG_13_ATI 0x892E +#define GL_REG_14_ATI 0x892F +#define GL_REG_15_ATI 0x8930 +#define GL_REG_16_ATI 0x8931 +#define GL_REG_17_ATI 0x8932 +#define GL_REG_18_ATI 0x8933 +#define GL_REG_19_ATI 0x8934 +#define GL_REG_20_ATI 0x8935 +#define GL_REG_21_ATI 0x8936 +#define GL_REG_22_ATI 0x8937 +#define GL_REG_23_ATI 0x8938 +#define GL_REG_24_ATI 0x8939 +#define GL_REG_25_ATI 0x893A +#define GL_REG_26_ATI 0x893B +#define GL_REG_27_ATI 0x893C +#define GL_REG_28_ATI 0x893D +#define GL_REG_29_ATI 0x893E +#define GL_REG_30_ATI 0x893F +#define GL_REG_31_ATI 0x8940 +#define GL_CON_0_ATI 0x8941 +#define GL_CON_1_ATI 0x8942 +#define GL_CON_2_ATI 0x8943 +#define GL_CON_3_ATI 0x8944 +#define GL_CON_4_ATI 0x8945 +#define GL_CON_5_ATI 0x8946 +#define GL_CON_6_ATI 0x8947 +#define GL_CON_7_ATI 0x8948 +#define GL_CON_8_ATI 0x8949 +#define GL_CON_9_ATI 0x894A +#define GL_CON_10_ATI 0x894B +#define GL_CON_11_ATI 0x894C +#define GL_CON_12_ATI 0x894D +#define GL_CON_13_ATI 0x894E +#define GL_CON_14_ATI 0x894F +#define GL_CON_15_ATI 0x8950 +#define GL_CON_16_ATI 0x8951 +#define GL_CON_17_ATI 0x8952 +#define GL_CON_18_ATI 0x8953 +#define GL_CON_19_ATI 0x8954 +#define GL_CON_20_ATI 0x8955 +#define GL_CON_21_ATI 0x8956 +#define GL_CON_22_ATI 0x8957 +#define GL_CON_23_ATI 0x8958 +#define GL_CON_24_ATI 0x8959 +#define GL_CON_25_ATI 0x895A +#define GL_CON_26_ATI 0x895B +#define GL_CON_27_ATI 0x895C +#define GL_CON_28_ATI 0x895D +#define GL_CON_29_ATI 0x895E +#define GL_CON_30_ATI 0x895F +#define GL_CON_31_ATI 0x8960 +#define GL_MOV_ATI 0x8961 +#define GL_ADD_ATI 0x8963 +#define GL_MUL_ATI 0x8964 +#define GL_SUB_ATI 0x8965 +#define GL_DOT3_ATI 0x8966 +#define GL_DOT4_ATI 0x8967 +#define GL_MAD_ATI 0x8968 +#define GL_LERP_ATI 0x8969 +#define GL_CND_ATI 0x896A +#define GL_CND0_ATI 0x896B +#define GL_DOT2_ADD_ATI 0x896C +#define GL_SECONDARY_INTERPOLATOR_ATI 0x896D +#define GL_NUM_FRAGMENT_REGISTERS_ATI 0x896E +#define GL_NUM_FRAGMENT_CONSTANTS_ATI 0x896F +#define GL_NUM_PASSES_ATI 0x8970 +#define GL_NUM_INSTRUCTIONS_PER_PASS_ATI 0x8971 +#define GL_NUM_INSTRUCTIONS_TOTAL_ATI 0x8972 +#define GL_NUM_INPUT_INTERPOLATOR_COMPONENTS_ATI 0x8973 +#define GL_NUM_LOOPBACK_COMPONENTS_ATI 0x8974 +#define GL_COLOR_ALPHA_PAIRING_ATI 0x8975 +#define GL_SWIZZLE_STR_ATI 0x8976 +#define GL_SWIZZLE_STQ_ATI 0x8977 +#define GL_SWIZZLE_STR_DR_ATI 0x8978 +#define GL_SWIZZLE_STQ_DQ_ATI 0x8979 +#define GL_SWIZZLE_STRQ_ATI 0x897A +#define GL_SWIZZLE_STRQ_DQ_ATI 0x897B +#define GL_RED_BIT_ATI 0x00000001 +#define GL_GREEN_BIT_ATI 0x00000002 +#define GL_BLUE_BIT_ATI 0x00000004 +#define GL_2X_BIT_ATI 0x00000001 +#define GL_4X_BIT_ATI 0x00000002 +#define GL_8X_BIT_ATI 0x00000004 +#define GL_HALF_BIT_ATI 0x00000008 +#define GL_QUARTER_BIT_ATI 0x00000010 +#define GL_EIGHTH_BIT_ATI 0x00000020 +#define GL_SATURATE_BIT_ATI 0x00000040 +#define GL_COMP_BIT_ATI 0x00000002 +#define GL_NEGATE_BIT_ATI 0x00000004 +#define GL_BIAS_BIT_ATI 0x00000008 +#endif + +#ifndef GL_ATI_pn_triangles +#define GL_PN_TRIANGLES_ATI 0x87F0 +#define GL_MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F1 +#define GL_PN_TRIANGLES_POINT_MODE_ATI 0x87F2 +#define GL_PN_TRIANGLES_NORMAL_MODE_ATI 0x87F3 +#define GL_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F4 +#define GL_PN_TRIANGLES_POINT_MODE_LINEAR_ATI 0x87F5 +#define GL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI 0x87F6 +#define GL_PN_TRIANGLES_NORMAL_MODE_LINEAR_ATI 0x87F7 +#define GL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI 0x87F8 +#endif + +#ifndef GL_ATI_vertex_array_object +#define GL_STATIC_ATI 0x8760 +#define GL_DYNAMIC_ATI 0x8761 +#define GL_PRESERVE_ATI 0x8762 +#define GL_DISCARD_ATI 0x8763 +#define GL_OBJECT_BUFFER_SIZE_ATI 0x8764 +#define GL_OBJECT_BUFFER_USAGE_ATI 0x8765 +#define GL_ARRAY_OBJECT_BUFFER_ATI 0x8766 +#define GL_ARRAY_OBJECT_OFFSET_ATI 0x8767 +#endif + +#ifndef GL_EXT_vertex_shader +#define GL_VERTEX_SHADER_EXT 0x8780 +#define GL_VERTEX_SHADER_BINDING_EXT 0x8781 +#define GL_OP_INDEX_EXT 0x8782 +#define GL_OP_NEGATE_EXT 0x8783 +#define GL_OP_DOT3_EXT 0x8784 +#define GL_OP_DOT4_EXT 0x8785 +#define GL_OP_MUL_EXT 0x8786 +#define GL_OP_ADD_EXT 0x8787 +#define GL_OP_MADD_EXT 0x8788 +#define GL_OP_FRAC_EXT 0x8789 +#define GL_OP_MAX_EXT 0x878A +#define GL_OP_MIN_EXT 0x878B +#define GL_OP_SET_GE_EXT 0x878C +#define GL_OP_SET_LT_EXT 0x878D +#define GL_OP_CLAMP_EXT 0x878E +#define GL_OP_FLOOR_EXT 0x878F +#define GL_OP_ROUND_EXT 0x8790 +#define GL_OP_EXP_BASE_2_EXT 0x8791 +#define GL_OP_LOG_BASE_2_EXT 0x8792 +#define GL_OP_POWER_EXT 0x8793 +#define GL_OP_RECIP_EXT 0x8794 +#define GL_OP_RECIP_SQRT_EXT 0x8795 +#define GL_OP_SUB_EXT 0x8796 +#define GL_OP_CROSS_PRODUCT_EXT 0x8797 +#define GL_OP_MULTIPLY_MATRIX_EXT 0x8798 +#define GL_OP_MOV_EXT 0x8799 +#define GL_OUTPUT_VERTEX_EXT 0x879A +#define GL_OUTPUT_COLOR0_EXT 0x879B +#define GL_OUTPUT_COLOR1_EXT 0x879C +#define GL_OUTPUT_TEXTURE_COORD0_EXT 0x879D +#define GL_OUTPUT_TEXTURE_COORD1_EXT 0x879E +#define GL_OUTPUT_TEXTURE_COORD2_EXT 0x879F +#define GL_OUTPUT_TEXTURE_COORD3_EXT 0x87A0 +#define GL_OUTPUT_TEXTURE_COORD4_EXT 0x87A1 +#define GL_OUTPUT_TEXTURE_COORD5_EXT 0x87A2 +#define GL_OUTPUT_TEXTURE_COORD6_EXT 0x87A3 +#define GL_OUTPUT_TEXTURE_COORD7_EXT 0x87A4 +#define GL_OUTPUT_TEXTURE_COORD8_EXT 0x87A5 +#define GL_OUTPUT_TEXTURE_COORD9_EXT 0x87A6 +#define GL_OUTPUT_TEXTURE_COORD10_EXT 0x87A7 +#define GL_OUTPUT_TEXTURE_COORD11_EXT 0x87A8 +#define GL_OUTPUT_TEXTURE_COORD12_EXT 0x87A9 +#define GL_OUTPUT_TEXTURE_COORD13_EXT 0x87AA +#define GL_OUTPUT_TEXTURE_COORD14_EXT 0x87AB +#define GL_OUTPUT_TEXTURE_COORD15_EXT 0x87AC +#define GL_OUTPUT_TEXTURE_COORD16_EXT 0x87AD +#define GL_OUTPUT_TEXTURE_COORD17_EXT 0x87AE +#define GL_OUTPUT_TEXTURE_COORD18_EXT 0x87AF +#define GL_OUTPUT_TEXTURE_COORD19_EXT 0x87B0 +#define GL_OUTPUT_TEXTURE_COORD20_EXT 0x87B1 +#define GL_OUTPUT_TEXTURE_COORD21_EXT 0x87B2 +#define GL_OUTPUT_TEXTURE_COORD22_EXT 0x87B3 +#define GL_OUTPUT_TEXTURE_COORD23_EXT 0x87B4 +#define GL_OUTPUT_TEXTURE_COORD24_EXT 0x87B5 +#define GL_OUTPUT_TEXTURE_COORD25_EXT 0x87B6 +#define GL_OUTPUT_TEXTURE_COORD26_EXT 0x87B7 +#define GL_OUTPUT_TEXTURE_COORD27_EXT 0x87B8 +#define GL_OUTPUT_TEXTURE_COORD28_EXT 0x87B9 +#define GL_OUTPUT_TEXTURE_COORD29_EXT 0x87BA +#define GL_OUTPUT_TEXTURE_COORD30_EXT 0x87BB +#define GL_OUTPUT_TEXTURE_COORD31_EXT 0x87BC +#define GL_OUTPUT_FOG_EXT 0x87BD +#define GL_SCALAR_EXT 0x87BE +#define GL_VECTOR_EXT 0x87BF +#define GL_MATRIX_EXT 0x87C0 +#define GL_VARIANT_EXT 0x87C1 +#define GL_INVARIANT_EXT 0x87C2 +#define GL_LOCAL_CONSTANT_EXT 0x87C3 +#define GL_LOCAL_EXT 0x87C4 +#define GL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87C5 +#define GL_MAX_VERTEX_SHADER_VARIANTS_EXT 0x87C6 +#define GL_MAX_VERTEX_SHADER_INVARIANTS_EXT 0x87C7 +#define GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87C8 +#define GL_MAX_VERTEX_SHADER_LOCALS_EXT 0x87C9 +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CA +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT 0x87CB +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87CC +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT 0x87CD +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT 0x87CE +#define GL_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CF +#define GL_VERTEX_SHADER_VARIANTS_EXT 0x87D0 +#define GL_VERTEX_SHADER_INVARIANTS_EXT 0x87D1 +#define GL_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87D2 +#define GL_VERTEX_SHADER_LOCALS_EXT 0x87D3 +#define GL_VERTEX_SHADER_OPTIMIZED_EXT 0x87D4 +#define GL_X_EXT 0x87D5 +#define GL_Y_EXT 0x87D6 +#define GL_Z_EXT 0x87D7 +#define GL_W_EXT 0x87D8 +#define GL_NEGATIVE_X_EXT 0x87D9 +#define GL_NEGATIVE_Y_EXT 0x87DA +#define GL_NEGATIVE_Z_EXT 0x87DB +#define GL_NEGATIVE_W_EXT 0x87DC +#define GL_ZERO_EXT 0x87DD +#define GL_ONE_EXT 0x87DE +#define GL_NEGATIVE_ONE_EXT 0x87DF +#define GL_NORMALIZED_RANGE_EXT 0x87E0 +#define GL_FULL_RANGE_EXT 0x87E1 +#define GL_CURRENT_VERTEX_EXT 0x87E2 +#define GL_MVP_MATRIX_EXT 0x87E3 +#define GL_VARIANT_VALUE_EXT 0x87E4 +#define GL_VARIANT_DATATYPE_EXT 0x87E5 +#define GL_VARIANT_ARRAY_STRIDE_EXT 0x87E6 +#define GL_VARIANT_ARRAY_TYPE_EXT 0x87E7 +#define GL_VARIANT_ARRAY_EXT 0x87E8 +#define GL_VARIANT_ARRAY_POINTER_EXT 0x87E9 +#define GL_INVARIANT_VALUE_EXT 0x87EA +#define GL_INVARIANT_DATATYPE_EXT 0x87EB +#define GL_LOCAL_CONSTANT_VALUE_EXT 0x87EC +#define GL_LOCAL_CONSTANT_DATATYPE_EXT 0x87ED +#endif + +#ifndef GL_ATI_vertex_streams +#define GL_MAX_VERTEX_STREAMS_ATI 0x876B +#define GL_VERTEX_STREAM0_ATI 0x876C +#define GL_VERTEX_STREAM1_ATI 0x876D +#define GL_VERTEX_STREAM2_ATI 0x876E +#define GL_VERTEX_STREAM3_ATI 0x876F +#define GL_VERTEX_STREAM4_ATI 0x8770 +#define GL_VERTEX_STREAM5_ATI 0x8771 +#define GL_VERTEX_STREAM6_ATI 0x8772 +#define GL_VERTEX_STREAM7_ATI 0x8773 +#define GL_VERTEX_SOURCE_ATI 0x8774 +#endif + +#ifndef GL_ATI_element_array +#define GL_ELEMENT_ARRAY_ATI 0x8768 +#define GL_ELEMENT_ARRAY_TYPE_ATI 0x8769 +#define GL_ELEMENT_ARRAY_POINTER_ATI 0x876A +#endif + +#ifndef GL_SUN_mesh_array +#define GL_QUAD_MESH_SUN 0x8614 +#define GL_TRIANGLE_MESH_SUN 0x8615 +#endif + +#ifndef GL_SUN_slice_accum +#define GL_SLICE_ACCUM_SUN 0x85CC +#endif + +#ifndef GL_NV_multisample_filter_hint +#define GL_MULTISAMPLE_FILTER_HINT_NV 0x8534 +#endif + +#ifndef GL_NV_depth_clamp +#define GL_DEPTH_CLAMP_NV 0x864F +#endif + +#ifndef GL_NV_occlusion_query +#define GL_PIXEL_COUNTER_BITS_NV 0x8864 +#define GL_CURRENT_OCCLUSION_QUERY_ID_NV 0x8865 +#define GL_PIXEL_COUNT_NV 0x8866 +#define GL_PIXEL_COUNT_AVAILABLE_NV 0x8867 +#endif + +#ifndef GL_NV_point_sprite +#define GL_POINT_SPRITE_NV 0x8861 +#define GL_COORD_REPLACE_NV 0x8862 +#define GL_POINT_SPRITE_R_MODE_NV 0x8863 +#endif + +#ifndef GL_NV_texture_shader3 +#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV 0x8850 +#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV 0x8851 +#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8852 +#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV 0x8853 +#define GL_OFFSET_HILO_TEXTURE_2D_NV 0x8854 +#define GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV 0x8855 +#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV 0x8856 +#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8857 +#define GL_DEPENDENT_HILO_TEXTURE_2D_NV 0x8858 +#define GL_DEPENDENT_RGB_TEXTURE_3D_NV 0x8859 +#define GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV 0x885A +#define GL_DOT_PRODUCT_PASS_THROUGH_NV 0x885B +#define GL_DOT_PRODUCT_TEXTURE_1D_NV 0x885C +#define GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV 0x885D +#define GL_HILO8_NV 0x885E +#define GL_SIGNED_HILO8_NV 0x885F +#define GL_FORCE_BLUE_TO_ONE_NV 0x8860 +#endif + +#ifndef GL_NV_vertex_program1_1 +#endif + +#ifndef GL_EXT_shadow_funcs +#endif + +#ifndef GL_EXT_stencil_two_side +#define GL_STENCIL_TEST_TWO_SIDE_EXT 0x8910 +#define GL_ACTIVE_STENCIL_FACE_EXT 0x8911 +#endif + +#ifndef GL_ATI_text_fragment_shader +#define GL_TEXT_FRAGMENT_SHADER_ATI 0x8200 +#endif + +#ifndef GL_APPLE_client_storage +#define GL_UNPACK_CLIENT_STORAGE_APPLE 0x85B2 +#endif + +#ifndef GL_APPLE_element_array +#define GL_ELEMENT_ARRAY_APPLE 0x8768 +#define GL_ELEMENT_ARRAY_TYPE_APPLE 0x8769 +#define GL_ELEMENT_ARRAY_POINTER_APPLE 0x876A +#endif + +#ifndef GL_APPLE_fence +#define GL_DRAW_PIXELS_APPLE 0x8A0A +#define GL_FENCE_APPLE 0x8A0B +#endif + +#ifndef GL_APPLE_vertex_array_object +#define GL_VERTEX_ARRAY_BINDING_APPLE 0x85B5 +#endif + +#ifndef GL_APPLE_vertex_array_range +#define GL_VERTEX_ARRAY_RANGE_APPLE 0x851D +#define GL_VERTEX_ARRAY_RANGE_LENGTH_APPLE 0x851E +#define GL_VERTEX_ARRAY_STORAGE_HINT_APPLE 0x851F +#define GL_VERTEX_ARRAY_RANGE_POINTER_APPLE 0x8521 +#define GL_STORAGE_CACHED_APPLE 0x85BE +#define GL_STORAGE_SHARED_APPLE 0x85BF +#endif + +#ifndef GL_APPLE_ycbcr_422 +#define GL_YCBCR_422_APPLE 0x85B9 +#define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA +#define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB +#endif + +#ifndef GL_S3_s3tc +#define GL_RGB_S3TC 0x83A0 +#define GL_RGB4_S3TC 0x83A1 +#define GL_RGBA_S3TC 0x83A2 +#define GL_RGBA4_S3TC 0x83A3 +#endif + +#ifndef GL_ATI_draw_buffers +#define GL_MAX_DRAW_BUFFERS_ATI 0x8824 +#define GL_DRAW_BUFFER0_ATI 0x8825 +#define GL_DRAW_BUFFER1_ATI 0x8826 +#define GL_DRAW_BUFFER2_ATI 0x8827 +#define GL_DRAW_BUFFER3_ATI 0x8828 +#define GL_DRAW_BUFFER4_ATI 0x8829 +#define GL_DRAW_BUFFER5_ATI 0x882A +#define GL_DRAW_BUFFER6_ATI 0x882B +#define GL_DRAW_BUFFER7_ATI 0x882C +#define GL_DRAW_BUFFER8_ATI 0x882D +#define GL_DRAW_BUFFER9_ATI 0x882E +#define GL_DRAW_BUFFER10_ATI 0x882F +#define GL_DRAW_BUFFER11_ATI 0x8830 +#define GL_DRAW_BUFFER12_ATI 0x8831 +#define GL_DRAW_BUFFER13_ATI 0x8832 +#define GL_DRAW_BUFFER14_ATI 0x8833 +#define GL_DRAW_BUFFER15_ATI 0x8834 +#endif + +#ifndef GL_ATI_pixel_format_float +#define GL_TYPE_RGBA_FLOAT_ATI 0x8820 +#define GL_COLOR_CLEAR_UNCLAMPED_VALUE_ATI 0x8835 +#endif + +#ifndef GL_ATI_texture_env_combine3 +#define GL_MODULATE_ADD_ATI 0x8744 +#define GL_MODULATE_SIGNED_ADD_ATI 0x8745 +#define GL_MODULATE_SUBTRACT_ATI 0x8746 +#endif + +#ifndef GL_ATI_texture_float +#define GL_RGBA_FLOAT32_ATI 0x8814 +#define GL_RGB_FLOAT32_ATI 0x8815 +#define GL_ALPHA_FLOAT32_ATI 0x8816 +#define GL_INTENSITY_FLOAT32_ATI 0x8817 +#define GL_LUMINANCE_FLOAT32_ATI 0x8818 +#define GL_LUMINANCE_ALPHA_FLOAT32_ATI 0x8819 +#define GL_RGBA_FLOAT16_ATI 0x881A +#define GL_RGB_FLOAT16_ATI 0x881B +#define GL_ALPHA_FLOAT16_ATI 0x881C +#define GL_INTENSITY_FLOAT16_ATI 0x881D +#define GL_LUMINANCE_FLOAT16_ATI 0x881E +#define GL_LUMINANCE_ALPHA_FLOAT16_ATI 0x881F +#endif + +#ifndef GL_NV_float_buffer +#define GL_FLOAT_R_NV 0x8880 +#define GL_FLOAT_RG_NV 0x8881 +#define GL_FLOAT_RGB_NV 0x8882 +#define GL_FLOAT_RGBA_NV 0x8883 +#define GL_FLOAT_R16_NV 0x8884 +#define GL_FLOAT_R32_NV 0x8885 +#define GL_FLOAT_RG16_NV 0x8886 +#define GL_FLOAT_RG32_NV 0x8887 +#define GL_FLOAT_RGB16_NV 0x8888 +#define GL_FLOAT_RGB32_NV 0x8889 +#define GL_FLOAT_RGBA16_NV 0x888A +#define GL_FLOAT_RGBA32_NV 0x888B +#define GL_TEXTURE_FLOAT_COMPONENTS_NV 0x888C +#define GL_FLOAT_CLEAR_COLOR_VALUE_NV 0x888D +#define GL_FLOAT_RGBA_MODE_NV 0x888E +#endif + +#ifndef GL_NV_fragment_program +#define GL_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV 0x8868 +#define GL_FRAGMENT_PROGRAM_NV 0x8870 +#define GL_MAX_TEXTURE_COORDS_NV 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS_NV 0x8872 +#define GL_FRAGMENT_PROGRAM_BINDING_NV 0x8873 +#define GL_PROGRAM_ERROR_STRING_NV 0x8874 +#endif + +#ifndef GL_NV_half_float +#define GL_HALF_FLOAT_NV 0x140B +#endif + +#ifndef GL_NV_pixel_data_range +#define GL_WRITE_PIXEL_DATA_RANGE_NV 0x8878 +#define GL_READ_PIXEL_DATA_RANGE_NV 0x8879 +#define GL_WRITE_PIXEL_DATA_RANGE_LENGTH_NV 0x887A +#define GL_READ_PIXEL_DATA_RANGE_LENGTH_NV 0x887B +#define GL_WRITE_PIXEL_DATA_RANGE_POINTER_NV 0x887C +#define GL_READ_PIXEL_DATA_RANGE_POINTER_NV 0x887D +#endif + +#ifndef GL_NV_primitive_restart +#define GL_PRIMITIVE_RESTART_NV 0x8558 +#define GL_PRIMITIVE_RESTART_INDEX_NV 0x8559 +#endif + +#ifndef GL_NV_texture_expand_normal +#define GL_TEXTURE_UNSIGNED_REMAP_MODE_NV 0x888F +#endif + +#ifndef GL_NV_vertex_program2 +#endif + +#ifndef GL_ATI_map_object_buffer +#endif + +#ifndef GL_ATI_separate_stencil +#define GL_STENCIL_BACK_FUNC_ATI 0x8800 +#define GL_STENCIL_BACK_FAIL_ATI 0x8801 +#define GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI 0x8802 +#define GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI 0x8803 +#endif + +#ifndef GL_ATI_vertex_attrib_array_object +#endif + +#ifndef GL_OES_read_format +#define GL_IMPLEMENTATION_COLOR_READ_TYPE_OES 0x8B9A +#define GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES 0x8B9B +#endif + +#ifndef GL_EXT_depth_bounds_test +#define GL_DEPTH_BOUNDS_TEST_EXT 0x8890 +#define GL_DEPTH_BOUNDS_EXT 0x8891 +#endif + +#ifndef GL_EXT_texture_mirror_clamp +#define GL_MIRROR_CLAMP_EXT 0x8742 +#define GL_MIRROR_CLAMP_TO_EDGE_EXT 0x8743 +#define GL_MIRROR_CLAMP_TO_BORDER_EXT 0x8912 +#endif + +#ifndef GL_EXT_blend_equation_separate +#define GL_BLEND_EQUATION_RGB_EXT GL_BLEND_EQUATION +#define GL_BLEND_EQUATION_ALPHA_EXT 0x883D +#endif + +#ifndef GL_MESA_pack_invert +#define GL_PACK_INVERT_MESA 0x8758 +#endif + +#ifndef GL_MESA_ycbcr_texture +#define GL_UNSIGNED_SHORT_8_8_MESA 0x85BA +#define GL_UNSIGNED_SHORT_8_8_REV_MESA 0x85BB +#define GL_YCBCR_MESA 0x8757 +#endif + +#ifndef GL_EXT_pixel_buffer_object +#define GL_PIXEL_PACK_BUFFER_EXT 0x88EB +#define GL_PIXEL_UNPACK_BUFFER_EXT 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING_EXT 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING_EXT 0x88EF +#endif + +#ifndef GL_NV_fragment_program_option +#endif + +#ifndef GL_NV_fragment_program2 +#define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4 +#define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5 +#define GL_MAX_PROGRAM_IF_DEPTH_NV 0x88F6 +#define GL_MAX_PROGRAM_LOOP_DEPTH_NV 0x88F7 +#define GL_MAX_PROGRAM_LOOP_COUNT_NV 0x88F8 +#endif + +#ifndef GL_NV_vertex_program2_option +/* reuse GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV */ +/* reuse GL_MAX_PROGRAM_CALL_DEPTH_NV */ +#endif + +#ifndef GL_NV_vertex_program3 +/* reuse GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB */ +#endif + +#ifndef GL_EXT_framebuffer_object +#define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506 +#define GL_MAX_RENDERBUFFER_SIZE_EXT 0x84E8 +#define GL_FRAMEBUFFER_BINDING_EXT 0x8CA6 +#define GL_RENDERBUFFER_BINDING_EXT 0x8CA7 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT 0x8CD0 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT 0x8CD1 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT 0x8CD2 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8CD3 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT 0x8CD4 +#define GL_FRAMEBUFFER_COMPLETE_EXT 0x8CD5 +#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT 0x8CD6 +#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT 0x8CD7 +#define GL_FRAMEBUFFER_INCOMPLETE_DUPLICATE_ATTACHMENT_EXT 0x8CD8 +#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT 0x8CD9 +#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT 0x8CDA +#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT 0x8CDB +#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT 0x8CDC +#define GL_FRAMEBUFFER_UNSUPPORTED_EXT 0x8CDD +#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF +#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0 +#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1 +#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2 +#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3 +#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4 +#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5 +#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6 +#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7 +#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8 +#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9 +#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA +#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB +#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC +#define GL_COLOR_ATTACHMENT13_EXT 0x8CED +#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE +#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF +#define GL_DEPTH_ATTACHMENT_EXT 0x8D00 +#define GL_STENCIL_ATTACHMENT_EXT 0x8D20 +#define GL_FRAMEBUFFER_EXT 0x8D40 +#define GL_RENDERBUFFER_EXT 0x8D41 +#define GL_RENDERBUFFER_WIDTH_EXT 0x8D42 +#define GL_RENDERBUFFER_HEIGHT_EXT 0x8D43 +#define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT 0x8D44 +#define GL_STENCIL_INDEX1_EXT 0x8D46 +#define GL_STENCIL_INDEX4_EXT 0x8D47 +#define GL_STENCIL_INDEX8_EXT 0x8D48 +#define GL_STENCIL_INDEX16_EXT 0x8D49 +#define GL_RENDERBUFFER_RED_SIZE_EXT 0x8D50 +#define GL_RENDERBUFFER_GREEN_SIZE_EXT 0x8D51 +#define GL_RENDERBUFFER_BLUE_SIZE_EXT 0x8D52 +#define GL_RENDERBUFFER_ALPHA_SIZE_EXT 0x8D53 +#define GL_RENDERBUFFER_DEPTH_SIZE_EXT 0x8D54 +#define GL_RENDERBUFFER_STENCIL_SIZE_EXT 0x8D55 +#endif + +#ifndef GL_GREMEDY_string_marker +#endif + + +/*************************************************************/ + +#include +#ifndef GL_VERSION_2_0 +/* GL type for program/shader text */ +typedef char GLchar; /* native character */ +#endif + +#ifndef GL_VERSION_1_5 +/* GL types for handling large vertex buffer objects */ +typedef ptrdiff_t GLintptr; +typedef ptrdiff_t GLsizeiptr; +#endif + +#ifndef GL_ARB_vertex_buffer_object +/* GL types for handling large vertex buffer objects */ +typedef ptrdiff_t GLintptrARB; +typedef ptrdiff_t GLsizeiptrARB; +#endif + +#ifndef GL_ARB_shader_objects +/* GL types for handling shader object handles and program/shader text */ +typedef char GLcharARB; /* native character */ +typedef unsigned int GLhandleARB; /* shader object handle */ +#endif + +/* GL types for "half" precision (s10e5) float data in host memory */ +#ifndef GL_ARB_half_float_pixel +typedef unsigned short GLhalfARB; +#endif + +#ifndef GL_NV_half_float +typedef unsigned short GLhalfNV; +#endif + +#ifndef GL_VERSION_1_2 +#define GL_VERSION_1_2 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendColor (GLclampf, GLclampf, GLclampf, GLclampf); +GLAPI void APIENTRY glBlendEquation (GLenum); +GLAPI void APIENTRY glDrawRangeElements (GLenum, GLuint, GLuint, GLsizei, GLenum, const GLvoid *); +GLAPI void APIENTRY glColorTable (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glColorTableParameterfv (GLenum, GLenum, const GLfloat *); +GLAPI void APIENTRY glColorTableParameteriv (GLenum, GLenum, const GLint *); +GLAPI void APIENTRY glCopyColorTable (GLenum, GLenum, GLint, GLint, GLsizei); +GLAPI void APIENTRY glGetColorTable (GLenum, GLenum, GLenum, GLvoid *); +GLAPI void APIENTRY glGetColorTableParameterfv (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetColorTableParameteriv (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glColorSubTable (GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glCopyColorSubTable (GLenum, GLsizei, GLint, GLint, GLsizei); +GLAPI void APIENTRY glConvolutionFilter1D (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glConvolutionFilter2D (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glConvolutionParameterf (GLenum, GLenum, GLfloat); +GLAPI void APIENTRY glConvolutionParameterfv (GLenum, GLenum, const GLfloat *); +GLAPI void APIENTRY glConvolutionParameteri (GLenum, GLenum, GLint); +GLAPI void APIENTRY glConvolutionParameteriv (GLenum, GLenum, const GLint *); +GLAPI void APIENTRY glCopyConvolutionFilter1D (GLenum, GLenum, GLint, GLint, GLsizei); +GLAPI void APIENTRY glCopyConvolutionFilter2D (GLenum, GLenum, GLint, GLint, GLsizei, GLsizei); +GLAPI void APIENTRY glGetConvolutionFilter (GLenum, GLenum, GLenum, GLvoid *); +GLAPI void APIENTRY glGetConvolutionParameterfv (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetConvolutionParameteriv (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetSeparableFilter (GLenum, GLenum, GLenum, GLvoid *, GLvoid *, GLvoid *); +GLAPI void APIENTRY glSeparableFilter2D (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *, const GLvoid *); +GLAPI void APIENTRY glGetHistogram (GLenum, GLboolean, GLenum, GLenum, GLvoid *); +GLAPI void APIENTRY glGetHistogramParameterfv (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetHistogramParameteriv (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetMinmax (GLenum, GLboolean, GLenum, GLenum, GLvoid *); +GLAPI void APIENTRY glGetMinmaxParameterfv (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetMinmaxParameteriv (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glHistogram (GLenum, GLsizei, GLenum, GLboolean); +GLAPI void APIENTRY glMinmax (GLenum, GLenum, GLboolean); +GLAPI void APIENTRY glResetHistogram (GLenum); +GLAPI void APIENTRY glResetMinmax (GLenum); +GLAPI void APIENTRY glTexImage3D (GLenum, GLint, GLint, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glTexSubImage3D (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glCopyTexSubImage3D (GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBLENDCOLORPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); +typedef void (APIENTRYP PFNGLBLENDEQUATIONPROC) (GLenum mode); +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); +typedef void (APIENTRYP PFNGLCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); +typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOPYCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, GLvoid *table); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOPYCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); +typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIPROC) (GLenum target, GLenum pname, GLint params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *image); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); +typedef void (APIENTRYP PFNGLSEPARABLEFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); +typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLHISTOGRAMPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +typedef void (APIENTRYP PFNGLMINMAXPROC) (GLenum target, GLenum internalformat, GLboolean sink); +typedef void (APIENTRYP PFNGLRESETHISTOGRAMPROC) (GLenum target); +typedef void (APIENTRYP PFNGLRESETMINMAXPROC) (GLenum target); +typedef void (APIENTRYP PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (APIENTRYP PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +#endif + +#ifndef GL_VERSION_1_3 +#define GL_VERSION_1_3 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glActiveTexture (GLenum); +GLAPI void APIENTRY glClientActiveTexture (GLenum); +GLAPI void APIENTRY glMultiTexCoord1d (GLenum, GLdouble); +GLAPI void APIENTRY glMultiTexCoord1dv (GLenum, const GLdouble *); +GLAPI void APIENTRY glMultiTexCoord1f (GLenum, GLfloat); +GLAPI void APIENTRY glMultiTexCoord1fv (GLenum, const GLfloat *); +GLAPI void APIENTRY glMultiTexCoord1i (GLenum, GLint); +GLAPI void APIENTRY glMultiTexCoord1iv (GLenum, const GLint *); +GLAPI void APIENTRY glMultiTexCoord1s (GLenum, GLshort); +GLAPI void APIENTRY glMultiTexCoord1sv (GLenum, const GLshort *); +GLAPI void APIENTRY glMultiTexCoord2d (GLenum, GLdouble, GLdouble); +GLAPI void APIENTRY glMultiTexCoord2dv (GLenum, const GLdouble *); +GLAPI void APIENTRY glMultiTexCoord2f (GLenum, GLfloat, GLfloat); +GLAPI void APIENTRY glMultiTexCoord2fv (GLenum, const GLfloat *); +GLAPI void APIENTRY glMultiTexCoord2i (GLenum, GLint, GLint); +GLAPI void APIENTRY glMultiTexCoord2iv (GLenum, const GLint *); +GLAPI void APIENTRY glMultiTexCoord2s (GLenum, GLshort, GLshort); +GLAPI void APIENTRY glMultiTexCoord2sv (GLenum, const GLshort *); +GLAPI void APIENTRY glMultiTexCoord3d (GLenum, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glMultiTexCoord3dv (GLenum, const GLdouble *); +GLAPI void APIENTRY glMultiTexCoord3f (GLenum, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glMultiTexCoord3fv (GLenum, const GLfloat *); +GLAPI void APIENTRY glMultiTexCoord3i (GLenum, GLint, GLint, GLint); +GLAPI void APIENTRY glMultiTexCoord3iv (GLenum, const GLint *); +GLAPI void APIENTRY glMultiTexCoord3s (GLenum, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glMultiTexCoord3sv (GLenum, const GLshort *); +GLAPI void APIENTRY glMultiTexCoord4d (GLenum, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glMultiTexCoord4dv (GLenum, const GLdouble *); +GLAPI void APIENTRY glMultiTexCoord4f (GLenum, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glMultiTexCoord4fv (GLenum, const GLfloat *); +GLAPI void APIENTRY glMultiTexCoord4i (GLenum, GLint, GLint, GLint, GLint); +GLAPI void APIENTRY glMultiTexCoord4iv (GLenum, const GLint *); +GLAPI void APIENTRY glMultiTexCoord4s (GLenum, GLshort, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glMultiTexCoord4sv (GLenum, const GLshort *); +GLAPI void APIENTRY glLoadTransposeMatrixf (const GLfloat *); +GLAPI void APIENTRY glLoadTransposeMatrixd (const GLdouble *); +GLAPI void APIENTRY glMultTransposeMatrixf (const GLfloat *); +GLAPI void APIENTRY glMultTransposeMatrixd (const GLdouble *); +GLAPI void APIENTRY glSampleCoverage (GLclampf, GLboolean); +GLAPI void APIENTRY glCompressedTexImage3D (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); +GLAPI void APIENTRY glCompressedTexImage2D (GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); +GLAPI void APIENTRY glCompressedTexImage1D (GLenum, GLint, GLenum, GLsizei, GLint, GLsizei, const GLvoid *); +GLAPI void APIENTRY glCompressedTexSubImage3D (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glCompressedTexSubImage2D (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glCompressedTexSubImage1D (GLenum, GLint, GLint, GLsizei, GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glGetCompressedTexImage (GLenum, GLint, GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLACTIVETEXTUREPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLCLIENTACTIVETEXTUREPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DPROC) (GLenum target, GLdouble s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FPROC) (GLenum target, GLfloat s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IPROC) (GLenum target, GLint s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SPROC) (GLenum target, GLshort s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DPROC) (GLenum target, GLdouble s, GLdouble t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FPROC) (GLenum target, GLfloat s, GLfloat t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IPROC) (GLenum target, GLint s, GLint t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SPROC) (GLenum target, GLshort s, GLshort t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IPROC) (GLenum target, GLint s, GLint t, GLint r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SPROC) (GLenum target, GLshort s, GLshort t, GLshort r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXFPROC) (const GLfloat *m); +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXDPROC) (const GLdouble *m); +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXFPROC) (const GLfloat *m); +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXDPROC) (const GLdouble *m); +typedef void (APIENTRYP PFNGLSAMPLECOVERAGEPROC) (GLclampf value, GLboolean invert); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint level, GLvoid *img); +#endif + +#ifndef GL_VERSION_1_4 +#define GL_VERSION_1_4 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendFuncSeparate (GLenum, GLenum, GLenum, GLenum); +GLAPI void APIENTRY glFogCoordf (GLfloat); +GLAPI void APIENTRY glFogCoordfv (const GLfloat *); +GLAPI void APIENTRY glFogCoordd (GLdouble); +GLAPI void APIENTRY glFogCoorddv (const GLdouble *); +GLAPI void APIENTRY glFogCoordPointer (GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glMultiDrawArrays (GLenum, GLint *, GLsizei *, GLsizei); +GLAPI void APIENTRY glMultiDrawElements (GLenum, const GLsizei *, GLenum, const GLvoid* *, GLsizei); +GLAPI void APIENTRY glPointParameterf (GLenum, GLfloat); +GLAPI void APIENTRY glPointParameterfv (GLenum, const GLfloat *); +GLAPI void APIENTRY glPointParameteri (GLenum, GLint); +GLAPI void APIENTRY glPointParameteriv (GLenum, const GLint *); +GLAPI void APIENTRY glSecondaryColor3b (GLbyte, GLbyte, GLbyte); +GLAPI void APIENTRY glSecondaryColor3bv (const GLbyte *); +GLAPI void APIENTRY glSecondaryColor3d (GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glSecondaryColor3dv (const GLdouble *); +GLAPI void APIENTRY glSecondaryColor3f (GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glSecondaryColor3fv (const GLfloat *); +GLAPI void APIENTRY glSecondaryColor3i (GLint, GLint, GLint); +GLAPI void APIENTRY glSecondaryColor3iv (const GLint *); +GLAPI void APIENTRY glSecondaryColor3s (GLshort, GLshort, GLshort); +GLAPI void APIENTRY glSecondaryColor3sv (const GLshort *); +GLAPI void APIENTRY glSecondaryColor3ub (GLubyte, GLubyte, GLubyte); +GLAPI void APIENTRY glSecondaryColor3ubv (const GLubyte *); +GLAPI void APIENTRY glSecondaryColor3ui (GLuint, GLuint, GLuint); +GLAPI void APIENTRY glSecondaryColor3uiv (const GLuint *); +GLAPI void APIENTRY glSecondaryColor3us (GLushort, GLushort, GLushort); +GLAPI void APIENTRY glSecondaryColor3usv (const GLushort *); +GLAPI void APIENTRY glSecondaryColorPointer (GLint, GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glWindowPos2d (GLdouble, GLdouble); +GLAPI void APIENTRY glWindowPos2dv (const GLdouble *); +GLAPI void APIENTRY glWindowPos2f (GLfloat, GLfloat); +GLAPI void APIENTRY glWindowPos2fv (const GLfloat *); +GLAPI void APIENTRY glWindowPos2i (GLint, GLint); +GLAPI void APIENTRY glWindowPos2iv (const GLint *); +GLAPI void APIENTRY glWindowPos2s (GLshort, GLshort); +GLAPI void APIENTRY glWindowPos2sv (const GLshort *); +GLAPI void APIENTRY glWindowPos3d (GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glWindowPos3dv (const GLdouble *); +GLAPI void APIENTRY glWindowPos3f (GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glWindowPos3fv (const GLfloat *); +GLAPI void APIENTRY glWindowPos3i (GLint, GLint, GLint); +GLAPI void APIENTRY glWindowPos3iv (const GLint *); +GLAPI void APIENTRY glWindowPos3s (GLshort, GLshort, GLshort); +GLAPI void APIENTRY glWindowPos3sv (const GLshort *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +typedef void (APIENTRYP PFNGLFOGCOORDFPROC) (GLfloat coord); +typedef void (APIENTRYP PFNGLFOGCOORDFVPROC) (const GLfloat *coord); +typedef void (APIENTRYP PFNGLFOGCOORDDPROC) (GLdouble coord); +typedef void (APIENTRYP PFNGLFOGCOORDDVPROC) (const GLdouble *coord); +typedef void (APIENTRYP PFNGLFOGCOORDPOINTERPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSPROC) (GLenum mode, GLint *first, GLsizei *count, GLsizei primcount); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSPROC) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFVPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLPOINTPARAMETERIPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERIVPROC) (GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BPROC) (GLbyte red, GLbyte green, GLbyte blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BVPROC) (const GLbyte *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DPROC) (GLdouble red, GLdouble green, GLdouble blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DVPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FPROC) (GLfloat red, GLfloat green, GLfloat blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FVPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IPROC) (GLint red, GLint green, GLint blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IVPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SPROC) (GLshort red, GLshort green, GLshort blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SVPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBPROC) (GLubyte red, GLubyte green, GLubyte blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBVPROC) (const GLubyte *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIPROC) (GLuint red, GLuint green, GLuint blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIVPROC) (const GLuint *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USPROC) (GLushort red, GLushort green, GLushort blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USVPROC) (const GLushort *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTERPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLWINDOWPOS2DPROC) (GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLWINDOWPOS2DVPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2FPROC) (GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLWINDOWPOS2FVPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2IPROC) (GLint x, GLint y); +typedef void (APIENTRYP PFNGLWINDOWPOS2IVPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2SPROC) (GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLWINDOWPOS2SVPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3DPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLWINDOWPOS3DVPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3FPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLWINDOWPOS3FVPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3IPROC) (GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLWINDOWPOS3IVPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3SPROC) (GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLWINDOWPOS3SVPROC) (const GLshort *v); +#endif + +#ifndef GL_VERSION_1_5 +#define GL_VERSION_1_5 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenQueries (GLsizei, GLuint *); +GLAPI void APIENTRY glDeleteQueries (GLsizei, const GLuint *); +GLAPI GLboolean APIENTRY glIsQuery (GLuint); +GLAPI void APIENTRY glBeginQuery (GLenum, GLuint); +GLAPI void APIENTRY glEndQuery (GLenum); +GLAPI void APIENTRY glGetQueryiv (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetQueryObjectiv (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetQueryObjectuiv (GLuint, GLenum, GLuint *); +GLAPI void APIENTRY glBindBuffer (GLenum, GLuint); +GLAPI void APIENTRY glDeleteBuffers (GLsizei, const GLuint *); +GLAPI void APIENTRY glGenBuffers (GLsizei, GLuint *); +GLAPI GLboolean APIENTRY glIsBuffer (GLuint); +GLAPI void APIENTRY glBufferData (GLenum, GLsizeiptr, const GLvoid *, GLenum); +GLAPI void APIENTRY glBufferSubData (GLenum, GLintptr, GLsizeiptr, const GLvoid *); +GLAPI void APIENTRY glGetBufferSubData (GLenum, GLintptr, GLsizeiptr, GLvoid *); +GLAPI GLvoid* APIENTRY glMapBuffer (GLenum, GLenum); +GLAPI GLboolean APIENTRY glUnmapBuffer (GLenum); +GLAPI void APIENTRY glGetBufferParameteriv (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetBufferPointerv (GLenum, GLenum, GLvoid* *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGENQUERIESPROC) (GLsizei n, GLuint *ids); +typedef void (APIENTRYP PFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint *ids); +typedef GLboolean (APIENTRYP PFNGLISQUERYPROC) (GLuint id); +typedef void (APIENTRYP PFNGLBEGINQUERYPROC) (GLenum target, GLuint id); +typedef void (APIENTRYP PFNGLENDQUERYPROC) (GLenum target); +typedef void (APIENTRYP PFNGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTIVPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer); +typedef void (APIENTRYP PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint *buffers); +typedef void (APIENTRYP PFNGLGENBUFFERSPROC) (GLsizei n, GLuint *buffers); +typedef GLboolean (APIENTRYP PFNGLISBUFFERPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage); +typedef void (APIENTRYP PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data); +typedef void (APIENTRYP PFNGLGETBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data); +typedef GLvoid* (APIENTRYP PFNGLMAPBUFFERPROC) (GLenum target, GLenum access); +typedef GLboolean (APIENTRYP PFNGLUNMAPBUFFERPROC) (GLenum target); +typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname, GLvoid* *params); +#endif + +#ifndef GL_VERSION_2_0 +#define GL_VERSION_2_0 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendEquationSeparate (GLenum, GLenum); +GLAPI void APIENTRY glDrawBuffers (GLsizei, const GLenum *); +GLAPI void APIENTRY glStencilOpSeparate (GLenum, GLenum, GLenum, GLenum); +GLAPI void APIENTRY glStencilFuncSeparate (GLenum, GLenum, GLint, GLuint); +GLAPI void APIENTRY glStencilMaskSeparate (GLenum, GLuint); +GLAPI void APIENTRY glAttachShader (GLuint, GLuint); +GLAPI void APIENTRY glBindAttribLocation (GLuint, GLuint, const GLchar *); +GLAPI void APIENTRY glCompileShader (GLuint); +GLAPI GLuint APIENTRY glCreateProgram (void); +GLAPI GLuint APIENTRY glCreateShader (GLenum); +GLAPI void APIENTRY glDeleteProgram (GLuint); +GLAPI void APIENTRY glDeleteShader (GLuint); +GLAPI void APIENTRY glDetachShader (GLuint, GLuint); +GLAPI void APIENTRY glDisableVertexAttribArray (GLuint); +GLAPI void APIENTRY glEnableVertexAttribArray (GLuint); +GLAPI void APIENTRY glGetActiveAttrib (GLuint, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLchar *); +GLAPI void APIENTRY glGetActiveUniform (GLuint, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLchar *); +GLAPI void APIENTRY glGetAttachedShaders (GLuint, GLsizei, GLsizei *, GLuint *); +GLAPI GLint APIENTRY glGetAttribLocation (GLuint, const GLchar *); +GLAPI void APIENTRY glGetProgramiv (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetProgramInfoLog (GLuint, GLsizei, GLsizei *, GLchar *); +GLAPI void APIENTRY glGetShaderiv (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetShaderInfoLog (GLuint, GLsizei, GLsizei *, GLchar *); +GLAPI void APIENTRY glGetShaderSource (GLuint, GLsizei, GLsizei *, GLchar *); +GLAPI GLint APIENTRY glGetUniformLocation (GLuint, const GLchar *); +GLAPI void APIENTRY glGetUniformfv (GLuint, GLint, GLfloat *); +GLAPI void APIENTRY glGetUniformiv (GLuint, GLint, GLint *); +GLAPI void APIENTRY glGetVertexAttribdv (GLuint, GLenum, GLdouble *); +GLAPI void APIENTRY glGetVertexAttribfv (GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glGetVertexAttribiv (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetVertexAttribPointerv (GLuint, GLenum, GLvoid* *); +GLAPI GLboolean APIENTRY glIsProgram (GLuint); +GLAPI GLboolean APIENTRY glIsShader (GLuint); +GLAPI void APIENTRY glLinkProgram (GLuint); +GLAPI void APIENTRY glShaderSource (GLuint, GLsizei, const GLchar* *, const GLint *); +GLAPI void APIENTRY glUseProgram (GLuint); +GLAPI void APIENTRY glUniform1f (GLint, GLfloat); +GLAPI void APIENTRY glUniform2f (GLint, GLfloat, GLfloat); +GLAPI void APIENTRY glUniform3f (GLint, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glUniform4f (GLint, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glUniform1i (GLint, GLint); +GLAPI void APIENTRY glUniform2i (GLint, GLint, GLint); +GLAPI void APIENTRY glUniform3i (GLint, GLint, GLint, GLint); +GLAPI void APIENTRY glUniform4i (GLint, GLint, GLint, GLint, GLint); +GLAPI void APIENTRY glUniform1fv (GLint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glUniform2fv (GLint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glUniform3fv (GLint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glUniform4fv (GLint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glUniform1iv (GLint, GLsizei, const GLint *); +GLAPI void APIENTRY glUniform2iv (GLint, GLsizei, const GLint *); +GLAPI void APIENTRY glUniform3iv (GLint, GLsizei, const GLint *); +GLAPI void APIENTRY glUniform4iv (GLint, GLsizei, const GLint *); +GLAPI void APIENTRY glUniformMatrix2fv (GLint, GLsizei, GLboolean, const GLfloat *); +GLAPI void APIENTRY glUniformMatrix3fv (GLint, GLsizei, GLboolean, const GLfloat *); +GLAPI void APIENTRY glUniformMatrix4fv (GLint, GLsizei, GLboolean, const GLfloat *); +GLAPI void APIENTRY glValidateProgram (GLuint); +GLAPI void APIENTRY glVertexAttrib1d (GLuint, GLdouble); +GLAPI void APIENTRY glVertexAttrib1dv (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib1f (GLuint, GLfloat); +GLAPI void APIENTRY glVertexAttrib1fv (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib1s (GLuint, GLshort); +GLAPI void APIENTRY glVertexAttrib1sv (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib2d (GLuint, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexAttrib2dv (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib2f (GLuint, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexAttrib2fv (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib2s (GLuint, GLshort, GLshort); +GLAPI void APIENTRY glVertexAttrib2sv (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib3d (GLuint, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexAttrib3dv (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib3f (GLuint, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexAttrib3fv (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib3s (GLuint, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glVertexAttrib3sv (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib4Nbv (GLuint, const GLbyte *); +GLAPI void APIENTRY glVertexAttrib4Niv (GLuint, const GLint *); +GLAPI void APIENTRY glVertexAttrib4Nsv (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib4Nub (GLuint, GLubyte, GLubyte, GLubyte, GLubyte); +GLAPI void APIENTRY glVertexAttrib4Nubv (GLuint, const GLubyte *); +GLAPI void APIENTRY glVertexAttrib4Nuiv (GLuint, const GLuint *); +GLAPI void APIENTRY glVertexAttrib4Nusv (GLuint, const GLushort *); +GLAPI void APIENTRY glVertexAttrib4bv (GLuint, const GLbyte *); +GLAPI void APIENTRY glVertexAttrib4d (GLuint, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexAttrib4dv (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib4f (GLuint, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexAttrib4fv (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib4iv (GLuint, const GLint *); +GLAPI void APIENTRY glVertexAttrib4s (GLuint, GLshort, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glVertexAttrib4sv (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib4ubv (GLuint, const GLubyte *); +GLAPI void APIENTRY glVertexAttrib4uiv (GLuint, const GLuint *); +GLAPI void APIENTRY glVertexAttrib4usv (GLuint, const GLushort *); +GLAPI void APIENTRY glVertexAttribPointer (GLuint, GLint, GLenum, GLboolean, GLsizei, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha); +typedef void (APIENTRYP PFNGLDRAWBUFFERSPROC) (GLsizei n, const GLenum *bufs); +typedef void (APIENTRYP PFNGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +typedef void (APIENTRYP PFNGLSTENCILFUNCSEPARATEPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); +typedef void (APIENTRYP PFNGLSTENCILMASKSEPARATEPROC) (GLenum face, GLuint mask); +typedef void (APIENTRYP PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader); +typedef void (APIENTRYP PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar *name); +typedef void (APIENTRYP PFNGLCOMPILESHADERPROC) (GLuint shader); +typedef GLuint (APIENTRYP PFNGLCREATEPROGRAMPROC) (void); +typedef GLuint (APIENTRYP PFNGLCREATESHADERPROC) (GLenum type); +typedef void (APIENTRYP PFNGLDELETEPROGRAMPROC) (GLuint program); +typedef void (APIENTRYP PFNGLDELETESHADERPROC) (GLuint shader); +typedef void (APIENTRYP PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader); +typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index); +typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index); +typedef void (APIENTRYP PFNGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); +typedef void (APIENTRYP PFNGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj); +typedef GLint (APIENTRYP PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar *name); +typedef void (APIENTRYP PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +typedef void (APIENTRYP PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +typedef void (APIENTRYP PFNGLGETSHADERSOURCEPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); +typedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar *name); +typedef void (APIENTRYP PFNGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat *params); +typedef void (APIENTRYP PFNGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVPROC) (GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVPROC) (GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint index, GLenum pname, GLvoid* *pointer); +typedef GLboolean (APIENTRYP PFNGLISPROGRAMPROC) (GLuint program); +typedef GLboolean (APIENTRYP PFNGLISSHADERPROC) (GLuint shader); +typedef void (APIENTRYP PFNGLLINKPROGRAMPROC) (GLuint program); +typedef void (APIENTRYP PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar* *string, const GLint *length); +typedef void (APIENTRYP PFNGLUSEPROGRAMPROC) (GLuint program); +typedef void (APIENTRYP PFNGLUNIFORM1FPROC) (GLint location, GLfloat v0); +typedef void (APIENTRYP PFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1); +typedef void (APIENTRYP PFNGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (APIENTRYP PFNGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (APIENTRYP PFNGLUNIFORM1IPROC) (GLint location, GLint v0); +typedef void (APIENTRYP PFNGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1); +typedef void (APIENTRYP PFNGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2); +typedef void (APIENTRYP PFNGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (APIENTRYP PFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLVALIDATEPROGRAMPROC) (GLuint program); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DPROC) (GLuint index, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SPROC) (GLuint index, GLshort x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SPROC) (GLuint index, GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NBVPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NIVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NSVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBVPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUIVPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUSVPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4BVPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4IVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UIVPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4USVPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer); +#endif + +#ifndef GL_ARB_multitexture +#define GL_ARB_multitexture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glActiveTextureARB (GLenum); +GLAPI void APIENTRY glClientActiveTextureARB (GLenum); +GLAPI void APIENTRY glMultiTexCoord1dARB (GLenum, GLdouble); +GLAPI void APIENTRY glMultiTexCoord1dvARB (GLenum, const GLdouble *); +GLAPI void APIENTRY glMultiTexCoord1fARB (GLenum, GLfloat); +GLAPI void APIENTRY glMultiTexCoord1fvARB (GLenum, const GLfloat *); +GLAPI void APIENTRY glMultiTexCoord1iARB (GLenum, GLint); +GLAPI void APIENTRY glMultiTexCoord1ivARB (GLenum, const GLint *); +GLAPI void APIENTRY glMultiTexCoord1sARB (GLenum, GLshort); +GLAPI void APIENTRY glMultiTexCoord1svARB (GLenum, const GLshort *); +GLAPI void APIENTRY glMultiTexCoord2dARB (GLenum, GLdouble, GLdouble); +GLAPI void APIENTRY glMultiTexCoord2dvARB (GLenum, const GLdouble *); +GLAPI void APIENTRY glMultiTexCoord2fARB (GLenum, GLfloat, GLfloat); +GLAPI void APIENTRY glMultiTexCoord2fvARB (GLenum, const GLfloat *); +GLAPI void APIENTRY glMultiTexCoord2iARB (GLenum, GLint, GLint); +GLAPI void APIENTRY glMultiTexCoord2ivARB (GLenum, const GLint *); +GLAPI void APIENTRY glMultiTexCoord2sARB (GLenum, GLshort, GLshort); +GLAPI void APIENTRY glMultiTexCoord2svARB (GLenum, const GLshort *); +GLAPI void APIENTRY glMultiTexCoord3dARB (GLenum, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glMultiTexCoord3dvARB (GLenum, const GLdouble *); +GLAPI void APIENTRY glMultiTexCoord3fARB (GLenum, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glMultiTexCoord3fvARB (GLenum, const GLfloat *); +GLAPI void APIENTRY glMultiTexCoord3iARB (GLenum, GLint, GLint, GLint); +GLAPI void APIENTRY glMultiTexCoord3ivARB (GLenum, const GLint *); +GLAPI void APIENTRY glMultiTexCoord3sARB (GLenum, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glMultiTexCoord3svARB (GLenum, const GLshort *); +GLAPI void APIENTRY glMultiTexCoord4dARB (GLenum, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glMultiTexCoord4dvARB (GLenum, const GLdouble *); +GLAPI void APIENTRY glMultiTexCoord4fARB (GLenum, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glMultiTexCoord4fvARB (GLenum, const GLfloat *); +GLAPI void APIENTRY glMultiTexCoord4iARB (GLenum, GLint, GLint, GLint, GLint); +GLAPI void APIENTRY glMultiTexCoord4ivARB (GLenum, const GLint *); +GLAPI void APIENTRY glMultiTexCoord4sARB (GLenum, GLshort, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glMultiTexCoord4svARB (GLenum, const GLshort *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLACTIVETEXTUREARBPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IARBPROC) (GLenum target, GLint s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SARBPROC) (GLenum target, GLshort s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SVARBPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DARBPROC) (GLenum target, GLdouble s, GLdouble t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IARBPROC) (GLenum target, GLint s, GLint t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SARBPROC) (GLenum target, GLshort s, GLshort t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IARBPROC) (GLenum target, GLint s, GLint t, GLint r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SVARBPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort *v); +#endif + +#ifndef GL_ARB_transpose_matrix +#define GL_ARB_transpose_matrix 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glLoadTransposeMatrixfARB (const GLfloat *); +GLAPI void APIENTRY glLoadTransposeMatrixdARB (const GLdouble *); +GLAPI void APIENTRY glMultTransposeMatrixfARB (const GLfloat *); +GLAPI void APIENTRY glMultTransposeMatrixdARB (const GLdouble *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXFARBPROC) (const GLfloat *m); +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXDARBPROC) (const GLdouble *m); +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXFARBPROC) (const GLfloat *m); +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXDARBPROC) (const GLdouble *m); +#endif + +#ifndef GL_ARB_multisample +#define GL_ARB_multisample 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSampleCoverageARB (GLclampf, GLboolean); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLSAMPLECOVERAGEARBPROC) (GLclampf value, GLboolean invert); +#endif + +#ifndef GL_ARB_texture_env_add +#define GL_ARB_texture_env_add 1 +#endif + +#ifndef GL_ARB_texture_cube_map +#define GL_ARB_texture_cube_map 1 +#endif + +#ifndef GL_ARB_texture_compression +#define GL_ARB_texture_compression 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCompressedTexImage3DARB (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); +GLAPI void APIENTRY glCompressedTexImage2DARB (GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); +GLAPI void APIENTRY glCompressedTexImage1DARB (GLenum, GLint, GLenum, GLsizei, GLint, GLsizei, const GLvoid *); +GLAPI void APIENTRY glCompressedTexSubImage3DARB (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glCompressedTexSubImage2DARB (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glCompressedTexSubImage1DARB (GLenum, GLint, GLint, GLsizei, GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glGetCompressedTexImageARB (GLenum, GLint, GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint level, GLvoid *img); +#endif + +#ifndef GL_ARB_texture_border_clamp +#define GL_ARB_texture_border_clamp 1 +#endif + +#ifndef GL_ARB_point_parameters +#define GL_ARB_point_parameters 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPointParameterfARB (GLenum, GLfloat); +GLAPI void APIENTRY glPointParameterfvARB (GLenum, const GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPOINTPARAMETERFARBPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFVARBPROC) (GLenum pname, const GLfloat *params); +#endif + +#ifndef GL_ARB_vertex_blend +#define GL_ARB_vertex_blend 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glWeightbvARB (GLint, const GLbyte *); +GLAPI void APIENTRY glWeightsvARB (GLint, const GLshort *); +GLAPI void APIENTRY glWeightivARB (GLint, const GLint *); +GLAPI void APIENTRY glWeightfvARB (GLint, const GLfloat *); +GLAPI void APIENTRY glWeightdvARB (GLint, const GLdouble *); +GLAPI void APIENTRY glWeightubvARB (GLint, const GLubyte *); +GLAPI void APIENTRY glWeightusvARB (GLint, const GLushort *); +GLAPI void APIENTRY glWeightuivARB (GLint, const GLuint *); +GLAPI void APIENTRY glWeightPointerARB (GLint, GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glVertexBlendARB (GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLWEIGHTBVARBPROC) (GLint size, const GLbyte *weights); +typedef void (APIENTRYP PFNGLWEIGHTSVARBPROC) (GLint size, const GLshort *weights); +typedef void (APIENTRYP PFNGLWEIGHTIVARBPROC) (GLint size, const GLint *weights); +typedef void (APIENTRYP PFNGLWEIGHTFVARBPROC) (GLint size, const GLfloat *weights); +typedef void (APIENTRYP PFNGLWEIGHTDVARBPROC) (GLint size, const GLdouble *weights); +typedef void (APIENTRYP PFNGLWEIGHTUBVARBPROC) (GLint size, const GLubyte *weights); +typedef void (APIENTRYP PFNGLWEIGHTUSVARBPROC) (GLint size, const GLushort *weights); +typedef void (APIENTRYP PFNGLWEIGHTUIVARBPROC) (GLint size, const GLuint *weights); +typedef void (APIENTRYP PFNGLWEIGHTPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLVERTEXBLENDARBPROC) (GLint count); +#endif + +#ifndef GL_ARB_matrix_palette +#define GL_ARB_matrix_palette 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCurrentPaletteMatrixARB (GLint); +GLAPI void APIENTRY glMatrixIndexubvARB (GLint, const GLubyte *); +GLAPI void APIENTRY glMatrixIndexusvARB (GLint, const GLushort *); +GLAPI void APIENTRY glMatrixIndexuivARB (GLint, const GLuint *); +GLAPI void APIENTRY glMatrixIndexPointerARB (GLint, GLenum, GLsizei, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCURRENTPALETTEMATRIXARBPROC) (GLint index); +typedef void (APIENTRYP PFNGLMATRIXINDEXUBVARBPROC) (GLint size, const GLubyte *indices); +typedef void (APIENTRYP PFNGLMATRIXINDEXUSVARBPROC) (GLint size, const GLushort *indices); +typedef void (APIENTRYP PFNGLMATRIXINDEXUIVARBPROC) (GLint size, const GLuint *indices); +typedef void (APIENTRYP PFNGLMATRIXINDEXPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +#endif + +#ifndef GL_ARB_texture_env_combine +#define GL_ARB_texture_env_combine 1 +#endif + +#ifndef GL_ARB_texture_env_crossbar +#define GL_ARB_texture_env_crossbar 1 +#endif + +#ifndef GL_ARB_texture_env_dot3 +#define GL_ARB_texture_env_dot3 1 +#endif + +#ifndef GL_ARB_texture_mirrored_repeat +#define GL_ARB_texture_mirrored_repeat 1 +#endif + +#ifndef GL_ARB_depth_texture +#define GL_ARB_depth_texture 1 +#endif + +#ifndef GL_ARB_shadow +#define GL_ARB_shadow 1 +#endif + +#ifndef GL_ARB_shadow_ambient +#define GL_ARB_shadow_ambient 1 +#endif + +#ifndef GL_ARB_window_pos +#define GL_ARB_window_pos 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glWindowPos2dARB (GLdouble, GLdouble); +GLAPI void APIENTRY glWindowPos2dvARB (const GLdouble *); +GLAPI void APIENTRY glWindowPos2fARB (GLfloat, GLfloat); +GLAPI void APIENTRY glWindowPos2fvARB (const GLfloat *); +GLAPI void APIENTRY glWindowPos2iARB (GLint, GLint); +GLAPI void APIENTRY glWindowPos2ivARB (const GLint *); +GLAPI void APIENTRY glWindowPos2sARB (GLshort, GLshort); +GLAPI void APIENTRY glWindowPos2svARB (const GLshort *); +GLAPI void APIENTRY glWindowPos3dARB (GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glWindowPos3dvARB (const GLdouble *); +GLAPI void APIENTRY glWindowPos3fARB (GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glWindowPos3fvARB (const GLfloat *); +GLAPI void APIENTRY glWindowPos3iARB (GLint, GLint, GLint); +GLAPI void APIENTRY glWindowPos3ivARB (const GLint *); +GLAPI void APIENTRY glWindowPos3sARB (GLshort, GLshort, GLshort); +GLAPI void APIENTRY glWindowPos3svARB (const GLshort *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLWINDOWPOS2DARBPROC) (GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLWINDOWPOS2DVARBPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2FARBPROC) (GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLWINDOWPOS2FVARBPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2IARBPROC) (GLint x, GLint y); +typedef void (APIENTRYP PFNGLWINDOWPOS2IVARBPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2SARBPROC) (GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLWINDOWPOS2SVARBPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3DARBPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLWINDOWPOS3DVARBPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3FARBPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLWINDOWPOS3FVARBPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3IARBPROC) (GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLWINDOWPOS3IVARBPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3SARBPROC) (GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLWINDOWPOS3SVARBPROC) (const GLshort *v); +#endif + +#ifndef GL_ARB_vertex_program +#define GL_ARB_vertex_program 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexAttrib1dARB (GLuint, GLdouble); +GLAPI void APIENTRY glVertexAttrib1dvARB (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib1fARB (GLuint, GLfloat); +GLAPI void APIENTRY glVertexAttrib1fvARB (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib1sARB (GLuint, GLshort); +GLAPI void APIENTRY glVertexAttrib1svARB (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib2dARB (GLuint, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexAttrib2dvARB (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib2fARB (GLuint, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexAttrib2fvARB (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib2sARB (GLuint, GLshort, GLshort); +GLAPI void APIENTRY glVertexAttrib2svARB (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib3dARB (GLuint, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexAttrib3dvARB (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib3fARB (GLuint, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexAttrib3fvARB (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib3sARB (GLuint, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glVertexAttrib3svARB (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib4NbvARB (GLuint, const GLbyte *); +GLAPI void APIENTRY glVertexAttrib4NivARB (GLuint, const GLint *); +GLAPI void APIENTRY glVertexAttrib4NsvARB (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib4NubARB (GLuint, GLubyte, GLubyte, GLubyte, GLubyte); +GLAPI void APIENTRY glVertexAttrib4NubvARB (GLuint, const GLubyte *); +GLAPI void APIENTRY glVertexAttrib4NuivARB (GLuint, const GLuint *); +GLAPI void APIENTRY glVertexAttrib4NusvARB (GLuint, const GLushort *); +GLAPI void APIENTRY glVertexAttrib4bvARB (GLuint, const GLbyte *); +GLAPI void APIENTRY glVertexAttrib4dARB (GLuint, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexAttrib4dvARB (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib4fARB (GLuint, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexAttrib4fvARB (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib4ivARB (GLuint, const GLint *); +GLAPI void APIENTRY glVertexAttrib4sARB (GLuint, GLshort, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glVertexAttrib4svARB (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib4ubvARB (GLuint, const GLubyte *); +GLAPI void APIENTRY glVertexAttrib4uivARB (GLuint, const GLuint *); +GLAPI void APIENTRY glVertexAttrib4usvARB (GLuint, const GLushort *); +GLAPI void APIENTRY glVertexAttribPointerARB (GLuint, GLint, GLenum, GLboolean, GLsizei, const GLvoid *); +GLAPI void APIENTRY glEnableVertexAttribArrayARB (GLuint); +GLAPI void APIENTRY glDisableVertexAttribArrayARB (GLuint); +GLAPI void APIENTRY glProgramStringARB (GLenum, GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glBindProgramARB (GLenum, GLuint); +GLAPI void APIENTRY glDeleteProgramsARB (GLsizei, const GLuint *); +GLAPI void APIENTRY glGenProgramsARB (GLsizei, GLuint *); +GLAPI void APIENTRY glProgramEnvParameter4dARB (GLenum, GLuint, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glProgramEnvParameter4dvARB (GLenum, GLuint, const GLdouble *); +GLAPI void APIENTRY glProgramEnvParameter4fARB (GLenum, GLuint, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glProgramEnvParameter4fvARB (GLenum, GLuint, const GLfloat *); +GLAPI void APIENTRY glProgramLocalParameter4dARB (GLenum, GLuint, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glProgramLocalParameter4dvARB (GLenum, GLuint, const GLdouble *); +GLAPI void APIENTRY glProgramLocalParameter4fARB (GLenum, GLuint, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glProgramLocalParameter4fvARB (GLenum, GLuint, const GLfloat *); +GLAPI void APIENTRY glGetProgramEnvParameterdvARB (GLenum, GLuint, GLdouble *); +GLAPI void APIENTRY glGetProgramEnvParameterfvARB (GLenum, GLuint, GLfloat *); +GLAPI void APIENTRY glGetProgramLocalParameterdvARB (GLenum, GLuint, GLdouble *); +GLAPI void APIENTRY glGetProgramLocalParameterfvARB (GLenum, GLuint, GLfloat *); +GLAPI void APIENTRY glGetProgramivARB (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetProgramStringARB (GLenum, GLenum, GLvoid *); +GLAPI void APIENTRY glGetVertexAttribdvARB (GLuint, GLenum, GLdouble *); +GLAPI void APIENTRY glGetVertexAttribfvARB (GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glGetVertexAttribivARB (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetVertexAttribPointervARB (GLuint, GLenum, GLvoid* *); +GLAPI GLboolean APIENTRY glIsProgramARB (GLuint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DARBPROC) (GLuint index, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FARBPROC) (GLuint index, GLfloat x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SARBPROC) (GLuint index, GLshort x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DARBPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FARBPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SARBPROC) (GLuint index, GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NBVARBPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NIVARBPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NSVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBARBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBVARBPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUIVARBPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUSVARBPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4BVARBPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4IVARBPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVARBPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UIVARBPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4USVARBPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERARBPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); +typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); +typedef void (APIENTRYP PFNGLPROGRAMSTRINGARBPROC) (GLenum target, GLenum format, GLsizei len, const GLvoid *string); +typedef void (APIENTRYP PFNGLBINDPROGRAMARBPROC) (GLenum target, GLuint program); +typedef void (APIENTRYP PFNGLDELETEPROGRAMSARBPROC) (GLsizei n, const GLuint *programs); +typedef void (APIENTRYP PFNGLGENPROGRAMSARBPROC) (GLsizei n, GLuint *programs); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params); +typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params); +typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMIVARBPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMSTRINGARBPROC) (GLenum target, GLenum pname, GLvoid *string); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVARBPROC) (GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVARBPROC) (GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVARBPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVARBPROC) (GLuint index, GLenum pname, GLvoid* *pointer); +typedef GLboolean (APIENTRYP PFNGLISPROGRAMARBPROC) (GLuint program); +#endif + +#ifndef GL_ARB_fragment_program +#define GL_ARB_fragment_program 1 +/* All ARB_fragment_program entry points are shared with ARB_vertex_program. */ +#endif + +#ifndef GL_ARB_vertex_buffer_object +#define GL_ARB_vertex_buffer_object 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindBufferARB (GLenum, GLuint); +GLAPI void APIENTRY glDeleteBuffersARB (GLsizei, const GLuint *); +GLAPI void APIENTRY glGenBuffersARB (GLsizei, GLuint *); +GLAPI GLboolean APIENTRY glIsBufferARB (GLuint); +GLAPI void APIENTRY glBufferDataARB (GLenum, GLsizeiptrARB, const GLvoid *, GLenum); +GLAPI void APIENTRY glBufferSubDataARB (GLenum, GLintptrARB, GLsizeiptrARB, const GLvoid *); +GLAPI void APIENTRY glGetBufferSubDataARB (GLenum, GLintptrARB, GLsizeiptrARB, GLvoid *); +GLAPI GLvoid* APIENTRY glMapBufferARB (GLenum, GLenum); +GLAPI GLboolean APIENTRY glUnmapBufferARB (GLenum); +GLAPI void APIENTRY glGetBufferParameterivARB (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetBufferPointervARB (GLenum, GLenum, GLvoid* *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBINDBUFFERARBPROC) (GLenum target, GLuint buffer); +typedef void (APIENTRYP PFNGLDELETEBUFFERSARBPROC) (GLsizei n, const GLuint *buffers); +typedef void (APIENTRYP PFNGLGENBUFFERSARBPROC) (GLsizei n, GLuint *buffers); +typedef GLboolean (APIENTRYP PFNGLISBUFFERARBPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLBUFFERDATAARBPROC) (GLenum target, GLsizeiptrARB size, const GLvoid *data, GLenum usage); +typedef void (APIENTRYP PFNGLBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid *data); +typedef void (APIENTRYP PFNGLGETBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid *data); +typedef GLvoid* (APIENTRYP PFNGLMAPBUFFERARBPROC) (GLenum target, GLenum access); +typedef GLboolean (APIENTRYP PFNGLUNMAPBUFFERARBPROC) (GLenum target); +typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERIVARBPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETBUFFERPOINTERVARBPROC) (GLenum target, GLenum pname, GLvoid* *params); +#endif + +#ifndef GL_ARB_occlusion_query +#define GL_ARB_occlusion_query 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenQueriesARB (GLsizei, GLuint *); +GLAPI void APIENTRY glDeleteQueriesARB (GLsizei, const GLuint *); +GLAPI GLboolean APIENTRY glIsQueryARB (GLuint); +GLAPI void APIENTRY glBeginQueryARB (GLenum, GLuint); +GLAPI void APIENTRY glEndQueryARB (GLenum); +GLAPI void APIENTRY glGetQueryivARB (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetQueryObjectivARB (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetQueryObjectuivARB (GLuint, GLenum, GLuint *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGENQUERIESARBPROC) (GLsizei n, GLuint *ids); +typedef void (APIENTRYP PFNGLDELETEQUERIESARBPROC) (GLsizei n, const GLuint *ids); +typedef GLboolean (APIENTRYP PFNGLISQUERYARBPROC) (GLuint id); +typedef void (APIENTRYP PFNGLBEGINQUERYARBPROC) (GLenum target, GLuint id); +typedef void (APIENTRYP PFNGLENDQUERYARBPROC) (GLenum target); +typedef void (APIENTRYP PFNGLGETQUERYIVARBPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTIVARBPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTUIVARBPROC) (GLuint id, GLenum pname, GLuint *params); +#endif + +#ifndef GL_ARB_shader_objects +#define GL_ARB_shader_objects 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDeleteObjectARB (GLhandleARB); +GLAPI GLhandleARB APIENTRY glGetHandleARB (GLenum); +GLAPI void APIENTRY glDetachObjectARB (GLhandleARB, GLhandleARB); +GLAPI GLhandleARB APIENTRY glCreateShaderObjectARB (GLenum); +GLAPI void APIENTRY glShaderSourceARB (GLhandleARB, GLsizei, const GLcharARB* *, const GLint *); +GLAPI void APIENTRY glCompileShaderARB (GLhandleARB); +GLAPI GLhandleARB APIENTRY glCreateProgramObjectARB (void); +GLAPI void APIENTRY glAttachObjectARB (GLhandleARB, GLhandleARB); +GLAPI void APIENTRY glLinkProgramARB (GLhandleARB); +GLAPI void APIENTRY glUseProgramObjectARB (GLhandleARB); +GLAPI void APIENTRY glValidateProgramARB (GLhandleARB); +GLAPI void APIENTRY glUniform1fARB (GLint, GLfloat); +GLAPI void APIENTRY glUniform2fARB (GLint, GLfloat, GLfloat); +GLAPI void APIENTRY glUniform3fARB (GLint, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glUniform4fARB (GLint, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glUniform1iARB (GLint, GLint); +GLAPI void APIENTRY glUniform2iARB (GLint, GLint, GLint); +GLAPI void APIENTRY glUniform3iARB (GLint, GLint, GLint, GLint); +GLAPI void APIENTRY glUniform4iARB (GLint, GLint, GLint, GLint, GLint); +GLAPI void APIENTRY glUniform1fvARB (GLint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glUniform2fvARB (GLint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glUniform3fvARB (GLint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glUniform4fvARB (GLint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glUniform1ivARB (GLint, GLsizei, const GLint *); +GLAPI void APIENTRY glUniform2ivARB (GLint, GLsizei, const GLint *); +GLAPI void APIENTRY glUniform3ivARB (GLint, GLsizei, const GLint *); +GLAPI void APIENTRY glUniform4ivARB (GLint, GLsizei, const GLint *); +GLAPI void APIENTRY glUniformMatrix2fvARB (GLint, GLsizei, GLboolean, const GLfloat *); +GLAPI void APIENTRY glUniformMatrix3fvARB (GLint, GLsizei, GLboolean, const GLfloat *); +GLAPI void APIENTRY glUniformMatrix4fvARB (GLint, GLsizei, GLboolean, const GLfloat *); +GLAPI void APIENTRY glGetObjectParameterfvARB (GLhandleARB, GLenum, GLfloat *); +GLAPI void APIENTRY glGetObjectParameterivARB (GLhandleARB, GLenum, GLint *); +GLAPI void APIENTRY glGetInfoLogARB (GLhandleARB, GLsizei, GLsizei *, GLcharARB *); +GLAPI void APIENTRY glGetAttachedObjectsARB (GLhandleARB, GLsizei, GLsizei *, GLhandleARB *); +GLAPI GLint APIENTRY glGetUniformLocationARB (GLhandleARB, const GLcharARB *); +GLAPI void APIENTRY glGetActiveUniformARB (GLhandleARB, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLcharARB *); +GLAPI void APIENTRY glGetUniformfvARB (GLhandleARB, GLint, GLfloat *); +GLAPI void APIENTRY glGetUniformivARB (GLhandleARB, GLint, GLint *); +GLAPI void APIENTRY glGetShaderSourceARB (GLhandleARB, GLsizei, GLsizei *, GLcharARB *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDELETEOBJECTARBPROC) (GLhandleARB obj); +typedef GLhandleARB (APIENTRYP PFNGLGETHANDLEARBPROC) (GLenum pname); +typedef void (APIENTRYP PFNGLDETACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB attachedObj); +typedef GLhandleARB (APIENTRYP PFNGLCREATESHADEROBJECTARBPROC) (GLenum shaderType); +typedef void (APIENTRYP PFNGLSHADERSOURCEARBPROC) (GLhandleARB shaderObj, GLsizei count, const GLcharARB* *string, const GLint *length); +typedef void (APIENTRYP PFNGLCOMPILESHADERARBPROC) (GLhandleARB shaderObj); +typedef GLhandleARB (APIENTRYP PFNGLCREATEPROGRAMOBJECTARBPROC) (void); +typedef void (APIENTRYP PFNGLATTACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB obj); +typedef void (APIENTRYP PFNGLLINKPROGRAMARBPROC) (GLhandleARB programObj); +typedef void (APIENTRYP PFNGLUSEPROGRAMOBJECTARBPROC) (GLhandleARB programObj); +typedef void (APIENTRYP PFNGLVALIDATEPROGRAMARBPROC) (GLhandleARB programObj); +typedef void (APIENTRYP PFNGLUNIFORM1FARBPROC) (GLint location, GLfloat v0); +typedef void (APIENTRYP PFNGLUNIFORM2FARBPROC) (GLint location, GLfloat v0, GLfloat v1); +typedef void (APIENTRYP PFNGLUNIFORM3FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (APIENTRYP PFNGLUNIFORM4FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (APIENTRYP PFNGLUNIFORM1IARBPROC) (GLint location, GLint v0); +typedef void (APIENTRYP PFNGLUNIFORM2IARBPROC) (GLint location, GLint v0, GLint v1); +typedef void (APIENTRYP PFNGLUNIFORM3IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2); +typedef void (APIENTRYP PFNGLUNIFORM4IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (APIENTRYP PFNGLUNIFORM1FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM2FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM3FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM4FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM1IVARBPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM2IVARBPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM3IVARBPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM4IVARBPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLGETOBJECTPARAMETERFVARBPROC) (GLhandleARB obj, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETOBJECTPARAMETERIVARBPROC) (GLhandleARB obj, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETINFOLOGARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog); +typedef void (APIENTRYP PFNGLGETATTACHEDOBJECTSARBPROC) (GLhandleARB containerObj, GLsizei maxCount, GLsizei *count, GLhandleARB *obj); +typedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB *name); +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); +typedef void (APIENTRYP PFNGLGETUNIFORMFVARBPROC) (GLhandleARB programObj, GLint location, GLfloat *params); +typedef void (APIENTRYP PFNGLGETUNIFORMIVARBPROC) (GLhandleARB programObj, GLint location, GLint *params); +typedef void (APIENTRYP PFNGLGETSHADERSOURCEARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *source); +#endif + +#ifndef GL_ARB_vertex_shader +#define GL_ARB_vertex_shader 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindAttribLocationARB (GLhandleARB, GLuint, const GLcharARB *); +GLAPI void APIENTRY glGetActiveAttribARB (GLhandleARB, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLcharARB *); +GLAPI GLint APIENTRY glGetAttribLocationARB (GLhandleARB, const GLcharARB *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBINDATTRIBLOCATIONARBPROC) (GLhandleARB programObj, GLuint index, const GLcharARB *name); +typedef void (APIENTRYP PFNGLGETACTIVEATTRIBARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); +typedef GLint (APIENTRYP PFNGLGETATTRIBLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB *name); +#endif + +#ifndef GL_ARB_fragment_shader +#define GL_ARB_fragment_shader 1 +#endif + +#ifndef GL_ARB_shading_language_100 +#define GL_ARB_shading_language_100 1 +#endif + +#ifndef GL_ARB_texture_non_power_of_two +#define GL_ARB_texture_non_power_of_two 1 +#endif + +#ifndef GL_ARB_point_sprite +#define GL_ARB_point_sprite 1 +#endif + +#ifndef GL_ARB_fragment_program_shadow +#define GL_ARB_fragment_program_shadow 1 +#endif + +#ifndef GL_ARB_draw_buffers +#define GL_ARB_draw_buffers 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawBuffersARB (GLsizei, const GLenum *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDRAWBUFFERSARBPROC) (GLsizei n, const GLenum *bufs); +#endif + +#ifndef GL_ARB_texture_rectangle +#define GL_ARB_texture_rectangle 1 +#endif + +#ifndef GL_ARB_color_buffer_float +#define GL_ARB_color_buffer_float 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glClampColorARB (GLenum, GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCLAMPCOLORARBPROC) (GLenum target, GLenum clamp); +#endif + +#ifndef GL_ARB_half_float_pixel +#define GL_ARB_half_float_pixel 1 +#endif + +#ifndef GL_ARB_texture_float +#define GL_ARB_texture_float 1 +#endif + +#ifndef GL_ARB_pixel_buffer_object +#define GL_ARB_pixel_buffer_object 1 +#endif + +#ifndef GL_EXT_abgr +#define GL_EXT_abgr 1 +#endif + +#ifndef GL_EXT_blend_color +#define GL_EXT_blend_color 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendColorEXT (GLclampf, GLclampf, GLclampf, GLclampf); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBLENDCOLOREXTPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); +#endif + +#ifndef GL_EXT_polygon_offset +#define GL_EXT_polygon_offset 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPolygonOffsetEXT (GLfloat, GLfloat); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPOLYGONOFFSETEXTPROC) (GLfloat factor, GLfloat bias); +#endif + +#ifndef GL_EXT_texture +#define GL_EXT_texture 1 +#endif + +#ifndef GL_EXT_texture3D +#define GL_EXT_texture3D 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexImage3DEXT (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glTexSubImage3DEXT (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTEXIMAGE3DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (APIENTRYP PFNGLTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); +#endif + +#ifndef GL_SGIS_texture_filter4 +#define GL_SGIS_texture_filter4 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetTexFilterFuncSGIS (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glTexFilterFuncSGIS (GLenum, GLenum, GLsizei, const GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGETTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLfloat *weights); +typedef void (APIENTRYP PFNGLTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLsizei n, const GLfloat *weights); +#endif + +#ifndef GL_EXT_subtexture +#define GL_EXT_subtexture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexSubImage1DEXT (GLenum, GLint, GLint, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glTexSubImage2DEXT (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (APIENTRYP PFNGLTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); +#endif + +#ifndef GL_EXT_copy_texture +#define GL_EXT_copy_texture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCopyTexImage1DEXT (GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLint); +GLAPI void APIENTRY glCopyTexImage2DEXT (GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLsizei, GLint); +GLAPI void APIENTRY glCopyTexSubImage1DEXT (GLenum, GLint, GLint, GLint, GLint, GLsizei); +GLAPI void APIENTRY glCopyTexSubImage2DEXT (GLenum, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); +GLAPI void APIENTRY glCopyTexSubImage3DEXT (GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOPYTEXIMAGE1DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +typedef void (APIENTRYP PFNGLCOPYTEXIMAGE2DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +#endif + +#ifndef GL_EXT_histogram +#define GL_EXT_histogram 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetHistogramEXT (GLenum, GLboolean, GLenum, GLenum, GLvoid *); +GLAPI void APIENTRY glGetHistogramParameterfvEXT (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetHistogramParameterivEXT (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetMinmaxEXT (GLenum, GLboolean, GLenum, GLenum, GLvoid *); +GLAPI void APIENTRY glGetMinmaxParameterfvEXT (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetMinmaxParameterivEXT (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glHistogramEXT (GLenum, GLsizei, GLenum, GLboolean); +GLAPI void APIENTRY glMinmaxEXT (GLenum, GLenum, GLboolean); +GLAPI void APIENTRY glResetHistogramEXT (GLenum); +GLAPI void APIENTRY glResetMinmaxEXT (GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGETHISTOGRAMEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMINMAXEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); +typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLHISTOGRAMEXTPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +typedef void (APIENTRYP PFNGLMINMAXEXTPROC) (GLenum target, GLenum internalformat, GLboolean sink); +typedef void (APIENTRYP PFNGLRESETHISTOGRAMEXTPROC) (GLenum target); +typedef void (APIENTRYP PFNGLRESETMINMAXEXTPROC) (GLenum target); +#endif + +#ifndef GL_EXT_convolution +#define GL_EXT_convolution 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glConvolutionFilter1DEXT (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glConvolutionFilter2DEXT (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glConvolutionParameterfEXT (GLenum, GLenum, GLfloat); +GLAPI void APIENTRY glConvolutionParameterfvEXT (GLenum, GLenum, const GLfloat *); +GLAPI void APIENTRY glConvolutionParameteriEXT (GLenum, GLenum, GLint); +GLAPI void APIENTRY glConvolutionParameterivEXT (GLenum, GLenum, const GLint *); +GLAPI void APIENTRY glCopyConvolutionFilter1DEXT (GLenum, GLenum, GLint, GLint, GLsizei); +GLAPI void APIENTRY glCopyConvolutionFilter2DEXT (GLenum, GLenum, GLint, GLint, GLsizei, GLsizei); +GLAPI void APIENTRY glGetConvolutionFilterEXT (GLenum, GLenum, GLenum, GLvoid *); +GLAPI void APIENTRY glGetConvolutionParameterfvEXT (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetConvolutionParameterivEXT (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetSeparableFilterEXT (GLenum, GLenum, GLenum, GLvoid *, GLvoid *, GLvoid *); +GLAPI void APIENTRY glSeparableFilter2DEXT (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); +typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *image); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETSEPARABLEFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); +typedef void (APIENTRYP PFNGLSEPARABLEFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column); +#endif + +#ifndef GL_EXT_color_matrix +#define GL_EXT_color_matrix 1 +#endif + +#ifndef GL_SGI_color_table +#define GL_SGI_color_table 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorTableSGI (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glColorTableParameterfvSGI (GLenum, GLenum, const GLfloat *); +GLAPI void APIENTRY glColorTableParameterivSGI (GLenum, GLenum, const GLint *); +GLAPI void APIENTRY glCopyColorTableSGI (GLenum, GLenum, GLint, GLint, GLsizei); +GLAPI void APIENTRY glGetColorTableSGI (GLenum, GLenum, GLenum, GLvoid *); +GLAPI void APIENTRY glGetColorTableParameterfvSGI (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetColorTableParameterivSGI (GLenum, GLenum, GLint *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); +typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOPYCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLGETCOLORTABLESGIPROC) (GLenum target, GLenum format, GLenum type, GLvoid *table); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, GLint *params); +#endif + +#ifndef GL_SGIX_pixel_texture +#define GL_SGIX_pixel_texture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPixelTexGenSGIX (GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPIXELTEXGENSGIXPROC) (GLenum mode); +#endif + +#ifndef GL_SGIS_pixel_texture +#define GL_SGIS_pixel_texture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPixelTexGenParameteriSGIS (GLenum, GLint); +GLAPI void APIENTRY glPixelTexGenParameterivSGIS (GLenum, const GLint *); +GLAPI void APIENTRY glPixelTexGenParameterfSGIS (GLenum, GLfloat); +GLAPI void APIENTRY glPixelTexGenParameterfvSGIS (GLenum, const GLfloat *); +GLAPI void APIENTRY glGetPixelTexGenParameterivSGIS (GLenum, GLint *); +GLAPI void APIENTRY glGetPixelTexGenParameterfvSGIS (GLenum, GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERISGISPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERFSGISPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, GLfloat *params); +#endif + +#ifndef GL_SGIS_texture4D +#define GL_SGIS_texture4D 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexImage4DSGIS (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glTexSubImage4DSGIS (GLenum, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTEXIMAGE4DSGISPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (APIENTRYP PFNGLTEXSUBIMAGE4DSGISPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLenum format, GLenum type, const GLvoid *pixels); +#endif + +#ifndef GL_SGI_texture_color_table +#define GL_SGI_texture_color_table 1 +#endif + +#ifndef GL_EXT_cmyka +#define GL_EXT_cmyka 1 +#endif + +#ifndef GL_EXT_texture_object +#define GL_EXT_texture_object 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLboolean APIENTRY glAreTexturesResidentEXT (GLsizei, const GLuint *, GLboolean *); +GLAPI void APIENTRY glBindTextureEXT (GLenum, GLuint); +GLAPI void APIENTRY glDeleteTexturesEXT (GLsizei, const GLuint *); +GLAPI void APIENTRY glGenTexturesEXT (GLsizei, GLuint *); +GLAPI GLboolean APIENTRY glIsTextureEXT (GLuint); +GLAPI void APIENTRY glPrioritizeTexturesEXT (GLsizei, const GLuint *, const GLclampf *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLboolean (APIENTRYP PFNGLARETEXTURESRESIDENTEXTPROC) (GLsizei n, const GLuint *textures, GLboolean *residences); +typedef void (APIENTRYP PFNGLBINDTEXTUREEXTPROC) (GLenum target, GLuint texture); +typedef void (APIENTRYP PFNGLDELETETEXTURESEXTPROC) (GLsizei n, const GLuint *textures); +typedef void (APIENTRYP PFNGLGENTEXTURESEXTPROC) (GLsizei n, GLuint *textures); +typedef GLboolean (APIENTRYP PFNGLISTEXTUREEXTPROC) (GLuint texture); +typedef void (APIENTRYP PFNGLPRIORITIZETEXTURESEXTPROC) (GLsizei n, const GLuint *textures, const GLclampf *priorities); +#endif + +#ifndef GL_SGIS_detail_texture +#define GL_SGIS_detail_texture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDetailTexFuncSGIS (GLenum, GLsizei, const GLfloat *); +GLAPI void APIENTRY glGetDetailTexFuncSGIS (GLenum, GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDETAILTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points); +typedef void (APIENTRYP PFNGLGETDETAILTEXFUNCSGISPROC) (GLenum target, GLfloat *points); +#endif + +#ifndef GL_SGIS_sharpen_texture +#define GL_SGIS_sharpen_texture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSharpenTexFuncSGIS (GLenum, GLsizei, const GLfloat *); +GLAPI void APIENTRY glGetSharpenTexFuncSGIS (GLenum, GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLSHARPENTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points); +typedef void (APIENTRYP PFNGLGETSHARPENTEXFUNCSGISPROC) (GLenum target, GLfloat *points); +#endif + +#ifndef GL_EXT_packed_pixels +#define GL_EXT_packed_pixels 1 +#endif + +#ifndef GL_SGIS_texture_lod +#define GL_SGIS_texture_lod 1 +#endif + +#ifndef GL_SGIS_multisample +#define GL_SGIS_multisample 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSampleMaskSGIS (GLclampf, GLboolean); +GLAPI void APIENTRY glSamplePatternSGIS (GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLSAMPLEMASKSGISPROC) (GLclampf value, GLboolean invert); +typedef void (APIENTRYP PFNGLSAMPLEPATTERNSGISPROC) (GLenum pattern); +#endif + +#ifndef GL_EXT_rescale_normal +#define GL_EXT_rescale_normal 1 +#endif + +#ifndef GL_EXT_vertex_array +#define GL_EXT_vertex_array 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glArrayElementEXT (GLint); +GLAPI void APIENTRY glColorPointerEXT (GLint, GLenum, GLsizei, GLsizei, const GLvoid *); +GLAPI void APIENTRY glDrawArraysEXT (GLenum, GLint, GLsizei); +GLAPI void APIENTRY glEdgeFlagPointerEXT (GLsizei, GLsizei, const GLboolean *); +GLAPI void APIENTRY glGetPointervEXT (GLenum, GLvoid* *); +GLAPI void APIENTRY glIndexPointerEXT (GLenum, GLsizei, GLsizei, const GLvoid *); +GLAPI void APIENTRY glNormalPointerEXT (GLenum, GLsizei, GLsizei, const GLvoid *); +GLAPI void APIENTRY glTexCoordPointerEXT (GLint, GLenum, GLsizei, GLsizei, const GLvoid *); +GLAPI void APIENTRY glVertexPointerEXT (GLint, GLenum, GLsizei, GLsizei, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLARRAYELEMENTEXTPROC) (GLint i); +typedef void (APIENTRYP PFNGLCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLDRAWARRAYSEXTPROC) (GLenum mode, GLint first, GLsizei count); +typedef void (APIENTRYP PFNGLEDGEFLAGPOINTEREXTPROC) (GLsizei stride, GLsizei count, const GLboolean *pointer); +typedef void (APIENTRYP PFNGLGETPOINTERVEXTPROC) (GLenum pname, GLvoid* *params); +typedef void (APIENTRYP PFNGLINDEXPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLNORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLTEXCOORDPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLVERTEXPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); +#endif + +#ifndef GL_EXT_misc_attribute +#define GL_EXT_misc_attribute 1 +#endif + +#ifndef GL_SGIS_generate_mipmap +#define GL_SGIS_generate_mipmap 1 +#endif + +#ifndef GL_SGIX_clipmap +#define GL_SGIX_clipmap 1 +#endif + +#ifndef GL_SGIX_shadow +#define GL_SGIX_shadow 1 +#endif + +#ifndef GL_SGIS_texture_edge_clamp +#define GL_SGIS_texture_edge_clamp 1 +#endif + +#ifndef GL_SGIS_texture_border_clamp +#define GL_SGIS_texture_border_clamp 1 +#endif + +#ifndef GL_EXT_blend_minmax +#define GL_EXT_blend_minmax 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendEquationEXT (GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBLENDEQUATIONEXTPROC) (GLenum mode); +#endif + +#ifndef GL_EXT_blend_subtract +#define GL_EXT_blend_subtract 1 +#endif + +#ifndef GL_EXT_blend_logic_op +#define GL_EXT_blend_logic_op 1 +#endif + +#ifndef GL_SGIX_interlace +#define GL_SGIX_interlace 1 +#endif + +#ifndef GL_SGIX_pixel_tiles +#define GL_SGIX_pixel_tiles 1 +#endif + +#ifndef GL_SGIX_texture_select +#define GL_SGIX_texture_select 1 +#endif + +#ifndef GL_SGIX_sprite +#define GL_SGIX_sprite 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSpriteParameterfSGIX (GLenum, GLfloat); +GLAPI void APIENTRY glSpriteParameterfvSGIX (GLenum, const GLfloat *); +GLAPI void APIENTRY glSpriteParameteriSGIX (GLenum, GLint); +GLAPI void APIENTRY glSpriteParameterivSGIX (GLenum, const GLint *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLSPRITEPARAMETERFSGIXPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLSPRITEPARAMETERFVSGIXPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLSPRITEPARAMETERISGIXPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLSPRITEPARAMETERIVSGIXPROC) (GLenum pname, const GLint *params); +#endif + +#ifndef GL_SGIX_texture_multi_buffer +#define GL_SGIX_texture_multi_buffer 1 +#endif + +#ifndef GL_EXT_point_parameters +#define GL_EXT_point_parameters 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPointParameterfEXT (GLenum, GLfloat); +GLAPI void APIENTRY glPointParameterfvEXT (GLenum, const GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPOINTPARAMETERFEXTPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, const GLfloat *params); +#endif + +#ifndef GL_SGIS_point_parameters +#define GL_SGIS_point_parameters 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPointParameterfSGIS (GLenum, GLfloat); +GLAPI void APIENTRY glPointParameterfvSGIS (GLenum, const GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPOINTPARAMETERFSGISPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFVSGISPROC) (GLenum pname, const GLfloat *params); +#endif + +#ifndef GL_SGIX_instruments +#define GL_SGIX_instruments 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLint APIENTRY glGetInstrumentsSGIX (void); +GLAPI void APIENTRY glInstrumentsBufferSGIX (GLsizei, GLint *); +GLAPI GLint APIENTRY glPollInstrumentsSGIX (GLint *); +GLAPI void APIENTRY glReadInstrumentsSGIX (GLint); +GLAPI void APIENTRY glStartInstrumentsSGIX (void); +GLAPI void APIENTRY glStopInstrumentsSGIX (GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLint (APIENTRYP PFNGLGETINSTRUMENTSSGIXPROC) (void); +typedef void (APIENTRYP PFNGLINSTRUMENTSBUFFERSGIXPROC) (GLsizei size, GLint *buffer); +typedef GLint (APIENTRYP PFNGLPOLLINSTRUMENTSSGIXPROC) (GLint *marker_p); +typedef void (APIENTRYP PFNGLREADINSTRUMENTSSGIXPROC) (GLint marker); +typedef void (APIENTRYP PFNGLSTARTINSTRUMENTSSGIXPROC) (void); +typedef void (APIENTRYP PFNGLSTOPINSTRUMENTSSGIXPROC) (GLint marker); +#endif + +#ifndef GL_SGIX_texture_scale_bias +#define GL_SGIX_texture_scale_bias 1 +#endif + +#ifndef GL_SGIX_framezoom +#define GL_SGIX_framezoom 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFrameZoomSGIX (GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLFRAMEZOOMSGIXPROC) (GLint factor); +#endif + +#ifndef GL_SGIX_tag_sample_buffer +#define GL_SGIX_tag_sample_buffer 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTagSampleBufferSGIX (void); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTAGSAMPLEBUFFERSGIXPROC) (void); +#endif + +#ifndef GL_SGIX_polynomial_ffd +#define GL_SGIX_polynomial_ffd 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDeformationMap3dSGIX (GLenum, GLdouble, GLdouble, GLint, GLint, GLdouble, GLdouble, GLint, GLint, GLdouble, GLdouble, GLint, GLint, const GLdouble *); +GLAPI void APIENTRY glDeformationMap3fSGIX (GLenum, GLfloat, GLfloat, GLint, GLint, GLfloat, GLfloat, GLint, GLint, GLfloat, GLfloat, GLint, GLint, const GLfloat *); +GLAPI void APIENTRY glDeformSGIX (GLbitfield); +GLAPI void APIENTRY glLoadIdentityDeformationMapSGIX (GLbitfield); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDEFORMATIONMAP3DSGIXPROC) (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, GLdouble w1, GLdouble w2, GLint wstride, GLint worder, const GLdouble *points); +typedef void (APIENTRYP PFNGLDEFORMATIONMAP3FSGIXPROC) (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, GLfloat w1, GLfloat w2, GLint wstride, GLint worder, const GLfloat *points); +typedef void (APIENTRYP PFNGLDEFORMSGIXPROC) (GLbitfield mask); +typedef void (APIENTRYP PFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC) (GLbitfield mask); +#endif + +#ifndef GL_SGIX_reference_plane +#define GL_SGIX_reference_plane 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glReferencePlaneSGIX (const GLdouble *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLREFERENCEPLANESGIXPROC) (const GLdouble *equation); +#endif + +#ifndef GL_SGIX_flush_raster +#define GL_SGIX_flush_raster 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFlushRasterSGIX (void); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLFLUSHRASTERSGIXPROC) (void); +#endif + +#ifndef GL_SGIX_depth_texture +#define GL_SGIX_depth_texture 1 +#endif + +#ifndef GL_SGIS_fog_function +#define GL_SGIS_fog_function 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFogFuncSGIS (GLsizei, const GLfloat *); +GLAPI void APIENTRY glGetFogFuncSGIS (GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLFOGFUNCSGISPROC) (GLsizei n, const GLfloat *points); +typedef void (APIENTRYP PFNGLGETFOGFUNCSGISPROC) (GLfloat *points); +#endif + +#ifndef GL_SGIX_fog_offset +#define GL_SGIX_fog_offset 1 +#endif + +#ifndef GL_HP_image_transform +#define GL_HP_image_transform 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glImageTransformParameteriHP (GLenum, GLenum, GLint); +GLAPI void APIENTRY glImageTransformParameterfHP (GLenum, GLenum, GLfloat); +GLAPI void APIENTRY glImageTransformParameterivHP (GLenum, GLenum, const GLint *); +GLAPI void APIENTRY glImageTransformParameterfvHP (GLenum, GLenum, const GLfloat *); +GLAPI void APIENTRY glGetImageTransformParameterivHP (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetImageTransformParameterfvHP (GLenum, GLenum, GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERIHPPROC) (GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERFHPPROC) (GLenum target, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, GLfloat *params); +#endif + +#ifndef GL_HP_convolution_border_modes +#define GL_HP_convolution_border_modes 1 +#endif + +#ifndef GL_SGIX_texture_add_env +#define GL_SGIX_texture_add_env 1 +#endif + +#ifndef GL_EXT_color_subtable +#define GL_EXT_color_subtable 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorSubTableEXT (GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glCopyColorSubTableEXT (GLenum, GLsizei, GLint, GLint, GLsizei); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOPYCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); +#endif + +#ifndef GL_PGI_vertex_hints +#define GL_PGI_vertex_hints 1 +#endif + +#ifndef GL_PGI_misc_hints +#define GL_PGI_misc_hints 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glHintPGI (GLenum, GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLHINTPGIPROC) (GLenum target, GLint mode); +#endif + +#ifndef GL_EXT_paletted_texture +#define GL_EXT_paletted_texture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorTableEXT (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); +GLAPI void APIENTRY glGetColorTableEXT (GLenum, GLenum, GLenum, GLvoid *); +GLAPI void APIENTRY glGetColorTableParameterivEXT (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetColorTableParameterfvEXT (GLenum, GLenum, GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOLORTABLEEXTPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); +typedef void (APIENTRYP PFNGLGETCOLORTABLEEXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *data); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +#endif + +#ifndef GL_EXT_clip_volume_hint +#define GL_EXT_clip_volume_hint 1 +#endif + +#ifndef GL_SGIX_list_priority +#define GL_SGIX_list_priority 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetListParameterfvSGIX (GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glGetListParameterivSGIX (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glListParameterfSGIX (GLuint, GLenum, GLfloat); +GLAPI void APIENTRY glListParameterfvSGIX (GLuint, GLenum, const GLfloat *); +GLAPI void APIENTRY glListParameteriSGIX (GLuint, GLenum, GLint); +GLAPI void APIENTRY glListParameterivSGIX (GLuint, GLenum, const GLint *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGETLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLLISTPARAMETERFSGIXPROC) (GLuint list, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLLISTPARAMETERISGIXPROC) (GLuint list, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, const GLint *params); +#endif + +#ifndef GL_SGIX_ir_instrument1 +#define GL_SGIX_ir_instrument1 1 +#endif + +#ifndef GL_SGIX_calligraphic_fragment +#define GL_SGIX_calligraphic_fragment 1 +#endif + +#ifndef GL_SGIX_texture_lod_bias +#define GL_SGIX_texture_lod_bias 1 +#endif + +#ifndef GL_SGIX_shadow_ambient +#define GL_SGIX_shadow_ambient 1 +#endif + +#ifndef GL_EXT_index_texture +#define GL_EXT_index_texture 1 +#endif + +#ifndef GL_EXT_index_material +#define GL_EXT_index_material 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glIndexMaterialEXT (GLenum, GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLINDEXMATERIALEXTPROC) (GLenum face, GLenum mode); +#endif + +#ifndef GL_EXT_index_func +#define GL_EXT_index_func 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glIndexFuncEXT (GLenum, GLclampf); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLINDEXFUNCEXTPROC) (GLenum func, GLclampf ref); +#endif + +#ifndef GL_EXT_index_array_formats +#define GL_EXT_index_array_formats 1 +#endif + +#ifndef GL_EXT_compiled_vertex_array +#define GL_EXT_compiled_vertex_array 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glLockArraysEXT (GLint, GLsizei); +GLAPI void APIENTRY glUnlockArraysEXT (void); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLLOCKARRAYSEXTPROC) (GLint first, GLsizei count); +typedef void (APIENTRYP PFNGLUNLOCKARRAYSEXTPROC) (void); +#endif + +#ifndef GL_EXT_cull_vertex +#define GL_EXT_cull_vertex 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCullParameterdvEXT (GLenum, GLdouble *); +GLAPI void APIENTRY glCullParameterfvEXT (GLenum, GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCULLPARAMETERDVEXTPROC) (GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLCULLPARAMETERFVEXTPROC) (GLenum pname, GLfloat *params); +#endif + +#ifndef GL_SGIX_ycrcb +#define GL_SGIX_ycrcb 1 +#endif + +#ifndef GL_SGIX_fragment_lighting +#define GL_SGIX_fragment_lighting 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFragmentColorMaterialSGIX (GLenum, GLenum); +GLAPI void APIENTRY glFragmentLightfSGIX (GLenum, GLenum, GLfloat); +GLAPI void APIENTRY glFragmentLightfvSGIX (GLenum, GLenum, const GLfloat *); +GLAPI void APIENTRY glFragmentLightiSGIX (GLenum, GLenum, GLint); +GLAPI void APIENTRY glFragmentLightivSGIX (GLenum, GLenum, const GLint *); +GLAPI void APIENTRY glFragmentLightModelfSGIX (GLenum, GLfloat); +GLAPI void APIENTRY glFragmentLightModelfvSGIX (GLenum, const GLfloat *); +GLAPI void APIENTRY glFragmentLightModeliSGIX (GLenum, GLint); +GLAPI void APIENTRY glFragmentLightModelivSGIX (GLenum, const GLint *); +GLAPI void APIENTRY glFragmentMaterialfSGIX (GLenum, GLenum, GLfloat); +GLAPI void APIENTRY glFragmentMaterialfvSGIX (GLenum, GLenum, const GLfloat *); +GLAPI void APIENTRY glFragmentMaterialiSGIX (GLenum, GLenum, GLint); +GLAPI void APIENTRY glFragmentMaterialivSGIX (GLenum, GLenum, const GLint *); +GLAPI void APIENTRY glGetFragmentLightfvSGIX (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetFragmentLightivSGIX (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetFragmentMaterialfvSGIX (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetFragmentMaterialivSGIX (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glLightEnviSGIX (GLenum, GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLFRAGMENTCOLORMATERIALSGIXPROC) (GLenum face, GLenum mode); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTFSGIXPROC) (GLenum light, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTISGIXPROC) (GLenum light, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELFSGIXPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELFVSGIXPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELISGIXPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELIVSGIXPROC) (GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLFRAGMENTMATERIALFSGIXPROC) (GLenum face, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLFRAGMENTMATERIALISGIXPROC) (GLenum face, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLGETFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLLIGHTENVISGIXPROC) (GLenum pname, GLint param); +#endif + +#ifndef GL_IBM_rasterpos_clip +#define GL_IBM_rasterpos_clip 1 +#endif + +#ifndef GL_HP_texture_lighting +#define GL_HP_texture_lighting 1 +#endif + +#ifndef GL_EXT_draw_range_elements +#define GL_EXT_draw_range_elements 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawRangeElementsEXT (GLenum, GLuint, GLuint, GLsizei, GLenum, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); +#endif + +#ifndef GL_WIN_phong_shading +#define GL_WIN_phong_shading 1 +#endif + +#ifndef GL_WIN_specular_fog +#define GL_WIN_specular_fog 1 +#endif + +#ifndef GL_EXT_light_texture +#define GL_EXT_light_texture 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glApplyTextureEXT (GLenum); +GLAPI void APIENTRY glTextureLightEXT (GLenum); +GLAPI void APIENTRY glTextureMaterialEXT (GLenum, GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLAPPLYTEXTUREEXTPROC) (GLenum mode); +typedef void (APIENTRYP PFNGLTEXTURELIGHTEXTPROC) (GLenum pname); +typedef void (APIENTRYP PFNGLTEXTUREMATERIALEXTPROC) (GLenum face, GLenum mode); +#endif + +#ifndef GL_SGIX_blend_alpha_minmax +#define GL_SGIX_blend_alpha_minmax 1 +#endif + +#ifndef GL_EXT_bgra +#define GL_EXT_bgra 1 +#endif + +#ifndef GL_SGIX_async +#define GL_SGIX_async 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glAsyncMarkerSGIX (GLuint); +GLAPI GLint APIENTRY glFinishAsyncSGIX (GLuint *); +GLAPI GLint APIENTRY glPollAsyncSGIX (GLuint *); +GLAPI GLuint APIENTRY glGenAsyncMarkersSGIX (GLsizei); +GLAPI void APIENTRY glDeleteAsyncMarkersSGIX (GLuint, GLsizei); +GLAPI GLboolean APIENTRY glIsAsyncMarkerSGIX (GLuint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLASYNCMARKERSGIXPROC) (GLuint marker); +typedef GLint (APIENTRYP PFNGLFINISHASYNCSGIXPROC) (GLuint *markerp); +typedef GLint (APIENTRYP PFNGLPOLLASYNCSGIXPROC) (GLuint *markerp); +typedef GLuint (APIENTRYP PFNGLGENASYNCMARKERSSGIXPROC) (GLsizei range); +typedef void (APIENTRYP PFNGLDELETEASYNCMARKERSSGIXPROC) (GLuint marker, GLsizei range); +typedef GLboolean (APIENTRYP PFNGLISASYNCMARKERSGIXPROC) (GLuint marker); +#endif + +#ifndef GL_SGIX_async_pixel +#define GL_SGIX_async_pixel 1 +#endif + +#ifndef GL_SGIX_async_histogram +#define GL_SGIX_async_histogram 1 +#endif + +#ifndef GL_INTEL_parallel_arrays +#define GL_INTEL_parallel_arrays 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexPointervINTEL (GLint, GLenum, const GLvoid* *); +GLAPI void APIENTRY glNormalPointervINTEL (GLenum, const GLvoid* *); +GLAPI void APIENTRY glColorPointervINTEL (GLint, GLenum, const GLvoid* *); +GLAPI void APIENTRY glTexCoordPointervINTEL (GLint, GLenum, const GLvoid* *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVERTEXPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* *pointer); +typedef void (APIENTRYP PFNGLNORMALPOINTERVINTELPROC) (GLenum type, const GLvoid* *pointer); +typedef void (APIENTRYP PFNGLCOLORPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* *pointer); +typedef void (APIENTRYP PFNGLTEXCOORDPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* *pointer); +#endif + +#ifndef GL_HP_occlusion_test +#define GL_HP_occlusion_test 1 +#endif + +#ifndef GL_EXT_pixel_transform +#define GL_EXT_pixel_transform 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPixelTransformParameteriEXT (GLenum, GLenum, GLint); +GLAPI void APIENTRY glPixelTransformParameterfEXT (GLenum, GLenum, GLfloat); +GLAPI void APIENTRY glPixelTransformParameterivEXT (GLenum, GLenum, const GLint *); +GLAPI void APIENTRY glPixelTransformParameterfvEXT (GLenum, GLenum, const GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat *params); +#endif + +#ifndef GL_EXT_pixel_transform_color_table +#define GL_EXT_pixel_transform_color_table 1 +#endif + +#ifndef GL_EXT_shared_texture_palette +#define GL_EXT_shared_texture_palette 1 +#endif + +#ifndef GL_EXT_separate_specular_color +#define GL_EXT_separate_specular_color 1 +#endif + +#ifndef GL_EXT_secondary_color +#define GL_EXT_secondary_color 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSecondaryColor3bEXT (GLbyte, GLbyte, GLbyte); +GLAPI void APIENTRY glSecondaryColor3bvEXT (const GLbyte *); +GLAPI void APIENTRY glSecondaryColor3dEXT (GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glSecondaryColor3dvEXT (const GLdouble *); +GLAPI void APIENTRY glSecondaryColor3fEXT (GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glSecondaryColor3fvEXT (const GLfloat *); +GLAPI void APIENTRY glSecondaryColor3iEXT (GLint, GLint, GLint); +GLAPI void APIENTRY glSecondaryColor3ivEXT (const GLint *); +GLAPI void APIENTRY glSecondaryColor3sEXT (GLshort, GLshort, GLshort); +GLAPI void APIENTRY glSecondaryColor3svEXT (const GLshort *); +GLAPI void APIENTRY glSecondaryColor3ubEXT (GLubyte, GLubyte, GLubyte); +GLAPI void APIENTRY glSecondaryColor3ubvEXT (const GLubyte *); +GLAPI void APIENTRY glSecondaryColor3uiEXT (GLuint, GLuint, GLuint); +GLAPI void APIENTRY glSecondaryColor3uivEXT (const GLuint *); +GLAPI void APIENTRY glSecondaryColor3usEXT (GLushort, GLushort, GLushort); +GLAPI void APIENTRY glSecondaryColor3usvEXT (const GLushort *); +GLAPI void APIENTRY glSecondaryColorPointerEXT (GLint, GLenum, GLsizei, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BEXTPROC) (GLbyte red, GLbyte green, GLbyte blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BVEXTPROC) (const GLbyte *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DEXTPROC) (GLdouble red, GLdouble green, GLdouble blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DVEXTPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FEXTPROC) (GLfloat red, GLfloat green, GLfloat blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FVEXTPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IEXTPROC) (GLint red, GLint green, GLint blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IVEXTPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SEXTPROC) (GLshort red, GLshort green, GLshort blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SVEXTPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBEXTPROC) (GLubyte red, GLubyte green, GLubyte blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBVEXTPROC) (const GLubyte *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIEXTPROC) (GLuint red, GLuint green, GLuint blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIVEXTPROC) (const GLuint *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USEXTPROC) (GLushort red, GLushort green, GLushort blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USVEXTPROC) (const GLushort *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +#endif + +#ifndef GL_EXT_texture_perturb_normal +#define GL_EXT_texture_perturb_normal 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTextureNormalEXT (GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTEXTURENORMALEXTPROC) (GLenum mode); +#endif + +#ifndef GL_EXT_multi_draw_arrays +#define GL_EXT_multi_draw_arrays 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMultiDrawArraysEXT (GLenum, GLint *, GLsizei *, GLsizei); +GLAPI void APIENTRY glMultiDrawElementsEXT (GLenum, const GLsizei *, GLenum, const GLvoid* *, GLsizei); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, GLint *first, GLsizei *count, GLsizei primcount); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount); +#endif + +#ifndef GL_EXT_fog_coord +#define GL_EXT_fog_coord 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFogCoordfEXT (GLfloat); +GLAPI void APIENTRY glFogCoordfvEXT (const GLfloat *); +GLAPI void APIENTRY glFogCoorddEXT (GLdouble); +GLAPI void APIENTRY glFogCoorddvEXT (const GLdouble *); +GLAPI void APIENTRY glFogCoordPointerEXT (GLenum, GLsizei, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLFOGCOORDFEXTPROC) (GLfloat coord); +typedef void (APIENTRYP PFNGLFOGCOORDFVEXTPROC) (const GLfloat *coord); +typedef void (APIENTRYP PFNGLFOGCOORDDEXTPROC) (GLdouble coord); +typedef void (APIENTRYP PFNGLFOGCOORDDVEXTPROC) (const GLdouble *coord); +typedef void (APIENTRYP PFNGLFOGCOORDPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); +#endif + +#ifndef GL_REND_screen_coordinates +#define GL_REND_screen_coordinates 1 +#endif + +#ifndef GL_EXT_coordinate_frame +#define GL_EXT_coordinate_frame 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTangent3bEXT (GLbyte, GLbyte, GLbyte); +GLAPI void APIENTRY glTangent3bvEXT (const GLbyte *); +GLAPI void APIENTRY glTangent3dEXT (GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glTangent3dvEXT (const GLdouble *); +GLAPI void APIENTRY glTangent3fEXT (GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glTangent3fvEXT (const GLfloat *); +GLAPI void APIENTRY glTangent3iEXT (GLint, GLint, GLint); +GLAPI void APIENTRY glTangent3ivEXT (const GLint *); +GLAPI void APIENTRY glTangent3sEXT (GLshort, GLshort, GLshort); +GLAPI void APIENTRY glTangent3svEXT (const GLshort *); +GLAPI void APIENTRY glBinormal3bEXT (GLbyte, GLbyte, GLbyte); +GLAPI void APIENTRY glBinormal3bvEXT (const GLbyte *); +GLAPI void APIENTRY glBinormal3dEXT (GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glBinormal3dvEXT (const GLdouble *); +GLAPI void APIENTRY glBinormal3fEXT (GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glBinormal3fvEXT (const GLfloat *); +GLAPI void APIENTRY glBinormal3iEXT (GLint, GLint, GLint); +GLAPI void APIENTRY glBinormal3ivEXT (const GLint *); +GLAPI void APIENTRY glBinormal3sEXT (GLshort, GLshort, GLshort); +GLAPI void APIENTRY glBinormal3svEXT (const GLshort *); +GLAPI void APIENTRY glTangentPointerEXT (GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glBinormalPointerEXT (GLenum, GLsizei, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTANGENT3BEXTPROC) (GLbyte tx, GLbyte ty, GLbyte tz); +typedef void (APIENTRYP PFNGLTANGENT3BVEXTPROC) (const GLbyte *v); +typedef void (APIENTRYP PFNGLTANGENT3DEXTPROC) (GLdouble tx, GLdouble ty, GLdouble tz); +typedef void (APIENTRYP PFNGLTANGENT3DVEXTPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLTANGENT3FEXTPROC) (GLfloat tx, GLfloat ty, GLfloat tz); +typedef void (APIENTRYP PFNGLTANGENT3FVEXTPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLTANGENT3IEXTPROC) (GLint tx, GLint ty, GLint tz); +typedef void (APIENTRYP PFNGLTANGENT3IVEXTPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLTANGENT3SEXTPROC) (GLshort tx, GLshort ty, GLshort tz); +typedef void (APIENTRYP PFNGLTANGENT3SVEXTPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLBINORMAL3BEXTPROC) (GLbyte bx, GLbyte by, GLbyte bz); +typedef void (APIENTRYP PFNGLBINORMAL3BVEXTPROC) (const GLbyte *v); +typedef void (APIENTRYP PFNGLBINORMAL3DEXTPROC) (GLdouble bx, GLdouble by, GLdouble bz); +typedef void (APIENTRYP PFNGLBINORMAL3DVEXTPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLBINORMAL3FEXTPROC) (GLfloat bx, GLfloat by, GLfloat bz); +typedef void (APIENTRYP PFNGLBINORMAL3FVEXTPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLBINORMAL3IEXTPROC) (GLint bx, GLint by, GLint bz); +typedef void (APIENTRYP PFNGLBINORMAL3IVEXTPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLBINORMAL3SEXTPROC) (GLshort bx, GLshort by, GLshort bz); +typedef void (APIENTRYP PFNGLBINORMAL3SVEXTPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLTANGENTPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLBINORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); +#endif + +#ifndef GL_EXT_texture_env_combine +#define GL_EXT_texture_env_combine 1 +#endif + +#ifndef GL_APPLE_specular_vector +#define GL_APPLE_specular_vector 1 +#endif + +#ifndef GL_APPLE_transform_hint +#define GL_APPLE_transform_hint 1 +#endif + +#ifndef GL_SGIX_fog_scale +#define GL_SGIX_fog_scale 1 +#endif + +#ifndef GL_SUNX_constant_data +#define GL_SUNX_constant_data 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFinishTextureSUNX (void); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLFINISHTEXTURESUNXPROC) (void); +#endif + +#ifndef GL_SUN_global_alpha +#define GL_SUN_global_alpha 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGlobalAlphaFactorbSUN (GLbyte); +GLAPI void APIENTRY glGlobalAlphaFactorsSUN (GLshort); +GLAPI void APIENTRY glGlobalAlphaFactoriSUN (GLint); +GLAPI void APIENTRY glGlobalAlphaFactorfSUN (GLfloat); +GLAPI void APIENTRY glGlobalAlphaFactordSUN (GLdouble); +GLAPI void APIENTRY glGlobalAlphaFactorubSUN (GLubyte); +GLAPI void APIENTRY glGlobalAlphaFactorusSUN (GLushort); +GLAPI void APIENTRY glGlobalAlphaFactoruiSUN (GLuint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORBSUNPROC) (GLbyte factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORSSUNPROC) (GLshort factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORISUNPROC) (GLint factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORFSUNPROC) (GLfloat factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORDSUNPROC) (GLdouble factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUBSUNPROC) (GLubyte factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUSSUNPROC) (GLushort factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUISUNPROC) (GLuint factor); +#endif + +#ifndef GL_SUN_triangle_list +#define GL_SUN_triangle_list 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glReplacementCodeuiSUN (GLuint); +GLAPI void APIENTRY glReplacementCodeusSUN (GLushort); +GLAPI void APIENTRY glReplacementCodeubSUN (GLubyte); +GLAPI void APIENTRY glReplacementCodeuivSUN (const GLuint *); +GLAPI void APIENTRY glReplacementCodeusvSUN (const GLushort *); +GLAPI void APIENTRY glReplacementCodeubvSUN (const GLubyte *); +GLAPI void APIENTRY glReplacementCodePointerSUN (GLenum, GLsizei, const GLvoid* *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUISUNPROC) (GLuint code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUSSUNPROC) (GLushort code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUBSUNPROC) (GLubyte code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVSUNPROC) (const GLuint *code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUSVSUNPROC) (const GLushort *code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUBVSUNPROC) (const GLubyte *code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEPOINTERSUNPROC) (GLenum type, GLsizei stride, const GLvoid* *pointer); +#endif + +#ifndef GL_SUN_vertex +#define GL_SUN_vertex 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColor4ubVertex2fSUN (GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat); +GLAPI void APIENTRY glColor4ubVertex2fvSUN (const GLubyte *, const GLfloat *); +GLAPI void APIENTRY glColor4ubVertex3fSUN (GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glColor4ubVertex3fvSUN (const GLubyte *, const GLfloat *); +GLAPI void APIENTRY glColor3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glColor3fVertex3fvSUN (const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glColor4fNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glColor4fNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glTexCoord2fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glTexCoord2fVertex3fvSUN (const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glTexCoord4fVertex4fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glTexCoord4fVertex4fvSUN (const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glTexCoord2fColor4ubVertex3fSUN (GLfloat, GLfloat, GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glTexCoord2fColor4ubVertex3fvSUN (const GLfloat *, const GLubyte *, const GLfloat *); +GLAPI void APIENTRY glTexCoord2fColor3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glTexCoord2fColor3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glTexCoord2fNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glTexCoord2fNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glTexCoord2fColor4fNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glTexCoord2fColor4fNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glTexCoord4fColor4fNormal3fVertex4fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glTexCoord4fColor4fNormal3fVertex4fvSUN (const GLfloat *, const GLfloat *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glReplacementCodeuiVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glReplacementCodeuiVertex3fvSUN (const GLuint *, const GLfloat *); +GLAPI void APIENTRY glReplacementCodeuiColor4ubVertex3fSUN (GLuint, GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glReplacementCodeuiColor4ubVertex3fvSUN (const GLuint *, const GLubyte *, const GLfloat *); +GLAPI void APIENTRY glReplacementCodeuiColor3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glReplacementCodeuiColor3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glReplacementCodeuiNormal3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glReplacementCodeuiNormal3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glReplacementCodeuiColor4fNormal3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glReplacementCodeuiColor4fNormal3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *, const GLfloat *); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *, const GLfloat *, const GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX2FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX2FVSUNPROC) (const GLubyte *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX3FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX3FVSUNPROC) (const GLubyte *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLCOLOR3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLCOLOR3FVERTEX3FVSUNPROC) (const GLfloat *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLNORMAL3FVERTEX3FSUNPROC) (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD4FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLTEXCOORD4FVERTEX4FVSUNPROC) (const GLfloat *tc, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC) (const GLfloat *tc, const GLubyte *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC) (GLuint rc, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC) (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC) (const GLuint *rc, const GLubyte *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +#endif + +#ifndef GL_EXT_blend_func_separate +#define GL_EXT_blend_func_separate 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendFuncSeparateEXT (GLenum, GLenum, GLenum, GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEEXTPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +#endif + +#ifndef GL_INGR_blend_func_separate +#define GL_INGR_blend_func_separate 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendFuncSeparateINGR (GLenum, GLenum, GLenum, GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEINGRPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +#endif + +#ifndef GL_INGR_color_clamp +#define GL_INGR_color_clamp 1 +#endif + +#ifndef GL_INGR_interlace_read +#define GL_INGR_interlace_read 1 +#endif + +#ifndef GL_EXT_stencil_wrap +#define GL_EXT_stencil_wrap 1 +#endif + +#ifndef GL_EXT_422_pixels +#define GL_EXT_422_pixels 1 +#endif + +#ifndef GL_NV_texgen_reflection +#define GL_NV_texgen_reflection 1 +#endif + +#ifndef GL_SUN_convolution_border_modes +#define GL_SUN_convolution_border_modes 1 +#endif + +#ifndef GL_EXT_texture_env_add +#define GL_EXT_texture_env_add 1 +#endif + +#ifndef GL_EXT_texture_lod_bias +#define GL_EXT_texture_lod_bias 1 +#endif + +#ifndef GL_EXT_texture_filter_anisotropic +#define GL_EXT_texture_filter_anisotropic 1 +#endif + +#ifndef GL_EXT_vertex_weighting +#define GL_EXT_vertex_weighting 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexWeightfEXT (GLfloat); +GLAPI void APIENTRY glVertexWeightfvEXT (const GLfloat *); +GLAPI void APIENTRY glVertexWeightPointerEXT (GLsizei, GLenum, GLsizei, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVERTEXWEIGHTFEXTPROC) (GLfloat weight); +typedef void (APIENTRYP PFNGLVERTEXWEIGHTFVEXTPROC) (const GLfloat *weight); +typedef void (APIENTRYP PFNGLVERTEXWEIGHTPOINTEREXTPROC) (GLsizei size, GLenum type, GLsizei stride, const GLvoid *pointer); +#endif + +#ifndef GL_NV_light_max_exponent +#define GL_NV_light_max_exponent 1 +#endif + +#ifndef GL_NV_vertex_array_range +#define GL_NV_vertex_array_range 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFlushVertexArrayRangeNV (void); +GLAPI void APIENTRY glVertexArrayRangeNV (GLsizei, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLFLUSHVERTEXARRAYRANGENVPROC) (void); +typedef void (APIENTRYP PFNGLVERTEXARRAYRANGENVPROC) (GLsizei length, const GLvoid *pointer); +#endif + +#ifndef GL_NV_register_combiners +#define GL_NV_register_combiners 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCombinerParameterfvNV (GLenum, const GLfloat *); +GLAPI void APIENTRY glCombinerParameterfNV (GLenum, GLfloat); +GLAPI void APIENTRY glCombinerParameterivNV (GLenum, const GLint *); +GLAPI void APIENTRY glCombinerParameteriNV (GLenum, GLint); +GLAPI void APIENTRY glCombinerInputNV (GLenum, GLenum, GLenum, GLenum, GLenum, GLenum); +GLAPI void APIENTRY glCombinerOutputNV (GLenum, GLenum, GLenum, GLenum, GLenum, GLenum, GLenum, GLboolean, GLboolean, GLboolean); +GLAPI void APIENTRY glFinalCombinerInputNV (GLenum, GLenum, GLenum, GLenum); +GLAPI void APIENTRY glGetCombinerInputParameterfvNV (GLenum, GLenum, GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetCombinerInputParameterivNV (GLenum, GLenum, GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetCombinerOutputParameterfvNV (GLenum, GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetCombinerOutputParameterivNV (GLenum, GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetFinalCombinerInputParameterfvNV (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetFinalCombinerInputParameterivNV (GLenum, GLenum, GLint *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOMBINERPARAMETERFVNVPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCOMBINERPARAMETERFNVPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLCOMBINERPARAMETERIVNVPROC) (GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOMBINERPARAMETERINVPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLCOMBINERINPUTNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +typedef void (APIENTRYP PFNGLCOMBINEROUTPUTNVPROC) (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); +typedef void (APIENTRYP PFNGLFINALCOMBINERINPUTNVPROC) (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +typedef void (APIENTRYP PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC) (GLenum variable, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC) (GLenum variable, GLenum pname, GLint *params); +#endif + +#ifndef GL_NV_fog_distance +#define GL_NV_fog_distance 1 +#endif + +#ifndef GL_NV_texgen_emboss +#define GL_NV_texgen_emboss 1 +#endif + +#ifndef GL_NV_blend_square +#define GL_NV_blend_square 1 +#endif + +#ifndef GL_NV_texture_env_combine4 +#define GL_NV_texture_env_combine4 1 +#endif + +#ifndef GL_MESA_resize_buffers +#define GL_MESA_resize_buffers 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glResizeBuffersMESA (void); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLRESIZEBUFFERSMESAPROC) (void); +#endif + +#ifndef GL_MESA_window_pos +#define GL_MESA_window_pos 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glWindowPos2dMESA (GLdouble, GLdouble); +GLAPI void APIENTRY glWindowPos2dvMESA (const GLdouble *); +GLAPI void APIENTRY glWindowPos2fMESA (GLfloat, GLfloat); +GLAPI void APIENTRY glWindowPos2fvMESA (const GLfloat *); +GLAPI void APIENTRY glWindowPos2iMESA (GLint, GLint); +GLAPI void APIENTRY glWindowPos2ivMESA (const GLint *); +GLAPI void APIENTRY glWindowPos2sMESA (GLshort, GLshort); +GLAPI void APIENTRY glWindowPos2svMESA (const GLshort *); +GLAPI void APIENTRY glWindowPos3dMESA (GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glWindowPos3dvMESA (const GLdouble *); +GLAPI void APIENTRY glWindowPos3fMESA (GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glWindowPos3fvMESA (const GLfloat *); +GLAPI void APIENTRY glWindowPos3iMESA (GLint, GLint, GLint); +GLAPI void APIENTRY glWindowPos3ivMESA (const GLint *); +GLAPI void APIENTRY glWindowPos3sMESA (GLshort, GLshort, GLshort); +GLAPI void APIENTRY glWindowPos3svMESA (const GLshort *); +GLAPI void APIENTRY glWindowPos4dMESA (GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glWindowPos4dvMESA (const GLdouble *); +GLAPI void APIENTRY glWindowPos4fMESA (GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glWindowPos4fvMESA (const GLfloat *); +GLAPI void APIENTRY glWindowPos4iMESA (GLint, GLint, GLint, GLint); +GLAPI void APIENTRY glWindowPos4ivMESA (const GLint *); +GLAPI void APIENTRY glWindowPos4sMESA (GLshort, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glWindowPos4svMESA (const GLshort *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLWINDOWPOS2DMESAPROC) (GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLWINDOWPOS2DVMESAPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2FMESAPROC) (GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLWINDOWPOS2FVMESAPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2IMESAPROC) (GLint x, GLint y); +typedef void (APIENTRYP PFNGLWINDOWPOS2IVMESAPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2SMESAPROC) (GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLWINDOWPOS2SVMESAPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3DMESAPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLWINDOWPOS3DVMESAPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3FMESAPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLWINDOWPOS3FVMESAPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3IMESAPROC) (GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLWINDOWPOS3IVMESAPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3SMESAPROC) (GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLWINDOWPOS3SVMESAPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLWINDOWPOS4DMESAPROC) (GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLWINDOWPOS4DVMESAPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS4FMESAPROC) (GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLWINDOWPOS4FVMESAPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS4IMESAPROC) (GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRYP PFNGLWINDOWPOS4IVMESAPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS4SMESAPROC) (GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLWINDOWPOS4SVMESAPROC) (const GLshort *v); +#endif + +#ifndef GL_IBM_cull_vertex +#define GL_IBM_cull_vertex 1 +#endif + +#ifndef GL_IBM_multimode_draw_arrays +#define GL_IBM_multimode_draw_arrays 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMultiModeDrawArraysIBM (const GLenum *, const GLint *, const GLsizei *, GLsizei, GLint); +GLAPI void APIENTRY glMultiModeDrawElementsIBM (const GLenum *, const GLsizei *, GLenum, const GLvoid* const *, GLsizei, GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLMULTIMODEDRAWARRAYSIBMPROC) (const GLenum *mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride); +typedef void (APIENTRYP PFNGLMULTIMODEDRAWELEMENTSIBMPROC) (const GLenum *mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei primcount, GLint modestride); +#endif + +#ifndef GL_IBM_vertex_array_lists +#define GL_IBM_vertex_array_lists 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); +GLAPI void APIENTRY glSecondaryColorPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); +GLAPI void APIENTRY glEdgeFlagPointerListIBM (GLint, const GLboolean* *, GLint); +GLAPI void APIENTRY glFogCoordPointerListIBM (GLenum, GLint, const GLvoid* *, GLint); +GLAPI void APIENTRY glIndexPointerListIBM (GLenum, GLint, const GLvoid* *, GLint); +GLAPI void APIENTRY glNormalPointerListIBM (GLenum, GLint, const GLvoid* *, GLint); +GLAPI void APIENTRY glTexCoordPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); +GLAPI void APIENTRY glVertexPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLEDGEFLAGPOINTERLISTIBMPROC) (GLint stride, const GLboolean* *pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLFOGCOORDPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLINDEXPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLNORMALPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLTEXCOORDPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLVERTEXPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); +#endif + +#ifndef GL_SGIX_subsample +#define GL_SGIX_subsample 1 +#endif + +#ifndef GL_SGIX_ycrcba +#define GL_SGIX_ycrcba 1 +#endif + +#ifndef GL_SGIX_ycrcb_subsample +#define GL_SGIX_ycrcb_subsample 1 +#endif + +#ifndef GL_SGIX_depth_pass_instrument +#define GL_SGIX_depth_pass_instrument 1 +#endif + +#ifndef GL_3DFX_texture_compression_FXT1 +#define GL_3DFX_texture_compression_FXT1 1 +#endif + +#ifndef GL_3DFX_multisample +#define GL_3DFX_multisample 1 +#endif + +#ifndef GL_3DFX_tbuffer +#define GL_3DFX_tbuffer 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTbufferMask3DFX (GLuint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTBUFFERMASK3DFXPROC) (GLuint mask); +#endif + +#ifndef GL_EXT_multisample +#define GL_EXT_multisample 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSampleMaskEXT (GLclampf, GLboolean); +GLAPI void APIENTRY glSamplePatternEXT (GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLSAMPLEMASKEXTPROC) (GLclampf value, GLboolean invert); +typedef void (APIENTRYP PFNGLSAMPLEPATTERNEXTPROC) (GLenum pattern); +#endif + +#ifndef GL_SGIX_vertex_preclip +#define GL_SGIX_vertex_preclip 1 +#endif + +#ifndef GL_SGIX_convolution_accuracy +#define GL_SGIX_convolution_accuracy 1 +#endif + +#ifndef GL_SGIX_resample +#define GL_SGIX_resample 1 +#endif + +#ifndef GL_SGIS_point_line_texgen +#define GL_SGIS_point_line_texgen 1 +#endif + +#ifndef GL_SGIS_texture_color_mask +#define GL_SGIS_texture_color_mask 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTextureColorMaskSGIS (GLboolean, GLboolean, GLboolean, GLboolean); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTEXTURECOLORMASKSGISPROC) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); +#endif + +#ifndef GL_SGIX_igloo_interface +#define GL_SGIX_igloo_interface 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glIglooInterfaceSGIX (GLenum, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLIGLOOINTERFACESGIXPROC) (GLenum pname, const GLvoid *params); +#endif + +#ifndef GL_EXT_texture_env_dot3 +#define GL_EXT_texture_env_dot3 1 +#endif + +#ifndef GL_ATI_texture_mirror_once +#define GL_ATI_texture_mirror_once 1 +#endif + +#ifndef GL_NV_fence +#define GL_NV_fence 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDeleteFencesNV (GLsizei, const GLuint *); +GLAPI void APIENTRY glGenFencesNV (GLsizei, GLuint *); +GLAPI GLboolean APIENTRY glIsFenceNV (GLuint); +GLAPI GLboolean APIENTRY glTestFenceNV (GLuint); +GLAPI void APIENTRY glGetFenceivNV (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glFinishFenceNV (GLuint); +GLAPI void APIENTRY glSetFenceNV (GLuint, GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint *fences); +typedef void (APIENTRYP PFNGLGENFENCESNVPROC) (GLsizei n, GLuint *fences); +typedef GLboolean (APIENTRYP PFNGLISFENCENVPROC) (GLuint fence); +typedef GLboolean (APIENTRYP PFNGLTESTFENCENVPROC) (GLuint fence); +typedef void (APIENTRYP PFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLFINISHFENCENVPROC) (GLuint fence); +typedef void (APIENTRYP PFNGLSETFENCENVPROC) (GLuint fence, GLenum condition); +#endif + +#ifndef GL_NV_evaluators +#define GL_NV_evaluators 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMapControlPointsNV (GLenum, GLuint, GLenum, GLsizei, GLsizei, GLint, GLint, GLboolean, const GLvoid *); +GLAPI void APIENTRY glMapParameterivNV (GLenum, GLenum, const GLint *); +GLAPI void APIENTRY glMapParameterfvNV (GLenum, GLenum, const GLfloat *); +GLAPI void APIENTRY glGetMapControlPointsNV (GLenum, GLuint, GLenum, GLsizei, GLsizei, GLboolean, GLvoid *); +GLAPI void APIENTRY glGetMapParameterivNV (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGetMapParameterfvNV (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetMapAttribParameterivNV (GLenum, GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetMapAttribParameterfvNV (GLenum, GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glEvalMapsNV (GLenum, GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const GLvoid *points); +typedef void (APIENTRYP PFNGLMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, GLvoid *points); +typedef void (APIENTRYP PFNGLGETMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMAPATTRIBPARAMETERIVNVPROC) (GLenum target, GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMAPATTRIBPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLEVALMAPSNVPROC) (GLenum target, GLenum mode); +#endif + +#ifndef GL_NV_packed_depth_stencil +#define GL_NV_packed_depth_stencil 1 +#endif + +#ifndef GL_NV_register_combiners2 +#define GL_NV_register_combiners2 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCombinerStageParameterfvNV (GLenum, GLenum, const GLfloat *); +GLAPI void APIENTRY glGetCombinerStageParameterfvNV (GLenum, GLenum, GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, GLfloat *params); +#endif + +#ifndef GL_NV_texture_compression_vtc +#define GL_NV_texture_compression_vtc 1 +#endif + +#ifndef GL_NV_texture_rectangle +#define GL_NV_texture_rectangle 1 +#endif + +#ifndef GL_NV_texture_shader +#define GL_NV_texture_shader 1 +#endif + +#ifndef GL_NV_texture_shader2 +#define GL_NV_texture_shader2 1 +#endif + +#ifndef GL_NV_vertex_array_range2 +#define GL_NV_vertex_array_range2 1 +#endif + +#ifndef GL_NV_vertex_program +#define GL_NV_vertex_program 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLboolean APIENTRY glAreProgramsResidentNV (GLsizei, const GLuint *, GLboolean *); +GLAPI void APIENTRY glBindProgramNV (GLenum, GLuint); +GLAPI void APIENTRY glDeleteProgramsNV (GLsizei, const GLuint *); +GLAPI void APIENTRY glExecuteProgramNV (GLenum, GLuint, const GLfloat *); +GLAPI void APIENTRY glGenProgramsNV (GLsizei, GLuint *); +GLAPI void APIENTRY glGetProgramParameterdvNV (GLenum, GLuint, GLenum, GLdouble *); +GLAPI void APIENTRY glGetProgramParameterfvNV (GLenum, GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glGetProgramivNV (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetProgramStringNV (GLuint, GLenum, GLubyte *); +GLAPI void APIENTRY glGetTrackMatrixivNV (GLenum, GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetVertexAttribdvNV (GLuint, GLenum, GLdouble *); +GLAPI void APIENTRY glGetVertexAttribfvNV (GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glGetVertexAttribivNV (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetVertexAttribPointervNV (GLuint, GLenum, GLvoid* *); +GLAPI GLboolean APIENTRY glIsProgramNV (GLuint); +GLAPI void APIENTRY glLoadProgramNV (GLenum, GLuint, GLsizei, const GLubyte *); +GLAPI void APIENTRY glProgramParameter4dNV (GLenum, GLuint, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glProgramParameter4dvNV (GLenum, GLuint, const GLdouble *); +GLAPI void APIENTRY glProgramParameter4fNV (GLenum, GLuint, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glProgramParameter4fvNV (GLenum, GLuint, const GLfloat *); +GLAPI void APIENTRY glProgramParameters4dvNV (GLenum, GLuint, GLuint, const GLdouble *); +GLAPI void APIENTRY glProgramParameters4fvNV (GLenum, GLuint, GLuint, const GLfloat *); +GLAPI void APIENTRY glRequestResidentProgramsNV (GLsizei, const GLuint *); +GLAPI void APIENTRY glTrackMatrixNV (GLenum, GLuint, GLenum, GLenum); +GLAPI void APIENTRY glVertexAttribPointerNV (GLuint, GLint, GLenum, GLsizei, const GLvoid *); +GLAPI void APIENTRY glVertexAttrib1dNV (GLuint, GLdouble); +GLAPI void APIENTRY glVertexAttrib1dvNV (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib1fNV (GLuint, GLfloat); +GLAPI void APIENTRY glVertexAttrib1fvNV (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib1sNV (GLuint, GLshort); +GLAPI void APIENTRY glVertexAttrib1svNV (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib2dNV (GLuint, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexAttrib2dvNV (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib2fNV (GLuint, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexAttrib2fvNV (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib2sNV (GLuint, GLshort, GLshort); +GLAPI void APIENTRY glVertexAttrib2svNV (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib3dNV (GLuint, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexAttrib3dvNV (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib3fNV (GLuint, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexAttrib3fvNV (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib3sNV (GLuint, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glVertexAttrib3svNV (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib4dNV (GLuint, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexAttrib4dvNV (GLuint, const GLdouble *); +GLAPI void APIENTRY glVertexAttrib4fNV (GLuint, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexAttrib4fvNV (GLuint, const GLfloat *); +GLAPI void APIENTRY glVertexAttrib4sNV (GLuint, GLshort, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glVertexAttrib4svNV (GLuint, const GLshort *); +GLAPI void APIENTRY glVertexAttrib4ubNV (GLuint, GLubyte, GLubyte, GLubyte, GLubyte); +GLAPI void APIENTRY glVertexAttrib4ubvNV (GLuint, const GLubyte *); +GLAPI void APIENTRY glVertexAttribs1dvNV (GLuint, GLsizei, const GLdouble *); +GLAPI void APIENTRY glVertexAttribs1fvNV (GLuint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glVertexAttribs1svNV (GLuint, GLsizei, const GLshort *); +GLAPI void APIENTRY glVertexAttribs2dvNV (GLuint, GLsizei, const GLdouble *); +GLAPI void APIENTRY glVertexAttribs2fvNV (GLuint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glVertexAttribs2svNV (GLuint, GLsizei, const GLshort *); +GLAPI void APIENTRY glVertexAttribs3dvNV (GLuint, GLsizei, const GLdouble *); +GLAPI void APIENTRY glVertexAttribs3fvNV (GLuint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glVertexAttribs3svNV (GLuint, GLsizei, const GLshort *); +GLAPI void APIENTRY glVertexAttribs4dvNV (GLuint, GLsizei, const GLdouble *); +GLAPI void APIENTRY glVertexAttribs4fvNV (GLuint, GLsizei, const GLfloat *); +GLAPI void APIENTRY glVertexAttribs4svNV (GLuint, GLsizei, const GLshort *); +GLAPI void APIENTRY glVertexAttribs4ubvNV (GLuint, GLsizei, const GLubyte *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLboolean (APIENTRYP PFNGLAREPROGRAMSRESIDENTNVPROC) (GLsizei n, const GLuint *programs, GLboolean *residences); +typedef void (APIENTRYP PFNGLBINDPROGRAMNVPROC) (GLenum target, GLuint id); +typedef void (APIENTRYP PFNGLDELETEPROGRAMSNVPROC) (GLsizei n, const GLuint *programs); +typedef void (APIENTRYP PFNGLEXECUTEPROGRAMNVPROC) (GLenum target, GLuint id, const GLfloat *params); +typedef void (APIENTRYP PFNGLGENPROGRAMSNVPROC) (GLsizei n, GLuint *programs); +typedef void (APIENTRYP PFNGLGETPROGRAMPARAMETERDVNVPROC) (GLenum target, GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLGETPROGRAMPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMIVNVPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMSTRINGNVPROC) (GLuint id, GLenum pname, GLubyte *program); +typedef void (APIENTRYP PFNGLGETTRACKMATRIXIVNVPROC) (GLenum target, GLuint address, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVNVPROC) (GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVNVPROC) (GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVNVPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVNVPROC) (GLuint index, GLenum pname, GLvoid* *pointer); +typedef GLboolean (APIENTRYP PFNGLISPROGRAMNVPROC) (GLuint id); +typedef void (APIENTRYP PFNGLLOADPROGRAMNVPROC) (GLenum target, GLuint id, GLsizei len, const GLubyte *program); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4DNVPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4DVNVPROC) (GLenum target, GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4FNVPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4FVNVPROC) (GLenum target, GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETERS4DVNVPROC) (GLenum target, GLuint index, GLuint count, const GLdouble *v); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETERS4FVNVPROC) (GLenum target, GLuint index, GLuint count, const GLfloat *v); +typedef void (APIENTRYP PFNGLREQUESTRESIDENTPROGRAMSNVPROC) (GLsizei n, const GLuint *programs); +typedef void (APIENTRYP PFNGLTRACKMATRIXNVPROC) (GLenum target, GLuint address, GLenum matrix, GLenum transform); +typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERNVPROC) (GLuint index, GLint fsize, GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DNVPROC) (GLuint index, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVNVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FNVPROC) (GLuint index, GLfloat x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVNVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SNVPROC) (GLuint index, GLshort x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVNVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DNVPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVNVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FNVPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVNVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SNVPROC) (GLuint index, GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVNVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVNVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVNVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVNVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVNVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVNVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVNVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBNVPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVNVPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS1DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS1FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS1SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS2DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS2FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS2SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS3DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS3FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS3SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4UBVNVPROC) (GLuint index, GLsizei count, const GLubyte *v); +#endif + +#ifndef GL_SGIX_texture_coordinate_clamp +#define GL_SGIX_texture_coordinate_clamp 1 +#endif + +#ifndef GL_SGIX_scalebias_hint +#define GL_SGIX_scalebias_hint 1 +#endif + +#ifndef GL_OML_interlace +#define GL_OML_interlace 1 +#endif + +#ifndef GL_OML_subsample +#define GL_OML_subsample 1 +#endif + +#ifndef GL_OML_resample +#define GL_OML_resample 1 +#endif + +#ifndef GL_NV_copy_depth_to_color +#define GL_NV_copy_depth_to_color 1 +#endif + +#ifndef GL_ATI_envmap_bumpmap +#define GL_ATI_envmap_bumpmap 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexBumpParameterivATI (GLenum, const GLint *); +GLAPI void APIENTRY glTexBumpParameterfvATI (GLenum, const GLfloat *); +GLAPI void APIENTRY glGetTexBumpParameterivATI (GLenum, GLint *); +GLAPI void APIENTRY glGetTexBumpParameterfvATI (GLenum, GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLTEXBUMPPARAMETERIVATIPROC) (GLenum pname, const GLint *param); +typedef void (APIENTRYP PFNGLTEXBUMPPARAMETERFVATIPROC) (GLenum pname, const GLfloat *param); +typedef void (APIENTRYP PFNGLGETTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint *param); +typedef void (APIENTRYP PFNGLGETTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat *param); +#endif + +#ifndef GL_ATI_fragment_shader +#define GL_ATI_fragment_shader 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLuint APIENTRY glGenFragmentShadersATI (GLuint); +GLAPI void APIENTRY glBindFragmentShaderATI (GLuint); +GLAPI void APIENTRY glDeleteFragmentShaderATI (GLuint); +GLAPI void APIENTRY glBeginFragmentShaderATI (void); +GLAPI void APIENTRY glEndFragmentShaderATI (void); +GLAPI void APIENTRY glPassTexCoordATI (GLuint, GLuint, GLenum); +GLAPI void APIENTRY glSampleMapATI (GLuint, GLuint, GLenum); +GLAPI void APIENTRY glColorFragmentOp1ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); +GLAPI void APIENTRY glColorFragmentOp2ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); +GLAPI void APIENTRY glColorFragmentOp3ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); +GLAPI void APIENTRY glAlphaFragmentOp1ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint); +GLAPI void APIENTRY glAlphaFragmentOp2ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); +GLAPI void APIENTRY glAlphaFragmentOp3ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); +GLAPI void APIENTRY glSetFragmentShaderConstantATI (GLuint, const GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLuint (APIENTRYP PFNGLGENFRAGMENTSHADERSATIPROC) (GLuint range); +typedef void (APIENTRYP PFNGLBINDFRAGMENTSHADERATIPROC) (GLuint id); +typedef void (APIENTRYP PFNGLDELETEFRAGMENTSHADERATIPROC) (GLuint id); +typedef void (APIENTRYP PFNGLBEGINFRAGMENTSHADERATIPROC) (void); +typedef void (APIENTRYP PFNGLENDFRAGMENTSHADERATIPROC) (void); +typedef void (APIENTRYP PFNGLPASSTEXCOORDATIPROC) (GLuint dst, GLuint coord, GLenum swizzle); +typedef void (APIENTRYP PFNGLSAMPLEMAPATIPROC) (GLuint dst, GLuint interp, GLenum swizzle); +typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); +typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); +typedef void (APIENTRYP PFNGLSETFRAGMENTSHADERCONSTANTATIPROC) (GLuint dst, const GLfloat *value); +#endif + +#ifndef GL_ATI_pn_triangles +#define GL_ATI_pn_triangles 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPNTrianglesiATI (GLenum, GLint); +GLAPI void APIENTRY glPNTrianglesfATI (GLenum, GLfloat); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPNTRIANGLESIATIPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPNTRIANGLESFATIPROC) (GLenum pname, GLfloat param); +#endif + +#ifndef GL_ATI_vertex_array_object +#define GL_ATI_vertex_array_object 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLuint APIENTRY glNewObjectBufferATI (GLsizei, const GLvoid *, GLenum); +GLAPI GLboolean APIENTRY glIsObjectBufferATI (GLuint); +GLAPI void APIENTRY glUpdateObjectBufferATI (GLuint, GLuint, GLsizei, const GLvoid *, GLenum); +GLAPI void APIENTRY glGetObjectBufferfvATI (GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glGetObjectBufferivATI (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glFreeObjectBufferATI (GLuint); +GLAPI void APIENTRY glArrayObjectATI (GLenum, GLint, GLenum, GLsizei, GLuint, GLuint); +GLAPI void APIENTRY glGetArrayObjectfvATI (GLenum, GLenum, GLfloat *); +GLAPI void APIENTRY glGetArrayObjectivATI (GLenum, GLenum, GLint *); +GLAPI void APIENTRY glVariantArrayObjectATI (GLuint, GLenum, GLsizei, GLuint, GLuint); +GLAPI void APIENTRY glGetVariantArrayObjectfvATI (GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glGetVariantArrayObjectivATI (GLuint, GLenum, GLint *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLuint (APIENTRYP PFNGLNEWOBJECTBUFFERATIPROC) (GLsizei size, const GLvoid *pointer, GLenum usage); +typedef GLboolean (APIENTRYP PFNGLISOBJECTBUFFERATIPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLUPDATEOBJECTBUFFERATIPROC) (GLuint buffer, GLuint offset, GLsizei size, const GLvoid *pointer, GLenum preserve); +typedef void (APIENTRYP PFNGLGETOBJECTBUFFERFVATIPROC) (GLuint buffer, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETOBJECTBUFFERIVATIPROC) (GLuint buffer, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLFREEOBJECTBUFFERATIPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLARRAYOBJECTATIPROC) (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); +typedef void (APIENTRYP PFNGLGETARRAYOBJECTFVATIPROC) (GLenum array, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETARRAYOBJECTIVATIPROC) (GLenum array, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLVARIANTARRAYOBJECTATIPROC) (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); +typedef void (APIENTRYP PFNGLGETVARIANTARRAYOBJECTFVATIPROC) (GLuint id, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVARIANTARRAYOBJECTIVATIPROC) (GLuint id, GLenum pname, GLint *params); +#endif + +#ifndef GL_EXT_vertex_shader +#define GL_EXT_vertex_shader 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBeginVertexShaderEXT (void); +GLAPI void APIENTRY glEndVertexShaderEXT (void); +GLAPI void APIENTRY glBindVertexShaderEXT (GLuint); +GLAPI GLuint APIENTRY glGenVertexShadersEXT (GLuint); +GLAPI void APIENTRY glDeleteVertexShaderEXT (GLuint); +GLAPI void APIENTRY glShaderOp1EXT (GLenum, GLuint, GLuint); +GLAPI void APIENTRY glShaderOp2EXT (GLenum, GLuint, GLuint, GLuint); +GLAPI void APIENTRY glShaderOp3EXT (GLenum, GLuint, GLuint, GLuint, GLuint); +GLAPI void APIENTRY glSwizzleEXT (GLuint, GLuint, GLenum, GLenum, GLenum, GLenum); +GLAPI void APIENTRY glWriteMaskEXT (GLuint, GLuint, GLenum, GLenum, GLenum, GLenum); +GLAPI void APIENTRY glInsertComponentEXT (GLuint, GLuint, GLuint); +GLAPI void APIENTRY glExtractComponentEXT (GLuint, GLuint, GLuint); +GLAPI GLuint APIENTRY glGenSymbolsEXT (GLenum, GLenum, GLenum, GLuint); +GLAPI void APIENTRY glSetInvariantEXT (GLuint, GLenum, const GLvoid *); +GLAPI void APIENTRY glSetLocalConstantEXT (GLuint, GLenum, const GLvoid *); +GLAPI void APIENTRY glVariantbvEXT (GLuint, const GLbyte *); +GLAPI void APIENTRY glVariantsvEXT (GLuint, const GLshort *); +GLAPI void APIENTRY glVariantivEXT (GLuint, const GLint *); +GLAPI void APIENTRY glVariantfvEXT (GLuint, const GLfloat *); +GLAPI void APIENTRY glVariantdvEXT (GLuint, const GLdouble *); +GLAPI void APIENTRY glVariantubvEXT (GLuint, const GLubyte *); +GLAPI void APIENTRY glVariantusvEXT (GLuint, const GLushort *); +GLAPI void APIENTRY glVariantuivEXT (GLuint, const GLuint *); +GLAPI void APIENTRY glVariantPointerEXT (GLuint, GLenum, GLuint, const GLvoid *); +GLAPI void APIENTRY glEnableVariantClientStateEXT (GLuint); +GLAPI void APIENTRY glDisableVariantClientStateEXT (GLuint); +GLAPI GLuint APIENTRY glBindLightParameterEXT (GLenum, GLenum); +GLAPI GLuint APIENTRY glBindMaterialParameterEXT (GLenum, GLenum); +GLAPI GLuint APIENTRY glBindTexGenParameterEXT (GLenum, GLenum, GLenum); +GLAPI GLuint APIENTRY glBindTextureUnitParameterEXT (GLenum, GLenum); +GLAPI GLuint APIENTRY glBindParameterEXT (GLenum); +GLAPI GLboolean APIENTRY glIsVariantEnabledEXT (GLuint, GLenum); +GLAPI void APIENTRY glGetVariantBooleanvEXT (GLuint, GLenum, GLboolean *); +GLAPI void APIENTRY glGetVariantIntegervEXT (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetVariantFloatvEXT (GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glGetVariantPointervEXT (GLuint, GLenum, GLvoid* *); +GLAPI void APIENTRY glGetInvariantBooleanvEXT (GLuint, GLenum, GLboolean *); +GLAPI void APIENTRY glGetInvariantIntegervEXT (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetInvariantFloatvEXT (GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glGetLocalConstantBooleanvEXT (GLuint, GLenum, GLboolean *); +GLAPI void APIENTRY glGetLocalConstantIntegervEXT (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetLocalConstantFloatvEXT (GLuint, GLenum, GLfloat *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBEGINVERTEXSHADEREXTPROC) (void); +typedef void (APIENTRYP PFNGLENDVERTEXSHADEREXTPROC) (void); +typedef void (APIENTRYP PFNGLBINDVERTEXSHADEREXTPROC) (GLuint id); +typedef GLuint (APIENTRYP PFNGLGENVERTEXSHADERSEXTPROC) (GLuint range); +typedef void (APIENTRYP PFNGLDELETEVERTEXSHADEREXTPROC) (GLuint id); +typedef void (APIENTRYP PFNGLSHADEROP1EXTPROC) (GLenum op, GLuint res, GLuint arg1); +typedef void (APIENTRYP PFNGLSHADEROP2EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2); +typedef void (APIENTRYP PFNGLSHADEROP3EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3); +typedef void (APIENTRYP PFNGLSWIZZLEEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); +typedef void (APIENTRYP PFNGLWRITEMASKEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); +typedef void (APIENTRYP PFNGLINSERTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); +typedef void (APIENTRYP PFNGLEXTRACTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); +typedef GLuint (APIENTRYP PFNGLGENSYMBOLSEXTPROC) (GLenum datatype, GLenum storagetype, GLenum range, GLuint components); +typedef void (APIENTRYP PFNGLSETINVARIANTEXTPROC) (GLuint id, GLenum type, const GLvoid *addr); +typedef void (APIENTRYP PFNGLSETLOCALCONSTANTEXTPROC) (GLuint id, GLenum type, const GLvoid *addr); +typedef void (APIENTRYP PFNGLVARIANTBVEXTPROC) (GLuint id, const GLbyte *addr); +typedef void (APIENTRYP PFNGLVARIANTSVEXTPROC) (GLuint id, const GLshort *addr); +typedef void (APIENTRYP PFNGLVARIANTIVEXTPROC) (GLuint id, const GLint *addr); +typedef void (APIENTRYP PFNGLVARIANTFVEXTPROC) (GLuint id, const GLfloat *addr); +typedef void (APIENTRYP PFNGLVARIANTDVEXTPROC) (GLuint id, const GLdouble *addr); +typedef void (APIENTRYP PFNGLVARIANTUBVEXTPROC) (GLuint id, const GLubyte *addr); +typedef void (APIENTRYP PFNGLVARIANTUSVEXTPROC) (GLuint id, const GLushort *addr); +typedef void (APIENTRYP PFNGLVARIANTUIVEXTPROC) (GLuint id, const GLuint *addr); +typedef void (APIENTRYP PFNGLVARIANTPOINTEREXTPROC) (GLuint id, GLenum type, GLuint stride, const GLvoid *addr); +typedef void (APIENTRYP PFNGLENABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); +typedef void (APIENTRYP PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); +typedef GLuint (APIENTRYP PFNGLBINDLIGHTPARAMETEREXTPROC) (GLenum light, GLenum value); +typedef GLuint (APIENTRYP PFNGLBINDMATERIALPARAMETEREXTPROC) (GLenum face, GLenum value); +typedef GLuint (APIENTRYP PFNGLBINDTEXGENPARAMETEREXTPROC) (GLenum unit, GLenum coord, GLenum value); +typedef GLuint (APIENTRYP PFNGLBINDTEXTUREUNITPARAMETEREXTPROC) (GLenum unit, GLenum value); +typedef GLuint (APIENTRYP PFNGLBINDPARAMETEREXTPROC) (GLenum value); +typedef GLboolean (APIENTRYP PFNGLISVARIANTENABLEDEXTPROC) (GLuint id, GLenum cap); +typedef void (APIENTRYP PFNGLGETVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (APIENTRYP PFNGLGETVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (APIENTRYP PFNGLGETVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +typedef void (APIENTRYP PFNGLGETVARIANTPOINTERVEXTPROC) (GLuint id, GLenum value, GLvoid* *data); +typedef void (APIENTRYP PFNGLGETINVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (APIENTRYP PFNGLGETINVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (APIENTRYP PFNGLGETINVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +typedef void (APIENTRYP PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (APIENTRYP PFNGLGETLOCALCONSTANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (APIENTRYP PFNGLGETLOCALCONSTANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +#endif + +#ifndef GL_ATI_vertex_streams +#define GL_ATI_vertex_streams 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexStream1sATI (GLenum, GLshort); +GLAPI void APIENTRY glVertexStream1svATI (GLenum, const GLshort *); +GLAPI void APIENTRY glVertexStream1iATI (GLenum, GLint); +GLAPI void APIENTRY glVertexStream1ivATI (GLenum, const GLint *); +GLAPI void APIENTRY glVertexStream1fATI (GLenum, GLfloat); +GLAPI void APIENTRY glVertexStream1fvATI (GLenum, const GLfloat *); +GLAPI void APIENTRY glVertexStream1dATI (GLenum, GLdouble); +GLAPI void APIENTRY glVertexStream1dvATI (GLenum, const GLdouble *); +GLAPI void APIENTRY glVertexStream2sATI (GLenum, GLshort, GLshort); +GLAPI void APIENTRY glVertexStream2svATI (GLenum, const GLshort *); +GLAPI void APIENTRY glVertexStream2iATI (GLenum, GLint, GLint); +GLAPI void APIENTRY glVertexStream2ivATI (GLenum, const GLint *); +GLAPI void APIENTRY glVertexStream2fATI (GLenum, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexStream2fvATI (GLenum, const GLfloat *); +GLAPI void APIENTRY glVertexStream2dATI (GLenum, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexStream2dvATI (GLenum, const GLdouble *); +GLAPI void APIENTRY glVertexStream3sATI (GLenum, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glVertexStream3svATI (GLenum, const GLshort *); +GLAPI void APIENTRY glVertexStream3iATI (GLenum, GLint, GLint, GLint); +GLAPI void APIENTRY glVertexStream3ivATI (GLenum, const GLint *); +GLAPI void APIENTRY glVertexStream3fATI (GLenum, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexStream3fvATI (GLenum, const GLfloat *); +GLAPI void APIENTRY glVertexStream3dATI (GLenum, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexStream3dvATI (GLenum, const GLdouble *); +GLAPI void APIENTRY glVertexStream4sATI (GLenum, GLshort, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glVertexStream4svATI (GLenum, const GLshort *); +GLAPI void APIENTRY glVertexStream4iATI (GLenum, GLint, GLint, GLint, GLint); +GLAPI void APIENTRY glVertexStream4ivATI (GLenum, const GLint *); +GLAPI void APIENTRY glVertexStream4fATI (GLenum, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glVertexStream4fvATI (GLenum, const GLfloat *); +GLAPI void APIENTRY glVertexStream4dATI (GLenum, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glVertexStream4dvATI (GLenum, const GLdouble *); +GLAPI void APIENTRY glNormalStream3bATI (GLenum, GLbyte, GLbyte, GLbyte); +GLAPI void APIENTRY glNormalStream3bvATI (GLenum, const GLbyte *); +GLAPI void APIENTRY glNormalStream3sATI (GLenum, GLshort, GLshort, GLshort); +GLAPI void APIENTRY glNormalStream3svATI (GLenum, const GLshort *); +GLAPI void APIENTRY glNormalStream3iATI (GLenum, GLint, GLint, GLint); +GLAPI void APIENTRY glNormalStream3ivATI (GLenum, const GLint *); +GLAPI void APIENTRY glNormalStream3fATI (GLenum, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glNormalStream3fvATI (GLenum, const GLfloat *); +GLAPI void APIENTRY glNormalStream3dATI (GLenum, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glNormalStream3dvATI (GLenum, const GLdouble *); +GLAPI void APIENTRY glClientActiveVertexStreamATI (GLenum); +GLAPI void APIENTRY glVertexBlendEnviATI (GLenum, GLint); +GLAPI void APIENTRY glVertexBlendEnvfATI (GLenum, GLfloat); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVERTEXSTREAM1SATIPROC) (GLenum stream, GLshort x); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1IATIPROC) (GLenum stream, GLint x); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1FATIPROC) (GLenum stream, GLfloat x); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1DATIPROC) (GLenum stream, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2SATIPROC) (GLenum stream, GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2IATIPROC) (GLenum stream, GLint x, GLint y); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2FATIPROC) (GLenum stream, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2DATIPROC) (GLenum stream, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4IATIPROC) (GLenum stream, GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3BATIPROC) (GLenum stream, GLbyte nx, GLbyte ny, GLbyte nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3BVATIPROC) (GLenum stream, const GLbyte *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3SATIPROC) (GLenum stream, GLshort nx, GLshort ny, GLshort nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3IATIPROC) (GLenum stream, GLint nx, GLint ny, GLint nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3FATIPROC) (GLenum stream, GLfloat nx, GLfloat ny, GLfloat nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3DATIPROC) (GLenum stream, GLdouble nx, GLdouble ny, GLdouble nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC) (GLenum stream); +typedef void (APIENTRYP PFNGLVERTEXBLENDENVIATIPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLVERTEXBLENDENVFATIPROC) (GLenum pname, GLfloat param); +#endif + +#ifndef GL_ATI_element_array +#define GL_ATI_element_array 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glElementPointerATI (GLenum, const GLvoid *); +GLAPI void APIENTRY glDrawElementArrayATI (GLenum, GLsizei); +GLAPI void APIENTRY glDrawRangeElementArrayATI (GLenum, GLuint, GLuint, GLsizei); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLELEMENTPOINTERATIPROC) (GLenum type, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLDRAWELEMENTARRAYATIPROC) (GLenum mode, GLsizei count); +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTARRAYATIPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count); +#endif + +#ifndef GL_SUN_mesh_array +#define GL_SUN_mesh_array 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawMeshArraysSUN (GLenum, GLint, GLsizei, GLsizei); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDRAWMESHARRAYSSUNPROC) (GLenum mode, GLint first, GLsizei count, GLsizei width); +#endif + +#ifndef GL_SUN_slice_accum +#define GL_SUN_slice_accum 1 +#endif + +#ifndef GL_NV_multisample_filter_hint +#define GL_NV_multisample_filter_hint 1 +#endif + +#ifndef GL_NV_depth_clamp +#define GL_NV_depth_clamp 1 +#endif + +#ifndef GL_NV_occlusion_query +#define GL_NV_occlusion_query 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenOcclusionQueriesNV (GLsizei, GLuint *); +GLAPI void APIENTRY glDeleteOcclusionQueriesNV (GLsizei, const GLuint *); +GLAPI GLboolean APIENTRY glIsOcclusionQueryNV (GLuint); +GLAPI void APIENTRY glBeginOcclusionQueryNV (GLuint); +GLAPI void APIENTRY glEndOcclusionQueryNV (void); +GLAPI void APIENTRY glGetOcclusionQueryivNV (GLuint, GLenum, GLint *); +GLAPI void APIENTRY glGetOcclusionQueryuivNV (GLuint, GLenum, GLuint *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGENOCCLUSIONQUERIESNVPROC) (GLsizei n, GLuint *ids); +typedef void (APIENTRYP PFNGLDELETEOCCLUSIONQUERIESNVPROC) (GLsizei n, const GLuint *ids); +typedef GLboolean (APIENTRYP PFNGLISOCCLUSIONQUERYNVPROC) (GLuint id); +typedef void (APIENTRYP PFNGLBEGINOCCLUSIONQUERYNVPROC) (GLuint id); +typedef void (APIENTRYP PFNGLENDOCCLUSIONQUERYNVPROC) (void); +typedef void (APIENTRYP PFNGLGETOCCLUSIONQUERYIVNVPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETOCCLUSIONQUERYUIVNVPROC) (GLuint id, GLenum pname, GLuint *params); +#endif + +#ifndef GL_NV_point_sprite +#define GL_NV_point_sprite 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPointParameteriNV (GLenum, GLint); +GLAPI void APIENTRY glPointParameterivNV (GLenum, const GLint *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPOINTPARAMETERINVPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERIVNVPROC) (GLenum pname, const GLint *params); +#endif + +#ifndef GL_NV_texture_shader3 +#define GL_NV_texture_shader3 1 +#endif + +#ifndef GL_NV_vertex_program1_1 +#define GL_NV_vertex_program1_1 1 +#endif + +#ifndef GL_EXT_shadow_funcs +#define GL_EXT_shadow_funcs 1 +#endif + +#ifndef GL_EXT_stencil_two_side +#define GL_EXT_stencil_two_side 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glActiveStencilFaceEXT (GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLACTIVESTENCILFACEEXTPROC) (GLenum face); +#endif + +#ifndef GL_ATI_text_fragment_shader +#define GL_ATI_text_fragment_shader 1 +#endif + +#ifndef GL_APPLE_client_storage +#define GL_APPLE_client_storage 1 +#endif + +#ifndef GL_APPLE_element_array +#define GL_APPLE_element_array 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glElementPointerAPPLE (GLenum, const GLvoid *); +GLAPI void APIENTRY glDrawElementArrayAPPLE (GLenum, GLint, GLsizei); +GLAPI void APIENTRY glDrawRangeElementArrayAPPLE (GLenum, GLuint, GLuint, GLint, GLsizei); +GLAPI void APIENTRY glMultiDrawElementArrayAPPLE (GLenum, const GLint *, const GLsizei *, GLsizei); +GLAPI void APIENTRY glMultiDrawRangeElementArrayAPPLE (GLenum, GLuint, GLuint, const GLint *, const GLsizei *, GLsizei); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLELEMENTPOINTERAPPLEPROC) (GLenum type, const GLvoid *pointer); +typedef void (APIENTRYP PFNGLDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, GLint first, GLsizei count); +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); +typedef void (APIENTRYP PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, const GLint *first, const GLsizei *count, GLsizei primcount); +#endif + +#ifndef GL_APPLE_fence +#define GL_APPLE_fence 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenFencesAPPLE (GLsizei, GLuint *); +GLAPI void APIENTRY glDeleteFencesAPPLE (GLsizei, const GLuint *); +GLAPI void APIENTRY glSetFenceAPPLE (GLuint); +GLAPI GLboolean APIENTRY glIsFenceAPPLE (GLuint); +GLAPI GLboolean APIENTRY glTestFenceAPPLE (GLuint); +GLAPI void APIENTRY glFinishFenceAPPLE (GLuint); +GLAPI GLboolean APIENTRY glTestObjectAPPLE (GLenum, GLuint); +GLAPI void APIENTRY glFinishObjectAPPLE (GLenum, GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLGENFENCESAPPLEPROC) (GLsizei n, GLuint *fences); +typedef void (APIENTRYP PFNGLDELETEFENCESAPPLEPROC) (GLsizei n, const GLuint *fences); +typedef void (APIENTRYP PFNGLSETFENCEAPPLEPROC) (GLuint fence); +typedef GLboolean (APIENTRYP PFNGLISFENCEAPPLEPROC) (GLuint fence); +typedef GLboolean (APIENTRYP PFNGLTESTFENCEAPPLEPROC) (GLuint fence); +typedef void (APIENTRYP PFNGLFINISHFENCEAPPLEPROC) (GLuint fence); +typedef GLboolean (APIENTRYP PFNGLTESTOBJECTAPPLEPROC) (GLenum object, GLuint name); +typedef void (APIENTRYP PFNGLFINISHOBJECTAPPLEPROC) (GLenum object, GLint name); +#endif + +#ifndef GL_APPLE_vertex_array_object +#define GL_APPLE_vertex_array_object 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindVertexArrayAPPLE (GLuint); +GLAPI void APIENTRY glDeleteVertexArraysAPPLE (GLsizei, const GLuint *); +GLAPI void APIENTRY glGenVertexArraysAPPLE (GLsizei, const GLuint *); +GLAPI GLboolean APIENTRY glIsVertexArrayAPPLE (GLuint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBINDVERTEXARRAYAPPLEPROC) (GLuint array); +typedef void (APIENTRYP PFNGLDELETEVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint *arrays); +typedef void (APIENTRYP PFNGLGENVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint *arrays); +typedef GLboolean (APIENTRYP PFNGLISVERTEXARRAYAPPLEPROC) (GLuint array); +#endif + +#ifndef GL_APPLE_vertex_array_range +#define GL_APPLE_vertex_array_range 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexArrayRangeAPPLE (GLsizei, GLvoid *); +GLAPI void APIENTRY glFlushVertexArrayRangeAPPLE (GLsizei, GLvoid *); +GLAPI void APIENTRY glVertexArrayParameteriAPPLE (GLenum, GLint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, GLvoid *pointer); +typedef void (APIENTRYP PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, GLvoid *pointer); +typedef void (APIENTRYP PFNGLVERTEXARRAYPARAMETERIAPPLEPROC) (GLenum pname, GLint param); +#endif + +#ifndef GL_APPLE_ycbcr_422 +#define GL_APPLE_ycbcr_422 1 +#endif + +#ifndef GL_S3_s3tc +#define GL_S3_s3tc 1 +#endif + +#ifndef GL_ATI_draw_buffers +#define GL_ATI_draw_buffers 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawBuffersATI (GLsizei, const GLenum *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDRAWBUFFERSATIPROC) (GLsizei n, const GLenum *bufs); +#endif + +#ifndef GL_ATI_pixel_format_float +#define GL_ATI_pixel_format_float 1 +/* This is really a WGL extension, but defines some associated GL enums. + * ATI does not export "GL_ATI_pixel_format_float" in the GL_EXTENSIONS string. + */ +#endif + +#ifndef GL_ATI_texture_env_combine3 +#define GL_ATI_texture_env_combine3 1 +#endif + +#ifndef GL_ATI_texture_float +#define GL_ATI_texture_float 1 +#endif + +#ifndef GL_NV_float_buffer +#define GL_NV_float_buffer 1 +#endif + +#ifndef GL_NV_fragment_program +#define GL_NV_fragment_program 1 +/* Some NV_fragment_program entry points are shared with ARB_vertex_program. */ +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramNamedParameter4fNV (GLuint, GLsizei, const GLubyte *, GLfloat, GLfloat, GLfloat, GLfloat); +GLAPI void APIENTRY glProgramNamedParameter4dNV (GLuint, GLsizei, const GLubyte *, GLdouble, GLdouble, GLdouble, GLdouble); +GLAPI void APIENTRY glProgramNamedParameter4fvNV (GLuint, GLsizei, const GLubyte *, const GLfloat *); +GLAPI void APIENTRY glProgramNamedParameter4dvNV (GLuint, GLsizei, const GLubyte *, const GLdouble *); +GLAPI void APIENTRY glGetProgramNamedParameterfvNV (GLuint, GLsizei, const GLubyte *, GLfloat *); +GLAPI void APIENTRY glGetProgramNamedParameterdvNV (GLuint, GLsizei, const GLubyte *, GLdouble *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4FNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4DNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, const GLfloat *v); +typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, const GLdouble *v); +typedef void (APIENTRYP PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLdouble *params); +#endif + +#ifndef GL_NV_half_float +#define GL_NV_half_float 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertex2hNV (GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glVertex2hvNV (const GLhalfNV *); +GLAPI void APIENTRY glVertex3hNV (GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glVertex3hvNV (const GLhalfNV *); +GLAPI void APIENTRY glVertex4hNV (GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glVertex4hvNV (const GLhalfNV *); +GLAPI void APIENTRY glNormal3hNV (GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glNormal3hvNV (const GLhalfNV *); +GLAPI void APIENTRY glColor3hNV (GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glColor3hvNV (const GLhalfNV *); +GLAPI void APIENTRY glColor4hNV (GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glColor4hvNV (const GLhalfNV *); +GLAPI void APIENTRY glTexCoord1hNV (GLhalfNV); +GLAPI void APIENTRY glTexCoord1hvNV (const GLhalfNV *); +GLAPI void APIENTRY glTexCoord2hNV (GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glTexCoord2hvNV (const GLhalfNV *); +GLAPI void APIENTRY glTexCoord3hNV (GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glTexCoord3hvNV (const GLhalfNV *); +GLAPI void APIENTRY glTexCoord4hNV (GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glTexCoord4hvNV (const GLhalfNV *); +GLAPI void APIENTRY glMultiTexCoord1hNV (GLenum, GLhalfNV); +GLAPI void APIENTRY glMultiTexCoord1hvNV (GLenum, const GLhalfNV *); +GLAPI void APIENTRY glMultiTexCoord2hNV (GLenum, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glMultiTexCoord2hvNV (GLenum, const GLhalfNV *); +GLAPI void APIENTRY glMultiTexCoord3hNV (GLenum, GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glMultiTexCoord3hvNV (GLenum, const GLhalfNV *); +GLAPI void APIENTRY glMultiTexCoord4hNV (GLenum, GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glMultiTexCoord4hvNV (GLenum, const GLhalfNV *); +GLAPI void APIENTRY glFogCoordhNV (GLhalfNV); +GLAPI void APIENTRY glFogCoordhvNV (const GLhalfNV *); +GLAPI void APIENTRY glSecondaryColor3hNV (GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glSecondaryColor3hvNV (const GLhalfNV *); +GLAPI void APIENTRY glVertexWeighthNV (GLhalfNV); +GLAPI void APIENTRY glVertexWeighthvNV (const GLhalfNV *); +GLAPI void APIENTRY glVertexAttrib1hNV (GLuint, GLhalfNV); +GLAPI void APIENTRY glVertexAttrib1hvNV (GLuint, const GLhalfNV *); +GLAPI void APIENTRY glVertexAttrib2hNV (GLuint, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glVertexAttrib2hvNV (GLuint, const GLhalfNV *); +GLAPI void APIENTRY glVertexAttrib3hNV (GLuint, GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glVertexAttrib3hvNV (GLuint, const GLhalfNV *); +GLAPI void APIENTRY glVertexAttrib4hNV (GLuint, GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); +GLAPI void APIENTRY glVertexAttrib4hvNV (GLuint, const GLhalfNV *); +GLAPI void APIENTRY glVertexAttribs1hvNV (GLuint, GLsizei, const GLhalfNV *); +GLAPI void APIENTRY glVertexAttribs2hvNV (GLuint, GLsizei, const GLhalfNV *); +GLAPI void APIENTRY glVertexAttribs3hvNV (GLuint, GLsizei, const GLhalfNV *); +GLAPI void APIENTRY glVertexAttribs4hvNV (GLuint, GLsizei, const GLhalfNV *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVERTEX2HNVPROC) (GLhalfNV x, GLhalfNV y); +typedef void (APIENTRYP PFNGLVERTEX2HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEX3HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z); +typedef void (APIENTRYP PFNGLVERTEX3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEX4HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); +typedef void (APIENTRYP PFNGLVERTEX4HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLNORMAL3HNVPROC) (GLhalfNV nx, GLhalfNV ny, GLhalfNV nz); +typedef void (APIENTRYP PFNGLNORMAL3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue); +typedef void (APIENTRYP PFNGLCOLOR3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLCOLOR4HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue, GLhalfNV alpha); +typedef void (APIENTRYP PFNGLCOLOR4HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLTEXCOORD1HNVPROC) (GLhalfNV s); +typedef void (APIENTRYP PFNGLTEXCOORD1HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLTEXCOORD2HNVPROC) (GLhalfNV s, GLhalfNV t); +typedef void (APIENTRYP PFNGLTEXCOORD2HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLTEXCOORD3HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r); +typedef void (APIENTRYP PFNGLTEXCOORD3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLTEXCOORD4HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); +typedef void (APIENTRYP PFNGLTEXCOORD4HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1HNVPROC) (GLenum target, GLhalfNV s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1HVNVPROC) (GLenum target, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2HVNVPROC) (GLenum target, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3HVNVPROC) (GLenum target, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4HVNVPROC) (GLenum target, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLFOGCOORDHNVPROC) (GLhalfNV fog); +typedef void (APIENTRYP PFNGLFOGCOORDHVNVPROC) (const GLhalfNV *fog); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXWEIGHTHNVPROC) (GLhalfNV weight); +typedef void (APIENTRYP PFNGLVERTEXWEIGHTHVNVPROC) (const GLhalfNV *weight); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1HNVPROC) (GLuint index, GLhalfNV x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1HVNVPROC) (GLuint index, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2HVNVPROC) (GLuint index, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3HVNVPROC) (GLuint index, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4HVNVPROC) (GLuint index, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS1HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS2HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS3HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); +#endif + +#ifndef GL_NV_pixel_data_range +#define GL_NV_pixel_data_range 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPixelDataRangeNV (GLenum, GLsizei, GLvoid *); +GLAPI void APIENTRY glFlushPixelDataRangeNV (GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPIXELDATARANGENVPROC) (GLenum target, GLsizei length, GLvoid *pointer); +typedef void (APIENTRYP PFNGLFLUSHPIXELDATARANGENVPROC) (GLenum target); +#endif + +#ifndef GL_NV_primitive_restart +#define GL_NV_primitive_restart 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPrimitiveRestartNV (void); +GLAPI void APIENTRY glPrimitiveRestartIndexNV (GLuint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLPRIMITIVERESTARTNVPROC) (void); +typedef void (APIENTRYP PFNGLPRIMITIVERESTARTINDEXNVPROC) (GLuint index); +#endif + +#ifndef GL_NV_texture_expand_normal +#define GL_NV_texture_expand_normal 1 +#endif + +#ifndef GL_NV_vertex_program2 +#define GL_NV_vertex_program2 1 +#endif + +#ifndef GL_ATI_map_object_buffer +#define GL_ATI_map_object_buffer 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLvoid* APIENTRY glMapObjectBufferATI (GLuint); +GLAPI void APIENTRY glUnmapObjectBufferATI (GLuint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLvoid* (APIENTRYP PFNGLMAPOBJECTBUFFERATIPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLUNMAPOBJECTBUFFERATIPROC) (GLuint buffer); +#endif + +#ifndef GL_ATI_separate_stencil +#define GL_ATI_separate_stencil 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glStencilOpSeparateATI (GLenum, GLenum, GLenum, GLenum); +GLAPI void APIENTRY glStencilFuncSeparateATI (GLenum, GLenum, GLint, GLuint); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLSTENCILOPSEPARATEATIPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +typedef void (APIENTRYP PFNGLSTENCILFUNCSEPARATEATIPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); +#endif + +#ifndef GL_ATI_vertex_attrib_array_object +#define GL_ATI_vertex_attrib_array_object 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexAttribArrayObjectATI (GLuint, GLint, GLenum, GLboolean, GLsizei, GLuint, GLuint); +GLAPI void APIENTRY glGetVertexAttribArrayObjectfvATI (GLuint, GLenum, GLfloat *); +GLAPI void APIENTRY glGetVertexAttribArrayObjectivATI (GLuint, GLenum, GLint *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLVERTEXATTRIBARRAYOBJECTATIPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC) (GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC) (GLuint index, GLenum pname, GLint *params); +#endif + +#ifndef GL_OES_read_format +#define GL_OES_read_format 1 +#endif + +#ifndef GL_EXT_depth_bounds_test +#define GL_EXT_depth_bounds_test 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDepthBoundsEXT (GLclampd, GLclampd); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLDEPTHBOUNDSEXTPROC) (GLclampd zmin, GLclampd zmax); +#endif + +#ifndef GL_EXT_texture_mirror_clamp +#define GL_EXT_texture_mirror_clamp 1 +#endif + +#ifndef GL_EXT_blend_equation_separate +#define GL_EXT_blend_equation_separate 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendEquationSeparateEXT (GLenum, GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEEXTPROC) (GLenum modeRGB, GLenum modeAlpha); +#endif + +#ifndef GL_MESA_pack_invert +#define GL_MESA_pack_invert 1 +#endif + +#ifndef GL_MESA_ycbcr_texture +#define GL_MESA_ycbcr_texture 1 +#endif + +#ifndef GL_EXT_pixel_buffer_object +#define GL_EXT_pixel_buffer_object 1 +#endif + +#ifndef GL_NV_fragment_program_option +#define GL_NV_fragment_program_option 1 +#endif + +#ifndef GL_NV_fragment_program2 +#define GL_NV_fragment_program2 1 +#endif + +#ifndef GL_NV_vertex_program2_option +#define GL_NV_vertex_program2_option 1 +#endif + +#ifndef GL_NV_vertex_program3 +#define GL_NV_vertex_program3 1 +#endif + +#ifndef GL_EXT_framebuffer_object +#define GL_EXT_framebuffer_object 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLboolean APIENTRY glIsRenderbufferEXT (GLuint); +GLAPI void APIENTRY glBindRenderbufferEXT (GLenum, GLuint); +GLAPI void APIENTRY glDeleteRenderbuffersEXT (GLsizei, const GLuint *); +GLAPI void APIENTRY glGenRenderbuffersEXT (GLsizei, GLuint *); +GLAPI void APIENTRY glRenderbufferStorageEXT (GLenum, GLenum, GLsizei, GLsizei); +GLAPI void APIENTRY glGetRenderbufferParameterivEXT (GLenum, GLenum, GLint *); +GLAPI GLboolean APIENTRY glIsFramebufferEXT (GLuint); +GLAPI void APIENTRY glBindFramebufferEXT (GLenum, GLuint); +GLAPI void APIENTRY glDeleteFramebuffersEXT (GLsizei, const GLuint *); +GLAPI void APIENTRY glGenFramebuffersEXT (GLsizei, GLuint *); +GLAPI GLenum APIENTRY glCheckFramebufferStatusEXT (GLenum); +GLAPI void APIENTRY glFramebufferTexture1DEXT (GLenum, GLenum, GLenum, GLuint, GLint); +GLAPI void APIENTRY glFramebufferTexture2DEXT (GLenum, GLenum, GLenum, GLuint, GLint); +GLAPI void APIENTRY glFramebufferTexture3DEXT (GLenum, GLenum, GLenum, GLuint, GLint, GLint); +GLAPI void APIENTRY glFramebufferRenderbufferEXT (GLenum, GLenum, GLenum, GLuint); +GLAPI void APIENTRY glGetFramebufferAttachmentParameterivEXT (GLenum, GLenum, GLenum, GLint *); +GLAPI void APIENTRY glGenerateMipmapEXT (GLenum); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef GLboolean (APIENTRYP PFNGLISRENDERBUFFEREXTPROC) (GLuint renderbuffer); +typedef void (APIENTRYP PFNGLBINDRENDERBUFFEREXTPROC) (GLenum target, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLDELETERENDERBUFFERSEXTPROC) (GLsizei n, const GLuint *renderbuffers); +typedef void (APIENTRYP PFNGLGENRENDERBUFFERSEXTPROC) (GLsizei n, GLuint *renderbuffers); +typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef GLboolean (APIENTRYP PFNGLISFRAMEBUFFEREXTPROC) (GLuint framebuffer); +typedef void (APIENTRYP PFNGLBINDFRAMEBUFFEREXTPROC) (GLenum target, GLuint framebuffer); +typedef void (APIENTRYP PFNGLDELETEFRAMEBUFFERSEXTPROC) (GLsizei n, const GLuint *framebuffers); +typedef void (APIENTRYP PFNGLGENFRAMEBUFFERSEXTPROC) (GLsizei n, GLuint *framebuffers); +typedef GLenum (APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) (GLenum target); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE1DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +typedef void (APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLenum target, GLenum attachment, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGENERATEMIPMAPEXTPROC) (GLenum target); +#endif + +#ifndef GL_GREMEDY_string_marker +#define GL_GREMEDY_string_marker 1 +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glStringMarkerGREMEDY (GLsizei, const GLvoid *); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (APIENTRYP PFNGLSTRINGMARKERGREMEDYPROC) (GLsizei len, const GLvoid *string); +#endif + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Windows/GL/glprocs.h b/Source/Plugins/Plugin_VideoOGL/Src/Windows/GL/glprocs.h new file mode 100644 index 0000000000..999fd42af1 --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/Windows/GL/glprocs.h @@ -0,0 +1,2213 @@ +#ifndef _GLPROCS_H_ +#define _GLPROCS_H_ + +/* +** GLprocs utility for getting function addresses for OpenGL(R) 1.2, +** OpenGL 1.3, OpenGL 1.4, OpenGL 1.5 and OpenGL extension functions. +** +** Version: 1.1 +** +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: This software was created using the +** OpenGL(R) version 1.2.1 Sample Implementation published by SGI, but has +** not been independently verified as being compliant with the OpenGL(R) +** version 1.2.1 Specification. +** +** Initial version of glprocs.{c,h} contributed by Intel(R) Corporation. +*/ + +#ifdef _WIN32 + #include "glext.h" + #include "wglext.h" +#else + #include +#endif + +#ifndef _WIN32 /* non-Windows environment */ + #ifndef APIENTRY + #define APIENTRY + #endif + #ifdef __GNUC__ + #define _inline __inline__ + #else + #define _inline + #endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* Structure of all OpenGL {1.2, 1.3, 1.4, 1.5}, GL extension procs.*/ + +typedef struct { + void (APIENTRY *BlendColor) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); + void (APIENTRY *BlendEquation) (GLenum mode); + void (APIENTRY *DrawRangeElements) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); + void (APIENTRY *ColorTable) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); + void (APIENTRY *ColorTableParameterfv) (GLenum target, GLenum pname, const GLfloat *params); + void (APIENTRY *ColorTableParameteriv) (GLenum target, GLenum pname, const GLint *params); + void (APIENTRY *CopyColorTable) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); + void (APIENTRY *GetColorTable) (GLenum target, GLenum format, GLenum type, GLvoid *table); + void (APIENTRY *GetColorTableParameterfv) (GLenum target, GLenum pname, GLfloat *params); + void (APIENTRY *GetColorTableParameteriv) (GLenum target, GLenum pname, GLint *params); + void (APIENTRY *ColorSubTable) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); + void (APIENTRY *CopyColorSubTable) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); + void (APIENTRY *ConvolutionFilter1D) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); + void (APIENTRY *ConvolutionFilter2D) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); + void (APIENTRY *ConvolutionParameterf) (GLenum target, GLenum pname, GLfloat params); + void (APIENTRY *ConvolutionParameterfv) (GLenum target, GLenum pname, const GLfloat *params); + void (APIENTRY *ConvolutionParameteri) (GLenum target, GLenum pname, GLint params); + void (APIENTRY *ConvolutionParameteriv) (GLenum target, GLenum pname, const GLint *params); + void (APIENTRY *CopyConvolutionFilter1D) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); + void (APIENTRY *CopyConvolutionFilter2D) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); + void (APIENTRY *GetConvolutionFilter) (GLenum target, GLenum format, GLenum type, GLvoid *image); + void (APIENTRY *GetConvolutionParameterfv) (GLenum target, GLenum pname, GLfloat *params); + void (APIENTRY *GetConvolutionParameteriv) (GLenum target, GLenum pname, GLint *params); + void (APIENTRY *GetSeparableFilter) (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); + void (APIENTRY *SeparableFilter2D) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column); + void (APIENTRY *GetHistogram) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); + void (APIENTRY *GetHistogramParameterfv) (GLenum target, GLenum pname, GLfloat *params); + void (APIENTRY *GetHistogramParameteriv) (GLenum target, GLenum pname, GLint *params); + void (APIENTRY *GetMinmax) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); + void (APIENTRY *GetMinmaxParameterfv) (GLenum target, GLenum pname, GLfloat *params); + void (APIENTRY *GetMinmaxParameteriv) (GLenum target, GLenum pname, GLint *params); + void (APIENTRY *Histogram) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); + void (APIENTRY *Minmax) (GLenum target, GLenum internalformat, GLboolean sink); + void (APIENTRY *ResetHistogram) (GLenum target); + void (APIENTRY *ResetMinmax) (GLenum target); + void (APIENTRY *TexImage3D) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); + void (APIENTRY *TexSubImage3D) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); + void (APIENTRY *CopyTexSubImage3D) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); + void (APIENTRY *ActiveTexture) (GLenum texture); + void (APIENTRY *ClientActiveTexture) (GLenum texture); + void (APIENTRY *MultiTexCoord1d) (GLenum target, GLdouble s); + void (APIENTRY *MultiTexCoord1dv) (GLenum target, const GLdouble *v); + void (APIENTRY *MultiTexCoord1f) (GLenum target, GLfloat s); + void (APIENTRY *MultiTexCoord1fv) (GLenum target, const GLfloat *v); + void (APIENTRY *MultiTexCoord1i) (GLenum target, GLint s); + void (APIENTRY *MultiTexCoord1iv) (GLenum target, const GLint *v); + void (APIENTRY *MultiTexCoord1s) (GLenum target, GLshort s); + void (APIENTRY *MultiTexCoord1sv) (GLenum target, const GLshort *v); + void (APIENTRY *MultiTexCoord2d) (GLenum target, GLdouble s, GLdouble t); + void (APIENTRY *MultiTexCoord2dv) (GLenum target, const GLdouble *v); + void (APIENTRY *MultiTexCoord2f) (GLenum target, GLfloat s, GLfloat t); + void (APIENTRY *MultiTexCoord2fv) (GLenum target, const GLfloat *v); + void (APIENTRY *MultiTexCoord2i) (GLenum target, GLint s, GLint t); + void (APIENTRY *MultiTexCoord2iv) (GLenum target, const GLint *v); + void (APIENTRY *MultiTexCoord2s) (GLenum target, GLshort s, GLshort t); + void (APIENTRY *MultiTexCoord2sv) (GLenum target, const GLshort *v); + void (APIENTRY *MultiTexCoord3d) (GLenum target, GLdouble s, GLdouble t, GLdouble r); + void (APIENTRY *MultiTexCoord3dv) (GLenum target, const GLdouble *v); + void (APIENTRY *MultiTexCoord3f) (GLenum target, GLfloat s, GLfloat t, GLfloat r); + void (APIENTRY *MultiTexCoord3fv) (GLenum target, const GLfloat *v); + void (APIENTRY *MultiTexCoord3i) (GLenum target, GLint s, GLint t, GLint r); + void (APIENTRY *MultiTexCoord3iv) (GLenum target, const GLint *v); + void (APIENTRY *MultiTexCoord3s) (GLenum target, GLshort s, GLshort t, GLshort r); + void (APIENTRY *MultiTexCoord3sv) (GLenum target, const GLshort *v); + void (APIENTRY *MultiTexCoord4d) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); + void (APIENTRY *MultiTexCoord4dv) (GLenum target, const GLdouble *v); + void (APIENTRY *MultiTexCoord4f) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); + void (APIENTRY *MultiTexCoord4fv) (GLenum target, const GLfloat *v); + void (APIENTRY *MultiTexCoord4i) (GLenum target, GLint s, GLint t, GLint r, GLint q); + void (APIENTRY *MultiTexCoord4iv) (GLenum target, const GLint *v); + void (APIENTRY *MultiTexCoord4s) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); + void (APIENTRY *MultiTexCoord4sv) (GLenum target, const GLshort *v); + void (APIENTRY *LoadTransposeMatrixf) (const GLfloat *m); + void (APIENTRY *LoadTransposeMatrixd) (const GLdouble *m); + void (APIENTRY *MultTransposeMatrixf) (const GLfloat *m); + void (APIENTRY *MultTransposeMatrixd) (const GLdouble *m); + void (APIENTRY *SampleCoverage) (GLclampf value, GLboolean invert); + void (APIENTRY *CompressedTexImage3D) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); + void (APIENTRY *CompressedTexImage2D) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); + void (APIENTRY *CompressedTexImage1D) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); + void (APIENTRY *CompressedTexSubImage3D) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); + void (APIENTRY *CompressedTexSubImage2D) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); + void (APIENTRY *CompressedTexSubImage1D) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); + void (APIENTRY *GetCompressedTexImage) (GLenum target, GLint level, GLvoid *img); + void (APIENTRY *BlendFuncSeparate) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); + void (APIENTRY *FogCoordf) (GLfloat coord); + void (APIENTRY *FogCoordfv) (const GLfloat *coord); + void (APIENTRY *FogCoordd) (GLdouble coord); + void (APIENTRY *FogCoorddv) (const GLdouble *coord); + void (APIENTRY *FogCoordPointer) (GLenum type, GLsizei stride, const GLvoid *pointer); + void (APIENTRY *MultiDrawArrays) (GLenum mode, GLint *first, GLsizei *count, GLsizei primcount); + void (APIENTRY *MultiDrawElements) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount); + void (APIENTRY *PointParameterf) (GLenum pname, GLfloat param); + void (APIENTRY *PointParameterfv) (GLenum pname, const GLfloat *params); + void (APIENTRY *PointParameteri) (GLenum pname, GLint param); + void (APIENTRY *PointParameteriv) (GLenum pname, const GLint *params); + void (APIENTRY *SecondaryColor3b) (GLbyte red, GLbyte green, GLbyte blue); + void (APIENTRY *SecondaryColor3bv) (const GLbyte *v); + void (APIENTRY *SecondaryColor3d) (GLdouble red, GLdouble green, GLdouble blue); + void (APIENTRY *SecondaryColor3dv) (const GLdouble *v); + void (APIENTRY *SecondaryColor3f) (GLfloat red, GLfloat green, GLfloat blue); + void (APIENTRY *SecondaryColor3fv) (const GLfloat *v); + void (APIENTRY *SecondaryColor3i) (GLint red, GLint green, GLint blue); + void (APIENTRY *SecondaryColor3iv) (const GLint *v); + void (APIENTRY *SecondaryColor3s) (GLshort red, GLshort green, GLshort blue); + void (APIENTRY *SecondaryColor3sv) (const GLshort *v); + void (APIENTRY *SecondaryColor3ub) (GLubyte red, GLubyte green, GLubyte blue); + void (APIENTRY *SecondaryColor3ubv) (const GLubyte *v); + void (APIENTRY *SecondaryColor3ui) (GLuint red, GLuint green, GLuint blue); + void (APIENTRY *SecondaryColor3uiv) (const GLuint *v); + void (APIENTRY *SecondaryColor3us) (GLushort red, GLushort green, GLushort blue); + void (APIENTRY *SecondaryColor3usv) (const GLushort *v); + void (APIENTRY *SecondaryColorPointer) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); + void (APIENTRY *WindowPos2d) (GLdouble x, GLdouble y); + void (APIENTRY *WindowPos2dv) (const GLdouble *v); + void (APIENTRY *WindowPos2f) (GLfloat x, GLfloat y); + void (APIENTRY *WindowPos2fv) (const GLfloat *v); + void (APIENTRY *WindowPos2i) (GLint x, GLint y); + void (APIENTRY *WindowPos2iv) (const GLint *v); + void (APIENTRY *WindowPos2s) (GLshort x, GLshort y); + void (APIENTRY *WindowPos2sv) (const GLshort *v); + void (APIENTRY *WindowPos3d) (GLdouble x, GLdouble y, GLdouble z); + void (APIENTRY *WindowPos3dv) (const GLdouble *v); + void (APIENTRY *WindowPos3f) (GLfloat x, GLfloat y, GLfloat z); + void (APIENTRY *WindowPos3fv) (const GLfloat *v); + void (APIENTRY *WindowPos3i) (GLint x, GLint y, GLint z); + void (APIENTRY *WindowPos3iv) (const GLint *v); + void (APIENTRY *WindowPos3s) (GLshort x, GLshort y, GLshort z); + void (APIENTRY *WindowPos3sv) (const GLshort *v); + void (APIENTRY *GenQueries) (GLsizei n, GLuint *ids); + void (APIENTRY *DeleteQueries) (GLsizei n, const GLuint *ids); + GLboolean (APIENTRY *IsQuery) (GLuint id); + void (APIENTRY *BeginQuery) (GLenum target, GLuint id); + void (APIENTRY *EndQuery) (GLenum target); + void (APIENTRY *GetQueryiv) (GLenum target, GLenum pname, GLint *params); + void (APIENTRY *GetQueryObjectiv) (GLuint id, GLenum pname, GLint *params); + void (APIENTRY *GetQueryObjectuiv) (GLuint id, GLenum pname, GLuint *params); + void (APIENTRY *BindBuffer) (GLenum target, GLuint buffer); + void (APIENTRY *DeleteBuffers) (GLsizei n, const GLuint *buffers); + void (APIENTRY *GenBuffers) (GLsizei n, GLuint *buffers); + GLboolean (APIENTRY *IsBuffer) (GLuint buffer); + void (APIENTRY *BufferData) (GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage); + void (APIENTRY *BufferSubData) (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data); + void (APIENTRY *GetBufferSubData) (GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data); + GLvoid* (APIENTRY *MapBuffer) (GLenum target, GLenum access); + GLboolean (APIENTRY *UnmapBuffer) (GLenum target); + void (APIENTRY *GetBufferParameteriv) (GLenum target, GLenum pname, GLint *params); + void (APIENTRY *GetBufferPointerv) (GLenum target, GLenum pname, GLvoid* *params); + void (APIENTRY *ActiveTextureARB) (GLenum texture); + void (APIENTRY *ClientActiveTextureARB) (GLenum texture); + void (APIENTRY *MultiTexCoord1dARB) (GLenum target, GLdouble s); + void (APIENTRY *MultiTexCoord1dvARB) (GLenum target, const GLdouble *v); + void (APIENTRY *MultiTexCoord1fARB) (GLenum target, GLfloat s); + void (APIENTRY *MultiTexCoord1fvARB) (GLenum target, const GLfloat *v); + void (APIENTRY *MultiTexCoord1iARB) (GLenum target, GLint s); + void (APIENTRY *MultiTexCoord1ivARB) (GLenum target, const GLint *v); + void (APIENTRY *MultiTexCoord1sARB) (GLenum target, GLshort s); + void (APIENTRY *MultiTexCoord1svARB) (GLenum target, const GLshort *v); + void (APIENTRY *MultiTexCoord2dARB) (GLenum target, GLdouble s, GLdouble t); + void (APIENTRY *MultiTexCoord2dvARB) (GLenum target, const GLdouble *v); + void (APIENTRY *MultiTexCoord2fARB) (GLenum target, GLfloat s, GLfloat t); + void (APIENTRY *MultiTexCoord2fvARB) (GLenum target, const GLfloat *v); + void (APIENTRY *MultiTexCoord2iARB) (GLenum target, GLint s, GLint t); + void (APIENTRY *MultiTexCoord2ivARB) (GLenum target, const GLint *v); + void (APIENTRY *MultiTexCoord2sARB) (GLenum target, GLshort s, GLshort t); + void (APIENTRY *MultiTexCoord2svARB) (GLenum target, const GLshort *v); + void (APIENTRY *MultiTexCoord3dARB) (GLenum target, GLdouble s, GLdouble t, GLdouble r); + void (APIENTRY *MultiTexCoord3dvARB) (GLenum target, const GLdouble *v); + void (APIENTRY *MultiTexCoord3fARB) (GLenum target, GLfloat s, GLfloat t, GLfloat r); + void (APIENTRY *MultiTexCoord3fvARB) (GLenum target, const GLfloat *v); + void (APIENTRY *MultiTexCoord3iARB) (GLenum target, GLint s, GLint t, GLint r); + void (APIENTRY *MultiTexCoord3ivARB) (GLenum target, const GLint *v); + void (APIENTRY *MultiTexCoord3sARB) (GLenum target, GLshort s, GLshort t, GLshort r); + void (APIENTRY *MultiTexCoord3svARB) (GLenum target, const GLshort *v); + void (APIENTRY *MultiTexCoord4dARB) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); + void (APIENTRY *MultiTexCoord4dvARB) (GLenum target, const GLdouble *v); + void (APIENTRY *MultiTexCoord4fARB) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); + void (APIENTRY *MultiTexCoord4fvARB) (GLenum target, const GLfloat *v); + void (APIENTRY *MultiTexCoord4iARB) (GLenum target, GLint s, GLint t, GLint r, GLint q); + void (APIENTRY *MultiTexCoord4ivARB) (GLenum target, const GLint *v); + void (APIENTRY *MultiTexCoord4sARB) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); + void (APIENTRY *MultiTexCoord4svARB) (GLenum target, const GLshort *v); + void (APIENTRY *LoadTransposeMatrixfARB) (const GLfloat *m); + void (APIENTRY *LoadTransposeMatrixdARB) (const GLdouble *m); + void (APIENTRY *MultTransposeMatrixfARB) (const GLfloat *m); + void (APIENTRY *MultTransposeMatrixdARB) (const GLdouble *m); + void (APIENTRY *SampleCoverageARB) (GLclampf value, GLboolean invert); + void (APIENTRY *CompressedTexImage3DARB) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); + void (APIENTRY *CompressedTexImage2DARB) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); + void (APIENTRY *CompressedTexImage1DARB) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); + void (APIENTRY *CompressedTexSubImage3DARB) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); + void (APIENTRY *CompressedTexSubImage2DARB) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); + void (APIENTRY *CompressedTexSubImage1DARB) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); + void (APIENTRY *GetCompressedTexImageARB) (GLenum target, GLint level, GLvoid *img); + void (APIENTRY *PointParameterfARB) (GLenum pname, GLfloat param); + void (APIENTRY *PointParameterfvARB) (GLenum pname, const GLfloat *params); + void (APIENTRY *WeightbvARB) (GLint size, const GLbyte *weights); + void (APIENTRY *WeightsvARB) (GLint size, const GLshort *weights); + void (APIENTRY *WeightivARB) (GLint size, const GLint *weights); + void (APIENTRY *WeightfvARB) (GLint size, const GLfloat *weights); + void (APIENTRY *WeightdvARB) (GLint size, const GLdouble *weights); + void (APIENTRY *WeightubvARB) (GLint size, const GLubyte *weights); + void (APIENTRY *WeightusvARB) (GLint size, const GLushort *weights); + void (APIENTRY *WeightuivARB) (GLint size, const GLuint *weights); + void (APIENTRY *WeightPointerARB) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); + void (APIENTRY *VertexBlendARB) (GLint count); + void (APIENTRY *CurrentPaletteMatrixARB) (GLint index); + void (APIENTRY *MatrixIndexubvARB) (GLint size, const GLubyte *indices); + void (APIENTRY *MatrixIndexusvARB) (GLint size, const GLushort *indices); + void (APIENTRY *MatrixIndexuivARB) (GLint size, const GLuint *indices); + void (APIENTRY *MatrixIndexPointerARB) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); + void (APIENTRY *WindowPos2dARB) (GLdouble x, GLdouble y); + void (APIENTRY *WindowPos2dvARB) (const GLdouble *v); + void (APIENTRY *WindowPos2fARB) (GLfloat x, GLfloat y); + void (APIENTRY *WindowPos2fvARB) (const GLfloat *v); + void (APIENTRY *WindowPos2iARB) (GLint x, GLint y); + void (APIENTRY *WindowPos2ivARB) (const GLint *v); + void (APIENTRY *WindowPos2sARB) (GLshort x, GLshort y); + void (APIENTRY *WindowPos2svARB) (const GLshort *v); + void (APIENTRY *WindowPos3dARB) (GLdouble x, GLdouble y, GLdouble z); + void (APIENTRY *WindowPos3dvARB) (const GLdouble *v); + void (APIENTRY *WindowPos3fARB) (GLfloat x, GLfloat y, GLfloat z); + void (APIENTRY *WindowPos3fvARB) (const GLfloat *v); + void (APIENTRY *WindowPos3iARB) (GLint x, GLint y, GLint z); + void (APIENTRY *WindowPos3ivARB) (const GLint *v); + void (APIENTRY *WindowPos3sARB) (GLshort x, GLshort y, GLshort z); + void (APIENTRY *WindowPos3svARB) (const GLshort *v); + void (APIENTRY *VertexAttrib1dARB) (GLuint index, GLdouble x); + void (APIENTRY *VertexAttrib1dvARB) (GLuint index, const GLdouble *v); + void (APIENTRY *VertexAttrib1fARB) (GLuint index, GLfloat x); + void (APIENTRY *VertexAttrib1fvARB) (GLuint index, const GLfloat *v); + void (APIENTRY *VertexAttrib1sARB) (GLuint index, GLshort x); + void (APIENTRY *VertexAttrib1svARB) (GLuint index, const GLshort *v); + void (APIENTRY *VertexAttrib2dARB) (GLuint index, GLdouble x, GLdouble y); + void (APIENTRY *VertexAttrib2dvARB) (GLuint index, const GLdouble *v); + void (APIENTRY *VertexAttrib2fARB) (GLuint index, GLfloat x, GLfloat y); + void (APIENTRY *VertexAttrib2fvARB) (GLuint index, const GLfloat *v); + void (APIENTRY *VertexAttrib2sARB) (GLuint index, GLshort x, GLshort y); + void (APIENTRY *VertexAttrib2svARB) (GLuint index, const GLshort *v); + void (APIENTRY *VertexAttrib3dARB) (GLuint index, GLdouble x, GLdouble y, GLdouble z); + void (APIENTRY *VertexAttrib3dvARB) (GLuint index, const GLdouble *v); + void (APIENTRY *VertexAttrib3fARB) (GLuint index, GLfloat x, GLfloat y, GLfloat z); + void (APIENTRY *VertexAttrib3fvARB) (GLuint index, const GLfloat *v); + void (APIENTRY *VertexAttrib3sARB) (GLuint index, GLshort x, GLshort y, GLshort z); + void (APIENTRY *VertexAttrib3svARB) (GLuint index, const GLshort *v); + void (APIENTRY *VertexAttrib4NbvARB) (GLuint index, const GLbyte *v); + void (APIENTRY *VertexAttrib4NivARB) (GLuint index, const GLint *v); + void (APIENTRY *VertexAttrib4NsvARB) (GLuint index, const GLshort *v); + void (APIENTRY *VertexAttrib4NubARB) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); + void (APIENTRY *VertexAttrib4NubvARB) (GLuint index, const GLubyte *v); + void (APIENTRY *VertexAttrib4NuivARB) (GLuint index, const GLuint *v); + void (APIENTRY *VertexAttrib4NusvARB) (GLuint index, const GLushort *v); + void (APIENTRY *VertexAttrib4bvARB) (GLuint index, const GLbyte *v); + void (APIENTRY *VertexAttrib4dARB) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); + void (APIENTRY *VertexAttrib4dvARB) (GLuint index, const GLdouble *v); + void (APIENTRY *VertexAttrib4fARB) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); + void (APIENTRY *VertexAttrib4fvARB) (GLuint index, const GLfloat *v); + void (APIENTRY *VertexAttrib4ivARB) (GLuint index, const GLint *v); + void (APIENTRY *VertexAttrib4sARB) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); + void (APIENTRY *VertexAttrib4svARB) (GLuint index, const GLshort *v); + void (APIENTRY *VertexAttrib4ubvARB) (GLuint index, const GLubyte *v); + void (APIENTRY *VertexAttrib4uivARB) (GLuint index, const GLuint *v); + void (APIENTRY *VertexAttrib4usvARB) (GLuint index, const GLushort *v); + void (APIENTRY *VertexAttribPointerARB) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer); + void (APIENTRY *EnableVertexAttribArrayARB) (GLuint index); + void (APIENTRY *DisableVertexAttribArrayARB) (GLuint index); + void (APIENTRY *ProgramStringARB) (GLenum target, GLenum format, GLsizei len, const GLvoid *string); + void (APIENTRY *BindProgramARB) (GLenum target, GLuint program); + void (APIENTRY *DeleteProgramsARB) (GLsizei n, const GLuint *programs); + void (APIENTRY *GenProgramsARB) (GLsizei n, GLuint *programs); + void (APIENTRY *ProgramEnvParameter4dARB) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); + void (APIENTRY *ProgramEnvParameter4dvARB) (GLenum target, GLuint index, const GLdouble *params); + void (APIENTRY *ProgramEnvParameter4fARB) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); + void (APIENTRY *ProgramEnvParameter4fvARB) (GLenum target, GLuint index, const GLfloat *params); + void (APIENTRY *ProgramLocalParameter4dARB) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); + void (APIENTRY *ProgramLocalParameter4dvARB) (GLenum target, GLuint index, const GLdouble *params); + void (APIENTRY *ProgramLocalParameter4fARB) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); + void (APIENTRY *ProgramLocalParameter4fvARB) (GLenum target, GLuint index, const GLfloat *params); + void (APIENTRY *GetProgramEnvParameterdvARB) (GLenum target, GLuint index, GLdouble *params); + void (APIENTRY *GetProgramEnvParameterfvARB) (GLenum target, GLuint index, GLfloat *params); + void (APIENTRY *GetProgramLocalParameterdvARB) (GLenum target, GLuint index, GLdouble *params); + void (APIENTRY *GetProgramLocalParameterfvARB) (GLenum target, GLuint index, GLfloat *params); + void (APIENTRY *GetProgramivARB) (GLenum target, GLenum pname, GLint *params); + void (APIENTRY *GetProgramStringARB) (GLenum target, GLenum pname, GLvoid *string); + void (APIENTRY *GetVertexAttribdvARB) (GLuint index, GLenum pname, GLdouble *params); + void (APIENTRY *GetVertexAttribfvARB) (GLuint index, GLenum pname, GLfloat *params); + void (APIENTRY *GetVertexAttribivARB) (GLuint index, GLenum pname, GLint *params); + void (APIENTRY *GetVertexAttribPointervARB) (GLuint index, GLenum pname, GLvoid* *pointer); + GLboolean (APIENTRY *IsProgramARB) (GLuint program); + void (APIENTRY *BindBufferARB) (GLenum target, GLuint buffer); + void (APIENTRY *DeleteBuffersARB) (GLsizei n, const GLuint *buffers); + void (APIENTRY *GenBuffersARB) (GLsizei n, GLuint *buffers); + GLboolean (APIENTRY *IsBufferARB) (GLuint buffer); + void (APIENTRY *BufferDataARB) (GLenum target, GLsizeiptrARB size, const GLvoid *data, GLenum usage); + void (APIENTRY *BufferSubDataARB) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid *data); + void (APIENTRY *GetBufferSubDataARB) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid *data); + GLvoid* (APIENTRY *MapBufferARB) (GLenum target, GLenum access); + GLboolean (APIENTRY *UnmapBufferARB) (GLenum target); + void (APIENTRY *GetBufferParameterivARB) (GLenum target, GLenum pname, GLint *params); + void (APIENTRY *GetBufferPointervARB) (GLenum target, GLenum pname, GLvoid* *params); + void (APIENTRY *GenQueriesARB) (GLsizei n, GLuint *ids); + void (APIENTRY *DeleteQueriesARB) (GLsizei n, const GLuint *ids); + GLboolean (APIENTRY *IsQueryARB) (GLuint id); + void (APIENTRY *BeginQueryARB) (GLenum target, GLuint id); + void (APIENTRY *EndQueryARB) (GLenum target); + void (APIENTRY *GetQueryivARB) (GLenum target, GLenum pname, GLint *params); + void (APIENTRY *GetQueryObjectivARB) (GLuint id, GLenum pname, GLint *params); + void (APIENTRY *GetQueryObjectuivARB) (GLuint id, GLenum pname, GLuint *params); + void (APIENTRY *DeleteObjectARB) (GLhandleARB obj); + GLhandleARB (APIENTRY *GetHandleARB) (GLenum pname); + void (APIENTRY *DetachObjectARB) (GLhandleARB containerObj, GLhandleARB attachedObj); + GLhandleARB (APIENTRY *CreateShaderObjectARB) (GLenum shaderType); + void (APIENTRY *ShaderSourceARB) (GLhandleARB shaderObj, GLsizei count, const GLcharARB* *string, const GLint *length); + void (APIENTRY *CompileShaderARB) (GLhandleARB shaderObj); + GLhandleARB (APIENTRY *CreateProgramObjectARB) (void); + void (APIENTRY *AttachObjectARB) (GLhandleARB containerObj, GLhandleARB obj); + void (APIENTRY *LinkProgramARB) (GLhandleARB programObj); + void (APIENTRY *UseProgramObjectARB) (GLhandleARB programObj); + void (APIENTRY *ValidateProgramARB) (GLhandleARB programObj); + void (APIENTRY *Uniform1fARB) (GLint location, GLfloat v0); + void (APIENTRY *Uniform2fARB) (GLint location, GLfloat v0, GLfloat v1); + void (APIENTRY *Uniform3fARB) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); + void (APIENTRY *Uniform4fARB) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); + void (APIENTRY *Uniform1iARB) (GLint location, GLint v0); + void (APIENTRY *Uniform2iARB) (GLint location, GLint v0, GLint v1); + void (APIENTRY *Uniform3iARB) (GLint location, GLint v0, GLint v1, GLint v2); + void (APIENTRY *Uniform4iARB) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); + void (APIENTRY *Uniform1fvARB) (GLint location, GLsizei count, const GLfloat *value); + void (APIENTRY *Uniform2fvARB) (GLint location, GLsizei count, const GLfloat *value); + void (APIENTRY *Uniform3fvARB) (GLint location, GLsizei count, const GLfloat *value); + void (APIENTRY *Uniform4fvARB) (GLint location, GLsizei count, const GLfloat *value); + void (APIENTRY *Uniform1ivARB) (GLint location, GLsizei count, const GLint *value); + void (APIENTRY *Uniform2ivARB) (GLint location, GLsizei count, const GLint *value); + void (APIENTRY *Uniform3ivARB) (GLint location, GLsizei count, const GLint *value); + void (APIENTRY *Uniform4ivARB) (GLint location, GLsizei count, const GLint *value); + void (APIENTRY *UniformMatrix2fvARB) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); + void (APIENTRY *UniformMatrix3fvARB) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); + void (APIENTRY *UniformMatrix4fvARB) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); + void (APIENTRY *GetObjectParameterfvARB) (GLhandleARB obj, GLenum pname, GLfloat *params); + void (APIENTRY *GetObjectParameterivARB) (GLhandleARB obj, GLenum pname, GLint *params); + void (APIENTRY *GetInfoLogARB) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog); + void (APIENTRY *GetAttachedObjectsARB) (GLhandleARB containerObj, GLsizei maxCount, GLsizei *count, GLhandleARB *obj); + GLint (APIENTRY *GetUniformLocationARB) (GLhandleARB programObj, const GLcharARB *name); + void (APIENTRY *GetActiveUniformARB) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); + void (APIENTRY *GetUniformfvARB) (GLhandleARB programObj, GLint location, GLfloat *params); + void (APIENTRY *GetUniformivARB) (GLhandleARB programObj, GLint location, GLint *params); + void (APIENTRY *GetShaderSourceARB) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *source); + void (APIENTRY *BindAttribLocationARB) (GLhandleARB programObj, GLuint index, const GLcharARB *name); + void (APIENTRY *GetActiveAttribARB) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); + GLint (APIENTRY *GetAttribLocationARB) (GLhandleARB programObj, const GLcharARB *name); + void (APIENTRY *BlendColorEXT) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); + void (APIENTRY *PolygonOffsetEXT) (GLfloat factor, GLfloat bias); + void (APIENTRY *TexImage3DEXT) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); + void (APIENTRY *TexSubImage3DEXT) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); + void (APIENTRY *GetTexFilterFuncSGIS) (GLenum target, GLenum filter, GLfloat *weights); + void (APIENTRY *TexFilterFuncSGIS) (GLenum target, GLenum filter, GLsizei n, const GLfloat *weights); + void (APIENTRY *TexSubImage1DEXT) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); + void (APIENTRY *TexSubImage2DEXT) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); + void (APIENTRY *CopyTexImage1DEXT) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); + void (APIENTRY *CopyTexImage2DEXT) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); + void (APIENTRY *CopyTexSubImage1DEXT) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); + void (APIENTRY *CopyTexSubImage2DEXT) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); + void (APIENTRY *CopyTexSubImage3DEXT) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); + void (APIENTRY *GetHistogramEXT) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); + void (APIENTRY *GetHistogramParameterfvEXT) (GLenum target, GLenum pname, GLfloat *params); + void (APIENTRY *GetHistogramParameterivEXT) (GLenum target, GLenum pname, GLint *params); + void (APIENTRY *GetMinmaxEXT) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); + void (APIENTRY *GetMinmaxParameterfvEXT) (GLenum target, GLenum pname, GLfloat *params); + void (APIENTRY *GetMinmaxParameterivEXT) (GLenum target, GLenum pname, GLint *params); + void (APIENTRY *HistogramEXT) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); + void (APIENTRY *MinmaxEXT) (GLenum target, GLenum internalformat, GLboolean sink); + void (APIENTRY *ResetHistogramEXT) (GLenum target); + void (APIENTRY *ResetMinmaxEXT) (GLenum target); + void (APIENTRY *ConvolutionFilter1DEXT) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); + void (APIENTRY *ConvolutionFilter2DEXT) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); + void (APIENTRY *ConvolutionParameterfEXT) (GLenum target, GLenum pname, GLfloat params); + void (APIENTRY *ConvolutionParameterfvEXT) (GLenum target, GLenum pname, const GLfloat *params); + void (APIENTRY *ConvolutionParameteriEXT) (GLenum target, GLenum pname, GLint params); + void (APIENTRY *ConvolutionParameterivEXT) (GLenum target, GLenum pname, const GLint *params); + void (APIENTRY *CopyConvolutionFilter1DEXT) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); + void (APIENTRY *CopyConvolutionFilter2DEXT) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); + void (APIENTRY *GetConvolutionFilterEXT) (GLenum target, GLenum format, GLenum type, GLvoid *image); + void (APIENTRY *GetConvolutionParameterfvEXT) (GLenum target, GLenum pname, GLfloat *params); + void (APIENTRY *GetConvolutionParameterivEXT) (GLenum target, GLenum pname, GLint *params); + void (APIENTRY *GetSeparableFilterEXT) (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); + void (APIENTRY *SeparableFilter2DEXT) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column); + void (APIENTRY *ColorTableSGI) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); + void (APIENTRY *ColorTableParameterfvSGI) (GLenum target, GLenum pname, const GLfloat *params); + void (APIENTRY *ColorTableParameterivSGI) (GLenum target, GLenum pname, const GLint *params); + void (APIENTRY *CopyColorTableSGI) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); + void (APIENTRY *GetColorTableSGI) (GLenum target, GLenum format, GLenum type, GLvoid *table); + void (APIENTRY *GetColorTableParameterfvSGI) (GLenum target, GLenum pname, GLfloat *params); + void (APIENTRY *GetColorTableParameterivSGI) (GLenum target, GLenum pname, GLint *params); + void (APIENTRY *PixelTexGenSGIX) (GLenum mode); + void (APIENTRY *PixelTexGenParameteriSGIS) (GLenum pname, GLint param); + void (APIENTRY *PixelTexGenParameterivSGIS) (GLenum pname, const GLint *params); + void (APIENTRY *PixelTexGenParameterfSGIS) (GLenum pname, GLfloat param); + void (APIENTRY *PixelTexGenParameterfvSGIS) (GLenum pname, const GLfloat *params); + void (APIENTRY *GetPixelTexGenParameterivSGIS) (GLenum pname, GLint *params); + void (APIENTRY *GetPixelTexGenParameterfvSGIS) (GLenum pname, GLfloat *params); + void (APIENTRY *TexImage4DSGIS) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLint border, GLenum format, GLenum type, const GLvoid *pixels); + void (APIENTRY *TexSubImage4DSGIS) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLenum format, GLenum type, const GLvoid *pixels); + GLboolean (APIENTRY *AreTexturesResidentEXT) (GLsizei n, const GLuint *textures, GLboolean *residences); + void (APIENTRY *BindTextureEXT) (GLenum target, GLuint texture); + void (APIENTRY *DeleteTexturesEXT) (GLsizei n, const GLuint *textures); + void (APIENTRY *GenTexturesEXT) (GLsizei n, GLuint *textures); + GLboolean (APIENTRY *IsTextureEXT) (GLuint texture); + void (APIENTRY *PrioritizeTexturesEXT) (GLsizei n, const GLuint *textures, const GLclampf *priorities); + void (APIENTRY *DetailTexFuncSGIS) (GLenum target, GLsizei n, const GLfloat *points); + void (APIENTRY *GetDetailTexFuncSGIS) (GLenum target, GLfloat *points); + void (APIENTRY *SharpenTexFuncSGIS) (GLenum target, GLsizei n, const GLfloat *points); + void (APIENTRY *GetSharpenTexFuncSGIS) (GLenum target, GLfloat *points); + void (APIENTRY *SampleMaskSGIS) (GLclampf value, GLboolean invert); + void (APIENTRY *SamplePatternSGIS) (GLenum pattern); + void (APIENTRY *ArrayElementEXT) (GLint i); + void (APIENTRY *ColorPointerEXT) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); + void (APIENTRY *DrawArraysEXT) (GLenum mode, GLint first, GLsizei count); + void (APIENTRY *EdgeFlagPointerEXT) (GLsizei stride, GLsizei count, const GLboolean *pointer); + void (APIENTRY *GetPointervEXT) (GLenum pname, GLvoid* *params); + void (APIENTRY *IndexPointerEXT) (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); + void (APIENTRY *NormalPointerEXT) (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); + void (APIENTRY *TexCoordPointerEXT) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); + void (APIENTRY *VertexPointerEXT) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); + void (APIENTRY *BlendEquationEXT) (GLenum mode); + void (APIENTRY *SpriteParameterfSGIX) (GLenum pname, GLfloat param); + void (APIENTRY *SpriteParameterfvSGIX) (GLenum pname, const GLfloat *params); + void (APIENTRY *SpriteParameteriSGIX) (GLenum pname, GLint param); + void (APIENTRY *SpriteParameterivSGIX) (GLenum pname, const GLint *params); + void (APIENTRY *PointParameterfEXT) (GLenum pname, GLfloat param); + void (APIENTRY *PointParameterfvEXT) (GLenum pname, const GLfloat *params); + void (APIENTRY *PointParameterfSGIS) (GLenum pname, GLfloat param); + void (APIENTRY *PointParameterfvSGIS) (GLenum pname, const GLfloat *params); + GLint (APIENTRY *GetInstrumentsSGIX) (void); + void (APIENTRY *InstrumentsBufferSGIX) (GLsizei size, GLint *buffer); + GLint (APIENTRY *PollInstrumentsSGIX) (GLint *marker_p); + void (APIENTRY *ReadInstrumentsSGIX) (GLint marker); + void (APIENTRY *StartInstrumentsSGIX) (void); + void (APIENTRY *StopInstrumentsSGIX) (GLint marker); + void (APIENTRY *FrameZoomSGIX) (GLint factor); + void (APIENTRY *TagSampleBufferSGIX) (void); + void (APIENTRY *DeformationMap3dSGIX) (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, GLdouble w1, GLdouble w2, GLint wstride, GLint worder, const GLdouble *points); + void (APIENTRY *DeformationMap3fSGIX) (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, GLfloat w1, GLfloat w2, GLint wstride, GLint worder, const GLfloat *points); + void (APIENTRY *DeformSGIX) (GLbitfield mask); + void (APIENTRY *LoadIdentityDeformationMapSGIX) (GLbitfield mask); + void (APIENTRY *ReferencePlaneSGIX) (const GLdouble *equation); + void (APIENTRY *FlushRasterSGIX) (void); + void (APIENTRY *FogFuncSGIS) (GLsizei n, const GLfloat *points); + void (APIENTRY *GetFogFuncSGIS) (GLfloat *points); + void (APIENTRY *ImageTransformParameteriHP) (GLenum target, GLenum pname, GLint param); + void (APIENTRY *ImageTransformParameterfHP) (GLenum target, GLenum pname, GLfloat param); + void (APIENTRY *ImageTransformParameterivHP) (GLenum target, GLenum pname, const GLint *params); + void (APIENTRY *ImageTransformParameterfvHP) (GLenum target, GLenum pname, const GLfloat *params); + void (APIENTRY *GetImageTransformParameterivHP) (GLenum target, GLenum pname, GLint *params); + void (APIENTRY *GetImageTransformParameterfvHP) (GLenum target, GLenum pname, GLfloat *params); + void (APIENTRY *ColorSubTableEXT) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); + void (APIENTRY *CopyColorSubTableEXT) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); + void (APIENTRY *HintPGI) (GLenum target, GLint mode); + void (APIENTRY *ColorTableEXT) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); + void (APIENTRY *GetColorTableEXT) (GLenum target, GLenum format, GLenum type, GLvoid *data); + void (APIENTRY *GetColorTableParameterivEXT) (GLenum target, GLenum pname, GLint *params); + void (APIENTRY *GetColorTableParameterfvEXT) (GLenum target, GLenum pname, GLfloat *params); + void (APIENTRY *GetListParameterfvSGIX) (GLuint list, GLenum pname, GLfloat *params); + void (APIENTRY *GetListParameterivSGIX) (GLuint list, GLenum pname, GLint *params); + void (APIENTRY *ListParameterfSGIX) (GLuint list, GLenum pname, GLfloat param); + void (APIENTRY *ListParameterfvSGIX) (GLuint list, GLenum pname, const GLfloat *params); + void (APIENTRY *ListParameteriSGIX) (GLuint list, GLenum pname, GLint param); + void (APIENTRY *ListParameterivSGIX) (GLuint list, GLenum pname, const GLint *params); + void (APIENTRY *IndexMaterialEXT) (GLenum face, GLenum mode); + void (APIENTRY *IndexFuncEXT) (GLenum func, GLclampf ref); + void (APIENTRY *LockArraysEXT) (GLint first, GLsizei count); + void (APIENTRY *UnlockArraysEXT) (void); + void (APIENTRY *CullParameterdvEXT) (GLenum pname, GLdouble *params); + void (APIENTRY *CullParameterfvEXT) (GLenum pname, GLfloat *params); + void (APIENTRY *FragmentColorMaterialSGIX) (GLenum face, GLenum mode); + void (APIENTRY *FragmentLightfSGIX) (GLenum light, GLenum pname, GLfloat param); + void (APIENTRY *FragmentLightfvSGIX) (GLenum light, GLenum pname, const GLfloat *params); + void (APIENTRY *FragmentLightiSGIX) (GLenum light, GLenum pname, GLint param); + void (APIENTRY *FragmentLightivSGIX) (GLenum light, GLenum pname, const GLint *params); + void (APIENTRY *FragmentLightModelfSGIX) (GLenum pname, GLfloat param); + void (APIENTRY *FragmentLightModelfvSGIX) (GLenum pname, const GLfloat *params); + void (APIENTRY *FragmentLightModeliSGIX) (GLenum pname, GLint param); + void (APIENTRY *FragmentLightModelivSGIX) (GLenum pname, const GLint *params); + void (APIENTRY *FragmentMaterialfSGIX) (GLenum face, GLenum pname, GLfloat param); + void (APIENTRY *FragmentMaterialfvSGIX) (GLenum face, GLenum pname, const GLfloat *params); + void (APIENTRY *FragmentMaterialiSGIX) (GLenum face, GLenum pname, GLint param); + void (APIENTRY *FragmentMaterialivSGIX) (GLenum face, GLenum pname, const GLint *params); + void (APIENTRY *GetFragmentLightfvSGIX) (GLenum light, GLenum pname, GLfloat *params); + void (APIENTRY *GetFragmentLightivSGIX) (GLenum light, GLenum pname, GLint *params); + void (APIENTRY *GetFragmentMaterialfvSGIX) (GLenum face, GLenum pname, GLfloat *params); + void (APIENTRY *GetFragmentMaterialivSGIX) (GLenum face, GLenum pname, GLint *params); + void (APIENTRY *LightEnviSGIX) (GLenum pname, GLint param); + void (APIENTRY *DrawRangeElementsEXT) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); + void (APIENTRY *ApplyTextureEXT) (GLenum mode); + void (APIENTRY *TextureLightEXT) (GLenum pname); + void (APIENTRY *TextureMaterialEXT) (GLenum face, GLenum mode); + void (APIENTRY *AsyncMarkerSGIX) (GLuint marker); + GLint (APIENTRY *FinishAsyncSGIX) (GLuint *markerp); + GLint (APIENTRY *PollAsyncSGIX) (GLuint *markerp); + GLuint (APIENTRY *GenAsyncMarkersSGIX) (GLsizei range); + void (APIENTRY *DeleteAsyncMarkersSGIX) (GLuint marker, GLsizei range); + GLboolean (APIENTRY *IsAsyncMarkerSGIX) (GLuint marker); + void (APIENTRY *VertexPointervINTEL) (GLint size, GLenum type, const GLvoid* *pointer); + void (APIENTRY *NormalPointervINTEL) (GLenum type, const GLvoid* *pointer); + void (APIENTRY *ColorPointervINTEL) (GLint size, GLenum type, const GLvoid* *pointer); + void (APIENTRY *TexCoordPointervINTEL) (GLint size, GLenum type, const GLvoid* *pointer); + void (APIENTRY *PixelTransformParameteriEXT) (GLenum target, GLenum pname, GLint param); + void (APIENTRY *PixelTransformParameterfEXT) (GLenum target, GLenum pname, GLfloat param); + void (APIENTRY *PixelTransformParameterivEXT) (GLenum target, GLenum pname, const GLint *params); + void (APIENTRY *PixelTransformParameterfvEXT) (GLenum target, GLenum pname, const GLfloat *params); + void (APIENTRY *SecondaryColor3bEXT) (GLbyte red, GLbyte green, GLbyte blue); + void (APIENTRY *SecondaryColor3bvEXT) (const GLbyte *v); + void (APIENTRY *SecondaryColor3dEXT) (GLdouble red, GLdouble green, GLdouble blue); + void (APIENTRY *SecondaryColor3dvEXT) (const GLdouble *v); + void (APIENTRY *SecondaryColor3fEXT) (GLfloat red, GLfloat green, GLfloat blue); + void (APIENTRY *SecondaryColor3fvEXT) (const GLfloat *v); + void (APIENTRY *SecondaryColor3iEXT) (GLint red, GLint green, GLint blue); + void (APIENTRY *SecondaryColor3ivEXT) (const GLint *v); + void (APIENTRY *SecondaryColor3sEXT) (GLshort red, GLshort green, GLshort blue); + void (APIENTRY *SecondaryColor3svEXT) (const GLshort *v); + void (APIENTRY *SecondaryColor3ubEXT) (GLubyte red, GLubyte green, GLubyte blue); + void (APIENTRY *SecondaryColor3ubvEXT) (const GLubyte *v); + void (APIENTRY *SecondaryColor3uiEXT) (GLuint red, GLuint green, GLuint blue); + void (APIENTRY *SecondaryColor3uivEXT) (const GLuint *v); + void (APIENTRY *SecondaryColor3usEXT) (GLushort red, GLushort green, GLushort blue); + void (APIENTRY *SecondaryColor3usvEXT) (const GLushort *v); + void (APIENTRY *SecondaryColorPointerEXT) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); + void (APIENTRY *TextureNormalEXT) (GLenum mode); + void (APIENTRY *MultiDrawArraysEXT) (GLenum mode, GLint *first, GLsizei *count, GLsizei primcount); + void (APIENTRY *MultiDrawElementsEXT) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount); + void (APIENTRY *FogCoordfEXT) (GLfloat coord); + void (APIENTRY *FogCoordfvEXT) (const GLfloat *coord); + void (APIENTRY *FogCoorddEXT) (GLdouble coord); + void (APIENTRY *FogCoorddvEXT) (const GLdouble *coord); + void (APIENTRY *FogCoordPointerEXT) (GLenum type, GLsizei stride, const GLvoid *pointer); + void (APIENTRY *Tangent3bEXT) (GLbyte tx, GLbyte ty, GLbyte tz); + void (APIENTRY *Tangent3bvEXT) (const GLbyte *v); + void (APIENTRY *Tangent3dEXT) (GLdouble tx, GLdouble ty, GLdouble tz); + void (APIENTRY *Tangent3dvEXT) (const GLdouble *v); + void (APIENTRY *Tangent3fEXT) (GLfloat tx, GLfloat ty, GLfloat tz); + void (APIENTRY *Tangent3fvEXT) (const GLfloat *v); + void (APIENTRY *Tangent3iEXT) (GLint tx, GLint ty, GLint tz); + void (APIENTRY *Tangent3ivEXT) (const GLint *v); + void (APIENTRY *Tangent3sEXT) (GLshort tx, GLshort ty, GLshort tz); + void (APIENTRY *Tangent3svEXT) (const GLshort *v); + void (APIENTRY *Binormal3bEXT) (GLbyte bx, GLbyte by, GLbyte bz); + void (APIENTRY *Binormal3bvEXT) (const GLbyte *v); + void (APIENTRY *Binormal3dEXT) (GLdouble bx, GLdouble by, GLdouble bz); + void (APIENTRY *Binormal3dvEXT) (const GLdouble *v); + void (APIENTRY *Binormal3fEXT) (GLfloat bx, GLfloat by, GLfloat bz); + void (APIENTRY *Binormal3fvEXT) (const GLfloat *v); + void (APIENTRY *Binormal3iEXT) (GLint bx, GLint by, GLint bz); + void (APIENTRY *Binormal3ivEXT) (const GLint *v); + void (APIENTRY *Binormal3sEXT) (GLshort bx, GLshort by, GLshort bz); + void (APIENTRY *Binormal3svEXT) (const GLshort *v); + void (APIENTRY *TangentPointerEXT) (GLenum type, GLsizei stride, const GLvoid *pointer); + void (APIENTRY *BinormalPointerEXT) (GLenum type, GLsizei stride, const GLvoid *pointer); + void (APIENTRY *FinishTextureSUNX) (void); + void (APIENTRY *GlobalAlphaFactorbSUN) (GLbyte factor); + void (APIENTRY *GlobalAlphaFactorsSUN) (GLshort factor); + void (APIENTRY *GlobalAlphaFactoriSUN) (GLint factor); + void (APIENTRY *GlobalAlphaFactorfSUN) (GLfloat factor); + void (APIENTRY *GlobalAlphaFactordSUN) (GLdouble factor); + void (APIENTRY *GlobalAlphaFactorubSUN) (GLubyte factor); + void (APIENTRY *GlobalAlphaFactorusSUN) (GLushort factor); + void (APIENTRY *GlobalAlphaFactoruiSUN) (GLuint factor); + void (APIENTRY *ReplacementCodeuiSUN) (GLuint code); + void (APIENTRY *ReplacementCodeusSUN) (GLushort code); + void (APIENTRY *ReplacementCodeubSUN) (GLubyte code); + void (APIENTRY *ReplacementCodeuivSUN) (const GLuint *code); + void (APIENTRY *ReplacementCodeusvSUN) (const GLushort *code); + void (APIENTRY *ReplacementCodeubvSUN) (const GLubyte *code); + void (APIENTRY *ReplacementCodePointerSUN) (GLenum type, GLsizei stride, const GLvoid* *pointer); + void (APIENTRY *Color4ubVertex2fSUN) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y); + void (APIENTRY *Color4ubVertex2fvSUN) (const GLubyte *c, const GLfloat *v); + void (APIENTRY *Color4ubVertex3fSUN) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); + void (APIENTRY *Color4ubVertex3fvSUN) (const GLubyte *c, const GLfloat *v); + void (APIENTRY *Color3fVertex3fSUN) (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); + void (APIENTRY *Color3fVertex3fvSUN) (const GLfloat *c, const GLfloat *v); + void (APIENTRY *Normal3fVertex3fSUN) (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); + void (APIENTRY *Normal3fVertex3fvSUN) (const GLfloat *n, const GLfloat *v); + void (APIENTRY *Color4fNormal3fVertex3fSUN) (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); + void (APIENTRY *Color4fNormal3fVertex3fvSUN) (const GLfloat *c, const GLfloat *n, const GLfloat *v); + void (APIENTRY *TexCoord2fVertex3fSUN) (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); + void (APIENTRY *TexCoord2fVertex3fvSUN) (const GLfloat *tc, const GLfloat *v); + void (APIENTRY *TexCoord4fVertex4fSUN) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w); + void (APIENTRY *TexCoord4fVertex4fvSUN) (const GLfloat *tc, const GLfloat *v); + void (APIENTRY *TexCoord2fColor4ubVertex3fSUN) (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); + void (APIENTRY *TexCoord2fColor4ubVertex3fvSUN) (const GLfloat *tc, const GLubyte *c, const GLfloat *v); + void (APIENTRY *TexCoord2fColor3fVertex3fSUN) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); + void (APIENTRY *TexCoord2fColor3fVertex3fvSUN) (const GLfloat *tc, const GLfloat *c, const GLfloat *v); + void (APIENTRY *TexCoord2fNormal3fVertex3fSUN) (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); + void (APIENTRY *TexCoord2fNormal3fVertex3fvSUN) (const GLfloat *tc, const GLfloat *n, const GLfloat *v); + void (APIENTRY *TexCoord2fColor4fNormal3fVertex3fSUN) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); + void (APIENTRY *TexCoord2fColor4fNormal3fVertex3fvSUN) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); + void (APIENTRY *TexCoord4fColor4fNormal3fVertex4fSUN) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w); + void (APIENTRY *TexCoord4fColor4fNormal3fVertex4fvSUN) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); + void (APIENTRY *ReplacementCodeuiVertex3fSUN) (GLuint rc, GLfloat x, GLfloat y, GLfloat z); + void (APIENTRY *ReplacementCodeuiVertex3fvSUN) (const GLuint *rc, const GLfloat *v); + void (APIENTRY *ReplacementCodeuiColor4ubVertex3fSUN) (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); + void (APIENTRY *ReplacementCodeuiColor4ubVertex3fvSUN) (const GLuint *rc, const GLubyte *c, const GLfloat *v); + void (APIENTRY *ReplacementCodeuiColor3fVertex3fSUN) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); + void (APIENTRY *ReplacementCodeuiColor3fVertex3fvSUN) (const GLuint *rc, const GLfloat *c, const GLfloat *v); + void (APIENTRY *ReplacementCodeuiNormal3fVertex3fSUN) (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); + void (APIENTRY *ReplacementCodeuiNormal3fVertex3fvSUN) (const GLuint *rc, const GLfloat *n, const GLfloat *v); + void (APIENTRY *ReplacementCodeuiColor4fNormal3fVertex3fSUN) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); + void (APIENTRY *ReplacementCodeuiColor4fNormal3fVertex3fvSUN) (const GLuint *rc, const GLfloat *c, const GLfloat *n, const GLfloat *v); + void (APIENTRY *ReplacementCodeuiTexCoord2fVertex3fSUN) (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); + void (APIENTRY *ReplacementCodeuiTexCoord2fVertex3fvSUN) (const GLuint *rc, const GLfloat *tc, const GLfloat *v); + void (APIENTRY *ReplacementCodeuiTexCoord2fNormal3fVertex3fSUN) (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); + void (APIENTRY *ReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN) (const GLuint *rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v); + void (APIENTRY *ReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN) (GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); + void (APIENTRY *ReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN) (const GLuint *rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); + void (APIENTRY *BlendFuncSeparateEXT) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); + void (APIENTRY *BlendFuncSeparateINGR) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); + void (APIENTRY *VertexWeightfEXT) (GLfloat weight); + void (APIENTRY *VertexWeightfvEXT) (const GLfloat *weight); + void (APIENTRY *VertexWeightPointerEXT) (GLsizei size, GLenum type, GLsizei stride, const GLvoid *pointer); + void (APIENTRY *FlushVertexArrayRangeNV) (void); + void (APIENTRY *VertexArrayRangeNV) (GLsizei length, const GLvoid *pointer); + void (APIENTRY *CombinerParameterfvNV) (GLenum pname, const GLfloat *params); + void (APIENTRY *CombinerParameterfNV) (GLenum pname, GLfloat param); + void (APIENTRY *CombinerParameterivNV) (GLenum pname, const GLint *params); + void (APIENTRY *CombinerParameteriNV) (GLenum pname, GLint param); + void (APIENTRY *CombinerInputNV) (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); + void (APIENTRY *CombinerOutputNV) (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); + void (APIENTRY *FinalCombinerInputNV) (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); + void (APIENTRY *GetCombinerInputParameterfvNV) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat *params); + void (APIENTRY *GetCombinerInputParameterivNV) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint *params); + void (APIENTRY *GetCombinerOutputParameterfvNV) (GLenum stage, GLenum portion, GLenum pname, GLfloat *params); + void (APIENTRY *GetCombinerOutputParameterivNV) (GLenum stage, GLenum portion, GLenum pname, GLint *params); + void (APIENTRY *GetFinalCombinerInputParameterfvNV) (GLenum variable, GLenum pname, GLfloat *params); + void (APIENTRY *GetFinalCombinerInputParameterivNV) (GLenum variable, GLenum pname, GLint *params); + void (APIENTRY *ResizeBuffersMESA) (void); + void (APIENTRY *WindowPos2dMESA) (GLdouble x, GLdouble y); + void (APIENTRY *WindowPos2dvMESA) (const GLdouble *v); + void (APIENTRY *WindowPos2fMESA) (GLfloat x, GLfloat y); + void (APIENTRY *WindowPos2fvMESA) (const GLfloat *v); + void (APIENTRY *WindowPos2iMESA) (GLint x, GLint y); + void (APIENTRY *WindowPos2ivMESA) (const GLint *v); + void (APIENTRY *WindowPos2sMESA) (GLshort x, GLshort y); + void (APIENTRY *WindowPos2svMESA) (const GLshort *v); + void (APIENTRY *WindowPos3dMESA) (GLdouble x, GLdouble y, GLdouble z); + void (APIENTRY *WindowPos3dvMESA) (const GLdouble *v); + void (APIENTRY *WindowPos3fMESA) (GLfloat x, GLfloat y, GLfloat z); + void (APIENTRY *WindowPos3fvMESA) (const GLfloat *v); + void (APIENTRY *WindowPos3iMESA) (GLint x, GLint y, GLint z); + void (APIENTRY *WindowPos3ivMESA) (const GLint *v); + void (APIENTRY *WindowPos3sMESA) (GLshort x, GLshort y, GLshort z); + void (APIENTRY *WindowPos3svMESA) (const GLshort *v); + void (APIENTRY *WindowPos4dMESA) (GLdouble x, GLdouble y, GLdouble z, GLdouble w); + void (APIENTRY *WindowPos4dvMESA) (const GLdouble *v); + void (APIENTRY *WindowPos4fMESA) (GLfloat x, GLfloat y, GLfloat z, GLfloat w); + void (APIENTRY *WindowPos4fvMESA) (const GLfloat *v); + void (APIENTRY *WindowPos4iMESA) (GLint x, GLint y, GLint z, GLint w); + void (APIENTRY *WindowPos4ivMESA) (const GLint *v); + void (APIENTRY *WindowPos4sMESA) (GLshort x, GLshort y, GLshort z, GLshort w); + void (APIENTRY *WindowPos4svMESA) (const GLshort *v); + void (APIENTRY *MultiModeDrawArraysIBM) (const GLenum *mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride); + void (APIENTRY *MultiModeDrawElementsIBM) (const GLenum *mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei primcount, GLint modestride); + void (APIENTRY *ColorPointerListIBM) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); + void (APIENTRY *SecondaryColorPointerListIBM) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); + void (APIENTRY *EdgeFlagPointerListIBM) (GLint stride, const GLboolean* *pointer, GLint ptrstride); + void (APIENTRY *FogCoordPointerListIBM) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); + void (APIENTRY *IndexPointerListIBM) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); + void (APIENTRY *NormalPointerListIBM) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); + void (APIENTRY *TexCoordPointerListIBM) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); + void (APIENTRY *VertexPointerListIBM) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); + void (APIENTRY *TbufferMask3DFX) (GLuint mask); + void (APIENTRY *SampleMaskEXT) (GLclampf value, GLboolean invert); + void (APIENTRY *SamplePatternEXT) (GLenum pattern); + void (APIENTRY *TextureColorMaskSGIS) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); + void (APIENTRY *IglooInterfaceSGIX) (GLenum pname, const GLvoid *params); + void (APIENTRY *DeleteFencesNV) (GLsizei n, const GLuint *fences); + void (APIENTRY *GenFencesNV) (GLsizei n, GLuint *fences); + GLboolean (APIENTRY *IsFenceNV) (GLuint fence); + GLboolean (APIENTRY *TestFenceNV) (GLuint fence); + void (APIENTRY *GetFenceivNV) (GLuint fence, GLenum pname, GLint *params); + void (APIENTRY *FinishFenceNV) (GLuint fence); + void (APIENTRY *SetFenceNV) (GLuint fence, GLenum condition); + void (APIENTRY *MapControlPointsNV) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const GLvoid *points); + void (APIENTRY *MapParameterivNV) (GLenum target, GLenum pname, const GLint *params); + void (APIENTRY *MapParameterfvNV) (GLenum target, GLenum pname, const GLfloat *params); + void (APIENTRY *GetMapControlPointsNV) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, GLvoid *points); + void (APIENTRY *GetMapParameterivNV) (GLenum target, GLenum pname, GLint *params); + void (APIENTRY *GetMapParameterfvNV) (GLenum target, GLenum pname, GLfloat *params); + void (APIENTRY *GetMapAttribParameterivNV) (GLenum target, GLuint index, GLenum pname, GLint *params); + void (APIENTRY *GetMapAttribParameterfvNV) (GLenum target, GLuint index, GLenum pname, GLfloat *params); + void (APIENTRY *EvalMapsNV) (GLenum target, GLenum mode); + void (APIENTRY *CombinerStageParameterfvNV) (GLenum stage, GLenum pname, const GLfloat *params); + void (APIENTRY *GetCombinerStageParameterfvNV) (GLenum stage, GLenum pname, GLfloat *params); + GLboolean (APIENTRY *AreProgramsResidentNV) (GLsizei n, const GLuint *programs, GLboolean *residences); + void (APIENTRY *BindProgramNV) (GLenum target, GLuint id); + void (APIENTRY *DeleteProgramsNV) (GLsizei n, const GLuint *programs); + void (APIENTRY *ExecuteProgramNV) (GLenum target, GLuint id, const GLfloat *params); + void (APIENTRY *GenProgramsNV) (GLsizei n, GLuint *programs); + void (APIENTRY *GetProgramParameterdvNV) (GLenum target, GLuint index, GLenum pname, GLdouble *params); + void (APIENTRY *GetProgramParameterfvNV) (GLenum target, GLuint index, GLenum pname, GLfloat *params); + void (APIENTRY *GetProgramivNV) (GLuint id, GLenum pname, GLint *params); + void (APIENTRY *GetProgramStringNV) (GLuint id, GLenum pname, GLubyte *program); + void (APIENTRY *GetTrackMatrixivNV) (GLenum target, GLuint address, GLenum pname, GLint *params); + void (APIENTRY *GetVertexAttribdvNV) (GLuint index, GLenum pname, GLdouble *params); + void (APIENTRY *GetVertexAttribfvNV) (GLuint index, GLenum pname, GLfloat *params); + void (APIENTRY *GetVertexAttribivNV) (GLuint index, GLenum pname, GLint *params); + void (APIENTRY *GetVertexAttribPointervNV) (GLuint index, GLenum pname, GLvoid* *pointer); + GLboolean (APIENTRY *IsProgramNV) (GLuint id); + void (APIENTRY *LoadProgramNV) (GLenum target, GLuint id, GLsizei len, const GLubyte *program); + void (APIENTRY *ProgramParameter4dNV) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); + void (APIENTRY *ProgramParameter4dvNV) (GLenum target, GLuint index, const GLdouble *v); + void (APIENTRY *ProgramParameter4fNV) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); + void (APIENTRY *ProgramParameter4fvNV) (GLenum target, GLuint index, const GLfloat *v); + void (APIENTRY *ProgramParameters4dvNV) (GLenum target, GLuint index, GLuint count, const GLdouble *v); + void (APIENTRY *ProgramParameters4fvNV) (GLenum target, GLuint index, GLuint count, const GLfloat *v); + void (APIENTRY *RequestResidentProgramsNV) (GLsizei n, const GLuint *programs); + void (APIENTRY *TrackMatrixNV) (GLenum target, GLuint address, GLenum matrix, GLenum transform); + void (APIENTRY *VertexAttribPointerNV) (GLuint index, GLint fsize, GLenum type, GLsizei stride, const GLvoid *pointer); + void (APIENTRY *VertexAttrib1dNV) (GLuint index, GLdouble x); + void (APIENTRY *VertexAttrib1dvNV) (GLuint index, const GLdouble *v); + void (APIENTRY *VertexAttrib1fNV) (GLuint index, GLfloat x); + void (APIENTRY *VertexAttrib1fvNV) (GLuint index, const GLfloat *v); + void (APIENTRY *VertexAttrib1sNV) (GLuint index, GLshort x); + void (APIENTRY *VertexAttrib1svNV) (GLuint index, const GLshort *v); + void (APIENTRY *VertexAttrib2dNV) (GLuint index, GLdouble x, GLdouble y); + void (APIENTRY *VertexAttrib2dvNV) (GLuint index, const GLdouble *v); + void (APIENTRY *VertexAttrib2fNV) (GLuint index, GLfloat x, GLfloat y); + void (APIENTRY *VertexAttrib2fvNV) (GLuint index, const GLfloat *v); + void (APIENTRY *VertexAttrib2sNV) (GLuint index, GLshort x, GLshort y); + void (APIENTRY *VertexAttrib2svNV) (GLuint index, const GLshort *v); + void (APIENTRY *VertexAttrib3dNV) (GLuint index, GLdouble x, GLdouble y, GLdouble z); + void (APIENTRY *VertexAttrib3dvNV) (GLuint index, const GLdouble *v); + void (APIENTRY *VertexAttrib3fNV) (GLuint index, GLfloat x, GLfloat y, GLfloat z); + void (APIENTRY *VertexAttrib3fvNV) (GLuint index, const GLfloat *v); + void (APIENTRY *VertexAttrib3sNV) (GLuint index, GLshort x, GLshort y, GLshort z); + void (APIENTRY *VertexAttrib3svNV) (GLuint index, const GLshort *v); + void (APIENTRY *VertexAttrib4dNV) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); + void (APIENTRY *VertexAttrib4dvNV) (GLuint index, const GLdouble *v); + void (APIENTRY *VertexAttrib4fNV) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); + void (APIENTRY *VertexAttrib4fvNV) (GLuint index, const GLfloat *v); + void (APIENTRY *VertexAttrib4sNV) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); + void (APIENTRY *VertexAttrib4svNV) (GLuint index, const GLshort *v); + void (APIENTRY *VertexAttrib4ubNV) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); + void (APIENTRY *VertexAttrib4ubvNV) (GLuint index, const GLubyte *v); + void (APIENTRY *VertexAttribs1dvNV) (GLuint index, GLsizei count, const GLdouble *v); + void (APIENTRY *VertexAttribs1fvNV) (GLuint index, GLsizei count, const GLfloat *v); + void (APIENTRY *VertexAttribs1svNV) (GLuint index, GLsizei count, const GLshort *v); + void (APIENTRY *VertexAttribs2dvNV) (GLuint index, GLsizei count, const GLdouble *v); + void (APIENTRY *VertexAttribs2fvNV) (GLuint index, GLsizei count, const GLfloat *v); + void (APIENTRY *VertexAttribs2svNV) (GLuint index, GLsizei count, const GLshort *v); + void (APIENTRY *VertexAttribs3dvNV) (GLuint index, GLsizei count, const GLdouble *v); + void (APIENTRY *VertexAttribs3fvNV) (GLuint index, GLsizei count, const GLfloat *v); + void (APIENTRY *VertexAttribs3svNV) (GLuint index, GLsizei count, const GLshort *v); + void (APIENTRY *VertexAttribs4dvNV) (GLuint index, GLsizei count, const GLdouble *v); + void (APIENTRY *VertexAttribs4fvNV) (GLuint index, GLsizei count, const GLfloat *v); + void (APIENTRY *VertexAttribs4svNV) (GLuint index, GLsizei count, const GLshort *v); + void (APIENTRY *VertexAttribs4ubvNV) (GLuint index, GLsizei count, const GLubyte *v); + void (APIENTRY *TexBumpParameterivATI) (GLenum pname, const GLint *param); + void (APIENTRY *TexBumpParameterfvATI) (GLenum pname, const GLfloat *param); + void (APIENTRY *GetTexBumpParameterivATI) (GLenum pname, GLint *param); + void (APIENTRY *GetTexBumpParameterfvATI) (GLenum pname, GLfloat *param); + GLuint (APIENTRY *GenFragmentShadersATI) (GLuint range); + void (APIENTRY *BindFragmentShaderATI) (GLuint id); + void (APIENTRY *DeleteFragmentShaderATI) (GLuint id); + void (APIENTRY *BeginFragmentShaderATI) (void); + void (APIENTRY *EndFragmentShaderATI) (void); + void (APIENTRY *PassTexCoordATI) (GLuint dst, GLuint coord, GLenum swizzle); + void (APIENTRY *SampleMapATI) (GLuint dst, GLuint interp, GLenum swizzle); + void (APIENTRY *ColorFragmentOp1ATI) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); + void (APIENTRY *ColorFragmentOp2ATI) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); + void (APIENTRY *ColorFragmentOp3ATI) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); + void (APIENTRY *AlphaFragmentOp1ATI) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); + void (APIENTRY *AlphaFragmentOp2ATI) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); + void (APIENTRY *AlphaFragmentOp3ATI) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); + void (APIENTRY *SetFragmentShaderConstantATI) (GLuint dst, const GLfloat *value); + void (APIENTRY *PNTrianglesiATI) (GLenum pname, GLint param); + void (APIENTRY *PNTrianglesfATI) (GLenum pname, GLfloat param); + GLuint (APIENTRY *NewObjectBufferATI) (GLsizei size, const GLvoid *pointer, GLenum usage); + GLboolean (APIENTRY *IsObjectBufferATI) (GLuint buffer); + void (APIENTRY *UpdateObjectBufferATI) (GLuint buffer, GLuint offset, GLsizei size, const GLvoid *pointer, GLenum preserve); + void (APIENTRY *GetObjectBufferfvATI) (GLuint buffer, GLenum pname, GLfloat *params); + void (APIENTRY *GetObjectBufferivATI) (GLuint buffer, GLenum pname, GLint *params); + void (APIENTRY *FreeObjectBufferATI) (GLuint buffer); + void (APIENTRY *ArrayObjectATI) (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); + void (APIENTRY *GetArrayObjectfvATI) (GLenum array, GLenum pname, GLfloat *params); + void (APIENTRY *GetArrayObjectivATI) (GLenum array, GLenum pname, GLint *params); + void (APIENTRY *VariantArrayObjectATI) (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); + void (APIENTRY *GetVariantArrayObjectfvATI) (GLuint id, GLenum pname, GLfloat *params); + void (APIENTRY *GetVariantArrayObjectivATI) (GLuint id, GLenum pname, GLint *params); + void (APIENTRY *BeginVertexShaderEXT) (void); + void (APIENTRY *EndVertexShaderEXT) (void); + void (APIENTRY *BindVertexShaderEXT) (GLuint id); + GLuint (APIENTRY *GenVertexShadersEXT) (GLuint range); + void (APIENTRY *DeleteVertexShaderEXT) (GLuint id); + void (APIENTRY *ShaderOp1EXT) (GLenum op, GLuint res, GLuint arg1); + void (APIENTRY *ShaderOp2EXT) (GLenum op, GLuint res, GLuint arg1, GLuint arg2); + void (APIENTRY *ShaderOp3EXT) (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3); + void (APIENTRY *SwizzleEXT) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); + void (APIENTRY *WriteMaskEXT) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); + void (APIENTRY *InsertComponentEXT) (GLuint res, GLuint src, GLuint num); + void (APIENTRY *ExtractComponentEXT) (GLuint res, GLuint src, GLuint num); + GLuint (APIENTRY *GenSymbolsEXT) (GLenum datatype, GLenum storagetype, GLenum range, GLuint components); + void (APIENTRY *SetInvariantEXT) (GLuint id, GLenum type, const GLvoid *addr); + void (APIENTRY *SetLocalConstantEXT) (GLuint id, GLenum type, const GLvoid *addr); + void (APIENTRY *VariantbvEXT) (GLuint id, const GLbyte *addr); + void (APIENTRY *VariantsvEXT) (GLuint id, const GLshort *addr); + void (APIENTRY *VariantivEXT) (GLuint id, const GLint *addr); + void (APIENTRY *VariantfvEXT) (GLuint id, const GLfloat *addr); + void (APIENTRY *VariantdvEXT) (GLuint id, const GLdouble *addr); + void (APIENTRY *VariantubvEXT) (GLuint id, const GLubyte *addr); + void (APIENTRY *VariantusvEXT) (GLuint id, const GLushort *addr); + void (APIENTRY *VariantuivEXT) (GLuint id, const GLuint *addr); + void (APIENTRY *VariantPointerEXT) (GLuint id, GLenum type, GLuint stride, const GLvoid *addr); + void (APIENTRY *EnableVariantClientStateEXT) (GLuint id); + void (APIENTRY *DisableVariantClientStateEXT) (GLuint id); + GLuint (APIENTRY *BindLightParameterEXT) (GLenum light, GLenum value); + GLuint (APIENTRY *BindMaterialParameterEXT) (GLenum face, GLenum value); + GLuint (APIENTRY *BindTexGenParameterEXT) (GLenum unit, GLenum coord, GLenum value); + GLuint (APIENTRY *BindTextureUnitParameterEXT) (GLenum unit, GLenum value); + GLuint (APIENTRY *BindParameterEXT) (GLenum value); + GLboolean (APIENTRY *IsVariantEnabledEXT) (GLuint id, GLenum cap); + void (APIENTRY *GetVariantBooleanvEXT) (GLuint id, GLenum value, GLboolean *data); + void (APIENTRY *GetVariantIntegervEXT) (GLuint id, GLenum value, GLint *data); + void (APIENTRY *GetVariantFloatvEXT) (GLuint id, GLenum value, GLfloat *data); + void (APIENTRY *GetVariantPointervEXT) (GLuint id, GLenum value, GLvoid* *data); + void (APIENTRY *GetInvariantBooleanvEXT) (GLuint id, GLenum value, GLboolean *data); + void (APIENTRY *GetInvariantIntegervEXT) (GLuint id, GLenum value, GLint *data); + void (APIENTRY *GetInvariantFloatvEXT) (GLuint id, GLenum value, GLfloat *data); + void (APIENTRY *GetLocalConstantBooleanvEXT) (GLuint id, GLenum value, GLboolean *data); + void (APIENTRY *GetLocalConstantIntegervEXT) (GLuint id, GLenum value, GLint *data); + void (APIENTRY *GetLocalConstantFloatvEXT) (GLuint id, GLenum value, GLfloat *data); + void (APIENTRY *VertexStream1sATI) (GLenum stream, GLshort x); + void (APIENTRY *VertexStream1svATI) (GLenum stream, const GLshort *coords); + void (APIENTRY *VertexStream1iATI) (GLenum stream, GLint x); + void (APIENTRY *VertexStream1ivATI) (GLenum stream, const GLint *coords); + void (APIENTRY *VertexStream1fATI) (GLenum stream, GLfloat x); + void (APIENTRY *VertexStream1fvATI) (GLenum stream, const GLfloat *coords); + void (APIENTRY *VertexStream1dATI) (GLenum stream, GLdouble x); + void (APIENTRY *VertexStream1dvATI) (GLenum stream, const GLdouble *coords); + void (APIENTRY *VertexStream2sATI) (GLenum stream, GLshort x, GLshort y); + void (APIENTRY *VertexStream2svATI) (GLenum stream, const GLshort *coords); + void (APIENTRY *VertexStream2iATI) (GLenum stream, GLint x, GLint y); + void (APIENTRY *VertexStream2ivATI) (GLenum stream, const GLint *coords); + void (APIENTRY *VertexStream2fATI) (GLenum stream, GLfloat x, GLfloat y); + void (APIENTRY *VertexStream2fvATI) (GLenum stream, const GLfloat *coords); + void (APIENTRY *VertexStream2dATI) (GLenum stream, GLdouble x, GLdouble y); + void (APIENTRY *VertexStream2dvATI) (GLenum stream, const GLdouble *coords); + void (APIENTRY *VertexStream3sATI) (GLenum stream, GLshort x, GLshort y, GLshort z); + void (APIENTRY *VertexStream3svATI) (GLenum stream, const GLshort *coords); + void (APIENTRY *VertexStream3iATI) (GLenum stream, GLint x, GLint y, GLint z); + void (APIENTRY *VertexStream3ivATI) (GLenum stream, const GLint *coords); + void (APIENTRY *VertexStream3fATI) (GLenum stream, GLfloat x, GLfloat y, GLfloat z); + void (APIENTRY *VertexStream3fvATI) (GLenum stream, const GLfloat *coords); + void (APIENTRY *VertexStream3dATI) (GLenum stream, GLdouble x, GLdouble y, GLdouble z); + void (APIENTRY *VertexStream3dvATI) (GLenum stream, const GLdouble *coords); + void (APIENTRY *VertexStream4sATI) (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w); + void (APIENTRY *VertexStream4svATI) (GLenum stream, const GLshort *coords); + void (APIENTRY *VertexStream4iATI) (GLenum stream, GLint x, GLint y, GLint z, GLint w); + void (APIENTRY *VertexStream4ivATI) (GLenum stream, const GLint *coords); + void (APIENTRY *VertexStream4fATI) (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w); + void (APIENTRY *VertexStream4fvATI) (GLenum stream, const GLfloat *coords); + void (APIENTRY *VertexStream4dATI) (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w); + void (APIENTRY *VertexStream4dvATI) (GLenum stream, const GLdouble *coords); + void (APIENTRY *NormalStream3bATI) (GLenum stream, GLbyte nx, GLbyte ny, GLbyte nz); + void (APIENTRY *NormalStream3bvATI) (GLenum stream, const GLbyte *coords); + void (APIENTRY *NormalStream3sATI) (GLenum stream, GLshort nx, GLshort ny, GLshort nz); + void (APIENTRY *NormalStream3svATI) (GLenum stream, const GLshort *coords); + void (APIENTRY *NormalStream3iATI) (GLenum stream, GLint nx, GLint ny, GLint nz); + void (APIENTRY *NormalStream3ivATI) (GLenum stream, const GLint *coords); + void (APIENTRY *NormalStream3fATI) (GLenum stream, GLfloat nx, GLfloat ny, GLfloat nz); + void (APIENTRY *NormalStream3fvATI) (GLenum stream, const GLfloat *coords); + void (APIENTRY *NormalStream3dATI) (GLenum stream, GLdouble nx, GLdouble ny, GLdouble nz); + void (APIENTRY *NormalStream3dvATI) (GLenum stream, const GLdouble *coords); + void (APIENTRY *ClientActiveVertexStreamATI) (GLenum stream); + void (APIENTRY *VertexBlendEnviATI) (GLenum pname, GLint param); + void (APIENTRY *VertexBlendEnvfATI) (GLenum pname, GLfloat param); + void (APIENTRY *ElementPointerATI) (GLenum type, const GLvoid *pointer); + void (APIENTRY *DrawElementArrayATI) (GLenum mode, GLsizei count); + void (APIENTRY *DrawRangeElementArrayATI) (GLenum mode, GLuint start, GLuint end, GLsizei count); + void (APIENTRY *DrawMeshArraysSUN) (GLenum mode, GLint first, GLsizei count, GLsizei width); + void (APIENTRY *GenOcclusionQueriesNV) (GLsizei n, GLuint *ids); + void (APIENTRY *DeleteOcclusionQueriesNV) (GLsizei n, const GLuint *ids); + GLboolean (APIENTRY *IsOcclusionQueryNV) (GLuint id); + void (APIENTRY *BeginOcclusionQueryNV) (GLuint id); + void (APIENTRY *EndOcclusionQueryNV) (void); + void (APIENTRY *GetOcclusionQueryivNV) (GLuint id, GLenum pname, GLint *params); + void (APIENTRY *GetOcclusionQueryuivNV) (GLuint id, GLenum pname, GLuint *params); + void (APIENTRY *PointParameteriNV) (GLenum pname, GLint param); + void (APIENTRY *PointParameterivNV) (GLenum pname, const GLint *params); + void (APIENTRY *ActiveStencilFaceEXT) (GLenum face); + void (APIENTRY *ElementPointerAPPLE) (GLenum type, const GLvoid *pointer); + void (APIENTRY *DrawElementArrayAPPLE) (GLenum mode, GLint first, GLsizei count); + void (APIENTRY *DrawRangeElementArrayAPPLE) (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count); + void (APIENTRY *MultiDrawElementArrayAPPLE) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); + void (APIENTRY *MultiDrawRangeElementArrayAPPLE) (GLenum mode, GLuint start, GLuint end, const GLint *first, const GLsizei *count, GLsizei primcount); + void (APIENTRY *GenFencesAPPLE) (GLsizei n, GLuint *fences); + void (APIENTRY *DeleteFencesAPPLE) (GLsizei n, const GLuint *fences); + void (APIENTRY *SetFenceAPPLE) (GLuint fence); + GLboolean (APIENTRY *IsFenceAPPLE) (GLuint fence); + GLboolean (APIENTRY *TestFenceAPPLE) (GLuint fence); + void (APIENTRY *FinishFenceAPPLE) (GLuint fence); + GLboolean (APIENTRY *TestObjectAPPLE) (GLenum object, GLuint name); + void (APIENTRY *FinishObjectAPPLE) (GLenum object, GLint name); + void (APIENTRY *BindVertexArrayAPPLE) (GLuint array); + void (APIENTRY *DeleteVertexArraysAPPLE) (GLsizei n, const GLuint *arrays); + void (APIENTRY *GenVertexArraysAPPLE) (GLsizei n, const GLuint *arrays); + GLboolean (APIENTRY *IsVertexArrayAPPLE) (GLuint array); + void (APIENTRY *VertexArrayRangeAPPLE) (GLsizei length, GLvoid *pointer); + void (APIENTRY *FlushVertexArrayRangeAPPLE) (GLsizei length, GLvoid *pointer); + void (APIENTRY *VertexArrayParameteriAPPLE) (GLenum pname, GLint param); + void (APIENTRY *DrawBuffersATI) (GLsizei n, const GLenum *bufs); + void (APIENTRY *ProgramNamedParameter4fNV) (GLuint id, GLsizei len, const GLubyte *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); + void (APIENTRY *ProgramNamedParameter4dNV) (GLuint id, GLsizei len, const GLubyte *name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); + void (APIENTRY *ProgramNamedParameter4fvNV) (GLuint id, GLsizei len, const GLubyte *name, const GLfloat *v); + void (APIENTRY *ProgramNamedParameter4dvNV) (GLuint id, GLsizei len, const GLubyte *name, const GLdouble *v); + void (APIENTRY *GetProgramNamedParameterfvNV) (GLuint id, GLsizei len, const GLubyte *name, GLfloat *params); + void (APIENTRY *GetProgramNamedParameterdvNV) (GLuint id, GLsizei len, const GLubyte *name, GLdouble *params); + void (APIENTRY *Vertex2hNV) (GLhalfNV x, GLhalfNV y); + void (APIENTRY *Vertex2hvNV) (const GLhalfNV *v); + void (APIENTRY *Vertex3hNV) (GLhalfNV x, GLhalfNV y, GLhalfNV z); + void (APIENTRY *Vertex3hvNV) (const GLhalfNV *v); + void (APIENTRY *Vertex4hNV) (GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); + void (APIENTRY *Vertex4hvNV) (const GLhalfNV *v); + void (APIENTRY *Normal3hNV) (GLhalfNV nx, GLhalfNV ny, GLhalfNV nz); + void (APIENTRY *Normal3hvNV) (const GLhalfNV *v); + void (APIENTRY *Color3hNV) (GLhalfNV red, GLhalfNV green, GLhalfNV blue); + void (APIENTRY *Color3hvNV) (const GLhalfNV *v); + void (APIENTRY *Color4hNV) (GLhalfNV red, GLhalfNV green, GLhalfNV blue, GLhalfNV alpha); + void (APIENTRY *Color4hvNV) (const GLhalfNV *v); + void (APIENTRY *TexCoord1hNV) (GLhalfNV s); + void (APIENTRY *TexCoord1hvNV) (const GLhalfNV *v); + void (APIENTRY *TexCoord2hNV) (GLhalfNV s, GLhalfNV t); + void (APIENTRY *TexCoord2hvNV) (const GLhalfNV *v); + void (APIENTRY *TexCoord3hNV) (GLhalfNV s, GLhalfNV t, GLhalfNV r); + void (APIENTRY *TexCoord3hvNV) (const GLhalfNV *v); + void (APIENTRY *TexCoord4hNV) (GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); + void (APIENTRY *TexCoord4hvNV) (const GLhalfNV *v); + void (APIENTRY *MultiTexCoord1hNV) (GLenum target, GLhalfNV s); + void (APIENTRY *MultiTexCoord1hvNV) (GLenum target, const GLhalfNV *v); + void (APIENTRY *MultiTexCoord2hNV) (GLenum target, GLhalfNV s, GLhalfNV t); + void (APIENTRY *MultiTexCoord2hvNV) (GLenum target, const GLhalfNV *v); + void (APIENTRY *MultiTexCoord3hNV) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r); + void (APIENTRY *MultiTexCoord3hvNV) (GLenum target, const GLhalfNV *v); + void (APIENTRY *MultiTexCoord4hNV) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); + void (APIENTRY *MultiTexCoord4hvNV) (GLenum target, const GLhalfNV *v); + void (APIENTRY *FogCoordhNV) (GLhalfNV fog); + void (APIENTRY *FogCoordhvNV) (const GLhalfNV *fog); + void (APIENTRY *SecondaryColor3hNV) (GLhalfNV red, GLhalfNV green, GLhalfNV blue); + void (APIENTRY *SecondaryColor3hvNV) (const GLhalfNV *v); + void (APIENTRY *VertexWeighthNV) (GLhalfNV weight); + void (APIENTRY *VertexWeighthvNV) (const GLhalfNV *weight); + void (APIENTRY *VertexAttrib1hNV) (GLuint index, GLhalfNV x); + void (APIENTRY *VertexAttrib1hvNV) (GLuint index, const GLhalfNV *v); + void (APIENTRY *VertexAttrib2hNV) (GLuint index, GLhalfNV x, GLhalfNV y); + void (APIENTRY *VertexAttrib2hvNV) (GLuint index, const GLhalfNV *v); + void (APIENTRY *VertexAttrib3hNV) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z); + void (APIENTRY *VertexAttrib3hvNV) (GLuint index, const GLhalfNV *v); + void (APIENTRY *VertexAttrib4hNV) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); + void (APIENTRY *VertexAttrib4hvNV) (GLuint index, const GLhalfNV *v); + void (APIENTRY *VertexAttribs1hvNV) (GLuint index, GLsizei n, const GLhalfNV *v); + void (APIENTRY *VertexAttribs2hvNV) (GLuint index, GLsizei n, const GLhalfNV *v); + void (APIENTRY *VertexAttribs3hvNV) (GLuint index, GLsizei n, const GLhalfNV *v); + void (APIENTRY *VertexAttribs4hvNV) (GLuint index, GLsizei n, const GLhalfNV *v); + void (APIENTRY *PixelDataRangeNV) (GLenum target, GLsizei length, GLvoid *pointer); + void (APIENTRY *FlushPixelDataRangeNV) (GLenum target); + void (APIENTRY *PrimitiveRestartNV) (void); + void (APIENTRY *PrimitiveRestartIndexNV) (GLuint index); + GLvoid* (APIENTRY *MapObjectBufferATI) (GLuint buffer); + void (APIENTRY *UnmapObjectBufferATI) (GLuint buffer); + void (APIENTRY *StencilOpSeparateATI) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); + void (APIENTRY *StencilFuncSeparateATI) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); + void (APIENTRY *VertexAttribArrayObjectATI) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset); + void (APIENTRY *GetVertexAttribArrayObjectfvATI) (GLuint index, GLenum pname, GLfloat *params); + void (APIENTRY *GetVertexAttribArrayObjectivATI) (GLuint index, GLenum pname, GLint *params); + void (APIENTRY *DepthBoundsEXT) (GLclampd zmin, GLclampd zmax); + void (APIENTRY *BlendEquationSeparateEXT) (GLenum modeRGB, GLenum modeAlpha); + void (APIENTRY *AddSwapHintRectWIN) (GLint x, GLint y, GLsizei width, GLsizei height); +#ifdef _WIN32 + HANDLE (WINAPI *CreateBufferRegionARB) (HDC hDC, int iLayerPlane, UINT uType); + VOID (WINAPI *DeleteBufferRegionARB) (HANDLE hRegion); + BOOL (WINAPI *SaveBufferRegionARB) (HANDLE hRegion, int x, int y, int width, int height); + BOOL (WINAPI *RestoreBufferRegionARB) (HANDLE hRegion, int x, int y, int width, int height, int xSrc, int ySrc); + const int (WINAPI *GetExtensionsStringARB) (HDC hdc); + BOOL (WINAPI *GetPixelFormatAttribivARB) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, int *piValues); + BOOL (WINAPI *GetPixelFormatAttribfvARB) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, FLOAT *pfValues); + BOOL (WINAPI *ChoosePixelFormatARB) (HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats); + BOOL (WINAPI *MakeContextCurrentARB) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc); + HDC (WINAPI *GetCurrentReadDCARB) (void); + HPBUFFERARB (WINAPI *CreatePbufferARB) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int *piAttribList); + HDC (WINAPI *GetPbufferDCARB) (HPBUFFERARB hPbuffer); + int (WINAPI *ReleasePbufferDCARB) (HPBUFFERARB hPbuffer, HDC hDC); + BOOL (WINAPI *DestroyPbufferARB) (HPBUFFERARB hPbuffer); + BOOL (WINAPI *QueryPbufferARB) (HPBUFFERARB hPbuffer, int iAttribute, int *piValue); + BOOL (WINAPI *BindTexImageARB) (HPBUFFERARB hPbuffer, int iBuffer); + BOOL (WINAPI *ReleaseTexImageARB) (HPBUFFERARB hPbuffer, int iBuffer); + BOOL (WINAPI *SetPbufferAttribARB) (HPBUFFERARB hPbuffer, const int *piAttribList); + GLboolean (WINAPI *CreateDisplayColorTableEXT) (GLushort id); + GLboolean (WINAPI *LoadDisplayColorTableEXT) (const GLushort *table, GLuint length); + GLboolean (WINAPI *BindDisplayColorTableEXT) (GLushort id); + VOID (WINAPI *DestroyDisplayColorTableEXT) (GLushort id); + const int (WINAPI *GetExtensionsStringEXT) (void); + BOOL (WINAPI *MakeContextCurrentEXT) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc); + HDC (WINAPI *GetCurrentReadDCEXT) (void); + HPBUFFEREXT (WINAPI *CreatePbufferEXT) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int *piAttribList); + HDC (WINAPI *GetPbufferDCEXT) (HPBUFFEREXT hPbuffer); + int (WINAPI *ReleasePbufferDCEXT) (HPBUFFEREXT hPbuffer, HDC hDC); + BOOL (WINAPI *DestroyPbufferEXT) (HPBUFFEREXT hPbuffer); + BOOL (WINAPI *QueryPbufferEXT) (HPBUFFEREXT hPbuffer, int iAttribute, int *piValue); + BOOL (WINAPI *GetPixelFormatAttribivEXT) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int *piAttributes, int *piValues); + BOOL (WINAPI *GetPixelFormatAttribfvEXT) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int *piAttributes, FLOAT *pfValues); + BOOL (WINAPI *ChoosePixelFormatEXT) (HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats); + BOOL (WINAPI *SwapIntervalEXT) (int interval); + int (WINAPI *GetSwapIntervalEXT) (void); + void* (WINAPI *AllocateMemoryNV) (GLsizei size, GLfloat readfreq, GLfloat writefreq, GLfloat priority); + void (WINAPI *FreeMemoryNV) (void); + BOOL (WINAPI *GetSyncValuesOML) (HDC hdc, INT64 *ust, INT64 *msc, INT64 *sbc); + BOOL (WINAPI *GetMscRateOML) (HDC hdc, INT32 *numerator, INT32 *denominator); + INT64 (WINAPI *SwapBuffersMscOML) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder); + INT64 (WINAPI *SwapLayerBuffersMscOML) (HDC hdc, int fuPlanes, INT64 target_msc, INT64 divisor, INT64 remainder); + BOOL (WINAPI *WaitForMscOML) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder, INT64 *ust, INT64 *msc, INT64 *sbc); + BOOL (WINAPI *WaitForSbcOML) (HDC hdc, INT64 target_sbc, INT64 *ust, INT64 *msc, INT64 *sbc); + BOOL (WINAPI *GetDigitalVideoParametersI3D) (HDC hDC, int iAttribute, int *piValue); + BOOL (WINAPI *SetDigitalVideoParametersI3D) (HDC hDC, int iAttribute, const int *piValue); + BOOL (WINAPI *GetGammaTableParametersI3D) (HDC hDC, int iAttribute, int *piValue); + BOOL (WINAPI *SetGammaTableParametersI3D) (HDC hDC, int iAttribute, const int *piValue); + BOOL (WINAPI *GetGammaTableI3D) (HDC hDC, int iEntries, USHORT *puRed, USHORT *puGreen, USHORT *puBlue); + BOOL (WINAPI *SetGammaTableI3D) (HDC hDC, int iEntries, const USHORT *puRed, const USHORT *puGreen, const USHORT *puBlue); + BOOL (WINAPI *EnableGenlockI3D) (HDC hDC); + BOOL (WINAPI *DisableGenlockI3D) (HDC hDC); + BOOL (WINAPI *IsEnabledGenlockI3D) (HDC hDC, BOOL *pFlag); + BOOL (WINAPI *GenlockSourceI3D) (HDC hDC, UINT uSource); + BOOL (WINAPI *GetGenlockSourceI3D) (HDC hDC, UINT *uSource); + BOOL (WINAPI *GenlockSourceEdgeI3D) (HDC hDC, UINT uEdge); + BOOL (WINAPI *GetGenlockSourceEdgeI3D) (HDC hDC, UINT *uEdge); + BOOL (WINAPI *GenlockSampleRateI3D) (HDC hDC, UINT uRate); + BOOL (WINAPI *GetGenlockSampleRateI3D) (HDC hDC, UINT *uRate); + BOOL (WINAPI *GenlockSourceDelayI3D) (HDC hDC, UINT uDelay); + BOOL (WINAPI *GetGenlockSourceDelayI3D) (HDC hDC, UINT *uDelay); + BOOL (WINAPI *QueryGenlockMaxSourceDelayI3D) (HDC hDC, UINT *uMaxLineDelay, UINT *uMaxPixelDelay); + LPVOID (WINAPI *CreateImageBufferI3D) (HDC hDC, DWORD dwSize, UINT uFlags); + BOOL (WINAPI *DestroyImageBufferI3D) (HDC hDC, LPVOID pAddress); + BOOL (WINAPI *AssociateImageBufferEventsI3D) (HDC hDC, const HANDLE *pEvent, const LPVOID *pAddress, const DWORD *pSize, UINT count); + BOOL (WINAPI *ReleaseImageBufferEventsI3D) (HDC hDC, const LPVOID *pAddress, UINT count); + BOOL (WINAPI *EnableFrameLockI3D) (void); + BOOL (WINAPI *DisableFrameLockI3D) (void); + BOOL (WINAPI *IsEnabledFrameLockI3D) (BOOL *pFlag); + BOOL (WINAPI *QueryFrameLockMasterI3D) (BOOL *pFlag); + BOOL (WINAPI *GetFrameUsageI3D) (float *pUsage); + BOOL (WINAPI *BeginFrameTrackingI3D) (void); + BOOL (WINAPI *EndFrameTrackingI3D) (void); + BOOL (WINAPI *QueryFrameTrackingI3D) (DWORD *pFrameCount, DWORD *pMissedFrames, float *pLastMissedUsage); +#endif /* _WIN32 */ +} _GLextensionProcs; + +#define glBlendColor (_GET_TLS_PROCTABLE()->BlendColor) +#define glBlendEquation (_GET_TLS_PROCTABLE()->BlendEquation) +#define glDrawRangeElements (_GET_TLS_PROCTABLE()->DrawRangeElements) +#define glColorTable (_GET_TLS_PROCTABLE()->ColorTable) +#define glColorTableParameterfv (_GET_TLS_PROCTABLE()->ColorTableParameterfv) +#define glColorTableParameteriv (_GET_TLS_PROCTABLE()->ColorTableParameteriv) +#define glCopyColorTable (_GET_TLS_PROCTABLE()->CopyColorTable) +#define glGetColorTable (_GET_TLS_PROCTABLE()->GetColorTable) +#define glGetColorTableParameterfv (_GET_TLS_PROCTABLE()->GetColorTableParameterfv) +#define glGetColorTableParameteriv (_GET_TLS_PROCTABLE()->GetColorTableParameteriv) +#define glColorSubTable (_GET_TLS_PROCTABLE()->ColorSubTable) +#define glCopyColorSubTable (_GET_TLS_PROCTABLE()->CopyColorSubTable) +#define glConvolutionFilter1D (_GET_TLS_PROCTABLE()->ConvolutionFilter1D) +#define glConvolutionFilter2D (_GET_TLS_PROCTABLE()->ConvolutionFilter2D) +#define glConvolutionParameterf (_GET_TLS_PROCTABLE()->ConvolutionParameterf) +#define glConvolutionParameterfv (_GET_TLS_PROCTABLE()->ConvolutionParameterfv) +#define glConvolutionParameteri (_GET_TLS_PROCTABLE()->ConvolutionParameteri) +#define glConvolutionParameteriv (_GET_TLS_PROCTABLE()->ConvolutionParameteriv) +#define glCopyConvolutionFilter1D (_GET_TLS_PROCTABLE()->CopyConvolutionFilter1D) +#define glCopyConvolutionFilter2D (_GET_TLS_PROCTABLE()->CopyConvolutionFilter2D) +#define glGetConvolutionFilter (_GET_TLS_PROCTABLE()->GetConvolutionFilter) +#define glGetConvolutionParameterfv (_GET_TLS_PROCTABLE()->GetConvolutionParameterfv) +#define glGetConvolutionParameteriv (_GET_TLS_PROCTABLE()->GetConvolutionParameteriv) +#define glGetSeparableFilter (_GET_TLS_PROCTABLE()->GetSeparableFilter) +#define glSeparableFilter2D (_GET_TLS_PROCTABLE()->SeparableFilter2D) +#define glGetHistogram (_GET_TLS_PROCTABLE()->GetHistogram) +#define glGetHistogramParameterfv (_GET_TLS_PROCTABLE()->GetHistogramParameterfv) +#define glGetHistogramParameteriv (_GET_TLS_PROCTABLE()->GetHistogramParameteriv) +#define glGetMinmax (_GET_TLS_PROCTABLE()->GetMinmax) +#define glGetMinmaxParameterfv (_GET_TLS_PROCTABLE()->GetMinmaxParameterfv) +#define glGetMinmaxParameteriv (_GET_TLS_PROCTABLE()->GetMinmaxParameteriv) +#define glHistogram (_GET_TLS_PROCTABLE()->Histogram) +#define glMinmax (_GET_TLS_PROCTABLE()->Minmax) +#define glResetHistogram (_GET_TLS_PROCTABLE()->ResetHistogram) +#define glResetMinmax (_GET_TLS_PROCTABLE()->ResetMinmax) +#define glTexImage3D (_GET_TLS_PROCTABLE()->TexImage3D) +#define glTexSubImage3D (_GET_TLS_PROCTABLE()->TexSubImage3D) +#define glCopyTexSubImage3D (_GET_TLS_PROCTABLE()->CopyTexSubImage3D) +#define glActiveTexture (_GET_TLS_PROCTABLE()->ActiveTexture) +#define glClientActiveTexture (_GET_TLS_PROCTABLE()->ClientActiveTexture) +#define glMultiTexCoord1d (_GET_TLS_PROCTABLE()->MultiTexCoord1d) +#define glMultiTexCoord1dv (_GET_TLS_PROCTABLE()->MultiTexCoord1dv) +#define glMultiTexCoord1f (_GET_TLS_PROCTABLE()->MultiTexCoord1f) +#define glMultiTexCoord1fv (_GET_TLS_PROCTABLE()->MultiTexCoord1fv) +#define glMultiTexCoord1i (_GET_TLS_PROCTABLE()->MultiTexCoord1i) +#define glMultiTexCoord1iv (_GET_TLS_PROCTABLE()->MultiTexCoord1iv) +#define glMultiTexCoord1s (_GET_TLS_PROCTABLE()->MultiTexCoord1s) +#define glMultiTexCoord1sv (_GET_TLS_PROCTABLE()->MultiTexCoord1sv) +#define glMultiTexCoord2d (_GET_TLS_PROCTABLE()->MultiTexCoord2d) +#define glMultiTexCoord2dv (_GET_TLS_PROCTABLE()->MultiTexCoord2dv) +#define glMultiTexCoord2f (_GET_TLS_PROCTABLE()->MultiTexCoord2f) +#define glMultiTexCoord2fv (_GET_TLS_PROCTABLE()->MultiTexCoord2fv) +#define glMultiTexCoord2i (_GET_TLS_PROCTABLE()->MultiTexCoord2i) +#define glMultiTexCoord2iv (_GET_TLS_PROCTABLE()->MultiTexCoord2iv) +#define glMultiTexCoord2s (_GET_TLS_PROCTABLE()->MultiTexCoord2s) +#define glMultiTexCoord2sv (_GET_TLS_PROCTABLE()->MultiTexCoord2sv) +#define glMultiTexCoord3d (_GET_TLS_PROCTABLE()->MultiTexCoord3d) +#define glMultiTexCoord3dv (_GET_TLS_PROCTABLE()->MultiTexCoord3dv) +#define glMultiTexCoord3f (_GET_TLS_PROCTABLE()->MultiTexCoord3f) +#define glMultiTexCoord3fv (_GET_TLS_PROCTABLE()->MultiTexCoord3fv) +#define glMultiTexCoord3i (_GET_TLS_PROCTABLE()->MultiTexCoord3i) +#define glMultiTexCoord3iv (_GET_TLS_PROCTABLE()->MultiTexCoord3iv) +#define glMultiTexCoord3s (_GET_TLS_PROCTABLE()->MultiTexCoord3s) +#define glMultiTexCoord3sv (_GET_TLS_PROCTABLE()->MultiTexCoord3sv) +#define glMultiTexCoord4d (_GET_TLS_PROCTABLE()->MultiTexCoord4d) +#define glMultiTexCoord4dv (_GET_TLS_PROCTABLE()->MultiTexCoord4dv) +#define glMultiTexCoord4f (_GET_TLS_PROCTABLE()->MultiTexCoord4f) +#define glMultiTexCoord4fv (_GET_TLS_PROCTABLE()->MultiTexCoord4fv) +#define glMultiTexCoord4i (_GET_TLS_PROCTABLE()->MultiTexCoord4i) +#define glMultiTexCoord4iv (_GET_TLS_PROCTABLE()->MultiTexCoord4iv) +#define glMultiTexCoord4s (_GET_TLS_PROCTABLE()->MultiTexCoord4s) +#define glMultiTexCoord4sv (_GET_TLS_PROCTABLE()->MultiTexCoord4sv) +#define glLoadTransposeMatrixf (_GET_TLS_PROCTABLE()->LoadTransposeMatrixf) +#define glLoadTransposeMatrixd (_GET_TLS_PROCTABLE()->LoadTransposeMatrixd) +#define glMultTransposeMatrixf (_GET_TLS_PROCTABLE()->MultTransposeMatrixf) +#define glMultTransposeMatrixd (_GET_TLS_PROCTABLE()->MultTransposeMatrixd) +#define glSampleCoverage (_GET_TLS_PROCTABLE()->SampleCoverage) +#define glCompressedTexImage3D (_GET_TLS_PROCTABLE()->CompressedTexImage3D) +#define glCompressedTexImage2D (_GET_TLS_PROCTABLE()->CompressedTexImage2D) +#define glCompressedTexImage1D (_GET_TLS_PROCTABLE()->CompressedTexImage1D) +#define glCompressedTexSubImage3D (_GET_TLS_PROCTABLE()->CompressedTexSubImage3D) +#define glCompressedTexSubImage2D (_GET_TLS_PROCTABLE()->CompressedTexSubImage2D) +#define glCompressedTexSubImage1D (_GET_TLS_PROCTABLE()->CompressedTexSubImage1D) +#define glGetCompressedTexImage (_GET_TLS_PROCTABLE()->GetCompressedTexImage) +#define glBlendFuncSeparate (_GET_TLS_PROCTABLE()->BlendFuncSeparate) +#define glFogCoordf (_GET_TLS_PROCTABLE()->FogCoordf) +#define glFogCoordfv (_GET_TLS_PROCTABLE()->FogCoordfv) +#define glFogCoordd (_GET_TLS_PROCTABLE()->FogCoordd) +#define glFogCoorddv (_GET_TLS_PROCTABLE()->FogCoorddv) +#define glFogCoordPointer (_GET_TLS_PROCTABLE()->FogCoordPointer) +#define glMultiDrawArrays (_GET_TLS_PROCTABLE()->MultiDrawArrays) +#define glMultiDrawElements (_GET_TLS_PROCTABLE()->MultiDrawElements) +#define glPointParameterf (_GET_TLS_PROCTABLE()->PointParameterf) +#define glPointParameterfv (_GET_TLS_PROCTABLE()->PointParameterfv) +#define glPointParameteri (_GET_TLS_PROCTABLE()->PointParameteri) +#define glPointParameteriv (_GET_TLS_PROCTABLE()->PointParameteriv) +#define glSecondaryColor3b (_GET_TLS_PROCTABLE()->SecondaryColor3b) +#define glSecondaryColor3bv (_GET_TLS_PROCTABLE()->SecondaryColor3bv) +#define glSecondaryColor3d (_GET_TLS_PROCTABLE()->SecondaryColor3d) +#define glSecondaryColor3dv (_GET_TLS_PROCTABLE()->SecondaryColor3dv) +#define glSecondaryColor3f (_GET_TLS_PROCTABLE()->SecondaryColor3f) +#define glSecondaryColor3fv (_GET_TLS_PROCTABLE()->SecondaryColor3fv) +#define glSecondaryColor3i (_GET_TLS_PROCTABLE()->SecondaryColor3i) +#define glSecondaryColor3iv (_GET_TLS_PROCTABLE()->SecondaryColor3iv) +#define glSecondaryColor3s (_GET_TLS_PROCTABLE()->SecondaryColor3s) +#define glSecondaryColor3sv (_GET_TLS_PROCTABLE()->SecondaryColor3sv) +#define glSecondaryColor3ub (_GET_TLS_PROCTABLE()->SecondaryColor3ub) +#define glSecondaryColor3ubv (_GET_TLS_PROCTABLE()->SecondaryColor3ubv) +#define glSecondaryColor3ui (_GET_TLS_PROCTABLE()->SecondaryColor3ui) +#define glSecondaryColor3uiv (_GET_TLS_PROCTABLE()->SecondaryColor3uiv) +#define glSecondaryColor3us (_GET_TLS_PROCTABLE()->SecondaryColor3us) +#define glSecondaryColor3usv (_GET_TLS_PROCTABLE()->SecondaryColor3usv) +#define glSecondaryColorPointer (_GET_TLS_PROCTABLE()->SecondaryColorPointer) +#define glWindowPos2d (_GET_TLS_PROCTABLE()->WindowPos2d) +#define glWindowPos2dv (_GET_TLS_PROCTABLE()->WindowPos2dv) +#define glWindowPos2f (_GET_TLS_PROCTABLE()->WindowPos2f) +#define glWindowPos2fv (_GET_TLS_PROCTABLE()->WindowPos2fv) +#define glWindowPos2i (_GET_TLS_PROCTABLE()->WindowPos2i) +#define glWindowPos2iv (_GET_TLS_PROCTABLE()->WindowPos2iv) +#define glWindowPos2s (_GET_TLS_PROCTABLE()->WindowPos2s) +#define glWindowPos2sv (_GET_TLS_PROCTABLE()->WindowPos2sv) +#define glWindowPos3d (_GET_TLS_PROCTABLE()->WindowPos3d) +#define glWindowPos3dv (_GET_TLS_PROCTABLE()->WindowPos3dv) +#define glWindowPos3f (_GET_TLS_PROCTABLE()->WindowPos3f) +#define glWindowPos3fv (_GET_TLS_PROCTABLE()->WindowPos3fv) +#define glWindowPos3i (_GET_TLS_PROCTABLE()->WindowPos3i) +#define glWindowPos3iv (_GET_TLS_PROCTABLE()->WindowPos3iv) +#define glWindowPos3s (_GET_TLS_PROCTABLE()->WindowPos3s) +#define glWindowPos3sv (_GET_TLS_PROCTABLE()->WindowPos3sv) +#define glGenQueries (_GET_TLS_PROCTABLE()->GenQueries) +#define glDeleteQueries (_GET_TLS_PROCTABLE()->DeleteQueries) +#define glIsQuery (_GET_TLS_PROCTABLE()->IsQuery) +#define glBeginQuery (_GET_TLS_PROCTABLE()->BeginQuery) +#define glEndQuery (_GET_TLS_PROCTABLE()->EndQuery) +#define glGetQueryiv (_GET_TLS_PROCTABLE()->GetQueryiv) +#define glGetQueryObjectiv (_GET_TLS_PROCTABLE()->GetQueryObjectiv) +#define glGetQueryObjectuiv (_GET_TLS_PROCTABLE()->GetQueryObjectuiv) +#define glBindBuffer (_GET_TLS_PROCTABLE()->BindBuffer) +#define glDeleteBuffers (_GET_TLS_PROCTABLE()->DeleteBuffers) +#define glGenBuffers (_GET_TLS_PROCTABLE()->GenBuffers) +#define glIsBuffer (_GET_TLS_PROCTABLE()->IsBuffer) +#define glBufferData (_GET_TLS_PROCTABLE()->BufferData) +#define glBufferSubData (_GET_TLS_PROCTABLE()->BufferSubData) +#define glGetBufferSubData (_GET_TLS_PROCTABLE()->GetBufferSubData) +#define glMapBuffer (_GET_TLS_PROCTABLE()->MapBuffer) +#define glUnmapBuffer (_GET_TLS_PROCTABLE()->UnmapBuffer) +#define glGetBufferParameteriv (_GET_TLS_PROCTABLE()->GetBufferParameteriv) +#define glGetBufferPointerv (_GET_TLS_PROCTABLE()->GetBufferPointerv) +#define glActiveTextureARB (_GET_TLS_PROCTABLE()->ActiveTextureARB) +#define glClientActiveTextureARB (_GET_TLS_PROCTABLE()->ClientActiveTextureARB) +#define glMultiTexCoord1dARB (_GET_TLS_PROCTABLE()->MultiTexCoord1dARB) +#define glMultiTexCoord1dvARB (_GET_TLS_PROCTABLE()->MultiTexCoord1dvARB) +#define glMultiTexCoord1fARB (_GET_TLS_PROCTABLE()->MultiTexCoord1fARB) +#define glMultiTexCoord1fvARB (_GET_TLS_PROCTABLE()->MultiTexCoord1fvARB) +#define glMultiTexCoord1iARB (_GET_TLS_PROCTABLE()->MultiTexCoord1iARB) +#define glMultiTexCoord1ivARB (_GET_TLS_PROCTABLE()->MultiTexCoord1ivARB) +#define glMultiTexCoord1sARB (_GET_TLS_PROCTABLE()->MultiTexCoord1sARB) +#define glMultiTexCoord1svARB (_GET_TLS_PROCTABLE()->MultiTexCoord1svARB) +#define glMultiTexCoord2dARB (_GET_TLS_PROCTABLE()->MultiTexCoord2dARB) +#define glMultiTexCoord2dvARB (_GET_TLS_PROCTABLE()->MultiTexCoord2dvARB) +#define glMultiTexCoord2fARB (_GET_TLS_PROCTABLE()->MultiTexCoord2fARB) +#define glMultiTexCoord2fvARB (_GET_TLS_PROCTABLE()->MultiTexCoord2fvARB) +#define glMultiTexCoord2iARB (_GET_TLS_PROCTABLE()->MultiTexCoord2iARB) +#define glMultiTexCoord2ivARB (_GET_TLS_PROCTABLE()->MultiTexCoord2ivARB) +#define glMultiTexCoord2sARB (_GET_TLS_PROCTABLE()->MultiTexCoord2sARB) +#define glMultiTexCoord2svARB (_GET_TLS_PROCTABLE()->MultiTexCoord2svARB) +#define glMultiTexCoord3dARB (_GET_TLS_PROCTABLE()->MultiTexCoord3dARB) +#define glMultiTexCoord3dvARB (_GET_TLS_PROCTABLE()->MultiTexCoord3dvARB) +#define glMultiTexCoord3fARB (_GET_TLS_PROCTABLE()->MultiTexCoord3fARB) +#define glMultiTexCoord3fvARB (_GET_TLS_PROCTABLE()->MultiTexCoord3fvARB) +#define glMultiTexCoord3iARB (_GET_TLS_PROCTABLE()->MultiTexCoord3iARB) +#define glMultiTexCoord3ivARB (_GET_TLS_PROCTABLE()->MultiTexCoord3ivARB) +#define glMultiTexCoord3sARB (_GET_TLS_PROCTABLE()->MultiTexCoord3sARB) +#define glMultiTexCoord3svARB (_GET_TLS_PROCTABLE()->MultiTexCoord3svARB) +#define glMultiTexCoord4dARB (_GET_TLS_PROCTABLE()->MultiTexCoord4dARB) +#define glMultiTexCoord4dvARB (_GET_TLS_PROCTABLE()->MultiTexCoord4dvARB) +#define glMultiTexCoord4fARB (_GET_TLS_PROCTABLE()->MultiTexCoord4fARB) +#define glMultiTexCoord4fvARB (_GET_TLS_PROCTABLE()->MultiTexCoord4fvARB) +#define glMultiTexCoord4iARB (_GET_TLS_PROCTABLE()->MultiTexCoord4iARB) +#define glMultiTexCoord4ivARB (_GET_TLS_PROCTABLE()->MultiTexCoord4ivARB) +#define glMultiTexCoord4sARB (_GET_TLS_PROCTABLE()->MultiTexCoord4sARB) +#define glMultiTexCoord4svARB (_GET_TLS_PROCTABLE()->MultiTexCoord4svARB) +#define glLoadTransposeMatrixfARB (_GET_TLS_PROCTABLE()->LoadTransposeMatrixfARB) +#define glLoadTransposeMatrixdARB (_GET_TLS_PROCTABLE()->LoadTransposeMatrixdARB) +#define glMultTransposeMatrixfARB (_GET_TLS_PROCTABLE()->MultTransposeMatrixfARB) +#define glMultTransposeMatrixdARB (_GET_TLS_PROCTABLE()->MultTransposeMatrixdARB) +#define glSampleCoverageARB (_GET_TLS_PROCTABLE()->SampleCoverageARB) +#define glCompressedTexImage3DARB (_GET_TLS_PROCTABLE()->CompressedTexImage3DARB) +#define glCompressedTexImage2DARB (_GET_TLS_PROCTABLE()->CompressedTexImage2DARB) +#define glCompressedTexImage1DARB (_GET_TLS_PROCTABLE()->CompressedTexImage1DARB) +#define glCompressedTexSubImage3DARB (_GET_TLS_PROCTABLE()->CompressedTexSubImage3DARB) +#define glCompressedTexSubImage2DARB (_GET_TLS_PROCTABLE()->CompressedTexSubImage2DARB) +#define glCompressedTexSubImage1DARB (_GET_TLS_PROCTABLE()->CompressedTexSubImage1DARB) +#define glGetCompressedTexImageARB (_GET_TLS_PROCTABLE()->GetCompressedTexImageARB) +#define glPointParameterfARB (_GET_TLS_PROCTABLE()->PointParameterfARB) +#define glPointParameterfvARB (_GET_TLS_PROCTABLE()->PointParameterfvARB) +#define glWeightbvARB (_GET_TLS_PROCTABLE()->WeightbvARB) +#define glWeightsvARB (_GET_TLS_PROCTABLE()->WeightsvARB) +#define glWeightivARB (_GET_TLS_PROCTABLE()->WeightivARB) +#define glWeightfvARB (_GET_TLS_PROCTABLE()->WeightfvARB) +#define glWeightdvARB (_GET_TLS_PROCTABLE()->WeightdvARB) +#define glWeightubvARB (_GET_TLS_PROCTABLE()->WeightubvARB) +#define glWeightusvARB (_GET_TLS_PROCTABLE()->WeightusvARB) +#define glWeightuivARB (_GET_TLS_PROCTABLE()->WeightuivARB) +#define glWeightPointerARB (_GET_TLS_PROCTABLE()->WeightPointerARB) +#define glVertexBlendARB (_GET_TLS_PROCTABLE()->VertexBlendARB) +#define glCurrentPaletteMatrixARB (_GET_TLS_PROCTABLE()->CurrentPaletteMatrixARB) +#define glMatrixIndexubvARB (_GET_TLS_PROCTABLE()->MatrixIndexubvARB) +#define glMatrixIndexusvARB (_GET_TLS_PROCTABLE()->MatrixIndexusvARB) +#define glMatrixIndexuivARB (_GET_TLS_PROCTABLE()->MatrixIndexuivARB) +#define glMatrixIndexPointerARB (_GET_TLS_PROCTABLE()->MatrixIndexPointerARB) +#define glWindowPos2dARB (_GET_TLS_PROCTABLE()->WindowPos2dARB) +#define glWindowPos2dvARB (_GET_TLS_PROCTABLE()->WindowPos2dvARB) +#define glWindowPos2fARB (_GET_TLS_PROCTABLE()->WindowPos2fARB) +#define glWindowPos2fvARB (_GET_TLS_PROCTABLE()->WindowPos2fvARB) +#define glWindowPos2iARB (_GET_TLS_PROCTABLE()->WindowPos2iARB) +#define glWindowPos2ivARB (_GET_TLS_PROCTABLE()->WindowPos2ivARB) +#define glWindowPos2sARB (_GET_TLS_PROCTABLE()->WindowPos2sARB) +#define glWindowPos2svARB (_GET_TLS_PROCTABLE()->WindowPos2svARB) +#define glWindowPos3dARB (_GET_TLS_PROCTABLE()->WindowPos3dARB) +#define glWindowPos3dvARB (_GET_TLS_PROCTABLE()->WindowPos3dvARB) +#define glWindowPos3fARB (_GET_TLS_PROCTABLE()->WindowPos3fARB) +#define glWindowPos3fvARB (_GET_TLS_PROCTABLE()->WindowPos3fvARB) +#define glWindowPos3iARB (_GET_TLS_PROCTABLE()->WindowPos3iARB) +#define glWindowPos3ivARB (_GET_TLS_PROCTABLE()->WindowPos3ivARB) +#define glWindowPos3sARB (_GET_TLS_PROCTABLE()->WindowPos3sARB) +#define glWindowPos3svARB (_GET_TLS_PROCTABLE()->WindowPos3svARB) +#define glVertexAttrib1dARB (_GET_TLS_PROCTABLE()->VertexAttrib1dARB) +#define glVertexAttrib1dvARB (_GET_TLS_PROCTABLE()->VertexAttrib1dvARB) +#define glVertexAttrib1fARB (_GET_TLS_PROCTABLE()->VertexAttrib1fARB) +#define glVertexAttrib1fvARB (_GET_TLS_PROCTABLE()->VertexAttrib1fvARB) +#define glVertexAttrib1sARB (_GET_TLS_PROCTABLE()->VertexAttrib1sARB) +#define glVertexAttrib1svARB (_GET_TLS_PROCTABLE()->VertexAttrib1svARB) +#define glVertexAttrib2dARB (_GET_TLS_PROCTABLE()->VertexAttrib2dARB) +#define glVertexAttrib2dvARB (_GET_TLS_PROCTABLE()->VertexAttrib2dvARB) +#define glVertexAttrib2fARB (_GET_TLS_PROCTABLE()->VertexAttrib2fARB) +#define glVertexAttrib2fvARB (_GET_TLS_PROCTABLE()->VertexAttrib2fvARB) +#define glVertexAttrib2sARB (_GET_TLS_PROCTABLE()->VertexAttrib2sARB) +#define glVertexAttrib2svARB (_GET_TLS_PROCTABLE()->VertexAttrib2svARB) +#define glVertexAttrib3dARB (_GET_TLS_PROCTABLE()->VertexAttrib3dARB) +#define glVertexAttrib3dvARB (_GET_TLS_PROCTABLE()->VertexAttrib3dvARB) +#define glVertexAttrib3fARB (_GET_TLS_PROCTABLE()->VertexAttrib3fARB) +#define glVertexAttrib3fvARB (_GET_TLS_PROCTABLE()->VertexAttrib3fvARB) +#define glVertexAttrib3sARB (_GET_TLS_PROCTABLE()->VertexAttrib3sARB) +#define glVertexAttrib3svARB (_GET_TLS_PROCTABLE()->VertexAttrib3svARB) +#define glVertexAttrib4NbvARB (_GET_TLS_PROCTABLE()->VertexAttrib4NbvARB) +#define glVertexAttrib4NivARB (_GET_TLS_PROCTABLE()->VertexAttrib4NivARB) +#define glVertexAttrib4NsvARB (_GET_TLS_PROCTABLE()->VertexAttrib4NsvARB) +#define glVertexAttrib4NubARB (_GET_TLS_PROCTABLE()->VertexAttrib4NubARB) +#define glVertexAttrib4NubvARB (_GET_TLS_PROCTABLE()->VertexAttrib4NubvARB) +#define glVertexAttrib4NuivARB (_GET_TLS_PROCTABLE()->VertexAttrib4NuivARB) +#define glVertexAttrib4NusvARB (_GET_TLS_PROCTABLE()->VertexAttrib4NusvARB) +#define glVertexAttrib4bvARB (_GET_TLS_PROCTABLE()->VertexAttrib4bvARB) +#define glVertexAttrib4dARB (_GET_TLS_PROCTABLE()->VertexAttrib4dARB) +#define glVertexAttrib4dvARB (_GET_TLS_PROCTABLE()->VertexAttrib4dvARB) +#define glVertexAttrib4fARB (_GET_TLS_PROCTABLE()->VertexAttrib4fARB) +#define glVertexAttrib4fvARB (_GET_TLS_PROCTABLE()->VertexAttrib4fvARB) +#define glVertexAttrib4ivARB (_GET_TLS_PROCTABLE()->VertexAttrib4ivARB) +#define glVertexAttrib4sARB (_GET_TLS_PROCTABLE()->VertexAttrib4sARB) +#define glVertexAttrib4svARB (_GET_TLS_PROCTABLE()->VertexAttrib4svARB) +#define glVertexAttrib4ubvARB (_GET_TLS_PROCTABLE()->VertexAttrib4ubvARB) +#define glVertexAttrib4uivARB (_GET_TLS_PROCTABLE()->VertexAttrib4uivARB) +#define glVertexAttrib4usvARB (_GET_TLS_PROCTABLE()->VertexAttrib4usvARB) +#define glVertexAttribPointerARB (_GET_TLS_PROCTABLE()->VertexAttribPointerARB) +#define glEnableVertexAttribArrayARB (_GET_TLS_PROCTABLE()->EnableVertexAttribArrayARB) +#define glDisableVertexAttribArrayARB (_GET_TLS_PROCTABLE()->DisableVertexAttribArrayARB) +#define glProgramStringARB (_GET_TLS_PROCTABLE()->ProgramStringARB) +#define glBindProgramARB (_GET_TLS_PROCTABLE()->BindProgramARB) +#define glDeleteProgramsARB (_GET_TLS_PROCTABLE()->DeleteProgramsARB) +#define glGenProgramsARB (_GET_TLS_PROCTABLE()->GenProgramsARB) +#define glProgramEnvParameter4dARB (_GET_TLS_PROCTABLE()->ProgramEnvParameter4dARB) +#define glProgramEnvParameter4dvARB (_GET_TLS_PROCTABLE()->ProgramEnvParameter4dvARB) +#define glProgramEnvParameter4fARB (_GET_TLS_PROCTABLE()->ProgramEnvParameter4fARB) +#define glProgramEnvParameter4fvARB (_GET_TLS_PROCTABLE()->ProgramEnvParameter4fvARB) +#define glProgramLocalParameter4dARB (_GET_TLS_PROCTABLE()->ProgramLocalParameter4dARB) +#define glProgramLocalParameter4dvARB (_GET_TLS_PROCTABLE()->ProgramLocalParameter4dvARB) +#define glProgramLocalParameter4fARB (_GET_TLS_PROCTABLE()->ProgramLocalParameter4fARB) +#define glProgramLocalParameter4fvARB (_GET_TLS_PROCTABLE()->ProgramLocalParameter4fvARB) +#define glGetProgramEnvParameterdvARB (_GET_TLS_PROCTABLE()->GetProgramEnvParameterdvARB) +#define glGetProgramEnvParameterfvARB (_GET_TLS_PROCTABLE()->GetProgramEnvParameterfvARB) +#define glGetProgramLocalParameterdvARB (_GET_TLS_PROCTABLE()->GetProgramLocalParameterdvARB) +#define glGetProgramLocalParameterfvARB (_GET_TLS_PROCTABLE()->GetProgramLocalParameterfvARB) +#define glGetProgramivARB (_GET_TLS_PROCTABLE()->GetProgramivARB) +#define glGetProgramStringARB (_GET_TLS_PROCTABLE()->GetProgramStringARB) +#define glGetVertexAttribdvARB (_GET_TLS_PROCTABLE()->GetVertexAttribdvARB) +#define glGetVertexAttribfvARB (_GET_TLS_PROCTABLE()->GetVertexAttribfvARB) +#define glGetVertexAttribivARB (_GET_TLS_PROCTABLE()->GetVertexAttribivARB) +#define glGetVertexAttribPointervARB (_GET_TLS_PROCTABLE()->GetVertexAttribPointervARB) +#define glIsProgramARB (_GET_TLS_PROCTABLE()->IsProgramARB) +#define glBindBufferARB (_GET_TLS_PROCTABLE()->BindBufferARB) +#define glDeleteBuffersARB (_GET_TLS_PROCTABLE()->DeleteBuffersARB) +#define glGenBuffersARB (_GET_TLS_PROCTABLE()->GenBuffersARB) +#define glIsBufferARB (_GET_TLS_PROCTABLE()->IsBufferARB) +#define glBufferDataARB (_GET_TLS_PROCTABLE()->BufferDataARB) +#define glBufferSubDataARB (_GET_TLS_PROCTABLE()->BufferSubDataARB) +#define glGetBufferSubDataARB (_GET_TLS_PROCTABLE()->GetBufferSubDataARB) +#define glMapBufferARB (_GET_TLS_PROCTABLE()->MapBufferARB) +#define glUnmapBufferARB (_GET_TLS_PROCTABLE()->UnmapBufferARB) +#define glGetBufferParameterivARB (_GET_TLS_PROCTABLE()->GetBufferParameterivARB) +#define glGetBufferPointervARB (_GET_TLS_PROCTABLE()->GetBufferPointervARB) +#define glGenQueriesARB (_GET_TLS_PROCTABLE()->GenQueriesARB) +#define glDeleteQueriesARB (_GET_TLS_PROCTABLE()->DeleteQueriesARB) +#define glIsQueryARB (_GET_TLS_PROCTABLE()->IsQueryARB) +#define glBeginQueryARB (_GET_TLS_PROCTABLE()->BeginQueryARB) +#define glEndQueryARB (_GET_TLS_PROCTABLE()->EndQueryARB) +#define glGetQueryivARB (_GET_TLS_PROCTABLE()->GetQueryivARB) +#define glGetQueryObjectivARB (_GET_TLS_PROCTABLE()->GetQueryObjectivARB) +#define glGetQueryObjectuivARB (_GET_TLS_PROCTABLE()->GetQueryObjectuivARB) +#define glDeleteObjectARB (_GET_TLS_PROCTABLE()->DeleteObjectARB) +#define glGetHandleARB (_GET_TLS_PROCTABLE()->GetHandleARB) +#define glDetachObjectARB (_GET_TLS_PROCTABLE()->DetachObjectARB) +#define glCreateShaderObjectARB (_GET_TLS_PROCTABLE()->CreateShaderObjectARB) +#define glShaderSourceARB (_GET_TLS_PROCTABLE()->ShaderSourceARB) +#define glCompileShaderARB (_GET_TLS_PROCTABLE()->CompileShaderARB) +#define glCreateProgramObjectARB (_GET_TLS_PROCTABLE()->CreateProgramObjectARB) +#define glAttachObjectARB (_GET_TLS_PROCTABLE()->AttachObjectARB) +#define glLinkProgramARB (_GET_TLS_PROCTABLE()->LinkProgramARB) +#define glUseProgramObjectARB (_GET_TLS_PROCTABLE()->UseProgramObjectARB) +#define glValidateProgramARB (_GET_TLS_PROCTABLE()->ValidateProgramARB) +#define glUniform1fARB (_GET_TLS_PROCTABLE()->Uniform1fARB) +#define glUniform2fARB (_GET_TLS_PROCTABLE()->Uniform2fARB) +#define glUniform3fARB (_GET_TLS_PROCTABLE()->Uniform3fARB) +#define glUniform4fARB (_GET_TLS_PROCTABLE()->Uniform4fARB) +#define glUniform1iARB (_GET_TLS_PROCTABLE()->Uniform1iARB) +#define glUniform2iARB (_GET_TLS_PROCTABLE()->Uniform2iARB) +#define glUniform3iARB (_GET_TLS_PROCTABLE()->Uniform3iARB) +#define glUniform4iARB (_GET_TLS_PROCTABLE()->Uniform4iARB) +#define glUniform1fvARB (_GET_TLS_PROCTABLE()->Uniform1fvARB) +#define glUniform2fvARB (_GET_TLS_PROCTABLE()->Uniform2fvARB) +#define glUniform3fvARB (_GET_TLS_PROCTABLE()->Uniform3fvARB) +#define glUniform4fvARB (_GET_TLS_PROCTABLE()->Uniform4fvARB) +#define glUniform1ivARB (_GET_TLS_PROCTABLE()->Uniform1ivARB) +#define glUniform2ivARB (_GET_TLS_PROCTABLE()->Uniform2ivARB) +#define glUniform3ivARB (_GET_TLS_PROCTABLE()->Uniform3ivARB) +#define glUniform4ivARB (_GET_TLS_PROCTABLE()->Uniform4ivARB) +#define glUniformMatrix2fvARB (_GET_TLS_PROCTABLE()->UniformMatrix2fvARB) +#define glUniformMatrix3fvARB (_GET_TLS_PROCTABLE()->UniformMatrix3fvARB) +#define glUniformMatrix4fvARB (_GET_TLS_PROCTABLE()->UniformMatrix4fvARB) +#define glGetObjectParameterfvARB (_GET_TLS_PROCTABLE()->GetObjectParameterfvARB) +#define glGetObjectParameterivARB (_GET_TLS_PROCTABLE()->GetObjectParameterivARB) +#define glGetInfoLogARB (_GET_TLS_PROCTABLE()->GetInfoLogARB) +#define glGetAttachedObjectsARB (_GET_TLS_PROCTABLE()->GetAttachedObjectsARB) +#define glGetUniformLocationARB (_GET_TLS_PROCTABLE()->GetUniformLocationARB) +#define glGetActiveUniformARB (_GET_TLS_PROCTABLE()->GetActiveUniformARB) +#define glGetUniformfvARB (_GET_TLS_PROCTABLE()->GetUniformfvARB) +#define glGetUniformivARB (_GET_TLS_PROCTABLE()->GetUniformivARB) +#define glGetShaderSourceARB (_GET_TLS_PROCTABLE()->GetShaderSourceARB) +#define glBindAttribLocationARB (_GET_TLS_PROCTABLE()->BindAttribLocationARB) +#define glGetActiveAttribARB (_GET_TLS_PROCTABLE()->GetActiveAttribARB) +#define glGetAttribLocationARB (_GET_TLS_PROCTABLE()->GetAttribLocationARB) +#define glBlendColorEXT (_GET_TLS_PROCTABLE()->BlendColorEXT) +#define glPolygonOffsetEXT (_GET_TLS_PROCTABLE()->PolygonOffsetEXT) +#define glTexImage3DEXT (_GET_TLS_PROCTABLE()->TexImage3DEXT) +#define glTexSubImage3DEXT (_GET_TLS_PROCTABLE()->TexSubImage3DEXT) +#define glGetTexFilterFuncSGIS (_GET_TLS_PROCTABLE()->GetTexFilterFuncSGIS) +#define glTexFilterFuncSGIS (_GET_TLS_PROCTABLE()->TexFilterFuncSGIS) +#define glTexSubImage1DEXT (_GET_TLS_PROCTABLE()->TexSubImage1DEXT) +#define glTexSubImage2DEXT (_GET_TLS_PROCTABLE()->TexSubImage2DEXT) +#define glCopyTexImage1DEXT (_GET_TLS_PROCTABLE()->CopyTexImage1DEXT) +#define glCopyTexImage2DEXT (_GET_TLS_PROCTABLE()->CopyTexImage2DEXT) +#define glCopyTexSubImage1DEXT (_GET_TLS_PROCTABLE()->CopyTexSubImage1DEXT) +#define glCopyTexSubImage2DEXT (_GET_TLS_PROCTABLE()->CopyTexSubImage2DEXT) +#define glCopyTexSubImage3DEXT (_GET_TLS_PROCTABLE()->CopyTexSubImage3DEXT) +#define glGetHistogramEXT (_GET_TLS_PROCTABLE()->GetHistogramEXT) +#define glGetHistogramParameterfvEXT (_GET_TLS_PROCTABLE()->GetHistogramParameterfvEXT) +#define glGetHistogramParameterivEXT (_GET_TLS_PROCTABLE()->GetHistogramParameterivEXT) +#define glGetMinmaxEXT (_GET_TLS_PROCTABLE()->GetMinmaxEXT) +#define glGetMinmaxParameterfvEXT (_GET_TLS_PROCTABLE()->GetMinmaxParameterfvEXT) +#define glGetMinmaxParameterivEXT (_GET_TLS_PROCTABLE()->GetMinmaxParameterivEXT) +#define glHistogramEXT (_GET_TLS_PROCTABLE()->HistogramEXT) +#define glMinmaxEXT (_GET_TLS_PROCTABLE()->MinmaxEXT) +#define glResetHistogramEXT (_GET_TLS_PROCTABLE()->ResetHistogramEXT) +#define glResetMinmaxEXT (_GET_TLS_PROCTABLE()->ResetMinmaxEXT) +#define glConvolutionFilter1DEXT (_GET_TLS_PROCTABLE()->ConvolutionFilter1DEXT) +#define glConvolutionFilter2DEXT (_GET_TLS_PROCTABLE()->ConvolutionFilter2DEXT) +#define glConvolutionParameterfEXT (_GET_TLS_PROCTABLE()->ConvolutionParameterfEXT) +#define glConvolutionParameterfvEXT (_GET_TLS_PROCTABLE()->ConvolutionParameterfvEXT) +#define glConvolutionParameteriEXT (_GET_TLS_PROCTABLE()->ConvolutionParameteriEXT) +#define glConvolutionParameterivEXT (_GET_TLS_PROCTABLE()->ConvolutionParameterivEXT) +#define glCopyConvolutionFilter1DEXT (_GET_TLS_PROCTABLE()->CopyConvolutionFilter1DEXT) +#define glCopyConvolutionFilter2DEXT (_GET_TLS_PROCTABLE()->CopyConvolutionFilter2DEXT) +#define glGetConvolutionFilterEXT (_GET_TLS_PROCTABLE()->GetConvolutionFilterEXT) +#define glGetConvolutionParameterfvEXT (_GET_TLS_PROCTABLE()->GetConvolutionParameterfvEXT) +#define glGetConvolutionParameterivEXT (_GET_TLS_PROCTABLE()->GetConvolutionParameterivEXT) +#define glGetSeparableFilterEXT (_GET_TLS_PROCTABLE()->GetSeparableFilterEXT) +#define glSeparableFilter2DEXT (_GET_TLS_PROCTABLE()->SeparableFilter2DEXT) +#define glColorTableSGI (_GET_TLS_PROCTABLE()->ColorTableSGI) +#define glColorTableParameterfvSGI (_GET_TLS_PROCTABLE()->ColorTableParameterfvSGI) +#define glColorTableParameterivSGI (_GET_TLS_PROCTABLE()->ColorTableParameterivSGI) +#define glCopyColorTableSGI (_GET_TLS_PROCTABLE()->CopyColorTableSGI) +#define glGetColorTableSGI (_GET_TLS_PROCTABLE()->GetColorTableSGI) +#define glGetColorTableParameterfvSGI (_GET_TLS_PROCTABLE()->GetColorTableParameterfvSGI) +#define glGetColorTableParameterivSGI (_GET_TLS_PROCTABLE()->GetColorTableParameterivSGI) +#define glPixelTexGenSGIX (_GET_TLS_PROCTABLE()->PixelTexGenSGIX) +#define glPixelTexGenParameteriSGIS (_GET_TLS_PROCTABLE()->PixelTexGenParameteriSGIS) +#define glPixelTexGenParameterivSGIS (_GET_TLS_PROCTABLE()->PixelTexGenParameterivSGIS) +#define glPixelTexGenParameterfSGIS (_GET_TLS_PROCTABLE()->PixelTexGenParameterfSGIS) +#define glPixelTexGenParameterfvSGIS (_GET_TLS_PROCTABLE()->PixelTexGenParameterfvSGIS) +#define glGetPixelTexGenParameterivSGIS (_GET_TLS_PROCTABLE()->GetPixelTexGenParameterivSGIS) +#define glGetPixelTexGenParameterfvSGIS (_GET_TLS_PROCTABLE()->GetPixelTexGenParameterfvSGIS) +#define glTexImage4DSGIS (_GET_TLS_PROCTABLE()->TexImage4DSGIS) +#define glTexSubImage4DSGIS (_GET_TLS_PROCTABLE()->TexSubImage4DSGIS) +#define glAreTexturesResidentEXT (_GET_TLS_PROCTABLE()->AreTexturesResidentEXT) +#define glBindTextureEXT (_GET_TLS_PROCTABLE()->BindTextureEXT) +#define glDeleteTexturesEXT (_GET_TLS_PROCTABLE()->DeleteTexturesEXT) +#define glGenTexturesEXT (_GET_TLS_PROCTABLE()->GenTexturesEXT) +#define glIsTextureEXT (_GET_TLS_PROCTABLE()->IsTextureEXT) +#define glPrioritizeTexturesEXT (_GET_TLS_PROCTABLE()->PrioritizeTexturesEXT) +#define glDetailTexFuncSGIS (_GET_TLS_PROCTABLE()->DetailTexFuncSGIS) +#define glGetDetailTexFuncSGIS (_GET_TLS_PROCTABLE()->GetDetailTexFuncSGIS) +#define glSharpenTexFuncSGIS (_GET_TLS_PROCTABLE()->SharpenTexFuncSGIS) +#define glGetSharpenTexFuncSGIS (_GET_TLS_PROCTABLE()->GetSharpenTexFuncSGIS) +#define glSampleMaskSGIS (_GET_TLS_PROCTABLE()->SampleMaskSGIS) +#define glSamplePatternSGIS (_GET_TLS_PROCTABLE()->SamplePatternSGIS) +#define glArrayElementEXT (_GET_TLS_PROCTABLE()->ArrayElementEXT) +#define glColorPointerEXT (_GET_TLS_PROCTABLE()->ColorPointerEXT) +#define glDrawArraysEXT (_GET_TLS_PROCTABLE()->DrawArraysEXT) +#define glEdgeFlagPointerEXT (_GET_TLS_PROCTABLE()->EdgeFlagPointerEXT) +#define glGetPointervEXT (_GET_TLS_PROCTABLE()->GetPointervEXT) +#define glIndexPointerEXT (_GET_TLS_PROCTABLE()->IndexPointerEXT) +#define glNormalPointerEXT (_GET_TLS_PROCTABLE()->NormalPointerEXT) +#define glTexCoordPointerEXT (_GET_TLS_PROCTABLE()->TexCoordPointerEXT) +#define glVertexPointerEXT (_GET_TLS_PROCTABLE()->VertexPointerEXT) +#define glBlendEquationEXT (_GET_TLS_PROCTABLE()->BlendEquationEXT) +#define glSpriteParameterfSGIX (_GET_TLS_PROCTABLE()->SpriteParameterfSGIX) +#define glSpriteParameterfvSGIX (_GET_TLS_PROCTABLE()->SpriteParameterfvSGIX) +#define glSpriteParameteriSGIX (_GET_TLS_PROCTABLE()->SpriteParameteriSGIX) +#define glSpriteParameterivSGIX (_GET_TLS_PROCTABLE()->SpriteParameterivSGIX) +#define glPointParameterfEXT (_GET_TLS_PROCTABLE()->PointParameterfEXT) +#define glPointParameterfvEXT (_GET_TLS_PROCTABLE()->PointParameterfvEXT) +#define glPointParameterfSGIS (_GET_TLS_PROCTABLE()->PointParameterfSGIS) +#define glPointParameterfvSGIS (_GET_TLS_PROCTABLE()->PointParameterfvSGIS) +#define glGetInstrumentsSGIX (_GET_TLS_PROCTABLE()->GetInstrumentsSGIX) +#define glInstrumentsBufferSGIX (_GET_TLS_PROCTABLE()->InstrumentsBufferSGIX) +#define glPollInstrumentsSGIX (_GET_TLS_PROCTABLE()->PollInstrumentsSGIX) +#define glReadInstrumentsSGIX (_GET_TLS_PROCTABLE()->ReadInstrumentsSGIX) +#define glStartInstrumentsSGIX (_GET_TLS_PROCTABLE()->StartInstrumentsSGIX) +#define glStopInstrumentsSGIX (_GET_TLS_PROCTABLE()->StopInstrumentsSGIX) +#define glFrameZoomSGIX (_GET_TLS_PROCTABLE()->FrameZoomSGIX) +#define glTagSampleBufferSGIX (_GET_TLS_PROCTABLE()->TagSampleBufferSGIX) +#define glDeformationMap3dSGIX (_GET_TLS_PROCTABLE()->DeformationMap3dSGIX) +#define glDeformationMap3fSGIX (_GET_TLS_PROCTABLE()->DeformationMap3fSGIX) +#define glDeformSGIX (_GET_TLS_PROCTABLE()->DeformSGIX) +#define glLoadIdentityDeformationMapSGIX (_GET_TLS_PROCTABLE()->LoadIdentityDeformationMapSGIX) +#define glReferencePlaneSGIX (_GET_TLS_PROCTABLE()->ReferencePlaneSGIX) +#define glFlushRasterSGIX (_GET_TLS_PROCTABLE()->FlushRasterSGIX) +#define glFogFuncSGIS (_GET_TLS_PROCTABLE()->FogFuncSGIS) +#define glGetFogFuncSGIS (_GET_TLS_PROCTABLE()->GetFogFuncSGIS) +#define glImageTransformParameteriHP (_GET_TLS_PROCTABLE()->ImageTransformParameteriHP) +#define glImageTransformParameterfHP (_GET_TLS_PROCTABLE()->ImageTransformParameterfHP) +#define glImageTransformParameterivHP (_GET_TLS_PROCTABLE()->ImageTransformParameterivHP) +#define glImageTransformParameterfvHP (_GET_TLS_PROCTABLE()->ImageTransformParameterfvHP) +#define glGetImageTransformParameterivHP (_GET_TLS_PROCTABLE()->GetImageTransformParameterivHP) +#define glGetImageTransformParameterfvHP (_GET_TLS_PROCTABLE()->GetImageTransformParameterfvHP) +#define glColorSubTableEXT (_GET_TLS_PROCTABLE()->ColorSubTableEXT) +#define glCopyColorSubTableEXT (_GET_TLS_PROCTABLE()->CopyColorSubTableEXT) +#define glHintPGI (_GET_TLS_PROCTABLE()->HintPGI) +#define glColorTableEXT (_GET_TLS_PROCTABLE()->ColorTableEXT) +#define glGetColorTableEXT (_GET_TLS_PROCTABLE()->GetColorTableEXT) +#define glGetColorTableParameterivEXT (_GET_TLS_PROCTABLE()->GetColorTableParameterivEXT) +#define glGetColorTableParameterfvEXT (_GET_TLS_PROCTABLE()->GetColorTableParameterfvEXT) +#define glGetListParameterfvSGIX (_GET_TLS_PROCTABLE()->GetListParameterfvSGIX) +#define glGetListParameterivSGIX (_GET_TLS_PROCTABLE()->GetListParameterivSGIX) +#define glListParameterfSGIX (_GET_TLS_PROCTABLE()->ListParameterfSGIX) +#define glListParameterfvSGIX (_GET_TLS_PROCTABLE()->ListParameterfvSGIX) +#define glListParameteriSGIX (_GET_TLS_PROCTABLE()->ListParameteriSGIX) +#define glListParameterivSGIX (_GET_TLS_PROCTABLE()->ListParameterivSGIX) +#define glIndexMaterialEXT (_GET_TLS_PROCTABLE()->IndexMaterialEXT) +#define glIndexFuncEXT (_GET_TLS_PROCTABLE()->IndexFuncEXT) +#define glLockArraysEXT (_GET_TLS_PROCTABLE()->LockArraysEXT) +#define glUnlockArraysEXT (_GET_TLS_PROCTABLE()->UnlockArraysEXT) +#define glCullParameterdvEXT (_GET_TLS_PROCTABLE()->CullParameterdvEXT) +#define glCullParameterfvEXT (_GET_TLS_PROCTABLE()->CullParameterfvEXT) +#define glFragmentColorMaterialSGIX (_GET_TLS_PROCTABLE()->FragmentColorMaterialSGIX) +#define glFragmentLightfSGIX (_GET_TLS_PROCTABLE()->FragmentLightfSGIX) +#define glFragmentLightfvSGIX (_GET_TLS_PROCTABLE()->FragmentLightfvSGIX) +#define glFragmentLightiSGIX (_GET_TLS_PROCTABLE()->FragmentLightiSGIX) +#define glFragmentLightivSGIX (_GET_TLS_PROCTABLE()->FragmentLightivSGIX) +#define glFragmentLightModelfSGIX (_GET_TLS_PROCTABLE()->FragmentLightModelfSGIX) +#define glFragmentLightModelfvSGIX (_GET_TLS_PROCTABLE()->FragmentLightModelfvSGIX) +#define glFragmentLightModeliSGIX (_GET_TLS_PROCTABLE()->FragmentLightModeliSGIX) +#define glFragmentLightModelivSGIX (_GET_TLS_PROCTABLE()->FragmentLightModelivSGIX) +#define glFragmentMaterialfSGIX (_GET_TLS_PROCTABLE()->FragmentMaterialfSGIX) +#define glFragmentMaterialfvSGIX (_GET_TLS_PROCTABLE()->FragmentMaterialfvSGIX) +#define glFragmentMaterialiSGIX (_GET_TLS_PROCTABLE()->FragmentMaterialiSGIX) +#define glFragmentMaterialivSGIX (_GET_TLS_PROCTABLE()->FragmentMaterialivSGIX) +#define glGetFragmentLightfvSGIX (_GET_TLS_PROCTABLE()->GetFragmentLightfvSGIX) +#define glGetFragmentLightivSGIX (_GET_TLS_PROCTABLE()->GetFragmentLightivSGIX) +#define glGetFragmentMaterialfvSGIX (_GET_TLS_PROCTABLE()->GetFragmentMaterialfvSGIX) +#define glGetFragmentMaterialivSGIX (_GET_TLS_PROCTABLE()->GetFragmentMaterialivSGIX) +#define glLightEnviSGIX (_GET_TLS_PROCTABLE()->LightEnviSGIX) +#define glDrawRangeElementsEXT (_GET_TLS_PROCTABLE()->DrawRangeElementsEXT) +#define glApplyTextureEXT (_GET_TLS_PROCTABLE()->ApplyTextureEXT) +#define glTextureLightEXT (_GET_TLS_PROCTABLE()->TextureLightEXT) +#define glTextureMaterialEXT (_GET_TLS_PROCTABLE()->TextureMaterialEXT) +#define glAsyncMarkerSGIX (_GET_TLS_PROCTABLE()->AsyncMarkerSGIX) +#define glFinishAsyncSGIX (_GET_TLS_PROCTABLE()->FinishAsyncSGIX) +#define glPollAsyncSGIX (_GET_TLS_PROCTABLE()->PollAsyncSGIX) +#define glGenAsyncMarkersSGIX (_GET_TLS_PROCTABLE()->GenAsyncMarkersSGIX) +#define glDeleteAsyncMarkersSGIX (_GET_TLS_PROCTABLE()->DeleteAsyncMarkersSGIX) +#define glIsAsyncMarkerSGIX (_GET_TLS_PROCTABLE()->IsAsyncMarkerSGIX) +#define glVertexPointervINTEL (_GET_TLS_PROCTABLE()->VertexPointervINTEL) +#define glNormalPointervINTEL (_GET_TLS_PROCTABLE()->NormalPointervINTEL) +#define glColorPointervINTEL (_GET_TLS_PROCTABLE()->ColorPointervINTEL) +#define glTexCoordPointervINTEL (_GET_TLS_PROCTABLE()->TexCoordPointervINTEL) +#define glPixelTransformParameteriEXT (_GET_TLS_PROCTABLE()->PixelTransformParameteriEXT) +#define glPixelTransformParameterfEXT (_GET_TLS_PROCTABLE()->PixelTransformParameterfEXT) +#define glPixelTransformParameterivEXT (_GET_TLS_PROCTABLE()->PixelTransformParameterivEXT) +#define glPixelTransformParameterfvEXT (_GET_TLS_PROCTABLE()->PixelTransformParameterfvEXT) +#define glSecondaryColor3bEXT (_GET_TLS_PROCTABLE()->SecondaryColor3bEXT) +#define glSecondaryColor3bvEXT (_GET_TLS_PROCTABLE()->SecondaryColor3bvEXT) +#define glSecondaryColor3dEXT (_GET_TLS_PROCTABLE()->SecondaryColor3dEXT) +#define glSecondaryColor3dvEXT (_GET_TLS_PROCTABLE()->SecondaryColor3dvEXT) +#define glSecondaryColor3fEXT (_GET_TLS_PROCTABLE()->SecondaryColor3fEXT) +#define glSecondaryColor3fvEXT (_GET_TLS_PROCTABLE()->SecondaryColor3fvEXT) +#define glSecondaryColor3iEXT (_GET_TLS_PROCTABLE()->SecondaryColor3iEXT) +#define glSecondaryColor3ivEXT (_GET_TLS_PROCTABLE()->SecondaryColor3ivEXT) +#define glSecondaryColor3sEXT (_GET_TLS_PROCTABLE()->SecondaryColor3sEXT) +#define glSecondaryColor3svEXT (_GET_TLS_PROCTABLE()->SecondaryColor3svEXT) +#define glSecondaryColor3ubEXT (_GET_TLS_PROCTABLE()->SecondaryColor3ubEXT) +#define glSecondaryColor3ubvEXT (_GET_TLS_PROCTABLE()->SecondaryColor3ubvEXT) +#define glSecondaryColor3uiEXT (_GET_TLS_PROCTABLE()->SecondaryColor3uiEXT) +#define glSecondaryColor3uivEXT (_GET_TLS_PROCTABLE()->SecondaryColor3uivEXT) +#define glSecondaryColor3usEXT (_GET_TLS_PROCTABLE()->SecondaryColor3usEXT) +#define glSecondaryColor3usvEXT (_GET_TLS_PROCTABLE()->SecondaryColor3usvEXT) +#define glSecondaryColorPointerEXT (_GET_TLS_PROCTABLE()->SecondaryColorPointerEXT) +#define glTextureNormalEXT (_GET_TLS_PROCTABLE()->TextureNormalEXT) +#define glMultiDrawArraysEXT (_GET_TLS_PROCTABLE()->MultiDrawArraysEXT) +#define glMultiDrawElementsEXT (_GET_TLS_PROCTABLE()->MultiDrawElementsEXT) +#define glFogCoordfEXT (_GET_TLS_PROCTABLE()->FogCoordfEXT) +#define glFogCoordfvEXT (_GET_TLS_PROCTABLE()->FogCoordfvEXT) +#define glFogCoorddEXT (_GET_TLS_PROCTABLE()->FogCoorddEXT) +#define glFogCoorddvEXT (_GET_TLS_PROCTABLE()->FogCoorddvEXT) +#define glFogCoordPointerEXT (_GET_TLS_PROCTABLE()->FogCoordPointerEXT) +#define glTangent3bEXT (_GET_TLS_PROCTABLE()->Tangent3bEXT) +#define glTangent3bvEXT (_GET_TLS_PROCTABLE()->Tangent3bvEXT) +#define glTangent3dEXT (_GET_TLS_PROCTABLE()->Tangent3dEXT) +#define glTangent3dvEXT (_GET_TLS_PROCTABLE()->Tangent3dvEXT) +#define glTangent3fEXT (_GET_TLS_PROCTABLE()->Tangent3fEXT) +#define glTangent3fvEXT (_GET_TLS_PROCTABLE()->Tangent3fvEXT) +#define glTangent3iEXT (_GET_TLS_PROCTABLE()->Tangent3iEXT) +#define glTangent3ivEXT (_GET_TLS_PROCTABLE()->Tangent3ivEXT) +#define glTangent3sEXT (_GET_TLS_PROCTABLE()->Tangent3sEXT) +#define glTangent3svEXT (_GET_TLS_PROCTABLE()->Tangent3svEXT) +#define glBinormal3bEXT (_GET_TLS_PROCTABLE()->Binormal3bEXT) +#define glBinormal3bvEXT (_GET_TLS_PROCTABLE()->Binormal3bvEXT) +#define glBinormal3dEXT (_GET_TLS_PROCTABLE()->Binormal3dEXT) +#define glBinormal3dvEXT (_GET_TLS_PROCTABLE()->Binormal3dvEXT) +#define glBinormal3fEXT (_GET_TLS_PROCTABLE()->Binormal3fEXT) +#define glBinormal3fvEXT (_GET_TLS_PROCTABLE()->Binormal3fvEXT) +#define glBinormal3iEXT (_GET_TLS_PROCTABLE()->Binormal3iEXT) +#define glBinormal3ivEXT (_GET_TLS_PROCTABLE()->Binormal3ivEXT) +#define glBinormal3sEXT (_GET_TLS_PROCTABLE()->Binormal3sEXT) +#define glBinormal3svEXT (_GET_TLS_PROCTABLE()->Binormal3svEXT) +#define glTangentPointerEXT (_GET_TLS_PROCTABLE()->TangentPointerEXT) +#define glBinormalPointerEXT (_GET_TLS_PROCTABLE()->BinormalPointerEXT) +#define glFinishTextureSUNX (_GET_TLS_PROCTABLE()->FinishTextureSUNX) +#define glGlobalAlphaFactorbSUN (_GET_TLS_PROCTABLE()->GlobalAlphaFactorbSUN) +#define glGlobalAlphaFactorsSUN (_GET_TLS_PROCTABLE()->GlobalAlphaFactorsSUN) +#define glGlobalAlphaFactoriSUN (_GET_TLS_PROCTABLE()->GlobalAlphaFactoriSUN) +#define glGlobalAlphaFactorfSUN (_GET_TLS_PROCTABLE()->GlobalAlphaFactorfSUN) +#define glGlobalAlphaFactordSUN (_GET_TLS_PROCTABLE()->GlobalAlphaFactordSUN) +#define glGlobalAlphaFactorubSUN (_GET_TLS_PROCTABLE()->GlobalAlphaFactorubSUN) +#define glGlobalAlphaFactorusSUN (_GET_TLS_PROCTABLE()->GlobalAlphaFactorusSUN) +#define glGlobalAlphaFactoruiSUN (_GET_TLS_PROCTABLE()->GlobalAlphaFactoruiSUN) +#define glReplacementCodeuiSUN (_GET_TLS_PROCTABLE()->ReplacementCodeuiSUN) +#define glReplacementCodeusSUN (_GET_TLS_PROCTABLE()->ReplacementCodeusSUN) +#define glReplacementCodeubSUN (_GET_TLS_PROCTABLE()->ReplacementCodeubSUN) +#define glReplacementCodeuivSUN (_GET_TLS_PROCTABLE()->ReplacementCodeuivSUN) +#define glReplacementCodeusvSUN (_GET_TLS_PROCTABLE()->ReplacementCodeusvSUN) +#define glReplacementCodeubvSUN (_GET_TLS_PROCTABLE()->ReplacementCodeubvSUN) +#define glReplacementCodePointerSUN (_GET_TLS_PROCTABLE()->ReplacementCodePointerSUN) +#define glColor4ubVertex2fSUN (_GET_TLS_PROCTABLE()->Color4ubVertex2fSUN) +#define glColor4ubVertex2fvSUN (_GET_TLS_PROCTABLE()->Color4ubVertex2fvSUN) +#define glColor4ubVertex3fSUN (_GET_TLS_PROCTABLE()->Color4ubVertex3fSUN) +#define glColor4ubVertex3fvSUN (_GET_TLS_PROCTABLE()->Color4ubVertex3fvSUN) +#define glColor3fVertex3fSUN (_GET_TLS_PROCTABLE()->Color3fVertex3fSUN) +#define glColor3fVertex3fvSUN (_GET_TLS_PROCTABLE()->Color3fVertex3fvSUN) +#define glNormal3fVertex3fSUN (_GET_TLS_PROCTABLE()->Normal3fVertex3fSUN) +#define glNormal3fVertex3fvSUN (_GET_TLS_PROCTABLE()->Normal3fVertex3fvSUN) +#define glColor4fNormal3fVertex3fSUN (_GET_TLS_PROCTABLE()->Color4fNormal3fVertex3fSUN) +#define glColor4fNormal3fVertex3fvSUN (_GET_TLS_PROCTABLE()->Color4fNormal3fVertex3fvSUN) +#define glTexCoord2fVertex3fSUN (_GET_TLS_PROCTABLE()->TexCoord2fVertex3fSUN) +#define glTexCoord2fVertex3fvSUN (_GET_TLS_PROCTABLE()->TexCoord2fVertex3fvSUN) +#define glTexCoord4fVertex4fSUN (_GET_TLS_PROCTABLE()->TexCoord4fVertex4fSUN) +#define glTexCoord4fVertex4fvSUN (_GET_TLS_PROCTABLE()->TexCoord4fVertex4fvSUN) +#define glTexCoord2fColor4ubVertex3fSUN (_GET_TLS_PROCTABLE()->TexCoord2fColor4ubVertex3fSUN) +#define glTexCoord2fColor4ubVertex3fvSUN (_GET_TLS_PROCTABLE()->TexCoord2fColor4ubVertex3fvSUN) +#define glTexCoord2fColor3fVertex3fSUN (_GET_TLS_PROCTABLE()->TexCoord2fColor3fVertex3fSUN) +#define glTexCoord2fColor3fVertex3fvSUN (_GET_TLS_PROCTABLE()->TexCoord2fColor3fVertex3fvSUN) +#define glTexCoord2fNormal3fVertex3fSUN (_GET_TLS_PROCTABLE()->TexCoord2fNormal3fVertex3fSUN) +#define glTexCoord2fNormal3fVertex3fvSUN (_GET_TLS_PROCTABLE()->TexCoord2fNormal3fVertex3fvSUN) +#define glTexCoord2fColor4fNormal3fVertex3fSUN (_GET_TLS_PROCTABLE()->TexCoord2fColor4fNormal3fVertex3fSUN) +#define glTexCoord2fColor4fNormal3fVertex3fvSUN (_GET_TLS_PROCTABLE()->TexCoord2fColor4fNormal3fVertex3fvSUN) +#define glTexCoord4fColor4fNormal3fVertex4fSUN (_GET_TLS_PROCTABLE()->TexCoord4fColor4fNormal3fVertex4fSUN) +#define glTexCoord4fColor4fNormal3fVertex4fvSUN (_GET_TLS_PROCTABLE()->TexCoord4fColor4fNormal3fVertex4fvSUN) +#define glReplacementCodeuiVertex3fSUN (_GET_TLS_PROCTABLE()->ReplacementCodeuiVertex3fSUN) +#define glReplacementCodeuiVertex3fvSUN (_GET_TLS_PROCTABLE()->ReplacementCodeuiVertex3fvSUN) +#define glReplacementCodeuiColor4ubVertex3fSUN (_GET_TLS_PROCTABLE()->ReplacementCodeuiColor4ubVertex3fSUN) +#define glReplacementCodeuiColor4ubVertex3fvSUN (_GET_TLS_PROCTABLE()->ReplacementCodeuiColor4ubVertex3fvSUN) +#define glReplacementCodeuiColor3fVertex3fSUN (_GET_TLS_PROCTABLE()->ReplacementCodeuiColor3fVertex3fSUN) +#define glReplacementCodeuiColor3fVertex3fvSUN (_GET_TLS_PROCTABLE()->ReplacementCodeuiColor3fVertex3fvSUN) +#define glReplacementCodeuiNormal3fVertex3fSUN (_GET_TLS_PROCTABLE()->ReplacementCodeuiNormal3fVertex3fSUN) +#define glReplacementCodeuiNormal3fVertex3fvSUN (_GET_TLS_PROCTABLE()->ReplacementCodeuiNormal3fVertex3fvSUN) +#define glReplacementCodeuiColor4fNormal3fVertex3fSUN (_GET_TLS_PROCTABLE()->ReplacementCodeuiColor4fNormal3fVertex3fSUN) +#define glReplacementCodeuiColor4fNormal3fVertex3fvSUN (_GET_TLS_PROCTABLE()->ReplacementCodeuiColor4fNormal3fVertex3fvSUN) +#define glReplacementCodeuiTexCoord2fVertex3fSUN (_GET_TLS_PROCTABLE()->ReplacementCodeuiTexCoord2fVertex3fSUN) +#define glReplacementCodeuiTexCoord2fVertex3fvSUN (_GET_TLS_PROCTABLE()->ReplacementCodeuiTexCoord2fVertex3fvSUN) +#define glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN (_GET_TLS_PROCTABLE()->ReplacementCodeuiTexCoord2fNormal3fVertex3fSUN) +#define glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN (_GET_TLS_PROCTABLE()->ReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN) +#define glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN (_GET_TLS_PROCTABLE()->ReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN) +#define glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN (_GET_TLS_PROCTABLE()->ReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN) +#define glBlendFuncSeparateEXT (_GET_TLS_PROCTABLE()->BlendFuncSeparateEXT) +#define glBlendFuncSeparateINGR (_GET_TLS_PROCTABLE()->BlendFuncSeparateINGR) +#define glVertexWeightfEXT (_GET_TLS_PROCTABLE()->VertexWeightfEXT) +#define glVertexWeightfvEXT (_GET_TLS_PROCTABLE()->VertexWeightfvEXT) +#define glVertexWeightPointerEXT (_GET_TLS_PROCTABLE()->VertexWeightPointerEXT) +#define glFlushVertexArrayRangeNV (_GET_TLS_PROCTABLE()->FlushVertexArrayRangeNV) +#define glVertexArrayRangeNV (_GET_TLS_PROCTABLE()->VertexArrayRangeNV) +#define glCombinerParameterfvNV (_GET_TLS_PROCTABLE()->CombinerParameterfvNV) +#define glCombinerParameterfNV (_GET_TLS_PROCTABLE()->CombinerParameterfNV) +#define glCombinerParameterivNV (_GET_TLS_PROCTABLE()->CombinerParameterivNV) +#define glCombinerParameteriNV (_GET_TLS_PROCTABLE()->CombinerParameteriNV) +#define glCombinerInputNV (_GET_TLS_PROCTABLE()->CombinerInputNV) +#define glCombinerOutputNV (_GET_TLS_PROCTABLE()->CombinerOutputNV) +#define glFinalCombinerInputNV (_GET_TLS_PROCTABLE()->FinalCombinerInputNV) +#define glGetCombinerInputParameterfvNV (_GET_TLS_PROCTABLE()->GetCombinerInputParameterfvNV) +#define glGetCombinerInputParameterivNV (_GET_TLS_PROCTABLE()->GetCombinerInputParameterivNV) +#define glGetCombinerOutputParameterfvNV (_GET_TLS_PROCTABLE()->GetCombinerOutputParameterfvNV) +#define glGetCombinerOutputParameterivNV (_GET_TLS_PROCTABLE()->GetCombinerOutputParameterivNV) +#define glGetFinalCombinerInputParameterfvNV (_GET_TLS_PROCTABLE()->GetFinalCombinerInputParameterfvNV) +#define glGetFinalCombinerInputParameterivNV (_GET_TLS_PROCTABLE()->GetFinalCombinerInputParameterivNV) +#define glResizeBuffersMESA (_GET_TLS_PROCTABLE()->ResizeBuffersMESA) +#define glWindowPos2dMESA (_GET_TLS_PROCTABLE()->WindowPos2dMESA) +#define glWindowPos2dvMESA (_GET_TLS_PROCTABLE()->WindowPos2dvMESA) +#define glWindowPos2fMESA (_GET_TLS_PROCTABLE()->WindowPos2fMESA) +#define glWindowPos2fvMESA (_GET_TLS_PROCTABLE()->WindowPos2fvMESA) +#define glWindowPos2iMESA (_GET_TLS_PROCTABLE()->WindowPos2iMESA) +#define glWindowPos2ivMESA (_GET_TLS_PROCTABLE()->WindowPos2ivMESA) +#define glWindowPos2sMESA (_GET_TLS_PROCTABLE()->WindowPos2sMESA) +#define glWindowPos2svMESA (_GET_TLS_PROCTABLE()->WindowPos2svMESA) +#define glWindowPos3dMESA (_GET_TLS_PROCTABLE()->WindowPos3dMESA) +#define glWindowPos3dvMESA (_GET_TLS_PROCTABLE()->WindowPos3dvMESA) +#define glWindowPos3fMESA (_GET_TLS_PROCTABLE()->WindowPos3fMESA) +#define glWindowPos3fvMESA (_GET_TLS_PROCTABLE()->WindowPos3fvMESA) +#define glWindowPos3iMESA (_GET_TLS_PROCTABLE()->WindowPos3iMESA) +#define glWindowPos3ivMESA (_GET_TLS_PROCTABLE()->WindowPos3ivMESA) +#define glWindowPos3sMESA (_GET_TLS_PROCTABLE()->WindowPos3sMESA) +#define glWindowPos3svMESA (_GET_TLS_PROCTABLE()->WindowPos3svMESA) +#define glWindowPos4dMESA (_GET_TLS_PROCTABLE()->WindowPos4dMESA) +#define glWindowPos4dvMESA (_GET_TLS_PROCTABLE()->WindowPos4dvMESA) +#define glWindowPos4fMESA (_GET_TLS_PROCTABLE()->WindowPos4fMESA) +#define glWindowPos4fvMESA (_GET_TLS_PROCTABLE()->WindowPos4fvMESA) +#define glWindowPos4iMESA (_GET_TLS_PROCTABLE()->WindowPos4iMESA) +#define glWindowPos4ivMESA (_GET_TLS_PROCTABLE()->WindowPos4ivMESA) +#define glWindowPos4sMESA (_GET_TLS_PROCTABLE()->WindowPos4sMESA) +#define glWindowPos4svMESA (_GET_TLS_PROCTABLE()->WindowPos4svMESA) +#define glMultiModeDrawArraysIBM (_GET_TLS_PROCTABLE()->MultiModeDrawArraysIBM) +#define glMultiModeDrawElementsIBM (_GET_TLS_PROCTABLE()->MultiModeDrawElementsIBM) +#define glColorPointerListIBM (_GET_TLS_PROCTABLE()->ColorPointerListIBM) +#define glSecondaryColorPointerListIBM (_GET_TLS_PROCTABLE()->SecondaryColorPointerListIBM) +#define glEdgeFlagPointerListIBM (_GET_TLS_PROCTABLE()->EdgeFlagPointerListIBM) +#define glFogCoordPointerListIBM (_GET_TLS_PROCTABLE()->FogCoordPointerListIBM) +#define glIndexPointerListIBM (_GET_TLS_PROCTABLE()->IndexPointerListIBM) +#define glNormalPointerListIBM (_GET_TLS_PROCTABLE()->NormalPointerListIBM) +#define glTexCoordPointerListIBM (_GET_TLS_PROCTABLE()->TexCoordPointerListIBM) +#define glVertexPointerListIBM (_GET_TLS_PROCTABLE()->VertexPointerListIBM) +#define glTbufferMask3DFX (_GET_TLS_PROCTABLE()->TbufferMask3DFX) +#define glSampleMaskEXT (_GET_TLS_PROCTABLE()->SampleMaskEXT) +#define glSamplePatternEXT (_GET_TLS_PROCTABLE()->SamplePatternEXT) +#define glTextureColorMaskSGIS (_GET_TLS_PROCTABLE()->TextureColorMaskSGIS) +#define glIglooInterfaceSGIX (_GET_TLS_PROCTABLE()->IglooInterfaceSGIX) +#define glDeleteFencesNV (_GET_TLS_PROCTABLE()->DeleteFencesNV) +#define glGenFencesNV (_GET_TLS_PROCTABLE()->GenFencesNV) +#define glIsFenceNV (_GET_TLS_PROCTABLE()->IsFenceNV) +#define glTestFenceNV (_GET_TLS_PROCTABLE()->TestFenceNV) +#define glGetFenceivNV (_GET_TLS_PROCTABLE()->GetFenceivNV) +#define glFinishFenceNV (_GET_TLS_PROCTABLE()->FinishFenceNV) +#define glSetFenceNV (_GET_TLS_PROCTABLE()->SetFenceNV) +#define glMapControlPointsNV (_GET_TLS_PROCTABLE()->MapControlPointsNV) +#define glMapParameterivNV (_GET_TLS_PROCTABLE()->MapParameterivNV) +#define glMapParameterfvNV (_GET_TLS_PROCTABLE()->MapParameterfvNV) +#define glGetMapControlPointsNV (_GET_TLS_PROCTABLE()->GetMapControlPointsNV) +#define glGetMapParameterivNV (_GET_TLS_PROCTABLE()->GetMapParameterivNV) +#define glGetMapParameterfvNV (_GET_TLS_PROCTABLE()->GetMapParameterfvNV) +#define glGetMapAttribParameterivNV (_GET_TLS_PROCTABLE()->GetMapAttribParameterivNV) +#define glGetMapAttribParameterfvNV (_GET_TLS_PROCTABLE()->GetMapAttribParameterfvNV) +#define glEvalMapsNV (_GET_TLS_PROCTABLE()->EvalMapsNV) +#define glCombinerStageParameterfvNV (_GET_TLS_PROCTABLE()->CombinerStageParameterfvNV) +#define glGetCombinerStageParameterfvNV (_GET_TLS_PROCTABLE()->GetCombinerStageParameterfvNV) +#define glAreProgramsResidentNV (_GET_TLS_PROCTABLE()->AreProgramsResidentNV) +#define glBindProgramNV (_GET_TLS_PROCTABLE()->BindProgramNV) +#define glDeleteProgramsNV (_GET_TLS_PROCTABLE()->DeleteProgramsNV) +#define glExecuteProgramNV (_GET_TLS_PROCTABLE()->ExecuteProgramNV) +#define glGenProgramsNV (_GET_TLS_PROCTABLE()->GenProgramsNV) +#define glGetProgramParameterdvNV (_GET_TLS_PROCTABLE()->GetProgramParameterdvNV) +#define glGetProgramParameterfvNV (_GET_TLS_PROCTABLE()->GetProgramParameterfvNV) +#define glGetProgramivNV (_GET_TLS_PROCTABLE()->GetProgramivNV) +#define glGetProgramStringNV (_GET_TLS_PROCTABLE()->GetProgramStringNV) +#define glGetTrackMatrixivNV (_GET_TLS_PROCTABLE()->GetTrackMatrixivNV) +#define glGetVertexAttribdvNV (_GET_TLS_PROCTABLE()->GetVertexAttribdvNV) +#define glGetVertexAttribfvNV (_GET_TLS_PROCTABLE()->GetVertexAttribfvNV) +#define glGetVertexAttribivNV (_GET_TLS_PROCTABLE()->GetVertexAttribivNV) +#define glGetVertexAttribPointervNV (_GET_TLS_PROCTABLE()->GetVertexAttribPointervNV) +#define glIsProgramNV (_GET_TLS_PROCTABLE()->IsProgramNV) +#define glLoadProgramNV (_GET_TLS_PROCTABLE()->LoadProgramNV) +#define glProgramParameter4dNV (_GET_TLS_PROCTABLE()->ProgramParameter4dNV) +#define glProgramParameter4dvNV (_GET_TLS_PROCTABLE()->ProgramParameter4dvNV) +#define glProgramParameter4fNV (_GET_TLS_PROCTABLE()->ProgramParameter4fNV) +#define glProgramParameter4fvNV (_GET_TLS_PROCTABLE()->ProgramParameter4fvNV) +#define glProgramParameters4dvNV (_GET_TLS_PROCTABLE()->ProgramParameters4dvNV) +#define glProgramParameters4fvNV (_GET_TLS_PROCTABLE()->ProgramParameters4fvNV) +#define glRequestResidentProgramsNV (_GET_TLS_PROCTABLE()->RequestResidentProgramsNV) +#define glTrackMatrixNV (_GET_TLS_PROCTABLE()->TrackMatrixNV) +#define glVertexAttribPointerNV (_GET_TLS_PROCTABLE()->VertexAttribPointerNV) +#define glVertexAttrib1dNV (_GET_TLS_PROCTABLE()->VertexAttrib1dNV) +#define glVertexAttrib1dvNV (_GET_TLS_PROCTABLE()->VertexAttrib1dvNV) +#define glVertexAttrib1fNV (_GET_TLS_PROCTABLE()->VertexAttrib1fNV) +#define glVertexAttrib1fvNV (_GET_TLS_PROCTABLE()->VertexAttrib1fvNV) +#define glVertexAttrib1sNV (_GET_TLS_PROCTABLE()->VertexAttrib1sNV) +#define glVertexAttrib1svNV (_GET_TLS_PROCTABLE()->VertexAttrib1svNV) +#define glVertexAttrib2dNV (_GET_TLS_PROCTABLE()->VertexAttrib2dNV) +#define glVertexAttrib2dvNV (_GET_TLS_PROCTABLE()->VertexAttrib2dvNV) +#define glVertexAttrib2fNV (_GET_TLS_PROCTABLE()->VertexAttrib2fNV) +#define glVertexAttrib2fvNV (_GET_TLS_PROCTABLE()->VertexAttrib2fvNV) +#define glVertexAttrib2sNV (_GET_TLS_PROCTABLE()->VertexAttrib2sNV) +#define glVertexAttrib2svNV (_GET_TLS_PROCTABLE()->VertexAttrib2svNV) +#define glVertexAttrib3dNV (_GET_TLS_PROCTABLE()->VertexAttrib3dNV) +#define glVertexAttrib3dvNV (_GET_TLS_PROCTABLE()->VertexAttrib3dvNV) +#define glVertexAttrib3fNV (_GET_TLS_PROCTABLE()->VertexAttrib3fNV) +#define glVertexAttrib3fvNV (_GET_TLS_PROCTABLE()->VertexAttrib3fvNV) +#define glVertexAttrib3sNV (_GET_TLS_PROCTABLE()->VertexAttrib3sNV) +#define glVertexAttrib3svNV (_GET_TLS_PROCTABLE()->VertexAttrib3svNV) +#define glVertexAttrib4dNV (_GET_TLS_PROCTABLE()->VertexAttrib4dNV) +#define glVertexAttrib4dvNV (_GET_TLS_PROCTABLE()->VertexAttrib4dvNV) +#define glVertexAttrib4fNV (_GET_TLS_PROCTABLE()->VertexAttrib4fNV) +#define glVertexAttrib4fvNV (_GET_TLS_PROCTABLE()->VertexAttrib4fvNV) +#define glVertexAttrib4sNV (_GET_TLS_PROCTABLE()->VertexAttrib4sNV) +#define glVertexAttrib4svNV (_GET_TLS_PROCTABLE()->VertexAttrib4svNV) +#define glVertexAttrib4ubNV (_GET_TLS_PROCTABLE()->VertexAttrib4ubNV) +#define glVertexAttrib4ubvNV (_GET_TLS_PROCTABLE()->VertexAttrib4ubvNV) +#define glVertexAttribs1dvNV (_GET_TLS_PROCTABLE()->VertexAttribs1dvNV) +#define glVertexAttribs1fvNV (_GET_TLS_PROCTABLE()->VertexAttribs1fvNV) +#define glVertexAttribs1svNV (_GET_TLS_PROCTABLE()->VertexAttribs1svNV) +#define glVertexAttribs2dvNV (_GET_TLS_PROCTABLE()->VertexAttribs2dvNV) +#define glVertexAttribs2fvNV (_GET_TLS_PROCTABLE()->VertexAttribs2fvNV) +#define glVertexAttribs2svNV (_GET_TLS_PROCTABLE()->VertexAttribs2svNV) +#define glVertexAttribs3dvNV (_GET_TLS_PROCTABLE()->VertexAttribs3dvNV) +#define glVertexAttribs3fvNV (_GET_TLS_PROCTABLE()->VertexAttribs3fvNV) +#define glVertexAttribs3svNV (_GET_TLS_PROCTABLE()->VertexAttribs3svNV) +#define glVertexAttribs4dvNV (_GET_TLS_PROCTABLE()->VertexAttribs4dvNV) +#define glVertexAttribs4fvNV (_GET_TLS_PROCTABLE()->VertexAttribs4fvNV) +#define glVertexAttribs4svNV (_GET_TLS_PROCTABLE()->VertexAttribs4svNV) +#define glVertexAttribs4ubvNV (_GET_TLS_PROCTABLE()->VertexAttribs4ubvNV) +#define glTexBumpParameterivATI (_GET_TLS_PROCTABLE()->TexBumpParameterivATI) +#define glTexBumpParameterfvATI (_GET_TLS_PROCTABLE()->TexBumpParameterfvATI) +#define glGetTexBumpParameterivATI (_GET_TLS_PROCTABLE()->GetTexBumpParameterivATI) +#define glGetTexBumpParameterfvATI (_GET_TLS_PROCTABLE()->GetTexBumpParameterfvATI) +#define glGenFragmentShadersATI (_GET_TLS_PROCTABLE()->GenFragmentShadersATI) +#define glBindFragmentShaderATI (_GET_TLS_PROCTABLE()->BindFragmentShaderATI) +#define glDeleteFragmentShaderATI (_GET_TLS_PROCTABLE()->DeleteFragmentShaderATI) +#define glBeginFragmentShaderATI (_GET_TLS_PROCTABLE()->BeginFragmentShaderATI) +#define glEndFragmentShaderATI (_GET_TLS_PROCTABLE()->EndFragmentShaderATI) +#define glPassTexCoordATI (_GET_TLS_PROCTABLE()->PassTexCoordATI) +#define glSampleMapATI (_GET_TLS_PROCTABLE()->SampleMapATI) +#define glColorFragmentOp1ATI (_GET_TLS_PROCTABLE()->ColorFragmentOp1ATI) +#define glColorFragmentOp2ATI (_GET_TLS_PROCTABLE()->ColorFragmentOp2ATI) +#define glColorFragmentOp3ATI (_GET_TLS_PROCTABLE()->ColorFragmentOp3ATI) +#define glAlphaFragmentOp1ATI (_GET_TLS_PROCTABLE()->AlphaFragmentOp1ATI) +#define glAlphaFragmentOp2ATI (_GET_TLS_PROCTABLE()->AlphaFragmentOp2ATI) +#define glAlphaFragmentOp3ATI (_GET_TLS_PROCTABLE()->AlphaFragmentOp3ATI) +#define glSetFragmentShaderConstantATI (_GET_TLS_PROCTABLE()->SetFragmentShaderConstantATI) +#define glPNTrianglesiATI (_GET_TLS_PROCTABLE()->PNTrianglesiATI) +#define glPNTrianglesfATI (_GET_TLS_PROCTABLE()->PNTrianglesfATI) +#define glNewObjectBufferATI (_GET_TLS_PROCTABLE()->NewObjectBufferATI) +#define glIsObjectBufferATI (_GET_TLS_PROCTABLE()->IsObjectBufferATI) +#define glUpdateObjectBufferATI (_GET_TLS_PROCTABLE()->UpdateObjectBufferATI) +#define glGetObjectBufferfvATI (_GET_TLS_PROCTABLE()->GetObjectBufferfvATI) +#define glGetObjectBufferivATI (_GET_TLS_PROCTABLE()->GetObjectBufferivATI) +#define glFreeObjectBufferATI (_GET_TLS_PROCTABLE()->FreeObjectBufferATI) +#define glArrayObjectATI (_GET_TLS_PROCTABLE()->ArrayObjectATI) +#define glGetArrayObjectfvATI (_GET_TLS_PROCTABLE()->GetArrayObjectfvATI) +#define glGetArrayObjectivATI (_GET_TLS_PROCTABLE()->GetArrayObjectivATI) +#define glVariantArrayObjectATI (_GET_TLS_PROCTABLE()->VariantArrayObjectATI) +#define glGetVariantArrayObjectfvATI (_GET_TLS_PROCTABLE()->GetVariantArrayObjectfvATI) +#define glGetVariantArrayObjectivATI (_GET_TLS_PROCTABLE()->GetVariantArrayObjectivATI) +#define glBeginVertexShaderEXT (_GET_TLS_PROCTABLE()->BeginVertexShaderEXT) +#define glEndVertexShaderEXT (_GET_TLS_PROCTABLE()->EndVertexShaderEXT) +#define glBindVertexShaderEXT (_GET_TLS_PROCTABLE()->BindVertexShaderEXT) +#define glGenVertexShadersEXT (_GET_TLS_PROCTABLE()->GenVertexShadersEXT) +#define glDeleteVertexShaderEXT (_GET_TLS_PROCTABLE()->DeleteVertexShaderEXT) +#define glShaderOp1EXT (_GET_TLS_PROCTABLE()->ShaderOp1EXT) +#define glShaderOp2EXT (_GET_TLS_PROCTABLE()->ShaderOp2EXT) +#define glShaderOp3EXT (_GET_TLS_PROCTABLE()->ShaderOp3EXT) +#define glSwizzleEXT (_GET_TLS_PROCTABLE()->SwizzleEXT) +#define glWriteMaskEXT (_GET_TLS_PROCTABLE()->WriteMaskEXT) +#define glInsertComponentEXT (_GET_TLS_PROCTABLE()->InsertComponentEXT) +#define glExtractComponentEXT (_GET_TLS_PROCTABLE()->ExtractComponentEXT) +#define glGenSymbolsEXT (_GET_TLS_PROCTABLE()->GenSymbolsEXT) +#define glSetInvariantEXT (_GET_TLS_PROCTABLE()->SetInvariantEXT) +#define glSetLocalConstantEXT (_GET_TLS_PROCTABLE()->SetLocalConstantEXT) +#define glVariantbvEXT (_GET_TLS_PROCTABLE()->VariantbvEXT) +#define glVariantsvEXT (_GET_TLS_PROCTABLE()->VariantsvEXT) +#define glVariantivEXT (_GET_TLS_PROCTABLE()->VariantivEXT) +#define glVariantfvEXT (_GET_TLS_PROCTABLE()->VariantfvEXT) +#define glVariantdvEXT (_GET_TLS_PROCTABLE()->VariantdvEXT) +#define glVariantubvEXT (_GET_TLS_PROCTABLE()->VariantubvEXT) +#define glVariantusvEXT (_GET_TLS_PROCTABLE()->VariantusvEXT) +#define glVariantuivEXT (_GET_TLS_PROCTABLE()->VariantuivEXT) +#define glVariantPointerEXT (_GET_TLS_PROCTABLE()->VariantPointerEXT) +#define glEnableVariantClientStateEXT (_GET_TLS_PROCTABLE()->EnableVariantClientStateEXT) +#define glDisableVariantClientStateEXT (_GET_TLS_PROCTABLE()->DisableVariantClientStateEXT) +#define glBindLightParameterEXT (_GET_TLS_PROCTABLE()->BindLightParameterEXT) +#define glBindMaterialParameterEXT (_GET_TLS_PROCTABLE()->BindMaterialParameterEXT) +#define glBindTexGenParameterEXT (_GET_TLS_PROCTABLE()->BindTexGenParameterEXT) +#define glBindTextureUnitParameterEXT (_GET_TLS_PROCTABLE()->BindTextureUnitParameterEXT) +#define glBindParameterEXT (_GET_TLS_PROCTABLE()->BindParameterEXT) +#define glIsVariantEnabledEXT (_GET_TLS_PROCTABLE()->IsVariantEnabledEXT) +#define glGetVariantBooleanvEXT (_GET_TLS_PROCTABLE()->GetVariantBooleanvEXT) +#define glGetVariantIntegervEXT (_GET_TLS_PROCTABLE()->GetVariantIntegervEXT) +#define glGetVariantFloatvEXT (_GET_TLS_PROCTABLE()->GetVariantFloatvEXT) +#define glGetVariantPointervEXT (_GET_TLS_PROCTABLE()->GetVariantPointervEXT) +#define glGetInvariantBooleanvEXT (_GET_TLS_PROCTABLE()->GetInvariantBooleanvEXT) +#define glGetInvariantIntegervEXT (_GET_TLS_PROCTABLE()->GetInvariantIntegervEXT) +#define glGetInvariantFloatvEXT (_GET_TLS_PROCTABLE()->GetInvariantFloatvEXT) +#define glGetLocalConstantBooleanvEXT (_GET_TLS_PROCTABLE()->GetLocalConstantBooleanvEXT) +#define glGetLocalConstantIntegervEXT (_GET_TLS_PROCTABLE()->GetLocalConstantIntegervEXT) +#define glGetLocalConstantFloatvEXT (_GET_TLS_PROCTABLE()->GetLocalConstantFloatvEXT) +#define glVertexStream1sATI (_GET_TLS_PROCTABLE()->VertexStream1sATI) +#define glVertexStream1svATI (_GET_TLS_PROCTABLE()->VertexStream1svATI) +#define glVertexStream1iATI (_GET_TLS_PROCTABLE()->VertexStream1iATI) +#define glVertexStream1ivATI (_GET_TLS_PROCTABLE()->VertexStream1ivATI) +#define glVertexStream1fATI (_GET_TLS_PROCTABLE()->VertexStream1fATI) +#define glVertexStream1fvATI (_GET_TLS_PROCTABLE()->VertexStream1fvATI) +#define glVertexStream1dATI (_GET_TLS_PROCTABLE()->VertexStream1dATI) +#define glVertexStream1dvATI (_GET_TLS_PROCTABLE()->VertexStream1dvATI) +#define glVertexStream2sATI (_GET_TLS_PROCTABLE()->VertexStream2sATI) +#define glVertexStream2svATI (_GET_TLS_PROCTABLE()->VertexStream2svATI) +#define glVertexStream2iATI (_GET_TLS_PROCTABLE()->VertexStream2iATI) +#define glVertexStream2ivATI (_GET_TLS_PROCTABLE()->VertexStream2ivATI) +#define glVertexStream2fATI (_GET_TLS_PROCTABLE()->VertexStream2fATI) +#define glVertexStream2fvATI (_GET_TLS_PROCTABLE()->VertexStream2fvATI) +#define glVertexStream2dATI (_GET_TLS_PROCTABLE()->VertexStream2dATI) +#define glVertexStream2dvATI (_GET_TLS_PROCTABLE()->VertexStream2dvATI) +#define glVertexStream3sATI (_GET_TLS_PROCTABLE()->VertexStream3sATI) +#define glVertexStream3svATI (_GET_TLS_PROCTABLE()->VertexStream3svATI) +#define glVertexStream3iATI (_GET_TLS_PROCTABLE()->VertexStream3iATI) +#define glVertexStream3ivATI (_GET_TLS_PROCTABLE()->VertexStream3ivATI) +#define glVertexStream3fATI (_GET_TLS_PROCTABLE()->VertexStream3fATI) +#define glVertexStream3fvATI (_GET_TLS_PROCTABLE()->VertexStream3fvATI) +#define glVertexStream3dATI (_GET_TLS_PROCTABLE()->VertexStream3dATI) +#define glVertexStream3dvATI (_GET_TLS_PROCTABLE()->VertexStream3dvATI) +#define glVertexStream4sATI (_GET_TLS_PROCTABLE()->VertexStream4sATI) +#define glVertexStream4svATI (_GET_TLS_PROCTABLE()->VertexStream4svATI) +#define glVertexStream4iATI (_GET_TLS_PROCTABLE()->VertexStream4iATI) +#define glVertexStream4ivATI (_GET_TLS_PROCTABLE()->VertexStream4ivATI) +#define glVertexStream4fATI (_GET_TLS_PROCTABLE()->VertexStream4fATI) +#define glVertexStream4fvATI (_GET_TLS_PROCTABLE()->VertexStream4fvATI) +#define glVertexStream4dATI (_GET_TLS_PROCTABLE()->VertexStream4dATI) +#define glVertexStream4dvATI (_GET_TLS_PROCTABLE()->VertexStream4dvATI) +#define glNormalStream3bATI (_GET_TLS_PROCTABLE()->NormalStream3bATI) +#define glNormalStream3bvATI (_GET_TLS_PROCTABLE()->NormalStream3bvATI) +#define glNormalStream3sATI (_GET_TLS_PROCTABLE()->NormalStream3sATI) +#define glNormalStream3svATI (_GET_TLS_PROCTABLE()->NormalStream3svATI) +#define glNormalStream3iATI (_GET_TLS_PROCTABLE()->NormalStream3iATI) +#define glNormalStream3ivATI (_GET_TLS_PROCTABLE()->NormalStream3ivATI) +#define glNormalStream3fATI (_GET_TLS_PROCTABLE()->NormalStream3fATI) +#define glNormalStream3fvATI (_GET_TLS_PROCTABLE()->NormalStream3fvATI) +#define glNormalStream3dATI (_GET_TLS_PROCTABLE()->NormalStream3dATI) +#define glNormalStream3dvATI (_GET_TLS_PROCTABLE()->NormalStream3dvATI) +#define glClientActiveVertexStreamATI (_GET_TLS_PROCTABLE()->ClientActiveVertexStreamATI) +#define glVertexBlendEnviATI (_GET_TLS_PROCTABLE()->VertexBlendEnviATI) +#define glVertexBlendEnvfATI (_GET_TLS_PROCTABLE()->VertexBlendEnvfATI) +#define glElementPointerATI (_GET_TLS_PROCTABLE()->ElementPointerATI) +#define glDrawElementArrayATI (_GET_TLS_PROCTABLE()->DrawElementArrayATI) +#define glDrawRangeElementArrayATI (_GET_TLS_PROCTABLE()->DrawRangeElementArrayATI) +#define glDrawMeshArraysSUN (_GET_TLS_PROCTABLE()->DrawMeshArraysSUN) +#define glGenOcclusionQueriesNV (_GET_TLS_PROCTABLE()->GenOcclusionQueriesNV) +#define glDeleteOcclusionQueriesNV (_GET_TLS_PROCTABLE()->DeleteOcclusionQueriesNV) +#define glIsOcclusionQueryNV (_GET_TLS_PROCTABLE()->IsOcclusionQueryNV) +#define glBeginOcclusionQueryNV (_GET_TLS_PROCTABLE()->BeginOcclusionQueryNV) +#define glEndOcclusionQueryNV (_GET_TLS_PROCTABLE()->EndOcclusionQueryNV) +#define glGetOcclusionQueryivNV (_GET_TLS_PROCTABLE()->GetOcclusionQueryivNV) +#define glGetOcclusionQueryuivNV (_GET_TLS_PROCTABLE()->GetOcclusionQueryuivNV) +#define glPointParameteriNV (_GET_TLS_PROCTABLE()->PointParameteriNV) +#define glPointParameterivNV (_GET_TLS_PROCTABLE()->PointParameterivNV) +#define glActiveStencilFaceEXT (_GET_TLS_PROCTABLE()->ActiveStencilFaceEXT) +#define glElementPointerAPPLE (_GET_TLS_PROCTABLE()->ElementPointerAPPLE) +#define glDrawElementArrayAPPLE (_GET_TLS_PROCTABLE()->DrawElementArrayAPPLE) +#define glDrawRangeElementArrayAPPLE (_GET_TLS_PROCTABLE()->DrawRangeElementArrayAPPLE) +#define glMultiDrawElementArrayAPPLE (_GET_TLS_PROCTABLE()->MultiDrawElementArrayAPPLE) +#define glMultiDrawRangeElementArrayAPPLE (_GET_TLS_PROCTABLE()->MultiDrawRangeElementArrayAPPLE) +#define glGenFencesAPPLE (_GET_TLS_PROCTABLE()->GenFencesAPPLE) +#define glDeleteFencesAPPLE (_GET_TLS_PROCTABLE()->DeleteFencesAPPLE) +#define glSetFenceAPPLE (_GET_TLS_PROCTABLE()->SetFenceAPPLE) +#define glIsFenceAPPLE (_GET_TLS_PROCTABLE()->IsFenceAPPLE) +#define glTestFenceAPPLE (_GET_TLS_PROCTABLE()->TestFenceAPPLE) +#define glFinishFenceAPPLE (_GET_TLS_PROCTABLE()->FinishFenceAPPLE) +#define glTestObjectAPPLE (_GET_TLS_PROCTABLE()->TestObjectAPPLE) +#define glFinishObjectAPPLE (_GET_TLS_PROCTABLE()->FinishObjectAPPLE) +#define glBindVertexArrayAPPLE (_GET_TLS_PROCTABLE()->BindVertexArrayAPPLE) +#define glDeleteVertexArraysAPPLE (_GET_TLS_PROCTABLE()->DeleteVertexArraysAPPLE) +#define glGenVertexArraysAPPLE (_GET_TLS_PROCTABLE()->GenVertexArraysAPPLE) +#define glIsVertexArrayAPPLE (_GET_TLS_PROCTABLE()->IsVertexArrayAPPLE) +#define glVertexArrayRangeAPPLE (_GET_TLS_PROCTABLE()->VertexArrayRangeAPPLE) +#define glFlushVertexArrayRangeAPPLE (_GET_TLS_PROCTABLE()->FlushVertexArrayRangeAPPLE) +#define glVertexArrayParameteriAPPLE (_GET_TLS_PROCTABLE()->VertexArrayParameteriAPPLE) +#define glDrawBuffersATI (_GET_TLS_PROCTABLE()->DrawBuffersATI) +#define glProgramNamedParameter4fNV (_GET_TLS_PROCTABLE()->ProgramNamedParameter4fNV) +#define glProgramNamedParameter4dNV (_GET_TLS_PROCTABLE()->ProgramNamedParameter4dNV) +#define glProgramNamedParameter4fvNV (_GET_TLS_PROCTABLE()->ProgramNamedParameter4fvNV) +#define glProgramNamedParameter4dvNV (_GET_TLS_PROCTABLE()->ProgramNamedParameter4dvNV) +#define glGetProgramNamedParameterfvNV (_GET_TLS_PROCTABLE()->GetProgramNamedParameterfvNV) +#define glGetProgramNamedParameterdvNV (_GET_TLS_PROCTABLE()->GetProgramNamedParameterdvNV) +#define glVertex2hNV (_GET_TLS_PROCTABLE()->Vertex2hNV) +#define glVertex2hvNV (_GET_TLS_PROCTABLE()->Vertex2hvNV) +#define glVertex3hNV (_GET_TLS_PROCTABLE()->Vertex3hNV) +#define glVertex3hvNV (_GET_TLS_PROCTABLE()->Vertex3hvNV) +#define glVertex4hNV (_GET_TLS_PROCTABLE()->Vertex4hNV) +#define glVertex4hvNV (_GET_TLS_PROCTABLE()->Vertex4hvNV) +#define glNormal3hNV (_GET_TLS_PROCTABLE()->Normal3hNV) +#define glNormal3hvNV (_GET_TLS_PROCTABLE()->Normal3hvNV) +#define glColor3hNV (_GET_TLS_PROCTABLE()->Color3hNV) +#define glColor3hvNV (_GET_TLS_PROCTABLE()->Color3hvNV) +#define glColor4hNV (_GET_TLS_PROCTABLE()->Color4hNV) +#define glColor4hvNV (_GET_TLS_PROCTABLE()->Color4hvNV) +#define glTexCoord1hNV (_GET_TLS_PROCTABLE()->TexCoord1hNV) +#define glTexCoord1hvNV (_GET_TLS_PROCTABLE()->TexCoord1hvNV) +#define glTexCoord2hNV (_GET_TLS_PROCTABLE()->TexCoord2hNV) +#define glTexCoord2hvNV (_GET_TLS_PROCTABLE()->TexCoord2hvNV) +#define glTexCoord3hNV (_GET_TLS_PROCTABLE()->TexCoord3hNV) +#define glTexCoord3hvNV (_GET_TLS_PROCTABLE()->TexCoord3hvNV) +#define glTexCoord4hNV (_GET_TLS_PROCTABLE()->TexCoord4hNV) +#define glTexCoord4hvNV (_GET_TLS_PROCTABLE()->TexCoord4hvNV) +#define glMultiTexCoord1hNV (_GET_TLS_PROCTABLE()->MultiTexCoord1hNV) +#define glMultiTexCoord1hvNV (_GET_TLS_PROCTABLE()->MultiTexCoord1hvNV) +#define glMultiTexCoord2hNV (_GET_TLS_PROCTABLE()->MultiTexCoord2hNV) +#define glMultiTexCoord2hvNV (_GET_TLS_PROCTABLE()->MultiTexCoord2hvNV) +#define glMultiTexCoord3hNV (_GET_TLS_PROCTABLE()->MultiTexCoord3hNV) +#define glMultiTexCoord3hvNV (_GET_TLS_PROCTABLE()->MultiTexCoord3hvNV) +#define glMultiTexCoord4hNV (_GET_TLS_PROCTABLE()->MultiTexCoord4hNV) +#define glMultiTexCoord4hvNV (_GET_TLS_PROCTABLE()->MultiTexCoord4hvNV) +#define glFogCoordhNV (_GET_TLS_PROCTABLE()->FogCoordhNV) +#define glFogCoordhvNV (_GET_TLS_PROCTABLE()->FogCoordhvNV) +#define glSecondaryColor3hNV (_GET_TLS_PROCTABLE()->SecondaryColor3hNV) +#define glSecondaryColor3hvNV (_GET_TLS_PROCTABLE()->SecondaryColor3hvNV) +#define glVertexWeighthNV (_GET_TLS_PROCTABLE()->VertexWeighthNV) +#define glVertexWeighthvNV (_GET_TLS_PROCTABLE()->VertexWeighthvNV) +#define glVertexAttrib1hNV (_GET_TLS_PROCTABLE()->VertexAttrib1hNV) +#define glVertexAttrib1hvNV (_GET_TLS_PROCTABLE()->VertexAttrib1hvNV) +#define glVertexAttrib2hNV (_GET_TLS_PROCTABLE()->VertexAttrib2hNV) +#define glVertexAttrib2hvNV (_GET_TLS_PROCTABLE()->VertexAttrib2hvNV) +#define glVertexAttrib3hNV (_GET_TLS_PROCTABLE()->VertexAttrib3hNV) +#define glVertexAttrib3hvNV (_GET_TLS_PROCTABLE()->VertexAttrib3hvNV) +#define glVertexAttrib4hNV (_GET_TLS_PROCTABLE()->VertexAttrib4hNV) +#define glVertexAttrib4hvNV (_GET_TLS_PROCTABLE()->VertexAttrib4hvNV) +#define glVertexAttribs1hvNV (_GET_TLS_PROCTABLE()->VertexAttribs1hvNV) +#define glVertexAttribs2hvNV (_GET_TLS_PROCTABLE()->VertexAttribs2hvNV) +#define glVertexAttribs3hvNV (_GET_TLS_PROCTABLE()->VertexAttribs3hvNV) +#define glVertexAttribs4hvNV (_GET_TLS_PROCTABLE()->VertexAttribs4hvNV) +#define glPixelDataRangeNV (_GET_TLS_PROCTABLE()->PixelDataRangeNV) +#define glFlushPixelDataRangeNV (_GET_TLS_PROCTABLE()->FlushPixelDataRangeNV) +#define glPrimitiveRestartNV (_GET_TLS_PROCTABLE()->PrimitiveRestartNV) +#define glPrimitiveRestartIndexNV (_GET_TLS_PROCTABLE()->PrimitiveRestartIndexNV) +#define glMapObjectBufferATI (_GET_TLS_PROCTABLE()->MapObjectBufferATI) +#define glUnmapObjectBufferATI (_GET_TLS_PROCTABLE()->UnmapObjectBufferATI) +#define glStencilOpSeparateATI (_GET_TLS_PROCTABLE()->StencilOpSeparateATI) +#define glStencilFuncSeparateATI (_GET_TLS_PROCTABLE()->StencilFuncSeparateATI) +#define glVertexAttribArrayObjectATI (_GET_TLS_PROCTABLE()->VertexAttribArrayObjectATI) +#define glGetVertexAttribArrayObjectfvATI (_GET_TLS_PROCTABLE()->GetVertexAttribArrayObjectfvATI) +#define glGetVertexAttribArrayObjectivATI (_GET_TLS_PROCTABLE()->GetVertexAttribArrayObjectivATI) +#define glDepthBoundsEXT (_GET_TLS_PROCTABLE()->DepthBoundsEXT) +#define glBlendEquationSeparateEXT (_GET_TLS_PROCTABLE()->BlendEquationSeparateEXT) +#define glAddSwapHintRectWIN (_GET_TLS_PROCTABLE()->AddSwapHintRectWIN) +#ifdef _WIN32 +#define wglCreateBufferRegionARB (_GET_TLS_PROCTABLE()->CreateBufferRegionARB) +#define wglDeleteBufferRegionARB (_GET_TLS_PROCTABLE()->DeleteBufferRegionARB) +#define wglSaveBufferRegionARB (_GET_TLS_PROCTABLE()->SaveBufferRegionARB) +#define wglRestoreBufferRegionARB (_GET_TLS_PROCTABLE()->RestoreBufferRegionARB) +#define wglGetExtensionsStringARB (_GET_TLS_PROCTABLE()->GetExtensionsStringARB) +#define wglGetPixelFormatAttribivARB (_GET_TLS_PROCTABLE()->GetPixelFormatAttribivARB) +#define wglGetPixelFormatAttribfvARB (_GET_TLS_PROCTABLE()->GetPixelFormatAttribfvARB) +#define wglChoosePixelFormatARB (_GET_TLS_PROCTABLE()->ChoosePixelFormatARB) +#define wglMakeContextCurrentARB (_GET_TLS_PROCTABLE()->MakeContextCurrentARB) +#define wglGetCurrentReadDCARB (_GET_TLS_PROCTABLE()->GetCurrentReadDCARB) +#define wglCreatePbufferARB (_GET_TLS_PROCTABLE()->CreatePbufferARB) +#define wglGetPbufferDCARB (_GET_TLS_PROCTABLE()->GetPbufferDCARB) +#define wglReleasePbufferDCARB (_GET_TLS_PROCTABLE()->ReleasePbufferDCARB) +#define wglDestroyPbufferARB (_GET_TLS_PROCTABLE()->DestroyPbufferARB) +#define wglQueryPbufferARB (_GET_TLS_PROCTABLE()->QueryPbufferARB) +#define wglBindTexImageARB (_GET_TLS_PROCTABLE()->BindTexImageARB) +#define wglReleaseTexImageARB (_GET_TLS_PROCTABLE()->ReleaseTexImageARB) +#define wglSetPbufferAttribARB (_GET_TLS_PROCTABLE()->SetPbufferAttribARB) +#define wglCreateDisplayColorTableEXT (_GET_TLS_PROCTABLE()->CreateDisplayColorTableEXT) +#define wglLoadDisplayColorTableEXT (_GET_TLS_PROCTABLE()->LoadDisplayColorTableEXT) +#define wglBindDisplayColorTableEXT (_GET_TLS_PROCTABLE()->BindDisplayColorTableEXT) +#define wglDestroyDisplayColorTableEXT (_GET_TLS_PROCTABLE()->DestroyDisplayColorTableEXT) +#define wglGetExtensionsStringEXT (_GET_TLS_PROCTABLE()->GetExtensionsStringEXT) +#define wglMakeContextCurrentEXT (_GET_TLS_PROCTABLE()->MakeContextCurrentEXT) +#define wglGetCurrentReadDCEXT (_GET_TLS_PROCTABLE()->GetCurrentReadDCEXT) +#define wglCreatePbufferEXT (_GET_TLS_PROCTABLE()->CreatePbufferEXT) +#define wglGetPbufferDCEXT (_GET_TLS_PROCTABLE()->GetPbufferDCEXT) +#define wglReleasePbufferDCEXT (_GET_TLS_PROCTABLE()->ReleasePbufferDCEXT) +#define wglDestroyPbufferEXT (_GET_TLS_PROCTABLE()->DestroyPbufferEXT) +#define wglQueryPbufferEXT (_GET_TLS_PROCTABLE()->QueryPbufferEXT) +#define wglGetPixelFormatAttribivEXT (_GET_TLS_PROCTABLE()->GetPixelFormatAttribivEXT) +#define wglGetPixelFormatAttribfvEXT (_GET_TLS_PROCTABLE()->GetPixelFormatAttribfvEXT) +#define wglChoosePixelFormatEXT (_GET_TLS_PROCTABLE()->ChoosePixelFormatEXT) +#define wglSwapIntervalEXT (_GET_TLS_PROCTABLE()->SwapIntervalEXT) +#define wglGetSwapIntervalEXT (_GET_TLS_PROCTABLE()->GetSwapIntervalEXT) +#define wglAllocateMemoryNV (_GET_TLS_PROCTABLE()->AllocateMemoryNV) +#define wglFreeMemoryNV (_GET_TLS_PROCTABLE()->FreeMemoryNV) +#define wglGetSyncValuesOML (_GET_TLS_PROCTABLE()->GetSyncValuesOML) +#define wglGetMscRateOML (_GET_TLS_PROCTABLE()->GetMscRateOML) +#define wglSwapBuffersMscOML (_GET_TLS_PROCTABLE()->SwapBuffersMscOML) +#define wglSwapLayerBuffersMscOML (_GET_TLS_PROCTABLE()->SwapLayerBuffersMscOML) +#define wglWaitForMscOML (_GET_TLS_PROCTABLE()->WaitForMscOML) +#define wglWaitForSbcOML (_GET_TLS_PROCTABLE()->WaitForSbcOML) +#define wglGetDigitalVideoParametersI3D (_GET_TLS_PROCTABLE()->GetDigitalVideoParametersI3D) +#define wglSetDigitalVideoParametersI3D (_GET_TLS_PROCTABLE()->SetDigitalVideoParametersI3D) +#define wglGetGammaTableParametersI3D (_GET_TLS_PROCTABLE()->GetGammaTableParametersI3D) +#define wglSetGammaTableParametersI3D (_GET_TLS_PROCTABLE()->SetGammaTableParametersI3D) +#define wglGetGammaTableI3D (_GET_TLS_PROCTABLE()->GetGammaTableI3D) +#define wglSetGammaTableI3D (_GET_TLS_PROCTABLE()->SetGammaTableI3D) +#define wglEnableGenlockI3D (_GET_TLS_PROCTABLE()->EnableGenlockI3D) +#define wglDisableGenlockI3D (_GET_TLS_PROCTABLE()->DisableGenlockI3D) +#define wglIsEnabledGenlockI3D (_GET_TLS_PROCTABLE()->IsEnabledGenlockI3D) +#define wglGenlockSourceI3D (_GET_TLS_PROCTABLE()->GenlockSourceI3D) +#define wglGetGenlockSourceI3D (_GET_TLS_PROCTABLE()->GetGenlockSourceI3D) +#define wglGenlockSourceEdgeI3D (_GET_TLS_PROCTABLE()->GenlockSourceEdgeI3D) +#define wglGetGenlockSourceEdgeI3D (_GET_TLS_PROCTABLE()->GetGenlockSourceEdgeI3D) +#define wglGenlockSampleRateI3D (_GET_TLS_PROCTABLE()->GenlockSampleRateI3D) +#define wglGetGenlockSampleRateI3D (_GET_TLS_PROCTABLE()->GetGenlockSampleRateI3D) +#define wglGenlockSourceDelayI3D (_GET_TLS_PROCTABLE()->GenlockSourceDelayI3D) +#define wglGetGenlockSourceDelayI3D (_GET_TLS_PROCTABLE()->GetGenlockSourceDelayI3D) +#define wglQueryGenlockMaxSourceDelayI3D (_GET_TLS_PROCTABLE()->QueryGenlockMaxSourceDelayI3D) +#define wglCreateImageBufferI3D (_GET_TLS_PROCTABLE()->CreateImageBufferI3D) +#define wglDestroyImageBufferI3D (_GET_TLS_PROCTABLE()->DestroyImageBufferI3D) +#define wglAssociateImageBufferEventsI3D (_GET_TLS_PROCTABLE()->AssociateImageBufferEventsI3D) +#define wglReleaseImageBufferEventsI3D (_GET_TLS_PROCTABLE()->ReleaseImageBufferEventsI3D) +#define wglEnableFrameLockI3D (_GET_TLS_PROCTABLE()->EnableFrameLockI3D) +#define wglDisableFrameLockI3D (_GET_TLS_PROCTABLE()->DisableFrameLockI3D) +#define wglIsEnabledFrameLockI3D (_GET_TLS_PROCTABLE()->IsEnabledFrameLockI3D) +#define wglQueryFrameLockMasterI3D (_GET_TLS_PROCTABLE()->QueryFrameLockMasterI3D) +#define wglGetFrameUsageI3D (_GET_TLS_PROCTABLE()->GetFrameUsageI3D) +#define wglBeginFrameTrackingI3D (_GET_TLS_PROCTABLE()->BeginFrameTrackingI3D) +#define wglEndFrameTrackingI3D (_GET_TLS_PROCTABLE()->EndFrameTrackingI3D) +#define wglQueryFrameTrackingI3D (_GET_TLS_PROCTABLE()->QueryFrameTrackingI3D) +#endif /* _WIN32 */ + +#ifndef _APP_PROCTABLE + +/* + * Applications can replace the following function with its own function + * for accessing thread local proc/context dependent proc table. + * The following default function works for most applications which + * are using the same device for all their contexts - even if + * the contexts are on different threads. + */ + +static _inline _GLextensionProcs *_GET_TLS_PROCTABLE(void) + +{ + extern _GLextensionProcs _extensionProcs; + + return (&_extensionProcs); +} + +#else + +/* + * Application should replace this compiled function with + * an inlined function for maximum performance. + */ + +extern _GLextensionProcs *_GET_TLS_PROCTABLE(void); + +#endif + +/* + * Provide an initialization function for the application + * to initialize its own proc tables in case the application + * needs to use multiple proc tables. + */ + +static _inline void _InitExtensionProcs(_GLextensionProcs *appProcs) +{ + extern _GLextensionProcs _extensionProcs; + + *appProcs = _extensionProcs; +} + +#ifdef __cplusplus +} +#endif + + +#endif /* _GLPROCS_H_ */ diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Windows/GL/glsmap.h b/Source/Plugins/Plugin_VideoOGL/Src/Windows/GL/glsmap.h new file mode 100644 index 0000000000..b97fa9acfd --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/Windows/GL/glsmap.h @@ -0,0 +1,137 @@ +#ifndef __glsmap_h__ +#define __glsmap_h__ + +/* Copyright (c) Mark J. Kilgard, 1998. */ + +/* This program is freely distributable without licensing fees + and is provided without guarantee or warrantee expressed or + implied. This program is -not- in the public domain. */ + +#if defined(_WIN32) + +/* Try hard to avoid including to avoid name space pollution, + but Win32's needs APIENTRY and WINGDIAPI defined properly. */ +# if 0 +# define WIN32_LEAN_AND_MEAN +# include +# else + /* XXX This is from Win32's */ +# ifndef APIENTRY +# if (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED) +# define APIENTRY __stdcall +# else +# define APIENTRY +# endif +# endif +# ifndef CALLBACK + /* XXX This is from Win32's */ +# if (defined(_M_MRX000) || defined(_M_IX86) || defined(_M_ALPHA) || defined(_M_PPC)) && !defined(MIDL_PASS) +# define CALLBACK __stdcall +# else +# define CALLBACK +# endif +# endif + /* XXX This is from Win32's and */ +# ifndef WINGDIAPI +# define WINGDIAPI __declspec(dllimport) +# endif + /* XXX This is from Win32's */ +# ifndef _WCHAR_T_DEFINED +typedef unsigned short wchar_t; +# define _WCHAR_T_DEFINED +# endif +# endif + +#pragma warning (disable:4244) /* Disable bogus conversion warnings. */ +#pragma warning (disable:4305) /* VC++ 5.0 version of above warning. */ + +#endif /* _WIN32 */ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum { + SMAP_CLEAR_SMAP_TEXTURE = 0x1, + SMAP_GENERATE_VIEW_MIPMAPS = 0x2, + SMAP_GENERATE_SMAP_MIPMAPS = 0x4, + SMAP_GENERATE_MIPMAPS = 0x6 /* both of above */ +} SphereMapFlags; + +/* Cube view enumerants. */ +enum { + SMAP_FRONT = 0, + SMAP_TOP = 1, + SMAP_BOTTOM = 2, + SMAP_LEFT = 3, + SMAP_RIGHT = 4, + SMAP_BACK = 5 +}; + +typedef struct _SphereMap SphereMap; + +extern SphereMap *smapCreateSphereMap(SphereMap *shareSmap); +extern void smapDestroySphereMap(SphereMap *smap); + +extern void smapConfigureSphereMapMesh(SphereMap *smap, int steps, int rings, int edgeExtend); + +extern void smapSetSphereMapTexObj(SphereMap *smap, GLuint texobj); +extern void smapSetViewTexObj(SphereMap *smap, GLuint texobj); +extern void smapSetViewTexObjs(SphereMap *smap, GLuint texobjs[6]); +extern void smapGetSphereMapTexObj(SphereMap *smap, GLuint *texobj); +extern void smapGetViewTexObj(SphereMap *smap, GLuint *texobj); +extern void smapGetViewTexObjs(SphereMap *smap, GLuint texobjs[6]); + +extern void smapSetFlags(SphereMap *smap, SphereMapFlags flags); +extern void smapGetFlags(SphereMap *smap, SphereMapFlags *flags); + +extern void smapSetViewOrigin(SphereMap *smap, GLint x, GLint y); +extern void smapSetSphereMapOrigin(SphereMap *smap, GLint x, GLint y); +extern void smapGetViewOrigin(SphereMap *smap, GLint *x, GLint *y); +extern void smapGetSphereMapOrigin(SphereMap *smap, GLint *x, GLint *y); + +extern void smapSetEye(SphereMap *smap, GLfloat eyex, GLfloat eyey, GLfloat eyez); +extern void smapSetEyeVector(SphereMap *smap, GLfloat *eye); +extern void smapSetUp(SphereMap *smap, GLfloat upx, GLfloat upy, GLfloat upz); +extern void smapSetUpVector(SphereMap *smap, GLfloat *up); +extern void smapSetObject(SphereMap *smap, GLfloat objx, GLfloat objy, GLfloat objz); +extern void smapSetObjectVector(SphereMap *smap, GLfloat *obj); +extern void smapGetEye(SphereMap *smap, GLfloat *eyex, GLfloat *eyey, GLfloat *eyez); +extern void smapGetEyeVector(SphereMap *smap, GLfloat *eye); +extern void smapGetUp(SphereMap *smap, GLfloat *upx, GLfloat *upy, GLfloat *upz); +extern void smapGetUpVector(SphereMap *smap, GLfloat *up); +extern void smapGetObject(SphereMap *smap, GLfloat *objx, GLfloat *objy, GLfloat *objz); +extern void smapGetObjectVector(SphereMap *smap, GLfloat *obj); + +extern void smapSetNearFar(SphereMap *smap, GLfloat viewNear, GLfloat viewFar); +extern void smapGetNearFar(SphereMap *smap, GLfloat *viewNear, GLfloat *viewFar); + +extern void smapSetSphereMapTexDim(SphereMap *smap, GLsizei texdim); +extern void smapSetViewTexDim(SphereMap *smap, GLsizei texdim); +extern void smapGetSphereMapTexDim(SphereMap *smap, GLsizei *texdim); +extern void smapGetViewTexDim(SphereMap *smap, GLsizei *texdim); + +extern void smapSetContextData(SphereMap *smap, void *context); +extern void smapGetContextData(SphereMap *smap, void **context); + +extern void smapSetPositionLightsFunc(SphereMap *smap, void (*positionLights)(int view, void *context)); +extern void smapSetDrawViewFunc(SphereMap *smap, void (*drawView)(int view, void *context)); +extern void smapGetPositionLightsFunc(SphereMap *smap, void (**positionLights)(int view, void *context)); +extern void smapGetDrawViewFunc(SphereMap *smap, void (**drawView)(int view, void *context)); + +extern void smapGenViewTex(SphereMap *smap, int view); +extern void smapGenViewTexs(SphereMap *smap); +extern void smapGenSphereMapFromViewTexs(SphereMap *smap); +extern void smapGenSphereMap(SphereMap *smap); +extern void smapGenSphereMapWithOneViewTex(SphereMap *smap); + +extern int smapRvecToSt(float rvec[3], float st[2]); +extern void smapStToRvec(float *st, float *rvec); + +#ifdef __cplusplus +} + +#endif +#endif /* __glsmap_h__ */ diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Windows/GL/glx.h b/Source/Plugins/Plugin_VideoOGL/Src/Windows/GL/glx.h new file mode 100644 index 0000000000..59836ac764 --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/Windows/GL/glx.h @@ -0,0 +1,243 @@ +#ifndef __glx_h__ +#define __glx_h__ + +/* +** The contents of this file are subject to the GLX Public License Version 1.0 +** (the "License"). You may not use this file except in compliance with the +** License. You may obtain a copy of the License at Silicon Graphics, Inc., +** attn: Legal Services, 2011 N. Shoreline Blvd., Mountain View, CA 94043 +** or at http://www.sgi.com/software/opensource/glx/license.html. +** +** Software distributed under the License is distributed on an "AS IS" +** basis. ALL WARRANTIES ARE DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY +** IMPLIED WARRANTIES OF MERCHANTABILITY, OF FITNESS FOR A PARTICULAR +** PURPOSE OR OF NON- INFRINGEMENT. See the License for the specific +** language governing rights and limitations under the License. +** +** The Original Software is GLX version 1.2 source code, released February, +** 1999. The developer of the Original Software is Silicon Graphics, Inc. +** Those portions of the Subject Software created by Silicon Graphics, Inc. +** are Copyright (c) 1991-9 Silicon Graphics, Inc. All Rights Reserved. +** +** $Header: /teleimm/telev/inc/GL/glx.h,v 1.1 2006/01/05 03:28:50 zerocool Exp $ +*/ + +#include +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * GLX resources. + */ +typedef XID GLXContextID; +typedef XID GLXPixmap; +typedef XID GLXDrawable; +typedef XID GLXPbuffer; +typedef XID GLXWindow; +typedef XID GLXFBConfigID; + +/* + * GLXContext is a pointer to opaque data. + */ +typedef struct __GLXcontextRec *GLXContext; + +/* + * GLXFBConfig is a pointer to opaque data. + */ +typedef struct __GLXFBConfigRec *GLXFBConfig; +typedef struct __GLXFBConfigRec *GLXFBConfigSGIX; + + +/**********************************************************************/ + +/* + * GLX 1.0 functions. + */ +extern XVisualInfo* glXChooseVisual(Display *dpy, int screen, + int *attrib_list); + +extern void glXCopyContext(Display *dpy, GLXContext src, + GLXContext dst, unsigned int mask); + +extern GLXContext glXCreateContext(Display *dpy, XVisualInfo *vis, + GLXContext share_list, Bool direct); + +extern GLXPixmap glXCreateGLXPixmap(Display *dpy, XVisualInfo *vis, + Pixmap pixmap); + +extern void glXDestroyContext(Display *dpy, GLXContext ctx); + +extern void glXDestroyGLXPixmap(Display *dpy, GLXPixmap pix); + +extern int glXGetConfig(Display *dpy, XVisualInfo *vis, + int attrib, int *value); + +extern GLXContext glXGetCurrentContext(void); + +extern GLXDrawable glXGetCurrentDrawable(void); + +extern Bool glXIsDirect(Display *dpy, GLXContext ctx); + +extern Bool glXMakeCurrent(Display *dpy, GLXDrawable drawable, + GLXContext ctx); + +extern Bool glXQueryExtension(Display *dpy, int *error_base, int *event_base); + +extern Bool glXQueryVersion(Display *dpy, int *major, int *minor); + +extern void glXSwapBuffers(Display *dpy, GLXDrawable drawable); + +extern void glXUseXFont(Font font, int first, int count, int list_base); + +extern void glXWaitGL(void); + +extern void glXWaitX(void); + + +/* + * GLX 1.1 functions. + */ +extern const char *glXGetClientString(Display *dpy, int name); + +extern const char *glXQueryServerString(Display *dpy, int screen, int name); + +extern const char *glXQueryExtensionsString(Display *dpy, int screen); + + +/* + * GLX 1.2 functions. + */ +extern Display *glXGetCurrentDisplay(void); + + +/* + * GLX 1.3 functions. + */ +extern GLXFBConfig *glXChooseFBConfig(Display *dpy, int screen, + const int *attrib_list, int *nelements); + +extern GLXContext glXCreateNewContext(Display *dpy, GLXFBConfig config, + int render_type, GLXContext share_list, + Bool direct); + +extern GLXPbuffer glXCreatePbuffer(Display *dpy, GLXFBConfig config, + const int *attrib_list); + +extern GLXPixmap glXCreatePixmap(Display *dpy, GLXFBConfig config, + Pixmap pixmap, const int *attrib_list); + +extern GLXWindow glXCreateWindow(Display *dpy, GLXFBConfig config, + Window win, const int *attrib_list); + +extern void glXDestroyPbuffer(Display *dpy, GLXPbuffer pbuf); + +extern void glXDestroyPixmap(Display *dpy, GLXPixmap pixmap); + +extern void glXDestroyWindow(Display *dpy, GLXWindow win); + +extern GLXDrawable glXGetCurrentReadDrawable(void); + +extern int glXGetFBConfigAttrib(Display *dpy, GLXFBConfig config, + int attribute, int *value); + +extern GLXFBConfig *glXGetFBConfigs(Display *dpy, int screen, int *nelements); + +extern void glXGetSelectedEvent(Display *dpy, GLXDrawable draw, + unsigned long *event_mask); + +extern XVisualInfo *glXGetVisualFromFBConfig(Display *dpy, GLXFBConfig config); + +extern Bool glXMakeContextCurrent(Display *display, GLXDrawable draw, + GLXDrawable read, GLXContext ctx); + +extern int glXQueryContext(Display *dpy, GLXContext ctx, + int attribute, int *value); + +extern void glXQueryDrawable(Display *dpy, GLXDrawable draw, + int attribute, unsigned int *value); + +extern void glXSelectEvent(Display *dpy, GLXDrawable draw, + unsigned long event_mask); + + +/**********************************************************************/ + +/* + * ARB_get_proc_address + */ +extern void (*glXGetProcAddressARB(const GLubyte *procName))(void); + +/* + * EXT_import_context + */ +extern void glXFreeContextEXT(Display *dpy, GLXContext ctx); + +extern GLXContextID glXGetContextIDEXT(const GLXContext ctx); + +extern GLXDrawable glXGetCurrentDrawableEXT(void); + +extern GLXContext glXImportContextEXT(Display *dpy, GLXContextID contextID); + +extern int glXQueryContextInfoEXT(Display *dpy, GLXContext ctx, + int attribute, int *value); + +/* + * SGI_video_sync + */ +extern int glXGetVideoSyncSGI(unsigned int *count); + +extern int glXWaitVideoSyncSGI(int divisor, int remainder, + unsigned int *count); + +extern int glXGetRefreshRateSGI(unsigned int *rate); + +/* + * SGIX_swap_group +*/ +extern void glXJoinSwapGroupSGIX(Display *dpy, GLXDrawable drawable, + GLXDrawable member); + +/* + * SGIX_swap_barrier +*/ +extern void glXBindSwapBarrierSGIX(Display *dpy, GLXDrawable drawable, + int barrier); + +extern Bool glXQueryMaxSwapBarriersSGIX(Display *dpy, int screen, int *max); + +/**********************************************************************/ + +/*** Should these go here, or in another header? */ +/* + * GLX Events + */ +typedef struct { + int event_type; /* GLX_DAMAGED or GLX_SAVED */ + int draw_type; /* GLX_WINDOW or GLX_PBUFFER */ + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came for SendEvent request */ + Display *display; /* display the event was read from */ + GLXDrawable drawable; /* XID of Drawable */ + unsigned int buffer_mask; /* mask indicating which buffers are affected */ + unsigned int aux_buffer; /* which aux buffer was affected */ + int x, y; + int width, height; + int count; /* if nonzero, at least this many more */ +} GLXPbufferClobberEvent; + +typedef union __GLXEvent { + GLXPbufferClobberEvent glxpbufferclobber; + long pad[24]; +} GLXEvent; + +#ifdef __cplusplus +} +#endif + +#endif /* !__glx_h__ */ diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Windows/GL/glxew.h b/Source/Plugins/Plugin_VideoOGL/Src/Windows/GL/glxew.h new file mode 100644 index 0000000000..34ffddb019 --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/Windows/GL/glxew.h @@ -0,0 +1,1188 @@ +/* +** The OpenGL Extension Wrangler Library +** Copyright (C) 2002-2007, Milan Ikits +** Copyright (C) 2002-2007, Marcelo E. Magallon +** Copyright (C) 2002, Lev Povalahev +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are met: +** +** * Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright notice, +** this list of conditions and the following disclaimer in the documentation +** and/or other materials provided with the distribution. +** * The name of the author may be used to endorse or promote products +** derived from this software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +** THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* +** The contents of this file are subject to the GLX Public License Version 1.0 +** (the "License"). You may not use this file except in compliance with the +** License. You may obtain a copy of the License at Silicon Graphics, Inc., +** attn: Legal Services, 2011 N. Shoreline Blvd., Mountain View, CA 94043 +** or at http://www.sgi.com/software/opensource/glx/license.html. +** +** Software distributed under the License is distributed on an "AS IS" +** basis. ALL WARRANTIES ARE DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY +** IMPLIED WARRANTIES OF MERCHANTABILITY, OF FITNESS FOR A PARTICULAR +** PURPOSE OR OF NON- INFRINGEMENT. See the License for the specific +** language governing rights and limitations under the License. +** +** The Original Software is GLX version 1.2 source code, released February, +** 1999. The developer of the Original Software is Silicon Graphics, Inc. +** Those portions of the Subject Software created by Silicon Graphics, Inc. +** are Copyright (c) 1991-9 Silicon Graphics, Inc. All Rights Reserved. +*/ + +#ifndef __glxew_h__ +#define __glxew_h__ +#define __GLXEW_H__ + +#ifdef __glxext_h_ +#error glxext.h included before glxew.h +#endif +#ifdef GLX_H +#error glx.h included before glxew.h +#endif + +#define __glxext_h_ +#define __GLX_glx_h__ +#define GLX_H + +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* ---------------------------- GLX_VERSION_1_0 --------------------------- */ + +#ifndef GLX_VERSION_1_0 +#define GLX_VERSION_1_0 1 + +#define GLX_USE_GL 1 +#define GLX_BUFFER_SIZE 2 +#define GLX_LEVEL 3 +#define GLX_RGBA 4 +#define GLX_DOUBLEBUFFER 5 +#define GLX_STEREO 6 +#define GLX_AUX_BUFFERS 7 +#define GLX_RED_SIZE 8 +#define GLX_GREEN_SIZE 9 +#define GLX_BLUE_SIZE 10 +#define GLX_ALPHA_SIZE 11 +#define GLX_DEPTH_SIZE 12 +#define GLX_STENCIL_SIZE 13 +#define GLX_ACCUM_RED_SIZE 14 +#define GLX_ACCUM_GREEN_SIZE 15 +#define GLX_ACCUM_BLUE_SIZE 16 +#define GLX_ACCUM_ALPHA_SIZE 17 +#define GLX_BAD_SCREEN 1 +#define GLX_BAD_ATTRIBUTE 2 +#define GLX_NO_EXTENSION 3 +#define GLX_BAD_VISUAL 4 +#define GLX_BAD_CONTEXT 5 +#define GLX_BAD_VALUE 6 +#define GLX_BAD_ENUM 7 + +typedef XID GLXDrawable; +typedef XID GLXPixmap; +#ifdef __sun +typedef struct __glXContextRec *GLXContext; +#else +typedef struct __GLXcontextRec *GLXContext; +#endif + +extern Bool glXQueryExtension (Display *dpy, int *errorBase, int *eventBase); +extern Bool glXQueryVersion (Display *dpy, int *major, int *minor); +extern int glXGetConfig (Display *dpy, XVisualInfo *vis, int attrib, int *value); +extern XVisualInfo* glXChooseVisual (Display *dpy, int screen, int *attribList); +extern GLXPixmap glXCreateGLXPixmap (Display *dpy, XVisualInfo *vis, Pixmap pixmap); +extern void glXDestroyGLXPixmap (Display *dpy, GLXPixmap pix); +extern GLXContext glXCreateContext (Display *dpy, XVisualInfo *vis, GLXContext shareList, Bool direct); +extern void glXDestroyContext (Display *dpy, GLXContext ctx); +extern Bool glXIsDirect (Display *dpy, GLXContext ctx); +extern void glXCopyContext (Display *dpy, GLXContext src, GLXContext dst, GLuint mask); +extern Bool glXMakeCurrent (Display *dpy, GLXDrawable drawable, GLXContext ctx); +extern GLXContext glXGetCurrentContext (void); +extern GLXDrawable glXGetCurrentDrawable (void); +extern void glXWaitGL (void); +extern void glXWaitX (void); +extern void glXSwapBuffers (Display *dpy, GLXDrawable drawable); +extern void glXUseXFont (Font font, int first, int count, int listBase); + +#define GLXEW_VERSION_1_0 GLXEW_GET_VAR(__GLXEW_VERSION_1_0) + +#endif /* GLX_VERSION_1_0 */ + +/* ---------------------------- GLX_VERSION_1_1 --------------------------- */ + +#ifndef GLX_VERSION_1_1 +#define GLX_VERSION_1_1 + +#define GLX_VENDOR 0x1 +#define GLX_VERSION 0x2 +#define GLX_EXTENSIONS 0x3 + +extern const char* glXQueryExtensionsString (Display *dpy, int screen); +extern const char* glXGetClientString (Display *dpy, int name); +extern const char* glXQueryServerString (Display *dpy, int screen, int name); + +#define GLXEW_VERSION_1_1 GLXEW_GET_VAR(__GLXEW_VERSION_1_1) + +#endif /* GLX_VERSION_1_1 */ + +/* ---------------------------- GLX_VERSION_1_2 ---------------------------- */ + +#ifndef GLX_VERSION_1_2 +#define GLX_VERSION_1_2 1 + +typedef Display* ( * PFNGLXGETCURRENTDISPLAYPROC) (void); + +#define glXGetCurrentDisplay GLXEW_GET_FUN(__glewXGetCurrentDisplay) + +#define GLXEW_VERSION_1_2 GLXEW_GET_VAR(__GLXEW_VERSION_1_2) + +#endif /* GLX_VERSION_1_2 */ + +/* ---------------------------- GLX_VERSION_1_3 ---------------------------- */ + +#ifndef GLX_VERSION_1_3 +#define GLX_VERSION_1_3 1 + +#define GLX_RGBA_BIT 0x00000001 +#define GLX_FRONT_LEFT_BUFFER_BIT 0x00000001 +#define GLX_WINDOW_BIT 0x00000001 +#define GLX_COLOR_INDEX_BIT 0x00000002 +#define GLX_PIXMAP_BIT 0x00000002 +#define GLX_FRONT_RIGHT_BUFFER_BIT 0x00000002 +#define GLX_BACK_LEFT_BUFFER_BIT 0x00000004 +#define GLX_PBUFFER_BIT 0x00000004 +#define GLX_BACK_RIGHT_BUFFER_BIT 0x00000008 +#define GLX_AUX_BUFFERS_BIT 0x00000010 +#define GLX_CONFIG_CAVEAT 0x20 +#define GLX_DEPTH_BUFFER_BIT 0x00000020 +#define GLX_X_VISUAL_TYPE 0x22 +#define GLX_TRANSPARENT_TYPE 0x23 +#define GLX_TRANSPARENT_INDEX_VALUE 0x24 +#define GLX_TRANSPARENT_RED_VALUE 0x25 +#define GLX_TRANSPARENT_GREEN_VALUE 0x26 +#define GLX_TRANSPARENT_BLUE_VALUE 0x27 +#define GLX_TRANSPARENT_ALPHA_VALUE 0x28 +#define GLX_STENCIL_BUFFER_BIT 0x00000040 +#define GLX_ACCUM_BUFFER_BIT 0x00000080 +#define GLX_NONE 0x8000 +#define GLX_SLOW_CONFIG 0x8001 +#define GLX_TRUE_COLOR 0x8002 +#define GLX_DIRECT_COLOR 0x8003 +#define GLX_PSEUDO_COLOR 0x8004 +#define GLX_STATIC_COLOR 0x8005 +#define GLX_GRAY_SCALE 0x8006 +#define GLX_STATIC_GRAY 0x8007 +#define GLX_TRANSPARENT_RGB 0x8008 +#define GLX_TRANSPARENT_INDEX 0x8009 +#define GLX_VISUAL_ID 0x800B +#define GLX_SCREEN 0x800C +#define GLX_NON_CONFORMANT_CONFIG 0x800D +#define GLX_DRAWABLE_TYPE 0x8010 +#define GLX_RENDER_TYPE 0x8011 +#define GLX_X_RENDERABLE 0x8012 +#define GLX_FBCONFIG_ID 0x8013 +#define GLX_RGBA_TYPE 0x8014 +#define GLX_COLOR_INDEX_TYPE 0x8015 +#define GLX_MAX_PBUFFER_WIDTH 0x8016 +#define GLX_MAX_PBUFFER_HEIGHT 0x8017 +#define GLX_MAX_PBUFFER_PIXELS 0x8018 +#define GLX_PRESERVED_CONTENTS 0x801B +#define GLX_LARGEST_PBUFFER 0x801C +#define GLX_WIDTH 0x801D +#define GLX_HEIGHT 0x801E +#define GLX_EVENT_MASK 0x801F +#define GLX_DAMAGED 0x8020 +#define GLX_SAVED 0x8021 +#define GLX_WINDOW 0x8022 +#define GLX_PBUFFER 0x8023 +#define GLX_PBUFFER_HEIGHT 0x8040 +#define GLX_PBUFFER_WIDTH 0x8041 +#define GLX_PBUFFER_CLOBBER_MASK 0x08000000 +#define GLX_DONT_CARE 0xFFFFFFFF + +typedef XID GLXFBConfigID; +typedef XID GLXWindow; +typedef XID GLXPbuffer; +typedef struct __GLXFBConfigRec *GLXFBConfig; + +typedef struct { + int event_type; + int draw_type; + unsigned long serial; + Bool send_event; + Display *display; + GLXDrawable drawable; + unsigned int buffer_mask; + unsigned int aux_buffer; + int x, y; + int width, height; + int count; +} GLXPbufferClobberEvent; +typedef union __GLXEvent { + GLXPbufferClobberEvent glxpbufferclobber; + long pad[24]; +} GLXEvent; + +typedef GLXFBConfig* ( * PFNGLXCHOOSEFBCONFIGPROC) (Display *dpy, int screen, const int *attrib_list, int *nelements); +typedef GLXContext ( * PFNGLXCREATENEWCONTEXTPROC) (Display *dpy, GLXFBConfig config, int render_type, GLXContext share_list, Bool direct); +typedef GLXPbuffer ( * PFNGLXCREATEPBUFFERPROC) (Display *dpy, GLXFBConfig config, const int *attrib_list); +typedef GLXPixmap ( * PFNGLXCREATEPIXMAPPROC) (Display *dpy, GLXFBConfig config, Pixmap pixmap, const int *attrib_list); +typedef GLXWindow ( * PFNGLXCREATEWINDOWPROC) (Display *dpy, GLXFBConfig config, Window win, const int *attrib_list); +typedef void ( * PFNGLXDESTROYPBUFFERPROC) (Display *dpy, GLXPbuffer pbuf); +typedef void ( * PFNGLXDESTROYPIXMAPPROC) (Display *dpy, GLXPixmap pixmap); +typedef void ( * PFNGLXDESTROYWINDOWPROC) (Display *dpy, GLXWindow win); +typedef GLXDrawable ( * PFNGLXGETCURRENTREADDRAWABLEPROC) (void); +typedef int ( * PFNGLXGETFBCONFIGATTRIBPROC) (Display *dpy, GLXFBConfig config, int attribute, int *value); +typedef GLXFBConfig* ( * PFNGLXGETFBCONFIGSPROC) (Display *dpy, int screen, int *nelements); +typedef void ( * PFNGLXGETSELECTEDEVENTPROC) (Display *dpy, GLXDrawable draw, unsigned long *event_mask); +typedef XVisualInfo* ( * PFNGLXGETVISUALFROMFBCONFIGPROC) (Display *dpy, GLXFBConfig config); +typedef Bool ( * PFNGLXMAKECONTEXTCURRENTPROC) (Display *display, GLXDrawable draw, GLXDrawable read, GLXContext ctx); +typedef int ( * PFNGLXQUERYCONTEXTPROC) (Display *dpy, GLXContext ctx, int attribute, int *value); +typedef void ( * PFNGLXQUERYDRAWABLEPROC) (Display *dpy, GLXDrawable draw, int attribute, unsigned int *value); +typedef void ( * PFNGLXSELECTEVENTPROC) (Display *dpy, GLXDrawable draw, unsigned long event_mask); + +#define glXChooseFBConfig GLXEW_GET_FUN(__glewXChooseFBConfig) +#define glXCreateNewContext GLXEW_GET_FUN(__glewXCreateNewContext) +#define glXCreatePbuffer GLXEW_GET_FUN(__glewXCreatePbuffer) +#define glXCreatePixmap GLXEW_GET_FUN(__glewXCreatePixmap) +#define glXCreateWindow GLXEW_GET_FUN(__glewXCreateWindow) +#define glXDestroyPbuffer GLXEW_GET_FUN(__glewXDestroyPbuffer) +#define glXDestroyPixmap GLXEW_GET_FUN(__glewXDestroyPixmap) +#define glXDestroyWindow GLXEW_GET_FUN(__glewXDestroyWindow) +#define glXGetCurrentReadDrawable GLXEW_GET_FUN(__glewXGetCurrentReadDrawable) +#define glXGetFBConfigAttrib GLXEW_GET_FUN(__glewXGetFBConfigAttrib) +#define glXGetFBConfigs GLXEW_GET_FUN(__glewXGetFBConfigs) +#define glXGetSelectedEvent GLXEW_GET_FUN(__glewXGetSelectedEvent) +#define glXGetVisualFromFBConfig GLXEW_GET_FUN(__glewXGetVisualFromFBConfig) +#define glXMakeContextCurrent GLXEW_GET_FUN(__glewXMakeContextCurrent) +#define glXQueryContext GLXEW_GET_FUN(__glewXQueryContext) +#define glXQueryDrawable GLXEW_GET_FUN(__glewXQueryDrawable) +#define glXSelectEvent GLXEW_GET_FUN(__glewXSelectEvent) + +#define GLXEW_VERSION_1_3 GLXEW_GET_VAR(__GLXEW_VERSION_1_3) + +#endif /* GLX_VERSION_1_3 */ + +/* ---------------------------- GLX_VERSION_1_4 ---------------------------- */ + +#ifndef GLX_VERSION_1_4 +#define GLX_VERSION_1_4 1 + +#define GLX_SAMPLE_BUFFERS 100000 +#define GLX_SAMPLES 100001 + +extern void ( * glXGetProcAddress (const GLubyte *procName)) (void); + +#define GLXEW_VERSION_1_4 GLXEW_GET_VAR(__GLXEW_VERSION_1_4) + +#endif /* GLX_VERSION_1_4 */ + +/* -------------------------- GLX_3DFX_multisample ------------------------- */ + +#ifndef GLX_3DFX_multisample +#define GLX_3DFX_multisample 1 + +#define GLX_SAMPLE_BUFFERS_3DFX 0x8050 +#define GLX_SAMPLES_3DFX 0x8051 + +#define GLXEW_3DFX_multisample GLXEW_GET_VAR(__GLXEW_3DFX_multisample) + +#endif /* GLX_3DFX_multisample */ + +/* ------------------------- GLX_ARB_fbconfig_float ------------------------ */ + +#ifndef GLX_ARB_fbconfig_float +#define GLX_ARB_fbconfig_float 1 + +#define GLX_RGBA_FLOAT_BIT 0x00000004 +#define GLX_RGBA_FLOAT_TYPE 0x20B9 + +#define GLXEW_ARB_fbconfig_float GLXEW_GET_VAR(__GLXEW_ARB_fbconfig_float) + +#endif /* GLX_ARB_fbconfig_float */ + +/* ------------------------ GLX_ARB_get_proc_address ----------------------- */ + +#ifndef GLX_ARB_get_proc_address +#define GLX_ARB_get_proc_address 1 + +extern void ( * glXGetProcAddressARB (const GLubyte *procName)) (void); + +#define GLXEW_ARB_get_proc_address GLXEW_GET_VAR(__GLXEW_ARB_get_proc_address) + +#endif /* GLX_ARB_get_proc_address */ + +/* -------------------------- GLX_ARB_multisample -------------------------- */ + +#ifndef GLX_ARB_multisample +#define GLX_ARB_multisample 1 + +#define GLX_SAMPLE_BUFFERS_ARB 100000 +#define GLX_SAMPLES_ARB 100001 + +#define GLXEW_ARB_multisample GLXEW_GET_VAR(__GLXEW_ARB_multisample) + +#endif /* GLX_ARB_multisample */ + +/* ----------------------- GLX_ATI_pixel_format_float ---------------------- */ + +#ifndef GLX_ATI_pixel_format_float +#define GLX_ATI_pixel_format_float 1 + +#define GLX_RGBA_FLOAT_ATI_BIT 0x00000100 + +#define GLXEW_ATI_pixel_format_float GLXEW_GET_VAR(__GLXEW_ATI_pixel_format_float) + +#endif /* GLX_ATI_pixel_format_float */ + +/* ------------------------- GLX_ATI_render_texture ------------------------ */ + +#ifndef GLX_ATI_render_texture +#define GLX_ATI_render_texture 1 + +#define GLX_BIND_TO_TEXTURE_RGB_ATI 0x9800 +#define GLX_BIND_TO_TEXTURE_RGBA_ATI 0x9801 +#define GLX_TEXTURE_FORMAT_ATI 0x9802 +#define GLX_TEXTURE_TARGET_ATI 0x9803 +#define GLX_MIPMAP_TEXTURE_ATI 0x9804 +#define GLX_TEXTURE_RGB_ATI 0x9805 +#define GLX_TEXTURE_RGBA_ATI 0x9806 +#define GLX_NO_TEXTURE_ATI 0x9807 +#define GLX_TEXTURE_CUBE_MAP_ATI 0x9808 +#define GLX_TEXTURE_1D_ATI 0x9809 +#define GLX_TEXTURE_2D_ATI 0x980A +#define GLX_MIPMAP_LEVEL_ATI 0x980B +#define GLX_CUBE_MAP_FACE_ATI 0x980C +#define GLX_TEXTURE_CUBE_MAP_POSITIVE_X_ATI 0x980D +#define GLX_TEXTURE_CUBE_MAP_NEGATIVE_X_ATI 0x980E +#define GLX_TEXTURE_CUBE_MAP_POSITIVE_Y_ATI 0x980F +#define GLX_TEXTURE_CUBE_MAP_NEGATIVE_Y_ATI 0x9810 +#define GLX_TEXTURE_CUBE_MAP_POSITIVE_Z_ATI 0x9811 +#define GLX_TEXTURE_CUBE_MAP_NEGATIVE_Z_ATI 0x9812 +#define GLX_FRONT_LEFT_ATI 0x9813 +#define GLX_FRONT_RIGHT_ATI 0x9814 +#define GLX_BACK_LEFT_ATI 0x9815 +#define GLX_BACK_RIGHT_ATI 0x9816 +#define GLX_AUX0_ATI 0x9817 +#define GLX_AUX1_ATI 0x9818 +#define GLX_AUX2_ATI 0x9819 +#define GLX_AUX3_ATI 0x981A +#define GLX_AUX4_ATI 0x981B +#define GLX_AUX5_ATI 0x981C +#define GLX_AUX6_ATI 0x981D +#define GLX_AUX7_ATI 0x981E +#define GLX_AUX8_ATI 0x981F +#define GLX_AUX9_ATI 0x9820 +#define GLX_BIND_TO_TEXTURE_LUMINANCE_ATI 0x9821 +#define GLX_BIND_TO_TEXTURE_INTENSITY_ATI 0x9822 + +typedef void ( * PFNGLXBINDTEXIMAGEATIPROC) (Display *dpy, GLXPbuffer pbuf, int buffer); +typedef void ( * PFNGLXDRAWABLEATTRIBATIPROC) (Display *dpy, GLXDrawable draw, const int *attrib_list); +typedef void ( * PFNGLXRELEASETEXIMAGEATIPROC) (Display *dpy, GLXPbuffer pbuf, int buffer); + +#define glXBindTexImageATI GLXEW_GET_FUN(__glewXBindTexImageATI) +#define glXDrawableAttribATI GLXEW_GET_FUN(__glewXDrawableAttribATI) +#define glXReleaseTexImageATI GLXEW_GET_FUN(__glewXReleaseTexImageATI) + +#define GLXEW_ATI_render_texture GLXEW_GET_VAR(__GLXEW_ATI_render_texture) + +#endif /* GLX_ATI_render_texture */ + +/* --------------------- GLX_EXT_fbconfig_packed_float --------------------- */ + +#ifndef GLX_EXT_fbconfig_packed_float +#define GLX_EXT_fbconfig_packed_float 1 + +#define GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT 0x00000008 +#define GLX_RGBA_UNSIGNED_FLOAT_TYPE_EXT 0x20B1 + +#define GLXEW_EXT_fbconfig_packed_float GLXEW_GET_VAR(__GLXEW_EXT_fbconfig_packed_float) + +#endif /* GLX_EXT_fbconfig_packed_float */ + +/* ------------------------ GLX_EXT_framebuffer_sRGB ----------------------- */ + +#ifndef GLX_EXT_framebuffer_sRGB +#define GLX_EXT_framebuffer_sRGB 1 + +#define GLX_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x20B2 + +#define GLXEW_EXT_framebuffer_sRGB GLXEW_GET_VAR(__GLXEW_EXT_framebuffer_sRGB) + +#endif /* GLX_EXT_framebuffer_sRGB */ + +/* ------------------------- GLX_EXT_import_context ------------------------ */ + +#ifndef GLX_EXT_import_context +#define GLX_EXT_import_context 1 + +#define GLX_SHARE_CONTEXT_EXT 0x800A +#define GLX_VISUAL_ID_EXT 0x800B +#define GLX_SCREEN_EXT 0x800C + +typedef XID GLXContextID; + +typedef void ( * PFNGLXFREECONTEXTEXTPROC) (Display* dpy, GLXContext context); +typedef GLXContextID ( * PFNGLXGETCONTEXTIDEXTPROC) (const GLXContext context); +typedef GLXContext ( * PFNGLXIMPORTCONTEXTEXTPROC) (Display* dpy, GLXContextID contextID); +typedef int ( * PFNGLXQUERYCONTEXTINFOEXTPROC) (Display* dpy, GLXContext context, int attribute,int *value); + +#define glXFreeContextEXT GLXEW_GET_FUN(__glewXFreeContextEXT) +#define glXGetContextIDEXT GLXEW_GET_FUN(__glewXGetContextIDEXT) +#define glXImportContextEXT GLXEW_GET_FUN(__glewXImportContextEXT) +#define glXQueryContextInfoEXT GLXEW_GET_FUN(__glewXQueryContextInfoEXT) + +#define GLXEW_EXT_import_context GLXEW_GET_VAR(__GLXEW_EXT_import_context) + +#endif /* GLX_EXT_import_context */ + +/* -------------------------- GLX_EXT_scene_marker ------------------------- */ + +#ifndef GLX_EXT_scene_marker +#define GLX_EXT_scene_marker 1 + +#define GLXEW_EXT_scene_marker GLXEW_GET_VAR(__GLXEW_EXT_scene_marker) + +#endif /* GLX_EXT_scene_marker */ + +/* -------------------------- GLX_EXT_visual_info -------------------------- */ + +#ifndef GLX_EXT_visual_info +#define GLX_EXT_visual_info 1 + +#define GLX_X_VISUAL_TYPE_EXT 0x22 +#define GLX_TRANSPARENT_TYPE_EXT 0x23 +#define GLX_TRANSPARENT_INDEX_VALUE_EXT 0x24 +#define GLX_TRANSPARENT_RED_VALUE_EXT 0x25 +#define GLX_TRANSPARENT_GREEN_VALUE_EXT 0x26 +#define GLX_TRANSPARENT_BLUE_VALUE_EXT 0x27 +#define GLX_TRANSPARENT_ALPHA_VALUE_EXT 0x28 +#define GLX_NONE_EXT 0x8000 +#define GLX_TRUE_COLOR_EXT 0x8002 +#define GLX_DIRECT_COLOR_EXT 0x8003 +#define GLX_PSEUDO_COLOR_EXT 0x8004 +#define GLX_STATIC_COLOR_EXT 0x8005 +#define GLX_GRAY_SCALE_EXT 0x8006 +#define GLX_STATIC_GRAY_EXT 0x8007 +#define GLX_TRANSPARENT_RGB_EXT 0x8008 +#define GLX_TRANSPARENT_INDEX_EXT 0x8009 + +#define GLXEW_EXT_visual_info GLXEW_GET_VAR(__GLXEW_EXT_visual_info) + +#endif /* GLX_EXT_visual_info */ + +/* ------------------------- GLX_EXT_visual_rating ------------------------- */ + +#ifndef GLX_EXT_visual_rating +#define GLX_EXT_visual_rating 1 + +#define GLX_VISUAL_CAVEAT_EXT 0x20 +#define GLX_SLOW_VISUAL_EXT 0x8001 +#define GLX_NON_CONFORMANT_VISUAL_EXT 0x800D + +#define GLXEW_EXT_visual_rating GLXEW_GET_VAR(__GLXEW_EXT_visual_rating) + +#endif /* GLX_EXT_visual_rating */ + +/* -------------------------- GLX_MESA_agp_offset -------------------------- */ + +#ifndef GLX_MESA_agp_offset +#define GLX_MESA_agp_offset 1 + +typedef unsigned int ( * PFNGLXGETAGPOFFSETMESAPROC) (const void* pointer); + +#define glXGetAGPOffsetMESA GLXEW_GET_FUN(__glewXGetAGPOffsetMESA) + +#define GLXEW_MESA_agp_offset GLXEW_GET_VAR(__GLXEW_MESA_agp_offset) + +#endif /* GLX_MESA_agp_offset */ + +/* ------------------------ GLX_MESA_copy_sub_buffer ----------------------- */ + +#ifndef GLX_MESA_copy_sub_buffer +#define GLX_MESA_copy_sub_buffer 1 + +typedef void ( * PFNGLXCOPYSUBBUFFERMESAPROC) (Display* dpy, GLXDrawable drawable, int x, int y, int width, int height); + +#define glXCopySubBufferMESA GLXEW_GET_FUN(__glewXCopySubBufferMESA) + +#define GLXEW_MESA_copy_sub_buffer GLXEW_GET_VAR(__GLXEW_MESA_copy_sub_buffer) + +#endif /* GLX_MESA_copy_sub_buffer */ + +/* ------------------------ GLX_MESA_pixmap_colormap ----------------------- */ + +#ifndef GLX_MESA_pixmap_colormap +#define GLX_MESA_pixmap_colormap 1 + +typedef GLXPixmap ( * PFNGLXCREATEGLXPIXMAPMESAPROC) (Display* dpy, XVisualInfo *visual, Pixmap pixmap, Colormap cmap); + +#define glXCreateGLXPixmapMESA GLXEW_GET_FUN(__glewXCreateGLXPixmapMESA) + +#define GLXEW_MESA_pixmap_colormap GLXEW_GET_VAR(__GLXEW_MESA_pixmap_colormap) + +#endif /* GLX_MESA_pixmap_colormap */ + +/* ------------------------ GLX_MESA_release_buffers ----------------------- */ + +#ifndef GLX_MESA_release_buffers +#define GLX_MESA_release_buffers 1 + +typedef Bool ( * PFNGLXRELEASEBUFFERSMESAPROC) (Display* dpy, GLXDrawable d); + +#define glXReleaseBuffersMESA GLXEW_GET_FUN(__glewXReleaseBuffersMESA) + +#define GLXEW_MESA_release_buffers GLXEW_GET_VAR(__GLXEW_MESA_release_buffers) + +#endif /* GLX_MESA_release_buffers */ + +/* ------------------------- GLX_MESA_set_3dfx_mode ------------------------ */ + +#ifndef GLX_MESA_set_3dfx_mode +#define GLX_MESA_set_3dfx_mode 1 + +#define GLX_3DFX_WINDOW_MODE_MESA 0x1 +#define GLX_3DFX_FULLSCREEN_MODE_MESA 0x2 + +typedef GLboolean ( * PFNGLXSET3DFXMODEMESAPROC) (GLint mode); + +#define glXSet3DfxModeMESA GLXEW_GET_FUN(__glewXSet3DfxModeMESA) + +#define GLXEW_MESA_set_3dfx_mode GLXEW_GET_VAR(__GLXEW_MESA_set_3dfx_mode) + +#endif /* GLX_MESA_set_3dfx_mode */ + +/* -------------------------- GLX_NV_float_buffer -------------------------- */ + +#ifndef GLX_NV_float_buffer +#define GLX_NV_float_buffer 1 + +#define GLX_FLOAT_COMPONENTS_NV 0x20B0 + +#define GLXEW_NV_float_buffer GLXEW_GET_VAR(__GLXEW_NV_float_buffer) + +#endif /* GLX_NV_float_buffer */ + +/* ----------------------- GLX_NV_vertex_array_range ----------------------- */ + +#ifndef GLX_NV_vertex_array_range +#define GLX_NV_vertex_array_range 1 + +typedef void * ( * PFNGLXALLOCATEMEMORYNVPROC) (GLsizei size, GLfloat readFrequency, GLfloat writeFrequency, GLfloat priority); +typedef void ( * PFNGLXFREEMEMORYNVPROC) (void *pointer); + +#define glXAllocateMemoryNV GLXEW_GET_FUN(__glewXAllocateMemoryNV) +#define glXFreeMemoryNV GLXEW_GET_FUN(__glewXFreeMemoryNV) + +#define GLXEW_NV_vertex_array_range GLXEW_GET_VAR(__GLXEW_NV_vertex_array_range) + +#endif /* GLX_NV_vertex_array_range */ + +/* -------------------------- GLX_OML_swap_method -------------------------- */ + +#ifndef GLX_OML_swap_method +#define GLX_OML_swap_method 1 + +#define GLX_SWAP_METHOD_OML 0x8060 +#define GLX_SWAP_EXCHANGE_OML 0x8061 +#define GLX_SWAP_COPY_OML 0x8062 +#define GLX_SWAP_UNDEFINED_OML 0x8063 + +#define GLXEW_OML_swap_method GLXEW_GET_VAR(__GLXEW_OML_swap_method) + +#endif /* GLX_OML_swap_method */ + +/* -------------------------- GLX_OML_sync_control ------------------------- */ + +#if !defined(GLX_OML_sync_control) && defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) +#include +#define GLX_OML_sync_control 1 + +typedef Bool ( * PFNGLXGETMSCRATEOMLPROC) (Display* dpy, GLXDrawable drawable, int32_t* numerator, int32_t* denominator); +typedef Bool ( * PFNGLXGETSYNCVALUESOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t* ust, int64_t* msc, int64_t* sbc); +typedef int64_t ( * PFNGLXSWAPBUFFERSMSCOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t target_msc, int64_t divisor, int64_t remainder); +typedef Bool ( * PFNGLXWAITFORMSCOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t target_msc, int64_t divisor, int64_t remainder, int64_t* ust, int64_t* msc, int64_t* sbc); +typedef Bool ( * PFNGLXWAITFORSBCOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t target_sbc, int64_t* ust, int64_t* msc, int64_t* sbc); + +#define glXGetMscRateOML GLXEW_GET_FUN(__glewXGetMscRateOML) +#define glXGetSyncValuesOML GLXEW_GET_FUN(__glewXGetSyncValuesOML) +#define glXSwapBuffersMscOML GLXEW_GET_FUN(__glewXSwapBuffersMscOML) +#define glXWaitForMscOML GLXEW_GET_FUN(__glewXWaitForMscOML) +#define glXWaitForSbcOML GLXEW_GET_FUN(__glewXWaitForSbcOML) + +#define GLXEW_OML_sync_control GLXEW_GET_VAR(__GLXEW_OML_sync_control) + +#endif /* GLX_OML_sync_control */ + +/* ------------------------ GLX_SGIS_blended_overlay ----------------------- */ + +#ifndef GLX_SGIS_blended_overlay +#define GLX_SGIS_blended_overlay 1 + +#define GLX_BLENDED_RGBA_SGIS 0x8025 + +#define GLXEW_SGIS_blended_overlay GLXEW_GET_VAR(__GLXEW_SGIS_blended_overlay) + +#endif /* GLX_SGIS_blended_overlay */ + +/* -------------------------- GLX_SGIS_color_range ------------------------- */ + +#ifndef GLX_SGIS_color_range +#define GLX_SGIS_color_range 1 + +#define GLX_MIN_RED_SGIS 0 +#define GLX_MAX_GREEN_SGIS 0 +#define GLX_MIN_BLUE_SGIS 0 +#define GLX_MAX_ALPHA_SGIS 0 +#define GLX_MIN_GREEN_SGIS 0 +#define GLX_MIN_ALPHA_SGIS 0 +#define GLX_MAX_RED_SGIS 0 +#define GLX_EXTENDED_RANGE_SGIS 0 +#define GLX_MAX_BLUE_SGIS 0 + +#define GLXEW_SGIS_color_range GLXEW_GET_VAR(__GLXEW_SGIS_color_range) + +#endif /* GLX_SGIS_color_range */ + +/* -------------------------- GLX_SGIS_multisample ------------------------- */ + +#ifndef GLX_SGIS_multisample +#define GLX_SGIS_multisample 1 + +#define GLX_SAMPLE_BUFFERS_SGIS 100000 +#define GLX_SAMPLES_SGIS 100001 + +#define GLXEW_SGIS_multisample GLXEW_GET_VAR(__GLXEW_SGIS_multisample) + +#endif /* GLX_SGIS_multisample */ + +/* ---------------------- GLX_SGIS_shared_multisample ---------------------- */ + +#ifndef GLX_SGIS_shared_multisample +#define GLX_SGIS_shared_multisample 1 + +#define GLX_MULTISAMPLE_SUB_RECT_WIDTH_SGIS 0x8026 +#define GLX_MULTISAMPLE_SUB_RECT_HEIGHT_SGIS 0x8027 + +#define GLXEW_SGIS_shared_multisample GLXEW_GET_VAR(__GLXEW_SGIS_shared_multisample) + +#endif /* GLX_SGIS_shared_multisample */ + +/* --------------------------- GLX_SGIX_fbconfig --------------------------- */ + +#ifndef GLX_SGIX_fbconfig +#define GLX_SGIX_fbconfig 1 + +#define GLX_WINDOW_BIT_SGIX 0x00000001 +#define GLX_RGBA_BIT_SGIX 0x00000001 +#define GLX_PIXMAP_BIT_SGIX 0x00000002 +#define GLX_COLOR_INDEX_BIT_SGIX 0x00000002 +#define GLX_SCREEN_EXT 0x800C +#define GLX_DRAWABLE_TYPE_SGIX 0x8010 +#define GLX_RENDER_TYPE_SGIX 0x8011 +#define GLX_X_RENDERABLE_SGIX 0x8012 +#define GLX_FBCONFIG_ID_SGIX 0x8013 +#define GLX_RGBA_TYPE_SGIX 0x8014 +#define GLX_COLOR_INDEX_TYPE_SGIX 0x8015 + +typedef XID GLXFBConfigIDSGIX; +typedef struct __GLXFBConfigRec *GLXFBConfigSGIX; + +typedef GLXFBConfigSGIX* ( * PFNGLXCHOOSEFBCONFIGSGIXPROC) (Display *dpy, int screen, const int *attrib_list, int *nelements); +typedef GLXContext ( * PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC) (Display* dpy, GLXFBConfig config, int render_type, GLXContext share_list, Bool direct); +typedef GLXPixmap ( * PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC) (Display* dpy, GLXFBConfig config, Pixmap pixmap); +typedef int ( * PFNGLXGETFBCONFIGATTRIBSGIXPROC) (Display* dpy, GLXFBConfigSGIX config, int attribute, int *value); +typedef GLXFBConfigSGIX ( * PFNGLXGETFBCONFIGFROMVISUALSGIXPROC) (Display* dpy, XVisualInfo *vis); +typedef XVisualInfo* ( * PFNGLXGETVISUALFROMFBCONFIGSGIXPROC) (Display *dpy, GLXFBConfig config); + +#define glXChooseFBConfigSGIX GLXEW_GET_FUN(__glewXChooseFBConfigSGIX) +#define glXCreateContextWithConfigSGIX GLXEW_GET_FUN(__glewXCreateContextWithConfigSGIX) +#define glXCreateGLXPixmapWithConfigSGIX GLXEW_GET_FUN(__glewXCreateGLXPixmapWithConfigSGIX) +#define glXGetFBConfigAttribSGIX GLXEW_GET_FUN(__glewXGetFBConfigAttribSGIX) +#define glXGetFBConfigFromVisualSGIX GLXEW_GET_FUN(__glewXGetFBConfigFromVisualSGIX) +#define glXGetVisualFromFBConfigSGIX GLXEW_GET_FUN(__glewXGetVisualFromFBConfigSGIX) + +#define GLXEW_SGIX_fbconfig GLXEW_GET_VAR(__GLXEW_SGIX_fbconfig) + +#endif /* GLX_SGIX_fbconfig */ + +/* --------------------------- GLX_SGIX_hyperpipe -------------------------- */ + +#ifndef GLX_SGIX_hyperpipe +#define GLX_SGIX_hyperpipe 1 + +#define GLX_HYPERPIPE_DISPLAY_PIPE_SGIX 0x00000001 +#define GLX_PIPE_RECT_SGIX 0x00000001 +#define GLX_PIPE_RECT_LIMITS_SGIX 0x00000002 +#define GLX_HYPERPIPE_RENDER_PIPE_SGIX 0x00000002 +#define GLX_HYPERPIPE_STEREO_SGIX 0x00000003 +#define GLX_HYPERPIPE_PIXEL_AVERAGE_SGIX 0x00000004 +#define GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX 80 +#define GLX_BAD_HYPERPIPE_CONFIG_SGIX 91 +#define GLX_BAD_HYPERPIPE_SGIX 92 +#define GLX_HYPERPIPE_ID_SGIX 0x8030 + +typedef struct { + char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]; + int networkId; +} GLXHyperpipeNetworkSGIX; +typedef struct { + char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]; + int XOrigin; + int YOrigin; + int maxHeight; + int maxWidth; +} GLXPipeRectLimits; +typedef struct { + char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]; + int channel; + unsigned int participationType; + int timeSlice; +} GLXHyperpipeConfigSGIX; +typedef struct { + char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]; + int srcXOrigin; + int srcYOrigin; + int srcWidth; + int srcHeight; + int destXOrigin; + int destYOrigin; + int destWidth; + int destHeight; +} GLXPipeRect; + +typedef int ( * PFNGLXBINDHYPERPIPESGIXPROC) (Display *dpy, int hpId); +typedef int ( * PFNGLXDESTROYHYPERPIPECONFIGSGIXPROC) (Display *dpy, int hpId); +typedef int ( * PFNGLXHYPERPIPEATTRIBSGIXPROC) (Display *dpy, int timeSlice, int attrib, int size, void *attribList); +typedef int ( * PFNGLXHYPERPIPECONFIGSGIXPROC) (Display *dpy, int networkId, int npipes, GLXHyperpipeConfigSGIX *cfg, int *hpId); +typedef int ( * PFNGLXQUERYHYPERPIPEATTRIBSGIXPROC) (Display *dpy, int timeSlice, int attrib, int size, void *returnAttribList); +typedef int ( * PFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC) (Display *dpy, int timeSlice, int attrib, int size, void *attribList, void *returnAttribList); +typedef GLXHyperpipeConfigSGIX * ( * PFNGLXQUERYHYPERPIPECONFIGSGIXPROC) (Display *dpy, int hpId, int *npipes); +typedef GLXHyperpipeNetworkSGIX * ( * PFNGLXQUERYHYPERPIPENETWORKSGIXPROC) (Display *dpy, int *npipes); + +#define glXBindHyperpipeSGIX GLXEW_GET_FUN(__glewXBindHyperpipeSGIX) +#define glXDestroyHyperpipeConfigSGIX GLXEW_GET_FUN(__glewXDestroyHyperpipeConfigSGIX) +#define glXHyperpipeAttribSGIX GLXEW_GET_FUN(__glewXHyperpipeAttribSGIX) +#define glXHyperpipeConfigSGIX GLXEW_GET_FUN(__glewXHyperpipeConfigSGIX) +#define glXQueryHyperpipeAttribSGIX GLXEW_GET_FUN(__glewXQueryHyperpipeAttribSGIX) +#define glXQueryHyperpipeBestAttribSGIX GLXEW_GET_FUN(__glewXQueryHyperpipeBestAttribSGIX) +#define glXQueryHyperpipeConfigSGIX GLXEW_GET_FUN(__glewXQueryHyperpipeConfigSGIX) +#define glXQueryHyperpipeNetworkSGIX GLXEW_GET_FUN(__glewXQueryHyperpipeNetworkSGIX) + +#define GLXEW_SGIX_hyperpipe GLXEW_GET_VAR(__GLXEW_SGIX_hyperpipe) + +#endif /* GLX_SGIX_hyperpipe */ + +/* ---------------------------- GLX_SGIX_pbuffer --------------------------- */ + +#ifndef GLX_SGIX_pbuffer +#define GLX_SGIX_pbuffer 1 + +#define GLX_FRONT_LEFT_BUFFER_BIT_SGIX 0x00000001 +#define GLX_FRONT_RIGHT_BUFFER_BIT_SGIX 0x00000002 +#define GLX_PBUFFER_BIT_SGIX 0x00000004 +#define GLX_BACK_LEFT_BUFFER_BIT_SGIX 0x00000004 +#define GLX_BACK_RIGHT_BUFFER_BIT_SGIX 0x00000008 +#define GLX_AUX_BUFFERS_BIT_SGIX 0x00000010 +#define GLX_DEPTH_BUFFER_BIT_SGIX 0x00000020 +#define GLX_STENCIL_BUFFER_BIT_SGIX 0x00000040 +#define GLX_ACCUM_BUFFER_BIT_SGIX 0x00000080 +#define GLX_SAMPLE_BUFFERS_BIT_SGIX 0x00000100 +#define GLX_MAX_PBUFFER_WIDTH_SGIX 0x8016 +#define GLX_MAX_PBUFFER_HEIGHT_SGIX 0x8017 +#define GLX_MAX_PBUFFER_PIXELS_SGIX 0x8018 +#define GLX_OPTIMAL_PBUFFER_WIDTH_SGIX 0x8019 +#define GLX_OPTIMAL_PBUFFER_HEIGHT_SGIX 0x801A +#define GLX_PRESERVED_CONTENTS_SGIX 0x801B +#define GLX_LARGEST_PBUFFER_SGIX 0x801C +#define GLX_WIDTH_SGIX 0x801D +#define GLX_HEIGHT_SGIX 0x801E +#define GLX_EVENT_MASK_SGIX 0x801F +#define GLX_DAMAGED_SGIX 0x8020 +#define GLX_SAVED_SGIX 0x8021 +#define GLX_WINDOW_SGIX 0x8022 +#define GLX_PBUFFER_SGIX 0x8023 +#define GLX_BUFFER_CLOBBER_MASK_SGIX 0x08000000 + +typedef XID GLXPbufferSGIX; +typedef struct { int type; unsigned long serial; Bool send_event; Display *display; GLXDrawable drawable; int event_type; int draw_type; unsigned int mask; int x, y; int width, height; int count; } GLXBufferClobberEventSGIX; + +typedef GLXPbuffer ( * PFNGLXCREATEGLXPBUFFERSGIXPROC) (Display* dpy, GLXFBConfig config, unsigned int width, unsigned int height, int *attrib_list); +typedef void ( * PFNGLXDESTROYGLXPBUFFERSGIXPROC) (Display* dpy, GLXPbuffer pbuf); +typedef void ( * PFNGLXGETSELECTEDEVENTSGIXPROC) (Display* dpy, GLXDrawable drawable, unsigned long *mask); +typedef void ( * PFNGLXQUERYGLXPBUFFERSGIXPROC) (Display* dpy, GLXPbuffer pbuf, int attribute, unsigned int *value); +typedef void ( * PFNGLXSELECTEVENTSGIXPROC) (Display* dpy, GLXDrawable drawable, unsigned long mask); + +#define glXCreateGLXPbufferSGIX GLXEW_GET_FUN(__glewXCreateGLXPbufferSGIX) +#define glXDestroyGLXPbufferSGIX GLXEW_GET_FUN(__glewXDestroyGLXPbufferSGIX) +#define glXGetSelectedEventSGIX GLXEW_GET_FUN(__glewXGetSelectedEventSGIX) +#define glXQueryGLXPbufferSGIX GLXEW_GET_FUN(__glewXQueryGLXPbufferSGIX) +#define glXSelectEventSGIX GLXEW_GET_FUN(__glewXSelectEventSGIX) + +#define GLXEW_SGIX_pbuffer GLXEW_GET_VAR(__GLXEW_SGIX_pbuffer) + +#endif /* GLX_SGIX_pbuffer */ + +/* ------------------------- GLX_SGIX_swap_barrier ------------------------- */ + +#ifndef GLX_SGIX_swap_barrier +#define GLX_SGIX_swap_barrier 1 + +typedef void ( * PFNGLXBINDSWAPBARRIERSGIXPROC) (Display *dpy, GLXDrawable drawable, int barrier); +typedef Bool ( * PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC) (Display *dpy, int screen, int *max); + +#define glXBindSwapBarrierSGIX GLXEW_GET_FUN(__glewXBindSwapBarrierSGIX) +#define glXQueryMaxSwapBarriersSGIX GLXEW_GET_FUN(__glewXQueryMaxSwapBarriersSGIX) + +#define GLXEW_SGIX_swap_barrier GLXEW_GET_VAR(__GLXEW_SGIX_swap_barrier) + +#endif /* GLX_SGIX_swap_barrier */ + +/* -------------------------- GLX_SGIX_swap_group -------------------------- */ + +#ifndef GLX_SGIX_swap_group +#define GLX_SGIX_swap_group 1 + +typedef void ( * PFNGLXJOINSWAPGROUPSGIXPROC) (Display *dpy, GLXDrawable drawable, GLXDrawable member); + +#define glXJoinSwapGroupSGIX GLXEW_GET_FUN(__glewXJoinSwapGroupSGIX) + +#define GLXEW_SGIX_swap_group GLXEW_GET_VAR(__GLXEW_SGIX_swap_group) + +#endif /* GLX_SGIX_swap_group */ + +/* ------------------------- GLX_SGIX_video_resize ------------------------- */ + +#ifndef GLX_SGIX_video_resize +#define GLX_SGIX_video_resize 1 + +#define GLX_SYNC_FRAME_SGIX 0x00000000 +#define GLX_SYNC_SWAP_SGIX 0x00000001 + +typedef int ( * PFNGLXBINDCHANNELTOWINDOWSGIXPROC) (Display* display, int screen, int channel, Window window); +typedef int ( * PFNGLXCHANNELRECTSGIXPROC) (Display* display, int screen, int channel, int x, int y, int w, int h); +typedef int ( * PFNGLXCHANNELRECTSYNCSGIXPROC) (Display* display, int screen, int channel, GLenum synctype); +typedef int ( * PFNGLXQUERYCHANNELDELTASSGIXPROC) (Display* display, int screen, int channel, int *x, int *y, int *w, int *h); +typedef int ( * PFNGLXQUERYCHANNELRECTSGIXPROC) (Display* display, int screen, int channel, int *dx, int *dy, int *dw, int *dh); + +#define glXBindChannelToWindowSGIX GLXEW_GET_FUN(__glewXBindChannelToWindowSGIX) +#define glXChannelRectSGIX GLXEW_GET_FUN(__glewXChannelRectSGIX) +#define glXChannelRectSyncSGIX GLXEW_GET_FUN(__glewXChannelRectSyncSGIX) +#define glXQueryChannelDeltasSGIX GLXEW_GET_FUN(__glewXQueryChannelDeltasSGIX) +#define glXQueryChannelRectSGIX GLXEW_GET_FUN(__glewXQueryChannelRectSGIX) + +#define GLXEW_SGIX_video_resize GLXEW_GET_VAR(__GLXEW_SGIX_video_resize) + +#endif /* GLX_SGIX_video_resize */ + +/* ---------------------- GLX_SGIX_visual_select_group --------------------- */ + +#ifndef GLX_SGIX_visual_select_group +#define GLX_SGIX_visual_select_group 1 + +#define GLX_VISUAL_SELECT_GROUP_SGIX 0x8028 + +#define GLXEW_SGIX_visual_select_group GLXEW_GET_VAR(__GLXEW_SGIX_visual_select_group) + +#endif /* GLX_SGIX_visual_select_group */ + +/* ---------------------------- GLX_SGI_cushion ---------------------------- */ + +#ifndef GLX_SGI_cushion +#define GLX_SGI_cushion 1 + +typedef void ( * PFNGLXCUSHIONSGIPROC) (Display* dpy, Window window, float cushion); + +#define glXCushionSGI GLXEW_GET_FUN(__glewXCushionSGI) + +#define GLXEW_SGI_cushion GLXEW_GET_VAR(__GLXEW_SGI_cushion) + +#endif /* GLX_SGI_cushion */ + +/* ----------------------- GLX_SGI_make_current_read ----------------------- */ + +#ifndef GLX_SGI_make_current_read +#define GLX_SGI_make_current_read 1 + +typedef GLXDrawable ( * PFNGLXGETCURRENTREADDRAWABLESGIPROC) (void); +typedef Bool ( * PFNGLXMAKECURRENTREADSGIPROC) (Display* dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx); + +#define glXGetCurrentReadDrawableSGI GLXEW_GET_FUN(__glewXGetCurrentReadDrawableSGI) +#define glXMakeCurrentReadSGI GLXEW_GET_FUN(__glewXMakeCurrentReadSGI) + +#define GLXEW_SGI_make_current_read GLXEW_GET_VAR(__GLXEW_SGI_make_current_read) + +#endif /* GLX_SGI_make_current_read */ + +/* -------------------------- GLX_SGI_swap_control ------------------------- */ + +#ifndef GLX_SGI_swap_control +#define GLX_SGI_swap_control 1 + +typedef int ( * PFNGLXSWAPINTERVALSGIPROC) (int interval); + +#define glXSwapIntervalSGI GLXEW_GET_FUN(__glewXSwapIntervalSGI) + +#define GLXEW_SGI_swap_control GLXEW_GET_VAR(__GLXEW_SGI_swap_control) + +#endif /* GLX_SGI_swap_control */ + +/* --------------------------- GLX_SGI_video_sync -------------------------- */ + +#ifndef GLX_SGI_video_sync +#define GLX_SGI_video_sync 1 + +typedef int ( * PFNGLXGETVIDEOSYNCSGIPROC) (uint* count); +typedef int ( * PFNGLXWAITVIDEOSYNCSGIPROC) (int divisor, int remainder, unsigned int* count); + +#define glXGetVideoSyncSGI GLXEW_GET_FUN(__glewXGetVideoSyncSGI) +#define glXWaitVideoSyncSGI GLXEW_GET_FUN(__glewXWaitVideoSyncSGI) + +#define GLXEW_SGI_video_sync GLXEW_GET_VAR(__GLXEW_SGI_video_sync) + +#endif /* GLX_SGI_video_sync */ + +/* --------------------- GLX_SUN_get_transparent_index --------------------- */ + +#ifndef GLX_SUN_get_transparent_index +#define GLX_SUN_get_transparent_index 1 + +typedef Status ( * PFNGLXGETTRANSPARENTINDEXSUNPROC) (Display* dpy, Window overlay, Window underlay, unsigned long *pTransparentIndex); + +#define glXGetTransparentIndexSUN GLXEW_GET_FUN(__glewXGetTransparentIndexSUN) + +#define GLXEW_SUN_get_transparent_index GLXEW_GET_VAR(__GLXEW_SUN_get_transparent_index) + +#endif /* GLX_SUN_get_transparent_index */ + +/* -------------------------- GLX_SUN_video_resize ------------------------- */ + +#ifndef GLX_SUN_video_resize +#define GLX_SUN_video_resize 1 + +#define GLX_VIDEO_RESIZE_SUN 0x8171 +#define GL_VIDEO_RESIZE_COMPENSATION_SUN 0x85CD + +typedef int ( * PFNGLXGETVIDEORESIZESUNPROC) (Display* display, GLXDrawable window, float* factor); +typedef int ( * PFNGLXVIDEORESIZESUNPROC) (Display* display, GLXDrawable window, float factor); + +#define glXGetVideoResizeSUN GLXEW_GET_FUN(__glewXGetVideoResizeSUN) +#define glXVideoResizeSUN GLXEW_GET_FUN(__glewXVideoResizeSUN) + +#define GLXEW_SUN_video_resize GLXEW_GET_VAR(__GLXEW_SUN_video_resize) + +#endif /* GLX_SUN_video_resize */ + +/* ------------------------------------------------------------------------- */ + +#ifdef GLEW_MX +#define GLXEW_EXPORT +#else +#define GLXEW_EXPORT extern +#endif /* GLEW_MX */ + +extern PFNGLXGETCURRENTDISPLAYPROC __glewXGetCurrentDisplay; + +extern PFNGLXCHOOSEFBCONFIGPROC __glewXChooseFBConfig; +extern PFNGLXCREATENEWCONTEXTPROC __glewXCreateNewContext; +extern PFNGLXCREATEPBUFFERPROC __glewXCreatePbuffer; +extern PFNGLXCREATEPIXMAPPROC __glewXCreatePixmap; +extern PFNGLXCREATEWINDOWPROC __glewXCreateWindow; +extern PFNGLXDESTROYPBUFFERPROC __glewXDestroyPbuffer; +extern PFNGLXDESTROYPIXMAPPROC __glewXDestroyPixmap; +extern PFNGLXDESTROYWINDOWPROC __glewXDestroyWindow; +extern PFNGLXGETCURRENTREADDRAWABLEPROC __glewXGetCurrentReadDrawable; +extern PFNGLXGETFBCONFIGATTRIBPROC __glewXGetFBConfigAttrib; +extern PFNGLXGETFBCONFIGSPROC __glewXGetFBConfigs; +extern PFNGLXGETSELECTEDEVENTPROC __glewXGetSelectedEvent; +extern PFNGLXGETVISUALFROMFBCONFIGPROC __glewXGetVisualFromFBConfig; +extern PFNGLXMAKECONTEXTCURRENTPROC __glewXMakeContextCurrent; +extern PFNGLXQUERYCONTEXTPROC __glewXQueryContext; +extern PFNGLXQUERYDRAWABLEPROC __glewXQueryDrawable; +extern PFNGLXSELECTEVENTPROC __glewXSelectEvent; + +extern PFNGLXBINDTEXIMAGEATIPROC __glewXBindTexImageATI; +extern PFNGLXDRAWABLEATTRIBATIPROC __glewXDrawableAttribATI; +extern PFNGLXRELEASETEXIMAGEATIPROC __glewXReleaseTexImageATI; + +extern PFNGLXFREECONTEXTEXTPROC __glewXFreeContextEXT; +extern PFNGLXGETCONTEXTIDEXTPROC __glewXGetContextIDEXT; +extern PFNGLXIMPORTCONTEXTEXTPROC __glewXImportContextEXT; +extern PFNGLXQUERYCONTEXTINFOEXTPROC __glewXQueryContextInfoEXT; + +extern PFNGLXGETAGPOFFSETMESAPROC __glewXGetAGPOffsetMESA; + +extern PFNGLXCOPYSUBBUFFERMESAPROC __glewXCopySubBufferMESA; + +extern PFNGLXCREATEGLXPIXMAPMESAPROC __glewXCreateGLXPixmapMESA; + +extern PFNGLXRELEASEBUFFERSMESAPROC __glewXReleaseBuffersMESA; + +extern PFNGLXSET3DFXMODEMESAPROC __glewXSet3DfxModeMESA; + +extern PFNGLXALLOCATEMEMORYNVPROC __glewXAllocateMemoryNV; +extern PFNGLXFREEMEMORYNVPROC __glewXFreeMemoryNV; + +#ifdef GLX_OML_sync_control +extern PFNGLXGETMSCRATEOMLPROC __glewXGetMscRateOML; +extern PFNGLXGETSYNCVALUESOMLPROC __glewXGetSyncValuesOML; +extern PFNGLXSWAPBUFFERSMSCOMLPROC __glewXSwapBuffersMscOML; +extern PFNGLXWAITFORMSCOMLPROC __glewXWaitForMscOML; +extern PFNGLXWAITFORSBCOMLPROC __glewXWaitForSbcOML; +#endif + +extern PFNGLXCHOOSEFBCONFIGSGIXPROC __glewXChooseFBConfigSGIX; +extern PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC __glewXCreateContextWithConfigSGIX; +extern PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC __glewXCreateGLXPixmapWithConfigSGIX; +extern PFNGLXGETFBCONFIGATTRIBSGIXPROC __glewXGetFBConfigAttribSGIX; +extern PFNGLXGETFBCONFIGFROMVISUALSGIXPROC __glewXGetFBConfigFromVisualSGIX; +extern PFNGLXGETVISUALFROMFBCONFIGSGIXPROC __glewXGetVisualFromFBConfigSGIX; + +extern PFNGLXBINDHYPERPIPESGIXPROC __glewXBindHyperpipeSGIX; +extern PFNGLXDESTROYHYPERPIPECONFIGSGIXPROC __glewXDestroyHyperpipeConfigSGIX; +extern PFNGLXHYPERPIPEATTRIBSGIXPROC __glewXHyperpipeAttribSGIX; +extern PFNGLXHYPERPIPECONFIGSGIXPROC __glewXHyperpipeConfigSGIX; +extern PFNGLXQUERYHYPERPIPEATTRIBSGIXPROC __glewXQueryHyperpipeAttribSGIX; +extern PFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC __glewXQueryHyperpipeBestAttribSGIX; +extern PFNGLXQUERYHYPERPIPECONFIGSGIXPROC __glewXQueryHyperpipeConfigSGIX; +extern PFNGLXQUERYHYPERPIPENETWORKSGIXPROC __glewXQueryHyperpipeNetworkSGIX; + +extern PFNGLXCREATEGLXPBUFFERSGIXPROC __glewXCreateGLXPbufferSGIX; +extern PFNGLXDESTROYGLXPBUFFERSGIXPROC __glewXDestroyGLXPbufferSGIX; +extern PFNGLXGETSELECTEDEVENTSGIXPROC __glewXGetSelectedEventSGIX; +extern PFNGLXQUERYGLXPBUFFERSGIXPROC __glewXQueryGLXPbufferSGIX; +extern PFNGLXSELECTEVENTSGIXPROC __glewXSelectEventSGIX; + +extern PFNGLXBINDSWAPBARRIERSGIXPROC __glewXBindSwapBarrierSGIX; +extern PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC __glewXQueryMaxSwapBarriersSGIX; + +extern PFNGLXJOINSWAPGROUPSGIXPROC __glewXJoinSwapGroupSGIX; + +extern PFNGLXBINDCHANNELTOWINDOWSGIXPROC __glewXBindChannelToWindowSGIX; +extern PFNGLXCHANNELRECTSGIXPROC __glewXChannelRectSGIX; +extern PFNGLXCHANNELRECTSYNCSGIXPROC __glewXChannelRectSyncSGIX; +extern PFNGLXQUERYCHANNELDELTASSGIXPROC __glewXQueryChannelDeltasSGIX; +extern PFNGLXQUERYCHANNELRECTSGIXPROC __glewXQueryChannelRectSGIX; + +extern PFNGLXCUSHIONSGIPROC __glewXCushionSGI; + +extern PFNGLXGETCURRENTREADDRAWABLESGIPROC __glewXGetCurrentReadDrawableSGI; +extern PFNGLXMAKECURRENTREADSGIPROC __glewXMakeCurrentReadSGI; + +extern PFNGLXSWAPINTERVALSGIPROC __glewXSwapIntervalSGI; + +extern PFNGLXGETVIDEOSYNCSGIPROC __glewXGetVideoSyncSGI; +extern PFNGLXWAITVIDEOSYNCSGIPROC __glewXWaitVideoSyncSGI; + +extern PFNGLXGETTRANSPARENTINDEXSUNPROC __glewXGetTransparentIndexSUN; + +extern PFNGLXGETVIDEORESIZESUNPROC __glewXGetVideoResizeSUN; +extern PFNGLXVIDEORESIZESUNPROC __glewXVideoResizeSUN; + +#if defined(GLEW_MX) +struct GLXEWContextStruct +{ +#endif /* GLEW_MX */ + +GLXEW_EXPORT GLboolean __GLXEW_VERSION_1_0; +GLXEW_EXPORT GLboolean __GLXEW_VERSION_1_1; +GLXEW_EXPORT GLboolean __GLXEW_VERSION_1_2; +GLXEW_EXPORT GLboolean __GLXEW_VERSION_1_3; +GLXEW_EXPORT GLboolean __GLXEW_VERSION_1_4; +GLXEW_EXPORT GLboolean __GLXEW_3DFX_multisample; +GLXEW_EXPORT GLboolean __GLXEW_ARB_fbconfig_float; +GLXEW_EXPORT GLboolean __GLXEW_ARB_get_proc_address; +GLXEW_EXPORT GLboolean __GLXEW_ARB_multisample; +GLXEW_EXPORT GLboolean __GLXEW_ATI_pixel_format_float; +GLXEW_EXPORT GLboolean __GLXEW_ATI_render_texture; +GLXEW_EXPORT GLboolean __GLXEW_EXT_fbconfig_packed_float; +GLXEW_EXPORT GLboolean __GLXEW_EXT_framebuffer_sRGB; +GLXEW_EXPORT GLboolean __GLXEW_EXT_import_context; +GLXEW_EXPORT GLboolean __GLXEW_EXT_scene_marker; +GLXEW_EXPORT GLboolean __GLXEW_EXT_visual_info; +GLXEW_EXPORT GLboolean __GLXEW_EXT_visual_rating; +GLXEW_EXPORT GLboolean __GLXEW_MESA_agp_offset; +GLXEW_EXPORT GLboolean __GLXEW_MESA_copy_sub_buffer; +GLXEW_EXPORT GLboolean __GLXEW_MESA_pixmap_colormap; +GLXEW_EXPORT GLboolean __GLXEW_MESA_release_buffers; +GLXEW_EXPORT GLboolean __GLXEW_MESA_set_3dfx_mode; +GLXEW_EXPORT GLboolean __GLXEW_NV_float_buffer; +GLXEW_EXPORT GLboolean __GLXEW_NV_vertex_array_range; +GLXEW_EXPORT GLboolean __GLXEW_OML_swap_method; +GLXEW_EXPORT GLboolean __GLXEW_OML_sync_control; +GLXEW_EXPORT GLboolean __GLXEW_SGIS_blended_overlay; +GLXEW_EXPORT GLboolean __GLXEW_SGIS_color_range; +GLXEW_EXPORT GLboolean __GLXEW_SGIS_multisample; +GLXEW_EXPORT GLboolean __GLXEW_SGIS_shared_multisample; +GLXEW_EXPORT GLboolean __GLXEW_SGIX_fbconfig; +GLXEW_EXPORT GLboolean __GLXEW_SGIX_hyperpipe; +GLXEW_EXPORT GLboolean __GLXEW_SGIX_pbuffer; +GLXEW_EXPORT GLboolean __GLXEW_SGIX_swap_barrier; +GLXEW_EXPORT GLboolean __GLXEW_SGIX_swap_group; +GLXEW_EXPORT GLboolean __GLXEW_SGIX_video_resize; +GLXEW_EXPORT GLboolean __GLXEW_SGIX_visual_select_group; +GLXEW_EXPORT GLboolean __GLXEW_SGI_cushion; +GLXEW_EXPORT GLboolean __GLXEW_SGI_make_current_read; +GLXEW_EXPORT GLboolean __GLXEW_SGI_swap_control; +GLXEW_EXPORT GLboolean __GLXEW_SGI_video_sync; +GLXEW_EXPORT GLboolean __GLXEW_SUN_get_transparent_index; +GLXEW_EXPORT GLboolean __GLXEW_SUN_video_resize; + +#ifdef GLEW_MX +}; /* GLXEWContextStruct */ +#endif /* GLEW_MX */ + +/* ------------------------------------------------------------------------ */ + +#ifdef GLEW_MX + +typedef struct GLXEWContextStruct GLXEWContext; +extern GLenum glxewContextInit (GLXEWContext* ctx); +extern GLboolean glxewContextIsSupported (GLXEWContext* ctx, const char* name); + +#define glxewInit() glxewContextInit(glxewGetContext()) +#define glxewIsSupported(x) glxewContextIsSupported(glxewGetContext(), x) + +#define GLXEW_GET_VAR(x) (*(const GLboolean*)&(glxewGetContext()->x)) +#define GLXEW_GET_FUN(x) x + +#else /* GLEW_MX */ + +#define GLXEW_GET_VAR(x) (*(const GLboolean*)&x) +#define GLXEW_GET_FUN(x) x + +extern GLboolean glxewIsSupported (const char* name); + +#endif /* GLEW_MX */ + +extern GLboolean glxewGetExtension (const char* name); + +#ifdef __cplusplus +} +#endif + +#endif /* __glxew_h__ */ diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Windows/GL/glxext.h b/Source/Plugins/Plugin_VideoOGL/Src/Windows/GL/glxext.h new file mode 100644 index 0000000000..3c63175f4a --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/Windows/GL/glxext.h @@ -0,0 +1,615 @@ +#ifndef __glxext_h_ +#define __glxext_h_ + +#ifdef __cplusplus +extern "C" { +#endif + +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: This software was created using the +** OpenGL(R) version 1.2.1 Sample Implementation published by SGI, but has +** not been independently verified as being compliant with the OpenGL(R) +** version 1.2.1 Specification. +*/ + +#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) +#define WIN32_LEAN_AND_MEAN 1 +#include +#else +#include +#endif + +#ifndef APIENTRY +#define APIENTRY +#endif + + +/*************************************************************/ + +/* Header file version number, required by OpenGL ABI for Linux */ +#define GLX_GLXEXT_VERSION 2 + +#ifndef GLX_VERSION_1_3 +#define GLX_WINDOW_BIT 0x00000001 +#define GLX_PIXMAP_BIT 0x00000002 +#define GLX_PBUFFER_BIT 0x00000004 +#define GLX_RGBA_BIT 0x00000001 +#define GLX_COLOR_INDEX_BIT 0x00000002 +#define GLX_PBUFFER_CLOBBER_MASK 0x08000000 +#define GLX_FRONT_LEFT_BUFFER_BIT 0x00000001 +#define GLX_FRONT_RIGHT_BUFFER_BIT 0x00000002 +#define GLX_BACK_LEFT_BUFFER_BIT 0x00000004 +#define GLX_BACK_RIGHT_BUFFER_BIT 0x00000008 +#define GLX_AUX_BUFFERS_BIT 0x00000010 +#define GLX_DEPTH_BUFFER_BIT 0x00000020 +#define GLX_STENCIL_BUFFER_BIT 0x00000040 +#define GLX_ACCUM_BUFFER_BIT 0x00000080 +#define GLX_CONFIG_CAVEAT 0x20 +#define GLX_X_VISUAL_TYPE 0x22 +#define GLX_TRANSPARENT_TYPE 0x23 +#define GLX_TRANSPARENT_INDEX_VALUE 0x24 +#define GLX_TRANSPARENT_RED_VALUE 0x25 +#define GLX_TRANSPARENT_GREEN_VALUE 0x26 +#define GLX_TRANSPARENT_BLUE_VALUE 0x27 +#define GLX_TRANSPARENT_ALPHA_VALUE 0x28 +#define GLX_DONT_CARE 0xFFFFFFFF +#define GLX_NONE 0x8000 +#define GLX_SLOW_CONFIG 0x8001 +#define GLX_TRUE_COLOR 0x8002 +#define GLX_DIRECT_COLOR 0x8003 +#define GLX_PSEUDO_COLOR 0x8004 +#define GLX_STATIC_COLOR 0x8005 +#define GLX_GRAY_SCALE 0x8006 +#define GLX_STATIC_GRAY 0x8007 +#define GLX_TRANSPARENT_RGB 0x8008 +#define GLX_TRANSPARENT_INDEX 0x8009 +#define GLX_VISUAL_ID 0x800B +#define GLX_SCREEN 0x800C +#define GLX_NON_CONFORMANT_CONFIG 0x800D +#define GLX_DRAWABLE_TYPE 0x8010 +#define GLX_RENDER_TYPE 0x8011 +#define GLX_X_RENDERABLE 0x8012 +#define GLX_FBCONFIG_ID 0x8013 +#define GLX_RGBA_TYPE 0x8014 +#define GLX_COLOR_INDEX_TYPE 0x8015 +#define GLX_MAX_PBUFFER_WIDTH 0x8016 +#define GLX_MAX_PBUFFER_HEIGHT 0x8017 +#define GLX_MAX_PBUFFER_PIXELS 0x8018 +#define GLX_PRESERVED_CONTENTS 0x801B +#define GLX_LARGEST_PBUFFER 0x801C +#define GLX_WIDTH 0x801D +#define GLX_HEIGHT 0x801E +#define GLX_EVENT_MASK 0x801F +#define GLX_DAMAGED 0x8020 +#define GLX_SAVED 0x8021 +#define GLX_WINDOW 0x8022 +#define GLX_PBUFFER 0x8023 +#define GLX_PBUFFER_HEIGHT 0x8040 +#define GLX_PBUFFER_WIDTH 0x8041 +#endif + +#ifndef GLX_EXT_visual_info +#define GLX_X_VISUAL_TYPE_EXT 0x22 +#define GLX_TRANSPARENT_TYPE_EXT 0x23 +#define GLX_TRANSPARENT_INDEX_VALUE_EXT 0x24 +#define GLX_TRANSPARENT_RED_VALUE_EXT 0x25 +#define GLX_TRANSPARENT_GREEN_VALUE_EXT 0x26 +#define GLX_TRANSPARENT_BLUE_VALUE_EXT 0x27 +#define GLX_TRANSPARENT_ALPHA_VALUE_EXT 0x28 +#define GLX_NONE_EXT 0x8000 +#define GLX_TRUE_COLOR_EXT 0x8002 +#define GLX_DIRECT_COLOR_EXT 0x8003 +#define GLX_PSEUDO_COLOR_EXT 0x8004 +#define GLX_STATIC_COLOR_EXT 0x8005 +#define GLX_GRAY_SCALE_EXT 0x8006 +#define GLX_STATIC_GRAY_EXT 0x8007 +#define GLX_TRANSPARENT_RGB_EXT 0x8008 +#define GLX_TRANSPARENT_INDEX_EXT 0x8009 +#endif + +#ifndef GLX_SGI_swap_control +#endif + +#ifndef GLX_SGI_video_sync +#endif + +#ifndef GLX_SGI_make_current_read +#endif + +#ifndef GLX_SGIX_video_source +#endif + +#ifndef GLX_EXT_visual_rating +#define GLX_VISUAL_CAVEAT_EXT 0x20 +#define GLX_SLOW_VISUAL_EXT 0x8001 +#define GLX_NON_CONFORMANT_VISUAL_EXT 0x800D +/* reuse GLX_NONE_EXT */ +#endif + +#ifndef GLX_EXT_import_context +#define GLX_SHARE_CONTEXT_EXT 0x800A +#define GLX_VISUAL_ID_EXT 0x800B +#define GLX_SCREEN_EXT 0x800C +#endif + +#ifndef GLX_SGIX_fbconfig +#ifndef GLX_WINDOW_BIT_SGIX +#define GLX_WINDOW_BIT_SGIX 0x00000001 +#endif +#ifndef GLX_PIXMAP_BIT_SGIX +#define GLX_PIXMAP_BIT_SGIX 0x00000002 +#endif +#ifndef GLX_RGBA_BIT_SGIX +#define GLX_RGBA_BIT_SGIX 0x00000001 +#endif +#ifndef GLX_COLOR_INDEX_BIT_SGIX +#define GLX_COLOR_INDEX_BIT_SGIX 0x00000002 +#endif +#ifndef GLX_DRAWABLE_TYPE_SGIX +#define GLX_DRAWABLE_TYPE_SGIX 0x8010 +#endif +#ifndef GLX_RENDER_TYPE_SGIX +#define GLX_RENDER_TYPE_SGIX 0x8011 +#endif +#ifndef GLX_X_RENDERABLE_SGIX +#define GLX_X_RENDERABLE_SGIX 0x8012 +#endif +#ifndef GLX_FBCONFIG_ID_SGIX +#define GLX_FBCONFIG_ID_SGIX 0x8013 +#endif +#ifndef GLX_RGBA_TYPE_SGIX +#define GLX_RGBA_TYPE_SGIX 0x8014 +#endif +#ifndef GLX_COLOR_INDEX_TYPE_SGIX +#define GLX_COLOR_INDEX_TYPE_SGIX 0x8015 +#endif +/* reuse GLX_SCREEN_EXT */ +#endif + +#ifndef GLX_SGIX_pbuffer +#ifndef GLX_PBUFFER_BIT_SGIX +#define GLX_PBUFFER_BIT_SGIX 0x00000004 +#endif +#ifndef GLX_BUFFER_CLOBBER_MASK_SGIX +#define GLX_BUFFER_CLOBBER_MASK_SGIX 0x08000000 +#endif +#ifndef GLX_FRONT_LEFT_BUFFER_BIT_SGIX +#define GLX_FRONT_LEFT_BUFFER_BIT_SGIX 0x00000001 +#endif +#ifndef GLX_FRONT_RIGHT_BUFFER_BIT_SGIX +#define GLX_FRONT_RIGHT_BUFFER_BIT_SGIX 0x00000002 +#endif +#ifndef GLX_BACK_LEFT_BUFFER_BIT_SGIX +#define GLX_BACK_LEFT_BUFFER_BIT_SGIX 0x00000004 +#endif +#ifndef GLX_BACK_RIGHT_BUFFER_BIT_SGIX +#define GLX_BACK_RIGHT_BUFFER_BIT_SGIX 0x00000008 +#endif +#ifndef GLX_AUX_BUFFERS_BIT_SGIX +#define GLX_AUX_BUFFERS_BIT_SGIX 0x00000010 +#endif +#ifndef GLX_DEPTH_BUFFER_BIT_SGIX +#define GLX_DEPTH_BUFFER_BIT_SGIX 0x00000020 +#endif +#ifndef GLX_STENCIL_BUFFER_BIT_SGIX +#define GLX_STENCIL_BUFFER_BIT_SGIX 0x00000040 +#endif +#ifndef GLX_ACCUM_BUFFER_BIT_SGIX +#define GLX_ACCUM_BUFFER_BIT_SGIX 0x00000080 +#endif +#ifndef GLX_SAMPLE_BUFFERS_BIT_SGIX +#define GLX_SAMPLE_BUFFERS_BIT_SGIX 0x00000100 +#endif +#ifndef GLX_MAX_PBUFFER_WIDTH_SGIX +#define GLX_MAX_PBUFFER_WIDTH_SGIX 0x8016 +#endif +#ifndef GLX_MAX_PBUFFER_HEIGHT_SGIX +#define GLX_MAX_PBUFFER_HEIGHT_SGIX 0x8017 +#endif +#ifndef GLX_MAX_PBUFFER_PIXELS_SGIX +#define GLX_MAX_PBUFFER_PIXELS_SGIX 0x8018 +#endif +#ifndef GLX_OPTIMAL_PBUFFER_WIDTH_SGIX +#define GLX_OPTIMAL_PBUFFER_WIDTH_SGIX 0x8019 +#endif +#ifndef GLX_OPTIMAL_PBUFFER_HEIGHT_SGIX +#define GLX_OPTIMAL_PBUFFER_HEIGHT_SGIX 0x801A +#endif +#ifndef GLX_PRESERVED_CONTENTS_SGIX +#define GLX_PRESERVED_CONTENTS_SGIX 0x801B +#endif +#ifndef GLX_LARGEST_PBUFFER_SGIX +#define GLX_LARGEST_PBUFFER_SGIX 0x801C +#endif +#ifndef GLX_WIDTH_SGIX +#define GLX_WIDTH_SGIX 0x801D +#endif +#ifndef GLX_HEIGHT_SGIX +#define GLX_HEIGHT_SGIX 0x801E +#endif +#ifndef GLX_EVENT_MASK_SGIX +#define GLX_EVENT_MASK_SGIX 0x801F +#endif +#ifndef GLX_DAMAGED_SGIX +#define GLX_DAMAGED_SGIX 0x8020 +#endif +#ifndef GLX_SAVED_SGIX +#define GLX_SAVED_SGIX 0x8021 +#endif +#ifndef GLX_WINDOW_SGIX +#define GLX_WINDOW_SGIX 0x8022 +#endif +#ifndef GLX_PBUFFER_SGIX +#define GLX_PBUFFER_SGIX 0x8023 +#endif +#endif + +#ifndef GLX_SGI_cushion +#endif + +#ifndef GLX_SGIX_video_resize +#define GLX_SYNC_FRAME_SGIX 0x00000000 +#define GLX_SYNC_SWAP_SGIX 0x00000001 +#endif + +#ifndef GLX_SGIX_dmbuffer +#define GLX_DIGITAL_MEDIA_PBUFFER_SGIX 0x8024 +#endif + +#ifndef GLX_SGIX_swap_group +#endif + +#ifndef GLX_SGIX_swap_barrier +#endif + +#ifndef GLX_SGIS_blended_overlay +#define GLX_BLENDED_RGBA_SGIS 0x8025 +#endif + +#ifndef GLX_SGIS_shared_multisample +#define GLX_MULTISAMPLE_SUB_RECT_WIDTH_SGIS 0x8026 +#define GLX_MULTISAMPLE_SUB_RECT_HEIGHT_SGIS 0x8027 +#endif + +#ifndef GLX_SUN_get_transparent_index +#endif + +#ifndef GLX_3DFX_multisample +#define GLX_SAMPLE_BUFFERS_3DFX 0x8050 +#define GLX_SAMPLES_3DFX 0x8051 +#endif + +#ifndef GLX_MESA_copy_sub_buffer +#endif + +#ifndef GLX_MESA_pixmap_colormap +#endif + +#ifndef GLX_MESA_release_buffers +#endif + +#ifndef GLX_MESA_set_3dfx_mode +#define GLX_3DFX_WINDOW_MODE_MESA 0x1 +#define GLX_3DFX_FULLSCREEN_MODE_MESA 0x2 +#endif + + +/*************************************************************/ + +#ifndef GLX_ARB_get_proc_address +typedef void (*__GLXextFuncPtr)(); +#endif + +#ifndef GLX_SGIX_video_source +typedef XID GLXVideoSourceSGIX; +#endif + +#ifndef GLX_SGIX_fbconfig +typedef XID GLXFBConfigIDSGIX; +typedef struct __GLXFBConfigRec *GLXFBConfigSGIX; +#endif + +#ifndef GLX_SGIX_pbuffer +typedef XID GLXPbufferSGIX; +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came for SendEvent request */ + Display *display; /* display the event was read from */ + GLXDrawable drawable; /* i.d. of Drawable */ + int event_type; /* GLX_DAMAGED_SGIX or GLX_SAVED_SGIX */ + int draw_type; /* GLX_WINDOW_SGIX or GLX_PBUFFER_SGIX */ + unsigned int mask; /* mask indicating which buffers are affected*/ + int x, y; + int width, height; + int count; /* if nonzero, at least this many more */ +} GLXBufferClobberEventSGIX; +#endif + +#ifndef GLX_VERSION_1_3 +#define GLX_VERSION_1_3 1 +#ifdef GLX_GLXEXT_PROTOTYPES +extern GLXFBConfig * glXGetFBConfigs (Display *, int, int *); +extern GLXFBConfig * glXChooseFBConfig (Display *, int, const int *, int *); +extern int glXGetFBConfigAttrib (Display *, GLXFBConfig, int, int *); +extern XVisualInfo * glXGetVisualFromFBConfig (Display *, GLXFBConfig); +extern GLXWindow glXCreateWindow (Display *, GLXFBConfig, Window, const int *); +extern void glXDestroyWindow (Display *, GLXWindow); +extern GLXPixmap glXCreatePixmap (Display *, GLXFBConfig, Pixmap, const int *); +extern void glXDestroyPixmap (Display *, GLXPixmap); +extern GLXPbuffer glXCreatePbuffer (Display *, GLXFBConfig, const int *); +extern void glXDestroyPbuffer (Display *, GLXPbuffer); +extern void glXQueryDrawable (Display *, GLXDrawable, int, unsigned int *); +extern GLXContext glXCreateNewContext (Display *, GLXFBConfig, int, GLXContext, Bool); +extern Bool glXMakeContextCurrent (Display *, GLXDrawable, GLXDrawable, GLXContext); +extern GLXDrawable glXGetCurrentReadDrawable (void); +extern Display * glXGetCurrentDisplay (void); +extern int glXQueryContext (Display *, GLXContext, int, int *); +extern void glXSelectEvent (Display *, GLXDrawable, unsigned long); +extern void glXGetSelectedEvent (Display *, GLXDrawable, unsigned long *); +#endif /* GLX_GLXEXT_PROTOTYPES */ +typedef GLXFBConfig * ( * PFNGLXGETFBCONFIGSPROC) (Display *dpy, int screen, int *nelements); +typedef GLXFBConfig * ( * PFNGLXCHOOSEFBCONFIGPROC) (Display *dpy, int screen, const int *attrib_list, int *nelements); +typedef int ( * PFNGLXGETFBCONFIGATTRIBPROC) (Display *dpy, GLXFBConfig config, int attribute, int *value); +typedef XVisualInfo * ( * PFNGLXGETVISUALFROMFBCONFIGPROC) (Display *dpy, GLXFBConfig config); +typedef GLXWindow ( * PFNGLXCREATEWINDOWPROC) (Display *dpy, GLXFBConfig config, Window win, const int *attrib_list); +typedef void ( * PFNGLXDESTROYWINDOWPROC) (Display *dpy, GLXWindow win); +typedef GLXPixmap ( * PFNGLXCREATEPIXMAPPROC) (Display *dpy, GLXFBConfig config, Pixmap pixmap, const int *attrib_list); +typedef void ( * PFNGLXDESTROYPIXMAPPROC) (Display *dpy, GLXPixmap pixmap); +typedef GLXPbuffer ( * PFNGLXCREATEPBUFFERPROC) (Display *dpy, GLXFBConfig config, const int *attrib_list); +typedef void ( * PFNGLXDESTROYPBUFFERPROC) (Display *dpy, GLXPbuffer pbuf); +typedef void ( * PFNGLXQUERYDRAWABLEPROC) (Display *dpy, GLXDrawable draw, int attribute, unsigned int *value); +typedef GLXContext ( * PFNGLXCREATENEWCONTEXTPROC) (Display *dpy, GLXFBConfig config, int render_type, GLXContext share_list, Bool direct); +typedef Bool ( * PFNGLXMAKECONTEXTCURRENTPROC) (Display *dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx); +typedef GLXDrawable ( * PFNGLXGETCURRENTREADDRAWABLEPROC) (void); +typedef Display * ( * PFNGLXGETCURRENTDISPLAYPROC) (void); +typedef int ( * PFNGLXQUERYCONTEXTPROC) (Display *dpy, GLXContext ctx, int attribute, int *value); +typedef void ( * PFNGLXSELECTEVENTPROC) (Display *dpy, GLXDrawable draw, unsigned long event_mask); +typedef void ( * PFNGLXGETSELECTEDEVENTPROC) (Display *dpy, GLXDrawable draw, unsigned long *event_mask); +#endif + +#ifndef GLX_ARB_get_proc_address +#define GLX_ARB_get_proc_address 1 +#ifdef GLX_GLXEXT_PROTOTYPES +extern __GLXextFuncPtr glXGetProcAddressARB (const GLubyte *); +#endif /* GLX_GLXEXT_PROTOTYPES */ +typedef __GLXextFuncPtr ( * PFNGLXGETPROCADDRESSARBPROC) (const GLubyte *procName); +#endif + +#ifndef GLX_SGIS_multisample +#define GLX_SGIS_multisample 1 +#endif + +#ifndef GLX_EXT_visual_info +#define GLX_EXT_visual_info 1 +#endif + +#ifndef GLX_NV_vertex_array_range +#define GLX_NV_vertex_array_range +#ifdef GLX_GLXEXT_PROTOTYPES +extern void *glXAllocateMemoryNV (GLsizei, GLfloat, GLfloat, GLfloat); +extern void glXFreeMemoryNV (void *); +#endif +typedef void * ( * PFNGLXALLOCATEMEMORYNVPROC) (GLsizei, GLfloat, GLfloat, GLfloat); +typedef void ( * PFNGLXFREEMEMORYNVPROC) (void *); +#endif + +#ifndef GLX_SGI_swap_control +#define GLX_SGI_swap_control 1 +#ifdef GLX_GLXEXT_PROTOTYPES +extern int glXSwapIntervalSGI (int); +#endif /* GLX_GLXEXT_PROTOTYPES */ +typedef int ( * PFNGLXSWAPINTERVALSGIPROC) (int interval); +#endif + +#ifndef GLX_SGI_video_sync +#define GLX_SGI_video_sync 1 +#ifdef GLX_GLXEXT_PROTOTYPES +extern int glXGetVideoSyncSGI (unsigned int *); +extern int glXWaitVideoSyncSGI (int, int, unsigned int *); +#endif /* GLX_GLXEXT_PROTOTYPES */ +typedef int ( * PFNGLXGETVIDEOSYNCSGIPROC) (unsigned int *count); +typedef int ( * PFNGLXWAITVIDEOSYNCSGIPROC) (int divisor, int remainder, unsigned int *count); +#endif + +#ifndef GLX_SGI_make_current_read +#define GLX_SGI_make_current_read 1 +#ifdef GLX_GLXEXT_PROTOTYPES +extern Bool glXMakeCurrentReadSGI (Display *, GLXDrawable, GLXDrawable, GLXContext); +extern GLXDrawable glXGetCurrentReadDrawableSGI (void); +#endif /* GLX_GLXEXT_PROTOTYPES */ +typedef Bool ( * PFNGLXMAKECURRENTREADSGIPROC) (Display *dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx); +typedef GLXDrawable ( * PFNGLXGETCURRENTREADDRAWABLESGIPROC) (void); +#endif + +#ifdef _VL_H +#ifndef GLX_SGIX_video_source +#define GLX_SGIX_video_source 1 +#ifdef GLX_GLXEXT_PROTOTYPES +extern GLXVideoSourceSGIX glXCreateGLXVideoSourceSGIX (Display *, int, VLServer, VLPath, int, VLNode); +extern void glXDestroyGLXVideoSourceSGIX (Display *, GLXVideoSourceSGIX); +#endif /* GLX_GLXEXT_PROTOTYPES */ +typedef GLXVideoSourceSGIX ( * PFNGLXCREATEGLXVIDEOSOURCESGIXPROC) (Display *display, int screen, VLServer server, VLPath path, int nodeClass, VLNode drainNode); +typedef void ( * PFNGLXDESTROYGLXVIDEOSOURCESGIXPROC) (Display *dpy, GLXVideoSourceSGIX glxvideosource); +#endif + +#endif /* _VL_H */ +#ifndef GLX_EXT_visual_rating +#define GLX_EXT_visual_rating 1 +#endif + +#ifndef GLX_EXT_import_context +#define GLX_EXT_import_context 1 +#ifdef GLX_GLXEXT_PROTOTYPES +extern Display * glXGetCurrentDisplayEXT (void); +extern int glXQueryContextInfoEXT (Display *, GLXContext, int, int *); +extern GLXContextID glXGetContextIDEXT (GLXContext); +extern GLXContext glXImportContextEXT (Display *, GLXContextID); +extern void glXFreeContextEXT (Display *, GLXContext); +#endif /* GLX_GLXEXT_PROTOTYPES */ +typedef Display * ( * PFNGLXGETCURRENTDISPLAYEXTPROC) (void); +typedef int ( * PFNGLXQUERYCONTEXTINFOEXTPROC) (Display *dpy, GLXContext context, int attribute, int *value); +typedef GLXContextID ( * PFNGLXGETCONTEXTIDEXTPROC) (GLXContext context); +typedef GLXContext ( * PFNGLXIMPORTCONTEXTEXTPROC) (Display *dpy, GLXContextID contextID); +typedef void ( * PFNGLXFREECONTEXTEXTPROC) (Display *dpy, GLXContext context); +#endif + +#ifndef GLX_SGIX_fbconfig +#define GLX_SGIX_fbconfig 1 +#ifdef GLX_GLXEXT_PROTOTYPES +extern int glXGetFBConfigAttribSGIX (Display *, GLXFBConfigSGIX, int, int *); +extern GLXFBConfigSGIX * glXChooseFBConfigSGIX (Display *, int, int *, int *); +extern GLXPixmap glXCreateGLXPixmapWithConfigSGIX (Display *, GLXFBConfigSGIX, Pixmap); +extern GLXContext glXCreateContextWithConfigSGIX (Display *, GLXFBConfigSGIX, int, GLXContext, Bool); +extern XVisualInfo * glXGetVisualFromFBConfigSGIX (Display *, GLXFBConfigSGIX); +extern GLXFBConfigSGIX glXGetFBConfigFromVisualSGIX (Display *, XVisualInfo *); +#endif /* GLX_GLXEXT_PROTOTYPES */ +typedef int ( * PFNGLXGETFBCONFIGATTRIBSGIXPROC) (Display *dpy, GLXFBConfigSGIX config, int attribute, int *value); +typedef GLXFBConfigSGIX * ( * PFNGLXCHOOSEFBCONFIGSGIXPROC) (Display *dpy, int screen, int *attrib_list, int *nelements); +typedef GLXPixmap ( * PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC) (Display *dpy, GLXFBConfigSGIX config, Pixmap pixmap); +typedef GLXContext ( * PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC) (Display *dpy, GLXFBConfigSGIX config, int render_type, GLXContext share_list, Bool direct); +typedef XVisualInfo * ( * PFNGLXGETVISUALFROMFBCONFIGSGIXPROC) (Display *dpy, GLXFBConfigSGIX config); +typedef GLXFBConfigSGIX ( * PFNGLXGETFBCONFIGFROMVISUALSGIXPROC) (Display *dpy, XVisualInfo *vis); +#endif + +#ifndef GLX_SGIX_pbuffer +#define GLX_SGIX_pbuffer 1 +#ifdef GLX_GLXEXT_PROTOTYPES +extern GLXPbufferSGIX glXCreateGLXPbufferSGIX (Display *, GLXFBConfigSGIX, unsigned int, unsigned int, int *); +extern void glXDestroyGLXPbufferSGIX (Display *, GLXPbufferSGIX); +extern int glXQueryGLXPbufferSGIX (Display *, GLXPbufferSGIX, int, unsigned int *); +extern void glXSelectEventSGIX (Display *, GLXDrawable, unsigned long); +extern void glXGetSelectedEventSGIX (Display *, GLXDrawable, unsigned long *); +#endif /* GLX_GLXEXT_PROTOTYPES */ +typedef GLXPbufferSGIX ( * PFNGLXCREATEGLXPBUFFERSGIXPROC) (Display *dpy, GLXFBConfigSGIX config, unsigned int width, unsigned int height, int *attrib_list); +typedef void ( * PFNGLXDESTROYGLXPBUFFERSGIXPROC) (Display *dpy, GLXPbufferSGIX pbuf); +typedef int ( * PFNGLXQUERYGLXPBUFFERSGIXPROC) (Display *dpy, GLXPbufferSGIX pbuf, int attribute, unsigned int *value); +typedef void ( * PFNGLXSELECTEVENTSGIXPROC) (Display *dpy, GLXDrawable drawable, unsigned long mask); +typedef void ( * PFNGLXGETSELECTEDEVENTSGIXPROC) (Display *dpy, GLXDrawable drawable, unsigned long *mask); +#endif + +#ifndef GLX_NV_float_buffer +#define GLX_NV_float_buffer 1 +#endif + +#ifndef GLX_SGI_cushion +#define GLX_SGI_cushion 1 +#ifdef GLX_GLXEXT_PROTOTYPES +extern void glXCushionSGI (Display *, Window, float); +#endif /* GLX_GLXEXT_PROTOTYPES */ +typedef void ( * PFNGLXCUSHIONSGIPROC) (Display *dpy, Window window, float cushion); +#endif + +#ifndef GLX_SGIX_video_resize +#define GLX_SGIX_video_resize 1 +#ifdef GLX_GLXEXT_PROTOTYPES +extern int glXBindChannelToWindowSGIX (Display *, int, int, Window); +extern int glXChannelRectSGIX (Display *, int, int, int, int, int, int); +extern int glXQueryChannelRectSGIX (Display *, int, int, int *, int *, int *, int *); +extern int glXQueryChannelDeltasSGIX (Display *, int, int, int *, int *, int *, int *); +extern int glXChannelRectSyncSGIX (Display *, int, int, GLenum); +#endif /* GLX_GLXEXT_PROTOTYPES */ +typedef int ( * PFNGLXBINDCHANNELTOWINDOWSGIXPROC) (Display *display, int screen, int channel, Window window); +typedef int ( * PFNGLXCHANNELRECTSGIXPROC) (Display *display, int screen, int channel, int x, int y, int w, int h); +typedef int ( * PFNGLXQUERYCHANNELRECTSGIXPROC) (Display *display, int screen, int channel, int *dx, int *dy, int *dw, int *dh); +typedef int ( * PFNGLXQUERYCHANNELDELTASSGIXPROC) (Display *display, int screen, int channel, int *x, int *y, int *w, int *h); +typedef int ( * PFNGLXCHANNELRECTSYNCSGIXPROC) (Display *display, int screen, int channel, GLenum synctype); +#endif + +#ifdef _DM_BUFFER_H_ +#ifndef GLX_SGIX_dmbuffer +#define GLX_SGIX_dmbuffer 1 +#ifdef GLX_GLXEXT_PROTOTYPES +extern Bool glXAssociateDMPbufferSGIX (Display *, GLXPbufferSGIX, DMparams *, DMbuffer); +#endif /* GLX_GLXEXT_PROTOTYPES */ +typedef Bool ( * PFNGLXASSOCIATEDMPBUFFERSGIXPROC) (Display *dpy, GLXPbufferSGIX pbuffer, DMparams *params, DMbuffer dmbuffer); +#endif + +#endif /* _DM_BUFFER_H_ */ +#ifndef GLX_SGIX_swap_group +#define GLX_SGIX_swap_group 1 +#ifdef GLX_GLXEXT_PROTOTYPES +extern void glXJoinSwapGroupSGIX (Display *, GLXDrawable, GLXDrawable); +#endif /* GLX_GLXEXT_PROTOTYPES */ +typedef void ( * PFNGLXJOINSWAPGROUPSGIXPROC) (Display *dpy, GLXDrawable drawable, GLXDrawable member); +#endif + +#ifndef GLX_SGIX_swap_barrier +#define GLX_SGIX_swap_barrier 1 +#ifdef GLX_GLXEXT_PROTOTYPES +extern void glXBindSwapBarrierSGIX (Display *, GLXDrawable, int); +extern Bool glXQueryMaxSwapBarriersSGIX (Display *, int, int *); +#endif /* GLX_GLXEXT_PROTOTYPES */ +typedef void ( * PFNGLXBINDSWAPBARRIERSGIXPROC) (Display *dpy, GLXDrawable drawable, int barrier); +typedef Bool ( * PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC) (Display *dpy, int screen, int *max); +#endif + +#ifndef GLX_SUN_get_transparent_index +#define GLX_SUN_get_transparent_index 1 +#ifdef GLX_GLXEXT_PROTOTYPES +extern Status glXGetTransparentIndexSUN (Display *, Window, Window, long *); +#endif /* GLX_GLXEXT_PROTOTYPES */ +typedef Status ( * PFNGLXGETTRANSPARENTINDEXSUNPROC) (Display *dpy, Window overlay, Window underlay, long *pTransparentIndex); +#endif + +#ifndef GLX_MESA_copy_sub_buffer +#define GLX_MESA_copy_sub_buffer 1 +#ifdef GLX_GLXEXT_PROTOTYPES +extern void glXCopySubBufferMESA (Display *, GLXDrawable, int, int, int, int); +#endif /* GLX_GLXEXT_PROTOTYPES */ +typedef void ( * PFNGLXCOPYSUBBUFFERMESAPROC) (Display *dpy, GLXDrawable drawable, int x, int y, int width, int height); +#endif + +#ifndef GLX_MESA_pixmap_colormap +#define GLX_MESA_pixmap_colormap 1 +#ifdef GLX_GLXEXT_PROTOTYPES +extern GLXPixmap glXCreateGLXPixmapMESA (Display *, XVisualInfo *, Pixmap, Colormap); +#endif /* GLX_GLXEXT_PROTOTYPES */ +typedef GLXPixmap ( * PFNGLXCREATEGLXPIXMAPMESAPROC) (Display *dpy, XVisualInfo *visual, Pixmap pixmap, Colormap cmap); +#endif + +#ifndef GLX_MESA_release_buffers +#define GLX_MESA_release_buffers 1 +#ifdef GLX_GLXEXT_PROTOTYPES +extern Bool glXReleaseBuffersMESA (Display *, GLXDrawable); +#endif /* GLX_GLXEXT_PROTOTYPES */ +typedef Bool ( * PFNGLXRELEASEBUFFERSMESAPROC) (Display *dpy, GLXDrawable drawable); +#endif + +#ifndef GLX_MESA_set_3dfx_mode +#define GLX_MESA_set_3dfx_mode 1 +#ifdef GLX_GLXEXT_PROTOTYPES +extern Bool glXSet3DfxModeMESA (int); +#endif /* GLX_GLXEXT_PROTOTYPES */ +typedef Bool ( * PFNGLXSET3DFXMODEMESAPROC) (int mode); +#endif + + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Windows/GL/glxtokens.h b/Source/Plugins/Plugin_VideoOGL/Src/Windows/GL/glxtokens.h new file mode 100644 index 0000000000..2858d837dd --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/Windows/GL/glxtokens.h @@ -0,0 +1,252 @@ +#ifndef __glxtokens_h__ +#define __glxtokens_h__ + +/* +** The contents of this file are subject to the GLX Public License Version 1.0 +** (the "License"). You may not use this file except in compliance with the +** License. You may obtain a copy of the License at Silicon Graphics, Inc., +** attn: Legal Services, 2011 N. Shoreline Blvd., Mountain View, CA 94043 +** or at http://www.sgi.com/software/opensource/glx/license.html. +** +** Software distributed under the License is distributed on an "AS IS" +** basis. ALL WARRANTIES ARE DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY +** IMPLIED WARRANTIES OF MERCHANTABILITY, OF FITNESS FOR A PARTICULAR +** PURPOSE OR OF NON- INFRINGEMENT. See the License for the specific +** language governing rights and limitations under the License. +** +** The Original Software is GLX version 1.2 source code, released February, +** 1999. The developer of the Original Software is Silicon Graphics, Inc. +** Those portions of the Subject Software created by Silicon Graphics, Inc. +** are Copyright (c) 1991-9 Silicon Graphics, Inc. All Rights Reserved. +** +** $Header: /teleimm/telev/inc/GL/glxtokens.h,v 1.1 2006/01/05 03:28:50 zerocool Exp $ +*/ + +#ifdef __cplusplus +extern "C" { +#endif + +#define GLX_VERSION_1_1 1 +#define GLX_VERSION_1_2 1 + +/* + * Names for attributes to glXGetConfig. + */ +#define GLX_USE_GL 1 /* support GLX rendering */ +#define GLX_BUFFER_SIZE 2 /* depth of the color buffer */ +#define GLX_LEVEL 3 /* level in plane stacking */ +#define GLX_RGBA 4 /* true if RGBA mode */ +#define GLX_DOUBLEBUFFER 5 /* double buffering supported */ +#define GLX_STEREO 6 /* stereo buffering supported */ +#define GLX_AUX_BUFFERS 7 /* number of aux buffers */ +#define GLX_RED_SIZE 8 /* number of red component bits */ +#define GLX_GREEN_SIZE 9 /* number of green component bits */ +#define GLX_BLUE_SIZE 10 /* number of blue component bits */ +#define GLX_ALPHA_SIZE 11 /* number of alpha component bits */ +#define GLX_DEPTH_SIZE 12 /* number of depth bits */ +#define GLX_STENCIL_SIZE 13 /* number of stencil bits */ +#define GLX_ACCUM_RED_SIZE 14 /* number of red accum bits */ +#define GLX_ACCUM_GREEN_SIZE 15 /* number of green accum bits */ +#define GLX_ACCUM_BLUE_SIZE 16 /* number of blue accum bits */ +#define GLX_ACCUM_ALPHA_SIZE 17 /* number of alpha accum bits */ + +#define GLX_SAMPLE_BUFFERS_ARB 100000 /* number of multisample buffers */ +#define GLX_SAMPLES_ARB 100001 /* number of multisample samples */ + +/* + * FBConfig-specific attributes + */ +#define GLX_X_VISUAL_TYPE 0x22 +#define GLX_CONFIG_CAVEAT 0x20 /* Like visual_info VISUAL_CAVEAT */ +#define GLX_TRANSPARENT_TYPE 0x23 +#define GLX_TRANSPARENT_INDEX_VALUE 0x24 +#define GLX_TRANSPARENT_RED_VALUE 0x25 +#define GLX_TRANSPARENT_GREEN_VALUE 0x26 +#define GLX_TRANSPARENT_BLUE_VALUE 0x27 +#define GLX_TRANSPARENT_ALPHA_VALUE 0x28 +#define GLX_DRAWABLE_TYPE 0x8010 +#define GLX_RENDER_TYPE 0x8011 +#define GLX_X_RENDERABLE 0x8012 +#define GLX_FBCONFIG_ID 0x8013 +#define GLX_MAX_PBUFFER_WIDTH 0x8016 +#define GLX_MAX_PBUFFER_HEIGHT 0x8017 +#define GLX_MAX_PBUFFER_PIXELS 0x8018 +#define GLX_VISUAL_ID 0x800B + +#define GLX_DRAWABLE_TYPE_SGIX GLX_DRAWABLE_TYPE +#define GLX_RENDER_TYPE_SGIX GLX_RENDER_TYPE +#define GLX_X_RENDERABLE_SGIX GLX_X_RENDERABLE +#define GLX_FBCONFIG_ID_SGIX GLX_FBCONFIG_ID +#define GLX_MAX_PBUFFER_WIDTH_SGIX GLX_MAX_PBUFFER_WIDTH +#define GLX_MAX_PBUFFER_HEIGHT_SGIX GLX_MAX_PBUFFER_HEIGHT +#define GLX_MAX_PBUFFER_PIXELS_SGIX GLX_MAX_PBUFFER_PIXELS +#define GLX_OPTIMAL_PBUFFER_WIDTH_SGIX 0x8019 +#define GLX_OPTIMAL_PBUFFER_HEIGHT_SGIX 0x801A + +/* + * Error return values from glXGetConfig. Success is indicated by + * a value of 0. + */ +#define GLX_BAD_SCREEN 1 /* screen # is bad */ +#define GLX_BAD_ATTRIBUTE 2 /* attribute to get is bad */ +#define GLX_NO_EXTENSION 3 /* no glx extension on server */ +#define GLX_BAD_VISUAL 4 /* visual # not known by GLX */ +#define GLX_BAD_CONTEXT 5 +#define GLX_BAD_VALUE 6 +#define GLX_BAD_ENUM 7 + + +/* FBConfig attribute values */ + +/* + * Generic "don't care" value for glX ChooseFBConfig attributes (except + * GLX_LEVEL). + */ +#define GLX_DONT_CARE 0xFFFFFFFF + +/* GLX_RENDER_TYPE bits */ +#define GLX_RGBA_BIT 0x00000001 +#define GLX_COLOR_INDEX_BIT 0x00000002 +#define GLX_RGBA_BIT_SGIX GLX_RGBA_BIT +#define GLX_COLOR_INDEX_BIT_SGIX GLX_COLOR_INDEX_BIT + +/* GLX_DRAWABLE_TYPE bits */ +#define GLX_WINDOW_BIT 0x00000001 +#define GLX_PIXMAP_BIT 0x00000002 +#define GLX_PBUFFER_BIT 0x00000004 +#define GLX_WINDOW_BIT_SGIX GLX_WINDOW_BIT +#define GLX_PIXMAP_BIT_SGIX GLX_PIXMAP_BIT +#define GLX_PBUFFER_BIT_SGIX GLX_PBUFFER_BIT + +/* GLX_CONFIG_CAVEAT attribute values */ +#define GLX_NONE 0x8000 +#define GLX_SLOW_CONFIG 0x8001 +#define GLX_NON_CONFORMANT_CONFIG 0x800D + +/* GLX_X_VISUAL_TYPE attribute values */ +#define GLX_TRUE_COLOR 0x8002 +#define GLX_DIRECT_COLOR 0x8003 +#define GLX_PSEUDO_COLOR 0x8004 +#define GLX_STATIC_COLOR 0x8005 +#define GLX_GRAY_SCALE 0x8006 +#define GLX_STATIC_GRAY 0x8007 + +/* GLX_TRANSPARENT_TYPE attribute values */ +/* #define GLX_NONE 0x8000 */ +#define GLX_TRANSPARENT_RGB 0x8008 +#define GLX_TRANSPARENT_INDEX 0x8009 + +/* glXCreateGLXPbuffer attributes */ +#define GLX_PRESERVED_CONTENTS 0x801B +#define GLX_LARGEST_PBUFFER 0x801C +#define GLX_PBUFFER_HEIGHT 0x8040 /* New for GLX 1.3 */ +#define GLX_PBUFFER_WIDTH 0x8041 /* New for GLX 1.3 */ +#define GLX_PRESERVED_CONTENTS_SGIX GLX_PRESERVED_CONTENTS +#define GLX_LARGEST_PBUFFER_SGIX GLX_LARGEST_PBUFFER + +/* glXQueryGLXPBuffer attributes */ +#define GLX_WIDTH 0x801D +#define GLX_HEIGHT 0x801E +#define GLX_EVENT_MASK 0x801F +#define GLX_WIDTH_SGIX GLX_WIDTH +#define GLX_HEIGHT_SGIX GLX_HEIGHT +#define GLX_EVENT_MASK_SGIX GLX_EVENT_MASK + +/* glXCreateNewContext render_type attribute values */ +#define GLX_RGBA_TYPE 0x8014 +#define GLX_COLOR_INDEX_TYPE 0x8015 +#define GLX_RGBA_TYPE_SGIX GLX_RGBA_TYPE +#define GLX_COLOR_INDEX_TYPE_SGIX GLX_COLOR_INDEX_TYPE + +/* glXQueryContext attributes */ +/* #define GLX_FBCONFIG_ID 0x8013 */ +/* #define GLX_RENDER_TYPE 0x8011 */ +#define GLX_SCREEN 0x800C + +/* glXSelectEvent event mask bits */ +#define GLX_PBUFFER_CLOBBER_MASK 0x08000000 +#define GLX_PBUFFER_CLOBBER_MASK_SGIX GLX_PBUFFER_CLOBBER_MASK + +/* GLXPbufferClobberEvent event_type values */ +#define GLX_DAMAGED 0x8020 +#define GLX_SAVED 0x8021 +#define GLX_DAMAGED_SGIX GLX_DAMAGED +#define GLX_SAVED_SGIX GLX_SAVED + +/* GLXPbufferClobberEvent draw_type values */ +#define GLX_WINDOW 0x8022 +#define GLX_PBUFFER 0x8023 +#define GLX_WINDOW_SGIX GLX_WINDOW +#define GLX_PBUFFER_SGIX GLX_PBUFFER + +/* GLXPbufferClobberEvent buffer_mask bits */ +#define GLX_FRONT_LEFT_BUFFER_BIT 0x00000001 +#define GLX_FRONT_RIGHT_BUFFER_BIT 0x00000002 +#define GLX_BACK_LEFT_BUFFER_BIT 0x00000004 +#define GLX_BACK_RIGHT_BUFFER_BIT 0x00000008 +#define GLX_AUX_BUFFERS_BIT 0x00000010 +#define GLX_DEPTH_BUFFER_BIT 0x00000020 +#define GLX_STENCIL_BUFFER_BIT 0x00000040 +#define GLX_ACCUM_BUFFER_BIT 0x00000080 +#define GLX_FRONT_LEFT_BUFFER_BIT_SGIX GLX_FRONT_LEFT_BUFFER_BIT +#define GLX_FRONT_RIGHT_BUFFER_BIT_SGIX GLX_FRONT_RIGHT_BUFFER_BIT +#define GLX_BACK_LEFT_BUFFER_BIT_SGIX GLX_BACK_LEFT_BUFFER_BIT +#define GLX_BACK_RIGHT_BUFFER_BIT_SGIX GLX_BACK_RIGHT_BUFFER_BIT +#define GLX_AUX_BUFFERS_BIT_SGIX GLX_AUX_BUFFERS_BIT +#define GLX_DEPTH_BUFFER_BIT_SGIX GLX_DEPTH_BUFFER_BIT +#define GLX_STENCIL_BUFFER_BIT_SGIX GLX_STENCIL_BUFFER_BIT +#define GLX_ACCUM_BUFFER_BIT_SGIX GLX_ACCUM_BUFFER_BIT + +/* + * Extension return values from glXGetConfig. These are also + * accepted as parameter values for glXChooseVisual. + */ + +#define GLX_X_VISUAL_TYPE_EXT 0x22 /* visual_info extension type */ +#define GLX_TRANSPARENT_TYPE_EXT 0x23 /* visual_info extension */ +#define GLX_TRANSPARENT_INDEX_VALUE_EXT 0x24 /* visual_info extension */ +#define GLX_TRANSPARENT_RED_VALUE_EXT 0x25 /* visual_info extension */ +#define GLX_TRANSPARENT_GREEN_VALUE_EXT 0x26 /* visual_info extension */ +#define GLX_TRANSPARENT_BLUE_VALUE_EXT 0x27 /* visual_info extension */ +#define GLX_TRANSPARENT_ALPHA_VALUE_EXT 0x28 /* visual_info extension */ + +/* Property values for visual_type */ +#define GLX_TRUE_COLOR_EXT 0x8002 +#define GLX_DIRECT_COLOR_EXT 0x8003 +#define GLX_PSEUDO_COLOR_EXT 0x8004 +#define GLX_STATIC_COLOR_EXT 0x8005 +#define GLX_GRAY_SCALE_EXT 0x8006 +#define GLX_STATIC_GRAY_EXT 0x8007 + +/* Property values for transparent pixel */ +#define GLX_NONE_EXT 0x8000 +#define GLX_TRANSPARENT_RGB_EXT 0x8008 +#define GLX_TRANSPARENT_INDEX_EXT 0x8009 + +/* Property values for visual_rating */ +#define GLX_VISUAL_CAVEAT_EXT 0x20 /* visual_rating extension type */ +#define GLX_SLOW_VISUAL_EXT 0x8001 +#define GLX_NON_CONFORMANT_VISUAL_EXT 0x800D + +/* + * Names for attributes to glXGetClientString. + */ +#define GLX_VENDOR 0x1 +#define GLX_VERSION 0x2 +#define GLX_EXTENSIONS 0x3 + +/* + * Names for attributes to glXQueryContextInfoEXT. + */ +#define GLX_SHARE_CONTEXT_EXT 0x800A /* id of share context */ +#define GLX_VISUAL_ID_EXT 0x800B /* id of context's visual */ +#define GLX_SCREEN_EXT 0x800C /* screen number */ + +/* NV_float_buffer */ +#define GLX_FLOAT_COMPONENTS_NV 0x20B0 + +#ifdef __cplusplus +} +#endif + +#endif /* !__glxtokens_h__ */ diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Windows/GL/tube.h b/Source/Plugins/Plugin_VideoOGL/Src/Windows/GL/tube.h new file mode 100644 index 0000000000..5ea54142b8 --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/Windows/GL/tube.h @@ -0,0 +1,205 @@ +/* + * tube.h + * + * FUNCTION: + * Tubing and Extrusion header file. + * This file provides protypes and defines for the extrusion + * and tubing primitives. + * + * HISTORY: + * Linas Vepstas 1990, 1991 + */ + +#ifndef __TUBE_H__ +#define __TUBE_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + GLE API revision history: + + GLE_API_VERSION is updated to reflect GLE API changes (interface + changes, semantic changes, deletions, or additions). + + GLE_API_VERSION=228 GLUT 3.7 release of GLE. +**/ +#ifndef GLE_API_VERSION /* allow this to be overriden */ +#define GLE_API_VERSION 228 +#endif + +#ifdef _WIN32 +#define OPENGL_10 +#endif + +/* some types */ +#define gleDouble double +typedef gleDouble gleAffine[2][3]; + +/* ====================================================== */ + +/* defines for tubing join styles */ +#define TUBE_JN_RAW 0x1 +#define TUBE_JN_ANGLE 0x2 +#define TUBE_JN_CUT 0x3 +#define TUBE_JN_ROUND 0x4 +#define TUBE_JN_MASK 0xf /* mask bits */ +#define TUBE_JN_CAP 0x10 + +/* determine how normal vectors are to be handled */ +#define TUBE_NORM_FACET 0x100 +#define TUBE_NORM_EDGE 0x200 +#define TUBE_NORM_PATH_EDGE 0x400 /* for spiral, lathe, helix primitives */ +#define TUBE_NORM_MASK 0xf00 /* mask bits */ + +/* closed or open countours */ +#define TUBE_CONTOUR_CLOSED 0x1000 + +#define GLE_TEXTURE_ENABLE 0x10000 +#define GLE_TEXTURE_STYLE_MASK 0xff +#define GLE_TEXTURE_VERTEX_FLAT 1 +#define GLE_TEXTURE_NORMAL_FLAT 2 +#define GLE_TEXTURE_VERTEX_CYL 3 +#define GLE_TEXTURE_NORMAL_CYL 4 +#define GLE_TEXTURE_VERTEX_SPH 5 +#define GLE_TEXTURE_NORMAL_SPH 6 +#define GLE_TEXTURE_VERTEX_MODEL_FLAT 7 +#define GLE_TEXTURE_NORMAL_MODEL_FLAT 8 +#define GLE_TEXTURE_VERTEX_MODEL_CYL 9 +#define GLE_TEXTURE_NORMAL_MODEL_CYL 10 +#define GLE_TEXTURE_VERTEX_MODEL_SPH 11 +#define GLE_TEXTURE_NORMAL_MODEL_SPH 12 + +#ifdef GL_32 +/* HACK for GL 3.2 -- needed because no way to tell if lighting is on. */ +#define TUBE_LIGHTING_ON 0x80000000 + +#define gleExtrusion extrusion +#define gleSetJoinStyle setjoinstyle +#define gleGetJoinStyle getjoinstyle +#define glePolyCone polycone +#define glePolyCylinder polycylinder +#define gleSuperExtrusion super_extrusion +#define gleTwistExtrusion twist_extrusion +#define gleSpiral spiral +#define gleLathe lathe +#define gleHelicoid helicoid +#define gleToroid toroid +#define gleScrew screw + +#endif /* GL_32 */ + +extern int gleGetJoinStyle (void); +extern void gleSetJoinStyle (int style); /* bitwise OR of flags */ +extern int gleGetNumSlices(void); +extern void gleSetNumSlices(int slices); + +/* draw polyclinder, specified as a polyline */ +extern void glePolyCylinder (int npoints, /* num points in polyline */ + gleDouble point_array[][3], /* polyline vertces */ + float color_array[][3], /* colors at polyline verts */ + gleDouble radius); /* radius of polycylinder */ + +/* draw polycone, specified as a polyline with radii */ +extern void glePolyCone (int npoints, /* numpoints in poly-line */ + gleDouble point_array[][3], /* polyline vertices */ + float color_array[][3], /* colors at polyline verts */ + gleDouble radius_array[]); /* cone radii at polyline verts */ + +/* extrude arbitrary 2D contour along arbitrary 3D path */ +extern void gleExtrusion (int ncp, /* number of contour points */ + gleDouble contour[][2], /* 2D contour */ + gleDouble cont_normal[][2], /* 2D contour normals */ + gleDouble up[3], /* up vector for contour */ + int npoints, /* numpoints in poly-line */ + gleDouble point_array[][3], /* polyline vertices */ + float color_array[][3]); /* colors at polyline verts */ + +/* extrude 2D contour, specifying local rotations (twists) */ +extern void gleTwistExtrusion (int ncp, /* number of contour points */ + gleDouble contour[][2], /* 2D contour */ + gleDouble cont_normal[][2], /* 2D contour normals */ + gleDouble up[3], /* up vector for contour */ + int npoints, /* numpoints in poly-line */ + gleDouble point_array[][3], /* polyline vertices */ + float color_array[][3], /* color at polyline verts */ + gleDouble twist_array[]); /* countour twists (in degrees) */ + +/* extrude 2D contour, specifying local affine tranformations */ +extern void gleSuperExtrusion (int ncp, /* number of contour points */ + gleDouble contour[][2], /* 2D contour */ + gleDouble cont_normal[][2], /* 2D contour normals */ + gleDouble up[3], /* up vector for contour */ + int npoints, /* numpoints in poly-line */ + gleDouble point_array[][3], /* polyline vertices */ + float color_array[][3], /* color at polyline verts */ + gleDouble xform_array[][2][3]); /* 2D contour xforms */ + +/* spiral moves contour along helical path by parallel transport */ +extern void gleSpiral (int ncp, /* number of contour points */ + gleDouble contour[][2], /* 2D contour */ + gleDouble cont_normal[][2], /* 2D contour normals */ + gleDouble up[3], /* up vector for contour */ + gleDouble startRadius, /* spiral starts in x-y plane */ + gleDouble drdTheta, /* change in radius per revolution */ + gleDouble startZ, /* starting z value */ + gleDouble dzdTheta, /* change in Z per revolution */ + gleDouble startXform[2][3], /* starting contour affine xform */ + gleDouble dXformdTheta[2][3], /* tangent change xform per revoln */ + gleDouble startTheta, /* start angle in x-y plane */ + gleDouble sweepTheta); /* degrees to spiral around */ + +/* lathe moves contour along helical path by helically shearing 3D space */ +extern void gleLathe (int ncp, /* number of contour points */ + gleDouble contour[][2], /* 2D contour */ + gleDouble cont_normal[][2], /* 2D contour normals */ + gleDouble up[3], /* up vector for contour */ + gleDouble startRadius, /* spiral starts in x-y plane */ + gleDouble drdTheta, /* change in radius per revolution */ + gleDouble startZ, /* starting z value */ + gleDouble dzdTheta, /* change in Z per revolution */ + gleDouble startXform[2][3], /* starting contour affine xform */ + gleDouble dXformdTheta[2][3], /* tangent change xform per revoln */ + gleDouble startTheta, /* start angle in x-y plane */ + gleDouble sweepTheta); /* degrees to spiral around */ + +/* similar to spiral, except contour is a circle */ +extern void gleHelicoid (gleDouble rToroid, /* circle contour (torus) radius */ + gleDouble startRadius, /* spiral starts in x-y plane */ + gleDouble drdTheta, /* change in radius per revolution */ + gleDouble startZ, /* starting z value */ + gleDouble dzdTheta, /* change in Z per revolution */ + gleDouble startXform[2][3], /* starting contour affine xform */ + gleDouble dXformdTheta[2][3], /* tangent change xform per revoln */ + gleDouble startTheta, /* start angle in x-y plane */ + gleDouble sweepTheta); /* degrees to spiral around */ + +/* similar to lathe, except contour is a circle */ +extern void gleToroid (gleDouble rToroid, /* circle contour (torus) radius */ + gleDouble startRadius, /* spiral starts in x-y plane */ + gleDouble drdTheta, /* change in radius per revolution */ + gleDouble startZ, /* starting z value */ + gleDouble dzdTheta, /* change in Z per revolution */ + gleDouble startXform[2][3], /* starting contour affine xform */ + gleDouble dXformdTheta[2][3], /* tangent change xform per revoln */ + gleDouble startTheta, /* start angle in x-y plane */ + gleDouble sweepTheta); /* degrees to spiral around */ + +/* draws a screw shape */ +extern void gleScrew (int ncp, /* number of contour points */ + gleDouble contour[][2], /* 2D contour */ + gleDouble cont_normal[][2], /* 2D contour normals */ + gleDouble up[3], /* up vector for contour */ + gleDouble startz, /* start of segment */ + gleDouble endz, /* end of segment */ + gleDouble twist); /* number of rotations */ + +extern void gleTextureMode (int mode); + +#ifdef __cplusplus +} + +#endif +#endif /* __TUBE_H__ */ +/* ================== END OF FILE ======================= */ diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Windows/GL/wglew.h b/Source/Plugins/Plugin_VideoOGL/Src/Windows/GL/wglew.h new file mode 100644 index 0000000000..3e39eef79e --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/Windows/GL/wglew.h @@ -0,0 +1,998 @@ +/* +** The OpenGL Extension Wrangler Library +** Copyright (C) 2002-2007, Milan Ikits +** Copyright (C) 2002-2007, Marcelo E. Magallon +** Copyright (C) 2002, Lev Povalahev +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are met: +** +** * Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright notice, +** this list of conditions and the following disclaimer in the documentation +** and/or other materials provided with the distribution. +** * The name of the author may be used to endorse or promote products +** derived from this software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +** THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef __wglew_h__ +#define __wglew_h__ +#define __WGLEW_H__ + +#ifdef __wglext_h_ +#error wglext.h included before wglew.h +#endif + +#define __wglext_h_ + +#if !defined(APIENTRY) && !defined(__CYGWIN__) +# ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN 1 +# endif +#include +#endif + +/* + * GLEW_STATIC needs to be set when using the static version. + * GLEW_BUILD is set when building the DLL version. + */ +#ifdef GLEW_STATIC +# define GLEWAPI extern +#else +# ifdef GLEW_BUILD +# define GLEWAPI extern __declspec(dllexport) +# else +# define GLEWAPI extern __declspec(dllimport) +# endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* -------------------------- WGL_3DFX_multisample ------------------------- */ + +#ifndef WGL_3DFX_multisample +#define WGL_3DFX_multisample 1 + +#define WGL_SAMPLE_BUFFERS_3DFX 0x2060 +#define WGL_SAMPLES_3DFX 0x2061 + +#define WGLEW_3DFX_multisample WGLEW_GET_VAR(__WGLEW_3DFX_multisample) + +#endif /* WGL_3DFX_multisample */ + +/* ------------------------- WGL_3DL_stereo_control ------------------------ */ + +#ifndef WGL_3DL_stereo_control +#define WGL_3DL_stereo_control 1 + +#define WGL_STEREO_EMITTER_ENABLE_3DL 0x2055 +#define WGL_STEREO_EMITTER_DISABLE_3DL 0x2056 +#define WGL_STEREO_POLARITY_NORMAL_3DL 0x2057 +#define WGL_STEREO_POLARITY_INVERT_3DL 0x2058 + +typedef BOOL (WINAPI * PFNWGLSETSTEREOEMITTERSTATE3DLPROC) (HDC hDC, UINT uState); + +#define wglSetStereoEmitterState3DL WGLEW_GET_FUN(__wglewSetStereoEmitterState3DL) + +#define WGLEW_3DL_stereo_control WGLEW_GET_VAR(__WGLEW_3DL_stereo_control) + +#endif /* WGL_3DL_stereo_control */ + +/* ------------------------- WGL_ARB_buffer_region ------------------------- */ + +#ifndef WGL_ARB_buffer_region +#define WGL_ARB_buffer_region 1 + +#define WGL_FRONT_COLOR_BUFFER_BIT_ARB 0x00000001 +#define WGL_BACK_COLOR_BUFFER_BIT_ARB 0x00000002 +#define WGL_DEPTH_BUFFER_BIT_ARB 0x00000004 +#define WGL_STENCIL_BUFFER_BIT_ARB 0x00000008 + +typedef HANDLE (WINAPI * PFNWGLCREATEBUFFERREGIONARBPROC) (HDC hDC, int iLayerPlane, UINT uType); +typedef VOID (WINAPI * PFNWGLDELETEBUFFERREGIONARBPROC) (HANDLE hRegion); +typedef BOOL (WINAPI * PFNWGLRESTOREBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height, int xSrc, int ySrc); +typedef BOOL (WINAPI * PFNWGLSAVEBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height); + +#define wglCreateBufferRegionARB WGLEW_GET_FUN(__wglewCreateBufferRegionARB) +#define wglDeleteBufferRegionARB WGLEW_GET_FUN(__wglewDeleteBufferRegionARB) +#define wglRestoreBufferRegionARB WGLEW_GET_FUN(__wglewRestoreBufferRegionARB) +#define wglSaveBufferRegionARB WGLEW_GET_FUN(__wglewSaveBufferRegionARB) + +#define WGLEW_ARB_buffer_region WGLEW_GET_VAR(__WGLEW_ARB_buffer_region) + +#endif /* WGL_ARB_buffer_region */ + +/* ----------------------- WGL_ARB_extensions_string ----------------------- */ + +#ifndef WGL_ARB_extensions_string +#define WGL_ARB_extensions_string 1 + +typedef const char* (WINAPI * PFNWGLGETEXTENSIONSSTRINGARBPROC) (HDC hdc); + +#define wglGetExtensionsStringARB WGLEW_GET_FUN(__wglewGetExtensionsStringARB) + +#define WGLEW_ARB_extensions_string WGLEW_GET_VAR(__WGLEW_ARB_extensions_string) + +#endif /* WGL_ARB_extensions_string */ + +/* ----------------------- WGL_ARB_make_current_read ----------------------- */ + +#ifndef WGL_ARB_make_current_read +#define WGL_ARB_make_current_read 1 + +typedef HDC (WINAPI * PFNWGLGETCURRENTREADDCARBPROC) (VOID); +typedef BOOL (WINAPI * PFNWGLMAKECONTEXTCURRENTARBPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc); + +#define wglGetCurrentReadDCARB WGLEW_GET_FUN(__wglewGetCurrentReadDCARB) +#define wglMakeContextCurrentARB WGLEW_GET_FUN(__wglewMakeContextCurrentARB) + +#define WGLEW_ARB_make_current_read WGLEW_GET_VAR(__WGLEW_ARB_make_current_read) + +#endif /* WGL_ARB_make_current_read */ + +/* -------------------------- WGL_ARB_multisample -------------------------- */ + +#ifndef WGL_ARB_multisample +#define WGL_ARB_multisample 1 + +#define WGL_SAMPLE_BUFFERS_ARB 0x2041 +#define WGL_SAMPLES_ARB 0x2042 + +#define WGLEW_ARB_multisample WGLEW_GET_VAR(__WGLEW_ARB_multisample) + +#endif /* WGL_ARB_multisample */ + +/* ---------------------------- WGL_ARB_pbuffer ---------------------------- */ + +#ifndef WGL_ARB_pbuffer +#define WGL_ARB_pbuffer 1 + +#define WGL_DRAW_TO_PBUFFER_ARB 0x202D +#define WGL_MAX_PBUFFER_PIXELS_ARB 0x202E +#define WGL_MAX_PBUFFER_WIDTH_ARB 0x202F +#define WGL_MAX_PBUFFER_HEIGHT_ARB 0x2030 +#define WGL_PBUFFER_LARGEST_ARB 0x2033 +#define WGL_PBUFFER_WIDTH_ARB 0x2034 +#define WGL_PBUFFER_HEIGHT_ARB 0x2035 +#define WGL_PBUFFER_LOST_ARB 0x2036 + +DECLARE_HANDLE(HPBUFFERARB); + +typedef HPBUFFERARB (WINAPI * PFNWGLCREATEPBUFFERARBPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int* piAttribList); +typedef BOOL (WINAPI * PFNWGLDESTROYPBUFFERARBPROC) (HPBUFFERARB hPbuffer); +typedef HDC (WINAPI * PFNWGLGETPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer); +typedef BOOL (WINAPI * PFNWGLQUERYPBUFFERARBPROC) (HPBUFFERARB hPbuffer, int iAttribute, int* piValue); +typedef int (WINAPI * PFNWGLRELEASEPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer, HDC hDC); + +#define wglCreatePbufferARB WGLEW_GET_FUN(__wglewCreatePbufferARB) +#define wglDestroyPbufferARB WGLEW_GET_FUN(__wglewDestroyPbufferARB) +#define wglGetPbufferDCARB WGLEW_GET_FUN(__wglewGetPbufferDCARB) +#define wglQueryPbufferARB WGLEW_GET_FUN(__wglewQueryPbufferARB) +#define wglReleasePbufferDCARB WGLEW_GET_FUN(__wglewReleasePbufferDCARB) + +#define WGLEW_ARB_pbuffer WGLEW_GET_VAR(__WGLEW_ARB_pbuffer) + +#endif /* WGL_ARB_pbuffer */ + +/* -------------------------- WGL_ARB_pixel_format ------------------------- */ + +#ifndef WGL_ARB_pixel_format +#define WGL_ARB_pixel_format 1 + +#define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000 +#define WGL_DRAW_TO_WINDOW_ARB 0x2001 +#define WGL_DRAW_TO_BITMAP_ARB 0x2002 +#define WGL_ACCELERATION_ARB 0x2003 +#define WGL_NEED_PALETTE_ARB 0x2004 +#define WGL_NEED_SYSTEM_PALETTE_ARB 0x2005 +#define WGL_SWAP_LAYER_BUFFERS_ARB 0x2006 +#define WGL_SWAP_METHOD_ARB 0x2007 +#define WGL_NUMBER_OVERLAYS_ARB 0x2008 +#define WGL_NUMBER_UNDERLAYS_ARB 0x2009 +#define WGL_TRANSPARENT_ARB 0x200A +#define WGL_SHARE_DEPTH_ARB 0x200C +#define WGL_SHARE_STENCIL_ARB 0x200D +#define WGL_SHARE_ACCUM_ARB 0x200E +#define WGL_SUPPORT_GDI_ARB 0x200F +#define WGL_SUPPORT_OPENGL_ARB 0x2010 +#define WGL_DOUBLE_BUFFER_ARB 0x2011 +#define WGL_STEREO_ARB 0x2012 +#define WGL_PIXEL_TYPE_ARB 0x2013 +#define WGL_COLOR_BITS_ARB 0x2014 +#define WGL_RED_BITS_ARB 0x2015 +#define WGL_RED_SHIFT_ARB 0x2016 +#define WGL_GREEN_BITS_ARB 0x2017 +#define WGL_GREEN_SHIFT_ARB 0x2018 +#define WGL_BLUE_BITS_ARB 0x2019 +#define WGL_BLUE_SHIFT_ARB 0x201A +#define WGL_ALPHA_BITS_ARB 0x201B +#define WGL_ALPHA_SHIFT_ARB 0x201C +#define WGL_ACCUM_BITS_ARB 0x201D +#define WGL_ACCUM_RED_BITS_ARB 0x201E +#define WGL_ACCUM_GREEN_BITS_ARB 0x201F +#define WGL_ACCUM_BLUE_BITS_ARB 0x2020 +#define WGL_ACCUM_ALPHA_BITS_ARB 0x2021 +#define WGL_DEPTH_BITS_ARB 0x2022 +#define WGL_STENCIL_BITS_ARB 0x2023 +#define WGL_AUX_BUFFERS_ARB 0x2024 +#define WGL_NO_ACCELERATION_ARB 0x2025 +#define WGL_GENERIC_ACCELERATION_ARB 0x2026 +#define WGL_FULL_ACCELERATION_ARB 0x2027 +#define WGL_SWAP_EXCHANGE_ARB 0x2028 +#define WGL_SWAP_COPY_ARB 0x2029 +#define WGL_SWAP_UNDEFINED_ARB 0x202A +#define WGL_TYPE_RGBA_ARB 0x202B +#define WGL_TYPE_COLORINDEX_ARB 0x202C +#define WGL_TRANSPARENT_RED_VALUE_ARB 0x2037 +#define WGL_TRANSPARENT_GREEN_VALUE_ARB 0x2038 +#define WGL_TRANSPARENT_BLUE_VALUE_ARB 0x2039 +#define WGL_TRANSPARENT_ALPHA_VALUE_ARB 0x203A +#define WGL_TRANSPARENT_INDEX_VALUE_ARB 0x203B + +typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATARBPROC) (HDC hdc, const int* piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats); +typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBFVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int* piAttributes, FLOAT *pfValues); +typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int* piAttributes, int *piValues); + +#define wglChoosePixelFormatARB WGLEW_GET_FUN(__wglewChoosePixelFormatARB) +#define wglGetPixelFormatAttribfvARB WGLEW_GET_FUN(__wglewGetPixelFormatAttribfvARB) +#define wglGetPixelFormatAttribivARB WGLEW_GET_FUN(__wglewGetPixelFormatAttribivARB) + +#define WGLEW_ARB_pixel_format WGLEW_GET_VAR(__WGLEW_ARB_pixel_format) + +#endif /* WGL_ARB_pixel_format */ + +/* ----------------------- WGL_ARB_pixel_format_float ---------------------- */ + +#ifndef WGL_ARB_pixel_format_float +#define WGL_ARB_pixel_format_float 1 + +#define WGL_TYPE_RGBA_FLOAT_ARB 0x21A0 + +#define WGLEW_ARB_pixel_format_float WGLEW_GET_VAR(__WGLEW_ARB_pixel_format_float) + +#endif /* WGL_ARB_pixel_format_float */ + +/* ------------------------- WGL_ARB_render_texture ------------------------ */ + +#ifndef WGL_ARB_render_texture +#define WGL_ARB_render_texture 1 + +#define WGL_BIND_TO_TEXTURE_RGB_ARB 0x2070 +#define WGL_BIND_TO_TEXTURE_RGBA_ARB 0x2071 +#define WGL_TEXTURE_FORMAT_ARB 0x2072 +#define WGL_TEXTURE_TARGET_ARB 0x2073 +#define WGL_MIPMAP_TEXTURE_ARB 0x2074 +#define WGL_TEXTURE_RGB_ARB 0x2075 +#define WGL_TEXTURE_RGBA_ARB 0x2076 +#define WGL_NO_TEXTURE_ARB 0x2077 +#define WGL_TEXTURE_CUBE_MAP_ARB 0x2078 +#define WGL_TEXTURE_1D_ARB 0x2079 +#define WGL_TEXTURE_2D_ARB 0x207A +#define WGL_MIPMAP_LEVEL_ARB 0x207B +#define WGL_CUBE_MAP_FACE_ARB 0x207C +#define WGL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x207D +#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x207E +#define WGL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x207F +#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x2080 +#define WGL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x2081 +#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x2082 +#define WGL_FRONT_LEFT_ARB 0x2083 +#define WGL_FRONT_RIGHT_ARB 0x2084 +#define WGL_BACK_LEFT_ARB 0x2085 +#define WGL_BACK_RIGHT_ARB 0x2086 +#define WGL_AUX0_ARB 0x2087 +#define WGL_AUX1_ARB 0x2088 +#define WGL_AUX2_ARB 0x2089 +#define WGL_AUX3_ARB 0x208A +#define WGL_AUX4_ARB 0x208B +#define WGL_AUX5_ARB 0x208C +#define WGL_AUX6_ARB 0x208D +#define WGL_AUX7_ARB 0x208E +#define WGL_AUX8_ARB 0x208F +#define WGL_AUX9_ARB 0x2090 + +typedef BOOL (WINAPI * PFNWGLBINDTEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer); +typedef BOOL (WINAPI * PFNWGLRELEASETEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer); +typedef BOOL (WINAPI * PFNWGLSETPBUFFERATTRIBARBPROC) (HPBUFFERARB hPbuffer, const int* piAttribList); + +#define wglBindTexImageARB WGLEW_GET_FUN(__wglewBindTexImageARB) +#define wglReleaseTexImageARB WGLEW_GET_FUN(__wglewReleaseTexImageARB) +#define wglSetPbufferAttribARB WGLEW_GET_FUN(__wglewSetPbufferAttribARB) + +#define WGLEW_ARB_render_texture WGLEW_GET_VAR(__WGLEW_ARB_render_texture) + +#endif /* WGL_ARB_render_texture */ + +/* ----------------------- WGL_ATI_pixel_format_float ---------------------- */ + +#ifndef WGL_ATI_pixel_format_float +#define WGL_ATI_pixel_format_float 1 + +#define WGL_TYPE_RGBA_FLOAT_ATI 0x21A0 +#define GL_RGBA_FLOAT_MODE_ATI 0x8820 +#define GL_COLOR_CLEAR_UNCLAMPED_VALUE_ATI 0x8835 + +#define WGLEW_ATI_pixel_format_float WGLEW_GET_VAR(__WGLEW_ATI_pixel_format_float) + +#endif /* WGL_ATI_pixel_format_float */ + +/* -------------------- WGL_ATI_render_texture_rectangle ------------------- */ + +#ifndef WGL_ATI_render_texture_rectangle +#define WGL_ATI_render_texture_rectangle 1 + +#define WGL_TEXTURE_RECTANGLE_ATI 0x21A5 + +#define WGLEW_ATI_render_texture_rectangle WGLEW_GET_VAR(__WGLEW_ATI_render_texture_rectangle) + +#endif /* WGL_ATI_render_texture_rectangle */ + +/* -------------------------- WGL_EXT_depth_float -------------------------- */ + +#ifndef WGL_EXT_depth_float +#define WGL_EXT_depth_float 1 + +#define WGL_DEPTH_FLOAT_EXT 0x2040 + +#define WGLEW_EXT_depth_float WGLEW_GET_VAR(__WGLEW_EXT_depth_float) + +#endif /* WGL_EXT_depth_float */ + +/* ---------------------- WGL_EXT_display_color_table ---------------------- */ + +#ifndef WGL_EXT_display_color_table +#define WGL_EXT_display_color_table 1 + +typedef GLboolean (WINAPI * PFNWGLBINDDISPLAYCOLORTABLEEXTPROC) (GLushort id); +typedef GLboolean (WINAPI * PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC) (GLushort id); +typedef void (WINAPI * PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC) (GLushort id); +typedef GLboolean (WINAPI * PFNWGLLOADDISPLAYCOLORTABLEEXTPROC) (GLushort* table, GLuint length); + +#define wglBindDisplayColorTableEXT WGLEW_GET_FUN(__wglewBindDisplayColorTableEXT) +#define wglCreateDisplayColorTableEXT WGLEW_GET_FUN(__wglewCreateDisplayColorTableEXT) +#define wglDestroyDisplayColorTableEXT WGLEW_GET_FUN(__wglewDestroyDisplayColorTableEXT) +#define wglLoadDisplayColorTableEXT WGLEW_GET_FUN(__wglewLoadDisplayColorTableEXT) + +#define WGLEW_EXT_display_color_table WGLEW_GET_VAR(__WGLEW_EXT_display_color_table) + +#endif /* WGL_EXT_display_color_table */ + +/* ----------------------- WGL_EXT_extensions_string ----------------------- */ + +#ifndef WGL_EXT_extensions_string +#define WGL_EXT_extensions_string 1 + +typedef const char* (WINAPI * PFNWGLGETEXTENSIONSSTRINGEXTPROC) (void); + +#define wglGetExtensionsStringEXT WGLEW_GET_FUN(__wglewGetExtensionsStringEXT) + +#define WGLEW_EXT_extensions_string WGLEW_GET_VAR(__WGLEW_EXT_extensions_string) + +#endif /* WGL_EXT_extensions_string */ + +/* ------------------------ WGL_EXT_framebuffer_sRGB ----------------------- */ + +#ifndef WGL_EXT_framebuffer_sRGB +#define WGL_EXT_framebuffer_sRGB 1 + +#define WGL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x20A9 + +#define WGLEW_EXT_framebuffer_sRGB WGLEW_GET_VAR(__WGLEW_EXT_framebuffer_sRGB) + +#endif /* WGL_EXT_framebuffer_sRGB */ + +/* ----------------------- WGL_EXT_make_current_read ----------------------- */ + +#ifndef WGL_EXT_make_current_read +#define WGL_EXT_make_current_read 1 + +typedef HDC (WINAPI * PFNWGLGETCURRENTREADDCEXTPROC) (VOID); +typedef BOOL (WINAPI * PFNWGLMAKECONTEXTCURRENTEXTPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc); + +#define wglGetCurrentReadDCEXT WGLEW_GET_FUN(__wglewGetCurrentReadDCEXT) +#define wglMakeContextCurrentEXT WGLEW_GET_FUN(__wglewMakeContextCurrentEXT) + +#define WGLEW_EXT_make_current_read WGLEW_GET_VAR(__WGLEW_EXT_make_current_read) + +#endif /* WGL_EXT_make_current_read */ + +/* -------------------------- WGL_EXT_multisample -------------------------- */ + +#ifndef WGL_EXT_multisample +#define WGL_EXT_multisample 1 + +#define WGL_SAMPLE_BUFFERS_EXT 0x2041 +#define WGL_SAMPLES_EXT 0x2042 + +#define WGLEW_EXT_multisample WGLEW_GET_VAR(__WGLEW_EXT_multisample) + +#endif /* WGL_EXT_multisample */ + +/* ---------------------------- WGL_EXT_pbuffer ---------------------------- */ + +#ifndef WGL_EXT_pbuffer +#define WGL_EXT_pbuffer 1 + +#define WGL_DRAW_TO_PBUFFER_EXT 0x202D +#define WGL_MAX_PBUFFER_PIXELS_EXT 0x202E +#define WGL_MAX_PBUFFER_WIDTH_EXT 0x202F +#define WGL_MAX_PBUFFER_HEIGHT_EXT 0x2030 +#define WGL_OPTIMAL_PBUFFER_WIDTH_EXT 0x2031 +#define WGL_OPTIMAL_PBUFFER_HEIGHT_EXT 0x2032 +#define WGL_PBUFFER_LARGEST_EXT 0x2033 +#define WGL_PBUFFER_WIDTH_EXT 0x2034 +#define WGL_PBUFFER_HEIGHT_EXT 0x2035 + +DECLARE_HANDLE(HPBUFFEREXT); + +typedef HPBUFFEREXT (WINAPI * PFNWGLCREATEPBUFFEREXTPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int* piAttribList); +typedef BOOL (WINAPI * PFNWGLDESTROYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer); +typedef HDC (WINAPI * PFNWGLGETPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer); +typedef BOOL (WINAPI * PFNWGLQUERYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer, int iAttribute, int* piValue); +typedef int (WINAPI * PFNWGLRELEASEPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer, HDC hDC); + +#define wglCreatePbufferEXT WGLEW_GET_FUN(__wglewCreatePbufferEXT) +#define wglDestroyPbufferEXT WGLEW_GET_FUN(__wglewDestroyPbufferEXT) +#define wglGetPbufferDCEXT WGLEW_GET_FUN(__wglewGetPbufferDCEXT) +#define wglQueryPbufferEXT WGLEW_GET_FUN(__wglewQueryPbufferEXT) +#define wglReleasePbufferDCEXT WGLEW_GET_FUN(__wglewReleasePbufferDCEXT) + +#define WGLEW_EXT_pbuffer WGLEW_GET_VAR(__WGLEW_EXT_pbuffer) + +#endif /* WGL_EXT_pbuffer */ + +/* -------------------------- WGL_EXT_pixel_format ------------------------- */ + +#ifndef WGL_EXT_pixel_format +#define WGL_EXT_pixel_format 1 + +#define WGL_NUMBER_PIXEL_FORMATS_EXT 0x2000 +#define WGL_DRAW_TO_WINDOW_EXT 0x2001 +#define WGL_DRAW_TO_BITMAP_EXT 0x2002 +#define WGL_ACCELERATION_EXT 0x2003 +#define WGL_NEED_PALETTE_EXT 0x2004 +#define WGL_NEED_SYSTEM_PALETTE_EXT 0x2005 +#define WGL_SWAP_LAYER_BUFFERS_EXT 0x2006 +#define WGL_SWAP_METHOD_EXT 0x2007 +#define WGL_NUMBER_OVERLAYS_EXT 0x2008 +#define WGL_NUMBER_UNDERLAYS_EXT 0x2009 +#define WGL_TRANSPARENT_EXT 0x200A +#define WGL_TRANSPARENT_VALUE_EXT 0x200B +#define WGL_SHARE_DEPTH_EXT 0x200C +#define WGL_SHARE_STENCIL_EXT 0x200D +#define WGL_SHARE_ACCUM_EXT 0x200E +#define WGL_SUPPORT_GDI_EXT 0x200F +#define WGL_SUPPORT_OPENGL_EXT 0x2010 +#define WGL_DOUBLE_BUFFER_EXT 0x2011 +#define WGL_STEREO_EXT 0x2012 +#define WGL_PIXEL_TYPE_EXT 0x2013 +#define WGL_COLOR_BITS_EXT 0x2014 +#define WGL_RED_BITS_EXT 0x2015 +#define WGL_RED_SHIFT_EXT 0x2016 +#define WGL_GREEN_BITS_EXT 0x2017 +#define WGL_GREEN_SHIFT_EXT 0x2018 +#define WGL_BLUE_BITS_EXT 0x2019 +#define WGL_BLUE_SHIFT_EXT 0x201A +#define WGL_ALPHA_BITS_EXT 0x201B +#define WGL_ALPHA_SHIFT_EXT 0x201C +#define WGL_ACCUM_BITS_EXT 0x201D +#define WGL_ACCUM_RED_BITS_EXT 0x201E +#define WGL_ACCUM_GREEN_BITS_EXT 0x201F +#define WGL_ACCUM_BLUE_BITS_EXT 0x2020 +#define WGL_ACCUM_ALPHA_BITS_EXT 0x2021 +#define WGL_DEPTH_BITS_EXT 0x2022 +#define WGL_STENCIL_BITS_EXT 0x2023 +#define WGL_AUX_BUFFERS_EXT 0x2024 +#define WGL_NO_ACCELERATION_EXT 0x2025 +#define WGL_GENERIC_ACCELERATION_EXT 0x2026 +#define WGL_FULL_ACCELERATION_EXT 0x2027 +#define WGL_SWAP_EXCHANGE_EXT 0x2028 +#define WGL_SWAP_COPY_EXT 0x2029 +#define WGL_SWAP_UNDEFINED_EXT 0x202A +#define WGL_TYPE_RGBA_EXT 0x202B +#define WGL_TYPE_COLORINDEX_EXT 0x202C + +typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATEXTPROC) (HDC hdc, const int* piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats); +typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBFVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int* piAttributes, FLOAT *pfValues); +typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int* piAttributes, int *piValues); + +#define wglChoosePixelFormatEXT WGLEW_GET_FUN(__wglewChoosePixelFormatEXT) +#define wglGetPixelFormatAttribfvEXT WGLEW_GET_FUN(__wglewGetPixelFormatAttribfvEXT) +#define wglGetPixelFormatAttribivEXT WGLEW_GET_FUN(__wglewGetPixelFormatAttribivEXT) + +#define WGLEW_EXT_pixel_format WGLEW_GET_VAR(__WGLEW_EXT_pixel_format) + +#endif /* WGL_EXT_pixel_format */ + +/* ------------------- WGL_EXT_pixel_format_packed_float ------------------- */ + +#ifndef WGL_EXT_pixel_format_packed_float +#define WGL_EXT_pixel_format_packed_float 1 + +#define WGL_TYPE_RGBA_UNSIGNED_FLOAT_EXT 0x20A8 + +#define WGLEW_EXT_pixel_format_packed_float WGLEW_GET_VAR(__WGLEW_EXT_pixel_format_packed_float) + +#endif /* WGL_EXT_pixel_format_packed_float */ + +/* -------------------------- WGL_EXT_swap_control ------------------------- */ + +#ifndef WGL_EXT_swap_control +#define WGL_EXT_swap_control 1 + +typedef int (WINAPI * PFNWGLGETSWAPINTERVALEXTPROC) (void); +typedef BOOL (WINAPI * PFNWGLSWAPINTERVALEXTPROC) (int interval); + +#define wglGetSwapIntervalEXT WGLEW_GET_FUN(__wglewGetSwapIntervalEXT) +#define wglSwapIntervalEXT WGLEW_GET_FUN(__wglewSwapIntervalEXT) + +#define WGLEW_EXT_swap_control WGLEW_GET_VAR(__WGLEW_EXT_swap_control) + +#endif /* WGL_EXT_swap_control */ + +/* --------------------- WGL_I3D_digital_video_control --------------------- */ + +#ifndef WGL_I3D_digital_video_control +#define WGL_I3D_digital_video_control 1 + +#define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_FRAMEBUFFER_I3D 0x2050 +#define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_VALUE_I3D 0x2051 +#define WGL_DIGITAL_VIDEO_CURSOR_INCLUDED_I3D 0x2052 +#define WGL_DIGITAL_VIDEO_GAMMA_CORRECTED_I3D 0x2053 + +typedef BOOL (WINAPI * PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC) (HDC hDC, int iAttribute, int* piValue); +typedef BOOL (WINAPI * PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC) (HDC hDC, int iAttribute, const int* piValue); + +#define wglGetDigitalVideoParametersI3D WGLEW_GET_FUN(__wglewGetDigitalVideoParametersI3D) +#define wglSetDigitalVideoParametersI3D WGLEW_GET_FUN(__wglewSetDigitalVideoParametersI3D) + +#define WGLEW_I3D_digital_video_control WGLEW_GET_VAR(__WGLEW_I3D_digital_video_control) + +#endif /* WGL_I3D_digital_video_control */ + +/* ----------------------------- WGL_I3D_gamma ----------------------------- */ + +#ifndef WGL_I3D_gamma +#define WGL_I3D_gamma 1 + +#define WGL_GAMMA_TABLE_SIZE_I3D 0x204E +#define WGL_GAMMA_EXCLUDE_DESKTOP_I3D 0x204F + +typedef BOOL (WINAPI * PFNWGLGETGAMMATABLEI3DPROC) (HDC hDC, int iEntries, USHORT* puRed, USHORT *puGreen, USHORT *puBlue); +typedef BOOL (WINAPI * PFNWGLGETGAMMATABLEPARAMETERSI3DPROC) (HDC hDC, int iAttribute, int* piValue); +typedef BOOL (WINAPI * PFNWGLSETGAMMATABLEI3DPROC) (HDC hDC, int iEntries, const USHORT* puRed, const USHORT *puGreen, const USHORT *puBlue); +typedef BOOL (WINAPI * PFNWGLSETGAMMATABLEPARAMETERSI3DPROC) (HDC hDC, int iAttribute, const int* piValue); + +#define wglGetGammaTableI3D WGLEW_GET_FUN(__wglewGetGammaTableI3D) +#define wglGetGammaTableParametersI3D WGLEW_GET_FUN(__wglewGetGammaTableParametersI3D) +#define wglSetGammaTableI3D WGLEW_GET_FUN(__wglewSetGammaTableI3D) +#define wglSetGammaTableParametersI3D WGLEW_GET_FUN(__wglewSetGammaTableParametersI3D) + +#define WGLEW_I3D_gamma WGLEW_GET_VAR(__WGLEW_I3D_gamma) + +#endif /* WGL_I3D_gamma */ + +/* ---------------------------- WGL_I3D_genlock ---------------------------- */ + +#ifndef WGL_I3D_genlock +#define WGL_I3D_genlock 1 + +#define WGL_GENLOCK_SOURCE_MULTIVIEW_I3D 0x2044 +#define WGL_GENLOCK_SOURCE_EXTERNAL_SYNC_I3D 0x2045 +#define WGL_GENLOCK_SOURCE_EXTERNAL_FIELD_I3D 0x2046 +#define WGL_GENLOCK_SOURCE_EXTERNAL_TTL_I3D 0x2047 +#define WGL_GENLOCK_SOURCE_DIGITAL_SYNC_I3D 0x2048 +#define WGL_GENLOCK_SOURCE_DIGITAL_FIELD_I3D 0x2049 +#define WGL_GENLOCK_SOURCE_EDGE_FALLING_I3D 0x204A +#define WGL_GENLOCK_SOURCE_EDGE_RISING_I3D 0x204B +#define WGL_GENLOCK_SOURCE_EDGE_BOTH_I3D 0x204C + +typedef BOOL (WINAPI * PFNWGLDISABLEGENLOCKI3DPROC) (HDC hDC); +typedef BOOL (WINAPI * PFNWGLENABLEGENLOCKI3DPROC) (HDC hDC); +typedef BOOL (WINAPI * PFNWGLGENLOCKSAMPLERATEI3DPROC) (HDC hDC, UINT uRate); +typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEDELAYI3DPROC) (HDC hDC, UINT uDelay); +typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEEDGEI3DPROC) (HDC hDC, UINT uEdge); +typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEI3DPROC) (HDC hDC, UINT uSource); +typedef BOOL (WINAPI * PFNWGLGETGENLOCKSAMPLERATEI3DPROC) (HDC hDC, UINT* uRate); +typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEDELAYI3DPROC) (HDC hDC, UINT* uDelay); +typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEEDGEI3DPROC) (HDC hDC, UINT* uEdge); +typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEI3DPROC) (HDC hDC, UINT* uSource); +typedef BOOL (WINAPI * PFNWGLISENABLEDGENLOCKI3DPROC) (HDC hDC, BOOL* pFlag); +typedef BOOL (WINAPI * PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC) (HDC hDC, UINT* uMaxLineDelay, UINT *uMaxPixelDelay); + +#define wglDisableGenlockI3D WGLEW_GET_FUN(__wglewDisableGenlockI3D) +#define wglEnableGenlockI3D WGLEW_GET_FUN(__wglewEnableGenlockI3D) +#define wglGenlockSampleRateI3D WGLEW_GET_FUN(__wglewGenlockSampleRateI3D) +#define wglGenlockSourceDelayI3D WGLEW_GET_FUN(__wglewGenlockSourceDelayI3D) +#define wglGenlockSourceEdgeI3D WGLEW_GET_FUN(__wglewGenlockSourceEdgeI3D) +#define wglGenlockSourceI3D WGLEW_GET_FUN(__wglewGenlockSourceI3D) +#define wglGetGenlockSampleRateI3D WGLEW_GET_FUN(__wglewGetGenlockSampleRateI3D) +#define wglGetGenlockSourceDelayI3D WGLEW_GET_FUN(__wglewGetGenlockSourceDelayI3D) +#define wglGetGenlockSourceEdgeI3D WGLEW_GET_FUN(__wglewGetGenlockSourceEdgeI3D) +#define wglGetGenlockSourceI3D WGLEW_GET_FUN(__wglewGetGenlockSourceI3D) +#define wglIsEnabledGenlockI3D WGLEW_GET_FUN(__wglewIsEnabledGenlockI3D) +#define wglQueryGenlockMaxSourceDelayI3D WGLEW_GET_FUN(__wglewQueryGenlockMaxSourceDelayI3D) + +#define WGLEW_I3D_genlock WGLEW_GET_VAR(__WGLEW_I3D_genlock) + +#endif /* WGL_I3D_genlock */ + +/* -------------------------- WGL_I3D_image_buffer ------------------------- */ + +#ifndef WGL_I3D_image_buffer +#define WGL_I3D_image_buffer 1 + +#define WGL_IMAGE_BUFFER_MIN_ACCESS_I3D 0x00000001 +#define WGL_IMAGE_BUFFER_LOCK_I3D 0x00000002 + +typedef BOOL (WINAPI * PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC) (HDC hdc, HANDLE* pEvent, LPVOID *pAddress, DWORD *pSize, UINT count); +typedef LPVOID (WINAPI * PFNWGLCREATEIMAGEBUFFERI3DPROC) (HDC hDC, DWORD dwSize, UINT uFlags); +typedef BOOL (WINAPI * PFNWGLDESTROYIMAGEBUFFERI3DPROC) (HDC hDC, LPVOID pAddress); +typedef BOOL (WINAPI * PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC) (HDC hdc, LPVOID* pAddress, UINT count); + +#define wglAssociateImageBufferEventsI3D WGLEW_GET_FUN(__wglewAssociateImageBufferEventsI3D) +#define wglCreateImageBufferI3D WGLEW_GET_FUN(__wglewCreateImageBufferI3D) +#define wglDestroyImageBufferI3D WGLEW_GET_FUN(__wglewDestroyImageBufferI3D) +#define wglReleaseImageBufferEventsI3D WGLEW_GET_FUN(__wglewReleaseImageBufferEventsI3D) + +#define WGLEW_I3D_image_buffer WGLEW_GET_VAR(__WGLEW_I3D_image_buffer) + +#endif /* WGL_I3D_image_buffer */ + +/* ------------------------ WGL_I3D_swap_frame_lock ------------------------ */ + +#ifndef WGL_I3D_swap_frame_lock +#define WGL_I3D_swap_frame_lock 1 + +typedef BOOL (WINAPI * PFNWGLDISABLEFRAMELOCKI3DPROC) (VOID); +typedef BOOL (WINAPI * PFNWGLENABLEFRAMELOCKI3DPROC) (VOID); +typedef BOOL (WINAPI * PFNWGLISENABLEDFRAMELOCKI3DPROC) (BOOL* pFlag); +typedef BOOL (WINAPI * PFNWGLQUERYFRAMELOCKMASTERI3DPROC) (BOOL* pFlag); + +#define wglDisableFrameLockI3D WGLEW_GET_FUN(__wglewDisableFrameLockI3D) +#define wglEnableFrameLockI3D WGLEW_GET_FUN(__wglewEnableFrameLockI3D) +#define wglIsEnabledFrameLockI3D WGLEW_GET_FUN(__wglewIsEnabledFrameLockI3D) +#define wglQueryFrameLockMasterI3D WGLEW_GET_FUN(__wglewQueryFrameLockMasterI3D) + +#define WGLEW_I3D_swap_frame_lock WGLEW_GET_VAR(__WGLEW_I3D_swap_frame_lock) + +#endif /* WGL_I3D_swap_frame_lock */ + +/* ------------------------ WGL_I3D_swap_frame_usage ----------------------- */ + +#ifndef WGL_I3D_swap_frame_usage +#define WGL_I3D_swap_frame_usage 1 + +typedef BOOL (WINAPI * PFNWGLBEGINFRAMETRACKINGI3DPROC) (void); +typedef BOOL (WINAPI * PFNWGLENDFRAMETRACKINGI3DPROC) (void); +typedef BOOL (WINAPI * PFNWGLGETFRAMEUSAGEI3DPROC) (float* pUsage); +typedef BOOL (WINAPI * PFNWGLQUERYFRAMETRACKINGI3DPROC) (DWORD* pFrameCount, DWORD *pMissedFrames, float *pLastMissedUsage); + +#define wglBeginFrameTrackingI3D WGLEW_GET_FUN(__wglewBeginFrameTrackingI3D) +#define wglEndFrameTrackingI3D WGLEW_GET_FUN(__wglewEndFrameTrackingI3D) +#define wglGetFrameUsageI3D WGLEW_GET_FUN(__wglewGetFrameUsageI3D) +#define wglQueryFrameTrackingI3D WGLEW_GET_FUN(__wglewQueryFrameTrackingI3D) + +#define WGLEW_I3D_swap_frame_usage WGLEW_GET_VAR(__WGLEW_I3D_swap_frame_usage) + +#endif /* WGL_I3D_swap_frame_usage */ + +/* -------------------------- WGL_NV_float_buffer -------------------------- */ + +#ifndef WGL_NV_float_buffer +#define WGL_NV_float_buffer 1 + +#define WGL_FLOAT_COMPONENTS_NV 0x20B0 +#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_R_NV 0x20B1 +#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RG_NV 0x20B2 +#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGB_NV 0x20B3 +#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGBA_NV 0x20B4 +#define WGL_TEXTURE_FLOAT_R_NV 0x20B5 +#define WGL_TEXTURE_FLOAT_RG_NV 0x20B6 +#define WGL_TEXTURE_FLOAT_RGB_NV 0x20B7 +#define WGL_TEXTURE_FLOAT_RGBA_NV 0x20B8 + +#define WGLEW_NV_float_buffer WGLEW_GET_VAR(__WGLEW_NV_float_buffer) + +#endif /* WGL_NV_float_buffer */ + +/* -------------------------- WGL_NV_gpu_affinity -------------------------- */ + +#ifndef WGL_NV_gpu_affinity +#define WGL_NV_gpu_affinity 1 + +#define WGL_ERROR_INCOMPATIBLE_AFFINITY_MASKS_NV 0x20D0 +#define WGL_ERROR_MISSING_AFFINITY_MASK_NV 0x20D1 + +DECLARE_HANDLE(HGPUNV); +typedef struct _GPU_DEVICE { + DWORD cb; + CHAR DeviceName[32]; + CHAR DeviceString[128]; + DWORD Flags; + RECT rcVirtualScreen; +} GPU_DEVICE, *PGPU_DEVICE; + +typedef HDC (WINAPI * PFNWGLCREATEAFFINITYDCNVPROC) (const HGPUNV *phGpuList); +typedef BOOL (WINAPI * PFNWGLDELETEDCNVPROC) (HDC hdc); +typedef BOOL (WINAPI * PFNWGLENUMGPUDEVICESNVPROC) (HGPUNV hGpu, UINT iDeviceIndex, PGPU_DEVICE lpGpuDevice); +typedef BOOL (WINAPI * PFNWGLENUMGPUSFROMAFFINITYDCNVPROC) (HDC hAffinityDC, UINT iGpuIndex, HGPUNV *hGpu); +typedef BOOL (WINAPI * PFNWGLENUMGPUSNVPROC) (UINT iGpuIndex, HGPUNV *phGpu); + +#define wglCreateAffinityDCNV WGLEW_GET_FUN(__wglewCreateAffinityDCNV) +#define wglDeleteDCNV WGLEW_GET_FUN(__wglewDeleteDCNV) +#define wglEnumGpuDevicesNV WGLEW_GET_FUN(__wglewEnumGpuDevicesNV) +#define wglEnumGpusFromAffinityDCNV WGLEW_GET_FUN(__wglewEnumGpusFromAffinityDCNV) +#define wglEnumGpusNV WGLEW_GET_FUN(__wglewEnumGpusNV) + +#define WGLEW_NV_gpu_affinity WGLEW_GET_VAR(__WGLEW_NV_gpu_affinity) + +#endif /* WGL_NV_gpu_affinity */ + +/* ---------------------- WGL_NV_render_depth_texture ---------------------- */ + +#ifndef WGL_NV_render_depth_texture +#define WGL_NV_render_depth_texture 1 + +#define WGL_NO_TEXTURE_ARB 0x2077 +#define WGL_BIND_TO_TEXTURE_DEPTH_NV 0x20A3 +#define WGL_BIND_TO_TEXTURE_RECTANGLE_DEPTH_NV 0x20A4 +#define WGL_DEPTH_TEXTURE_FORMAT_NV 0x20A5 +#define WGL_TEXTURE_DEPTH_COMPONENT_NV 0x20A6 +#define WGL_DEPTH_COMPONENT_NV 0x20A7 + +#define WGLEW_NV_render_depth_texture WGLEW_GET_VAR(__WGLEW_NV_render_depth_texture) + +#endif /* WGL_NV_render_depth_texture */ + +/* -------------------- WGL_NV_render_texture_rectangle -------------------- */ + +#ifndef WGL_NV_render_texture_rectangle +#define WGL_NV_render_texture_rectangle 1 + +#define WGL_BIND_TO_TEXTURE_RECTANGLE_RGB_NV 0x20A0 +#define WGL_BIND_TO_TEXTURE_RECTANGLE_RGBA_NV 0x20A1 +#define WGL_TEXTURE_RECTANGLE_NV 0x20A2 + +#define WGLEW_NV_render_texture_rectangle WGLEW_GET_VAR(__WGLEW_NV_render_texture_rectangle) + +#endif /* WGL_NV_render_texture_rectangle */ + +/* ----------------------- WGL_NV_vertex_array_range ----------------------- */ + +#ifndef WGL_NV_vertex_array_range +#define WGL_NV_vertex_array_range 1 + +typedef void * (WINAPI * PFNWGLALLOCATEMEMORYNVPROC) (GLsizei size, GLfloat readFrequency, GLfloat writeFrequency, GLfloat priority); +typedef void (WINAPI * PFNWGLFREEMEMORYNVPROC) (void *pointer); + +#define wglAllocateMemoryNV WGLEW_GET_FUN(__wglewAllocateMemoryNV) +#define wglFreeMemoryNV WGLEW_GET_FUN(__wglewFreeMemoryNV) + +#define WGLEW_NV_vertex_array_range WGLEW_GET_VAR(__WGLEW_NV_vertex_array_range) + +#endif /* WGL_NV_vertex_array_range */ + +/* -------------------------- WGL_OML_sync_control ------------------------- */ + +#ifndef WGL_OML_sync_control +#define WGL_OML_sync_control 1 + +typedef BOOL (WINAPI * PFNWGLGETMSCRATEOMLPROC) (HDC hdc, INT32* numerator, INT32 *denominator); +typedef BOOL (WINAPI * PFNWGLGETSYNCVALUESOMLPROC) (HDC hdc, INT64* ust, INT64 *msc, INT64 *sbc); +typedef INT64 (WINAPI * PFNWGLSWAPBUFFERSMSCOMLPROC) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder); +typedef INT64 (WINAPI * PFNWGLSWAPLAYERBUFFERSMSCOMLPROC) (HDC hdc, INT fuPlanes, INT64 target_msc, INT64 divisor, INT64 remainder); +typedef BOOL (WINAPI * PFNWGLWAITFORMSCOMLPROC) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder, INT64* ust, INT64 *msc, INT64 *sbc); +typedef BOOL (WINAPI * PFNWGLWAITFORSBCOMLPROC) (HDC hdc, INT64 target_sbc, INT64* ust, INT64 *msc, INT64 *sbc); + +#define wglGetMscRateOML WGLEW_GET_FUN(__wglewGetMscRateOML) +#define wglGetSyncValuesOML WGLEW_GET_FUN(__wglewGetSyncValuesOML) +#define wglSwapBuffersMscOML WGLEW_GET_FUN(__wglewSwapBuffersMscOML) +#define wglSwapLayerBuffersMscOML WGLEW_GET_FUN(__wglewSwapLayerBuffersMscOML) +#define wglWaitForMscOML WGLEW_GET_FUN(__wglewWaitForMscOML) +#define wglWaitForSbcOML WGLEW_GET_FUN(__wglewWaitForSbcOML) + +#define WGLEW_OML_sync_control WGLEW_GET_VAR(__WGLEW_OML_sync_control) + +#endif /* WGL_OML_sync_control */ + +/* ------------------------------------------------------------------------- */ + +#ifdef GLEW_MX +#define WGLEW_EXPORT +#else +#define WGLEW_EXPORT GLEWAPI +#endif /* GLEW_MX */ + +#ifdef GLEW_MX +struct WGLEWContextStruct +{ +#endif /* GLEW_MX */ + +WGLEW_EXPORT PFNWGLSETSTEREOEMITTERSTATE3DLPROC __wglewSetStereoEmitterState3DL; + +WGLEW_EXPORT PFNWGLCREATEBUFFERREGIONARBPROC __wglewCreateBufferRegionARB; +WGLEW_EXPORT PFNWGLDELETEBUFFERREGIONARBPROC __wglewDeleteBufferRegionARB; +WGLEW_EXPORT PFNWGLRESTOREBUFFERREGIONARBPROC __wglewRestoreBufferRegionARB; +WGLEW_EXPORT PFNWGLSAVEBUFFERREGIONARBPROC __wglewSaveBufferRegionARB; + +WGLEW_EXPORT PFNWGLGETEXTENSIONSSTRINGARBPROC __wglewGetExtensionsStringARB; + +WGLEW_EXPORT PFNWGLGETCURRENTREADDCARBPROC __wglewGetCurrentReadDCARB; +WGLEW_EXPORT PFNWGLMAKECONTEXTCURRENTARBPROC __wglewMakeContextCurrentARB; + +WGLEW_EXPORT PFNWGLCREATEPBUFFERARBPROC __wglewCreatePbufferARB; +WGLEW_EXPORT PFNWGLDESTROYPBUFFERARBPROC __wglewDestroyPbufferARB; +WGLEW_EXPORT PFNWGLGETPBUFFERDCARBPROC __wglewGetPbufferDCARB; +WGLEW_EXPORT PFNWGLQUERYPBUFFERARBPROC __wglewQueryPbufferARB; +WGLEW_EXPORT PFNWGLRELEASEPBUFFERDCARBPROC __wglewReleasePbufferDCARB; + +WGLEW_EXPORT PFNWGLCHOOSEPIXELFORMATARBPROC __wglewChoosePixelFormatARB; +WGLEW_EXPORT PFNWGLGETPIXELFORMATATTRIBFVARBPROC __wglewGetPixelFormatAttribfvARB; +WGLEW_EXPORT PFNWGLGETPIXELFORMATATTRIBIVARBPROC __wglewGetPixelFormatAttribivARB; + +WGLEW_EXPORT PFNWGLBINDTEXIMAGEARBPROC __wglewBindTexImageARB; +WGLEW_EXPORT PFNWGLRELEASETEXIMAGEARBPROC __wglewReleaseTexImageARB; +WGLEW_EXPORT PFNWGLSETPBUFFERATTRIBARBPROC __wglewSetPbufferAttribARB; + +WGLEW_EXPORT PFNWGLBINDDISPLAYCOLORTABLEEXTPROC __wglewBindDisplayColorTableEXT; +WGLEW_EXPORT PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC __wglewCreateDisplayColorTableEXT; +WGLEW_EXPORT PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC __wglewDestroyDisplayColorTableEXT; +WGLEW_EXPORT PFNWGLLOADDISPLAYCOLORTABLEEXTPROC __wglewLoadDisplayColorTableEXT; + +WGLEW_EXPORT PFNWGLGETEXTENSIONSSTRINGEXTPROC __wglewGetExtensionsStringEXT; + +WGLEW_EXPORT PFNWGLGETCURRENTREADDCEXTPROC __wglewGetCurrentReadDCEXT; +WGLEW_EXPORT PFNWGLMAKECONTEXTCURRENTEXTPROC __wglewMakeContextCurrentEXT; + +WGLEW_EXPORT PFNWGLCREATEPBUFFEREXTPROC __wglewCreatePbufferEXT; +WGLEW_EXPORT PFNWGLDESTROYPBUFFEREXTPROC __wglewDestroyPbufferEXT; +WGLEW_EXPORT PFNWGLGETPBUFFERDCEXTPROC __wglewGetPbufferDCEXT; +WGLEW_EXPORT PFNWGLQUERYPBUFFEREXTPROC __wglewQueryPbufferEXT; +WGLEW_EXPORT PFNWGLRELEASEPBUFFERDCEXTPROC __wglewReleasePbufferDCEXT; + +WGLEW_EXPORT PFNWGLCHOOSEPIXELFORMATEXTPROC __wglewChoosePixelFormatEXT; +WGLEW_EXPORT PFNWGLGETPIXELFORMATATTRIBFVEXTPROC __wglewGetPixelFormatAttribfvEXT; +WGLEW_EXPORT PFNWGLGETPIXELFORMATATTRIBIVEXTPROC __wglewGetPixelFormatAttribivEXT; + +WGLEW_EXPORT PFNWGLGETSWAPINTERVALEXTPROC __wglewGetSwapIntervalEXT; +WGLEW_EXPORT PFNWGLSWAPINTERVALEXTPROC __wglewSwapIntervalEXT; + +WGLEW_EXPORT PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC __wglewGetDigitalVideoParametersI3D; +WGLEW_EXPORT PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC __wglewSetDigitalVideoParametersI3D; + +WGLEW_EXPORT PFNWGLGETGAMMATABLEI3DPROC __wglewGetGammaTableI3D; +WGLEW_EXPORT PFNWGLGETGAMMATABLEPARAMETERSI3DPROC __wglewGetGammaTableParametersI3D; +WGLEW_EXPORT PFNWGLSETGAMMATABLEI3DPROC __wglewSetGammaTableI3D; +WGLEW_EXPORT PFNWGLSETGAMMATABLEPARAMETERSI3DPROC __wglewSetGammaTableParametersI3D; + +WGLEW_EXPORT PFNWGLDISABLEGENLOCKI3DPROC __wglewDisableGenlockI3D; +WGLEW_EXPORT PFNWGLENABLEGENLOCKI3DPROC __wglewEnableGenlockI3D; +WGLEW_EXPORT PFNWGLGENLOCKSAMPLERATEI3DPROC __wglewGenlockSampleRateI3D; +WGLEW_EXPORT PFNWGLGENLOCKSOURCEDELAYI3DPROC __wglewGenlockSourceDelayI3D; +WGLEW_EXPORT PFNWGLGENLOCKSOURCEEDGEI3DPROC __wglewGenlockSourceEdgeI3D; +WGLEW_EXPORT PFNWGLGENLOCKSOURCEI3DPROC __wglewGenlockSourceI3D; +WGLEW_EXPORT PFNWGLGETGENLOCKSAMPLERATEI3DPROC __wglewGetGenlockSampleRateI3D; +WGLEW_EXPORT PFNWGLGETGENLOCKSOURCEDELAYI3DPROC __wglewGetGenlockSourceDelayI3D; +WGLEW_EXPORT PFNWGLGETGENLOCKSOURCEEDGEI3DPROC __wglewGetGenlockSourceEdgeI3D; +WGLEW_EXPORT PFNWGLGETGENLOCKSOURCEI3DPROC __wglewGetGenlockSourceI3D; +WGLEW_EXPORT PFNWGLISENABLEDGENLOCKI3DPROC __wglewIsEnabledGenlockI3D; +WGLEW_EXPORT PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC __wglewQueryGenlockMaxSourceDelayI3D; + +WGLEW_EXPORT PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC __wglewAssociateImageBufferEventsI3D; +WGLEW_EXPORT PFNWGLCREATEIMAGEBUFFERI3DPROC __wglewCreateImageBufferI3D; +WGLEW_EXPORT PFNWGLDESTROYIMAGEBUFFERI3DPROC __wglewDestroyImageBufferI3D; +WGLEW_EXPORT PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC __wglewReleaseImageBufferEventsI3D; + +WGLEW_EXPORT PFNWGLDISABLEFRAMELOCKI3DPROC __wglewDisableFrameLockI3D; +WGLEW_EXPORT PFNWGLENABLEFRAMELOCKI3DPROC __wglewEnableFrameLockI3D; +WGLEW_EXPORT PFNWGLISENABLEDFRAMELOCKI3DPROC __wglewIsEnabledFrameLockI3D; +WGLEW_EXPORT PFNWGLQUERYFRAMELOCKMASTERI3DPROC __wglewQueryFrameLockMasterI3D; + +WGLEW_EXPORT PFNWGLBEGINFRAMETRACKINGI3DPROC __wglewBeginFrameTrackingI3D; +WGLEW_EXPORT PFNWGLENDFRAMETRACKINGI3DPROC __wglewEndFrameTrackingI3D; +WGLEW_EXPORT PFNWGLGETFRAMEUSAGEI3DPROC __wglewGetFrameUsageI3D; +WGLEW_EXPORT PFNWGLQUERYFRAMETRACKINGI3DPROC __wglewQueryFrameTrackingI3D; + +WGLEW_EXPORT PFNWGLCREATEAFFINITYDCNVPROC __wglewCreateAffinityDCNV; +WGLEW_EXPORT PFNWGLDELETEDCNVPROC __wglewDeleteDCNV; +WGLEW_EXPORT PFNWGLENUMGPUDEVICESNVPROC __wglewEnumGpuDevicesNV; +WGLEW_EXPORT PFNWGLENUMGPUSFROMAFFINITYDCNVPROC __wglewEnumGpusFromAffinityDCNV; +WGLEW_EXPORT PFNWGLENUMGPUSNVPROC __wglewEnumGpusNV; + +WGLEW_EXPORT PFNWGLALLOCATEMEMORYNVPROC __wglewAllocateMemoryNV; +WGLEW_EXPORT PFNWGLFREEMEMORYNVPROC __wglewFreeMemoryNV; + +WGLEW_EXPORT PFNWGLGETMSCRATEOMLPROC __wglewGetMscRateOML; +WGLEW_EXPORT PFNWGLGETSYNCVALUESOMLPROC __wglewGetSyncValuesOML; +WGLEW_EXPORT PFNWGLSWAPBUFFERSMSCOMLPROC __wglewSwapBuffersMscOML; +WGLEW_EXPORT PFNWGLSWAPLAYERBUFFERSMSCOMLPROC __wglewSwapLayerBuffersMscOML; +WGLEW_EXPORT PFNWGLWAITFORMSCOMLPROC __wglewWaitForMscOML; +WGLEW_EXPORT PFNWGLWAITFORSBCOMLPROC __wglewWaitForSbcOML; +WGLEW_EXPORT GLboolean __WGLEW_3DFX_multisample; +WGLEW_EXPORT GLboolean __WGLEW_3DL_stereo_control; +WGLEW_EXPORT GLboolean __WGLEW_ARB_buffer_region; +WGLEW_EXPORT GLboolean __WGLEW_ARB_extensions_string; +WGLEW_EXPORT GLboolean __WGLEW_ARB_make_current_read; +WGLEW_EXPORT GLboolean __WGLEW_ARB_multisample; +WGLEW_EXPORT GLboolean __WGLEW_ARB_pbuffer; +WGLEW_EXPORT GLboolean __WGLEW_ARB_pixel_format; +WGLEW_EXPORT GLboolean __WGLEW_ARB_pixel_format_float; +WGLEW_EXPORT GLboolean __WGLEW_ARB_render_texture; +WGLEW_EXPORT GLboolean __WGLEW_ATI_pixel_format_float; +WGLEW_EXPORT GLboolean __WGLEW_ATI_render_texture_rectangle; +WGLEW_EXPORT GLboolean __WGLEW_EXT_depth_float; +WGLEW_EXPORT GLboolean __WGLEW_EXT_display_color_table; +WGLEW_EXPORT GLboolean __WGLEW_EXT_extensions_string; +WGLEW_EXPORT GLboolean __WGLEW_EXT_framebuffer_sRGB; +WGLEW_EXPORT GLboolean __WGLEW_EXT_make_current_read; +WGLEW_EXPORT GLboolean __WGLEW_EXT_multisample; +WGLEW_EXPORT GLboolean __WGLEW_EXT_pbuffer; +WGLEW_EXPORT GLboolean __WGLEW_EXT_pixel_format; +WGLEW_EXPORT GLboolean __WGLEW_EXT_pixel_format_packed_float; +WGLEW_EXPORT GLboolean __WGLEW_EXT_swap_control; +WGLEW_EXPORT GLboolean __WGLEW_I3D_digital_video_control; +WGLEW_EXPORT GLboolean __WGLEW_I3D_gamma; +WGLEW_EXPORT GLboolean __WGLEW_I3D_genlock; +WGLEW_EXPORT GLboolean __WGLEW_I3D_image_buffer; +WGLEW_EXPORT GLboolean __WGLEW_I3D_swap_frame_lock; +WGLEW_EXPORT GLboolean __WGLEW_I3D_swap_frame_usage; +WGLEW_EXPORT GLboolean __WGLEW_NV_float_buffer; +WGLEW_EXPORT GLboolean __WGLEW_NV_gpu_affinity; +WGLEW_EXPORT GLboolean __WGLEW_NV_render_depth_texture; +WGLEW_EXPORT GLboolean __WGLEW_NV_render_texture_rectangle; +WGLEW_EXPORT GLboolean __WGLEW_NV_vertex_array_range; +WGLEW_EXPORT GLboolean __WGLEW_OML_sync_control; + +#ifdef GLEW_MX +}; /* WGLEWContextStruct */ +#endif /* GLEW_MX */ + +/* ------------------------------------------------------------------------- */ + +#ifdef GLEW_MX + +typedef struct WGLEWContextStruct WGLEWContext; +GLEWAPI GLenum wglewContextInit (WGLEWContext* ctx); +GLEWAPI GLboolean wglewContextIsSupported (WGLEWContext* ctx, const char* name); + +#define wglewInit() wglewContextInit(wglewGetContext()) +#define wglewIsSupported(x) wglewContextIsSupported(wglewGetContext(), x) + +#define WGLEW_GET_VAR(x) (*(const GLboolean*)&(wglewGetContext()->x)) +#define WGLEW_GET_FUN(x) wglewGetContext()->x + +#else /* GLEW_MX */ + +#define WGLEW_GET_VAR(x) (*(const GLboolean*)&x) +#define WGLEW_GET_FUN(x) x + +GLEWAPI GLboolean wglewIsSupported (const char* name); + +#endif /* GLEW_MX */ + +GLEWAPI GLboolean wglewGetExtension (const char* name); + +#ifdef __cplusplus +} +#endif + +#undef GLEWAPI + +#endif /* __wglew_h__ */ diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Windows/GL/wglext.h b/Source/Plugins/Plugin_VideoOGL/Src/Windows/GL/wglext.h new file mode 100644 index 0000000000..f424adcf78 --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/Windows/GL/wglext.h @@ -0,0 +1,611 @@ +#ifndef __wglext_h_ +#define __wglext_h_ + +#ifdef __cplusplus +extern "C" { +#endif + +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2002 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: This software was created using the +** OpenGL(R) version 1.2.1 Sample Implementation published by SGI, but has +** not been independently verified as being compliant with the OpenGL(R) +** version 1.2.1 Specification. +*/ + +#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) +#define WIN32_LEAN_AND_MEAN 1 +#include +#endif + +#ifndef APIENTRY +#define APIENTRY +#endif +#ifndef APIENTRYP +#define APIENTRYP APIENTRY * +#endif +#ifndef GLAPI +#define GLAPI extern +#endif + +/*************************************************************/ + +/* Header file version number */ +/* wglext.h last updated 2002/03/22 */ +/* Current version at http://oss.sgi.com/projects/ogl-sample/registry/ */ +#define WGL_WGLEXT_VERSION 4 + +#ifndef WGL_ARB_buffer_region +#define WGL_FRONT_COLOR_BUFFER_BIT_ARB 0x00000001 +#define WGL_BACK_COLOR_BUFFER_BIT_ARB 0x00000002 +#define WGL_DEPTH_BUFFER_BIT_ARB 0x00000004 +#define WGL_STENCIL_BUFFER_BIT_ARB 0x00000008 +#endif + +#ifndef WGL_ARB_multisample +#define WGL_SAMPLE_BUFFERS_ARB 0x2041 +#define WGL_SAMPLES_ARB 0x2042 +#endif + +#ifndef WGL_ARB_extensions_string +#endif + +#ifndef WGL_ARB_pixel_format +#define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000 +#define WGL_DRAW_TO_WINDOW_ARB 0x2001 +#define WGL_DRAW_TO_BITMAP_ARB 0x2002 +#define WGL_ACCELERATION_ARB 0x2003 +#define WGL_NEED_PALETTE_ARB 0x2004 +#define WGL_NEED_SYSTEM_PALETTE_ARB 0x2005 +#define WGL_SWAP_LAYER_BUFFERS_ARB 0x2006 +#define WGL_SWAP_METHOD_ARB 0x2007 +#define WGL_NUMBER_OVERLAYS_ARB 0x2008 +#define WGL_NUMBER_UNDERLAYS_ARB 0x2009 +#define WGL_TRANSPARENT_ARB 0x200A +#define WGL_TRANSPARENT_RED_VALUE_ARB 0x2037 +#define WGL_TRANSPARENT_GREEN_VALUE_ARB 0x2038 +#define WGL_TRANSPARENT_BLUE_VALUE_ARB 0x2039 +#define WGL_TRANSPARENT_ALPHA_VALUE_ARB 0x203A +#define WGL_TRANSPARENT_INDEX_VALUE_ARB 0x203B +#define WGL_SHARE_DEPTH_ARB 0x200C +#define WGL_SHARE_STENCIL_ARB 0x200D +#define WGL_SHARE_ACCUM_ARB 0x200E +#define WGL_SUPPORT_GDI_ARB 0x200F +#define WGL_SUPPORT_OPENGL_ARB 0x2010 +#define WGL_DOUBLE_BUFFER_ARB 0x2011 +#define WGL_STEREO_ARB 0x2012 +#define WGL_PIXEL_TYPE_ARB 0x2013 +#define WGL_COLOR_BITS_ARB 0x2014 +#define WGL_RED_BITS_ARB 0x2015 +#define WGL_RED_SHIFT_ARB 0x2016 +#define WGL_GREEN_BITS_ARB 0x2017 +#define WGL_GREEN_SHIFT_ARB 0x2018 +#define WGL_BLUE_BITS_ARB 0x2019 +#define WGL_BLUE_SHIFT_ARB 0x201A +#define WGL_ALPHA_BITS_ARB 0x201B +#define WGL_ALPHA_SHIFT_ARB 0x201C +#define WGL_ACCUM_BITS_ARB 0x201D +#define WGL_ACCUM_RED_BITS_ARB 0x201E +#define WGL_ACCUM_GREEN_BITS_ARB 0x201F +#define WGL_ACCUM_BLUE_BITS_ARB 0x2020 +#define WGL_ACCUM_ALPHA_BITS_ARB 0x2021 +#define WGL_DEPTH_BITS_ARB 0x2022 +#define WGL_STENCIL_BITS_ARB 0x2023 +#define WGL_AUX_BUFFERS_ARB 0x2024 +#define WGL_NO_ACCELERATION_ARB 0x2025 +#define WGL_GENERIC_ACCELERATION_ARB 0x2026 +#define WGL_FULL_ACCELERATION_ARB 0x2027 +#define WGL_SWAP_EXCHANGE_ARB 0x2028 +#define WGL_SWAP_COPY_ARB 0x2029 +#define WGL_SWAP_UNDEFINED_ARB 0x202A +#define WGL_TYPE_RGBA_ARB 0x202B +#define WGL_TYPE_COLORINDEX_ARB 0x202C +#endif + +#ifndef WGL_ARB_make_current_read +#define ERROR_INVALID_PIXEL_TYPE_ARB 0x2043 +#define ERROR_INCOMPATIBLE_DEVICE_CONTEXTS_ARB 0x2054 +#endif + +#ifndef WGL_ARB_pbuffer +#define WGL_DRAW_TO_PBUFFER_ARB 0x202D +#define WGL_MAX_PBUFFER_PIXELS_ARB 0x202E +#define WGL_MAX_PBUFFER_WIDTH_ARB 0x202F +#define WGL_MAX_PBUFFER_HEIGHT_ARB 0x2030 +#define WGL_PBUFFER_LARGEST_ARB 0x2033 +#define WGL_PBUFFER_WIDTH_ARB 0x2034 +#define WGL_PBUFFER_HEIGHT_ARB 0x2035 +#define WGL_PBUFFER_LOST_ARB 0x2036 +#endif + +#ifndef WGL_ARB_render_texture +#define WGL_BIND_TO_TEXTURE_RGB_ARB 0x2070 +#define WGL_BIND_TO_TEXTURE_RGBA_ARB 0x2071 +#define WGL_TEXTURE_FORMAT_ARB 0x2072 +#define WGL_TEXTURE_TARGET_ARB 0x2073 +#define WGL_MIPMAP_TEXTURE_ARB 0x2074 +#define WGL_TEXTURE_RGB_ARB 0x2075 +#define WGL_TEXTURE_RGBA_ARB 0x2076 +#define WGL_NO_TEXTURE_ARB 0x2077 +#define WGL_TEXTURE_CUBE_MAP_ARB 0x2078 +#define WGL_TEXTURE_1D_ARB 0x2079 +#define WGL_TEXTURE_2D_ARB 0x207A +#define WGL_MIPMAP_LEVEL_ARB 0x207B +#define WGL_CUBE_MAP_FACE_ARB 0x207C +#define WGL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x207D +#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x207E +#define WGL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x207F +#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x2080 +#define WGL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x2081 +#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x2082 +#define WGL_FRONT_LEFT_ARB 0x2083 +#define WGL_FRONT_RIGHT_ARB 0x2084 +#define WGL_BACK_LEFT_ARB 0x2085 +#define WGL_BACK_RIGHT_ARB 0x2086 +#define WGL_AUX0_ARB 0x2087 +#define WGL_AUX1_ARB 0x2088 +#define WGL_AUX2_ARB 0x2089 +#define WGL_AUX3_ARB 0x208A +#define WGL_AUX4_ARB 0x208B +#define WGL_AUX5_ARB 0x208C +#define WGL_AUX6_ARB 0x208D +#define WGL_AUX7_ARB 0x208E +#define WGL_AUX8_ARB 0x208F +#define WGL_AUX9_ARB 0x2090 +#endif + +#ifndef WGL_EXT_make_current_read +#define ERROR_INVALID_PIXEL_TYPE_EXT 0x2043 +#endif + +#ifndef WGL_EXT_pixel_format +#define WGL_NUMBER_PIXEL_FORMATS_EXT 0x2000 +#define WGL_DRAW_TO_WINDOW_EXT 0x2001 +#define WGL_DRAW_TO_BITMAP_EXT 0x2002 +#define WGL_ACCELERATION_EXT 0x2003 +#define WGL_NEED_PALETTE_EXT 0x2004 +#define WGL_NEED_SYSTEM_PALETTE_EXT 0x2005 +#define WGL_SWAP_LAYER_BUFFERS_EXT 0x2006 +#define WGL_SWAP_METHOD_EXT 0x2007 +#define WGL_NUMBER_OVERLAYS_EXT 0x2008 +#define WGL_NUMBER_UNDERLAYS_EXT 0x2009 +#define WGL_TRANSPARENT_EXT 0x200A +#define WGL_TRANSPARENT_VALUE_EXT 0x200B +#define WGL_SHARE_DEPTH_EXT 0x200C +#define WGL_SHARE_STENCIL_EXT 0x200D +#define WGL_SHARE_ACCUM_EXT 0x200E +#define WGL_SUPPORT_GDI_EXT 0x200F +#define WGL_SUPPORT_OPENGL_EXT 0x2010 +#define WGL_DOUBLE_BUFFER_EXT 0x2011 +#define WGL_STEREO_EXT 0x2012 +#define WGL_PIXEL_TYPE_EXT 0x2013 +#define WGL_COLOR_BITS_EXT 0x2014 +#define WGL_RED_BITS_EXT 0x2015 +#define WGL_RED_SHIFT_EXT 0x2016 +#define WGL_GREEN_BITS_EXT 0x2017 +#define WGL_GREEN_SHIFT_EXT 0x2018 +#define WGL_BLUE_BITS_EXT 0x2019 +#define WGL_BLUE_SHIFT_EXT 0x201A +#define WGL_ALPHA_BITS_EXT 0x201B +#define WGL_ALPHA_SHIFT_EXT 0x201C +#define WGL_ACCUM_BITS_EXT 0x201D +#define WGL_ACCUM_RED_BITS_EXT 0x201E +#define WGL_ACCUM_GREEN_BITS_EXT 0x201F +#define WGL_ACCUM_BLUE_BITS_EXT 0x2020 +#define WGL_ACCUM_ALPHA_BITS_EXT 0x2021 +#define WGL_DEPTH_BITS_EXT 0x2022 +#define WGL_STENCIL_BITS_EXT 0x2023 +#define WGL_AUX_BUFFERS_EXT 0x2024 +#define WGL_NO_ACCELERATION_EXT 0x2025 +#define WGL_GENERIC_ACCELERATION_EXT 0x2026 +#define WGL_FULL_ACCELERATION_EXT 0x2027 +#define WGL_SWAP_EXCHANGE_EXT 0x2028 +#define WGL_SWAP_COPY_EXT 0x2029 +#define WGL_SWAP_UNDEFINED_EXT 0x202A +#define WGL_TYPE_RGBA_EXT 0x202B +#define WGL_TYPE_COLORINDEX_EXT 0x202C +#endif + +#ifndef WGL_EXT_pbuffer +#define WGL_DRAW_TO_PBUFFER_EXT 0x202D +#define WGL_MAX_PBUFFER_PIXELS_EXT 0x202E +#define WGL_MAX_PBUFFER_WIDTH_EXT 0x202F +#define WGL_MAX_PBUFFER_HEIGHT_EXT 0x2030 +#define WGL_OPTIMAL_PBUFFER_WIDTH_EXT 0x2031 +#define WGL_OPTIMAL_PBUFFER_HEIGHT_EXT 0x2032 +#define WGL_PBUFFER_LARGEST_EXT 0x2033 +#define WGL_PBUFFER_WIDTH_EXT 0x2034 +#define WGL_PBUFFER_HEIGHT_EXT 0x2035 +#endif + +#ifndef WGL_EXT_depth_float +#define WGL_DEPTH_FLOAT_EXT 0x2040 +#endif + +#ifndef WGL_3DFX_multisample +#define WGL_SAMPLE_BUFFERS_3DFX 0x2060 +#define WGL_SAMPLES_3DFX 0x2061 +#endif + +#ifndef WGL_EXT_multisample +#define WGL_SAMPLE_BUFFERS_EXT 0x2041 +#define WGL_SAMPLES_EXT 0x2042 +#endif + +#ifndef WGL_I3D_digital_video_control +#define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_FRAMEBUFFER_I3D 0x2050 +#define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_VALUE_I3D 0x2051 +#define WGL_DIGITAL_VIDEO_CURSOR_INCLUDED_I3D 0x2052 +#define WGL_DIGITAL_VIDEO_GAMMA_CORRECTED_I3D 0x2053 +#endif + +#ifndef WGL_I3D_gamma +#define WGL_GAMMA_TABLE_SIZE_I3D 0x204E +#define WGL_GAMMA_EXCLUDE_DESKTOP_I3D 0x204F +#endif + +#ifndef WGL_I3D_genlock +#define WGL_GENLOCK_SOURCE_MULTIVIEW_I3D 0x2044 +#define WGL_GENLOCK_SOURCE_EXTENAL_SYNC_I3D 0x2045 +#define WGL_GENLOCK_SOURCE_EXTENAL_FIELD_I3D 0x2046 +#define WGL_GENLOCK_SOURCE_EXTENAL_TTL_I3D 0x2047 +#define WGL_GENLOCK_SOURCE_DIGITAL_SYNC_I3D 0x2048 +#define WGL_GENLOCK_SOURCE_DIGITAL_FIELD_I3D 0x2049 +#define WGL_GENLOCK_SOURCE_EDGE_FALLING_I3D 0x204A +#define WGL_GENLOCK_SOURCE_EDGE_RISING_I3D 0x204B +#define WGL_GENLOCK_SOURCE_EDGE_BOTH_I3D 0x204C +#endif + +#ifndef WGL_I3D_image_buffer +#define WGL_IMAGE_BUFFER_MIN_ACCESS_I3D 0x00000001 +#define WGL_IMAGE_BUFFER_LOCK_I3D 0x00000002 +#endif + +#ifndef WGL_I3D_swap_frame_lock +#endif + +#ifndef WGL_NV_render_depth_texture +#define WGL_BIND_TO_TEXTURE_DEPTH_NV 0x20A3 +#define WGL_BIND_TO_TEXTURE_RECTANGLE_DEPTH_NV 0x20A4 +#define WGL_DEPTH_TEXTURE_FORMAT_NV 0x20A5 +#define WGL_TEXTURE_DEPTH_COMPONENT_NV 0x20A6 +#define WGL_DEPTH_COMPONENT_NV 0x20A7 +#endif + +#ifndef WGL_NV_render_texture_rectangle +#define WGL_BIND_TO_TEXTURE_RECTANGLE_RGB_NV 0x20A0 +#define WGL_BIND_TO_TEXTURE_RECTANGLE_RGBA_NV 0x20A1 +#define WGL_TEXTURE_RECTANGLE_NV 0x20A2 +#endif + +#ifndef WGL_NV_float_buffer +#define WGL_FLOAT_COMPONENTS_NV 0x20B0 +#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_R_NV 0x20B1 +#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RG_NV 0x20B2 +#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGB_NV 0x20B3 +#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGBA_NV 0x20B4 +#define WGL_TEXTURE_FLOAT_R_NV 0x20B5 +#define WGL_TEXTURE_FLOAT_RG_NV 0x20B6 +#define WGL_TEXTURE_FLOAT_RGB_NV 0x20B7 +#define WGL_TEXTURE_FLOAT_RGBA_NV 0x20B8 +#endif + + +/*************************************************************/ + +#ifndef WGL_ARB_pbuffer +DECLARE_HANDLE(HPBUFFERARB); +#endif +#ifndef WGL_EXT_pbuffer +DECLARE_HANDLE(HPBUFFEREXT); +#endif + +#ifndef WGL_ARB_buffer_region +#define WGL_ARB_buffer_region 1 +#ifdef WGL_WGLEXT_PROTOTYPES +extern HANDLE WINAPI wglCreateBufferRegionARB (HDC, int, UINT); +extern VOID WINAPI wglDeleteBufferRegionARB (HANDLE); +extern BOOL WINAPI wglSaveBufferRegionARB (HANDLE, int, int, int, int); +extern BOOL WINAPI wglRestoreBufferRegionARB (HANDLE, int, int, int, int, int, int); +#endif /* WGL_WGLEXT_PROTOTYPES */ +typedef HANDLE (WINAPI * PFNWGLCREATEBUFFERREGIONARBPROC) (HDC hDC, int iLayerPlane, UINT uType); +typedef VOID (WINAPI * PFNWGLDELETEBUFFERREGIONARBPROC) (HANDLE hRegion); +typedef BOOL (WINAPI * PFNWGLSAVEBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height); +typedef BOOL (WINAPI * PFNWGLRESTOREBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height, int xSrc, int ySrc); +#endif + +#ifndef WGL_ARB_multisample +#define WGL_ARB_multisample 1 +#endif + +#ifndef WGL_ARB_extensions_string +#define WGL_ARB_extensions_string 1 +#ifdef WGL_WGLEXT_PROTOTYPES +extern const char * WINAPI wglGetExtensionsStringARB (HDC); +#endif /* WGL_WGLEXT_PROTOTYPES */ +typedef const char * (WINAPI * PFNWGLGETEXTENSIONSSTRINGARBPROC) (HDC hdc); +#endif + +#ifndef WGL_ARB_pixel_format +#define WGL_ARB_pixel_format 1 +#ifdef WGL_WGLEXT_PROTOTYPES +extern BOOL WINAPI wglGetPixelFormatAttribivARB (HDC, int, int, UINT, const int *, int *); +extern BOOL WINAPI wglGetPixelFormatAttribfvARB (HDC, int, int, UINT, const int *, FLOAT *); +extern BOOL WINAPI wglChoosePixelFormatARB (HDC, const int *, const FLOAT *, UINT, int *, UINT *); +#endif /* WGL_WGLEXT_PROTOTYPES */ +typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, int *piValues); +typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBFVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, FLOAT *pfValues); +typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATARBPROC) (HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats); +#endif + +#ifndef WGL_ARB_make_current_read +#define WGL_ARB_make_current_read 1 +#ifdef WGL_WGLEXT_PROTOTYPES +extern BOOL WINAPI wglMakeContextCurrentARB (HDC, HDC, HGLRC); +extern HDC WINAPI wglGetCurrentReadDCARB (void); +#endif /* WGL_WGLEXT_PROTOTYPES */ +typedef BOOL (WINAPI * PFNWGLMAKECONTEXTCURRENTARBPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc); +typedef HDC (WINAPI * PFNWGLGETCURRENTREADDCARBPROC) (void); +#endif + +#ifndef WGL_ARB_pbuffer +#define WGL_ARB_pbuffer 1 +#ifdef WGL_WGLEXT_PROTOTYPES +extern HPBUFFERARB WINAPI wglCreatePbufferARB (HDC, int, int, int, const int *); +extern HDC WINAPI wglGetPbufferDCARB (HPBUFFERARB); +extern int WINAPI wglReleasePbufferDCARB (HPBUFFERARB, HDC); +extern BOOL WINAPI wglDestroyPbufferARB (HPBUFFERARB); +extern BOOL WINAPI wglQueryPbufferARB (HPBUFFERARB, int, int *); +#endif /* WGL_WGLEXT_PROTOTYPES */ +typedef HPBUFFERARB (WINAPI * PFNWGLCREATEPBUFFERARBPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int *piAttribList); +typedef HDC (WINAPI * PFNWGLGETPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer); +typedef int (WINAPI * PFNWGLRELEASEPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer, HDC hDC); +typedef BOOL (WINAPI * PFNWGLDESTROYPBUFFERARBPROC) (HPBUFFERARB hPbuffer); +typedef BOOL (WINAPI * PFNWGLQUERYPBUFFERARBPROC) (HPBUFFERARB hPbuffer, int iAttribute, int *piValue); +#endif + +#ifndef WGL_ARB_render_texture +#define WGL_ARB_render_texture 1 +#ifdef WGL_WGLEXT_PROTOTYPES +extern BOOL WINAPI wglBindTexImageARB (HPBUFFERARB, int); +extern BOOL WINAPI wglReleaseTexImageARB (HPBUFFERARB, int); +extern BOOL WINAPI wglSetPbufferAttribARB (HPBUFFERARB, const int *); +#endif /* WGL_WGLEXT_PROTOTYPES */ +typedef BOOL (WINAPI * PFNWGLBINDTEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer); +typedef BOOL (WINAPI * PFNWGLRELEASETEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer); +typedef BOOL (WINAPI * PFNWGLSETPBUFFERATTRIBARBPROC) (HPBUFFERARB hPbuffer, const int *piAttribList); +#endif + +#ifndef WGL_EXT_display_color_table +#define WGL_EXT_display_color_table 1 +#ifdef WGL_WGLEXT_PROTOTYPES +extern GLboolean WINAPI wglCreateDisplayColorTableEXT (GLushort); +extern GLboolean WINAPI wglLoadDisplayColorTableEXT (const GLushort *, GLuint); +extern GLboolean WINAPI wglBindDisplayColorTableEXT (GLushort); +extern VOID WINAPI wglDestroyDisplayColorTableEXT (GLushort); +#endif /* WGL_WGLEXT_PROTOTYPES */ +typedef GLboolean (WINAPI * PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC) (GLushort id); +typedef GLboolean (WINAPI * PFNWGLLOADDISPLAYCOLORTABLEEXTPROC) (const GLushort *table, GLuint length); +typedef GLboolean (WINAPI * PFNWGLBINDDISPLAYCOLORTABLEEXTPROC) (GLushort id); +typedef VOID (WINAPI * PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC) (GLushort id); +#endif + +#ifndef WGL_EXT_extensions_string +#define WGL_EXT_extensions_string 1 +#ifdef WGL_WGLEXT_PROTOTYPES +extern const char * WINAPI wglGetExtensionsStringEXT (void); +#endif /* WGL_WGLEXT_PROTOTYPES */ +typedef const char * (WINAPI * PFNWGLGETEXTENSIONSSTRINGEXTPROC) (void); +#endif + +#ifndef WGL_EXT_make_current_read +#define WGL_EXT_make_current_read 1 +#ifdef WGL_WGLEXT_PROTOTYPES +extern BOOL WINAPI wglMakeContextCurrentEXT (HDC, HDC, HGLRC); +extern HDC WINAPI wglGetCurrentReadDCEXT (void); +#endif /* WGL_WGLEXT_PROTOTYPES */ +typedef BOOL (WINAPI * PFNWGLMAKECONTEXTCURRENTEXTPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc); +typedef HDC (WINAPI * PFNWGLGETCURRENTREADDCEXTPROC) (void); +#endif + +#ifndef WGL_EXT_pbuffer +#define WGL_EXT_pbuffer 1 +#ifdef WGL_WGLEXT_PROTOTYPES +extern HPBUFFEREXT WINAPI wglCreatePbufferEXT (HDC, int, int, int, const int *); +extern HDC WINAPI wglGetPbufferDCEXT (HPBUFFEREXT); +extern int WINAPI wglReleasePbufferDCEXT (HPBUFFEREXT, HDC); +extern BOOL WINAPI wglDestroyPbufferEXT (HPBUFFEREXT); +extern BOOL WINAPI wglQueryPbufferEXT (HPBUFFEREXT, int, int *); +#endif /* WGL_WGLEXT_PROTOTYPES */ +typedef HPBUFFEREXT (WINAPI * PFNWGLCREATEPBUFFEREXTPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int *piAttribList); +typedef HDC (WINAPI * PFNWGLGETPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer); +typedef int (WINAPI * PFNWGLRELEASEPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer, HDC hDC); +typedef BOOL (WINAPI * PFNWGLDESTROYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer); +typedef BOOL (WINAPI * PFNWGLQUERYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer, int iAttribute, int *piValue); +#endif + +#ifndef WGL_EXT_pixel_format +#define WGL_EXT_pixel_format 1 +#ifdef WGL_WGLEXT_PROTOTYPES +extern BOOL WINAPI wglGetPixelFormatAttribivEXT (HDC, int, int, UINT, int *, int *); +extern BOOL WINAPI wglGetPixelFormatAttribfvEXT (HDC, int, int, UINT, int *, FLOAT *); +extern BOOL WINAPI wglChoosePixelFormatEXT (HDC, const int *, const FLOAT *, UINT, int *, UINT *); +#endif /* WGL_WGLEXT_PROTOTYPES */ +typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int *piAttributes, int *piValues); +typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBFVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int *piAttributes, FLOAT *pfValues); +typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATEXTPROC) (HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats); +#endif + +#ifndef WGL_EXT_swap_control +#define WGL_EXT_swap_control 1 +#ifdef WGL_WGLEXT_PROTOTYPES +extern BOOL WINAPI wglSwapIntervalEXT (int); +extern int WINAPI wglGetSwapIntervalEXT (void); +#endif /* WGL_WGLEXT_PROTOTYPES */ +typedef BOOL (WINAPI * PFNWGLSWAPINTERVALEXTPROC) (int interval); +typedef int (WINAPI * PFNWGLGETSWAPINTERVALEXTPROC) (void); +#endif + +#ifndef WGL_EXT_depth_float +#define WGL_EXT_depth_float 1 +#endif + +#ifndef WGL_NV_vertex_array_range +#define WGL_NV_vertex_array_range 1 +#ifdef WGL_WGLEXT_PROTOTYPES +extern void* WINAPI wglAllocateMemoryNV (GLsizei, GLfloat, GLfloat, GLfloat); +extern void WINAPI wglFreeMemoryNV (void *); +#endif /* WGL_WGLEXT_PROTOTYPES */ +typedef void* (WINAPI * PFNWGLALLOCATEMEMORYNVPROC) (GLsizei size, GLfloat readfreq, GLfloat writefreq, GLfloat priority); +typedef void (WINAPI * PFNWGLFREEMEMORYNVPROC) (void *pointer); +#endif + +#ifndef WGL_3DFX_multisample +#define WGL_3DFX_multisample 1 +#endif + +#ifndef WGL_EXT_multisample +#define WGL_EXT_multisample 1 +#endif + +#ifndef WGL_OML_sync_control +#define WGL_OML_sync_control 1 +#ifdef WGL_WGLEXT_PROTOTYPES +extern BOOL WINAPI wglGetSyncValuesOML (HDC, INT64 *, INT64 *, INT64 *); +extern BOOL WINAPI wglGetMscRateOML (HDC, INT32 *, INT32 *); +extern INT64 WINAPI wglSwapBuffersMscOML (HDC, INT64, INT64, INT64); +extern INT64 WINAPI wglSwapLayerBuffersMscOML (HDC, int, INT64, INT64, INT64); +extern BOOL WINAPI wglWaitForMscOML (HDC, INT64, INT64, INT64, INT64 *, INT64 *, INT64 *); +extern BOOL WINAPI wglWaitForSbcOML (HDC, INT64, INT64 *, INT64 *, INT64 *); +#endif /* WGL_WGLEXT_PROTOTYPES */ +typedef BOOL (WINAPI * PFNWGLGETSYNCVALUESOMLPROC) (HDC hdc, INT64 *ust, INT64 *msc, INT64 *sbc); +typedef BOOL (WINAPI * PFNWGLGETMSCRATEOMLPROC) (HDC hdc, INT32 *numerator, INT32 *denominator); +typedef INT64 (WINAPI * PFNWGLSWAPBUFFERSMSCOMLPROC) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder); +typedef INT64 (WINAPI * PFNWGLSWAPLAYERBUFFERSMSCOMLPROC) (HDC hdc, int fuPlanes, INT64 target_msc, INT64 divisor, INT64 remainder); +typedef BOOL (WINAPI * PFNWGLWAITFORMSCOMLPROC) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder, INT64 *ust, INT64 *msc, INT64 *sbc); +typedef BOOL (WINAPI * PFNWGLWAITFORSBCOMLPROC) (HDC hdc, INT64 target_sbc, INT64 *ust, INT64 *msc, INT64 *sbc); +#endif + +#ifndef WGL_I3D_digital_video_control +#define WGL_I3D_digital_video_control 1 +#ifdef WGL_WGLEXT_PROTOTYPES +extern BOOL WINAPI wglGetDigitalVideoParametersI3D (HDC, int, int *); +extern BOOL WINAPI wglSetDigitalVideoParametersI3D (HDC, int, const int *); +#endif /* WGL_WGLEXT_PROTOTYPES */ +typedef BOOL (WINAPI * PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC) (HDC hDC, int iAttribute, int *piValue); +typedef BOOL (WINAPI * PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC) (HDC hDC, int iAttribute, const int *piValue); +#endif + +#ifndef WGL_I3D_gamma +#define WGL_I3D_gamma 1 +#ifdef WGL_WGLEXT_PROTOTYPES +extern BOOL WINAPI wglGetGammaTableParametersI3D (HDC, int, int *); +extern BOOL WINAPI wglSetGammaTableParametersI3D (HDC, int, const int *); +extern BOOL WINAPI wglGetGammaTableI3D (HDC, int, USHORT *, USHORT *, USHORT *); +extern BOOL WINAPI wglSetGammaTableI3D (HDC, int, const USHORT *, const USHORT *, const USHORT *); +#endif /* WGL_WGLEXT_PROTOTYPES */ +typedef BOOL (WINAPI * PFNWGLGETGAMMATABLEPARAMETERSI3DPROC) (HDC hDC, int iAttribute, int *piValue); +typedef BOOL (WINAPI * PFNWGLSETGAMMATABLEPARAMETERSI3DPROC) (HDC hDC, int iAttribute, const int *piValue); +typedef BOOL (WINAPI * PFNWGLGETGAMMATABLEI3DPROC) (HDC hDC, int iEntries, USHORT *puRed, USHORT *puGreen, USHORT *puBlue); +typedef BOOL (WINAPI * PFNWGLSETGAMMATABLEI3DPROC) (HDC hDC, int iEntries, const USHORT *puRed, const USHORT *puGreen, const USHORT *puBlue); +#endif + +#ifndef WGL_I3D_genlock +#define WGL_I3D_genlock 1 +#ifdef WGL_WGLEXT_PROTOTYPES +extern BOOL WINAPI wglEnableGenlockI3D (HDC); +extern BOOL WINAPI wglDisableGenlockI3D (HDC); +extern BOOL WINAPI wglIsEnabledGenlockI3D (HDC, BOOL *); +extern BOOL WINAPI wglGenlockSourceI3D (HDC, UINT); +extern BOOL WINAPI wglGetGenlockSourceI3D (HDC, UINT *); +extern BOOL WINAPI wglGenlockSourceEdgeI3D (HDC, UINT); +extern BOOL WINAPI wglGetGenlockSourceEdgeI3D (HDC, UINT *); +extern BOOL WINAPI wglGenlockSampleRateI3D (HDC, UINT); +extern BOOL WINAPI wglGetGenlockSampleRateI3D (HDC, UINT *); +extern BOOL WINAPI wglGenlockSourceDelayI3D (HDC, UINT); +extern BOOL WINAPI wglGetGenlockSourceDelayI3D (HDC, UINT *); +extern BOOL WINAPI wglQueryGenlockMaxSourceDelayI3D (HDC, UINT *, UINT *); +#endif /* WGL_WGLEXT_PROTOTYPES */ +typedef BOOL (WINAPI * PFNWGLENABLEGENLOCKI3DPROC) (HDC hDC); +typedef BOOL (WINAPI * PFNWGLDISABLEGENLOCKI3DPROC) (HDC hDC); +typedef BOOL (WINAPI * PFNWGLISENABLEDGENLOCKI3DPROC) (HDC hDC, BOOL *pFlag); +typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEI3DPROC) (HDC hDC, UINT uSource); +typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEI3DPROC) (HDC hDC, UINT *uSource); +typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEEDGEI3DPROC) (HDC hDC, UINT uEdge); +typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEEDGEI3DPROC) (HDC hDC, UINT *uEdge); +typedef BOOL (WINAPI * PFNWGLGENLOCKSAMPLERATEI3DPROC) (HDC hDC, UINT uRate); +typedef BOOL (WINAPI * PFNWGLGETGENLOCKSAMPLERATEI3DPROC) (HDC hDC, UINT *uRate); +typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEDELAYI3DPROC) (HDC hDC, UINT uDelay); +typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEDELAYI3DPROC) (HDC hDC, UINT *uDelay); +typedef BOOL (WINAPI * PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC) (HDC hDC, UINT *uMaxLineDelay, UINT *uMaxPixelDelay); +#endif + +#ifndef WGL_I3D_image_buffer +#define WGL_I3D_image_buffer 1 +#ifdef WGL_WGLEXT_PROTOTYPES +extern LPVOID WINAPI wglCreateImageBufferI3D (HDC, DWORD, UINT); +extern BOOL WINAPI wglDestroyImageBufferI3D (HDC, LPVOID); +extern BOOL WINAPI wglAssociateImageBufferEventsI3D (HDC, const HANDLE *, const LPVOID *, const DWORD *, UINT); +extern BOOL WINAPI wglReleaseImageBufferEventsI3D (HDC, const LPVOID *, UINT); +#endif /* WGL_WGLEXT_PROTOTYPES */ +typedef LPVOID (WINAPI * PFNWGLCREATEIMAGEBUFFERI3DPROC) (HDC hDC, DWORD dwSize, UINT uFlags); +typedef BOOL (WINAPI * PFNWGLDESTROYIMAGEBUFFERI3DPROC) (HDC hDC, LPVOID pAddress); +typedef BOOL (WINAPI * PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC) (HDC hDC, const HANDLE *pEvent, const LPVOID *pAddress, const DWORD *pSize, UINT count); +typedef BOOL (WINAPI * PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC) (HDC hDC, const LPVOID *pAddress, UINT count); +#endif + +#ifndef WGL_I3D_swap_frame_lock +#define WGL_I3D_swap_frame_lock 1 +#ifdef WGL_WGLEXT_PROTOTYPES +extern BOOL WINAPI wglEnableFrameLockI3D (void); +extern BOOL WINAPI wglDisableFrameLockI3D (void); +extern BOOL WINAPI wglIsEnabledFrameLockI3D (BOOL *); +extern BOOL WINAPI wglQueryFrameLockMasterI3D (BOOL *); +#endif /* WGL_WGLEXT_PROTOTYPES */ +typedef BOOL (WINAPI * PFNWGLENABLEFRAMELOCKI3DPROC) (void); +typedef BOOL (WINAPI * PFNWGLDISABLEFRAMELOCKI3DPROC) (void); +typedef BOOL (WINAPI * PFNWGLISENABLEDFRAMELOCKI3DPROC) (BOOL *pFlag); +typedef BOOL (WINAPI * PFNWGLQUERYFRAMELOCKMASTERI3DPROC) (BOOL *pFlag); +#endif + +#ifndef WGL_I3D_swap_frame_usage +#define WGL_I3D_swap_frame_usage 1 +#ifdef WGL_WGLEXT_PROTOTYPES +extern BOOL WINAPI wglGetFrameUsageI3D (float *); +extern BOOL WINAPI wglBeginFrameTrackingI3D (void); +extern BOOL WINAPI wglEndFrameTrackingI3D (void); +extern BOOL WINAPI wglQueryFrameTrackingI3D (DWORD *, DWORD *, float *); +#endif /* WGL_WGLEXT_PROTOTYPES */ +typedef BOOL (WINAPI * PFNWGLGETFRAMEUSAGEI3DPROC) (float *pUsage); +typedef BOOL (WINAPI * PFNWGLBEGINFRAMETRACKINGI3DPROC) (void); +typedef BOOL (WINAPI * PFNWGLENDFRAMETRACKINGI3DPROC) (void); +typedef BOOL (WINAPI * PFNWGLQUERYFRAMETRACKINGI3DPROC) (DWORD *pFrameCount, DWORD *pMissedFrames, float *pLastMissedUsage); +#endif + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Windows/GL/win32_glx.h b/Source/Plugins/Plugin_VideoOGL/Src/Windows/GL/win32_glx.h new file mode 100644 index 0000000000..fd3c503550 --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/Windows/GL/win32_glx.h @@ -0,0 +1,58 @@ +#ifndef __win32_glx_h__ +#define __win32_glx_h__ + +/* Copyright (c) Nate Robins, 1997. */ + +/* This program is freely distributable without licensing fees + and is provided without guarantee or warrantee expressed or + implied. This program is -not- in the public domain. */ + +#include "win32_x11.h" + +/* Type definitions (conversions). */ +typedef HGLRC GLXContext; + +#define GLX_USE_GL 1 /* support GLX rendering */ +#define GLX_BUFFER_SIZE 2 /* depth of the color buffer */ +#define GLX_LEVEL 3 /* level in plane stacking */ +#define GLX_RGBA 4 /* true if RGBA mode */ +#define GLX_DOUBLEBUFFER 5 /* double buffering supported */ +#define GLX_STEREO 6 /* stereo buffering supported */ +#define GLX_AUX_BUFFERS 7 /* number of aux buffers */ +#define GLX_RED_SIZE 8 /* number of red component bits */ +#define GLX_GREEN_SIZE 9 /* number of green component bits */ +#define GLX_BLUE_SIZE 10 /* number of blue component bits */ +#define GLX_ALPHA_SIZE 11 /* number of alpha component bits */ +#define GLX_DEPTH_SIZE 12 /* number of depth bits */ +#define GLX_STENCIL_SIZE 13 /* number of stencil bits */ +#define GLX_ACCUM_RED_SIZE 14 /* number of red accum bits */ +#define GLX_ACCUM_GREEN_SIZE 15 /* number of green accum bits */ +#define GLX_ACCUM_BLUE_SIZE 16 /* number of blue accum bits */ +#define GLX_ACCUM_ALPHA_SIZE 17 /* number of alpha accum bits */ + +#define GLX_BAD_ATTRIB 2 +#define GLX_BAD_VISUAL 4 + +/* Functions emulated by macros. */ + +#define glXDestroyContext(display, context) \ + wglDeleteContext(context) + +/* Function prototypes. */ + +extern GLXContext glXCreateContext( + Display* display, + XVisualInfo* visinfo, + GLXContext share, + Bool direct); +extern int glXGetConfig( + Display* display, + XVisualInfo* visual, + int attrib, + int* value); +extern XVisualInfo* glXChooseVisual( + Display* display, + int screen, + int* attribList); + +#endif /* __win32_glx_h__ */ diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Windows/GL/win32_x11.h b/Source/Plugins/Plugin_VideoOGL/Src/Windows/GL/win32_x11.h new file mode 100644 index 0000000000..5aed5b89de --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/Windows/GL/win32_x11.h @@ -0,0 +1,319 @@ +#ifndef __win32_x11_h__ +#define __win32_x11_h__ + +/* Copyright (c) Nate Robins, 1997. */ + +/* This program is freely distributable without licensing fees + and is provided without guarantee or warrantee expressed or + implied. This program is -not- in the public domain. */ + +#include +#include + +/* Type definitions (conversions) */ +typedef int Visual; /* Win32 equivalent of X11 type */ +typedef HWND Window; +typedef HPALETTE Colormap; +typedef PIXELFORMATDESCRIPTOR XVisualInfo; +typedef BOOL Bool; +typedef MSG XEvent; +typedef HDC Display; +typedef HCURSOR Cursor; + +typedef int Atom; /* dummies */ +typedef int XDevice; +typedef int Status; + +#define True TRUE /* Win32 equivalents of X11 booleans */ +#define False FALSE + +#define None 0L /* universal null resource or null atom */ + +/* Input Event Masks. Used as event-mask window attribute and as arguments + to Grab requests. Not to be confused with event names. */ + +#define NoEventMask 0L +#define KeyPressMask (1L<<0) +#define KeyReleaseMask (1L<<1) +#define ButtonPressMask (1L<<2) +#define ButtonReleaseMask (1L<<3) +#define EnterWindowMask (1L<<4) +#define LeaveWindowMask (1L<<5) +#define PointerMotionMask (1L<<6) +#define PointerMotionHintMask (1L<<7) +#define Button1MotionMask (1L<<8) +#define Button2MotionMask (1L<<9) +#define Button3MotionMask (1L<<10) +#define Button4MotionMask (1L<<11) +#define Button5MotionMask (1L<<12) +#define ButtonMotionMask (1L<<13) +#define KeymapStateMask (1L<<14) +#define ExposureMask (1L<<15) +#define VisibilityChangeMask (1L<<16) +#define StructureNotifyMask (1L<<17) +#define ResizeRedirectMask (1L<<18) +#define SubstructureNotifyMask (1L<<19) +#define SubstructureRedirectMask (1L<<20) +#define FocusChangeMask (1L<<21) +#define PropertyChangeMask (1L<<22) +#define ColormapChangeMask (1L<<23) +#define OwnerGrabButtonMask (1L<<24) + +/* Key masks. Used as modifiers to GrabButton and GrabKey, results of + QueryPointer, state in various key-, mouse-, and button-related + events. */ + +#define ShiftMask (1<<0) +#define LockMask (1<<1) +#define ControlMask (1<<2) +#define Mod1Mask (1<<3) +#define Mod2Mask (1<<4) +#define Mod3Mask (1<<5) +#define Mod4Mask (1<<6) +#define Mod5Mask (1<<7) + +/* Window classes used by CreateWindow */ +/* Note that CopyFromParent is already defined as 0 above */ + +#define InputOutput 1 +#define InputOnly 2 + +/* Window attributes for CreateWindow and ChangeWindowAttributes */ + +#define CWBackPixmap (1L<<0) +#define CWBackPixel (1L<<1) +#define CWBorderPixmap (1L<<2) +#define CWBorderPixel (1L<<3) +#define CWBitGravity (1L<<4) +#define CWWinGravity (1L<<5) +#define CWBackingStore (1L<<6) +#define CWBackingPlanes (1L<<7) +#define CWBackingPixel (1L<<8) +#define CWOverrideRedirect (1L<<9) +#define CWSaveUnder (1L<<10) +#define CWEventMask (1L<<11) +#define CWDontPropagate (1L<<12) +#define CWColormap (1L<<13) +#define CWCursor (1L<<14) + +/* ConfigureWindow structure */ + +#define CWX (1<<0) +#define CWY (1<<1) +#define CWWidth (1<<2) +#define CWHeight (1<<3) +#define CWBorderWidth (1<<4) +#define CWSibling (1<<5) +#define CWStackMode (1<<6) + + +/* Used in GetWindowAttributes reply */ + +#define IsUnmapped 0 +#define IsUnviewable 1 +#define IsViewable 2 + +/* Window stacking method (in configureWindow) */ + +#define Above 0 +#define Below 1 +#define TopIf 2 +#define BottomIf 3 +#define Opposite 4 + +/* For CreateColormap */ + +#define AllocNone 0 /* create map with no entries */ +#define AllocAll 1 /* allocate entire map writeable */ + + +/* Flags used in StoreNamedColor, StoreColors */ + +#define DoRed (1<<0) +#define DoGreen (1<<1) +#define DoBlue (1<<2) + +/* + * Bitmask returned by XParseGeometry(). Each bit tells if the corresponding + * value (x, y, width, height) was found in the parsed string. + */ +#define NoValue 0x0000 +#define XValue 0x0001 +#define YValue 0x0002 +#define WidthValue 0x0004 +#define HeightValue 0x0008 +#define AllValues 0x000F +#define XNegative 0x0010 +#define YNegative 0x0020 + +/* flags argument in size hints */ +#define USPosition (1L << 0) /* user specified x, y */ +#define USSize (1L << 1) /* user specified width, height */ + +/* definitions for initial window state */ +#define WithdrawnState 0 /* for windows that are not mapped */ +#define NormalState 1 /* most applications want to start this way */ +#define IconicState 3 /* application wants to start as an icon */ +#define GameModeState 4 /* Win32 GLUT only (not in Xlib!). */ + +/* Type definitions */ + +typedef struct { + unsigned int background_pixmap; /* background pixmap */ + unsigned long background_pixel; /* background pixel */ + unsigned long border_pixel; /* border pixel value */ + long event_mask; /* set of events that should be saved */ + long do_not_propagate_mask; /* set of events that should not propagate */ + Bool override_redirect; /* boolean value for override-redirect */ + Colormap colormap; /* color map to be associated with window */ +} XSetWindowAttributes; + +typedef struct { + unsigned long pixel; + unsigned short red, green, blue; + char flags; /* do_red, do_green, do_blue */ +} XColor; + +typedef struct { + unsigned char *value; /* same as Property routines */ + Atom encoding; /* prop type */ + int format; /* prop data format: 8, 16, or 32 */ + unsigned long nitems; /* number of data items in value */ +} XTextProperty; + +typedef struct { + long flags; /* marks which fields in this structure are defined */ + int x, y; /* obsolete for new window mgrs, but clients */ + int width, height; /* should set so old wm's don't mess up */ +} XSizeHints; + +/* Functions emulated by macros. */ + +#define XFreeColormap(display, colormap) \ + DeleteObject(colormap) + +#define XCreateFontCursor(display, shape) \ + LoadCursor(NULL, shape) + +#define XDefineCursor(display, window, cursor) \ + SetCursor(cursor) + +#define XFlush(display) \ + /* Nothing. */ + +#define DisplayWidth(display, screen) \ + GetSystemMetrics(SM_CXSCREEN) + +#define DisplayHeight(display, screen) \ + GetSystemMetrics(SM_CYSCREEN) + +#define XMapWindow(display, window) \ + ShowWindow(window, SW_SHOWNORMAL) + +#define XUnmapWindow(display, window) \ + ShowWindow(window, SW_HIDE) + +#define XIconifyWindow(display, window, screen) \ + ShowWindow(window, SW_MINIMIZE) + +#define XWithdrawWindow(display, window, screen) \ + ShowWindow(window, SW_HIDE) + +#define XLowerWindow(display, window) \ + SetWindowPos(window, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE) + +#define XSetWMName(display, window, tp) \ + SetWindowText(window, (tp)->value) + +/* There really isn't a way to set the icon name separate from the + windows name in Win32, so, just set the windows name. */ +#define XSetWMIconName(display, window, tp) \ + XSetWMName(display, window, tp) + +#define XDestroyWindow(display, window) \ + DestroyWindow(window) + +/* Anything that needs to be freed was allocated with malloc in our + fake X windows library for Win32, so free it with plain old + free(). */ +#define XFree(data) \ + free(data) + +/* Nothing to be done for this...the pointer is always 'ungrabbed' + in Win32. */ +#define XUngrabPointer(display, time) \ + /* Nothing. */ + +/* Function prototypes. */ + +extern XVisualInfo* XGetVisualInfo( + Display* display, + long mask, + XVisualInfo* ttemplate, /* Avoid class with C++ keyword. */ + int*nitems); + +extern Colormap XCreateColormap( + Display* display, + Window root, + Visual* visual, + int alloc); + +extern void XAllocColorCells( + Display* display, + Colormap colormap, + Bool contig, + unsigned long plane_masks_return[], + unsigned int nplanes, + unsigned long pixels_return[], + unsigned int npixels); + +extern void XStoreColor( + Display* display, + Colormap colormap, + XColor* color); + +extern void XSetWindowColormap( + Display* display, + Window window, + Colormap colormap); + +extern Bool XTranslateCoordinates( + Display *display, + Window src, Window dst, + int src_x, int src_y, + int* dest_x_return, int* dest_y_return, + Window* child_return); + +extern Status XGetGeometry( + Display* display, + Window window, + Window* root_return, + int* x_return, int* y_return, + unsigned int* width_return, unsigned int* height_return, + unsigned int *border_width_return, + unsigned int* depth_return); + +extern int DisplayWidthMM( + Display* display, + int screen); + +extern int DisplayHeightMM( + Display* display, + int screen); + +extern void XWarpPointer( + Display* display, + Window src, Window dst, + int src_x, int src_y, + int src_width, int src_height, + int dst_x, int dst_y); + +extern int XParseGeometry( + char* string, + int* x, int* y, + unsigned int* width, unsigned int* height); + +extern int XPending( + Display* display); + +#endif /* __win32_x11_h__ */ diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Windows/Misc.cpp b/Source/Plugins/Plugin_VideoOGL/Src/Windows/Misc.cpp new file mode 100644 index 0000000000..bb399f624e --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/Windows/Misc.cpp @@ -0,0 +1,130 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include +#include + +#include "Misc.h" + +namespace W32Util +{ + //shamelessly taken from http://www.catch22.org.uk/tuts/tips.asp + void CenterWindow(HWND hwnd) + { + HWND hwndParent; + RECT rect, rectP; + int width, height; + int screenwidth, screenheight; + int x, y; + + //make the window relative to its parent + hwndParent = GetParent(hwnd); + if (!hwndParent) + return; + + GetWindowRect(hwnd, &rect); + GetWindowRect(hwndParent, &rectP); + + width = rect.right - rect.left; + height = rect.bottom - rect.top; + + x = ((rectP.right-rectP.left) - width) / 2 + rectP.left; + y = ((rectP.bottom-rectP.top) - height) / 2 + rectP.top; + + screenwidth = GetSystemMetrics(SM_CXSCREEN); + screenheight = GetSystemMetrics(SM_CYSCREEN); + + //make sure that the dialog box never moves outside of + //the screen + if (x < 0) x = 0; + if (y < 0) y = 0; + if (x + width > screenwidth) x = screenwidth - width; + if (y + height > screenheight) y = screenheight - height; + + MoveWindow(hwnd, x, y, width, height, FALSE); + } + + HBITMAP CreateBitmapFromARGB(HWND someHwnd, DWORD *image, int w, int h) + { + BITMAPINFO *bitmap_header; + static char bitmapbuffer[sizeof(BITMAPINFO)+16]; + memset(bitmapbuffer,0,sizeof(BITMAPINFO)+16); + bitmap_header=(BITMAPINFO *)bitmapbuffer; + bitmap_header->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + bitmap_header->bmiHeader.biPlanes = 1; + bitmap_header->bmiHeader.biBitCount = 32; + bitmap_header->bmiHeader.biCompression = BI_RGB; + bitmap_header->bmiHeader.biWidth = w; + bitmap_header->bmiHeader.biHeight = -h; + + ((unsigned long *)bitmap_header->bmiColors)[0] = 0x00FF0000; + ((unsigned long *)bitmap_header->bmiColors)[1] = 0x0000FF00; + ((unsigned long *)bitmap_header->bmiColors)[2] = 0x000000FF; + + HDC dc = GetDC(someHwnd); + HBITMAP bitmap = CreateDIBitmap(dc,&bitmap_header->bmiHeader,CBM_INIT,image,bitmap_header,DIB_RGB_COLORS); + ReleaseDC(someHwnd,dc); + return bitmap; + } + + void NiceSizeFormat(size_t size, char *out) + { + char *sizes[] = {"b","KB","MB","GB","TB","PB","EB"}; + int s = 0; + int frac = 0; + while (size>1024) + { + s++; + frac = (int)size & 1023; + size /= 1024; + } + float f = (float)size + ((float)frac / 1024.0f); + sprintf(out,"%3.1f %s",f,sizes[s]); + } + BOOL CopyTextToClipboard(HWND hwnd, TCHAR *text) + { + OpenClipboard(hwnd); + EmptyClipboard(); + HANDLE hglbCopy = GlobalAlloc(GMEM_MOVEABLE, (strlen(text) + 1) * sizeof(TCHAR)); + if (hglbCopy == NULL) + { + CloseClipboard(); + return FALSE; + } + + // Lock the handle and copy the text to the buffer. + + TCHAR *lptstrCopy = (TCHAR *)GlobalLock(hglbCopy); + strcpy(lptstrCopy, text); + lptstrCopy[strlen(text)] = (TCHAR) 0; // null character + GlobalUnlock(hglbCopy); + SetClipboardData(CF_TEXT,hglbCopy); + CloseClipboard(); + return TRUE; + } +} + +void SysMessage(char *fmt, ...) +{ + va_list list; + char tmp[512]; + + va_start(list,fmt); + vsprintf(tmp,fmt,list); + va_end(list); + MessageBox(0, tmp, "Video-Plugin", 0); +} diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Windows/Misc.h b/Source/Plugins/Plugin_VideoOGL/Src/Windows/Misc.h new file mode 100644 index 0000000000..662d8d0059 --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/Windows/Misc.h @@ -0,0 +1,28 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#pragma once + +#include "stdafx.h" + +namespace W32Util +{ + void CenterWindow(HWND hwnd); + HBITMAP CreateBitmapFromARGB(HWND someHwnd, DWORD *image, int w, int h); + void NiceSizeFormat(size_t size, char *out); + BOOL CopyTextToClipboard(HWND hwnd, TCHAR *text); +} \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Windows/PropertySheet.cpp b/Source/Plugins/Plugin_VideoOGL/Src/Windows/PropertySheet.cpp new file mode 100644 index 0000000000..62089ca255 --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/Windows/PropertySheet.cpp @@ -0,0 +1,244 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "Misc.h" +#include "PropertySheet.h" + +#include + +namespace W32Util +{ + bool centered; + + PropSheet::PropSheet() + { + watermark = 0; + header = 0; + icon = 0; + } + + int CALLBACK PropSheet::Callback(HWND hwndDlg, UINT uMsg, LPARAM lParam) + { + switch (uMsg) { + case PSCB_PRECREATE: + { + if (uMsg == PSCB_PRECREATE) + { + /* + if (lParam) + { + DLGTEMPLATE *pDlgTemplate; + DLGTEMPLATEEX *pDlgTemplateEx; + + pDlgTemplateEx = (DLGTEMPLATEEX *)lParam; + if (pDlgTemplateEx->signature == 0xFFFF) + { + // pDlgTemplateEx points to an extended + // dialog template structure. + + //pDlgTemplate->style |= DS_SETFONT; + u8 *tmp1 = (u8*)&pDlgTemplateEx + sizeof(DLGTEMPLATEEX); + u16 *tmp = (u16*)tmp1; + tmp++; //skip menu + tmp++; //skip dlg class + //Crash(); + //Here we should bash in Segoe UI + //It turns out to be way complicated though + //Not worth it + } + else + { + // This is a standard dialog template + // structure. + pDlgTemplate = (DLGTEMPLATE *)lParam; + } + } */ + } + + } + break; + case PSCB_INITIALIZED: + { + } + return 0; + } + return 0; + } + + void PropSheet::Show(HINSTANCE hInstance, HWND hParent, std::string title, int startpage, bool floating, bool wizard) + { + HPROPSHEETPAGE *pages = new HPROPSHEETPAGE[list.size()]; + PROPSHEETPAGE page; + //common settings + memset((void*)&page,0,sizeof(PROPSHEETPAGE)); + page.dwSize = sizeof(PROPSHEETPAGE); + page.hInstance = hInstance; + + int i=0; + for (DlgList::iterator iter = list.begin(); iter != list.end(); iter++, i++) + { + if (wizard) + { + if (i == 0 || i == list.size()-1) + page.dwFlags = PSP_HIDEHEADER; + else + page.dwFlags = PSP_USEHEADERTITLE|PSP_USEHEADERSUBTITLE; + } + else + { + page.dwFlags = PSP_USETITLE; + } + page.pszTemplate = iter->resource; + page.pfnDlgProc = Tab::TabDlgProc; + page.pszTitle = iter->title; + page.pszHeaderTitle = wizard?iter->title:0; + page.pszHeaderSubTitle = wizard?iter->hdrSubTitle:0; + page.lParam = (LPARAM)iter->tab; + pages[i] = CreatePropertySheetPage(&page); + } + + PROPSHEETHEADER sheet; + memset(&sheet,0,sizeof(sheet)); + sheet.dwSize = sizeof(PROPSHEETHEADER); + sheet.hInstance = hInstance; + sheet.hwndParent = hParent; + sheet.pszbmWatermark = watermark; + sheet.pszbmHeader = header; + + if (icon) + sheet.hIcon = icon; + + if (wizard) + sheet.dwFlags = PSH_USECALLBACK | PSH_WIZARD97 | (watermark?PSH_WATERMARK:0) | (header?PSH_HEADER:0); + else + sheet.dwFlags = PSH_USECALLBACK | PSH_PROPTITLE; + + sheet.dwFlags |= PSH_NOCONTEXTHELP; + + if (floating) + sheet.dwFlags |= PSH_MODELESS; + //else + // sheet.dwFlags |= PSH_NOAPPLYNOW; + + if (icon) + sheet.dwFlags |= PSH_USEHICON; + + sheet.pszCaption = title.c_str(); + sheet.nPages = (UINT)list.size(); + sheet.phpage = pages; + sheet.nStartPage = startpage; + sheet.pfnCallback = (PFNPROPSHEETCALLBACK)Callback; + + NONCLIENTMETRICS ncm = {0}; + ncm.cbSize = sizeof(ncm); + SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, &ncm, 0); + hDialogFont = CreateFontIndirect(&ncm.lfMessageFont); + + if (wizard) + { + + //Create the intro/end title font + LOGFONT TitleLogFont = ncm.lfMessageFont; + TitleLogFont.lfWeight = FW_BOLD; + lstrcpy(TitleLogFont.lfFaceName, TEXT("Verdana Bold")); + //StringCchCopy(TitleLogFont.lfFaceName, 32, TEXT("Verdana Bold")); + + HDC hdc = GetDC(NULL); //gets the screen DC + INT FontSize = 12; + TitleLogFont.lfHeight = 0 - GetDeviceCaps(hdc, LOGPIXELSY) * FontSize / 72; + hTitleFont = CreateFontIndirect(&TitleLogFont); + ReleaseDC(NULL, hdc); + } + else + hTitleFont = 0; + + centered=false; + PropertySheet(&sheet); + if (!floating) + { + for (DlgList::iterator iter = list.begin(); iter != list.end(); iter++) + { + delete iter->tab; + } + DeleteObject(hTitleFont); + } + DeleteObject(hDialogFont); + delete [] pages; + } + void PropSheet::Add(Tab *tab, LPCTSTR resource, LPCTSTR title, LPCTSTR subtitle) + { + tab->sheet = this; + list.push_back(Page(tab,resource,title,subtitle)); + } + + + void WizExteriorPage::Init(HWND hDlg) + { + HWND hwndControl = GetDlgItem(hDlg, captionID); + //SetWindowFont(hwndControl, sheet->GetTitleFont(), TRUE); + SendMessage(hwndControl,WM_SETFONT,(WPARAM)sheet->GetTitleFont(),0); + } + + INT_PTR Tab::TabDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) + { + Tab *tab = (Tab *)GetWindowLongPtr(hDlg, GWLP_USERDATA); + switch(message) + { + case WM_INITDIALOG: + { + if (!centered) //HACK + { + CenterWindow(GetParent(hDlg)); + centered=true; + } + LPARAM l = ((LPPROPSHEETPAGE)lParam)->lParam; + tab = (Tab *)l; + SetWindowLongPtr(hDlg, GWLP_USERDATA, (DWORD_PTR)l); + tab->Init(hDlg); + } + break; + + case WM_COMMAND: + tab->Command(hDlg,wParam); + break; + case WM_NOTIFY: + { + LPPSHNOTIFY lppsn = (LPPSHNOTIFY) lParam; + HWND sheet = lppsn->hdr.hwndFrom; + switch(lppsn->hdr.code) { + case PSN_APPLY: + tab->Apply(hDlg); + break; + case PSN_SETACTIVE: + PropSheet_SetWizButtons(GetParent(hDlg), + (tab->HasPrev()?PSWIZB_BACK:0) | + (tab->HasNext()?PSWIZB_NEXT:0) | + (tab->HasFinish()?PSWIZB_FINISH:0)); + break; + case PSN_WIZNEXT: + tab->Apply(hDlg); //maybe not always good + break; + case PSN_WIZBACK: + case PSN_RESET: //cancel + break; + } + } + break; + } + return 0; + } +} diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Windows/PropertySheet.h b/Source/Plugins/Plugin_VideoOGL/Src/Windows/PropertySheet.h new file mode 100644 index 0000000000..2d69c650af --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/Windows/PropertySheet.h @@ -0,0 +1,104 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#pragma once + +#include "stdafx.h" +#include + +namespace W32Util +{ + class PropSheet; + + class Tab + { + public: + PropSheet *sheet; //back pointer .. + virtual void Init(HWND hDlg) {} + virtual void Command(HWND hDlg, WPARAM wParam) {} + virtual void Apply(HWND hDlg) {} + virtual bool HasPrev() {return true;} + virtual bool HasFinish() {return false;} + virtual bool HasNext() {return true;} + static INT_PTR __stdcall TabDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); + }; + + + class WizExteriorPage : public Tab + { + INT captionID; + public: + WizExteriorPage(INT caption) {captionID = caption;} + void Init(HWND hDlg); + }; + + + class WizFirstPage : public WizExteriorPage + { + public: + WizFirstPage(INT caption) : WizExteriorPage(caption) {} + bool HasPrev() {return false;} + }; + + + class WizLastPage : public WizExteriorPage + { + public: + WizLastPage(INT caption) : WizExteriorPage(caption) {} + bool HasNext() {return false;} + bool HasFinish() {return true;} + }; + + + class WizInteriorPage : public Tab + { + public: + }; + + class PropSheet + { + LPCTSTR watermark; + LPCTSTR header; + HFONT hTitleFont; + HFONT hDialogFont; + HICON icon; + struct Page + { + Page(Tab *_tab, LPCTSTR _resource, LPCTSTR _title, LPCTSTR _subtitle = 0) + : tab(_tab), resource(_resource), title(_title), hdrSubTitle(_subtitle) {} + Tab *tab; + LPCTSTR resource; + LPCTSTR title; + LPCTSTR hdrSubTitle; + }; + public: + PropSheet(); + typedef std::vector DlgList; + DlgList list; + void SetWaterMark(LPCTSTR _watermark) {watermark=_watermark;} + void SetHeader(LPCTSTR _header) {header=_header;} + void SetIcon(HICON _icon) {icon = _icon;} + void Add(Tab *tab, LPCTSTR resource, LPCTSTR title, LPCTSTR subtitle = 0); + void Show(HINSTANCE hInstance, HWND hParent, std::string title, int startpage=0, bool floating = false, bool wizard = false); + HFONT GetTitleFont() {return hTitleFont;} + HFONT GetFont() {return hDialogFont;} + static int CALLBACK Callback(HWND hwndDlg, UINT uMsg, LPARAM lParam); + }; + + + +} \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Windows/ShellUtil.cpp b/Source/Plugins/Plugin_VideoOGL/Src/Windows/ShellUtil.cpp new file mode 100644 index 0000000000..e329541c82 --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/Windows/ShellUtil.cpp @@ -0,0 +1,147 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "ShellUtil.h" + +#include +#include + +#include "shlobj.h" + +#include +#include + + +namespace W32Util +{ + std::string BrowseForFolder(HWND parent, char *title) + { + BROWSEINFO info; + memset(&info,0,sizeof(info)); + info.hwndOwner = parent; + info.lpszTitle = title; + info.ulFlags = BIF_EDITBOX | BIF_RETURNONLYFSDIRS; + + //info.pszDisplayName + LPCITEMIDLIST idList = SHBrowseForFolder(&info); + + char temp[MAX_PATH]; + SHGetPathFromIDList(idList, temp); + if (strlen(temp)) + { + return temp; + } + else + return ""; + } + + //--------------------------------------------------------------------------------------------------- + // function WinBrowseForFileName + //--------------------------------------------------------------------------------------------------- + bool BrowseForFileName (bool _bLoad, HWND _hParent, const char *_pTitle, + const char *_pInitialFolder,const char *_pFilter,const char *_pExtension, + std::string& _strFileName) + { + char szFile [MAX_PATH+1]; + char szFileTitle [MAX_PATH+1]; + + strcpy (szFile,""); + strcpy (szFileTitle,""); + + OPENFILENAME ofn; + + ZeroMemory (&ofn,sizeof (ofn)); + + ofn.lStructSize = sizeof (OPENFILENAME); + ofn.lpstrInitialDir = _pInitialFolder; + ofn.lpstrFilter = _pFilter; + ofn.nMaxFile = sizeof (szFile); + ofn.lpstrFile = szFile; + ofn.lpstrFileTitle = szFileTitle; + ofn.nMaxFileTitle = sizeof (szFileTitle); + ofn.lpstrDefExt = _pExtension; + ofn.hwndOwner = _hParent; + ofn.Flags = OFN_NOCHANGEDIR | OFN_EXPLORER | OFN_HIDEREADONLY; + + if (_strFileName.size () != 0) + ofn.lpstrFile = (char *)_strFileName.c_str(); + + if (((_bLoad)?GetOpenFileName (&ofn):GetSaveFileName (&ofn))) + { + _strFileName = ofn.lpstrFile; + return true; + } + else + return false; + } + + std::vector BrowseForFileNameMultiSelect(bool _bLoad, HWND _hParent, const char *_pTitle, + const char *_pInitialFolder,const char *_pFilter,const char *_pExtension) + { + char szFile [MAX_PATH+1+2048*2]; + char szFileTitle [MAX_PATH+1]; + + strcpy (szFile,""); + strcpy (szFileTitle,""); + + OPENFILENAME ofn; + + ZeroMemory (&ofn,sizeof (ofn)); + + ofn.lStructSize = sizeof (OPENFILENAME); + ofn.lpstrInitialDir = _pInitialFolder; + ofn.lpstrFilter = _pFilter; + ofn.nMaxFile = sizeof (szFile); + ofn.lpstrFile = szFile; + ofn.lpstrFileTitle = szFileTitle; + ofn.nMaxFileTitle = sizeof (szFileTitle); + ofn.lpstrDefExt = _pExtension; + ofn.hwndOwner = _hParent; + ofn.Flags = OFN_NOCHANGEDIR | OFN_EXPLORER | OFN_HIDEREADONLY | OFN_ALLOWMULTISELECT ; + + std::vector files; + + if (((_bLoad)?GetOpenFileName (&ofn):GetSaveFileName (&ofn))) + { + std::string directory = ofn.lpstrFile; + char *temp = ofn.lpstrFile; + char *oldtemp = temp; + temp+=strlen(temp)+1; + if (*temp==0) + { + //we only got one file + files.push_back(std::string(oldtemp)); + } + else + { + while (*temp) + { + files.push_back(directory+"\\"+std::string(temp)); + temp+=strlen(temp)+1; + } + } + return files; + } + else + return std::vector(); // empty vector; + + } + + + + +} \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Windows/ShellUtil.h b/Source/Plugins/Plugin_VideoOGL/Src/Windows/ShellUtil.h new file mode 100644 index 0000000000..2b71d92168 --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/Windows/ShellUtil.h @@ -0,0 +1,32 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#pragma once + +#include "stdafx.h" +#include +#include + +namespace W32Util +{ + std::string BrowseForFolder(HWND parent, char *title); + bool BrowseForFileName (bool _bLoad, HWND _hParent, const char *_pTitle, + const char *_pInitialFolder,const char *_pFilter,const char *_pExtension, + std::string& _strFileName); + std::vector BrowseForFileNameMultiSelect(bool _bLoad, HWND _hParent, const char *_pTitle, + const char *_pInitialFolder,const char *_pFilter,const char *_pExtension); +} \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Windows/TabControl.cpp b/Source/Plugins/Plugin_VideoOGL/Src/Windows/TabControl.cpp new file mode 100644 index 0000000000..0b332b099f --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/Windows/TabControl.cpp @@ -0,0 +1,95 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "TabControl.h" +#include + +namespace W32Util +{ + TabControl::TabControl(HINSTANCE _hInstance, HWND _hTabCtrl,DLGPROC _lpDialogFunc) : + m_hInstance(_hInstance), + m_hTabCtrl(_hTabCtrl), + m_numDialogs(0) + { + for (int i=0; ihwndFrom == m_hTabCtrl) + { + int iPage = TabCtrl_GetCurSel (m_hTabCtrl); + SelectDialog (iPage); + } + } + } + +} + diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Windows/TabControl.h b/Source/Plugins/Plugin_VideoOGL/Src/Windows/TabControl.h new file mode 100644 index 0000000000..abac8faad1 --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/Windows/TabControl.h @@ -0,0 +1,49 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#pragma once + +#include "stdafx.h" + +namespace W32Util +{ +#define MAX_WIN_DIALOGS 32 + + class TabControl + { + private: + + HINSTANCE m_hInstance; + HWND m_hWndParent; + HWND m_hTabCtrl; + + HWND m_WinDialogs[MAX_WIN_DIALOGS]; + int m_numDialogs; + + public: + + TabControl(HINSTANCE _hInstance, HWND _hTabCtrl,DLGPROC _lpDialogFunc); + + ~TabControl(void); + + HWND AddItem (char* _szText,int _iResource,DLGPROC _lpDialogFunc); + + void SelectDialog (int _nDialogId); + + void MessageHandler(UINT message, WPARAM wParam, LPARAM lParam); + }; +} diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Windows/Thread.cpp b/Source/Plugins/Plugin_VideoOGL/Src/Windows/Thread.cpp new file mode 100644 index 0000000000..d039fba970 --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/Windows/Thread.cpp @@ -0,0 +1,74 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "Thread.h" + +namespace W32Util +{ + Thread::Thread ( DWORD (WINAPI * pFun) (void* arg), void* pArg) + { + _handle = CreateThread ( + 0, // Security attributes + 0, // Stack size + pFun, + pArg, + CREATE_SUSPENDED, + &_tid); + } + + Thread::~Thread (void) + { + if (_handle != NULL) + { + if (CloseHandle (_handle) == FALSE) + { + Terminate(); + } + } + } + + void Thread::Resume (void) + { + if (_handle != NULL) + ResumeThread (_handle); + } + + void Thread::WaitForDeath (void) + { + if (_handle != NULL) + WaitForSingleObject (_handle, 100); + } + + void Thread::Terminate (void) + { + if (_handle != NULL) + TerminateThread (_handle, 0); + _handle = NULL; + } + + void Thread::SetPriority (int _nPriority) + { + if (_handle != NULL) + SetThreadPriority(_handle, _nPriority); + } + + void Thread::Suspend (void) + { + if (_handle != NULL) + SuspendThread(_handle); + } +} \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Windows/Thread.h b/Source/Plugins/Plugin_VideoOGL/Src/Windows/Thread.h new file mode 100644 index 0000000000..472b994cc8 --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/Windows/Thread.h @@ -0,0 +1,44 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#pragma once + +#include "stdafx.h" + +namespace W32Util +{ + class Thread + { + private: + HANDLE _handle; + DWORD _tid; // thread id + + public: + Thread(DWORD (WINAPI * pFun) (void* arg), void* pArg); + ~Thread () ; + + void Resume(void); + void Suspend(void); + void WaitForDeath(void); + void Terminate(void); + void SetPriority(int _nPriority); + bool IsActive (void); + + HANDLE GetHandle(void) {return _handle;} + }; +} + diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Windows/XPTheme.h b/Source/Plugins/Plugin_VideoOGL/Src/Windows/XPTheme.h new file mode 100644 index 0000000000..f7ea547d92 --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/Windows/XPTheme.h @@ -0,0 +1,625 @@ +// Windows Template Library - WTL version 7.0 +// Copyright (C) 1997-2002 Microsoft Corporation +// All rights reserved. +// +// This file is a part of the Windows Template Library. +// The code and information is provided "as-is" without +// warranty of any kind, either expressed or implied. + + +#pragma once + +#include +//#include +#include +#pragma comment(lib, "uxtheme.lib") + +// Note: To create an application that also runs on older versions of Windows, +// use delay load of uxtheme.dll and ensure that no calls to the Theme API are +// made if theming is not supported. It is enough to check if m_hTheme is NULL. +// Example: +// if(m_hTheme != NULL) +// { +// DrawThemeBackground(dc, BP_PUSHBUTTON, PBS_NORMAL, &rect, NULL); +// DrawThemeText(dc, BP_PUSHBUTTON, PBS_NORMAL, L"Button", -1, DT_SINGLELINE | DT_CENTER | DT_VCENTER, 0, &rect); +// } +// else +// { +// dc.DrawFrameControl(&rect, DFC_BUTTON, DFCS_BUTTONPUSH); +// dc.DrawText(_T("Button"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); +// } +// +// Delay load is NOT AUTOMATIC for VC++ 7, you have to link to delayimp.lib, +// and add uxtheme.dll in the Linker.Input.Delay Loaded DLLs section of the +// project properties. +#if (_MSC_VER < 1300) && !defined(_WTL_NO_THEME_DELAYLOAD) +#pragma comment(lib, "delayimp.lib") +#pragma comment(linker, "/delayload:uxtheme.dll") +#endif //(_MSC_VER < 1300) && !defined(_WTL_NO_THEME_DELAYLOAD) + + +// Classes in this file +// +// CTheme +// CThemeImpl + + +namespace WTL +{ + +// CTheme - wrapper for theme handle + +class CTheme +{ +public: +// Data members + HTHEME m_hTheme; + static int m_nIsThemingSupported; + +// Constructor + CTheme() : m_hTheme(NULL) + { + IsThemingSupported(); + } + +// Operators and helpers + bool IsThemeNull() const + { + return (m_hTheme == NULL); + } + + CTheme& operator =(HTHEME hTheme) + { + m_hTheme = hTheme; + return *this; + } + + operator HTHEME() const + { + return m_hTheme; + } + + void Attach(HTHEME hTheme) + { + m_hTheme = hTheme; + } + + HTHEME Detach() + { + HTHEME hTheme = m_hTheme; + m_hTheme = NULL; + return hTheme; + } + +// Theme support helper + static bool IsThemingSupported() + { + if(m_nIsThemingSupported == -1) + { + // ::EnterCriticalSection(&_Module.m_csStaticDataInit); + if(m_nIsThemingSupported == -1) + { + HMODULE hThemeDLL = ::LoadLibrary(_T("uxtheme.dll")); + m_nIsThemingSupported = (hThemeDLL != NULL) ? 1 : 0; + if(hThemeDLL != NULL) + ::FreeLibrary(hThemeDLL); + } + // ::LeaveCriticalSection(&_Module.m_csStaticDataInit); + } + + //ATLASSERT(m_nIsThemingSupported != -1); + return (m_nIsThemingSupported == 1); + } + +// Operations and theme properties + HTHEME OpenThemeData(HWND hWnd, LPCWSTR pszClassList) + { + if(!IsThemingSupported()) + return NULL; + + //ATLASSERT(m_hTheme == NULL); + m_hTheme = ::OpenThemeData(hWnd, pszClassList); + return m_hTheme; + } + + HRESULT CloseThemeData() + { + HRESULT hRet = S_FALSE; + if(m_hTheme != NULL) + { + hRet = ::CloseThemeData(m_hTheme); + if(SUCCEEDED(hRet)) + m_hTheme = NULL; + } + return hRet; + } + + HRESULT DrawThemeBackground(HDC hDC, int nPartID, int nStateID, LPCRECT pRect, LPCRECT pClipRect = NULL) + { + return ::DrawThemeBackground(m_hTheme, hDC, nPartID, nStateID, pRect, pClipRect); + } + + HRESULT DrawThemeText(HDC hDC, int nPartID, int nStateID, LPCWSTR pszText, int nCharCount, DWORD dwTextFlags, DWORD dwTextFlags2, LPCRECT pRect) + { + return ::DrawThemeText(m_hTheme, hDC, nPartID, nStateID, pszText, nCharCount, dwTextFlags, dwTextFlags2, pRect); + } + + HRESULT GetThemeBackgroundContentRect(HDC hDC, int nPartID, int nStateID, LPCRECT pBoundingRect, LPRECT pContentRect) const + { + return ::GetThemeBackgroundContentRect(m_hTheme, hDC, nPartID, nStateID, pBoundingRect, pContentRect); + } + + HRESULT GetThemeBackgroundExtent(HDC hDC, int nPartID, int nStateID, LPCRECT pContentRect, LPRECT pExtentRect) const + { + return ::GetThemeBackgroundExtent(m_hTheme, hDC, nPartID, nStateID, pContentRect, pExtentRect); + } + + HRESULT GetThemePartSize(HDC hDC, int nPartID, int nStateID, LPRECT pRect, enum THEMESIZE eSize, LPSIZE pSize) const + { + //ATLASSERT(m_hTheme != NULL); + return ::GetThemePartSize(m_hTheme, hDC, nPartID, nStateID, pRect, eSize, pSize); + } + + HRESULT GetThemeTextExtent(HDC hDC, int nPartID, int nStateID, LPCWSTR pszText, int nCharCount, DWORD dwTextFlags, LPCRECT pBoundingRect, LPRECT pExtentRect) const + { + //ATLASSERT(m_hTheme != NULL); + return ::GetThemeTextExtent(m_hTheme, hDC, nPartID, nStateID, pszText, nCharCount, dwTextFlags, pBoundingRect, pExtentRect); + } + + HRESULT GetThemeTextMetrics(HDC hDC, int nPartID, int nStateID, PTEXTMETRIC pTextMetric) const + { + //ATLASSERT(m_hTheme != NULL); + return ::GetThemeTextMetrics(m_hTheme, hDC, nPartID, nStateID, pTextMetric); + } + + HRESULT GetThemeBackgroundRegion(HDC hDC, int nPartID, int nStateID, LPCRECT pRect, HRGN* pRegion) const + { + //ATLASSERT(m_hTheme != NULL); + return ::GetThemeBackgroundRegion(m_hTheme, hDC, nPartID, nStateID, pRect, pRegion); + } + + HRESULT HitTestThemeBackground(HDC hDC, int nPartID, int nStateID, DWORD dwOptions, LPCRECT pRect, HRGN hrgn, POINT ptTest, WORD* pwHitTestCode) const + { + //ATLASSERT(m_hTheme != NULL); + return ::HitTestThemeBackground(m_hTheme, hDC, nPartID, nStateID, dwOptions, pRect, hrgn, ptTest, pwHitTestCode); + } + + HRESULT DrawThemeEdge(HDC hDC, int nPartID, int nStateID, LPCRECT pDestRect, UINT uEdge, UINT uFlags, LPRECT pContentRect = NULL) + { + //ATLASSERT(m_hTheme != NULL); + return ::DrawThemeEdge(m_hTheme, hDC, nPartID, nStateID, pDestRect, uEdge, uFlags, pContentRect); + } + + HRESULT DrawThemeIcon(HDC hDC, int nPartID, int nStateID, LPCRECT pRect, HIMAGELIST himl, int nImageIndex) + { + //ATLASSERT(m_hTheme != NULL); + return ::DrawThemeIcon(m_hTheme, hDC, nPartID, nStateID, pRect, himl, nImageIndex); + } + + BOOL IsThemePartDefined(int nPartID, int nStateID) const + { + //ATLASSERT(m_hTheme != NULL); + return ::IsThemePartDefined(m_hTheme, nPartID, nStateID); + } + + BOOL IsThemeBackgroundPartiallyTransparent(int nPartID, int nStateID) const + { + //ATLASSERT(m_hTheme != NULL); + return ::IsThemeBackgroundPartiallyTransparent(m_hTheme, nPartID, nStateID); + } + + HRESULT GetThemeColor(int nPartID, int nStateID, int nPropID, COLORREF* pColor) const + { + //ATLASSERT(m_hTheme != NULL); + return ::GetThemeColor(m_hTheme, nPartID, nStateID, nPropID, pColor); + } + + HRESULT GetThemeMetric(HDC hDC, int nPartID, int nStateID, int nPropID, int* pnVal) const + { + //ATLASSERT(m_hTheme != NULL); + return ::GetThemeMetric(m_hTheme, hDC, nPartID, nStateID, nPropID, pnVal); + } + + HRESULT GetThemeString(int nPartID, int nStateID, int nPropID, LPWSTR pszBuff, int cchMaxBuffChars) const + { + //ATLASSERT(m_hTheme != NULL); + return ::GetThemeString(m_hTheme, nPartID, nStateID, nPropID, pszBuff, cchMaxBuffChars); + } + + HRESULT GetThemeBool(int nPartID, int nStateID, int nPropID, BOOL* pfVal) const + { + //ATLASSERT(m_hTheme != NULL); + return ::GetThemeBool(m_hTheme, nPartID, nStateID, nPropID, pfVal); + } + + HRESULT GetThemeInt(int nPartID, int nStateID, int nPropID, int* pnVal) const + { + //ATLASSERT(m_hTheme != NULL); + return ::GetThemeInt(m_hTheme, nPartID, nStateID, nPropID, pnVal); + } + + HRESULT GetThemeEnumValue(int nPartID, int nStateID, int nPropID, int* pnVal) const + { + //ATLASSERT(m_hTheme != NULL); + return ::GetThemeEnumValue(m_hTheme, nPartID, nStateID, nPropID, pnVal); + } + + HRESULT GetThemePosition(int nPartID, int nStateID, int nPropID, LPPOINT pPoint) const + { + //ATLASSERT(m_hTheme != NULL); + return ::GetThemePosition(m_hTheme, nPartID, nStateID, nPropID, pPoint); + } + + HRESULT GetThemeFont(int nPartID, HDC hDC, int nStateID, int nPropID, LOGFONT* pFont) const + { + //ATLASSERT(m_hTheme != NULL); + return ::GetThemeFont(m_hTheme, hDC, nPartID, nStateID, nPropID, pFont); + } + + HRESULT GetThemeRect(int nPartID, int nStateID, int nPropID, LPRECT pRect) const + { + //ATLASSERT(m_hTheme != NULL); + return ::GetThemeRect(m_hTheme, nPartID, nStateID, nPropID, pRect); + } + + HRESULT GetThemeMargins(HDC hDC, int nPartID, int nStateID, int nPropID, LPRECT pRect, PMARGINS pMargins) const + { + //ATLASSERT(m_hTheme != NULL); + return ::GetThemeMargins(m_hTheme, hDC, nPartID, nStateID, nPropID, pRect, pMargins); + } + + HRESULT GetThemeIntList(int nPartID, int nStateID, int nPropID, INTLIST* pIntList) const + { + //ATLASSERT(m_hTheme != NULL); + return ::GetThemeIntList(m_hTheme, nPartID, nStateID, nPropID, pIntList); + } + + HRESULT GetThemePropertyOrigin(int nPartID, int nStateID, int nPropID, enum PROPERTYORIGIN* pOrigin) const + { + //ATLASSERT(m_hTheme != NULL); + return ::GetThemePropertyOrigin(m_hTheme, nPartID, nStateID, nPropID, pOrigin); + } + + HRESULT GetThemeFilename(int nPartID, int nStateID, int nPropID, LPWSTR pszThemeFileName, int cchMaxBuffChars) const + { + //ATLASSERT(m_hTheme != NULL); + return ::GetThemeFilename(m_hTheme, nPartID, nStateID, nPropID, pszThemeFileName, cchMaxBuffChars); + } + + COLORREF GetThemeSysColor(int nColorID) const + { + //ATLASSERT(m_hTheme != NULL); + return ::GetThemeSysColor(m_hTheme, nColorID); + } + + HBRUSH GetThemeSysColorBrush(int nColorID) const + { + //ATLASSERT(m_hTheme != NULL); + return ::GetThemeSysColorBrush(m_hTheme, nColorID); + } + + int GetThemeSysSize(int nSizeID) const + { + //ATLASSERT(m_hTheme != NULL); + return ::GetThemeSysSize(m_hTheme, nSizeID); + } + + BOOL GetThemeSysBool(int nBoolID) const + { + //ATLASSERT(m_hTheme != NULL); + return ::GetThemeSysBool(m_hTheme, nBoolID); + } + + HRESULT GetThemeSysFont(int nFontID, LOGFONT* plf) const + { + //ATLASSERT(m_hTheme != NULL); + return ::GetThemeSysFont(m_hTheme, nFontID, plf); + } + + HRESULT GetThemeSysString(int nStringID, LPWSTR pszStringBuff, int cchMaxStringChars) const + { + //ATLASSERT(m_hTheme != NULL); + return ::GetThemeSysString(m_hTheme, nStringID, pszStringBuff, cchMaxStringChars); + } + + HRESULT GetThemeSysInt(int nIntID, int* pnValue) const + { + //ATLASSERT(m_hTheme != NULL); + return ::GetThemeSysInt(m_hTheme, nIntID, pnValue); + } +}; + +__declspec(selectany) int CTheme::m_nIsThemingSupported = -1; + + +// CThemeImpl - theme support implementation + +// Derive from this class to implement window with theme support. +// Example: +// class CMyThemeWindow : public CWindowImpl, public CThemeImpl +// { +// ... +// BEGIN_MSG_MAP(CMyThemeWindow) +// CHAIN_MSG_MAP(CThemeImpl) +// ... +// END_MSG_MAP() +// ... +// }; +// +// If you set theme class list, the class will automaticaly open/close/reopen theme data. + + +// Helper for drawing theme client edge +#if 0 +inline bool AtlDrawThemeClientEdge(HTHEME hTheme, HWND hWnd, HRGN hRgnUpdate = NULL, HBRUSH hBrush = NULL, int nPartID = 0, int nStateID = 0) +{ + //ATLASSERT(hTheme != NULL); + //ATLASSERT(::IsWindow(hWnd)); + + CWindowDC dc(hWnd); + if(dc.IsNull()) + return false; + + // Get border size + int cxBorder = GetSystemMetrics(SM_CXBORDER); + int cyBorder = GetSystemMetrics(SM_CYBORDER); + if(SUCCEEDED(::GetThemeInt(hTheme, nPartID, nStateID, TMT_SIZINGBORDERWIDTH, &cxBorder))) + cyBorder = cxBorder; + + RECT rect; + ::GetWindowRect(hWnd, &rect); + + // Remove the client edge from the update region + int cxEdge = GetSystemMetrics(SM_CXEDGE); + int cyEdge = GetSystemMetrics(SM_CYEDGE); + ::InflateRect(&rect, -cxEdge, -cyEdge); + CRgn rgn; + rgn.CreateRectRgnIndirect(&rect); + if(rgn.IsNull()) + return false; + + if(hRgnUpdate != NULL) + rgn.CombineRgn(hRgnUpdate, rgn, RGN_AND); + + ::OffsetRect(&rect, -rect.left, -rect.top); + + ::OffsetRect(&rect, cxEdge, cyEdge); + dc.ExcludeClipRect(&rect); + ::InflateRect(&rect, cxEdge, cyEdge); + + ::DrawThemeBackground(hTheme, dc, nPartID, nStateID, &rect, NULL); + + // Use background brush too, since theme border might not cover everything + if(cxBorder < cxEdge && cyBorder < cyEdge) + { + if(hBrush == NULL) +// need conditional code because types don't match in winuser.h +#ifdef _WIN64 + hBrush = (HBRUSH)::GetClassLongPtr(hWnd, GCLP_HBRBACKGROUND); +#else + hBrush = (HBRUSH)UlongToPtr(::GetClassLongPtr(hWnd, GCLP_HBRBACKGROUND)); +#endif + + ::InflateRect(&rect, cxBorder - cxEdge, cyBorder - cyEdge); + dc.FillRect(&rect, hBrush); + } + + ::DefWindowProc(hWnd, WM_NCPAINT, (WPARAM)rgn.m_hRgn, 0L); + + return true; +} + + +// Theme extended styles +#define THEME_EX_3DCLIENTEDGE 0x00000001 +#define THEME_EX_THEMECLIENTEDGE 0x00000002 + +template +class CThemeImpl : public TBase +{ +public: +// Data members + LPWSTR m_lpstrThemeClassList; + DWORD m_dwExtendedStyle; // theme specific extended styles + +// Constructor & destructor + CThemeImpl() : m_lpstrThemeClassList(NULL), m_dwExtendedStyle(0) + { } + + ~CThemeImpl() + { + delete m_lpstrThemeClassList; + } + +// Attributes + bool SetThemeClassList(LPCWSTR lpstrThemeClassList) + { + if(m_lpstrThemeClassList != NULL) + { + delete m_lpstrThemeClassList; + m_lpstrThemeClassList = NULL; + } + + if(lpstrThemeClassList == NULL) + return true; + + int cchLen = lstrlenW(lpstrThemeClassList) + 1; + ATLTRY(m_lpstrThemeClassList = new WCHAR[cchLen]); + if(m_lpstrThemeClassList == NULL) + return false; + + bool bRet = (lstrcpyW(m_lpstrThemeClassList, lpstrThemeClassList) != NULL); + if(!bRet) + { + delete m_lpstrThemeClassList; + m_lpstrThemeClassList = NULL; + } + return bRet; + } + + bool GetThemeClassList(LPWSTR lpstrThemeClassList, int cchListBuffer) const + { + int cchLen = lstrlenW(m_lpstrThemeClassList) + 1; + if(cchListBuffer < cchLen) + return false; + + return (lstrcpyW(lpstrThemeClassList, m_lpstrThemeClassList) != NULL); + } + + LPCWSTR GetThemeClassList() const + { + return m_lpstrThemeClassList; + } + + DWORD SetThemeExtendedStyle(DWORD dwExtendedStyle, DWORD dwMask = 0) + { + DWORD dwPrevStyle = m_dwExtendedStyle; + if(dwMask == 0) + m_dwExtendedStyle = dwExtendedStyle; + else + m_dwExtendedStyle = (m_dwExtendedStyle & ~dwMask) | (dwExtendedStyle & dwMask); + return dwPrevStyle; + } + + DWORD GetThemeExtendedStyle() const + { + return m_dwExtendedStyle; + } + +// Operations + HTHEME OpenThemeData() + { + T* pT = static_cast(this); + //ATLASSERT(::IsWindow(pT->m_hWnd)); + //ATLASSERT(m_lpstrThemeClassList != NULL); + if(m_lpstrThemeClassList == NULL) + return NULL; + CloseThemeData(); + return TBase::OpenThemeData(pT->m_hWnd, m_lpstrThemeClassList); + } + + HTHEME OpenThemeData(LPCWSTR pszClassList) + { + if(!SetThemeClassList(pszClassList)) + return NULL; + return OpenThemeData(); + } + + HRESULT SetWindowTheme(LPCWSTR pszSubAppName, LPCWSTR pszSubIDList) + { + if(!IsThemingSupported()) + return S_FALSE; + + T* pT = static_cast(this); + //ATLASSERT(::IsWindow(pT->m_hWnd)); + return ::SetWindowTheme(pT->m_hWnd, pszSubAppName, pszSubIDList); + } + + HTHEME GetWindowTheme() const + { + if(!IsThemingSupported()) + return NULL; + + const T* pT = static_cast(this); + //ATLASSERT(::IsWindow(pT->m_hWnd)); + return ::GetWindowTheme(pT->m_hWnd); + } + + HRESULT EnableThemeDialogTexture(BOOL bEnable) + { + if(!IsThemingSupported()) + return S_FALSE; + + T* pT = static_cast(this); + //ATLASSERT(::IsWindow(pT->m_hWnd)); + return ::EnableThemeDialogTexture(pT->m_hWnd, bEnable); + } + + BOOL IsThemeDialogTextureEnabled() const + { + if(!IsThemingSupported()) + return FALSE; + + const T* pT = static_cast(this); + //ATLASSERT(::IsWindow(pT->m_hWnd)); + return ::IsThemeDialogTextureEnabled(pT->m_hWnd); + } + + HRESULT DrawThemeParentBackground(HDC hDC, LPRECT pRect = NULL) + { + if(!IsThemingSupported()) + return S_FALSE; + + T* pT = static_cast(this); + //ATLASSERT(::IsWindow(pT->m_hWnd)); + return ::DrawThemeParentBackground(pT->m_hWnd, hDC, pRect); + } + +// Message map and handlers + // Note: If you handle any of these messages in your derived class, + // it is better to put CHAIN_MSG_MAP at the start of your message map. + BEGIN_MSG_MAP(CThemeImpl) + MESSAGE_HANDLER(WM_CREATE, OnCreate) + MESSAGE_HANDLER(WM_DESTROY, OnDestroy) + MESSAGE_HANDLER(WM_THEMECHANGED, OnThemeChanged) + MESSAGE_HANDLER(WM_NCPAINT, OnNcPaint) + END_MSG_MAP() + + LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) + { + if(m_lpstrThemeClassList != NULL) + OpenThemeData(); + bHandled = FALSE; + return 1; + } + + LRESULT OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled) + { + CloseThemeData(); + bHandled = FALSE; + return 1; + } + + LRESULT OnThemeChanged(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) + { + CloseThemeData(); + if(m_lpstrThemeClassList != NULL) + OpenThemeData(); + bHandled = FALSE; + return 1; + } + + LRESULT OnNcPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) + { + T* pT = static_cast(this); + //ATLASSERT(::IsWindow(pT->m_hWnd)); + LRESULT lRet = 0; + bHandled = FALSE; + if(IsThemingSupported() && ((pT->GetExStyle() & WS_EX_CLIENTEDGE) != 0)) + { + if((m_dwExtendedStyle & THEME_EX_3DCLIENTEDGE) != 0) + { + lRet = ::DefWindowProc(pT->m_hWnd, uMsg, wParam, lParam); + bHandled = TRUE; + } + else if((m_hTheme != NULL) && ((m_dwExtendedStyle & THEME_EX_THEMECLIENTEDGE) != 0)) + { + HRGN hRgn = (wParam != 1) ? (HRGN)wParam : NULL; + if(pT->DrawThemeClientEdge(hRgn)) + bHandled = TRUE; + } + } + return lRet; + } + +// Drawing helper + bool DrawThemeClientEdge(HRGN hRgnUpdate) + { + T* pT = static_cast(this); + return AtlDrawThemeClientEdge(m_hTheme, pT->m_hWnd, hRgnUpdate, NULL, 0, 0); + } +}; + +#endif +}; //namespace WTL + diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Windows/libjpeg/jconfig.h b/Source/Plugins/Plugin_VideoOGL/Src/Windows/libjpeg/jconfig.h new file mode 100644 index 0000000000..1f43a6e119 --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/Windows/libjpeg/jconfig.h @@ -0,0 +1,52 @@ +/* jconfig.mc6 --- jconfig.h for Microsoft C on MS-DOS, version 6.00A & up. */ +/* see jconfig.doc for explanations */ + +#define HAVE_PROTOTYPES +#define HAVE_UNSIGNED_CHAR +#define HAVE_UNSIGNED_SHORT +/* #define void char */ +/* #define const */ +#undef CHAR_IS_UNSIGNED +#define HAVE_STDDEF_H +#define HAVE_STDLIB_H +#undef NEED_BSD_STRINGS +#undef NEED_SYS_TYPES_H +//#define NEED_FAR_POINTERS /* for small or medium memory model */ +#undef NEED_SHORT_EXTERNAL_NAMES +#undef INCOMPLETE_TYPES_BROKEN + +#ifdef JPEG_INTERNALS + +#undef RIGHT_SHIFT_IS_UNSIGNED + +//#define USE_MSDOS_MEMMGR /* Define this if you use jmemdos.c */ + +#define MAX_ALLOC_CHUNK 65520L /* Maximum request to malloc() */ + +//#define USE_FMEM /* Microsoft has _fmemcpy() and _fmemset() */ + +#define NEED_FHEAPMIN /* far heap management routines are broken */ + +#define SHORTxLCONST_32 /* enable compiler-specific DCT optimization */ +/* Note: the above define is known to improve the code with Microsoft C 6.00A. + * I do not know whether it is good for later compiler versions. + * Please report any info on this point to jpeg-info@uunet.uu.net. + */ + +#endif /* JPEG_INTERNALS */ + +#ifdef JPEG_CJPEG_DJPEG + +#define BMP_SUPPORTED /* BMP image file format */ +#define GIF_SUPPORTED /* GIF image file format */ +#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */ +#undef RLE_SUPPORTED /* Utah RLE image file format */ +#define TARGA_SUPPORTED /* Targa image file format */ + +#define TWO_FILE_COMMANDLINE +#define USE_SETMODE /* Microsoft has setmode() */ +#define NEED_SIGNAL_CATCHER /* Define this if you use jmemdos.c */ +#undef DONT_USE_B_MODE +#undef PROGRESS_REPORT /* optional */ + +#endif /* JPEG_CJPEG_DJPEG */ diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Windows/libjpeg/jmorecfg.h b/Source/Plugins/Plugin_VideoOGL/Src/Windows/libjpeg/jmorecfg.h new file mode 100644 index 0000000000..c856e2260c --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/Windows/libjpeg/jmorecfg.h @@ -0,0 +1,363 @@ +/* + * jmorecfg.h + * + * Copyright (C) 1991-1997, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains additional configuration options that customize the + * JPEG software for special applications or support machine-dependent + * optimizations. Most users will not need to touch this file. + */ + + +/* + * Define BITS_IN_JSAMPLE as either + * 8 for 8-bit sample values (the usual setting) + * 12 for 12-bit sample values + * Only 8 and 12 are legal data precisions for lossy JPEG according to the + * JPEG standard, and the IJG code does not support anything else! + * We do not support run-time selection of data precision, sorry. + */ + +#define BITS_IN_JSAMPLE 8 /* use 8 or 12 */ + + +/* + * Maximum number of components (color channels) allowed in JPEG image. + * To meet the letter of the JPEG spec, set this to 255. However, darn + * few applications need more than 4 channels (maybe 5 for CMYK + alpha + * mask). We recommend 10 as a reasonable compromise; use 4 if you are + * really short on memory. (Each allowed component costs a hundred or so + * bytes of storage, whether actually used in an image or not.) + */ + +#define MAX_COMPONENTS 10 /* maximum number of image components */ + + +/* + * Basic data types. + * You may need to change these if you have a machine with unusual data + * type sizes; for example, "char" not 8 bits, "short" not 16 bits, + * or "long" not 32 bits. We don't care whether "int" is 16 or 32 bits, + * but it had better be at least 16. + */ + +/* Representation of a single sample (pixel element value). + * We frequently allocate large arrays of these, so it's important to keep + * them small. But if you have memory to burn and access to char or short + * arrays is very slow on your hardware, you might want to change these. + */ + +#if BITS_IN_JSAMPLE == 8 +/* JSAMPLE should be the smallest type that will hold the values 0..255. + * You can use a signed char by having GETJSAMPLE mask it with 0xFF. + */ + +#ifdef HAVE_UNSIGNED_CHAR + +typedef unsigned char JSAMPLE; +#define GETJSAMPLE(value) ((int) (value)) + +#else /* not HAVE_UNSIGNED_CHAR */ + +typedef char JSAMPLE; +#ifdef CHAR_IS_UNSIGNED +#define GETJSAMPLE(value) ((int) (value)) +#else +#define GETJSAMPLE(value) ((int) (value) & 0xFF) +#endif /* CHAR_IS_UNSIGNED */ + +#endif /* HAVE_UNSIGNED_CHAR */ + +#define MAXJSAMPLE 255 +#define CENTERJSAMPLE 128 + +#endif /* BITS_IN_JSAMPLE == 8 */ + + +#if BITS_IN_JSAMPLE == 12 +/* JSAMPLE should be the smallest type that will hold the values 0..4095. + * On nearly all machines "short" will do nicely. + */ + +typedef short JSAMPLE; +#define GETJSAMPLE(value) ((int) (value)) + +#define MAXJSAMPLE 4095 +#define CENTERJSAMPLE 2048 + +#endif /* BITS_IN_JSAMPLE == 12 */ + + +/* Representation of a DCT frequency coefficient. + * This should be a signed value of at least 16 bits; "short" is usually OK. + * Again, we allocate large arrays of these, but you can change to int + * if you have memory to burn and "short" is really slow. + */ + +typedef short JCOEF; + + +/* Compressed datastreams are represented as arrays of JOCTET. + * These must be EXACTLY 8 bits wide, at least once they are written to + * external storage. Note that when using the stdio data source/destination + * managers, this is also the data type passed to fread/fwrite. + */ + +#ifdef HAVE_UNSIGNED_CHAR + +typedef unsigned char JOCTET; +#define GETJOCTET(value) (value) + +#else /* not HAVE_UNSIGNED_CHAR */ + +typedef char JOCTET; +#ifdef CHAR_IS_UNSIGNED +#define GETJOCTET(value) (value) +#else +#define GETJOCTET(value) ((value) & 0xFF) +#endif /* CHAR_IS_UNSIGNED */ + +#endif /* HAVE_UNSIGNED_CHAR */ + + +/* These typedefs are used for various table entries and so forth. + * They must be at least as wide as specified; but making them too big + * won't cost a huge amount of memory, so we don't provide special + * extraction code like we did for JSAMPLE. (In other words, these + * typedefs live at a different point on the speed/space tradeoff curve.) + */ + +/* UINT8 must hold at least the values 0..255. */ + +#ifdef HAVE_UNSIGNED_CHAR +typedef unsigned char UINT8; +#else /* not HAVE_UNSIGNED_CHAR */ +#ifdef CHAR_IS_UNSIGNED +typedef char UINT8; +#else /* not CHAR_IS_UNSIGNED */ +typedef short UINT8; +#endif /* CHAR_IS_UNSIGNED */ +#endif /* HAVE_UNSIGNED_CHAR */ + +/* UINT16 must hold at least the values 0..65535. */ + +#ifdef HAVE_UNSIGNED_SHORT +typedef unsigned short UINT16; +#else /* not HAVE_UNSIGNED_SHORT */ +typedef unsigned int UINT16; +#endif /* HAVE_UNSIGNED_SHORT */ + +/* INT16 must hold at least the values -32768..32767. */ + +#ifndef XMD_H /* X11/xmd.h correctly defines INT16 */ +typedef short INT16; +#endif + +/* INT32 must hold at least signed 32-bit values. */ + +#ifndef XMD_H /* X11/xmd.h correctly defines INT32 */ +typedef long INT32; +#endif + +/* Datatype used for image dimensions. The JPEG standard only supports + * images up to 64K*64K due to 16-bit fields in SOF markers. Therefore + * "unsigned int" is sufficient on all machines. However, if you need to + * handle larger images and you don't mind deviating from the spec, you + * can change this datatype. + */ + +typedef unsigned int JDIMENSION; + +#define JPEG_MAX_DIMENSION 65500L /* a tad under 64K to prevent overflows */ + + +/* These macros are used in all function definitions and extern declarations. + * You could modify them if you need to change function linkage conventions; + * in particular, you'll need to do that to make the library a Windows DLL. + * Another application is to make all functions global for use with debuggers + * or code profilers that require it. + */ + +/* a function called through method pointers: */ +#define METHODDEF(type) static type +/* a function used only in its module: */ +#define LOCAL(type) static type +/* a function referenced thru EXTERNs: */ +#define GLOBAL(type) type +/* a reference to a GLOBAL function: */ +#define EXTERN(type) extern type + + +/* This macro is used to declare a "method", that is, a function pointer. + * We want to supply prototype parameters if the compiler can cope. + * Note that the arglist parameter must be parenthesized! + * Again, you can customize this if you need special linkage keywords. + */ + +#ifdef HAVE_PROTOTYPES +#define JMETHOD(type,methodname,arglist) type (*methodname) arglist +#else +#define JMETHOD(type,methodname,arglist) type (*methodname) () +#endif + + +/* Here is the pseudo-keyword for declaring pointers that must be "far" + * on 80x86 machines. Most of the specialized coding for 80x86 is handled + * by just saying "FAR *" where such a pointer is needed. In a few places + * explicit coding is needed; see uses of the NEED_FAR_POINTERS symbol. + */ + +#ifdef NEED_FAR_POINTERS +#define FAR far +#else +#define FAR +#endif + + +/* + * On a few systems, type boolean and/or its values FALSE, TRUE may appear + * in standard header files. Or you may have conflicts with application- + * specific header files that you want to include together with these files. + * Defining HAVE_BOOLEAN before including jpeglib.h should make it work. + */ + +#ifndef HAVE_BOOLEAN +typedef int boolean; +#endif +#ifndef FALSE /* in case these macros already exist */ +#define FALSE 0 /* values of boolean */ +#endif +#ifndef TRUE +#define TRUE 1 +#endif + + +/* + * The remaining options affect code selection within the JPEG library, + * but they don't need to be visible to most applications using the library. + * To minimize application namespace pollution, the symbols won't be + * defined unless JPEG_INTERNALS or JPEG_INTERNAL_OPTIONS has been defined. + */ + +#ifdef JPEG_INTERNALS +#define JPEG_INTERNAL_OPTIONS +#endif + +#ifdef JPEG_INTERNAL_OPTIONS + + +/* + * These defines indicate whether to include various optional functions. + * Undefining some of these symbols will produce a smaller but less capable + * library. Note that you can leave certain source files out of the + * compilation/linking process if you've #undef'd the corresponding symbols. + * (You may HAVE to do that if your compiler doesn't like null source files.) + */ + +/* Arithmetic coding is unsupported for legal reasons. Complaints to IBM. */ + +/* Capability options common to encoder and decoder: */ + +#define DCT_ISLOW_SUPPORTED /* slow but accurate integer algorithm */ +#define DCT_IFAST_SUPPORTED /* faster, less accurate integer method */ +#define DCT_FLOAT_SUPPORTED /* floating-point: accurate, fast on fast HW */ + +/* Encoder capability options: */ + +#undef C_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */ +#define C_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */ +#define C_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/ +#define ENTROPY_OPT_SUPPORTED /* Optimization of entropy coding parms? */ +/* Note: if you selected 12-bit data precision, it is dangerous to turn off + * ENTROPY_OPT_SUPPORTED. The standard Huffman tables are only good for 8-bit + * precision, so jchuff.c normally uses entropy optimization to compute + * usable tables for higher precision. If you don't want to do optimization, + * you'll have to supply different default Huffman tables. + * The exact same statements apply for progressive JPEG: the default tables + * don't work for progressive mode. (This may get fixed, however.) + */ +#define INPUT_SMOOTHING_SUPPORTED /* Input image smoothing option? */ + +/* Decoder capability options: */ + +#undef D_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */ +#define D_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */ +#define D_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/ +#define SAVE_MARKERS_SUPPORTED /* jpeg_save_markers() needed? */ +#define BLOCK_SMOOTHING_SUPPORTED /* Block smoothing? (Progressive only) */ +#define IDCT_SCALING_SUPPORTED /* Output rescaling via IDCT? */ +#undef UPSAMPLE_SCALING_SUPPORTED /* Output rescaling at upsample stage? */ +#define UPSAMPLE_MERGING_SUPPORTED /* Fast path for sloppy upsampling? */ +#define QUANT_1PASS_SUPPORTED /* 1-pass color quantization? */ +#define QUANT_2PASS_SUPPORTED /* 2-pass color quantization? */ + +/* more capability options later, no doubt */ + + +/* + * Ordering of RGB data in scanlines passed to or from the application. + * If your application wants to deal with data in the order B,G,R, just + * change these macros. You can also deal with formats such as R,G,B,X + * (one extra byte per pixel) by changing RGB_PIXELSIZE. Note that changing + * the offsets will also change the order in which colormap data is organized. + * RESTRICTIONS: + * 1. The sample applications cjpeg,djpeg do NOT support modified RGB formats. + * 2. These macros only affect RGB<=>YCbCr color conversion, so they are not + * useful if you are using JPEG color spaces other than YCbCr or grayscale. + * 3. The color quantizer modules will not behave desirably if RGB_PIXELSIZE + * is not 3 (they don't understand about dummy color components!). So you + * can't use color quantization if you change that value. + */ + +#define RGB_RED 0 /* Offset of Red in an RGB scanline element */ +#define RGB_GREEN 1 /* Offset of Green */ +#define RGB_BLUE 2 /* Offset of Blue */ +#define RGB_PIXELSIZE 3 /* JSAMPLEs per RGB scanline element */ + + +/* Definitions for speed-related optimizations. */ + + +/* If your compiler supports inline functions, define INLINE + * as the inline keyword; otherwise define it as empty. + */ + +#ifndef INLINE +#ifdef __GNUC__ /* for instance, GNU C knows about inline */ +#define INLINE __inline__ +#endif +#ifndef INLINE +#define INLINE /* default is to define it as empty */ +#endif +#endif + + +/* On some machines (notably 68000 series) "int" is 32 bits, but multiplying + * two 16-bit shorts is faster than multiplying two ints. Define MULTIPLIER + * as short on such a machine. MULTIPLIER must be at least 16 bits wide. + */ + +#ifndef MULTIPLIER +#define MULTIPLIER int /* type for fastest integer multiply */ +#endif + + +/* FAST_FLOAT should be either float or double, whichever is done faster + * by your compiler. (Note that this type is only used in the floating point + * DCT routines, so it only matters if you've defined DCT_FLOAT_SUPPORTED.) + * Typically, float is faster in ANSI C compilers, while double is faster in + * pre-ANSI compilers (because they insist on converting to double anyway). + * The code below therefore chooses float if we have ANSI-style prototypes. + */ + +#ifndef FAST_FLOAT +#ifdef HAVE_PROTOTYPES +#define FAST_FLOAT float +#else +#define FAST_FLOAT double +#endif +#endif + +#endif /* JPEG_INTERNAL_OPTIONS */ diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Windows/libjpeg/jpeglib.h b/Source/Plugins/Plugin_VideoOGL/Src/Windows/libjpeg/jpeglib.h new file mode 100644 index 0000000000..a893130b38 --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/Windows/libjpeg/jpeglib.h @@ -0,0 +1,1099 @@ +/* + * jpeglib.h + * + * Copyright (C) 1991-1998, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file defines the application interface for the JPEG library. + * Most applications using the library need only include this file, + * and perhaps jerror.h if they want to know the exact error codes. + */ + +#ifndef JPEGLIB_H +#define JPEGLIB_H + +/* + * First we include the configuration files that record how this + * installation of the JPEG library is set up. jconfig.h can be + * generated automatically for many systems. jmorecfg.h contains + * manual configuration options that most people need not worry about. + */ + +#ifndef JCONFIG_INCLUDED /* in case jinclude.h already did */ +#include "jconfig.h" /* widely used configuration options */ +#endif +#include "jmorecfg.h" /* seldom changed options */ + + +/* Version ID for the JPEG library. + * Might be useful for tests like "#if JPEG_LIB_VERSION >= 60". + */ + +#define JPEG_LIB_VERSION 62 /* Version 6b */ + + +/* Various constants determining the sizes of things. + * All of these are specified by the JPEG standard, so don't change them + * if you want to be compatible. + */ + +#define DCTSIZE 8 /* The basic DCT block is 8x8 samples */ +#define DCTSIZE2 64 /* DCTSIZE squared; # of elements in a block */ +#define NUM_QUANT_TBLS 4 /* Quantization tables are numbered 0..3 */ +#define NUM_HUFF_TBLS 4 /* Huffman tables are numbered 0..3 */ +#define NUM_ARITH_TBLS 16 /* Arith-coding tables are numbered 0..15 */ +#define MAX_COMPS_IN_SCAN 4 /* JPEG limit on # of components in one scan */ +#define MAX_SAMP_FACTOR 4 /* JPEG limit on sampling factors */ +/* Unfortunately, some bozo at Adobe saw no reason to be bound by the standard; + * the PostScript DCT filter can emit files with many more than 10 blocks/MCU. + * If you happen to run across such a file, you can up D_MAX_BLOCKS_IN_MCU + * to handle it. We even let you do this from the jconfig.h file. However, + * we strongly discourage changing C_MAX_BLOCKS_IN_MCU; just because Adobe + * sometimes emits noncompliant files doesn't mean you should too. + */ +#define C_MAX_BLOCKS_IN_MCU 10 /* compressor's limit on blocks per MCU */ +#ifndef D_MAX_BLOCKS_IN_MCU +#define D_MAX_BLOCKS_IN_MCU 10 /* decompressor's limit on blocks per MCU */ +#endif + + +/* Data structures for images (arrays of samples and of DCT coefficients). + * On 80x86 machines, the image arrays are too big for near pointers, + * but the pointer arrays can fit in near memory. + */ + +#undef FAR +#define FAR + +typedef JSAMPLE *JSAMPROW; /* ptr to one image row of pixel samples. */ +typedef JSAMPROW *JSAMPARRAY; /* ptr to some rows (a 2-D sample array) */ +typedef JSAMPARRAY *JSAMPIMAGE; /* a 3-D sample array: top index is color */ + +typedef JCOEF JBLOCK[DCTSIZE2]; /* one block of coefficients */ +typedef JBLOCK *JBLOCKROW; /* pointer to one row of coefficient blocks */ +typedef JBLOCKROW *JBLOCKARRAY; /* a 2-D array of coefficient blocks */ +typedef JBLOCKARRAY *JBLOCKIMAGE; /* a 3-D array of coefficient blocks */ + +typedef JCOEF FAR *JCOEFPTR; /* useful in a couple of places */ + + +/* Types for JPEG compression parameters and working tables. */ + + +/* DCT coefficient quantization tables. */ + +typedef struct { + /* This array gives the coefficient quantizers in natural array order + * (not the zigzag order in which they are stored in a JPEG DQT marker). + * CAUTION: IJG versions prior to v6a kept this array in zigzag order. + */ + UINT16 quantval[DCTSIZE2]; /* quantization step for each coefficient */ + /* This field is used only during compression. It's initialized FALSE when + * the table is created, and set TRUE when it's been output to the file. + * You could suppress output of a table by setting this to TRUE. + * (See jpeg_suppress_tables for an example.) + */ + boolean sent_table; /* TRUE when table has been output */ +} JQUANT_TBL; + + +/* Huffman coding tables. */ + +typedef struct { + /* These two fields directly represent the contents of a JPEG DHT marker */ + UINT8 bits[17]; /* bits[k] = # of symbols with codes of */ + /* length k bits; bits[0] is unused */ + UINT8 huffval[256]; /* The symbols, in order of incr code length */ + /* This field is used only during compression. It's initialized FALSE when + * the table is created, and set TRUE when it's been output to the file. + * You could suppress output of a table by setting this to TRUE. + * (See jpeg_suppress_tables for an example.) + */ + boolean sent_table; /* TRUE when table has been output */ +} JHUFF_TBL; + + +/* Basic info about one component (color channel). */ + +typedef struct { + /* These values are fixed over the whole image. */ + /* For compression, they must be supplied by parameter setup; */ + /* for decompression, they are read from the SOF marker. */ + int component_id; /* identifier for this component (0..255) */ + int component_index; /* its index in SOF or cinfo->comp_info[] */ + int h_samp_factor; /* horizontal sampling factor (1..4) */ + int v_samp_factor; /* vertical sampling factor (1..4) */ + int quant_tbl_no; /* quantization table selector (0..3) */ + /* These values may vary between scans. */ + /* For compression, they must be supplied by parameter setup; */ + /* for decompression, they are read from the SOS marker. */ + /* The decompressor output side may not use these variables. */ + int dc_tbl_no; /* DC entropy table selector (0..3) */ + int ac_tbl_no; /* AC entropy table selector (0..3) */ + + /* Remaining fields should be treated as private by applications. */ + + /* These values are computed during compression or decompression startup: */ + /* Component's size in DCT blocks. + * Any dummy blocks added to complete an MCU are not counted; therefore + * these values do not depend on whether a scan is interleaved or not. + */ + JDIMENSION width_in_blocks; + JDIMENSION height_in_blocks; + /* Size of a DCT block in samples. Always DCTSIZE for compression. + * For decompression this is the size of the output from one DCT block, + * reflecting any scaling we choose to apply during the IDCT step. + * Values of 1,2,4,8 are likely to be supported. Note that different + * components may receive different IDCT scalings. + */ + int DCT_scaled_size; + /* The downsampled dimensions are the component's actual, unpadded number + * of samples at the main buffer (preprocessing/compression interface), thus + * downsampled_width = ceil(image_width * Hi/Hmax) + * and similarly for height. For decompression, IDCT scaling is included, so + * downsampled_width = ceil(image_width * Hi/Hmax * DCT_scaled_size/DCTSIZE) + */ + JDIMENSION downsampled_width; /* actual width in samples */ + JDIMENSION downsampled_height; /* actual height in samples */ + /* This flag is used only for decompression. In cases where some of the + * components will be ignored (eg grayscale output from YCbCr image), + * we can skip most computations for the unused components. + */ + boolean component_needed; /* do we need the value of this component? */ + + /* These values are computed before starting a scan of the component. */ + /* The decompressor output side may not use these variables. */ + int MCU_width; /* number of blocks per MCU, horizontally */ + int MCU_height; /* number of blocks per MCU, vertically */ + int MCU_blocks; /* MCU_width * MCU_height */ + int MCU_sample_width; /* MCU width in samples, MCU_width*DCT_scaled_size */ + int last_col_width; /* # of non-dummy blocks across in last MCU */ + int last_row_height; /* # of non-dummy blocks down in last MCU */ + + /* Saved quantization table for component; NULL if none yet saved. + * See jdinput.c comments about the need for this information. + * This field is currently used only for decompression. + */ + JQUANT_TBL * quant_table; + + /* Private per-component storage for DCT or IDCT subsystem. */ + void * dct_table; +} jpeg_component_info; + + +/* The script for encoding a multiple-scan file is an array of these: */ + +typedef struct { + int comps_in_scan; /* number of components encoded in this scan */ + int component_index[MAX_COMPS_IN_SCAN]; /* their SOF/comp_info[] indexes */ + int Ss, Se; /* progressive JPEG spectral selection parms */ + int Ah, Al; /* progressive JPEG successive approx. parms */ +} jpeg_scan_info; + +/* The decompressor can save APPn and COM markers in a list of these: */ + +typedef struct jpeg_marker_struct FAR * jpeg_saved_marker_ptr; + +struct jpeg_marker_struct { + jpeg_saved_marker_ptr next; /* next in list, or NULL */ + UINT8 marker; /* marker code: JPEG_COM, or JPEG_APP0+n */ + unsigned int original_length; /* # bytes of data in the file */ + unsigned int data_length; /* # bytes of data saved at data[] */ + JOCTET FAR * data; /* the data contained in the marker */ + /* the marker length word is not counted in data_length or original_length */ +}; + +/* Known color spaces. */ + +typedef enum { + JCS_UNKNOWN, /* error/unspecified */ + JCS_GRAYSCALE, /* monochrome */ + JCS_RGB, /* red/green/blue */ + JCS_YCbCr, /* Y/Cb/Cr (also known as YUV) */ + JCS_CMYK, /* C/M/Y/K */ + JCS_YCCK /* Y/Cb/Cr/K */ +} J_COLOR_SPACE; + +/* DCT/IDCT algorithm options. */ + +typedef enum { + JDCT_ISLOW, /* slow but accurate integer algorithm */ + JDCT_IFAST, /* faster, less accurate integer method */ + JDCT_FLOAT /* floating-point: accurate, fast on fast HW */ +} J_DCT_METHOD; + +#ifndef JDCT_DEFAULT /* may be overridden in jconfig.h */ +#define JDCT_DEFAULT JDCT_ISLOW +#endif +#ifndef JDCT_FASTEST /* may be overridden in jconfig.h */ +#define JDCT_FASTEST JDCT_IFAST +#endif + +/* Dithering options for decompression. */ + +typedef enum { + JDITHER_NONE, /* no dithering */ + JDITHER_ORDERED, /* simple ordered dither */ + JDITHER_FS /* Floyd-Steinberg error diffusion dither */ +} J_DITHER_MODE; + + +/* Common fields between JPEG compression and decompression master structs. */ + +#define jpeg_common_fields \ + struct jpeg_error_mgr * err; /* Error handler module */\ + struct jpeg_memory_mgr * mem; /* Memory manager module */\ + struct jpeg_progress_mgr * progress; /* Progress monitor, or NULL if none */\ + void * client_data; /* Available for use by application */\ + boolean is_decompressor; /* So common code can tell which is which */\ + int global_state /* For checking call sequence validity */ + +/* Routines that are to be used by both halves of the library are declared + * to receive a pointer to this structure. There are no actual instances of + * jpeg_common_struct, only of jpeg_compress_struct and jpeg_decompress_struct. + */ +struct jpeg_common_struct { + jpeg_common_fields; /* Fields common to both master struct types */ + /* Additional fields follow in an actual jpeg_compress_struct or + * jpeg_decompress_struct. All three structs must agree on these + * initial fields! (This would be a lot cleaner in C++.) + */ +}; + +typedef struct jpeg_common_struct * j_common_ptr; +typedef struct jpeg_compress_struct * j_compress_ptr; +typedef struct jpeg_decompress_struct * j_decompress_ptr; + + +/* Master record for a compression instance */ + +struct jpeg_compress_struct { + jpeg_common_fields; /* Fields shared with jpeg_decompress_struct */ + + /* Destination for compressed data */ + struct jpeg_destination_mgr * dest; + + /* Description of source image --- these fields must be filled in by + * outer application before starting compression. in_color_space must + * be correct before you can even call jpeg_set_defaults(). + */ + + JDIMENSION image_width; /* input image width */ + JDIMENSION image_height; /* input image height */ + int input_components; /* # of color components in input image */ + J_COLOR_SPACE in_color_space; /* colorspace of input image */ + + double input_gamma; /* image gamma of input image */ + + /* Compression parameters --- these fields must be set before calling + * jpeg_start_compress(). We recommend calling jpeg_set_defaults() to + * initialize everything to reasonable defaults, then changing anything + * the application specifically wants to change. That way you won't get + * burnt when new parameters are added. Also note that there are several + * helper routines to simplify changing parameters. + */ + + int data_precision; /* bits of precision in image data */ + + int num_components; /* # of color components in JPEG image */ + J_COLOR_SPACE jpeg_color_space; /* colorspace of JPEG image */ + + jpeg_component_info * comp_info; + /* comp_info[i] describes component that appears i'th in SOF */ + + JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS]; + /* ptrs to coefficient quantization tables, or NULL if not defined */ + + JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS]; + JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS]; + /* ptrs to Huffman coding tables, or NULL if not defined */ + + UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */ + UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */ + UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */ + + int num_scans; /* # of entries in scan_info array */ + const jpeg_scan_info * scan_info; /* script for multi-scan file, or NULL */ + /* The default value of scan_info is NULL, which causes a single-scan + * sequential JPEG file to be emitted. To create a multi-scan file, + * set num_scans and scan_info to point to an array of scan definitions. + */ + + boolean raw_data_in; /* TRUE=caller supplies downsampled data */ + boolean arith_code; /* TRUE=arithmetic coding, FALSE=Huffman */ + boolean optimize_coding; /* TRUE=optimize entropy encoding parms */ + boolean CCIR601_sampling; /* TRUE=first samples are cosited */ + int smoothing_factor; /* 1..100, or 0 for no input smoothing */ + J_DCT_METHOD dct_method; /* DCT algorithm selector */ + + /* The restart interval can be specified in absolute MCUs by setting + * restart_interval, or in MCU rows by setting restart_in_rows + * (in which case the correct restart_interval will be figured + * for each scan). + */ + unsigned int restart_interval; /* MCUs per restart, or 0 for no restart */ + int restart_in_rows; /* if > 0, MCU rows per restart interval */ + + /* Parameters controlling emission of special markers. */ + + boolean write_JFIF_header; /* should a JFIF marker be written? */ + UINT8 JFIF_major_version; /* What to write for the JFIF version number */ + UINT8 JFIF_minor_version; + /* These three values are not used by the JPEG code, merely copied */ + /* into the JFIF APP0 marker. density_unit can be 0 for unknown, */ + /* 1 for dots/inch, or 2 for dots/cm. Note that the pixel aspect */ + /* ratio is defined by X_density/Y_density even when density_unit=0. */ + UINT8 density_unit; /* JFIF code for pixel size units */ + UINT16 X_density; /* Horizontal pixel density */ + UINT16 Y_density; /* Vertical pixel density */ + boolean write_Adobe_marker; /* should an Adobe marker be written? */ + + /* State variable: index of next scanline to be written to + * jpeg_write_scanlines(). Application may use this to control its + * processing loop, e.g., "while (next_scanline < image_height)". + */ + + JDIMENSION next_scanline; /* 0 .. image_height-1 */ + + /* Remaining fields are known throughout compressor, but generally + * should not be touched by a surrounding application. + */ + + /* + * These fields are computed during compression startup + */ + boolean progressive_mode; /* TRUE if scan script uses progressive mode */ + int max_h_samp_factor; /* largest h_samp_factor */ + int max_v_samp_factor; /* largest v_samp_factor */ + + JDIMENSION total_iMCU_rows; /* # of iMCU rows to be input to coef ctlr */ + /* The coefficient controller receives data in units of MCU rows as defined + * for fully interleaved scans (whether the JPEG file is interleaved or not). + * There are v_samp_factor * DCTSIZE sample rows of each component in an + * "iMCU" (interleaved MCU) row. + */ + + /* + * These fields are valid during any one scan. + * They describe the components and MCUs actually appearing in the scan. + */ + int comps_in_scan; /* # of JPEG components in this scan */ + jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN]; + /* *cur_comp_info[i] describes component that appears i'th in SOS */ + + JDIMENSION MCUs_per_row; /* # of MCUs across the image */ + JDIMENSION MCU_rows_in_scan; /* # of MCU rows in the image */ + + int blocks_in_MCU; /* # of DCT blocks per MCU */ + int MCU_membership[C_MAX_BLOCKS_IN_MCU]; + /* MCU_membership[i] is index in cur_comp_info of component owning */ + /* i'th block in an MCU */ + + int Ss, Se, Ah, Al; /* progressive JPEG parameters for scan */ + + /* + * Links to compression subobjects (methods and private variables of modules) + */ + struct jpeg_comp_master * master; + struct jpeg_c_main_controller * main; + struct jpeg_c_prep_controller * prep; + struct jpeg_c_coef_controller * coef; + struct jpeg_marker_writer * marker; + struct jpeg_color_converter * cconvert; + struct jpeg_downsampler * downsample; + struct jpeg_forward_dct * fdct; + struct jpeg_entropy_encoder * entropy; + jpeg_scan_info * script_space; /* workspace for jpeg_simple_progression */ + int script_space_size; +}; + + +/* Master record for a decompression instance */ + +struct jpeg_decompress_struct { + jpeg_common_fields; /* Fields shared with jpeg_compress_struct */ + + /* Source of compressed data */ + struct jpeg_source_mgr * src; + + /* Basic description of image --- filled in by jpeg_read_header(). */ + /* Application may inspect these values to decide how to process image. */ + + JDIMENSION image_width; /* nominal image width (from SOF marker) */ + JDIMENSION image_height; /* nominal image height */ + int num_components; /* # of color components in JPEG image */ + J_COLOR_SPACE jpeg_color_space; /* colorspace of JPEG image */ + + /* Decompression processing parameters --- these fields must be set before + * calling jpeg_start_decompress(). Note that jpeg_read_header() initializes + * them to default values. + */ + + J_COLOR_SPACE out_color_space; /* colorspace for output */ + + unsigned int scale_num, scale_denom; /* fraction by which to scale image */ + + double output_gamma; /* image gamma wanted in output */ + + boolean buffered_image; /* TRUE=multiple output passes */ + boolean raw_data_out; /* TRUE=downsampled data wanted */ + + J_DCT_METHOD dct_method; /* IDCT algorithm selector */ + boolean do_fancy_upsampling; /* TRUE=apply fancy upsampling */ + boolean do_block_smoothing; /* TRUE=apply interblock smoothing */ + + boolean quantize_colors; /* TRUE=colormapped output wanted */ + /* the following are ignored if not quantize_colors: */ + J_DITHER_MODE dither_mode; /* type of color dithering to use */ + boolean two_pass_quantize; /* TRUE=use two-pass color quantization */ + int desired_number_of_colors; /* max # colors to use in created colormap */ + /* these are significant only in buffered-image mode: */ + boolean enable_1pass_quant; /* enable future use of 1-pass quantizer */ + boolean enable_external_quant;/* enable future use of external colormap */ + boolean enable_2pass_quant; /* enable future use of 2-pass quantizer */ + + /* Description of actual output image that will be returned to application. + * These fields are computed by jpeg_start_decompress(). + * You can also use jpeg_calc_output_dimensions() to determine these values + * in advance of calling jpeg_start_decompress(). + */ + + JDIMENSION output_width; /* scaled image width */ + JDIMENSION output_height; /* scaled image height */ + int out_color_components; /* # of color components in out_color_space */ + int output_components; /* # of color components returned */ + /* output_components is 1 (a colormap index) when quantizing colors; + * otherwise it equals out_color_components. + */ + int rec_outbuf_height; /* min recommended height of scanline buffer */ + /* If the buffer passed to jpeg_read_scanlines() is less than this many rows + * high, space and time will be wasted due to unnecessary data copying. + * Usually rec_outbuf_height will be 1 or 2, at most 4. + */ + + /* When quantizing colors, the output colormap is described by these fields. + * The application can supply a colormap by setting colormap non-NULL before + * calling jpeg_start_decompress; otherwise a colormap is created during + * jpeg_start_decompress or jpeg_start_output. + * The map has out_color_components rows and actual_number_of_colors columns. + */ + int actual_number_of_colors; /* number of entries in use */ + JSAMPARRAY colormap; /* The color map as a 2-D pixel array */ + + /* State variables: these variables indicate the progress of decompression. + * The application may examine these but must not modify them. + */ + + /* Row index of next scanline to be read from jpeg_read_scanlines(). + * Application may use this to control its processing loop, e.g., + * "while (output_scanline < output_height)". + */ + JDIMENSION output_scanline; /* 0 .. output_height-1 */ + + /* Current input scan number and number of iMCU rows completed in scan. + * These indicate the progress of the decompressor input side. + */ + int input_scan_number; /* Number of SOS markers seen so far */ + JDIMENSION input_iMCU_row; /* Number of iMCU rows completed */ + + /* The "output scan number" is the notional scan being displayed by the + * output side. The decompressor will not allow output scan/row number + * to get ahead of input scan/row, but it can fall arbitrarily far behind. + */ + int output_scan_number; /* Nominal scan number being displayed */ + JDIMENSION output_iMCU_row; /* Number of iMCU rows read */ + + /* Current progression status. coef_bits[c][i] indicates the precision + * with which component c's DCT coefficient i (in zigzag order) is known. + * It is -1 when no data has yet been received, otherwise it is the point + * transform (shift) value for the most recent scan of the coefficient + * (thus, 0 at completion of the progression). + * This pointer is NULL when reading a non-progressive file. + */ + int (*coef_bits)[DCTSIZE2]; /* -1 or current Al value for each coef */ + + /* Internal JPEG parameters --- the application usually need not look at + * these fields. Note that the decompressor output side may not use + * any parameters that can change between scans. + */ + + /* Quantization and Huffman tables are carried forward across input + * datastreams when processing abbreviated JPEG datastreams. + */ + + JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS]; + /* ptrs to coefficient quantization tables, or NULL if not defined */ + + JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS]; + JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS]; + /* ptrs to Huffman coding tables, or NULL if not defined */ + + /* These parameters are never carried across datastreams, since they + * are given in SOF/SOS markers or defined to be reset by SOI. + */ + + int data_precision; /* bits of precision in image data */ + + jpeg_component_info * comp_info; + /* comp_info[i] describes component that appears i'th in SOF */ + + boolean progressive_mode; /* TRUE if SOFn specifies progressive mode */ + boolean arith_code; /* TRUE=arithmetic coding, FALSE=Huffman */ + + UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */ + UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */ + UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */ + + unsigned int restart_interval; /* MCUs per restart interval, or 0 for no restart */ + + /* These fields record data obtained from optional markers recognized by + * the JPEG library. + */ + boolean saw_JFIF_marker; /* TRUE iff a JFIF APP0 marker was found */ + /* Data copied from JFIF marker; only valid if saw_JFIF_marker is TRUE: */ + UINT8 JFIF_major_version; /* JFIF version number */ + UINT8 JFIF_minor_version; + UINT8 density_unit; /* JFIF code for pixel size units */ + UINT16 X_density; /* Horizontal pixel density */ + UINT16 Y_density; /* Vertical pixel density */ + boolean saw_Adobe_marker; /* TRUE iff an Adobe APP14 marker was found */ + UINT8 Adobe_transform; /* Color transform code from Adobe marker */ + + boolean CCIR601_sampling; /* TRUE=first samples are cosited */ + + /* Aside from the specific data retained from APPn markers known to the + * library, the uninterpreted contents of any or all APPn and COM markers + * can be saved in a list for examination by the application. + */ + jpeg_saved_marker_ptr marker_list; /* Head of list of saved markers */ + + /* Remaining fields are known throughout decompressor, but generally + * should not be touched by a surrounding application. + */ + + /* + * These fields are computed during decompression startup + */ + int max_h_samp_factor; /* largest h_samp_factor */ + int max_v_samp_factor; /* largest v_samp_factor */ + + int min_DCT_scaled_size; /* smallest DCT_scaled_size of any component */ + + JDIMENSION total_iMCU_rows; /* # of iMCU rows in image */ + /* The coefficient controller's input and output progress is measured in + * units of "iMCU" (interleaved MCU) rows. These are the same as MCU rows + * in fully interleaved JPEG scans, but are used whether the scan is + * interleaved or not. We define an iMCU row as v_samp_factor DCT block + * rows of each component. Therefore, the IDCT output contains + * v_samp_factor*DCT_scaled_size sample rows of a component per iMCU row. + */ + + JSAMPLE * sample_range_limit; /* table for fast range-limiting */ + + /* + * These fields are valid during any one scan. + * They describe the components and MCUs actually appearing in the scan. + * Note that the decompressor output side must not use these fields. + */ + int comps_in_scan; /* # of JPEG components in this scan */ + jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN]; + /* *cur_comp_info[i] describes component that appears i'th in SOS */ + + JDIMENSION MCUs_per_row; /* # of MCUs across the image */ + JDIMENSION MCU_rows_in_scan; /* # of MCU rows in the image */ + + int blocks_in_MCU; /* # of DCT blocks per MCU */ + int MCU_membership[D_MAX_BLOCKS_IN_MCU]; + /* MCU_membership[i] is index in cur_comp_info of component owning */ + /* i'th block in an MCU */ + + int Ss, Se, Ah, Al; /* progressive JPEG parameters for scan */ + + /* This field is shared between entropy decoder and marker parser. + * It is either zero or the code of a JPEG marker that has been + * read from the data source, but has not yet been processed. + */ + int unread_marker; + + /* + * Links to decompression subobjects (methods, private variables of modules) + */ + struct jpeg_decomp_master * master; + struct jpeg_d_main_controller * main; + struct jpeg_d_coef_controller * coef; + struct jpeg_d_post_controller * post; + struct jpeg_input_controller * inputctl; + struct jpeg_marker_reader * marker; + struct jpeg_entropy_decoder * entropy; + struct jpeg_inverse_dct * idct; + struct jpeg_upsampler * upsample; + struct jpeg_color_deconverter * cconvert; + struct jpeg_color_quantizer * cquantize; +}; + + +/* "Object" declarations for JPEG modules that may be supplied or called + * directly by the surrounding application. + * As with all objects in the JPEG library, these structs only define the + * publicly visible methods and state variables of a module. Additional + * private fields may exist after the public ones. + */ + + +/* Error handler object */ + +struct jpeg_error_mgr { + /* Error exit handler: does not return to caller */ + JMETHOD(void, error_exit, (j_common_ptr cinfo)); + /* Conditionally emit a trace or warning message */ + JMETHOD(void, emit_message, (j_common_ptr cinfo, int msg_level)); + /* Routine that actually outputs a trace or error message */ + JMETHOD(void, output_message, (j_common_ptr cinfo)); + /* Format a message string for the most recent JPEG error or message */ + JMETHOD(void, format_message, (j_common_ptr cinfo, char * buffer)); +#define JMSG_LENGTH_MAX 200 /* recommended size of format_message buffer */ + /* Reset error state variables at start of a new image */ + JMETHOD(void, reset_error_mgr, (j_common_ptr cinfo)); + + /* The message ID code and any parameters are saved here. + * A message can have one string parameter or up to 8 int parameters. + */ + int msg_code; +#define JMSG_STR_PARM_MAX 80 + union { + int i[8]; + char s[JMSG_STR_PARM_MAX]; + } msg_parm; + + /* Standard state variables for error facility */ + + int trace_level; /* max msg_level that will be displayed */ + + /* For recoverable corrupt-data errors, we emit a warning message, + * but keep going unless emit_message chooses to abort. emit_message + * should count warnings in num_warnings. The surrounding application + * can check for bad data by seeing if num_warnings is nonzero at the + * end of processing. + */ + long num_warnings; /* number of corrupt-data warnings */ + + /* These fields point to the table(s) of error message strings. + * An application can change the table pointer to switch to a different + * message list (typically, to change the language in which errors are + * reported). Some applications may wish to add additional error codes + * that will be handled by the JPEG library error mechanism; the second + * table pointer is used for this purpose. + * + * First table includes all errors generated by JPEG library itself. + * Error code 0 is reserved for a "no such error string" message. + */ + const char * const * jpeg_message_table; /* Library errors */ + int last_jpeg_message; /* Table contains strings 0..last_jpeg_message */ + /* Second table can be added by application (see cjpeg/djpeg for example). + * It contains strings numbered first_addon_message..last_addon_message. + */ + const char * const * addon_message_table; /* Non-library errors */ + int first_addon_message; /* code for first string in addon table */ + int last_addon_message; /* code for last string in addon table */ +}; + + +/* Progress monitor object */ + +struct jpeg_progress_mgr { + JMETHOD(void, progress_monitor, (j_common_ptr cinfo)); + + long pass_counter; /* work units completed in this pass */ + long pass_limit; /* total number of work units in this pass */ + int completed_passes; /* passes completed so far */ + int total_passes; /* total number of passes expected */ +}; + + +/* Data destination object for compression */ + +struct jpeg_destination_mgr { + JOCTET * next_output_byte; /* => next byte to write in buffer */ + size_t free_in_buffer; /* # of byte spaces remaining in buffer */ + + JMETHOD(void, init_destination, (j_compress_ptr cinfo)); + JMETHOD(boolean, empty_output_buffer, (j_compress_ptr cinfo)); + JMETHOD(void, term_destination, (j_compress_ptr cinfo)); +}; + + +/* Data source object for decompression */ + +struct jpeg_source_mgr { + const JOCTET * next_input_byte; /* => next byte to read from buffer */ + size_t bytes_in_buffer; /* # of bytes remaining in buffer */ + + JMETHOD(void, init_source, (j_decompress_ptr cinfo)); + JMETHOD(boolean, fill_input_buffer, (j_decompress_ptr cinfo)); + JMETHOD(void, skip_input_data, (j_decompress_ptr cinfo, long num_bytes)); + JMETHOD(boolean, resync_to_restart, (j_decompress_ptr cinfo, int desired)); + JMETHOD(void, term_source, (j_decompress_ptr cinfo)); +}; + + +/* Memory manager object. + * Allocates "small" objects (a few K total), "large" objects (tens of K), + * and "really big" objects (virtual arrays with backing store if needed). + * The memory manager does not allow individual objects to be freed; rather, + * each created object is assigned to a pool, and whole pools can be freed + * at once. This is faster and more convenient than remembering exactly what + * to free, especially where malloc()/free() are not too speedy. + * NB: alloc routines never return NULL. They exit to error_exit if not + * successful. + */ + +#define JPOOL_PERMANENT 0 /* lasts until master record is destroyed */ +#define JPOOL_IMAGE 1 /* lasts until done with image/datastream */ +#define JPOOL_NUMPOOLS 2 + +typedef struct jvirt_sarray_control * jvirt_sarray_ptr; +typedef struct jvirt_barray_control * jvirt_barray_ptr; + + +struct jpeg_memory_mgr { + /* Method pointers */ + JMETHOD(void *, alloc_small, (j_common_ptr cinfo, int pool_id, + size_t sizeofobject)); + JMETHOD(void FAR *, alloc_large, (j_common_ptr cinfo, int pool_id, + size_t sizeofobject)); + JMETHOD(JSAMPARRAY, alloc_sarray, (j_common_ptr cinfo, int pool_id, + JDIMENSION samplesperrow, + JDIMENSION numrows)); + JMETHOD(JBLOCKARRAY, alloc_barray, (j_common_ptr cinfo, int pool_id, + JDIMENSION blocksperrow, + JDIMENSION numrows)); + JMETHOD(jvirt_sarray_ptr, request_virt_sarray, (j_common_ptr cinfo, + int pool_id, + boolean pre_zero, + JDIMENSION samplesperrow, + JDIMENSION numrows, + JDIMENSION maxaccess)); + JMETHOD(jvirt_barray_ptr, request_virt_barray, (j_common_ptr cinfo, + int pool_id, + boolean pre_zero, + JDIMENSION blocksperrow, + JDIMENSION numrows, + JDIMENSION maxaccess)); + JMETHOD(void, realize_virt_arrays, (j_common_ptr cinfo)); + JMETHOD(JSAMPARRAY, access_virt_sarray, (j_common_ptr cinfo, + jvirt_sarray_ptr ptr, + JDIMENSION start_row, + JDIMENSION num_rows, + boolean writable)); + JMETHOD(JBLOCKARRAY, access_virt_barray, (j_common_ptr cinfo, + jvirt_barray_ptr ptr, + JDIMENSION start_row, + JDIMENSION num_rows, + boolean writable)); + JMETHOD(void, free_pool, (j_common_ptr cinfo, int pool_id)); + JMETHOD(void, self_destruct, (j_common_ptr cinfo)); + + /* Limit on memory allocation for this JPEG object. (Note that this is + * merely advisory, not a guaranteed maximum; it only affects the space + * used for virtual-array buffers.) May be changed by outer application + * after creating the JPEG object. + */ + long max_memory_to_use; + + /* Maximum allocation request accepted by alloc_large. */ + long max_alloc_chunk; +}; + + +/* Routine signature for application-supplied marker processing methods. + * Need not pass marker code since it is stored in cinfo->unread_marker. + */ +typedef JMETHOD(boolean, jpeg_marker_parser_method, (j_decompress_ptr cinfo)); + + +/* Declarations for routines called by application. + * The JPP macro hides prototype parameters from compilers that can't cope. + * Note JPP requires double parentheses. + */ + +#ifdef HAVE_PROTOTYPES +#define JPP(arglist) arglist +#else +#define JPP(arglist) () +#endif + + +/* Short forms of external names for systems with brain-damaged linkers. + * We shorten external names to be unique in the first six letters, which + * is good enough for all known systems. + * (If your compiler itself needs names to be unique in less than 15 + * characters, you are out of luck. Get a better compiler.) + */ + +#ifdef NEED_SHORT_EXTERNAL_NAMES +#define jpeg_std_error jStdError +#define jpeg_CreateCompress jCreaCompress +#define jpeg_CreateDecompress jCreaDecompress +#define jpeg_destroy_compress jDestCompress +#define jpeg_destroy_decompress jDestDecompress +#define jpeg_stdio_dest jStdDest +#define jpeg_stdio_src jStdSrc +#define jpeg_set_defaults jSetDefaults +#define jpeg_set_colorspace jSetColorspace +#define jpeg_default_colorspace jDefColorspace +#define jpeg_set_quality jSetQuality +#define jpeg_set_linear_quality jSetLQuality +#define jpeg_add_quant_table jAddQuantTable +#define jpeg_quality_scaling jQualityScaling +#define jpeg_simple_progression jSimProgress +#define jpeg_suppress_tables jSuppressTables +#define jpeg_alloc_quant_table jAlcQTable +#define jpeg_alloc_huff_table jAlcHTable +#define jpeg_start_compress jStrtCompress +#define jpeg_write_scanlines jWrtScanlines +#define jpeg_finish_compress jFinCompress +#define jpeg_write_raw_data jWrtRawData +#define jpeg_write_marker jWrtMarker +#define jpeg_write_m_header jWrtMHeader +#define jpeg_write_m_byte jWrtMByte +#define jpeg_write_tables jWrtTables +#define jpeg_read_header jReadHeader +#define jpeg_start_decompress jStrtDecompress +#define jpeg_read_scanlines jReadScanlines +#define jpeg_finish_decompress jFinDecompress +#define jpeg_read_raw_data jReadRawData +#define jpeg_has_multiple_scans jHasMultScn +#define jpeg_start_output jStrtOutput +#define jpeg_finish_output jFinOutput +#define jpeg_input_complete jInComplete +#define jpeg_new_colormap jNewCMap +#define jpeg_consume_input jConsumeInput +#define jpeg_calc_output_dimensions jCalcDimensions +#define jpeg_save_markers jSaveMarkers +#define jpeg_set_marker_processor jSetMarker +#define jpeg_read_coefficients jReadCoefs +#define jpeg_write_coefficients jWrtCoefs +#define jpeg_copy_critical_parameters jCopyCrit +#define jpeg_abort_compress jAbrtCompress +#define jpeg_abort_decompress jAbrtDecompress +#define jpeg_abort jAbort +#define jpeg_destroy jDestroy +#define jpeg_resync_to_restart jResyncRestart +#endif /* NEED_SHORT_EXTERNAL_NAMES */ + + +/* Default error-management setup */ +EXTERN(struct jpeg_error_mgr *) jpeg_std_error + JPP((struct jpeg_error_mgr * err)); + +/* Initialization of JPEG compression objects. + * jpeg_create_compress() and jpeg_create_decompress() are the exported + * names that applications should call. These expand to calls on + * jpeg_CreateCompress and jpeg_CreateDecompress with additional information + * passed for version mismatch checking. + * NB: you must set up the error-manager BEFORE calling jpeg_create_xxx. + */ +#define jpeg_create_compress(cinfo) \ + jpeg_CreateCompress((cinfo), JPEG_LIB_VERSION, \ + (size_t) sizeof(struct jpeg_compress_struct)) +#define jpeg_create_decompress(cinfo) \ + jpeg_CreateDecompress((cinfo), JPEG_LIB_VERSION, \ + (size_t) sizeof(struct jpeg_decompress_struct)) +EXTERN(void) jpeg_CreateCompress JPP((j_compress_ptr cinfo, + int version, size_t structsize)); +EXTERN(void) jpeg_CreateDecompress JPP((j_decompress_ptr cinfo, + int version, size_t structsize)); +/* Destruction of JPEG compression objects */ +EXTERN(void) jpeg_destroy_compress JPP((j_compress_ptr cinfo)); +EXTERN(void) jpeg_destroy_decompress JPP((j_decompress_ptr cinfo)); + +/* Standard data source and destination managers: stdio streams. */ +/* Caller is responsible for opening the file before and closing after. */ +EXTERN(void) jpeg_stdio_dest JPP((j_compress_ptr cinfo, FILE * outfile)); +EXTERN(void) jpeg_stdio_src JPP((j_decompress_ptr cinfo, FILE * infile)); + +/* Default parameter setup for compression */ +EXTERN(void) jpeg_set_defaults JPP((j_compress_ptr cinfo)); +/* Compression parameter setup aids */ +EXTERN(void) jpeg_set_colorspace JPP((j_compress_ptr cinfo, + J_COLOR_SPACE colorspace)); +EXTERN(void) jpeg_default_colorspace JPP((j_compress_ptr cinfo)); +EXTERN(void) jpeg_set_quality JPP((j_compress_ptr cinfo, int quality, + boolean force_baseline)); +EXTERN(void) jpeg_set_linear_quality JPP((j_compress_ptr cinfo, + int scale_factor, + boolean force_baseline)); +EXTERN(void) jpeg_add_quant_table JPP((j_compress_ptr cinfo, int which_tbl, + const unsigned int *basic_table, + int scale_factor, + boolean force_baseline)); +EXTERN(int) jpeg_quality_scaling JPP((int quality)); +EXTERN(void) jpeg_simple_progression JPP((j_compress_ptr cinfo)); +EXTERN(void) jpeg_suppress_tables JPP((j_compress_ptr cinfo, + boolean suppress)); +EXTERN(JQUANT_TBL *) jpeg_alloc_quant_table JPP((j_common_ptr cinfo)); +EXTERN(JHUFF_TBL *) jpeg_alloc_huff_table JPP((j_common_ptr cinfo)); + +/* Main entry points for compression */ +EXTERN(void) jpeg_start_compress JPP((j_compress_ptr cinfo, + boolean write_all_tables)); +EXTERN(JDIMENSION) jpeg_write_scanlines JPP((j_compress_ptr cinfo, + JSAMPARRAY scanlines, + JDIMENSION num_lines)); +EXTERN(void) jpeg_finish_compress JPP((j_compress_ptr cinfo)); + +/* Replaces jpeg_write_scanlines when writing raw downsampled data. */ +EXTERN(JDIMENSION) jpeg_write_raw_data JPP((j_compress_ptr cinfo, + JSAMPIMAGE data, + JDIMENSION num_lines)); + +/* Write a special marker. See libjpeg.doc concerning safe usage. */ +EXTERN(void) jpeg_write_marker + JPP((j_compress_ptr cinfo, int marker, + const JOCTET * dataptr, unsigned int datalen)); +/* Same, but piecemeal. */ +EXTERN(void) jpeg_write_m_header + JPP((j_compress_ptr cinfo, int marker, unsigned int datalen)); +EXTERN(void) jpeg_write_m_byte + JPP((j_compress_ptr cinfo, int val)); + +/* Alternate compression function: just write an abbreviated table file */ +EXTERN(void) jpeg_write_tables JPP((j_compress_ptr cinfo)); + +/* Decompression startup: read start of JPEG datastream to see what's there */ +EXTERN(int) jpeg_read_header JPP((j_decompress_ptr cinfo, + boolean require_image)); +/* Return value is one of: */ +#define JPEG_SUSPENDED 0 /* Suspended due to lack of input data */ +#define JPEG_HEADER_OK 1 /* Found valid image datastream */ +#define JPEG_HEADER_TABLES_ONLY 2 /* Found valid table-specs-only datastream */ +/* If you pass require_image = TRUE (normal case), you need not check for + * a TABLES_ONLY return code; an abbreviated file will cause an error exit. + * JPEG_SUSPENDED is only possible if you use a data source module that can + * give a suspension return (the stdio source module doesn't). + */ + +/* Main entry points for decompression */ +EXTERN(boolean) jpeg_start_decompress JPP((j_decompress_ptr cinfo)); +EXTERN(JDIMENSION) jpeg_read_scanlines JPP((j_decompress_ptr cinfo, + JSAMPARRAY scanlines, + JDIMENSION max_lines)); +EXTERN(boolean) jpeg_finish_decompress JPP((j_decompress_ptr cinfo)); + +/* Replaces jpeg_read_scanlines when reading raw downsampled data. */ +EXTERN(JDIMENSION) jpeg_read_raw_data JPP((j_decompress_ptr cinfo, + JSAMPIMAGE data, + JDIMENSION max_lines)); + +/* Additional entry points for buffered-image mode. */ +EXTERN(boolean) jpeg_has_multiple_scans JPP((j_decompress_ptr cinfo)); +EXTERN(boolean) jpeg_start_output JPP((j_decompress_ptr cinfo, + int scan_number)); +EXTERN(boolean) jpeg_finish_output JPP((j_decompress_ptr cinfo)); +EXTERN(boolean) jpeg_input_complete JPP((j_decompress_ptr cinfo)); +EXTERN(void) jpeg_new_colormap JPP((j_decompress_ptr cinfo)); +EXTERN(int) jpeg_consume_input JPP((j_decompress_ptr cinfo)); +/* Return value is one of: */ +/* #define JPEG_SUSPENDED 0 Suspended due to lack of input data */ +#define JPEG_REACHED_SOS 1 /* Reached start of new scan */ +#define JPEG_REACHED_EOI 2 /* Reached end of image */ +#define JPEG_ROW_COMPLETED 3 /* Completed one iMCU row */ +#define JPEG_SCAN_COMPLETED 4 /* Completed last iMCU row of a scan */ + +/* Precalculate output dimensions for current decompression parameters. */ +EXTERN(void) jpeg_calc_output_dimensions JPP((j_decompress_ptr cinfo)); + +/* Control saving of COM and APPn markers into marker_list. */ +EXTERN(void) jpeg_save_markers + JPP((j_decompress_ptr cinfo, int marker_code, + unsigned int length_limit)); + +/* Install a special processing method for COM or APPn markers. */ +EXTERN(void) jpeg_set_marker_processor + JPP((j_decompress_ptr cinfo, int marker_code, + jpeg_marker_parser_method routine)); + +/* Read or write raw DCT coefficients --- useful for lossless transcoding. */ +EXTERN(jvirt_barray_ptr *) jpeg_read_coefficients JPP((j_decompress_ptr cinfo)); +EXTERN(void) jpeg_write_coefficients JPP((j_compress_ptr cinfo, + jvirt_barray_ptr * coef_arrays)); +EXTERN(void) jpeg_copy_critical_parameters JPP((j_decompress_ptr srcinfo, + j_compress_ptr dstinfo)); + +/* If you choose to abort compression or decompression before completing + * jpeg_finish_(de)compress, then you need to clean up to release memory, + * temporary files, etc. You can just call jpeg_destroy_(de)compress + * if you're done with the JPEG object, but if you want to clean it up and + * reuse it, call this: + */ +EXTERN(void) jpeg_abort_compress JPP((j_compress_ptr cinfo)); +EXTERN(void) jpeg_abort_decompress JPP((j_decompress_ptr cinfo)); + +/* Generic versions of jpeg_abort and jpeg_destroy that work on either + * flavor of JPEG object. These may be more convenient in some places. + */ +EXTERN(void) jpeg_abort JPP((j_common_ptr cinfo)); +EXTERN(void) jpeg_destroy JPP((j_common_ptr cinfo)); + +/* Default restart-marker-resync procedure for use by data source modules */ +EXTERN(boolean) jpeg_resync_to_restart JPP((j_decompress_ptr cinfo, + int desired)); + + +/* These marker codes are exported since applications and data source modules + * are likely to want to use them. + */ + +#define JPEG_RST0 0xD0 /* RST0 marker code */ +#define JPEG_EOI 0xD9 /* EOI marker code */ +#define JPEG_APP0 0xE0 /* APP0 marker code */ +#define JPEG_COM 0xFE /* COM marker code */ + + +/* If we have a brain-damaged compiler that emits warnings (or worse, errors) + * for structure definitions that are never filled in, keep it quiet by + * supplying dummy definitions for the various substructures. + */ + +#ifdef INCOMPLETE_TYPES_BROKEN +#ifndef JPEG_INTERNALS /* will be defined in jpegint.h */ +struct jvirt_sarray_control { long dummy; }; +struct jvirt_barray_control { long dummy; }; +struct jpeg_comp_master { long dummy; }; +struct jpeg_c_main_controller { long dummy; }; +struct jpeg_c_prep_controller { long dummy; }; +struct jpeg_c_coef_controller { long dummy; }; +struct jpeg_marker_writer { long dummy; }; +struct jpeg_color_converter { long dummy; }; +struct jpeg_downsampler { long dummy; }; +struct jpeg_forward_dct { long dummy; }; +struct jpeg_entropy_encoder { long dummy; }; +struct jpeg_decomp_master { long dummy; }; +struct jpeg_d_main_controller { long dummy; }; +struct jpeg_d_coef_controller { long dummy; }; +struct jpeg_d_post_controller { long dummy; }; +struct jpeg_input_controller { long dummy; }; +struct jpeg_marker_reader { long dummy; }; +struct jpeg_entropy_decoder { long dummy; }; +struct jpeg_inverse_dct { long dummy; }; +struct jpeg_upsampler { long dummy; }; +struct jpeg_color_deconverter { long dummy; }; +struct jpeg_color_quantizer { long dummy; }; +#endif /* JPEG_INTERNALS */ +#endif /* INCOMPLETE_TYPES_BROKEN */ + + +/* + * The JPEG library modules define JPEG_INTERNALS before including this file. + * The internal structure declarations are read only when that is true. + * Applications using the library should not include jpegint.h, but may wish + * to include jerror.h. + */ + +#ifdef JPEG_INTERNALS +#include "jpegint.h" /* fetch private declarations */ +#include "jerror.h" /* fetch error codes too */ +#endif + +#endif /* JPEGLIB_H */ diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Windows/libjpeg/libjpeg.lib b/Source/Plugins/Plugin_VideoOGL/Src/Windows/libjpeg/libjpeg.lib new file mode 100644 index 0000000000..ae22f9c400 Binary files /dev/null and b/Source/Plugins/Plugin_VideoOGL/Src/Windows/libjpeg/libjpeg.lib differ diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Windows/libjpeg/libjpeg64.lib b/Source/Plugins/Plugin_VideoOGL/Src/Windows/libjpeg/libjpeg64.lib new file mode 100644 index 0000000000..076469a7ac Binary files /dev/null and b/Source/Plugins/Plugin_VideoOGL/Src/Windows/libjpeg/libjpeg64.lib differ diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Windows/resource.h b/Source/Plugins/Plugin_VideoOGL/Src/Windows/resource.h new file mode 100644 index 0000000000..b3068228bd --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/Windows/resource.h @@ -0,0 +1,61 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by resource.rc +// +#define IDD_ABOUT 101 +#define IDD_SETTINGS 102 +#define IDD_DEBUGGER 103 +#define IDD_ADVANCED 104 +#define IDD_ENHANCEMENTS 105 +#define IDC_ENABLETEXTURING 1001 +#define IDC_CHECK2 1002 +#define IDC_WIREFRAME 1002 +#define IDC_USESHADERS 1002 +#define IDC_FORCEANISOTROPY 1002 +#define IDC_FULLSCREENENABLE 1002 +#define IDC_LIST1 1003 +#define IDC_DEBUGSTEP 1004 +#define IDC_REGISTERS 1005 +#define IDC_ENABLEDEBUGGING 1006 +#define IDC_TAB1 1007 +#define IDC_REGISTERSELECT 1007 +#define IDC_ADAPTER 1008 +#define IDC_DEVICE 1009 +#define IDC_RESOLUTION 1010 +#define IDC_RESOLUTIONWINDOWED 1011 +#define IDC_ANTIALIASMODE 1012 +#define IDC_PPPARAM1 1013 +#define IDC_SHADERVERSION 1013 +#define IDC_PPPARAM2 1014 +#define IDC_CHECK1 1015 +#define IDC_POSTPROCESS 1016 +#define IDC_TRUFORM 1016 +#define IDC_PPPARAM1LABEL 1017 +#define IDC_POSTPROCESSEFFECT 1017 +#define IDC_PPPARAM2LABEL 1018 +#define IDC_PPPARAM1LABEL2 1018 +#define IDC_ANTIALIASQUALITY 1019 +#define IDC_ENABLEPOSTPROCESS 1020 +#define IDC_ANIMATE1 1021 +#define IDC_OVERLAYSTATS 1022 +#define IDC_DLOPTLEVEL 1023 +#define IDC_PREUPSCALETYPE 1024 +#define IDC_TRUFORMLEVEL 1025 +#define IDC_PREUPSCALE 1026 +#define IDC_SLIDER1 1027 +#define IDC_TEXDUMPPATH 1028 +#define IDC_TEXDUMP 1029 +#define IDC_FORCEFILTERING 1030 +#define IDC_BROWSETEXDUMPPATH 1031 +#define IDC_SHOWSHADERERRORS 1033 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 106 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1034 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Windows/resource.rc b/Source/Plugins/Plugin_VideoOGL/Src/Windows/resource.rc new file mode 100644 index 0000000000..58982abe74 --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/Windows/resource.rc @@ -0,0 +1,206 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "afxres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""afxres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////// +// Swedish resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_SVE) +#ifdef _WIN32 +LANGUAGE LANG_SWEDISH, SUBLANG_DEFAULT +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_ABOUT DIALOGEX 0, 0, 188, 81 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Dolphin OpenGL Video Plugin" +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + DEFPUSHBUTTON "Close",IDOK,131,60,50,14 + LTEXT "Author: zerofrog(@gmail.com)",IDC_STATIC,7,7,126,9 + LTEXT "Vertex/Pixel Shader 2.0 or higher, framebuffer objects, multiple render targets",IDC_STATIC,7,19,174,26 +END + +IDD_SETTINGS DIALOGEX 0, 0, 231, 141 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_SYSMENU +FONT 8, "MS Shell Dlg", 0, 0, 0x0 +BEGIN + LTEXT "&Fullscreen video mode:",IDC_STATIC,7,22,74,8 + LTEXT "&Antialias mode:",IDC_STATIC,7,60,61,8 + COMBOBOX IDC_ANTIALIASMODE,68,57,156,73,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "&Windowed resolution:",IDC_STATIC,7,41,74,8 + COMBOBOX IDC_RESOLUTIONWINDOWED,87,39,137,73,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CONTROL "&Fullscreen",IDC_FULLSCREENENABLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,87,7,84,8 + COMBOBOX IDC_RESOLUTION,87,20,137,73,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP +END + +IDD_DEBUGGER DIALOGEX 0, 0, 234, 254 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_SYSMENU +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + LISTBOX IDC_LIST1,7,16,70,231,LBS_SORT | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP + LTEXT "&Command Stream",IDC_STATIC,7,7,70,8 + PUSHBUTTON "&Step",IDC_DEBUGSTEP,81,16,35,15 + CONTROL "",IDC_REGISTERS,"SysListView32",LVS_REPORT | LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP,81,68,146,179 + LTEXT "&Registers",IDC_STATIC,81,41,137,9 + CONTROL "&Enable debugging",IDC_ENABLEDEBUGGING,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,121,19,70,8 + CONTROL "",IDC_REGISTERSELECT,"SysTabControl32",TCS_BUTTONS,80,52,145,13 +END + +IDD_ADVANCED DIALOGEX 0, 0, 206, 144 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_SYSMENU +FONT 8, "MS Shell Dlg", 0, 0, 0x0 +BEGIN + GROUPBOX "&Settings",IDC_STATIC,7,7,192,81 + CONTROL "&Wireframe",IDC_WIREFRAME,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,19,79,9 + CONTROL "&Overlay some statistics",IDC_OVERLAYSTATS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,31,88,9 + LTEXT "&Default display list optimization level:",IDC_STATIC,14,57,137,9,WS_DISABLED + COMBOBOX IDC_DLOPTLEVEL,14,67,178,63,CBS_DROPDOWNLIST | WS_DISABLED | WS_VSCROLL | WS_TABSTOP + CONTROL "&Dump textures to:",IDC_TEXDUMP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,104,70,9 + EDITTEXT IDC_TEXDUMPPATH,25,116,148,12,ES_AUTOHSCROLL + GROUPBOX "&Data dumping",IDC_STATIC,7,91,192,44 + PUSHBUTTON "...",IDC_BROWSETEXDUMPPATH,176,116,14,13 + CONTROL "Show s&hader compilation errors",IDC_SHOWSHADERERRORS, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,43,127,9 +END + +IDD_ENHANCEMENTS DIALOGEX 0, 0, 207, 175 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_SYSMENU +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + GROUPBOX "Texture &enhancements",IDC_STATIC,7,61,193,34 + CONTROL "&Pre-upscale:",IDC_PREUPSCALE,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,16,76,54,10 + COMBOBOX IDC_PREUPSCALETYPE,74,74,117,49,CBS_DROPDOWNLIST | CBS_SORT | WS_DISABLED | WS_VSCROLL | WS_TABSTOP + GROUPBOX "Texture &filtering",IDC_STATIC,7,7,193,50 + CONTROL "&Force bi/trilinear (may cause very small glitches)",IDC_FORCEFILTERING, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,20,170,9 + CONTROL "&Force maximum anisotropy filtering",IDC_FORCEANISOTROPY, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,35,127,10 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO +BEGIN + IDD_ABOUT, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 181 + TOPMARGIN, 7 + BOTTOMMARGIN, 74 + END + + IDD_SETTINGS, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 224 + VERTGUIDE, 7 + VERTGUIDE, 68 + VERTGUIDE, 81 + VERTGUIDE, 87 + TOPMARGIN, 7 + BOTTOMMARGIN, 134 + END + + IDD_DEBUGGER, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 227 + TOPMARGIN, 7 + BOTTOMMARGIN, 247 + END + + IDD_ADVANCED, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 199 + VERTGUIDE, 14 + TOPMARGIN, 7 + BOTTOMMARGIN, 137 + END + + IDD_ENHANCEMENTS, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 200 + VERTGUIDE, 16 + VERTGUIDE, 74 + TOPMARGIN, 7 + BOTTOMMARGIN, 168 + END +END +#endif // APSTUDIO_INVOKED + +#endif // Swedish resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Windows/stdafx.h b/Source/Plugins/Plugin_VideoOGL/Src/Windows/stdafx.h new file mode 100644 index 0000000000..e0d258d5e1 --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/Windows/stdafx.h @@ -0,0 +1,33 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#pragma once + +#define _WIN32_WINNT 0x501 +#ifndef _WIN32_IE +#define _WIN32_IE 0x0500 // Default value is 0x0400 +#endif + +#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers + +#define _CRT_SECURE_NO_DEPRECATE 1 +#define _CRT_NONSTDC_NO_DEPRECATE 1 + +#include +#include +#include + diff --git a/Source/Plugins/Plugin_VideoOGL/Src/XFB.cpp b/Source/Plugins/Plugin_VideoOGL/Src/XFB.cpp new file mode 100644 index 0000000000..5988bcf44d --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/XFB.cpp @@ -0,0 +1,61 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "Common.h" +#include "Globals.h" + +// __________________________________________________________________________________________________ +// Video_UpdateXFB +// + +// TODO(ector): Write protect XFB. As soon as something pokes there, +// switch to a mode where we actually display the XFB on top of the 3D. +// If no writes have happened within 5 frames, revert to normal mode. + +// Also, write a crazy SSE2 optimized version of this :P + +int bound(int i) +{ + return (i>255)?255:((i<0)?0:i); +} +void yuv2rgb(int y, int u, int v, int &r, int &g, int &b) +{ + b = bound((76283*(y - 16) + 132252*(u - 128))>>16); + g = bound((76283*(y - 16) - 53281 *(v - 128) - 25624*(u - 128))>>16); //last one u? + r = bound((76283*(y - 16) + 104595*(v - 128))>>16); +} + +void ConvertXFB(int *dst, const u8* _pXFB, int width, int height) +{ + const unsigned char *src = _pXFB; + for (int y = 0; y < height; y++) + { + for (int x = 0; x < width; x++) + { + int Y1 = *src++; + int U = *src++; + int Y2 = *src++; + int V = *src++; + + int r,g,b; + yuv2rgb(Y1, U, V, r, g, b); + *dst++ = 0xFF000000 | (r<<16) | (g<<8) | (b); + yuv2rgb(Y2, U, V, r, g, b); + *dst++ = 0xFF000000 | (r<<16) | (g<<8) | (b); + } + } +} diff --git a/Source/Plugins/Plugin_VideoOGL/Src/XFB.h b/Source/Plugins/Plugin_VideoOGL/Src/XFB.h new file mode 100644 index 0000000000..62be9aff09 --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/XFB.h @@ -0,0 +1,22 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef _XFB_H +#define _XFB_H + + +#endif diff --git a/Source/Plugins/Plugin_VideoOGL/Src/main.cpp b/Source/Plugins/Plugin_VideoOGL/Src/main.cpp new file mode 100644 index 0000000000..0d5d660411 --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/main.cpp @@ -0,0 +1,195 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include +#include "Globals.h" + +#include "Render.h" +#include "GLInit.h" +#include "Fifo.h" +#include "OpcodeDecoding.h" +#include "TextureMngr.h" +#include "BPStructs.h" +#ifdef _WIN32 +#include "DlgSettings.h" +#include "Misc.h" +#include "EmuWindow.h" +#endif +#include "VertexLoader.h" +#include "VertexShader.h" +#include "PixelShader.h" + + +HINSTANCE g_hInstance = NULL; +SVideoInitialize g_VideoInitialize; +#define VERSION_STRING "0.1" + +#ifdef _WIN32 +BOOL APIENTRY DllMain( HINSTANCE hinstDLL, // DLL module handle + DWORD dwReason, // reason called + LPVOID lpvReserved) // reserved +{ + switch (dwReason) + { + case DLL_PROCESS_ATTACH: + break; + case DLL_PROCESS_DETACH: + CloseConsole(); + break; + default: + break; + } + + g_hInstance = hinstDLL; + return TRUE; +} +#endif + +void GetDllInfo (PLUGIN_INFO* _PluginInfo) +{ + _PluginInfo->Version = 0x0100; + _PluginInfo->Type = PLUGIN_TYPE_VIDEO; +#ifdef DEBUGFAST + sprintf(_PluginInfo->Name, "Dolphin OGL (DebugFast)" VERSION_STRING); +#else +#ifndef _DEBUG + sprintf(_PluginInfo->Name, "Dolphin OGL " VERSION_STRING); +#else + sprintf(_PluginInfo->Name, "Dolphin OGL Debug " VERSION_STRING); +#endif +#endif +} + +void DllAbout(HWND _hParent) +{ +#ifdef _WIN32 + DialogBox(g_hInstance,(LPCSTR)IDD_ABOUT,_hParent,(DLGPROC)AboutProc); +#endif +} + +void DllConfig(HWND _hParent) +{ +#ifdef _WIN32 + DlgSettings_Show(g_hInstance,_hParent); +#endif +} + +void Video_Initialize(SVideoInitialize* _pVideoInitialize) +{ + if (_pVideoInitialize == NULL) + return; + +#ifdef _WIN32 +// OpenConsole(); +#endif + + frameCount = 0; + g_VideoInitialize = *_pVideoInitialize; + InitLUTs(); + g_Config.Load(); + + if (!OpenGL_Create(g_VideoInitialize, g_Res[g_Config.iWindowedRes][0], g_Res[g_Config.iWindowedRes][1])) { + g_VideoInitialize.pLog("Renderer::Create failed\n", TRUE); + return; + } + _pVideoInitialize->pPeekMessages = g_VideoInitialize.pPeekMessages; + _pVideoInitialize->pUpdateFPSDisplay = g_VideoInitialize.pUpdateFPSDisplay; + _pVideoInitialize->pWindowHandle = g_VideoInitialize.pWindowHandle; +} + +#ifdef _WIN32 +HANDLE g_hthread; +#endif + +void Video_Prepare(void) +{ + OpenGL_MakeCurrent(); + if (!Renderer::Create2()) { + g_VideoInitialize.pLog("Renderer::Create2 failed\n", TRUE); + return; + } + + TextureMngr::Init(); + + BPInit(); + VertexManager::Init(); + OpcodeDecoder_Init(); + Fifo_Init(); + VertexShaderMngr::Init(); + PixelShaderMngr::Init(); + GL_REPORT_ERRORD(); +} + +void Video_Shutdown(void) +{ + VertexShaderMngr::Shutdown(); + PixelShaderMngr::Shutdown(); + Fifo_Shutdown(); + VertexManager::Destroy(); + TextureMngr::Shutdown(); + OpcodeDecoder_Shutdown(); + Renderer::Shutdown(); + OpenGL_Shutdown(); +} + + +void DebugLog(const char* _fmt, ...) +{ +#ifdef _DEBUG + + char* Msg = (char*)alloca(strlen(_fmt)+512); + va_list ap; + + va_start( ap, _fmt ); + vsnprintf( Msg, strlen(_fmt)+512, _fmt, ap ); + va_end( ap ); + + g_VideoInitialize.pLog(Msg, FALSE); +#endif +} + +bool ScreenShot(TCHAR *File) +{ + char str[64]; + int left = 200, top = 15; + sprintf(str, "Dolphin OGL " VERSION_STRING); + + Renderer::ResetGLState(); + Renderer::DrawText(str, left+1, top+1, 0xff000000); + Renderer::DrawText(str, left, top, 0xffc0ffff); + Renderer::RestoreGLState(); + + if (Renderer::SaveRenderTarget(File, 0)) { + char str[255]; + sprintf(str, "saved %s\n", File); + Renderer::AddMessage(str, 500); + return true; + } + return false; +} + +BOOL Video_Screenshot(TCHAR* _szFilename) +{ + if (ScreenShot(_szFilename)) + return TRUE; + + return FALSE; +} + +void Video_UpdateXFB(BYTE* _pXFB, DWORD _dwWidth, DWORD _dwHeight) +{ +} diff --git a/Source/Plugins/Plugin_VideoOGL/Src/main.h b/Source/Plugins/Plugin_VideoOGL/Src/main.h new file mode 100644 index 0000000000..050ab5d6a8 --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/main.h @@ -0,0 +1,25 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef _MAIN_H +#define _MAIN_H + +#include "pluginspecs_video.h" + +extern SVideoInitialize g_VideoInitialize; + +#endif diff --git a/Source/Plugins/Plugin_VideoOGL/Src/memcpy_amd.cpp b/Source/Plugins/Plugin_VideoOGL/Src/memcpy_amd.cpp new file mode 100644 index 0000000000..b06cc7a9bc --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/memcpy_amd.cpp @@ -0,0 +1,473 @@ +/****************************************************************************** + + Copyright (c) 2001 Advanced Micro Devices, Inc. + + LIMITATION OF LIABILITY: THE MATERIALS ARE PROVIDED *AS IS* WITHOUT ANY + EXPRESS OR IMPLIED WARRANTY OF ANY KIND INCLUDING WARRANTIES OF MERCHANTABILITY, + NONINFRINGEMENT OF THIRD-PARTY INTELLECTUAL PROPERTY, OR FITNESS FOR ANY + PARTICULAR PURPOSE. IN NO EVENT SHALL AMD OR ITS SUPPLIERS BE LIABLE FOR ANY + DAMAGES WHATSOEVER (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF PROFITS, + BUSINESS INTERRUPTION, LOSS OF INFORMATION) ARISING OUT OF THE USE OF OR + INABILITY TO USE THE MATERIALS, EVEN IF AMD HAS BEEN ADVISED OF THE POSSIBILITY + OF SUCH DAMAGES. BECAUSE SOME JURISDICTIONS PROHIBIT THE EXCLUSION OR LIMITATION + OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES, THE ABOVE LIMITATION MAY + NOT APPLY TO YOU. + + AMD does not assume any responsibility for any errors which may appear in the + Materials nor any responsibility to support or update the Materials. AMD retains + the right to make changes to its test specifications at any time, without notice. + + NO SUPPORT OBLIGATION: AMD is not obligated to furnish, support, or make any + further information, software, technical information, know-how, or show-how + available to you. + + So that all may benefit from your experience, please report any problems + or suggestions about this software to 3dsdk.support@amd.com + + AMD Developer Technologies, M/S 585 + Advanced Micro Devices, Inc. + 5900 E. Ben White Blvd. + Austin, TX 78741 + 3dsdk.support@amd.com +******************************************************************************/ + +#include + +/***************************************************************************** +MEMCPY_AMD.CPP +******************************************************************************/ + +// Very optimized memcpy() routine for AMD Athlon and Duron family. +// This code uses any of FOUR different basic copy methods, depending +// on the transfer size. +// NOTE: Since this code uses MOVNTQ (also known as "Non-Temporal MOV" or +// "Streaming Store"), and also uses the software prefetch instructions, +// be sure you're running on Athlon/Duron or other recent CPU before calling! + +#define TINY_BLOCK_COPY 64 // upper limit for movsd type copy +// The smallest copy uses the X86 "movsd" instruction, in an optimized +// form which is an "unrolled loop". + +#define IN_CACHE_COPY 2 * 1024 // upper limit for movq/movq copy w/SW prefetch +// Next is a copy that uses the MMX registers to copy 8 bytes at a time, +// also using the "unrolled loop" optimization. This code uses +// the software prefetch instruction to get the data into the cache. + +#define UNCACHED_COPY 4 * 1024 // upper limit for movq/movntq w/SW prefetch +// For larger blocks, which will spill beyond the cache, it's faster to +// use the Streaming Store instruction MOVNTQ. This write instruction +// bypasses the cache and writes straight to main memory. This code also +// uses the software prefetch instruction to pre-read the data. +// USE 64 * 1024 FOR THIS VALUE IF YOU'RE ALWAYS FILLING A "CLEAN CACHE" + +#define BLOCK_PREFETCH_COPY infinity // no limit for movq/movntq w/block prefetch +#define CACHEBLOCK 80h // number of 64-byte blocks (cache lines) for block prefetch +// For the largest size blocks, a special technique called Block Prefetch +// can be used to accelerate the read operations. Block Prefetch reads +// one address per cache line, for a series of cache lines, in a short loop. +// This is faster than using software prefetch. The technique is great for +// getting maximum read bandwidth, especially in DDR memory systems. + +//#include + +// Inline assembly syntax for use with Visual C++ +#ifdef _WIN32 +#include +#endif + +#if defined(_MSC_VER) && !defined(__x86_64__) && !defined(_M_X64) + +void * memcpy_amd(void *dest, const void *src, size_t n) +{ + __asm { + mov ecx, [n] ; number of bytes to copy + mov edi, [dest] ; destination + mov esi, [src] ; source + mov ebx, ecx ; keep a copy of count + + cld + cmp ecx, TINY_BLOCK_COPY + jb $memcpy_ic_3 ; tiny? skip mmx copy + + cmp ecx, 32*1024 ; don't align between 32k-64k because + jbe $memcpy_do_align ; it appears to be slower + cmp ecx, 64*1024 + jbe $memcpy_align_done +$memcpy_do_align: + mov ecx, 8 ; a trick that's faster than rep movsb... + sub ecx, edi ; align destination to qword + and ecx, 111b ; get the low bits + sub ebx, ecx ; update copy count + neg ecx ; set up to jump into the array + add ecx, offset $memcpy_align_done + jmp ecx ; jump to array of movsb's + +align 4 + movsb + movsb + movsb + movsb + movsb + movsb + movsb + movsb + +$memcpy_align_done: ; destination is dword aligned + mov ecx, ebx ; number of bytes left to copy + shr ecx, 6 ; get 64-byte block count + jz $memcpy_ic_2 ; finish the last few bytes + + cmp ecx, IN_CACHE_COPY/64 ; too big 4 cache? use uncached copy + jae $memcpy_uc_test + +// This is small block copy that uses the MMX registers to copy 8 bytes +// at a time. It uses the "unrolled loop" optimization, and also uses +// the software prefetch instruction to get the data into the cache. +align 16 +$memcpy_ic_1: ; 64-byte block copies, in-cache copy + + prefetchnta [esi + (200*64/34+192)] ; start reading ahead + + movq mm0, [esi+0] ; read 64 bits + movq mm1, [esi+8] + movq [edi+0], mm0 ; write 64 bits + movq [edi+8], mm1 ; note: the normal movq writes the + movq mm2, [esi+16] ; data to cache; a cache line will be + movq mm3, [esi+24] ; allocated as needed, to store the data + movq [edi+16], mm2 + movq [edi+24], mm3 + movq mm0, [esi+32] + movq mm1, [esi+40] + movq [edi+32], mm0 + movq [edi+40], mm1 + movq mm2, [esi+48] + movq mm3, [esi+56] + movq [edi+48], mm2 + movq [edi+56], mm3 + + add esi, 64 ; update source pointer + add edi, 64 ; update destination pointer + dec ecx ; count down + jnz $memcpy_ic_1 ; last 64-byte block? + +$memcpy_ic_2: + mov ecx, ebx ; has valid low 6 bits of the byte count +$memcpy_ic_3: + shr ecx, 2 ; dword count + and ecx, 1111b ; only look at the "remainder" bits + neg ecx ; set up to jump into the array + add ecx, offset $memcpy_last_few + jmp ecx ; jump to array of movsd's + +$memcpy_uc_test: + cmp ecx, UNCACHED_COPY/64 ; big enough? use block prefetch copy + jae $memcpy_bp_1 + +$memcpy_64_test: + or ecx, ecx ; tail end of block prefetch will jump here + jz $memcpy_ic_2 ; no more 64-byte blocks left + +// For larger blocks, which will spill beyond the cache, it's faster to +// use the Streaming Store instruction MOVNTQ. This write instruction +// bypasses the cache and writes straight to main memory. This code also +// uses the software prefetch instruction to pre-read the data. +align 16 +$memcpy_uc_1: ; 64-byte blocks, uncached copy + + prefetchnta [esi + (200*64/34+192)] ; start reading ahead + + movq mm0,[esi+0] ; read 64 bits + add edi,64 ; update destination pointer + movq mm1,[esi+8] + add esi,64 ; update source pointer + movq mm2,[esi-48] + movntq [edi-64], mm0 ; write 64 bits, bypassing the cache + movq mm0,[esi-40] ; note: movntq also prevents the CPU + movntq [edi-56], mm1 ; from READING the destination address + movq mm1,[esi-32] ; into the cache, only to be over-written + movntq [edi-48], mm2 ; so that also helps performance + movq mm2,[esi-24] + movntq [edi-40], mm0 + movq mm0,[esi-16] + movntq [edi-32], mm1 + movq mm1,[esi-8] + movntq [edi-24], mm2 + movntq [edi-16], mm0 + dec ecx + movntq [edi-8], mm1 + jnz $memcpy_uc_1 ; last 64-byte block? + + jmp $memcpy_ic_2 ; almost done + +// For the largest size blocks, a special technique called Block Prefetch +// can be used to accelerate the read operations. Block Prefetch reads +// one address per cache line, for a series of cache lines, in a short loop. +// This is faster than using software prefetch. The technique is great for +// getting maximum read bandwidth, especially in DDR memory systems. +$memcpy_bp_1: ; large blocks, block prefetch copy + + cmp ecx, CACHEBLOCK ; big enough to run another prefetch loop? + jl $memcpy_64_test ; no, back to regular uncached copy + + mov eax, CACHEBLOCK / 2 ; block prefetch loop, unrolled 2X + add esi, CACHEBLOCK * 64 ; move to the top of the block +align 16 +$memcpy_bp_2: + mov edx, [esi-64] ; grab one address per cache line + mov edx, [esi-128] ; grab one address per cache line + sub esi, 128 ; go reverse order to suppress HW prefetcher + dec eax ; count down the cache lines + jnz $memcpy_bp_2 ; keep grabbing more lines into cache + + mov eax, CACHEBLOCK ; now that it's in cache, do the copy +align 16 +$memcpy_bp_3: + movq mm0, [esi ] ; read 64 bits + movq mm1, [esi+ 8] + movq mm2, [esi+16] + movq mm3, [esi+24] + movq mm4, [esi+32] + movq mm5, [esi+40] + movq mm6, [esi+48] + movq mm7, [esi+56] + add esi, 64 ; update source pointer + movntq [edi ], mm0 ; write 64 bits, bypassing cache + movntq [edi+ 8], mm1 ; note: movntq also prevents the CPU + movntq [edi+16], mm2 ; from READING the destination address + movntq [edi+24], mm3 ; into the cache, only to be over-written, + movntq [edi+32], mm4 ; so that also helps performance + movntq [edi+40], mm5 + movntq [edi+48], mm6 + movntq [edi+56], mm7 + add edi, 64 ; update dest pointer + + dec eax ; count down + + jnz $memcpy_bp_3 ; keep copying + sub ecx, CACHEBLOCK ; update the 64-byte block count + jmp $memcpy_bp_1 ; keep processing chunks + +// The smallest copy uses the X86 "movsd" instruction, in an optimized +// form which is an "unrolled loop". Then it handles the last few bytes. +align 4 + movsd + movsd ; perform last 1-15 dword copies + movsd + movsd + movsd + movsd + movsd + movsd + movsd + movsd ; perform last 1-7 dword copies + movsd + movsd + movsd + movsd + movsd + movsd + +$memcpy_last_few: ; dword aligned from before movsd's + mov ecx, ebx ; has valid low 2 bits of the byte count + and ecx, 11b ; the last few cows must come home + jz $memcpy_final ; no more, let's leave + rep movsb ; the last 1, 2, or 3 bytes + +$memcpy_final: + emms ; clean up the MMX state + sfence ; flush the write buffer + mov eax, [dest] ; ret value = destination pointer + + } +} + +// mmx memcmp implementation, size has to be a multiple of 8 +// returns 0 is equal, nonzero value if not equal +// ~10 times faster than standard memcmp +// (zerofrog) +unsigned char memcmp_mmx(const void* src1, const void* src2, int cmpsize) +{ + assert( (cmpsize&7) == 0 ); + + __asm { + push esi + mov ecx, cmpsize + mov edx, src1 + mov esi, src2 + + cmp ecx, 32 + jl Done4 + + // custom test first 8 to make sure things are ok + movq mm0, [esi] + movq mm1, [esi+8] + pcmpeqd mm0, [edx] + pcmpeqd mm1, [edx+8] + pand mm0, mm1 + movq mm2, [esi+16] + pmovmskb eax, mm0 + movq mm3, [esi+24] + + // check if eq + cmp eax, 0xff + je NextComp + mov eax, 1 + jmp End + +NextComp: + pcmpeqd mm2, [edx+16] + pcmpeqd mm3, [edx+24] + pand mm2, mm3 + pmovmskb eax, mm2 + + sub ecx, 32 + add esi, 32 + add edx, 32 + + // check if eq + cmp eax, 0xff + je ContinueTest + mov eax, 1 + jmp End + + cmp ecx, 64 + jl Done8 + +Cmp8: + movq mm0, [esi] + movq mm1, [esi+8] + movq mm2, [esi+16] + movq mm3, [esi+24] + movq mm4, [esi+32] + movq mm5, [esi+40] + movq mm6, [esi+48] + movq mm7, [esi+56] + pcmpeqd mm0, [edx] + pcmpeqd mm1, [edx+8] + pcmpeqd mm2, [edx+16] + pcmpeqd mm3, [edx+24] + pand mm0, mm1 + pcmpeqd mm4, [edx+32] + pand mm0, mm2 + pcmpeqd mm5, [edx+40] + pand mm0, mm3 + pcmpeqd mm6, [edx+48] + pand mm0, mm4 + pcmpeqd mm7, [edx+56] + pand mm0, mm5 + pand mm0, mm6 + pand mm0, mm7 + pmovmskb eax, mm0 + + // check if eq + cmp eax, 0xff + je Continue + mov eax, 1 + jmp End + +Continue: + sub ecx, 64 + add esi, 64 + add edx, 64 +ContinueTest: + cmp ecx, 64 + jge Cmp8 + +Done8: + test ecx, 0x20 + jz Done4 + movq mm0, [esi] + movq mm1, [esi+8] + movq mm2, [esi+16] + movq mm3, [esi+24] + pcmpeqd mm0, [edx] + pcmpeqd mm1, [edx+8] + pcmpeqd mm2, [edx+16] + pcmpeqd mm3, [edx+24] + pand mm0, mm1 + pand mm0, mm2 + pand mm0, mm3 + pmovmskb eax, mm0 + sub ecx, 32 + add esi, 32 + add edx, 32 + + // check if eq + cmp eax, 0xff + je Done4 + mov eax, 1 + jmp End + +Done4: + cmp ecx, 24 + jne Done2 + movq mm0, [esi] + movq mm1, [esi+8] + movq mm2, [esi+16] + pcmpeqd mm0, [edx] + pcmpeqd mm1, [edx+8] + pcmpeqd mm2, [edx+16] + pand mm0, mm1 + pand mm0, mm2 + pmovmskb eax, mm0 + + // check if eq + cmp eax, 0xff + setne al + jmp End + +Done2: + cmp ecx, 16 + jne Done1 + + movq mm0, [esi] + movq mm1, [esi+8] + pcmpeqd mm0, [edx] + pcmpeqd mm1, [edx+8] + pand mm0, mm1 + pmovmskb eax, mm0 + + // check if eq + cmp eax, 0xff + setne al + jmp End + +Done1: + cmp ecx, 8 + jne Done + + mov eax, [esi] + mov esi, [esi+4] + cmp eax, [edx] + je Next + mov eax, 1 + jmp End + +Next: + cmp esi, [edx+4] + setne al + jmp End + +Done: + xor eax, eax + +End: + pop esi + emms + } +} + +#else // _MSC_VER +// assume gcc or mingw or win x64 + +#include +#include + +void * memcpy_amd(void *dest, const void *src, size_t n) +{ +memcpy(dest, src, n); +return dest; +} + + +#endif diff --git a/Source/Plugins/Plugin_VideoOGL/Src/rasterfont.cpp b/Source/Plugins/Plugin_VideoOGL/Src/rasterfont.cpp new file mode 100644 index 0000000000..d6fe289e6d --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/rasterfont.cpp @@ -0,0 +1,165 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "Globals.h" + +#ifdef _WIN32 +#include +#endif + +#include +#include + +#include "rasterfont.h" +// globals + +GLubyte rasters[][13] = { + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36}, + {0x00, 0x00, 0x00, 0x66, 0x66, 0xff, 0x66, 0x66, 0xff, 0x66, 0x66, 0x00, 0x00}, + {0x00, 0x00, 0x18, 0x7e, 0xff, 0x1b, 0x1f, 0x7e, 0xf8, 0xd8, 0xff, 0x7e, 0x18}, + {0x00, 0x00, 0x0e, 0x1b, 0xdb, 0x6e, 0x30, 0x18, 0x0c, 0x76, 0xdb, 0xd8, 0x70}, + {0x00, 0x00, 0x7f, 0xc6, 0xcf, 0xd8, 0x70, 0x70, 0xd8, 0xcc, 0xcc, 0x6c, 0x38}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x1c, 0x0c, 0x0e}, + {0x00, 0x00, 0x0c, 0x18, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x18, 0x0c}, + {0x00, 0x00, 0x30, 0x18, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x18, 0x30}, + {0x00, 0x00, 0x00, 0x00, 0x99, 0x5a, 0x3c, 0xff, 0x3c, 0x5a, 0x99, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0xff, 0xff, 0x18, 0x18, 0x18, 0x00, 0x00}, + {0x00, 0x00, 0x30, 0x18, 0x1c, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x60, 0x60, 0x30, 0x30, 0x18, 0x18, 0x0c, 0x0c, 0x06, 0x06, 0x03, 0x03}, + {0x00, 0x00, 0x3c, 0x66, 0xc3, 0xe3, 0xf3, 0xdb, 0xcf, 0xc7, 0xc3, 0x66, 0x3c}, + {0x00, 0x00, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x78, 0x38, 0x18}, + {0x00, 0x00, 0xff, 0xc0, 0xc0, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x03, 0xe7, 0x7e}, + {0x00, 0x00, 0x7e, 0xe7, 0x03, 0x03, 0x07, 0x7e, 0x07, 0x03, 0x03, 0xe7, 0x7e}, + {0x00, 0x00, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0xff, 0xcc, 0x6c, 0x3c, 0x1c, 0x0c}, + {0x00, 0x00, 0x7e, 0xe7, 0x03, 0x03, 0x07, 0xfe, 0xc0, 0xc0, 0xc0, 0xc0, 0xff}, + {0x00, 0x00, 0x7e, 0xe7, 0xc3, 0xc3, 0xc7, 0xfe, 0xc0, 0xc0, 0xc0, 0xe7, 0x7e}, + {0x00, 0x00, 0x30, 0x30, 0x30, 0x30, 0x18, 0x0c, 0x06, 0x03, 0x03, 0x03, 0xff}, + {0x00, 0x00, 0x7e, 0xe7, 0xc3, 0xc3, 0xe7, 0x7e, 0xe7, 0xc3, 0xc3, 0xe7, 0x7e}, + {0x00, 0x00, 0x7e, 0xe7, 0x03, 0x03, 0x03, 0x7f, 0xe7, 0xc3, 0xc3, 0xe7, 0x7e}, + {0x00, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x30, 0x18, 0x1c, 0x1c, 0x00, 0x00, 0x1c, 0x1c, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0x60, 0x30, 0x18, 0x0c, 0x06}, + {0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x03, 0x06, 0x0c, 0x18, 0x30, 0x60}, + {0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x18, 0x0c, 0x06, 0x03, 0xc3, 0xc3, 0x7e}, + {0x00, 0x00, 0x3f, 0x60, 0xcf, 0xdb, 0xd3, 0xdd, 0xc3, 0x7e, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xff, 0xc3, 0xc3, 0xc3, 0x66, 0x3c, 0x18}, + {0x00, 0x00, 0xfe, 0xc7, 0xc3, 0xc3, 0xc7, 0xfe, 0xc7, 0xc3, 0xc3, 0xc7, 0xfe}, + {0x00, 0x00, 0x7e, 0xe7, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xe7, 0x7e}, + {0x00, 0x00, 0xfc, 0xce, 0xc7, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc7, 0xce, 0xfc}, + {0x00, 0x00, 0xff, 0xc0, 0xc0, 0xc0, 0xc0, 0xfc, 0xc0, 0xc0, 0xc0, 0xc0, 0xff}, + {0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xfc, 0xc0, 0xc0, 0xc0, 0xff}, + {0x00, 0x00, 0x7e, 0xe7, 0xc3, 0xc3, 0xcf, 0xc0, 0xc0, 0xc0, 0xc0, 0xe7, 0x7e}, + {0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xff, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3}, + {0x00, 0x00, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7e}, + {0x00, 0x00, 0x7c, 0xee, 0xc6, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06}, + {0x00, 0x00, 0xc3, 0xc6, 0xcc, 0xd8, 0xf0, 0xe0, 0xf0, 0xd8, 0xcc, 0xc6, 0xc3}, + {0x00, 0x00, 0xff, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0}, + {0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xdb, 0xff, 0xff, 0xe7, 0xc3}, + {0x00, 0x00, 0xc7, 0xc7, 0xcf, 0xcf, 0xdf, 0xdb, 0xfb, 0xf3, 0xf3, 0xe3, 0xe3}, + {0x00, 0x00, 0x7e, 0xe7, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xe7, 0x7e}, + {0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xfe, 0xc7, 0xc3, 0xc3, 0xc7, 0xfe}, + {0x00, 0x00, 0x3f, 0x6e, 0xdf, 0xdb, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0x66, 0x3c}, + {0x00, 0x00, 0xc3, 0xc6, 0xcc, 0xd8, 0xf0, 0xfe, 0xc7, 0xc3, 0xc3, 0xc7, 0xfe}, + {0x00, 0x00, 0x7e, 0xe7, 0x03, 0x03, 0x07, 0x7e, 0xe0, 0xc0, 0xc0, 0xe7, 0x7e}, + {0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff}, + {0x00, 0x00, 0x7e, 0xe7, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3}, + {0x00, 0x00, 0x18, 0x3c, 0x3c, 0x66, 0x66, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3}, + {0x00, 0x00, 0xc3, 0xe7, 0xff, 0xff, 0xdb, 0xdb, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3}, + {0x00, 0x00, 0xc3, 0x66, 0x66, 0x3c, 0x3c, 0x18, 0x3c, 0x3c, 0x66, 0x66, 0xc3}, + {0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x3c, 0x66, 0x66, 0xc3}, + {0x00, 0x00, 0xff, 0xc0, 0xc0, 0x60, 0x30, 0x7e, 0x0c, 0x06, 0x03, 0x03, 0xff}, + {0x00, 0x00, 0x3c, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3c}, + {0x00, 0x03, 0x03, 0x06, 0x06, 0x0c, 0x0c, 0x18, 0x18, 0x30, 0x30, 0x60, 0x60}, + {0x00, 0x00, 0x3c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x3c}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x66, 0x3c, 0x18}, + {0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x38, 0x30, 0x70}, + {0x00, 0x00, 0x7f, 0xc3, 0xc3, 0x7f, 0x03, 0xc3, 0x7e, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0xfe, 0xc3, 0xc3, 0xc3, 0xc3, 0xfe, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0}, + {0x00, 0x00, 0x7e, 0xc3, 0xc0, 0xc0, 0xc0, 0xc3, 0x7e, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x7f, 0xc3, 0xc3, 0xc3, 0xc3, 0x7f, 0x03, 0x03, 0x03, 0x03, 0x03}, + {0x00, 0x00, 0x7f, 0xc0, 0xc0, 0xfe, 0xc3, 0xc3, 0x7e, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x30, 0x30, 0x30, 0x30, 0x30, 0xfc, 0x30, 0x30, 0x30, 0x33, 0x1e}, + {0x7e, 0xc3, 0x03, 0x03, 0x7f, 0xc3, 0xc3, 0xc3, 0x7e, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xfe, 0xc0, 0xc0, 0xc0, 0xc0}, + {0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x18, 0x00}, + {0x38, 0x6c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x00, 0x00, 0x0c, 0x00}, + {0x00, 0x00, 0xc6, 0xcc, 0xf8, 0xf0, 0xd8, 0xcc, 0xc6, 0xc0, 0xc0, 0xc0, 0xc0}, + {0x00, 0x00, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x78}, + {0x00, 0x00, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xfe, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xfc, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00}, + {0xc0, 0xc0, 0xc0, 0xfe, 0xc3, 0xc3, 0xc3, 0xc3, 0xfe, 0x00, 0x00, 0x00, 0x00}, + {0x03, 0x03, 0x03, 0x7f, 0xc3, 0xc3, 0xc3, 0xc3, 0x7f, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xe0, 0xfe, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0xfe, 0x03, 0x03, 0x7e, 0xc0, 0xc0, 0x7f, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x1c, 0x36, 0x30, 0x30, 0x30, 0x30, 0xfc, 0x30, 0x30, 0x30, 0x00}, + {0x00, 0x00, 0x7e, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x18, 0x3c, 0x3c, 0x66, 0x66, 0xc3, 0xc3, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0xc3, 0xe7, 0xff, 0xdb, 0xc3, 0xc3, 0xc3, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0xc3, 0x66, 0x3c, 0x18, 0x3c, 0x66, 0xc3, 0x00, 0x00, 0x00, 0x00}, + {0xc0, 0x60, 0x60, 0x30, 0x18, 0x3c, 0x66, 0x66, 0xc3, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0xff, 0x60, 0x30, 0x18, 0x0c, 0x06, 0xff, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x0f, 0x18, 0x18, 0x18, 0x38, 0xf0, 0x38, 0x18, 0x18, 0x18, 0x0f}, + {0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18}, + {0x00, 0x00, 0xf0, 0x18, 0x18, 0x18, 0x1c, 0x0f, 0x1c, 0x18, 0x18, 0x18, 0xf0}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x8f, 0xf1, 0x60, 0x00, 0x00, 0x00} +}; + +RasterFont::RasterFont() +{ + // set GL modes + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + + // create the raster font + fontOffset = glGenLists (128); + for (int i = 32; i < 127; i++) { + glNewList(i+fontOffset, GL_COMPILE); + glBitmap(8, 13, 0.0f, 2.0f, 10.0f, 0.0f, rasters[i-32]); + glEndList(); + } +} + +RasterFont::~RasterFont() +{ + glDeleteLists(fontOffset, 128); +} + +void RasterFont::printString(const char *s, double x, double y, double z) +{ + // go to the right spot + glRasterPos3d(x, y, z); + + glPushAttrib (GL_LIST_BIT); + glListBase(fontOffset); + glCallLists((GLsizei)strlen(s), GL_UNSIGNED_BYTE, (GLubyte *) s); + glPopAttrib (); +} + +void RasterFont::printCenteredString(const char *s, double y, int screen_width, double z) +{ + int length = (int)strlen(s); + int x = int(screen_width/2.0 - (length/2.0)*char_width); + + printString(s, x, y, z); +} + diff --git a/Source/Plugins/Plugin_VideoOGL/Src/rasterfont.h b/Source/Plugins/Plugin_VideoOGL/Src/rasterfont.h new file mode 100644 index 0000000000..93440b4ff1 --- /dev/null +++ b/Source/Plugins/Plugin_VideoOGL/Src/rasterfont.h @@ -0,0 +1,39 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// 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 General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef RasterFont_Header +#define RasterFont_Header + +class RasterFont { +protected: + int fontOffset; + +public: + RasterFont(); + ~RasterFont(void); + static int debug; + + // some useful constants + enum {char_width = 10}; + enum {char_height = 15}; + + // and the happy helper functions + void printString(const char *s, double x, double y, double z=0.0); + void printCenteredString(const char *s, double y, int screen_width, double z=0.0); +}; + +#endif diff --git a/licence.txt b/licence.txt new file mode 100644 index 0000000000..d511905c16 --- /dev/null +++ b/licence.txt @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, 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 or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +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 give any other recipients of the Program a copy of this License +along with the Program. + +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 Program or any portion +of it, thus forming a work based on the Program, 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) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +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 Program, 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 Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) 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; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, 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 executable. However, as a +special exception, the source code 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. + +If distribution of executable or 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 counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program 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. + + 5. 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 Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program 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 to +this License. + + 7. 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 Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program 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 Program. + +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. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program 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. + + 9. The Free Software Foundation may publish revised and/or new versions +of the 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 Program +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 Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, 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 + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "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 PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. 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 PROGRAM 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 PROGRAM (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 PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), 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 Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. 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. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 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 General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License.